ZGlmZiAtLWdpdCBhLy5hc2YueWFtbCBiLy5hc2YueWFtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzAxZWVlCi0tLSAvZGV2L251bGwKKysrIGIvLmFzZi55YW1sCkBAIC0wLDAgKzEsOCBAQAorZ2l0aHViOgorICBlbmFibGVkX21lcmdlX2J1dHRvbnM6CisgICAgc3F1YXNoOiAgZmFsc2UKKyAgICBtZXJnZTogICBmYWxzZQorICAgIHJlYmFzZTogIHRydWUKKworbm90aWZpY2F0aW9uczoKKyAgamlyYV9vcHRpb25zOiBsaW5rIHdvcmtsb2cKZGlmZiAtLWdpdCBhLy5idWlsZC9idWlsZC1naXQueG1sIGIvLmJ1aWxkL2J1aWxkLWdpdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiNWNhNwotLS0gL2Rldi9udWxsCisrKyBiLy5idWlsZC9idWlsZC1naXQueG1sCkBAIC0wLDAgKzEsNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IGJhc2VkaXI9Ii4iIG5hbWU9ImFwYWNoZS1jYXNzYW5kcmEtZ2l0LXRhc2tzIgorICAgICAgICAgeG1sbnM6aWY9ImFudDppZiI+CisgICAgPHRhcmdldCBuYW1lPSJnZXQtZ2l0LXNoYSI+CisgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9ImdpdCIgb3NmYW1pbHk9InVuaXgiIGRpcj0iJHtiYXNlZGlyfSIgbG9nRXJyb3I9ImZhbHNlIiBmYWlsb25lcnJvcj0iZmFsc2UiIGZhaWxpZmV4ZWN1dGlvbmZhaWxzPSJmYWxzZSIgcmVzdWx0cHJvcGVydHk9ImdpdC5pcy1hdmFpbGFibGUuZXhpdC1jb2RlIj4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9InJldi1wYXJzZSIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1pcy1pbnNpZGUtd29yay10cmVlIi8+CisgICAgICAgICAgICA8cmVkaXJlY3RvciBvdXRwdXRwcm9wZXJ0eT0iZ2l0LmlzLWF2YWlsYWJsZS5vdXRwdXQiLz4KKyAgICAgICAgPC9leGVjPgorICAgICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJnaXQuaXMtYXZhaWxhYmxlIiBlbHNlPSJmYWxzZSI+CisgICAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7Z2l0LmlzLWF2YWlsYWJsZS5leGl0LWNvZGV9IiBhcmcyPSIwIi8+CisgICAgICAgIDwvY29uZGl0aW9uPgorICAgICAgICA8ZWNobyBtZXNzYWdlPSJnaXQuaXMtYXZhaWxhYmxlPSR7Z2l0LmlzLWF2YWlsYWJsZX0iLz4KKworICAgICAgICA8ZXhlYyBpZjp0cnVlPSIke2dpdC5pcy1hdmFpbGFibGV9IiBleGVjdXRhYmxlPSJnaXQiIG9zZmFtaWx5PSJ1bml4IiBkaXI9IiR7YmFzZWRpcn0iIGxvZ0Vycm9yPSJ0cnVlIiBmYWlsb25lcnJvcj0iZmFsc2UiIGZhaWxpZmV4ZWN1dGlvbmZhaWxzPSJmYWxzZSI+CisgICAgICAgICAgICA8YXJnIHZhbHVlPSJkZXNjcmliZSIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1tYXRjaD0nJyIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1hbHdheXMiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tYWJicmV2PTAiLz4KKyAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tZGlydHkiLz4KKyAgICAgICAgICAgIDxyZWRpcmVjdG9yIG91dHB1dHByb3BlcnR5PSJnaXQuc2hhIi8+CisgICAgICAgIDwvZXhlYz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImdpdC5zaGEiIHZhbHVlPSJVbmtub3duIi8+CisgICAgICAgIDxlY2hvIGxldmVsPSJpbmZvIj5naXQuc2hhPSR7Z2l0LnNoYX08L2VjaG8+CisKKyAgICAgICAgPGV4ZWMgaWY6dHJ1ZT0iJHtnaXQuaXMtYXZhaWxhYmxlfSIgZXhlY3V0YWJsZT0iZ2l0IiBvc2ZhbWlseT0idW5peCIgZGlyPSIke2Jhc2VkaXJ9IiBsb2dFcnJvcj0idHJ1ZSIgZmFpbG9uZXJyb3I9ImZhbHNlIiBmYWlsaWZleGVjdXRpb25mYWlscz0iZmFsc2UiPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iZGlmZiIvPgorICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1zdGF0Ii8+CisgICAgICAgICAgICA8cmVkaXJlY3RvciBvdXRwdXRwcm9wZXJ0eT0iZ2l0LmRpZmZzdGF0Ii8+CisgICAgICAgIDwvZXhlYz4KKyAgICAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iaXMtZGlydHkiPgorICAgICAgICAgICAgPGNvbnRhaW5zIHN0cmluZz0iJHtnaXQuc2hhfSIgc3Vic3RyaW5nPSItZGlydHkiLz4KKyAgICAgICAgPC9jb25kaXRpb24+CisgICAgICAgIDxlY2hvIGxldmVsPSJ3YXJuaW5nIiBpZjp0cnVlPSIke2lzLWRpcnR5fSI+UmVwb3NpdG9yeSBzdGF0ZSBpcyBkaXJ0eTwvZWNobz4KKyAgICAgICAgPGVjaG8gbGV2ZWw9Indhcm5pbmciIGlmOnRydWU9IiR7aXMtZGlydHl9Ij4ke2dpdC5kaWZmc3RhdH08L2VjaG8+CisgICAgPC90YXJnZXQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8uYnVpbGQvYnVpbGQtcmF0LnhtbCBiLy5idWlsZC9idWlsZC1yYXQueG1sCmluZGV4IDQ5ZDIwY2MuLmYyNjFhMjMgMTAwNjQ0Ci0tLSBhLy5idWlsZC9idWlsZC1yYXQueG1sCisrKyBiLy5idWlsZC9idWlsZC1yYXQueG1sCkBAIC01MiwxMyArNTIsMTQgQEAKICAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iLiIgaW5jbHVkZXNmaWxlPSIke2J1aWxkLmRpcn0vLnJhdGluY2x1ZGUiPgogICAgICAgICAgICAgICAgICA8IS0tIENvbmZpZyBmaWxlcyB3aXRoIG5vdCBtdWNoIGNyZWF0aXZpdHkgLS0+CiAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqLy5hc2YueWFtbCIvPgorICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi8uZ2l0aHViL3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZCIvPgogICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9pZGUvKiovKiIvPgogICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9tZXRyaWNzLXJlcG9ydGVyLWNvbmZpZy1zYW1wbGUueWFtbCIvPgogICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9jYXNzYW5kcmEueWFtbCIvPgogICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9jYXNzYW5kcmEtbXVybXVyLnlhbWwiLz4KICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovY2Fzc2FuZHJhLXNlZWRzLnlhbWwiLz4KICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovaGFycnktZ2VuZXJpYy55YW1sIi8+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlIE5BTUU9IioqL2RvYy9hbnRvcmEueW1sIi8+CisgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL2RvYy9hbnRvcmEueW1sIi8+CiAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL3Rlc3QvY29uZi9jYXNzYW5kcmEueWFtbCIvPgogICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi90ZXN0L2NvbmYvY2Fzc2FuZHJhLW9sZC55YW1sIi8+CiAgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL3Rlc3QvY29uZi9jYXNzYW5kcmEtY29udmVydGVycy1zcGVjaWFsLWNhc2VzLW9sZC1uYW1lcy55YW1sIi8+CkBAIC04MywxMiArODQsMTIgQEAKICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgbmFtZT0iKiovdG9vbHMvY3Fsc3RyZXNzLWluc2FuaXR5LWV4YW1wbGUueWFtbCIvPgogICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi90b29scy9jcWxzdHJlc3MtbHd0LWV4YW1wbGUueWFtbCIvPgogICAgICAgICAgICAgICAgICA8IS0tIERvY3VtZW50YXRpb24gZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlIE5BTUU9IioqL2RvYy9tb2R1bGVzLyoqLyoiLz4KLSAgICAgICAgICAgICAgICAgPGV4Y2x1ZGUgTkFNRT0iKiovc3JjL2phdmEvKiovKi5tZCIvPgorICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9kb2MvbW9kdWxlcy8qKi8qIi8+CisgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL3NyYy9qYXZhLyoqLyoubWQiLz4KICAgICAgICAgICAgICAgICAgPCEtLSBOT1RJQ0UgZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgIDxleGNsdWRlIE5BTUU9IioqL05PVElDRS5tZCIvPgorICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBuYW1lPSIqKi9OT1RJQ0UubWQiLz4KICAgICAgICAgICAgICAgICAgPCEtLSBMSUNFTlNFIGZpbGVzIC0tPgotICAgICAgICAgICAgICAgICA8ZXhjbHVkZSBOQU1FPSIqKi9MSUNFTlNFLm1kIi8+CisgICAgICAgICAgICAgICAgIDxleGNsdWRlIG5hbWU9IioqL0xJQ0VOU0UubWQiLz4KICAgICAgICAgICAgIDwvZmlsZXNldD4KICAgICAgICAgPC9yYXQ6cmVwb3J0PgogICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSJncmVwIiBvdXRwdXRwcm9wZXJ0eT0icmF0LmZhaWxlZC5maWxlcyIgZmFpbGlmZXhlY3V0aW9uZmFpbHM9ImZhbHNlIj4KZGlmZiAtLWdpdCBhLy5idWlsZC9idWlsZC1yZXNvbHZlci54bWwgYi8uYnVpbGQvYnVpbGQtcmVzb2x2ZXIueG1sCmluZGV4IGMzOGEyNzIuLmU3OGJiZjAgMTAwNjQ0Ci0tLSBhLy5idWlsZC9idWlsZC1yZXNvbHZlci54bWwKKysrIGIvLmJ1aWxkL2J1aWxkLXJlc29sdmVyLnhtbApAQCAtMTI2LDYgKzEyNiwxMiBAQAogICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CiAgICAgICAgICAgICA8cGF0aCByZWZpZD0iamZsZXguY2xhc3NwYXRoIiBjbGFzc3BhdGg9InJ1bnRpbWUiLz4KICAgICAgICAgPC9yZXNvbHZlPgorICAgICAgICA8cmVzb2x2ZT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLnB1cHB5Y3Jhd2wudG9vbHMiIGFydGlmYWN0SWQ9ImNoZWNrc3R5bGUiIHZlcnNpb249IiR7Y2hlY2tzdHlsZS52ZXJzaW9ufSIgLz4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImNoZWNrc3R5bGUuY2xhc3NwYXRoIiBjbGFzc3BhdGg9InJ1bnRpbWUiLz4KKyAgICAgICAgPC9yZXNvbHZlPgogCiAgICAgICAgIDxtYWNyb2RlZiBuYW1lPSJpbnN0YWxsIj4KICAgICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9tRmlsZSIvPgpAQCAtMTc1LDcgKzE4MSw4IEBACiAgICAgICAgIDwvcmVzb2x2ZT4KICAgICAgICAgPHJlc29sdmU+CiAgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzIHBvbVJlZj0icG9tLWRlcHMiLz4KLSAgICAgICAgICAgIDxmaWxlcyBkaXI9IiR7dGVzdC5saWJ9L2phcnMiIGxheW91dD0ie2FydGlmYWN0SWR9LXt2ZXJzaW9ufS17Y2xhc3NpZmllcn0ue2V4dGVuc2lvbn0iIHNjb3Blcz0idGVzdCwhcHJvdmlkZSwhc3lzdGVtIi8+CisgICAgICAgICAgICA8IS0tIE5lZWRlZCB0byBpbmNsdWRlIGNvbXBpbGUgaGVyZSwgc28gYW50IF9idWlsZC10ZXN0IHdvdWxkIG5vdCBmYWlsIG9uIG1pc3NpbmcgamltZnMgZGVwZW5kZW5jeSAtLT4KKyAgICAgICAgICAgIDxmaWxlcyBkaXI9IiR7dGVzdC5saWJ9L2phcnMiIGxheW91dD0ie2FydGlmYWN0SWR9LXt2ZXJzaW9ufS17Y2xhc3NpZmllcn0ue2V4dGVuc2lvbn0iIHNjb3Blcz0iY29tcGlsZSx0ZXN0LCFwcm92aWRlLCFzeXN0ZW0iLz4KICAgICAgICAgPC9yZXNvbHZlPgogCiAKQEAgLTE4OCw3ICsxOTUsNyBAQAogICAgICAgICA8L3VuemlwPgogICAgIDwvdGFyZ2V0PgogCi0gICAgPHRhcmdldCBuYW1lPSJyZXNvbHZlci1kaXN0LWxpYiIgZGVwZW5kcz0icmVzb2x2ZXItcmV0cmlldmUtYnVpbGQsd3JpdGUtcG9tcyI+CisgICAgPHRhcmdldCBuYW1lPSJyZXNvbHZlci1kaXN0LWxpYiIgZGVwZW5kcz0icmVzb2x2ZXItcmV0cmlldmUtYnVpbGQiPgogICAgICAgICA8cmVzb2x2ZXBvbSBmaWxlPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS5wb20iIGlkPSJhbGwtcG9tIiAvPgogCiAgICAgICAgIDxyZXNvbHZlIGZhaWxPbk1pc3NpbmdBdHRhY2htZW50cz0idHJ1ZSI+CkBAIC0xOTgsMTAgKzIwNSwxMSBAQAogICAgICAgICA8bWtkaXIgZGlyPSIke2xvY2FsLnJlcG9zaXRvcnl9L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RlcHMvc2lnYXItYmluIi8+CiAgICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQubGlifS9zaWdhci1iaW4iLz4KIAotICAgICAgICA8IS0tIGZpbGVzLnB5dGhvbmhvc3RlZC5vcmcgLS0+CisgICAgICAgIDwhLS0gZmlsZXMucHl0aG9uaG9zdGVkLm9yZy9wYWNrYWdlcyAtLT4KICAgICAgICAgPGdldCBzcmM9IiR7YXJ0aWZhY3QucHl0aG9uLnB5cGl9LzU5L2EwL2NmNGNkOTk3ZTE3NTBmMGMyZDkxYzZlYTVhYmVhMjE4MjUxYzQzYzM1ODFiY2MyZjExOGIwMGJhZjVjZi9mdXR1cmVzLTIuMS42LXB5Mi5weTMtbm9uZS1hbnkud2hsIiBkZXN0PSIke2xvY2FsLnJlcG9zaXRvcnl9L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RlcHMvZnV0dXJlcy0yLjEuNi1weTIucHkzLW5vbmUtYW55LnppcCIgdXNldGltZXN0YW1wPSJ0cnVlIiBxdWlldD0idHJ1ZSIgc2tpcGV4aXN0aW5nPSJ0cnVlIi8+CiAgICAgICAgIDxnZXQgc3JjPSIke2FydGlmYWN0LnB5dGhvbi5weXBpfS83My9mYi8wMGE5NzZmNzI4ZDBkMWZlY2ZlODk4MjM4Y2UyM2Y1MDJhNzIxYzBhYzBlY2ZlZGI4MGUwZDg4YzY0ZTkvc2l4LTEuMTIuMC1weTIucHkzLW5vbmUtYW55LndobCIgZGVzdD0iJHtsb2NhbC5yZXBvc2l0b3J5fS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kZXBzL3NpeC0xLjEyLjAtcHkyLnB5My1ub25lLWFueS56aXAiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgcXVpZXQ9InRydWUiIHNraXBleGlzdGluZz0idHJ1ZSIvPgogICAgICAgICA8Z2V0IHNyYz0iJHthcnRpZmFjdC5weXRob24ucHlwaX0vMzcvYjIvZWYxMTI0NTQwZWUyYzBiNDE3YmU4ZDBmNzQ2Njc5NTdlNmFhMDg0YTNmMjY2MjFhYTY3ZTJlNzdmM2ZiL3B1cmVfc2FzbC0wLjYuMi1weTItbm9uZS1hbnkud2hsIiBkZXN0PSIke2xvY2FsLnJlcG9zaXRvcnl9L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RlcHMvcHVyZV9zYXNsLTAuNi4yLXB5Mi1ub25lLWFueS56aXAiIHVzZXRpbWVzdGFtcD0idHJ1ZSIgcXVpZXQ9InRydWUiIHNraXBleGlzdGluZz0idHJ1ZSIvPgorICAgICAgICA8Z2V0IHNyYz0iJHthcnRpZmFjdC5weXRob24ucHlwaX0vNTkvN2MvZTM5YWNhNTk2YmFkYWYxYjc4ZThmNTQ3YzgwN2IwNGRhZTYwM2E0MzNkM2U3YTdlMDRkNjdmMmVmM2U1L3djd2lkdGgtMC4yLjUtcHkyLnB5My1ub25lLWFueS53aGwiIGRlc3Q9IiR7bG9jYWwucmVwb3NpdG9yeX0vb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGVwcy93Y3dpZHRoLTAuMi41LXB5Mi5weTMtbm9uZS1hbnkuemlwIiB1c2V0aW1lc3RhbXA9InRydWUiIHF1aWV0PSJ0cnVlIiBza2lwZXhpc3Rpbmc9InRydWUiLz4KIAogICAgICAgICA8IS0tIGFwYWNoZS9jYXNzYW5kcmEvbGliIC0tPgogICAgICAgICA8Z2V0IHNyYz0iJHtsaWIuZG93bmxvYWQuYmFzZS51cmx9L2xpYi9nZW9tZXQtMC4xLjAuemlwIiBkZXN0PSIke2xvY2FsLnJlcG9zaXRvcnl9L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RlcHMvZ2VvbWV0LTAuMS4wLnppcCIgdXNldGltZXN0YW1wPSJ0cnVlIiBxdWlldD0idHJ1ZSIgc2tpcGV4aXN0aW5nPSJ0cnVlIi8+CkBAIC0yMzMsNiArMjQxLDcgQEAKICAgICAgICAgICAgIDxmaWxlIGZpbGU9IiR7bG9jYWwucmVwb3NpdG9yeX0vb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGVwcy9zaXgtMS4xMi4wLXB5Mi5weTMtbm9uZS1hbnkuemlwIi8+CiAgICAgICAgICAgICA8ZmlsZSBmaWxlPSIke2xvY2FsLnJlcG9zaXRvcnl9L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RlcHMvZ2VvbWV0LTAuMS4wLnppcCIvPgogICAgICAgICAgICAgPGZpbGUgZmlsZT0iJHtsb2NhbC5yZXBvc2l0b3J5fS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kZXBzL3B1cmVfc2FzbC0wLjYuMi1weTItbm9uZS1hbnkuemlwIi8+CisgICAgICAgICAgICA8ZmlsZSBmaWxlPSIke2xvY2FsLnJlcG9zaXRvcnl9L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RlcHMvd2N3aWR0aC0wLjIuNS1weTIucHkzLW5vbmUtYW55LnppcCIvPgogICAgICAgICA8L2NvcHk+CiAgICAgICAgIDxjb3B5IHRvZGlyPSIke2J1aWxkLmxpYn0vc2lnYXItYmluLyIgcXVpZXQ9InRydWUiPgogICAgICAgICAgICAgPGZpbGUgZmlsZT0iJHtsb2NhbC5yZXBvc2l0b3J5fS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kZXBzL3NpZ2FyLWJpbi9saWJzaWdhci1hbWQ2NC1mcmVlYnNkLTYuc28iLz4KZGlmZiAtLWdpdCBhLy5idWlsZC9jYXNzYW5kcmEtYnVpbGQtZGVwcy10ZW1wbGF0ZS54bWwgYi8uYnVpbGQvY2Fzc2FuZHJhLWJ1aWxkLWRlcHMtdGVtcGxhdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZjJmOGMKLS0tIC9kZXYvbnVsbAorKysgYi8uYnVpbGQvY2Fzc2FuZHJhLWJ1aWxkLWRlcHMtdGVtcGxhdGUueG1sCkBAIC0wLDAgKzEsMTI3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIiB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGFydGlmYWN0SWQ+Y2Fzc2FuZHJhLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNhc3NhbmRyYTwvZ3JvdXBJZD4KKyAgICA8dmVyc2lvbj5AdmVyc2lvbkA8L3ZlcnNpb24+CisgICAgPHJlbGF0aXZlUGF0aD5AZmluYWwubmFtZUAtcGFyZW50LnBvbTwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKyAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jYXNzYW5kcmE8L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPmNhc3NhbmRyYS1idWlsZC1kZXBzPC9hcnRpZmFjdElkPgorICA8dmVyc2lvbj5AdmVyc2lvbkA8L3ZlcnNpb24+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1jb3JlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1pbmxpbmU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLm93Mi5hc208L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5hc208L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLm93Mi5hc208L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5hc20tdHJlZTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcub3cyLmFzbTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFzbS1jb21tb25zPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YXNtLXV0aWw8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5qaW1mczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmppbWZzPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5xdWlja3RoZW9yaWVzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cXVpY2t0aGVvcmllczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcucmVmbGVjdGlvbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5yZWZsZWN0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmNvZGUuamF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlcjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmphdmEtYWxsb2NhdGlvbi1pbnN0cnVtZW50ZXI8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jYXNzYW5kcmE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5kdGVzdC1hcGk8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wZW5qZGsuam1oPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+am1oLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLm9wZW5qZGsuam1oPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+am1oLWdlbmVyYXRvci1hbm5wcm9jZXNzPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm5ldC5qdS1uLmNvbXBpbGUtY29tbWFuZC1hbm5vdGF0aW9uczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbXBpbGUtY29tbWFuZC1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFudC1qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNhc3NhbmRyYTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmhhcnJ5LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmp1bml0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anVuaXQtYm9tPC9hcnRpZmFjdElkPgorICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hd2FpdGlsaXR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YXdhaXRpbGl0eTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuamFjb2NvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+b3JnLmphY29jby5hZ2VudDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuamFjb2NvPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+b3JnLmphY29jby5hbnQ8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFmb3JtYXQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFmb3JtYXQteWFtbDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvLmJ1aWxkL2Nhc3NhbmRyYS1kZXBzLXRlbXBsYXRlLnhtbCBiLy5idWlsZC9jYXNzYW5kcmEtZGVwcy10ZW1wbGF0ZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwN2JmZgotLS0gL2Rldi9udWxsCisrKyBiLy5idWlsZC9jYXNzYW5kcmEtZGVwcy10ZW1wbGF0ZS54bWwKQEAgLTAsMCArMSwzODAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxwcm9qZWN0IHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPHBhcmVudD4KKyAgICA8YXJ0aWZhY3RJZD5jYXNzYW5kcmEtcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDxncm91cElkPm9yZy5hcGFjaGUuY2Fzc2FuZHJhPC9ncm91cElkPgorICAgIDx2ZXJzaW9uPkB2ZXJzaW9uQDwvdmVyc2lvbj4KKyAgICA8cmVsYXRpdmVQYXRoPkBmaW5hbC5uYW1lQC1wYXJlbnQucG9tPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNhc3NhbmRyYTwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+Y2Fzc2FuZHJhLWFsbDwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+QHZlcnNpb25APC92ZXJzaW9uPgorICA8bmFtZT5BcGFjaGUgQ2Fzc2FuZHJhPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+VGhlIEFwYWNoZSBDYXNzYW5kcmEgUHJvamVjdCBkZXZlbG9wcyBhIGhpZ2hseSBzY2FsYWJsZSBzZWNvbmQtZ2VuZXJhdGlvbiBkaXN0cmlidXRlZCBkYXRhYmFzZSwgYnJpbmdpbmcgdG9nZXRoZXIgRHluYW1vJ3MgZnVsbHkgZGlzdHJpYnV0ZWQgZGVzaWduIGFuZCBCaWd0YWJsZSdzIENvbHVtbkZhbWlseS1iYXNlZCBkYXRhIG1vZGVsLjwvZGVzY3JpcHRpb24+CisgIDx1cmw+aHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZzwvdXJsPgorICA8aW5jZXB0aW9uWWVhcj4yMDA5PC9pbmNlcHRpb25ZZWFyPgorICA8bGljZW5zZXM+CisgICAgPGxpY2Vuc2U+CisgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgPHVybD5odHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgIDwvbGljZW5zZT4KKyAgPC9saWNlbnNlcz4KKyAgPHNjbT4KKyAgICA8Y29ubmVjdGlvbj5zY206aHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2YvY2Fzc2FuZHJhLmdpdDwvY29ubmVjdGlvbj4KKyAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206aHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2YvY2Fzc2FuZHJhLmdpdDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgICA8dXJsPmh0dHBzOi8vZ2l0Ym94LmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9Y2Fzc2FuZHJhLmdpdDthPXRyZWU8L3VybD4KKyAgPC9zY20+CisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcueGVyaWFsLnNuYXBweTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNuYXBweS1qYXZhPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5sejQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5sejQtamF2YTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20ubmluZzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbXByZXNzLWx6ZjwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jbGk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNsaTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxhbmczPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbWF0aDM8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YW50bHI8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+U1Q0PC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFudGxyLXJ1bnRpbWU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmxvZzRqLW92ZXItc2xmNGo8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amNsLW92ZXItc2xmNGo8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFiaW5kPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YXR5cGU8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGF0eXBlLWpzcjMxMDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uYm91bmRhcnk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5oaWdoLXNjYWxlLWxpYjwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcueWFtbDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNuYWtleWFtbDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcubWluZHJvdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpiY3J5cHQ8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+aW8uYWlybGlmdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFpcmxpbmU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+aW8uZHJvcHdpemFyZC5tZXRyaWNzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bWV0cmljcy1jb3JlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmlvLmRyb3B3aXphcmQubWV0cmljczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1ldHJpY3MtanZtPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmlvLmRyb3B3aXphcmQubWV0cmljczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1ldHJpY3MtbG9nYmFjazwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uYWRkdGhpcy5tZXRyaWNzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cmVwb3J0ZXItY29uZmlnMzwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uY2xlYXJzcHJpbmcuYW5hbHl0aWNzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c3RyZWFtPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNoLnFvcy5sb2diYWNrPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bG9nYmFjay1jb3JlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNoLnFvcy5sb2diYWNrPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bG9nYmFjay1jbGFzc2ljPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5kYXRhc3RheC5jYXNzYW5kcmE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jYXNzYW5kcmEtZHJpdmVyLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8Y2xhc3NpZmllcj5zaGFkZWQ8L2NsYXNzaWZpZXI+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+bmV0LmphdmEuZGV2LmpuYTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmpuYTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmpiZWxsaXM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qYW1tPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmlvLm5ldHR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bmV0dHktYm9tPC9hcnRpZmFjdElkPgorICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmlvLm5ldHR5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bmV0dHktYWxsPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwhLS0gY2hyb25pY2xlIHF1ZXVlLCBhbmQgZml4ZWQgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgLS0+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNocm9uaWNsZS1xdWV1ZTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNocm9uaWNsZS1jb3JlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm5ldC5vcGVuaGZ0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2hyb25pY2xlLWJ5dGVzPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm5ldC5vcGVuaGZ0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y2hyb25pY2xlLXdpcmU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+bmV0Lm9wZW5oZnQ8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5jaHJvbmljbGUtdGhyZWFkczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8IS0tIHRyYW5zaXRpdmUgdG8gY2hyb25pY2xlLWNvcmUgLS0+CisgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnBvc2l4PC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDwhLS0gdHJhbnNpdGl2ZSB0byBwb3NpeCB0byBjaHJvbmljbGUtY29yZSAtLT4KKyAgICAgIDxncm91cElkPm5ldC5qYXZhLmRldi5qbmE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qbmEtcGxhdGZvcm08L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPCEtLSB0cmFuc2l0aXZlIHRvIHBvc2l4IHRvIGNocm9uaWNsZS1jb3JlIC0tPgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qbnI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qbnItZmZpPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDwhLS0gdHJhbnNpdGl2ZSB0byBqbnItZmZpIHRvIHBvc2l4IHRvIGNocm9uaWNsZS1jb3JlIC0tPgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qbnI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZmZpPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDwhLS0gdHJhbnNpdGl2ZSB0byBqbnItZmZpIHRvIHBvc2l4IHRvIGNocm9uaWNsZS1jb3JlIC0tPgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qbnI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qZmZpPC9hcnRpZmFjdElkPgorICAgICAgPGNsYXNzaWZpZXI+bmF0aXZlPC9jbGFzc2lmaWVyPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDwhLS0gdHJhbnNpdGl2ZSB0byBqbnItZmZpIHRvIGNocm9uaWNsZS1jb3JlIC0tPgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qbnI8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qbnItY29uc3RhbnRzPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDwhLS0gdHJhbnNpdGl2ZSB0byBjaHJvbmljbGUtdGhyZWFkcyAtLT4KKyAgICAgIDxncm91cElkPm5ldC5vcGVuaGZ0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YWZmaW5pdHk8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDwhLS0gZW5kIG9mIGNocm9uaWNsZS1xdWV1ZSAtLT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmZ1c2Vzb3VyY2U8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zaWdhcjwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlcjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmVjajwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuY2FmZmluaXRhcy5vaGM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vaGMtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuY2FmZmluaXRhcy5vaGM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5vaGMtY29yZS1qODwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmJlbi1tYW5lcy5jYWZmZWluZTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNhZmZlaW5lPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5qY3Rvb2xzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amN0b29scy1jb3JlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YXNtPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNvbS5jYXJyb3RzZWFyY2g8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5ocHBjPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5ncmlka2l0Lmp2bXRvb2w8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zamstY2xpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MC4xNDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZ3JpZGtpdC5qdm10b29sPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2prLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmdyaWRraXQuanZtdG9vbDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnNqay1zdGFja3RyYWNlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5ncmlka2l0Lmp2bXRvb2w8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5teGR1bXA8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmdyaWRraXQubGFiPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+anZtLWF0dGFjaC1hcGk8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmJldXN0PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amNvbW1hbmRlcjwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuZ3JpZGtpdC5qdm10b29sPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2prLWpzb248L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5sdWJlbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnpzdGQtam5pPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5wc2phdmE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wc2phdmE8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+aW8ubmV0dHk8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5uZXR0eS10Y25hdGl2ZS1ib3Jpbmdzc2wtc3RhdGljPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmphdmF4LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmphdmF4LmluamVjdDwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmoyb2JqYzwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmoyb2JqYy1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuaGRyaGlzdG9ncmFtPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+SGRySGlzdG9ncmFtPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmRlLmpmbGV4PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+amZsZXg8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5yaG9sZGVyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c25vd2JhbGwtc3RlbW1lcjwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlY29kZS5jb25jdXJyZW50LXRyZWVzPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29uY3VycmVudC10cmVlczwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmNvZGUuZmluZGJ1Z3M8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5qc3IzMDU8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+bmV0Lmp1LW4uY29tcGlsZS1jb21tYW5kLWFubm90YXRpb25zPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tcGlsZS1jb21tYW5kLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hc3NlcnRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YXNzZXJ0ai1jb3JlPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5qYm9zcy5ieXRlbWFuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Ynl0ZW1hbi1pbnN0YWxsPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5qYm9zcy5ieXRlbWFuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Ynl0ZW1hbjwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuamJvc3MuYnl0ZW1hbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmJ5dGVtYW4tc3VibWl0PC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5qYm9zcy5ieXRlbWFuPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Ynl0ZW1hbi1ibXVuaXQ8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5zZWFuY2ZvbGV5PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+aXBhZGRyZXNzPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmNoLm9iZXJtdWhsbmVyPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+YmlnLW1hdGg8L2FydGlmYWN0SWQ+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFncm9uYTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmFncm9uYTwvYXJ0aWZhY3RJZD4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvLmJ1aWxkL3BhcmVudC1wb20tdGVtcGxhdGUueG1sIGIvLmJ1aWxkL3BhcmVudC1wb20tdGVtcGxhdGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMDBiYjQKLS0tIC9kZXYvbnVsbAorKysgYi8uYnVpbGQvcGFyZW50LXBvbS10ZW1wbGF0ZS54bWwKQEAgLTAsMCArMSwxMDUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIiB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgIDxwYXJlbnQ+CisgICAgPGFydGlmYWN0SWQ+YXBhY2hlPC9hcnRpZmFjdElkPgorICAgIDxncm91cElkPm9yZy5hcGFjaGU8L2dyb3VwSWQ+CisgICAgPHZlcnNpb24+MjI8L3ZlcnNpb24+CisgIDwvcGFyZW50PgorICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNhc3NhbmRyYTwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+Y2Fzc2FuZHJhLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgPHZlcnNpb24+QHZlcnNpb25APC92ZXJzaW9uPgorICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICA8bmFtZT5BcGFjaGUgQ2Fzc2FuZHJhPC9uYW1lPgorICA8ZGVzY3JpcHRpb24+VGhlIEFwYWNoZSBDYXNzYW5kcmEgUHJvamVjdCBkZXZlbG9wcyBhIGhpZ2hseSBzY2FsYWJsZSBzZWNvbmQtZ2VuZXJhdGlvbiBkaXN0cmlidXRlZCBkYXRhYmFzZSwgYnJpbmdpbmcgdG9nZXRoZXIgRHluYW1vJ3MgZnVsbHkgZGlzdHJpYnV0ZWQgZGVzaWduIGFuZCBCaWd0YWJsZSdzIENvbHVtbkZhbWlseS1iYXNlZCBkYXRhIG1vZGVsLjwvZGVzY3JpcHRpb24+CisgIDx1cmw+aHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZzwvdXJsPgorICA8aW5jZXB0aW9uWWVhcj4yMDA5PC9pbmNlcHRpb25ZZWFyPgorICA8bGljZW5zZXM+CisgICAgPGxpY2Vuc2U+CisgICAgICA8bmFtZT5UaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9uYW1lPgorICAgICAgPHVybD5odHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgorICAgIDwvbGljZW5zZT4KKyAgPC9saWNlbnNlcz4KKyAgPHByb3BlcnRpZXM+CisgICAgPGJ5dGVidWRkeS52ZXJzaW9uPjEuMTIuMTM8L2J5dGVidWRkeS52ZXJzaW9uPgorICAgIDxieXRlbWFuLnZlcnNpb24+NC4wLjIwPC9ieXRlbWFuLnZlcnNpb24+CisgICAgPG9oYy52ZXJzaW9uPjAuNS4xPC9vaGMudmVyc2lvbj4KKworICAgIDwhLS0gVGhlc2UgYXJlIHJlZmVyZW5jZWQgaW4gYnVpbGQueG1sLCBzbyBuZWVkIHRvIGJlIHByb3BhZ2F0ZWQgZnJvbSB0aGVyZSAtLT4KKyAgICA8YXNtLnZlcnNpb24+QGFzbS52ZXJzaW9uQDwvYXNtLnZlcnNpb24+CisgICAgPGphbW0udmVyc2lvbj5AamFtbS52ZXJzaW9uQDwvamFtbS52ZXJzaW9uPgorICAgIDxhbGxvY2F0aW9uLWluc3RydW1lbnRlci52ZXJzaW9uPkBhbGxvY2F0aW9uLWluc3RydW1lbnRlci52ZXJzaW9uQDwvYWxsb2NhdGlvbi1pbnN0cnVtZW50ZXIudmVyc2lvbj4KKyAgICA8ZWNqLnZlcnNpb24+QGVjai52ZXJzaW9uQDwvZWNqLnZlcnNpb24+CisgICAgPGphY29jby52ZXJzaW9uPkBqYWNvY28udmVyc2lvbkA8L2phY29jby52ZXJzaW9uPgorICAgIDxqZmxleC52ZXJzaW9uPkBqZmxleC52ZXJzaW9uQDwvamZsZXgudmVyc2lvbj4KKyAgPC9wcm9wZXJ0aWVzPgorICA8ZGV2ZWxvcGVycz4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmFkZWxhcGVuYTwvaWQ+CisgICAgICA8bmFtZT5BbmRyZXMgZGUgbGEgUGXDsWE8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5hbGFrc2htYW48L2lkPgorICAgICAgPG5hbWU+QXZpbmFzaCBMYWtzaG1hbjwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmFsZWtzZXk8L2lkPgorICAgICAgPG5hbWU+QWxla3NleSBZZXNjaGVua288L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5hbW9ydG9uPC9pZD4KKyAgICAgIDxuYW1lPkFhcm9uIE1vcnRvbjwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmF3ZWlzYmVyZzwvaWQ+CisgICAgICA8bmFtZT5BcmllbCBXZWlzYmVyZzwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmJkZWdnbGVzdG9uPC9pZD4KKyAgICAgIDxuYW1lPkJsYWtlIEVnZ2xlc3RvbjwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmJlbmVkaWN0PC9pZD4KKyAgICAgIDxuYW1lPkJlbmVkaWN0IEVsbGlvdHQgU21pdGg8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5iZW5qYW1pbjwvaWQ+CisgICAgICA8bmFtZT5CZW5qYW1pbiBMZXJlcjwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmJsYW1ib3Y8L2lkPgorICAgICAgPG5hbWU+QnJhbmltaXIgTGFtYm92PC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+YnJhbmRvbndpbGxpYW1zPC9pZD4KKyAgICAgIDxuYW1lPkJyYW5kb24gV2lsbGlhbXM8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5jYXJsPC9pZD4KKyAgICAgIDxuYW1lPkNhcmwgWWVrc2lnaWFuPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+ZGJyb3NpdXM8L2lkPgorICAgICAgPG5hbWU+RGF2aWQgQnJvc2l1c2Q8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5kaWthbmc8L2lkPgorICAgICAgPG5hbWU+RGlrYW5nIEd1PC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+ZWV2YW5zPC9pZD4KKyAgICAgIDxuYW1lPkVyaWMgRXZhbnM8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5lZGltaXRyb3ZhPC9pZD4KKyAgICAgIDxuYW1lPkVrYXRlcmluYSBEaW1pdHJvdmE8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5nZHVzYmFiZWs8L2lkPgorICAgICAgPG5hbWU+R2FyeSBEdXNiYWJlazwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmdvZmZpbmV0PC9pZD4KKyAgICAgIDxuYW1lPkNocmlzIEdvZmZpbmV0PC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+aWZlc2RqZWVuPC9pZD4KKyAgICAgIDxuYW1lPkFsZXggUGV0cm92PC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+amFha2tvPC9pZD4KKyAgICAgIDxuYW1lPkxhaW5lIEphYWtrbyBPbGF2aTwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmpha2U8L2lkPgorICAgICAgPG5hbWU+VCBKYWtlIEx1Y2lhbmk8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5qYXNvbmJyb3duPC9pZD4KKyAgICAgIDxuYW1lPkphc29uIEJyb3duPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+amJlbGxpczwvaWQ+CisgICAgICA8bmFtZT5Kb25hdGhhbiBFbGxpczwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmpmYXJyZWxsPC9pZD4KKyAgICAgIDxuYW1lPkpha2UgRmFycmVsbDwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmpqaXJzYTwvaWQ+CisgICAgICA8bmFtZT5KZWZmIEppcnNhPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+amtuaTwvaWQ+CisgICAgICA8bmFtZT5Kb2VsIEtuaWdodG9uPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+am1ja2VuemllPC9pZD4KKyAgICAgIDxuYW1lPkpvc2ggTWNLZW56aWU8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5qb2hhbjwvaWQ+CisgICAgICA8bmFtZT5Kb2hhbiBPc2thcnNzb248L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5qdW5yYW88L2lkPgorICAgICAgPG5hbWU+SnVuIFJhbzwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmp6aHVhbmc8L2lkPgorICAgICAgPG5hbWU+SmF5IFpodWFuZzwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPmtvaGxpc2Fua2FscDwvaWQ+CisgICAgICA8bmFtZT5TYW5rYWxwIEtvaGxpPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+bWFyY3VzZTwvaWQ+CisgICAgICA8bmFtZT5NYXJjdXMgRXJpa3Nzb248L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5tY2s8L2lkPgorICAgICAgPG5hbWU+TWljaGFlbCBTZW1iIFdldmVyPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+bWlzaGFpbDwvaWQ+CisgICAgICA8bmFtZT5NaWtoYWlsIFN0ZXB1cmE8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5tc2h1bGVyPC9pZD4KKyAgICAgIDxuYW1lPk1pY2hhZWwgU2h1bGVyPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+cGF1bG88L2lkPgorICAgICAgPG5hbWU+UGF1bG8gTW90dGE8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5wbWFsaWs8L2lkPgorICAgICAgPG5hbWU+UHJhc2hhbnQgTWFsaWs8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5yc3R1cHA8L2lkPgorICAgICAgPG5hbWU+Um9iZXJ0IFN0dXBwPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+c2NvZGU8L2lkPgorICAgICAgPG5hbWU+UGV0ZXIgU2NodWxsZXI8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5iZW9iYWw8L2lkPgorICAgICAgPG5hbWU+U2FtIFR1bm5pY2xpZmZlPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+c2xlYnJlc25lPC9pZD4KKyAgICAgIDxuYW1lPlN5bHZhaW4gTGVicmVzbmU8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD5zdGVmYW5pYTwvaWQ+CisgICAgICA8bmFtZT5TdGVmYW5pYSBBbGJvcmdoZXR0aTwvbmFtZT4KKyAgICA8L2RldmVsb3Blcj4KKyAgICA8ZGV2ZWxvcGVyPgorICAgICAgPGlkPnR5bGVyaG9iYnM8L2lkPgorICAgICAgPG5hbWU+VHlsZXIgSG9iYnM8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD52aWpheTwvaWQ+CisgICAgICA8bmFtZT5WaWpheSBQYXJ0aGFzYXJhdGh5PC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+eGVkaW48L2lkPgorICAgICAgPG5hbWU+UGF2ZWwgWWFza2V2aWNoPC9uYW1lPgorICAgIDwvZGV2ZWxvcGVyPgorICAgIDxkZXZlbG9wZXI+CisgICAgICA8aWQ+eXVraW08L2lkPgorICAgICAgPG5hbWU+WXVraSBNb3Jpc2hpdGE8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgICAgPGRldmVsb3Blcj4KKyAgICAgIDxpZD56em5hdGU8L2lkPgorICAgICAgPG5hbWU+TmF0ZSBNY0NhbGw8L25hbWU+CisgICAgPC9kZXZlbG9wZXI+CisgIDwvZGV2ZWxvcGVycz4KKyAgPHNjbT4KKyAgICA8Y29ubmVjdGlvbj5zY206aHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2YvY2Fzc2FuZHJhLmdpdDwvY29ubmVjdGlvbj4KKyAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206aHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2YvY2Fzc2FuZHJhLmdpdDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKyAgICA8dXJsPmh0dHBzOi8vZ2l0Ym94LmFwYWNoZS5vcmcvcmVwb3MvYXNmP3A9Y2Fzc2FuZHJhLmdpdDthPXRyZWU8L3VybD4KKyAgPC9zY20+CisgIDxkZXBlbmRlbmN5TWFuYWdlbWVudD4KKyAgICA8IS0tCisgICAgRGVwZW5kZW5jeSBtZXRhZGF0YSBpcyBzcGVjaWZpZWQgaGVyZSAodmVyc2lvbiwgc2NvcGUsIGV4Y2x1c2lvbnMsIGV0Yy4pLCB0aGVuIHJlZmVyZW5jZWQgaW4gY2hpbGQgUE9NcyBieSBncm91cElkIGFuZAorICAgIGFydGlmYWN0SWQuCisgICAgLS0+CisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcueGVyaWFsLnNuYXBweTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+c25hcHB5LWphdmE8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMS44LjQ8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmx6NDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bHo0LWphdmE8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuOC4wPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5uaW5nPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5jb21wcmVzcy1semY8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuOC40PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5naXRodWIubHViZW48L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnpzdGQtam5pPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjUuNS0xPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yNy4wLWpyZTwvdmVyc2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjMwNTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuY29kZS5maW5kYnVnczwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW5pbWFsLXNuaWZmZXItYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bGlzdGVuYWJsZWZ1dHVyZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmZhaWx1cmVhY2Nlc3M8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVja2VyLXF1YWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY2hlY2tlcmZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXJyb3JfcHJvbmVfYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmVycm9ycHJvbmU8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmppbWZzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qaW1mczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5oZHJoaXN0b2dyYW08L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPkhkckhpc3RvZ3JhbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4xLjk8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jbGk8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY2xpPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjE8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS45PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaW88L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMTEuMDwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNvbW1vbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbGFuZzM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMTE8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jb21tb25zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLW1hdGgzPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4zLjI8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFudGxyPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hbnRscjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My41LjI8L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zdHJpbmd0ZW1wbGF0ZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5hbnRscjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+U1Q0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj40LjAuODwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYW50bHI8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFudGxyLXJ1bnRpbWU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuNS4yPC92ZXJzaW9uPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3RyaW5ndGVtcGxhdGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYW50bHI8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS43LjI1PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGotb3Zlci1zbGY0ajwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS43LjI1PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amNsLW92ZXItc2xmNGo8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuNy4yNTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5jaC5xb3MubG9nYmFjazwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bG9nYmFjay1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjIuOTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5jaC5xb3MubG9nYmFjazwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bG9nYmFjay1jbGFzc2ljPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjIuOTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjEzLjI8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tZGF0YWJpbmQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMTMuMi4yPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjEzLjI8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGF0eXBlPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGF0eXBlLWpzcjMxMDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4xMy4yPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhZm9ybWF0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFmb3JtYXQteWFtbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4xMy4yPC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbmFrZXlhbWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcueWFtbDwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5ib3VuZGFyeTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+aGlnaC1zY2FsZS1saWI8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMC42PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuamJlbGxpczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amFtbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtqYW1tLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy55YW1sPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5zbmFrZXlhbWw8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMjY8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj40LjEyPC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLm1vY2tpdG88L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1vY2tpdG8tY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+NC43LjA8L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1pbmxpbmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjQuNy4wPC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLnF1aWNrdGhlb3JpZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnF1aWNrdGhlb3JpZXM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuMjY8L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmNvZGUuamF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlcjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHthbGxvY2F0aW9uLWluc3RydW1lbnRlci52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jYXNzYW5kcmE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmhhcnJ5LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuMC4xPC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLnJlZmxlY3Rpb25zPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5yZWZsZWN0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC4xMC4yPC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jYXNzYW5kcmE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmR0ZXN0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC4wLjEzPC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+bmV0LmphdmEuZGV2LmpuYTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+am5hPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj41LjEzLjA8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8IS0tIHRyYW5zaXRpdmUgdG8gcG9zaXggdG8gY2hyb25pY2xlLWNvcmUsIGRlY2xhcmVkIGV4cGxpY2l0IHRvIHVzZSBuZXdlciB2ZXJzaW9uIC0tPgorICAgICAgICA8Z3JvdXBJZD5uZXQuamF2YS5kZXYuam5hPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qbmEtcGxhdGZvcm08L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjUuMTMuMDwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8IS0tIHRyYW5zaXRpdmUgdG8gcG9zaXggdG8gY2hyb25pY2xlLWNvcmUsIGRlY2xhcmVkIGV4cGxpY2l0IHRvIHVzZSBuZXdlciB2ZXJzaW9uIC0tPgorICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmpucjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+am5yLWZmaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yLjEzPC92ZXJzaW9uPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm93Mi5hc208L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXNtLWFuYWx5c2lzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFzbS1jb21tb25zPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFzbS10cmVlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFzbS11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8IS0tIHRyYW5zaXRpdmUgdG8gam5yLWZmaSB0byBwb3NpeCB0byBjaHJvbmljbGUtY29yZSwgZGVjbGFyZWQgZXhwbGljaXQgdG8gdXNlIG5ld2VyIHZlcnNpb24gLS0+CisgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuam5yPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qZmZpPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjMuMTE8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPCEtLSB0cmFuc2l0aXZlIHRvIGpuci1mZmkgdG8gcG9zaXggdG8gY2hyb25pY2xlLWNvcmUsIGRlY2xhcmVkIGV4cGxpY2l0IHRvIHVzZSBuZXdlciB2ZXJzaW9uIC0tPgorICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLmpucjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amZmaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGNsYXNzaWZpZXI+bmF0aXZlPC9jbGFzc2lmaWVyPgorICAgICAgICA8dmVyc2lvbj4xLjMuMTE8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPCEtLSB0cmFuc2l0aXZlIHRvIHBvc2l4IHRvIGNocm9uaWNsZS1jb3JlLCBkZWNsYXJlZCBleHBsaWNpdCB0byB1c2UgbmV3ZXIgdmVyc2lvbiAtLT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qbnI8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmpuci1jb25zdGFudHM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuMTAuNDwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5qYWNvY288L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9yZy5qYWNvY28uYWdlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7amFjb2NvLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmphY29jbzwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmphY29jby5hbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7amFjb2NvLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hc208L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3cyLmFzbTwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5qYm9zcy5ieXRlbWFuPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5ieXRlbWFuLWluc3RhbGw8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7Ynl0ZW1hbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuamJvc3MuYnl0ZW1hbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Ynl0ZW1hbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtieXRlbWFuLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5qYm9zcy5ieXRlbWFuPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5ieXRlbWFuLXN1Ym1pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtieXRlbWFuLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5qYm9zcy5ieXRlbWFuPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5ieXRlbWFuLWJtdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtieXRlbWFuLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm5ldC5ieXRlYnVkZHk8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmJ5dGUtYnVkZHk8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7Ynl0ZWJ1ZGR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm5ldC5ieXRlYnVkZHk8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmJ5dGUtYnVkZHktYWdlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7Ynl0ZWJ1ZGR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5vcGVuamRrLmptaDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+am1oLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMjE8L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcub3Blbmpkay5qbWg8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmptaC1nZW5lcmF0b3ItYW5ucHJvY2VzczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4yMTwvdmVyc2lvbj4KKyAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuYW50PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hbnQtanVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMTAuMTI8L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNhc3NhbmRyYTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Y2Fzc2FuZHJhLWFsbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+NC4xLWFscGhhMi1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5pby5kcm9wd2l6YXJkLm1ldHJpY3M8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1ldHJpY3MtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My4xLjU8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+aW8uZHJvcHdpemFyZC5tZXRyaWNzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tZXRyaWNzLWp2bTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My4xLjU8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+aW8uZHJvcHdpemFyZC5tZXRyaWNzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5tZXRyaWNzLWxvZ2JhY2s8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMS41PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5hZGR0aGlzLm1ldHJpY3M8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnJlcG9ydGVyLWNvbmZpZzM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMC4zPC92ZXJzaW9uPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcubWluZHJvdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amJjcnlwdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC40PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmlvLmFpcmxpZnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFpcmxpbmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuODwvdmVyc2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzcjMwNTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuY29kZS5maW5kYnVnczwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmlvLm5ldHR5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5uZXR0eS1ib208L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjQuMS41OC5GaW5hbDwvdmVyc2lvbj4KKyAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmlvLm5ldHR5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5uZXR0eS1hbGw8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjQuMS41OC5GaW5hbDwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5pby5uZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+bmV0dHktdGNuYXRpdmUtYm9yaW5nc3NsLXN0YXRpYzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4wLjM2LkZpbmFsPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICA8IS0tIGNocm9uaWNsZS1xdWV1ZSBkZXBzIC0tPgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm5ldC5vcGVuaGZ0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5jaHJvbmljbGUtcXVldWU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjUuMjMuMzc8L3ZlcnNpb24+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50b29sczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW48L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgPCEtLSBwdWxscyBpbiBhZmZpbml0eS0zLjIzZWExIHdoaWNoIHB1bGxzIGluIHRoaXJkLXBhcnR5LWJvbS0zLjIyLjQtU05BUFNIT1QgLS0+CisgICAgICAgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmFmZmluaXR5PC9hcnRpZmFjdElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+bmV0Lm9wZW5oZnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNocm9uaWNsZS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjIzLjM2PC92ZXJzaW9uPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2hyb25pY2xlLWFuYWx5dGljczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPm5ldC5vcGVuaGZ0PC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qZXRicmFpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Y2hyb25pY2xlLWJ5dGVzPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjIzLjMzPC92ZXJzaW9uPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamV0YnJhaW5zPC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+bmV0Lm9wZW5oZnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNocm9uaWNsZS13aXJlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjIzLjM5PC92ZXJzaW9uPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tcGlsZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICA8IS0tIHB1bGxzIGluIGFmZmluaXR5LTMuMjNlYTEgd2hpY2ggcHVsbHMgaW4gdGhpcmQtcGFydHktYm9tLTMuMjIuNC1TTkFQU0hPVCAtLT4KKyAgICAgICAgICAgIDxncm91cElkPm5ldC5vcGVuaGZ0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YWZmaW5pdHk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Y2hyb25pY2xlLXRocmVhZHM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjMuMjU8L3ZlcnNpb24+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgIDwhLS0gcHVsbHMgaW4gYWZmaW5pdHktMy4yM2VhMSB3aGljaCBwdWxscyBpbiB0aGlyZC1wYXJ0eS1ib20tMy4yMi40LVNOQVBTSE9UIC0tPgorICAgICAgICAgICAgPGdyb3VwSWQ+bmV0Lm9wZW5oZnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hZmZpbml0eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDwhLS0gdHJhbnNpdGl2ZSB0byBjaHJvbmljbGUtcXVldWUsIGRlY2xhcmVkIGV4cGxpY2l0IHRvIHVzZSBuZXdlciB2ZXJzaW9uIC0tPgorICAgICAgICA8Z3JvdXBJZD5uZXQub3BlbmhmdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+YWZmaW5pdHk8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMjMuMzwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8IS0tIHRyYW5zaXRpdmUgdG8gY2hyb25pY2xlLXF1ZXVlLCBkZWNsYXJlZCBleHBsaWNpdCB0byB1c2UgbmV3ZXIgdmVyc2lvbiAtLT4KKyAgICAgICAgPGdyb3VwSWQ+bmV0Lm9wZW5oZnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnBvc2l4PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI0ZWE0PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPCEtLSBlbmQgb2YgY2hyb25pY2xlLXF1ZXVlIC0tPgorCisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmZpbmRidWdzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qc3IzMDU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMC4yPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5jbGVhcnNwcmluZy5hbmFseXRpY3M8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnN0cmVhbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi41LjI8L3ZlcnNpb24+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5mYXN0dXRpbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPml0LnVuaW1pLmRzaTwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5kYXRhc3RheC5jYXNzYW5kcmE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNhc3NhbmRyYS1kcml2ZXItY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+My4xMS4wPC92ZXJzaW9uPgorICAgICAgICA8Y2xhc3NpZmllcj5zaGFkZWQ8L2NsYXNzaWZpZXI+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZXR0eS1idWZmZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5pby5uZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmV0dHktY29kZWM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5pby5uZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmV0dHktaGFuZGxlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPmlvLm5ldHR5PC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZXR0eS10cmFuc3BvcnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5pby5uZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qbnItZmZpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5qbnI8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpuci1wb3NpeDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuam5yPC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXI8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmVjajwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtlY2oudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmNhZmZpbml0YXMub2hjPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vaGMtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHtvaGMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuY2FmZmluaXRhcy5vaGM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9oYy1jb3JlLWo4PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4ke29oYy52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5uZXQuanUtbi5jb21waWxlLWNvbW1hbmQtYW5ub3RhdGlvbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNvbXBpbGUtY29tbWFuZC1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmZ1c2Vzb3VyY2U8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnNpZ2FyPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjYuNDwvdmVyc2lvbj4KKyAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5jb20uY2Fycm90c2VhcmNoPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5ocHBjPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4wLjguMTwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5kZS5qZmxleDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amZsZXg8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7amZsZXgudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmFudDwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5naXRodWIucmhvbGRlcjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+c25vd2JhbGwtc3RlbW1lcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4zLjAuNTgxLjE8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZWNvZGUuY29uY3VycmVudC10cmVlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+Y29uY3VycmVudC10cmVlczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi40LjA8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5iZW4tbWFuZXMuY2FmZmVpbmU8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmNhZmZlaW5lPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjkuMjwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuamN0b29sczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amN0b29scy1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4zLjEuMDwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hc208L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7YXNtLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hc20tYW5hbHlzaXM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7YXNtLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLm93Mi5hc208L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFzbS10cmVlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4ke2FzbS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5vdzIuYXNtPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hc20tY29tbW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+JHthc20udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcub3cyLmFzbTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+YXNtLXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPiR7YXNtLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ3JpZGtpdC5qdm10b29sPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5zamstY2xpPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4wLjE0PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5ncmlka2l0Lmp2bXRvb2w8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnNqay1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4wLjE0PC92ZXJzaW9uPgorICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2prLWhmbGFtZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5ncmlka2l0Lmp2bXRvb2w8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNqay1oZmxhbWU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcucGVyZmtpdC5zamsucGFyc2VyczwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2prLWpmci1zdGFuZGFsb25lPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnBlcmZraXQuc2prLnBhcnNlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNqay1ucHM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcucGVyZmtpdC5zamsucGFyc2VyczwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2prLWpmcjU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcucGVyZmtpdC5zamsucGFyc2VyczwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2prLWpmcjY8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcucGVyZmtpdC5zamsucGFyc2VyczwvZ3JvdXBJZD4KKyAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5ncmlka2l0Lmp2bXRvb2w8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnNqay1zdGFja3RyYWNlPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4wLjE0PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5ncmlka2l0Lmp2bXRvb2w8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm14ZHVtcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC4xNDwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ3JpZGtpdC5sYWI8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmp2bS1hdHRhY2gtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjU8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdyaWRraXQuanZtdG9vbDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+c2prLWpzb248L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuMTQ8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmJldXN0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qY29tbWFuZGVyPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xLjMwPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5wc2phdmE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnBzamF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC4xLjE5PC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmphdmF4LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguaW5qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuajJvYmpjPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5qMm9iamMtYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMzwvdmVyc2lvbj4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuanVuaXQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmp1bml0LWJvbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+NS42LjA8L3ZlcnNpb24+CisgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5hc3NlcnRqPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5hc3NlcnRqLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjMuMTUuMDwvdmVyc2lvbj4KKyAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXdhaXRpbGl0eTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+YXdhaXRpbGl0eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+NC4wLjM8L3ZlcnNpb24+CisgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgorICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5zZWFuY2ZvbGV5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5pcGFkZHJlc3M8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjUuMy4zPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5hZ3JvbmE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmFncm9uYTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MS4xNy4xPC92ZXJzaW9uPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPmNoLm9iZXJtdWhsbmVyPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5iaWctbWF0aDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4zLjA8L3ZlcnNpb24+CisgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisgIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS8uY2lyY2xlY2kvY29uZmlnLnltbCBiLy5jaXJjbGVjaS9jb25maWcueW1sCmluZGV4IGIwMDljZDEuLjc0ZTVkMjEgMTAwNjQ0Ci0tLSBhLy5jaXJjbGVjaS9jb25maWcueW1sCisrKyBiLy5jaXJjbGVjaS9jb25maWcueW1sCkBAIC05NSw4ICs5NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTcyLDcgKzE3MCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19GUUxUT09MfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1mcWx0b29sLXRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgZnFsdG9vbC10ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtMTg2LDggKzE4NCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjUyLDggKzI0OCw2IEBACiAgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzYzLDggKzM1Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTE5LDggKzUxMSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjA2LDggKzU5Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF9sYXJnZV93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzI1LDggKzcxMyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzk5LDggKzc4NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODc2LDcgKzg2MCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTg5MCw4ICs4NzQsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTEwMDEsOCArOTgzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTA0NCw2ICsxMDI0LDk1IEBACiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKICAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CiAgICAgLSBDQVNTQU5EUkFfVVNFX0pESzExOiB0cnVlCisgIGo4X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtdHJpZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXRyaWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgIGo4X2p2bV9kdGVzdHNfdm5vZGU6CiAgICAgZG9ja2VyOgogICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKQEAgLTExMjEsOCArMTE5MCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTE5OCw3ICsxMjY1LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtMTIxMiw4ICsxMjc5LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0xMzMxLDggKzEzOTYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTE0NDIsOCArMTUwNSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTU1Miw4ICsxNjEzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTYzMCw3ICsxNjg5LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtMTY0NCw4ICsxNzAzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0xNzYwLDYgKzE4MTcsNyBAQAogICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY2RjIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJmcWx0b29sLXRlc3QiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCkBAIC0xODQwLDggKzE4OTgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTE5MjcsOCArMTk4Myw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfbGFyZ2Vfd2l0aF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTIwNjIsOCArMjExNiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjE3Myw4ICsyMjI1LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yMjgzLDggKzIzMzMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yMzcwLDggKzI0MTgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yNDQ4LDcgKzI0OTQsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTI0NjIsOCArMjUwOCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjU3Myw4ICsyNjE3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yNjgzLDggKzI3MjUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yNzQ5LDggKzI3ODksNiBAQAogICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTI4NjgsOCArMjkwNiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjk0Miw4ICsyOTc4LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zMDYyLDggKzMwOTYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTMxOTYsOCArMzIyOCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzMzMCw4ICszMzYwLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zNDY1LDggKzM0OTMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTM1ODQsOCArMzYxMCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzcwMCw4ICszNzI0LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zODE5LDggKzM4NDEsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTM4OTIsOCArMzkxMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzk3MCw3ICszOTg4LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTM5ODQsOCArNDAwMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDA3MCw4ICs0MDg2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC00MTEyLDYgKzQxMjYsMTIwIEBACiAgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAorICBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBTaW11bGF0b3IgVGVzdHMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAzMG0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDI1CisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gQ0FTU0FORFJBX1VTRV9KREsxMTogdHJ1ZQogICBqMTFfdXRlc3RzX3N0cmVzczoKICAgICBkb2NrZXI6CiAgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdApAQCAtNDE0Myw4ICs0MjcxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC00MjU0LDggKzQzODAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTQzODgsOCArNDUxMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDQ2NSw3ICs0NTg3LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY2RjXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY2RjICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1jZGNcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jZGMgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTQ0NzksOCArNDYwMSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDYzNiw4ICs0NzU2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC00NzE0LDcgKzQ4MzIsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0x9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWZxbHRvb2wtdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBmcWx0b29sLXRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTQ3MjgsOCArNDg0Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDgwNSw3ICs0OTIxLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz10cnVlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPXRydWVcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTQ4MTksOCArNDkzNSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDkzOCw4ICs1MDUyLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01MDQ5LDggKzUxNjEsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3Rfajhfd2l0aG91dF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTUxNTksOCArNTI2OSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTUyMzcsNyArNTM0NSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXNpbXVsYXRvci1kdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXNpbXVsYXRvci1kdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc2ltdWxhdG9yLWR0ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC01MjUxLDggKzUzNTksNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTUzNjEsOCArNTQ2Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTU0MzksNyArNTU0Myw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNTQ1Myw4ICs1NTU3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01NDk1LDYgKzU1OTcsMTI0IEBACiAgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3RyaWU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC10cmllKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtdHJpZSAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKICAgajExX2R0ZXN0c19sYXJnZV9yZXBlYXQ6CiAgICAgZG9ja2VyOgogICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKQEAgLTU1ODcsOCArNTgwNyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTYzMCw2ICs1ODQ4LDEyMyBAQAogICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CiAgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAogICAgIC0gQ0FTU0FORFJBX1VTRV9KREsxMTogdHJ1ZQorICBqOF91dGVzdHNfdHJpZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXRyaWUpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC10cmllICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDI1CisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgajhfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgogICAgIGRvY2tlcjoKICAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CkBAIC01Njk4LDggKzYwMzMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTU3NzUsNyArNjEwOCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTU3ODksOCArNjEyMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTkyMyw4ICs2MjU0LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MDMzLDggKzYzNjIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MTIwLDggKzY0NDcsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfdXBncmFkZXRlc3RzX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MjI4LDggKzY1NTMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MzA2LDcgKzY2MjksNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC02MzIwLDggKzY2NDMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTY0MzAsOCArNjc1MSwxODYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKKyAgajExX3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtdHJpZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXRyaWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKKyAgajExX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zaW11bGF0b3ItZHRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zaW11bGF0b3ItZHRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjUwOCw3ICs3MDA3LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNjUyMiw4ICs3MDIxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02NjMzLDggKzcxMzAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02NzExLDcgKzcyMDYsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfTE9OR30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9bG9uZy10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBsb25nLXRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfTE9OR30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9bG9uZy10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBsb25nLXRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC02NzI1LDggKzcyMjAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTY4MTEsOCArNzMwNCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF9kdGVzdHNfb2ZmaGVhcF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjkzMCw4ICs3NDIxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03MDQ5LDggKzc1MzgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTcxMjcsNyArNzYxNCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9dHJ1ZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz10cnVlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC03MTQxLDggKzc2MjgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTcyNTAsOCArNzczNSw2IEBACiAgICAgICAgIC0gLm0yCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzMzNyw4ICs3ODIwLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03NDIzLDggKzc5MDQsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3Rfajhfd2l0aF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTc0ODcsOCArNzk2Niw2IEBACiAgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzU2NSw3ICs4MDQyLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNzU3OSw4ICs4MDU2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03Njg3LDggKzgxNjIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03ODAzLDYgKzgyNzYsNyBAQAogICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY2RjIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJmcWx0b29sLXRlc3QiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCkBAIC03ODgzLDggKzgzNTcsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTc5NTYsOCArODQyOCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODA3NSw4ICs4NTQ1LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04MTg1LDggKzg2NTMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTgzMTksOCArODc4NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODQzOCw4ICs4OTAyLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04NTQ2LDggKzkwMDgsNiBAQAogICAgICAgICAtIC5tMgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTg2NTYsOCArOTExNiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODczMyw3ICs5MTkxLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTg3NDcsOCArOTIwNSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODgyMSw4ICs5Mjc3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04ODg1LDggKzkzMzksNiBAQAogICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTg5OTMsOCArOTQ0NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTkwNzEsNyArOTUyMSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNkY1xudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWNkYyAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY2RjXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY2RjICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC05MDg1LDggKzk1MzUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTkyMTksOCArOTY2Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtOTI5Niw3ICs5NzQyLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0xPTkd9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWxvbmctdGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgbG9uZy10ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0xPTkd9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWxvbmctdGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgbG9uZy10ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtOTMxMCw4ICs5NzU2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC05NDE2LDggKzk4NjAsNiBAQAogICAgICAgICAtIGR0ZXN0X2phcnMKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC05NTY5LDYgKzEwMDExLDE4IEBACiAgICAgICAgIHJlcXVpcmVzOgogICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY29tcHJlc3Npb24KICAgICAgICAgLSBqOF9idWlsZAorICAgIC0gc3RhcnRfajhfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqOF91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajhfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqOF9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqOF9idWlsZAogICAgIC0gc3RhcnRfajhfdXRlc3RzX3N0cmVzczoKICAgICAgICAgdHlwZTogYXBwcm92YWwKICAgICAtIGo4X3V0ZXN0c19zdHJlc3M6CkBAIC05ODMzLDYgKzEwMjg3LDE2IEBACiAgICAgICAgIHJlcXVpcmVzOgogICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgogICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGo4X3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgIC0gajhfYnVpbGQKICAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqOF91dGVzdHNfc3RyZXNzOgpAQCAtMTAwMTAsNiArMTA0NzQsMTIgQEAKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHNfdm5vZGUKICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3NpbXVsYXRvcl9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzCisgICAgICAgIC0gajExX2J1aWxkCiAgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfdGVzdHM6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqMTFfY3Fsc2hsaWJfdGVzdHM6CkBAIC0xMDExMCw2ICsxMDU4MCwxMiBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NvbXByZXNzaW9uCiAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAogICAgIC0gc3RhcnRfajExX3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqMTFfdXRlc3RzX3N0cmVzczoKQEAgLTEwMTQ0LDYgKzEwNjIwLDkgQEAKICAgICAtIGoxMV9qdm1fZHRlc3RzX3Zub2RlOgogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKICAgICAtIGoxMV9jcWxzaGxpYl90ZXN0czoKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgIC0gajExX2J1aWxkCkBAIC0xMDIyMiw2ICsxMDcwMSwxMiBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb24KICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAogICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzczoKICAgICAgICAgdHlwZTogYXBwcm92YWwKICAgICAtIGoxMV91dGVzdHNfc3RyZXNzOgpkaWZmIC0tZ2l0IGEvLmNpcmNsZWNpL2NvbmZpZy55bWwuRlJFRSBiLy5jaXJjbGVjaS9jb25maWcueW1sLkZSRUUKaW5kZXggYjAwOWNkMS4uNzRlNWQyMSAxMDA2NDQKLS0tIGEvLmNpcmNsZWNpL2NvbmZpZy55bWwuRlJFRQorKysgYi8uY2lyY2xlY2kvY29uZmlnLnltbC5GUkVFCkBAIC05NSw4ICs5NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTcyLDcgKzE3MCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19GUUxUT09MfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1mcWx0b29sLXRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgZnFsdG9vbC10ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtMTg2LDggKzE4NCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjUyLDggKzI0OCw2IEBACiAgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzYzLDggKzM1Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTE5LDggKzUxMSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjA2LDggKzU5Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF9sYXJnZV93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzI1LDggKzcxMyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzk5LDggKzc4NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODc2LDcgKzg2MCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTg5MCw4ICs4NzQsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTEwMDEsOCArOTgzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTA0NCw2ICsxMDI0LDk1IEBACiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKICAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CiAgICAgLSBDQVNTQU5EUkFfVVNFX0pESzExOiB0cnVlCisgIGo4X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtdHJpZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXRyaWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgIGo4X2p2bV9kdGVzdHNfdm5vZGU6CiAgICAgZG9ja2VyOgogICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKQEAgLTExMjEsOCArMTE5MCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTE5OCw3ICsxMjY1LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtMTIxMiw4ICsxMjc5LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0xMzMxLDggKzEzOTYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTE0NDIsOCArMTUwNSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTU1Miw4ICsxNjEzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTYzMCw3ICsxNjg5LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtMTY0NCw4ICsxNzAzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0xNzYwLDYgKzE4MTcsNyBAQAogICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY2RjIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJmcWx0b29sLXRlc3QiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCkBAIC0xODQwLDggKzE4OTgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTE5MjcsOCArMTk4Myw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfbGFyZ2Vfd2l0aF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTIwNjIsOCArMjExNiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjE3Myw4ICsyMjI1LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yMjgzLDggKzIzMzMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yMzcwLDggKzI0MTgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yNDQ4LDcgKzI0OTQsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTI0NjIsOCArMjUwOCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjU3Myw4ICsyNjE3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yNjgzLDggKzI3MjUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yNzQ5LDggKzI3ODksNiBAQAogICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTI4NjgsOCArMjkwNiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjk0Miw4ICsyOTc4LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zMDYyLDggKzMwOTYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTMxOTYsOCArMzIyOCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzMzMCw4ICszMzYwLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zNDY1LDggKzM0OTMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTM1ODQsOCArMzYxMCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzcwMCw4ICszNzI0LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zODE5LDggKzM4NDEsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTM4OTIsOCArMzkxMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzk3MCw3ICszOTg4LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTM5ODQsOCArNDAwMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDA3MCw4ICs0MDg2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC00MTEyLDYgKzQxMjYsMTIwIEBACiAgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAorICBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBTaW11bGF0b3IgVGVzdHMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAzMG0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDI1CisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gQ0FTU0FORFJBX1VTRV9KREsxMTogdHJ1ZQogICBqMTFfdXRlc3RzX3N0cmVzczoKICAgICBkb2NrZXI6CiAgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdApAQCAtNDE0Myw4ICs0MjcxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC00MjU0LDggKzQzODAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTQzODgsOCArNDUxMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDQ2NSw3ICs0NTg3LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY2RjXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY2RjICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1jZGNcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jZGMgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTQ0NzksOCArNDYwMSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDYzNiw4ICs0NzU2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC00NzE0LDcgKzQ4MzIsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0x9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWZxbHRvb2wtdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBmcWx0b29sLXRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTQ3MjgsOCArNDg0Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDgwNSw3ICs0OTIxLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz10cnVlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPXRydWVcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTQ4MTksOCArNDkzNSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDkzOCw4ICs1MDUyLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01MDQ5LDggKzUxNjEsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3Rfajhfd2l0aG91dF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTUxNTksOCArNTI2OSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTUyMzcsNyArNTM0NSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXNpbXVsYXRvci1kdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXNpbXVsYXRvci1kdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc2ltdWxhdG9yLWR0ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC01MjUxLDggKzUzNTksNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTUzNjEsOCArNTQ2Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTU0MzksNyArNTU0Myw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNTQ1Myw4ICs1NTU3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01NDk1LDYgKzU1OTcsMTI0IEBACiAgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3RyaWU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC10cmllKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtdHJpZSAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKICAgajExX2R0ZXN0c19sYXJnZV9yZXBlYXQ6CiAgICAgZG9ja2VyOgogICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKQEAgLTU1ODcsOCArNTgwNyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTYzMCw2ICs1ODQ4LDEyMyBAQAogICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CiAgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAogICAgIC0gQ0FTU0FORFJBX1VTRV9KREsxMTogdHJ1ZQorICBqOF91dGVzdHNfdHJpZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXRyaWUpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC10cmllICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDI1CisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgajhfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgogICAgIGRvY2tlcjoKICAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CkBAIC01Njk4LDggKzYwMzMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTU3NzUsNyArNjEwOCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTU3ODksOCArNjEyMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTkyMyw4ICs2MjU0LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MDMzLDggKzYzNjIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MTIwLDggKzY0NDcsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfdXBncmFkZXRlc3RzX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MjI4LDggKzY1NTMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MzA2LDcgKzY2MjksNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC02MzIwLDggKzY2NDMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTY0MzAsOCArNjc1MSwxODYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKKyAgajExX3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtdHJpZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXRyaWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKKyAgajExX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zaW11bGF0b3ItZHRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zaW11bGF0b3ItZHRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjUwOCw3ICs3MDA3LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNjUyMiw4ICs3MDIxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02NjMzLDggKzcxMzAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02NzExLDcgKzcyMDYsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfTE9OR30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9bG9uZy10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBsb25nLXRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfTE9OR30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9bG9uZy10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBsb25nLXRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC02NzI1LDggKzcyMjAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTY4MTEsOCArNzMwNCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF9kdGVzdHNfb2ZmaGVhcF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjkzMCw4ICs3NDIxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03MDQ5LDggKzc1MzgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTcxMjcsNyArNzYxNCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9dHJ1ZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz10cnVlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC03MTQxLDggKzc2MjgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTcyNTAsOCArNzczNSw2IEBACiAgICAgICAgIC0gLm0yCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzMzNyw4ICs3ODIwLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03NDIzLDggKzc5MDQsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3Rfajhfd2l0aF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTc0ODcsOCArNzk2Niw2IEBACiAgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzU2NSw3ICs4MDQyLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNzU3OSw4ICs4MDU2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03Njg3LDggKzgxNjIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03ODAzLDYgKzgyNzYsNyBAQAogICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY2RjIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJmcWx0b29sLXRlc3QiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCkBAIC03ODgzLDggKzgzNTcsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTc5NTYsOCArODQyOCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODA3NSw4ICs4NTQ1LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04MTg1LDggKzg2NTMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTgzMTksOCArODc4NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODQzOCw4ICs4OTAyLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04NTQ2LDggKzkwMDgsNiBAQAogICAgICAgICAtIC5tMgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTg2NTYsOCArOTExNiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODczMyw3ICs5MTkxLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTg3NDcsOCArOTIwNSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODgyMSw4ICs5Mjc3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04ODg1LDggKzkzMzksNiBAQAogICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTg5OTMsOCArOTQ0NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTkwNzEsNyArOTUyMSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNkY1xudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWNkYyAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY2RjXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY2RjICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC05MDg1LDggKzk1MzUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTkyMTksOCArOTY2Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtOTI5Niw3ICs5NzQyLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0xPTkd9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWxvbmctdGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgbG9uZy10ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0xPTkd9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWxvbmctdGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgbG9uZy10ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtOTMxMCw4ICs5NzU2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC05NDE2LDggKzk4NjAsNiBAQAogICAgICAgICAtIGR0ZXN0X2phcnMKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC05NTY5LDYgKzEwMDExLDE4IEBACiAgICAgICAgIHJlcXVpcmVzOgogICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY29tcHJlc3Npb24KICAgICAgICAgLSBqOF9idWlsZAorICAgIC0gc3RhcnRfajhfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqOF91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajhfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqOF9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqOF9idWlsZAogICAgIC0gc3RhcnRfajhfdXRlc3RzX3N0cmVzczoKICAgICAgICAgdHlwZTogYXBwcm92YWwKICAgICAtIGo4X3V0ZXN0c19zdHJlc3M6CkBAIC05ODMzLDYgKzEwMjg3LDE2IEBACiAgICAgICAgIHJlcXVpcmVzOgogICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgogICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGo4X3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgIC0gajhfYnVpbGQKICAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqOF91dGVzdHNfc3RyZXNzOgpAQCAtMTAwMTAsNiArMTA0NzQsMTIgQEAKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHNfdm5vZGUKICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3NpbXVsYXRvcl9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzCisgICAgICAgIC0gajExX2J1aWxkCiAgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfdGVzdHM6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqMTFfY3Fsc2hsaWJfdGVzdHM6CkBAIC0xMDExMCw2ICsxMDU4MCwxMiBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NvbXByZXNzaW9uCiAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAogICAgIC0gc3RhcnRfajExX3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqMTFfdXRlc3RzX3N0cmVzczoKQEAgLTEwMTQ0LDYgKzEwNjIwLDkgQEAKICAgICAtIGoxMV9qdm1fZHRlc3RzX3Zub2RlOgogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKICAgICAtIGoxMV9jcWxzaGxpYl90ZXN0czoKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgIC0gajExX2J1aWxkCkBAIC0xMDIyMiw2ICsxMDcwMSwxMiBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb24KICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAogICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzczoKICAgICAgICAgdHlwZTogYXBwcm92YWwKICAgICAtIGoxMV91dGVzdHNfc3RyZXNzOgpkaWZmIC0tZ2l0IGEvLmNpcmNsZWNpL2NvbmZpZy55bWwuUEFJRCBiLy5jaXJjbGVjaS9jb25maWcueW1sLlBBSUQKaW5kZXggMzExOGYzNy4uZTcwMTc0ZCAxMDA2NDQKLS0tIGEvLmNpcmNsZWNpL2NvbmZpZy55bWwuUEFJRAorKysgYi8uY2lyY2xlY2kvY29uZmlnLnltbC5QQUlECkBAIC05NSw4ICs5NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTcyLDcgKzE3MCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19GUUxUT09MfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1mcWx0b29sLXRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgZnFsdG9vbC10ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtMTg2LDggKzE4NCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjUyLDggKzI0OCw2IEBACiAgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzYzLDggKzM1Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTE5LDggKzUxMSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjA2LDggKzU5Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF9sYXJnZV93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzI1LDggKzcxMyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzk5LDggKzc4NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODc2LDcgKzg2MCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTg5MCw4ICs4NzQsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTEwMDEsOCArOTgzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTA0NCw2ICsxMDI0LDk1IEBACiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKICAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CiAgICAgLSBDQVNTQU5EUkFfVVNFX0pESzExOiB0cnVlCisgIGo4X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXRyaWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC10cmllICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUU19DT1VOVDogMjUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICBqOF9qdm1fZHRlc3RzX3Zub2RlOgogICAgIGRvY2tlcjoKICAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CkBAIC0xMTIxLDggKzExOTAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTExOTgsNyArMTI2NSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNvbXByZXNzaW9uXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY29tcHJlc3Npb24gJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNvbXByZXNzaW9uXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY29tcHJlc3Npb24gJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTEyMTIsOCArMTI3OSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTMzMSw4ICsxMzk2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0xNDQyLDggKzE1MDUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3Rfajhfd2l0aG91dF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTE1NTIsOCArMTYxMyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTE2MzAsNyArMTY4OSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNvbXByZXNzaW9uXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY29tcHJlc3Npb24gJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNvbXByZXNzaW9uXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY29tcHJlc3Npb24gJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTE2NDQsOCArMTcwMyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMTc2MCw2ICsxODE3LDcgQEAKICAgICAgICAgICAgICAgaWYgW1sgJHRhcmdldCA9PSAidGVzdCIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNkYyIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNvbXByZXNzaW9uIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtdHJpZSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAiZnFsdG9vbC10ZXN0IiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImxvbmctdGVzdCIgfHwgXApAQCAtMTg0MCw4ICsxODk4LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0xOTI3LDggKzE5ODMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yMDYyLDggKzIxMTYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTIxNzMsOCArMjIyNSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjI4Myw4ICsyMzMzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjM3MCw4ICsyNDE4LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjQ0OCw3ICsyNDk0LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC0yNDYyLDggKzI1MDgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTI1NzMsOCArMjYxNyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjY4Myw4ICsyNzI1LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMjc0OSw4ICsyNzg5LDYgQEAKICAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvcHlsaWIKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0yODY4LDggKzI5MDYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTI5NDIsOCArMjk3OCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzA2Miw4ICszMDk2LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zMTk2LDggKzMyMjgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTMzMzAsOCArMzM2MCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzQ2NSw4ICszNDkzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zNTg0LDggKzM2MTAsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTM3MDAsOCArMzcyNCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtMzgxOSw4ICszODQxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0zODkyLDggKzM5MTIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTM5NzAsNyArMzk4OCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC0zOTg0LDggKzQwMDIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTQwNzAsOCArNDA4Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF9sYXJnZV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDExMiw2ICs0MTI2LDEyMCBAQAogICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAogICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKKyAgajExX3NpbXVsYXRvcl9kdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gU2ltdWxhdG9yIFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0LXNpbXVsYXRvci1kdGVzdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMzBtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKICAgajExX3V0ZXN0c19zdHJlc3M6CiAgICAgZG9ja2VyOgogICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKQEAgLTQxNDMsOCArNDI3MSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDI1NCw4ICs0MzgwLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC00Mzg4LDggKzQ1MTIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTQ0NjUsNyArNDU4Nyw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNkY1xudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWNkYyAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY2RjXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY2RjICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC00NDc5LDggKzQ2MDEsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTQ2MzYsOCArNDc1Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNDcxNCw3ICs0ODMyLDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0x9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWZxbHRvb2wtdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBmcWx0b29sLXRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19GUUxUT09MfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1mcWx0b29sLXRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgZnFsdG9vbC10ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC00NzI4LDggKzQ4NDYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTQ4MDUsNyArNDkyMSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9dHJ1ZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz10cnVlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC00ODE5LDggKzQ5MzUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTQ5MzgsOCArNTA1Miw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTA0OSw4ICs1MTYxLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhvdXRfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01MTU5LDggKzUyNjksNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01MjM3LDcgKzUzNDUsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zaW11bGF0b3ItZHRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zaW11bGF0b3ItZHRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXNpbXVsYXRvci1kdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXNpbXVsYXRvci1kdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNTI1MSw4ICs1MzU5LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01MzYxLDggKzU0NjcsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01NDM5LDcgKzU1NDMsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTU0NTMsOCArNTU1Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTQ5NSw2ICs1NTk3LDEyNCBAQAogICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAogICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c190cmllOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXRyaWUpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC10cmllICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDI1CisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gQ0FTU0FORFJBX1VTRV9KREsxMTogdHJ1ZQogICBqMTFfZHRlc3RzX2xhcmdlX3JlcGVhdDoKICAgICBkb2NrZXI6CiAgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdApAQCAtNTU4Nyw4ICs1ODA3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC01NjMwLDYgKzU4NDgsMTIzIEBACiAgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKICAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CiAgICAgLSBDQVNTQU5EUkFfVVNFX0pESzExOiB0cnVlCisgIGo4X3V0ZXN0c190cmllOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXRyaWUpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC10cmllICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDI1CisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgajhfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgogICAgIGRvY2tlcjoKICAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CkBAIC01Njk4LDggKzYwMzMsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTU3NzUsNyArNjEwOCw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTU3ODksOCArNjEyMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNTkyMyw4ICs2MjU0LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MDMzLDggKzYzNjIsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02MDc5LDcgKzY0MDYsNyBAQAogICBqOF91cGdyYWRlX2R0ZXN0czoKICAgICBkb2NrZXI6CiAgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAotICAgIHJlc291cmNlX2NsYXNzOiB4bGFyZ2UKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKICAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KICAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAogICAgIHBhcmFsbGVsaXNtOiAxMDAKQEAgLTYxMjAsOCArNjQ0Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF91cGdyYWRldGVzdHNfd2l0aG91dF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTYyMjgsOCArNjU1Myw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTYzMDYsNyArNjYyOSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTYzMjAsOCArNjY0Myw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjQzMCw4ICs2NzUxLDE4NiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9VUEdSQURFX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VUEdSQURFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDI1CisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gQ0FTU0FORFJBX1VTRV9KREsxMTogdHJ1ZQorICBqMTFfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtdHJpZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXRyaWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX1VQR1JBREVfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fVVBHUkFERV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVBHUkFERV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VQR1JBREVfRFRFU1RTX0NPVU5UOiAyNQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIENBU1NBTkRSQV9VU0VfSkRLMTE6IHRydWUKKyAgajExX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc2ltdWxhdG9yLWR0ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTY1MDgsNyArNzAwNyw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTY1MjIsOCArNzAyMSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjYzMyw4ICs3MTMwLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNjcxMSw3ICs3MjA2LDcgQEAKICAgICAtIHJ1bjoKICAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQotICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0xPTkd9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWxvbmctdGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgbG9uZy10ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0xPTkd9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWxvbmctdGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgbG9uZy10ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNjcyNSw4ICs3MjIwLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC02ODExLDggKzczMDQsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajhfZHRlc3RzX29mZmhlYXBfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTY5MzAsOCArNzQyMSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzA0OSw4ICs3NTM4LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03MTI3LDcgKzc2MTQsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPXRydWVcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9dHJ1ZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtNzE0MSw4ICs3NjI4LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03MjUwLDggKzc3MzUsNiBAQAogICAgICAgICAtIC5tMgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTczMzcsOCArNzgyMCw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qOF93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzQyMyw4ICs3OTA0LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03NDg3LDggKzc5NjYsNiBAQAogICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTc1NjUsNyArODA0Miw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTc1NzksOCArODA1Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzY4Nyw4ICs4MTYyLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtNzgwMyw2ICs4Mjc2LDcgQEAKICAgICAgICAgICAgICAgaWYgW1sgJHRhcmdldCA9PSAidGVzdCIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNkYyIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNvbXByZXNzaW9uIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtdHJpZSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAiZnFsdG9vbC10ZXN0IiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImxvbmctdGVzdCIgfHwgXApAQCAtNzg4Myw4ICs4MzU3LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC03OTU2LDggKzg0MjgsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTgwNzUsOCArODU0NSw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODE4NSw4ICs4NjUzLDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2o4X2R0ZXN0c19vZmZoZWFwX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04MzE5LDggKzg3ODUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTg0MzgsOCArODkwMiw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODU0Niw4ICs5MDA4LDYgQEAKICAgICAgICAgLSAubTIKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04NjU2LDggKzkxMTYsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3Rfajhfd2l0aF92bm9kZXNfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTg3MzMsNyArOTE5MSw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCiAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CiAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CiAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CkBAIC04NzQ3LDggKzkyMDUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTg4MjEsOCArOTI3Nyw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtODg4NSw4ICs5MzM5LDYgQEAKICAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvcHlsaWIKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC04OTkzLDggKzk0NDUsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC05MDcxLDcgKzk1MjEsNyBAQAogICAgIC0gcnVuOgogICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cwogICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCi0gICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1jZGNcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jZGMgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNkY1xudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWNkYyAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgogICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgogICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAogICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgpAQCAtOTA4NSw4ICs5NTM1LDYgQEAKICAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKICAgICBlbnZpcm9ubWVudDoKICAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAotICAgIC0gSkFWQTExX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKLSAgICAtIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIC0gTEFORzogZW5fVVMuVVRGLTgKICAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKICAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC05MjE5LDggKzk2NjcsNiBAQAogICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncwogICAgIGVudmlyb25tZW50OgogICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50Ci0gICAgLSBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIC0gSkFWQThfSE9NRTogL3Vzci9saWIvanZtL2phdmEtOC1vcGVuamRrLWFtZDY0CiAgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAogICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKQEAgLTkyOTYsNyArOTc0Miw3IEBACiAgICAgLSBydW46CiAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCiAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KLSAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19MT05HfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1sb25nLXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGxvbmctdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19MT05HfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1sb25nLXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGxvbmctdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKICAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKICAgICAtIHN0b3JlX2FydGlmYWN0czoKQEAgLTkzMTAsOCArOTc1Niw2IEBACiAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtOTQxNiw4ICs5ODYwLDYgQEAKICAgICAgICAgLSBkdGVzdF9qYXJzCiAgICAgZW52aXJvbm1lbnQ6CiAgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICAtIEpBVkExMV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Ci0gICAgLSBKQVZBOF9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS04LW9wZW5qZGstYW1kNjQKICAgICAtIExBTkc6IGVuX1VTLlVURi04CiAgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCiAgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdApAQCAtOTU2OSw2ICsxMDAxMSwxOCBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NvbXByZXNzaW9uCiAgICAgICAgIC0gajhfYnVpbGQKKyAgICAtIHN0YXJ0X2o4X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajhfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2o4X3V0ZXN0c190cmllCisgICAgICAgIC0gajhfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllCisgICAgICAgIC0gajhfYnVpbGQKICAgICAtIHN0YXJ0X2o4X3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqOF91dGVzdHNfc3RyZXNzOgpAQCAtOTgzMyw2ICsxMDI4NywxNiBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb24KICAgICAgICAgLSBqOF9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqOF91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqOF9idWlsZAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGo4X2J1aWxkCiAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzOgogICAgICAgICB0eXBlOiBhcHByb3ZhbAogICAgIC0gajhfdXRlc3RzX3N0cmVzczoKQEAgLTEwMDEwLDYgKzEwNDc0LDEyIEBACiAgICAgICAgIHJlcXVpcmVzOgogICAgICAgICAtIHN0YXJ0X2oxMV9qdm1fZHRlc3RzX3Zub2RlCiAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0cworICAgICAgICAtIGoxMV9idWlsZAogICAgIC0gc3RhcnRfajExX2NxbHNobGliX3Rlc3RzOgogICAgICAgICB0eXBlOiBhcHByb3ZhbAogICAgIC0gajExX2NxbHNobGliX3Rlc3RzOgpAQCAtMTAxMTAsNiArMTA1ODAsMTIgQEAKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19jb21wcmVzc2lvbgogICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTFfYnVpbGQKICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfc3RyZXNzOgogICAgICAgICB0eXBlOiBhcHByb3ZhbAogICAgIC0gajExX3V0ZXN0c19zdHJlc3M6CkBAIC0xMDE0NCw2ICsxMDYyMCw5IEBACiAgICAgLSBqMTFfanZtX2R0ZXN0c192bm9kZToKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCiAgICAgLSBqMTFfY3Fsc2hsaWJfdGVzdHM6CiAgICAgICAgIHJlcXVpcmVzOgogICAgICAgICAtIGoxMV9idWlsZApAQCAtMTAyMjIsNiArMTA3MDEsMTIgQEAKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uCiAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTFfYnVpbGQKICAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqMTFfdXRlc3RzX3N0cmVzczoKZGlmZiAtLWdpdCBhLy5jaXJjbGVjaS9jb25maWdfMTFfYW5kXzE3LnltbCBiLy5jaXJjbGVjaS9jb25maWdfMTFfYW5kXzE3LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDBlNzdlCi0tLSAvZGV2L251bGwKKysrIGIvLmNpcmNsZWNpL2NvbmZpZ18xMV9hbmRfMTcueW1sCkBAIC0wLDAgKzEsOTU2MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordmVyc2lvbjogMgoram9iczoKKyAgajE3X2R0ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBjcWxzaGxpYiBVbml0IFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGV4cG9ydCBjeXRob249InllcyIKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYS8KKyAgICAgICAgICAuL3B5bGliL2Nhc3NhbmRyYS1jcWxzaC10ZXN0cy5zaCAkKHB3ZCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgorICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcCB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcC50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajE3X2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMScgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExCisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X2R0ZXN0c19vZmZoZWFwLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19kdGVzdHNfb2ZmaGVhcF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2p2bV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPXRydWVcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19mcWx0b29sX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0x9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWZxbHRvb2wtdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBmcWx0b29sLXRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBjcWxzaGxpYiBVbml0IFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGV4cG9ydCBjeXRob249InllcyIKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYS8KKyAgICAgICAgICAuL3B5bGliL2Nhc3NhbmRyYS1jcWxzaC10ZXN0cy5zaCAkKHB3ZCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgorICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QtY29tcHJlc3Npb24pCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1jb21wcmVzc2lvbiAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN193aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiB0cnVlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBQeXRob24gRFRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfRFRFU1RTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBuYW1lIGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICBpZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlbgorICAgICAgICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGlmICgoJGNvdW50IDw9IDApKTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJObyB0ZXN0cyB0byBydW4gaW4gdGhpcyBydW5uZXIiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgJHtSRVBFQVRFRF9EVEVTVFN9ICRjb3VudCB0aW1lcyIKKworICAgICAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisKKyAgICAgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisKKyAgICAgICAgICAgICAgdGVzdHNfYXJnPSQoZWNobyAke1JFUEVBVEVEX0RURVNUU30gfCBzZWQgLWUgInMvLC8gL2ciKQorCisgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9OyB0aGVuCisgICAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iLXgiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgaWYgdHJ1ZTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdXBncmFkZV9hcmc9Ii0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzIC0tdXBncmFkZS10YXJnZXQtdmVyc2lvbi1vbmx5IC0tdXBncmFkZS12ZXJzaW9uLXNlbGVjdGlvbiBhbGwiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0ICR2bm9kZXNfYXJncyAtLWNvdW50PSRjb3VudCAkc3RvcF9vbl9mYWlsdXJlX2FyZyAkdXBncmFkZV9hcmcgLS1sb2ctY2xpLWxldmVsPURFQlVHIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3N0cmVzc19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3VuaXRfdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0ICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMScgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExCisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX3dpdGhvdXRfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0xBUkdFX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiB0cnVlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdXBncmFkZV9hcmc9Ii0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzIC0tdXBncmFkZS10YXJnZXQtdmVyc2lvbi1vbmx5IC0tdXBncmFkZS12ZXJzaW9uLXNlbGVjdGlvbiBhbGwiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0ICR2bm9kZXNfYXJncyAtLWNvdW50PSRjb3VudCAkc3RvcF9vbl9mYWlsdXJlX2FyZyAkdXBncmFkZV9hcmcgLS1sb2ctY2xpLWxldmVsPURFQlVHIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV91bml0X3Rlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzODoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX3N0cmVzc19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNvbXByZXNzaW9uXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY29tcHJlc3Npb24gJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX3JlcGVhdGVkX2FudF90ZXN0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgSlVuaXQgdGVzdAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjbGFzcyBuYW1lIGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgdXRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgdXRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICBpZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0FOVF9URVNUX1RBUkdFVH0gJHtSRVBFQVRFRF9BTlRfVEVTVF9DTEFTU30gJHtSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTfSAke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSB0aW1lcyIKKworICAgICAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHRhcmdldD0ke1JFUEVBVEVEX0FOVF9URVNUX1RBUkdFVH0KKyAgICAgICAgICAgICAgY2xhc3NfcGF0aD0ke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfQorICAgICAgICAgICAgICBjbGFzc19uYW1lPSIke2NsYXNzX3BhdGgjIyoufSIKKworICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LgorICAgICAgICAgICAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LgorICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY2RjIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJmcWx0b29sLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInN0cmVzcy10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc2ltdWxhdG9yLWR0ZXN0IiBdXTsgdGhlbgorICAgICAgICAgICAgICAgIG5hbWU9Ii1EdGVzdC5uYW1lPSRjbGFzc19uYW1lIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmFtZT0iLUR0ZXN0Lm5hbWU9JGNsYXNzX3BhdGgiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwKKyAgICAgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICAgICAgbWV0aG9kcz0iIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWV0aG9kcz0iLUR0ZXN0Lm1ldGhvZHM9JHtSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTfSIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbAorICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX0FOVF9URVNUX1ZOT0RFU307IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2JyIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIFJ1biB0aGUgdGVzdCB0YXJnZXQgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQgY29sbGVjdGluZyB0aGUgZXhpdCBjb2RlLAorICAgICAgICAgICAgICAjIHN0b3BwaW5nIHRoZSBpdGVyYXRpb24gb25seSBpZiBzdG9wX29uX2ZhaWx1cmUgaXMgc2V0LgorICAgICAgICAgICAgICBleGl0X2NvZGU9IiQ/IgorICAgICAgICAgICAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvCisKKyAgICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nIHRlc3QgaXRlcmF0aW9uICRpIG9mICRjb3VudCIKKworICAgICAgICAgICAgICAgICMgcnVuIHRoZSB0ZXN0CisgICAgICAgICAgICAgICAgc3RhdHVzPSJwYXNzZXMiCisgICAgICAgICAgICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIGFudCAkdGFyZ2V0ICRuYW1lICRtZXRob2RzICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IHRlZSBzdGRvdXQudHh0ICk7IHRoZW4KKyAgICAgICAgICAgICAgICAgIHN0YXR1cz0iZmFpbHMiCisgICAgICAgICAgICAgICAgICBleGl0X2NvZGU9MQorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZQorICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L3N0ZG91dC8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke1JFUEVBVEVEX0FOVF9URVNUX1RBUkdFVH0tJHtSRVBFQVRFRF9BTlRfVEVTVF9DTEFTU30udHh0CisKKyAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXMKKyAgICAgICAgICAgICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgICAgICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9vdXRwdXQvJHtzdGF0dXN9LyR7aX0KKyAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gIiQobHMgJHNvdXJjZSkiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzCisgICAgICAgICAgICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncworICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L2xvZ3MvJHtzdGF0dXN9LyR7aX0KKyAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gIiQobHMgJHNvdXJjZSkiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZQorICAgICAgICAgICAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgZG9uZQorCisgICAgICAgICAgICAgIChleGl0ICR7ZXhpdF9jb2RlfSkKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV9sYXJnZV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV9sYXJnZV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX2xhcmdlX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfbGFyZ2Vfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9sYXJnZV93aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0xBUkdFX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiB0cnVlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfdHJpZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXRyaWUpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC10cmllICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV9kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOAorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV9kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfbGFyZ2U6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV9sYXJnZV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfanZtX2R0ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBkaXN0cmlidXRlZCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L2Rpc3RyaWJ1dGVkLyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L2Rpc3RyaWJ1dGVkLzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgfCBncmVwIC12IHVwZ3JhZGUgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QuZGlzdHJpYnV0ZWQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PWRpc3RyaWJ1dGVkIC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfcmVwZWF0ZWRfYW50X3Rlc3Q6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBKVW5pdCB0ZXN0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIHV0ZXN0IGNsYXNzIG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfSAke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfSAke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9ICR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IHRpbWVzIgorCisgICAgICAgICAgICAgIHNldCAteAorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdGFyZ2V0PSR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfQorICAgICAgICAgICAgICBjbGFzc19wYXRoPSR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9CisgICAgICAgICAgICAgIGNsYXNzX25hbWU9IiR7Y2xhc3NfcGF0aCMjKi59IgorCisgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuCisgICAgICAgICAgICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuCisgICAgICAgICAgICAgIGlmIFtbICR0YXJnZXQgPT0gInRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jZGMiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jb21wcmVzc2lvbiIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXRyaWUiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImZxbHRvb2wtdGVzdCIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJsb25nLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAic3RyZXNzLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zaW11bGF0b3ItZHRlc3QiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgbmFtZT0iLUR0ZXN0Lm5hbWU9JGNsYXNzX25hbWUiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuYW1lPSItRHRlc3QubmFtZT0kY2xhc3NfcGF0aCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbAorICAgICAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgICAgICBtZXRob2RzPSIiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZXRob2RzPSItRHRlc3QubWV0aG9kcz0ke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfQU5UX1RFU1RfVk5PREVTfTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgUnVuIHRoZSB0ZXN0IHRhcmdldCBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZCBjb2xsZWN0aW5nIHRoZSBleGl0IGNvZGUsCisgICAgICAgICAgICAgICMgc3RvcHBpbmcgdGhlIGl0ZXJhdGlvbiBvbmx5IGlmIHN0b3Bfb25fZmFpbHVyZSBpcyBzZXQuCisgICAgICAgICAgICAgIGV4aXRfY29kZT0iJD8iCisgICAgICAgICAgICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG8KKworICAgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgdGVzdCBpdGVyYXRpb24gJGkgb2YgJGNvdW50IgorCisgICAgICAgICAgICAgICAgIyBydW4gdGhlIHRlc3QKKyAgICAgICAgICAgICAgICBzdGF0dXM9InBhc3NlcyIKKyAgICAgICAgICAgICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgYW50ICR0YXJnZXQgJG5hbWUgJG1ldGhvZHMgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgdGVlIHN0ZG91dC50eHQgKTsgdGhlbgorICAgICAgICAgICAgICAgICAgc3RhdHVzPSJmYWlscyIKKyAgICAgICAgICAgICAgICAgIGV4aXRfY29kZT0xCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlCisgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgbWtkaXIgLXAgJGRlc3QKKyAgICAgICAgICAgICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfS0ke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfS50eHQKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlcworICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dAorICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L291dHB1dC8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC8KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXMKKyAgICAgICAgICAgICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzCisgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3QvbG9ncy8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC8KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlCisgICAgICAgICAgICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlbgorICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBkb25lCisKKyAgICAgICAgICAgICAgKGV4aXQgJHtleGl0X2NvZGV9KQorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19idWlsZDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tZGVwdGggMSAtLWJyYW5jaCAkQ0lSQ0xFX0JSQU5DSCBodHRwczovL2dpdGh1Yi5jb20vJENJUkNMRV9QUk9KRUNUX1VTRVJOQU1FLyRDSVJDTEVfUFJPSkVDVF9SRVBPTkFNRS5naXQgfi9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQnVpbGQgQ2Fzc2FuZHJhCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhCisgICAgICAgICAgIyBMb29wIHRvIHByZXZlbnQgZmFpbHVyZSBkdWUgdG8gbWF2ZW4tYW50LXRhc2tzIG5vdCBkb3dubG9hZGluZyBhIGphci4uCisgICAgICAgICAgZm9yIHggaW4gJChzZXEgMSAzKTsgZG8KKyAgICAgICAgICAgICAgJHtBTlRfSE9NRX0vYmluL2FudCBjbGVhbiByZWFsY2xlYW4gamFyCisgICAgICAgICAgICAgIFJFVFVSTj0iJD8iCisgICAgICAgICAgICAgIGlmIFsgIiR7UkVUVVJOfSIgLWVxICIwIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKyAgICAgICAgICAjIEV4aXQsIGlmIHdlIGRpZG4ndCBidWlsZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBpZiBbICIke1JFVFVSTn0iIC1uZSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJCdWlsZCBmYWlsZWQgd2l0aCBleGl0IGNvZGU6ICR7UkVUVVJOfSIKKyAgICAgICAgICAgICAgZXhpdCAke1JFVFVSTn0KKyAgICAgICAgICBmaQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBlY2xpcHNlLXdhcm5pbmdzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhCisgICAgICAgICAgYW50IGVjbGlwc2Utd2FybmluZ3MKKyAgICAtIHBlcnNpc3RfdG9fd29ya3NwYWNlOgorICAgICAgICByb290OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgICAgcGF0aHM6CisgICAgICAgIC0gY2Fzc2FuZHJhCisgICAgICAgIC0gLm0yCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19jZGM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC1jZGMpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1jZGMgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfY2RjX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY2RjXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY2RjICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfZnFsdG9vbDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzIChmcWx0b29sLXRlc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCBmcWx0b29sLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfb2ZmaGVhcF9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiB0cnVlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgJHRlc3RzX2FyZyB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfanZtX2R0ZXN0c192bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBkaXN0cmlidXRlZCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L2Rpc3RyaWJ1dGVkLyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L2Rpc3RyaWJ1dGVkLzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgfCBncmVwIC12IHVwZ3JhZGUgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QuZGlzdHJpYnV0ZWQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QgLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2JyAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PWRpc3RyaWJ1dGVkIC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2xvbmc6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAobG9uZy10ZXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgbG9uZy10ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdW5pdF90ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBTaW11bGF0b3IgVGVzdHMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAzMG0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3N0cmVzczoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzIChzdHJlc3MtdGVzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHN0cmVzcy10ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2NkY19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNkY1xudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWNkYyAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LWNvbXByZXNzaW9uKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtY29tcHJlc3Npb24gICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXRyaWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC10cmllICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV9kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV9kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV9kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfdHJpZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXRyaWUpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC10cmllICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX2xhcmdlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1jb21wcmVzc2lvblxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWNvbXByZXNzaW9uICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfZnFsdG9vbDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzIChmcWx0b29sLXRlc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCBmcWx0b29sLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X2xhcmdlX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X2xhcmdlX3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfbGFyZ2Vfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19sYXJnZV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfbGFyZ2Vfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2xhcmdlX3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgbm90IGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcC50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX2R0ZXN0c19vZmZoZWFwLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44CisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC10cmllXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtdHJpZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfc2ltdWxhdG9yX2R0ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXNpbXVsYXRvci1kdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXNpbXVsYXRvci1kdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfanZtX2R0ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gY3Fsc2hsaWIgVW5pdCBUZXN0cworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYS8KKyAgICAgICAgICAuL3B5bGliL2Nhc3NhbmRyYS1jcWxzaC10ZXN0cy5zaCAkKHB3ZCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgorICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMScgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExCisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExJyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9qdm1fZHRlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIGRpc3RyaWJ1dGVkIFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiB8IGdyZXAgLXYgdXBncmFkZSA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC5kaXN0cmlidXRlZC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9ZGlzdHJpYnV0ZWQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfc3RyZXNzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHN0cmVzcy10ZXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgc3RyZXNzLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz10cnVlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9idWlsZDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tZGVwdGggMSAtLWJyYW5jaCAkQ0lSQ0xFX0JSQU5DSCBodHRwczovL2dpdGh1Yi5jb20vJENJUkNMRV9QUk9KRUNUX1VTRVJOQU1FLyRDSVJDTEVfUFJPSkVDVF9SRVBPTkFNRS5naXQgfi9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQnVpbGQgQ2Fzc2FuZHJhCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhCisgICAgICAgICAgIyBMb29wIHRvIHByZXZlbnQgZmFpbHVyZSBkdWUgdG8gbWF2ZW4tYW50LXRhc2tzIG5vdCBkb3dubG9hZGluZyBhIGphci4uCisgICAgICAgICAgZm9yIHggaW4gJChzZXEgMSAzKTsgZG8KKyAgICAgICAgICAgICAgJHtBTlRfSE9NRX0vYmluL2FudCBjbGVhbiByZWFsY2xlYW4gamFyCisgICAgICAgICAgICAgIFJFVFVSTj0iJD8iCisgICAgICAgICAgICAgIGlmIFsgIiR7UkVUVVJOfSIgLWVxICIwIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKyAgICAgICAgICAjIEV4aXQsIGlmIHdlIGRpZG4ndCBidWlsZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBpZiBbICIke1JFVFVSTn0iIC1uZSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJCdWlsZCBmYWlsZWQgd2l0aCBleGl0IGNvZGU6ICR7UkVUVVJOfSIKKyAgICAgICAgICAgICAgZXhpdCAke1JFVFVSTn0KKyAgICAgICAgICBmaQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBlY2xpcHNlLXdhcm5pbmdzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhCisgICAgICAgICAgYW50IGVjbGlwc2Utd2FybmluZ3MKKyAgICAtIHBlcnNpc3RfdG9fd29ya3NwYWNlOgorICAgICAgICByb290OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgICAgcGF0aHM6CisgICAgICAgIC0gY2Fzc2FuZHJhCisgICAgICAgIC0gLm0yCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNobGliX3Rlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGNxbHNobGliIFVuaXQgVGVzdHMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEvCisgICAgICAgICAgLi9weWxpYi9jYXNzYW5kcmEtY3Fsc2gtdGVzdHMuc2ggJChwd2QpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvcHlsaWIKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgZGlzdHJpYnV0ZWQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC9kaXN0cmlidXRlZC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC9kaXN0cmlidXRlZC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiIHwgZ3JlcCAtdiB1cGdyYWRlID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LmRpc3RyaWJ1dGVkLnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0IC1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNicgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD1kaXN0cmlidXRlZCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTM4OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOAorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfY2RjOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QtY2RjKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtY2RjICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2ZxbHRvb2xfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX2xhcmdlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN19sYXJnZV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN19sYXJnZV93aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3VuaXRfdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19sb25nOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKGxvbmctdGVzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IGxvbmctdGVzdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c192bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIG5vdCBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19kdGVzdHNfb2ZmaGVhcF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c19sYXJnZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0xBUkdFX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdXBncmFkZV9hcmc9Ii0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzIC0tdXBncmFkZS10YXJnZXQtdmVyc2lvbi1vbmx5IC0tdXBncmFkZS12ZXJzaW9uLXNlbGVjdGlvbiBhbGwiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0ICR2bm9kZXNfYXJncyAtLWNvdW50PSRjb3VudCAkc3RvcF9vbl9mYWlsdXJlX2FyZyAkdXBncmFkZV9hcmcgLS1sb2ctY2xpLWxldmVsPURFQlVHIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyIC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgJHRlc3RzX2FyZyB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2xvbmdfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfTE9OR30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9bG9uZy10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBsb25nLXRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfbG9uZ19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19MT05HfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1sb25nLXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGxvbmctdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKK3dvcmtmbG93czoKKyAgdmVyc2lvbjogMgorICBqYXZhMTFfc2VwYXJhdGVfdGVzdHM6CisgICAgam9iczoKKyAgICAtIHN0YXJ0X2oxMV9idWlsZDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9idWlsZDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdW5pdF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdW5pdF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9qdm1fZHRlc3RzX3Zub2RlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHNfdm5vZGUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3NpbXVsYXRvcl9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaGxpYl90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaGxpYl9jeXRob25fdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNobGliX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNobGliX2N5dGhvbl90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3VuaXRfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3VuaXRfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfbG9uZzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19sb25nCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfbG9uZworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19jZGMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfY2RjOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfY2RjCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19zdHJlc3MKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3RyZXNzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3RyZXNzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfZnFsdG9vbAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX3Zub2RlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX3Zub2RlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlX3Zub2RlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgIGphdmExMV9wcmUtY29tbWl0X3Rlc3RzOgorICAgIGpvYnM6CisgICAgLSBzdGFydF9wcmUtY29tbWl0X3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2J1aWxkOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9wcmUtY29tbWl0X3Rlc3RzCisgICAgLSBqMTFfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfbG9uZzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2xvbmcKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2xvbmcKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NkYworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jZGMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzcworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3MKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfZnFsdG9vbAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfZnFsdG9vbAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2NxbHNoX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICBqYXZhMTdfc2VwYXJhdGVfdGVzdHM6CisgICAgam9iczoKKyAgICAtIHN0YXJ0X2oxN19idWlsZDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19idWlsZDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdW5pdF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdW5pdF90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl9jeXRob25fdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZV92bm9kZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19sb25nOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19sb25nOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmcKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfY2RjOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfY2RjCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3RyZXNzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3RyZXNzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfZnFsdG9vbAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgamF2YTE3X3ByZS1jb21taXRfdGVzdHM6CisgICAgam9iczoKKyAgICAtIHN0YXJ0X3ByZS1jb21taXRfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfYnVpbGQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3ByZS1jb21taXRfdGVzdHMKKyAgICAtIGoxN191bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19sb25nOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19sb25nOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfbG9uZworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2NkYzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY2RjOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3RyZXNzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeQorICAgICAgICAtIGoxN19idWlsZApkaWZmIC0tZ2l0IGEvLmNpcmNsZWNpL2NvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUgYi8uY2lyY2xlY2kvY29uZmlnXzExX2FuZF8xNy55bWwuRlJFRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDBlNzdlCi0tLSAvZGV2L251bGwKKysrIGIvLmNpcmNsZWNpL2NvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUKQEAgLTAsMCArMSw5NTYxIEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCit2ZXJzaW9uOiAyCitqb2JzOgorICBqMTdfZHRlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIG5vdCBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGNxbHNobGliIFVuaXQgVGVzdHMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgZXhwb3J0IGN5dGhvbj0ieWVzIgorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhLworICAgICAgICAgIC4vcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoICQocHdkKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExJyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfanZtX2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9dHJ1ZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2ZxbHRvb2xfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGNxbHNobGliIFVuaXQgVGVzdHMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgZXhwb3J0IGN5dGhvbj0ieWVzIgorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhLworICAgICAgICAgIC4vcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoICQocHdkKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC1jb21wcmVzc2lvbikKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0LWNvbXByZXNzaW9uICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOAorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAgJHRlc3RzX2FyZyB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBQeXRob24gRFRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfRFRFU1RTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBuYW1lIGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICBpZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlbgorICAgICAgICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGlmICgoJGNvdW50IDw9IDApKTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJObyB0ZXN0cyB0byBydW4gaW4gdGhpcyBydW5uZXIiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgJHtSRVBFQVRFRF9EVEVTVFN9ICRjb3VudCB0aW1lcyIKKworICAgICAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisKKyAgICAgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisKKyAgICAgICAgICAgICAgdGVzdHNfYXJnPSQoZWNobyAke1JFUEVBVEVEX0RURVNUU30gfCBzZWQgLWUgInMvLC8gL2ciKQorCisgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9OyB0aGVuCisgICAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iLXgiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgaWYgdHJ1ZTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdXBncmFkZV9hcmc9Ii0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzIC0tdXBncmFkZS10YXJnZXQtdmVyc2lvbi1vbmx5IC0tdXBncmFkZS12ZXJzaW9uLXNlbGVjdGlvbiBhbGwiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0ICR2bm9kZXNfYXJncyAtLWNvdW50PSRjb3VudCAkc3RvcF9vbl9mYWlsdXJlX2FyZyAkdXBncmFkZV9hcmcgLS1sb2ctY2xpLWxldmVsPURFQlVHIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyIC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiB0cnVlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaF9kdGVzdHNfcHkzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19TVFJFU1N9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXN0cmVzcy10ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgc3RyZXNzLXRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdW5pdF90ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExJyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3VuaXRfdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0ICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajE3X3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMScgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExCisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhvdXRfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTM4OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOAorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19TVFJFU1N9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXN0cmVzcy10ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgc3RyZXNzLXRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfcmVwZWF0ZWRfYW50X3Rlc3Q6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBKVW5pdCB0ZXN0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIHV0ZXN0IGNsYXNzIG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfSAke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfSAke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9ICR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IHRpbWVzIgorCisgICAgICAgICAgICAgIHNldCAteAorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdGFyZ2V0PSR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfQorICAgICAgICAgICAgICBjbGFzc19wYXRoPSR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9CisgICAgICAgICAgICAgIGNsYXNzX25hbWU9IiR7Y2xhc3NfcGF0aCMjKi59IgorCisgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuCisgICAgICAgICAgICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuCisgICAgICAgICAgICAgIGlmIFtbICR0YXJnZXQgPT0gInRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jZGMiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jb21wcmVzc2lvbiIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXRyaWUiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImZxbHRvb2wtdGVzdCIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJsb25nLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAic3RyZXNzLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zaW11bGF0b3ItZHRlc3QiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgbmFtZT0iLUR0ZXN0Lm5hbWU9JGNsYXNzX25hbWUiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuYW1lPSItRHRlc3QubmFtZT0kY2xhc3NfcGF0aCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbAorICAgICAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgICAgICBtZXRob2RzPSIiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZXRob2RzPSItRHRlc3QubWV0aG9kcz0ke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfQU5UX1RFU1RfVk5PREVTfTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgUnVuIHRoZSB0ZXN0IHRhcmdldCBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZCBjb2xsZWN0aW5nIHRoZSBleGl0IGNvZGUsCisgICAgICAgICAgICAgICMgc3RvcHBpbmcgdGhlIGl0ZXJhdGlvbiBvbmx5IGlmIHN0b3Bfb25fZmFpbHVyZSBpcyBzZXQuCisgICAgICAgICAgICAgIGV4aXRfY29kZT0iJD8iCisgICAgICAgICAgICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG8KKworICAgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgdGVzdCBpdGVyYXRpb24gJGkgb2YgJGNvdW50IgorCisgICAgICAgICAgICAgICAgIyBydW4gdGhlIHRlc3QKKyAgICAgICAgICAgICAgICBzdGF0dXM9InBhc3NlcyIKKyAgICAgICAgICAgICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgYW50ICR0YXJnZXQgJG5hbWUgJG1ldGhvZHMgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgdGVlIHN0ZG91dC50eHQgKTsgdGhlbgorICAgICAgICAgICAgICAgICAgc3RhdHVzPSJmYWlscyIKKyAgICAgICAgICAgICAgICAgIGV4aXRfY29kZT0xCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlCisgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgbWtkaXIgLXAgJGRlc3QKKyAgICAgICAgICAgICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfS0ke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfS50eHQKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlcworICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dAorICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L291dHB1dC8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC8KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXMKKyAgICAgICAgICAgICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzCisgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3QvbG9ncy8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC8KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlCisgICAgICAgICAgICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlbgorICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBkb25lCisKKyAgICAgICAgICAgICAgKGV4aXQgJHtleGl0X2NvZGV9KQorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX2xhcmdlX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX2xhcmdlX3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfbGFyZ2Vfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV9sYXJnZV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfbGFyZ2Vfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c190cmllOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QtdHJpZSkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0LXRyaWUgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV9kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV9kdGVzdHNfb2ZmaGVhcCkqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcC50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44CisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX2R0ZXN0c19vZmZoZWFwLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c19sYXJnZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9sYXJnZV93aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19qdm1fZHRlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIGRpc3RyaWJ1dGVkIFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiB8IGdyZXAgLXYgdXBncmFkZSA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC5kaXN0cmlidXRlZC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9ZGlzdHJpYnV0ZWQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19yZXBlYXRlZF9hbnRfdGVzdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIEpVbml0IHRlc3QKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9BTlRfVEVTVF9DTEFTU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgdXRlc3QgY2xhc3MgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIHV0ZXN0IGNvdW50IGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIHV0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlbgorICAgICAgICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGlmICgoJGNvdW50IDw9IDApKTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJObyB0ZXN0cyB0byBydW4gaW4gdGhpcyBydW5uZXIiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgJHtSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVR9ICR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9ICR7UkVQRUFURURfQU5UX1RFU1RfTUVUSE9EU30gJHtSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVH0gdGltZXMiCisKKyAgICAgICAgICAgICAgc2V0IC14CisgICAgICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB0YXJnZXQ9JHtSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVR9CisgICAgICAgICAgICAgIGNsYXNzX3BhdGg9JHtSRVBFQVRFRF9BTlRfVEVTVF9DTEFTU30KKyAgICAgICAgICAgICAgY2xhc3NfbmFtZT0iJHtjbGFzc19wYXRoIyMqLn0iCisKKyAgICAgICAgICAgICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC4KKyAgICAgICAgICAgICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC4KKyAgICAgICAgICAgICAgaWYgW1sgJHRhcmdldCA9PSAidGVzdCIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNkYyIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNvbXByZXNzaW9uIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtdHJpZSIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAiZnFsdG9vbC10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImxvbmctdGVzdCIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJzdHJlc3MtdGVzdCIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXNpbXVsYXRvci1kdGVzdCIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICBuYW1lPSItRHRlc3QubmFtZT0kY2xhc3NfbmFtZSIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG5hbWU9Ii1EdGVzdC5uYW1lPSRjbGFzc19wYXRoIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsCisgICAgICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfTUVUSE9EU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgICAgIG1ldGhvZHM9IiIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1ldGhvZHM9Ii1EdGVzdC5tZXRob2RzPSR7UkVQRUFURURfQU5UX1RFU1RfTUVUSE9EU30iCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwKKyAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgaWYgJHtSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVN9OyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNiciCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyBSdW4gdGhlIHRlc3QgdGFyZ2V0IGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkIGNvbGxlY3RpbmcgdGhlIGV4aXQgY29kZSwKKyAgICAgICAgICAgICAgIyBzdG9wcGluZyB0aGUgaXRlcmF0aW9uIG9ubHkgaWYgc3RvcF9vbl9mYWlsdXJlIGlzIHNldC4KKyAgICAgICAgICAgICAgZXhpdF9jb2RlPSIkPyIKKyAgICAgICAgICAgICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkbworCisgICAgICAgICAgICAgICAgZWNobyAiUnVubmluZyB0ZXN0IGl0ZXJhdGlvbiAkaSBvZiAkY291bnQiCisKKyAgICAgICAgICAgICAgICAjIHJ1biB0aGUgdGVzdAorICAgICAgICAgICAgICAgIHN0YXR1cz0icGFzc2VzIgorICAgICAgICAgICAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBhbnQgJHRhcmdldCAkbmFtZSAkbWV0aG9kcyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCB0ZWUgc3Rkb3V0LnR4dCApOyB0aGVuCisgICAgICAgICAgICAgICAgICBzdGF0dXM9ImZhaWxzIgorICAgICAgICAgICAgICAgICAgZXhpdF9jb2RlPTEKKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGUKKyAgICAgICAgICAgICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9zdGRvdXQvJHtzdGF0dXN9LyR7aX0KKyAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHtSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVR9LSR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9LnR4dAorCisgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzCisgICAgICAgICAgICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0LyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgbWtkaXIgLXAgJGRlc3QKKyAgICAgICAgICAgICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uICIkKGxzICRzb3VyY2UpIiBdXTsgdGhlbgorICAgICAgICAgICAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0LworICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlcworICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgICAgICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9sb2dzLyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgbWtkaXIgLXAgJGRlc3QKKyAgICAgICAgICAgICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uICIkKGxzICRzb3VyY2UpIiBdXTsgdGhlbgorICAgICAgICAgICAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0LworICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmUKKyAgICAgICAgICAgICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuCisgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgIGRvbmUKKworICAgICAgICAgICAgICAoZXhpdCAke2V4aXRfY29kZX0pCisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42CisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX3dpdGhvdXRfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2J1aWxkOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1kZXB0aCAxIC0tYnJhbmNoICRDSVJDTEVfQlJBTkNIIGh0dHBzOi8vZ2l0aHViLmNvbS8kQ0lSQ0xFX1BST0pFQ1RfVVNFUk5BTUUvJENJUkNMRV9QUk9KRUNUX1JFUE9OQU1FLmdpdCB+L2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBCdWlsZCBDYXNzYW5kcmEKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEKKyAgICAgICAgICAjIExvb3AgdG8gcHJldmVudCBmYWlsdXJlIGR1ZSB0byBtYXZlbi1hbnQtdGFza3Mgbm90IGRvd25sb2FkaW5nIGEgamFyLi4KKyAgICAgICAgICBmb3IgeCBpbiAkKHNlcSAxIDMpOyBkbworICAgICAgICAgICAgICAke0FOVF9IT01FfS9iaW4vYW50IGNsZWFuIHJlYWxjbGVhbiBqYXIKKyAgICAgICAgICAgICAgUkVUVVJOPSIkPyIKKyAgICAgICAgICAgICAgaWYgWyAiJHtSRVRVUk59IiAtZXEgIjAiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgZG9uZQorICAgICAgICAgICMgRXhpdCwgaWYgd2UgZGlkbid0IGJ1aWxkIHN1Y2Nlc3NmdWxseQorICAgICAgICAgIGlmIFsgIiR7UkVUVVJOfSIgLW5lICIwIiBdOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIkJ1aWxkIGZhaWxlZCB3aXRoIGV4aXQgY29kZTogJHtSRVRVUk59IgorICAgICAgICAgICAgICBleGl0ICR7UkVUVVJOfQorICAgICAgICAgIGZpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGVjbGlwc2Utd2FybmluZ3MKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEKKyAgICAgICAgICBhbnQgZWNsaXBzZS13YXJuaW5ncworICAgIC0gcGVyc2lzdF90b193b3Jrc3BhY2U6CisgICAgICAgIHJvb3Q6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgICBwYXRoczoKKyAgICAgICAgLSBjYXNzYW5kcmEKKyAgICAgICAgLSAubTIKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2NkYzoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LWNkYykKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0LWNkYyAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19jZGNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1jZGNcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jZGMgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19mcWx0b29sOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKGZxbHRvb2wtdGVzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9qdm1fZHRlc3RzX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIGRpc3RyaWJ1dGVkIFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiB8IGdyZXAgLXYgdXBncmFkZSA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC5kaXN0cmlidXRlZC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAtRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9ZGlzdHJpYnV0ZWQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfbG9uZzoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzIChsb25nLXRlc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCBsb25nLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191bml0X3Rlc3RzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFNpbXVsYXRvciBUZXN0cworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdC1zaW11bGF0b3ItZHRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDMwbQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfc3RyZXNzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHN0cmVzcy10ZXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgc3RyZXNzLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfY2RjX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY2RjXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY2RjICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIG5vdCBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBQeXRob24gRFRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfRFRFU1RTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBuYW1lIGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICBpZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlbgorICAgICAgICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGlmICgoJGNvdW50IDw9IDApKTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJObyB0ZXN0cyB0byBydW4gaW4gdGhpcyBydW5uZXIiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgJHtSRVBFQVRFRF9EVEVTVFN9ICRjb3VudCB0aW1lcyIKKworICAgICAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisKKyAgICAgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisKKyAgICAgICAgICAgICAgdGVzdHNfYXJnPSQoZWNobyAke1JFUEVBVEVEX0RURVNUU30gfCBzZWQgLWUgInMvLC8gL2ciKQorCisgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9OyB0aGVuCisgICAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iLXgiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAgJHRlc3RzX2FyZyB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QtY29tcHJlc3Npb24pCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1jb21wcmVzc2lvbiAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtdHJpZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LXRyaWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV9kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV9kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV9kdGVzdHNfb2ZmaGVhcCkqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcC50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMScgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExCisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX2R0ZXN0c19vZmZoZWFwLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c190cmllOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QtdHJpZSkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0LXRyaWUgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfbGFyZ2VfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBQeXRob24gRFRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBuYW1lIGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICBpZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlbgorICAgICAgICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGlmICgoJGNvdW50IDw9IDApKTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJObyB0ZXN0cyB0byBydW4gaW4gdGhpcyBydW5uZXIiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9ICRjb3VudCB0aW1lcyIKKworICAgICAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisKKyAgICAgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisKKyAgICAgICAgICAgICAgdGVzdHNfYXJnPSQoZWNobyAke1JFUEVBVEVEX0xBUkdFX0RURVNUU30gfCBzZWQgLWUgInMvLC8gL2ciKQorCisgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9OyB0aGVuCisgICAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iLXgiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNvbXByZXNzaW9uXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY29tcHJlc3Npb24gJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19mcWx0b29sOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKGZxbHRvb2wtdGVzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfbGFyZ2Vfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfbGFyZ2Vfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19sYXJnZV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X2xhcmdlX3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19sYXJnZV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXRyaWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC10cmllICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9zaW11bGF0b3JfZHRlc3RzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Qtc2ltdWxhdG9yLWR0ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOAorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBjcWxzaGxpYiBVbml0IFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhLworICAgICAgICAgIC4vcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoICQocHdkKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExJyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42CisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2p2bV9kdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgZGlzdHJpYnV0ZWQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC9kaXN0cmlidXRlZC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC9kaXN0cmlidXRlZC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiIHwgZ3JlcCAtdiB1cGdyYWRlID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LmRpc3RyaWJ1dGVkLnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0ICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD1kaXN0cmlidXRlZCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19zdHJlc3M6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAoc3RyZXNzLXRlc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCBzdHJlc3MtdGVzdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2p2bV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPXRydWVcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWp2bS1kdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtanZtLWR0ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2J1aWxkOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1kZXB0aCAxIC0tYnJhbmNoICRDSVJDTEVfQlJBTkNIIGh0dHBzOi8vZ2l0aHViLmNvbS8kQ0lSQ0xFX1BST0pFQ1RfVVNFUk5BTUUvJENJUkNMRV9QUk9KRUNUX1JFUE9OQU1FLmdpdCB+L2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBCdWlsZCBDYXNzYW5kcmEKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEKKyAgICAgICAgICAjIExvb3AgdG8gcHJldmVudCBmYWlsdXJlIGR1ZSB0byBtYXZlbi1hbnQtdGFza3Mgbm90IGRvd25sb2FkaW5nIGEgamFyLi4KKyAgICAgICAgICBmb3IgeCBpbiAkKHNlcSAxIDMpOyBkbworICAgICAgICAgICAgICAke0FOVF9IT01FfS9iaW4vYW50IGNsZWFuIHJlYWxjbGVhbiBqYXIKKyAgICAgICAgICAgICAgUkVUVVJOPSIkPyIKKyAgICAgICAgICAgICAgaWYgWyAiJHtSRVRVUk59IiAtZXEgIjAiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgZG9uZQorICAgICAgICAgICMgRXhpdCwgaWYgd2UgZGlkbid0IGJ1aWxkIHN1Y2Nlc3NmdWxseQorICAgICAgICAgIGlmIFsgIiR7UkVUVVJOfSIgLW5lICIwIiBdOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIkJ1aWxkIGZhaWxlZCB3aXRoIGV4aXQgY29kZTogJHtSRVRVUk59IgorICAgICAgICAgICAgICBleGl0ICR7UkVUVVJOfQorICAgICAgICAgIGZpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGVjbGlwc2Utd2FybmluZ3MKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEKKyAgICAgICAgICBhbnQgZWNsaXBzZS13YXJuaW5ncworICAgIC0gcGVyc2lzdF90b193b3Jrc3BhY2U6CisgICAgICAgIHJvb3Q6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgICBwYXRoczoKKyAgICAgICAgLSBjYXNzYW5kcmEKKyAgICAgICAgLSAubTIKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfY3Fsc2hsaWJfdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gY3Fsc2hsaWIgVW5pdCBUZXN0cworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYS8KKyAgICAgICAgICAuL3B5bGliL2Nhc3NhbmRyYS1jcWxzaC10ZXN0cy5zaCAkKHB3ZCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgorICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIG5vdCBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBkaXN0cmlidXRlZCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L2Rpc3RyaWJ1dGVkLyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L2Rpc3RyaWJ1dGVkLzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgfCBncmVwIC12IHVwZ3JhZGUgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QuZGlzdHJpYnV0ZWQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QgLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2JyAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PWRpc3RyaWJ1dGVkIC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajE3X3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44CisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhvdXRfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19jZGM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC1jZGMpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1jZGMgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19GUUxUT09MfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1mcWx0b29sLXRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgZnFsdG9vbC10ZXN0ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19sYXJnZV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19sYXJnZV93aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfdW5pdF90ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2xvbmc6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAobG9uZy10ZXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgbG9uZy10ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgbm90IGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2p2bV9kdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIG5vdCBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX2xhcmdlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfbG9uZ19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU19MT05HfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1sb25nLXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGxvbmctdGVzdHNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19sb25nX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0xPTkd9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWxvbmctdGVzdHNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgbG9uZy10ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAord29ya2Zsb3dzOgorICB2ZXJzaW9uOiAyCisgIGphdmExMV9zZXBhcmF0ZV90ZXN0czoKKyAgICBqb2JzOgorICAgIC0gc3RhcnRfajExX2J1aWxkOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2J1aWxkOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91bml0X3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91bml0X3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHNfdm5vZGUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c192bm9kZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3NpbXVsYXRvcl9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3NpbXVsYXRvcl9kdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNobGliX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNobGliX2N5dGhvbl90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNobGliX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdW5pdF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdW5pdF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19sb25nOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19sb25nOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX2xvbmcKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfbG9uZzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19sb25nCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NkYzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfY2RjOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NkYworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jZGMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c190cmllCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfc3RyZXNzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3N0cmVzcworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zdHJlc3MKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19mcWx0b29sCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfZnFsdG9vbAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfdm5vZGUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfdm5vZGUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19sYXJnZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2Vfdm5vZGUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZV92bm9kZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgamF2YTExX3ByZS1jb21taXRfdGVzdHM6CisgICAgam9iczoKKyAgICAtIHN0YXJ0X3ByZS1jb21taXRfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfYnVpbGQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3ByZS1jb21taXRfdGVzdHMKKyAgICAtIGoxMV91bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19sb25nOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19sb25nOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfbG9uZworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19sb25nOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfbG9uZworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2NkYzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfY2RjOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NkYworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfc3RyZXNzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzcworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfY3Fsc2hfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgIGphdmExN19zZXBhcmF0ZV90ZXN0czoKKyAgICBqb2JzOgorICAgIC0gc3RhcnRfajE3X2J1aWxkOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2J1aWxkOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHNfdm5vZGUKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNobGliX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNobGliX2N5dGhvbl90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX3Zub2RlCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3Zub2RlCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfbG9uZworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jZGMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfdHJpZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zdHJlc3MKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeQorICAgICAgICAtIGoxN19idWlsZAorICBqYXZhMTdfcHJlLWNvbW1pdF90ZXN0czoKKyAgICBqb2JzOgorICAgIC0gc3RhcnRfcHJlLWNvbW1pdF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19idWlsZDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfcHJlLWNvbW1pdF90ZXN0cworICAgIC0gajE3X3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19sb25nCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfY2RjOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jZGMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3MKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfZnFsdG9vbAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5CisgICAgICAgIC0gajE3X2J1aWxkCmRpZmYgLS1naXQgYS8uY2lyY2xlY2kvY29uZmlnXzExX2FuZF8xNy55bWwuUEFJRCBiLy5jaXJjbGVjaS9jb25maWdfMTFfYW5kXzE3LnltbC5QQUlECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDk1OGIKLS0tIC9kZXYvbnVsbAorKysgYi8uY2lyY2xlY2kvY29uZmlnXzExX2FuZF8xNy55bWwuUEFJRApAQCAtMCwwICsxLDk1NjEgQEAKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK3ZlcnNpb246IDIKK2pvYnM6CisgIGoxN19kdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgbm90IGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajE3X3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhvdXRfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gY3Fsc2hsaWIgVW5pdCBUZXN0cworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBleHBvcnQgY3l0aG9uPSJ5ZXMiCisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEvCisgICAgICAgICAgLi9weWxpYi9jYXNzYW5kcmEtY3Fsc2gtdGVzdHMuc2ggJChwd2QpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvcHlsaWIKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9dHJ1ZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2ZxbHRvb2xfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX0ZRTFRPT0x9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PWZxbHRvb2wtdGVzdFxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBmcWx0b29sLXRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBjcWxzaGxpYiBVbml0IFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGV4cG9ydCBjeXRob249InllcyIKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYS8KKyAgICAgICAgICAuL3B5bGliL2Nhc3NhbmRyYS1jcWxzaC10ZXN0cy5zaCAkKHB3ZCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9weWxpYgorICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzICh0ZXN0Y2xhc3NsaXN0LWNvbXByZXNzaW9uKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtY29tcHJlc3Npb24gICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHQKKworICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44CisgICAgICAgICAgZmkKKworICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKyAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0YAorICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBQeXRob24gRFRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfRFRFU1RTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBuYW1lIGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICBpZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlbgorICAgICAgICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGlmICgoJGNvdW50IDw9IDApKTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJObyB0ZXN0cyB0byBydW4gaW4gdGhpcyBydW5uZXIiCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgJHtSRVBFQVRFRF9EVEVTVFN9ICRjb3VudCB0aW1lcyIKKworICAgICAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisKKyAgICAgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgICAgICBjZCB+L2Nhc3NhbmRyYS1kdGVzdAorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgICAgIGVjaG8gIioqIGRvbmUgZW52IgorICAgICAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisKKyAgICAgICAgICAgICAgdGVzdHNfYXJnPSQoZWNobyAke1JFUEVBVEVEX0RURVNUU30gfCBzZWQgLWUgInMvLC8gL2ciKQorCisgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9OyB0aGVuCisgICAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iLXgiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgaWYgdHJ1ZTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdXBncmFkZV9hcmc9Ii0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzIC0tdXBncmFkZS10YXJnZXQtdmVyc2lvbi1vbmx5IC0tdXBncmFkZS12ZXJzaW9uLXNlbGVjdGlvbiBhbGwiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0ICR2bm9kZXNfYXJncyAtLWNvdW50PSRjb3VudCAkc3RvcF9vbl9mYWlsdXJlX2FyZyAkdXBncmFkZV9hcmcgLS1sb2ctY2xpLWxldmVsPURFQlVHIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfb2ZmaGVhcF9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiB0cnVlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgJHRlc3RzX2FyZyB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAgJHRlc3RzX2FyZyB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC51bml0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nIHx8IHRydWUpCisgICAgICAgICAgaWYgWyAteiAiJHRlc3RfdGltZW91dCIgXTsgdGhlbgorICAgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JykKKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCB0ZXN0Y2xhc3NsaXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaF9kdGVzdHNfcHkzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNTAKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD1zdHJlc3MtdGVzdC1zb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHN0cmVzcy10ZXN0LXNvbWUgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3VuaXRfdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExJyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICBmaQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3VuaXRfdGVzdHM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzODoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX3N0cmVzc19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTX1NUUkVTU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9c3RyZXNzLXRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBzdHJlc3MtdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtY29tcHJlc3Npb25cbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jb21wcmVzc2lvbiAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfcmVwZWF0ZWRfYW50X3Rlc3Q6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgSlVuaXQgdGVzdAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjbGFzcyBuYW1lIGhhc24ndCBiZWVuIGRlZmluZWQsIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsaWYgWyAiJHtSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgdXRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgdXRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICBpZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0FOVF9URVNUX1RBUkdFVH0gJHtSRVBFQVRFRF9BTlRfVEVTVF9DTEFTU30gJHtSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTfSAke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSB0aW1lcyIKKworICAgICAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHRhcmdldD0ke1JFUEVBVEVEX0FOVF9URVNUX1RBUkdFVH0KKyAgICAgICAgICAgICAgY2xhc3NfcGF0aD0ke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfQorICAgICAgICAgICAgICBjbGFzc19uYW1lPSIke2NsYXNzX3BhdGgjIyoufSIKKworICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LgorICAgICAgICAgICAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LgorICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY2RjIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJmcWx0b29sLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInN0cmVzcy10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc2ltdWxhdG9yLWR0ZXN0IiBdXTsgdGhlbgorICAgICAgICAgICAgICAgIG5hbWU9Ii1EdGVzdC5uYW1lPSRjbGFzc19uYW1lIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmFtZT0iLUR0ZXN0Lm5hbWU9JGNsYXNzX3BhdGgiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwKKyAgICAgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICAgICAgbWV0aG9kcz0iIgorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWV0aG9kcz0iLUR0ZXN0Lm1ldGhvZHM9JHtSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTfSIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbAorICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX0FOVF9URVNUX1ZOT0RFU307IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2JyIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIFJ1biB0aGUgdGVzdCB0YXJnZXQgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQgY29sbGVjdGluZyB0aGUgZXhpdCBjb2RlLAorICAgICAgICAgICAgICAjIHN0b3BwaW5nIHRoZSBpdGVyYXRpb24gb25seSBpZiBzdG9wX29uX2ZhaWx1cmUgaXMgc2V0LgorICAgICAgICAgICAgICBleGl0X2NvZGU9IiQ/IgorICAgICAgICAgICAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvCisKKyAgICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nIHRlc3QgaXRlcmF0aW9uICRpIG9mICRjb3VudCIKKworICAgICAgICAgICAgICAgICMgcnVuIHRoZSB0ZXN0CisgICAgICAgICAgICAgICAgc3RhdHVzPSJwYXNzZXMiCisgICAgICAgICAgICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIGFudCAkdGFyZ2V0ICRuYW1lICRtZXRob2RzICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IHRlZSBzdGRvdXQudHh0ICk7IHRoZW4KKyAgICAgICAgICAgICAgICAgIHN0YXR1cz0iZmFpbHMiCisgICAgICAgICAgICAgICAgICBleGl0X2NvZGU9MQorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZQorICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L3N0ZG91dC8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke1JFUEVBVEVEX0FOVF9URVNUX1RBUkdFVH0tJHtSRVBFQVRFRF9BTlRfVEVTVF9DTEFTU30udHh0CisKKyAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXMKKyAgICAgICAgICAgICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgICAgICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9vdXRwdXQvJHtzdGF0dXN9LyR7aX0KKyAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gIiQobHMgJHNvdXJjZSkiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzCisgICAgICAgICAgICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncworICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L2xvZ3MvJHtzdGF0dXN9LyR7aX0KKyAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gIiQobHMgJHNvdXJjZSkiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZQorICAgICAgICAgICAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW4KKyAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgICAgZG9uZQorCisgICAgICAgICAgICAgIChleGl0ICR7ZXhpdF9jb2RlfSkKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IHhsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV9sYXJnZV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV9sYXJnZV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX2xhcmdlX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfbGFyZ2Vfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9sYXJnZV93aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0xBUkdFX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiB0cnVlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfdHJpZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC10cmllKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtdHJpZSAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuOC9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfZHRlc3RzX2xhcmdlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IHhsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV9sYXJnZV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV9sYXJnZV93aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfbGFyZ2Vfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9sYXJnZV93aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19qdm1fZHRlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMTAKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIGRpc3RyaWJ1dGVkIFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiB8IGdyZXAgLXYgdXBncmFkZSA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC5kaXN0cmlidXRlZC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9ZGlzdHJpYnV0ZWQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19yZXBlYXRlZF9hbnRfdGVzdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBKVW5pdCB0ZXN0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIHV0ZXN0IGNsYXNzIG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjb3VudCBpcyBsZXNzZXIgb3IgZXF1YWxzIHRoYW4gemVybywgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxzZQorCisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgIyBTaW5jZSB3ZSBhcmUgcnVubmluZyB0aGUgc2FtZSB0ZXN0IG11bHRpcGxlIHRpbWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGBjaXJjbGVjaSB0ZXN0cyBzcGxpdGAuCisgICAgICAgICAgICBjb3VudD0kKCgke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfSAke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfSAke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9ICR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9IHRpbWVzIgorCisgICAgICAgICAgICAgIHNldCAteAorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdGFyZ2V0PSR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfQorICAgICAgICAgICAgICBjbGFzc19wYXRoPSR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9CisgICAgICAgICAgICAgIGNsYXNzX25hbWU9IiR7Y2xhc3NfcGF0aCMjKi59IgorCisgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuCisgICAgICAgICAgICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuCisgICAgICAgICAgICAgIGlmIFtbICR0YXJnZXQgPT0gInRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jZGMiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jb21wcmVzc2lvbiIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXRyaWUiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImZxbHRvb2wtdGVzdCIgfHwgXAorICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJsb25nLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAic3RyZXNzLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zaW11bGF0b3ItZHRlc3QiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgbmFtZT0iLUR0ZXN0Lm5hbWU9JGNsYXNzX25hbWUiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuYW1lPSItRHRlc3QubmFtZT0kY2xhc3NfcGF0aCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbAorICAgICAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgICAgICBtZXRob2RzPSIiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZXRob2RzPSItRHRlc3QubWV0aG9kcz0ke1JFUEVBVEVEX0FOVF9URVNUX01FVEhPRFN9IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfQU5UX1RFU1RfVk5PREVTfTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgUnVuIHRoZSB0ZXN0IHRhcmdldCBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZCBjb2xsZWN0aW5nIHRoZSBleGl0IGNvZGUsCisgICAgICAgICAgICAgICMgc3RvcHBpbmcgdGhlIGl0ZXJhdGlvbiBvbmx5IGlmIHN0b3Bfb25fZmFpbHVyZSBpcyBzZXQuCisgICAgICAgICAgICAgIGV4aXRfY29kZT0iJD8iCisgICAgICAgICAgICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG8KKworICAgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgdGVzdCBpdGVyYXRpb24gJGkgb2YgJGNvdW50IgorCisgICAgICAgICAgICAgICAgIyBydW4gdGhlIHRlc3QKKyAgICAgICAgICAgICAgICBzdGF0dXM9InBhc3NlcyIKKyAgICAgICAgICAgICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgYW50ICR0YXJnZXQgJG5hbWUgJG1ldGhvZHMgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgdGVlIHN0ZG91dC50eHQgKTsgdGhlbgorICAgICAgICAgICAgICAgICAgc3RhdHVzPSJmYWlscyIKKyAgICAgICAgICAgICAgICAgIGV4aXRfY29kZT0xCisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlCisgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgbWtkaXIgLXAgJGRlc3QKKyAgICAgICAgICAgICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfS0ke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfS50eHQKKworICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlcworICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dAorICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L291dHB1dC8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC8KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXMKKyAgICAgICAgICAgICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzCisgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3QvbG9ncy8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC8KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlCisgICAgICAgICAgICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlbgorICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICBkb25lCisKKyAgICAgICAgICAgICAgKGV4aXQgJHtleGl0X2NvZGV9KQorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNTAKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRob3V0X3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19idWlsZDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tZGVwdGggMSAtLWJyYW5jaCAkQ0lSQ0xFX0JSQU5DSCBodHRwczovL2dpdGh1Yi5jb20vJENJUkNMRV9QUk9KRUNUX1VTRVJOQU1FLyRDSVJDTEVfUFJPSkVDVF9SRVBPTkFNRS5naXQgfi9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQnVpbGQgQ2Fzc2FuZHJhCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhCisgICAgICAgICAgIyBMb29wIHRvIHByZXZlbnQgZmFpbHVyZSBkdWUgdG8gbWF2ZW4tYW50LXRhc2tzIG5vdCBkb3dubG9hZGluZyBhIGphci4uCisgICAgICAgICAgZm9yIHggaW4gJChzZXEgMSAzKTsgZG8KKyAgICAgICAgICAgICAgJHtBTlRfSE9NRX0vYmluL2FudCBjbGVhbiByZWFsY2xlYW4gamFyCisgICAgICAgICAgICAgIFJFVFVSTj0iJD8iCisgICAgICAgICAgICAgIGlmIFsgIiR7UkVUVVJOfSIgLWVxICIwIiBdOyB0aGVuCisgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKyAgICAgICAgICAjIEV4aXQsIGlmIHdlIGRpZG4ndCBidWlsZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgICBpZiBbICIke1JFVFVSTn0iIC1uZSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJCdWlsZCBmYWlsZWQgd2l0aCBleGl0IGNvZGU6ICR7UkVUVVJOfSIKKyAgICAgICAgICAgICAgZXhpdCAke1JFVFVSTn0KKyAgICAgICAgICBmaQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBlY2xpcHNlLXdhcm5pbmdzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhCisgICAgICAgICAgYW50IGVjbGlwc2Utd2FybmluZ3MKKyAgICAtIHBlcnNpc3RfdG9fd29ya3NwYWNlOgorICAgICAgICByb290OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgICAgcGF0aHM6CisgICAgICAgIC0gY2Fzc2FuZHJhCisgICAgICAgIC0gLm0yCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19jZGM6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QtY2RjKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtY2RjICAgLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD11bml0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2NkY19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1jZGNcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jZGMgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3V0ZXN0c19mcWx0b29sOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKGZxbHRvb2wtdGVzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIHRydWU7IHRoZW4KKyAgICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9qdm1fZHRlc3RzX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMTAKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIGRpc3RyaWJ1dGVkIFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiB8IGdyZXAgLXYgdXBncmFkZSA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC5kaXN0cmlidXRlZC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAtRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9ZGlzdHJpYnV0ZWQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfbG9uZzoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzIChsb25nLXRlc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCBsb25nLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191bml0X3Rlc3RzX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0c29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSB1bml0IFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvdW5pdC8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC91bml0Lzs7ZyIgfCBncmVwICJUZXN0XC5qYXZhJCIgID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBTaW11bGF0b3IgVGVzdHMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3Qtc2ltdWxhdG9yLWR0ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAzMG0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX3N0cmVzczoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzIChzdHJlc3MtdGVzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHN0cmVzcy10ZXN0IC1Ebm8tYnVpbGQtdGVzdD10cnVlCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfdXRlc3RzX2NkY19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1jZGNcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1jZGMgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c192bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN193aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgbm90IGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfd2l0aF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdXBncmFkZV9hcmc9Ii0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzIC0tdXBncmFkZS10YXJnZXQtdmVyc2lvbi1vbmx5IC0tdXBncmFkZS12ZXJzaW9uLXNlbGVjdGlvbiBhbGwiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0ICR2bm9kZXNfYXJncyAtLWNvdW50PSRjb3VudCAkc3RvcF9vbl9mYWlsdXJlX2FyZyAkdXBncmFkZV9hcmcgLS1sb2ctY2xpLWxldmVsPURFQlVHIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfY29tcHJlc3Npb246CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIHVuaXQgVGVzdHMgdG8gUnVuCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyCisgICAgICAgICAgIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1bgorICAgICAgICAgICMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLgorCisgICAgICAgICAgcm0gLWZyIH4vY2Fzc2FuZHJhLWR0ZXN0L3VwZ3JhZGVfdGVzdHMKKyAgICAgICAgICBlY2hvICIqKipqYXZhIHRlc3RzKioqIgorCisgICAgICAgICAgIyBnZXQgYWxsIG9mIG91ciB1bml0IHRlc3QgZmlsZW5hbWVzCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBnbG9iICIkSE9NRS9jYXNzYW5kcmEvdGVzdC91bml0LyoqLyouamF2YSIgPiAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0CisKKyAgICAgICAgICAjIHNwbGl0IHVwIHRoZSB1bml0IHRlc3RzIGludG8gZ3JvdXBzIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgY29udGFpbmVycyB3ZSBoYXZlCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9ZmlsZW5hbWUgLS1pbmRleD0ke0NJUkNMRV9OT0RFX0lOREVYfSAtLXRvdGFsPSR7Q0lSQ0xFX05PREVfVE9UQUx9IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0CisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dCB8IHNlZCAiczteL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS90ZXN0L3VuaXQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiAgPiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgICAgZWNobyAiKiogL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHRlc3RjbGFzc2xpc3QtY29tcHJlc3Npb24pCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1jb21wcmVzc2lvbiAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LXRyaWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC10cmllICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX2R0ZXN0c19vZmZoZWFwKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX2R0ZXN0c19vZmZoZWFwKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV9kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV9kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjExL2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCBDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMQorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV9kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfdHJpZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC10cmllKQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3QtdHJpZSAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0c19sYXJnZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIHJlcGVhdGVkIFB5dGhvbiBEVGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgaWYgWyAiJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgZWxpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbHNlCisKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgIGNvdW50PSQoKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuCisgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgaWYgKCgkY291bnQgPD0gMCkpOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiUnVubmluZyAke1JFUEVBVEVEX0xBUkdFX0RURVNUU30gJGNvdW50IHRpbWVzIgorCisgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKworICAgICAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvZHRlc3QKKworICAgICAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgIG1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHMKKworICAgICAgICAgICAgICB0ZXN0c19hcmc9JChlY2hvICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlX2FyZz0iIgorICAgICAgICAgICAgICBpZiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX07IHRoZW4KKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICB2bm9kZXNfYXJncz0iIgorICAgICAgICAgICAgICBpZiBmYWxzZTsgdGhlbgorICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdXBncmFkZV9hcmc9Ii0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzIC0tdXBncmFkZS10YXJnZXQtdmVyc2lvbi1vbmx5IC0tdXBncmFkZS12ZXJzaW9uLXNlbGVjdGlvbiBhbGwiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgICAgICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0ICR2bm9kZXNfYXJncyAtLWNvdW50PSRjb3VudCAkc3RvcF9vbl9mYWlsdXJlX2FyZyAkdXBncmFkZV9hcmcgLS1sb2ctY2xpLWxldmVsPURFQlVHIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyIC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgJHRlc3RzX2FyZyB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfVVRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9ZmFsc2VcbnZub2Rlc19hcmdzPVwiXCJcbmlmIFsgXCIkdm5vZGVzXCIgPSB0cnVlIF0gOyB0aGVuXG4gIHZub2Rlc19hcmdzPVwiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2J1wiXG5maVxuXG4jIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXNcbnRhcmdldD10ZXN0LWNvbXByZXNzaW9uXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtY29tcHJlc3Npb24gJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajE3X3V0ZXN0c19mcWx0b29sOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKGZxbHRvb2wtdGVzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiB4bGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA0CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfbGFyZ2Vfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfbGFyZ2Vfd2l0aF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19sYXJnZV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRoX3Zub2Rlc19maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X2xhcmdlX3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19sYXJnZV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfbGFyZ2Vfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcCA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV9kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTFfZHRlc3RzX29mZmhlYXAueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX2R0ZXN0c19vZmZoZWFwCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV9kdGVzdHNfb2ZmaGVhcF9sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogNTAKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxMV93aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX1VURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC10cmllXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3QtdHJpZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfc2ltdWxhdG9yX2R0ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfU0lNVUxBVE9SX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1zaW11bGF0b3ItZHRlc3RcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1zaW11bGF0b3ItZHRlc3QgJG5hbWVfYXJnICRtZXRob2RzX2FyZyAkdm5vZGVzX2FyZ3MgLURuby1idWlsZC10ZXN0PXRydWUgfCBcXFxuICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXFxcbiAgICAgICAgICApOyB0aGVuXG4gICAgICAgIHN0YXR1cz1cImZhaWxzXCJcbiAgICAgICAgZXhpdF9jb2RlPTFcbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlXG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dFxuXG4gICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIGxvZyBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3QvbG9ncy8ke3Rlc3R0YWd9XG4gICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncy8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcbiAgICAgIFxuICAgICAgIyBtYXliZSBzdG9wIGl0ZXJhdGlvbnMgb24gdGVzdCBmYWlsdXJlXG4gICAgICBpZiBbWyAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0gPSB0cnVlIF1dICYmICgoICRleGl0X2NvZGUgPiAwICkpOyB0aGVuXG4gICAgICAgIGJyZWFrXG4gICAgICBmaVxuICAgIGRvbmVcbmRvbmVcbihleGl0ICR7ZXhpdF9jb2RlfSlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQKKyAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2p2bV9kdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW5cbiAgY291bnQ9JCgoY291bnQrMSkpXG5maVxuXG4jIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXNcbnRlc3RzPSQoZWNobyAke1JFUEVBVEVEX0pWTV9EVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfZHRlc3RzX29mZmhlYXApCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfZHRlc3RzX29mZmhlYXApKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjgvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOAorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXBfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBjcWxzaGxpYiBVbml0IFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhLworICAgICAgICAgIC4vcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoICQocHdkKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxMV93aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExJyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnVuaXQudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IHRlc3RjbGFzc2xpc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9dW5pdCAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajE3X3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc1xuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXMudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN193aXRoX3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dCIKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfZmluYWwudHh0CisKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBpZiBbIC1uICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICBlY2hvICJlbnY6ICQoZW52KSIKKyAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgIyB3ZSBuZWVkIHRoZSAic2V0IC1vIHBpcGVmYWlsIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZQorICAgICAgICAgIGV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dGAKKyAgICAgICAgICBpZiBbICEgLXogIiRTUExJVF9URVNUUyIgXTsgdGhlbgorICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajE3X3dpdGhfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgKGV4aXQgMSkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajE3X2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajE3X3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuMTEvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN193aXRoX3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My4xMS9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIGlmIFsgLW4gJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjExJyBdOyB0aGVuCisgICAgICAgICAgICBleHBvcnQgQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRoX3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPSJERUJVRyIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN193aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVjaG8gIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lciIKKyAgICAgICAgICAgIChleGl0IDEpCisgICAgICAgICAgZmkKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN193aXRoX3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9qdm1fZHRlc3RzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMTAKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIGRpc3RyaWJ1dGVkIFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiB8IGdyZXAgLXYgdXBncmFkZSA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC5kaXN0cmlidXRlZC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAgIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9ZGlzdHJpYnV0ZWQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfc3RyZXNzOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDEKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKHN0cmVzcy10ZXN0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgc3RyZXNzLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogInNldCAteFxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbnRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcFxuY2QgL3RtcC9jYXNzYW5kcmFcbmlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW5cbiAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC9cbmZpXG5cbiMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuXG5jb3VudD0kKCgke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKVxuaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9KVk1fRFRFU1RTfSB8IHNlZCAtZSBcInMvPG5pbD4vL1wiIHwgc2VkIC1lIFwicy8gLy9cIiB8IHRyIFwiLFwiIFwiXFxuXCIgfCB0ciBcIiBcIiBcIlxcblwiIHwgc29ydCAtbiB8IHVuaXEgLXUpXG5lY2hvIFwiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9XCJcblxuIyBQcmVwYXJlIHRoZSBKVk0gZHRlc3RzIHZub2RlcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwuXG52bm9kZXM9dHJ1ZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3QtanZtLWR0ZXN0LXNvbWVcbnRlc3R0YWc9XCJcIlxuaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNkY1wiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cImNvbXByZXNzaW9uXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5XCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJ0cmllXCJcbmZpXG5cbiMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC5cbmV4aXRfY29kZT1cIiQ/XCJcbmZvciB0ZXN0IGluICR0ZXN0czsgZG9cblxuICAgICMgU3BsaXQgY2xhc3MgYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoZSB0ZXN0IG5hbWVcbiAgICBpZiBbWyAkdGVzdCA9fiBcIiNcIiBdXTsgdGhlblxuICAgICAgY2xhc3M9JHt0ZXN0JVwiI1wiKn1cbiAgICAgIG1ldGhvZD0ke3Rlc3QjKlwiI1wifVxuICAgIGVsc2VcbiAgICAgIGNsYXNzPSR0ZXN0XG4gICAgICBtZXRob2Q9XCJcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5uYW1lIGFyZ3VtZW50LlxuICAgICMgSXQgY2FuIGJlIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvciB0aGUgc2hvcnQgY2xhc3MgbmFtZSwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQuXG4gICAgaWYgW1sgJHRhcmdldCA9PSBcInRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJmcWx0b29sLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJsb25nLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJzdHJlc3MtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc2ltdWxhdG9yLWR0ZXN0XCIgXV07IHRoZW5cbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JHtjbGFzcyMjKi59XCJcbiAgICBlbHNlXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSRjbGFzc1wiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm1ldGhvZHMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsXG4gICAgaWYgW1sgJG1ldGhvZCA9PSBcIlwiIF1dOyB0aGVuXG4gICAgICBtZXRob2RzX2FyZz1cIlwiXG4gICAgZWxzZVxuICAgICAgbWV0aG9kc19hcmc9XCItRHRlc3QubWV0aG9kcz0kbWV0aG9kXCJcbiAgICBmaVxuXG4gICAgZm9yIGkgaW4gJChzZXEgLXcgMSAkY291bnQpOyBkb1xuICAgICAgZWNobyBcIlJ1bm5pbmcgdGVzdCAkdGVzdCwgaXRlcmF0aW9uICRpIG9mICRjb3VudFwiXG5cbiAgICAgICMgcnVuIHRoZSB0ZXN0XG4gICAgICBzdGF0dXM9XCJwYXNzZXNcIlxuICAgICAgaWYgISggc2V0IC1vIHBpcGVmYWlsICYmIFxcXG4gICAgICAgICAgICBhbnQgdGVzdC1qdm0tZHRlc3Qtc29tZSAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTFfYnVpbGQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMQorICAgIHN0ZXBzOgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWRlcHRoIDEgLS1icmFuY2ggJENJUkNMRV9CUkFOQ0ggaHR0cHM6Ly9naXRodWIuY29tLyRDSVJDTEVfUFJPSkVDVF9VU0VSTkFNRS8kQ0lSQ0xFX1BST0pFQ1RfUkVQT05BTUUuZ2l0IH4vY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IEJ1aWxkIENhc3NhbmRyYQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYQorICAgICAgICAgICMgTG9vcCB0byBwcmV2ZW50IGZhaWx1cmUgZHVlIHRvIG1hdmVuLWFudC10YXNrcyBub3QgZG93bmxvYWRpbmcgYSBqYXIuLgorICAgICAgICAgIGZvciB4IGluICQoc2VxIDEgMyk7IGRvCisgICAgICAgICAgICAgICR7QU5UX0hPTUV9L2Jpbi9hbnQgY2xlYW4gcmVhbGNsZWFuIGphcgorICAgICAgICAgICAgICBSRVRVUk49IiQ/IgorICAgICAgICAgICAgICBpZiBbICIke1JFVFVSTn0iIC1lcSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICBkb25lCisgICAgICAgICAgIyBFeGl0LCBpZiB3ZSBkaWRuJ3QgYnVpbGQgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgaWYgWyAiJHtSRVRVUk59IiAtbmUgIjAiIF07IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiQnVpbGQgZmFpbGVkIHdpdGggZXhpdCBjb2RlOiAke1JFVFVSTn0iCisgICAgICAgICAgICAgIGV4aXQgJHtSRVRVUk59CisgICAgICAgICAgZmkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZWNsaXBzZS13YXJuaW5ncworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYQorICAgICAgICAgIGFudCBlY2xpcHNlLXdhcm5pbmdzCisgICAgLSBwZXJzaXN0X3RvX3dvcmtzcGFjZToKKyAgICAgICAgcm9vdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAgIHBhdGhzOgorICAgICAgICAtIGNhc3NhbmRyYQorICAgICAgICAtIC5tMgorICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxMV9jcWxzaGxpYl90ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBjcWxzaGxpYiBVbml0IFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhLworICAgICAgICAgIC4vcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoICQocHdkKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL3B5bGliCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgajExX2R0ZXN0czoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExLXctZGVwZW5kZW5jaWVzOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTFfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTFfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgbm90IGNxbCcgLS1kdGVzdC1wcmludC10ZXN0cy1vbmx5IC0tZHRlc3QtcHJpbnQtdGVzdHMtb3V0cHV0PS90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYVxuaWYgWyAteiAnJyBdOyB0aGVuXG4gIG12IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzXG5lbHNlXG4gIGdyZXAgLWUgJycgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX3JhdyA+IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2RlcyB8fCB7IGVjaG8gXCJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuXCI7IGV4aXQgMDsgfVxuZmlcbnNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWNsYXNzbmFtZSAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXMgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlcy50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlcy50eHQgfCB0ciAnXFxuJyAnICcgPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcbiIKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoajExX3dpdGhvdXRfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJlY2hvIFwiY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFwiXG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XG5cbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuamF2YSAtdmVyc2lvblxuY2Qgfi9jYXNzYW5kcmEtZHRlc3Rcbm1rZGlyIC1wIC90bXAvZHRlc3RcblxuZWNobyBcImVudjogJChlbnYpXCJcbmVjaG8gXCIqKiBkb25lIGVudlwiXG5ta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzXG4jIHdlIG5lZWQgdGhlIFwic2V0IC1vIHBpcGVmYWlsXCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWVcbmV4cG9ydCBTUExJVF9URVNUUz1gY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dGBcbmlmIFsgISAteiBcIiRTUExJVF9URVNUU1wiIF07IHRoZW5cbiAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tbG9nLWxldmVsPVwiREVCVUdcIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfajExX3dpdGhvdXRfdm5vZGVzLnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgJFNQTElUX1RFU1RTIDI+JjEgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0XG5lbHNlXG4gIGVjaG8gXCJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXJcIlxuICAoZXhpdCAxKVxuZmlcbiIKKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvZHRlc3QKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxMV93aXRob3V0X3Zub2RlcworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aG91dF92bm9kZXNfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMTAKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIGRpc3RyaWJ1dGVkIFRlc3RzIHRvIFJ1bgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lcgorICAgICAgICAgICMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW4KKyAgICAgICAgICAjIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC4KKworICAgICAgICAgIHJtIC1mciB+L2Nhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzCisgICAgICAgICAgZWNobyAiKioqamF2YSB0ZXN0cyoqKiIKKworICAgICAgICAgICMgZ2V0IGFsbCBvZiBvdXIgdW5pdCB0ZXN0IGZpbGVuYW1lcworICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgZ2xvYiAiJEhPTUUvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvZGlzdHJpYnV0ZWQvOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiB8IGdyZXAgLXYgdXBncmFkZSA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC5kaXN0cmlidXRlZC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdCAtRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnIC1EdGVzdC50aW1lb3V0PSIkdGVzdF90aW1lb3V0IiAtRHRlc3QuY2xhc3NsaXN0ZmlsZT0vdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IC1EdGVzdC5jbGFzc2xpc3RwcmVmaXg9ZGlzdHJpYnV0ZWQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgVGVzdHMgdG8gUnVuIChqMTdfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA1bQorICAgICAgICBjb21tYW5kOiAiIyByZW1pbmRlcjogdGhpcyBjb2RlIChhbG9uZyB3aXRoIGFsbCB0aGUgc3RlcHMpIGlzIGluZGVwZW5kZW50bHkgZXhlY3V0ZWQgb24gZXZlcnkgY2lyY2xlIGNvbnRhaW5lclxuIyBzbyB0aGUgZ29hbCBoZXJlIGlzIHRvIGdldCB0aGUgY2lyY2xlY2kgc2NyaXB0IHRvIHJldHVybiB0aGUgdGVzdHMgKnRoaXMqIGNvbnRhaW5lciB3aWxsIHJ1blxuIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuXG5cbmNkIGNhc3NhbmRyYS1kdGVzdFxuc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcblxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmVjaG8gXCIqKipDb2xsZWN0ZWQgRFRlc3RzIChqMTdfd2l0aG91dF92bm9kZXMpKioqXCJcbnNldCAtZW8gcGlwZWZhaWwgJiYgLi9ydW5fZHRlc3RzLnB5IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dAorCisgICAgICAgICAgc291cmNlIH4vZW52My44L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgaWYgWyAtbiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcgXTsgdGhlbgorICAgICAgICAgICAgZXhwb3J0IENRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjgKKyAgICAgICAgICBmaQorCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICMgd2UgbmVlZCB0aGUgInNldCAtbyBwaXBlZmFpbCIgaGVyZSBzbyB0aGF0IHRoZSBleGl0IGNvZGUgdGhhdCBjaXJjbGVjaSB3aWxsIGFjdHVhbGx5IHVzZSBpcyBmcm9tIHB5dGVzdCBhbmQgbm90IHRoZSBleGl0IGNvZGUgZnJvbSB0ZWUKKyAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN193aXRob3V0X3Zub2Rlc19maW5hbC50eHRgCisgICAgICAgICAgaWYgWyAhIC16ICIkU1BMSVRfVEVTVFMiIF07IHRoZW4KKyAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD0iREVCVUciIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlY2hvICJUdW5lIHlvdXIgcGFyYWxsZWxpc20sIHRoZXJlIGFyZSBtb3JlIGNvbnRhaW5lcnMgdGhhbiB0ZXN0IGNsYXNzZXMuIE5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjb250YWluZXIiCisgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgIGZpCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfd2l0aG91dF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X3dpdGhvdXRfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfdXRlc3RzX2NkYzoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAyNQorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBEZXRlcm1pbmUgdW5pdCBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0L3VuaXQvKiovKi5qYXZhIiA+IC90bXAvYWxsX2phdmFfdW5pdF90ZXN0cy50eHQKKworICAgICAgICAgICMgc3BsaXQgdXAgdGhlIHVuaXQgdGVzdHMgaW50byBncm91cHMgYmFzZWQgb24gdGhlIG51bWJlciBvZiBjb250YWluZXJzIHdlIGhhdmUKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1maWxlbmFtZSAtLWluZGV4PSR7Q0lSQ0xFX05PREVfSU5ERVh9IC0tdG90YWw9JHtDSVJDTEVfTk9ERV9UT1RBTH0gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dCA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH0udHh0IHwgc2VkICJzO14vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhL3Rlc3QvdW5pdC87O2ciIHwgZ3JlcCAiVGVzdFwuamF2YSQiICA+IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKyAgICAgICAgICBlY2hvICIqKiAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0IgorICAgICAgICAgIGNhdCAvdG1wL2phdmFfdGVzdHNfJHtDSVJDTEVfTk9ERV9JTkRFWH1fZmluYWwudHh0CisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gVW5pdCBUZXN0cyAodGVzdGNsYXNzbGlzdC1jZGMpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudW5pdC50aW1lb3V0IicgYnVpbGQueG1sIHwgYXdrIC1GJyInICd7cHJpbnQgJDR9JyB8fCB0cnVlKQorICAgICAgICAgIGlmIFsgLXogIiR0ZXN0X3RpbWVvdXQiIF07IHRoZW4KKyAgICAgICAgICAgIHRlc3RfdGltZW91dD0kKGdyZXAgJ25hbWU9InRlc3QudGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScpCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdGNsYXNzbGlzdC1jZGMgICAtRHRlc3QudGltZW91dD0iJHRlc3RfdGltZW91dCIgLUR0ZXN0LmNsYXNzbGlzdGZpbGU9L3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dCAtRHRlc3QuY2xhc3NsaXN0cHJlZml4PXVuaXQgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTH0gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9ZnFsdG9vbC10ZXN0XG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IGZxbHRvb2wtdGVzdCAkbmFtZV9hcmcgJG1ldGhvZHNfYXJnICR2bm9kZXNfYXJncyAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZSB8IFxcXG4gICAgICAgICAgICB0ZWUgc3Rkb3V0LnR4dCBcXFxuICAgICAgICAgICk7IHRoZW5cbiAgICAgICAgc3RhdHVzPVwiZmFpbHNcIlxuICAgICAgICBleGl0X2NvZGU9MVxuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGVcbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9zdGRvdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBtdiBzdGRvdXQudHh0ICRkZXN0LyR7dGVzdH0udHh0XG5cbiAgICAgICMgbW92ZSB0aGUgWE1MIG91dHB1dCBmaWxlc1xuICAgICAgc291cmNlPWJ1aWxkL3Rlc3Qvb3V0cHV0LyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG5cbiAgICAgICMgbW92ZSB0aGUgbG9nIGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9sb2dzLyR7dGVzdHRhZ31cbiAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9sb2dzLyR7c3RhdHVzfS8ke2l9XG4gICAgICBta2RpciAtcCAkZGVzdFxuICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiBcIiQobHMgJHNvdXJjZSlcIiBdXTsgdGhlblxuICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvXG4gICAgICBmaVxuICAgICAgXG4gICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmVcbiAgICAgIGlmIFtbICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfSA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW5cbiAgICAgICAgYnJlYWtcbiAgICAgIGZpXG4gICAgZG9uZVxuZG9uZVxuKGV4aXQgJHtleGl0X2NvZGV9KVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dAorICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX2xhcmdlOgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IHhsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDQKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN19sYXJnZV93aXRob3V0X3Zub2RlcykKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN19sYXJnZV93aXRob3V0X3Zub2RlcykqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1sb2ctbGV2ZWw9XCJERUJVR1wiIC0tanVuaXQteG1sPS90bXAvcmVzdWx0cy9kdGVzdHMvcHl0ZXN0X3Jlc3VsdF9qMTdfbGFyZ2Vfd2l0aG91dF92bm9kZXMueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHRcbmVsc2VcbiAgZWNobyBcIlR1bmUgeW91ciBwYXJhbGxlbGlzbSwgdGhlcmUgYXJlIG1vcmUgY29udGFpbmVycyB0aGFuIHRlc3QgY2xhc3Nlcy4gTm90aGluZyB0byBkbyBpbiB0aGlzIGNvbnRhaW5lclwiXG4gIChleGl0IDEpXG5maVxuIgorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IH4vY2Fzc2FuZHJhLWR0ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2oxN19sYXJnZV93aXRob3V0X3Zub2Rlc19sb2dzCisgICAgZW52aXJvbm1lbnQ6CisgICAgLSBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKKyAgICAtIExBTkc6IGVuX1VTLlVURi04CisgICAgLSBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgLSBERUZBVUxUX0RJUjogL2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gUFlUSE9OSU9FTkNPRElORzogdXRmLTgKKyAgICAtIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0VYVEVOU0lPTlM6IHRydWUKKyAgICAtIENBU1NfRFJJVkVSX05PX0NZVEhPTjogdHJ1ZQorICAgIC0gQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIC0gRFRFU1RfUkVQTzogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEtZHRlc3QuZ2l0CisgICAgLSBEVEVTVF9CUkFOQ0g6IHRydW5rCisgICAgLSBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICAtIENDTV9IRUFQX05FV1NJWkU6IDI1Nk0KKyAgICAtIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKyAgICAtIFJFUEVBVEVEX1VURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9ORzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTUzogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlQ6IDEwMAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0c29tZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX01FVEhPRFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKyAgICAtIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgIC0gSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgajExX3VuaXRfdGVzdHNfcmVwZWF0OgorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTEtdy1kZXBlbmRlbmNpZXM6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUmVwZWF0ZWRseSBydW4gbmV3IG9yIG1vZGlmZWQgSlVuaXQgdGVzdHMKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAic2V0IC14XG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxudGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wXG5jZCAvdG1wL2Nhc3NhbmRyYVxuaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlblxuICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkL1xuZmlcblxuIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci5cbmNvdW50PSQoKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfVVRFU1RTX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFN9IHwgc2VkIC1lIFwicy88bmlsPi8vXCIgfCBzZWQgLWUgXCJzLyAvL1wiIHwgdHIgXCIsXCIgXCJcXG5cIiB8IHRyIFwiIFwiIFwiXFxuXCIgfCBzb3J0IC1uIHwgdW5pcSAtdSlcbmVjaG8gXCJUZXN0cyB0byBiZSByZXBlYXRlZDogJHt0ZXN0c31cIlxuXG4jIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC5cbnZub2Rlcz1mYWxzZVxudm5vZGVzX2FyZ3M9XCJcIlxuaWYgWyBcIiR2bm9kZXNcIiA9IHRydWUgXSA7IHRoZW5cbiAgdm5vZGVzX2FyZ3M9XCItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnXCJcbmZpXG5cbiMgUHJlcGFyZSB0aGUgdGVzdHRhZyBmb3IgdGhlIHRhcmdldCwgdXNlZCBieSB0aGUgdGVzdCBtYWNybyBpbiBidWlsZC54bWwgdG8gZ3JvdXAgdGhlIG91dHB1dCBmaWxlc1xudGFyZ2V0PXRlc3Rzb21lXG50ZXN0dGFnPVwiXCJcbmlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LWNkY1wiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjZGNcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIF1dOyB0aGVuXG4gIHRlc3R0YWc9XCJjb21wcmVzc2lvblwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnlcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwic3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeVwiXG5lbGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0LXRyaWVcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwidHJpZVwiXG5maVxuXG4jIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuXG5leGl0X2NvZGU9XCIkP1wiXG5mb3IgdGVzdCBpbiAkdGVzdHM7IGRvXG5cbiAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lXG4gICAgaWYgW1sgJHRlc3QgPX4gXCIjXCIgXV07IHRoZW5cbiAgICAgIGNsYXNzPSR7dGVzdCVcIiNcIip9XG4gICAgICBtZXRob2Q9JHt0ZXN0IypcIiNcIn1cbiAgICBlbHNlXG4gICAgICBjbGFzcz0kdGVzdFxuICAgICAgbWV0aG9kPVwiXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubmFtZSBhcmd1bWVudC5cbiAgICAjIEl0IGNhbiBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb3IgdGhlIHNob3J0IGNsYXNzIG5hbWUsIGRlcGVuZGluZyBvbiB0aGUgdGFyZ2V0LlxuICAgIGlmIFtbICR0YXJnZXQgPT0gXCJ0ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LWNvbXByZXNzaW9uXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwiZnFsdG9vbC10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwibG9uZy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwic3RyZXNzLXRlc3RcIiB8fCBcXFxuICAgICAgICAgICR0YXJnZXQgPT0gXCJ0ZXN0LXNpbXVsYXRvci1kdGVzdFwiIF1dOyB0aGVuXG4gICAgICBuYW1lX2FyZz1cIi1EdGVzdC5uYW1lPSR7Y2xhc3MjIyoufVwiXG4gICAgZWxzZVxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0kY2xhc3NcIlxuICAgIGZpXG5cbiAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbFxuICAgIGlmIFtbICRtZXRob2QgPT0gXCJcIiBdXTsgdGhlblxuICAgICAgbWV0aG9kc19hcmc9XCJcIlxuICAgIGVsc2VcbiAgICAgIG1ldGhvZHNfYXJnPVwiLUR0ZXN0Lm1ldGhvZHM9JG1ldGhvZFwiXG4gICAgZmlcblxuICAgIGZvciBpIGluICQoc2VxIC13IDEgJGNvdW50KTsgZG9cbiAgICAgIGVjaG8gXCJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnRcIlxuXG4gICAgICAjIHJ1biB0aGUgdGVzdFxuICAgICAgc3RhdHVzPVwicGFzc2VzXCJcbiAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcXFxuICAgICAgICAgICAgYW50IHRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfbG9uZzoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBVbml0IFRlc3RzIChsb25nLXRlc3QpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICBmaQorICAgICAgICAgIGFudCBsb25nLXRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dC8KKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV9kdGVzdHNfdm5vZGU6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbGFyZ2UKKyAgICB3b3JraW5nX2RpcmVjdG9yeTogfi8KKyAgICBzaGVsbDogL2Jpbi9iYXNoIC1lbyBwaXBlZmFpbCAtbAorICAgIHBhcmFsbGVsaXNtOiA1MAorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ29uZmlndXJlIHZpcnR1YWxlbnYgYW5kIHB5dGhvbiBEZXBlbmRlbmNpZXMKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgbm90ZSwgdGhpcyBzaG91bGQgYmUgc3VwZXIgcXVpY2sgYXMgYWxsIGRlcGVuZGVuY2llcyBzaG91bGQgYmUgcHJlLWluc3RhbGxlZCBpbiB0aGUgZG9ja2VyIGltYWdlCisgICAgICAgICAgIyBpZiBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyB3ZXJlIGFkZGVkIHRvIHJlcXVpcm1lZW50cy50eHQgYW5kIHRoZSBkb2NrZXIgaW1hZ2UgaGFzbid0IGJlZW4gdXBkYXRlZAorICAgICAgICAgICMgd2UnZCBoYXZlIHRvIGluc3RhbGwgaXQgaGVyZSBhdCBydW50aW1lIC0tIHdoaWNoIHdpbGwgbWFrZSB0aGluZ3Mgc2xvdywgc28gZG8geW91cnNlbGYgYSBmYXZvciBhbmQKKyAgICAgICAgICAjIHJlYnVpbGQgdGhlIGRvY2tlciBpbWFnZSEgKGl0IGF1dG9tYXRpY2FsbHkgcHVsbHMgdGhlIGxhdGVzdCByZXF1aXJlbWVudHMudHh0IG9uIGJ1aWxkKQorICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIFRlc3RzIHRvIFJ1biAoajExX3dpdGhfdm5vZGVzKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogIiMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXJcbiMgc28gdGhlIGdvYWwgaGVyZSBpcyB0byBnZXQgdGhlIGNpcmNsZWNpIHNjcmlwdCB0byByZXR1cm4gdGhlIHRlc3RzICp0aGlzKiBjb250YWluZXIgd2lsbCBydW5cbiMgd2hpY2ggd2UgZG8gdmlhIHRoZSBgY2lyY2xlY2lgIGNsaSB0b29sLlxuXG5jZCBjYXNzYW5kcmEtZHRlc3RcbnNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGVcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG5cbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5lY2hvIFwiKioqQ29sbGVjdGVkIERUZXN0cyAoajExX3dpdGhfdm5vZGVzKSoqKlwiXG5zZXQgLWVvIHBpcGVmYWlsICYmIC4vcnVuX2R0ZXN0cy5weSAtLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyAtLWR0ZXN0LXByaW50LXRlc3RzLW9ubHkgLS1kdGVzdC1wcmludC10ZXN0cy1vdXRwdXQ9L3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAtLWNhc3NhbmRyYS1kaXI9Li4vY2Fzc2FuZHJhXG5pZiBbIC16ICcnIF07IHRoZW5cbiAgbXYgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX3JhdyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNcbmVsc2VcbiAgZ3JlcCAtZSAnJyAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzIHx8IHsgZWNobyBcIkZpbHRlciBkaWQgbm90IG1hdGNoIGFueSB0ZXN0cyEgRXhpdGluZyBidWlsZC5cIjsgZXhpdCAwOyB9XG5maVxuc2V0IC1lbyBwaXBlZmFpbCAmJiBjaXJjbGVjaSB0ZXN0cyBzcGxpdCAtLXNwbGl0LWJ5PXRpbWluZ3MgLS10aW1pbmdzLXR5cGU9Y2xhc3NuYW1lIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2RlcyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzLnR4dCB8IHRyICdcXG4nICcgJyA+IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajExX3dpdGhfdm5vZGVzX2ZpbmFsLnR4dFxuIgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gZHRlc3RzIChqMTFfd2l0aF92bm9kZXMpCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgY29tbWFuZDogImVjaG8gXCJjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0XCJcbmNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxMV93aXRoX3Zub2Rlc19maW5hbC50eHRcblxuc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZVxuZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEhcbmlmIFsgLW4gJycgXTsgdGhlblxuICBleHBvcnQgXG5maVxuXG5qYXZhIC12ZXJzaW9uXG5jZCB+L2Nhc3NhbmRyYS1kdGVzdFxubWtkaXIgLXAgL3RtcC9kdGVzdFxuXG5lY2hvIFwiZW52OiAkKGVudilcIlxuZWNobyBcIioqIGRvbmUgZW52XCJcbm1rZGlyIC1wIC90bXAvcmVzdWx0cy9kdGVzdHNcbiMgd2UgbmVlZCB0aGUgXCJzZXQgLW8gcGlwZWZhaWxcIiBoZXJlIHNvIHRoYXQgdGhlIGV4aXQgY29kZSB0aGF0IGNpcmNsZWNpIHdpbGwgYWN0dWFsbHkgdXNlIGlzIGZyb20gcHl0ZXN0IGFuZCBub3QgdGhlIGV4aXQgY29kZSBmcm9tIHRlZVxuZXhwb3J0IFNQTElUX1RFU1RTPWBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTFfd2l0aF92bm9kZXNfZmluYWwudHh0YFxuaWYgWyAhIC16IFwiJFNQTElUX1RFU1RTXCIgXTsgdGhlblxuICBzZXQgLW8gcGlwZWZhaWwgJiYgY2Qgfi9jYXNzYW5kcmEtZHRlc3QgJiYgcHl0ZXN0IC0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxMV93aXRoX3Zub2Rlcy54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTFfd2l0aF92bm9kZXMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajExX3dpdGhfdm5vZGVzX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorICBqMTdfanZtX2R0ZXN0c19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfSAvIENJUkNMRV9OT0RFX1RPVEFMKSlcbmlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKCR7UkVQRUFURURfSlZNX0RURVNUU19DT1VOVH0gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlblxuICBjb3VudD0kKChjb3VudCsxKSlcbmZpXG5cbiMgUHV0IG1hbnVhbGx5IHNwZWNpZmllZCB0ZXN0cyBhbmQgYXV0b21hdGljYWxseSBkZXRlY3RlZCB0ZXN0cyB0b2dldGhlciwgcmVtb3ZpbmcgZHVwbGljYXRlc1xudGVzdHM9JChlY2hvICR7UkVQRUFURURfSlZNX0RURVNUU30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9dGVzdC1qdm0tZHRlc3Qtc29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCB0ZXN0LWp2bS1kdGVzdC1zb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDUwCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IExvZyBFbnZpcm9ubWVudCBJbmZvcm1hdGlvbgorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZWNobyAnKioqIGlkICoqKicKKyAgICAgICAgICBpZAorICAgICAgICAgIGVjaG8gJyoqKiBjYXQgL3Byb2MvY3B1aW5mbyAqKionCisgICAgICAgICAgY2F0IC9wcm9jL2NwdWluZm8KKyAgICAgICAgICBlY2hvICcqKiogZnJlZSAtbSAqKionCisgICAgICAgICAgZnJlZSAtbQorICAgICAgICAgIGVjaG8gJyoqKiBkZiAtbSAqKionCisgICAgICAgICAgZGYgLW0KKyAgICAgICAgICBlY2hvICcqKiogaWZjb25maWcgLWEgKioqJworICAgICAgICAgIGlmY29uZmlnIC1hCisgICAgICAgICAgZWNobyAnKioqIHVuYW1lIC1hICoqKicKKyAgICAgICAgICB1bmFtZSAtYQorICAgICAgICAgIGVjaG8gJyoqKiBtb3VudCAqKionCisgICAgICAgICAgbW91bnQKKyAgICAgICAgICBlY2hvICcqKiogZW52ICoqKicKKyAgICAgICAgICBlbnYKKyAgICAgICAgICBlY2hvICcqKiogamF2YSAqKionCisgICAgICAgICAgd2hpY2ggamF2YQorICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogQ2xvbmUgQ2Fzc2FuZHJhIGR0ZXN0IFJlcG9zaXRvcnkgKHZpYSBnaXQpCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBnaXQgY2xvbmUgLS1zaW5nbGUtYnJhbmNoIC0tYnJhbmNoICREVEVTVF9CUkFOQ0ggLS1kZXB0aCAxICREVEVTVF9SRVBPIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlCisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBwaXAzIGluc3RhbGwgLS1leGlzdHMtYWN0aW9uIHcgLS11cGdyYWRlIC1yIH4vY2Fzc2FuZHJhLWR0ZXN0L3JlcXVpcmVtZW50cy50eHQKKyAgICAgICAgICBwaXAzIHVuaW5zdGFsbCAteSBjcWxzaAorICAgICAgICAgIHBpcDMgZnJlZXplCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDVtCisgICAgICAgIGNvbW1hbmQ6ICIjIHJlbWluZGVyOiB0aGlzIGNvZGUgKGFsb25nIHdpdGggYWxsIHRoZSBzdGVwcykgaXMgaW5kZXBlbmRlbnRseSBleGVjdXRlZCBvbiBldmVyeSBjaXJjbGUgY29udGFpbmVyXG4jIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuXG4jIHdoaWNoIHdlIGRvIHZpYSB0aGUgYGNpcmNsZWNpYCBjbGkgdG9vbC5cblxuY2QgY2Fzc2FuZHJhLWR0ZXN0XG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuXG5pZiBbIC1uICcnIF07IHRoZW5cbiAgZXhwb3J0IFxuZmlcblxuZWNobyBcIioqKkNvbGxlY3RlZCBEVGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkqKipcIlxuc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgLS11c2Utdm5vZGVzIC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIG5vdCBjcWwnIC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC0tY2Fzc2FuZHJhLWRpcj0uLi9jYXNzYW5kcmFcbmlmIFsgLXogJycgXTsgdGhlblxuICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfcmF3IC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcFxuZWxzZVxuICBncmVwIC1lICcnIC90bXAvYWxsX2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9yYXcgPiAvdG1wL2FsbF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAgfHwgeyBlY2hvIFwiRmlsdGVyIGRpZCBub3QgbWF0Y2ggYW55IHRlc3RzISBFeGl0aW5nIGJ1aWxkLlwiOyBleGl0IDA7IH1cbmZpXG5zZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXAudHh0IHwgdHIgJ1xcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG5jYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c19qMTdfZHRlc3RzX29mZmhlYXBfZmluYWwudHh0XG4iCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBkdGVzdHMgKGoxN19kdGVzdHNfb2ZmaGVhcCkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICBjb21tYW5kOiAiZWNobyBcImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRcIlxuY2F0IC90bXAvc3BsaXRfZHRlc3RfdGVzdHNfajE3X2R0ZXN0c19vZmZoZWFwX2ZpbmFsLnR4dFxuXG5zb3VyY2Ugfi9lbnYzLjYvYmluL2FjdGl2YXRlXG5leHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSFxuaWYgWyAtbiAnJyBdOyB0aGVuXG4gIGV4cG9ydCBcbmZpXG5cbmphdmEgLXZlcnNpb25cbmNkIH4vY2Fzc2FuZHJhLWR0ZXN0XG5ta2RpciAtcCAvdG1wL2R0ZXN0XG5cbmVjaG8gXCJlbnY6ICQoZW52KVwiXG5lY2hvIFwiKiogZG9uZSBlbnZcIlxubWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0c1xuIyB3ZSBuZWVkIHRoZSBcInNldCAtbyBwaXBlZmFpbFwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlXG5leHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzX2oxN19kdGVzdHNfb2ZmaGVhcF9maW5hbC50eHRgXG5pZiBbICEgLXogXCIkU1BMSVRfVEVTVFNcIiBdOyB0aGVuXG4gIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWxvZy1sZXZlbD1cIkRFQlVHXCIgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0X2oxN19kdGVzdHNfb2ZmaGVhcC54bWwgLXMgLS1jYXNzYW5kcmEtZGlyPS9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEgLS1rZWVwLXRlc3QtZGlyICRTUExJVF9URVNUUyAyPiYxIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dFxuZWxzZVxuICBlY2hvIFwiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyXCJcbiAgKGV4aXQgMSlcbmZpXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfajE3X2R0ZXN0c19vZmZoZWFwX2xvZ3MKKyAgICBlbnZpcm9ubWVudDoKKyAgICAtIEFOVF9IT01FOiAvdXNyL3NoYXJlL2FudAorICAgIC0gTEFORzogZW5fVVMuVVRGLTgKKyAgICAtIEtFRVBfVEVTVF9ESVI6IHRydWUKKyAgICAtIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CisgICAgLSBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIC0gUFlUSE9OVU5CVUZGRVJFRDogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fRVhURU5TSU9OUzogdHJ1ZQorICAgIC0gQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgLSBDQVNTQU5EUkFfU0tJUF9TWU5DOiB0cnVlCisgICAgLSBEVEVTVF9SRVBPOiBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS1kdGVzdC5naXQKKyAgICAtIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICAtIENDTV9NQVhfSEVBUF9TSVpFOiAxMDI0TQorICAgIC0gQ0NNX0hFQVBfTkVXU0laRTogMjU2TQorICAgIC0gUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFOiBmYWxzZQorICAgIC0gUkVQRUFURURfVVRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfSlZNX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogbnVsbAorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfVk5PREVTOiBmYWxzZQorICAgIC0gUkVQRUFURURfQU5UX1RFU1RfQ09VTlQ6IDUwMAorICAgIC0gSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgICAgLSBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICBqMTdfZHRlc3RzX2xhcmdlX3JlcGVhdDoKKyAgICBkb2NrZXI6CisgICAgLSBpbWFnZTogYXBhY2hlL2Nhc3NhbmRyYS10ZXN0aW5nLXVidW50dTIwMDQtamF2YTExOmxhdGVzdAorICAgIHJlc291cmNlX2NsYXNzOiBsYXJnZQorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgcGFyYWxsZWxpc206IDI1CisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENsb25lIENhc3NhbmRyYSBkdGVzdCBSZXBvc2l0b3J5ICh2aWEgZ2l0KQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZ2l0IGNsb25lIC0tc2luZ2xlLWJyYW5jaCAtLWJyYW5jaCAkRFRFU1RfQlJBTkNIIC0tZGVwdGggMSAkRFRFU1RfUkVQTyB+L2Nhc3NhbmRyYS1kdGVzdAorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDb25maWd1cmUgdmlydHVhbGVudiBhbmQgcHl0aG9uIERlcGVuZGVuY2llcworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgIyBub3RlLCB0aGlzIHNob3VsZCBiZSBzdXBlciBxdWljayBhcyBhbGwgZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBwcmUtaW5zdGFsbGVkIGluIHRoZSBkb2NrZXIgaW1hZ2UKKyAgICAgICAgICAjIGlmIGFkZGl0aW9uYWwgZGVwZW5kZW5jaWVzIHdlcmUgYWRkZWQgdG8gcmVxdWlybWVlbnRzLnR4dCBhbmQgdGhlIGRvY2tlciBpbWFnZSBoYXNuJ3QgYmVlbiB1cGRhdGVkCisgICAgICAgICAgIyB3ZSdkIGhhdmUgdG8gaW5zdGFsbCBpdCBoZXJlIGF0IHJ1bnRpbWUgLS0gd2hpY2ggd2lsbCBtYWtlIHRoaW5ncyBzbG93LCBzbyBkbyB5b3Vyc2VsZiBhIGZhdm9yIGFuZAorICAgICAgICAgICMgcmVidWlsZCB0aGUgZG9ja2VyIGltYWdlISAoaXQgYXV0b21hdGljYWxseSBwdWxscyB0aGUgbGF0ZXN0IHJlcXVpcmVtZW50cy50eHQgb24gYnVpbGQpCisgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgcGlwMyBpbnN0YWxsIC0tZXhpc3RzLWFjdGlvbiB3IC0tdXBncmFkZSAtciB+L2Nhc3NhbmRyYS1kdGVzdC9yZXF1aXJlbWVudHMudHh0CisgICAgICAgICAgcGlwMyB1bmluc3RhbGwgLXkgY3Fsc2gKKyAgICAgICAgICBwaXAzIGZyZWV6ZQorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBpZiBbICIke1JFUEVBVEVEX0xBUkdFX0RURVNUU30iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCBkdGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICBlbGlmIFsgIiR7UkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UfSIgLWxlIDAgXTsgdGhlbgorICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiB0ZXN0IGl0ZXJhdGlvbnMgdG8gYmUgcnVuIGJ5IHRoZSBjdXJyZW50IHBhcmFsbGVsIHJ1bm5lci4KKyAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgY291bnQ9JCgoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9IC8gQ0lSQ0xFX05PREVfVE9UQUwpKQorICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFNfQ09VTlR9ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiTm8gdGVzdHMgdG8gcnVuIGluIHRoaXMgcnVubmVyIgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfSAkY291bnQgdGltZXMiCisKKyAgICAgICAgICAgICAgc291cmNlIH4vZW52My42L2Jpbi9hY3RpdmF0ZQorICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgICBlY2hvICIqKiBkb25lIGVudiIKKyAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworCisgICAgICAgICAgICAgIHRlc3RzX2FyZz0kKGVjaG8gJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9IHwgc2VkIC1lICJzLywvIC9nIikKKworICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgIGlmICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfTsgdGhlbgorICAgICAgICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZV9hcmc9Ii14IgorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICAgIGlmIGZhbHNlOyB0aGVuCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYiCisgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgdXBncmFkZV9hcmc9IiIKKyAgICAgICAgICAgICAgaWYgZmFsc2U7IHRoZW4KKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iLS1leGVjdXRlLXVwZ3JhZGUtdGVzdHMgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCIKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgJHZub2Rlc19hcmdzIC0tY291bnQ9JGNvdW50ICRzdG9wX29uX2ZhaWx1cmVfYXJnICR1cGdyYWRlX2FyZyAtLWxvZy1jbGktbGV2ZWw9REVCVUcgLS1qdW5pdC14bWw9L3RtcC9yZXN1bHRzL2R0ZXN0cy9weXRlc3RfcmVzdWx0LnhtbCAtcyAtLWNhc3NhbmRyYS1kaXI9L2hvbWUvY2Fzc2FuZHJhL2Nhc3NhbmRyYSAtLWtlZXAtdGVzdC1kaXIgLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAkdGVzdHNfYXJnIHwgdGVlIC90bXAvZHRlc3Qvc3Rkb3V0LnR4dAorICAgICAgICAgICAgZmkKKyAgICAgICAgICBmaQorICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3QKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogZHRlc3RfbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxN191dGVzdHNfbG9uZ19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMTpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfTE9OR30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9bG9uZy10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBsb25nLXRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xNy1vcGVuamRrLWFtZDY0CisgIGoxMV91dGVzdHNfbG9uZ19yZXBlYXQ6CisgICAgZG9ja2VyOgorICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBwYXJhbGxlbGlzbTogMjUKKyAgICBzdGVwczoKKyAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogTG9nIEVudmlyb25tZW50IEluZm9ybWF0aW9uCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBlY2hvICcqKiogaWQgKioqJworICAgICAgICAgIGlkCisgICAgICAgICAgZWNobyAnKioqIGNhdCAvcHJvYy9jcHVpbmZvICoqKicKKyAgICAgICAgICBjYXQgL3Byb2MvY3B1aW5mbworICAgICAgICAgIGVjaG8gJyoqKiBmcmVlIC1tICoqKicKKyAgICAgICAgICBmcmVlIC1tCisgICAgICAgICAgZWNobyAnKioqIGRmIC1tICoqKicKKyAgICAgICAgICBkZiAtbQorICAgICAgICAgIGVjaG8gJyoqKiBpZmNvbmZpZyAtYSAqKionCisgICAgICAgICAgaWZjb25maWcgLWEKKyAgICAgICAgICBlY2hvICcqKiogdW5hbWUgLWEgKioqJworICAgICAgICAgIHVuYW1lIC1hCisgICAgICAgICAgZWNobyAnKioqIG1vdW50ICoqKicKKyAgICAgICAgICBtb3VudAorICAgICAgICAgIGVjaG8gJyoqKiBlbnYgKioqJworICAgICAgICAgIGVudgorICAgICAgICAgIGVjaG8gJyoqKiBqYXZhICoqKicKKyAgICAgICAgICB3aGljaCBqYXZhCisgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBSZXBlYXRlZGx5IHJ1biBuZXcgb3IgbW9kaWZlZCBKVW5pdCB0ZXN0cworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisgICAgICAgIGNvbW1hbmQ6ICJzZXQgLXhcbmV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRIXG50aW1lIG12IH4vY2Fzc2FuZHJhIC90bXBcbmNkIC90bXAvY2Fzc2FuZHJhXG5pZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuXG4gIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvXG5maVxuXG4jIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLlxuY291bnQ9JCgoJHtSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVH0gLyBDSVJDTEVfTk9ERV9UT1RBTCkpXG5pZiAoKCRDSVJDTEVfTk9ERV9JTkRFWCA8ICgke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfSAlIENJUkNMRV9OT0RFX1RPVEFMKSkpOyB0aGVuXG4gIGNvdW50PSQoKGNvdW50KzEpKVxuZmlcblxuIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzXG50ZXN0cz0kKGVjaG8gJHtSRVBFQVRFRF9VVEVTVFNfTE9OR30gfCBzZWQgLWUgXCJzLzxuaWw+Ly9cIiB8IHNlZCAtZSBcInMvIC8vXCIgfCB0ciBcIixcIiBcIlxcblwiIHwgdHIgXCIgXCIgXCJcXG5cIiB8IHNvcnQgLW4gfCB1bmlxIC11KVxuZWNobyBcIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfVwiXG5cbiMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsLlxudm5vZGVzPWZhbHNlXG52bm9kZXNfYXJncz1cIlwiXG5pZiBbIFwiJHZub2Rlc1wiID0gdHJ1ZSBdIDsgdGhlblxuICB2bm9kZXNfYXJncz1cIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNidcIlxuZmlcblxuIyBQcmVwYXJlIHRoZSB0ZXN0dGFnIGZvciB0aGUgdGFyZ2V0LCB1c2VkIGJ5IHRoZSB0ZXN0IG1hY3JvIGluIGJ1aWxkLnhtbCB0byBncm91cCB0aGUgb3V0cHV0IGZpbGVzXG50YXJnZXQ9bG9uZy10ZXN0c29tZVxudGVzdHRhZz1cIlwiXG5pZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1jZGNcIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY2RjXCJcbmVsaWYgW1sgJHRhcmdldCA9PSBcInRlc3QtY29tcHJlc3Npb25cIiBdXTsgdGhlblxuICB0ZXN0dGFnPVwiY29tcHJlc3Npb25cIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5XCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlcIlxuZWxpZiBbWyAkdGFyZ2V0ID09IFwidGVzdC10cmllXCIgXV07IHRoZW5cbiAgdGVzdHRhZz1cInRyaWVcIlxuZmlcblxuIyBSdW4gZWFjaCB0ZXN0IGNsYXNzIGFzIG1hbnkgdGltZXMgYXMgcmVxdWVzdGVkLlxuZXhpdF9jb2RlPVwiJD9cIlxuZm9yIHRlc3QgaW4gJHRlc3RzOyBkb1xuXG4gICAgIyBTcGxpdCBjbGFzcyBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhlIHRlc3QgbmFtZVxuICAgIGlmIFtbICR0ZXN0ID1+IFwiI1wiIF1dOyB0aGVuXG4gICAgICBjbGFzcz0ke3Rlc3QlXCIjXCIqfVxuICAgICAgbWV0aG9kPSR7dGVzdCMqXCIjXCJ9XG4gICAgZWxzZVxuICAgICAgY2xhc3M9JHRlc3RcbiAgICAgIG1ldGhvZD1cIlwiXG4gICAgZmlcblxuICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuXG4gICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC5cbiAgICBpZiBbWyAkdGFyZ2V0ID09IFwidGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtY2RjXCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1jb21wcmVzc2lvblwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3QtdHJpZVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeVwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImZxbHRvb2wtdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcImxvbmctdGVzdFwiIHx8IFxcXG4gICAgICAgICAgJHRhcmdldCA9PSBcInN0cmVzcy10ZXN0XCIgfHwgXFxcbiAgICAgICAgICAkdGFyZ2V0ID09IFwidGVzdC1zaW11bGF0b3ItZHRlc3RcIiBdXTsgdGhlblxuICAgICAgbmFtZV9hcmc9XCItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn1cIlxuICAgIGVsc2VcbiAgICAgIG5hbWVfYXJnPVwiLUR0ZXN0Lm5hbWU9JGNsYXNzXCJcbiAgICBmaVxuXG4gICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWxcbiAgICBpZiBbWyAkbWV0aG9kID09IFwiXCIgXV07IHRoZW5cbiAgICAgIG1ldGhvZHNfYXJnPVwiXCJcbiAgICBlbHNlXG4gICAgICBtZXRob2RzX2FyZz1cIi1EdGVzdC5tZXRob2RzPSRtZXRob2RcIlxuICAgIGZpXG5cbiAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvXG4gICAgICBlY2hvIFwiUnVubmluZyB0ZXN0ICR0ZXN0LCBpdGVyYXRpb24gJGkgb2YgJGNvdW50XCJcblxuICAgICAgIyBydW4gdGhlIHRlc3RcbiAgICAgIHN0YXR1cz1cInBhc3Nlc1wiXG4gICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgXFxcbiAgICAgICAgICAgIGFudCBsb25nLXRlc3Rzb21lICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXFxcbiAgICAgICAgICAgIHRlZSBzdGRvdXQudHh0IFxcXG4gICAgICAgICAgKTsgdGhlblxuICAgICAgICBzdGF0dXM9XCJmYWlsc1wiXG4gICAgICAgIGV4aXRfY29kZT0xXG4gICAgICBmaVxuXG4gICAgICAjIG1vdmUgdGhlIHN0ZG91dCBvdXRwdXQgZmlsZVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL3N0ZG91dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvJHt0ZXN0fS50eHRcblxuICAgICAgIyBtb3ZlIHRoZSBYTUwgb3V0cHV0IGZpbGVzXG4gICAgICBzb3VyY2U9YnVpbGQvdGVzdC9vdXRwdXQvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL291dHB1dC8ke3N0YXR1c30vJHtpfVxuICAgICAgbWtkaXIgLXAgJGRlc3RcbiAgICAgIGlmIFtbIC1kICRzb3VyY2UgJiYgLW4gXCIkKGxzICRzb3VyY2UpXCIgXV07IHRoZW5cbiAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0L1xuICAgICAgZmlcblxuICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXNcbiAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfVxuICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX1cbiAgICAgIG1rZGlyIC1wICRkZXN0XG4gICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uIFwiJChscyAkc291cmNlKVwiIF1dOyB0aGVuXG4gICAgICAgIG12ICRzb3VyY2UvKiAkZGVzdC9cbiAgICAgIGZpXG4gICAgICBcbiAgICAgICMgbWF5YmUgc3RvcCBpdGVyYXRpb25zIG9uIHRlc3QgZmFpbHVyZVxuICAgICAgaWYgW1sgJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9ID0gdHJ1ZSBdXSAmJiAoKCAkZXhpdF9jb2RlID4gMCApKTsgdGhlblxuICAgICAgICBicmVha1xuICAgICAgZmlcbiAgICBkb25lXG5kb25lXG4oZXhpdCAke2V4aXRfY29kZX0pXG4iCisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0CisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgIGRlc3RpbmF0aW9uOiBzdGRvdXQKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICBkZXN0aW5hdGlvbjogbG9ncworICAgIGVudmlyb25tZW50OgorICAgIC0gQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgLSBMQU5HOiBlbl9VUy5VVEYtOAorICAgIC0gS0VFUF9URVNUX0RJUjogdHJ1ZQorICAgIC0gREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICAtIFBZVEhPTklPRU5DT0RJTkc6IHV0Zi04CisgICAgLSBQWVRIT05VTkJVRkZFUkVEOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgLSBDQVNTX0RSSVZFUl9OT19DWVRIT046IHRydWUKKyAgICAtIENBU1NBTkRSQV9TS0lQX1NZTkM6IHRydWUKKyAgICAtIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIC0gRFRFU1RfQlJBTkNIOiB0cnVuaworICAgIC0gQ0NNX01BWF9IRUFQX1NJWkU6IDEwMjRNCisgICAgLSBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisgICAgLSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9VVEVTVFM6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogbnVsbAorICAgIC0gUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfVVRFU1RTX0xPTkc6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6IG51bGwKKyAgICAtIFJFUEVBVEVEX1VURVNUU19TVFJFU1NfQ09VTlQ6IDUwMAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVDogNTAwCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfRFRFU1RTX0NPVU5UOiA1MDAKKyAgICAtIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogbnVsbAorICAgIC0gUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UOiAxMDAKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAtIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiBudWxsCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM6IGZhbHNlCisgICAgLSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVDogNTAwCisgICAgLSBKQVZBX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTExLW9wZW5qZGstYW1kNjQKKyAgICAtIEpES19IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0Cit3b3JrZmxvd3M6CisgIHZlcnNpb246IDIKKyAgamF2YTExX3NlcGFyYXRlX3Rlc3RzOgorICAgIGpvYnM6CisgICAgLSBzdGFydF9qMTFfYnVpbGQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfYnVpbGQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3VuaXRfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX3VuaXRfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9qdm1fZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2p2bV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9qdm1fZHRlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0c192bm9kZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2NxbHNobGliX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl9jeXRob25fdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfbG9uZworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19sb25nOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19sb25nOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmcKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY2RjOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY2RjCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY2RjOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkYworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfdHJpZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfc3RyZXNzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfc3RyZXNzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3RyZXNzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzcworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c192bm9kZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZV92bm9kZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3Zub2RlCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICBqYXZhMTFfcHJlLWNvbW1pdF90ZXN0czoKKyAgICBqb2JzOgorICAgIC0gc3RhcnRfcHJlLWNvbW1pdF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9idWlsZDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfcHJlLWNvbW1pdF90ZXN0cworICAgIC0gajExX3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX3NpbXVsYXRvcl9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2p2bV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19sb25nCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19sb25nCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfY2RjOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jZGMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfY2RjOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3MKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfc3RyZXNzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19sYXJnZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9jcWxzaF9kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgamF2YTE3X3NlcGFyYXRlX3Rlc3RzOgorICAgIGpvYnM6CisgICAgLSBzdGFydF9qMTdfYnVpbGQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfYnVpbGQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3VuaXRfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3VuaXRfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c192bm9kZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNobGliX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0cworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfdm5vZGUKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGUKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfbG9uZzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19sb25nCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY2RjOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkYworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c190cmllCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3RyZXNzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzcworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5CisgICAgICAgIC0gajE3X2J1aWxkCisgIGphdmExN19wcmUtY29tbWl0X3Rlc3RzOgorICAgIGpvYnM6CisgICAgLSBzdGFydF9wcmUtY29tbWl0X3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2J1aWxkOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9wcmUtY29tbWl0X3Rlc3RzCisgICAgLSBqMTdfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfbG9uZzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2xvbmcKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NkYworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzcworICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sCisgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgLSBqMTdfYnVpbGQKZGlmZiAtLWdpdCBhLy5jaXJjbGVjaS9jb25maWdfdGVtcGxhdGUueW1sIGIvLmNpcmNsZWNpL2NvbmZpZ190ZW1wbGF0ZS55bWwKaW5kZXggNDM2N2JkYy4uMjliNmVlMCAxMDA2NDQKLS0tIGEvLmNpcmNsZWNpL2NvbmZpZ190ZW1wbGF0ZS55bWwKKysrIGIvLmNpcmNsZWNpL2NvbmZpZ190ZW1wbGF0ZS55bWwKQEAgLTI4LDggKzI4LDYgQEAKICAgICAjIHBsZWFzZSByZW1lbWJlciB0byBtb2RpZnkgdGhlIGdlbmVyYXRlLnNoIHNjcmlwdCBhbmQgdGhlIGRvY3VtZW50YXRpb24gYWNjb3JkaW5nbHkuCiAKICAgICBBTlRfSE9NRTogL3Vzci9zaGFyZS9hbnQKLSAgICBKQVZBMTFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAotICAgIEpBVkE4X0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTgtb3Blbmpkay1hbWQ2NAogICAgIExBTkc6IGVuX1VTLlVURi04CiAgICAgS0VFUF9URVNUX0RJUjogdHJ1ZQogICAgIERFRkFVTFRfRElSOiAvaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhLWR0ZXN0CkBAIC0xMzYsNiArMTM0LDcgQEAKICAgICAjIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdC1qdm0tZHRlc3Qtc29tZQogICAgICMgUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0LWNkYwogICAgICMgUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0LWNvbXByZXNzaW9uCisgICAgIyBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3QtdHJpZQogICAgICMgUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkKICAgICBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCiAgICAgIyBUaGUgbmFtZSBvZiBKVW5pdCBjbGFzcyB0byBiZSBydW4gbXVsdGlwbGUgdGltZXMsIGZvciBleGFtcGxlOgpAQCAtNDM0LDYgKzQzMywzMCBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0CiAgICAgICAgICAgLSBqOF9idWlsZAorICAgIC0gc3RhcnRfajhfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqOF91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qOF91dGVzdHNfdHJpZQorICAgICAgICAgIC0gajhfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBzdGFydF9qOF91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqOF91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajhfdXRlc3RzX3RyaWVfcmVwZWF0CisgICAgICAgICAgLSBqOF9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllX3JlcGVhdAorICAgICAgICAgIC0gajhfYnVpbGQKICAgICAtIHN0YXJ0X2o4X3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqOF91dGVzdHNfc3RyZXNzOgpAQCAtODgyLDYgKzkwNSwyNCBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgogICAgICAgICAgIC0gajhfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c190cmllOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajhfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBqOF91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGo4X2J1aWxkCisgICAgLSBqMTFfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgICAgLSBqOF9idWlsZAogICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzczoKICAgICAgICAgdHlwZTogYXBwcm92YWwKICAgICAtIGo4X3V0ZXN0c19zdHJlc3M6CkBAIC0xMTUzLDYgKzExOTQsMTggQEAKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0c192bm9kZV9yZXBlYXQKICAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3NpbXVsYXRvcl9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0c19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfc2ltdWxhdG9yX2R0ZXN0c19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKICAgICAtIHN0YXJ0X2oxMV9jcWxzaGxpYl90ZXN0czoKICAgICAgICAgdHlwZTogYXBwcm92YWwKICAgICAtIGoxMV9jcWxzaGxpYl90ZXN0czoKQEAgLTEyOTEsNiArMTM0NCwxOCBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0CiAgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCiAgICAgLSBzdGFydF9qMTFfdXRlc3RzX3N0cmVzczoKICAgICAgICAgdHlwZTogYXBwcm92YWwKICAgICAtIGoxMV91dGVzdHNfc3RyZXNzOgpAQCAtMTM3Myw2ICsxNDM4LDEyIEBACiAgICAgLSBqMTFfanZtX2R0ZXN0c192bm9kZV9yZXBlYXQ6CiAgICAgICAgIHJlcXVpcmVzOgogICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKICAgICAtIGoxMV9jcWxzaGxpYl90ZXN0czoKICAgICAgICAgcmVxdWlyZXM6CiAgICAgICAgICAgLSBqMTFfYnVpbGQKQEAgLTE0ODQsNiArMTU1NSwxNiBAQAogICAgICAgICByZXF1aXJlczoKICAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgogICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgICAgLSBqMTFfYnVpbGQKICAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3M6CiAgICAgICAgIHR5cGU6IGFwcHJvdmFsCiAgICAgLSBqMTFfdXRlc3RzX3N0cmVzczoKQEAgLTE2MDYsNiArMTY4NywxNSBAQAogICAgICAgLSBsb2dfZW52aXJvbm1lbnQKICAgICAgIC0gcnVuX3NpbXVsYXRvcl90ZXN0cwogCisgIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgIDw8OiAqajExX3NtYWxsX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3NpbXVsYXRvcl90ZXN0cworCiAgIGo4X2p2bV9kdGVzdHM6CiAgICAgPDw6ICpqOF9zbWFsbF9wYXJfZXhlY3V0b3IKICAgICBzdGVwczoKQEAgLTE3NjYsNiArMTg1NiwyNiBAQAogICAgICAgLSBydW5fcGFyYWxsZWxfanVuaXRfdGVzdHM6CiAgICAgICAgICAgdGFyZ2V0OiB0ZXN0Y2xhc3NsaXN0LWNvbXByZXNzaW9uCiAKKyAgajhfdXRlc3RzX3RyaWU6CisgICAgPDw6ICpqOF9wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNyZWF0ZV9qdW5pdF9jb250YWluZXJzCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fcGFyYWxsZWxfanVuaXRfdGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiB0ZXN0Y2xhc3NsaXN0LXRyaWUKKworICBqMTFfdXRlc3RzX3RyaWU6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdGNsYXNzbGlzdC10cmllCisKICAgajhfdXRlc3RzX3N0cmVzczoKICAgICA8PDogKmo4X3NlcV9leGVjdXRvcgogICAgIHN0ZXBzOgpAQCAtMjMyOSw2ICsyNDM5LDIyIEBACiAgICAgICAtIGxvZ19lbnZpcm9ubWVudAogICAgICAgLSBydW5fdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdAogCisgIGo4X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICA8PDogKmo4X3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3V0ZXN0c190cmllX3JlcGVhdAorCisgIGoxMV91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgPDw6ICpqMTFfcmVwZWF0ZWRfdXRlc3RfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fdXRlc3RzX3RyaWVfcmVwZWF0CisKICAgajhfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0OgogICAgIDw8OiAqajhfcmVwZWF0ZWRfdXRlc3RfZXhlY3V0b3IKICAgICBzdGVwczoKQEAgLTI0MTcsNiArMjU0MywxNCBAQAogICAgICAgLSBsb2dfZW52aXJvbm1lbnQKICAgICAgIC0gcnVuX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0CiAKKyAgajExX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0OgorICAgIDw8OiAqajExX3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0CisKICAgajhfanZtX3VwZ3JhZGVfZHRlc3RzX3JlcGVhdDoKICAgICA8PDogKmo4X3JlcGVhdGVkX2p2bV91cGdyYWRlX2R0ZXN0X2V4ZWN1dG9yCiAgICAgc3RlcHM6CkBAIC0zMDUzLDYgKzMxODcsMTQgQEAKICAgICAgICAgICBjb3VudDogJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9CiAgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KIAorICBydW5fdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgIHN0ZXBzOgorICAgICAgLSBydW5fcmVwZWF0ZWRfdXRlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdC10cmllCisgICAgICAgICAgdGVzdHM6ICR7UkVQRUFURURfVVRFU1RTfQorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX1VURVNUU19DT1VOVH0KKyAgICAgICAgICBzdG9wX29uX2ZhaWx1cmU6ICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfQorCiAgIHJ1bl91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQ6CiAgICAgc3RlcHM6CiAgICAgICAtIHJ1bl9yZXBlYXRlZF91dGVzdHM6CkBAIC0zMTU1LDcgKzMyOTcsNyBAQAogICAgICAgICAgICAgIyBQdXQgbWFudWFsbHkgc3BlY2lmaWVkIHRlc3RzIGFuZCBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHRlc3RzIHRvZ2V0aGVyLCByZW1vdmluZyBkdXBsaWNhdGVzCiAgICAgICAgICAgICB0ZXN0cz0kKGVjaG8gPDxwYXJhbWV0ZXJzLnRlc3RzPj4gfCBzZWQgLWUgInMvPG5pbD4vLyIgfCBzZWQgLWUgInMvIC8vIiB8IHRyICIsIiAiXG4iIHwgdHIgIiAiICJcbiIgfCBzb3J0IC1uIHwgdW5pcSAtdSkKICAgICAgICAgICAgIGVjaG8gIlRlc3RzIHRvIGJlIHJlcGVhdGVkOiAke3Rlc3RzfSIKLQorICAgICAgICAgICAgCiAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC4KICAgICAgICAgICAgIHZub2Rlcz08PHBhcmFtZXRlcnMudm5vZGVzPj4KICAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCkBAIC0zMTcyLDYgKzMzMTQsOCBAQAogICAgICAgICAgICAgICB0ZXN0dGFnPSJjb21wcmVzc2lvbiIKICAgICAgICAgICAgIGVsaWYgW1sgJHRhcmdldCA9PSAidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5IiBdXTsgdGhlbgogICAgICAgICAgICAgICB0ZXN0dGFnPSJzeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5IgorICAgICAgICAgICAgZWxpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0LXRyaWUiIF1dOyB0aGVuCisgICAgICAgICAgICAgIHRlc3R0YWc9InRyaWUiCiAgICAgICAgICAgICBmaQogCiAgICAgICAgICAgICAjIFJ1biBlYWNoIHRlc3QgY2xhc3MgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQuCkBAIC0zMTkyLDYgKzMzMzYsNyBAQAogICAgICAgICAgICAgICAgIGlmIFtbICR0YXJnZXQgPT0gInRlc3QiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNkYyIgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXRyaWUiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJmcWx0b29sLXRlc3QiIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJsb25nLXRlc3QiIHx8IFwKQEAgLTMzMTgsNiArMzQ2Myw3IEBACiAgICAgICAgICAgICAgICAgaWYgW1sgJHRhcmdldCA9PSAidGVzdCIgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtY2RjIiB8fCBcCiAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jb21wcmVzc2lvbiIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3QtdHJpZSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gInRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeSIgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImZxbHRvb2wtdGVzdCIgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPT0gImxvbmctdGVzdCIgfHwgXApkaWZmIC0tZ2l0IGEvLmNpcmNsZWNpL2NvbmZpZ190ZW1wbGF0ZS55bWwuUEFJRC5wYXRjaCBiLy5jaXJjbGVjaS9jb25maWdfdGVtcGxhdGUueW1sLlBBSUQucGF0Y2gKaW5kZXggMDk4Y2NkMi4uZGFhYWQyZiAxMDA2NDQKLS0tIGEvLmNpcmNsZWNpL2NvbmZpZ190ZW1wbGF0ZS55bWwuUEFJRC5wYXRjaAorKysgYi8uY2lyY2xlY2kvY29uZmlnX3RlbXBsYXRlLnltbC5QQUlELnBhdGNoCkBAIC0xLDYgKzEsNiBAQAotLS0tIGNvbmZpZy0yXzEueW1sCTIwMjMtMDItMDIgMjE6MjQ6MzkuMDAwMDAwMDAwIC0wNTAwCi0rKysgY29uZmlnLTJfMS55bWwuTUlEUkVTCTIwMjMtMDItMDIgMjE6MjU6MDUuMDAwMDAwMDAwIC0wNTAwCi1AQCAtMTU3LDE0ICsxNTcsMTQgQEAKKy0tLSBjb25maWdfdGVtcGxhdGUueW1sCTIwMjMtMDMtMTAgMDk6NDc6MDUuNTUyMTY1MDM2IC0wNjAwCisrKysgY29uZmlnX3RlbXBsYXRlLnltbC5QQUlECTIwMjMtMDMtMTAgMDk6NTE6MjEuMTc0MDcxNTc2IC0wNjAwCitAQCAtMTU2LDE0ICsxNTYsMTQgQEAKICBqOF9wYXJfZXhlY3V0b3I6ICZqOF9wYXJfZXhlY3V0b3IKICAgIGV4ZWN1dG9yOgogICAgICBuYW1lOiBqYXZhOC1leGVjdXRvcgpAQCAtMTksNyArMTksNyBAQAogIAogIGo4X3NtYWxsX2V4ZWN1dG9yOiAmajhfc21hbGxfZXhlY3V0b3IKICAgIGV4ZWN1dG9yOgotQEAgLTE3MiwyOSArMTcyLDQxIEBACitAQCAtMTcxLDI5ICsxNzEsNDEgQEAKICAgICAgZXhlY19yZXNvdXJjZV9jbGFzczogbWVkaXVtCiAgICBwYXJhbGxlbGlzbTogMQogIApAQCAtMzIsNyArMzIsNyBAQAogK2o4X3ZlcnlfbGFyZ2VfcGFyX2V4ZWN1dG9yOiAmajhfdmVyeV9sYXJnZV9wYXJfZXhlY3V0b3IKICsgIGV4ZWN1dG9yOgogKyAgICBuYW1lOiBqYXZhOC1leGVjdXRvcgotKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKysgICAgZXhlY19yZXNvdXJjZV9jbGFzczogbGFyZ2UKICsgIHBhcmFsbGVsaXNtOiAxMDAKICsKICBqOF9tZWRpdW1fcGFyX2V4ZWN1dG9yOiAmajhfbWVkaXVtX3Bhcl9leGVjdXRvcgpAQCAtNjgsNyArNjgsNyBAQAogIAogIGoxMV9zbWFsbF9leGVjdXRvcjogJmoxMV9zbWFsbF9leGVjdXRvcgogICAgZXhlY3V0b3I6Ci1AQCAtMjA1LDQ0ICsyMTcsNTYgQEAKK0BAIC0yMDQsNDQgKzIxNiw1NiBAQAogIGoxMV9tZWRpdW1fcGFyX2V4ZWN1dG9yOiAmajExX21lZGl1bV9wYXJfZXhlY3V0b3IKICAgIGV4ZWN1dG9yOgogICAgICBuYW1lOiBqYXZhMTEtZXhlY3V0b3IKQEAgLTEzNCw3ICsxMzQsNyBAQAogIAogIGo4X3NlcGFyYXRlX2pvYnM6ICZqOF9zZXBhcmF0ZV9qb2JzCiAgICBqb2JzOgotQEAgLTE4MTksNyArMTg0Myw3IEBACitAQCAtMTkyOSw3ICsxOTUzLDcgQEAKICAgICAgICAgICAgdGFyZ2V0OiB0ZXN0Y2xhc3NsaXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkKICAKICAgIGo4X2R0ZXN0c192bm9kZToKQEAgLTE0Myw3ICsxNDMsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0xODMzLDcgKzE4NTcsNyBAQAorQEAgLTE5NDMsNyArMTk2Nyw3IEBACiAgICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJwogIAogICAgajhfZHRlc3RzX29mZmhlYXA6CkBAIC0xNTIsNyArMTUyLDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTg0Nyw3ICsxODcxLDcgQEAKK0BAIC0xOTU3LDcgKzE5ODEsNyBAQAogICAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCiAgCiAgICBqMTFfZHRlc3RzX3Zub2RlOgpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgIHN0ZXBzOgogICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTg2Miw3ICsxODg2LDcgQEAKK0BAIC0xOTcyLDcgKzE5OTYsNyBAQAogICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCiAgCiAgICBqMTFfZHRlc3RzX29mZmhlYXA6CkBAIC0xNzAsNyArMTcwLDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTg3Nyw3ICsxOTAxLDcgQEAKK0BAIC0xOTg3LDcgKzIwMTEsNyBAQAogICAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCiAgCiAgICBqOF9kdGVzdHM6CkBAIC0xNzksNyArMTc5LDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTg5MSw3ICsxOTE1LDcgQEAKK0BAIC0yMDAxLDcgKzIwMjUsNyBAQAogICAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCiAgCiAgICBqMTFfZHRlc3RzOgpAQCAtMTg4LDcgKzE4OCw3IEBACiAgICAgIHN0ZXBzOgogICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTkwNiw3ICsxOTMwLDcgQEAKK0BAIC0yMDE2LDcgKzIwNDAsNyBAQAogICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJwogIAogICAgajhfdXBncmFkZV9kdGVzdHM6CkBAIC0xOTcsNyArMTk3LDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTkyMCw3ICsxOTQ0LDcgQEAKK0BAIC0yMDMwLDcgKzIwNTQsNyBAQAogICAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tZXhlY3V0ZS11cGdyYWRlLXRlc3RzLW9ubHkgLS11cGdyYWRlLXRhcmdldC12ZXJzaW9uLW9ubHkgLS11cGdyYWRlLXZlcnNpb24tc2VsZWN0aW9uIGFsbCcKICAKICAgIGo4X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CkBAIC0yMDYsNyArMjA2LDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTkzNSw3ICsxOTU5LDcgQEAKK0BAIC0yMDQ1LDcgKzIwNjksNyBAQAogICAgICAgICAgICBleHRyYV9lbnZfYXJnczogJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYnCiAgCiAgICBqOF9jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMTk1MCw3ICsxOTc0LDcgQEAKK0BAIC0yMDYwLDcgKzIwODQsNyBAQAogICAgICAgICAgICBleHRyYV9lbnZfYXJnczogJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYnCiAgCiAgICBqOF9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKQEAgLTIyNCw3ICsyMjQsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0xOTY4LDcgKzE5OTIsNyBAQAorQEAgLTIwNzgsNyArMjEwMiw3IEBACiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JwogIAogICAgajhfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgpAQCAtMjMzLDcgKzIzMyw3IEBACiAgICAgIHN0ZXBzOgogICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKICAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQotQEAgLTE5ODYsNyArMjAxMCw3IEBACitAQCAtMjA5Niw3ICsyMTIwLDcgQEAKICAgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjExJwogIAogICAgajhfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKQEAgLTI0Miw3ICsyNDIsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMDA0LDcgKzIwMjgsNyBAQAorQEAgLTIxMTQsNyArMjEzOCw3IEBACiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JwogIAogICAgajhfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CkBAIC0yNTEsNyArMjUxLDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMjAyMiw3ICsyMDQ2LDcgQEAKK0BAIC0yMTMyLDcgKzIxNTYsNyBAQAogICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCiAgCiAgICBqOF9jcWxzaF9kdGVzdHNfcHkzOgpAQCAtMjYwLDcgKzI2MCw3IEBACiAgICAgIHN0ZXBzOgogICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKICAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQotQEAgLTIwMzcsNyArMjA2MSw3IEBACitAQCAtMjE0Nyw3ICsyMTcxLDcgQEAKICAgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JwogIAogICAgajhfY3Fsc2hfZHRlc3RzX3B5Mzg6CkBAIC0yNjksNyArMjY5LDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMjA1NSw3ICsyMDc5LDcgQEAKK0BAIC0yMTY1LDcgKzIxODksNyBAQAogICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKICAKICAgIGo4X2NxbHNoX2R0ZXN0c19weTMxMToKQEAgLTI3OCw3ICsyNzgsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMDczLDcgKzIwOTcsNyBAQAorQEAgLTIxODMsNyArMjIwNyw3IEBACiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKICAKICAgIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgpAQCAtMjg3LDcgKzI4Nyw3IEBACiAgICAgIHN0ZXBzOgogICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKICAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQotQEAgLTIwODgsNyArMjExMiw3IEBACitAQCAtMjE5OCw3ICsyMjIyLDcgQEAKICAgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JwogIAogICAgajExX2NxbHNoX2R0ZXN0c19weTNfb2ZmaGVhcDoKQEAgLTI5Niw3ICsyOTYsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMTAzLDcgKzIxMjcsNyBAQAorQEAgLTIyMTMsNyArMjIzNyw3IEBACiAgICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKICAKICAgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKQEAgLTMwNSw3ICszMDUsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMTIxLDcgKzIxNDUsNyBAQAorQEAgLTIyMzEsNyArMjI1NSw3IEBACiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JwogIAogICAgajExX2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKQEAgLTMxNCw3ICszMTQsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMTM5LDcgKzIxNjMsNyBAQAorQEAgLTIyNDksNyArMjI3Myw3IEBACiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKICAKICAgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgpAQCAtMzIzLDcgKzMyMyw3IEBACiAgICAgIHN0ZXBzOgogICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKICAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQotQEAgLTIxNTcsNyArMjE4MSw3IEBACitAQCAtMjI2Nyw3ICsyMjkxLDcgQEAKICAgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjgnCiAgCiAgICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CkBAIC0zMzIsNyArMzMyLDcgQEAKICAgICAgc3RlcHM6CiAgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgogICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCi1AQCAtMjE3NSw3ICsyMTk5LDcgQEAKK0BAIC0yMjg1LDcgKzIzMDksNyBAQAogICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCiAgCiAgICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzoKQEAgLTM0MSw3ICszNDEsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMTkwLDcgKzIyMTQsNyBAQAorQEAgLTIzMDAsNyArMjMyNCw3IEBACiAgICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKICAKICAgIGoxMV9jcWxzaF9kdGVzdHNfcHkzODoKQEAgLTM1MCw3ICszNTAsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMjA4LDcgKzIyMzIsNyBAQAorQEAgLTIzMTgsNyArMjM0Miw3IEBACiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JwogIAogICAgajExX2NxbHNoX2R0ZXN0c19weTMxMToKQEAgLTM1OSw3ICszNTksNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMjI2LDcgKzIyNTAsNyBAQAorQEAgLTIzMzYsNyArMjM2MCw3IEBACiAgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKICAKICAgIGo4X2R0ZXN0c19sYXJnZV92bm9kZToKQEAgLTM2OCw3ICszNjgsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMjQwLDcgKzIyNjQsNyBAQAorQEAgLTIzNTAsNyArMjM3NCw3IEBACiAgICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJwogIAogICAgajhfZHRlc3RzX2xhcmdlOgpAQCAtMzc3LDcgKzM3Nyw3IEBACiAgICAgIHN0ZXBzOgogICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKICAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQotQEAgLTIyNTQsNyArMjI3OCw3IEBACitAQCAtMjM2NCw3ICsyMzg4LDcgQEAKICAgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJwogIAogICAgajExX2R0ZXN0c19sYXJnZV92bm9kZToKQEAgLTM4Niw3ICszODYsNyBAQAogICAgICBzdGVwczoKICAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CiAgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKLUBAIC0yMjY4LDcgKzIyOTIsNyBAQAorQEAgLTIzNzgsNyArMjQwMiw3IEBACiAgICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJwogIAogICAgajExX2R0ZXN0c19sYXJnZToKZGlmZiAtLWdpdCBhLy5jaXJjbGVjaS9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbCBiLy5jaXJjbGVjaS9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWFkOTFjCi0tLSAvZGV2L251bGwKKysrIGIvLmNpcmNsZWNpL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sCkBAIC0wLDAgKzEsMzQ1MSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKwordmVyc2lvbjogMi4xCisKK2RlZmF1bHRfZW52X3ZhcnM6ICZkZWZhdWx0X2Vudl92YXJzCisKKyAgICAjIFRoZSB2YWx1ZXMgb2Ygc29tZSBvZiB0aGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIG1lYW50IHRvIGJlIGZyZXF1ZW50bHkgY2hhbmdlZCBieSBkZXZlbG9wZXJzLgorICAgICMgVGhlIGdlbmVyYXRlLnNoIHNjcmlwdCBjb250YWlucyBhIGxpc3Qgb2YgYWNjZXB0ZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgc2hvdWxkIGNvbnRhaW4gc29tZSBvZgorICAgICMgdGhlc2UgdmFyaWFibGVzLiBBbHNvLCBzb21lIHZhcmlhYmxlcyBhcmUgbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uLCBhdCBsZWFzdCBpbgorICAgICMgLmNpcmNsZWNpL3JlYWRtZS5tZCBhbmQgaW4gZG9jL3NvdXJjZS9kZXZlbG9wbWVudC90ZXN0aW5nLnJzdC4KKyAgICAjIElmIHlvdSBtb2RpZnkgdGhlc2UgdmFyaWFibGVzLCBvciBpZiB5b3UgYWRkIG5ldyB2YXJpYWJsZXMgd2hvc2UgdmFsdWVzIGFyZSBtZWFudCB0byBiZSBjaGFuZ2VkIGZyZXF1ZW50bHksCisgICAgIyBwbGVhc2UgcmVtZW1iZXIgdG8gbW9kaWZ5IHRoZSBnZW5lcmF0ZS5zaCBzY3JpcHQgYW5kIHRoZSBkb2N1bWVudGF0aW9uIGFjY29yZGluZ2x5LgorCisgICAgQU5UX0hPTUU6IC91c3Ivc2hhcmUvYW50CisgICAgTEFORzogZW5fVVMuVVRGLTgKKyAgICBLRUVQX1RFU1RfRElSOiB0cnVlCisgICAgREVGQVVMVF9ESVI6IC9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEtZHRlc3QKKyAgICBQWVRIT05JT0VOQ09ESU5HOiB1dGYtOAorICAgIFBZVEhPTlVOQlVGRkVSRUQ6IHRydWUKKyAgICBDQVNTX0RSSVZFUl9OT19FWFRFTlNJT05TOiB0cnVlCisgICAgQ0FTU19EUklWRVJfTk9fQ1lUSE9OOiB0cnVlCisgICAgI1NraXAgYWxsIHN5bmNpbmcgdG8gZGlzayB0byBhdm9pZCBwZXJmb3JtYW5jZSBpc3N1ZXMgaW4gZmxha3kgQ0kgZW52aXJvbm1lbnRzCisgICAgQ0FTU0FORFJBX1NLSVBfU1lOQzogdHJ1ZQorICAgIERURVNUX1JFUE86IGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhLWR0ZXN0LmdpdAorICAgIERURVNUX0JSQU5DSDogdHJ1bmsKKyAgICBDQ01fTUFYX0hFQVBfU0laRTogMTAyNE0KKyAgICBDQ01fSEVBUF9ORVdTSVpFOiAyNTZNCisKKyAgICAjIFdoZXRoZXIgdGhlIHJlcGVhdGVkIHRlc3QgaXRlcmF0aW9ucyBzaG91bGQgc3RvcCBvbiB0aGUgZmlyc3QgZmFpbHVyZSBieSBkZWZhdWx0LgorICAgIFJFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRTogZmFsc2UKKworICAgICMgQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGVzdHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcGVhdGVkIHJ1biBmb3IgcmVndWxhciB1bml0IHRlc3RzLAorICAgICMgaW4gYWRkaXRpb24gdG8gYXV0b21hdGljYWxseSBkZXRlY3RlZCBuZXcgYW5kIG1vZGlmaWVkIHRlc3RzLiBGb3IgZXhhbXBsZToKKyAgICAjIFJFUEVBVEVEX1VURVNUUzogb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5WaWV3VGVzdAorICAgICMgUkVQRUFURURfVVRFU1RTOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlZpZXdUZXN0I3Rlc3RDb3VudGVyc1RhYmxlCisgICAgIyBSRVBFQVRFRF9VVEVTVFM6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVmlld1Rlc3Qsb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVGltZUZjdHNUZXN0CisgICAgUkVQRUFURURfVVRFU1RTOgorICAgICMgVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IG5ldywgbW9kaWZpZWQgb3IgbWFudWFsbHkgc3BlY2lmaWVkIHVuaXQgdGVzdHMgc2hvdWxkIGJlIHJ1bi4KKyAgICBSRVBFQVRFRF9VVEVTVFNfQ09VTlQ6IDUwMAorCisgICAgIyBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0ZXN0cyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVwZWF0ZWQgcnVuIGZvciBmcWx0b29sIHVuaXQgdGVzdHMsCisgICAgIyBpbiBhZGRpdGlvbiB0byBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIG5ldyBhbmQgbW9kaWZpZWQgdGVzdHMuIEZvciBleGFtcGxlOgorICAgICMgUkVQRUFURURfVVRFU1RTX0ZRTFRPT0w6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmZxbHRvb2wuRlFMQ29tcGFyZVRlc3QKKyAgICAjIFJFUEVBVEVEX1VURVNUU19GUUxUT09MOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5mcWx0b29sLkZRTENvbXBhcmVUZXN0I2VuZFRvRW5kCisgICAgIyBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDogb3JnLmFwYWNoZS5jYXNzYW5kcmEuZnFsdG9vbC5GUUxDb21wYXJlVGVzdCxvcmcuYXBhY2hlLmNhc3NhbmRyYS5mcWx0b29sLkZRTFJlcGxheVRlc3QKKyAgICBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTDoKKyAgICAjIFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBuZXcsIG1vZGlmaWVkIG9yIG1hbnVhbGx5IHNwZWNpZmllZCBmcWx0b29sIHVuaXQgdGVzdHMgc2hvdWxkIGJlIHJ1bi4KKyAgICBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTF9DT1VOVDogNTAwCisKKyAgICAjIENvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRlc3RzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXBlYXRlZCBydW4gZm9yIGxvbmcgdW5pdCB0ZXN0cywKKyAgICAjIGluIGFkZGl0aW9uIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgbmV3IGFuZCBtb2RpZmllZCB0ZXN0cy4gRm9yIGV4YW1wbGU6CisgICAgIyBSRVBFQVRFRF9VVEVTVFNfTE9ORzogb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1N0cmVzc1Rlc3QKKyAgICAjIFJFUEVBVEVEX1VURVNUU19MT05HOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nU3RyZXNzVGVzdCN0ZXN0UmFuZG9tU2l6ZQorICAgIFJFUEVBVEVEX1VURVNUU19MT05HOgorICAgICMgVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IG5ldywgbW9kaWZpZWQgb3IgbWFudWFsbHkgc3BlY2lmaWVkIGxvbmcgdW5pdCB0ZXN0cyBzaG91bGQgYmUgcnVuLgorICAgIFJFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UOiAxMDAKKworICAgICMgQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGVzdHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcGVhdGVkIHJ1biBmb3Igc3RyZXNzIHVuaXQgdGVzdHMsCisgICAgIyBpbiBhZGRpdGlvbiB0byBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIG5ldyBhbmQgbW9kaWZpZWQgdGVzdHMuIEZvciBleGFtcGxlOgorICAgICMgUkVQRUFURURfVVRFU1RTX1NUUkVTUzogb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLmdlbmVyYXRlLkRpc3RyaWJ1dGlvbkdhdXNzaWFuVGVzdAorICAgICMgUkVQRUFURURfVVRFU1RTX1NUUkVTUzogb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLmdlbmVyYXRlLkRpc3RyaWJ1dGlvbkdhdXNzaWFuVGVzdCNzaW1wbGVHYXVzc2lhbgorICAgIFJFUEVBVEVEX1VURVNUU19TVFJFU1M6CisgICAgIyBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgbmV3LCBtb2RpZmllZCBvciBtYW51YWxseSBzcGVjaWZpZWQgc3RyZXNzIHVuaXQgdGVzdHMgc2hvdWxkIGJlIHJ1bi4KKyAgICBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UOiA1MDAKKworICAgICMgQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGVzdHMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlcGVhdGVkIHJ1biBmb3Igc2ltdWxhdG9yIGR0ZXN0cywKKyAgICAjIGluIGFkZGl0aW9uIHRvIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgbmV3IGFuZCBtb2RpZmllZCB0ZXN0cy4gRm9yIGV4YW1wbGU6CisgICAgIyBSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IudGVzdC5Ucml2aWFsU2ltdWxhdGlvblRlc3QKKyAgICAjIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci50ZXN0LlRyaXZpYWxTaW11bGF0aW9uVGVzdCN0cml2aWFsVGVzdAorICAgIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM6CisgICAgIyBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgbmV3LCBtb2RpZmllZCBvciBtYW51YWxseSBzcGVjaWZpZWQgc2ltdWxhdG9yIGR0ZXN0cyBzaG91bGQgYmUgcnVuLgorICAgIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlQ6IDUwMAorCisgICAgIyBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0ZXN0cyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVwZWF0ZWQgcnVuIGZvciBKVk0gZHRlc3RzLAorICAgICMgaW4gYWRkaXRpb24gdG8gYXV0b21hdGljYWxseSBkZXRlY3RlZCBuZXcgYW5kIG1vZGlmaWVkIHRlc3RzLiBGb3IgZXhhbXBsZToKKyAgICAjIFJFUEVBVEVEX0pWTV9EVEVTVFM6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3QuUGFnaW5nVGVzdAorICAgICMgUkVQRUFURURfSlZNX0RURVNUUzogb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5QYWdpbmdUZXN0I3Rlc3RQYWdpbmcKKyAgICBSRVBFQVRFRF9KVk1fRFRFU1RTOgorICAgICMgVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IG5ldywgbW9kaWZpZWQgb3IgbWFudWFsbHkgc3BlY2lmaWVkIEpWTSBkdGVzdHMgc2hvdWxkIGJlIHJ1bi4KKyAgICBSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UOiA1MDAKKworICAgICMgQ29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgUHl0aG9uIGR0ZXN0cyB0aGF0IHNob3VsZCBiZSByZXBlYXRlZGx5IHJ1biwgZm9yIGV4YW1wbGU6CisgICAgIyBSRVBFQVRFRF9EVEVTVFM6IGNxbHNoX3Rlc3RzL3Rlc3RfY3Fsc2gucHkKKyAgICAjIFJFUEVBVEVEX0RURVNUUzogY3Fsc2hfdGVzdHMvdGVzdF9jcWxzaC5weTo6VGVzdENxbHNoU21va2UKKyAgICAjIFJFUEVBVEVEX0RURVNUUzogY3Fsc2hfdGVzdHMvdGVzdF9jcWxzaC5weTo6VGVzdENxbHNoU21va2U6OnRlc3RfY3JlYXRlX2luZGV4CisgICAgIyBSRVBFQVRFRF9EVEVTVFM6IGNxbHNoX3Rlc3RzL3Rlc3RfY3Fsc2gucHksY29uc2lzdGVuY3lfdGVzdC5weQorICAgIFJFUEVBVEVEX0RURVNUUzoKKyAgICAjIFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgbWFudWFsbHkgc3BlY2lmaWVkIFB5dGhvbiBkdGVzdHMgc2hvdWxkIGJlIHJ1bi4KKyAgICBSRVBFQVRFRF9EVEVTVFNfQ09VTlQ6IDUwMAorCisgICAgIyBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBQeXRob24gbGFyZ2UgZHRlc3RzIHRoYXQgc2hvdWxkIGJlIHJlcGVhdGVkbHkgcnVuLCBmb3IgZXhhbXBsZToKKyAgICAjIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogcmVwbGFjZV9hZGRyZXNzX3Rlc3QucHkKKyAgICAjIFJFUEVBVEVEX0xBUkdFX0RURVNUUzogcmVwbGFjZV9hZGRyZXNzX3Rlc3QucHk6OlRlc3RSZXBsYWNlQWRkcmVzcworICAgICMgUkVQRUFURURfTEFSR0VfRFRFU1RTOiByZXBsYWNlX2FkZHJlc3NfdGVzdC5weTo6VGVzdFJlcGxhY2VBZGRyZXNzOjp0ZXN0X3JlcGxhY2Vfc3RvcHBlZF9ub2RlCisgICAgIyBSRVBFQVRFRF9MQVJHRV9EVEVTVFM6IHJlcGxhY2VfYWRkcmVzc190ZXN0LnB5LG1hdGVyaWFsaXplZF92aWV3c190ZXN0LnB5CisgICAgUkVQRUFURURfTEFSR0VfRFRFU1RTOgorICAgICMgVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBtYW51YWxseSBzcGVjaWZpZWQgUHl0aG9uIGxhcmdlIGR0ZXN0cyBzaG91bGQgYmUgcnVuLgorICAgIFJFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVDogMTAwCisKKyAgICAjIFRoZSBBbnQgdGVzdCB0YXJnZXQgdG8gcnVuLCBmb3IgZXhhbXBsZToKKyAgICAjIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdHNvbWUKKyAgICAjIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVDogdGVzdC1qdm0tZHRlc3Qtc29tZQorICAgICMgUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0LWNkYworICAgICMgUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0LWNvbXByZXNzaW9uCisgICAgIyBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3QtdHJpZQorICAgICMgUkVQRUFURURfQU5UX1RFU1RfVEFSR0VUOiB0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkKKyAgICBSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVQ6IHRlc3Rzb21lCisgICAgIyBUaGUgbmFtZSBvZiBKVW5pdCBjbGFzcyB0byBiZSBydW4gbXVsdGlwbGUgdGltZXMsIGZvciBleGFtcGxlOgorICAgICMgUkVQRUFURURfQU5UX1RFU1RfQ0xBU1M6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVmlld1Rlc3QKKyAgICAjIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlBhZ2luZ1Rlc3QKKyAgICBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUzoKKyAgICAjIFRoZSBvcHRpb25hbCBzcGVjaWZpYyBtZXRob2RzIHdpdGhpbiBSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUyB0byBiZSBydW4sIGZvciBleGFtcGxlOgorICAgICMgUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzogdGVzdENvbXBvdW5kUGFydGl0aW9uS2V5CisgICAgIyBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTOiB0ZXN0Q29tcG91bmRQYXJ0aXRpb25LZXksdGVzdFN0YXRpY1RhYmxlCisgICAgIyBQbGVhc2Ugbm90ZSB0aGF0IHNvbWUgQW50IHRhcmdldHMgd2lsbCBpZ25vcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50IHByb2R1Y2VkIGJ5IHRoaXMuCisgICAgUkVQRUFURURfQU5UX1RFU1RfTUVUSE9EUzoKKyAgICAjIFdoZXRoZXIgdGhlIHRlc3QgaXRlcmF0aW9uIHNob3VsZCB1c2Ugdm5vZGVzIGZvciBKVk0gZHRlc3RzICgtRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnKS4KKyAgICAjIFRoaXMgd2lsbCBvbmx5IGJlIGFwcGxpZWQgYXMgYSBkZWZhdWx0IHRvIEpWTSBkdGVzdHMgdGhhdCBkb24ndCBwcm92aWRlIHRoZWlyIG93biBpbml0aWFsIHRva2VucyBvciB0b2tlbiBjb3VudCwKKyAgICAjIGluIHRoZSBzYW1lIHdheSB0aGF0IGl0J3MgZG9uZSBmb3IgKl9qdm1fZHRlc3RzX3Zub2RlIGpvYnMuIEFudCB0YXJnZXRzIG90aGVyIHRoYW4gSlZNIGR0ZXN0cyB3aWxsIGlnbm9yZSB0aGlzLgorICAgIFJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUzogZmFsc2UKKyAgICAjIFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUgcmVwZWF0ZWQgSlVuaXQgdGVzdCBzaG91bGQgYmUgcnVuLgorICAgIFJFUEVBVEVEX0FOVF9URVNUX0NPVU5UOiA1MDAKKworajExX3Bhcl9leGVjdXRvcjogJmoxMV9wYXJfZXhlY3V0b3IKKyAgZXhlY3V0b3I6CisgICAgbmFtZTogamF2YTExLWV4ZWN1dG9yCisgICAgI2V4ZWNfcmVzb3VyY2VfY2xhc3M6IHhsYXJnZQorICBwYXJhbGxlbGlzbTogNAorCitqMTFfc21hbGxfcGFyX2V4ZWN1dG9yOiAmajExX3NtYWxsX3Bhcl9leGVjdXRvcgorICBleGVjdXRvcjoKKyAgICBuYW1lOiBqYXZhMTEtZXhlY3V0b3IKKyAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCisgIHBhcmFsbGVsaXNtOiAxCisKK2oxMV9zbWFsbF9leGVjdXRvcjogJmoxMV9zbWFsbF9leGVjdXRvcgorICBleGVjdXRvcjoKKyAgICBuYW1lOiBqYXZhMTEtZXhlY3V0b3IKKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgcGFyYWxsZWxpc206IDEKKworajExX21lZGl1bV9wYXJfZXhlY3V0b3I6ICZqMTFfbWVkaXVtX3Bhcl9leGVjdXRvcgorICBleGVjdXRvcjoKKyAgICBuYW1lOiBqYXZhMTEtZXhlY3V0b3IKKyAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCisgIHBhcmFsbGVsaXNtOiAxCisKK2oxMV9zZXFfZXhlY3V0b3I6ICZqMTFfc2VxX2V4ZWN1dG9yCisgIGV4ZWN1dG9yOgorICAgIG5hbWU6IGphdmExMS1leGVjdXRvcgorICAgICNleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgcGFyYWxsZWxpc206IDEgIyBzZXF1ZW50aWFsLCBzaW5nbGUgY29udGFpbmVyIHRlc3RzOiBubyBwYXJhbGxlbGlzbSBiZW5lZml0cworCitqMTdfcGFyX2V4ZWN1dG9yOiAmajE3X3Bhcl9leGVjdXRvcgorICBleGVjdXRvcjoKKyAgICBuYW1lOiBqYXZhMTctZXhlY3V0b3IKKyAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCisgIHBhcmFsbGVsaXNtOiA0CisKK2oxN19zbWFsbF9wYXJfZXhlY3V0b3I6ICZqMTdfc21hbGxfcGFyX2V4ZWN1dG9yCisgIGV4ZWN1dG9yOgorICAgIG5hbWU6IGphdmExNy1leGVjdXRvcgorICAgICNleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKyAgcGFyYWxsZWxpc206IDEKKworajE3X3NtYWxsX2V4ZWN1dG9yOiAmajE3X3NtYWxsX2V4ZWN1dG9yCisgIGV4ZWN1dG9yOgorICAgIG5hbWU6IGphdmExNy1leGVjdXRvcgorICAgICNleGVjX3Jlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgcGFyYWxsZWxpc206IDEKKworajE3X21lZGl1bV9wYXJfZXhlY3V0b3I6ICZqMTdfbWVkaXVtX3Bhcl9leGVjdXRvcgorICBleGVjdXRvcjoKKyAgICBuYW1lOiBqYXZhMTctZXhlY3V0b3IKKyAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCisgIHBhcmFsbGVsaXNtOiAxCisKK2oxN19zZXFfZXhlY3V0b3I6ICZqMTdfc2VxX2V4ZWN1dG9yCisgIGV4ZWN1dG9yOgorICAgIG5hbWU6IGphdmExNy1leGVjdXRvcgorICAgICNleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKyAgcGFyYWxsZWxpc206IDEgIyBzZXF1ZW50aWFsLCBzaW5nbGUgY29udGFpbmVyIHRlc3RzOiBubyBwYXJhbGxlbGlzbSBiZW5lZml0cworCitqMTFfcmVwZWF0ZWRfdXRlc3RfZXhlY3V0b3I6ICZqMTFfcmVwZWF0ZWRfdXRlc3RfZXhlY3V0b3IKKyAgZXhlY3V0b3I6CisgICAgbmFtZTogamF2YTExLWV4ZWN1dG9yCisgIHBhcmFsbGVsaXNtOiA0CisKK2oxMV9yZXBlYXRlZF9kdGVzdF9leGVjdXRvcjogJmoxMV9yZXBlYXRlZF9kdGVzdF9leGVjdXRvcgorICBleGVjdXRvcjoKKyAgICBuYW1lOiBqYXZhMTEtZXhlY3V0b3IKKyAgcGFyYWxsZWxpc206IDQKKworajE3X3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yOiAmajE3X3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgIGV4ZWN1dG9yOgorICAgIG5hbWU6IGphdmExNy1leGVjdXRvcgorICBwYXJhbGxlbGlzbTogNAorCitqMTdfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3I6ICZqMTdfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3IKKyAgZXhlY3V0b3I6CisgICAgbmFtZTogamF2YTE3LWV4ZWN1dG9yCisgIHBhcmFsbGVsaXNtOiA0CisKK2oxMV9zZXBhcmF0ZV9qb2JzOiAmajExX3NlcGFyYXRlX2pvYnMKKyAgam9iczoKKyAgICAtIHN0YXJ0X2oxMV9idWlsZDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9idWlsZDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfYnVpbGQKKyAgICAjIEphdmEgMTEgdW5pdCB0ZXN0cworICAgIC0gc3RhcnRfajExX3VuaXRfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfdW5pdF90ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdW5pdF90ZXN0c19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdW5pdF90ZXN0c19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3VuaXRfdGVzdHNfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9qdm1fZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2p2bV9kdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHMKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0c192bm9kZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0c19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfanZtX2R0ZXN0c19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX2p2bV9kdGVzdHNfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfanZtX2R0ZXN0c192bm9kZV9yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c19yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9zaW11bGF0b3JfZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfc2ltdWxhdG9yX2R0ZXN0c19yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2NxbHNobGliX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaGxpYl90ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfdGVzdHMKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2NxbHNobGliX2N5dGhvbl90ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDE3IHVuaXQgdGVzdHMKKyAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3VuaXRfdGVzdHMKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3VuaXRfdGVzdHNfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3VuaXRfdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBzcGVjaWFsaXplZCB1bml0IHRlc3RzIChhbGwgcnVuIG9uIHJlcXVlc3QpCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19sb25nCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfbG9uZzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmcKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19sb25nX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfbG9uZ19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19sb25nX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmdfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19sb25nX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmdfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY2RjOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19jZGMKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkYworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX2NkY19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2NkY19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19jZGNfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfY2RjX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY2RjX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkY19yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c190cmllX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWVfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfc3RyZXNzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19zdHJlc3MKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzcworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3N0cmVzc19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3N0cmVzc19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19zdHJlc3NfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzc19yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfZnFsdG9vbAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV91dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2ZxbHRvb2xfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV91dGVzdHNfZnFsdG9vbF9yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAjIFB5dGhvbiBEVGVzdHMKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHMKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c192bm9kZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDExIG9mZi1oZWFwIGR0ZXN0cworICAgIC0gc3RhcnRfajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX29mZmhlYXBfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX29mZmhlYXBfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAjIEphdmEgMTcgZHRlc3RzCisgICAgLSBzdGFydF9qMTdfZHRlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0cworICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDE3IG9mZi1oZWFwIGR0ZXN0cworICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAjIFB5dGhvbiBsYXJnZSBEVGVzdHMKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2UKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZV9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX2xhcmdlX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlX3Zub2RlCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2Vfdm5vZGVfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2VfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2VfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGUKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDExIGNxbHNoIGR0ZXN0cworICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzCisgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAjIEphdmEgMTEgY3Fsc2ggb2ZmaGVhcCBkdGVzdHMgb2ZmaGVhcAorICAgIC0gc3RhcnRfajExX2NxbHNoX3Rlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDE3IGNxbHNoIGR0ZXN0cworICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDE3IGNxbHNoIGR0ZXN0cyBvZmYtaGVhcAorICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0c19vZmZoZWFwCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDExIHJlcGVhdGVkIHV0ZXN0CisgICAgLSBzdGFydF9qMTFfcmVwZWF0ZWRfYW50X3Rlc3Q6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfcmVwZWF0ZWRfYW50X3Rlc3Q6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajExX3JlcGVhdGVkX2FudF90ZXN0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAjIEphdmEgMTcgcmVwZWF0ZWQgdXRlc3QKKyAgICAtIHN0YXJ0X2oxN19yZXBlYXRlZF9hbnRfdGVzdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19yZXBlYXRlZF9hbnRfdGVzdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfcmVwZWF0ZWRfYW50X3Rlc3QKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgICMgSmF2YSAxMSByZXBlYXRlZCBkdGVzdAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfdm5vZGVfcmVwZWF0CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAjIEphdmEgMTcgcmVwZWF0ZWQgZHRlc3QKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19yZXBlYXQKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX3Zub2RlX3JlcGVhdAorICAgICAgICAgIC0gajExX2J1aWxkCisKK2oxMV9wcmUtY29tbWl0X2pvYnM6ICZqMTFfcHJlLWNvbW1pdF9qb2JzCisgIGpvYnM6CisgICAgLSBzdGFydF9wcmUtY29tbWl0X3Rlc3RzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2J1aWxkOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3ByZS1jb21taXRfdGVzdHMKKyAgICAjIEphdmEgMTEgdW5pdCB0ZXN0cworICAgIC0gajExX3VuaXRfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfdW5pdF90ZXN0c19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfc2ltdWxhdG9yX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9zaW11bGF0b3JfZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2p2bV9kdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfanZtX2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNobGliX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNobGliX2N5dGhvbl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaGxpYl90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDE3IHVuaXQgdGVzdHMKKyAgICAtIGoxN191bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3VuaXRfdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgICMgc3BlY2lhbGl6ZWQgdW5pdCB0ZXN0cyAoYWxsIHJ1biBvbiByZXF1ZXN0KQorICAgIC0gc3RhcnRfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2xvbmcKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19sb25nOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19sb25nCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV91dGVzdHNfbG9uZ19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2xvbmcKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c19sb25nX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfbG9uZworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfY2RjOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19jZGM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NkYworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV91dGVzdHNfY2RjX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfY2RjX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxMV91dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c190cmllOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3RyaWUKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N0cmVzcworICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV91dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfZnFsdG9vbAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfdXRlc3RzX2ZxbHRvb2xfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgICMgUHl0aG9uIERUZXN0cworICAgIC0gajExX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9kdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfZHRlc3RzX29mZmhlYXBfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDE3IGR0ZXN0cworICAgIC0gajE3X2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBMYXJnZSBQeXRob24gRFRlc3RzCisgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajExX2R0ZXN0c19sYXJnZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9kdGVzdHNfbGFyZ2VfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2UKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2R0ZXN0c19sYXJnZV92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfZHRlc3RzX2xhcmdlCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9kdGVzdHNfbGFyZ2Vfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9kdGVzdHNfbGFyZ2UKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAjIEphdmEgMTEgY3Fsc2ggZHRlc3RzCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDExIGNxbHNoIGR0ZXN0cyBvZmZoZWFwCisgICAgLSBzdGFydF9qMTFfY3Fsc2hfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTFfY3Fsc2hfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgIC0gajExX2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxMV9jcWxzaF9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgIyBKYXZhIDE3IGNxbHNoIGR0ZXN0cworICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTE6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxMV9idWlsZAorICAgICMgSmF2YSAxNyBjcWxzaCBkdGVzdHMgb2ZmLWhlYXAKKyAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgICAgLSBqMTFfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAgIC0gajExX2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoLWR0ZXN0cy1vZmZoZWFwCisgICAgICAgICAgLSBqMTFfYnVpbGQKKworajE3X3NlcGFyYXRlX2pvYnM6ICZqMTdfc2VwYXJhdGVfam9icworICBqb2JzOgorICAgIC0gc3RhcnRfajE3X2J1aWxkOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2J1aWxkOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19idWlsZAorICAgICMgSmF2YSAxNyB1bml0IHRlc3RzCisgICAgLSBzdGFydF9qMTdfdW5pdF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191bml0X3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191bml0X3Rlc3RzX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191bml0X3Rlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdW5pdF90ZXN0c19yZXBlYXQKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfanZtX2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0cworICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfanZtX2R0ZXN0c19yZXBlYXQKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2p2bV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2NxbHNobGliX3Rlc3RzCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl9jeXRob25fdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaGxpYl9jeXRob25fdGVzdHMKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgICMgSmF2YSAxNyBkdGVzdHMKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHMKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZQorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX29mZmhlYXA6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcF9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcF9yZXBlYXQKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfbGFyZ2VfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2VfcmVwZWF0CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2Vfdm5vZGUKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX2xhcmdlX3Zub2RlX3JlcGVhdAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2NxbHNoX3Rlc3RzCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzODoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2hfdGVzdHMKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaF90ZXN0cworICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgIyBzcGVjaWFsaXplZCB1bml0IHRlc3RzIChhbGwgcnVuIG9uIHJlcXVlc3QpCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2xvbmc6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19sb25nCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfbG9uZ19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2xvbmdfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfbG9uZ19yZXBlYXQKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkYworICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NkY19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NkY19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jZGNfcmVwZWF0CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfY29tcHJlc3Npb24KKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3RyaWU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c190cmllCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfdHJpZV9yZXBlYXQKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzcworICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N0cmVzc19yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzc19yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zdHJlc3NfcmVwZWF0CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19mcWx0b29sX3JlcGVhdAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQ6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN191dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgICMgSmF2YSAxNyByZXBlYXRlZCB1dGVzdAorICAgIC0gc3RhcnRfajE3X3JlcGVhdGVkX2FudF90ZXN0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3JlcGVhdGVkX2FudF90ZXN0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19yZXBlYXRlZF9hbnRfdGVzdAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgIyBKYXZhIDE3IHJlcGVhdGVkIGR0ZXN0CisgICAgLSBzdGFydF9qMTdfZHRlc3RzX3JlcGVhdDoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19kdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfcmVwZWF0CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c192bm9kZV9yZXBlYXQKKyAgICAgICAgICAtIGoxN19idWlsZAorCitqMTdfcHJlLWNvbW1pdF9qb2JzOiAmajE3X3ByZS1jb21taXRfam9icworICBqb2JzOgorICAgIC0gc3RhcnRfcHJlLWNvbW1pdF90ZXN0czoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN19idWlsZDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9wcmUtY29tbWl0X3Rlc3RzCisgICAgLSBqMTdfdW5pdF90ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN191bml0X3Rlc3RzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19qdm1fZHRlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2p2bV9kdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfanZtX2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hsaWJfdGVzdHM6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2R0ZXN0czoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2R0ZXN0c192bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19kdGVzdHNfdm5vZGVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0OgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2U6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2R0ZXN0c19sYXJnZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfZHRlc3RzX2xhcmdlX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19kdGVzdHNfbGFyZ2UKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfajE3X2R0ZXN0c19sYXJnZQorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTM4OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXA6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF9qMTdfY3Fsc2gtZHRlc3RzLW9mZmhlYXAKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X2NxbHNoX2R0ZXN0c19weTMxMV9vZmZoZWFwOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X2oxN19jcWxzaC1kdGVzdHMtb2ZmaGVhcAorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgIyBzcGVjaWFsaXplZCB1bml0IHRlc3RzIChhbGwgcnVuIG9uIHJlcXVlc3QpCisgICAgLSBzdGFydF91dGVzdHNfbG9uZzoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfbG9uZzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfbG9uZworICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX2xvbmdfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19sb25nCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19jZGM6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX2NkYzoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfY2RjX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfY2RjCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbjoKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2NvbXByZXNzaW9uCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19jb21wcmVzc2lvbgorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBzdGFydF91dGVzdHNfdHJpZToKKyAgICAgICAgdHlwZTogYXBwcm92YWwKKyAgICAtIGoxN191dGVzdHNfdHJpZToKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfdHJpZQorICAgICAgICAgIC0gajE3X2J1aWxkCisgICAgLSBqMTdfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c190cmllCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19zdHJlc3M6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N0cmVzczoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfc3RyZXNzCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sOgorICAgICAgICB0eXBlOiBhcHByb3ZhbAorICAgIC0gajE3X3V0ZXN0c19mcWx0b29sOgorICAgICAgICByZXF1aXJlczoKKyAgICAgICAgICAtIHN0YXJ0X3V0ZXN0c19mcWx0b29sCisgICAgICAgICAgLSBqMTdfYnVpbGQKKyAgICAtIGoxN191dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX2ZxbHRvb2wKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHR5cGU6IGFwcHJvdmFsCisgICAgLSBqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgICAgIHJlcXVpcmVzOgorICAgICAgICAgIC0gc3RhcnRfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkKKyAgICAgICAgICAtIGoxN19idWlsZAorICAgIC0gajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICAgICAgcmVxdWlyZXM6CisgICAgICAgICAgLSBzdGFydF91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeQorICAgICAgICAgIC0gajE3X2J1aWxkCisKK3dvcmtmbG93czoKKyAgICB2ZXJzaW9uOiAyCisgICAgamF2YTExX3NlcGFyYXRlX3Rlc3RzOiAqajExX3NlcGFyYXRlX2pvYnMKKyAgICBqYXZhMTFfcHJlLWNvbW1pdF90ZXN0czogKmoxMV9wcmUtY29tbWl0X2pvYnMKKyAgICBqYXZhMTdfc2VwYXJhdGVfdGVzdHM6ICpqMTdfc2VwYXJhdGVfam9icworICAgIGphdmExN19wcmUtY29tbWl0X3Rlc3RzOiAqajE3X3ByZS1jb21taXRfam9icworCitleGVjdXRvcnM6CisgIGphdmExMS1leGVjdXRvcjoKKyAgICBwYXJhbWV0ZXJzOgorICAgICAgZXhlY19yZXNvdXJjZV9jbGFzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IG1lZGl1bQorICAgIGRvY2tlcjoKKyAgICAgIC0gaW1hZ2U6IGFwYWNoZS9jYXNzYW5kcmEtdGVzdGluZy11YnVudHUyMDA0LWphdmExMS13LWRlcGVuZGVuY2llczpsYXRlc3QKKyAgICByZXNvdXJjZV9jbGFzczogPDwgcGFyYW1ldGVycy5leGVjX3Jlc291cmNlX2NsYXNzID4+CisgICAgd29ya2luZ19kaXJlY3Rvcnk6IH4vCisgICAgc2hlbGw6IC9iaW4vYmFzaCAtZW8gcGlwZWZhaWwgLWwKKyAgICBlbnZpcm9ubWVudDoKKyAgICAgIDw8OiAqZGVmYXVsdF9lbnZfdmFycworICAgICAgSkFWQV9IT01FOiAvdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrLWFtZDY0CisgICAgICBKREtfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTEtb3Blbmpkay1hbWQ2NAorCisgIGphdmExNy1leGVjdXRvcjoKKyAgICBwYXJhbWV0ZXJzOgorICAgICAgZXhlY19yZXNvdXJjZV9jbGFzczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IG1lZGl1bQorICAgIGRvY2tlcjoKKyAgICAtIGltYWdlOiBhcGFjaGUvY2Fzc2FuZHJhLXRlc3RpbmctdWJ1bnR1MjAwNC1qYXZhMTE6bGF0ZXN0CisgICAgcmVzb3VyY2VfY2xhc3M6IDw8IHBhcmFtZXRlcnMuZXhlY19yZXNvdXJjZV9jbGFzcyA+PgorICAgIHdvcmtpbmdfZGlyZWN0b3J5OiB+LworICAgIHNoZWxsOiAvYmluL2Jhc2ggLWVvIHBpcGVmYWlsIC1sCisgICAgZW52aXJvbm1lbnQ6CisgICAgICA8PDogKmRlZmF1bHRfZW52X3ZhcnMKKyAgICAgIEpBVkFfSE9NRTogL3Vzci9saWIvanZtL2phdmEtMTctb3Blbmpkay1hbWQ2NAorICAgICAgSkRLX0hPTUU6IC91c3IvbGliL2p2bS9qYXZhLTE3LW9wZW5qZGstYW1kNjQKKworYnVpbGRfY29tbW9uOiAmYnVpbGRfY29tbW9uCisgIHBhcmFsbGVsaXNtOiAxICMgVGhpcyBqb2IgZG9lc24ndCBiZW5lZml0IGZyb20gcGFyYWxsZWxpc20KKyAgc3RlcHM6CisgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAtIGNsb25lX2Nhc3NhbmRyYQorICAgIC0gYnVpbGRfY2Fzc2FuZHJhCisgICAgLSBydW5fZWNsaXBzZV93YXJuaW5ncworICAgIC0gcGVyc2lzdF90b193b3Jrc3BhY2U6CisgICAgICAgIHJvb3Q6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgICBwYXRoczoKKyAgICAgICAgICAtIGNhc3NhbmRyYQorICAgICAgICAgIC0gLm0yCisKK2pvYnM6CisgIGoxMV9idWlsZDoKKyAgICBleGVjdXRvcjogamF2YTExLWV4ZWN1dG9yCisgICAgPDw6ICpidWlsZF9jb21tb24KKworICBqMTdfYnVpbGQ6CisgICAgZXhlY3V0b3I6IGphdmExNy1leGVjdXRvcgorICAgIDw8OiAqYnVpbGRfY29tbW9uCisKKyAgajExX2R0ZXN0X2phcnNfYnVpbGQ6CisgICAgZXhlY3V0b3I6IGphdmExMS1leGVjdXRvcgorICAgIHBhcmFsbGVsaXNtOiAxCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBidWlsZF9jYXNzYW5kcmFfZHRlc3RfamFycworICAgICAgLSBwZXJzaXN0X3RvX3dvcmtzcGFjZToKKyAgICAgICAgICByb290OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgICAgICBwYXRoczoKKyAgICAgICAgICAgIC0gZHRlc3RfamFycworCisgIGoxMV91bml0X3Rlc3RzOgorICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY3JlYXRlX2p1bml0X2NvbnRhaW5lcnMKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9wYXJhbGxlbF9qdW5pdF90ZXN0cworCisgIGoxMV9zaW11bGF0b3JfZHRlc3RzOgorICAgIDw8OiAqajExX3NtYWxsX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3NpbXVsYXRvcl90ZXN0cworCisgIGoxMV9qdm1fZHRlc3RzOgorICAgIDw8OiAqajExX3NtYWxsX3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY3JlYXRlX2p1bml0X2NvbnRhaW5lcnM6CisgICAgICAgICAgY2xhc3NsaXN0cHJlZml4OiBkaXN0cmlidXRlZAorICAgICAgICAgIGV4dHJhX2ZpbHRlcnM6ICJ8IGdyZXAgLXYgdXBncmFkZSIKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9wYXJhbGxlbF9qdW5pdF90ZXN0czoKKyAgICAgICAgICBjbGFzc2xpc3RwcmVmaXg6IGRpc3RyaWJ1dGVkCisgICAgICAgICAgdGFyZ2V0OiAidGVzdGNsYXNzbGlzdCIKKworICBqMTFfanZtX2R0ZXN0c192bm9kZToKKyAgICA8PDogKmoxMV9zbWFsbF9wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNyZWF0ZV9qdW5pdF9jb250YWluZXJzOgorICAgICAgICAgIGNsYXNzbGlzdHByZWZpeDogZGlzdHJpYnV0ZWQKKyAgICAgICAgICBleHRyYV9maWx0ZXJzOiAifCBncmVwIC12IHVwZ3JhZGUiCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fcGFyYWxsZWxfanVuaXRfdGVzdHM6CisgICAgICAgICAgY2xhc3NsaXN0cHJlZml4OiBkaXN0cmlidXRlZAorICAgICAgICAgIHRhcmdldDogInRlc3RjbGFzc2xpc3QiCisgICAgICAgICAgYXJndW1lbnRzOiAiLUR0ZXN0Lmp2bS5hcmdzPSctRGNhc3NhbmRyYS5kdGVzdC5udW1fdG9rZW5zPTE2JyIKKworICBqMTdfanZtX2R0ZXN0czoKKyAgICA8PDogKmoxN19zbWFsbF9wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNyZWF0ZV9qdW5pdF9jb250YWluZXJzOgorICAgICAgICAgIGNsYXNzbGlzdHByZWZpeDogZGlzdHJpYnV0ZWQKKyAgICAgICAgICBleHRyYV9maWx0ZXJzOiAifCBncmVwIC12IHVwZ3JhZGUiCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fcGFyYWxsZWxfanVuaXRfdGVzdHM6CisgICAgICAgICAgY2xhc3NsaXN0cHJlZml4OiBkaXN0cmlidXRlZAorICAgICAgICAgIHRhcmdldDogInRlc3RjbGFzc2xpc3QiCisKKyAgajE3X2p2bV9kdGVzdHNfdm5vZGU6CisgICAgPDw6ICpqMTdfc21hbGxfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVyczoKKyAgICAgICAgICBjbGFzc2xpc3RwcmVmaXg6IGRpc3RyaWJ1dGVkCisgICAgICAgICAgZXh0cmFfZmlsdGVyczogInwgZ3JlcCAtdiB1cGdyYWRlIgorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzOgorICAgICAgICAgIGNsYXNzbGlzdHByZWZpeDogZGlzdHJpYnV0ZWQKKyAgICAgICAgICB0YXJnZXQ6ICJ0ZXN0Y2xhc3NsaXN0IgorICAgICAgICAgIGFyZ3VtZW50czogIi1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNiciCisKKyAgajE3X3VuaXRfdGVzdHM6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzCisKKyAgajExX2NxbHNobGliX3Rlc3RzOgorICAgIDw8OiAqajExX3NtYWxsX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBydW5fY3Fsc2hsaWJfdGVzdHMKKworICBqMTFfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgIDw8OiAqajExX3NtYWxsX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBydW5fY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzCisKKyAgajE3X2NxbHNobGliX3Rlc3RzOgorICAgIDw8OiAqajE3X3NtYWxsX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBydW5fY3Fsc2hsaWJfdGVzdHMKKworICBqMTdfY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgIDw8OiAqajE3X3NtYWxsX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBydW5fY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzCisKKyAgajExX3V0ZXN0c19sb25nOgorICAgIDw8OiAqajExX3NlcV9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gcnVuX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogbG9uZy10ZXN0CisKKyAgajE3X3V0ZXN0c19sb25nOgorICAgIDw8OiAqajE3X3NlcV9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gcnVuX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogbG9uZy10ZXN0CisKKyAgajExX3V0ZXN0c19jZGM6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdGNsYXNzbGlzdC1jZGMKKworICBqMTdfdXRlc3RzX2NkYzoKKyAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNyZWF0ZV9qdW5pdF9jb250YWluZXJzCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fcGFyYWxsZWxfanVuaXRfdGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiB0ZXN0Y2xhc3NsaXN0LWNkYworCisgIGoxMV91dGVzdHNfY29tcHJlc3Npb246CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdGNsYXNzbGlzdC1jb21wcmVzc2lvbgorCisgIGoxN191dGVzdHNfY29tcHJlc3Npb246CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdGNsYXNzbGlzdC1jb21wcmVzc2lvbgorCisgIGoxMV91dGVzdHNfdHJpZToKKyAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNyZWF0ZV9qdW5pdF9jb250YWluZXJzCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fcGFyYWxsZWxfanVuaXRfdGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiB0ZXN0Y2xhc3NsaXN0LXRyaWUKKworICBqMTdfdXRlc3RzX3RyaWU6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdGNsYXNzbGlzdC10cmllCisKKyAgajExX3V0ZXN0c19zdHJlc3M6CisgICAgPDw6ICpqMTFfc2VxX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBydW5fanVuaXRfdGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiBzdHJlc3MtdGVzdAorCisgIGoxN191dGVzdHNfc3RyZXNzOgorICAgIDw8OiAqajE3X3NlcV9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gcnVuX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogc3RyZXNzLXRlc3QKKworICBqMTFfdXRlc3RzX2ZxbHRvb2w6CisgICAgPDw6ICpqMTFfc2VxX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBydW5fanVuaXRfdGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiBmcWx0b29sLXRlc3QKKworICBqMTdfdXRlc3RzX2ZxbHRvb2w6CisgICAgPDw6ICpqMTdfc2VxX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBydW5fanVuaXRfdGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiBmcWx0b29sLXRlc3QKKworICBqMTFfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3Rvcnk6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjcmVhdGVfanVuaXRfY29udGFpbmVycworICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3BhcmFsbGVsX2p1bml0X3Rlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdGNsYXNzbGlzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5CisKKyAgajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5OgorICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY3JlYXRlX2p1bml0X2NvbnRhaW5lcnMKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9wYXJhbGxlbF9qdW5pdF90ZXN0czoKKyAgICAgICAgICB0YXJnZXQ6IHRlc3RjbGFzc2xpc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeQorCisgIGoxMV9kdGVzdHNfdm5vZGU6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAiLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgbm90IGNxbCciCisgICAgICAtIHJ1bl9kdGVzdHM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV93aXRoX3Zub2RlcworICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxMV9kdGVzdHNfb2ZmaGVhcDoKKyAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52CisgICAgICAtIGNyZWF0ZV9kdGVzdF9jb250YWluZXJzOgorICAgICAgICAgIGZpbGVfdGFnOiBqMTFfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgICBydW5fZHRlc3RzX2V4dHJhX2FyZ3M6ICItLXVzZS12bm9kZXMgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgbm90IGNxbCciCisgICAgICAtIHJ1bl9kdGVzdHM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cycKKworICBqMTdfZHRlc3RzX3Zub2RlOgorICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgLSBjbG9uZV9kdGVzdAorICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAtIGNyZWF0ZV9kdGVzdF9jb250YWluZXJzOgorICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhfdm5vZGVzCisgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIG5vdCBjcWwnIgorICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgZmlsZV90YWc6IGoxN193aXRoX3Zub2RlcworICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cycKKworICBqMTdfZHRlc3RzX29mZmhlYXA6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyIKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X2R0ZXN0c19vZmZoZWFwCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxMV9kdGVzdHM6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAiLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyIKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxN19kdGVzdHM6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAtIGNsb25lX2R0ZXN0CisgICAgLSBjcmVhdGVfdmVudgorICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgIGZpbGVfdGFnOiBqMTdfd2l0aG91dF92bm9kZXMKKyAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAiLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBub3QgY3FsJyIKKyAgICAtIHJ1bl9kdGVzdHM6CisgICAgICAgIGZpbGVfdGFnOiBqMTdfd2l0aG91dF92bm9kZXMKKyAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV93aXRoX3Zub2RlcworICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCciCisgICAgICAtIHJ1bl9kdGVzdHM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV93aXRoX3Zub2RlcworICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKKworICBqMTFfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgLSBydW5fZHRlc3RzOgorICAgICAgICAgIGZpbGVfdGFnOiBqMTFfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JworCisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52OgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAiLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyIKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JworICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworCisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudjoKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisgICAgICAtIGNyZWF0ZV9kdGVzdF9jb250YWluZXJzOgorICAgICAgICAgIGZpbGVfdGFnOiBqMTFfd2l0aF92bm9kZXMKKyAgICAgICAgICBydW5fZHRlc3RzX2V4dHJhX2FyZ3M6ICItLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMScKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisKKyAgajExX2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudjoKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworICAgICAgLSBydW5fZHRlc3RzOgorICAgICAgICAgIGZpbGVfdGFnOiBqMTFfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JworICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworCisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52OgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV9kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX2R0ZXN0c19vZmZoZWFwCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnCisgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjExJworCisgIGoxMV9jcWxzaF9kdGVzdHNfcHkzOgorICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV93aXRob3V0X3Zub2RlcworICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyIKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKKworICBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudjoKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV93aXRob3V0X3Zub2RlcworICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyIKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKworICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnY6CisgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjExJworICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAiLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnCisgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjExJworCisgIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN193aXRoX3Zub2RlcworICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tcHl0ZXN0LW9wdGlvbnMgJy1rIGNxbCciCisgICAgICAtIHJ1bl9kdGVzdHM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN193aXRoX3Zub2RlcworICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKKworICBqMTdfY3Fsc2hfZHRlc3RzX3B5M19vZmZoZWFwOgorICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgLSBydW5fZHRlc3RzOgorICAgICAgICAgIGZpbGVfdGFnOiBqMTdfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JworCisgIGoxN19jcWxzaF9kdGVzdHNfcHkzOF92bm9kZToKKyAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52OgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAiLS11c2Utdm5vZGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyIKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JworICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworCisgIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfdm5vZGU6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudjoKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisgICAgICAtIGNyZWF0ZV9kdGVzdF9jb250YWluZXJzOgorICAgICAgICAgIGZpbGVfdGFnOiBqMTdfd2l0aF92bm9kZXMKKyAgICAgICAgICBydW5fZHRlc3RzX2V4dHJhX2FyZ3M6ICItLXVzZS12bm9kZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy4xMScKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisKKyAgajE3X2NxbHNoX2R0ZXN0c19weTM4X29mZmhlYXA6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudjoKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworICAgICAgLSBydW5fZHRlc3RzOgorICAgICAgICAgIGZpbGVfdGFnOiBqMTdfZHRlc3RzX29mZmhlYXAKKyAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tdXNlLXZub2RlcyAtLW51bS10b2tlbnM9MTYgLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy44JworICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworCisgIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKyAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52OgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN19kdGVzdHNfb2ZmaGVhcAorICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tdXNlLXZub2RlcyAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X2R0ZXN0c19vZmZoZWFwCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnCisgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjExJworCisgIGoxN19jcWxzaF9kdGVzdHNfcHkzOgorICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN193aXRob3V0X3Zub2RlcworICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyIKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKKworICBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzg6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudjoKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gY3JlYXRlX2R0ZXN0X2NvbnRhaW5lcnM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN193aXRob3V0X3Zub2RlcworICAgICAgICAgIHJ1bl9kdGVzdHNfZXh0cmFfYXJnczogIi0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1weXRlc3Qtb3B0aW9ucyAnLWsgY3FsJyIKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuOCcKKyAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKworICBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExOgorICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnY6CisgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjExJworICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAiLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLXB5dGVzdC1vcHRpb25zICctayBjcWwnIgorICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuMTEnCisgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjExJworCisgIGoxMV9kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajExX2xhcmdlX3dpdGhfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAtIHJ1bl9kdGVzdHM6CisgICAgICAgICAgZmlsZV90YWc6IGoxMV9sYXJnZV93aXRoX3Zub2RlcworICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxMV9kdGVzdHNfbGFyZ2U6CisgICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAnLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cycKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajExX2xhcmdlX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGU6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X2xhcmdlX3dpdGhfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgICAgICAtIHJ1bl9kdGVzdHM6CisgICAgICAgICAgZmlsZV90YWc6IGoxN19sYXJnZV93aXRoX3Zub2RlcworICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxN19kdGVzdHNfbGFyZ2U6CisgICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOiAnLS1vbmx5LXJlc291cmNlLWludGVuc2l2ZS10ZXN0cyAtLWZvcmNlLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cycKKyAgICAgIC0gcnVuX2R0ZXN0czoKKyAgICAgICAgICBmaWxlX3RhZzogajE3X2xhcmdlX3dpdGhvdXRfdm5vZGVzCisgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworCisgIGoxMV91bml0X3Rlc3RzX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91bml0X3Rlc3RzX3JlcGVhdAorCisgIGoxN191bml0X3Rlc3RzX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91bml0X3Rlc3RzX3JlcGVhdAorCisgIGoxMV91dGVzdHNfY2RjX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfY2RjX3JlcGVhdAorCisgIGoxN191dGVzdHNfY2RjX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfY2RjX3JlcGVhdAorCisgIGoxMV91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0OgorICAgIDw8OiAqajExX3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQKKworICBqMTdfdXRlc3RzX2NvbXByZXNzaW9uX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0CisKKyAgajExX3V0ZXN0c190cmllX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfdHJpZV9yZXBlYXQKKworICBqMTdfdXRlc3RzX3RyaWVfcmVwZWF0OgorICAgIDw8OiAqajE3X3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3V0ZXN0c190cmllX3JlcGVhdAorCisgIGoxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQ6CisgICAgPDw6ICpqMTFfcmVwZWF0ZWRfdXRlc3RfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0CisKKyAgajE3X3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQKKworICBqMTFfdXRlc3RzX2ZxbHRvb2xfcmVwZWF0OgorICAgIDw8OiAqajExX3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3V0ZXN0c19mcWx0b29sX3JlcGVhdAorCisgIGoxN191dGVzdHNfZnFsdG9vbF9yZXBlYXQ6CisgICAgPDw6ICpqMTdfcmVwZWF0ZWRfdXRlc3RfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBydW5fdXRlc3RzX2ZxbHRvb2xfcmVwZWF0CisKKyAgajExX3V0ZXN0c19sb25nX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfbG9uZ19yZXBlYXQKKworICBqMTdfdXRlc3RzX2xvbmdfcmVwZWF0OgorICAgIDw8OiAqajE3X3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3V0ZXN0c19sb25nX3JlcGVhdAorCisgIGoxMV91dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfc3RyZXNzX3JlcGVhdAorCisgIGoxN191dGVzdHNfc3RyZXNzX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl91dGVzdHNfc3RyZXNzX3JlcGVhdAorCisgIGoxMV9qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9qdm1fZHRlc3RzX3JlcGVhdAorCisgIGoxMV9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdAorCisgIGoxMV9zaW11bGF0b3JfZHRlc3RzX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9zaW11bGF0b3JfZHRlc3RzX3JlcGVhdAorCisgIGoxN19qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9qdm1fZHRlc3RzX3JlcGVhdAorCisgIGoxN19qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdAorCisgIGoxMV9yZXBlYXRlZF9hbnRfdGVzdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIHJ1bl9yZXBlYXRlZF91dGVzdDoKKyAgICAgICAgICB0YXJnZXQ6ICR7UkVQRUFURURfQU5UX1RFU1RfVEFSR0VUfQorICAgICAgICAgIGNsYXNzOiAke1JFUEVBVEVEX0FOVF9URVNUX0NMQVNTfQorICAgICAgICAgIG1ldGhvZHM6ICR7UkVQRUFURURfQU5UX1RFU1RfTUVUSE9EU30KKyAgICAgICAgICB2bm9kZXM6ICR7UkVQRUFURURfQU5UX1RFU1RfVk5PREVTfQorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX0FOVF9URVNUX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgajE3X3JlcGVhdGVkX2FudF90ZXN0OgorICAgIDw8OiAqajE3X3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBsb2dfZW52aXJvbm1lbnQKKyAgICAgIC0gcnVuX3JlcGVhdGVkX3V0ZXN0OgorICAgICAgICAgIHRhcmdldDogJHtSRVBFQVRFRF9BTlRfVEVTVF9UQVJHRVR9CisgICAgICAgICAgY2xhc3M6ICR7UkVQRUFURURfQU5UX1RFU1RfQ0xBU1N9CisgICAgICAgICAgbWV0aG9kczogJHtSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTfQorICAgICAgICAgIHZub2RlczogJHtSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVN9CisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfQU5UX1RFU1RfQ09VTlR9CisgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KKworICBqMTFfZHRlc3RzX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF9kdGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gcnVuX3JlcGVhdGVkX2R0ZXN0OgorICAgICAgICAgIHRlc3RzOiAke1JFUEVBVEVEX0RURVNUU30KKyAgICAgICAgICB2bm9kZXM6ICJmYWxzZSIKKyAgICAgICAgICB1cGdyYWRlOiAiZmFsc2UiCisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfRFRFU1RTX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgajExX2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgPDw6ICpqMTFfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52CisgICAgICAtIHJ1bl9yZXBlYXRlZF9kdGVzdDoKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9EVEVTVFN9CisgICAgICAgICAgdm5vZGVzOiAidHJ1ZSIKKyAgICAgICAgICB1cGdyYWRlOiAiZmFsc2UiCisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfRFRFU1RTX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgajExX2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICA8PDogKmoxMV9yZXBlYXRlZF9kdGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gcnVuX3JlcGVhdGVkX2R0ZXN0OgorICAgICAgICAgIHRlc3RzOiAke1JFUEVBVEVEX0RURVNUU30KKyAgICAgICAgICB2bm9kZXM6ICJ0cnVlIgorICAgICAgICAgIHVwZ3JhZGU6ICJmYWxzZSIKKyAgICAgICAgICBjb3VudDogJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9CisgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KKyAgICAgICAgICBleHRyYV9kdGVzdF9hcmdzOiAiLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMiCisKKyAgajExX2R0ZXN0c19sYXJnZV9yZXBlYXQ6CisgICAgPDw6ICpqMTFfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52CisgICAgICAtIHJ1bl9yZXBlYXRlZF9kdGVzdDoKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9CisgICAgICAgICAgdm5vZGVzOiAiZmFsc2UiCisgICAgICAgICAgdXBncmFkZTogImZhbHNlIgorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0KKyAgICAgICAgICBzdG9wX29uX2ZhaWx1cmU6ICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfQorICAgICAgICAgIGV4dHJhX2R0ZXN0X2FyZ3M6ICItLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIgorCisgIGoxMV9kdGVzdHNfbGFyZ2Vfdm5vZGVfcmVwZWF0OgorICAgIDw8OiAqajExX3JlcGVhdGVkX2R0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgLSBjbG9uZV9kdGVzdAorICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAtIHJ1bl9yZXBlYXRlZF9kdGVzdDoKKyAgICAgICAgdGVzdHM6ICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfQorICAgICAgICB2bm9kZXM6ICJ0cnVlIgorICAgICAgICB1cGdyYWRlOiAiZmFsc2UiCisgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0KKyAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KKyAgICAgICAgZXh0cmFfZHRlc3RfYXJnczogIi0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMiCisKKyAgajE3X2R0ZXN0c19yZXBlYXQ6CisgICAgPDw6ICpqMTdfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGxvZ19lbnZpcm9ubWVudAorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBydW5fcmVwZWF0ZWRfZHRlc3Q6CisgICAgICAgICAgdGVzdHM6ICR7UkVQRUFURURfRFRFU1RTfQorICAgICAgICAgIHZub2RlczogImZhbHNlIgorICAgICAgICAgIHVwZ3JhZGU6ICJmYWxzZSIKKyAgICAgICAgICBjb3VudDogJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9CisgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KKworICBqMTdfZHRlc3RzX3Zub2RlX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF9kdGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gbG9nX2Vudmlyb25tZW50CisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52CisgICAgICAtIHJ1bl9yZXBlYXRlZF9kdGVzdDoKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9EVEVTVFN9CisgICAgICAgICAgdm5vZGVzOiAidHJ1ZSIKKyAgICAgICAgICB1cGdyYWRlOiAiZmFsc2UiCisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfRFRFU1RTX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgajE3X2R0ZXN0c19vZmZoZWFwX3JlcGVhdDoKKyAgICA8PDogKmoxN19yZXBlYXRlZF9kdGVzdF9leGVjdXRvcgorICAgIHN0ZXBzOgorICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKKyAgICAgIC0gY2xvbmVfZHRlc3QKKyAgICAgIC0gY3JlYXRlX3ZlbnYKKyAgICAgIC0gcnVuX3JlcGVhdGVkX2R0ZXN0OgorICAgICAgICAgIHRlc3RzOiAke1JFUEVBVEVEX0RURVNUU30KKyAgICAgICAgICB2bm9kZXM6ICJ0cnVlIgorICAgICAgICAgIHVwZ3JhZGU6ICJmYWxzZSIKKyAgICAgICAgICBjb3VudDogJHtSRVBFQVRFRF9EVEVTVFNfQ09VTlR9CisgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KKyAgICAgICAgICBleHRyYV9kdGVzdF9hcmdzOiAiLS11c2Utb2ZmLWhlYXAtbWVtdGFibGVzIC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMiCisKKyAgajE3X2R0ZXN0c19sYXJnZV9yZXBlYXQ6CisgICAgPDw6ICpqMTdfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3IKKyAgICBzdGVwczoKKyAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCisgICAgICAtIGNsb25lX2R0ZXN0CisgICAgICAtIGNyZWF0ZV92ZW52CisgICAgICAtIHJ1bl9yZXBlYXRlZF9kdGVzdDoKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9MQVJHRV9EVEVTVFN9CisgICAgICAgICAgdm5vZGVzOiAiZmFsc2UiCisgICAgICAgICAgdXBncmFkZTogImZhbHNlIgorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0KKyAgICAgICAgICBzdG9wX29uX2ZhaWx1cmU6ICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfQorICAgICAgICAgIGV4dHJhX2R0ZXN0X2FyZ3M6ICItLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIgorCisgIGoxN19kdGVzdHNfbGFyZ2Vfdm5vZGVfcmVwZWF0OgorICAgIDw8OiAqajE3X3JlcGVhdGVkX2R0ZXN0X2V4ZWN1dG9yCisgICAgc3RlcHM6CisgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorICAgICAgLSBjbG9uZV9kdGVzdAorICAgICAgLSBjcmVhdGVfdmVudgorICAgICAgLSBydW5fcmVwZWF0ZWRfZHRlc3Q6CisgICAgICAgICAgdGVzdHM6ICR7UkVQRUFURURfTEFSR0VfRFRFU1RTfQorICAgICAgICAgIHZub2RlczogInRydWUiCisgICAgICAgICAgdXBncmFkZTogImZhbHNlIgorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX0xBUkdFX0RURVNUU19DT1VOVH0KKyAgICAgICAgICBzdG9wX29uX2ZhaWx1cmU6ICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfQorICAgICAgICAgIGV4dHJhX2R0ZXN0X2FyZ3M6ICItLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIgorCitjb21tYW5kczoKKyAgbG9nX2Vudmlyb25tZW50OgorICAgIHN0ZXBzOgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBMb2cgRW52aXJvbm1lbnQgSW5mb3JtYXRpb24KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGVjaG8gJyoqKiBpZCAqKionCisgICAgICAgICAgaWQKKyAgICAgICAgICBlY2hvICcqKiogY2F0IC9wcm9jL2NwdWluZm8gKioqJworICAgICAgICAgIGNhdCAvcHJvYy9jcHVpbmZvCisgICAgICAgICAgZWNobyAnKioqIGZyZWUgLW0gKioqJworICAgICAgICAgIGZyZWUgLW0KKyAgICAgICAgICBlY2hvICcqKiogZGYgLW0gKioqJworICAgICAgICAgIGRmIC1tCisgICAgICAgICAgZWNobyAnKioqIGlmY29uZmlnIC1hICoqKicKKyAgICAgICAgICBpZmNvbmZpZyAtYQorICAgICAgICAgIGVjaG8gJyoqKiB1bmFtZSAtYSAqKionCisgICAgICAgICAgdW5hbWUgLWEKKyAgICAgICAgICBlY2hvICcqKiogbW91bnQgKioqJworICAgICAgICAgIG1vdW50CisgICAgICAgICAgZWNobyAnKioqIGVudiAqKionCisgICAgICAgICAgZW52CisgICAgICAgICAgZWNobyAnKioqIGphdmEgKioqJworICAgICAgICAgIHdoaWNoIGphdmEKKyAgICAgICAgICBqYXZhIC12ZXJzaW9uCisKKyAgY2xvbmVfY2Fzc2FuZHJhOgorICAgIHN0ZXBzOgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1kZXB0aCAxIC0tYnJhbmNoICRDSVJDTEVfQlJBTkNIIGh0dHBzOi8vZ2l0aHViLmNvbS8kQ0lSQ0xFX1BST0pFQ1RfVVNFUk5BTUUvJENJUkNMRV9QUk9KRUNUX1JFUE9OQU1FLmdpdCB+L2Nhc3NhbmRyYQorCisgIGNsb25lX2R0ZXN0OgorICAgIHN0ZXBzOgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBDbG9uZSBDYXNzYW5kcmEgZHRlc3QgUmVwb3NpdG9yeSAodmlhIGdpdCkKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGdpdCBjbG9uZSAtLXNpbmdsZS1icmFuY2ggLS1icmFuY2ggJERURVNUX0JSQU5DSCAtLWRlcHRoIDEgJERURVNUX1JFUE8gfi9jYXNzYW5kcmEtZHRlc3QKKworICBidWlsZF9jYXNzYW5kcmE6CisgICAgc3RlcHM6CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IEJ1aWxkIENhc3NhbmRyYQorICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYQorICAgICAgICAgICMgTG9vcCB0byBwcmV2ZW50IGZhaWx1cmUgZHVlIHRvIG1hdmVuLWFudC10YXNrcyBub3QgZG93bmxvYWRpbmcgYSBqYXIuLgorICAgICAgICAgIGZvciB4IGluICQoc2VxIDEgMyk7IGRvCisgICAgICAgICAgICAgICR7QU5UX0hPTUV9L2Jpbi9hbnQgY2xlYW4gcmVhbGNsZWFuIGphcgorICAgICAgICAgICAgICBSRVRVUk49IiQ/IgorICAgICAgICAgICAgICBpZiBbICIke1JFVFVSTn0iIC1lcSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgZmkKKyAgICAgICAgICBkb25lCisgICAgICAgICAgIyBFeGl0LCBpZiB3ZSBkaWRuJ3QgYnVpbGQgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgaWYgWyAiJHtSRVRVUk59IiAtbmUgIjAiIF07IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiQnVpbGQgZmFpbGVkIHdpdGggZXhpdCBjb2RlOiAke1JFVFVSTn0iCisgICAgICAgICAgICAgIGV4aXQgJHtSRVRVUk59CisgICAgICAgICAgZmkKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorCisgIGJ1aWxkX2Nhc3NhbmRyYV9kdGVzdF9qYXJzOgorICAgIHN0ZXBzOgorICAgIC0gcnVuOgorICAgICAgICBuYW1lOiBCdWlsZCBDYXNzYW5kcmEgRFRlc3QgamFycworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICBjZCB+L2Nhc3NhbmRyYQorICAgICAgICAgIG1rZGlyIH4vZHRlc3RfamFycworICAgICAgICAgIGdpdCByZW1vdGUgYWRkIGFwYWNoZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS5naXQKKyAgICAgICAgICBmb3IgYnJhbmNoIGluIGNhc3NhbmRyYS0yLjIgY2Fzc2FuZHJhLTMuMCBjYXNzYW5kcmEtMy4xMSBjYXNzYW5kcmEtNC4wIGNhc3NhbmRyYS00LjEgdHJ1bms7IGRvCisgICAgICAgICAgICAjIGNoZWNrIG91dCB0aGUgY29ycmVjdCBjYXNzYW5kcmEgdmVyc2lvbjoKKyAgICAgICAgICAgIGdpdCByZW1vdGUgc2V0LWJyYW5jaGVzIC0tYWRkIGFwYWNoZSAnJGJyYW5jaCcKKyAgICAgICAgICAgIGdpdCBmZXRjaCAtLWRlcHRoIDEgYXBhY2hlICRicmFuY2gKKyAgICAgICAgICAgIGdpdCBjaGVja291dCAkYnJhbmNoCisgICAgICAgICAgICBnaXQgY2xlYW4gLWZkCisgICAgICAgICAgICAjIExvb3AgdG8gcHJldmVudCBmYWlsdXJlIGR1ZSB0byBtYXZlbi1hbnQtdGFza3Mgbm90IGRvd25sb2FkaW5nIGEgamFyLi4KKyAgICAgICAgICAgIGZvciB4IGluICQoc2VxIDEgMyk7IGRvCisgICAgICAgICAgICAgICAgJHtBTlRfSE9NRX0vYmluL2FudCByZWFsY2xlYW47ICR7QU5UX0hPTUV9L2Jpbi9hbnQgamFyIGR0ZXN0LWphcgorICAgICAgICAgICAgICAgIFJFVFVSTj0iJD8iCisgICAgICAgICAgICAgICAgaWYgWyAiJHtSRVRVUk59IiAtZXEgIjAiIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgY3AgYnVpbGQvZHRlc3QqLmphciB+L2R0ZXN0X2phcnMKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgIyBFeGl0LCBpZiB3ZSBkaWRuJ3QgYnVpbGQgc3VjY2Vzc2Z1bGx5CisgICAgICAgICAgICBpZiBbICIke1JFVFVSTn0iIC1uZSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIkJ1aWxkIGZhaWxlZCB3aXRoIGV4aXQgY29kZTogJHtSRVRVUk59IgorICAgICAgICAgICAgICAgIGV4aXQgJHtSRVRVUk59CisgICAgICAgICAgICBmaQorICAgICAgICAgIGRvbmUKKyAgICAgICAgICAjIGFuZCBidWlsZCB0aGUgZHRlc3QtamFyIGZvciB0aGUgYnJhbmNoIHVuZGVyIHRlc3QKKyAgICAgICAgICAke0FOVF9IT01FfS9iaW4vYW50IHJlYWxjbGVhbgorICAgICAgICAgIGdpdCBjaGVja291dCBvcmlnaW4vJENJUkNMRV9CUkFOQ0gKKyAgICAgICAgICBnaXQgY2xlYW4gLWZkCisgICAgICAgICAgZm9yIHggaW4gJChzZXEgMSAzKTsgZG8KKyAgICAgICAgICAgICAgJHtBTlRfSE9NRX0vYmluL2FudCByZWFsY2xlYW47ICR7QU5UX0hPTUV9L2Jpbi9hbnQgamFyIGR0ZXN0LWphcgorICAgICAgICAgICAgICBSRVRVUk49IiQ/IgorICAgICAgICAgICAgICBpZiBbICIke1JFVFVSTn0iIC1lcSAiMCIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgY3AgYnVpbGQvZHRlc3QqLmphciB+L2R0ZXN0X2phcnMKKyAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgZG9uZQorICAgICAgICAgICMgRXhpdCwgaWYgd2UgZGlkbid0IGJ1aWxkIHN1Y2Nlc3NmdWxseQorICAgICAgICAgIGlmIFsgIiR7UkVUVVJOfSIgLW5lICIwIiBdOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIkJ1aWxkIGZhaWxlZCB3aXRoIGV4aXQgY29kZTogJHtSRVRVUk59IgorICAgICAgICAgICAgICBleGl0ICR7UkVUVVJOfQorICAgICAgICAgIGZpCisgICAgICAgICAgbHMgLWwgfi9kdGVzdF9qYXJzCisgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKworICBydW5fZWNsaXBzZV93YXJuaW5nczoKKyAgICBzdGVwczoKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIGVjbGlwc2Utd2FybmluZ3MKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgY2Qgfi9jYXNzYW5kcmEKKyAgICAgICAgICBhbnQgZWNsaXBzZS13YXJuaW5ncworCisgIGNyZWF0ZV9qdW5pdF9jb250YWluZXJzOgorICAgIHBhcmFtZXRlcnM6CisgICAgICBjbGFzc2xpc3RwcmVmaXg6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiB1bml0CisgICAgICBleHRyYV9maWx0ZXJzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogIiIKKyAgICBzdGVwczoKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogRGV0ZXJtaW5lIDw8cGFyYW1ldGVycy5jbGFzc2xpc3RwcmVmaXg+PiBUZXN0cyB0byBSdW4KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBybSAtZnIgfi9jYXNzYW5kcmEtZHRlc3QvdXBncmFkZV90ZXN0cworICAgICAgICAgIGVjaG8gIioqKmphdmEgdGVzdHMqKioiCisKKyAgICAgICAgICAjIGdldCBhbGwgb2Ygb3VyIHVuaXQgdGVzdCBmaWxlbmFtZXMKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIGdsb2IgIiRIT01FL2Nhc3NhbmRyYS90ZXN0Lzw8cGFyYW1ldGVycy5jbGFzc2xpc3RwcmVmaXg+Pi8qKi8qLmphdmEiID4gL3RtcC9hbGxfamF2YV91bml0X3Rlc3RzLnR4dAorCisgICAgICAgICAgIyBzcGxpdCB1cCB0aGUgdW5pdCB0ZXN0cyBpbnRvIGdyb3VwcyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNvbnRhaW5lcnMgd2UgaGF2ZQorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2lyY2xlY2kgdGVzdHMgc3BsaXQgLS1zcGxpdC1ieT10aW1pbmdzIC0tdGltaW5ncy10eXBlPWZpbGVuYW1lIC0taW5kZXg9JHtDSVJDTEVfTk9ERV9JTkRFWH0gLS10b3RhbD0ke0NJUkNMRV9OT0RFX1RPVEFMfSAvdG1wL2FsbF9qYXZhX3VuaXRfdGVzdHMudHh0ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9LnR4dAorICAgICAgICAgIHNldCAtZW8gcGlwZWZhaWwgJiYgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfS50eHQgfCBzZWQgInM7Xi9ob21lL2Nhc3NhbmRyYS9jYXNzYW5kcmEvdGVzdC88PHBhcmFtZXRlcnMuY2xhc3NsaXN0cHJlZml4Pj4vOztnIiB8IGdyZXAgIlRlc3RcLmphdmEkIiA8PHBhcmFtZXRlcnMuZXh0cmFfZmlsdGVycz4+ID4gL3RtcC9qYXZhX3Rlc3RzXyR7Q0lSQ0xFX05PREVfSU5ERVh9X2ZpbmFsLnR4dAorICAgICAgICAgIGVjaG8gIioqIC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQiCisgICAgICAgICAgY2F0IC90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQKKworICAgICAgICBub19vdXRwdXRfdGltZW91dDogMTVtCisKKyAgcnVuX3NpbXVsYXRvcl90ZXN0czoKKyAgICBwYXJhbWV0ZXJzOgorICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAzMG0KKyAgICBzdGVwczoKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFNpbXVsYXRvciBUZXN0cworICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgc2V0IC14CisgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICB0aW1lIG12IH4vY2Fzc2FuZHJhIC90bXAKKyAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgIGNwIH4vZHRlc3RfamFycy9kdGVzdCogL3RtcC9jYXNzYW5kcmEvYnVpbGQvCisgICAgICAgICAgZmkKKyAgICAgICAgICBhbnQgdGVzdC1zaW11bGF0b3ItZHRlc3QgLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDw8cGFyYW1ldGVycy5ub19vdXRwdXRfdGltZW91dD4+CisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisKKyAgcnVuX2p1bml0X3Rlc3RzOgorICAgIHBhcmFtZXRlcnM6CisgICAgICB0YXJnZXQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAxNW0KKyAgICBzdGVwczoKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKDw8cGFyYW1ldGVycy50YXJnZXQ+PikKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgYW50IDw8cGFyYW1ldGVycy50YXJnZXQ+PiAtRG5vLWJ1aWxkLXRlc3Q9dHJ1ZQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogPDxwYXJhbWV0ZXJzLm5vX291dHB1dF90aW1lb3V0Pj4KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9vdXRwdXQvCisgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0CisgICAgICAgIGRlc3RpbmF0aW9uOiBqdW5pdHhtbAorICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgZGVzdGluYXRpb246IGxvZ3MKKworICBydW5fY3Fsc2hsaWJfdGVzdHM6CisgICAgcGFyYW1ldGVyczoKKyAgICAgIG5vX291dHB1dF90aW1lb3V0OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogMTVtCisgICAgc3RlcHM6CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IFJ1biBjcWxzaGxpYiBVbml0IFRlc3RzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhLworICAgICAgICAgIC4vcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoICQocHdkKQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogPDxwYXJhbWV0ZXJzLm5vX291dHB1dF90aW1lb3V0Pj4KKyAgICAtIHN0b3JlX3Rlc3RfcmVzdWx0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvcHlsaWIKKworICBydW5fY3Fsc2hsaWJfY3l0aG9uX3Rlc3RzOgorICAgIHBhcmFtZXRlcnM6CisgICAgICBub19vdXRwdXRfdGltZW91dDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IDE1bQorICAgIHN0ZXBzOgorICAgICAgLSBydW46CisgICAgICAgICAgbmFtZTogUnVuIGNxbHNobGliIFVuaXQgVGVzdHMKKyAgICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgICAgZXhwb3J0IGN5dGhvbj0ieWVzIgorICAgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgICBjZCAvdG1wL2Nhc3NhbmRyYS8KKyAgICAgICAgICAgIC4vcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoICQocHdkKQorICAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiA8PHBhcmFtZXRlcnMubm9fb3V0cHV0X3RpbWVvdXQ+PgorICAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvcHlsaWIKKworICBydW5fcGFyYWxsZWxfanVuaXRfdGVzdHM6CisgICAgcGFyYW1ldGVyczoKKyAgICAgIHRhcmdldDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6IHRlc3RjbGFzc2xpc3QKKyAgICAgIG5vX291dHB1dF90aW1lb3V0OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogMTVtCisgICAgICBjbGFzc2xpc3RwcmVmaXg6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiB1bml0CisgICAgICBhcmd1bWVudHM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgICBkZWZhdWx0OiAiICIKKyAgICBzdGVwczoKKyAgICAtIHJ1bjoKKyAgICAgICAgbmFtZTogUnVuIFVuaXQgVGVzdHMgKDw8cGFyYW1ldGVycy50YXJnZXQ+PikKKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgIHNldCAteAorICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgdGltZSBtdiB+L2Nhc3NhbmRyYSAvdG1wCisgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICBpZiBbIC1kIH4vZHRlc3RfamFycyBdOyB0aGVuCisgICAgICAgICAgICBjcCB+L2R0ZXN0X2phcnMvZHRlc3QqIC90bXAvY2Fzc2FuZHJhL2J1aWxkLworICAgICAgICAgIGZpCisgICAgICAgICAgdGVzdF90aW1lb3V0PSQoZ3JlcCAnbmFtZT0idGVzdC48PHBhcmFtZXRlcnMuY2xhc3NsaXN0cHJlZml4Pj4udGltZW91dCInIGJ1aWxkLnhtbCB8IGF3ayAtRiciJyAne3ByaW50ICQ0fScgfHwgdHJ1ZSkKKyAgICAgICAgICBpZiBbIC16ICIkdGVzdF90aW1lb3V0IiBdOyB0aGVuCisgICAgICAgICAgICB0ZXN0X3RpbWVvdXQ9JChncmVwICduYW1lPSJ0ZXN0LnRpbWVvdXQiJyBidWlsZC54bWwgfCBhd2sgLUYnIicgJ3twcmludCAkNH0nKQorICAgICAgICAgIGZpCisgICAgICAgICAgYW50IDw8cGFyYW1ldGVycy50YXJnZXQ+PiA8PHBhcmFtZXRlcnMuYXJndW1lbnRzPj4gLUR0ZXN0LnRpbWVvdXQ9IiR0ZXN0X3RpbWVvdXQiIC1EdGVzdC5jbGFzc2xpc3RmaWxlPS90bXAvamF2YV90ZXN0c18ke0NJUkNMRV9OT0RFX0lOREVYfV9maW5hbC50eHQgLUR0ZXN0LmNsYXNzbGlzdHByZWZpeD08PHBhcmFtZXRlcnMuY2xhc3NsaXN0cHJlZml4Pj4gLURuby1idWlsZC10ZXN0PXRydWUKKyAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDw8cGFyYW1ldGVycy5ub19vdXRwdXRfdGltZW91dD4+CisgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgIHBhdGg6IC90bXAvY2Fzc2FuZHJhL2J1aWxkL3Rlc3Qvb3V0cHV0LworICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICBwYXRoOiAvdG1wL2Nhc3NhbmRyYS9idWlsZC90ZXN0L291dHB1dAorICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgcGF0aDogL3RtcC9jYXNzYW5kcmEvYnVpbGQvdGVzdC9sb2dzCisgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisKKyAgY3JlYXRlX3ZlbnY6CisgICAgcGFyYW1ldGVyczoKKyAgICAgIHB5dGhvbl92ZXJzaW9uOgorICAgICAgICB0eXBlOiBlbnVtCisgICAgICAgIGRlZmF1bHQ6ICIzLjYiCisgICAgICAgIGVudW06IFsiMy42IiwgIjMuNyIsICIzLjgiLCAiMy4xMSJdCisgICAgc3RlcHM6CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IENvbmZpZ3VyZSB2aXJ0dWFsZW52IGFuZCBweXRob24gRGVwZW5kZW5jaWVzCisgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAjIG5vdGUsIHRoaXMgc2hvdWxkIGJlIHN1cGVyIHF1aWNrIGFzIGFsbCBkZXBlbmRlbmNpZXMgc2hvdWxkIGJlIHByZS1pbnN0YWxsZWQgaW4gdGhlIGRvY2tlciBpbWFnZQorICAgICAgICAgICMgaWYgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgd2VyZSBhZGRlZCB0byByZXF1aXJtZWVudHMudHh0IGFuZCB0aGUgZG9ja2VyIGltYWdlIGhhc24ndCBiZWVuIHVwZGF0ZWQKKyAgICAgICAgICAjIHdlJ2QgaGF2ZSB0byBpbnN0YWxsIGl0IGhlcmUgYXQgcnVudGltZSAtLSB3aGljaCB3aWxsIG1ha2UgdGhpbmdzIHNsb3csIHNvIGRvIHlvdXJzZWxmIGEgZmF2b3IgYW5kCisgICAgICAgICAgIyByZWJ1aWxkIHRoZSBkb2NrZXIgaW1hZ2UhIChpdCBhdXRvbWF0aWNhbGx5IHB1bGxzIHRoZSBsYXRlc3QgcmVxdWlyZW1lbnRzLnR4dCBvbiBidWlsZCkKKyAgICAgICAgICBzb3VyY2Ugfi9lbnY8PHBhcmFtZXRlcnMucHl0aG9uX3ZlcnNpb24+Pi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgIHBpcDMgaW5zdGFsbCAtLWV4aXN0cy1hY3Rpb24gdyAtLXVwZ3JhZGUgLXIgfi9jYXNzYW5kcmEtZHRlc3QvcmVxdWlyZW1lbnRzLnR4dAorICAgICAgICAgIHBpcDMgdW5pbnN0YWxsIC15IGNxbHNoCisgICAgICAgICAgcGlwMyBmcmVlemUKKworICBjcmVhdGVfZHRlc3RfY29udGFpbmVyczoKKyAgICBwYXJhbWV0ZXJzOgorICAgICAgZmlsZV90YWc6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgcnVuX2R0ZXN0c19leHRyYV9hcmdzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogJycKKyAgICAgIGV4dHJhX2Vudl9hcmdzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogJycKKyAgICAgIHRlc3RzX2ZpbHRlcl9wYXR0ZXJuOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgICAgZGVmYXVsdDogJycKKyAgICAgIHB5dGhvbl92ZXJzaW9uOgorICAgICAgICB0eXBlOiBlbnVtCisgICAgICAgIGRlZmF1bHQ6ICIzLjYiCisgICAgICAgIGVudW06IFsiMy42IiwgIjMuNyIsICIzLjgiLCAiMy4xMSJdCisgICAgc3RlcHM6CisgICAgLSBydW46CisgICAgICAgIG5hbWU6IERldGVybWluZSBUZXN0cyB0byBSdW4gKDw8cGFyYW1ldGVycy5maWxlX3RhZz4+KQorICAgICAgICBub19vdXRwdXRfdGltZW91dDogNW0KKyAgICAgICAgY29tbWFuZDogfAorICAgICAgICAgICMgcmVtaW5kZXI6IHRoaXMgY29kZSAoYWxvbmcgd2l0aCBhbGwgdGhlIHN0ZXBzKSBpcyBpbmRlcGVuZGVudGx5IGV4ZWN1dGVkIG9uIGV2ZXJ5IGNpcmNsZSBjb250YWluZXIKKyAgICAgICAgICAjIHNvIHRoZSBnb2FsIGhlcmUgaXMgdG8gZ2V0IHRoZSBjaXJjbGVjaSBzY3JpcHQgdG8gcmV0dXJuIHRoZSB0ZXN0cyAqdGhpcyogY29udGFpbmVyIHdpbGwgcnVuCisgICAgICAgICAgIyB3aGljaCB3ZSBkbyB2aWEgdGhlIGBjaXJjbGVjaWAgY2xpIHRvb2wuCisKKyAgICAgICAgICBjZCBjYXNzYW5kcmEtZHRlc3QKKyAgICAgICAgICBzb3VyY2Ugfi9lbnY8PHBhcmFtZXRlcnMucHl0aG9uX3ZlcnNpb24+Pi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgaWYgWyAtbiAnPDxwYXJhbWV0ZXJzLmV4dHJhX2Vudl9hcmdzPj4nIF07IHRoZW4KKyAgICAgICAgICAgIGV4cG9ydCA8PHBhcmFtZXRlcnMuZXh0cmFfZW52X2FyZ3M+PgorICAgICAgICAgIGZpCisKKyAgICAgICAgICBlY2hvICIqKipDb2xsZWN0ZWQgRFRlc3RzICg8PHBhcmFtZXRlcnMuZmlsZV90YWc+PikqKioiCisgICAgICAgICAgc2V0IC1lbyBwaXBlZmFpbCAmJiAuL3J1bl9kdGVzdHMucHkgPDxwYXJhbWV0ZXJzLnJ1bl9kdGVzdHNfZXh0cmFfYXJncz4+IC0tZHRlc3QtcHJpbnQtdGVzdHMtb25seSAtLWR0ZXN0LXByaW50LXRlc3RzLW91dHB1dD0vdG1wL2FsbF9kdGVzdF90ZXN0c188PHBhcmFtZXRlcnMuZmlsZV90YWc+Pl9yYXcgLS1jYXNzYW5kcmEtZGlyPS4uL2Nhc3NhbmRyYQorICAgICAgICAgIGlmIFsgLXogJzw8cGFyYW1ldGVycy50ZXN0c19maWx0ZXJfcGF0dGVybj4+JyBdOyB0aGVuCisgICAgICAgICAgICBtdiAvdG1wL2FsbF9kdGVzdF90ZXN0c188PHBhcmFtZXRlcnMuZmlsZV90YWc+Pl9yYXcgL3RtcC9hbGxfZHRlc3RfdGVzdHNfPDxwYXJhbWV0ZXJzLmZpbGVfdGFnPj4KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBncmVwIC1lICc8PHBhcmFtZXRlcnMudGVzdHNfZmlsdGVyX3BhdHRlcm4+PicgL3RtcC9hbGxfZHRlc3RfdGVzdHNfPDxwYXJhbWV0ZXJzLmZpbGVfdGFnPj5fcmF3ID4gL3RtcC9hbGxfZHRlc3RfdGVzdHNfPDxwYXJhbWV0ZXJzLmZpbGVfdGFnPj4gfHwgeyBlY2hvICJGaWx0ZXIgZGlkIG5vdCBtYXRjaCBhbnkgdGVzdHMhIEV4aXRpbmcgYnVpbGQuIjsgZXhpdCAwOyB9CisgICAgICAgICAgZmkKKyAgICAgICAgICBzZXQgLWVvIHBpcGVmYWlsICYmIGNpcmNsZWNpIHRlc3RzIHNwbGl0IC0tc3BsaXQtYnk9dGltaW5ncyAtLXRpbWluZ3MtdHlwZT1jbGFzc25hbWUgL3RtcC9hbGxfZHRlc3RfdGVzdHNfPDxwYXJhbWV0ZXJzLmZpbGVfdGFnPj4gPiAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzXzw8cGFyYW1ldGVycy5maWxlX3RhZz4+LnR4dAorICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzXzw8cGFyYW1ldGVycy5maWxlX3RhZz4+LnR4dCB8IHRyICdcbicgJyAnID4gL3RtcC9zcGxpdF9kdGVzdF90ZXN0c188PHBhcmFtZXRlcnMuZmlsZV90YWc+Pl9maW5hbC50eHQKKyAgICAgICAgICBjYXQgL3RtcC9zcGxpdF9kdGVzdF90ZXN0c188PHBhcmFtZXRlcnMuZmlsZV90YWc+Pl9maW5hbC50eHQKKworICBydW5fZHRlc3RzOgorICAgIHBhcmFtZXRlcnM6CisgICAgICBmaWxlX3RhZzoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBweXRlc3RfZXh0cmFfYXJnczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICcnCisgICAgICBleHRyYV9lbnZfYXJnczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICcnCisgICAgICBweXRob25fdmVyc2lvbjoKKyAgICAgICAgdHlwZTogZW51bQorICAgICAgICBkZWZhdWx0OiAiMy42IgorICAgICAgICBlbnVtOiBbIjMuNiIsICIzLjciLCAiMy44IiwgIjMuMTEiXQorICAgIHN0ZXBzOgorICAgICAgLSBydW46CisgICAgICAgICAgbmFtZTogUnVuIGR0ZXN0cyAoPDxwYXJhbWV0ZXJzLmZpbGVfdGFnPj4pCisgICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAgIGVjaG8gImNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzXzw8cGFyYW1ldGVycy5maWxlX3RhZz4+X2ZpbmFsLnR4dCIKKyAgICAgICAgICAgIGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzXzw8cGFyYW1ldGVycy5maWxlX3RhZz4+X2ZpbmFsLnR4dAorCisgICAgICAgICAgICBzb3VyY2Ugfi9lbnY8PHBhcmFtZXRlcnMucHl0aG9uX3ZlcnNpb24+Pi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgIGV4cG9ydCBQQVRIPSRKQVZBX0hPTUUvYmluOiRQQVRICisgICAgICAgICAgICBpZiBbIC1uICc8PHBhcmFtZXRlcnMuZXh0cmFfZW52X2FyZ3M+PicgXTsgdGhlbgorICAgICAgICAgICAgICBleHBvcnQgPDxwYXJhbWV0ZXJzLmV4dHJhX2Vudl9hcmdzPj4KKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgIGphdmEgLXZlcnNpb24KKyAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICBta2RpciAtcCAvdG1wL2R0ZXN0CisKKyAgICAgICAgICAgIGVjaG8gImVudjogJChlbnYpIgorICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICBta2RpciAtcCAvdG1wL3Jlc3VsdHMvZHRlc3RzCisgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICBleHBvcnQgU1BMSVRfVEVTVFM9YGNhdCAvdG1wL3NwbGl0X2R0ZXN0X3Rlc3RzXzw8cGFyYW1ldGVycy5maWxlX3RhZz4+X2ZpbmFsLnR4dGAKKyAgICAgICAgICAgIGlmIFsgISAteiAiJFNQTElUX1RFU1RTIiBdOyB0aGVuCisgICAgICAgICAgICAgIHNldCAtbyBwaXBlZmFpbCAmJiBjZCB+L2Nhc3NhbmRyYS1kdGVzdCAmJiBweXRlc3QgPDxwYXJhbWV0ZXJzLnB5dGVzdF9leHRyYV9hcmdzPj4gLS1sb2ctbGV2ZWw9IkRFQlVHIiAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHRfPDxwYXJhbWV0ZXJzLmZpbGVfdGFnPj4ueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciAkU1BMSVRfVEVTVFMgMj4mMSB8IHRlZSAvdG1wL2R0ZXN0L3N0ZG91dC50eHQKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgZWNobyAiVHVuZSB5b3VyIHBhcmFsbGVsaXNtLCB0aGVyZSBhcmUgbW9yZSBjb250YWluZXJzIHRoYW4gdGVzdCBjbGFzc2VzLiBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY29udGFpbmVyIgorICAgICAgICAgICAgICAoZXhpdCAxKQorICAgICAgICAgICAgZmkKKyAgICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cworICAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgICAgcGF0aDogL3RtcC9kdGVzdAorICAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF88PHBhcmFtZXRlcnMuZmlsZV90YWc+PgorICAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgICAgcGF0aDogfi9jYXNzYW5kcmEtZHRlc3QvbG9ncworICAgICAgICAgIGRlc3RpbmF0aW9uOiBkdGVzdF88PHBhcmFtZXRlcnMuZmlsZV90YWc+Pl9sb2dzCisKKyAgcnVuX3VuaXRfdGVzdHNfcmVwZWF0OgorICAgIHN0ZXBzOgorICAgICAgLSBydW5fcmVwZWF0ZWRfdXRlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdHNvbWUKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9VVEVTVFN9CisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfVVRFU1RTX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgcnVuX3V0ZXN0c19jZGNfcmVwZWF0OgorICAgIHN0ZXBzOgorICAgICAgLSBydW5fcmVwZWF0ZWRfdXRlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdC1jZGMKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9VVEVTVFN9CisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfVVRFU1RTX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgcnVuX3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQ6CisgICAgc3RlcHM6CisgICAgICAtIHJ1bl9yZXBlYXRlZF91dGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiB0ZXN0LWNvbXByZXNzaW9uCisgICAgICAgICAgdGVzdHM6ICR7UkVQRUFURURfVVRFU1RTfQorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX1VURVNUU19DT1VOVH0KKyAgICAgICAgICBzdG9wX29uX2ZhaWx1cmU6ICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfQorCisgIHJ1bl91dGVzdHNfdHJpZV9yZXBlYXQ6CisgICAgc3RlcHM6CisgICAgICAtIHJ1bl9yZXBlYXRlZF91dGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiB0ZXN0LXRyaWUKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9VVEVTVFN9CisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfVVRFU1RTX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgcnVuX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdDoKKyAgICBzdGVwczoKKyAgICAgIC0gcnVuX3JlcGVhdGVkX3V0ZXN0czoKKyAgICAgICAgICB0YXJnZXQ6IHRlc3Qtc3lzdGVtLWtleXNwYWNlLWRpcmVjdG9yeQorICAgICAgICAgIHRlc3RzOiAke1JFUEVBVEVEX1VURVNUU30KKyAgICAgICAgICBjb3VudDogJHtSRVBFQVRFRF9VVEVTVFNfQ09VTlR9CisgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KKworICBydW5fdXRlc3RzX2xvbmdfcmVwZWF0OgorICAgIHN0ZXBzOgorICAgICAgLSBydW5fcmVwZWF0ZWRfdXRlc3RzOgorICAgICAgICAgIHRhcmdldDogbG9uZy10ZXN0c29tZQorICAgICAgICAgIHRlc3RzOiAke1JFUEVBVEVEX1VURVNUU19MT05HfQorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX1VURVNUU19MT05HX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgcnVuX3V0ZXN0c19mcWx0b29sX3JlcGVhdDoKKyAgICBzdGVwczoKKyAgICAgIC0gcnVuX3JlcGVhdGVkX3V0ZXN0czoKKyAgICAgICAgICB0YXJnZXQ6IGZxbHRvb2wtdGVzdAorICAgICAgICAgIHRlc3RzOiAke1JFUEVBVEVEX1VURVNUU19GUUxUT09MfQorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX1VURVNUU19GUUxUT09MX0NPVU5UfQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgcnVuX3V0ZXN0c19zdHJlc3NfcmVwZWF0OgorICAgIHN0ZXBzOgorICAgICAgLSBydW5fcmVwZWF0ZWRfdXRlc3RzOgorICAgICAgICAgIHRhcmdldDogc3RyZXNzLXRlc3Qtc29tZQorICAgICAgICAgIHRlc3RzOiAke1JFUEVBVEVEX1VURVNUU19TVFJFU1N9CisgICAgICAgICAgY291bnQ6ICR7UkVQRUFURURfVVRFU1RTX1NUUkVTU19DT1VOVH0KKyAgICAgICAgICBzdG9wX29uX2ZhaWx1cmU6ICR7UkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFfQorCisgIHJ1bl9qdm1fZHRlc3RzX3JlcGVhdDoKKyAgICBzdGVwczoKKyAgICAgIC0gcnVuX3JlcGVhdGVkX3V0ZXN0czoKKyAgICAgICAgICB0YXJnZXQ6IHRlc3QtanZtLWR0ZXN0LXNvbWUKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9KVk1fRFRFU1RTfQorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlR9CisgICAgICAgICAgdm5vZGVzOiBmYWxzZQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgcnVuX3NpbXVsYXRvcl9kdGVzdHNfcmVwZWF0OgorICAgIHN0ZXBzOgorICAgICAgLSBydW5fcmVwZWF0ZWRfdXRlc3RzOgorICAgICAgICAgIHRhcmdldDogdGVzdC1zaW11bGF0b3ItZHRlc3QKKyAgICAgICAgICB0ZXN0czogJHtSRVBFQVRFRF9TSU1VTEFUT1JfRFRFU1RTfQorICAgICAgICAgIGNvdW50OiAke1JFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFNfQ09VTlR9CisgICAgICAgICAgc3RvcF9vbl9mYWlsdXJlOiAke1JFUEVBVEVEX1RFU1RTX1NUT1BfT05fRkFJTFVSRX0KKworICBydW5fanZtX2R0ZXN0c192bm9kZV9yZXBlYXQ6CisgICAgc3RlcHM6CisgICAgICAtIHJ1bl9yZXBlYXRlZF91dGVzdHM6CisgICAgICAgICAgdGFyZ2V0OiB0ZXN0LWp2bS1kdGVzdC1zb21lCisgICAgICAgICAgdGVzdHM6ICR7UkVQRUFURURfSlZNX0RURVNUU30KKyAgICAgICAgICBjb3VudDogJHtSRVBFQVRFRF9KVk1fRFRFU1RTX0NPVU5UfQorICAgICAgICAgIHZub2RlczogdHJ1ZQorICAgICAgICAgIHN0b3Bfb25fZmFpbHVyZTogJHtSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkV9CisKKyAgcnVuX3JlcGVhdGVkX3V0ZXN0czoKKyAgICBwYXJhbWV0ZXJzOgorICAgICAgdGFyZ2V0OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHRlc3RzOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIGNvdW50OgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICAgIHZub2RlczoKKyAgICAgICAgdHlwZTogYm9vbGVhbgorICAgICAgICBkZWZhdWx0OiBmYWxzZQorICAgICAgc3RvcF9vbl9mYWlsdXJlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBzdGVwczoKKyAgICAgIC0gcnVuOgorICAgICAgICAgIG5hbWU6IFJlcGVhdGVkbHkgcnVuIG5ldyBvciBtb2RpZmVkIEpVbml0IHRlc3RzCisgICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAgIHNldCAteAorICAgICAgICAgICAgZXhwb3J0IFBBVEg9JEpBVkFfSE9NRS9iaW46JFBBVEgKKyAgICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgICAgY2QgL3RtcC9jYXNzYW5kcmEKKyAgICAgICAgICAgIGlmIFsgLWQgfi9kdGVzdF9qYXJzIF07IHRoZW4KKyAgICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICAKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICBjb3VudD0kKCg8PHBhcmFtZXRlcnMuY291bnQ+PiAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKDw8cGFyYW1ldGVycy5jb3VudD4+ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgY291bnQ9JCgoY291bnQrMSkpCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgCisgICAgICAgICAgICAjIFB1dCBtYW51YWxseSBzcGVjaWZpZWQgdGVzdHMgYW5kIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdGVzdHMgdG9nZXRoZXIsIHJlbW92aW5nIGR1cGxpY2F0ZXMKKyAgICAgICAgICAgIHRlc3RzPSQoZWNobyA8PHBhcmFtZXRlcnMudGVzdHM+PiB8IHNlZCAtZSAicy88bmlsPi8vIiB8IHNlZCAtZSAicy8gLy8iIHwgdHIgIiwiICJcbiIgfCB0ciAiICIgIlxuIiB8IHNvcnQgLW4gfCB1bmlxIC11KQorICAgICAgICAgICAgZWNobyAiVGVzdHMgdG8gYmUgcmVwZWF0ZWQ6ICR7dGVzdHN9IgorICAgICAgICAgICAgCisgICAgICAgICAgICAjIFByZXBhcmUgdGhlIEpWTSBkdGVzdHMgdm5vZGVzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbC4KKyAgICAgICAgICAgIHZub2Rlcz08PHBhcmFtZXRlcnMudm5vZGVzPj4KKyAgICAgICAgICAgIHZub2Rlc19hcmdzPSIiCisgICAgICAgICAgICBpZiBbICIkdm5vZGVzIiA9IHRydWUgXSA7IHRoZW4KKyAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9Ii1EdGVzdC5qdm0uYXJncz0nLURjYXNzYW5kcmEuZHRlc3QubnVtX3Rva2Vucz0xNiciCisgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAjIFByZXBhcmUgdGhlIHRlc3R0YWcgZm9yIHRoZSB0YXJnZXQsIHVzZWQgYnkgdGhlIHRlc3QgbWFjcm8gaW4gYnVpbGQueG1sIHRvIGdyb3VwIHRoZSBvdXRwdXQgZmlsZXMKKyAgICAgICAgICAgIHRhcmdldD08PHBhcmFtZXRlcnMudGFyZ2V0Pj4KKyAgICAgICAgICAgIHRlc3R0YWc9IiIKKyAgICAgICAgICAgIGlmIFtbICR0YXJnZXQgPT0gInRlc3QtY2RjIiBdXTsgdGhlbgorICAgICAgICAgICAgICB0ZXN0dGFnPSJjZGMiCisgICAgICAgICAgICBlbGlmIFtbICR0YXJnZXQgPT0gInRlc3QtY29tcHJlc3Npb24iIF1dOyB0aGVuCisgICAgICAgICAgICAgIHRlc3R0YWc9ImNvbXByZXNzaW9uIgorICAgICAgICAgICAgZWxpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkiIF1dOyB0aGVuCisgICAgICAgICAgICAgIHRlc3R0YWc9InN5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnkiCisgICAgICAgICAgICBlbGlmIFtbICR0YXJnZXQgPT0gInRlc3QtdHJpZSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgdGVzdHRhZz0idHJpZSIKKyAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICMgUnVuIGVhY2ggdGVzdCBjbGFzcyBhcyBtYW55IHRpbWVzIGFzIHJlcXVlc3RlZC4KKyAgICAgICAgICAgIGV4aXRfY29kZT0iJD8iCisgICAgICAgICAgICBmb3IgdGVzdCBpbiAkdGVzdHM7IGRvCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAjIFNwbGl0IGNsYXNzIGFuZCBtZXRob2QgbmFtZXMgZnJvbSB0aGUgdGVzdCBuYW1lCisgICAgICAgICAgICAgICAgaWYgW1sgJHRlc3QgPX4gIiMiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgICBjbGFzcz0ke3Rlc3QlIiMiKn0KKyAgICAgICAgICAgICAgICAgIG1ldGhvZD0ke3Rlc3QjKiIjIn0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICBjbGFzcz0kdGVzdAorICAgICAgICAgICAgICAgICAgbWV0aG9kPSIiCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuCisgICAgICAgICAgICAgICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC4KKyAgICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jZGMiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNvbXByZXNzaW9uIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAiZnFsdG9vbC10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAic3RyZXNzLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXNpbXVsYXRvci1kdGVzdCIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG5hbWVfYXJnPSItRHRlc3QubmFtZT0ke2NsYXNzIyMqLn0iCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgbmFtZV9hcmc9Ii1EdGVzdC5uYW1lPSRjbGFzcyIKKyAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgIyBQcmVwYXJlIHRoZSAtRHRlc3QubWV0aG9kcyBhcmd1bWVudCwgd2hpY2ggaXMgb3B0aW9uYWwKKyAgICAgICAgICAgICAgICBpZiBbWyAkbWV0aG9kID09ICIiIF1dOyB0aGVuCisgICAgICAgICAgICAgICAgICBtZXRob2RzX2FyZz0iIgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIG1ldGhvZHNfYXJnPSItRHRlc3QubWV0aG9kcz0kbWV0aG9kIgorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvCisgICAgICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nIHRlc3QgJHRlc3QsIGl0ZXJhdGlvbiAkaSBvZiAkY291bnQiCisKKyAgICAgICAgICAgICAgICAgICMgcnVuIHRoZSB0ZXN0CisgICAgICAgICAgICAgICAgICBzdGF0dXM9InBhc3NlcyIKKyAgICAgICAgICAgICAgICAgIGlmICEoIHNldCAtbyBwaXBlZmFpbCAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICBhbnQgPDxwYXJhbWV0ZXJzLnRhcmdldD4+ICRuYW1lX2FyZyAkbWV0aG9kc19hcmcgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgdGVlIHN0ZG91dC50eHQgXAorICAgICAgICAgICAgICAgICAgICAgICk7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzPSJmYWlscyIKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9jb2RlPTEKKyAgICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgc3Rkb3V0IG91dHB1dCBmaWxlCisgICAgICAgICAgICAgICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0LyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgICAgbXYgc3Rkb3V0LnR4dCAkZGVzdC8ke3Rlc3R9LnR4dAorCisgICAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXMKKyAgICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dC8ke3Rlc3R0YWd9CisgICAgICAgICAgICAgICAgICBkZXN0PS90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvb3V0cHV0LyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0LworICAgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXMKKyAgICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MvJHt0ZXN0dGFnfQorICAgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3RzL2xvZ3MvJHtzdGF0dXN9LyR7aX0KKyAgICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uICIkKGxzICRzb3VyY2UpIiBdXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvCisgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmUKKyAgICAgICAgICAgICAgICAgIGlmIFtbIDw8cGFyYW1ldGVycy5zdG9wX29uX2ZhaWx1cmU+PiA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgZG9uZQorICAgICAgICAgICAgKGV4aXQgJHtleGl0X2NvZGV9KQorICAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvc3Rkb3V0CisgICAgICAgICAgZGVzdGluYXRpb246IHN0ZG91dAorICAgICAgLSBzdG9yZV9hcnRpZmFjdHM6CisgICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0cy9vdXRwdXQKKyAgICAgICAgICBkZXN0aW5hdGlvbjoganVuaXR4bWwKKyAgICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdHMvbG9ncworICAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisKKyAgcnVuX3JlcGVhdGVkX3V0ZXN0OgorICAgIHBhcmFtZXRlcnM6CisgICAgICB0YXJnZXQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgY2xhc3M6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgbWV0aG9kczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2bm9kZXM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgY291bnQ6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgc3RvcF9vbl9mYWlsdXJlOgorICAgICAgICB0eXBlOiBzdHJpbmcKKyAgICBzdGVwczoKKyAgICAgIC0gcnVuOgorICAgICAgICAgIG5hbWU6IFJ1biByZXBlYXRlZCBKVW5pdCB0ZXN0CisgICAgICAgICAgbm9fb3V0cHV0X3RpbWVvdXQ6IDE1bQorICAgICAgICAgIGNvbW1hbmQ6IHwKKyAgICAgICAgICAgIGlmIFsgIjw8cGFyYW1ldGVycy5jbGFzcz4+IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgdXRlc3QgY2xhc3MgbmFtZSBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICAgIGVsaWYgWyAiPDxwYXJhbWV0ZXJzLmNvdW50Pj4iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgICBlY2hvICJSZXBlYXRlZCB1dGVzdCBjb3VudCBoYXNuJ3QgYmVlbiBkZWZpbmVkLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICAgIGVsaWYgWyAiPDxwYXJhbWV0ZXJzLmNvdW50Pj4iIC1sZSAwIF07IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgdXRlc3QgY291bnQgaXMgbGVzc2VyIG9yIGVxdWFscyB0aGFuIHplcm8sIGV4aXRpbmcgd2l0aG91dCBydW5uaW5nIGFueSB0ZXN0IgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgCisgICAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdGVzdCBpdGVyYXRpb25zIHRvIGJlIHJ1biBieSB0aGUgY3VycmVudCBwYXJhbGxlbCBydW5uZXIuCisgICAgICAgICAgICAgICMgU2luY2Ugd2UgYXJlIHJ1bm5pbmcgdGhlIHNhbWUgdGVzdCBtdWx0aXBsZSB0aW1lcyB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBgY2lyY2xlY2kgdGVzdHMgc3BsaXRgLgorICAgICAgICAgICAgICBjb3VudD0kKCg8PHBhcmFtZXRlcnMuY291bnQ+PiAvIENJUkNMRV9OT0RFX1RPVEFMKSkKKyAgICAgICAgICAgICAgaWYgKCgkQ0lSQ0xFX05PREVfSU5ERVggPCAoPDxwYXJhbWV0ZXJzLmNvdW50Pj4gJSBDSVJDTEVfTk9ERV9UT1RBTCkpKTsgdGhlbgorICAgICAgICAgICAgICAgIGNvdW50PSQoKGNvdW50KzEpKQorICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgIGlmICgoJGNvdW50IDw9IDApKTsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIk5vIHRlc3RzIHRvIHJ1biBpbiB0aGlzIHJ1bm5lciIKKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgPDxwYXJhbWV0ZXJzLnRhcmdldD4+IDw8cGFyYW1ldGVycy5jbGFzcz4+IDw8cGFyYW1ldGVycy5tZXRob2RzPj4gPDxwYXJhbWV0ZXJzLmNvdW50Pj4gdGltZXMiCisKKyAgICAgICAgICAgICAgICBzZXQgLXgKKyAgICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorICAgICAgICAgICAgICAgIHRpbWUgbXYgfi9jYXNzYW5kcmEgL3RtcAorICAgICAgICAgICAgICAgIGNkIC90bXAvY2Fzc2FuZHJhCisgICAgICAgICAgICAgICAgaWYgWyAtZCB+L2R0ZXN0X2phcnMgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgY3Agfi9kdGVzdF9qYXJzL2R0ZXN0KiAvdG1wL2Nhc3NhbmRyYS9idWlsZC8KKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgdGFyZ2V0PTw8cGFyYW1ldGVycy50YXJnZXQ+PgorICAgICAgICAgICAgICAgIGNsYXNzX3BhdGg9PDxwYXJhbWV0ZXJzLmNsYXNzPj4KKyAgICAgICAgICAgICAgICBjbGFzc19uYW1lPSIke2NsYXNzX3BhdGgjIyoufSIKKworICAgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgLUR0ZXN0Lm5hbWUgYXJndW1lbnQuCisgICAgICAgICAgICAgICAgIyBJdCBjYW4gYmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9yIHRoZSBzaG9ydCBjbGFzcyBuYW1lLCBkZXBlbmRpbmcgb24gdGhlIHRhcmdldC4KKyAgICAgICAgICAgICAgICBpZiBbWyAkdGFyZ2V0ID09ICJ0ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1jZGMiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LWNvbXByZXNzaW9uIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC10cmllIiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAidGVzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAiZnFsdG9vbC10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAibG9uZy10ZXN0IiB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9PSAic3RyZXNzLXRlc3QiIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID09ICJ0ZXN0LXNpbXVsYXRvci1kdGVzdCIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgIG5hbWU9Ii1EdGVzdC5uYW1lPSRjbGFzc19uYW1lIgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIG5hbWU9Ii1EdGVzdC5uYW1lPSRjbGFzc19wYXRoIgorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIFByZXBhcmUgdGhlIC1EdGVzdC5tZXRob2RzIGFyZ3VtZW50LCB3aGljaCBpcyBvcHRpb25hbAorICAgICAgICAgICAgICAgIGlmIFsgIjw8cGFyYW1ldGVycy5tZXRob2RzPj4iID09ICI8bmlsPiIgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgbWV0aG9kcz0iIgorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIG1ldGhvZHM9Ii1EdGVzdC5tZXRob2RzPTw8cGFyYW1ldGVycy5tZXRob2RzPj4iCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgSlZNIGR0ZXN0cyB2bm9kZXMgYXJndW1lbnQsIHdoaWNoIGlzIG9wdGlvbmFsCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgICBpZiA8PHBhcmFtZXRlcnMudm5vZGVzPj47IHRoZW4KKyAgICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItRHRlc3QuanZtLmFyZ3M9Jy1EY2Fzc2FuZHJhLmR0ZXN0Lm51bV90b2tlbnM9MTYnIgorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIFJ1biB0aGUgdGVzdCB0YXJnZXQgYXMgbWFueSB0aW1lcyBhcyByZXF1ZXN0ZWQgY29sbGVjdGluZyB0aGUgZXhpdCBjb2RlLAorICAgICAgICAgICAgICAgICMgc3RvcHBpbmcgdGhlIGl0ZXJhdGlvbiBvbmx5IGlmIHN0b3Bfb25fZmFpbHVyZSBpcyBzZXQuCisgICAgICAgICAgICAgICAgZXhpdF9jb2RlPSIkPyIKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiAkKHNlcSAtdyAxICRjb3VudCk7IGRvCisKKyAgICAgICAgICAgICAgICAgIGVjaG8gIlJ1bm5pbmcgdGVzdCBpdGVyYXRpb24gJGkgb2YgJGNvdW50IgorCisgICAgICAgICAgICAgICAgICAjIHJ1biB0aGUgdGVzdAorICAgICAgICAgICAgICAgICAgc3RhdHVzPSJwYXNzZXMiCisgICAgICAgICAgICAgICAgICBpZiAhKCBzZXQgLW8gcGlwZWZhaWwgJiYgYW50ICR0YXJnZXQgJG5hbWUgJG1ldGhvZHMgJHZub2Rlc19hcmdzIC1Ebm8tYnVpbGQtdGVzdD10cnVlIHwgdGVlIHN0ZG91dC50eHQgKTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBzdGF0dXM9ImZhaWxzIgorICAgICAgICAgICAgICAgICAgICBleGl0X2NvZGU9MQorICAgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBzdGRvdXQgb3V0cHV0IGZpbGUKKyAgICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L3N0ZG91dC8ke3N0YXR1c30vJHtpfQorICAgICAgICAgICAgICAgICAgbWtkaXIgLXAgJGRlc3QKKyAgICAgICAgICAgICAgICAgIG12IHN0ZG91dC50eHQgJGRlc3QvPDxwYXJhbWV0ZXJzLnRhcmdldD4+LTw8cGFyYW1ldGVycy5jbGFzcz4+LnR4dAorCisgICAgICAgICAgICAgICAgICAjIG1vdmUgdGhlIFhNTCBvdXRwdXQgZmlsZXMKKyAgICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L291dHB1dAorICAgICAgICAgICAgICAgICAgZGVzdD0vdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0LyR7c3RhdHVzfS8ke2l9CisgICAgICAgICAgICAgICAgICBta2RpciAtcCAkZGVzdAorICAgICAgICAgICAgICAgICAgaWYgW1sgLWQgJHNvdXJjZSAmJiAtbiAiJChscyAkc291cmNlKSIgXV07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgbXYgJHNvdXJjZS8qICRkZXN0LworICAgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSBsb2cgZmlsZXMKKyAgICAgICAgICAgICAgICAgIHNvdXJjZT1idWlsZC90ZXN0L2xvZ3MKKyAgICAgICAgICAgICAgICAgIGRlc3Q9L3RtcC9yZXN1bHRzL3JlcGVhdGVkX3V0ZXN0L2xvZ3MvJHtzdGF0dXN9LyR7aX0KKyAgICAgICAgICAgICAgICAgIG1rZGlyIC1wICRkZXN0CisgICAgICAgICAgICAgICAgICBpZiBbWyAtZCAkc291cmNlICYmIC1uICIkKGxzICRzb3VyY2UpIiBdXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICBtdiAkc291cmNlLyogJGRlc3QvCisgICAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgICAjIG1heWJlIHN0b3AgaXRlcmF0aW9ucyBvbiB0ZXN0IGZhaWx1cmUKKyAgICAgICAgICAgICAgICAgIGlmIFtbIDw8cGFyYW1ldGVycy5zdG9wX29uX2ZhaWx1cmU+PiA9IHRydWUgXV0gJiYgKCggJGV4aXRfY29kZSA+IDAgKSk7IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICAgICAgZG9uZQorCisgICAgICAgICAgICAgICAgKGV4aXQgJHtleGl0X2NvZGV9KQorICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgZmkKKyAgICAgIC0gc3RvcmVfdGVzdF9yZXN1bHRzOgorICAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9vdXRwdXQKKyAgICAgIC0gc3RvcmVfYXJ0aWZhY3RzOgorICAgICAgICAgIHBhdGg6IC90bXAvcmVzdWx0cy9yZXBlYXRlZF91dGVzdC9zdGRvdXQKKyAgICAgICAgICBkZXN0aW5hdGlvbjogc3Rkb3V0CisgICAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3Qvb3V0cHV0CisgICAgICAgICAgZGVzdGluYXRpb246IGp1bml0eG1sCisgICAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgICBwYXRoOiAvdG1wL3Jlc3VsdHMvcmVwZWF0ZWRfdXRlc3QvbG9ncworICAgICAgICAgIGRlc3RpbmF0aW9uOiBsb2dzCisKKyAgcnVuX3JlcGVhdGVkX2R0ZXN0OgorICAgIHBhcmFtZXRlcnM6CisgICAgICB0ZXN0czoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICB2bm9kZXM6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgdXBncmFkZToKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBjb3VudDoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICBzdG9wX29uX2ZhaWx1cmU6CisgICAgICAgIHR5cGU6IHN0cmluZworICAgICAgZXh0cmFfZHRlc3RfYXJnczoKKyAgICAgICAgdHlwZTogc3RyaW5nCisgICAgICAgIGRlZmF1bHQ6ICIiCisgICAgc3RlcHM6CisgICAgICAtIHJ1bjoKKyAgICAgICAgICBuYW1lOiBSdW4gcmVwZWF0ZWQgUHl0aG9uIERUZXN0cworICAgICAgICAgIG5vX291dHB1dF90aW1lb3V0OiAxNW0KKyAgICAgICAgICBjb21tYW5kOiB8CisgICAgICAgICAgICBpZiBbICI8PHBhcmFtZXRlcnMudGVzdHM+PiIgPT0gIjxuaWw+IiBdOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IG5hbWUgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgICBlbGlmIFsgIjw8cGFyYW1ldGVycy5jb3VudD4+IiA9PSAiPG5pbD4iIF07IHRoZW4KKyAgICAgICAgICAgICAgZWNobyAiUmVwZWF0ZWQgZHRlc3QgY291bnQgaGFzbid0IGJlZW4gZGVmaW5lZCwgZXhpdGluZyB3aXRob3V0IHJ1bm5pbmcgYW55IHRlc3QiCisgICAgICAgICAgICBlbGlmIFsgIjw8cGFyYW1ldGVycy5jb3VudD4+IiAtbGUgMCBdOyB0aGVuCisgICAgICAgICAgICAgIGVjaG8gIlJlcGVhdGVkIGR0ZXN0IGNvdW50IGlzIGxlc3NlciBvciBlcXVhbHMgdGhhbiB6ZXJvLCBleGl0aW5nIHdpdGhvdXQgcnVubmluZyBhbnkgdGVzdCIKKyAgICAgICAgICAgIGVsc2UKKworICAgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucyB0byBiZSBydW4gYnkgdGhlIGN1cnJlbnQgcGFyYWxsZWwgcnVubmVyLgorICAgICAgICAgICAgICAjIFNpbmNlIHdlIGFyZSBydW5uaW5nIHRoZSBzYW1lIHRlc3QgbXVsdGlwbGUgdGltZXMgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYGNpcmNsZWNpIHRlc3RzIHNwbGl0YC4KKyAgICAgICAgICAgICAgY291bnQ9JCgoPDxwYXJhbWV0ZXJzLmNvdW50Pj4gLyBDSVJDTEVfTk9ERV9UT1RBTCkpCisgICAgICAgICAgICAgIGlmICgoJENJUkNMRV9OT0RFX0lOREVYIDwgKDw8cGFyYW1ldGVycy5jb3VudD4+ICUgQ0lSQ0xFX05PREVfVE9UQUwpKSk7IHRoZW4KKyAgICAgICAgICAgICAgICBjb3VudD0kKChjb3VudCsxKSkKKyAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICBpZiAoKCRjb3VudCA8PSAwKSk7IHRoZW4KKyAgICAgICAgICAgICAgICBlY2hvICJObyB0ZXN0cyB0byBydW4gaW4gdGhpcyBydW5uZXIiCisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBlY2hvICJSdW5uaW5nIDw8cGFyYW1ldGVycy50ZXN0cz4+ICRjb3VudCB0aW1lcyIKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNvdXJjZSB+L2VudjMuNi9iaW4vYWN0aXZhdGUKKyAgICAgICAgICAgICAgICBleHBvcnQgUEFUSD0kSkFWQV9IT01FL2JpbjokUEFUSAorCisgICAgICAgICAgICAgICAgamF2YSAtdmVyc2lvbgorICAgICAgICAgICAgICAgIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0CisgICAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9kdGVzdAorCisgICAgICAgICAgICAgICAgZWNobyAiZW52OiAkKGVudikiCisgICAgICAgICAgICAgICAgZWNobyAiKiogZG9uZSBlbnYiCisgICAgICAgICAgICAgICAgbWtkaXIgLXAgL3RtcC9yZXN1bHRzL2R0ZXN0cworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdGVzdHNfYXJnPSQoZWNobyA8PHBhcmFtZXRlcnMudGVzdHM+PiB8IHNlZCAtZSAicy8sLyAvZyIpCisKKyAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIiCisgICAgICAgICAgICAgICAgaWYgPDxwYXJhbWV0ZXJzLnN0b3Bfb25fZmFpbHVyZT4+OyB0aGVuCisgICAgICAgICAgICAgICAgICBzdG9wX29uX2ZhaWx1cmVfYXJnPSIteCIKKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgdm5vZGVzX2FyZ3M9IiIKKyAgICAgICAgICAgICAgICBpZiA8PHBhcmFtZXRlcnMudm5vZGVzPj47IHRoZW4KKyAgICAgICAgICAgICAgICAgIHZub2Rlc19hcmdzPSItLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IgorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICB1cGdyYWRlX2FyZz0iIgorICAgICAgICAgICAgICAgIGlmIDw8cGFyYW1ldGVycy51cGdyYWRlPj47IHRoZW4KKyAgICAgICAgICAgICAgICAgIHVwZ3JhZGVfYXJnPSItLWV4ZWN1dGUtdXBncmFkZS10ZXN0cyAtLXVwZ3JhZGUtdGFyZ2V0LXZlcnNpb24tb25seSAtLXVwZ3JhZGUtdmVyc2lvbi1zZWxlY3Rpb24gYWxsIgorICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAjIHdlIG5lZWQgdGhlICJzZXQgLW8gcGlwZWZhaWwiIGhlcmUgc28gdGhhdCB0aGUgZXhpdCBjb2RlIHRoYXQgY2lyY2xlY2kgd2lsbCBhY3R1YWxseSB1c2UgaXMgZnJvbSBweXRlc3QgYW5kIG5vdCB0aGUgZXhpdCBjb2RlIGZyb20gdGVlCisgICAgICAgICAgICAgICAgc2V0IC1vIHBpcGVmYWlsICYmIGNkIH4vY2Fzc2FuZHJhLWR0ZXN0ICYmIHB5dGVzdCAkdm5vZGVzX2FyZ3MgLS1jb3VudD0kY291bnQgJHN0b3Bfb25fZmFpbHVyZV9hcmcgJHVwZ3JhZGVfYXJnIC0tbG9nLWNsaS1sZXZlbD1ERUJVRyAtLWp1bml0LXhtbD0vdG1wL3Jlc3VsdHMvZHRlc3RzL3B5dGVzdF9yZXN1bHQueG1sIC1zIC0tY2Fzc2FuZHJhLWRpcj0vaG9tZS9jYXNzYW5kcmEvY2Fzc2FuZHJhIC0ta2VlcC10ZXN0LWRpciA8PHBhcmFtZXRlcnMuZXh0cmFfZHRlc3RfYXJncz4+ICR0ZXN0c19hcmcgfCB0ZWUgL3RtcC9kdGVzdC9zdGRvdXQudHh0CisgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBmaQorICAgICAgLSBzdG9yZV90ZXN0X3Jlc3VsdHM6CisgICAgICAgICAgcGF0aDogL3RtcC9yZXN1bHRzCisgICAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgICBwYXRoOiAvdG1wL2R0ZXN0CisgICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0CisgICAgICAtIHN0b3JlX2FydGlmYWN0czoKKyAgICAgICAgICBwYXRoOiB+L2Nhc3NhbmRyYS1kdGVzdC9sb2dzCisgICAgICAgICAgZGVzdGluYXRpb246IGR0ZXN0X2xvZ3MKZGlmZiAtLWdpdCBhLy5jaXJjbGVjaS9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbC5QQUlELnBhdGNoIGIvLmNpcmNsZWNpL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sLlBBSUQucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjNjU2MAotLS0gL2Rldi9udWxsCisrKyBiLy5jaXJjbGVjaS9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbC5QQUlELnBhdGNoCkBAIC0wLDAgKzEsMzc0IEBACistLS0gY29uZmlnX3RlbXBsYXRlXzExX2FuZF8xNy55bWwJMjAyMy0wMy0xNSAyMTozNDo1Ny4wMDAwMDAwMDAgLTA0MDAKKysrKyBjb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbC5QQUlECTIwMjMtMDMtMTUgMjE6Mzc6MjUuMDAwMDAwMDAwIC0wNDAwCitAQCAtMTQwLDE0ICsxNDAsMTQgQEAKKyBqMTFfcGFyX2V4ZWN1dG9yOiAmajExX3Bhcl9leGVjdXRvcgorICAgZXhlY3V0b3I6CisgICAgIG5hbWU6IGphdmExMS1leGVjdXRvcgorLSAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCistICBwYXJhbGxlbGlzbTogNAorKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiBtZWRpdW0KKysgIHBhcmFsbGVsaXNtOiAyNQorIAorIGoxMV9zbWFsbF9wYXJfZXhlY3V0b3I6ICZqMTFfc21hbGxfcGFyX2V4ZWN1dG9yCisgICBleGVjdXRvcjoKKyAgICAgbmFtZTogamF2YTExLWV4ZWN1dG9yCistICAgICNleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKy0gIHBhcmFsbGVsaXNtOiAxCisrICAgIGV4ZWNfcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisrICBwYXJhbGxlbGlzbTogMTAKKyAKKyBqMTFfc21hbGxfZXhlY3V0b3I6ICZqMTFfc21hbGxfZXhlY3V0b3IKKyAgIGV4ZWN1dG9yOgorQEAgLTE1NSwzMCArMTU1LDQxIEBACisgICAgIGV4ZWNfcmVzb3VyY2VfY2xhc3M6IG1lZGl1bQorICAgcGFyYWxsZWxpc206IDEKKyAKKytqMTFfbGFyZ2VfcGFyX2V4ZWN1dG9yOiAmajExX2xhcmdlX3Bhcl9leGVjdXRvcgorKyAgZXhlY3V0b3I6CisrICAgIG5hbWU6IGphdmExMS1leGVjdXRvcgorKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiBsYXJnZQorKyAgcGFyYWxsZWxpc206IDUwCisrCisrajExX3ZlcnlfbGFyZ2VfcGFyX2V4ZWN1dG9yOiAmajExX3ZlcnlfbGFyZ2VfcGFyX2V4ZWN1dG9yCisrICBleGVjdXRvcjoKKysgICAgbmFtZTogamF2YTExLWV4ZWN1dG9yCisrICAgIGV4ZWNfcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisrICBwYXJhbGxlbGlzbTogMTAwCisrCisgajExX21lZGl1bV9wYXJfZXhlY3V0b3I6ICZqMTFfbWVkaXVtX3Bhcl9leGVjdXRvcgorICAgZXhlY3V0b3I6CisgICAgIG5hbWU6IGphdmExMS1leGVjdXRvcgorLSAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCistICBwYXJhbGxlbGlzbTogMQorKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKysgIHBhcmFsbGVsaXNtOiA0CisgCisgajExX3NlcV9leGVjdXRvcjogJmoxMV9zZXFfZXhlY3V0b3IKKyAgIGV4ZWN1dG9yOgorICAgICBuYW1lOiBqYXZhMTEtZXhlY3V0b3IKKy0gICAgI2V4ZWNfcmVzb3VyY2VfY2xhc3M6IHhsYXJnZQorICAgICBleGVjX3Jlc291cmNlX2NsYXNzOiBtZWRpdW0KKyAgIHBhcmFsbGVsaXNtOiAxICMgc2VxdWVudGlhbCwgc2luZ2xlIGNvbnRhaW5lciB0ZXN0czogbm8gcGFyYWxsZWxpc20gYmVuZWZpdHMKKyAKKyBqMTdfcGFyX2V4ZWN1dG9yOiAmajE3X3Bhcl9leGVjdXRvcgorICAgZXhlY3V0b3I6CisgICAgIG5hbWU6IGphdmExNy1leGVjdXRvcgorLSAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCistICBwYXJhbGxlbGlzbTogNAorKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiBtZWRpdW0KKysgIHBhcmFsbGVsaXNtOiAyNQorIAorIGoxN19zbWFsbF9wYXJfZXhlY3V0b3I6ICZqMTdfc21hbGxfcGFyX2V4ZWN1dG9yCisgICBleGVjdXRvcjoKKyAgICAgbmFtZTogamF2YTE3LWV4ZWN1dG9yCistICAgICNleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKy0gIHBhcmFsbGVsaXNtOiAxCisrICAgIGV4ZWNfcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisrICBwYXJhbGxlbGlzbTogMTAKKyAKKyBqMTdfc21hbGxfZXhlY3V0b3I6ICZqMTdfc21hbGxfZXhlY3V0b3IKKyAgIGV4ZWN1dG9yOgorQEAgLTE4OSwzNCArMjAwLDQ0IEBACisgajE3X21lZGl1bV9wYXJfZXhlY3V0b3I6ICZqMTdfbWVkaXVtX3Bhcl9leGVjdXRvcgorICAgZXhlY3V0b3I6CisgICAgIG5hbWU6IGphdmExNy1leGVjdXRvcgorLSAgICAjZXhlY19yZXNvdXJjZV9jbGFzczogeGxhcmdlCistICBwYXJhbGxlbGlzbTogMQorKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKysgIHBhcmFsbGVsaXNtOiA0CisrCisrajE3X2xhcmdlX3Bhcl9leGVjdXRvcjogJmoxN19sYXJnZV9wYXJfZXhlY3V0b3IKKysgIGV4ZWN1dG9yOgorKyAgICBuYW1lOiBqYXZhMTctZXhlY3V0b3IKKysgICAgZXhlY19yZXNvdXJjZV9jbGFzczogbGFyZ2UKKysgIHBhcmFsbGVsaXNtOiA1MAorIAorIGoxN19zZXFfZXhlY3V0b3I6ICZqMTdfc2VxX2V4ZWN1dG9yCisgICBleGVjdXRvcjoKKyAgICAgbmFtZTogamF2YTE3LWV4ZWN1dG9yCistICAgICNleGVjX3Jlc291cmNlX2NsYXNzOiB4bGFyZ2UKKysgICAgZXhlY19yZXNvdXJjZV9jbGFzczogbWVkaXVtCisgICBwYXJhbGxlbGlzbTogMSAjIHNlcXVlbnRpYWwsIHNpbmdsZSBjb250YWluZXIgdGVzdHM6IG5vIHBhcmFsbGVsaXNtIGJlbmVmaXRzCisgCisgajExX3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yOiAmajExX3JlcGVhdGVkX3V0ZXN0X2V4ZWN1dG9yCisgICBleGVjdXRvcjoKKyAgICAgbmFtZTogamF2YTExLWV4ZWN1dG9yCistICBwYXJhbGxlbGlzbTogNAorKyAgICBleGVjX3Jlc291cmNlX2NsYXNzOiBtZWRpdW0KKysgIHBhcmFsbGVsaXNtOiAyNQorIAorIGoxMV9yZXBlYXRlZF9kdGVzdF9leGVjdXRvcjogJmoxMV9yZXBlYXRlZF9kdGVzdF9leGVjdXRvcgorICAgZXhlY3V0b3I6CisgICAgIG5hbWU6IGphdmExMS1leGVjdXRvcgorLSAgcGFyYWxsZWxpc206IDQKKysgICAgZXhlY19yZXNvdXJjZV9jbGFzczogbGFyZ2UKKysgIHBhcmFsbGVsaXNtOiAyNQorIAorIGoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcjogJmoxN19yZXBlYXRlZF91dGVzdF9leGVjdXRvcgorICAgZXhlY3V0b3I6CisgICAgIG5hbWU6IGphdmExNy1leGVjdXRvcgorLSAgcGFyYWxsZWxpc206IDQKKysgICAgZXhlY19yZXNvdXJjZV9jbGFzczogbWVkaXVtCisrICBwYXJhbGxlbGlzbTogMjUKKyAKKyBqMTdfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3I6ICZqMTdfcmVwZWF0ZWRfZHRlc3RfZXhlY3V0b3IKKyAgIGV4ZWN1dG9yOgorICAgICBuYW1lOiBqYXZhMTctZXhlY3V0b3IKKy0gIHBhcmFsbGVsaXNtOiA0CisrICAgIGV4ZWNfcmVzb3VyY2VfY2xhc3M6IGxhcmdlCisrICBwYXJhbGxlbGlzbTogMjUKKyAKKyBqMTFfc2VwYXJhdGVfam9iczogJmoxMV9zZXBhcmF0ZV9qb2JzCisgICBqb2JzOgorQEAgLTE4MDgsNyArMTgyOSw3IEBACisgICAgICAgICAgIHRhcmdldDogdGVzdGNsYXNzbGlzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5CisgCisgICBqMTFfZHRlc3RzX3Zub2RlOgorLSAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTFfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTE4MjIsNyArMTg0Myw3IEBACisgICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworIAorICAgajExX2R0ZXN0c19vZmZoZWFwOgorLSAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTFfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTE4MzYsNyArMTg1Nyw3IEBACisgICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLXVzZS1vZmYtaGVhcC1tZW10YWJsZXMgLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cycKKyAKKyAgIGoxN19kdGVzdHNfdm5vZGU6CistICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorKyAgICA8PDogKmoxN19sYXJnZV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0xODUxLDcgKzE4NzIsNyBAQAorICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgCisgICBqMTdfZHRlc3RzX29mZmhlYXA6CistICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorKyAgICA8PDogKmoxN19sYXJnZV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMTg2Niw3ICsxODg3LDcgQEAKKyAgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tdXNlLW9mZi1oZWFwLW1lbXRhYmxlcyAtLXNraXAtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworIAorICAgajExX2R0ZXN0czoKKy0gICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajExX2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0xODgwLDcgKzE5MDEsNyBAQAorICAgICAgICAgICBweXRlc3RfZXh0cmFfYXJnczogJy0tc2tpcC1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgCisgICBqMTdfZHRlc3RzOgorLSAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTdfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMTg5NSw3ICsxOTE2LDcgQEAKKyAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS1za2lwLXJlc291cmNlLWludGVuc2l2ZS10ZXN0cycKKyAKKyAgIGoxMV9jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorLSAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTFfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTE5MTAsNyArMTkzMSw3IEBACisgICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKKyAKKyAgIGoxMV9jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CistICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorKyAgICA8PDogKmoxMV9sYXJnZV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMTkyNSw3ICsxOTQ2LDcgQEAKKyAgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JworIAorICAgajExX2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorLSAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTFfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTE5NDMsNyArMTk2NCw3IEBACisgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworIAorICAgajExX2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKy0gICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajExX2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0xOTYxLDcgKzE5ODIsNyBAQAorICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisgCisgICBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKy0gICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajExX2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0xOTc5LDcgKzIwMDAsNyBAQAorICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAKKyAgIGoxMV9jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKy0gICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajExX2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0xOTk3LDcgKzIwMTgsNyBAQAorICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisgCisgICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzoKKy0gICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajExX2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0yMDEyLDcgKzIwMzMsNyBAQAorICAgICAgICAgICBleHRyYV9lbnZfYXJnczogJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYnCisgCisgICBqMTFfY3Fsc2hfZHRlc3RzX3B5Mzg6CistICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorKyAgICA8PDogKmoxMV9sYXJnZV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMjAzMCw3ICsyMDUxLDcgQEAKKyAgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjgnCisgCisgICBqMTFfY3Fsc2hfZHRlc3RzX3B5MzExOgorLSAgICA8PDogKmoxMV9wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTFfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTIwNDgsNyArMjA2OSw3IEBACisgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAKKyAgIGoxN19jcWxzaF9kdGVzdHNfcHkzX3Zub2RlOgorLSAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTdfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTIwNjMsNyArMjA4NCw3IEBACisgICAgICAgICAgIGV4dHJhX2Vudl9hcmdzOiAnQ1FMU0hfUFlUSE9OPS91c3IvYmluL3B5dGhvbjMuNicKKyAKKyAgIGoxN19jcWxzaF9kdGVzdHNfcHkzX29mZmhlYXA6CistICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorKyAgICA8PDogKmoxN19sYXJnZV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMjA3OCw3ICsyMDk5LDcgQEAKKyAgICAgICAgICAgZXh0cmFfZW52X2FyZ3M6ICdDUUxTSF9QWVRIT049L3Vzci9iaW4vcHl0aG9uMy42JworIAorICAgajE3X2NxbHNoX2R0ZXN0c19weTM4X3Zub2RlOgorLSAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTdfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTIwOTYsNyArMjExNyw3IEBACisgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy44JworIAorICAgajE3X2NxbHNoX2R0ZXN0c19weTMxMV92bm9kZToKKy0gICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajE3X2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0yMTE0LDcgKzIxMzUsNyBAQAorICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisgCisgICBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzhfb2ZmaGVhcDoKKy0gICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajE3X2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0yMTMyLDcgKzIxNTMsNyBAQAorICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuOCcKKyAKKyAgIGoxN19jcWxzaF9kdGVzdHNfcHkzMTFfb2ZmaGVhcDoKKy0gICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajE3X2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0yMTUwLDcgKzIxNzEsNyBAQAorICAgICAgICAgICBweXRob25fdmVyc2lvbjogJzMuMTEnCisgCisgICBqMTdfY3Fsc2hfZHRlc3RzX3B5MzoKKy0gICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajE3X2xhcmdlX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKK0BAIC0yMTY1LDcgKzIxODYsNyBAQAorICAgICAgICAgICBleHRyYV9lbnZfYXJnczogJ0NRTFNIX1BZVEhPTj0vdXNyL2Jpbi9weXRob24zLjYnCisgCisgICBqMTdfY3Fsc2hfZHRlc3RzX3B5Mzg6CistICAgIDw8OiAqajE3X3Bhcl9leGVjdXRvcgorKyAgICA8PDogKmoxN19sYXJnZV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMjE4Myw3ICsyMjA0LDcgQEAKKyAgICAgICAgICAgcHl0aG9uX3ZlcnNpb246ICczLjgnCisgCisgICBqMTdfY3Fsc2hfZHRlc3RzX3B5MzExOgorLSAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTdfbGFyZ2VfcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTIyMDEsNyArMjIyMiw3IEBACisgICAgICAgICAgIHB5dGhvbl92ZXJzaW9uOiAnMy4xMScKKyAKKyAgIGoxMV9kdGVzdHNfbGFyZ2Vfdm5vZGU6CistICAgIDw8OiAqajExX3Bhcl9leGVjdXRvcgorKyAgICA8PDogKmoxMV9tZWRpdW1fcGFyX2V4ZWN1dG9yCisgICAgIHN0ZXBzOgorICAgICAgIC0gYXR0YWNoX3dvcmtzcGFjZToKKyAgICAgICAgICAgYXQ6IC9ob21lL2Nhc3NhbmRyYQorQEAgLTIyMTUsNyArMjIzNiw3IEBACisgICAgICAgICAgIHB5dGVzdF9leHRyYV9hcmdzOiAnLS11c2Utdm5vZGVzIC0tbnVtLXRva2Vucz0xNiAtLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworIAorICAgajExX2R0ZXN0c19sYXJnZToKKy0gICAgPDw6ICpqMTFfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajExX21lZGl1bV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMjIyOSw3ICsyMjUwLDcgQEAKKyAgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLW9ubHktcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzIC0tZm9yY2UtcmVzb3VyY2UtaW50ZW5zaXZlLXRlc3RzJworIAorICAgajE3X2R0ZXN0c19sYXJnZV92bm9kZToKKy0gICAgPDw6ICpqMTdfcGFyX2V4ZWN1dG9yCisrICAgIDw8OiAqajE3X21lZGl1bV9wYXJfZXhlY3V0b3IKKyAgICAgc3RlcHM6CisgICAgICAgLSBhdHRhY2hfd29ya3NwYWNlOgorICAgICAgICAgICBhdDogL2hvbWUvY2Fzc2FuZHJhCitAQCAtMjI0Myw3ICsyMjY0LDcgQEAKKyAgICAgICAgICAgcHl0ZXN0X2V4dHJhX2FyZ3M6ICctLXVzZS12bm9kZXMgLS1udW0tdG9rZW5zPTE2IC0tb25seS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMgLS1mb3JjZS1yZXNvdXJjZS1pbnRlbnNpdmUtdGVzdHMnCisgCisgICBqMTdfZHRlc3RzX2xhcmdlOgorLSAgICA8PDogKmoxN19wYXJfZXhlY3V0b3IKKysgICAgPDw6ICpqMTdfbWVkaXVtX3Bhcl9leGVjdXRvcgorICAgICBzdGVwczoKKyAgICAgICAtIGF0dGFjaF93b3Jrc3BhY2U6CisgICAgICAgICAgIGF0OiAvaG9tZS9jYXNzYW5kcmEKZGlmZiAtLWdpdCBhLy5jaXJjbGVjaS9nZW5lcmF0ZS5zaCBiLy5jaXJjbGVjaS9nZW5lcmF0ZS5zaAppbmRleCAyOWY2NmEyLi5lNTQwZDZmIDEwMDc1NQotLS0gYS8uY2lyY2xlY2kvZ2VuZXJhdGUuc2gKKysrIGIvLmNpcmNsZWNpL2dlbmVyYXRlLnNoCkBAIC0xOCw3ICsxOCw3IEBACiAjCiAKIEJBU0VESVI9YGRpcm5hbWUgJDBgCi1CQVNFX0JSQU5DSD1jYXNzYW5kcmEtNC4xCitCQVNFX0JSQU5DSD10cnVuawogc2V0IC1lCiAKIGRpZSAoKQpAQCAtMjU4LDYgKzI1OCw4IEBACiAgICAgZGVsZXRlX2pvYiAiJDEiICJqMTFfdXRlc3RzX2NkY19yZXBlYXQiCiAgICAgZGVsZXRlX2pvYiAiJDEiICJqOF91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0IgogICAgIGRlbGV0ZV9qb2IgIiQxIiAiajExX3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQiCisgICAgZGVsZXRlX2pvYiAiJDEiICJqOF91dGVzdHNfdHJpZV9yZXBlYXQiCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTFfdXRlc3RzX3RyaWVfcmVwZWF0IgogICAgIGRlbGV0ZV9qb2IgIiQxIiAiajhfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0IgogICAgIGRlbGV0ZV9qb2IgIiQxIiAiajExX3V0ZXN0c19zeXN0ZW1fa2V5c3BhY2VfZGlyZWN0b3J5X3JlcGVhdCIKICAgZmkKZGlmZiAtLWdpdCBhLy5jaXJjbGVjaS9nZW5lcmF0ZV8xMV9hbmRfMTcuc2ggYi8uY2lyY2xlY2kvZ2VuZXJhdGVfMTFfYW5kXzE3LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMwOTcyM2EKLS0tIC9kZXYvbnVsbAorKysgYi8uY2lyY2xlY2kvZ2VuZXJhdGVfMTFfYW5kXzE3LnNoCkBAIC0wLDAgKzEsMzA2IEBACisjIS9iaW4vc2gKKyMKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0JBU0VESVI9YGRpcm5hbWUgJDBgCitCQVNFX0JSQU5DSD10cnVuaworc2V0IC1lCisKK2RpZSAoKQoreworICBlY2hvICJFUlJPUjogJCoiCisgIHByaW50X2hlbHAKKyAgZXhpdCAxCit9CisKK3ByaW50X2hlbHAoKQoreworICBlY2hvICJVc2FnZTogJDAgWy1mfC1wfC1hfC1lfC1pXSIKKyAgZWNobyAiICAgLWEgR2VuZXJhdGUgdGhlIGNvbmZpZ18xMV9hbmRfMTcueW1sLCBjb25maWdfMTFfYW5kXzE3LnltbC5GUkVFIGFuZCBjb25maWdfMTFfYW5kXzE3LnltbC5QQUlEIGV4cGFuZGVkIGNvbmZpZ3VyYXRpb24iCisgIGVjaG8gIiAgICAgIGZpbGVzIGZyb20gdGhlIG1haW4gY29uZmlnX3RlbXBsYXRlLnltbCByZXVzYWJsZSBjb25maWd1cmF0aW9uIGZpbGUuIgorICBlY2hvICIgICAgICBVc2UgdGhpcyBmb3IgcGVybWFuZW50IGNoYW5nZXMgaW4gY29uZmlnXzExX2FuZF8xNy55bWwgdGhhdCB3aWxsIGJlIGNvbW1pdHRlZCB0byB0aGUgbWFpbiByZXBvLiIKKyAgZWNobyAiICAgLWYgR2VuZXJhdGUgY29uZmlnLnltbCBmb3IgdGVzdHMgY29tcGF0aWJsZSB3aXRoIHRoZSBDaXJjbGVDSSBmcmVlIHRpZXIgcmVzb3VyY2VzIgorICBlY2hvICIgICAtcCBHZW5lcmF0ZSBjb25maWcueW1sIGZvciB0ZXN0cyBjb21wYXRpYmxlIHdpdGggdGhlIENpcmNsZUNJIHBhaWQgdGllciByZXNvdXJjZXMiCisgIGVjaG8gIiAgIC1lIDxrZXk9dmFsdWU+IEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgY29uZmlnXzExX2FuZF8xNy55bWwsIGUuZy46IgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgRFRFU1RfQlJBTkNIPUNBU1NBTkRSQS04MjcyIgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgRFRFU1RfUkVQTz1odHRwczovL2dpdGh1Yi5jb20vYWRlbGFwZW5hL2Nhc3NhbmRyYS1kdGVzdC5naXQiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9URVNUU19TVE9QX09OX0ZBSUxVUkU9ZmFsc2UiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9VVEVTVFM9b3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5WaWV3VGVzdCN0ZXN0Q291bnRlcnNUYWJsZSIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgIC1lIFJFUEVBVEVEX1VURVNUU19DT1VOVD01MDAiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTD1vcmcuYXBhY2hlLmNhc3NhbmRyYS5mcWx0b29sLkZRTENvbXBhcmVUZXN0IgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQ9NTAwIgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgUkVQRUFURURfVVRFU1RTX0xPTkc9b3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1N0cmVzc1Rlc3QiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9VVEVTVFNfTE9OR19DT1VOVD0xMDAiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTPW9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVzcy5nZW5lcmF0ZS5EaXN0cmlidXRpb25HYXVzc2lhblRlc3QiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UPTUwMCIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgIC1lIFJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM9b3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLnRlc3QuVHJpdmlhbFNpbXVsYXRpb25UZXN0IgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVD01MDAiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9KVk1fRFRFU1RTPW9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3QuUGFnaW5nVGVzdCIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgIC1lIFJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQ9NTAwIgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgUkVQRUFURURfRFRFU1RTPWNkY190ZXN0LnB5IGNxbHNoX3Rlc3RzL3Rlc3RfY3Fsc2gucHk6OlRlc3RDcWxzaFNtb2tlIgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgUkVQRUFURURfRFRFU1RTX0NPVU5UPTUwMCIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgIC1lIFJFUEVBVEVEX0xBUkdFX0RURVNUUz1yZXBsYWNlX2FkZHJlc3NfdGVzdC5weTo6VGVzdFJlcGxhY2VBZGRyZXNzOjp0ZXN0X3JlcGxhY2Vfc3RvcHBlZF9ub2RlIgorICBlY2hvICIgICAgICAgICAgICAgICAgICAgLWUgUkVQRUFURURfTEFSR0VfRFRFU1RTPTEwMCIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgIC1lIFJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVD10ZXN0c29tZSIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgIC1lIFJFUEVBVEVEX0FOVF9URVNUX0NMQVNTPW9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVmlld1Rlc3QiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTPXRlc3RDb21wb3VuZFBhcnRpdGlvbktleSx0ZXN0U3RhdGljVGFibGUiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9BTlRfVEVTVF9WTk9ERVM9ZmFsc2UiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgICAtZSBSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVD01MDAiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgIEZvciB0aGUgY29tcGxldGUgbGlzdCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHBsZWFzZSBjaGVjayB0aGUiCisgIGVjaG8gIiAgICAgICAgICAgICAgICAgIGxpc3Qgb2YgZXhhbXBsZXMgaW4gY29uZmlnX3RlbXBsYXRlXzExX2FuZF8xNy55bWwgYW5kL29yIHRoZSBkb2N1bWVudGF0aW9uLiIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBtdWx0aXBsZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2ltcGx5IGFkZCIKKyAgZWNobyAiICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgLWUgb3B0aW9ucy4gVGhlIGZsYWdzIC1mLy1wIHNob3VsZCBiZSB1c2VkIHdoZW4gdXNpbmcgLWUuIgorICBlY2hvICIgICAtaSBJZ25vcmUgdW5rbm93biBlbnZpcm9ubWVudCB2YXJpYWJsZXMiCit9CisKK2FsbD1mYWxzZQorZnJlZT1mYWxzZQorcGFpZD1mYWxzZQorZW52X3ZhcnM9IiIKK2hhc19lbnZfdmFycz1mYWxzZQorY2hlY2tfZW52X3ZhcnM9dHJ1ZQord2hpbGUgZ2V0b3B0cyAiZTphZnBpIiBvcHQ7IGRvCisgIGNhc2UgJG9wdCBpbgorICAgICAgYSApIGFsbD10cnVlCisgICAgICAgICAgOzsKKyAgICAgIGYgKSBmcmVlPXRydWUKKyAgICAgICAgICA7OworICAgICAgcCApIHBhaWQ9dHJ1ZQorICAgICAgICAgIDs7CisgICAgICBlICkgaWYgKCEgKCRoYXNfZW52X3ZhcnMpKTsgdGhlbgorICAgICAgICAgICAgZW52X3ZhcnM9IiRPUFRBUkciCisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZW52X3ZhcnM9IiRlbnZfdmFyc3wkT1BUQVJHIgorICAgICAgICAgIGZpCisgICAgICAgICAgaGFzX2Vudl92YXJzPXRydWUKKyAgICAgICAgICA7OworICAgICAgaSApIGNoZWNrX2Vudl92YXJzPWZhbHNlCisgICAgICAgICAgOzsKKyAgICAgIFw/KSBkaWUgIkludmFsaWQgb3B0aW9uOiAtJE9QVEFSRyIKKyAgICAgICAgICA7OworICBlc2FjCitkb25lCitzaGlmdCAkKChPUFRJTkQtMSkpCitpZiBbICIkIyIgLW5lIDAgXTsgdGhlbgorICAgIGRpZSAiVW5leHBlY3RlZCBhcmd1bWVudHMiCitmaQorCisjIHZhbGlkYXRlIGVudmlyb25tZW50IHZhcmlhYmxlcworaWYgJGhhc19lbnZfdmFycyAmJiAkY2hlY2tfZW52X3ZhcnM7IHRoZW4KKyAgZm9yIGVudHJ5IGluICQoZWNobyAkZW52X3ZhcnMgfCB0ciAifCIgIlxuIik7IGRvCisgICAga2V5PSQoZWNobyAkZW50cnkgfCB0ciAiPSIgIlxuIiB8IGhlYWQgLW4gMSkKKyAgICBpZiBbICIka2V5IiAhPSAiRFRFU1RfUkVQTyIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJEVEVTVF9CUkFOQ0giIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfVEVTVFNfU1RPUF9PTl9GQUlMVVJFIiBdICYmCisgICAgICAgWyAiJGtleSIgIT0gIlJFUEVBVEVEX1VURVNUUyIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJSRVBFQVRFRF9VVEVTVFNfQ09VTlQiIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfVVRFU1RTX0ZRTFRPT0wiIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfVVRFU1RTX0ZRTFRPT0xfQ09VTlQiIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfVVRFU1RTX0xPTkciIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfVVRFU1RTX0xPTkdfQ09VTlQiIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfVVRFU1RTX1NUUkVTUyIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJSRVBFQVRFRF9VVEVTVFNfU1RSRVNTX0NPVU5UIiBdICYmCisgICAgICAgWyAiJGtleSIgIT0gIlJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFMiIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfU0lNVUxBVE9SX0RURVNUU19DT1VOVCIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJSRVBFQVRFRF9KVk1fRFRFU1RTIiBdICYmCisgICAgICAgWyAiJGtleSIgIT0gIlJFUEVBVEVEX0pWTV9EVEVTVFNfQ09VTlQiIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfRFRFU1RTIiBdICYmCisgICAgICAgWyAiJGtleSIgIT0gIlJFUEVBVEVEX0RURVNUU19DT1VOVCIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJSRVBFQVRFRF9MQVJHRV9EVEVTVFMiIF0gJiYKKyAgICAgICBbICIka2V5IiAhPSAiUkVQRUFURURfTEFSR0VfRFRFU1RTX0NPVU5UIiBdICYmCisgICAgICAgWyAiJGtleSIgIT0gIlJFUEVBVEVEX0FOVF9URVNUX1RBUkdFVCIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJSRVBFQVRFRF9BTlRfVEVTVF9DTEFTUyIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJSRVBFQVRFRF9BTlRfVEVTVF9NRVRIT0RTIiBdICYmCisgICAgICAgWyAiJGtleSIgIT0gIlJFUEVBVEVEX0FOVF9URVNUX1ZOT0RFUyIgXSAmJgorICAgICAgIFsgIiRrZXkiICE9ICJSRVBFQVRFRF9BTlRfVEVTVF9DT1VOVCIgXTsgdGhlbgorICAgICAgZGllICJVbnJlY29nbmlzZWQgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZTogJGtleSIKKyAgICBmaQorICBkb25lCitmaQorCitpZiAkZnJlZTsgdGhlbgorICAoJGFsbCB8fCAkcGFpZCkgJiYgZGllICJDYW5ub3QgdXNlIG9wdGlvbiAtZiB3aXRoIG9wdGlvbnMgLWEgb3IgLXAiCisgIGVjaG8gIkdlbmVyYXRpbmcgbmV3IGNvbmZpZy55bWwgZmlsZSBmb3IgZnJlZSB0aWVyIGZyb20gY29uZmlnX3RlbXBsYXRlXzExX2FuZF8xNy55bWwiCisgIGNpcmNsZWNpIGNvbmZpZyBwcm9jZXNzICRCQVNFRElSL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sID4gJEJBU0VESVIvY29uZmlnXzExX2FuZF8xNy55bWwuRlJFRS50bXAKKyAgY2F0ICRCQVNFRElSL2xpY2Vuc2UueW1sICRCQVNFRElSL2NvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUudG1wID4gJEJBU0VESVIvY29uZmlnLnltbAorICBjcCAkQkFTRURJUi9jb25maWcueW1sICRCQVNFRElSL2NvbmZpZ18xMV9hbmRfMTcueW1sCisgIHJtICRCQVNFRElSL2NvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUudG1wCisKK2VsaWYgJHBhaWQ7IHRoZW4KKyAgKCRhbGwgfHwgJGZyZWUpICYmIGRpZSAiQ2Fubm90IHVzZSBvcHRpb24gLXAgd2l0aCBvcHRpb25zIC1hIG9yIC1mIgorICBlY2hvICJHZW5lcmF0aW5nIG5ldyBjb25maWcueW1sIGZpbGUgZm9yIHBhaWQgdGllciBmcm9tIGNvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sIgorICBwYXRjaCAtbyAkQkFTRURJUi9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbC5QQUlEICRCQVNFRElSL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sICRCQVNFRElSL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sLlBBSUQucGF0Y2gKKyAgY2lyY2xlY2kgY29uZmlnIHByb2Nlc3MgJEJBU0VESVIvY29uZmlnX3RlbXBsYXRlXzExX2FuZF8xNy55bWwuUEFJRCA+ICRCQVNFRElSL2NvbmZpZ18xMV9hbmRfMTcueW1sLlBBSUQudG1wCisgIGNhdCAkQkFTRURJUi9saWNlbnNlLnltbCAkQkFTRURJUi9jb25maWdfMTFfYW5kXzE3LnltbC5QQUlELnRtcCA+ICRCQVNFRElSL2NvbmZpZy55bWwKKyAgY3AgJEJBU0VESVIvY29uZmlnLnltbCAkQkFTRURJUi9jb25maWdfMTFfYW5kXzE3LnltbAorICBybSAkQkFTRURJUi9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbC5QQUlEICRCQVNFRElSL2NvbmZpZ18xMV9hbmRfMTcueW1sLlBBSUQudG1wCisKK2VsaWYgJGFsbDsgdGhlbgorICAoJGZyZWUgfHwgJHBhaWQgfHwgJGhhc19lbnZfdmFycykgJiYgZGllICJDYW5ub3QgdXNlIG9wdGlvbiAtYSB3aXRoIG9wdGlvbnMgLWYsIC1wIG9yIC1lIgorICBlY2hvICJHZW5lcmF0aW5nIG5ldyBkZWZhdWx0IGNvbmZpZ18xMV9hbmRfMTcueW1sIGZpbGUgZm9yIGZyZWUgdGllciBhbmQgRlJFRS9QQUlEIHRlbXBsYXRlcyBmcm9tIGNvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sLiIKKyAgZWNobyAiTWFrZSBzdXJlIHlvdSBjb21taXQgdGhlIG5ld2x5IGdlbmVyYXRlZCBjb25maWdfMTFfYW5kXzE3LnltbCwgY29uZmlnXzExX2FuZF8xNy55bWwuRlJFRSBhbmQgY29uZmlnXzExX2FuZF8xNy55bWwuUEFJRCBmaWxlcyIKKyAgZWNobyAiYWZ0ZXIgcnVubmluZyB0aGlzIGNvbW1hbmQgaWYgeW91IHdhbnQgdGhlbSB0byBwZXJzaXN0LiIKKworICAjIHNldHVwIGNvbmZpZyBmb3IgZnJlZSB0aWVyCisgIGNpcmNsZWNpIGNvbmZpZyBwcm9jZXNzICRCQVNFRElSL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sID4gJEJBU0VESVIvY29uZmlnXzExX2FuZF8xNy55bWwuRlJFRS50bXAKKyAgY2F0ICRCQVNFRElSL2xpY2Vuc2UueW1sICRCQVNFRElSL2NvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUudG1wID4gJEJBU0VESVIvY29uZmlnXzExX2FuZF8xNy55bWwuRlJFRQorICBybSAkQkFTRURJUi9jb25maWdfMTFfYW5kXzE3LnltbC5GUkVFLnRtcAorCisgICMgc2V0dXAgY29uZmlnIGZvciBwYWlkIHRpZXIKKyAgcGF0Y2ggLW8gJEJBU0VESVIvY29uZmlnX3RlbXBsYXRlXzExX2FuZF8xNy55bWwuUEFJRCAkQkFTRURJUi9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbCAkQkFTRURJUi9jb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbC5QQUlELnBhdGNoCisgIGNpcmNsZWNpIGNvbmZpZyBwcm9jZXNzICRCQVNFRElSL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sLlBBSUQgPiAkQkFTRURJUi9jb25maWdfMTFfYW5kXzE3LnltbC5QQUlELnRtcAorICBjYXQgJEJBU0VESVIvbGljZW5zZS55bWwgJEJBU0VESVIvY29uZmlnXzExX2FuZF8xNy55bWwuUEFJRC50bXAgPiAkQkFTRURJUi9jb25maWdfMTFfYW5kXzE3LnltbC5QQUlECisgIHJtICRCQVNFRElSL2NvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sLlBBSUQgJEJBU0VESVIvY29uZmlnXzExX2FuZF8xNy55bWwuUEFJRC50bXAKKworICAjIGNvcHkgZnJlZSB0aWVyIGludG8gY29uZmlnXzExX2FuZF8xNy55bWwgdG8gbWFrZSBzdXJlIHRoaXMgZ2V0cyB1cGRhdGVkCisgIGNwICRCQVNFRElSL2NvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUgJEJBU0VESVIvY29uZmlnXzExX2FuZF8xNy55bWwKKworZWxpZiAoISAoJGhhc19lbnZfdmFycykpOyB0aGVuCisgIHByaW50X2hlbHAKKyAgZXhpdCAwCitmaQorCisjIGFkZCBuZXcgb3IgbW9kaWZpZWQgdGVzdHMgdG8gdGhlIHNldHMgb2YgdGVzdHMgdG8gYmUgcmVwZWF0ZWQKK2lmICghICgkYWxsKSk7IHRoZW4KKyAgYWRkX2RpZmZfdGVzdHMgKCkKKyAgeworICAgIGRpcj0iJHtCQVNFRElSfS8uLi8kezJ9IgorICAgIGRpZmY9JChnaXQgLS1uby1wYWdlciBkaWZmIC0tbmFtZS1vbmx5IC0tZGlmZi1maWx0ZXI9QU1SICR7QkFTRV9CUkFOQ0h9Li4uSEVBRCAke2Rpcn0pCisgICAgdGVzdHM9JCggZWNobyAiJGRpZmYiIFwKKyAgICAgICAgICAgfCBncmVwICJUZXN0XFwuamF2YSIgXAorICAgICAgICAgICB8IHNlZCAtZSAicy9cXC5qYXZhLy8iIFwKKyAgICAgICAgICAgfCBzZWQgLWUgInMsXiR7Mn0sLCIgXAorICAgICAgICAgICB8IHRyICAnLycgJy4nIFwKKyAgICAgICAgICAgfCBncmVwICR7M30gKVwKKyAgICAgICAgICAgfHwgOiAjIGF2b2lkIGV4ZWN1dGlvbiBpbnRlcnJ1cHRpb25zIGR1ZSB0byBncmVwIHJldHVybiBjb2RlcyBhbmQgc2V0IC1lCisgICAgZm9yIHRlc3QgaW4gJHRlc3RzOyBkbworICAgICAgZWNobyAiICAkdGVzdCIKKyAgICAgIGhhc19lbnZfdmFycz10cnVlCisgICAgICBpZiBlY2hvICIkZW52X3ZhcnMiIHwgZ3JlcCAtcSAiJHsxfT0iOyB0aGVuCisgICAgICAgIGVudl92YXJzPSQoZWNobyAiJGVudl92YXJzIiB8IHNlZCAtZSAicy8kezF9PS8kezF9PSR7dGVzdH0sLyIpCisgICAgICBlbGlmIFsgLXogIiRlbnZfdmFycyIgXTsgdGhlbgorICAgICAgICBlbnZfdmFycz0iJHsxfT0ke3Rlc3R9IgorICAgICAgZWxzZQorICAgICAgICBlbnZfdmFycz0iJGVudl92YXJzfCR7MX09JHt0ZXN0fSIKKyAgICAgIGZpCisgICAgZG9uZQorICB9CisKKyAgZWNobworICBlY2hvICJEZXRlY3RpbmcgbmV3IG9yIG1vZGlmaWVkIHRlc3RzIHdpdGggZ2l0IGRpZmYgLS1kaWZmLWZpbHRlcj1BTVIgJHtCQVNFX0JSQU5DSH0uLi5IRUFEOiIKKyAgYWRkX2RpZmZfdGVzdHMgIlJFUEVBVEVEX1VURVNUUyIgInRlc3QvdW5pdC8iICJvcmcuYXBhY2hlLmNhc3NhbmRyYSIKKyAgYWRkX2RpZmZfdGVzdHMgIlJFUEVBVEVEX1VURVNUU19MT05HIiAidGVzdC9sb25nLyIgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhIgorICBhZGRfZGlmZl90ZXN0cyAiUkVQRUFURURfVVRFU1RTX1NUUkVTUyIgInRvb2xzL3N0cmVzcy90ZXN0L3VuaXQvIiAib3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzIgorICBhZGRfZGlmZl90ZXN0cyAiUkVQRUFURURfVVRFU1RTX0ZRTFRPT0wiICJ0b29scy9mcWx0b29sL3Rlc3QvdW5pdC8iICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5mcWx0b29sIgorICBhZGRfZGlmZl90ZXN0cyAiUkVQRUFURURfU0lNVUxBVE9SX0RURVNUUyIgInRlc3Qvc2ltdWxhdG9yL3Rlc3QvIiAib3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLnRlc3QiCisgIGFkZF9kaWZmX3Rlc3RzICJSRVBFQVRFRF9KVk1fRFRFU1RTIiAidGVzdC9kaXN0cmlidXRlZC8iICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0IgorZmkKKworIyByZXBsYWNlIGVudmlyb25tZW50IHZhcmlhYmxlcworaWYgJGhhc19lbnZfdmFyczsgdGhlbgorICBlY2hvCisgIGVjaG8gIlNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzOiIKKyAgSUZTPSc9JworICBlY2hvICIkZW52X3ZhcnMiIHwgdHIgJ3wnICdcbicgfCB3aGlsZSByZWFkIGVudHJ5OyBkbworICAgIHNldCAtLSAkZW50cnkKKyAgICBrZXk9JDEKKyAgICB2YWw9JDIKKyAgICBlY2hvICIgICRrZXk6ICR2YWwiCisgICAgc2VkIC1pLmJhayAic3wtICRrZXk6Lip8LSAka2V5OiAkdmFsfCIgJEJBU0VESVIvY29uZmlnLnltbAorICAgIGNwICRCQVNFRElSL2NvbmZpZy55bWwgJEJBU0VESVIvY29uZmlnXzExX2FuZF8xNy55bWwKKyAgZG9uZQorICB1bnNldCBJRlMKK2ZpCisKKyMgRGVmaW5lIGZ1bmN0aW9uIHRvIHJlbW92ZSB1bm5lZWRlZCBqb2JzLgorIyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIGZpbGUgbmFtZSwgYW5kIHRoZSBzZWNvbmQgYXJndWVtbnQgaXMgdGhlIGpvYiBuYW1lLgorZGVsZXRlX2pvYigpCit7CisgIGRlbGV0ZV95YW1sX2Jsb2NrKCkKKyAgeworICAgIHNlZCAtRWkuYmFrICIvXiAgICAtICR7Mn0vLC9eICAgIFteWzpzcGFjZTpdXSt8XiAgW15bOnNwYWNlOl1dKy97Ly8hZDt9IiAiJDEiCisgICAgc2VkIC1FaS5iYWsgIi9eICAgIC0gJHsyfS9kIiAiJDEiCisgIH0KKyAgZmlsZT0iJEJBU0VESVIvJDEiCisgIGRlbGV0ZV95YW1sX2Jsb2NrICIkZmlsZSIgIiR7Mn0iCisgIGRlbGV0ZV95YW1sX2Jsb2NrICIkZmlsZSIgInN0YXJ0XyR7Mn0iCit9CisKKyMgRGVmaW5lIGZ1bmN0aW9uIHRvIHJlbW92ZSBhbnkgdW5uZWVkZWQgcmVwZWF0ZWQgam9icy4KKyMgVGhlIGZpcnN0IGFuZCBvbmx5IGFyZ3VtZW50IGlzIHRoZSBmaWxlIG5hbWUuCitkZWxldGVfcmVwZWF0ZWRfam9icygpCit7CisgIGlmICghIChlY2hvICIkZW52X3ZhcnMiIHwgZ3JlcCAtcSAiUkVQRUFURURfVVRFU1RTPSIgKSk7IHRoZW4KKyAgICBkZWxldGVfam9iICIkMSIgImoxMV91bml0X3Rlc3RzX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN191bml0X3Rlc3RzX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxMV91dGVzdHNfY2RjX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN191dGVzdHNfY2RjX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxMV91dGVzdHNfY29tcHJlc3Npb25fcmVwZWF0IgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajE3X3V0ZXN0c19jb21wcmVzc2lvbl9yZXBlYXQiCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTFfdXRlc3RzX3RyaWVfcmVwZWF0IgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajE3X3V0ZXN0c190cmllX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxMV91dGVzdHNfc3lzdGVtX2tleXNwYWNlX2RpcmVjdG9yeV9yZXBlYXQiCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTdfdXRlc3RzX3N5c3RlbV9rZXlzcGFjZV9kaXJlY3RvcnlfcmVwZWF0IgorICBmaQorICBpZiAoISAoZWNobyAiJGVudl92YXJzIiB8IGdyZXAgLXEgIlJFUEVBVEVEX1VURVNUU19MT05HPSIpKTsgdGhlbgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajExX3V0ZXN0c19sb25nX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN191dGVzdHNfbG9uZ19yZXBlYXQiCisgIGZpCisgIGlmICghIChlY2hvICIkZW52X3ZhcnMiIHwgZ3JlcCAtcSAiUkVQRUFURURfVVRFU1RTX1NUUkVTUz0iKSk7IHRoZW4KKyAgICBkZWxldGVfam9iICIkMSIgImoxMV91dGVzdHNfc3RyZXNzX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN191dGVzdHNfc3RyZXNzX3JlcGVhdCIKKyAgZmkKKyAgaWYgKCEgKGVjaG8gIiRlbnZfdmFycyIgfCBncmVwIC1xICJSRVBFQVRFRF9VVEVTVFNfRlFMVE9PTD0iKSk7IHRoZW4KKyAgICBkZWxldGVfam9iICIkMSIgImoxMV91dGVzdHNfZnFsdG9vbF9yZXBlYXQiCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTdfdXRlc3RzX2ZxbHRvb2xfcmVwZWF0IgorICBmaQorICBpZiAoISAoZWNobyAiJGVudl92YXJzIiB8IGdyZXAgLXEgIlJFUEVBVEVEX1NJTVVMQVRPUl9EVEVTVFM9IikpOyB0aGVuCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTFfc2ltdWxhdG9yX2R0ZXN0c19yZXBlYXQiCisgIGZpCisgIGlmICghIChlY2hvICIkZW52X3ZhcnMiIHwgZ3JlcCAtcSAiUkVQRUFURURfSlZNX0RURVNUUz0iKSk7IHRoZW4KKyAgICBkZWxldGVfam9iICIkMSIgImoxMV9qdm1fZHRlc3RzX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxMV9qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN19qdm1fZHRlc3RzX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN19qdm1fZHRlc3RzX3Zub2RlX3JlcGVhdCIKKyAgZmkKKyAgaWYgKCEgKGVjaG8gIiRlbnZfdmFycyIgfCBncmVwIC1xICJSRVBFQVRFRF9EVEVTVFM9IikpOyB0aGVuCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTFfZHRlc3RzX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxMV9kdGVzdHNfdm5vZGVfcmVwZWF0IgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajExX2R0ZXN0c19vZmZoZWFwX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN19kdGVzdHNfcmVwZWF0IgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajE3X2R0ZXN0c192bm9kZV9yZXBlYXQiCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTdfZHRlc3RzX29mZmhlYXBfcmVwZWF0IgorICBmaQorICBpZiAoISAoZWNobyAiJGVudl92YXJzIiB8IGdyZXAgLXEgIlJFUEVBVEVEX0xBUkdFX0RURVNUUz0iKSk7IHRoZW4KKyAgICBkZWxldGVfam9iICIkMSIgImoxMV9kdGVzdHNfbGFyZ2VfcmVwZWF0IgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajExX2R0ZXN0c19sYXJnZV92bm9kZV9yZXBlYXQiCisgICAgZGVsZXRlX2pvYiAiJDEiICJqMTdfZHRlc3RzX2xhcmdlX3JlcGVhdCIKKyAgICBkZWxldGVfam9iICIkMSIgImoxN19kdGVzdHNfbGFyZ2Vfdm5vZGVfcmVwZWF0IgorICBmaQorICBpZiAoISAoZWNobyAiJGVudl92YXJzIiB8IGdyZXAgLXEgIlJFUEVBVEVEX0FOVF9URVNUX0NMQVNTPSIpKTsgdGhlbgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajExX3JlcGVhdGVkX2FudF90ZXN0IgorICAgIGRlbGV0ZV9qb2IgIiQxIiAiajE3X3JlcGVhdGVkX2FudF90ZXN0IgorICBmaQorfQorCitkZWxldGVfcmVwZWF0ZWRfam9icyAiY29uZmlnLnltbCIKK2RlbGV0ZV9yZXBlYXRlZF9qb2JzICJjb25maWdfMTFfYW5kXzE3LnltbCIKK2lmICRhbGw7IHRoZW4KKyAgZGVsZXRlX3JlcGVhdGVkX2pvYnMgImNvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUiCisgIGRlbGV0ZV9yZXBlYXRlZF9qb2JzICJjb25maWdfMTFfYW5kXzE3LnltbC5QQUlEIgorZmkKZGlmZiAtLWdpdCBhLy5jaXJjbGVjaS9yZWFkbWUubWQgYi8uY2lyY2xlY2kvcmVhZG1lLm1kCmluZGV4IGQ1Mzg5ZjYuLmNkNmE3MzYgMTAwNjQ0Ci0tLSBhLy5jaXJjbGVjaS9yZWFkbWUubWQKKysrIGIvLmNpcmNsZWNpL3JlYWRtZS5tZApAQCAtMjMsMTIgKzIzLDE4IEBACiBUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBmb3IgQ2lyY2xlQ0kgY29udGlub3VzIGludGVncmF0aW9uIHBsYXRmb3JtLgogVGhlIGZpbGUgYGNvbmZpZy55bWxgIGlzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdGhhdCBpcyByZWFkIGJ5IENpcmNsZUNJLiBUaGlzIGZpbGUgaXMKIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBgZ2VuZXJhdGUuc2hgIHNjcmlwdCBmcm9tIHRoZSBgY29uZmlnX3RlbXBsYXRlLnltbGAgZmlsZS4KK0V4cGVyaW1lbnRhbCBKREsxNyBjb25maWd1cmF0aW9uIGlzIGFkZGVkIGZvciB0ZXN0IHB1cnBvc2VzIHRvIGVuYWJsZSBlYXNpZXIgdGVzdGluZword2hpbGUgd29ya2luZyBvbiBKREsxNyByZWxhdGVkIGlzc3Vlcy4gVGhlIGZpbGUgYGNvbmZpZ18xMV9hbmRfMTcueW1sYCBpcyB0aGUgY29uZmlndXJhdGlvbgorZmlsZSB0aGF0IHdlIGNhbiBjb3B5IG92ZXIgYGNvbmZpZy55bWxgIHRvIHRlc3QgSkRLMTErMTcgd29ya2Zsb3dzLiBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseQorZ2VuZXJhdGVkIGJ5IHRoZSBgZ2VuZXJhdGVfMTFfYW5kXzE3LnNoYCBzY3JpcHQgZnJvbSB0aGUgYGNvbmZpZ190ZW1wbGF0ZV8xMV9hbmRfMTcueW1sYCBmaWxlLgogCiBUaGUgcHJvdmlkZWQgYGNvbmZpZy55bWxgIGZpbGUgdXNlcyBsb3cgcmVzb3VyY2VzIHNvIHVzZXJzIG9mIHRoZSBDaXJjbGVDSSBmcmVlIHRpZXIgY2FuCiB1c2UgaXQuIEFkZGl0aW9uYWxseSwgdGhlcmUgYXJlIHR3byB2ZXJzaW9ucyBvZiB0aGlzIGZpbGUgdXNpbmcgZGlmZmVyZW50IHJlc291cmNlcyBzbwogdXNlcnMgd2hvIGhhdmUgYWNjZXNzIHRvIHByZW1pdW0gQ2lyY2xlQ0kgcmVzb3VyY2VzIGNhbiB1c2UgbGFyZ2VyIGluc3RhbmNlcyBhbmQgbW9yZQogcGFyYWxsZWxpc20uIFRoZXNlIGZpbGVzIGFyZSBgY29uZmlnLnltbC5GUkVFYCBhbmQgYGNvbmZpZy55bWwuUEFJRGAuCiBUaGUgZGVmYXVsdCBgY29uZmlnLnltbGAgZmlsZSBpcyBqdXN0IGEgY29weSBvZiBgY29uZmlnLnltbC5GUkVFYC4KK0ZvciB0aGUgSkRLMTErMTcgd29ya2Zsb3dzIHdlIGhhdmUgZXF1aXZhbGVudCBmaWxlcyAtIGBjb25maWdfMTFfYW5kXzE3LnltbC5GUkVFYCBhbmQgCitgY29uZmlnXzExX2FuZF8xNy55bWwuUEFJRGAuCiAKICMjIFN3aXRjaGluZyB0byBoaWdoZXIgcmVzb3VyY2Ugc2V0dGluZ3MKIFRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGdlbmVyYXRlZCBmaWxlcyBmb3IgZnJlZSBhbmQgcGFpZCByZXNvdXJjZSBzZXR0aW5ncy4KQEAgLTM3LDI5ICs0Myw0MSBAQAogCiBgY3AgLmNpcmNsZWNpL2NvbmZpZy55bWwuUEFJRCAuY2lyY2xlY2kvY29uZmlnLnltbGAKIAorcmVzcGVjdGl2ZWx5IGZvciBKREsxMSsxNzoKKworYGNwIC5jaXJjbGVjaS9jb25maWdfMTFfYW5kXzE3LnltbC5QQUlEIC5jaXJjbGVjaS9jb25maWcueW1sYAorCiBBbmQgZm9yIHVzaW5nIGxvd2VyIHJlc291cmNlcyBjb21hcHRpYmxlIHdpdGggQ2lyY2xlQ0kncyBmcmVlIHRpZXI6CiAKIGBjcCAuY2lyY2xlY2kvY29uZmlnLnltbC5GUkVFIC5jaXJjbGVjaS9jb25maWcueW1sYAogCityZXNwZWN0aXZlbHkgZm9yIEpESzExKzE3OgorCitgY3AgLmNpcmNsZWNpL2NvbmZpZ18xMV9hbmRfMTcueW1sLkZSRUUgLmNpcmNsZWNpL2NvbmZpZy55bWxgCisKIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gcnVuIHRoZSBgZ2VuZXJhdGUuc2hgIHNjcmlwdCB3aXRoIHRoZSBmbGFncyBgLWZgL2AtcGAKIHRvIHJlZ2VuZXJhdGUgdGhlIGBjb25maWcueW1sYCBmaWxlIGZyb20gYGNvbmZpZ190ZW1wbGF0ZS55bWxgIHVzaW5nIGZyZWUgb3IgcGFpZCByZXNvdXJjZXMuCi1UaGlzIHNjcmlwdCB2YWxpZGF0ZXMgYW5kIGFwcGxpZXMgYW55IGNoYW5nZXMgdG8gdGhlIGBjb25maWdfdGVtcGxhdGUueW1sYCBmaWxlLCBhbmQgaXQKLXJlcXVpcmVzIHRoZSBbQ2lyY2xlQ0kgQ0xJXShodHRwczovL2NpcmNsZWNpLmNvbS9kb2NzLzIuMC9sb2NhbC1jbGkvI2luc3RhbGwpIHRvIGJlCi1pbnN0YWxsZWQuCitGb3IgSkRLMTEgYW5kIDE3IHlvdSBjYW4gcnVuIHRoZSBgZ2VuZXJhdGVfMTFfYW5kXzE3LnNoYCBzY3JpcHQgd2l0aCB0aGUgZmxhZ3MKK2AtZmAvYC1wYCB0byByZWdlbmVyYXRlIHRoZSBgY29uZmlnLnltbGAgZmlsZSBmcm9tIGBjb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbGAKK3VzaW5nIGZyZWUgb3IgcGFpZCByZXNvdXJjZXMuIFRoZSB0d28gc2NyaXB0cyB2YWxpZGF0ZSBhbmQgYXBwbHkgYW55IGNoYW5nZXMgdG8gdGhlIAorYGNvbmZpZ190ZW1wbGF0ZS55bWxgYW5kIGBjb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbGAgZmlsZXMsIGFuZCB0aGV5IHJlcXVpcmUgdGhlCitbQ2lyY2xlQ0kgQ0xJXShodHRwczovL2NpcmNsZWNpLmNvbS9kb2NzLzIuMC9sb2NhbC1jbGkvI2luc3RhbGwpIHRvIGJlIGluc3RhbGxlZC4KIAogIyMgU2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMKIEJvdGggYGNvbmZpZ190ZW1wbGF0ZS55bWxgIGFuZCBgY29uZmlnLnltbGAgZmlsZXMgY29udGFpbiBhIHNldCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMKIGRlZmluaW5nIHRoaW5ncyBsaWtlIHdoYXQgZHRlc3QgcmVwbyBhbmQgYnJhbmNoIHRvIHVzZSwgd2hhdCB0ZXN0cyBjb3VsZCBiZSByZXBlYXRlZGx5Ci1ydW4sIGV0Yy4KK3J1biwgZXRjLiBTYW1lIGFwcGxpZXMgZm9yIGBjb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbGAgYW5kIGBjb25maWdfMTFfYW5kXzE3LnltbGAuCiAKIFRoZXNlIGVudmlyb25tZW50IHZhcmlhYmxlcyBjYW4gYmUgZGlyZWN0bHkgZWRpdGVkIGluIHRoZSBgY29uZmlnLnltbGAgZmlsZSwgYWx0aG91Z2ggaWYKIHlvdSBkbyB0aGlzIHlvdSBzaG91bGQgdGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGUgZW50aXJlIHNldCBvZiBlbnYgdmFycyBpcyByZXBlYXRlZCBvbgogZXZlcnkgam9iLgogCi1BIHByb2JhYmx5IGJldHRlciBhcHByb2FjaCBpcyBlZGl0aW5nIHRoZW0gaW4gYGNvbmZpZ190ZW1wbGF0ZS55bWxgIGFuZCB0aGVuIHJlZ2VuZXJhdGUgdGhlCi1gY29uZmlnLnltbGAgZmlsZSB1c2luZyB0aGUgYGdlbmVyYXRlLnNoYCBzY3JpcHQuIFlvdSBjYW4gYWxzbyBkaXJlY3RseSBwYXNzIGVudmlyb25tZW50Ci12YXJpYWJsZSB2YWx1ZXMgdG8gdGhlIGBnZW5lcmF0ZS5zaGAgc2NyaXB0IHdpdGggdGhlIGAtZWAgZmxhZy4gRm9yIGV4YW1wbGUsIHRvIHNldCB0aGUKLWR0ZXN0IHJlcG8gYW5kIGJyYW5jaCB3aXRoIE1JRFJFUyBjb25maWcgeW91IGNhbiBydW46CitBIHByb2JhYmx5IGJldHRlciBhcHByb2FjaCBpcyBlZGl0aW5nIHRoZW0gaW4gYGNvbmZpZ190ZW1wbGF0ZS55bWxgIG9yIHJlc3BlY3RpdmVseSAKK2Bjb25maWdfdGVtcGxhdGVfMTFfYW5kXzE3LnltbGAgYW5kIHRoZW4gcmVnZW5lcmF0ZSB0aGUgYGNvbmZpZy55bWxgIGFuZCBgY29uZmlnXzExX2FuZF8xNy55bWxgCitmaWxlcyB1c2luZyB0aGUgYGdlbmVyYXRlLnNoYCBvciByZXNwZWN0aXZlbHkgdGhlIGBnZW5lcmF0ZV8xMV9hbmRfMTcueW1sYCBzY3JpcHQuIFlvdSBjYW4gYWxzbyAKK2RpcmVjdGx5IHBhc3MgZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWVzIHRvIHRoZSBgZ2VuZXJhdGUuc2hgIGFuZCBgZ2VuZXJhdGVfMTFfYW5kXzE3LnNoYCBzY3JpcHRzCit3aXRoIHRoZSBgLWVgIGZsYWcuIEZvciBleGFtcGxlLCB0byBzZXQgdGhlIGR0ZXN0IHJlcG8gYW5kIGJyYW5jaCB3aXRoIFBBSUQgY29uZmlnIAoreW91IGNhbiBydW46CiAKIGBgYAogZ2VuZXJhdGUuc2ggLXAgXApAQCAtNjksMTAgKzg3LDEwIEBACiBgYGAKIAogIyMgUnVubmluZyB0ZXN0cyBpbiBhIGxvb3AKLVJ1bm5pbmcgdGhlIGBnZW5lcmF0ZS5zaGAgc2NyaXB0IHdpdGggdXNlIGBnaXQgZGlmZmAgdG8gZmluZCB0aGUgbmV3IG9yIG1vZGlmaWVkIHRlc3RzLgotVGhlIHNjcmlwdCB3aWxsIHRoZW4gY3JlYXRlIGpvYnMgdG8gcnVuIGVhY2ggb2YgdGhlc2UgbmV3IG9yIG1vZGlmaWVkIHRlc3RzIGZvciBhIGNlcnRhaW4KLW51bWJlciBvZiB0aW1lcywgdG8gdmVyaWZ5IHRoYXQgdGhleSBhcmUgc3RhYmxlLiBZb3UgY2FuIHVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8KLXNwZWNpZnkgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIG9mIGVhY2ggdHlwZSBvZiB0ZXN0OgorUnVubmluZyB0aGUgYGdlbmVyYXRlLnNoYCBvciBgZ2VuZXJhdGVfMTFfYW5kXzE3LnNoYCBzY3JpcHQgd2lsbCB1c2UgYGdpdCBkaWZmYCB0byBmaW5kIHRoZSAKK25ldyBvciBtb2RpZmllZCB0ZXN0cy4gVGhlIHNjcmlwdHMgd2lsbCB0aGVuIGNyZWF0ZSBqb2JzIHRvIHJ1biBlYWNoIG9mIHRoZXNlIG5ldyBvciBtb2RpZmllZCAKK3Rlc3RzIGZvciBhIGNlcnRhaW4gbnVtYmVyIG9mIHRpbWVzLCB0byB2ZXJpZnkgdGhhdCB0aGV5IGFyZSBzdGFibGUuIFlvdSBjYW4gdXNlIGVudmlyb25tZW50IAordmFyaWFibGVzIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIG9mIGVhY2ggdHlwZSBvZiB0ZXN0OgogYGBgCiBnZW5lcmF0ZS5zaCAtcCBcCiAgIC1lIFJFUEVBVEVEX1VURVNUU19DT1VOVD01MDAgXApAQCAtMTU3LDE2ICsxNzUsMTggQEAKIHJlZ2VuZXJhdGUgdGhlIGBjb25maWcueW1sYCwgYGNvbmZpZy55bWwuRlJFRWAgYW5kIGBjb25maWcueW1sLlBBSURgCiBmaWxlcyBieSBydW5uaW5pbmcgdGhlIGBnZW5lcmF0ZS5zaGAgc2NyaXB0IHdpdGggYC1hYCBmbGFnLiBGb3IgdXNpbmcgdGhpcyBzY3JpcHQgeW91CiBuZWVkIHRvIGluc3RhbGwgdGhlIFtDaXJjbGVDSSBDTEldKGh0dHBzOi8vY2lyY2xlY2kuY29tL2RvY3MvMi4wL2xvY2FsLWNsaS8jaW5zdGFsbCkuCitTYW1lIGFwcGxpZXMgZm9yIHRoZSBlcXVpdmFsZW50IEpESzExKzE3IGNvbmZpZyBmaWxlcyBhbmQgYGdlbmVyYXRlXzExX2FuZF8xNy5zaGAuCiAKIEFzIGZvciB0ZW1wb3JhbCBjaGFuZ2VzIGRvbmUgd2hpbGUgd29ya2luZyBpbiBhIHBhdGNoLCBzdWNoIGFzIHBvaW50aW5nIHRvIHlvdSBkdGVzdCByZXBvIG9yCiBydW5uaW5nIGEgdGVzdCByZXBlYXRlZGx5LCB5b3UgY2FuIGVpdGhlciBkaXJlY3RseSBlZGl0IGBjb25maWcueW1sYCBvciBlZGl0IGBjb25maWdfdGVtcGxhdGUueW1sYAogYW5kIHRoZW4gcmVnZW5lcmF0ZSBgY29uZmlnLnltbGAgd2l0aCB0aGUgYGdlbmVyYXRlLnNoYCBzY3JpcHQgdXNpbmcgYSBgLWZgL2AtcGAgZmxhZy4KLVdoZW4gdGhpcyBmbGFnIGlzIHVzZWQgb25seSB0aGUgYGNvbmZpZy55bWxgIHdpbGwgYmUgZ2VuZXJhdGVkLgorV2hlbiB0aGlzIGZsYWcgaXMgdXNlZCBvbmx5IHRoZSBgY29uZmlnLnltbGAgd2lsbCBiZSBnZW5lcmF0ZWQuIFNhbWUgd29ya2Zsb3cgYXBwbGllcyB0byB0aGUgcmVzcGVjdGl2ZQorSkRLMTErMTcgQ2lyY2xlQ0kgY29uZmlndXJhdGlvbiBmaWxlcy4KIAogUGxlYXNlIG5vdGUgdGhhdCBhbnkgcHJldmlvdXMgc3dhcHBpbmcgb3IgZWRpdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIGZpbGVzIHdpbGwgYmUgb3ZlcnJpZGVuCi1ieSBydW5uaW5nIGBnZW5lcmF0ZS5zaGAgd2l0aCBgLWFgIGFyZ3VtZW50LCByZXR1cm5pbmcgYGNvbmZpZy55bWxgIHRvIHRoZSBkZWZhdWx0IEZSRUUuIFNvIGlmCi15b3UgcHJldmlvdXNseSBzd2FwcGVkIHlvdXIgYGNvbmZpZy55bWxgIHRvIE1JRFJFUyB5b3Ugd291bGQgbmVlZCB0byBlaXRoZXIgc3dhcCBpdAotYWdhaW4gb3IgdXNlIHRoZSBgLWZgL2AtcGAgc2NyaXB0IGZsYWdzLgorYnkgcnVubmluZyBgZ2VuZXJhdGUuc2hgL2BnZW5lcmF0ZV8xMV9hbmRfMTcuc2hgIHdpdGggYC1hYCBhcmd1bWVudCwgcmV0dXJuaW5nIGBjb25maWcueW1sYCAKK3RvIHRoZSBkZWZhdWx0IEZSRUUuIFNvIGlmIHlvdSBwcmV2aW91c2x5IHN3YXBwZWQgeW91ciBgY29uZmlnLnltbGAgdG8gUEFJRCB5b3Ugd291bGQgbmVlZCB0bworZWl0aGVyIHN3YXAgaXQgYWdhaW4gb3IgdXNlIHRoZSBgLWZgL2AtcGAgc2NyaXB0IGZsYWdzLgogCiBSZWFkIGJlbG93IGZvciBkZXRhaWxzIGhvdyB0byBnZW5lcmF0ZSB0aGUgZmlsZXMgbWFudWFsbHkgd2l0aG91dCB0aGUgYGdlbmVyYXRlLnNoYCBzY3JpcHQ6CiAKQEAgLTE4OCwzICsyMDgsNSBAQAogNy4gYWRkIHRoZSBBcGFjaGUgbGljZW5zZSBoZWFkZXIgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgUEFJRCBmaWxlOgogICAgYGNhdCBsaWNlbnNlLnltbCBjb25maWcueW1sLlBBSUQgPiBjb25maWcueW1sLlBBSUQubmV3ICYmIG12IGNvbmZpZy55bWwuUEFJRC5uZXcgY29uZmlnLnltbC5QQUlEYAogOC4gZmluYWxseSwgcmVtZW1iZXIgdG8gdXBkYXRlIHRoZSBjb25maWcueW1sCisKK1RoZSBwcm9jZXNzIGlzIGVxdWl2YWxlbnQgZm9yIGBnZW5lcmF0ZV8xMV9hbmRfMTcuc2hgIGFuZCB0aGUgcmVzcGVjdGl2ZSBKREsxMSsxNyBjb25maWd1cmF0aW9uIGZpbGVzLgpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQgYi8uZ2l0aHViL3B1bGxfcmVxdWVzdF90ZW1wbGF0ZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmNkMjE2Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi9wdWxsX3JlcXVlc3RfdGVtcGxhdGUubWQKQEAgLTAsMCArMSwyNSBAQAorVGhhbmtzIGZvciBzZW5kaW5nIGEgcHVsbCByZXF1ZXN0ISBIZXJlIGFyZSBzb21lIHRpcHMgaWYgeW91J3JlIG5ldyBoZXJlOgorIAorICogRW5zdXJlIHlvdSBoYXZlIGFkZGVkIG9yIHJ1biB0aGUgW2FwcHJvcHJpYXRlIHRlc3RzXShodHRwczovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL18vZGV2ZWxvcG1lbnQvdGVzdGluZy5odG1sKSBmb3IgeW91ciBQUi4KKyAqIEJlIHN1cmUgdG8ga2VlcCB0aGUgUFIgZGVzY3JpcHRpb24gdXBkYXRlZCB0byByZWZsZWN0IGFsbCBjaGFuZ2VzLgorICogV3JpdGUgeW91ciBQUiB0aXRsZSB0byBzdW1tYXJpemUgd2hhdCB0aGlzIFBSIHByb3Bvc2VzLgorICogSWYgcG9zc2libGUsIHByb3ZpZGUgYSBjb25jaXNlIGV4YW1wbGUgdG8gcmVwcm9kdWNlIHRoZSBpc3N1ZSBmb3IgYSBmYXN0ZXIgcmV2aWV3LgorICogUmVhZCBvdXIgW2NvbnRyaWJ1dG9yIGd1aWRlbGluZXNdKGh0dHBzOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvXy9kZXZlbG9wbWVudC9pbmRleC5odG1sKQorICogSWYgeW91J3JlIG1ha2luZyBhIGRvY3VtZW50YXRpb24gY2hhbmdlLCBzZWUgb3VyIFtndWlkZSB0byBkb2N1bWVudGF0aW9uIGNvbnRyaWJ1dGlvbl0oaHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9fL2RldmVsb3BtZW50L2RvY3VtZW50YXRpb24uaHRtbCkKKyAKK0NvbW1pdCBtZXNzYWdlcyBzaG91bGQgZm9sbG93IHRoZSBmb2xsb3dpbmcgZm9ybWF0OgorCitgYGAKKzxPbmUgc2VudGVuY2UgZGVzY3JpcHRpb24sIHVzdWFsbHkgSmlyYSB0aXRsZSBvciBDSEFOR0VTLnR4dCBzdW1tYXJ5PgorCis8T3B0aW9uYWwgbGVuZ3RoaWVyIGRlc2NyaXB0aW9uIChjb250ZXh0IG9uIHBhdGNoKT4KKworcGF0Y2ggYnkgPEF1dGhvcnM+OyByZXZpZXdlZCBieSA8UmV2aWV3ZXJzPiBmb3IgQ0FTU0FORFJBLSMjIyMjCisKK0NvLWF1dGhvcmVkLWJ5OiBOYW1lMSA8ZW1haWwxPgorQ28tYXV0aG9yZWQtYnk6IE5hbWUyIDxlbWFpbDI+CisKK2BgYAorCitUaGUgW0Nhc3NhbmRyYSBKaXJhXShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvcHJvamVjdHMvQ0FTU0FORFJBL2lzc3Vlcy8pCisKZGlmZiAtLWdpdCBhL0NIQU5HRVMudHh0IGIvQ0hBTkdFUy50eHQKaW5kZXggMjQ2YmE1OC4uOTlhNTM0MCAxMDA2NDQKLS0tIGEvQ0hBTkdFUy50eHQKKysrIGIvQ0hBTkdFUy50eHQKQEAgLTEsMTAgKzEsMTU4IEBACi00LjEuMworNS4wCisgKiBQcmludCBoZWFkZXIgYW5kIHN0YXRpc3RpY3MgZm9yIGNhc3NhbmRyYS1zdHJlc3Mgb3V0cHV0IHdpdGggYXJiaXRyYXJ5IGZyZXF1ZW5jeSAoQ0FTU0FORFJBLTEyOTcyKQorICogQ0VQLTI1OiBUcmllLWluZGV4ZWQgU1NUYWJsZSBmb3JtYXQgKENBU1NBTkRSQS0xODM5OCkKKyAqIE1ha2UgY2Fzc2FuZHJhLXN0cmVzcyBhYmxlIHRvIHJlYWQgYWxsIGNyZWRlbnRpYWxzIGZyb20gYSBmaWxlIChDQVNTQU5EUkEtMTg1NDQpCisgKiBBZGQgZ3VhcmRyYWlsIGZvciBwYXJ0aXRpb24gc2l6ZSBhbmQgZGVwcmVjYXRlIGNvbXBhY3Rpb25fbGFyZ2VfcGFydGl0aW9uX3dhcm5pbmdfdGhyZXNob2xkIChDQVNTQU5EUkEtMTg1MDApCisgKiBBZGQgSElTVE9SWSBjb21tYW5kIGZvciBDUUxTSCAoQ0FTU0FORFJBLTE1MDQ2KQorICogRml4IHNzdGFibGUgZm9ybWF0cyBjb25maWd1cmF0aW9uIChDQVNTQU5EUkEtMTg0NDEpCisgKiBBZGQgZ3VhcmRyYWlsIHRvIGJvdW5kIHRpbWVzdGFtcHMgKENBU1NBTkRSQS0xODM1MikKKyAqIEFkZCBrZXlzcGFjZV9uYW1lIGNvbHVtbiB0byBzeXN0ZW1fdmlld3MuY2xpZW50cyAoQ0FTU0FORFJBLTE4NTI1KQorICogTW92ZWQgc3lzdGVtIHByb3BlcnRpZXMgYW5kIGVudnMgdG8gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIGFuZCBDYXNzYW5kcmFSZWxldmFudEVudiByZXNwZWN0aXZlbHkgKENBU1NBTkRSQS0xNzc5NykKKyAqIEFkZCBzc3RhYmxlcGFydGl0aW9ucyBvZmZsaW5lIHRvb2wgdG8gZmluZCBsYXJnZSBwYXJ0aXRpb25zIGluIHNzdGFibGVzIChDQVNTQU5EUkEtODcyMCkKKyAqIFJlcGxhY2UgdXNhZ2VzIG9mIGpzb24tc2ltcGxlIGRlcGVuZGVuY3kgYnkgSmFja3NvbiAoQ0FTU0FORFJBLTE2ODU1KQorICogV2hlbiBkZWNvbW1pc3Npb25pbmcgc2hvdWxkIHNldCBTZXZlcml0eSB0byBsaW1pdCB0cmFmZmljIChDQVNTQU5EUkEtMTg0MzApCisgKiBGb3IgSmF2YTExIGFuZCBKYXZhMTcgcmVtb3ZlIC1YWDotVXNlQmlhc2VkTG9ja2luZyBhcyBpdCBpcyB0aGUgZGVmYXVsdCBhbHJlYWR5IChDQVNTQU5EUkEtMTc4NjkpCisgKiBVcGdyYWRlIGNvbW1vbnMtaW8gdG8gMi4xMS4wIChDQVNTQU5EUkEtMTczNjQpCisgKiBOb2RlIERyYWluaW5nIFNob3VsZCBBYm9ydCBBbGwgQ3VycmVudCBTU1RhYmxlcyBJbXBvcnRzIChDQVNTQU5EUkEtMTgzNzMpCisgKiBVc2Ugc25ha2UgY2FzZSBmb3IgdGhlIG5hbWVzIG9mIENRTCBuYXRpdmUgZnVuY3Rpb25zIChDQVNTQU5EUkEtMTgwMzcpCisgKiBVc2UgamRrLWRlcGVuZGVudCBjaGVja3N0eWxlIHZlcnNpb24gdG8gY2hlY2sgdGhlIHNvdXJjZSBjb2RlIChDQVNTQU5EUkEtMTgyNjIpCisgKiBQcm92aWRlIHN1bW1hcnkgb2YgZmFpbGVkIFNlc3Npb25JbmZvJ3MgaW4gU3RyZWFtUmVzdWx0RnV0dXJlIChDQVNTQU5EUkEtMTcxOTkpCisgKiBDRVAtMjA6IER5bmFtaWMgRGF0YSBNYXNraW5nIChDQVNTQU5EUkEtMTc5NDApCisgKiBBZGQgc3lzdGVtX3ZpZXdzLnNuYXBzaG90cyB2aXJ0dWFsIHRhYmxlIChDQVNTQU5EUkEtMTgxMDIpCisgKiBVcGRhdGUgT3BlbkhGVCBkZXBlbmRlbmNpZXMgKGNocm9uaWNsZS1xdWV1ZSwgY2hyb25pY2xlLWNvcmUsIGNocm9uaWNsZS1ieXRlcywgY2hyb25pY2xlLXdpcmUsIGNocm9uaWNsZS10aHJlYWRzKSAoQ0FTU0FORFJBLTE4MDQ5KQorICogUmVtb3ZlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcCBjb2RlIChDQVNTQU5EUkEtMTgzMjMpCisgKiBSZW1vdmUgZGVwcmVjYXRlZCBDUUwgZnVuY3Rpb25zIGRhdGVPZiBhbmQgdW5peFRpbWVzdGFtcE9mIChDQVNTQU5EUkEtMTgzMjgpCisgKiBSZW1vdmUgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSAoQ0FTU0FORFJBLTE4MDQzKQorICogQWRkIHN5c3RlbV92aWV3cy5tYXhfc3N0YWJsZV9zaXplIGFuZCBzeXN0ZW1fdmlld3MubWF4X3NzdGFibGVfZHVyYXRpb24gdGFibGVzIChDQVNTQU5EUkEtMTgzMzMpCisgKiBFeHRlbmQgaW1wbGljaXQgYWxsb3ctZmlsdGVyaW5nIGZvciB2aXJ0dWFsIHRhYmxlcyB0byBjbHVzdGVyaW5nIGNvbHVtbnMgKENBU1NBTkRSQS0xODMzMSkKKyAqIFVwZ3JhZGUgbWF2ZW4tc2hhZGUtcGx1Z2luIHRvIDMuNC4xIHRvIGZpeCBzaGFkZWQgZHRlc3QgSkFSIGJ1aWxkIChDQVNTQU5EUkEtMTgxMzYpCisgKiBVcGdyYWRlIHRvIE9wY29kZXMuQVNNOSAoQ0FTU0FORFJBLTE3OTcxKQorICogQWRkIE1heFNTVGFibGVTaXplIGFuZCBNYXhTU1RhYmxlRHVyYXRpb24gbWV0cmljcyBhbmQgcHJvcGFnYXRlIHRoZW0gdG9nZXRoZXIgd2l0aCBsb2NhbCByZWFkL3dyaXRlIHJhdGlvIHRvIHRhYmxlc3RhdHMgKENBU1NBTkRSQS0xODI4MykKKyAqIEFkZCBtb3JlIGxvZ2dpbmcgYXJvdW5kIENvbXBhY3Rpb25NYW5hZ2VyIG9wZXJhdGlvbnMgKENBU1NBTkRSQS0xODI2OCkKKyAqIFJlZHVjZSBtZW1vcnkgYWxsb2NhdGlvbnMgb2YgY2FsbHMgdG8gQnl0ZUJ1ZmVyLmR1cGxpY2F0ZSgpIG1hZGUgaW4gb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LkNCVXRpbCN3cml0ZVZhbHVlIChDQVNTQU5EUkEtMTgyMTIpCisgKiBDRVAtMTc6IFNTVGFibGUgQVBJIChDQVNTQU5EUkEtMTcwNTYpCisgKiBHb3NzaXAgc3RhdGVNYXBPcmRlcmluZyBkb2VzIG5vdCBoYXZlIGNvcnJlY3Qgb3JkZXJpbmcgd2hlbiBib3RoIEVuZHBvaW50U3RhdGUgYXJlIGluIHRoZSBib290c3RyYXBwaW5nIHNldCAoQ0FTU0FORFJBLTE4MjkyKQorICogU25hcHNob3Qgb25seSBzc3RhYmxlcyBjb250YWluaW5nIG1pc21hdGNoaW5nIHJhbmdlcyBvbiBwcmV2aWV3IHJlcGFpciBtaXNtYXRjaCAoQ0FTU0FORFJBLTE3NTYxKQorICogTW9yZSBhY2N1cmF0ZSBza2lwcGluZyBvZiBzc3RhYmxlcyBpbiByZWFkIHBhdGggKENBU1NBTkRSQS0xODEzNCkKKyAqIFByZXBhcmUgZm9yIEpESzE3IGV4cGVyaW1lbnRhbCBzdXBwb3J0IChDQVNTQU5EUkEtMTgxNzksIENBU1NBTkRSQS0xODI1OCkKKyAqIFJlbW92ZSBTY3JpcHRlZCBVREZzIGludGVybmFsczsgaG9va3MgdG8gYmUgYWRkZWQgbGF0ZXIgaW4gQ0FTU0FORFJBLTE3MjgxIChDQVNTQU5EUkEtMTgyNTIpCisgKiBVcGRhdGUgSk5BIHRvIDUuMTMuMCAoQ0FTU0FORFJBLTE4MDUwKQorICogTWFrZSB2aXJ0dWFsIHRhYmxlcyBkZWNpZGUgaWYgdGhleSBpbXBsaWNpdGx5IGVuYWJsZSBBTExPVyBGSUxURVJJTkcgKENBU1NBTkRSQS0xODIzOCkKKyAqIEFkZCByb3csIHRvbWJzdG9uZSwgYW5kIHNzdGFibGUgY291bnQgdG8gbm9kZXRvb2wgcHJvZmlsZWxvYWQgKENBU1NBTkRSQS0xODAyMikKKyAqIENvb3JkaW5hdG9yIGxldmVsIG1ldHJpY3MgZm9yIHJlYWQgcmVzcG9uc2UgYW5kIG11dGF0aW9uIHJvdyBhbmQgY29sdW1uIGNvdW50cyAoQ0FTU0FORFJBLTE4MTU1KQorICogQWRkIENRTCBmdW5jdGlvbnMgZm9yIGR5bmFtaWMgZGF0YSBtYXNraW5nIChDQVNTQU5EUkEtMTc5NDEpCisgKiBQcmludCBmcmllbmRseSBlcnJvciB3aGVuIG5vZGV0b29sIGF0dGVtcHRzIHRvIGNvbm5lY3QgdG8gdW5pbml0aWFsaXplZCBzZXJ2ZXIgKENBU1NBTkRSQS0xMTUzNykKKyAqIFVzZSBHMUdDIGJ5IGRlZmF1bHQsIGFuZCB1cGRhdGUgZGVmYXVsdCBHMUdDIHNldHRpbmdzIChDQVNTQU5EUkEtMTgwMjcpCisgKiBTaW1wbGVTZWVkUHJvdmlkZXIgY2FuIHJlc29sdmUgbXVsdGlwbGUgSVAgYWRkcmVzc2VzIHBlciBETlMgcmVjb3JkIChDQVNTQU5EUkEtMTQzNjEpCisgKiBSZW1vdmUgbW9ja2luZyBpbiBJbnRlcm5hbE5vZGVQcm9iZSBzcHlpbmcgb24gU3RvcmFnZVNlcnZpY2VNQmVhbiAoQ0FTU0FORFJBLTE4MTUyKQorICogQWRkIGNvbXBhY3Rpb25fcHJvcGVydGllcyBjb2x1bW4gdG8gc3lzdGVtLmNvbXBhY3Rpb25faGlzdG9yeSB0YWJsZSBhbmQgbm9kZXRvb2wgY29tcGFjdGlvbmhpc3RvcnkgY29tbWFuZCAoQ0FTU0FORFJBLTE4MDYxKQorICogUmVtb3ZlIFByb3RvY29sVmVyc2lvbiBlbnRpcmVseSBmcm9tIHRoZSBDb2xsZWN0aW9uU2VyaWFsaXplciBlY29zeXN0ZW0gKENBU1NBTkRSQS0xODExNCkKKyAqIEZpeCBzZXJpYWxpemF0aW9uIGVycm9yIGluIG5ldyBnZXRzc3RhYmxlcyAtLXNob3ctbGV2ZWxzIG9wdGlvbiAoQ0FTU0FORFJBLTE4MTQwKQorICogVXNlIGNoZWNrZWQgY2FzdHMgd2hlbiByZWFkaW5nIHZpbnRzIGFzIGludHMgKENBU1NBTkRSQS0xODA5OSkKKyAqIEFkZCBNdXRhdGlvbiBTZXJpYWxpemF0aW9uIENhY2hpbmcgKENBU1NBTkRSQS0xNzk5OCkKKyAqIE9ubHkgcmVsb2FkIGNvbXBhY3Rpb24gc3RyYXRlZ2llcyBpZiBkaXNrIGJvdW5kYXJpZXMgY2hhbmdlIChDQVNTQU5EUkEtMTc4NzQpCisgKiBDRVAtMTA6IFNpbXVsYXRvciBKYXZhMTEgU3VwcG9ydCAoQ0FTU0FORFJBLTE3MTc4KQorICogU2V0IHRoZSBtYWpvciBjb21wYWN0aW9uIHR5cGUgY29ycmVjdGx5IGZvciBjb21wYWN0aW9uc3RhdHMgKENBU1NBTkRSQS0xODA1NSkKKyAqIFByaW50IGV4Y2VwdGlvbiBtZXNzYWdlIHdpdGhvdXQgc3RhY2t0cmFjZSB3aGVuIG5vZGV0b29sIGNvbW1hbmRzIGZhaWwgb24gcHJvYmUuZ2V0T3duZXJzaGlwV2l0aFBvcnQoKSAoQ0FTU0FORFJBLTE4MDc5KQorICogQWRkIG9wdGlvbiB0byBwcmludCBsZXZlbCBpbiBub2RldG9vbCBnZXRzc3RhYmxlcyBvdXRwdXQgKENBU1NBTkRSQS0xODAyMykKKyAqIEltcGxlbWVudCBhIGd1YXJkcmFpbCBmb3Igbm90IGhhdmluZyB6ZXJvIGRlZmF1bHRfdGltZV90b19saXZlIG9uIHRhYmxlcyB3aXRoIFRXQ1MgKENBU1NBTkRSQS0xODA0MikKKyAqIEFkZCBDUUwgc2NhbGFyIGZ1bmN0aW9ucyBmb3IgY29sbGVjdGlvbiBhZ2dyZWdhdGlvbiAoQ0FTU0FORFJBLTE4MDYwKQorICogTWFrZSBjYXNzYW5kcmEucmVwbGF5TGlzdCBwcm9wZXJ0eSBmb3IgQ29tbWl0TG9nUmVwbGF5ZXIgcG9zc2libGUgdG8gcmVhY3Qgb24ga2V5c3BhY2VzIG9ubHkgKENBU1NBTkRSQS0xODA0NCkKKyAqIEFkZCBNYXRoZW1hdGljYWwgZnVuY3Rpb25zIChDQVNTQU5EUkEtMTcyMjEpCisgKiBNYWtlIGluY3JlbWVudGFsIGJhY2t1cCBjb25maWd1cmFibGUgcGVyIHRhYmxlIChDQVNTQU5EUkEtMTU0MDIpCisgKiBDaGFuZ2Ugc2hlYmFuZ3Mgb2YgUHl0aG9uIHNjcmlwdHMgdG8gcmVzb2x2ZSBQeXRob24gMyBmcm9tIGVudiBjb21tYW5kIChDQVNTQU5EUkEtMTc4MzIpCisgKiBBZGQgcmVhc29ucyB0byBndWFyZHJhaWwgbWVzc2FnZXMgYW5kIGNvbnNpZGVyIGd1YXJkcmFpbHMgaW4gdGhlIGVycm9yIG1lc3NhZ2UgZm9yIG5lZWRlZCBBTExPVyBGSUxURVJJTkcgKENBU1NBTkRSQS0xNzk2NykKKyAqIEFkZCBzdXBwb3J0IGZvciBDUUwgZnVuY3Rpb25zIG9uIGNvbGxlY3Rpb25zLCB0dXBsZXMgYW5kIFVEVHMgKENBU1NBTkRSQS0xNzgxMSkKKyAqIEFkZCBmbGFnIHRvIGV4Y2x1ZGUgbm9kZXMgZnJvbSBsb2NhbCBEQyB3aGVuIHJ1bm5pbmcgbm9kZXRvb2wgcmVidWlsZCAoQ0FTU0FORFJBLTE3ODcwKQorICogQWRkaW5nIGVuZHBvaW50IHZlcmlmaWNhdGlvbiBvcHRpb24gdG8gY2xpZW50X2VuY3J5cHRpb25fb3B0aW9ucyAoQ0FTU0FORFJBLTE4MDM0KQorICogUmVwbGFjZSAnd2N3aWR0aC5weScgd2l0aCBweXBpIG1vZHVsZSAoQ0FTU0FORFJBLTE3Mjg3KQorICogQWRkIG5vZGV0b29sIGZvcmNlY29tcGFjdCB0byByZW1vdmUgdG9tYnN0b25lZCBvciB0dGwnZCBkYXRhIGlnbm9yaW5nIEdDIGdyYWNlIGZvciBnaXZlbiB0YWJsZSBhbmQgcGFydGl0aW9uIGtleXMgKENBU1NBTkRSQS0xNzcxMSkKKyAqIE9mZmVyIElGIChOT1QpIEVYSVNUUyBpbiBjcWxzaCBjb21wbGV0aW9uIGZvciBDUkVBVEUgVFlQRSwgRFJPUCBUWVBFLCBDUkVBVEUgUk9MRSBhbmQgRFJPUCBST0xFIChDQVNTQU5EUkEtMTY2NDApCisgKiBOb2RldG9vbCBib290c3RyYXAgcmVzdW1lIHdpbGwgbm93IHJldHVybiBhbiBlcnJvciBpZiB0aGUgb3BlcmF0aW9uIGZhaWxzIChDQVNTQU5EUkEtMTY0OTEpCisgKiBEaXNhYmxlIHJlc3VtYWJsZSBib290c3RyYXAgYnkgZGVmYXVsdCAoQ0FTU0FORFJBLTE3Njc5KQorICogSW5jbHVkZSBHaXQgU0hBIGluIC0tdmVyYm9zZSBmbGFnIGZvciBub2RldG9vbCB2ZXJzaW9uIChDQVNTQU5EUkEtMTc3NTMpCisgKiBVcGRhdGUgQnl0ZW1hbiB0byA0LjAuMjAgYW5kIEphY29jbyB0byAwLjguOCAoQ0FTU0FORFJBLTE2NDEzKQorICogQWRkIG1lbXRhYmxlIG9wdGlvbiBhbW9uZyBwb3NzaWJsZSB0YWIgY29tcGxldGlvbnMgZm9yIGEgdGFibGUgKENBU1NBTkRSQS0xNzk4MikKKyAqIEFkZHMgYSB0cmllLWJhc2VkIG1lbXRhYmxlIGltcGxlbWVudGF0aW9uIChDQVNTQU5EUkEtMTcyNDApCisgKiBGdXJ0aGVyIGltcHJvdmVzIHByZWNpc2lvbiBvZiBtZW10YWJsZSBoZWFwIHRyYWNraW5nIChDQVNTQU5EUkEtMTcyNDApCisgKiBGaXggZm9ybWF0dGluZyBvZiBtZXRyaWNzIGRvY3VtZW50YXRpb24gKENBU1NBTkRSQS0xNzk2MSkKKyAqIEtlZXAgc3N0YWJsZSBsZXZlbCB3aGVuIHN0cmVhbWluZyBmb3IgZGVjb21taXNzaW9uIGFuZCBtb3ZlIChDQVNTQU5EUkEtMTc5NjkpCisgKiBBZGQgVW5hdmFpbGFibGVzIG1ldHJpYyBmb3IgQ0FTV3JpdGUgaW4gdGhlIGRvY3MgKENBU1NBTkRSQS0xNjM1NykKKyAqIE1ha2UgQ2Fzc2FuZHJhIGxvZ3MgYWJsZSB0byBiZSB2aWV3ZWQgaW4gdGhlIHZpcnR1YWwgdGFibGUgc3lzdGVtX3ZpZXdzLnN5c3RlbV9sb2dzIChDQVNTQU5EUkEtMTc5NDYpCisgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gR29zc2lwZXIjb3JkZXIgZHVlIHRvIGNvbmN1cnJlbnQgbXV0YXRpb25zIHRvIGVsZW1lbnRzIGJlaW5nIGFwcGxpZWQgKENBU1NBTkRSQS0xNzkwOCkKKyAqIEluY2x1ZGUgZXN0aW1hdGVkIGFjdGl2ZSBjb21wYWN0aW9uIHJlbWFpbmluZyB3cml0ZSBzaXplIHdoZW4gc3RhcnRpbmcgYSBuZXcgY29tcGFjdGlvbiAoQ0FTU0FORFJBLTE3OTMxKQorICogTWl4ZWQgbW9kZSBzdXBwb3J0IGZvciBpbnRlcm5vZGUgYXV0aGVudGljYXRpb24gZHVyaW5nIFRMUyB1cGdyYWRlcyAoQ0FTU0FORFJBLTE3OTIzKQorICogUmV2ZXJ0IE1vY2tpdG8gZG93bmdyYWRlIGZyb20gQ0FTU0FORFJBLTE3NzUwIChDQVNTQU5EUkEtMTc0OTYpCisgKiBBZGQgLS1vbGRlci10aGFuIGFuZCAtLW9sZGVyLXRoYW4tdGltZXN0YW1wIG9wdGlvbnMgZm9yIG5vZGV0b29sIGNsZWFyc25hcHNob3RzIChDQVNTQU5EUkEtMTY4NjApCisgKiBGaXggIm9wZW4gUlQgYm91bmQgYXMgaXRzIGxhc3QgaXRlbSIgZXhjZXB0aW9uIChDQVNTQU5EUkEtMTc4MTApCisgKiBGaXggbGVhayBvZiBub24tc3RhbmRhcmQgSmF2YSB0eXBlcyBpbiBKTVggTUJlYW5zIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPVN0b3JhZ2VTZXJ2aWNlYAorICAgYW5kIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPVJlcGFpclNlcnZpY2VgIGFzIGNsaWVudHMgdXNpbmcgSk1YIGNhbm5vdCBoYW5kbGUgdGhlbS4gTW9yZSBkZXRhaWxzIGluIE5FV1MudHh0IChDQVNTQU5EUkEtMTc2NjgpCisgKiBEZXByZWNhdGUgVGhyb3dhYmxlcy5wcm9wYWdhdGUgdXNhZ2UgKENBU1NBTkRSQS0xNDIxOCkKKyAqIEFsbG93IGRpc2FibGluZyBob3RuZXNzIHBlcnNpc3RlbmNlIGZvciBoaWdoIHNzdGFibGUgY291bnRzIChDQVNTQU5EUkEtMTc4NjgpCisgKiBQcmV2ZW50IE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gY2hhbmdpbmcgbmV2ZXJQdXJnZVRvbWJzdG9uZXMgZnJvbSB0cnVlIHRvIGZhbHNlIChDQVNTQU5EUkEtMTc4OTcpCisgKiBBZGQgbWV0cmljcyBhcm91bmQgc3RvcmFnZSB1c2FnZSBhbmQgY29tcHJlc3Npb24gKENBU1NBTkRSQS0xNzg5OCkKKyAqIFJlbW92ZSB1c2FnZSBvZiBkZXByZWNhdGVkIGphdmF4IGNlcnRpZmljYXRlIGNsYXNzZXMgKENBU1NBTkRSQS0xNzg2NykKKyAqIE1ha2Ugc3VyZSBwcmV2aWV3IHJlcGFpcnMgZG9uJ3Qgb3B0aW1pc2Ugc3RyZWFtcyB1bmxlc3MgY29uZmlndXJlZCB0byAoQ0FTU0FORFJBLTE3ODY1KQorICogT3B0aW9uYWxseSBhdm9pZCBoaW50IHRyYW5zZmVyIGR1cmluZyBkZWNvbW1pc3Npb24gKENBU1NBTkRSQS0xNzgwOCkKKyAqIE1ha2UgZGlzYWJsaW5nIGF1dG8gc25hcHNob3Qgb24gc2VsZWN0ZWQgdGFibGVzIHBvc3NpYmxlIChDQVNTQU5EUkEtMTAzODMpCisgKiBJbnRyb2R1Y2UgY29tcGFjdGlvbiBwcmlvcml0aWVzIHRvIHByZXZlbnQgdXBncmFkZSBjb21wYWN0aW9uIGluYWJpbGl0eSB0byBmaW5pc2ggKENBU1NBTkRSQS0xNzg1MSkKKyAqIFByZXZlbnQgYSB1c2VyIGZyb20gbWFudWFsbHkgcmVtb3ZpbmcgZXBoZW1lcmFsIHNuYXBzaG90cyAoQ0FTU0FORFJBLTE3NzU3KQorICogUmVtb3ZlIGRlcGVuZGVuY3kgb24gTWF2ZW4gQW50IFRhc2tzIChDQVNTQU5EUkEtMTc3NTApCisgKiBVcGRhdGUgQVNNKDkuMSB0byA5LjMpLCBNb2NraXRvKDEuMTAuMTAgdG8gMS4xMi4xMykgYW5kIEJ5dGVCdWRkeSgzLjIuNCB0byA0LjcuMCkgKENBU1NBTkRSQS0xNzgzNSkKKyAqIEFkZCB0aGUgYWJpbGl0eSBmb3Igb3BlcmF0b3JzIHRvIGxvb3NlbiB0aGUgZGVmaW5pdGlvbiBvZiAiZW1wdHkiIGZvciBlZGdlIGNhc2VzIChDQVNTQU5EUkEtMTc4NDIpCisgKiBGaXggcG90ZW50aWFsIG91dCBvZiByYW5nZSBleGNlcHRpb24gb24gY29sdW1uIGluZGV4IGRvd25zYW1wbGluZyAoQ0FTU0FORFJBLTE3ODM5KQorICogSW50cm9kdWNlIHRhcmdldCBkaXJlY3RvcnkgdG8gdnRhYmxlIG91dHB1dCBmb3Igc3N0YWJsZV90YXNrcyBhbmQgZm9yIGNvbXBhY3Rpb25zdGF0cyAoQ0FTU0FORFJBLTEzMDEwKQorICogUmVhZC9Xcml0ZS9UcnVuY2F0ZSB0aHJvdyBSZXF1ZXN0RmFpbHVyZSBpbiBhIHJhY2UgY29uZGl0aW9uIHdpdGggY2FsbGJhY2sgdGltZW91dHMsIHNob3VsZCByZXR1cm4gVGltZW91dCBpbnN0ZWFkIChDQVNTQU5EUkEtMTc4MjgpCisgKiBBZGQgYWJpbGl0eSB0byBsb2cgbG9hZCBwcm9maWxlcyBhdCBmaXhlZCBpbnRlcnZhbHMgKENBU1NBTkRSQS0xNzgyMSkKKyAqIFByb3RlY3QgYWdhaW5zdCBHb3NzaXAgYmFja2luZyB1cCBkdWUgdG8gYSBxdWFyYW50aW5lZCBlbmRwb2ludCB3aXRob3V0IHZlcnNpb24gaW5mb3JtYXRpb24gKENBU1NBTkRSQS0xNzgzMCkKKyAqIE5QRSBpbiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkF0dHJpYnV0ZXMuZ2V0VGltZVRvTGl2ZSAoQ0FTU0FORFJBLTE3ODIyKQorICogQWRkIGd1YXJkcmFpbCBmb3IgY29sdW1uIHNpemUgKENBU1NBTkRSQS0xNzE1MSkKKyAqIFdoZW4gZG9pbmcgYSBob3N0IHJlcGxhY2VtZW50LCB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIG5vZGUgaXMgYSBsaXZlIG5vZGUgYmVmb3JlIGZhaWxpbmcgd2l0aCAiQ2Fubm90IHJlcGxhY2UgYSBsaXZlIG5vZGUuLi4iIChDQVNTQU5EUkEtMTc4MDUpCisgKiBBZGQgc3VwcG9ydCB0byBnZW5lcmF0ZSBhIE9uZS1TaG90IGhlYXAgZHVtcCBvbiB1bmhhbmRsZWQgZXhjZXB0aW9ucyAoQ0FTU0FORFJBLTE3Nzk1KQorICogUmF0ZS1saW1pdCBuZXcgY2xpZW50IGNvbm5lY3Rpb24gYXV0aCBzZXR1cCB0byBhdm9pZCBvdmVyd2hlbG1pbmcgYmNyeXB0IChDQVNTQU5EUkEtMTc4MTIpCisgKiBEYXRhT3V0cHV0QnVmZmVyI3NjcmF0Y2hCdWZmZXIgY2FuIHVzZSBvZmYtaGVhcCBvciBvbi1oZWFwIG1lbW9yeSBhcyBhIG1lYW5zIHRvIGNvbnRyb2wgbWVtb3J5IGFsbG9jYXRpb25zIChDQVNTQU5EUkEtMTY0NzEpCisgKiBBZGQgYWJpbGl0eSB0byByZWFkIHRoZSBUVExzIGFuZCB3cml0ZSB0aW1lcyBvZiB0aGUgZWxlbWVudHMgb2YgYSBjb2xsZWN0aW9uIGFuZC9vciBVRFQgKENBU1NBTkRSQS04ODc3KQorICogUmVtb3ZlZCBQeXRob24gPCAyLjcgc3VwcG9ydCBmcm9tIGZvcm1hdHRpbmcucHkgKENBU1NBTkRSQS0xNzY5NCkKKyAqIENsZWFudXAgcHlsaW50IGlzc3VlcyB3aXRoIHB5bGV4b3Ryb24ucHkgKENBU1NBTkRSQS0xNzc3OSkKKyAqIE5QRSBidWcgaW4gc3RyZWFtaW5nIGNoZWNraW5nIGlmIFNTVGFibGUgaXMgYmVpbmcgcmVwYWlyZWQgKENBU1NBTkRSQS0xNzgwMSkKKyAqIFVzZXJzIG9mIE5hdGl2ZUxpYnJhcnkgc2hvdWxkIGhhbmRsZSBsYWNrIG9mIEpOQSBhcHByb3ByaWF0ZWx5IHdoZW4gcnVubmluZyBpbiBjbGllbnQgbW9kZSAoQ0FTU0FORFJBLTE3Nzk0KQorICogV2FybiBvbiB1bmtub3duIGRpcmVjdG9yaWVzIGZvdW5kIGluIHN5c3RlbSBrZXlzcGFjZSBkaXJlY3RvcnkgcmF0aGVyIHRoYW4ga2lsbCBub2RlIGR1cmluZyBzdGFydHVwIGNoZWNrcyAoQ0FTU0FORFJBLTE3Nzc3KQorICogTG9nIGR1cGxpY2F0ZSByb3dzIHNoYXJpbmcgYSBwYXJ0aXRpb24ga2V5IGZvdW5kIGluIHZlcmlmeSBhbmQgc2NydWIgKENBU1NBTkRSQS0xNzc4OSkKKyAqIEFkZCBzZXBhcmF0ZSB0aHJlYWQgcG9vbCBmb3IgU2Vjb25kYXJ5IEluZGV4IGJ1aWxkaW5nIHNvIGl0IGRvZXNuJ3QgYmxvY2sgY29tcGFjdGlvbnMgKENBU1NBTkRSQS0xNzc4MSkKKyAqIEFkZGVkIEpNWCBjYWxsIHRvIGdldFNTVGFibGVDb3VudFBlclRXQ1NCdWNrZXQgZm9yIFRXQ1MgKENBU1NBTkRSQS0xNzc3NCkKKyAqIFdoZW4gZG9pbmcgYSBob3N0IHJlcGxhY2VtZW50LCAtRGNhc3NhbmRyYS5icm9hZGNhc3RfaW50ZXJ2YWxfbXMgaXMgdXNlZCB0byBrbm93IHdoZW4gdG8gY2hlY2sgdGhlIHJpbmcgYnV0IGNoZWNrcyB0aGF0IHRoZSByaW5nIHdhc24ndCBjaGFuZ2VkIGluIC1EY2Fzc2FuZHJhLnJpbmdfZGVsYXlfbXMsIGNoYW5nZXMgdG8gcmluZyBkZWxheSBzaG91bGQgbm90IGRlcGVuZCBvbiB3aGVuIHdlIHB1Ymxpc2ggbG9hZCBzdGF0cyAoQ0FTU0FORFJBLTE3Nzc2KQorICogV2hlbiBib290c3RyYXAgZmFpbHMsIENhc3NhbmRyYVJvbGVNYW5hZ2VyIG1heSBhdHRlbXB0IHRvIGRvIHJlYWQgcXVlcmllcyB0aGF0IGZhaWwgd2l0aCAiQ2Fubm90IHJlYWQgZnJvbSBhIGJvb3RzdHJhcHBpbmcgbm9kZSIsIGFuZCBpbmNyZW1lbnRzIHVuYXZhaWxhYmxlcyBjb3VudGVycyAoQ0FTU0FORFJBLTE3NzU0KQorICogQWRkIGd1YXJkcmFpbCB0byBkaXNhbGxvdyBEUk9QIEtFWVNQQUNFIGNvbW1hbmRzIChDQVNTQU5EUkEtMTc3NjcpCisgKiBSZW1vdmUgZXBoZW1lcmFsIHNuYXBzaG90IG1hcmtlciBmaWxlIGFuZCBpbnRyb2R1Y2UgYSBmbGFnIHRvIFNuYXBzaG90TWFuaWZlc3QgKENBU1NBTkRSQS0xNjkxMSkKKyAqIEFkZCBhIHZpcnR1YWwgdGFibGUgdGhhdCBleHBvc2VzIGN1cnJlbnRseSBydW5uaW5nIHF1ZXJpZXMgKENBU1NBTkRSQS0xNTI0MSkKKyAqIEFsbG93IHNzdGFibGVsb2FkZXIgdG8gc3BlY2lmeSB0YWJsZSB3aXRob3V0IHJlbHlpbmcgb24gcGF0aCAoQ0FTU0FORFJBLTE2NTg0KQorICogRml4IFRlc3RHb3NzaXBpbmdQcm9wZXJ0eUZpbGVTbml0Y2gudGVzdF9wcmVmZXJfbG9jYWxfcmVjb25uZWN0X29uX2xpc3Rlbl9hZGRyZXNzIChDQVNTQU5EUkEtMTc3MDApCisgKiBBZGQgQnl0ZUNvbXBhcmFibGUgQVBJIChDQVNTQU5EUkEtNjkzNikKKyAqIEFkZCBndWFyZHJhaWwgZm9yIG1heGltdW0gcmVwbGljYXRpb24gZmFjdG9yIChDQVNTQU5EUkEtMTc1MDApCisgKiBJbmNyZW1lbnQgQ1FMU0ggdG8gdmVyc2lvbiA2LjIuMCBmb3IgcmVsZWFzZSA0LjIgKENBU1NBTkRSQS0xNzY0NikKKyAqIEFkZGluZyBzdXBwb3J0IHRvIHBlcmZvcm0gY2VydGlmaWNhdGUgYmFzZWQgaW50ZXJub2RlIGF1dGhlbnRpY2F0aW9uIChDQVNTQU5EUkEtMTc2NjEpCisgKiBPcHRpb24gdG8gZGlzYWJsZSBDREMgd3JpdGVzIG9mIHJlcGFpcmVkIGRhdGEgKENBU1NBTkRSQS0xNzY2NikKKyAqIFdoZW4gYSBub2RlIGlzIGJvb3RzdHJhcHBpbmcgaXQgZ2V0cyB0aGUgd2hvbGUgZ29zc2lwIHN0YXRlIGJ1dCBhcHBsaWVzIGluIHJhbmRvbSBvcmRlciBjYXVzaW5nIHNvbWUgY2FzZXMgd2hlcmUgU3RvcmFnZVNlcnZpY2Ugd2lsbCBmYWlsIGNhdXNpbmcgYW4gaW5zdGFuY2UgdG8gbm90IHNob3cgdXAgaW4gVG9rZW5NZXRhZGF0YSAoQ0FTU0FORFJBLTE3Njc2KQorICogQWRkIENRTFNIIGNvbW1hbmQgU0hPVyBSRVBMSUNBUyAoQ0FTU0FORFJBLTE3NTc3KQorICogQWRkIGd1YXJkcmFpbCB0byBhbGxvdyBkaXNhYmxpbmcgb2YgU2ltcGxlU3RyYXRlZ3kgKENBU1NBTkRSQS0xNzY0NykKKyAqIENoYW5nZSBkZWZhdWx0IGRpcmVjdG9yeSBwZXJtaXNzaW9uIHRvIDc1MCBpbiBwYWNrYWdpbmcgKENBU1NBTkRSQS0xNzQ3MCkKKyAqIEFkZGluZyBzdXBwb3J0IGZvciBUTFMgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGZvciBpbnRlcm5vZGUgY29tbXVuaWNhdGlvbiAoQ0FTU0FORFJBLTE3NTEzKQorICogQWRkIG5ldyBDUUwgZnVuY3Rpb24gbWF4V3JpdGV0aW1lIChDQVNTQU5EUkEtMTc0MjUpCisgKiBBZGQgZ3VhcmRyYWlsIGZvciBBTFRFUiBUQUJMRSBBREQgLyBEUk9QIC8gUkVNT1ZFIGNvbHVtbiBvcGVyYXRpb25zIChDQVNTQU5EUkEtMTc0OTUpCisgKiBSZW5hbWUgRGlzYWJsZUZsYWcgY2xhc3MgdG8gRW5hYmxlRmxhZyBvbiBndWFyZHJhaWxzIChDQVNTQU5EUkEtMTc1NDQpCiBNZXJnZWQgZnJvbSA0LjA6CisgKiBQYXJ0aWFsIGNvbXBhY3Rpb24gY2FuIHJlc3VycmVjdCBkZWxldGVkIGRhdGEgKENBU1NBTkRSQS0xODUwNykKKworCis0LjEuMworTWVyZ2VkIGZyb20gNC4wOiAKICAqIFJlbW92ZSB1bm5lY2Vzc2FyeSBzaHVmZmxpbmcgb2YgR29zc2lwRGlnZXN0cyBpbiBHb3NzaXBlciNtYWtlUmFuZG9tR29zc2lwRGlnZXN0IChDQVNTQU5EUkEtMTg1NDYpCiBNZXJnZWQgZnJvbSAzLjExOgogTWVyZ2VkIGZyb20gMy4wOgogCisKIDQuMS4yCisgKiBOUEUgd2hlbiBkZXNlcmlhbGl6aW5nIG1hbGZvcm1lZCBjb2xsZWN0aW9ucyBmcm9tIGNsaWVudCAoQ0FTU0FORFJBLTE4NTA1KQogICogQWxsb3cga2V5c3RvcmUgYW5kIHRydXN0cm9yZSBwYXNzd29yZHMgdG8gYmUgbnVsbGFibGUgKENBU1NBTkRSQS0xODEyNCkKICAqIFJldHVybiBzbmFwc2hvdHMgd2l0aCBkb3RzIGluIHRoZWlyIG5hbWUgaW4gbm9kZXRvb2wgbGlzdHNuYXBzaG90cyAoQ0FTU0FORFJBLTE4MzcxKQogICogRml4IE5QRSB3aGVuIGxvYWRpbmcgc25hcHNob3RzIGFuZCBkYXRhIGRpcmVjdG9yeSBpcyBvbmUgZGlyZWN0b3J5IGZyb20gcm9vdCAoQ0FTU0FORFJBLTE4MzU5KQpAQCAtMTcsNyArMTY1LDYgQEAKICAqIFBhcnRpYWwgY29tcGFjdGlvbiBjYW4gcmVzdXJyZWN0IGRlbGV0ZWQgZGF0YSAoQ0FTU0FORFJBLTE4NTA3KQogICogQWxsb3cgaW50ZXJuYWwgYWRkcmVzcyB0byBjaGFuZ2Ugd2l0aCByZWNvbm5lY3Rpbmcgc25pdGNoZXMgKENBU1NBTkRSQS0xNjcxOCkKICAqIEZpeCBxdW90aW5nIGluIHRvQ3FsU3RyaW5nIG1ldGhvZHMgb2YgVURUcyBhbmQgYWdncmVnYXRlcyAoQ0FTU0FORFJBLTE3OTE4KQotICogTlBFIHdoZW4gZGVzZXJpYWxpemluZyBtYWxmb3JtZWQgY29sbGVjdGlvbnMgZnJvbSBjbGllbnQgKENBU1NBTkRSQS0xODUwNSkKICAqIEltcHJvdmUgJ05vdCBlbm91Z2ggc3BhY2UgZm9yIGNvbXBhY3Rpb24nIGxvZ2dpbmcgbWVzc2FnZXMgKENBU1NBTkRSQS0xODI2MCkKICAqIEluY3JlbWVudGFsIHJlcGFpcnMgZmFpbCBvbiBtaXhlZCBJUHY0L3Y2IGFkZHJlc3NlcyBzZXJpYWxpemluZyBTeW5jUmVxdWVzdCAoQ0FTU0FORFJBLTE4NDc0KQogICogRGVhZGxvY2sgdXBkYXRpbmcgc3N0YWJsZSBtZXRhZGF0YSBpZiBkaXNrIGJvdW5kYXJpZXMgbmVlZCByZWxvYWRpbmcgKENBU1NBTkRSQS0xODQ0MykKQEAgLTMzLDYgKzE4MCw3IEBACiAgKiBEbyBub3QgcmVtb3ZlIFNTVGFibGVzIHdoZW4gY2F1c2Ugb2YgRlNSZWFkRXJyb3IgaXMgT3V0T2ZNZW1vcnlFcnJvciB3aGlsZSB1c2luZyBiZXN0X2VmZm9ydCBkaXNrIGZhaWx1cmUgcG9saWN5IChDQVNTQU5EUkEtMTgzMzYpCiAgKiBEbyBub3QgcmVtb3ZlIHRydW5jYXRlZF9hdCBlbnRyeSBpbiBzeXN0ZW0ubG9jYWwgd2hpbGUgZHJvcHBpbmcgYW4gaW5kZXggKENBU1NBTkRSQS0xODEwNSkKIAorCiA0LjAuOQogICogVXBkYXRlIHpzdGQtam5pIGxpYnJhcnkgdG8gdmVyc2lvbiAxLjUuNSAoQ0FTU0FORFJBLTE4NDI5KQogICogQmFja3BvcnQgQ0FTU0FORFJBLTE3MjA1IHRvIDQuMCBicmFuY2ggLSBSZW1vdmUgc2VsZi1yZWZlcmVuY2UgaW4gU1NUYWJsZVRpZGllciAoQ0FTU0FORFJBLTE4MzMyKQpAQCAtNTAsNiArMTk4LDcgQEAKICAqIERvIG5vdCByZW1vdmUgdHJ1bmNhdGVkX2F0IGVudHJ5IGluIHN5c3RlbS5sb2NhbCB3aGlsZSBkcm9wcGluZyBhbiBpbmRleCAoQ0FTU0FORFJBLTE4MTA1KQogICogU2F2ZSBob3N0IGlkIHRvIHN5c3RlbS5sb2NhbCBhbmQgZmx1c2ggaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnR1cCAoQ0FTU0FORFJBLTE4MTUzKQogCisKIDQuMS4xCiAgKiBEZXByZWNhdGUgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wIGNvZGUgKENBU1NBTkRSQS0xNjk4NCkKICAqIEZpeCB0b28gZWFybHkgc2NoZW1hIHZlcnNpb24gY2hhbmdlIGluIHN5c2VtIGxvY2FsIHRhYmxlIChDQVNTQU5EUkEtMTgyOTEpCkBAIC05Myw2ICsyNDIsNyBAQAogICogQXZvaWQgYW50aWNvbXBhY3Rpb24gbWl4aW5nIGRhdGEgZnJvbSB0d28gZGlmZmVyZW50IHRpbWUgd2luZG93cyB3aXRoIFRXQ1MgKENBU1NBTkRSQS0xNzk3MCkKICAqIERvIG5vdCBzcGFtIHRoZSBsb2dzIHdpdGggTWlncmF0aW9uQ29vcmRpbmF0b3Igbm90IGJlaW5nIGFibGUgdG8gcHVsbCBzY2hlbWFzIChDQVNTQU5EUkEtMTgwOTYpCiAKKwogNC4xLjAKICAqIEZpeCBDb250ZW50aW9uU3RyYXRlZ3kgYmFja29mZiBhbmQgQ2xvY2sud2FpdFVudGlsIChDQVNTQU5EUkEtMTgwODYpCiBNZXJnZWQgZnJvbSA0LjA6CkBAIC0xMjksNiArMjc5LDcgQEAKICAqIFN1cHByZXNzIENWRS0yMDE5LTI2ODQgKENBU1NBTkRSQS0xNzk2NSkKICAqIEZpeCBhdXRvLWNvbXBsZXRpbmcgIldJVEgiIHdoZW4gY3JlYXRpbmcgYSBtYXRlcmlhbGl6ZWQgdmlldyAoQ0FTU0FORFJBLTE3ODc5KQogCisKIDQuMS1iZXRhMQogICogV2Ugc2hvdWxkIG5vdCBlbWl0IGRlcHJlY2F0aW9uIHdhcm5pbmcgb24gc3RhcnR1cCBmb3IgYGtleV9jYWNoZV9zYXZlX3BlcmlvZGAsIGByb3dfY2FjaGVfc2F2ZV9wZXJpb2RgLCBgY291bnRlcl9jYWNoZV9zYXZlX3BlcmlvZGAgKENBU1NBTkRSQS0xNzkwNCkKICAqIHVwc2VydCB3aXRoIGFkZGVyIHN1cHBvcnQgaXMgbm90IGNvbnNpc3RlbnQgd2l0aCBudW1iZXJzIGFuZCBzdHJpbmdzIGluIExXVCAoQ0FTU0FORFJBLTE3ODU3KQpAQCAtMTkxLDYgKzM0Miw3IEBACiAgKiBGaXggc2NydWJiZXIgZmFsbGluZyBpbnRvIGluZmluaXRlIGxvb3Agd2hlbiB0aGUgbGFzdCBwYXJ0aXRpb24gaXMgYnJva2VuIChDQVNTQU5EUkEtMTc4NjIpCiAgKiBGaXggcmVzZXR0aW5nIHNjaGVtYSAoQ0FTU0FORFJBLTE3ODE5KQogCisKIDQuMS1hbHBoYTEKICAqIEhhbmRsZSBjb25maWcgcGFyYW1ldGVycyB1cHBlciBib3VuZCBvbiBzdGFydHVwOyBGaXggYXV0b19zbmFwc2hvdF90dGwgYW5kIHBheG9zX3B1cmdlX2dyYWNlX3BlcmlvZCBtaW4gdW5pdCB2YWxpZGF0aW9ucyAoQ0FTU0FORFJBLTE3NTcxKQogICogRml4IGxlYWsgb2Ygbm9uLXN0YW5kYXJkIEphdmEgdHlwZXMgaW4gb3VyIEV4Y2VwdGlvbnMgYXMgY2xpZW50cyB1c2luZyBKTVggYXJlIHVuYWJsZSB0byBoYW5kbGUgdGhlbS4KQEAgLTQwOSw2ICs1NjEsNyBAQAogICogTGF6eSB0cmFuc2FjdGlvbiBsb2cgcmVwbGljYSBjcmVhdGlvbiBhbGxvd3MgaW5jb3JyZWN0IHJlcGxpY2EgY29udGVudCBkaXZlcmdlbmNlIGR1cmluZyBhbnRpY29tcGFjdGlvbiAoQ0FTU0FORFJBLTE3MjczKQogICogTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneSBkaXNrIHNwYWNlIGNoZWNrIGltcHJvdmVtZW50cyAoQ0FTU0FORFJBLTE3MjcyKQogCisKIDQuMC4zCiAgKiBEZXByZWNhdGUgb3RjX2NvYWxlc2Npbmdfc3RyYXRlZ3ksIG90Y19jb2FsZXNjaW5nX3dpbmRvd191cywgb3RjX2NvYWxlc2NpbmdfZW5vdWdoX2NvYWxlc2NlZF9tZXNzYWdlcywKICAgIG90Y19iYWNrbG9nX2V4cGlyYXRpb25faW50ZXJ2YWxfbXMgKENBU1NBTkRSQS0xNzM3NykKQEAgLTUxOSw2ICs2NzIsNyBAQAogICogRW5zdXJlIGphdmEgZXhlY3V0YWJsZSBpcyBvbiB0aGUgcGF0aCAoQ0FTU0FORFJBLTE0MzI1KQogICogQ2xlYW4gdHJhbnNhY3Rpb24gbG9nIGxlZnRvdmVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHNzdGFibGVsZXZlbHJlc2V0IGFuZCBzc3RhYmxlb2ZmbGluZXJlbGV2ZWwgKENBU1NBTkRSQS0xMjUxOSkKIAorCiA0LjAuMAogICogQXZvaWQgc2lnbmFsaW5nIERpZ2VzdFJlc29sdmVyIHVudGlsIHRoZSBtaW5pbXVtIG51bWJlciBvZiByZXNwb25zZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgdmlzaWJsZSAoQ0FTU0FORFJBLTE2ODA3KQogICogRml4IHByZS00LjAgRldEX0ZSTSBwYXJhbWV0ZXIgc2VyaWFsaXplciAoQ0FTU0FORFJBLTE2ODA4KQpAQCAtNTI2LDYgKzY4MCw3IEBACiAgKiBGaXggQ2Fzc2FuZHJhVmVyc2lvbjo6Y29tcGFyZVRvIChDQVNTQU5EUkEtMTY3OTQpCiAgKiBCaW5Mb2cgZG9lcyBub3QgY2xvc2UgY2hyb25pY2xlIHF1ZXVlIGxlYXZpbmcgdGhpcyB0byBHQyB0byBjbGVhbnVwIChDQVNTQU5EUkEtMTY3NzQpCiAKKwogNC4wLXJjMgogICogSW1wcm92ZWQgcGFzc3dvcmQgb2JmdXNjYXRpb24gKENBU1NBTkRSQS0xNjgwMSkKICAqIEF2b2lkIG1lbW9pemluZyB0aGUgd3JvbmcgbWluIGNsdXN0ZXIgdmVyc2lvbiBkdXJpbmcgdXBncmFkZXMgKENBU1NBTkRSQS0xNjc1OSkKQEAgLTU2MSw2ICs3MTYsNyBAQAogICogUHJldmVudCBsb3NzIG9mIGNvbW1pdCBsb2cgZGF0YSB3aGVuIG1vdmluZyBzc3RhYmxlcyBiZXR3ZWVuIG5vZGVzIChDQVNTQU5EUkEtMTY2MTkpCiAgKiBGaXggbWF0ZXJpYWxpemVkIHZpZXcgYnVpbGRlcnMgaW5zZXJ0aW5nIHRydW5jYXRlZCBkYXRhIChDQVNTQU5EUkEtMTY1NjcpCiAKKwogNC4wLXJjMQogICogQWxsb3cgZm9yIHNldHRpbmcgYnVmZmVyIG1heCBjYXBhY2l0eSB0byBpbmNyZWFzZSBpdCBkeW5hbWljYWxseSBhcyBuZWVkZWQgKENBU1NBTkRSQS0xNjUyNCkKICAqIEhhcmRlbiBpbnRlcm5vZGUgbWVzc2FnZSByZXNvdXJjZSBsaW1pdCBhY2NvdW50aW5nIGFnYWluc3Qgc2VyaWFsaXphdGlvbiBmYWlsdXJlcyAoQ0FTU0FORFJBLTE2NjE2KQpAQCAtNjQyLDYgKzc5OCw3IEBACiAgKiBGaXggY2VudG9zIHBhY2thZ2luZyBmb3IgYXJtNjQsID49NC4wIHJwbSdzIG5vdyByZXF1aXJlIHB5dGhvbjMgKENBU1NBTkRSQS0xNjQ3NykKICAqIE1ha2UgVG9rZW5NZXRhZGF0YSdzIHJpbmcgdmVyc2lvbiBpbmNyZW1lbnRzIGF0b21pYyAoQ0FTU0FORFJBLTE2Mjg2KQogCisKIDQuMC1iZXRhNAogICogRFJPUCBDT01QQUNUIFNUT1JBR0Ugc2hvdWxkIGludmFsaWRhdGUgcHJlcGFyZWQgc3RhdGVtZW50cyBzdGlsbCB1c2luZyBDb21wYWN0VGFibGVNZXRhZGF0YSAoQ0FTU0FORFJBLTE2MzYxKQogICogVXBkYXRlIGRlZmF1bHQgbnVtX3Rva2VucyB0byAxNiBhbmQgYWxsb2NhdGVfdG9rZW5zX2Zvcl9sb2NhbF9yZXBsaWNhdGlvbl9mYWN0b3IgdG8gMyAoQ0FTU0FORFJBLTEzNzAxKQpAQCAtNjg5LDYgKzg0Niw3IEBACiBNZXJnZWQgZnJvbSAyLjI6CiAgKiBGaXggdGhlIGhpc3RvZ3JhbSBtZXJnZSBvZiB0aGUgdGFibGUgbWV0cmljcyAoQ0FTU0FORFJBLTE2MjU5KQogCisKIDQuMC1iZXRhMwogICogU2VncmVnYXRlIE5ldHdvcmsgYW5kIENodW5rIENhY2hlIEJ1ZmZlclBvb2xzIGFuZCBSZWNpcmN1bGF0ZSBQYXJ0aWFsbHkgRnJlZWQgQ2h1bmtzIChDQVNTQU5EUkEtMTUyMjkpCiAgKiBGYWlsIHRydW5jYXRpb24gcmVxdWVzdHMgd2hlbiB0aGV5IGZhaWwgb24gYSByZXBsaWNhIChDQVNTQU5EUkEtMTYyMDgpCkBAIC03MzEsNiArODg5LDcgQEAKICAqIEF1dG9tYXRpY2FsbHkgZHJvcCBjb21wYWN0IHN0b3JhZ2Ugb24gdGFibGVzIGZvciB3aGljaCBpdCBpcyBzYWZlIChDQVNTQU5EUkEtMTYwNDgpCiAgKiBGaXhlZCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBmb3IgQ09NUEFDVCBTVE9SQUdFIHRhYmxlcyB3aXRoIG51bGwgY2x1c3RlcmluZyAoQ0FTU0FORFJBLTE2MjQxKQogCisKIDQuMC1iZXRhMgogICogQWRkIGFkZGl0aW9uIGluY3JlbWVudGFsIHJlcGFpciB2aXNpYmlsaXR5IHRvIG5vZGV0b29sIHJlcGFpcl9hZG1pbiAoQ0FTU0FORFJBLTE0OTM5KQogICogQWx3YXlzIGFjY2VzcyBzeXN0ZW0gcHJvcGVydGllcyBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzIHZpYSB0aGUgbmV3IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBhbmQgQ2Fzc2FuZHJhUmVsZXZhbnRFbnYgY2xhc3NlcyAoQ0FTU0FORFJBLTE1ODc2KQpAQCAtNzY5LDYgKzkyOCw3IEBACiBNZXJnZWQgZnJvbSAyLjE6CiAgKiBPbmx5IGFsbG93IHN0cmluZ3MgdG8gYmUgcGFzc2VkIHRvIEpNWCBhdXRoZW50aWNhdGlvbiAoQ0FTU0FORFJBLTE2MDc3KQogCisKIDQuMC1iZXRhMQogICogUmVtb3ZlIEJhY2tQcmVzc3VyZVN0cmF0ZWd5IChDQVNTQU5EUkEtMTUzNzUpCiAgKiBJbXByb3ZlIG1lc3NhZ2luZyBvbiBpbmRleGluZyBmcm96ZW4gY29sbGVjdGlvbnMgKENBU1NBTkRSQS0xNTkwOCkKQEAgLTg1OCw2ICsxMDE4LDcgQEAKIE1lcmdlZCBmcm9tIDIuMToKICAqIEZpeCB3cml0aW5nIG9mIHNuYXBzaG90IG1hbmlmZXN0IHdoZW4gdGhlIHRhYmxlIGhhcyB0YWJsZS1iYWNrZWQgc2Vjb25kYXJ5IGluZGV4ZXMgKENBU1NBTkRSQS0xMDk2OCkKIAorCiA0LjAtYWxwaGE0CiAgKiBBZGQgY2xpZW50IHJlcXVlc3Qgc2l6ZSBzZXJ2ZXIgbWV0cmljcyAoQ0FTU0FORFJBLTE1NzA0KQogICogQWRkIGFkZGl0aW9uYWwgbG9nZ2luZyBhcm91bmQgRmlsZVV0aWxzIGFuZCBjb21wYWN0aW9uIGxlZnRvdmVyIGNsZWFudXAgKENBU1NBTkRSQS0xNTcwNSkKQEAgLTkxNCw2ICsxMDc1LDcgQEAKICAqIEZpeCBSZWQgSGF0IGluaXQgc2NyaXB0IG9uIG5ld2VyIHN5c3RlbWQgdmVyc2lvbnMgKENBU1NBTkRSQS0xNTI3MykKICAqIEFsbG93IEVYVFJBX0NMQVNTUEFUSCB0byB3b3JrIG9uIHRhci9zb3VyY2UgaW5zdGFsbGF0aW9ucyAoQ0FTU0FORFJBLTE1NTY3KQogCisKIDQuMC1hbHBoYTMKICAqIFJlc3RvcmUgbW9ub3RvbmljIHJlYWQgY29uc2lzdGVuY3kgZ3VhcmFudGVlcyBmb3IgYmxvY2tpbmcgcmVhZCByZXBhaXIgKENBU1NBTkRSQS0xNDc0MCkKICAqIFNlcGFyYXRlIGV4Y2VwdGlvbnMgZm9yIENBUyB3cml0ZSB0aW1lb3V0IGV4Y2VwdGlvbnMgY2F1c2VkIGJ5IGNvbnRlbnRpb24gYW5kIHVua293biByZXN1bHQgKENBU1NBTkRSQS0xNTM1MCkKQEAgLTk2NSw2ICsxMTI3LDcgQEAKICAqIEluLUpWTSBEVGVzdDogU3VwcG9ydCBOb2RlVG9vbCBpbiBkdGVzdCAoQ0FTU0FORFJBLTE1NDI5KQogICogQWRkZWQgZGF0YSBtb2RlbGluZyBkb2N1bWVudGF0aW9uIChDQVNTQU5EUkEtMTU0NDMpCiAKKwogNC4wLWFscGhhMgogICogRml4IFNBU0kgbm9uLWxpdGVyYWwgc3RyaW5nIGNvbXBhcmlzb25zIChyYW5nZSBvcGVyYXRvcnMpIChDQVNTQU5EUkEtMTUxNjkpCiAgKiBVcGdyYWRlIEd1YXZhIHRvIDI3LCBhbmQgdG8gamF2YS1kcml2ZXIgMy42LjAgKGZyb20gMy40LjAtU05BUFNIT1QpIChDQVNTQU5EUkEtMTQ2NTUpCkBAIC0xMzU2LDYgKzE1MTksNyBAQAogICogTXVsdGktdmVyc2lvbiBpbi1KVk0gZHRlc3RzIChDQVNTQU5EUkEtMTQ5MzcpCiAgKiBBbGxvdyBpbnN0YW5jZSBjbGFzcyBsb2FkZXJzIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkIGZvciBpbkpWTSBkdGVzdCAoQ0FTU0FORFJBLTE1MTcwKQogCisKIDMuMTEuNgogICogRml4IGJhZCBVRFQgc3N0YWJsZSBtZXRhZGF0YSBzZXJpYWxpemF0aW9uIGhlYWRlcnMgd3JpdHRlbiBieSBDKiAzLjAgb24gdXBncmFkZSBhbmQgaW4gc3N0YWJsZXNjcnViIChDQVNTQU5EUkEtMTUwMzUpCiAgKiBGaXggbm9kZXRvb2wgY29tcGFjdGlvbnN0YXRzIHNob3dpbmcgZXh0cmEgcGVuZGluZyB0YXNrIGZvciBUV0NTIC0gcGF0Y2ggaW1wbGVtZW50ZWQgKENBU1NBTkRSQS0xNTQwOSkKQEAgLTEzODYsNiArMTU1MCw3IEBACiAgKiBJbi1KVk0gRFRlc3Q6IFN1cHBvcnQgTm9kZVRvb2wgaW4gZHRlc3QgKENBU1NBTkRSQS0xNTQyOSkKICAqIEZpeCBOYXRpdmVMaWJyYXJ5LnRyeU9wZW5EaXJlY3RvcnkgY2FsbGVycyBmb3IgV2luZG93cyAoQ0FTU0FORFJBLTE1NDI2KQogCisKIDMuMTEuNQogICogRml4IGNhc3NhbmRyYS1lbnYuc2ggdG8gdXNlICRDQVNTQU5EUkFfQ09ORiB0byBmaW5kIGNhc3NhbmRyYS1qYWFzLmNvbmZpZyAoQ0FTU0FORFJBLTE0MzA1KQogICogRml4ZWQgbm9kZXRvb2wgY2ZzdGF0cyBwcmludGluZyBpbmRleCBuYW1lIHR3aWNlIChDQVNTQU5EUkEtMTQ5MDMpCkBAIC0yNTIyLDcgKzI2ODcsNiBAQAogICogU2FuZSBkZWZhdWx0ICgyMDBNYnBzKSBmb3IgaW50ZXItREMgc3RyZWFtaW5nIHRocm91Z3B1dCAoQ0FTU0FORFJBLTg3MDgpCiAKIAotCiAzLjIKICAqIE1ha2Ugc3VyZSB0b2tlbnMgZG9uJ3QgZXhpc3QgaW4gc2V2ZXJhbCBkYXRhIGRpcmVjdG9yaWVzIChDQVNTQU5EUkEtNjY5NikKICAqIEFkZCByZXF1aXJlQXV0aG9yaXphdGlvbiBtZXRob2QgdG8gSUF1dGhvcml6ZXIgKENBU1NBTkRSQS0xMDg1MikKQEAgLTc1NTUsNyArNzcxOSw2IEBACiAgICAgLSBTaW1pbGFybHksIG1lcmdlZCBiYXRjaF9pbnNlcnRfc3VwZXIgaW50byBiYXRjaF9pbnNlcnQuCiAKIAotCiAwLjQuMCBiZXRhCiAgKiBPbi1kaXNrIGRhdGEgZm9ybWF0IGhhcyBjaGFuZ2VkIHRvIGFsbG93IGJpbGxpb25zIG9mIGtleXMvcm93cyBwZXIKICAgIG5vZGUgaW5zdGVhZCBvZiBvbmx5IG1pbGxpb25zCkBAIC03NTkyLDcgKzc3NTUsNiBAQAogICogUmVuYW1lIGNvbmZpZ3VyYXRpb24gInRhYmxlIiB0byAia2V5c3BhY2UiCiAgKiBNb3ZlZCB0byBjcmFzaC1vbmx5IGRlc2lnbjsgbm8gbW9yZSBzaHV0ZG93biAoanVzdCBraWxsIHRoZSBwcm9jZXNzKQogICogTG90cyBvZiBidWcgZml4ZXMKLQogRnVsbCBsaXN0IG9mIGlzc3VlcyByZXNvbHZlZCBpbiAwLjQgaXMgYXQgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL3NlY3VyZS9Jc3N1ZU5hdmlnYXRvci5qc3BhP3Jlc2V0PXRydWUmJnBpZD0xMjMxMDg2NSZmaXhmb3I9MTIzMTM4NjImcmVzb2x1dGlvbj0xJnNvcnRlci9maWVsZD1pc3N1ZWtleSZzb3J0ZXIvb3JkZXI9REVTQwogCiAKQEAgLTc2MjMsMyArNzc4NSw1IEBACiAgKiBDb21iaW5lZCBibG9ja2luZyBhbmQgbm9uLWJsb2NraW5nIHZlcnNpb25zIG9mIGluc2VydCBBUElzCiAgKiBBZGRlZCBGbHVzaFBlcmlvZEluTWludXRlcyBjb25maWd1cmF0aW9uIHBhcmFtZXRlciB0byBmb3JjZQogICAgZmx1c2hpbmcgb2YgaW5mcmVxdWVudGx5LXVwZGF0ZWQgQ29sdW1uRmFtaWxpZXMKKworCmRpZmYgLS1naXQgYS9ORVdTLnR4dCBiL05FV1MudHh0CmluZGV4IDA5MzBhYzAuLjIxMjllYWQgMTAwNjQ0Ci0tLSBhL05FV1MudHh0CisrKyBiL05FV1MudHh0CkBAIC01MiwyOCArNTIsMTQ3IEBACiB1c2luZyB0aGUgcHJvdmlkZWQgJ3NzdGFibGV1cGdyYWRlJyB0b29sLgogCiAKLTQuMS4xCi09PT09PQorNS4wCis9PT0KIAotRzFHQyBSZWNvbW1lbmRlZAotLS0tLS0tLS0tLS0tLS0tLQotICAgIC0gVGhlIEcxIHNldHRpbmdzIGluIGp2bTgtc2VydmVyLm9wdGlvbnMgYW5kIGp2bTExLXNlcnZlci5vcHRpb25zIGFyZSB1cGRhdGVkIGFjY29yZGluZyB0byBicm9hZCBmZWVkYmFjawotICAgICAgYW5kIHRlc3RpbmcuIFRoZSBHMSBzZXR0aW5ncyByZW1haW4gY29tbWVudGVkIG91dCBieSBkZWZhdWx0IGluIDQuMS54LiBJdCBpcyByZWNvbW1lbmRlZCB0byBzd2l0Y2gKLSAgICAgIHRvIEcxIGZvciBwZXJmb3JtYW5jZSBhbmQgZm9yIHNpbXBsZXIgR0MgdHVuaW5nLiBDTVMgaXMgYWxyZWFkeSBkZXByZWNhdGVkIGluIEpESzksIGFuZCB0aGUgbmV4dCBtYWpvcgotICAgICAgcmVsZWFzZSBvZiBDYXNzYW5kcmEgbWFrZXMgRzEgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KK05ldyBmZWF0dXJlcworLS0tLS0tLS0tLS0tCisgICAgLSBBZGRlZCBuZXcgTWF0aGVtYXRpY2FsIENRTCBmdW5jdGlvbnM6IGFicywgZXhwLCBsb2csIGxvZzEwIGFuZCByb3VuZC4KKyAgICAtIEFkZGVkIGEgdHJpZS1iYXNlZCBtZW10YWJsZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaW1wcm92ZXMgbWVtb3J5IHVzZSwgZ2FyYmFnZSBjb2xsZWN0aW9uIGVmZmljaWVuY3kgYW5kIGxvb2t1cAorICAgICAgcGVyZm9ybWFuY2UuIFRoZSBuZXcgbWVtdGFibGUgaXMgaW1wbGVtZW50ZWQgYnkgdGhlIFRyaWVNZW10YWJsZSBjbGFzcyBhbmQgY2FuIGJlIHNlbGVjdGVkIHVzaW5nIHRoZSBtZW10YWJsZQorICAgICAgQVBJLCBzZWUgc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVfQVBJLm1kLgorICAgIC0gQWRkZWQgYSBuZXcgdHJpZS1pbmRleGVkIFNTVGFibGUgZm9ybWF0IHdpdGggYmV0dGVyIGxvb2t1cCBlZmZpY2llbmN5IGFuZCBzaXplLiBUaGUgbmV3IGZvcm1hdCByZW1vdmVzIHRoZSBpbmRleAorICAgICAgc3VtbWFyeSBjb21wb25lbnQgYW5kIGRvZXMgbm90IHJlcXVpcmUga2V5IGNhY2hpbmcuIEFkZGl0aW9uYWxseSwgaXQgaXMgYWJsZSB0byBlZmZpY2llbnRseSBzZWFyY2ggaW4gcGFydGl0aW9ucworICAgICAgc3Bhbm5pbmcgdGhvdXNhbmRzIG9yIG1pbGxpb25zIG9mIHJvd3MuCisgICAgICBUaGUgZm9ybWF0IGlzIGFwcGxpZWQgYnkgc2V0dGluZyAiYnRpIiBhcyB0aGUgc2VsZWN0ZWQgc3N0YWJsZSBmb3JtYXQgaW4gY2Fzc2FuZHJhLnlhbWwncyBzc3RhYmxlcyBvcHRpb24uCisgICAgLSBBZGRlZCBhIG5ldyBjb25maWd1cmF0aW9uIGNkY19vbl9yZXBhaXJfZW5hYmxlZCB0byB0b2dnbGUgd2hldGhlciBDREMgbXV0YXRpb25zIGFyZSByZXBsYXllZCB0aHJvdWdoIHRoZQorICAgICAgd3JpdGUgcGF0aCBvbiBzdHJlYW1pbmcsIGUuZy4gcmVwYWlyLiBXaGVuIGVuYWJsZWQsIENEQyBkYXRhIHN0cmVhbWVkIHRvIHRoZSBkZXN0aW5hdGlvbiBub2RlIHdpbGwgYmUgd3JpdHRlbiBpbnRvCisgICAgICBjb21taXQgbG9nIGZpcnN0LiBXaGVuIGRpc2FibGVkLCB0aGUgc3RyZWFtZWQgQ0RDIGRhdGEgaXMgd3JpdHRlbiBpbnRvIFNTVGFibGVzIGp1c3QgdGhlIHNhbWUgYXMgbm9ybWFsIHN0cmVhbWluZy4KKyAgICAgIElmIHRoaXMgaXMgc2V0IHRvIGZhbHNlLCBzdHJlYW1pbmcgd2lsbCBiZSBjb25zaWRlcmFibHkgZmFzdGVyIGhvd2V2ZXIgaXQncyBwb3NzaWJsZSB0aGF0LCBpbiBleHRyZW1lIHNpdHVhdGlvbnMKKyAgICAgIChsb3NpbmcgPiBxdW9ydW0gIyBub2RlcyBpbiBhIHJlcGxpY2Egc2V0KSwgeW91IG1heSBoYXZlIGRhdGEgaW4geW91ciBTU1RhYmxlcyB0aGF0IG5ldmVyIG1ha2VzIGl0IHRvIHRoZSBDREMgbG9nLgorICAgICAgVGhlIGRlZmF1bHQgaXMgdHJ1ZS9lbmFibGVkLiBUaGUgY29uZmlndXJhdGlvbiBjYW4gYmUgYWx0ZXJlZCB2aWEgSk1YLgorICAgIC0gQWRkZWQgc3VwcG9ydCBmb3IgcmVhZGluZyB0aGUgd3JpdGUgdGltZXMgYW5kIFRUTHMgb2YgdGhlIGVsZW1lbnRzIG9mIGNvbGxlY3Rpb25zIGFuZCBVRFRzLCByZWdhcmRsZXNzIG9mIGJlaW5nCisgICAgICBmcm96ZW4gb3Igbm90LiBUaGUgQ1FMIGZ1bmN0aW9ucyB3cml0ZXRpbWUsIG1heHdyaXRldGltZSBhbmQgdHRsIGNhbiBub3cgYmUgYXBwbGllZCB0byBlbnRpcmUgY29sbGVjdGlvbnMvVURUcywKKyAgICAgIHNpbmdsZSBjb2xsZWN0aW9uL1VEVCBlbGVtZW50cyBhbmQgc2xpY2VzIG9mIGNvbGxlY3Rpb24vVURUIGVsZW1lbnRzLgorICAgIC0gQWRkZWQgYSBuZXcgQ1FMIGZ1bmN0aW9uLCBtYXh3cml0ZXRpbWUuIEl0IHNob3dzIHRoZSBsYXJnZXN0IHVuaXggdGltZXN0YW1wIHRoYXQgdGhlIGRhdGEgd2FzIHdyaXR0ZW4sIHNpbWlsYXIgdG8KKyAgICAgIGl0cyBzaWJsaW5nIENRTCBmdW5jdGlvbiwgd3JpdGV0aW1lLgorICAgIC0gTmV3IEd1YXJkcmFpbHMgYWRkZWQ6CisgICAgICAtIFdoZXRoZXIgQUxURVIgVEFCTEUgY29tbWFuZHMgYXJlIGFsbG93ZWQgdG8gbXV0YXRlIGNvbHVtbnMKKyAgICAgIC0gV2hldGhlciBTaW1wbGVTdHJhdGVneSBpcyBhbGxvd2VkIG9uIGtleXNwYWNlIGNyZWF0aW9uIG9yIGFsdGVyYXRpb24KKyAgICAgIC0gTWF4aW11bSByZXBsaWNhdGlvbiBmYWN0b3IKKyAgICAgIC0gV2hldGhlciBEUk9QIEtFWVNQQUNFIGNvbW1hbmRzIGFyZSBhbGxvd2VkLgorICAgICAgLSBDb2x1bW4gdmFsdWUgc2l6ZQorICAgICAgLSBQYXJ0aXRpb24gc2l6ZQorICAgIC0gSXQgaXMgcG9zc2libGUgdG8gbGlzdCBlcGhlbWVyYWwgc25hcHNob3RzIGJ5IG5vZGV0b29sIGxpc3RzbmFwaG90cyBjb21tYW5kIHdoZW4gZmxhZyAiLWUiIGlzIHNwZWNpZmllZC4KKyAgICAtIEFkZGVkIGEgbmV3IGZsYWcgdG8gYG5vZGV0b29sIHByb2ZpbGVsb2FkYCBhbmQgSk1YIGVuZHBvaW50IHRvIHNldCB1cCByZWN1cnJpbmcgcHJvZmlsZSBsb2FkIGdlbmVyYXRpb24gb24gc3BlY2lmaWVkCisgICAgICBpbnRlcnZhbHMgKHNlZSBDQVNTQU5EUkEtMTc4MjEpCisgICAgLSBBZGRlZCBhIG5ldyBwcm9wZXJ0eSwgZ29zc2lwZXIubG9vc2VfZW1wdHlfZW5hYmxlZCwgdG8gYWxsb3cgZm9yIGEgbG9vc2VyIGRlZmluaXRpb24gb2YgImVtcHR5IiB3aGVuCisgICAgICBjb25zaWRlcmluZyB0aGUgaGVhcnRiZWF0IHN0YXRlIG9mIGFub3RoZXIgbm9kZSBpbiBHb3NzaXAuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBrbm93bGVkZ2VhYmxlCisgICAgICBvcGVyYXRvcnMgaW4gdGhlIGZvbGxvd2luZyBzY2VuYXJpb3M6CisKKyAgICAgIEN1cnJlbnRseSAiZW1wdHkiIHcvcmVnYXJkcyB0byBoZWFydGJlYXQgc3RhdGUgaW4gR29zc2lwIGlzIHZlcnkgc3BlY2lmaWMgdG8gYSBzaW5nbGUgZWRnZSBjYXNlIChpLmUuIGluCisgICAgICBpc0VtcHR5V2l0aG91dFN0YXR1cygpIG91ciB1c2FnZSBvZiBoYlN0YXRlKCkgKyBhcHBsaWNhdGlvblN0YXRlKSwgaG93ZXZlciB0aGVyZSBhcmUgb3RoZXIgZmFpbHVyZSBjYXNlcyB3aGljaAorICAgICAgYmxvY2sgaG9zdCByZXBsYWNlbWVudHMgYW5kIHJlcXVpcmUgaW50cnVzaXZlIHdvcmthcm91bmRzIGFuZCBodW1hbiBpbnRlcnZlbnRpb24gdG8gcmVjb3ZlciBmcm9tIHdoZW4geW91CisgICAgICBoYXZlIHNvbWV0aGluZyBpbiBoYlN0YXRlKCkgeW91IGRvbid0IGV4cGVjdC4gU2VlIENBU1NBTkRSQS0xNzg0MiBmb3IgZnVydGhlciBkZXRhaWxzLgorICAgIC0gQWRkZWQgbmV3IENRTCB0YWJsZSBwcm9wZXJ0eSAnYWxsb3dfYXV0b19zbmFwc2hvdCcgd2hpY2ggaXMgYnkgZGVmYXVsdCB0cnVlLiBXaGVuIHNldCB0byBmYWxzZSBhbmQgJ2F1dG9fc25hcHNob3Q6IHRydWUnCisgICAgICBpbiBjYXNzYW5kcmEueWFtbCwgdGhlcmUgd2lsbCBiZSBubyBzbmFwc2hvdCB0YWtlbiB3aGVuIGEgdGFibGUgaXMgdHJ1bmNhdGVkIG9yIGRyb3BwZWQuIFdoZW4gYXV0b19zbmFwc2hvdCBpbgorICAgICAgY2FzYW5kcmEueWFtbCBpcyBzZXQgdG8gZmFsc2UsIHRoZSBuZXdseSBhZGRlZCB0YWJsZSBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGFueSBlZmZlY3QuCisgICAgLSBDaGFuZ2VkIGRlZmF1bHQgb24gcmVzdW1hYmxlIGJvb3RzdHJhcCB0byBiZSBkaXNhYmxlZC4gUmVzdW1hYmxlIGJvb3RzdHJhcCBoYXMgZWRnZSBjYXNlcyB3aXRoIHBvdGVudGlhbCBjb3JyZWN0bmVzcworICAgICAgdmlvbGF0aW9ucyBvciBkYXRhIGxvc3Mgc2NlbmFyaW9zIGlmIG5vZGVzIGdvIGRvd24gZHVyaW5nIGJvb3RzdHJhcCwgdG9tYnN0b25lcyBhcmUgd3JpdHRlbiwgYW5kIG9wZXJhdGlvbnMgcmFjZSB3aXRoCisgICAgICByZXBhaXIuIEFzIHN0cmVhbWluZyBpcyBjb25zaWRlcmFibHkgZmFzdGVyIGluIHRoZSA0LjArIGVyYSAoYXMgd2VsbCBhcyB3aXRoIHplcm8gY29weSBzdHJlYW1pbmcpLCB0aGUgcmlza3Mgb2YKKyAgICAgIGhhdmluZyB0aGVzZSBlZGdlIGNhc2VzIGR1cmluZyBhIGZhaWxlZCBhbmQgcmVzdW1lZCBib290c3RyYXAgYXJlIG5vIGxvbmdlciBkZWVtZWQgYWNjZXB0YWJsZS4KKyAgICAgIFRvIHJlLWVuYWJsZSB0aGlzIGZlYXR1cmUsIHVzZSB0aGUgLURjYXNzYW5kcmEucmVzZXRfYm9vdHN0cmFwX3Byb2dyZXNzPWZhbHNlIGVudmlyb25tZW50IGZsYWcuCisgICAgLSBBZGRlZCAtLW9sZGVyLXRoYW4gYW5kIC0tb2xkZXItdGhhbi10aW1lc3RhbXAgb3B0aW9ucyB0byBub2RldG9vbCBjbGVhcnNuYXBzaG90IGNvbW1hbmQuIEl0IGlzIHBvc3NpYmxlIHRvCisgICAgICBjbGVhciBzbmFwc2hvdHMgd2hpY2ggYXJlIG9sZGVyIHRoYW4gc29tZSBwZXJpb2QgZm9yIGV4YW1wbGUsICItLW9sZGVyLXRoYW4gNWgiIHRvIHJlbW92ZQorICAgICAgc25hcHNob3RzIG9sZGVyIHRoYW4gNSBob3VycyBhbmQgaXQgaXMgcG9zc2libGUgdG8gY2xlYXIgYWxsIHNuYXBzaG90cyBvbGRlciB0aGFuIHNvbWUgdGltZXN0YW1wLCBmb3IgZXhhbXBsZQorICAgICAgLS1vbGRlci10aGFuLXRpbWVzdGFtcCAyMDIyLTEyLTAzVDEwOjE1OjMwWi4KKyAgICAtIENhc3NhbmRyYSBsb2dzIGNhbiBiZSB2aWV3ZWQgaW4gdGhlIHZpcnR1YWwgdGFibGUgc3lzdGVtX3ZpZXdzLnN5c3RlbV9sb2dzLgorICAgICAgUGxlYXNlIHVuY29tbWVudCB0aGUgcmVzcGVjdGl2ZSBhcHBlbmRlciBpbiBsb2diYWNrLnhtbCBmaWxlIHRvIG1ha2UgbG9ncyBmbG93IGludG8gdGhpcyB0YWJsZS4gVGhpcyBmZWF0dXJlIGlzIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4KKyAgICAtIEFkZGVkIG5ldyBDUUwgdGFibGUgcHJvcGVydHkgJ2luY3JlbWVudGFsX2JhY2t1cHMnIHdoaWNoIGlzIGJ5IGRlZmF1bHQgdHJ1ZS4gV2hlbiAnaW5jcmVtZW50YWxfYmFja3VwcycgcHJvcGVydHkgaW4gY2Fzc2FuZHJhLnlhbWwKKyAgICAgIGlzIHNldCB0byB0cnVlIGFuZCB0YWJsZSBwcm9wZXJ0eSBpcyBzZXQgdG8gZmFsc2UsIGluY3JlbWVudGFsIGJhY2t1cHMgZm9yIHRoYXQgc3BlY2lmaWMgdGFibGUgd2lsbCBub3QgYmUgZG9uZS4KKyAgICAgIFdoZW4gJ2luY3JlbWVudGFsX2JhY2t1cHMnIGluIGNhc2FuZHJhLnlhbWwgaXMgc2V0IHRvIGZhbHNlLCB0aGUgbmV3bHkgYWRkZWQgdGFibGUgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhbnkgZWZmZWN0LgorICAgICAgQm90aCBwcm9wZXJ0aWVzIGhhdmUgdG8gYmUgc2V0IHRvIHRydWUgKGNhc3NhbmRyYS55YW1sIGFuZCB0YWJsZSBwcm9wZXJ0eSkgaW4gb3JkZXIgdG8gbWFrZSBpbmNyZW1lbnRhbCBiYWNrdXBzLgorICAgIC0gQWRkZWQgbmV3IENRTCBuYXRpdmUgc2NhbGFyIGZ1bmN0aW9ucyBmb3IgY29sbGVjdGlvbnMuIFRoZSBuZXcgZnVuY3Rpb25zIGFyZSBtb3N0bHkgYW5hbG9nb3VzIHRvIHRoZSBleGlzdGluZworICAgICAgYWdncmVnYXRpb24gZnVuY3Rpb25zLCBidXQgdGhleSBvcGVyYXRlIG9uIHRoZSBlbGVtZW50cyBvZiBjb2xsZWN0aW9uIGNvbHVtbnMuIFRoZSBuZXcgZnVuY3Rpb25zIGFyZSBgbWFwX2tleXNgLAorICAgICAgYG1hcF92YWx1ZXNgLCBgY29sbGVjdGlvbl9jb3VudGAsIGBjb2xsZWN0aW9uX21pbmAsIGBjb2xsZWN0aW9uX21heGAsIGBjb2xsZWN0aW9uX3N1bWAgYW5kIGBjb2xsZWN0aW9uX2F2Z2AuCisgICAgLSBBZGRlZCBjb21wYWN0aW9uX3Byb3BlcnRpZXMgY29sdW1uIHRvIHN5c3RlbS5jb21wYWN0aW9uX2hpc3RvcnkgdGFibGUgYW5kIG5vZGV0b29sIGNvbXBhY3Rpb25oaXN0b3J5IGNvbW1hbmQKKyAgICAtIFNpbXBsZVNlZWRQcm92aWRlciBjYW4gcmVzb2x2ZSBtdWx0aXBsZSBJUCBhZGRyZXNzZXMgcGVyIEROUyByZWNvcmQuIFNpbXBsZVNlZWRQcm92aWRlciByZWFjdHMgb24KKyAgICAgIHRoZSBwYXJhbWF0ZXIgY2FsbGVkIGByZXNvbHZlX211bHRpcGxlX2lwX2FkZHJlc3Nlc19wZXJfZG5zX3JlY29yZGAgd2hpY2ggdmFsdWUgaXMgbWVhbnQgdG8gYmUgYm9vbGVhbiBhbmQgYnkKKyAgICAgIGRlZmF1bHQgaXQgaXMgc2V0IHRvIGZhbHNlLiBXaGVuIHNldCB0byB0cnVlLCBTaW1wbGVTZWVkUHJvdmlkZXIgd2lsbCByZXNvbHZlIGFsbCBJUCBhZGRyZXNzZXMgcGVyIEROUyByZWNvcmQsCisgICAgICBiYXNlZCBvbiB0aGUgY29uZmlndXJlZCBuYW1lIHNlcnZpY2Ugb24gdGhlIHN5c3RlbS4KKyAgICAtIEFkZGVkIG5ldyBuYXRpdmUgQ1FMIGZ1bmN0aW9ucyBmb3IgZGF0YSBtYXNraW5nLCBhbGxvd2luZyB0byByZXBsYWNlIG9yIG9ic2N1cmUgc2Vuc2l0aXZlIGRhdGEuIFRoZSBmdW5jdGlvbnMgYXJlOgorICAgICAgLSBgbWFza19udWxsYCByZXBsYWNlcyB0aGUgY29sdW1uIHZhbHVlIGJ5IG51bGwuCisgICAgICAtIGBtYXNrX2RlZmF1bHRgIHJlcGxhY2VzIHRoZSBkYXRhIGJ5IGEgZml4ZWQgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc2FtZSB0eXBlLgorICAgICAgLSBgbWFza19yZXBsYWNlYCByZXBsYWNlcyB0aGUgZGF0YSBieSBhIGN1c3RvbSB2YWx1ZS4KKyAgICAgIC0gYG1hc2tfaW5uZXJgIHJlcGxhY2VzIGV2ZXJ5IGNoYXJhY3RlciBidXQgdGhlIGZpcnN0IGFuZCBsYXN0IG9uZXMgYnkgYSBmaXhlZCBjaGFyYWN0ZXIuCisgICAgICAtIGBtYXNrX291dGVyYCByZXBsYWNlcyB0aGUgZmlyc3QgYW5kIGxhc3QgY2hhcmFjdGVycyBieSBhIGZpeGVkIGNoYXJhY3Rlci4KKyAgICAgIC0gYG1hc2tfaGFzaGAgcmVwbGFjZXMgdGhlIGRhdGEgYnkgaXRzIGhhc2gsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGFsZ29yaXRobS4KKyAgICAtIE9uIHZpcnR1YWwgdGFibGVzLCBpdCBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgYEFMTE9XIEZJTFRFUklOR2AgZm9yIHNlbGVjdCBzdGF0ZW1lbnRzIHdoaWNoIHdvdWxkCisgICAgICBub3JtYWxseSByZXF1aXJlIGl0LCBleGNlcHQgYHN5c3RlbV92aWV3cy5zeXN0ZW1fbG9nc2AuCisgICAgLSBNb3JlIGFjY3VyYXRlIHNraXBwaW5nIG9mIHNzdGFibGVzIGluIHJlYWQgcGF0aCBkdWUgdG8gYmV0dGVyIGhhbmRsaW5nIG9mIG1pbi9tYXggY2x1c3RlcmluZyBhbmQgbG93ZXIgYm91bmQ7CisgICAgICBTU1RhYmxlIGZvcm1hdCBoYXMgYmVlbiBidW1wZWQgdG8gJ25jJyBiZWNhdXNlIHRoZXJlIGFyZSBuZXcgZmllbGRzIGluIHN0YXRzIG1ldGFkYXRhXAorICAgIC0gQWRkZWQgTWF4U1NUYWJsZVNpemUgYW5kIE1heFNTVGFibGVEdXJhdGlvbiBtZXRyaWNzIHRvIFRhYmxlTWV0cmljcy4gVGhlIGZvcm1lciByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBiaWdnZXN0IAorICAgICAgU1NUYWJsZSBvZiBhIHRhYmxlIG9yIDAgd2hlbiB0aGVyZSBpcyBub3QgYW55IFNTVGFibGUuIFRoZSBsYXR0ZXIgcmV0dXJucyB0aGUgbWF4aW11bSBkdXJhdGlvbiwgY29tcHV0ZWQgYXMgCisgICAgICBgbWF4VGltZXN0YW1wIC0gbWluVGltZXN0YW1wYCwgZWZmZWN0aXZlbHkgbm9uLXplcm8gZm9yIFNTVGFibGVzIHByb2R1Y2VkIGJ5IFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kuCisgICAgLSBBZGRlZCBsb2NhbCByZWFkL3dyaXRlIHJhdGlvIHRvIHRhYmxlc3RhdHMuCisgICAgLSBBZGRlZCBzeXN0ZW1fdmlld3MubWF4X3NzdGFibGVfc2l6ZSBhbmQgc3lzdGVtX3ZpZXdzLm1heF9zc3RhYmxlX2R1cmF0aW9uIHRhYmxlcy4KKyAgICAtIEFkZGVkIHZpcnR1YWwgdGFibGUgc3lzdGVtX3ZpZXdzLnNuYXBzaG90cyB0byBzZWUgYWxsIHNuYXBzaG90cyBmcm9tIENRTCBzaGVsbC4KKyAgICAtIEFkZGVkIHN1cHBvcnQgZm9yIGF0dGFjaGluZyBDUUwgZHluYW1pYyBkYXRhIG1hc2tpbmcgZnVuY3Rpb25zIHRvIHRhYmxlIGNvbHVtbnMgb24gdGhlIHNjaGVtYS4gVGhlc2UgbWFza2luZworICAgICAgZnVuY3Rpb25zIGNhbiBiZSBhdHRhY2hlZCB0byBvciBkZXR0YWNoZWQgZnJvbSBjb2x1bW5zIHdpdGggQ1JFQVRFL0FMVEVSIFRBQkxFIHN0YXRlbWVudHMuIFRoZSBmdW5jdGlvbnMgb2JzY3VyZQorICAgICAgdGhlIG1hc2tlZCBkYXRhIGR1cmluZyBxdWVyaWVzLCBidXQgdGhleSBkb24ndCBjaGFuZ2UgdGhlIHN0b3JlZCBkYXRhLgorICAgIC0gQWRkZWQgbmV3IFVOTUFTSyBwZXJtaXNzaW9uLiBJdCBhbGxvd3MgdG8gc2VlIHRoZSBjbGVhciBkYXRhIG9mIGNvbHVtbnMgd2l0aCBhbiBhdHRhY2hlZCBtYXNrLiBTdXBlcnVzZXJzIGhhdmUgaXQKKyAgICAgIGJ5IGRlZmF1bHQsIHdoZXJlYXMgcmVndWxhciB1c2VycyBkb24ndCBoYXZlIGl0IGJ5IGRlZmF1bHQuCisgICAgLSBBZGRlZCBuZXcgU0VMRUNUX01BU0tFRCBwZXJtaXNzaW9uLiBJdCBhbGxvd3MgdG8gcnVuIFNFTEVDVCBxdWVyaWVzIHNlbGVjdGluZyB0aGUgY2xlYXIgdmFsdWVzIG9mIG1hc2tlZCBjb2x1bW5zLgorICAgICAgU3VwZXJ1c2VycyBoYXZlIGl0IGJ5IGRlZmF1bHQsIHdoZXJlYXMgcmVndWxhciB1c2VycyBkb24ndCBoYXZlIGl0IGJ5IGRlZmF1bHQuCisgICAgLSBBZGRlZCBzdXBwb3J0IGZvciB1c2luZyBVREZzIGFzIG1hc2tpbmcgZnVuY3Rpb25zIGF0dGFjaGVkIHRvIHRhYmxlIGNvbHVtbnMgb24gdGhlIHNjaGVtYS4KKyAgICAtIEFkZGVkIGBzc3RhYmxlcGFydGl0aW9uc2Agb2ZmbGluZSB0b29sIHRvIGZpbmQgbGFyZ2UgcGFydGl0aW9ucyBpbiBzc3RhYmxlcy4KKyAgICAtIGBjYXNzYW5kcmEtc3RyZXNzYCBoYXMgYSBuZXcgb3B0aW9uIGNhbGxlZCAnLWpteCcgd2hpY2ggZW5hYmxlcyBhIHVzZXIgdG8gcGFzcyB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdG8gSk1YIChDQVNTQU5EUkEtMTg1NDQpCisgICAgLSBJdCBpcyBwb3NzaWJsZSB0byByZWFkIGFsbCBjcmVkZW50aWFscyBmb3IgYGNhc3NhbmRyYS1zdHJlc3NgIGZyb20gYSBmaWxlIHZpYSBvcHRpb24gYC1jcmVkZW50aWFscy1maWxlYCAoQ0FTU0FORFJBLTE4NTQ0KQogCiBVcGdyYWRpbmcKIC0tLS0tLS0tLQorICAgIC0gRXBoZW1lcmFsIG1hcmtlciBmaWxlcyBmb3Igc25hcHNob3RzIGRvbmUgYnkgcmVwYWlycyBhcmUgbm90IGNyZWF0ZWQgYW55bW9yZSwKKyAgICAgIHRoZXJlIGlzIGEgZGVkaWNhdGVkIGZsYWcgaW4gc25hcHNob3QgbWFuaWZlc3QgaW5zdGVhZC4gT24gdXBncmFkZSBvZiBhIG5vZGUgdG8gdGhpcyB2ZXJzaW9uLCBvbiBub2RlJ3Mgc3RhcnQsIGluIGNhc2UgdGhlcmUKKyAgICAgIGFyZSBzdWNoIGVwaGVtZXJhbCBzbmFwc2hvdHMgb24gZGlzaywgdGhleSB3aWxsIGJlIGRlbGV0ZWQgKHNhbWUgYmVoYXZpb3VyIGFzIGJlZm9yZSkgYW5kIGFueSBuZXcgZXBoZW1lcmFsIHNuYXBzaG90cworICAgICAgd2lsbCBzdG9wIHRvIGNyZWF0ZSBlcGhlbWVyYWwgbWFya2VyIGZpbGVzIGFzIGZsYWcgaW4gYSBzbmFwc2hvdCBtYW5pZmVzdCB3YXMgaW50cm9kdWNlZCBpbnN0ZWFkLgorICAgIC0gVGhlcmUgd2VyZSBuZXcgdGFibGUgcHJvcGVydGllcyBpbnRyb2R1Y2VkIGNhbGxlZCAnYWxsb3dfYXV0b19zbmFwc2hvdCcgYW5kICdpbmNyZW1lbnRhbF9iYWNrdXBzJyAoc2VlIHNlY3Rpb24gJ05ldyBmZWF0dXJlcycpLiBIZW5jZSwgdXBncmFkZWQKKyAgICAgIG5vZGUgd2lsbCBiZSBvbiBhIG5ldyBzY2hlbWEgdmVyc2lvbi4gUGxlYXNlIGRvIGEgcm9sbGluZyB1cGdyYWRlIG9mIG5vZGVzIG9mIGEgY2x1c3RlciB0byBjb252ZXJnZSB0byBvbmUgc2NoZW1hIHZlcnNpb24uCiAgICAgLSBBbGwgcHJldmlvdXMgdmVyc2lvbnMgb2YgNC54IGNvbnRhaW5lZCBhIG1pc3Rha2Ugb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBvbGQgQ1FMIG5hdGl2ZSBwcm90b2NvbCB2My4gVGhhdAogICAgICBtaXN0YWtlIHByb2R1Y2VkIGlzc3VlcyB3aGVuIHBhZ2luZyBvdmVyIHRhYmxlcyB3aXRoIGNvbXBhY3Qgc3RvcmFnZSBhbmQgYSBzaW5nbGUgY2x1c3RlcmluZyBjb2x1bW4gZHVyaW5nIHJvbGxpbmcKICAgICAgdXBncmFkZXMgaW52b2x2aW5nIDMueCBhbmQgNC54IG5vZGVzLiBUaGUgZml4IGZvciB0aGF0IGlzc3VlIG1ha2VzIGl0IGNhbiBub3cgYXBwZWFyIGR1cmluZyByb2xsaW5nIHVwZ3JhZGVzIGZyb20KICAgICAgNC4xLjAgb3IgNC4wLjAtNC4wLjcuIElmIHRoYXQgaXMgeW91ciBjYXNlLCBwbGVhc2UgdXNlIHByb3RvY29sIHY0IG9yIGhpZ2hlciBpbiB5b3VyIGRyaXZlci4gU2VlIENBU1NBTkRSQS0xNzUwNwogICAgICBmb3IgZnVydGhlciBkZXRhaWxzLgorICAgLSBBZGRlZCBBUEkgZm9yIGFsdGVybmF0aXZlIHNzdGFibGUgaW1wbGVtZW50YXRpb25zLiBGb3IgZGV0YWlscywgc2VlIHNyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZV9BUEkubWQKKyAgIC0gRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSB3YXMgcmVtb3ZlZC4gUGxlYXNlIGNoYW5nZSB0aGUgY29tcGFjdGlvbiBzdHJhdGVneSBmb3IgdGhlIHRhYmxlcyB1c2luZyB0aGlzIHN0cmF0ZWd5CisgICAgIHRvIFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kgYmVmb3JlIHVwZ3JhZGluZyB0byB0aGlzIHZlcnNpb24uCisgICAtIFRoZSBkZXByZWNhdGVkIGZ1bmN0aW9ucyBgZGF0ZU9mYCBhbmQgYHVuaXhUaW1lc3RhbXBPZmAgaGF2ZSBiZWVuIHJlbW92ZWQuIFRoZXkgd2VyZSBkZXByZWNhdGVkIGFuZCByZXBsYWNlZCBieQorICAgICBgdG9UaW1lc3RhbXBgIGFuZCBgdG9Vbml4VGltZXN0YW1wYCBpbiBDYXNzYW5kcmEgMi4yLgorICAgLSBIYWRvb3AgaW50ZWdyYXRpb24gaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSAoQ0FTU0FORFJBLTE4MzIzKS4gSWYgeW91IHdhbnQgdG8gcHJvY2VzcyBDYXNzYW5kcmEgZGF0YSBieSBiaWcgZGF0YSBmcmFtZXdvcmtzLCAKKyAgICAgcGxlYXNlIHVwZ3JhZGUgeW91ciBpbmZyYXN0cnVjdHVyZSB0byB1c2UgQ2Fzc2FuZHJhIFNwYXJrIGNvbm5lY3Rvci4KKyAgIC0gS2V5c3RvcmUvdHJ1c3RzdG9yZSBwYXNzd29yZCBjb25maWd1cmF0aW9ucyBhcmUgbnVsbGFibGUgbm93IGFuZCB0aGUgY29kZSBkZWZhdWx0cyBvZiB0aG9zZSBwYXNzd29yZHMgdG8gJ2Nhc3NhbmRyYScgYXJlCisgICAgIHJlbW92ZWQuIEFueSBkZXBsb3ltZW50cyB0aGF0IGRlcGVuZCB1cG9uIHRoZSBjb2RlIGRlZmF1bHQgdG8gdGhpcyBwYXNzd29yZCB2YWx1ZSB3aXRob3V0IGV4cGxpY2l0bHkgc3BlY2lmeWluZworICAgICBpdCBpbiBjYXNzYW5kcmEueWFtbCB3aWxsIGZhaWwgb24gdXBncmFkZS4gUGxlYXNlIHNwZWNpZnkgeW91ciBrZXlzdG9yZV9wYXNzd29yZCBhbmQgdHJ1c3RzdG9yZV9wYXNzd29yZCBlbGVtZW50cyBpbiBjYXNzYW5kcmEueWFtbCB3aXRoIGFwcHJvcHJpYXRlCisgICAgIHZhbHVlcyB0byBwcmV2ZW50IHRoaXMgZmFpbHVyZS4KIAogRGVwcmVjYXRpb24KIC0tLS0tLS0tLS0tCi0gICAgLSBIYWRvb3AgaW50ZWdyYXRpb24gaW4gcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGFjdGl2ZWx5IG1haW50YWluZWQuCi0gICAgICBUaGlzIGNvZGUgaXMgc2NoZWR1bGVkIHRvIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiBvZiBDYXNzYW5kcmEuCisgICAgLSBJbiB0aGUgSk1YIE1CZWFuIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPVJlcGFpclNlcnZpY2VgIChDQVNTQU5EUkEtMTc2NjgpOgorICAgICAgICAtIGRlcHJlY2F0ZSB0aGUgZ2V0dGVyL3NldHRlciBtZXRob2RzIGBnZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1lYmlieXRlc2AgYW5kIGBzZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1lYmlieXRlc2AKKyAgICAgICAgICBpbiBmYXZvciBvZiBgZ2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUJgIGFuZCBgc2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUJgIHJlc3BlY3RpdmVseQorICAgIC0gSW4gdGhlIEpNWCBNQmVhbiBgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI6dHlwZT1TdG9yYWdlU2VydmljZWAgKENBU1NBTkRSQS0xNzY2OCk6CisgICAgICAgIC0gZGVwcmVjYXRlIHRoZSBnZXR0ZXIvc2V0dGVyIG1ldGhvZHMgYGdldFJlcGFpclNlc3Npb25NYXhUcmVlRGVwdGhgIGFuZCBgc2V0UmVwYWlyU2Vzc2lvbk1heFRyZWVEZXB0aGAKKyAgICAgICAgICBpbiBmYXZvciBvZiBgZ2V0UmVwYWlyU2Vzc2lvbk1heGltdW1UcmVlRGVwdGhgIGFuZCBgc2V0UmVwYWlyU2Vzc2lvbk1heGltdW1UcmVlRGVwdGhgCisgICAgICAgIC0gZGVwcmVjYXRlIHRoZSBzZXR0ZXIgbWV0aG9kIGBzZXRDb2x1bW5JbmRleFNpemVgIGluIGZhdm9yIG9mIGBzZXRDb2x1bW5JbmRleFNpemVJbktpQmAKKyAgICAgICAgLSBkZXByZWNhdGUgdGhlIGdldHRlci9zZXR0ZXIgbWV0aG9kcyBgZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemVgIGFuZCBgc2V0Q29sdW1uSW5kZXhDYWNoZVNpemVgIGluIGZhdm9yIG9mCisgICAgICAgICAgYGdldENvbHVtbkluZGV4Q2FjaGVTaXplSW5LaUJgIGFuZCBgc2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQmAgcmVzcGVjdGl2ZWx5CisgICAgICAgIC0gZGVwcmVjYXRlIHRoZSBnZXR0ZXIvc2V0dGVyIG1ldGhvZHMgYGdldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGRgIGFuZCBgc2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZGAgaW4gZmF2b3Igb2YKKyAgICAgICAgICBgZ2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZEluS2lCYCBhbmQgYHNldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGRJbktpQmAgcmVzcGVjdGl2ZWx5CisgICAgLSBBbGwgbmF0aXZlIENRTCBmdW5jdGlvbnMgbmFtZXMgdGhhdCBkb24ndCB1c2UgdGhlIHNuYWtlIGNhc2UgbmFtZXMgYXJlIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGVxdWl2YWxlbnQgbmFtZXMKKyAgICAgIHVzaW5nIHNuYWtlIGNhc2luZy4gVGh1cywgYHRvdGltZXN0YW1wYCBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBgdG9fdGltZXN0YW1wYCwgYGludGFzYmxvYmAgaW4gZmF2b3VyCisgICAgICBvZiBgaW50X2FzX2Jsb2JgLCBgY2FzdEFzSW50YCBpbiBmYXZvdXIgb2YgYGNhc3RfYXNfaW50YCwgZXRjLgorICAgIC0gVGhlIGNvbmZpZyBwcm9wZXJ0eSBgY29tcGFjdGlvbl9sYXJnZV9wYXJ0aXRpb25fd2FybmluZ190aHJlc2hvbGRgIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSBuZXcKKyAgICAgIGd1YXJkcmFpbCBmb3IgcGFydGl0aW9uIHNpemUuIFRoYXQgZ3VhcmRyYWlsIGlzIGJhc2VkIG9uIHRoZSBwcm9wZXJ0aWVzIGBwYXJ0aXRpb25fc2l6ZV93YXJuX3RocmVzaG9sZGAgYW5kCisgICAgICBgcGFydGl0aW9uX3NpemVfZmFpbF90aHJlc2hvbGRgLiBUaGUgd2FybiB0aHJlc2hvbGQgaGFzIGEgdmVyeSBzaW1pbGFyIGJlaGF2aW91ciB0byB0aGUgb2xkIGNvbmZpZyBwcm9wZXJ0eS4KIAogNC4xCiA9PT0KQEAgLTQxNiw3ICs1MzUsNyBAQAogICAgIC0gTmF0aXZlIHByb3RvY29sIHY1IGlzIHByb21vdGVkIGZyb20gYmV0YSBpbiB0aGlzIHJlbGVhc2UuIFRoZSB3aXJlIGZvcm1hdCBoYXMgY2hhbmdlZAogICAgICAgc2lnbmlmaWNhbnRseSBhbmQgdXNlcnMgc2hvdWxkIHRha2UgY2FyZSB0byBlbnN1cmUgY2xpZW50IGRyaXZlcnMgYXJlIHVwZ3JhZGVkIHRvIGEgdmVyc2lvbgogICAgICAgd2l0aCBzdXBwb3J0IGZvciB0aGUgZmluYWwgdjUgZm9ybWF0LCBpZiBjdXJyZW50bHkgY29ubmVjdGluZyBvdmVyIHY1LWJldGEuIChDQVNTQU5EUkEtMTUyOTksIENBU1NBTkRSQS0xNDk3MykKLSAgICAtIENhc3NhbmRyYSByZW1vdmVkIHN1cHBvcnQgZm9yIHRoZSBPbGROZXR3b3JrVG9wb2xvZ3lTdHJhdGVneS4gQmVmb3JlIHVwZ3JhZGluZyB5b3Ugd2lsbCBuZWVkIHRvIGNoYW5nZSB0aGUgCisgICAgLSBDYXNzYW5kcmEgcmVtb3ZlZCBzdXBwb3J0IGZvciB0aGUgT2xkTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3kuIEJlZm9yZSB1cGdyYWRpbmcgeW91IHdpbGwgbmVlZCB0byBjaGFuZ2UgdGhlCiAgICAgICByZXBsaWNhdGlvbiBzdHJhdGVneSBmb3IgdGhlIGtleXNwYWNlcyB1c2luZyB0aGlzIHN0cmF0ZWd5IHRvIHRoZSBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneS4gKENBU1NBTkRSQS0xMzk5MCkKICAgICAtIFNzdGFibGVzIGZvciB0YWJsZXMgdXNpbmcgd2l0aCBhIGZyb3plbiBVRFQgd3JpdHRlbiBieSBDKiAzLjAgYXBwZWFyIGFzIGNvcnJ1cHRlZC4KIApAQCAtNTU5LDcgKzY3OCw3IEBACiAgICAgICB0aGUgbm9kZSB3aWxsIG5vdCBzdGFydC4gU2VlIENBU1NBTkRSQS0xNDQ3NyBmb3IgZGV0YWlscy4KICAgICAtIENBU1NBTkRSQS0xMzcwMSBUbyBnaXZlIGEgYmV0dGVyIG91dCBvZiB0aGUgYm94IGV4cGVyaWVuY2UsIHRoZSBkZWZhdWx0ICdudW1fdG9rZW5zJwogICAgICAgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZCBmcm9tIDI1NiB0byAxNiBmb3IgcmVhc29ucyBkZXNjcmliZWQgaW4KLSAgICAgIGh0dHBzOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvZG9jL2xhdGVzdC9nZXR0aW5nX3N0YXJ0ZWQvcHJvZHVjdGlvbi5odG1sI3Rva2VucworICAgICAgaHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9kb2MvbGF0ZXN0L2dldHRpbmctc3RhcnRlZC9wcm9kdWN0aW9uLmh0bWwjdG9rZW5zCiAgICAgICAnYWxsb2NhdGVfdG9rZW5zX2Zvcl9sb2NhbF9yZXBsaWNhdGlvbl9mYWN0b3InIGlzIGFsc28gdW5jb21tZW50ZWQgYW5kIHNldCB0byAzLgogICAgICAgUGxlYXNlIG5vdGUgd2hlbiB1cGdyYWRpbmcgdGhhdCBpZiB0aGUgJ251bV90b2tlbnMnIHZhbHVlIGlzIGRpZmZlcmVudCB0aGFuIHdoYXQgeW91IGhhdmUKICAgICAgIGNvbmZpZ3VyZWQsIHRoZSB1cGdyYWRlZCBub2RlIHdpbGwgcmVmdXNlIHRvIHN0YXJ0LiBBbHNvIG5vdGUgdGhhdCBpZiBhIG5ldyBub2RlIGpvaW5pbmcKQEAgLTYxNCw3ICs3MzMsNyBAQAogICAgICAgcmVhc29uLCBhIG9wdC1pbiBzeXN0ZW0gcHJvcGVydHkgaGFzIGJlZW4gYWRkZWQgdG8gZGlzYWJsZSB0aGUgZml4OgogICAgICAgICAtRGNhc3NhbmRyYS51bnNhZmUuZGlzYWJsZS1zZXJpYWwtcmVhZHMtbGluZWFyaXphYmlsaXR5PXRydWUKICAgICAgIFVzZSB0aGlzIGZsYWcgYXQgeW91ciBvd24gcmlzayBhcyBpdCByZXZlcnQgU0VSSUFMIHJlYWRzIHRvIHRoZSBpbmNvcnJlY3QgYmVoYXZpb3Igb2YKLSAgICAgIHByZXZpb3VzIHZlcnNpb25zLiBTZWUgQ0FTU0FORFJBLTEyMTI2IGZvciBkZXRhaWxzLiAKKyAgICAgIHByZXZpb3VzIHZlcnNpb25zLiBTZWUgQ0FTU0FORFJBLTEyMTI2IGZvciBkZXRhaWxzLgogICAgIC0gU0FTSSdzIGBtYXhfY29tcGFjdGlvbl9mbHVzaF9tZW1vcnlfaW5fbWJgIHNldHRpbmcgd2FzIHByZXZpb3VzbHkgZ2V0dGluZyBpbnRlcnByZXRlZCBpbiBieXRlcy4gRnJvbSAzLjExLjgKICAgICAgIGl0IGlzIGNvcnJlY3RseSBpbnRlcnByZXRlZCBpbiBtZWdhYnl0ZXMsIGJ1dCBwcmlvciB0byAzLjExLjEwIHByZXZpb3VzIGNvbmZpZ3VyYXRpb25zIG9mIHRoaXMgc2V0dGluZyB3aWxsCiAgICAgICBsZWFkIHRvIG5vZGVzIE9PTSBkdXJpbmcgY29tcGFjdGlvbi4gRnJvbSAzLjExLjEwIHByZXZpb3VzIGNvbmZpZ3VyYXRpb25zIHdpbGwgYmUgZGV0ZWN0ZWQgYXMgaW5jb3JyZWN0LApAQCAtNzExLDcgKzgzMCw3IEBACiAgICAgICBTdGFydGluZyB2ZXJzaW9uIDUuMCwgQ09NUEFDVCBTVE9SQUdFIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZC4KICAgICAgICdBTFRFUiAuLi4gRFJPUCBDT01QQUNUIFNUT1JBR0UnIHN0YXRlbWVudCBtYWtlcyBDb21wYWN0IFRhYmxlcyBDUUwtY29tcGF0aWJsZSwKICAgICAgIGV4cG9zaW5nIGludGVybmFsIHN0cnVjdHVyZSBvZiBUaHJpZnQvQ29tcGFjdCBUYWJsZXMuIFlvdSBjYW4gZmluZCBtb3JlIGRldGFpbHMKLSAgICAgIG9uIGV4cG9zZWQgaW50ZXJuYWwgc3RydWN0dXJlIHVuZGVyOiAKKyAgICAgIG9uIGV4cG9zZWQgaW50ZXJuYWwgc3RydWN0dXJlIHVuZGVyOgogICAgICAgaHR0cDovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2RvYy9sYXRlc3QvY3FsL2FwcGVuZGljZXMuaHRtbCNhcHBlbmRpeC1jLWRyb3BwaW5nLWNvbXBhY3Qtc3RvcmFnZQogCiAgICAgICBGb3IgdW5pbnRlcnJ1cHRlZCBjbHVzdGVyIHVwZ3JhZGVzLCBkcml2ZXJzIG5vdyBzdXBwb3J0ICdOT19DT01QQUNUJyBzdGFydHVwIG9wdGlvbi4KZGlmZiAtLWdpdCBhL1JFQURNRS5hc2MgYi9SRUFETUUuYXNjCmluZGV4IGY0ODRhYTIuLjE2ZDVlMDkgMTAwNjQ0Ci0tLSBhL1JFQURNRS5hc2MKKysrIGIvUkVBRE1FLmFzYwpAQCAtOSw2ICs5LDggQEAKIAogRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBodHRwOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvW3RoZSBBcGFjaGUgQ2Fzc2FuZHJhIHdlYiBzaXRlXS4KIAorSXNzdWVzIHNob3VsZCBiZSByZXBvcnRlZCBvbiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvcHJvamVjdHMvQ0FTU0FORFJBL2lzc3Vlcy9bVGhlIENhc3NhbmRyYSBKaXJhXS4KKwogUmVxdWlyZW1lbnRzCiAtLS0tLS0tLS0tLS0KIC4gSmF2YSA+PSAxLjggKE9wZW5KREsgYW5kIE9yYWNsZSBKVk1TIGhhdmUgYmVlbiB0ZXN0ZWQpCkBAIC0xOCw3ICsyMCw3IEBACiAtLS0tLS0tLS0tLS0tLS0KIAogVGhpcyBzaG9ydCBndWlkZSB3aWxsIHdhbGsgeW91IHRocm91Z2ggZ2V0dGluZyBhIGJhc2ljIG9uZSBub2RlIGNsdXN0ZXIgdXAKLWFuZCBydW5uaW5nLCBhbmQgZGVtb25zdHJhdGUgc29tZSBzaW1wbGUgcmVhZHMgYW5kIHdyaXRlcy4gRm9yIGEgbW9yZS1jb21wbGV0ZSBndWlkZSwgcGxlYXNlIHNlZSB0aGUgQXBhY2hlIENhc3NhbmRyYSB3ZWJzaXRlJ3MgaHR0cDovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2RvYy9sYXRlc3QvZ2V0dGluZ19zdGFydGVkL1tHZXR0aW5nIFN0YXJ0ZWQgR3VpZGVdLgorYW5kIHJ1bm5pbmcsIGFuZCBkZW1vbnN0cmF0ZSBzb21lIHNpbXBsZSByZWFkcyBhbmQgd3JpdGVzLiBGb3IgYSBtb3JlLWNvbXBsZXRlIGd1aWRlLCBwbGVhc2Ugc2VlIHRoZSBBcGFjaGUgQ2Fzc2FuZHJhIHdlYnNpdGUncyBodHRwOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvZG9jL2xhdGVzdC9nZXR0aW5nLXN0YXJ0ZWQvW0dldHRpbmcgU3RhcnRlZCBHdWlkZV0uCiAKIEZpcnN0LCB3ZSdsbCB1bnBhY2sgb3VyIGFyY2hpdmU6CiAKQEAgLTM5LDcgKzQxLDcgQEAKIAogLS0tLQogQ29ubmVjdGVkIHRvIFRlc3QgQ2x1c3RlciBhdCBsb2NhbGhvc3Q6OTE2MC4KLVtjcWxzaCA2LjAuMCB8IENhc3NhbmRyYSA0LjEgfCBDUUwgc3BlYyAzLjQuNiB8IE5hdGl2ZSBwcm90b2NvbCB2NV0KK1tjcWxzaCA2LjIuMCB8IENhc3NhbmRyYSA1LjAtU05BUFNIT1QgfCBDUUwgc3BlYyAzLjQuNyB8IE5hdGl2ZSBwcm90b2NvbCB2NV0KIFVzZSBIRUxQIGZvciBoZWxwLgogY3Fsc2g+CiAtLS0tCkBAIC03Niw4ICs3OCwxMCBAQAogCiBXb25kZXJpbmcgd2hlcmUgdG8gZ28gZnJvbSBoZXJlPwogCi0gICogSm9pbiB1cyBpbiAjY2Fzc2FuZHJhIG9uIHRoZSBodHRwczovL3MuYXBhY2hlLm9yZy9zbGFjay1pbnZpdGVbQVNGIFNsYWNrXSBhbmQgYXNrIHF1ZXN0aW9ucworICAqIEpvaW4gdXMgaW4gI2Nhc3NhbmRyYSBvbiB0aGUgaHR0cHM6Ly9zLmFwYWNoZS5vcmcvc2xhY2staW52aXRlW0FTRiBTbGFja10gYW5kIGFzayBxdWVzdGlvbnMuCiAgICogU3Vic2NyaWJlIHRvIHRoZSBVc2VycyBtYWlsaW5nIGxpc3QgYnkgc2VuZGluZyBhIG1haWwgdG8KLSAgICB1c2VyLXN1YnNjcmliZUBjYXNzYW5kcmEuYXBhY2hlLm9yZworICAgIHVzZXItc3Vic2NyaWJlQGNhc3NhbmRyYS5hcGFjaGUub3JnLgorICAqIFN1YnNjcmliZSB0byB0aGUgRGV2ZWxvcGVyIG1haWxpbmcgbGlzdCBieSBzZW5kaW5nIGEgbWFpbCB0bworICAgIGRldi1zdWJzY3JpYmVAY2Fzc2FuZHJhLmFwYWNoZS5vcmcuCiAgICogVmlzaXQgdGhlIGh0dHA6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9jb21tdW5pdHkvW2NvbW11bml0eSBzZWN0aW9uXSBvZiB0aGUgQ2Fzc2FuZHJhIHdlYnNpdGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gZ2V0dGluZyBpbnZvbHZlZC4KICAgKiBWaXNpdCB0aGUgaHR0cDovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2RvYy9sYXRlc3QvZGV2ZWxvcG1lbnQvaW5kZXguaHRtbFtkZXZlbG9wbWVudCBzZWN0aW9uXSBvZiB0aGUgQ2Fzc2FuZHJhIHdlYnNpdGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRyaWJ1dGUuCmRpZmYgLS1naXQgYS9URVNUSU5HLm1kIGIvVEVTVElORy5tZAppbmRleCAwZjI1NzQzLi5iOWM1YzdhIDEwMDY0NAotLS0gYS9URVNUSU5HLm1kCisrKyBiL1RFU1RJTkcubWQKQEAgLTM2NCwxNCArMzY0LDE0IEBACiAKIAogKipFeGFtcGxlLCBhbHRlcm5hdGl2ZSoqCi1gYGBqYXZheXkKK2BgYGphdmEKIGNsYXNzIFNvbWVWZXJiSGFuZGxlciBpbXBsZW1lbnRzIElWZXJiSGFuZGxlcjxTb21lTWVzc2FnZT4KIHsgCiAJQFZpc2libGVGb3JUZXN0aW5nCiAJcHJvdGVjdGVkIGJvb2xlYW4gaXNBbGl2ZShJbmV0QWRkcmVzcyBhZGRyKSB7IHJldHVybiBGYWlsdXJlRGV0ZWN0b3IuaW5zdGFuY2UuaXNBbGl2ZShtc2cucGF5bG9hZC5vdGhlck5vZGUpOyB9CiAKIAlAVmlzaWJsZUZvclRlc3RpbmcKLQlwcm90ZWN0ZWQgdm9pZCBzdHJlYW1Tb21ldGhpbmQoSW5ldEFkZHJlc3MgdG8pIHsgbmV3IFN0cmVhbVBsYW4odG8pLnJlcXVlc3RSYW5nZXMoc29tZVJhbmdlcykuZXhlY3V0ZSgpOyB9CisJcHJvdGVjdGVkIHZvaWQgc3RyZWFtU29tZXRoaW5nKEluZXRBZGRyZXNzIHRvKSB7IG5ldyBTdHJlYW1QbGFuKHRvKS5yZXF1ZXN0UmFuZ2VzKHNvbWVSYW5nZXMpLmV4ZWN1dGUoKTsgfQogCiAJQFZpc2libGVGb3JUZXN0aW5nCiAJcHJvdGVjdGVkIHZvaWQgY29tcGFjdFNvbWV0aGluZyhDb2x1bW5GYW1pbHlTdG9yZSBjZnMgKSB7IENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnN1Ym1pdEJhY2tncm91bmQoKTsgfQpAQCAtNDA0LDcgKzQwNCw3IEBACiAJCXByb3RlY3RlZCBib29sZWFuIGlzQWxpdmUoSW5ldEFkZHJlc3MgYWRkcikgeyByZXR1cm4gYWxpdmU7IH0KIAkJCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBzdHJlYW1Tb21ldGhpbmQoSW5ldEFkZHJlc3MgdG8pIHsgc3RyZWFtQ2FsbGVkID0gdHJ1ZTsgfQorCQlwcm90ZWN0ZWQgdm9pZCBzdHJlYW1Tb21ldGhpbmcoSW5ldEFkZHJlc3MgdG8pIHsgc3RyZWFtQ2FsbGVkID0gdHJ1ZTsgfQogCiAJCUBPdmVycmlkZQogCQlwcm90ZWN0ZWQgdm9pZCBjb21wYWN0U29tZXRoaW5nKENvbHVtbkZhbWlseVN0b3JlIGNmcyApIHsgY29tcGFjdENhbGxlZCA9IHRydWU7IH0KZGlmZiAtLWdpdCBhL2Jpbi9jYXNzYW5kcmEuaW4uc2ggYi9iaW4vY2Fzc2FuZHJhLmluLnNoCmluZGV4IGRjYmQxMmQuLmRmYmI5NTkgMTAwNjQ0Ci0tLSBhL2Jpbi9jYXNzYW5kcmEuaW4uc2gKKysrIGIvYmluL2Nhc3NhbmRyYS5pbi5zaApAQCAtMTE0LDggKzExNCw5IEBACiBqYXZhX3Zlcl9vdXRwdXQ9YCIke0pBVkE6LWphdmF9IiAtdmVyc2lvbiAyPiYxYAoganZtdmVyPWBlY2hvICIkamF2YV92ZXJfb3V0cHV0IiB8IGdyZXAgJ1tvcGVuamRrfGphdmFdIHZlcnNpb24nIHwgYXdrIC1GJyInICdOUj09MSB7cHJpbnQgJDJ9JyB8IGN1dCAtZFwtIC1mMWAKIEpWTV9WRVJTSU9OPSR7anZtdmVyJV8qfQorc2hvcnQ9JChlY2hvICIke2p2bXZlcn0iIHwgY3V0IC1jMS0yKQogCi1KQVZBX1ZFUlNJT049MTEKK0pBVkFfVkVSU0lPTj0xNwogaWYgWyAiJEpWTV9WRVJTSU9OIiA9ICIxLjguMCIgXSAgOyB0aGVuCiAgICAgSlZNX1BBVENIX1ZFUlNJT049JHtqdm12ZXIjKl99CiAgICAgaWYgWyAiJEpWTV9WRVJTSU9OIiBcPCAiMS44IiBdIHx8IFsgIiRKVk1fVkVSU0lPTiIgXD4gIjEuOC4yIiBdIDsgdGhlbgpAQCAtMTMwLDYgKzEzMSwxMSBAQAogZWxpZiBbICIkSlZNX1ZFUlNJT04iIFw8ICIxMSIgXSA7IHRoZW4KICAgICBlY2hvICJDYXNzYW5kcmEgNC4wIHJlcXVpcmVzIGVpdGhlciBKYXZhIDggKHVwZGF0ZSAxNTEgb3IgbmV3ZXIpIG9yIEphdmEgMTEgKG9yIG5ld2VyKS4iCiAgICAgZXhpdCAxOworZWxpZiBbICIkc2hvcnQiID0gIjExIiBdICA7IHRoZW4KKyAgICAgSkFWQV9WRVJTSU9OPTExCitlbGlmIFsgIiRKVk1fVkVSU0lPTiIgXDwgIjE3IiBdIDsgdGhlbgorICAgIGVjaG8gIkNhc3NhbmRyYSA1LjAgcmVxdWlyZXMgSmF2YSAxMSBvciBKYXZhIDE3LiIKKyAgICBleGl0IDE7CiBmaQogCiBqdm09YGVjaG8gIiRqYXZhX3Zlcl9vdXRwdXQiIHwgZ3JlcCAtQSAxICdbb3Blbmpka3xqYXZhXSB2ZXJzaW9uJyB8IGF3ayAnTlI9PTIge3ByaW50ICQxfSdgCkBAIC0xNTMsNyArMTU5LDkgQEAKIAogIyBSZWFkIHVzZXItZGVmaW5lZCBKVk0gb3B0aW9ucyBmcm9tIGp2bS1zZXJ2ZXIub3B0aW9ucyBmaWxlCiBKVk1fT1BUU19GSUxFPSRDQVNTQU5EUkFfQ09ORi9qdm0ke2p2bW9wdGlvbnNfdmFyaWFudDotLWNsaWVudHN9Lm9wdGlvbnMKLWlmIFsgJEpBVkFfVkVSU0lPTiAtZ2UgMTEgXSA7IHRoZW4KK2lmIFsgJEpBVkFfVkVSU0lPTiAtZ2UgMTcgXSA7IHRoZW4KKyAgICBKVk1fREVQX09QVFNfRklMRT0kQ0FTU0FORFJBX0NPTkYvanZtMTcke2p2bW9wdGlvbnNfdmFyaWFudDotLWNsaWVudHN9Lm9wdGlvbnMKK2VsaWYgWyAkSkFWQV9WRVJTSU9OIC1nZSAxMSBdIDsgdGhlbgogICAgIEpWTV9ERVBfT1BUU19GSUxFPSRDQVNTQU5EUkFfQ09ORi9qdm0xMSR7anZtb3B0aW9uc192YXJpYW50Oi0tY2xpZW50c30ub3B0aW9ucwogZWxzZQogICAgIEpWTV9ERVBfT1BUU19GSUxFPSRDQVNTQU5EUkFfQ09ORi9qdm04JHtqdm1vcHRpb25zX3ZhcmlhbnQ6LS1jbGllbnRzfS5vcHRpb25zCmRpZmYgLS1naXQgYS9iaW4vY3Fsc2gucHkgYi9iaW4vY3Fsc2gucHkKaW5kZXggNmMxZTdiZC4uMGIwZWUzOSAxMDA3NTUKLS0tIGEvYmluL2NxbHNoLnB5CisrKyBiL2Jpbi9jcWxzaC5weQpAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vcHl0aG9uMworIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwogCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCkBAIC0xNiwyNiArMTYsMTAgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotaW1wb3J0IGNtZAotaW1wb3J0IGNvZGVjcwotaW1wb3J0IGNvbmZpZ3BhcnNlcgotaW1wb3J0IGNzdgotaW1wb3J0IGVycm5vCi1pbXBvcnQgZ2V0cGFzcwotaW1wb3J0IG9wdHBhcnNlCiBpbXBvcnQgb3MKIGltcG9ydCBwbGF0Zm9ybQotaW1wb3J0IHJlCi1pbXBvcnQgc3RhdAotaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCBzeXMKLWltcG9ydCB0cmFjZWJhY2sKLWltcG9ydCB3YXJuaW5ncwotaW1wb3J0IHdlYmJyb3dzZXIKLWZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKIGZyb20gZ2xvYiBpbXBvcnQgZ2xvYgotZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KLWZyb20gdXVpZCBpbXBvcnQgVVVJRAogCiBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDYpOgogICAgIHN5cy5leGl0KCJcbmNxbHNoIHJlcXVpcmVzIFB5dGhvbiAzLjYrXG4iKQpAQCAtNDQsNTAgKzI4LDkgQEAKIGlmIHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLnN0YXJ0c3dpdGgoJ0p5dGhvbicpOgogICAgIHN5cy5leGl0KCJcbkNRTCBTaGVsbCBkb2VzIG5vdCBydW4gb24gSnl0aG9uXG4iKQogCi1VVEY4ID0gJ3V0Zi04JwotCi1kZXNjcmlwdGlvbiA9ICJDUUwgU2hlbGwgZm9yIEFwYWNoZSBDYXNzYW5kcmEiCi12ZXJzaW9uID0gIjYuMS4wIgotCi1yZWFkbGluZSA9IE5vbmUKLXRyeToKLSAgICAjIGNoZWNrIGlmIHR0eSBmaXJzdCwgY2F1c2UgcmVhZGxpbmUgZG9lc24ndCBjaGVjaywgYW5kIG9ubHkgY2FyZXMKLSAgICAjIGFib3V0ICRURVJNLiB3ZSBkb24ndCB3YW50IHRoZSBmdW5reSBlc2NhcGUgY29kZSBzdHVmZiB0byBiZQotICAgICMgb3V0cHV0IGlmIG5vdCBhIHR0eS4KLSAgICBpZiBzeXMuc3RkaW4uaXNhdHR5KCk6Ci0gICAgICAgIGltcG9ydCByZWFkbGluZQotZXhjZXB0IEltcG9ydEVycm9yOgotICAgIHBhc3MKLQogQ1FMX0xJQl9QUkVGSVggPSAnY2Fzc2FuZHJhLWRyaXZlci1pbnRlcm5hbC1vbmx5LScKIAogQ0FTU0FORFJBX1BBVEggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKSwgJy4uJykKLUNBU1NBTkRSQV9DUUxfSFRNTF9GQUxMQkFDSyA9ICdodHRwczovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2RvYy9sYXRlc3QvY3FsL2luZGV4Lmh0bWwnCi0KLSMgZGVmYXVsdCBsb2NhdGlvbiBvZiBsb2NhbCBDUUwuaHRtbAotaWYgb3MucGF0aC5leGlzdHMoQ0FTU0FORFJBX1BBVEggKyAnL2RvYy9jcWwzL0NRTC5odG1sJyk6Ci0gICAgIyBkZWZhdWx0IGxvY2F0aW9uIG9mIGxvY2FsIENRTC5odG1sCi0gICAgQ0FTU0FORFJBX0NRTF9IVE1MID0gJ2ZpbGU6Ly8nICsgQ0FTU0FORFJBX1BBVEggKyAnL2RvYy9jcWwzL0NRTC5odG1sJwotZWxpZiBvcy5wYXRoLmV4aXN0cygnL3Vzci9zaGFyZS9kb2MvY2Fzc2FuZHJhL0NRTC5odG1sJyk6Ci0gICAgIyBmYWxsYmFjayB0byBwYWNrYWdlIGZpbGUKLSAgICBDQVNTQU5EUkFfQ1FMX0hUTUwgPSAnZmlsZTovLy91c3Ivc2hhcmUvZG9jL2Nhc3NhbmRyYS9DUUwuaHRtbCcKLWVsc2U6Ci0gICAgIyBmYWxsYmFjayB0byBvbmxpbmUgdmVyc2lvbgotICAgIENBU1NBTkRSQV9DUUxfSFRNTCA9IENBU1NBTkRSQV9DUUxfSFRNTF9GQUxMQkFDSwotCi0jIE9uIExpbnV4LCB0aGUgUHl0aG9uIHdlYmJyb3dzZXIgbW9kdWxlIHVzZXMgdGhlICd4ZGctb3BlbicgZXhlY3V0YWJsZQotIyB0byBvcGVuIGEgZmlsZS9VUkwuIEJ1dCB0aGF0IG9ubHkgd29ya3MsIGlmIHRoZSBjdXJyZW50IHNlc3Npb24gaGFzIGJlZW4KLSMgb3BlbmVkIGZyb20gX3dpdGhpbl8gYSBkZXNrdG9wIGVudmlyb25tZW50LiBJLmUuICd4ZGctb3Blbicgd2lsbCBmYWlsLAotIyBpZiB0aGUgc2Vzc2lvbidzIGJlZW4gb3BlbmVkIHZpYSBzc2ggdG8gYSByZW1vdGUgYm94LgotIwotdHJ5OgotICAgIHdlYmJyb3dzZXIucmVnaXN0ZXJfc3RhbmRhcmRfYnJvd3NlcnMoKSAgIyByZWdpc3RyYXRpb24gaXMgb3RoZXJ3aXNlIGxhenkgaW4gUHl0aG9uMwotZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgIHBhc3MKLWlmIHdlYmJyb3dzZXIuX3RyeW9yZGVyIGFuZCB3ZWJicm93c2VyLl90cnlvcmRlclswXSA9PSAneGRnLW9wZW4nIGFuZCBvcy5lbnZpcm9uLmdldCgnWERHX0RBVEFfRElSUycsICcnKSA9PSAnJzoKLSAgICAjIG9ubHkgb24gTGludXggKHNvbWUgT1Mgd2l0aCB4ZGctb3BlbikKLSAgICB3ZWJicm93c2VyLl90cnlvcmRlci5yZW1vdmUoJ3hkZy1vcGVuJykKLSAgICB3ZWJicm93c2VyLl90cnlvcmRlci5hcHBlbmQoJ3hkZy1vcGVuJykKIAogIyB1c2UgYnVuZGxlZCBsaWIgZm9yIHB5dGhvbi1jcWwgaWYgYXZhaWxhYmxlLiBpZiB0aGVyZQogIyBpcyBhIC4uL2xpYiBkaXIsIHVzZSBidW5kbGVkIGxpYnMgdGhlcmUgcHJlZmVyZW50aWFsbHkuCkBAIC0xMTMsMTQgKzU2LDEzIEBACiAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihjcWxfemlwLCAnY2Fzc2FuZHJhLWRyaXZlci0nICsgdmVyKSkKIAogIyB0aGUgZHJpdmVyIG5lZWRzIGRlcGVuZGVuY2llcwotdGhpcmRfcGFydGllcyA9ICgnc2l4LScsICdwdXJlX3Nhc2wtJykKK3RoaXJkX3BhcnRpZXMgPSAoJ3NpeC0nLCAncHVyZV9zYXNsLScsICd3Y3dpZHRoLScpCiAKIGZvciBsaWIgaW4gdGhpcmRfcGFydGllczoKICAgICBsaWJfemlwID0gZmluZF96aXAobGliKQogICAgIGlmIGxpYl96aXA6CiAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBsaWJfemlwKQogCi13YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgciIuKmJsaXN0LioiKQogdHJ5OgogICAgIGltcG9ydCBjYXNzYW5kcmEKIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBlOgpAQCAtMTMwLDE0ICs3Miw2IEBACiAgICAgICAgICAgICAgJ01vZHVsZSBsb2FkIHBhdGg6ICVyXG5cbicKICAgICAgICAgICAgICAnRXJyb3I6ICVzXG4nICUgKHN5cy5leGVjdXRhYmxlLCBzeXMucGF0aCwgZSkpCiAKLWZyb20gY2Fzc2FuZHJhLmF1dGggaW1wb3J0IFBsYWluVGV4dEF1dGhQcm92aWRlcgotZnJvbSBjYXNzYW5kcmEuY2x1c3RlciBpbXBvcnQgQ2x1c3RlcgotZnJvbSBjYXNzYW5kcmEuY3FsdHlwZXMgaW1wb3J0IGNxbF90eXBlbmFtZQotZnJvbSBjYXNzYW5kcmEubWFyc2hhbCBpbXBvcnQgaW50NjRfdW5wYWNrCi1mcm9tIGNhc3NhbmRyYS5tZXRhZGF0YSBpbXBvcnQgKENvbHVtbk1ldGFkYXRhLCBLZXlzcGFjZU1ldGFkYXRhLCBUYWJsZU1ldGFkYXRhKQotZnJvbSBjYXNzYW5kcmEucG9saWNpZXMgaW1wb3J0IFdoaXRlTGlzdFJvdW5kUm9iaW5Qb2xpY3kKLWZyb20gY2Fzc2FuZHJhLnF1ZXJ5IGltcG9ydCBTaW1wbGVTdGF0ZW1lbnQsIG9yZGVyZWRfZGljdF9mYWN0b3J5LCBUcmFjZVVuYXZhaWxhYmxlCi1mcm9tIGNhc3NhbmRyYS51dGlsIGltcG9ydCBkYXRldGltZV9mcm9tX3RpbWVzdGFtcAogCiAjIGNxbHNoIHNob3VsZCBydW4gY29ycmVjdGx5IHdoZW4gcnVuIG91dCBvZiBhIENhc3NhbmRyYSBzb3VyY2UgdHJlZSwKICMgb3V0IG9mIGFuIHVucGFja2VkIENhc3NhbmRyYSB0YXJiYWxsLCBhbmQgYWZ0ZXIgYSBwcm9wZXIgcGFja2FnZSBpbnN0YWxsLgpAQCAtMTQ1LDIyNDUgKzc5LDEwIEBACiBpZiBvcy5wYXRoLmlzZGlyKGNxbHNobGliZGlyKToKICAgICBzeXMucGF0aC5pbnNlcnQoMCwgY3Fsc2hsaWJkaXIpCiAKLWZyb20gY3Fsc2hsaWIgaW1wb3J0IGNxbDNoYW5kbGluZywgcHlsZXhvdHJvbiwgc3NsaGFuZGxpbmcsIGNxbHNoaGFuZGxpbmcsIGF1dGhwcm92aWRlcmhhbmRsaW5nCi1mcm9tIGNxbHNobGliLmNvcHl1dGlsIGltcG9ydCBFeHBvcnRUYXNrLCBJbXBvcnRUYXNrCi1mcm9tIGNxbHNobGliLmRpc3BsYXlpbmcgaW1wb3J0IChBTlNJX1JFU0VULCBCTFVFLCBDT0xVTU5fTkFNRV9DT0xPUlMsIENZQU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUQsIFdISVRFLCBGb3JtYXR0ZWRWYWx1ZSwgY29sb3JtZSkKLWZyb20gY3Fsc2hsaWIuZm9ybWF0dGluZyBpbXBvcnQgKERFRkFVTFRfREFURV9GT1JNQVQsIERFRkFVTFRfTkFOT1RJTUVfRk9STUFULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9USU1FU1RBTVBfRk9STUFULCBDcWxUeXBlLCBEYXRlVGltZUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9ieV90eXBlKQotZnJvbSBjcWxzaGxpYi50cmFjaW5nIGltcG9ydCBwcmludF90cmFjZSwgcHJpbnRfdHJhY2Vfc2Vzc2lvbgotZnJvbSBjcWxzaGxpYi51dGlsIGltcG9ydCBnZXRfZmlsZV9lbmNvZGluZ19ib21zaXplCi1mcm9tIGNxbHNobGliLnV0aWwgaW1wb3J0IGlzX2ZpbGVfc2VjdXJlCi0KLQotREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMScKLURFRkFVTFRfUE9SVCA9IDkwNDIKLURFRkFVTFRfU1NMID0gRmFsc2UKLURFRkFVTFRfQ09OTkVDVF9USU1FT1VUX1NFQ09ORFMgPSA1Ci1ERUZBVUxUX1JFUVVFU1RfVElNRU9VVF9TRUNPTkRTID0gMTAKLQotREVGQVVMVF9GTE9BVF9QUkVDSVNJT04gPSA1Ci1ERUZBVUxUX0RPVUJMRV9QUkVDSVNJT04gPSA1Ci1ERUZBVUxUX01BWF9UUkFDRV9XQUlUID0gMTAKLQotaWYgcmVhZGxpbmUgaXMgbm90IE5vbmUgYW5kIHJlYWRsaW5lLl9fZG9jX18gaXMgbm90IE5vbmUgYW5kICdsaWJlZGl0JyBpbiByZWFkbGluZS5fX2RvY19fOgotICAgIERFRkFVTFRfQ09NUExFVEVLRVkgPSAnXHQnCi1lbHNlOgotICAgIERFRkFVTFRfQ09NUExFVEVLRVkgPSAndGFiJwotCi1jcWxkb2NzID0gTm9uZQotY3FscnVsZXNldCA9IE5vbmUKLQotZXBpbG9nID0gIiIiQ29ubmVjdHMgdG8gJShERUZBVUxUX0hPU1QpczolKERFRkFVTFRfUE9SVClkIGJ5IGRlZmF1bHQuIFRoZXNlCi1kZWZhdWx0cyBjYW4gYmUgY2hhbmdlZCBieSBzZXR0aW5nICRDUUxTSF9IT1NUIGFuZC9vciAkQ1FMU0hfUE9SVC4gV2hlbiBhCi1ob3N0IChhbmQgb3B0aW9uYWwgcG9ydCBudW1iZXIpIGFyZSBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGV5IHRha2UKLXByZWNlZGVuY2Ugb3ZlciBhbnkgZGVmYXVsdHMuIiIiICUgZ2xvYmFscygpCi0KLXBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcihkZXNjcmlwdGlvbj1kZXNjcmlwdGlvbiwgZXBpbG9nPWVwaWxvZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZT0iVXNhZ2U6ICVwcm9nIFtvcHRpb25zXSBbaG9zdCBbcG9ydF1dIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPSdjcWxzaCAnICsgdmVyc2lvbikKLXBhcnNlci5hZGRfb3B0aW9uKCItQyIsICItLWNvbG9yIiwgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0nY29sb3InLAotICAgICAgICAgICAgICAgICAgaGVscD0nQWx3YXlzIHVzZSBjb2xvciBvdXRwdXQnKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tbm8tY29sb3IiLCBhY3Rpb249J3N0b3JlX2ZhbHNlJywgZGVzdD0nY29sb3InLAotICAgICAgICAgICAgICAgICAgaGVscD0nTmV2ZXIgdXNlIGNvbG9yIG91dHB1dCcpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1icm93c2VyIiwgZGVzdD0nYnJvd3NlcicsIGhlbHA9IiIiVGhlIGJyb3dzZXIgdG8gdXNlIHRvIGRpc3BsYXkgQ1FMIGhlbHAsIHdoZXJlIEJST1dTRVIgY2FuIGJlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gb25lIG9mIHRoZSBzdXBwb3J0ZWQgYnJvd3NlcnMgaW4gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L3dlYmJyb3dzZXIuaHRtbC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJyb3dzZXIgcGF0aCBmb2xsb3dlZCBieSAlcywgZXhhbXBsZTogL3Vzci9iaW4vZ29vZ2xlLWNocm9tZS1zdGFibGUgJXMiIiIpCi1wYXJzZXIuYWRkX29wdGlvbignLS1zc2wnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdVc2UgU1NMJywgZGVmYXVsdD1GYWxzZSkKLXBhcnNlci5hZGRfb3B0aW9uKCItdSIsICItLXVzZXJuYW1lIiwgaGVscD0iQXV0aGVudGljYXRlIGFzIHVzZXIuIikKLXBhcnNlci5hZGRfb3B0aW9uKCItcCIsICItLXBhc3N3b3JkIiwgaGVscD0iQXV0aGVudGljYXRlIHVzaW5nIHBhc3N3b3JkLiIpCi1wYXJzZXIuYWRkX29wdGlvbignLWsnLCAnLS1rZXlzcGFjZScsIGhlbHA9J0F1dGhlbnRpY2F0ZSB0byB0aGUgZ2l2ZW4ga2V5c3BhY2UuJykKLXBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLCBoZWxwPSJFeGVjdXRlIGNvbW1hbmRzIGZyb20gRklMRSwgdGhlbiBleGl0IikKLXBhcnNlci5hZGRfb3B0aW9uKCctLWRlYnVnJywgYWN0aW9uPSdzdG9yZV90cnVlJywKLSAgICAgICAgICAgICAgICAgIGhlbHA9J1Nob3cgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24nKQotcGFyc2VyLmFkZF9vcHRpb24oJy0tY292ZXJhZ2UnLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgaGVscD0nQ29sbGVjdCBjb3ZlcmFnZSBkYXRhJykKLXBhcnNlci5hZGRfb3B0aW9uKCItLWVuY29kaW5nIiwgaGVscD0iU3BlY2lmeSBhIG5vbi1kZWZhdWx0IGVuY29kaW5nIGZvciBvdXRwdXQuIgotICAgICAgICAgICAgICAgICAgKyAiIChEZWZhdWx0OiAlcykiICUgKFVURjgsKSkKLXBhcnNlci5hZGRfb3B0aW9uKCItLWNxbHNocmMiLCBoZWxwPSJTcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGNxbHNocmMgZmlsZSBsb2NhdGlvbi4iKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tY3JlZGVudGlhbHMiLCBoZWxwPSJTcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGNyZWRlbnRpYWxzIGZpbGUgbG9jYXRpb24uIikKLXBhcnNlci5hZGRfb3B0aW9uKCctLWNxbHZlcnNpb24nLCBkZWZhdWx0PU5vbmUsCi0gICAgICAgICAgICAgICAgICBoZWxwPSdTcGVjaWZ5IGEgcGFydGljdWxhciBDUUwgdmVyc2lvbiwgJwotICAgICAgICAgICAgICAgICAgICAgICAnYnkgZGVmYXVsdCB0aGUgaGlnaGVzdCB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIHdpbGwgYmUgdXNlZC4nCi0gICAgICAgICAgICAgICAgICAgICAgICcgRXhhbXBsZXM6ICIzLjAuMyIsICIzLjEuMCInKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tcHJvdG9jb2wtdmVyc2lvbiIsIHR5cGU9ImludCIsIGRlZmF1bHQ9Tm9uZSwKLSAgICAgICAgICAgICAgICAgIGhlbHA9J1NwZWNpZnkgYSBzcGVjaWZpYyBwcm90Y29sIHZlcnNpb24gb3RoZXJ3aXNlIHRoZSBjbGllbnQgd2lsbCBkZWZhdWx0IGFuZCBkb3duZ3JhZGUgYXMgbmVjZXNzYXJ5JykKLQotcGFyc2VyLmFkZF9vcHRpb24oIi1lIiwgIi0tZXhlY3V0ZSIsIGhlbHA9J0V4ZWN1dGUgdGhlIHN0YXRlbWVudCBhbmQgcXVpdC4nKQotcGFyc2VyLmFkZF9vcHRpb24oIi0tY29ubmVjdC10aW1lb3V0IiwgZGVmYXVsdD1ERUZBVUxUX0NPTk5FQ1RfVElNRU9VVF9TRUNPTkRTLCBkZXN0PSdjb25uZWN0X3RpbWVvdXQnLAotICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSB0aGUgY29ubmVjdGlvbiB0aW1lb3V0IGluIHNlY29uZHMgKGRlZmF1bHQ6ICVkZWZhdWx0IHNlY29uZHMpLicpCi1wYXJzZXIuYWRkX29wdGlvbigiLS1yZXF1ZXN0LXRpbWVvdXQiLCBkZWZhdWx0PURFRkFVTFRfUkVRVUVTVF9USU1FT1VUX1NFQ09ORFMsIGRlc3Q9J3JlcXVlc3RfdGltZW91dCcsCi0gICAgICAgICAgICAgICAgICBoZWxwPSdTcGVjaWZ5IHRoZSBkZWZhdWx0IHJlcXVlc3QgdGltZW91dCBpbiBzZWNvbmRzIChkZWZhdWx0OiAlZGVmYXVsdCBzZWNvbmRzKS4nKQotcGFyc2VyLmFkZF9vcHRpb24oIi10IiwgIi0tdHR5IiwgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVzdD0ndHR5JywKLSAgICAgICAgICAgICAgICAgIGhlbHA9J0ZvcmNlIHR0eSBtb2RlIChjb21tYW5kIHByb21wdCkuJykKLXBhcnNlci5hZGRfb3B0aW9uKCctdicsIGFjdGlvbj0idmVyc2lvbiIsIGhlbHA9J1ByaW50IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgY3Fsc2guJykKLQotIyBUaGlzIGlzIGEgaGlkZGVuIG9wdGlvbiB0byBzdXBwcmVzcyB0aGUgd2FybmluZyB3aGVuIHRoZSAtcC8tLXBhc3N3b3JkIGNvbW1hbmQgbGluZSBvcHRpb24gaXMgdXNlZC4KLSMgUG93ZXIgdXNlcnMgbWF5IHVzZSB0aGlzIG9wdGlvbiBpZiB0aGV5IGtub3cgbm8gb3RoZXIgcGVvcGxlIGhhcyBhY2Nlc3MgdG8gdGhlIHN5c3RlbSB3aGVyZSBjcWxzaCBpcyBydW4gb3IgZG9uJ3QgY2FyZSBhYm91dCBzZWN1cml0eS4KLSMgVXNlIG9mIHRoaXMgb3B0aW9uIGluIHNjcmlwdGluZyBpcyBkaXNjb3VyYWdlZC4gUGxlYXNlIHVzZSBhICh0ZW1wb3JhcnkpIGNyZWRlbnRpYWxzIGZpbGUgd2hlcmUgcG9zc2libGUuCi0jIFRoZSBDYXNzYW5kcmEgZGlzdHJpYnV0ZWQgdGVzdHMgKGR0ZXN0cykgYWxzbyB1c2UgdGhpcyBvcHRpb24gaW4gc29tZSB0ZXN0cyB3aGVuIGEgd2VsbC1rbm93biBwYXNzd29yZCBpcyBzdXBwbGllZCB2aWEgdGhlIGNvbW1hbmQgbGluZS4KLXBhcnNlci5hZGRfb3B0aW9uKCItLWluc2VjdXJlLXBhc3N3b3JkLXdpdGhvdXQtd2FybmluZyIsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J2luc2VjdXJlX3Bhc3N3b3JkX3dpdGhvdXRfd2FybmluZycsCi0gICAgICAgICAgICAgICAgICBoZWxwPW9wdHBhcnNlLlNVUFBSRVNTX0hFTFApCi0KLW9wdF92YWx1ZXMgPSBvcHRwYXJzZS5WYWx1ZXMoKQotKG9wdGlvbnMsIGFyZ3VtZW50cykgPSBwYXJzZXIucGFyc2VfYXJncyhzeXMuYXJndlsxOl0sIHZhbHVlcz1vcHRfdmFsdWVzKQotCi0jIEJFR0lOIGhpc3RvcnkvY29uZmlnIGRlZmluaXRpb24KLQotCi1kZWYgbWtkaXJwKHBhdGgpOgotICAgICIiIkNyZWF0ZXMgYWxsIHBhcmVudCBkaXJlY3RvcmllcyB1cCB0byBwYXRoIHBhcmFtZXRlciBvciBmYWlscyB3aGVuIHBhdGggZXhpc3RzLCBidXQgaXQgaXMgbm90IGEgZGlyZWN0b3J5LiIiIgotCi0gICAgdHJ5OgotICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQotICAgIGV4Y2VwdCBPU0Vycm9yOgotICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYXRoKToKLSAgICAgICAgICAgIHJhaXNlCi0KLQotZGVmIHJlc29sdmVfY3FsX2hpc3RvcnlfZmlsZSgpOgotICAgIGRlZmF1bHRfY3FsX2hpc3RvcnkgPSBvcy5wYXRoLmV4cGFuZHVzZXIob3MucGF0aC5qb2luKCd+JywgJy5jYXNzYW5kcmEnLCAnY3Fsc2hfaGlzdG9yeScpKQotICAgIGlmICdDUUxfSElTVE9SWScgaW4gb3MuZW52aXJvbjoKLSAgICAgICAgcmV0dXJuIG9zLmVudmlyb25bJ0NRTF9ISVNUT1JZJ10KLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gZGVmYXVsdF9jcWxfaGlzdG9yeQotCi0KLUhJU1RPUlkgPSByZXNvbHZlX2NxbF9oaXN0b3J5X2ZpbGUoKQotSElTVE9SWV9ESVIgPSBvcy5wYXRoLmRpcm5hbWUoSElTVE9SWSkKLQotdHJ5OgotICAgIG1rZGlycChISVNUT1JZX0RJUikKLWV4Y2VwdCBPU0Vycm9yOgotICAgIHByaW50KCdcbldhcm5pbmc6IENhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IGF0IGAlc2AuIENvbW1hbmQgaGlzdG9yeSB3aWxsIG5vdCBiZSBzYXZlZC4gUGxlYXNlIGNoZWNrIHdoYXQgd2FzIHRoZSBlbnZpcm9ubWVudCBwcm9wZXJ0eSBDUUxfSElTVE9SWSBzZXQgdG8uXG4nICUgSElTVE9SWV9ESVIpCi0KLURFRkFVTFRfQ1FMU0hSQyA9IG9zLnBhdGguZXhwYW5kdXNlcihvcy5wYXRoLmpvaW4oJ34nLCAnLmNhc3NhbmRyYScsICdjcWxzaHJjJykpCi0KLWlmIGhhc2F0dHIob3B0aW9ucywgJ2NxbHNocmMnKToKLSAgICBDT05GSUdfRklMRSA9IG9zLnBhdGguZXhwYW5kdXNlcihvcHRpb25zLmNxbHNocmMpCi0gICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKENPTkZJR19GSUxFKToKLSAgICAgICAgcHJpbnQoJ1xuV2FybmluZzogU3BlY2lmaWVkIGNxbHNocmMgbG9jYXRpb24gYCVzYCBkb2VzIG5vdCBleGlzdC4gIFVzaW5nIGAlc2AgaW5zdGVhZC5cbicgJSAoQ09ORklHX0ZJTEUsIERFRkFVTFRfQ1FMU0hSQykpCi0gICAgICAgIENPTkZJR19GSUxFID0gREVGQVVMVF9DUUxTSFJDCi1lbHNlOgotICAgIENPTkZJR19GSUxFID0gREVGQVVMVF9DUUxTSFJDCi0KLUNRTF9ESVIgPSBvcy5wYXRoLmRpcm5hbWUoQ09ORklHX0ZJTEUpCi0KLUNRTF9FUlJPUlMgPSAoCi0gICAgY2Fzc2FuZHJhLkFscmVhZHlFeGlzdHMsIGNhc3NhbmRyYS5BdXRoZW50aWNhdGlvbkZhaWxlZCwgY2Fzc2FuZHJhLkNvb3JkaW5hdGlvbkZhaWx1cmUsCi0gICAgY2Fzc2FuZHJhLkludmFsaWRSZXF1ZXN0LCBjYXNzYW5kcmEuVGltZW91dCwgY2Fzc2FuZHJhLlVuYXV0aG9yaXplZCwgY2Fzc2FuZHJhLk9wZXJhdGlvblRpbWVkT3V0LAotICAgIGNhc3NhbmRyYS5jbHVzdGVyLk5vSG9zdEF2YWlsYWJsZSwKLSAgICBjYXNzYW5kcmEuY29ubmVjdGlvbi5Db25uZWN0aW9uQnVzeSwgY2Fzc2FuZHJhLmNvbm5lY3Rpb24uUHJvdG9jb2xFcnJvciwgY2Fzc2FuZHJhLmNvbm5lY3Rpb24uQ29ubmVjdGlvbkV4Y2VwdGlvbiwKLSAgICBjYXNzYW5kcmEucHJvdG9jb2wuRXJyb3JNZXNzYWdlLCBjYXNzYW5kcmEucHJvdG9jb2wuSW50ZXJuYWxFcnJvciwgY2Fzc2FuZHJhLnF1ZXJ5LlRyYWNlVW5hdmFpbGFibGUKLSkKLQotZGVidWdfY29tcGxldGlvbiA9IGJvb2wob3MuZW52aXJvbi5nZXQoJ0NRTFNIX0RFQlVHX0NPTVBMRVRJT04nLCAnJykgPT0gJ1lFUycpCi0KLQotY2xhc3MgTm9LZXlzcGFjZUVycm9yKEV4Y2VwdGlvbik6Ci0gICAgcGFzcwotCi0KLWNsYXNzIEtleXNwYWNlTm90Rm91bmQoRXhjZXB0aW9uKToKLSAgICBwYXNzCi0KLQotY2xhc3MgQ29sdW1uRmFtaWx5Tm90Rm91bmQoRXhjZXB0aW9uKToKLSAgICBwYXNzCi0KLQotY2xhc3MgSW5kZXhOb3RGb3VuZChFeGNlcHRpb24pOgotICAgIHBhc3MKLQotCi1jbGFzcyBNYXRlcmlhbGl6ZWRWaWV3Tm90Rm91bmQoRXhjZXB0aW9uKToKLSAgICBwYXNzCi0KLQotY2xhc3MgT2JqZWN0Tm90Rm91bmQoRXhjZXB0aW9uKToKLSAgICBwYXNzCi0KLQotY2xhc3MgVmVyc2lvbk5vdFN1cHBvcnRlZChFeGNlcHRpb24pOgotICAgIHBhc3MKLQotCi1jbGFzcyBVc2VyVHlwZU5vdEZvdW5kKEV4Y2VwdGlvbik6Ci0gICAgcGFzcwotCi0KLWNsYXNzIEZ1bmN0aW9uTm90Rm91bmQoRXhjZXB0aW9uKToKLSAgICBwYXNzCi0KLQotY2xhc3MgQWdncmVnYXRlTm90Rm91bmQoRXhjZXB0aW9uKToKLSAgICBwYXNzCi0KLQotY2xhc3MgRGVjb2RlRXJyb3IoRXhjZXB0aW9uKToKLSAgICB2ZXJiID0gJ2RlY29kZScKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aGVieXRlcywgZXJyLCBjb2xuYW1lPU5vbmUpOgotICAgICAgICBzZWxmLnRoZWJ5dGVzID0gdGhlYnl0ZXMKLSAgICAgICAgc2VsZi5lcnIgPSBlcnIKLSAgICAgICAgc2VsZi5jb2xuYW1lID0gY29sbmFtZQotCi0gICAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgICAgIHJldHVybiBzdHIoc2VsZi50aGVieXRlcykKLQotICAgIGRlZiBtZXNzYWdlKHNlbGYpOgotICAgICAgICB3aGF0ID0gJ3ZhbHVlICVyJyAlIChzZWxmLnRoZWJ5dGVzLCkKLSAgICAgICAgaWYgc2VsZi5jb2xuYW1lIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgd2hhdCA9ICd2YWx1ZSAlciAoZm9yIGNvbHVtbiAlciknICUgKHNlbGYudGhlYnl0ZXMsIHNlbGYuY29sbmFtZSkKLSAgICAgICAgcmV0dXJuICdGYWlsZWQgdG8gJXMgJXMgOiAlcycgXAotICAgICAgICAgICAgICAgJSAoc2VsZi52ZXJiLCB3aGF0LCBzZWxmLmVycikKLQotICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICAgICAgcmV0dXJuICc8JXMgJXM+JyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5tZXNzYWdlKCkpCi0KLQotZGVmIG1heWJlX2Vuc3VyZV90ZXh0KHZhbCk6Ci0gICAgcmV0dXJuIHN0cih2YWwpIGlmIHZhbCBlbHNlIHZhbAotCi0KLWNsYXNzIEZvcm1hdEVycm9yKERlY29kZUVycm9yKToKLSAgICB2ZXJiID0gJ2Zvcm1hdCcKLQotCi1kZWYgZnVsbF9jcWxfdmVyc2lvbih2ZXIpOgotICAgIHdoaWxlIHZlci5jb3VudCgnLicpIDwgMjoKLSAgICAgICAgdmVyICs9ICcuMCcKLSAgICB2ZXJfcGFydHMgPSB2ZXIuc3BsaXQoJy0nLCAxKSArIFsnJ10KLSAgICB2ZXJ0dXBsZSA9IHR1cGxlKGxpc3QobWFwKGludCwgdmVyX3BhcnRzWzBdLnNwbGl0KCcuJykpKSArIFt2ZXJfcGFydHNbMV1dKQotICAgIHJldHVybiB2ZXIsIHZlcnR1cGxlCi0KLQotZGVmIGZvcm1hdF92YWx1ZSh2YWwsIGNxbHR5cGUsIGVuY29kaW5nLCBhZGRjb2xvcj1GYWxzZSwgZGF0ZV90aW1lX2Zvcm1hdD1Ob25lLAotICAgICAgICAgICAgICAgICBmbG9hdF9wcmVjaXNpb249Tm9uZSwgY29sb3JtYXA9Tm9uZSwgbnVsbHZhbD1Ob25lKToKLSAgICBpZiBpc2luc3RhbmNlKHZhbCwgRGVjb2RlRXJyb3IpOgotICAgICAgICBpZiBhZGRjb2xvcjoKLSAgICAgICAgICAgIHJldHVybiBjb2xvcm1lKHJlcHIodmFsLnRoZWJ5dGVzKSwgY29sb3JtYXAsICdlcnJvcicpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gRm9ybWF0dGVkVmFsdWUocmVwcih2YWwudGhlYnl0ZXMpKQotICAgIHJldHVybiBmb3JtYXRfYnlfdHlwZSh2YWwsIGNxbHR5cGU9Y3FsdHlwZSwgZW5jb2Rpbmc9ZW5jb2RpbmcsIGNvbG9ybWFwPWNvbG9ybWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRjb2xvcj1hZGRjb2xvciwgbnVsbHZhbD1udWxsdmFsLCBkYXRlX3RpbWVfZm9ybWF0PWRhdGVfdGltZV9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0X3ByZWNpc2lvbj1mbG9hdF9wcmVjaXNpb24pCi0KLQotZGVmIHNob3dfd2FybmluZ193aXRob3V0X3F1b3RpbmdfbGluZShtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZT1Ob25lLCBsaW5lPU5vbmUpOgotICAgIGlmIGZpbGUgaXMgTm9uZToKLSAgICAgICAgZmlsZSA9IHN5cy5zdGRlcnIKLSAgICB0cnk6Ci0gICAgICAgIGZpbGUud3JpdGUod2FybmluZ3MuZm9ybWF0d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbGluZT0nJykpCi0gICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgIHBhc3MKLQotCi13YXJuaW5ncy5zaG93d2FybmluZyA9IHNob3dfd2FybmluZ193aXRob3V0X3F1b3RpbmdfbGluZQotd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2Fsd2F5cycsIGNhdGVnb3J5PWNxbDNoYW5kbGluZy5VbmV4cGVjdGVkVGFibGVTdHJ1Y3R1cmUpCi0KLQotZGVmIGluc2VydF9kcml2ZXJfaG9va3MoKToKLQotICAgIGNsYXNzIERhdGVPdmVyRmxvd1dhcm5pbmcoUnVudGltZVdhcm5pbmcpOgotICAgICAgICBwYXNzCi0KLSAgICAjIE5hdGl2ZSBkYXRldGltZSB0eXBlcyBibG93IHVwIG91dHNpZGUgb2YgZGF0ZXRpbWUuW01JTnxNQVhdX1lFQVIuIFdlIHdpbGwgZmFsbCBiYWNrIHRvIGFuIGludCB0aW1lc3RhbXAKLSAgICBkZWYgZGVzZXJpYWxpemVfZGF0ZV9mYWxsYmFja19pbnQoYnl0cywgcHJvdG9jb2xfdmVyc2lvbik6Ci0gICAgICAgIHRpbWVzdGFtcF9tcyA9IGludDY0X3VucGFjayhieXRzKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm4gZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAodGltZXN0YW1wX21zIC8gMTAwMC4wKQotICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKLSAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oRGF0ZU92ZXJGbG93V2FybmluZygiU29tZSB0aW1lc3RhbXBzIGFyZSBsYXJnZXIgdGhhbiBQeXRob24gZGF0ZXRpbWUgY2FuIHJlcHJlc2VudC4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lc3RhbXBzIGFyZSBkaXNwbGF5ZWQgaW4gbWlsbGlzZWNvbmRzIGZyb20gZXBvY2guIikpCi0gICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wX21zCi0KLSAgICBjYXNzYW5kcmEuY3FsdHlwZXMuRGF0ZVR5cGUuZGVzZXJpYWxpemUgPSBzdGF0aWNtZXRob2QoZGVzZXJpYWxpemVfZGF0ZV9mYWxsYmFja19pbnQpCi0KLSAgICBpZiBoYXNhdHRyKGNhc3NhbmRyYSwgJ2Rlc2VyaWFsaXplcnMnKToKLSAgICAgICAgZGVsIGNhc3NhbmRyYS5kZXNlcmlhbGl6ZXJzLkRlc0RhdGVUeXBlCi0KLSAgICAjIFJldHVybiBjYXNzYW5kcmEuY3FsdHlwZXMuRU1QVFkgaW5zdGVhZCBvZiBOb25lIGZvciBlbXB0eSB2YWx1ZXMKLSAgICBjYXNzYW5kcmEuY3FsdHlwZXMuQ2Fzc2FuZHJhVHlwZS5zdXBwb3J0X2VtcHR5X3ZhbHVlcyA9IFRydWUKLQotCi1jbGFzcyBTaGVsbChjbWQuQ21kKToKLSAgICBjdXN0b21fcHJvbXB0ID0gb3MuZ2V0ZW52KCdDUUxTSF9QUk9NUFQnLCAnJykKLSAgICBpZiBjdXN0b21fcHJvbXB0ICE9ICcnOgotICAgICAgICBjdXN0b21fcHJvbXB0ICs9ICJcbiIKLSAgICBkZWZhdWx0X3Byb21wdCA9IGN1c3RvbV9wcm9tcHQgKyAiY3Fsc2g+ICIKLSAgICBjb250aW51ZV9wcm9tcHQgPSAiICAgLi4uICIKLSAgICBrZXlzcGFjZV9wcm9tcHQgPSBjdXN0b21fcHJvbXB0ICsgImNxbHNoOnt9PiAiCi0gICAga2V5c3BhY2VfY29udGludWVfcHJvbXB0ID0gInt9ICAgIC4uLiAiCi0gICAgc2hvd19saW5lX251bXMgPSBGYWxzZQotICAgIGRlYnVnID0gRmFsc2UKLSAgICBjb3ZlcmFnZSA9IEZhbHNlCi0gICAgY292ZXJhZ2VyY19wYXRoID0gTm9uZQotICAgIHN0b3AgPSBGYWxzZQotICAgIGxhc3RfaGlzdCA9IE5vbmUKLSAgICBzaHVudGVkX3F1ZXJ5X291dCA9IE5vbmUKLSAgICB1c2VfcGFnaW5nID0gVHJ1ZQotCi0gICAgZGVmYXVsdF9wYWdlX3NpemUgPSAxMDAKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0bmFtZSwgcG9ydCwgY29sb3I9RmFsc2UsCi0gICAgICAgICAgICAgICAgIHVzZXJuYW1lPU5vbmUsIGVuY29kaW5nPU5vbmUsIHN0ZGluPU5vbmUsIHR0eT1UcnVlLAotICAgICAgICAgICAgICAgICBjb21wbGV0ZWtleT1ERUZBVUxUX0NPTVBMRVRFS0VZLCBicm93c2VyPU5vbmUsIHVzZV9jb25uPU5vbmUsCi0gICAgICAgICAgICAgICAgIGNxbHZlcj1Ob25lLCBrZXlzcGFjZT1Ob25lLAotICAgICAgICAgICAgICAgICB0cmFjaW5nX2VuYWJsZWQ9RmFsc2UsIGV4cGFuZF9lbmFibGVkPUZhbHNlLAotICAgICAgICAgICAgICAgICBkaXNwbGF5X25hbm90aW1lX2Zvcm1hdD1ERUZBVUxUX05BTk9USU1FX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAgZGlzcGxheV90aW1lc3RhbXBfZm9ybWF0PURFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVCwKLSAgICAgICAgICAgICAgICAgZGlzcGxheV9kYXRlX2Zvcm1hdD1ERUZBVUxUX0RBVEVfRk9STUFULAotICAgICAgICAgICAgICAgICBkaXNwbGF5X2Zsb2F0X3ByZWNpc2lvbj1ERUZBVUxUX0ZMT0FUX1BSRUNJU0lPTiwKLSAgICAgICAgICAgICAgICAgZGlzcGxheV9kb3VibGVfcHJlY2lzaW9uPURFRkFVTFRfRE9VQkxFX1BSRUNJU0lPTiwKLSAgICAgICAgICAgICAgICAgZGlzcGxheV90aW1lem9uZT1Ob25lLAotICAgICAgICAgICAgICAgICBtYXhfdHJhY2Vfd2FpdD1ERUZBVUxUX01BWF9UUkFDRV9XQUlULAotICAgICAgICAgICAgICAgICBzc2w9RmFsc2UsCi0gICAgICAgICAgICAgICAgIHNpbmdsZV9zdGF0ZW1lbnQ9Tm9uZSwKLSAgICAgICAgICAgICAgICAgcmVxdWVzdF90aW1lb3V0PURFRkFVTFRfUkVRVUVTVF9USU1FT1VUX1NFQ09ORFMsCi0gICAgICAgICAgICAgICAgIHByb3RvY29sX3ZlcnNpb249Tm9uZSwKLSAgICAgICAgICAgICAgICAgY29ubmVjdF90aW1lb3V0PURFRkFVTFRfQ09OTkVDVF9USU1FT1VUX1NFQ09ORFMsCi0gICAgICAgICAgICAgICAgIGlzX3N1YnNoZWxsPUZhbHNlLAotICAgICAgICAgICAgICAgICBhdXRoX3Byb3ZpZGVyPU5vbmUpOgotICAgICAgICBjbWQuQ21kLl9faW5pdF9fKHNlbGYsIGNvbXBsZXRla2V5PWNvbXBsZXRla2V5KQotICAgICAgICBzZWxmLmhvc3RuYW1lID0gaG9zdG5hbWUKLSAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAotICAgICAgICBzZWxmLmF1dGhfcHJvdmlkZXIgPSBhdXRoX3Byb3ZpZGVyCi0gICAgICAgIHNlbGYudXNlcm5hbWUgPSB1c2VybmFtZQotCi0gICAgICAgIGlmIGlzaW5zdGFuY2UoYXV0aF9wcm92aWRlciwgUGxhaW5UZXh0QXV0aFByb3ZpZGVyKToKLSAgICAgICAgICAgIHNlbGYudXNlcm5hbWUgPSBhdXRoX3Byb3ZpZGVyLnVzZXJuYW1lCi0gICAgICAgICAgICBpZiBub3QgYXV0aF9wcm92aWRlci5wYXNzd29yZDoKLSAgICAgICAgICAgICAgICAjIGlmIG5vIHBhc3N3b3JkIGlzIHByb3ZpZGVkLCB3ZSBuZWVkIHRvIHF1ZXJ5IHRoZSB1c2VyIHRvIGdldCBvbmUuCi0gICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRwYXNzLmdldHBhc3MoKQotICAgICAgICAgICAgICAgIHNlbGYuYXV0aF9wcm92aWRlciA9IFBsYWluVGV4dEF1dGhQcm92aWRlcih1c2VybmFtZT1hdXRoX3Byb3ZpZGVyLnVzZXJuYW1lLCBwYXNzd29yZD1wYXNzd29yZCkKLQotICAgICAgICBzZWxmLmtleXNwYWNlID0ga2V5c3BhY2UKLSAgICAgICAgc2VsZi5zc2wgPSBzc2wKLSAgICAgICAgc2VsZi50cmFjaW5nX2VuYWJsZWQgPSB0cmFjaW5nX2VuYWJsZWQKLSAgICAgICAgc2VsZi5wYWdlX3NpemUgPSBzZWxmLmRlZmF1bHRfcGFnZV9zaXplCi0gICAgICAgIHNlbGYuZXhwYW5kX2VuYWJsZWQgPSBleHBhbmRfZW5hYmxlZAotICAgICAgICBpZiB1c2VfY29ubjoKLSAgICAgICAgICAgIHNlbGYuY29ubiA9IHVzZV9jb25uCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBrd2FyZ3MgPSB7fQotICAgICAgICAgICAgaWYgcHJvdG9jb2xfdmVyc2lvbiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBrd2FyZ3NbJ3Byb3RvY29sX3ZlcnNpb24nXSA9IHByb3RvY29sX3ZlcnNpb24KLSAgICAgICAgICAgIHNlbGYuY29ubiA9IENsdXN0ZXIoY29udGFjdF9wb2ludHM9KHNlbGYuaG9zdG5hbWUsKSwgcG9ydD1zZWxmLnBvcnQsIGNxbF92ZXJzaW9uPWNxbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9wcm92aWRlcj1zZWxmLmF1dGhfcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF9vcHRpb25zPXNzbGhhbmRsaW5nLnNzbF9zZXR0aW5ncyhob3N0bmFtZSwgQ09ORklHX0ZJTEUpIGlmIHNzbCBlbHNlIE5vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfYmFsYW5jaW5nX3BvbGljeT1XaGl0ZUxpc3RSb3VuZFJvYmluUG9saWN5KFtzZWxmLmhvc3RuYW1lXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfY29ubmVjdGlvbl90aW1lb3V0PWNvbm5lY3RfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF90aW1lb3V0PWNvbm5lY3RfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpCi0gICAgICAgIHNlbGYub3duc19jb25uZWN0aW9uID0gbm90IHVzZV9jb25uCi0KLSAgICAgICAgaWYga2V5c3BhY2U6Ci0gICAgICAgICAgICBzZWxmLnNlc3Npb24gPSBzZWxmLmNvbm4uY29ubmVjdChrZXlzcGFjZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuc2Vzc2lvbiA9IHNlbGYuY29ubi5jb25uZWN0KCkKLQotICAgICAgICBpZiBicm93c2VyID09ICIiOgotICAgICAgICAgICAgYnJvd3NlciA9IE5vbmUKLSAgICAgICAgc2VsZi5icm93c2VyID0gYnJvd3NlcgotICAgICAgICBzZWxmLmNvbG9yID0gY29sb3IKLQotICAgICAgICBzZWxmLmRpc3BsYXlfbmFub3RpbWVfZm9ybWF0ID0gZGlzcGxheV9uYW5vdGltZV9mb3JtYXQKLSAgICAgICAgc2VsZi5kaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQgPSBkaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQKLSAgICAgICAgc2VsZi5kaXNwbGF5X2RhdGVfZm9ybWF0ID0gZGlzcGxheV9kYXRlX2Zvcm1hdAotCi0gICAgICAgIHNlbGYuZGlzcGxheV9mbG9hdF9wcmVjaXNpb24gPSBkaXNwbGF5X2Zsb2F0X3ByZWNpc2lvbgotICAgICAgICBzZWxmLmRpc3BsYXlfZG91YmxlX3ByZWNpc2lvbiA9IGRpc3BsYXlfZG91YmxlX3ByZWNpc2lvbgotCi0gICAgICAgIHNlbGYuZGlzcGxheV90aW1lem9uZSA9IGRpc3BsYXlfdGltZXpvbmUKLQotICAgICAgICBzZWxmLnNlc3Npb24uZGVmYXVsdF90aW1lb3V0ID0gcmVxdWVzdF90aW1lb3V0Ci0gICAgICAgIHNlbGYuc2Vzc2lvbi5yb3dfZmFjdG9yeSA9IG9yZGVyZWRfZGljdF9mYWN0b3J5Ci0gICAgICAgIHNlbGYuc2Vzc2lvbi5kZWZhdWx0X2NvbnNpc3RlbmN5X2xldmVsID0gY2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwuT05FCi0gICAgICAgIHNlbGYuZ2V0X2Nvbm5lY3Rpb25fdmVyc2lvbnMoKQotICAgICAgICBzZWxmLnNldF9leHBhbmRlZF9jcWxfdmVyc2lvbihzZWxmLmNvbm5lY3Rpb25fdmVyc2lvbnNbJ2NxbCddKQotCi0gICAgICAgIHNlbGYuY3VycmVudF9rZXlzcGFjZSA9IGtleXNwYWNlCi0KLSAgICAgICAgc2VsZi5tYXhfdHJhY2Vfd2FpdCA9IG1heF90cmFjZV93YWl0Ci0gICAgICAgIHNlbGYuc2Vzc2lvbi5tYXhfdHJhY2Vfd2FpdCA9IG1heF90cmFjZV93YWl0Ci0KLSAgICAgICAgc2VsZi50dHkgPSB0dHkKLSAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCi0KLSAgICAgICAgc2VsZi5vdXRwdXRfY29kZWMgPSBjb2RlY3MubG9va3VwKGVuY29kaW5nKQotCi0gICAgICAgIHNlbGYuc3RhdGVtZW50ID0gU3RyaW5nSU8oKQotICAgICAgICBzZWxmLmxpbmVubyA9IDEKLSAgICAgICAgc2VsZi5pbl9jb21tZW50ID0gRmFsc2UKLQotICAgICAgICBzZWxmLnByb21wdCA9ICcnCi0gICAgICAgIGlmIHN0ZGluIGlzIE5vbmU6Ci0gICAgICAgICAgICBzdGRpbiA9IHN5cy5zdGRpbgotCi0gICAgICAgIGlmIHR0eToKLSAgICAgICAgICAgIHNlbGYucmVzZXRfcHJvbXB0KCkKLSAgICAgICAgICAgIHNlbGYucmVwb3J0X2Nvbm5lY3Rpb24oKQotICAgICAgICAgICAgcHJpbnQoJ1VzZSBIRUxQIGZvciBoZWxwLicpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnNob3dfbGluZV9udW1zID0gVHJ1ZQotICAgICAgICBzZWxmLnN0ZGluID0gc3RkaW4KLSAgICAgICAgc2VsZi5xdWVyeV9vdXQgPSBzeXMuc3Rkb3V0Ci0gICAgICAgIHNlbGYuY29uc2lzdGVuY3lfbGV2ZWwgPSBjYXNzYW5kcmEuQ29uc2lzdGVuY3lMZXZlbC5PTkUKLSAgICAgICAgc2VsZi5zZXJpYWxfY29uc2lzdGVuY3lfbGV2ZWwgPSBjYXNzYW5kcmEuQ29uc2lzdGVuY3lMZXZlbC5TRVJJQUwKLQotICAgICAgICBzZWxmLmVtcHR5X2xpbmVzID0gMAotICAgICAgICBzZWxmLnN0YXRlbWVudF9lcnJvciA9IEZhbHNlCi0gICAgICAgIHNlbGYuc2luZ2xlX3N0YXRlbWVudCA9IHNpbmdsZV9zdGF0ZW1lbnQKLSAgICAgICAgc2VsZi5pc19zdWJzaGVsbCA9IGlzX3N1YnNoZWxsCi0KLSAgICBAcHJvcGVydHkKLSAgICBkZWYgYmF0Y2hfbW9kZShzZWxmKToKLSAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnR0eQotCi0gICAgZGVmIHNldF9leHBhbmRlZF9jcWxfdmVyc2lvbihzZWxmLCB2ZXIpOgotICAgICAgICB2ZXIsIHZlcnR1cGxlID0gZnVsbF9jcWxfdmVyc2lvbih2ZXIpCi0gICAgICAgIHNlbGYuY3FsX3ZlcnNpb24gPSB2ZXIKLSAgICAgICAgc2VsZi5jcWxfdmVyX3R1cGxlID0gdmVydHVwbGUKLQotICAgIGRlZiBjcWx2ZXJfYXRsZWFzdChzZWxmLCBtYWpvciwgbWlub3I9MCwgcGF0Y2g9MCk6Ci0gICAgICAgIHJldHVybiBzZWxmLmNxbF92ZXJfdHVwbGVbOjNdID49IChtYWpvciwgbWlub3IsIHBhdGNoKQotCi0gICAgZGVmIG15Zm9ybWF0X3ZhbHVlKHNlbGYsIHZhbCwgY3FsdHlwZT1Ob25lLCAqKmt3YXJncyk6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBEZWNvZGVFcnJvcik6Ci0gICAgICAgICAgICBzZWxmLmRlY29kaW5nX2Vycm9ycy5hcHBlbmQodmFsKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBkdGZvcm1hdHMgPSBEYXRlVGltZUZvcm1hdCh0aW1lc3RhbXBfZm9ybWF0PXNlbGYuZGlzcGxheV90aW1lc3RhbXBfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9mb3JtYXQ9c2VsZi5kaXNwbGF5X2RhdGVfZm9ybWF0LCBuYW5vdGltZV9mb3JtYXQ9c2VsZi5kaXNwbGF5X25hbm90aW1lX2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV6b25lPXNlbGYuZGlzcGxheV90aW1lem9uZSkKLSAgICAgICAgICAgIHByZWNpc2lvbiA9IHNlbGYuZGlzcGxheV9kb3VibGVfcHJlY2lzaW9uIGlmIGNxbHR5cGUgaXMgbm90IE5vbmUgYW5kIGNxbHR5cGUudHlwZV9uYW1lID09ICdkb3VibGUnIFwKLSAgICAgICAgICAgICAgICBlbHNlIHNlbGYuZGlzcGxheV9mbG9hdF9wcmVjaXNpb24KLSAgICAgICAgICAgIHJldHVybiBmb3JtYXRfdmFsdWUodmFsLCBjcWx0eXBlPWNxbHR5cGUsIGVuY29kaW5nPXNlbGYub3V0cHV0X2NvZGVjLm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGNvbG9yPXNlbGYuY29sb3IsIGRhdGVfdGltZV9mb3JtYXQ9ZHRmb3JtYXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdF9wcmVjaXNpb249cHJlY2lzaW9uLCAqKmt3YXJncykKLSAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICAgICAgZXJyID0gRm9ybWF0RXJyb3IodmFsLCBlKQotICAgICAgICAgICAgc2VsZi5kZWNvZGluZ19lcnJvcnMuYXBwZW5kKGVycikKLSAgICAgICAgICAgIHJldHVybiBmb3JtYXRfdmFsdWUoZXJyLCBjcWx0eXBlPWNxbHR5cGUsIGVuY29kaW5nPXNlbGYub3V0cHV0X2NvZGVjLm5hbWUsIGFkZGNvbG9yPXNlbGYuY29sb3IpCi0KLSAgICBkZWYgbXlmb3JtYXRfY29sbmFtZShzZWxmLCBuYW1lLCB0YWJsZV9tZXRhPU5vbmUpOgotICAgICAgICBjb2x1bW5fY29sb3JzID0gQ09MVU1OX05BTUVfQ09MT1JTLmNvcHkoKQotICAgICAgICAjIGNoZWNrIGNvbHVtbiByb2xlIGFuZCBjb2xvciBhcHByb3ByaWF0ZWx5Ci0gICAgICAgIGlmIHRhYmxlX21ldGE6Ci0gICAgICAgICAgICBpZiBuYW1lIGluIFtjb2wubmFtZSBmb3IgY29sIGluIHRhYmxlX21ldGEucGFydGl0aW9uX2tleV06Ci0gICAgICAgICAgICAgICAgY29sdW1uX2NvbG9ycy5kZWZhdWx0X2ZhY3RvcnkgPSBsYW1iZGE6IFJFRAotICAgICAgICAgICAgZWxpZiBuYW1lIGluIFtjb2wubmFtZSBmb3IgY29sIGluIHRhYmxlX21ldGEuY2x1c3RlcmluZ19rZXldOgotICAgICAgICAgICAgICAgIGNvbHVtbl9jb2xvcnMuZGVmYXVsdF9mYWN0b3J5ID0gbGFtYmRhOiBDWUFOCi0gICAgICAgICAgICBlbGlmIG5hbWUgaW4gdGFibGVfbWV0YS5jb2x1bW5zIGFuZCB0YWJsZV9tZXRhLmNvbHVtbnNbbmFtZV0uaXNfc3RhdGljOgotICAgICAgICAgICAgICAgIGNvbHVtbl9jb2xvcnMuZGVmYXVsdF9mYWN0b3J5ID0gbGFtYmRhOiBXSElURQotICAgICAgICByZXR1cm4gc2VsZi5teWZvcm1hdF92YWx1ZShuYW1lLCBjb2xvcm1hcD1jb2x1bW5fY29sb3JzKQotCi0gICAgZGVmIHJlcG9ydF9jb25uZWN0aW9uKHNlbGYpOgotICAgICAgICBzZWxmLnNob3dfaG9zdCgpCi0gICAgICAgIHNlbGYuc2hvd192ZXJzaW9uKCkKLQotICAgIGRlZiBzaG93X2hvc3Qoc2VsZik6Ci0gICAgICAgIHByaW50KCJDb25uZWN0ZWQgdG8gezB9IGF0IHsxfTp7Mn0iCi0gICAgICAgICAgICAgIC5mb3JtYXQoc2VsZi5hcHBseWNvbG9yKHNlbGYuZ2V0X2NsdXN0ZXJfbmFtZSgpLCBCTFVFKSwKLSAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvc3RuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIHNlbGYucG9ydCkpCi0KLSAgICBkZWYgc2hvd192ZXJzaW9uKHNlbGYpOgotICAgICAgICB2ZXJzID0gc2VsZi5jb25uZWN0aW9uX3ZlcnNpb25zLmNvcHkoKQotICAgICAgICB2ZXJzWydzaHZlciddID0gdmVyc2lvbgotICAgICAgICAjIHN5c3RlbS5WZXJzaW9uc1snY3FsJ10gYXBwYXJlbnRseSBkb2VzIG5vdCByZWZsZWN0IGNoYW5nZXMgd2l0aAotICAgICAgICAjIHNldF9jcWxfdmVyc2lvbi4KLSAgICAgICAgdmVyc1snY3FsJ10gPSBzZWxmLmNxbF92ZXJzaW9uCi0gICAgICAgIHByaW50KCJbY3Fsc2ggJShzaHZlcilzIHwgQ2Fzc2FuZHJhICUoYnVpbGQpcyB8IENRTCBzcGVjICUoY3FsKXMgfCBOYXRpdmUgcHJvdG9jb2wgdiUocHJvdG9jb2wpc10iICUgdmVycykKLQotICAgIGRlZiBzaG93X3Nlc3Npb24oc2VsZiwgc2Vzc2lvbmlkLCBwYXJ0aWFsX3Nlc3Npb249RmFsc2UpOgotICAgICAgICBwcmludF90cmFjZV9zZXNzaW9uKHNlbGYsIHNlbGYuc2Vzc2lvbiwgc2Vzc2lvbmlkLCBwYXJ0aWFsX3Nlc3Npb24pCi0KLSAgICBkZWYgZ2V0X2Nvbm5lY3Rpb25fdmVyc2lvbnMoc2VsZik6Ci0gICAgICAgIHJlc3VsdCwgPSBzZWxmLnNlc3Npb24uZXhlY3V0ZSgic2VsZWN0ICogZnJvbSBzeXN0ZW0ubG9jYWwgd2hlcmUga2V5ID0gJ2xvY2FsJyIpCi0gICAgICAgIHZlcnMgPSB7Ci0gICAgICAgICAgICAnYnVpbGQnOiByZXN1bHRbJ3JlbGVhc2VfdmVyc2lvbiddLAotICAgICAgICAgICAgJ3Byb3RvY29sJzogc2VsZi5jb25uLnByb3RvY29sX3ZlcnNpb24sCi0gICAgICAgICAgICAnY3FsJzogcmVzdWx0WydjcWxfdmVyc2lvbiddLAotICAgICAgICB9Ci0gICAgICAgIHNlbGYuY29ubmVjdGlvbl92ZXJzaW9ucyA9IHZlcnMKLQotICAgIGRlZiBnZXRfa2V5c3BhY2VfbmFtZXMoc2VsZik6Ci0gICAgICAgIHJldHVybiBsaXN0KHNlbGYuY29ubi5tZXRhZGF0YS5rZXlzcGFjZXMpCi0KLSAgICBkZWYgZ2V0X2NvbHVtbmZhbWlseV9uYW1lcyhzZWxmLCBrc25hbWU9Tm9uZSk6Ci0gICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgotICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCi0KLSAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrc25hbWUpLnRhYmxlcykKLQotICAgIGRlZiBnZXRfbWF0ZXJpYWxpemVkX3ZpZXdfbmFtZXMoc2VsZiwga3NuYW1lPU5vbmUpOgotICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotCi0gICAgICAgIHJldHVybiBsaXN0KHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKS52aWV3cykKLQotICAgIGRlZiBnZXRfaW5kZXhfbmFtZXMoc2VsZiwga3NuYW1lPU5vbmUpOgotICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotCi0gICAgICAgIHJldHVybiBsaXN0KHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKS5pbmRleGVzKQotCi0gICAgZGVmIGdldF9jb2x1bW5fbmFtZXMoc2VsZiwga3NuYW1lLCBjZm5hbWUpOgotICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotICAgICAgICBsYXlvdXQgPSBzZWxmLmdldF90YWJsZV9tZXRhKGtzbmFtZSwgY2ZuYW1lKQotICAgICAgICByZXR1cm4gbGlzdChsYXlvdXQuY29sdW1ucykKLQotICAgIGRlZiBnZXRfdXNlcnR5cGVfbmFtZXMoc2VsZiwga3NuYW1lPU5vbmUpOgotICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotCi0gICAgICAgIHJldHVybiBsaXN0KHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKS51c2VyX3R5cGVzKQotCi0gICAgZGVmIGdldF91c2VydHlwZV9sYXlvdXQoc2VsZiwga3NuYW1lLCB0eXBlbmFtZSk6Ci0gICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgotICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCi0KLSAgICAgICAga3NfbWV0YSA9IHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKQotCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHVzZXJfdHlwZSA9IGtzX21ldGEudXNlcl90eXBlc1t0eXBlbmFtZV0KLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgcmFpc2UgVXNlclR5cGVOb3RGb3VuZCgiVXNlciB0eXBlIHshcn0gbm90IGZvdW5kIi5mb3JtYXQodHlwZW5hbWUpKQotCi0gICAgICAgIHJldHVybiBsaXN0KHppcCh1c2VyX3R5cGUuZmllbGRfbmFtZXMsIHVzZXJfdHlwZS5maWVsZF90eXBlcykpCi0KLSAgICBkZWYgZ2V0X3VzZXJmdW5jdGlvbl9uYW1lcyhzZWxmLCBrc25hbWU9Tm9uZSk6Ci0gICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgotICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCi0KLSAgICAgICAgcmV0dXJuIFtmLm5hbWUgZm9yIGYgaW4gbGlzdChzZWxmLmdldF9rZXlzcGFjZV9tZXRhKGtzbmFtZSkuZnVuY3Rpb25zLnZhbHVlcygpKV0KLQotICAgIGRlZiBnZXRfdXNlcmFnZ3JlZ2F0ZV9uYW1lcyhzZWxmLCBrc25hbWU9Tm9uZSk6Ci0gICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgotICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCi0KLSAgICAgICAgcmV0dXJuIFtmLm5hbWUgZm9yIGYgaW4gbGlzdChzZWxmLmdldF9rZXlzcGFjZV9tZXRhKGtzbmFtZSkuYWdncmVnYXRlcy52YWx1ZXMoKSldCi0KLSAgICBkZWYgZ2V0X2NsdXN0ZXJfbmFtZShzZWxmKToKLSAgICAgICAgcmV0dXJuIHNlbGYuY29ubi5tZXRhZGF0YS5jbHVzdGVyX25hbWUKLQotICAgIGRlZiBnZXRfcGFydGl0aW9uZXIoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmNvbm4ubWV0YWRhdGEucGFydGl0aW9uZXIKLQotICAgIGRlZiBnZXRfa2V5c3BhY2VfbWV0YShzZWxmLCBrc25hbWUpOgotICAgICAgICBpZiBrc25hbWUgaW4gc2VsZi5jb25uLm1ldGFkYXRhLmtleXNwYWNlczoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbm4ubWV0YWRhdGEua2V5c3BhY2VzW2tzbmFtZV0KLQotICAgICAgICByYWlzZSBLZXlzcGFjZU5vdEZvdW5kKCdLZXlzcGFjZSAlciBub3QgZm91bmQuJyAlIGtzbmFtZSkKLQotICAgIGRlZiBnZXRfa2V5c3BhY2VzKHNlbGYpOgotICAgICAgICByZXR1cm4gbGlzdChzZWxmLmNvbm4ubWV0YWRhdGEua2V5c3BhY2VzLnZhbHVlcygpKQotCi0gICAgZGVmIGdldF9yaW5nKHNlbGYsIGtzKToKLSAgICAgICAgc2VsZi5jb25uLm1ldGFkYXRhLnRva2VuX21hcC5yZWJ1aWxkX2tleXNwYWNlKGtzLCBidWlsZF9pZl9hYnNlbnQ9VHJ1ZSkKLSAgICAgICAgcmV0dXJuIHNlbGYuY29ubi5tZXRhZGF0YS50b2tlbl9tYXAudG9rZW5zX3RvX2hvc3RzX2J5X2tzW2tzXQotCi0gICAgZGVmIGdldF90YWJsZV9tZXRhKHNlbGYsIGtzbmFtZSwgdGFibGVuYW1lKToKLSAgICAgICAgaWYga3NuYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICBrc25hbWUgPSBzZWxmLmN1cnJlbnRfa2V5c3BhY2UKLSAgICAgICAga3NtZXRhID0gc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrc25hbWUpCi0gICAgICAgIGlmIHRhYmxlbmFtZSBub3QgaW4ga3NtZXRhLnRhYmxlczoKLSAgICAgICAgICAgIGlmIGtzbmFtZSA9PSAnc3lzdGVtX2F1dGgnIGFuZCB0YWJsZW5hbWUgaW4gWydyb2xlcycsICdyb2xlX3Blcm1pc3Npb25zJ106Ci0gICAgICAgICAgICAgICAgc2VsZi5nZXRfZmFrZV9hdXRoX3RhYmxlX21ldGEoa3NuYW1lLCB0YWJsZW5hbWUpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJhaXNlIENvbHVtbkZhbWlseU5vdEZvdW5kKCJDb2x1bW4gZmFtaWx5IHt9IG5vdCBmb3VuZCIuZm9ybWF0KHRhYmxlbmFtZSkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4ga3NtZXRhLnRhYmxlc1t0YWJsZW5hbWVdCi0KLSAgICBkZWYgZ2V0X2Zha2VfYXV0aF90YWJsZV9tZXRhKHNlbGYsIGtzbmFtZSwgdGFibGVuYW1lKToKLSAgICAgICAgIyBtYXkgYmUgdXNpbmcgZXh0ZXJuYWwgYXV0aCBpbXBsZW1lbnRhdGlvbiBzbyBpbnRlcm5hbCB0YWJsZXMKLSAgICAgICAgIyBhcmVuJ3QgYWN0dWFsbHkgZGVmaW5lZCBpbiBzY2hlbWEuIEluIHRoaXMgY2FzZSwgd2UnbGwgZmFrZQotICAgICAgICAjIHRoZW0gdXAKLSAgICAgICAgaWYgdGFibGVuYW1lID09ICdyb2xlcyc6Ci0gICAgICAgICAgICBrc19tZXRhID0gS2V5c3BhY2VNZXRhZGF0YShrc25hbWUsIFRydWUsIE5vbmUsIE5vbmUpCi0gICAgICAgICAgICB0YWJsZV9tZXRhID0gVGFibGVNZXRhZGF0YShrc19tZXRhLCAncm9sZXMnKQotICAgICAgICAgICAgdGFibGVfbWV0YS5jb2x1bW5zWydyb2xlJ10gPSBDb2x1bW5NZXRhZGF0YSh0YWJsZV9tZXRhLCAncm9sZScsIGNhc3NhbmRyYS5jcWx0eXBlcy5VVEY4VHlwZSkKLSAgICAgICAgICAgIHRhYmxlX21ldGEuY29sdW1uc1snaXNfc3VwZXJ1c2VyJ10gPSBDb2x1bW5NZXRhZGF0YSh0YWJsZV9tZXRhLCAnaXNfc3VwZXJ1c2VyJywgY2Fzc2FuZHJhLmNxbHR5cGVzLkJvb2xlYW5UeXBlKQotICAgICAgICAgICAgdGFibGVfbWV0YS5jb2x1bW5zWydjYW5fbG9naW4nXSA9IENvbHVtbk1ldGFkYXRhKHRhYmxlX21ldGEsICdjYW5fbG9naW4nLCBjYXNzYW5kcmEuY3FsdHlwZXMuQm9vbGVhblR5cGUpCi0gICAgICAgIGVsaWYgdGFibGVuYW1lID09ICdyb2xlX3Blcm1pc3Npb25zJzoKLSAgICAgICAgICAgIGtzX21ldGEgPSBLZXlzcGFjZU1ldGFkYXRhKGtzbmFtZSwgVHJ1ZSwgTm9uZSwgTm9uZSkKLSAgICAgICAgICAgIHRhYmxlX21ldGEgPSBUYWJsZU1ldGFkYXRhKGtzX21ldGEsICdyb2xlX3Blcm1pc3Npb25zJykKLSAgICAgICAgICAgIHRhYmxlX21ldGEuY29sdW1uc1sncm9sZSddID0gQ29sdW1uTWV0YWRhdGEodGFibGVfbWV0YSwgJ3JvbGUnLCBjYXNzYW5kcmEuY3FsdHlwZXMuVVRGOFR5cGUpCi0gICAgICAgICAgICB0YWJsZV9tZXRhLmNvbHVtbnNbJ3Jlc291cmNlJ10gPSBDb2x1bW5NZXRhZGF0YSh0YWJsZV9tZXRhLCAncmVzb3VyY2UnLCBjYXNzYW5kcmEuY3FsdHlwZXMuVVRGOFR5cGUpCi0gICAgICAgICAgICB0YWJsZV9tZXRhLmNvbHVtbnNbJ3Blcm1pc3Npb24nXSA9IENvbHVtbk1ldGFkYXRhKHRhYmxlX21ldGEsICdwZXJtaXNzaW9uJywgY2Fzc2FuZHJhLmNxbHR5cGVzLlVURjhUeXBlKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgQ29sdW1uRmFtaWx5Tm90Rm91bmQoIkNvbHVtbiBmYW1pbHkge30gbm90IGZvdW5kIi5mb3JtYXQodGFibGVuYW1lKSkKLQotICAgIGRlZiBnZXRfaW5kZXhfbWV0YShzZWxmLCBrc25hbWUsIGlkeG5hbWUpOgotICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotICAgICAgICBrc21ldGEgPSBzZWxmLmdldF9rZXlzcGFjZV9tZXRhKGtzbmFtZSkKLQotICAgICAgICBpZiBpZHhuYW1lIG5vdCBpbiBrc21ldGEuaW5kZXhlczoKLSAgICAgICAgICAgIHJhaXNlIEluZGV4Tm90Rm91bmQoIkluZGV4IHt9IG5vdCBmb3VuZCIuZm9ybWF0KGlkeG5hbWUpKQotCi0gICAgICAgIHJldHVybiBrc21ldGEuaW5kZXhlc1tpZHhuYW1lXQotCi0gICAgZGVmIGdldF92aWV3X21ldGEoc2VsZiwga3NuYW1lLCB2aWV3bmFtZSk6Ci0gICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgotICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCi0gICAgICAgIGtzbWV0YSA9IHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKQotCi0gICAgICAgIGlmIHZpZXduYW1lIG5vdCBpbiBrc21ldGEudmlld3M6Ci0gICAgICAgICAgICByYWlzZSBNYXRlcmlhbGl6ZWRWaWV3Tm90Rm91bmQoIk1hdGVyaWFsaXplZCB2aWV3ICd7fScgbm90IGZvdW5kIi5mb3JtYXQodmlld25hbWUpKQotICAgICAgICByZXR1cm4ga3NtZXRhLnZpZXdzW3ZpZXduYW1lXQotCi0gICAgZGVmIGdldF9vYmplY3RfbWV0YShzZWxmLCBrcywgbmFtZSk6Ci0gICAgICAgIGlmIG5hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGlmIGtzIGFuZCBrcyBpbiBzZWxmLmNvbm4ubWV0YWRhdGEua2V5c3BhY2VzOgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbm4ubWV0YWRhdGEua2V5c3BhY2VzW2tzXQotICAgICAgICAgICAgZWxpZiBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgaXMgTm9uZToKLSAgICAgICAgICAgICAgICByYWlzZSBPYmplY3ROb3RGb3VuZCgiJ3t9JyBub3QgZm91bmQgaW4ga2V5c3BhY2VzIi5mb3JtYXQoa3MpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBuYW1lID0ga3MKLSAgICAgICAgICAgICAgICBrcyA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotCi0gICAgICAgIGlmIGtzIGlzIE5vbmU6Ci0gICAgICAgICAgICBrcyA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotCi0gICAgICAgIGtzbWV0YSA9IHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3MpCi0KLSAgICAgICAgaWYgbmFtZSBpbiBrc21ldGEudGFibGVzOgotICAgICAgICAgICAgcmV0dXJuIGtzbWV0YS50YWJsZXNbbmFtZV0KLSAgICAgICAgZWxpZiBuYW1lIGluIGtzbWV0YS5pbmRleGVzOgotICAgICAgICAgICAgcmV0dXJuIGtzbWV0YS5pbmRleGVzW25hbWVdCi0gICAgICAgIGVsaWYgbmFtZSBpbiBrc21ldGEudmlld3M6Ci0gICAgICAgICAgICByZXR1cm4ga3NtZXRhLnZpZXdzW25hbWVdCi0KLSAgICAgICAgcmFpc2UgT2JqZWN0Tm90Rm91bmQoIid7fScgbm90IGZvdW5kIGluIGtleXNwYWNlICd7fSciLmZvcm1hdChuYW1lLCBrcykpCi0KLSAgICBkZWYgZ2V0X3RyaWdnZXJfbmFtZXMoc2VsZiwga3NuYW1lPU5vbmUpOgotICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKLSAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQotCi0gICAgICAgIHJldHVybiBbdHJpZ2dlci5uYW1lCi0gICAgICAgICAgICAgICAgZm9yIHRhYmxlIGluIGxpc3Qoc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrc25hbWUpLnRhYmxlcy52YWx1ZXMoKSkKLSAgICAgICAgICAgICAgICBmb3IgdHJpZ2dlciBpbiBsaXN0KHRhYmxlLnRyaWdnZXJzLnZhbHVlcygpKV0KLQotICAgIGRlZiByZXNldF9zdGF0ZW1lbnQoc2VsZik6Ci0gICAgICAgIHNlbGYucmVzZXRfcHJvbXB0KCkKLSAgICAgICAgc2VsZi5zdGF0ZW1lbnQudHJ1bmNhdGUoMCkKLSAgICAgICAgc2VsZi5zdGF0ZW1lbnQuc2VlaygwKQotICAgICAgICBzZWxmLmVtcHR5X2xpbmVzID0gMAotCi0gICAgZGVmIHJlc2V0X3Byb21wdChzZWxmKToKLSAgICAgICAgaWYgc2VsZi5jdXJyZW50X2tleXNwYWNlIGlzIE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnNldF9wcm9tcHQoc2VsZi5kZWZhdWx0X3Byb21wdCwgVHJ1ZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuc2V0X3Byb21wdChzZWxmLmtleXNwYWNlX3Byb21wdC5mb3JtYXQoc2VsZi5jdXJyZW50X2tleXNwYWNlKSwgVHJ1ZSkKLQotICAgIGRlZiBzZXRfY29udGludWVfcHJvbXB0KHNlbGYpOgotICAgICAgICBpZiBzZWxmLmVtcHR5X2xpbmVzID49IDM6Ci0gICAgICAgICAgICBzZWxmLnNldF9wcm9tcHQoIlN0YXRlbWVudHMgYXJlIHRlcm1pbmF0ZWQgd2l0aCBhICc7Jy4gIFlvdSBjYW4gcHJlc3MgQ1RSTC1DIHRvIGNhbmNlbCBhbiBpbmNvbXBsZXRlIHN0YXRlbWVudC4iKQotICAgICAgICAgICAgc2VsZi5lbXB0eV9saW5lcyA9IDAKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgaXMgTm9uZToKLSAgICAgICAgICAgIHNlbGYuc2V0X3Byb21wdChzZWxmLmNvbnRpbnVlX3Byb21wdCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNwYWNlcyA9ICcgJyAqIGxlbihzdHIoc2VsZi5jdXJyZW50X2tleXNwYWNlKSkKLSAgICAgICAgICAgIHNlbGYuc2V0X3Byb21wdChzZWxmLmtleXNwYWNlX2NvbnRpbnVlX3Byb21wdC5mb3JtYXQoc3BhY2VzKSkKLSAgICAgICAgc2VsZi5lbXB0eV9saW5lcyA9IHNlbGYuZW1wdHlfbGluZXMgKyAxIGlmIG5vdCBzZWxmLmxhc3RjbWQgZWxzZSAwCi0KLSAgICBAY29udGV4dG1hbmFnZXIKLSAgICBkZWYgcHJlcGFyZV9sb29wKHNlbGYpOgotICAgICAgICByZWFkbGluZSA9IE5vbmUKLSAgICAgICAgaWYgc2VsZi50dHkgYW5kIHNlbGYuY29tcGxldGVrZXk6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgaW1wb3J0IHJlYWRsaW5lCi0gICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBvbGRfY29tcGxldGVyID0gcmVhZGxpbmUuZ2V0X2NvbXBsZXRlcigpCi0gICAgICAgICAgICAgICAgcmVhZGxpbmUuc2V0X2NvbXBsZXRlcihzZWxmLmNvbXBsZXRlKQotICAgICAgICAgICAgICAgIGlmIHJlYWRsaW5lLl9fZG9jX18gaXMgbm90IE5vbmUgYW5kICdsaWJlZGl0JyBpbiByZWFkbGluZS5fX2RvY19fOgotICAgICAgICAgICAgICAgICAgICByZWFkbGluZS5wYXJzZV9hbmRfYmluZCgiYmluZCAtZSIpCi0gICAgICAgICAgICAgICAgICAgIHJlYWRsaW5lLnBhcnNlX2FuZF9iaW5kKCJiaW5kICciICsgc2VsZi5jb21wbGV0ZWtleSArICInIHJsX2NvbXBsZXRlIikKLSAgICAgICAgICAgICAgICAgICAgcmVhZGxpbmUucGFyc2VfYW5kX2JpbmQoImJpbmQgXlIgZW0taW5jLXNlYXJjaC1wcmV2IikKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICByZWFkbGluZS5wYXJzZV9hbmRfYmluZChzZWxmLmNvbXBsZXRla2V5ICsgIjogY29tcGxldGUiKQotICAgICAgICAjIHN0YXJ0IGNvdmVyYWdlIGNvbGxlY3Rpb24gaWYgcmVxdWVzdGVkLCB1bmxlc3MgaW4gc3Vic2hlbGwKLSAgICAgICAgaWYgc2VsZi5jb3ZlcmFnZSBhbmQgbm90IHNlbGYuaXNfc3Vic2hlbGw6Ci0gICAgICAgICAgICAjIGNoZWNrIGZvciBjb3ZlcmFnZXJjIGZpbGUsIHdyaXRlIGl0IGlmIG1pc3NpbmcKLSAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKENRTF9ESVIpOgotICAgICAgICAgICAgICAgIHNlbGYuY292ZXJhZ2VyY19wYXRoID0gb3MucGF0aC5qb2luKENRTF9ESVIsICcuY292ZXJhZ2VyYycpCi0gICAgICAgICAgICAgICAgY292ZGF0YV9wYXRoID0gb3MucGF0aC5qb2luKENRTF9ESVIsICcuY292ZXJhZ2UnKQotICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShzZWxmLmNvdmVyYWdlcmNfcGF0aCk6Ci0gICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLmNvdmVyYWdlcmNfcGF0aCwgJ3cnKSBhcyBmOgotICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZWxpbmVzKFsiW3J1bl1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25jdXJyZW5jeSA9IG11bHRpcHJvY2Vzc2luZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFfZmlsZSA9IHt9XG4iLmZvcm1hdChjb3ZkYXRhX3BhdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYWxsZWwgPSB0cnVlXG4iXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAjIHN0YXJ0IGNvdmVyYWdlCi0gICAgICAgICAgICAgICAgaW1wb3J0IGNvdmVyYWdlCi0gICAgICAgICAgICAgICAgc2VsZi5jb3YgPSBjb3ZlcmFnZS5Db3ZlcmFnZShjb25maWdfZmlsZT1zZWxmLmNvdmVyYWdlcmNfcGF0aCkKLSAgICAgICAgICAgICAgICBzZWxmLmNvdi5zdGFydCgpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHlpZWxkCi0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBpZiByZWFkbGluZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICByZWFkbGluZS5zZXRfY29tcGxldGVyKG9sZF9jb21wbGV0ZXIpCi0gICAgICAgICAgICBpZiBzZWxmLmNvdmVyYWdlIGFuZCBub3Qgc2VsZi5pc19zdWJzaGVsbDoKLSAgICAgICAgICAgICAgICBzZWxmLnN0b3BfY292ZXJhZ2UoKQotCi0gICAgZGVmIGdldF9pbnB1dF9saW5lKHNlbGYsIHByb21wdD0nJyk6Ci0gICAgICAgIGlmIHNlbGYudHR5OgotICAgICAgICAgICAgc2VsZi5sYXN0Y21kID0gaW5wdXQoc3RyKHByb21wdCkpCi0gICAgICAgICAgICBsaW5lID0gc2VsZi5sYXN0Y21kICsgJ1xuJwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5sYXN0Y21kID0gc2VsZi5zdGRpbi5yZWFkbGluZSgpCi0gICAgICAgICAgICBsaW5lID0gc2VsZi5sYXN0Y21kCi0gICAgICAgICAgICBpZiBub3QgbGVuKGxpbmUpOgotICAgICAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCi0gICAgICAgIHNlbGYubGluZW5vICs9IDEKLSAgICAgICAgcmV0dXJuIGxpbmUKLQotICAgIGRlZiB1c2Vfc3RkaW5fcmVhZGVyKHNlbGYsIHVudGlsPScnLCBwcm9tcHQ9JycpOgotICAgICAgICB1bnRpbCArPSAnXG4nCi0gICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgbmV3bGluZSA9IHNlbGYuZ2V0X2lucHV0X2xpbmUocHJvbXB0PXByb21wdCkKLSAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIGlmIG5ld2xpbmUgPT0gdW50aWw6Ci0gICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICB5aWVsZCBuZXdsaW5lCi0KLSAgICBkZWYgY21kbG9vcChzZWxmLCBpbnRybz1Ob25lKToKLSAgICAgICAgIiIiCi0gICAgICAgIEFkYXB0ZWQgZnJvbSBjbWQuQ21kJ3MgdmVyc2lvbiwgYmVjYXVzZSB0aGVyZSBpcyBsaXRlcmFsbHkgbm8gd2F5IHdpdGgKLSAgICAgICAgY21kLkNtZC5jbWRsb29wKCkgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICJFT0YiIHNob3dpbmcgdXAgaW4KLSAgICAgICAgaW5wdXQgYW5kIGFuIGFjdHVhbCBFT0YuCi0gICAgICAgICIiIgotICAgICAgICB3aXRoIHNlbGYucHJlcGFyZV9sb29wKCk6Ci0gICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5zdG9wOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zaW5nbGVfc3RhdGVtZW50OgotICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuc2luZ2xlX3N0YXRlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdG9wID0gVHJ1ZQotICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuZ2V0X2lucHV0X2xpbmUoc2VsZi5wcm9tcHQpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVtZW50LndyaXRlKGxpbmUpCi0gICAgICAgICAgICAgICAgICAgIGlmIHNlbGYub25lY21kKHNlbGYuc3RhdGVtZW50LmdldHZhbHVlKCkpOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXNldF9zdGF0ZW1lbnQoKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZW9mKCkKLSAgICAgICAgICAgICAgICBleGNlcHQgQ1FMX0VSUk9SUyBhcyBjcWxlcnI6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoY3FsZXJyLm1lc3NhZ2UpCi0gICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc2V0X3N0YXRlbWVudCgpCi0gICAgICAgICAgICAgICAgICAgIHByaW50KCcnKQotCi0gICAgZGVmIHN0cmlwX2NvbW1lbnRfYmxvY2tzKHNlbGYsIHN0YXRlbWVudHRleHQpOgotICAgICAgICBjb21tZW50X2Jsb2NrX2luX2xpdGVyYWxfc3RyaW5nID0gcmUuc2VhcmNoKCdbIl0uKlsvXVsqXS4qWypdWy9dLipbIl0nLCBzdGF0ZW1lbnR0ZXh0KQotICAgICAgICBpZiBub3QgY29tbWVudF9ibG9ja19pbl9saXRlcmFsX3N0cmluZzoKLSAgICAgICAgICAgIHJlc3VsdCA9IHJlLnN1YignWy9dWypdLipbKl1bL10nLCAiIiwgc3RhdGVtZW50dGV4dCkKLSAgICAgICAgICAgIGlmICcqLycgaW4gcmVzdWx0IGFuZCAnLyonIG5vdCBpbiByZXN1bHQgYW5kIG5vdCBzZWxmLmluX2NvbW1lbnQ6Ci0gICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoIkVuY291bnRlcmVkIGNvbW1lbnQgYmxvY2sgdGVybWluYXRvciB3aXRob3V0IGJlaW5nIGluIGNvbW1lbnQgYmxvY2siKQotICAgICAgICAgICAgaWYgJy8qJyBpbiByZXN1bHQ6Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmUuc3ViKCdbL11bKl0uKicsICIiLCByZXN1bHQpCi0gICAgICAgICAgICAgICAgc2VsZi5pbl9jb21tZW50ID0gVHJ1ZQotICAgICAgICAgICAgaWYgJyovJyBpbiByZXN1bHQ6Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmUuc3ViKCcuKlsqXVsvXScsICIiLCByZXN1bHQpCi0gICAgICAgICAgICAgICAgc2VsZi5pbl9jb21tZW50ID0gRmFsc2UKLSAgICAgICAgICAgIGlmIHNlbGYuaW5fY29tbWVudCBhbmQgbm90IHJlLmZpbmRhbGwoJ1svXVsqXXxbKl1bL10nLCBzdGF0ZW1lbnR0ZXh0KToKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAnJwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAotICAgICAgICByZXR1cm4gc3RhdGVtZW50dGV4dAotCi0gICAgZGVmIG9uZWNtZChzZWxmLCBzdGF0ZW1lbnR0ZXh0KToKLSAgICAgICAgIiIiCi0gICAgICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RhdGVtZW50IGlzIGNvbXBsZXRlIGFuZCB3YXMgaGFuZGxlZCAobWVhbmluZyBpdAotICAgICAgICBjYW4gYmUgcmVzZXQpLgotICAgICAgICAiIiIKLSAgICAgICAgc3RhdGVtZW50dGV4dCA9IHNlbGYuc3RyaXBfY29tbWVudF9ibG9ja3Moc3RhdGVtZW50dGV4dCkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc3RhdGVtZW50cywgZW5kdG9rZW5fZXNjYXBlZCA9IGNxbHJ1bGVzZXQuY3FsX3NwbGl0X3N0YXRlbWVudHMoc3RhdGVtZW50dGV4dCkKLSAgICAgICAgZXhjZXB0IHB5bGV4b3Ryb24uTGV4aW5nRXJyb3IgYXMgZToKLSAgICAgICAgICAgIGlmIHNlbGYuc2hvd19saW5lX251bXM6Ci0gICAgICAgICAgICAgICAgc2VsZi5wcmludGVycignSW52YWxpZCBzeW50YXggYXQgbGluZSB7MH0sIGNoYXIgezF9JwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChlLmxpbmVudW0sIGUuY2hhcm51bSkpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoJ0ludmFsaWQgc3ludGF4IGF0IGNoYXIgezB9Jy5mb3JtYXQoZS5jaGFybnVtKSkKLSAgICAgICAgICAgIHN0YXRlbWVudGxpbmUgPSBzdGF0ZW1lbnR0ZXh0LnNwbGl0KCdcbicpW2UubGluZW51bSAtIDFdCi0gICAgICAgICAgICBzZWxmLnByaW50ZXJyKCcgIHswfScuZm9ybWF0KHN0YXRlbWVudGxpbmUpKQotICAgICAgICAgICAgc2VsZi5wcmludGVycignIHswfV4nLmZvcm1hdCgnICcgKiBlLmNoYXJudW0pKQotICAgICAgICAgICAgcmV0dXJuIFRydWUKLQotICAgICAgICB3aGlsZSBzdGF0ZW1lbnRzIGFuZCBub3Qgc3RhdGVtZW50c1stMV06Ci0gICAgICAgICAgICBzdGF0ZW1lbnRzID0gc3RhdGVtZW50c1s6LTFdCi0gICAgICAgIGlmIG5vdCBzdGF0ZW1lbnRzOgotICAgICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgaWYgZW5kdG9rZW5fZXNjYXBlZCBvciBzdGF0ZW1lbnRzWy0xXVstMV1bMF0gIT0gJ2VuZHRva2VuJzoKLSAgICAgICAgICAgIHNlbGYuc2V0X2NvbnRpbnVlX3Byb21wdCgpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgZm9yIHN0IGluIHN0YXRlbWVudHM6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfc3RhdGVtZW50KHN0LCBzdGF0ZW1lbnR0ZXh0KQotICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgotICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6Ci0gICAgICAgICAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoZSkKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgIGRlZiBoYW5kbGVfZW9mKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnR0eToKLSAgICAgICAgICAgIHByaW50KCcnKQotICAgICAgICBzdGF0ZW1lbnQgPSBzZWxmLnN0YXRlbWVudC5nZXR2YWx1ZSgpCi0gICAgICAgIGlmIHN0YXRlbWVudC5zdHJpcCgpOgotICAgICAgICAgICAgaWYgbm90IHNlbGYub25lY21kKHN0YXRlbWVudCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5wcmludGVycignSW5jb21wbGV0ZSBzdGF0ZW1lbnQgYXQgZW5kIG9mIGZpbGUnKQotICAgICAgICBzZWxmLmRvX2V4aXQoKQotCi0gICAgZGVmIGhhbmRsZV9zdGF0ZW1lbnQoc2VsZiwgdG9rZW5zLCBzcmNzdHIpOgotICAgICAgICAjIENvbmNhdCBtdWx0aS1saW5lIHN0YXRlbWVudHMgYW5kIGluc2VydCBpbnRvIGhpc3RvcnkKLSAgICAgICAgaWYgcmVhZGxpbmUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBubF9jb3VudCA9IHNyY3N0ci5jb3VudCgiXG4iKQotCi0gICAgICAgICAgICBuZXdfaGlzdCA9IHNyY3N0ci5yZXBsYWNlKCJcbiIsICIgIikucnN0cmlwKCkKLQotICAgICAgICAgICAgaWYgbmxfY291bnQgPiAxIGFuZCBzZWxmLmxhc3RfaGlzdCAhPSBuZXdfaGlzdDoKLSAgICAgICAgICAgICAgICByZWFkbGluZS5hZGRfaGlzdG9yeShuZXdfaGlzdCkKLQotICAgICAgICAgICAgc2VsZi5sYXN0X2hpc3QgPSBuZXdfaGlzdAotICAgICAgICBjbWR3b3JkID0gdG9rZW5zWzBdWzFdCi0gICAgICAgIGlmIGNtZHdvcmQgPT0gJz8nOgotICAgICAgICAgICAgY21kd29yZCA9ICdoZWxwJwotICAgICAgICBjdXN0b21faGFuZGxlciA9IGdldGF0dHIoc2VsZiwgJ2RvXycgKyBjbWR3b3JkLmxvd2VyKCksIE5vbmUpCi0gICAgICAgIGlmIGN1c3RvbV9oYW5kbGVyOgotICAgICAgICAgICAgcGFyc2VkID0gY3FscnVsZXNldC5jcWxfd2hvbGVfcGFyc2VfdG9rZW5zKHRva2Vucywgc3Jjc3RyPXNyY3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHN5bWJvbD0nY3Fsc2hDb21tYW5kJykKLSAgICAgICAgICAgIGlmIHBhcnNlZCBhbmQgbm90IHBhcnNlZC5yZW1haW5kZXI6Ci0gICAgICAgICAgICAgICAgIyBzdWNjZXNzZnVsIGNvbXBsZXRlIHBhcnNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbV9oYW5kbGVyKHBhcnNlZCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlX3BhcnNlX2Vycm9yKGNtZHdvcmQsIHRva2VucywgcGFyc2VkLCBzcmNzdHIpCi0gICAgICAgIHJldHVybiBzZWxmLnBlcmZvcm1fc3RhdGVtZW50KGNxbHJ1bGVzZXQuY3FsX2V4dHJhY3Rfb3JpZyh0b2tlbnMsIHNyY3N0cikpCi0KLSAgICBkZWYgaGFuZGxlX3BhcnNlX2Vycm9yKHNlbGYsIGNtZHdvcmQsIHRva2VucywgcGFyc2VkLCBzcmNzdHIpOgotICAgICAgICBpZiBjbWR3b3JkLmxvd2VyKCkgaW4gKCdzZWxlY3QnLCAnaW5zZXJ0JywgJ3VwZGF0ZScsICdkZWxldGUnLCAndHJ1bmNhdGUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjcmVhdGUnLCAnZHJvcCcsICdhbHRlcicsICdncmFudCcsICdyZXZva2UnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYXRjaCcsICdsaXN0Jyk6Ci0gICAgICAgICAgICAjIGhleSwgbWF5YmUgdGhleSBrbm93IGFib3V0IHNvbWUgbmV3IHN5bnRheCB3ZSBkb24ndC4gdHlwZQotICAgICAgICAgICAgIyBhc3N1bXB0aW9ucyB3b24ndCB3b3JrLCBidXQgbWF5YmUgdGhlIHF1ZXJ5IHdpbGwuCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5wZXJmb3JtX3N0YXRlbWVudChjcWxydWxlc2V0LmNxbF9leHRyYWN0X29yaWcodG9rZW5zLCBzcmNzdHIpKQotICAgICAgICBpZiBwYXJzZWQ6Ci0gICAgICAgICAgICBzZWxmLnByaW50ZXJyKCdJbXByb3BlciAlcyBjb21tYW5kIChwcm9ibGVtIGF0ICVyKS4nICUgKGNtZHdvcmQsIHBhcnNlZC5yZW1haW5kZXJbMF0pKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5wcmludGVycignSW1wcm9wZXIgJXMgY29tbWFuZC4nICUgY21kd29yZCkKLQotICAgIGRlZiBkb191c2Uoc2VsZiwgcGFyc2VkKToKLSAgICAgICAga3NuYW1lID0gcGFyc2VkLmdldF9iaW5kaW5nKCdrc25hbWUnKQotICAgICAgICBzdWNjZXNzLCBfID0gc2VsZi5wZXJmb3JtX3NpbXBsZV9zdGF0ZW1lbnQoU2ltcGxlU3RhdGVtZW50KHBhcnNlZC5leHRyYWN0X29yaWcoKSkpCi0gICAgICAgIGlmIHN1Y2Nlc3M6Ci0gICAgICAgICAgICBpZiBrc25hbWVbMF0gPT0gJyInIGFuZCBrc25hbWVbLTFdID09ICciJzoKLSAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgPSBzZWxmLmNxbF91bnByb3RlY3RfbmFtZShrc25hbWUpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9rZXlzcGFjZSA9IGtzbmFtZS5sb3dlcigpCi0KLSAgICBkZWYgZG9fc2VsZWN0KHNlbGYsIHBhcnNlZCk6Ci0gICAgICAgIHRyYWNpbmdfd2FzX2VuYWJsZWQgPSBzZWxmLnRyYWNpbmdfZW5hYmxlZAotICAgICAgICBrc25hbWUgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2tzbmFtZScpCi0gICAgICAgIHN0b3BfdHJhY2luZyA9IGtzbmFtZSA9PSAnc3lzdGVtX3RyYWNlcycgb3IgKGtzbmFtZSBpcyBOb25lIGFuZCBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgPT0gJ3N5c3RlbV90cmFjZXMnKQotICAgICAgICBzZWxmLnRyYWNpbmdfZW5hYmxlZCA9IHNlbGYudHJhY2luZ19lbmFibGVkIGFuZCBub3Qgc3RvcF90cmFjaW5nCi0gICAgICAgIHN0YXRlbWVudCA9IHBhcnNlZC5leHRyYWN0X29yaWcoKQotICAgICAgICBzZWxmLnBlcmZvcm1fc3RhdGVtZW50KHN0YXRlbWVudCkKLSAgICAgICAgc2VsZi50cmFjaW5nX2VuYWJsZWQgPSB0cmFjaW5nX3dhc19lbmFibGVkCi0KLSAgICBkZWYgcGVyZm9ybV9zdGF0ZW1lbnQoc2VsZiwgc3RhdGVtZW50KToKLQotICAgICAgICBzdG10ID0gU2ltcGxlU3RhdGVtZW50KHN0YXRlbWVudCwgY29uc2lzdGVuY3lfbGV2ZWw9c2VsZi5jb25zaXN0ZW5jeV9sZXZlbCwgc2VyaWFsX2NvbnNpc3RlbmN5X2xldmVsPXNlbGYuc2VyaWFsX2NvbnNpc3RlbmN5X2xldmVsLCBmZXRjaF9zaXplPXNlbGYucGFnZV9zaXplIGlmIHNlbGYudXNlX3BhZ2luZyBlbHNlIE5vbmUpCi0gICAgICAgIHN1Y2Nlc3MsIGZ1dHVyZSA9IHNlbGYucGVyZm9ybV9zaW1wbGVfc3RhdGVtZW50KHN0bXQpCi0KLSAgICAgICAgaWYgZnV0dXJlOgotICAgICAgICAgICAgaWYgZnV0dXJlLndhcm5pbmdzOgotICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfd2FybmluZ3MoZnV0dXJlLndhcm5pbmdzKQotCi0gICAgICAgICAgICBpZiBzZWxmLnRyYWNpbmdfZW5hYmxlZDoKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGZvciB0cmFjZSBpbiBmdXR1cmUuZ2V0X2FsbF9xdWVyeV90cmFjZXMobWF4X3dhaXRfcGVyPXNlbGYubWF4X3RyYWNlX3dhaXQsIHF1ZXJ5X2NsPXNlbGYuY29uc2lzdGVuY3lfbGV2ZWwpOgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfdHJhY2Uoc2VsZiwgdHJhY2UpCi0gICAgICAgICAgICAgICAgZXhjZXB0IFRyYWNlVW5hdmFpbGFibGU6Ci0gICAgICAgICAgICAgICAgICAgIG1zZyA9ICJTdGF0ZW1lbnQgdHJhY2UgZGlkIG5vdCBjb21wbGV0ZSB3aXRoaW4gJWQgc2Vjb25kczsgdHJhY2UgZGF0YSBtYXkgYmUgaW5jb21wbGV0ZS4iICUgKHNlbGYuc2Vzc2lvbi5tYXhfdHJhY2Vfd2FpdCwpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQobXNnLCBjb2xvcj1SRUQpCi0gICAgICAgICAgICAgICAgICAgIGZvciB0cmFjZV9pZCBpbiBmdXR1cmUuZ2V0X3F1ZXJ5X3RyYWNlX2lkcygpOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93X3Nlc3Npb24odHJhY2VfaWQsIHBhcnRpYWxfc2Vzc2lvbj1UcnVlKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCJVbmFibGUgdG8gZmV0Y2ggcXVlcnkgdHJhY2U6ICVzIiAlIChzdHIoZXJyKSwpKQotCi0gICAgICAgIHJldHVybiBzdWNjZXNzCi0KLSAgICBkZWYgcGFyc2VfZm9yX3NlbGVjdF9tZXRhKHNlbGYsIHF1ZXJ5X3N0cmluZyk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHBhcnNlZCA9IGNxbHJ1bGVzZXQuY3FsX3BhcnNlKHF1ZXJ5X3N0cmluZylbMV0KLSAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICBrcyA9IHNlbGYuY3FsX3VucHJvdGVjdF9uYW1lKHBhcnNlZC5nZXRfYmluZGluZygna3NuYW1lJywgTm9uZSkpCi0gICAgICAgIG5hbWUgPSBzZWxmLmNxbF91bnByb3RlY3RfbmFtZShwYXJzZWQuZ2V0X2JpbmRpbmcoJ2NmbmFtZScsIE5vbmUpKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRfdGFibGVfbWV0YShrcywgbmFtZSkKLSAgICAgICAgZXhjZXB0IENvbHVtbkZhbWlseU5vdEZvdW5kOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmdldF92aWV3X21ldGEoa3MsIG5hbWUpCi0gICAgICAgICAgICBleGNlcHQgTWF0ZXJpYWxpemVkVmlld05vdEZvdW5kOgotICAgICAgICAgICAgICAgIHJhaXNlIE9iamVjdE5vdEZvdW5kKCIne30nIG5vdCBmb3VuZCBpbiBrZXlzcGFjZSAne30nIi5mb3JtYXQobmFtZSwga3MpKQotCi0gICAgZGVmIHBhcnNlX2Zvcl91cGRhdGVfbWV0YShzZWxmLCBxdWVyeV9zdHJpbmcpOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBwYXJzZWQgPSBjcWxydWxlc2V0LmNxbF9wYXJzZShxdWVyeV9zdHJpbmcpWzFdCi0gICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAga3MgPSBzZWxmLmNxbF91bnByb3RlY3RfbmFtZShwYXJzZWQuZ2V0X2JpbmRpbmcoJ2tzbmFtZScsIE5vbmUpKQotICAgICAgICBjZiA9IHNlbGYuY3FsX3VucHJvdGVjdF9uYW1lKHBhcnNlZC5nZXRfYmluZGluZygnY2ZuYW1lJykpCi0gICAgICAgIHJldHVybiBzZWxmLmdldF90YWJsZV9tZXRhKGtzLCBjZikKLQotICAgIGRlZiBwZXJmb3JtX3NpbXBsZV9zdGF0ZW1lbnQoc2VsZiwgc3RhdGVtZW50KToKLSAgICAgICAgaWYgbm90IHN0YXRlbWVudDoKLSAgICAgICAgICAgIHJldHVybiBGYWxzZSwgTm9uZQotCi0gICAgICAgIGZ1dHVyZSA9IHNlbGYuc2Vzc2lvbi5leGVjdXRlX2FzeW5jKHN0YXRlbWVudCwgdHJhY2U9c2VsZi50cmFjaW5nX2VuYWJsZWQpCi0gICAgICAgIHJlc3VsdCA9IE5vbmUKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmVzdWx0ID0gZnV0dXJlLnJlc3VsdCgpCi0gICAgICAgIGV4Y2VwdCBDUUxfRVJST1JTIGFzIGVycjoKLSAgICAgICAgICAgIGVycl9tc2cgPSBlcnIubWVzc2FnZSBpZiBoYXNhdHRyKGVyciwgJ21lc3NhZ2UnKSBlbHNlIHN0cihlcnIpCi0gICAgICAgICAgICBzZWxmLnByaW50ZXJyKHN0cihlcnIuX19jbGFzc19fLl9fbmFtZV9fKSArICI6ICIgKyBlcnJfbXNnKQotICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgotICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjawotICAgICAgICAgICAgc2VsZi5wcmludGVycih0cmFjZWJhY2suZm9ybWF0X2V4YygpKQotCi0gICAgICAgICMgRXZlbiBpZiBzdGF0ZW1lbnQgZmFpbGVkIHdlIHRyeSB0byByZWZyZXNoIHNjaGVtYSBpZiBub3QgYWdyZWVkIChzZWUgQ0FTU0FORFJBLTk2ODkpCi0gICAgICAgIGlmIG5vdCBmdXR1cmUuaXNfc2NoZW1hX2FncmVlZDoKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzZWxmLmNvbm4ucmVmcmVzaF9zY2hlbWFfbWV0YWRhdGEoNSkgICMgd2lsbCB0aHJvdyBleGNlcHRpb24gaWYgdGhlcmUgaXMgYSBzY2hlbWEgbWlzbWF0Y2gKLSAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgc2VsZi5wcmludGVycigiV2FybmluZzogc2NoZW1hIHZlcnNpb24gbWlzbWF0Y2ggZGV0ZWN0ZWQ7IGNoZWNrIHRoZSBzY2hlbWEgdmVyc2lvbnMgb2YgeW91ciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9kZXMgaW4gc3lzdGVtLmxvY2FsIGFuZCBzeXN0ZW0ucGVlcnMuIikKLSAgICAgICAgICAgICAgICBzZWxmLmNvbm4ucmVmcmVzaF9zY2hlbWFfbWV0YWRhdGEoLTEpCi0KLSAgICAgICAgaWYgcmVzdWx0IGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UsIE5vbmUKLQotICAgICAgICBpZiBzdGF0ZW1lbnQucXVlcnlfc3RyaW5nWzo2XS5sb3dlcigpID09ICdzZWxlY3QnOgotICAgICAgICAgICAgc2VsZi5wcmludF9yZXN1bHQocmVzdWx0LCBzZWxmLnBhcnNlX2Zvcl9zZWxlY3RfbWV0YShzdGF0ZW1lbnQucXVlcnlfc3RyaW5nKSkKLSAgICAgICAgZWxpZiBzdGF0ZW1lbnQucXVlcnlfc3RyaW5nLmxvd2VyKCkuc3RhcnRzd2l0aCgibGlzdCB1c2VycyIpIG9yIHN0YXRlbWVudC5xdWVyeV9zdHJpbmcubG93ZXIoKS5zdGFydHN3aXRoKCJsaXN0IHJvbGVzIik6Ci0gICAgICAgICAgICBzZWxmLnByaW50X3Jlc3VsdChyZXN1bHQsIHNlbGYuZ2V0X3RhYmxlX21ldGEoJ3N5c3RlbV9hdXRoJywgJ3JvbGVzJykpCi0gICAgICAgIGVsaWYgc3RhdGVtZW50LnF1ZXJ5X3N0cmluZy5sb3dlcigpLnN0YXJ0c3dpdGgoImxpc3QiKToKLSAgICAgICAgICAgIHNlbGYucHJpbnRfcmVzdWx0KHJlc3VsdCwgc2VsZi5nZXRfdGFibGVfbWV0YSgnc3lzdGVtX2F1dGgnLCAncm9sZV9wZXJtaXNzaW9ucycpKQotICAgICAgICBlbGlmIHJlc3VsdDoKLSAgICAgICAgICAgICMgQ0FTIElOU0VSVC9VUERBVEUKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoIiIpCi0gICAgICAgICAgICBzZWxmLnByaW50X3N0YXRpY19yZXN1bHQocmVzdWx0LCBzZWxmLnBhcnNlX2Zvcl91cGRhdGVfbWV0YShzdGF0ZW1lbnQucXVlcnlfc3RyaW5nKSwgd2l0aF9oZWFkZXI9VHJ1ZSwgdHR5PXNlbGYudHR5KQotICAgICAgICBzZWxmLmZsdXNoX291dHB1dCgpCi0gICAgICAgIHJldHVybiBUcnVlLCBmdXR1cmUKLQotICAgIGRlZiBwcmludF9yZXN1bHQoc2VsZiwgcmVzdWx0LCB0YWJsZV9tZXRhKToKLSAgICAgICAgc2VsZi5kZWNvZGluZ19lcnJvcnMgPSBbXQotCi0gICAgICAgIHNlbGYud3JpdGVyZXN1bHQoIiIpCi0KLSAgICAgICAgZGVmIHByaW50X2FsbChyZXN1bHQsIHRhYmxlX21ldGEsIHR0eSk6Ci0gICAgICAgICAgICAjIFJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdG90YWwKLSAgICAgICAgICAgIG51bV9yb3dzID0gMAotICAgICAgICAgICAgaXNfZmlyc3QgPSBUcnVlCi0gICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgICMgQWx3YXlzIHByaW50IGZvciB0aGUgZmlyc3QgcGFnZSBldmVuIGl0IGlzIGVtcHR5Ci0gICAgICAgICAgICAgICAgaWYgcmVzdWx0LmN1cnJlbnRfcm93cyBvciBpc19maXJzdDoKLSAgICAgICAgICAgICAgICAgICAgd2l0aF9oZWFkZXIgPSBpc19maXJzdCBvciB0dHkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF9zdGF0aWNfcmVzdWx0KHJlc3VsdCwgdGFibGVfbWV0YSwgd2l0aF9oZWFkZXIsIHR0eSwgbnVtX3Jvd3MpCi0gICAgICAgICAgICAgICAgICAgIG51bV9yb3dzICs9IGxlbihyZXN1bHQuY3VycmVudF9yb3dzKQotICAgICAgICAgICAgICAgIGlmIHJlc3VsdC5oYXNfbW9yZV9wYWdlczoKLSAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zaHVudGVkX3F1ZXJ5X291dCBpcyBOb25lIGFuZCB0dHk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIE9ubHkgcGF1c2Ugd2hlbiBub3QgY2FwdHVyaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoIi0tLU1PUkUtLS0iKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQuZmV0Y2hfbmV4dF9wYWdlKCkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBpZiBub3QgdHR5OgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZXJlc3VsdCgiIikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBpc19maXJzdCA9IEZhbHNlCi0gICAgICAgICAgICByZXR1cm4gbnVtX3Jvd3MKLQotICAgICAgICBudW1fcm93cyA9IHByaW50X2FsbChyZXN1bHQsIHRhYmxlX21ldGEsIHNlbGYudHR5KQotICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCIoJWQgcm93cykiICUgbnVtX3Jvd3MpCi0KLSAgICAgICAgaWYgc2VsZi5kZWNvZGluZ19lcnJvcnM6Ci0gICAgICAgICAgICBmb3IgZXJyIGluIHNlbGYuZGVjb2RpbmdfZXJyb3JzWzoyXToKLSAgICAgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KGVyci5tZXNzYWdlKCksIGNvbG9yPVJFRCkKLSAgICAgICAgICAgIGlmIGxlbihzZWxmLmRlY29kaW5nX2Vycm9ycykgPiAyOgotICAgICAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJyVkIG1vcmUgZGVjb2RpbmcgZXJyb3JzIHN1cHByZXNzZWQuJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAobGVuKHNlbGYuZGVjb2RpbmdfZXJyb3JzKSAtIDIpLCBjb2xvcj1SRUQpCi0KLSAgICBkZWYgcHJpbnRfc3RhdGljX3Jlc3VsdChzZWxmLCByZXN1bHQsIHRhYmxlX21ldGEsIHdpdGhfaGVhZGVyLCB0dHksIHJvd19jb3VudF9vZmZzZXQ9MCk6Ci0gICAgICAgIGlmIG5vdCByZXN1bHQuY29sdW1uX25hbWVzIGFuZCBub3QgdGFibGVfbWV0YToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIGNvbHVtbl9uYW1lcyA9IHJlc3VsdC5jb2x1bW5fbmFtZXMgb3IgbGlzdCh0YWJsZV9tZXRhLmNvbHVtbnMua2V5cygpKQotICAgICAgICBmb3JtYXR0ZWRfbmFtZXMgPSBbc2VsZi5teWZvcm1hdF9jb2xuYW1lKG5hbWUsIHRhYmxlX21ldGEpIGZvciBuYW1lIGluIGNvbHVtbl9uYW1lc10KLSAgICAgICAgaWYgbm90IHJlc3VsdC5jdXJyZW50X3Jvd3M6Ci0gICAgICAgICAgICAjIHByaW50IGhlYWRlciBvbmx5Ci0gICAgICAgICAgICBzZWxmLnByaW50X2Zvcm1hdHRlZF9yZXN1bHQoZm9ybWF0dGVkX25hbWVzLCBOb25lLCB3aXRoX2hlYWRlcj1UcnVlLCB0dHk9dHR5KQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgY3FsX3R5cGVzID0gW10KLSAgICAgICAgaWYgcmVzdWx0LmNvbHVtbl90eXBlczoKLSAgICAgICAgICAgIGtzX25hbWUgPSB0YWJsZV9tZXRhLmtleXNwYWNlX25hbWUgaWYgdGFibGVfbWV0YSBlbHNlIHNlbGYuY3VycmVudF9rZXlzcGFjZQotICAgICAgICAgICAga3NfbWV0YSA9IHNlbGYuY29ubi5tZXRhZGF0YS5rZXlzcGFjZXMuZ2V0KGtzX25hbWUsIE5vbmUpCi0gICAgICAgICAgICBjcWxfdHlwZXMgPSBbQ3FsVHlwZShjcWxfdHlwZW5hbWUodCksIGtzX21ldGEpIGZvciB0IGluIHJlc3VsdC5jb2x1bW5fdHlwZXNdCi0KLSAgICAgICAgZm9ybWF0dGVkX3ZhbHVlcyA9IFtsaXN0KG1hcChzZWxmLm15Zm9ybWF0X3ZhbHVlLCBbcm93W2NdIGZvciBjIGluIGNvbHVtbl9uYW1lc10sIGNxbF90eXBlcykpIGZvciByb3cgaW4gcmVzdWx0LmN1cnJlbnRfcm93c10KLQotICAgICAgICBpZiBzZWxmLmV4cGFuZF9lbmFibGVkOgotICAgICAgICAgICAgc2VsZi5wcmludF9mb3JtYXR0ZWRfcmVzdWx0X3ZlcnRpY2FsbHkoZm9ybWF0dGVkX25hbWVzLCBmb3JtYXR0ZWRfdmFsdWVzLCByb3dfY291bnRfb2Zmc2V0KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5wcmludF9mb3JtYXR0ZWRfcmVzdWx0KGZvcm1hdHRlZF9uYW1lcywgZm9ybWF0dGVkX3ZhbHVlcywgd2l0aF9oZWFkZXIsIHR0eSkKLQotICAgIGRlZiBwcmludF9mb3JtYXR0ZWRfcmVzdWx0KHNlbGYsIGZvcm1hdHRlZF9uYW1lcywgZm9ybWF0dGVkX3ZhbHVlcywgd2l0aF9oZWFkZXIsIHR0eSk6Ci0gICAgICAgICMgZGV0ZXJtaW5lIGNvbHVtbiB3aWR0aHMKLSAgICAgICAgd2lkdGhzID0gW24uZGlzcGxheXdpZHRoIGZvciBuIGluIGZvcm1hdHRlZF9uYW1lc10KLSAgICAgICAgaWYgZm9ybWF0dGVkX3ZhbHVlcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGZvciBmbXRyb3cgaW4gZm9ybWF0dGVkX3ZhbHVlczoKLSAgICAgICAgICAgICAgICBmb3IgbnVtLCBjb2wgaW4gZW51bWVyYXRlKGZtdHJvdyk6Ci0gICAgICAgICAgICAgICAgICAgIHdpZHRoc1tudW1dID0gbWF4KHdpZHRoc1tudW1dLCBjb2wuZGlzcGxheXdpZHRoKQotCi0gICAgICAgICMgcHJpbnQgaGVhZGVyCi0gICAgICAgIGlmIHdpdGhfaGVhZGVyOgotICAgICAgICAgICAgaGVhZGVyID0gJyB8ICcuam9pbihoZHIubGp1c3QodywgY29sb3I9c2VsZi5jb2xvcikgZm9yIChoZHIsIHcpIGluIHppcChmb3JtYXR0ZWRfbmFtZXMsIHdpZHRocykpCi0gICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCcgJyArIGhlYWRlci5yc3RyaXAoKSkKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJy0lcy0nICUgJy0rLScuam9pbignLScgKiB3IGZvciB3IGluIHdpZHRocykpCi0KLSAgICAgICAgIyBzdG9wIGlmIHRoZXJlIGFyZSBubyByb3dzCi0gICAgICAgIGlmIGZvcm1hdHRlZF92YWx1ZXMgaXMgTm9uZToKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoIiIpCi0gICAgICAgICAgICByZXR1cm4KLQotICAgICAgICAjIHByaW50IHJvdyBkYXRhCi0gICAgICAgIGZvciByb3cgaW4gZm9ybWF0dGVkX3ZhbHVlczoKLSAgICAgICAgICAgIGxpbmUgPSAnIHwgJy5qb2luKGNvbC5yanVzdCh3LCBjb2xvcj1zZWxmLmNvbG9yKSBmb3IgKGNvbCwgdykgaW4gemlwKHJvdywgd2lkdGhzKSkKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJyAnICsgbGluZSkKLQotICAgICAgICBpZiB0dHk6Ci0gICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCIiKQotCi0gICAgZGVmIHByaW50X2Zvcm1hdHRlZF9yZXN1bHRfdmVydGljYWxseShzZWxmLCBmb3JtYXR0ZWRfbmFtZXMsIGZvcm1hdHRlZF92YWx1ZXMsIHJvd19jb3VudF9vZmZzZXQpOgotICAgICAgICBtYXhfY29sX3dpZHRoID0gbWF4KFtuLmRpc3BsYXl3aWR0aCBmb3IgbiBpbiBmb3JtYXR0ZWRfbmFtZXNdKQotICAgICAgICBtYXhfdmFsX3dpZHRoID0gbWF4KFtuLmRpc3BsYXl3aWR0aCBmb3Igcm93IGluIGZvcm1hdHRlZF92YWx1ZXMgZm9yIG4gaW4gcm93XSkKLQotICAgICAgICAjIGZvciBlYWNoIHJvdyByZXR1cm5lZCwgbGlzdCBhbGwgdGhlIGNvbHVtbi12YWx1ZSBwYWlycwotICAgICAgICBmb3IgaSwgcm93IGluIGVudW1lcmF0ZShmb3JtYXR0ZWRfdmFsdWVzKToKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoIkAgUm93ICVkIiAlIChyb3dfY291bnRfb2Zmc2V0ICsgaSArIDEpKQotICAgICAgICAgICAgc2VsZi53cml0ZXJlc3VsdCgnLSVzLScgJSAnLSstJy5qb2luKFsnLScgKiBtYXhfY29sX3dpZHRoLCAnLScgKiBtYXhfdmFsX3dpZHRoXSkpCi0gICAgICAgICAgICBmb3IgZmllbGRfaWQsIGZpZWxkIGluIGVudW1lcmF0ZShyb3cpOgotICAgICAgICAgICAgICAgIGNvbHVtbiA9IGZvcm1hdHRlZF9uYW1lc1tmaWVsZF9pZF0ubGp1c3QobWF4X2NvbF93aWR0aCwgY29sb3I9c2VsZi5jb2xvcikKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpZWxkLmxqdXN0KGZpZWxkLmRpc3BsYXl3aWR0aCwgY29sb3I9c2VsZi5jb2xvcikKLSAgICAgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCcgJyArICIgfCAiLmpvaW4oW2NvbHVtbiwgdmFsdWVdKSkKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJycpCi0KLSAgICBkZWYgcHJpbnRfd2FybmluZ3Moc2VsZiwgd2FybmluZ3MpOgotICAgICAgICBpZiB3YXJuaW5ncyBpcyBOb25lIG9yIGxlbih3YXJuaW5ncykgPT0gMDoKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJycpCi0gICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJ1dhcm5pbmdzIDonKQotICAgICAgICBmb3Igd2FybmluZyBpbiB3YXJuaW5nczoKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQod2FybmluZykKLSAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJycpCi0KLSAgICBkZWYgZW1wdHlsaW5lKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBkZWYgcGFyc2VsaW5lKHNlbGYsIGxpbmUpOgotICAgICAgICAjIHRoaXMgc2hvdWxkbid0IGJlIG5lZWRlZAotICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgICBkZWYgY29tcGxldGUoc2VsZiwgdGV4dCwgc3RhdGUpOgotICAgICAgICBpZiByZWFkbGluZSBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIHN0YXRlID09IDA6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5jb21wbGV0aW9uX21hdGNoZXMgPSBzZWxmLmZpbmRfY29tcGxldGlvbnModGV4dCkKLSAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgaWYgZGVidWdfY29tcGxldGlvbjoKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjawotICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICByYWlzZQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5jb21wbGV0aW9uX21hdGNoZXNbc3RhdGVdCi0gICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgIGRlZiBmaW5kX2NvbXBsZXRpb25zKHNlbGYsIHRleHQpOgotICAgICAgICBjdXJsaW5lID0gcmVhZGxpbmUuZ2V0X2xpbmVfYnVmZmVyKCkKLSAgICAgICAgcHJldmxpbmVzID0gc2VsZi5zdGF0ZW1lbnQuZ2V0dmFsdWUoKQotICAgICAgICB3aG9sZXN0bXQgPSBwcmV2bGluZXMgKyBjdXJsaW5lCi0gICAgICAgIGJlZ2lkeCA9IHJlYWRsaW5lLmdldF9iZWdpZHgoKSArIGxlbihwcmV2bGluZXMpCi0gICAgICAgIHN0dWZmX3RvX2NvbXBsZXRlID0gd2hvbGVzdG10WzpiZWdpZHhdCi0gICAgICAgIHJldHVybiBjcWxydWxlc2V0LmNxbF9jb21wbGV0ZShzdHVmZl90b19jb21wbGV0ZSwgdGV4dCwgY2Fzc2FuZHJhX2Nvbm49c2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnPWRlYnVnX2NvbXBsZXRpb24sIHN0YXJ0c3ltYm9sPSdjcWxzaENvbW1hbmQnKQotCi0gICAgZGVmIHNldF9wcm9tcHQoc2VsZiwgcHJvbXB0LCBwcmVwZW5kX3VzZXI9RmFsc2UpOgotICAgICAgICBpZiBwcmVwZW5kX3VzZXIgYW5kIHNlbGYudXNlcm5hbWU6Ci0gICAgICAgICAgICBzZWxmLnByb21wdCA9ICJ7MH1AezF9Ii5mb3JtYXQoc2VsZi51c2VybmFtZSwgcHJvbXB0KQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYucHJvbXB0ID0gcHJvbXB0Ci0KLSAgICBkZWYgY3FsX3VucHJvdGVjdF9uYW1lKHNlbGYsIG5hbWVzdHIpOgotICAgICAgICBpZiBuYW1lc3RyIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgcmV0dXJuIGNxbHJ1bGVzZXQuZGVxdW90ZV9uYW1lKG5hbWVzdHIpCi0KLSAgICBkZWYgY3FsX3VucHJvdGVjdF92YWx1ZShzZWxmLCB2YWxzdHIpOgotICAgICAgICBpZiB2YWxzdHIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4gY3FscnVsZXNldC5kZXF1b3RlX3ZhbHVlKHZhbHN0cikKLQotICAgIGRlZiBfY29sdW1uaXplX3VuaWNvZGUoc2VsZiwgbmFtZV9saXN0KToKLSAgICAgICAgIiIiCi0gICAgICAgIFVzZWQgd2hlbiBjb2x1bW5pemluZyBpZGVudGlmaWVycyB0aGF0IG1heSBjb250YWluIHVuaWNvZGUKLSAgICAgICAgIiIiCi0gICAgICAgIG5hbWVzID0gW24gZm9yIG4gaW4gbmFtZV9saXN0XQotICAgICAgICBjbWQuQ21kLmNvbHVtbml6ZShzZWxmLCBuYW1lcykKLSAgICAgICAgcHJpbnQoJycpCi0KLSAgICBkZWYgZG9fZGVzY3JpYmUoc2VsZiwgcGFyc2VkKToKLQotICAgICAgICAiIiIKLSAgICAgICAgREVTQ1JJQkUgW2NxbHNoIG9ubHldCi0KLSAgICAgICAgKERFU0MgbWF5IGJlIHVzZWQgYXMgYSBzaG9ydGhhbmQuKQotCi0gICAgICAgICAgT3V0cHV0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29ubmVjdGVkIENhc3NhbmRyYSBjbHVzdGVyLCBvciBhYm91dAotICAgICAgICAgIHRoZSBkYXRhIG9iamVjdHMgc3RvcmVkIGluIHRoZSBjbHVzdGVyLiBVc2UgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgd2F5czoKLQotICAgICAgICBERVNDUklCRSBLRVlTUEFDRVMKLQotICAgICAgICAgIE91dHB1dCB0aGUgbmFtZXMgb2YgYWxsIGtleXNwYWNlcy4KLQotICAgICAgICBERVNDUklCRSBLRVlTUEFDRSBbPGtleXNwYWNlbmFtZT5dCi0KLSAgICAgICAgICBPdXRwdXQgQ1FMIGNvbW1hbmRzIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgZ2l2ZW4ga2V5c3BhY2UsCi0gICAgICAgICAgYW5kIHRoZSBvYmplY3RzIGluIGl0IChzdWNoIGFzIHRhYmxlcywgdHlwZXMsIGZ1bmN0aW9ucywgZXRjLikuCi0gICAgICAgICAgSW4gc29tZSBjYXNlcywgYXMgdGhlIENRTCBpbnRlcmZhY2UgbWF0dXJlcywgdGhlcmUgd2lsbCBiZSBzb21lIG1ldGFkYXRhCi0gICAgICAgICAgYWJvdXQgYSBrZXlzcGFjZSB0aGF0IGlzIG5vdCByZXByZXNlbnRhYmxlIHdpdGggQ1FMLiBUaGF0IG1ldGFkYXRhIHdpbGwgbm90IGJlIHNob3duLgotICAgICAgICAgIFRoZSAnPGtleXNwYWNlbmFtZT4nIGFyZ3VtZW50IG1heSBiZSBvbWl0dGVkLCBpbiB3aGljaCBjYXNlIHRoZSBjdXJyZW50Ci0gICAgICAgICAga2V5c3BhY2Ugd2lsbCBiZSBkZXNjcmliZWQuCi0KLSAgICAgICAgREVTQ1JJQkUgVEFCTEVTCi0KLSAgICAgICAgICBPdXRwdXQgdGhlIG5hbWVzIG9mIGFsbCB0YWJsZXMgaW4gdGhlIGN1cnJlbnQga2V5c3BhY2UsIG9yIGluIGFsbAotICAgICAgICAgIGtleXNwYWNlcyBpZiB0aGVyZSBpcyBubyBjdXJyZW50IGtleXNwYWNlLgotCi0gICAgICAgIERFU0NSSUJFIFRBQkxFIFs8a2V5c3BhY2U+Ll08dGFibGVuYW1lPgotCi0gICAgICAgICAgT3V0cHV0IENRTCBjb21tYW5kcyB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGdpdmVuIHRhYmxlLgotICAgICAgICAgIEluIHNvbWUgY2FzZXMsIGFzIGFib3ZlLCB0aGVyZSBtYXkgYmUgdGFibGUgbWV0YWRhdGEgd2hpY2ggaXMgbm90Ci0gICAgICAgICAgcmVwcmVzZW50YWJsZSBhbmQgd2hpY2ggd2lsbCBub3QgYmUgc2hvd24uCi0KLSAgICAgICAgREVTQ1JJQkUgSU5ERVggPGluZGV4bmFtZT4KLQotICAgICAgICAgIE91dHB1dCB0aGUgQ1FMIGNvbW1hbmQgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlY3JlYXRlIHRoZSBnaXZlbiBpbmRleC4KLSAgICAgICAgICBJbiBzb21lIGNhc2VzLCB0aGVyZSBtYXkgYmUgaW5kZXggbWV0YWRhdGEgd2hpY2ggaXMgbm90IHJlcHJlc2VudGFibGUKLSAgICAgICAgICBhbmQgd2hpY2ggd2lsbCBub3QgYmUgc2hvd24uCi0KLSAgICAgICAgREVTQ1JJQkUgTUFURVJJQUxJWkVEIFZJRVcgPHZpZXduYW1lPgotCi0gICAgICAgICAgT3V0cHV0IHRoZSBDUUwgY29tbWFuZCB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGdpdmVuIG1hdGVyaWFsaXplZCB2aWV3LgotICAgICAgICAgIEluIHNvbWUgY2FzZXMsIHRoZXJlIG1heSBiZSBtYXRlcmlhbGl6ZWQgdmlldyBtZXRhZGF0YSB3aGljaCBpcyBub3QgcmVwcmVzZW50YWJsZQotICAgICAgICAgIGFuZCB3aGljaCB3aWxsIG5vdCBiZSBzaG93bi4KLQotICAgICAgICBERVNDUklCRSBDTFVTVEVSCi0KLSAgICAgICAgICBPdXRwdXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbm5lY3RlZCBDYXNzYW5kcmEgY2x1c3Rlciwgc3VjaCBhcyB0aGUKLSAgICAgICAgICBjbHVzdGVyIG5hbWUsIGFuZCB0aGUgcGFydGl0aW9uZXIgYW5kIHNuaXRjaCBpbiB1c2UuIFdoZW4geW91IGFyZQotICAgICAgICAgIGNvbm5lY3RlZCB0byBhIG5vbi1zeXN0ZW0ga2V5c3BhY2UsIGFsc28gc2hvd3MgZW5kcG9pbnQtcmFuZ2UKLSAgICAgICAgICBvd25lcnNoaXAgaW5mb3JtYXRpb24gZm9yIHRoZSBDYXNzYW5kcmEgcmluZy4KLQotICAgICAgICBERVNDUklCRSBbRlVMTF0gU0NIRU1BCi0KLSAgICAgICAgICBPdXRwdXQgQ1FMIGNvbW1hbmRzIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgZW50aXJlIChub24tc3lzdGVtKSBzY2hlbWEuCi0gICAgICAgICAgV29ya3MgYXMgdGhvdWdoICJERVNDUklCRSBLRVlTUEFDRSBrIiB3YXMgaW52b2tlZCBmb3IgZWFjaCBub24tc3lzdGVtIGtleXNwYWNlCi0gICAgICAgICAgay4gVXNlIERFU0NSSUJFIEZVTEwgU0NIRU1BIHRvIGluY2x1ZGUgdGhlIHN5c3RlbSBrZXlzcGFjZXMuCi0KLSAgICAgICAgREVTQ1JJQkUgVFlQRVMKLQotICAgICAgICAgIE91dHB1dCB0aGUgbmFtZXMgb2YgYWxsIHVzZXItZGVmaW5lZC10eXBlcyBpbiB0aGUgY3VycmVudCBrZXlzcGFjZSwgb3IgaW4gYWxsCi0gICAgICAgICAga2V5c3BhY2VzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQga2V5c3BhY2UuCi0KLSAgICAgICAgREVTQ1JJQkUgVFlQRSBbPGtleXNwYWNlPi5dPHR5cGU+Ci0KLSAgICAgICAgICBPdXRwdXQgdGhlIENRTCBjb21tYW5kIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgZ2l2ZW4gdXNlci1kZWZpbmVkLXR5cGUuCi0KLSAgICAgICAgREVTQ1JJQkUgRlVOQ1RJT05TCi0KLSAgICAgICAgICBPdXRwdXQgdGhlIG5hbWVzIG9mIGFsbCB1c2VyLWRlZmluZWQtZnVuY3Rpb25zIGluIHRoZSBjdXJyZW50IGtleXNwYWNlLCBvciBpbiBhbGwKLSAgICAgICAgICBrZXlzcGFjZXMgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBrZXlzcGFjZS4KLQotICAgICAgICBERVNDUklCRSBGVU5DVElPTiBbPGtleXNwYWNlPi5dPGZ1bmN0aW9uPgotCi0gICAgICAgICAgT3V0cHV0IHRoZSBDUUwgY29tbWFuZCB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGdpdmVuIHVzZXItZGVmaW5lZC1mdW5jdGlvbi4KLQotICAgICAgICBERVNDUklCRSBBR0dSRUdBVEVTCi0KLSAgICAgICAgICBPdXRwdXQgdGhlIG5hbWVzIG9mIGFsbCB1c2VyLWRlZmluZWQtYWdncmVnYXRlcyBpbiB0aGUgY3VycmVudCBrZXlzcGFjZSwgb3IgaW4gYWxsCi0gICAgICAgICAga2V5c3BhY2VzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQga2V5c3BhY2UuCi0KLSAgICAgICAgREVTQ1JJQkUgQUdHUkVHQVRFIFs8a2V5c3BhY2U+Ll08YWdncmVnYXRlPgotCi0gICAgICAgICAgT3V0cHV0IHRoZSBDUUwgY29tbWFuZCB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGdpdmVuIHVzZXItZGVmaW5lZC1hZ2dyZWdhdGUuCi0KLSAgICAgICAgREVTQ1JJQkUgPG9iam5hbWU+Ci0KLSAgICAgICAgICBPdXRwdXQgQ1FMIGNvbW1hbmRzIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgZW50aXJlIG9iamVjdCBzY2hlbWEsCi0gICAgICAgICAgd2hlcmUgb2JqZWN0IGNhbiBiZSBlaXRoZXIgYSBrZXlzcGFjZSBvciBhIHRhYmxlIG9yIGFuIGluZGV4IG9yIGEgbWF0ZXJpYWxpemVkCi0gICAgICAgICAgdmlldyAoaW4gdGhpcyBvcmRlcikuCi0gICAgICAgICIiIgotICAgICAgICBzdG10ID0gU2ltcGxlU3RhdGVtZW50KHBhcnNlZC5leHRyYWN0X29yaWcoKSwgY29uc2lzdGVuY3lfbGV2ZWw9Y2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwuTE9DQUxfT05FLCBmZXRjaF9zaXplPXNlbGYucGFnZV9zaXplIGlmIHNlbGYudXNlX3BhZ2luZyBlbHNlIE5vbmUpCi0gICAgICAgIGZ1dHVyZSA9IHNlbGYuc2Vzc2lvbi5leGVjdXRlX2FzeW5jKHN0bXQpCi0KLSAgICAgICAgaWYgc2VsZi5jb25uZWN0aW9uX3ZlcnNpb25zWydidWlsZCddWzBdIDwgJzQnOgotICAgICAgICAgICAgcHJpbnQoJ1xuV0FSTjogREVTQ1JJQkV8REVTQyB3YXMgbW92ZWQgdG8gc2VydmVyIHNpZGUgaW4gQ2Fzc2FuZHJhIDQuMC4gQXMgYSBjb25zZXF1ZW5jZSBERVNSSUJFfERFU0MgJwotICAgICAgICAgICAgICAgICAgJ3dpbGwgbm90IHdvcmsgaW4gY3Fsc2ggJXIgY29ubmVjdGVkIHRvIENhc3NhbmRyYSAlciwgdGhlIHZlcnNpb24gdGhhdCB5b3UgYXJlIGNvbm5lY3RlZCB0by4gJwotICAgICAgICAgICAgICAgICAgJ0RFU0NSSUJFIGRvZXMgbm90IGV4aXN0IHNlcnZlciBzaWRlIHByaW9yIENhc3NhbmRyYSA0LjAuJwotICAgICAgICAgICAgICAgICAgJSAodmVyc2lvbiwgc2VsZi5jb25uZWN0aW9uX3ZlcnNpb25zWydidWlsZCddKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBmdXR1cmUucmVzdWx0KCkKLQotICAgICAgICAgICAgICAgIHdoYXQgPSBwYXJzZWQubWF0Y2hlZFsxXVsxXS5sb3dlcigpCi0KLSAgICAgICAgICAgICAgICBpZiB3aGF0IGluICgnY29sdW1uZmFtaWxpZXMnLCAndGFibGVzJywgJ3R5cGVzJywgJ2Z1bmN0aW9ucycsICdhZ2dyZWdhdGVzJyk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpYmVfbGlzdChyZXN1bHQpCi0gICAgICAgICAgICAgICAgZWxpZiB3aGF0ID09ICdrZXlzcGFjZXMnOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc2NyaWJlX2tleXNwYWNlcyhyZXN1bHQpCi0gICAgICAgICAgICAgICAgZWxpZiB3aGF0ID09ICdjbHVzdGVyJzoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXNjcmliZV9jbHVzdGVyKHJlc3VsdCkKLSAgICAgICAgICAgICAgICBlbGlmIHdoYXQ6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpYmVfZWxlbWVudChyZXN1bHQpCi0KLSAgICAgICAgICAgIGV4Y2VwdCBDUUxfRVJST1JTIGFzIGVycjoKLSAgICAgICAgICAgICAgICBlcnJfbXNnID0gZXJyLm1lc3NhZ2UgaWYgaGFzYXR0cihlcnIsICdtZXNzYWdlJykgZWxzZSBzdHIoZXJyKQotICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoZXJyX21zZy5wYXJ0aXRpb24oIm1lc3NhZ2U9IilbMl0uc3RyaXAoJyInKSkKLSAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjawotICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIodHJhY2ViYWNrLmZvcm1hdF9leGMoKSkKLQotICAgICAgICAgICAgaWYgZnV0dXJlOgotICAgICAgICAgICAgICAgIGlmIGZ1dHVyZS53YXJuaW5nczoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF93YXJuaW5ncyhmdXR1cmUud2FybmluZ3MpCi0KLSAgICBkb19kZXNjID0gZG9fZGVzY3JpYmUKLQotICAgIGRlZiBkZXNjcmliZV9rZXlzcGFjZXMoc2VsZiwgcm93cyk6Ci0gICAgICAgICIiIgotICAgICAgICBQcmludCB0aGUgb3V0cHV0IGZvciBhIERFU0NSSUJFIEtFWVNQQUNFUyBxdWVyeQotICAgICAgICAiIiIKLSAgICAgICAgbmFtZXMgPSBbclsnbmFtZSddIGZvciByIGluIHJvd3NdCi0KLSAgICAgICAgcHJpbnQoJycpCi0gICAgICAgIGNtZC5DbWQuY29sdW1uaXplKHNlbGYsIG5hbWVzKQotICAgICAgICBwcmludCgnJykKLQotICAgIGRlZiBkZXNjcmliZV9saXN0KHNlbGYsIHJvd3MpOgotICAgICAgICAiIiIKLSAgICAgICAgUHJpbnQgdGhlIG91dHB1dCBmb3IgYWxsIHRoZSBERVNDUklCRSBxdWVyaWVzIGZvciBlbGVtZW50IG5hbWVzIChlLmcgREVTQ1JJQkUgVEFCTEVTLCBERVNDUklCRSBGVU5DVElPTlMgLi4uKQotICAgICAgICAiIiIKLSAgICAgICAga2V5c3BhY2UgPSBOb25lCi0gICAgICAgIG5hbWVzID0gbGlzdCgpCi0gICAgICAgIGZvciByb3cgaW4gcm93czoKLSAgICAgICAgICAgIGlmIHJvd1sna2V5c3BhY2VfbmFtZSddICE9IGtleXNwYWNlOgotICAgICAgICAgICAgICAgIGlmIGtleXNwYWNlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnByaW50X2tleXNwYWNlX2VsZW1lbnRfbmFtZXMoa2V5c3BhY2UsIG5hbWVzKQotCi0gICAgICAgICAgICAgICAga2V5c3BhY2UgPSByb3dbJ2tleXNwYWNlX25hbWUnXQotICAgICAgICAgICAgICAgIG5hbWVzID0gbGlzdCgpCi0KLSAgICAgICAgICAgIG5hbWVzLmFwcGVuZChzdHIocm93WyduYW1lJ10pKQotCi0gICAgICAgIGlmIGtleXNwYWNlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5wcmludF9rZXlzcGFjZV9lbGVtZW50X25hbWVzKGtleXNwYWNlLCBuYW1lcykKLSAgICAgICAgICAgIHByaW50KCcnKQotCi0gICAgZGVmIHByaW50X2tleXNwYWNlX2VsZW1lbnRfbmFtZXMoc2VsZiwga2V5c3BhY2UsIG5hbWVzKToKLSAgICAgICAgcHJpbnQoJycpCi0gICAgICAgIGlmIHNlbGYuY3VycmVudF9rZXlzcGFjZSBpcyBOb25lOgotICAgICAgICAgICAgcHJpbnQoJ0tleXNwYWNlICVzJyAlIChrZXlzcGFjZSkpCi0gICAgICAgICAgICBwcmludCgnLS0tLS0tLS0tJXMnICUgKCctJyAqIGxlbihrZXlzcGFjZSkpKQotICAgICAgICBjbWQuQ21kLmNvbHVtbml6ZShzZWxmLCBuYW1lcykKLQotICAgIGRlZiBkZXNjcmliZV9lbGVtZW50KHNlbGYsIHJvd3MpOgotICAgICAgICAiIiIKLSAgICAgICAgUHJpbnQgdGhlIG91dHB1dCBmb3IgYWxsIHRoZSBERVNDUklCRSBxdWVyaWVzIHdoZXJlIGFuIGVsZW1lbnQgbmFtZSBhcyBiZWVuIHNwZWNpZmllZCAoZS5nIERFU0NSSUJFIFRBQkxFLCBERVNDUklCRSBJTkRFWCAuLi4pCi0gICAgICAgICIiIgotICAgICAgICBmb3Igcm93IGluIHJvd3M6Ci0gICAgICAgICAgICBwcmludCgnJykKLSAgICAgICAgICAgIHNlbGYucXVlcnlfb3V0LndyaXRlKHJvd1snY3JlYXRlX3N0YXRlbWVudCddKQotICAgICAgICAgICAgcHJpbnQoJycpCi0KLSAgICBkZWYgZGVzY3JpYmVfY2x1c3RlcihzZWxmLCByb3dzKToKLSAgICAgICAgIiIiCi0gICAgICAgIFByaW50IHRoZSBvdXRwdXQgZm9yIGEgREVTQ1JJQkUgQ0xVU1RFUiBxdWVyeS4KLQotICAgICAgICBJZiBhIHNwZWNpZmllZCBrZXlzcGFjZSB3YXMgaW4gdXNlIHRoZSByZXR1cm5lZCBSZXN1bHRTZXQgd2lsbCBjb250YWlucyBhICdyYW5nZV9vd25lcnNoaXAnIGNvbHVtbiwKLSAgICAgICAgb3RoZXJ3aXNlIG5vdC4KLSAgICAgICAgIiIiCi0gICAgICAgIGZvciByb3cgaW4gcm93czoKLSAgICAgICAgICAgIHByaW50KCdcbkNsdXN0ZXI6ICVzJyAlIHJvd1snY2x1c3RlciddKQotICAgICAgICAgICAgcHJpbnQoJ1BhcnRpdGlvbmVyOiAlcycgJSByb3dbJ3BhcnRpdGlvbmVyJ10pCi0gICAgICAgICAgICBwcmludCgnU25pdGNoOiAlc1xuJyAlIHJvd1snc25pdGNoJ10pCi0gICAgICAgICAgICBpZiAncmFuZ2Vfb3duZXJzaGlwJyBpbiByb3c6Ci0gICAgICAgICAgICAgICAgcHJpbnQoIlJhbmdlIG93bmVyc2hpcDoiKQotICAgICAgICAgICAgICAgIGZvciBlbnRyeSBpbiBsaXN0KHJvd1sncmFuZ2Vfb3duZXJzaGlwJ10uaXRlbXMoKSk6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50KCcgJTM5cyAgWyVzXScgJSAoZW50cnlbMF0sICcsICcuam9pbihbaG9zdCBmb3IgaG9zdCBpbiBlbnRyeVsxXV0pKSkKLSAgICAgICAgICAgICAgICBwcmludCgnJykKLQotICAgIGRlZiBkb19jb3B5KHNlbGYsIHBhcnNlZCk6Ci0gICAgICAgIHIiIiIKLSAgICAgICAgQ09QWSBbY3Fsc2ggb25seV0KLQotICAgICAgICAgIENPUFkgeCBGUk9NOiBJbXBvcnRzIENTViBkYXRhIGludG8gYSBDYXNzYW5kcmEgdGFibGUKLSAgICAgICAgICBDT1BZIHggVE86IEV4cG9ydHMgZGF0YSBmcm9tIGEgQ2Fzc2FuZHJhIHRhYmxlIGluIENTViBmb3JtYXQuCi0KLSAgICAgICAgQ09QWSA8dGFibGVfbmFtZT4gWyAoIGNvbHVtbiBbLCAuLi5dICkgXQotICAgICAgICAgICAgIEZST00gKCAnPGZpbGVfcGF0dGVybl8xLCBmaWxlX3BhdHRlcm5fMiwgLi4uIGZpbGVfcGF0dGVybl9uPicgfCBTVERJTiApCi0gICAgICAgICAgICAgWyBXSVRIIDxvcHRpb24+PSd2YWx1ZScgW0FORCAuLi5dIF07Ci0KLSAgICAgICAgRmlsZSBwYXR0ZXJucyBhcmUgZWl0aGVyIGZpbGUgbmFtZXMgb3IgdmFsaWQgcHl0aG9uIGdsb2IgZXhwcmVzc2lvbnMsIGUuZy4gKi5jc3Ygb3IgZm9sZGVyLyouY3N2LgotCi0gICAgICAgIENPUFkgPHRhYmxlX25hbWU+IFsgKCBjb2x1bW4gWywgLi4uXSApIF0KLSAgICAgICAgICAgICBUTyAoICc8ZmlsZW5hbWU+JyB8IFNURE9VVCApCi0gICAgICAgICAgICAgWyBXSVRIIDxvcHRpb24+PSd2YWx1ZScgW0FORCAuLi5dIF07Ci0KLSAgICAgICAgQXZhaWxhYmxlIGNvbW1vbiBDT1BZIG9wdGlvbnMgYW5kIGRlZmF1bHRzOgotCi0gICAgICAgICAgREVMSU1JVEVSPScsJyAgICAgICAgICAgLSBjaGFyYWN0ZXIgdGhhdCBhcHBlYXJzIGJldHdlZW4gcmVjb3JkcwotICAgICAgICAgIFFVT1RFPSciJyAgICAgICAgICAgICAgIC0gcXVvdGluZyBjaGFyYWN0ZXIgdG8gYmUgdXNlZCB0byBxdW90ZSBmaWVsZHMKLSAgICAgICAgICBFU0NBUEU9J1wnICAgICAgICAgICAgICAtIGNoYXJhY3RlciB0byBhcHBlYXIgYmVmb3JlIHRoZSBRVU9URSBjaGFyIHdoZW4gcXVvdGVkCi0gICAgICAgICAgSEVBREVSPWZhbHNlICAgICAgICAgICAgLSB3aGV0aGVyIHRvIGlnbm9yZSB0aGUgZmlyc3QgbGluZQotICAgICAgICAgIE5VTEw9JycgICAgICAgICAgICAgICAgIC0gc3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhIG51bGwgdmFsdWUKLSAgICAgICAgICBEQVRFVElNRUZPUk1BVD0gICAgICAgICAtIHRpbWVzdGFtcCBzdHJmdGltZSBmb3JtYXQKLSAgICAgICAgICAgICclWS0lbS0lZCAlSDolTTolUyV6JyAgIGRlZmF1bHRzIHRvIHRpbWVfZm9ybWF0IHZhbHVlIGluIGNxbHNocmMKLSAgICAgICAgICBNQVhBVFRFTVBUUz01ICAgICAgICAgICAtIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBwZXIgYmF0Y2ggb3IgcmFuZ2UKLSAgICAgICAgICBSRVBPUlRGUkVRVUVOQ1k9MC4yNSAgICAtIHRoZSBmcmVxdWVuY3kgd2l0aCB3aGljaCB3ZSBkaXNwbGF5IHN0YXR1cyB1cGRhdGVzIGluIHNlY29uZHMKLSAgICAgICAgICBERUNJTUFMU0VQPScuJyAgICAgICAgICAtIHRoZSBzZXBhcmF0b3IgZm9yIGRlY2ltYWwgdmFsdWVzCi0gICAgICAgICAgVEhPVVNBTkRTU0VQPScnICAgICAgICAgLSB0aGUgc2VwYXJhdG9yIGZvciB0aG91c2FuZHMgZGlnaXQgZ3JvdXBzCi0gICAgICAgICAgQk9PTFNUWUxFPSdUcnVlLEZhbHNlJyAgLSB0aGUgcmVwcmVzZW50YXRpb24gZm9yIGJvb2xlYW5zLCBjYXNlIGluc2Vuc2l0aXZlLCBzcGVjaWZ5IHRydWUgZm9sbG93ZWQgYnkgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSB5ZXMsbm8gb3IgMSwwCi0gICAgICAgICAgTlVNUFJPQ0VTU0VTPW4gICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIHdvcmtlciBwcm9jZXNzZXMsIGJ5IGRlZmF1bHQgdGhlIG51bWJlciBvZiBjb3JlcyBtaW51cyBvbmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHBlZCBhdCAxNgotICAgICAgICAgIENPTkZJR0ZJTEU9JycgICAgICAgICAgIC0gYSBjb25maWd1cmF0aW9uIGZpbGUgd2l0aCB0aGUgc2FtZSBmb3JtYXQgYXMgLmNxbHNocmMgKHNlZSB0aGUgUHl0aG9uIENvbmZpZ1BhcnNlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbikgd2hlcmUgeW91IGNhbiBzcGVjaWZ5IFdJVEggb3B0aW9ucyB1bmRlciB0aGUgZm9sbG93aW5nIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uczogW2NvcHldLCBbY29weS10b10sIFtjb3B5LWZyb21dLCBbY29weTprcy50YWJsZV0sIFtjb3B5LXRvOmtzLnRhYmxlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb3B5LWZyb206a3MudGFibGVdLCB3aGVyZSA8a3M+IGlzIHlvdXIga2V5c3BhY2UgbmFtZSBhbmQgPHRhYmxlPiBpcyB5b3VyIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLiBPcHRpb25zIGFyZSByZWFkIGZyb20gdGhlc2Ugc2VjdGlvbnMsIGluIHRoZSBvcmRlciBzcGVjaWZpZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlLCBhbmQgY29tbWFuZCBsaW5lIG9wdGlvbnMgYWx3YXlzIG92ZXJyaWRlIG9wdGlvbnMgaW4gY29uZmlndXJhdGlvbiBmaWxlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGluZyBvbiB0aGUgQ09QWSBkaXJlY3Rpb24sIG9ubHkgdGhlIHJlbGV2YW50IGNvcHktZnJvbSBvciBjb3B5LXRvIHNlY3Rpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgdXNlZC4gSWYgbm8gY29uZmlnZmlsZSBpcyBzcGVjaWZpZWQgdGhlbiAuY3Fsc2hyYyBpcyBzZWFyY2hlZCBpbnN0ZWFkLgotICAgICAgICAgIFJBVEVGSUxFPScnICAgICAgICAgICAgIC0gYW4gb3B0aW9uYWwgZmlsZSB3aGVyZSB0byBwcmludCB0aGUgb3V0cHV0IHN0YXRpc3RpY3MKLQotICAgICAgICBBdmFpbGFibGUgQ09QWSBGUk9NIG9wdGlvbnMgYW5kIGRlZmF1bHRzOgotCi0gICAgICAgICAgQ0hVTktTSVpFPTUwMDAgICAgICAgICAgLSB0aGUgc2l6ZSBvZiBjaHVua3MgcGFzc2VkIHRvIHdvcmtlciBwcm9jZXNzZXMKLSAgICAgICAgICBJTkdFU1RSQVRFPTEwMDAwMCAgICAgICAtIGFuIGFwcHJveGltYXRlIGluZ2VzdCByYXRlIGluIHJvd3MgcGVyIHNlY29uZAotICAgICAgICAgIE1JTkJBVENIU0laRT0xMCAgICAgICAgIC0gdGhlIG1pbmltdW0gc2l6ZSBvZiBhbiBpbXBvcnQgYmF0Y2gKLSAgICAgICAgICBNQVhCQVRDSFNJWkU9MjAgICAgICAgICAtIHRoZSBtYXhpbXVtIHNpemUgb2YgYW4gaW1wb3J0IGJhdGNoCi0gICAgICAgICAgTUFYUk9XUz0tMSAgICAgICAgICAgICAgLSB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cywgLTEgbWVhbnMgbm8gbWF4aW11bQotICAgICAgICAgIFNLSVBST1dTPTAgICAgICAgICAgICAgIC0gdGhlIG51bWJlciBvZiByb3dzIHRvIHNraXAKLSAgICAgICAgICBTS0lQQ09MUz0nJyAgICAgICAgICAgICAtIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgY29sdW1uIG5hbWVzIHRvIHNraXAKLSAgICAgICAgICBNQVhQQVJTRUVSUk9SUz0tMSAgICAgICAtIHRoZSBtYXhpbXVtIGdsb2JhbCBudW1iZXIgb2YgcGFyc2luZyBlcnJvcnMsIC0xIG1lYW5zIG5vIG1heGltdW0KLSAgICAgICAgICBNQVhJTlNFUlRFUlJPUlM9MTAwMCAgICAtIHRoZSBtYXhpbXVtIGdsb2JhbCBudW1iZXIgb2YgaW5zZXJ0IGVycm9ycywgLTEgbWVhbnMgbm8gbWF4aW11bQotICAgICAgICAgIEVSUkZJTEU9JycgICAgICAgICAgICAgIC0gYSBmaWxlIHdoZXJlIHRvIHN0b3JlIGFsbCByb3dzIHRoYXQgY291bGQgbm90IGJlIGltcG9ydGVkLCBieSBkZWZhdWx0IHRoaXMgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydF9rc190YWJsZS5lcnIgd2hlcmUgPGtzPiBpcyB5b3VyIGtleXNwYWNlIGFuZCA8dGFibGU+IGlzIHlvdXIgdGFibGUgbmFtZS4KLSAgICAgICAgICBQUkVQQVJFRFNUQVRFTUVOVFM9VHJ1ZSAtIHdoZXRoZXIgdG8gdXNlIHByZXBhcmVkIHN0YXRlbWVudHMgd2hlbiBpbXBvcnRpbmcsIGJ5IGRlZmF1bHQgVHJ1ZS4gU2V0IHRoaXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlIGlmIHlvdSBkb24ndCBtaW5kIHNoaWZ0aW5nIGRhdGEgcGFyc2luZyB0byB0aGUgY2x1c3Rlci4gVGhlIGNsdXN0ZXIgd2lsbCBhbHNvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRvIGNvbXBpbGUgZXZlcnkgYmF0Y2ggc3RhdGVtZW50LiBGb3IgbGFyZ2UgYW5kIG92ZXJzaXplZCBjbHVzdGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyB3aWxsIHJlc3VsdCBpbiBhIGZhc3RlciBpbXBvcnQgYnV0IGZvciBzbWFsbGVyIGNsdXN0ZXJzIGl0IG1heSBnZW5lcmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dHMuCi0gICAgICAgICAgVFRMPTM2MDAgICAgICAgICAgICAgICAgLSB0aGUgdGltZSB0byBsaXZlIGluIHNlY29uZHMsIGJ5IGRlZmF1bHQgZGF0YSB3aWxsIG5vdCBleHBpcmUKLQotICAgICAgICBBdmFpbGFibGUgQ09QWSBUTyBvcHRpb25zIGFuZCBkZWZhdWx0czoKLQotICAgICAgICAgIEVOQ09ESU5HPSd1dGY4JyAgICAgICAgICAtIGVuY29kaW5nIGZvciBDU1Ygb3V0cHV0Ci0gICAgICAgICAgUEFHRVNJWkU9JzEwMDAnICAgICAgICAgIC0gdGhlIHBhZ2Ugc2l6ZSBmb3IgZmV0Y2hpbmcgcmVzdWx0cwotICAgICAgICAgIFBBR0VUSU1FT1VUPTEwICAgICAgICAgICAtIHRoZSBwYWdlIHRpbWVvdXQgaW4gc2Vjb25kcyBmb3IgZmV0Y2hpbmcgcmVzdWx0cwotICAgICAgICAgIEJFR0lOVE9LRU49JycgICAgICAgICAgICAtIHRoZSBtaW5pbXVtIHRva2VuIHN0cmluZyB0byBjb25zaWRlciB3aGVuIGV4cG9ydGluZyBkYXRhCi0gICAgICAgICAgRU5EVE9LRU49JycgICAgICAgICAgICAgIC0gdGhlIG1heGltdW0gdG9rZW4gc3RyaW5nIHRvIGNvbnNpZGVyIHdoZW4gZXhwb3J0aW5nIGRhdGEKLSAgICAgICAgICBNQVhSRVFVRVNUUz02ICAgICAgICAgICAgLSB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVxdWVzdHMgZWFjaCB3b3JrZXIgcHJvY2VzcyBjYW4gd29yayBvbiBpbiBwYXJhbGxlbAotICAgICAgICAgIE1BWE9VVFBVVFNJWkU9Jy0xJyAgICAgICAtIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG91dHB1dCBmaWxlIG1lYXN1cmVkIGluIG51bWJlciBvZiBsaW5lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXlvbmQgdGhpcyBtYXhpbXVtIHRoZSBvdXRwdXQgZmlsZSB3aWxsIGJlIHNwbGl0IGludG8gc2VnbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgbWVhbnMgdW5saW1pdGVkLgotICAgICAgICAgIEZMT0FUUFJFQ0lTSU9OPTUgICAgICAgICAtIHRoZSBudW1iZXIgb2YgZGlnaXRzIGRpc3BsYXllZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBmb3IgY3FsIGZsb2F0IHZhbHVlcwotICAgICAgICAgIERPVUJMRVBSRUNJU0lPTj0xMiAgICAgICAtIHRoZSBudW1iZXIgb2YgZGlnaXRzIGRpc3BsYXllZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBmb3IgY3FsIGRvdWJsZSB2YWx1ZXMKLQotICAgICAgICBXaGVuIGVudGVyaW5nIENTViBkYXRhIG9uIFNURElOLCB5b3UgY2FuIHVzZSB0aGUgc2VxdWVuY2UgIlwuIgotICAgICAgICBvbiBhIGxpbmUgYnkgaXRzZWxmIHRvIGVuZCB0aGUgZGF0YSBpbnB1dC4KLSAgICAgICAgIiIiCi0KLSAgICAgICAga3MgPSBzZWxmLmNxbF91bnByb3RlY3RfbmFtZShwYXJzZWQuZ2V0X2JpbmRpbmcoJ2tzbmFtZScsIE5vbmUpKQotICAgICAgICBpZiBrcyBpcyBOb25lOgotICAgICAgICAgICAga3MgPSBzZWxmLmN1cnJlbnRfa2V5c3BhY2UKLSAgICAgICAgICAgIGlmIGtzIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgcmFpc2UgTm9LZXlzcGFjZUVycm9yKCJOb3QgaW4gYW55IGtleXNwYWNlLiIpCi0gICAgICAgIHRhYmxlID0gc2VsZi5jcWxfdW5wcm90ZWN0X25hbWUocGFyc2VkLmdldF9iaW5kaW5nKCdjZm5hbWUnKSkKLSAgICAgICAgY29sdW1ucyA9IHBhcnNlZC5nZXRfYmluZGluZygnY29sbmFtZXMnLCBOb25lKQotICAgICAgICBpZiBjb2x1bW5zIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgY29sdW1ucyA9IGxpc3QobWFwKHNlbGYuY3FsX3VucHJvdGVjdF9uYW1lLCBjb2x1bW5zKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgZGVmYXVsdCB0byBhbGwga25vd24gY29sdW1ucwotICAgICAgICAgICAgY29sdW1ucyA9IHNlbGYuZ2V0X2NvbHVtbl9uYW1lcyhrcywgdGFibGUpCi0KLSAgICAgICAgZm5hbWUgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2ZuYW1lJywgTm9uZSkKLSAgICAgICAgaWYgZm5hbWUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBmbmFtZSA9IHNlbGYuY3FsX3VucHJvdGVjdF92YWx1ZShmbmFtZSkKLQotICAgICAgICBjb3B5b3B0bmFtZXMgPSBsaXN0KG1hcChzdHIubG93ZXIsIHBhcnNlZC5nZXRfYmluZGluZygnb3B0bmFtZXMnLCAoKSkpKQotICAgICAgICBjb3B5b3B0dmFscyA9IGxpc3QobWFwKHNlbGYuY3FsX3VucHJvdGVjdF92YWx1ZSwgcGFyc2VkLmdldF9iaW5kaW5nKCdvcHR2YWxzJywgKCkpKSkKLSAgICAgICAgb3B0cyA9IGRpY3QobGlzdCh6aXAoY29weW9wdG5hbWVzLCBjb3B5b3B0dmFscykpKQotCi0gICAgICAgIGRpcmVjdGlvbiA9IHBhcnNlZC5nZXRfYmluZGluZygnZGlyJykudXBwZXIoKQotICAgICAgICBpZiBkaXJlY3Rpb24gPT0gJ0ZST00nOgotICAgICAgICAgICAgdGFzayA9IEltcG9ydFRhc2soc2VsZiwga3MsIHRhYmxlLCBjb2x1bW5zLCBmbmFtZSwgb3B0cywgc2VsZi5jb25uLnByb3RvY29sX3ZlcnNpb24sIENPTkZJR19GSUxFKQotICAgICAgICBlbGlmIGRpcmVjdGlvbiA9PSAnVE8nOgotICAgICAgICAgICAgdGFzayA9IEV4cG9ydFRhc2soc2VsZiwga3MsIHRhYmxlLCBjb2x1bW5zLCBmbmFtZSwgb3B0cywgc2VsZi5jb25uLnByb3RvY29sX3ZlcnNpb24sIENPTkZJR19GSUxFKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoIlVua25vd24gZGlyZWN0aW9uICVzIiAlIGRpcmVjdGlvbikKLQotICAgICAgICB0YXNrLnJ1bigpCi0KLSAgICBkZWYgZG9fc2hvdyhzZWxmLCBwYXJzZWQpOgotICAgICAgICAiIiIKLSAgICAgICAgU0hPVyBbY3Fsc2ggb25seV0KLQotICAgICAgICAgIERpc3BsYXlzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IGNxbHNoIHNlc3Npb24uIENhbiBiZSBjYWxsZWQgaW4KLSAgICAgICAgICB0aGUgZm9sbG93aW5nIHdheXM6Ci0KLSAgICAgICAgU0hPVyBWRVJTSU9OCi0KLSAgICAgICAgICBTaG93cyB0aGUgdmVyc2lvbiBhbmQgYnVpbGQgb2YgdGhlIGNvbm5lY3RlZCBDYXNzYW5kcmEgaW5zdGFuY2UsIGFzCi0gICAgICAgICAgd2VsbCBhcyB0aGUgdmVyc2lvbiBvZiB0aGUgQ1FMIHNwZWMgdGhhdCB0aGUgY29ubmVjdGVkIENhc3NhbmRyYQotICAgICAgICAgIGluc3RhbmNlIHVuZGVyc3RhbmRzLgotCi0gICAgICAgIFNIT1cgSE9TVAotCi0gICAgICAgICAgU2hvd3Mgd2hlcmUgY3Fsc2ggaXMgY3VycmVudGx5IGNvbm5lY3RlZC4KLQotICAgICAgICBTSE9XIFNFU1NJT04gPHNlc3Npb25pZD4KLQotICAgICAgICAgIFByZXR0eS1wcmludHMgdGhlIHJlcXVlc3RlZCB0cmFjaW5nIHNlc3Npb24uCi0gICAgICAgICIiIgotICAgICAgICBzaG93d2hhdCA9IHBhcnNlZC5nZXRfYmluZGluZygnd2hhdCcpLmxvd2VyKCkKLSAgICAgICAgaWYgc2hvd3doYXQgPT0gJ3ZlcnNpb24nOgotICAgICAgICAgICAgc2VsZi5nZXRfY29ubmVjdGlvbl92ZXJzaW9ucygpCi0gICAgICAgICAgICBzZWxmLnNob3dfdmVyc2lvbigpCi0gICAgICAgIGVsaWYgc2hvd3doYXQgPT0gJ2hvc3QnOgotICAgICAgICAgICAgc2VsZi5zaG93X2hvc3QoKQotICAgICAgICBlbGlmIHNob3d3aGF0LnN0YXJ0c3dpdGgoJ3Nlc3Npb24nKToKLSAgICAgICAgICAgIHNlc3Npb25faWQgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3Nlc3Npb25pZCcpLmxvd2VyKCkKLSAgICAgICAgICAgIHNlbGYuc2hvd19zZXNzaW9uKFVVSUQoc2Vzc2lvbl9pZCkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnByaW50ZXJyKCdXYWl0LCBob3cgZG8gSSBzaG93ICVyPycgJSAoc2hvd3doYXQsKSkKLQotICAgIGRlZiBkb19zb3VyY2Uoc2VsZiwgcGFyc2VkKToKLSAgICAgICAgIiIiCi0gICAgICAgIFNPVVJDRSBbY3Fsc2ggb25seV0KLQotICAgICAgICBFeGVjdXRlcyBhIGZpbGUgY29udGFpbmluZyBDUUwgc3RhdGVtZW50cy4gR2l2ZXMgdGhlIG91dHB1dCBmb3IgZWFjaAotICAgICAgICBzdGF0ZW1lbnQgaW4gdHVybiwgaWYgYW55LCBvciBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgYWxvbmcgdGhlIHdheS4KLQotICAgICAgICBFcnJvcnMgZG8gTk9UIGFib3J0IGV4ZWN1dGlvbiBvZiB0aGUgQ1FMIHNvdXJjZSBmaWxlLgotCi0gICAgICAgIFVzYWdlOgotCi0gICAgICAgICAgU09VUkNFICc8ZmlsZT4nOwotCi0gICAgICAgIFRoYXQgaXMsIHRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGJlIGV4ZWN1dGVkIG11c3QgYmUgZ2l2ZW4gaW5zaWRlIGEKLSAgICAgICAgc3RyaW5nIGxpdGVyYWwuIFRoZSBwYXRoIGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKLSAgICAgICAgZGlyZWN0b3J5LiBUaGUgdGlsZGUgc2hvcnRoYW5kIG5vdGF0aW9uICgnfi9teWRpcicpIGlzIHN1cHBvcnRlZCBmb3IKLSAgICAgICAgcmVmZXJyaW5nIHRvICRIT01FLgotCi0gICAgICAgIFNlZSBhbHNvIHRoZSAtLWZpbGUgb3B0aW9uIHRvIGNxbHNoLgotICAgICAgICAiIiIKLSAgICAgICAgZm5hbWUgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2ZuYW1lJykKLSAgICAgICAgZm5hbWUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoc2VsZi5jcWxfdW5wcm90ZWN0X3ZhbHVlKGZuYW1lKSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZW5jb2RpbmcsIGJvbV9zaXplID0gZ2V0X2ZpbGVfZW5jb2RpbmdfYm9tc2l6ZShmbmFtZSkKLSAgICAgICAgICAgIGYgPSBjb2RlY3Mub3BlbihmbmFtZSwgJ3InLCBlbmNvZGluZykKLSAgICAgICAgICAgIGYuc2Vlayhib21fc2l6ZSkKLSAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKLSAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoJ0NvdWxkIG5vdCBvcGVuICVyOiAlcycgJSAoZm5hbWUsIGUpKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHN1YnNoZWxsID0gU2hlbGwoc2VsZi5ob3N0bmFtZSwgc2VsZi5wb3J0LCBjb2xvcj1zZWxmLmNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lPXNlbGYudXNlcm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9c2VsZi5lbmNvZGluZywgc3RkaW49ZiwgdHR5PUZhbHNlLCB1c2VfY29ubj1zZWxmLmNvbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3FsdmVyPXNlbGYuY3FsX3ZlcnNpb24sIGtleXNwYWNlPXNlbGYuY3VycmVudF9rZXlzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjaW5nX2VuYWJsZWQ9c2VsZi50cmFjaW5nX2VuYWJsZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9uYW5vdGltZV9mb3JtYXQ9c2VsZi5kaXNwbGF5X25hbm90aW1lX2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQ9c2VsZi5kaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9kYXRlX2Zvcm1hdD1zZWxmLmRpc3BsYXlfZGF0ZV9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9mbG9hdF9wcmVjaXNpb249c2VsZi5kaXNwbGF5X2Zsb2F0X3ByZWNpc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2RvdWJsZV9wcmVjaXNpb249c2VsZi5kaXNwbGF5X2RvdWJsZV9wcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV90aW1lem9uZT1zZWxmLmRpc3BsYXlfdGltZXpvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RyYWNlX3dhaXQ9c2VsZi5tYXhfdHJhY2Vfd2FpdCwgc3NsPXNlbGYuc3NsLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfdGltZW91dD1zZWxmLnNlc3Npb24uZGVmYXVsdF90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfdGltZW91dD1zZWxmLmNvbm4uY29ubmVjdF90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N1YnNoZWxsPVRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9wcm92aWRlcj1zZWxmLmF1dGhfcHJvdmlkZXIpCi0gICAgICAgICMgZHVwbGljYXRlIGNvdmVyYWdlIHJlbGF0ZWQgc2V0dGluZ3MgaW4gc3Vic2hlbGwKLSAgICAgICAgaWYgc2VsZi5jb3ZlcmFnZToKLSAgICAgICAgICAgIHN1YnNoZWxsLmNvdmVyYWdlID0gVHJ1ZQotICAgICAgICAgICAgc3Vic2hlbGwuY292ZXJhZ2VyY19wYXRoID0gc2VsZi5jb3ZlcmFnZXJjX3BhdGgKLSAgICAgICAgc3Vic2hlbGwuY21kbG9vcCgpCi0gICAgICAgIGYuY2xvc2UoKQotCi0gICAgZGVmIGRvX2NhcHR1cmUoc2VsZiwgcGFyc2VkKToKLSAgICAgICAgIiIiCi0gICAgICAgIENBUFRVUkUgW2NxbHNoIG9ubHldCi0KLSAgICAgICAgQmVnaW5zIGNhcHR1cmluZyBjb21tYW5kIG91dHB1dCBhbmQgYXBwZW5kaW5nIGl0IHRvIGEgc3BlY2lmaWVkIGZpbGUuCi0gICAgICAgIE91dHB1dCB3aWxsIG5vdCBiZSBzaG93biBhdCB0aGUgY29uc29sZSB3aGlsZSBpdCBpcyBjYXB0dXJlZC4KLQotICAgICAgICBVc2FnZToKLQotICAgICAgICAgIENBUFRVUkUgJzxmaWxlPic7Ci0gICAgICAgICAgQ0FQVFVSRSBPRkY7Ci0gICAgICAgICAgQ0FQVFVSRTsKLQotICAgICAgICBUaGF0IGlzLCB0aGUgcGF0aCB0byB0aGUgZmlsZSB0byBiZSBhcHBlbmRlZCB0byBtdXN0IGJlIGdpdmVuIGluc2lkZSBhCi0gICAgICAgIHN0cmluZyBsaXRlcmFsLiBUaGUgcGF0aCBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nCi0gICAgICAgIGRpcmVjdG9yeS4gVGhlIHRpbGRlIHNob3J0aGFuZCBub3RhdGlvbiAoJ34vbXlkaXInKSBpcyBzdXBwb3J0ZWQgZm9yCi0gICAgICAgIHJlZmVycmluZyB0byAkSE9NRS4KLQotICAgICAgICBPbmx5IHF1ZXJ5IHJlc3VsdCBvdXRwdXQgaXMgY2FwdHVyZWQuIEVycm9ycyBhbmQgb3V0cHV0IGZyb20gY3Fsc2gtb25seQotICAgICAgICBjb21tYW5kcyB3aWxsIHN0aWxsIGJlIHNob3duIGluIHRoZSBjcWxzaCBzZXNzaW9uLgotCi0gICAgICAgIFRvIHN0b3AgY2FwdHVyaW5nIG91dHB1dCBhbmQgc2hvdyBpdCBpbiB0aGUgY3Fsc2ggc2Vzc2lvbiBhZ2FpbiwgdXNlCi0gICAgICAgIENBUFRVUkUgT0ZGLgotCi0gICAgICAgIFRvIGluc3BlY3QgdGhlIGN1cnJlbnQgY2FwdHVyZSBjb25maWd1cmF0aW9uLCB1c2UgQ0FQVFVSRSB3aXRoIG5vCi0gICAgICAgIGFyZ3VtZW50cy4KLSAgICAgICAgIiIiCi0gICAgICAgIGZuYW1lID0gcGFyc2VkLmdldF9iaW5kaW5nKCdmbmFtZScpCi0gICAgICAgIGlmIGZuYW1lIGlzIE5vbmU6Ci0gICAgICAgICAgICBpZiBzZWxmLnNodW50ZWRfcXVlcnlfb3V0IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHByaW50KCJDdXJyZW50bHkgY2FwdHVyaW5nIHF1ZXJ5IG91dHB1dCB0byAlci4iICUgKHNlbGYucXVlcnlfb3V0Lm5hbWUsKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQoIkN1cnJlbnRseSBub3QgY2FwdHVyaW5nIHF1ZXJ5IG91dHB1dC4iKQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgaWYgZm5hbWUudXBwZXIoKSA9PSAnT0ZGJzoKLSAgICAgICAgICAgIGlmIHNlbGYuc2h1bnRlZF9xdWVyeV9vdXQgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCdOb3QgY3VycmVudGx5IGNhcHR1cmluZyBvdXRwdXQuJykKLSAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIHNlbGYucXVlcnlfb3V0LmNsb3NlKCkKLSAgICAgICAgICAgIHNlbGYucXVlcnlfb3V0ID0gc2VsZi5zaHVudGVkX3F1ZXJ5X291dAotICAgICAgICAgICAgc2VsZi5jb2xvciA9IHNlbGYuc2h1bnRlZF9jb2xvcgotICAgICAgICAgICAgc2VsZi5zaHVudGVkX3F1ZXJ5X291dCA9IE5vbmUKLSAgICAgICAgICAgIGRlbCBzZWxmLnNodW50ZWRfY29sb3IKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgICAgIGlmIHNlbGYuc2h1bnRlZF9xdWVyeV9vdXQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnByaW50ZXJyKCdBbHJlYWR5IGNhcHR1cmluZyBvdXRwdXQgdG8gJXMuIFVzZSBDQVBUVVJFIE9GRicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJyB0byBkaXNhYmxlLicgJSAoc2VsZi5xdWVyeV9vdXQubmFtZSwpKQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgZm5hbWUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoc2VsZi5jcWxfdW5wcm90ZWN0X3ZhbHVlKGZuYW1lKSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgZiA9IG9wZW4oZm5hbWUsICdhJykKLSAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKLSAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoJ0NvdWxkIG5vdCBvcGVuICVyIGZvciBhcHBlbmQ6ICVzJyAlIChmbmFtZSwgZSkpCi0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5zaHVudGVkX3F1ZXJ5X291dCA9IHNlbGYucXVlcnlfb3V0Ci0gICAgICAgIHNlbGYuc2h1bnRlZF9jb2xvciA9IHNlbGYuY29sb3IKLSAgICAgICAgc2VsZi5xdWVyeV9vdXQgPSBmCi0gICAgICAgIHNlbGYuY29sb3IgPSBGYWxzZQotICAgICAgICBwcmludCgnTm93IGNhcHR1cmluZyBxdWVyeSBvdXRwdXQgdG8gJXIuJyAlIChmbmFtZSwpKQotCi0gICAgZGVmIGRvX3RyYWNpbmcoc2VsZiwgcGFyc2VkKToKLSAgICAgICAgIiIiCi0gICAgICAgIFRSQUNJTkcgW2NxbHNoXQotCi0gICAgICAgICAgRW5hYmxlcyBvciBkaXNhYmxlcyByZXF1ZXN0IHRyYWNpbmcuCi0KLSAgICAgICAgVFJBQ0lORyBPTgotCi0gICAgICAgICAgRW5hYmxlcyB0cmFjaW5nIGZvciBhbGwgZnVydGhlciByZXF1ZXN0cy4KLQotICAgICAgICBUUkFDSU5HIE9GRgotCi0gICAgICAgICAgRGlzYWJsZXMgdHJhY2luZy4KLQotICAgICAgICBUUkFDSU5HCi0KLSAgICAgICAgICBUUkFDSU5HIHdpdGggbm8gYXJndW1lbnRzIHNob3dzIHRoZSBjdXJyZW50IHRyYWNpbmcgc3RhdHVzLgotICAgICAgICAiIiIKLSAgICAgICAgc2VsZi50cmFjaW5nX2VuYWJsZWQgPSBTd2l0Y2hDb21tYW5kKCJUUkFDSU5HIiwgIlRyYWNpbmciKS5leGVjdXRlKHNlbGYudHJhY2luZ19lbmFibGVkLCBwYXJzZWQsIHNlbGYucHJpbnRlcnIpCi0KLSAgICBkZWYgZG9fZXhwYW5kKHNlbGYsIHBhcnNlZCk6Ci0gICAgICAgICIiIgotICAgICAgICBFWFBBTkQgW2NxbHNoXQotCi0gICAgICAgICAgRW5hYmxlcyBvciBkaXNhYmxlcyBleHBhbmRlZCAodmVydGljYWwpIG91dHB1dC4KLQotICAgICAgICBFWFBBTkQgT04KLQotICAgICAgICAgIEVuYWJsZXMgZXhwYW5kZWQgKHZlcnRpY2FsKSBvdXRwdXQuCi0KLSAgICAgICAgRVhQQU5EIE9GRgotCi0gICAgICAgICAgRGlzYWJsZXMgZXhwYW5kZWQgKHZlcnRpY2FsKSBvdXRwdXQuCi0KLSAgICAgICAgRVhQQU5ECi0KLSAgICAgICAgICBFWFBBTkQgd2l0aCBubyBhcmd1bWVudHMgc2hvd3MgdGhlIGN1cnJlbnQgdmFsdWUgb2YgZXhwYW5kIHNldHRpbmcuCi0gICAgICAgICIiIgotICAgICAgICBzZWxmLmV4cGFuZF9lbmFibGVkID0gU3dpdGNoQ29tbWFuZCgiRVhQQU5EIiwgIkV4cGFuZGVkIG91dHB1dCIpLmV4ZWN1dGUoc2VsZi5leHBhbmRfZW5hYmxlZCwgcGFyc2VkLCBzZWxmLnByaW50ZXJyKQotCi0gICAgZGVmIGRvX2NvbnNpc3RlbmN5KHNlbGYsIHBhcnNlZCk6Ci0gICAgICAgICIiIgotICAgICAgICBDT05TSVNURU5DWSBbY3Fsc2ggb25seV0KLQotICAgICAgICAgICBPdmVycmlkZXMgZGVmYXVsdCBjb25zaXN0ZW5jeSBsZXZlbCAoZGVmYXVsdCBsZXZlbCBpcyBPTkUpLgotCi0gICAgICAgIENPTlNJU1RFTkNZIDxsZXZlbD4KLQotICAgICAgICAgICBTZXRzIGNvbnNpc3RlbmN5IGxldmVsIGZvciBmdXR1cmUgcmVxdWVzdHMuCi0KLSAgICAgICAgICAgVmFsaWQgY29uc2lzdGVuY3kgbGV2ZWxzOgotCi0gICAgICAgICAgIEFOWSwgT05FLCBUV08sIFRIUkVFLCBRVU9SVU0sIEFMTCwgTE9DQUxfT05FLCBMT0NBTF9RVU9SVU0sIEVBQ0hfUVVPUlVNLCBTRVJJQUwgYW5kIExPQ0FMX1NFUklBTC4KLQotICAgICAgICAgICBTRVJJQUwgYW5kIExPQ0FMX1NFUklBTCBtYXkgYmUgdXNlZCBvbmx5IGZvciBTRUxFQ1RzOyB3aWxsIGJlIHJlamVjdGVkIHdpdGggdXBkYXRlcy4KLQotICAgICAgICBDT05TSVNURU5DWQotCi0gICAgICAgICAgIENPTlNJU1RFTkNZIHdpdGggbm8gYXJndW1lbnRzIHNob3dzIHRoZSBjdXJyZW50IGNvbnNpc3RlbmN5IGxldmVsLgotICAgICAgICAiIiIKLSAgICAgICAgbGV2ZWwgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2xldmVsJykKLSAgICAgICAgaWYgbGV2ZWwgaXMgTm9uZToKLSAgICAgICAgICAgIHByaW50KCdDdXJyZW50IGNvbnNpc3RlbmN5IGxldmVsIGlzICVzLicgJSAoY2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwudmFsdWVfdG9fbmFtZVtzZWxmLmNvbnNpc3RlbmN5X2xldmVsXSkpCi0gICAgICAgICAgICByZXR1cm4KLQotICAgICAgICBzZWxmLmNvbnNpc3RlbmN5X2xldmVsID0gY2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwubmFtZV90b192YWx1ZVtsZXZlbC51cHBlcigpXQotICAgICAgICBwcmludCgnQ29uc2lzdGVuY3kgbGV2ZWwgc2V0IHRvICVzLicgJSAobGV2ZWwudXBwZXIoKSwpKQotCi0gICAgZGVmIGRvX3NlcmlhbChzZWxmLCBwYXJzZWQpOgotICAgICAgICAiIiIKLSAgICAgICAgU0VSSUFMIENPTlNJU1RFTkNZIFtjcWxzaCBvbmx5XQotCi0gICAgICAgICAgIE92ZXJyaWRlcyBzZXJpYWwgY29uc2lzdGVuY3kgbGV2ZWwgKGRlZmF1bHQgbGV2ZWwgaXMgU0VSSUFMKS4KLQotICAgICAgICBTRVJJQUwgQ09OU0lTVEVOQ1kgPGxldmVsPgotCi0gICAgICAgICAgIFNldHMgY29uc2lzdGVuY3kgbGV2ZWwgZm9yIGZ1dHVyZSBjb25kaXRpb25hbCB1cGRhdGVzLgotCi0gICAgICAgICAgIFZhbGlkIGNvbnNpc3RlbmN5IGxldmVsczoKLQotICAgICAgICAgICBTRVJJQUwsIExPQ0FMX1NFUklBTC4KLQotICAgICAgICBTRVJJQUwgQ09OU0lTVEVOQ1kKLQotICAgICAgICAgICBTRVJJQUwgQ09OU0lTVEVOQ1kgd2l0aCBubyBhcmd1bWVudHMgc2hvd3MgdGhlIGN1cnJlbnQgY29uc2lzdGVuY3kgbGV2ZWwuCi0gICAgICAgICIiIgotICAgICAgICBsZXZlbCA9IHBhcnNlZC5nZXRfYmluZGluZygnbGV2ZWwnKQotICAgICAgICBpZiBsZXZlbCBpcyBOb25lOgotICAgICAgICAgICAgcHJpbnQoJ0N1cnJlbnQgc2VyaWFsIGNvbnNpc3RlbmN5IGxldmVsIGlzICVzLicgJSAoY2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwudmFsdWVfdG9fbmFtZVtzZWxmLnNlcmlhbF9jb25zaXN0ZW5jeV9sZXZlbF0pKQotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAgICAgc2VsZi5zZXJpYWxfY29uc2lzdGVuY3lfbGV2ZWwgPSBjYXNzYW5kcmEuQ29uc2lzdGVuY3lMZXZlbC5uYW1lX3RvX3ZhbHVlW2xldmVsLnVwcGVyKCldCi0gICAgICAgIHByaW50KCdTZXJpYWwgY29uc2lzdGVuY3kgbGV2ZWwgc2V0IHRvICVzLicgJSAobGV2ZWwudXBwZXIoKSwpKQotCi0gICAgZGVmIGRvX2xvZ2luKHNlbGYsIHBhcnNlZCk6Ci0gICAgICAgICIiIgotICAgICAgICBMT0dJTiBbY3Fsc2ggb25seV0KLQotICAgICAgICAgICBDaGFuZ2VzIGxvZ2luIGluZm9ybWF0aW9uIHdpdGhvdXQgcmVxdWlyaW5nIHJlc3RhcnQuCi0KLSAgICAgICAgTE9HSU4gPHVzZXJuYW1lPiAoPHBhc3N3b3JkPikKLQotICAgICAgICAgICBMb2dpbiB1c2luZyB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lLiBJZiBwYXNzd29yZCBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdXNlZAotICAgICAgICAgICBvdGhlcndpc2UsIHlvdSB3aWxsIGJlIHByb21wdGVkIHRvIGVudGVyLgotICAgICAgICAiIiIKLSAgICAgICAgdXNlcm5hbWUgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3VzZXJuYW1lJykKLSAgICAgICAgcGFzc3dvcmQgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3Bhc3N3b3JkJykKLSAgICAgICAgaWYgcGFzc3dvcmQgaXMgTm9uZToKLSAgICAgICAgICAgIHBhc3N3b3JkID0gZ2V0cGFzcy5nZXRwYXNzKCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHBhc3N3b3JkID0gcGFzc3dvcmRbMTotMV0KLQotICAgICAgICBhdXRoX3Byb3ZpZGVyID0gUGxhaW5UZXh0QXV0aFByb3ZpZGVyKHVzZXJuYW1lPXVzZXJuYW1lLCBwYXNzd29yZD1wYXNzd29yZCkKLQotICAgICAgICBjb25uID0gQ2x1c3Rlcihjb250YWN0X3BvaW50cz0oc2VsZi5ob3N0bmFtZSwpLCBwb3J0PXNlbGYucG9ydCwgY3FsX3ZlcnNpb249c2VsZi5jb25uLmNxbF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF92ZXJzaW9uPXNlbGYuY29ubi5wcm90b2NvbF92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICBhdXRoX3Byb3ZpZGVyPWF1dGhfcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNzbF9vcHRpb25zPXNlbGYuY29ubi5zc2xfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9iYWxhbmNpbmdfcG9saWN5PVdoaXRlTGlzdFJvdW5kUm9iaW5Qb2xpY3koW3NlbGYuaG9zdG5hbWVdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbF9jb25uZWN0aW9uX3RpbWVvdXQ9c2VsZi5jb25uLmNvbm5lY3RfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF90aW1lb3V0PXNlbGYuY29ubi5jb25uZWN0X3RpbWVvdXQpCi0KLSAgICAgICAgaWYgc2VsZi5jdXJyZW50X2tleXNwYWNlOgotICAgICAgICAgICAgc2Vzc2lvbiA9IGNvbm4uY29ubmVjdChzZWxmLmN1cnJlbnRfa2V5c3BhY2UpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZXNzaW9uID0gY29ubi5jb25uZWN0KCkKLQotICAgICAgICAjIENvcHkgc2Vzc2lvbiBwcm9wZXJ0aWVzCi0gICAgICAgIHNlc3Npb24uZGVmYXVsdF90aW1lb3V0ID0gc2VsZi5zZXNzaW9uLmRlZmF1bHRfdGltZW91dAotICAgICAgICBzZXNzaW9uLnJvd19mYWN0b3J5ID0gc2VsZi5zZXNzaW9uLnJvd19mYWN0b3J5Ci0gICAgICAgIHNlc3Npb24uZGVmYXVsdF9jb25zaXN0ZW5jeV9sZXZlbCA9IHNlbGYuc2Vzc2lvbi5kZWZhdWx0X2NvbnNpc3RlbmN5X2xldmVsCi0gICAgICAgIHNlc3Npb24ubWF4X3RyYWNlX3dhaXQgPSBzZWxmLnNlc3Npb24ubWF4X3RyYWNlX3dhaXQKLQotICAgICAgICAjIFVwZGF0ZSBhZnRlciB3ZSd2ZSBjb25uZWN0ZWQgaW4gY2FzZSB3ZSBmYWlsIHRvIGF1dGhlbnRpY2F0ZQotICAgICAgICBzZWxmLmNvbm4gPSBjb25uCi0gICAgICAgIHNlbGYuYXV0aF9wcm92aWRlciA9IGF1dGhfcHJvdmlkZXIKLSAgICAgICAgc2VsZi51c2VybmFtZSA9IHVzZXJuYW1lCi0gICAgICAgIHNlbGYuc2Vzc2lvbiA9IHNlc3Npb24KLQotICAgIGRlZiBkb19leGl0KHNlbGYsIHBhcnNlZD1Ob25lKToKLSAgICAgICAgIiIiCi0gICAgICAgIEVYSVQvUVVJVCBbY3Fsc2ggb25seV0KLQotICAgICAgICBFeGl0cyBjcWxzaC4KLSAgICAgICAgIiIiCi0gICAgICAgIHNlbGYuc3RvcCA9IFRydWUKLSAgICAgICAgaWYgc2VsZi5vd25zX2Nvbm5lY3Rpb246Ci0gICAgICAgICAgICBzZWxmLmNvbm4uc2h1dGRvd24oKQotICAgIGRvX3F1aXQgPSBkb19leGl0Ci0KLSAgICBkZWYgZG9fY2xlYXIoc2VsZiwgcGFyc2VkKToKLSAgICAgICAgIiIiCi0gICAgICAgIENMRUFSL0NMUyBbY3Fsc2ggb25seV0KLQotICAgICAgICBDbGVhcnMgdGhlIGNvbnNvbGUuCi0gICAgICAgICIiIgotICAgICAgICBzdWJwcm9jZXNzLmNhbGwoJ2NsZWFyJywgc2hlbGw9VHJ1ZSkKLSAgICBkb19jbHMgPSBkb19jbGVhcgotCi0gICAgZGVmIGRvX2RlYnVnKHNlbGYsIHBhcnNlZCk6Ci0gICAgICAgIGltcG9ydCBwZGIKLSAgICAgICAgcGRiLnNldF90cmFjZSgpCi0KLSAgICBkZWYgZ2V0X2hlbHBfdG9waWNzKHNlbGYpOgotICAgICAgICB0b3BpY3MgPSBbdFszOl0gZm9yIHQgaW4gZGlyKHNlbGYpIGlmIHQuc3RhcnRzd2l0aCgnZG9fJykgYW5kIGdldGF0dHIoc2VsZiwgdCwgTm9uZSkuX19kb2NfX10KLSAgICAgICAgZm9yIGhpZGVfZnJvbV9oZWxwIGluICgncXVpdCcsKToKLSAgICAgICAgICAgIHRvcGljcy5yZW1vdmUoaGlkZV9mcm9tX2hlbHApCi0gICAgICAgIHJldHVybiB0b3BpY3MKLQotICAgIGRlZiBjb2x1bW5pemUoc2VsZiwgc2xpc3QsICphLCAqKmt3KToKLSAgICAgICAgcmV0dXJuIGNtZC5DbWQuY29sdW1uaXplKHNlbGYsIHNvcnRlZChbdS51cHBlcigpIGZvciB1IGluIHNsaXN0XSksICphLCAqKmt3KQotCi0gICAgZGVmIGRvX2hlbHAoc2VsZiwgcGFyc2VkKToKLSAgICAgICAgIiIiCi0gICAgICAgIEhFTFAgW2NxbHNoIG9ubHldCi0KLSAgICAgICAgR2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgY3Fsc2ggY29tbWFuZHMuIFRvIHNlZSBhdmFpbGFibGUgdG9waWNzLAotICAgICAgICBlbnRlciAiSEVMUCIgd2l0aG91dCBhbnkgYXJndW1lbnRzLiBUbyBzZWUgaGVscCBvbiBhIHRvcGljLAotICAgICAgICB1c2UgIkhFTFAgPHRvcGljPiIuCi0gICAgICAgICIiIgotICAgICAgICB0b3BpY3MgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3RvcGljJywgKCkpCi0gICAgICAgIGlmIG5vdCB0b3BpY3M6Ci0gICAgICAgICAgICBzaGVsbF90b3BpY3MgPSBbdC51cHBlcigpIGZvciB0IGluIHNlbGYuZ2V0X2hlbHBfdG9waWNzKCldCi0gICAgICAgICAgICBzZWxmLnByaW50X3RvcGljcygiXG5Eb2N1bWVudGVkIHNoZWxsIGNvbW1hbmRzOiIsIHNoZWxsX3RvcGljcywgMTUsIDgwKQotICAgICAgICAgICAgY3FsX3RvcGljcyA9IFt0LnVwcGVyKCkgZm9yIHQgaW4gY3FsZG9jcy5nZXRfaGVscF90b3BpY3MoKV0KLSAgICAgICAgICAgIHNlbGYucHJpbnRfdG9waWNzKCJDUUwgaGVscCB0b3BpY3M6IiwgY3FsX3RvcGljcywgMTUsIDgwKQotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGZvciB0IGluIHRvcGljczoKLSAgICAgICAgICAgIGlmIHQubG93ZXIoKSBpbiBzZWxmLmdldF9oZWxwX3RvcGljcygpOgotICAgICAgICAgICAgICAgIGRvYyA9IGdldGF0dHIoc2VsZiwgJ2RvXycgKyB0Lmxvd2VyKCkpLl9fZG9jX18KLSAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC53cml0ZShkb2MgKyAiXG4iKQotICAgICAgICAgICAgZWxpZiB0Lmxvd2VyKCkgaW4gY3FsZG9jcy5nZXRfaGVscF90b3BpY3MoKToKLSAgICAgICAgICAgICAgICB1cmxwYXJ0ID0gY3FsZG9jcy5nZXRfaGVscF90b3BpYyh0KQotICAgICAgICAgICAgICAgIGlmIHVybHBhcnQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIHVybCA9ICIlcyMlcyIgJSAoQ0FTU0FORFJBX0NRTF9IVE1MLCB1cmxwYXJ0KQotICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmJyb3dzZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWQgPSB3ZWJicm93c2VyLmdldChzZWxmLmJyb3dzZXIpLm9wZW5fbmV3X3RhYih1cmwpCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWQgPSB3ZWJicm93c2VyLm9wZW5fbmV3X3RhYih1cmwpCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcGVuZWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCIqKiogTm8gYnJvd3NlciB0byBkaXNwbGF5IENRTCBoZWxwLiBVUkwgZm9yIGhlbHAgdG9waWMgJXMgOiAlcyIgJSAodCwgdXJsKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5wcmludGVycigiKioqIE5vIGhlbHAgb24gJXMiICUgKHQsKSkKLQotICAgIGRlZiBkb191bmljb2RlKHNlbGYsIHBhcnNlZCk6Ci0gICAgICAgICIiIgotICAgICAgICBUZXh0dWFsIGlucHV0L291dHB1dAotCi0gICAgICAgIFdoZW4gY29udHJvbCBjaGFyYWN0ZXJzLCBvciBvdGhlciBjaGFyYWN0ZXJzIHdoaWNoIGNhbid0IGJlIGVuY29kZWQKLSAgICAgICAgaW4geW91ciBjdXJyZW50IGxvY2FsZSwgYXJlIGZvdW5kIGluIHZhbHVlcyBvZiAndGV4dCcgb3IgJ2FzY2lpJwotICAgICAgICB0eXBlcywgaXQgd2lsbCBiZSBzaG93biBhcyBhIGJhY2tzbGFzaCBlc2NhcGUuIElmIGNvbG9yIGlzIGVuYWJsZWQsCi0gICAgICAgIGFueSBzdWNoIGJhY2tzbGFzaCBlc2NhcGVzIHdpbGwgYmUgc2hvd24gaW4gYSBkaWZmZXJlbnQgY29sb3IgZnJvbQotICAgICAgICB0aGUgc3Vycm91bmRpbmcgdGV4dC4KLQotICAgICAgICBVbmljb2RlIGNvZGUgcG9pbnRzIGluIHlvdXIgZGF0YSB3aWxsIGJlIG91dHB1dCBpbnRhY3QsIGlmIHRoZQotICAgICAgICBlbmNvZGluZyBmb3IgeW91ciBsb2NhbGUgaXMgY2FwYWJsZSBvZiBkZWNvZGluZyB0aGVtLiBJZiB5b3UgcHJlZmVyCi0gICAgICAgIHRoYXQgbm9uLWFzY2lpIGNoYXJhY3RlcnMgYmUgc2hvd24gd2l0aCBQeXRob24tc3R5bGUgIlxcdUFCQ0QiCi0gICAgICAgIGVzY2FwZSBzZXF1ZW5jZXMsIGludm9rZSBjcWxzaCB3aXRoIGFuIEFTQ0lJIGxvY2FsZSAoZm9yIGV4YW1wbGUsCi0gICAgICAgIGJ5IHNldHRpbmcgdGhlICRMQU5HIGVudmlyb25tZW50IHZhcmlhYmxlIHRvICJDIikuCi0gICAgICAgICIiIgotCi0gICAgZGVmIGRvX3BhZ2luZyhzZWxmLCBwYXJzZWQpOgotICAgICAgICAiIiIKLSAgICAgICAgUEFHSU5HIFtjcWxzaF0KLQotICAgICAgICAgIEVuYWJsZXMgb3IgZGlzYWJsZXMgcXVlcnkgcGFnaW5nLgotCi0gICAgICAgIFBBR0lORyBPTgotCi0gICAgICAgICAgRW5hYmxlcyBxdWVyeSBwYWdpbmcgZm9yIGFsbCBmdXJ0aGVyIHF1ZXJpZXMuCi0KLSAgICAgICAgUEFHSU5HIE9GRgotCi0gICAgICAgICAgRGlzYWJsZXMgcGFnaW5nLgotCi0gICAgICAgIFBBR0lORwotCi0gICAgICAgICAgUEFHSU5HIHdpdGggbm8gYXJndW1lbnRzIHNob3dzIHRoZSBjdXJyZW50IHF1ZXJ5IHBhZ2luZyBzdGF0dXMuCi0gICAgICAgICIiIgotICAgICAgICAoc2VsZi51c2VfcGFnaW5nLCByZXF1ZXN0ZWRfcGFnZV9zaXplKSA9IFN3aXRjaENvbW1hbmRXaXRoVmFsdWUoCi0gICAgICAgICAgICAiUEFHSU5HIiwgIlF1ZXJ5IHBhZ2luZyIsIHZhbHVlX3R5cGU9aW50KS5leGVjdXRlKHNlbGYudXNlX3BhZ2luZywgcGFyc2VkLCBzZWxmLnByaW50ZXJyKQotICAgICAgICBpZiBzZWxmLnVzZV9wYWdpbmcgYW5kIHJlcXVlc3RlZF9wYWdlX3NpemUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnBhZ2Vfc2l6ZSA9IHJlcXVlc3RlZF9wYWdlX3NpemUKLSAgICAgICAgaWYgc2VsZi51c2VfcGFnaW5nOgotICAgICAgICAgICAgcHJpbnQoKCJQYWdlIHNpemU6IHt9Ii5mb3JtYXQoc2VsZi5wYWdlX3NpemUpKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYucGFnZV9zaXplID0gc2VsZi5kZWZhdWx0X3BhZ2Vfc2l6ZQotCi0gICAgZGVmIGFwcGx5Y29sb3Ioc2VsZiwgdGV4dCwgY29sb3I9Tm9uZSk6Ci0gICAgICAgIGlmIG5vdCBjb2xvciBvciBub3Qgc2VsZi5jb2xvcjoKLSAgICAgICAgICAgIHJldHVybiB0ZXh0Ci0gICAgICAgIHJldHVybiBjb2xvciArIHRleHQgKyBBTlNJX1JFU0VUCi0KLSAgICBkZWYgd3JpdGVyZXN1bHQoc2VsZiwgdGV4dCwgY29sb3I9Tm9uZSwgbmV3bGluZT1UcnVlLCBvdXQ9Tm9uZSk6Ci0gICAgICAgIGlmIG91dCBpcyBOb25lOgotICAgICAgICAgICAgb3V0ID0gc2VsZi5xdWVyeV9vdXQKLQotICAgICAgICAjIGNvbnZlcnQgRXhjZXB0aW9ucywgZXRjIHRvIHRleHQKLSAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodGV4dCwgc3RyKToKLSAgICAgICAgICAgIHRleHQgPSBzdHIodGV4dCkKLQotICAgICAgICB0b193cml0ZSA9IHNlbGYuYXBwbHljb2xvcih0ZXh0LCBjb2xvcikgKyAoJ1xuJyBpZiBuZXdsaW5lIGVsc2UgJycpCi0gICAgICAgIG91dC53cml0ZSh0b193cml0ZSkKLQotICAgIGRlZiBmbHVzaF9vdXRwdXQoc2VsZik6Ci0gICAgICAgIHNlbGYucXVlcnlfb3V0LmZsdXNoKCkKLQotICAgIGRlZiBwcmludGVycihzZWxmLCB0ZXh0LCBjb2xvcj1SRUQsIG5ld2xpbmU9VHJ1ZSwgc2hvd251bT1Ob25lKToKLSAgICAgICAgc2VsZi5zdGF0ZW1lbnRfZXJyb3IgPSBUcnVlCi0gICAgICAgIGlmIHNob3dudW0gaXMgTm9uZToKLSAgICAgICAgICAgIHNob3dudW0gPSBzZWxmLnNob3dfbGluZV9udW1zCi0gICAgICAgIGlmIHNob3dudW06Ci0gICAgICAgICAgICB0ZXh0ID0gJyVzOiVkOiVzJyAlIChzZWxmLnN0ZGluLm5hbWUsIHNlbGYubGluZW5vLCB0ZXh0KQotICAgICAgICBzZWxmLndyaXRlcmVzdWx0KHRleHQsIGNvbG9yLCBuZXdsaW5lPW5ld2xpbmUsIG91dD1zeXMuc3RkZXJyKQotCi0gICAgZGVmIHN0b3BfY292ZXJhZ2Uoc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuY292ZXJhZ2UgYW5kIHNlbGYuY292IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5jb3Yuc3RvcCgpCi0gICAgICAgICAgICBzZWxmLmNvdi5zYXZlKCkKLSAgICAgICAgICAgIHNlbGYuY292ID0gTm9uZQotCi0KLWNsYXNzIFN3aXRjaENvbW1hbmQob2JqZWN0KToKLSAgICBjb21tYW5kID0gTm9uZQotICAgIGRlc2NyaXB0aW9uID0gTm9uZQotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbW1hbmQsIGRlc2MpOgotICAgICAgICBzZWxmLmNvbW1hbmQgPSBjb21tYW5kCi0gICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBkZXNjCi0KLSAgICBkZWYgZXhlY3V0ZShzZWxmLCBzdGF0ZSwgcGFyc2VkLCBwcmludGVycik6Ci0gICAgICAgIHN3aXRjaCA9IHBhcnNlZC5nZXRfYmluZGluZygnc3dpdGNoJykKLSAgICAgICAgaWYgc3dpdGNoIGlzIE5vbmU6Ci0gICAgICAgICAgICBpZiBzdGF0ZToKLSAgICAgICAgICAgICAgICBwcmludCgiJXMgaXMgY3VycmVudGx5IGVuYWJsZWQuIFVzZSAlcyBPRkYgdG8gZGlzYWJsZSIKLSAgICAgICAgICAgICAgICAgICAgICAlIChzZWxmLmRlc2NyaXB0aW9uLCBzZWxmLmNvbW1hbmQpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCgiJXMgaXMgY3VycmVudGx5IGRpc2FibGVkLiBVc2UgJXMgT04gdG8gZW5hYmxlLiIKLSAgICAgICAgICAgICAgICAgICAgICAlIChzZWxmLmRlc2NyaXB0aW9uLCBzZWxmLmNvbW1hbmQpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRlCi0KLSAgICAgICAgaWYgc3dpdGNoLnVwcGVyKCkgPT0gJ09OJzoKLSAgICAgICAgICAgIGlmIHN0YXRlOgotICAgICAgICAgICAgICAgIHByaW50ZXJyKCclcyBpcyBhbHJlYWR5IGVuYWJsZWQuIFVzZSAlcyBPRkYgdG8gZGlzYWJsZS4nCi0gICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5kZXNjcmlwdGlvbiwgc2VsZi5jb21tYW5kKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUKLSAgICAgICAgICAgIHByaW50KCdOb3cgJXMgaXMgZW5hYmxlZCcgJSAoc2VsZi5kZXNjcmlwdGlvbiwpKQotICAgICAgICAgICAgcmV0dXJuIFRydWUKLQotICAgICAgICBpZiBzd2l0Y2gudXBwZXIoKSA9PSAnT0ZGJzoKLSAgICAgICAgICAgIGlmIG5vdCBzdGF0ZToKLSAgICAgICAgICAgICAgICBwcmludGVycignJXMgaXMgbm90IGVuYWJsZWQuJyAlIChzZWxmLmRlc2NyaXB0aW9uLCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlCi0gICAgICAgICAgICBwcmludCgnRGlzYWJsZWQgJXMuJyAlIChzZWxmLmRlc2NyaXB0aW9uLCkpCi0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLQotCi1jbGFzcyBTd2l0Y2hDb21tYW5kV2l0aFZhbHVlKFN3aXRjaENvbW1hbmQpOgotICAgICIiIlRoZSBzYW1lIGFzIFN3aXRjaENvbW1hbmQgZXhjZXB0IGl0IGFsc28gYWNjZXB0cyBhIHZhbHVlIGluIHBsYWNlIG9mIE9OLgotCi0gICAgVGhpcyByZXR1cm5zIGEgdHVwbGUgb2YgdGhlIGZvcm06IChTV0lUQ0hfVkFMVUUsIFBBU1NFRF9WQUxVRSkKLSAgICBlZzogUEFHSU5HIDUwIHJldHVybnMgKFRydWUsIDUwKQotICAgICAgICBQQUdJTkcgT0ZGIHJldHVybnMgKEZhbHNlLCBOb25lKQotICAgICAgICBQQUdJTkcgT04gcmV0dXJucyAoVHJ1ZSwgTm9uZSkKLQotICAgIFRoZSB2YWx1ZV90eXBlIG11c3QgbWF0Y2ggZm9yIHRoZSBQQVNTRURfVkFMVUUsIG90aGVyd2lzZSBpdCB3aWxsIHJldHVybiBOb25lLgotICAgICIiIgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21tYW5kLCBkZXNjLCB2YWx1ZV90eXBlPWludCk6Ci0gICAgICAgIFN3aXRjaENvbW1hbmQuX19pbml0X18oc2VsZiwgY29tbWFuZCwgZGVzYykKLSAgICAgICAgc2VsZi52YWx1ZV90eXBlID0gdmFsdWVfdHlwZQotCi0gICAgZGVmIGV4ZWN1dGUoc2VsZiwgc3RhdGUsIHBhcnNlZCwgcHJpbnRlcnIpOgotICAgICAgICBiaW5hcnlfc3dpdGNoX3ZhbHVlID0gU3dpdGNoQ29tbWFuZC5leGVjdXRlKHNlbGYsIHN0YXRlLCBwYXJzZWQsIHByaW50ZXJyKQotICAgICAgICBzd2l0Y2ggPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3N3aXRjaCcpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHZhbHVlID0gc2VsZi52YWx1ZV90eXBlKHN3aXRjaCkKLSAgICAgICAgICAgIGJpbmFyeV9zd2l0Y2hfdmFsdWUgPSBUcnVlCi0gICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKToKLSAgICAgICAgICAgIHZhbHVlID0gTm9uZQotICAgICAgICByZXR1cm4gYmluYXJ5X3N3aXRjaF92YWx1ZSwgdmFsdWUKLQotCi1kZWYgb3B0aW9uX3dpdGhfZGVmYXVsdChjcGFyc2VyX2dldHRlciwgc2VjdGlvbiwgb3B0aW9uLCBkZWZhdWx0PU5vbmUpOgotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIGNwYXJzZXJfZ2V0dGVyKHNlY3Rpb24sIG9wdGlvbikKLSAgICBleGNlcHQgY29uZmlncGFyc2VyLkVycm9yOgotICAgICAgICByZXR1cm4gZGVmYXVsdAotCi0KLWRlZiByYXdfb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLCBzZWN0aW9uLCBvcHRpb24sIGRlZmF1bHQ9Tm9uZSk6Ci0gICAgIiIiCi0gICAgU2FtZSAoYWxtb3N0KSBhcyBvcHRpb25fd2l0aF9kZWZhdWx0KCkgYnV0IHdvbid0IGRvIGFueSBzdHJpbmcgaW50ZXJwb2xhdGlvbi4KLSAgICBVc2VmdWwgZm9yIGNvbmZpZyB2YWx1ZXMgdGhhdCBpbmNsdWRlICclJyBzeW1ib2wsIGUuZy4gdGltZSBmb3JtYXQgc3RyaW5nLgotICAgICIiIgotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIGNvbmZpZ3MuZ2V0KHNlY3Rpb24sIG9wdGlvbiwgcmF3PVRydWUpCi0gICAgZXhjZXB0IGNvbmZpZ3BhcnNlci5FcnJvcjoKLSAgICAgICAgcmV0dXJuIGRlZmF1bHQKLQotCi1kZWYgc2hvdWxkX3VzZV9jb2xvcigpOgotICAgIGlmIG5vdCBzeXMuc3Rkb3V0LmlzYXR0eSgpOgotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICBpZiBvcy5lbnZpcm9uLmdldCgnVEVSTScsICcnKSBpbiAoJ2R1bWInLCAnJyk6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIHRyeToKLSAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWyd0cHV0JywgJ2NvbG9ycyddLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQotICAgICAgICBzdGRvdXQsIF8gPSBwLmNvbW11bmljYXRlKCkKLSAgICAgICAgaWYgaW50KHN0ZG91dC5zdHJpcCgpKSA8IDg6Ci0gICAgICAgICAgICByZXR1cm4gRmFsc2UKLSAgICBleGNlcHQgKE9TRXJyb3IsIEltcG9ydEVycm9yLCBWYWx1ZUVycm9yKToKLSAgICAgICAgIyBvaCB3ZWxsLCB3ZSB0cmllZC4gYXQgbGVhc3Qgd2Uga25vdyB0aGVyZSdzIGEgJFRFUk0gYW5kIGl0J3MKLSAgICAgICAgIyBub3QgImR1bWIiLgotICAgICAgICBwYXNzCi0gICAgcmV0dXJuIFRydWUKLQotCi1kZWYgcmVhZF9vcHRpb25zKGNtZGxpbmVhcmdzLCBlbnZpcm9ubWVudCk6Ci0gICAgY29uZmlncyA9IGNvbmZpZ3BhcnNlci5Db25maWdQYXJzZXIoKQotICAgIGNvbmZpZ3MucmVhZChDT05GSUdfRklMRSkKLQotICAgIHJhd2NvbmZpZ3MgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKCkKLSAgICByYXdjb25maWdzLnJlYWQoQ09ORklHX0ZJTEUpCi0KLSAgICB1c2VybmFtZV9mcm9tX2NxbHNocmMgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAnYXV0aGVudGljYXRpb24nLCAndXNlcm5hbWUnKQotICAgIHBhc3N3b3JkX2Zyb21fY3Fsc2hyYyA9IG9wdGlvbl93aXRoX2RlZmF1bHQocmF3Y29uZmlncy5nZXQsICdhdXRoZW50aWNhdGlvbicsICdwYXNzd29yZCcpCi0gICAgaWYgdXNlcm5hbWVfZnJvbV9jcWxzaHJjIG9yIHBhc3N3b3JkX2Zyb21fY3Fsc2hyYzoKLSAgICAgICAgaWYgcGFzc3dvcmRfZnJvbV9jcWxzaHJjIGFuZCBub3QgaXNfZmlsZV9zZWN1cmUob3MucGF0aC5leHBhbmR1c2VyKENPTkZJR19GSUxFKSk6Ci0gICAgICAgICAgICBwcmludCgiXG5XYXJuaW5nOiBQYXNzd29yZCBpcyBmb3VuZCBpbiBhbiBpbnNlY3VyZSBjcWxzaHJjIGZpbGUuIFRoZSBmaWxlIGlzIG93bmVkIG9yIHJlYWRhYmxlIGJ5IG90aGVyIHVzZXJzIG9uIHRoZSBzeXN0ZW0uIiwKLSAgICAgICAgICAgICAgICAgIGVuZD0nJywgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICBwcmludCgiXG5Ob3RpY2U6IENyZWRlbnRpYWxzIGluIHRoZSBjcWxzaHJjIGZpbGUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkIGluIHRoZSBmdXR1cmUuIgotICAgICAgICAgICAgICAiXG5QbGVhc2UgdXNlIGEgY3JlZGVudGlhbHMgZmlsZSB0byBzcGVjaWZ5IHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQuXG4iLCBmaWxlPXN5cy5zdGRlcnIpCi0KLSAgICBvcHR2YWx1ZXMgPSBvcHRwYXJzZS5WYWx1ZXMoKQotCi0gICAgb3B0dmFsdWVzLnVzZXJuYW1lID0gTm9uZQotICAgIG9wdHZhbHVlcy5wYXNzd29yZCA9IE5vbmUKLSAgICBvcHR2YWx1ZXMuY3JlZGVudGlhbHMgPSBvcy5wYXRoLmV4cGFuZHVzZXIob3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldCwgJ2F1dGhlbnRpY2F0aW9uJywgJ2NyZWRlbnRpYWxzJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oQ1FMX0RJUiwgJ2NyZWRlbnRpYWxzJykpKQotICAgIG9wdHZhbHVlcy5rZXlzcGFjZSA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXQsICdhdXRoZW50aWNhdGlvbicsICdrZXlzcGFjZScpCi0gICAgb3B0dmFsdWVzLmJyb3dzZXIgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAndWknLCAnYnJvd3NlcicsIE5vbmUpCi0gICAgb3B0dmFsdWVzLmNvbXBsZXRla2V5ID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldCwgJ3VpJywgJ2NvbXBsZXRla2V5JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQ09NUExFVEVLRVkpCi0gICAgb3B0dmFsdWVzLmNvbG9yID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldGJvb2xlYW4sICd1aScsICdjb2xvcicpCi0gICAgb3B0dmFsdWVzLnRpbWVfZm9ybWF0ID0gcmF3X29wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncywgJ3VpJywgJ3RpbWVfZm9ybWF0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVQpCi0gICAgb3B0dmFsdWVzLm5hbm90aW1lX2Zvcm1hdCA9IHJhd19vcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MsICd1aScsICduYW5vdGltZV9mb3JtYXQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX05BTk9USU1FX0ZPUk1BVCkKLSAgICBvcHR2YWx1ZXMuZGF0ZV9mb3JtYXQgPSByYXdfb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLCAndWknLCAnZGF0ZV9mb3JtYXQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfREFURV9GT1JNQVQpCi0gICAgb3B0dmFsdWVzLmZsb2F0X3ByZWNpc2lvbiA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRpbnQsICd1aScsICdmbG9hdF9wcmVjaXNpb24nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRkxPQVRfUFJFQ0lTSU9OKQotICAgIG9wdHZhbHVlcy5kb3VibGVfcHJlY2lzaW9uID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldGludCwgJ3VpJywgJ2RvdWJsZV9wcmVjaXNpb24nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RPVUJMRV9QUkVDSVNJT04pCi0gICAgb3B0dmFsdWVzLmZpZWxkX3NpemVfbGltaXQgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0aW50LCAnY3N2JywgJ2ZpZWxkX3NpemVfbGltaXQnLCBjc3YuZmllbGRfc2l6ZV9saW1pdCgpKQotICAgIG9wdHZhbHVlcy5tYXhfdHJhY2Vfd2FpdCA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRmbG9hdCwgJ3RyYWNpbmcnLCAnbWF4X3RyYWNlX3dhaXQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9NQVhfVFJBQ0VfV0FJVCkKLSAgICBvcHR2YWx1ZXMudGltZXpvbmUgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAndWknLCAndGltZXpvbmUnLCBOb25lKQotCi0gICAgb3B0dmFsdWVzLmRlYnVnID0gRmFsc2UKLQotICAgIG9wdHZhbHVlcy5jb3ZlcmFnZSA9IEZhbHNlCi0gICAgaWYgJ0NRTFNIX0NPVkVSQUdFJyBpbiBlbnZpcm9ubWVudC5rZXlzKCk6Ci0gICAgICAgIG9wdHZhbHVlcy5jb3ZlcmFnZSA9IFRydWUKLQotICAgIG9wdHZhbHVlcy5maWxlID0gTm9uZQotICAgIG9wdHZhbHVlcy5zc2wgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0Ym9vbGVhbiwgJ2Nvbm5lY3Rpb24nLCAnc3NsJywgREVGQVVMVF9TU0wpCi0gICAgb3B0dmFsdWVzLmVuY29kaW5nID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldCwgJ3VpJywgJ2VuY29kaW5nJywgVVRGOCkKLQotICAgIG9wdHZhbHVlcy50dHkgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0Ym9vbGVhbiwgJ3VpJywgJ3R0eScsIHN5cy5zdGRpbi5pc2F0dHkoKSkKLSAgICBvcHR2YWx1ZXMucHJvdG9jb2xfdmVyc2lvbiA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRpbnQsICdwcm90b2NvbCcsICd2ZXJzaW9uJywgTm9uZSkKLSAgICBvcHR2YWx1ZXMuY3FsdmVyc2lvbiA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXQsICdjcWwnLCAndmVyc2lvbicsIE5vbmUpCi0gICAgb3B0dmFsdWVzLmNvbm5lY3RfdGltZW91dCA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRpbnQsICdjb25uZWN0aW9uJywgJ3RpbWVvdXQnLCBERUZBVUxUX0NPTk5FQ1RfVElNRU9VVF9TRUNPTkRTKQotICAgIG9wdHZhbHVlcy5yZXF1ZXN0X3RpbWVvdXQgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0aW50LCAnY29ubmVjdGlvbicsICdyZXF1ZXN0X3RpbWVvdXQnLCBERUZBVUxUX1JFUVVFU1RfVElNRU9VVF9TRUNPTkRTKQotICAgIG9wdHZhbHVlcy5leGVjdXRlID0gTm9uZQotICAgIG9wdHZhbHVlcy5pbnNlY3VyZV9wYXNzd29yZF93aXRob3V0X3dhcm5pbmcgPSBGYWxzZQotCi0gICAgKG9wdGlvbnMsIGFyZ3VtZW50cykgPSBwYXJzZXIucGFyc2VfYXJncyhjbWRsaW5lYXJncywgdmFsdWVzPW9wdHZhbHVlcykKLQotICAgICMgQ3JlZGVudGlhbHMgZnJvbSBjcWxzaHJjIHdpbGwgYmUgZXhwYW5kZWQsCi0gICAgIyBjcmVkZW50aWFscyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYXJlIGFsc28gZXhwYW5kZWQgaWYgdGhlcmUgaXMgYSBzcGFjZS4uLgotICAgICMgd2UgbmVlZCB0aGUgZm9sbG93aW5nIHNvIHRoYXQgdGhlc2UgdHdvIHNjZW5hcmlvcyB3aWxsIHdvcmsKLSAgICAjICAgY3Fsc2ggLS1jcmVkZW50aWFscz1+Ly5jYXNzYW5kcmEvY3JlZHMKLSAgICAjICAgY3Fsc2ggLS1jcmVkZW50aWFscyB+Ly5jYXNzYW5kcmEvY3JlZHMKLSAgICBvcHRpb25zLmNyZWRlbnRpYWxzID0gb3MucGF0aC5leHBhbmR1c2VyKG9wdGlvbnMuY3JlZGVudGlhbHMpCi0KLSAgICBpZiBub3QgaXNfZmlsZV9zZWN1cmUob3B0aW9ucy5jcmVkZW50aWFscyk6Ci0gICAgICAgIHByaW50KCJcbldhcm5pbmc6IENyZWRlbnRpYWxzIGZpbGUgJ3swfScgZXhpc3RzIGJ1dCBpcyBub3QgdXNlZCwgYmVjYXVzZToiCi0gICAgICAgICAgICAgICJcbiAgYS4gdGhlIGZpbGUgb3duZXIgaXMgbm90IHRoZSBjdXJyZW50IHVzZXI7IG9yIgotICAgICAgICAgICAgICAiXG4gIGIuIHRoZSBmaWxlIGlzIHJlYWRhYmxlIGJ5IGdyb3VwIG9yIG90aGVyLiIKLSAgICAgICAgICAgICAgIlxuUGxlYXNlIGVuc3VyZSB0aGUgZmlsZSBpcyBvd25lZCBieSB0aGUgY3VycmVudCB1c2VyIGFuZCBpcyBub3QgcmVhZGFibGUgYnkgZ3JvdXAgb3Igb3RoZXIuIgotICAgICAgICAgICAgICAiXG5PbiBhIExpbnV4IG9yIFVOSVgtbGlrZSBzeXN0ZW0sIHlvdSBvZnRlbiBjYW4gZG8gdGhpcyBieSB1c2luZyB0aGUgYGNob3duYCBhbmQgYGNobW9kYCBjb21tYW5kczoiCi0gICAgICAgICAgICAgICJcbiAgY2hvd24gWU9VUl9VU0VSTkFNRSBjcmVkZW50aWFscyIKLSAgICAgICAgICAgICAgIlxuICBjaG1vZCA2MDAgY3JlZGVudGlhbHNcbiIuZm9ybWF0KG9wdGlvbnMuY3JlZGVudGlhbHMpLAotICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCi0gICAgICAgIG9wdGlvbnMuY3JlZGVudGlhbHMgPSAnJyAgIyBDb25maWdQYXJzZXIucmVhZCgpIHdpbGwgaWdub3JlIHVucmVhZGFibGUgZmlsZXMKLQotICAgIGlmIG5vdCBvcHRpb25zLnVzZXJuYW1lOgotICAgICAgICBjcmVkZW50aWFscyA9IGNvbmZpZ3BhcnNlci5Db25maWdQYXJzZXIoKQotICAgICAgICBjcmVkZW50aWFscy5yZWFkKG9wdGlvbnMuY3JlZGVudGlhbHMpCi0KLSAgICAgICAgIyB1c2UgdGhlIHVzZXJuYW1lIGZyb20gY3JlZGVudGlhbHMgZmlsZSBidXQgZmFsbGJhY2sgdG8gY3Fsc2hyYyBpZiB1c2VybmFtZSBpcyBhYnNlbnQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMKLSAgICAgICAgb3B0aW9ucy51c2VybmFtZSA9IHVzZXJuYW1lX2Zyb21fY3Fsc2hyYwotCi0gICAgaWYgbm90IG9wdGlvbnMucGFzc3dvcmQ6Ci0gICAgICAgIHJhd2NyZWRlbnRpYWxzID0gY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcigpCi0gICAgICAgIHJhd2NyZWRlbnRpYWxzLnJlYWQob3B0aW9ucy5jcmVkZW50aWFscykKLQotICAgICAgICAjIGhhbmRsaW5nIHBhc3N3b3JkIGluIHRoZSBzYW1lIHdheSBhcyB1c2VybmFtZSwgcHJpb3JpdHkgY2xpID4gY3JlZGVudGlhbHMgPiBjcWxzaHJjCi0gICAgICAgIG9wdGlvbnMucGFzc3dvcmQgPSBvcHRpb25fd2l0aF9kZWZhdWx0KHJhd2NyZWRlbnRpYWxzLmdldCwgJ3BsYWluX3RleHRfYXV0aCcsICdwYXNzd29yZCcsIHBhc3N3b3JkX2Zyb21fY3Fsc2hyYykKLSAgICAgICAgb3B0aW9ucy5wYXNzd29yZCA9IHBhc3N3b3JkX2Zyb21fY3Fsc2hyYwotICAgIGVsaWYgbm90IG9wdGlvbnMuaW5zZWN1cmVfcGFzc3dvcmRfd2l0aG91dF93YXJuaW5nOgotICAgICAgICBwcmludCgiXG5XYXJuaW5nOiBVc2luZyBhIHBhc3N3b3JkIG9uIHRoZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIGNhbiBiZSBpbnNlY3VyZS4iCi0gICAgICAgICAgICAgICJcblJlY29tbWVuZGF0aW9uOiB1c2UgdGhlIGNyZWRlbnRpYWxzIGZpbGUgdG8gc2VjdXJlbHkgcHJvdmlkZSB0aGUgcGFzc3dvcmQuXG4iLCBmaWxlPXN5cy5zdGRlcnIpCi0KLSAgICAjIE1ha2Ugc3VyZSBzb21lIHVzZXIgdmFsdWVzIHJlYWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFyZSBpbiB1bmljb2RlCi0gICAgb3B0aW9ucy5leGVjdXRlID0gbWF5YmVfZW5zdXJlX3RleHQob3B0aW9ucy5leGVjdXRlKQotICAgIG9wdGlvbnMudXNlcm5hbWUgPSBtYXliZV9lbnN1cmVfdGV4dChvcHRpb25zLnVzZXJuYW1lKQotICAgIG9wdGlvbnMucGFzc3dvcmQgPSBtYXliZV9lbnN1cmVfdGV4dChvcHRpb25zLnBhc3N3b3JkKQotICAgIG9wdGlvbnMua2V5c3BhY2UgPSBtYXliZV9lbnN1cmVfdGV4dChvcHRpb25zLmtleXNwYWNlKQotCi0gICAgaG9zdG5hbWUgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAnY29ubmVjdGlvbicsICdob3N0bmFtZScsIERFRkFVTFRfSE9TVCkKLSAgICBwb3J0ID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldCwgJ2Nvbm5lY3Rpb24nLCAncG9ydCcsIERFRkFVTFRfUE9SVCkKLQotICAgIHRyeToKLSAgICAgICAgb3B0aW9ucy5jb25uZWN0X3RpbWVvdXQgPSBpbnQob3B0aW9ucy5jb25uZWN0X3RpbWVvdXQpCi0gICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgIHBhcnNlci5lcnJvcignIiVzIiBpcyBub3QgYSB2YWxpZCBjb25uZWN0IHRpbWVvdXQuJyAlIChvcHRpb25zLmNvbm5lY3RfdGltZW91dCwpKQotICAgICAgICBvcHRpb25zLmNvbm5lY3RfdGltZW91dCA9IERFRkFVTFRfQ09OTkVDVF9USU1FT1VUX1NFQ09ORFMKLQotICAgIHRyeToKLSAgICAgICAgb3B0aW9ucy5yZXF1ZXN0X3RpbWVvdXQgPSBpbnQob3B0aW9ucy5yZXF1ZXN0X3RpbWVvdXQpCi0gICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgIHBhcnNlci5lcnJvcignIiVzIiBpcyBub3QgYSB2YWxpZCByZXF1ZXN0IHRpbWVvdXQuJyAlIChvcHRpb25zLnJlcXVlc3RfdGltZW91dCwpKQotICAgICAgICBvcHRpb25zLnJlcXVlc3RfdGltZW91dCA9IERFRkFVTFRfUkVRVUVTVF9USU1FT1VUX1NFQ09ORFMKLQotICAgIGhvc3RuYW1lID0gZW52aXJvbm1lbnQuZ2V0KCdDUUxTSF9IT1NUJywgaG9zdG5hbWUpCi0gICAgcG9ydCA9IGVudmlyb25tZW50LmdldCgnQ1FMU0hfUE9SVCcsIHBvcnQpCi0KLSAgICBpZiBsZW4oYXJndW1lbnRzKSA+IDA6Ci0gICAgICAgIGhvc3RuYW1lID0gYXJndW1lbnRzWzBdCi0gICAgaWYgbGVuKGFyZ3VtZW50cykgPiAxOgotICAgICAgICBwb3J0ID0gYXJndW1lbnRzWzFdCi0KLSAgICBpZiBvcHRpb25zLmZpbGUgb3Igb3B0aW9ucy5leGVjdXRlOgotICAgICAgICBvcHRpb25zLnR0eSA9IEZhbHNlCi0KLSAgICBpZiBvcHRpb25zLmV4ZWN1dGUgYW5kIG5vdCBvcHRpb25zLmV4ZWN1dGUuZW5kc3dpdGgoJzsnKToKLSAgICAgICAgb3B0aW9ucy5leGVjdXRlICs9ICc7JwotCi0gICAgaWYgb3B0dmFsdWVzLmNvbG9yIGluIChUcnVlLCBGYWxzZSk6Ci0gICAgICAgIG9wdGlvbnMuY29sb3IgPSBvcHR2YWx1ZXMuY29sb3IKLSAgICBlbHNlOgotICAgICAgICBpZiBvcHRpb25zLmZpbGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBvcHRpb25zLmNvbG9yID0gRmFsc2UKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG9wdGlvbnMuY29sb3IgPSBzaG91bGRfdXNlX2NvbG9yKCkKLQotICAgIGlmIG9wdGlvbnMuY3FsdmVyc2lvbiBpcyBub3QgTm9uZToKLSAgICAgICAgb3B0aW9ucy5jcWx2ZXJzaW9uLCBjcWx2ZXJ0dXAgPSBmdWxsX2NxbF92ZXJzaW9uKG9wdGlvbnMuY3FsdmVyc2lvbikKLSAgICAgICAgaWYgY3FsdmVydHVwWzBdIDwgMzoKLSAgICAgICAgICAgIHBhcnNlci5lcnJvcignJXIgaXMgbm90IGEgc3VwcG9ydGVkIENRTCB2ZXJzaW9uLicgJSBvcHRpb25zLmNxbHZlcnNpb24pCi0gICAgb3B0aW9ucy5jcWxtb2R1bGUgPSBjcWwzaGFuZGxpbmcKLQotICAgIHRyeToKLSAgICAgICAgcG9ydCA9IGludChwb3J0KQotICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICBwYXJzZXIuZXJyb3IoJyVyIGlzIG5vdCBhIHZhbGlkIHBvcnQgbnVtYmVyLicgJSBwb3J0KQotICAgIHJldHVybiBvcHRpb25zLCBob3N0bmFtZSwgcG9ydAotCi0KLWRlZiBzZXR1cF9jcWxydWxlc2V0KGNxbG1vZHVsZSk6Ci0gICAgZ2xvYmFsIGNxbHJ1bGVzZXQKLSAgICBjcWxydWxlc2V0ID0gY3FsbW9kdWxlLkNxbFJ1bGVTZXQKLSAgICBjcWxydWxlc2V0LmFwcGVuZF9ydWxlcyhjcWxzaGhhbmRsaW5nLmNxbHNoX2V4dHJhX3N5bnRheF9ydWxlcykKLSAgICBmb3IgcnVsZW5hbWUsIHRlcm1uYW1lLCBmdW5jIGluIGNxbHNoaGFuZGxpbmcuY3Fsc2hfc3ludGF4X2NvbXBsZXRlcnM6Ci0gICAgICAgIGNxbHJ1bGVzZXQuY29tcGxldGVyX2ZvcihydWxlbmFtZSwgdGVybW5hbWUpKGZ1bmMpCi0gICAgY3FscnVsZXNldC5jb21tYW5kc19lbmRfd2l0aF9uZXdsaW5lLnVwZGF0ZShjcWxzaGhhbmRsaW5nLm15X2NvbW1hbmRzX2VuZGluZ193aXRoX25ld2xpbmUpCi0KLQotZGVmIHNldHVwX2NxbGRvY3MoY3FsbW9kdWxlKToKLSAgICBnbG9iYWwgY3FsZG9jcwotICAgIGNxbGRvY3MgPSBjcWxtb2R1bGUuY3FsZG9jcwotCi0KLWRlZiBpbml0X2hpc3RvcnkoKToKLSAgICBpZiByZWFkbGluZSBpcyBub3QgTm9uZToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmVhZGxpbmUucmVhZF9oaXN0b3J5X2ZpbGUoSElTVE9SWSkKLSAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGRlbGltcyA9IHJlYWRsaW5lLmdldF9jb21wbGV0ZXJfZGVsaW1zKCkKLSAgICAgICAgZGVsaW1zLnJlcGxhY2UoIiciLCAiIikKLSAgICAgICAgZGVsaW1zICs9ICcuJwotICAgICAgICByZWFkbGluZS5zZXRfY29tcGxldGVyX2RlbGltcyhkZWxpbXMpCi0KLQotZGVmIHNhdmVfaGlzdG9yeSgpOgotICAgIGlmIHJlYWRsaW5lIGlzIG5vdCBOb25lOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICByZWFkbGluZS53cml0ZV9oaXN0b3J5X2ZpbGUoSElTVE9SWSkKLSAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0KLQotZGVmIG1haW4ob3B0aW9ucywgaG9zdG5hbWUsIHBvcnQpOgotICAgIHNldHVwX2NxbHJ1bGVzZXQob3B0aW9ucy5jcWxtb2R1bGUpCi0gICAgc2V0dXBfY3FsZG9jcyhvcHRpb25zLmNxbG1vZHVsZSkKLSAgICBpbml0X2hpc3RvcnkoKQotICAgIGNzdi5maWVsZF9zaXplX2xpbWl0KG9wdGlvbnMuZmllbGRfc2l6ZV9saW1pdCkKLQotICAgIGlmIG9wdGlvbnMuZmlsZSBpcyBOb25lOgotICAgICAgICBzdGRpbiA9IE5vbmUKLSAgICBlbHNlOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBlbmNvZGluZywgYm9tX3NpemUgPSBnZXRfZmlsZV9lbmNvZGluZ19ib21zaXplKG9wdGlvbnMuZmlsZSkKLSAgICAgICAgICAgIHN0ZGluID0gY29kZWNzLm9wZW4ob3B0aW9ucy5maWxlLCAncicsIGVuY29kaW5nKQotICAgICAgICAgICAgc3RkaW4uc2Vlayhib21fc2l6ZSkKLSAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKLSAgICAgICAgICAgIHN5cy5leGl0KCJDYW4ndCBvcGVuICVyOiAlcyIgJSAob3B0aW9ucy5maWxlLCBlKSkKLQotICAgIGlmIG9wdGlvbnMuZGVidWc6Ci0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlVzaW5nIENRTCBkcml2ZXI6ICVzXG4iICUgKGNhc3NhbmRyYSwpKQotICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJVc2luZyBjb25uZWN0IHRpbWVvdXQ6ICVzIHNlY29uZHNcbiIgJSAob3B0aW9ucy5jb25uZWN0X3RpbWVvdXQsKSkKLSAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiVXNpbmcgJyVzJyBlbmNvZGluZ1xuIiAlIChvcHRpb25zLmVuY29kaW5nLCkpCi0gICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlVzaW5nIHNzbDogJXNcbiIgJSAob3B0aW9ucy5zc2wsKSkKLQotICAgICMgY3JlYXRlIHRpbWV6b25lIGJhc2VkIG9uIHNldHRpbmdzLCBlbnZpcm9ubWVudCBvciBhdXRvLWRldGVjdGlvbgotICAgIHRpbWV6b25lID0gTm9uZQotICAgIGlmIG9wdGlvbnMudGltZXpvbmUgb3IgJ1RaJyBpbiBvcy5lbnZpcm9uOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbXBvcnQgcHl0egotICAgICAgICAgICAgaWYgb3B0aW9ucy50aW1lem9uZToKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHRpbWV6b25lID0gcHl0ei50aW1lem9uZShvcHRpb25zLnRpbWV6b25lKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIldhcm5pbmc6IGNvdWxkIG5vdCByZWNvZ25pemUgdGltZXpvbmUgJyVzJyBzcGVjaWZpZWQgaW4gY3Fsc2hyY1xuXG4iICUgKG9wdGlvbnMudGltZXpvbmUpKQotICAgICAgICAgICAgaWYgJ1RaJyBpbiBvcy5lbnZpcm9uOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgdGltZXpvbmUgPSBweXR6LnRpbWV6b25lKG9zLmVudmlyb25bJ1RaJ10pCi0gICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogY291bGQgbm90IHJlY29nbml6ZSB0aW1lem9uZSAnJXMnIGZyb20gZW52aXJvbm1lbnQgdmFsdWUgVFpcblxuIiAlIChvcy5lbnZpcm9uWydUWiddKSkKLSAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogVGltZXpvbmUgZGVmaW5lZCBhbmQgJ3B5dHonIG1vZHVsZSBmb3IgdGltZXpvbmUgY29udmVyc2lvbiBub3QgaW5zdGFsbGVkLiBUaW1lc3RhbXBzIHdpbGwgYmUgZGlzcGxheWVkIGluIFVUQyB0aW1lem9uZS5cblxuIikKLQotICAgICMgdHJ5IGF1dG8tZGV0ZWN0IHRpbWV6b25lIGlmIHR6bG9jYWwgaXMgaW5zdGFsbGVkCi0gICAgaWYgbm90IHRpbWV6b25lOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmcm9tIHR6bG9jYWwgaW1wb3J0IGdldF9sb2NhbHpvbmUKLSAgICAgICAgICAgIHRpbWV6b25lID0gZ2V0X2xvY2Fsem9uZSgpCi0gICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICMgd2Ugc2lsZW50bHkgaWdub3JlIGFuZCBmYWxsYmFjayB0byBVVEMgdW5sZXNzIGEgY3VzdG9tIHRpbWVzdGFtcCBmb3JtYXQgKHdoaWNoIGxpa2VseQotICAgICAgICAgICAgIyBkb2VzIGNvbnRhaW4gYSBUWiBwYXJ0KSB3YXMgc3BlY2lmaWVkCi0gICAgICAgICAgICBpZiBvcHRpb25zLnRpbWVfZm9ybWF0ICE9IERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVDoKLSAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJXYXJuaW5nOiBjdXN0b20gdGltZXN0YW1wIGZvcm1hdCBzcGVjaWZpZWQgaW4gY3Fsc2hyYywgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYnV0IGxvY2FsIHRpbWV6b25lIGNvdWxkIG5vdCBiZSBkZXRlY3RlZC5cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkVpdGhlciBpbnN0YWxsIFB5dGhvbiAndHpsb2NhbCcgbW9kdWxlIGZvciBhdXRvLWRldGVjdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJvciBzcGVjaWZ5IGNsaWVudCB0aW1lem9uZSBpbiB5b3VyIGNxbHNocmMuXG5cbiIpCi0KLSAgICB0cnk6Ci0gICAgICAgIHNoZWxsID0gU2hlbGwoaG9zdG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1vcHRpb25zLmNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lPW9wdGlvbnMudXNlcm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3RkaW4sCi0gICAgICAgICAgICAgICAgICAgICAgdHR5PW9wdGlvbnMudHR5LAotICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRla2V5PW9wdGlvbnMuY29tcGxldGVrZXksCi0gICAgICAgICAgICAgICAgICAgICAgYnJvd3Nlcj1vcHRpb25zLmJyb3dzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xfdmVyc2lvbj1vcHRpb25zLnByb3RvY29sX3ZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgY3FsdmVyPW9wdGlvbnMuY3FsdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICBrZXlzcGFjZT1vcHRpb25zLmtleXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfdGltZXN0YW1wX2Zvcm1hdD1vcHRpb25zLnRpbWVfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfbmFub3RpbWVfZm9ybWF0PW9wdGlvbnMubmFub3RpbWVfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZGF0ZV9mb3JtYXQ9b3B0aW9ucy5kYXRlX2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2Zsb2F0X3ByZWNpc2lvbj1vcHRpb25zLmZsb2F0X3ByZWNpc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2RvdWJsZV9wcmVjaXNpb249b3B0aW9ucy5kb3VibGVfcHJlY2lzaW9uLAotICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfdGltZXpvbmU9dGltZXpvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgbWF4X3RyYWNlX3dhaXQ9b3B0aW9ucy5tYXhfdHJhY2Vfd2FpdCwKLSAgICAgICAgICAgICAgICAgICAgICBzc2w9b3B0aW9ucy5zc2wsCi0gICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX3N0YXRlbWVudD1vcHRpb25zLmV4ZWN1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF90aW1lb3V0PW9wdGlvbnMucmVxdWVzdF90aW1lb3V0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfdGltZW91dD1vcHRpb25zLmNvbm5lY3RfdGltZW91dCwKLSAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz1vcHRpb25zLmVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgIGF1dGhfcHJvdmlkZXI9YXV0aHByb3ZpZGVyaGFuZGxpbmcubG9hZF9hdXRoX3Byb3ZpZGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfZmlsZT1DT05GSUdfRklMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlZF9maWxlPW9wdGlvbnMuY3JlZGVudGlhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lPW9wdGlvbnMudXNlcm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkPW9wdGlvbnMucGFzc3dvcmQpKQotICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgc3lzLmV4aXQoJ0Nvbm5lY3Rpb24gYWJvcnRlZC4nKQotICAgIGV4Y2VwdCBDUUxfRVJST1JTIGFzIGU6Ci0gICAgICAgIHN5cy5leGl0KCdDb25uZWN0aW9uIGVycm9yOiAlcycgJSAoZSwpKQotICAgIGV4Y2VwdCBWZXJzaW9uTm90U3VwcG9ydGVkIGFzIGU6Ci0gICAgICAgIHN5cy5leGl0KCdVbnN1cHBvcnRlZCBDUUwgdmVyc2lvbjogJXMnICUgKGUsKSkKLSAgICBpZiBvcHRpb25zLmRlYnVnOgotICAgICAgICBzaGVsbC5kZWJ1ZyA9IFRydWUKLSAgICBpZiBvcHRpb25zLmNvdmVyYWdlOgotICAgICAgICBzaGVsbC5jb3ZlcmFnZSA9IFRydWUKLSAgICAgICAgaW1wb3J0IHNpZ25hbAotCi0gICAgICAgIGRlZiBoYW5kbGVfc2lnaHVwKCk6Ci0gICAgICAgICAgICBzaGVsbC5zdG9wX2NvdmVyYWdlKCkKLSAgICAgICAgICAgIHNoZWxsLmRvX2V4aXQoKQotCi0gICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0hVUCwgaGFuZGxlX3NpZ2h1cCkKLQotICAgIHNoZWxsLmNtZGxvb3AoKQotICAgIHNhdmVfaGlzdG9yeSgpCi0KLSAgICBpZiBzaGVsbC5iYXRjaF9tb2RlIGFuZCBzaGVsbC5zdGF0ZW1lbnRfZXJyb3I6Ci0gICAgICAgIHN5cy5leGl0KDIpCi0KK2Zyb20gY3Fsc2hsaWIuY3Fsc2htYWluIGltcG9ydCBtYWluCiAKICMgYWx3YXlzIGNhbGwgdGhpcyByZWdhcmRsZXNzIG9mIG1vZHVsZSBuYW1lOiB3aGVuIGEgc3ViLXByb2Nlc3MgaXMgc3Bhd25lZAogIyBvbiBXaW5kb3dzIHRoZW4gdGhlIG1vZHVsZSBuYW1lIGlzIG5vdCBfX21haW5fXywgc2VlIENBU1NBTkRSQS05MzA0IChXaW5kb3dzIHN1cHBvcnQgd2FzIGRyb3BwZWQgaW4gQ0FTU0FORFJBLTE2OTU2KQotaW5zZXJ0X2RyaXZlcl9ob29rcygpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgbWFpbigqcmVhZF9vcHRpb25zKHN5cy5hcmd2WzE6XSwgb3MuZW52aXJvbikpCi0KLSMgdmltOiBzZXQgZnQ9cHl0aG9uIGV0IHRzPTQgc3c9NCA6CisgICAgbWFpbihzeXMuYXJndlsxOl0sIENBU1NBTkRSQV9QQVRIKQpkaWZmIC0tZ2l0IGEvYnVpbGQueG1sIGIvYnVpbGQueG1sCmluZGV4IGU1NmMxZjguLmEzZWYxZmMgMTAwNjQ0Ci0tLSBhL2J1aWxkLnhtbAorKysgYi9idWlsZC54bWwKQEAgLTE1LDcgKzE1LDYgQEAKICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAtLT4KIDxwcm9qZWN0IGJhc2VkaXI9Ii4iIGRlZmF1bHQ9ImphciIgbmFtZT0iYXBhY2hlLWNhc3NhbmRyYSIKLSAgICAgICAgIHhtbG5zOmFydGlmYWN0PSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiCiAgICAgICAgICB4bWxuczppZj0iYW50OmlmIgogICAgICAgICAgeG1sbnM6dW5sZXNzPSJhbnQ6dW5sZXNzIj4KIApAQCAtMzMsMTEgKzMyLDIwIEBACiAgICAgPHByb3BlcnR5IG5hbWU9ImRlYnVnbGV2ZWwiIHZhbHVlPSJzb3VyY2UsbGluZXMsdmFycyIvPgogCiAgICAgPCEtLSBkZWZhdWx0IHZlcnNpb24gYW5kIFNDTSBpbmZvcm1hdGlvbiAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0iYmFzZS52ZXJzaW9uIiB2YWx1ZT0iNC4xLjMiLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iYmFzZS52ZXJzaW9uIiB2YWx1ZT0iNS4wIi8+CiAgICAgPHByb3BlcnR5IG5hbWU9InNjbS5jb25uZWN0aW9uIiB2YWx1ZT0ic2NtOmh0dHBzOi8vZ2l0Ym94LmFwYWNoZS5vcmcvcmVwb3MvYXNmL2Nhc3NhbmRyYS5naXQiLz4KICAgICA8cHJvcGVydHkgbmFtZT0ic2NtLmRldmVsb3BlckNvbm5lY3Rpb24iIHZhbHVlPSJzY206aHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2YvY2Fzc2FuZHJhLmdpdCIvPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJzY20udXJsIiB2YWx1ZT0iaHR0cHM6Ly9naXRib3guYXBhY2hlLm9yZy9yZXBvcy9hc2Y/cD1jYXNzYW5kcmEuZ2l0O2E9dHJlZSIvPgogCisgICAgPCEtLSBKREtzIHN1cHBvcnRlZC4KKyAgICAgICAgQWxsIHJlbGVhc2VzIGFyZSBidWlsdCB3aXRoIHRoZSBkZWZhdWx0IEpESy4KKyAgICAgICAgQnVpbGRzIHdpdGggbm9uLWRlZmF1bHQgSkRLcyBhcmUgY29uc2lkZXJlZCBleHBlcmltZW50YWwgYW5kIGZvciBkZXZlbG9wbWVudCBhbmQgdGVzdGluZyBwdXJwb3Nlcy4KKyAgICAgICAgV2hlbiBidWlsZGluZywgamF2YWMncyBzb3VyY2UgYW5kIHRhcmdldCBmbGFncyBhcmUgc2V0IHRvIHRoZSBqZGsgdXNlZCwgc28gbG93ZXIgSkRLcyBhcmUgbm90IHN1cHBvcnRlZCBhdCBydW50aW1lLgorICAgICAgICBUaGUgdXNlIG9mIGJvdGggQ0FTU0FORFJBX1VTRV9KREsxMSBhbmQgdXNlLWpkazExIGlzIGRlcHJlY2F0ZWQuCisgICAgLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImphdmEuZGVmYXVsdCIgdmFsdWU9IjEuOCIgLz4KKyAgICA8cHJvcGVydHkgbmFtZT0iamF2YS5zdXBwb3J0ZWQiIHZhbHVlPSIxLjgsMTEsMTciIC8+CisKICAgICA8IS0tIGRpcmVjdG9yeSBkZXRhaWxzIC0tPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJiYXNlZGlyIiB2YWx1ZT0iLiIvPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJidWlsZC5zcmMiIHZhbHVlPSIke2Jhc2VkaXJ9L3NyYyIvPgpAQCAtOTQsMTEgKzEwMiw2IEBACiAKICAgICA8cHJvcGVydHkgbmFtZT0ibG9jYWwucmVwb3NpdG9yeSIgdmFsdWU9IiR7dXNlci5ob21lfS8ubTIvcmVwb3NpdG9yeSIgLz4KIAotICAgIDwhLS0gZGV0YWlscyBvZiB3aGF0IHZlcnNpb24gb2YgTWF2ZW4gQU5UIFRhc2tzIHRvIGZldGNoIC0tPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi1hbnQtdGFza3MudmVyc2lvbiIgdmFsdWU9IjIuMS4zIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi1hbnQtdGFza3MubG9jYWwiIHZhbHVlPSIke2xvY2FsLnJlcG9zaXRvcnl9L29yZy9hcGFjaGUvbWF2ZW4vbWF2ZW4tYW50LXRhc2tzIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im1hdmVuLWFudC10YXNrcy51cmwiCi0gICAgICAgICAgICAgIHZhbHVlPSJodHRwczovL3JlcG8ubWF2ZW4uYXBhY2hlLm9yZy9tYXZlbjIvb3JnL2FwYWNoZS9tYXZlbi9tYXZlbi1hbnQtdGFza3MiIC8+CiAgICAgPCEtLSBkZXRhaWxzIG9mIGhvdyBhbmQgd2hpY2ggTWF2ZW4gcmVwb3NpdG9yeSB3ZSBwdWJsaXNoIHRvIC0tPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi52ZXJzaW9uIiB2YWx1ZT0iMy4wLjMiIC8+CiAgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ibWF2ZW4tcmVwb3NpdG9yeS11cmwiIHZhbHVlPSJodHRwczovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMiI+CkBAIC0xMzAsMzcgKzEzMywyMCBAQAogICAgIDxwcm9wZXJ0eSBuYW1lPSJjYXNzYW5kcmEudGVzdC5tZXNzYWdpbmdTZXJ2aWNlLm5vbkdyYWNlZnVsU2h1dGRvd24iIHZhbHVlPSJ0cnVlIi8+CiAKICAgICA8IS0tIGh0dHBzOi8vd3d3LmVjbGVtbWEub3JnL2phY29jby8gLS0+CisgICAgPHByb3BlcnR5IG5hbWU9ImphY29jby52ZXJzaW9uIiB2YWx1ZT0iMC44LjgiLz4KICAgICA8cHJvcGVydHkgbmFtZT0iamFjb2NvLmV4cG9ydC5kaXIiIHZhbHVlPSIke2J1aWxkLmRpcn0vamFjb2NvLyIgLz4KICAgICA8cHJvcGVydHkgbmFtZT0iamFjb2NvLnBhcnRpYWxzLmRpciIgdmFsdWU9IiR7amFjb2NvLmV4cG9ydC5kaXJ9L3BhcnRpYWxzIiAvPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJqYWNvY28ucGFydGlhbGV4ZWNmaWxlIiB2YWx1ZT0iJHtqYWNvY28ucGFydGlhbHMuZGlyfS9wYXJ0aWFsLmV4ZWMiIC8+CiAgICAgPHByb3BlcnR5IG5hbWU9ImphY29jby5maW5hbGV4ZWNmaWxlIiB2YWx1ZT0iJHtqYWNvY28uZXhwb3J0LmRpcn0vamFjb2NvLmV4ZWMiIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImphY29jby52ZXJzaW9uIiB2YWx1ZT0iMC44LjYiLz4KIAotICAgIDxwcm9wZXJ0eSBuYW1lPSJieXRlbWFuLnZlcnNpb24iIHZhbHVlPSI0LjAuNiIvPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJqZmxleC52ZXJzaW9uIiB2YWx1ZT0iMS44LjIiLz4KICAgICA8cHJvcGVydHkgbmFtZT0iamFtbS52ZXJzaW9uIiB2YWx1ZT0iMC4zLjIiLz4KICAgICA8cHJvcGVydHkgbmFtZT0iZWNqLnZlcnNpb24iIHZhbHVlPSI0LjYuMSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJvaGMudmVyc2lvbiIgdmFsdWU9IjAuNS4xIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImFzbS52ZXJzaW9uIiB2YWx1ZT0iOS4xIi8+CisgICAgPCEtLSBXaGVuIHVwZGF0aW5nIEFTTSwgcGxlYXNlLCBkbyBjb25zaWRlciB3aGV0aGVyIHlvdSBtaWdodCBuZWVkIHRvIHVwZGF0ZSBhbHNvIEZCVXRpbGl0aWVzI0FTTV9CWVRFQ09ERV9WRVJTSU9OCisgICAgICBhbmQgdGhlIHNpbXVsYXRvciBJbnRlcmNlcHRDbGFzc2VzI0JZVEVDT0RFX1ZFUlNJT04sIGluIHBhcnRpY3VsYXIgaWYgd2UgYXJlIGxvb2tpbmcgdG8gcHJvdmlkZSBDYXNzYW5kcmEgc3VwcG9ydAorICAgICAgZm9yIG5ld2VyIEpES3MgKENBU1NBTkRSQS0xNzg3MykuIC0tPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhc20udmVyc2lvbiIgdmFsdWU9IjkuNCIvPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvY2F0aW9uLWluc3RydW1lbnRlci52ZXJzaW9uIiB2YWx1ZT0iMy4xLjAiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iYnl0ZWJ1ZGR5LnZlcnNpb24iIHZhbHVlPSIxLjEwLjEwIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpmbGV4LnZlcnNpb24iIHZhbHVlPSIxLjguMiIvPgotCi0gICAgPCEtLSBodHRwczovL212bnJlcG9zaXRvcnkuY29tL2FydGlmYWN0L25ldC5vcGVuaGZ0L2Nocm9uaWNsZS1ib20vMS4xNi4yMyAtLT4KLSAgICA8cHJvcGVydHkgbmFtZT0iY2hyb25pY2xlLXF1ZXVlLnZlcnNpb24iIHZhbHVlPSI1LjIwLjEyMyIgLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY2hyb25pY2xlLWNvcmUudmVyc2lvbiIgdmFsdWU9IjIuMjAuMTI2IiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjaHJvbmljbGUtYnl0ZXMudmVyc2lvbiIgdmFsdWU9IjIuMjAuMTExIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJjaHJvbmljbGUtd2lyZS52ZXJzaW9uIiB2YWx1ZT0iMi4yMC4xMTciIC8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImNocm9uaWNsZS10aHJlYWRzLnZlcnNpb24iIHZhbHVlPSIyLjIwLjExMSIgLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJkdGVzdC1hcGkudmVyc2lvbiIgdmFsdWU9IjAuMC4xMyIgLz4KLQotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Im1hdmVuLWFudC10YXNrcy5qYXIuZXhpc3RzIj4KLSAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHtidWlsZC5kaXJ9L21hdmVuLWFudC10YXNrcy0ke21hdmVuLWFudC10YXNrcy52ZXJzaW9ufS5qYXIiIC8+Ci0gICAgPC9jb25kaXRpb24+Ci0KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJtYXZlbi1hbnQtdGFza3MuamFyLmxvY2FsIj4KLSAgICAgIDxhdmFpbGFibGUgZmlsZT0iJHttYXZlbi1hbnQtdGFza3MubG9jYWx9LyR7bWF2ZW4tYW50LXRhc2tzLnZlcnNpb259L21hdmVuLWFudC10YXNrcy0ke21hdmVuLWFudC10YXNrcy52ZXJzaW9ufS5qYXIiIC8+Ci0gICAgPC9jb25kaXRpb24+CiAKICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJpcy5zb3VyY2UuYXJ0aWZhY3QiPgogICAgICAgPGF2YWlsYWJsZSBmaWxlPSIke2J1aWxkLnNyYy5qYXZhfSIgdHlwZT0iZGlyIiAvPgpAQCAtMTg3LDIwICsxNzMsMjMgQEAKICAgICA8L21hY3JvZGVmPgogICAgIDxzZXQta2VlcGJyaWVmLXByb3BlcnR5IHRlc3QtbmFtZT0iJHt0ZXN0Lm5hbWV9IiAvPgogCi0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamF2YS52ZXJzaW9uLjgiPgotICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7YW50LmphdmEudmVyc2lvbn0iIGFyZzI9IjEuOCIvPgorICAgIDxmYWlsIG1lc3NhZ2U9IlVuc3VwcG9ydGVkIEpESyB2ZXJzaW9uIHVzZWQ6ICR7YW50LmphdmEudmVyc2lvbn0iPgorICAgICAgICA8Y29uZGl0aW9uPjxub3Q+PGNvbnRhaW5zIHN0cmluZz0iJHtqYXZhLnN1cHBvcnRlZH0iIHN1YnN0cmluZz0iJHthbnQuamF2YS52ZXJzaW9ufSIvPjwvbm90PjwvY29uZGl0aW9uPgorICAgIDwvZmFpbD4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJpcy5qYXZhLmRlZmF1bHQiPjxlcXVhbHMgYXJnMT0iJHthbnQuamF2YS52ZXJzaW9ufSIgYXJnMj0iJHtqYXZhLmRlZmF1bHR9Ii8+PC9jb25kaXRpb24+CisgICAgPGVjaG8gdW5sZXNzOnRydWU9IiR7aXMuamF2YS5kZWZhdWx0fSIgbWVzc2FnZT0iTm9uIGRlZmF1bHQgSkRLIHZlcnNpb24gdXNlZDogJHthbnQuamF2YS52ZXJzaW9ufSIvPgorCisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iYXJjaF94ODYiPgorICAgICAgPGVxdWFscyBhcmcxPSIke29zLmFyY2h9IiBhcmcyPSJ4ODYiIC8+CiAgICAgPC9jb25kaXRpb24+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamF2YS52ZXJzaW9uLjExIj4KLSAgICAgICAgPG5vdD48aXNzZXQgcHJvcGVydHk9ImphdmEudmVyc2lvbi44Ii8+PC9ub3Q+CisgICAgPCEtLSBPbiBub24tWDg2IEpESyA4IChzdWNoIGFzIE0xIE1hYykgdGhlIHNtYWxsZXN0IGFsbG93ZWQgWHNzIGlzIDM4NGs7IHNvIG5lZWQgYSBsYXJnZXIgdmFsdWUKKyAgICB3aGVuIG9uIHRoZXNlIHBsYXRmb3Jtcy4gLS0+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0ianZtX3hzcyIgdmFsdWU9Ii1Yc3MyNTZrIiBlbHNlPSItWHNzMzg0ayI+CisgICAgICA8aXNzZXQgcHJvcGVydHk9ImFyY2hfeDg2IiAvPgogICAgIDwvY29uZGl0aW9uPgotICAgIDxmYWlsPjxjb25kaXRpb24+PG5vdD48b3I+Ci0gICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iamF2YS52ZXJzaW9uLjgiLz4KLSAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJqYXZhLnZlcnNpb24uMTEiLz4KLSAgICA8L29yPjwvbm90PjwvY29uZGl0aW9uPjwvZmFpbD4KIAogICAgIDxyZXNvdXJjZXMgaWQ9Il9qdm0xMV9hcmdfaXRlbXMiPgogICAgICAgICA8c3RyaW5nPi1EamRrLmF0dGFjaC5hbGxvd0F0dGFjaFNlbGY9dHJ1ZTwvc3RyaW5nPgotCiAgICAgICAgIDxzdHJpbmc+LVhYOitVc2VDb25jTWFya1N3ZWVwR0M8L3N0cmluZz4KICAgICAgICAgPHN0cmluZz4tWFg6K0NNU1BhcmFsbGVsUmVtYXJrRW5hYmxlZDwvc3RyaW5nPgogICAgICAgICA8c3RyaW5nPi1YWDpTdXJ2aXZvclJhdGlvPTg8L3N0cmluZz4KQEAgLTIxMSw2ICsyMDAsNyBAQAogICAgICAgICA8c3RyaW5nPi1YWDorQ01TUGFyYWxsZWxJbml0aWFsTWFya0VuYWJsZWQ8L3N0cmluZz4KICAgICAgICAgPHN0cmluZz4tWFg6K0NNU0VkZW5DaHVua3NSZWNvcmRBbHdheXM8L3N0cmluZz4KIAorCiAgICAgICAgIDxzdHJpbmc+LS1hZGQtZXhwb3J0cyBqYXZhLmJhc2UvamRrLmludGVybmFsLm1pc2M9QUxMLVVOTkFNRUQ8L3N0cmluZz4KICAgICAgICAgPHN0cmluZz4tLWFkZC1leHBvcnRzIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwucmVmPUFMTC1VTk5BTUVEPC9zdHJpbmc+CiAgICAgICAgIDxzdHJpbmc+LS1hZGQtZXhwb3J0cyBqYXZhLmJhc2Uvc3VuLm5pby5jaD1BTEwtVU5OQU1FRDwvc3RyaW5nPgpAQCAtMjMxLDkgKzIyMSw1MiBAQAogICAgIDwvcmVzb3VyY2VzPgogICAgIDxwYXRoY29udmVydCBwcm9wZXJ0eT0iX2p2bV9hcmdzX2NvbmNhdCIgcmVmaWQ9Il9qdm0xMV9hcmdfaXRlbXMiIHBhdGhzZXA9IiAiLz4KICAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXZhMTEtanZtYXJncyIgdmFsdWU9IiR7X2p2bV9hcmdzX2NvbmNhdH0iIGVsc2U9IiI+Ci0gICAgICAgIDxub3Q+Ci0gICAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7YW50LmphdmEudmVyc2lvbn0iIGFyZzI9IjEuOCIvPgotICAgICAgICA8L25vdD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2FudC5qYXZhLnZlcnNpb259IiBhcmcyPSIxMSIvPgorICAgIDwvY29uZGl0aW9uPgorCisgICAgPHJlc291cmNlcyBpZD0iX2p2bTE3X2FyZ19pdGVtcyI+CisgICAgICAgIDxzdHJpbmc+LURqZGsuYXR0YWNoLmFsbG93QXR0YWNoU2VsZj10cnVlPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LVhYOitVc2VHMUdDPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LVhYOitQYXJhbGxlbFJlZlByb2NFbmFibGVkPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LVhYOk1heFRlbnVyaW5nVGhyZXNob2xkPTE8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tWFg6RzFIZWFwUmVnaW9uU2l6ZT0xNm08L3N0cmluZz4KKworICAgICAgICA8c3RyaW5nPi0tYWRkLWV4cG9ydHMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5taXNjPUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LS1hZGQtZXhwb3J0cyBqYXZhLmJhc2UvamRrLmludGVybmFsLnJlZj1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLWV4cG9ydHMgamF2YS5iYXNlL3N1bi5uaW8uY2g9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1leHBvcnRzIGphdmEubWFuYWdlbWVudC5ybWkvY29tLnN1bi5qbXgucmVtb3RlLmludGVybmFsLnJtaT1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLWV4cG9ydHMgamF2YS5ybWkvc3VuLnJtaS5yZWdpc3RyeT1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLWV4cG9ydHMgamF2YS5ybWkvc3VuLnJtaS5zZXJ2ZXI9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1leHBvcnRzIGphdmEuc3FsL2phdmEuc3FsPUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LS1hZGQtZXhwb3J0cyBqYXZhLmJhc2UvamF2YS5sYW5nLnJlZj1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLWV4cG9ydHMgamRrLnVuc3VwcG9ydGVkL3N1bi5taXNjPUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LS1hZGQtZXhwb3J0cyBqZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5maWxlPUFMTC1VTk5BTUVEPC9zdHJpbmc+CisKKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5sYW5nLm1vZHVsZT1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLm5ldD1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwubG9hZGVyPUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LS1hZGQtb3BlbnMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5yZWY9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqYXZhLmJhc2UvamRrLmludGVybmFsLnJlZmxlY3Q9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqYXZhLmJhc2UvamRrLmludGVybmFsLm1hdGg9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqYXZhLmJhc2UvamRrLmludGVybmFsLm1vZHVsZT1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwudXRpbC5qYXI9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqZGsubWFuYWdlbWVudC9jb20uc3VuLm1hbmFnZW1lbnQuaW50ZXJuYWw9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqZGsubWFuYWdlbWVudC9jb20uc3VuLm1hbmFnZW1lbnQuaW50ZXJuYWw9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKworICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEuYmFzZS9zdW4ubmlvLmNoPUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEuaW89QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5uaW89QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS51dGlsLmNvbmN1cnJlbnQ9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS51dGlsPUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEudXRpbC5jb25jdXJyZW50LmF0b21pYz1BTEwtVU5OQU1FRDwvc3RyaW5nPgorICAgICAgICA8c3RyaW5nPi0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLmxhbmc9QUxMLVVOTkFNRUQ8L3N0cmluZz4KKyAgICAgICAgPHN0cmluZz4tLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5tYXRoPUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubGFuZy5yZWZsZWN0PUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgICAgIDxzdHJpbmc+LS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubmV0PUFMTC1VTk5BTUVEPC9zdHJpbmc+CisgICAgPC9yZXNvdXJjZXM+CisgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJfanZtX2FyZ3NfY29uY2F0MiIgcmVmaWQ9Il9qdm0xN19hcmdfaXRlbXMiIHBhdGhzZXA9IiAiLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqYXZhMTctanZtYXJncyIgdmFsdWU9IiR7X2p2bV9hcmdzX2NvbmNhdDJ9IiBlbHNlPSIiPgorICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7YW50LmphdmEudmVyc2lvbn0iIGFyZzI9IjE3Ii8+CiAgICAgPC9jb25kaXRpb24+CiAKICAgICA8IS0tCkBAIC0yNDgsNiArMjgxLDcgQEAKICAgICAgIEluIGphdmEgMTEgd2UgYWxzbyBuZWVkIHRvIHNldCBhIHN5c3RlbSBwcm9wZXJ0eSB0byBlbmFibGUgbmV0dHkgdG8gdXNlIFVuc2FmZSBkaXJlY3QgYnl0ZQogICAgICAgYnVmZmVyIGNvbnN0cnVjdGlvbiAoc2VlIENBU1NBTkRSQS0xNjQ5MykKICAgICAtLT4KKyAgICA8IS0tIExlYXZpbmcgIF9qdm04X3Rlc3RfYXJnX2l0ZW1zIGZvciBub3cgYXMgd2UgYXJlIG5vdCBkcm9wcGluZyBKYXZhIDggeWV0IGJ1dCBpdCB3aWxsIGJlIHVzZWxlc3MgYWZ0ZXIgQ0FTU0FORFJBLTE4MjU4LS0+CiAgICAgPHJlc291cmNlcyBpZD0iX2p2bThfdGVzdF9hcmdfaXRlbXMiPgogICAgICAgPCEtLSBUT0RPIHNlZSBDQVNTQU5EUkEtMTYyMTIgLSB3ZSBzZWVtIHRvIE9PTSBub24gc3RvcCBub3cgYWZ0ZXIgQ0FTU0FORFJBLTE2MjEyLCBzbyB0byBoYXZlIGNsZWFuIENJIHdoaWxlIHRoaXMgZ2V0cyBsb29rZWQgaW50bywgZGlzYWJsaW5nIGxpbWl0aW5nIG1ldGFzcGFjZQogICAgICAgICA8c3RyaW5nPi1YWDpNYXhNZXRhc3BhY2VFeHBhbnNpb249NjRNPC9zdHJpbmc+CkBAIC0yNjEsMzkgKzI5NSwzNSBAQAogICAgICAgICA8c3RyaW5nPi1EaW8ubmV0dHkudHJ5UmVmbGVjdGlvblNldEFjY2Vzc2libGU9dHJ1ZTwvc3RyaW5nPgogICAgIDwvcmVzb3VyY2VzPgogICAgIDxwYXRoY29udmVydCBwcm9wZXJ0eT0iX2p2bTExX3Rlc3RfYXJnX2l0ZW1zX2NvbmNhdCIgcmVmaWQ9Il9qdm0xMV90ZXN0X2FyZ19pdGVtcyIgcGF0aHNlcD0iICIvPgotICAgIDxjb25kaXRpb24gcHJvcGVydHk9Il9zdGQtdGVzdC1qdm1hcmdzIiB2YWx1ZT0iJHtfanZtMTFfdGVzdF9hcmdfaXRlbXNfY29uY2F0fSIgZWxzZT0iJHtfanZtOF90ZXN0X2FyZ19pdGVtc19jb25jYXR9Ij4KLSAgICAgICAgPG5vdD4KLSAgICAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHthbnQuamF2YS52ZXJzaW9ufSIgYXJnMj0iMS44Ii8+Ci0gICAgICAgIDwvbm90PgorICAgIDxyZXNvdXJjZXMgaWQ9Il9qdm0xN190ZXN0X2FyZ19pdGVtcyI+CisgICAgICAgIDxzdHJpbmc+LURpby5uZXR0eS50cnlSZWZsZWN0aW9uU2V0QWNjZXNzaWJsZT10cnVlPC9zdHJpbmc+CisgICAgPC9yZXNvdXJjZXM+CisgICAgPHBhdGhjb252ZXJ0IHByb3BlcnR5PSJfanZtMTdfdGVzdF9hcmdfaXRlbXNfY29uY2F0IiByZWZpZD0iX2p2bTE3X3Rlc3RfYXJnX2l0ZW1zIiBwYXRoc2VwPSIgIi8+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iX3N0ZC10ZXN0LWp2bWFyZ3MxMSIgdmFsdWU9IiR7X2p2bTExX3Rlc3RfYXJnX2l0ZW1zX2NvbmNhdH0iIGVsc2U9IiAiPgorICAgICAgICAgICAgPGVxdWFscyBhcmcxPSIke2FudC5qYXZhLnZlcnNpb259IiBhcmcyPSIxMSIvPgorICAgIDwvY29uZGl0aW9uPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9Il9zdGQtdGVzdC1qdm1hcmdzMTciIHZhbHVlPSIke19qdm0xN190ZXN0X2FyZ19pdGVtc19jb25jYXR9IiBlbHNlPSIgIj4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke2FudC5qYXZhLnZlcnNpb259IiBhcmcyPSIxNyIvPgogICAgIDwvY29uZGl0aW9uPgogCiAgICAgPCEtLSBuZWVkZWQgdG8gY29tcGlsZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KTVhTZXJ2ZXJVdGlscyAtLT4KLSAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqZGsxMS1qYXZhYy1leHBvcnRzIiB2YWx1ZT0iLS1hZGQtZXhwb3J0cyBqYXZhLnJtaS9zdW4ucm1pLnJlZ2lzdHJ5PUFMTC1VTk5BTUVEIiBlbHNlPSIiPgorICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImpkazExcGx1cy1qYXZhYy1leHBvcnRzIiB2YWx1ZT0iLS1hZGQtZXhwb3J0cyBqYXZhLnJtaS9zdW4ucm1pLnJlZ2lzdHJ5PUFMTC1VTk5BTUVEIiBlbHNlPSIiPgogICAgICAgICA8bm90PgogICAgICAgICAgICAgPGVxdWFscyBhcmcxPSIke2FudC5qYXZhLnZlcnNpb259IiBhcmcyPSIxLjgiLz4KICAgICAgICAgPC9ub3Q+CiAgICAgPC9jb25kaXRpb24+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0iamRrMTEtamF2YWRvYy1leHBvcnRzIiB2YWx1ZT0iJHtqZGsxMS1qYXZhYy1leHBvcnRzfSAtLWZyYW1lcyIgZWxzZT0iIj4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJqZGsxMXBsdXMtamF2YWRvYy1leHBvcnRzIiB2YWx1ZT0iJHtqZGsxMXBsdXMtamF2YWMtZXhwb3J0c30gLS1mcmFtZXMiIGVsc2U9IiI+CiAgICAgICAgIDxub3Q+CiAgICAgICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7YW50LmphdmEudmVyc2lvbn0iIGFyZzI9IjEuOCIvPgogICAgICAgICA8L25vdD4KICAgICA8L2NvbmRpdGlvbj4KLQotICAgIDxjb25kaXRpb24gcHJvcGVydHk9ImJ1aWxkLmphdmEuMTEiPgotICAgICAgICA8aXN0cnVlIHZhbHVlPSIke3VzZS5qZGsxMX0iLz4KLSAgICA8L2NvbmRpdGlvbj4KLQotICAgIDxjb25kaXRpb24gcHJvcGVydHk9InNvdXJjZS52ZXJzaW9uIiB2YWx1ZT0iOCIgZWxzZT0iMTEiPgotICAgICAgICA8ZXF1YWxzIGFyZzE9IiR7amF2YS52ZXJzaW9uLjh9IiBhcmcyPSJ0cnVlIi8+Ci0gICAgPC9jb25kaXRpb24+Ci0gICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0idGFyZ2V0LnZlcnNpb24iIHZhbHVlPSI4IiBlbHNlPSIxMSI+Ci0gICAgICAgIDxlcXVhbHMgYXJnMT0iJHtqYXZhLnZlcnNpb24uOH0iIGFyZzI9InRydWUiLz4KKyAgICA8Y29uZGl0aW9uIHByb3BlcnR5PSJjaGVja3N0eWxlLnZlcnNpb24iIHZhbHVlPSI4LjQ1LjEiIGVsc2U9IjEwLjguMSI+CisgICAgICAgIDxlcXVhbHMgYXJnMT0iJHthbnQuamF2YS52ZXJzaW9ufSIgYXJnMj0iMS44Ii8+CiAgICAgPC9jb25kaXRpb24+CiAKICAgICA8IS0tCiAgICAgICAgICBBZGQgYWxsIHRoZSBkZXBlbmRlbmNpZXMuCiAgICAgLS0+Ci0gICAgPHBhdGggaWQ9Im1hdmVuLWFudC10YXNrcy5jbGFzc3BhdGgiIHBhdGg9IiR7YnVpbGQuZGlyfS9tYXZlbi1hbnQtdGFza3MtJHttYXZlbi1hbnQtdGFza3MudmVyc2lvbn0uamFyIiAvPgogICAgIDxwYXRoIGlkPSJjYXNzYW5kcmEuY2xhc3NwYXRoIj4KICAgICAgICAgPHBhdGhlbGVtZW50IGxvY2F0aW9uPSIke2J1aWxkLmNsYXNzZXMubWFpbn0iIC8+CiAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtidWlsZC5kaXIubGlifSI+CkBAIC0zMTksNyArMzQ5LDcgQEAKICAgICAgICAgd2luZG93dGl0bGU9IiR7YW50LnByb2plY3QubmFtZX0gQVBJIiBjbGFzc3BhdGhyZWY9ImNhc3NhbmRyYS5jbGFzc3BhdGgiCiAgICAgICAgIGJvdHRvbT0iQ29weXJpZ2h0ICZhbXA7Y29weTsgMjAwOS0gVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIgogICAgICAgICB1c2VleHRlcm5hbGZpbGU9InllcyIgZW5jb2Rpbmc9IlVURi04IiBmYWlsb25lcnJvcj0iZmFsc2UiCi0gICAgICAgIG1heG1lbW9yeT0iMjU2bSIgYWRkaXRpb25hbHBhcmFtPSIke2pkazExLWphdmFkb2MtZXhwb3J0c30iPgorICAgICAgICBtYXhtZW1vcnk9IjI1Nm0iIGFkZGl0aW9uYWxwYXJhbT0iJHtqZGsxMXBsdXMtamF2YWRvYy1leHBvcnRzfSI+CiAgICAgICAgIDxmaWxlc2V0cy8+CiAgICAgICA8L2phdmFkb2M+CiAgICAgICA8ZmFpbCBtZXNzYWdlPSJqYXZhZG9jIGZhaWxlZCI+CkBAIC0zMzIsNTcgKzM2MiwxMCBAQAogICAgIDwvc2VxdWVudGlhbD4KICAgPC9tYWNyb2RlZj4KIAotICAgIDx0YXJnZXQgbmFtZT0idmFsaWRhdGUtYnVpbGQtY29uZiI+Ci0gICAgICAgIDxjb25kaXRpb24gcHJvcGVydHk9InVzZS1qZGsxMSI+Ci0gICAgICAgICAgICA8b3I+Ci0gICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJidWlsZC5qYXZhLjExIi8+Ci0gICAgICAgICAgICAgICAgPGlzdHJ1ZSB2YWx1ZT0iJHtlbnYuQ0FTU0FORFJBX1VTRV9KREsxMX0iLz4KLSAgICAgICAgICAgIDwvb3I+Ci0gICAgICAgIDwvY29uZGl0aW9uPgotICAgICAgICA8ZmFpbCBtZXNzYWdlPSJJbmNvbnNpc3RlbnQgSkRLMTEgb3B0aW9ucyBzZXQiPgotICAgICAgICAgICAgPGNvbmRpdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGFuZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IiR7ZW52LkNBU1NBTkRSQV9VU0VfSkRLMTF9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9InVzZS5qZGsxMSIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPG5vdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aXN0cnVlIHZhbHVlPSIke3VzZS5qZGsxMX0iLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvbm90PgotICAgICAgICAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICAgIDwvY29uZGl0aW9uPgotICAgICAgICAgICAgICAgIDwvZmFpbD4KLSAgICAgICAgPGZhaWwgbWVzc2FnZT0iSW5jb25zaXN0ZW50IEpESzExIG9wdGlvbnMgc2V0Ij4KLSAgICAgICAgICAgIDxjb25kaXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxhbmQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aXNzZXQgcHJvcGVydHk9ImVudi5DQVNTQU5EUkFfVVNFX0pESzExIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bm90PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IiR7ZW52LkNBU1NBTkRSQV9VU0VfSkRLMTF9Ii8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L25vdD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpc3RydWUgdmFsdWU9IiR7dXNlLmpkazExfSIvPgotICAgICAgICAgICAgICAgICAgICA8L2FuZD4KLSAgICAgICAgICAgIDwvY29uZGl0aW9uPgotICAgICAgICA8L2ZhaWw+Ci0gICAgICAgIDxmYWlsIG1lc3NhZ2U9Ii1EdXNlLmpkazExPXRydWUgb3IgJENBU1NBTkRSQV9VU0VfSkRLMTE9dHJ1ZSBjYW5ub3QgYmUgc2V0IHdoZW4gYnVpbGRpbmcgZnJvbSBqYXZhIDgiPgotICAgICAgICAgICAgPGNvbmRpdGlvbj4KLSAgICAgICAgICAgICAgICA8bm90Pjxvcj4KLSAgICAgICAgICAgICAgICAgICAgPG5vdD48aXNzZXQgcHJvcGVydHk9ImphdmEudmVyc2lvbi44Ii8+PC9ub3Q+Ci0gICAgICAgICAgICAgICAgICAgIDxub3Q+PGlzc2V0IHByb3BlcnR5PSJ1c2UtamRrMTEiLz48L25vdD4KLSAgICAgICAgICAgICAgICA8L29yPjwvbm90PgotICAgICAgICAgICAgPC9jb25kaXRpb24+Ci0gICAgICAgIDwvZmFpbD4KLSAgICAgICAgPGZhaWwgbWVzc2FnZT0iLUR1c2UuamRrMTE9dHJ1ZSBvciAkQ0FTU0FORFJBX1VTRV9KREsxMT10cnVlIG11c3QgYmUgc2V0IHdoZW4gYnVpbGRpbmcgZnJvbSBqYXZhIDExIj4KLSAgICAgICAgICAgIDxjb25kaXRpb24+Ci0gICAgICAgICAgICAgICAgPG5vdD48b3I+Ci0gICAgICAgICAgICAgICAgICAgIDxpc3NldCBwcm9wZXJ0eT0iamF2YS52ZXJzaW9uLjgiLz4KLSAgICAgICAgICAgICAgICAgICAgPGlzc2V0IHByb3BlcnR5PSJ1c2UtamRrMTEiLz4KLSAgICAgICAgICAgICAgICA8L29yPjwvbm90PgotICAgICAgICAgICAgPC9jb25kaXRpb24+Ci0gICAgICAgIDwvZmFpbD4KLSAgICA8L3RhcmdldD4KLQogICAgIDwhLS0KICAgICAgICAgU2V0dXAgdGhlIG91dHB1dCBkaXJlY3Rvcmllcy4KICAgICAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InZhbGlkYXRlLWJ1aWxkLWNvbmYiPgorICAgIDx0YXJnZXQgbmFtZT0iaW5pdCIgPgogICAgICAgICA8ZmFpbCB1bmxlc3M9ImlzLnNvdXJjZS5hcnRpZmFjdCIKICAgICAgICAgICAgIG1lc3NhZ2U9Ik5vdCBhIHNvdXJjZSBhcnRpZmFjdCwgc3RvcHBpbmcgaGVyZS4iIC8+CiAgICAgICAgIDxta2RpciBkaXI9IiR7YnVpbGQuY2xhc3Nlcy5tYWlufSIvPgpAQCAtMzk0LDYgKzM3NywxMyBAQAogICAgICAgICA8bWtkaXIgZGlyPSIke2J1aWxkLmRpci5saWJ9Ii8+CiAgICAgICAgIDxta2RpciBkaXI9IiR7amFjb2NvLmV4cG9ydC5kaXJ9Ii8+CiAgICAgICAgIDxta2RpciBkaXI9IiR7amFjb2NvLnBhcnRpYWxzLmRpcn0iLz4KKworICAgICAgICA8IS0tIFNldCB1cCBqZGsgc3BlY2lmaWMgcHJvcGVydGllcyAtLT4KKyAgICAgICAgPGphdmFjIGluY2x1ZGVzPSIqKi9KZGtQcm9wZXJ0aWVzLmphdmEiIHNyY2Rpcj0idGVzdC9hbnR0YXNrcyIgZGVzdGRpcj0iJHt0ZXN0LmNsYXNzZXN9IiBpbmNsdWRlYW50cnVudGltZT0idHJ1ZSIgc291cmNlPSIke2phdmEuZGVmYXVsdH0iIHRhcmdldD0iJHtqYXZhLmRlZmF1bHR9Ij4KKyAgICAgICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YbGludDotb3B0aW9ucyIvPgorICAgICAgICA8L2phdmFjPgorICAgICAgICA8dGFza2RlZiBuYW1lPSJKZGtQcm9wZXJ0aWVzIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUuY2Fzc2FuZHJhLmFudHRhc2tzLkpka1Byb3BlcnRpZXMiIGNsYXNzcGF0aD0iJHt0ZXN0LmNsYXNzZXN9Ii8+CisgICAgICAgIDxKZGtQcm9wZXJ0aWVzLz4KICAgICA8L3RhcmdldD4KIAogICAgIDx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlc2NyaXB0aW9uPSJSZW1vdmUgYWxsIGxvY2FsbHkgY3JlYXRlZCBhcnRpZmFjdHMiPgpAQCAtNDcyLDQzNiArNDYyLDEzIEBACiAgICAgICAgIDxqZmxleCBmaWxlPSIke2J1aWxkLnNyYy5qYXZhfS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL2FuYWx5emVyL1N0YW5kYXJkVG9rZW5pemVySW1wbC5qZmxleCIgZGVzdGRpcj0iJHtidWlsZC5zcmMuZ2VuLWphdmF9LyIgLz4KICAgICA8L3RhcmdldD4KIAotICAgIDwhLS0KLSAgICAgICBGZXRjaCBNYXZlbiBBbnQgVGFza3MgYW5kIENhc3NhbmRyYSdzIGRlcGVuZGVuY2llcwotICAgICAgIFRoZXNlIHRhcmdldHMgYXJlIGludGVudGlvbmFsbHkgZnJlZSBvZiBkZXBlbmRlbmNpZXMgc28gdGhhdCB0aGV5Ci0gICAgICAgY2FuIGJlIHJ1biBzdGFuZC1hbG9uZSBmcm9tIGEgYmluYXJ5IHJlbGVhc2UgYXJ0aWZhY3QuCi0gICAgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJtYXZlbi1hbnQtdGFza3MtbG9jYWxyZXBvIiB1bmxlc3M9Im1hdmVuLWFudC10YXNrcy5qYXIuZXhpc3RzIiBpZj0ibWF2ZW4tYW50LXRhc2tzLmphci5sb2NhbCIKLSAgICAgICAgICAgIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSJGZXRjaCBNYXZlbiBBTlQgVGFza3MgZnJvbSBNYXZlbiBMb2NhbCBSZXBvc2l0b3J5Ij4KLSAgICAgIDxjb3B5IGZpbGU9IiR7bWF2ZW4tYW50LXRhc2tzLmxvY2FsfS8ke21hdmVuLWFudC10YXNrcy52ZXJzaW9ufS9tYXZlbi1hbnQtdGFza3MtJHttYXZlbi1hbnQtdGFza3MudmVyc2lvbn0uamFyIgotICAgICAgICAgICB0b2ZpbGU9IiR7YnVpbGQuZGlyfS9tYXZlbi1hbnQtdGFza3MtJHttYXZlbi1hbnQtdGFza3MudmVyc2lvbn0uamFyIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ibWF2ZW4tYW50LXRhc2tzLmphci5leGlzdHMiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9Im1hdmVuLWFudC10YXNrcy1kb3dubG9hZCIgZGVwZW5kcz0iaW5pdCxtYXZlbi1hbnQtdGFza3MtbG9jYWxyZXBvIiB1bmxlc3M9Im1hdmVuLWFudC10YXNrcy5qYXIuZXhpc3RzIgotICAgICAgICAgICAgZGVzY3JpcHRpb249IkZldGNoIE1hdmVuIEFOVCBUYXNrcyBmcm9tIE1hdmVuIENlbnRyYWwgUmVwb3NpdHJveSI+Ci0gICAgICA8ZWNobz5Eb3dubG9hZGluZyBNYXZlbiBBTlQgVGFza3MuLi48L2VjaG8+Ci0gICAgICA8Z2V0IHNyYz0iJHttYXZlbi1hbnQtdGFza3MudXJsfS8ke21hdmVuLWFudC10YXNrcy52ZXJzaW9ufS9tYXZlbi1hbnQtdGFza3MtJHttYXZlbi1hbnQtdGFza3MudmVyc2lvbn0uamFyIgotICAgICAgICAgICBkZXN0PSIke2J1aWxkLmRpcn0vbWF2ZW4tYW50LXRhc2tzLSR7bWF2ZW4tYW50LXRhc2tzLnZlcnNpb259LmphciIgdXNldGltZXN0YW1wPSJ0cnVlIiAvPgotICAgICAgPGNvcHkgZmlsZT0iJHtidWlsZC5kaXJ9L21hdmVuLWFudC10YXNrcy0ke21hdmVuLWFudC10YXNrcy52ZXJzaW9ufS5qYXIiCi0gICAgICAgICAgICB0b2ZpbGU9IiR7bWF2ZW4tYW50LXRhc2tzLmxvY2FsfS8ke21hdmVuLWFudC10YXNrcy52ZXJzaW9ufS9tYXZlbi1hbnQtdGFza3MtJHttYXZlbi1hbnQtdGFza3MudmVyc2lvbn0uamFyIi8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9Im1hdmVuLWFudC10YXNrcy1pbml0IiBkZXBlbmRzPSJtYXZlbi1hbnQtdGFza3MtZG93bmxvYWQscmVzb2x2ZXItaW5pdCIgdW5sZXNzPSJtYXZlbi1hbnQtdGFza3MuaW5pdGlhbGl6ZWQiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iSW5pdGlhbGl6ZSBNYXZlbiBBTlQgVGFza3MiPgotICAgICAgPHR5cGVkZWYgdXJpPSJhbnRsaWI6b3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5hbnQiIGNsYXNzcGF0aHJlZj0ibWF2ZW4tYW50LXRhc2tzLmNsYXNzcGF0aCIgLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXZlbi1hbnQtdGFza3MuaW5pdGlhbGl6ZWQiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgPC90YXJnZXQ+Ci0KLSAgICA8IS0tIHRoaXMgdGFzayBkZWZpbmVzIHRoZSBkZXBlbmRlbmNpZXMgdGhhdCB3aWxsIGJlIGZldGNoZWQgYnkgTWF2ZW4gQU5UIFRhc2tzCi0gICAgICAgICB0aGUgZGVwZW5kZW5jaWVzIGFyZSByZS11c2VkIGZvciBwdWJsaXNoaW5nIGFydGlmYWN0cyB0byBNYXZlbiBDZW50cmFsCi0gICAgICAgICBpbiBvcmRlciB0byBrZWVwIGV2ZXJ5dGhpbmcgY29uc2lzdGVudCAtLT4KLSAgICA8dGFyZ2V0IG5hbWU9Im1hdmVuLWRlY2xhcmUtZGVwZW5kZW5jaWVzIiBkZXBlbmRzPSJtYXZlbi1hbnQtdGFza3MtaW5pdCIKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJEZWZpbmUgZGVwZW5kZW5jaWVzIGFuZCBkZXBlbmRlbmN5IHZlcnNpb25zIj4KLSAgICAgIDwhLS0gVGhlIHBhcmVudCBwb20gZGVmaW5lcyB0aGUgdmVyc2lvbnMgb2YgYWxsIGRlcGVuZGVuY2llcyAtLT4KLSAgICAgIDxhcnRpZmFjdDpwb20gaWQ9InBhcmVudC1wb20iCi0gICAgICAgICAgICAgICAgICAgIGdyb3VwSWQ9Im9yZy5hcGFjaGUuY2Fzc2FuZHJhIgotICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdElkPSJjYXNzYW5kcmEtcGFyZW50IgotICAgICAgICAgICAgICAgICAgICBwYWNrYWdpbmc9InBvbSIKLSAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0iJHt2ZXJzaW9ufSIKLSAgICAgICAgICAgICAgICAgICAgdXJsPSJodHRwczovL2Nhc3NhbmRyYS5hcGFjaGUub3JnIgotICAgICAgICAgICAgICAgICAgICBuYW1lPSJBcGFjaGUgQ2Fzc2FuZHJhIgotICAgICAgICAgICAgICAgICAgICBpbmNlcHRpb25ZZWFyPSIyMDA5IgotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVGhlIEFwYWNoZSBDYXNzYW5kcmEgUHJvamVjdCBkZXZlbG9wcyBhIGhpZ2hseSBzY2FsYWJsZSBzZWNvbmQtZ2VuZXJhdGlvbiBkaXN0cmlidXRlZCBkYXRhYmFzZSwgYnJpbmdpbmcgdG9nZXRoZXIgRHluYW1vJ3MgZnVsbHkgZGlzdHJpYnV0ZWQgZGVzaWduIGFuZCBCaWd0YWJsZSdzIENvbHVtbkZhbWlseS1iYXNlZCBkYXRhIG1vZGVsLiI+Ci0KLSAgICAgICAgPCEtLSBJbmhlcml0IGZyb20gdGhlIEFTRiB0ZW1wbGF0ZSBwb20gZmlsZSwgcmVmIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BvbS9hc2YvIC0tPgotICAgICAgICA8cGFyZW50IGdyb3VwSWQ9Im9yZy5hcGFjaGUiIGFydGlmYWN0SWQ9ImFwYWNoZSIgdmVyc2lvbj0iMjIiLz4KLSAgICAgICAgPGxpY2Vuc2UgbmFtZT0iVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCIgdXJsPSJodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dCIvPgotICAgICAgICA8c2NtIGNvbm5lY3Rpb249IiR7c2NtLmNvbm5lY3Rpb259IiBkZXZlbG9wZXJDb25uZWN0aW9uPSIke3NjbS5kZXZlbG9wZXJDb25uZWN0aW9ufSIgdXJsPSIke3NjbS51cmx9Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5TWFuYWdlbWVudD4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcueGVyaWFsLnNuYXBweSIgYXJ0aWZhY3RJZD0ic25hcHB5LWphdmEiIHZlcnNpb249IjEuMS44LjQiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcubHo0IiBhcnRpZmFjdElkPSJsejQtamF2YSIgdmVyc2lvbj0iMS44LjAiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20ubmluZyIgYXJ0aWZhY3RJZD0iY29tcHJlc3MtbHpmIiB2ZXJzaW9uPSIwLjguNCIgc2NvcGU9InByb3ZpZGVkIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdpdGh1Yi5sdWJlbiIgYXJ0aWZhY3RJZD0ienN0ZC1qbmkiIHZlcnNpb249IjEuNS41LTEiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ29vZ2xlLmd1YXZhIiBhcnRpZmFjdElkPSJndWF2YSIgdmVyc2lvbj0iMjcuMC1qcmUiPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJjb20uZ29vZ2xlLmNvZGUuZmluZGJ1Z3MiIGFydGlmYWN0SWQ9ImpzcjMwNSIgLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLmNvZGVoYXVzLm1vam8iIGFydGlmYWN0SWQ9ImFuaW1hbC1zbmlmZmVyLWFubm90YXRpb25zIiAvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJjb20uZ29vZ2xlLmd1YXZhIiBhcnRpZmFjdElkPSJsaXN0ZW5hYmxlZnV0dXJlIiAvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJjb20uZ29vZ2xlLmd1YXZhIiBhcnRpZmFjdElkPSJmYWlsdXJlYWNjZXNzIiAvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcuY2hlY2tlcmZyYW1ld29yayIgYXJ0aWZhY3RJZD0iY2hlY2tlci1xdWFsIiAvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJjb20uZ29vZ2xlLmVycm9ycHJvbmUiIGFydGlmYWN0SWQ9ImVycm9yX3Byb25lX2Fubm90YXRpb25zIiAvPgotICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ29vZ2xlLmppbWZzIiBhcnRpZmFjdElkPSJqaW1mcyIgdmVyc2lvbj0iMS4xIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmhkcmhpc3RvZ3JhbSIgYXJ0aWZhY3RJZD0iSGRySGlzdG9ncmFtIiB2ZXJzaW9uPSIyLjEuOSIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbW1vbnMtY2xpIiBhcnRpZmFjdElkPSJjb21tb25zLWNsaSIgdmVyc2lvbj0iMS4xIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tbW9ucy1jb2RlYyIgYXJ0aWZhY3RJZD0iY29tbW9ucy1jb2RlYyIgdmVyc2lvbj0iMS45Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tbW9ucy1pbyIgYXJ0aWZhY3RJZD0iY29tbW9ucy1pbyIgdmVyc2lvbj0iMi42Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5jb21tb25zIiBhcnRpZmFjdElkPSJjb21tb25zLWxhbmczIiB2ZXJzaW9uPSIzLjExIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5jb21tb25zIiBhcnRpZmFjdElkPSJjb21tb25zLW1hdGgzIiB2ZXJzaW9uPSIzLjIiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYW50bHIiIGFydGlmYWN0SWQ9ImFudGxyIiB2ZXJzaW9uPSIzLjUuMiIgc2NvcGU9InByb3ZpZGVkIj4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLmFudGxyIiBhcnRpZmFjdElkPSJzdHJpbmd0ZW1wbGF0ZSIvPgotICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYW50bHIiIGFydGlmYWN0SWQ9IlNUNCIgdmVyc2lvbj0iNC4wLjgiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYW50bHIiIGFydGlmYWN0SWQ9ImFudGxyLXJ1bnRpbWUiIHZlcnNpb249IjMuNS4yIj4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLmFudGxyIiBhcnRpZmFjdElkPSJzdHJpbmd0ZW1wbGF0ZSIvPgotICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuc2xmNGoiIGFydGlmYWN0SWQ9InNsZjRqLWFwaSIgdmVyc2lvbj0iMS43LjI1Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnNsZjRqIiBhcnRpZmFjdElkPSJsb2c0ai1vdmVyLXNsZjRqIiB2ZXJzaW9uPSIxLjcuMjUiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuc2xmNGoiIGFydGlmYWN0SWQ9ImpjbC1vdmVyLXNsZjRqIiB2ZXJzaW9uPSIxLjcuMjUiIC8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY2gucW9zLmxvZ2JhY2siIGFydGlmYWN0SWQ9ImxvZ2JhY2stY29yZSIgdmVyc2lvbj0iMS4yLjkiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjaC5xb3MubG9nYmFjayIgYXJ0aWZhY3RJZD0ibG9nYmFjay1jbGFzc2ljIiB2ZXJzaW9uPSIxLjIuOSIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlIiBhcnRpZmFjdElkPSJqYWNrc29uLWNvcmUiIHZlcnNpb249IjIuMTMuMiIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlIiBhcnRpZmFjdElkPSJqYWNrc29uLWRhdGFiaW5kIiB2ZXJzaW9uPSIyLjEzLjIuMiIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlIiBhcnRpZmFjdElkPSJqYWNrc29uLWFubm90YXRpb25zIiB2ZXJzaW9uPSIyLjEzLjIiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YXR5cGUiIGFydGlmYWN0SWQ9ImphY2tzb24tZGF0YXR5cGUtanNyMzEwIiB2ZXJzaW9uPSIyLjEzLjIiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWZvcm1hdCIgYXJ0aWZhY3RJZD0iamFja3Nvbi1kYXRhZm9ybWF0LXlhbWwiIHZlcnNpb249IjIuMTMuMiIgIHNjb3BlPSJ0ZXN0Ij4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLnlhbWwiIGFydGlmYWN0SWQ9InNuYWtleWFtbCIvPgotICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ29vZ2xlY29kZS5qc29uLXNpbXBsZSIgYXJ0aWZhY3RJZD0ianNvbi1zaW1wbGUiIHZlcnNpb249IjEuMSIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5ib3VuZGFyeSIgYXJ0aWZhY3RJZD0iaGlnaC1zY2FsZS1saWIiIHZlcnNpb249IjEuMC42Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdpdGh1Yi5qYmVsbGlzIiBhcnRpZmFjdElkPSJqYW1tIiB2ZXJzaW9uPSIke2phbW0udmVyc2lvbn0iLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcueWFtbCIgYXJ0aWZhY3RJZD0ic25ha2V5YW1sIiB2ZXJzaW9uPSIxLjI2Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ianVuaXQiIGFydGlmYWN0SWQ9Imp1bml0IiB2ZXJzaW9uPSI0LjEyIiBzY29wZT0idGVzdCI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5oYW1jcmVzdCIgYXJ0aWZhY3RJZD0iaGFtY3Jlc3QtY29yZSIvPgotICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcubW9ja2l0byIgYXJ0aWZhY3RJZD0ibW9ja2l0by1jb3JlIiB2ZXJzaW9uPSIzLjIuNCIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcucXVpY2t0aGVvcmllcyIgYXJ0aWZhY3RJZD0icXVpY2t0aGVvcmllcyIgdmVyc2lvbj0iMC4yNiIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ29vZ2xlLmNvZGUuamF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlciIgYXJ0aWZhY3RJZD0iamF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlciIgdmVyc2lvbj0iJHthbGxvY2F0aW9uLWluc3RydW1lbnRlci52ZXJzaW9ufSIgc2NvcGU9InRlc3QiPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJjb20uZ29vZ2xlLmd1YXZhIiBhcnRpZmFjdElkPSJndWF2YSIvPgotICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmNhc3NhbmRyYSIgYXJ0aWZhY3RJZD0iaGFycnktY29yZSIgdmVyc2lvbj0iMC4wLjEiIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnJlZmxlY3Rpb25zIiBhcnRpZmFjdElkPSJyZWZsZWN0aW9ucyIgdmVyc2lvbj0iMC4xMC4yIiBzY29wZT0idGVzdCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuY2Fzc2FuZHJhIiBhcnRpZmFjdElkPSJkdGVzdC1hcGkiIHZlcnNpb249IiR7ZHRlc3QtYXBpLnZlcnNpb259IiBzY29wZT0idGVzdCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5wdXBweWNyYXdsLnRvb2xzIiBhcnRpZmFjdElkPSJjaGVja3N0eWxlIiB2ZXJzaW9uPSI4LjQwIiBzY29wZT0idGVzdCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hcGFjaGUuaGFkb29wIiBhcnRpZmFjdElkPSJoYWRvb3AtY29yZSIgdmVyc2lvbj0iMS4wLjMiIHNjb3BlPSJwcm92aWRlZCI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5tb3J0YmF5LmpldHR5IiBhcnRpZmFjdElkPSJzZXJ2bGV0LWFwaSIvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJjb21tb25zLWxvZ2dpbmciIGFydGlmYWN0SWQ9ImNvbW1vbnMtbG9nZ2luZyIvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJjb21tb25zLWxhbmciIGFydGlmYWN0SWQ9ImNvbW1vbnMtbGFuZyIvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcuZWNsaXBzZS5qZHQiIGFydGlmYWN0SWQ9ImNvcmUiLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0iYW50IiBhcnRpZmFjdElkPSJhbnQiLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ianVuaXQiIGFydGlmYWN0SWQ9Imp1bml0Ii8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5jb2RlaGF1cy5qYWNrc29uIiBhcnRpZmFjdElkPSJqYWNrc29uLW1hcHBlci1hc2wiLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLnNsZjRqIiBhcnRpZmFjdElkPSJzbGY0ai1hcGkiLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5oYWRvb3AiIGFydGlmYWN0SWQ9ImhhZG9vcC1taW5pY2x1c3RlciIgdmVyc2lvbj0iMS4wLjMiIHNjb3BlPSJwcm92aWRlZCI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9ImFzbSIgYXJ0aWZhY3RJZD0iYXNtIi8+IDwhLS0gdGhpcyBpcyB0aGUgb3V0ZGF0ZWQgdmVyc2lvbiAzLjEgLS0+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5jb2RlaGF1cy5qYWNrc29uIiBhcnRpZmFjdElkPSJqYWNrc29uLW1hcHBlci1hc2wiLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLnNsZjRqIiBhcnRpZmFjdElkPSJzbGY0ai1hcGkiLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ibmV0LmphdmEuZGV2LmpuYSIgYXJ0aWZhY3RJZD0iam5hIiB2ZXJzaW9uPSI1LjkuMCIvPgotCi0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmphY29jbyIgYXJ0aWZhY3RJZD0ib3JnLmphY29jby5hZ2VudCIgdmVyc2lvbj0iJHtqYWNvY28udmVyc2lvbn0iIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmphY29jbyIgYXJ0aWZhY3RJZD0ib3JnLmphY29jby5hbnQiIHZlcnNpb249IiR7amFjb2NvLnZlcnNpb259IiBzY29wZT0idGVzdCI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5vdzIuYXNtIiBhcnRpZmFjdElkPSJhc20iLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuamJvc3MuYnl0ZW1hbiIgYXJ0aWZhY3RJZD0iYnl0ZW1hbi1pbnN0YWxsIiB2ZXJzaW9uPSIke2J5dGVtYW4udmVyc2lvbn0iIHNjb3BlPSJwcm92aWRlZCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5qYm9zcy5ieXRlbWFuIiBhcnRpZmFjdElkPSJieXRlbWFuIiB2ZXJzaW9uPSIke2J5dGVtYW4udmVyc2lvbn0iIHNjb3BlPSJwcm92aWRlZCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5qYm9zcy5ieXRlbWFuIiBhcnRpZmFjdElkPSJieXRlbWFuLXN1Ym1pdCIgdmVyc2lvbj0iJHtieXRlbWFuLnZlcnNpb259IiBzY29wZT0icHJvdmlkZWQiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuamJvc3MuYnl0ZW1hbiIgYXJ0aWZhY3RJZD0iYnl0ZW1hbi1ibXVuaXQiIHZlcnNpb249IiR7Ynl0ZW1hbi52ZXJzaW9ufSIgc2NvcGU9InByb3ZpZGVkIi8+Ci0KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJuZXQuYnl0ZWJ1ZGR5IiBhcnRpZmFjdElkPSJieXRlLWJ1ZGR5IiB2ZXJzaW9uPSIke2J5dGVidWRkeS52ZXJzaW9ufSIgLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJuZXQuYnl0ZWJ1ZGR5IiBhcnRpZmFjdElkPSJieXRlLWJ1ZGR5LWFnZW50IiB2ZXJzaW9uPSIke2J5dGVidWRkeS52ZXJzaW9ufSIgLz4KLQotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5vcGVuamRrLmptaCIgYXJ0aWZhY3RJZD0iam1oLWNvcmUiIHZlcnNpb249IjEuMjEiIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm9wZW5qZGsuam1oIiBhcnRpZmFjdElkPSJqbWgtZ2VuZXJhdG9yLWFubnByb2Nlc3MiIHZlcnNpb249IjEuMjEiIHNjb3BlPSJ0ZXN0Ii8+Ci0KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmFudCIgYXJ0aWZhY3RJZD0iYW50LWp1bml0IiB2ZXJzaW9uPSIxLjEwLjEyIiBzY29wZT0idGVzdCIvPgotCi0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5jYXNzYW5kcmEiIGFydGlmYWN0SWQ9ImNhc3NhbmRyYS1hbGwiIHZlcnNpb249IiR7dmVyc2lvbn0iIC8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iaW8uZHJvcHdpemFyZC5tZXRyaWNzIiBhcnRpZmFjdElkPSJtZXRyaWNzLWNvcmUiIHZlcnNpb249IjMuMS41IiAvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImlvLmRyb3B3aXphcmQubWV0cmljcyIgYXJ0aWZhY3RJZD0ibWV0cmljcy1qdm0iIHZlcnNpb249IjMuMS41IiAvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImlvLmRyb3B3aXphcmQubWV0cmljcyIgYXJ0aWZhY3RJZD0ibWV0cmljcy1sb2diYWNrIiB2ZXJzaW9uPSIzLjEuNSIgLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uYWRkdGhpcy5tZXRyaWNzIiBhcnRpZmFjdElkPSJyZXBvcnRlci1jb25maWczIiB2ZXJzaW9uPSIzLjAuMyI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5oaWJlcm5hdGUiIGFydGlmYWN0SWQ9ImhpYmVybmF0ZS12YWxpZGF0b3IiIC8+Ci0gICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcubWluZHJvdCIgYXJ0aWZhY3RJZD0iamJjcnlwdCIgdmVyc2lvbj0iMC40IiAvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImlvLmFpcmxpZnQiIGFydGlmYWN0SWQ9ImFpcmxpbmUiIHZlcnNpb249IjAuOCI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9ImNvbS5nb29nbGUuY29kZS5maW5kYnVncyIgYXJ0aWZhY3RJZD0ianNyMzA1IiAvPgotICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iaW8ubmV0dHkiIGFydGlmYWN0SWQ9Im5ldHR5LWJvbSIgdmVyc2lvbj0iNC4xLjU4LkZpbmFsIiB0eXBlPSJwb20iIHNjb3BlPSJwcm92aWRlZCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImlvLm5ldHR5IiBhcnRpZmFjdElkPSJuZXR0eS1hbGwiIHZlcnNpb249IjQuMS41OC5GaW5hbCIgLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJpby5uZXR0eSIgYXJ0aWZhY3RJZD0ibmV0dHktdGNuYXRpdmUtYm9yaW5nc3NsLXN0YXRpYyIgdmVyc2lvbj0iMi4wLjM2LkZpbmFsIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ibmV0Lm9wZW5oZnQiIGFydGlmYWN0SWQ9ImNocm9uaWNsZS1xdWV1ZSIgdmVyc2lvbj0iJHtjaHJvbmljbGUtcXVldWUudmVyc2lvbn0iPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJjb20uc3VuIiBhcnRpZmFjdElkPSJ0b29scyIgLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ibmV0Lm9wZW5oZnQiIGFydGlmYWN0SWQ9ImNocm9uaWNsZS1jb3JlIiB2ZXJzaW9uPSIke2Nocm9uaWNsZS1jb3JlLnZlcnNpb259Ij4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ibmV0Lm9wZW5oZnQiIGFydGlmYWN0SWQ9ImNocm9uaWNsZS1hbmFseXRpY3MiIC8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5qZXRicmFpbnMiIGFydGlmYWN0SWQ9ImFubm90YXRpb25zIiAvPgotICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJuZXQub3BlbmhmdCIgYXJ0aWZhY3RJZD0iY2hyb25pY2xlLWJ5dGVzIiB2ZXJzaW9uPSIke2Nocm9uaWNsZS1ieXRlcy52ZXJzaW9ufSI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5qZXRicmFpbnMiIGFydGlmYWN0SWQ9ImFubm90YXRpb25zIiAvPgotICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJuZXQub3BlbmhmdCIgYXJ0aWZhY3RJZD0iY2hyb25pY2xlLXdpcmUiIHZlcnNpb249IiR7Y2hyb25pY2xlLXdpcmUudmVyc2lvbn0iPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJuZXQub3BlbmhmdCIgYXJ0aWZhY3RJZD0iY29tcGlsZXIiIC8+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im5ldC5vcGVuaGZ0IiBhcnRpZmFjdElkPSJjaHJvbmljbGUtdGhyZWFkcyIgdmVyc2lvbj0iJHtjaHJvbmljbGUtdGhyZWFkcy52ZXJzaW9ufSI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im5ldC5vcGVuaGZ0IiBhcnRpZmFjdElkPSJhZmZpbml0eSIgLz4KLSAgICAgICAgICAgIDwhLS0gRXhjbHVkZSBKTkEgaGVyZSwgYXMgd2Ugd2FudCB0byBhdm9pZCBicmVha2luZyBjb25zdW1lcnMgb2YgdGhlIGNhc3NhbmRyYS1hbGwgamFyIC0tPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJuZXQuamF2YS5kZXYuam5hIiBhcnRpZmFjdElkPSJqbmEiIC8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im5ldC5qYXZhLmRldi5qbmEiIGFydGlmYWN0SWQ9ImpuYS1wbGF0Zm9ybSIgLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZS5jb2RlLmZpbmRidWdzIiBhcnRpZmFjdElkPSJqc3IzMDUiIHZlcnNpb249IjIuMC4yIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmNsZWFyc3ByaW5nLmFuYWx5dGljcyIgYXJ0aWZhY3RJZD0ic3RyZWFtIiB2ZXJzaW9uPSIyLjUuMiI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Iml0LnVuaW1pLmRzaSIgYXJ0aWZhY3RJZD0iZmFzdHV0aWwiIC8+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5kYXRhc3RheC5jYXNzYW5kcmEiIGFydGlmYWN0SWQ9ImNhc3NhbmRyYS1kcml2ZXItY29yZSIgdmVyc2lvbj0iMy4xMS4wIiBjbGFzc2lmaWVyPSJzaGFkZWQiPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJpby5uZXR0eSIgYXJ0aWZhY3RJZD0ibmV0dHktYnVmZmVyIi8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9ImlvLm5ldHR5IiBhcnRpZmFjdElkPSJuZXR0eS1jb2RlYyIvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJpby5uZXR0eSIgYXJ0aWZhY3RJZD0ibmV0dHktaGFuZGxlciIvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJpby5uZXR0eSIgYXJ0aWZhY3RJZD0ibmV0dHktdHJhbnNwb3J0Ii8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5zbGY0aiIgYXJ0aWZhY3RJZD0ic2xmNGotYXBpIi8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9ImNvbS5naXRodWIuam5yIiBhcnRpZmFjdElkPSJqbnItZmZpIi8+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9ImNvbS5naXRodWIuam5yIiBhcnRpZmFjdElkPSJqbnItcG9zaXgiLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIiIGFydGlmYWN0SWQ9ImVjaiIgdmVyc2lvbj0iJHtlY2oudmVyc2lvbn0iIC8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmNhZmZpbml0YXMub2hjIiBhcnRpZmFjdElkPSJvaGMtY29yZSIgdmVyc2lvbj0iJHtvaGMudmVyc2lvbn0iPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcuc2xmNGoiIGFydGlmYWN0SWQ9InNsZjRqLWFwaSIvPgotICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuY2FmZmluaXRhcy5vaGMiIGFydGlmYWN0SWQ9Im9oYy1jb3JlLWo4IiB2ZXJzaW9uPSIke29oYy52ZXJzaW9ufSIgLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJuZXQuanUtbi5jb21waWxlLWNvbW1hbmQtYW5ub3RhdGlvbnMiIGFydGlmYWN0SWQ9ImNvbXBpbGUtY29tbWFuZC1hbm5vdGF0aW9ucyIgdmVyc2lvbj0iMS4yLjAiIHNjb3BlPSJwcm92aWRlZCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5mdXNlc291cmNlIiBhcnRpZmFjdElkPSJzaWdhciIgdmVyc2lvbj0iMS42LjQiPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJsb2c0aiIgYXJ0aWZhY3RJZD0ibG9nNGoiLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmNhcnJvdHNlYXJjaCIgYXJ0aWZhY3RJZD0iaHBwYyIgdmVyc2lvbj0iMC44LjEiIC8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iZGUuamZsZXgiIGFydGlmYWN0SWQ9ImpmbGV4IiB2ZXJzaW9uPSIke2pmbGV4LnZlcnNpb259Ij4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLmFwYWNoZS5hbnQiIGFydGlmYWN0SWQ9ImFudCIvPgotICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ2l0aHViLnJob2xkZXIiIGFydGlmYWN0SWQ9InNub3diYWxsLXN0ZW1tZXIiIHZlcnNpb249IjEuMy4wLjU4MS4xIiAvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5nb29nbGVjb2RlLmNvbmN1cnJlbnQtdHJlZXMiIGFydGlmYWN0SWQ9ImNvbmN1cnJlbnQtdHJlZXMiIHZlcnNpb249IjIuNC4wIiAvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5naXRodWIuYmVuLW1hbmVzLmNhZmZlaW5lIiBhcnRpZmFjdElkPSJjYWZmZWluZSIgdmVyc2lvbj0iMi45LjIiIC8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmpjdG9vbHMiIGFydGlmYWN0SWQ9ImpjdG9vbHMtY29yZSIgdmVyc2lvbj0iMy4xLjAiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcub3cyLmFzbSIgYXJ0aWZhY3RJZD0iYXNtIiB2ZXJzaW9uPSIke2FzbS52ZXJzaW9ufSIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5vdzIuYXNtIiBhcnRpZmFjdElkPSJhc20tdHJlZSIgdmVyc2lvbj0iJHthc20udmVyc2lvbn0iIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm93Mi5hc20iIGFydGlmYWN0SWQ9ImFzbS1jb21tb25zIiB2ZXJzaW9uPSIke2FzbS52ZXJzaW9ufSIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcub3cyLmFzbSIgYXJ0aWZhY3RJZD0iYXNtLXV0aWwiIHZlcnNpb249IiR7YXNtLnZlcnNpb259IiBzY29wZT0idGVzdCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5ncmlka2l0Lmp2bXRvb2wiIGFydGlmYWN0SWQ9InNqay1jbGkiIHZlcnNpb249IjAuMTQiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuZ3JpZGtpdC5qdm10b29sIiBhcnRpZmFjdElkPSJzamstY29yZSIgdmVyc2lvbj0iMC4xNCI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5ncmlka2l0Lmp2bXRvb2wiIGFydGlmYWN0SWQ9InNqay1oZmxhbWUiLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLnBlcmZraXQuc2prLnBhcnNlcnMiIGFydGlmYWN0SWQ9InNqay1oZmxhbWUiLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLnBlcmZraXQuc2prLnBhcnNlcnMiIGFydGlmYWN0SWQ9InNqay1qZnItc3RhbmRhbG9uZSIvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcucGVyZmtpdC5zamsucGFyc2VycyIgYXJ0aWZhY3RJZD0ic2prLW5wcyIvPgotICAgICAgICAgICAgPGV4Y2x1c2lvbiBncm91cElkPSJvcmcucGVyZmtpdC5zamsucGFyc2VycyIgYXJ0aWZhY3RJZD0ic2prLWpmcjUiLz4KLSAgICAgICAgICAgIDxleGNsdXNpb24gZ3JvdXBJZD0ib3JnLnBlcmZraXQuc2prLnBhcnNlcnMiIGFydGlmYWN0SWQ9InNqay1qZnI2Ii8+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5ncmlka2l0Lmp2bXRvb2wiIGFydGlmYWN0SWQ9InNqay1zdGFja3RyYWNlIiB2ZXJzaW9uPSIwLjE0Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmdyaWRraXQuanZtdG9vbCIgYXJ0aWZhY3RJZD0ibXhkdW1wIiB2ZXJzaW9uPSIwLjE0Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmdyaWRraXQubGFiIiBhcnRpZmFjdElkPSJqdm0tYXR0YWNoLWFwaSIgdmVyc2lvbj0iMS41Ii8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmdyaWRraXQuanZtdG9vbCIgYXJ0aWZhY3RJZD0ic2prLWpzb24iIHZlcnNpb249IjAuMTQiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uYmV1c3QiIGFydGlmYWN0SWQ9Impjb21tYW5kZXIiIHZlcnNpb249IjEuMzAiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcucHNqYXZhIiBhcnRpZmFjdElkPSJwc2phdmEiIHZlcnNpb249IjAuMS4xOSIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImphdmF4LmluamVjdCIgYXJ0aWZhY3RJZD0iamF2YXguaW5qZWN0IiB2ZXJzaW9uPSIxIi8+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZS5qMm9iamMiIGFydGlmYWN0SWQ9Imoyb2JqYy1hbm5vdGF0aW9ucyIgdmVyc2lvbj0iMS4zIi8+Ci0gICAgICAgICAgPCEtLSBhZGRpbmcgdGhpcyBkZXBlbmRlbmN5IGlzIG5lY2Vzc2FyeSBmb3IgYXNzZXJ0ai4gV2hlbiB1cGRhdGluZyBhc3NlcnRqLCBuZWVkIHRvIGFsc28gdXBkYXRlIHRoZSB2ZXJzaW9uIG9mCi0gICAgICAgICAgICAgdGhpcyB0aGF0IHRoZSBuZXcgYXNzZXJ0aidzIGBhc3NlcnRqLXBhcmVudC1wb21gIGRlcGVuZHMgb24uIC0tPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5qdW5pdCIgYXJ0aWZhY3RJZD0ianVuaXQtYm9tIiB2ZXJzaW9uPSI1LjYuMCIgdHlwZT0icG9tIiBzY29wZT0idGVzdCIvPgotICAgICAgICAgIDwhLS0gd2hlbiB1cGRhdGluZyBhc3NlcnRqLCBtYWtlIHN1cmUgdG8gYWxzbyB1cGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcganVuaXQtYm9tIGRlcGVuZGVuY3kgLS0+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFzc2VydGoiIGFydGlmYWN0SWQ9ImFzc2VydGotY29yZSIgdmVyc2lvbj0iMy4xNS4wIiBzY29wZT0icHJvdmlkZWQiLz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXdhaXRpbGl0eSIgYXJ0aWZhY3RJZD0iYXdhaXRpbGl0eSIgdmVyc2lvbj0iNC4wLjMiICBzY29wZT0idGVzdCI+Ci0gICAgICAgICAgICA8ZXhjbHVzaW9uIGdyb3VwSWQ9Im9yZy5oYW1jcmVzdCIgYXJ0aWZhY3RJZD0iaGFtY3Jlc3QiLz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmhhbWNyZXN0IiBhcnRpZmFjdElkPSJoYW1jcmVzdCIgdmVyc2lvbj0iMi4yIiBzY29wZT0idGVzdCIvPgotICAgICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5naXRodWIuc2VhbmNmb2xleSIgYXJ0aWZhY3RJZD0iaXBhZGRyZXNzIiB2ZXJzaW9uPSI1LjMuMyIgLz4KLSAgICAgICAgPC9kZXBlbmRlbmN5TWFuYWdlbWVudD4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iYWRlbGFwZW5hIiBuYW1lPSJBbmRyZXMgZGUgbGEgUGXDsWEiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iYWxha3NobWFuIiBuYW1lPSJBdmluYXNoIExha3NobWFuIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImFsZWtzZXkiIG5hbWU9IkFsZWtzZXkgWWVzY2hlbmtvIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImFtb3J0b24iIG5hbWU9IkFhcm9uIE1vcnRvbiIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJhd2Vpc2JlcmciIG5hbWU9IkFyaWVsIFdlaXNiZXJnIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImJkZWdnbGVzdG9uIiBuYW1lPSJCbGFrZSBFZ2dsZXN0b24iLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iYmVuZWRpY3QiIG5hbWU9IkJlbmVkaWN0IEVsbGlvdHQgU21pdGgiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iYmVuamFtaW4iIG5hbWU9IkJlbmphbWluIExlcmVyIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImJsYW1ib3YiIG5hbWU9IkJyYW5pbWlyIExhbWJvdiIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJicmFuZG9ud2lsbGlhbXMiIG5hbWU9IkJyYW5kb24gV2lsbGlhbXMiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iY2FybCIgbmFtZT0iQ2FybCBZZWtzaWdpYW4iLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iZGJyb3NpdXMiIG5hbWU9IkRhdmlkIEJyb3NpdXNkIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImRpa2FuZyIgbmFtZT0iRGlrYW5nIEd1Ii8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImVldmFucyIgbmFtZT0iRXJpYyBFdmFucyIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJlZGltaXRyb3ZhIiBuYW1lPSJFa2F0ZXJpbmEgRGltaXRyb3ZhIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImdkdXNiYWJlayIgbmFtZT0iR2FyeSBEdXNiYWJlayIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJnb2ZmaW5ldCIgbmFtZT0iQ2hyaXMgR29mZmluZXQiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0iaWZlc2RqZWVuIiBuYW1lPSJBbGV4IFBldHJvdiIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJqYWFra28iIG5hbWU9IkxhaW5lIEphYWtrbyBPbGF2aSIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJqYWtlIiBuYW1lPSJUIEpha2UgTHVjaWFuaSIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJqYXNvbmJyb3duIiBuYW1lPSJKYXNvbiBCcm93biIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJqYmVsbGlzIiBuYW1lPSJKb25hdGhhbiBFbGxpcyIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJqZmFycmVsbCIgbmFtZT0iSmFrZSBGYXJyZWxsIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImpqaXJzYSIgbmFtZT0iSmVmZiBKaXJzYSIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJqa25pIiBuYW1lPSJKb2VsIEtuaWdodG9uIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImptY2tlbnppZSIgbmFtZT0iSm9zaCBNY0tlbnppZSIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJqb2hhbiIgbmFtZT0iSm9oYW4gT3NrYXJzc29uIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9Imp1bnJhbyIgbmFtZT0iSnVuIFJhbyIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJqemh1YW5nIiBuYW1lPSJKYXkgWmh1YW5nIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9ImtvaGxpc2Fua2FscCIgbmFtZT0iU2Fua2FscCBLb2hsaSIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJtYXJjdXNlIiBuYW1lPSJNYXJjdXMgRXJpa3Nzb24iLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0ibWNrIiBuYW1lPSJNaWNoYWVsIFNlbWIgV2V2ZXIiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0ibWlzaGFpbCIgbmFtZT0iTWlraGFpbCBTdGVwdXJhIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9Im1zaHVsZXIiIG5hbWU9Ik1pY2hhZWwgU2h1bGVyIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9InBhdWxvIiBuYW1lPSJQYXVsbyBNb3R0YSIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJwbWFsaWsiIG5hbWU9IlByYXNoYW50IE1hbGlrIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9InJzdHVwcCIgbmFtZT0iUm9iZXJ0IFN0dXBwIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9InNjb2RlIiBuYW1lPSJQZXRlciBTY2h1bGxlciIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJiZW9iYWwiIG5hbWU9IlNhbSBUdW5uaWNsaWZmZSIvPgotICAgICAgICA8ZGV2ZWxvcGVyIGlkPSJzbGVicmVzbmUiIG5hbWU9IlN5bHZhaW4gTGVicmVzbmUiLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0ic3RlZmFuaWEiIG5hbWU9IlN0ZWZhbmlhIEFsYm9yZ2hldHRpIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9InR5bGVyaG9iYnMiIG5hbWU9IlR5bGVyIEhvYmJzIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9InZpamF5IiBuYW1lPSJWaWpheSBQYXJ0aGFzYXJhdGh5Ii8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9InhlZGluIiBuYW1lPSJQYXZlbCBZYXNrZXZpY2giLz4KLSAgICAgICAgPGRldmVsb3BlciBpZD0ieXVraW0iIG5hbWU9Ill1a2kgTW9yaXNoaXRhIi8+Ci0gICAgICAgIDxkZXZlbG9wZXIgaWQ9Inp6bmF0ZSIgbmFtZT0iTmF0ZSBNY0NhbGwiLz4KLSAgICAgIDwvYXJ0aWZhY3Q6cG9tPgotCi0gICAgICA8IS0tIGVhY2ggZGVwZW5kZW5jeSBzZXQgdGhlbiBkZWZpbmVzIHRoZSBzdWJzZXQgb2YgdGhlIGRlcGVuZGVuY2llcyBmb3IgdGhhdCBkZXBlbmRlbmN5IHNldCAtLT4KLSAgICAgIDxhcnRpZmFjdDpwb20gaWQ9ImJ1aWxkLWRlcHMtcG9tIgotICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdElkPSJjYXNzYW5kcmEtYnVpbGQtZGVwcyI+Ci0gICAgICAgIDxwYXJlbnQgZ3JvdXBJZD0ib3JnLmFwYWNoZS5jYXNzYW5kcmEiCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3RJZD0iY2Fzc2FuZHJhLXBhcmVudCIKLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIke3ZlcnNpb259IgotICAgICAgICAgICAgICAgIHJlbGF0aXZlUGF0aD0iJHtmaW5hbC5uYW1lfS1wYXJlbnQucG9tIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Imp1bml0IiBhcnRpZmFjdElkPSJqdW5pdCIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tbW9ucy1pbyIgYXJ0aWZhY3RJZD0iY29tbW9ucy1pbyIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm1vY2tpdG8iIGFydGlmYWN0SWQ9Im1vY2tpdG8tY29yZSIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm93Mi5hc20iIGFydGlmYWN0SWQ9ImFzbSIgdmVyc2lvbj0iJHthc20udmVyc2lvbn0iLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm93Mi5hc20iIGFydGlmYWN0SWQ9ImFzbS10cmVlIiB2ZXJzaW9uPSIke2FzbS52ZXJzaW9ufSIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm93Mi5hc20iIGFydGlmYWN0SWQ9ImFzbS1jb21tb25zIiB2ZXJzaW9uPSIke2FzbS52ZXJzaW9ufSIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm93Mi5hc20iIGFydGlmYWN0SWQ9ImFzbS11dGlsIiB2ZXJzaW9uPSIke2FzbS52ZXJzaW9ufSIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZS5qaW1mcyIgYXJ0aWZhY3RJZD0iamltZnMiIHZlcnNpb249IjEuMSIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLnB1cHB5Y3Jhd2wudG9vbHMiIGFydGlmYWN0SWQ9ImNoZWNrc3R5bGUiIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5xdWlja3RoZW9yaWVzIiBhcnRpZmFjdElkPSJxdWlja3RoZW9yaWVzIiBzY29wZT0idGVzdCIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcucmVmbGVjdGlvbnMiIGFydGlmYWN0SWQ9InJlZmxlY3Rpb25zIiBzY29wZT0idGVzdCIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ29vZ2xlLmNvZGUuamF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlciIgYXJ0aWZhY3RJZD0iamF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlciIgdmVyc2lvbj0iJHthbGxvY2F0aW9uLWluc3RydW1lbnRlci52ZXJzaW9ufSIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5jYXNzYW5kcmEiIGFydGlmYWN0SWQ9ImR0ZXN0LWFwaSIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm9wZW5qZGsuam1oIiBhcnRpZmFjdElkPSJqbWgtY29yZSIgc2NvcGU9InRlc3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm9wZW5qZGsuam1oIiBhcnRpZmFjdElkPSJqbWgtZ2VuZXJhdG9yLWFubnByb2Nlc3MiIHNjb3BlPSJ0ZXN0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im5ldC5qdS1uLmNvbXBpbGUtY29tbWFuZC1hbm5vdGF0aW9ucyIgYXJ0aWZhY3RJZD0iY29tcGlsZS1jb21tYW5kLWFubm90YXRpb25zIiBzY29wZT0idGVzdCIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmFudCIgYXJ0aWZhY3RJZD0iYW50LWp1bml0IiBzY29wZT0idGVzdCIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmNhc3NhbmRyYSIgYXJ0aWZhY3RJZD0iaGFycnktY29yZSIvPgotICAgICAgICA8IS0tIGFkZGluZyB0aGlzIGRlcGVuZGVuY3kgaXMgbmVjZXNzYXJ5IGZvciBhc3NlcnRqLiBXaGVuIHVwZGF0aW5nIGFzc2VydGosIG5lZWQgdG8gYWxzbyB1cGRhdGUgdGhlIHZlcnNpb24gb2YKLSAgICAgICAgICAgICB0aGlzIHRoYXQgdGhlIG5ldyBhc3NlcnRqJ3MgYGFzc2VydGotcGFyZW50LXBvbWAgZGVwZW5kcyBvbi4gLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5qdW5pdCIgYXJ0aWZhY3RJZD0ianVuaXQtYm9tIiB0eXBlPSJwb20iLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmF3YWl0aWxpdHkiIGFydGlmYWN0SWQ9ImF3YWl0aWxpdHkiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmhhbWNyZXN0IiBhcnRpZmFjdElkPSJoYW1jcmVzdCIvPgotICAgICAgICA8IS0tIGNvdmVyYWdlIGRlYnMgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5qYWNvY28iIGFydGlmYWN0SWQ9Im9yZy5qYWNvY28uYWdlbnQiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmphY29jbyIgYXJ0aWZhY3RJZD0ib3JnLmphY29jby5hbnQiLz4KLQotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWZvcm1hdCIgYXJ0aWZhY3RJZD0iamFja3Nvbi1kYXRhZm9ybWF0LXlhbWwiLz4KLSAgICAgIDwvYXJ0aWZhY3Q6cG9tPgotCi0gICAgICA8IS0tIG5vdyB0aGUgcG9tJ3MgZm9yIGFydGlmYWN0cyBiZWluZyBkZXBsb3llZCB0byBNYXZlbiBDZW50cmFsIC0tPgotICAgICAgPGFydGlmYWN0OnBvbSBpZD0iYWxsLXBvbSIKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJZD0iY2Fzc2FuZHJhLWFsbCIKLSAgICAgICAgICAgICAgICAgICAgdXJsPSJodHRwczovL2Nhc3NhbmRyYS5hcGFjaGUub3JnIgotICAgICAgICAgICAgICAgICAgICBuYW1lPSJBcGFjaGUgQ2Fzc2FuZHJhIj4KLSAgICAgICAgPHBhcmVudCBncm91cElkPSJvcmcuYXBhY2hlLmNhc3NhbmRyYSIKLSAgICAgICAgICAgICAgICBhcnRpZmFjdElkPSJjYXNzYW5kcmEtcGFyZW50IgotICAgICAgICAgICAgICAgIHZlcnNpb249IiR7dmVyc2lvbn0iCi0gICAgICAgICAgICAgICAgcmVsYXRpdmVQYXRoPSIke2ZpbmFsLm5hbWV9LXBhcmVudC5wb20iLz4KLSAgICAgICAgPHNjbSBjb25uZWN0aW9uPSIke3NjbS5jb25uZWN0aW9ufSIgZGV2ZWxvcGVyQ29ubmVjdGlvbj0iJHtzY20uZGV2ZWxvcGVyQ29ubmVjdGlvbn0iIHVybD0iJHtzY20udXJsfSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcueGVyaWFsLnNuYXBweSIgYXJ0aWZhY3RJZD0ic25hcHB5LWphdmEiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmx6NCIgYXJ0aWZhY3RJZD0ibHo0LWphdmEiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLm5pbmciIGFydGlmYWN0SWQ9ImNvbXByZXNzLWx6ZiIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ29vZ2xlLmd1YXZhIiBhcnRpZmFjdElkPSJndWF2YSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb21tb25zLWNsaSIgYXJ0aWZhY3RJZD0iY29tbW9ucy1jbGkiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tbW9ucy1jb2RlYyIgYXJ0aWZhY3RJZD0iY29tbW9ucy1jb2RlYyIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmNvbW1vbnMiIGFydGlmYWN0SWQ9ImNvbW1vbnMtbGFuZzMiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5jb21tb25zIiBhcnRpZmFjdElkPSJjb21tb25zLW1hdGgzIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5hbnRsciIgYXJ0aWZhY3RJZD0iYW50bHIiIHNjb3BlPSJwcm92aWRlZCIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYW50bHIiIGFydGlmYWN0SWQ9IlNUNCIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYW50bHIiIGFydGlmYWN0SWQ9ImFudGxyLXJ1bnRpbWUiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnNsZjRqIiBhcnRpZmFjdElkPSJzbGY0ai1hcGkiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLnNsZjRqIiBhcnRpZmFjdElkPSJsb2c0ai1vdmVyLXNsZjRqIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5zbGY0aiIgYXJ0aWZhY3RJZD0iamNsLW92ZXItc2xmNGoiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUiIGFydGlmYWN0SWQ9ImphY2tzb24tY29yZSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZSIgYXJ0aWZhY3RJZD0iamFja3Nvbi1kYXRhYmluZCIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZSIgYXJ0aWZhY3RJZD0iamFja3Nvbi1hbm5vdGF0aW9ucyIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YXR5cGUiIGFydGlmYWN0SWQ9ImphY2tzb24tZGF0YXR5cGUtanNyMzEwIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5nb29nbGVjb2RlLmpzb24tc2ltcGxlIiBhcnRpZmFjdElkPSJqc29uLXNpbXBsZSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uYm91bmRhcnkiIGFydGlmYWN0SWQ9ImhpZ2gtc2NhbGUtbGliIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy55YW1sIiBhcnRpZmFjdElkPSJzbmFrZXlhbWwiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLm1pbmRyb3QiIGFydGlmYWN0SWQ9ImpiY3J5cHQiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iaW8uYWlybGlmdCIgYXJ0aWZhY3RJZD0iYWlybGluZSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJpby5kcm9wd2l6YXJkLm1ldHJpY3MiIGFydGlmYWN0SWQ9Im1ldHJpY3MtY29yZSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJpby5kcm9wd2l6YXJkLm1ldHJpY3MiIGFydGlmYWN0SWQ9Im1ldHJpY3MtanZtIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImlvLmRyb3B3aXphcmQubWV0cmljcyIgYXJ0aWZhY3RJZD0ibWV0cmljcy1sb2diYWNrIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5hZGR0aGlzLm1ldHJpY3MiIGFydGlmYWN0SWQ9InJlcG9ydGVyLWNvbmZpZzMiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmNsZWFyc3ByaW5nLmFuYWx5dGljcyIgYXJ0aWZhY3RJZD0ic3RyZWFtIi8+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY2gucW9zLmxvZ2JhY2siIGFydGlmYWN0SWQ9ImxvZ2JhY2stY29yZSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjaC5xb3MubG9nYmFjayIgYXJ0aWZhY3RJZD0ibG9nYmFjay1jbGFzc2ljIi8+Ci0KLSAgICAgICAgPCEtLSBkb24ndCBuZWVkIGhhZG9vcCBjbGFzc2VzIHRvIHJ1biwgYnV0IGlmIHlvdSB1c2UgdGhlIGhhZG9vcCBzdHVmZiAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmFwYWNoZS5oYWRvb3AiIGFydGlmYWN0SWQ9ImhhZG9vcC1jb3JlIiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXBhY2hlLmhhZG9vcCIgYXJ0aWZhY3RJZD0iaGFkb29wLW1pbmljbHVzdGVyIiBvcHRpb25hbD0idHJ1ZSIvPgotCi0gICAgICAgIDwhLS0gZG9uJ3QgbmVlZCB0aGUgSmF2YSBEcml2ZXIgdG8gcnVuLCBidXQgaWYgeW91IHVzZSB0aGUgaGFkb29wIHN0dWZmIG9yIFVERnMgLS0+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5kYXRhc3RheC5jYXNzYW5kcmEiIGFydGlmYWN0SWQ9ImNhc3NhbmRyYS1kcml2ZXItY29yZSIgY2xhc3NpZmllcj0ic2hhZGVkIiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgICAgIDwhLS0gZG9uJ3QgbmVlZCBqbmEgdG8gcnVuLCBidXQgbmljZSB0byBoYXZlIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJuZXQuamF2YS5kZXYuam5hIiBhcnRpZmFjdElkPSJqbmEiLz4KLQotICAgICAgICA8IS0tIGRvbid0IG5lZWQgamFtbSB1bmxlc3MgcnVubmluZyBhIHNlcnZlciBpbiB3aGljaCBjYXNlIGl0IG5lZWRzIHRvIGJlIGEgLWphdmFnZW50IHRvIGJlIHVzZWQgYW55d2F5IC0tPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ2l0aHViLmpiZWxsaXMiIGFydGlmYWN0SWQ9ImphbW0iLz4KLQotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJpby5uZXR0eSIgYXJ0aWZhY3RJZD0ibmV0dHktYm9tIiAgdHlwZT0icG9tIiAgLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iaW8ubmV0dHkiIGFydGlmYWN0SWQ9Im5ldHR5LWFsbCIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJuZXQub3BlbmhmdCIgYXJ0aWZhY3RJZD0iY2hyb25pY2xlLXF1ZXVlIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im5ldC5vcGVuaGZ0IiBhcnRpZmFjdElkPSJjaHJvbmljbGUtY29yZSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJuZXQub3BlbmhmdCIgYXJ0aWZhY3RJZD0iY2hyb25pY2xlLWJ5dGVzIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im5ldC5vcGVuaGZ0IiBhcnRpZmFjdElkPSJjaHJvbmljbGUtd2lyZSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJuZXQub3BlbmhmdCIgYXJ0aWZhY3RJZD0iY2hyb25pY2xlLXRocmVhZHMiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmZ1c2Vzb3VyY2UiIGFydGlmYWN0SWQ9InNpZ2FyIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyIiBhcnRpZmFjdElkPSJlY2oiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmNhZmZpbml0YXMub2hjIiBhcnRpZmFjdElkPSJvaGMtY29yZSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuY2FmZmluaXRhcy5vaGMiIGFydGlmYWN0SWQ9Im9oYy1jb3JlLWo4Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5naXRodWIuYmVuLW1hbmVzLmNhZmZlaW5lIiBhcnRpZmFjdElkPSJjYWZmZWluZSIgLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmpjdG9vbHMiIGFydGlmYWN0SWQ9ImpjdG9vbHMtY29yZSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcub3cyLmFzbSIgYXJ0aWZhY3RJZD0iYXNtIiAvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uY2Fycm90c2VhcmNoIiBhcnRpZmFjdElkPSJocHBjIiAvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuZ3JpZGtpdC5qdm10b29sIiBhcnRpZmFjdElkPSJzamstY2xpIiAvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuZ3JpZGtpdC5qdm10b29sIiBhcnRpZmFjdElkPSJzamstY29yZSIgLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmdyaWRraXQuanZtdG9vbCIgYXJ0aWZhY3RJZD0ic2prLXN0YWNrdHJhY2UiIC8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5ncmlka2l0Lmp2bXRvb2wiIGFydGlmYWN0SWQ9Im14ZHVtcCIgLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmdyaWRraXQubGFiIiBhcnRpZmFjdElkPSJqdm0tYXR0YWNoLWFwaSIgLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmJldXN0IiBhcnRpZmFjdElkPSJqY29tbWFuZGVyIiAvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuZ3JpZGtpdC5qdm10b29sIiBhcnRpZmFjdElkPSJzamstanNvbiIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ2l0aHViLmx1YmVuIiBhcnRpZmFjdElkPSJ6c3RkLWpuaSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcucHNqYXZhIiBhcnRpZmFjdElkPSJwc2phdmEiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iaW8ubmV0dHkiIGFydGlmYWN0SWQ9Im5ldHR5LXRjbmF0aXZlLWJvcmluZ3NzbC1zdGF0aWMiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iamF2YXguaW5qZWN0IiBhcnRpZmFjdElkPSJqYXZheC5pbmplY3QiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iY29tLmdvb2dsZS5qMm9iamMiIGFydGlmYWN0SWQ9Imoyb2JqYy1hbm5vdGF0aW9ucyIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuaGRyaGlzdG9ncmFtIiBhcnRpZmFjdElkPSJIZHJIaXN0b2dyYW0iLz4KLQotICAgICAgICA8IS0tIHNhc2kgZGVwcyAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0iZGUuamZsZXgiIGFydGlmYWN0SWQ9ImpmbGV4IiAvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ2l0aHViLnJob2xkZXIiIGFydGlmYWN0SWQ9InNub3diYWxsLXN0ZW1tZXIiIC8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9ImNvbS5nb29nbGVjb2RlLmNvbmN1cnJlbnQtdHJlZXMiIGFydGlmYWN0SWQ9ImNvbmN1cnJlbnQtdHJlZXMiIC8+Ci0KLSAgICAgICAgPCEtLSBjb21waWxlIHRvb2xzIC0tPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ29vZ2xlLmNvZGUuZmluZGJ1Z3MiIGFydGlmYWN0SWQ9ImpzcjMwNSIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJuZXQuanUtbi5jb21waWxlLWNvbW1hbmQtYW5ub3RhdGlvbnMiIGFydGlmYWN0SWQ9ImNvbXBpbGUtY29tbWFuZC1hbm5vdGF0aW9ucyIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJvcmcuYXNzZXJ0aiIgYXJ0aWZhY3RJZD0iYXNzZXJ0ai1jb3JlIi8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5qYm9zcy5ieXRlbWFuIiBhcnRpZmFjdElkPSJieXRlbWFuLWluc3RhbGwiLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmpib3NzLmJ5dGVtYW4iIGFydGlmYWN0SWQ9ImJ5dGVtYW4iLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgZ3JvdXBJZD0ib3JnLmpib3NzLmJ5dGVtYW4iIGFydGlmYWN0SWQ9ImJ5dGVtYW4tc3VibWl0Ii8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGdyb3VwSWQ9Im9yZy5qYm9zcy5ieXRlbWFuIiBhcnRpZmFjdElkPSJieXRlbWFuLWJtdW5pdCIvPgotICAgICAgICA8ZGVwZW5kZW5jeSBncm91cElkPSJjb20uZ2l0aHViLnNlYW5jZm9sZXkiIGFydGlmYWN0SWQ9ImlwYWRkcmVzcyIgLz4KLSAgICAgIDwvYXJ0aWZhY3Q6cG9tPgotICAgIDwvdGFyZ2V0PgotCi0gICAgPCEtLSBkZXByZWNhdGVkOiBsZWdhY3kgY29tcGF0aWJpbGl0eSBmb3IgYnVpbGQgc2NyaXB0cyBpbiBvdGhlciByZXBvc2l0b3JpZXMgLS0+Ci0gICAgPHRhcmdldCBuYW1lPSJtYXZlbi1hbnQtdGFza3MtcmV0cmlldmUtYnVpbGQiIGRlcGVuZHM9InJlc29sdmVyLXJldHJpZXZlLWJ1aWxkIi8+Ci0KLSAgICA8dGFyZ2V0IG5hbWU9ImVjaG8tYmFzZS12ZXJzaW9uIj4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iJHtiYXNlLnZlcnNpb259IiAvPgotICAgIDwvdGFyZ2V0PgotCiAgICAgPCEtLSBjcmVhdGUgcHJvcGVydGllcyBmaWxlIHdpdGggQyB2ZXJzaW9uIC0tPgotICAgIDx0YXJnZXQgbmFtZT0iY3JlYXRlVmVyc2lvblByb3BGaWxlIj4KKyAgICA8dGFyZ2V0IG5hbWU9ImNyZWF0ZVZlcnNpb25Qcm9wRmlsZSIgZGVwZW5kcz0iZ2V0LWdpdC1zaGEiPgogICAgICAgPHRhc2tkZWYgbmFtZT0icHJvcGVydHlmaWxlIiBjbGFzc25hbWU9Im9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLlByb3BlcnR5RmlsZSIvPgogICAgICAgPG1rZGlyIGRpcj0iJHt2ZXJzaW9uLnByb3BlcnRpZXMuZGlyfSIvPgogICAgICAgPHByb3BlcnR5ZmlsZSBmaWxlPSIke3ZlcnNpb24ucHJvcGVydGllcy5kaXJ9L3ZlcnNpb24ucHJvcGVydGllcyI+CiAgICAgICAgIDxlbnRyeSBrZXk9IkNhc3NhbmRyYVZlcnNpb24iIHZhbHVlPSIke3ZlcnNpb259Ii8+CisgICAgICAgIDxlbnRyeSBrZXk9IkdpdFNIQSIgdmFsdWU9IiR7Z2l0LnNoYX0iLz4KICAgICAgIDwvcHJvcGVydHlmaWxlPgogICAgIDwvdGFyZ2V0PgogCkBAIC05MTcsNiArNDg0LDcgQEAKICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWphdmFhZ2VudDoke2J1aWxkLmxpYn0vamFtbS0ke2phbW0udmVyc2lvbn0uamFyIiAvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KICAgICAgICAgPGp2bWFyZyBsaW5lPSIke2phdmExMS1qdm1hcmdzfSIvPgorICAgICAgICA8anZtYXJnIGxpbmU9IiR7amF2YTE3LWp2bWFyZ3N9Ii8+CiAgICAgICA8L2phdmE+CiAgICAgPC90YXJnZXQ+CiAKQEAgLTkyOSwyMiArNDk3LDIyIEBACiAKICAgICA8dGFyZ2V0IG5hbWU9Il9idWlsZF9qYXZhIj4KICAgICAgICAgPCEtLSBOb3RlOiB3ZSBjYW5ub3QgdXNlIGphdmFjJ3MgJ3JlbGVhc2UnIG9wdGlvbiwgYXMgdGhhdCBkb2VzIG5vdCBhbGxvdyBhY2Nlc3Npbmcgc3VuLm1pc2MuVW5zYWZlIG5vcgotICAgICAgICBOYXNob3JuJ3MgQ2xhc3NGaWx0ZXIgY2xhc3MgYXMgYW55IGphdmFjIG1vZHVsZXMgb3B0aW9uIGlzIGludmFsaWQgZm9yIHJlbGFzZSA4LiAtLT4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iQ29tcGlsaW5nIGZvciBKYXZhICR7dGFyZ2V0LnZlcnNpb259Li4uIi8+CisgICAgICAgIE5hc2hvcm4ncyBDbGFzc0ZpbHRlciBjbGFzcyBhcyBhbnkgamF2YWMgbW9kdWxlcyBvcHRpb24gaXMgaW52YWxpZCBmb3IgcmVsZWFzZSA4LiAtLT4KKyAgICAgICAgPGVjaG8gbWVzc2FnZT0iQ29tcGlsaW5nIGZvciBKYXZhICR7YW50LmphdmEudmVyc2lvbn0uLi4iLz4KICAgICAgICAgPGphdmFjCiAgICAgICAgICAgICAgICBkZWJ1Zz0idHJ1ZSIgZGVidWdsZXZlbD0iJHtkZWJ1Z2xldmVsfSIgZW5jb2Rpbmc9InV0Zi04IgotICAgICAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzLm1haW59IiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNvdXJjZT0iJHtzb3VyY2UudmVyc2lvbn0iIHRhcmdldD0iJHt0YXJnZXQudmVyc2lvbn0iPgorICAgICAgICAgICAgICAgZGVzdGRpcj0iJHtidWlsZC5jbGFzc2VzLm1haW59IiBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIHNvdXJjZT0iJHthbnQuamF2YS52ZXJzaW9ufSIgdGFyZ2V0PSIke2FudC5qYXZhLnZlcnNpb259Ij4KICAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtidWlsZC5zcmMuamF2YX0iLz4KICAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtidWlsZC5zcmMuZ2VuLWphdmF9Ii8+CiAgICAgICAgICAgICA8Y29tcGlsZXJhcmcgdmFsdWU9Ii1YRGlnbm9yZS5zeW1ib2wuZmlsZSIvPgotICAgICAgICAgICAgPGNvbXBpbGVyYXJnIGxpbmU9IiR7amRrMTEtamF2YWMtZXhwb3J0c30iLz4KKyAgICAgICAgICAgIDxjb21waWxlcmFyZyBsaW5lPSIke2pkazExcGx1cy1qYXZhYy1leHBvcnRzfSIvPgogICAgICAgICAgICAgPGNsYXNzcGF0aD4KICAgICAgICAgICAgICAgICA8cGF0aCByZWZpZD0iY2Fzc2FuZHJhLmNsYXNzcGF0aCIvPgogICAgICAgICAgICAgPC9jbGFzc3BhdGg+CiAgICAgICAgIDwvamF2YWM+CiAgICAgPC90YXJnZXQ+CiAKLSAgICA8dGFyZ2V0IGRlcGVuZHM9ImluaXQsZ2VuLWNxbDMtZ3JhbW1hcixnZW5lcmF0ZS1jcWwtaHRtbCxnZW5lcmF0ZS1qZmxleC1qYXZhLHJhdC1jaGVjayIKKyAgICA8dGFyZ2V0IGRlcGVuZHM9ImluaXQsZ2VuLWNxbDMtZ3JhbW1hcixnZW5lcmF0ZS1jcWwtaHRtbCxnZW5lcmF0ZS1qZmxleC1qYXZhLHJhdC1jaGVjayxnZXQtZ2l0LXNoYSIKICAgICAgICAgICAgIG5hbWU9ImJ1aWxkLXByb2plY3QiPgogICAgICAgICA8ZWNobyBtZXNzYWdlPSIke2FudC5wcm9qZWN0Lm5hbWV9OiAke2FudC5maWxlfSIvPgogICAgICAgICA8IS0tIE9yZGVyIG1hdHRlcnMhIC0tPgpAQCAtOTY1LDcgKzUzMyw3IEBACiAKICAgICA8dGFyZ2V0IG5hbWU9InN0cmVzcy1idWlsZC10ZXN0IiBkZXBlbmRzPSJzdHJlc3MtYnVpbGQiIGRlc2NyaXB0aW9uPSJDb21waWxlIHN0cmVzcyB0ZXN0cyI+CiAgICAgICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgZGVidWdsZXZlbD0iJHtkZWJ1Z2xldmVsfSIgZGVzdGRpcj0iJHtzdHJlc3MudGVzdC5jbGFzc2VzfSIKLSAgICAgICAgICAgICAgIHNvdXJjZT0iJHtzb3VyY2UudmVyc2lvbn0iIHRhcmdldD0iJHt0YXJnZXQudmVyc2lvbn0iCisgICAgICAgICAgICAgICBzb3VyY2U9IiR7YW50LmphdmEudmVyc2lvbn0iIHRhcmdldD0iJHthbnQuamF2YS52ZXJzaW9ufSIKICAgICAgICAgICAgICAgIGluY2x1ZGVhbnRydW50aW1lPSJmYWxzZSIgZW5jb2Rpbmc9InV0Zi04Ij4KICAgICAgICAgICAgIDxjbGFzc3BhdGg+CiAgICAgICAgICAgICAgICAgPHBhdGggcmVmaWQ9ImNhc3NhbmRyYS5jbGFzc3BhdGgudGVzdCIvPgpAQCAtOTgyLDcgKzU1MCw3IEBACiAgICAgPHRhcmdldCBuYW1lPSJfc3RyZXNzX2J1aWxkIj4KICAgICAJPG1rZGlyIGRpcj0iJHtzdHJlc3MuYnVpbGQuY2xhc3Nlc30iIC8+CiAgICAgICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBkZWJ1Zz0idHJ1ZSIgZGVidWdsZXZlbD0iJHtkZWJ1Z2xldmVsfSIKLSAgICAgICAgICAgICAgIHNvdXJjZT0iJHtzb3VyY2UudmVyc2lvbn0iIHRhcmdldD0iJHt0YXJnZXQudmVyc2lvbn0iCisgICAgICAgICAgICAgICBzb3VyY2U9IiR7YW50LmphdmEudmVyc2lvbn0iIHRhcmdldD0iJHthbnQuamF2YS52ZXJzaW9ufSIKICAgICAgICAgICAgICAgIGVuY29kaW5nPSJ1dGYtOCIgZGVzdGRpcj0iJHtzdHJlc3MuYnVpbGQuY2xhc3Nlc30iIGluY2x1ZGVhbnRydW50aW1lPSJ0cnVlIj4KICAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzdHJlc3MuYnVpbGQuc3JjfSIgLz4KICAgICAgICAgICAgIDxjbGFzc3BhdGg+CkBAIC0xMDIzLDcgKzU5MSw3IEBACiAKICAgICA8dGFyZ2V0IG5hbWU9ImZxbHRvb2wtYnVpbGQtdGVzdCIgZGVwZW5kcz0iZnFsdG9vbC1idWlsZCIgZGVzY3JpcHRpb249IkNvbXBpbGUgZnFsdG9vbCB0ZXN0cyI+CiAgICAgICAgIDxqYXZhYyBkZWJ1Zz0idHJ1ZSIgZGVidWdsZXZlbD0iJHtkZWJ1Z2xldmVsfSIgZGVzdGRpcj0iJHtmcWx0b29sLnRlc3QuY2xhc3Nlc30iCi0gICAgICAgICAgICAgICBzb3VyY2U9IiR7c291cmNlLnZlcnNpb259IiB0YXJnZXQ9IiR7dGFyZ2V0LnZlcnNpb259IgorICAgICAgICAgICAgICAgc291cmNlPSIke2FudC5qYXZhLnZlcnNpb259IiB0YXJnZXQ9IiR7YW50LmphdmEudmVyc2lvbn0iCiAgICAgICAgICAgICAgICBpbmNsdWRlYW50cnVudGltZT0iZmFsc2UiIGVuY29kaW5nPSJ1dGYtOCI+CiAgICAgICAgICAgICA8Y2xhc3NwYXRoPgogICAgICAgICAgICAgICAgIDxwYXRoIHJlZmlkPSJjYXNzYW5kcmEuY2xhc3NwYXRoLnRlc3QiLz4KQEAgLTEwNDAsNyArNjA4LDcgQEAKICAgICA8dGFyZ2V0IG5hbWU9Il9mcWx0b29sX2J1aWxkIj4KICAgICAJPG1rZGlyIGRpcj0iJHtmcWx0b29sLmJ1aWxkLmNsYXNzZXN9IiAvPgogICAgICAgICA8amF2YWMgY29tcGlsZXI9Im1vZGVybiIgZGVidWc9InRydWUiIGRlYnVnbGV2ZWw9IiR7ZGVidWdsZXZlbH0iCi0gICAgICAgICAgICAgICBzb3VyY2U9IiR7c291cmNlLnZlcnNpb259IiB0YXJnZXQ9IiR7dGFyZ2V0LnZlcnNpb259IgorICAgICAgICAgICAgICAgc291cmNlPSIke2FudC5qYXZhLnZlcnNpb259IiB0YXJnZXQ9IiR7YW50LmphdmEudmVyc2lvbn0iCiAgICAgICAgICAgICAgICBlbmNvZGluZz0idXRmLTgiIGRlc3RkaXI9IiR7ZnFsdG9vbC5idWlsZC5jbGFzc2VzfSIgaW5jbHVkZWFudHJ1bnRpbWU9InRydWUiPgogICAgICAgICAgICAgPHNyYyBwYXRoPSIke2ZxbHRvb2wuYnVpbGQuc3JjfSIgLz4KICAgICAgICAgICAgIDxjbGFzc3BhdGg+CkBAIC0xMDQ5LDcgKzYxNyw3IEBACiAgICAgICAgIDwvamF2YWM+CiAgICAgPC90YXJnZXQ+CiAKLSAgICA8dGFyZ2V0IG5hbWU9ImZxbHRvb2wtdGVzdCIgZGVwZW5kcz0iZnFsdG9vbC1idWlsZC10ZXN0LCBtYXliZS1idWlsZC10ZXN0IiBkZXNjcmlwdGlvbj0iUnVucyBmcWx0b29sIHRlc3RzIj4KKyAgICA8dGFyZ2V0IG5hbWU9ImZxbHRvb2wtdGVzdCIgZGVwZW5kcz0iZnFsdG9vbC1idWlsZC10ZXN0LCBidWlsZC10ZXN0IiBkZXNjcmlwdGlvbj0iUnVucyBmcWx0b29sIHRlc3RzIj4KICAgICAgICAgPHRlc3RtYWNybyBpbnB1dGRpcj0iJHtmcWx0b29sLnRlc3Quc3JjfSIKICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD0iJHt0ZXN0LnRpbWVvdXR9Ij4KICAgICAgICAgPC90ZXN0bWFjcm8+CkBAIC0xMDc3LDcgKzY0NSw3IEBACiAgICAgPHRhcmdldCBuYW1lPSJfc2ltdWxhdG9yLWFzbV9idWlsZCI+CiAgICAgCTxta2RpciBkaXI9IiR7c2ltdWxhdG9yLWFzbS5idWlsZC5jbGFzc2VzfSIgLz4KICAgICAgICAgPGphdmFjIGNvbXBpbGVyPSJtb2Rlcm4iIGRlYnVnPSJ0cnVlIiBkZWJ1Z2xldmVsPSIke2RlYnVnbGV2ZWx9IgotICAgICAgICAgICAgICAgc291cmNlPSIke3NvdXJjZS52ZXJzaW9ufSIgdGFyZ2V0PSIke3RhcmdldC52ZXJzaW9ufSIKKyAgICAgICAgICAgICAgIHNvdXJjZT0iJHthbnQuamF2YS52ZXJzaW9ufSIgdGFyZ2V0PSIke2FudC5qYXZhLnZlcnNpb259IgogICAgICAgICAgICAgICAgZW5jb2Rpbmc9InV0Zi04IiBkZXN0ZGlyPSIke3NpbXVsYXRvci1hc20uYnVpbGQuY2xhc3Nlc30iIGluY2x1ZGVhbnRydW50aW1lPSJ0cnVlIj4KICAgICAgICAgICAgIDxzcmMgcGF0aD0iJHtzaW11bGF0b3ItYXNtLmJ1aWxkLnNyY30iIC8+CiAgICAgICAgICAgICA8Y2xhc3NwYXRoPgpAQCAtMTA5NCw3ICs2NjIsNyBAQAogICAgIDx0YXJnZXQgbmFtZT0iX3NpbXVsYXRvci1ib290c3RyYXBfYnVpbGQiPgogICAgIAk8bWtkaXIgZGlyPSIke3NpbXVsYXRvci1ib290c3RyYXAuYnVpbGQuY2xhc3Nlc30iIC8+CiAgICAgICAgIDxqYXZhYyBjb21waWxlcj0ibW9kZXJuIiBkZWJ1Zz0idHJ1ZSIgZGVidWdsZXZlbD0iJHtkZWJ1Z2xldmVsfSIKLSAgICAgICAgICAgICAgIHNvdXJjZT0iJHtzb3VyY2UudmVyc2lvbn0iIHRhcmdldD0iJHt0YXJnZXQudmVyc2lvbn0iCisgICAgICAgICAgICAgICBzb3VyY2U9IiR7YW50LmphdmEudmVyc2lvbn0iIHRhcmdldD0iJHthbnQuamF2YS52ZXJzaW9ufSIKICAgICAgICAgICAgICAgIGVuY29kaW5nPSJ1dGYtOCIgZGVzdGRpcj0iJHtzaW11bGF0b3ItYm9vdHN0cmFwLmJ1aWxkLmNsYXNzZXN9IiBpbmNsdWRlYW50cnVudGltZT0idHJ1ZSI+CiAgICAgICAgICAgICA8c3JjIHBhdGg9IiR7c2ltdWxhdG9yLWJvb3RzdHJhcC5idWlsZC5zcmN9IiAvPgogICAgICAgICAgICAgPGNsYXNzcGF0aD4KQEAgLTExMDksMTUgKzY3NywyOCBAQAogICAgICAgICA8L2phdmFjPgogICAgIDwvdGFyZ2V0PgogCi0JPHRhcmdldCBuYW1lPSJfd3JpdGUtcG9tcyIgZGVwZW5kcz0ibWF2ZW4tZGVjbGFyZS1kZXBlbmRlbmNpZXMiPgotCSAgICA8YXJ0aWZhY3Q6d3JpdGVwb20gcG9tUmVmSWQ9InBhcmVudC1wb20iIGZpbGU9IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LXBhcmVudC5wb20iLz4KLQkgICAgPGFydGlmYWN0OndyaXRlcG9tIHBvbVJlZklkPSJhbGwtcG9tIiBmaWxlPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS5wb20iLz4KLQkgICAgPGFydGlmYWN0OndyaXRlcG9tIHBvbVJlZklkPSJidWlsZC1kZXBzLXBvbSIgZmlsZT0iJHtidWlsZC5kaXJ9L3RtcC0ke2ZpbmFsLm5hbWV9LWRlcHMucG9tIi8+Ci0JPC90YXJnZXQ+CisgICAgPHRhcmdldCBuYW1lPSJ3cml0ZS1wb21zIiB1bmxlc3M9IndpdGhvdXQubWF2ZW4iPgorICAgICAgICA8ZmlsdGVyc2V0IGlkPSJwb20tdGVtcGxhdGUiPgorICAgICAgICAgICAgPGZpbHRlciB0b2tlbj0idmVyc2lvbiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KKyAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49ImZpbmFsLm5hbWUiIHZhbHVlPSIke2ZpbmFsLm5hbWV9Ii8+CisgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJqYW1tLnZlcnNpb24iIHZhbHVlPSIke2phbW0udmVyc2lvbn0iLz4KKyAgICAgICAgICAgIDxmaWx0ZXIgdG9rZW49ImFsbG9jYXRpb24taW5zdHJ1bWVudGVyLnZlcnNpb24iIHZhbHVlPSIke2FsbG9jYXRpb24taW5zdHJ1bWVudGVyLnZlcnNpb259Ii8+CisgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJlY2oudmVyc2lvbiIgdmFsdWU9IiR7ZWNqLnZlcnNpb259Ii8+CisgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJhc20udmVyc2lvbiIgdmFsdWU9IiR7YXNtLnZlcnNpb259Ii8+CisgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJqYWNvY28udmVyc2lvbiIgdmFsdWU9IiR7amFjb2NvLnZlcnNpb259Ii8+CisgICAgICAgICAgICA8ZmlsdGVyIHRva2VuPSJqZmxleC52ZXJzaW9uIiB2YWx1ZT0iJHtqZmxleC52ZXJzaW9ufSIvPgorICAgICAgICA8L2ZpbHRlcnNldD4KIAotCTx0YXJnZXQgbmFtZT0id3JpdGUtcG9tcyIgdW5sZXNzPSJ3aXRob3V0Lm1hdmVuIj4KLQkgICAgPGFudGNhbGwgdGFyZ2V0PSJfd3JpdGUtcG9tcyIgLz4KLQk8L3RhcmdldD4KKyAgICAgICAgPGNvcHkgZmlsZT0iLmJ1aWxkL2Nhc3NhbmRyYS1kZXBzLXRlbXBsYXRlLnhtbCIgdG9maWxlPSIke2J1aWxkLmRpcn0vJHtmaW5hbC5uYW1lfS5wb20iPgorICAgICAgICAgICAgPGZpbHRlcnNldCByZWZpZD0icG9tLXRlbXBsYXRlIi8+CisgICAgICAgIDwvY29weT4KKyAgICAgICAgPGNvcHkgZmlsZT0iLmJ1aWxkL3BhcmVudC1wb20tdGVtcGxhdGUueG1sIiB0b2ZpbGU9IiR7YnVpbGQuZGlyfS8ke2ZpbmFsLm5hbWV9LXBhcmVudC5wb20iPgorICAgICAgICAgICAgPGZpbHRlcnNldCByZWZpZD0icG9tLXRlbXBsYXRlIi8+CisgICAgICAgIDwvY29weT4KKyAgICAgICAgPGNvcHkgZmlsZT0iLmJ1aWxkL2Nhc3NhbmRyYS1idWlsZC1kZXBzLXRlbXBsYXRlLnhtbCIgdG9maWxlPSIke2J1aWxkLmRpcn0vdG1wLSR7ZmluYWwubmFtZX0tZGVwcy5wb20iPgorICAgICAgICAgICAgPGZpbHRlcnNldCByZWZpZD0icG9tLXRlbXBsYXRlIi8+CisgICAgICAgIDwvY29weT4KKyAgICA8L3RhcmdldD4KIAogICAgIDwhLS0KICAgICAgICAgVGhlIGphciB0YXJnZXQgbWFrZXMgY2Fzc2FuZHJhLmphciBvdXRwdXQuCkBAIC0xMTQxLDYgKzcyMiw3IEBACiAgICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJbXBsZW1lbnRhdGlvbi1UaXRsZSIgdmFsdWU9IkNhc3NhbmRyYSIvPgogICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tVmVyc2lvbiIgdmFsdWU9IiR7dmVyc2lvbn0iLz4KICAgICAgICAgICA8YXR0cmlidXRlIG5hbWU9IkltcGxlbWVudGF0aW9uLVZlbmRvciIgdmFsdWU9IkFwYWNoZSIvPgorICAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iSW1wbGVtZW50YXRpb24tR2l0LVNIQSIgdmFsdWU9IiR7Z2l0LnNoYX0iLz4KICAgICAgICAgPCEtLSA8L3NlY3Rpb24+IC0tPgogICAgICAgICA8L21hbmlmZXN0PgogICAgICAgPC9qYXI+CkBAIC0xNDI0LDYgKzEwMDYsNyBAQAogICA8dGFyZ2V0IG5hbWU9ImJ1aWxkLXRlc3QiIGRlcGVuZHM9Il9tYWluLWphcixzdHJlc3MtYnVpbGQtdGVzdCxmcWx0b29sLWJ1aWxkLHJlc29sdmVyLWRpc3QtbGliLHNpbXVsYXRvci1qYXJzLGNoZWNrc3R5bGUtdGVzdCIKICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29tcGlsZSB0ZXN0IGNsYXNzZXMiPgogICAgIDxhbnRjYWxsIHRhcmdldD0iX2J1aWxkLXRlc3QiLz4KKyAgICA8Y2hlY2t0ZXN0bmFtZXNoZWxwZXIvPgogICA8L3RhcmdldD4KIAogICA8dGFyZ2V0IG5hbWU9Il9idWlsZC10ZXN0Ij4KQEAgLTE0MzMsOCArMTAxNiw4IEBACiAgICAgIGRlYnVnbGV2ZWw9IiR7ZGVidWdsZXZlbH0iCiAgICAgIGRlc3RkaXI9IiR7dGVzdC5jbGFzc2VzfSIKICAgICAgaW5jbHVkZWFudHJ1bnRpbWU9InRydWUiCi0gICAgIHNvdXJjZT0iJHtzb3VyY2UudmVyc2lvbn0iCi0gICAgIHRhcmdldD0iJHt0YXJnZXQudmVyc2lvbn0iCisgICAgIHNvdXJjZT0iJHthbnQuamF2YS52ZXJzaW9ufSIKKyAgICAgdGFyZ2V0PSIke2FudC5qYXZhLnZlcnNpb259IgogICAgICBlbmNvZGluZz0idXRmLTgiPgogICAgICA8Y2xhc3NwYXRoPgogICAgICAgICA8cGF0aCByZWZpZD0iY2Fzc2FuZHJhLmNsYXNzcGF0aC50ZXN0Ii8+CkBAIC0xNDU0LDggKzEwMzcsNiBAQAogICAgICA8c3JjIHBhdGg9IiR7dGVzdC5zaW11bGF0b3ItdGVzdC5zcmN9Ii8+CiAgICAgPC9qYXZhYz4KIAotICAgIDxjaGVja3Rlc3RuYW1lc2hlbHBlci8+Ci0KICAgICA8IS0tIE5vbi1qYXZhIHJlc291cmNlcyBuZWVkZWQgYnkgdGhlIHRlc3Qgc3VpdGUgLS0+CiAgICAgPGNvcHkgdG9kaXI9IiR7dGVzdC5jbGFzc2VzfSI+CiAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5yZXNvdXJjZXN9Ii8+CkBAIC0xNTM3LDcgKzExMTgsNyBAQAogICAgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURqYXZhLmlvLnRtcGRpcj0ke3RtcC5kaXJ9Ii8+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLmRlYnVncmVmY291bnQ9dHJ1ZSIvPgotICAgICAgICA8anZtYXJnIHZhbHVlPSItWHNzMjU2ayIvPgorICAgICAgICA8anZtYXJnIHZhbHVlPSIke2p2bV94c3N9Ii8+CiAgICAgICAgIDwhLS0gV2hlbiB3ZSBkbyBjbGFzc2xvYWRlciBtYW5pcHVsYXRpb24gU29mdFJlZmVyZW5jZXMgY2FuIGNhdXNlIG1lbW9yeSBsZWFrcwogICAgICAgICAgICAgIHRoYXQgY2FuIE9PTSBvdXIgdGVzdCBydW5zLiBUaGUgbmV4dCB0d28gc2V0dGluZ3MgaW5mb3JtcyBvdXIgR0MKICAgICAgICAgICAgICBhbGdvcml0aG0gdG8gbGltaXQgdGhlIG1ldGFzcGFjZSBzaXplIGFuZCBjbGVhbiB1cCBTb2Z0UmVmZXJlbmNlcwpAQCAtMTU0NSw2ICsxMTI2LDcgQEAKICAgICAgICAgLS0+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1YWDpTb2Z0UmVmTFJVUG9saWN5TVNQZXJNQj0wIiAvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItWFg6QWN0aXZlUHJvY2Vzc29yQ291bnQ9JHtjYXNzYW5kcmEudGVzdC5wcm9jZXNzb3JDb3VudH0iIC8+CisgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1YWDpIZWFwRHVtcFBhdGg9YnVpbGQvdGVzdCIgLz4KICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURjYXNzYW5kcmEudGVzdC5kcml2ZXIuY29ubmVjdGlvbl90aW1lb3V0X21zPSR7dGVzdC5kcml2ZXIuY29ubmVjdGlvbl90aW1lb3V0X21zfSIvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS50ZXN0LmRyaXZlci5yZWFkX3RpbWVvdXRfbXM9JHt0ZXN0LmRyaXZlci5yZWFkX3RpbWVvdXRfbXN9Ii8+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLm1lbXRhYmxlX3Jvd19vdmVyaGVhZF9jb21wdXRhdGlvbl9zdGVwPTEwMCIvPgpAQCAtMTU1Miw3ICsxMTM0LDcgQEAKICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURjYXNzYW5kcmEudGVzdC5zc3RhYmxlZm9ybWF0ZGV2ZWxvcG1lbnQ9dHJ1ZSIvPgogICAgICAgICA8IS0tIFRoZSBmaXJzdCB0aW1lIFNlY3VyZVJhbmRvbSBpbml0aWFsaXplcyBjYW4gYmUgc2xvdyBpZiBpdCBibG9ja3Mgb24gL2Rldi9yYW5kb20gLS0+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EamF2YS5zZWN1cml0eS5lZ2Q9ZmlsZTovZGV2L3VyYW5kb20iIC8+Ci0gICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLnRlc3R0YWc9QHt0ZXN0dGFnfSIvPgorICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS50ZXN0dGFnPUB7dGVzdHRhZ30uamRrJHthbnQuamF2YS52ZXJzaW9ufSIvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5rZWVwQnJpZWZCcmllZj0ke2Nhc3NhbmRyYS5rZWVwQnJpZWZCcmllZn0iIC8+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLnN0cmljdC5ydW50aW1lLmNoZWNrcz10cnVlIiAvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5yZWFkcy50aHJlc2hvbGRzLmNvb3JkaW5hdG9yLmRlZmVuc2l2ZV9jaGVja3NfZW5hYmxlZD10cnVlIiAvPiA8IS0tIGVuYWJsZSBkZWZlbnNpdmUgY2hlY2tzIC0tPgpAQCAtMTU2MCw5ICsxMTQyLDExIEBACiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLnRlc3QubWVzc2FnaW5nU2VydmljZS5ub25HcmFjZWZ1bFNodXRkb3duPSR7Y2Fzc2FuZHJhLnRlc3QubWVzc2FnaW5nU2VydmljZS5ub25HcmFjZWZ1bFNodXRkb3dufSIvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS51c2Vfbml4X3JlY3Vyc2l2ZV9kZWxldGU9JHtjYXNzYW5kcmEudXNlX25peF9yZWN1cnNpdmVfZGVsZXRlfSIvPgogICAgICAgICA8anZtYXJnIGxpbmU9IiR7amF2YTExLWp2bWFyZ3N9Ii8+CisgICAgICAgIDxqdm1hcmcgbGluZT0iJHtqYXZhMTctanZtYXJnc30iLz4KICAgICAgICAgPCEtLSBkaXNhYmxlIHNocmlua3MgaW4gcXVpY2t0aGVvcmllcyBDQVNTQU5EUkEtMTU1NTQgLS0+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EUVRfU0hSSU5LUz0wIi8+Ci0gICAgICAgIDxqdm1hcmcgbGluZT0iJHtfc3RkLXRlc3QtanZtYXJnc30iIC8+CisgICAgICAgIDxqdm1hcmcgbGluZT0iJHtfc3RkLXRlc3QtanZtYXJnczExfSIgLz4KKyAgICAgICAgPGp2bWFyZyBsaW5lPSIke19zdGQtdGVzdC1qdm1hcmdzMTd9IiAvPgogICAgICAgICA8anZtYXJnIGxpbmU9IiR7dGVzdC5qdm0uYXJnc30iIC8+CiAgICAgICAgIDxvcHRqdm1hcmdzLz4KICAgICAgICAgPCEtLSBVbmNvbW1lbnQgdG8gZGVidWcgdW5pdHRlc3QsIGF0dGFjaCBkZWJ1Z2dlciB0byBwb3J0IDE0MTYgLS0+CkBAIC0xNjY5LDcgKzEyNTMsMjcgQEAKICAgICA8L3NlcXVlbnRpYWw+CiAgIDwvbWFjcm9kZWY+CiAKLSAgPG1hY3JvZGVmIG5hbWU9InRlc3RsaXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkiPgorICAgIDxtYWNyb2RlZiBuYW1lPSJ0ZXN0bGlzdC10cmllIj4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0ZXN0LmZpbGUubGlzdCIgLz4KKyAgICAgICAgPHNlcXVlbnRpYWw+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idHJpZV95YW1sIiB2YWx1ZT0iJHtidWlsZC50ZXN0LmRpcn0vY2Fzc2FuZHJhLnRyaWUueWFtbCIvPgorICAgICAgICAgICAgPGNvbmNhdCBkZXN0ZmlsZT0iJHt0cmllX3lhbWx9Ij4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBmaWxlPSIke3Rlc3QuY29uZn0vY2Fzc2FuZHJhLnlhbWwiLz4KKyAgICAgICAgICAgICAgICA8ZmlsZXNldCBmaWxlPSIke3Rlc3QuY29uZn0vdHJpZV9tZW10YWJsZS55YW1sIi8+CisgICAgICAgICAgICA8L2NvbmNhdD4KKyAgICAgICAgICAgIDx0ZXN0bWFjcm9oZWxwZXIgaW5wdXRkaXI9IiR7dGVzdC51bml0LnNyY30iIGZpbGVsaXN0PSJAe3Rlc3QuZmlsZS5saXN0fSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZT0iKiovKi5qYXZhIiB0aW1lb3V0PSIke3Rlc3QudGltZW91dH0iIHRlc3R0YWc9InRyaWUiPgorICAgICAgICAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EbGVnYWN5LXNzdGFibGUtcm9vdD0ke3Rlc3QuZGF0YX0vbGVnYWN5LXNzdGFibGVzIi8+CisgICAgICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURpbnZhbGlkLWxlZ2FjeS1zc3RhYmxlLXJvb3Q9JHt0ZXN0LmRhdGF9L2ludmFsaWQtbGVnYWN5LXNzdGFibGVzIi8+CisgICAgICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURjYXNzYW5kcmEucmluZ19kZWxheV9tcz0xMDAwIi8+CisgICAgICAgICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURjYXNzYW5kcmEudG9sZXJhdGVfc3N0YWJsZV9zaXplPXRydWUiLz4KKyAgICAgICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5jb25maWc9ZmlsZTovLy8ke3RyaWVfeWFtbH0iLz4KKyAgICAgICAgICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5za2lwX3N5bmM9dHJ1ZSIgLz4KKyAgICAgICAgICAgIDwvdGVzdG1hY3JvaGVscGVyPgorICAgICAgICA8L3NlcXVlbnRpYWw+CisgICAgPC9tYWNyb2RlZj4KKworICAgIDxtYWNyb2RlZiBuYW1lPSJ0ZXN0bGlzdC1zeXN0ZW0ta2V5c3BhY2UtZGlyZWN0b3J5Ij4KICAgICA8YXR0cmlidXRlIG5hbWU9InRlc3QuZmlsZS5saXN0IiAvPgogICAgIDxzZXF1ZW50aWFsPgogICAgICAgPHByb3BlcnR5IG5hbWU9InN5c3RlbV9rZXlzcGFjZXNfZGlyZWN0b3J5X3lhbWwiIHZhbHVlPSIke2J1aWxkLnRlc3QuZGlyfS9jYXNzYW5kcmEuc3lzdGVtLnlhbWwiLz4KQEAgLTE3MDYsOSArMTMxMCwyNyBAQAogICAgIGFudCB0ZXN0c29tZSAtRHRlc3QubmFtZT1vcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlU2VydmVyVGVzdCAtRHRlc3QubWV0aG9kcz10ZXN0UmVndWxhck1vZGUsdGVzdEdldEFsbFJhbmdlc0VtcHR5CiAgIC0tPgogICA8dGFyZ2V0IG5hbWU9InRlc3Rzb21lIiBkZXBlbmRzPSJtYXliZS1idWlsZC10ZXN0IiBkZXNjcmlwdGlvbj0iRXhlY3V0ZSBzcGVjaWZpYyB1bml0IHRlc3RzIiA+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0id2l0aG91dE1ldGhvZHMiPgorICAgICAgPGFuZD4KKyAgICAgICAgPGVxdWFscyBhcmcxPSIke3Rlc3QubWV0aG9kc30iIGFyZzI9IiIvPgorICAgICAgICA8bm90PgorICAgICAgICAgIDxjb250YWlucyBzdHJpbmc9IiR7dGVzdC5uYW1lfSIgc3Vic3RyaW5nPSIqIi8+CisgICAgICAgIDwvbm90PgorICAgICAgPC9hbmQ+CisgICAgPC9jb25kaXRpb24+CisgICAgPGNvbmRpdGlvbiBwcm9wZXJ0eT0id2l0aE1ldGhvZHMiPgorICAgICAgPGFuZD4KKyAgICAgICAgPG5vdD4KKyAgICAgICAgIDxlcXVhbHMgYXJnMT0iJHt0ZXN0Lm1ldGhvZHN9IiBhcmcyPSIiLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICAgIDxub3Q+CisgICAgICAgICAgPGNvbnRhaW5zIHN0cmluZz0iJHt0ZXN0Lm5hbWV9IiBzdWJzdHJpbmc9IioiLz4KKyAgICAgICAgPC9ub3Q+CisgICAgICA8L2FuZD4KKyAgICA8L2NvbmRpdGlvbj4KICAgICA8dGVzdG1hY3JvIGlucHV0ZGlyPSIke3Rlc3QudW5pdC5zcmN9IiB0aW1lb3V0PSIke3Rlc3QudGltZW91dH0iPgotICAgICAgPHRlc3QgdW5sZXNzOmJsYW5rPSIke3Rlc3QubWV0aG9kc30iIG5hbWU9IiR7dGVzdC5uYW1lfSIgbWV0aG9kcz0iJHt0ZXN0Lm1ldGhvZHN9IiBvdXRmaWxlPSJidWlsZC90ZXN0L291dHB1dC9URVNULSR7dGVzdC5uYW1lfS0ke3Rlc3QubWV0aG9kc30iLz4KLSAgICAgIDx0ZXN0IGlmOmJsYW5rPSIke3Rlc3QubWV0aG9kc30iIG5hbWU9IiR7dGVzdC5uYW1lfSIgb3V0ZmlsZT0iYnVpbGQvdGVzdC9vdXRwdXQvVEVTVC0ke3Rlc3QubmFtZX0iLz4KKyAgICAgIDx0ZXN0IGlmPSJ3aXRoTWV0aG9kcyIgbmFtZT0iJHt0ZXN0Lm5hbWV9IiBtZXRob2RzPSIke3Rlc3QubWV0aG9kc30iIG91dGZpbGU9ImJ1aWxkL3Rlc3Qvb3V0cHV0L1RFU1QtJHt0ZXN0Lm5hbWV9LSR7dGVzdC5tZXRob2RzfSIvPgorICAgICAgPHRlc3QgaWY9IndpdGhvdXRNZXRob2RzIiBuYW1lPSIke3Rlc3QubmFtZX0iIG91dGZpbGU9ImJ1aWxkL3Rlc3Qvb3V0cHV0L1RFU1QtJHt0ZXN0Lm5hbWV9Ii8+CiAgICAgICA8anZtYXJnIHZhbHVlPSItRGxlZ2FjeS1zc3RhYmxlLXJvb3Q9JHt0ZXN0LmRhdGF9L2xlZ2FjeS1zc3RhYmxlcyIvPgogICAgICAgPGp2bWFyZyB2YWx1ZT0iLURpbnZhbGlkLWxlZ2FjeS1zc3RhYmxlLXJvb3Q9JHt0ZXN0LmRhdGF9L2ludmFsaWQtbGVnYWN5LXNzdGFibGVzIi8+CiAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5yaW5nX2RlbGF5X21zPTEwMDAiLz4KQEAgLTE3NTksNiArMTM4MSwxNCBAQAogICAgIDx0ZXN0aGVscGVyIHRlc3RkZWxlZ2F0ZT0idGVzdGxpc3QtY2RjIiAvPgogICA8L3RhcmdldD4KIAorICA8dGFyZ2V0IG5hbWU9InRlc3QtdHJpZSIgZGVwZW5kcz0ibWF5YmUtYnVpbGQtdGVzdCIgZGVzY3JpcHRpb249IkV4ZWN1dGUgdW5pdCB0ZXN0cyB3aXRoIHRyaWUgbWVtdGFibGVzIj4KKyAgICA8cGF0aCBpZD0iYWxsLXRlc3QtY2xhc3Nlcy1wYXRoIj4KKyAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LnVuaXQuc3JjfSIgaW5jbHVkZXM9IioqLyR7dGVzdC5uYW1lfS5qYXZhIiAvPgorICAgIDwvcGF0aD4KKyAgICA8cHJvcGVydHkgbmFtZT0iYWxsLXRlc3QtY2xhc3NlcyIgcmVmaWQ9ImFsbC10ZXN0LWNsYXNzZXMtcGF0aCIvPgorICAgIDx0ZXN0aGVscGVyIHRlc3RkZWxlZ2F0ZT0idGVzdGxpc3QtdHJpZSIgLz4KKyAgPC90YXJnZXQ+CisKICAgPHRhcmdldCBuYW1lPSJ0ZXN0LXN5c3RlbS1rZXlzcGFjZS1kaXJlY3RvcnkiIGRlcGVuZHM9Im1heWJlLWJ1aWxkLXRlc3QiIGRlc2NyaXB0aW9uPSJFeGVjdXRlIHVuaXQgdGVzdHMgd2l0aCBhIHN5c3RlbSBrZXlzcGFjZXMgZGlyZWN0b3J5IGNvbmZpZ3VyZWQiPgogICAgIDxwYXRoIGlkPSJhbGwtdGVzdC1jbGFzc2VzLXBhdGgiPgogICAgICAgPGZpbGVzZXQgZGlyPSIke3Rlc3QudW5pdC5zcmN9IiBpbmNsdWRlcz0iKiovJHt0ZXN0Lm5hbWV9LmphdmEiIC8+CkBAIC0xODI1LDcgKzE0NTUsNyBAQAogICAgICAgICA8anZtYXJnIHZhbHVlPSItRGphdmEuYXd0LmhlYWRsZXNzPXRydWUiLz4KICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWphdmFhZ2VudDoke2J1aWxkLmxpYn0vamFtbS0ke2phbW0udmVyc2lvbn0uamFyIiAvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItZWEiLz4KLSAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLVhzczI1NmsiLz4KKyAgICAgICAgPGp2bWFyZyB2YWx1ZT0iJHtqdm1feHNzfSIvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5tZW10YWJsZV9yb3dfb3ZlcmhlYWRfY29tcHV0YXRpb25fc3RlcD0xMDAiLz4KICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURjYXNzYW5kcmEudGVzdC51c2VfcHJlcGFyZWQ9JHtjYXNzYW5kcmEudGVzdC51c2VfcHJlcGFyZWR9Ii8+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLnNraXBfc3luYz10cnVlIiAvPgpAQCAtMTg3MSw3ICsxNTAxLDcgQEAKICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURqYXZhLmF3dC5oZWFkbGVzcz10cnVlIi8+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1qYXZhYWdlbnQ6JHtidWlsZC5saWJ9L2phbW0tJHtqYW1tLnZlcnNpb259LmphciIgLz4KICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLWVhIi8+Ci0gICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1Yc3MyNTZrIi8+CisgICAgICAgIDxqdm1hcmcgdmFsdWU9IiR7anZtX3hzc30iLz4KICAgICAgICAgPGp2bWFyZyB2YWx1ZT0iLURjYXNzYW5kcmEudGVzdC51c2VfcHJlcGFyZWQ9JHtjYXNzYW5kcmEudGVzdC51c2VfcHJlcGFyZWR9Ii8+CiAgICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLm1lbXRhYmxlX3Jvd19vdmVyaGVhZF9jb21wdXRhdGlvbl9zdGVwPTEwMCIvPgogICAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5za2lwX3N5bmM9dHJ1ZSIgLz4KQEAgLTIwMDYsNiArMTYzNiwxMyBAQAogICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbC10ZXN0LWNsYXNzZXMiIHJlZmlkPSJhbGwtdGVzdC1jbGFzc2VzLXBhdGgiLz4KICAgICAgIDx0ZXN0aGVscGVyIHRlc3RkZWxlZ2F0ZT0idGVzdGxpc3QtY29tcHJlc3Npb24iLz4KICAgPC90YXJnZXQ+CisgIDx0YXJnZXQgbmFtZT0idGVzdGNsYXNzbGlzdC10cmllIiBkZXBlbmRzPSJtYXliZS1idWlsZC10ZXN0IiBkZXNjcmlwdGlvbj0iUnVuIHRlc3RzIGdpdmVuIGluIGZpbGUgLUR0ZXN0LmNsYXNzbGlzdGZpbGUgKG9uZS1jbGFzcy1wZXItbGluZSwgZS5nLiBvcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Tb21lVGVzdC5qYXZhKSI+CisgICAgPHBhdGggaWQ9ImFsbC10ZXN0LWNsYXNzZXMtcGF0aCI+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iJHt0ZXN0LmRpcn0vJHt0ZXN0LmNsYXNzbGlzdHByZWZpeH0iIGluY2x1ZGVzZmlsZT0iJHt0ZXN0LmNsYXNzbGlzdGZpbGV9Ii8+CisgICAgPC9wYXRoPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGwtdGVzdC1jbGFzc2VzIiByZWZpZD0iYWxsLXRlc3QtY2xhc3Nlcy1wYXRoIi8+CisgICAgPHRlc3RoZWxwZXIgdGVzdGRlbGVnYXRlPSJ0ZXN0bGlzdC10cmllIi8+CisgIDwvdGFyZ2V0PgogICA8dGFyZ2V0IG5hbWU9InRlc3RjbGFzc2xpc3QtY2RjIiBkZXBlbmRzPSJtYXliZS1idWlsZC10ZXN0IiBkZXNjcmlwdGlvbj0iUnVuIHRlc3RzIGdpdmVuIGluIGZpbGUgLUR0ZXN0LmNsYXNzbGlzdGZpbGUgKG9uZS1jbGFzcy1wZXItbGluZSwgZS5nLiBvcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Tb21lVGVzdC5qYXZhKSI+CiAgICAgICA8cGF0aCBpZD0iYWxsLXRlc3QtY2xhc3Nlcy1wYXRoIj4KICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5kaXJ9LyR7dGVzdC5jbGFzc2xpc3RwcmVmaXh9IiBpbmNsdWRlc2ZpbGU9IiR7dGVzdC5jbGFzc2xpc3RmaWxlfSIvPgpAQCAtMjA1NSw2ICsxNjkyLDcgQEAKICAgICA8L3Rlc3RtYWNybz4KICAgPC90YXJnZXQ+CiAKKyAgPHByb3BlcnR5IG5hbWU9InNpbXVsYXRvci5hc20ucHJpbnQiIHZhbHVlPSJub25lIi8+IDwhLS0gU3VwcG9ydHM6IE5PTkUsIENMQVNTX1NVTU1BUlksIENMQVNTX0RFVEFJTCwgTUVUSE9EX1NVTU1BUlksIE1FVEhPRF9ERVRBSUwsIEFTTTsgc2VlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5hc20uTWV0aG9kTG9nZ2VyLkxldmVsIC0tPgogICA8dGFyZ2V0IG5hbWU9InRlc3Qtc2ltdWxhdG9yLWR0ZXN0IiBkZXBlbmRzPSJtYXliZS1idWlsZC10ZXN0IiBkZXNjcmlwdGlvbj0iRXhlY3V0ZSBzaW11bGF0b3IgZHRlc3RzIj4KICAgICA8dGVzdG1hY3JvIGlucHV0ZGlyPSIke3Rlc3Quc2ltdWxhdG9yLXRlc3Quc3JjfSIgdGltZW91dD0iJHt0ZXN0LnNpbXVsYXRpb24udGltZW91dH0iIGZvcmttb2RlPSJwZXJUZXN0IiBzaG93b3V0cHV0PSJ0cnVlIiBmaWx0ZXI9IioqL3Rlc3QvJHt0ZXN0Lm5hbWV9LmphdmEiPgogICAgICAgPGp2bWFyZyB2YWx1ZT0iLURsb2diYWNrLmNvbmZpZ3VyYXRpb25GaWxlPXRlc3QvY29uZi9sb2diYWNrLXNpbXVsYXRvci54bWwiLz4KQEAgLTIwNjMsNiArMTcwMSw3IEBACiAgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS5za2lwX3N5bmM9dHJ1ZSIgLz4KICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLmRlYnVncmVmY291bnQ9ZmFsc2UiLz4KICAgICAgIDxqdm1hcmcgdmFsdWU9Ii1EY2Fzc2FuZHJhLnRlc3Quc2ltdWxhdG9yLmRldGVybWluaXNtY2hlY2s9c3RyaWN0Ii8+CisgICAgICA8anZtYXJnIHZhbHVlPSItRGNhc3NhbmRyYS50ZXN0LnNpbXVsYXRvci5wcmludF9hc209JHtzaW11bGF0b3IuYXNtLnByaW50fSIgLz4KICAgICAgIDwhLS0gU3VwcG9ydCBTaW11bGF0b3IgVGVzdHMgLS0+CiAgICAgICA8anZtYXJnIGxpbmU9Ii1qYXZhYWdlbnQ6JHt0ZXN0LmxpYn0vamFycy9zaW11bGF0b3ItYXNtLmphciIvPgogICAgICAgPGp2bWFyZyBsaW5lPSItWGJvb3RjbGFzc3BhdGgvYToke3Rlc3QubGlifS9qYXJzL3NpbXVsYXRvci1ib290c3RyYXAuamFyIi8+CkBAIC0yMTU0LDcgKzE3OTMsNyBAQAogICAgICAgPC9qYXZhPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9Il9tYXliZV91cGRhdGVfaWRlYV90b19qYXZhMTEiIGlmPSJqYXZhLnZlcnNpb24uMTEiPgorICA8dGFyZ2V0IG5hbWU9Il9tYXliZV91cGRhdGVfaWRlYV90b19qYXZhMTEiIGRlcGVuZHM9ImluaXQiIGlmPSJqYXZhLnZlcnNpb24uMTEiPgogICAgIDxyZXBsYWNlIGZpbGU9IiR7ZWNsaXBzZS5wcm9qZWN0Lm5hbWV9LmltbCIgdG9rZW49IkpES18xXzgiIHZhbHVlPSJKREtfMTEiLz4KICAgICA8cmVwbGFjZSBmaWxlPSIuaWRlYS9taXNjLnhtbCIgdG9rZW49IkpES18xXzgiIHZhbHVlPSJKREtfMTEiLz4KICAgICA8cmVwbGFjZSBmaWxlPSIuaWRlYS9taXNjLnhtbCIgdG9rZW49IjEuOCIgdmFsdWU9IjExIi8+CkBAIC0yMTY5LDEwICsxODA4LDExIEBACiAgICAgPG9wdGlvbiBuYW1lPSJBRERJVElPTkFMX09QVElPTlNfU1RSSU5HIiB2YWx1ZT0iLS1hZGQtZXhwb3J0cyBqYXZhLnJtaS9zdW4ucm1pLnJlZ2lzdHJ5PUFMTC1VTk5BTUVEIiAvPgogICA8L2NvbXBvbmVudD4KIDwvcHJvamVjdD5dXT48L2VjaG8+CisgICAgICA8ZWNobz4iSURFIGNvbmZpZ3VyYXRpb24gdXBkYXRlZCBmb3IgdXNlIHdpdGggSkRLMTEiPC9lY2hvPgogICA8L3RhcmdldD4KIAogICA8IS0tIEdlbmVyYXRlIElERUEgcHJvamVjdCBkZXNjcmlwdGlvbiBmaWxlcyAtLT4KLSAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1pZGVhLWZpbGVzIiBkZXBlbmRzPSJpbml0LG1hdmVuLWFudC10YXNrcy1pbml0LHJlc29sdmVyLWRpc3QtbGliLGdlbi1jcWwzLWdyYW1tYXIsZ2VuZXJhdGUtamZsZXgtamF2YSxjcmVhdGVWZXJzaW9uUHJvcEZpbGUiIGRlc2NyaXB0aW9uPSJHZW5lcmF0ZSBJREVBIGZpbGVzIj4KKyAgPHRhcmdldCBuYW1lPSJnZW5lcmF0ZS1pZGVhLWZpbGVzIiBkZXBlbmRzPSJpbml0LHJlc29sdmVyLWRpc3QtbGliLGdlbi1jcWwzLWdyYW1tYXIsZ2VuZXJhdGUtamZsZXgtamF2YSxjcmVhdGVWZXJzaW9uUHJvcEZpbGUiIGRlc2NyaXB0aW9uPSJHZW5lcmF0ZSBJREVBIGZpbGVzIj4KICAgICA8bWtkaXIgZGlyPSIuaWRlYSIvPgogICAgIDxta2RpciBkaXI9Ii5pZGVhL2xpYnJhcmllcyIvPgogICAgIDxjb3B5IHRvZGlyPSIuaWRlYSIgb3ZlcndyaXRlPSJ0cnVlIj4KQEAgLTIyOTEsOSArMTkzMSw5IEBACiAJICAgIGZhaWxvbmVycm9yPSJ0cnVlIgogICAgICAgICAgICAgbWF4bWVtb3J5PSI1MTJtIj4KICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii1zb3VyY2UiLz4KLQkgICAgPGFyZyB2YWx1ZT0iJHtzb3VyY2UudmVyc2lvbn0iIC8+CisJICAgIDxhcmcgdmFsdWU9IiR7amF2YS5kZWZhdWx0fSIgLz4KIAkgICAgPGFyZyB2YWx1ZT0iLXRhcmdldCIvPgotCSAgICA8YXJnIHZhbHVlPSIke3RhcmdldC52ZXJzaW9ufSIgLz4KKwkgICAgPGFyZyB2YWx1ZT0iJHthbnQuamF2YS52ZXJzaW9ufSIgLz4KIAkgICAgPGFyZyB2YWx1ZT0iLWQiIC8+CiAgICAgICAgICAgICA8YXJnIHZhbHVlPSJub25lIiAvPgogCSAgICA8YXJnIHZhbHVlPSItcHJvYzpub25lIiAvPgpAQCAtMjMwNywxNyArMTk0NywxNSBAQAogICAgICAgICA8L2phdmE+CiAgIDwvdGFyZ2V0PgogCi0gIDx0YXJnZXQgbmFtZT0iaW5pdC1jaGVja3N0eWxlIiBkZXBlbmRzPSJtYXZlbi1hbnQtdGFza3MtcmV0cmlldmUtYnVpbGQsYnVpbGQtcHJvamVjdCIgdW5sZXNzPSJuby1jaGVja3N0eWxlIj4KLSAgICAgIDxwYXRoIGlkPSJjaGVja3N0eWxlLmxpYi5wYXRoIj4KLSAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7dGVzdC5saWJ9L2phcnMiIGluY2x1ZGVzPSIqLmphciIvPgotICAgICAgPC9wYXRoPgorICA8dGFyZ2V0IG5hbWU9ImluaXQtY2hlY2tzdHlsZSIgZGVwZW5kcz0icmVzb2x2ZXItcmV0cmlldmUtYnVpbGQsYnVpbGQtcHJvamVjdCIgdW5sZXNzPSJuby1jaGVja3N0eWxlIj4KKyAgICAgIDxlY2hvIG1lc3NhZ2U9ImNoZWNrc3R5bGUudmVyc2lvbj0ke2NoZWNrc3R5bGUudmVyc2lvbn0iLz4KICAgICAgIDwhLS0gU2V2bnR1IGN1c3RvbSBjaGVja3MgYXJlIHJldHJpZXZlZCBieSBJdnkgaW50byBsaWIgZm9sZGVyCiAgICAgICAgICBhbmQgd2lsbCBiZSBhY2Nlc3NpYmxlIHRvIGNoZWNrc3R5bGUtLT4KICAgICAgIDx0YXNrZGVmIHJlc291cmNlPSJjb20vcHVwcHljcmF3bC90b29scy9jaGVja3N0eWxlL2FudC9jaGVja3N0eWxlLWFudC10YXNrLnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICBjbGFzc3BhdGhyZWY9ImNoZWNrc3R5bGUubGliLnBhdGgiLz4KKyAgICAgICAgICAgICAgIGNsYXNzcGF0aHJlZj0iY2hlY2tzdHlsZS5jbGFzc3BhdGgiLz4KICAgPC90YXJnZXQ+CiAKLSAgPHRhcmdldCBuYW1lPSJjaGVja3N0eWxlIiBkZXBlbmRzPSJpbml0LWNoZWNrc3R5bGUsbWF2ZW4tYW50LXRhc2tzLXJldHJpZXZlLWJ1aWxkLGJ1aWxkLXByb2plY3QiIGRlc2NyaXB0aW9uPSJSdW4gY3VzdG9tIGNoZWNrc3R5bGUgY29kZSBhbmFseXNpcyIgaWY9ImphdmEudmVyc2lvbi44IiB1bmxlc3M9Im5vLWNoZWNrc3R5bGUiPgorICA8dGFyZ2V0IG5hbWU9ImNoZWNrc3R5bGUiIGRlcGVuZHM9ImluaXQtY2hlY2tzdHlsZSxidWlsZC1wcm9qZWN0IiBkZXNjcmlwdGlvbj0iUnVuIGN1c3RvbSBjaGVja3N0eWxlIGNvZGUgYW5hbHlzaXMiIHVubGVzcz0ibm8tY2hlY2tzdHlsZSI+CiAgICAgICA8cHJvcGVydHkgbmFtZT0iY2hlY2tzdHlsZS5sb2cuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2NoZWNrc3R5bGUiIC8+CiAgICAgICA8cHJvcGVydHkgbmFtZT0iY2hlY2tzdHlsZS5yZXBvcnQuZmlsZSIgdmFsdWU9IiR7Y2hlY2tzdHlsZS5sb2cuZGlyfS9jaGVja3N0eWxlX3JlcG9ydC54bWwiLz4KICAgICAgIDxta2RpciAgZGlyPSIke2NoZWNrc3R5bGUubG9nLmRpcn0iIC8+CkBAIC0yMzMzLDcgKzE5NzEsNyBAQAogICAgICAgPC9jaGVja3N0eWxlPgogICA8L3RhcmdldD4KIAotICA8dGFyZ2V0IG5hbWU9ImNoZWNrc3R5bGUtdGVzdCIgZGVwZW5kcz0iaW5pdC1jaGVja3N0eWxlLG1hdmVuLWFudC10YXNrcy1yZXRyaWV2ZS1idWlsZCxidWlsZC1wcm9qZWN0IiBkZXNjcmlwdGlvbj0iUnVuIGN1c3RvbSBjaGVja3N0eWxlIGNvZGUgYW5hbHlzaXMgb24gdGVzdHMiIGlmPSJqYXZhLnZlcnNpb24uOCIgdW5sZXNzPSJuby1jaGVja3N0eWxlIj4KKyAgPHRhcmdldCBuYW1lPSJjaGVja3N0eWxlLXRlc3QiIGRlcGVuZHM9ImluaXQtY2hlY2tzdHlsZSxyZXNvbHZlci1yZXRyaWV2ZS1idWlsZCxidWlsZC1wcm9qZWN0IiBkZXNjcmlwdGlvbj0iUnVuIGN1c3RvbSBjaGVja3N0eWxlIGNvZGUgYW5hbHlzaXMgb24gdGVzdHMiIHVubGVzcz0ibm8tY2hlY2tzdHlsZSI+CiAgICAgICA8cHJvcGVydHkgbmFtZT0iY2hlY2tzdHlsZS5sb2cuZGlyIiB2YWx1ZT0iJHtidWlsZC5kaXJ9L2NoZWNrc3R5bGUiIC8+CiAgICAgICA8cHJvcGVydHkgbmFtZT0iY2hlY2tzdHlsZV90ZXN0LnJlcG9ydC5maWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmxvZy5kaXJ9L2NoZWNrc3R5bGVfcmVwb3J0X3Rlc3QueG1sIi8+CiAgICAgICA8bWtkaXIgIGRpcj0iJHtjaGVja3N0eWxlLmxvZy5kaXJ9IiAvPgpAQCAtMjM1MSw3ICsxOTg5LDcgQEAKIAogICA8IS0tIEluc3RhbGxzIGFydGlmYWN0cyB0byBsb2NhbCBNYXZlbiByZXBvc2l0b3J5IC0tPgogICA8dGFyZ2V0IG5hbWU9Im12bi1pbnN0YWxsIgotICAgICAgICAgIGRlcGVuZHM9Im1hdmVuLWRlY2xhcmUtZGVwZW5kZW5jaWVzLGphcixzb3VyY2VzLWphcixqYXZhZG9jLWphciIKKyAgICAgICAgICBkZXBlbmRzPSJqYXIsc291cmNlcy1qYXIsamF2YWRvYy1qYXIiCiAgICAgICAgICAgZGVzY3JpcHRpb249Ikluc3RhbGxzIHRoZSBhcnRpZmFjdHMgaW4gdGhlIE1hdmVuIExvY2FsIFJlcG9zaXRvcnkiPgogCiAgICAgPCEtLSB0aGUgcGFyZW50IC0tPgpAQCAtMjM5OSw0ICsyMDM3LDUgQEAKICAgPGltcG9ydCBmaWxlPSIke2Jhc2VkaXJ9Ly5idWlsZC9idWlsZC1yZXNvbHZlci54bWwiLz4KICAgPGltcG9ydCBmaWxlPSIke2Jhc2VkaXJ9Ly5idWlsZC9idWlsZC1yYXQueG1sIi8+CiAgIDxpbXBvcnQgZmlsZT0iJHtiYXNlZGlyfS8uYnVpbGQvYnVpbGQtb3dhc3AueG1sIi8+CisgIDxpbXBvcnQgZmlsZT0iJHtiYXNlZGlyfS8uYnVpbGQvYnVpbGQtZ2l0LnhtbCIvPgogPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY2hlY2tzdHlsZS54bWwgYi9jaGVja3N0eWxlLnhtbAppbmRleCAwNTNjYzczLi5mYzc3ZmRkIDEwMDY0NAotLS0gYS9jaGVja3N0eWxlLnhtbAorKysgYi9jaGVja3N0eWxlLnhtbApAQCAtOTYsNyArOTYsNyBAQAogICAgICAgPHByb3BlcnR5IG5hbWU9ImlsbGVnYWxDbGFzc2VzIiB2YWx1ZT0iamF2YS5pby5GaWxlLGphdmEuaW8uRmlsZUlucHV0U3RyZWFtLGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbSxqYXZhLmlvLkZpbGVSZWFkZXIsamF2YS5pby5GaWxlV3JpdGVyLGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZSxqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmUsamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2gsamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzLGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWUsamF2YS51dGlsLmNvbmN1cnJlbnQuU3luY2hyb25vdXNRdWV1ZSxqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWUsY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkZ1dHVyZXMsamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGFibGVGdXR1cmUsaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZ1dHVyZSxpby5uZXR0eS51dGlsLmNvbmN1cnJlbnQuUHJvbWlzZSxpby5uZXR0eS51dGlsLmNvbmN1cnJlbnQuQWJzdHJhY3RGdXR1cmUsY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50Lkxpc3RlbmFibGVGdXR1cmVUYXNrLGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5MaXN0ZW5hYmxlRnV0dXJlLGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5BYnN0cmFjdEZ1dHVyZSxqYXZhLm5pby5maWxlLlBhdGhzIi8+CiAgICAgPC9tb2R1bGU+CiAgICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsSW5zdGFudGlhdGlvbiI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NlcyIgdmFsdWU9ImphdmEuaW8uRmlsZSxqYXZhLmxhbmcuVGhyZWFkLGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2ssamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlLGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoLGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcixqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3IsamF2YS51dGlsLmNvbmN1cnJlbnQuRm9ya0pvaW5Qb29sLGphdmEubGFuZy5PdXRPZk1lbW9yeUVycm9yIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NlcyIgdmFsdWU9ImNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXIsamF2YS5pby5GaWxlLGphdmEubGFuZy5UaHJlYWQsamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFzayxqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmUsamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2gsamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yLGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcixqYXZhLnV0aWwuY29uY3VycmVudC5Gb3JrSm9pblBvb2wsamF2YS5sYW5nLk91dE9mTWVtb3J5RXJyb3IiLz4KICAgICA8L21vZHVsZT4KIAogICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwU2luZ2xlbGluZUphdmEiPgpAQCAtMTA2LDYgKzEwNiw2NyBAQAogICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJBdm9pZCBQYXRoI3RvRmlsZSgpLCBhcyBzb21lIGltcGxlbWVudGF0aW9ucyBtYXkgbm90IHN1cHBvcnQgaXQuIiAvPgogICAgIDwvbW9kdWxlPgogCisgICAgPG1vZHVsZSBuYW1lPSJSZWdleHBTaW5nbGVsaW5lSmF2YSI+CisgICAgICA8IS0tIGJsb2NrIEludGVnZXIoKSAtLT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9ImJsb2NrSW50ZWdlckluc3RhbnRpYXRpb24iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJuZXcgSW50ZWdlclwoIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlQ29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkF2b2lkIEludGVnZXIoKSBhbmQgdXNlIEludGVnZXIudmFsdWVPZigpIiAvPgorICAgIDwvbW9kdWxlPgorICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwU2luZ2xlbGluZUphdmEiPgorICAgICAgPCEtLSBibG9jayBMb25nKCkgLS0+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJibG9ja0xvbmdJbnN0YW50aWF0aW9uIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0ibmV3IExvbmdcKCIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUNvbW1lbnRzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJBdm9pZCBMb25nKCkgYW5kIHVzZSBMb25nLnZhbHVlT2YoKSIgLz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIG5hbWU9IlJlZ2V4cFNpbmdsZWxpbmVKYXZhIj4KKyAgICAgIDwhLS0gYmxvY2sgRmxvYXQoKSAtLT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9ImJsb2NrRmxvYXRJbnN0YW50aWF0aW9uIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0ibmV3IEZsb2F0XCgiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVDb21tZW50cyIgdmFsdWU9InRydWUiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iQXZvaWQgRmxvYXQoKSBhbmQgdXNlIEZsb2F0LnZhbHVlT2YoKSIgLz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIG5hbWU9IlJlZ2V4cFNpbmdsZWxpbmVKYXZhIj4KKyAgICAgIDwhLS0gYmxvY2sgQnl0ZSgpIC0tPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0iYmxvY2tCeXRlSW5zdGFudGlhdGlvbiIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Im5ldyBCeXRlXCgiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVDb21tZW50cyIgdmFsdWU9InRydWUiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iQXZvaWQgQnl0ZSgpIGFuZCB1c2UgQnl0ZS52YWx1ZU9mKCkiIC8+CisgICAgPC9tb2R1bGU+CisgICAgPG1vZHVsZSBuYW1lPSJSZWdleHBTaW5nbGVsaW5lSmF2YSI+CisgICAgICA8IS0tIGJsb2NrIERvdWJsZSgpIC0tPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0iYmxvY2tEb3VibGVJbnN0YW50aWF0aW9uIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0ibmV3IERvdWJsZVwoIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlQ29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkF2b2lkIERvdWJsZSgpIGFuZCB1c2UgRG91YmxlLnZhbHVlT2YoKSIgLz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIG5hbWU9IlJlZ2V4cFNpbmdsZWxpbmVKYXZhIj4KKyAgICAgIDwhLS0gYmxvY2sgU2hvcnQoKSAtLT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9ImJsb2NrU2hvcnRJbnN0YW50aWF0aW9uIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0ibmV3IFNob3J0XCgiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVDb21tZW50cyIgdmFsdWU9InRydWUiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iQXZvaWQgU2hvcnQoKSBhbmQgdXNlIFNob3J0LnZhbHVlT2YoKSIgLz4KKyAgICA8L21vZHVsZT4KKworICAgIDxtb2R1bGUgbmFtZT0iU3VwcHJlc3Npb25Db21tZW50RmlsdGVyIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvZmZDb21tZW50Rm9ybWF0IiB2YWx1ZT0iY2hlY2tzdHlsZTogc3VwcHJlc3MgYmVsb3cgJyhbXHdcfF0rKSciLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZEZvcm1hdCIgdmFsdWU9IiQxIi8+CisgICAgPC9tb2R1bGU+CisKKyAgICA8bW9kdWxlIG5hbWU9IlN1cHByZXNzV2l0aE5lYXJieUNvbW1lbnRGaWx0ZXIiPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImNvbW1lbnRGb3JtYXQiIHZhbHVlPSJjaGVja3N0eWxlOiBzdXBwcmVzcyBuZWFyYnkgJyhbXHdcfF0rKSciLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZEZvcm1hdCIgdmFsdWU9IiQxIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaW5mbHVlbmNlRm9ybWF0IiB2YWx1ZT0iMCIvPgorICAgIDwvbW9kdWxlPgorCisgICAgPG1vZHVsZSBuYW1lPSJSZWdleHBTaW5nbGVsaW5lSmF2YSI+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJibG9ja1N5c3RlbVByb3BlcnR5VXNhZ2UiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSIoU3lzdGVtXC5nZXRlbnYpfChTeXN0ZW1cLihnZXRQcm9wZXJ0eXxzZXRQcm9wZXJ0eSkpfChJbnRlZ2VyXC5nZXRJbnRlZ2VyKXwoTG9uZ1wuZ2V0TG9uZyl8KEJvb2xlYW5cLmdldEJvb2xlYW4pIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlQ29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IlVzZSB0aGUgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIG9yIENhc3NhbmRyYVJlbGV2YW50RW52IGluc3RlYWQuIiAvPgorICAgIDwvbW9kdWxlPgorCiAgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRJbXBvcnQiLz4KICAgICA8bW9kdWxlIG5hbWU9IlVudXNlZEltcG9ydHMiLz4KICAgPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9jaGVja3N0eWxlX3Rlc3QueG1sIGIvY2hlY2tzdHlsZV90ZXN0LnhtbAppbmRleCBkMjM3ODI3Li43MjBiYzgxIDEwMDY0NAotLS0gYS9jaGVja3N0eWxlX3Rlc3QueG1sCisrKyBiL2NoZWNrc3R5bGVfdGVzdC54bWwKQEAgLTU0LDcgKzU0LDc1IEBACiAgICAgICA8cHJvcGVydHkgbmFtZT0iaWxsZWdhbENsYXNzZXMiIHZhbHVlPSIiLz4KICAgICA8L21vZHVsZT4KICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbnN0YW50aWF0aW9uIj4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIiB2YWx1ZT0iIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NlcyIgdmFsdWU9ImNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXIiLz4KKyAgICA8L21vZHVsZT4KKworICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwU2luZ2xlbGluZUphdmEiPgorICAgICAgPCEtLSBibG9jayBJbnRlZ2VyKCkgLS0+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJibG9ja0ludGVnZXJJbnN0YW50aWF0aW9uIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0ibmV3IEludGVnZXJcKCIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUNvbW1lbnRzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJBdm9pZCBJbnRlZ2VyKCkgYW5kIHVzZSBJbnRlZ2VyLnZhbHVlT2YoKSIgLz4KKyAgICA8L21vZHVsZT4KKyAgICA8bW9kdWxlIG5hbWU9IlJlZ2V4cFNpbmdsZWxpbmVKYXZhIj4KKyAgICAgIDwhLS0gYmxvY2sgTG9uZygpIC0tPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0iYmxvY2tMb25nSW5zdGFudGlhdGlvbiIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Im5ldyBMb25nXCgiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVDb21tZW50cyIgdmFsdWU9InRydWUiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iQXZvaWQgTG9uZygpIGFuZCB1c2UgTG9uZy52YWx1ZU9mKCkiIC8+CisgICAgPC9tb2R1bGU+CisgICAgPG1vZHVsZSBuYW1lPSJSZWdleHBTaW5nbGVsaW5lSmF2YSI+CisgICAgICA8IS0tIGJsb2NrIEZsb2F0KCkgLS0+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJibG9ja0Zsb2F0SW5zdGFudGlhdGlvbiIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Im5ldyBGbG9hdFwoIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlQ29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkF2b2lkIEZsb2F0KCkgYW5kIHVzZSBGbG9hdC52YWx1ZU9mKCkiIC8+CisgICAgPC9tb2R1bGU+CisgICAgPG1vZHVsZSBuYW1lPSJSZWdleHBTaW5nbGVsaW5lSmF2YSI+CisgICAgICA8IS0tIGJsb2NrIEJ5dGUoKSAtLT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9ImJsb2NrQnl0ZUluc3RhbnRpYXRpb24iLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJuZXcgQnl0ZVwoIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlQ29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkF2b2lkIEJ5dGUoKSBhbmQgdXNlIEJ5dGUudmFsdWVPZigpIiAvPgorICAgIDwvbW9kdWxlPgorICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwU2luZ2xlbGluZUphdmEiPgorICAgICAgPCEtLSBibG9jayBEb3VibGUoKSAtLT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZCIgdmFsdWU9ImJsb2NrRG91YmxlSW5zdGFudGlhdGlvbiIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Im5ldyBEb3VibGVcKCIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUNvbW1lbnRzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJBdm9pZCBEb3VibGUoKSBhbmQgdXNlIERvdWJsZS52YWx1ZU9mKCkiIC8+CisgICAgPC9tb2R1bGU+CisgICAgPG1vZHVsZSBuYW1lPSJSZWdleHBTaW5nbGVsaW5lSmF2YSI+CisgICAgICA8IS0tIGJsb2NrIFNob3J0KCkgLS0+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWQiIHZhbHVlPSJibG9ja1Nob3J0SW5zdGFudGlhdGlvbiIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Im5ldyBTaG9ydFwoIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlQ29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkF2b2lkIFNob3J0KCkgYW5kIHVzZSBTaG9ydC52YWx1ZU9mKCkiIC8+CisgICAgPC9tb2R1bGU+CisKKyAgICA8bW9kdWxlIG5hbWU9IlN1cHByZXNzaW9uQ29tbWVudEZpbHRlciI+CisgICAgICA8cHJvcGVydHkgbmFtZT0ib2ZmQ29tbWVudEZvcm1hdCIgdmFsdWU9ImNoZWNrc3R5bGU6IHN1cHByZXNzIGJlbG93ICcoW1x3XHxdKyknIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWRGb3JtYXQiIHZhbHVlPSIkMSIvPgorICAgIDwvbW9kdWxlPgorCisgICAgPG1vZHVsZSBuYW1lPSJTdXBwcmVzc1dpdGhOZWFyYnlDb21tZW50RmlsdGVyIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjb21tZW50Rm9ybWF0IiB2YWx1ZT0iY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICcoW1x3XHxdKyknIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaWRGb3JtYXQiIHZhbHVlPSIkMSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImluZmx1ZW5jZUZvcm1hdCIgdmFsdWU9IjAiLz4KKyAgICA8L21vZHVsZT4KKworICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwU2luZ2xlbGluZUphdmEiPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0iYmxvY2tTeXN0ZW1Qcm9wZXJ0eVVzYWdlIi8+CisgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iKFN5c3RlbVwuZ2V0ZW52KXwoU3lzdGVtXC4oZ2V0UHJvcGVydHl8c2V0UHJvcGVydHkpKXwoSW50ZWdlclwuZ2V0SW50ZWdlcil8KExvbmdcLmdldExvbmcpfChCb29sZWFuXC5nZXRCb29sZWFuKSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUNvbW1lbnRzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJVc2UgdGhlIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBvciBDYXNzYW5kcmFSZWxldmFudEVudiBpbnN0ZWFkLiIgLz4KKyAgICA8L21vZHVsZT4KKworICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwU2luZ2xlbGluZUphdmEiPgorICAgICAgPHByb3BlcnR5IG5hbWU9ImlkIiB2YWx1ZT0iY2xlYXJWYWx1ZVN5c3RlbVByb3BlcnR5VXNhZ2UiLz4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJcLmNsZWFyVmFsdWVcKCIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUNvbW1lbnRzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJQbGVhc2UgdXNlIFdpdGhQcm9wZXJ0aWVzIGluIHRyeS13aXRoLXJlc291cmNlcyBpbnN0ZWFkLiBTZWUgQ0FTU0FORFJBLTE4NDUzLiIgLz4KICAgICA8L21vZHVsZT4KIAogICAgIDxtb2R1bGUgbmFtZT0iUmVkdW5kYW50SW1wb3J0Ii8+CmRpZmYgLS1naXQgYS9jb25mL2Nhc3NhbmRyYS1lbnYuc2ggYi9jb25mL2Nhc3NhbmRyYS1lbnYuc2gKaW5kZXggMmUzYzhjOS4uMjViYTUwNSAxMDA2NDQKLS0tIGEvY29uZi9jYXNzYW5kcmEtZW52LnNoCisrKyBiL2NvbmYvY2Fzc2FuZHJhLWVudi5zaApAQCAtOTIsNyArOTIsNyBAQAogZmkKIAogI0dDIGxvZyBwYXRoIGhhcyB0byBiZSBkZWZpbmVkIGhlcmUgYmVjYXVzZSBpdCBuZWVkcyB0byBhY2Nlc3MgQ0FTU0FORFJBX0hPTUUKLWlmIFsgJEpBVkFfVkVSU0lPTiAtZ2UgMTEgXSA7IHRoZW4KK2lmIFsgJEpBVkFfVkVSU0lPTiAtZ2UgMTEgXSB8fCBbICRKQVZBX1ZFUlNJT04gLWdlIDE3IF0gOyB0aGVuCiAgICAgIyBTZWUgZGVzY3JpcHRpb24gb2YgaHR0cHM6Ly9idWdzLm9wZW5qZGsuamF2YS5uZXQvYnJvd3NlL0pESy04MDQ2MTQ4IGZvciBkZXRhaWxzIGFib3V0IHRoZSBzeW50YXgKICAgICAjIFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVxdWl2YWxlbnQgdG8gLVhYOitQcmludEdDRGV0YWlscyAtWFg6K1VzZUdDTG9nRmlsZVJvdGF0aW9uIC1YWDpOdW1iZXJPZkdDTG9nRmlsZXM9MTAgLVhYOkdDTG9nRmlsZVNpemU9MTBNCiAgICAgZWNobyAiJEpWTV9PUFRTIiB8IGdyZXAgLXFlICItW1hdbG9nOmdjIgpkaWZmIC0tZ2l0IGEvY29uZi9jYXNzYW5kcmEueWFtbCBiL2NvbmYvY2Fzc2FuZHJhLnlhbWwKaW5kZXggNGIyNzExYy4uY2E4NjViMSAxMDA2NDQKLS0tIGEvY29uZi9jYXNzYW5kcmEueWFtbAorKysgYi9jb25mL2Nhc3NhbmRyYS55YW1sCkBAIC0yMSw3ICsyMSw3IEBACiAjIFNwZWNpZnlpbmcgaW5pdGlhbF90b2tlbiB3aWxsIG92ZXJyaWRlIHRoaXMgc2V0dGluZyBvbiB0aGUgbm9kZSdzIGluaXRpYWwgc3RhcnQsCiAjIG9uIHN1YnNlcXVlbnQgc3RhcnRzLCB0aGlzIHNldHRpbmcgd2lsbCBhcHBseSBldmVuIGlmIGluaXRpYWwgdG9rZW4gaXMgc2V0LgogIwotIyBTZWUgaHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9kb2MvbGF0ZXN0L2dldHRpbmdfc3RhcnRlZC9wcm9kdWN0aW9uLmh0bWwjdG9rZW5zIGZvcgorIyBTZWUgaHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9kb2MvbGF0ZXN0L2dldHRpbmctc3RhcnRlZC9wcm9kdWN0aW9uLmh0bWwjdG9rZW5zIGZvcgogIyBiZXN0IHByYWN0aWNlIGluZm9ybWF0aW9uIGFib3V0IG51bV90b2tlbnMuCiAjCiBudW1fdG9rZW5zOiAxNgpAQCAtNDQsOCArNDQsOCBAQAogYWxsb2NhdGVfdG9rZW5zX2Zvcl9sb2NhbF9yZXBsaWNhdGlvbl9mYWN0b3I6IDMKIAogIyBpbml0aWFsX3Rva2VuIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0b2tlbnMgbWFudWFsbHkuICBXaGlsZSB5b3UgY2FuIHVzZSBpdCB3aXRoCi0jIHZub2RlcyAobnVtX3Rva2VucyA+IDEsIGFib3ZlKSAtLSBpbiB3aGljaCBjYXNlIHlvdSBzaG91bGQgcHJvdmlkZSBhIAotIyBjb21tYS1zZXBhcmF0ZWQgbGlzdCAtLSBpdCdzIHByaW1hcmlseSB1c2VkIHdoZW4gYWRkaW5nIG5vZGVzIHRvIGxlZ2FjeSBjbHVzdGVycyAKKyMgdm5vZGVzIChudW1fdG9rZW5zID4gMSwgYWJvdmUpIC0tIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCBwcm92aWRlIGEKKyMgY29tbWEtc2VwYXJhdGVkIGxpc3QgLS0gaXQncyBwcmltYXJpbHkgdXNlZCB3aGVuIGFkZGluZyBub2RlcyB0byBsZWdhY3kgY2x1c3RlcnMKICMgdGhhdCBkbyBub3QgaGF2ZSB2bm9kZXMgZW5hYmxlZC4KICMgaW5pdGlhbF90b2tlbjoKIApAQCAtOTksNiArOTksMTEgQEAKICMgRGlzYWJsZSB0aGUgb3B0aW9uIGluIG9yZGVyIHRvIHByZXNlcnZlIHRob3NlIGhpbnRzIG9uIHRoZSBkaXNrLgogYXV0b19oaW50c19jbGVhbnVwX2VuYWJsZWQ6IGZhbHNlCiAKKyMgRW5hYmxlL2Rpc2FibGUgdHJhbnNmZXJpbmcgaGludHMgdG8gYSBwZWVyIGR1cmluZyBkZWNvbW1pc3Npb24uIEV2ZW4gd2hlbiBlbmFibGVkLCB0aGlzIGRvZXMgbm90IGd1YXJhbnRlZQorIyBjb25zaXN0ZW5jeSBmb3IgbG9nZ2VkIGJhdGNoZXMsIGFuZCBpdCBtYXkgZGVsYXkgZGVjb21taXNzaW9uIHdoZW4gY291cGxlZCB3aXRoIGEgc3RyaWN0IGhpbnRlZF9oYW5kb2ZmX3Rocm90dGxlLiAKKyMgRGVmYXVsdDogdHJ1ZQorIyB0cmFuc2Zlcl9oaW50c19vbl9kZWNvbW1pc3Npb246IHRydWUKKwogIyBDb21wcmVzc2lvbiB0byBhcHBseSB0byB0aGUgaGludCBmaWxlcy4gSWYgb21pdHRlZCwgaGludHMgZmlsZXMKICMgd2lsbCBiZSB3cml0dGVuIHVuY29tcHJlc3NlZC4gTFo0LCBTbmFwcHksIGFuZCBEZWZsYXRlIGNvbXByZXNzb3JzCiAjIGFyZSBzdXBwb3J0ZWQuCkBAIC0xMDcsNiArMTEyLDE2IEBACiAjICAgICBwYXJhbWV0ZXJzOgogIyAgICAgICAgIC0KIAorIyBEaXJlY3Rvcnkgd2hlcmUgQ2Fzc2FuZHJhIHNob3VsZCBzdG9yZSByZXN1bHRzIG9mIGEgT25lLVNob3QgdHJvdWJsZXNob290aW5nIGhlYXBkdW1wIGZvciB1bmNhdWdodCBleGNlcHRpb25zLgorIyBOb3RlOiB0aGlzIHZhbHVlIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSAtWFg6SGVhcER1bXBQYXRoIEpWTSBlbnYgcGFyYW0gd2l0aCBhIHJlbGF0aXZlIGxvY2FsIHBhdGggZm9yIHRlc3RpbmcgaWYKKyMgc28gZGVzaXJlZC4KKyMgSWYgbm90IHNldCwgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzICRDQVNTQU5EUkFfSE9NRS9oZWFwZHVtcAorIyBoZWFwX2R1bXBfcGF0aDogL3Zhci9saWIvY2Fzc2FuZHJhL2hlYXBkdW1wCisKKyMgRW5hYmxlIC8gZGlzYWJsZSBhdXRvbWF0aWMgZHVtcCBvZiBoZWFwIG9uIGZpcnN0IHVuY2F1Z2h0IGV4Y2VwdGlvbgorIyBJZiBub3Qgc2V0LCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZQorIyBkdW1wX2hlYXBfb25fdW5jYXVnaHRfZXhjZXB0aW9uOiB0cnVlCisKICMgRW5hYmxlIC8gZGlzYWJsZSBwZXJzaXN0ZW50IGhpbnQgd2luZG93cy4KICMKICMgSWYgc2V0IHRvIGZhbHNlLCBhIGhpbnQgd2lsbCBiZSBzdG9yZWQgb25seSBpbiBjYXNlIGEgcmVzcGVjdGl2ZSBub2RlCkBAIC0yNzUsNyArMjkwLDcgQEAKIHBhcnRpdGlvbmVyOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyCiAKICMgRGlyZWN0b3JpZXMgd2hlcmUgQ2Fzc2FuZHJhIHNob3VsZCBzdG9yZSBkYXRhIG9uIGRpc2suIElmIG11bHRpcGxlCi0jIGRpcmVjdG9yaWVzIGFyZSBzcGVjaWZpZWQsIENhc3NhbmRyYSB3aWxsIHNwcmVhZCBkYXRhIGV2ZW5seSBhY3Jvc3MgCisjIGRpcmVjdG9yaWVzIGFyZSBzcGVjaWZpZWQsIENhc3NhbmRyYSB3aWxsIHNwcmVhZCBkYXRhIGV2ZW5seSBhY3Jvc3MKICMgdGhlbSBieSBwYXJ0aXRpb25pbmcgdGhlIHRva2VuIHJhbmdlcy4KICMgSWYgbm90IHNldCwgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzICRDQVNTQU5EUkFfSE9NRS9kYXRhL2RhdGEuCiAjIGRhdGFfZmlsZV9kaXJlY3RvcmllczoKQEAgLTI5OCw2ICszMTMsMTggQEAKICMgY29udGFpbmluZyBhIENEQy1lbmFibGVkIHRhYmxlIGlmIGF0IHNwYWNlIGxpbWl0IGluIGNkY19yYXdfZGlyZWN0b3J5KS4KIGNkY19lbmFibGVkOiBmYWxzZQogCisjIFNwZWNpZnkgd2hldGhlciB3cml0ZXMgdG8gdGhlIENEQy1lbmFibGVkIHRhYmxlcyBzaG91bGQgYmUgYmxvY2tlZCB3aGVuIENEQyBkYXRhIG9uIGRpc2sgaGFzIHJlYWNoZWQgdG8gdGhlIGxpbWl0LgorIyBXaGVuIHNldHRpbmcgdG8gZmFsc2UsIHRoZSB3cml0ZXMgd2lsbCBub3QgYmUgYmxvY2tlZCBhbmQgdGhlIG9sZGVzdCBDREMgZGF0YSBvbiBkaXNrIHdpbGwgYmUgZGVsZXRlZCB0bworIyBlbnN1cmUgdGhlIHNpemUgY29uc3RyYWludC4gVGhlIGRlZmF1bHQgaXMgdHJ1ZS4KKyMgY2RjX2Jsb2NrX3dyaXRlczogdHJ1ZQorCisjIFNwZWNpZnkgd2hldGhlciBDREMgbXV0YXRpb25zIGFyZSByZXBsYXllZCB0aHJvdWdoIHRoZSB3cml0ZSBwYXRoIG9uIHN0cmVhbWluZywgZS5nLiByZXBhaXIuCisjIFdoZW4gZW5hYmxlZCwgQ0RDIGRhdGEgc3RyZWFtZWQgdG8gdGhlIGRlc3RpbmF0aW9uIG5vZGUgd2lsbCBiZSB3cml0dGVuIGludG8gY29tbWl0IGxvZyBmaXJzdC4gV2hlbiBzZXR0aW5nIHRvIGZhbHNlLAorIyB0aGUgc3RyZWFtZWQgQ0RDIGRhdGEgaXMgd3JpdHRlbiBpbnRvIFNTVGFibGVzIGp1c3QgdGhlIHNhbWUgYXMgbm9ybWFsIHN0cmVhbWluZy4gVGhlIGRlZmF1bHQgaXMgdHJ1ZS4KKyMgSWYgdGhpcyBpcyBzZXQgdG8gZmFsc2UsIHN0cmVhbWluZyB3aWxsIGJlIGNvbnNpZGVyYWJseSBmYXN0ZXIgaG93ZXZlciBpdCdzIHBvc3NpYmxlIHRoYXQsIGluIGV4dHJlbWUgc2l0dWF0aW9ucworIyAobG9zaW5nID4gcXVvcnVtICMgbm9kZXMgaW4gYSByZXBsaWNhIHNldCksIHlvdSBtYXkgaGF2ZSBkYXRhIGluIHlvdXIgU1NUYWJsZXMgdGhhdCBuZXZlciBtYWtlcyBpdCB0byB0aGUgQ0RDIGxvZy4KKyMgY2RjX29uX3JlcGFpcl9lbmFibGVkOiB0cnVlCisKICMgQ29tbWl0TG9nU2VnbWVudHMgYXJlIG1vdmVkIHRvIHRoaXMgZGlyZWN0b3J5IG9uIGZsdXNoIGlmIGNkY19lbmFibGVkOiB0cnVlIGFuZCB0aGUKICMgc2VnbWVudCBjb250YWlucyBtdXRhdGlvbnMgZm9yIGEgQ0RDLWVuYWJsZWQgdGFibGUuIFRoaXMgc2hvdWxkIGJlIHBsYWNlZCBvbiBhCiAjIHNlcGFyYXRlIHNwaW5kbGUgdGhhbiB0aGUgZGF0YSBkaXJlY3Rvcmllcy4gSWYgbm90IHNldCwgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzCkBAIC0zNzYsNiArNDAzLDggQEAKICMgTk9URTogaWYgeW91IHJlZHVjZSB0aGUgc2l6ZSwgeW91IG1heSBub3QgZ2V0IHlvdSBob3R0ZXN0IGtleXMgbG9hZGVkIG9uIHN0YXJ0dXAuCiAjCiAjIERlZmF1bHQgdmFsdWUgaXMgZW1wdHkgdG8gbWFrZSBpdCAiYXV0byIgKG1pbig1JSBvZiBIZWFwIChpbiBNaUIpLCAxMDBNaUIpKS4gU2V0IHRvIDAgdG8gZGlzYWJsZSBrZXkgY2FjaGUuCisjCisjIFRoaXMgaXMgb25seSByZWxldmFudCB0byBTU1RhYmxlIGZvcm1hdHMgdGhhdCB1c2Uga2V5IGNhY2hlLCBlLmcuIEJJRy4KICMgTWluIHVuaXQ6IE1pQgoga2V5X2NhY2hlX3NpemU6CiAKQEAgLTM4NywxMiArNDE2LDE0IEBACiAjIHRlcm1zIG9mIEkvTyBmb3IgdGhlIGtleSBjYWNoZS4gUm93IGNhY2hlIHNhdmluZyBpcyBtdWNoIG1vcmUgZXhwZW5zaXZlIGFuZAogIyBoYXMgbGltaXRlZCB1c2UuCiAjCisjIFRoaXMgaXMgb25seSByZWxldmFudCB0byBTU1RhYmxlIGZvcm1hdHMgdGhhdCB1c2Uga2V5IGNhY2hlLCBlLmcuIEJJRy4KICMgRGVmYXVsdCBpcyAxNDQwMCBvciA0IGhvdXJzLgogIyBNaW4gdW5pdDogcwoga2V5X2NhY2hlX3NhdmVfcGVyaW9kOiA0aAogCiAjIE51bWJlciBvZiBrZXlzIGZyb20gdGhlIGtleSBjYWNoZSB0byBzYXZlCiAjIERpc2FibGVkIGJ5IGRlZmF1bHQsIG1lYW5pbmcgYWxsIGtleXMgYXJlIGdvaW5nIHRvIGJlIHNhdmVkCisjIFRoaXMgaXMgb25seSByZWxldmFudCB0byBTU1RhYmxlIGZvcm1hdHMgdGhhdCB1c2Uga2V5IGNhY2hlLCBlLmcuIEJJRy4KICMga2V5X2NhY2hlX2tleXNfdG9fc2F2ZTogMTAwCiAKICMgUm93IGNhY2hlIGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUuIEF2YWlsYWJsZSBpbXBsZW1lbnRhdGlvbnM6CkBAIC00MDEsNyArNDMyLDcgQEAKICMgICBGdWxseSBvZmYtaGVhcCByb3cgY2FjaGUgaW1wbGVtZW50YXRpb24gKGRlZmF1bHQpLgogIwogIyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5TZXJpYWxpemluZ0NhY2hlUHJvdmlkZXIKLSMgICBUaGlzIGlzIHRoZSByb3cgY2FjaGUgaW1wbGVtZW50YXRpb24gYXZhaWxhYmlsZQorIyAgIFRoaXMgaXMgdGhlIHJvdyBjYWNoZSBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUKICMgICBpbiBwcmV2aW91cyByZWxlYXNlcyBvZiBDYXNzYW5kcmEuCiAjIHJvd19jYWNoZV9jbGFzc19uYW1lOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5PSENQcm92aWRlcgogCkBAIC00NjksOCArNTAwLDggQEAKICMgTWluIHVuaXQ6IHMKICMgY2FjaGVfbG9hZF90aW1lb3V0OiAzMHMKIAotIyBjb21taXRsb2dfc3luYyBtYXkgYmUgZWl0aGVyICJwZXJpb2RpYyIsICJncm91cCIsIG9yICJiYXRjaC4iIAotIyAKKyMgY29tbWl0bG9nX3N5bmMgbWF5IGJlIGVpdGhlciAicGVyaW9kaWMiLCAiZ3JvdXAiLCBvciAiYmF0Y2guIgorIwogIyBXaGVuIGluIGJhdGNoIG1vZGUsIENhc3NhbmRyYSB3b24ndCBhY2sgd3JpdGVzIHVudGlsIHRoZSBjb21taXQgbG9nCiAjIGhhcyBiZWVuIGZsdXNoZWQgdG8gZGlzay4gIEVhY2ggaW5jb21pbmcgd3JpdGUgd2lsbCB0cmlnZ2VyIHRoZSBmbHVzaCB0YXNrLgogIyBjb21taXRsb2dfc3luY19iYXRjaF93aW5kb3dfaW5fbXMgaXMgYSBkZXByZWNhdGVkIHZhbHVlLiBQcmV2aW91c2x5IGl0IGhhZApAQCAtNTUxLDYgKzU4Miw5IEBACiAgICAgICAjIHNlZWRzIGlzIGFjdHVhbGx5IGEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgYWRkcmVzc2VzLgogICAgICAgIyBFeDogIjxpcDE+LDxpcDI+LDxpcDM+IgogICAgICAgLSBzZWVkczogIjEyNy4wLjAuMTo3MDAwIgorICAgICAgIyBJZiBzZXQgdG8gInRydWUiLCBTaW1wbGVTZWVkUHJvdmlkZXIgd2lsbCByZXR1cm4gYWxsIElQIGFkZHJlc3NlcyBmb3IgYSBETlMgbmFtZSwKKyAgICAgICMgYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgbmFtZSBzZXJ2aWNlIG9uIHRoZSBzeXN0ZW0uIERlZmF1bHRzIHRvICJmYWxzZSIuCisgICAgICAjICByZXNvbHZlX211bHRpcGxlX2lwX2FkZHJlc3Nlc19wZXJfZG5zX3JlY29yZDogImZhbHNlIgogCiAjIEZvciB3b3JrbG9hZHMgd2l0aCBtb3JlIGRhdGEgdGhhbiBjYW4gZml0IGluIG1lbW9yeSwgQ2Fzc2FuZHJhJ3MKICMgYm90dGxlbmVjayB3aWxsIGJlIHJlYWRzIHRoYXQgbmVlZCB0byBmZXRjaCBkYXRhIGZyb20KQEAgLTg5Niw5ICs5MzAsMTEgQEAKICMgaW50ZXJub2RlX3NvY2tldF9yZWNlaXZlX2J1ZmZlcl9zaXplOgogCiAjIFNldCB0byB0cnVlIHRvIGhhdmUgQ2Fzc2FuZHJhIGNyZWF0ZSBhIGhhcmQgbGluayB0byBlYWNoIHNzdGFibGUKLSMgZmx1c2hlZCBvciBzdHJlYW1lZCBsb2NhbGx5IGluIGEgYmFja3Vwcy8gc3ViZGlyZWN0b3J5IG9mIHRoZQotIyBrZXlzcGFjZSBkYXRhLiAgUmVtb3ZpbmcgdGhlc2UgbGlua3MgaXMgdGhlIG9wZXJhdG9yJ3MKLSMgcmVzcG9uc2liaWxpdHkuCisjIGZsdXNoZWQgb3Igc3RyZWFtZWQgbG9jYWxseSBpbiBhIGJhY2t1cHMvIHN1YmRpcmVjdG9yeSBvZiBhbGwgdGhlCisjIGtleXNwYWNlIGRhdGEgaW4gdGhpcyBub2RlLiAgUmVtb3ZpbmcgdGhlc2UgbGlua3MgaXMgdGhlIG9wZXJhdG9yJ3MKKyMgcmVzcG9uc2liaWxpdHkuIFRoZSBvcGVyYXRvciBjYW4gYWxzbyB0dXJuIG9mZiBpbmNyZW1lbnRhbCBiYWNrdXBzIAorIyBmb3Igc3BlY2lmaWVkIHRhYmxlIGJ5IHNldHRpbmcgdGFibGUgcGFyYW1ldGVyIGluY3JlbWVudGFsX2JhY2t1cHMgdG8gCisjIGZhbHNlLCB3aGljaCBpcyBzZXQgdG8gdHJ1ZSBieSBkZWZhdWx0LiBTZWUgQ0FTU0FORFJBLTE1NDAyCiBpbmNyZW1lbnRhbF9iYWNrdXBzOiBmYWxzZQogCiAjIFdoZXRoZXIgb3Igbm90IHRvIHRha2UgYSBzbmFwc2hvdCBiZWZvcmUgZWFjaCBjb21wYWN0aW9uLiAgQmUKQEAgLTkwOCw3ICs5NDQsNyBAQAogc25hcHNob3RfYmVmb3JlX2NvbXBhY3Rpb246IGZhbHNlCiAKICMgV2hldGhlciBvciBub3QgYSBzbmFwc2hvdCBpcyB0YWtlbiBvZiB0aGUgZGF0YSBiZWZvcmUga2V5c3BhY2UgdHJ1bmNhdGlvbgotIyBvciBkcm9wcGluZyBvZiBjb2x1bW4gZmFtaWxpZXMuIFRoZSBTVFJPTkdMWSBhZHZpc2VkIGRlZmF1bHQgb2YgdHJ1ZSAKKyMgb3IgZHJvcHBpbmcgb2YgY29sdW1uIGZhbWlsaWVzLiBUaGUgU1RST05HTFkgYWR2aXNlZCBkZWZhdWx0IG9mIHRydWUKICMgc2hvdWxkIGJlIHVzZWQgdG8gcHJvdmlkZSBkYXRhIHNhZmV0eS4gSWYgeW91IHNldCB0aGlzIGZsYWcgdG8gZmFsc2UsIHlvdSB3aWxsCiAjIGxvc2UgZGF0YSBvbiB0cnVuY2F0aW9uIG9yIGRyb3AuCiBhdXRvX3NuYXBzaG90OiB0cnVlCkBAIC05MjgsMTggKzk2NCwzMSBAQAogIyB0YWtpbmcgYW5kIGNsZWFyaW5nIHNuYXBzaG90cwogc25hcHNob3RfbGlua3NfcGVyX3NlY29uZDogMAogCisjIFRoZSBzc3RhYmxlIGZvcm1hdHMgY29uZmlndXJhdGlvbi4gU1NUYWJsZSBmb3JtYXRzIGltcGxlbWVudGF0aW9ucyBhcmUKKyMgbG9hZGVkIHVzaW5nIHRoZSBzZXJ2aWNlIGxvYWRlciBtZWNoYW5pc20uIEluIHRoaXMgc2VjdGlvbiwgb25lIGNhbiBzZWxlY3QKKyMgdGhlIGZvcm1hdCBmb3IgY3JlYXRlZCBzc3RhYmxlcyBhbmQgcGFzcyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBmb3JtYXRzCisjIGF2YWlsYWJsZSBvbiB0aGUgY2xhc3NwYXRoLgorIyBUaGUgZGVmYXVsdCBmb3JtYXQgaXMgImJpZyIsIHRoZSBsZWdhY3kgU1NUYWJsZSBmb3JtYXQgaW4gdXNlIHNpbmNlIENhc3NhbmRyYSAzLjAuCisjIENhc3NhbmRyYSB2ZXJzaW9ucyA1LjAgYW5kIGxhdGVyIGFsc28gc3VwcG9ydCB0aGUgdHJpZS1pbmRleGVkICJidGkiIGZvcm1hdCwKKyMgd2hpY2ggb2ZmZXJzIGJldHRlciBwZXJmb3JtYW5jZS4KKyNzc3RhYmxlOgorIyAgc2VsZWN0ZWRfZm9ybWF0OiBiaWcKKwogIyBHcmFudWxhcml0eSBvZiB0aGUgY29sbGF0aW9uIGluZGV4IG9mIHJvd3Mgd2l0aGluIGEgcGFydGl0aW9uLgotIyBJbmNyZWFzZSBpZiB5b3VyIHJvd3MgYXJlIGxhcmdlLCBvciBpZiB5b3UgaGF2ZSBhIHZlcnkgbGFyZ2UKLSMgbnVtYmVyIG9mIHJvd3MgcGVyIHBhcnRpdGlvbi4gIFRoZSBjb21wZXRpbmcgZ29hbHMgYXJlIHRoZXNlOgorIyBBcHBsaWVzIHRvIGJvdGggQklHIGFuZCBCVEkgU1NUYWJsZSBmb3JtYXRzLiBJbiBib3RoIGZvcm1hdHMsCisjIGEgc21hbGxlciBncmFudWxhcml0eSByZXN1bHRzIGluIGZhc3RlciBsb29rdXAgb2Ygcm93cyB3aXRoaW4KKyMgYSBwYXJ0aXRpb24sIGJ1dCBhIGJpZ2dlciBpbmRleCBmaWxlIHNpemUuCisjIFVzaW5nIHNtYWxsZXIgZ3JhbnVsYXJpdGllcyB3aXRoIHRoZSBCSUcgZm9ybWF0IGlzIG5vdCByZWNvbW1lbmRlZAorIyBiZWNhdXNlIGJpZ2dlciBjb2xsYXRpb24gaW5kZXhlcyBjYW5ub3QgYmUgY2FjaGVkIGVmZmljaWVudGx5CisjIG9yIGF0IGFsbCBpZiB0aGV5IGJlY29tZSBzdWZmaWNpZW50bHkgbGFyZ2UuIEZ1cnRoZXIsIGlmCisjIGxhcmdlIHJvd3MsIG9yIGEgdmVyeSBsYXJnZSBudW1iZXIgb2Ygcm93cyBwZXIgcGFydGl0aW9uIGFyZQorIyBwcmVzZW50LCBpdCBpcyByZWNvbW1lbmRlZCB0byBpbmNyZWFzZSB0aGUgaW5kZXggZ3JhbnVsYXJpdHkKKyMgb3Igc3dpdGNoIHRvIHRoZSBCVEkgU1NUYWJsZSBmb3JtYXQuCiAjCi0jIC0gYSBzbWFsbGVyIGdyYW51bGFyaXR5IG1lYW5zIG1vcmUgaW5kZXggZW50cmllcyBhcmUgZ2VuZXJhdGVkCi0jICAgYW5kIGxvb2tpbmcgdXAgcm93cyB3aXRoaW5nIHRoZSBwYXJ0aXRpb24gYnkgY29sbGF0aW9uIGNvbHVtbgotIyAgIGlzIGZhc3RlcgotIyAtIGJ1dCwgQ2Fzc2FuZHJhIHdpbGwga2VlcCB0aGUgY29sbGF0aW9uIGluZGV4IGluIG1lbW9yeSBmb3IgaG90Ci0jICAgcm93cyAoYXMgcGFydCBvZiB0aGUga2V5IGNhY2hlKSwgc28gYSBsYXJnZXIgZ3JhbnVsYXJpdHkgbWVhbnMKLSMgICB5b3UgY2FuIGNhY2hlIG1vcmUgaG90IHJvd3MKKyMgTGVhdmUgdW5kZWZpbmVkIHRvIHVzZSBhIGRlZmF1bHQgc3VpdGFibGUgZm9yIHRoZSBTU1RhYmxlIGZvcm1hdAorIyBpbiB1c2UgKDY0IEtpQiBmb3IgQklHLCAxNktpQiBmb3IgQlRJKS4KICMgTWluIHVuaXQ6IEtpQgotY29sdW1uX2luZGV4X3NpemU6IDY0S2lCCisjIGNvbHVtbl9pbmRleF9zaXplOiA0S2lCCiAKICMgUGVyIHNzdGFibGUgaW5kZXhlZCBrZXkgY2FjaGUgZW50cmllcyAodGhlIGNvbGxhdGlvbiBpbmRleCBpbiBtZW1vcnkKICMgbWVudGlvbmVkIGFib3ZlKSBleGNlZWRpbmcgdGhpcyBzaXplIHdpbGwgbm90IGJlIGhlbGQgb24gaGVhcC4KQEAgLTk0OCw2ICs5OTcsOCBAQAogIwogIyBOb3RlIHRoYXQgdGhpcyBzaXplIHJlZmVycyB0byB0aGUgc2l6ZSBvZiB0aGUKICMgc2VyaWFsaXplZCBpbmRleCBpbmZvcm1hdGlvbiBhbmQgbm90IHRoZSBzaXplIG9mIHRoZSBwYXJ0aXRpb24uCisjCisjIFRoaXMgaXMgb25seSByZWxldmFudCB0byBTU1RhYmxlIGZvcm1hdHMgdGhhdCB1c2Uga2V5IGNhY2hlLCBlLmcuIEJJRy4KICMgTWluIHVuaXQ6IEtpQgogY29sdW1uX2luZGV4X2NhY2hlX3NpemU6IDJLaUIKIApAQCAtOTYyLDcgKzEwMTMsNyBAQAogIwogIyBjb25jdXJyZW50X2NvbXBhY3RvcnMgZGVmYXVsdHMgdG8gdGhlIHNtYWxsZXIgb2YgKG51bWJlciBvZiBkaXNrcywKICMgbnVtYmVyIG9mIGNvcmVzKSwgd2l0aCBhIG1pbmltdW0gb2YgMiBhbmQgYSBtYXhpbXVtIG9mIDguCi0jIAorIwogIyBJZiB5b3VyIGRhdGEgZGlyZWN0b3JpZXMgYXJlIGJhY2tlZCBieSBTU0QsIHlvdSBzaG91bGQgaW5jcmVhc2UgdGhpcwogIyB0byB0aGUgbnVtYmVyIG9mIGNvcmVzLgogIyBjb25jdXJyZW50X2NvbXBhY3RvcnM6IDEKQEAgLTk5MCw3ICsxMDQxLDcgQEAKIAogIyBXaGVuIGNvbXBhY3RpbmcsIHRoZSByZXBsYWNlbWVudCBzc3RhYmxlKHMpIGNhbiBiZSBvcGVuZWQgYmVmb3JlIHRoZXkKICMgYXJlIGNvbXBsZXRlbHkgd3JpdHRlbiwgYW5kIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIHByaW9yIHNzdGFibGVzIGZvcgotIyBhbnkgcmFuZ2UgdGhhdCBoYXMgYmVlbiB3cml0dGVuLiBUaGlzIGhlbHBzIHRvIHNtb290aGx5IHRyYW5zZmVyIHJlYWRzIAorIyBhbnkgcmFuZ2UgdGhhdCBoYXMgYmVlbiB3cml0dGVuLiBUaGlzIGhlbHBzIHRvIHNtb290aGx5IHRyYW5zZmVyIHJlYWRzCiAjIGJldHdlZW4gdGhlIHNzdGFibGVzLCByZWR1Y2luZyBwYWdlIGNhY2hlIGNodXJuIGFuZCBrZWVwaW5nIGhvdCByb3dzIGhvdAogIyBTZXQgc3N0YWJsZV9wcmVlbXB0aXZlX29wZW5faW50ZXJ2YWwgdG8gbnVsbCBmb3IgZGlzYWJsZWQgd2hpY2ggaXMgZXF1aXZhbGVudCB0bwogIyBzc3RhYmxlX3ByZWVtcHRpdmVfb3Blbl9pbnRlcnZhbF9pbl9tYiBiZWluZyBuZWdhdGl2ZQpAQCAtMTEzOCwxMCArMTE4OSwxMCBAQAogIyBFbmFibGUgb3BlcmF0aW9uIHRpbWVvdXQgaW5mb3JtYXRpb24gZXhjaGFuZ2UgYmV0d2VlbiBub2RlcyB0byBhY2N1cmF0ZWx5CiAjIG1lYXN1cmUgcmVxdWVzdCB0aW1lb3V0cy4gIElmIGRpc2FibGVkLCByZXBsaWNhcyB3aWxsIGFzc3VtZSB0aGF0IHJlcXVlc3RzCiAjIHdlcmUgZm9yd2FyZGVkIHRvIHRoZW0gaW5zdGFudGx5IGJ5IHRoZSBjb29yZGluYXRvciwgd2hpY2ggbWVhbnMgdGhhdAotIyB1bmRlciBvdmVybG9hZCBjb25kaXRpb25zIHdlIHdpbGwgd2FzdGUgdGhhdCBtdWNoIGV4dHJhIHRpbWUgcHJvY2Vzc2luZyAKKyMgdW5kZXIgb3ZlcmxvYWQgY29uZGl0aW9ucyB3ZSB3aWxsIHdhc3RlIHRoYXQgbXVjaCBleHRyYSB0aW1lIHByb2Nlc3NpbmcKICMgYWxyZWFkeS10aW1lZC1vdXQgcmVxdWVzdHMuCiAjCi0jIFdhcm5pbmc6IEl0IGlzIGdlbmVyYWxseSBhc3N1bWVkIHRoYXQgdXNlcnMgaGF2ZSBzZXR1cCBOVFAgb24gdGhlaXIgY2x1c3RlcnMsIGFuZCB0aGF0IGNsb2NrcyBhcmUgbW9kZXN0bHkgaW4gc3luYywgCisjIFdhcm5pbmc6IEl0IGlzIGdlbmVyYWxseSBhc3N1bWVkIHRoYXQgdXNlcnMgaGF2ZSBzZXR1cCBOVFAgb24gdGhlaXIgY2x1c3RlcnMsIGFuZCB0aGF0IGNsb2NrcyBhcmUgbW9kZXN0bHkgaW4gc3luYywKICMgc2luY2UgdGhpcyBpcyBhIHJlcXVpcmVtZW50IGZvciBnZW5lcmFsIGNvcnJlY3RuZXNzIG9mIGxhc3Qgd3JpdGUgd2lucy4KICMgaW50ZXJub2RlX3RpbWVvdXQ6IHRydWUKIApAQCAtMTMyOSwxNyArMTM4MCwyMyBAQAogICBsZWdhY3lfc3NsX3N0b3JhZ2VfcG9ydF9lbmFibGVkOiBmYWxzZQogICAjIFNldCB0byBhIHZhbGlkIGtleXN0b3JlIGlmIGludGVybm9kZV9lbmNyeXB0aW9uIGlzIGRjLCByYWNrIG9yIGFsbAogICBrZXlzdG9yZTogY29uZi8ua2V5c3RvcmUKLSAga2V5c3RvcmVfcGFzc3dvcmQ6IGNhc3NhbmRyYQorICAja2V5c3RvcmVfcGFzc3dvcmQ6IGNhc3NhbmRyYQogICAjIENvbmZpZ3VyZSB0aGUgd2F5IENhc3NhbmRyYSBjcmVhdGVzIFNTTCBjb250ZXh0cy4KICAgIyBUbyB1c2UgUEVNLWJhc2VkIGtleSBtYXRlcmlhbCwgc2VlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LlBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkKICAgIyBzc2xfY29udGV4dF9mYWN0b3J5OgogICAjICAgICAjIE11c3QgYmUgYW4gaW5zdGFuY2Ugb2Ygb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuSVNzbENvbnRleHRGYWN0b3J5CiAgICMgICAgIGNsYXNzX25hbWU6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LkRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeQorICAjIER1cmluZyBpbnRlcm5vZGUgbVRMUyBhdXRoZW50aWNhdGlvbiwgaW5ib3VuZCBjb25uZWN0aW9ucyAoYWN0aW5nIGFzIHNlcnZlcnMpIHVzZSBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQKKyAgIyBjb250YWluaW5nIHNlcnZlciBjZXJ0aWZpY2F0ZSB0byBjcmVhdGUgU1NMQ29udGV4dCBhbmQKKyAgIyBvdXRib3VuZCBjb25uZWN0aW9ucyAoYWN0aW5nIGFzIGNsaWVudHMpIHVzZSBvdXRib3VuZF9rZXlzdG9yZSAmIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkIHdpdGggY2xpZW50IGNlcnRpZmljYXRlcworICAjIHRvIGNyZWF0ZSBTU0xDb250ZXh0LiBCeSBkZWZhdWx0LCBvdXRib3VuZF9rZXlzdG9yZSBpcyB0aGUgc2FtZSBhcyBrZXlzdG9yZSBpbmRpY2F0aW5nIG1UTFMgaXMgbm90IGVuYWJsZWQuCisjICBvdXRib3VuZF9rZXlzdG9yZTogY29uZi8ua2V5c3RvcmUKKyMgIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkOiBjYXNzYW5kcmEKICAgIyBWZXJpZnkgcGVlciBzZXJ2ZXIgY2VydGlmaWNhdGVzCiAgIHJlcXVpcmVfY2xpZW50X2F1dGg6IGZhbHNlCiAgICMgU2V0IHRvIGEgdmFsaWQgdHJ1c3RvcmUgaWYgcmVxdWlyZV9jbGllbnRfYXV0aCBpcyB0cnVlCiAgIHRydXN0c3RvcmU6IGNvbmYvLnRydXN0c3RvcmUKLSAgdHJ1c3RzdG9yZV9wYXNzd29yZDogY2Fzc2FuZHJhCisgICN0cnVzdHN0b3JlX3Bhc3N3b3JkOiBjYXNzYW5kcmEKICAgIyBWZXJpZnkgdGhhdCB0aGUgaG9zdCBuYW1lIGluIHRoZSBjZXJ0aWZpY2F0ZSBtYXRjaGVzIHRoZSBjb25uZWN0ZWQgaG9zdAogICByZXF1aXJlX2VuZHBvaW50X3ZlcmlmaWNhdGlvbjogZmFsc2UKICAgIyBNb3JlIGFkdmFuY2VkIGRlZmF1bHRzOgpAQCAtMTM3Myw3ICsxNDMwLDcgQEAKICAgIyBvcHRpb25hbDogdHJ1ZQogICAjIFNldCBrZXlzdG9yZSBhbmQga2V5c3RvcmVfcGFzc3dvcmQgdG8gdmFsaWQga2V5c3RvcmVzIGlmIGVuYWJsZWQgaXMgdHJ1ZQogICBrZXlzdG9yZTogY29uZi8ua2V5c3RvcmUKLSAga2V5c3RvcmVfcGFzc3dvcmQ6IGNhc3NhbmRyYQorICAja2V5c3RvcmVfcGFzc3dvcmQ6IGNhc3NhbmRyYQogICAjIENvbmZpZ3VyZSB0aGUgd2F5IENhc3NhbmRyYSBjcmVhdGVzIFNTTCBjb250ZXh0cy4KICAgIyBUbyB1c2UgUEVNLWJhc2VkIGtleSBtYXRlcmlhbCwgc2VlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LlBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkKICAgIyBzc2xfY29udGV4dF9mYWN0b3J5OgpAQCAtMTM4MSw2ICsxNDM4LDcgQEAKICAgIyAgICAgY2xhc3NfbmFtZTogb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5CiAgICMgVmVyaWZ5IGNsaWVudCBjZXJ0aWZpY2F0ZXMKICAgcmVxdWlyZV9jbGllbnRfYXV0aDogZmFsc2UKKyAgIyByZXF1aXJlX2VuZHBvaW50X3ZlcmlmaWNhdGlvbjogZmFsc2UKICAgIyBTZXQgdHJ1c3RvcmUgYW5kIHRydXN0c3RvcmVfcGFzc3dvcmQgaWYgcmVxdWlyZV9jbGllbnRfYXV0aCBpcyB0cnVlCiAgICMgdHJ1c3RzdG9yZTogY29uZi8udHJ1c3RzdG9yZQogICAjIHRydXN0c3RvcmVfcGFzc3dvcmQ6IGNhc3NhbmRyYQpAQCAtMTQyNiwxMiArMTQ4NCw2IEBACiAjIEFzIG9mIENhc3NhbmRyYSAzLjAgdGhlcmUgaXMgYSBzYW5kYm94IGluIHBsYWNlIHRoYXQgc2hvdWxkIHByZXZlbnQgZXhlY3V0aW9uIG9mIGV2aWwgY29kZS4KIHVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogZmFsc2UKIAotIyBFbmFibGVzIHNjcmlwdGVkIFVERnMgKEphdmFTY3JpcHQgVURGcykuCi0jIEphdmEgVURGcyBhcmUgYWx3YXlzIGVuYWJsZWQsIGlmIHVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZCBpcyB0cnVlLgotIyBFbmFibGUgdGhpcyBvcHRpb24gdG8gYmUgYWJsZSB0byB1c2UgVURGcyB3aXRoICJsYW5ndWFnZSBqYXZhc2NyaXB0IiBvciBhbnkgY3VzdG9tIEpTUi0yMjMgcHJvdmlkZXIuCi0jIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QsIGlmIHVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZCBpcyBmYWxzZS4KLXNjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogZmFsc2UKLQogIyBFbmFibGVzIGVuY3J5cHRpbmcgZGF0YSBhdC1yZXN0IChvbiBkaXNrKS4gRGlmZmVyZW50IGtleSBwcm92aWRlcnMgY2FuIGJlIHBsdWdnZWQgaW4sIGJ1dCB0aGUgZGVmYXVsdCByZWFkcyBmcm9tCiAjIGEgSkNFLXN0eWxlIGtleXN0b3JlLiBBIHNpbmdsZSBrZXlzdG9yZSBjYW4gaG9sZCBtdWx0aXBsZSBrZXlzLCBidXQgdGhlIG9uZSByZWZlcmVuY2VkIGJ5CiAjIHRoZSAia2V5X2FsaWFzIiBpcyB0aGUgb25seSBrZXkgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGVuY3J5cHQgb3BlcnRhaW9uczsgcHJldmlvdXNseSB1c2VkIGtleXMKQEAgLTE1MDgsNyArMTU2MCw4IEBACiAjIExvZyBXQVJOIG9uIGFueSBiYXRjaGVzIG5vdCBvZiB0eXBlIExPR0dFRCB0aGFuIHNwYW4gYWNyb3NzIG1vcmUgcGFydGl0aW9ucyB0aGFuIHRoaXMgbGltaXQKIHVubG9nZ2VkX2JhdGNoX2Fjcm9zc19wYXJ0aXRpb25zX3dhcm5fdGhyZXNob2xkOiAxMAogCi0jIExvZyBhIHdhcm5pbmcgd2hlbiBjb21wYWN0aW5nIHBhcnRpdGlvbnMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZQorIyBMb2cgYSB3YXJuaW5nIHdoZW4gY29tcGFjdGluZyBwYXJ0aXRpb25zIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUuCisjIEFzIG9mIENhc3NhbmRyYSA1LjAsIHRoaXMgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgcGFydGl0aW9uX3NpemVfd2Fybl90aHJlc2hvbGQuCiBjb21wYWN0aW9uX2xhcmdlX3BhcnRpdGlvbl93YXJuaW5nX3RocmVzaG9sZDogMTAwTWlCCiAKICMgTG9nIGEgd2FybmluZyB3aGVuIHdyaXRpbmcgbW9yZSB0b21ic3RvbmVzIHRoYW4gdGhpcyB2YWx1ZSB0byBhIHBhcnRpdGlvbgpAQCAtMTU1Nyw3ICsxNjEwLDcgQEAKICMgbWF4X2NvbmN1cnJlbnRfYXV0b21hdGljX3NzdGFibGVfdXBncmFkZXM6IDEKIAogIyBBdWRpdCBsb2dnaW5nIC0gTG9ncyBldmVyeSBpbmNvbWluZyBDUUwgY29tbWFuZCByZXF1ZXN0LCBhdXRoZW50aWNhdGlvbiB0byBhIG5vZGUuIFNlZSB0aGUgZG9jcwotIyBvbiBhdWRpdF9sb2dnaW5nIGZvciBmdWxsIGRldGFpbHMgYWJvdXQgdGhlIHZhcmlvdXMgY29uZmlndXJhdGlvbiBvcHRpb25zLgorIyBvbiBhdWRpdF9sb2dnaW5nIGZvciBmdWxsIGRldGFpbHMgYWJvdXQgdGhlIHZhcmlvdXMgY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZCBwcm9kdWN0aW9uIHRpcHMuCiBhdWRpdF9sb2dnaW5nX29wdGlvbnM6CiAgIGVuYWJsZWQ6IGZhbHNlCiAgIGxvZ2dlcjoKQEAgLTE1NzMsMTEgKzE2MjYsMTMgQEAKICAgIyBibG9jazogdHJ1ZQogICAjIG1heF9xdWV1ZV93ZWlnaHQ6IDI2ODQzNTQ1NiAjIDI1NiBNaUIKICAgIyBtYXhfbG9nX3NpemU6IDE3MTc5ODY5MTg0ICMgMTYgR2lCCi0gICMjIGFyY2hpdmUgY29tbWFuZCBpcyAiL3BhdGgvdG8vc2NyaXB0LnNoICVwYXRoIiB3aGVyZSAlcGF0aCBpcyByZXBsYWNlZCB3aXRoIHRoZSBmaWxlIGJlaW5nIHJvbGxlZDoKKyAgIworICAjIyBJZiBhcmNoaXZlX2NvbW1hbmQgaXMgZW1wdHkgb3IgdW5zZXQsIENhc3NhbmRyYSB1c2VzIGEgYnVpbHQtaW4gRGVsZXRpbmdBcmNoaXZlciB0aGF0IGRlbGV0ZXMgdGhlIG9sZGVzdCBmaWxlcyBpZiBgYG1heF9sb2dfc2l6ZWBgIGlzIHJlYWNoZWQuCisgICMjIElmIGFyY2hpdmVfY29tbWFuZCBpcyBzZXQsIENhc3NhbmRyYSBkb2VzIG5vdCB1c2UgRGVsZXRpbmdBcmNoaXZlciwgc28gaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBzY3JpcHQgdG8gbWFrZSBhbnkgcmVxdWlyZWQgY2xlYW51cC4KKyAgIyMgRXhhbXBsZTogIi9wYXRoL3RvL3NjcmlwdC5zaCAlcGF0aCIgd2hlcmUgJXBhdGggaXMgcmVwbGFjZWQgd2l0aCB0aGUgZmlsZSBiZWluZyByb2xsZWQuCiAgICMgYXJjaGl2ZV9jb21tYW5kOgogICAjIG1heF9hcmNoaXZlX3JldHJpZXM6IDEwCiAKLQogIyBkZWZhdWx0IG9wdGlvbnMgZm9yIGZ1bGwgcXVlcnkgbG9nZ2luZyAtIHRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIGZyb20gY29tbWFuZCBsaW5lIHdoZW4gZXhlY3V0aW5nCiAjIG5vZGV0b29sIGVuYWJsZWZ1bGxxdWVyeWxvZwogIyBmdWxsX3F1ZXJ5X2xvZ2dpbmdfb3B0aW9uczoKQEAgLTE2MzcsNiArMTY5MiwxNCBAQAogIyB3YXJtaW5nIG9mIGF1dGggY2FjaGVzIHByaW9yIHRvIG5vZGUgY29tcGxldGluZyBzdGFydHVwLiBTZWUgQ0FTU0FORFJBLTE2OTU4CiAjIGF1dGhfY2FjaGVfd2FybWluZ19lbmFibGVkOiBmYWxzZQogCisjIElmIGVuYWJsZWQsIGR5bmFtaWMgZGF0YSBtYXNraW5nIGFsbG93cyB0byBhdHRhY2ggQ1FMIG1hc2tpbmcgZnVuY3Rpb25zIHRvIHRoZSBjb2x1bW5zIG9mIGEgdGFibGUuCisjIFVzZXJzIHdpdGhvdXQgdGhlIFVOTUFTSyBwZXJtaXNzaW9uIHdpbGwgc2VlIGFuIG9ic2N1cmVkIHZlcnNpb24gb2YgdGhlIHZhbHVlcyBvZiB0aGUgY29sdW1ucyB3aXRoIGFuIGF0dGFjaGVkIG1hc2suCisjIElmIGR5bmFtaWMgZGF0YSBtYXNraW5nIGlzIGRpc2FibGVkIGl0IHdvbid0IGJlIGFsbG93ZWQgdG8gY3JlYXRlIG5ldyBjb2x1bW4gbWFza3MsIGFsdGhvdWdoIGl0IHdpbGwgc3RpbGwgYmUgcG9zc2libGUKKyMgdG8gZHJvcCBhbnkgcHJldmlvdXNseSBleGlzdGluZyBtYXNrcy4gQWxzbywgYW55IGV4aXN0aW5nIG1hc2sgd2lsbCBiZSBpZ25vcmVkIGF0IHF1ZXJ5IHRpbWUsIHNvIGFsbCB1c2VycyB3aWxsIHNlZQorIyB0aGUgY2xlYXIgdmFsdWVzIG9mIHRoZSBtYXNrZWQgY29sdW1ucy4KKyMgRGVmYXVsdHMgdG8gZmFsc2UgdG8gZGlzYWJsZSBkeW5hbWljIGRhdGEgbWFza2luZy4KKyMgZHluYW1pY19kYXRhX21hc2tpbmdfZW5hYmxlZDogZmFsc2UKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBFWFBFUklNRU5UQUwgRkVBVFVSRVMgIwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTY5MSw1OCArMTc1NCwxMTIgQEAKICMgVGhlIHR3byB0aHJlc2hvbGRzIGRlZmF1bHQgdG8gLTEgdG8gZGlzYWJsZS4KICMga2V5c3BhY2VzX3dhcm5fdGhyZXNob2xkOiAtMQogIyBrZXlzcGFjZXNfZmFpbF90aHJlc2hvbGQ6IC0xCisjCiAjIEd1YXJkcmFpbCB0byB3YXJuIG9yIGZhaWwgd2hlbiBjcmVhdGluZyBtb3JlIHVzZXIgdGFibGVzIHRoYW4gdGhyZXNob2xkLgogIyBUaGUgdHdvIHRocmVzaG9sZHMgZGVmYXVsdCB0byAtMSB0byBkaXNhYmxlLgogIyB0YWJsZXNfd2Fybl90aHJlc2hvbGQ6IC0xCiAjIHRhYmxlc19mYWlsX3RocmVzaG9sZDogLTEKKyMKICMgR3VhcmRyYWlsIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZSB1bmNvbXByZXNzZWQgdGFibGVzCiAjIHVuY29tcHJlc3NlZF90YWJsZXNfZW5hYmxlZDogdHJ1ZQorIwogIyBHdWFyZHJhaWwgdG8gd2FybiBvciBmYWlsIHdoZW4gY3JlYXRpbmcvYWx0ZXJpbmcgYSB0YWJsZSB3aXRoIG1vcmUgY29sdW1ucyBwZXIgdGFibGUgdGhhbiB0aHJlc2hvbGQuCiAjIFRoZSB0d28gdGhyZXNob2xkcyBkZWZhdWx0IHRvIC0xIHRvIGRpc2FibGUuCiAjIGNvbHVtbnNfcGVyX3RhYmxlX3dhcm5fdGhyZXNob2xkOiAtMQogIyBjb2x1bW5zX3Blcl90YWJsZV9mYWlsX3RocmVzaG9sZDogLTEKKyMKICMgR3VhcmRyYWlsIHRvIHdhcm4gb3IgZmFpbCB3aGVuIGNyZWF0aW5nIG1vcmUgc2Vjb25kYXJ5IGluZGV4ZXMgcGVyIHRhYmxlIHRoYW4gdGhyZXNob2xkLgogIyBUaGUgdHdvIHRocmVzaG9sZHMgZGVmYXVsdCB0byAtMSB0byBkaXNhYmxlLgogIyBzZWNvbmRhcnlfaW5kZXhlc19wZXJfdGFibGVfd2Fybl90aHJlc2hvbGQ6IC0xCiAjIHNlY29uZGFyeV9pbmRleGVzX3Blcl90YWJsZV9mYWlsX3RocmVzaG9sZDogLTEKKyMKICMgR3VhcmRyYWlsIHRvIGVuYWJsZSBvciBkaXNhYmxlIHRoZSBjcmVhdGlvbiBvZiBzZWNvbmRhcnkgaW5kZXhlcwogIyBzZWNvbmRhcnlfaW5kZXhlc19lbmFibGVkOiB0cnVlCisjCiAjIEd1YXJkcmFpbCB0byB3YXJuIG9yIGZhaWwgd2hlbiBjcmVhdGluZyBtb3JlIG1hdGVyaWFsaXplZCB2aWV3cyBwZXIgdGFibGUgdGhhbiB0aHJlc2hvbGQuCiAjIFRoZSB0d28gdGhyZXNob2xkcyBkZWZhdWx0IHRvIC0xIHRvIGRpc2FibGUuCiAjIG1hdGVyaWFsaXplZF92aWV3c19wZXJfdGFibGVfd2Fybl90aHJlc2hvbGQ6IC0xCiAjIG1hdGVyaWFsaXplZF92aWV3c19wZXJfdGFibGVfZmFpbF90aHJlc2hvbGQ6IC0xCisjCiAjIEd1YXJkcmFpbCB0byB3YXJuIGFib3V0LCBpZ25vcmUgb3IgcmVqZWN0IHByb3BlcnRpZXMgd2hlbiBjcmVhdGluZyB0YWJsZXMuIEJ5IGRlZmF1bHQgYWxsIHByb3BlcnRpZXMgYXJlIGFsbG93ZWQuCiAjIHRhYmxlX3Byb3BlcnRpZXNfd2FybmVkOiBbXQogIyB0YWJsZV9wcm9wZXJ0aWVzX2lnbm9yZWQ6IFtdCiAjIHRhYmxlX3Byb3BlcnRpZXNfZGlzYWxsb3dlZDogW10KKyMKICMgR3VhcmRyYWlsIHRvIGFsbG93L2Rpc2FsbG93IHVzZXItcHJvdmlkZWQgdGltZXN0YW1wcy4gRGVmYXVsdHMgdG8gdHJ1ZS4KICMgdXNlcl90aW1lc3RhbXBzX2VuYWJsZWQ6IHRydWUKKyMKKyMgR3VhcmRyYWlsIHRvIGJvdW5kIHVzZXItcHJvdmlkZWQgdGltZXN0YW1wcyB3aXRoaW4gYSBnaXZlbiByYW5nZS4gRGVmYXVsdCBpcyBpbmZpbml0ZSAoZGVub3RlZCBieSBudWxsKS4KKyMgQWNjZXB0ZWQgdmFsdWVzIGFyZSBkdXJhdGlvbnMgb2YgdGhlIGZvcm0gMTJoLCAyNGgsIGV0Yy4KKyMgbWF4aW11bV90aW1lc3RhbXBfd2Fybl90aHJlc2hvbGQ6CisjIG1heGltdW1fdGltZXN0YW1wX2ZhaWxfdGhyZXNob2xkOgorIyBtaW5pbXVtX3RpbWVzdGFtcF93YXJuX3RocmVzaG9sZDoKKyMgbWluaW11bV90aW1lc3RhbXBfZmFpbF90aHJlc2hvbGQ6CisjCiAjIEd1YXJkcmFpbCB0byBhbGxvdy9kaXNhbGxvdyBHUk9VUCBCWSBmdW5jdGlvbmFsaXR5LgogIyBncm91cF9ieV9lbmFibGVkOiB0cnVlCisjCiAjIEd1YXJkcmFpbCB0byBhbGxvdy9kaXNhbGxvdyBUUlVOQ0FURSBhbmQgRFJPUCBUQUJMRSBzdGF0ZW1lbnRzCiAjIGRyb3BfdHJ1bmNhdGVfdGFibGVfZW5hYmxlZDogdHJ1ZQorIworIyBHdWFyZHJhaWwgdG8gYWxsb3cvZGlzYWxsb3cgRFJPUCBLRVlTUEFDRSBzdGF0ZW1lbnRzCisjIGRyb3Bfa2V5c3BhY2VfZW5hYmxlZDogdHJ1ZQorIwogIyBHdWFyZHJhaWwgdG8gd2FybiBvciBmYWlsIHdoZW4gdXNpbmcgYSBwYWdlIHNpemUgZ3JlYXRlciB0aGFuIHRocmVzaG9sZC4KICMgVGhlIHR3byB0aHJlc2hvbGRzIGRlZmF1bHQgdG8gLTEgdG8gZGlzYWJsZS4KICMgcGFnZV9zaXplX3dhcm5fdGhyZXNob2xkOiAtMQogIyBwYWdlX3NpemVfZmFpbF90aHJlc2hvbGQ6IC0xCisjCiAjIEd1YXJkcmFpbCB0byBhbGxvdy9kaXNhbGxvdyBsaXN0IG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIHJlYWQgYmVmb3JlIHdyaXRlLCBpLmUuIHNldHRpbmcgbGlzdCBlbGVtZW50IGJ5IGluZGV4IGFuZAogIyByZW1vdmluZyBsaXN0IGVsZW1lbnRzIGJ5IGVpdGhlciBpbmRleCBvciB2YWx1ZS4gRGVmYXVsdHMgdG8gdHJ1ZS4KICMgcmVhZF9iZWZvcmVfd3JpdGVfbGlzdF9vcGVyYXRpb25zX2VuYWJsZWQ6IHRydWUKKyMKICMgR3VhcmRyYWlsIHRvIHdhcm4gb3IgZmFpbCB3aGVuIHF1ZXJ5aW5nIHdpdGggYW4gSU4gcmVzdHJpY3Rpb24gc2VsZWN0aW5nIG1vcmUgcGFydGl0aW9uIGtleXMgdGhhbiB0aHJlc2hvbGQuCiAjIFRoZSB0d28gdGhyZXNob2xkcyBkZWZhdWx0IHRvIC0xIHRvIGRpc2FibGUuCiAjIHBhcnRpdGlvbl9rZXlzX2luX3NlbGVjdF93YXJuX3RocmVzaG9sZDogLTEKICMgcGFydGl0aW9uX2tleXNfaW5fc2VsZWN0X2ZhaWxfdGhyZXNob2xkOiAtMQorIwogIyBHdWFyZHJhaWwgdG8gd2FybiBvciBmYWlsIHdoZW4gYW4gSU4gcXVlcnkgY3JlYXRlcyBhIGNhcnRlc2lhbiBwcm9kdWN0IHdpdGggYSBzaXplIGV4Y2VlZGluZyB0aHJlc2hvbGQsCiAjIGVnLiAiYSBpbiAoMSwyLC4uLjEwKSBhbmQgYiBpbiAoMSwyLi4uMTApIiByZXN1bHRzIGluIGNhcnRlc2lhbiBwcm9kdWN0IG9mIDEwMC4KICMgVGhlIHR3byB0aHJlc2hvbGRzIGRlZmF1bHQgdG8gLTEgdG8gZGlzYWJsZS4KICMgaW5fc2VsZWN0X2NhcnRlc2lhbl9wcm9kdWN0X3dhcm5fdGhyZXNob2xkOiAtMQogIyBpbl9zZWxlY3RfY2FydGVzaWFuX3Byb2R1Y3RfZmFpbF90aHJlc2hvbGQ6IC0xCisjCiAjIEd1YXJkcmFpbCB0byB3YXJuIGFib3V0IG9yIHJlamVjdCByZWFkIGNvbnNpc3RlbmN5IGxldmVscy4gQnkgZGVmYXVsdCwgYWxsIGNvbnNpc3RlbmN5IGxldmVscyBhcmUgYWxsb3dlZC4KICMgcmVhZF9jb25zaXN0ZW5jeV9sZXZlbHNfd2FybmVkOiBbXQogIyByZWFkX2NvbnNpc3RlbmN5X2xldmVsc19kaXNhbGxvd2VkOiBbXQorIwogIyBHdWFyZHJhaWwgdG8gd2FybiBhYm91dCBvciByZWplY3Qgd3JpdGUgY29uc2lzdGVuY3kgbGV2ZWxzLiBCeSBkZWZhdWx0LCBhbGwgY29uc2lzdGVuY3kgbGV2ZWxzIGFyZSBhbGxvd2VkLgogIyB3cml0ZV9jb25zaXN0ZW5jeV9sZXZlbHNfd2FybmVkOiBbXQogIyB3cml0ZV9jb25zaXN0ZW5jeV9sZXZlbHNfZGlzYWxsb3dlZDogW10KKyMKKyMgR3VhcmRyYWlsIHRvIHdhcm4gb3IgZmFpbCB3aGVuIHdyaXRpbmcgcGFydGl0aW9ucyBsYXJnZXIgdGhhbiB0aHJlc2hvbGQsIGV4cHJlc3NlZCBhcyAxMDBNaUIsIDFHaUIsIGV0Yy4KKyMgVGhlIGd1YXJkcmFpbCBpcyBvbmx5IGNoZWNrZWQgd2hlbiB3cml0aW5nIHNzdGFibGVzIChmbHVzaCBhbmQgY29tcGFjdGlvbiksIGFuZCBleGNlZWRpbmcgdGhlIGZhaWwgdGhyZXNob2xkIG9uIHRoYXQKKyMgbW9tZW50IHdpbGwgb25seSBsb2cgYW4gZXJyb3IgbWVzc2FnZSwgd2l0aG91dCBpbnRlcnJ1cHRpbmcgdGhlIG9wZXJhdGlvbi4KKyMgVGhpcyBvcGVyYXRlcyBvbiBhIHBlci1zc3RhYmxlIGJhc2lzLCBzbyBpdCB3b24ndCBkZXRlY3QgYSBsYXJnZSBwYXJ0aXRpb24gaWYgaXQgaXMgc3ByZWFkIGFjcm9zcyBtdWx0aXBsZSBzc3RhYmxlcy4KKyMgVGhlIHdhcm5pbmcgdGhyZXNob2xkIHJlcGxhY2VzIHRoZSBkZXByZWNhdGVkIGNvbmZpZyBwcm9wZXJ0eSBjb21wYWN0aW9uX2xhcmdlX3BhcnRpdGlvbl93YXJuaW5nX3RocmVzaG9sZC4KKyMgVGhlIHR3byB0aHJlc2hvbGRzIGRlZmF1bHQgdG8gbnVsbCB0byBkaXNhYmxlLgorIyBwYXJ0aXRpb25fc2l6ZV93YXJuX3RocmVzaG9sZDoKKyMgcGFydGl0aW9uX3NpemVfZmFpbF90aHJlc2hvbGQ6CisjCisjIEd1YXJkcmFpbCB0byB3YXJuIG9yIGZhaWwgd2hlbiB3cml0aW5nIGNvbHVtbiB2YWx1ZXMgbGFyZ2VyIHRoYW4gdGhyZXNob2xkLgorIyBUaGlzIGd1YXJkcmFpbCBpcyBvbmx5IGFwcGxpZWQgdG8gdGhlIHZhbHVlcyBvZiByZWd1bGFyIGNvbHVtbnMgYmVjYXVzZSBib3RoIHRoZSBzZXJpYWxpemVkIHBhcnRpdGlvbnMga2V5cyBhbmQgdGhlCisjIHZhbHVlcyBvZiB0aGUgY29tcG9uZW50cyBvZiB0aGUgY2x1c3RlcmluZyBrZXkgYWxyZWFkeSBoYXZlIGEgZml4ZWQsIHJlbGF0aXZlbHkgc21hbGwgc2l6ZSBsaW1pdCBvZiA2NTUzNSBieXRlcywgd2hpY2gKKyMgaXMgcHJvYmFibHkgbGVzc2VyIHRoYW4gdGhlIHRocmVzaG9sZHMgZGVmaW5lZCBoZXJlLgorIyBEZWxldGluZyBpbmRpdmlkdWFsIGVsZW1lbnRzIG9mIG5vbi1mcm96ZW4gc2V0cyBhbmQgbWFwcyBpbnZvbHZlcyBjcmVhdGluZyB0b21ic3RvbmVzIHRoYXQgY29udGFpbiB0aGUgdmFsdWUgb2YgdGhlCisjIGRlbGV0ZWQgZWxlbWVudCwgaW5kZXBlbmRlbnRseSBvbiB3aGV0aGVyIHRoZSBlbGVtZW50IGV4aXN0ZWQgb3Igbm90LiBUaGF0IHRvbWJzdG9uZSB2YWx1ZSBpcyBhbHNvIGd1YXJkZWQgYnkgdGhpcworIyBndWFyZHJhaWwsIHRvIHByZXZlbnQgdGhlIGluc2VydGlvbiBvZiB0b21ic3RvbmVzIG92ZXIgdGhlIHRocmVzaG9sZC4gVGhlIGRvd25zaWRlIGlzIHRoYXQgZW5hYmxpbmcgb3IgcmFpc2luZyB0aGlzCisjIHRocmVzaG9sZCBjYW4gcHJldmVudCB1c2VycyBmcm9tIGRlbGV0aW5nIHNldC9tYXAgZWxlbWVudHMgdGhhdCB3ZXJlIHdyaXR0ZW4gd2hlbiB0aGUgZ3VhcmRyYWlsIHdhcyBkaXNhYmxlZCBvciB3aXRoIGEKKyMgbG93ZXIgdmFsdWUuIERlbGV0aW5nIHRoZSBlbnRpcmUgY29sdW1uLCByb3cgb3IgcGFydGl0aW9uIGlzIGFsd2F5cyBhbGxvd2VkLCBzaW5jZSB0aGUgdG9tYnN0b25lcyBjcmVhdGVkIGZvciB0aG9zZQorIyBvcGVyYXRpb25zIGRvbid0IGNvbnRhaW4gdGhlIENRTCBjb2x1bW4gdmFsdWVzLgorIyBUaGlzIGd1YXJkcmFpbCBpcyBkaWZmZXJlbnQgdG8gbWF4X3ZhbHVlX3NpemUuIG1heF92YWx1ZV9zaXplIGlzIGNoZWNrZWQgd2hlbiBkZXNlcmlhbGl6aW5nIGFueSB2YWx1ZSB0byBkZXRlY3QKKyMgc3N0YWJsZSBjb3JydXB0aW9uLCB3aGVyZWFzIHRoaXMgZ3VhcmRyYWlsIGlzIGNoZWNrZWQgb24gdGhlIENRTCBsYXllciBhdCB3cml0ZSB0aW1lIHRvIHJlamVjdCByZWd1bGFyIHVzZXIgcXVlcmllcworIyBpbnNlcnRpbmcgdG9vIGxhcmdlIGNvbHVtbnMuCisjIFRoZSB0d28gdGhyZXNob2xkcyBkZWZhdWx0IHRvIG51bGwgdG8gZGlzYWJsZS4KKyMgTWluIHVuaXQ6IEIKKyMgY29sdW1uX3ZhbHVlX3NpemVfd2Fybl90aHJlc2hvbGQ6CisjIGNvbHVtbl92YWx1ZV9zaXplX2ZhaWxfdGhyZXNob2xkOgorIwogIyBHdWFyZHJhaWwgdG8gd2FybiBvciBmYWlsIHdoZW4gZW5jb3VudGVyaW5nIGxhcmdlciBzaXplIG9mIGNvbGxlY3Rpb24gZGF0YSB0aGFuIHRocmVzaG9sZC4KICMgQXQgcXVlcnkgdGltZSB0aGlzIGd1YXJkcmFpbCBpcyBhcHBsaWVkIG9ubHkgdG8gdGhlIGNvbGxlY3Rpb24gZnJhZ21lbnQgdGhhdCBpcyBiZWluZyB3cml0ZW4sIGV2ZW4gdGhvdWdoIGluIHRoZSBjYXNlCiAjIG9mIG5vbi1mcm96ZW4gY29sbGVjdGlvbnMgdGhlcmUgY291bGQgYmUgdW5hY2NvdW50ZWQgcGFydHMgb2YgdGhlIGNvbGxlY3Rpb24gb24gdGhlIHNzdGFibGVzLiBUaGlzIGlzIGRvbmUgdGhpcyB3YXkgdG8KQEAgLTE3NTMsNiArMTg3MCw3IEBACiAjIGNvbGxlY3Rpb25fc2l6ZV93YXJuX3RocmVzaG9sZDoKICMgTWluIHVuaXQ6IEIKICMgY29sbGVjdGlvbl9zaXplX2ZhaWxfdGhyZXNob2xkOgorIwogIyBHdWFyZHJhaWwgdG8gd2FybiBvciBmYWlsIHdoZW4gZW5jb3VudGVyaW5nIG1vcmUgZWxlbWVudHMgaW4gY29sbGVjdGlvbiB0aGFuIHRocmVzaG9sZC4KICMgQXQgcXVlcnkgdGltZSB0aGlzIGd1YXJkcmFpbCBpcyBhcHBsaWVkIG9ubHkgdG8gdGhlIGNvbGxlY3Rpb24gZnJhZ21lbnQgdGhhdCBpcyBiZWluZyB3cml0ZW4sIGV2ZW4gdGhvdWdoIGluIHRoZSBjYXNlCiAjIG9mIG5vbi1mcm96ZW4gY29sbGVjdGlvbnMgdGhlcmUgY291bGQgYmUgdW5hY2NvdW50ZWQgcGFydHMgb2YgdGhlIGNvbGxlY3Rpb24gb24gdGhlIHNzdGFibGVzLiBUaGlzIGlzIGRvbmUgdGhpcyB3YXkgdG8KQEAgLTE3NjEsMTIgKzE4NzksMjIgQEAKICMgVGhlIHR3byB0aHJlc2hvbGRzIGRlZmF1bHQgdG8gLTEgdG8gZGlzYWJsZS4KICMgaXRlbXNfcGVyX2NvbGxlY3Rpb25fd2Fybl90aHJlc2hvbGQ6IC0xCiAjIGl0ZW1zX3Blcl9jb2xsZWN0aW9uX2ZhaWxfdGhyZXNob2xkOiAtMQorIwogIyBHdWFyZHJhaWwgdG8gYWxsb3cvZGlzYWxsb3cgcXVlcnlpbmcgd2l0aCBBTExPVyBGSUxURVJJTkcuIERlZmF1bHRzIHRvIHRydWUuCisjIEFMTE9XIEZJTFRFUklORyBjYW4gcG90ZW50aWFsbHkgdmlzaXQgYWxsIHRoZSBkYXRhIGluIHRoZSB0YWJsZSBhbmQgaGF2ZSB1bnByZWRpY3RhYmxlIHBlcmZvcm1hbmNlLgogIyBhbGxvd19maWx0ZXJpbmdfZW5hYmxlZDogdHJ1ZQorIworIyBHdWFyZHJhaWwgdG8gYWxsb3cvZGlzYWxsb3cgc2V0dGluZyBTaW1wbGVTdHJhdGVneSB2aWEga2V5c3BhY2UgY3JlYXRpb24gb3IgYWx0ZXJhdGlvbi4gRGVmYXVsdHMgdG8gdHJ1ZS4KKyMgc2ltcGxlc3RyYXRlZ3lfZW5hYmxlZDogdHJ1ZQorIwogIyBHdWFyZHJhaWwgdG8gd2FybiBvciBmYWlsIHdoZW4gY3JlYXRpbmcgYSB1c2VyLWRlZmluZWQtdHlwZSB3aXRoIG1vcmUgZmllbGRzIGluIHRoYW4gdGhyZXNob2xkLgogIyBEZWZhdWx0IC0xIHRvIGRpc2FibGUuCiAjIGZpZWxkc19wZXJfdWR0X3dhcm5fdGhyZXNob2xkOiAtMQogIyBmaWVsZHNfcGVyX3VkdF9mYWlsX3RocmVzaG9sZDogLTEKKyMKKyMgR3VhcmRyYWlsIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHVzZXJzIGFyZSBhbGxvd2VkIHRvIHVzZSBBTFRFUiBUQUJMRSBjb21tYW5kcyB0byBtYWtlIGNvbHVtbiBjaGFuZ2VzIHRvIHRhYmxlcworIyBhbHRlcl90YWJsZV9lbmFibGVkOiB0cnVlCisjCiAjIEd1YXJkcmFpbCB0byB3YXJuIG9yIGZhaWwgd2hlbiBsb2NhbCBkYXRhIGRpc2sgdXNhZ2UgcGVyY2VudGFnZSBleGNlZWRzIHRocmVzaG9sZC4gVmFsaWQgdmFsdWVzIGFyZSBpbiBbMSwgMTAwXS4KICMgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHRoZSBkaXNrcyBzdG9yaW5nIGRhdGEgZGlyZWN0b3JpZXMsIHNvIGl0IHdvbid0IGNvdW50IGFueSBzZXBhcmF0ZSBkaXNrcyB1c2VkIGZvciBzdG9yaW5nCiAjIHRoZSBjb21taXRsb2csIGhpbnRzIG5vciBzYXZlZCBjYWNoZXMuIFRoZSBkaXNrIHVzYWdlIGlzIHRoZSByYXRpbyBiZXR3ZWVuIHRoZSBhbW91bnQgb2Ygc3BhY2UgdXNlZCBieSB0aGUgZGF0YQpAQCAtMTc3OCw3ICsxOTA2LDggQEAKICMgVGhlIHR3byB0aHJlc2hvbGRzIGRlZmF1bHQgdG8gLTEgdG8gZGlzYWJsZS4KICMgZGF0YV9kaXNrX3VzYWdlX3BlcmNlbnRhZ2Vfd2Fybl90aHJlc2hvbGQ6IC0xCiAjIGRhdGFfZGlza191c2FnZV9wZXJjZW50YWdlX2ZhaWxfdGhyZXNob2xkOiAtMQotIyBBbGxvd3MgZGVmaW5pbmcgdGhlIG1heCBkaXNrIHNpemUgb2YgdGhlIGRhdGEgZGlyZWN0b3JpZXMgd2hlbiBjYWxjdWxhdGluZyB0aHJlc2hvbGRzIGZvcgorIworIyBHdWFyZHJhaWwgdGhhdCBhbGxvd3MgdXNlcnMgdG8gZGVmaW5lIHRoZSBtYXggZGlzayBzaXplIG9mIHRoZSBkYXRhIGRpcmVjdG9yaWVzIHdoZW4gY2FsY3VsYXRpbmcgdGhyZXNob2xkcyBmb3IKICMgZGlza191c2FnZV9wZXJjZW50YWdlX3dhcm5fdGhyZXNob2xkIGFuZCBkaXNrX3VzYWdlX3BlcmNlbnRhZ2VfZmFpbF90aHJlc2hvbGQsIHNvIGlmIHRoaXMgaXMgZ3JlYXRlciB0aGFuIHplcm8gdGhleQogIyBiZWNvbWUgcGVyY2VudGFnZXMgb2YgYSBmaXhlZCBzaXplIG9uIGRpc2sgaW5zdGVhZCBvZiBwZXJjZW50YWdlcyBvZiB0aGUgcGh5c2ljYWxseSBhdmFpbGFibGUgZGlzayBzaXplLiBUaGlzIHNob3VsZAogIyBiZSB1c2VmdWwgd2hlbiB3ZSBoYXZlIGEgbGFyZ2UgZGlzayBhbmQgd2Ugb25seSB3YW50IHRvIHVzZSBhIHBhcnQgb2YgaXQgZm9yIENhc3NhbmRyYSdzIGRhdGEgZGlyZWN0b3JpZXMuCkBAIC0xNzg2LDExICsxOTE1LDMwIEBACiAjIERlZmF1bHRzIHRvIG51bGwgdG8gZGlzYWJsZSBhbmQgdXNlIHRoZSBwaHlzaWNhbGx5IGF2YWlsYWJsZSBkaXNrIHNpemUgb2YgZGF0YSBkaXJlY3RvcmllcyBkdXJpbmcgY2FsY3VsYXRpb25zLgogIyBNaW4gdW5pdDogQgogIyBkYXRhX2Rpc2tfdXNhZ2VfbWF4X2Rpc2tfc2l6ZToKKyMKICMgR3VhcmRyYWlsIHRvIHdhcm4gb3IgZmFpbCB3aGVuIHRoZSBtaW5pbXVtIHJlcGxpY2F0aW9uIGZhY3RvciBpcyBsZXNzZXIgdGhhbiB0aHJlc2hvbGQuCiAjIFRoaXMgd291bGQgYWxzbyBhcHBseSB0byBzeXN0ZW0ga2V5c3BhY2VzLgogIyBTdWdnZXN0ZWQgdmFsdWUgZm9yIHVzZSBpbiBwcm9kdWN0aW9uOiAyIG9yIGhpZ2hlcgogIyBtaW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl93YXJuX3RocmVzaG9sZDogLTEKICMgbWluaW11bV9yZXBsaWNhdGlvbl9mYWN0b3JfZmFpbF90aHJlc2hvbGQ6IC0xCisjCisjIEd1YXJkcmFpbCB0byB3YXJuIG9yIGZhaWwgd2hlbiB0aGUgbWF4aW11bSByZXBsaWNhdGlvbiBmYWN0b3IgaXMgZ3JlYXRlciB0aGFuIHRocmVzaG9sZC4KKyMgVGhpcyB3b3VsZCBhbHNvIGFwcGx5IHRvIHN5c3RlbSBrZXlzcGFjZXMuCisjIG1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX3dhcm5fdGhyZXNob2xkOiAtMQorIyBtYXhpbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZDogLTEKKworIyBHdWFyZHJhaWwgdG8gZW5hYmxlIGEgQ1JFQVRFIG9yIEFMVEVSIFRBQkxFIHN0YXRlbWVudCB3aGVuIGRlZmF1bHRfdGltZV90b19saXZlIGlzIHNldCB0byAwCisjIGFuZCB0aGUgdGFibGUgaXMgdXNpbmcgVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSBjb21wYWN0aW9uIG9yIGEgc3ViY2xhc3Mgb2YgaXQuCisjIEl0IGlzIHN1c3BpY2lvdXMgdG8gdXNlIGRlZmF1bHRfdGltZV90b19saXZlIHNldCB0byAwIHdpdGggc3VjaCBjb21wYWN0aW9uIHN0cmF0ZWd5LgorIyBQbGVhc2Uga2VlcCBpbiBtaW5kIHRoYXQgZGF0YSB3aWxsIG5vdCBzdGFydCB0byBhdXRvbWF0aWNhbGx5IGV4cGlyZSBhZnRlciB0aGV5IGFyZSBvbGRlciB0aGFuCisjIGEgcmVzcGVjdGl2ZSBjb21wYWN0aW9uIHdpbmRvdyB1bml0IG9mIGEgY2VydGFpbiBzaXplLiBQbGVhc2Ugc2V0IFRUTCBmb3IgeW91ciBJTlNFUlQgb3IgVVBEQVRFCisjIHN0YXRlbWVudHMgaWYgeW91IGV4cGVjdCBkYXRhIHRvIGJlIGV4cGlyZWQgYXMgdGFibGUgc2V0dGluZ3Mgd2lsbCBub3QgZG8gaXQuCisjIERlZmF1bHRzIHRvIHRydWUuIElmIHNldCB0byBmYWxzZSwgc3VjaCBzdGF0ZW1lbnRzIGZhaWwgYW5kIHplcm9fdHRsX29uX3R3Y3Nfd2FybmVkIGZsYWcgaXMgaXJyZWxldmFudC4KKyN6ZXJvX3R0bF9vbl90d2NzX2VuYWJsZWQ6IHRydWUKKyMgR3VhcmRyYWlsIHRvIHdhcm4gYSB1c2VyIHVwb24gZXhlY3V0aW5nIENSRUFURSBvciBBTFRFUiBUQUJMRSBzdGF0ZW1lbnQgd2hlbiBkZWZhdWx0X3RpbWVfdG9fbGl2ZSBpcyBzZXQgdG8gMAorIyBhbmQgdGhlIHRhYmxlIGlzIHVzaW5nIFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kgY29tcGFjdGlvbiBvciBhIHN1YmNsYXNzIG9mIGl0LiBEZWZhdWx0cyB0byB0cnVlLgorIyBpZiB6ZXJvX3R0bF9vbl90d2NzX2VuYWJsZWQgaXMgc2V0IHRvIGZhbHNlLCB0aGlzIHByb3BlcnR5IGlzIGlycmVsZXZhbnQgYXMgc3VjaCBzdGF0ZW1lbnRzIHdpbGwgZmFpbC4KKyN6ZXJvX3R0bF9vbl90d2NzX3dhcm5lZDogdHJ1ZQogCiAjIFN0YXJ0dXAgQ2hlY2tzIGFyZSBleGVjdXRlZCBhcyBwYXJ0IG9mIENhc3NhbmRyYSBzdGFydHVwIHByb2Nlc3MsIG5vdCBhbGwgb2YgdGhlbQogIyBhcmUgY29uZmlndXJhYmxlIChzbyB5b3UgY2FuIGRpc2FibGUgdGhlbSkgYnV0IHRoZXNlIHdoaWNoIGFyZSBlbnVtZXJhdGVkIGJlbGxvdy4KZGlmZiAtLWdpdCBhL2NvbmYvY3Fsc2hyYy5zYW1wbGUgYi9jb25mL2NxbHNocmMuc2FtcGxlCmluZGV4IDQ4NzhiNTguLjU2MDExZjQgMTAwNjQ0Ci0tLSBhL2NvbmYvY3Fsc2hyYy5zYW1wbGUKKysrIGIvY29uZi9jcWxzaHJjLnNhbXBsZQpAQCAtMTUsNyArMTUsNyBAQAogOyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiA7IHVuZGVyIHRoZSBMaWNlbnNlLgogOwotOyBTYW1wbGUgfi8uY3Fsc2hyYyBmaWxlLgorOyBTYW1wbGUgfi8uY2Fzc2FuZHJhL2NxbHNocmMgZmlsZS4KIAogW2F1dGhlbnRpY2F0aW9uXQogOzsgSWYgQ2Fzc2FuZHJhIGhhcyBhdXRoIGVuYWJsZWQsIGZpbGwgb3V0IHRoZXNlIG9wdGlvbnMKQEAgLTIzLDcgKzIzLDYgQEAKIDsgY3JlZGVudGlhbHMgPSB+Ly5jYXNzYW5kcmEvY3JlZGVudGlhbHMKIDsga2V5c3BhY2UgPSBrczEKIAotCiBbYXV0aF9wcm92aWRlcl0KIDs7IHlvdSBjYW4gc3BlY2lmeSBhbnkgYXV0aCBwcm92aWRlciBmb3VuZCBpbiB5b3VyIHB5dGhvbiBlbnZpcm9ubWVudAogOzsgbW9kdWxlIGFuZCBjbGFzcyB3aWxsIGJlIHVzZWQgdG8gZHluYW1pY2FsbHkgbG9hZCB0aGUgY2xhc3MKQEAgLTMzLDYgKzMyLDEwIEBACiA7IGNsYXNzbmFtZSA9IFBsYWluVGV4dEF1dGhQcm92aWRlcgogOyB1c2VybmFtZSA9IHVzZXIxCiAKK1twcm90b2NvbF0KKzs7IFNwZWNpZnkgYSBzcGVjaWZpYyBwcm90Y29sIHZlcnNpb24gb3RoZXJ3aXNlIHRoZSBjbGllbnQgd2lsbCBkZWZhdWx0IGFuZCBkb3duZ3JhZGUgYXMgbmVjZXNzYXJ5Cis7IHZlcnNpb24gPSBOb25lCisKIFt1aV0KIDs7IFdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgcXVlcnkgcmVzdWx0cyB3aXRoIGNvbG9ycwogOyBjb2xvciA9IG9uCkBAIC0xNTMsOSArMTU2LDggQEAKIDsgYm9vbHN0eWxlID0gVHJ1ZSxGYWxzZQogCiA7OyBUaGUgbnVtYmVyIG9mIGNoaWxkIHdvcmtlciBwcm9jZXNzZXMgdG8gY3JlYXRlIGZvcgotOzsgQ09QWSB0YXNrcy4gIERlZmF1bHRzIHRvIGEgbWF4IG9mIDQgZm9yIENPUFkgRlJPTSBhbmQgMTYKLTs7IGZvciBDT1BZIFRPLiAgSG93ZXZlciwgYXQgbW9zdCAobnVtX2NvcmVzIC0gMSkgcHJvY2Vzc2VzCi07OyB3aWxsIGJlIGNyZWF0ZWQuCis7OyBDT1BZIHRhc2tzLiAgRGVmYXVsdHMgdG8gMTYgZm9yIGBDT1BZYCB0YXNrcy4KKzs7IEhvd2V2ZXIsIGF0IG1vc3QgKG51bV9jb3JlcyAtIDEpIHByb2Nlc3NlcyB3aWxsIGJlIGNyZWF0ZWQuCiA7IG51bXByb2Nlc3NlcyA9CiAKIDs7IFRoZSBtYXhpbXVtIG51bWJlciBvZiBmYWlsZWQgYXR0ZW1wdHMgdG8gZmV0Y2ggYSByYW5nZSBvZiBkYXRhICh3aGVuIHVzaW5nCmRpZmYgLS1naXQgYS9jb25mL2p2bS1zZXJ2ZXIub3B0aW9ucyBiL2NvbmYvanZtLXNlcnZlci5vcHRpb25zCmluZGV4IDQ2OTY3ZjQuLmE2MzllZTUgMTAwNjQ0Ci0tLSBhL2NvbmYvanZtLXNlcnZlci5vcHRpb25zCisrKyBiL2NvbmYvanZtLXNlcnZlci5vcHRpb25zCkBAIC0xMDgsOSArMTA4LDYgQEAKICMgdHJhbnNwYXJlbnQgaHVnZXBhZ2UgYWxsb2NhdGlvbiBtb3JlIGVmZmVjdGl2ZS4KIC1YWDorQWx3YXlzUHJlVG91Y2gKIAotIyBEaXNhYmxlIGJpYXNlZCBsb2NraW5nIGFzIGl0IGRvZXMgbm90IGJlbmVmaXQgQ2Fzc2FuZHJhLgotLVhYOi1Vc2VCaWFzZWRMb2NraW5nCi0KICMgRW5hYmxlIHRocmVhZC1sb2NhbCBhbGxvY2F0aW9uIGJsb2NrcyBhbmQgYWxsb3cgdGhlIEpWTSB0byBhdXRvbWF0aWNhbGx5CiAjIHJlc2l6ZSB0aGVtIGF0IHJ1bnRpbWUuCiAtWFg6K1VzZVRMQUIKZGlmZiAtLWdpdCBhL2NvbmYvanZtMTEtc2VydmVyLm9wdGlvbnMgYi9jb25mL2p2bTExLXNlcnZlci5vcHRpb25zCmluZGV4IDFmYzM1MDMuLjVmZDFmMjYgMTAwNjQ0Ci0tLSBhL2NvbmYvanZtMTEtc2VydmVyLm9wdGlvbnMKKysrIGIvY29uZi9qdm0xMS1zZXJ2ZXIub3B0aW9ucwpAQCAtNCw2ICs0LDE1IEBACiAjIFNlZSBqdm0tc2VydmVyLm9wdGlvbnMuIFRoaXMgZmlsZSBpcyBzcGVjaWZpYyBmb3IgSmF2YSAxMSBhbmQgbmV3ZXIuICAgICMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBHRU5FUkFMIEpWTSBTRVRUSU5HUyAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBEaXNhYmxlIGJpYXNlZCBsb2NraW5nIGFzIGl0IGRvZXMgbm90IGJlbmVmaXQgQ2Fzc2FuZHJhLgorLVhYOi1Vc2VCaWFzZWRMb2NraW5nCisKKwogIyMjIyMjIyMjIyMjIyMjIyMKICMgIEdDIFNFVFRJTkdTICAjCiAjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTEsNDEgKzIwLDQxIEBACiAKIAogIyMjIENNUyBTZXR0aW5ncwotLVhYOitVc2VDb25jTWFya1N3ZWVwR0MKLS1YWDorQ01TUGFyYWxsZWxSZW1hcmtFbmFibGVkCi0tWFg6U3Vydml2b3JSYXRpbz04Ci0tWFg6TWF4VGVudXJpbmdUaHJlc2hvbGQ9MQotLVhYOkNNU0luaXRpYXRpbmdPY2N1cGFuY3lGcmFjdGlvbj03NQotLVhYOitVc2VDTVNJbml0aWF0aW5nT2NjdXBhbmN5T25seQotLVhYOkNNU1dhaXREdXJhdGlvbj0xMDAwMAotLVhYOitDTVNQYXJhbGxlbEluaXRpYWxNYXJrRW5hYmxlZAotLVhYOitDTVNFZGVuQ2h1bmtzUmVjb3JkQWx3YXlzCisjIy1YWDorVXNlQ29uY01hcmtTd2VlcEdDCisjIy1YWDorQ01TUGFyYWxsZWxSZW1hcmtFbmFibGVkCisjIy1YWDpTdXJ2aXZvclJhdGlvPTgKKyMjLVhYOk1heFRlbnVyaW5nVGhyZXNob2xkPTEKKyMjLVhYOkNNU0luaXRpYXRpbmdPY2N1cGFuY3lGcmFjdGlvbj03NQorIyMtWFg6K1VzZUNNU0luaXRpYXRpbmdPY2N1cGFuY3lPbmx5CisjIy1YWDpDTVNXYWl0RHVyYXRpb249MTAwMDAKKyMjLVhYOitDTVNQYXJhbGxlbEluaXRpYWxNYXJrRW5hYmxlZAorIyMtWFg6K0NNU0VkZW5DaHVua3NSZWNvcmRBbHdheXMKICMjIHNvbWUgSlZNcyB3aWxsIGZpbGwgdXAgdGhlaXIgaGVhcCB3aGVuIGFjY2Vzc2VkIHZpYSBKTVgsIHNlZSBDQVNTQU5EUkEtNjU0MQotLVhYOitDTVNDbGFzc1VubG9hZGluZ0VuYWJsZWQKKyMjLVhYOitDTVNDbGFzc1VubG9hZGluZ0VuYWJsZWQKIAogCiAKICMjIyBHMSBTZXR0aW5ncwogIyMgVXNlIHRoZSBIb3RzcG90IGdhcmJhZ2UtZmlyc3QgY29sbGVjdG9yLgotIy1YWDorVXNlRzFHQwotIy1YWDorUGFyYWxsZWxSZWZQcm9jRW5hYmxlZAotIy1YWDpNYXhUZW51cmluZ1RocmVzaG9sZD0xCi0jLVhYOkcxSGVhcFJlZ2lvblNpemU9MTZtCistWFg6K1VzZUcxR0MKKy1YWDorUGFyYWxsZWxSZWZQcm9jRW5hYmxlZAorLVhYOk1heFRlbnVyaW5nVGhyZXNob2xkPTEKKy1YWDpHMUhlYXBSZWdpb25TaXplPTE2bQogCiAjCiAjIyBIYXZlIHRoZSBKVk0gZG8gbGVzcyByZW1lbWJlcmVkIHNldCB3b3JrIGR1cmluZyBTVFcsIGluc3RlYWQKICMjIHByZWZlcnJpbmcgY29uY3VycmVudCBHQy4gUmVkdWNlcyBwOTkuOSBsYXRlbmN5LgotIy1YWDpHMVJTZXRVcGRhdGluZ1BhdXNlVGltZVBlcmNlbnQ9NQorLVhYOkcxUlNldFVwZGF0aW5nUGF1c2VUaW1lUGVyY2VudD01CiAjCiAjIyBNYWluIEcxR0MgdHVuYWJsZTogbG93ZXJpbmcgdGhlIHBhdXNlIHRhcmdldCB3aWxsIGxvd2VyIHRocm91Z2hwdXQgYW5kIHZpc2UgdmVyc2EuCiAjIyAyMDBtcyBpcyB0aGUgSlZNIGRlZmF1bHQgYW5kIGxvd2VzdCB2aWFibGUgc2V0dGluZwogIyMgMTAwMG1zIGluY3JlYXNlcyB0aHJvdWdocHV0LiBLZWVwIGl0IHNtYWxsZXIgdGhhbiB0aGUgdGltZW91dHMgaW4gY2Fzc2FuZHJhLnlhbWwuCi0jLVhYOk1heEdDUGF1c2VNaWxsaXM9MzAwCistWFg6TWF4R0NQYXVzZU1pbGxpcz0zMDAKIAogIyMgT3B0aW9uYWwgRzEgU2V0dGluZ3MKICMgU2F2ZSBDUFUgdGltZSBvbiBsYXJnZSAoPj0gMTZHQikgaGVhcHMgYnkgZGVsYXlpbmcgcmVnaW9uIHNjYW5uaW5nCiAjIHVudGlsIHRoZSBoZWFwIGlzIDcwJSBmdWxsLiBUaGUgZGVmYXVsdCBpbiBIb3RzcG90IDh1NDAgaXMgNDAlLgotIy1YWDpJbml0aWF0aW5nSGVhcE9jY3VwYW5jeVBlcmNlbnQ9NzAKKy1YWDpJbml0aWF0aW5nSGVhcE9jY3VwYW5jeVBlcmNlbnQ9NzAKIAogIyBGb3Igc3lzdGVtcyB3aXRoID4gOCBjb3JlcywgdGhlIGRlZmF1bHQgUGFyYWxsZWxHQ1RocmVhZHMgaXMgNS84IHRoZSBudW1iZXIgb2YgbG9naWNhbCBjb3Jlcy4KICMgT3RoZXJ3aXNlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgY29yZXMgd2hlbiA4IG9yIGxlc3MuCkBAIC02MSw2ICs3MCw3IEBACiAtRGpkay5hdHRhY2guYWxsb3dBdHRhY2hTZWxmPXRydWUKIC0tYWRkLWV4cG9ydHMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5taXNjPUFMTC1VTk5BTUVECiAtLWFkZC1leHBvcnRzIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwucmVmPUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwudXRpbD1BTEwtVU5OQU1FRAogLS1hZGQtZXhwb3J0cyBqYXZhLmJhc2Uvc3VuLm5pby5jaD1BTEwtVU5OQU1FRAogLS1hZGQtZXhwb3J0cyBqYXZhLm1hbmFnZW1lbnQucm1pL2NvbS5zdW4uam14LnJlbW90ZS5pbnRlcm5hbC5ybWk9QUxMLVVOTkFNRUQKIC0tYWRkLWV4cG9ydHMgamF2YS5ybWkvc3VuLnJtaS5yZWdpc3RyeT1BTEwtVU5OQU1FRApkaWZmIC0tZ2l0IGEvY29uZi9qdm0xNy1jbGllbnRzLm9wdGlvbnMgYi9jb25mL2p2bTE3LWNsaWVudHMub3B0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDA2ZmVlCi0tLSAvZGV2L251bGwKKysrIGIvY29uZi9qdm0xNy1jbGllbnRzLm9wdGlvbnMKQEAgLTAsMCArMSw2OSBAQAorIworIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAgICAgICAgICAgICAgICAgICAgICAgIGp2bTE3LWNsaWVudHMub3B0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyBTZWUganZtLWNsaWVudHMub3B0aW9ucy4gVGhpcyBmaWxlIGlzIHNwZWNpZmljIGZvciBKYXZhIDE3IGFuZCBuZXdlci4gICAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgSlBNUyBTRVRUSU5HUyAgIworIyMjIyMjIyMjIyMjIyMjIyMjIworCistRGpkay5hdHRhY2guYWxsb3dBdHRhY2hTZWxmPXRydWUKKy0tYWRkLWV4cG9ydHMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5taXNjPUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwucmVmPUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGphdmEuYmFzZS9zdW4ubmlvLmNoPUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGphdmEubWFuYWdlbWVudC5ybWkvY29tLnN1bi5qbXgucmVtb3RlLmludGVybmFsLnJtaT1BTEwtVU5OQU1FRAorLS1hZGQtZXhwb3J0cyBqYXZhLnJtaS9zdW4ucm1pLnJlZ2lzdHJ5PUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGphdmEucm1pL3N1bi5ybWkuc2VydmVyPUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGphdmEuc3FsL2phdmEuc3FsPUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGpkay51bnN1cHBvcnRlZC9zdW4ubWlzYz1BTEwtVU5OQU1FRAorLS1hZGQtZXhwb3J0cyBqZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5maWxlPUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGpkay5hdHRhY2gvc3VuLnRvb2xzLmF0dGFjaD1BTEwtVU5OQU1FRAorCisKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLmxhbmcubW9kdWxlPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamRrLmludGVybmFsLmxvYWRlcj1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5yZWY9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwucmVmbGVjdD1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5tYXRoPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamRrLmludGVybmFsLm1vZHVsZT1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC51dGlsLmphcj1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamRrLm1hbmFnZW1lbnQvY29tLnN1bi5tYW5hZ2VtZW50LmludGVybmFsPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2Uvc3VuLm5pby5jaD1BTEwtVU5OQU1FRAorIyB0byBiZSBhZGRyZXNzZWQgaW4gQ0FTU0FORFJBLTE3ODUwCistLWFkZC1vcGVucyBqYXZhLmJhc2Uvc3VuLm5pby5jaD1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEuaW89QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLm5pbz1BTEwtVU5OQU1FRAorIyB0byBiZSBhZGRyZXNzZWQgZHVyaW5nIGphbW0gbWFpbnRlbmFuY2UKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLnV0aWwuY29uY3VycmVudD1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEudXRpbD1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEudXRpbC5jb25jdXJyZW50LmF0b21pYz1BTEwtVU5OQU1FRAorIyBqYW1tIGFuZCB0aGUgaW4tanZtIHRlc3RzLi4uCistLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5sYW5nPUFMTC1VTk5BTUVECisjIGphbW0KKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLm1hdGg9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5sYW5nPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5sYW5nLnJlZmxlY3Q9QUxMLVVOTkFNRUQKKyNqYW1tIHBvc3QgQ0FTU0FORFJBLTE3MTk5CistLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5uZXQ9QUxMLVVOTkFNRUQKKworIyBUaGUgbmV3bGluZSBpbiB0aGUgZW5kIG9mIGZpbGUgaXMgaW50ZW50aW9uYWwKZGlmZiAtLWdpdCBhL2NvbmYvanZtMTctc2VydmVyLm9wdGlvbnMgYi9jb25mL2p2bTE3LXNlcnZlci5vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YTcwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25mL2p2bTE3LXNlcnZlci5vcHRpb25zCkBAIC0wLDAgKzEsMTM0IEBACisjCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgICAgICAgICAgICAgICAgICAgICAgICAganZtMTctc2VydmVyLm9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisjIFNlZSBqdm0tc2VydmVyLm9wdGlvbnMuIFRoaXMgZmlsZSBpcyBzcGVjaWZpYyBmb3IgSmF2YSAxNyBhbmQgbmV3ZXIuICAgICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIworIyAgR0MgU0VUVElOR1MgICMKKyMjIyMjIyMjIyMjIyMjIyMjCisKKworCisjIyMgRzEgU2V0dGluZ3MKKyMjIFVzZSB0aGUgSG90c3BvdCBnYXJiYWdlLWZpcnN0IGNvbGxlY3Rvci4KKy1YWDorVXNlRzFHQworLVhYOitQYXJhbGxlbFJlZlByb2NFbmFibGVkCistWFg6TWF4VGVudXJpbmdUaHJlc2hvbGQ9MQorLVhYOkcxSGVhcFJlZ2lvblNpemU9MTZtCisKKyMKKyMjIEhhdmUgdGhlIEpWTSBkbyBsZXNzIHJlbWVtYmVyZWQgc2V0IHdvcmsgZHVyaW5nIFNUVywgaW5zdGVhZAorIyMgcHJlZmVycmluZyBjb25jdXJyZW50IEdDLiBSZWR1Y2VzIHA5OS45IGxhdGVuY3kuCistWFg6RzFSU2V0VXBkYXRpbmdQYXVzZVRpbWVQZXJjZW50PTUKKyMKKyMjIE1haW4gRzFHQyB0dW5hYmxlOiBsb3dlcmluZyB0aGUgcGF1c2UgdGFyZ2V0IHdpbGwgbG93ZXIgdGhyb3VnaHB1dCBhbmQgdmlzZSB2ZXJzYS4KKyMjIDIwMG1zIGlzIHRoZSBKVk0gZGVmYXVsdCBhbmQgbG93ZXN0IHZpYWJsZSBzZXR0aW5nCisjIyAxMDAwbXMgaW5jcmVhc2VzIHRocm91Z2hwdXQuIEtlZXAgaXQgc21hbGxlciB0aGFuIHRoZSB0aW1lb3V0cyBpbiBjYXNzYW5kcmEueWFtbC4KKy1YWDpNYXhHQ1BhdXNlTWlsbGlzPTMwMAorCisjIyBPcHRpb25hbCBHMSBTZXR0aW5ncworIyBTYXZlIENQVSB0aW1lIG9uIGxhcmdlICg+PSAxNkdCKSBoZWFwcyBieSBkZWxheWluZyByZWdpb24gc2Nhbm5pbmcKKyMgdW50aWwgdGhlIGhlYXAgaXMgNzAlIGZ1bGwuIFRoZSBkZWZhdWx0IGluIEhvdHNwb3QgOHU0MCBpcyA0MCUuCistWFg6SW5pdGlhdGluZ0hlYXBPY2N1cGFuY3lQZXJjZW50PTcwCisKKyMgRm9yIHN5c3RlbXMgd2l0aCA+IDggY29yZXMsIHRoZSBkZWZhdWx0IFBhcmFsbGVsR0NUaHJlYWRzIGlzIDUvOCB0aGUgbnVtYmVyIG9mIGxvZ2ljYWwgY29yZXMuCisjIE90aGVyd2lzZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNvcmVzIHdoZW4gOCBvciBsZXNzLgorIyBNYWNoaW5lcyB3aXRoID4gMTAgY29yZXMgc2hvdWxkIHRyeSBzZXR0aW5nIHRoZXNlIHRvIDw9IGZ1bGwgY29yZXMuCisjLVhYOlBhcmFsbGVsR0NUaHJlYWRzPTE2CisjIEJ5IGRlZmF1bHQsIENvbmNHQ1RocmVhZHMgaXMgMS80IG9mIFBhcmFsbGVsR0NUaHJlYWRzLgorIyBTZXR0aW5nIGJvdGggdG8gdGhlIHNhbWUgdmFsdWUgY2FuIHJlZHVjZSBTVFcgZHVyYXRpb25zLgorIy1YWDpDb25jR0NUaHJlYWRzPTE2CisKKworIyMjIEpQTVMKKworLURqZGsuYXR0YWNoLmFsbG93QXR0YWNoU2VsZj10cnVlCistLWFkZC1leHBvcnRzIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwubWlzYz1BTEwtVU5OQU1FRAorLS1hZGQtZXhwb3J0cyBqYXZhLmJhc2UvamRrLmludGVybmFsLnJlZj1BTEwtVU5OQU1FRAorIyBodHRwczovL2Nocm9uaWNsZS5zb2Z0d2FyZS9jaHJvbmljbGUtc3VwcG9ydC1qYXZhLTE3LworLS1hZGQtZXhwb3J0cyBqYXZhLmJhc2Uvc3VuLm5pby5jaD1BTEwtVU5OQU1FRAorLS1hZGQtZXhwb3J0cyBqYXZhLm1hbmFnZW1lbnQucm1pL2NvbS5zdW4uam14LnJlbW90ZS5pbnRlcm5hbC5ybWk9QUxMLVVOTkFNRUQKKy0tYWRkLWV4cG9ydHMgamF2YS5ybWkvc3VuLnJtaS5yZWdpc3RyeT1BTEwtVU5OQU1FRAorLS1hZGQtZXhwb3J0cyBqYXZhLnJtaS9zdW4ucm1pLnNlcnZlcj1BTEwtVU5OQU1FRAorLS1hZGQtZXhwb3J0cyBqYXZhLnNxbC9qYXZhLnNxbD1BTEwtVU5OQU1FRAorCisjY2hyb25pY2xlLCBBdWRpdExvZyBodHRwczovL2Nocm9uaWNsZS5zb2Z0d2FyZS9jaHJvbmljbGUtc3VwcG9ydC1qYXZhLTE3LworLS1hZGQtZXhwb3J0cyBqYXZhLmJhc2UvamF2YS5sYW5nLnJlZj1BTEwtVU5OQU1FRAorLS1hZGQtZXhwb3J0cyBqYXZhLmJhc2UvamRrLmludGVybmFsLnV0aWw9QUxMLVVOTkFNRUQKKy0tYWRkLWV4cG9ydHMgamRrLnVuc3VwcG9ydGVkL3N1bi5taXNjPUFMTC1VTk5BTUVECistLWFkZC1leHBvcnRzIGpkay5jb21waWxlci9jb20uc3VuLnRvb2xzLmphdmFjLmZpbGU9QUxMLVVOTkFNRUQKKworLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubGFuZy5tb2R1bGU9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwubG9hZGVyPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamRrLmludGVybmFsLnJlZj1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2pkay5pbnRlcm5hbC5yZWZsZWN0PUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamRrLmludGVybmFsLm1hdGg9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qZGsuaW50ZXJuYWwubW9kdWxlPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqYXZhLmJhc2UvamRrLmludGVybmFsLnV0aWwuamFyPUFMTC1VTk5BTUVECistLWFkZC1vcGVucyBqZGsubWFuYWdlbWVudC9jb20uc3VuLm1hbmFnZW1lbnQuaW50ZXJuYWw9QUxMLVVOTkFNRUQKKworI3RvIGJlIGFkZHJlc3NlZCBpbiBDQVNTQU5EUkEtMTc4NTAKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9zdW4ubmlvLmNoPUFMTC1VTk5BTUVECisjIGh0dHBzOi8vY2hyb25pY2xlLnNvZnR3YXJlL2Nocm9uaWNsZS1zdXBwb3J0LWphdmEtMTcvCistLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5pbz1BTEwtVU5OQU1FRAorLS1hZGQtb3BlbnMgamF2YS5iYXNlL2phdmEubmlvPUFMTC1VTk5BTUVECisjdG8gYmUgYWRkcmVzc2VkIGR1cmluZyBqYW1tIG1haW50ZW5hbmNlCistLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS51dGlsLmNvbmN1cnJlbnQ9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLnV0aWw9QUxMLVVOTkFNRUQKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWM9QUxMLVVOTkFNRUQKKyMgaHR0cHM6Ly9jaHJvbmljbGUuc29mdHdhcmUvY2hyb25pY2xlLXN1cHBvcnQtamF2YS0xNy8gZXhwbGFpbnMgYWxzbyAtLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS51dGlsPUFMTC1VTk5BTUVELCBmdXJ0aGVyIHRvIGphbW0KKyMgbWFueSBjcWxzaCB0ZXN0cyBmYWlsIGlmIHdlIGRvIG5vdCBvcGVuIHRoZSBiZWxvdyBvbmUgLSBqYW1tIGFuZCBhdCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi5nZXRNb2RpZmllcnNGaWVsZChWZXJiLmphdmE6Mzg4KQorIyBpbi1qdm0gdGVzdHMKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLmxhbmc9QUxMLVVOTkFNRUQKKyNqYW1tCistLWFkZC1vcGVucyBqYXZhLmJhc2UvamF2YS5tYXRoPUFMTC1VTk5BTUVECisjaW4tanZtIHRlc3RzPyBwbHVzICMgaHR0cHM6Ly9jaHJvbmljbGUuc29mdHdhcmUvY2hyb25pY2xlLXN1cHBvcnQtamF2YS0xNy8KKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLmxhbmcucmVmbGVjdD1BTEwtVU5OQU1FRAorI2phbW0gcG9zdCBDQVNTQU5EUkEtMTcxOTkKKy0tYWRkLW9wZW5zIGphdmEuYmFzZS9qYXZhLm5ldD1BTEwtVU5OQU1FRAorCisjIyMgR0MgbG9nZ2luZyBvcHRpb25zIC0tIHVuY29tbWVudCB0byBlbmFibGUKKworIyBKYXZhIDExIChhbmQgbmV3ZXIpIEdDIGxvZ2dpbmcgb3B0aW9uczoKKyMgU2VlIGRlc2NyaXB0aW9uIG9mIGh0dHBzOi8vYnVncy5vcGVuamRrLmphdmEubmV0L2Jyb3dzZS9KREstODA0NjE0OCBmb3IgZGV0YWlscyBhYm91dCB0aGUgc3ludGF4CisjIFRoZSBmb2xsb3dpbmcgaXMgdGhlIGVxdWl2YWxlbnQgdG8gLVhYOitQcmludEdDRGV0YWlscyAtWFg6K1VzZUdDTG9nRmlsZVJvdGF0aW9uIC1YWDpOdW1iZXJPZkdDTG9nRmlsZXM9MTAgLVhYOkdDTG9nRmlsZVNpemU9MTBNCisjLVhsb2c6Z2M9aW5mbyxoZWFwKj10cmFjZSxhZ2UqPWRlYnVnLHNhZmVwb2ludD1pbmZvLHByb21vdGlvbio9dHJhY2U6ZmlsZT0vdmFyL2xvZy9jYXNzYW5kcmEvZ2MubG9nOnRpbWUsdXB0aW1lLHBpZCx0aWQsbGV2ZWw6ZmlsZWNvdW50PTEwLGZpbGVzaXplPTEwNDg1NzYwCisKKyMgTm90ZXMgZm9yIEphdmEgOCBtaWdyYXRpb246CisjCisjIC1YWDorUHJpbnRHQ0RldGFpbHMgICAgICAgICAgICAgICAgICAgbWFwcyB0byAtWGxvZzpnYyo6Li4uIC0gaS5lLiBhZGQgYSAnKicgYWZ0ZXIgImdjIgorIyAtWFg6K1ByaW50R0NEYXRlU3RhbXBzICAgICAgICAgICAgICAgIG1hcHMgdG8gZGVjb3JhdG9yICd0aW1lJworIworIyAtWFg6K1ByaW50SGVhcEF0R0MgICAgICAgICAgICAgICAgICAgIG1hcHMgdG8gJ2hlYXAnIHdpdGggbGV2ZWwgJ3RyYWNlJworIyAtWFg6K1ByaW50VGVudXJpbmdEaXN0cmlidXRpb24gICAgICAgIG1hcHMgdG8gJ2FnZScgd2l0aCBsZXZlbCAnZGVidWcnCisjIC1YWDorUHJpbnRHQ0FwcGxpY2F0aW9uU3RvcHBlZFRpbWUgICAgbWFwcyB0byAnc2FmZXBvaW50JyB3aXRoIGxldmVsICdpbmZvJworIyAtWFg6K1ByaW50UHJvbW90aW9uRmFpbHVyZSAgICAgICAgICAgIG1hcHMgdG8gJ3Byb21vdGlvbicgd2l0aCBsZXZlbCAndHJhY2UnCisjIC1YWDpQcmludEZMU1N0YXRpc3RpY3M9MSAgICAgICAgICAgICAgbWFwcyB0byAnZnJlZWxpc3QnIHdpdGggbGV2ZWwgJ3RyYWNlJworCisjIyMgTmV0dHkgT3B0aW9ucworCisjIE9uIEphdmEgPj0gOSBOZXR0eSByZXF1aXJlcyB0aGUgaW8ubmV0dHkudHJ5UmVmbGVjdGlvblNldEFjY2Vzc2libGUgc3lzdGVtIHByb3BlcnR5IHRvIGJlIHNldCB0byB0cnVlIHRvIGVuYWJsZQorIyBjcmVhdGlvbiBvZiBkaXJlY3QgYnVmZmVycyB1c2luZyBVbnNhZmUuIFdpdGhvdXQgaXQsIHRoaXMgZmFsbHMgYmFjayB0byBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0IHdoaWNoIGhhcworIyBpbmZlcmlvciBwZXJmb3JtYW5jZSBhbmQgcmlza3MgZXhjZWVkaW5nIE1heERpcmVjdE1lbW9yeQorLURpby5uZXR0eS50cnlSZWZsZWN0aW9uU2V0QWNjZXNzaWJsZT10cnVlCisKKyMgVGhlIG5ld2xpbmUgaW4gdGhlIGVuZCBvZiBmaWxlIGlzIGludGVudGlvbmFsCmRpZmYgLS1naXQgYS9jb25mL2p2bTgtc2VydmVyLm9wdGlvbnMgYi9jb25mL2p2bTgtc2VydmVyLm9wdGlvbnMKaW5kZXggYmE4MDBkYi4uMTQzNmE3ZSAxMDA2NDQKLS0tIGEvY29uZi9qdm04LXNlcnZlci5vcHRpb25zCisrKyBiL2NvbmYvanZtOC1zZXJ2ZXIub3B0aW9ucwpAQCAtMTMsNDUgKzEzLDQ4IEBACiAjIHNlZSBodHRwOi8vdGVjaC5zdG9sc3Zpay5jb20vMjAxMC8wMS9saW51eC1qYXZhLXRocmVhZC1wcmlvcml0aWVzLXdvcmthcm91bmQuaHRtbAogLVhYOlRocmVhZFByaW9yaXR5UG9saWN5PTQyCiAKKyMgRGlzYWJsZSBiaWFzZWQgbG9ja2luZyBhcyBpdCBkb2VzIG5vdCBiZW5lZml0IENhc3NhbmRyYS4KKy1YWDotVXNlQmlhc2VkTG9ja2luZworCiAjIyMjIyMjIyMjIyMjIyMjIwogIyAgR0MgU0VUVElOR1MgICMKICMjIyMjIyMjIyMjIyMjIyMjCiAKICMjIyBDTVMgU2V0dGluZ3MKLS1YWDorVXNlUGFyTmV3R0MKLS1YWDorVXNlQ29uY01hcmtTd2VlcEdDCi0tWFg6K0NNU1BhcmFsbGVsUmVtYXJrRW5hYmxlZAotLVhYOlN1cnZpdm9yUmF0aW89OAotLVhYOk1heFRlbnVyaW5nVGhyZXNob2xkPTEKLS1YWDpDTVNJbml0aWF0aW5nT2NjdXBhbmN5RnJhY3Rpb249NzUKLS1YWDorVXNlQ01TSW5pdGlhdGluZ09jY3VwYW5jeU9ubHkKLS1YWDpDTVNXYWl0RHVyYXRpb249MTAwMDAKLS1YWDorQ01TUGFyYWxsZWxJbml0aWFsTWFya0VuYWJsZWQKLS1YWDorQ01TRWRlbkNodW5rc1JlY29yZEFsd2F5cworIyMtWFg6K1VzZVBhck5ld0dDCisjIy1YWDorVXNlQ29uY01hcmtTd2VlcEdDCisjIy1YWDorQ01TUGFyYWxsZWxSZW1hcmtFbmFibGVkCisjIy1YWDpTdXJ2aXZvclJhdGlvPTgKKyMjLVhYOk1heFRlbnVyaW5nVGhyZXNob2xkPTEKKyMjLVhYOkNNU0luaXRpYXRpbmdPY2N1cGFuY3lGcmFjdGlvbj03NQorIyMtWFg6K1VzZUNNU0luaXRpYXRpbmdPY2N1cGFuY3lPbmx5CisjIy1YWDpDTVNXYWl0RHVyYXRpb249MTAwMDAKKyMjLVhYOitDTVNQYXJhbGxlbEluaXRpYWxNYXJrRW5hYmxlZAorIyMtWFg6K0NNU0VkZW5DaHVua3NSZWNvcmRBbHdheXMKICMjIHNvbWUgSlZNcyB3aWxsIGZpbGwgdXAgdGhlaXIgaGVhcCB3aGVuIGFjY2Vzc2VkIHZpYSBKTVgsIHNlZSBDQVNTQU5EUkEtNjU0MQotLVhYOitDTVNDbGFzc1VubG9hZGluZ0VuYWJsZWQKKyMjLVhYOitDTVNDbGFzc1VubG9hZGluZ0VuYWJsZWQKIAogIyMjIEcxIFNldHRpbmdzCiAjIyBVc2UgdGhlIEhvdHNwb3QgZ2FyYmFnZS1maXJzdCBjb2xsZWN0b3IuCi0jLVhYOitVc2VHMUdDCi0jLVhYOitQYXJhbGxlbFJlZlByb2NFbmFibGVkCi0jLVhYOk1heFRlbnVyaW5nVGhyZXNob2xkPTEKLSMtWFg6RzFIZWFwUmVnaW9uU2l6ZT0xNm0KKy1YWDorVXNlRzFHQworLVhYOitQYXJhbGxlbFJlZlByb2NFbmFibGVkCistWFg6TWF4VGVudXJpbmdUaHJlc2hvbGQ9MQorLVhYOkcxSGVhcFJlZ2lvblNpemU9MTZtCiAKLSMKKwogIyMgSGF2ZSB0aGUgSlZNIGRvIGxlc3MgcmVtZW1iZXJlZCBzZXQgd29yayBkdXJpbmcgU1RXLCBpbnN0ZWFkCiAjIyBwcmVmZXJyaW5nIGNvbmN1cnJlbnQgR0MuIFJlZHVjZXMgcDk5LjkgbGF0ZW5jeS4KLSMtWFg6RzFSU2V0VXBkYXRpbmdQYXVzZVRpbWVQZXJjZW50PTUKLSMKKy1YWDpHMVJTZXRVcGRhdGluZ1BhdXNlVGltZVBlcmNlbnQ9NQorCiAjIyBNYWluIEcxR0MgdHVuYWJsZTogbG93ZXJpbmcgdGhlIHBhdXNlIHRhcmdldCB3aWxsIGxvd2VyIHRocm91Z2hwdXQgYW5kIHZpc2UgdmVyc2EuCiAjIyAyMDBtcyBpcyB0aGUgSlZNIGRlZmF1bHQgYW5kIGxvd2VzdCB2aWFibGUgc2V0dGluZwogIyMgMTAwMG1zIGluY3JlYXNlcyB0aHJvdWdocHV0LiBLZWVwIGl0IHNtYWxsZXIgdGhhbiB0aGUgdGltZW91dHMgaW4gY2Fzc2FuZHJhLnlhbWwuCi0jLVhYOk1heEdDUGF1c2VNaWxsaXM9MzAwCistWFg6TWF4R0NQYXVzZU1pbGxpcz0zMDAKIAogIyMgT3B0aW9uYWwgRzEgU2V0dGluZ3MKICMgU2F2ZSBDUFUgdGltZSBvbiBsYXJnZSAoPj0gMTZHQikgaGVhcHMgYnkgZGVsYXlpbmcgcmVnaW9uIHNjYW5uaW5nCiAjIHVudGlsIHRoZSBoZWFwIGlzIDcwJSBmdWxsLiBUaGUgZGVmYXVsdCBpbiBIb3RzcG90IDh1NDAgaXMgNDAlLgotIy1YWDpJbml0aWF0aW5nSGVhcE9jY3VwYW5jeVBlcmNlbnQ9NzAKKy1YWDpJbml0aWF0aW5nSGVhcE9jY3VwYW5jeVBlcmNlbnQ9NzAKIAogIyBGb3Igc3lzdGVtcyB3aXRoID4gOCBjb3JlcywgdGhlIGRlZmF1bHQgUGFyYWxsZWxHQ1RocmVhZHMgaXMgNS84IHRoZSBudW1iZXIgb2YgbG9naWNhbCBjb3Jlcy4KICMgT3RoZXJ3aXNlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgY29yZXMgd2hlbiA4IG9yIGxlc3MuCmRpZmYgLS1naXQgYS9jb25mL2xvZ2JhY2sueG1sIGIvY29uZi9sb2diYWNrLnhtbAppbmRleCBlOThmZWE0Li4xMDJjZjA2IDEwMDY0NAotLS0gYS9jb25mL2xvZ2JhY2sueG1sCisrKyBiL2NvbmYvbG9nYmFjay54bWwKQEAgLTExMSw2ICsxMTEsMTQgQEAKICAgPGFwcGVuZGVyIG5hbWU9IkxvZ2JhY2tNZXRyaWNzIiBjbGFzcz0iY29tLmNvZGFoYWxlLm1ldHJpY3MubG9nYmFjay5JbnN0cnVtZW50ZWRBcHBlbmRlciIgLz4KICAgIC0tPgogCisgIDwhLS0gVW5jb21tZW50IGJlbG93IGNvbmZpZ3VyYXRpb24gYW5kIGNvcnJlc3BvbmRpbmcgYXBwZW5kZXItcmVmIHRvIGFjdGl2YXRlCisgIGxvZ2dpbmcgaW50byBzeXN0ZW1fdmlld3Muc3lzdGVtX2xvZ3MgdmlydHVhbCB0YWJsZS4gLS0+CisgIDwhLS0gPGFwcGVuZGVyIG5hbWU9IkNRTExPRyIgY2xhc3M9Im9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmxvZ2dpbmcuVmlydHVhbFRhYmxlQXBwZW5kZXIiPgorICAgIDxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuZmlsdGVyLlRocmVzaG9sZEZpbHRlciI+CisgICAgICA8bGV2ZWw+V0FSTjwvbGV2ZWw+CisgICAgPC9maWx0ZXI+CisgIDwvYXBwZW5kZXI+IC0tPgorCiAgIDxyb290IGxldmVsPSJJTkZPIj4KICAgICA8YXBwZW5kZXItcmVmIHJlZj0iU1lTVEVNTE9HIiAvPgogICAgIDxhcHBlbmRlci1yZWYgcmVmPSJTVERPVVQiIC8+CkBAIC0xMTgsNiArMTI2LDkgQEAKICAgICA8IS0tCiAgICAgPGFwcGVuZGVyLXJlZiByZWY9IkxvZ2JhY2tNZXRyaWNzIiAvPgogICAgIC0tPgorICAgIDwhLS0KKyAgICA8YXBwZW5kZXItcmVmIHJlZj0iQ1FMTE9HIi8+CisgICAgLS0+CiAgIDwvcm9vdD4KIAogICA8bG9nZ2VyIG5hbWU9Im9yZy5hcGFjaGUuY2Fzc2FuZHJhIiBsZXZlbD0iREVCVUciLz4KZGlmZiAtLWdpdCBhL2RlYmlhbi9jYXNzYW5kcmEuaW5zdGFsbCBiL2RlYmlhbi9jYXNzYW5kcmEuaW5zdGFsbAppbmRleCBmNTRkMWFkLi5kY2VkNWEyIDEwMDY0NAotLS0gYS9kZWJpYW4vY2Fzc2FuZHJhLmluc3RhbGwKKysrIGIvZGViaWFuL2Nhc3NhbmRyYS5pbnN0YWxsCkBAIC0yNSw2ICsyNSw3IEBACiB0b29scy9iaW4vYXVkaXRsb2d2aWV3ZXIgdXNyL2JpbgogdG9vbHMvYmluL2pteHRvb2wgdXNyL2JpbgogdG9vbHMvYmluL2hhc2hfcGFzc3dvcmQgdXNyL2JpbgordG9vbHMvYmluL3NzdGFibGVwYXJ0aXRpb25zIHVzci9iaW4KIGxpYi8qLmphciB1c3Ivc2hhcmUvY2Fzc2FuZHJhL2xpYgogbGliLyouemlwIHVzci9zaGFyZS9jYXNzYW5kcmEvbGliCiBsaWIvc2lnYXItYmluLyogdXNyL3NoYXJlL2Nhc3NhbmRyYS9saWIvc2lnYXItYmluCmRpZmYgLS1naXQgYS9kZWJpYW4vY2Fzc2FuZHJhLnBvc3RpbnN0IGIvZGViaWFuL2Nhc3NhbmRyYS5wb3N0aW5zdAppbmRleCA3NTJmZjFmLi45NTg4MmUzIDEwMDY0NAotLS0gYS9kZWJpYW4vY2Fzc2FuZHJhLnBvc3RpbnN0CisrKyBiL2RlYmlhbi9jYXNzYW5kcmEucG9zdGluc3QKQEAgLTM3LDYgKzM3LDggQEAKICAgICAgICAgaWYgWyAteiAiJDIiIF07IHRoZW4KICAgICAgICAgICAgIGNob3duIC1SIGNhc3NhbmRyYTogL3Zhci9saWIvY2Fzc2FuZHJhCiAgICAgICAgICAgICBjaG93biAtUiBjYXNzYW5kcmE6IC92YXIvbG9nL2Nhc3NhbmRyYQorICAgICAgICAgICAgY2htb2QgNzUwIC92YXIvbGliL2Nhc3NhbmRyYS8KKyAgICAgICAgICAgIGNobW9kIDc1MCAvdmFyL2xvZy9jYXNzYW5kcmEvCiAgICAgICAgIGZpCiAgICAgICAgIGlmICEgc3lzY3RsIC1wIC9ldGMvc3lzY3RsLmQvY2Fzc2FuZHJhLmNvbmY7IHRoZW4KICAgICAgICAgICAgIGVjaG8gPiYyCmRpZmYgLS1naXQgYS9kZWJpYW4vY2hhbmdlbG9nIGIvZGViaWFuL2NoYW5nZWxvZwppbmRleCAxYmIxZDBkLi5jZGIxYWY5IDEwMDY0NAotLS0gYS9kZWJpYW4vY2hhbmdlbG9nCisrKyBiL2RlYmlhbi9jaGFuZ2Vsb2cKQEAgLTEsNDQgKzEsOCBAQAotY2Fzc2FuZHJhICg0LjEuMykgVU5SRUxFQVNFRDsgdXJnZW5jeT1tZWRpdW0KK2Nhc3NhbmRyYSAoNS4wKSBVTlJFTEVBU0VEOyB1cmdlbmN5PW1lZGl1bQogCiAgICogTmV3IHJlbGVhc2UKIAotIC0tIE1pY2sgU2VtYiBXZXZlciA8bWNrQGFwYWNoZS5vcmc+ICBUaHUsIDI1IE1heSAyMDIzIDE2OjExOjI4ICswMjAwCi0KLWNhc3NhbmRyYSAoNC4xLjIpIHVuc3RhYmxlOyB1cmdlbmN5PW1lZGl1bQotCi0gICogTmV3IHJlbGVhc2UKLQotIC0tIE1pY2sgU2VtYiBXZXZlciA8bWNrQGFwYWNoZS5vcmc+ICBUaHUsIDI1IE1heSAyMDIzIDE2OjExOjI4ICswMjAwCi0KLWNhc3NhbmRyYSAoNC4xLjEpIHVuc3RhYmxlOyB1cmdlbmN5PW1lZGl1bQotCi0gICogTmV3IHJlbGVhc2UKLQotIC0tIFN0ZWZhbiBNaWtsb3NvdmljIDxzbWlrbG9zb3ZpY0BhcGFjaGUub3JnPiAgV2VkLCAxNSBNYXIgMjAyMyAwOTowODo0MCArMDEwMAotCi1jYXNzYW5kcmEgKDQuMS4wKSB1bnN0YWJsZTsgdXJnZW5jeT1tZWRpdW0KLQotICAqIE5ldyByZWxlYXNlCi0KLSAtLSBNaWNrIFNlbWIgV2V2ZXIgPG1ja0BhcGFjaGUub3JnPiAgV2VkLCAwNyBEZWMgMjAyMiAyMTo1MzozMyArMDEwMAotCi1jYXNzYW5kcmEgKDQuMX5yYzEpIHVuc3RhYmxlOyB1cmdlbmN5PW1lZGl1bQotCi0gICogTmV3IHJlbGVhc2UKLQotIC0tIE1pY2sgU2VtYiBXZXZlciA8bWNrQGFwYWNoZS5vcmc+ICBUaHUsIDE3IE5vdiAyMDIyIDExOjMzOjI1ICswMTAwCi0KLWNhc3NhbmRyYSAoNC4xfmJldGExKSB1bnN0YWJsZTsgdXJnZW5jeT1tZWRpdW0KLQotICAqIE5ldyByZWxlYXNlCi0KLSAtLSBNaWNrIFNlbWIgV2V2ZXIgPG1ja0BhcGFjaGUub3JnPiAgVHVlLCAyNyBTZXAgMjAyMiAwMDowODowNyArMDIwMAotCi1jYXNzYW5kcmEgKDQuMX5hbHBoYTEpIHVuc3RhYmxlOyB1cmdlbmN5PW1lZGl1bQotCi0gICogTmV3IHJlbGVhc2UKLQotIC0tIE1pY2sgU2VtYiBXZXZlciA8bWNrQGFwYWNoZS5vcmc+ICBGcmksIDIwIE1heSAyMDIyIDIyOjAyOjUwICswMjAwCisgLS0gTWljayBTZW1iIFdldmVyIDxtY2tAYXBhY2hlLm9yZz4gIFdlZCwgMjEgQXByIDIwMjEgMTk6MjQ6MjggKzAyMDAKIAogY2Fzc2FuZHJhICg0LjB+cmMxKSB1bnN0YWJsZTsgdXJnZW5jeT1tZWRpdW0KIApkaWZmIC0tZ2l0IGEvZG9jL2FudG9yYS55bWwgYi9kb2MvYW50b3JhLnltbAppbmRleCAwOGVkNWUyLi40MDFjYmQ0IDEwMDY0NAotLS0gYS9kb2MvYW50b3JhLnltbAorKysgYi9kb2MvYW50b3JhLnltbApAQCAtMSw2ICsxLDcgQEAKIG5hbWU6IENhc3NhbmRyYQotdmVyc2lvbjogJzQuMScKLWRpc3BsYXlfdmVyc2lvbjogJzQuMScKK3ZlcnNpb246ICd0cnVuaycKK2Rpc3BsYXlfdmVyc2lvbjogJ3RydW5rJworcHJlcmVsZWFzZTogdHJ1ZQogYXNjaWlkb2M6CiAgIGF0dHJpYnV0ZXM6CiAgICAgY2Fzc191cmw6ICdodHRwOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvJwpkaWZmIC0tZ2l0IGEvZG9jL2NxbDMvQ1FMLnRleHRpbGUgYi9kb2MvY3FsMy9DUUwudGV4dGlsZQppbmRleCBkMmE0YjcyLi5jMWNlODVmIDEwMDY0NAotLS0gYS9kb2MvY3FsMy9DUUwudGV4dGlsZQorKysgYi9kb2MvY3FsMy9DUUwudGV4dGlsZQpAQCAtMTgsNyArMTgsNyBAQAogIwogLS0+CiAKLWgxLiBDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UgKENRTCkgdjMuNC42CitoMS4gQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlIChDUUwpIHYzLjQuNwogCiAKIApAQCAtMjUyLDkgKzI1MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAnKCcgPGNvbHVtbi1kZWZpbml0aW9uPiAoICcsJyA8Y29sdW1uLWRlZmluaXRpb24+ICkqICcpJwogICAgICAgICAgICAgICAgICAgICAgICAgICAoIFdJVEggPG9wdGlvbj4gKCBBTkQgPG9wdGlvbj4pKiApPwogCi08Y29sdW1uLWRlZmluaXRpb24+IDo6PSA8aWRlbnRpZmllcj4gPHR5cGU+ICggU1RBVElDICk/ICggUFJJTUFSWSBLRVkgKT8KKzxjb2x1bW4tZGVmaW5pdGlvbj4gOjo9IDxpZGVudGlmaWVyPiA8dHlwZT4gKCBTVEFUSUMgKT8gKCA8Y29sdW1uX21hc2s+ICk/ICggUFJJTUFSWSBLRVkgKT8KICAgICAgICAgICAgICAgICAgICAgICB8IFBSSU1BUlkgS0VZICcoJyA8cGFydGl0aW9uLWtleT4gKCAnLCcgPGlkZW50aWZpZXI+ICkqICcpJwogCis8Y29sdW1uLW1hc2s+IDo6PSBNQVNLRUQgV0lUSCAoIERFRkFVTFQgfCA8ZnVuY3Rpb24+ICcoJyAoIDx0ZXJtPiAoJywnIDx0ZXJtPikqICk/ICAnKScgKQorCiA8cGFydGl0aW9uLWtleT4gOjo9IDxpZGVudGlmaWVyPgogICAgICAgICAgICAgICAgICAgfCAnKCcgPGlkZW50aWZpZXI+ICgnLCcgPGlkZW50aWZpZXI+ICkqICcpJwogCkBAIC0zNjIsNyArMzY0LDcgQEAKIAogaDQoI2NvbXBhY3Rpb25PcHRpb25zKS4gQ29tcGFjdGlvbiBvcHRpb25zCiAKLVRoZSBAY29tcGFjdGlvbkAgcHJvcGVydHkgbXVzdCBhdCBsZWFzdCBkZWZpbmUgdGhlIEAnY2xhc3MnQCBzdWItb3B0aW9uLCB0aGF0IGRlZmluZXMgdGhlIGNvbXBhY3Rpb24gc3RyYXRlZ3kgY2xhc3MgdG8gdXNlLiBUaGUgZGVmYXVsdCBzdXBwb3J0ZWQgY2xhc3MgYXJlIEAnU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSdALCBAJ0xldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3knQCwgQCdEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J0AgYW5kIEAnVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSdALiBDdXN0b20gc3RyYXRlZ3kgY2FuIGJlIHByb3ZpZGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZ1bGwgY2xhc3MgbmFtZSBhcyBhICJzdHJpbmcgY29uc3RhbnQiOiNjb25zdGFudHMuIFRoZSByZXN0IG9mIHRoZSBzdWItb3B0aW9ucyBkZXBlbmRzIG9uIHRoZSBjaG9zZW4gY2xhc3MuIFRoZSBzdWItb3B0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIGRlZmF1bHQgY2xhc3NlcyBhcmU6CitUaGUgQGNvbXBhY3Rpb25AIHByb3BlcnR5IG11c3QgYXQgbGVhc3QgZGVmaW5lIHRoZSBAJ2NsYXNzJ0Agc3ViLW9wdGlvbiwgdGhhdCBkZWZpbmVzIHRoZSBjb21wYWN0aW9uIHN0cmF0ZWd5IGNsYXNzIHRvIHVzZS4gVGhlIGRlZmF1bHQgc3VwcG9ydGVkIGNsYXNzIGFyZSBAJ1NpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3knQCwgQCdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5J0AgYW5kIEAnVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSdALiBDdXN0b20gc3RyYXRlZ3kgY2FuIGJlIHByb3ZpZGVkIGJ5IHNwZWNpZnlpbmcgdGhlIGZ1bGwgY2xhc3MgbmFtZSBhcyBhICJzdHJpbmcgY29uc3RhbnQiOiNjb25zdGFudHMuIFRoZSByZXN0IG9mIHRoZSBzdWItb3B0aW9ucyBkZXBlbmRzIG9uIHRoZSBjaG9zZW4gY2xhc3MuIFRoZSBzdWItb3B0aW9ucyBzdXBwb3J0ZWQgYnkgdGhlIGRlZmF1bHQgY2xhc3NlcyBhcmU6CiAKIHxfLiBvcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF8uIHN1cHBvcnRlZCBjb21wYWN0aW9uIHN0cmF0ZWd5IHxfLiBkZWZhdWx0ICAgIHxfLiBkZXNjcmlwdGlvbiB8CiB8IEBlbmFibGVkQCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgX2FsbF8gICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRydWUgICAgICAgICB8IEEgYm9vbGVhbiBkZW5vdGluZyB3aGV0aGVyIGNvbXBhY3Rpb24gc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90LnwKQEAgLTM3NSw5ICszNzcsNiBAQAogfCBAYnVja2V0X2xvd0AgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgICAgfCAwLjUgICAgICAgICAgfCBTaXplIHRpZXJlZCBjb25zaWRlciBzc3RhYmxlcyB0byBiZSB3aXRoaW4gdGhlIHNhbWUgYnVja2V0IGlmIHRoZWlyIHNpemUgaXMgd2l0aGluIFthdmVyYWdlX3NpemUgKiBAYnVja2V0X2xvd0AsIGF2ZXJhZ2Vfc2l6ZSAqIEBidWNrZXRfaGlnaEAgXSAoaS5lIHRoZSBkZWZhdWx0IGdyb3VwcyBzc3RhYmxlIHdob3NlIHNpemVzIGRpdmVyZ2VzIGJ5IGF0IG1vc3QgNTAlKXwKIHwgQGJ1Y2tldF9oaWdoQCAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5ICAgIHwgMS41ICAgICAgICAgIHwgU2l6ZSB0aWVyZWQgY29uc2lkZXIgc3N0YWJsZXMgdG8gYmUgd2l0aGluIHRoZSBzYW1lIGJ1Y2tldCBpZiB0aGVpciBzaXplIGlzIHdpdGhpbiBbYXZlcmFnZV9zaXplICogQGJ1Y2tldF9sb3dALCBhdmVyYWdlX3NpemUgKiBAYnVja2V0X2hpZ2hAIF0gKGkuZSB0aGUgZGVmYXVsdCBncm91cHMgc3N0YWJsZSB3aG9zZSBzaXplcyBkaXZlcmdlcyBieSBhdCBtb3N0IDUwJSkufAogfCBAc3N0YWJsZV9zaXplX2luX21iQCAgICAgICAgICAgICAgICAgICB8IExldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3kgICAgICAgfCA1TUIgICAgICAgICAgfCBUaGUgdGFyZ2V0IHNpemUgKGluIE1CKSBmb3Igc3N0YWJsZXMgaW4gdGhlIGxldmVsZWQgc3RyYXRlZ3kuIE5vdGUgdGhhdCB3aGlsZSBzc3RhYmxlIHNpemVzIHNob3VsZCBzdGF5IGxlc3Mgb3IgZXF1YWwgdG8gQHNzdGFibGVfc2l6ZV9pbl9tYkAsIGl0IGlzIHBvc3NpYmxlIHRvIGV4Y2VwdGlvbmFsbHkgaGF2ZSBhIGxhcmdlciBzc3RhYmxlIGFzIGR1cmluZyBjb21wYWN0aW9uLCBkYXRhIGZvciBhIGdpdmVuIHBhcnRpdGlvbiBrZXkgYXJlIG5ldmVyIHNwbGl0IGludG8gMiBzc3RhYmxlc3wKLXwgQHRpbWVzdGFtcF9yZXNvbHV0aW9uQCAgICAgICAgICAgICAgICAgfCBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5ICAgIHwgTUlDUk9TRUNPTkRTIHwgVGhlIHRpbWVzdGFtcCByZXNvbHV0aW9uIHVzZWQgd2hlbiBpbnNlcnRpbmcgZGF0YSwgY291bGQgYmUgTUlMTElTRUNPTkRTLCBNSUNST1NFQ09ORFMgZXRjIChzaG91bGQgYmUgdW5kZXJzdGFuZGFibGUgYnkgSmF2YSBUaW1lVW5pdCkgLSBkb24ndCBjaGFuZ2UgdGhpcyB1bmxlc3MgeW91IGRvIG11dGF0aW9ucyB3aXRoIFVTSU5HIFRJTUVTVEFNUCA8bm9uX21pY3Jvc2Vjb25kX3RpbWVzdGFtcHM+IChvciBlcXVpdmFsZW50IGRpcmVjdGx5IGluIHRoZSBjbGllbnQpfAotfCBAYmFzZV90aW1lX3NlY29uZHNAICAgICAgICAgICAgICAgICAgICB8IERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgICAgfCA2MCAgICAgICAgICAgfCBUaGUgYmFzZSBzaXplIG9mIHRoZSB0aW1lIHdpbmRvd3MuIHwKLXwgQG1heF9zc3RhYmxlX2FnZV9kYXlzQCAgICAgICAgICAgICAgICAgfCBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5ICAgIHwgMzY1ICAgICAgICAgIHwgU1NUYWJsZXMgb25seSBjb250YWluaW5nIGRhdGEgdGhhdCBpcyBvbGRlciB0aGFuIHRoaXMgd2lsbCBuZXZlciBiZSBjb21wYWN0ZWQuIHwKIHwgQHRpbWVzdGFtcF9yZXNvbHV0aW9uQCAgICAgICAgICAgICAgICAgfCBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5ICAgIHwgTUlDUk9TRUNPTkRTIHwgVGhlIHRpbWVzdGFtcCByZXNvbHV0aW9uIHVzZWQgd2hlbiBpbnNlcnRpbmcgZGF0YSwgY291bGQgYmUgTUlMTElTRUNPTkRTLCBNSUNST1NFQ09ORFMgZXRjIChzaG91bGQgYmUgdW5kZXJzdGFuZGFibGUgYnkgSmF2YSBUaW1lVW5pdCkgLSBkb24ndCBjaGFuZ2UgdGhpcyB1bmxlc3MgeW91IGRvIG11dGF0aW9ucyB3aXRoIFVTSU5HIFRJTUVTVEFNUCA8bm9uX21pY3Jvc2Vjb25kX3RpbWVzdGFtcHM+IChvciBlcXVpdmFsZW50IGRpcmVjdGx5IGluIHRoZSBjbGllbnQpfAogfCBAY29tcGFjdGlvbl93aW5kb3dfdW5pdEAgICAgICAgICAgICAgICB8IFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kgICAgfCBEQVlTICAgICAgICAgfCBUaGUgSmF2YSBUaW1lVW5pdCB1c2VkIGZvciB0aGUgd2luZG93IHNpemUsIHNldCBpbiBjb25qdW5jdGlvbiB3aXRoIEBjb21wYWN0aW9uX3dpbmRvd19zaXplQC4gTXVzdCBiZSBvbmUgb2YgREFZUywgSE9VUlMsIE1JTlVURVMgfAogfCBAY29tcGFjdGlvbl93aW5kb3dfc2l6ZUAgICAgICAgICAgICAgICB8IFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kgICAgfCAxICAgICAgICAgICAgfCBUaGUgbnVtYmVyIG9mIEBjb21wYWN0aW9uX3dpbmRvd191bml0QCB1bml0cyB0aGF0IG1ha2UgdXAgYSB0aW1lIHdpbmRvdy4gfApAQCAtNDEzLDExICs0MTIsMTUgQEAKIGJjKHN5bnRheCkuLiAKIDxhbHRlci10YWJsZS1zdG10PiA6Oj0gQUxURVIgKFRBQkxFIHwgQ09MVU1ORkFNSUxZKSAoSUYgTk9UIEVYSVNUUyk/IDx0YWJsZW5hbWU+IDxpbnN0cnVjdGlvbj4KIAotPGluc3RydWN0aW9uPiA6Oj0gQUREIChJRiBOT1QgRVhJU1RTKT8gKCA8aWRlbnRpZmllcj4gPHR5cGU+ICggLCA8aWRlbnRpZmllcj4gPHR5cGU+ICkqICkKKzxpbnN0cnVjdGlvbj4gOjo9IEFERCAoSUYgTk9UIEVYSVNUUyk/ICggPGlkZW50aWZpZXI+IDx0eXBlPiAoIDxjb2x1bW4tbWFzaz4gKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggLCA8aWRlbnRpZmllcj4gPHR5cGU+ICggPGNvbHVtbi1tYXNrPiApPyApKiApCiAgICAgICAgICAgICAgICAgfCBEUk9QICAoSUYgRVhJU1RTKT8gKCA8aWRlbnRpZmllcj4gKCAsIDxpZGVudGlmaWVyPiApKiApCisgICAgICAgICAgICAgICAgfCBBTFRFUiA8aWRlbnRpZmllcj4gKCA8Y29sdW1uLW1hc2s+IHwgRFJPUCBNQVNLRUQgKQogICAgICAgICAgICAgICAgIHwgUkVOQU1FIChJRiBFWElTVFMpPyA8aWRlbnRpZmllcj4gdG8gPGlkZW50aWZpZXI+IChBTkQgPGlkZW50aWZpZXI+IHRvIDxpZGVudGlmaWVyPikqCiAgICAgICAgICAgICAgICAgfCBEUk9QIENPTVBBQ1QgU1RPUkFHRQogICAgICAgICAgICAgICAgIHwgV0lUSCAgPG9wdGlvbj4gKCBBTkQgPG9wdGlvbj4gKSoKKworPGNvbHVtbi1tYXNrPiA6Oj0gTUFTS0VEIFdJVEggKCBERUZBVUxUIHwgPGZ1bmN0aW9uPiAnKCcgKCA8dGVybT4gKCcsJyA8dGVybT4pKiApPyAgJyknICkKIHAuIAogX19TYW1wbGU6X18KIApAQCAtNDM3LDYgKzQ0MCw3IEBACiBUaGUgQDx0YWJsZW5hbWU+QCBpcyB0aGUgdGFibGUgbmFtZSBvcHRpb25hbGx5IHByZWNlZGVkIGJ5IHRoZSBrZXlzcGFjZSBuYW1lLiAgVGhlIEA8aW5zdHJ1Y3Rpb24+QCBkZWZpbmVzIHRoZSBhbHRlcmF0aW9uIHRvIHBlcmZvcm06CiAqIEBBRERAOiBBZGRzIGEgbmV3IGNvbHVtbiB0byB0aGUgdGFibGUuIFRoZSBAPGlkZW50aWZpZXI+QCBmb3IgdGhlIG5ldyBjb2x1bW4gbXVzdCBub3QgY29uZmxpY3Qgd2l0aCBhbiBleGlzdGluZyBjb2x1bW4uIE1vcmVvdmVyLCBjb2x1bW5zIGNhbm5vdCBiZSBhZGRlZCB0byB0YWJsZXMgZGVmaW5lZCB3aXRoIHRoZSBAQ09NUEFDVCBTVE9SQUdFQCBvcHRpb24uIElmIHRoZSBuZXcgY29sdW1uIGFscmVhZHkgZXhpc3RzLCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgQElGIE5PVCBFWElTVFNAIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCiAqIEBEUk9QQDogUmVtb3ZlcyBhIGNvbHVtbiBmcm9tIHRoZSB0YWJsZS4gRHJvcHBlZCBjb2x1bW5zIHdpbGwgaW1tZWRpYXRlbHkgYmVjb21lIHVuYXZhaWxhYmxlIGluIHRoZSBxdWVyaWVzIGFuZCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiBjb21wYWN0ZWQgc3N0YWJsZXMgaW4gdGhlIGZ1dHVyZS4gSWYgYSBjb2x1bW4gaXMgcmVhZGRlZCwgcXVlcmllcyB3b24ndCByZXR1cm4gdmFsdWVzIHdyaXR0ZW4gYmVmb3JlIHRoZSBjb2x1bW4gd2FzIGxhc3QgZHJvcHBlZC4gSXQgaXMgYXNzdW1lZCB0aGF0IHRpbWVzdGFtcHMgcmVwcmVzZW50IGFjdHVhbCB0aW1lLCBzbyBpZiB0aGlzIGlzIG5vdCB5b3VyIGNhc2UsIHlvdSBzaG91bGQgTk9UIHJlYWRkIHByZXZpb3VzbHkgZHJvcHBlZCBjb2x1bW5zLiBDb2x1bW5zIGNhbid0IGJlIGRyb3BwZWQgZnJvbSB0YWJsZXMgZGVmaW5lZCB3aXRoIHRoZSBAQ09NUEFDVCBTVE9SQUdFQCBvcHRpb24uIElmIHRoZSBkcm9wcGVkIGNvbHVtbiBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgQElGIEVYSVNUU0AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKyogQEFMVEVSQDogQWx0ZXJzIGFuIGV4aXN0aW5nIGNvbHVtbi4gSXQgY2FuIGJlIHVzZWQgdG8gc2V0IGl0cyBkYXRhIG1hc2ssIG9yIHRvIHNldCBpdCBhcyB1bm1hc2tlZC4gVGhlIGRhdGEgbWFzayBpcyBhbnkgZnVuY3Rpb24gbWVhbnQgdG8gb2JzY3VyZSB0aGUgcmVhbCB2YWx1ZXMgb2YgdGhlIGNvbHVtbi4KICogQFJFTkFNRUAgYSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgYSB0YWJsZS4gTm9uIHByaW1hcnkga2V5IGNvbHVtbnMgY2Fubm90IGJlIHJlbmFtZWQuIEZ1cnRoZXJtb3JlLCByZW5hbWluZyBhIGNvbHVtbiB0byBhbm90aGVyIG5hbWUgd2hpY2ggYWxyZWFkeSBleGlzdHMgaXNuJ3QgYWxsb3dlZC4gSXQncyBpbXBvcnRhbnQgdG8ga2VlcCBpbiBtaW5kIHRoYXQgcmVuYW1lZCBjb2x1bW5zIHNob3VsZG4ndCBoYXZlIGRlcGVuZGVudCBzZWNvbmRhcnkgaW5kZXhlcy4gSWYgdGhlIHJlbmFtZWQgY29sdW1uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBASUYgRVhJU1RTQCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgogKiBARFJPUCBDT01QQUNUIFNUT1JBR0VAOiBSZW1vdmVzIFRocmlmdCBjb21wYXRpYmlsaXR5IG1vZGUgZnJvbSB0aGUgdGFibGUuCiAqIEBXSVRIQDogQWxsb3dzIHRvIHVwZGF0ZSB0aGUgb3B0aW9ucyBvZiB0aGUgdGFibGUuIFRoZSAic3VwcG9ydGVkIEA8b3B0aW9uPkAiOiNjcmVhdGVUYWJsZU9wdGlvbnMgKGFuZCBzeW50YXgpIGFyZSB0aGUgc2FtZSBhcyBmb3IgdGhlIEBDUkVBVEUgVEFCTEVAIHN0YXRlbWVudCBleGNlcHQgdGhhdCBAQ09NUEFDVCBTVE9SQUdFQCBpcyBub3Qgc3VwcG9ydGVkLiBOb3RlIHRoYXQgc2V0dGluZyBhbnkgQGNvbXBhY3Rpb25AIHN1Yi1vcHRpb25zIGhhcyB0aGUgZWZmZWN0IG9mIGVyYXNpbmcgYWxsIHByZXZpb3VzIEBjb21wYWN0aW9uQCBvcHRpb25zLCBzbyB5b3UgIG5lZWQgdG8gcmUtc3BlY2lmeSBhbGwgdGhlIHN1Yi1vcHRpb25zIGlmIHlvdSB3YW50IHRvIGtlZXAgdGhlbS4gVGhlIHNhbWUgbm90ZSBhcHBsaWVzIHRvIHRoZSBzZXQgb2YgQGNvbXByZXNzaW9uQCBzdWItb3B0aW9ucy4KQEAgLTEwODYsOSArMTA5MCwxMCBAQAogCiA8c2VsZWN0b3I+IDo6PSA8aWRlbnRpZmllcj4KICAgICAgICAgICAgICB8IDx0ZXJtPgotICAgICAgICAgICAgIHwgV1JJVEVUSU1FICcoJyA8aWRlbnRpZmllcj4gJyknCisgICAgICAgICAgICAgfCBXUklURVRJTUUgJygnIDxzZWxlY3Rvcj4gJyknCisgICAgICAgICAgICAgfCBNQVhXUklURVRJTUUgJygnIDxzZWxlY3Rvcj4gJyknCiAgICAgICAgICAgICAgfCBDT1VOVCAnKCcgJyonICcpJwotICAgICAgICAgICAgIHwgVFRMICcoJyA8aWRlbnRpZmllcj4gJyknCisgICAgICAgICAgICAgfCBUVEwgJygnIDxzZWxlY3Rvcj4gJyknCiAgICAgICAgICAgICAgfCBDQVNUICcoJyA8c2VsZWN0b3I+IEFTIDx0eXBlPiAnKScKICAgICAgICAgICAgICB8IDxmdW5jdGlvbj4gJygnICg8c2VsZWN0b3I+ICgnLCcgPHNlbGVjdG9yPikqKT8gJyknCiAgICAgICAgICAgICAgfCA8c2VsZWN0b3I+ICcuJyA8aWRlbnRpZmllcj4KQEAgLTExMzUsNyArMTE0MCw3IEBACiAKIFRoZSBAPHNlbGVjdC1jbGF1c2U+QCBkZXRlcm1pbmVzIHdoaWNoIGNvbHVtbnMgbmVlZHMgdG8gYmUgcXVlcmllZCBhbmQgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdC1zZXQuIEl0IGNvbnNpc3RzIG9mIGVpdGhlciB0aGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgPHNlbGVjdG9yPiBvciB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIChAKkApIHRvIHNlbGVjdCBhbGwgdGhlIGNvbHVtbnMgZGVmaW5lZCBmb3IgdGhlIHRhYmxlLiBQbGVhc2Ugbm90ZSB0aGF0IGZvciB3aWxkY2FyZCBAU0VMRUNUQCBxdWVyaWVzIHRoZSBvcmRlciBvZiBjb2x1bW5zIHJldHVybmVkIGlzIG5vdCBzcGVjaWZpZWQgYW5kIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN0YWJsZSBiZXR3ZWVuIENhc3NhbmRyYSB2ZXJzaW9ucy4KIAotQSBAPHNlbGVjdG9yPkAgaXMgZWl0aGVyIGEgY29sdW1uIG5hbWUgdG8gcmV0cmlldmUgb3IgYSBAPGZ1bmN0aW9uPkAgb2Ygb25lIG9yIG1vcmUgQDx0ZXJtPkBzLiBUaGUgZnVuY3Rpb24gYWxsb3dlZCBhcmUgdGhlIHNhbWUgYXMgZm9yIEA8dGVybT5AIGFuZCBhcmUgZGVzY3JpYmVkIGluIHRoZSAiZnVuY3Rpb24gc2VjdGlvbiI6I2Z1bmN0aW9ucy4gSW4gYWRkaXRpb24gdG8gdGhlc2UgZ2VuZXJpYyBmdW5jdGlvbnMsIHRoZSBAV1JJVEVUSU1FQCAocmVzcC4gQFRUTEApIGZ1bmN0aW9uIGFsbG93cyB0byBzZWxlY3QgdGhlIHRpbWVzdGFtcCBvZiB3aGVuIHRoZSBjb2x1bW4gd2FzIGluc2VydGVkIChyZXNwLiB0aGUgdGltZSB0byBsaXZlIChpbiBzZWNvbmRzKSBmb3IgdGhlIGNvbHVtbiAob3IgbnVsbCBpZiB0aGUgY29sdW1uIGhhcyBubyBleHBpcmF0aW9uIHNldCkpIGFuZCB0aGUgIkBDQVNUQCI6I2Nhc3RGdW4gZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29udmVydCBvbmUgZGF0YSB0eXBlIHRvIGFub3RoZXIuCitBIEA8c2VsZWN0b3I+QCBpcyBlaXRoZXIgYSBjb2x1bW4gbmFtZSB0byByZXRyaWV2ZSBvciBhIEA8ZnVuY3Rpb24+QCBvZiBvbmUgb3IgbW9yZSBAPHRlcm0+QHMuIFRoZSBmdW5jdGlvbiBhbGxvd2VkIGFyZSB0aGUgc2FtZSBhcyBmb3IgQDx0ZXJtPkAgYW5kIGFyZSBkZXNjcmliZWQgaW4gdGhlICJmdW5jdGlvbiBzZWN0aW9uIjojZnVuY3Rpb25zLiBJbiBhZGRpdGlvbiB0byB0aGVzZSBnZW5lcmljIGZ1bmN0aW9ucywgdGhlIEBXUklURVRJTUVAIGFuZCBATUFYV1JJVEVUSU1FQCAocmVzcC4gQFRUTEApIGZ1bmN0aW9uIGFsbG93cyB0byBzZWxlY3QgdGhlIHRpbWVzdGFtcCBvZiB3aGVuIHRoZSBjb2x1bW4gd2FzIGluc2VydGVkIChyZXNwLiB0aGUgdGltZSB0byBsaXZlIChpbiBzZWNvbmRzKSBmb3IgdGhlIGNvbHVtbiAob3IgbnVsbCBpZiB0aGUgY29sdW1uIGhhcyBubyBleHBpcmF0aW9uIHNldCkpIGFuZCB0aGUgIkBDQVNUQCI6I2Nhc3RGdW4gZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29udmVydCBvbmUgZGF0YSB0eXBlIHRvIGFub3RoZXIuCiAKIEFkZGl0aW9uYWxseSwgaW5kaXZpZHVhbCB2YWx1ZXMgb2YgbWFwcyBhbmQgc2V0cyBjYW4gYmUgc2VsZWN0ZWQgdXNpbmcgQFsgPHRlcm0+IF1ALiBGb3IgbWFwcywgdGhpcyB3aWxsIHJldHVybiB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUga2V5LCBpZiBzdWNoIGVudHJ5IGV4aXN0cy4gRm9yIHNldHMsIHRoaXMgd2lsbCByZXR1cm4gdGhlIGtleSB0aGF0IGlzIHNlbGVjdGVkIGlmIGl0IGV4aXN0cyBhbmQgaXMgdGh1cyBtYWlubHkgYSB3YXkgdG8gY2hlY2sgZWxlbWVudCBleGlzdGVuY2UuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gc2VsZWN0IGEgc2xpY2Ugb2YgYSBzZXQgb3IgbWFwIHdpdGggQFsgPHRlcm0+IC4uLiA8dGVybT4gQF0sIHdoZXJlIGJvdGggYm91bmQgY2FuIGJlIG9taXR0ZWQuCiAKQEAgLTE1MjAsNiArMTUyNSw4IEBACiAqIEBBVVRIT1JJWkVACiAqIEBERVNDUklCRUAKICogQEVYRUNVVEVACisqIEBVTk1BU0tACisqIEBTRUxFQ1RfTUFTS0VEQAogCiBOb3QgYWxsIHBlcm1pc3Npb25zIGFyZSBhcHBsaWNhYmxlIHRvIGV2ZXJ5IHR5cGUgb2YgcmVzb3VyY2UuIEZvciBpbnN0YW5jZSwgQEVYRUNVVEVAIGlzIG9ubHkgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQgb2YgZnVuY3Rpb25zIG9yIG1iZWFuczsgZ3JhbnRpbmcgQEVYRUNVVEVAIG9uIGEgcmVzb3VyY2UgcmVwcmVzZW50aW5nIGEgdGFibGUgaXMgbm9uc2Vuc2ljYWwuIEF0dGVtcHRpbmcgdG8gQEdSQU5UQCBhIHBlcm1pc3Npb24gb24gcmVzb3VyY2UgdG8gd2hpY2ggaXQgY2Fubm90IGJlIGFwcGxpZWQgcmVzdWx0cyBpbiBhbiBlcnJvciByZXNwb25zZS4gVGhlIGZvbGxvd2luZyBpbGx1c3RyYXRlcyB3aGljaCBwZXJtaXNzaW9ucyBjYW4gYmUgZ3JhbnRlZCBvbiB3aGljaCB0eXBlcyBvZiByZXNvdXJjZSwgYW5kIHdoaWNoIHN0YXRlbWVudHMgYXJlIGVuYWJsZWQgYnkgdGhhdCBwZXJtaXNzaW9uLgogCkBAIC0xNTc5LDYgKzE1ODYsMTIgQEAKIHwgQEVYRUNVVEVAICAgIHwgQEFMTCBNQkVBTlNAICAgICAgICAgICAgICAgICB8RXhlY3V0ZSBvcGVyYXRpb25zIG9uIGFueSBtYmVhbnwKIHwgQEVYRUNVVEVAICAgIHwgQE1CRUFOU0AgICAgICAgICAgICAgICAgICAgICB8RXhlY3V0ZSBvcGVyYXRpb25zIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhIHdpbGRjYXJkIHBhdHRlcm58CiB8IEBFWEVDVVRFQCAgICB8IEBNQkVBTkAgICAgICAgICAgICAgICAgICAgICAgfEV4ZWN1dGUgb3BlcmF0aW9ucyBvbiBuYW1lZCBtYmVhbnwKK3wgQFVOTUFTS0AgICAgIHwgQEFMTCBLRVlTUEFDRVNAICAgICAgICAgICAgICB8U2VlIHRoZSBjbGVhciBjb250ZW50cyBvZiBtYXNrZWQgY29sdW1ucyBvbiBhbnkgdGFibGV8Cit8IEBVTk1BU0tAICAgICB8IEBLRVlTUEFDRUAgICAgICAgICAgICAgICAgICAgfFNlZSB0aGUgY2xlYXIgY29udGVudHMgb2YgbWFza2VkIGNvbHVtbnMgb24gYW55IHRhYmxlIGluIGtleXNwYWNlfAorfCBAVU5NQVNLQCAgICAgfCBAVEFCTEVAICAgICAgICAgICAgICAgICAgICAgIHxTZWUgdGhlIGNsZWFyIGNvbnRlbnRzIG9mIG1hc2tlZCBjb2x1bW5zIG9uIHRoZSBzcGVjaWZpZWQgdGFibGV8Cit8IEBTRUxFQ1RfTUFTS0VEQCB8IEBBTEwgS0VZU1BBQ0VTQCAgICAgICAgICAgfFNlbGVjdCByZXN0cmljdGluZyBtYXNrZWQgY29sdW1ucyBvbiBhbnkgdGFibGV8Cit8IEBTRUxFQ1RfTUFTS0VEQCB8IEBLRVlTUEFDRUAgICAgICAgICAgICAgICAgfFNlbGVjdCByZXN0cmljdGluZyBtYXNrZWQgY29sdW1ucyBvbiBhbnkgdGFibGUgaW4ga2V5c3BhY2V8Cit8IEBTRUxFQ1RfTUFTS0VEQCB8IEBUQUJMRUAgICAgICAgICAgICAgICAgICAgfFNlbGVjdCByZXN0cmljdGluZyBtYXNrZWQgY29sdW1ucyBvbiB0aGUgc3BlY2lmaWVkIHRhYmxlfAogCiAKIGgzKCNncmFudFBlcm1pc3Npb25zU3RtdCkuIEdSQU5UIFBFUk1JU1NJT04KQEAgLTE1ODgsNyArMTYwMSw3IEBACiBiYyhzeW50YXgpLi4gCiA8Z3JhbnQtcGVybWlzc2lvbi1zdG10PiA6Oj0gR1JBTlQgKCBBTEwgKCBQRVJNSVNTSU9OUyApPyB8IDxwZXJtaXNzaW9uPiAoIFBFUk1JU1NJT04gKT8gKCwgUEVSTUlTU0lPTikqICkgT04gPHJlc291cmNlPiBUTyA8aWRlbnRpZmllcj4KIAotPHBlcm1pc3Npb24+IDo6PSBDUkVBVEUgfCBBTFRFUiB8IERST1AgfCBTRUxFQ1QgfCBNT0RJRlkgfCBBVVRIT1JJWkUgfCBERVNSSUJFIHwgRVhFQ1VURQorPHBlcm1pc3Npb24+IDo6PSBDUkVBVEUgfCBBTFRFUiB8IERST1AgfCBTRUxFQ1QgfCBNT0RJRlkgfCBBVVRIT1JJWkUgfCBERVNSSUJFIHwgRVhFQ1VURSB8IFVOTUFTSyB8IFNFTEVDVF9NQVNLRUQKIAogPHJlc291cmNlPiA6Oj0gQUxMIEtFWVNQQUNFUwogICAgICAgICAgICAgIHwgS0VZU1BBQ0UgPGlkZW50aWZpZXI+CkBAIC0xNjQ1LDcgKzE2NTgsNyBAQAogYmMoc3ludGF4KS4uIAogPHJldm9rZS1wZXJtaXNzaW9uLXN0bXQ+IDo6PSBSRVZPS0UgKCBBTEwgKCBQRVJNSVNTSU9OUyApPyB8IDxwZXJtaXNzaW9uPiAoIFBFUk1JU1NJT04gKT8gKCwgUEVSTUlTU0lPTikqICkgT04gPHJlc291cmNlPiBGUk9NIDxpZGVudGlmaWVyPgogCi08cGVybWlzc2lvbj4gOjo9IENSRUFURSB8IEFMVEVSIHwgRFJPUCB8IFNFTEVDVCB8IE1PRElGWSB8IEFVVEhPUklaRSB8IERFU1JJQkUgfCBFWEVDVVRFCis8cGVybWlzc2lvbj4gOjo9IENSRUFURSB8IEFMVEVSIHwgRFJPUCB8IFNFTEVDVCB8IE1PRElGWSB8IEFVVEhPUklaRSB8IERFU1JJQkUgfCBFWEVDVVRFIHwgVU5NQVNLIHwgU0VMRUNUX01BU0tFRAogCiA8cmVzb3VyY2U+IDo6PSBBTEwgS0VZU1BBQ0VTCiAgICAgICAgICAgICAgfCBLRVlTUEFDRSA8aWRlbnRpZmllcj4KQEAgLTIxMDUsMjEgKzIxMTgsMjEgQEAKIAogCiB3aWxsIG5ldmVyIHJldHVybiBhbnkgcmVzdWx0IGJ5IGRlc2lnbiwgc2luY2UgdGhlIHZhbHVlIHJldHVybmVkIGJ5IEBub3coKUAgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUuCi1AY3VycmVudFRpbWVVVUlEQCBpcyBhbiBhbGlhcyBvZiBAbm93QC4KK0BjdXJyZW50X3RpbWV1dWlkQCBpcyBhbiBhbGlhcyBvZiBAbm93QC4KIAogCi1oNC4gQG1pblRpbWV1dWlkQCBhbmQgQG1heFRpbWV1dWlkQAoraDQuIEBtaW5fdGltZXV1aWRAIGFuZCBAbWF4X3RpbWV1dWlkQAogCi1UaGUgQG1pblRpbWV1dWlkQCAocmVzcC4gQG1heFRpbWV1dWlkQCkgZnVuY3Rpb24gdGFrZXMgYSBAdGltZXN0YW1wQCB2YWx1ZSBAdEAgKHdoaWNoIGNhbiBiZSAiZWl0aGVyIGEgdGltZXN0YW1wIG9yIGEgZGF0ZSBzdHJpbmciOiN1c2luZ3RpbWVzdGFtcHMgKSBhbmQgcmV0dXJuIGEgX2Zha2VfIEB0aW1ldXVpZEAgY29ycmVzcG9uZGluZyB0byB0aGUgX3NtYWxsZXN0XyAocmVzcC4gX2JpZ2dlc3RfKSBwb3NzaWJsZSBAdGltZXV1aWRAIGhhdmluZyBmb3IgdGltZXN0YW1wIEB0QC4gU28gZm9yIGluc3RhbmNlOgorVGhlIEBtaW5fdGltZXV1aWRAIChyZXNwLiBAbWF4X3RpbWV1dWlkQCkgZnVuY3Rpb24gdGFrZXMgYSBAdGltZXN0YW1wQCB2YWx1ZSBAdEAgKHdoaWNoIGNhbiBiZSAiZWl0aGVyIGEgdGltZXN0YW1wIG9yIGEgZGF0ZSBzdHJpbmciOiN1c2luZ3RpbWVzdGFtcHMgKSBhbmQgcmV0dXJuIGEgX2Zha2VfIEB0aW1ldXVpZEAgY29ycmVzcG9uZGluZyB0byB0aGUgX3NtYWxsZXN0XyAocmVzcC4gX2JpZ2dlc3RfKSBwb3NzaWJsZSBAdGltZXV1aWRAIGhhdmluZyBmb3IgdGltZXN0YW1wIEB0QC4gU28gZm9yIGluc3RhbmNlOgogCiAKLWJjKHNhbXBsZSkuIAotU0VMRUNUICogRlJPTSBteVRhYmxlIFdIRVJFIHQgPiBtYXhUaW1ldXVpZCgnMjAxMy0wMS0wMSAwMDowNSswMDAwJykgQU5EIHQgPCBtaW5UaW1ldXVpZCgnMjAxMy0wMi0wMiAxMDowMCswMDAwJykKK2JjKHNhbXBsZSkuCitTRUxFQ1QgKiBGUk9NIG15VGFibGUgV0hFUkUgdCA+IG1heF90aW1ldXVpZCgnMjAxMy0wMS0wMSAwMDowNSswMDAwJykgQU5EIHQgPCBtaW5fdGltZXV1aWQoJzIwMTMtMDItMDIgMTA6MDArMDAwMCcpCiAKIAotd2lsbCBzZWxlY3QgYWxsIHJvd3Mgd2hlcmUgdGhlIEB0aW1ldXVpZEAgY29sdW1uIEB0QCBpcyBzdHJpY3RseSBvbGRlciB0aGFuICcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnIGJ1dCBzdHJpY3RseSB5b3VuZ2VyIHRoYW4gJzIwMTMtMDItMDIgMTA6MDArMDAwMCcuICBQbGVhc2Ugbm90ZSB0aGF0IEB0ID49IG1heFRpbWV1dWlkKCcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnKUAgd291bGQgc3RpbGwgX25vdF8gc2VsZWN0IGEgQHRpbWV1dWlkQCBnZW5lcmF0ZWQgZXhhY3RseSBhdCAnMjAxMy0wMS0wMSAwMDowNSswMDAwJyBhbmQgaXMgZXNzZW50aWFsbHkgZXF1aXZhbGVudCB0byBAdCA+IG1heFRpbWV1dWlkKCcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnKUAuCit3aWxsIHNlbGVjdCBhbGwgcm93cyB3aGVyZSB0aGUgQHRpbWV1dWlkQCBjb2x1bW4gQHRAIGlzIHN0cmljdGx5IG9sZGVyIHRoYW4gJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCcgYnV0IHN0cmljdGx5IHlvdW5nZXIgdGhhbiAnMjAxMy0wMi0wMiAxMDowMCswMDAwJy4gIFBsZWFzZSBub3RlIHRoYXQgQHQgPj0gbWF4X3RpbWV1dWlkKCcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnKUAgd291bGQgc3RpbGwgX25vdF8gc2VsZWN0IGEgQHRpbWV1dWlkQCBnZW5lcmF0ZWQgZXhhY3RseSBhdCAnMjAxMy0wMS0wMSAwMDowNSswMDAwJyBhbmQgaXMgZXNzZW50aWFsbHkgZXF1aXZhbGVudCB0byBAdCA+IG1heFRpbWV1dWlkKCcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnKUAuCiAKLV9XYXJuaW5nXzogV2UgY2FsbGVkIHRoZSB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IEBtaW5UaW1ldXVpZEAgYW5kIEBtYXhUaW1ldXVpZEAgX2Zha2VfIFVVSUQgYmVjYXVzZSB0aGV5IGRvIG5vIHJlc3BlY3QgdGhlIFRpbWUtQmFzZWQgVVVJRCBnZW5lcmF0aW9uIHByb2Nlc3Mgc3BlY2lmaWVkIGJ5IHRoZSAiUkZDIDQxMjIiOmh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQxMjIudHh0LiBJbiBwYXJ0aWN1bGFyLCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlc2UgMiBtZXRob2RzIHdpbGwgbm90IGJlIHVuaXF1ZS4gVGhpcyBtZWFucyB5b3Ugc2hvdWxkIG9ubHkgdXNlIHRob3NlIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIChhcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSkuIEluc2VydGluZyB0aGUgcmVzdWx0IG9mIHRob3NlIG1ldGhvZHMgaXMgYWxtb3N0IGNlcnRhaW5seSBfYSBiYWQgaWRlYV8uCitfV2FybmluZ186IFdlIGNhbGxlZCB0aGUgdmFsdWVzIGdlbmVyYXRlZCBieSBAbWluX3RpbWV1dWlkQCBhbmQgQG1heF90aW1ldXVpZEAgX2Zha2VfIFVVSUQgYmVjYXVzZSB0aGV5IGRvIG5vIHJlc3BlY3QgdGhlIFRpbWUtQmFzZWQgVVVJRCBnZW5lcmF0aW9uIHByb2Nlc3Mgc3BlY2lmaWVkIGJ5IHRoZSAiUkZDIDQxMjIiOmh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQxMjIudHh0LiBJbiBwYXJ0aWN1bGFyLCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlc2UgMiBtZXRob2RzIHdpbGwgbm90IGJlIHVuaXF1ZS4gVGhpcyBtZWFucyB5b3Ugc2hvdWxkIG9ubHkgdXNlIHRob3NlIG1ldGhvZHMgZm9yIHF1ZXJ5aW5nIChhcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSkuIEluc2VydGluZyB0aGUgcmVzdWx0IG9mIHRob3NlIG1ldGhvZHMgaXMgYWxtb3N0IGNlcnRhaW5seSBfYSBiYWQgaWRlYV8uCiAKIAogaDMoI2RhdGV0aW1lRnVuKS4gRGF0ZXRpbWUgZnVuY3Rpb25zCkBAIC0yMTI5LDMwICsyMTQyLDI4IEBACiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGF0ZS90aW1lIGF0IHRoZSB0aW1lIHdoZXJlIHRoZSBmdW5jdGlvbiBpcyBpbnZva2VkOgogCiB8Xy4gZnVuY3Rpb24gbmFtZSAgICAgICAgIHxfLiAgICBvdXRwdXQgdHlwZSAgICAgICB8Ci18IEBjdXJyZW50VGltZXN0YW1wQCAgICAgIHwgIEB0aW1lc3RhbXBAICAgICAgICAgICB8Ci18IEBjdXJyZW50RGF0ZUAgICAgICAgICAgIHwgIEBkYXRlQCAgICAgICAgICAgICAgICB8Ci18IEBjdXJyZW50VGltZUAgICAgICAgICAgIHwgIEB0aW1lQCAgICAgICAgICAgICAgICB8Ci18IEBjdXJyZW50VGltZVVVSURAICAgICAgIHwgIEB0aW1lVVVJREAgICAgICAgICAgICB8Cit8IEBjdXJyZW50X3RpbWVzdGFtcEAgICAgIHwgIEB0aW1lc3RhbXBAICAgICAgICAgICB8Cit8IEBjdXJyZW50X2RhdGVAICAgICAgICAgIHwgIEBkYXRlQCAgICAgICAgICAgICAgICB8Cit8IEBjdXJyZW50X3RpbWVAICAgICAgICAgIHwgIEB0aW1lQCAgICAgICAgICAgICAgICB8Cit8IEBjdXJyZW50X3RpbWV1dWlkQCAgICAgIHwgIEB0aW1lVVVJREAgICAgICAgICAgICB8CiAKIEZvciBleGFtcGxlIHRoZSBsYXN0IDIgZGF5cyBvZiBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmc6CiAKLWJjKHNhbXBsZSkuIAotU0VMRUNUICogRlJPTSBteVRhYmxlIFdIRVJFIGRhdGUgPj0gY3VycmVudERhdGUoKSAtIDJkCitiYyhzYW1wbGUpLgorU0VMRUNUICogRlJPTSBteVRhYmxlIFdIRVJFIGRhdGUgPj0gY3VycmVudF9kYXRlKCkgLSAyZAogCiBoNCgjdGltZUZ1bikuIFRpbWUgY29udmVyc2lvbiBmdW5jdGlvbnMKIAogQSBudW1iZXIgb2YgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0byAiY29udmVydCIgYSBAdGltZXV1aWRALCBhIEB0aW1lc3RhbXBAIG9yIGEgQGRhdGVAIGludG8gYW5vdGhlciBAbmF0aXZlQCB0eXBlLgogCiB8Xy4gZnVuY3Rpb24gbmFtZSAgICB8Xy4gaW5wdXQgdHlwZSAgIHxfLiBkZXNjcmlwdGlvbnwKLXxAdG9EYXRlQCAgICAgICAgICAgIHxAdGltZXV1aWRAICAgICAgfENvbnZlcnRzIHRoZSBAdGltZXV1aWRAIGFyZ3VtZW50IGludG8gYSBAZGF0ZUAgdHlwZXwKLXxAdG9EYXRlQCAgICAgICAgICAgIHxAdGltZXN0YW1wQCAgICAgfENvbnZlcnRzIHRoZSBAdGltZXN0YW1wQCBhcmd1bWVudCBpbnRvIGEgQGRhdGVAIHR5cGV8Ci18QHRvVGltZXN0YW1wQCAgICAgICB8QHRpbWV1dWlkQCAgICAgIHxDb252ZXJ0cyB0aGUgQHRpbWV1dWlkQCBhcmd1bWVudCBpbnRvIGEgQHRpbWVzdGFtcEAgdHlwZXwKLXxAdG9UaW1lc3RhbXBAICAgICAgIHxAZGF0ZUAgICAgICAgICAgfENvbnZlcnRzIHRoZSBAZGF0ZUAgYXJndW1lbnQgaW50byBhIEB0aW1lc3RhbXBAIHR5cGV8Ci18QHRvVW5peFRpbWVzdGFtcEAgICB8QHRpbWV1dWlkQCAgICAgIHxDb252ZXJ0cyB0aGUgQHRpbWV1dWlkQCBhcmd1bWVudCBpbnRvIGEgQGJpZ0ludEAgcmF3IHZhbHVlfAotfEB0b1VuaXhUaW1lc3RhbXBAICAgfEB0aW1lc3RhbXBAICAgICB8Q29udmVydHMgdGhlIEB0aW1lc3RhbXBAIGFyZ3VtZW50IGludG8gYSBAYmlnSW50QCByYXcgdmFsdWV8Ci18QHRvVW5peFRpbWVzdGFtcEAgICB8QGRhdGVAICAgICAgICAgIHxDb252ZXJ0cyB0aGUgQGRhdGVAIGFyZ3VtZW50IGludG8gYSBAYmlnSW50QCByYXcgdmFsdWV8Ci18QGRhdGVPZkAgICAgICAgICAgICB8QHRpbWV1dWlkQCAgICAgIHxTaW1pbGFyIHRvIEB0b1RpbWVzdGFtcCh0aW1ldXVpZClAIChERVBSRUNBVEVEKXwKLXxAdW5peFRpbWVzdGFtcE9mQCAgIHxAdGltZXV1aWRAICAgICAgfFNpbWlsYXIgdG8gQHRvVW5peFRpbWVzdGFtcCh0aW1ldXVpZClAIChERVBSRUNBVEVEKXwKK3xAdG9fZGF0ZUAgICAgICAgICAgIHxAdGltZXV1aWRAICAgICAgfENvbnZlcnRzIHRoZSBAdGltZXV1aWRAIGFyZ3VtZW50IGludG8gYSBAZGF0ZUAgdHlwZXwKK3xAdG9fZGF0ZUAgICAgICAgICAgIHxAdGltZXN0YW1wQCAgICAgfENvbnZlcnRzIHRoZSBAdGltZXN0YW1wQCBhcmd1bWVudCBpbnRvIGEgQGRhdGVAIHR5cGV8Cit8QHRvX3RpbWVzdGFtcEAgICAgICB8QHRpbWV1dWlkQCAgICAgIHxDb252ZXJ0cyB0aGUgQHRpbWV1dWlkQCBhcmd1bWVudCBpbnRvIGEgQHRpbWVzdGFtcEAgdHlwZXwKK3xAdG9fdGltZXN0YW1wQCAgICAgIHxAZGF0ZUAgICAgICAgICAgfENvbnZlcnRzIHRoZSBAZGF0ZUAgYXJndW1lbnQgaW50byBhIEB0aW1lc3RhbXBAIHR5cGV8Cit8QHRvX3VuaXhfdGltZXN0YW1wQCB8QHRpbWV1dWlkQCAgICAgIHxDb252ZXJ0cyB0aGUgQHRpbWV1dWlkQCBhcmd1bWVudCBpbnRvIGEgQGJpZ0ludEAgcmF3IHZhbHVlfAorfEB0b191bml4X3RpbWVzdGFtcEAgfEB0aW1lc3RhbXBAICAgICB8Q29udmVydHMgdGhlIEB0aW1lc3RhbXBAIGFyZ3VtZW50IGludG8gYSBAYmlnSW50QCByYXcgdmFsdWV8Cit8QHRvX3VuaXhfdGltZXN0YW1wQCB8QGRhdGVAICAgICAgICAgIHxDb252ZXJ0cyB0aGUgQGRhdGVAIGFyZ3VtZW50IGludG8gYSBAYmlnSW50QCByYXcgdmFsdWV8CiAKIGg0KCNmbG9vckZ1bikuIEZsb29yIGZ1bmN0aW9uCiAKQEAgLTIxNjYsMTIgKzIxNzcsMTIgQEAKIAogaDMoI2Jsb2JGdW4pLiBCbG9iIGNvbnZlcnNpb24gZnVuY3Rpb25zCiAKLUEgbnVtYmVyIG9mIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgdG8gImNvbnZlcnQiIHRoZSBuYXRpdmUgdHlwZXMgaW50byBiaW5hcnkgZGF0YSAoQGJsb2JAKS4gRm9yIGV2ZXJ5IEA8bmF0aXZlLXR5cGU+QCBAdHlwZUAgc3VwcG9ydGVkIGJ5IENRTDMgKGEgbm90YWJsZSBleGNlcHRpb25zIGlzIEBibG9iQCwgZm9yIG9idmlvdXMgcmVhc29ucyksIHRoZSBmdW5jdGlvbiBAdHlwZUFzQmxvYkAgdGFrZXMgYSBhcmd1bWVudCBvZiB0eXBlIEB0eXBlQCBhbmQgcmV0dXJuIGl0IGFzIGEgQGJsb2JALiAgQ29udmVyc2VseSwgdGhlIGZ1bmN0aW9uIEBibG9iQXNUeXBlQCB0YWtlcyBhIDY0LWJpdCBAYmxvYkAgYXJndW1lbnQgYW5kIGNvbnZlcnQgaXQgdG8gYSBAYmlnaW50QCB2YWx1ZS4gIEFuZCBzbyBmb3IgaW5zdGFuY2UsIEBiaWdpbnRBc0Jsb2IoMylAIGlzIEAweDAwMDAwMDAwMDAwMDAwMDNAIGFuZCBAYmxvYkFzQmlnaW50KDB4MDAwMDAwMDAwMDAwMDAwMylAIGlzIEAzQC4KK0EgbnVtYmVyIG9mIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgdG8gImNvbnZlcnQiIHRoZSBuYXRpdmUgdHlwZXMgaW50byBiaW5hcnkgZGF0YSAoQGJsb2JAKS4gRm9yIGV2ZXJ5IEA8bmF0aXZlLXR5cGU+QCBAdHlwZUAgc3VwcG9ydGVkIGJ5IENRTDMgKGEgbm90YWJsZSBleGNlcHRpb25zIGlzIEBibG9iQCwgZm9yIG9idmlvdXMgcmVhc29ucyksIHRoZSBmdW5jdGlvbiBAdHlwZV9hc19ibG9iQCB0YWtlcyBhIGFyZ3VtZW50IG9mIHR5cGUgQHR5cGVAIGFuZCByZXR1cm4gaXQgYXMgYSBAYmxvYkAuICBDb252ZXJzZWx5LCB0aGUgZnVuY3Rpb24gQGJsb2JfYXNfdHlwZUAgdGFrZXMgYSA2NC1iaXQgQGJsb2JAIGFyZ3VtZW50IGFuZCBjb252ZXJ0IGl0IHRvIGEgQGJpZ2ludEAgdmFsdWUuICBBbmQgc28gZm9yIGluc3RhbmNlLCBAYmlnaW50X2FzX2Jsb2IoMylAIGlzIEAweDAwMDAwMDAwMDAwMDAwMDNAIGFuZCBAYmxvYl9hc19iaWdpbnQoMHgwMDAwMDAwMDAwMDAwMDAzKUAgaXMgQDNALgogCiBoMigjYWdncmVnYXRlcykuIEFnZ3JlZ2F0ZXMKIAogQWdncmVnYXRlIGZ1bmN0aW9ucyB3b3JrIG9uIGEgc2V0IG9mIHJvd3MuIFRoZXkgcmVjZWl2ZSB2YWx1ZXMgZm9yIGVhY2ggcm93IGFuZCByZXR1cm5zIG9uZSB2YWx1ZSBmb3IgdGhlIHdob2xlIHNldC4KLUlmIEBub3JtYWxAIGNvbHVtbnMsIEBzY2FsYXIgZnVuY3Rpb25zQCwgQFVEVEAgZmllbGRzLCBAd3JpdGV0aW1lQCBvciBAdHRsQCBhcmUgc2VsZWN0ZWQgdG9nZXRoZXIgd2l0aCBhZ2dyZWdhdGUgZnVuY3Rpb25zLCB0aGUgdmFsdWVzIHJldHVybmVkIGZvciB0aGVtIHdpbGwgYmUgdGhlIG9uZXMgb2YgdGhlIGZpcnN0IHJvdyBtYXRjaGluZyB0aGUgcXVlcnkuCitJZiBAbm9ybWFsQCBjb2x1bW5zLCBAc2NhbGFyIGZ1bmN0aW9uc0AsIEBVRFRAIGZpZWxkcywgQHdyaXRldGltZUAsIEBtYXh3cml0ZXRpbWVAIG9yIEB0dGxAIGFyZSBzZWxlY3RlZCB0b2dldGhlciB3aXRoIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMsIHRoZSB2YWx1ZXMgcmV0dXJuZWQgZm9yIHRoZW0gd2lsbCBiZSB0aGUgb25lcyBvZiB0aGUgZmlyc3Qgcm93IG1hdGNoaW5nIHRoZSBxdWVyeS4KIAogQ1FMMyBkaXN0aW5ndWlzaGVzIGJldHdlZW4gYnVpbHQtaW4gYWdncmVnYXRlcyAoc28gY2FsbGVkICduYXRpdmUgYWdncmVnYXRlcycpIGFuZCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMiOiN1ZGFzLiBDUUwzIGluY2x1ZGVzIHNldmVyYWwgbmF0aXZlIGFnZ3JlZ2F0ZXMsIGRlc2NyaWJlZCBiZWxvdzoKIApAQCAtMjM3NSw3ICsyMzg2LDcgQEAKIAogV2hlcmUgcG9zc2libGUsIENhc3NhbmRyYSB3aWxsIHJlcHJlc2VudCBhbmQgYWNjZXB0IGRhdGEgdHlwZXMgaW4gdGhlaXIgbmF0aXZlIEBKU09OQCByZXByZXNlbnRhdGlvbi4gIENhc3NhbmRyYSB3aWxsIGFsc28gYWNjZXB0IHN0cmluZyByZXByZXNlbnRhdGlvbnMgbWF0Y2hpbmcgdGhlIENRTCBsaXRlcmFsIGZvcm1hdCBmb3IgYWxsIHNpbmdsZS1maWVsZCB0eXBlcy4gIEZvciBleGFtcGxlLCBmbG9hdHMsIGludHMsIFVVSURzLCBhbmQgZGF0ZXMgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IENRTCBsaXRlcmFsIHN0cmluZ3MuICBIb3dldmVyLCBjb21wb3VuZCB0eXBlcywgc3VjaCBhcyBjb2xsZWN0aW9ucywgdHVwbGVzLCBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIG11c3QgYmUgcmVwcmVzZW50ZWQgYnkgbmF0aXZlIEBKU09OQCBjb2xsZWN0aW9ucyAobWFwcyBhbmQgbGlzdHMpIG9yIGEgSlNPTi1lbmNvZGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29sbGVjdGlvbi4KIAotVGhlIGZvbGxvd2luZyB0YWJsZSBkZXNjcmliZXMgdGhlIGVuY29kaW5ncyB0aGF0IENhc3NhbmRyYSB3aWxsIGFjY2VwdCBpbiBASU5TRVJUIEpTT05AIHZhbHVlcyAoYW5kIEBmcm9tSnNvbigpQCBhcmd1bWVudHMpIGFzIHdlbGwgYXMgdGhlIGZvcm1hdCBDYXNzYW5kcmEgd2lsbCB1c2Ugd2hlbiByZXR1cm5pbmcgZGF0YSBmb3IgQFNFTEVDVCBKU09OQCBzdGF0ZW1lbnRzIChhbmQgQGZyb21Kc29uKClAKToKK1RoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSBlbmNvZGluZ3MgdGhhdCBDYXNzYW5kcmEgd2lsbCBhY2NlcHQgaW4gQElOU0VSVCBKU09OQCB2YWx1ZXMgKGFuZCBAZnJvbV9qc29uKClAIGFyZ3VtZW50cykgYXMgd2VsbCBhcyB0aGUgZm9ybWF0IENhc3NhbmRyYSB3aWxsIHVzZSB3aGVuIHJldHVybmluZyBkYXRhIGZvciBAU0VMRUNUIEpTT05AIHN0YXRlbWVudHMgKGFuZCBAZnJvbV9qc29uKClAKToKIAogfF8uIHR5cGUgICAgfF8uIGZvcm1hdHMgYWNjZXB0ZWQgICB8Xy4gcmV0dXJuIGZvcm1hdCB8Xy4gbm90ZXN8CiB8QGFzY2lpQCAgICB8c3RyaW5nICAgICAgICAgICAgICAgIHxzdHJpbmcgICAgICAgICAgIHxVc2VzIEpTT04ncyBAXHVAIGNoYXJhY3RlciBlc2NhcGV8CkBAIC0yNDAzLDEzICsyNDE0LDEzIEBACiB8QHZhcmNoYXJAICB8c3RyaW5nICAgICAgICAgICAgICAgIHxzdHJpbmcgICAgICAgICAgIHxVc2VzIEpTT04ncyBAXHVAIGNoYXJhY3RlciBlc2NhcGV8CiB8QHZhcmludEAgICB8aW50ZWdlciwgc3RyaW5nICAgICAgIHxpbnRlZ2VyICAgICAgICAgIHxWYXJpYWJsZSBsZW5ndGg7IG1heSBvdmVyZmxvdyAzMiBvciA2NCBiaXQgaW50ZWdlcnMgaW4gY2xpZW50LXNpZGUgZGVjb2RlcnwKIAotaDMoI2Zyb21Kc29uKS4gVGhlIGZyb21Kc29uKCkgRnVuY3Rpb24KK2gzKCNmcm9tX2pzb24pLiBUaGUgZnJvbV9qc29uKCkgRnVuY3Rpb24KIAotVGhlIEBmcm9tSnNvbigpQCBmdW5jdGlvbiBtYXkgYmUgdXNlZCBzaW1pbGFybHkgdG8gQElOU0VSVCBKU09OQCwgYnV0IGZvciBhIHNpbmdsZSBjb2x1bW4gdmFsdWUuICBJdCBtYXkgb25seSBiZSB1c2VkIGluIHRoZSBAVkFMVUVTQCBjbGF1c2Ugb2YgYW4gQElOU0VSVEAgc3RhdGVtZW50IG9yIGFzIG9uZSBvZiB0aGUgY29sdW1uIHZhbHVlcyBpbiBhbiBAVVBEQVRFQCwgQERFTEVURUAsIG9yIEBTRUxFQ1RAIHN0YXRlbWVudC4gIEZvciBleGFtcGxlLCBpdCBjYW5ub3QgYmUgdXNlZCBpbiB0aGUgc2VsZWN0aW9uIGNsYXVzZSBvZiBhIEBTRUxFQ1RAIHN0YXRlbWVudC4KK1RoZSBAZnJvbV9qc29uKClAIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHNpbWlsYXJseSB0byBASU5TRVJUIEpTT05ALCBidXQgZm9yIGEgc2luZ2xlIGNvbHVtbiB2YWx1ZS4gIEl0IG1heSBvbmx5IGJlIHVzZWQgaW4gdGhlIEBWQUxVRVNAIGNsYXVzZSBvZiBhbiBASU5TRVJUQCBzdGF0ZW1lbnQgb3IgYXMgb25lIG9mIHRoZSBjb2x1bW4gdmFsdWVzIGluIGFuIEBVUERBVEVALCBAREVMRVRFQCwgb3IgQFNFTEVDVEAgc3RhdGVtZW50LiAgRm9yIGV4YW1wbGUsIGl0IGNhbm5vdCBiZSB1c2VkIGluIHRoZSBzZWxlY3Rpb24gY2xhdXNlIG9mIGEgQFNFTEVDVEAgc3RhdGVtZW50LgogCi1oMygjdG9Kc29uKS4gVGhlIHRvSnNvbigpIEZ1bmN0aW9uCitoMygjdG9fanNvbikuIFRoZSB0b19qc29uKCkgRnVuY3Rpb24KIAotVGhlIEB0b0pzb24oKUAgZnVuY3Rpb24gbWF5IGJlIHVzZWQgc2ltaWxhcmx5IHRvIEBTRUxFQ1QgSlNPTkAsIGJ1dCBmb3IgYSBzaW5nbGUgY29sdW1uIHZhbHVlLiAgSXQgbWF5IG9ubHkgYmUgdXNlZCBpbiB0aGUgc2VsZWN0aW9uIGNsYXVzZSBvZiBhIEBTRUxFQ1RAIHN0YXRlbWVudC4KK1RoZSBAdG9fanNvbigpQCBmdW5jdGlvbiBtYXkgYmUgdXNlZCBzaW1pbGFybHkgdG8gQFNFTEVDVCBKU09OQCwgYnV0IGZvciBhIHNpbmdsZSBjb2x1bW4gdmFsdWUuICBJdCBtYXkgb25seSBiZSB1c2VkIGluIHRoZSBzZWxlY3Rpb24gY2xhdXNlIG9mIGEgQFNFTEVDVEAgc3RhdGVtZW50LgogCiBoMigjYXBwZW5kaXhBKS4gQXBwZW5kaXggQTogQ1FMIEtleXdvcmRzCiAKQEAgLTI0ODgsNiArMjQ5OSw3IEBACiB8IEBMSVNUQCAgICAgICAgIHwgbm8gIHwKIHwgQExPR0lOQCAgICAgICAgfCBubyAgfAogfCBATUFQQCAgICAgICAgICB8IG5vICB8Cit8IEBNQVNLRURAICAgICAgIHwgbm8gIHwKIHwgQE1BVEVSSUFMSVpFREAgfCB5ZXMgfAogfCBATUJFQU5AICAgICAgICB8IHllcyB8CiB8IEBNQkVBTlNAICAgICAgIHwgeWVzIHwKQEAgLTI1MTcsNiArMjUyOSw3IEBACiB8IEBST0xFU0AgICAgICAgIHwgbm8gIHwKIHwgQFNDSEVNQUAgICAgICAgfCB5ZXMgfAogfCBAU0VMRUNUQCAgICAgICB8IHllcyB8Cit8IEBTRUxFQ1RfTUFTS0VEQHwgbm8gIHwKIHwgQFNFVEAgICAgICAgICAgfCB5ZXMgfAogfCBAU0ZVTkNAICAgICAgICB8IG5vICB8CiB8IEBTTUFMTElOVEAgICAgIHwgbm8gIHwKQEAgLTI1MzgsNiArMjU1MSw3IEBACiB8IEBUVVBMRUAgICAgICAgIHwgbm8gIHwKIHwgQFRZUEVAICAgICAgICAgfCBubyAgfAogfCBAVU5MT0dHRURAICAgICB8IHllcyB8Cit8IEBVTk1BU0tAICAgICAgIHwgbm8gIHwKIHwgQFVOU0VUQCAgICAgICAgfCB5ZXMgfAogfCBAVVBEQVRFQCAgICAgICB8IHllcyB8CiB8IEBVU0VAICAgICAgICAgIHwgeWVzIHwKQEAgLTI1NTIsNiArMjU2Niw3IEBACiB8IEBXSEVSRUAgICAgICAgIHwgeWVzIHwKIHwgQFdJVEhAICAgICAgICAgfCB5ZXMgfAogfCBAV1JJVEVUSU1FQCAgICB8IG5vICB8Cit8IEBNQVhXUklURVRJTUVAIHwgbm8gIHwKIAogaDIoI2FwcGVuZGl4QikuIEFwcGVuZGl4IEI6IENRTCBSZXNlcnZlZCBUeXBlcwogCkBAIC0yNTcwLDYgKzI1ODUsMTEgQEAKIAogVGhlIGZvbGxvd2luZyBkZXNjcmliZXMgdGhlIGNoYW5nZXMgaW4gZWFjaCB2ZXJzaW9uIG9mIENRTC4KIAoraDMuIDMuNC43CisKKyogUmVtb3ZlIGRlcHJlY2F0ZWQgZnVuY3Rpb25zIEBkYXRlT2ZAIGFuZCBAdW5peFRpbWVzdGFtcE9mQCwgcmVwbGFjZWQgYnkgQHRvX3RpbWVzdGFtcEAgYW5kIEB0b191bml4dGltZXN0YW1wQCAoc2VlICJDQVNTQU5EUkEtMTgzMjgiOmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE4MzI4KS4KKyogQWRvcHQgc25ha2VfY2FzZSBmdW5jdGlvbiBuYW1lcywgZGVwcmVjYXRpbmcgYWxsIHByZXZpb3VzIGNhbWVsQ2FzZSBvciBhbGx0b2dldGhlcndpdGhvdXRzcGFjZXMgZnVuY3Rpb24gbmFtZXMgKHNlZSAiQ0FTU0FORFJBLTE4MDM3IjpodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xODAzNykuCisKIGgzLiAzLjQuNgogCiAqIEFkZCBzdXBwb3J0IGZvciBASUYgRVhJU1RTQCBhbmQgQElGIE5PVCBFWElTVFNAIGluIEBBTFRFUkAgc3RhdGVtZW50cyAoc2VlICJDQVNTQU5EUkEtMTY5MTYiOmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE2OTE2KS4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL1JPT1QvcGFnZXMvaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL1JPT1QvcGFnZXMvaW5kZXguYWRvYwppbmRleCA0YzdhM2ZkLi5kZDZhODRhIDEwMDY0NAotLS0gYS9kb2MvbW9kdWxlcy9ST09UL3BhZ2VzL2luZGV4LmFkb2MKKysrIGIvZG9jL21vZHVsZXMvUk9PVC9wYWdlcy9pbmRleC5hZG9jCkBAIC0xNSwyNyArMTUsMjcgQEAKIFtjb2xzPSJhLGEiXQogfD09PQogCi18IHhyZWY6Y2Fzc2FuZHJhOmdldHRpbmdfc3RhcnRlZC9pbmRleC5hZG9jW0dldHRpbmcgc3RhcnRlZF0gfCBOZXdiaWUgc3RhcnRpbmcgcG9pbnQKK3wgeHJlZjpjYXNzYW5kcmE6Z2V0dGluZy1zdGFydGVkL2luZGV4LmFkb2NbR2V0dGluZyBzdGFydGVkXSB8IE5ld2JpZSBzdGFydGluZyBwb2ludAogCi18IHhyZWY6Y2Fzc2FuZHJhOm5ldy9pbmRleC5hZG9jW1doYXQncyBuZXcgaW4gNC4xXSB8IFdoYXQncyBuZXcgaW4gQ2Fzc2FuZHJhIDQuMQorfCB4cmVmOmNhc3NhbmRyYTpuZXcvaW5kZXguYWRvY1tXaGF0J3MgbmV3IGluIDUuMF0gfCBXaGF0J3MgbmV3IGluIENhc3NhbmRyYSA1LjAKIAogfCB4cmVmOmNhc3NhbmRyYTphcmNoaXRlY3R1cmUvaW5kZXguYWRvY1tBcmNoaXRlY3R1cmVdIHwgQ2Fzc2FuZHJhJ3MgYmlnIHBpY3R1cmUKIAotfCB4cmVmOmNhc3NhbmRyYTpkYXRhX21vZGVsaW5nL2luZGV4LmFkb2NbRGF0YSBtb2RlbGluZ10gfCBIaW50OiBpdCdzIG5vdCByZWxhdGlvbmFsCit8IHhyZWY6Y2Fzc2FuZHJhOmRldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbmRleC5hZG9jW0RhdGEgbW9kZWxpbmddIHwgSGludDogaXQncyBub3QgcmVsYXRpb25hbAogCi18IHhyZWY6Y2Fzc2FuZHJhOmNxbC9pbmRleC5hZG9jW0Nhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSAoQ1FMKV0gfCBDUUwgcmVmZXJlbmNlIGRvY3VtZW50YXRpb24KK3wgeHJlZjpjYXNzYW5kcmE6ZGV2ZWxvcGluZy9jcWwvaW5kZXguYWRvY1tDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UgKENRTCldIHwgQ1FMIHJlZmVyZW5jZSBkb2N1bWVudGF0aW9uCiAKLXwgeHJlZjpjYXNzYW5kcmE6Y29uZmlndXJhdGlvbi9pbmRleC5hZG9jW0NvbmZpZ3VyYXRpb25dIHwgQ2Fzc2FuZHJhJ3MgaGFuZGxlcyBhbmQga25vYnMKK3wgeHJlZjpjYXNzYW5kcmE6Z2V0dGluZy1zdGFydGVkL2NvbmZpZ3VyYXRpb24vaW5kZXguYWRvY1tDb25maWd1cmF0aW9uXSB8IENhc3NhbmRyYSdzIGhhbmRsZXMgYW5kIGtub2JzCiAKLXwgeHJlZjpjYXNzYW5kcmE6b3BlcmF0aW5nL2luZGV4LmFkb2NbT3BlcmF0aW9uXSB8IFRoZSBvcGVyYXRvcidzIGNvcm5lcgorfCB4cmVmOmNhc3NhbmRyYTptYW5hZ2luZy9vcGVyYXRpbmcvaW5kZXguYWRvY1tPcGVyYXRpb25dIHwgVGhlIG9wZXJhdG9yJ3MgY29ybmVyCiAKLXwgeHJlZjpjYXNzYW5kcmE6dG9vbHMvaW5kZXguYWRvY1tUb29sc10gfCBjcWxzaCwgbm9kZXRvb2wsIGFuZCBvdGhlcnMKK3wgeHJlZjpjYXNzYW5kcmE6bWFuYWdpbmcvdG9vbHMvaW5kZXguYWRvY1tUb29sc10gfCBjcWxzaCwgbm9kZXRvb2wsIGFuZCBvdGhlcnMKIAogfCB4cmVmOmNhc3NhbmRyYTp0cm91Ymxlc2hvb3RpbmcvaW5kZXguYWRvY1tUcm91Ymxlc2hvb3RpbmddIHwgV2hhdCB0byBsb29rIGZvciB3aGVuIHlvdSBoYXZlIGEgcHJvYmxlbQogCi18IHhyZWY6Y2Fzc2FuZHJhOmZhcS9pbmRleC5hZG9jW0ZBUV0gfCBGcmVxdWVudGx5IGFza2VkIHF1ZXN0aW9ucworfCB4cmVmOmNhc3NhbmRyYTpvdmVydmlldy9mYXEvaW5kZXguYWRvY1tGQVFdIHwgRnJlcXVlbnRseSBhc2tlZCBxdWVzdGlvbnMKIAotfCB4cmVmOmNhc3NhbmRyYTpwbHVnaW5zL2luZGV4LmFkb2NbUGx1Zy1pbnNdIHwgVGhpcmQtcGFydHkgcGx1Zy1pbnMKK3wgeHJlZjpjYXNzYW5kcmE6aW50ZWdyYXRpbmcvcGx1Z2lucy9pbmRleC5hZG9jW1BsdWctaW5zXSB8IFRoaXJkLXBhcnR5IHBsdWctaW5zCiAKIHwgeHJlZjptYXN0ZXJAXzpST09UOm5hdGl2ZV9wcm90b2NvbC5hZG9jW05hdGl2ZSBQcm90b2NvbHNdIHwgTmF0aXZlIENhc3NhbmRyYSBwcm90b2NvbCBzcGVjaWZpY2F0aW9ucwogCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQkFTSC9nZXRfZGViX3BhY2thZ2Uuc2ggYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQkFTSC9nZXRfZGViX3BhY2thZ2Uuc2gKaW5kZXggNjk2NDhlOC4uOGMxYjA3YiAxMDA2NDQKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0JBU0gvZ2V0X2RlYl9wYWNrYWdlLnNoCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9CQVNIL2dldF9kZWJfcGFja2FnZS5zaApAQCAtMSwyICsxLDIgQEAKLSQgZWNobyAiZGViIGh0dHBzOi8vZGViaWFuLmNhc3NhbmRyYS5hcGFjaGUub3JnIDQxeCBtYWluIiB8IHN1ZG8gdGVlIC1hIC9ldGMvYXB0L3NvdXJjZXMubGlzdC5kL2Nhc3NhbmRyYS5zb3VyY2VzLmxpc3QKLWRlYiBodHRwczovL2RlYmlhbi5jYXNzYW5kcmEuYXBhY2hlLm9yZyA0MXggbWFpbgorJCBlY2hvICJkZWIgaHR0cHM6Ly9kZWJpYW4uY2Fzc2FuZHJhLmFwYWNoZS5vcmcgNDJ4IG1haW4iIHwgc3VkbyB0ZWUgLWEgL2V0Yy9hcHQvc291cmNlcy5saXN0LmQvY2Fzc2FuZHJhLnNvdXJjZXMubGlzdAorZGViIGh0dHBzOi8vZGViaWFuLmNhc3NhbmRyYS5hcGFjaGUub3JnIDQyeCBtYWluCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQk5GL2FsdGVyX3RhYmxlLmJuZiBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9CTkYvYWx0ZXJfdGFibGUuYm5mCmluZGV4IDcyOGE3OGEuLjYzM2E4YjggMTAwNjQ0Ci0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9CTkYvYWx0ZXJfdGFibGUuYm5mCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9CTkYvYWx0ZXJfdGFibGUuYm5mCkBAIC0xLDUgKzEsOCBAQAogYWx0ZXJfdGFibGVfc3RhdGVtZW50Ojo9IEFMVEVSIFRBQkxFIFsgSUYgRVhJU1RTIF0gdGFibGVfbmFtZSBhbHRlcl90YWJsZV9pbnN0cnVjdGlvbgotYWx0ZXJfdGFibGVfaW5zdHJ1Y3Rpb246Oj0gQUREIFsgSUYgTk9UIEVYSVNUUyBdIGNvbHVtbl9uYW1lIGNxbF90eXBlICggJywnIGNvbHVtbl9uYW1lIGNxbF90eXBlICkqCi0JfCBEUk9QIFsgSUYgRVhJU1RTIF0gY29sdW1uX25hbWUgKCBjb2x1bW5fbmFtZSApKgorYWx0ZXJfdGFibGVfaW5zdHJ1Y3Rpb246Oj0gQUREIFsgSUYgTk9UIEVYSVNUUyBdIGNvbHVtbl9kZWZpbml0aW9uICggJywnIGNvbHVtbl9kZWZpbml0aW9uKSoKKwl8IERST1AgWyBJRiBFWElTVFMgXSBjb2x1bW5fbmFtZSAoICcsJyBjb2x1bW5fbmFtZSApKgogCXwgUkVOQU1FIFsgSUYgRVhJU1RTIF0gY29sdW1uX25hbWUgdG8gY29sdW1uX25hbWUgKEFORCBjb2x1bW5fbmFtZSB0byBjb2x1bW5fbmFtZSkqCisJfCBBTFRFUiBbIElGIEVYSVNUUyBdIGNvbHVtbl9uYW1lICggY29sdW1uX21hc2sgfCBEUk9QIE1BU0tFRCApCiAJfCBXSVRIIG9wdGlvbnMKK2NvbHVtbl9kZWZpbml0aW9uOjo9IGNvbHVtbl9uYW1lIGNxbF90eXBlIFsgY29sdW1uX21hc2tdCitjb2x1bW5fbWFzazo6PSBNQVNLRUQgV0lUSCAoIERFRkFVTFQgfCBmdW5jdGlvbl9uYW1lICcoJyB0ZXJtICggJywnIHRlcm0gKSogJyknICkKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9CTkYvY3JlYXRlX3RhYmxlLmJuZiBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9CTkYvY3JlYXRlX3RhYmxlLmJuZgppbmRleCA4NDA1NzNjLi5lNDE3M2M4IDEwMDY0NAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQk5GL2NyZWF0ZV90YWJsZS5ibmYKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0JORi9jcmVhdGVfdGFibGUuYm5mCkBAIC0yLDExICsyLDEyIEBACiAJY29sdW1uX2RlZmluaXRpb24gICggJywnIGNvbHVtbl9kZWZpbml0aW9uICkqICAKIAlbICcsJyBQUklNQVJZIEtFWSAnKCcgcHJpbWFyeV9rZXkgJyknIF0gCiAJICcpJyBbIFdJVEggdGFibGVfb3B0aW9ucyBdIAotY29sdW1uX2RlZmluaXRpb246Oj0gY29sdW1uX25hbWUgY3FsX3R5cGUgWyBTVEFUSUMgXSBbIFBSSU1BUlkgS0VZXSAKK2NvbHVtbl9kZWZpbml0aW9uOjo9IGNvbHVtbl9uYW1lIGNxbF90eXBlIFsgU1RBVElDIF0gWyBjb2x1bW5fbWFzayBdIFsgUFJJTUFSWSBLRVldCitjb2x1bW5fbWFzazo6PSBNQVNLRUQgV0lUSCAoIERFRkFVTFQgfCBmdW5jdGlvbl9uYW1lICcoJyB0ZXJtICggJywnIHRlcm0gKSogJyknICkKIHByaW1hcnlfa2V5Ojo9IHBhcnRpdGlvbl9rZXkgWyAnLCcgY2x1c3RlcmluZ19jb2x1bW5zIF0gCiBwYXJ0aXRpb25fa2V5Ojo9IGNvbHVtbl9uYW1lICB8ICcoJyBjb2x1bW5fbmFtZSAoICcsJyBjb2x1bW5fbmFtZSApKiAnKScgCiBjbHVzdGVyaW5nX2NvbHVtbnM6Oj0gY29sdW1uX25hbWUgKCAnLCcgY29sdW1uX25hbWUgKSogCi10YWJsZV9vcHRpb25zOj06IENPTVBBQ1QgU1RPUkFHRSBbIEFORCB0YWJsZV9vcHRpb25zIF0gIAordGFibGVfb3B0aW9uczo6PSBDT01QQUNUIFNUT1JBR0UgWyBBTkQgdGFibGVfb3B0aW9ucyBdCiAJfCBDTFVTVEVSSU5HIE9SREVSIEJZICcoJyBjbHVzdGVyaW5nX29yZGVyICcpJyAKIAlbIEFORCB0YWJsZV9vcHRpb25zIF0gIHwgb3B0aW9ucwogY2x1c3RlcmluZ19vcmRlcjo6PSBjb2x1bW5fbmFtZSAoQVNDIHwgREVTQykgKCAnLCcgY29sdW1uX25hbWUgKEFTQyB8IERFU0MpICkqCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQk5GL2dyYW50X3Blcm1pc3Npb25fc3RhdGVtZW50LmJuZiBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9CTkYvZ3JhbnRfcGVybWlzc2lvbl9zdGF0ZW1lbnQuYm5mCmluZGV4IDQwZjFkZjMuLjQzYTdlZGEgMTAwNjQ0Ci0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9CTkYvZ3JhbnRfcGVybWlzc2lvbl9zdGF0ZW1lbnQuYm5mCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9CTkYvZ3JhbnRfcGVybWlzc2lvbl9zdGF0ZW1lbnQuYm5mCkBAIC0xLDYgKzEsNiBAQAogZ3JhbnRfcGVybWlzc2lvbl9zdGF0ZW1lbnQgOjo9IEdSQU5UIHBlcm1pc3Npb25zIE9OIHJlc291cmNlIFRPIHJvbGVfbmFtZQogcGVybWlzc2lvbnMgOjo9IEFMTCBbIFBFUk1JU1NJT05TIF0gfCBwZXJtaXNzaW9uIFsgUEVSTUlTU0lPTiBdCi1wZXJtaXNzaW9uIDo6PSBDUkVBVEUgfCBBTFRFUiB8IERST1AgfCBTRUxFQ1QgfCBNT0RJRlkgfCBBVVRIT1JJWkUgfCBERVNDUklCRSB8IEVYRUNVVEUKK3Blcm1pc3Npb24gOjo9IENSRUFURSB8IEFMVEVSIHwgRFJPUCB8IFNFTEVDVCB8IE1PRElGWSB8IEFVVEhPUklaRSB8IERFU0NSSUJFIHwgRVhFQ1VURSB8IFVOTUFTSyB8IFNFTEVDVF9NQVNLRUQKIHJlc291cmNlIDo6PSAgICBBTEwgS0VZU1BBQ0VTCiAgICAgICAgICAgICAgICAgfCBLRVlTUEFDRSBrZXlzcGFjZV9uYW1lCiAgICAgICAgICAgICAgICAgfCBbIFRBQkxFIF0gdGFibGVfbmFtZQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9hcy5jcWwgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2FzLmNxbAppbmRleCBhOGI5ZjAzLi43MjcwNTI2IDEwMDY0NAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2FzLmNxbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2FzLmNxbApAQCAtMSwxMiArMSwxMiBAQAogLy8gV2l0aG91dCBhbGlhcwotU0VMRUNUIGludEFzQmxvYig0KSBGUk9NIHQ7CitTRUxFQ1QgaW50X2FzX2Jsb2IoNCkgRlJPTSB0OwogCi0vLyAgaW50QXNCbG9iKDQpCi0vLyAtLS0tLS0tLS0tLS0tLQorLy8gIGludF9hc19ibG9iKDQpCisvLyAtLS0tLS0tLS0tLS0tLS0tCiAvLyAgMHgwMDAwMDAwNAogCiAvLyBXaXRoIGFsaWFzCi1TRUxFQ1QgaW50QXNCbG9iKDQpIEFTIGZvdXIgRlJPTSB0OworU0VMRUNUIGludF9hc19ibG9iKDQpIEFTIGZvdXIgRlJPTSB0OwogCiAvLyAgZm91cgogLy8gLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2F2Z193aXRoX2Nhc3QuY3FsIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9hdmdfd2l0aF9jYXN0LmNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTgzOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9hdmdfd2l0aF9jYXN0LmNxbApAQCAtMCwwICsxIEBACitTRUxFQ1QgQVZHIChDQVNUIChwbGF5ZXJzIEFTIEZMT0FUKSkgRlJPTSBwbGF5czsKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvY3VycmVudF9kYXRlLmNxbCBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvY3VycmVudF9kYXRlLmNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODJmYjgwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9jdXJyZW50X2RhdGUuY3FsCkBAIC0wLDAgKzEgQEAKK1NFTEVDVCAqIEZST00gbXlUYWJsZSBXSEVSRSBkYXRlID49IGN1cnJlbnRfZGF0ZSgpIC0gMmQ7CmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2N1cnJlbnRkYXRlLmNxbCBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvY3VycmVudGRhdGUuY3FsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmVkMWIyLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvY3VycmVudGRhdGUuY3FsCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotU0VMRUNUICogRlJPTSBteVRhYmxlIFdIRVJFIGRhdGUgPj0gY3VycmVudERhdGUoKSAtIDJkOwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fYWx0ZXJfbWFzay5jcWwgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9hbHRlcl9tYXNrLmNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTEwMzA4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fYWx0ZXJfbWFzay5jcWwKQEAgLTAsMCArMSBAQAorQUxURVIgVEFCTEUgcGF0aWVudHMgQUxURVIgbmFtZSBNQVNLRUQgV0lUSCBtYXNrX2RlZmF1bHQoKTsKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX2NyZWF0ZV90YWJsZS5jcWwgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9jcmVhdGVfdGFibGUuY3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YmE1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9jcmVhdGVfdGFibGUuY3FsCkBAIC0wLDAgKzEsNSBAQAorQ1JFQVRFIFRBQkxFIHBhdGllbnRzICgKKyAgIGlkIHRpbWV1dWlkIFBSSU1BUlkgS0VZLAorICAgbmFtZSB0ZXh0IE1BU0tFRCBXSVRIIG1hc2tfaW5uZXIoMSwgbnVsbCksCisgICBiaXJ0aCBkYXRlIE1BU0tFRCBXSVRIIG1hc2tfZGVmYXVsdCgpCispOwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fY3JlYXRlX3RhYmxlX3dpdGhfdWRmLmNxbCBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX2NyZWF0ZV90YWJsZV93aXRoX3VkZi5jcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkYjQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX2NyZWF0ZV90YWJsZV93aXRoX3VkZi5jcWwKQEAgLTAsMCArMSwxMSBAQAorQ1JFQVRFIEZVTkNUSU9OIHJlZGFjdChpbnB1dCB0ZXh0KQorICAgQ0FMTEVEIE9OIE5VTEwgSU5QVVQKKyAgIFJFVFVSTlMgdGV4dAorICAgTEFOR1VBR0UgamF2YQorICAgQVMgJ3JldHVybiAicmVkYWN0ZWQiOworCitDUkVBVEUgVEFCTEUgcGF0aWVudHMgKAorICAgaWQgdGltZXV1aWQgUFJJTUFSWSBLRVksCisgICBuYW1lIHRleHQgTUFTS0VEIFdJVEggcmVkYWN0KCksCisgICBiaXJ0aCBkYXRlCispOwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fY3JlYXRlX3VzZXJzLmNxbCBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX2NyZWF0ZV91c2Vycy5jcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2NmExYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX2NyZWF0ZV91c2Vycy5jcWwKQEAgLTAsMCArMSw2IEBACitDUkVBVEUgVVNFUiBwcml2aWxlZ2VkIFdJVEggUEFTU1dPUkQgJ3h5eic7CitHUkFOVCBTRUxFQ1QgT04gVEFCTEUgcGF0aWVudHMgVE8gcHJpdmlsZWdlZDsKK0dSQU5UIFVOTUFTSyBPTiBUQUJMRSBwYXRpZW50cyBUTyBwcml2aWxlZ2VkOworCitDUkVBVEUgVVNFUiB1bnByaXZpbGVnZWQgV0lUSCBQQVNTV09SRCAneHl6JzsKK0dSQU5UIFNFTEVDVCBPTiBUQUJMRSBwYXRpZW50cyBUTyB1bnByaXZpbGVnZWQ7CmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9kcm9wX21hc2suY3FsIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fZHJvcF9tYXNrLmNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmUwMzJjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fZHJvcF9tYXNrLmNxbApAQCAtMCwwICsxIEBACitBTFRFUiBUQUJMRSBwYXRpZW50cyBBTFRFUiBuYW1lIERST1AgTUFTS0VEOwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1faW5zZXJ0X2RhdGEuY3FsIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1faW5zZXJ0X2RhdGEuY3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTkxNmYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9pbnNlcnRfZGF0YS5jcWwKQEAgLTAsMCArMSwyIEBACitJTlNFUlQgSU5UTyBwYXRpZW50cyhpZCwgbmFtZSwgYmlydGgpIFZBTFVFUyAobm93KCksICdhbGljZScsICcxOTg0LTAxLTAyJyk7CitJTlNFUlQgSU5UTyBwYXRpZW50cyhpZCwgbmFtZSwgYmlydGgpIFZBTFVFUyAobm93KCksICdib2InLCAnMTk4Mi0wMi0wMycpOwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fcmV2b2tlX3VubWFzay5jcWwgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9yZXZva2VfdW5tYXNrLmNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2UyYjkwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fcmV2b2tlX3VubWFzay5jcWwKQEAgLTAsMCArMSBAQAorUkVWT0tFIFVOTUFTSyBPTiBUQUJMRSBwYXRpZW50cyBGUk9NIHByaXZpbGVnZWQ7CmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9zZWxlY3Rfd2l0aF9tYXNrZWRfY29sdW1ucy5jcWwgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9zZWxlY3Rfd2l0aF9tYXNrZWRfY29sdW1ucy5jcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjZDA2NgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX3NlbGVjdF93aXRoX21hc2tlZF9jb2x1bW5zLmNxbApAQCAtMCwwICsxLDYgQEAKK1NFTEVDVCBuYW1lLCBiaXJ0aCBGUk9NIHBhdGllbnRzOworCisvLyAgbmFtZSAgfCBiaXJ0aAorLy8gLS0tLS0tLSstLS0tLS0tLS0tLS0KKy8vICBhKioqKiB8IDE5NzAtMDEtMDEKKy8vICAgIGIqKiB8IDE5NzAtMDEtMDEKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX3NlbGVjdF93aXRoX3NlbGVjdF9tYXNrZWQuY3FsIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fc2VsZWN0X3dpdGhfc2VsZWN0X21hc2tlZC5jcWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5Mzg1NQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX3NlbGVjdF93aXRoX3NlbGVjdF9tYXNrZWQuY3FsCkBAIC0wLDAgKzEsOCBAQAorQ1JFQVRFIFVTRVIgdHJ1c3RlZF91c2VyIFdJVEggUEFTU1dPUkQgJ3h5eic7CitHUkFOVCBTRUxFQ1QsIFNFTEVDVF9NQVNLRUQgT04gVEFCTEUgcGF0aWVudHMgVE8gdHJ1c3RlZF91c2VyOworTE9HSU4gdHJ1c3RlZF91c2VyCitTRUxFQ1QgbmFtZSwgYmlydGggRlJPTSBwYXRpZW50cyBXSEVSRSBuYW1lID0gJ0FsaWNlJyBBTExPVyBGSUxURVJJTkc7CisKKy8vICBuYW1lICB8IGJpcnRoCisvLyAtLS0tLS0tKy0tLS0tLS0tLS0tLQorLy8gIGEqKioqIHwgMTk3MC0wMS0wMQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fc2VsZWN0X3dpdGhfdW5tYXNrX3Blcm1pc3Npb24uY3FsIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fc2VsZWN0X3dpdGhfdW5tYXNrX3Blcm1pc3Npb24uY3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDcyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9zZWxlY3Rfd2l0aF91bm1hc2tfcGVybWlzc2lvbi5jcWwKQEAgLTAsMCArMSw3IEBACitMT0dJTiBwcml2aWxlZ2VkCitTRUxFQ1QgbmFtZSwgYmlydGggRlJPTSBwYXRpZW50czsKKworLy8gIG5hbWUgIHwgYmlydGgKKy8vIC0tLS0tLS0rLS0tLS0tLS0tLS0tCisvLyAgYWxpY2UgfCAxOTg0LTAxLTAyCisvLyAgICBib2IgfCAxOTgyLTAyLTAzCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9zZWxlY3Rfd2l0aG91dF9zZWxlY3RfbWFza2VkLmNxbCBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX3NlbGVjdF93aXRob3V0X3NlbGVjdF9tYXNrZWQuY3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMTVjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML2RkbV9zZWxlY3Rfd2l0aG91dF9zZWxlY3RfbWFza2VkLmNxbApAQCAtMCwwICsxLDYgQEAKK0NSRUFURSBVU0VSIHVudHJ1c3RlZF91c2VyIFdJVEggUEFTU1dPUkQgJ3h5eic7CitHUkFOVCBTRUxFQ1QgT04gVEFCTEUgcGF0aWVudHMgVE8gdW50cnVzdGVkX3VzZXI7CitMT0dJTiB1bnRydXN0ZWRfdXNlcgorU0VMRUNUIG5hbWUsIGJpcnRoIEZST00gcGF0aWVudHMgV0hFUkUgbmFtZSA9ICdBbGljZScgQUxMT1cgRklMVEVSSU5HOworCisvLyBVbmF1dGhvcml6ZWQ6IEVycm9yIGZyb20gc2VydmVyOiBjb2RlPTIxMDAgW1VuYXV0aG9yaXplZF0gbWVzc2FnZT0iVXNlciB1bnRydXN0ZWRfdXNlciBoYXMgbm8gVU5NQVNLIG5vciBTRUxFQ1RfVU5NQVNLIHBlcm1pc3Npb24gb24gdGFibGUgay5wYXRpZW50cyIKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX3NlbGVjdF93aXRob3V0X3VubWFza19wZXJtaXNzaW9uLmNxbCBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvZGRtX3NlbGVjdF93aXRob3V0X3VubWFza19wZXJtaXNzaW9uLmNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjgwYjgzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9kZG1fc2VsZWN0X3dpdGhvdXRfdW5tYXNrX3Blcm1pc3Npb24uY3FsCkBAIC0wLDAgKzEsNyBAQAorTE9HSU4gdW5wcml2aWxlZ2VkCitTRUxFQ1QgbmFtZSwgYmlydGggRlJPTSBwYXRpZW50czsKKworLy8gIG5hbWUgIHwgYmlydGgKKy8vIC0tLS0tLS0rLS0tLS0tLS0tLS0tCisvLyAgYSoqKiogfCAxOTcwLTAxLTAxCisvLyAgICBiKiogfCAxOTcwLTAxLTAxCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML3NlbGVjdF93aXRoX21hc2tfZnVuY3Rpb25zLmNxbCBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvc2VsZWN0X3dpdGhfbWFza19mdW5jdGlvbnMuY3FsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OTIzZmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML3NlbGVjdF93aXRoX21hc2tfZnVuY3Rpb25zLmNxbApAQCAtMCwwICsxLDE1IEBACitDUkVBVEUgVEFCTEUgcGF0aWVudHMgKAorICAgaWQgdGltZXV1aWQgUFJJTUFSWSBLRVksCisgICBuYW1lIHRleHQsCisgICBiaXJ0aCBkYXRlCispOworCitJTlNFUlQgSU5UTyBwYXRpZW50cyhpZCwgbmFtZSwgYmlydGgpIFZBTFVFUyAobm93KCksICdhbGljZScsICcxOTgyLTAxLTAyJyk7CitJTlNFUlQgSU5UTyBwYXRpZW50cyhpZCwgbmFtZSwgYmlydGgpIFZBTFVFUyAobm93KCksICdib2InLCAnMTk4Mi0wMS0wMicpOworCitTRUxFQ1QgbWFza19pbm5lcihuYW1lLCAxLCBudWxsKSwgbWFza19kZWZhdWx0KGJpcnRoKSBGUk9NIHBhdGllbnRzOworCisvLyAgIHN5c3RlbS5tYXNrX2lubmVyKG5hbWUsIDEsIE5VTEwpIHwgc3lzdGVtLm1hc2tfZGVmYXVsdChiaXJ0aCkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiKiogfCAgICAgICAgICAgICAgICAgMTk3MC0wMS0wMQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhKioqKiB8ICAgICAgICAgICAgICAgICAxOTcwLTAxLTAxCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML3N1bV93aXRoX2Nhc3QuY3FsIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9zdW1fd2l0aF9jYXN0LmNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjYxZGYxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC9zdW1fd2l0aF9jYXN0LmNxbApAQCAtMCwwICsxIEBACitTRUxFQ1QgU1VNIChDQVNUIChwbGF5ZXJzIEFTIFZBUklOVCkpIEZST00gcGxheXM7CmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML3RpbWV1dWlkX21pbl9tYXguY3FsIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL0NRTC90aW1ldXVpZF9taW5fbWF4LmNxbAppbmRleCA4MTM1M2Y1Li41YTFmYzUxIDEwMDY0NAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvQ1FML3RpbWV1dWlkX21pbl9tYXguY3FsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9DUUwvdGltZXV1aWRfbWluX21heC5jcWwKQEAgLTEsMyArMSwzIEBACiBTRUxFQ1QgKiBGUk9NIG15VGFibGUKLSBXSEVSRSB0ID4gbWF4VGltZXV1aWQoJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCcpCi0gICBBTkQgdCA8IG1pblRpbWV1dWlkKCcyMDEzLTAyLTAyIDEwOjAwKzAwMDAnKTsKKyBXSEVSRSB0ID4gbWF4X3RpbWV1dWlkKCcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnKQorICAgQU5EIHQgPCBtaW5fdGltZXV1aWQoJzIwMTMtMDItMDIgMTA6MDArMDAwMCcpOwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL1JFU1VMVFMvYWRkX3l1bV9yZXBvLnJlc3VsdCBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9leGFtcGxlcy9SRVNVTFRTL2FkZF95dW1fcmVwby5yZXN1bHQKaW5kZXggNmZlNzA0YS4uNGIxODhlMSAxMDA2NDQKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL2V4YW1wbGVzL1JFU1VMVFMvYWRkX3l1bV9yZXBvLnJlc3VsdAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvZXhhbXBsZXMvUkVTVUxUUy9hZGRfeXVtX3JlcG8ucmVzdWx0CkBAIC0xLDYgKzEsNiBAQAogW2Nhc3NhbmRyYV0KIG5hbWU9QXBhY2hlIENhc3NhbmRyYQotYmFzZXVybD1odHRwczovL3JlZGhhdC5jYXNzYW5kcmEuYXBhY2hlLm9yZy80MXgvCitiYXNldXJsPWh0dHBzOi8vcmVkaGF0LmNhc3NhbmRyYS5hcGFjaGUub3JnLzQyeC8KIGdwZ2NoZWNrPTEKIHJlcG9fZ3BnY2hlY2s9MQogZ3Bna2V5PWh0dHBzOi8vZG93bmxvYWRzLmFwYWNoZS5vcmcvY2Fzc2FuZHJhL0tFWVMKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9uYXYuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9uYXYuYWRvYwppbmRleCA0ODQ5YWJiLi4yYjYzYmNmIDEwMDY0NAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvbmF2LmFkb2MKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL25hdi5hZG9jCkBAIC0xLDg2ICsxLDg2IEBACiAqIENhc3NhbmRyYQotKiogeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvaW5kZXguYWRvY1tHZXR0aW5nIFN0YXJ0ZWRdCQotKioqIHhyZWY6Z2V0dGluZ19zdGFydGVkL2luc3RhbGxpbmcuYWRvY1tJbnN0YWxsaW5nIENhc3NhbmRyYV0KLSoqKiB4cmVmOmdldHRpbmdfc3RhcnRlZC9jb25maWd1cmluZy5hZG9jW0NvbmZpZ3VyaW5nIENhc3NhbmRyYV0KLSoqKiB4cmVmOmdldHRpbmdfc3RhcnRlZC9xdWVyeWluZy5hZG9jW0luc2VydGluZyBhbmQgcXVlcnlpbmddCi0qKiogeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvZHJpdmVycy5hZG9jW0NsaWVudCBkcml2ZXJzXQotKioqIHhyZWY6Z2V0dGluZ19zdGFydGVkL2phdmExMS5hZG9jW1N1cHBvcnQgZm9yIEphdmEgMTFdCi0qKiogeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvcHJvZHVjdGlvbi5hZG9jW1Byb2R1Y3Rpb24gcmVjb21tZW5kYXRpb25zXQorKiogeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvaW5kZXguYWRvY1tHZXR0aW5nIFN0YXJ0ZWRdCQorKioqIHhyZWY6aW5zdGFsbGluZy9pbnN0YWxsaW5nLmFkb2NbSW5zdGFsbGluZyBDYXNzYW5kcmFdCisqKiogeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvY29uZmlndXJpbmcuYWRvY1tDb25maWd1cmluZyBDYXNzYW5kcmFdCisqKiogeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvcXVlcnlpbmcuYWRvY1tJbnNlcnRpbmcgYW5kIHF1ZXJ5aW5nXQorKioqIHhyZWY6Z2V0dGluZy1zdGFydGVkL2RyaXZlcnMuYWRvY1tDbGllbnQgZHJpdmVyc10KKyoqKiB4cmVmOmdldHRpbmctc3RhcnRlZC9qYXZhMTEuYWRvY1tTdXBwb3J0IGZvciBKYXZhIDExXQorKioqIHhyZWY6Z2V0dGluZy1zdGFydGVkL3Byb2R1Y3Rpb24uYWRvY1tQcm9kdWN0aW9uIHJlY29tbWVuZGF0aW9uc10KIAogKiogeHJlZjpuZXcvaW5kZXguYWRvY1tXaGF0J3MgbmV3XQogCiAqKiB4cmVmOmFyY2hpdGVjdHVyZS9pbmRleC5hZG9jW0FyY2hpdGVjdHVyZV0KICoqKiB4cmVmOmFyY2hpdGVjdHVyZS9vdmVydmlldy5hZG9jW092ZXJ2aWV3XQogKioqIHhyZWY6YXJjaGl0ZWN0dXJlL2R5bmFtby5hZG9jW0R5bmFtb10JCQotKioqIHhyZWY6YXJjaGl0ZWN0dXJlL3N0b3JhZ2VfZW5naW5lLmFkb2NbU3RvcmFnZSBlbmdpbmVdCisqKiogeHJlZjphcmNoaXRlY3R1cmUvc3RvcmFnZS1lbmdpbmUuYWRvY1tTdG9yYWdlIGVuZ2luZV0KICoqKiB4cmVmOmFyY2hpdGVjdHVyZS9ndWFyYW50ZWVzLmFkb2NbR3VhcmFudGVlc10KICoqKiB4cmVmOmFyY2hpdGVjdHVyZS9tZXNzYWdpbmcuYWRvY1tJbXByb3ZlZCBpbnRlcm5vZGUgbWVzc2FnaW5nXQogKioqIHhyZWY6YXJjaGl0ZWN0dXJlL3N0cmVhbWluZy5hZG9jW0ltcHJvdmVkIHN0cmVhbWluZ10KIAotKiogeHJlZjpkYXRhX21vZGVsaW5nL2luZGV4LmFkb2NbRGF0YSBtb2RlbGluZ10KLSoqKiB4cmVmOmRhdGFfbW9kZWxpbmcvaW50cm8uYWRvY1tJbnRyb2R1Y3Rpb25dCi0qKiogeHJlZjpkYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfY29uY2VwdHVhbC5hZG9jW0NvbmNlcHR1YWwgZGF0YSBtb2RlbGluZ10KLSoqKiB4cmVmOmRhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19yZGJtcy5hZG9jW1JEQk1TIGRlc2lnbl0KLSoqKiB4cmVmOmRhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19xdWVyaWVzLmFkb2NbRGVmaW5pbmcgYXBwbGljYXRpb24gcXVlcmllc10KLSoqKiB4cmVmOmRhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19sb2dpY2FsLmFkb2NbTG9naWNhbCBkYXRhIG1vZGVsaW5nXQotKioqIHhyZWY6ZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3BoeXNpY2FsLmFkb2NbUGh5c2ljYWwgZGF0YSBtb2RlbGluZ10KLSoqKiB4cmVmOmRhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19yZWZpbmluZy5hZG9jW0V2YWx1YXRpbmcgYW5kIHJlZmluaW5nIGRhdGEgbW9kZWxzXQotKioqIHhyZWY6ZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3NjaGVtYS5hZG9jW0RlZmluaW5nIGRhdGFiYXNlIHNjaGVtYV0KLSoqKiB4cmVmOmRhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ190b29scy5hZG9jW0Nhc3NhbmRyYSBkYXRhIG1vZGVsaW5nIHRvb2xzXQorKiogeHJlZjpkZXZlbG9waW5nOmRhdGEtbW9kZWxpbmcvaW5kZXguYWRvY1tEYXRhIG1vZGVsaW5nXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpkYXRhLW1vZGVsaW5nL2ludHJvLmFkb2NbSW50cm9kdWN0aW9uXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpkYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfY29uY2VwdHVhbC5hZG9jW0NvbmNlcHR1YWwgZGF0YSBtb2RlbGluZ10KKyoqKiB4cmVmOmRldmVsb3Bpbmc6ZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3JkYm1zLmFkb2NbUkRCTVMgZGVzaWduXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpkYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfcXVlcmllcy5hZG9jW0RlZmluaW5nIGFwcGxpY2F0aW9uIHF1ZXJpZXNdCisqKiogeHJlZjpkZXZlbG9waW5nOmRhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19sb2dpY2FsLmFkb2NbTG9naWNhbCBkYXRhIG1vZGVsaW5nXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpkYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfcGh5c2ljYWwuYWRvY1tQaHlzaWNhbCBkYXRhIG1vZGVsaW5nXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpkYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfcmVmaW5pbmcuYWRvY1tFdmFsdWF0aW5nIGFuZCByZWZpbmluZyBkYXRhIG1vZGVsc10KKyoqKiB4cmVmOmRldmVsb3Bpbmc6ZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3NjaGVtYS5hZG9jW0RlZmluaW5nIGRhdGFiYXNlIHNjaGVtYV0KKyoqKiB4cmVmOmRldmVsb3Bpbmc6ZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3Rvb2xzLmFkb2NbQ2Fzc2FuZHJhIGRhdGEgbW9kZWxpbmcgdG9vbHNdCiAKLSoqIHhyZWY6Y3FsL2luZGV4LmFkb2NbQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlIChDUUwpXQotKioqIHhyZWY6Y3FsL2RlZmluaXRpb25zLmFkb2NbRGVmaW5pdGlvbnNdCi0qKiogeHJlZjpjcWwvdHlwZXMuYWRvY1tEYXRhIHR5cGVzXQotKioqIHhyZWY6Y3FsL2RkbC5hZG9jW0RhdGEgZGVmaW5pdGlvbiAoRERMKV0KLSoqKiB4cmVmOmNxbC9kbWwuYWRvY1tEYXRhIG1hbmlwdWxhdGlvbiAoRE1MKV0KLSoqKiB4cmVmOmNxbC9vcGVyYXRvcnMuYWRvY1tPcGVyYXRvcnNdCi0qKiogeHJlZjpjcWwvaW5kZXhlcy5hZG9jW1NlY29uZGFyeSBpbmRleGVzXQotKioqIHhyZWY6Y3FsL212cy5hZG9jW01hdGVyaWFsaXplZCB2aWV3c10KLSoqKiB4cmVmOmNxbC9mdW5jdGlvbnMuYWRvY1tGdW5jdGlvbnNdCi0qKiogeHJlZjpjcWwvanNvbi5hZG9jW0pTT05dCi0qKiogeHJlZjpjcWwvc2VjdXJpdHkuYWRvY1tTZWN1cml0eV0KLSoqKiB4cmVmOmNxbC90cmlnZ2Vycy5hZG9jW1RyaWdnZXJzXQotKioqIHhyZWY6Y3FsL2FwcGVuZGljZXMuYWRvY1tBcHBlbmRpY2VzXQotKioqIHhyZWY6Y3FsL2NoYW5nZXMuYWRvY1tDaGFuZ2VzXQotKioqIHhyZWY6Y3FsL1NBU0kuYWRvY1tTQVNJXQotKioqIHhyZWY6Y3FsL2NxbF9zaW5nbGVmaWxlLmFkb2NbU2luZ2xlIGZpbGUgb2YgQ1FMIGluZm9ybWF0aW9uXQorKiogeHJlZjpkZXZlbG9waW5nOmNxbC9pbmRleC5hZG9jW0Nhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSAoQ1FMKV0KKyoqKiB4cmVmOmRldmVsb3Bpbmc6Y3FsL2RlZmluaXRpb25zLmFkb2NbRGVmaW5pdGlvbnNdCisqKiogeHJlZjpkZXZlbG9waW5nOmNxbC90eXBlcy5hZG9jW0RhdGEgdHlwZXNdCisqKiogeHJlZjpkZXZlbG9waW5nOmNxbC9kZGwuYWRvY1tEYXRhIGRlZmluaXRpb24gKERETCldCisqKiogeHJlZjpkZXZlbG9waW5nOmNxbC9kbWwuYWRvY1tEYXRhIG1hbmlwdWxhdGlvbiAoRE1MKV0KKyoqKiB4cmVmOmRldmVsb3Bpbmc6Y3FsL29wZXJhdG9ycy5hZG9jW09wZXJhdG9yc10KKyoqKiB4cmVmOmRldmVsb3Bpbmc6Y3FsL2luZGV4ZXMuYWRvY1tTZWNvbmRhcnkgaW5kZXhlc10KKyoqKiB4cmVmOmRldmVsb3Bpbmc6Y3FsL212cy5hZG9jW01hdGVyaWFsaXplZCB2aWV3c10KKyoqKiB4cmVmOmRldmVsb3Bpbmc6Y3FsL2Z1bmN0aW9ucy5hZG9jW0Z1bmN0aW9uc10KKyoqKiB4cmVmOmRldmVsb3Bpbmc6Y3FsL2pzb24uYWRvY1tKU09OXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpjcWwvc2VjdXJpdHkuYWRvY1tTZWN1cml0eV0KKyoqKiB4cmVmOmRldmVsb3Bpbmc6Y3FsL3RyaWdnZXJzLmFkb2NbVHJpZ2dlcnNdCisqKiogeHJlZjpkZXZlbG9waW5nOmNxbC9hcHBlbmRpY2VzLmFkb2NbQXBwZW5kaWNlc10KKyoqKiB4cmVmOmRldmVsb3Bpbmc6Y3FsL2NoYW5nZXMuYWRvY1tDaGFuZ2VzXQorKioqIHhyZWY6ZGV2ZWxvcGluZzpjcWwvU0FTSS5hZG9jW1NBU0ldCisqKiogeHJlZjpkZXZlbG9waW5nOmNxbC9jcWxfc2luZ2xlZmlsZS5hZG9jW1NpbmdsZSBmaWxlIG9mIENRTCBpbmZvcm1hdGlvbl0KIAotKiogeHJlZjpjb25maWd1cmF0aW9uL2luZGV4LmFkb2NbQ29uZmlndXJhdGlvbl0KLSoqKiB4cmVmOmNvbmZpZ3VyYXRpb24vY2Fzc195YW1sX2ZpbGUuYWRvY1tjYXNzYW5kcmEueWFtbF0KLSoqKiB4cmVmOmNvbmZpZ3VyYXRpb24vY2Fzc19yYWNrZGNfZmlsZS5hZG9jW2Nhc3NhbmRyYS1yYWNrZGMucHJvcGVydGllc10KLSoqKiB4cmVmOmNvbmZpZ3VyYXRpb24vY2Fzc19lbnZfc2hfZmlsZS5hZG9jW2Nhc3NhbmRyYS1lbnYuc2hdCi0qKiogeHJlZjpjb25maWd1cmF0aW9uL2Nhc3NfdG9wb19maWxlLmFkb2NbY2Fzc2FuZHJhLXRvcG9sb2dpZXMucHJvcGVydGllc10KLSoqKiB4cmVmOmNvbmZpZ3VyYXRpb24vY2Fzc19jbF9hcmNoaXZlX2ZpbGUuYWRvY1tjb21taXRsb2ctYXJjaGl2aW5nLnByb3BlcnRpZXNdCi0qKiogeHJlZjpjb25maWd1cmF0aW9uL2Nhc3NfbG9nYmFja194bWxfZmlsZS5hZG9jW2xvZ2JhY2sueG1sXQotKioqIHhyZWY6Y29uZmlndXJhdGlvbi9jYXNzX2p2bV9vcHRpb25zX2ZpbGUuYWRvY1tqdm0tKiBmaWxlc10KLSoqKiB4cmVmOmNvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5hZG9jW0xpYmVyYXRpbmcgY2Fzc2FuZHJhLnlhbWwgUGFyYW1ldGVycycgTmFtZXMgZnJvbSBUaGVpciBVbml0c10KKyoqIHhyZWY6bWFuYWdpbmc6Y29uZmlndXJhdGlvbi9pbmRleC5hZG9jW0NvbmZpZ3VyYXRpb25dCisqKiogeHJlZjptYW5hZ2luZzpjb25maWd1cmF0aW9uL2Nhc3NfeWFtbF9maWxlLmFkb2NbY2Fzc2FuZHJhLnlhbWxdCisqKiogeHJlZjptYW5hZ2luZzpjb25maWd1cmF0aW9uL2Nhc3NfcmFja2RjX2ZpbGUuYWRvY1tjYXNzYW5kcmEtcmFja2RjLnByb3BlcnRpZXNdCisqKiogeHJlZjptYW5hZ2luZzpjb25maWd1cmF0aW9uL2Nhc3NfZW52X3NoX2ZpbGUuYWRvY1tjYXNzYW5kcmEtZW52LnNoXQorKioqIHhyZWY6bWFuYWdpbmc6Y29uZmlndXJhdGlvbi9jYXNzX3RvcG9fZmlsZS5hZG9jW2Nhc3NhbmRyYS10b3BvbG9naWVzLnByb3BlcnRpZXNdCisqKiogeHJlZjptYW5hZ2luZzpjb25maWd1cmF0aW9uL2Nhc3NfY2xfYXJjaGl2ZV9maWxlLmFkb2NbY29tbWl0bG9nLWFyY2hpdmluZy5wcm9wZXJ0aWVzXQorKioqIHhyZWY6bWFuYWdpbmc6Y29uZmlndXJhdGlvbi9jYXNzX2xvZ2JhY2tfeG1sX2ZpbGUuYWRvY1tsb2diYWNrLnhtbF0KKyoqKiB4cmVmOm1hbmFnaW5nOmNvbmZpZ3VyYXRpb24vY2Fzc19qdm1fb3B0aW9uc19maWxlLmFkb2NbanZtLSogZmlsZXNdCisqKiogeHJlZjptYW5hZ2luZzpjb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24uYWRvY1tMaWJlcmF0aW5nIGNhc3NhbmRyYS55YW1sIFBhcmFtZXRlcnMnIE5hbWVzIGZyb20gVGhlaXIgVW5pdHNdCiAKLSoqIHhyZWY6b3BlcmF0aW5nL2luZGV4LmFkb2NbT3BlcmF0aW5nXQotKioqIHhyZWY6b3BlcmF0aW5nL3NuaXRjaC5hZG9jW1NuaXRjaGVzXQotKioqIHhyZWY6b3BlcmF0aW5nL3RvcG9fY2hhbmdlcy5hZG9jW1RvcG9sb2d5IGNoYW5nZXNdCi0qKiogeHJlZjpvcGVyYXRpbmcvcmVwYWlyLmFkb2NbUmVwYWlyXQotKioqIHhyZWY6b3BlcmF0aW5nL3JlYWRfcmVwYWlyLmFkb2NbUmVhZCByZXBhaXJdCi0qKiogeHJlZjpvcGVyYXRpbmcvaGludHMuYWRvY1tIaW50c10KLSoqKiB4cmVmOm9wZXJhdGluZy9ibG9vbV9maWx0ZXJzLmFkb2NbQmxvb20gZmlsdGVyc10KLSoqKiB4cmVmOm9wZXJhdGluZy9jb21wcmVzc2lvbi5hZG9jW0NvbXByZXNzaW9uXQotKioqIHhyZWY6b3BlcmF0aW5nL2NkYy5hZG9jW0NoYW5nZSBEYXRhIENhcHR1cmUgKENEQyldCi0qKiogeHJlZjpvcGVyYXRpbmcvYmFja3Vwcy5hZG9jW0JhY2t1cHNdCi0qKiogeHJlZjpvcGVyYXRpbmcvYnVsa19sb2FkaW5nLmFkb2NbQnVsayBsb2FkaW5nXQotKioqIHhyZWY6b3BlcmF0aW5nL21ldHJpY3MuYWRvY1tNZXRyaWNzXQotKioqIHhyZWY6b3BlcmF0aW5nL3NlY3VyaXR5LmFkb2NbU2VjdXJpdHldCi0qKiogeHJlZjpvcGVyYXRpbmcvaGFyZHdhcmUuYWRvY1tIYXJkd2FyZV0KLSoqKiB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL2luZGV4LmFkb2NbQ29tcGFjdGlvbl0KLSoqKiB4cmVmOm9wZXJhdGluZy92aXJ0dWFsdGFibGVzLmFkb2NbVmlydHVhbCB0YWJsZXNdCi0qKiogeHJlZjpvcGVyYXRpbmcvYXVkaXRsb2dnaW5nLmFkb2NbQXVkaXQgbG9nZ2luZ10KLSoqKiB4cmVmOm9wZXJhdGluZy9hdWRpdF9sb2dnaW5nLmFkb2NbQXVkaXQgbG9nZ2luZyAyXQotKioqIHhyZWY6b3BlcmF0aW5nL2ZxbGxvZ2dpbmcuYWRvY1tGdWxsIHF1ZXJ5IGxvZ2dpbmddCi0qKiogeHJlZjpvcGVyYXRpbmcvdHJhbnNpZW50cmVwbGljYXRpb24uYWRvY1tUcmFuc2llbnQgcmVwbGljYXRpb25dCisqKiB4cmVmOm1hbmFnaW5nOm9wZXJhdGluZy9pbmRleC5hZG9jW09wZXJhdGluZ10KKyoqKiB4cmVmOm1hbmFnaW5nOm9wZXJhdGluZy9zbml0Y2guYWRvY1tTbml0Y2hlc10KKyoqKiB4cmVmOm1hbmFnaW5nOm9wZXJhdGluZy90b3BvX2NoYW5nZXMuYWRvY1tUb3BvbG9neSBjaGFuZ2VzXQorKioqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL3JlcGFpci5hZG9jW1JlcGFpcl0KKyoqKiB4cmVmOm1hbmFnaW5nOm9wZXJhdGluZy9yZWFkX3JlcGFpci5hZG9jW1JlYWQgcmVwYWlyXQorKioqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL2hpbnRzLmFkb2NbSGludHNdCisqKiogeHJlZjptYW5hZ2luZzpvcGVyYXRpbmcvYmxvb21fZmlsdGVycy5hZG9jW0Jsb29tIGZpbHRlcnNdCisqKiogeHJlZjptYW5hZ2luZzpvcGVyYXRpbmcvY29tcHJlc3Npb24uYWRvY1tDb21wcmVzc2lvbl0KKyoqKiB4cmVmOm1hbmFnaW5nOm9wZXJhdGluZy9jZGMuYWRvY1tDaGFuZ2UgRGF0YSBDYXB0dXJlIChDREMpXQorKioqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL2JhY2t1cHMuYWRvY1tCYWNrdXBzXQorKioqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL2J1bGtfbG9hZGluZy5hZG9jW0J1bGsgbG9hZGluZ10KKyoqKiB4cmVmOm1hbmFnaW5nOm9wZXJhdGluZy9tZXRyaWNzLmFkb2NbTWV0cmljc10KKyoqKiB4cmVmOm1hbmFnaW5nOm9wZXJhdGluZy9zZWN1cml0eS5hZG9jW1NlY3VyaXR5XQorKioqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL2hhcmR3YXJlLmFkb2NbSGFyZHdhcmVdCisqKiogeHJlZjptYW5hZ2luZzpvcGVyYXRpbmcvY29tcGFjdGlvbi9pbmRleC5hZG9jW0NvbXBhY3Rpb25dCisqKiogeHJlZjptYW5hZ2luZzpvcGVyYXRpbmcvdmlydHVhbHRhYmxlcy5hZG9jW1ZpcnR1YWwgdGFibGVzXQorKioqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL2F1ZGl0bG9nZ2luZy5hZG9jW0F1ZGl0IGxvZ2dpbmddCisqKiogeHJlZjptYW5hZ2luZzpvcGVyYXRpbmcvYXVkaXRfbG9nZ2luZy5hZG9jW0F1ZGl0IGxvZ2dpbmcgMl0KKyoqKiB4cmVmOm1hbmFnaW5nOm9wZXJhdGluZy9mcWxsb2dnaW5nLmFkb2NbRnVsbCBxdWVyeSBsb2dnaW5nXQorKioqIHhyZWY6bWFuYWdpbmc6b3BlcmF0aW5nL3RyYW5zaWVudHJlcGxpY2F0aW9uLmFkb2NbVHJhbnNpZW50IHJlcGxpY2F0aW9uXQogCi0qKiB4cmVmOnRvb2xzL2luZGV4LmFkb2NbVG9vbHNdCi0qKiogeHJlZjp0b29scy9jcWxzaC5hZG9jW2NxbHNoOiB0aGUgQ1FMIHNoZWxsXQotKioqIHhyZWY6dG9vbHMvbm9kZXRvb2wvbm9kZXRvb2wuYWRvY1tub2RldG9vbF0KLSoqKiB4cmVmOnRvb2xzL3NzdGFibGUvaW5kZXguYWRvY1tTU1RhYmxlIHRvb2xzXQotKioqIHhyZWY6dG9vbHMvY2Fzc2FuZHJhX3N0cmVzcy5hZG9jW2Nhc3NhbmRyYS1zdHJlc3NdCisqKiB4cmVmOm1hbmFnaW5nOnRvb2xzL2luZGV4LmFkb2NbVG9vbHNdCisqKiogeHJlZjptYW5hZ2luZzp0b29scy9jcWxzaC5hZG9jW2NxbHNoOiB0aGUgQ1FMIHNoZWxsXQorKioqIHhyZWY6bWFuYWdpbmc6dG9vbHMvbm9kZXRvb2wvbm9kZXRvb2wuYWRvY1tub2RldG9vbF0KKyoqKiB4cmVmOm1hbmFnaW5nOnRvb2xzL3NzdGFibGUvaW5kZXguYWRvY1tTU1RhYmxlIHRvb2xzXQorKioqIHhyZWY6bWFuYWdpbmc6dG9vbHMvY2Fzc2FuZHJhX3N0cmVzcy5hZG9jW2Nhc3NhbmRyYS1zdHJlc3NdCiAKICoqIHhyZWY6dHJvdWJsZXNob290aW5nL2luZGV4LmFkb2NbVHJvdWJsZXNob290aW5nXQogKioqIHhyZWY6dHJvdWJsZXNob290aW5nL2ZpbmRpbmdfbm9kZXMuYWRvY1tGaW5kaW5nIG1pc2JlaGF2aW5nIG5vZGVzXQpAQCAtMTAxLDcgKzEwMSw3IEBACiAqKiogeHJlZjptYXN0ZXJAXzpST09UOmRldmVsb3BtZW50L2RlcGVuZGVuY2llcy5hZG9jW0RlcGVuZGVuY3kgbWFuYWdlbWVudF0KICoqKiB4cmVmOm1hc3RlckBfOlJPT1Q6ZGV2ZWxvcG1lbnQvcmVsZWFzZV9wcm9jZXNzLmFkb2NbUmVsZWFzZSBwcm9jZXNzXQogCi0qKiB4cmVmOmZhcS9pbmRleC5hZG9jW0ZBUV0KKyoqIHhyZWY6b3ZlcnZpZXc6ZmFxL2luZGV4LmFkb2NbRkFRXQogCi0qKiB4cmVmOnBsdWdpbnMvaW5kZXguYWRvY1tQbHVnLWluc10KKyoqIHhyZWY6aW50ZWdyYXRpbmc6cGx1Z2lucy9pbmRleC5hZG9jW1BsdWctaW5zXQogCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL2R5bmFtby5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9keW5hbW8uYWRvYwppbmRleCBlOTAzOTBhLi5hYTFjZjVhIDEwMDY0NAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL2R5bmFtby5hZG9jCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvZHluYW1vLmFkb2MKQEAgLTEsNyArMSw3IEBACiA9IER5bmFtbwogCiBBcGFjaGUgQ2Fzc2FuZHJhIHJlbGllcyBvbiBhIG51bWJlciBvZiB0ZWNobmlxdWVzIGZyb20gQW1hem9uJ3MKLWh0dHA6Ly9jb3Vyc2VzLmNzZS50YW11LmVkdS9jYXZlcmxlZS9jc2NlNDM4L3JlYWRpbmdzL2R5bmFtby1wYXBlci5wZGZbRHluYW1vXQoraHR0cHM6Ly93d3cuY3MuY29ybmVsbC5lZHUvY291cnNlcy9jczU0MTQvMjAxN2ZhL3BhcGVycy9keW5hbW8ucGRmW0R5bmFtb10KIGRpc3RyaWJ1dGVkIHN0b3JhZ2Uga2V5LXZhbHVlIHN5c3RlbS4gRWFjaCBub2RlIGluIHRoZSBEeW5hbW8gc3lzdGVtIGhhcwogdGhyZWUgbWFpbiBjb21wb25lbnRzOgogCkBAIC0yMiwxMCArMjIsMTAgQEAKIAogQ2Fzc2FuZHJhIHdhcyBkZXNpZ25lZCB0aGlzIHdheSB0byBtZWV0IGxhcmdlLXNjYWxlIChQaUIrKQogYnVzaW5lc3MtY3JpdGljYWwgc3RvcmFnZSByZXF1aXJlbWVudHMuIEluIHBhcnRpY3VsYXIsIGFzIGFwcGxpY2F0aW9ucwotZGVtYW5kZWQgZnVsbCBnbG9iYWwgcmVwbGljYXRpb24gb2YgcGV0YWJ5dGUgc2NhbGUgZGF0YXNldHMgYWxvbmcgd2l0aAorZGVtYW5kZWQgZnVsbCBnbG9iYWwgcmVwbGljYXRpb24gb2YgcGV0YWJ5dGUtc2NhbGUgZGF0YXNldHMgYWxvbmcgd2l0aAogYWx3YXlzIGF2YWlsYWJsZSBsb3ctbGF0ZW5jeSByZWFkcyBhbmQgd3JpdGVzLCBpdCBiZWNhbWUgaW1wZXJhdGl2ZSB0bwogZGVzaWduIGEgbmV3IGtpbmQgb2YgZGF0YWJhc2UgbW9kZWwgYXMgdGhlIHJlbGF0aW9uYWwgZGF0YWJhc2Ugc3lzdGVtcwotb2YgdGhlIHRpbWUgc3RydWdnbGVkIHRvIG1lZXQgdGhlIG5ldyByZXF1aXJlbWVudHMgb2YgZ2xvYmFsIHNjYWxlCitvZiB0aGUgdGltZSBzdHJ1Z2dsZWQgdG8gbWVldCB0aGUgbmV3IHJlcXVpcmVtZW50cyBvZiBnbG9iYWwtc2NhbGUKIGFwcGxpY2F0aW9ucy4KIAogPT0gRGF0YXNldCBQYXJ0aXRpb25pbmc6IENvbnNpc3RlbnQgSGFzaGluZwpAQCAtMzgsMTEgKzM4LDExIEBACiBtdXRhdGlvbnMgdG8gZXZlcnkga2V5IHRoYXQgaXQgb3ducywgZXZlcnkga2V5IG11c3QgYmUgdmVyc2lvbmVkLiBVbmxpa2UKIGluIHRoZSBvcmlnaW5hbCBEeW5hbW8gcGFwZXIgd2hlcmUgZGV0ZXJtaW5pc3RpYyB2ZXJzaW9ucyBhbmQgdmVjdG9yCiBjbG9ja3Mgd2VyZSB1c2VkIHRvIHJlY29uY2lsZSBjb25jdXJyZW50IHVwZGF0ZXMgdG8gYSBrZXksIENhc3NhbmRyYQotdXNlcyBhIHNpbXBsZXIgbGFzdCB3cml0ZSB3aW5zIG1vZGVsIHdoZXJlIGV2ZXJ5IG11dGF0aW9uIGlzIHRpbWVzdGFtcGVkCit1c2VzIGEgc2ltcGxlciBsYXN0LXdyaXRlLXdpbnMgbW9kZWwgd2hlcmUgZXZlcnkgbXV0YXRpb24gaXMgdGltZXN0YW1wZWQKIChpbmNsdWRpbmcgZGVsZXRlcykgYW5kIHRoZW4gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGRhdGEgaXMgdGhlICJ3aW5uaW5nIgogdmFsdWUuIEZvcm1hbGx5IHNwZWFraW5nLCBDYXNzYW5kcmEgdXNlcyBhIExhc3QtV3JpdGUtV2lucyBFbGVtZW50LVNldAogY29uZmxpY3QtZnJlZSByZXBsaWNhdGVkIGRhdGEgdHlwZSBmb3IgZWFjaCBDUUwgcm93LCBvciAKLWh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbmZsaWN0LWZyZWVfcmVwbGljYXRlZF9kYXRhX3R5cGUgTFdXLUVsZW1lbnQtU2V0XyhMYXN0LVdyaXRlLVdpbnMtRWxlbWVudC1TZXQpW0xXVy1FbGVtZW50LVNldAoraHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29uZmxpY3QtZnJlZV9yZXBsaWNhdGVkX2RhdGFfdHlwZSNMV1ctRWxlbWVudC1TZXRfKExhc3QtV3JpdGUtV2lucy1FbGVtZW50LVNldClbTFdXLUVsZW1lbnQtU2V0CiBDUkRUXSwgdG8gcmVzb2x2ZSBjb25mbGljdGluZyBtdXRhdGlvbnMgb24gcmVwbGljYSBzZXRzLgogCiA9PT0gQ29uc2lzdGVudCBIYXNoaW5nIHVzaW5nIGEgVG9rZW4gUmluZwpAQCAtNzYsMTQgKzc2LDE0IEBACiAKIGltYWdlOjpyaW5nLnN2Z1tpbWFnZV0KIAotWW91IGNhbiBzZWUgdGhhdCBpbiBhIER5bmFtbyBsaWtlIHN5c3RlbSwgcmFuZ2VzIG9mIGtleXMsIGFsc28ga25vd24gYXMKK1lvdSBjYW4gc2VlIHRoYXQgaW4gYSBEeW5hbW8tbGlrZSBzeXN0ZW0sIHJhbmdlcyBvZiBrZXlzLCBhbHNvIGtub3duIGFzCiAqdG9rZW4gcmFuZ2VzKiwgbWFwIHRvIHRoZSBzYW1lIHBoeXNpY2FsIHNldCBvZiBub2Rlcy4gSW4gdGhpcyBleGFtcGxlLAogYWxsIGtleXMgdGhhdCBmYWxsIGluIHRoZSB0b2tlbiByYW5nZSBleGNsdWRpbmcgdG9rZW4gMSBhbmQgaW5jbHVkaW5nCiB0b2tlbiAyIChncmFuZ2UodDEsIHQyXSkgYXJlIHN0b3JlZCBvbiBub2RlcyAyLCAzIGFuZCA0LgogCiA9PT0gTXVsdGlwbGUgVG9rZW5zIHBlciBQaHlzaWNhbCBOb2RlICh2bm9kZXMpCiAKLVNpbXBsZSBzaW5nbGUgdG9rZW4gY29uc2lzdGVudCBoYXNoaW5nIHdvcmtzIHdlbGwgaWYgeW91IGhhdmUgbWFueQorU2ltcGxlIHNpbmdsZS10b2tlbiBjb25zaXN0ZW50IGhhc2hpbmcgd29ya3Mgd2VsbCBpZiB5b3UgaGF2ZSBtYW55CiBwaHlzaWNhbCBub2RlcyB0byBzcHJlYWQgZGF0YSBvdmVyLCBidXQgd2l0aCBldmVubHkgc3BhY2VkIHRva2VucyBhbmQgYQogc21hbGwgbnVtYmVyIG9mIHBoeXNpY2FsIG5vZGVzLCBpbmNyZW1lbnRhbCBzY2FsaW5nIChhZGRpbmcganVzdCBhIGZldwogbm9kZXMgb2YgY2FwYWNpdHkpIGlzIGRpZmZpY3VsdCBiZWNhdXNlIHRoZXJlIGFyZSBubyB0b2tlbiBzZWxlY3Rpb25zCkBAIC0xMDQsOCArMTA0LDcgQEAKIAogQ2Fzc2FuZHJhIGludHJvZHVjZXMgc29tZSBub21lbmNsYXR1cmUgdG8gaGFuZGxlIHRoZXNlIGNvbmNlcHRzOgogCi0qICpUb2tlbio6IEEgc2luZ2xlIHBvc2l0aW9uIG9uIHRoZSBkeW5hbW8gc3R5bGUgaGFzaAotcmluZy4KKyogKlRva2VuKjogQSBzaW5nbGUgcG9zaXRpb24gb24gdGhlIER5bmFtby1zdHlsZSBoYXNoIHJpbmcuCiAqICpFbmRwb2ludCo6IEEgc2luZ2xlIHBoeXNpY2FsIElQIGFuZCBwb3J0IG9uIHRoZSBuZXR3b3JrLgogKiAqSG9zdCBJRCo6IEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2luZ2xlICJwaHlzaWNhbCIgbm9kZSwgdXN1YWxseQogcHJlc2VudCBhdCBvbmUgZ0VuZHBvaW50IGFuZCBjb250YWluaW5nIG9uZSBvciBtb3JlCkBAIC0xMzEsNyArMTMwLDcgQEAKIC4gV2hlbiBhIG5vZGUgaXMgZGVjb21taXNzaW9uZWQsIGl0IGxvc2VzIGRhdGEgcm91Z2hseSBlcXVhbGx5IHRvIG90aGVyCiBtZW1iZXJzIG9mIHRoZSByaW5nLCBhZ2FpbiBrZWVwaW5nIGVxdWFsIGRpc3RyaWJ1dGlvbiBvZiBkYXRhIGFjcm9zcyB0aGUKIGNsdXN0ZXIuCi0uIElmIGEgbm9kZSBiZWNvbWVzIHVuYXZhaWxhYmxlLCBxdWVyeSBsb2FkIChlc3BlY2lhbGx5IHRva2VuIGF3YXJlCisuIElmIGEgbm9kZSBiZWNvbWVzIHVuYXZhaWxhYmxlLCBxdWVyeSBsb2FkIChlc3BlY2lhbGx5IHRva2VuLWF3YXJlCiBxdWVyeSBsb2FkKSwgaXMgZXZlbmx5IGRpc3RyaWJ1dGVkIGFjcm9zcyBtYW55IG90aGVyIG5vZGVzLgogCiBNdWx0aXBsZSB0b2tlbnMsIGhvd2V2ZXIsIGNhbiBhbHNvIGhhdmUgZGlzYWR2YW50YWdlczoKQEAgLTE1Miw3ICsxNTEsNyBAQAogYXZhaWxhYmxlIHdhcyBwaWNraW5nIHJhbmRvbSB0b2tlbnMsIHdoaWNoIG1lYW50IHRoYXQgdG8ga2VlcCBiYWxhbmNlCiB0aGUgZGVmYXVsdCBudW1iZXIgb2YgdG9rZW5zIHBlciBub2RlIGhhZCB0byBiZSBxdWl0ZSBoaWdoLCBhdCBgMjU2YC4KIFRoaXMgaGFkIHRoZSBlZmZlY3Qgb2YgY291cGxpbmcgbWFueSBwaHlzaWNhbCBlbmRwb2ludHMgdG9nZXRoZXIsCi1pbmNyZWFzaW5nIHRoZSByaXNrIG9mIHVuYXZhaWxhYmlsaXR5LiBUaGF0IGlzIHdoeSBpbiBgMy54ICtgIHRoZSBuZXcKK2luY3JlYXNpbmcgdGhlIHJpc2sgb2YgdW5hdmFpbGFiaWxpdHkuIFRoYXQgaXMgd2h5IGluIGAzLnggK2AgYSBuZXcKIGRldGVybWluaXN0aWMgdG9rZW4gYWxsb2NhdG9yIHdhcyBhZGRlZCB3aGljaCBpbnRlbGxpZ2VudGx5IHBpY2tzIHRva2Vucwogc3VjaCB0aGF0IHRoZSByaW5nIGlzIG9wdGltYWxseSBiYWxhbmNlZCB3aGlsZSByZXF1aXJpbmcgYSBtdWNoIGxvd2VyCiBudW1iZXIgb2YgdG9rZW5zIHBlciBwaHlzaWNhbCBub2RlLgpAQCAtMjU2LDcgKzI1NSw3IEBACiBUcmFuc2llbnQgcmVwbGljYXRpb24gaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBpcyBub3QgcmVhZHkKIGZvciBwcm9kdWN0aW9uIHVzZS4gVGhlIGV4cGVjdGVkIGF1ZGllbmNlIGlzIGV4cGVyaWVuY2VkIHVzZXJzIG9mCiBDYXNzYW5kcmEgY2FwYWJsZSBvZiBmdWxseSB2YWxpZGF0aW5nIGEgZGVwbG95bWVudCBvZiB0aGVpciBwYXJ0aWN1bGFyCi1hcHBsaWNhdGlvbi4gVGhhdCBtZWFucyBiZWluZyBhYmxlIGNoZWNrIHRoYXQgb3BlcmF0aW9ucyBsaWtlIHJlYWRzLAorYXBwbGljYXRpb24uIFRoYXQgbWVhbnMgeW91IGhhdmUgdGhlIGV4cGVyaWVuY2UgdG8gY2hlY2sgdGhhdCBvcGVyYXRpb25zIGxpa2UgcmVhZHMsCiB3cml0ZXMsIGRlY29tbWlzc2lvbiwgcmVtb3ZlLCByZWJ1aWxkLCByZXBhaXIsIGFuZCByZXBsYWNlIGFsbCB3b3JrIHdpdGgKIHlvdXIgcXVlcmllcywgZGF0YSwgY29uZmlndXJhdGlvbiwgb3BlcmF0aW9uYWwgcHJhY3RpY2VzLCBhbmQKIGF2YWlsYWJpbGl0eSByZXF1aXJlbWVudHMuCkBAIC0yNjksMTggKzI2OCwxOCBAQAogQ2Fzc2FuZHJhIHVzZXMgbXV0YXRpb24gdGltZXN0YW1wIHZlcnNpb25pbmcgdG8gZ3VhcmFudGVlIGV2ZW50dWFsCiBjb25zaXN0ZW5jeSBvZiBkYXRhLiBTcGVjaWZpY2FsbHkgYWxsIG11dGF0aW9ucyB0aGF0IGVudGVyIHRoZSBzeXN0ZW0gZG8KIHNvIHdpdGggYSB0aW1lc3RhbXAgcHJvdmlkZWQgZWl0aGVyIGZyb20gYSBjbGllbnQgY2xvY2sgb3IsIGFic2VudCBhCi1jbGllbnQgcHJvdmlkZWQgdGltZXN0YW1wLCBmcm9tIHRoZSBjb29yZGluYXRvciBub2RlJ3MgY2xvY2suIFVwZGF0ZXMKK2NsaWVudC1wcm92aWRlZCB0aW1lc3RhbXAsIGZyb20gdGhlIGNvb3JkaW5hdG9yIG5vZGUncyBjbG9jay4gVXBkYXRlcwogcmVzb2x2ZSBhY2NvcmRpbmcgdG8gdGhlIGNvbmZsaWN0IHJlc29sdXRpb24gcnVsZSBvZiBsYXN0IHdyaXRlIHdpbnMuCiBDYXNzYW5kcmEncyBjb3JyZWN0bmVzcyBkb2VzIGRlcGVuZCBvbiB0aGVzZSBjbG9ja3MsIHNvIG1ha2Ugc3VyZSBhCiBwcm9wZXIgdGltZSBzeW5jaHJvbml6YXRpb24gcHJvY2VzcyBpcyBydW5uaW5nIHN1Y2ggYXMgTlRQLgogCiBDYXNzYW5kcmEgYXBwbGllcyBzZXBhcmF0ZSBtdXRhdGlvbiB0aW1lc3RhbXBzIHRvIGV2ZXJ5IGNvbHVtbiBvZiBldmVyeQogcm93IHdpdGhpbiBhIENRTCBwYXJ0aXRpb24uIFJvd3MgYXJlIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlIGJ5IHByaW1hcnkKLWtleSwgYW5kIGVhY2ggY29sdW1uIGluIGEgcm93IHJlc29sdmUgY29uY3VycmVudCBtdXRhdGlvbnMgYWNjb3JkaW5nIHRvCitrZXksIGFuZCBlYWNoIGNvbHVtbiBpbiBhIHJvdyByZXNvbHZlcyBjb25jdXJyZW50IG11dGF0aW9ucyBhY2NvcmRpbmcgdG8KIGxhc3Qtd3JpdGUtd2lucyBjb25mbGljdCByZXNvbHV0aW9uLiBUaGlzIG1lYW5zIHRoYXQgdXBkYXRlcyB0bwogZGlmZmVyZW50IHByaW1hcnkga2V5cyB3aXRoaW4gYSBwYXJ0aXRpb24gY2FuIGFjdHVhbGx5IHJlc29sdmUgd2l0aG91dAogY29uZmxpY3QhIEZ1cnRoZXJtb3JlIHRoZSBDUUwgY29sbGVjdGlvbiB0eXBlcyBzdWNoIGFzIG1hcHMgYW5kIHNldHMgdXNlCi10aGlzIHNhbWUgY29uZmxpY3QgZnJlZSBtZWNoYW5pc20sIG1lYW5pbmcgdGhhdCBjb25jdXJyZW50IHVwZGF0ZXMgdG8KK3RoaXMgc2FtZSBjb25mbGljdC1mcmVlIG1lY2hhbmlzbSwgbWVhbmluZyB0aGF0IGNvbmN1cnJlbnQgdXBkYXRlcyB0bwogbWFwcyBhbmQgc2V0cyBhcmUgZ3VhcmFudGVlZCB0byByZXNvbHZlIGFzIHdlbGwuCiAKID09PT0gUmVwbGljYSBTeW5jaHJvbml6YXRpb24KQEAgLTI5Myw3ICsyOTIsNyBAQAogCiBUaGVzZSB0ZWNobmlxdWVzIGFyZSBvbmx5IGJlc3QtZWZmb3J0LCBob3dldmVyLCBhbmQgdG8gZ3VhcmFudGVlCiBldmVudHVhbCBjb25zaXN0ZW5jeSBDYXNzYW5kcmEgaW1wbGVtZW50cyBgYW50aS1lbnRyb3B5Ci1yZXBhaXIgPHJlcGFpcj5gIHdoZXJlIHJlcGxpY2FzIGNhbGN1bGF0ZSBoaWVyYXJjaGljYWwgaGFzaC10cmVlcyBvdmVyCityZXBhaXIgPHJlcGFpcj5gIHdoZXJlIHJlcGxpY2FzIGNhbGN1bGF0ZSBoaWVyYXJjaGljYWwgaGFzaCB0cmVlcyBvdmVyCiB0aGVpciBkYXRhc2V0cyBjYWxsZWQgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWVya2xlX3RyZWVbTWVya2xlCiB0cmVlc10gdGhhdCBjYW4gdGhlbiBiZSBjb21wYXJlZCBhY3Jvc3MgcmVwbGljYXMgdG8gaWRlbnRpZnkgbWlzbWF0Y2hlZAogZGF0YS4gTGlrZSB0aGUgb3JpZ2luYWwgRHluYW1vIHBhcGVyIENhc3NhbmRyYSBzdXBwb3J0cyBmdWxsIHJlcGFpcnMKQEAgLTM0MCw3ICszMzksNyBAQAogICBBIG1ham9yaXR5IG9mIHRoZSByZXBsaWNhcyBpbiBlYWNoIGRhdGFjZW50ZXIgbXVzdCByZXNwb25kLgogYExPQ0FMX09ORWA6OgogICBPbmx5IGEgc2luZ2xlIHJlcGxpY2EgbXVzdCByZXNwb25kLiBJbiBhIG11bHRpLWRhdGFjZW50ZXIgY2x1c3RlciwKLSAgdGhpcyBhbHNvIGdhdXJhbnRlZXMgdGhhdCByZWFkIHJlcXVlc3RzIGFyZSBub3Qgc2VudCB0byByZXBsaWNhcyBpbiBhCisgIHRoaXMgYWxzbyBndWFyYW50ZWVzIHRoYXQgcmVhZCByZXF1ZXN0cyBhcmUgbm90IHNlbnQgdG8gcmVwbGljYXMgaW4gYQogICByZW1vdGUgZGF0YWNlbnRlci4KIGBBTllgOjoKICAgQSBzaW5nbGUgcmVwbGljYSBtYXkgcmVzcG9uZCwgb3IgdGhlIGNvb3JkaW5hdG9yIG1heSBzdG9yZSBhIGhpbnQuIElmCkBAIC00MDAsNyArMzk5LDcgQEAKIG5vdCBvbmx5IGFib3V0IHRoZW1zZWx2ZXMgYnV0IGFsc28gYWJvdXQgb3RoZXIgbm9kZXMgdGhleSBrbm93IGFib3V0LgogVGhpcyBpbmZvcm1hdGlvbiBpcyB2ZXJzaW9uZWQgd2l0aCBhIHZlY3RvciBjbG9jayBvZgogYChnZW5lcmF0aW9uLCB2ZXJzaW9uKWAgdHVwbGVzLCB3aGVyZSB0aGUgZ2VuZXJhdGlvbiBpcyBhIG1vbm90b25pYwotdGltZXN0YW1wIGFuZCB2ZXJzaW9uIGlzIGEgbG9naWNhbCBjbG9jayB0aGUgaW5jcmVtZW50cyByb3VnaGx5IGV2ZXJ5Cit0aW1lc3RhbXAgYW5kIHZlcnNpb24gaXMgYSBsb2dpY2FsIGNsb2NrIHRoYXQgaW5jcmVtZW50cyByb3VnaGx5IGV2ZXJ5CiBzZWNvbmQuIFRoZXNlIGxvZ2ljYWwgY2xvY2tzIGFsbG93IENhc3NhbmRyYSBnb3NzaXAgdG8gaWdub3JlIG9sZAogdmVyc2lvbnMgb2YgY2x1c3RlciBzdGF0ZSBqdXN0IGJ5IGluc3BlY3RpbmcgdGhlIGxvZ2ljYWwgY2xvY2tzCiBwcmVzZW50ZWQgd2l0aCBnb3NzaXAgbWVzc2FnZXMuCkBAIC00MTcsMTAgKzQxNiwxMCBAQAogb25lIGV4aXN0cykKIC4gR29zc2lwcyB3aXRoIGEgc2VlZCBub2RlIGlmIHRoYXQgZGlkbid0IGhhcHBlbiBpbiBzdGVwIDIuCiAKLVdoZW4gYW4gb3BlcmF0b3IgZmlyc3QgYm9vdHN0cmFwcyBhIENhc3NhbmRyYSBjbHVzdGVyIHRoZXkgZGVzaWduYXRlCi1jZXJ0YWluIG5vZGVzIGFzIHNlZWQgbm9kZXMuIEFueSBub2RlIGNhbiBiZSBhIHNlZWQgbm9kZSBhbmQgdGhlIG9ubHkKLWRpZmZlcmVuY2UgYmV0d2VlbiBzZWVkIGFuZCBub24tc2VlZCBub2RlcyBpcyBzZWVkIG5vZGVzIGFyZSBhbGxvd2VkIHRvCi1ib290c3RyYXAgaW50byB0aGUgcmluZyB3aXRob3V0IHNlZWluZyBhbnkgb3RoZXIgc2VlZCBub2Rlcy4KK1doZW4gYW4gb3BlcmF0b3IgZmlyc3QgYm9vdHN0cmFwcyBhIENhc3NhbmRyYSBjbHVzdGVyLCB0aGV5IGRlc2lnbmF0ZQorY2VydGFpbiBub2RlcyBhcyBzZWVkIG5vZGVzLiBBbnkgbm9kZSBjYW4gYmUgYSBzZWVkIG5vZGUsIGFuZCB0aGUgb25seQorZGlmZmVyZW5jZSBiZXR3ZWVuIHNlZWQgYW5kIG5vbi1zZWVkIG5vZGVzIGlzIHRoYXQgc2VlZCBub2RlcyBhcmUgYWxsb3dlZAordG8gYm9vdHN0cmFwIGludG8gdGhlIHJpbmcgd2l0aG91dCBzZWVpbmcgYW55IG90aGVyIHNlZWQgbm9kZXMuCiBGdXJ0aGVybW9yZSwgb25jZSBhIGNsdXN0ZXIgaXMgYm9vdHN0cmFwcGVkLCBzZWVkIG5vZGVzIGJlY29tZQogaG90c3BvdHMgZm9yIGdvc3NpcCBkdWUgdG8gc3RlcCA0IGFib3ZlLgogCkBAIC00MzUsNyArNDM0LDcgQEAKIE5vZGVzIGRvIG5vdCBoYXZlIHRvIGFncmVlIG9uIHRoZSBzZWVkIG5vZGVzLCBhbmQgaW5kZWVkIG9uY2UgYSBjbHVzdGVyCiBpcyBib290c3RyYXBwZWQsIG5ld2x5IGxhdW5jaGVkIG5vZGVzIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBhbnkKIGV4aXN0aW5nIG5vZGVzIGFzIHNlZWRzLiBUaGUgb25seSBhZHZhbnRhZ2UgdG8gcGlja2luZyB0aGUgc2FtZSBub2RlcwotYXMgc2VlZHMgaXMgaXQgaW5jcmVhc2VzIHRoZWlyIHVzZWZ1bGxuZXNzIGFzIGdvc3NpcCBob3RzcG90cy4KK2FzIHNlZWRzIGlzIHRoYXQgaXQgaW5jcmVhc2VzIHRoZWlyIHVzZWZ1bG5lc3MgYXMgZ29zc2lwIGhvdHNwb3RzLgogPT09PQogCiBDdXJyZW50bHksIGdvc3NpcCBhbHNvIHByb3BhZ2F0ZXMgdG9rZW4gbWV0YWRhdGEgYW5kIHNjaGVtYQpAQCAtNDg4LDcgKzQ4Nyw3IEBACiBzdG9yYWdlLiBJbiBjb250cmFzdCwgc2NhbGluZy11cCBpbXBsaWVzIGFkZGluZyBtb3JlIGNhcGFjaXR5IHRvIHRoZQogZXhpc3RpbmcgZGF0YWJhc2Ugbm9kZXMuIENhc3NhbmRyYSBpcyBhbHNvIGNhcGFibGUgb2Ygc2NhbGUtdXAsIGFuZCBpbgogY2VydGFpbiBlbnZpcm9ubWVudHMgaXQgbWF5IGJlIHByZWZlcmFibGUgZGVwZW5kaW5nIG9uIHRoZSBkZXBsb3ltZW50LgotQ2Fzc2FuZHJhIGdpdmVzIG9wZXJhdG9ycyB0aGUgZmxleGliaWxpdHkgdG8gY2hvc2UgZWl0aGVyIHNjYWxlLW91dCBvcgorQ2Fzc2FuZHJhIGdpdmVzIG9wZXJhdG9ycyB0aGUgZmxleGliaWxpdHkgdG8gY2hvb3NlIGVpdGhlciBzY2FsZS1vdXQgb3IKIHNjYWxlLXVwLgogCiBPbmUga2V5IGFzcGVjdCBvZiBEeW5hbW8gdGhhdCBDYXNzYW5kcmEgZm9sbG93cyBpcyB0byBhdHRlbXB0IHRvIHJ1biBvbgpAQCAtNTA3LDcgKzUwNiw3IEBACiBtdWx0aS1wYXJ0aXRpb24gdHJhbnNhY3Rpb25zIHNwYW5uaW5nIG11bHRpcGxlIG5vZGVzIGFyZSBub3RvcmlvdXNseQogZGlmZmljdWx0IHRvIGltcGxlbWVudCBhbmQgdHlwaWNhbGx5IHZlcnkgbGF0ZW50LgogCi1JbnN0ZWFkLCBDYXNzYW5kYSBjaG9vc2VzIHRvIG9mZmVyIGZhc3QsIGNvbnNpc3RlbnQsIGxhdGVuY3kgYXQgYW55CitJbnN0ZWFkLCBDYXNzYW5kcmEgY2hvb3NlcyB0byBvZmZlciBmYXN0LCBjb25zaXN0ZW50LCBsYXRlbmN5IGF0IGFueQogc2NhbGUgZm9yIHNpbmdsZSBwYXJ0aXRpb24gb3BlcmF0aW9ucywgYWxsb3dpbmcgcmV0cmlldmFsIG9mIGVudGlyZQogcGFydGl0aW9ucyBvciBvbmx5IHN1YnNldHMgb2YgcGFydGl0aW9ucyBiYXNlZCBvbiBwcmltYXJ5IGtleSBmaWx0ZXJzLgogRnVydGhlcm1vcmUsIENhc3NhbmRyYSBkb2VzIHN1cHBvcnQgc2luZ2xlIHBhcnRpdGlvbiBjb21wYXJlIGFuZCBzd2FwCkBAIC01MTYsNyArNTE1LDcgQEAKID09PSBTaW1wbGUgSW50ZXJmYWNlIGZvciBTdG9yaW5nIFJlY29yZHMKIAogQ2Fzc2FuZHJhLCBpbiBhIHNsaWdodCBkZXBhcnR1cmUgZnJvbSBEeW5hbW8sIGNob29zZXMgYSBzdG9yYWdlCi1pbnRlcmZhY2UgdGhhdCBpcyBtb3JlIHNvcGhpc3RpY2F0ZWQgdGhlbiAic2ltcGxlIGtleSB2YWx1ZSIgc3RvcmVzIGJ1dAoraW50ZXJmYWNlIHRoYXQgaXMgbW9yZSBzb3BoaXN0aWNhdGVkIHRoYW4gInNpbXBsZSBrZXktdmFsdWUiIHN0b3JlcyBidXQKIHNpZ25pZmljYW50bHkgbGVzcyBjb21wbGV4IHRoYW4gU1FMIHJlbGF0aW9uYWwgZGF0YSBtb2RlbHMuIENhc3NhbmRyYQogcHJlc2VudHMgYSB3aWRlLWNvbHVtbiBzdG9yZSBpbnRlcmZhY2UsIHdoZXJlIHBhcnRpdGlvbnMgb2YgZGF0YSBjb250YWluCiBtdWx0aXBsZSByb3dzLCBlYWNoIG9mIHdoaWNoIGNvbnRhaW5zIGEgZmxleGlibGUgc2V0IG9mIGluZGl2aWR1YWxseQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9ndWFyYW50ZWVzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL2d1YXJhbnRlZXMuYWRvYwppbmRleCAzMzEzYTExLi5hNWYwOWI5IDEwMDY0NAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL2d1YXJhbnRlZXMuYWRvYworKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL2d1YXJhbnRlZXMuYWRvYwpAQCAtMSwxNyArMSwxNyBAQAogPSBHdWFyYW50ZWVzCiAKIEFwYWNoZSBDYXNzYW5kcmEgaXMgYSBoaWdobHkgc2NhbGFibGUgYW5kIHJlbGlhYmxlIGRhdGFiYXNlLiBDYXNzYW5kcmEKLWlzIHVzZWQgaW4gd2ViIGJhc2VkIGFwcGxpY2F0aW9ucyB0aGF0IHNlcnZlIGxhcmdlIG51bWJlciBvZiBjbGllbnRzIGFuZAoraXMgdXNlZCBpbiB3ZWItYmFzZWQgYXBwbGljYXRpb25zIHRoYXQgc2VydmUgbGFyZ2UgbnVtYmVyIG9mIGNsaWVudHMgYW5kCiB0aGUgcXVhbnRpdHkgb2YgZGF0YSBwcm9jZXNzZWQgaXMgd2ViLXNjYWxlIChQZXRhYnl0ZSkgbGFyZ2UuIENhc3NhbmRyYQogbWFrZXMgc29tZSBndWFyYW50ZWVzIGFib3V0IGl0cyBzY2FsYWJpbGl0eSwgYXZhaWxhYmlsaXR5IGFuZAogcmVsaWFiaWxpdHkuIFRvIGZ1bGx5IHVuZGVyc3RhbmQgdGhlIGluaGVyZW50IGxpbWl0YXRpb25zIG9mIGEgc3RvcmFnZQogc3lzdGVtIGluIGFuIGVudmlyb25tZW50IGluIHdoaWNoIGEgY2VydGFpbiBsZXZlbCBvZiBuZXR3b3JrIHBhcnRpdGlvbgogZmFpbHVyZSBpcyB0byBiZSBleHBlY3RlZCBhbmQgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gZGVzaWduaW5nIHRoZQotc3lzdGVtIGl0IGlzIGltcG9ydGFudCB0byBmaXJzdCBicmllZmx5IGludHJvZHVjZSB0aGUgQ0FQIHRoZW9yZW0uCitzeXN0ZW0sIGl0IGlzIGltcG9ydGFudCB0byBmaXJzdCBicmllZmx5IGludHJvZHVjZSB0aGUgQ0FQIHRoZW9yZW0uCiAKID09IFdoYXQgaXMgQ0FQPwogCi1BY2NvcmRpbmcgdG8gdGhlIENBUCB0aGVvcmVtIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgYSBkaXN0cmlidXRlZCBkYXRhCitBY2NvcmRpbmcgdG8gdGhlIENBUCB0aGVvcmVtLCBpdCBpcyBub3QgcG9zc2libGUgZm9yIGEgZGlzdHJpYnV0ZWQgZGF0YQogc3RvcmUgdG8gcHJvdmlkZSBtb3JlIHRoYW4gdHdvIG9mIHRoZSBmb2xsb3dpbmcgZ3VhcmFudGVlcwogc2ltdWx0YW5lb3VzbHkuCiAKQEAgLTI0LDcgKzI0LDcgQEAKIHN0b3JhZ2Ugc3lzdGVtIHRvIGZhaWx1cmUgb2YgYSBuZXR3b3JrIHBhcnRpdGlvbi4gRXZlbiBpZiBzb21lIG9mIHRoZQogbWVzc2FnZXMgYXJlIGRyb3BwZWQgb3IgZGVsYXllZCB0aGUgc3lzdGVtIGNvbnRpbnVlcyB0byBvcGVyYXRlLgogCi1DQVAgdGhlb3JlbSBpbXBsaWVzIHRoYXQgd2hlbiB1c2luZyBhIG5ldHdvcmsgcGFydGl0aW9uLCB3aXRoIHRoZQorVGhlIENBUCB0aGVvcmVtIGltcGxpZXMgdGhhdCB3aGVuIHVzaW5nIGEgbmV0d29yayBwYXJ0aXRpb24sIHdpdGggdGhlCiBpbmhlcmVudCByaXNrIG9mIHBhcnRpdGlvbiBmYWlsdXJlLCBvbmUgaGFzIHRvIGNob29zZSBiZXR3ZWVuCiBjb25zaXN0ZW5jeSBhbmQgYXZhaWxhYmlsaXR5IGFuZCBib3RoIGNhbm5vdCBiZSBndWFyYW50ZWVkIGF0IHRoZSBzYW1lCiB0aW1lLiBDQVAgdGhlb3JlbSBpcyBpbGx1c3RyYXRlZCBpbiBGaWd1cmUgMS4KQEAgLTMzLDcgKzMzLDcgQEAKIAogRmlndXJlIDEuIENBUCBUaGVvcmVtCiAKLUhpZ2ggYXZhaWxhYmlsaXR5IGlzIGEgcHJpb3JpdHkgaW4gd2ViIGJhc2VkIGFwcGxpY2F0aW9ucyBhbmQgdG8gdGhpcworSGlnaCBhdmFpbGFiaWxpdHkgaXMgYSBwcmlvcml0eSBpbiB3ZWItYmFzZWQgYXBwbGljYXRpb25zIGFuZCB0byB0aGlzCiBvYmplY3RpdmUgQ2Fzc2FuZHJhIGNob29zZXMgQXZhaWxhYmlsaXR5IGFuZCBQYXJ0aXRpb24gVG9sZXJhbmNlIGZyb20KIHRoZSBDQVAgZ3VhcmFudGVlcywgY29tcHJvbWlzaW5nIG9uIGRhdGEgQ29uc2lzdGVuY3kgdG8gc29tZSBleHRlbnQuCiAKQEAgLTQ3LDE5ICs0NywxOSBAQAogKiBCYXRjaGVkIHdyaXRlcyBhY3Jvc3MgbXVsdGlwbGUgdGFibGVzIGFyZSBndWFyYW50ZWVkIHRvIHN1Y2NlZWQKIGNvbXBsZXRlbHkgb3Igbm90IGF0IGFsbAogKiBTZWNvbmRhcnkgaW5kZXhlcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBjb25zaXN0ZW50IHdpdGggdGhlaXIgbG9jYWwKLXJlcGxpY2FzIGRhdGEKK3JlcGxpY2FzJyBkYXRhCiAKID09IEhpZ2ggU2NhbGFiaWxpdHkKIAogQ2Fzc2FuZHJhIGlzIGEgaGlnaGx5IHNjYWxhYmxlIHN0b3JhZ2Ugc3lzdGVtIGluIHdoaWNoIG5vZGVzIG1heSBiZQotYWRkZWQvcmVtb3ZlZCBhcyBuZWVkZWQuIFVzaW5nIGdvc3NpcC1iYXNlZCBwcm90b2NvbCBhIHVuaWZpZWQgYW5kCithZGRlZC9yZW1vdmVkIGFzIG5lZWRlZC4gVXNpbmcgZ29zc2lwLWJhc2VkIHByb3RvY29sLCBhIHVuaWZpZWQgYW5kCiBjb25zaXN0ZW50IG1lbWJlcnNoaXAgbGlzdCBpcyBrZXB0IGF0IGVhY2ggbm9kZS4KIAogPT0gSGlnaCBBdmFpbGFiaWxpdHkKIAogQ2Fzc2FuZHJhIGd1YXJhbnRlZXMgaGlnaCBhdmFpbGFiaWxpdHkgb2YgZGF0YSBieSBpbXBsZW1lbnRpbmcgYQotZmF1bHQtdG9sZXJhbnQgc3RvcmFnZSBzeXN0ZW0uIEZhaWx1cmUgZGV0ZWN0aW9uIGluIGEgbm9kZSBpcyBkZXRlY3RlZAotdXNpbmcgYSBnb3NzaXAtYmFzZWQgcHJvdG9jb2wuCitmYXVsdC10b2xlcmFudCBzdG9yYWdlIHN5c3RlbS4gRmFpbHVyZSBvZiBhIG5vZGUgaXMgZGV0ZWN0ZWQgdXNpbmcKK2EgZ29zc2lwLWJhc2VkIHByb3RvY29sLgogCiA9PSBEdXJhYmlsaXR5CiAKQEAgLTY3LDI2ICs2NywyNiBAQAogbXVsdGlwbGUgY29waWVzIG9mIGEgZGF0YSBzdG9yZWQgb24gZGlmZmVyZW50IG5vZGVzIGluIGEgY2x1c3Rlci4gSW4gYQogbXVsdGktZGF0YWNlbnRlciBlbnZpcm9ubWVudCB0aGUgcmVwbGljYXMgbWF5IGJlIHN0b3JlZCBvbiBkaWZmZXJlbnQKIGRhdGFjZW50ZXJzLiBJZiBvbmUgcmVwbGljYSBpcyBsb3N0IGR1ZSB0byB1bnJlY292ZXJhYmxlIG5vZGUvZGF0YWNlbnRlcgotZmFpbHVyZSB0aGUgZGF0YSBpcyBub3QgY29tcGxldGVseSBsb3N0IGFzIHJlcGxpY2FzIGFyZSBzdGlsbCBhdmFpbGFibGUuCitmYWlsdXJlLCB0aGUgZGF0YSBpcyBub3QgY29tcGxldGVseSBsb3N0LCBhcyByZXBsaWNhcyBhcmUgc3RpbGwgYXZhaWxhYmxlLgogCiA9PSBFdmVudHVhbCBDb25zaXN0ZW5jeQogCiBNZWV0aW5nIHRoZSByZXF1aXJlbWVudHMgb2YgcGVyZm9ybWFuY2UsIHJlbGlhYmlsaXR5LCBzY2FsYWJpbGl0eSBhbmQKLWhpZ2ggYXZhaWxhYmlsaXR5IGluIHByb2R1Y3Rpb24gQ2Fzc2FuZHJhIGlzIGFuIGV2ZW50dWFsbHkgY29uc2lzdGVudAotc3RvcmFnZSBzeXN0ZW0uIEV2ZW50dWFsbHkgY29uc2lzdGVudCBpbXBsaWVzIHRoYXQgYWxsIHVwZGF0ZXMgcmVhY2ggYWxsCitoaWdoIGF2YWlsYWJpbGl0eSBpbiBwcm9kdWN0aW9uLCBDYXNzYW5kcmEgaXMgYW4gZXZlbnR1YWxseSBjb25zaXN0ZW50CitzdG9yYWdlIHN5c3RlbS4gRXZlbnR1YWxseSBjb25zaXN0ZW5jeSBpbXBsaWVzIHRoYXQgYWxsIHVwZGF0ZXMgcmVhY2ggYWxsCiByZXBsaWNhcyBldmVudHVhbGx5LiBEaXZlcmdlbnQgdmVyc2lvbnMgb2YgdGhlIHNhbWUgZGF0YSBtYXkgZXhpc3QKLXRlbXBvcmFyaWx5IGJ1dCB0aGV5IGFyZSBldmVudHVhbGx5IHJlY29uY2lsZWQgdG8gYSBjb25zaXN0ZW50IHN0YXRlLgotRXZlbnR1YWwgY29uc2lzdGVuY3kgaXMgYSB0cmFkZW9mZiB0byBhY2hpZXZlIGhpZ2ggYXZhaWxhYmlsaXR5IGFuZCBpdAordGVtcG9yYXJpbHksIGJ1dCB0aGV5IGFyZSBldmVudHVhbGx5IHJlY29uY2lsZWQgdG8gYSBjb25zaXN0ZW50IHN0YXRlLgorRXZlbnR1YWwgY29uc2lzdGVuY3kgaXMgYSB0cmFkZW9mZiB0byBhY2hpZXZlIGhpZ2ggYXZhaWxhYmlsaXR5LCBhbmQgaXQKIGludm9sdmVzIHNvbWUgcmVhZCBhbmQgd3JpdGUgbGF0ZW5jaWVzLgogCiA9PSBMaWdodHdlaWdodCB0cmFuc2FjdGlvbnMgd2l0aCBsaW5lYXJpemFibGUgY29uc2lzdGVuY3kKIAotRGF0YSBtdXN0IGJlIHJlYWQgYW5kIHdyaXR0ZW4gaW4gYSBzZXF1ZW50aWFsIG9yZGVyLiBQYXhvcyBjb25zZW5zdXMKLXByb3RvY29sIGlzIHVzZWQgdG8gaW1wbGVtZW50IGxpZ2h0d2VpZ2h0IHRyYW5zYWN0aW9ucy4gUGF4b3MgcHJvdG9jb2wKK0RhdGEgbXVzdCBiZSByZWFkIGFuZCB3cml0dGVuIGluIGEgc2VxdWVudGlhbCBvcmRlci4gVGhlIFBheG9zIGNvbnNlbnN1cworcHJvdG9jb2wgaXMgdXNlZCB0byBpbXBsZW1lbnQgbGlnaHR3ZWlnaHQgdHJhbnNhY3Rpb25zLiBUaGUgUGF4b3MgcHJvdG9jb2wKIGltcGxlbWVudHMgbGlnaHR3ZWlnaHQgdHJhbnNhY3Rpb25zIHRoYXQgYXJlIGFibGUgdG8gaGFuZGxlIGNvbmN1cnJlbnQKIG9wZXJhdGlvbnMgdXNpbmcgbGluZWFyaXphYmxlIGNvbnNpc3RlbmN5LiBMaW5lYXJpemFibGUgY29uc2lzdGVuY3kgaXMKLXNlcXVlbnRpYWwgY29uc2lzdGVuY3kgd2l0aCByZWFsLXRpbWUgY29uc3RyYWludHMgYW5kIGl0IGVuc3VyZXMKLXRyYW5zYWN0aW9uIGlzb2xhdGlvbiB3aXRoIGNvbXBhcmUgYW5kIHNldCAoQ0FTKSB0cmFuc2FjdGlvbi4gV2l0aCBDQVMKK3NlcXVlbnRpYWwgY29uc2lzdGVuY3kgd2l0aCByZWFsLXRpbWUgY29uc3RyYWludHMsIGFuZCBpdCBlbnN1cmVzCit0cmFuc2FjdGlvbiBpc29sYXRpb24gd2l0aCBjb21wYXJlLWFuZC1zZXQgKENBUykgdHJhbnNhY3Rpb25zLiBXaXRoIENBUwogcmVwbGljYSBkYXRhIGlzIGNvbXBhcmVkIGFuZCBkYXRhIHRoYXQgaXMgZm91bmQgdG8gYmUgb3V0IG9mIGRhdGUgaXMgc2V0CiB0byB0aGUgbW9zdCBjb25zaXN0ZW50IHZhbHVlLiBSZWFkcyB3aXRoIGxpbmVhcml6YWJsZSBjb25zaXN0ZW5jeSBhbGxvdwogcmVhZGluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZGF0YSwgd2hpY2ggbWF5IHBvc3NpYmx5IGJlCkBAIC05NywxMiArOTcsMTIgQEAKIFRoZSBndWFyYW50ZWUgZm9yIGJhdGNoZWQgd3JpdGVzIGFjcm9zcyBtdWx0aXBsZSB0YWJsZXMgaXMgdGhhdCB0aGV5CiB3aWxsIGV2ZW50dWFsbHkgc3VjY2VlZCwgb3Igbm9uZSB3aWxsLiBCYXRjaCBkYXRhIGlzIGZpcnN0IHdyaXR0ZW4gdG8KIGJhdGNobG9nIHN5c3RlbSBkYXRhLCBhbmQgd2hlbiB0aGUgYmF0Y2ggZGF0YSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkKLXN0b3JlZCBpbiB0aGUgY2x1c3RlciB0aGUgYmF0Y2hsb2cgZGF0YSBpcyByZW1vdmVkLiBUaGUgYmF0Y2ggaXMKLXJlcGxpY2F0ZWQgdG8gYW5vdGhlciBub2RlIHRvIGVuc3VyZSB0aGUgZnVsbCBiYXRjaCBjb21wbGV0ZXMgaW4gdGhlCi1ldmVudCB0aGUgY29vcmRpbmF0b3Igbm9kZSBmYWlscy4KK3N0b3JlZCBpbiB0aGUgY2x1c3RlciwgdGhlIGJhdGNobG9nIGRhdGEgaXMgcmVtb3ZlZC4gVGhlIGJhdGNoIGlzCityZXBsaWNhdGVkIHRvIGFub3RoZXIgbm9kZSB0byBlbnN1cmUgdGhhdCB0aGUgZnVsbCBiYXRjaCBjb21wbGV0ZXMgaW4KK3RoZSBldmVudCBpZiBjb29yZGluYXRvciBub2RlIGZhaWxzLgogCiA9PSBTZWNvbmRhcnkgSW5kZXhlcwogCi1BIHNlY29uZGFyeSBpbmRleCBpcyBhbiBpbmRleCBvbiBhIGNvbHVtbiBhbmQgaXMgdXNlZCB0byBxdWVyeSBhIHRhYmxlCi10aGF0IGlzIG5vcm1hbGx5IG5vdCBxdWVyeWFibGUuIFNlY29uZGFyeSBpbmRleGVzIHdoZW4gYnVpbHQgYXJlCitBIHNlY29uZGFyeSBpbmRleCBpcyBhbiBpbmRleCBvbiBhIGNvbHVtbiwgYW5kIGl0J3MgdXNlZCB0byBxdWVyeSBhIHRhYmxlCit0aGF0IGlzIG5vcm1hbGx5IG5vdCBxdWVyeWFibGUuIFNlY29uZGFyeSBpbmRleGVzLCB3aGVuIGJ1aWx0LCBhcmUKIGd1YXJhbnRlZWQgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZWlyIGxvY2FsIHJlcGxpY2FzLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9pbmRleC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9pbmRleC5hZG9jCmluZGV4IGM0YmVmMDUuLjllNjc0ZDkgMTAwNjQ0Ci0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvaW5kZXguYWRvYworKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL2luZGV4LmFkb2MKQEAgLTQsNiArNCw2IEBACiAKICogeHJlZjphcmNoaXRlY3R1cmUvb3ZlcnZpZXcuYWRvY1tPdmVydmlld10KICogeHJlZjphcmNoaXRlY3R1cmUvZHluYW1vLmFkb2NbRHluYW1vXQotKiB4cmVmOmFyY2hpdGVjdHVyZS9zdG9yYWdlX2VuZ2luZS5hZG9jW1N0b3JhZ2UgRW5naW5lXQorKiB4cmVmOmFyY2hpdGVjdHVyZS9zdG9yYWdlLWVuZ2luZS5hZG9jW1N0b3JhZ2UgRW5naW5lXQogKiB4cmVmOmFyY2hpdGVjdHVyZS9ndWFyYW50ZWVzLmFkb2NbR3VhcmFudGVlc10KICogeHJlZjphcmNoaXRlY3R1cmUvc25pdGNoLmFkb2NbU25pdGNoZXNdCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL292ZXJ2aWV3LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL292ZXJ2aWV3LmFkb2MKaW5kZXggNThkYjZiMS4uMmM4NmNlNCAxMDA2NDQKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9vdmVydmlldy5hZG9jCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvb3ZlcnZpZXcuYWRvYwpAQCAtMSw3ICsxLDcgQEAKID0gT3ZlcnZpZXcKIDpleHBlcjogZXhwZXJpbWVudGFsCiAKLUFwYWNoZSBDYXNzYW5kcmEgaXMgYW4gb3BlbiBzb3VyY2UsIGRpc3RyaWJ1dGVkLCBOb1NRTCBkYXRhYmFzZS4gSXQKK0FwYWNoZSBDYXNzYW5kcmEgaXMgYW4gb3Blbi1zb3VyY2UsIGRpc3RyaWJ1dGVkLCBOb1NRTCBkYXRhYmFzZS4gSXQKIHByZXNlbnRzIGEgcGFydGl0aW9uZWQgd2lkZSBjb2x1bW4gc3RvcmFnZSBtb2RlbCB3aXRoIGV2ZW50dWFsbHkKIGNvbnNpc3RlbnQgc2VtYW50aWNzLgogCkBAIC0xMCw3ICsxMCw3IEBACiB1c2luZyBhIHN0YWdlZCBldmVudC1kcml2ZW4gYXJjaGl0ZWN0dXJlCiAoaHR0cDovL3d3dy5zb3NwLm9yZy8yMDAxL3BhcGVycy93ZWxzaC5wZGZbU0VEQV0pIHRvIGltcGxlbWVudCBhCiBjb21iaW5hdGlvbiBvZiBBbWF6b27igJlzCi1odHRwOi8vY291cnNlcy5jc2UudGFtdS5lZHUvY2F2ZXJsZWUvY3NjZTQzOC9yZWFkaW5ncy9keW5hbW8tcGFwZXIucGRmW0R5bmFtb10KK2h0dHBzOi8vd3d3LmNzLmNvcm5lbGwuZWR1L2NvdXJzZXMvY3M1NDE0LzIwMTdmYS9wYXBlcnMvZHluYW1vLnBkZltEeW5hbW9dCiBkaXN0cmlidXRlZCBzdG9yYWdlIGFuZCByZXBsaWNhdGlvbiB0ZWNobmlxdWVzIGFuZCBHb29nbGUncwogaHR0cHM6Ly9zdGF0aWMuZ29vZ2xldXNlcmNvbnRlbnQuY29tL21lZGlhL3Jlc2VhcmNoLmdvb2dsZS5jb20vZW4vL2FyY2hpdmUvYmlndGFibGUtb3NkaTA2LnBkZltCaWd0YWJsZV0KIGRhdGEgYW5kIHN0b3JhZ2UgZW5naW5lIG1vZGVsLiBEeW5hbW8gYW5kIEJpZ3RhYmxlIHdlcmUgYm90aCBkZXZlbG9wZWQKQEAgLTIzLDcgKzIzLDcgQEAKIHJlcGxpY2F0aW9uIGFuZCBhbHdheXMgYXZhaWxhYmxlIGxvdy1sYXRlbmN5IHJlYWRzIGFuZCB3cml0ZXMsIGl0IGJlY2FtZQogaW1wZXJhdGl2ZSB0byBkZXNpZ24gYSBuZXcga2luZCBvZiBkYXRhYmFzZSBtb2RlbCBhcyB0aGUgcmVsYXRpb25hbAogZGF0YWJhc2Ugc3lzdGVtcyBvZiB0aGUgdGltZSBzdHJ1Z2dsZWQgdG8gbWVldCB0aGUgbmV3IHJlcXVpcmVtZW50cyBvZgotZ2xvYmFsIHNjYWxlIGFwcGxpY2F0aW9ucy4KK2dsb2JhbC1zY2FsZSBhcHBsaWNhdGlvbnMuCiAKIFN5c3RlbXMgbGlrZSBDYXNzYW5kcmEgYXJlIGRlc2lnbmVkIGZvciB0aGVzZSBjaGFsbGVuZ2VzIGFuZCBzZWVrIHRoZQogZm9sbG93aW5nIGRlc2lnbiBvYmplY3RpdmVzOgpAQCAtNTksMTkgKzU5LDE5IEBACiBDUUwgc3VwcG9ydHMgbnVtZXJvdXMgYWR2YW5jZWQgZmVhdHVyZXMgb3ZlciBhIHBhcnRpdGlvbmVkIGRhdGFzZXQgc3VjaAogYXM6CiAKLSogU2luZ2xlIHBhcnRpdGlvbiBsaWdodHdlaWdodCB0cmFuc2FjdGlvbnMgd2l0aCBhdG9taWMgY29tcGFyZSBhbmQgc2V0Ci1zZW1hbnRpY3MuCisqIFNpbmdsZS1wYXJ0aXRpb24gbGlnaHR3ZWlnaHQgdHJhbnNhY3Rpb25zIHdpdGggYXRvbWljIGNvbXBhcmUgYW5kIHNldAorc2VtYW50aWNzCiAqIFVzZXItZGVmaW5lZCB0eXBlcywgZnVuY3Rpb25zIGFuZCBhZ2dyZWdhdGVzCi0qIENvbGxlY3Rpb24gdHlwZXMgaW5jbHVkaW5nIHNldHMsIG1hcHMsIGFuZCBsaXN0cy4KKyogQ29sbGVjdGlvbiB0eXBlcyBpbmNsdWRpbmcgc2V0cywgbWFwcywgYW5kIGxpc3RzCiAqIExvY2FsIHNlY29uZGFyeSBpbmRpY2VzCiAqIChFeHBlcmltZW50YWwpIG1hdGVyaWFsaXplZCB2aWV3cwogCiBDYXNzYW5kcmEgZXhwbGljaXRseSBjaG9vc2VzIG5vdCB0byBpbXBsZW1lbnQgb3BlcmF0aW9ucyB0aGF0IHJlcXVpcmUKLWNyb3NzIHBhcnRpdGlvbiBjb29yZGluYXRpb24gYXMgdGhleSBhcmUgdHlwaWNhbGx5IHNsb3cgYW5kIGhhcmQgdG8KK2Nyb3NzLXBhcnRpdGlvbiBjb29yZGluYXRpb24gYXMgdGhleSBhcmUgdHlwaWNhbGx5IHNsb3cgYW5kIGhhcmQgdG8KIHByb3ZpZGUgaGlnaGx5IGF2YWlsYWJsZSBnbG9iYWwgc2VtYW50aWNzLiBGb3IgZXhhbXBsZSBDYXNzYW5kcmEgZG9lcwogbm90IHN1cHBvcnQ6CiAKLSogQ3Jvc3MgcGFydGl0aW9uIHRyYW5zYWN0aW9ucworKiBDcm9zcy1wYXJ0aXRpb24gdHJhbnNhY3Rpb25zCiAqIERpc3RyaWJ1dGVkIGpvaW5zCiAqIEZvcmVpZ24ga2V5cyBvciByZWZlcmVudGlhbCBpbnRlZ3JpdHkuCiAKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvc25pdGNoLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvYXJjaGl0ZWN0dXJlL3NuaXRjaC5hZG9jCmluZGV4IDNhZTA2NmQuLmNkNTlmOTggMTAwNjQ0Ci0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvc25pdGNoLmFkb2MKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9zbml0Y2guYWRvYwpAQCAtMTIsNyArMTIsNyBAQAogCiA9PSBEeW5hbWljIHNuaXRjaGluZwogCi1UaGUgZHluYW1pYyBzbml0Y2ggbW9uaXRvciByZWFkIGxhdGVuY2llcyB0byBhdm9pZCByZWFkaW5nIGZyb20gaG9zdHMKK1RoZSBkeW5hbWljIHNuaXRjaCBtb25pdG9ycyByZWFkIGxhdGVuY2llcyB0byBhdm9pZCByZWFkaW5nIGZyb20gaG9zdHMKIHRoYXQgaGF2ZSBzbG93ZWQgZG93bi4gVGhlIGR5bmFtaWMgc25pdGNoIGlzIGNvbmZpZ3VyZWQgd2l0aCB0aGUKIGZvbGxvd2luZyBwcm9wZXJ0aWVzIG9uIGBjYXNzYW5kcmEueWFtbGA6CiAKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvc3RvcmFnZS1lbmdpbmUuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvc3RvcmFnZS1lbmdpbmUuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjE1OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9zdG9yYWdlLWVuZ2luZS5hZG9jCkBAIC0wLDAgKzEsMjI4IEBACis9IFN0b3JhZ2UgRW5naW5lCisKK1tbY29tbWl0LWxvZ11dCis9PSBDb21taXRMb2cKKworQ29tbWl0bG9ncyBhcmUgYW4gYXBwZW5kLW9ubHkgbG9nIG9mIGFsbCBtdXRhdGlvbnMgbG9jYWwgdG8gYSBDYXNzYW5kcmEKK25vZGUuIEFueSBkYXRhIHdyaXR0ZW4gdG8gQ2Fzc2FuZHJhIHdpbGwgZmlyc3QgYmUgd3JpdHRlbiB0byBhIGNvbW1pdAorbG9nIGJlZm9yZSBiZWluZyB3cml0dGVuIHRvIGEgbWVtdGFibGUuIFRoaXMgcHJvdmlkZXMgZHVyYWJpbGl0eSBpbiB0aGUKK2Nhc2Ugb2YgdW5leHBlY3RlZCBzaHV0ZG93bi4gT24gc3RhcnR1cCwgYW55IG11dGF0aW9ucyBpbiB0aGUgY29tbWl0IGxvZword2lsbCBiZSBhcHBsaWVkIHRvIG1lbXRhYmxlcy4KKworQWxsIG11dGF0aW9ucyBhcmUgd3JpdGUtb3B0aW1pemVkIGJ5IHN0b3JpbmcgaW4gY29tbWl0bG9nIHNlZ21lbnRzLCByZWR1Y2luZwordGhlIG51bWJlciBvZiBzZWVrcyBuZWVkZWQgdG8gd3JpdGUgdG8gZGlzay4gQ29tbWl0bG9nIHNlZ21lbnRzIGFyZQorbGltaXRlZCBieSB0aGUgYGNvbW1pdGxvZ19zZWdtZW50X3NpemVgIG9wdGlvbi4gT25jZSB0aGUgc2l6ZSBpcworcmVhY2hlZCwgYSBuZXcgY29tbWl0bG9nIHNlZ21lbnQgaXMgY3JlYXRlZC4gQ29tbWl0bG9nIHNlZ21lbnRzIGNhbiBiZQorYXJjaGl2ZWQsIGRlbGV0ZWQsIG9yIHJlY3ljbGVkIG9uY2UgYWxsIHRoZSBkYXRhIGhhcyBiZWVuIGZsdXNoZWQgdG8KK1NTVGFibGVzLiBDb21taXRsb2cgc2VnbWVudHMgYXJlIHRydW5jYXRlZCB3aGVuIENhc3NhbmRyYSBoYXMgd3JpdHRlbgorZGF0YSBvbGRlciB0aGFuIGEgY2VydGFpbiBwb2ludCB0byB0aGUgU1NUYWJsZXMuIFJ1bm5pbmcgIm5vZGV0b29sCitkcmFpbiIgYmVmb3JlIHN0b3BwaW5nIENhc3NhbmRyYSB3aWxsIHdyaXRlIGV2ZXJ5dGhpbmcgaW4gdGhlIG1lbXRhYmxlcwordG8gU1NUYWJsZXMgYW5kIHJlbW92ZSB0aGUgbmVlZCB0byBzeW5jIHdpdGggdGhlIGNvbW1pdGxvZ3Mgb24gc3RhcnR1cC4KKworKiBgY29tbWl0bG9nX3NlZ21lbnRfc2l6ZWA6IFRoZSBkZWZhdWx0IHNpemUgaXMgMzJNaUIsIHdoaWNoIGlzCithbG1vc3QgYWx3YXlzIGZpbmUsIGJ1dCBpZiB5b3UgYXJlIGFyY2hpdmluZyBjb21taXRsb2cgc2VnbWVudHMgKHNlZQorY29tbWl0bG9nX2FyY2hpdmluZy5wcm9wZXJ0aWVzKSwgdGhlbiB5b3UgcHJvYmFibHkgd2FudCBhIGZpbmVyCitncmFudWxhcml0eSBvZiBhcmNoaXZpbmc7IDggb3IgMTYgTWlCIGlzIHJlYXNvbmFibGUuCitgY29tbWl0bG9nX3NlZ21lbnRfc2l6ZWAgYWxzbyBkZXRlcm1pbmVzIHRoZSBkZWZhdWx0IHZhbHVlIG9mCitgbWF4X211dGF0aW9uX3NpemVgIGluIGBjYXNzYW5kcmEueWFtbGAuIEJ5IGRlZmF1bHQsCitgbWF4X211dGF0aW9uX3NpemVgIGlzIGEgaGFsZiB0aGUgc2l6ZSBvZiBgY29tbWl0bG9nX3NlZ21lbnRfc2l6ZWAuCisKK1tOT1RFXQorLk5vdGUKKz09PT0KK0lmIGBtYXhfbXV0YXRpb25fc2l6ZWAgaXMgc2V0IGV4cGxpY2l0bHkgdGhlbgorYGNvbW1pdGxvZ19zZWdtZW50X3NpemVgIG11c3QgYmUgc2V0IHRvIGF0IGxlYXN0IHR3aWNlIHRoZSBzaXplIG9mCitgbWF4X211dGF0aW9uX3NpemVgLgorPT09PQorCisqIGBjb21taXRsb2dfc3luY2A6IG1heSBiZSBlaXRoZXIgX3BlcmlvZGljXyBvciBfYmF0Y2hfLgorKiogYGJhdGNoYDogSW4gYmF0Y2ggbW9kZSwgQ2Fzc2FuZHJhIHdvbuKAmXQgYWNrIHdyaXRlcyB1bnRpbCB0aGUgY29tbWl0Citsb2cgaGFzIGJlZW4gZnN5bmNlZCB0byBkaXNrLiBJdCB3aWxsIHdhaXQKKyJjb21taXRsb2dfc3luY19iYXRjaF93aW5kb3dfaW5fbXMiIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIGZzeW5jcy4gVGhpcword2luZG93IHNob3VsZCBiZSBrZXB0IHNob3J0IGJlY2F1c2UgdGhlIHdyaXRlciB0aHJlYWRzIHdpbGwgYmUgdW5hYmxlIHRvCitkbyBleHRyYSB3b3JrIHdoaWxlIHdhaXRpbmcuIFlvdSBtYXkgbmVlZCB0byBpbmNyZWFzZSBjb25jdXJyZW50X3dyaXRlcworZm9yIHRoZSBzYW1lIHJlYXNvbi4KKysKKy0gYGNvbW1pdGxvZ19zeW5jX2JhdGNoX3dpbmRvd19pbl9tc2A6IFRpbWUgdG8gd2FpdCBiZXR3ZWVuICJiYXRjaCIKK2ZzeW5jcyBfRGVmYXVsdCBWYWx1ZTpfIDIKKyoqIGBwZXJpb2RpY2A6IEluIHBlcmlvZGljIG1vZGUsIHdyaXRlcyBhcmUgaW1tZWRpYXRlbHkgYWNrJ2VkLCBhbmQgdGhlCitDb21taXRMb2cgaXMgc2ltcGx5IHN5bmNlZCBldmVyeSAiY29tbWl0bG9nX3N5bmNfcGVyaW9kIgorbWlsbGlzZWNvbmRzLgorKworLSBgY29tbWl0bG9nX3N5bmNfcGVyaW9kYDogVGltZSB0byB3YWl0IGJldHdlZW4gInBlcmlvZGljIiBmc3luY3MKK19EZWZhdWx0IFZhbHVlOl8gMTAwMDBtcworCitfRGVmYXVsdCBWYWx1ZTpfIGJhdGNoCisKK1tOT1RFXQorLk5vdGUKKz09PT0KK0luIHRoZSBldmVudCBvZiBhbiB1bmV4cGVjdGVkIHNodXRkb3duLCBDYXNzYW5kcmEgY2FuIGxvc2UgdXAKK3RvIHRoZSBzeW5jIHBlcmlvZCBvciBtb3JlIGlmIHRoZSBzeW5jIGlzIGRlbGF5ZWQuIElmIHVzaW5nICJiYXRjaCIKK21vZGUsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHN0b3JlIGNvbW1pdGxvZ3MgaW4gYSBzZXBhcmF0ZSwgZGVkaWNhdGVkCitkZXZpY2UuCis9PT09CisKKyogYGNvbW1pdGxvZ19kaXJlY3RvcnlgOiBUaGlzIG9wdGlvbiBpcyBjb21tZW50ZWQgb3V0IGJ5IGRlZmF1bHQuIFdoZW4KK3J1bm5pbmcgb24gbWFnbmV0aWMgSERELCB0aGlzIHNob3VsZCBiZSBhIHNlcGFyYXRlIHNwaW5kbGUgdGhhbiB0aGUgZGF0YQorZGlyZWN0b3JpZXMuIElmIG5vdCBzZXQsIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpcworYCRDQVNTQU5EUkFfSE9NRS9kYXRhL2NvbW1pdGxvZ2AuCisKK19EZWZhdWx0IFZhbHVlOl8gYC92YXIvbGliL2Nhc3NhbmRyYS9jb21taXRsb2dgCisKKyogYGNvbW1pdGxvZ19jb21wcmVzc2lvbmA6IENvbXByZXNzaW9uIHRvIGFwcGx5IHRvIHRoZSBjb21taXRsb2cuIElmCitvbWl0dGVkLCB0aGUgY29tbWl0IGxvZyB3aWxsIGJlIHdyaXR0ZW4gdW5jb21wcmVzc2VkLiBMWjQsIFNuYXBweSwKK0RlZmxhdGUgYW5kIFpzdGQgY29tcHJlc3NvcnMgYXJlIHN1cHBvcnRlZC4KKworX0RlZmF1bHQgVmFsdWU6XyAoY29tcGxleCBvcHRpb24pOgorCitbc291cmNlLCB5YW1sXQorLS0tLQorIyAgIC0gY2xhc3NfbmFtZTogTFo0Q29tcHJlc3NvcgorIyAgICAgcGFyYW1ldGVyczoKKy0tLS0KKworKiBgY29tbWl0bG9nX3RvdGFsX3NwYWNlYDogVG90YWwgc3BhY2UgdG8gdXNlIGZvciBjb21taXQgbG9ncyBvbgorZGlzay4KKworSWYgc3BhY2UgZ2V0cyBhYm92ZSB0aGlzIHZhbHVlLCBDYXNzYW5kcmEgd2lsbCBmbHVzaCBldmVyeSBkaXJ0eSBDRiBpbgordGhlIG9sZGVzdCBzZWdtZW50IGFuZCByZW1vdmUgaXQuIFNvIGEgc21hbGwgdG90YWwgY29tbWl0bG9nIHNwYWNlIHdpbGwKK3RlbmQgdG8gY2F1c2UgbW9yZSBmbHVzaCBhY3Rpdml0eSBvbiBsZXNzLWFjdGl2ZSBjb2x1bW5mYW1pbGllcy4KKworVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIHNtYWxsZXN0IGJldHdlZW4gODE5MiBhbmQgMS80IG9mIHRoZSB0b3RhbAorc3BhY2Ugb2YgdGhlIGNvbW1pdGxvZyB2b2x1bWUuCisKK19EZWZhdWx0IFZhbHVlOl8gODE5Mk1pQgorCis9PSBNZW10YWJsZXMKKworTWVtdGFibGVzIGFyZSBpbi1tZW1vcnkgc3RydWN0dXJlcyB3aGVyZSBDYXNzYW5kcmEgYnVmZmVycyB3cml0ZXMuIEluCitnZW5lcmFsLCB0aGVyZSBpcyBvbmUgYWN0aXZlIG1lbXRhYmxlIHBlciB0YWJsZS4gRXZlbnR1YWxseSwgbWVtdGFibGVzCithcmUgZmx1c2hlZCBvbnRvIGRpc2sgYW5kIGJlY29tZSBpbW11dGFibGUgbGluazojc3N0YWJsZXNbU1NUYWJsZXNdLgorVGhpcyBjYW4gYmUgdHJpZ2dlcmVkIGluIHNldmVyYWwgd2F5czoKKworKiBUaGUgbWVtb3J5IHVzYWdlIG9mIHRoZSBtZW10YWJsZXMgZXhjZWVkcyB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQKKyhzZWUgYG1lbXRhYmxlX2NsZWFudXBfdGhyZXNob2xkYCkKKyogVGhlIGBjb21taXQtbG9nYCBhcHByb2FjaGVzIGl0cyBtYXhpbXVtIHNpemUsIGFuZCBmb3JjZXMgbWVtdGFibGUKK2ZsdXNoZXMgaW4gb3JkZXIgdG8gYWxsb3cgY29tbWl0bG9nIHNlZ21lbnRzIHRvIGJlIGZyZWVkCisKK01lbXRhYmxlcyBtYXkgYmUgc3RvcmVkIGVudGlyZWx5IG9uLWhlYXAgb3IgcGFydGlhbGx5IG9mZi1oZWFwLAorZGVwZW5kaW5nIG9uIGBtZW10YWJsZV9hbGxvY2F0aW9uX3R5cGVgLgorCis9PSBTU1RhYmxlcworCitTU1RhYmxlcyBhcmUgdGhlIGltbXV0YWJsZSBkYXRhIGZpbGVzIHRoYXQgQ2Fzc2FuZHJhIHVzZXMgZm9yIHBlcnNpc3RpbmcKK2RhdGEgb24gZGlzay4KKworQXMgU1NUYWJsZXMgYXJlIGZsdXNoZWQgdG8gZGlzayBmcm9tIGBtZW10YWJsZXNgIG9yIGFyZSBzdHJlYW1lZCBmcm9tCitvdGhlciBub2RlcywgQ2Fzc2FuZHJhIHRyaWdnZXJzIGNvbXBhY3Rpb25zIHdoaWNoIGNvbWJpbmUgbXVsdGlwbGUKK1NTVGFibGVzIGludG8gb25lLiBPbmNlIHRoZSBuZXcgU1NUYWJsZSBoYXMgYmVlbiB3cml0dGVuLCB0aGUgb2xkCitTU1RhYmxlcyBjYW4gYmUgcmVtb3ZlZC4KKworRWFjaCBTU1RhYmxlIGlzIGNvbXByaXNlZCBvZiBtdWx0aXBsZSBjb21wb25lbnRzIHN0b3JlZCBpbiBzZXBhcmF0ZQorZmlsZXM6CisKK2BEYXRhLmRiYDo6CisgIFRoZSBhY3R1YWwgZGF0YSwgaS5lLiB0aGUgY29udGVudHMgb2Ygcm93cy4KK2BJbmRleC5kYmA6OgorICBBbiBpbmRleCBmcm9tIHBhcnRpdGlvbiBrZXlzIHRvIHBvc2l0aW9ucyBpbiB0aGUgYERhdGEuZGJgIGZpbGUuIEZvcgorICB3aWRlIHBhcnRpdGlvbnMsIHRoaXMgbWF5IGFsc28gaW5jbHVkZSBhbiBpbmRleCB0byByb3dzIHdpdGhpbiBhCisgIHBhcnRpdGlvbi4KK2BTdW1tYXJ5LmRiYDo6CisgIEEgc2FtcGxpbmcgb2YgKGJ5IGRlZmF1bHQpIGV2ZXJ5IDEyOHRoIGVudHJ5IGluIHRoZSBgSW5kZXguZGJgIGZpbGUuCitgRmlsdGVyLmRiYDo6CisgIEEgQmxvb20gRmlsdGVyIG9mIHRoZSBwYXJ0aXRpb24ga2V5cyBpbiB0aGUgU1NUYWJsZS4KK2BDb21wcmVzc2lvbkluZm8uZGJgOjoKKyAgTWV0YWRhdGEgYWJvdXQgdGhlIG9mZnNldHMgYW5kIGxlbmd0aHMgb2YgY29tcHJlc3Npb24gY2h1bmtzIGluIHRoZQorICBgRGF0YS5kYmAgZmlsZS4KK2BTdGF0aXN0aWNzLmRiYDo6CisgIFN0b3JlcyBtZXRhZGF0YSBhYm91dCB0aGUgU1NUYWJsZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0CisgIHRpbWVzdGFtcHMsIHRvbWJzdG9uZXMsIGNsdXN0ZXJpbmcga2V5cywgY29tcGFjdGlvbiwgcmVwYWlyLAorICBjb21wcmVzc2lvbiwgVFRMcywgYW5kIG1vcmUuCitgRGlnZXN0LmNyYzMyYDo6CisgIEEgQ1JDLTMyIGRpZ2VzdCBvZiB0aGUgYERhdGEuZGJgIGZpbGUuCitgVE9DLnR4dGA6OgorICBBIHBsYWluIHRleHQgbGlzdCBvZiB0aGUgY29tcG9uZW50IGZpbGVzIGZvciB0aGUgU1NUYWJsZS4KKworV2l0aGluIHRoZSBgRGF0YS5kYmAgZmlsZSwgcm93cyBhcmUgb3JnYW5pemVkIGJ5IHBhcnRpdGlvbi4gVGhlc2UKK3BhcnRpdGlvbnMgYXJlIHNvcnRlZCBpbiB0b2tlbiBvcmRlciAoaS5lLiBieSBhIGhhc2ggb2YgdGhlIHBhcnRpdGlvbgora2V5IHdoZW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uZXIsIGBNdXJtdXIzUGFydGl0aW9uYCwgaXMgdXNlZCkuIFdpdGhpbiBhCitwYXJ0aXRpb24sIHJvd3MgYXJlIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2YgdGhlaXIgY2x1c3RlcmluZyBrZXlzLgorCitTU1RhYmxlcyBjYW4gYmUgb3B0aW9uYWxseSBjb21wcmVzc2VkIHVzaW5nIGJsb2NrLWJhc2VkIGNvbXByZXNzaW9uLgorCis9PSBTU1RhYmxlIFZlcnNpb25zCisKK1RoaXMgc2VjdGlvbiB3YXMgY3JlYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nCitodHRwczovL2dpc3QuZ2l0aHViLmNvbS9zaHlhbXNhbGlta3VtYXIvNDlhNjFlNWJjNmY0MDNkMjBjNTVbZ2lzdF0gd2hpY2gKK3V0aWxpemVkIHRoaXMgb3JpZ2luYWwKK2h0dHA6Ly93d3cuYmFqYi5uZXQvMjAxMy8wMy9jYXNzYW5kcmEtc3N0YWJsZS1mb3JtYXQtdmVyc2lvbi1udW1iZXJzL1tzb3VyY2VdLgorCitUaGUgdmVyc2lvbiBudW1iZXJzLCB0byBkYXRlIGFyZToKKworPT09IFZlcnNpb24gMAorCisqIGIgKDAuNy4wKTogYWRkZWQgdmVyc2lvbiB0byBzc3RhYmxlIGZpbGVuYW1lcworKiBjICgwLjcuMCk6IGJsb29tIGZpbHRlciBjb21wb25lbnQgY29tcHV0ZXMgaGFzaGVzIG92ZXIgcmF3IGtleSBieXRlcworaW5zdGVhZCBvZiBzdHJpbmdzCisqIGQgKDAuNy4wKTogcm93IHNpemUgaW4gZGF0YSBjb21wb25lbnQgYmVjb21lcyBhIGxvbmcgaW5zdGVhZCBvZiBpbnQKKyogZSAoMC43LjApOiBzdG9yZXMgdW5kZWNvcmF0ZWQga2V5cyBpbiBkYXRhIGFuZCBpbmRleCBjb21wb25lbnRzCisqIGYgKDAuNy4wKTogc3dpdGNoZWQgYmxvb20gZmlsdGVyIGltcGxlbWVudGF0aW9ucyBpbiBkYXRhIGNvbXBvbmVudAorKiBnICgwLjgpOiB0cmFja3MgZmx1c2hlZC1hdCBjb250ZXh0IGluIG1ldGFkYXRhIGNvbXBvbmVudAorCis9PT0gVmVyc2lvbiAxCisKKyogaCAoMS4wKTogdHJhY2tzIG1heCBjbGllbnQgdGltZXN0YW1wIGluIG1ldGFkYXRhIGNvbXBvbmVudAorKiBoYiAoMS4wLjMpOiByZWNvcmRzIGNvbXByZXNzaW9uIHJhdGlvbiBpbiBtZXRhZGF0YSBjb21wb25lbnQKKyogaGMgKDEuMC40KTogcmVjb3JkcyBwYXJ0aXRpb25lciBpbiBtZXRhZGF0YSBjb21wb25lbnQKKyogaGQgKDEuMC4xMCk6IGluY2x1ZGVzIHJvdyB0b21ic3RvbmVzIGluIG1heHRpbWVzdGFtcAorKiBoZSAoMS4xLjMpOiBpbmNsdWRlcyBhbmNlc3RvcnMgZ2VuZXJhdGlvbiBpbiBtZXRhZGF0YSBjb21wb25lbnQKKyogaGYgKDEuMS42KTogbWFya2VyIHRoYXQgcmVwbGF5IHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIDEuMS41KworbWlsbGlzLWJhc2VkIGlkIChzZWUgQ0FTU0FORFJBLTQ3ODIpCisqIGlhICgxLjIuMCk6CisqKiBjb2x1bW4gaW5kZXhlcyBhcmUgcHJvbW90ZWQgdG8gdGhlIGluZGV4IGZpbGUKKyoqIHJlY29yZHMgZXN0aW1hdGVkIGhpc3RvZ3JhbSBvZiBkZWxldGlvbiB0aW1lcyBpbiB0b21ic3RvbmVzCisqKiBibG9vbSBmaWx0ZXIgKGtleXMgYW5kIGNvbHVtbnMpIHVwZ3JhZGVkIHRvIE11cm11cjMKKyogaWIgKDEuMi4xKTogdHJhY2tzIG1pbiBjbGllbnQgdGltZXN0YW1wIGluIG1ldGFkYXRhIGNvbXBvbmVudAorKiBpYyAoMS4yLjUpOiBvbWl0cyBwZXItcm93IGJsb29tIGZpbHRlciBvZiBjb2x1bW4gbmFtZXMKKworPT09IFZlcnNpb24gMgorCisqIGphICgyLjAuMCk6CisqKiBzdXBlciBjb2x1bW5zIGFyZSBzZXJpYWxpemVkIGFzIGNvbXBvc2l0ZXMgKG5vdGUgdGhhdCB0aGVyZSBpcyBubworcmVhbCBmb3JtYXQgY2hhbmdlLCB0aGlzIGlzIG1vc3RseSBhIG1hcmtlciB0byBrbm93IGlmIHdlIHNob3VsZCBleHBlY3QKK3N1cGVyIGNvbHVtbnMgb3Igbm90LiBXZSBkbyBuZWVkIGEgbWFqb3IgdmVyc2lvbiBidW1wIGhvd2V2ZXIsIGJlY2F1c2UKK3dlIHNob3VsZCBub3QgYWxsb3cgc3RyZWFtaW5nIG9mIHN1cGVyIGNvbHVtbnMgaW50byB0aGlzIG5ldyBmb3JtYXQpCisqKiB0cmFja3MgbWF4IGxvY2FsIGRlbGV0aW9udGltZSBpbiBzc3RhYmxlIG1ldGFkYXRhCisqKiByZWNvcmRzIGJsb29tX2ZpbHRlcl9mcF9jaGFuY2UgaW4gbWV0YWRhdGEgY29tcG9uZW50CisqKiByZW1vdmUgZGF0YSBzaXplIGFuZCBjb2x1bW4gY291bnQgZnJvbSBkYXRhIGZpbGUgKENBU1NBTkRSQS00MTgwKQorKiogdHJhY2tzIG1heC9taW4gY29sdW1uIHZhbHVlcyAoYWNjb3JkaW5nIHRvIGNvbXBhcmF0b3IpCisqIGpiICgyLjAuMSk6CisqKiBzd2l0Y2ggZnJvbSBjcmMzMiB0byBhZGxlcjMyIGZvciBjb21wcmVzc2lvbiBjaGVja3N1bXMKKyoqIGNoZWNrc3VtIHRoZSBjb21wcmVzc2VkIGRhdGEKKyoga2EgKDIuMS4wKToKKyoqIG5ldyBTdGF0aXN0aWNzLmRiIGZpbGUgZm9ybWF0CisqKiBpbmRleCBzdW1tYXJpZXMgY2FuIGJlIGRvd25zYW1wbGVkIGFuZCB0aGUgc2FtcGxpbmcgbGV2ZWwgaXMKK3BlcnNpc3RlZAorKiogc3dpdGNoIHVuY29tcHJlc3NlZCBjaGVja3N1bXMgdG8gYWRsZXIzMgorKiogdHJhY2tzIHByZXNlbmNlIG9mIGxlZ2FjeSAobG9jYWwgYW5kIHJlbW90ZSkgY291bnRlciBzaGFyZHMKKyogbGEgKDIuMi4wKTogbmV3IGZpbGUgbmFtZSBmb3JtYXQKKyogbGIgKDIuMi43KTogY29tbWl0IGxvZyBsb3dlciBib3VuZCBpbmNsdWRlZAorCis9PT0gVmVyc2lvbiAzCisKKyogbWEgKDMuMC4wKToKKyoqIHN3YXAgYmYgaGFzaCBvcmRlcgorKiogc3RvcmUgcm93cyBuYXRpdmVseQorKiBtYiAoMy4wLjcsIDMuNyk6IGNvbW1pdCBsb2cgbG93ZXIgYm91bmQgaW5jbHVkZWQKKyogbWMgKDMuMC44LCAzLjkpOiBjb21taXQgbG9nIGludGVydmFscyBpbmNsdWRlZAorCis9PT0gRXhhbXBsZSBDb2RlCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyB1c2VmdWwgZm9yIGZpbmRpbmcgYWxsIHNzdGFibGVzIHRoYXQgZG8gbm90CittYXRjaCB0aGUgImliIiBTU1RhYmxlIHZlcnNpb24KKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2ZpbmRfc3N0YWJsZXMuc2hbXQorLS0tLQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9zdG9yYWdlX2VuZ2luZS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2FyY2hpdGVjdHVyZS9zdG9yYWdlX2VuZ2luZS5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTBjMzdhLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9hcmNoaXRlY3R1cmUvc3RvcmFnZV9lbmdpbmUuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi09IFN0b3JhZ2UgRW5naW5lCi0KLVtbY29tbWl0LWxvZ11dCi09PSBDb21taXRMb2cKLQotQ29tbWl0bG9ncyBhcmUgYW4gYXBwZW5kIG9ubHkgbG9nIG9mIGFsbCBtdXRhdGlvbnMgbG9jYWwgdG8gYSBDYXNzYW5kcmEKLW5vZGUuIEFueSBkYXRhIHdyaXR0ZW4gdG8gQ2Fzc2FuZHJhIHdpbGwgZmlyc3QgYmUgd3JpdHRlbiB0byBhIGNvbW1pdAotbG9nIGJlZm9yZSBiZWluZyB3cml0dGVuIHRvIGEgbWVtdGFibGUuIFRoaXMgcHJvdmlkZXMgZHVyYWJpbGl0eSBpbiB0aGUKLWNhc2Ugb2YgdW5leHBlY3RlZCBzaHV0ZG93bi4gT24gc3RhcnR1cCwgYW55IG11dGF0aW9ucyBpbiB0aGUgY29tbWl0IGxvZwotd2lsbCBiZSBhcHBsaWVkIHRvIG1lbXRhYmxlcy4KLQotQWxsIG11dGF0aW9ucyB3cml0ZSBvcHRpbWl6ZWQgYnkgc3RvcmluZyBpbiBjb21taXRsb2cgc2VnbWVudHMsIHJlZHVjaW5nCi10aGUgbnVtYmVyIG9mIHNlZWtzIG5lZWRlZCB0byB3cml0ZSB0byBkaXNrLiBDb21taXRsb2cgU2VnbWVudHMgYXJlCi1saW1pdGVkIGJ5IHRoZSBgY29tbWl0bG9nX3NlZ21lbnRfc2l6ZWAgb3B0aW9uLCBvbmNlIHRoZSBzaXplIGlzCi1yZWFjaGVkLCBhIG5ldyBjb21taXRsb2cgc2VnbWVudCBpcyBjcmVhdGVkLiBDb21taXRsb2cgc2VnbWVudHMgY2FuIGJlCi1hcmNoaXZlZCwgZGVsZXRlZCwgb3IgcmVjeWNsZWQgb25jZSBhbGwgaXRzIGRhdGEgaGFzIGJlZW4gZmx1c2hlZCB0bwotU1NUYWJsZXMuIENvbW1pdGxvZyBzZWdtZW50cyBhcmUgdHJ1bmNhdGVkIHdoZW4gQ2Fzc2FuZHJhIGhhcyB3cml0dGVuCi1kYXRhIG9sZGVyIHRoYW4gYSBjZXJ0YWluIHBvaW50IHRvIHRoZSBTU1RhYmxlcy4gUnVubmluZyAibm9kZXRvb2wKLWRyYWluIiBiZWZvcmUgc3RvcHBpbmcgQ2Fzc2FuZHJhIHdpbGwgd3JpdGUgZXZlcnl0aGluZyBpbiB0aGUgbWVtdGFibGVzCi10byBTU1RhYmxlcyBhbmQgcmVtb3ZlIHRoZSBuZWVkIHRvIHN5bmMgd2l0aCB0aGUgY29tbWl0bG9ncyBvbiBzdGFydHVwLgotCi0qIGBjb21taXRsb2dfc2VnbWVudF9zaXplYDogVGhlIGRlZmF1bHQgc2l6ZSBpcyAzMk1pQiwgd2hpY2ggaXMKLWFsbW9zdCBhbHdheXMgZmluZSwgYnV0IGlmIHlvdSBhcmUgYXJjaGl2aW5nIGNvbW1pdGxvZyBzZWdtZW50cyAoc2VlCi1jb21taXRsb2dfYXJjaGl2aW5nLnByb3BlcnRpZXMpLCB0aGVuIHlvdSBwcm9iYWJseSB3YW50IGEgZmluZXIKLWdyYW51bGFyaXR5IG9mIGFyY2hpdmluZzsgOCBvciAxNiBNaUIgaXMgcmVhc29uYWJsZS4gYGNvbW1pdGxvZ19zZWdtZW50X3NpemVgCi1hbHNvIGRldGVybWluZXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYG1heF9tdXRhdGlvbl9zaXplYCBpbiBjYXNzYW5kcmEueWFtbC4KLUJ5IGRlZmF1bHQsIG1heF9tdXRhdGlvbl9zaXplIGlzIGhhbGYgdGhlIHNpemUgb2YgYGNvbW1pdGxvZ19zZWdtZW50X3NpemVgLgotCi0qKk5PVEU6IElmIGBtYXhfbXV0YXRpb25fc2l6ZWAgaXMgc2V0IGV4cGxpY2l0bHkgdGhlbgotYGNvbW1pdGxvZ19zZWdtZW50X3NpemVgIG11c3QgYmUgc2V0IHRvIGF0IGxlYXN0IHR3aWNlIHRoZSBzaXplIG9mCi1gbWF4X211dGF0aW9uX3NpemVgKiouCi0KLUNvbW1pdGxvZ3MgYXJlIGFuIGFwcGVuZCBvbmx5IGxvZyBvZiBhbGwgbXV0YXRpb25zIGxvY2FsIHRvIGEgQ2Fzc2FuZHJhCi1ub2RlLiBBbnkgZGF0YSB3cml0dGVuIHRvIENhc3NhbmRyYSB3aWxsIGZpcnN0IGJlIHdyaXR0ZW4gdG8gYSBjb21taXQKLWxvZyBiZWZvcmUgYmVpbmcgd3JpdHRlbiB0byBhIG1lbXRhYmxlLiBUaGlzIHByb3ZpZGVzIGR1cmFiaWxpdHkgaW4gdGhlCi1jYXNlIG9mIHVuZXhwZWN0ZWQgc2h1dGRvd24uIE9uIHN0YXJ0dXAsIGFueSBtdXRhdGlvbnMgaW4gdGhlIGNvbW1pdCBsb2cKLXdpbGwgYmUgYXBwbGllZC4KLQotKiBgY29tbWl0bG9nX3N5bmNgOiBtYXkgYmUgZWl0aGVyIF9wZXJpb2RpY18gb3IgX2JhdGNoXy4KLSoqIGBiYXRjaGA6IEluIGJhdGNoIG1vZGUsIENhc3NhbmRyYSB3b27igJl0IGFjayB3cml0ZXMgdW50aWwgdGhlIGNvbW1pdAotbG9nIGhhcyBiZWVuIGZzeW5jZWQgdG8gZGlzay4gSXQgd2lsbCB3YWl0Ci0iY29tbWl0bG9nX3N5bmNfYmF0Y2hfd2luZG93X2luX21zIiBtaWxsaXNlY29uZHMgYmV0d2VlbiBmc3luY3MuIFRoaXMKLXdpbmRvdyBzaG91bGQgYmUga2VwdCBzaG9ydCBiZWNhdXNlIHRoZSB3cml0ZXIgdGhyZWFkcyB3aWxsIGJlIHVuYWJsZSB0bwotZG8gZXh0cmEgd29yayB3aGlsZSB3YWl0aW5nLiBZb3UgbWF5IG5lZWQgdG8gaW5jcmVhc2UgY29uY3VycmVudF93cml0ZXMKLWZvciB0aGUgc2FtZSByZWFzb24uCi0rCi0tIGBjb21taXRsb2dfc3luY19iYXRjaF93aW5kb3dfaW5fbXNgOiBUaW1lIHRvIHdhaXQgYmV0d2VlbiAiYmF0Y2giCi1mc3luY3MgX0RlZmF1bHQgVmFsdWU6XyAyCi0qKiBgcGVyaW9kaWNgOiBJbiBwZXJpb2RpYyBtb2RlLCB3cml0ZXMgYXJlIGltbWVkaWF0ZWx5IGFjaydlZCwgYW5kIHRoZQotQ29tbWl0TG9nIGlzIHNpbXBseSBzeW5jZWQgZXZlcnkgImNvbW1pdGxvZ19zeW5jX3BlcmlvZCIKLW1pbGxpc2Vjb25kcy4KLSsKLS0gYGNvbW1pdGxvZ19zeW5jX3BlcmlvZGA6IFRpbWUgdG8gd2FpdCBiZXR3ZWVuICJwZXJpb2RpYyIgZnN5bmNzCi1fRGVmYXVsdCBWYWx1ZTpfIDEwMDAwbXMKLQotX0RlZmF1bHQgVmFsdWU6XyBiYXRjaAotCi0qKiBOT1RFOiBJbiB0aGUgZXZlbnQgb2YgYW4gdW5leHBlY3RlZCBzaHV0ZG93biwgQ2Fzc2FuZHJhIGNhbiBsb3NlIHVwCi10byB0aGUgc3luYyBwZXJpb2Qgb3IgbW9yZSBpZiB0aGUgc3luYyBpcyBkZWxheWVkLiBJZiB1c2luZyAiYmF0Y2giCi1tb2RlLCBpdCBpcyByZWNvbW1lbmRlZCB0byBzdG9yZSBjb21taXRsb2dzIGluIGEgc2VwYXJhdGUsIGRlZGljYXRlZAotZGV2aWNlLioKLQotKiBgY29tbWl0bG9nX2RpcmVjdG9yeWA6IFRoaXMgb3B0aW9uIGlzIGNvbW1lbnRlZCBvdXQgYnkgZGVmYXVsdCBXaGVuCi1ydW5uaW5nIG9uIG1hZ25ldGljIEhERCwgdGhpcyBzaG91bGQgYmUgYSBzZXBhcmF0ZSBzcGluZGxlIHRoYW4gdGhlIGRhdGEKLWRpcmVjdG9yaWVzLiBJZiBub3Qgc2V0LCB0aGUgZGVmYXVsdCBkaXJlY3RvcnkgaXMKLSRDQVNTQU5EUkFfSE9NRS9kYXRhL2NvbW1pdGxvZy4KLQotX0RlZmF1bHQgVmFsdWU6XyAvdmFyL2xpYi9jYXNzYW5kcmEvY29tbWl0bG9nCi0KLSogYGNvbW1pdGxvZ19jb21wcmVzc2lvbmA6IENvbXByZXNzaW9uIHRvIGFwcGx5IHRvIHRoZSBjb21taXRsb2cuIElmCi1vbWl0dGVkLCB0aGUgY29tbWl0IGxvZyB3aWxsIGJlIHdyaXR0ZW4gdW5jb21wcmVzc2VkLiBMWjQsIFNuYXBweSwKLURlZmxhdGUgYW5kIFpzdGQgY29tcHJlc3NvcnMgYXJlIHN1cHBvcnRlZC4KLQotKERlZmF1bHQgVmFsdWU6IChjb21wbGV4IG9wdGlvbik6Ci0KLVtzb3VyY2UsIHlhbWxdCi0tLS0tCi0jICAgLSBjbGFzc19uYW1lOiBMWjRDb21wcmVzc29yCi0jICAgICBwYXJhbWV0ZXJzOgotLS0tLQotCi0qIGBjb21taXRsb2dfdG90YWxfc3BhY2VgOiBUb3RhbCBzcGFjZSB0byB1c2UgZm9yIGNvbW1pdCBsb2dzIG9uCi1kaXNrLgotCi1JZiBzcGFjZSBnZXRzIGFib3ZlIHRoaXMgdmFsdWUsIENhc3NhbmRyYSB3aWxsIGZsdXNoIGV2ZXJ5IGRpcnR5IENGIGluCi10aGUgb2xkZXN0IHNlZ21lbnQgYW5kIHJlbW92ZSBpdC4gU28gYSBzbWFsbCB0b3RhbCBjb21taXRsb2cgc3BhY2Ugd2lsbAotdGVuZCB0byBjYXVzZSBtb3JlIGZsdXNoIGFjdGl2aXR5IG9uIGxlc3MtYWN0aXZlIGNvbHVtbmZhbWlsaWVzLgotCi1UaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgc21hbGxlciBvZiA4MTkyLCBhbmQgMS80IG9mIHRoZSB0b3RhbCBzcGFjZSBvZgotdGhlIGNvbW1pdGxvZyB2b2x1bWUuCi0KLV9EZWZhdWx0IFZhbHVlOl8gODE5Mk1pQgotCi09PSBNZW10YWJsZXMKLQotTWVtdGFibGVzIGFyZSBpbi1tZW1vcnkgc3RydWN0dXJlcyB3aGVyZSBDYXNzYW5kcmEgYnVmZmVycyB3cml0ZXMuIEluCi1nZW5lcmFsLCB0aGVyZSBpcyBvbmUgYWN0aXZlIG1lbXRhYmxlIHBlciB0YWJsZS4gRXZlbnR1YWxseSwgbWVtdGFibGVzCi1hcmUgZmx1c2hlZCBvbnRvIGRpc2sgYW5kIGJlY29tZSBpbW11dGFibGUgbGluazojc3N0YWJsZXNbU1NUYWJsZXNdLgotVGhpcyBjYW4gYmUgdHJpZ2dlcmVkIGluIHNldmVyYWwgd2F5czoKLQotKiBUaGUgbWVtb3J5IHVzYWdlIG9mIHRoZSBtZW10YWJsZXMgZXhjZWVkcyB0aGUgY29uZmlndXJlZCB0aHJlc2hvbGQKLShzZWUgYG1lbXRhYmxlX2NsZWFudXBfdGhyZXNob2xkYCkKLSogVGhlIGBjb21taXQtbG9nYCBhcHByb2FjaGVzIGl0cyBtYXhpbXVtIHNpemUsIGFuZCBmb3JjZXMgbWVtdGFibGUKLWZsdXNoZXMgaW4gb3JkZXIgdG8gYWxsb3cgY29tbWl0bG9nIHNlZ21lbnRzIHRvIGJlIGZyZWVkCi0KLU1lbXRhYmxlcyBtYXkgYmUgc3RvcmVkIGVudGlyZWx5IG9uLWhlYXAgb3IgcGFydGlhbGx5IG9mZi1oZWFwLAotZGVwZW5kaW5nIG9uIGBtZW10YWJsZV9hbGxvY2F0aW9uX3R5cGVgLgotCi09PSBTU1RhYmxlcwotCi1TU1RhYmxlcyBhcmUgdGhlIGltbXV0YWJsZSBkYXRhIGZpbGVzIHRoYXQgQ2Fzc2FuZHJhIHVzZXMgZm9yIHBlcnNpc3RpbmcKLWRhdGEgb24gZGlzay4KLQotQXMgU1NUYWJsZXMgYXJlIGZsdXNoZWQgdG8gZGlzayBmcm9tIGBtZW10YWJsZXNgIG9yIGFyZSBzdHJlYW1lZCBmcm9tCi1vdGhlciBub2RlcywgQ2Fzc2FuZHJhIHRyaWdnZXJzIGNvbXBhY3Rpb25zIHdoaWNoIGNvbWJpbmUgbXVsdGlwbGUKLVNTVGFibGVzIGludG8gb25lLiBPbmNlIHRoZSBuZXcgU1NUYWJsZSBoYXMgYmVlbiB3cml0dGVuLCB0aGUgb2xkCi1TU1RhYmxlcyBjYW4gYmUgcmVtb3ZlZC4KLQotRWFjaCBTU1RhYmxlIGlzIGNvbXByaXNlZCBvZiBtdWx0aXBsZSBjb21wb25lbnRzIHN0b3JlZCBpbiBzZXBhcmF0ZQotZmlsZXM6Ci0KLWBEYXRhLmRiYDo6Ci0gIFRoZSBhY3R1YWwgZGF0YSwgaS5lLiB0aGUgY29udGVudHMgb2Ygcm93cy4KLWBJbmRleC5kYmA6OgotICBBbiBpbmRleCBmcm9tIHBhcnRpdGlvbiBrZXlzIHRvIHBvc2l0aW9ucyBpbiB0aGUgYERhdGEuZGJgIGZpbGUuIEZvcgotICB3aWRlIHBhcnRpdGlvbnMsIHRoaXMgbWF5IGFsc28gaW5jbHVkZSBhbiBpbmRleCB0byByb3dzIHdpdGhpbiBhCi0gIHBhcnRpdGlvbi4KLWBTdW1tYXJ5LmRiYDo6Ci0gIEEgc2FtcGxpbmcgb2YgKGJ5IGRlZmF1bHQpIGV2ZXJ5IDEyOHRoIGVudHJ5IGluIHRoZSBgSW5kZXguZGJgIGZpbGUuCi1gRmlsdGVyLmRiYDo6Ci0gIEEgQmxvb20gRmlsdGVyIG9mIHRoZSBwYXJ0aXRpb24ga2V5cyBpbiB0aGUgU1NUYWJsZS4KLWBDb21wcmVzc2lvbkluZm8uZGJgOjoKLSAgTWV0YWRhdGEgYWJvdXQgdGhlIG9mZnNldHMgYW5kIGxlbmd0aHMgb2YgY29tcHJlc3Npb24gY2h1bmtzIGluIHRoZQotICBgRGF0YS5kYmAgZmlsZS4KLWBTdGF0aXN0aWNzLmRiYDo6Ci0gIFN0b3JlcyBtZXRhZGF0YSBhYm91dCB0aGUgU1NUYWJsZSwgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0Ci0gIHRpbWVzdGFtcHMsIHRvbWJzdG9uZXMsIGNsdXN0ZXJpbmcga2V5cywgY29tcGFjdGlvbiwgcmVwYWlyLAotICBjb21wcmVzc2lvbiwgVFRMcywgYW5kIG1vcmUuCi1gRGlnZXN0LmNyYzMyYDo6Ci0gIEEgQ1JDLTMyIGRpZ2VzdCBvZiB0aGUgYERhdGEuZGJgIGZpbGUuCi1gVE9DLnR4dGA6OgotICBBIHBsYWluIHRleHQgbGlzdCBvZiB0aGUgY29tcG9uZW50IGZpbGVzIGZvciB0aGUgU1NUYWJsZS4KLQotV2l0aGluIHRoZSBgRGF0YS5kYmAgZmlsZSwgcm93cyBhcmUgb3JnYW5pemVkIGJ5IHBhcnRpdGlvbi4gVGhlc2UKLXBhcnRpdGlvbnMgYXJlIHNvcnRlZCBpbiB0b2tlbiBvcmRlciAoaS5lLiBieSBhIGhhc2ggb2YgdGhlIHBhcnRpdGlvbgota2V5IHdoZW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uZXIsIGBNdXJtdXIzUGFydGl0aW9uYCwgaXMgdXNlZCkuIFdpdGhpbiBhCi1wYXJ0aXRpb24sIHJvd3MgYXJlIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2YgdGhlaXIgY2x1c3RlcmluZyBrZXlzLgotCi1TU1RhYmxlcyBjYW4gYmUgb3B0aW9uYWxseSBjb21wcmVzc2VkIHVzaW5nIGJsb2NrLWJhc2VkIGNvbXByZXNzaW9uLgotCi09PSBTU1RhYmxlIFZlcnNpb25zCi0KLVRoaXMgc2VjdGlvbiB3YXMgY3JlYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nCi1odHRwczovL2dpc3QuZ2l0aHViLmNvbS9zaHlhbXNhbGlta3VtYXIvNDlhNjFlNWJjNmY0MDNkMjBjNTVbZ2lzdF0gd2hpY2gKLXV0aWxpemVkIHRoaXMgb3JpZ2luYWwKLWh0dHA6Ly93d3cuYmFqYi5uZXQvMjAxMy8wMy9jYXNzYW5kcmEtc3N0YWJsZS1mb3JtYXQtdmVyc2lvbi1udW1iZXJzL1tzb3VyY2VdLgotCi1UaGUgdmVyc2lvbiBudW1iZXJzLCB0byBkYXRlIGFyZToKLQotPT09IFZlcnNpb24gMAotCi0qIGIgKDAuNy4wKTogYWRkZWQgdmVyc2lvbiB0byBzc3RhYmxlIGZpbGVuYW1lcwotKiBjICgwLjcuMCk6IGJsb29tIGZpbHRlciBjb21wb25lbnQgY29tcHV0ZXMgaGFzaGVzIG92ZXIgcmF3IGtleSBieXRlcwotaW5zdGVhZCBvZiBzdHJpbmdzCi0qIGQgKDAuNy4wKTogcm93IHNpemUgaW4gZGF0YSBjb21wb25lbnQgYmVjb21lcyBhIGxvbmcgaW5zdGVhZCBvZiBpbnQKLSogZSAoMC43LjApOiBzdG9yZXMgdW5kZWNvcmF0ZWQga2V5cyBpbiBkYXRhIGFuZCBpbmRleCBjb21wb25lbnRzCi0qIGYgKDAuNy4wKTogc3dpdGNoZWQgYmxvb20gZmlsdGVyIGltcGxlbWVudGF0aW9ucyBpbiBkYXRhIGNvbXBvbmVudAotKiBnICgwLjgpOiB0cmFja3MgZmx1c2hlZC1hdCBjb250ZXh0IGluIG1ldGFkYXRhIGNvbXBvbmVudAotCi09PT0gVmVyc2lvbiAxCi0KLSogaCAoMS4wKTogdHJhY2tzIG1heCBjbGllbnQgdGltZXN0YW1wIGluIG1ldGFkYXRhIGNvbXBvbmVudAotKiBoYiAoMS4wLjMpOiByZWNvcmRzIGNvbXByZXNzaW9uIHJhdGlvbiBpbiBtZXRhZGF0YSBjb21wb25lbnQKLSogaGMgKDEuMC40KTogcmVjb3JkcyBwYXJ0aXRpb25lciBpbiBtZXRhZGF0YSBjb21wb25lbnQKLSogaGQgKDEuMC4xMCk6IGluY2x1ZGVzIHJvdyB0b21ic3RvbmVzIGluIG1heHRpbWVzdGFtcAotKiBoZSAoMS4xLjMpOiBpbmNsdWRlcyBhbmNlc3RvcnMgZ2VuZXJhdGlvbiBpbiBtZXRhZGF0YSBjb21wb25lbnQKLSogaGYgKDEuMS42KTogbWFya2VyIHRoYXQgcmVwbGF5IHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIDEuMS41KwotbWlsbGlzLWJhc2VkIGlkIChzZWUgQ0FTU0FORFJBLTQ3ODIpCi0qIGlhICgxLjIuMCk6Ci0qKiBjb2x1bW4gaW5kZXhlcyBhcmUgcHJvbW90ZWQgdG8gdGhlIGluZGV4IGZpbGUKLSoqIHJlY29yZHMgZXN0aW1hdGVkIGhpc3RvZ3JhbSBvZiBkZWxldGlvbiB0aW1lcyBpbiB0b21ic3RvbmVzCi0qKiBibG9vbSBmaWx0ZXIgKGtleXMgYW5kIGNvbHVtbnMpIHVwZ3JhZGVkIHRvIE11cm11cjMKLSogaWIgKDEuMi4xKTogdHJhY2tzIG1pbiBjbGllbnQgdGltZXN0YW1wIGluIG1ldGFkYXRhIGNvbXBvbmVudAotKiBpYyAoMS4yLjUpOiBvbWl0cyBwZXItcm93IGJsb29tIGZpbHRlciBvZiBjb2x1bW4gbmFtZXMKLQotPT09IFZlcnNpb24gMgotCi0qIGphICgyLjAuMCk6Ci0qKiBzdXBlciBjb2x1bW5zIGFyZSBzZXJpYWxpemVkIGFzIGNvbXBvc2l0ZXMgKG5vdGUgdGhhdCB0aGVyZSBpcyBubwotcmVhbCBmb3JtYXQgY2hhbmdlLCB0aGlzIGlzIG1vc3RseSBhIG1hcmtlciB0byBrbm93IGlmIHdlIHNob3VsZCBleHBlY3QKLXN1cGVyIGNvbHVtbnMgb3Igbm90LiBXZSBkbyBuZWVkIGEgbWFqb3IgdmVyc2lvbiBidW1wIGhvd2V2ZXIsIGJlY2F1c2UKLXdlIHNob3VsZCBub3QgYWxsb3cgc3RyZWFtaW5nIG9mIHN1cGVyIGNvbHVtbnMgaW50byB0aGlzIG5ldyBmb3JtYXQpCi0qKiB0cmFja3MgbWF4IGxvY2FsIGRlbGV0aW9udGltZSBpbiBzc3RhYmxlIG1ldGFkYXRhCi0qKiByZWNvcmRzIGJsb29tX2ZpbHRlcl9mcF9jaGFuY2UgaW4gbWV0YWRhdGEgY29tcG9uZW50Ci0qKiByZW1vdmUgZGF0YSBzaXplIGFuZCBjb2x1bW4gY291bnQgZnJvbSBkYXRhIGZpbGUgKENBU1NBTkRSQS00MTgwKQotKiogdHJhY2tzIG1heC9taW4gY29sdW1uIHZhbHVlcyAoYWNjb3JkaW5nIHRvIGNvbXBhcmF0b3IpCi0qIGpiICgyLjAuMSk6Ci0qKiBzd2l0Y2ggZnJvbSBjcmMzMiB0byBhZGxlcjMyIGZvciBjb21wcmVzc2lvbiBjaGVja3N1bXMKLSoqIGNoZWNrc3VtIHRoZSBjb21wcmVzc2VkIGRhdGEKLSoga2EgKDIuMS4wKToKLSoqIG5ldyBTdGF0aXN0aWNzLmRiIGZpbGUgZm9ybWF0Ci0qKiBpbmRleCBzdW1tYXJpZXMgY2FuIGJlIGRvd25zYW1wbGVkIGFuZCB0aGUgc2FtcGxpbmcgbGV2ZWwgaXMKLXBlcnNpc3RlZAotKiogc3dpdGNoIHVuY29tcHJlc3NlZCBjaGVja3N1bXMgdG8gYWRsZXIzMgotKiogdHJhY2tzIHByZXNlbnNlIG9mIGxlZ2FjeSAobG9jYWwgYW5kIHJlbW90ZSkgY291bnRlciBzaGFyZHMKLSogbGEgKDIuMi4wKTogbmV3IGZpbGUgbmFtZSBmb3JtYXQKLSogbGIgKDIuMi43KTogY29tbWl0IGxvZyBsb3dlciBib3VuZCBpbmNsdWRlZAotCi09PT0gVmVyc2lvbiAzCi0KLSogbWEgKDMuMC4wKToKLSoqIHN3YXAgYmYgaGFzaCBvcmRlcgotKiogc3RvcmUgcm93cyBuYXRpdmVseQotKiBtYiAoMy4wLjcsIDMuNyk6IGNvbW1pdCBsb2cgbG93ZXIgYm91bmQgaW5jbHVkZWQKLSogbWMgKDMuMC44LCAzLjkpOiBjb21taXQgbG9nIGludGVydmFscyBpbmNsdWRlZAotCi09PT0gRXhhbXBsZSBDb2RlCi0KLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyB1c2VmdWwgZm9yIGZpbmRpbmcgYWxsIHNzdGFibGVzIHRoYXQgZG8gbm90Ci1tYXRjaCB0aGUgImliIiBTU1RhYmxlIHZlcnNpb24KLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTpleGFtcGxlJGZpbmRfc3N0YWJsZXMuc2hbXQotLS0tLQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NvbmZpZ3VyYXRpb24vY2Fzc19sb2diYWNrX3htbF9maWxlLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY29uZmlndXJhdGlvbi9jYXNzX2xvZ2JhY2tfeG1sX2ZpbGUuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY3MzYyMi4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY29uZmlndXJhdGlvbi9jYXNzX2xvZ2JhY2tfeG1sX2ZpbGUuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi09IGxvZ2JhY2sueG1sIGZpbGUKLQotVGhlIGBsb2diYWNrLnhtbGAgY29uZmlndXJhdGlvbiBmaWxlIGNhbiBvcHRpb25hbGx5IHNldCBsb2dnaW5nIGxldmVscwotZm9yIHRoZSBsb2dzIHdyaXR0ZW4gdG8gYHN5c3RlbS5sb2dgIGFuZCBgZGVidWcubG9nYC4gVGhlIGxvZ2dpbmcgbGV2ZWxzCi1jYW4gYWxzbyBiZSBzZXQgdXNpbmcgYG5vZGV0b29sIHNldGxvZ2dpbmdsZXZlbHNgLgotCi09PSBPcHRpb25zCi0KLT09PSBgYXBwZW5kZXIgbmFtZT0iPGFwcGVuZGVyX2Nob2ljZT4iLi4uPC9hcHBlbmRlcj5gIAotCi1TcGVjaWZ5IGxvZyB0eXBlIGFuZCBzZXR0aW5ncy4gUG9zc2libGUgYXBwZW5kZXIgbmFtZXMgYXJlOiBgU1lTVEVNTE9HYCwKLWBERUJVR0xPR2AsIGBBU1lOQ0RFQlVHTE9HYCwgYW5kIGBTVERPVVRgLiBgU1lTVEVNTE9HYCBlbnN1cmVzIHRoYXQgV0FSTgotYW5kIEVSUk9SIG1lc3NhZ2UgYXJlIHdyaXR0ZW4gc3luY2hyb25vdXNseSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCi1gREVCVUdMT0dgIGFuZCBgQVNZTkNERUJVR0xPR2AgZW5zdXJlIHRoYXQgREVCVUcgbWVzc2FnZXMgYXJlIHdyaXR0ZW4KLWVpdGhlciBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5LCByZXNwZWN0aXZlbHksIHRvIHRoZSBzcGVjaWZpZWQKLWZpbGUuIGBTVERPVVRgIHdyaXRlcyBhbGwgbWVzc2FnZXMgdG8gdGhlIGNvbnNvbGUgaW4gYSBodW1hbi1yZWFkYWJsZQotZm9ybWF0LgotCi0qRXhhbXBsZToqIDxhcHBlbmRlciBuYW1lPSJTWVNURU1MT0ciCi1jbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlJvbGxpbmdGaWxlQXBwZW5kZXIiPgotCi09PT0gYDxmaWxlPiA8ZmlsZW5hbWU+IDwvZmlsZT5gIAotCi1TcGVjaWZ5IHRoZSBmaWxlbmFtZSBmb3IgYSBsb2cuCi0KLSpFeGFtcGxlOiogPGZpbGU+JFx7Y2Fzc2FuZHJhLmxvZ2Rpcn0vc3lzdGVtLmxvZzwvZmlsZT4KLQotPT09IGA8bGV2ZWw+IDxsb2dfbGV2ZWw+IDwvbGV2ZWw+YAotCi1TcGVjaWZ5IHRoZSBsZXZlbCBmb3IgYSBsb2cuIFBhcnQgb2YgdGhlIGZpbHRlci4gTGV2ZWxzIGFyZTogYEFMTGAsCi1gVFJBQ0VgLCBgREVCVUdgLCBgSU5GT2AsIGBXQVJOYCwgYEVSUk9SYCwgYE9GRmAuIGBUUkFDRWAgY3JlYXRlcyB0aGUKLW1vc3QgdmVyYm9zZSBsb2csIGBFUlJPUmAgdGhlIGxlYXN0LgotCi1bTk9URV0KLS5Ob3RlCi09PT09Ci1Ob3RlOiBJbmNyZWFzaW5nIGxvZ2dpbmcgbGV2ZWxzIGNhbiBnZW5lcmF0ZSBoZWF2eSBsb2dnaW5nIG91dHB1dCBvbgotYSBtb2RlcmF0ZWx5IHRyYWZmaWNrZWQgY2x1c3Rlci4gWW91IGNhbiB1c2UgdGhlCi1gbm9kZXRvb2wgZ2V0bG9nZ2luZ2xldmVsc2AgY29tbWFuZCB0byBzZWUgdGhlIGN1cnJlbnQgbG9nZ2luZwotY29uZmlndXJhdGlvbi4KLT09PT0KLQotKkRlZmF1bHQ6KiBJTkZPCi0KLSpFeGFtcGxlOiogPGxldmVsPklORk88L2xldmVsPgotCi09PT0gYDxyb2xsaW5nUG9saWN5IGNsYXNzPSI8cm9sbGluZ19wb2xpY3lfY2hvaWNlPiIgPGZpbGVOYW1lUGF0dGVybj48cGF0dGVybl9pbmZvPjwvZmlsZU5hbWVQYXR0ZXJuPiAuLi4gPC9yb2xsaW5nUG9saWN5PmAKLQotU3BlY2lmeSB0aGUgcG9saWN5IGZvciByb2xsaW5nIGxvZ3Mgb3ZlciB0byBhbiBhcmNoaXZlLgotCi0qRXhhbXBsZToqIDxyb2xsaW5nUG9saWN5Ci1jbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlNpemVBbmRUaW1lQmFzZWRSb2xsaW5nUG9saWN5Ij4KLQotPT09IGA8ZmlsZU5hbWVQYXR0ZXJuPiA8cGF0dGVybl9pbmZvPiA8L2ZpbGVOYW1lUGF0dGVybj5gCi0KLVNwZWNpZnkgdGhlIHBhdHRlcm4gaW5mb3JtYXRpb24gZm9yIHJvbGxpbmcgb3ZlciB0aGUgbG9nIHRvIGFyY2hpdmUuCi1QYXJ0IG9mIHRoZSByb2xsaW5nIHBvbGljeS4KLQotKkV4YW1wbGU6KgotPGZpbGVOYW1lUGF0dGVybj4kXHtjYXNzYW5kcmEubG9nZGlyfS9zeXN0ZW0ubG9nLiVkXHt5eXl5LU1NLWRkfS4laS56aXA8L2ZpbGVOYW1lUGF0dGVybj4KLQotPT09IGA8bWF4RmlsZVNpemU+IDxzaXplPiA8L21heEZpbGVTaXplPmAKLQotU3BlY2lmeSB0aGUgbWF4aW11bSBmaWxlIHNpemUgdG8gdHJpZ2dlciByb2xsaW5nIGEgbG9nLiBQYXJ0IG9mIHRoZQotcm9sbGluZyBwb2xpY3kuCi0KLSpFeGFtcGxlOiogPG1heEZpbGVTaXplPjUwTUI8L21heEZpbGVTaXplPgotCi09PT0gYDxtYXhIaXN0b3J5PiA8bnVtYmVyX29mX2RheXM+IDwvbWF4SGlzdG9yeT5gCi0KLVNwZWNpZnkgdGhlIG1heGltdW0gaGlzdG9yeSBpbiBkYXlzIHRvIHRyaWdnZXIgcm9sbGluZyBhIGxvZy4gUGFydCBvZgotdGhlIHJvbGxpbmcgcG9saWN5LgotCi0qRXhhbXBsZToqIDxtYXhIaXN0b3J5Pjc8L21heEhpc3Rvcnk+Ci0KLT09PSBgPGVuY29kZXI+IDxwYXR0ZXJuPi4uLjwvcGF0dGVybj4gPC9lbmNvZGVyPmAKLQotU3BlY2lmeSB0aGUgZm9ybWF0IG9mIHRoZSBtZXNzYWdlLiBQYXJ0IG9mIHRoZSByb2xsaW5nIHBvbGljeS4KLQotKkV4YW1wbGU6KiA8bWF4SGlzdG9yeT43PC9tYXhIaXN0b3J5PiAqRXhhbXBsZToqIDxlbmNvZGVyPgotPHBhdHRlcm4+JS01bGV2ZWwgWyV0aHJlYWRdICVkYXRlXHtJU084NjAxfSAlRjolTCAtICVtc2clbjwvcGF0dGVybj4KLTwvZW5jb2Rlcj4KLQotPT09IENvbnRlbnRzIG9mIGRlZmF1bHQgYGxvZ2JhY2sueG1sYAotCi1bc291cmNlLFhNTF0KLS0tLS0KLTxjb25maWd1cmF0aW9uIHNjYW49InRydWUiIHNjYW5QZXJpb2Q9IjYwIHNlY29uZHMiPgotICA8am14Q29uZmlndXJhdG9yIC8+Ci0KLSAgPCEtLSBObyBzaHV0ZG93biBob29rOyB3ZSBydW4gaXQgb3Vyc2VsdmVzIGluIFN0b3JhZ2VTZXJ2aWNlIGFmdGVyIHNodXRkb3duIC0tPgotCi0gIDwhLS0gU1lTVEVNTE9HIHJvbGxpbmcgZmlsZSBhcHBlbmRlciB0byBzeXN0ZW0ubG9nIChJTkZPIGxldmVsKSAtLT4KLQotICA8YXBwZW5kZXIgbmFtZT0iU1lTVEVNTE9HIiBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlJvbGxpbmdGaWxlQXBwZW5kZXIiPgotICAgIDxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuZmlsdGVyLlRocmVzaG9sZEZpbHRlciI+Ci0gIDxsZXZlbD5JTkZPPC9sZXZlbD4KLSAgICA8L2ZpbHRlcj4KLSAgICA8ZmlsZT4ke2Nhc3NhbmRyYS5sb2dkaXJ9L3N5c3RlbS5sb2c8L2ZpbGU+Ci0gICAgPHJvbGxpbmdQb2xpY3kgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5TaXplQW5kVGltZUJhc2VkUm9sbGluZ1BvbGljeSI+Ci0gICAgICA8IS0tIHJvbGxvdmVyIGRhaWx5IC0tPgotICAgICAgPGZpbGVOYW1lUGF0dGVybj4ke2Nhc3NhbmRyYS5sb2dkaXJ9L3N5c3RlbS5sb2cuJWR7eXl5eS1NTS1kZH0uJWkuemlwPC9maWxlTmFtZVBhdHRlcm4+Ci0gICAgICA8IS0tIGVhY2ggZmlsZSBzaG91bGQgYmUgYXQgbW9zdCA1ME1CLCBrZWVwIDcgZGF5cyB3b3J0aCBvZiBoaXN0b3J5LCBidXQgYXQgbW9zdCA1R0IgLS0+Ci0gICAgICA8bWF4RmlsZVNpemU+NTBNQjwvbWF4RmlsZVNpemU+Ci0gICAgICA8bWF4SGlzdG9yeT43PC9tYXhIaXN0b3J5PgotICAgICAgPHRvdGFsU2l6ZUNhcD41R0I8L3RvdGFsU2l6ZUNhcD4KLSAgICA8L3JvbGxpbmdQb2xpY3k+Ci0gICAgPGVuY29kZXI+Ci0gICAgICA8cGF0dGVybj4lLTVsZXZlbCBbJXRocmVhZF0gJWRhdGV7SVNPODYwMX0gJUY6JUwgLSAlbXNnJW48L3BhdHRlcm4+Ci0gICAgPC9lbmNvZGVyPgotICA8L2FwcGVuZGVyPgotCi0gIDwhLS0gREVCVUdMT0cgcm9sbGluZyBmaWxlIGFwcGVuZGVyIHRvIGRlYnVnLmxvZyAoYWxsIGxldmVscykgLS0+Ci0KLSAgPGFwcGVuZGVyIG5hbWU9IkRFQlVHTE9HIiBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlJvbGxpbmdGaWxlQXBwZW5kZXIiPgotICAgIDxmaWxlPiR7Y2Fzc2FuZHJhLmxvZ2Rpcn0vZGVidWcubG9nPC9maWxlPgotICAgIDxyb2xsaW5nUG9saWN5IGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuU2l6ZUFuZFRpbWVCYXNlZFJvbGxpbmdQb2xpY3kiPgotICAgICAgPCEtLSByb2xsb3ZlciBkYWlseSAtLT4KLSAgICAgIDxmaWxlTmFtZVBhdHRlcm4+JHtjYXNzYW5kcmEubG9nZGlyfS9kZWJ1Zy5sb2cuJWR7eXl5eS1NTS1kZH0uJWkuemlwPC9maWxlTmFtZVBhdHRlcm4+Ci0gICAgICA8IS0tIGVhY2ggZmlsZSBzaG91bGQgYmUgYXQgbW9zdCA1ME1CLCBrZWVwIDcgZGF5cyB3b3J0aCBvZiBoaXN0b3J5LCBidXQgYXQgbW9zdCA1R0IgLS0+Ci0gICAgICA8bWF4RmlsZVNpemU+NTBNQjwvbWF4RmlsZVNpemU+Ci0gICAgICA8bWF4SGlzdG9yeT43PC9tYXhIaXN0b3J5PgotICAgICAgPHRvdGFsU2l6ZUNhcD41R0I8L3RvdGFsU2l6ZUNhcD4KLSAgICA8L3JvbGxpbmdQb2xpY3k+Ci0gICAgPGVuY29kZXI+Ci0gICAgICA8cGF0dGVybj4lLTVsZXZlbCBbJXRocmVhZF0gJWRhdGV7SVNPODYwMX0gJUY6JUwgLSAlbXNnJW48L3BhdHRlcm4+Ci0gICAgPC9lbmNvZGVyPgotICA8L2FwcGVuZGVyPgotCi0gIDwhLS0gQVNZTkNMT0cgYXNzeW5jaHJvbm91cyBhcHBlbmRlciB0byBkZWJ1Zy5sb2cgKGFsbCBsZXZlbHMpIC0tPgotCi0gIDxhcHBlbmRlciBuYW1lPSJBU1lOQ0RFQlVHTE9HIiBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5Bc3luY0FwcGVuZGVyIj4KLSAgICA8cXVldWVTaXplPjEwMjQ8L3F1ZXVlU2l6ZT4KLSAgICA8ZGlzY2FyZGluZ1RocmVzaG9sZD4wPC9kaXNjYXJkaW5nVGhyZXNob2xkPgotICAgIDxpbmNsdWRlQ2FsbGVyRGF0YT50cnVlPC9pbmNsdWRlQ2FsbGVyRGF0YT4KLSAgICA8YXBwZW5kZXItcmVmIHJlZj0iREVCVUdMT0ciIC8+Ci0gIDwvYXBwZW5kZXI+Ci0KLSAgPCEtLSBTVERPVVQgY29uc29sZSBhcHBlbmRlciB0byBzdGRvdXQgKElORk8gbGV2ZWwpIC0tPgotCi0gIDxhcHBlbmRlciBuYW1lPSJTVERPVVQiIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLkNvbnNvbGVBcHBlbmRlciI+Ci0gICAgPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5maWx0ZXIuVGhyZXNob2xkRmlsdGVyIj4KLSAgICAgIDxsZXZlbD5JTkZPPC9sZXZlbD4KLSAgICA8L2ZpbHRlcj4KLSAgICA8ZW5jb2Rlcj4KLSAgICAgIDxwYXR0ZXJuPiUtNWxldmVsIFsldGhyZWFkXSAlZGF0ZXtJU084NjAxfSAlRjolTCAtICVtc2clbjwvcGF0dGVybj4KLSAgICA8L2VuY29kZXI+Ci0gIDwvYXBwZW5kZXI+Ci0KLSAgPCEtLSBVbmNvbW1lbnQgYmVsbG93IGFuZCBjb3JyZXNwb25kaW5nIGFwcGVuZGVyLXJlZiB0byBhY3RpdmF0ZSBsb2diYWNrIG1ldHJpY3MKLSAgPGFwcGVuZGVyIG5hbWU9IkxvZ2JhY2tNZXRyaWNzIiBjbGFzcz0iY29tLmNvZGFoYWxlLm1ldHJpY3MubG9nYmFjay5JbnN0cnVtZW50ZWRBcHBlbmRlciIgLz4KLSAgIC0tPgotCi0gIDxyb290IGxldmVsPSJJTkZPIj4KLSAgICA8YXBwZW5kZXItcmVmIHJlZj0iU1lTVEVNTE9HIiAvPgotICAgIDxhcHBlbmRlci1yZWYgcmVmPSJTVERPVVQiIC8+Ci0gICAgPGFwcGVuZGVyLXJlZiByZWY9IkFTWU5DREVCVUdMT0ciIC8+IDwhLS0gQ29tbWVudCB0aGlzIGxpbmUgdG8gZGlzYWJsZSBkZWJ1Zy5sb2cgLS0+Ci0gICAgPCEtLQotICAgIDxhcHBlbmRlci1yZWYgcmVmPSJMb2diYWNrTWV0cmljcyIgLz4KLSAgICAtLT4KLSAgPC9yb290PgotCi0gIDxsb2dnZXIgbmFtZT0ib3JnLmFwYWNoZS5jYXNzYW5kcmEiIGxldmVsPSJERUJVRyIvPgotICA8bG9nZ2VyIG5hbWU9ImNvbS50aGlua2F1cmVsaXVzLnRocmlmdCIgbGV2ZWw9IkVSUk9SIi8+Ci08L2NvbmZpZ3VyYXRpb24+Ci0tLS0tCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2FwcGVuZGljZXMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvYXBwZW5kaWNlcy5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTE3MjY2Li4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvYXBwZW5kaWNlcy5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLT0gQXBwZW5kaWNlcwotCi1bW2FwcGVuZGl4LUFdXQotPT0gQXBwZW5kaXggQTogQ1FMIEtleXdvcmRzCi0KLUNRTCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gX3Jlc2VydmVkXyBhbmQgX25vbi1yZXNlcnZlZF8ga2V5d29yZHMuCi1SZXNlcnZlZCBrZXl3b3JkcyBjYW5ub3QgYmUgdXNlZCBhcyBpZGVudGlmaWVyLCB0aGV5IGFyZSB0cnVseSByZXNlcnZlZAotZm9yIHRoZSBsYW5ndWFnZSAoYnV0IG9uZSBjYW4gZW5jbG9zZSBhIHJlc2VydmVkIGtleXdvcmQgYnkKLWRvdWJsZS1xdW90ZXMgdG8gdXNlIGl0IGFzIGFuIGlkZW50aWZpZXIpLiBOb24tcmVzZXJ2ZWQga2V5d29yZHMgaG93ZXZlcgotb25seSBoYXZlIGEgc3BlY2lmaWMgbWVhbmluZyBpbiBjZXJ0YWluIGNvbnRleHQgYnV0IGNhbiB1c2VkIGFzCi1pZGVudGlmaWVyIG90aGVyd2lzZS4gVGhlIG9ubHkgX3JhaXNvbiBk4oCZw6p0cmVfIG9mIHRoZXNlIG5vbi1yZXNlcnZlZAota2V5d29yZHMgaXMgY29udmVuaWVuY2U6IHNvbWUga2V5d29yZCBhcmUgbm9uLXJlc2VydmVkIHdoZW4gaXQgd2FzCi1hbHdheXMgZWFzeSBmb3IgdGhlIHBhcnNlciB0byBkZWNpZGUgd2hldGhlciB0aGV5IHdlcmUgdXNlZCBhcyBrZXl3b3Jkcwotb3Igbm90LgotCi1bd2lkdGg9IjQ4JSIsY29scz0iNjAlLDQwJSIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18S2V5d29yZCB8UmVzZXJ2ZWQ/Ci18YEFERGAgfHllcwotfGBBR0dSRUdBVEVgIHxubwotfGBBTExgIHxubwotfGBBTExPV2AgfHllcwotfGBBTFRFUmAgfHllcwotfGBBTkRgIHx5ZXMKLXxgQVBQTFlgIHx5ZXMKLXxgQVNgIHxubwotfGBBU0NgIHx5ZXMKLXxgQVNDSUlgIHxubwotfGBBVVRIT1JJWkVgIHx5ZXMKLXxgQkFUQ0hgIHx5ZXMKLXxgQkVHSU5gIHx5ZXMKLXxgQklHSU5UYCB8bm8KLXxgQkxPQmAgfG5vCi18YEJPT0xFQU5gIHxubwotfGBCWWAgfHllcwotfGBDQUxMRURgIHxubwotfGBDTFVTVEVSSU5HYCB8bm8KLXxgQ09MVU1ORkFNSUxZYCB8eWVzCi18YENPTVBBQ1RgIHxubwotfGBDT05UQUlOU2AgfG5vCi18YENPVU5UYCB8bm8KLXxgQ09VTlRFUmAgfG5vCi18YENSRUFURWAgfHllcwotfGBDVVNUT01gIHxubwotfGBEQVRFYCB8bm8KLXxgREVDSU1BTGAgfG5vCi18YERFTEVURWAgfHllcwotfGBERVNDYCB8eWVzCi18YERFU0NSSUJFYCB8eWVzCi18YERJU1RJTkNUYCB8bm8KLXxgRE9VQkxFYCB8bm8KLXxgRFJPUGAgfHllcwotfGBFTlRSSUVTYCB8eWVzCi18YEVYRUNVVEVgIHx5ZXMKLXxgRVhJU1RTYCB8bm8KLXxgRklMVEVSSU5HYCB8bm8KLXxgRklOQUxGVU5DYCB8bm8KLXxgRkxPQVRgIHxubwotfGBGUk9NYCB8eWVzCi18YEZST1pFTmAgfG5vCi18YEZVTExgIHx5ZXMKLXxgRlVOQ1RJT05gIHxubwotfGBGVU5DVElPTlNgIHxubwotfGBHUkFOVGAgfHllcwotfGBJRmAgfHllcwotfGBJTmAgfHllcwotfGBJTkRFWGAgfHllcwotfGBJTkVUYCB8bm8KLXxgSU5GSU5JVFlgIHx5ZXMKLXxgSU5JVENPTkRgIHxubwotfGBJTlBVVGAgfG5vCi18YElOU0VSVGAgfHllcwotfGBJTlRgIHxubwotfGBJTlRPYCB8eWVzCi18YEpTT05gIHxubwotfGBLRVlgIHxubwotfGBLRVlTYCB8bm8KLXxgS0VZU1BBQ0VgIHx5ZXMKLXxgS0VZU1BBQ0VTYCB8bm8KLXxgTEFOR1VBR0VgIHxubwotfGBMSU1JVGAgfHllcwotfGBMSVNUYCB8bm8KLXxgTE9HSU5gIHxubwotfGBNQVBgIHxubwotfGBNT0RJRllgIHx5ZXMKLXxgTkFOYCB8eWVzCi18YE5PTE9HSU5gIHxubwotfGBOT1JFQ1VSU0lWRWAgfHllcwotfGBOT1NVUEVSVVNFUmAgfG5vCi18YE5PVGAgfHllcwotfGBOVUxMYCB8eWVzCi18YE9GYCB8eWVzCi18YE9OYCB8eWVzCi18YE9QVElPTlNgIHxubwotfGBPUmAgfHllcwotfGBPUkRFUmAgfHllcwotfGBQQVNTV09SRGAgfG5vCi18YFBFUk1JU1NJT05gIHxubwotfGBQRVJNSVNTSU9OU2AgfG5vCi18YFBSSU1BUllgIHx5ZXMKLXxgUkVOQU1FYCB8eWVzCi18YFJFUExBQ0VgIHx5ZXMKLXxgUkVUVVJOU2AgfG5vCi18YFJFVk9LRWAgfHllcwotfGBST0xFYCB8bm8KLXxgUk9MRVNgIHxubwotfGBTQ0hFTUFgIHx5ZXMKLXxgU0VMRUNUYCB8eWVzCi18YFNFVGAgfHllcwotfGBTRlVOQ2AgfG5vCi18YFNNQUxMSU5UYCB8bm8KLXxgU1RBVElDYCB8bm8KLXxgU1RPUkFHRWAgfG5vCi18YFNUWVBFYCB8bm8KLXxgU1VQRVJVU0VSYCB8bm8KLXxgVEFCTEVgIHx5ZXMKLXxgVEVYVGAgfG5vCi18YFRJTUVgIHxubwotfGBUSU1FU1RBTVBgIHxubwotfGBUSU1FVVVJRGAgfG5vCi18YFRJTllJTlRgIHxubwotfGBUT2AgfHllcwotfGBUT0tFTmAgfHllcwotfGBUUklHR0VSYCB8bm8KLXxgVFJVTkNBVEVgIHx5ZXMKLXxgVFRMYCB8bm8KLXxgVFVQTEVgIHxubwotfGBUWVBFYCB8bm8KLXxgVU5MT0dHRURgIHx5ZXMKLXxgVVBEQVRFYCB8eWVzCi18YFVTRWAgfHllcwotfGBVU0VSYCB8bm8KLXxgVVNFUlNgIHxubwotfGBVU0lOR2AgfHllcwotfGBVVUlEYCB8bm8KLXxgVkFMVUVTYCB8bm8KLXxgVkFSQ0hBUmAgfG5vCi18YFZBUklOVGAgfG5vCi18YFdIRVJFYCB8eWVzCi18YFdJVEhgIHx5ZXMKLXxgV1JJVEVUSU1FYCB8bm8KLXw9PT0KLQotPT0gQXBwZW5kaXggQjogQ1FMIFJlc2VydmVkIFR5cGVzCi0KLVRoZSBmb2xsb3dpbmcgdHlwZSBuYW1lcyBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGJ5IENRTCwgYnV0IGFyZSByZXNlcnZlZAotZm9yIHBvdGVudGlhbCBmdXR1cmUgdXNlLiBVc2VyLWRlZmluZWQgdHlwZXMgbWF5IG5vdCB1c2UgcmVzZXJ2ZWQgdHlwZQotbmFtZXMgYXMgdGhlaXIgbmFtZS4KLQotW3dpZHRoPSIyNSUiLGNvbHM9IjEwMCUiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfHR5cGUKLXxgYml0c3RyaW5nYAotfGBieXRlYAotfGBjb21wbGV4YAotfGBlbnVtYAotfGBpbnRlcnZhbGAKLXxgbWFjYWRkcmAKLXw9PT0KLQotPT0gQXBwZW5kaXggQzogRHJvcHBpbmcgQ29tcGFjdCBTdG9yYWdlCi0KLVN0YXJ0aW5nIHZlcnNpb24gNC4wLCBUaHJpZnQgYW5kIENPTVBBQ1QgU1RPUkFHRSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLgotCi1gQUxURVIgLi4uIERST1AgQ09NUEFDVCBTVE9SQUdFYCBzdGF0ZW1lbnQgbWFrZXMgQ29tcGFjdCBUYWJsZXMKLUNRTC1jb21wYXRpYmxlLCBleHBvc2luZyBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgVGhyaWZ0L0NvbXBhY3QgVGFibGVzOgotCi0qIENRTC1jcmVhdGVkIENvbXBhY3QgVGFibGVzIHRoYXQgaGF2ZSBubyBjbHVzdGVyaW5nIGNvbHVtbnMsIHdpbGwKLWV4cG9zZSBhbiBhZGRpdGlvbmFsIGNsdXN0ZXJpbmcgY29sdW1uIGBjb2x1bW4xYCB3aXRoIGBVVEY4VHlwZWAuCi0qIENRTC1jcmVhdGVkIENvbXBhY3QgVGFibGVzIHRoYXQgaGFkIG5vIHJlZ3VsYXIgY29sdW1ucywgd2lsbCBleHBvc2UgYQotcmVndWxhciBjb2x1bW4gYHZhbHVlYCB3aXRoIGBCeXRlc1R5cGVgLgotKiBGb3IgQ1FMLUNyZWF0ZWQgQ29tcGFjdCBUYWJsZXMsIGFsbCBjb2x1bW5zIG9yaWdpbmFsbHkgZGVmaW5lZCBhcwotYHJlZ3VsYXJgIHdpbGwgYmUgY29tZSBgc3RhdGljYAotKiBDUUwtY3JlYXRlZCBDb21wYWN0IFRhYmxlcyB0aGF0IGhhdmUgY2x1c3RlcmluZyBidXQgaGF2ZSBubyByZWd1bGFyCi1jb2x1bW5zIHdpbGwgaGF2ZSBhbiBlbXB0eSB2YWx1ZSBjb2x1bW4gKG9mIGBFbXB0eVR5cGVgKQotKiBTdXBlckNvbHVtbiBUYWJsZXMgKGNhbiBvbmx5IGJlIGNyZWF0ZWQgdGhyb3VnaCBUaHJpZnQpIHdpbGwgZXhwb3NlIGEKLWNvbXBhY3QgdmFsdWUgbWFwIHdpdGggYW4gZW1wdHkgbmFtZS4KLSogVGhyaWZ0LWNyZWF0ZWQgQ29tcGFjdCBUYWJsZXMgd2lsbCBoYXZlIHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlaXIKLVRocmlmdCBkZWZpbml0aW9uLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9jaGFuZ2VzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2NoYW5nZXMuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5OWEzOS4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2NoYW5nZXMuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi09IENoYW5nZXMKLQotVGhlIGZvbGxvd2luZyBkZXNjcmliZXMgdGhlIGNoYW5nZXMgaW4gZWFjaCB2ZXJzaW9uIG9mIENRTC4KLQotPT0gMy40LjYKLQotKiBBZGQgc3VwcG9ydCBmb3IgSUYgRVhJU1RTIGFuZCBJRiBOT1QgRVhJU1RTIGluIEFMVEVSIHN0YXRlbWVudHMgIChgMTY5MTZgKQotKiBBbGxvdyBHUkFOVC9SRVZPS0UgbXVsdGlwbGUgcGVybWlzc2lvbnMgaW4gYSBzaW5nbGUgc3RhdGVtZW50IChgMTcwMzBgKQotKiBQcmUgaGFzaGVkIHBhc3N3b3JkcyBpbiBDUUwgKGAxNzMzNGApCi0qIEFkZCBzdXBwb3J0IGZvciB0eXBlIGNhc3RpbmcgaW4gV0hFUkUgY2xhdXNlIGNvbXBvbmVudHMgYW5kIGluIHRoZSB2YWx1ZXMgb2YgSU5TRVJUL1VQREFURSBzdGF0ZW1lbnRzIChgMTQzMzdgKQotKiBBZGQgc3VwcG9ydCBmb3IgQ09OVEFJTlMgYW5kIENPTlRBSU5TIEtFWSBpbiBjb25kaXRpb25hbCBVUERBVEUgYW5kIERFTEVURSBzdGF0ZW1lbnQgKGAxMDUzN2ApCi0qIEFsbG93IHRvIGdyYW50IHBlcm1pc3Npb24gZm9yIGFsbCB0YWJsZXMgaW4gYSBrZXlzcGFjZSAoYDE3MDI3YCkKLSogQWxsb3cgdG8gYWdncmVnYXRlIGJ5IHRpbWUgaW50ZXJ2YWxzIChgMTE4NzFgKQotCi09PSAzLjQuNQotCi0qIEFkZHMgc3VwcG9ydCBmb3IgYXJpdGhtZXRpYyBvcGVyYXRvcnMgKGAxMTkzNWApCi0qIEFkZHMgc3VwcG9ydCBmb3IgYCtgIGFuZCBgLWAgb3BlcmF0aW9ucyBvbiBkYXRlcyAoYDExOTM2YCkKLSogQWRkcyBgY3VycmVudFRpbWVzdGFtcGAsIGBjdXJyZW50RGF0ZWAsIGBjdXJyZW50VGltZWAgYW5kCi1gY3VycmVudFRpbWVVVUlEYCBmdW5jdGlvbnMgKGAxMzEzMmApCi0KLT09IDMuNC40Ci0KLSogYEFMVEVSIFRBQkxFYCBgQUxURVJgIGhhcyBiZWVuIHJlbW92ZWQ7IGEgY29sdW1uJ3MgdHlwZSBtYXkgbm90IGJlCi1jaGFuZ2VkIGFmdGVyIGNyZWF0aW9uIChgMTI0NDNgKS4KLSogYEFMVEVSIFRZUEVgIGBBTFRFUmAgaGFzIGJlZW4gcmVtb3ZlZDsgYSBmaWVsZCdzIHR5cGUgbWF5IG5vdCBiZQotY2hhbmdlZCBhZnRlciBjcmVhdGlvbiAoYDEyNDQzYCkuCi0KLT09IDMuNC4zCi0KLSogQWRkcyBhIG5ldyBgZHVyYXRpb25gIGBkYXRhIHR5cGVzIDxkYXRhLXR5cGVzPmAgKGAxMTg3M2ApLgotKiBTdXBwb3J0IGZvciBgR1JPVVAgQllgIChgMTA3MDdgKS4KLSogQWRkcyBhIGBERUZBVUxUIFVOU0VUYCBvcHRpb24gZm9yIGBJTlNFUlQgSlNPTmAgdG8gaWdub3JlIG9taXR0ZWQKLWNvbHVtbnMgKGAxMTQyNGApLgotKiBBbGxvd3MgYG51bGxgIGFzIGEgbGVnYWwgdmFsdWUgZm9yIFRUTCBvbiBpbnNlcnQgYW5kIHVwZGF0ZS4gSXQgd2lsbAotYmUgdHJlYXRlZCBhcyBlcXVpdmFsZW50IHRvIGluc2VydGluZyBhIDAgKGAxMjIxNmApLgotCi09PSAzLjQuMgotCi0qIElmIGEgdGFibGUgaGFzIGEgbm9uIHplcm8gYGRlZmF1bHRfdGltZV90b19saXZlYCwgdGhlbiBleHBsaWNpdGx5Ci1zcGVjaWZ5aW5nIGEgVFRMIG9mIDAgaW4gYW4gYElOU0VSVGAgb3IgYFVQREFURWAgc3RhdGVtZW50IHdpbGwgcmVzdWx0Ci1pbiB0aGUgbmV3IHdyaXRlcyBub3QgaGF2aW5nIGFueSBleHBpcmF0aW9uICh0aGF0IGlzLCBhbiBleHBsaWNpdCBUVEwgb2YKLTAgY2FuY2VscyB0aGUgYGRlZmF1bHRfdGltZV90b19saXZlYCkuIFRoaXMgd2Fzbid0IHRoZSBjYXNlIGJlZm9yZSBhbmQKLXRoZSBgZGVmYXVsdF90aW1lX3RvX2xpdmVgIHdhcyBhcHBsaWVkIGV2ZW4gdGhvdWdoIGEgVFRMIGhhZCBiZWVuCi1leHBsaWNpdGx5IHNldC4KLSogYEFMVEVSIFRBQkxFYCBgQUREYCBhbmQgYERST1BgIG5vdyBhbGxvdyBtdWx0aXBsZSBjb2x1bW5zIHRvIGJlCi1hZGRlZC9yZW1vdmVkLgotKiBOZXcgYFBFUiBQQVJUSVRJT04gTElNSVRgIG9wdGlvbiBmb3IgYFNFTEVDVGAgc3RhdGVtZW50cyAoc2VlCi1odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS03MDE3KVtDQVNTQU5EUkEtNzAxN10uCi0qIGBVc2VyLWRlZmluZWQgZnVuY3Rpb25zIDxjcWwtZnVuY3Rpb25zPmAgY2FuIG5vdyBpbnN0YW50aWF0ZQotYFVEVFZhbHVlYCBhbmQgYFR1cGxlVmFsdWVgIGluc3RhbmNlcyB2aWEgdGhlIG5ldyBgVURGQ29udGV4dGAgaW50ZXJmYWNlCi0oc2VlCi1odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xMDgxOClbQ0FTU0FORFJBLTEwODE4XS4KLSogYFVzZXItZGVmaW5lZCB0eXBlcyA8dWR0cz5gIG1heSBub3cgYmUgc3RvcmVkIGluIGEgbm9uLWZyb3plbiBmb3JtLAotYWxsb3dpbmcgaW5kaXZpZHVhbCBmaWVsZHMgdG8gYmUgdXBkYXRlZCBhbmQgZGVsZXRlZCBpbiBgVVBEQVRFYAotc3RhdGVtZW50cyBhbmQgYERFTEVURWAgc3RhdGVtZW50cywgcmVzcGVjdGl2ZWx5LgotKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTc0MjMpW0NBU1NBTkRSQS03NDIzXSkuCi0KLT09IDMuNC4xCi0KLSogQWRkcyBgQ0FTVGAgZnVuY3Rpb25zLgotCi09PSAzLjQuMAotCi0qIFN1cHBvcnQgZm9yIGBtYXRlcmlhbGl6ZWQgdmlld3MgPG1hdGVyaWFsaXplZC12aWV3cz5gLgotKiBgREVMRVRFYCBzdXBwb3J0IGZvciBpbmVxdWFsaXR5IGV4cHJlc3Npb25zIGFuZCBgSU5gIHJlc3RyaWN0aW9ucyBvbgotYW55IHByaW1hcnkga2V5IGNvbHVtbnMuCi0qIGBVUERBVEVgIHN1cHBvcnQgZm9yIGBJTmAgcmVzdHJpY3Rpb25zIG9uIGFueSBwcmltYXJ5IGtleSBjb2x1bW5zLgotCi09PSAzLjMuMQotCi0qIFRoZSBzeW50YXggYFRSVU5DQVRFIFRBQkxFIFhgIGlzIG5vdyBhY2NlcHRlZCBhcyBhbiBhbGlhcyBmb3IKLWBUUlVOQ0FURSBYYC4KLQotPT0gMy4zLjAKLQotKiBgVXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBhbmQgYWdncmVnYXRlcyA8Y3FsLWZ1bmN0aW9ucz5gIGFyZSBub3cKLXN1cHBvcnRlZC4KLSogQWxsb3dzIGRvdWJsZS1kb2xsYXIgZW5jbG9zZWQgc3RyaW5ncyBsaXRlcmFscyBhcyBhbiBhbHRlcm5hdGl2ZSB0bwotc2luZ2xlLXF1b3RlIGVuY2xvc2VkIHN0cmluZ3MuCi0qIEludHJvZHVjZXMgUm9sZXMgdG8gc3VwZXJzZWRlIHVzZXIgYmFzZWQgYXV0aGVudGljYXRpb24gYW5kIGFjY2VzcwotY29udHJvbAotKiBOZXcgYGRhdGVgLCBgdGltZWAsIGB0aW55aW50YCBhbmQgYHNtYWxsaW50YCBgZGF0YSB0eXBlcyA8ZGF0YS10eXBlcz5gCi1oYXZlIGJlZW4gYWRkZWQuCi0qIGBKU09OIHN1cHBvcnQgPGNxbC1qc29uPmAgaGFzIGJlZW4gYWRkZWQKLSogQWRkcyBuZXcgdGltZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhbmQgZGVwcmVjYXRlIGBkYXRlT2ZgIGFuZAotYHVuaXhUaW1lc3RhbXBPZmAuCi0KLT09IDMuMi4wCi0KLSogYFVzZXItZGVmaW5lZCB0eXBlcyA8dWR0cz5gIHN1cHBvcnRlZC4KLSogYENSRUFURSBJTkRFWGAgbm93IHN1cHBvcnRzIGluZGV4aW5nIGNvbGxlY3Rpb24gY29sdW1ucywgaW5jbHVkaW5nCi1pbmRleGluZyB0aGUga2V5cyBvZiBtYXAgY29sbGVjdGlvbnMgdGhyb3VnaCB0aGUgYGtleXMoKWAgZnVuY3Rpb24KLSogSW5kZXhlcyBvbiBjb2xsZWN0aW9ucyBtYXkgYmUgcXVlcmllZCB1c2luZyB0aGUgbmV3IGBDT05UQUlOU2AgYW5kCi1gQ09OVEFJTlMgS0VZYCBvcGVyYXRvcnMKLSogYFR1cGxlIHR5cGVzIDx0dXBsZXM+YCB3ZXJlIGFkZGVkIHRvIGhvbGQgZml4ZWQtbGVuZ3RoIHNldHMgb2YgdHlwZWQKLXBvc2l0aW9uYWwgZmllbGRzLgotKiBgRFJPUCBJTkRFWGAgbm93IHN1cHBvcnRzIG9wdGlvbmFsbHkgc3BlY2lmeWluZyBhIGtleXNwYWNlLgotCi09PSAzLjEuNwotCi0qIGBTRUxFQ1RgIHN0YXRlbWVudHMgbm93IHN1cHBvcnQgc2VsZWN0aW5nIG11bHRpcGxlIHJvd3MgaW4gYSBzaW5nbGUKLXBhcnRpdGlvbiB1c2luZyBhbiBgSU5gIGNsYXVzZSBvbiBjb21iaW5hdGlvbnMgb2YgY2x1c3RlcmluZyBjb2x1bW5zLgotKiBgSUYgTk9UIEVYSVNUU2AgYW5kIGBJRiBFWElTVFNgIHN5bnRheCBpcyBub3cgc3VwcG9ydGVkIGJ5Ci1gQ1JFQVRFIFVTRVJgIGFuZCBgRFJPUCBVU0VSYCBzdGF0ZW1lbnRzLCByZXNwZWN0aXZlbHkuCi0KLT09IDMuMS42Ci0KLSogQSBuZXcgYHV1aWQoKWAgbWV0aG9kIGhhcyBiZWVuIGFkZGVkLgotKiBTdXBwb3J0IGZvciBgREVMRVRFIC4uLiBJRiBFWElTVFNgIHN5bnRheC4KLQotPT0gMy4xLjUKLQotKiBJdCBpcyBub3cgcG9zc2libGUgdG8gZ3JvdXAgY2x1c3RlcmluZyBjb2x1bW5zIGluIGEgcmVsYXRpb24sIHNlZQotYFdIRVJFIDx3aGVyZS1jbGF1c2U+YCBjbGF1c2VzLgotKiBBZGRlZCBzdXBwb3J0IGZvciBgc3RhdGljIGNvbHVtbnMgPHN0YXRpYy1jb2x1bW5zPmAuCi0KLT09IDMuMS40Ci0KLSogYENSRUFURSBJTkRFWGAgbm93IGFsbG93cyBzcGVjaWZ5aW5nIG9wdGlvbnMgd2hlbiBjcmVhdGluZyBDVVNUT00KLWluZGV4ZXMuCi0KLT09IDMuMS4zCi0KLSogTWlsbGlzZWNvbmQgcHJlY2lzaW9uIGZvcm1hdHMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZQotYHRpbWVzdGFtcCA8dGltZXN0YW1wcz5gIHBhcnNlci4KLQotPT0gMy4xLjIKLQotKiBgTmFOYCBhbmQgYEluZmluaXR5YCBoYXMgYmVlbiBhZGRlZCBhcyB2YWxpZCBmbG9hdCBjb25zdGFudHMuIFRoZXkgYXJlCi1ub3cgcmVzZXJ2ZWQga2V5d29yZHMuIEluIHRoZSB1bmxpa2VseSBjYXNlIHlvdSB3ZSB1c2luZyB0aGVtIGFzIGEKLWNvbHVtbiBpZGVudGlmaWVyIChvciBrZXlzcGFjZS90YWJsZSBvbmUpLCB5b3Ugd2lsbCBub3cgbmVlZCB0byBkb3VibGUKLXF1b3RlIHRoZW0uCi0KLT09IDMuMS4xCi0KLSogYFNFTEVDVGAgc3RhdGVtZW50IG5vdyBhbGxvd3MgbGlzdGluZyB0aGUgcGFydGl0aW9uIGtleXMgKHVzaW5nIHRoZQotYERJU1RJTkNUYCBtb2RpZmllcikuIFNlZQotaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNDUzNltDQVNTQU5EUkEtNDUzNl0uCi0qIFRoZSBzeW50YXggYGMgSU4gP2AgaXMgbm93IHN1cHBvcnRlZCBpbiBgV0hFUkVgIGNsYXVzZXMuIEluIHRoYXQgY2FzZSwKLXRoZSB2YWx1ZSBleHBlY3RlZCBmb3IgdGhlIGJpbmQgdmFyaWFibGUgd2lsbCBiZSBhIGxpc3Qgb2Ygd2hhdGV2ZXIgdHlwZQotYGNgIGlzLgotKiBJdCBpcyBub3cgcG9zc2libGUgdG8gdXNlIG5hbWVkIGJpbmQgdmFyaWFibGVzICh1c2luZyBgOm5hbWVgIGluc3RlYWQKLW9mIGA/YCkuCi0KLT09IDMuMS4wCi0KLSogYEFMVEVSIFRBQkxFYCBgRFJPUGAgb3B0aW9uIGFkZGVkLgotKiBgU0VMRUNUYCBzdGF0ZW1lbnQgbm93IHN1cHBvcnRzIGFsaWFzZXMgaW4gc2VsZWN0IGNsYXVzZS4gQWxpYXNlcyBpbgotV0hFUkUgYW5kIE9SREVSIEJZIGNsYXVzZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0qIGBDUkVBVEVgIHN0YXRlbWVudHMgZm9yIGBLRVlTUEFDRWAsIGBUQUJMRWAgYW5kIGBJTkRFWGAgbm93IHN1cHBvcnRzCi1hbiBgSUYgTk9UIEVYSVNUU2AgY29uZGl0aW9uLiBTaW1pbGFybHksIGBEUk9QYCBzdGF0ZW1lbnRzIHN1cHBvcnQgYQotYElGIEVYSVNUU2AgY29uZGl0aW9uLgotKiBgSU5TRVJUYCBzdGF0ZW1lbnRzIG9wdGlvbmFsbHkgc3VwcG9ydHMgYSBgSUYgTk9UIEVYSVNUU2AgY29uZGl0aW9uCi1hbmQgYFVQREFURWAgc3VwcG9ydHMgYElGYCBjb25kaXRpb25zLgotCi09PSAzLjAuNQotCi0qIGBTRUxFQ1RgLCBgVVBEQVRFYCwgYW5kIGBERUxFVEVgIHN0YXRlbWVudHMgbm93IGFsbG93IGVtcHR5IGBJTmAKLXJlbGF0aW9ucyAoc2VlCi1odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS01NjI2KVtDQVNTQU5EUkEtNTYyNl0uCi0KLT09IDMuMC40Ci0KLSogVXBkYXRlZCB0aGUgc3ludGF4IGZvciBjdXN0b20gYHNlY29uZGFyeSBpbmRleGVzIDxzZWNvbmRhcnktaW5kZXhlcz5gLgotKiBOb24tZXF1YWwgY29uZGl0aW9uIG9uIHRoZSBwYXJ0aXRpb24ga2V5IGFyZSBub3cgbmV2ZXIgc3VwcG9ydGVkLCBldmVuCi1mb3Igb3JkZXJpbmcgcGFydGl0aW9uZXIgYXMgdGhpcyB3YXMgbm90IGNvcnJlY3QgKHRoZSBvcmRlciB3YXMgKm5vdCoKLXRoZSBvbmUgb2YgdGhlIHR5cGUgb2YgdGhlIHBhcnRpdGlvbiBrZXkpLiBJbnN0ZWFkLCB0aGUgYHRva2VuYCBtZXRob2QKLXNob3VsZCBhbHdheXMgYmUgdXNlZCBmb3IgcmFuZ2UgcXVlcmllcyBvbiB0aGUgcGFydGl0aW9uIGtleSAoc2VlCi1gV0hFUkUgY2xhdXNlcyA8d2hlcmUtY2xhdXNlPmApLgotCi09PSAzLjAuMwotCi0qIFN1cHBvcnQgZm9yIGN1c3RvbSBgc2Vjb25kYXJ5IGluZGV4ZXMgPHNlY29uZGFyeS1pbmRleGVzPmAgaGFzIGJlZW4KLWFkZGVkLgotCi09PSAzLjAuMgotCi0qIFR5cGUgdmFsaWRhdGlvbiBmb3IgdGhlIGBjb25zdGFudHMgPGNvbnN0YW50cz5gIGhhcyBiZWVuIGZpeGVkLiBGb3IKLWluc3RhbmNlLCB0aGUgaW1wbGVtZW50YXRpb24gdXNlZCB0byBhbGxvdyBgJzInYCBhcyBhIHZhbGlkIHZhbHVlIGZvciBhbgotYGludGAgY29sdW1uIChpbnRlcnByZXRpbmcgaXQgaGFzIHRoZSBlcXVpdmFsZW50IG9mIGAyYCksIG9yIGA0MmAgYXMgYQotdmFsaWQgYGJsb2JgIHZhbHVlIChpbiB3aGljaCBjYXNlIGA0MmAgd2FzIGludGVycHJldGVkIGFzIGFuIGhleGFkZWNpbWFsCi1yZXByZXNlbnRhdGlvbiBvZiB0aGUgYmxvYikuIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLCB0eXBlIHZhbGlkYXRpb24KLW9mIGNvbnN0YW50cyBpcyBub3cgbW9yZSBzdHJpY3QuIFNlZSB0aGUgYGRhdGEgdHlwZXMgPGRhdGEtdHlwZXM+YAotc2VjdGlvbiBmb3IgZGV0YWlscyBvbiB3aGljaCBjb25zdGFudCBpcyBhbGxvd2VkIGZvciB3aGljaCB0eXBlLgotKiBUaGUgdHlwZSB2YWxpZGF0aW9uIGZpeGVkIG9mIHRoZSBwcmV2aW91cyBwb2ludCBoYXMgbGVhZCB0byB0aGUKLWludHJvZHVjdGlvbiBvZiBibG9icyBjb25zdGFudHMgdG8gYWxsb3cgdGhlIGlucHV0IG9mIGJsb2JzLiBEbyBub3RlCi10aGF0IHdoaWxlIHRoZSBpbnB1dCBvZiBibG9icyBhcyBzdHJpbmdzIGNvbnN0YW50IGlzIHN0aWxsIHN1cHBvcnRlZCBieQotdGhpcyB2ZXJzaW9uICh0byBhbGxvdyBzbW9vdGhlciB0cmFuc2l0aW9uIHRvIGJsb2IgY29uc3RhbnQpLCBpdCBpcyBub3cKLWRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBieSBhIGZ1dHVyZSB2ZXJzaW9uLiBJZiB5b3Ugd2VyZSB1c2luZwotc3RyaW5ncyBhcyBibG9icywgeW91IHNob3VsZCB0aHVzIHVwZGF0ZSB5b3VyIGNsaWVudCBjb2RlIEFTQVAgdG8gc3dpdGNoCi1ibG9iIGNvbnN0YW50cy4KLSogQSBudW1iZXIgb2YgZnVuY3Rpb25zIHRvIGNvbnZlcnQgbmF0aXZlIHR5cGVzIHRvIGJsb2JzIGhhdmUgYWxzbyBiZWVuCi1pbnRyb2R1Y2VkLiBGdXJ0aGVybW9yZSB0aGUgdG9rZW4gZnVuY3Rpb24gaXMgbm93IGFsc28gYWxsb3dlZCBpbiBzZWxlY3QKLWNsYXVzZXMuIFNlZSB0aGUgYHNlY3Rpb24gb24gZnVuY3Rpb25zIDxjcWwtZnVuY3Rpb25zPmAgZm9yIGRldGFpbHMuCi0KLT09IDMuMC4xCi0KLSogRGF0ZSBzdHJpbmdzIChhbmQgdGltZXN0YW1wcykgYXJlIG5vIGxvbmdlciBhY2NlcHRlZCBhcyB2YWxpZAotYHRpbWV1dWlkYCB2YWx1ZXMuIERvaW5nIHNvIHdhcyBhIGJ1ZyBpbiB0aGUgc2Vuc2UgdGhhdCBkYXRlIHN0cmluZyBhcmUKLW5vdCB2YWxpZCBgdGltZXV1aWRgLCBhbmQgaXQgd2FzIHRodXMgcmVzdWx0aW5nIGluCi1odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS00OTM2W2NvbmZ1c2luZwotYmVoYXZpb3JzXS4gSG93ZXZlciwgdGhlIGZvbGxvd2luZyBuZXcgbWV0aG9kcyBoYXZlIGJlZW4gYWRkZWQgdG8gaGVscAotd29ya2luZyB3aXRoIGB0aW1ldXVpZGA6IGBub3dgLCBgbWluVGltZXV1aWRgLCBgbWF4VGltZXV1aWRgICwgYGRhdGVPZmAKLWFuZCBgdW5peFRpbWVzdGFtcE9mYC4KLSogRmxvYXQgY29uc3RhbnRzIG5vdyBzdXBwb3J0IHRoZSBleHBvbmVudCBub3RhdGlvbi4gSW4gb3RoZXIgd29yZHMsCi1gNC4yRTEwYCBpcyBub3cgYSB2YWxpZCBmbG9hdGluZyBwb2ludCB2YWx1ZS4KLQotPT0gVmVyc2lvbmluZwotCi1WZXJzaW9uaW5nIG9mIHRoZSBDUUwgbGFuZ3VhZ2UgYWRoZXJlcyB0byB0aGUgaHR0cDovL3NlbXZlci5vcmdbU2VtYW50aWMKLVZlcnNpb25pbmddIGd1aWRlbGluZXMuIFZlcnNpb25zIHRha2UgdGhlIGZvcm0gWC5ZLlogd2hlcmUgWCwgWSwgYW5kIFoKLWFyZSBpbnRlZ2VyIHZhbHVlcyByZXByZXNlbnRpbmcgbWFqb3IsIG1pbm9yLCBhbmQgcGF0Y2ggbGV2ZWwKLXJlc3BlY3RpdmVseS4gVGhlcmUgaXMgbm8gY29ycmVsYXRpb24gYmV0d2VlbiBDYXNzYW5kcmEgcmVsZWFzZSB2ZXJzaW9ucwotYW5kIHRoZSBDUUwgbGFuZ3VhZ2UgdmVyc2lvbi4KLQotW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfHZlcnNpb24gfGRlc2NyaXB0aW9uCi18IE1ham9yIHwgVGhlIG1ham9yIHZlcnNpb24gX211c3RfIGJlIGJ1bXBlZCB3aGVuIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2VzCi1hcmUgaW50cm9kdWNlZC4gVGhpcyBzaG91bGQgcmFyZWx5IG9jY3VyLgotfCBNaW5vciB8IE1pbm9yIHZlcnNpb24gaW5jcmVtZW50cyBvY2N1ciB3aGVuIG5ldywgYnV0IGJhY2t3YXJkIGNvbXBhdGlibGUsCi1mdW5jdGlvbmFsaXR5IGlzIGludHJvZHVjZWQuCi18IFBhdGNoIHwgVGhlIHBhdGNoIHZlcnNpb24gaXMgaW5jcmVtZW50ZWQgd2hlbiBidWdzIGFyZSBmaXhlZC4KLXw9PT0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvY3FsX3NpbmdsZWZpbGUuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvY3FsX3NpbmdsZWZpbGUuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk5ZTEyYi4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2NxbF9zaW5nbGVmaWxlLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIxICswLDAgQEAKLT09IENhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZSAoQ1FMKSB2My40LjMKLQotXHt0b2M6bWF4TGV2ZWw9M30KLQotPT09IENRTCBTeW50YXgKLQotPT09PSBQcmVhbWJsZQotCi1UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlIChDUUwpIHZlcnNpb24gMy4KLUNRTCB2MyBpcyBub3QgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIENRTCB2MiBhbmQgZGlmZmVycyBmcm9tIGl0IGluCi1udW1lcm91cyB3YXlzLiBOb3RlIHRoYXQgdGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGxhc3QgdmVyc2lvbiBvZiB0aGUKLWxhbmd1YWdlcy4gSG93ZXZlciwgdGhlIGxpbms6I2NoYW5nZXNbY2hhbmdlc10gc2VjdGlvbiBwcm92aWRlcyB0aGUgZGlmZgotYmV0d2VlbiB0aGUgZGlmZmVyZW50IHZlcnNpb25zIG9mIENRTCB2My4KLQotQ1FMIHYzIG9mZmVycyBhIG1vZGVsIHZlcnkgY2xvc2UgdG8gU1FMIGluIHRoZSBzZW5zZSB0aGF0IGRhdGEgaXMgcHV0IGluCi1fdGFibGVzXyBjb250YWluaW5nIF9yb3dzXyBvZiBfY29sdW1uc18uIEZvciB0aGF0IHJlYXNvbiwgd2hlbiB1c2VkIGluCi10aGlzIGRvY3VtZW50LCB0aGVzZSB0ZXJtcyAodGFibGVzLCByb3dzIGFuZCBjb2x1bW5zKSBoYXZlIHRoZSBzYW1lCi1kZWZpbml0aW9uIHRoYW4gdGhleSBoYXZlIGluIFNRTC4gQnV0IHBsZWFzZSBub3RlIHRoYXQgYXMgc3VjaCwgdGhleSBkbwotKm5vdCogcmVmZXIgdG8gdGhlIGNvbmNlcHQgb2Ygcm93cyBhbmQgY29sdW1ucyBmb3VuZCBpbiB0aGUgaW50ZXJuYWwKLWltcGxlbWVudGF0aW9uIG9mIENhc3NhbmRyYSBhbmQgaW4gdGhlIHRocmlmdCBhbmQgQ1FMIHYyIEFQSS4KLQotPT09PSBDb252ZW50aW9ucwotCi1UbyBhaWQgaW4gc3BlY2lmeWluZyB0aGUgQ1FMIHN5bnRheCwgd2Ugd2lsbCB1c2UgdGhlIGZvbGxvd2luZwotY29udmVudGlvbnMgaW4gdGhpcyBkb2N1bWVudDoKLQotKiBMYW5ndWFnZSBydWxlcyB3aWxsIGJlIGdpdmVuIGluIGEKLWh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmFja3VzJUUyJTgwJTkzTmF1cl9Gb3JtW0JORl0gLWxpa2UKLW5vdGF0aW9uOgotCi1iYyhzeW50YXgpLiA6Oj0gVEVSTUlOQUwKLQotKiBOb250ZXJtaW5hbCBzeW1ib2xzIHdpbGwgaGF2ZSBgPGFuZ2xlIGJyYWNrZXRzPmAuCi0qIEFzIGFkZGl0aW9uYWwgc2hvcnRjdXQgbm90YXRpb25zIHRvIEJORiwgd2XigJlsbCB1c2UgdHJhZGl0aW9uYWwgcmVndWxhcgotZXhwcmVzc2lvbuKAmXMgc3ltYm9scyAoYD9gLCBgK2AgYW5kIGAqYCkgdG8gc2lnbmlmeSB0aGF0IGEgZ2l2ZW4gc3ltYm9sCi1pcyBvcHRpb25hbCBhbmQvb3IgY2FuIGJlIHJlcGVhdGVkLiBXZeKAmWxsIGFsc28gYWxsb3cgcGFyZW50aGVzZXMgdG8KLWdyb3VwIHN5bWJvbHMgYW5kIHRoZSBgWzxjaGFyYWN0ZXJzPl1gIG5vdGF0aW9uIHRvIHJlcHJlc2VudCBhbnkgb25lIG9mCi1gPGNoYXJhY3RlcnM+YC4KLSogVGhlIGdyYW1tYXIgaXMgcHJvdmlkZWQgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMgYW5kIGxlYXZlIHNvbWUKLW1pbm9yIGRldGFpbHMgb3V0LiBGb3IgaW5zdGFuY2UsIHRoZSBsYXN0IGNvbHVtbiBkZWZpbml0aW9uIGluIGEKLWBDUkVBVEUgVEFCTEVgIHN0YXRlbWVudCBpcyBvcHRpb25hbCBidXQgc3VwcG9ydGVkIGlmIHByZXNlbnQgZXZlbgotdGhvdWdoIHRoZSBwcm92aWRlZCBncmFtbWFyIGluIHRoaXMgZG9jdW1lbnQgc3VnZ2VzdCBpdCBpcyBub3QKLXN1cHBvcnRlZC4KLSogU2FtcGxlIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpbiBhIGNvZGUgYmxvY2s6Ci0KLWJjKHNhbXBsZSkuIFNFTEVDVCBzYW1wbGVfdXNhZ2UgRlJPTSBjcWw7Ci0KLSogUmVmZXJlbmNlcyB0byBrZXl3b3JkcyBvciBwaWVjZXMgb2YgQ1FMIGNvZGUgaW4gcnVubmluZyB0ZXh0IHdpbGwgYmUKLXNob3duIGluIGEgYGZpeGVkLXdpZHRoIGZvbnRgLgotCi1bW2lkZW50aWZpZXJzXV0KLT09PT0gSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzCi0KLVRoZSBDUUwgbGFuZ3VhZ2UgdXNlcyBfaWRlbnRpZmllcnNfIChvciBfbmFtZXNfKSB0byBpZGVudGlmeSB0YWJsZXMsCi1jb2x1bW5zIGFuZCBvdGhlciBvYmplY3RzLiBBbiBpZGVudGlmaWVyIGlzIGEgdG9rZW4gbWF0Y2hpbmcgdGhlIHJlZ3VsYXIKLWV4cHJlc3Npb24gYFthLXpBLVpdYGBbYS16QS1aMC05X11gYCpgLgotCi1BIG51bWJlciBvZiBzdWNoIGlkZW50aWZpZXJzLCBsaWtlIGBTRUxFQ1RgIG9yIGBXSVRIYCwgYXJlIF9rZXl3b3Jkc18uCi1UaGV5IGhhdmUgYSBmaXhlZCBtZWFuaW5nIGZvciB0aGUgbGFuZ3VhZ2UgYW5kIG1vc3QgYXJlIHJlc2VydmVkLiBUaGUKLWxpc3Qgb2YgdGhvc2Uga2V5d29yZHMgY2FuIGJlIGZvdW5kIGluIGxpbms6I2FwcGVuZGl4QVtBcHBlbmRpeCBBXS4KLQotSWRlbnRpZmllcnMgYW5kICh1bnF1b3RlZCkga2V5d29yZHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUuIFRodXMgYFNFTEVDVGAKLWlzIHRoZSBzYW1lIHRoYW4gYHNlbGVjdGAgb3IgYHNFbEVjVGAsIGFuZCBgbXlJZGAgaXMgdGhlIHNhbWUgdGhhbgotYG15aWRgIG9yIGBNWUlEYCBmb3IgaW5zdGFuY2UuIEEgY29udmVudGlvbiBvZnRlbiB1c2VkIChpbiBwYXJ0aWN1bGFyIGJ5Ci10aGUgc2FtcGxlcyBvZiB0aGlzIGRvY3VtZW50YXRpb24pIGlzIHRvIHVzZSB1cHBlciBjYXNlIGZvciBrZXl3b3JkcyBhbmQKLWxvd2VyIGNhc2UgZm9yIG90aGVyIGlkZW50aWZpZXJzLgotCi1UaGVyZSBpcyBhIHNlY29uZCBraW5kIG9mIGlkZW50aWZpZXJzIGNhbGxlZCBfcXVvdGVkIGlkZW50aWZpZXJzXwotZGVmaW5lZCBieSBlbmNsb3NpbmcgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgaW4KLWRvdWJsZS1xdW90ZXMoYCJgKS4gUXVvdGVkIGlkZW50aWZpZXJzIGFyZSBuZXZlciBrZXl3b3Jkcy4gVGh1cwotYCJzZWxlY3QiYCBpcyBub3QgYSByZXNlcnZlZCBrZXl3b3JkIGFuZCBjYW4gYmUgdXNlZCB0byByZWZlciB0byBhCi1jb2x1bW4sIHdoaWxlIGBzZWxlY3RgIHdvdWxkIHJhaXNlIGEgcGFyc2UgZXJyb3IuIEFsc28sIGNvbnRyYXJpbHkgdG8KLXVucXVvdGVkIGlkZW50aWZpZXJzIGFuZCBrZXl3b3JkcywgcXVvdGVkIGlkZW50aWZpZXJzIGFyZSBjYXNlIHNlbnNpdGl2ZQotKGAiTXkgUXVvdGVkIElkImAgaXMgX2RpZmZlcmVudF8gZnJvbSBgIm15IHF1b3RlZCBpZCJgKS4gQSBmdWxseQotbG93ZXJjYXNlIHF1b3RlZCBpZGVudGlmaWVyIHRoYXQgbWF0Y2hlcyBgW2EtekEtWl1gYFthLXpBLVowLTlfXWBgKmAgaXMKLWVxdWl2YWxlbnQgdG8gdGhlIHVucXVvdGVkIGlkZW50aWZpZXIgb2J0YWluZWQgYnkgcmVtb3ZpbmcgdGhlCi1kb3VibGUtcXVvdGUgKHNvIGAibXlpZCJgIGlzIGVxdWl2YWxlbnQgdG8gYG15aWRgIGFuZCB0byBgbXlJZGAgYnV0Ci1kaWZmZXJlbnQgZnJvbSBgIm15SWQiYCkuIEluc2lkZSBhIHF1b3RlZCBpZGVudGlmaWVyLCB0aGUgZG91YmxlLXF1b3RlCi1jaGFyYWN0ZXIgY2FuIGJlIHJlcGVhdGVkIHRvIGVzY2FwZSBpdCwgc28gYCJmb28gIiIgYmFyImAgaXMgYSB2YWxpZAotaWRlbnRpZmllci4KLQotKldhcm5pbmcqOiBfcXVvdGVkIGlkZW50aWZpZXJzXyBhbGxvd3MgdG8gZGVjbGFyZSBjb2x1bW5zIHdpdGggYXJiaXRyYXJ5Ci1uYW1lcywgYW5kIHRob3NlIGNhbiBzb21ldGltZSBjbGFzaCB3aXRoIHNwZWNpZmljIG5hbWVzIHVzZWQgYnkgdGhlCi1zZXJ2ZXIuIEZvciBpbnN0YW5jZSwgd2hlbiB1c2luZyBjb25kaXRpb25hbCB1cGRhdGUsIHRoZSBzZXJ2ZXIgd2lsbAotcmVzcG9uZCB3aXRoIGEgcmVzdWx0LXNldCBjb250YWluaW5nIGEgc3BlY2lhbCByZXN1bHQgbmFtZWQKLWAiW2FwcGxpZWRdImAuIElmIHlvdeKAmXZlIGRlY2xhcmVkIGEgY29sdW1uIHdpdGggc3VjaCBhIG5hbWUsIHRoaXMgY291bGQKLXBvdGVudGlhbGx5IGNvbmZ1c2Ugc29tZSB0b29scyBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuIEluIGdlbmVyYWwsCi11bnF1b3RlZCBpZGVudGlmaWVycyBzaG91bGQgYmUgcHJlZmVycmVkIGJ1dCBpZiB5b3UgdXNlIHF1b3RlZAotaWRlbnRpZmllcnMsIGl0IGlzIHN0cm9uZ2x5IGFkdmlzZWQgdG8gYXZvaWQgYW55IG5hbWUgZW5jbG9zZWQgYnkKLXNxdWFyZWQgYnJhY2tldHMgKGxpa2UgYCJbYXBwbGllZF0iYCkgYW5kIGFueSBuYW1lIHRoYXQgbG9va3MgbGlrZSBhCi1mdW5jdGlvbiBjYWxsIChsaWtlIGAiZih4KSJgKS4KLQotPT09PSBDb25zdGFudHMKLQotQ1FMIGRlZmluZXMgdGhlIGZvbGxvd2luZyBraW5kIG9mIF9jb25zdGFudHNfOiBzdHJpbmdzLCBpbnRlZ2VycywKLWZsb2F0cywgYm9vbGVhbnMsIHV1aWRzIGFuZCBibG9iczoKLQotKiBBIHN0cmluZyBjb25zdGFudCBpcyBhbiBhcmJpdHJhcnkgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBjaGFyYWN0ZXJzCi1lbmNsb3NlZCBieSBzaW5nbGUtcXVvdGUoYCdgKS4gT25lIGNhbiBpbmNsdWRlIGEgc2luZ2xlLXF1b3RlIGluIGEKLXN0cmluZyBieSByZXBlYXRpbmcgaXQsIGUuZy4gYCdJdCcncyByYWluaW5nIHRvZGF5J2AuIFRob3NlIGFyZSBub3QgdG8KLWJlIGNvbmZ1c2VkIHdpdGggcXVvdGVkIGlkZW50aWZpZXJzIHRoYXQgdXNlIGRvdWJsZS1xdW90ZXMuCi0qIEFuIGludGVnZXIgY29uc3RhbnQgaXMgZGVmaW5lZCBieSBgJy0nP1swLTldK2AuCi0qIEEgZmxvYXQgY29uc3RhbnQgaXMgZGVmaW5lZCBieQotYCctJz9bMC05XSsoJy4nWzAtOV0qKT8oW2VFXVsrLV0/WzAtOStdKT9gLiBPbiB0b3Agb2YgdGhhdCwgYE5hTmAgYW5kCi1gSW5maW5pdHlgIGFyZSBhbHNvIGZsb2F0IGNvbnN0YW50cy4KLSogQSBib29sZWFuIGNvbnN0YW50IGlzIGVpdGhlciBgdHJ1ZWAgb3IgYGZhbHNlYCB1cCB0bwotY2FzZS1pbnNlbnNpdGl2aXR5IChpLmUuIGBUcnVlYCBpcyBhIHZhbGlkIGJvb2xlYW4gY29uc3RhbnQpLgotKiBBIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfdW5pcXVlX2lkZW50aWZpZXJbVVVJRF0KLWNvbnN0YW50IGlzIGRlZmluZWQgYnkgYGhleHs4fS1oZXh7NH0taGV4ezR9LWhleHs0fS1oZXh7MTJ9YCB3aGVyZSBgaGV4YAotaXMgYW4gaGV4YWRlY2ltYWwgY2hhcmFjdGVyLCBlLmcuIGBbMC05YS1mQS1GXWAgYW5kIGB7NH1gIGlzIHRoZSBudW1iZXIKLW9mIHN1Y2ggY2hhcmFjdGVycy4KLSogQSBibG9iIGNvbnN0YW50IGlzIGFuIGhleGFkZWNpbWFsIG51bWJlciBkZWZpbmVkIGJ5IGAwW3hYXShoZXgpK2AKLXdoZXJlIGBoZXhgIGlzIGFuIGhleGFkZWNpbWFsIGNoYXJhY3RlciwgZS5nLiBgWzAtOWEtZkEtRl1gLgotCi1Gb3IgaG93IHRoZXNlIGNvbnN0YW50cyBhcmUgdHlwZWQsIHNlZSB0aGUgbGluazojdHlwZXNbZGF0YSB0eXBlcwotc2VjdGlvbl0uCi0KLT09PT0gQ29tbWVudHMKLQotQSBjb21tZW50IGluIENRTCBpcyBhIGxpbmUgYmVnaW5uaW5nIGJ5IGVpdGhlciBkb3VibGUgZGFzaGVzIChgLS1gKSBvcgotZG91YmxlIHNsYXNoIChgLy9gKS4KLQotTXVsdGktbGluZSBjb21tZW50cyBhcmUgYWxzbyBzdXBwb3J0ZWQgdGhyb3VnaCBlbmNsb3N1cmUgd2l0aGluIGAvKmAgYW5kCi1gKi9gIChidXQgbmVzdGluZyBpcyBub3Qgc3VwcG9ydGVkKS4KLQotYmMoc2FtcGxlKS4gKwot4oCUIFRoaXMgaXMgYSBjb21tZW50ICsKLS8vIFRoaXMgaXMgYSBjb21tZW50IHRvbyArCi0vKiBUaGlzIGlzICsKLWEgbXVsdGktbGluZSBjb21tZW50ICovCi0KLT09PT0gU3RhdGVtZW50cwotCi1DUUwgY29uc2lzdHMgb2Ygc3RhdGVtZW50cy4gQXMgaW4gU1FMLCB0aGVzZSBzdGF0ZW1lbnRzIGNhbiBiZSBkaXZpZGVkCi1pbiAzIGNhdGVnb3JpZXM6Ci0KLSogRGF0YSBkZWZpbml0aW9uIHN0YXRlbWVudHMsIHRoYXQgYWxsb3cgdG8gc2V0IGFuZCBjaGFuZ2UgdGhlIHdheSBkYXRhCi1pcyBzdG9yZWQuCi0qIERhdGEgbWFuaXB1bGF0aW9uIHN0YXRlbWVudHMsIHRoYXQgYWxsb3cgdG8gY2hhbmdlIGRhdGEKLSogUXVlcmllcywgdG8gbG9vayB1cCBkYXRhCi0KLUFsbCBzdGF0ZW1lbnRzIGVuZCB3aXRoIGEgc2VtaWNvbG9uIChgO2ApIGJ1dCB0aGF0IHNlbWljb2xvbiBjYW4gYmUKLW9taXR0ZWQgd2hlbiBkZWFsaW5nIHdpdGggYSBzaW5nbGUgc3RhdGVtZW50LiBUaGUgc3VwcG9ydGVkIHN0YXRlbWVudHMKLWFyZSBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4gV2hlbiBkZXNjcmliaW5nIHRoZSBncmFtbWFyIG9mCi1zYWlkIHN0YXRlbWVudHMsIHdlIHdpbGwgcmV1c2UgdGhlIG5vbi10ZXJtaW5hbCBzeW1ib2xzIGRlZmluZWQgYmVsb3c6Ci0KLWJjKHN5bnRheCkuLiArCi06Oj0gYW55IHF1b3RlZCBvciB1bnF1b3RlZCBpZGVudGlmaWVyLCBleGNsdWRpbmcgcmVzZXJ2ZWQga2V5d29yZHMgKwotOjo9ICggYC4nKT8KLQotOjo9IGEgc3RyaW5nIGNvbnN0YW50ICsKLTo6PSBhbiBpbnRlZ2VyIGNvbnN0YW50ICsKLTo6PSBhIGZsb2F0IGNvbnN0YW50ICsKLTo6PSB8ICArCi06Oj0gYSB1dWlkIGNvbnN0YW50ICsKLTo6PSBhIGJvb2xlYW4gY29uc3RhbnQgKwotOjo9IGEgYmxvYiBjb25zdGFudAotCi06Oj0gICsKLXwgICsKLXwgICsKLXwgICsKLXwgICsKLTo6PSBgPycgKwotfCBgOicgICsKLTo6PSAgKwotfCAgKwotfCAgKwotfCBgKCcgKCAoYCwnICkqKT8gYCknCi0KLTo6PSAgKwotfCAgKwotfCAgKwotOjo9IGBceycgKCBgOicgKCBgLCcgYDonICkqICk/IGB9JyArCi06Oj0gYFx7JyAoICggYCwnICkqICk/IGB9JyArCi06Oj0gYFsnICggKCBgLCcgKSogKT8gYF0nCi0KLTo6PQotCi06Oj0gKEFORCApKiArCi06Oj0gYD0nICggfCB8ICkgKwotcC4gKwotUGxlYXNlIG5vdGUgdGhhdCBub3QgZXZlcnkgcG9zc2libGUgcHJvZHVjdGlvbnMgb2YgdGhlIGdyYW1tYXIgYWJvdmUKLXdpbGwgYmUgdmFsaWQgaW4gcHJhY3RpY2UuIE1vc3Qgbm90YWJseSwgYDx2YXJpYWJsZT5gIGFuZCBuZXN0ZWQKLWA8Y29sbGVjdGlvbi1saXRlcmFsPmAgYXJlIGN1cnJlbnRseSBub3QgYWxsb3dlZCBpbnNpZGUKLWA8Y29sbGVjdGlvbi1saXRlcmFsPmAuCi0KLUEgYDx2YXJpYWJsZT5gIGNhbiBiZSBlaXRoZXIgYW5vbnltb3VzIChhIHF1ZXN0aW9uIG1hcmsgKGA/YCkpIG9yIG5hbWVkCi0oYW4gaWRlbnRpZmllciBwcmVjZWRlZCBieSBgOmApLiBCb3RoIGRlY2xhcmUgYSBiaW5kIHZhcmlhYmxlcyBmb3IKLWxpbms6I3ByZXBhcmVkU3RhdGVtZW50W3ByZXBhcmVkIHN0YXRlbWVudHNdLiBUaGUgb25seSBkaWZmZXJlbmNlCi1iZXR3ZWVuIGFuIGFueW1vdXMgYW5kIGEgbmFtZWQgdmFyaWFibGUgaXMgdGhhdCBhIG5hbWVkIG9uZSB3aWxsIGJlCi1lYXNpZXIgdG8gcmVmZXIgdG8gKGhvdyBleGFjdGx5IGRlcGVuZHMgb24gdGhlIGNsaWVudCBkcml2ZXIgdXNlZCkuCi0KLVRoZSBgPHByb3BlcnRpZXM+YCBwcm9kdWN0aW9uIGlzIHVzZSBieSBzdGF0ZW1lbnQgdGhhdCBjcmVhdGUgYW5kIGFsdGVyCi1rZXlzcGFjZXMgYW5kIHRhYmxlcy4gRWFjaCBgPHByb3BlcnR5PmAgaXMgZWl0aGVyIGEgX3NpbXBsZV8gb25lLCBpbgotd2hpY2ggY2FzZSBpdCBqdXN0IGhhcyBhIHZhbHVlLCBvciBhIF9tYXBfIG9uZSwgaW4gd2hpY2ggY2FzZSBpdOKAmXMgdmFsdWUKLWlzIGEgbWFwIGdyb3VwaW5nIHN1Yi1vcHRpb25zLiBUaGUgZm9sbG93aW5nIHdpbGwgcmVmZXIgdG8gb25lIG9yIHRoZQotb3RoZXIgYXMgdGhlIF9raW5kXyAoX3NpbXBsZV8gb3IgX21hcF8pIG9mIHRoZSBwcm9wZXJ0eS4KLQotQSBgPHRhYmxlbmFtZT5gIHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSBhIHRhYmxlLiBUaGlzIGlzIGFuIGlkZW50aWZpZXIKLXJlcHJlc2VudGluZyB0aGUgdGFibGUgbmFtZSB0aGF0IGNhbiBiZSBwcmVjZWRlZCBieSBhIGtleXNwYWNlIG5hbWUuIFRoZQota2V5c3BhY2UgbmFtZSwgaWYgcHJvdmlkZWQsIGFsbG93IHRvIGlkZW50aWZ5IGEgdGFibGUgaW4gYW5vdGhlcgota2V5c3BhY2UgdGhhbiB0aGUgY3VycmVudGx5IGFjdGl2ZSBvbmUgKHRoZSBjdXJyZW50bHkgYWN0aXZlIGtleXNwYWNlIGlzCi1zZXQgdGhyb3VnaCB0aGUgYFVTRWAgc3RhdGVtZW50KS4KLQotRm9yIHN1cHBvcnRlZCBgPGZ1bmN0aW9uPmAsIHNlZSB0aGUgc2VjdGlvbiBvbgotbGluazojZnVuY3Rpb25zW2Z1bmN0aW9uc10uCi0KLVN0cmluZ3MgY2FuIGJlIGVpdGhlciBlbmNsb3NlZCB3aXRoIHNpbmdsZSBxdW90ZXMgb3IgdHdvIGRvbGxhcgotY2hhcmFjdGVycy4gVGhlIHNlY29uZCBzeW50YXggaGFzIGJlZW4gaW50cm9kdWNlZCB0byBhbGxvdyBzdHJpbmdzIHRoYXQKLWNvbnRhaW4gc2luZ2xlIHF1b3Rlcy4gVHlwaWNhbCBjYW5kaWRhdGVzIGZvciBzdWNoIHN0cmluZ3MgYXJlIHNvdXJjZQotY29kZSBmcmFnbWVudHMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuCi0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLi4gKwotYHNvbWUgc3RyaW5nIHZhbHVlJwotCi0kJGRvdWJsZS1kb2xsYXIgc3RyaW5nIGNhbiBjb250YWluIHNpbmdsZSDigJkgcXVvdGVzJCQgKwotcC4KLQotW1twcmVwYXJlZFN0YXRlbWVudF1dCi09PT09IFByZXBhcmVkIFN0YXRlbWVudAotCi1DUUwgc3VwcG9ydHMgX3ByZXBhcmVkIHN0YXRlbWVudHNfLiBQcmVwYXJlZCBzdGF0ZW1lbnQgaXMgYW4KLW9wdGltaXphdGlvbiB0aGF0IGFsbG93cyB0byBwYXJzZSBhIHF1ZXJ5IG9ubHkgb25jZSBidXQgZXhlY3V0ZSBpdAotbXVsdGlwbGUgdGltZXMgd2l0aCBkaWZmZXJlbnQgY29uY3JldGUgdmFsdWVzLgotCi1JbiBhIHN0YXRlbWVudCwgZWFjaCB0aW1lIGEgY29sdW1uIHZhbHVlIGlzIGV4cGVjdGVkIChpbiB0aGUgZGF0YQotbWFuaXB1bGF0aW9uIGFuZCBxdWVyeSBzdGF0ZW1lbnRzKSwgYSBgPHZhcmlhYmxlPmAgKHNlZSBhYm92ZSkgY2FuIGJlCi11c2VkIGluc3RlYWQuIEEgc3RhdGVtZW50IHdpdGggYmluZCB2YXJpYWJsZXMgbXVzdCB0aGVuIGJlIF9wcmVwYXJlZF8uCi1PbmNlIGl0IGhhcyBiZWVuIHByZXBhcmVkLCBpdCBjYW4gZXhlY3V0ZWQgYnkgcHJvdmlkaW5nIGNvbmNyZXRlIHZhbHVlcwotZm9yIHRoZSBiaW5kIHZhcmlhYmxlcy4gVGhlIGV4YWN0IHByb2NlZHVyZSB0byBwcmVwYXJlIGEgc3RhdGVtZW50IGFuZAotZXhlY3V0ZSBhIHByZXBhcmVkIHN0YXRlbWVudCBkZXBlbmRzIG9uIHRoZSBDUUwgZHJpdmVyIHVzZWQgYW5kIGlzCi1iZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMgZG9jdW1lbnQuCi0KLUluIGFkZGl0aW9uIHRvIHByb3ZpZGluZyBjb2x1bW4gdmFsdWVzLCBiaW5kIG1hcmtlcnMgbWF5IGJlIHVzZWQgdG8KLXByb3ZpZGUgdmFsdWVzIGZvciBgTElNSVRgLCBgVElNRVNUQU1QYCwgYW5kIGBUVExgIGNsYXVzZXMuIElmIGFub255bW91cwotYmluZCBtYXJrZXJzIGFyZSB1c2VkLCB0aGUgbmFtZXMgZm9yIHRoZSBxdWVyeSBwYXJhbWV0ZXJzIHdpbGwgYmUKLWBbbGltaXRdYCwgYFt0aW1lc3RhbXBdYCwgYW5kIGBbdHRsXWAsIHJlc3BlY3RpdmVseS4KLQotW1tkYXRhRGVmaW5pdGlvbl1dCi09PT0gRGF0YSBEZWZpbml0aW9uCi0KLVtbY3JlYXRlS2V5c3BhY2VTdG10XV0KLT09PT0gQ1JFQVRFIEtFWVNQQUNFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IENSRUFURSBLRVlTUEFDRSAoSUYgTk9UIEVYSVNUUyk/IFdJVEggICsKLXAuICsKLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLi4gKwotQ1JFQVRFIEtFWVNQQUNFIEV4Y2Vsc2lvciArCi1XSVRIIHJlcGxpY2F0aW9uID0gXHvigJljbGFzc+KAmTogYFNpbXBsZVN0cmF0ZWd5JywgYHJlcGxpY2F0aW9uX2ZhY3RvcicgOgotM307Ci0KLUNSRUFURSBLRVlTUEFDRSBFeGNhbGlidXIgKwotV0lUSCByZXBsaWNhdGlvbiA9IFx74oCZY2xhc3PigJk6IGBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsIGBEQzEnIDogMSwKLWBEQzInIDogM30gKwotQU5EIGR1cmFibGVfd3JpdGVzID0gZmFsc2U7ICsKLXAuICsKLVRoZSBgQ1JFQVRFIEtFWVNQQUNFYCBzdGF0ZW1lbnQgY3JlYXRlcyBhIG5ldyB0b3AtbGV2ZWwgX2tleXNwYWNlXy4gQQota2V5c3BhY2UgaXMgYSBuYW1lc3BhY2UgdGhhdCBkZWZpbmVzIGEgcmVwbGljYXRpb24gc3RyYXRlZ3kgYW5kIHNvbWUKLW9wdGlvbnMgZm9yIGEgc2V0IG9mIHRhYmxlcy4gVmFsaWQga2V5c3BhY2VzIG5hbWVzIGFyZSBpZGVudGlmaWVycwotY29tcG9zZWQgZXhjbHVzaXZlbHkgb2YgYWxwaGFudW1lcmljYWwgY2hhcmFjdGVycyBhbmQgd2hvc2UgbGVuZ3RoIGlzCi1sZXNzZXIgb3IgZXF1YWwgdG8gMzIuIE5vdGUgdGhhdCBhcyBpZGVudGlmaWVycywga2V5c3BhY2UgbmFtZXMgYXJlIGNhc2UKLWluc2Vuc2l0aXZlOiB1c2UgYSBxdW90ZWQgaWRlbnRpZmllciBmb3IgY2FzZSBzZW5zaXRpdmUga2V5c3BhY2UgbmFtZXMuCi0KLVRoZSBzdXBwb3J0ZWQgYDxwcm9wZXJ0aWVzPmAgZm9yIGBDUkVBVEUgS0VZU1BBQ0VgIGFyZToKLQotW2NvbHM9IiwsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfG5hbWUgfGtpbmQgfG1hbmRhdG9yeSB8ZGVmYXVsdCB8ZGVzY3JpcHRpb24KLXxgcmVwbGljYXRpb25gIHxfbWFwXyB8eWVzIHwgfFRoZSByZXBsaWNhdGlvbiBzdHJhdGVneSBhbmQgb3B0aW9ucyB0bwotdXNlIGZvciB0aGUga2V5c3BhY2UuCi0KLXxgZHVyYWJsZV93cml0ZXNgIHxfc2ltcGxlXyB8bm8gfHRydWUgfFdoZXRoZXIgdG8gdXNlIHRoZSBjb21taXQgbG9nIGZvcgotdXBkYXRlcyBvbiB0aGlzIGtleXNwYWNlIChkaXNhYmxlIHRoaXMgb3B0aW9uIGF0IHlvdXIgb3duIHJpc2shKS4KLXw9PT0KLQotVGhlIGByZXBsaWNhdGlvbmAgYDxwcm9wZXJ0eT5gIGlzIG1hbmRhdG9yeS4gSXQgbXVzdCBhdCBsZWFzdCBjb250YWlucwotdGhlIGAnY2xhc3MnYCBzdWItb3B0aW9uIHdoaWNoIGRlZmluZXMgdGhlIHJlcGxpY2F0aW9uIHN0cmF0ZWd5IGNsYXNzIHRvCi11c2UuIFRoZSByZXN0IG9mIHRoZSBzdWItb3B0aW9ucyBkZXBlbmRzIG9uIHRoYXQgcmVwbGljYXRpb24gc3RyYXRlZ3kKLWNsYXNzLiBCeSBkZWZhdWx0LCBDYXNzYW5kcmEgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGAnY2xhc3MnYDoKLQotKiBgJ1NpbXBsZVN0cmF0ZWd5J2A6IEEgc2ltcGxlIHN0cmF0ZWd5IHRoYXQgZGVmaW5lcyBhIHNpbXBsZQotcmVwbGljYXRpb24gZmFjdG9yIGZvciB0aGUgd2hvbGUgY2x1c3Rlci4gVGhlIG9ubHkgc3ViLW9wdGlvbnMgc3VwcG9ydGVkCi1pcyBgJ3JlcGxpY2F0aW9uX2ZhY3RvcidgIHRvIGRlZmluZSB0aGF0IHJlcGxpY2F0aW9uIGZhY3RvciBhbmQgaXMKLW1hbmRhdG9yeS4KLSogYCdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneSdgOiBBIHJlcGxpY2F0aW9uIHN0cmF0ZWd5IHRoYXQgYWxsb3dzIHRvIHNldAotdGhlIHJlcGxpY2F0aW9uIGZhY3RvciBpbmRlcGVuZGVudGx5IGZvciBlYWNoIGRhdGEtY2VudGVyLiBUaGUgcmVzdCBvZgotdGhlIHN1Yi1vcHRpb25zIGFyZSBrZXktdmFsdWUgcGFpcnMgd2hlcmUgZWFjaCB0aW1lIHRoZSBrZXkgaXMgdGhlIG5hbWUKLW9mIGEgZGF0YWNlbnRlciBhbmQgdGhlIHZhbHVlIHRoZSByZXBsaWNhdGlvbiBmYWN0b3IgZm9yIHRoYXQKLWRhdGEtY2VudGVyLgotCi1BdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBhbHJlYWR5IGV4aXN0aW5nIGtleXNwYWNlIHdpbGwgcmV0dXJuIGFuIGVycm9yCi11bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgaXQgaXMgdXNlZCwgdGhlIHN0YXRlbWVudAotd2lsbCBiZSBhIG5vLW9wIGlmIHRoZSBrZXlzcGFjZSBhbHJlYWR5IGV4aXN0cy4KLQotW1t1c2VTdG10XV0KLT09PT0gVVNFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLiA6Oj0gVVNFCi0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLiBVU0UgbXlBcHA7Ci0KLVRoZSBgVVNFYCBzdGF0ZW1lbnQgdGFrZXMgYW4gZXhpc3Rpbmcga2V5c3BhY2UgbmFtZSBhcyBhcmd1bWVudCBhbmQgc2V0Ci1pdCBhcyB0aGUgcGVyLWNvbm5lY3Rpb24gY3VycmVudCB3b3JraW5nIGtleXNwYWNlLiBBbGwgc3Vic2VxdWVudAota2V5c3BhY2Utc3BlY2lmaWMgYWN0aW9ucyB3aWxsIGJlIHBlcmZvcm1lZCBpbiB0aGUgY29udGV4dCBvZiB0aGUKLXNlbGVjdGVkIGtleXNwYWNlLCB1bmxlc3MgbGluazojc3RhdGVtZW50c1tvdGhlcndpc2Ugc3BlY2lmaWVkXSwgdW50aWwKLWFub3RoZXIgVVNFIHN0YXRlbWVudCBpcyBpc3N1ZWQgb3IgdGhlIGNvbm5lY3Rpb24gdGVybWluYXRlcy4KLQotW1thbHRlcktleXNwYWNlU3RtdF1dCi09PT09IEFMVEVSIEtFWVNQQUNFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IEFMVEVSIEtFWVNQQUNFIChJRiBFWElTVFMpPyBXSVRIICArCi1wLiArCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4uICsKLUFMVEVSIEtFWVNQQUNFIEV4Y2Vsc2lvciArCi1XSVRIIHJlcGxpY2F0aW9uID0gXHvigJljbGFzc+KAmTogYFNpbXBsZVN0cmF0ZWd5JywgYHJlcGxpY2F0aW9uX2ZhY3RvcicgOgotNH07Ci0KLVRoZSBgQUxURVIgS0VZU1BBQ0VgIHN0YXRlbWVudCBhbHRlcnMgdGhlIHByb3BlcnRpZXMgb2YgYW4gZXhpc3RpbmcKLWtleXNwYWNlLiBUaGUgc3VwcG9ydGVkIGA8cHJvcGVydGllcz5gIGFyZSB0aGUgc2FtZSBhcyBmb3IgdGhlCi1saW5rOiNjcmVhdGVLZXlzcGFjZVN0bXRbYENSRUFURSBLRVlTUEFDRWBdIHN0YXRlbWVudC4KLQotW1tkcm9wS2V5c3BhY2VTdG10XV0KLT09PT0gRFJPUCBLRVlTUEFDRQotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4gOjo9IERST1AgS0VZU1BBQ0UgKCBJRiBFWElTVFMgKT8KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuIERST1AgS0VZU1BBQ0UgbXlBcHA7Ci0KLUEgYERST1AgS0VZU1BBQ0VgIHN0YXRlbWVudCByZXN1bHRzIGluIHRoZSBpbW1lZGlhdGUsIGlycmV2ZXJzaWJsZQotcmVtb3ZhbCBvZiBhbiBleGlzdGluZyBrZXlzcGFjZSwgaW5jbHVkaW5nIGFsbCBjb2x1bW4gZmFtaWxpZXMgaW4gaXQsCi1hbmQgYWxsIGRhdGEgY29udGFpbmVkIGluIHRob3NlIGNvbHVtbiBmYW1pbGllcy4KLQotSWYgdGhlIGtleXNwYWNlIGRvZXMgbm90IGV4aXN0cywgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwKLXVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotCi1bW2NyZWF0ZVRhYmxlU3RtdF1dCi09PT09IENSRUFURSBUQUJMRQotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBDUkVBVEUgKCBUQUJMRSB8IENPTFVNTkZBTUlMWSApICggSUYgTk9UIEVYSVNUUyApPyAgKwotYCgnICggYCwnICkqIGApJyArCi0oIFdJVEggKCBBTkQgKSogKT8KLQotOjo9ICggU1RBVElDICk/ICggUFJJTUFSWSBLRVkgKT8gKwotfCBQUklNQVJZIEtFWSBgKCcgKCBgLCcgKSogYCknCi0KLTo6PSAgKwotfCBgKCcgKGAsJyApKiBgKScKLQotOjo9ICArCi18IENPTVBBQ1QgU1RPUkFHRSArCi18IENMVVNURVJJTkcgT1JERVIgKwotcC4gKwotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuLiArCi1DUkVBVEUgVEFCTEUgbW9ua2V5U3BlY2llcyAoICsKLXNwZWNpZXMgdGV4dCBQUklNQVJZIEtFWSwgKwotY29tbW9uX25hbWUgdGV4dCwgKwotcG9wdWxhdGlvbiB2YXJpbnQsICsKLWF2ZXJhZ2Vfc2l6ZSBpbnQgKwotKSBXSVRIIGNvbW1lbnQ9YEltcG9ydGFudCBiaW9sb2dpY2FsIHJlY29yZHMnOwotCi1DUkVBVEUgVEFCTEUgdGltZWxpbmUgKCArCi11c2VyaWQgdXVpZCwgKwotcG9zdGVkX21vbnRoIGludCwgKwotcG9zdGVkX3RpbWUgdXVpZCwgKwotYm9keSB0ZXh0LCArCi1wb3N0ZWRfYnkgdGV4dCwgKwotUFJJTUFSWSBLRVkgKHVzZXJpZCwgcG9zdGVkX21vbnRoLCBwb3N0ZWRfdGltZSkgKwotKSBXSVRIIGNvbXBhY3Rpb24gPSBceyBgY2xhc3MnIDogYExldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3knIH07ICsKLXAuICsKLVRoZSBgQ1JFQVRFIFRBQkxFYCBzdGF0ZW1lbnQgY3JlYXRlcyBhIG5ldyB0YWJsZS4gRWFjaCBzdWNoIHRhYmxlIGlzIGEKLXNldCBvZiBfcm93c18gKHVzdWFsbHkgcmVwcmVzZW50aW5nIHJlbGF0ZWQgZW50aXRpZXMpIGZvciB3aGljaCBpdAotZGVmaW5lcyBhIG51bWJlciBvZiBwcm9wZXJ0aWVzLiBBIHRhYmxlIGlzIGRlZmluZWQgYnkgYQotbGluazojY3JlYXRlVGFibGVOYW1lW25hbWVdLCBpdCBkZWZpbmVzIHRoZSBjb2x1bW5zIGNvbXBvc2luZyByb3dzIG9mCi10aGUgdGFibGUgYW5kIGhhdmUgYSBudW1iZXIgb2YgbGluazojY3JlYXRlVGFibGVPcHRpb25zW29wdGlvbnNdLiBOb3RlCi10aGF0IHRoZSBgQ1JFQVRFIENPTFVNTkZBTUlMWWAgc3ludGF4IGlzIHN1cHBvcnRlZCBhcyBhbiBhbGlhcyBmb3IKLWBDUkVBVEUgVEFCTEVgIChmb3IgaGlzdG9yaWNhbCByZWFzb25zKS4KLQotQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gYWxyZWFkeSBleGlzdGluZyB0YWJsZSB3aWxsIHJldHVybiBhbiBlcnJvcgotdW5sZXNzIHRoZSBgSUYgTk9UIEVYSVNUU2Agb3B0aW9uIGlzIHVzZWQuIElmIGl0IGlzIHVzZWQsIHRoZSBzdGF0ZW1lbnQKLXdpbGwgYmUgYSBuby1vcCBpZiB0aGUgdGFibGUgYWxyZWFkeSBleGlzdHMuCi0KLVtbY3JlYXRlVGFibGVOYW1lXV0KLT09PT09IGA8dGFibGVuYW1lPmAKLQotVmFsaWQgdGFibGUgbmFtZXMgYXJlIHRoZSBzYW1lIGFzIHZhbGlkCi1saW5rOiNjcmVhdGVLZXlzcGFjZVN0bXRba2V5c3BhY2UgbmFtZXNdICh1cCB0byAzMiBjaGFyYWN0ZXJzIGxvbmcKLWFscGhhbnVtZXJpY2FsIGlkZW50aWZpZXJzKS4gSWYgdGhlIHRhYmxlIG5hbWUgaXMgcHJvdmlkZWQgYWxvbmUsIHRoZQotdGFibGUgaXMgY3JlYXRlZCB3aXRoaW4gdGhlIGN1cnJlbnQga2V5c3BhY2UgKHNlZSBgVVNFYCksIGJ1dCBpZiBpdCBpcwotcHJlZml4ZWQgYnkgYW4gZXhpc3Rpbmcga2V5c3BhY2UgbmFtZSAoc2VlCi1saW5rOiNzdGF0ZW1lbnRzW2A8dGFibGVuYW1lPmBdIGdyYW1tYXIpLCBpdCBpcyBjcmVhdGVkIGluIHRoZSBzcGVjaWZpZWQKLWtleXNwYWNlIChidXQgZG9lcyAqbm90KiBjaGFuZ2UgdGhlIGN1cnJlbnQga2V5c3BhY2UpLgotCi1bW2NyZWF0ZVRhYmxlQ29sdW1uXV0KLT09PT09IGA8Y29sdW1uLWRlZmluaXRpb24+YAotCi1BIGBDUkVBVEUgVEFCTEVgIHN0YXRlbWVudCBkZWZpbmVzIHRoZSBjb2x1bW5zIHRoYXQgcm93cyBvZiB0aGUgdGFibGUKLWNhbiBoYXZlLiBBIF9jb2x1bW5fIGlzIGRlZmluZWQgYnkgaXRzIG5hbWUgKGFuIGlkZW50aWZpZXIpIGFuZCBpdHMgdHlwZQotKHNlZSB0aGUgbGluazojdHlwZXNbZGF0YSB0eXBlc10gc2VjdGlvbiBmb3IgbW9yZSBkZXRhaWxzIG9uIGFsbG93ZWQKLXR5cGVzIGFuZCB0aGVpciBwcm9wZXJ0aWVzKS4KLQotV2l0aGluIGEgdGFibGUsIGEgcm93IGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgaXRzIGBQUklNQVJZIEtFWWAgKG9yCi1tb3JlIHNpbXBseSB0aGUga2V5KSwgYW5kIGhlbmNlIGFsbCB0YWJsZSBkZWZpbml0aW9ucyAqbXVzdCogZGVmaW5lIGEKLVBSSU1BUlkgS0VZIChhbmQgb25seSBvbmUpLiBBIGBQUklNQVJZIEtFWWAgaXMgY29tcG9zZWQgb2Ygb25lIG9yIG1vcmUKLW9mIHRoZSBjb2x1bW5zIGRlZmluZWQgaW4gdGhlIHRhYmxlLiBJZiB0aGUgYFBSSU1BUlkgS0VZYCBpcyBvbmx5IG9uZQotY29sdW1uLCB0aGlzIGNhbiBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGNvbHVtbiBkZWZpbml0aW9uLgotT3RoZXJ3aXNlLCBpdCBtdXN0IGJlIHNwZWNpZmllZCBieSBmb2xsb3dpbmcgYFBSSU1BUlkgS0VZYCBieSB0aGUKLWNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNvbHVtbiBuYW1lcyBjb21wb3NpbmcgdGhlIGtleSB3aXRoaW4KLXBhcmVudGhlc2lzLiBOb3RlIHRoYXQ6Ci0KLWJjKHNhbXBsZSkuICsKLUNSRUFURSBUQUJMRSB0ICggKwotayBpbnQgUFJJTUFSWSBLRVksICsKLW90aGVyIHRleHQgKwotKQotCi1pcyBlcXVpdmFsZW50IHRvCi0KLWJjKHNhbXBsZSkuICsKLUNSRUFURSBUQUJMRSB0ICggKwotayBpbnQsICsKLW90aGVyIHRleHQsICsKLVBSSU1BUlkgS0VZIChrKSArCi0pCi0KLVtbY3JlYXRlVGFibGVwYXJ0aXRpb25DbHVzdGVyaW5nXV0KLT09PT09IFBhcnRpdGlvbiBrZXkgYW5kIGNsdXN0ZXJpbmcgY29sdW1ucwotCi1JbiBDUUwsIHRoZSBvcmRlciBpbiB3aGljaCBjb2x1bW5zIGFyZSBkZWZpbmVkIGZvciB0aGUgYFBSSU1BUlkgS0VZYAotbWF0dGVycy4gVGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUga2V5IGlzIGNhbGxlZCB0aGUgX3BhcnRpdGlvbiBrZXlfLiBJdAotaGFzIHRoZSBwcm9wZXJ0eSB0aGF0IGFsbCB0aGUgcm93cyBzaGFyaW5nIHRoZSBzYW1lIHBhcnRpdGlvbiBrZXkgKGV2ZW4KLWFjcm9zcyB0YWJsZSBpbiBmYWN0KSBhcmUgc3RvcmVkIG9uIHRoZSBzYW1lIHBoeXNpY2FsIG5vZGUuIEFsc28sCi1pbnNlcnRpb24vdXBkYXRlL2RlbGV0aW9uIG9uIHJvd3Mgc2hhcmluZyB0aGUgc2FtZSBwYXJ0aXRpb24ga2V5IGZvciBhCi1naXZlbiB0YWJsZSBhcmUgcGVyZm9ybWVkIF9hdG9taWNhbGx5XyBhbmQgaW4gX2lzb2xhdGlvbl8uIE5vdGUgdGhhdCBpdAotaXMgcG9zc2libGUgdG8gaGF2ZSBhIGNvbXBvc2l0ZSBwYXJ0aXRpb24ga2V5LCBpLmUuIGEgcGFydGl0aW9uIGtleQotZm9ybWVkIG9mIG11bHRpcGxlIGNvbHVtbnMsIHVzaW5nIGFuIGV4dHJhIHNldCBvZiBwYXJlbnRoZXNlcyB0byBkZWZpbmUKLXdoaWNoIGNvbHVtbnMgZm9ybXMgdGhlIHBhcnRpdGlvbiBrZXkuCi0KLVRoZSByZW1haW5pbmcgY29sdW1ucyBvZiB0aGUgYFBSSU1BUlkgS0VZYCBkZWZpbml0aW9uLCBpZiBhbnksIGFyZQotY2FsbGVkIF9fY2x1c3RlcmluZyBjb2x1bW5zLiBPbiBhIGdpdmVuIHBoeXNpY2FsIG5vZGUsIHJvd3MgZm9yIGEgZ2l2ZW4KLXBhcnRpdGlvbiBrZXkgYXJlIHN0b3JlZCBpbiB0aGUgb3JkZXIgaW5kdWNlZCBieSB0aGUgY2x1c3RlcmluZyBjb2x1bW5zLAotbWFraW5nIHRoZSByZXRyaWV2YWwgb2Ygcm93cyBpbiB0aGF0IGNsdXN0ZXJpbmcgb3JkZXIgcGFydGljdWxhcmx5Ci1lZmZpY2llbnQgKHNlZSBgU0VMRUNUYCkuCi0KLVtbY3JlYXRlVGFibGVTdGF0aWNdXQotPT09PT0gYFNUQVRJQ2AgY29sdW1ucwotCi1Tb21lIGNvbHVtbnMgY2FuIGJlIGRlY2xhcmVkIGFzIGBTVEFUSUNgIGluIGEgdGFibGUgZGVmaW5pdGlvbi4gQSBjb2x1bW4KLXRoYXQgaXMgc3RhdGljIHdpbGwgYmUgYGBzaGFyZWQnJyBieSBhbGwgdGhlIHJvd3MgYmVsb25naW5nIHRvIHRoZSBzYW1lCi1wYXJ0aXRpb24gKGhhdmluZyB0aGUgc2FtZSBwYXJ0aXRpb24ga2V5KS4gRm9yIGluc3RhbmNlLCBpbjoKLQotYmMoc2FtcGxlKS4gKwotQ1JFQVRFIFRBQkxFIHRlc3QgKCArCi1wayBpbnQsICsKLXQgaW50LCArCi12IHRleHQsICsKLXMgdGV4dCBzdGF0aWMsICsKLVBSSU1BUlkgS0VZIChwaywgdCkgKwotKTsgKwotSU5TRVJUIElOVE8gdGVzdChwaywgdCwgdiwgcykgVkFMVUVTICgwLCAwLCBgdmFsMCcsIGBzdGF0aWMwJyk7ICsKLUlOU0VSVCBJTlRPIHRlc3QocGssIHQsIHYsIHMpIFZBTFVFUyAoMCwgMSwgYHZhbDEnLCBgc3RhdGljMScpOyArCi1TRUxFQ1QgKiBGUk9NIHRlc3QgV0hFUkUgcGs9MCBBTkQgdD0wOwotCi10aGUgbGFzdCBxdWVyeSB3aWxsIHJldHVybiBgJ3N0YXRpYzEnYCBhcyB2YWx1ZSBmb3IgYHNgLCBzaW5jZSBgc2AgaXMKLXN0YXRpYyBhbmQgdGh1cyB0aGUgMm5kIGluc2VydGlvbiBtb2RpZmllZCB0aGlzIGBgc2hhcmVkJycgdmFsdWUuIE5vdGUKLWhvd2V2ZXIgdGhhdCBzdGF0aWMgY29sdW1ucyBhcmUgb25seSBzdGF0aWMgd2l0aGluIGEgZ2l2ZW4gcGFydGl0aW9uLAotYW5kIGlmIGluIHRoZSBleGFtcGxlIGFib3ZlIGJvdGggcm93cyB3aGVyZSBmcm9tIGRpZmZlcmVudCBwYXJ0aXRpb25zCi0oaS5lLiBpZiB0aGV5IGhhZCBkaWZmZXJlbnQgdmFsdWUgZm9yIGBwa2ApLCB0aGVuIHRoZSAybmQgaW5zZXJ0aW9uCi13b3VsZCBub3QgaGF2ZSBtb2RpZmllZCB0aGUgdmFsdWUgb2YgYHNgIGZvciB0aGUgZmlyc3Qgcm93LgotCi1BIGZldyByZXN0cmljdGlvbnMgYXBwbGllcyB0byB3aGVuIHN0YXRpYyBjb2x1bW5zIGFyZSBhbGxvd2VkOgotCi0qIHRhYmxlcyB3aXRoIHRoZSBgQ09NUEFDVCBTVE9SQUdFYCBvcHRpb24gKHNlZSBiZWxvdykgY2Fubm90IGhhdmUgdGhlbQotKiBhIHRhYmxlIHdpdGhvdXQgY2x1c3RlcmluZyBjb2x1bW5zIGNhbm5vdCBoYXZlIHN0YXRpYyBjb2x1bW5zIChpbiBhCi10YWJsZSB3aXRob3V0IGNsdXN0ZXJpbmcgY29sdW1ucywgZXZlcnkgcGFydGl0aW9uIGhhcyBvbmx5IG9uZSByb3csIGFuZAotc28gZXZlcnkgY29sdW1uIGlzIGluaGVyZW50bHkgc3RhdGljKS4KLSogb25seSBub24gYFBSSU1BUlkgS0VZYCBjb2x1bW5zIGNhbiBiZSBzdGF0aWMKLQotW1tjcmVhdGVUYWJsZU9wdGlvbnNdXQotPT09PT0gYDxvcHRpb24+YAotCi1UaGUgYENSRUFURSBUQUJMRWAgc3RhdGVtZW50IHN1cHBvcnRzIGEgbnVtYmVyIG9mIG9wdGlvbnMgdGhhdCBjb250cm9scwotdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBuZXcgdGFibGUuIFRoZXNlIG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZCBhZnRlcgotdGhlIGBXSVRIYCBrZXl3b3JkLgotCi1UaGUgZmlyc3Qgb2YgdGhlc2Ugb3B0aW9uIGlzIGBDT01QQUNUIFNUT1JBR0VgLiBUaGlzIG9wdGlvbiBpcyBtYWlubHkKLXRhcmdldGVkIHRvd2FyZHMgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgZGVmaW5pdGlvbnMgY3JlYXRlZCBiZWZvcmUKLUNRTDMgKHNlZQotaHR0cDovL3d3dy5kYXRhc3RheC5jb20vZGV2L2Jsb2cvdGhyaWZ0LXRvLWNxbDNbd3d3LmRhdGFzdGF4LmNvbS9kZXYvYmxvZy90aHJpZnQtdG8tY3FsM10KLWZvciBtb3JlIGRldGFpbHMpLiBUaGUgb3B0aW9uIGFsc28gcHJvdmlkZXMgYSBzbGlnaHRseSBtb3JlIGNvbXBhY3QKLWxheW91dCBvZiBkYXRhIG9uIGRpc2sgYnV0IGF0IHRoZSBwcmljZSBvZiBkaW1pbmlzaGVkIGZsZXhpYmlsaXR5IGFuZAotZXh0ZW5zaWJpbGl0eSBmb3IgdGhlIHRhYmxlLiBNb3N0IG5vdGFibHksIGBDT01QQUNUIFNUT1JBR0VgIHRhYmxlcwotY2Fubm90IGhhdmUgY29sbGVjdGlvbnMgbm9yIHN0YXRpYyBjb2x1bW5zIGFuZCBhIGBDT01QQUNUIFNUT1JBR0VgIHRhYmxlCi13aXRoIGF0IGxlYXN0IG9uZSBjbHVzdGVyaW5nIGNvbHVtbiBzdXBwb3J0cyBleGFjdGx5IG9uZSAoYXMgaW4gbm90IDAKLW5vciBtb3JlIHRoYW4gMSkgY29sdW1uIG5vdCBwYXJ0IG9mIHRoZSBgUFJJTUFSWSBLRVlgIGRlZmluaXRpb24gKHdoaWNoCi1pbXBseSBpbiBwYXJ0aWN1bGFyIHRoYXQgeW91IGNhbm5vdCBhZGQgbm9yIHJlbW92ZSBjb2x1bW5zIGFmdGVyCi1jcmVhdGlvbikuIEZvciB0aG9zZSByZWFzb25zLCBgQ09NUEFDVCBTVE9SQUdFYCBpcyBub3QgcmVjb21tZW5kZWQKLW91dHNpZGUgb2YgdGhlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcmVhc29uIGV2b2tlZCBhYm92ZS4KLQotQW5vdGhlciBvcHRpb24gaXMgYENMVVNURVJJTkcgT1JERVJgLiBJdCBhbGxvd3MgdG8gZGVmaW5lIHRoZSBvcmRlcmluZwotb2Ygcm93cyBvbiBkaXNrLiBJdCB0YWtlcyB0aGUgbGlzdCBvZiB0aGUgY2x1c3RlcmluZyBjb2x1bW4gbmFtZXMgd2l0aCwKLWZvciBlYWNoIG9mIHRoZW0sIHRoZSBvbi1kaXNrIG9yZGVyIChBc2NlbmRpbmcgb3IgZGVzY2VuZGluZykuIE5vdGUgdGhhdAotdGhpcyBvcHRpb24gYWZmZWN0cyBsaW5rOiNzZWxlY3RPcmRlckJ5W3doYXQgYE9SREVSIEJZYCBhcmUgYWxsb3dlZAotZHVyaW5nIGBTRUxFQ1RgXS4KLQotVGFibGUgY3JlYXRpb24gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBvdGhlciBgPHByb3BlcnR5PmA6Ci0KLVtjb2xzPSIsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfG9wdGlvbiB8a2luZCB8ZGVmYXVsdCB8ZGVzY3JpcHRpb24KLXxgY29tbWVudGAgfF9zaW1wbGVfIHxub25lIHxBIGZyZWUtZm9ybSwgaHVtYW4tcmVhZGFibGUgY29tbWVudC4KLQotfGBnY19ncmFjZV9zZWNvbmRzYCB8X3NpbXBsZV8gfDg2NDAwMCB8VGltZSB0byB3YWl0IGJlZm9yZSBnYXJiYWdlCi1jb2xsZWN0aW5nIHRvbWJzdG9uZXMgKGRlbGV0aW9uIG1hcmtlcnMpLgotCi18YGJsb29tX2ZpbHRlcl9mcF9jaGFuY2VgIHxfc2ltcGxlXyB8MC4wMDA3NSB8VGhlIHRhcmdldCBwcm9iYWJpbGl0eSBvZgotZmFsc2UgcG9zaXRpdmUgb2YgdGhlIHNzdGFibGUgYmxvb20gZmlsdGVycy4gU2FpZCBibG9vbSBmaWx0ZXJzIHdpbGwgYmUKLXNpemVkIHRvIHByb3ZpZGUgdGhlIHByb3ZpZGVkIHByb2JhYmlsaXR5ICh0aHVzIGxvd2VyaW5nIHRoaXMgdmFsdWUKLWltcGFjdCB0aGUgc2l6ZSBvZiBibG9vbSBmaWx0ZXJzIGluLW1lbW9yeSBhbmQgb24tZGlzaykKLQotfGBkZWZhdWx0X3RpbWVfdG9fbGl2ZWAgfF9zaW1wbGVfIHwwIHxUaGUgZGVmYXVsdCBleHBpcmF0aW9uIHRpbWUKLShgYFRUTCcnKSBpbiBzZWNvbmRzIGZvciBhIHRhYmxlLgotCi18YGNvbXBhY3Rpb25gIHxfbWFwXyB8X3NlZSBiZWxvd18gfENvbXBhY3Rpb24gb3B0aW9ucywgc2VlCi1saW5rOiNjb21wYWN0aW9uT3B0aW9uc1tiZWxvd10uCi0KLXxgY29tcHJlc3Npb25gIHxfbWFwXyB8X3NlZSBiZWxvd18gfENvbXByZXNzaW9uIG9wdGlvbnMsIHNlZQotbGluazojY29tcHJlc3Npb25PcHRpb25zW2JlbG93XS4KLQotfGBjYWNoaW5nYCB8X21hcF8gfF9zZWUgYmVsb3dfIHxDYWNoaW5nIG9wdGlvbnMsIHNlZQotbGluazojY2FjaGluZ09wdGlvbnNbYmVsb3ddLgotfD09PQotCi1bW2NvbXBhY3Rpb25PcHRpb25zXV0KLT09PT09IENvbXBhY3Rpb24gb3B0aW9ucwotCi1UaGUgYGNvbXBhY3Rpb25gIHByb3BlcnR5IG11c3QgYXQgbGVhc3QgZGVmaW5lIHRoZSBgJ2NsYXNzJ2Agc3ViLW9wdGlvbiwKLXRoYXQgZGVmaW5lcyB0aGUgY29tcGFjdGlvbiBzdHJhdGVneSBjbGFzcyB0byB1c2UuIFRoZSBkZWZhdWx0IHN1cHBvcnRlZAotY2xhc3MgYXJlIGAnU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSdgLAotYCdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5J2AsIGAnRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSdgIGFuZAotYCdUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5J2AuIEN1c3RvbSBzdHJhdGVneSBjYW4gYmUgcHJvdmlkZWQgYnkKLXNwZWNpZnlpbmcgdGhlIGZ1bGwgY2xhc3MgbmFtZSBhcyBhIGxpbms6I2NvbnN0YW50c1tzdHJpbmcgY29uc3RhbnRdLgotVGhlIHJlc3Qgb2YgdGhlIHN1Yi1vcHRpb25zIGRlcGVuZHMgb24gdGhlIGNob3NlbiBjbGFzcy4gVGhlIHN1Yi1vcHRpb25zCi1zdXBwb3J0ZWQgYnkgdGhlIGRlZmF1bHQgY2xhc3NlcyBhcmU6Ci0KLVtjb2xzPSIsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfG9wdGlvbiB8c3VwcG9ydGVkIGNvbXBhY3Rpb24gc3RyYXRlZ3kgfGRlZmF1bHQgfGRlc2NyaXB0aW9uCi18YGVuYWJsZWRgIHxfYWxsXyB8dHJ1ZSB8QSBib29sZWFuIGRlbm90aW5nIHdoZXRoZXIgY29tcGFjdGlvbiBzaG91bGQgYmUKLWVuYWJsZWQgb3Igbm90LgotCi18YHRvbWJzdG9uZV90aHJlc2hvbGRgIHxfYWxsXyB8MC4yIHxBIHJhdGlvIHN1Y2ggdGhhdCBpZiBhIHNzdGFibGUgaGFzCi1tb3JlIHRoYW4gdGhpcyByYXRpbyBvZiBnY2FibGUgdG9tYnN0b25lcyBvdmVyIGFsbCBjb250YWluZWQgY29sdW1ucywKLXRoZSBzc3RhYmxlIHdpbGwgYmUgY29tcGFjdGVkICh3aXRoIG5vIG90aGVyIHNzdGFibGVzKSBmb3IgdGhlIHB1cnBvc2UKLW9mIHB1cmdpbmcgdGhvc2UgdG9tYnN0b25lcy4KLQotfGB0b21ic3RvbmVfY29tcGFjdGlvbl9pbnRlcnZhbGAgfF9hbGxfIHwxIGRheSB8VGhlIG1pbmltdW0gdGltZSB0byB3YWl0Ci1hZnRlciBhbiBzc3RhYmxlIGNyZWF0aW9uIHRpbWUgYmVmb3JlIGNvbnNpZGVyaW5nIGl0IGZvciBgYHRvbWJzdG9uZQotY29tcGFjdGlvbicnLCB3aGVyZSBgYHRvbWJzdG9uZSBjb21wYWN0aW9uJycgaXMgdGhlIGNvbXBhY3Rpb24gdHJpZ2dlcmVkCi1pZiB0aGUgc3N0YWJsZSBoYXMgbW9yZSBnY2FibGUgdG9tYnN0b25lcyB0aGFuIGB0b21ic3RvbmVfdGhyZXNob2xkYC4KLQotfGB1bmNoZWNrZWRfdG9tYnN0b25lX2NvbXBhY3Rpb25gIHxfYWxsXyB8ZmFsc2UgfFNldHRpbmcgdGhpcyB0byB0cnVlCi1lbmFibGVzIG1vcmUgYWdncmVzc2l2ZSB0b21ic3RvbmUgY29tcGFjdGlvbnMgLSBzaW5nbGUgc3N0YWJsZSB0b21ic3RvbmUKLWNvbXBhY3Rpb25zIHdpbGwgcnVuIHdpdGhvdXQgY2hlY2tpbmcgaG93IGxpa2VseSBpdCBpcyB0aGF0IHRoZXkgd2lsbCBiZQotc3VjY2Vzc2Z1bC4KLQotfGBtaW5fc3N0YWJsZV9zaXplYCB8U2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSB8NTBNQiB8VGhlIHNpemUgdGllcmVkCi1zdHJhdGVneSBncm91cHMgU1NUYWJsZXMgdG8gY29tcGFjdCBpbiBidWNrZXRzLiBBIGJ1Y2tldCBncm91cHMgU1NUYWJsZXMKLXRoYXQgZGlmZmVycyBmcm9tIGxlc3MgdGhhbiA1MCUgaW4gc2l6ZS4gSG93ZXZlciwgZm9yIHNtYWxsIHNpemVzLCB0aGlzCi13b3VsZCByZXN1bHQgaW4gYSBidWNrZXRpbmcgdGhhdCBpcyB0b28gZmluZSBncmFpbmVkLiBgbWluX3NzdGFibGVfc2l6ZWAKLWRlZmluZXMgYSBzaXplIHRocmVzaG9sZCAoaW4gYnl0ZXMpIGJlbG93IHdoaWNoIGFsbCBTU1RhYmxlcyBiZWxvbmcgdG8KLW9uZSB1bmlxdWUgYnVja2V0Ci0KLXxgbWluX3RocmVzaG9sZGAgfFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgfDQgfE1pbmltdW0gbnVtYmVyIG9mCi1TU1RhYmxlcyBuZWVkZWQgdG8gc3RhcnQgYSBtaW5vciBjb21wYWN0aW9uLgotCi18YG1heF90aHJlc2hvbGRgIHxTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5IHwzMiB8TWF4aW11bSBudW1iZXIgb2YKLVNTVGFibGVzIHByb2Nlc3NlZCBieSBvbmUgbWlub3IgY29tcGFjdGlvbi4KLQotfGBidWNrZXRfbG93YCB8U2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSB8MC41IHxTaXplIHRpZXJlZCBjb25zaWRlcgotc3N0YWJsZXMgdG8gYmUgd2l0aGluIHRoZSBzYW1lIGJ1Y2tldCBpZiB0aGVpciBzaXplIGlzIHdpdGhpbgotW2F2ZXJhZ2Vfc2l6ZSAqIGBidWNrZXRfbG93YCwgYXZlcmFnZV9zaXplICogYGJ1Y2tldF9oaWdoYCBdIChpLmUgdGhlCi1kZWZhdWx0IGdyb3VwcyBzc3RhYmxlIHdob3NlIHNpemVzIGRpdmVyZ2VzIGJ5IGF0IG1vc3QgNTAlKQotCi18YGJ1Y2tldF9oaWdoYCB8U2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSB8MS41IHxTaXplIHRpZXJlZCBjb25zaWRlcgotc3N0YWJsZXMgdG8gYmUgd2l0aGluIHRoZSBzYW1lIGJ1Y2tldCBpZiB0aGVpciBzaXplIGlzIHdpdGhpbgotW2F2ZXJhZ2Vfc2l6ZSAqIGBidWNrZXRfbG93YCwgYXZlcmFnZV9zaXplICogYGJ1Y2tldF9oaWdoYCBdIChpLmUgdGhlCi1kZWZhdWx0IGdyb3VwcyBzc3RhYmxlIHdob3NlIHNpemVzIGRpdmVyZ2VzIGJ5IGF0IG1vc3QgNTAlKS4KLQotfGBzc3RhYmxlX3NpemVfaW5fbWJgIHxMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5IHw1TUIgfFRoZSB0YXJnZXQgc2l6ZQotKGluIE1CKSBmb3Igc3N0YWJsZXMgaW4gdGhlIGxldmVsZWQgc3RyYXRlZ3kuIE5vdGUgdGhhdCB3aGlsZSBzc3RhYmxlCi1zaXplcyBzaG91bGQgc3RheSBsZXNzIG9yIGVxdWFsIHRvIGBzc3RhYmxlX3NpemVfaW5fbWJgLCBpdCBpcyBwb3NzaWJsZQotdG8gZXhjZXB0aW9uYWxseSBoYXZlIGEgbGFyZ2VyIHNzdGFibGUgYXMgZHVyaW5nIGNvbXBhY3Rpb24sIGRhdGEgZm9yIGEKLWdpdmVuIHBhcnRpdGlvbiBrZXkgYXJlIG5ldmVyIHNwbGl0IGludG8gMiBzc3RhYmxlcwotCi18YHRpbWVzdGFtcF9yZXNvbHV0aW9uYCB8RGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSB8TUlDUk9TRUNPTkRTIHxUaGUKLXRpbWVzdGFtcCByZXNvbHV0aW9uIHVzZWQgd2hlbiBpbnNlcnRpbmcgZGF0YSwgY291bGQgYmUgTUlMTElTRUNPTkRTLAotTUlDUk9TRUNPTkRTIGV0YyAoc2hvdWxkIGJlIHVuZGVyc3RhbmRhYmxlIGJ5IEphdmEgVGltZVVuaXQpIC0gZG9u4oCZdAotY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSBkbyBtdXRhdGlvbnMgd2l0aCBVU0lORyBUSU1FU1RBTVAgKG9yIGVxdWl2YWxlbnQKLWRpcmVjdGx5IGluIHRoZSBjbGllbnQpCi0KLXxgYmFzZV90aW1lX3NlY29uZHNgIHxEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5IHw2MCB8VGhlIGJhc2Ugc2l6ZSBvZgotdGhlIHRpbWUgd2luZG93cy4KLQotfGBtYXhfc3N0YWJsZV9hZ2VfZGF5c2AgfERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgfDM2NSB8U1NUYWJsZXMKLW9ubHkgY29udGFpbmluZyBkYXRhIHRoYXQgaXMgb2xkZXIgdGhhbiB0aGlzIHdpbGwgbmV2ZXIgYmUgY29tcGFjdGVkLgotCi18YHRpbWVzdGFtcF9yZXNvbHV0aW9uYCB8VGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSB8TUlDUk9TRUNPTkRTIHxUaGUKLXRpbWVzdGFtcCByZXNvbHV0aW9uIHVzZWQgd2hlbiBpbnNlcnRpbmcgZGF0YSwgY291bGQgYmUgTUlMTElTRUNPTkRTLAotTUlDUk9TRUNPTkRTIGV0YyAoc2hvdWxkIGJlIHVuZGVyc3RhbmRhYmxlIGJ5IEphdmEgVGltZVVuaXQpIC0gZG9u4oCZdAotY2hhbmdlIHRoaXMgdW5sZXNzIHlvdSBkbyBtdXRhdGlvbnMgd2l0aCBVU0lORyBUSU1FU1RBTVAgKG9yIGVxdWl2YWxlbnQKLWRpcmVjdGx5IGluIHRoZSBjbGllbnQpCi0KLXxgY29tcGFjdGlvbl93aW5kb3dfdW5pdGAgfFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kgfERBWVMgfFRoZSBKYXZhCi1UaW1lVW5pdCB1c2VkIGZvciB0aGUgd2luZG93IHNpemUsIHNldCBpbiBjb25qdW5jdGlvbiB3aXRoCi1gY29tcGFjdGlvbl93aW5kb3dfc2l6ZWAuIE11c3QgYmUgb25lIG9mIERBWVMsIEhPVVJTLCBNSU5VVEVTCi0KLXxgY29tcGFjdGlvbl93aW5kb3dfc2l6ZWAgfFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kgfDEgfFRoZSBudW1iZXIKLW9mIGBjb21wYWN0aW9uX3dpbmRvd191bml0YCB1bml0cyB0aGF0IG1ha2UgdXAgYSB0aW1lIHdpbmRvdy4KLQotfGB1bnNhZmVfYWdncmVzc2l2ZV9zc3RhYmxlX2V4cGlyYXRpb25gIHxUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5Ci18ZmFsc2UgfEV4cGlyZWQgc3N0YWJsZXMgd2lsbCBiZSBkcm9wcGVkIHdpdGhvdXQgY2hlY2tpbmcgaXRzIGRhdGEgaXMKLXNoYWRvd2luZyBvdGhlciBzc3RhYmxlcy4gVGhpcyBpcyBhIHBvdGVudGlhbGx5IHJpc2t5IG9wdGlvbiB0aGF0IGNhbgotbGVhZCB0byBkYXRhIGxvc3Mgb3IgZGVsZXRlZCBkYXRhIHJlLWFwcGVhcmluZywgZ29pbmcgYmV5b25kIHdoYXQKLWB1bmNoZWNrZWRfdG9tYnN0b25lX2NvbXBhY3Rpb25gIGRvZXMgZm9yIHNpbmdsZSBzc3RhYmxlIGNvbXBhY3Rpb24uIER1ZQotdG8gdGhlIHJpc2sgdGhlIGp2bSBtdXN0IGFsc28gYmUgc3RhcnRlZCB3aXRoCi1gLURjYXNzYW5kcmEudW5zYWZlX2FnZ3Jlc3NpdmVfc3N0YWJsZV9leHBpcmF0aW9uPXRydWVgLgotfD09PQotCi1bW2NvbXByZXNzaW9uT3B0aW9uc11dCi09PT09PSBDb21wcmVzc2lvbiBvcHRpb25zCi0KLUZvciB0aGUgYGNvbXByZXNzaW9uYCBwcm9wZXJ0eSwgdGhlIGZvbGxvd2luZyBzdWItb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgotCi1bY29scz0iLCwsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfG9wdGlvbiB8ZGVmYXVsdCB8ZGVzY3JpcHRpb24gfCB8IHwKLXxgY2xhc3NgIHxMWjRDb21wcmVzc29yIHxUaGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIHRvIHVzZS4gRGVmYXVsdAotY29tcHJlc3NvciBhcmU6IExaNENvbXByZXNzb3IsIFNuYXBweUNvbXByZXNzb3IgYW5kIERlZmxhdGVDb21wcmVzc29yLgotVXNlIGAnZW5hYmxlZCcgOiBmYWxzZWAgdG8gZGlzYWJsZSBjb21wcmVzc2lvbi4gQ3VzdG9tIGNvbXByZXNzb3IgY2FuIGJlCi1wcm92aWRlZCBieSBzcGVjaWZ5aW5nIHRoZSBmdWxsIGNsYXNzIG5hbWUgYXMgYSBsaW5rOiNjb25zdGFudHNbc3RyaW5nCi1jb25zdGFudF0uIHwgfCB8Ci0KLXxgZW5hYmxlZGAgfHRydWUgfEJ5IGRlZmF1bHQgY29tcHJlc3Npb24gaXMgZW5hYmxlZC4gVG8gZGlzYWJsZSBpdCwgc2V0Ci1gZW5hYmxlZGAgdG8gYGZhbHNlYCB8YGNodW5rX2xlbmd0aF9pbl9rYmAgfDY0S0IgfE9uIGRpc2sgU1NUYWJsZXMgYXJlCi1jb21wcmVzc2VkIGJ5IGJsb2NrICh0byBhbGxvdyByYW5kb20gcmVhZHMpLiBUaGlzIGRlZmluZXMgdGhlIHNpemUgKGluCi1LQikgb2Ygc2FpZCBibG9jay4gQmlnZ2VyIHZhbHVlcyBtYXkgaW1wcm92ZSB0aGUgY29tcHJlc3Npb24gcmF0ZSwgYnV0Ci1pbmNyZWFzZXMgdGhlIG1pbmltdW0gc2l6ZSBvZiBkYXRhIHRvIGJlIHJlYWQgZnJvbSBkaXNrIGZvciBhIHJlYWQKLQotfGBjcmNfY2hlY2tfY2hhbmNlYCB8MS4wIHxXaGVuIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQsIGVhY2ggY29tcHJlc3NlZAotYmxvY2sgaW5jbHVkZXMgYSBjaGVja3N1bSBvZiB0aGF0IGJsb2NrIGZvciB0aGUgcHVycG9zZSBvZiBkZXRlY3RpbmcKLWRpc2sgYml0cm90IGFuZCBhdm9pZGluZyB0aGUgcHJvcGFnYXRpb24gb2YgY29ycnVwdGlvbiB0byBvdGhlciByZXBsaWNhLgotVGhpcyBvcHRpb24gZGVmaW5lcyB0aGUgcHJvYmFiaWxpdHkgd2l0aCB3aGljaCB0aG9zZSBjaGVja3N1bXMgYXJlCi1jaGVja2VkIGR1cmluZyByZWFkLiBCeSBkZWZhdWx0IHRoZXkgYXJlIGFsd2F5cyBjaGVja2VkLiBTZXQgdG8gMCB0bwotZGlzYWJsZSBjaGVja3N1bSBjaGVja2luZyBhbmQgdG8gMC41IGZvciBpbnN0YW5jZSB0byBjaGVjayB0aGVtIGV2ZXJ5Ci1vdGhlciByZWFkIHwgfCB8Ci18PT09Ci0KLVtbY2FjaGluZ09wdGlvbnNdXQotPT09PT0gQ2FjaGluZyBvcHRpb25zCi0KLUZvciB0aGUgYGNhY2hpbmdgIHByb3BlcnR5LCB0aGUgZm9sbG93aW5nIHN1Yi1vcHRpb25zIGFyZSBhdmFpbGFibGU6Ci0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18b3B0aW9uIHxkZWZhdWx0IHxkZXNjcmlwdGlvbgotfGBrZXlzYCB8QUxMIHxXaGV0aGVyIHRvIGNhY2hlIGtleXMgKGBga2V5IGNhY2hlJycpIGZvciB0aGlzIHRhYmxlLgotVmFsaWQgdmFsdWVzIGFyZTogYEFMTGAgYW5kIGBOT05FYC4KLQotfGByb3dzX3Blcl9wYXJ0aXRpb25gIHxOT05FIHxUaGUgYW1vdW50IG9mIHJvd3MgdG8gY2FjaGUgcGVyIHBhcnRpdGlvbgotKGBgcm93IGNhY2hlJycpLiBJZiBhbiBpbnRlZ2VyIGBuYCBpcyBzcGVjaWZpZWQsIHRoZSBmaXJzdCBgbmAgcXVlcmllZAotcm93cyBvZiBhIHBhcnRpdGlvbiB3aWxsIGJlIGNhY2hlZC4gT3RoZXIgcG9zc2libGUgb3B0aW9ucyBhcmUgYEFMTGAsIHRvCi1jYWNoZSBhbGwgcm93cyBvZiBhIHF1ZXJpZWQgcGFydGl0aW9uLCBvciBgTk9ORWAgdG8gZGlzYWJsZSByb3cgY2FjaGluZy4KLXw9PT0KLQotPT09PT0gT3RoZXIgY29uc2lkZXJhdGlvbnM6Ci0KLSogV2hlbiBsaW5rOiNpbnNlcnRTdG10W2luc2VydGluZ10gLyBsaW5rOiN1cGRhdGVTdG10W3VwZGF0aW5nXSBhIGdpdmVuCi1yb3csIG5vdCBhbGwgY29sdW1ucyBuZWVkcyB0byBiZSBkZWZpbmVkIChleGNlcHQgZm9yIHRob3NlIHBhcnQgb2YgdGhlCi1rZXkpLCBhbmQgbWlzc2luZyBjb2x1bW5zIG9jY3VweSBubyBzcGFjZSBvbiBkaXNrLiBGdXJ0aGVybW9yZSwgYWRkaW5nCi1uZXcgY29sdW1ucyAoc2VlIGBBTFRFUiBUQUJMRWApIGlzIGEgY29uc3RhbnQgdGltZSBvcGVyYXRpb24uIFRoZXJlIGlzCi10aHVzIG5vIG5lZWQgdG8gdHJ5IHRvIGFudGljaXBhdGUgZnV0dXJlIHVzYWdlIChvciB0byBjcnkgd2hlbiB5b3UKLWhhdmVu4oCZdCkgd2hlbiBjcmVhdGluZyBhIHRhYmxlLgotCi1bW2FsdGVyVGFibGVTdG10XV0KLT09PT0gQUxURVIgVEFCTEUKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gQUxURVIgKFRBQkxFIHwgQ09MVU1ORkFNSUxZKSAoSUYgRVhJU1RTKT8KLQotOjo9IEFERCAoSUYgTk9UIEVYSVNUUyk/ICsKLXwgQUREICAoSUYgTk9UIEVYSVNUUyk/ICggKCAsICkqICkgKwotfCBEUk9QIChJRiBFWElTVFMpPyAgKwotfCBEUk9QIChJRiBFWElTVFMpPyAoICggLCApKiApICsKLXwgUkVOQU1FIChJRiBFWElTVFMpPyBUTyAoQU5EIFRPKSogKwotfCBXSVRIICggQU5EICkqICsKLXAuICsKLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLi4gKwotQUxURVIgVEFCTEUgYWRkYW1zRmFtaWx5Ci0KLUFMVEVSIFRBQkxFIGFkZGFtc0ZhbWlseSArCi1BREQgZ3JhdmVzaXRlIHZhcmNoYXI7Ci0KLUFMVEVSIFRBQkxFIGFkZGFtc0ZhbWlseSArCi1XSVRIIGNvbW1lbnQgPSBgQSBtb3N0IGV4Y2VsbGVudCBhbmQgdXNlZnVsIGNvbHVtbiBmYW1pbHknOyArCi1wLiArCi1UaGUgYEFMVEVSYCBzdGF0ZW1lbnQgaXMgdXNlZCB0byBtYW5pcHVsYXRlIHRhYmxlIGRlZmluaXRpb25zLiBJdCBhbGxvd3MKLWZvciBhZGRpbmcgbmV3IGNvbHVtbnMsIGRyb3BwaW5nIGV4aXN0aW5nIG9uZXMsIG9yIHVwZGF0aW5nIHRoZSB0YWJsZQotb3B0aW9ucy4gQXMgd2l0aCB0YWJsZSBjcmVhdGlvbiwgYEFMVEVSIENPTFVNTkZBTUlMWWAgaXMgYWxsb3dlZCBhcyBhbgotYWxpYXMgZm9yIGBBTFRFUiBUQUJMRWAuCi1JZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotCi1UaGUgYDx0YWJsZW5hbWU+YCBpcyB0aGUgdGFibGUgbmFtZSBvcHRpb25hbGx5IHByZWNlZGVkIGJ5IHRoZSBrZXlzcGFjZQotbmFtZS4gVGhlIGA8aW5zdHJ1Y3Rpb24+YCBkZWZpbmVzIHRoZSBhbHRlcmF0aW9uIHRvIHBlcmZvcm06Ci0KLSogYEFERGA6IEFkZHMgYSBuZXcgY29sdW1uIHRvIHRoZSB0YWJsZS4gVGhlIGA8aWRlbnRpZmllcj5gIGZvciB0aGUgbmV3Ci1jb2x1bW4gbXVzdCBub3QgY29uZmxpY3Qgd2l0aCBhbiBleGlzdGluZyBjb2x1bW4uIE1vcmVvdmVyLCBjb2x1bW5zCi1jYW5ub3QgYmUgYWRkZWQgdG8gdGFibGVzIGRlZmluZWQgd2l0aCB0aGUgYENPTVBBQ1QgU1RPUkFHRWAgb3B0aW9uLgotSWYgdGhlIG5ldyBjb2x1bW4gYWxyZWFkeSBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgTk9UIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KLSogYERST1BgOiBSZW1vdmVzIGEgY29sdW1uIGZyb20gdGhlIHRhYmxlLiBEcm9wcGVkIGNvbHVtbnMgd2lsbAotaW1tZWRpYXRlbHkgYmVjb21lIHVuYXZhaWxhYmxlIGluIHRoZSBxdWVyaWVzIGFuZCB3aWxsIG5vdCBiZSBpbmNsdWRlZAotaW4gY29tcGFjdGVkIHNzdGFibGVzIGluIHRoZSBmdXR1cmUuIElmIGEgY29sdW1uIGlzIHJlYWRkZWQsIHF1ZXJpZXMKLXdvbuKAmXQgcmV0dXJuIHZhbHVlcyB3cml0dGVuIGJlZm9yZSB0aGUgY29sdW1uIHdhcyBsYXN0IGRyb3BwZWQuIEl0IGlzCi1hc3N1bWVkIHRoYXQgdGltZXN0YW1wcyByZXByZXNlbnQgYWN0dWFsIHRpbWUsIHNvIGlmIHRoaXMgaXMgbm90IHlvdXIKLWNhc2UsIHlvdSBzaG91bGQgTk9UIHJlYWQgcHJldmlvdXNseSBkcm9wcGVkIGNvbHVtbnMuIENvbHVtbnMgY2Fu4oCZdCBiZQotZHJvcHBlZCBmcm9tIHRhYmxlcyBkZWZpbmVkIHdpdGggdGhlIGBDT01QQUNUIFNUT1JBR0VgIG9wdGlvbi4KLUlmIHRoZSBkcm9wcGVkIGNvbHVtbiBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KLSogYFJFTkFNRWAgYSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgYSB0YWJsZS4gTm9uIHByaW1hcnkga2V5IGNvbHVtbnMgY2Fubm90IGJlIHJlbmFtZWQuCi1GdXJ0aGVybW9yZSwgcmVuYW1pbmcgYSBjb2x1bW4gdG8gYW5vdGhlciBuYW1lIHdoaWNoIGFscmVhZHkgZXhpc3RzIGlzbid0IGFsbG93ZWQuCi1JdCdzIGltcG9ydGFudCB0byBrZWVwIGluIG1pbmQgdGhhdCByZW5hbWVkIGNvbHVtbnMgc2hvdWxkbid0IGhhdmUgZGVwZW5kZW50IHNlY29uZGF5IGluZGV4ZXMuCi1JZiB0aGUgcmVuYW1lZCBjb2x1bW4gZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0KLSogYFdJVEhgOiBBbGxvd3MgdG8gdXBkYXRlIHRoZSBvcHRpb25zIG9mIHRoZSB0YWJsZS4gVGhlCi1saW5rOiNjcmVhdGVUYWJsZU9wdGlvbnNbc3VwcG9ydGVkIGA8b3B0aW9uPmBdIChhbmQgc3ludGF4KSBhcmUgdGhlIHNhbWUKLWFzIGZvciB0aGUgYENSRUFURSBUQUJMRWAgc3RhdGVtZW50IGV4Y2VwdCB0aGF0IGBDT01QQUNUIFNUT1JBR0VgIGlzIG5vdAotc3VwcG9ydGVkLiBOb3RlIHRoYXQgc2V0dGluZyBhbnkgYGNvbXBhY3Rpb25gIHN1Yi1vcHRpb25zIGhhcyB0aGUgZWZmZWN0Ci1vZiBlcmFzaW5nIGFsbCBwcmV2aW91cyBgY29tcGFjdGlvbmAgb3B0aW9ucywgc28geW91IG5lZWQgdG8gcmUtc3BlY2lmeQotYWxsIHRoZSBzdWItb3B0aW9ucyBpZiB5b3Ugd2FudCB0byBrZWVwIHRoZW0uIFRoZSBzYW1lIG5vdGUgYXBwbGllcyB0bwotdGhlIHNldCBvZiBgY29tcHJlc3Npb25gIHN1Yi1vcHRpb25zLgotCi09PT09PSBDUUwgdHlwZSBjb21wYXRpYmlsaXR5OgotCi1DUUwgZGF0YSB0eXBlcyBtYXkgYmUgY29udmVydGVkIG9ubHkgYXMgdGhlIGZvbGxvd2luZyB0YWJsZS4KLQotW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfERhdGEgdHlwZSBtYXkgYmUgYWx0ZXJlZCB0bzogfERhdGEgdHlwZQotfHRpbWVzdGFtcCB8YmlnaW50Ci0KLXxhc2NpaSwgYmlnaW50LCBib29sZWFuLCBkYXRlLCBkZWNpbWFsLCBkb3VibGUsIGZsb2F0LCBpbmV0LCBpbnQsCi1zbWFsbGludCwgdGV4dCwgdGltZSwgdGltZXN0YW1wLCB0aW1ldXVpZCwgdGlueWludCwgdXVpZCwgdmFyY2hhciwKLXZhcmludCB8YmxvYgotCi18aW50IHxkYXRlCi0KLXxhc2NpaSwgdmFyY2hhciB8dGV4dAotCi18YmlnaW50IHx0aW1lCi0KLXxiaWdpbnQgfHRpbWVzdGFtcAotCi18dGltZXV1aWQgfHV1aWQKLQotfGFzY2lpLCB0ZXh0IHx2YXJjaGFyCi0KLXxiaWdpbnQsIGludCwgdGltZXN0YW1wIHx2YXJpbnQKLXw9PT0KLQotQ2x1c3RlcmluZyBjb2x1bW5zIGhhdmUgc3RyaWN0ZXIgcmVxdWlyZW1lbnRzLCBvbmx5IHRoZSBiZWxvdwotY29udmVyc2lvbnMgYXJlIGFsbG93ZWQuCi0KLVtjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxEYXRhIHR5cGUgbWF5IGJlIGFsdGVyZWQgdG86IHxEYXRhIHR5cGUKLXxhc2NpaSwgdGV4dCwgdmFyY2hhciB8YmxvYgotfGFzY2lpLCB2YXJjaGFyIHx0ZXh0Ci18YXNjaWksIHRleHQgfHZhcmNoYXIKLXw9PT0KLQotW1tkcm9wVGFibGVTdG10XV0KLT09PT0gRFJPUCBUQUJMRQotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4gOjo9IERST1AgVEFCTEUgKCBJRiBFWElTVFMgKT8KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuIERST1AgVEFCTEUgd29ybGRTZXJpZXNBdHRlbmRlZXM7Ci0KLVRoZSBgRFJPUCBUQUJMRWAgc3RhdGVtZW50IHJlc3VsdHMgaW4gdGhlIGltbWVkaWF0ZSwgaXJyZXZlcnNpYmxlCi1yZW1vdmFsIG9mIGEgdGFibGUsIGluY2x1ZGluZyBhbGwgZGF0YSBjb250YWluZWQgaW4gaXQuIEFzIGZvciB0YWJsZQotY3JlYXRpb24sIGBEUk9QIENPTFVNTkZBTUlMWWAgaXMgYWxsb3dlZCBhcyBhbiBhbGlhcyBmb3IgYERST1AgVEFCTEVgLgotCi1JZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcwotYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KLQotW1t0cnVuY2F0ZVN0bXRdXQotPT09PSBUUlVOQ0FURQotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4gOjo9IFRSVU5DQVRFICggVEFCTEUgfCBDT0xVTU5GQU1JTFkgKT8KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuIFRSVU5DQVRFIHN1cGVySW1wb3J0YW50RGF0YTsKLQotVGhlIGBUUlVOQ0FURWAgc3RhdGVtZW50IHBlcm1hbmVudGx5IHJlbW92ZXMgYWxsIGRhdGEgZnJvbSBhIHRhYmxlLgotCi1bW2NyZWF0ZUluZGV4U3RtdF1dCi09PT09IENSRUFURSBJTkRFWAotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBDUkVBVEUgKCBDVVNUT00gKT8gSU5ERVggKCBJRiBOT1QgRVhJU1RTICk/ICggKT8gKwotT04gYCgnIGApJyArCi0oIFVTSU5HICggV0lUSCBPUFRJT05TID0gKT8gKT8KLQotOjo9ICArCi18IGtleXMoICkgKwotcC4gKwotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLUNSRUFURSBJTkRFWCB1c2VySW5kZXggT04gTmVyZE1vdmllcyAodXNlcik7ICsKLUNSRUFURSBJTkRFWCBPTiBNdXRhbnRzIChhYmlsaXR5SWQpOyArCi1DUkVBVEUgSU5ERVggT04gdXNlcnMgKGtleXMoZmF2cykpOyArCi1DUkVBVEUgQ1VTVE9NIElOREVYIE9OIHVzZXJzIChlbWFpbCkgVVNJTkcgYHBhdGgudG8udGhlLkluZGV4Q2xhc3MnOyArCi1DUkVBVEUgQ1VTVE9NIElOREVYIE9OIHVzZXJzIChlbWFpbCkgVVNJTkcgYHBhdGgudG8udGhlLkluZGV4Q2xhc3MnIFdJVEgKLU9QVElPTlMgPSBce+KAmXN0b3JhZ2XigJk6IGAvbW50L3NzZC9pbmRleGVzLyd9OwotCi1UaGUgYENSRUFURSBJTkRFWGAgc3RhdGVtZW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IChhdXRvbWF0aWMpCi1zZWNvbmRhcnkgaW5kZXggZm9yIGEgZ2l2ZW4gKGV4aXN0aW5nKSBjb2x1bW4gaW4gYSBnaXZlbiB0YWJsZS4gQSBuYW1lCi1mb3IgdGhlIGluZGV4IGl0c2VsZiBjYW4gYmUgc3BlY2lmaWVkIGJlZm9yZSB0aGUgYE9OYCBrZXl3b3JkLCBpZgotZGVzaXJlZC4gSWYgZGF0YSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIGNvbHVtbiwgaXQgd2lsbCBiZSBpbmRleGVkCi1hc3luY2hyb25vdXNseS4gQWZ0ZXIgdGhlIGluZGV4IGlzIGNyZWF0ZWQsIG5ldyBkYXRhIGZvciB0aGUgY29sdW1uIGlzCi1pbmRleGVkIGF1dG9tYXRpY2FsbHkgYXQgaW5zZXJ0aW9uIHRpbWUuCi0KLUF0dGVtcHRpbmcgdG8gY3JlYXRlIGFuIGFscmVhZHkgZXhpc3RpbmcgaW5kZXggd2lsbCByZXR1cm4gYW4gZXJyb3IKLXVubGVzcyB0aGUgYElGIE5PVCBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiBpdCBpcyB1c2VkLCB0aGUgc3RhdGVtZW50Ci13aWxsIGJlIGEgbm8tb3AgaWYgdGhlIGluZGV4IGFscmVhZHkgZXhpc3RzLgotCi1bW2tleXNJbmRleF1dCi09PT09PSBJbmRleGVzIG9uIE1hcCBLZXlzCi0KLVdoZW4gY3JlYXRpbmcgYW4gaW5kZXggb24gYSBsaW5rOiNtYXBbbWFwIGNvbHVtbl0sIHlvdSBtYXkgaW5kZXggZWl0aGVyCi10aGUga2V5cyBvciB0aGUgdmFsdWVzLiBJZiB0aGUgY29sdW1uIGlkZW50aWZpZXIgaXMgcGxhY2VkIHdpdGhpbiB0aGUKLWBrZXlzKClgIGZ1bmN0aW9uLCB0aGUgaW5kZXggd2lsbCBiZSBvbiB0aGUgbWFwIGtleXMsIGFsbG93aW5nIHlvdSB0bwotdXNlIGBDT05UQUlOUyBLRVlgIGluIGBXSEVSRWAgY2xhdXNlcy4gT3RoZXJ3aXNlLCB0aGUgaW5kZXggd2lsbCBiZSBvbgotdGhlIG1hcCB2YWx1ZXMuCi0KLVtbZHJvcEluZGV4U3RtdF1dCi09PT09IERST1AgSU5ERVgKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuIDo6PSBEUk9QIElOREVYICggSUYgRVhJU1RTICk/ICggYC4nICk/Ci0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLi4gKwotRFJPUCBJTkRFWCB1c2VySW5kZXg7Ci0KLURST1AgSU5ERVggdXNlcmtleXNwYWNlLmFkZHJlc3NfaW5kZXg7ICsKLXAuICsKLVRoZSBgRFJPUCBJTkRFWGAgc3RhdGVtZW50IGlzIHVzZWQgdG8gZHJvcCBhbiBleGlzdGluZyBzZWNvbmRhcnkgaW5kZXguCi1UaGUgYXJndW1lbnQgb2YgdGhlIHN0YXRlbWVudCBpcyB0aGUgaW5kZXggbmFtZSwgd2hpY2ggbWF5IG9wdGlvbmFsbHkKLXNwZWNpZnkgdGhlIGtleXNwYWNlIG9mIHRoZSBpbmRleC4KLQotSWYgdGhlIGluZGV4IGRvZXMgbm90IGV4aXN0cywgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzCi1gSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotCi1bW2NyZWF0ZU1WU3RtdF1dCi09PT09IENSRUFURSBNQVRFUklBTElaRUQgVklFVwotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgKCBJRiBOT1QgRVhJU1RTICk/IEFTICsKLVNFTEVDVCAoIGAoJyAoIGAsJyApICogYCknIHwgYConICkgKwotRlJPTSAgKwotKCBXSEVSRSApPyArCi1QUklNQVJZIEtFWSBgKCcgKCBgLCcgKSogYCknICsKLSggV0lUSCAoIEFORCApKiApPyArCi1wLiArCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4uICsKLUNSRUFURSBNQVRFUklBTElaRUQgVklFVyBtb25rZXlTcGVjaWVzX2J5X3BvcHVsYXRpb24gQVMgKwotU0VMRUNUICogKwotRlJPTSBtb25rZXlTcGVjaWVzICsKLVdIRVJFIHBvcHVsYXRpb24gSVMgTk9UIE5VTEwgQU5EIHNwZWNpZXMgSVMgTk9UIE5VTEwgKwotUFJJTUFSWSBLRVkgKHBvcHVsYXRpb24sIHNwZWNpZXMpICsKLVdJVEggY29tbWVudD1gQWxsb3cgcXVlcnkgYnkgcG9wdWxhdGlvbiBpbnN0ZWFkIG9mIHNwZWNpZXMnOyArCi1wLiArCi1UaGUgYENSRUFURSBNQVRFUklBTElaRUQgVklFV2Agc3RhdGVtZW50IGNyZWF0ZXMgYSBuZXcgbWF0ZXJpYWxpemVkCi12aWV3LiBFYWNoIHN1Y2ggdmlldyBpcyBhIHNldCBvZiBfcm93c18gd2hpY2ggY29ycmVzcG9uZHMgdG8gcm93cyB3aGljaAotYXJlIHByZXNlbnQgaW4gdGhlIHVuZGVybHlpbmcsIG9yIGJhc2UsIHRhYmxlIHNwZWNpZmllZCBpbiB0aGUgYFNFTEVDVGAKLXN0YXRlbWVudC4gQSBtYXRlcmlhbGl6ZWQgdmlldyBjYW5ub3QgYmUgZGlyZWN0bHkgdXBkYXRlZCwgYnV0IHVwZGF0ZXMKLXRvIHRoZSBiYXNlIHRhYmxlIHdpbGwgY2F1c2UgY29ycmVzcG9uZGluZyB1cGRhdGVzIGluIHRoZSB2aWV3LgotCi1BdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBhbHJlYWR5IGV4aXN0aW5nIG1hdGVyaWFsaXplZCB2aWV3IHdpbGwgcmV0dXJuCi1hbiBlcnJvciB1bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgaXQgaXMgdXNlZCwgdGhlCi1zdGF0ZW1lbnQgd2lsbCBiZSBhIG5vLW9wIGlmIHRoZSBtYXRlcmlhbGl6ZWQgdmlldyBhbHJlYWR5IGV4aXN0cy4KLQotW1tjcmVhdGVNVldoZXJlXV0KLT09PT09IGBXSEVSRWAgQ2xhdXNlCi0KLVRoZSBgPHdoZXJlLWNsYXVzZT5gIGlzIHNpbWlsYXIgdG8gdGhlIGxpbms6I3NlbGVjdFdoZXJlW3doZXJlIGNsYXVzZSBvZgotYSBgU0VMRUNUYCBzdGF0ZW1lbnRdLCB3aXRoIGEgZmV3IGRpZmZlcmVuY2VzLiBGaXJzdCwgdGhlIHdoZXJlIGNsYXVzZQotbXVzdCBjb250YWluIGFuIGV4cHJlc3Npb24gdGhhdCBkaXNhbGxvd3MgYE5VTExgIHZhbHVlcyBpbiBjb2x1bW5zIGluCi10aGUgdmlld+KAmXMgcHJpbWFyeSBrZXkuIElmIG5vIG90aGVyIHJlc3RyaWN0aW9uIGlzIGRlc2lyZWQsIHRoaXMgY2FuIGJlCi1hY2NvbXBsaXNoZWQgd2l0aCBhbiBgSVMgTk9UIE5VTExgIGV4cHJlc3Npb24uIFNlY29uZCwgb25seSBjb2x1bW5zCi13aGljaCBhcmUgaW4gdGhlIGJhc2UgdGFibGXigJlzIHByaW1hcnkga2V5IG1heSBiZSByZXN0cmljdGVkIHdpdGgKLWV4cHJlc3Npb25zIG90aGVyIHRoYW4gYElTIE5PVCBOVUxMYC4gKE5vdGUgdGhhdCB0aGlzIHNlY29uZCByZXN0cmljdGlvbgotbWF5IGJlIGxpZnRlZCBpbiB0aGUgZnV0dXJlLikKLQotW1thbHRlck1WU3RtdF1dCi09PT09IEFMVEVSIE1BVEVSSUFMSVpFRCBWSUVXCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLiA6Oj0gQUxURVIgTUFURVJJQUxJWkVEIFZJRVcgICsKLVdJVEggKCBBTkQgKSoKLQotVGhlIGBBTFRFUiBNQVRFUklBTElaRUQgVklFV2Agc3RhdGVtZW50IGFsbG93cyBvcHRpb25zIHRvIGJlIHVwZGF0ZTsKLXRoZXNlIG9wdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGBDUkVBVEUgVEFCTEVg4oCZcyBvcHRpb25zLgotCi1bW2Ryb3BNVlN0bXRdXQotPT09PSBEUk9QIE1BVEVSSUFMSVpFRCBWSUVXCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLiA6Oj0gRFJPUCBNQVRFUklBTElaRUQgVklFVyAoIElGIEVYSVNUUyApPwotCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gRFJPUCBNQVRFUklBTElaRUQgVklFVyBtb25rZXlTcGVjaWVzX2J5X3BvcHVsYXRpb247Ci0KLVRoZSBgRFJPUCBNQVRFUklBTElaRUQgVklFV2Agc3RhdGVtZW50IGlzIHVzZWQgdG8gZHJvcCBhbiBleGlzdGluZwotbWF0ZXJpYWxpemVkIHZpZXcuCi0KLUlmIHRoZSBtYXRlcmlhbGl6ZWQgdmlldyBkb2VzIG5vdCBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4KLWVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYQotbm8tb3AuCi0KLVtbY3JlYXRlVHlwZVN0bXRdXQotPT09PSBDUkVBVEUgVFlQRQotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBDUkVBVEUgVFlQRSAoIElGIE5PVCBFWElTVFMgKT8gICsKLWAoJyAoIGAsJyApKiBgKScKLQotOjo9ICggYC4nICk/Ci0KLTo6PQotCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4uICsKLUNSRUFURSBUWVBFIGFkZHJlc3MgKCArCi1zdHJlZXRfbmFtZSB0ZXh0LCArCi1zdHJlZXRfbnVtYmVyIGludCwgKwotY2l0eSB0ZXh0LCArCi1zdGF0ZSB0ZXh0LCArCi16aXAgaW50ICsKLSkKLQotQ1JFQVRFIFRZUEUgd29ya19hbmRfaG9tZV9hZGRyZXNzZXMgKCArCi1ob21lX2FkZHJlc3MgYWRkcmVzcywgKwotd29ya19hZGRyZXNzIGFkZHJlc3MgKwotKSArCi1wLiArCi1UaGUgYENSRUFURSBUWVBFYCBzdGF0ZW1lbnQgY3JlYXRlcyBhIG5ldyB1c2VyLWRlZmluZWQgdHlwZS4gRWFjaCB0eXBlCi1pcyBhIHNldCBvZiBuYW1lZCwgdHlwZWQgZmllbGRzLiBGaWVsZCB0eXBlcyBtYXkgYmUgYW55IHZhbGlkIHR5cGUsCi1pbmNsdWRpbmcgY29sbGVjdGlvbnMgYW5kIG90aGVyIGV4aXN0aW5nIHVzZXItZGVmaW5lZCB0eXBlcy4KLQotQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gYWxyZWFkeSBleGlzdGluZyB0eXBlIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yCi11bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgaXQgaXMgdXNlZCwgdGhlIHN0YXRlbWVudAotd2lsbCBiZSBhIG5vLW9wIGlmIHRoZSB0eXBlIGFscmVhZHkgZXhpc3RzLgotCi1bW2NyZWF0ZVR5cGVOYW1lXV0KLT09PT09IGA8dHlwZW5hbWU+YAotCi1WYWxpZCB0eXBlIG5hbWVzIGFyZSBpZGVudGlmaWVycy4gVGhlIG5hbWVzIG9mIGV4aXN0aW5nIENRTCB0eXBlcyBhbmQKLWxpbms6I2FwcGVuZGl4QltyZXNlcnZlZCB0eXBlIG5hbWVzXSBtYXkgbm90IGJlIHVzZWQuCi0KLUlmIHRoZSB0eXBlIG5hbWUgaXMgcHJvdmlkZWQgYWxvbmUsIHRoZSB0eXBlIGlzIGNyZWF0ZWQgd2l0aCB0aGUgY3VycmVudAota2V5c3BhY2UgKHNlZSBgVVNFYCkuIElmIGl0IGlzIHByZWZpeGVkIGJ5IGFuIGV4aXN0aW5nIGtleXNwYWNlIG5hbWUsCi10aGUgdHlwZSBpcyBjcmVhdGVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGtleXNwYWNlIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQKLWtleXNwYWNlLgotCi1bW2FsdGVyVHlwZVN0bXRdXQotPT09PSBBTFRFUiBUWVBFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IEFMVEVSIFRZUEUgKElGIEVYSVNUUyk/Ci0KLTo6PSBBREQgKElGIE5PVCBFWElTVFMpPyAgKwotfCBSRU5BTUUgKElGIEVYSVNUUyk/IFRPICggQU5EIFRPICkqICsKLXAuICsKLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLi4gKwotQUxURVIgVFlQRSBhZGRyZXNzIEFERCBjb3VudHJ5IHRleHQKLQotQUxURVIgVFlQRSBhZGRyZXNzIFJFTkFNRSB6aXAgVE8gemlwY29kZSBBTkQgc3RyZWV0X25hbWUgVE8gc3RyZWV0ICsKLXAuICsKLVRoZSBgQUxURVIgVFlQRWAgc3RhdGVtZW50IGlzIHVzZWQgdG8gbWFuaXB1bGF0ZSB0eXBlIGRlZmluaXRpb25zLiBJdAotYWxsb3dzIGZvciBhZGRpbmcgbmV3IGZpZWxkcywgcmVuYW1pbmcgZXhpc3RpbmcgZmllbGRzLCBvciBjaGFuZ2luZyB0aGUKLXR5cGUgb2YgZXhpc3RpbmcgZmllbGRzLiBJZiB0aGUgdHlwZSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0KLVtbZHJvcFR5cGVTdG10XV0KLT09PT0gRFJPUCBUWVBFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IERST1AgVFlQRSAoIElGIEVYSVNUUyApPyAgKwotcC4gKwotVGhlIGBEUk9QIFRZUEVgIHN0YXRlbWVudCByZXN1bHRzIGluIHRoZSBpbW1lZGlhdGUsIGlycmV2ZXJzaWJsZSByZW1vdmFsCi1vZiBhIHR5cGUuIEF0dGVtcHRpbmcgdG8gZHJvcCBhIHR5cGUgdGhhdCBpcyBzdGlsbCBpbiB1c2UgYnkgYW5vdGhlcgotdHlwZSBvciBhIHRhYmxlIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLgotCi1JZiB0aGUgdHlwZSBkb2VzIG5vdCBleGlzdCwgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCB1bmxlc3MgYElGIEVYSVNUU2AKLWlzIHVzZWQsIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotCi1bW2NyZWF0ZVRyaWdnZXJTdG10XV0KLT09PT0gQ1JFQVRFIFRSSUdHRVIKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gQ1JFQVRFIFRSSUdHRVIgKCBJRiBOT1QgRVhJU1RTICk/ICggKT8gKwotT04gICsKLVVTSU5HCi0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLiArCi1DUkVBVEUgVFJJR0dFUiBteVRyaWdnZXIgT04gbXlUYWJsZSBVU0lORwotYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyaWdnZXJzLkludmVydGVkSW5kZXgnOwotCi1UaGUgYWN0dWFsIGxvZ2ljIHRoYXQgbWFrZXMgdXAgdGhlIHRyaWdnZXIgY2FuIGJlIHdyaXR0ZW4gaW4gYW55IEphdmEKLShKVk0pIGxhbmd1YWdlIGFuZCBleGlzdHMgb3V0c2lkZSB0aGUgZGF0YWJhc2UuIFlvdSBwbGFjZSB0aGUgdHJpZ2dlcgotY29kZSBpbiBhIGBsaWIvdHJpZ2dlcnNgIHN1YmRpcmVjdG9yeSBvZiB0aGUgQ2Fzc2FuZHJhIGluc3RhbGxhdGlvbgotZGlyZWN0b3J5LCBpdCBsb2FkcyBkdXJpbmcgY2x1c3RlciBzdGFydHVwLCBhbmQgZXhpc3RzIG9uIGV2ZXJ5IG5vZGUKLXRoYXQgcGFydGljaXBhdGVzIGluIGEgY2x1c3Rlci4gVGhlIHRyaWdnZXIgZGVmaW5lZCBvbiBhIHRhYmxlIGZpcmVzCi1iZWZvcmUgYSByZXF1ZXN0ZWQgRE1MIHN0YXRlbWVudCBvY2N1cnMsIHdoaWNoIGVuc3VyZXMgdGhlIGF0b21pY2l0eSBvZgotdGhlIHRyYW5zYWN0aW9uLgotCi1bW2Ryb3BUcmlnZ2VyU3RtdF1dCi09PT09IERST1AgVFJJR0dFUgotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBEUk9QIFRSSUdHRVIgKCBJRiBFWElTVFMgKT8gKCApPyArCi1PTiAgKwotcC4gKwotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLURST1AgVFJJR0dFUiBteVRyaWdnZXIgT04gbXlUYWJsZTsKLQotYERST1AgVFJJR0dFUmAgc3RhdGVtZW50IHJlbW92ZXMgdGhlIHJlZ2lzdHJhdGlvbiBvZiBhIHRyaWdnZXIgY3JlYXRlZAotdXNpbmcgYENSRUFURSBUUklHR0VSYC4KLQotW1tjcmVhdGVGdW5jdGlvblN0bXRdXQotPT09PSBDUkVBVEUgRlVOQ1RJT04KLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gQ1JFQVRFICggT1IgUkVQTEFDRSApPyArCi1GVU5DVElPTiAoIElGIE5PVCBFWElTVFMgKT8gKwotKCBgLicgKT8gICsKLWAoJyAoIGAsJyApKiBgKScgKwotKCBDQUxMRUQgfCBSRVRVUk5TIE5VTEwgKSBPTiBOVUxMIElOUFVUICsKLVJFVFVSTlMgICsKLUxBTkdVQUdFICArCi1BUwotCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gKwotQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gc29tZWZ1bmN0aW9uICsKLSggc29tZWFyZyBpbnQsIGFub3RoZXJhcmcgdGV4dCwgY29tcGxleGFyZyBmcm96ZW4sIGxpc3RhcmcgbGlzdCApICsKLVJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICsKLVJFVFVSTlMgdGV4dCArCi1MQU5HVUFHRSBqYXZhICsKLUFTICQkICsKLS8vIHNvbWUgSmF2YSBjb2RlICsKLSQkOyArCi1DUkVBVEUgRlVOQ1RJT04gYWtleXNwYWNlLmZuYW1lIElGIE5PVCBFWElTVFMgKwotKCBzb21lQXJnIGludCApICsKLUNBTExFRCBPTiBOVUxMIElOUFVUICsKLVJFVFVSTlMgdGV4dCArCi1MQU5HVUFHRSBqYXZhICsKLUFTICQkICsKLS8vIHNvbWUgSmF2YSBjb2RlICsKLSQkOwotCi1gQ1JFQVRFIEZVTkNUSU9OYCBjcmVhdGVzIG9yIHJlcGxhY2VzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uLgotCi1bW2Z1bmN0aW9uU2lnbmF0dXJlXV0KLT09PT09IEZ1bmN0aW9uIFNpZ25hdHVyZQotCi1TaWduYXR1cmVzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGluZGl2aWR1YWwgZnVuY3Rpb25zLiBUaGUgc2lnbmF0dXJlCi1jb25zaXN0cyBvZjoKLQotLiBUaGUgZnVsbHkgcXVhbGlmaWVkIGZ1bmN0aW9uIG5hbWUgLSBpLmUgX2tleXNwYWNlXyBwbHVzCi1fZnVuY3Rpb24tbmFtZV8KLS4gVGhlIGNvbmNhdGVuYXRlZCBsaXN0IG9mIGFsbCBhcmd1bWVudCB0eXBlcwotCi1Ob3RlIHRoYXQga2V5c3BhY2UgbmFtZXMsIGZ1bmN0aW9uIG5hbWVzIGFuZCBhcmd1bWVudCB0eXBlcyBhcmUgc3ViamVjdAotdG8gdGhlIGRlZmF1bHQgbmFtaW5nIGNvbnZlbnRpb25zIGFuZCBjYXNlLXNlbnNpdGl2aXR5IHJ1bGVzLgotCi1gQ1JFQVRFIEZVTkNUSU9OYCB3aXRoIHRoZSBvcHRpb25hbCBgT1IgUkVQTEFDRWAga2V5d29yZHMgZWl0aGVyIGNyZWF0ZXMKLWEgZnVuY3Rpb24gb3IgcmVwbGFjZXMgYW4gZXhpc3Rpbmcgb25lIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLiBBCi1gQ1JFQVRFIEZVTkNUSU9OYCB3aXRob3V0IGBPUiBSRVBMQUNFYCBmYWlscyBpZiBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUKLXNpZ25hdHVyZSBhbHJlYWR5IGV4aXN0cy4KLQotQmVoYXZpb3Igb24gaW52b2NhdGlvbiB3aXRoIGBudWxsYCB2YWx1ZXMgbXVzdCBiZSBkZWZpbmVkIGZvciBlYWNoCi1mdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBvcHRpb25zOgotCi0uIGBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVGAgZGVjbGFyZXMgdGhhdCB0aGUgZnVuY3Rpb24gd2lsbCBhbHdheXMKLXJldHVybiBgbnVsbGAgaWYgYW55IG9mIHRoZSBpbnB1dCBhcmd1bWVudHMgaXMgYG51bGxgLgotLiBgQ0FMTEVEIE9OIE5VTEwgSU5QVVRgIGRlY2xhcmVzIHRoYXQgdGhlIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIGJlCi1leGVjdXRlZC4KLQotSWYgdGhlIG9wdGlvbmFsIGBJRiBOT1QgRVhJU1RTYCBrZXl3b3JkcyBhcmUgdXNlZCwgdGhlIGZ1bmN0aW9uIHdpbGwKLW9ubHkgYmUgY3JlYXRlZCBpZiBhbm90aGVyIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGRvZXMgbm90Ci1leGlzdC4KLQotYE9SIFJFUExBQ0VgIGFuZCBgSUYgTk9UIEVYSVNUYCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci4KLQotRnVuY3Rpb25zIGJlbG9uZyB0byBhIGtleXNwYWNlLiBJZiBubyBrZXlzcGFjZSBpcyBzcGVjaWZpZWQgaW4KLWA8ZnVuY3Rpb24tbmFtZT5gLCB0aGUgY3VycmVudCBrZXlzcGFjZSBpcyB1c2VkIChpLmUuIHRoZSBrZXlzcGFjZQotc3BlY2lmaWVkIHVzaW5nIHRoZSBsaW5rOiN1c2VTdG10W2BVU0VgXSBzdGF0ZW1lbnQpLiBJdCBpcyBub3QgcG9zc2libGUKLXRvIGNyZWF0ZSBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBpbiBvbmUgb2YgdGhlIHN5c3RlbSBrZXlzcGFjZXMuCi0KLVNlZSB0aGUgc2VjdGlvbiBvbiBsaW5rOiN1ZGZzW3VzZXItZGVmaW5lZCBmdW5jdGlvbnNdIGZvciBtb3JlCi1pbmZvcm1hdGlvbi4KLQotW1tkcm9wRnVuY3Rpb25TdG10XV0KLT09PT0gRFJPUCBGVU5DVElPTgotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBEUk9QIEZVTkNUSU9OICggSUYgRVhJU1RTICk/ICsKLSggYC4nICk/ICArCi0oIGAoJyAoIGAsJyApKiBgKScgKT8KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLURST1AgRlVOQ1RJT04gbXlmdW5jdGlvbjsgKwotRFJPUCBGVU5DVElPTiBteWtleXNwYWNlLmFmdW5jdGlvbjsgKwotRFJPUCBGVU5DVElPTiBhZnVuY3Rpb24gKCBpbnQgKTsgKwotRFJPUCBGVU5DVElPTiBhZnVuY3Rpb24gKCB0ZXh0ICk7Ci0KLWBEUk9QIEZVTkNUSU9OYCBzdGF0ZW1lbnQgcmVtb3ZlcyBhIGZ1bmN0aW9uIGNyZWF0ZWQgdXNpbmcKLWBDUkVBVEUgRlVOQ1RJT05gLiArCi1Zb3UgbXVzdCBzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcyAobGluazojZnVuY3Rpb25TaWduYXR1cmVbc2lnbmF0dXJlXQotKSBvZiB0aGUgZnVuY3Rpb24gdG8gZHJvcCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZnVuY3Rpb25zIHdpdGggdGhlIHNhbWUKLW5hbWUgYnV0IGEgZGlmZmVyZW50IHNpZ25hdHVyZSAob3ZlcmxvYWRlZCBmdW5jdGlvbnMpLgotCi1gRFJPUCBGVU5DVElPTmAgd2l0aCB0aGUgb3B0aW9uYWwgYElGIEVYSVNUU2Aga2V5d29yZHMgZHJvcHMgYSBmdW5jdGlvbgotaWYgaXQgZXhpc3RzLgotCi1bW2NyZWF0ZUFnZ3JlZ2F0ZVN0bXRdXQotPT09PSBDUkVBVEUgQUdHUkVHQVRFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IENSRUFURSAoIE9SIFJFUExBQ0UgKT8gKwotQUdHUkVHQVRFICggSUYgTk9UIEVYSVNUUyApPyArCi0oIGAuJyApPyAgKwotYCgnICggYCwnICkqIGApJyArCi1TRlVOQyAgKwotU1RZUEUgICsKLSggRklOQUxGVU5DICk/ICsKLSggSU5JVENPTkQgKT8gKwotcC4gKwotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLUNSRUFURSBBR0dSRUdBVEUgbXlhZ2dyZWdhdGUgKCB2YWwgdGV4dCApICsKLVNGVU5DIG15YWdncmVnYXRlX3N0YXRlICsKLVNUWVBFIHRleHQgKwotRklOQUxGVU5DIG15YWdncmVnYXRlX2ZpbmFsICsKLUlOSVRDT05EIGBmb28nOwotCi1TZWUgdGhlIHNlY3Rpb24gb24gbGluazojdWRhc1t1c2VyLWRlZmluZWQgYWdncmVnYXRlc10gZm9yIGEgY29tcGxldGUKLWV4YW1wbGUuCi0KLWBDUkVBVEUgQUdHUkVHQVRFYCBjcmVhdGVzIG9yIHJlcGxhY2VzIGEgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZS4KLQotYENSRUFURSBBR0dSRUdBVEVgIHdpdGggdGhlIG9wdGlvbmFsIGBPUiBSRVBMQUNFYCBrZXl3b3JkcyBlaXRoZXIKLWNyZWF0ZXMgYW4gYWdncmVnYXRlIG9yIHJlcGxhY2VzIGFuIGV4aXN0aW5nIG9uZSB3aXRoIHRoZSBzYW1lCi1zaWduYXR1cmUuIEEgYENSRUFURSBBR0dSRUdBVEVgIHdpdGhvdXQgYE9SIFJFUExBQ0VgIGZhaWxzIGlmIGFuCi1hZ2dyZWdhdGUgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYWxyZWFkeSBleGlzdHMuCi0KLWBDUkVBVEUgQUdHUkVHQVRFYCB3aXRoIHRoZSBvcHRpb25hbCBgSUYgTk9UIEVYSVNUU2Aga2V5d29yZHMgZWl0aGVyCi1jcmVhdGVzIGFuIGFnZ3JlZ2F0ZSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgotCi1gT1IgUkVQTEFDRWAgYW5kIGBJRiBOT1QgRVhJU1RgIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLgotCi1BZ2dyZWdhdGVzIGJlbG9uZyB0byBhIGtleXNwYWNlLiBJZiBubyBrZXlzcGFjZSBpcyBzcGVjaWZpZWQgaW4KLWA8YWdncmVnYXRlLW5hbWU+YCwgdGhlIGN1cnJlbnQga2V5c3BhY2UgaXMgdXNlZCAoaS5lLiB0aGUga2V5c3BhY2UKLXNwZWNpZmllZCB1c2luZyB0aGUgbGluazojdXNlU3RtdFtgVVNFYF0gc3RhdGVtZW50KS4gSXQgaXMgbm90IHBvc3NpYmxlCi10byBjcmVhdGUgYSB1c2VyLWRlZmluZWQgYWdncmVnYXRlIGluIG9uZSBvZiB0aGUgc3lzdGVtIGtleXNwYWNlcy4KLQotU2lnbmF0dXJlcyBmb3IgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgZm9sbG93IHRoZQotbGluazojZnVuY3Rpb25TaWduYXR1cmVbc2FtZSBydWxlc10gYXMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuCi0KLWBTVFlQRWAgZGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgc3RhdGUgdmFsdWUgYW5kIG11c3QgYmUgc3BlY2lmaWVkLgotCi1UaGUgb3B0aW9uYWwgYElOSVRDT05EYCBkZWZpbmVzIHRoZSBpbml0aWFsIHN0YXRlIHZhbHVlIGZvciB0aGUKLWFnZ3JlZ2F0ZS4gSXQgZGVmYXVsdHMgdG8gYG51bGxgLiBBIG5vbi1gbnVsbGAgYElOSVRDT05EYCBtdXN0IGJlCi1zcGVjaWZpZWQgZm9yIHN0YXRlIGZ1bmN0aW9ucyB0aGF0IGFyZSBkZWNsYXJlZCB3aXRoCi1gUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVRgLgotCi1gU0ZVTkNgIHJlZmVyZW5jZXMgYW4gZXhpc3RpbmcgZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyB0aGUgc3RhdGUKLW1vZGlmeWluZyBmdW5jdGlvbi4gVGhlIHR5cGUgb2YgZmlyc3QgYXJndW1lbnQgb2YgdGhlIHN0YXRlIGZ1bmN0aW9uCi1tdXN0IG1hdGNoIGBTVFlQRWAuIFRoZSByZW1haW5pbmcgYXJndW1lbnQgdHlwZXMgb2YgdGhlIHN0YXRlIGZ1bmN0aW9uCi1tdXN0IG1hdGNoIHRoZSBhcmd1bWVudCB0eXBlcyBvZiB0aGUgYWdncmVnYXRlIGZ1bmN0aW9uLiBTdGF0ZSBpcyBub3QKLXVwZGF0ZWQgZm9yIHN0YXRlIGZ1bmN0aW9ucyBkZWNsYXJlZCB3aXRoIGBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVGAKLWFuZCBjYWxsZWQgd2l0aCBgbnVsbGAuCi0KLVRoZSBvcHRpb25hbCBgRklOQUxGVU5DYCBpcyBjYWxsZWQganVzdCBiZWZvcmUgdGhlIGFnZ3JlZ2F0ZSByZXN1bHQgaXMKLXJldHVybmVkLiBJdCBtdXN0IHRha2Ugb25seSBvbmUgYXJndW1lbnQgd2l0aCB0eXBlIGBTVFlQRWAuIFRoZSByZXR1cm4KLXR5cGUgb2YgdGhlIGBGSU5BTEZVTkNgIG1heSBiZSBhIGRpZmZlcmVudCB0eXBlLiBBIGZpbmFsIGZ1bmN0aW9uCi1kZWNsYXJlZCB3aXRoIGBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVGAgbWVhbnMgdGhhdCB0aGUgYWdncmVnYXRl4oCZcwotcmV0dXJuIHZhbHVlIHdpbGwgYmUgYG51bGxgLCBpZiB0aGUgbGFzdCBzdGF0ZSBpcyBgbnVsbGAuCi0KLUlmIG5vIGBGSU5BTEZVTkNgIGlzIGRlZmluZWQsIHRoZSBvdmVyYWxsIHJldHVybiB0eXBlIG9mIHRoZSBhZ2dyZWdhdGUKLWZ1bmN0aW9uIGlzIGBTVFlQRWAuIElmIGEgYEZJTkFMRlVOQ2AgaXMgZGVmaW5lZCwgaXQgaXMgdGhlIHJldHVybiB0eXBlCi1vZiB0aGF0IGZ1bmN0aW9uLgotCi1TZWUgdGhlIHNlY3Rpb24gb24gbGluazojdWRhc1t1c2VyLWRlZmluZWQgYWdncmVnYXRlc10gZm9yIG1vcmUKLWluZm9ybWF0aW9uLgotCi1bW2Ryb3BBZ2dyZWdhdGVTdG10XV0KLT09PT0gRFJPUCBBR0dSRUdBVEUKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gRFJPUCBBR0dSRUdBVEUgKCBJRiBFWElTVFMgKT8gKwotKCBgLicgKT8gICsKLSggYCgnICggYCwnICkqIGApJyApPyArCi1wLgotCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gKwotRFJPUCBBR0dSRUdBVEUgbXlBZ2dyZWdhdGU7ICsKLURST1AgQUdHUkVHQVRFIG15S2V5c3BhY2UuYW5BZ2dyZWdhdGU7ICsKLURST1AgQUdHUkVHQVRFIHNvbWVBZ2dyZWdhdGUgKCBpbnQgKTsgKwotRFJPUCBBR0dSRUdBVEUgc29tZUFnZ3JlZ2F0ZSAoIHRleHQgKTsKLQotVGhlIGBEUk9QIEFHR1JFR0FURWAgc3RhdGVtZW50IHJlbW92ZXMgYW4gYWdncmVnYXRlIGNyZWF0ZWQgdXNpbmcKLWBDUkVBVEUgQUdHUkVHQVRFYC4gWW91IG11c3Qgc3BlY2lmeSB0aGUgYXJndW1lbnQgdHlwZXMgb2YgdGhlIGFnZ3JlZ2F0ZQotdG8gZHJvcCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgYWdncmVnYXRlcyB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGEKLWRpZmZlcmVudCBzaWduYXR1cmUgKG92ZXJsb2FkZWQgYWdncmVnYXRlcykuCi0KLWBEUk9QIEFHR1JFR0FURWAgd2l0aCB0aGUgb3B0aW9uYWwgYElGIEVYSVNUU2Aga2V5d29yZHMgZHJvcHMgYW4KLWFnZ3JlZ2F0ZSBpZiBpdCBleGlzdHMsIGFuZCBkb2VzIG5vdGhpbmcgaWYgYSBmdW5jdGlvbiB3aXRoIHRoZQotc2lnbmF0dXJlIGRvZXMgbm90IGV4aXN0LgotCi1TaWduYXR1cmVzIGZvciB1c2VyLWRlZmluZWQgYWdncmVnYXRlcyBmb2xsb3cgdGhlCi1saW5rOiNmdW5jdGlvblNpZ25hdHVyZVtzYW1lIHJ1bGVzXSBhcyBmb3IgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4KLQotW1tkYXRhTWFuaXB1bGF0aW9uXV0KLT09PSBEYXRhIE1hbmlwdWxhdGlvbgotCi1bW2luc2VydFN0bXRdXQotPT09PSBJTlNFUlQKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gSU5TRVJUIElOVE8gICsKLSggKCBWQUxVRVMgKSArCi18ICggSlNPTiApKSArCi0oIElGIE5PVCBFWElTVFMgKT8gKwotKCBVU0lORyAoIEFORCApKiApPwotCi06Oj0gYCgnICggYCwnICkqIGApJwotCi06Oj0gYCgnICggYCwnICkqIGApJwotCi06Oj0gVElNRVNUQU1QICArCi18IFRUTCAgKwotcC4gKwotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuLiArCi1JTlNFUlQgSU5UTyBOZXJkTW92aWVzIChtb3ZpZSwgZGlyZWN0b3IsIG1haW5fYWN0b3IsIHllYXIpICsKLVZBTFVFUyAoYFNlcmVuaXR5JywgYEpvc3MgV2hlZG9uJywgYE5hdGhhbiBGaWxsaW9uJywgMjAwNSkgKwotVVNJTkcgVFRMIDg2NDAwOwotCi1JTlNFUlQgSU5UTyBOZXJkTW92aWVzIEpTT04gYFx7YGBtb3ZpZScnOiBgYFNlcmVuaXR5JycsIGBgZGlyZWN0b3InJzoKLWBgSm9zcyBXaGVkb24nJywgYGB5ZWFyJyc6IDIwMDV9JyArCi1wLiArCi1UaGUgYElOU0VSVGAgc3RhdGVtZW50IHdyaXRlcyBvbmUgb3IgbW9yZSBjb2x1bW5zIGZvciBhIGdpdmVuIHJvdyBpbiBhCi10YWJsZS4gTm90ZSB0aGF0IHNpbmNlIGEgcm93IGlzIGlkZW50aWZpZWQgYnkgaXRzIGBQUklNQVJZIEtFWWAsIGF0Ci1sZWFzdCB0aGUgY29sdW1ucyBjb21wb3NpbmcgaXQgbXVzdCBiZSBzcGVjaWZpZWQuIFRoZSBsaXN0IG9mIGNvbHVtbnMgdG8KLWluc2VydCB0byBtdXN0IGJlIHN1cHBsaWVkIHdoZW4gdXNpbmcgdGhlIGBWQUxVRVNgIHN5bnRheC4gV2hlbiB1c2luZwotdGhlIGBKU09OYCBzeW50YXgsIHRoZXkgYXJlIG9wdGlvbmFsLiBTZWUgdGhlIHNlY3Rpb24gb24KLWxpbms6I2luc2VydEpzb25bYElOU0VSVCBKU09OYF0gZm9yIG1vcmUgZGV0YWlscy4KLQotTm90ZSB0aGF0IHVubGlrZSBpbiBTUUwsIGBJTlNFUlRgIGRvZXMgbm90IGNoZWNrIHRoZSBwcmlvciBleGlzdGVuY2Ugb2YKLXRoZSByb3cgYnkgZGVmYXVsdDogdGhlIHJvdyBpcyBjcmVhdGVkIGlmIG5vbmUgZXhpc3RlZCBiZWZvcmUsIGFuZAotdXBkYXRlZCBvdGhlcndpc2UuIEZ1cnRoZXJtb3JlLCB0aGVyZSBpcyBubyBtZWFuIHRvIGtub3cgd2hpY2ggb2YKLWNyZWF0aW9uIG9yIHVwZGF0ZSBoYXBwZW5lZC4KLQotSXQgaXMgaG93ZXZlciBwb3NzaWJsZSB0byB1c2UgdGhlIGBJRiBOT1QgRVhJU1RTYCBjb25kaXRpb24gdG8gb25seQotaW5zZXJ0IGlmIHRoZSByb3cgZG9lcyBub3QgZXhpc3QgcHJpb3IgdG8gdGhlIGluc2VydGlvbi4gQnV0IHBsZWFzZSBub3RlCi10aGF0IHVzaW5nIGBJRiBOT1QgRVhJU1RTYCB3aWxsIGluY3VyIGEgbm9uIG5lZ2xpZ2libGUgcGVyZm9ybWFuY2UgY29zdAotKGludGVybmFsbHksIFBheG9zIHdpbGwgYmUgdXNlZCkgc28gdGhpcyBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkuCi0KLUFsbCB1cGRhdGVzIGZvciBhbiBgSU5TRVJUYCBhcmUgYXBwbGllZCBhdG9taWNhbGx5IGFuZCBpbiBpc29sYXRpb24uCi0KLVBsZWFzZSByZWZlciB0byB0aGUgbGluazojdXBkYXRlT3B0aW9uc1tgVVBEQVRFYF0gc2VjdGlvbiBmb3IKLWluZm9ybWF0aW9uIG9uIHRoZSBgPG9wdGlvbj5gIGF2YWlsYWJsZSBhbmQgdG8gdGhlCi1saW5rOiNjb2xsZWN0aW9uc1tjb2xsZWN0aW9uc10gc2VjdGlvbiBmb3IgdXNlIG9mCi1gPGNvbGxlY3Rpb24tbGl0ZXJhbD5gLiBBbHNvIG5vdGUgdGhhdCBgSU5TRVJUYCBkb2VzIG5vdCBzdXBwb3J0Ci1jb3VudGVycywgd2hpbGUgYFVQREFURWAgZG9lcy4KLQotW1t1cGRhdGVTdG10XV0KLT09PT0gVVBEQVRFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IFVQREFURSAgKwotKCBVU0lORyAoIEFORCApKiApPyArCi1TRVQgKCBgLCcgKSogKwotV0hFUkUgICsKLSggSUYgKCBBTkQgY29uZGl0aW9uICkqICk/Ci0KLTo6PSBgPScgICsKLXwgYD0nIChgKycgfCBgLScpICggfCB8ICkgKwotfCBgPScgYCsnICArCi18IGBbJyBgXScgYD0nICArCi18IGAuJyBgPScKLQotOjo9ICArCi18IENPTlRBSU5TIChLRVkpPyArCi18IElOICArCi18IGBbJyBgXScgICsKLXwgYFsnIGBdJyBJTiAgKwotfCBgLicgICsKLXwgYC4nIElOCi0KLTo6PSBgPCcgfCBgPD0nIHwgYD0nIHwgYCE9JyB8IGA+PScgfCBgPicgKwotOjo9ICggfCBgKCcgKCAoIGAsJyApKiApPyBgKScpCi0KLTo6PSAoIEFORCApKgotCi06Oj0gYD0nICArCi18IGAoJyAoYCwnICkqIGApJyBgPScgICsKLXwgSU4gYCgnICggKCBgLCcgKSogKT8gYCknICsKLXwgSU4gICsKLXwgYCgnIChgLCcgKSogYCknIElOIGAoJyAoICggYCwnICkqICk/IGApJyArCi18IGAoJyAoYCwnICkqIGApJyBJTgotCi06Oj0gVElNRVNUQU1QICArCi18IFRUTCAgKwotcC4gKwotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuLiArCi1VUERBVEUgTmVyZE1vdmllcyBVU0lORyBUVEwgNDAwICsKLVNFVCBkaXJlY3RvciA9IGBKb3NzIFdoZWRvbicsICsKLW1haW5fYWN0b3IgPSBgTmF0aGFuIEZpbGxpb24nLCArCi15ZWFyID0gMjAwNSArCi1XSEVSRSBtb3ZpZSA9IGBTZXJlbml0eSc7Ci0KLVVQREFURSBVc2VyQWN0aW9ucyBTRVQgdG90YWwgPSB0b3RhbCArIDIgV0hFUkUgdXNlciA9Ci1CNzBERTFEMC05OTA4LTRBRTMtQkUzNC01NTczRTVCMDlGMTQgQU5EIGFjdGlvbiA9IGBjbGljayc7ICsKLXAuICsKLVRoZSBgVVBEQVRFYCBzdGF0ZW1lbnQgd3JpdGVzIG9uZSBvciBtb3JlIGNvbHVtbnMgZm9yIGEgZ2l2ZW4gcm93IGluIGEKLXRhYmxlLiBUaGUgYDx3aGVyZS1jbGF1c2U+YCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcm93IHRvIHVwZGF0ZSBhbmQgbXVzdAotaW5jbHVkZSBhbGwgY29sdW1ucyBjb21wb3NpbmcgdGhlIGBQUklNQVJZIEtFWWAuIE90aGVyIGNvbHVtbnMgdmFsdWVzCi1hcmUgc3BlY2lmaWVkIHRocm91Z2ggYDxhc3NpZ25tZW50PmAgYWZ0ZXIgdGhlIGBTRVRgIGtleXdvcmQuCi0KLU5vdGUgdGhhdCB1bmxpa2UgaW4gU1FMLCBgVVBEQVRFYCBkb2VzIG5vdCBjaGVjayB0aGUgcHJpb3IgZXhpc3RlbmNlIG9mCi10aGUgcm93IGJ5IGRlZmF1bHQgKGV4Y2VwdCB0aHJvdWdoIHRoZSB1c2Ugb2YgYDxjb25kaXRpb24+YCwgc2VlIGJlbG93KToKLXRoZSByb3cgaXMgY3JlYXRlZCBpZiBub25lIGV4aXN0ZWQgYmVmb3JlLCBhbmQgdXBkYXRlZCBvdGhlcndpc2UuCi1GdXJ0aGVybW9yZSwgdGhlcmUgYXJlIG5vIG1lYW5zIHRvIGtub3cgd2hldGhlciBhIGNyZWF0aW9uIG9yIHVwZGF0ZQotb2NjdXJyZWQuCi0KLUl0IGlzIGhvd2V2ZXIgcG9zc2libGUgdG8gdXNlIHRoZSBjb25kaXRpb25zIG9uIHNvbWUgY29sdW1ucyB0aHJvdWdoCi1gSUZgLCBpbiB3aGljaCBjYXNlIHRoZSByb3cgd2lsbCBub3QgYmUgdXBkYXRlZCB1bmxlc3MgdGhlIGNvbmRpdGlvbnMKLWFyZSBtZXQuIEJ1dCwgcGxlYXNlIG5vdGUgdGhhdCB1c2luZyBgSUZgIGNvbmRpdGlvbnMgd2lsbCBpbmN1ciBhCi1ub24tbmVnbGlnaWJsZSBwZXJmb3JtYW5jZSBjb3N0IChpbnRlcm5hbGx5LCBQYXhvcyB3aWxsIGJlIHVzZWQpIHNvIHRoaXMKLXNob3VsZCBiZSB1c2VkIHNwYXJpbmdseS4KLQotSW4gYW4gYFVQREFURWAgc3RhdGVtZW50LCBhbGwgdXBkYXRlcyB3aXRoaW4gdGhlIHNhbWUgcGFydGl0aW9uIGtleSBhcmUKLWFwcGxpZWQgYXRvbWljYWxseSBhbmQgaW4gaXNvbGF0aW9uLgotCi1UaGUgYGMgPSBjICsgM2AgZm9ybSBvZiBgPGFzc2lnbm1lbnQ+YCBpcyB1c2VkIHRvIGluY3JlbWVudC9kZWNyZW1lbnQKLWNvdW50ZXJzLiBUaGUgaWRlbnRpZmllciBhZnRlciB0aGUgYD0nIHNpZ24gKm11c3QqIGJlIHRoZSBzYW1lIHRoYW4gdGhlCi1vbmUgYmVmb3JlIHRoZSBgPScgc2lnbiAoT25seSBpbmNyZW1lbnQvZGVjcmVtZW50IGlzIHN1cHBvcnRlZCBvbgotY291bnRlcnMsIG5vdCB0aGUgYXNzaWdubWVudCBvZiBhIHNwZWNpZmljIHZhbHVlKS4KLQotVGhlIGBpZCA9IGlkICsgPGNvbGxlY3Rpb24tbGl0ZXJhbD5gIGFuZCBgaWRbdmFsdWUxXSA9IHZhbHVlMmAgZm9ybXMgb2YKLWA8YXNzaWdubWVudD5gIGFyZSBmb3IgY29sbGVjdGlvbnMuIFBsZWFzZSByZWZlciB0byB0aGUKLWxpbms6I2NvbGxlY3Rpb25zW3JlbGV2YW50IHNlY3Rpb25dIGZvciBtb3JlIGRldGFpbHMuCi0KLVRoZSBgaWQuZmllbGQgPSA8dGVybT5gIGZvcm0gb2YgYDxhc3NpZ25lbXQ+YCBpcyBmb3Igc2V0dGluZyB0aGUgdmFsdWUKLW9mIGEgc2luZ2xlIGZpZWxkIG9uIGEgbm9uLWZyb3plbiB1c2VyLWRlZmluZWQgdHlwZXMuCi0KLVtbdXBkYXRlT3B0aW9uc11dCi09PT09PSBgPG9wdGlvbnM+YAotCi1UaGUgYFVQREFURWAgYW5kIGBJTlNFUlRgIHN0YXRlbWVudHMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6Ci0KLSogYFRJTUVTVEFNUGA6IHNldHMgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIG9wZXJhdGlvbi4gSWYgbm90IHNwZWNpZmllZCwKLXRoZSBjb29yZGluYXRvciB3aWxsIHVzZSB0aGUgY3VycmVudCB0aW1lIChpbiBtaWNyb3NlY29uZHMpIGF0IHRoZSBzdGFydAotb2Ygc3RhdGVtZW50IGV4ZWN1dGlvbiBhcyB0aGUgdGltZXN0YW1wLiBUaGlzIGlzIHVzdWFsbHkgYSBzdWl0YWJsZQotZGVmYXVsdC4KLSogYFRUTGA6IHNwZWNpZmllcyBhbiBvcHRpb25hbCBUaW1lIFRvIExpdmUgKGluIHNlY29uZHMpIGZvciB0aGUKLWluc2VydGVkIHZhbHVlcy4gSWYgc2V0LCB0aGUgaW5zZXJ0ZWQgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQKLWZyb20gdGhlIGRhdGFiYXNlIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZS4gTm90ZSB0aGF0IHRoZSBUVEwgY29uY2VybnMKLXRoZSBpbnNlcnRlZCB2YWx1ZXMsIG5vdCB0aGUgY29sdW1ucyB0aGVtc2VsdmVzLiBUaGlzIG1lYW5zIHRoYXQgYW55Ci1zdWJzZXF1ZW50IHVwZGF0ZSBvZiB0aGUgY29sdW1uIHdpbGwgYWxzbyByZXNldCB0aGUgVFRMICh0byB3aGF0ZXZlciBUVEwKLWlzIHNwZWNpZmllZCBpbiB0aGF0IHVwZGF0ZSkuIEJ5IGRlZmF1bHQsIHZhbHVlcyBuZXZlciBleHBpcmUuIEEgVFRMIG9mCi0wIGlzIGVxdWl2YWxlbnQgdG8gbm8gVFRMLiBJZiB0aGUgdGFibGUgaGFzIGEgZGVmYXVsdF90aW1lX3RvX2xpdmUsIGEKLVRUTCBvZiAwIHdpbGwgcmVtb3ZlIHRoZSBUVEwgZm9yIHRoZSBpbnNlcnRlZCBvciB1cGRhdGVkIHZhbHVlcy4KLQotW1tkZWxldGVTdG10XV0KLT09PT0gREVMRVRFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IERFTEVURSAoICggYCwnICkqICk/ICsKLUZST00gICsKLSggVVNJTkcgVElNRVNUQU1QICk/ICsKLVdIRVJFICArCi0oIElGICggRVhJU1RTIHwgKCAoIEFORCApKikgKSApPwotCi06Oj0gICsKLXwgYFsnIGBdJyArCi18IGAuJwotCi06Oj0gKCBBTkQgKSoKLQotOjo9ICArCi18IGAoJyAoYCwnICkqIGApJyAgKwotfCBJTiBgKCcgKCAoIGAsJyApKiApPyBgKScgKwotfCBJTiAgKwotfCBgKCcgKGAsJyApKiBgKScgSU4gYCgnICggKCBgLCcgKSogKT8gYCknICsKLXwgYCgnIChgLCcgKSogYCknIElOCi0KLTo6PSBgPScgfCBgPCcgfCBgPicgfCBgPD0nIHwgYD49JyArCi06Oj0gKCB8IGAoJyAoICggYCwnICkqICk/IGApJykKLQotOjo9ICggfCBgIT0nKSAgKwotfCBDT05UQUlOUyAoS0VZKT8gKwotfCBJTiAgKwotfCBgWycgYF0nICggfCBgIT0nKSAgKwotfCBgWycgYF0nIElOICArCi18IGAuJyAoIHwgYCE9JykgICsKLXwgYC4nIElOCi0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLi4gKwotREVMRVRFIEZST00gTmVyZE1vdmllcyBVU0lORyBUSU1FU1RBTVAgMTI0MDAwMzEzNCBXSEVSRSBtb3ZpZSA9Ci1gU2VyZW5pdHknOwotCi1ERUxFVEUgcGhvbmUgRlJPTSBVc2VycyBXSEVSRSB1c2VyaWQgSU4KLShDNzNERTFEMy1BRjA4LTQwRjMtQjEyNC0zRkYzRTUxMDlGMjIsCi1CNzBERTFEMC05OTA4LTRBRTMtQkUzNC01NTczRTVCMDlGMTQpOyArCi1wLiArCi1UaGUgYERFTEVURWAgc3RhdGVtZW50IGRlbGV0ZXMgY29sdW1ucyBhbmQgcm93cy4gSWYgY29sdW1uIG5hbWVzIGFyZQotcHJvdmlkZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGBERUxFVEVgIGtleXdvcmQsIG9ubHkgdGhvc2UgY29sdW1ucyBhcmUKLWRlbGV0ZWQgZnJvbSB0aGUgcm93IGluZGljYXRlZCBieSB0aGUgYDx3aGVyZS1jbGF1c2U+YC4gVGhlIGBpZFt2YWx1ZV1gCi1zeW50YXggaW4gYDxzZWxlY3Rpb24+YCBpcyBmb3Igbm9uLWZyb3plbiBjb2xsZWN0aW9ucyAocGxlYXNlIHJlZmVyIHRvCi10aGUgbGluazojY29sbGVjdGlvbnNbY29sbGVjdGlvbiBzZWN0aW9uXSBmb3IgbW9yZSBkZXRhaWxzKS4gVGhlCi1gaWQuZmllbGRgIHN5bnRheCBpcyBmb3IgdGhlIGRlbGV0aW9uIG9mIG5vbi1mcm96ZW4gdXNlci1kZWZpbmVkIHR5cGVzLgotT3RoZXJ3aXNlLCB3aG9sZSByb3dzIGFyZSByZW1vdmVkLiBUaGUgYDx3aGVyZS1jbGF1c2U+YCBzcGVjaWZpZXMgd2hpY2gKLXJvd3MgYXJlIHRvIGJlIGRlbGV0ZWQuIE11bHRpcGxlIHJvd3MgbWF5IGJlIGRlbGV0ZWQgd2l0aCBvbmUgc3RhdGVtZW50Ci1ieSB1c2luZyBhbiBgSU5gIGNsYXVzZS4gQSByYW5nZSBvZiByb3dzIG1heSBiZSBkZWxldGVkIHVzaW5nIGFuCi1pbmVxdWFsaXR5IG9wZXJhdG9yIChzdWNoIGFzIGA+PWApLgotCi1gREVMRVRFYCBzdXBwb3J0cyB0aGUgYFRJTUVTVEFNUGAgb3B0aW9uIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZQotbGluazojdXBkYXRlU3RtdFtgVVBEQVRFYF0gc3RhdGVtZW50LgotCi1JbiBhIGBERUxFVEVgIHN0YXRlbWVudCwgYWxsIGRlbGV0aW9ucyB3aXRoaW4gdGhlIHNhbWUgcGFydGl0aW9uIGtleSBhcmUKLWFwcGxpZWQgYXRvbWljYWxseSBhbmQgaW4gaXNvbGF0aW9uLgotCi1BIGBERUxFVEVgIG9wZXJhdGlvbiBjYW4gYmUgY29uZGl0aW9uYWwgdGhyb3VnaCB0aGUgdXNlIG9mIGFuIGBJRmAKLWNsYXVzZSwgc2ltaWxhciB0byBgVVBEQVRFYCBhbmQgYElOU0VSVGAgc3RhdGVtZW50cy4gSG93ZXZlciwgYXMgd2l0aAotYElOU0VSVGAgYW5kIGBVUERBVEVgIHN0YXRlbWVudHMsIHRoaXMgd2lsbCBpbmN1ciBhIG5vbi1uZWdsaWdpYmxlCi1wZXJmb3JtYW5jZSBjb3N0IChpbnRlcm5hbGx5LCBQYXhvcyB3aWxsIGJlIHVzZWQpIGFuZCBzbyBzaG91bGQgYmUgdXNlZAotc3BhcmluZ2x5LgotCi1bW2JhdGNoU3RtdF1dCi09PT09IEJBVENICi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IEJFR0lOICggVU5MT0dHRUQgfCBDT1VOVEVSICkgQkFUQ0ggKwotKCBVU0lORyAoIEFORCApKiApPyArCi0oIGA7JyApKiArCi1BUFBMWSBCQVRDSAotCi06Oj0gICsKLXwgICsKLXwKLQotOjo9IFRJTUVTVEFNUCAgKwotcC4gKwotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLUJFR0lOIEJBVENIICsKLUlOU0VSVCBJTlRPIHVzZXJzICh1c2VyaWQsIHBhc3N3b3JkLCBuYW1lKSBWQUxVRVMgKGB1c2VyMicsIGBjaEBuZ2VtM2InLAotYHNlY29uZCB1c2VyJyk7ICsKLVVQREFURSB1c2VycyBTRVQgcGFzc3dvcmQgPSBgcHMyMmRoZHMnIFdIRVJFIHVzZXJpZCA9IGB1c2VyMyc7ICsKLUlOU0VSVCBJTlRPIHVzZXJzICh1c2VyaWQsIHBhc3N3b3JkKSBWQUxVRVMgKGB1c2VyNCcsIGBjaEBuZ2VtM2MnKTsgKwotREVMRVRFIG5hbWUgRlJPTSB1c2VycyBXSEVSRSB1c2VyaWQgPSBgdXNlcjEnOyArCi1BUFBMWSBCQVRDSDsKLQotVGhlIGBCQVRDSGAgc3RhdGVtZW50IGdyb3VwIG11bHRpcGxlIG1vZGlmaWNhdGlvbiBzdGF0ZW1lbnRzCi0oaW5zZXJ0aW9ucy91cGRhdGVzIGFuZCBkZWxldGlvbnMpIGludG8gYSBzaW5nbGUgc3RhdGVtZW50LiBJdCBzZXJ2ZXMKLXNldmVyYWwgcHVycG9zZXM6Ci0KLS4gSXQgc2F2ZXMgbmV0d29yayByb3VuZC10cmlwcyBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIgKGFuZAotc29tZXRpbWVzIGJldHdlZW4gdGhlIHNlcnZlciBjb29yZGluYXRvciBhbmQgdGhlIHJlcGxpY2FzKSB3aGVuIGJhdGNoaW5nCi1tdWx0aXBsZSB1cGRhdGVzLgotLiBBbGwgdXBkYXRlcyBpbiBhIGBCQVRDSGAgYmVsb25naW5nIHRvIGEgZ2l2ZW4gcGFydGl0aW9uIGtleSBhcmUKLXBlcmZvcm1lZCBpbiBpc29sYXRpb24uCi0uIEJ5IGRlZmF1bHQsIGFsbCBvcGVyYXRpb25zIGluIHRoZSBiYXRjaCBhcmUgcGVyZm9ybWVkIGFzIGBMT0dHRURgLCB0bwotZW5zdXJlIGFsbCBtdXRhdGlvbnMgZXZlbnR1YWxseSBjb21wbGV0ZSAob3Igbm9uZSB3aWxsKS4gU2VlIHRoZSBub3Rlcwotb24gbGluazojdW5sb2dnZWRCYXRjaFtgVU5MT0dHRURgXSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Ob3RlIHRoYXQ6Ci0KLSogYEJBVENIYCBzdGF0ZW1lbnRzIG1heSBvbmx5IGNvbnRhaW4gYFVQREFURWAsIGBJTlNFUlRgIGFuZCBgREVMRVRFYAotc3RhdGVtZW50cy4KLSogQmF0Y2hlcyBhcmUgX25vdF8gYSBmdWxsIGFuYWxvZ3VlIGZvciBTUUwgdHJhbnNhY3Rpb25zLgotKiBJZiBhIHRpbWVzdGFtcCBpcyBub3Qgc3BlY2lmaWVkIGZvciBlYWNoIG9wZXJhdGlvbiwgdGhlbiBhbGwKLW9wZXJhdGlvbnMgd2lsbCBiZSBhcHBsaWVkIHdpdGggdGhlIHNhbWUgdGltZXN0YW1wLiBEdWUgdG8gQ2Fzc2FuZHJh4oCZcwotY29uZmxpY3QgcmVzb2x1dGlvbiBwcm9jZWR1cmUgaW4gdGhlIGNhc2Ugb2YKLWh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY2Fzc2FuZHJhL0ZBUSNjbG9ja3RpZVt0aW1lc3RhbXAgdGllc10sCi1vcGVyYXRpb25zIG1heSBiZSBhcHBsaWVkIGluIGFuIG9yZGVyIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9yZGVyCi10aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIGBCQVRDSGAgc3RhdGVtZW50LiBUbyBmb3JjZSBhIHBhcnRpY3VsYXIKLW9wZXJhdGlvbiBvcmRlcmluZywgeW91IG11c3Qgc3BlY2lmeSBwZXItb3BlcmF0aW9uIHRpbWVzdGFtcHMuCi0KLVtbdW5sb2dnZWRCYXRjaF1dCi09PT09PSBgVU5MT0dHRURgCi0KLUJ5IGRlZmF1bHQsIENhc3NhbmRyYSB1c2VzIGEgYmF0Y2ggbG9nIHRvIGVuc3VyZSBhbGwgb3BlcmF0aW9ucyBpbiBhCi1iYXRjaCBldmVudHVhbGx5IGNvbXBsZXRlIG9yIG5vbmUgd2lsbCAobm90ZSBob3dldmVyIHRoYXQgb3BlcmF0aW9ucyBhcmUKLW9ubHkgaXNvbGF0ZWQgd2l0aGluIGEgc2luZ2xlIHBhcnRpdGlvbikuCi0KLVRoZXJlIGlzIGEgcGVyZm9ybWFuY2UgcGVuYWx0eSBmb3IgYmF0Y2ggYXRvbWljaXR5IHdoZW4gYSBiYXRjaCBzcGFucwotbXVsdGlwbGUgcGFydGl0aW9ucy4gSWYgeW91IGRvIG5vdCB3YW50IHRvIGluY3VyIHRoaXMgcGVuYWx0eSwgeW91IGNhbgotdGVsbCBDYXNzYW5kcmEgdG8gc2tpcCB0aGUgYmF0Y2hsb2cgd2l0aCB0aGUgYFVOTE9HR0VEYCBvcHRpb24uIElmIHRoZQotYFVOTE9HR0VEYCBvcHRpb24gaXMgdXNlZCwgYSBmYWlsZWQgYmF0Y2ggbWlnaHQgbGVhdmUgdGhlIHBhdGNoIG9ubHkKLXBhcnRseSBhcHBsaWVkLgotCi1bW2NvdW50ZXJCYXRjaF1dCi09PT09PSBgQ09VTlRFUmAKLQotVXNlIHRoZSBgQ09VTlRFUmAgb3B0aW9uIGZvciBiYXRjaGVkIGNvdW50ZXIgdXBkYXRlcy4gVW5saWtlIG90aGVyCi11cGRhdGVzIGluIENhc3NhbmRyYSwgY291bnRlciB1cGRhdGVzIGFyZSBub3QgaWRlbXBvdGVudC4KLQotW1tiYXRjaE9wdGlvbnNdXQotPT09PT0gYDxvcHRpb24+YAotCi1gQkFUQ0hgIHN1cHBvcnRzIGJvdGggdGhlIGBUSU1FU1RBTVBgIG9wdGlvbiwgd2l0aCBzaW1pbGFyIHNlbWFudGljIHRvCi10aGUgb25lIGRlc2NyaWJlZCBpbiB0aGUgbGluazojdXBkYXRlT3B0aW9uc1tgVVBEQVRFYF0gc3RhdGVtZW50ICh0aGUKLXRpbWVzdGFtcCBhcHBsaWVzIHRvIGFsbCB0aGUgc3RhdGVtZW50IGluc2lkZSB0aGUgYmF0Y2gpLiBIb3dldmVyLCBpZgotdXNlZCwgYFRJTUVTVEFNUGAgKm11c3Qgbm90KiBiZSB1c2VkIGluIHRoZSBzdGF0ZW1lbnRzIHdpdGhpbiB0aGUgYmF0Y2guCi0KLT09PSBRdWVyaWVzCi0KLVtbc2VsZWN0U3RtdF1dCi09PT09IFNFTEVDVAotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBTRUxFQ1QgKCBKU09OICk/ICArCi1GUk9NICArCi0oIFdIRVJFICk/ICsKLSggR1JPVVAgQlkgKT8gKwotKCBPUkRFUiBCWSApPyArCi0oIFBFUiBQQVJUSVRJT04gTElNSVQgKT8gKwotKCBMSU1JVCApPyArCi0oIEFMTE9XIEZJTFRFUklORyApPwotCi06Oj0gRElTVElOQ1Q/Ci0KLTo6PSAoQVMgKT8gKCBgLCcgKEFTICk/ICkqICsKLXwgYConCi0KLTo6PSAgKwotfCAgKwotfCBXUklURVRJTUUgYCgnIGApJyArCi18IENPVU5UIGAoJyBgKicgYCknICsKLXwgVFRMIGAoJyBgKScgKwotfCBDQVNUIGAoJyBBUyBgKScgKwotfCBgKCcgKCAoYCwnICkqKT8gYCknICsKLXwgYC4nICArCi18IGBbJyBgXScgKwotfCBgWycgPyAuLiA/IGBdJwotCi06Oj0gKCBBTkQgKSoKLQotOjo9ICArCi18IGAoJyAoYCwnICkqIGApJyAgKwotfCBJTiBgKCcgKCAoIGAsJyApKiApPyBgKScgKwotfCBgKCcgKGAsJyApKiBgKScgSU4gYCgnICggKCBgLCcgKSogKT8gYCknICsKLXwgVE9LRU4gYCgnICggYCwnICkqIGApJwotCi06Oj0gYD0nIHwgYDwnIHwgYD4nIHwgYDw9JyB8IGA+PScgfCBDT05UQUlOUyB8IENPTlRBSU5TIEtFWSArCi06Oj0gKGAsJyApKiArCi06Oj0gKCBgLCcgKSogKwotOjo9ICggQVNDIHwgREVTQyApPyArCi06Oj0gYCgnIChgLCcgKSogYCknICsKLXAuICsKLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLi4gKwotU0VMRUNUIG5hbWUsIG9jY3VwYXRpb24gRlJPTSB1c2VycyBXSEVSRSB1c2VyaWQgSU4gKDE5OSwgMjAwLCAyMDcpOwotCi1TRUxFQ1QgSlNPTiBuYW1lLCBvY2N1cGF0aW9uIEZST00gdXNlcnMgV0hFUkUgdXNlcmlkID0gMTk5OwotCi1TRUxFQ1QgbmFtZSBBUyB1c2VyX25hbWUsIG9jY3VwYXRpb24gQVMgdXNlcl9vY2N1cGF0aW9uIEZST00gdXNlcnM7Ci0KLVNFTEVDVCB0aW1lLCB2YWx1ZSArCi1GUk9NIGV2ZW50cyArCi1XSEVSRSBldmVudF90eXBlID0gYG15RXZlbnQnICsKLUFORCB0aW1lID4gYDIwMTEtMDItMDMnICsKLUFORCB0aW1lIDw9IGAyMDEyLTAxLTAxJwotCi1TRUxFQ1QgQ09VTlQgKCopIEZST00gdXNlcnM7Ci0KLVNFTEVDVCBDT1VOVCAoKikgQVMgdXNlcl9jb3VudCBGUk9NIHVzZXJzOwotCi1UaGUgYFNFTEVDVGAgc3RhdGVtZW50cyByZWFkcyBvbmUgb3IgbW9yZSBjb2x1bW5zIGZvciBvbmUgb3IgbW9yZSByb3dzCi1pbiBhIHRhYmxlLiBJdCByZXR1cm5zIGEgcmVzdWx0LXNldCBvZiByb3dzLCB3aGVyZSBlYWNoIHJvdyBjb250YWlucyB0aGUKLWNvbGxlY3Rpb24gb2YgY29sdW1ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBxdWVyeS4gSWYgdGhlIGBKU09OYCBrZXl3b3JkCi1pcyB1c2VkLCB0aGUgcmVzdWx0cyBmb3IgZWFjaCByb3cgd2lsbCBjb250YWluIG9ubHkgYSBzaW5nbGUgY29sdW1uCi1uYW1lZCBgYGpzb24nJy4gU2VlIHRoZSBzZWN0aW9uIG9uIGxpbms6I3NlbGVjdEpzb25bYFNFTEVDVCBKU09OYF0gZm9yCi1tb3JlIGRldGFpbHMuCi0KLVtbc2VsZWN0U2VsZWN0aW9uXV0KLT09PT09IGA8c2VsZWN0LWNsYXVzZT5gCi0KLVRoZSBgPHNlbGVjdC1jbGF1c2U+YCBkZXRlcm1pbmVzIHdoaWNoIGNvbHVtbnMgbmVlZHMgdG8gYmUgcXVlcmllZCBhbmQKLXJldHVybmVkIGluIHRoZSByZXN1bHQtc2V0LiBJdCBjb25zaXN0cyBvZiBlaXRoZXIgdGhlIGNvbW1hLXNlcGFyYXRlZAotbGlzdCBvZiBvciB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIChgKmApIHRvIHNlbGVjdCBhbGwgdGhlIGNvbHVtbnMKLWRlZmluZWQgZm9yIHRoZSB0YWJsZS4gUGxlYXNlIG5vdGUgdGhhdCBmb3Igd2lsZGNhcmQgYFNFTEVDVGAgcXVlcmllcwotdGhlIG9yZGVyIG9mIGNvbHVtbnMgcmV0dXJuZWQgaXMgbm90IHNwZWNpZmllZCBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8KLWJlIHN0YWJsZSBiZXR3ZWVuIENhc3NhbmRyYSB2ZXJzaW9ucy4KLQotQSBgPHNlbGVjdG9yPmAgaXMgZWl0aGVyIGEgY29sdW1uIG5hbWUgdG8gcmV0cmlldmUgb3IgYSBgPGZ1bmN0aW9uPmAgb2YKLW9uZSBvciBtb3JlIGA8dGVybT5gcy4gVGhlIGZ1bmN0aW9uIGFsbG93ZWQgYXJlIHRoZSBzYW1lIGFzIGZvciBgPHRlcm0+YAotYW5kIGFyZSBkZXNjcmliZWQgaW4gdGhlIGxpbms6I2Z1bmN0aW9uc1tmdW5jdGlvbiBzZWN0aW9uXS4gSW4gYWRkaXRpb24KLXRvIHRoZXNlIGdlbmVyaWMgZnVuY3Rpb25zLCB0aGUgYFdSSVRFVElNRWAgKHJlc3AuIGBUVExgKSBmdW5jdGlvbgotYWxsb3dzIHRvIHNlbGVjdCB0aGUgdGltZXN0YW1wIG9mIHdoZW4gdGhlIGNvbHVtbiB3YXMgaW5zZXJ0ZWQgKHJlc3AuCi10aGUgdGltZSB0byBsaXZlIChpbiBzZWNvbmRzKSBmb3IgdGhlIGNvbHVtbiAob3IgbnVsbCBpZiB0aGUgY29sdW1uIGhhcwotbm8gZXhwaXJhdGlvbiBzZXQpKSBhbmQgdGhlIGxpbms6I2Nhc3RGdW5bYENBU1RgXSBmdW5jdGlvbiBjYW4gYmUgdXNlZAotdG8gY29udmVydCBvbmUgZGF0YSB0eXBlIHRvIGFub3RoZXIuIFRoZSBgV1JJVEVUSU1FYCBhbmQgYFRUTGAgZnVuY3Rpb25zCi1jYW4ndCBiZSB1c2VkIG9uIG11bHRpLWNlbGwgY29sdW1ucyBzdWNoIGFzIG5vbi1mcm96ZW4gY29sbGVjdGlvbnMgb3IKLW5vbi1mcm96ZW4gdXNlci1kZWZpbmVkIHR5cGVzLgotCi1BZGRpdGlvbmFsbHksIGluZGl2aWR1YWwgdmFsdWVzIG9mIG1hcHMgYW5kIHNldHMgY2FuIGJlIHNlbGVjdGVkIHVzaW5nCi1gWyA8dGVybT4gXWAuIEZvciBtYXBzLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZQota2V5LCBpZiBzdWNoIGVudHJ5IGV4aXN0cy4gRm9yIHNldHMsIHRoaXMgd2lsbCByZXR1cm4gdGhlIGtleSB0aGF0IGlzCi1zZWxlY3RlZCBpZiBpdCBleGlzdHMgYW5kIGlzIHRodXMgbWFpbmx5IGEgd2F5IHRvIGNoZWNrIGVsZW1lbnQKLWV4aXN0ZW5jZS4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzZWxlY3QgYSBzbGljZSBvZiBhIHNldCBvciBtYXAgd2l0aAotYFsgPHRlcm0+IC4uLiA8dGVybT4gYF0sIHdoZXJlIGJvdGggYm91bmQgY2FuIGJlIG9taXR0ZWQuCi0KLUFueSBgPHNlbGVjdG9yPmAgY2FuIGJlIGFsaWFzZWQgdXNpbmcgYEFTYCBrZXl3b3JkIChzZWUgZXhhbXBsZXMpLgotUGxlYXNlIG5vdGUgdGhhdCBgPHdoZXJlLWNsYXVzZT5gIGFuZCBgPG9yZGVyLWJ5PmAgY2xhdXNlIHNob3VsZCByZWZlcgotdG8gdGhlIGNvbHVtbnMgYnkgdGhlaXIgb3JpZ2luYWwgbmFtZXMgYW5kIG5vdCBieSB0aGVpciBhbGlhc2VzLgotCi1UaGUgYENPVU5UYCBrZXl3b3JkIGNhbiBiZSB1c2VkIHdpdGggcGFyZW50aGVzaXMgZW5jbG9zaW5nIGAqYC4gSWYgc28sCi10aGUgcXVlcnkgd2lsbCByZXR1cm4gYSBzaW5nbGUgcmVzdWx0OiB0aGUgbnVtYmVyIG9mIHJvd3MgbWF0Y2hpbmcgdGhlCi1xdWVyeS4gTm90ZSB0aGF0IGBDT1VOVCgxKWAgaXMgc3VwcG9ydGVkIGFzIGFuIGFsaWFzLgotCi1bW3NlbGVjdFdoZXJlXV0KLT09PT09IGA8d2hlcmUtY2xhdXNlPmAKLQotVGhlIGA8d2hlcmUtY2xhdXNlPmAgc3BlY2lmaWVzIHdoaWNoIHJvd3MgbXVzdCBiZSBxdWVyaWVkLiBJdCBpcwotY29tcG9zZWQgb2YgcmVsYXRpb25zIG9uIHRoZSBjb2x1bW5zIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGBQUklNQVJZIEtFWWAKLWFuZC9vciBoYXZlIGEgbGluazojY3JlYXRlSW5kZXhTdG10W3NlY29uZGFyeSBpbmRleF0gZGVmaW5lZCBvbiB0aGVtLgotCi1Ob3QgYWxsIHJlbGF0aW9ucyBhcmUgYWxsb3dlZCBpbiBhIHF1ZXJ5LiBGb3IgaW5zdGFuY2UsIG5vbi1lcXVhbAotcmVsYXRpb25zICh3aGVyZSBgSU5gIGlzIGNvbnNpZGVyZWQgYXMgYW4gZXF1YWwgcmVsYXRpb24pIG9uIGEgcGFydGl0aW9uCi1rZXkgYXJlIG5vdCBzdXBwb3J0ZWQgKGJ1dCBzZWUgdGhlIHVzZSBvZiB0aGUgYFRPS0VOYCBtZXRob2QgYmVsb3cgdG8gZG8KLW5vbi1lcXVhbCBxdWVyaWVzIG9uIHRoZSBwYXJ0aXRpb24ga2V5KS4gTW9yZW92ZXIsIGZvciBhIGdpdmVuIHBhcnRpdGlvbgota2V5LCB0aGUgY2x1c3RlcmluZyBjb2x1bW5zIGluZHVjZSBhbiBvcmRlcmluZyBvZiByb3dzIGFuZCByZWxhdGlvbnMgb24KLXRoZW0gaXMgcmVzdHJpY3RlZCB0byB0aGUgcmVsYXRpb25zIHRoYXQgYWxsb3cgdG8gc2VsZWN0IGEgKmNvbnRpZ3VvdXMqCi0oZm9yIHRoZSBvcmRlcmluZykgc2V0IG9mIHJvd3MuIEZvciBpbnN0YW5jZSwgZ2l2ZW4KLQotYmMoc2FtcGxlKS4gKwotQ1JFQVRFIFRBQkxFIHBvc3RzICggKwotdXNlcmlkIHRleHQsICsKLWJsb2dfdGl0bGUgdGV4dCwgKwotcG9zdGVkX2F0IHRpbWVzdGFtcCwgKwotZW50cnlfdGl0bGUgdGV4dCwgKwotY29udGVudCB0ZXh0LCArCi1jYXRlZ29yeSBpbnQsICsKLVBSSU1BUlkgS0VZICh1c2VyaWQsIGJsb2dfdGl0bGUsIHBvc3RlZF9hdCkgKwotKQotCi1UaGUgZm9sbG93aW5nIHF1ZXJ5IGlzIGFsbG93ZWQ6Ci0KLWJjKHNhbXBsZSkuICsKLVNFTEVDVCBlbnRyeV90aXRsZSwgY29udGVudCBGUk9NIHBvc3RzIFdIRVJFIHVzZXJpZD1gam9obiBkb2UnIEFORAotYmxvZ190aXRsZT1gSm9obidgcyBCbG9nJyBBTkQgcG9zdGVkX2F0ID49IGAyMDEyLTAxLTAxJyBBTkQgcG9zdGVkX2F0IDwKLWAyMDEyLTAxLTMxJwotCi1CdXQgdGhlIGZvbGxvd2luZyBvbmUgaXMgbm90LCBhcyBpdCBkb2VzIG5vdCBzZWxlY3QgYSBjb250aWd1b3VzIHNldCBvZgotcm93cyAoYW5kIHdlIHN1cHBvc2Ugbm8gc2Vjb25kYXJ5IGluZGV4ZXMgYXJlIHNldCk6Ci0KLWJjKHNhbXBsZSkuICsKLS8vIE5lZWRzIGEgYmxvZ190aXRsZSB0byBiZSBzZXQgdG8gc2VsZWN0IHJhbmdlcyBvZiBwb3N0ZWRfYXQgKwotU0VMRUNUIGVudHJ5X3RpdGxlLCBjb250ZW50IEZST00gcG9zdHMgV0hFUkUgdXNlcmlkPWBqb2huIGRvZScgQU5ECi1wb3N0ZWRfYXQgPj0gYDIwMTItMDEtMDEnIEFORCBwb3N0ZWRfYXQgPCBgMjAxMi0wMS0zMScKLQotV2hlbiBzcGVjaWZ5aW5nIHJlbGF0aW9ucywgdGhlIGBUT0tFTmAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgb24gdGhlCi1gUEFSVElUSU9OIEtFWWAgY29sdW1uIHRvIHF1ZXJ5LiBJbiB0aGF0IGNhc2UsIHJvd3Mgd2lsbCBiZSBzZWxlY3RlZAotYmFzZWQgb24gdGhlIHRva2VuIG9mIHRoZWlyIGBQQVJUSVRJT05fS0VZYCByYXRoZXIgdGhhbiBvbiB0aGUgdmFsdWUuCi1Ob3RlIHRoYXQgdGhlIHRva2VuIG9mIGEga2V5IGRlcGVuZHMgb24gdGhlIHBhcnRpdGlvbmVyIGluIHVzZSwgYW5kIHRoYXQKLWluIHBhcnRpY3VsYXIgdGhlIFJhbmRvbVBhcnRpdGlvbmVyIHdvbuKAmXQgeWllbGQgYSBtZWFuaW5nZnVsIG9yZGVyLiBBbHNvCi1ub3RlIHRoYXQgb3JkZXJpbmcgcGFydGl0aW9uZXJzIGFsd2F5cyBvcmRlciB0b2tlbiB2YWx1ZXMgYnkgYnl0ZXMgKHNvCi1ldmVuIGlmIHRoZSBwYXJ0aXRpb24ga2V5IGlzIG9mIHR5cGUgaW50LCBgdG9rZW4oLTEpID4gdG9rZW4oMClgIGluCi1wYXJ0aWN1bGFyKS4gRXhhbXBsZToKLQotYmMoc2FtcGxlKS4gKwotU0VMRUNUICogRlJPTSBwb3N0cyBXSEVSRSB0b2tlbih1c2VyaWQpID4gdG9rZW4oYHRvbScpIEFORCB0b2tlbih1c2VyaWQpCi08IHRva2VuKGBib2InKQotCi1Nb3Jlb3ZlciwgdGhlIGBJTmAgcmVsYXRpb24gaXMgb25seSBhbGxvd2VkIG9uIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUKLXBhcnRpdGlvbiBrZXkgYW5kIG9uIHRoZSBsYXN0IGNvbHVtbiBvZiB0aGUgZnVsbCBwcmltYXJ5IGtleS4KLQotSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBgYGdyb3VwJycgYENMVVNURVJJTkcgQ09MVU1OU2AgdG9nZXRoZXIgaW4gYQotcmVsYXRpb24gdXNpbmcgdGhlIHR1cGxlIG5vdGF0aW9uLiBGb3IgaW5zdGFuY2U6Ci0KLWJjKHNhbXBsZSkuICsKLVNFTEVDVCAqIEZST00gcG9zdHMgV0hFUkUgdXNlcmlkPWBqb2huIGRvZScgQU5EIChibG9nX3RpdGxlLCBwb3N0ZWRfYXQpCi0+IChgSm9obidgcyBCbG9nJywgYDIwMTItMDEtMDEnKQotCi13aWxsIHJlcXVlc3QgYWxsIHJvd3MgdGhhdCBzb3J0cyBhZnRlciB0aGUgb25lIGhhdmluZyBgYEpvaG7igJlzIEJsb2cnJyBhcwotYGJsb2dfdGlsZWAgYW5kIGAyMDEyLTAxLTAxJyBmb3IgYHBvc3RlZF9hdGAgaW4gdGhlIGNsdXN0ZXJpbmcgb3JkZXIuIEluCi1wYXJ0aWN1bGFyLCByb3dzIGhhdmluZyBhIGBwb3N0X2F0IDw9ICcyMDEyLTAxLTAxJ2Agd2lsbCBiZSByZXR1cm5lZCBhcwotbG9uZyBhcyB0aGVpciBgYmxvZ190aXRsZSA+ICdKb2huJydzIEJsb2cnYCwgd2hpY2ggd291bGRu4oCZdCBiZSB0aGUgY2FzZQotZm9yOgotCi1iYyhzYW1wbGUpLiArCi1TRUxFQ1QgKiBGUk9NIHBvc3RzIFdIRVJFIHVzZXJpZD1gam9obiBkb2UnIEFORCBibG9nX3RpdGxlID4gYEpvaG4nYHMKLUJsb2cnIEFORCBwb3N0ZWRfYXQgPiBgMjAxMi0wMS0wMScKLQotVGhlIHR1cGxlIG5vdGF0aW9uIG1heSBhbHNvIGJlIHVzZWQgZm9yIGBJTmAgY2xhdXNlcyBvbgotYENMVVNURVJJTkcgQ09MVU1OU2A6Ci0KLWJjKHNhbXBsZSkuICsKLVNFTEVDVCAqIEZST00gcG9zdHMgV0hFUkUgdXNlcmlkPWBqb2huIGRvZScgQU5EIChibG9nX3RpdGxlLCBwb3N0ZWRfYXQpCi1JTiAoKGBKb2huJ2BzIEJsb2cnLCBgMjAxMi0wMS0wMSksICjigJlFeHRyZW1lIENoZXNzJywgYDIwMTQtMDYtMDEnKSkKLQotVGhlIGBDT05UQUlOU2Agb3BlcmF0b3IgbWF5IG9ubHkgYmUgdXNlZCBvbiBjb2xsZWN0aW9uIGNvbHVtbnMgKGxpc3RzLAotc2V0cywgYW5kIG1hcHMpLiBJbiB0aGUgY2FzZSBvZiBtYXBzLCBgQ09OVEFJTlNgIGFwcGxpZXMgdG8gdGhlIG1hcAotdmFsdWVzLiBUaGUgYENPTlRBSU5TIEtFWWAgb3BlcmF0b3IgbWF5IG9ubHkgYmUgdXNlZCBvbiBtYXAgY29sdW1ucyBhbmQKLWFwcGxpZXMgdG8gdGhlIG1hcCBrZXlzLgotCi1bW3NlbGVjdE9yZGVyQnldXQotPT09PT0gYDxvcmRlci1ieT5gCi0KLVRoZSBgT1JERVIgQllgIG9wdGlvbiBhbGxvd3MgdG8gc2VsZWN0IHRoZSBvcmRlciBvZiB0aGUgcmV0dXJuZWQKLXJlc3VsdHMuIEl0IHRha2VzIGFzIGFyZ3VtZW50IGEgbGlzdCBvZiBjb2x1bW4gbmFtZXMgYWxvbmcgd2l0aCB0aGUKLW9yZGVyIGZvciB0aGUgY29sdW1uIChgQVNDYCBmb3IgYXNjZW5kYW50IGFuZCBgREVTQ2AgZm9yIGRlc2NlbmRhbnQsCi1vbWl0dGluZyB0aGUgb3JkZXIgYmVpbmcgZXF1aXZhbGVudCB0byBgQVNDYCkuIEN1cnJlbnRseSB0aGUgcG9zc2libGUKLW9yZGVyaW5ncyBhcmUgbGltaXRlZCAod2hpY2ggZGVwZW5kcyBvbiB0aGUgdGFibGUKLWxpbms6I2NyZWF0ZVRhYmxlT3B0aW9uc1tgQ0xVU1RFUklORyBPUkRFUmBdICk6Ci0KLSogaWYgdGhlIHRhYmxlIGhhcyBiZWVuIGRlZmluZWQgd2l0aG91dCBhbnkgc3BlY2lmaWMgYENMVVNURVJJTkcgT1JERVJgLAotdGhlbiB0aGVuIGFsbG93ZWQgb3JkZXJpbmdzIGFyZSB0aGUgb3JkZXIgaW5kdWNlZCBieSB0aGUgY2x1c3RlcmluZwotY29sdW1ucyBhbmQgdGhlIHJldmVyc2Ugb2YgdGhhdCBvbmUuCi0qIG90aGVyd2lzZSwgdGhlIG9yZGVyaW5ncyBhbGxvd2VkIGFyZSB0aGUgb3JkZXIgb2YgdGhlCi1gQ0xVU1RFUklORyBPUkRFUmAgb3B0aW9uIGFuZCB0aGUgcmV2ZXJzZWQgb25lLgotCi1bW3NlbGVjdEdyb3VwQnldXQotPT09PT0gYDxncm91cC1ieT5gCi0KLVRoZSBgR1JPVVAgQllgIG9wdGlvbiBhbGxvd3MgdG8gY29uZGVuc2UgaW50byBhIHNpbmdsZSByb3cgYWxsIHNlbGVjdGVkCi1yb3dzIHRoYXQgc2hhcmUgdGhlIHNhbWUgdmFsdWVzIGZvciBhIHNldCBvZiBjb2x1bW5zLgotCi1Vc2luZyB0aGUgYEdST1VQIEJZYCBvcHRpb24sIGl0IGlzIG9ubHkgcG9zc2libGUgdG8gZ3JvdXAgcm93cyBhdCB0aGUKLXBhcnRpdGlvbiBrZXkgbGV2ZWwgb3IgYXQgYSBjbHVzdGVyaW5nIGNvbHVtbiBsZXZlbC4gQnkgY29uc2VxdWVuY2UsIHRoZQotYEdST1VQIEJZYCBvcHRpb24gb25seSBhY2NlcHQgYXMgYXJndW1lbnRzIHByaW1hcnkga2V5IGNvbHVtbiBuYW1lcyBpbgotdGhlIHByaW1hcnkga2V5IG9yZGVyLiBJZiBhIHByaW1hcnkga2V5IGNvbHVtbiBpcyByZXN0cmljdGVkIGJ5IGFuCi1lcXVhbGl0eSByZXN0cmljdGlvbiBpdCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgcHJlc2VudCBpbiB0aGUgYEdST1VQIEJZYAotY2xhdXNlLgotCi1BZ2dyZWdhdGUgZnVuY3Rpb25zIHdpbGwgcHJvZHVjZSBhIHNlcGFyYXRlIHZhbHVlIGZvciBlYWNoIGdyb3VwLiBJZiBubwotYEdST1VQIEJZYCBjbGF1c2UgaXMgc3BlY2lmaWVkLCBhZ2dyZWdhdGVzIGZ1bmN0aW9ucyB3aWxsIHByb2R1Y2UgYQotc2luZ2xlIHZhbHVlIGZvciBhbGwgdGhlIHJvd3MuCi0KLUlmIGEgY29sdW1uIGlzIHNlbGVjdGVkIHdpdGhvdXQgYW4gYWdncmVnYXRlIGZ1bmN0aW9uLCBpbiBhIHN0YXRlbWVudAotd2l0aCBhIGBHUk9VUCBCWWAsIHRoZSBmaXJzdCB2YWx1ZSBlbmNvdW50ZXIgaW4gZWFjaCBncm91cCB3aWxsIGJlCi1yZXR1cm5lZC4KLQotW1tzZWxlY3RMaW1pdF1dCi09PT09PSBgTElNSVRgIGFuZCBgUEVSIFBBUlRJVElPTiBMSU1JVGAKLQotVGhlIGBMSU1JVGAgb3B0aW9uIHRvIGEgYFNFTEVDVGAgc3RhdGVtZW50IGxpbWl0cyB0aGUgbnVtYmVyIG9mIHJvd3MKLXJldHVybmVkIGJ5IGEgcXVlcnksIHdoaWxlIHRoZSBgUEVSIFBBUlRJVElPTiBMSU1JVGAgb3B0aW9uIGxpbWl0cyB0aGUKLW51bWJlciBvZiByb3dzIHJldHVybmVkIGZvciBhIGdpdmVuIHBhcnRpdGlvbiBieSB0aGUgcXVlcnkuIE5vdGUgdGhhdAotYm90aCB0eXBlIG9mIGxpbWl0IGNhbiB1c2VkIGluIHRoZSBzYW1lIHN0YXRlbWVudC4KLQotW1tzZWxlY3RBbGxvd0ZpbHRlcmluZ11dCi09PT09PSBgQUxMT1cgRklMVEVSSU5HYAotCi1CeSBkZWZhdWx0LCBDUUwgb25seSBhbGxvd3Mgc2VsZWN0IHF1ZXJpZXMgdGhhdCBkb27igJl0IGludm9sdmUKLWBgZmlsdGVyaW5nJycgc2VydmVyIHNpZGUsIGkuZS4gcXVlcmllcyB3aGVyZSB3ZSBrbm93IHRoYXQgYWxsIChsaXZlKQotcmVjb3JkIHJlYWQgd2lsbCBiZSByZXR1cm5lZCAobWF5YmUgcGFydGx5KSBpbiB0aGUgcmVzdWx0IHNldC4gVGhlCi1yZWFzb25pbmcgaXMgdGhhdCB0aG9zZSBgYG5vbiBmaWx0ZXJpbmcnJyBxdWVyaWVzIGhhdmUgcHJlZGljdGFibGUKLXBlcmZvcm1hbmNlIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgd2lsbCBleGVjdXRlIGluIGEgdGltZSB0aGF0IGlzCi1wcm9wb3J0aW9uYWwgdG8gdGhlIGFtb3VudCBvZiBkYXRhICpyZXR1cm5lZCogYnkgdGhlIHF1ZXJ5ICh3aGljaCBjYW4gYmUKLWNvbnRyb2xsZWQgdGhyb3VnaCBgTElNSVRgKS4KLQotVGhlIGBBTExPVyBGSUxURVJJTkdgIG9wdGlvbiBhbGxvd3MgdG8gZXhwbGljaXRseSBhbGxvdyAoc29tZSkgcXVlcmllcwotdGhhdCByZXF1aXJlIGZpbHRlcmluZy4gUGxlYXNlIG5vdGUgdGhhdCBhIHF1ZXJ5IHVzaW5nIGBBTExPVyBGSUxURVJJTkdgCi1tYXkgdGh1cyBoYXZlIHVucHJlZGljdGFibGUgcGVyZm9ybWFuY2UgKGZvciB0aGUgZGVmaW5pdGlvbiBhYm92ZSksIGkuZS4KLWV2ZW4gYSBxdWVyeSB0aGF0IHNlbGVjdHMgYSBoYW5kZnVsIG9mIHJlY29yZHMgKm1heSogZXhoaWJpdCBwZXJmb3JtYW5jZQotdGhhdCBkZXBlbmRzIG9uIHRoZSB0b3RhbCBhbW91bnQgb2YgZGF0YSBzdG9yZWQgaW4gdGhlIGNsdXN0ZXIuCi0KLUZvciBpbnN0YW5jZSwgY29uc2lkZXJpbmcgdGhlIGZvbGxvd2luZyB0YWJsZSBob2xkaW5nIHVzZXIgcHJvZmlsZXMgd2l0aAotdGhlaXIgeWVhciBvZiBiaXJ0aCAod2l0aCBhIHNlY29uZGFyeSBpbmRleCBvbiBpdCkgYW5kIGNvdW50cnkgb2YKLXJlc2lkZW5jZToKLQotYmMoc2FtcGxlKS4uICsKLUNSRUFURSBUQUJMRSB1c2VycyAoICsKLXVzZXJuYW1lIHRleHQgUFJJTUFSWSBLRVksICsKLWZpcnN0bmFtZSB0ZXh0LCArCi1sYXN0bmFtZSB0ZXh0LCArCi1iaXJ0aF95ZWFyIGludCwgKwotY291bnRyeSB0ZXh0ICsKLSkKLQotQ1JFQVRFIElOREVYIE9OIHVzZXJzKGJpcnRoX3llYXIpOyArCi1wLgotCi1UaGVuIHRoZSBmb2xsb3dpbmcgcXVlcmllcyBhcmUgdmFsaWQ6Ci0KLWJjKHNhbXBsZSkuICsKLVNFTEVDVCAqIEZST00gdXNlcnM7ICsKLVNFTEVDVCBmaXJzdG5hbWUsIGxhc3RuYW1lIEZST00gdXNlcnMgV0hFUkUgYmlydGhfeWVhciA9IDE5ODE7Ci0KLWJlY2F1c2UgaW4gYm90aCBjYXNlLCBDYXNzYW5kcmEgZ3VhcmFudGVlcyB0aGF0IHRoZXNlIHF1ZXJpZXMKLXBlcmZvcm1hbmNlIHdpbGwgYmUgcHJvcG9ydGlvbmFsIHRvIHRoZSBhbW91bnQgb2YgZGF0YSByZXR1cm5lZC4gSW4KLXBhcnRpY3VsYXIsIGlmIG5vIHVzZXJzIGFyZSBib3JuIGluIDE5ODEsIHRoZW4gdGhlIHNlY29uZCBxdWVyeQotcGVyZm9ybWFuY2Ugd2lsbCBub3QgZGVwZW5kIG9mIHRoZSBudW1iZXIgb2YgdXNlciBwcm9maWxlIHN0b3JlZCBpbiB0aGUKLWRhdGFiYXNlIChub3QgZGlyZWN0bHkgYXQgbGVhc3Q6IGR1ZSB0byBzZWNvbmRhcnkgaW5kZXggaW1wbGVtZW50YXRpb24KLWNvbnNpZGVyYXRpb24sIHRoaXMgcXVlcnkgbWF5IHN0aWxsIGRlcGVuZCBvbiB0aGUgbnVtYmVyIG9mIG5vZGUgaW4gdGhlCi1jbHVzdGVyLCB3aGljaCBpbmRpcmVjdGx5IGRlcGVuZHMgb24gdGhlIGFtb3VudCBvZiBkYXRhIHN0b3JlZC4KLU5ldmVydGhlbGVzcywgdGhlIG51bWJlciBvZiBub2RlcyB3aWxsIGFsd2F5cyBiZSBtdWx0aXBsZSBudW1iZXIgb2YKLW1hZ25pdHVkZSBsb3dlciB0aGFuIHRoZSBudW1iZXIgb2YgdXNlciBwcm9maWxlIHN0b3JlZCkuIE9mIGNvdXJzZSwgYm90aAotcXVlcnkgbWF5IHJldHVybiB2ZXJ5IGxhcmdlIHJlc3VsdCBzZXQgaW4gcHJhY3RpY2UsIGJ1dCB0aGUgYW1vdW50IG9mCi1kYXRhIHJldHVybmVkIGNhbiBhbHdheXMgYmUgY29udHJvbGxlZCBieSBhZGRpbmcgYSBgTElNSVRgLgotCi1Ib3dldmVyLCB0aGUgZm9sbG93aW5nIHF1ZXJ5IHdpbGwgYmUgcmVqZWN0ZWQ6Ci0KLWJjKHNhbXBsZSkuICsKLVNFTEVDVCBmaXJzdG5hbWUsIGxhc3RuYW1lIEZST00gdXNlcnMgV0hFUkUgYmlydGhfeWVhciA9IDE5ODEgQU5ECi1jb3VudHJ5ID0gYEZSJzsKLQotYmVjYXVzZSBDYXNzYW5kcmEgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGl0IHdvbuKAmXQgaGF2ZSB0byBzY2FuIGxhcmdlCi1hbW91bnQgb2YgZGF0YSBldmVuIGlmIHRoZSByZXN1bHQgdG8gdGhvc2UgcXVlcnkgaXMgc21hbGwuIFR5cGljYWxseSwgaXQKLXdpbGwgc2NhbiBhbGwgdGhlIGluZGV4IGVudHJpZXMgZm9yIHVzZXJzIGJvcm4gaW4gMTk4MSBldmVuIGlmIG9ubHkgYQotaGFuZGZ1bCBhcmUgYWN0dWFsbHkgZnJvbSBGcmFuY2UuIEhvd2V2ZXIsIGlmIHlvdSBgYGtub3cgd2hhdCB5b3UgYXJlCi1kb2luZycnLCB5b3UgY2FuIGZvcmNlIHRoZSBleGVjdXRpb24gb2YgdGhpcyBxdWVyeSBieSB1c2luZwotYEFMTE9XIEZJTFRFUklOR2AgYW5kIHNvIHRoZSBmb2xsb3dpbmcgcXVlcnkgaXMgdmFsaWQ6Ci0KLWJjKHNhbXBsZSkuICsKLVNFTEVDVCBmaXJzdG5hbWUsIGxhc3RuYW1lIEZST00gdXNlcnMgV0hFUkUgYmlydGhfeWVhciA9IDE5ODEgQU5ECi1jb3VudHJ5ID0gYEZSJyBBTExPVyBGSUxURVJJTkc7Ci0KLVtbZGF0YWJhc2VSb2xlc11dCi09PT0gRGF0YWJhc2UgUm9sZXMKLQotW1tjcmVhdGVSb2xlU3RtdF1dCi09PT09IENSRUFURSBST0xFCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IENSRUFURSBST0xFICggSUYgTk9UIEVYSVNUUyApPyAoIFdJVEggKCBBTkQgKSogKT8KLQotOjo9IFBBU1NXT1JEID0gICsKLXwgTE9HSU4gPSAgKwotfCBTVVBFUlVTRVIgPSAgKwotfCBPUFRJT05TID0gICsKLXAuCi0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLiArCi1DUkVBVEUgUk9MRSBuZXdfcm9sZTsgKwotQ1JFQVRFIFJPTEUgYWxpY2UgV0lUSCBQQVNTV09SRCA9IGBwYXNzd29yZF9hJyBBTkQgTE9HSU4gPSB0cnVlOyArCi1DUkVBVEUgUk9MRSBib2IgV0lUSCBQQVNTV09SRCA9IGBwYXNzd29yZF9iJyBBTkQgTE9HSU4gPSB0cnVlIEFORAotU1VQRVJVU0VSID0gdHJ1ZTsgKwotQ1JFQVRFIFJPTEUgY2FybG9zIFdJVEggT1BUSU9OUyA9IFx7IGBjdXN0b21fb3B0aW9uMScgOiBgb3B0aW9uMV92YWx1ZScsCi1gY3VzdG9tX29wdGlvbjInIDogOTkgfTsKLQotQnkgZGVmYXVsdCByb2xlcyBkbyBub3QgcG9zc2VzcyBgTE9HSU5gIHByaXZpbGVnZXMgb3IgYFNVUEVSVVNFUmAKLXN0YXR1cy4KLQotbGluazojcGVybWlzc2lvbnNbUGVybWlzc2lvbnNdIG9uIGRhdGFiYXNlIHJlc291cmNlcyBhcmUgZ3JhbnRlZCB0bwotcm9sZXM7IHR5cGVzIG9mIHJlc291cmNlcyBpbmNsdWRlIGtleXNwYWNlcywgdGFibGVzLCBmdW5jdGlvbnMgYW5kIHJvbGVzCi10aGVtc2VsdmVzLiBSb2xlcyBtYXkgYmUgZ3JhbnRlZCB0byBvdGhlciByb2xlcyB0byBjcmVhdGUgaGllcmFyY2hpY2FsCi1wZXJtaXNzaW9ucyBzdHJ1Y3R1cmVzOyBpbiB0aGVzZSBoaWVyYXJjaGllcywgcGVybWlzc2lvbnMgYW5kCi1gU1VQRVJVU0VSYCBzdGF0dXMgYXJlIGluaGVyaXRlZCwgYnV0IHRoZSBgTE9HSU5gIHByaXZpbGVnZSBpcyBub3QuCi0KLUlmIGEgcm9sZSBoYXMgdGhlIGBMT0dJTmAgcHJpdmlsZWdlLCBjbGllbnRzIG1heSBpZGVudGlmeSBhcyB0aGF0IHJvbGUKLXdoZW4gY29ubmVjdGluZy4gRm9yIHRoZSBkdXJhdGlvbiBvZiB0aGF0IGNvbm5lY3Rpb24sIHRoZSBjbGllbnQgd2lsbAotYWNxdWlyZSBhbnkgcm9sZXMgYW5kIHByaXZpbGVnZXMgZ3JhbnRlZCB0byB0aGF0IHJvbGUuCi0KLU9ubHkgYSBjbGllbnQgd2l0aCB3aXRoIHRoZSBgQ1JFQVRFYCBwZXJtaXNzaW9uIG9uIHRoZSBkYXRhYmFzZSByb2xlcwotcmVzb3VyY2UgbWF5IGlzc3VlIGBDUkVBVEUgUk9MRWAgcmVxdWVzdHMgKHNlZSB0aGUKLWxpbms6I3Blcm1pc3Npb25zW3JlbGV2YW50IHNlY3Rpb25dIGJlbG93KSwgdW5sZXNzIHRoZSBjbGllbnQgaXMgYQotYFNVUEVSVVNFUmAuIFJvbGUgbWFuYWdlbWVudCBpbiBDYXNzYW5kcmEgaXMgcGx1Z2dhYmxlIGFuZCBjdXN0b20KLWltcGxlbWVudGF0aW9ucyBtYXkgc3VwcG9ydCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBsaXN0ZWQgb3B0aW9ucy4KLQotUm9sZSBuYW1lcyBzaG91bGQgYmUgcXVvdGVkIGlmIHRoZXkgY29udGFpbiBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuCi0KLVtbY3JlYXRlUm9sZVB3ZF1dCi09PT09PSBTZXR0aW5nIGNyZWRlbnRpYWxzIGZvciBpbnRlcm5hbCBhdXRoZW50aWNhdGlvbgotCi1Vc2UgdGhlIGBXSVRIIFBBU1NXT1JEYCBjbGF1c2UgdG8gc2V0IGEgcGFzc3dvcmQgZm9yIGludGVybmFsCi1hdXRoZW50aWNhdGlvbiwgZW5jbG9zaW5nIHRoZSBwYXNzd29yZCBpbiBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzLiArCi1JZiBpbnRlcm5hbCBhdXRoZW50aWNhdGlvbiBoYXMgbm90IGJlZW4gc2V0IHVwIG9yIHRoZSByb2xlIGRvZXMgbm90IGhhdmUKLWBMT0dJTmAgcHJpdmlsZWdlcywgdGhlIGBXSVRIIFBBU1NXT1JEYCBjbGF1c2UgaXMgbm90IG5lY2Vzc2FyeS4KLQotW1tjcmVhdGVSb2xlQ29uZGl0aW9uYWxdXQotPT09PT0gQ3JlYXRpbmcgYSByb2xlIGNvbmRpdGlvbmFsbHkKLQotQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gZXhpc3Rpbmcgcm9sZSByZXN1bHRzIGluIGFuIGludmFsaWQgcXVlcnkKLWNvbmRpdGlvbiB1bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgdGhlIG9wdGlvbiBpcwotdXNlZCBhbmQgdGhlIHJvbGUgZXhpc3RzLCB0aGUgc3RhdGVtZW50IGlzIGEgbm8tb3AuCi0KLWJjKHNhbXBsZSkuICsKLUNSRUFURSBST0xFIG90aGVyX3JvbGU7ICsKLUNSRUFURSBST0xFIElGIE5PVCBFWElTVFMgb3RoZXJfcm9sZTsKLQotW1thbHRlclJvbGVTdG10XV0KLT09PT0gQUxURVIgUk9MRQotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBBTFRFUiBST0xFIChJRiBFWElTVFMpPyAoIFdJVEggKCBBTkQgKSogKT8KLQotOjo9IFBBU1NXT1JEID0gICsKLXwgTE9HSU4gPSAgKwotfCBTVVBFUlVTRVIgPSAgKwotfCBPUFRJT05TID0gICsKLXAuCi0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLiArCi1BTFRFUiBST0xFIGJvYiBXSVRIIFBBU1NXT1JEID0gYFBBU1NXT1JEX0InIEFORCBTVVBFUlVTRVIgPSBmYWxzZTsKLQotSWYgdGhlIHJvbGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotCi1Db25kaXRpb25zIG9uIGV4ZWN1dGluZyBgQUxURVIgUk9MRWAgc3RhdGVtZW50czoKLQotKiBBIGNsaWVudCBtdXN0IGhhdmUgYFNVUEVSVVNFUmAgc3RhdHVzIHRvIGFsdGVyIHRoZSBgU1VQRVJVU0VSYCBzdGF0dXMKLW9mIGFub3RoZXIgcm9sZQotKiBBIGNsaWVudCBjYW5ub3QgYWx0ZXIgdGhlIGBTVVBFUlVTRVJgIHN0YXR1cyBvZiBhbnkgcm9sZSBpdCBjdXJyZW50bHkKLWhvbGRzCi0qIEEgY2xpZW50IGNhbiBvbmx5IG1vZGlmeSBjZXJ0YWluIHByb3BlcnRpZXMgb2YgdGhlIHJvbGUgd2l0aCB3aGljaCBpdAotaWRlbnRpZmllZCBhdCBsb2dpbiAoZS5nLiBgUEFTU1dPUkRgKQotKiBUbyBtb2RpZnkgcHJvcGVydGllcyBvZiBhIHJvbGUsIHRoZSBjbGllbnQgbXVzdCBiZSBncmFudGVkIGBBTFRFUmAKLWxpbms6I3Blcm1pc3Npb25zW3Blcm1pc3Npb25dIG9uIHRoYXQgcm9sZQotCi1bW2Ryb3BSb2xlU3RtdF1dCi09PT09IERST1AgUk9MRQotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBEUk9QIFJPTEUgKCBJRiBFWElTVFMgKT8gICsKLXAuCi0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLiArCi1EUk9QIFJPTEUgYWxpY2U7ICsKLURST1AgUk9MRSBJRiBFWElTVFMgYm9iOwotCi1gRFJPUCBST0xFYCByZXF1aXJlcyB0aGUgY2xpZW50IHRvIGhhdmUgYERST1BgCi1saW5rOiNwZXJtaXNzaW9uc1twZXJtaXNzaW9uXSBvbiB0aGUgcm9sZSBpbiBxdWVzdGlvbi4gSW4gYWRkaXRpb24sCi1jbGllbnQgbWF5IG5vdCBgRFJPUGAgdGhlIHJvbGUgd2l0aCB3aGljaCBpdCBpZGVudGlmaWVkIGF0IGxvZ2luLgotRmluYWx5LCBvbmx5IGEgY2xpZW50IHdpdGggYFNVUEVSVVNFUmAgc3RhdHVzIG1heSBgRFJPUGAgYW5vdGhlcgotYFNVUEVSVVNFUmAgcm9sZS4gKwotQXR0ZW1wdGluZyB0byBkcm9wIGEgcm9sZSB3aGljaCBkb2VzIG5vdCBleGlzdCByZXN1bHRzIGluIGFuIGludmFsaWQKLXF1ZXJ5IGNvbmRpdGlvbiB1bmxlc3MgdGhlIGBJRiBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiB0aGUgb3B0aW9uIGlzCi11c2VkIGFuZCB0aGUgcm9sZSBkb2VzIG5vdCBleGlzdCB0aGUgc3RhdGVtZW50IGlzIGEgbm8tb3AuCi0KLVtbZ3JhbnRSb2xlU3RtdF1dCi09PT09IEdSQU5UIFJPTEUKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuICsKLTo6PSBHUkFOVCBUTwotCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gKwotR1JBTlQgcmVwb3J0X3dyaXRlciBUTyBhbGljZTsKLQotVGhpcyBzdGF0ZW1lbnQgZ3JhbnRzIHRoZSBgcmVwb3J0X3dyaXRlcmAgcm9sZSB0byBgYWxpY2VgLiBBbnkKLXBlcm1pc3Npb25zIGdyYW50ZWQgdG8gYHJlcG9ydF93cml0ZXJgIGFyZSBhbHNvIGFjcXVpcmVkIGJ5IGBhbGljZWAuICsKLVJvbGVzIGFyZSBtb2RlbGxlZCBhcyBhIGRpcmVjdGVkIGFjeWNsaWMgZ3JhcGgsIHNvIGNpcmN1bGFyIGdyYW50cyBhcmUKLW5vdCBwZXJtaXR0ZWQuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgcmVzdWx0IGluIGVycm9yIGNvbmRpdGlvbnM6Ci0KLWJjKHNhbXBsZSkuICsKLUdSQU5UIHJvbGVfYSBUTyByb2xlX2I7ICsKLUdSQU5UIHJvbGVfYiBUTyByb2xlX2E7Ci0KLWJjKHNhbXBsZSkuICsKLUdSQU5UIHJvbGVfYSBUTyByb2xlX2I7ICsKLUdSQU5UIHJvbGVfYiBUTyByb2xlX2M7ICsKLUdSQU5UIHJvbGVfYyBUTyByb2xlX2E7Ci0KLVtbcmV2b2tlUm9sZVN0bXRdXQotPT09PSBSRVZPS0UgUk9MRQotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4gKwotOjo9IFJFVk9LRSBGUk9NCi0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLiArCi1SRVZPS0UgcmVwb3J0X3dyaXRlciBGUk9NIGFsaWNlOwotCi1UaGlzIHN0YXRlbWVudCByZXZva2VzIHRoZSBgcmVwb3J0X3dyaXRlcmAgcm9sZSBmcm9tIGBhbGljZWAuIEFueQotcGVybWlzc2lvbnMgdGhhdCBgYWxpY2VgIGhhcyBhY3F1aXJlZCB2aWEgdGhlIGByZXBvcnRfd3JpdGVyYCByb2xlIGFyZQotYWxzbyByZXZva2VkLgotCi1bW2xpc3RSb2xlc1N0bXRdXQotPT09PT0gTElTVCBST0xFUwotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4gKwotOjo9IExJU1QgUk9MRVMgKCBPRiApPyAoIE5PUkVDVVJTSVZFICk/Ci0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLiArCi1MSVNUIFJPTEVTOwotCi1SZXR1cm4gYWxsIGtub3duIHJvbGVzIGluIHRoZSBzeXN0ZW0sIHRoaXMgcmVxdWlyZXMgYERFU0NSSUJFYAotcGVybWlzc2lvbiBvbiB0aGUgZGF0YWJhc2Ugcm9sZXMgcmVzb3VyY2UuCi0KLWJjKHNhbXBsZSkuICsKLUxJU1QgUk9MRVMgT0YgYGFsaWNlYDsKLQotRW51bWVyYXRlIGFsbCByb2xlcyBncmFudGVkIHRvIGBhbGljZWAsIGluY2x1ZGluZyB0aG9zZSB0cmFuc2l0aXZlbHkKLWFxdWlyZWQuCi0KLWJjKHNhbXBsZSkuICsKLUxJU1QgUk9MRVMgT0YgYGJvYmAgTk9SRUNVUlNJVkUKLQotTGlzdCBhbGwgcm9sZXMgZGlyZWN0bHkgZ3JhbnRlZCB0byBgYm9iYC4KLQotW1tjcmVhdGVVc2VyU3RtdF1dCi09PT09IENSRUFURSBVU0VSCi0KLVByaW9yIHRvIHRoZSBpbnRyb2R1Y3Rpb24gb2Ygcm9sZXMgaW4gQ2Fzc2FuZHJhIDIuMiwgYXV0aGVudGljYXRpb24gYW5kCi1hdXRob3JpemF0aW9uIHdlcmUgYmFzZWQgYXJvdW5kIHRoZSBjb25jZXB0IG9mIGEgYFVTRVJgLiBGb3IgYmFja3dhcmQKLWNvbXBhdGliaWxpdHksIHRoZSBsZWdhY3kgc3ludGF4IGhhcyBiZWVuIHByZXNlcnZlZCB3aXRoIGBVU0VSYCBjZW50cmljCi1zdGF0bWVudHMgYmVjb21pbmcgc3lub255bXMgZm9yIHRoZSBgUk9MRWAgYmFzZWQgZXF1aXZhbGVudHMuCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IENSRUFURSBVU0VSICggSUYgTk9UIEVYSVNUUyApPyAoIFdJVEggUEFTU1dPUkQgKT8gKCk/Ci0KLTo6PSBTVVBFUlVTRVIgKwotfCBOT1NVUEVSVVNFUiArCi1wLgotCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4gKwotQ1JFQVRFIFVTRVIgYWxpY2UgV0lUSCBQQVNTV09SRCBgcGFzc3dvcmRfYScgU1VQRVJVU0VSOyArCi1DUkVBVEUgVVNFUiBib2IgV0lUSCBQQVNTV09SRCBgcGFzc3dvcmRfYicgTk9TVVBFUlVTRVI7Ci0KLWBDUkVBVEUgVVNFUmAgaXMgZXF1aXZhbGVudCB0byBgQ1JFQVRFIFJPTEVgIHdoZXJlIHRoZSBgTE9HSU5gIG9wdGlvbiBpcwotYHRydWVgLiBTbywgdGhlIGZvbGxvd2luZyBwYWlycyBvZiBzdGF0ZW1lbnRzIGFyZSBlcXVpdmFsZW50OgotCi1iYyhzYW1wbGUpLi4gKwotQ1JFQVRFIFVTRVIgYWxpY2UgV0lUSCBQQVNTV09SRCBgcGFzc3dvcmRfYScgU1VQRVJVU0VSOyArCi1DUkVBVEUgUk9MRSBhbGljZSBXSVRIIFBBU1NXT1JEID0gYHBhc3N3b3JkX2EnIEFORCBMT0dJTiA9IHRydWUgQU5ECi1TVVBFUlVTRVIgPSB0cnVlOwotCi1DUkVBVEUgVVNFUiBJRiBOT1QgRVhJU1RTIGFsaWNlIFdJVEggUEFTU1dPUkQgYHBhc3N3b3JkX2EnIFNVUEVSVVNFUjsgKwotQ1JFQVRFIFJPTEUgSUYgTk9UIEVYSVNUUyBhbGljZSBXSVRIIFBBU1NXT1JEID0gYHBhc3N3b3JkX2EnIEFORCBMT0dJTiA9Ci10cnVlIEFORCBTVVBFUlVTRVIgPSB0cnVlOwotCi1DUkVBVEUgVVNFUiBhbGljZSBXSVRIIFBBU1NXT1JEIGBwYXNzd29yZF9hJyBOT1NVUEVSVVNFUjsgKwotQ1JFQVRFIFJPTEUgYWxpY2UgV0lUSCBQQVNTV09SRCA9IGBwYXNzd29yZF9hJyBBTkQgTE9HSU4gPSB0cnVlIEFORAotU1VQRVJVU0VSID0gZmFsc2U7Ci0KLUNSRUFURSBVU0VSIGFsaWNlIFdJVEggUEFTU1dPUkQgYHBhc3N3b3JkX2EnIE5PU1VQRVJVU0VSOyArCi1DUkVBVEUgUk9MRSBhbGljZSBXSVRIIFBBU1NXT1JEID0gYHBhc3N3b3JkX2EnIEFORCBMT0dJTiA9IHRydWU7Ci0KLUNSRUFURSBVU0VSIGFsaWNlIFdJVEggUEFTU1dPUkQgYHBhc3N3b3JkX2EnOyArCi1DUkVBVEUgUk9MRSBhbGljZSBXSVRIIFBBU1NXT1JEID0gYHBhc3N3b3JkX2EnIEFORCBMT0dJTiA9IHRydWU7ICsKLXAuCi0KLVtbYWx0ZXJVc2VyU3RtdF1dCi09PT09IEFMVEVSIFVTRVIKLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gQUxURVIgVVNFUiAoSUYgRVhJU1RTKT8gKCBXSVRIIFBBU1NXT1JEICk/ICggKT8KLQotOjo9IFNVUEVSVVNFUiArCi18IE5PU1VQRVJVU0VSICsKLXAuCi0KLWJjKHNhbXBsZSkuICsKLUFMVEVSIFVTRVIgYWxpY2UgV0lUSCBQQVNTV09SRCBgUEFTU1dPUkRfQSc7ICsKLUFMVEVSIFVTRVIgYm9iIFNVUEVSVVNFUjsKLQotSWYgdGhlIHVzZXIgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotCi1bW2Ryb3BVc2VyU3RtdF1dCi09PT09IERST1AgVVNFUgotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBEUk9QIFVTRVIgKCBJRiBFWElTVFMgKT8gICsKLXAuCi0KLV9TYW1wbGU6XwotCi1iYyhzYW1wbGUpLiArCi1EUk9QIFVTRVIgYWxpY2U7ICsKLURST1AgVVNFUiBJRiBFWElTVFMgYm9iOwotCi1bW2xpc3RVc2Vyc1N0bXRdXQotPT09PSBMSVNUIFVTRVJTCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLiArCi06Oj0gTElTVCBVU0VSUzsKLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLUxJU1QgVVNFUlM7Ci0KLVRoaXMgc3RhdGVtZW50IGlzIGVxdWl2YWxlbnQgdG8KLQotYmMoc2FtcGxlKS4gKwotTElTVCBST0xFUzsKLQotYnV0IG9ubHkgcm9sZXMgd2l0aCB0aGUgYExPR0lOYCBwcml2aWxlZ2UgYXJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCi0KLVtbZGF0YUNvbnRyb2xdXQotPT09IERhdGEgQ29udHJvbAotCi09PT09IFBlcm1pc3Npb25zCi0KLVBlcm1pc3Npb25zIG9uIHJlc291cmNlcyBhcmUgZ3JhbnRlZCB0byByb2xlczsgdGhlcmUgYXJlIHNldmVyYWwKLWRpZmZlcmVudCB0eXBlcyBvZiByZXNvdXJjZXMgaW4gQ2Fzc2FuZHJhIGFuZCBlYWNoIHR5cGUgaXMgbW9kZWxsZWQKLWhpZXJhcmNoaWNhbGx5OgotCi0qIFRoZSBoaWVyYXJjaHkgb2YgRGF0YSByZXNvdXJjZXMsIEtleXNwYWNlcyBhbmQgVGFibGVzIGhhcyB0aGUKLXN0cnVjdHVyZSBgQUxMIEtFWVNQQUNFU2AgLT4gYEtFWVNQQUNFYCAtPiBgVEFCTEVgCi0qIEZ1bmN0aW9uIHJlc291cmNlcyBoYXZlIHRoZSBzdHJ1Y3R1cmUgYEFMTCBGVU5DVElPTlNgIC0+IGBLRVlTUEFDRWAgLT4KLWBGVU5DVElPTmAKLSogUmVzb3VyY2VzIHJlcHJlc2VudGluZyByb2xlcyBoYXZlIHRoZSBzdHJ1Y3R1cmUgYEFMTCBST0xFU2AgLT4gYFJPTEVgCi0qIFJlc291cmNlcyByZXByZXNlbnRpbmcgSk1YIE9iamVjdE5hbWVzLCB3aGljaCBtYXAgdG8gc2V0cyBvZgotTUJlYW5zL01YQmVhbnMsIGhhdmUgdGhlIHN0cnVjdHVyZSBgQUxMIE1CRUFOU2AgLT4gYE1CRUFOYAotCi1QZXJtaXNzaW9ucyBjYW4gYmUgZ3JhbnRlZCBhdCBhbnkgbGV2ZWwgb2YgdGhlc2UgaGllcmFyY2hpZXMgYW5kIHRoZXkKLWZsb3cgZG93bndhcmRzLiBTbyBncmFudGluZyBhIHBlcm1pc3Npb24gb24gYSByZXNvdXJjZSBoaWdoZXIgdXAgdGhlCi1jaGFpbiBhdXRvbWF0aWNhbGx5IGdyYW50cyB0aGF0IHNhbWUgcGVybWlzc2lvbiBvbiBhbGwgcmVzb3VyY2VzIGxvd2VyCi1kb3duLiBGb3IgZXhhbXBsZSwgZ3JhbnRpbmcgYFNFTEVDVGAgb24gYSBgS0VZU1BBQ0VgIGF1dG9tYXRpY2FsbHkKLWdyYW50cyBpdCBvbiBhbGwgYFRBQkxFU2AgaW4gdGhhdCBgS0VZU1BBQ0VgLiBMaWtld2lzZSwgZ3JhbnRpbmcgYQotcGVybWlzc2lvbiBvbiBgQUxMIEZVTkNUSU9OU2AgZ3JhbnRzIGl0IG9uIGV2ZXJ5IGRlZmluZWQgZnVuY3Rpb24sCi1yZWdhcmRsZXNzIG9mIHdoaWNoIGtleXNwYWNlIGl0IGlzIHNjb3BlZCBpbi4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0bwotZ3JhbnQgcGVybWlzc2lvbnMgb24gYWxsIGZ1bmN0aW9ucyBzY29wZWQgdG8gYSBwYXJ0aWN1bGFyIGtleXNwYWNlLgotCi1Nb2RpZmljYXRpb25zIHRvIHBlcm1pc3Npb25zIGFyZSB2aXNpYmxlIHRvIGV4aXN0aW5nIGNsaWVudCBzZXNzaW9uczsKLXRoYXQgaXMsIGNvbm5lY3Rpb25zIG5lZWQgbm90IGJlIHJlLWVzdGFibGlzaGVkIGZvbGxvd2luZyBwZXJtaXNzaW9ucwotY2hhbmdlcy4KLQotVGhlIGZ1bGwgc2V0IG9mIGF2YWlsYWJsZSBwZXJtaXNzaW9ucyBpczoKLQotKiBgQ1JFQVRFYAotKiBgQUxURVJgCi0qIGBEUk9QYAotKiBgU0VMRUNUYAotKiBgTU9ESUZZYAotKiBgQVVUSE9SSVpFYAotKiBgREVTQ1JJQkVgCi0qIGBFWEVDVVRFYAotCi1Ob3QgYWxsIHBlcm1pc3Npb25zIGFyZSBhcHBsaWNhYmxlIHRvIGV2ZXJ5IHR5cGUgb2YgcmVzb3VyY2UuIEZvcgotaW5zdGFuY2UsIGBFWEVDVVRFYCBpcyBvbmx5IHJlbGV2YW50IGluIHRoZSBjb250ZXh0IG9mIGZ1bmN0aW9ucyBvcgotbWJlYW5zOyBncmFudGluZyBgRVhFQ1VURWAgb24gYSByZXNvdXJjZSByZXByZXNlbnRpbmcgYSB0YWJsZSBpcwotbm9uc2Vuc2ljYWwuIEF0dGVtcHRpbmcgdG8gYEdSQU5UYCBhIHBlcm1pc3Npb24gb24gcmVzb3VyY2UgdG8gd2hpY2ggaXQKLWNhbm5vdCBiZSBhcHBsaWVkIHJlc3VsdHMgaW4gYW4gZXJyb3IgcmVzcG9uc2UuIFRoZSBmb2xsb3dpbmcKLWlsbHVzdHJhdGVzIHdoaWNoIHBlcm1pc3Npb25zIGNhbiBiZSBncmFudGVkIG9uIHdoaWNoIHR5cGVzIG9mIHJlc291cmNlLAotYW5kIHdoaWNoIHN0YXRlbWVudHMgYXJlIGVuYWJsZWQgYnkgdGhhdCBwZXJtaXNzaW9uLgotCi1bY29scz0iLCwsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfHBlcm1pc3Npb24gfHJlc291cmNlIHxvcGVyYXRpb25zIHwgfCB8Ci18YENSRUFURWAgfGBBTEwgS0VZU1BBQ0VTYCB8YENSRUFURSBLRVlTUEFDRWAgPGJyPiBgQ1JFQVRFIFRBQkxFYCBpbiBhbnkKLWtleXNwYWNlIHwgfCB8Ci0KLXxgQ1JFQVRFYCB8YEtFWVNQQUNFYCB8YENSRUFURSBUQUJMRWAgaW4gc3BlY2lmaWVkIGtleXNwYWNlIHwgfCB8Ci0KLXxgQ1JFQVRFYCB8YEFMTCBGVU5DVElPTlNgIHxgQ1JFQVRFIEZVTkNUSU9OYCBpbiBhbnkga2V5c3BhY2UgPGJyPgotYENSRUFURSBBR0dSRUdBVEVgIGluIGFueSBrZXlzcGFjZSB8IHwgfAotCi18YENSRUFURWAgfGBBTEwgRlVOQ1RJT05TIElOIEtFWVNQQUNFYCB8YENSRUFURSBGVU5DVElPTmAgaW4ga2V5c3BhY2UKLTxicj4gYENSRUFURSBBR0dSRUdBVEVgIGluIGtleXNwYWNlIHwgfCB8Ci0KLXxgQ1JFQVRFYCB8YEFMTCBST0xFU2AgfGBDUkVBVEUgUk9MRWAgfCB8IHwKLQotfGBBTFRFUmAgfGBBTEwgS0VZU1BBQ0VTYCB8YEFMVEVSIEtFWVNQQUNFYCA8YnI+IGBBTFRFUiBUQUJMRWAgaW4gYW55Ci1rZXlzcGFjZSB8IHwgfAotCi18YEFMVEVSYCB8YEtFWVNQQUNFYCB8YEFMVEVSIEtFWVNQQUNFYCA8YnI+IGBBTFRFUiBUQUJMRWAgaW4ga2V5c3BhY2UgfAotfCB8Ci0KLXxgQUxURVJgIHxgVEFCTEVgIHxgQUxURVIgVEFCTEVgIHwgfCB8Ci0KLXxgQUxURVJgIHxgQUxMIEZVTkNUSU9OU2AgfGBDUkVBVEUgRlVOQ1RJT05gIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgPGJyPgotYENSRUFURSBBR0dSRUdBVEVgIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgfCB8IHwKLQotfGBBTFRFUmAgfGBBTEwgRlVOQ1RJT05TIElOIEtFWVNQQUNFYCB8YENSRUFURSBGVU5DVElPTmAgcmVwbGFjaW5nCi1leGlzdGluZyBpbiBrZXlzcGFjZSA8YnI+IGBDUkVBVEUgQUdHUkVHQVRFYCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIGluCi1rZXlzcGFjZSB8IHwgfAotCi18YEFMVEVSYCB8YEZVTkNUSU9OYCB8YENSRUFURSBGVU5DVElPTmAgcmVwbGFjaW5nIGV4aXN0aW5nIDxicj4KLWBDUkVBVEUgQUdHUkVHQVRFYCByZXBsYWNpbmcgZXhpc3RpbmcgfCB8IHwKLQotfGBBTFRFUmAgfGBBTEwgUk9MRVNgIHxgQUxURVIgUk9MRWAgb24gYW55IHJvbGUgfCB8IHwKLQotfGBBTFRFUmAgfGBST0xFYCB8YEFMVEVSIFJPTEVgIHwgfCB8Ci0KLXxgRFJPUGAgfGBBTEwgS0VZU1BBQ0VTYCB8YERST1AgS0VZU1BBQ0VgIDxicj4gYERST1AgVEFCTEVgIGluIGFueQota2V5c3BhY2UgfCB8IHwKLQotfGBEUk9QYCB8YEtFWVNQQUNFYCB8YERST1AgVEFCTEVgIGluIHNwZWNpZmllZCBrZXlzcGFjZSB8IHwgfAotCi18YERST1BgIHxgVEFCTEVgIHxgRFJPUCBUQUJMRWAgfCB8IHwKLQotfGBEUk9QYCB8YEFMTCBGVU5DVElPTlNgIHxgRFJPUCBGVU5DVElPTmAgaW4gYW55IGtleXNwYWNlIDxicj4KLWBEUk9QIEFHR1JFR0FURWAgaW4gYW55IGV4aXN0aW5nIHwgfCB8Ci0KLXxgRFJPUGAgfGBBTEwgRlVOQ1RJT05TIElOIEtFWVNQQUNFYCB8YERST1AgRlVOQ1RJT05gIGluIGtleXNwYWNlIDxicj4KLWBEUk9QIEFHR1JFR0FURWAgaW4gZXhpc3RpbmcgfCB8IHwKLQotfGBEUk9QYCB8YEZVTkNUSU9OYCB8YERST1AgRlVOQ1RJT05gIHwgfCB8Ci0KLXxgRFJPUGAgfGBBTEwgUk9MRVNgIHxgRFJPUCBST0xFYCBvbiBhbnkgcm9sZSB8IHwgfAotCi18YERST1BgIHxgUk9MRWAgfGBEUk9QIFJPTEVgIHwgfCB8Ci0KLXxgU0VMRUNUYCB8YEFMTCBLRVlTUEFDRVNgIHxgU0VMRUNUYCBvbiBhbnkgdGFibGUgfCB8IHwKLQotfGBTRUxFQ1RgIHxgS0VZU1BBQ0VgIHxgU0VMRUNUYCBvbiBhbnkgdGFibGUgaW4ga2V5c3BhY2UgfCB8IHwKLQotfGBTRUxFQ1RgIHxgVEFCTEVgIHxgU0VMRUNUYCBvbiBzcGVjaWZpZWQgdGFibGUgfCB8IHwKLQotfGBTRUxFQ1RgIHxgQUxMIE1CRUFOU2AgfENhbGwgZ2V0dGVyIG1ldGhvZHMgb24gYW55IG1iZWFuIHwgfCB8Ci0KLXxgU0VMRUNUYCB8YE1CRUFOU2AgfENhbGwgZ2V0dGVyIG1ldGhvZHMgb24gYW55IG1iZWFuIG1hdGNoaW5nIGEKLXdpbGRjYXJkIHBhdHRlcm4gfCB8IHwKLQotfGBTRUxFQ1RgIHxgTUJFQU5gIHxDYWxsIGdldHRlciBtZXRob2RzIG9uIG5hbWVkIG1iZWFuIHwgfCB8Ci0KLXxgTU9ESUZZYCB8YEFMTCBLRVlTUEFDRVNgIHxgSU5TRVJUYCBvbiBhbnkgdGFibGUgPGJyPiBgVVBEQVRFYCBvbiBhbnkKLXRhYmxlIDxicj4gYERFTEVURWAgb24gYW55IHRhYmxlIDxicj4gYFRSVU5DQVRFYCBvbiBhbnkgdGFibGUgfCB8IHwKLQotfGBNT0RJRllgIHxgS0VZU1BBQ0VgIHxgSU5TRVJUYCBvbiBhbnkgdGFibGUgaW4ga2V5c3BhY2UgPGJyPiBgVVBEQVRFYAotb24gYW55IHRhYmxlIGluIGtleXNwYWNlIDxicj4gICBgREVMRVRFYCBvbiBhbnkgdGFibGUgaW4ga2V5c3BhY2UgPGJyPgotYFRSVU5DQVRFYCBvbiBhbnkgdGFibGUgaW4ga2V5c3BhY2UgfGBNT0RJRllgIHxgVEFCTEVgIHxgSU5TRVJUYCA8YnI+Ci1gVVBEQVRFYCA8YnI+IGBERUxFVEVgIDxicj4gYFRSVU5DQVRFYAotCi18YE1PRElGWWAgfGBBTEwgTUJFQU5TYCB8Q2FsbCBzZXR0ZXIgbWV0aG9kcyBvbiBhbnkgbWJlYW4gfCB8IHwKLQotfGBNT0RJRllgIHxgTUJFQU5TYCB8Q2FsbCBzZXR0ZXIgbWV0aG9kcyBvbiBhbnkgbWJlYW4gbWF0Y2hpbmcgYQotd2lsZGNhcmQgcGF0dGVybiB8IHwgfAotCi18YE1PRElGWWAgfGBNQkVBTmAgfENhbGwgc2V0dGVyIG1ldGhvZHMgb24gbmFtZWQgbWJlYW4gfCB8IHwKLQotfGBBVVRIT1JJWkVgIHxgQUxMIEtFWVNQQUNFU2AgfGBHUkFOVCBQRVJNSVNTSU9OYCBvbiBhbnkgdGFibGUgPGJyPgotYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBhbnkgdGFibGUgfCB8IHwKLQotfGBBVVRIT1JJWkVgIHxgS0VZU1BBQ0VgIHxgR1JBTlQgUEVSTUlTU0lPTmAgb24gdGFibGUgaW4ga2V5c3BhY2UgPGJyPgotYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiB0YWJsZSBpbiBrZXlzcGFjZSB8IHwgfAotCi18YEFVVEhPUklaRWAgfGBUQUJMRWAgfGBHUkFOVCBQRVJNSVNTSU9OYCA8YnI+IGBSRVZPS0UgUEVSTUlTU0lPTmAgfCB8IHwKLQotfGBBVVRIT1JJWkVgIHxgQUxMIEZVTkNUSU9OU2AgfGBHUkFOVCBQRVJNSVNTSU9OYCBvbiBhbnkgZnVuY3Rpb24gPGJyPgotYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBhbnkgZnVuY3Rpb24gfCB8IHwKLQotfGBBVVRIT1JJWkVgIHxgQUxMIEZVTkNUSU9OUyBJTiBLRVlTUEFDRWAgfGBHUkFOVCBQRVJNSVNTSU9OYCBpbgota2V5c3BhY2UgPGJyPiBgUkVWT0tFIFBFUk1JU1NJT05gIGluIGtleXNwYWNlIHwgfCB8Ci0KLXxgQVVUSE9SSVpFYCB8YEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHxgR1JBTlQgUEVSTUlTU0lPTmAgaW4KLWtleXNwYWNlIDxicj4gYFJFVk9LRSBQRVJNSVNTSU9OYCBpbiBrZXlzcGFjZSB8IHwgfAotCi18YEFVVEhPUklaRWAgfGBGVU5DVElPTmAgfGBHUkFOVCBQRVJNSVNTSU9OYCA8YnI+IGBSRVZPS0UgUEVSTUlTU0lPTmAgfAotfCB8Ci0KLXxgQVVUSE9SSVpFYCB8YEFMTCBNQkVBTlNgIHxgR1JBTlQgUEVSTUlTU0lPTmAgb24gYW55IG1iZWFuIDxicj4KLWBSRVZPS0UgUEVSTUlTU0lPTmAgb24gYW55IG1iZWFuIHwgfCB8Ci0KLXxgQVVUSE9SSVpFYCB8YE1CRUFOU2AgfGBHUkFOVCBQRVJNSVNTSU9OYCBvbiBhbnkgbWJlYW4gbWF0Y2hpbmcgYQotd2lsZGNhcmQgcGF0dGVybiA8YnI+IGBSRVZPS0UgUEVSTUlTU0lPTmAgb24gYW55IG1iZWFuIG1hdGNoaW5nIGEKLXdpbGRjYXJkIHBhdHRlcm4gfCB8IHwKLQotfGBBVVRIT1JJWkVgIHxgTUJFQU5gIHxgR1JBTlQgUEVSTUlTU0lPTmAgb24gbmFtZWQgbWJlYW4gPGJyPgotYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBuYW1lZCBtYmVhbiB8IHwgfAotCi18YEFVVEhPUklaRWAgfGBBTEwgUk9MRVNgIHxgR1JBTlQgUk9MRWAgZ3JhbnQgYW55IHJvbGUgPGJyPgotYFJFVk9LRSBST0xFYCByZXZva2UgYW55IHJvbGUgfCB8IHwKLQotfGBBVVRIT1JJWkVgIHxgUk9MRVNgIHxgR1JBTlQgUk9MRWAgZ3JhbnQgcm9sZSA8YnI+IGBSRVZPS0UgUk9MRWAgcmV2b2tlCi1yb2xlIHwgfCB8Ci0KLXxgREVTQ1JJQkVgIHxgQUxMIFJPTEVTYCB8YExJU1QgUk9MRVNgIGFsbCByb2xlcyBvciBvbmx5IHJvbGVzIGdyYW50ZWQKLXRvIGFub3RoZXIsIHNwZWNpZmllZCByb2xlIHwgfCB8Ci0KLXxgREVTQ1JJQkVgIHxAQUxMIE1CRUFOUyB8UmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgYW55IG1iZWFuIGZyb20gdGhlCi1wbGF0Zm9ybeKAmXMgTUJlYW5TZXJ2ZXIgfCB8IHwKLQotfGBERVNDUklCRWAgfEBNQkVBTlMgfFJldHJpZXZlIG1ldGFkYXRhIGFib3V0IGFueSBtYmVhbiBtYXRjaGluZyBhCi13aWxkY2FyZCBwYXR0ZXIgZnJvbSB0aGUgcGxhdGZvcm3igJlzIE1CZWFuU2VydmVyIHwgfCB8Ci0KLXxgREVTQ1JJQkVgIHxATUJFQU4gfFJldHJpZXZlIG1ldGFkYXRhIGFib3V0IGEgbmFtZWQgbWJlYW4gZnJvbSB0aGUKLXBsYXRmb3Jt4oCZcyBNQmVhblNlcnZlciB8IHwgfAotCi18YEVYRUNVVEVgIHxgQUxMIEZVTkNUSU9OU2AgfGBTRUxFQ1RgLCBgSU5TRVJUYCwgYFVQREFURWAgdXNpbmcgYW55Ci1mdW5jdGlvbiA8YnI+IHVzZSBvZiBhbnkgZnVuY3Rpb24gaW4gYENSRUFURSBBR0dSRUdBVEVgIHwgfCB8Ci0KLXxgRVhFQ1VURWAgfGBBTEwgRlVOQ1RJT05TIElOIEtFWVNQQUNFYCB8YFNFTEVDVGAsIGBJTlNFUlRgLCBgVVBEQVRFYAotdXNpbmcgYW55IGZ1bmN0aW9uIGluIGtleXNwYWNlIDxicj4gdXNlIG9mIGFueSBmdW5jdGlvbiBpbiBrZXlzcGFjZSBpbgotYENSRUFURSBBR0dSRUdBVEVgIHwgfCB8Ci0KLXxgRVhFQ1VURWAgfGBGVU5DVElPTmAgfGBTRUxFQ1RgLCBgSU5TRVJUYCwgYFVQREFURWAgdXNpbmcgZnVuY3Rpb24gPGJyPgotdXNlIG9mIGZ1bmN0aW9uIGluIGBDUkVBVEUgQUdHUkVHQVRFYCB8IHwgfAotCi18YEVYRUNVVEVgIHxgQUxMIE1CRUFOU2AgfEV4ZWN1dGUgb3BlcmF0aW9ucyBvbiBhbnkgbWJlYW4gfCB8IHwKLQotfGBFWEVDVVRFYCB8YE1CRUFOU2AgfEV4ZWN1dGUgb3BlcmF0aW9ucyBvbiBhbnkgbWJlYW4gbWF0Y2hpbmcgYQotd2lsZGNhcmQgcGF0dGVybiB8IHwgfAotCi18YEVYRUNVVEVgIHxgTUJFQU5gIHxFeGVjdXRlIG9wZXJhdGlvbnMgb24gbmFtZWQgbWJlYW4gfCB8IHwKLXw9PT0KLQotW1tncmFudFBlcm1pc3Npb25zU3RtdF1dCi09PT09IEdSQU5UIFBFUk1JU1NJT04KLQotX1N5bnRheDpfCi0KLWJjKHN5bnRheCkuLiArCi06Oj0gR1JBTlQgKCBBTEwgKCBQRVJNSVNTSU9OUyApPyB8ICggUEVSTUlTU0lPTiApPyApIE9OIFRPCi0KLTo6PSBDUkVBVEUgfCBBTFRFUiB8IERST1AgfCBTRUxFQ1QgfCBNT0RJRlkgfCBBVVRIT1JJWkUgfCBERVNSSUJFIHwKLUVYRUNVVEUKLQotOjo9IEFMTCBLRVlTUEFDRVMgKwotfCBLRVlTUEFDRSAgKwotfCAoIFRBQkxFICk/ICArCi18IEFMTCBST0xFUyArCi18IFJPTEUgICsKLXwgQUxMIEZVTkNUSU9OUyAoIElOIEtFWVNQQUNFICk/ICsKLXwgRlVOQ1RJT04gICsKLXwgQUxMIE1CRUFOUyArCi18ICggTUJFQU4gfCBNQkVBTlMgKSAgKwotcC4KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLUdSQU5UIFNFTEVDVCBPTiBBTEwgS0VZU1BBQ0VTIFRPIGRhdGFfcmVhZGVyOwotCi1UaGlzIGdpdmVzIGFueSB1c2VyIHdpdGggdGhlIHJvbGUgYGRhdGFfcmVhZGVyYCBwZXJtaXNzaW9uIHRvIGV4ZWN1dGUKLWBTRUxFQ1RgIHN0YXRlbWVudHMgb24gYW55IHRhYmxlIGFjcm9zcyBhbGwga2V5c3BhY2VzCi0KLWJjKHNhbXBsZSkuICsKLUdSQU5UIE1PRElGWSBPTiBLRVlTUEFDRSBrZXlzcGFjZTEgVE8gZGF0YV93cml0ZXI7Ci0KLVRoaXMgZ2l2ZSBhbnkgdXNlciB3aXRoIHRoZSByb2xlIGBkYXRhX3dyaXRlcmAgcGVybWlzc2lvbiB0byBwZXJmb3JtCi1gVVBEQVRFYCwgYElOU0VSVGAsIGBVUERBVEVgLCBgREVMRVRFYCBhbmQgYFRSVU5DQVRFYCBxdWVyaWVzIG9uIGFsbAotdGFibGVzIGluIHRoZSBga2V5c3BhY2UxYCBrZXlzcGFjZQotCi1iYyhzYW1wbGUpLiArCi1HUkFOVCBEUk9QIE9OIGtleXNwYWNlMS50YWJsZTEgVE8gc2NoZW1hX293bmVyOwotCi1UaGlzIGdpdmVzIGFueSB1c2VyIHdpdGggdGhlIGBzY2hlbWFfb3duZXJgIHJvbGUgcGVybWlzc2lvbnMgdG8gYERST1BgCi1ga2V5c3BhY2UxLnRhYmxlMWAuCi0KLWJjKHNhbXBsZSkuICsKLUdSQU5UIEVYRUNVVEUgT04gRlVOQ1RJT04ga2V5c3BhY2UxLnVzZXJfZnVuY3Rpb24oIGludCApIFRPCi1yZXBvcnRfd3JpdGVyOwotCi1UaGlzIGdyYW50cyBhbnkgdXNlciB3aXRoIHRoZSBgcmVwb3J0X3dyaXRlcmAgcm9sZSBwZXJtaXNzaW9uIHRvIGV4ZWN1dGUKLWBTRUxFQ1RgLCBgSU5TRVJUYCBhbmQgYFVQREFURWAgcXVlcmllcyB3aGljaCB1c2UgdGhlIGZ1bmN0aW9uCi1ga2V5c3BhY2UxLnVzZXJfZnVuY3Rpb24oIGludCApYAotCi1iYyhzYW1wbGUpLiArCi1HUkFOVCBERVNDUklCRSBPTiBBTEwgUk9MRVMgVE8gcm9sZV9hZG1pbjsKLQotVGhpcyBncmFudHMgYW55IHVzZXIgd2l0aCB0aGUgYHJvbGVfYWRtaW5gIHJvbGUgcGVybWlzc2lvbiB0byB2aWV3IGFueQotYW5kIGFsbCByb2xlcyBpbiB0aGUgc3lzdGVtIHdpdGggYSBgTElTVCBST0xFU2Agc3RhdGVtZW50Ci0KLVtbZ3JhbnRBbGxdXQotPT09PT0gR1JBTlQgQUxMCi0KLVdoZW4gdGhlIGBHUkFOVCBBTExgIGZvcm0gaXMgdXNlZCwgdGhlIGFwcHJvcHJpYXRlIHNldCBvZiBwZXJtaXNzaW9ucyBpcwotZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSB0YXJnZXQgcmVzb3VyY2UuCi0KLVtbYXV0b0dyYW50UGVybWlzc2lvbnNdXQotPT09PT0gQXV0b21hdGljIEdyYW50aW5nCi0KLVdoZW4gYSByZXNvdXJjZSBpcyBjcmVhdGVkLCB2aWEgYSBgQ1JFQVRFIEtFWVNQQUNFYCwgYENSRUFURSBUQUJMRWAsCi1gQ1JFQVRFIEZVTkNUSU9OYCwgYENSRUFURSBBR0dSRUdBVEVgIG9yIGBDUkVBVEUgUk9MRWAgc3RhdGVtZW50LCB0aGUKLWNyZWF0b3IgKHRoZSByb2xlIHRoZSBkYXRhYmFzZSB1c2VyIHdobyBpc3N1ZXMgdGhlIHN0YXRlbWVudCBpcwotaWRlbnRpZmllZCBhcyksIGlzIGF1dG9tYXRpY2FsbHkgZ3JhbnRlZCBhbGwgYXBwbGljYWJsZSBwZXJtaXNzaW9ucyBvbgotdGhlIG5ldyByZXNvdXJjZS4KLQotW1tyZXZva2VQZXJtaXNzaW9uc1N0bXRdXQotPT09PSBSRVZPS0UgUEVSTUlTU0lPTgotCi1fU3ludGF4Ol8KLQotYmMoc3ludGF4KS4uICsKLTo6PSBSRVZPS0UgKCBBTEwgKCBQRVJNSVNTSU9OUyApPyB8ICggUEVSTUlTU0lPTiApPyApIE9OIEZST00KLQotOjo9IENSRUFURSB8IEFMVEVSIHwgRFJPUCB8IFNFTEVDVCB8IE1PRElGWSB8IEFVVEhPUklaRSB8IERFU1JJQkUgfAotRVhFQ1VURQotCi06Oj0gQUxMIEtFWVNQQUNFUyArCi18IEtFWVNQQUNFICArCi18ICggVEFCTEUgKT8gICsKLXwgQUxMIFJPTEVTICsKLXwgUk9MRSAgKwotfCBBTEwgRlVOQ1RJT05TICggSU4gS0VZU1BBQ0UgKT8gKwotfCBGVU5DVElPTiAgKwotfCBBTEwgTUJFQU5TICsKLXwgKCBNQkVBTiB8IE1CRUFOUyApICArCi1wLgotCi1fU2FtcGxlOl8KLQotYmMoc2FtcGxlKS4uICsKLVJFVk9LRSBTRUxFQ1QgT04gQUxMIEtFWVNQQUNFUyBGUk9NIGRhdGFfcmVhZGVyOyArCi1SRVZPS0UgTU9ESUZZIE9OIEtFWVNQQUNFIGtleXNwYWNlMSBGUk9NIGRhdGFfd3JpdGVyOyArCi1SRVZPS0UgRFJPUCBPTiBrZXlzcGFjZTEudGFibGUxIEZST00gc2NoZW1hX293bmVyOyArCi1SRVZPS0UgRVhFQ1VURSBPTiBGVU5DVElPTiBrZXlzcGFjZTEudXNlcl9mdW5jdGlvbiggaW50ICkgRlJPTQotcmVwb3J0X3dyaXRlcjsgKwotUkVWT0tFIERFU0NSSUJFIE9OIEFMTCBST0xFUyBGUk9NIHJvbGVfYWRtaW47ICsKLXAuCi0KLVtbbGlzdFBlcm1pc3Npb25zU3RtdF1dCi09PT09PSBMSVNUIFBFUk1JU1NJT05TCi0KLV9TeW50YXg6XwotCi1iYyhzeW50YXgpLi4gKwotOjo9IExJU1QgKCBBTEwgKCBQRVJNSVNTSU9OUyApPyB8ICkgKwotKCBPTiApPyArCi0oIE9GICggTk9SRUNVUlNJVkUgKT8gKT8KLQotOjo9IEFMTCBLRVlTUEFDRVMgKwotfCBLRVlTUEFDRSAgKwotfCAoIFRBQkxFICk/ICArCi18IEFMTCBST0xFUyArCi18IFJPTEUgICsKLXwgQUxMIEZVTkNUSU9OUyAoIElOIEtFWVNQQUNFICk/ICsKLXwgRlVOQ1RJT04gICsKLXwgQUxMIE1CRUFOUyArCi18ICggTUJFQU4gfCBNQkVBTlMgKSAgKwotcC4KLQotX1NhbXBsZTpfCi0KLWJjKHNhbXBsZSkuICsKLUxJU1QgQUxMIFBFUk1JU1NJT05TIE9GIGFsaWNlOwotCi1TaG93IGFsbCBwZXJtaXNzaW9ucyBncmFudGVkIHRvIGBhbGljZWAsIGluY2x1ZGluZyB0aG9zZSBhY3F1aXJlZAotdHJhbnNpdGl2ZWx5IGZyb20gYW55IG90aGVyIHJvbGVzLgotCi1iYyhzYW1wbGUpLiArCi1MSVNUIEFMTCBQRVJNSVNTSU9OUyBPTiBrZXlzcGFjZTEudGFibGUxIE9GIGJvYjsKLQotU2hvdyBhbGwgcGVybWlzc2lvbnMgb24gYGtleXNwYWNlMS50YWJsZTFgIGdyYW50ZWQgdG8gYGJvYmAsIGluY2x1ZGluZwotdGhvc2UgYWNxdWlyZWQgdHJhbnNpdGl2ZWx5IGZyb20gYW55IG90aGVyIHJvbGVzLiBUaGlzIGFsc28gaW5jbHVkZXMgYW55Ci1wZXJtaXNzaW9ucyBoaWdoZXIgdXAgdGhlIHJlc291cmNlIGhpZXJhcmNoeSB3aGljaCBjYW4gYmUgYXBwbGllZCB0bwotYGtleXNwYWNlMS50YWJsZTFgLiBGb3IgZXhhbXBsZSwgc2hvdWxkIGBib2JgIGhhdmUgYEFMVEVSYCBwZXJtaXNzaW9uIG9uCi1ga2V5c3BhY2UxYCwgdGhhdCB3b3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0cyBvZiB0aGlzIHF1ZXJ5LiBBZGRpbmcKLXRoZSBgTk9SRUNVUlNJVkVgIHN3aXRjaCByZXN0cmljdHMgdGhlIHJlc3VsdHMgdG8gb25seSB0aG9zZSBwZXJtaXNzaW9ucwotd2hpY2ggd2VyZSBkaXJlY3RseSBncmFudGVkIHRvIGBib2JgIG9yIG9uZSBvZiBgYm9iYOKAmXMgcm9sZXMuCi0KLWJjKHNhbXBsZSkuICsKLUxJU1QgU0VMRUNUIFBFUk1JU1NJT05TIE9GIGNhcmxvczsKLQotU2hvdyBhbnkgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byBgY2FybG9zYCBvciBhbnkgb2YgYGNhcmxvc2DigJlzIHJvbGVzLAotbGltaXRlZCB0byBgU0VMRUNUYCBwZXJtaXNzaW9ucyBvbiBhbnkgcmVzb3VyY2UuCi0KLVtbdHlwZXNdXQotPT09IERhdGEgVHlwZXMKLQotQ1FMIHN1cHBvcnRzIGEgcmljaCBzZXQgb2YgZGF0YSB0eXBlcyBmb3IgY29sdW1ucyBkZWZpbmVkIGluIGEgdGFibGUsCi1pbmNsdWRpbmcgY29sbGVjdGlvbiB0eXBlcy4gT24gdG9wIG9mIHRob3NlIG5hdGl2ZSArCi1hbmQgY29sbGVjdGlvbiB0eXBlcywgdXNlcnMgY2FuIGFsc28gcHJvdmlkZSBjdXN0b20gdHlwZXMgKHRocm91Z2ggYQotSkFWQSBjbGFzcyBleHRlbmRpbmcgYEFic3RyYWN0VHlwZWAgbG9hZGFibGUgYnkgKwotQ2Fzc2FuZHJhKS4gVGhlIHN5bnRheCBvZiB0eXBlcyBpcyB0aHVzOgotCi1iYyhzeW50YXgpLi4gKwotOjo9ICArCi18ICArCi18ICArCi18IC8vIFVzZWQgZm9yIGN1c3RvbSB0eXBlcy4gVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGEgSkFWQSBjbGFzcwotCi06Oj0gYXNjaWkgKwotfCBiaWdpbnQgKwotfCBibG9iICsKLXwgYm9vbGVhbiArCi18IGNvdW50ZXIgKwotfCBkYXRlICsKLXwgZGVjaW1hbCArCi18IGRvdWJsZSArCi18IGZsb2F0ICsKLXwgaW5ldCArCi18IGludCArCi18IHNtYWxsaW50ICsKLXwgdGV4dCArCi18IHRpbWUgKwotfCB0aW1lc3RhbXAgKwotfCB0aW1ldXVpZCArCi18IHRpbnlpbnQgKwotfCB1dWlkICsKLXwgdmFyY2hhciArCi18IHZhcmludAotCi06Oj0gbGlzdCBgPCcgYD4nICsKLXwgc2V0IGA8JyBgPicgKwotfCBtYXAgYDwnIGAsJyBgPicgKwotOjo9IHR1cGxlIGA8JyAoYCwnICkqIGA+JyArCi1wLiBOb3RlIHRoYXQgdGhlIG5hdGl2ZSB0eXBlcyBhcmUga2V5d29yZHMgYW5kIGFzIHN1Y2ggYXJlCi1jYXNlLWluc2Vuc2l0aXZlLiBUaGV5IGFyZSBob3dldmVyIG5vdCByZXNlcnZlZCBvbmVzLgotCi1UaGUgZm9sbG93aW5nIHRhYmxlIGdpdmVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25zIG9uIHRoZSBuYXRpdmUgZGF0YQotdHlwZXMsIGFuZCBvbiB3aGljaCBraW5kIG9mIGxpbms6I2NvbnN0YW50c1tjb25zdGFudHNdIGVhY2ggdHlwZQotc3VwcG9ydHM6Ci0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18dHlwZSB8Y29uc3RhbnRzIHN1cHBvcnRlZCB8ZGVzY3JpcHRpb24KLXxgYXNjaWlgIHxzdHJpbmdzIHxBU0NJSSBjaGFyYWN0ZXIgc3RyaW5nCi0KLXxgYmlnaW50YCB8aW50ZWdlcnMgfDY0LWJpdCBzaWduZWQgbG9uZwotCi18YGJsb2JgIHxibG9icyB8QXJiaXRyYXJ5IGJ5dGVzIChubyB2YWxpZGF0aW9uKQotCi18YGJvb2xlYW5gIHxib29sZWFucyB8dHJ1ZSBvciBmYWxzZQotCi18YGNvdW50ZXJgIHxpbnRlZ2VycyB8Q291bnRlciBjb2x1bW4gKDY0LWJpdCBzaWduZWQgdmFsdWUpLiBTZWUKLWxpbms6I2NvdW50ZXJzW0NvdW50ZXJzXSBmb3IgZGV0YWlscwotCi18YGRhdGVgIHxpbnRlZ2Vycywgc3RyaW5ncyB8QSBkYXRlICh3aXRoIG5vIGNvcnJlc3BvbmRpbmcgdGltZSB2YWx1ZSkuCi1TZWUgbGluazojdXNpbmdkYXRlc1tXb3JraW5nIHdpdGggZGF0ZXNdIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi18YGRlY2ltYWxgIHxpbnRlZ2VycywgZmxvYXRzIHxWYXJpYWJsZS1wcmVjaXNpb24gZGVjaW1hbAotCi18YGRvdWJsZWAgfGludGVnZXJzIHw2NC1iaXQgSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQKLQotfGBmbG9hdGAgfGludGVnZXJzLCBmbG9hdHMgfDMyLWJpdCBJRUVFLTc1NCBmbG9hdGluZyBwb2ludAotCi18YGluZXRgIHxzdHJpbmdzIHxBbiBJUCBhZGRyZXNzLiBJdCBjYW4gYmUgZWl0aGVyIDQgYnl0ZXMgbG9uZyAoSVB2NCkgb3IKLTE2IGJ5dGVzIGxvbmcgKElQdjYpLiBUaGVyZSBpcyBubyBgaW5ldGAgY29uc3RhbnQsIElQIGFkZHJlc3Mgc2hvdWxkIGJlCi1pbnB1dGVkIGFzIHN0cmluZ3MKLQotfGBpbnRgIHxpbnRlZ2VycyB8MzItYml0IHNpZ25lZCBpbnQKLQotfGBzbWFsbGludGAgfGludGVnZXJzIHwxNi1iaXQgc2lnbmVkIGludAotCi18YHRleHRgIHxzdHJpbmdzIHxVVEY4IGVuY29kZWQgc3RyaW5nCi0KLXxgdGltZWAgfGludGVnZXJzLCBzdHJpbmdzIHxBIHRpbWUgd2l0aCBuYW5vc2Vjb25kIHByZWNpc2lvbi4gU2VlCi1saW5rOiN1c2luZ3RpbWVbV29ya2luZyB3aXRoIHRpbWVdIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi18YHRpbWVzdGFtcGAgfGludGVnZXJzLCBzdHJpbmdzIHxBIHRpbWVzdGFtcC4gU3RyaW5ncyBjb25zdGFudCBhcmUgYWxsb3cKLXRvIGlucHV0IHRpbWVzdGFtcHMgYXMgZGF0ZXMsIHNlZSBsaW5rOiN1c2luZ3RpbWVzdGFtcHNbV29ya2luZyB3aXRoCi10aW1lc3RhbXBzXSBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotfGB0aW1ldXVpZGAgfHV1aWRzIHxUeXBlIDEgVVVJRC4gVGhpcyBpcyBnZW5lcmFsbHkgdXNlZCBhcyBhCi1gYGNvbmZsaWN0LWZyZWUnJyB0aW1lc3RhbXAuIEFsc28gc2VlIHRoZSBsaW5rOiN0aW1ldXVpZEZ1bltmdW5jdGlvbnMgb24KLVRpbWV1dWlkXQotCi18YHRpbnlpbnRgIHxpbnRlZ2VycyB8OC1iaXQgc2lnbmVkIGludAotCi18YHV1aWRgIHx1dWlkcyB8VHlwZSAxIG9yIHR5cGUgNCBVVUlECi0KLXxgdmFyY2hhcmAgfHN0cmluZ3MgfFVURjggZW5jb2RlZCBzdHJpbmcKLQotfGB2YXJpbnRgIHxpbnRlZ2VycyB8QXJiaXRyYXJ5LXByZWNpc2lvbiBpbnRlZ2VyCi18PT09Ci0KLUZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgdGhlIGNvbGxlY3Rpb24gdHlwZXMsIHNlZSB0aGUKLWxpbms6I2NvbGxlY3Rpb25zW1dvcmtpbmcgd2l0aCBjb2xsZWN0aW9uc10gc2VjdGlvbiBiZWxvdy4KLQotW1t1c2luZ3RpbWVzdGFtcHNdXQotPT09PSBXb3JraW5nIHdpdGggdGltZXN0YW1wcwotCi1WYWx1ZXMgb2YgdGhlIGB0aW1lc3RhbXBgIHR5cGUgYXJlIGVuY29kZWQgYXMgNjQtYml0IHNpZ25lZCBpbnRlZ2VycwotcmVwcmVzZW50aW5nIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgc3RhbmRhcmQgYmFzZSB0aW1lIGtub3duCi1hcyBgYHRoZSBlcG9jaCcnOiBKYW51YXJ5IDEgMTk3MCBhdCAwMDowMDowMCBHTVQuCi0KLVRpbWVzdGFtcCBjYW4gYmUgaW5wdXQgaW4gQ1FMIGFzIHNpbXBsZSBsb25nIGludGVnZXJzLCBnaXZpbmcgdGhlIG51bWJlcgotb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaCwgYXMgZGVmaW5lZCBhYm92ZS4KLQotVGhleSBjYW4gYWxzbyBiZSBpbnB1dCBhcyBzdHJpbmcgbGl0ZXJhbHMgaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgSVNPCi04NjAxIGZvcm1hdHMsIGVhY2ggcmVwcmVzZW50aW5nIHRoZSB0aW1lIGFuZCBkYXRlIE1hciAyLCAyMDExLCBhdAotMDQ6MDU6MDAgQU0sIEdNVC46Ci0KLSogYDIwMTEtMDItMDMgMDQ6MDUrMDAwMGAKLSogYDIwMTEtMDItMDMgMDQ6MDU6MDArMDAwMGAKLSogYDIwMTEtMDItMDMgMDQ6MDU6MDAuMDAwKzAwMDBgCi0qIGAyMDExLTAyLTAzVDA0OjA1KzAwMDBgCi0qIGAyMDExLTAyLTAzVDA0OjA1OjAwKzAwMDBgCi0qIGAyMDExLTAyLTAzVDA0OjA1OjAwLjAwMCswMDAwYAotCi1UaGUgYCswMDAwYCBhYm92ZSBpcyBhbiBSRkMgODIyIDQtZGlnaXQgdGltZSB6b25lIHNwZWNpZmljYXRpb247IGArMDAwMGAKLXJlZmVycyB0byBHTVQuIFVTIFBhY2lmaWMgU3RhbmRhcmQgVGltZSBpcyBgLTA4MDBgLiBUaGUgdGltZSB6b25lIG1heSBiZQotb21pdHRlZCBpZiBkZXNpcmVk4oCUIHRoZSBkYXRlIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgYmVpbmcgaW4gdGhlIHRpbWUKLXpvbmUgdW5kZXIgd2hpY2ggdGhlIGNvb3JkaW5hdGluZyBDYXNzYW5kcmEgbm9kZSBpcyBjb25maWd1cmVkLgotCi0qIGAyMDExLTAyLTAzIDA0OjA1YAotKiBgMjAxMS0wMi0wMyAwNDowNTowMGAKLSogYDIwMTEtMDItMDMgMDQ6MDU6MDAuMDAwYAotKiBgMjAxMS0wMi0wM1QwNDowNWAKLSogYDIwMTEtMDItMDNUMDQ6MDU6MDBgCi0qIGAyMDExLTAyLTAzVDA0OjA1OjAwLjAwMGAKLQotVGhlcmUgYXJlIGNsZWFyIGRpZmZpY3VsdGllcyBpbmhlcmVudCBpbiByZWx5aW5nIG9uIHRoZSB0aW1lIHpvbmUKLWNvbmZpZ3VyYXRpb24gYmVpbmcgYXMgZXhwZWN0ZWQsIHRob3VnaCwgc28gaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUKLXRpbWUgem9uZSBhbHdheXMgYmUgc3BlY2lmaWVkIGZvciB0aW1lc3RhbXBzIHdoZW4gZmVhc2libGUuCi0KLVRoZSB0aW1lIG9mIGRheSBtYXkgYWxzbyBiZSBvbWl0dGVkLCBpZiB0aGUgZGF0ZSBpcyB0aGUgb25seSBwaWVjZSB0aGF0Ci1tYXR0ZXJzOgotCi0qIGAyMDExLTAyLTAzYAotKiBgMjAxMS0wMi0wMyswMDAwYAotCi1JbiB0aGF0IGNhc2UsIHRoZSB0aW1lIG9mIGRheSB3aWxsIGRlZmF1bHQgdG8gMDA6MDA6MDAsIGluIHRoZSBzcGVjaWZpZWQKLW9yIGRlZmF1bHQgdGltZSB6b25lLgotCi1bW3VzaW5nZGF0ZXNdXQotPT09PSBXb3JraW5nIHdpdGggZGF0ZXMKLQotVmFsdWVzIG9mIHRoZSBgZGF0ZWAgdHlwZSBhcmUgZW5jb2RlZCBhcyAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcnMKLXJlcHJlc2VudGluZyBhIG51bWJlciBvZiBkYXlzIHdpdGggYGB0aGUgZXBvY2gnJyBhdCB0aGUgY2VudGVyIG9mIHRoZQotcmFuZ2UgKDJeMzEpLiBFcG9jaCBpcyBKYW51YXJ5IDFzdCwgMTk3MAotCi1BIGRhdGUgY2FuIGJlIGlucHV0IGluIENRTCBhcyBhbiB1bnNpZ25lZCBpbnRlZ2VyIGFzIGRlZmluZWQgYWJvdmUuCi0KLVRoZXkgY2FuIGFsc28gYmUgaW5wdXQgYXMgc3RyaW5nIGxpdGVyYWxzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgotCi0qIGAyMDE0LTAxLTAxYAotCi1bW3VzaW5ndGltZV1dCi09PT09IFdvcmtpbmcgd2l0aCB0aW1lCi0KLVZhbHVlcyBvZiB0aGUgYHRpbWVgIHR5cGUgYXJlIGVuY29kZWQgYXMgNjQtYml0IHNpZ25lZCBpbnRlZ2VycwotcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgc2luY2UgbWlkbmlnaHQuCi0KLUEgdGltZSBjYW4gYmUgaW5wdXQgaW4gQ1FMIGFzIHNpbXBsZSBsb25nIGludGVnZXJzLCBnaXZpbmcgdGhlIG51bWJlciBvZgotbmFub3NlY29uZHMgc2luY2UgbWlkbmlnaHQuCi0KLVRoZXkgY2FuIGFsc28gYmUgaW5wdXQgYXMgc3RyaW5nIGxpdGVyYWxzIGluIGFueSBvZiB0aGUgZm9sbG93aW5nCi1mb3JtYXRzOgotCi0qIGAwODoxMjo1NGAKLSogYDA4OjEyOjU0LjEyM2AKLSogYDA4OjEyOjU0LjEyMzQ1NmAKLSogYDA4OjEyOjU0LjEyMzQ1Njc4OWAKLQotPT09PSBDb3VudGVycwotCi1UaGUgYGNvdW50ZXJgIHR5cGUgaXMgdXNlZCB0byBkZWZpbmUgX2NvdW50ZXIgY29sdW1uc18uIEEgY291bnRlciBjb2x1bW4KLWlzIGEgY29sdW1uIHdob3NlIHZhbHVlIGlzIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGFuZCBvbiB3aGljaCAyCi1vcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQ6IGluY3JlbWVudGF0aW9uIGFuZCBkZWNyZW1lbnRhdGlvbiAoc2VlCi1saW5rOiN1cGRhdGVTdG10W2BVUERBVEVgXSBmb3Igc3ludGF4KS4gTm90ZSB0aGUgdmFsdWUgb2YgYSBjb3VudGVyCi1jYW5ub3QgYmUgc2V0LiBBIGNvdW50ZXIgZG9lc27igJl0IGV4aXN0IHVudGlsIGZpcnN0Ci1pbmNyZW1lbnRlZC9kZWNyZW1lbnRlZCwgYW5kIHRoZSBmaXJzdCBpbmNyZW1lbnRhdGlvbi9kZWNyZW1lbnRhdGlvbiBpcwotbWFkZSBhcyBpZiB0aGUgcHJldmlvdXMgdmFsdWUgd2FzIDAuIERlbGV0aW9uIG9mIGNvdW50ZXIgY29sdW1ucyBpcwotc3VwcG9ydGVkIGJ1dCBoYXZlIHNvbWUgbGltaXRhdGlvbnMgKHNlZSB0aGUKLWh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY2Fzc2FuZHJhL0NvdW50ZXJzW0Nhc3NhbmRyYSBXaWtpXSBmb3IgbW9yZQotaW5mb3JtYXRpb24pLgotCi1UaGUgdXNlIG9mIHRoZSBjb3VudGVyIHR5cGUgaXMgbGltaXRlZCBpbiB0aGUgZm9sbG93aW5nIHdheToKLQotKiBJdCBjYW5ub3QgYmUgdXNlZCBmb3IgY29sdW1uIHRoYXQgaXMgcGFydCBvZiB0aGUgYFBSSU1BUlkgS0VZYCBvZiBhCi10YWJsZS4KLSogQSB0YWJsZSB0aGF0IGNvbnRhaW5zIGEgY291bnRlciBjYW4gb25seSBjb250YWluIGNvdW50ZXJzLiBJbiBvdGhlcgotd29yZHMsIGVpdGhlciBhbGwgdGhlIGNvbHVtbnMgb2YgYSB0YWJsZSBvdXRzaWRlIHRoZSBgUFJJTUFSWSBLRVlgIGhhdmUKLXRoZSBjb3VudGVyIHR5cGUsIG9yIG5vbmUgb2YgdGhlbSBoYXZlIGl0LgotCi1bW2NvbGxlY3Rpb25zXV0KLT09PT0gV29ya2luZyB3aXRoIGNvbGxlY3Rpb25zCi0KLT09PT09IE5vdGV3b3J0aHkgY2hhcmFjdGVyaXN0aWNzCi0KLUNvbGxlY3Rpb25zIGFyZSBtZWFudCBmb3Igc3RvcmluZy9kZW5vcm1hbGl6aW5nIHJlbGF0aXZlbHkgc21hbGwgYW1vdW50Ci1vZiBkYXRhLiBUaGV5IHdvcmsgd2VsbCBmb3IgdGhpbmdzIGxpa2UgYGB0aGUgcGhvbmUgbnVtYmVycyBvZiBhIGdpdmVuCi11c2VyJycsIGBgbGFiZWxzIGFwcGxpZWQgdG8gYW4gZW1haWwnJywgZXRjLiBCdXQgd2hlbiBpdGVtcyBhcmUgZXhwZWN0ZWQKLXRvIGdyb3cgdW5ib3VuZGVkIChgYGFsbCB0aGUgbWVzc2FnZXMgc2VudCBieSBhIGdpdmVuIHVzZXInJywgYGBldmVudHMKLXJlZ2lzdGVyZWQgYnkgYSBzZW5zb3InJywg4oCmKSwgdGhlbiBjb2xsZWN0aW9ucyBhcmUgbm90IGFwcHJvcHJpYXRlCi1hbnltb3JlIGFuZCBhIHNwZWNpZmljIHRhYmxlICh3aXRoIGNsdXN0ZXJpbmcgY29sdW1ucykgc2hvdWxkIGJlIHVzZWQuCi1Db25jcmV0ZWx5LCBjb2xsZWN0aW9ucyBoYXZlIHRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnM6Ci0KLSogQ29sbGVjdGlvbnMgYXJlIGFsd2F5cyByZWFkIGluIHRoZWlyIGVudGlyZXR5IChhbmQgcmVhZGluZyBvbmUgaXMgbm90Ci1wYWdlZCBpbnRlcm5hbGx5KS4KLSogQ29sbGVjdGlvbnMgY2Fubm90IGhhdmUgbW9yZSB0aGFuIDY1NTM1IGVsZW1lbnRzLiBNb3JlIHByZWNpc2VseSwKLXdoaWxlIGl0IG1heSBiZSBwb3NzaWJsZSB0byBpbnNlcnQgbW9yZSB0aGFuIDY1NTM1IGVsZW1lbnRzLCBpdCBpcyBub3QKLXBvc3NpYmxlIHRvIHJlYWQgbW9yZSB0aGFuIHRoZSA2NTUzNSBmaXJzdCBlbGVtZW50cyAoc2VlCi1odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS01NDI4W0NBU1NBTkRSQS01NDI4XSBmb3IKLWRldGFpbHMpLgotKiBXaGlsZSBpbnNlcnRpb24gb3BlcmF0aW9ucyBvbiBzZXRzIGFuZCBtYXBzIG5ldmVyIGluY3VyIGEKLXJlYWQtYmVmb3JlLXdyaXRlIGludGVybmFsbHksIHNvbWUgb3BlcmF0aW9ucyBvbiBsaXN0cyBkbyAoc2VlIHRoZQotc2VjdGlvbiBvbiBsaXN0cyBiZWxvdyBmb3IgZGV0YWlscykuIEl0IGlzIHRodXMgYWR2aXNlZCB0byBwcmVmZXIgc2V0cwotb3ZlciBsaXN0cyB3aGVuIHBvc3NpYmxlLgotCi1QbGVhc2Ugbm90ZSB0aGF0IHdoaWxlIHNvbWUgb2YgdGhvc2UgbGltaXRhdGlvbnMgbWF5IG9yIG1heSBub3QgYmUKLWxvb3NlbiBpbiB0aGUgZnV0dXJlLCB0aGUgZ2VuZXJhbCBydWxlIHRoYXQgY29sbGVjdGlvbnMgYXJlIGZvcgotZGVub3JtYWxpemluZyBzbWFsbCBhbW91bnQgb2YgZGF0YSBpcyBtZWFudCB0byBzdGF5LgotCi1bW21hcF1dCi09PT09PSBNYXBzCi0KLUEgYG1hcGAgaXMgYSBsaW5rOiN0eXBlc1t0eXBlZF0gc2V0IG9mIGtleS12YWx1ZSBwYWlycywgd2hlcmUga2V5cyBhcmUKLXVuaXF1ZS4gRnVydGhlcm1vcmUsIG5vdGUgdGhhdCB0aGUgbWFwIGFyZSBpbnRlcm5hbGx5IHNvcnRlZCBieSB0aGVpcgota2V5cyBhbmQgd2lsbCB0aHVzIGFsd2F5cyBiZSByZXR1cm5lZCBpbiB0aGF0IG9yZGVyLiBUbyBjcmVhdGUgYSBjb2x1bW4KLW9mIHR5cGUgYG1hcGAsIHVzZSB0aGUgYG1hcGAga2V5d29yZCBzdWZmaXhlZCB3aXRoIGNvbW1hLXNlcGFyYXRlZCBrZXkKLWFuZCB2YWx1ZSB0eXBlcywgZW5jbG9zZWQgaW4gYW5nbGUgYnJhY2tldHMuIEZvciBleGFtcGxlOgotCi1iYyhzYW1wbGUpLiArCi1DUkVBVEUgVEFCTEUgdXNlcnMgKCArCi1pZCB0ZXh0IFBSSU1BUlkgS0VZLCArCi1naXZlbiB0ZXh0LCArCi1zdXJuYW1lIHRleHQsICsKLWZhdnMgbWFwPHRleHQsIHRleHQ+IC8vIEEgbWFwIG9mIHRleHQga2V5cywgYW5kIHRleHQgdmFsdWVzICsKLSkKLQotV3JpdGluZyBgbWFwYCBkYXRhIGlzIGFjY29tcGxpc2hlZCB3aXRoIGEgSlNPTi1pbnNwaXJlZCBzeW50YXguIFRvIHdyaXRlCi1hIHJlY29yZCB1c2luZyBgSU5TRVJUYCwgc3BlY2lmeSB0aGUgZW50aXJlIG1hcCBhcyBhIEpTT04tc3R5bGUKLWFzc29jaWF0aXZlIGFycmF5LiBfTm90ZTogVGhpcyBmb3JtIHdpbGwgYWx3YXlzIHJlcGxhY2UgdGhlIGVudGlyZSBtYXAuXwotCi1iYyhzYW1wbGUpLiArCi0vLyBJbnNlcnRpbmcgKG9yIFVwZGF0aW5nKSArCi1JTlNFUlQgSU5UTyB1c2VycyAoaWQsIGdpdmVuLCBzdXJuYW1lLCBmYXZzKSArCi1WQUxVRVMgKGBqc21pdGgnLCBgSm9obicsIGBTbWl0aCcsIFx7IGBmcnVpdCcgOiBgYXBwbGUnLCBgYmFuZCcgOgotYEJlYXRsZXMnIH0pCi0KLUFkZGluZyBvciB1cGRhdGluZyBrZXktdmFsdWVzIG9mIGEgKHBvdGVudGlhbGx5KSBleGlzdGluZyBtYXAgY2FuIGJlCi1hY2NvbXBsaXNoZWQgZWl0aGVyIGJ5IHN1YnNjcmlwdGluZyB0aGUgbWFwIGNvbHVtbiBpbiBhbiBgVVBEQVRFYAotc3RhdGVtZW50IG9yIGJ5IGFkZGluZyBhIG5ldyBtYXAgbGl0ZXJhbDoKLQotYmMoc2FtcGxlKS4gKwotLy8gVXBkYXRpbmcgKG9yIGluc2VydGluZykgKwotVVBEQVRFIHVzZXJzIFNFVCBmYXZzW2BhdXRob3InXSA9IGBFZCBQb2UnIFdIRVJFIGlkID0gYGpzbWl0aCcgKwotVVBEQVRFIHVzZXJzIFNFVCBmYXZzID0gZmF2cyArIFx7IGBtb3ZpZScgOiBgQ2Fzc2FibGFuY2EnIH0gV0hFUkUgaWQgPQotYGpzbWl0aCcKLQotTm90ZSB0aGF0IFRUTHMgYXJlIGFsbG93ZWQgZm9yIGJvdGggYElOU0VSVGAgYW5kIGBVUERBVEVgLCBidXQgaW4gYm90aAotY2FzZSB0aGUgVFRMIHNldCBvbmx5IGFwcGx5IHRvIHRoZSBuZXdseSBpbnNlcnRlZC91cGRhdGVkIF92YWx1ZXNfLiBJbgotb3RoZXIgd29yZHMsCi0KLWJjKHNhbXBsZSkuICsKLS8vIFVwZGF0aW5nIChvciBpbnNlcnRpbmcpICsKLVVQREFURSB1c2VycyBVU0lORyBUVEwgMTAgU0VUIGZhdnNbYGNvbG9yJ10gPSBgZ3JlZW4nIFdIRVJFIGlkID0KLWBqc21pdGgnCi0KLXdpbGwgb25seSBhcHBseSB0aGUgVFRMIHRvIHRoZSBgeyAnY29sb3InIDogJ2dyZWVuJyB9YCByZWNvcmQsIHRoZSByZXN0Ci1vZiB0aGUgbWFwIHJlbWFpbmluZyB1bmFmZmVjdGVkLgotCi1EZWxldGluZyBhIG1hcCByZWNvcmQgaXMgZG9uZSB3aXRoOgotCi1iYyhzYW1wbGUpLiArCi1ERUxFVEUgZmF2c1tgYXV0aG9yJ10gRlJPTSB1c2VycyBXSEVSRSBpZCA9IGBqc21pdGgnCi0KLVtbc2V0XV0KLT09PT09IFNldHMKLQotQSBgc2V0YCBpcyBhIGxpbms6I3R5cGVzW3R5cGVkXSBjb2xsZWN0aW9uIG9mIHVuaXF1ZSB2YWx1ZXMuIFNldHMgYXJlCi1vcmRlcmVkIGJ5IHRoZWlyIHZhbHVlcy4gVG8gY3JlYXRlIGEgY29sdW1uIG9mIHR5cGUgYHNldGAsIHVzZSB0aGUgYHNldGAKLWtleXdvcmQgc3VmZml4ZWQgd2l0aCB0aGUgdmFsdWUgdHlwZSBlbmNsb3NlZCBpbiBhbmdsZSBicmFja2V0cy4gRm9yCi1leGFtcGxlOgotCi1iYyhzYW1wbGUpLiArCi1DUkVBVEUgVEFCTEUgaW1hZ2VzICggKwotbmFtZSB0ZXh0IFBSSU1BUlkgS0VZLCArCi1vd25lciB0ZXh0LCArCi1kYXRlIHRpbWVzdGFtcCwgKwotdGFncyBzZXQgKwotKTsKLQotV3JpdGluZyBhIGBzZXRgIGlzIGFjY29tcGxpc2hlZCBieSBjb21tYSBzZXBhcmF0aW5nIHRoZSBzZXQgdmFsdWVzLCBhbmQKLWVuY2xvc2luZyB0aGVtIGluIGN1cmx5IGJyYWNlcy4gX05vdGU6IEFuIGBJTlNFUlRgIHdpbGwgYWx3YXlzIHJlcGxhY2UKLXRoZSBlbnRpcmUgc2V0Ll8KLQotYmMoc2FtcGxlKS4gKwotSU5TRVJUIElOVE8gaW1hZ2VzIChuYW1lLCBvd25lciwgZGF0ZSwgdGFncykgKwotVkFMVUVTIChgY2F0LmpwZycsIGBqc21pdGgnLCBgbm93JywgXHsgYGtpdHRlbicsIGBjYXQnLCBgcGV0JyB9KTsKLQotQWRkaW5nIGFuZCByZW1vdmluZyB2YWx1ZXMgb2YgYSBzZXQgY2FuIGJlIGFjY29tcGxpc2hlZCB3aXRoIGFuIGBVUERBVEVgCi1ieSBhZGRpbmcvcmVtb3ZpbmcgbmV3IHNldCB2YWx1ZXMgdG8gYW4gZXhpc3RpbmcgYHNldGAgY29sdW1uLgotCi1iYyhzYW1wbGUpLiArCi1VUERBVEUgaW1hZ2VzIFNFVCB0YWdzID0gdGFncyArIFx7IGBjdXRlJywgYGN1ZGRseScgfSBXSEVSRSBuYW1lID0KLWBjYXQuanBnJzsgKwotVVBEQVRFIGltYWdlcyBTRVQgdGFncyA9IHRhZ3MgLSBceyBgbGFtZScgfSBXSEVSRSBuYW1lID0gYGNhdC5qcGcnOwotCi1BcyB3aXRoIGxpbms6I21hcFttYXBzXSwgVFRMcyBpZiB1c2VkIG9ubHkgYXBwbHkgdG8gdGhlIG5ld2x5Ci1pbnNlcnRlZC91cGRhdGVkIF92YWx1ZXNfLgotCi1bW2xpc3RdXQotPT09PT0gTGlzdHMKLQotQSBgbGlzdGAgaXMgYSBsaW5rOiN0eXBlc1t0eXBlZF0gY29sbGVjdGlvbiBvZiBub24tdW5pcXVlIHZhbHVlcyB3aGVyZQotZWxlbWVudHMgYXJlIG9yZGVyZWQgYnkgdGhlcmUgcG9zaXRpb24gaW4gdGhlIGxpc3QuIFRvIGNyZWF0ZSBhIGNvbHVtbgotb2YgdHlwZSBgbGlzdGAsIHVzZSB0aGUgYGxpc3RgIGtleXdvcmQgc3VmZml4ZWQgd2l0aCB0aGUgdmFsdWUgdHlwZQotZW5jbG9zZWQgaW4gYW5nbGUgYnJhY2tldHMuIEZvciBleGFtcGxlOgotCi1iYyhzYW1wbGUpLiArCi1DUkVBVEUgVEFCTEUgcGxheXMgKCArCi1pZCB0ZXh0IFBSSU1BUlkgS0VZLCArCi1nYW1lIHRleHQsICsKLXBsYXllcnMgaW50LCArCi1zY29yZXMgbGlzdCArCi0pCi0KLURvIG5vdGUgdGhhdCBhcyBleHBsYWluZWQgYmVsb3csIGxpc3RzIGhhdmUgc29tZSBsaW1pdGF0aW9ucyBhbmQKLXBlcmZvcm1hbmNlIGNvbnNpZGVyYXRpb25zIHRvIHRha2UgaW50byBhY2NvdW50LCBhbmQgaXQgaXMgYWR2aXNlZCB0bwotcHJlZmVyIGxpbms6I3NldFtzZXRzXSBvdmVyIGxpc3RzIHdoZW4gdGhpcyBpcyBwb3NzaWJsZS4KLQotV3JpdGluZyBgbGlzdGAgZGF0YSBpcyBhY2NvbXBsaXNoZWQgd2l0aCBhIEpTT04tc3R5bGUgc3ludGF4LiBUbyB3cml0ZSBhCi1yZWNvcmQgdXNpbmcgYElOU0VSVGAsIHNwZWNpZnkgdGhlIGVudGlyZSBsaXN0IGFzIGEgSlNPTiBhcnJheS4gX05vdGU6Ci1BbiBgSU5TRVJUYCB3aWxsIGFsd2F5cyByZXBsYWNlIHRoZSBlbnRpcmUgbGlzdC5fCi0KLWJjKHNhbXBsZSkuICsKLUlOU0VSVCBJTlRPIHBsYXlzIChpZCwgZ2FtZSwgcGxheWVycywgc2NvcmVzKSArCi1WQUxVRVMgKGAxMjMtYWZkZScsIGBxdWFrZScsIDMsIFsxNywgNCwgMl0pOwotCi1BZGRpbmcgKGFwcGVuZGluZyBvciBwcmVwZW5kaW5nKSB2YWx1ZXMgdG8gYSBsaXN0IGNhbiBiZSBhY2NvbXBsaXNoZWQgYnkKLWFkZGluZyBhIG5ldyBKU09OLXN0eWxlIGFycmF5IHRvIGFuIGV4aXN0aW5nIGBsaXN0YCBjb2x1bW4uCi0KLWJjKHNhbXBsZSkuICsKLVVQREFURSBwbGF5cyBTRVQgcGxheWVycyA9IDUsIHNjb3JlcyA9IHNjb3JlcyArIFsgMTQsIDIxIF0gV0hFUkUgaWQgPQotYDEyMy1hZmRlJzsgKwotVVBEQVRFIHBsYXlzIFNFVCBwbGF5ZXJzID0gNSwgc2NvcmVzID0gWyAxMiBdICsgc2NvcmVzIFdIRVJFIGlkID0KLWAxMjMtYWZkZSc7Ci0KLUl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGFwcGVuZCBhbmQgcHJlcGVuZCBhcmUgbm90IGlkZW1wb3RlbnQKLW9wZXJhdGlvbnMuIFRoaXMgbWVhbnMgdGhhdCBpZiBkdXJpbmcgYW4gYXBwZW5kIG9yIGEgcHJlcGVuZCB0aGUKLW9wZXJhdGlvbiB0aW1lb3V0LCBpdCBpcyBub3QgYWx3YXlzIHNhZmUgdG8gcmV0cnkgdGhlIG9wZXJhdGlvbiAoYXMgdGhpcwotY291bGQgcmVzdWx0IGluIHRoZSByZWNvcmQgYXBwZW5kZWQgb3IgcHJlcGVuZGVkIHR3aWNlKS4KLQotTGlzdHMgYWxzbyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbjogc2V0dGluZyBhbiBlbGVtZW50IGJ5IGl0cwotcG9zaXRpb24gaW4gdGhlIGxpc3QsIHJlbW92aW5nIGFuIGVsZW1lbnQgYnkgaXRzIHBvc2l0aW9uIGluIHRoZSBsaXN0Ci1hbmQgcmVtb3ZlIGFsbCB0aGUgb2NjdXJyZW5jZSBvZiBhIGdpdmVuIHZhbHVlIGluIHRoZSBsaXN0LiBfSG93ZXZlciwKLWFuZCBjb250cmFyaWx5IHRvIGFsbCB0aGUgb3RoZXIgY29sbGVjdGlvbiBvcGVyYXRpb25zLCB0aGVzZSB0aHJlZQotb3BlcmF0aW9ucyBpbmR1Y2UgYW4gaW50ZXJuYWwgcmVhZCBiZWZvcmUgdGhlIHVwZGF0ZSwgYW5kIHdpbGwgdGh1cwotdHlwaWNhbGx5IGhhdmUgc2xvd2VyIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljc18uIFRob3NlIG9wZXJhdGlvbnMKLWhhdmUgdGhlIGZvbGxvd2luZyBzeW50YXg6Ci0KLWJjKHNhbXBsZSkuICsKLVVQREFURSBwbGF5cyBTRVQgc2NvcmVzWzFdID0gNyBXSEVSRSBpZCA9IGAxMjMtYWZkZSc7IC8vIHNldHMgdGhlIDJuZAotZWxlbWVudCBvZiBzY29yZXMgdG8gNyAocmFpc2VzIGFuIGVycm9yIGlzIHNjb3JlcyBoYXMgbGVzcyB0aGFuIDIKLWVsZW1lbnRzKSArCi1ERUxFVEUgc2NvcmVzWzFdIEZST00gcGxheXMgV0hFUkUgaWQgPSBgMTIzLWFmZGUnOyAvLyBkZWxldGVzIHRoZSAybmQKLWVsZW1lbnQgb2Ygc2NvcmVzIChyYWlzZXMgYW4gZXJyb3IgaXMgc2NvcmVzIGhhcyBsZXNzIHRoYW4gMiBlbGVtZW50cykgKwotVVBEQVRFIHBsYXlzIFNFVCBzY29yZXMgPSBzY29yZXMgLSBbIDEyLCAyMSBdIFdIRVJFIGlkID0gYDEyMy1hZmRlJzsgLy8KLXJlbW92ZXMgYWxsIG9jY3VycmVuY2VzIG9mIDEyIGFuZCAyMSBmcm9tIHNjb3JlcwotCi1BcyB3aXRoIGxpbms6I21hcFttYXBzXSwgVFRMcyBpZiB1c2VkIG9ubHkgYXBwbHkgdG8gdGhlIG5ld2x5Ci1pbnNlcnRlZC91cGRhdGVkIF92YWx1ZXNfLgotCi09PT0gRnVuY3Rpb25zCi0KLUNRTDMgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGJ1aWx0LWluIGZ1bmN0aW9ucyAoc28gY2FsbGVkIGBuYXRpdmUKLWZ1bmN0aW9ucycpIGFuZCBsaW5rOiN1ZGZzW3VzZXItZGVmaW5lZCBmdW5jdGlvbnNdLiBDUUwzIGluY2x1ZGVzCi1zZXZlcmFsIG5hdGl2ZSBmdW5jdGlvbnMsIGRlc2NyaWJlZCBiZWxvdzoKLQotW1tjYXN0RnVuXV0KLT09PT0gQ2FzdAotCi1UaGUgYGNhc3RgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbnZlcnRzIG9uZSBuYXRpdmUgZGF0YXR5cGUgdG8KLWFub3RoZXIuCi0KLVRoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSBjb252ZXJzaW9ucyBzdXBwb3J0ZWQgYnkgdGhlIGBjYXN0YAotZnVuY3Rpb24uIENhc3NhbmRyYSB3aWxsIHNpbGVudGx5IGlnbm9yZSBhbnkgY2FzdCBjb252ZXJ0aW5nIGEgZGF0YXR5cGUKLWludG8gaXRzIG93biBkYXRhdHlwZS4KLQotW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfGZyb20gfHRvCi18YGFzY2lpYCB8YHRleHRgLCBgdmFyY2hhcmAKLQotfGBiaWdpbnRgIHxgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwgYGRlY2ltYWxgLAotYHZhcmludGAsIGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXxgYm9vbGVhbmAgfGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXxgY291bnRlcmAgfGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwKLWBkZWNpbWFsYCwgYHZhcmludGAsIGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXxgZGF0ZWAgfGB0aW1lc3RhbXBgCi0KLXxgZGVjaW1hbGAgfGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwKLWB2YXJpbnRgLCBgdGV4dGAsIGB2YXJjaGFyYAotCi18YGRvdWJsZWAgfGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZGVjaW1hbGAsCi1gdmFyaW50YCwgYHRleHRgLCBgdmFyY2hhcmAKLQotfGBmbG9hdGAgfGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZG91YmxlYCwgYGRlY2ltYWxgLAotYHZhcmludGAsIGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXxgaW5ldGAgfGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXxgaW50YCB8YHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwKLWB2YXJpbnRgLCBgdGV4dGAsIGB2YXJjaGFyYAotCi18YHNtYWxsaW50YCB8YHRpbnlpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsCi1gdmFyaW50YCwgYHRleHRgLCBgdmFyY2hhcmAKLQotfGB0aW1lYCB8YHRleHRgLCBgdmFyY2hhcmAKLQotfGB0aW1lc3RhbXBgIHxgZGF0ZWAsIGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXxgdGltZXV1aWRgIHxgdGltZXN0YW1wYCwgYGRhdGVgLCBgdGV4dGAsIGB2YXJjaGFyYAotCi18YHRpbnlpbnRgIHxgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsCi1gZGVjaW1hbGAsIGB2YXJpbnRgLCBgdGV4dGAsIGB2YXJjaGFyYAotCi18YHV1aWRgIHxgdGV4dGAsIGB2YXJjaGFyYAotCi18YHZhcmludGAgfGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwKLWBkZWNpbWFsYCwgYHRleHRgLCBgdmFyY2hhcmAKLXw9PT0KLQotVGhlIGNvbnZlcnNpb25zIHJlbHkgc3RyaWN0bHkgb24gSmF2YeKAmXMgc2VtYW50aWNzLiBGb3IgZXhhbXBsZSwgdGhlCi1kb3VibGUgdmFsdWUgMSB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgdGV4dCB2YWx1ZSBgMS4wJy4KLQotYmMoc2FtcGxlKS4gKwotU0VMRUNUIGF2ZyhjYXN0KGNvdW50IGFzIGRvdWJsZSkpIEZST00gbXlUYWJsZQotCi1bW3Rva2VuRnVuXV0KLT09PT0gVG9rZW4KLQotVGhlIGB0b2tlbmAgZnVuY3Rpb24gYWxsb3dzIHRvIGNvbXB1dGUgdGhlIHRva2VuIGZvciBhIGdpdmVuIHBhcnRpdGlvbgota2V5LiBUaGUgZXhhY3Qgc2lnbmF0dXJlIG9mIHRoZSB0b2tlbiBmdW5jdGlvbiBkZXBlbmRzIG9uIHRoZSB0YWJsZQotY29uY2VybmVkIGFuZCBvZiB0aGUgcGFydGl0aW9uZXIgdXNlZCBieSB0aGUgY2x1c3Rlci4KLQotVGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50cyBvZiB0aGUgYHRva2VuYCBkZXBlbmQgb24gdGhlIHR5cGUgb2YgdGhlCi1wYXJ0aXRpb24ga2V5IGNvbHVtbnMuIFRoZSByZXR1cm4gdHlwZSBkZXBlbmQgb24gdGhlIHBhcnRpdGlvbmVyIGluIHVzZToKLQotKiBGb3IgTXVybXVyM1BhcnRpdGlvbmVyLCB0aGUgcmV0dXJuIHR5cGUgaXMgYGJpZ2ludGAuCi0qIEZvciBSYW5kb21QYXJ0aXRpb25lciwgdGhlIHJldHVybiB0eXBlIGlzIGB2YXJpbnRgLgotKiBGb3IgQnl0ZU9yZGVyZWRQYXJ0aXRpb25lciwgdGhlIHJldHVybiB0eXBlIGlzIGBibG9iYC4KLQotRm9yIGluc3RhbmNlLCBpbiBhIGNsdXN0ZXIgdXNpbmcgdGhlIGRlZmF1bHQgTXVybXVyM1BhcnRpdGlvbmVyLCBpZiBhCi10YWJsZSBpcyBkZWZpbmVkIGJ5Ci0KLWJjKHNhbXBsZSkuICsKLUNSRUFURSBUQUJMRSB1c2VycyAoICsKLXVzZXJpZCB0ZXh0IFBSSU1BUlkgS0VZLCArCi11c2VybmFtZSB0ZXh0LCArCi3igKYgKwotKQotCi10aGVuIHRoZSBgdG9rZW5gIGZ1bmN0aW9uIHdpbGwgdGFrZSBhIHNpbmdsZSBhcmd1bWVudCBvZiB0eXBlIGB0ZXh0YCAoaW4KLXRoYXQgY2FzZSwgdGhlIHBhcnRpdGlvbiBrZXkgaXMgYHVzZXJpZGAgKHRoZXJlIGlzIG5vIGNsdXN0ZXJpbmcgY29sdW1ucwotc28gdGhlIHBhcnRpdGlvbiBrZXkgaXMgdGhlIHNhbWUgdGhhbiB0aGUgcHJpbWFyeSBrZXkpKSwgYW5kIHRoZSByZXR1cm4KLXR5cGUgd2lsbCBiZSBgYmlnaW50YC4KLQotW1t1dWlkRnVuXV0KLT09PT0gVXVpZAotCi1UaGUgYHV1aWRgIGZ1bmN0aW9uIHRha2VzIG5vIHBhcmFtZXRlcnMgYW5kIGdlbmVyYXRlcyBhIHJhbmRvbSB0eXBlIDQKLXV1aWQgc3VpdGFibGUgZm9yIHVzZSBpbiBJTlNFUlQgb3IgU0VUIHN0YXRlbWVudHMuCi0KLVtbdGltZXV1aWRGdW5dXQotPT09PSBUaW1ldXVpZCBmdW5jdGlvbnMKLQotPT09PT0gYG5vd2AKLQotVGhlIGBub3dgIGZ1bmN0aW9uIHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgZ2VuZXJhdGVzLCBvbiB0aGUgY29vcmRpbmF0b3IKLW5vZGUsIGEgbmV3IHVuaXF1ZSB0aW1ldXVpZCAoYXQgdGhlIHRpbWUgd2hlcmUgdGhlIHN0YXRlbWVudCB1c2luZyBpdCBpcwotZXhlY3V0ZWQpLiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaXMgdXNlZnVsIGZvciBpbnNlcnRpb24gYnV0IGlzIGxhcmdlbHkKLW5vbi1zZW5zaWNhbCBpbiBgV0hFUkVgIGNsYXVzZXMuIEZvciBpbnN0YW5jZSwgYSBxdWVyeSBvZiB0aGUgZm9ybQotCi1iYyhzYW1wbGUpLiArCi1TRUxFQ1QgKiBGUk9NIG15VGFibGUgV0hFUkUgdCA9IG5vdygpCi0KLXdpbGwgbmV2ZXIgcmV0dXJuIGFueSByZXN1bHQgYnkgZGVzaWduLCBzaW5jZSB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKLWBub3coKWAgaXMgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUuCi0KLT09PT09IGBtaW5UaW1ldXVpZGAgYW5kIGBtYXhUaW1ldXVpZGAKLQotVGhlIGBtaW5UaW1ldXVpZGAgKHJlc3AuIGBtYXhUaW1ldXVpZGApIGZ1bmN0aW9uIHRha2VzIGEgYHRpbWVzdGFtcGAKLXZhbHVlIGB0YCAod2hpY2ggY2FuIGJlIGxpbms6I3VzaW5ndGltZXN0YW1wc1tlaXRoZXIgYSB0aW1lc3RhbXAgb3IgYQotZGF0ZSBzdHJpbmddICkgYW5kIHJldHVybiBhIF9mYWtlXyBgdGltZXV1aWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi1fc21hbGxlc3RfIChyZXNwLiBfYmlnZ2VzdF8pIHBvc3NpYmxlIGB0aW1ldXVpZGAgaGF2aW5nIGZvciB0aW1lc3RhbXAKLWB0YC4gU28gZm9yIGluc3RhbmNlOgotCi1iYyhzYW1wbGUpLiArCi1TRUxFQ1QgKiBGUk9NIG15VGFibGUgV0hFUkUgdCA+IG1heFRpbWV1dWlkKGAyMDEzLTAxLTAxIDAwOjA1KzAwMDAnKSBBTkQKLXQgPCBtaW5UaW1ldXVpZChgMjAxMy0wMi0wMiAxMDowMCswMDAwJykKLQotd2lsbCBzZWxlY3QgYWxsIHJvd3Mgd2hlcmUgdGhlIGB0aW1ldXVpZGAgY29sdW1uIGB0YCBpcyBzdHJpY3RseSBvbGRlcgotdGhhbiBgMjAxMy0wMS0wMSAwMDowNSswMDAwJyBidXQgc3RyaWN0bHkgeW91bmdlciB0aGFuIGAyMDEzLTAyLTAyCi0xMDowMCswMDAwJy4gUGxlYXNlIG5vdGUgdGhhdAotYHQgPj0gbWF4VGltZXV1aWQoJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCcpYCB3b3VsZCBzdGlsbCBfbm90XyBzZWxlY3QgYQotYHRpbWV1dWlkYCBnZW5lcmF0ZWQgZXhhY3RseSBhdCBgMjAxMy0wMS0wMSAwMDowNSswMDAwJyBhbmQgaXMKLWVzc2VudGlhbGx5IGVxdWl2YWxlbnQgdG8gYHQgPiBtYXhUaW1ldXVpZCgnMjAxMy0wMS0wMSAwMDowNSswMDAwJylgLgotCi1fV2FybmluZ186IFdlIGNhbGxlZCB0aGUgdmFsdWVzIGdlbmVyYXRlZCBieSBgbWluVGltZXV1aWRgIGFuZAotYG1heFRpbWV1dWlkYCBfZmFrZV8gVVVJRCBiZWNhdXNlIHRoZXkgZG8gbm8gcmVzcGVjdCB0aGUgVGltZS1CYXNlZCBVVUlECi1nZW5lcmF0aW9uIHByb2Nlc3Mgc3BlY2lmaWVkIGJ5IHRoZQotaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjNDEyMi50eHRbUkZDIDQxMjJdLiBJbiBwYXJ0aWN1bGFyLCB0aGUgdmFsdWUKLXJldHVybmVkIGJ5IHRoZXNlIDIgbWV0aG9kcyB3aWxsIG5vdCBiZSB1bmlxdWUuIFRoaXMgbWVhbnMgeW91IHNob3VsZAotb25seSB1c2UgdGhvc2UgbWV0aG9kcyBmb3IgcXVlcnlpbmcgKGFzIGluIHRoZSBleGFtcGxlIGFib3ZlKS4gSW5zZXJ0aW5nCi10aGUgcmVzdWx0IG9mIHRob3NlIG1ldGhvZHMgaXMgYWxtb3N0IGNlcnRhaW5seSBfYSBiYWQgaWRlYV8uCi0KLVtbdGltZUZ1bl1dCi09PT09IFRpbWUgY29udmVyc2lvbiBmdW5jdGlvbnMKLQotQSBudW1iZXIgb2YgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0byBgYGNvbnZlcnQnJyBhIGB0aW1ldXVpZGAsIGEKLWB0aW1lc3RhbXBgIG9yIGEgYGRhdGVgIGludG8gYW5vdGhlciBgbmF0aXZlYCB0eXBlLgotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfGZ1bmN0aW9uIG5hbWUgfGlucHV0IHR5cGUgfGRlc2NyaXB0aW9uCi18YHRvRGF0ZWAgfGB0aW1ldXVpZGAgfENvbnZlcnRzIHRoZSBgdGltZXV1aWRgIGFyZ3VtZW50IGludG8gYSBgZGF0ZWAKLXR5cGUKLQotfGB0b0RhdGVgIHxgdGltZXN0YW1wYCB8Q29udmVydHMgdGhlIGB0aW1lc3RhbXBgIGFyZ3VtZW50IGludG8gYSBgZGF0ZWAKLXR5cGUKLQotfGB0b1RpbWVzdGFtcGAgfGB0aW1ldXVpZGAgfENvbnZlcnRzIHRoZSBgdGltZXV1aWRgIGFyZ3VtZW50IGludG8gYQotYHRpbWVzdGFtcGAgdHlwZQotCi18YHRvVGltZXN0YW1wYCB8YGRhdGVgIHxDb252ZXJ0cyB0aGUgYGRhdGVgIGFyZ3VtZW50IGludG8gYSBgdGltZXN0YW1wYAotdHlwZQotCi18YHRvVW5peFRpbWVzdGFtcGAgfGB0aW1ldXVpZGAgfENvbnZlcnRzIHRoZSBgdGltZXV1aWRgIGFyZ3VtZW50IGludG8gYQotYGJpZ0ludGAgcmF3IHZhbHVlCi0KLXxgdG9Vbml4VGltZXN0YW1wYCB8YHRpbWVzdGFtcGAgfENvbnZlcnRzIHRoZSBgdGltZXN0YW1wYCBhcmd1bWVudCBpbnRvCi1hIGBiaWdJbnRgIHJhdyB2YWx1ZQotCi18YHRvVW5peFRpbWVzdGFtcGAgfGBkYXRlYCB8Q29udmVydHMgdGhlIGBkYXRlYCBhcmd1bWVudCBpbnRvIGEgYGJpZ0ludGAKLXJhdyB2YWx1ZQotCi18YGRhdGVPZmAgfGB0aW1ldXVpZGAgfFNpbWlsYXIgdG8gYHRvVGltZXN0YW1wKHRpbWV1dWlkKWAgKERFUFJFQ0FURUQpCi0KLXxgdW5peFRpbWVzdGFtcE9mYCB8YHRpbWV1dWlkYCB8U2ltaWxhciB0byBgdG9Vbml4VGltZXN0YW1wKHRpbWV1dWlkKWAKLShERVBSRUNBVEVEKQotfD09PQotCi1bW2Jsb2JGdW5dXQotPT09PSBCbG9iIGNvbnZlcnNpb24gZnVuY3Rpb25zCi0KLUEgbnVtYmVyIG9mIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgdG8gYGBjb252ZXJ0JycgdGhlIG5hdGl2ZSB0eXBlcyBpbnRvCi1iaW5hcnkgZGF0YSAoYGJsb2JgKS4gRm9yIGV2ZXJ5IGA8bmF0aXZlLXR5cGU+YCBgdHlwZWAgc3VwcG9ydGVkIGJ5IENRTDMKLShhIG5vdGFibGUgZXhjZXB0aW9ucyBpcyBgYmxvYmAsIGZvciBvYnZpb3VzIHJlYXNvbnMpLCB0aGUgZnVuY3Rpb24KLWB0eXBlQXNCbG9iYCB0YWtlcyBhIGFyZ3VtZW50IG9mIHR5cGUgYHR5cGVgIGFuZCByZXR1cm4gaXQgYXMgYSBgYmxvYmAuCi1Db252ZXJzZWx5LCB0aGUgZnVuY3Rpb24gYGJsb2JBc1R5cGVgIHRha2VzIGEgNjQtYml0IGBibG9iYCBhcmd1bWVudCBhbmQKLWNvbnZlcnQgaXQgdG8gYSBgYmlnaW50YCB2YWx1ZS4gQW5kIHNvIGZvciBpbnN0YW5jZSwgYGJpZ2ludEFzQmxvYigzKWAKLWlzIGAweDAwMDAwMDAwMDAwMDAwMDNgIGFuZCBgYmxvYkFzQmlnaW50KDB4MDAwMDAwMDAwMDAwMDAwMylgIGlzIGAzYC4KLQotPT09IEFnZ3JlZ2F0ZXMKLQotQWdncmVnYXRlIGZ1bmN0aW9ucyB3b3JrIG9uIGEgc2V0IG9mIHJvd3MuIFRoZXkgcmVjZWl2ZSB2YWx1ZXMgZm9yIGVhY2gKLXJvdyBhbmQgcmV0dXJucyBvbmUgdmFsdWUgZm9yIHRoZSB3aG9sZSBzZXQuICsKLUlmIGBub3JtYWxgIGNvbHVtbnMsIGBzY2FsYXIgZnVuY3Rpb25zYCwgYFVEVGAgZmllbGRzLCBgd3JpdGV0aW1lYCBvcgotYHR0bGAgYXJlIHNlbGVjdGVkIHRvZ2V0aGVyIHdpdGggYWdncmVnYXRlIGZ1bmN0aW9ucywgdGhlIHZhbHVlcwotcmV0dXJuZWQgZm9yIHRoZW0gd2lsbCBiZSB0aGUgb25lcyBvZiB0aGUgZmlyc3Qgcm93IG1hdGNoaW5nIHRoZSBxdWVyeS4KLQotQ1FMMyBkaXN0aW5ndWlzaGVzIGJldHdlZW4gYnVpbHQtaW4gYWdncmVnYXRlcyAoc28gY2FsbGVkIGBuYXRpdmUKLWFnZ3JlZ2F0ZXMnKSBhbmQgbGluazojdWRhc1t1c2VyLWRlZmluZWQgYWdncmVnYXRlc10uIENRTDMgaW5jbHVkZXMKLXNldmVyYWwgbmF0aXZlIGFnZ3JlZ2F0ZXMsIGRlc2NyaWJlZCBiZWxvdzoKLQotW1tjb3VudEZjdF1dCi09PT09IENvdW50Ci0KLVRoZSBgY291bnRgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvdW50IHRoZSByb3dzIHJldHVybmVkIGJ5IGEgcXVlcnkuCi1FeGFtcGxlOgotCi1iYyhzYW1wbGUpLiArCi1TRUxFQ1QgQ09VTlQgKCopIEZST00gcGxheXM7ICsKLVNFTEVDVCBDT1VOVCAoMSkgRlJPTSBwbGF5czsKLQotSXQgYWxzbyBjYW4gYmUgdXNlZCB0byBjb3VudCB0aGUgbm9uIG51bGwgdmFsdWUgb2YgYSBnaXZlbiBjb2x1bW4uCi1FeGFtcGxlOgotCi1iYyhzYW1wbGUpLiArCi1TRUxFQ1QgQ09VTlQgKHNjb3JlcykgRlJPTSBwbGF5czsKLQotW1ttYXhNaW5GY3RzXV0KLT09PT0gTWF4IGFuZCBNaW4KLQotVGhlIGBtYXhgIGFuZCBgbWluYCBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bSBhbmQgdGhlCi1taW5pbXVtIHZhbHVlIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgZ2l2ZW4gY29sdW1uLgotCi1iYyhzYW1wbGUpLiArCi1TRUxFQ1QgTUlOIChwbGF5ZXJzKSwgTUFYIChwbGF5ZXJzKSBGUk9NIHBsYXlzIFdIRVJFIGdhbWUgPSBgcXVha2UnOwotCi1bW3N1bUZjdF1dCi09PT09IFN1bQotCi1UaGUgYHN1bWAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gc3VtIHVwIGFsbCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGEKLXF1ZXJ5IGZvciBhIGdpdmVuIGNvbHVtbi4KLQotYmMoc2FtcGxlKS4gKwotU0VMRUNUIFNVTSAocGxheWVycykgRlJPTSBwbGF5czsKLQotW1thdmdGY3RdXQotPT09PSBBdmcKLQotVGhlIGBhdmdgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIGF2ZXJhZ2Ugb2YgYWxsIHRoZSB2YWx1ZXMKLXJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgZ2l2ZW4gY29sdW1uLgotCi1iYyhzYW1wbGUpLiArCi1TRUxFQ1QgQVZHIChwbGF5ZXJzKSBGUk9NIHBsYXlzOwotCi1bW3VkZnNdXQotPT09IFVzZXItRGVmaW5lZCBGdW5jdGlvbnMKLQotVXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBhbGxvdyBleGVjdXRpb24gb2YgdXNlci1wcm92aWRlZCBjb2RlIGluCi1DYXNzYW5kcmEuIEJ5IGRlZmF1bHQsIENhc3NhbmRyYSBzdXBwb3J0cyBkZWZpbmluZyBmdW5jdGlvbnMgaW4gX0phdmFfCi1hbmQgX0phdmFTY3JpcHRfLiBTdXBwb3J0IGZvciBvdGhlciBKU1IgMjIzIGNvbXBsaWFudCBzY3JpcHRpbmcKLWxhbmd1YWdlcyAoc3VjaCBhcyBQeXRob24sIFJ1YnksIGFuZCBTY2FsYSkgaGFzIGJlZW4gcmVtb3ZlZCBpbiAzLjAuMTEuCi0KLVVERnMgYXJlIHBhcnQgb2YgdGhlIENhc3NhbmRyYSBzY2hlbWEuIEFzIHN1Y2gsIHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkKLXByb3BhZ2F0ZWQgdG8gYWxsIG5vZGVzIGluIHRoZSBjbHVzdGVyLgotCi1VREZzIGNhbiBiZSBfb3ZlcmxvYWRlZF8gLSBpLmUuIG11bHRpcGxlIFVERnMgd2l0aCBkaWZmZXJlbnQgYXJndW1lbnQKLXR5cGVzIGJ1dCB0aGUgc2FtZSBmdW5jdGlvbiBuYW1lLiBFeGFtcGxlOgotCi1iYyhzYW1wbGUpLiArCi1DUkVBVEUgRlVOQ1RJT04gc2FtcGxlICggYXJnIGludCApIOKApjsgKwotQ1JFQVRFIEZVTkNUSU9OIHNhbXBsZSAoIGFyZyB0ZXh0ICkg4oCmOwotCi1Vc2VyLWRlZmluZWQgZnVuY3Rpb25zIGFyZSBzdXNjZXB0aWJsZSB0byBhbGwgb2YgdGhlIG5vcm1hbCBwcm9ibGVtcwotd2l0aCB0aGUgY2hvc2VuIHByb2dyYW1taW5nIGxhbmd1YWdlLiBBY2NvcmRpbmdseSwgaW1wbGVtZW50YXRpb25zCi1zaG91bGQgYmUgc2FmZSBhZ2FpbnN0IG51bGwgcG9pbnRlciBleGNlcHRpb25zLCBpbGxlZ2FsIGFyZ3VtZW50cywgb3IKLWFueSBvdGhlciBwb3RlbnRpYWwgc291cmNlIG9mIGV4Y2VwdGlvbnMuIEFuIGV4Y2VwdGlvbiBkdXJpbmcgZnVuY3Rpb24KLWV4ZWN1dGlvbiB3aWxsIHJlc3VsdCBpbiB0aGUgZW50aXJlIHN0YXRlbWVudCBmYWlsaW5nLgotCi1JdCBpcyB2YWxpZCB0byB1c2UgX2NvbXBsZXhfIHR5cGVzIGxpa2UgY29sbGVjdGlvbnMsIHR1cGxlIHR5cGVzIGFuZAotdXNlci1kZWZpbmVkIHR5cGVzIGFzIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMuIFR1cGxlIHR5cGVzIGFuZAotdXNlci1kZWZpbmVkIHR5cGVzIGFyZSBoYW5kbGVkIGJ5IHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBvZiB0aGUKLURhdGFTdGF4IEphdmEgRHJpdmVyLiBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBKYXZhIERyaXZlcgotZm9yIGRldGFpbHMgb24gaGFuZGxpbmcgdHVwbGUgdHlwZXMgYW5kIHVzZXItZGVmaW5lZCB0eXBlcy4KLQotQXJndW1lbnRzIGZvciBmdW5jdGlvbnMgY2FuIGJlIGxpdGVyYWxzIG9yIHRlcm1zLiBQcmVwYXJlZCBzdGF0ZW1lbnQKLXBsYWNlaG9sZGVycyBjYW4gYmUgdXNlZCwgdG9vLgotCi1Ob3RlIHRoYXQgeW91IGNhbiB1c2UgdGhlIGRvdWJsZS1xdW90ZWQgc3RyaW5nIHN5bnRheCB0byBlbmNsb3NlIHRoZSBVREYKLXNvdXJjZSBjb2RlLiBGb3IgZXhhbXBsZToKLQotYmMoc2FtcGxlKS4uICsKLUNSRUFURSBGVU5DVElPTiBzb21lX2Z1bmN0aW9uICggYXJnIGludCApICsKLVJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICsKLVJFVFVSTlMgaW50ICsKLUxBTkdVQUdFIGphdmEgKwotQVMgJCQgcmV0dXJuIGFyZzsgJCQ7Ci0KLVNFTEVDVCBzb21lX2Z1bmN0aW9uKGNvbHVtbikgRlJPTSBhdGFibGUg4oCmOyArCi1VUERBVEUgYXRhYmxlIFNFVCBjb2wgPSBzb21lX2Z1bmN0aW9uKD8pIOKApjsgKwotcC4KLQotYmMoc2FtcGxlKS4gKwotQ1JFQVRFIFRZUEUgY3VzdG9tX3R5cGUgKHR4dCB0ZXh0LCBpIGludCk7ICsKLUNSRUFURSBGVU5DVElPTiBmY3RfdXNpbmdfdWR0ICggdWR0YXJnIGZyb3plbiApICsKLVJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICsKLVJFVFVSTlMgdGV4dCArCi1MQU5HVUFHRSBqYXZhICsKLUFTICQkIHJldHVybiB1ZHRhcmcuZ2V0U3RyaW5nKGBgdHh0JycpOyAkJDsKLQotVXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiBsaW5rOiNzZWxlY3RTdG10W2BTRUxFQ1RgXSwKLWxpbms6I2luc2VydFN0bXRbYElOU0VSVGBdIGFuZCBsaW5rOiN1cGRhdGVTdG10W2BVUERBVEVgXSBzdGF0ZW1lbnRzLgotCi1UaGUgaW1wbGljaXRseSBhdmFpbGFibGUgYHVkZkNvbnRleHRgIGZpZWxkIChvciBiaW5kaW5nIGZvciBzY3JpcHQgVURGcykKLXByb3ZpZGVzIHRoZSBuZWNjZXNzYXJ5IGZ1bmN0aW9uYWxpdHkgdG8gY3JlYXRlIG5ldyBVRFQgYW5kIHR1cGxlCi12YWx1ZXMuCi0KLWJjKHNhbXBsZSkuICsKLUNSRUFURSBUWVBFIGN1c3RvbV90eXBlICh0eHQgdGV4dCwgaSBpbnQpOyArCi1DUkVBVEUgRlVOQ1RJT04gZmN0X3VzaW5nX3VkdCAoIHNvbWVhcmcgaW50ICkgKwotUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgKwotUkVUVVJOUyBjdXN0b21fdHlwZSArCi1MQU5HVUFHRSBqYXZhICsKLUFTICQkICsKLVVEVFZhbHVlIHVkdCA9IHVkZkNvbnRleHQubmV3UmV0dXJuVURUVmFsdWUoKTsgKwotdWR0LnNldFN0cmluZyhgYHR4dCcnLCBgYHNvbWUgc3RyaW5nJycpOyArCi11ZHQuc2V0SW50KGBgaScnLCA0Mik7ICsKLXJldHVybiB1ZHQ7ICsKLSQkOwotCi1UaGUgZGVmaW5pdGlvbiBvZiB0aGUgYFVERkNvbnRleHRgIGludGVyZmFjZSBjYW4gYmUgZm91bmQgaW4gdGhlIEFwYWNoZQotQ2Fzc2FuZHJhIHNvdXJjZSBjb2RlIGZvcgotYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlVERkNvbnRleHRgLgotCi1iYyhzYW1wbGUpLiArCi1wdWJsaWMgaW50ZXJmYWNlIFVERkNvbnRleHQgKwotXHsgKwotVURUVmFsdWUgbmV3QXJnVURUVmFsdWUoU3RyaW5nIGFyZ05hbWUpOyArCi1VRFRWYWx1ZSBuZXdBcmdVRFRWYWx1ZShpbnQgYXJnTnVtKTsgKwotVURUVmFsdWUgbmV3UmV0dXJuVURUVmFsdWUoKTsgKwotVURUVmFsdWUgbmV3VURUVmFsdWUoU3RyaW5nIHVkdE5hbWUpOyArCi1UdXBsZVZhbHVlIG5ld0FyZ1R1cGxlVmFsdWUoU3RyaW5nIGFyZ05hbWUpOyArCi1UdXBsZVZhbHVlIG5ld0FyZ1R1cGxlVmFsdWUoaW50IGFyZ051bSk7ICsKLVR1cGxlVmFsdWUgbmV3UmV0dXJuVHVwbGVWYWx1ZSgpOyArCi1UdXBsZVZhbHVlIG5ld1R1cGxlVmFsdWUoU3RyaW5nIGNxbERlZmluaXRpb24pOyArCi19Ci0KLUphdmEgVURGcyBhbHJlYWR5IGhhdmUgc29tZSBpbXBvcnRzIGZvciBjb21tb24gaW50ZXJmYWNlcyBhbmQgY2xhc3NlcwotZGVmaW5lZC4gVGhlc2UgaW1wb3J0cyBhcmU6ICsKLVBsZWFzZSBub3RlLCB0aGF0IHRoZXNlIGNvbnZlbmllbmNlIGltcG9ydHMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHNjcmlwdAotVURGcy4KLQotYmMoc2FtcGxlKS4gKwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7ICsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsgKwotaW1wb3J0IGphdmEudXRpbC5NYXA7ICsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OyArCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVURGQ29udGV4dDsgKwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5UeXBlQ29kZWM7ICsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuVHVwbGVWYWx1ZTsgKwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5VRFRWYWx1ZTsKLQotU2VlIGxpbms6I2NyZWF0ZUZ1bmN0aW9uU3RtdFtgQ1JFQVRFIEZVTkNUSU9OYF0gYW5kCi1saW5rOiNkcm9wRnVuY3Rpb25TdG10W2BEUk9QIEZVTkNUSU9OYF0uCi0KLVtbdWRhc11dCi09PT0gVXNlci1EZWZpbmVkIEFnZ3JlZ2F0ZXMKLQotVXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgYWxsb3cgY3JlYXRpb24gb2YgY3VzdG9tIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMKLXVzaW5nIGxpbms6I3VkZnNbVURGc10uIENvbW1vbiBleGFtcGxlcyBvZiBhZ2dyZWdhdGUgZnVuY3Rpb25zIGFyZQotX2NvdW50XywgX21pbl8sIGFuZCBfbWF4Xy4KLQotRWFjaCBhZ2dyZWdhdGUgcmVxdWlyZXMgYW4gX2luaXRpYWwgc3RhdGVfIChgSU5JVENPTkRgLCB3aGljaCBkZWZhdWx0cwotdG8gYG51bGxgKSBvZiB0eXBlIGBTVFlQRWAuIFRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgc3RhdGUgZnVuY3Rpb24KLW11c3QgaGF2ZSB0eXBlIGBTVFlQRWAuIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIG9mIHRoZSBzdGF0ZSBmdW5jdGlvbgotbXVzdCBtYXRjaCB0aGUgdHlwZXMgb2YgdGhlIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGUgYXJndW1lbnRzLiBUaGUgc3RhdGUKLWZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIHJvdywgYW5kIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUKLXN0YXRlIGZ1bmN0aW9uIGJlY29tZXMgdGhlIG5ldyBzdGF0ZS4gQWZ0ZXIgYWxsIHJvd3MgYXJlIHByb2Nlc3NlZCwgdGhlCi1vcHRpb25hbCBgRklOQUxGVU5DYCBpcyBleGVjdXRlZCB3aXRoIGxhc3Qgc3RhdGUgdmFsdWUgYXMgaXRzIGFyZ3VtZW50LgotCi1gU1RZUEVgIGlzIG1hbmRhdG9yeSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIHBvc3NpYmx5Ci1vdmVybG9hZGVkIHZlcnNpb25zIG9mIHRoZSBzdGF0ZSBhbmQvb3IgZmluYWwgZnVuY3Rpb24gKHNpbmNlIHRoZQotb3ZlcmxvYWQgY2FuIGFwcGVhciBhZnRlciBjcmVhdGlvbiBvZiB0aGUgYWdncmVnYXRlKS4KLQotVXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgY2FuIGJlIHVzZWQgaW4gbGluazojc2VsZWN0U3RtdFtgU0VMRUNUYF0KLXN0YXRlbWVudC4KLQotQSBjb21wbGV0ZSB3b3JraW5nIGV4YW1wbGUgZm9yIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGVzIChhc3N1bWluZyB0aGF0IGEKLWtleXNwYWNlIGhhcyBiZWVuIHNlbGVjdGVkIHVzaW5nIHRoZSBsaW5rOiN1c2VTdG10W2BVU0VgXSBzdGF0ZW1lbnQpOgotCi1iYyhzYW1wbGUpLi4gKwotQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gYXZlcmFnZVN0YXRlICggc3RhdGUgdHVwbGU8aW50LGJpZ2ludD4sIHZhbAotaW50ICkgKwotQ0FMTEVEIE9OIE5VTEwgSU5QVVQgKwotUkVUVVJOUyB0dXBsZTxpbnQsYmlnaW50PiArCi1MQU5HVUFHRSBqYXZhICsKLUFTIOKAmSArCi1pZiAodmFsICE9IG51bGwpIFx7ICsKLXN0YXRlLnNldEludCgwLCBzdGF0ZS5nZXRJbnQoMCkrMSk7ICsKLXN0YXRlLnNldExvbmcoMSwgc3RhdGUuZ2V0TG9uZygxKSt2YWwuaW50VmFsdWUoKSk7ICsKLX0gKwotcmV0dXJuIHN0YXRlOyArCi3igJk7Ci0KLUNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIGF2ZXJhZ2VGaW5hbCAoIHN0YXRlIHR1cGxlPGludCxiaWdpbnQ+ICkgKwotQ0FMTEVEIE9OIE5VTEwgSU5QVVQgKwotUkVUVVJOUyBkb3VibGUgKwotTEFOR1VBR0UgamF2YSArCi1BUyDigJkgKwotZG91YmxlIHIgPSAwOyArCi1pZiAoc3RhdGUuZ2V0SW50KDApID09IDApIHJldHVybiBudWxsOyArCi1yID0gc3RhdGUuZ2V0TG9uZygxKTsgKwotciAvPSBzdGF0ZS5nZXRJbnQoMCk7ICsKLXJldHVybiBEb3VibGUudmFsdWVPZsKuOyArCi3igJk7Ci0KLUNSRUFURSBPUiBSRVBMQUNFIEFHR1JFR0FURSBhdmVyYWdlICggaW50ICkgKwotU0ZVTkMgYXZlcmFnZVN0YXRlICsKLVNUWVBFIHR1cGxlPGludCxiaWdpbnQ+ICsKLUZJTkFMRlVOQyBhdmVyYWdlRmluYWwgKwotSU5JVENPTkQgKDAsIDApOwotCi1DUkVBVEUgVEFCTEUgYXRhYmxlICggKwotcGsgaW50IFBSSU1BUlkgS0VZLCArCi12YWwgaW50KTsgKwotSU5TRVJUIElOVE8gYXRhYmxlIChwaywgdmFsKSBWQUxVRVMgKDEsMSk7ICsKLUlOU0VSVCBJTlRPIGF0YWJsZSAocGssIHZhbCkgVkFMVUVTICgyLDIpOyArCi1JTlNFUlQgSU5UTyBhdGFibGUgKHBrLCB2YWwpIFZBTFVFUyAoMywzKTsgKwotSU5TRVJUIElOVE8gYXRhYmxlIChwaywgdmFsKSBWQUxVRVMgKDQsNCk7ICsKLVNFTEVDVCBhdmVyYWdlKHZhbCkgRlJPTSBhdGFibGU7ICsKLXAuCi0KLVNlZSBsaW5rOiNjcmVhdGVBZ2dyZWdhdGVTdG10W2BDUkVBVEUgQUdHUkVHQVRFYF0gYW5kCi1saW5rOiNkcm9wQWdncmVnYXRlU3RtdFtgRFJPUCBBR0dSRUdBVEVgXS4KLQotW1tqc29uXV0KLT09PSBKU09OIFN1cHBvcnQKLQotQ2Fzc2FuZHJhIDIuMiBpbnRyb2R1Y2VzIEpTT04gc3VwcG9ydCB0byBsaW5rOiNzZWxlY3RTdG10W2BTRUxFQ1RgXSBhbmQKLWxpbms6I2luc2VydFN0bXRbYElOU0VSVGBdIHN0YXRlbWVudHMuIFRoaXMgc3VwcG9ydCBkb2VzIG5vdAotZnVuZGFtZW50YWxseSBhbHRlciB0aGUgQ1FMIEFQSSAoZm9yIGV4YW1wbGUsIHRoZSBzY2hlbWEgaXMgc3RpbGwKLWVuZm9yY2VkKSwgaXQgc2ltcGx5IHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gd29yayB3aXRoIEpTT04KLWRvY3VtZW50cy4KLQotW1tzZWxlY3RKc29uXV0KLT09PT0gU0VMRUNUIEpTT04KLQotV2l0aCBgU0VMRUNUYCBzdGF0ZW1lbnRzLCB0aGUgbmV3IGBKU09OYCBrZXl3b3JkIGNhbiBiZSB1c2VkIHRvIHJldHVybgotZWFjaCByb3cgYXMgYSBzaW5nbGUgYEpTT05gIGVuY29kZWQgbWFwLiBUaGUgcmVtYWluZGVyIG9mIHRoZSBgU0VMRUNUYAotc3RhdG1lbnQgYmVoYXZpb3IgaXMgdGhlIHNhbWUuCi0KLVRoZSByZXN1bHQgbWFwIGtleXMgYXJlIHRoZSBzYW1lIGFzIHRoZSBjb2x1bW4gbmFtZXMgaW4gYSBub3JtYWwgcmVzdWx0Ci1zZXQuIEZvciBleGFtcGxlLCBhIHN0YXRlbWVudCBsaWtlIGBgYFNFTEVDVCBKU09OIGEsIHR0bChiKSBGUk9NIC4uLmAnJwotd291bGQgcmVzdWx0IGluIGEgbWFwIHdpdGgga2V5cyBgImEiYCBhbmQgYCJ0dGwoYikiYC4gSG93ZXZlciwgdGhpcyBpcwotb25lIG5vdGFibGUgZXhjZXB0aW9uOiBmb3Igc3ltbWV0cnkgd2l0aCBgSU5TRVJUIEpTT05gIGJlaGF2aW9yLAotY2FzZS1zZW5zaXRpdmUgY29sdW1uIG5hbWVzIHdpdGggdXBwZXItY2FzZSBsZXR0ZXJzIHdpbGwgYmUgc3Vycm91bmRlZAotd2l0aCBkb3VibGUgcXVvdGVzLiBGb3IgZXhhbXBsZSwgYGBgU0VMRUNUIEpTT04gbXlDb2x1bW4gRlJPTSAuLi5gJycKLXdvdWxkIHJlc3VsdCBpbiBhIG1hcCBrZXkgYCJcIm15Q29sdW1uXCIiYCAobm90ZSB0aGUgZXNjYXBlZCBxdW90ZXMpLgotCi1UaGUgbWFwIHZhbHVlcyB3aWxsIGBKU09OYC1lbmNvZGVkIHJlcHJlc2VudGF0aW9ucyAoYXMgZGVzY3JpYmVkIGJlbG93KQotb2YgdGhlIHJlc3VsdCBzZXQgdmFsdWVzLgotCi1bW2luc2VydEpzb25dXQotPT09PSBJTlNFUlQgSlNPTgotCi1XaXRoIGBJTlNFUlRgIHN0YXRlbWVudHMsIHRoZSBuZXcgYEpTT05gIGtleXdvcmQgY2FuIGJlIHVzZWQgdG8gZW5hYmxlCi1pbnNlcnRpbmcgYSBgSlNPTmAgZW5jb2RlZCBtYXAgYXMgYSBzaW5nbGUgcm93LiBUaGUgZm9ybWF0IG9mIHRoZSBgSlNPTmAKLW1hcCBzaG91bGQgZ2VuZXJhbGx5IG1hdGNoIHRoYXQgcmV0dXJuZWQgYnkgYSBgU0VMRUNUIEpTT05gIHN0YXRlbWVudCBvbgotdGhlIHNhbWUgdGFibGUuIEluIHBhcnRpY3VsYXIsIGNhc2Utc2Vuc2l0aXZlIGNvbHVtbiBuYW1lcyBzaG91bGQgYmUKLXN1cnJvdW5kZWQgd2l0aCBkb3VibGUgcXVvdGVzLiBGb3IgZXhhbXBsZSwgdG8gaW5zZXJ0IGludG8gYSB0YWJsZSB3aXRoCi10d28gY29sdW1ucyBuYW1lZCBgYG15S2V5JycgYW5kIGBgdmFsdWUnJywgeW91IHdvdWxkIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLWJjKHNhbXBsZSkuICsKLUlOU0VSVCBJTlRPIG15dGFibGUgSlNPTiBgXHtgYFwnJ215S2V5XGBgJyc6IDAsIGBgdmFsdWUnJzogMH0nCi0KLUFueSBjb2x1bW5zIHdoaWNoIGFyZSBvbW1pdHRlZCBmcm9tIHRoZSBgSlNPTmAgbWFwIHdpbGwgYmUgZGVmYXVsdGVkIHRvCi1hIGBOVUxMYCB2YWx1ZSAod2hpY2ggd2lsbCByZXN1bHQgaW4gYSB0b21ic3RvbmUgYmVpbmcgY3JlYXRlZCkuCi0KLVtbanNvbkVuY29kaW5nXV0KLT09PT0gSlNPTiBFbmNvZGluZyBvZiBDYXNzYW5kcmEgRGF0YSBUeXBlcwotCi1XaGVyZSBwb3NzaWJsZSwgQ2Fzc2FuZHJhIHdpbGwgcmVwcmVzZW50IGFuZCBhY2NlcHQgZGF0YSB0eXBlcyBpbiB0aGVpcgotbmF0aXZlIGBKU09OYCByZXByZXNlbnRhdGlvbi4gQ2Fzc2FuZHJhIHdpbGwgYWxzbyBhY2NlcHQgc3RyaW5nCi1yZXByZXNlbnRhdGlvbnMgbWF0Y2hpbmcgdGhlIENRTCBsaXRlcmFsIGZvcm1hdCBmb3IgYWxsIHNpbmdsZS1maWVsZAotdHlwZXMuIEZvciBleGFtcGxlLCBmbG9hdHMsIGludHMsIFVVSURzLCBhbmQgZGF0ZXMgY2FuIGJlIHJlcHJlc2VudGVkIGJ5Ci1DUUwgbGl0ZXJhbCBzdHJpbmdzLiBIb3dldmVyLCBjb21wb3VuZCB0eXBlcywgc3VjaCBhcyBjb2xsZWN0aW9ucywKLXR1cGxlcywgYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBtdXN0IGJlIHJlcHJlc2VudGVkIGJ5IG5hdGl2ZSBgSlNPTmAKLWNvbGxlY3Rpb25zIChtYXBzIGFuZCBsaXN0cykgb3IgYSBKU09OLWVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mCi10aGUgY29sbGVjdGlvbi4KLQotVGhlIGZvbGxvd2luZyB0YWJsZSBkZXNjcmliZXMgdGhlIGVuY29kaW5ncyB0aGF0IENhc3NhbmRyYSB3aWxsIGFjY2VwdAotaW4gYElOU0VSVCBKU09OYCB2YWx1ZXMgKGFuZCBgZnJvbUpzb24oKWAgYXJndW1lbnRzKSBhcyB3ZWxsIGFzIHRoZQotZm9ybWF0IENhc3NhbmRyYSB3aWxsIHVzZSB3aGVuIHJldHVybmluZyBkYXRhIGZvciBgU0VMRUNUIEpTT05gCi1zdGF0ZW1lbnRzIChhbmQgYGZyb21Kc29uKClgKToKLQotW2NvbHM9IiwsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18dHlwZSB8Zm9ybWF0cyBhY2NlcHRlZCB8cmV0dXJuIGZvcm1hdCB8bm90ZXMKLXxgYXNjaWlgIHxzdHJpbmcgfHN0cmluZyB8VXNlcyBKU09O4oCZcyBgXHVgIGNoYXJhY3RlciBlc2NhcGUKLQotfGBiaWdpbnRgIHxpbnRlZ2VyLCBzdHJpbmcgfGludGVnZXIgfFN0cmluZyBtdXN0IGJlIHZhbGlkIDY0IGJpdCBpbnRlZ2VyCi0KLXxgYmxvYmAgfHN0cmluZyB8c3RyaW5nIHxTdHJpbmcgc2hvdWxkIGJlIDB4IGZvbGxvd2VkIGJ5IGFuIGV2ZW4gbnVtYmVyCi1vZiBoZXggZGlnaXRzCi0KLXxgYm9vbGVhbmAgfGJvb2xlYW4sIHN0cmluZyB8Ym9vbGVhbiB8U3RyaW5nIG11c3QgYmUgYGB0cnVlJycgb3IKLWBgZmFsc2UnJwotCi18YGRhdGVgIHxzdHJpbmcgfHN0cmluZyB8RGF0ZSBpbiBmb3JtYXQgYFlZWVktTU0tRERgLCB0aW1lem9uZSBVVEMKLQotfGBkZWNpbWFsYCB8aW50ZWdlciwgZmxvYXQsIHN0cmluZyB8ZmxvYXQgfE1heSBleGNlZWQgMzIgb3IgNjQtYml0Ci1JRUVFLTc1NCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gaW4gY2xpZW50LXNpZGUgZGVjb2RlcgotCi18YGRvdWJsZWAgfGludGVnZXIsIGZsb2F0LCBzdHJpbmcgfGZsb2F0IHxTdHJpbmcgbXVzdCBiZSB2YWxpZCBpbnRlZ2VyCi1vciBmbG9hdAotCi18YGZsb2F0YCB8aW50ZWdlciwgZmxvYXQsIHN0cmluZyB8ZmxvYXQgfFN0cmluZyBtdXN0IGJlIHZhbGlkIGludGVnZXIgb3IKLWZsb2F0Ci0KLXxgaW5ldGAgfHN0cmluZyB8c3RyaW5nIHxJUHY0IG9yIElQdjYgYWRkcmVzcwotCi18YGludGAgfGludGVnZXIsIHN0cmluZyB8aW50ZWdlciB8U3RyaW5nIG11c3QgYmUgdmFsaWQgMzIgYml0IGludGVnZXIKLQotfGBsaXN0YCB8bGlzdCwgc3RyaW5nIHxsaXN0IHxVc2VzIEpTT07igJlzIG5hdGl2ZSBsaXN0IHJlcHJlc2VudGF0aW9uCi0KLXxgbWFwYCB8bWFwLCBzdHJpbmcgfG1hcCB8VXNlcyBKU09O4oCZcyBuYXRpdmUgbWFwIHJlcHJlc2VudGF0aW9uCi0KLXxgc21hbGxpbnRgIHxpbnRlZ2VyLCBzdHJpbmcgfGludGVnZXIgfFN0cmluZyBtdXN0IGJlIHZhbGlkIDE2IGJpdAotaW50ZWdlcgotCi18YHNldGAgfGxpc3QsIHN0cmluZyB8bGlzdCB8VXNlcyBKU09O4oCZcyBuYXRpdmUgbGlzdCByZXByZXNlbnRhdGlvbgotCi18YHRleHRgIHxzdHJpbmcgfHN0cmluZyB8VXNlcyBKU09O4oCZcyBgXHVgIGNoYXJhY3RlciBlc2NhcGUKLQotfGB0aW1lYCB8c3RyaW5nIHxzdHJpbmcgfFRpbWUgb2YgZGF5IGluIGZvcm1hdCBgSEgtTU0tU1NbLmZmZmZmZmZmZl1gCi0KLXxgdGltZXN0YW1wYCB8aW50ZWdlciwgc3RyaW5nIHxzdHJpbmcgfEEgdGltZXN0YW1wLiBTdHJpbmdzIGNvbnN0YW50IGFyZQotYWxsb3cgdG8gaW5wdXQgdGltZXN0YW1wcyBhcyBkYXRlcywgc2VlIGxpbms6I3VzaW5nZGF0ZXNbV29ya2luZyB3aXRoCi1kYXRlc10gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uIERhdGVzdGFtcHMgd2l0aCBmb3JtYXQKLWBZWVlZLU1NLUREIEhIOk1NOlNTLlNTU2AgYXJlIHJldHVybmVkLgotCi18YHRpbWV1dWlkYCB8c3RyaW5nIHxzdHJpbmcgfFR5cGUgMSBVVUlELiBTZWUgbGluazojY29uc3RhbnRzW0NvbnN0YW50c10KLWZvciB0aGUgVVVJRCBmb3JtYXQKLQotfGB0aW55aW50YCB8aW50ZWdlciwgc3RyaW5nIHxpbnRlZ2VyIHxTdHJpbmcgbXVzdCBiZSB2YWxpZCA4IGJpdCBpbnRlZ2VyCi0KLXxgdHVwbGVgIHxsaXN0LCBzdHJpbmcgfGxpc3QgfFVzZXMgSlNPTuKAmXMgbmF0aXZlIGxpc3QgcmVwcmVzZW50YXRpb24KLQotfGBVRFRgIHxtYXAsIHN0cmluZyB8bWFwIHxVc2VzIEpTT07igJlzIG5hdGl2ZSBtYXAgcmVwcmVzZW50YXRpb24gd2l0aAotZmllbGQgbmFtZXMgYXMga2V5cwotCi18YHV1aWRgIHxzdHJpbmcgfHN0cmluZyB8U2VlIGxpbms6I2NvbnN0YW50c1tDb25zdGFudHNdIGZvciB0aGUgVVVJRAotZm9ybWF0Ci0KLXxgdmFyY2hhcmAgfHN0cmluZyB8c3RyaW5nIHxVc2VzIEpTT07igJlzIGBcdWAgY2hhcmFjdGVyIGVzY2FwZQotCi18YHZhcmludGAgfGludGVnZXIsIHN0cmluZyB8aW50ZWdlciB8VmFyaWFibGUgbGVuZ3RoOyBtYXkgb3ZlcmZsb3cgMzIgb3IKLTY0IGJpdCBpbnRlZ2VycyBpbiBjbGllbnQtc2lkZSBkZWNvZGVyCi18PT09Ci0KLVtbZnJvbUpzb25dXQotPT09PSBUaGUgZnJvbUpzb24oKSBGdW5jdGlvbgotCi1UaGUgYGZyb21Kc29uKClgIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHNpbWlsYXJseSB0byBgSU5TRVJUIEpTT05gLCBidXQKLWZvciBhIHNpbmdsZSBjb2x1bW4gdmFsdWUuIEl0IG1heSBvbmx5IGJlIHVzZWQgaW4gdGhlIGBWQUxVRVNgIGNsYXVzZSBvZgotYW4gYElOU0VSVGAgc3RhdGVtZW50IG9yIGFzIG9uZSBvZiB0aGUgY29sdW1uIHZhbHVlcyBpbiBhbiBgVVBEQVRFYCwKLWBERUxFVEVgLCBvciBgU0VMRUNUYCBzdGF0ZW1lbnQuIEZvciBleGFtcGxlLCBpdCBjYW5ub3QgYmUgdXNlZCBpbiB0aGUKLXNlbGVjdGlvbiBjbGF1c2Ugb2YgYSBgU0VMRUNUYCBzdGF0ZW1lbnQuCi0KLVtbdG9Kc29uXV0KLT09PT0gVGhlIHRvSnNvbigpIEZ1bmN0aW9uCi0KLVRoZSBgdG9Kc29uKClgIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHNpbWlsYXJseSB0byBgU0VMRUNUIEpTT05gLCBidXQgZm9yCi1hIHNpbmdsZSBjb2x1bW4gdmFsdWUuIEl0IG1heSBvbmx5IGJlIHVzZWQgaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2Ugb2YgYQotYFNFTEVDVGAgc3RhdGVtZW50LgotCi1bW2FwcGVuZGl4QV1dCi09PT0gQXBwZW5kaXggQTogQ1FMIEtleXdvcmRzCi0KLUNRTCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gX3Jlc2VydmVkXyBhbmQgX25vbi1yZXNlcnZlZF8ga2V5d29yZHMuCi1SZXNlcnZlZCBrZXl3b3JkcyBjYW5ub3QgYmUgdXNlZCBhcyBpZGVudGlmaWVyLCB0aGV5IGFyZSB0cnVseSByZXNlcnZlZAotZm9yIHRoZSBsYW5ndWFnZSAoYnV0IG9uZSBjYW4gZW5jbG9zZSBhIHJlc2VydmVkIGtleXdvcmQgYnkKLWRvdWJsZS1xdW90ZXMgdG8gdXNlIGl0IGFzIGFuIGlkZW50aWZpZXIpLiBOb24tcmVzZXJ2ZWQga2V5d29yZHMgaG93ZXZlcgotb25seSBoYXZlIGEgc3BlY2lmaWMgbWVhbmluZyBpbiBjZXJ0YWluIGNvbnRleHQgYnV0IGNhbiB1c2VkIGFzCi1pZGVudGlmZXIgb3RoZXJ3aXNlLiBUaGUgb25seSBfcmFpc29uIGTigJnDqnRyZV8gb2YgdGhlc2Ugbm9uLXJlc2VydmVkCi1rZXl3b3JkcyBpcyBjb252ZW5pZW5jZTogc29tZSBrZXl3b3JkIGFyZSBub24tcmVzZXJ2ZWQgd2hlbiBpdCB3YXMKLWFsd2F5cyBlYXN5IGZvciB0aGUgcGFyc2VyIHRvIGRlY2lkZSB3aGV0aGVyIHRoZXkgd2VyZSB1c2VkIGFzIGtleXdvcmRzCi1vciBub3QuCi0KLVtjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxLZXl3b3JkIHxSZXNlcnZlZD8KLXxgQUREYCB8eWVzCi18YEFHR1JFR0FURWAgfG5vCi18YEFMTGAgfG5vCi18YEFMTE9XYCB8eWVzCi18YEFMVEVSYCB8eWVzCi18YEFORGAgfHllcwotfGBBUFBMWWAgfHllcwotfGBBU2AgfG5vCi18YEFTQ2AgfHllcwotfGBBU0NJSWAgfG5vCi18YEFVVEhPUklaRWAgfHllcwotfGBCQVRDSGAgfHllcwotfGBCRUdJTmAgfHllcwotfGBCSUdJTlRgIHxubwotfGBCTE9CYCB8bm8KLXxgQk9PTEVBTmAgfG5vCi18YEJZYCB8eWVzCi18YENBTExFRGAgfG5vCi18YENBU1RgIHxubwotfGBDTFVTVEVSSU5HYCB8bm8KLXxgQ09MVU1ORkFNSUxZYCB8eWVzCi18YENPTVBBQ1RgIHxubwotfGBDT05UQUlOU2AgfG5vCi18YENPVU5UYCB8bm8KLXxgQ09VTlRFUmAgfG5vCi18YENSRUFURWAgfHllcwotfGBDVVNUT01gIHxubwotfGBEQVRFYCB8bm8KLXxgREVDSU1BTGAgfG5vCi18YERFRkFVTFRgIHx5ZXMKLXxgREVMRVRFYCB8eWVzCi18YERFU0NgIHx5ZXMKLXxgREVTQ1JJQkVgIHx5ZXMKLXxgRElTVElOQ1RgIHxubwotfGBET1VCTEVgIHxubwotfGBEUk9QYCB8eWVzCi18YERVUkFUSU9OYCB8bm8KLXxgRU5UUklFU2AgfHllcwotfGBFWEVDVVRFYCB8eWVzCi18YEVYSVNUU2AgfG5vCi18YEZJTFRFUklOR2AgfG5vCi18YEZJTkFMRlVOQ2AgfG5vCi18YEZMT0FUYCB8bm8KLXxgRlJPTWAgfHllcwotfGBGUk9aRU5gIHxubwotfGBGVUxMYCB8eWVzCi18YEZVTkNUSU9OYCB8bm8KLXxgRlVOQ1RJT05TYCB8bm8KLXxgR1JBTlRgIHx5ZXMKLXxgR1JPVVBgIHxubwotfGBJRmAgfHllcwotfGBJTmAgfHllcwotfGBJTkRFWGAgfHllcwotfGBJTkVUYCB8bm8KLXxgSU5GSU5JVFlgIHx5ZXMKLXxgSU5JVENPTkRgIHxubwotfGBJTlBVVGAgfG5vCi18YElOU0VSVGAgfHllcwotfGBJTlRgIHxubwotfGBJTlRPYCB8eWVzCi18YElTYCB8eWVzCi18YEpTT05gIHxubwotfGBLRVlgIHxubwotfGBLRVlTYCB8bm8KLXxgS0VZU1BBQ0VgIHx5ZXMKLXxgS0VZU1BBQ0VTYCB8bm8KLXxgTEFOR1VBR0VgIHxubwotfGBMSUtFYCB8bm8KLXxgTElNSVRgIHx5ZXMKLXxgTElTVGAgfG5vCi18YExPR0lOYCB8bm8KLXxgTUFQYCB8bm8KLXxgTUFURVJJQUxJWkVEYCB8eWVzCi18YE1CRUFOYCB8eWVzCi18YE1CRUFOU2AgfHllcwotfGBNT0RJRllgIHx5ZXMKLXxgTkFOYCB8eWVzCi18YE5PTE9HSU5gIHxubwotfGBOT1JFQ1VSU0lWRWAgfHllcwotfGBOT1NVUEVSVVNFUmAgfG5vCi18YE5PVGAgfHllcwotfGBOVUxMYCB8eWVzCi18YE9GYCB8eWVzCi18YE9OYCB8eWVzCi18YE9QVElPTlNgIHxubwotfGBPUmAgfHllcwotfGBPUkRFUmAgfHllcwotfGBQQVJUSVRJT05gIHxubwotfGBQQVNTV09SRGAgfG5vCi18YFBFUmAgfG5vCi18YFBFUk1JU1NJT05gIHxubwotfGBQRVJNSVNTSU9OU2AgfG5vCi18YFBSSU1BUllgIHx5ZXMKLXxgUkVOQU1FYCB8eWVzCi18YFJFUExBQ0VgIHx5ZXMKLXxgUkVUVVJOU2AgfG5vCi18YFJFVk9LRWAgfHllcwotfGBST0xFYCB8bm8KLXxgUk9MRVNgIHxubwotfGBTQ0hFTUFgIHx5ZXMKLXxgU0VMRUNUYCB8eWVzCi18YFNFVGAgfHllcwotfGBTRlVOQ2AgfG5vCi18YFNNQUxMSU5UYCB8bm8KLXxgU1RBVElDYCB8bm8KLXxgU1RPUkFHRWAgfG5vCi18YFNUWVBFYCB8bm8KLXxgU1VQRVJVU0VSYCB8bm8KLXxgVEFCTEVgIHx5ZXMKLXxgVEVYVGAgfG5vCi18YFRJTUVgIHxubwotfGBUSU1FU1RBTVBgIHxubwotfGBUSU1FVVVJRGAgfG5vCi18YFRJTllJTlRgIHxubwotfGBUT2AgfHllcwotfGBUT0tFTmAgfHllcwotfGBUUklHR0VSYCB8bm8KLXxgVFJVTkNBVEVgIHx5ZXMKLXxgVFRMYCB8bm8KLXxgVFVQTEVgIHxubwotfGBUWVBFYCB8bm8KLXxgVU5MT0dHRURgIHx5ZXMKLXxgVU5TRVRgIHx5ZXMKLXxgVVBEQVRFYCB8eWVzCi18YFVTRWAgfHllcwotfGBVU0VSYCB8bm8KLXxgVVNFUlNgIHxubwotfGBVU0lOR2AgfHllcwotfGBVVUlEYCB8bm8KLXxgVkFMVUVTYCB8bm8KLXxgVkFSQ0hBUmAgfG5vCi18YFZBUklOVGAgfG5vCi18YFZJRVdgIHx5ZXMKLXxgV0hFUkVgIHx5ZXMKLXxgV0lUSGAgfHllcwotfGBXUklURVRJTUVgIHxubwotfD09PQotCi1bW2FwcGVuZGl4Ql1dCi09PT0gQXBwZW5kaXggQjogQ1FMIFJlc2VydmVkIFR5cGVzCi0KLVRoZSBmb2xsb3dpbmcgdHlwZSBuYW1lcyBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGJ5IENRTCwgYnV0IGFyZSByZXNlcnZlZAotZm9yIHBvdGVudGlhbCBmdXR1cmUgdXNlLiBVc2VyLWRlZmluZWQgdHlwZXMgbWF5IG5vdCB1c2UgcmVzZXJ2ZWQgdHlwZQotbmFtZXMgYXMgdGhlaXIgbmFtZS4KLQotW2NvbHM9IiIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18dHlwZQotfGBiaXRzdHJpbmdgCi18YGJ5dGVgCi18YGNvbXBsZXhgCi18YGRhdGVgCi18YGVudW1gCi18YGludGVydmFsYAotfGBtYWNhZGRyYAotfD09PQotCi09PT0gQ2hhbmdlcwotCi1UaGUgZm9sbG93aW5nIGRlc2NyaWJlcyB0aGUgY2hhbmdlcyBpbiBlYWNoIHZlcnNpb24gb2YgQ1FMLgotCi09PT09IDMuNC4zCi0KLSogU3VwcG9ydCBmb3IgYEdST1VQIEJZYC4gU2VlIGxpbms6I3NlbGVjdEdyb3VwQnlbYDxncm91cC1ieT5gXSAoc2VlCi1odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xMDcwNylbQ0FTU0FORFJBLTEwNzA3XS4KLQotPT09PSAzLjQuMgotCi0qIFN1cHBvcnQgZm9yIHNlbGVjdGluZyBlbGVtZW50cyBhbmQgc2xpY2VzIG9mIGEgY29sbGVjdGlvbgotKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTczOTYpW0NBU1NBTkRSQS03Mzk2XS4KLQotPT09PSAzLjQuMgotCi0qIGxpbms6I3VwZGF0ZU9wdGlvbnNbYElOU0VSVC9VUERBVEUgb3B0aW9uc2BdIGZvciB0YWJsZXMgaGF2aW5nIGEKLWRlZmF1bHRfdGltZV90b19saXZlIHNwZWNpZnlpbmcgYSBUVEwgb2YgMCB3aWxsIHJlbW92ZSB0aGUgVFRMIGZyb20gdGhlCi1pbnNlcnRlZCBvciB1cGRhdGVkIHZhbHVlcwotKiBsaW5rOiNhbHRlclRhYmxlU3RtdFtgQUxURVIgVEFCTEVgXSBgQUREYCBhbmQgYERST1BgIG5vdyBhbGxvdyBtdXRpcGxlCi1jb2x1bW5zIHRvIGJlIGFkZGVkL3JlbW92ZWQKLSogTmV3IGxpbms6I3NlbGVjdExpbWl0W2BQRVIgUEFSVElUSU9OIExJTUlUYF0gb3B0aW9uIChzZWUKLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTcwMTcpW0NBU1NBTkRSQS03MDE3XS4KLSogbGluazojdWRmc1tVc2VyLWRlZmluZWQgZnVuY3Rpb25zXSBjYW4gbm93IGluc3RhbnRpYXRlIGBVRFRWYWx1ZWAgYW5kCi1gVHVwbGVWYWx1ZWAgaW5zdGFuY2VzIHZpYSB0aGUgbmV3IGBVREZDb250ZXh0YCBpbnRlcmZhY2UgKHNlZQotaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTA4MTgpW0NBU1NBTkRSQS0xMDgxOF0uCi0qIGBgVXNlci1kZWZpbmVkIHR5cGVzJycjY3JlYXRlVHlwZVN0bXQgbWF5IG5vdyBiZSBzdG9yZWQgaW4gYQotbm9uLWZyb3plbiBmb3JtLCBhbGxvd2luZyBpbmRpdmlkdWFsIGZpZWxkcyB0byBiZSB1cGRhdGVkIGFuZCBkZWxldGVkIGluCi1saW5rOiN1cGRhdGVTdG10W2BVUERBVEVgIHN0YXRlbWVudHNdIGFuZCBsaW5rOiNkZWxldGVTdG10W2BERUxFVEVgCi1zdGF0ZW1lbnRzXSwgcmVzcGVjdGl2ZWx5LgotKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTc0MjMpW0NBU1NBTkRSQS03NDIzXQotCi09PT09IDMuNC4xCi0KLSogQWRkcyBgQ0FTVGAgZnVuY3Rpb25zLiBTZWUgbGluazojY2FzdEZ1bltgQ2FzdGBdLgotCi09PT09IDMuNC4wCi0KLSogU3VwcG9ydCBmb3IgbGluazojY3JlYXRlTVZTdG10W21hdGVyaWFsaXplZCB2aWV3c10KLSogbGluazojZGVsZXRlU3RtdFtgREVMRVRFYF0gc3VwcG9ydCBmb3IgaW5lcXVhbGl0eSBleHByZXNzaW9ucyBhbmQgYElOYAotcmVzdHJpY3Rpb25zIG9uIGFueSBwcmltYXJ5IGtleSBjb2x1bW5zCi0qIGxpbms6I3VwZGF0ZVN0bXRbYFVQREFURWBdIHN1cHBvcnQgZm9yIGBJTmAgcmVzdHJpY3Rpb25zIG9uIGFueQotcHJpbWFyeSBrZXkgY29sdW1ucwotCi09PT09IDMuMy4xCi0KLSogVGhlIHN5bnRheCBgVFJVTkNBVEUgVEFCTEUgWGAgaXMgbm93IGFjY2VwdGVkIGFzIGFuIGFsaWFzIGZvcgotYFRSVU5DQVRFIFhgCi0KLT09PT0gMy4zLjAKLQotKiBBZGRzIG5ldyBsaW5rOiNhZ2dyZWdhdGVzW2FnZ3JlZ2F0ZXNdCi0qIFVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYXJlIG5vdyBzdXBwb3J0ZWQgdGhyb3VnaAotbGluazojY3JlYXRlRnVuY3Rpb25TdG10W2BDUkVBVEUgRlVOQ1RJT05gXSBhbmQKLWxpbms6I2Ryb3BGdW5jdGlvblN0bXRbYERST1AgRlVOQ1RJT05gXS4KLSogVXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgYXJlIG5vdyBzdXBwb3J0ZWQgdGhyb3VnaAotbGluazojY3JlYXRlQWdncmVnYXRlU3RtdFtgQ1JFQVRFIEFHR1JFR0FURWBdIGFuZAotbGluazojZHJvcEFnZ3JlZ2F0ZVN0bXRbYERST1AgQUdHUkVHQVRFYF0uCi0qIEFsbG93cyBkb3VibGUtZG9sbGFyIGVuY2xvc2VkIHN0cmluZ3MgbGl0ZXJhbHMgYXMgYW4gYWx0ZXJuYXRpdmUgdG8KLXNpbmdsZS1xdW90ZSBlbmNsb3NlZCBzdHJpbmdzLgotKiBJbnRyb2R1Y2VzIFJvbGVzIHRvIHN1cGVyY2VkZSB1c2VyIGJhc2VkIGF1dGhlbnRpY2F0aW9uIGFuZCBhY2Nlc3MKLWNvbnRyb2wKLSogbGluazojdXNpbmdkYXRlc1tgRGF0ZWBdIGFuZCBsaW5rOnVzaW5ndGltZVtgVGltZWBdIGRhdGEgdHlwZXMgaGF2ZQotYmVlbiBhZGRlZAotKiBsaW5rOiNqc29uW2BKU09OYF0gc3VwcG9ydCBoYXMgYmVlbiBhZGRlZAotKiBgVGlueWludGAgYW5kIGBTbWFsbGludGAgZGF0YSB0eXBlcyBoYXZlIGJlZW4gYWRkZWQKLSogQWRkcyBuZXcgdGltZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhbmQgZGVwcmVjYXRlIGBkYXRlT2ZgIGFuZAotYHVuaXhUaW1lc3RhbXBPZmAuIFNlZSBsaW5rOiN0aW1lRnVuW2BUaW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zYF0KLQotPT09PSAzLjIuMAotCi0qIFVzZXItZGVmaW5lZCB0eXBlcyBhcmUgbm93IHN1cHBvcnRlZCB0aHJvdWdoCi1saW5rOiNjcmVhdGVUeXBlU3RtdFtgQ1JFQVRFIFRZUEVgXSwgbGluazojYWx0ZXJUeXBlU3RtdFtgQUxURVIgVFlQRWBdLAotYW5kIGxpbms6I2Ryb3BUeXBlU3RtdFtgRFJPUCBUWVBFYF0KLSogbGluazojY3JlYXRlSW5kZXhTdG10W2BDUkVBVEUgSU5ERVhgXSBub3cgc3VwcG9ydHMgaW5kZXhpbmcgY29sbGVjdGlvbgotY29sdW1ucywgaW5jbHVkaW5nIGluZGV4aW5nIHRoZSBrZXlzIG9mIG1hcCBjb2xsZWN0aW9ucyB0aHJvdWdoIHRoZQotYGtleXMoKWAgZnVuY3Rpb24KLSogSW5kZXhlcyBvbiBjb2xsZWN0aW9ucyBtYXkgYmUgcXVlcmllZCB1c2luZyB0aGUgbmV3IGBDT05UQUlOU2AgYW5kCi1gQ09OVEFJTlMgS0VZYCBvcGVyYXRvcnMKLSogVHVwbGUgdHlwZXMgd2VyZSBhZGRlZCB0byBob2xkIGZpeGVkLWxlbmd0aCBzZXRzIG9mIHR5cGVkIHBvc2l0aW9uYWwKLWZpZWxkcyAoc2VlIHRoZSBzZWN0aW9uIG9uIGxpbms6I3R5cGVzW3R5cGVzXSApCi0qIGxpbms6I2Ryb3BJbmRleFN0bXRbYERST1AgSU5ERVhgXSBub3cgc3VwcG9ydHMgb3B0aW9uYWxseSBzcGVjaWZ5aW5nIGEKLWtleXNwYWNlCi0KLT09PT0gMy4xLjcKLQotKiBgU0VMRUNUYCBzdGF0ZW1lbnRzIG5vdyBzdXBwb3J0IHNlbGVjdGluZyBtdWx0aXBsZSByb3dzIGluIGEgc2luZ2xlCi1wYXJ0aXRpb24gdXNpbmcgYW4gYElOYCBjbGF1c2Ugb24gY29tYmluYXRpb25zIG9mIGNsdXN0ZXJpbmcgY29sdW1ucy4KLVNlZSBsaW5rOiNzZWxlY3RXaGVyZVtTRUxFQ1QgV0hFUkVdIGNsYXVzZXMuCi0qIGBJRiBOT1QgRVhJU1RTYCBhbmQgYElGIEVYSVNUU2Agc3ludGF4IGlzIG5vdyBzdXBwb3J0ZWQgYnkKLWBDUkVBVEUgVVNFUmAgYW5kIGBEUk9QIFVTRVJgIHN0YXRtZW5ldHMsIHJlc3BlY3RpdmVseS4KLQotPT09PSAzLjEuNgotCi0qIEEgbmV3IGxpbms6I3V1aWRGdW5bYHV1aWRgIG1ldGhvZF0gaGFzIGJlZW4gYWRkZWQuCi0qIFN1cHBvcnQgZm9yIGBERUxFVEUgLi4uIElGIEVYSVNUU2Agc3ludGF4LgotCi09PT09IDMuMS41Ci0KLSogSXQgaXMgbm93IHBvc3NpYmxlIHRvIGdyb3VwIGNsdXN0ZXJpbmcgY29sdW1ucyBpbiBhIHJlbGF0aWlvbiwgc2VlCi1saW5rOiNzZWxlY3RXaGVyZVtTRUxFQ1QgV0hFUkVdIGNsYXVzZXMuCi0qIEFkZGVkIHN1cHBvcnQgZm9yIGBTVEFUSUNgIGNvbHVtbnMsIHNlZSBsaW5rOiNjcmVhdGVUYWJsZVN0YXRpY1tzdGF0aWMKLWluIENSRUFURSBUQUJMRV0uCi0KLT09PT0gMy4xLjQKLQotKiBgQ1JFQVRFIElOREVYYCBub3cgYWxsb3dzIHNwZWNpZnlpbmcgb3B0aW9ucyB3aGVuIGNyZWF0aW5nIENVU1RPTQotaW5kZXhlcyAoc2VlIGxpbms6I2NyZWF0ZUluZGV4U3RtdFtDUkVBVEUgSU5ERVggcmVmZXJlbmNlXSApLgotCi09PT09IDMuMS4zCi0KLSogTWlsbGlzZWNvbmQgcHJlY2lzaW9uIGZvcm1hdHMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSB0aW1lc3RhbXAgcGFyc2VyCi0oc2VlIGxpbms6I3VzaW5ndGltZXN0YW1wc1t3b3JraW5nIHdpdGggZGF0ZXNdICkuCi0KLT09PT0gMy4xLjIKLQotKiBgTmFOYCBhbmQgYEluZmluaXR5YCBoYXMgYmVlbiBhZGRlZCBhcyB2YWxpZCBmbG9hdCBjb250YW50cy4gVGhleSBhcmUKLW5vdyByZXNlcnZlZCBrZXl3b3Jkcy4gSW4gdGhlIHVubGlrZWx5IGNhc2UgeW91IHdlIHVzaW5nIHRoZW0gYXMgYQotY29sdW1uIGlkZW50aWZpZXIgKG9yIGtleXNwYWNlL3RhYmxlIG9uZSksIHlvdSB3aWxsIG5vZXcgbmVlZCB0byBkb3VibGUKLXF1b3RlIHRoZW0gKHNlZSBsaW5rOiNpZGVudGlmaWVyc1txdW90ZSBpZGVudGlmaWVyc10gKS4KLQotPT09PSAzLjEuMQotCi0qIGBTRUxFQ1RgIHN0YXRlbWVudCBub3cgYWxsb3dzIGxpc3RpbmcgdGhlIHBhcnRpdGlvbiBrZXlzICh1c2luZyB0aGUKLWBESVNUSU5DVGAgbW9kaWZpZXIpLiBTZWUKLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTQ1MzZbQ0FTU0FORFJBLTQ1MzZdLgotKiBUaGUgc3ludGF4IGBjIElOID9gIGlzIG5vdyBzdXBwb3J0ZWQgaW4gYFdIRVJFYCBjbGF1c2VzLiBJbiB0aGF0IGNhc2UsCi10aGUgdmFsdWUgZXhwZWN0ZWQgZm9yIHRoZSBiaW5kIHZhcmlhYmxlIHdpbGwgYmUgYSBsaXN0IG9mIHdoYXRldmVyIHR5cGUKLWBjYCBpcy4KLSogSXQgaXMgbm93IHBvc3NpYmxlIHRvIHVzZSBuYW1lZCBiaW5kIHZhcmlhYmxlcyAodXNpbmcgYDpuYW1lYCBpbnN0ZWFkCi1vZiBgP2ApLgotCi09PT09IDMuMS4wCi0KLSogbGluazojYWx0ZXJUYWJsZVN0bXRbQUxURVIgVEFCTEVdIGBEUk9QYCBvcHRpb24gaGFzIGJlZW4gcmVlbmFibGVkIGZvcgotQ1FMMyB0YWJsZXMgYW5kIGhhcyBuZXcgc2VtYW50aWNzIG5vdzogdGhlIHNwYWNlIGZvcm1lcmx5IHVzZWQgYnkKLWRyb3BwZWQgY29sdW1ucyB3aWxsIG5vdyBiZSBldmVudHVhbGx5IHJlY2xhaW1lZCAocG9zdC1jb21wYWN0aW9uKS4gWW91Ci1zaG91bGQgbm90IHJlYWRkIHByZXZpb3VzbHkgZHJvcHBlZCBjb2x1bW5zIHVubGVzcyB5b3UgdXNlIHRpbWVzdGFtcHMKLXdpdGggbWljcm9zZWNvbmQgcHJlY2lzaW9uIChzZWUKLWh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTM5MTlbQ0FTU0FORFJBLTM5MTldIGZvcgotbW9yZSBkZXRhaWxzKS4KLSogYFNFTEVDVGAgc3RhdGVtZW50IG5vdyBzdXBwb3J0cyBhbGlhc2VzIGluIHNlbGVjdCBjbGF1c2UuIEFsaWFzZXMgaW4KLVdIRVJFIGFuZCBPUkRFUiBCWSBjbGF1c2VzIGFyZSBub3Qgc3VwcG9ydGVkLiBTZWUgdGhlCi1saW5rOiNzZWxlY3RTdG10W3NlY3Rpb24gb24gc2VsZWN0XSBmb3IgZGV0YWlscy4KLSogYENSRUFURWAgc3RhdGVtZW50cyBmb3IgYEtFWVNQQUNFYCwgYFRBQkxFYCBhbmQgYElOREVYYCBub3cgc3VwcG9ydHMKLWFuIGBJRiBOT1QgRVhJU1RTYCBjb25kaXRpb24uIFNpbWlsYXJseSwgYERST1BgIHN0YXRlbWVudHMgc3VwcG9ydCBhCi1gSUYgRVhJU1RTYCBjb25kaXRpb24uCi0qIGBJTlNFUlRgIHN0YXRlbWVudHMgb3B0aW9uYWxseSBzdXBwb3J0cyBhIGBJRiBOT1QgRVhJU1RTYCBjb25kaXRpb24KLWFuZCBgVVBEQVRFYCBzdXBwb3J0cyBgSUZgIGNvbmRpdGlvbnMuCi0KLT09PT0gMy4wLjUKLQotKiBgU0VMRUNUYCwgYFVQREFURWAsIGFuZCBgREVMRVRFYCBzdGF0ZW1lbnRzIG5vdyBhbGxvdyBlbXB0eSBgSU5gCi1yZWxhdGlvbnMgKHNlZQotaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNTYyNilbQ0FTU0FORFJBLTU2MjZdLgotCi09PT09IDMuMC40Ci0KLSogVXBkYXRlZCB0aGUgc3ludGF4IGZvciBjdXN0b20gbGluazojY3JlYXRlSW5kZXhTdG10W3NlY29uZGFyeQotaW5kZXhlc10uCi0qIE5vbi1lcXVhbCBjb25kaXRpb24gb24gdGhlIHBhcnRpdGlvbiBrZXkgYXJlIG5vdyBuZXZlciBzdXBwb3J0ZWQsIGV2ZW4KLWZvciBvcmRlcmluZyBwYXJ0aXRpb25lciBhcyB0aGlzIHdhcyBub3QgY29ycmVjdCAodGhlIG9yZGVyIHdhcyAqbm90KgotdGhlIG9uZSBvZiB0aGUgdHlwZSBvZiB0aGUgcGFydGl0aW9uIGtleSkuIEluc3RlYWQsIHRoZSBgdG9rZW5gIG1ldGhvZAotc2hvdWxkIGFsd2F5cyBiZSB1c2VkIGZvciByYW5nZSBxdWVyaWVzIG9uIHRoZSBwYXJ0aXRpb24ga2V5IChzZWUKLWxpbms6I3NlbGVjdFdoZXJlW1dIRVJFIGNsYXVzZXNdICkuCi0KLT09PT0gMy4wLjMKLQotKiBTdXBwb3J0IGZvciBjdXN0b20gbGluazojY3JlYXRlSW5kZXhTdG10W3NlY29uZGFyeSBpbmRleGVzXSBoYXMgYmVlbgotYWRkZWQuCi0KLT09PT0gMy4wLjIKLQotKiBUeXBlIHZhbGlkYXRpb24gZm9yIHRoZSBsaW5rOiNjb25zdGFudHNbY29uc3RhbnRzXSBoYXMgYmVlbiBmaXhlZC4gRm9yCi1pbnN0YW5jZSwgdGhlIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gYWxsb3cgYCcyJ2AgYXMgYSB2YWxpZCB2YWx1ZSBmb3IgYW4KLWBpbnRgIGNvbHVtbiAoaW50ZXJwcmV0aW5nIGl0IGhhcyB0aGUgZXF1aXZhbGVudCBvZiBgMmApLCBvciBgNDJgIGFzIGEKLXZhbGlkIGBibG9iYCB2YWx1ZSAoaW4gd2hpY2ggY2FzZSBgNDJgIHdhcyBpbnRlcnByZXRlZCBhcyBhbiBoZXhhZGVjaW1hbAotcmVwcmVzZW50YXRpb24gb2YgdGhlIGJsb2IpLiBUaGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZSwgdHlwZSB2YWxpZGF0aW9uCi1vZiBjb25zdGFudHMgaXMgbm93IG1vcmUgc3RyaWN0LiBTZWUgdGhlIGxpbms6I3R5cGVzW2RhdGEgdHlwZXNdIHNlY3Rpb24KLWZvciBkZXRhaWxzIG9uIHdoaWNoIGNvbnN0YW50IGlzIGFsbG93ZWQgZm9yIHdoaWNoIHR5cGUuCi0qIFRoZSB0eXBlIHZhbGlkYXRpb24gZml4ZWQgb2YgdGhlIHByZXZpb3VzIHBvaW50IGhhcyBsZWFkIHRvIHRoZQotaW50cm9kdWN0aW9uIG9mIGxpbms6I2NvbnN0YW50c1tibG9icyBjb25zdGFudHNdIHRvIGFsbG93IGlucHV0aW5nCi1ibG9icy4gRG8gbm90ZSB0aGF0IHdoaWxlIGlucHV0aW5nIGJsb2JzIGFzIHN0cmluZ3MgY29uc3RhbnQgaXMgc3RpbGwKLXN1cHBvcnRlZCBieSB0aGlzIHZlcnNpb24gKHRvIGFsbG93IHNtb290aGVyIHRyYW5zaXRpb24gdG8gYmxvYgotY29uc3RhbnQpLCBpdCBpcyBub3cgZGVwcmVjYXRlZCAoaW4gcGFydGljdWxhciB0aGUgbGluazojdHlwZXNbZGF0YQotdHlwZXNdIHNlY3Rpb24gZG9lcyBub3QgbGlzdCBzdHJpbmdzIGNvbnN0YW50cyBhcyB2YWxpZCBibG9icykgYW5kIHdpbGwKLWJlIHJlbW92ZWQgYnkgYSBmdXR1cmUgdmVyc2lvbi4gSWYgeW91IHdlcmUgdXNpbmcgc3RyaW5ncyBhcyBibG9icywgeW91Ci1zaG91bGQgdGh1cyB1cGRhdGUgeW91ciBjbGllbnQgY29kZSBBU0FQIHRvIHN3aXRjaCBibG9iIGNvbnN0YW50cy4KLSogQSBudW1iZXIgb2YgZnVuY3Rpb25zIHRvIGNvbnZlcnQgbmF0aXZlIHR5cGVzIHRvIGJsb2JzIGhhdmUgYWxzbyBiZWVuCi1pbnRyb2R1Y2VkLiBGdXJ0aGVybW9yZSB0aGUgdG9rZW4gZnVuY3Rpb24gaXMgbm93IGFsc28gYWxsb3dlZCBpbiBzZWxlY3QKLWNsYXVzZXMuIFNlZSB0aGUgbGluazojZnVuY3Rpb25zW3NlY3Rpb24gb24gZnVuY3Rpb25zXSBmb3IgZGV0YWlscy4KLQotPT09PSAzLjAuMQotCi0qIGxpbms6I3VzaW5ndGltZXN0YW1wc1tEYXRlIHN0cmluZ3NdIChhbmQgdGltZXN0YW1wcykgYXJlIG5vIGxvbmdlcgotYWNjZXB0ZWQgYXMgdmFsaWQgYHRpbWV1dWlkYCB2YWx1ZXMuIERvaW5nIHNvIHdhcyBhIGJ1ZyBpbiB0aGUgc2Vuc2UKLXRoYXQgZGF0ZSBzdHJpbmcgYXJlIG5vdCB2YWxpZCBgdGltZXV1aWRgLCBhbmQgaXQgd2FzIHRodXMgcmVzdWx0aW5nIGluCi1odHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS00OTM2W2NvbmZ1c2luZwotYmVoYXZpb3JzXS4gSG93ZXZlciwgdGhlIGZvbGxvd2luZyBuZXcgbWV0aG9kcyBoYXZlIGJlZW4gYWRkZWQgdG8gaGVscAotd29ya2luZyB3aXRoIGB0aW1ldXVpZGA6IGBub3dgLCBgbWluVGltZXV1aWRgLCBgbWF4VGltZXV1aWRgICwgYGRhdGVPZmAKLWFuZCBgdW5peFRpbWVzdGFtcE9mYC4gU2VlIHRoZSBsaW5rOiN0aW1ldXVpZEZ1bltzZWN0aW9uIGRlZGljYXRlZCB0bwotdGhlc2UgbWV0aG9kc10gZm9yIG1vcmUgZGV0YWlsLgotKiBgYEZsb2F0IGNvbnN0YW50cycnI2NvbnN0YW50cyBub3cgc3VwcG9ydCB0aGUgZXhwb25lbnQgbm90YXRpb24uIEluCi1vdGhlciB3b3JkcywgYDQuMkUxMGAgaXMgbm93IGEgdmFsaWQgZmxvYXRpbmcgcG9pbnQgdmFsdWUuCi0KLT09PSBWZXJzaW9uaW5nCi0KLVZlcnNpb25pbmcgb2YgdGhlIENRTCBsYW5ndWFnZSBhZGhlcmVzIHRvIHRoZSBodHRwOi8vc2VtdmVyLm9yZ1tTZW1hbnRpYwotVmVyc2lvbmluZ10gZ3VpZGVsaW5lcy4gVmVyc2lvbnMgdGFrZSB0aGUgZm9ybSBYLlkuWiB3aGVyZSBYLCBZLCBhbmQgWgotYXJlIGludGVnZXIgdmFsdWVzIHJlcHJlc2VudGluZyBtYWpvciwgbWlub3IsIGFuZCBwYXRjaCBsZXZlbAotcmVzcGVjdGl2ZWx5LiBUaGVyZSBpcyBubyBjb3JyZWxhdGlvbiBiZXR3ZWVuIENhc3NhbmRyYSByZWxlYXNlIHZlcnNpb25zCi1hbmQgdGhlIENRTCBsYW5ndWFnZSB2ZXJzaW9uLgotCi1bY29scz0iLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18dmVyc2lvbiB8ZGVzY3JpcHRpb24KLXxNYWpvciB8VGhlIG1ham9yIHZlcnNpb24gX211c3RfIGJlIGJ1bXBlZCB3aGVuIGJhY2t3YXJkIGluY29tcGF0aWJsZQotY2hhbmdlcyBhcmUgaW50cm9kdWNlZC4gVGhpcyBzaG91bGQgcmFyZWx5IG9jY3VyLgotCi18TWlub3IgfE1pbm9yIHZlcnNpb24gaW5jcmVtZW50cyBvY2N1ciB3aGVuIG5ldywgYnV0IGJhY2t3YXJkCi1jb21wYXRpYmxlLCBmdW5jdGlvbmFsaXR5IGlzIGludHJvZHVjZWQuCi0KLXxQYXRjaCB8VGhlIHBhdGNoIHZlcnNpb24gaXMgaW5jcmVtZW50ZWQgd2hlbiBidWdzIGFyZSBmaXhlZC4KLXw9PT0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvZGRsLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2RkbC5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmNjZTQ1Li4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvZGRsLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MDcgKzAsMCBAQAotPSBEYXRhIERlZmluaXRpb24KLTp0YWJzOgotCi1DUUwgc3RvcmVzIGRhdGEgaW4gX3RhYmxlc18sIHdob3NlIHNjaGVtYSBkZWZpbmVzIHRoZSBsYXlvdXQgb2YgdGhlCi1kYXRhIGluIHRoZSB0YWJsZS4gVGFibGVzIGFyZSBsb2NhdGVkIGluIF9rZXlzcGFjZXNfLiAKLUEga2V5c3BhY2UgZGVmaW5lcyBvcHRpb25zIHRoYXQgYXBwbHkgdG8gYWxsIHRoZSBrZXlzcGFjZSdzIHRhYmxlcy4gCi1UaGUgeHJlZjpjcWwvZGRsLmFkb2MjcmVwbGljYXRpb24tc3RyYXRlZ3lbcmVwbGljYXRpb24gc3RyYXRlZ3ldIGlzIGFuIGltcG9ydGFudCBrZXlzcGFjZSBvcHRpb24sIGFzIGlzIHRoZSByZXBsaWNhdGlvbiBmYWN0b3IuIAotQSBnb29kIGdlbmVyYWwgcnVsZSBpcyBvbmUga2V5c3BhY2UgcGVyIGFwcGxpY2F0aW9uLgotSXQgaXMgY29tbW9uIGZvciBhIGNsdXN0ZXIgdG8gZGVmaW5lIG9ubHkgb25lIGtleXNwYWNlIGZvciBhbiBhY3RpZSBhcHBsaWNhdGlvbi4KLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgc3RhdGVtZW50cyB1c2VkIHRvIGNyZWF0ZSwgbW9kaWZ5LCBhbmQgcmVtb3ZlCi10aG9zZSBrZXlzcGFjZSBhbmQgdGFibGVzLgotCi09PSBDb21tb24gZGVmaW5pdGlvbnMKLQotVGhlIG5hbWVzIG9mIHRoZSBrZXlzcGFjZXMgYW5kIHRhYmxlcyBhcmUgZGVmaW5lZCBieSB0aGUgZm9sbG93aW5nCi1ncmFtbWFyOgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2tzX3RhYmxlLmJuZltdCi0tLS0tCi0KLUJvdGgga2V5c3BhY2UgYW5kIHRhYmxlIG5hbWUgc2hvdWxkIGJlIGNvbXByaXNlZCBvZiBvbmx5IGFscGhhbnVtZXJpYwotY2hhcmFjdGVycywgY2Fubm90IGJlIGVtcHR5IGFuZCBhcmUgbGltaXRlZCBpbiBzaXplIHRvIDQ4IGNoYXJhY3RlcnMKLSh0aGF0IGxpbWl0IGV4aXN0cyBtb3N0bHkgdG8gYXZvaWQgZmlsZW5hbWVzICh3aGljaCBtYXkgaW5jbHVkZSB0aGUKLWtleXNwYWNlIGFuZCB0YWJsZSBuYW1lKSB0byBnbyBvdmVyIHRoZSBsaW1pdHMgb2YgY2VydGFpbiBmaWxlIHN5c3RlbXMpLgotQnkgZGVmYXVsdCwga2V5c3BhY2UgYW5kIHRhYmxlIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlIChgbXlUYWJsZWAgaXMKLWVxdWl2YWxlbnQgdG8gYG15dGFibGVgKSBidXQgY2FzZSBzZW5zaXRpdml0eSBjYW4gYmUgZm9yY2VkIGJ5IHVzaW5nCi1kb3VibGUtcXVvdGVzIChgIm15VGFibGUiYCBpcyBkaWZmZXJlbnQgZnJvbSBgbXl0YWJsZWApLgotCi1GdXJ0aGVyLCBhIHRhYmxlIGlzIGFsd2F5cyBwYXJ0IG9mIGEga2V5c3BhY2UgYW5kIGEgdGFibGUgbmFtZSBjYW4gYmUKLXByb3ZpZGVkIGZ1bGx5LXF1YWxpZmllZCBieSB0aGUga2V5c3BhY2UgaXQgaXMgcGFydCBvZi4gSWYgaXMgaXMgbm90Ci1mdWxseS1xdWFsaWZpZWQsIHRoZSB0YWJsZSBpcyBhc3N1bWVkIHRvIGJlIGluIHRoZSBfY3VycmVudF8ga2V5c3BhY2UKLShzZWUgeHJlZjpjcWwvZGRsLmFkb2MjdXNlLXN0YXRlbWVudFtVU0VdIHN0YXRlbWVudC4KLQotRnVydGhlciwgdGhlIHZhbGlkIG5hbWVzIGZvciBjb2x1bW5zIGFyZSBkZWZpbmVkIGFzOgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2NvbHVtbi5ibmZbXQotLS0tLQotCi1XZSBhbHNvIGRlZmluZSB0aGUgbm90aW9uIG9mIHN0YXRlbWVudCBvcHRpb25zIGZvciB1c2UgaW4gdGhlIGZvbGxvd2luZwotc2VjdGlvbjoKLQotW3NvdXJjZSxibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9vcHRpb25zLmJuZltdCi0tLS0tCi0KLVtbY3JlYXRlLWtleXNwYWNlLXN0YXRlbWVudF1dCi09PSBDUkVBVEUgS0VZU1BBQ0UKLQotQSBrZXlzcGFjZSBpcyBjcmVhdGVkIHdpdGggYSBgQ1JFQVRFIEtFWVNQQUNFYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvY3JlYXRlX2tzLmJuZltdCi0tLS0tCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV9rcy5jcWxbXQotLS0tLQotCi1BdHRlbXB0aW5nIHRvIGNyZWF0ZSBhIGtleXNwYWNlIHRoYXQgYWxyZWFkeSBleGlzdHMgd2lsbCByZXR1cm4gYW4gZXJyb3IKLXVubGVzcyB0aGUgYElGIE5PVCBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiBpdCBpcyB1c2VkLCB0aGUgc3RhdGVtZW50Ci13aWxsIGJlIGEgbm8tb3AgaWYgdGhlIGtleXNwYWNlIGFscmVhZHkgZXhpc3RzLgotCi1UaGUgc3VwcG9ydGVkIGBvcHRpb25zYCBhcmU6Ci0KLVtjb2xzPSIsLCwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxuYW1lIHwga2luZCB8IG1hbmRhdG9yeSB8IGRlZmF1bHQgfCBkZXNjcmlwdGlvbgotfGByZXBsaWNhdGlvbmAgfCBfbWFwXyB8IHllcyB8IG4vYSB8IFRoZSByZXBsaWNhdGlvbiBzdHJhdGVneSBhbmQgb3B0aW9ucyB0byB1c2UgZm9yIHRoZSBrZXlzcGFjZSAoc2VlCi1kZXRhaWxzIGJlbG93KS4KLXxgZHVyYWJsZV93cml0ZXNgIHwgX3NpbXBsZV8gfCBubyB8IHRydWUgfCBXaGV0aGVyIHRvIHVzZSB0aGUgY29tbWl0IGxvZyBmb3IgdXBkYXRlcyBvbiB0aGlzIGtleXNwYWNlIChkaXNhYmxlIHRoaXMKLW9wdGlvbiBhdCB5b3VyIG93biByaXNrISkuCi18PT09Ci0KLVRoZSBgcmVwbGljYXRpb25gIHByb3BlcnR5IGlzIG1hbmRhdG9yeSBhbmQgbXVzdCBjb250YWluIHRoZSBgJ2NsYXNzJ2Agc3ViLW9wdGlvbiB0aGF0IGRlZmluZXMgdGhlIGRlc2lyZWQKLXhyZWY6Y3FsL2RkbC5hZG9jI3JlcGxpY2F0aW9uLXN0cmF0ZWd5W3JlcGxpY2F0aW9uIHN0cmF0ZWd5XSBjbGFzcy4gCi1UaGUgcmVzdCBvZiB0aGUgc3ViLW9wdGlvbnMgZGVwZW5kIG9uIHdoaWNoIHJlcGxpY2F0aW9uIHN0cmF0ZWd5IGlzIHVzZWQuIAotQnkgZGVmYXVsdCwgQ2Fzc2FuZHJhIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYCdjbGFzcydgIHZhbHVlczoKLQotW1tyZXBsaWNhdGlvbi1zdHJhdGVneV1dCi09PT0gYFNpbXBsZVN0cmF0ZWd5YAotCi1BIHNpbXBsZSBzdHJhdGVneSB0aGF0IGRlZmluZXMgYSByZXBsaWNhdGlvbiBmYWN0b3IgZm9yIGRhdGEgdG8gYmUKLXNwcmVhZCBhY3Jvc3MgdGhlIGVudGlyZSBjbHVzdGVyLiBUaGlzIGlzIGdlbmVyYWxseSBub3QgYSB3aXNlIGNob2ljZQotZm9yIHByb2R1Y3Rpb24sIGFzIGl0IGRvZXMgbm90IHJlc3BlY3QgZGF0YWNlbnRlciBsYXlvdXRzIGFuZCBjYW4KLWxlYWQgdG8gd2lsZGx5IHZhcnlpbmcgcXVlcnkgbGF0ZW5jeS4gRm9yIHByb2R1Y3Rpb24sIHVzZQotYE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5YC4gYFNpbXBsZVN0cmF0ZWd5YCBzdXBwb3J0cyBhIHNpbmdsZQotbWFuZGF0b3J5IGFyZ3VtZW50OgotCi1bY29scz0iLCwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxzdWItb3B0aW9uIHx0eXBlIHxzaW5jZSB8ZGVzY3JpcHRpb24KLXxgJ3JlcGxpY2F0aW9uX2ZhY3RvcidgIHwgaW50IHwgYWxsIHwgVGhlIG51bWJlciBvZiByZXBsaWNhcyB0byBzdG9yZSBwZXIgcmFuZ2UKLXw9PT0KLQotPT09IGBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneWAKLQotQSBwcm9kdWN0aW9uLXJlYWR5IHJlcGxpY2F0aW9uIHN0cmF0ZWd5IHRoYXQgc2V0cyB0aGUKLXJlcGxpY2F0aW9uIGZhY3RvciBpbmRlcGVuZGVudGx5IGZvciBlYWNoIGRhdGEtY2VudGVyLiBUaGUgcmVzdCBvZiB0aGUKLXN1Yi1vcHRpb25zIGFyZSBrZXktdmFsdWUgcGFpcnMsIHdpdGggYSBrZXkgc2V0IHRvIGEgZGF0YS1jZW50ZXIgbmFtZSBhbmQKLWl0cyB2YWx1ZSBzZXQgdG8gdGhlIGFzc29jaWF0ZWQgcmVwbGljYXRpb24gZmFjdG9yLiBPcHRpb25zOgotCi1bY29scz0iLCwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxzdWItb3B0aW9uIHx0eXBlIHxkZXNjcmlwdGlvbgotfGAnPGRhdGFjZW50ZXI+J2AgfCBpbnQgfCBUaGUgbnVtYmVyIG9mIHJlcGxpY2FzIHRvIHN0b3JlIHBlciByYW5nZSBpbiB0aGUgcHJvdmlkZWQgZGF0YWNlbnRlci4KLXxgJ3JlcGxpY2F0aW9uX2ZhY3RvcidgIHwgaW50IHwgVGhlIG51bWJlciBvZiByZXBsaWNhcyB0byB1c2UgYXMgYSBkZWZhdWx0IHBlciBkYXRhY2VudGVyIGlmIG5vdAotc3BlY2lmaWNhbGx5IHByb3ZpZGVkLiBOb3RlIHRoYXQgdGhpcyBhbHdheXMgZGVmZXJzIHRvIGV4aXN0aW5nCi1kZWZpbml0aW9ucyBvciBleHBsaWNpdCBkYXRhY2VudGVyIHNldHRpbmdzLiBGb3IgZXhhbXBsZSwgdG8gaGF2ZSB0aHJlZQotcmVwbGljYXMgcGVyIGRhdGFjZW50ZXIsIHNldCBhIHZhbHVlIG9mIDMuCi18PT09Ci0KLVdoZW4gbGF0ZXIgYWx0ZXJpbmcga2V5c3BhY2VzIGFuZCBjaGFuZ2luZyB0aGUgYHJlcGxpY2F0aW9uX2ZhY3RvcmAsCi1hdXRvLWV4cGFuc2lvbiB3aWxsIG9ubHkgX2FkZF8gbmV3IGRhdGFjZW50ZXJzIGZvciBzYWZldHksIGl0IHdpbGwgbm90Ci1hbHRlciBleGlzdGluZyBkYXRhY2VudGVycyBvciByZW1vdmUgYW55LCBldmVuIGlmIHRoZXkgYXJlIG5vIGxvbmdlciBpbgotdGhlIGNsdXN0ZXIuIElmIHlvdSB3YW50IHRvIHJlbW92ZSBkYXRhY2VudGVycyB3aGlsZSBzZXR0aW5nIHRoZSAKLWByZXBsaWNhdGlvbl9mYWN0b3JgLCBleHBsaWNpdGx5IHplcm8gb3V0IHRoZSBkYXRhY2VudGVyIHlvdSB3YW50IHRvCi1oYXZlIHplcm8gcmVwbGljYXMuCi0KLUFuIGV4YW1wbGUgb2YgYXV0by1leHBhbmRpbmcgZGF0YWNlbnRlcnMgd2l0aCB0d28gZGF0YWNlbnRlcnM6IGBEQzFgIGFuZAotYERDMmA6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvYXV0b2V4cGFuZF9rcy5jcWxbXQotLS0tLQotd2lsbCByZXN1bHQgaW46Ci1bc291cmNlLHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9hdXRvZXhwYW5kX2tzLnJlc3VsdFtdCi0tLS0tCi0KLUFuIGV4YW1wbGUgb2YgYXV0by1leHBhbmRpbmcgYW5kIG92ZXJyaWRpbmcgYSBkYXRhY2VudGVyOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2F1dG9leHBhbmRfa3Nfb3ZlcnJpZGUuY3FsW10KLS0tLS0KLXdpbGwgcmVzdWx0IGluOgotW3NvdXJjZSxwbGFpbnRleHRdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvYXV0b2V4cGFuZF9rc19vdmVycmlkZS5yZXN1bHRbXQotLS0tLQotCi1BbiBleGFtcGxlIHRoYXQgZXhjbHVkZXMgYSBkYXRhY2VudGVyIHdoaWxlIHVzaW5nIGByZXBsaWNhdGlvbl9mYWN0b3JgOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2F1dG9leHBhbmRfZXhjbHVkZV9kYy5jcWxbXQotLS0tLQotd2lsbCByZXN1bHQgaW46Ci1bc291cmNlLHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9hdXRvZXhwYW5kX2V4Y2x1ZGVfZGMucmVzdWx0W10KLS0tLS0KLQotSWYgeHJlZjpuZXcvdHJhbnNpZW50cmVwbGljYXRpb24uYWRvY1t0cmFuc2llbnQgcmVwbGljYXRpb25dIGhhcyBiZWVuIGVuYWJsZWQsIHRyYW5zaWVudCByZXBsaWNhcyBjYW4gYmUKLWNvbmZpZ3VyZWQgZm9yIGJvdGggYFNpbXBsZVN0cmF0ZWd5YCBhbmQgYE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5YCBieQotZGVmaW5pbmcgcmVwbGljYXRpb24gZmFjdG9ycyBpbiB0aGUgZm9ybWF0Ci1gJzx0b3RhbF9yZXBsaWNhcz4vPHRyYW5zaWVudF9yZXBsaWNhcz4nYAotCi1Gb3IgaW5zdGFuY2UsIHRoaXMga2V5c3BhY2Ugd2lsbCBoYXZlIDMgcmVwbGljYXMgaW4gREMxLCAxIG9mIHdoaWNoIGlzCi10cmFuc2llbnQsIGFuZCA1IHJlcGxpY2FzIGluIERDMiwgMiBvZiB3aGljaCBhcmUgdHJhbnNpZW50OgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV9rc190cmFuc19yZXBsLmNxbFtdCi0tLS0tCi0KLVtbdXNlLXN0YXRlbWVudF1dCi09PSBVU0UKLQotVGhlIGBVU0VgIHN0YXRlbWVudCBjaGFuZ2VzIHRoZSBfY3VycmVudF8ga2V5c3BhY2UgdG8gdGhlIHNwZWNpZmllZCBrZXlzcGFjZS4gCi1BIG51bWJlciBvZiBvYmplY3RzIGluIENRTCBhcmUgYm91bmQgdG8gYSBrZXlzcGFjZSAodGFibGVzLCB1c2VyLWRlZmluZWQgdHlwZXMsIGZ1bmN0aW9ucywgZXRjLikgYW5kIHRoZQotY3VycmVudCBrZXlzcGFjZSBpcyB0aGUgZGVmYXVsdCBrZXlzcGFjZSB1c2VkIHdoZW4gdGhvc2Ugb2JqZWN0cyBhcmUKLXJlZmVycmVkIHRvIGluIGEgcXVlcnkgd2l0aG91dCBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lICh3aXRob3V0IGEgcHJlZml4ZWQga2V5c3BhY2UgbmFtZSkuIAotQSBgVVNFYCBzdGF0ZW1lbnQgc3BlY2lmaWVzIHRoZSBrZXlzcGFjZSB0byB1c2UgYXMgYW4gYXJndW1lbnQ6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvdXNlX2tzLmJuZltdCi0tLS0tCi1Vc2luZyBDUUw6Ci1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3VzZV9rcy5jcWxbXQotLS0tLQotCi1bW2FsdGVyLWtleXNwYWNlLXN0YXRlbWVudF1dCi09PSBBTFRFUiBLRVlTUEFDRQotCi1BbiBgQUxURVIgS0VZU1BBQ0VgIHN0YXRlbWVudCBtb2RpZmllcyB0aGUgb3B0aW9ucyBvZiBhIGtleXNwYWNlOgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2FsdGVyX2tzLmJuZltdCi0tLS0tCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2FsdGVyX2tzLmNxbFtdCi0tLS0tCi1JZiB0aGUga2V5c3BhY2UgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotVGhlIHN1cHBvcnRlZCBvcHRpb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IgeHJlZjpjcWwvZGRsLmFkb2MjY3JlYXRlLWtleXNwYWNlLXN0YXRlbWVudFtjcmVhdGluZyBhIGtleXNwYWNlXS4KLQotW1tkcm9wLWtleXNwYWNlLXN0YXRlbWVudF1dCi09PSBEUk9QIEtFWVNQQUNFCi0KLURyb3BwaW5nIGEga2V5c3BhY2UgaXMgZG9uZSB3aXRoIHRoZSBgRFJPUCBLRVlTUEFDRWAgc3RhdGVtZW50OgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2Ryb3Bfa3MuYm5mW10KLS0tLS0KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvZHJvcF9rcy5jcWxbXQotLS0tLQotCi1Ecm9wcGluZyBhIGtleXNwYWNlIHJlc3VsdHMgaW4gdGhlIGltbWVkaWF0ZSwgaXJyZXZlcnNpYmxlIHJlbW92YWwgb2YKLXRoYXQga2V5c3BhY2UsIGluY2x1ZGluZyBhbGwgdGhlIHRhYmxlcywgdXNlci1kZWZpbmVkIHR5cGVzLCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLCBhbmQKLWFsbCB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhvc2UgdGFibGVzLgotCi1JZiB0aGUga2V5c3BhY2UgZG9lcyBub3QgZXhpc3RzLCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLAotdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0KLVtbY3JlYXRlLXRhYmxlLXN0YXRlbWVudF1dCi09PSBDUkVBVEUgVEFCTEUKLQotQ3JlYXRpbmcgYSBuZXcgdGFibGUgdXNlcyB0aGUgYENSRUFURSBUQUJMRWAgc3RhdGVtZW50OgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2NyZWF0ZV90YWJsZS5ibmZbXQotLS0tLQotCi1Gb3IgZXhhbXBsZSwgaGVyZSBhcmUgc29tZSBDUUwgc3RhdGVtZW50cyB0byBjcmVhdGUgdGFibGVzOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV90YWJsZS5jcWxbXQotLS0tLQotCi1BIENRTCB0YWJsZSBoYXMgYSBuYW1lIGFuZCBpcyBjb21wb3NlZCBvZiBhIHNldCBvZiBfcm93c18uIAotQ3JlYXRpbmcgYSB0YWJsZSBhbW91bnRzIHRvIGRlZmluaW5nIHdoaWNoIHhyZWY6Y3FsL2RkbC5hZG9jI2NvbHVtbi1kZWZpbml0aW9uW2NvbHVtbnNdIGVhY2ggcm93cyB3aWxsIGhhdmUsIAotd2hpY2ggb2YgdGhvc2UgY29sdW1ucyBjb21wcmlzZSB0aGUgeHJlZjpjcWwvZGRsLmFkb2MjcHJpbWFyeS1rZXlbcHJpbWFyeSBrZXldLCBhcyB3ZWxsIGFzIGRlZmluZWQKLXhyZWY6Y3FsL2RkbC5hZG9jI2NyZWF0ZS10YWJsZS1vcHRpb25zW29wdGlvbnNdIGZvciB0aGUgdGFibGUuCi0KLUF0dGVtcHRpbmcgdG8gY3JlYXRlIGFuIGFscmVhZHkgZXhpc3RpbmcgdGFibGUgd2lsbCByZXR1cm4gYW4gZXJyb3IKLXVubGVzcyB0aGUgYElGIE5PVCBFWElTVFNgIGRpcmVjdGl2ZSBpcyB1c2VkLiBJZiBpdCBpcyB1c2VkLCB0aGUKLXN0YXRlbWVudCB3aWxsIGJlIGEgbm8tb3AgaWYgdGhlIHRhYmxlIGFscmVhZHkgZXhpc3RzLgotCi1bW2NvbHVtbi1kZWZpbml0aW9uXV0KLT09PSBDb2x1bW4gZGVmaW5pdGlvbnMKLQotRXZlcnkgcm93IGluIGEgQ1FMIHRhYmxlIHdpbGwgaGF2ZSB0aGUgcHJlZGVmaW5lZCBjb2x1bW5zIGRlZmluZWQgYXQgdGFibGUgY3JlYXRpb24uIAotQ29sdW1ucyBjYW4gYmUgYWRkZWQgbGF0ZXIgdXNpbmcgYW4geHJlZjpjcWwvZGRsLmFkb2MjYWx0ZXItdGFibGUtc3RhdGVtZW50W2FsdGVyIHN0YXRlbWVudF0uCi0KLUEgYGNvbHVtbl9kZWZpbml0aW9uYCBpcyBjb21wcmlzZWQgb2YgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBhbmQgaXRzIHhyZWY6Y3FsL2RkbC5hZG9jI2RhdGEtdHlwZVt0eXBlXSwgCi1yZXN0cmljdGluZyB0aGUgIHZhbHVlcyB0aGF0IGFyZSBhY2NlcHRlZCBmb3IgdGhhdCBjb2x1bW4uIEFkZGl0aW9uYWxseSwgYSBjb2x1bW4gZGVmaW5pdGlvbiBjYW4gaGF2ZSB0aGUKLWZvbGxvd2luZyBtb2RpZmllcnM6Ci0KLSogYFNUQVRJQ2A6IGRlY2xhcmVzIHRoZSBjb2x1bW4gYXMgYSB4cmVmOmNxbC9kZGwuYWRvYyNzdGF0aWMtY29sdW1uW3N0YXRpYyBjb2x1bW5dCi0qIGBQUklNQVJZIEtFWWA6IGRlY2xhcmVzIHRoZSBjb2x1bW4gYXMgdGhlIHNvbGUgY29tcG9uZW50IG9mIHRoZSB4cmVmOmNxbC9kZGwuYWRvYyNwcmltYXJ5LWtleVtwcmltYXJ5IGtleV0gb2YgdGhlIHRhYmxlCi0KLVtbc3RhdGljLWNvbHVtbl1dCi09PT09IFN0YXRpYyBjb2x1bW5zCi0KLVNvbWUgY29sdW1ucyBjYW4gYmUgZGVjbGFyZWQgYXMgYFNUQVRJQ2AgaW4gYSB0YWJsZSBkZWZpbml0aW9uLiBBIGNvbHVtbgotdGhhdCBpcyBzdGF0aWMgd2lsbCBiZSDigJxzaGFyZWTigJ0gYnkgYWxsIHRoZSByb3dzIGJlbG9uZ2luZyB0byB0aGUgc2FtZQotcGFydGl0aW9uIChoYXZpbmcgdGhlIHNhbWUgeHJlZjpjcWwvZGRsLmFkb2MjcGFydGl0aW9uLWtleVtwYXJ0aXRpb24ga2V5XS4gCi0KLUZvciBleGFtcGxlOgotCi1be3RhYnN9XSAKLT09PT0gCi1Db2RlOjogCi0rIAotLS0gCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV9zdGF0aWNfY29sdW1uLmNxbFtdCi1pbmNsdWRlOjpleGFtcGxlJENRTC9pbnNlcnRfc3RhdGljX2RhdGEuY3FsW10KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3NlbGVjdF9zdGF0aWNfZGF0YS5jcWxbXQotLS0tLQotLS0KLQotUmVzdWx0czo6Ci0rCi0tLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvc2VsZWN0X3N0YXRpY19kYXRhLnJlc3VsdFtdCi0tLS0tCi0tLQotPT09PQotCi1BcyBjYW4gYmUgc2VlbiwgdGhlIGBzYCB2YWx1ZSBpcyB0aGUgc2FtZSAoYHN0YXRpYzFgKSBmb3IgYm90aCBvZiB0aGUKLXJvd3MgaW4gdGhlIHBhcnRpdGlvbiAodGhlIHBhcnRpdGlvbiBrZXkgYmVpbmcgYHBrYCwgYW5kIGJvdGgKLXJvd3MgYXJlIGluIHRoZSBzYW1lIHBhcnRpdGlvbik6IHRoZSBzZWNvbmQgaW5zZXJ0aW9uIG92ZXJyaWRlcyB0aGUKLXZhbHVlIGZvciBgc2AuCi0KLVRoZSB1c2Ugb2Ygc3RhdGljIGNvbHVtbnMgaGFzIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0qIEEgdGFibGUgd2l0aG91dCBjbHVzdGVyaW5nIGNvbHVtbnMgY2Fubm90IGhhdmUgc3RhdGljIGNvbHVtbnMuIAotSW4gYSB0YWJsZSB3aXRob3V0IGNsdXN0ZXJpbmcgY29sdW1ucywgZXZlcnkgcGFydGl0aW9uIGhhcyBvbmx5IG9uZSByb3csIGFuZAotc28gZXZlcnkgY29sdW1uIGlzIGluaGVyZW50bHkgc3RhdGljKQotKiBPbmx5IG5vbi1wcmltYXJ5IGtleSBjb2x1bW5zIGNhbiBiZSBzdGF0aWMuCi0KLVtbcHJpbWFyeS1rZXldXQotPT09IFRoZSBQcmltYXJ5IGtleQotCi1XaXRoaW4gYSB0YWJsZSwgYSByb3cgaXMgdW5pcXVlbHkgaWRlbnRpZmllZCBieSBpdHMgYFBSSU1BUlkgS0VZYCwgYW5kCi1oZW5jZSBhbGwgdGFibGVzICptdXN0KiBkZWZpbmUgYSBzaW5nbGUgUFJJTUFSWSBLRVkuIAotQSBgUFJJTUFSWSBLRVlgIGlzIGNvbXBvc2VkIG9mIG9uZSBvciBtb3JlIG9mIHRoZSBkZWZpbmVkIGNvbHVtbnMgaW4gdGhlIHRhYmxlLiAKLVN5bnRhY3RpY2FsbHksIHRoZSBwcmltYXJ5IGtleSBpcyBkZWZpbmVkIHdpdGggdGhlIHBocmFzZSBgUFJJTUFSWSBLRVlgIAotZm9sbG93ZWQgYnkgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgY29sdW1uIG5hbWVzIHdpdGhpbiBwYXJlbnRoZXNpcy4KLUlmIHRoZSBwcmltYXJ5IGtleSBoYXMgb25seSBvbmUgY29sdW1uLCB5b3UgY2FuIGFsdGVybmF0aXZlbHkgYWRkIHRoZSBgUFJJTUFSWSBLRVlgIHBocmFzZSB0bwotdGhhdCBjb2x1bW4gaW4gdGhlIHRhYmxlIGRlZmluaXRpb24uIAotVGhlIG9yZGVyIG9mIHRoZSBjb2x1bW5zIGluIHRoZSBwcmltYXJ5IGtleSBkZWZpbml0aW9uIGRlZmluZXMgdGhlIHBhcnRpdGlvbiBrZXkgYW5kIAotY2x1c3RlcmluZyBjb2x1bW5zLgotCi1BIENRTCBwcmltYXJ5IGtleSBpcyBjb21wb3NlZCBvZiB0d28gcGFydHM6Ci0KLXhyZWY6Y3FsL2RkbC5hZG9jI3BhcnRpdGlvbi1rZXlbcGFydGl0aW9uIGtleV06OgotKiBJdCBpcyB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSBwcmltYXJ5IGtleSBkZWZpbml0aW9uLiAKLUl0IGNhbiBiZSBhIHNpbmdsZSBjb2x1bW4gb3IsIHVzaW5nIGFuIGFkZGl0aW9uYWwgc2V0IG9mIHBhcmVudGhlc2lzLCBjYW4gYmUgbXVsdGlwbGUgY29sdW1ucy4gCi1BIHRhYmxlIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcGFydGl0aW9uIGtleSwgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIHRhYmxlIGRlZmluaXRpb24gaXM6Ci0rCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV90YWJsZV9zaW5nbGVfcGsuY3FsW10KLS0tLS0KLXhyZWY6Y3FsL2RkbC5hZG9jI2NsdXN0ZXJpbmctY29sdW1uc1tjbHVzdGVyaW5nIGNvbHVtbnNdOjoKLSogVGhlIGNvbHVtbnMgYXJlIHRoZSBjb2x1bW5zIHRoYXQgZm9sbG93IHRoZSBwYXJ0aXRpb24ga2V5IGluIHRoZSBwcmltYXJ5IGtleSBkZWZpbml0aW9uLgotVGhlIG9yZGVyIG9mIHRob3NlIGNvbHVtbnMgZGVmaW5lIHRoZSBfY2x1c3RlcmluZyBvcmRlcl8uCi0KLVNvbWUgZXhhbXBsZXMgb2YgcHJpbWFyeSBrZXkgZGVmaW5pdGlvbiBhcmU6Ci0KLSogYFBSSU1BUlkgS0VZIChhKWA6IGBhYCBpcyB0aGUgc2luZ2xlIHBhcnRpdGlvbiBrZXkgYW5kIHRoZXJlIGFyZSBubyBjbHVzdGVyaW5nIGNvbHVtbnMKLSogYFBSSU1BUlkgS0VZIChhLCBiLCBjKWAgOiBgYWAgaXMgdGhlIHNpbmdsZSBwYXJ0aXRpb24ga2V5IGFuZCBgYmAgYW5kIGBjYCBhcmUgdGhlIGNsdXN0ZXJpbmcgY29sdW1ucwotKiBgUFJJTUFSWSBLRVkgKChhLCBiKSwgYylgIDogYGFgIGFuZCBgYmAgY29tcG9zZSB0aGUgX2NvbXBvc2l0ZV8gcGFydGl0aW9uIGtleSBhbmQgYGNgIGlzIHRoZSBjbHVzdGVyaW5nIGNvbHVtbgotCi1bSU1QT1JUQU5UXQotPT09PQotVGhlIHByaW1hcnkga2V5IHVuaXF1ZWx5IGlkZW50aWZpZXMgYSByb3cgaW4gdGhlIHRhYmxlLCBhcyBkZXNjcmliZWQgYWJvdmUuIAotQSBjb25zZXF1ZW5jZSBvZiB0aGlzIHVuaXF1ZW5lc3MgaXMgdGhhdCBpZiBhbm90aGVyIHJvdyBpcyBpbnNlcnRlZCB1c2luZyB0aGUgc2FtZSBwcmltYXJ5IGtleSwgCi10aGVuIGFuIGBVUFNFUlRgIG9jY3VycyBhbmQgYW4gZXhpc3Rpbmcgcm93IHdpdGggdGhlIHNhbWUgcHJpbWFyeSBrZXkgaXMgcmVwbGFjZWQuIAotQ29sdW1ucyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgcHJpbWFyeSBrZXkgY2Fubm90IGRlZmluZSB1bmlxdWVuZXNzLgotPT09PQotCi1bW3BhcnRpdGlvbi1rZXldXQotPT09PSBQYXJ0aXRpb24ga2V5Ci0KLVdpdGhpbiBhIHRhYmxlLCBDUUwgZGVmaW5lcyB0aGUgbm90aW9uIG9mIGEgX3BhcnRpdGlvbl8gdGhhdCBkZWZpbmVzIHRoZSBsb2NhdGlvbiBvZiBkYXRhIHdpdGhpbiBhIENhc3NhbmRyYSBjbHVzdGVyLgotQSBwYXJ0aXRpb24gaXMgdGhlIHNldCBvZiByb3dzIHRoYXQgc2hhcmUgdGhlIHNhbWUgdmFsdWUgZm9yIHRoZWlyIHBhcnRpdGlvbiBrZXkuIAotCi1Ob3RlIHRoYXQgaWYgdGhlIHBhcnRpdGlvbiBrZXkgaXMgY29tcG9zZWQgb2YgbXVsdGlwbGUgY29sdW1ucywgdGhlbiByb3dzIGJlbG9uZyB0byB0aGUgc2FtZSBwYXJ0aXRpb24gCi13aGVuIHRoZXkgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMgZm9yIGFsbCB0aG9zZSBwYXJ0aXRpb24ga2V5IGNvbHVtbnMuIAotQSBoYXNoIGlzIGNvbXB1dGVkIGZyb20gdGhlIHBhcnRpdGlvbiBrZXkgY29sdW1ucyBhbmQgdGhhdCBoYXNoIHZhbHVlIGRlZmluZXMgdGhlIHBhcnRpdGlvbiBsb2NhdGlvbi4KLVNvLCBmb3IgaW5zdGFuY2UsIGdpdmVuIHRoZSBmb2xsb3dpbmcgdGFibGUgZGVmaW5pdGlvbiBhbmQgY29udGVudDoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfdGFibGVfY29tcG91bmRfcGsuY3FsW10KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2luc2VydF90YWJsZV9jb21wb3VuZF9way5jcWxbXQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvc2VsZWN0X3RhYmxlX2NvbXBvdW5kX3BrLmNxbFtdCi0tLS0tCi0KLXdpbGwgcmVzdWx0IGluCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zZWxlY3RfdGFibGVfY29tcG91bmRfcGsucmVzdWx0W10KLS0tLS0KLTwxPiBSb3dzIDEgYW5kIDIgYXJlIGluIHRoZSBzYW1lIHBhcnRpdGlvbiwgYmVjYXVzZSBib3RoIGNvbHVtbnMgYGFgIGFuZCBgYmAgYXJlIHplcm8uCi08Mj4gUm93cyAzIGFuZCA0IGFyZSBpbiB0aGUgc2FtZSBwYXJ0aXRpb24sIGJ1dCBhIGRpZmZlcmVudCBvbmUsIGJlY2F1c2UgY29sdW1uIGBhYCBpcyB6ZXJvIGFuZCBjb2x1bW4gYGJgIGlzIDEgaW4gYm90aCByb3dzLgotPDM+IFJvdyA1IGlzIGluIGEgdGhpcmQgcGFydGl0aW9uIGJ5IGl0c2VsZiwgYmVjYXVzZSBib3RoIGNvbHVtbnMgYGFgIGFuZCBgYmAgYXJlIDEuCi0KLU5vdGUgdGhhdCBhIHRhYmxlIGFsd2F5cyBoYXMgYSBwYXJ0aXRpb24ga2V5LCBhbmQgdGhhdCBpZiB0aGUgdGFibGUgaGFzCi1ubyBgY2x1c3RlcmluZyBjb2x1bW5zYCwgdGhlbiBldmVyeSBwYXJ0aXRpb24gb2YgdGhhdCB0YWJsZSBoYXMgYSBzaW5nbGUgcm93LgotYmVjYXVzZSB0aGUgcGFydGl0aW9uIGtleSwgY29tcG91bmQgb3Igb3RoZXJ3aXNlLCBpZGVudGlmaWVzIGEgc2luZ2xlIGxvY2F0aW9uLgotCi1UaGUgbW9zdCBpbXBvcnRhbnQgcHJvcGVydHkgb2YgcGFydGl0aW9uIGlzIHRoYXQgYWxsIHRoZSByb3dzIGJlbG9uZ2luZwotdG8gdGhlIHNhbWUgcGFydGl0aW9uIGFyZSBndWFyYW50ZWVkIHRvIGJlIHN0b3JlZCBvbiB0aGUgc2FtZSBzZXQgb2YKLXJlcGxpY2Egbm9kZXMuIAotSW4gb3RoZXIgd29yZHMsIHRoZSBwYXJ0aXRpb24ga2V5IG9mIGEgdGFibGUgZGVmaW5lcyB3aGljaCByb3dzIHdpbGwgYmUgbG9jYWxpemVkIG9uIHRoZSBzYW1lIAotbm9kZSBpbiB0aGUgY2x1c3Rlci4gCi1UaGUgbG9jYWxpemF0aW9uIG9mIGRhdGEgaXMgaW1wb3J0YW50IHRvIHRoZSBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGRhdGEsIHJlcXVpcmluZyB0aGUgQ2Fzc2FuZHJhIGNvb3JkaW5hdG9yCi10byBjb250YWN0IGFzIGZldyBub2RlcyBhcyBwb3NzaWJsZS4KLUhvd2V2ZXIsIHRoZXJlIGlzIGEgZmxpcC1zaWRlIHRvIHRoaXMgZ3VhcmFudGVlLCBhbmQgYWxsIHJvd3Mgc2hhcmluZyBhIHBhcnRpdGlvbiBrZXkgd2lsbCBiZSBzdG9yZWQgb24gdGhlIHNhbWUgCi1ub2RlLCBjcmVhdGluZyBhIGhvdHNwb3QgZm9yIGJvdGggcmVhZGluZyBhbmQgd3JpdGluZy4KLVdoaWxlIHNlbGVjdGluZyBhIHByaW1hcnkga2V5IHRoYXQgZ3JvdXBzIHRhYmxlIHJvd3MgYXNzaXN0cyBiYXRjaCB1cGRhdGVzIGFuZCBjYW4gZW5zdXJlIHRoYXQgdGhlIHVwZGF0ZXMgYXJlIAotX2F0b21pY18gYW5kIGRvbmUgaW4gX2lzb2xhdGlvbl8sIHRoZSBwYXJ0aXRpb25zIG11c3QgYmUgc2l6ZWQgImp1c3QgcmlnaHQsIG5vdCB0b28gYmlnIG5vciB0b28gc21hbGwiLgotCi1EYXRhIG1vZGVsaW5nIHRoYXQgY29uc2lkZXJzIHRoZSBxdWVyeWluZyBwYXR0ZXJucyBhbmQgYXNzaWducyBwcmltYXJ5IGtleXMgYmFzZWQgb24gdGhlIHF1ZXJpZXMgd2lsbCBoYXZlIHRoZSBsb3dlc3QgCi1sYXRlbmN5IGluIGZldGNoaW5nIGRhdGEuCi0KLVtbY2x1c3RlcmluZy1jb2x1bW5zXV0KLT09PT0gQ2x1c3RlcmluZyBjb2x1bW5zCi0KLVRoZSBjbHVzdGVyaW5nIGNvbHVtbnMgb2YgYSB0YWJsZSBkZWZpbmUgdGhlIGNsdXN0ZXJpbmcgb3JkZXIgZm9yIHRoZSBwYXJ0aXRpb24gb2YgdGhhdCB0YWJsZS4gCi1Gb3IgYSBnaXZlbiBgcGFydGl0aW9uYCwgYWxsIHJvd3MgYXJlIG9yZGVyZWQgYnkgdGhhdCBjbHVzdGVyaW5nIG9yZGVyLiBDbHVzdGVyaW5nIGNvbHVtbnMgYWxzbyBhZGQgdW5pcXVlbmVzcyB0bwotYSByb3cgaW4gYSB0YWJsZS4KLQotRm9yIGluc3RhbmNlLCBnaXZlbjoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfdGFibGVfY2x1c3RlcmNvbHVtbi5jcWxbXQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvaW5zZXJ0X3RhYmxlX2NsdXN0ZXJjb2x1bW4uY3FsW10KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3NlbGVjdF90YWJsZV9jbHVzdGVyY29sdW1uLmNxbFtdCi0tLS0tCi0KLXdpbGwgcmVzdWx0IGluCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zZWxlY3RfdGFibGVfY2x1c3RlcmNvbHVtbi5yZXN1bHRbXQotLS0tLQotPDE+IFJvdyAxIGlzIGluIG9uZSBwYXJ0aXRpb24sIGFuZCBSb3dzIDItNSBhcmUgaW4gYSBkaWZmZXJlbnQgb25lLiBUaGUgZGlzcGxheSBvcmRlciBpcyBhbHNvIGRpZmZlcmVudC4KLQotTG9va2luZyBtb3JlIGNsb3NlbHkgYXQgdGhlIGZvdXIgcm93cyBpbiB0aGUgc2FtZSBwYXJ0aXRpb24sIHRoZSBgYmAgY2x1c3RlcmluZyBjb2x1bW4gZGVmaW5lcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhvc2Ugcm93cyAKLWFyZSBkaXNwbGF5ZWQuIAotV2hlcmVhcyB0aGUgcGFydGl0aW9uIGtleSBvZiB0aGUgdGFibGUgZ3JvdXBzIHJvd3Mgb24gdGhlIHNhbWUgbm9kZSwgdGhlIGNsdXN0ZXJpbmcgY29sdW1ucyBjb250cm9sIAotaG93IHRob3NlIHJvd3MgYXJlIHN0b3JlZCBvbiB0aGUgbm9kZS4gCi0KLVRoYXQgc29ydGluZyBhbGxvd3MgdGhlIHZlcnkgZWZmaWNpZW50IHJldHJpZXZhbCBvZiBhIHJhbmdlIG9mIHJvd3Mgd2l0aGluIGEgcGFydGl0aW9uOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3NlbGVjdF9yYW5nZS5jcWxbXQotLS0tLQotCi13aWxsIHJlc3VsdCBpbgotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvc2VsZWN0X3JhbmdlLnJlc3VsdFtdCi0tLS0tCi0KLVtbY3JlYXRlLXRhYmxlLW9wdGlvbnNdXQotPT09IFRhYmxlIG9wdGlvbnMKLQotQSBDUUwgdGFibGUgaGFzIGEgbnVtYmVyIG9mIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGF0IGNyZWF0aW9uIChhbmQsCi1mb3IgbW9zdCBvZiB0aGVtLCBhbHRlcmVkIGxhdGVyKS4gVGhlc2Ugb3B0aW9ucyBhcmUgc3BlY2lmaWVkIGFmdGVyIHRoZQotYFdJVEhgIGtleXdvcmQuCi0KLU9uZSBpbXBvcnRhbnQgb3B0aW9uIHRoYXQgY2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXIgY3JlYXRpb24sIGBDTFVTVEVSSU5HIE9SREVSIEJZYCwgaW5mbHVlbmNlcyBob3cgcXVlcmllcyBjYW4gYmUgZG9uZSBhZ2FpbnN0IHRoZSB0YWJsZS4gSXQgaXMgd29ydGggZGlzY3Vzc2luZyBpbiBtb3JlIGRldGFpbCBoZXJlLgotCi1bW2NsdXN0ZXJpbmctb3JkZXJdXQotPT09PSBDbHVzdGVyaW5nIG9yZGVyCi0KLVRoZSBjbHVzdGVyaW5nIG9yZGVyIG9mIGEgdGFibGUgaXMgZGVmaW5lZCBieSB0aGUgY2x1c3RlcmluZyBjb2x1bW5zLiAKLUJ5IGRlZmF1bHQsIHRoZSBjbHVzdGVyaW5nIG9yZGVyIGlzIGFzY2VuZGluZyBmb3IgdGhlIGNsdXN0ZXJpbmcgY29sdW1uJ3MgZGF0YSB0eXBlcy4gCi1Gb3IgZXhhbXBsZSwgaW50ZWdlcnMgb3JkZXIgZnJvbSAxLCAyLCAuLi4gbiwgd2hpbGUgdGV4dCBvcmRlcnMgZnJvbSBBIHRvIFouIAotCi1UaGUgYENMVVNURVJJTkcgT1JERVIgQllgIHRhYmxlIG9wdGlvbiB1c2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGhlCi1jbHVzdGVyaW5nIGNvbHVtbnMsIGVhY2ggc2V0IGZvciBlaXRoZXIgYEFTQ2AgKGZvciBfYXNjZW5kaW5nXyBvcmRlcikgb3IgYERFU0NgIChmb3IgX2Rlc2NlbmRpbmcgb3JkZXIpLgotVGhlIGRlZmF1bHQgaXMgYXNjZW5kaW5nIGZvciBhbGwgY2x1c3RlcmluZyBjb2x1bW5zIGlmIHRoZSBgQ0xVU1RFUklORyBPUkRFUiBCWWAgb3B0aW9uIGlzIG5vdCBzZXQuIAotCi1UaGlzIG9wdGlvbiBpcyBiYXNpY2FsbHkgYSBoaW50IGZvciB0aGUgc3RvcmFnZSBlbmdpbmUgdGhhdCBjaGFuZ2VzIHRoZSBvcmRlciBpbiB3aGljaCBpdCBzdG9yZXMgdGhlIHJvdy4KLUJld2FyZSBvZiB0aGUgY29uc2VxdWVuY2VzIG9mIHNldHRpbmcgdGhpcyBvcHRpb246Ci0KLSogSXQgY2hhbmdlcyB0aGUgZGVmYXVsdCBhc2NlbmRpbmcgb3JkZXIgb2YgcmVzdWx0cyB3aGVuIHF1ZXJpZWQgd2l0aCBhIGBTRUxFQ1RgIHN0YXRlbWVudCB3aXRoIG5vIGBPUkRFUiBCWWAgY2xhdXNlLgotCi0qIEl0IGxpbWl0cyBob3cgdGhlIGBPUkRFUiBCWWAgY2xhdXNlIGlzIHVzZWQgaW4gYFNFTEVDVGAgc3RhdGVtZW50cyBvbiB0aGF0IHRhYmxlLiAKLVJlc3VsdHMgY2FuIG9ubHkgYmUgb3JkZXJlZCB3aXRoIGVpdGhlciB0aGUgb3JpZ2luYWwgY2x1c3RlcmluZyBvcmRlciBvciB0aGUgcmV2ZXJzZSBjbHVzdGVyaW5nIG9yZGVyLgotU3VwcG9zZSB5b3UgY3JlYXRlIGEgdGFibGUgd2l0aCB0d28gY2x1c3RlcmluZyBjb2x1bW5zIGBhYCBhbmQgYGJgLCBkZWZpbmVkIGBXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKGEgREVTQywgYiBBU0MpYC4KLVF1ZXJpZXMgb24gdGhlIHRhYmxlIGNhbiB1c2UgYE9SREVSIEJZIChhIERFU0MsIGIgQVNDKWAgb3IgYE9SREVSIEJZIChhIEFTQywgYiBERVNDKWAuIAotTWl4ZWQgb3JkZXIsIHN1Y2ggYXMgYE9SREVSIEJZIChhIEFTQywgYiBBU0MpYCBvciBgT1JERVIgQlkgKGEgREVTQywgYiBERVNDKWAgd2lsbCBub3QgcmV0dXJuIGV4cGVjdGVkIG9yZGVyLgotCi0qIEl0IGhhcyBhIHBlcmZvcm1hbmNlIGltcGFjdCBvbiBxdWVyaWVzLiBRdWVyaWVzIGluIHJldmVyc2UgY2x1c3RlcmluZyBvcmRlciBhcmUgc2xvd2VyIHRoYW4gdGhlIGRlZmF1bHQgYXNjZW5kaW5nIG9yZGVyLgotSWYgeW91IHBsYW4gdG8gcXVlcnkgbW9zdGx5IGluIGRlc2NlbmRpbmcgb3JkZXIsIGRlY2xhcmUgdGhlIGNsdXN0ZXJpbmcgb3JkZXIgaW4gdGhlIHRhYmxlIHNjaGVtYSB1c2luZyBgV0lUSCBDTFVTVEVSSU5HIE9SREVSIEJZICgpYC4gCi1UaGlzIG9wdGltaXphdGlvbiBpcyBjb21tb24gZm9yIHRpbWUgc2VyaWVzLCB0byByZXRyaWV2ZSB0aGUgZGF0YSBmcm9tIG5ld2VzdCB0byBvbGRlc3QuCi0KLVtbY3JlYXRlLXRhYmxlLWdlbmVyYWwtb3B0aW9uc11dCi09PT09IE90aGVyIHRhYmxlIG9wdGlvbnMKLQotQSB0YWJsZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6Ci0KLVt3aWR0aD0iMTAwJSIsY29scz0iMzAlLDklLDExJSw1MCUiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfG9wdGlvbiB8IGtpbmQgfCBkZWZhdWx0IHwgZGVzY3JpcHRpb24KLQotfCBgY29tbWVudGAgfCBfc2ltcGxlXyB8IG5vbmUgfCBBIGZyZWUtZm9ybSwgaHVtYW4tcmVhZGFibGUgY29tbWVudAotfCB4cmVmOmNxbC9kZGwuYWRvYyNzcGVjX3JldHJ5W2BzcGVjdWxhdGl2ZV9yZXRyeWBdIHwgX3NpbXBsZV8gfCA5OVBFUkNFTlRJTEUgfCBTcGVjdWxhdGl2ZSByZXRyeSBvcHRpb25zCi18IGBjZGNgIHxfYm9vbGVhbl8gfGZhbHNlIHxDcmVhdGUgYSBDaGFuZ2UgRGF0YSBDYXB0dXJlIChDREMpIGxvZyBvbiB0aGUgdGFibGUKLXwgYGFkZGl0aW9uYWxfd3JpdGVfcG9saWN5YCB8X3NpbXBsZV8gfDk5UEVSQ0VOVElMRSB8IFNhbWUgYXMgYHNwZWN1bGF0aXZlX3JldHJ5YAotfCBgZ2NfZ3JhY2Vfc2Vjb25kc2AgfF9zaW1wbGVfIHw4NjQwMDAgfFRpbWUgdG8gd2FpdCBiZWZvcmUgZ2FyYmFnZSBjb2xsZWN0aW5nIHRvbWJzdG9uZXMgKGRlbGV0aW9uIG1hcmtlcnMpCi18IGBibG9vbV9maWx0ZXJfZnBfY2hhbmNlYCB8X3NpbXBsZV8gfDAuMDAwNzUgfFRoZSB0YXJnZXQgcHJvYmFiaWxpdHkgb2YKLWZhbHNlIHBvc2l0aXZlIG9mIHRoZSBzc3RhYmxlIGJsb29tIGZpbHRlcnMuIFNhaWQgYmxvb20gZmlsdGVycyB3aWxsIGJlCi1zaXplZCB0byBwcm92aWRlIHRoZSBwcm92aWRlZCBwcm9iYWJpbGl0eSwgdGh1cyBsb3dlcmluZyB0aGlzIHZhbHVlCi1pbXBhY3QgdGhlIHNpemUgb2YgYmxvb20gZmlsdGVycyBpbi1tZW1vcnkgYW5kIG9uLWRpc2suCi18IGBkZWZhdWx0X3RpbWVfdG9fbGl2ZWAgfF9zaW1wbGVfIHwwIHxEZWZhdWx0IGV4cGlyYXRpb24gdGltZSAo4oCcVFRM4oCdKSBpbiBzZWNvbmRzIGZvciBhIHRhYmxlCi18IGBjb21wYWN0aW9uYCB8X21hcF8gfF9zZWUgYmVsb3dfIHwgeHJlZjpvcGVyYXRpbmcvY29tcGFjdGlvbi9pbmRleC5hZG9jI2NxbC1jb21wYWN0aW9uLW9wdGlvbnNbQ29tcGFjdGlvbiBvcHRpb25zXQotfCBgY29tcHJlc3Npb25gIHxfbWFwXyB8X3NlZSBiZWxvd18gfCB4cmVmOm9wZXJhdGluZy9jb21wcmVzc2lvbi9pbmRleC5hZG9jI2NxbC1jb21wcmVzc2lvbi1vcHRpb25zW0NvbXByZXNzaW9uIG9wdGlvbnNdCi18IGBjYWNoaW5nYCB8X21hcF8gfF9zZWUgYmVsb3dfIHxDYWNoaW5nIG9wdGlvbnMKLXwgYG1lbXRhYmxlX2ZsdXNoX3BlcmlvZF9pbl9tc2AgfF9zaW1wbGVfIHwwIHxUaW1lIChpbiBtcykgYmVmb3JlIENhc3NhbmRyYSBmbHVzaGVzIG1lbXRhYmxlcyB0byBkaXNrCi18IGByZWFkX3JlcGFpcmAgfF9zaW1wbGVfIHxCTE9DS0lORyB8U2V0cyByZWFkIHJlcGFpciBiZWhhdmlvciAoc2VlIGJlbG93KQotfD09PQotCi1bW3NwZWNfcmV0cnldXQotPT09PT0gU3BlY3VsYXRpdmUgcmV0cnkgb3B0aW9ucwotCi1CeSBkZWZhdWx0LCBDYXNzYW5kcmEgcmVhZCBjb29yZGluYXRvcnMgb25seSBxdWVyeSBhcyBtYW55IHJlcGxpY2FzIGFzCi1uZWNlc3NhcnkgdG8gc2F0aXNmeSBjb25zaXN0ZW5jeSBsZXZlbHM6IG9uZSBmb3IgY29uc2lzdGVuY3kgbGV2ZWwKLWBPTkVgLCBhIHF1b3J1bSBmb3IgYFFVT1JVTWAsIGFuZCBzbyBvbi4gYHNwZWN1bGF0aXZlX3JldHJ5YCBkZXRlcm1pbmVzCi13aGVuIGNvb3JkaW5hdG9ycyBtYXkgcXVlcnkgYWRkaXRpb25hbCByZXBsaWNhcywgYSB1c2VmdWwgYWN0aW9uIHdoZW4KLXJlcGxpY2FzIGFyZSBzbG93IG9yIHVucmVzcG9uc2l2ZS4gU3BlY3VsYXRpdmUgcmV0cmllcyByZWR1Y2UgdGhlIGxhdGVuY3kuIAotVGhlIHNwZWN1bGF0aXZlX3JldHJ5IG9wdGlvbiBjb25maWd1cmVzIHJhcGlkIHJlYWQgcHJvdGVjdGlvbiwgd2hlcmUgYSBjb29yZGluYXRvciBzZW5kcyBtb3JlCi1yZXF1ZXN0cyB0aGFuIG5lZWRlZCB0byBzYXRpc2Z5IHRoZSBjb25zaXN0ZW5jeSBsZXZlbC4KLQotW0lNUE9SVEFOVF0KLT09PT0KLUZyZXF1ZW50bHkgcmVhZGluZyBmcm9tIGFkZGl0aW9uYWwgcmVwbGljYXMgY2FuIGh1cnQgY2x1c3RlcgotcGVyZm9ybWFuY2UuIFdoZW4gaW4gZG91YnQsIGtlZXAgdGhlIGRlZmF1bHQgYDk5UEVSQ0VOVElMRWAuCi09PT09Ci0KLVByZS1DYXNzYW5kcmEgNC4wIHNwZWN1bGF0aXZlIHJldHJ5IHBvbGljeSB0YWtlcyBhIHNpbmdsZSBzdHJpbmcgYXMgYSBwYXJhbWV0ZXI6Ci0KLSogYE5PTkVgCi0qIGBBTFdBWVNgCi0qIGA5OVBFUkNFTlRJTEVgIChQRVJDRU5USUxFKQotKiBgNTBNU2AgKENVU1RPTSkKLQotQW4gZXhhbXBsZSBvZiBzZXR0aW5nIHNwZWN1bGF0aXZlIHJldHJ5IHNldHMgYSBjdXN0b20gdmFsdWU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvYWx0ZXJfdGFibGVfc3BlY19yZXRyeS5jcWxbXQotLS0tLQotCi1UaGlzIGV4YW1wbGUgdXNlcyBhIHBlcmNlbnRpbGUgZm9yIHRoZSBzZXR0aW5nOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2FsdGVyX3RhYmxlX3NwZWNfcmV0cnlfcGVyY2VudC5jcWxbXQotLS0tLQotCi1BIHBlcmNlbnRpbGUgc2V0dGluZyBjYW4gYmFja2ZpcmUuIElmIGEgc2luZ2xlIGhvc3QgYmVjb21lcyB1bmF2YWlsYWJsZSwgaXQgY2FuCi1mb3JjZSB1cCB0aGUgcGVyY2VudGlsZXMuIEEgdmFsdWUgb2YgYHA5OWAgd2lsbCBub3Qgc3BlY3VsYXRlIGFzIGludGVuZGVkIGJlY2F1c2UgdGhlIAotdmFsdWUgYXQgdGhlIHNwZWNpZmllZCBwZXJjZW50aWxlIGhhcyBpbmNyZWFzZWQgdG9vIG11Y2guIElmIHRoZSBjb25zaXN0ZW5jeSBsZXZlbCBpcyBzZXQgdG8gYEFMTGAsIGFsbCAKLXJlcGxpY2FzIGFyZSBxdWVyaWVkIHJlZ2FyZGxlc3Mgb2YgdGhlIHNwZWN1bGF0aXZlIHJldHJ5IHNldHRpbmcuIAotCi1DYXNzYW5kcmEgNC4wIHN1cHBvcnRzIGNhc2UtaW5zZW5zaXRpdml0eSBmb3Igc3BlY3VsYXRpdmUgcmV0cnkgdmFsdWVzIChodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xNDI5M1tDQVNTQU5EUkEtMTQyOTNdKS4gRm9yIGV4YW1wbGUsIGFzc2lnbmluZyB0aGUgdmFsdWUgYXMgYG5vbmVgLCBgTm9uZWAsIG9yIGBOT05FYCBoYXMgdGhlIHNhbWUgZWZmZWN0LgotCi1BZGRpdGlvbmFsbHksIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBhZGRlZDoKLQotW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxGb3JtYXQgfEV4YW1wbGUgfERlc2NyaXB0aW9uCi18IGBYUEVSQ0VOVElMRWAgfCA5MC41UEVSQ0VOVElMRSB8IENvb3JkaW5hdG9ycyByZWNvcmQgYXZlcmFnZSBwZXItdGFibGUgcmVzcG9uc2UgdGltZXMKLWZvciBhbGwgcmVwbGljYXMuIElmIGEgcmVwbGljYSB0YWtlcyBsb25nZXIgdGhhbiBgWGAgcGVyY2VudCBvZiB0aGlzCi10YWJsZSdzIGF2ZXJhZ2UgcmVzcG9uc2UgdGltZSwgdGhlIGNvb3JkaW5hdG9yIHF1ZXJpZXMgYW4gYWRkaXRpb25hbAotcmVwbGljYS4gYFhgIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAuCi18IGBYUGAgfCA5MC41UCB8IFNhbWUgYXMgYFhQRVJDRU5USUxFYAotfCBgWW1zYCB8IDI1bXMgfCBJZiBhIHJlcGxpY2EgdGFrZXMgbW9yZSB0aGFuIGBZYCBtaWxsaXNlY29uZHMgdG8gcmVzcG9uZCwgdGhlCi1jb29yZGluYXRvciBxdWVyaWVzIGFuIGFkZGl0aW9uYWwgcmVwbGljYS4KLXwgYE1JTihYUEVSQ0VOVElMRSxZTVMpYCB8IE1JTig5OVBFUkNFTlRJTEUsMzVNUykgfCBBIGh5YnJpZCBwb2xpY3kgdGhhdCB1c2VzIGVpdGhlciB0aGUKLXNwZWNpZmllZCBwZXJjZW50aWxlIG9yIGZpeGVkIG1pbGxpc2Vjb25kcyBkZXBlbmRpbmcgb24gd2hpY2ggdmFsdWUgaXMKLWxvd2VyIGF0IHRoZSB0aW1lIG9mIGNhbGN1bGF0aW9uLiBQYXJhbWV0ZXJzIGFyZSBgWFBFUkNFTlRJTEVgLCBgWFBgLCBvcgotYFltc2AuIFRoaXMgc2V0dGluZyBoZWxwcyBwcm90ZWN0IGFnYWluc3QgYSBzaW5nbGUgc2xvdyBpbnN0YW5jZS4KLQotfCBgTUFYKFhQRVJDRU5USUxFLFlNUylgIGBBTFdBWVNgIGBORVZFUmAgfCBNQVgoOTAuNVAsMjVtcykgfCBBIGh5YnJpZCBwb2xpY3kgdGhhdCB1c2VzIGVpdGhlciB0aGUgc3BlY2lmaWVkCi1wZXJjZW50aWxlIG9yIGZpeGVkIG1pbGxpc2Vjb25kcyBkZXBlbmRpbmcgb24gd2hpY2ggdmFsdWUgaXMgaGlnaGVyIGF0Ci10aGUgdGltZSBvZiBjYWxjdWxhdGlvbi4gCi18PT09Ci0KLUNhc3NhbmRyYSA0LjAgYWRkcyBzdXBwb3J0IGZvciBoeWJyaWQgYE1JTigpYCBhbmQgYE1BWCgpYCBzcGVjdWxhdGl2ZSByZXRyeSBwb2xpY2llcywgd2l0aCBhIG1peCBhbmQgbWF0Y2ggb2YgZWl0aGVyIGBNSU4oKSwgTUFYKClgLCBgTUlOKCksIE1JTigpYCwgb3IgYE1BWCgpLCBNQVgoKWAgKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE0MjkzW0NBU1NBTkRSQS0xNDI5M10pLgotVGhlIGh5YnJpZCBtb2RlIHdpbGwgc3RpbGwgc3BlY3VsYXRlIGlmIHRoZSBub3JtYWwgYHA5OWAgZm9yIHRoZSB0YWJsZSBpcyA8IDUwbXMsIHRoZSBtaW5pbXVtIHZhbHVlLgotQnV0IGlmIHRoZSBgcDk5YCBsZXZlbCBnb2VzIGhpZ2hlciB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlLCB0aGVuIHRoYXQgdmFsdWUgY2FuIGJlIHVzZWQuIAotSW4gYSBoeWJyaWQgdmFsdWUsIG9uZSB2YWx1ZSBtdXN0IGJlIGEgZml4ZWQgdGltZSAobXMpIHZhbHVlIGFuZCB0aGUgb3RoZXIgYSBwZXJjZW50aWxlIHZhbHVlLgotCi1UbyBpbGx1c3RyYXRlIHZhcmlhdGlvbnMsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYXJlIGFsbCB2YWxpZDoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9zcGVjX3JldHJ5X3ZhbHVlcy5jcWxbXQotLS0tLQotCi1UaGUgYGFkZGl0aW9uYWxfd3JpdGVfcG9saWN5YCBzZXR0aW5nIHNwZWNpZmllcyB0aGUgdGhyZXNob2xkIGF0IHdoaWNoIGEgY2hlYXAKLXF1b3J1bSB3cml0ZSB3aWxsIGJlIHVwZ3JhZGVkIHRvIGluY2x1ZGUgdHJhbnNpZW50IHJlcGxpY2FzLgotCi1bW2NxbC1jb21wYWN0aW9uLW9wdGlvbnNdXQotPT09PT0gQ29tcGFjdGlvbiBvcHRpb25zCi0KLVRoZSBgY29tcGFjdGlvbmAgb3B0aW9ucyBtdXN0IG1pbmltYWxseSBkZWZpbmUgdGhlIGAnY2xhc3MnYCBzdWItb3B0aW9uLAotdG8gc3BlY2lmeSB0aGUgY29tcGFjdGlvbiBzdHJhdGVneSBjbGFzcyB0byB1c2UuIAotVGhlIHN1cHBvcnRlZCBjbGFzc2VzIGFyZTogCi0KLSogYCdTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J2AsIHhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vc3Rjcy5hZG9jI3N0Y3NbU1RDU10gKERlZmF1bHQpCi0qIGAnTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneSdgLCB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL2xjcy5hZG9jI2xjc1tMQ1NdCi0qIGAnVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSdgLCB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL3R3Y3MuYWRvYyN0d2NzW1RXQ1NdIAotCi1UaGUgYCdEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J2AgaXMgYWxzbyBzdXBwb3J0ZWQgYnV0IGRlcHJlY2F0ZWQ7Ci1gJ1RpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3knYCBzaG91bGQgYmUgdXNlZC4gCi1JZiBhIGN1c3RvbSBzdHJhdGVnaWVzIGlzIHJlcXVpcmVkLCBzcGVjaWZ5IHRoZSBmdWxsIGNsYXNzIG5hbWUgYXMgYSB4cmVmOmNxbC9kZWZpbml0aW9ucy5hZG9jI2NvbnN0YW50c1tzdHJpbmcgY29uc3RhbnRdLiAgCi0KLUFsbCBkZWZhdWx0IHN0cmF0ZWdpZXMgc3VwcG9ydCBhIG51bWJlciBvZiB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL2luZGV4LmFkb2MjY29tcGFjdGlvbi1vcHRpb25zW2NvbW1vbiBvcHRpb25zXSwgYXMgd2VsbCBhcyBvcHRpb25zIHNwZWNpZmljIHRvIHRoZSBzdHJhdGVneSBjaG9zZW4uIFNlZSB0aGUgc2VjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHlvdXIgc3RyYXRlZ3kgZm9yIGRldGFpbHM6IHhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vc3Rjcy5hZG9jI3N0Y3Nfb3B0aW9uc1tTVENTXSwgeHJlZjpvcGVyYXRpbmcvY29tcGFjdGlvbi9sY3MuYWRvYyNsY3Nfb3B0aW9uc1tMQ1NdLCB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL3R3Y3MuYWRvYyN0d2NzX29wdGlvbnNbVFdDU10uCi0KLVtbY3FsLWNvbXByZXNzaW9uLW9wdGlvbnNdXQotPT09PT0gQ29tcHJlc3Npb24gb3B0aW9ucwotCi1UaGUgYGNvbXByZXNzaW9uYCBvcHRpb25zIGRlZmluZSBpZiBhbmQgaG93IHRoZSBTU1RhYmxlcyBvZiB0aGUgdGFibGUKLWFyZSBjb21wcmVzc2VkLiBDb21wcmVzc2lvbiBpcyBjb25maWd1cmVkIG9uIGEgcGVyLXRhYmxlIGJhc2lzIGFzIGFuCi1vcHRpb25hbCBhcmd1bWVudCB0byBgQ1JFQVRFIFRBQkxFYCBvciBgQUxURVIgVEFCTEVgLiBUaGUgZm9sbG93aW5nCi1zdWItb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE9wdGlvbiB8RGVmYXVsdCB8RGVzY3JpcHRpb24KLXwgYGNsYXNzYCB8IExaNENvbXByZXNzb3IgfCBUaGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIHRvIHVzZS4gRGVmYXVsdCBjb21wcmVzc29yIGFyZTogTFo0Q29tcHJlc3NvciwKLVNuYXBweUNvbXByZXNzb3IsIERlZmxhdGVDb21wcmVzc29yIGFuZCBac3RkQ29tcHJlc3Nvci4gCi1Vc2UgYCdlbmFibGVkJyA6IGZhbHNlYCB0byBkaXNhYmxlIGNvbXByZXNzaW9uLiAKLUN1c3RvbSBjb21wcmVzc29yIGNhbiBiZSBwcm92aWRlZCBieSBzcGVjaWZ5aW5nIHRoZSBmdWxsIGNsYXNzIG5hbWUgYXMgYSB4cmVmOmNxbC9kZWZpbml0aW9ucy5hZG9jI2NvbnN0YW50c1tzdHJpbmcgY29uc3RhbnRdLgotCi18IGBlbmFibGVkYCB8IHRydWUgfCBFbmFibGUvZGlzYWJsZSBzc3RhYmxlIGNvbXByZXNzaW9uLiAKLUlmIHRoZSBgZW5hYmxlZGAgb3B0aW9uIGlzIHNldCB0byBgZmFsc2VgLCBubyBvdGhlciBvcHRpb25zIG11c3QgYmUgc3BlY2lmaWVkLgotCi18IGBjaHVua19sZW5ndGhfaW5fa2JgIHwgNjQgfCBPbiBkaXNrIFNTVGFibGVzIGFyZSBjb21wcmVzc2VkIGJ5IGJsb2NrICh0byBhbGxvdyByYW5kb20gcmVhZHMpLiAKLVRoaXMgb3B0aW9uIGRlZmluZXMgdGhlIHNpemUgKGluIEtCKSBvZiBzYWlkIGJsb2NrLiBTZWUgeHJlZjpjcWwvZGRsLmFkb2MjY2h1bmtfbm90ZVtub3RlXSBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KLQotfCBgY3JjX2NoZWNrX2NoYW5jZWAgfCAxLjAgfCBEZXRlcm1pbmVzIGhvdyBsaWtlbHkgQ2Fzc2FuZHJhIGlzIHRvIHZlcmlmeSB0aGUgY2hlY2tzdW0gb24gZWFjaAotY29tcHJlc3Npb24gY2h1bmsgZHVyaW5nIHJlYWRzLgotCi18IGBjb21wcmVzc2lvbl9sZXZlbGAgfCAzIHwgQ29tcHJlc3Npb24gbGV2ZWwuIE9ubHkgYXBwbGljYWJsZSBmb3IgYFpzdGRDb21wcmVzc29yYC4gIAotQWNjZXB0cyB2YWx1ZXMgYmV0d2VlbiBgLTEzMTA3MmAgYW5kIGAyMmAuCi18PT09Ci0KLVtbY2h1bmtfbm90ZV1dCi1bTk9URV0KLT09PT0KLUJpZ2dlciB2YWx1ZXMgbWF5IGltcHJvdmUgdGhlIGNvbXByZXNzaW9uIHJhdGUsIGJ1dCB3aWxsIGluY3JlYXNlIHRoZSBtaW5pbXVtIHNpemUgb2YgZGF0YSB0byBiZSByZWFkIGZyb20KLWRpc2sgZm9yIGEgcmVhZC4gCi1UaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBvcHRpbWFsIHZhbHVlIGZvciBjb21wcmVzc2luZyB0YWJsZXMuIAotQ2h1bmsgbGVuZ3RoIG11c3QgYmUgYSBwb3dlciBvZiAyIHdoZW4gY29tcHV0aW5nIHRoZSBjaHVuayBudW1iZXIgZnJvbSBhbiB1bmNvbXByZXNzZWQgZmlsZSBvZmZzZXQuIAotQmxvY2sgc2l6ZSBtYXkgYmUgYWRqdXN0ZWQgYmFzZWQgb24gcmVhZC93cml0ZSBhY2Nlc3MgcGF0dGVybnMgc3VjaCBhczoKLQotKiBIb3cgbXVjaCBkYXRhIGlzIHR5cGljYWxseSByZXF1ZXN0ZWQgYXQgb25jZQotKiBBdmVyYWdlIHNpemUgb2Ygcm93cyBpbiB0aGUgdGFibGUKLT09PT0KLQotRm9yIGluc3RhbmNlLCB0byBjcmVhdGUgYSB0YWJsZSB3aXRoIExaNENvbXByZXNzb3IgYW5kIGEgYGNodW5rX2xlbmd0aF9pbl9rYmAgb2YgNCBLQjoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9jaHVua19sZW5ndGguY3FsW10KLS0tLS0KLQotW1tjcWwtY2FjaGluZy1vcHRpb25zXV0KLT09PT09IENhY2hpbmcgb3B0aW9ucwotCi1DYWNoaW5nIG9wdGltaXplcyB0aGUgdXNlIG9mIGNhY2hlIG1lbW9yeSBvZiBhIHRhYmxlLiBUaGUgY2FjaGVkIGRhdGEgaXMKLXdlaWdoZWQgYnkgc2l6ZSBhbmQgYWNjZXNzIGZyZXF1ZW5jeS4gCi1UaGUgYGNhY2hpbmdgIG9wdGlvbnMgY2FuIGNvbmZpZ3VyZSBib3RoIHRoZSBga2V5IGNhY2hlYCBhbmQgdGhlIGByb3cgY2FjaGVgIGZvciB0aGUgdGFibGUuIAotVGhlIGZvbGxvd2luZyBzdWItb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE9wdGlvbiB8RGVmYXVsdCB8RGVzY3JpcHRpb24KLXwgYGtleXNgIHwgQUxMIHwgV2hldGhlciB0byBjYWNoZSBrZXlzIChrZXkgY2FjaGUpIGZvciB0aGlzIHRhYmxlLiBWYWxpZCB2YWx1ZXMgYXJlOiBgQUxMYCBhbmQgYE5PTkVgLgotCi18IGByb3dzX3Blcl9wYXJ0aXRpb25gIHwgTk9ORSB8IFRoZSBhbW91bnQgb2Ygcm93cyB0byBjYWNoZSBwZXIgcGFydGl0aW9uIChyb3cgY2FjaGUpLiAKLUlmIGFuIGludGVnZXIgYG5gIGlzIHNwZWNpZmllZCwgdGhlIGZpcnN0IGBuYCBxdWVyaWVkIHJvd3Mgb2YgYSBwYXJ0aXRpb24gd2lsbCBiZSBjYWNoZWQuIAotVmFsaWQgdmFsdWVzIGFyZTogYEFMTGAsIHRvIGNhY2hlIGFsbCByb3dzIG9mIGEgcXVlcmllZCBwYXJ0aXRpb24sIG9yIGBOT05FYCB0byBkaXNhYmxlIHJvdyBjYWNoaW5nLgotfD09PQotCi1Gb3IgaW5zdGFuY2UsIHRvIGNyZWF0ZSBhIHRhYmxlIHdpdGggYm90aCBhIGtleSBjYWNoZSBhbmQgMTAgcm93cyBjYWNoZWQgcGVyIHBhcnRpdGlvbjoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9jYWNoaW5nX29wdGlvbi5jcWxbXQotLS0tLQotCi1bW3JlYWQtcmVwYWlyLW9wdGlvbnNdXQotPT09PT0gUmVhZCBSZXBhaXIgb3B0aW9ucwotCi1UaGUgYHJlYWRfcmVwYWlyYCBvcHRpb25zIGNvbmZpZ3VyZSB0aGUgcmVhZCByZXBhaXIgYmVoYXZpb3IsIHR1bmluZyBmb3IgdmFyaW91cyBwZXJmb3JtYW5jZSBhbmQgY29uc2lzdGVuY3kgYmVoYXZpb3JzLiAKLQotVGhlIHZhbHVlcyBhcmU6Ci1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE9wdGlvbiB8RGVmYXVsdCB8RGVzY3JpcHRpb24KLXxgQkxPQ0tJTkdgIHwgeWVzIHwgSWYgYSByZWFkIHJlcGFpciBpcyB0cmlnZ2VyZWQsIHRoZSByZWFkIGJsb2NrcyB3cml0ZXMgc2VudCB0byBvdGhlciByZXBsaWNhcyB1bnRpbCB0aGUgY29uc2lzdGVuY3kgbGV2ZWwgaXMgcmVhY2hlZCBieSB0aGUgd3JpdGVzLgotCi18YE5PTkVgIHwgbm8gfCBJZiBzZXQsIHRoZSBjb29yZGluYXRvciByZWNvbmNpbGVzIGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHJlcGxpY2FzLCBidXQgZG9lc24ndCBhdHRlbXB0IHRvIHJlcGFpciB0aGVtLgotfD09PQotCi1Ud28gY29uc2lzdGVuY3kgcHJvcGVydGllcyBhcmUgYWZmZWN0ZWQgYnkgcmVhZCByZXBhaXIgYmVoYXZpb3IuCi0KLSogTW9ub3RvbmljIHF1b3J1bSByZWFkczogTW9ub3RvbmljIHF1b3J1bSByZWFkcwotcHJldmVudHMgcmVhZHMgZnJvbSBhcHBlYXJpbmcgdG8gZ28gYmFjayBpbiB0aW1lIGluIHNvbWUgY2lyY3Vtc3RhbmNlcy4KLVdoZW4gbW9ub3RvbmljIHF1b3J1bSByZWFkcyBhcmUgbm90IHByb3ZpZGVkIGFuZCBhIHdyaXRlIGZhaWxzIHRvIHJlYWNoCi1hIHF1b3J1bSBvZiByZXBsaWNhcywgdGhlIHJlYWQgdmFsdWVzIG1heSBiZSB2aXNpYmxlIGluIG9uZSByZWFkLCBhbmQgdGhlbiBkaXNhcHBlYXIKLWluIGEgc3Vic2VxdWVudCByZWFkLiBgQkxPQ0tJTkdgIHByb3ZpZGVzIHRoaXMgYmVoYXZpb3IuCi0qIFdyaXRlIGF0b21pY2l0eTogV3JpdGUgYXRvbWljaXR5IHByZXZlbnRzIHJlYWRzCi1mcm9tIHJldHVybmluZyBwYXJ0aWFsbHktYXBwbGllZCB3cml0ZXMuIENhc3NhbmRyYSBhdHRlbXB0cyB0byBwcm92aWRlCi1wYXJ0aXRpb24tbGV2ZWwgd3JpdGUgYXRvbWljaXR5LCBidXQgc2luY2Ugb25seSB0aGUgZGF0YSBjb3ZlcmVkIGJ5IGEKLVNFTEVDVCBzdGF0ZW1lbnQgaXMgcmVwYWlyZWQgYnkgYSByZWFkIHJlcGFpciwgcmVhZCByZXBhaXIgY2FuIGJyZWFrCi13cml0ZSBhdG9taWNpdHkgd2hlbiBkYXRhIGlzIHJlYWQgYXQgYSBtb3JlIGdyYW51bGFyIGxldmVsIHRoYW4gaXQgaXMKLXdyaXR0ZW4uIEZvciBleGFtcGxlLCByZWFkIHJlcGFpciBjYW4gYnJlYWsgd3JpdGUgYXRvbWljaXR5IGlmIHlvdSB3cml0ZQotbXVsdGlwbGUgcm93cyB0byBhIGNsdXN0ZXJlZCBwYXJ0aXRpb24gaW4gYSBiYXRjaCwgYnV0IHRoZW4gc2VsZWN0IGEKLXNpbmdsZSByb3cgYnkgc3BlY2lmeWluZyB0aGUgY2x1c3RlcmluZyBjb2x1bW4gaW4gYSBTRUxFQ1Qgc3RhdGVtZW50LgotYE5PTkVgIHByb3ZpZGVzIHRoaXMgYmVoYXZpb3IuCi0KLT09PT09IE90aGVyIGNvbnNpZGVyYXRpb25zOgotCi0qIEFkZGluZyBuZXcgY29sdW1ucyAoc2VlIGBBTFRFUiBUQUJMRWAgYmVsb3cpIGlzIGEgY29uc3RhbnQgdGltZQotb3BlcmF0aW9uLiBUaHVzLCB0aGVyZSBpcyBubyBuZWVkIHRvIGFudGljaXBhdGUgZnV0dXJlIHVzYWdlIHdoaWxlIGluaXRpYWxseSBjcmVhdGluZyBhIHRhYmxlLgotCi1bW2FsdGVyLXRhYmxlLXN0YXRlbWVudF1dCi09PSBBTFRFUiBUQUJMRQotCi1BbHRlcmluZyBhbiBleGlzdGluZyB0YWJsZSB1c2VzIHRoZSBgQUxURVIgVEFCTEVgIHN0YXRlbWVudDoKLQotW3NvdXJjZSxibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9hbHRlcl90YWJsZS5ibmZbXQotLS0tLQotSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvYWx0ZXJfdGFibGVfYWRkX2NvbHVtbi5jcWxbXQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvYWx0ZXJfdGFibGVfd2l0aF9jb21tZW50LmNxbFtdCi0tLS0tCi0KLVRoZSBgQUxURVIgVEFCTEVgIHN0YXRlbWVudCBjYW46Ci0KLSogYEFERGAgYSBuZXcgY29sdW1uIHRvIGEgdGFibGUuIFRoZSBwcmltYXJ5IGtleSBvZiBhIHRhYmxlIGNhbm5vdCBldmVyIGJlIGFsdGVyZWQuCi1BIG5ldyBjb2x1bW4sIHRodXMsIGNhbm5vdCBiZSBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleS4gCi1BZGRpbmcgYSBjb2x1bW4gaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbiBiYXNlZCBvbiB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIHRhYmxlLgotSWYgdGhlIG5ldyBjb2x1bW4gYWxyZWFkeSBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgTk9UIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KLSogYERST1BgIGEgY29sdW1uIGZyb20gYSB0YWJsZS4gVGhpcyBjb21tYW5kIGRyb3BzIGJvdGggdGhlIGNvbHVtbiBhbmQgYWxsCi1pdHMgY29udGVudC4gQmUgYXdhcmUgdGhhdCwgd2hpbGUgdGhlIGNvbHVtbiBiZWNvbWVzIGltbWVkaWF0ZWx5Ci11bmF2YWlsYWJsZSwgaXRzIGNvbnRlbnQgYXJlIHJlbW92ZWQgbGF6aWx5IGR1cmluZyBjb21wYWN0aW9uLiBCZWNhdXNlIG9mIHRoaXMgbGF6eSByZW1vdmFsLAotdGhlIGNvbW1hbmQgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbiBiYXNlZCBvbiB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIHRhYmxlLiAKLUFsc28sIGl0IGlzIGltcG9ydGFudCB0byBrbm93IHRoYXQgb25jZSBhIGNvbHVtbiBpcyBkcm9wcGVkLCBhIGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUgY2FuIGJlIHJlLWFkZGVkLAotdW5sZXNzIHRoZSBkcm9wcGVkIGNvbHVtbiB3YXMgYSBub24tZnJvemVuIGNvbHVtbiBsaWtlIGEgY29sbGVjdGlvbi4KLUlmIHRoZSBkcm9wcGVkIGNvbHVtbiBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KLQotW1dBUk5JTkddCi0uV2FybmluZwotPT09PQotRHJvcHBpbmcgYSBjb2x1bW4gYXNzdW1lcyB0aGF0IHRoZSB0aW1lc3RhbXBzIHVzZWQgZm9yIHRoZSB2YWx1ZSBvZiB0aGlzCi1jb2x1bW4gYXJlICJyZWFsIiB0aW1lc3RhbXAgaW4gbWljcm9zZWNvbmRzLiBVc2luZyAicmVhbCIgdGltZXN0YW1wcyBpbgotbWljcm9zZWNvbmRzIGlzIHRoZSBkZWZhdWx0IGlzIGFuZCBpcyAqc3Ryb25nbHkqIHJlY29tbWVuZGVkIGJ1dCBhcwotQ2Fzc2FuZHJhIGFsbG93cyB0aGUgY2xpZW50IHRvIHByb3ZpZGUgYW55IHRpbWVzdGFtcCBvbiBhbnkgdGFibGUsIGl0IGlzCi10aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHRvIHVzZSBhbm90aGVyIGNvbnZlbnRpb24uIFBsZWFzZSBiZSBhd2FyZSB0aGF0Ci1pZiB5b3UgZG8gc28sIGRyb3BwaW5nIGEgY29sdW1uIHdpbGwgbm90IGNvcnJlY3RseSBleGVjdXRlLgotPT09PQotCi0qIGBSRU5BTUVgIGEgcHJpbWFyeSBrZXkgY29sdW1uIG9mIGEgdGFibGUuIE5vbiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbm5vdCBiZSByZW5hbWVkLgotRnVydGhlcm1vcmUsIHJlbmFtaW5nIGEgY29sdW1uIHRvIGFub3RoZXIgbmFtZSB3aGljaCBhbHJlYWR5IGV4aXN0cyBpc24ndCBhbGxvd2VkLgotSXQncyBpbXBvcnRhbnQgdG8ga2VlcCBpbiBtaW5kIHRoYXQgcmVuYW1lZCBjb2x1bW5zIHNob3VsZG4ndCBoYXZlIGRlcGVuZGVudCBzZWNvbmRheSBpbmRleGVzLgotSWYgdGhlIHJlbmFtZWQgY29sdW1uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotCi0qIFVzZSBgV0lUSGAgdG8gY2hhbmdlIGEgdGFibGUgb3B0aW9uLiBUaGUgeHJlZjpDUUwvZGRsLmFkb2MjY3JlYXRlLXRhYmxlLW9wdGlvbnNbc3VwcG9ydGVkIG9wdGlvbnNdCi1hcmUgdGhlIHNhbWUgYXMgdGhvc2UgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGFibGUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBgQ0xVU1RFUklORyBPUkRFUmAuCi1Ib3dldmVyLCBzZXR0aW5nIGFueSBgY29tcGFjdGlvbmAgc3ViLW9wdGlvbnMgd2lsbCBlcmFzZSAqQUxMKiBwcmV2aW91cyBgY29tcGFjdGlvbmAgb3B0aW9ucywgc28geW91IG5lZWQgdG8gcmUtc3BlY2lmeQotYWxsIHRoZSBzdWItb3B0aW9ucyB5b3Ugd2lzaCB0byBrZWVwLiBUaGUgc2FtZSBpcyB0cnVlIGZvciBgY29tcHJlc3Npb25gIHN1Yi1vcHRpb25zLgotCi1bW2Ryb3AtdGFibGUtc3RhdGVtZW50XV0KLT09IERST1AgVEFCTEUKLQotRHJvcHBpbmcgYSB0YWJsZSB1c2VzIHRoZSBgRFJPUCBUQUJMRWAgc3RhdGVtZW50OgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2Ryb3BfdGFibGUuYm5mW10KLS0tLS0KLQotRHJvcHBpbmcgYSB0YWJsZSByZXN1bHRzIGluIHRoZSBpbW1lZGlhdGUsIGlycmV2ZXJzaWJsZSByZW1vdmFsIG9mIHRoZQotdGFibGUsIGluY2x1ZGluZyBhbGwgZGF0YSBpdCBjb250YWlucy4KLQotSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MKLWBJRiBFWElTVFNgIGlzIHVzZWQsIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotCi1bW3RydW5jYXRlLXN0YXRlbWVudF1dCi09PSBUUlVOQ0FURQotCi1BIHRhYmxlIGNhbiBiZSB0cnVuY2F0ZWQgdXNpbmcgdGhlIGBUUlVOQ0FURWAgc3RhdGVtZW50OgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL3RydW5jYXRlX3RhYmxlLmJuZltdCi0tLS0tCi0KLWBUUlVOQ0FURSBUQUJMRSBmb29gIGlzIHRoZSBwcmVmZXJyZWQgc3ludGF4IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIERETAotc3RhdGVtZW50cy4gCi1Ib3dldmVyLCB0YWJsZXMgYXJlIHRoZSBvbmx5IG9iamVjdCB0aGF0IGNhbiBiZSB0cnVuY2F0ZWQgY3VycmVudGx5LCBhbmQgdGhlIGBUQUJMRWAga2V5d29yZCBjYW4gYmUgb21pdHRlZC4KLQotVHJ1bmNhdGluZyBhIHRhYmxlIHBlcm1hbmVudGx5IHJlbW92ZXMgYWxsIGV4aXN0aW5nIGRhdGEgZnJvbSB0aGUgdGFibGUsIGJ1dCB3aXRob3V0IHJlbW92aW5nIHRoZSB0YWJsZSBpdHNlbGYuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2RlZmluaXRpb25zLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2RlZmluaXRpb25zLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YmUyMGYuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9kZWZpbml0aW9ucy5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLT0gRGVmaW5pdGlvbnMKLQotPT0gQ29udmVudGlvbnMKLQotVG8gYWlkIGluIHNwZWNpZnlpbmcgdGhlIENRTCBzeW50YXgsIHdlIHdpbGwgdXNlIHRoZSBmb2xsb3dpbmcKLWNvbnZlbnRpb25zIGluIHRoaXMgZG9jdW1lbnQ6Ci0KLSogTGFuZ3VhZ2UgcnVsZXMgd2lsbCBiZSBnaXZlbiBpbiBhbiBpbmZvcm1hbAotaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYWNrdXMlRTIlODAlOTNOYXVyX0Zvcm0jVmFyaWFudHNbQk5GCi12YXJpYW50XSBub3RhdGlvbi4gSW4gcGFydGljdWxhciwgd2UnbGwgdXNlIHNxdWFyZSBicmFrZXRzIChgWyBpdGVtIF1gKQotZm9yIG9wdGlvbmFsIGl0ZW1zLCBgKmAgYW5kIGArYCBmb3IgcmVwZWF0ZWQgaXRlbXMgKHdoZXJlIGArYCBpbXBseSBhdAotbGVhc3Qgb25lKS4KLSogVGhlIGdyYW1tYXIgd2lsbCBhbHNvIHVzZSB0aGUgZm9sbG93aW5nIGNvbnZlbnRpb24gZm9yIGNvbnZlbmllbmNlOgotbm9uLXRlcm1pbmFsIHRlcm0gd2lsbCBiZSBsb3dlcmNhc2UgKGFuZCBsaW5rIHRvIHRoZWlyIGRlZmluaXRpb24pIHdoaWxlCi10ZXJtaW5hbCBrZXl3b3JkcyB3aWxsIGJlIHByb3ZpZGVkICJhbGwgY2FwcyIuIE5vdGUgaG93ZXZlciB0aGF0Ci1rZXl3b3JkcyBhcmUgYGlkZW50aWZpZXJzYCBhbmQgYXJlIHRodXMgY2FzZSBpbnNlbnNpdGl2ZSBpbiBwcmFjdGljZS4gV2UKLXdpbGwgYWxzbyBkZWZpbmUgc29tZSBlYXJseSBjb25zdHJ1Y3Rpb24gdXNpbmcgcmVnZXhwLCB3aGljaCB3ZSdsbAotaW5kaWNhdGUgd2l0aCBgcmUoPHNvbWUgcmVndWxhciBleHByZXNzaW9uPilgLgotKiBUaGUgZ3JhbW1hciBpcyBwcm92aWRlZCBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcyBhbmQgbGVhdmUgc29tZQotbWlub3IgZGV0YWlscyBvdXQuIEZvciBpbnN0YW5jZSwgdGhlIGNvbW1hIG9uIHRoZSBsYXN0IGNvbHVtbiBkZWZpbml0aW9uCi1pbiBhIGBDUkVBVEUgVEFCTEVgIHN0YXRlbWVudCBpcyBvcHRpb25hbCBidXQgc3VwcG9ydGVkIGlmIHByZXNlbnQgZXZlbgotdGhvdWdoIHRoZSBncmFtbWFyIGluIHRoaXMgZG9jdW1lbnQgc3VnZ2VzdHMgb3RoZXJ3aXNlLiBBbHNvLCBub3QKLWV2ZXJ5dGhpbmcgYWNjZXB0ZWQgYnkgdGhlIGdyYW1tYXIgaXMgbmVjZXNzYXJpbHkgdmFsaWQgQ1FMLgotKiBSZWZlcmVuY2VzIHRvIGtleXdvcmRzIG9yIHBpZWNlcyBvZiBDUUwgY29kZSBpbiBydW5uaW5nIHRleHQgd2lsbCBiZQotc2hvd24gaW4gYSBgZml4ZWQtd2lkdGggZm9udGAuCi0KLVtbaWRlbnRpZmllcnNdXQotPT0gSWRlbnRpZmllcnMgYW5kIGtleXdvcmRzCi0KLVRoZSBDUUwgbGFuZ3VhZ2UgdXNlcyBfaWRlbnRpZmllcnNfIChvciBfbmFtZXNfKSB0byBpZGVudGlmeSB0YWJsZXMsCi1jb2x1bW5zIGFuZCBvdGhlciBvYmplY3RzLiBBbiBpZGVudGlmaWVyIGlzIGEgdG9rZW4gbWF0Y2hpbmcgdGhlIHJlZ3VsYXIKLWV4cHJlc3Npb24gYFthLXpBLVpdW2EtekEtWjAtOV9dKmAuCi0KLUEgbnVtYmVyIG9mIHN1Y2ggaWRlbnRpZmllcnMsIGxpa2UgYFNFTEVDVGAgb3IgYFdJVEhgLCBhcmUgX2tleXdvcmRzXy4KLVRoZXkgaGF2ZSBhIGZpeGVkIG1lYW5pbmcgZm9yIHRoZSBsYW5ndWFnZSBhbmQgbW9zdCBhcmUgcmVzZXJ2ZWQuIFRoZQotbGlzdCBvZiB0aG9zZSBrZXl3b3JkcyBjYW4gYmUgZm91bmQgaW4geHJlZjpjcWwvYXBwZW5kaWNlcy5hZG9jI2FwcGVuZGl4LUFbQXBwZW5kaXggQV0uCi0KLUlkZW50aWZpZXJzIGFuZCAodW5xdW90ZWQpIGtleXdvcmRzIGFyZSBjYXNlIGluc2Vuc2l0aXZlLiBUaHVzIGBTRUxFQ1RgCi1pcyB0aGUgc2FtZSB0aGFuIGBzZWxlY3RgIG9yIGBzRWxFY1RgLCBhbmQgYG15SWRgIGlzIHRoZSBzYW1lIHRoYW4KLWBteWlkYCBvciBgTVlJRGAuIEEgY29udmVudGlvbiBvZnRlbiB1c2VkIChpbiBwYXJ0aWN1bGFyIGJ5IHRoZSBzYW1wbGVzCi1vZiB0aGlzIGRvY3VtZW50YXRpb24pIGlzIHRvIHVzZSB1cHBlcmNhc2UgZm9yIGtleXdvcmRzIGFuZCBsb3dlcmNhc2UKLWZvciBvdGhlciBpZGVudGlmaWVycy4KLQotVGhlcmUgaXMgYSBzZWNvbmQga2luZCBvZiBpZGVudGlmaWVyIGNhbGxlZCBhIF9xdW90ZWQgaWRlbnRpZmllcl8KLWRlZmluZWQgYnkgZW5jbG9zaW5nIGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIChub24tZW1wdHkpIGluCi1kb3VibGUtcXVvdGVzKGAiYCkuIFF1b3RlZCBpZGVudGlmaWVycyBhcmUgbmV2ZXIga2V5d29yZHMuIFRodXMKLWAic2VsZWN0ImAgaXMgbm90IGEgcmVzZXJ2ZWQga2V5d29yZCBhbmQgY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gYQotY29sdW1uIChub3RlIHRoYXQgdXNpbmcgdGhpcyBpcyBwYXJ0aWN1bGFybHkgaWxsLWFkdmlzZWQpLCB3aGlsZSBgc2VsZWN0YAotd291bGQgcmFpc2UgYSBwYXJzaW5nIGVycm9yLiBBbHNvLCB1bmxpa2UgdW5xdW90ZWQgaWRlbnRpZmllcnMKLWFuZCBrZXl3b3JkcywgcXVvdGVkIGlkZW50aWZpZXJzIGFyZSBjYXNlIHNlbnNpdGl2ZSAoYCJNeSBRdW90ZWQgSWQiYCBpcwotX2RpZmZlcmVudF8gZnJvbSBgIm15IHF1b3RlZCBpZCJgKS4gQSBmdWxseSBsb3dlcmNhc2UgcXVvdGVkIGlkZW50aWZpZXIKLXRoYXQgbWF0Y2hlcyBgW2EtekEtWl1bYS16QS1aMC05X10qYCBpcyBob3dldmVyIF9lcXVpdmFsZW50XyB0byB0aGUKLXVucXVvdGVkIGlkZW50aWZpZXIgb2J0YWluZWQgYnkgcmVtb3ZpbmcgdGhlIGRvdWJsZS1xdW90ZSAoc28gYCJteWlkImAKLWlzIGVxdWl2YWxlbnQgdG8gYG15aWRgIGFuZCB0byBgbXlJZGAgYnV0IGRpZmZlcmVudCBmcm9tIGAibXlJZCJgKS4KLUluc2lkZSBhIHF1b3RlZCBpZGVudGlmaWVyLCB0aGUgZG91YmxlLXF1b3RlIGNoYXJhY3RlciBjYW4gYmUgcmVwZWF0ZWQKLXRvIGVzY2FwZSBpdCwgc28gYCJmb28gIiIgYmFyImAgaXMgYSB2YWxpZCBpZGVudGlmaWVyLgotCi1bTk9URV0KLS5Ob3RlCi09PT09Ci1UaGUgX3F1b3RlZCBpZGVudGlmaWVyXyBjYW4gZGVjbGFyZSBjb2x1bW5zIHdpdGggYXJiaXRyYXJ5IG5hbWVzLCBhbmQKLXRoZXNlIGNhbiBzb21ldGltZSBjbGFzaCB3aXRoIHNwZWNpZmljIG5hbWVzIHVzZWQgYnkgdGhlIHNlcnZlci4gRm9yCi1pbnN0YW5jZSwgd2hlbiB1c2luZyBjb25kaXRpb25hbCB1cGRhdGUsIHRoZSBzZXJ2ZXIgd2lsbCByZXNwb25kIHdpdGggYQotcmVzdWx0IHNldCBjb250YWluaW5nIGEgc3BlY2lhbCByZXN1bHQgbmFtZWQgYCJbYXBwbGllZF0iYC4gSWYgeW914oCZdmUKLWRlY2xhcmVkIGEgY29sdW1uIHdpdGggc3VjaCBhIG5hbWUsIHRoaXMgY291bGQgcG90ZW50aWFsbHkgY29uZnVzZSBzb21lCi10b29scyBhbmQgc2hvdWxkIGJlIGF2b2lkZWQuIEluIGdlbmVyYWwsIHVucXVvdGVkIGlkZW50aWZpZXJzIHNob3VsZCBiZQotcHJlZmVycmVkIGJ1dCBpZiB5b3UgdXNlIHF1b3RlZCBpZGVudGlmaWVycywgaXQgaXMgc3Ryb25nbHkgYWR2aXNlZCB0aGF0IHlvdQotYXZvaWQgYW55IG5hbWUgZW5jbG9zZWQgYnkgc3F1YXJlZCBicmFja2V0cyAobGlrZSBgIlthcHBsaWVkXSJgKSBhbmQgYW55Ci1uYW1lIHRoYXQgbG9va3MgbGlrZSBhIGZ1bmN0aW9uIGNhbGwgKGxpa2UgYCJmKHgpImApLgotPT09PQotCi1Nb3JlIGZvcm1hbGx5LCB3ZSBoYXZlOgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9pZGVudGlmaWVyLmJuZltdCi0tLS0tCi0KLVtbY29uc3RhbnRzXV0KLT09IENvbnN0YW50cwotCi1DUUwgZGVmaW5lcyB0aGUgZm9sbG93aW5nIF9jb25zdGFudHNfOgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9jb25zdGFudC5ibmZbXQotLS0tLQotCi1JbiBvdGhlciB3b3JkczoKLQotKiBBIHN0cmluZyBjb25zdGFudCBpcyBhbiBhcmJpdHJhcnkgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBlbmNsb3NlZCBieQotc2luZ2xlLXF1b3RlKGAnYCkuIEEgc2luZ2xlLXF1b3RlIGNhbiBiZSBpbmNsdWRlZCBieSByZXBlYXRpbmcgaXQsIGUuZy4KLWAnSXQnJ3MgcmFpbmluZyB0b2RheSdgLiBUaG9zZSBhcmUgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggcXVvdGVkCi1gaWRlbnRpZmllcnNgIHRoYXQgdXNlIGRvdWJsZS1xdW90ZXMuIEFsdGVybmF0aXZlbHksIGEgc3RyaW5nIGNhbiBiZQotZGVmaW5lZCBieSBlbmNsb3NpbmcgdGhlIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGJ5IHR3byBkb2xsYXIKLWNoYXJhY3RlcnMsIGluIHdoaWNoIGNhc2Ugc2luZ2xlLXF1b3RlIGNhbiBiZSB1c2VkIHdpdGhvdXQgZXNjYXBpbmcKLShgJCRJdCdzIHJhaW5pbmcgdG9kYXkkJGApLiBUaGF0IGxhdHRlciBmb3JtIGlzIG9mdGVuIHVzZWQgd2hlbiBkZWZpbmluZwoteHJlZjpjcWwvZnVuY3Rpb25zLmFkb2MjdWRmc1t1c2VyLWRlZmluZWQgZnVuY3Rpb25zXSB0byBhdm9pZCBoYXZpbmcgdG8gZXNjYXBlIHNpbmdsZS1xdW90ZQotY2hhcmFjdGVycyBpbiBmdW5jdGlvbiBib2R5IChhcyB0aGV5IGFyZSBtb3JlIGxpa2VseSB0byBvY2N1ciB0aGFuCi1gJCRgKS4KLSogSW50ZWdlciwgZmxvYXQgYW5kIGJvb2xlYW4gY29uc3RhbnQgYXJlIGRlZmluZWQgYXMgZXhwZWN0ZWQuIE5vdGUKLWhvd2V2ZXIgdGhhbiBmbG9hdCBhbGxvd3MgdGhlIHNwZWNpYWwgYE5hTmAgYW5kIGBJbmZpbml0eWAgY29uc3RhbnRzLgotKiBDUUwgc3VwcG9ydHMKLWh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXZlcnNhbGx5X3VuaXF1ZV9pZGVudGlmaWVyW1VVSURdCi1jb25zdGFudHMuCi0qIEJsb2JzIGNvbnRlbnQgYXJlIHByb3ZpZGVkIGluIGhleGFkZWNpbWFsIGFuZCBwcmVmaXhlZCBieSBgMHhgLgotKiBUaGUgc3BlY2lhbCBgTlVMTGAgY29uc3RhbnQgZGVub3RlcyB0aGUgYWJzZW5jZSBvZiB2YWx1ZS4KLQotRm9yIGhvdyB0aGVzZSBjb25zdGFudHMgYXJlIHR5cGVkLCBzZWUgdGhlIHhyZWY6Y3FsL3R5cGVzLmFkb2NbRGF0YSB0eXBlc10gc2VjdGlvbi4KLQotPT0gVGVybXMKLQotQ1FMIGhhcyB0aGUgbm90aW9uIG9mIGEgX3Rlcm1fLCB3aGljaCBkZW5vdGVzIHRoZSBraW5kIG9mIHZhbHVlcyB0aGF0Ci1DUUwgc3VwcG9ydC4gVGVybXMgYXJlIGRlZmluZWQgYnk6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL3Rlcm0uYm5mW10KLS0tLS0KLQotQSB0ZXJtIGlzIHRodXMgb25lIG9mOgotCi0qIEEgeHJlZjpjcWwvZGVmaW50aW9ucy5hZG9jI2NvbnN0YW50c1tjb25zdGFudF0KLSogQSBsaXRlcmFsIGZvciBlaXRoZXIgYSB4cmVmOmNxbC90eXBlcy5hZG9jI2NvbGxlY3Rpb25zW2NvbGxlY3Rpb25dLAotYSB4cmVmOmNxbC90eXBlcy5hZG9jI3VkdHNbdXNlci1kZWZpbmVkIHR5cGVdIG9yIGEgeHJlZjpjcWwvdHlwZXMuYWRvYyN0dXBsZXNbdHVwbGVdCi0qIEEgeHJlZjpjcWwvZnVuY3Rpb25zLmFkb2MjY3FsLWZ1bmN0aW9uc1tmdW5jdGlvbl0gY2FsbCwgZWl0aGVyIGEgeHJlZjpjcWwvZnVuY3Rpb25zLmFkb2Mjc2NhbGFyLW5hdGl2ZS1mdW5jdGlvbnNbbmF0aXZlIGZ1bmN0aW9uXQotb3IgYSB4cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyN1c2VyLWRlZmluZWQtc2NhbGFyLWZ1bmN0aW9uc1t1c2VyLWRlZmluZWQgZnVuY3Rpb25dCi0qIEFuIHhyZWY6Y3FsL29wZXJhdG9ycy5hZG9jI2FyaXRobWV0aWNfb3BlcmF0b3JzW2FyaXRobWV0aWMgb3BlcmF0aW9uXSBiZXR3ZWVuIHRlcm1zCi0qIEEgdHlwZSBoaW50Ci0qIEEgYmluZCBtYXJrZXIsIHdoaWNoIGRlbm90ZXMgYSB2YXJpYWJsZSB0byBiZSBib3VuZCBhdCBleGVjdXRpb24gdGltZS4KLVNlZSB0aGUgc2VjdGlvbiBvbiBgcHJlcGFyZWQtc3RhdGVtZW50c2AgZm9yIGRldGFpbHMuIEEgYmluZCBtYXJrZXIgY2FuCi1iZSBlaXRoZXIgYW5vbnltb3VzIChgP2ApIG9yIG5hbWVkIChgOnNvbWVfbmFtZWApLiBUaGUgbGF0dGVyIGZvcm0KLXByb3ZpZGVzIGEgbW9yZSBjb252ZW5pZW50IHdheSB0byByZWZlciB0byB0aGUgdmFyaWFibGUgZm9yIGJpbmRpbmcgaXQKLWFuZCBzaG91bGQgZ2VuZXJhbGx5IGJlIHByZWZlcnJlZC4KLQotPT0gQ29tbWVudHMKLQotQSBjb21tZW50IGluIENRTCBpcyBhIGxpbmUgYmVnaW5uaW5nIGJ5IGVpdGhlciBkb3VibGUgZGFzaGVzIChgLS1gKSBvcgotZG91YmxlIHNsYXNoIChgLy9gKS4KLQotTXVsdGktbGluZSBjb21tZW50cyBhcmUgYWxzbyBzdXBwb3J0ZWQgdGhyb3VnaCBlbmNsb3N1cmUgd2l0aGluIGAvKmAgYW5kCi1gKi9gIChidXQgbmVzdGluZyBpcyBub3Qgc3VwcG9ydGVkKS4KLQotW3NvdXJjZSxjcWxdCi0tLS0tCi0tLSBUaGlzIGlzIGEgY29tbWVudAotLy8gVGhpcyBpcyBhIGNvbW1lbnQgdG9vCi0vKiBUaGlzIGlzCi0gICBhIG11bHRpLWxpbmUgY29tbWVudCAqLwotLS0tLQotCi09PSBTdGF0ZW1lbnRzCi0KLUNRTCBjb25zaXN0cyBvZiBzdGF0ZW1lbnRzIHRoYXQgY2FuIGJlIGRpdmlkZWQgaW4gdGhlIGZvbGxvd2luZwotY2F0ZWdvcmllczoKLQotKiBgZGF0YS1kZWZpbml0aW9uYCBzdGF0ZW1lbnRzLCB0byBkZWZpbmUgYW5kIGNoYW5nZSBob3cgdGhlIGRhdGEgaXMKLXN0b3JlZCAoa2V5c3BhY2VzIGFuZCB0YWJsZXMpLgotKiBgZGF0YS1tYW5pcHVsYXRpb25gIHN0YXRlbWVudHMsIGZvciBzZWxlY3RpbmcsIGluc2VydGluZyBhbmQgZGVsZXRpbmcKLWRhdGEuCi0qIGBzZWNvbmRhcnktaW5kZXhlc2Agc3RhdGVtZW50cy4KLSogYG1hdGVyaWFsaXplZC12aWV3c2Agc3RhdGVtZW50cy4KLSogYGNxbC1yb2xlc2Agc3RhdGVtZW50cy4KLSogYGNxbC1wZXJtaXNzaW9uc2Agc3RhdGVtZW50cy4KLSogYFVzZXItRGVmaW5lZCBGdW5jdGlvbnMgKFVERnMpYCBzdGF0ZW1lbnRzLgotKiBgdWR0c2Agc3RhdGVtZW50cy4KLSogYGNxbC10cmlnZ2Vyc2Agc3RhdGVtZW50cy4KLQotQWxsIHRoZSBzdGF0ZW1lbnRzIGFyZSBsaXN0ZWQgYmVsb3cgYW5kIGFyZSBkZXNjcmliZWQgaW4gdGhlIHJlc3Qgb2YKLXRoaXMgZG9jdW1lbnRhdGlvbiAoc2VlIGxpbmtzIGFib3ZlKToKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvY3FsX3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi09PSBQcmVwYXJlZCBTdGF0ZW1lbnRzCi0KLUNRTCBzdXBwb3J0cyBfcHJlcGFyZWQgc3RhdGVtZW50c18uIFByZXBhcmVkIHN0YXRlbWVudHMgYXJlIGFuCi1vcHRpbWl6YXRpb24gdGhhdCBhbGxvd3MgdG8gcGFyc2UgYSBxdWVyeSBvbmx5IG9uY2UgYnV0IGV4ZWN1dGUgaXQKLW11bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IGNvbmNyZXRlIHZhbHVlcy4KLQotQW55IHN0YXRlbWVudCB0aGF0IHVzZXMgYXQgbGVhc3Qgb25lIGJpbmQgbWFya2VyIChzZWUgYGJpbmRfbWFya2VyYCkKLXdpbGwgbmVlZCB0byBiZSBfcHJlcGFyZWRfLiBBZnRlciB3aGljaCB0aGUgc3RhdGVtZW50IGNhbiBiZSBfZXhlY3V0ZWRfCi1ieSBwcm92aWRlZCBjb25jcmV0ZSB2YWx1ZXMgZm9yIGVhY2ggb2YgaXRzIG1hcmtlci4gVGhlIGV4YWN0IGRldGFpbHMgb2YKLWhvdyBhIHN0YXRlbWVudCBpcyBwcmVwYXJlZCBhbmQgdGhlbiBleGVjdXRlZCBkZXBlbmRzIG9uIHRoZSBDUUwgZHJpdmVyCi11c2VkIGFuZCB5b3Ugc2hvdWxkIHJlZmVyIHRvIHlvdXIgZHJpdmVyIGRvY3VtZW50YXRpb24uCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2RtbC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9kbWwuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1MTdhYS4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2RtbC5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLT0gRGF0YSBNYW5pcHVsYXRpb24KLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgc3RhdGVtZW50cyBzdXBwb3J0ZWQgYnkgQ1FMIHRvIGluc2VydCwKLXVwZGF0ZSwgZGVsZXRlIGFuZCBxdWVyeSBkYXRhLgotCi1bW3NlbGVjdC1zdGF0ZW1lbnRdXQotPT0gU0VMRUNUCi0KLVF1ZXJ5aW5nIGRhdGEgZnJvbSBkYXRhIGlzIGRvbmUgdXNpbmcgYSBgU0VMRUNUYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvc2VsZWN0X3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9zZWxlY3Rfc3RhdGVtZW50LmNxbFtdCi0tLS0tCi0KLVRoZSBgU0VMRUNUYCBzdGF0ZW1lbnRzIHJlYWRzIG9uZSBvciBtb3JlIGNvbHVtbnMgZm9yIG9uZSBvciBtb3JlIHJvd3MKLWluIGEgdGFibGUuIEl0IHJldHVybnMgYSByZXN1bHQtc2V0IG9mIHRoZSByb3dzIG1hdGNoaW5nIHRoZSByZXF1ZXN0LAotd2hlcmUgZWFjaCByb3cgY29udGFpbnMgdGhlIHZhbHVlcyBmb3IgdGhlIHNlbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvCi10aGUgcXVlcnkuIEFkZGl0aW9uYWxseSwgeHJlZjpjcWwvZnVuY3Rpb25zLmFkb2MjY3FsLWZ1bmN0aW9uc1tmdW5jdGlvbnNdIGluY2x1ZGluZwoteHJlZjpjcWwvZnVuY3Rpb25zLmFkb2MjYWdncmVnYXRlLWZ1bmN0aW9uc1thZ2dyZWdhdGlvbnNdIGNhbiBiZSBhcHBsaWVkIHRvIHRoZSByZXN1bHQuCi0KLUEgYFNFTEVDVGAgc3RhdGVtZW50IGNvbnRhaW5zIGF0IGxlYXN0IGEgeHJlZjpjcWwvZG1sLmFkb2Mjc2VsZWN0aW9uLWNsYXVzZVtzZWxlY3Rpb24gY2xhdXNlXSBhbmQgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIG9uIHdoaWNoCi10aGUgc2VsZWN0aW9uIGlzIGV4ZWN1dGVkLiAKLUNRTCBkb2VzICpub3QqIGV4ZWN1dGUgam9pbnMgb3Igc3ViLXF1ZXJpZXMgYW5kIGEgc2VsZWN0IHN0YXRlbWVudCBvbmx5IGFwcGx5IHRvIGEgc2luZ2xlIHRhYmxlLiAKLUEgc2VsZWN0IHN0YXRlbWVudCBjYW4gYWxzbyBoYXZlIGEgeHJlZjpjcWwvZG1sLmFkb2Mjd2hlcmUtY2xhdXNlW3doZXJlIGNsYXVzZV0gdGhhdCBjYW4gZnVydGhlciBuYXJyb3cgdGhlIHF1ZXJ5IHJlc3VsdHMuCi1BZGRpdGlvbmFsIGNsYXVzZXMgY2FuIHhyZWY6Y3FsL2RtbC5hZG9jI29yZGVyaW5nLWNsYXVzZVtvcmRlcl0gb3IgeHJlZjpjcWwvZG1sLmFkb2MjbGltaXQtY2xhdXNlW2xpbWl0XSB0aGUgcmVzdWx0cy4gCi1MYXN0bHksIHhyZWY6Y3FsL2RtbC5hZG9jI2FsbG93LWZpbHRlcmluZ1txdWVyaWVzIHRoYXQgcmVxdWlyZSBmdWxsIGNsdXN0ZXIgZmlsdGVyaW5nXSBjYW4gYXBwZW5kIGBBTExPVyBGSUxURVJJTkdgIHRvIGFueSBxdWVyeS4KLQotW1tzZWxlY3Rpb24tY2xhdXNlXV0KLT09PSBTZWxlY3Rpb24gY2xhdXNlCi0KLVRoZSBgc2VsZWN0X2NsYXVzZWAgZGV0ZXJtaW5lcyB3aGljaCBjb2x1bW5zIHdpbGwgYmUgcXVlcmllZCBhbmQgcmV0dXJuZWQgaW4gdGhlIHJlc3VsdCBzZXQuIAotVGhpcyBjbGF1c2UgY2FuIGFsc28gYXBwbHkgdHJhbnNmb3JtYXRpb25zIHRvIGFwcGx5IHRvIHRoZSByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gCi1UaGUgc2VsZWN0aW9uIGNsYXVzZSBjb25zaXN0cyBvZiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHNwZWNpZmljIF9zZWxlY3RvcnNfIG9yLCBhbHRlcm5hdGl2ZWx5LCB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIChgKmApIHRvIHNlbGVjdCBhbGwgdGhlIGNvbHVtbnMgZGVmaW5lZCBpbiB0aGUgdGFibGUuCi0KLT09PT0gU2VsZWN0b3JzCi0KLUEgYHNlbGVjdG9yYCBjYW4gYmUgb25lIG9mOgotCi0qIEEgY29sdW1uIG5hbWUgb2YgdGhlIHRhYmxlIHNlbGVjdGVkLCB0byByZXRyaWV2ZSB0aGUgdmFsdWVzIGZvciB0aGF0Ci1jb2x1bW4uCi0qIEEgdGVybSwgd2hpY2ggaXMgdXN1YWxseSB1c2VkIG5lc3RlZCBpbnNpZGUgb3RoZXIgc2VsZWN0b3JzIGxpa2UKLWZ1bmN0aW9ucyAoaWYgYSB0ZXJtIGlzIHNlbGVjdGVkIGRpcmVjdGx5LCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGNvbHVtbgotb2YgdGhlIHJlc3VsdC1zZXQgd2lsbCBzaW1wbHkgaGF2ZSB0aGUgdmFsdWUgb2YgdGhpcyB0ZXJtIGZvciBldmVyeSByb3cKLXJldHVybmVkKS4KLSogQSBjYXN0aW5nLCB3aGljaCBhbGxvd3MgdG8gY29udmVydCBhIG5lc3RlZCBzZWxlY3RvciB0byBhIChjb21wYXRpYmxlKQotdHlwZS4KLSogQSBmdW5jdGlvbiBjYWxsLCB3aGVyZSB0aGUgYXJndW1lbnRzIGFyZSBzZWxlY3RvciB0aGVtc2VsdmVzLiBTZWUgdGhlCi1zZWN0aW9uIG9uIHhyZWY6Y3FsL2Z1bmN0aW9ucy5hZG9jI2NxbC1mdW5jdGlvbnNbZnVuY3Rpb25zXSBmb3IgbW9yZSBkZXRhaWxzLgotKiBUaGUgc3BlY2lhbCBjYWxsIGBDT1VOVCgqKWAgdG8gdGhlIHhyZWY6Y3FsL2Z1bmN0aW9ucy5hZG9jI2NvdW50LWZ1bmN0aW9uW0NPVU5UIGZ1bmN0aW9uXSwKLXdoaWNoIGNvdW50cyBhbGwgbm9uLW51bGwgcmVzdWx0cy4KLQotPT09PSBBbGlhc2VzCi0KLUV2ZXJ5IF90b3AtbGV2ZWxfIHNlbGVjdG9yIGNhbiBhbHNvIGJlIGFsaWFzZWQgKHVzaW5nIEFTKS4KLUlmIHNvLCB0aGUgbmFtZSBvZiB0aGUgY29ycmVzcG9uZGluZyBjb2x1bW4gaW4gdGhlIHJlc3VsdCBzZXQgd2lsbCBiZQotdGhhdCBvZiB0aGUgYWxpYXMuIEZvciBpbnN0YW5jZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9hcy5jcWxbXQotLS0tLQotCi1bTk9URV0KLT09PT0KLUN1cnJlbnRseSwgYWxpYXNlcyBhcmVuJ3QgcmVjb2duaXplZCBpbiB0aGUgYFdIRVJFYCBvciBgT1JERVIgQllgIGNsYXVzZXMgaW4gdGhlIHN0YXRlbWVudC4KLVlvdSBtdXN0IHVzZSB0aGUgb3JpZ25hbCBjb2x1bW4gbmFtZSBpbnN0ZWFkLgotPT09PQotCi1bW3dyaXRldGltZS1hbmQtdHRsLWZ1bmN0aW9uXV0KLT09PT0gYFdSSVRFVElNRWAgYW5kIGBUVExgIGZ1bmN0aW9uCi0KLVNlbGVjdGlvbiBzdXBwb3J0cyB0d28gc3BlY2lhbCBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QgYWxsb3dlZCBhbnl3aGVyZQotZWxzZTogYFdSSVRFVElNRWAgYW5kIGBUVExgLiAKLUJvdGggZnVuY3Rpb25zIHRha2Ugb25seSBvbmUgYXJndW1lbnQsIGEgY29sdW1uIG5hbWUuCi1UaGVzZSBmdW5jdGlvbnMgcmV0cmlldmUgbWV0YS1pbmZvcm1hdGlvbiB0aGF0IGlzIHN0b3JlZCBpbnRlcm5hbGx5IGZvciBlYWNoIGNvbHVtbjoKLQotKiBgV1JJVEVUSU1FYCBzdG9yZXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbgotKiBgVFRMYCBzdG9yZXMgdGhlIHJlbWFpbmluZyB0aW1lIHRvIGxpdmUgKGluIHNlY29uZHMpIGZvciB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbiBpZiBpdCBpcyBzZXQgdG8gZXhwaXJlOyBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIGBudWxsYC4KLQotVGhlIGBXUklURVRJTUVgIGFuZCBgVFRMYCBmdW5jdGlvbnMgY2FuJ3QgYmUgdXNlZCBvbiBtdWx0aS1jZWxsIGNvbHVtbnMgc3VjaCBhcyBub24tZnJvemVuCi1jb2xsZWN0aW9ucyBvciBub24tZnJvemVuIHVzZXItZGVmaW5lZCB0eXBlcy4KLQotW1t3aGVyZS1jbGF1c2VdXQotPT09IFRoZSBgV0hFUkVgIGNsYXVzZQotCi1UaGUgYFdIRVJFYCBjbGF1c2Ugc3BlY2lmaWVzIHdoaWNoIHJvd3MgYXJlIHF1ZXJpZWQuIEl0IHNwZWNpZmllcwotYSByZWxhdGlvbnNoaXAgZm9yIGBQUklNQVJZIEtFWWAgY29sdW1ucyBvciBhIGNvbHVtbiB0aGF0IGhhcwotYSB4cmVmOmNxbC9pbmRleGVzLmFkb2MjY3JlYXRlLWluZGV4LXN0YXRlbWVudFtzZWNvbmRhcnkgaW5kZXhdIGRlZmluZWQsIGFsb25nIHdpdGggYSBzZXQgdmFsdWUuCi0KLU5vdCBhbGwgcmVsYXRpb25zaGlwcyBhcmUgYWxsb3dlZCBpbiBhIHF1ZXJ5LiBGb3IgaW5zdGFuY2UsIG9ubHkgYW4gZXF1YWxpdHkKLWlzIGFsbG93ZWQgb24gYSBwYXJ0aXRpb24ga2V5LiBUaGUgYElOYCBjbGF1c2UgaXMgY29uc2lkZXJlZCBhbiBlcXVhbGl0eSBmb3Igb25lIG9yIG1vcmUgdmFsdWVzLgotVGhlIGBUT0tFTmAgY2xhdXNlIGNhbiBiZSB1c2VkIHRvIHF1ZXJ5IGZvciBwYXJ0aXRpb24ga2V5IG5vbi1lcXVhbGl0aWVzLgotQSBwYXJ0aXRpb24ga2V5IG11c3QgYmUgc3BlY2lmaWVkIGJlZm9yZSBjbHVzdGVyaW5nIGNvbHVtbnMgaW4gdGhlIGBXSEVSRWAgY2xhdXNlLiBUaGUgcmVsYXRpb25zaGlwIAotZm9yIGNsdXN0ZXJpbmcgY29sdW1ucyBtdXN0IHNwZWNpZnkgYSAqY29udGlndW91cyogc2V0IG9mIHJvd3MgdG8gb3JkZXIuCi0KLUZvciBpbnN0YW5jZSwgZ2l2ZW46Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvdGFibGVfZm9yX3doZXJlLmNxbFtdCi0tLS0tCi0KLVRoZSBmb2xsb3dpbmcgcXVlcnkgaXMgYWxsb3dlZDoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC93aGVyZS5jcWxbXQotLS0tLQotCi1CdXQgdGhlIGZvbGxvd2luZyBvbmUgaXMgbm90LCBhcyBpdCBkb2VzIG5vdCBzZWxlY3QgYSBjb250aWd1b3VzIHNldCBvZgotcm93cyAoYW5kIHdlIHN1cHBvc2Ugbm8gc2Vjb25kYXJ5IGluZGV4ZXMgYXJlIHNldCk6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvd2hlcmVfZmFpbC5jcWxbXQotLS0tLQotCi1XaGVuIHNwZWNpZnlpbmcgcmVsYXRpb25zaGlwcywgdGhlIGBUT0tFTmAgZnVuY3Rpb24gY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGBQQVJUSVRJT04gS0VZYCBjb2x1bW4gdG8gcXVlcnkuIAotUm93cyB3aWxsIGJlIHNlbGVjdGVkIGJhc2VkIG9uIHRoZSB0b2tlbiBvZiB0aGUgYFBBUlRJVElPTl9LRVlgIHJhdGhlciB0aGFuIG9uIHRoZSB2YWx1ZS4KLVtJTVBPUlRBTlRdCi09PT09Ci1UaGUgdG9rZW4gb2YgYSBrZXkgZGVwZW5kcyBvbiB0aGUgcGFydGl0aW9uZXIgaW4gdXNlLCBhbmQgdGhhdAotaW4gcGFydGljdWxhciB0aGUgYFJhbmRvbVBhcnRpdGlvbmVyYCB3b24ndCB5aWVsZCBhIG1lYW5pbmdmdWwgb3JkZXIuIAotQWxzbyBub3RlIHRoYXQgb3JkZXJpbmcgcGFydGl0aW9uZXJzIGFsd2F5cyBvcmRlciB0b2tlbiB2YWx1ZXMgYnkgYnl0ZXMgKHNvCi1ldmVuIGlmIHRoZSBwYXJ0aXRpb24ga2V5IGlzIG9mIHR5cGUgaW50LCBgdG9rZW4oLTEpID4gdG9rZW4oMClgIGluCi1wYXJ0aWN1bGFyKS4gCi09PT09Ci0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3Rva2VuLmNxbFtdCi0tLS0tCi0KLVRoZSBgSU5gIHJlbGF0aW9uc2hpcCBpcyBvbmx5IGFsbG93ZWQgb24gdGhlIGxhc3QgY29sdW1uIG9mIHRoZQotcGFydGl0aW9uIGtleSBvciBvbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlIGZ1bGwgcHJpbWFyeSBrZXkuCi0KLUl0IGlzIGFsc28gcG9zc2libGUgdG8g4oCcZ3JvdXDigJ0gYENMVVNURVJJTkcgQ09MVU1OU2AgdG9nZXRoZXIgaW4gYQotcmVsYXRpb24gdXNpbmcgdGhlIHR1cGxlIG5vdGF0aW9uLiAKLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvd2hlcmVfZ3JvdXBfY2x1c3Rlcl9jb2x1bW5zLmNxbFtdCi0tLS0tCi0KLVRoaXMgcXVlcnkgd2lsbCByZXR1cm4gYWxsIHJvd3MgdGhhdCBzb3J0IGFmdGVyIHRoZSBvbmUgaGF2aW5nIOKAnEpvaG4ncyBCbG9n4oCdIGFzCi1gYmxvZ190aWxlYCBhbmQgJzIwMTItMDEtMDEnIGZvciBgcG9zdGVkX2F0YCBpbiB0aGUgY2x1c3RlcmluZyBvcmRlci4gSW4KLXBhcnRpY3VsYXIsIHJvd3MgaGF2aW5nIGEgYHBvc3RfYXQgPD0gJzIwMTItMDEtMDEnYCB3aWxsIGJlIHJldHVybmVkLCBhcwotbG9uZyBhcyB0aGVpciBgYmxvZ190aXRsZSA+ICdKb2huJydzIEJsb2cnYC4gCi0KLVRoYXQgd291bGQgbm90IGJlIHRoZSBjYXNlIGZvciB0aGlzIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvd2hlcmVfbm9fZ3JvdXBfY2x1c3Rlcl9jb2x1bW5zLmNxbFtdCi0tLS0tCi0KLVRoZSB0dXBsZSBub3RhdGlvbiBtYXkgYWxzbyBiZSB1c2VkIGZvciBgSU5gIGNsYXVzZXMgb24gY2x1c3RlcmluZyBjb2x1bW5zOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3doZXJlX2luX3R1cGxlLmNxbFtdCi0tLS0tCi0KLVRoZSBgQ09OVEFJTlNgIG9wZXJhdG9yIG1heSBvbmx5IGJlIHVzZWQgZm9yIGNvbGxlY3Rpb24gY29sdW1ucyAobGlzdHMsCi1zZXRzLCBhbmQgbWFwcykuIEluIHRoZSBjYXNlIG9mIG1hcHMsIGBDT05UQUlOU2AgYXBwbGllcyB0byB0aGUgbWFwCi12YWx1ZXMuIFRoZSBgQ09OVEFJTlMgS0VZYCBvcGVyYXRvciBtYXkgb25seSBiZSB1c2VkIG9uIG1hcCBjb2x1bW5zIGFuZAotYXBwbGllcyB0byB0aGUgbWFwIGtleXMuCi0KLVtbZ3JvdXAtYnktY2xhdXNlXV0KLT09PSBHcm91cGluZyByZXN1bHRzCi0KLVRoZSBgR1JPVVAgQllgIG9wdGlvbiBjYW4gY29uZGVuc2UgYWxsIHNlbGVjdGVkCi1yb3dzIHRoYXQgc2hhcmUgdGhlIHNhbWUgdmFsdWVzIGZvciBhIHNldCBvZiBjb2x1bW5zIGludG8gYSBzaW5nbGUgcm93LgotCi1Vc2luZyB0aGUgYEdST1VQIEJZYCBvcHRpb24sIHJvd3MgY2FuIGJlIGdyb3VwZWQgYXQgdGhlIHBhcnRpdGlvbiBrZXkgb3IgY2x1c3RlcmluZyBjb2x1bW4gbGV2ZWwuIAotQ29uc2VxdWVudGx5LCB0aGUgYEdST1VQIEJZYCBvcHRpb24gb25seSBhY2NlcHRzIHByaW1hcnkga2V5IGNvbHVtbnMgaW4gZGVmaW5lZCBvcmRlciBhcyBhcmd1bWVudHMuCi1JZiBhIHByaW1hcnkga2V5IGNvbHVtbiBpcyByZXN0cmljdGVkIGJ5IGFuIGVxdWFsaXR5IHJlc3RyaWN0aW9uLCBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGBHUk9VUCBCWWAgY2xhdXNlLgotCi1BZ2dyZWdhdGUgZnVuY3Rpb25zIHdpbGwgcHJvZHVjZSBhIHNlcGFyYXRlIHZhbHVlIGZvciBlYWNoIGdyb3VwLiAKLUlmIG5vIGBHUk9VUCBCWWAgY2xhdXNlIGlzIHNwZWNpZmllZCwgYWdncmVnYXRlcyBmdW5jdGlvbnMgd2lsbCBwcm9kdWNlIGEgc2luZ2xlIHZhbHVlIGZvciBhbGwgdGhlIHJvd3MuCi0KLUlmIGEgY29sdW1uIGlzIHNlbGVjdGVkIHdpdGhvdXQgYW4gYWdncmVnYXRlIGZ1bmN0aW9uLCBpbiBhIHN0YXRlbWVudAotd2l0aCBhIGBHUk9VUCBCWWAsIHRoZSBmaXJzdCB2YWx1ZSBlbmNvdW50ZXIgaW4gZWFjaCBncm91cCB3aWxsIGJlCi1yZXR1cm5lZC4KLQotW1tvcmRlcmluZy1jbGF1c2VdXQotPT09IE9yZGVyaW5nIHJlc3VsdHMKLQotVGhlIGBPUkRFUiBCWWAgY2xhdXNlIHNlbGVjdHMgdGhlIG9yZGVyIG9mIHRoZSByZXR1cm5lZCByZXN1bHRzLiAKLVRoZSBhcmd1bWVudCBpcyBhIGxpc3Qgb2YgY29sdW1uIG5hbWVzIGFuZCBlYWNoIGNvbHVtbidzIG9yZGVyIAotKGBBU0NgIGZvciBhc2NlbmRhbnQgYW5kIGBERVNDYCBmb3IgZGVzY2VuZGFudCwKLVRoZSBwb3NzaWJsZSBvcmRlcmluZ3MgYXJlIGxpbWl0ZWQgYnkgdGhlIHhyZWY6Y3FsL2RkbC5hZG9jI2NsdXN0ZXJpbmctb3JkZXJbY2x1c3RlcmluZyBvcmRlcl0gZGVmaW5lZCBvbiB0aGUgdGFibGU6Ci0KLSogaWYgdGhlIHRhYmxlIGhhcyBiZWVuIGRlZmluZWQgd2l0aG91dCBhbnkgc3BlY2lmaWMgYENMVVNURVJJTkcgT1JERVJgLCB0aGVuIHRoZSBvcmRlciBpcyBhcyBkZWZpbmVkIGJ5IHRoZSBjbHVzdGVyaW5nIGNvbHVtbnMKLW9yIHRoZSByZXZlcnNlCi0qIG90aGVyd2lzZSwgdGhlIG9yZGVyIGlzIGRlZmluZWQgYnkgdGhlIGBDTFVTVEVSSU5HIE9SREVSYCBvcHRpb24gYW5kIHRoZSByZXZlcnNlZCBvbmUuCi0KLVtbbGltaXQtY2xhdXNlXV0KLT09PSBMaW1pdGluZyByZXN1bHRzCi0KLVRoZSBgTElNSVRgIG9wdGlvbiB0byBhIGBTRUxFQ1RgIHN0YXRlbWVudCBsaW1pdHMgdGhlIG51bWJlciBvZiByb3dzCi1yZXR1cm5lZCBieSBhIHF1ZXJ5LiBUaGUgYFBFUiBQQVJUSVRJT04gTElNSVRgIG9wdGlvbiBsaW1pdHMgdGhlCi1udW1iZXIgb2Ygcm93cyByZXR1cm5lZCBmb3IgYSBnaXZlbiBwYXJ0aXRpb24gYnkgdGhlIHF1ZXJ5LiBCb3RoIHR5cGVzIG9mIGxpbWl0cyBjYW4gdXNlZCBpbiB0aGUgc2FtZSBzdGF0ZW1lbnQuCi0KLVtbYWxsb3ctZmlsdGVyaW5nXV0KLT09PSBBbGxvd2luZyBmaWx0ZXJpbmcKLQotQnkgZGVmYXVsdCwgQ1FMIG9ubHkgYWxsb3dzIHNlbGVjdCBxdWVyaWVzIHRoYXQgZG9uJ3QgaW52b2x2ZSBhIGZ1bGwgc2NhbiBvZiBhbGwgcGFydGl0aW9ucy4gCi1JZiBhbGwgcGFydGl0aW9ucyBhcmUgc2Nhbm5lZCwgdGhlbiByZXR1cm5pbmcgdGhlIHJlc3VsdHMgbWF5IGV4cGVyaWVuY2UgYSBzaWduaWZpY2FudCBsYXRlbmN5IHByb3BvcnRpb25hbCB0byB0aGUgCi1hbW91bnQgb2YgZGF0YSBpbiB0aGUgdGFibGUuIFRoZSBgQUxMT1cgRklMVEVSSU5HYCBvcHRpb24gZXhwbGljaXRseSBleGVjdXRlcyBhIGZ1bGwgc2Nhbi4gVGh1cywgdGhlIHBlcmZvcm1hbmNlIG9mIAotdGhlIHF1ZXJ5IGNhbiBiZSB1bnByZWRpY3RhYmxlLgotCi1Gb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0YWJsZSBvZiB1c2VyIHByb2ZpbGVzIHdpdGggYmlydGggeWVhciBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuIAotVGhlIGJpcnRoIHllYXIgaGFzIGEgc2Vjb25kYXJ5IGluZGV4IGRlZmluZWQuCi0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvYWxsb3dfZmlsdGVyaW5nLmNxbFtdCi0tLS0tCi0KLVRoZSBmb2xsb3dpbmcgcXVlcmllcyBhcmUgdmFsaWQ6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvcXVlcnlfYWxsb3dfZmlsdGVyaW5nLmNxbFtdCi0tLS0tCi0KLUluIGJvdGggY2FzZXMsIHRoZSBxdWVyeSBwZXJmb3JtYW5jZSBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlIGFtb3VudCBvZiBkYXRhIHJldHVybmVkLiAKLVRoZSBmaXJzdCBxdWVyeSByZXR1cm5zIGFsbCByb3dzLCBiZWNhdXNlIGFsbCB1c2VycyBhcmUgc2VsZWN0ZWQuCi1UaGUgc2Vjb25kIHF1ZXJ5IHJldHVybnMgb25seSB0aGUgcm93cyBkZWZpbmVkIGJ5IHRoZSBzZWNvbmRhcnkgaW5kZXgsIGEgcGVyLW5vZGUgaW1wbGVtZW50YXRpb247IHRoZSByZXN1bHRzIHdpbGwKLWRlcGVuZCBvbiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBjbHVzdGVyLCBhbmQgaXMgaW5kaXJlY3RseSBwcm9wb3J0aW9uYWwgdG8gdGhlIGFtb3VudCBvZiBkYXRhIHN0b3JlZC4KLVRoZSBudW1iZXIgb2Ygbm9kZXMgd2lsbCBhbHdheXMgYmUgbXVsdGlwbGUgbnVtYmVyIG9mIG1hZ25pdHVkZSBsb3dlciB0aGFuIHRoZSBudW1iZXIgb2YgdXNlciBwcm9maWxlcyBzdG9yZWQuIAotQm90aCBxdWVyaWVzIG1heSByZXR1cm4gdmVyeSBsYXJnZSByZXN1bHQgc2V0cywgYnV0IHRoZSBhZGRpdGlvbiBvZiBhIGBMSU1JVGAgY2xhdXNlIGNhbiByZWR1Y2VkIHRoZSBsYXRlbmN5LgotCi1UaGUgZm9sbG93aW5nIHF1ZXJ5IHdpbGwgYmUgcmVqZWN0ZWQ6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvcXVlcnlfZmFpbF9hbGxvd19maWx0ZXJpbmcuY3FsW10KLS0tLS0KLQotQ2Fzc2FuZHJhIGNhbm5vdCBndWFyYW50ZWUgdGhhdCBsYXJnZSBhbW91bnRzIG9mIGRhdGEgd29uJ3QgaGF2ZSB0byBzY2FubmVkIGFtb3VudCBvZiBkYXRhLCBldmVuIGlmIHRoZSByZXN1bHQgaXMgc21hbGwuIAotSWYgeW91IGtub3cgdGhhdCB0aGUgZGF0YXNldCBpcyBzbWFsbCwgYW5kIHRoZSBwZXJmb3JtYW5jZSB3aWxsIGJlIHJlYXNvbmFibGUsIGFkZCBgQUxMT1cgRklMVEVSSU5HYCB0byBhbGxvdyB0aGUgcXVlcnkgdG8gCi1leGVjdXRlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3F1ZXJ5X25vZmFpbF9hbGxvd19maWx0ZXJpbmcuY3FsW10KLS0tLS0KLQotW1tpbnNlcnQtc3RhdGVtZW50XV0KLT09IElOU0VSVAotCi1JbnNlcnRpbmcgZGF0YSBmb3IgYSByb3cgaXMgZG9uZSB1c2luZyBhbiBgSU5TRVJUYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvaW5zZXJ0X3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9pbnNlcnRfc3RhdGVtZW50LmNxbFtdCi0tLS0tCi0KLVRoZSBgSU5TRVJUYCBzdGF0ZW1lbnQgd3JpdGVzIG9uZSBvciBtb3JlIGNvbHVtbnMgZm9yIGEgZ2l2ZW4gcm93IGluIGEKLXRhYmxlLiAKLVNpbmNlIGEgcm93IGlzIGlkZW50aWZpZWQgYnkgaXRzIGBQUklNQVJZIEtFWWAsIGF0IGxlYXN0IG9uZSBjb2x1bW5zIG11c3QgYmUgc3BlY2lmaWVkLiAKLVRoZSBsaXN0IG9mIGNvbHVtbnMgdG8gaW5zZXJ0IG11c3QgYmUgc3VwcGxpZWQgd2l0aCB0aGUgYFZBTFVFU2Agc3ludGF4LiAKLVdoZW4gdXNpbmcgdGhlIGBKU09OYCBzeW50YXgsIGBWQUxVRVNgIGFyZSBvcHRpb25hbC4gCi1TZWUgdGhlIHNlY3Rpb24gb24geHJlZjpjcWwvZG1sLmFkb2MjY3FsLWpzb25bSlNPTiBzdXBwb3J0XSBmb3IgbW9yZSBkZXRhaWwuCi1BbGwgdXBkYXRlcyBmb3IgYW4gYElOU0VSVGAgYXJlIGFwcGxpZWQgYXRvbWljYWxseSBhbmQgaW4gaXNvbGF0aW9uLgotCi1Vbmxpa2UgaW4gU1FMLCBgSU5TRVJUYCBkb2VzIG5vdCBjaGVjayB0aGUgcHJpb3IgZXhpc3RlbmNlIG9mIHRoZSByb3cgYnkgZGVmYXVsdC4gCi1UaGUgcm93IGlzIGNyZWF0ZWQgaWYgbm9uZSBleGlzdGVkIGJlZm9yZSwgYW5kIHVwZGF0ZWQgb3RoZXJ3aXNlLiAKLUZ1cnRoZXJtb3JlLCB0aGVyZSBpcyBubyBtZWFucyBvZiBrbm93aW5nIHdoaWNoIGFjdGlvbiBvY2N1cnJlZC4KLQotVGhlIGBJRiBOT1QgRVhJU1RTYCBjb25kaXRpb24gY2FuIHJlc3RyaWN0IHRoZSBpbnNlcnRpb24gaWYgdGhlIHJvdyBkb2VzIG5vdCBleGlzdC4gCi1Ib3dldmVyLCBub3RlIHRoYXQgdXNpbmcgYElGIE5PVCBFWElTVFNgIHdpbGwgaW5jdXIgYSBub24tbmVnbGlnaWJsZSBwZXJmb3JtYW5jZSBjb3N0LCBiZWNhdXNlIFBheG9zIGlzIHVzZWQsCi1zbyB0aGlzIHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseS4KLQotUGxlYXNlIHJlZmVyIHRvIHRoZSB4cmVmOmNxbC9kbWwuYWRvYyN1cGRhdGUtcGFyYW1ldGVyc1tVUERBVEVdIHNlY3Rpb24gZm9yIGluZm9ybWF0aW9ucyBvbiB0aGUgYHVwZGF0ZV9wYXJhbWV0ZXJgLgotQWxzbyBub3RlIHRoYXQgYElOU0VSVGAgZG9lcyBub3Qgc3VwcG9ydCBjb3VudGVycywgd2hpbGUgYFVQREFURWAgZG9lcy4KLQotW1t1cGRhdGUtc3RhdGVtZW50XV0KLT09IFVQREFURQotCi1VcGRhdGluZyBhIHJvdyBpcyBkb25lIHVzaW5nIGFuIGBVUERBVEVgIHN0YXRlbWVudDoKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvdXBkYXRlX3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi1Gb3IgaW5zdGFuY2U6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvdXBkYXRlX3N0YXRlbWVudC5jcWxbXQotLS0tLQotCi1UaGUgYFVQREFURWAgc3RhdGVtZW50IHdyaXRlcyBvbmUgb3IgbW9yZSBjb2x1bW5zIGZvciBhIGdpdmVuIHJvdyBpbiBhCi10YWJsZS4gCi1UaGUgYFdIRVJFYGNsYXVzZSBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcm93IHRvIHVwZGF0ZSBhbmQgbXVzdCBpbmNsdWRlIGFsbCBjb2x1bW5zIG9mIHRoZSBgUFJJTUFSWSBLRVlgLiAKLU5vbi1wcmltYXJ5IGtleSBjb2x1bW5zIGFyZSBzZXQgdXNpbmcgdGhlIGBTRVRgIGtleXdvcmQuCi1JbiBhbiBgVVBEQVRFYCBzdGF0ZW1lbnQsIGFsbCB1cGRhdGVzIHdpdGhpbiB0aGUgc2FtZSBwYXJ0aXRpb24ga2V5IGFyZSBhcHBsaWVkIGF0b21pY2FsbHkgYW5kIGluIGlzb2xhdGlvbi4KLQotVW5saWtlIGluIFNRTCwgYFVQREFURWAgZG9lcyBub3QgY2hlY2sgdGhlIHByaW9yIGV4aXN0ZW5jZSBvZiB0aGUgcm93IGJ5IGRlZmF1bHQuCi1UaGUgcm93IGlzIGNyZWF0ZWQgaWYgbm9uZSBleGlzdGVkIGJlZm9yZSwgYW5kIHVwZGF0ZWQgb3RoZXJ3aXNlLgotRnVydGhlcm1vcmUsIHRoZXJlIGlzIG5vIG1lYW5zIG9mIGtub3dpbmcgd2hpY2ggYWN0aW9uIG9jY3VycmVkLgotCi1UaGUgYElGYCBjb25kaXRpb24gY2FuIGJlIHVzZWQgdG8gY2hvb3NlIHdoZXRoZXIgdGhlIHJvdyBpcyB1cGRhdGVkIG9yIG5vdCBpZiBhIHBhcnRpY3VsYXIgY29uZGl0aW9uIGlzIG1ldC4KLUhvd2V2ZXIsIGxpa2UgdGhlIGBJRiBOT1QgRVhJU1RTYCBjb25kaXRpb24sIGEgbm9uLW5lZ2xpZ2libGUgcGVyZm9ybWFuY2UgY29zdCBjYW4gYmUgaW5jdXJyZWQuCi0KLVJlZ2FyZGluZyB0aGUgYFNFVGAgYXNzaWdubWVudDoKLQotKiBgYyA9IGMgKyAzYCB3aWxsIGluY3JlbWVudC9kZWNyZW1lbnQgY291bnRlcnMsIHRoZSBvbmx5IG9wZXJhdGlvbiBhbGxvd2VkLiAKLVRoZSBjb2x1bW4gbmFtZSBhZnRlciB0aGUgJz0nIHNpZ24gKm11c3QqIGJlIHRoZSBzYW1lIHRoYW4gdGhlIG9uZSBiZWZvcmUgdGhlICc9JyBzaWduLgotSW5jcmVtZW50L2RlY3JlbWVudCBpcyBvbmx5IGFsbG93ZWQgb24gY291bnRlcnMuIAotU2VlIHRoZSBzZWN0aW9uIG9uIHhyZWY6Y3FsL2RtbC5hZG9jI2NvdW50ZXJzW2NvdW50ZXJzXSBmb3IgZGV0YWlscy4KLSogYGlkID0gaWQgKyA8c29tZS1jb2xsZWN0aW9uPmAgYW5kIGBpZFt2YWx1ZTFdID0gdmFsdWUyYCBhcmUgZm9yIGNvbGxlY3Rpb25zLiAKLVNlZSB0aGUgeHJlZjpjcWwvdHlwZXMuYWRvYyNjb2xsZWN0aW9uc1tjb2xsZWN0aW9uc10gZm9yIGRldGFpbHMuICAKLSogYGlkLmZpZWxkID0gM2AgaXMgZm9yIHNldHRpbmcgdGhlIHZhbHVlIG9mIGEgZmllbGQgb24gYSBub24tZnJvemVuIHVzZXItZGVmaW5lZCB0eXBlcy4gCi1TZWUgdGhlIHhyZWY6Y3FsL3R5cGVzLmFkb2MjdWR0c1tVRFRzXSBmb3IgZGV0YWlscy4KLQotPT09IFVwZGF0ZSBwYXJhbWV0ZXJzCi0KLWBVUERBVEVgIGFuZCBgSU5TRVJUYCBzdGF0ZW1lbnRzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgotCi0qIGBUVExgOiBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVGltZSBUbyBMaXZlIChpbiBzZWNvbmRzKSBmb3IgdGhlCi1pbnNlcnRlZCB2YWx1ZXMuIElmIHNldCwgdGhlIGluc2VydGVkIHZhbHVlcyBhcmUgYXV0b21hdGljYWxseSByZW1vdmVkCi1mcm9tIHRoZSBkYXRhYmFzZSBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWUuIE5vdGUgdGhhdCB0aGUgVFRMIGNvbmNlcm5zCi10aGUgaW5zZXJ0ZWQgdmFsdWVzLCBub3QgdGhlIGNvbHVtbnMgdGhlbXNlbHZlcy4gVGhpcyBtZWFucyB0aGF0IGFueQotc3Vic2VxdWVudCB1cGRhdGUgb2YgdGhlIGNvbHVtbiB3aWxsIGFsc28gcmVzZXQgdGhlIFRUTCAodG8gd2hhdGV2ZXIgVFRMCi1pcyBzcGVjaWZpZWQgaW4gdGhhdCB1cGRhdGUpLiBCeSBkZWZhdWx0LCB2YWx1ZXMgbmV2ZXIgZXhwaXJlLiBBIFRUTCBvZgotMCBpcyBlcXVpdmFsZW50IHRvIG5vIFRUTC4gSWYgdGhlIHRhYmxlIGhhcyBhIGRlZmF1bHRfdGltZV90b19saXZlLCBhCi1UVEwgb2YgMCB3aWxsIHJlbW92ZSB0aGUgVFRMIGZvciB0aGUgaW5zZXJ0ZWQgb3IgdXBkYXRlZCB2YWx1ZXMuIEEgVFRMCi1vZiBgbnVsbGAgaXMgZXF1aXZhbGVudCB0byBpbnNlcnRpbmcgd2l0aCBhIFRUTCBvZiAwLgotCi1gVVBEQVRFYCwgYElOU0VSVGAsIGBERUxFVEVgIGFuZCBgQkFUQ0hgIHN0YXRlbWVudHMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6Ci0KLSogYFRJTUVTVEFNUGA6IHNldHMgdGhlIHRpbWVzdGFtcCBmb3IgdGhlIG9wZXJhdGlvbi4gSWYgbm90IHNwZWNpZmllZCwKLXRoZSBjb29yZGluYXRvciB3aWxsIHVzZSB0aGUgY3VycmVudCB0aW1lIChpbiBtaWNyb3NlY29uZHMpIGF0IHRoZSBzdGFydAotb2Ygc3RhdGVtZW50IGV4ZWN1dGlvbiBhcyB0aGUgdGltZXN0YW1wLiBUaGlzIGlzIHVzdWFsbHkgYSBzdWl0YWJsZQotZGVmYXVsdC4KLQotW1tkZWxldGVfc3RhdGVtZW50XV0KLT09IERFTEVURQotCi1EZWxldGluZyByb3dzIG9yIHBhcnRzIG9mIHJvd3MgdXNlcyB0aGUgYERFTEVURWAgc3RhdGVtZW50OgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2RlbGV0ZV9zdGF0ZW1lbnQuYm5mW10KLS0tLS0KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvZGVsZXRlX3N0YXRlbWVudC5jcWxbXQotLS0tLQotCi1UaGUgYERFTEVURWAgc3RhdGVtZW50IGRlbGV0ZXMgY29sdW1ucyBhbmQgcm93cy4gSWYgY29sdW1uIG5hbWVzIGFyZQotcHJvdmlkZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIGBERUxFVEVgIGtleXdvcmQsIG9ubHkgdGhvc2UgY29sdW1ucyBhcmUKLWRlbGV0ZWQgZnJvbSB0aGUgcm93IGluZGljYXRlZCBieSB0aGUgYFdIRVJFYCBjbGF1c2UuIE90aGVyd2lzZSwgd2hvbGUKLXJvd3MgYXJlIHJlbW92ZWQuCi0KLVRoZSBgV0hFUkVgIGNsYXVzZSBzcGVjaWZpZXMgd2hpY2ggcm93cyBhcmUgdG8gYmUgZGVsZXRlZC4gTXVsdGlwbGUgcm93cwotbWF5IGJlIGRlbGV0ZWQgd2l0aCBvbmUgc3RhdGVtZW50IGJ5IHVzaW5nIGFuIGBJTmAgb3BlcmF0b3IuIEEgcmFuZ2Ugb2YKLXJvd3MgbWF5IGJlIGRlbGV0ZWQgdXNpbmcgYW4gaW5lcXVhbGl0eSBvcGVyYXRvciAoc3VjaCBhcyBgPj1gKS4KLQotYERFTEVURWAgc3VwcG9ydHMgdGhlIGBUSU1FU1RBTVBgIG9wdGlvbiB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyBhcyBpbgoteHJlZjpjcWwvZG1sLmFkb2MjdXBkYXRlLXBhcmFtZXRlcnNbdXBkYXRlc10uCi0KLUluIGEgYERFTEVURWAgc3RhdGVtZW50LCBhbGwgZGVsZXRpb25zIHdpdGhpbiB0aGUgc2FtZSBwYXJ0aXRpb24ga2V5IGFyZQotYXBwbGllZCBhdG9taWNhbGx5IGFuZCBpbiBpc29sYXRpb24uCi0KLUEgYERFTEVURWAgb3BlcmF0aW9uIGNhbiBiZSBjb25kaXRpb25hbCB0aHJvdWdoIHRoZSB1c2Ugb2YgYW4gYElGYAotY2xhdXNlLCBzaW1pbGFyIHRvIGBVUERBVEVgIGFuZCBgSU5TRVJUYCBzdGF0ZW1lbnRzLiBIb3dldmVyLCBhcyB3aXRoCi1gSU5TRVJUYCBhbmQgYFVQREFURWAgc3RhdGVtZW50cywgdGhpcyB3aWxsIGluY3VyIGEgbm9uLW5lZ2xpZ2libGUKLXBlcmZvcm1hbmNlIGNvc3QgYmVjYXVzZSBQYXhvcyBpcyB1c2VkLCBhbmQgc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5LgotCi1bW2JhdGNoX3N0YXRlbWVudF1dCi09PSBCQVRDSAotCi1NdWx0aXBsZSBgSU5TRVJUYCwgYFVQREFURWAgYW5kIGBERUxFVEVgIGNhbiBiZSBleGVjdXRlZCBpbiBhIHNpbmdsZQotc3RhdGVtZW50IGJ5IGdyb3VwaW5nIHRoZW0gdGhyb3VnaCBhIGBCQVRDSGAgc3RhdGVtZW50OgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9iYXRjaF9zdGF0ZW1lbnQuYm5mW10KLS0tLS0KLQotRm9yIGluc3RhbmNlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2JhdGNoX3N0YXRlbWVudC5jcWxbXQotLS0tLQotCi1UaGUgYEJBVENIYCBzdGF0ZW1lbnQgZ3JvdXAgbXVsdGlwbGUgbW9kaWZpY2F0aW9uIHN0YXRlbWVudHMKLShpbnNlcnRpb25zL3VwZGF0ZXMgYW5kIGRlbGV0aW9ucykgaW50byBhIHNpbmdsZSBzdGF0ZW1lbnQuIEl0IHNlcnZlcwotc2V2ZXJhbCBwdXJwb3NlczoKLQotKiBJdCBzYXZlcyBuZXR3b3JrIHJvdW5kLXRyaXBzIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciAoYW5kCi1zb21ldGltZXMgYmV0d2VlbiB0aGUgc2VydmVyIGNvb3JkaW5hdG9yIGFuZCB0aGUgcmVwbGljYXMpIHdoZW4gYmF0Y2hpbmcKLW11bHRpcGxlIHVwZGF0ZXMuCi0qIEFsbCB1cGRhdGVzIGluIGEgYEJBVENIYCBiZWxvbmdpbmcgdG8gYSBnaXZlbiBwYXJ0aXRpb24ga2V5IGFyZQotcGVyZm9ybWVkIGluIGlzb2xhdGlvbi4KLSogQnkgZGVmYXVsdCwgYWxsIG9wZXJhdGlvbnMgaW4gdGhlIGJhdGNoIGFyZSBwZXJmb3JtZWQgYXMgX2xvZ2dlZF8sIHRvCi1lbnN1cmUgYWxsIG11dGF0aW9ucyBldmVudHVhbGx5IGNvbXBsZXRlIChvciBub25lIHdpbGwpLiBTZWUgdGhlIG5vdGVzCi1vbiB4cmVmOmNxbC9kbWwuYWRvYyN1bmxvZ2dlZC1iYXRjaGVzW1VOTE9HR0VEIGJhdGNoZXNdIGZvciBtb3JlIGRldGFpbHMuCi0KLU5vdGUgdGhhdDoKLQotKiBgQkFUQ0hgIHN0YXRlbWVudHMgbWF5IG9ubHkgY29udGFpbiBgVVBEQVRFYCwgYElOU0VSVGAgYW5kIGBERUxFVEVgCi1zdGF0ZW1lbnRzIChub3Qgb3RoZXIgYmF0Y2hlcyBmb3IgaW5zdGFuY2UpLgotKiBCYXRjaGVzIGFyZSBfbm90XyBhIGZ1bGwgYW5hbG9ndWUgZm9yIFNRTCB0cmFuc2FjdGlvbnMuCi0qIElmIGEgdGltZXN0YW1wIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGVhY2ggb3BlcmF0aW9uLCB0aGVuIGFsbAotb3BlcmF0aW9ucyB3aWxsIGJlIGFwcGxpZWQgd2l0aCB0aGUgc2FtZSB0aW1lc3RhbXAgKGVpdGhlciBvbmUgZ2VuZXJhdGVkCi1hdXRvbWF0aWNhbGx5LCBvciB0aGUgdGltZXN0YW1wIHByb3ZpZGVkIGF0IHRoZSBiYXRjaCBsZXZlbCkuIER1ZSB0bwotQ2Fzc2FuZHJhJ3MgY29uZmxpY3QgcmVzb2x1dGlvbiBwcm9jZWR1cmUgaW4gdGhlIGNhc2Ugb2YKLWh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvY2Fzc2FuZHJhL0ZBUSNjbG9ja3RpZVt0aW1lc3RhbXAgdGllc10sCi1vcGVyYXRpb25zIG1heSBiZSBhcHBsaWVkIGluIGFuIG9yZGVyIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9yZGVyCi10aGV5IGFyZSBsaXN0ZWQgaW4gdGhlIGBCQVRDSGAgc3RhdGVtZW50LiBUbyBmb3JjZSBhIHBhcnRpY3VsYXIKLW9wZXJhdGlvbiBvcmRlcmluZywgeW91IG11c3Qgc3BlY2lmeSBwZXItb3BlcmF0aW9uIHRpbWVzdGFtcHMuCi0qIEEgTE9HR0VEIGJhdGNoIHRvIGEgc2luZ2xlIHBhcnRpdGlvbiB3aWxsIGJlIGNvbnZlcnRlZCB0byBhbiBVTkxPR0dFRAotYmF0Y2ggYXMgYW4gb3B0aW1pemF0aW9uLgotCi1bW3VubG9nZ2VkLWJhdGNoZXNdXQotPT09IGBVTkxPR0dFRGAgYmF0Y2hlcwotCi1CeSBkZWZhdWx0LCBDYXNzYW5kcmEgdXNlcyBhIGJhdGNoIGxvZyB0byBlbnN1cmUgYWxsIG9wZXJhdGlvbnMgaW4gYQotYmF0Y2ggZXZlbnR1YWxseSBjb21wbGV0ZSBvciBub25lIHdpbGwgKG5vdGUgaG93ZXZlciB0aGF0IG9wZXJhdGlvbnMgYXJlCi1vbmx5IGlzb2xhdGVkIHdpdGhpbiBhIHNpbmdsZSBwYXJ0aXRpb24pLgotCi1UaGVyZSBpcyBhIHBlcmZvcm1hbmNlIHBlbmFsdHkgZm9yIGJhdGNoIGF0b21pY2l0eSB3aGVuIGEgYmF0Y2ggc3BhbnMKLW11bHRpcGxlIHBhcnRpdGlvbnMuIElmIHlvdSBkbyBub3Qgd2FudCB0byBpbmN1ciB0aGlzIHBlbmFsdHksIHlvdSBjYW4KLXRlbGwgQ2Fzc2FuZHJhIHRvIHNraXAgdGhlIGJhdGNobG9nIHdpdGggdGhlIGBVTkxPR0dFRGAgb3B0aW9uLiBJZiB0aGUKLWBVTkxPR0dFRGAgb3B0aW9uIGlzIHVzZWQsIGEgZmFpbGVkIGJhdGNoIG1pZ2h0IGxlYXZlIHRoZSBwYXRjaCBvbmx5Ci1wYXJ0bHkgYXBwbGllZC4KLQotPT09IGBDT1VOVEVSYCBiYXRjaGVzCi0KLVVzZSB0aGUgYENPVU5URVJgIG9wdGlvbiBmb3IgYmF0Y2hlZCBjb3VudGVyIHVwZGF0ZXMuIFVubGlrZSBvdGhlcgotdXBkYXRlcyBpbiBDYXNzYW5kcmEsIGNvdW50ZXIgdXBkYXRlcyBhcmUgbm90IGlkZW1wb3RlbnQuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2Z1bmN0aW9ucy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9mdW5jdGlvbnMuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0MzlhMy4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2Z1bmN0aW9ucy5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsNTEyICswLDAgQEAKLS8vIE5lZWQgc29tZSBpbnRybyBmb3IgVURGIGFuZCBuYXRpdmUgZnVuY3Rpb25zIGluIGdlbmVyYWwgYW5kIHBvaW50IHRob3NlIHRvIGl0LiAgCi0vLyBbW2NxbC1mdW5jdGlvbnNdXVtbbmF0aXZlLWZ1bmN0aW9uc11dIAotCi09PSBGdW5jdGlvbnMKLQotQ1FMIHN1cHBvcnRzIDIgbWFpbiBjYXRlZ29yaWVzIG9mIGZ1bmN0aW9uczoKLQotKiB4cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyNzY2FsYXItZnVuY3Rpb25zW3NjYWxhciBmdW5jdGlvbnNdIHRoYXQgdGFrZSBhIG51bWJlciBvZiB2YWx1ZXMgYW5kIHByb2R1Y2UgYW4gb3V0cHV0Ci0qIHhyZWY6Y3FsL2Z1bmN0aW9ucy5hZG9jI2FnZ3JlZ2F0ZS1mdW5jdGlvbnNbYWdncmVnYXRlIGZ1bmN0aW9uc10gdGhhdCBhZ2dyZWdhdGUgbXVsdGlwbGUgcm93cyByZXN1bHRpbmcgZnJvbSBhIGBTRUxFQ1RgIHN0YXRlbWVudAotCi1JbiBib3RoIGNhc2VzLCBDUUwgcHJvdmlkZXMgYSBudW1iZXIgb2YgbmF0aXZlICJoYXJkLWNvZGVkIiBmdW5jdGlvbnMgYXMKLXdlbGwgYXMgdGhlIGFiaWxpdHkgdG8gY3JlYXRlIG5ldyB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLgotCi1bTk9URV0KLS5Ob3RlCi09PT09Ci1CeSBkZWZhdWx0LCB0aGUgdXNlIG9mIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBmb3IKLXNlY3VyaXR5IGNvbmNlcm5zIChldmVuIHdoZW4gZW5hYmxlZCwgdGhlIGV4ZWN1dGlvbiBvZiB1c2VyLWRlZmluZWQKLWZ1bmN0aW9ucyBpcyBzYW5kYm94ZWQgYW5kIGEgInJvZ3VlIiBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGFsbG93ZWQgdG8KLWRvIGV2aWwsIGJ1dCBubyBzYW5kYm94IGlzIHBlcmZlY3Qgc28gdXNpbmcgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBpcwotb3B0LWluKS4gU2VlIHRoZSBgdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkYCBpbiBgY2Fzc2FuZHJhLnlhbWxgIHRvCi1lbmFibGUgdGhlbS4KLT09PT0KLQotQSBmdW5jdGlvbiBpcyBpZGVudGlmaWVyIGJ5IGl0cyBuYW1lOgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9mdW5jdGlvbi5ibmZbXQotLS0tLQotCi09PT0gU2NhbGFyIGZ1bmN0aW9ucwotCi1bW3NjYWxhci1uYXRpdmUtZnVuY3Rpb25zXV0KLT09PT0gTmF0aXZlIGZ1bmN0aW9ucwotCi09PT09PSBDYXN0Ci0KLVRoZSBgY2FzdGAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29udmVydHMgb25lIG5hdGl2ZSBkYXRhdHlwZSB0bwotYW5vdGhlci4KLQotVGhlIGZvbGxvd2luZyB0YWJsZSBkZXNjcmliZXMgdGhlIGNvbnZlcnNpb25zIHN1cHBvcnRlZCBieSB0aGUgYGNhc3RgCi1mdW5jdGlvbi4gQ2Fzc2FuZHJhIHdpbGwgc2lsZW50bHkgaWdub3JlIGFueSBjYXN0IGNvbnZlcnRpbmcgYSBkYXRhdHlwZQotaW50byBpdHMgb3duIGRhdGF0eXBlLgotCi1bY29scz0iLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18RnJvbSB8VG8KLQotfCBgYXNjaWlgIHwgYHRleHRgLCBgdmFyY2hhcmAKLQotfCBgYmlnaW50YCB8IGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBmbG9hdGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsIGB2YXJpbnRgLAotYHRleHRgLCBgdmFyY2hhcmAKLQotfCBgYm9vbGVhbmAgfCBgdGV4dGAsIGB2YXJjaGFyYAotCi18IGBjb3VudGVyYCB8IGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwgYGRlY2ltYWxgLAotYHZhcmludGAsIGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXwgYGRhdGVgIHwgYHRpbWVzdGFtcGAKLQotfCBgZGVjaW1hbGAgfCBgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGB2YXJpbnRgLAotYHRleHRgLCBgdmFyY2hhcmAKLQotfCBgZG91YmxlYCB8IGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZGVjaW1hbGAsIGB2YXJpbnRgLAotYHRleHRgLCBgdmFyY2hhcmAKLQotfCBgZmxvYXRgIHwgYHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsIGB2YXJpbnRgLAotYHRleHRgLCBgdmFyY2hhcmAKLQotfCBgaW5ldGAgfCBgdGV4dGAsIGB2YXJjaGFyYAotCi18IGBpbnRgIHwgYHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwgYHZhcmludGAsCi1gdGV4dGAsIGB2YXJjaGFyYAotCi18IGBzbWFsbGludGAgfCBgdGlueWludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwgYHZhcmludGAsCi1gdGV4dGAsIGB2YXJjaGFyYAotCi18IGB0aW1lYCB8IGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXwgYHRpbWVzdGFtcGAgfCBgZGF0ZWAsIGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXwgYHRpbWV1dWlkYCB8IGB0aW1lc3RhbXBgLCBgZGF0ZWAsIGB0ZXh0YCwgYHZhcmNoYXJgCi0KLXwgYHRpbnlpbnRgIHwgYHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsCi1gdmFyaW50YCwgYHRleHRgLCBgdmFyY2hhcmAKLQotfCBgdXVpZGAgfCBgdGV4dGAsIGB2YXJjaGFyYAotCi18IGB2YXJpbnRgIHwgYHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsCi1gdGV4dGAsIGB2YXJjaGFyYAotfD09PQotCi1UaGUgY29udmVyc2lvbnMgcmVseSBzdHJpY3RseSBvbiBKYXZhJ3Mgc2VtYW50aWNzLiBGb3IgZXhhbXBsZSwgdGhlCi1kb3VibGUgdmFsdWUgMSB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgdGV4dCB2YWx1ZSAnMS4wJy4gRm9yIGluc3RhbmNlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLVNFTEVDVCBhdmcoY2FzdChjb3VudCBhcyBkb3VibGUpKSBGUk9NIG15VGFibGUKLS0tLS0KLQotPT09PT0gVG9rZW4KLQotVGhlIGB0b2tlbmAgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHRva2VuIGZvciBhIGdpdmVuIHBhcnRpdGlvbiBrZXkuIAotVGhlIGV4YWN0IHNpZ25hdHVyZSBvZiB0aGUgdG9rZW4gZnVuY3Rpb24gZGVwZW5kcyBvbiB0aGUgdGFibGUgY29uY2VybmVkIGFuZCB0aGUgcGFydGl0aW9uZXIgdXNlZCBieSB0aGUgY2x1c3Rlci4KLQotVGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50cyBvZiB0aGUgYHRva2VuYCBkZXBlbmQgb24gdGhlIHBhcnRpdGlvbiBrZXkgY29sdW1uIHR5cGUuIFRoZSByZXR1cm5lZCB0eXBlIGRlcGVuZHMgb24gdGhlIGRlZmluZWQgcGFydGl0aW9uZXI6Ci0KLVtjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxQYXJ0aXRpb25lciB8IFJldHVybmVkIHR5cGUKLXwgTXVybXVyM1BhcnRpdGlvbmVyIHwgYGJpZ2ludGAKLXwgUmFuZG9tUGFydGl0aW9uZXIgfCBgdmFyaW50YAotfCBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyIHwgYGJsb2JgCi18PT09Ci0KLUZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIHRhYmxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV90YWJsZV9zaW1wbGUuY3FsW10KLS0tLS0KLQotVGhlIHRhYmxlIHVzZXMgdGhlIGRlZmF1bHQgTXVybXVyM1BhcnRpdGlvbmVyLgotVGhlIGB0b2tlbmAgZnVuY3Rpb24gdXNlcyB0aGUgc2luZ2xlIGFyZ3VtZW50IGB0ZXh0YCwgYmVjYXVzZSB0aGUgcGFydGl0aW9uIGtleSBpcyBgdXNlcmlkYCBvZiB0ZXh0IHR5cGUuCi1UaGUgcmV0dXJuZWQgdHlwZSB3aWxsIGJlIGBiaWdpbnRgLgotCi09PT09PSBVdWlkCi0KLVRoZSBgdXVpZGAgZnVuY3Rpb24gdGFrZXMgbm8gcGFyYW1ldGVycyBhbmQgZ2VuZXJhdGVzIGEgcmFuZG9tIHR5cGUgNAotdXVpZCBzdWl0YWJsZSBmb3IgdXNlIGluIGBJTlNFUlRgIG9yIGBVUERBVEVgIHN0YXRlbWVudHMuCi0KLT09PT09IFRpbWV1dWlkIGZ1bmN0aW9ucwotCi09PT09PT0gYG5vd2AKLQotVGhlIGBub3dgIGZ1bmN0aW9uIHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgZ2VuZXJhdGVzLCBvbiB0aGUgY29vcmRpbmF0b3IKLW5vZGUsIGEgbmV3IHVuaXF1ZSB0aW1ldXVpZCBhdCB0aGUgdGltZSB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZC4gTm90ZQotdGhhdCB0aGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGluc2VydGlvbiBidXQgaXMgbGFyZ2VseSBub24tc2Vuc2ljYWwgaW4KLWBXSEVSRWAgY2xhdXNlcy4gCi0KLUZvciBleGFtcGxlLCBhIHF1ZXJ5IG9mIHRoZSBmb3JtOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3RpbWV1dWlkX25vdy5jcWxbXQotLS0tLQotCi13aWxsIG5vdCByZXR1cm4gYSByZXN1bHQsIGJ5IGRlc2lnbiwgc2luY2UgdGhlIHZhbHVlIHJldHVybmVkIGJ5Ci1gbm93KClgIGlzIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlLgotCi1gY3VycmVudFRpbWVVVUlEYCBpcyBhbiBhbGlhcyBvZiBgbm93YC4KLQotPT09PT09IGBtaW5UaW1ldXVpZGAgYW5kIGBtYXhUaW1ldXVpZGAKLQotVGhlIGBtaW5UaW1ldXVpZGAgZnVuY3Rpb24gdGFrZXMgYSBgdGltZXN0YW1wYCB2YWx1ZSBgdGAsIGVpdGhlciBhIHRpbWVzdGFtcCBvciBhIGRhdGUgc3RyaW5nLgotSXQgcmV0dXJucyBhIF9mYWtlXyBgdGltZXV1aWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIF9zbWFsbGVzdF8gcG9zc2libGUgYHRpbWV1dWlkYCBmb3IgdGltZXN0YW1wIGB0YC4gCi1UaGUgYG1heFRpbWV1dWlkYCB3b3JrcyBzaW1pbGFybHksIGJ1dCByZXR1cm5zIHRoZSBfbGFyZ2VzdF8gcG9zc2libGUgYHRpbWV1dWlkYC4KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvdGltZXV1aWRfbWluX21heC5jcWxbXQotLS0tLQotCi13aWxsIHNlbGVjdCBhbGwgcm93cyB3aGVyZSB0aGUgYHRpbWV1dWlkYCBjb2x1bW4gYHRgIGlzIGxhdGVyIHRoYW4gYCcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnYCBhbmQgZWFybGllciB0aGFuIGAnMjAxMy0wMi0wMiAxMDowMCswMDAwJ2AuIAotVGhlIGNsYXVzZSBgdCA+PSBtYXhUaW1ldXVpZCgnMjAxMy0wMS0wMSAwMDowNSswMDAwJylgIHdvdWxkIHN0aWxsIF9ub3RfIHNlbGVjdCBhIGB0aW1ldXVpZGAgZ2VuZXJhdGVkIGV4YWN0bHkgYXQgJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCcsIGFuZCBpcyBlc3NlbnRpYWxseSBlcXVpdmFsZW50IHRvIGB0ID4gbWF4VGltZXV1aWQoJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCcpYC4KLQotW05PVEVdCi0uTm90ZQotPT09PQotVGhlIHZhbHVlcyBnZW5lcmF0ZWQgYnkgYG1pblRpbWV1dWlkYCBhbmQgYG1heFRpbWV1dWlkYCBhcmUgY2FsbGVkIF9mYWtlXyBVVUlEIGJlY2F1c2UgdGhleSBkbyBubyByZXNwZWN0IHRoZSB0aW1lLWJhc2VkIFVVSUQgZ2VuZXJhdGlvbiBwcm9jZXNzCi1zcGVjaWZpZWQgYnkgdGhlIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQxMjIudHh0W0lFVEYgUkZDIDQxMjJdLiAKLUluIHBhcnRpY3VsYXIsIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGVzZSB0d28gbWV0aG9kcyB3aWxsIG5vdCBiZSB1bmlxdWUuCi1UaHVzLCBvbmx5IHVzZSB0aGVzZSBtZXRob2RzIGZvciAqcXVlcnlpbmcqLCBub3QgZm9yICppbnNlcnRpb24qLCB0byBwcmV2ZW50IHBvc3NpYmxlIGRhdGEgb3ZlcndyaXRpbmcuIAotPT09PQotCi09PT09PSBEYXRldGltZSBmdW5jdGlvbnMKLQotPT09PT09IFJldHJpZXZpbmcgdGhlIGN1cnJlbnQgZGF0ZS90aW1lCi0KLVRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBkYXRlL3RpbWUgYXQgdGhlCi10aW1lIHdoZXJlIHRoZSBmdW5jdGlvbiBpcyBpbnZva2VkOgotCi1bY29scz0iLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18RnVuY3Rpb24gbmFtZSB8T3V0cHV0IHR5cGUKLQotfCBgY3VycmVudFRpbWVzdGFtcGAgfCBgdGltZXN0YW1wYAotCi18IGBjdXJyZW50RGF0ZWAgfCBgZGF0ZWAKLQotfCBgY3VycmVudFRpbWVgIHwgYHRpbWVgCi0KLXwgYGN1cnJlbnRUaW1lVVVJRGAgfCBgdGltZVVVSURgCi18PT09Ci0KLUZvciBleGFtcGxlIHRoZSBsYXN0IHR3byBkYXlzIG9mIGRhdGEgY2FuIGJlIHJldHJpZXZlZCB1c2luZzoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9jdXJyZW50ZGF0ZS5jcWxbXQotLS0tLQotCi09PT09PT0gVGltZSBjb252ZXJzaW9uIGZ1bmN0aW9ucwotCi1BIG51bWJlciBvZiBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIHRvIGNvbnZlcnQgYSBgdGltZXV1aWRgLCBhIGB0aW1lc3RhbXBgIG9yIGEgYGRhdGVgIGludG8gYW5vdGhlciBgbmF0aXZlYCB0eXBlLgotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfEZ1bmN0aW9uIG5hbWUgfElucHV0IHR5cGUgfERlc2NyaXB0aW9uCi0KLXwgYHRvRGF0ZWAgfCBgdGltZXV1aWRgIHwgQ29udmVydHMgdGhlIGB0aW1ldXVpZGAgYXJndW1lbnQgaW50byBhIGBkYXRlYCB0eXBlCi0KLXwgYHRvRGF0ZWAgfCBgdGltZXN0YW1wYCB8IENvbnZlcnRzIHRoZSBgdGltZXN0YW1wYCBhcmd1bWVudCBpbnRvIGEgYGRhdGVgIHR5cGUKLQotfCBgdG9UaW1lc3RhbXBgIHwgYHRpbWV1dWlkYCB8IENvbnZlcnRzIHRoZSBgdGltZXV1aWRgIGFyZ3VtZW50IGludG8gYSBgdGltZXN0YW1wYCB0eXBlCi0KLXwgYHRvVGltZXN0YW1wYCB8IGBkYXRlYCB8IENvbnZlcnRzIHRoZSBgZGF0ZWAgYXJndW1lbnQgaW50byBhIGB0aW1lc3RhbXBgIHR5cGUKLQotfCBgdG9Vbml4VGltZXN0YW1wYCB8IGB0aW1ldXVpZGAgfCBDb252ZXJ0cyB0aGUgYHRpbWV1dWlkYCBhcmd1bWVudCBpbnRvIGEgYGJpZ0ludGAgcmF3IHZhbHVlCi0KLXwgYHRvVW5peFRpbWVzdGFtcGAgfCBgdGltZXN0YW1wYCB8IENvbnZlcnRzIHRoZSBgdGltZXN0YW1wYCBhcmd1bWVudCBpbnRvIGEgYGJpZ0ludGAgcmF3IHZhbHVlCi0KLXwgYHRvVW5peFRpbWVzdGFtcGAgfCBgZGF0ZWAgfCBDb252ZXJ0cyB0aGUgYGRhdGVgIGFyZ3VtZW50IGludG8gYSBgYmlnSW50YCByYXcgdmFsdWUKLQotfCBgZGF0ZU9mYCB8IGB0aW1ldXVpZGAgfCBTaW1pbGFyIHRvIGB0b1RpbWVzdGFtcCh0aW1ldXVpZClgIChERVBSRUNBVEVEKQotCi18IGB1bml4VGltZXN0YW1wT2ZgIHwgYHRpbWV1dWlkYCB8IFNpbWlsYXIgdG8gYHRvVW5peFRpbWVzdGFtcCh0aW1ldXVpZClgIChERVBSRUNBVEVEKQotfD09PQotCi09PT09PSBCbG9iIGNvbnZlcnNpb24gZnVuY3Rpb25zCi0KLUEgbnVtYmVyIG9mIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgdG8gY29udmVydCB0aGUgbmF0aXZlIHR5cGVzIGludG8KLWJpbmFyeSBkYXRhLCBvciBhIGBibG9iYC4gCi1Gb3IgZXZlcnkgeHJlZjpjcWwvdHlwZXMuYWRvYyNuYXRpdmUtdHlwZXNbdHlwZV0gc3VwcG9ydGVkIGJ5IENRTCwgdGhlIGZ1bmN0aW9uIGB0eXBlQXNCbG9iYCB0YWtlcyBhIGFyZ3VtZW50IG9mIHR5cGUgYHR5cGVgIGFuZCByZXR1cm5zIGl0IGFzIGEgYGJsb2JgLgotQ29udmVyc2VseSwgdGhlIGZ1bmN0aW9uIGBibG9iQXNUeXBlYCB0YWtlcyBhIDY0LWJpdCBgYmxvYmAgYXJndW1lbnQgYW5kIGNvbnZlcnRzIGl0IHRvIGEgYGJpZ2ludGAgdmFsdWUuIAotRm9yIGV4YW1wbGUsIGBiaWdpbnRBc0Jsb2IoMylgIHJldHVybnMgYDB4MDAwMDAwMDAwMDAwMDAwM2AgYW5kIGBibG9iQXNCaWdpbnQoMHgwMDAwMDAwMDAwMDAwMDAzKWAgcmV0dXJucyBgM2AuCi0KLVtbdXNlci1kZWZpbmVkLXNjYWxhci1mdW5jdGlvbnNdXQotPT09PSBVc2VyLWRlZmluZWQgZnVuY3Rpb25zCi0KLVVzZXItZGVmaW5lZCBmdW5jdGlvbnMgKFVERnMpIGV4ZWN1dGUgdXNlci1wcm92aWRlZCBjb2RlIGluIENhc3NhbmRyYS4gCi1CeSBkZWZhdWx0LCBDYXNzYW5kcmEgc3VwcG9ydHMgZGVmaW5pbmcgZnVuY3Rpb25zIGluIF9KYXZhXyBhbmQgX0phdmFTY3JpcHRfLgotU3VwcG9ydCBmb3Igb3RoZXIgSlNSIDIyMyBjb21wbGlhbnQgc2NyaXB0aW5nIGxhbmd1YWdlcywgc3VjaCBhcyBQeXRob24sIFJ1YnksIGFuZCBTY2FsYSwgaXMgcG9zc2libGUgYnkgYWRkaW5nIGEgSkFSIHRvIHRoZSBjbGFzc3BhdGguCi0KLVVERnMgYXJlIHBhcnQgb2YgdGhlIENhc3NhbmRyYSBzY2hlbWEsIGFuZCBhcmUgYXV0b21hdGljYWxseSBwcm9wYWdhdGVkIHRvIGFsbCBub2RlcyBpbiB0aGUgY2x1c3Rlci4gIAotVURGcyBjYW4gYmUgX292ZXJsb2FkZWRfLCBzbyB0aGF0IG11bHRpcGxlIFVERnMgd2l0aCBkaWZmZXJlbnQgYXJndW1lbnQgdHlwZXMgY2FuIGhhdmUgdGhlIHNhbWUgZnVuY3Rpb24gbmFtZS4KLQotCi1bTk9URV0KLS5Ob3RlCi09PT09Ci1fSmF2YVNjcmlwdF8gdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBoYXZlIGJlZW4gZGVwcmVjYXRlZC4gVGhleSBhcmUgcGxhbm5lZCBmb3IgcmVtb3ZhbAotaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS4KLT09PT0KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvZnVuY3Rpb25fb3ZlcmxvYWQuY3FsW10KLS0tLS0KLQotVURGcyBhcmUgc3VzY2VwdGlibGUgdG8gYWxsIG9mIHRoZSBub3JtYWwgcHJvYmxlbXMgd2l0aCB0aGUgY2hvc2VuIHByb2dyYW1taW5nIGxhbmd1YWdlLiAKLUFjY29yZGluZ2x5LCBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGJlIHNhZmUgYWdhaW5zdCBudWxsIHBvaW50ZXIgZXhjZXB0aW9ucywgaWxsZWdhbCBhcmd1bWVudHMsIG9yIGFueSBvdGhlciBwb3RlbnRpYWwgc291cmNlIG9mIGV4Y2VwdGlvbnMuIAotQW4gZXhjZXB0aW9uIGR1cmluZyBmdW5jdGlvbiBleGVjdXRpb24gd2lsbCByZXN1bHQgaW4gdGhlIGVudGlyZSBzdGF0ZW1lbnQgZmFpbGluZy4KLVZhbGlkIHF1ZXJpZXMgZm9yIFVERiB1c2UgYXJlIGBTRUxFQ1RgLCBgSU5TRVJUYCBhbmQgYFVQREFURWAgc3RhdGVtZW50cy4KLQotX0NvbXBsZXhfIHR5cGVzIGxpa2UgY29sbGVjdGlvbnMsIHR1cGxlIHR5cGVzIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgYXJlIHZhbGlkIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMgaW4gVURGcy4gCi1UdXBsZSB0eXBlcyBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIHVzZSB0aGUgRGF0YVN0YXggSmF2YSBEcml2ZXIgY29udmVyc2lvbiBmdW5jdGlvbnMuCi1QbGVhc2Ugc2VlIHRoZSBKYXZhIERyaXZlciBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIG9uIGhhbmRsaW5nIHR1cGxlIHR5cGVzIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMuCi0KLUFyZ3VtZW50cyBmb3IgZnVuY3Rpb25zIGNhbiBiZSBsaXRlcmFscyBvciB0ZXJtcy4gCi1QcmVwYXJlZCBzdGF0ZW1lbnQgcGxhY2Vob2xkZXJzIGNhbiBiZSB1c2VkLCB0b28uCi0KLU5vdGUgdGhlIHVzZSB0aGUgZG91YmxlIGRvbGxhci1zaWduIHN5bnRheCB0byBlbmNsb3NlIHRoZSBVREYgc291cmNlIGNvZGUuIAotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9mdW5jdGlvbl9kb2xsYXJzaWduLmNxbFtdCi0tLS0tCi0KLVRoZSBpbXBsaWNpdGx5IGF2YWlsYWJsZSBgdWRmQ29udGV4dGAgZmllbGQgKG9yIGJpbmRpbmcgZm9yIHNjcmlwdCBVREZzKSBwcm92aWRlcyB0aGUgbmVjZXNzYXJ5IGZ1bmN0aW9uYWxpdHkgdG8gY3JlYXRlIG5ldyBVRFQgYW5kIHR1cGxlIHZhbHVlczoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9mdW5jdGlvbl91ZGZjb250ZXh0LmNxbFtdCi0tLS0tCi0KLVRoZSBkZWZpbml0aW9uIG9mIHRoZSBgVURGQ29udGV4dGAgaW50ZXJmYWNlIGNhbiBiZSBmb3VuZCBpbiB0aGUgQXBhY2hlIENhc3NhbmRyYSBzb3VyY2UgY29kZSBmb3IgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlVERkNvbnRleHRgLgotCi1bc291cmNlLGphdmFdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEpBVkEvdWRmY29udGV4dC5qYXZhW10KLS0tLS0KLQotSmF2YSBVREZzIGFscmVhZHkgaGF2ZSBzb21lIGltcG9ydHMgZm9yIGNvbW1vbiBpbnRlcmZhY2VzIGFuZCBjbGFzc2VzIGRlZmluZWQuIFRoZXNlIGltcG9ydHMgYXJlOgotCi1bc291cmNlLGphdmFdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEpBVkEvdWRmX2ltcG9ydHMuamF2YVtdCi0tLS0tCi0KLVBsZWFzZSBub3RlLCB0aGF0IHRoZXNlIGNvbnZlbmllbmNlIGltcG9ydHMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHNjcmlwdCBVREZzLgotCi1bW2NyZWF0ZS1mdW5jdGlvbi1zdGF0ZW1lbnRdXQotPT09PSBDUkVBVEUgRlVOQ1RJT04gc3RhdGVtZW50Ci0KLUNyZWF0aW5nIGEgbmV3IHVzZXItZGVmaW5lZCBmdW5jdGlvbiB1c2VzIHRoZSBgQ1JFQVRFIEZVTkNUSU9OYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvY3JlYXRlX2Z1bmN0aW9uX3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfZnVuY3Rpb24uY3FsW10KLS0tLS0KLQotYENSRUFURSBGVU5DVElPTmAgd2l0aCB0aGUgb3B0aW9uYWwgYE9SIFJFUExBQ0VgIGtleXdvcmRzIGNyZWF0ZXMgZWl0aGVyIGEgZnVuY3Rpb24gb3IgcmVwbGFjZXMgYW4gZXhpc3Rpbmcgb25lIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlLiAKLUEgYENSRUFURSBGVU5DVElPTmAgd2l0aG91dCBgT1IgUkVQTEFDRWAgZmFpbHMgaWYgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhbHJlYWR5IGV4aXN0cy4gIAotSWYgdGhlIG9wdGlvbmFsIGBJRiBOT1QgRVhJU1RTYCBrZXl3b3JkcyBhcmUgdXNlZCwgdGhlIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjcmVhdGVkIG9ubHkgaWYgYW5vdGhlciBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBkb2VzIG5vdAotZXhpc3QuCi1gT1IgUkVQTEFDRWAgYW5kIGBJRiBOT1QgRVhJU1RTYCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci4KLQotQmVoYXZpb3IgZm9yIGBudWxsYCBpbnB1dCB2YWx1ZXMgbXVzdCBiZSBkZWZpbmVkIGZvciBlYWNoIGZ1bmN0aW9uOgotCi0qIGBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVGAgZGVjbGFyZXMgdGhhdCB0aGUgZnVuY3Rpb24gd2lsbCBhbHdheXMgcmV0dXJuIGBudWxsYCBpZiBhbnkgb2YgdGhlIGlucHV0IGFyZ3VtZW50cyBpcyBgbnVsbGAuCi0qIGBDQUxMRUQgT04gTlVMTCBJTlBVVGAgZGVjbGFyZXMgdGhhdCB0aGUgZnVuY3Rpb24gd2lsbCBhbHdheXMgYmUgZXhlY3V0ZWQuCi0KLT09PT09IEZ1bmN0aW9uIFNpZ25hdHVyZQotCi1TaWduYXR1cmVzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGluZGl2aWR1YWwgZnVuY3Rpb25zLiBUaGUgc2lnbmF0dXJlIGNvbnNpc3RzIG9mIGEgZnVsbHktcXVhbGlmaWVkIGZ1bmN0aW9uIG5hbWUgb2YgdGhlIDxrZXlzcGFjZT4uPGZ1bmN0aW9uX25hbWU+IGFuZCBhIGNvbmNhdGVuYXRlZCBsaXN0IG9mIGFsbCB0aGUgYXJndW1lbnQgdHlwZXMuCi0KLU5vdGUgdGhhdCBrZXlzcGFjZSBuYW1lcywgZnVuY3Rpb24gbmFtZXMgYW5kIGFyZ3VtZW50IHR5cGVzIGFyZSBzdWJqZWN0IHRvIHRoZSBkZWZhdWx0IG5hbWluZyBjb252ZW50aW9ucyBhbmQgY2FzZS1zZW5zaXRpdml0eSBydWxlcy4KLQotRnVuY3Rpb25zIGJlbG9uZyB0byBhIGtleXNwYWNlOyBpZiBubyBrZXlzcGFjZSBpcyBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IGtleXNwYWNlIGlzIHVzZWQuIAotVXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gdGhlIHN5c3RlbSBrZXlzcGFjZXMuCi0KLVtbZHJvcC1mdW5jdGlvbi1zdGF0ZW1lbnRdXQotPT09PSBEUk9QIEZVTkNUSU9OIHN0YXRlbWVudAotCi1Ecm9wcGluZyBhIGZ1bmN0aW9uIHVzZXMgdGhlIGBEUk9QIEZVTkNUSU9OYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2Ryb3BfZnVuY3Rpb25fc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2Ryb3BfZnVuY3Rpb24uY3FsW10KLS0tLS0KLQotWW91IG11c3Qgc3BlY2lmeSB0aGUgYXJndW1lbnQgdHlwZXMgb2YgdGhlIGZ1bmN0aW9uLCB0aGUgYXJndW1lbnRzX3NpZ25hdHVyZSwgaW4gdGhlIGRyb3AgY29tbWFuZCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgb3ZlcmxvYWRlZCBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgc2lnbmF0dXJlcy4gIAotYERST1AgRlVOQ1RJT05gIHdpdGggdGhlIG9wdGlvbmFsIGBJRiBFWElTVFNgIGtleXdvcmRzIGRyb3BzIGEgZnVuY3Rpb24gaWYgaXQgZXhpc3RzLCBidXQgZG9lcyBub3QgdGhyb3cgYW4gZXJyb3IgaWYgaXQgZG9lc24ndC4KLQotW1thZ2dyZWdhdGUtZnVuY3Rpb25zXV0KLT09PSBBZ2dyZWdhdGUgZnVuY3Rpb25zCi0KLUFnZ3JlZ2F0ZSBmdW5jdGlvbnMgd29yayBvbiBhIHNldCBvZiByb3dzLiAKLVZhbHVlcyBmb3IgZWFjaCByb3cgYXJlIGlucHV0LCB0byByZXR1cm4gYSBzaW5nbGUgdmFsdWUgZm9yIHRoZSBzZXQgb2Ygcm93cyBhZ2dyZWdhdGVkLgotCi1JZiBgbm9ybWFsYCBjb2x1bW5zLCBgc2NhbGFyIGZ1bmN0aW9uc2AsIGBVRFRgIGZpZWxkcywgYHdyaXRldGltZWAsIG9yIGB0dGxgIGFyZSBzZWxlY3RlZCB0b2dldGhlciB3aXRoIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMsIHRoZSB2YWx1ZXMKLXJldHVybmVkIGZvciB0aGVtIHdpbGwgYmUgdGhlIG9uZXMgb2YgdGhlIGZpcnN0IHJvdyBtYXRjaGluZyB0aGUgcXVlcnkuCi0KLT09PT0gTmF0aXZlIGFnZ3JlZ2F0ZXMKLQotW1tjb3VudC1mdW5jdGlvbl1dCi09PT09PSBDb3VudAotCi1UaGUgYGNvdW50YCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjb3VudCB0aGUgcm93cyByZXR1cm5lZCBieSBhIHF1ZXJ5LgotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9jb3VudC5jcWxbXQotLS0tLQotCi1JdCBhbHNvIGNhbiBjb3VudCB0aGUgbm9uLW51bGwgdmFsdWVzIG9mIGEgZ2l2ZW4gY29sdW1uOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NvdW50X25vbm51bGwuY3FsW10KLS0tLS0KLQotPT09PT0gTWF4IGFuZCBNaW4KLQotVGhlIGBtYXhgIGFuZCBgbWluYCBmdW5jdGlvbnMgY29tcHV0ZSB0aGUgbWF4aW11bSBhbmQgdGhlIG1pbmltdW0gdmFsdWUgcmV0dXJuZWQgYnkgYSBxdWVyeSBmb3IgYSBnaXZlbiBjb2x1bW4uIAotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9taW5fbWF4LmNxbFtdCi0tLS0tCi0KLT09PT09IFN1bQotCi1UaGUgYHN1bWAgZnVuY3Rpb24gc3VtcyB1cCBhbGwgdGhlIHZhbHVlcyByZXR1cm5lZCBieSBhIHF1ZXJ5IGZvciBhIGdpdmVuIGNvbHVtbi4gCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3N1bS5jcWxbXQotLS0tLQotCi09PT09PSBBdmcKLQotVGhlIGBhdmdgIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBhdmVyYWdlIG9mIGFsbCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgZ2l2ZW4gY29sdW1uLiAKLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvYXZnLmNxbFtdCi0tLS0tCi0KLVtbdXNlci1kZWZpbmVkLWFnZ3JlZ2F0ZXMtZnVuY3Rpb25zXV0KLT09PT0gVXNlci1EZWZpbmVkIEFnZ3JlZ2F0ZXMgKFVEQXMpCi0KLVVzZXItZGVmaW5lZCBhZ2dyZWdhdGVzIGFsbG93IHRoZSBjcmVhdGlvbiBvZiBjdXN0b20gYWdncmVnYXRlIGZ1bmN0aW9ucy4gCi1Vc2VyLWRlZmluZWQgYWdncmVnYXRlcyBjYW4gYmUgdXNlZCBpbiBgU0VMRUNUYCBzdGF0ZW1lbnQuCi0KLUVhY2ggYWdncmVnYXRlIHJlcXVpcmVzIGFuIF9pbml0aWFsIHN0YXRlXyBvZiB0eXBlIGBTVFlQRWAgZGVmaW5lZCB3aXRoIHRoZSBgSU5JVENPTkRgdmFsdWUgKGRlZmF1bHQgdmFsdWU6IGBudWxsYCkuIAotVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBzdGF0ZSBmdW5jdGlvbiBtdXN0IGhhdmUgdHlwZSBgU1RZUEVgLiAKLVRoZSByZW1haW5pbmcgYXJndW1lbnRzIG9mIHRoZSBzdGF0ZSBmdW5jdGlvbiBtdXN0IG1hdGNoIHRoZSB0eXBlcyBvZiB0aGUgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSBhcmd1bWVudHMuIAotVGhlIHN0YXRlIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIHJvdywgYW5kIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgc3RhdGUgZnVuY3Rpb24gYmVjb21lcyB0aGUgbmV3IHN0YXRlLiAKLUFmdGVyIGFsbCByb3dzIGFyZSBwcm9jZXNzZWQsIHRoZSBvcHRpb25hbCBgRklOQUxGVU5DYCBpcyBleGVjdXRlZCB3aXRoIGxhc3Qgc3RhdGUgdmFsdWUgYXMgaXRzIGFyZ3VtZW50LgotCi1UaGUgYFNUWVBFYCB2YWx1ZSBpcyBtYW5kYXRvcnkgaW4gb3JkZXIgdG8gZGlzdGluZ3Vpc2ggcG9zc2libHkgb3ZlcmxvYWRlZCB2ZXJzaW9ucyBvZiB0aGUgc3RhdGUgYW5kL29yIGZpbmFsIGZ1bmN0aW9uLCBzaW5jZSB0aGUKLW92ZXJsb2FkIGNhbiBhcHBlYXIgYWZ0ZXIgY3JlYXRpb24gb2YgdGhlIGFnZ3JlZ2F0ZS4KLQotCi1BIGNvbXBsZXRlIHdvcmtpbmcgZXhhbXBsZSBmb3IgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgKGFzc3VtaW5nIHRoYXQgYQota2V5c3BhY2UgaGFzIGJlZW4gc2VsZWN0ZWQgdXNpbmcgdGhlIGBVU0VgIHN0YXRlbWVudCk6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvdWRhLmNxbFtdCi0tLS0tCi0KLVtbY3JlYXRlLWFnZ3JlZ2F0ZS1zdGF0ZW1lbnRdXQotPT09PSBDUkVBVEUgQUdHUkVHQVRFIHN0YXRlbWVudAotCi1DcmVhdGluZyAob3IgcmVwbGFjaW5nKSBhIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGUgZnVuY3Rpb24gdXNlcyB0aGUKLWBDUkVBVEUgQUdHUkVHQVRFYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2NyZWF0ZV9hZ2dyZWdhdGVfc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLVNlZSBhYm92ZSBmb3IgYSBjb21wbGV0ZSBleGFtcGxlLgotCi1UaGUgYENSRUFURSBBR0dSRUdBVEVgIGNvbW1hbmQgd2l0aCB0aGUgb3B0aW9uYWwgYE9SIFJFUExBQ0VgIGtleXdvcmRzIGNyZWF0ZXMgZWl0aGVyIGFuIGFnZ3JlZ2F0ZSBvciByZXBsYWNlcyBhbiBleGlzdGluZyBvbmUgd2l0aCB0aGUgc2FtZQotc2lnbmF0dXJlLiAKLUEgYENSRUFURSBBR0dSRUdBVEVgIHdpdGhvdXQgYE9SIFJFUExBQ0VgIGZhaWxzIGlmIGFuIGFnZ3JlZ2F0ZSB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhbHJlYWR5IGV4aXN0cy4KLVRoZSBgQ1JFQVRFIEFHR1JFR0FURWAgY29tbWFuZCB3aXRoIHRoZSBvcHRpb25hbCBgSUYgTk9UIEVYSVNUU2Aga2V5d29yZHMgY3JlYXRlcyBhbiBhZ2dyZWdhdGUgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KLVRoZSBgT1IgUkVQTEFDRWAgYW5kIGBJRiBOT1QgRVhJU1RTYCBwaHJhc2VzIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLgotCi1UaGUgYFNUWVBFYCB2YWx1ZSBkZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSBzdGF0ZSB2YWx1ZSBhbmQgbXVzdCBiZSBzcGVjaWZpZWQuCi1UaGUgb3B0aW9uYWwgYElOSVRDT05EYCBkZWZpbmVzIHRoZSBpbml0aWFsIHN0YXRlIHZhbHVlIGZvciB0aGUgYWdncmVnYXRlOyB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBgbnVsbGAuIAotQSBub24tbnVsbCBgSU5JVENPTkRgIG11c3QgYmUgc3BlY2lmaWVkIGZvciBzdGF0ZSBmdW5jdGlvbnMgdGhhdCBhcmUgZGVjbGFyZWQgd2l0aCBgUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVRgLgotCi1UaGUgYFNGVU5DYCB2YWx1ZSByZWZlcmVuY2VzIGFuIGV4aXN0aW5nIGZ1bmN0aW9uIHRvIHVzZSBhcyB0aGUgc3RhdGUtbW9kaWZ5aW5nIGZ1bmN0aW9uLiAKLVRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgc3RhdGUgZnVuY3Rpb24gbXVzdCBoYXZlIHR5cGUgYFNUWVBFYC4KLVRoZSByZW1haW5pbmcgYXJndW1lbnRzIG9mIHRoZSBzdGF0ZSBmdW5jdGlvbiBtdXN0IG1hdGNoIHRoZSB0eXBlcyBvZiB0aGUgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSBhcmd1bWVudHMuCi1UaGUgc3RhdGUgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggcm93LCBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBzdGF0ZSBmdW5jdGlvbiBiZWNvbWVzIHRoZSBuZXcgc3RhdGUuCi1TdGF0ZSBpcyBub3QgdXBkYXRlZCBmb3Igc3RhdGUgZnVuY3Rpb25zIGRlY2xhcmVkIHdpdGggYFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUYCBhbmQgY2FsbGVkIHdpdGggYG51bGxgLgotQWZ0ZXIgYWxsIHJvd3MgYXJlIHByb2Nlc3NlZCwgdGhlIG9wdGlvbmFsIGBGSU5BTEZVTkNgIGlzIGV4ZWN1dGVkIHdpdGggbGFzdCBzdGF0ZSB2YWx1ZSBhcyBpdHMgYXJndW1lbnQuCi1JdCBtdXN0IHRha2Ugb25seSBvbmUgYXJndW1lbnQgd2l0aCB0eXBlIGBTVFlQRWAsIGJ1dCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGBGSU5BTEZVTkNgIG1heSBiZSBhIGRpZmZlcmVudCB0eXBlLiAKLUEgZmluYWwgZnVuY3Rpb24gZGVjbGFyZWQgd2l0aCBgUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVRgIG1lYW5zIHRoYXQgdGhlIGFnZ3JlZ2F0ZSdzIHJldHVybiB2YWx1ZSB3aWxsIGJlIGBudWxsYCwgaWYgdGhlIGxhc3Qgc3RhdGUgaXMgYG51bGxgLgotCi1JZiBubyBgRklOQUxGVU5DYCBpcyBkZWZpbmVkLCB0aGUgb3ZlcmFsbCByZXR1cm4gdHlwZSBvZiB0aGUgYWdncmVnYXRlIGZ1bmN0aW9uIGlzIGBTVFlQRWAuIAotSWYgYSBgRklOQUxGVU5DYCBpcyBkZWZpbmVkLCBpdCBpcyB0aGUgcmV0dXJuIHR5cGUgb2YgdGhhdCBmdW5jdGlvbi4KLQotW1tkcm9wLWFnZ3JlZ2F0ZS1zdGF0ZW1lbnRdXQotPT09PSBEUk9QIEFHR1JFR0FURSBzdGF0ZW1lbnQKLQotRHJvcHBpbmcgYW4gdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSBmdW5jdGlvbiB1c2VzIHRoZSBgRFJPUCBBR0dSRUdBVEVgCi1zdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2Ryb3BfYWdncmVnYXRlX3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi1Gb3IgaW5zdGFuY2U6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvZHJvcF9hZ2dyZWdhdGUuY3FsW10KLS0tLS0KLQotVGhlIGBEUk9QIEFHR1JFR0FURWAgc3RhdGVtZW50IHJlbW92ZXMgYW4gYWdncmVnYXRlIGNyZWF0ZWQgdXNpbmcgYENSRUFURSBBR0dSRUdBVEVgLiAKLVlvdSBtdXN0IHNwZWNpZnkgdGhlIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBhZ2dyZWdhdGUgdG8gZHJvcCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgb3ZlcmxvYWRlZCBhZ2dyZWdhdGVzIHdpdGggdGhlIHNhbWUgbmFtZSBidXQgYQotZGlmZmVyZW50IHNpZ25hdHVyZS4KLQotVGhlIGBEUk9QIEFHR1JFR0FURWAgY29tbWFuZCB3aXRoIHRoZSBvcHRpb25hbCBgSUYgRVhJU1RTYCBrZXl3b3JkcyBkcm9wcyBhbiBhZ2dyZWdhdGUgaWYgaXQgZXhpc3RzLCBhbmQgZG9lcyBub3RoaW5nIGlmIGEgZnVuY3Rpb24gd2l0aCB0aGUKLXNpZ25hdHVyZSBkb2VzIG5vdCBleGlzdC4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvaW5kZXguYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0M2JlMy4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2luZGV4LmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi09IFRoZSBDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UgKENRTCkKLQotVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIENhc3NhbmRyYSBRdWVyeSBMYW5ndWFnZQotKENRTCkgdmVyc2lvbiAzLgotTm90ZSB0aGF0IHRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBsYXN0IHZlcnNpb24gb2YgdGhlIGxhbmd1YWdlLgotSG93ZXZlciwgdGhlIHhyZWY6Y3FsL2NoYW5nZXMuYWRvY1tjaGFuZ2VzXSBzZWN0aW9uIHByb3ZpZGVzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyBvZiBDUUwgc2luY2UgdmVyc2lvbiAzLjAuCi0KLUNRTCBvZmZlcnMgYSBtb2RlbCBzaW1pbGFyIHRvIFNRTC4KLVRoZSBkYXRhIGlzIHN0b3JlZCBpbiAqdGFibGVzKiBjb250YWluaW5nICpyb3dzKiBvZiAqY29sdW1ucyouCi1Gb3IgdGhhdCByZWFzb24sIHdoZW4gdXNlZCBpbiB0aGlzIGRvY3VtZW50LCB0aGVzZSB0ZXJtcyAodGFibGVzLCByb3dzIGFuZCBjb2x1bW5zKSBoYXZlIHRoZSBzYW1lIGRlZmluaXRpb24gdGhhdCB0aGV5IGhhdmUgaW4gU1FMLgotCi0qIHhyZWY6Y3FsL2RlZmluaXRpb25zLmFkb2NbRGVmaW5pdGlvbnNdCi0qIHhyZWY6Y3FsL3R5cGVzLmFkb2NbRGF0YSB0eXBlc10KLSogeHJlZjpjcWwvZGRsLmFkb2NbRGF0YSBkZWZpbml0aW9uIGxhbmd1YWdlXQotKiB4cmVmOmNxbC9kbWwuYWRvY1tEYXRhIG1hbmlwdWxhdGlvbiBsYW5ndWFnZV0KLSogeHJlZjpjcWwvb3BlcmF0b3JzLmFkb2NbT3BlcmF0b3JzXQotKiB4cmVmOmNxbC9pbmRleGVzLmFkb2NbU2Vjb25kYXJ5IGluZGV4ZXNdCi0qIHhyZWY6Y3FsL212cy5hZG9jW01hdGVyaWFsaXplZCB2aWV3c10KLSogeHJlZjpjcWwvZnVuY3Rpb25zLmFkb2NbRnVuY3Rpb25zXQotKiB4cmVmOmNxbC9qc29uLmFkb2NbSlNPTl0KLSogeHJlZjpjcWwvc2VjdXJpdHkuYWRvY1tDUUwgc2VjdXJpdHldCi0qIHhyZWY6Y3FsL3RyaWdnZXJzLmFkb2NbVHJpZ2dlcnNdCi0qIHhyZWY6Y3FsL2FwcGVuZGljZXMuYWRvY1tBcHBlbmRpY2VzXQotKiB4cmVmOmNxbC9jaGFuZ2VzLmFkb2NbQ2hhbmdlc10KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvanNvbi5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9qc29uLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMGFhMjYuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9qc29uLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPSBKU09OIFN1cHBvcnQKLQotQ2Fzc2FuZHJhIDIuMiBpbnRyb2R1Y2VzIEpTT04gc3VwcG9ydCB0byBgU0VMRUNUIDxzZWxlY3Qtc3RhdGVtZW50PmAgYW5kCi1gSU5TRVJUIDxpbnNlcnQtc3RhdGVtZW50PmAgc3RhdGVtZW50cy4gCi1UaGlzIHN1cHBvcnQgZG9lcyBub3QgZnVuZGFtZW50YWxseSBhbHRlciB0aGUgQ1FMIEFQSSAoZm9yIGV4YW1wbGUsIHRoZSBzY2hlbWEgaXMgc3RpbGwKLWVuZm9yY2VkKS4KLUl0IHNpbXBseSBwcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IHRvIHdvcmsgd2l0aCBKU09OIGRvY3VtZW50cy4KLQotPT0gU0VMRUNUIEpTT04KLQotV2l0aCBgU0VMRUNUYCBzdGF0ZW1lbnRzLCB0aGUgYEpTT05gIGtleXdvcmQgaXMgdXNlZCB0byByZXR1cm4gZWFjaCByb3cgYXMgYSBzaW5nbGUgYEpTT05gIGVuY29kZWQgbWFwLiAKLVRoZSByZW1haW5kZXIgb2YgdGhlIGBTRUxFQ1RgIHN0YXRlbWVudCBiZWhhdmlvciBpcyB0aGUgc2FtZS4KLQotVGhlIHJlc3VsdCBtYXAga2V5cyBtYXRjaCB0aGUgY29sdW1uIG5hbWVzIGluIGEgbm9ybWFsIHJlc3VsdCBzZXQuIAotRm9yIGV4YW1wbGUsIGEgc3RhdGVtZW50IGxpa2UgYFNFTEVDVCBKU09OIGEsIHR0bChiKSBGUk9NIC4uLmAgd291bGQgcmVzdWx0IGluIGEgbWFwIHdpdGgga2V5cyBgImEiYCBhbmQgYCJ0dGwoYikiYC4gCi1Ib3dldmVyLCB0aGVyZSBpcyBvbmUgbm90YWJsZSBleGNlcHRpb246IGZvciBzeW1tZXRyeSB3aXRoIGBJTlNFUlQgSlNPTmAgYmVoYXZpb3IsIGNhc2Utc2Vuc2l0aXZlIGNvbHVtbiBuYW1lcyB3aXRoIHVwcGVyLWNhc2UgbGV0dGVycyB3aWxsIGJlIHN1cnJvdW5kZWQgd2l0aCBkb3VibGUgcXVvdGVzLiAKLUZvciBleGFtcGxlLCBgU0VMRUNUIEpTT04gbXlDb2x1bW4gRlJPTSAuLi5gIHdvdWxkIHJlc3VsdCBpbiBhIG1hcCBrZXkgYCJcIm15Q29sdW1uXCIiYCB3aXRoIGVzY2FwZWQgcXVvdGVzKS4KLQotVGhlIG1hcCB2YWx1ZXMgd2lsbCBKU09OLWVuY29kZWQgcmVwcmVzZW50YXRpb25zIChhcyBkZXNjcmliZWQgYmVsb3cpIG9mIHRoZSByZXN1bHQgc2V0IHZhbHVlcy4KLQotPT0gSU5TRVJUIEpTT04KLQotV2l0aCBgSU5TRVJUYCBzdGF0ZW1lbnRzLCB0aGUgbmV3IGBKU09OYCBrZXl3b3JkIGNhbiBiZSB1c2VkIHRvIGVuYWJsZQotaW5zZXJ0aW5nIGEgYEpTT05gIGVuY29kZWQgbWFwIGFzIGEgc2luZ2xlIHJvdy4gVGhlIGZvcm1hdCBvZiB0aGUgYEpTT05gCi1tYXAgc2hvdWxkIGdlbmVyYWxseSBtYXRjaCB0aGF0IHJldHVybmVkIGJ5IGEgYFNFTEVDVCBKU09OYCBzdGF0ZW1lbnQgb24KLXRoZSBzYW1lIHRhYmxlLiBJbiBwYXJ0aWN1bGFyLCBjYXNlLXNlbnNpdGl2ZSBjb2x1bW4gbmFtZXMgc2hvdWxkIGJlCi1zdXJyb3VuZGVkIHdpdGggZG91YmxlIHF1b3Rlcy4gRm9yIGV4YW1wbGUsIHRvIGluc2VydCBpbnRvIGEgdGFibGUgd2l0aAotdHdvIGNvbHVtbnMgbmFtZWQgIm15S2V5IiBhbmQgInZhbHVlIiwgeW91IHdvdWxkIGRvIHRoZSBmb2xsb3dpbmc6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvaW5zZXJ0X2pzb24uY3FsW10KLS0tLS0KLQotQnkgZGVmYXVsdCAob3IgaWYgYERFRkFVTFQgTlVMTGAgaXMgZXhwbGljaXRseSB1c2VkKSwgYSBjb2x1bW4gb21pdHRlZAotZnJvbSB0aGUgYEpTT05gIG1hcCB3aWxsIGJlIHNldCB0byBgTlVMTGAsIG1lYW5pbmcgdGhhdCBhbnkgcHJlLWV4aXN0aW5nCi12YWx1ZSBmb3IgdGhhdCBjb2x1bW4gd2lsbCBiZSByZW1vdmVkIChyZXN1bHRpbmcgaW4gYSB0b21ic3RvbmUgYmVpbmcKLWNyZWF0ZWQpLiBBbHRlcm5hdGl2ZWx5LCBpZiB0aGUgYERFRkFVTFQgVU5TRVRgIGRpcmVjdGl2ZSBpcyB1c2VkIGFmdGVyCi10aGUgdmFsdWUsIG9taXR0ZWQgY29sdW1uIHZhbHVlcyB3aWxsIGJlIGxlZnQgdW5zZXQsIG1lYW5pbmcgdGhhdAotcHJlLWV4aXN0aW5nIHZhbHVlcyBmb3IgdGhvc2UgY29sdW1uIHdpbGwgYmUgcHJlc2VydmVkLgotCi09PSBKU09OIEVuY29kaW5nIG9mIENhc3NhbmRyYSBEYXRhIFR5cGVzCi0KLVdoZXJlIHBvc3NpYmxlLCBDYXNzYW5kcmEgd2lsbCByZXByZXNlbnQgYW5kIGFjY2VwdCBkYXRhIHR5cGVzIGluIHRoZWlyCi1uYXRpdmUgYEpTT05gIHJlcHJlc2VudGF0aW9uLiBDYXNzYW5kcmEgd2lsbCBhbHNvIGFjY2VwdCBzdHJpbmcKLXJlcHJlc2VudGF0aW9ucyBtYXRjaGluZyB0aGUgQ1FMIGxpdGVyYWwgZm9ybWF0IGZvciBhbGwgc2luZ2xlLWZpZWxkCi10eXBlcy4gRm9yIGV4YW1wbGUsIGZsb2F0cywgaW50cywgVVVJRHMsIGFuZCBkYXRlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkKLUNRTCBsaXRlcmFsIHN0cmluZ3MuIEhvd2V2ZXIsIGNvbXBvdW5kIHR5cGVzLCBzdWNoIGFzIGNvbGxlY3Rpb25zLAotdHVwbGVzLCBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIG11c3QgYmUgcmVwcmVzZW50ZWQgYnkgbmF0aXZlIGBKU09OYAotY29sbGVjdGlvbnMgKG1hcHMgYW5kIGxpc3RzKSBvciBhIEpTT04tZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YKLXRoZSBjb2xsZWN0aW9uLgotCi1UaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUgZW5jb2RpbmdzIHRoYXQgQ2Fzc2FuZHJhIHdpbGwgYWNjZXB0Ci1pbiBgSU5TRVJUIEpTT05gIHZhbHVlcyAoYW5kIGBmcm9tSnNvbigpYCBhcmd1bWVudHMpIGFzIHdlbGwgYXMgdGhlCi1mb3JtYXQgQ2Fzc2FuZHJhIHdpbGwgdXNlIHdoZW4gcmV0dXJuaW5nIGRhdGEgZm9yIGBTRUxFQ1QgSlNPTmAKLXN0YXRlbWVudHMgKGFuZCBgZnJvbUpzb24oKWApOgotCi1bY29scz0iLCwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxUeXBlIHxGb3JtYXRzIGFjY2VwdGVkIHxSZXR1cm4gZm9ybWF0IHxOb3RlcwotCi18IGBhc2NpaWAgfCBzdHJpbmcgfCBzdHJpbmcgfCBVc2VzIEpTT04ncyBgXHVgIGNoYXJhY3RlciBlc2NhcGUKLQotfCBgYmlnaW50YCB8IGludGVnZXIsIHN0cmluZyB8IGludGVnZXIgfCBTdHJpbmcgbXVzdCBiZSB2YWxpZCA2NCBiaXQgaW50ZWdlcgotCi18IGBibG9iYCB8IHN0cmluZyB8IHN0cmluZyB8IFN0cmluZyBzaG91bGQgYmUgMHggZm9sbG93ZWQgYnkgYW4gZXZlbiBudW1iZXIgb2YgaGV4IGRpZ2l0cwotCi18IGBib29sZWFuYCB8IGJvb2xlYW4sIHN0cmluZyB8IGJvb2xlYW4gfCBTdHJpbmcgbXVzdCBiZSAidHJ1ZSIgb3IgImZhbHNlIgotCi18IGBkYXRlYCB8IHN0cmluZyB8IHN0cmluZyB8IERhdGUgaW4gZm9ybWF0IGBZWVlZLU1NLUREYCwgdGltZXpvbmUgVVRDCi0KLXwgYGRlY2ltYWxgIHwgaW50ZWdlciwgZmxvYXQsIHN0cmluZyB8IGZsb2F0IHwgTWF5IGV4Y2VlZCAzMiBvciA2NC1iaXQgSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uIGluIGNsaWVudC1zaWRlIGRlY29kZXIKLQotfCBgZG91YmxlYCB8IGludGVnZXIsIGZsb2F0LCBzdHJpbmcgfCBmbG9hdCB8IFN0cmluZyBtdXN0IGJlIHZhbGlkIGludGVnZXIgb3IgZmxvYXQKLQotfCBgZmxvYXRgIHwgaW50ZWdlciwgZmxvYXQsIHN0cmluZyB8IGZsb2F0IHwgU3RyaW5nIG11c3QgYmUgdmFsaWQgaW50ZWdlciBvciBmbG9hdAotCi18IGBpbmV0YCB8IHN0cmluZyB8IHN0cmluZyB8IElQdjQgb3IgSVB2NiBhZGRyZXNzCi0KLXwgYGludGAgfCBpbnRlZ2VyLCBzdHJpbmcgfCBpbnRlZ2VyIHwgU3RyaW5nIG11c3QgYmUgdmFsaWQgMzIgYml0IGludGVnZXIKLQotfCBgbGlzdGAgfCBsaXN0LCBzdHJpbmcgfCBsaXN0IHwgVXNlcyBKU09OJ3MgbmF0aXZlIGxpc3QgcmVwcmVzZW50YXRpb24KLQotfCBgbWFwYCB8IG1hcCwgc3RyaW5nIHwgbWFwIHwgVXNlcyBKU09OJ3MgbmF0aXZlIG1hcCByZXByZXNlbnRhdGlvbgotCi18IGBzbWFsbGludGAgfCBpbnRlZ2VyLCBzdHJpbmcgfCBpbnRlZ2VyIHwgU3RyaW5nIG11c3QgYmUgdmFsaWQgMTYgYml0IGludGVnZXIKLQotfCBgc2V0YCB8IGxpc3QsIHN0cmluZyB8IGxpc3QgfCBVc2VzIEpTT04ncyBuYXRpdmUgbGlzdCByZXByZXNlbnRhdGlvbgotCi18IGB0ZXh0YCB8IHN0cmluZyB8IHN0cmluZyB8IFVzZXMgSlNPTidzIGBcdWAgY2hhcmFjdGVyIGVzY2FwZQotCi18IGB0aW1lYCB8IHN0cmluZyB8IHN0cmluZyB8IFRpbWUgb2YgZGF5IGluIGZvcm1hdCBgSEgtTU0tU1NbLmZmZmZmZmZmZl1gCi0KLXwgYHRpbWVzdGFtcGAgfCBpbnRlZ2VyLCBzdHJpbmcgfCBzdHJpbmcgfCBBIHRpbWVzdGFtcC4gU3RyaW5ncyBjb25zdGFudCBhbGxvd3MgdG8gaW5wdXQgYHRpbWVzdGFtcHMKLWFzIGRhdGVzIDx0aW1lc3RhbXBzPmAuIERhdGVzdGFtcHMgd2l0aCBmb3JtYXQgYFlZWVktTU0tREQgSEg6TU06U1MuU1NTYAotYXJlIHJldHVybmVkLgotCi18IGB0aW1ldXVpZGAgfCBzdHJpbmcgfCBzdHJpbmcgfCBUeXBlIDEgVVVJRC4gU2VlIGBjb25zdGFudGAgZm9yIHRoZSBVVUlEIGZvcm1hdAotCi18IGB0aW55aW50YCB8IGludGVnZXIsIHN0cmluZyB8IGludGVnZXIgfCBTdHJpbmcgbXVzdCBiZSB2YWxpZCA4IGJpdCBpbnRlZ2VyCi0KLXwgYHR1cGxlYCB8IGxpc3QsIHN0cmluZyB8IGxpc3QgfCBVc2VzIEpTT04ncyBuYXRpdmUgbGlzdCByZXByZXNlbnRhdGlvbgotCi18IGBVRFRgIHwgbWFwLCBzdHJpbmcgfCBtYXAgfCBVc2VzIEpTT04ncyBuYXRpdmUgbWFwIHJlcHJlc2VudGF0aW9uIHdpdGggZmllbGQgbmFtZXMgYXMga2V5cwotCi18IGB1dWlkYCB8IHN0cmluZyB8IHN0cmluZyB8IFNlZSBgY29uc3RhbnRgIGZvciB0aGUgVVVJRCBmb3JtYXQKLQotfCBgdmFyY2hhcmAgfCBzdHJpbmcgfCBzdHJpbmcgfCBVc2VzIEpTT04ncyBgXHVgIGNoYXJhY3RlciBlc2NhcGUKLQotfCBgdmFyaW50YCB8IGludGVnZXIsIHN0cmluZyB8IGludGVnZXIgfCBWYXJpYWJsZSBsZW5ndGg7IG1heSBvdmVyZmxvdyAzMiBvciA2NCBiaXQgaW50ZWdlcnMgaW4gY2xpZW50LXNpZGUgZGVjb2RlcgotfD09PQotCi09PSBUaGUgZnJvbUpzb24oKSBGdW5jdGlvbgotCi1UaGUgYGZyb21Kc29uKClgIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHNpbWlsYXJseSB0byBgSU5TRVJUIEpTT05gLCBidXQKLWZvciBhIHNpbmdsZSBjb2x1bW4gdmFsdWUuIEl0IG1heSBvbmx5IGJlIHVzZWQgaW4gdGhlIGBWQUxVRVNgIGNsYXVzZSBvZgotYW4gYElOU0VSVGAgc3RhdGVtZW50IG9yIGFzIG9uZSBvZiB0aGUgY29sdW1uIHZhbHVlcyBpbiBhbiBgVVBEQVRFYCwKLWBERUxFVEVgLCBvciBgU0VMRUNUYCBzdGF0ZW1lbnQuIEZvciBleGFtcGxlLCBpdCBjYW5ub3QgYmUgdXNlZCBpbiB0aGUKLXNlbGVjdGlvbiBjbGF1c2Ugb2YgYSBgU0VMRUNUYCBzdGF0ZW1lbnQuCi0KLT09IFRoZSB0b0pzb24oKSBGdW5jdGlvbgotCi1UaGUgYHRvSnNvbigpYCBmdW5jdGlvbiBtYXkgYmUgdXNlZCBzaW1pbGFybHkgdG8gYFNFTEVDVCBKU09OYCwgYnV0IGZvcgotYSBzaW5nbGUgY29sdW1uIHZhbHVlLiBJdCBtYXkgb25seSBiZSB1c2VkIGluIHRoZSBzZWxlY3Rpb24gY2xhdXNlIG9mIGEKLWBTRUxFQ1RgIHN0YXRlbWVudC4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvc2VjdXJpdHkuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvc2VjdXJpdHkuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA0ZGVhMC4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL3NlY3VyaXR5LmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MTYgKzAsMCBAQAotcm9sZV9uYW1lIDo6PSBpZGVudGlmaWVyIHwgc3RyaW5nPSBTZWN1cml0eQotCi1bW2NxbC1yb2xlc11dCi09PSBEYXRhYmFzZSBSb2xlcwotCi1DUUwgdXNlcyBkYXRhYmFzZSByb2xlcyB0byByZXByZXNlbnQgdXNlcnMgYW5kIGdyb3VwIG9mIHVzZXJzLgotU3ludGFjdGljYWxseSwgYSByb2xlIGlzIGRlZmluZWQgYnk6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL3JvbGVfbmFtZS5ibmZbXQotLS0tLQotCi0KLVtbY3JlYXRlLXJvbGUtc3RhdGVtZW50XV0KLT09PSBDUkVBVEUgUk9MRQotCi1DcmVhdGluZyBhIHJvbGUgdXNlcyB0aGUgYENSRUFURSBST0xFYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2NyZWF0ZV9yb2xlX3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi1Gb3IgaW5zdGFuY2U6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3JvbGUuY3FsW10KLS0tLS0KLQotQnkgZGVmYXVsdCByb2xlcyBkbyBub3QgcG9zc2VzcyBgTE9HSU5gIHByaXZpbGVnZXMgb3IgYFNVUEVSVVNFUmAKLXN0YXR1cy4KLQoteHJlZjpjcWwvc2VjdXJpdHkuYWRvYyNjcWwtcGVybWlzc2lvbnNbUGVybWlzc2lvbnNdIG9uIGRhdGFiYXNlIHJlc291cmNlcyBhcmUgZ3JhbnRlZCB0bwotcm9sZXM7IHR5cGVzIG9mIHJlc291cmNlcyBpbmNsdWRlIGtleXNwYWNlcywgdGFibGVzLCBmdW5jdGlvbnMgYW5kIHJvbGVzCi10aGVtc2VsdmVzLiBSb2xlcyBtYXkgYmUgZ3JhbnRlZCB0byBvdGhlciByb2xlcyB0byBjcmVhdGUgaGllcmFyY2hpY2FsCi1wZXJtaXNzaW9ucyBzdHJ1Y3R1cmVzOyBpbiB0aGVzZSBoaWVyYXJjaGllcywgcGVybWlzc2lvbnMgYW5kCi1gU1VQRVJVU0VSYCBzdGF0dXMgYXJlIGluaGVyaXRlZCwgYnV0IHRoZSBgTE9HSU5gIHByaXZpbGVnZSBpcyBub3QuCi0KLUlmIGEgcm9sZSBoYXMgdGhlIGBMT0dJTmAgcHJpdmlsZWdlLCBjbGllbnRzIG1heSBpZGVudGlmeSBhcyB0aGF0IHJvbGUKLXdoZW4gY29ubmVjdGluZy4gRm9yIHRoZSBkdXJhdGlvbiBvZiB0aGF0IGNvbm5lY3Rpb24sIHRoZSBjbGllbnQgd2lsbAotYWNxdWlyZSBhbnkgcm9sZXMgYW5kIHByaXZpbGVnZXMgZ3JhbnRlZCB0byB0aGF0IHJvbGUuCi0KLU9ubHkgYSBjbGllbnQgd2l0aCB3aXRoIHRoZSBgQ1JFQVRFYCBwZXJtaXNzaW9uIG9uIHRoZSBkYXRhYmFzZSByb2xlcwotcmVzb3VyY2UgbWF5IGlzc3VlIGBDUkVBVEUgUk9MRWAgcmVxdWVzdHMgKHNlZSB0aGUKLXhyZWY6Y3FsL3NlY3VyaXR5LmFkb2MjY3FsLXBlcm1pc3Npb25zW3JlbGV2YW50IHNlY3Rpb25dKSwgdW5sZXNzIHRoZSBjbGllbnQgaXMgYQotYFNVUEVSVVNFUmAuIFJvbGUgbWFuYWdlbWVudCBpbiBDYXNzYW5kcmEgaXMgcGx1Z2dhYmxlIGFuZCBjdXN0b20KLWltcGxlbWVudGF0aW9ucyBtYXkgc3VwcG9ydCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBsaXN0ZWQgb3B0aW9ucy4KLQotUm9sZSBuYW1lcyBzaG91bGQgYmUgcXVvdGVkIGlmIHRoZXkgY29udGFpbiBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuCi0KLT09PT0gU2V0dGluZyBjcmVkZW50aWFscyBmb3IgaW50ZXJuYWwgYXV0aGVudGljYXRpb24KLQotVXNlIHRoZSBgV0lUSCBQQVNTV09SRGAgY2xhdXNlIHRvIHNldCBhIHBhc3N3b3JkIGZvciBpbnRlcm5hbAotYXV0aGVudGljYXRpb24sIGVuY2xvc2luZyB0aGUgcGFzc3dvcmQgaW4gc2luZ2xlIHF1b3RhdGlvbiBtYXJrcy4KLQotSWYgaW50ZXJuYWwgYXV0aGVudGljYXRpb24gaGFzIG5vdCBiZWVuIHNldCB1cCBvciB0aGUgcm9sZSBkb2VzIG5vdCBoYXZlCi1gTE9HSU5gIHByaXZpbGVnZXMsIHRoZSBgV0lUSCBQQVNTV09SRGAgY2xhdXNlIGlzIG5vdCBuZWNlc3NhcnkuCi0KLVVTRSBgV0lUSCBIQVNIRUQgUEFTU1dPUkRgIHRvIHByb3ZpZGUgdGhlIGpCY3J5cHQgaGFzaGVkIHBhc3N3b3JkIGRpcmVjdGx5LiBTZWUgdGhlIGBoYXNoX3Bhc3N3b3JkYCB0b29sLgotCi09PT09IFJlc3RyaWN0aW5nIGNvbm5lY3Rpb25zIHRvIHNwZWNpZmljIGRhdGFjZW50ZXJzCi0KLUlmIGEgYG5ldHdvcmtfYXV0aG9yaXplcmAgaGFzIGJlZW4gY29uZmlndXJlZCwgeW91IGNhbiByZXN0cmljdCBsb2dpbgotcm9sZXMgdG8gc3BlY2lmaWMgZGF0YWNlbnRlcnMgd2l0aCB0aGUgYEFDQ0VTUyBUTyBEQVRBQ0VOVEVSU2AgY2xhdXNlCi1mb2xsb3dlZCBieSBhIHNldCBsaXRlcmFsIG9mIGRhdGFjZW50ZXJzIHRoZSB1c2VyIGNhbiBhY2Nlc3MuIE5vdAotc3BlY2lmaXlpbmcgZGF0YWNlbnRlcnMgaW1wbGljaXRseSBncmFudHMgYWNjZXNzIHRvIGFsbCBkYXRhY2VudGVycy4gVGhlCi1jbGF1c2UgYEFDQ0VTUyBUTyBBTEwgREFUQUNFTlRFUlNgIGNhbiBiZSB1c2VkIGZvciBleHBsaWNpdG5lc3MsIGJ1dAotdGhlcmUncyBubyBmdW5jdGlvbmFsIGRpZmZlcmVuY2UuCi0KLT09PT0gQ3JlYXRpbmcgYSByb2xlIGNvbmRpdGlvbmFsbHkKLQotQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gZXhpc3Rpbmcgcm9sZSByZXN1bHRzIGluIGFuIGludmFsaWQgcXVlcnkKLWNvbmRpdGlvbiB1bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgdGhlIG9wdGlvbiBpcwotdXNlZCBhbmQgdGhlIHJvbGUgZXhpc3RzLCB0aGUgc3RhdGVtZW50IGlzIGEgbm8tb3A6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3JvbGVfaWZub3RleGlzdHMuY3FsW10KLS0tLS0KLQotW1thbHRlci1yb2xlLXN0YXRlbWVudF1dCi09PT0gQUxURVIgUk9MRQotCi1BbHRlcmluZyBhIHJvbGUgb3B0aW9ucyB1c2VzIHRoZSBgQUxURVIgUk9MRWAgc3RhdGVtZW50OgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9hbHRlcl9yb2xlX3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9hbHRlcl9yb2xlLmNxbFtdCi0tLS0tCi1JZiB0aGUgcm9sZSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0KLVVTRSBgV0lUSCBIQVNIRUQgUEFTU1dPUkRgIHRvIHByb3ZpZGUgdGhlIGpCY3J5cHQgaGFzaGVkIHBhc3N3b3JkIGRpcmVjdGx5LiBTZWUgdGhlIGBoYXNoX3Bhc3N3b3JkYCB0b29sLgotCi09PT09IFJlc3RyaWN0aW5nIGNvbm5lY3Rpb25zIHRvIHNwZWNpZmljIGRhdGFjZW50ZXJzCi0KLUlmIGEgYG5ldHdvcmtfYXV0aG9yaXplcmAgaGFzIGJlZW4gY29uZmlndXJlZCwgeW91IGNhbiByZXN0cmljdCBsb2dpbgotcm9sZXMgdG8gc3BlY2lmaWMgZGF0YWNlbnRlcnMgd2l0aCB0aGUgYEFDQ0VTUyBUTyBEQVRBQ0VOVEVSU2AgY2xhdXNlCi1mb2xsb3dlZCBieSBhIHNldCBsaXRlcmFsIG9mIGRhdGFjZW50ZXJzIHRoZSB1c2VyIGNhbiBhY2Nlc3MuIFRvIHJlbW92ZQotYW55IGRhdGEgY2VudGVyIHJlc3RyaWN0aW9ucywgdXNlIHRoZSBgQUNDRVNTIFRPIEFMTCBEQVRBQ0VOVEVSU2AKLWNsYXVzZS4KLQotQ29uZGl0aW9ucyBvbiBleGVjdXRpbmcgYEFMVEVSIFJPTEVgIHN0YXRlbWVudHM6Ci0KLSogYSBjbGllbnQgbXVzdCBoYXZlIGBTVVBFUlVTRVJgIHN0YXR1cyB0byBhbHRlciB0aGUgYFNVUEVSVVNFUmAgc3RhdHVzCi1vZiBhbm90aGVyIHJvbGUKLSogYSBjbGllbnQgY2Fubm90IGFsdGVyIHRoZSBgU1VQRVJVU0VSYCBzdGF0dXMgb2YgYW55IHJvbGUgaXQgY3VycmVudGx5Ci1ob2xkcwotKiBhIGNsaWVudCBjYW4gb25seSBtb2RpZnkgY2VydGFpbiBwcm9wZXJ0aWVzIG9mIHRoZSByb2xlIHdpdGggd2hpY2ggaXQKLWlkZW50aWZpZWQgYXQgbG9naW4gKGUuZy4gYFBBU1NXT1JEYCkKLSogdG8gbW9kaWZ5IHByb3BlcnRpZXMgb2YgYSByb2xlLCB0aGUgY2xpZW50IG11c3QgYmUgZ3JhbnRlZCBgQUxURVJgCi1gcGVybWlzc2lvbiA8Y3FsLXBlcm1pc3Npb25zPmAgb24gdGhhdCByb2xlCi0KLVtbZHJvcC1yb2xlLXN0YXRlbWVudF1dCi09PT0gRFJPUCBST0xFCi0KLURyb3BwaW5nIGEgcm9sZSB1c2VzIHRoZSBgRFJPUCBST0xFYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2Ryb3Bfcm9sZV9zdGF0ZW1lbnQuYm5mW10KLS0tLS0KLQotYERST1AgUk9MRWAgcmVxdWlyZXMgdGhlIGNsaWVudCB0byBoYXZlIGBEUk9QYAotYHBlcm1pc3Npb24gPGNxbC1wZXJtaXNzaW9ucz5gIG9uIHRoZSByb2xlIGluIHF1ZXN0aW9uLiBJbiBhZGRpdGlvbiwKLWNsaWVudCBtYXkgbm90IGBEUk9QYCB0aGUgcm9sZSB3aXRoIHdoaWNoIGl0IGlkZW50aWZpZWQgYXQgbG9naW4uCi1GaW5hbGx5LCBvbmx5IGEgY2xpZW50IHdpdGggYFNVUEVSVVNFUmAgc3RhdHVzIG1heSBgRFJPUGAgYW5vdGhlcgotYFNVUEVSVVNFUmAgcm9sZS4KLQotQXR0ZW1wdGluZyB0byBkcm9wIGEgcm9sZSB3aGljaCBkb2VzIG5vdCBleGlzdCByZXN1bHRzIGluIGFuIGludmFsaWQKLXF1ZXJ5IGNvbmRpdGlvbiB1bmxlc3MgdGhlIGBJRiBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiB0aGUgb3B0aW9uIGlzCi11c2VkIGFuZCB0aGUgcm9sZSBkb2VzIG5vdCBleGlzdCB0aGUgc3RhdGVtZW50IGlzIGEgbm8tb3AuCi0KLVtOT1RFXQotLk5vdGUKLT09PT0KLURST1AgUk9MRSBpbnRlbnRpb25hbGx5IGRvZXMgbm90IHRlcm1pbmF0ZSBhbnkgb3BlbiB1c2VyIHNlc3Npb25zLgotQ3VycmVudGx5IGNvbm5lY3RlZCBzZXNzaW9ucyB3aWxsIHJlbWFpbiBjb25uZWN0ZWQgYW5kIHdpbGwgcmV0YWluIHRoZQotYWJpbGl0eSB0byBwZXJmb3JtIGFueSBkYXRhYmFzZSBhY3Rpb25zIHdoaWNoIGRvIG5vdCByZXF1aXJlCi14cmVmOmNxbC9zZWN1cml0eS5hZG9jI2F1dGhvcml6YXRpb25bYXV0aG9yaXphdGlvbl0uIAotSG93ZXZlciwgaWYgYXV0aG9yaXphdGlvbiBpcyBlbmFibGVkLCB4cmVmOmNxbC9zZWN1cml0eS5hZG9jI2NxbC1wZXJtaXNzaW9uc1twZXJtaXNzaW9uc10gb2YgdGhlIGRyb3BwZWQgcm9sZSBhcmUgYWxzbyByZXZva2VkLAotc3ViamVjdCB0byB0aGUgeHJlZjpjcWwvc2VjdXJpdHkuYWRvYyNhdXRoLWNhY2hpbmdbY2FjaGluZyBvcHRpb25zXSBjb25maWd1cmVkIGluIHhyZWY6Y3FsL2NvbmZpZ3VyaW5nLmFkb2MjY2Fzc2FuZHJhLnlhbWxbY2Fzc2FuZHJhLXlhbWxdIGZpbGUuIAotU2hvdWxkIGEgZHJvcHBlZCByb2xlIGJlIHN1YnNlcXVlbnRseSByZWNyZWF0ZWQgYW5kIGhhdmUgbmV3IHhyZWY6c2VjdXJpdHkuYWRvYyNncmFudC1wZXJtaXNzaW9uLXN0YXRlbWVudFtwZXJtaXNzaW9uc10gb3IKLXhyZWY6c2VjdXJpdHkuYWRvYyNncmFudC1yb2xlLXN0YXRlbWVudFtyb2xlc11gIGdyYW50ZWQgdG8gaXQsIGFueSBjbGllbnQgc2Vzc2lvbnMgc3RpbGwKLWNvbm5lY3RlZCB3aWxsIGFjcXVpcmUgdGhlIG5ld2x5IGdyYW50ZWQgcGVybWlzc2lvbnMgYW5kIHJvbGVzLgotPT09PQotCi1bW2dyYW50LXJvbGUtc3RhdGVtZW50XV0KLT09PSBHUkFOVCBST0xFCi0KLUdyYW50aW5nIGEgcm9sZSB0byBhbm90aGVyIHVzZXMgdGhlIGBHUkFOVCBST0xFYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2dyYW50X3JvbGVfc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2dyYW50X3JvbGUuY3FsW10KLS0tLS0KLQotVGhpcyBzdGF0ZW1lbnQgZ3JhbnRzIHRoZSBgcmVwb3J0X3dyaXRlcmAgcm9sZSB0byBgYWxpY2VgLiBBbnkKLXBlcm1pc3Npb25zIGdyYW50ZWQgdG8gYHJlcG9ydF93cml0ZXJgIGFyZSBhbHNvIGFjcXVpcmVkIGJ5IGBhbGljZWAuCi0KLVJvbGVzIGFyZSBtb2RlbGxlZCBhcyBhIGRpcmVjdGVkIGFjeWNsaWMgZ3JhcGgsIHNvIGNpcmN1bGFyIGdyYW50cyBhcmUKLW5vdCBwZXJtaXR0ZWQuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgcmVzdWx0IGluIGVycm9yIGNvbmRpdGlvbnM6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvcm9sZV9lcnJvci5jcWxbXQotLS0tLQotCi1bW3Jldm9rZS1yb2xlLXN0YXRlbWVudF1dCi09PT0gUkVWT0tFIFJPTEUKLQotUmV2b2tpbmcgYSByb2xlIHVzZXMgdGhlIGBSRVZPS0UgUk9MRWAgc3RhdGVtZW50OgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9yZXZva2Vfcm9sZV9zdGF0ZW1lbnQuYm5mW10KLS0tLS0KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvcmV2b2tlX3JvbGUuY3FsW10KLS0tLS0KLQotVGhpcyBzdGF0ZW1lbnQgcmV2b2tlcyB0aGUgYHJlcG9ydF93cml0ZXJgIHJvbGUgZnJvbSBgYWxpY2VgLiBBbnkKLXBlcm1pc3Npb25zIHRoYXQgYGFsaWNlYCBoYXMgYWNxdWlyZWQgdmlhIHRoZSBgcmVwb3J0X3dyaXRlcmAgcm9sZSBhcmUKLWFsc28gcmV2b2tlZC4KLQotW1tsaXN0LXJvbGVzLXN0YXRlbWVudF1dCi09PT0gTElTVCBST0xFUwotCi1BbGwgdGhlIGtub3duIHJvbGVzIChpbiB0aGUgc3lzdGVtIG9yIGdyYW50ZWQgdG8gc3BlY2lmaWMgcm9sZSkgY2FuIGJlCi1saXN0ZWQgdXNpbmcgdGhlIGBMSVNUIFJPTEVTYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2xpc3Rfcm9sZXNfc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLUZvciBpbnN0YW5jZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9saXN0X3JvbGVzLmNxbFtdCi0tLS0tCi0KLXJldHVybnMgYWxsIGtub3duIHJvbGVzIGluIHRoZSBzeXN0ZW0sIHRoaXMgcmVxdWlyZXMgYERFU0NSSUJFYAotcGVybWlzc2lvbiBvbiB0aGUgZGF0YWJhc2Ugcm9sZXMgcmVzb3VyY2UuIAotCi1UaGlzIGV4YW1wbGUgZW51bWVyYXRlcyBhbGwgcm9sZXMgZ3JhbnRlZCB0byBgYWxpY2VgLCBpbmNsdWRpbmcgdGhvc2UgdHJhbnNpdGl2ZWx5Ci1hY3F1aXJlZDoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9saXN0X3JvbGVzX29mLmNxbFtdCi0tLS0tCi0KLVRoaXMgZXhhbXBsZSBsaXN0cyBhbGwgcm9sZXMgZGlyZWN0bHkgZ3JhbnRlZCB0byBgYm9iYCB3aXRob3V0IGluY2x1ZGluZyBhbnkgb2YgdGhlCi10cmFuc2l0aXZlbHkgYWNxdWlyZWQgb25lczoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9saXN0X3JvbGVzX25vbnJlY3Vyc2l2ZS5jcWxbXQotLS0tLQotCi09PSBVc2VycwotCi1QcmlvciB0byB0aGUgaW50cm9kdWN0aW9uIG9mIHJvbGVzIGluIENhc3NhbmRyYSAyLjIsIGF1dGhlbnRpY2F0aW9uIGFuZAotYXV0aG9yaXphdGlvbiB3ZXJlIGJhc2VkIGFyb3VuZCB0aGUgY29uY2VwdCBvZiBhIGBVU0VSYC4gRm9yIGJhY2t3YXJkCi1jb21wYXRpYmlsaXR5LCB0aGUgbGVnYWN5IHN5bnRheCBoYXMgYmVlbiBwcmVzZXJ2ZWQgd2l0aCBgVVNFUmAgY2VudHJpYwotc3RhdGVtZW50cyBiZWNvbWluZyBzeW5vbnltcyBmb3IgdGhlIGBST0xFYCBiYXNlZCBlcXVpdmFsZW50cy4gSW4gb3RoZXIKLXdvcmRzLCBjcmVhdGluZy91cGRhdGluZyBhIHVzZXIgaXMganVzdCBhIGRpZmZlcmVudCBzeW50YXggZm9yCi1jcmVhdGluZy91cGRhdGluZyBhIHJvbGUuCi0KLVtbY3JlYXRlLXVzZXItc3RhdGVtZW50XV0KLT09PSBDUkVBVEUgVVNFUgotCi1DcmVhdGluZyBhIHVzZXIgdXNlcyB0aGUgYENSRUFURSBVU0VSYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2NyZWF0ZV91c2VyX3N0YXRlbWVudC5ibmZbXQotLS0tLQotCi1Gb3IgZXhhbXBsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfdXNlci5jcWxbXQotLS0tLQotCi1UaGUgYENSRUFURSBVU0VSYCBjb21tYW5kIGlzIGVxdWl2YWxlbnQgdG8gYENSRUFURSBST0xFYCB3aGVyZSB0aGUgYExPR0lOYCBvcHRpb24gaXMgYHRydWVgLiAKLVNvLCB0aGUgZm9sbG93aW5nIHBhaXJzIG9mIHN0YXRlbWVudHMgYXJlIGVxdWl2YWxlbnQ6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3VzZXJfcm9sZS5jcWxbXQotLS0tLQotCi1bW2FsdGVyLXVzZXItc3RhdGVtZW50XV0KLT09PSBBTFRFUiBVU0VSCi0KLUFsdGVyaW5nIHRoZSBvcHRpb25zIG9mIGEgdXNlciB1c2VzIHRoZSBgQUxURVIgVVNFUmAgc3RhdGVtZW50OgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9hbHRlcl91c2VyX3N0YXRlbWVudC5ibmZbXQotLS0tLQotSWYgdGhlIHJvbGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvYWx0ZXJfdXNlci5jcWxbXQotLS0tLQotCi1bW2Ryb3AtdXNlci1zdGF0ZW1lbnRdXQotPT09IERST1AgVVNFUgotCi1Ecm9wcGluZyBhIHVzZXIgdXNlcyB0aGUgYERST1AgVVNFUmAgc3RhdGVtZW50OgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9kcm9wX3VzZXJfc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLVtbbGlzdC11c2Vycy1zdGF0ZW1lbnRdXQotPT09IExJU1QgVVNFUlMKLQotRXhpc3RpbmcgdXNlcnMgY2FuIGJlIGxpc3RlZCB1c2luZyB0aGUgYExJU1QgVVNFUlNgIHN0YXRlbWVudDoKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvbGlzdF91c2Vyc19zdGF0ZW1lbnQuYm5mW10KLS0tLS0KLQotTm90ZSB0aGF0IHRoaXMgc3RhdGVtZW50IGlzIGVxdWl2YWxlbnQgdG8geHJlZjpzZWN1cml0eS5hZG9jI2xpc3Qtcm9sZXMtc3RhdGVtZW50W2BMSVNUIFJPTEVTXSwgYnV0IG9ubHkgcm9sZXMgd2l0aCB0aGUgYExPR0lOYCBwcml2aWxlZ2UgYXJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCi0KLT09IERhdGEgQ29udHJvbAotCi1bW2NxbC1wZXJtaXNzaW9uc11dCi09PT0gUGVybWlzc2lvbnMKLQotUGVybWlzc2lvbnMgb24gcmVzb3VyY2VzIGFyZSBncmFudGVkIHRvIHJvbGVzOyB0aGVyZSBhcmUgc2V2ZXJhbAotZGlmZmVyZW50IHR5cGVzIG9mIHJlc291cmNlcyBpbiBDYXNzYW5kcmEgYW5kIGVhY2ggdHlwZSBpcyBtb2RlbGxlZAotaGllcmFyY2hpY2FsbHk6Ci0KLSogVGhlIGhpZXJhcmNoeSBvZiBEYXRhIHJlc291cmNlcywgS2V5c3BhY2VzIGFuZCBUYWJsZXMgaGFzIHRoZQotc3RydWN0dXJlIGBBTEwgS0VZU1BBQ0VTYCAtPiBgS0VZU1BBQ0VgIC0+IGBUQUJMRWAuCi0qIEZ1bmN0aW9uIHJlc291cmNlcyBoYXZlIHRoZSBzdHJ1Y3R1cmUgYEFMTCBGVU5DVElPTlNgIC0+IGBLRVlTUEFDRWAgLT4KLWBGVU5DVElPTmAKLSogUmVzb3VyY2VzIHJlcHJlc2VudGluZyByb2xlcyBoYXZlIHRoZSBzdHJ1Y3R1cmUgYEFMTCBST0xFU2AgLT4gYFJPTEVgCi0qIFJlc291cmNlcyByZXByZXNlbnRpbmcgSk1YIE9iamVjdE5hbWVzLCB3aGljaCBtYXAgdG8gc2V0cyBvZgotTUJlYW5zL01YQmVhbnMsIGhhdmUgdGhlIHN0cnVjdHVyZSBgQUxMIE1CRUFOU2AgLT4gYE1CRUFOYAotCi1QZXJtaXNzaW9ucyBjYW4gYmUgZ3JhbnRlZCBhdCBhbnkgbGV2ZWwgb2YgdGhlc2UgaGllcmFyY2hpZXMgYW5kIHRoZXkKLWZsb3cgZG93bndhcmRzLiBTbyBncmFudGluZyBhIHBlcm1pc3Npb24gb24gYSByZXNvdXJjZSBoaWdoZXIgdXAgdGhlCi1jaGFpbiBhdXRvbWF0aWNhbGx5IGdyYW50cyB0aGF0IHNhbWUgcGVybWlzc2lvbiBvbiBhbGwgcmVzb3VyY2VzIGxvd2VyCi1kb3duLiBGb3IgZXhhbXBsZSwgZ3JhbnRpbmcgYFNFTEVDVGAgb24gYSBgS0VZU1BBQ0VgIGF1dG9tYXRpY2FsbHkKLWdyYW50cyBpdCBvbiBhbGwgYFRBQkxFU2AgaW4gdGhhdCBgS0VZU1BBQ0VgLiBMaWtld2lzZSwgZ3JhbnRpbmcgYQotcGVybWlzc2lvbiBvbiBgQUxMIEZVTkNUSU9OU2AgZ3JhbnRzIGl0IG9uIGV2ZXJ5IGRlZmluZWQgZnVuY3Rpb24sCi1yZWdhcmRsZXNzIG9mIHdoaWNoIGtleXNwYWNlIGl0IGlzIHNjb3BlZCBpbi4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0bwotZ3JhbnQgcGVybWlzc2lvbnMgb24gYWxsIGZ1bmN0aW9ucyBzY29wZWQgdG8gYSBwYXJ0aWN1bGFyIGtleXNwYWNlLgotCi1Nb2RpZmljYXRpb25zIHRvIHBlcm1pc3Npb25zIGFyZSB2aXNpYmxlIHRvIGV4aXN0aW5nIGNsaWVudCBzZXNzaW9uczsKLXRoYXQgaXMsIGNvbm5lY3Rpb25zIG5lZWQgbm90IGJlIHJlLWVzdGFibGlzaGVkIGZvbGxvd2luZyBwZXJtaXNzaW9ucwotY2hhbmdlcy4KLQotVGhlIGZ1bGwgc2V0IG9mIGF2YWlsYWJsZSBwZXJtaXNzaW9ucyBpczoKLQotKiBgQ1JFQVRFYAotKiBgQUxURVJgCi0qIGBEUk9QYAotKiBgU0VMRUNUYAotKiBgTU9ESUZZYAotKiBgQVVUSE9SSVpFYAotKiBgREVTQ1JJQkVgCi0qIGBFWEVDVVRFYAotCi1Ob3QgYWxsIHBlcm1pc3Npb25zIGFyZSBhcHBsaWNhYmxlIHRvIGV2ZXJ5IHR5cGUgb2YgcmVzb3VyY2UuIEZvcgotaW5zdGFuY2UsIGBFWEVDVVRFYCBpcyBvbmx5IHJlbGV2YW50IGluIHRoZSBjb250ZXh0IG9mIGZ1bmN0aW9ucyBvcgotbWJlYW5zOyBncmFudGluZyBgRVhFQ1VURWAgb24gYSByZXNvdXJjZSByZXByZXNlbnRpbmcgYSB0YWJsZSBpcwotbm9uc2Vuc2ljYWwuIEF0dGVtcHRpbmcgdG8gYEdSQU5UYCBhIHBlcm1pc3Npb24gb24gcmVzb3VyY2UgdG8gd2hpY2ggaXQKLWNhbm5vdCBiZSBhcHBsaWVkIHJlc3VsdHMgaW4gYW4gZXJyb3IgcmVzcG9uc2UuIFRoZSBmb2xsb3dpbmcKLWlsbHVzdHJhdGVzIHdoaWNoIHBlcm1pc3Npb25zIGNhbiBiZSBncmFudGVkIG9uIHdoaWNoIHR5cGVzIG9mIHJlc291cmNlLAotYW5kIHdoaWNoIHN0YXRlbWVudHMgYXJlIGVuYWJsZWQgYnkgdGhhdCBwZXJtaXNzaW9uLgotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfFBlcm1pc3Npb24gfFJlc291cmNlIHxPcGVyYXRpb25zCi0KLXwgYENSRUFURWAgfCBgQUxMIEtFWVNQQUNFU2AgfCBgQ1JFQVRFIEtFWVNQQUNFYCBhbmQgYENSRUFURSBUQUJMRWAgaW4gYW55IGtleXNwYWNlCi0KLXwgYENSRUFURWAgfCBgS0VZU1BBQ0VgIHwgYENSRUFURSBUQUJMRWAgaW4gc3BlY2lmaWVkIGtleXNwYWNlCi0KLXwgYENSRUFURWAgfCBgQUxMIEZVTkNUSU9OU2AgfCBgQ1JFQVRFIEZVTkNUSU9OYCBpbiBhbnkga2V5c3BhY2UgYW5kIGBDUkVBVEUgQUdHUkVHQVRFYCBpbiBhbnkga2V5c3BhY2UKLQotfCBgQ1JFQVRFYCB8IGBBTEwgRlVOQ1RJT05TIElOIEtFWVNQQUNFYCB8IGBDUkVBVEUgRlVOQ1RJT05gIGFuZCBgQ1JFQVRFIEFHR1JFR0FURWAgaW4gc3BlY2lmaWVkIGtleXNwYWNlCi0KLXwgYENSRUFURWAgfCBgQUxMIFJPTEVTYCB8IGBDUkVBVEUgUk9MRWAKLQotfCBgQUxURVJgIHwgYEFMTCBLRVlTUEFDRVNgIHwgYEFMVEVSIEtFWVNQQUNFYCBhbmQgYEFMVEVSIFRBQkxFYCBpbiBhbnkga2V5c3BhY2UKLQotfCBgQUxURVJgIHwgYEtFWVNQQUNFYCB8IGBBTFRFUiBLRVlTUEFDRWAgYW5kIGBBTFRFUiBUQUJMRWAgaW4gc3BlY2lmaWVkIGtleXNwYWNlIAotCi18IGBBTFRFUmAgfCBgVEFCTEVgIHwgYEFMVEVSIFRBQkxFYAotCi18IGBBTFRFUmAgfCBgQUxMIEZVTkNUSU9OU2AgfCBgQ1JFQVRFIEZVTkNUSU9OYCBhbmQgYENSRUFURSBBR0dSRUdBVEVgOiByZXBsYWNpbmcgYW55IGV4aXN0aW5nCi0KLXwgYEFMVEVSYCB8IGBBTEwgRlVOQ1RJT05TIElOIEtFWVNQQUNFYCB8IGBDUkVBVEUgRlVOQ1RJT05gIGFuZCBgQ1JFQVRFIEFHR1JFR0FURWA6IHJlcGxhY2luZyBleGlzdGluZyBpbiBzcGVjaWZpZWQga2V5c3BhY2UKLQotfCBgQUxURVJgIHwgYEZVTkNUSU9OYCB8IGBDUkVBVEUgRlVOQ1RJT05gIGFuZCBgQ1JFQVRFIEFHR1JFR0FURWA6IHJlcGxhY2luZyBleGlzdGluZwotCi18IGBBTFRFUmAgfCBgQUxMIFJPTEVTYCB8IGBBTFRFUiBST0xFYCBvbiBhbnkgcm9sZQotCi18IGBBTFRFUmAgfCBgUk9MRWAgfCBgQUxURVIgUk9MRWAKLQotfCBgRFJPUGAgfCBgQUxMIEtFWVNQQUNFU2AgfCBgRFJPUCBLRVlTUEFDRWAgYW5kIGBEUk9QIFRBQkxFYCBpbiBhbnkga2V5c3BhY2UKLQotfCBgRFJPUGAgfCBgS0VZU1BBQ0VgIHwgYERST1AgVEFCTEVgIGluIHNwZWNpZmllZCBrZXlzcGFjZQotCi18IGBEUk9QYCB8IGBUQUJMRWAgfCBgRFJPUCBUQUJMRWAKLQotfCBgRFJPUGAgfCBgQUxMIEZVTkNUSU9OU2AgfCBgRFJPUCBGVU5DVElPTmAgYW5kIGBEUk9QIEFHR1JFR0FURWAgaW4gYW55IGtleXNwYWNlCi0KLXwgYERST1BgIHwgYEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHwgYERST1AgRlVOQ1RJT05gIGFuZCBgRFJPUCBBR0dSRUdBVEVgIGluIHNwZWNpZmllZCBrZXlzcGFjZQotCi18IGBEUk9QYCB8IGBGVU5DVElPTmAgfCBgRFJPUCBGVU5DVElPTmAKLQotfCBgRFJPUGAgfCBgQUxMIFJPTEVTYCB8IGBEUk9QIFJPTEVgIG9uIGFueSByb2xlCi0KLXwgYERST1BgIHwgYFJPTEVgIHwgYERST1AgUk9MRWAKLQotfCBgU0VMRUNUYCB8IGBBTEwgS0VZU1BBQ0VTYCB8IGBTRUxFQ1RgIG9uIGFueSB0YWJsZQotCi18IGBTRUxFQ1RgIHwgYEtFWVNQQUNFYCB8IGBTRUxFQ1RgIG9uIGFueSB0YWJsZSBpbiBzcGVjaWZpZWQga2V5c3BhY2UKLQotfCBgU0VMRUNUYCB8IGBUQUJMRWAgfCBgU0VMRUNUYCBvbiBzcGVjaWZpZWQgdGFibGUKLQotfCBgU0VMRUNUYCB8IGBBTEwgTUJFQU5TYCB8IENhbGwgZ2V0dGVyIG1ldGhvZHMgb24gYW55IG1iZWFuCi0KLXwgYFNFTEVDVGAgfCBgTUJFQU5TYCB8IENhbGwgZ2V0dGVyIG1ldGhvZHMgb24gYW55IG1iZWFuIG1hdGNoaW5nIGEgd2lsZGNhcmQgcGF0dGVybiAKLQotfCBgU0VMRUNUYCB8IGBNQkVBTmAgfCBDYWxsIGdldHRlciBtZXRob2RzIG9uIG5hbWVkIG1iZWFuCi0KLXwgYE1PRElGWWAgfCBgQUxMIEtFWVNQQUNFU2AgfCBgSU5TRVJUYCwgYFVQREFURWAsIGBERUxFVEVgIGFuZCBgVFJVTkNBVEVgIG9uIGFueSB0YWJsZQotCi18IGBNT0RJRllgIHwgYEtFWVNQQUNFYCB8IGBJTlNFUlRgLCBgVVBEQVRFYCwgYERFTEVURWAgYW5kIGBUUlVOQ0FURWAgb24gYW55IHRhYmxlIGluIHNwZWNpZmllZAota2V5c3BhY2UKLQotfCBgTU9ESUZZYCB8IGBUQUJMRWAgfCBgSU5TRVJUYCwgYFVQREFURWAsIGBERUxFVEVgIGFuZCBgVFJVTkNBVEVgIG9uIHNwZWNpZmllZCB0YWJsZQotCi18IGBNT0RJRllgIHwgYEFMTCBNQkVBTlNgIHwgQ2FsbCBzZXR0ZXIgbWV0aG9kcyBvbiBhbnkgbWJlYW4KLQotfCBgTU9ESUZZYCB8IGBNQkVBTlNgIHwgQ2FsbCBzZXR0ZXIgbWV0aG9kcyBvbiBhbnkgbWJlYW4gbWF0Y2hpbmcgYSB3aWxkY2FyZCBwYXR0ZXJuCi0KLXwgYE1PRElGWWAgfCBgTUJFQU5gIHwgQ2FsbCBzZXR0ZXIgbWV0aG9kcyBvbiBuYW1lZCBtYmVhbgotCi18IGBBVVRIT1JJWkVgIHwgYEFMTCBLRVlTUEFDRVNgIHwgYEdSQU5UIFBFUk1JU1NJT05gIGFuZCBgUkVWT0tFIFBFUk1JU1NJT05gIG9uIGFueSB0YWJsZQotCi18IGBBVVRIT1JJWkVgIHwgYEtFWVNQQUNFYCB8IGBHUkFOVCBQRVJNSVNTSU9OYCBhbmQgYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBhbnkgdGFibGUgaW4gc3BlY2lmaWVkIGtleXNwYWNlCi0KLXwgYEFVVEhPUklaRWAgfCBgVEFCTEVgIHwgYEdSQU5UIFBFUk1JU1NJT05gIGFuZCBgUkVWT0tFIFBFUk1JU1NJT05gIG9uIHNwZWNpZmllZCB0YWJsZQotCi18IGBBVVRIT1JJWkVgIHwgYEFMTCBGVU5DVElPTlNgIHwgYEdSQU5UIFBFUk1JU1NJT05gIGFuZCBgUkVWT0tFIFBFUk1JU1NJT05gIG9uIGFueSBmdW5jdGlvbgotCi18IGBBVVRIT1JJWkVgIHwgYEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHwgYEdSQU5UIFBFUk1JU1NJT05gIGFuZCBgUkVWT0tFIFBFUk1JU1NJT05gIGluIHNwZWNpZmllZCBrZXlzcGFjZQotCi18IGBBVVRIT1JJWkVgIHwgYEZVTkNUSU9OYCB8IGBHUkFOVCBQRVJNSVNTSU9OYCBhbmQgYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBzcGVjaWZpZWQgZnVuY3Rpb24KLQotfCBgQVVUSE9SSVpFYCB8IGBBTEwgTUJFQU5TYCB8IGBHUkFOVCBQRVJNSVNTSU9OYCBhbmQgYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBhbnkgbWJlYW4KLQotfCBgQVVUSE9SSVpFYCB8IGBNQkVBTlNgIHwgYEdSQU5UIFBFUk1JU1NJT05gIGFuZCBgUkVWT0tFIFBFUk1JU1NJT05gIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhIHdpbGRjYXJkIHBhdHRlcm4KLQotfCBgQVVUSE9SSVpFYCB8IGBNQkVBTmAgfCBgR1JBTlQgUEVSTUlTU0lPTmAgYW5kIGBSRVZPS0UgUEVSTUlTU0lPTmAgb24gbmFtZWQgbWJlYW4KLQotfCBgQVVUSE9SSVpFYCB8IGBBTEwgUk9MRVNgIHwgYEdSQU5UIFJPTEVgIGFuZCBgUkVWT0tFIFJPTEVgIG9uIGFueSByb2xlCi0KLXwgYEFVVEhPUklaRWAgfCBgUk9MRVNgIHwgYEdSQU5UIFJPTEVgIGFuZCBgUkVWT0tFIFJPTEVgIG9uIHNwZWNpZmllZCByb2xlcwotCi18IGBERVNDUklCRWAgfCBgQUxMIFJPTEVTYCB8IGBMSVNUIFJPTEVTYCBvbiBhbGwgcm9sZXMgb3Igb25seSByb2xlcyBncmFudGVkIHRvIGFub3RoZXIsIHNwZWNpZmllZCByb2xlCi0KLXwgYERFU0NSSUJFYCB8IGBBTEwgTUJFQU5TYCB8IFJldHJpZXZlIG1ldGFkYXRhIGFib3V0IGFueSBtYmVhbiBmcm9tIHRoZSBwbGF0Zm9ybSdzIE1CZWFuU2VydmVyCi0KLQotfCBgREVTQ1JJQkVgIHwgYE1CRUFOU2AgfCBSZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBhbnkgbWJlYW4gbWF0Y2hpbmcgYSB3aWxkY2FyZCBwYXR0ZXIgZnJvbSB0aGUKLXBsYXRmb3JtJ3MgTUJlYW5TZXJ2ZXIKLQotfCBgREVTQ1JJQkVgIHwgYE1CRUFOYCB8IFJldHJpZXZlIG1ldGFkYXRhIGFib3V0IGEgbmFtZWQgbWJlYW4gZnJvbSB0aGUgcGxhdGZvcm0ncyBNQmVhblNlcnZlcgotCi18IGBFWEVDVVRFYCB8IGBBTEwgRlVOQ1RJT05TYCB8IGBTRUxFQ1RgLCBgSU5TRVJUYCBhbmQgYFVQREFURWAgdXNpbmcgYW55IGZ1bmN0aW9uLCBhbmQgdXNlIG9mIGFueQotZnVuY3Rpb24gaW4gYENSRUFURSBBR0dSRUdBVEVgCi0KLXwgYEVYRUNVVEVgIHwgYEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHwgYFNFTEVDVGAsIGBJTlNFUlRgIGFuZCBgVVBEQVRFYCB1c2luZyBhbnkgZnVuY3Rpb24gaW4gc3BlY2lmaWVkIGtleXNwYWNlCi1hbmQgdXNlIG9mIGFueSBmdW5jdGlvbiBpbiBrZXlzcGFjZSBpbiBgQ1JFQVRFIEFHR1JFR0FURWAKLQotfCBgRVhFQ1VURWAgfCBgRlVOQ1RJT05gIHwgYFNFTEVDVGAsIGBJTlNFUlRgIGFuZCBgVVBEQVRFYCB1c2luZyBzcGVjaWZpZWQgZnVuY3Rpb24gYW5kIHVzZSBvZiB0aGUgZnVuY3Rpb24gaW4gYENSRUFURSBBR0dSRUdBVEVgCi0KLXwgYEVYRUNVVEVgIHwgYEFMTCBNQkVBTlNgIHwgRXhlY3V0ZSBvcGVyYXRpb25zIG9uIGFueSBtYmVhbgotCi18IGBFWEVDVVRFYCB8IGBNQkVBTlNgIHwgRXhlY3V0ZSBvcGVyYXRpb25zIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhIHdpbGRjYXJkIHBhdHRlcm4KLQotfCBgRVhFQ1VURWAgfCBgTUJFQU5gIHwgRXhlY3V0ZSBvcGVyYXRpb25zIG9uIG5hbWVkIG1iZWFuCi18PT09Ci0KLVtbZ3JhbnQtcGVybWlzc2lvbi1zdGF0ZW1lbnRdXQotPT09IEdSQU5UIFBFUk1JU1NJT04KLQotR3JhbnRpbmcgYSBwZXJtaXNzaW9uIHVzZXMgdGhlIGBHUkFOVCBQRVJNSVNTSU9OYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2dyYW50X3Blcm1pc3Npb25fc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2dyYW50X3Blcm0uY3FsW10KLS0tLS0KLQotVGhpcyBleGFtcGxlIGdpdmVzIGFueSB1c2VyIHdpdGggdGhlIHJvbGUgYGRhdGFfcmVhZGVyYCBwZXJtaXNzaW9uIHRvIGV4ZWN1dGUKLWBTRUxFQ1RgIHN0YXRlbWVudHMgb24gYW55IHRhYmxlIGFjcm9zcyBhbGwga2V5c3BhY2VzOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2dyYW50X21vZGlmeS5jcWxbXQotLS0tLQotCi1UbyBnaXZlIGFueSB1c2VyIHdpdGggdGhlIHJvbGUgYGRhdGFfd3JpdGVyYCBwZXJtaXNzaW9uIHRvIHBlcmZvcm0KLWBVUERBVEVgLCBgSU5TRVJUYCwgYFVQREFURWAsIGBERUxFVEVgIGFuZCBgVFJVTkNBVEVgIHF1ZXJpZXMgb24gYWxsCi10YWJsZXMgaW4gdGhlIGBrZXlzcGFjZTFgIGtleXNwYWNlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2dyYW50X2Ryb3AuY3FsW10KLS0tLS0KLQotVG8gZ2l2ZSBhbnkgdXNlciB3aXRoIHRoZSBgc2NoZW1hX293bmVyYCByb2xlIHBlcm1pc3Npb25zIHRvIGBEUk9QYCBhIHNwZWNpZmljCi1ga2V5c3BhY2UxLnRhYmxlMWA6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvZ3JhbnRfZXhlY3V0ZS5jcWxbXQotLS0tLQotCi1UaGlzIGNvbW1hbmQgZ3JhbnRzIGFueSB1c2VyIHdpdGggdGhlIGByZXBvcnRfd3JpdGVyYCByb2xlIHBlcm1pc3Npb24gdG8gZXhlY3V0ZQotYFNFTEVDVGAsIGBJTlNFUlRgIGFuZCBgVVBEQVRFYCBxdWVyaWVzIHdoaWNoIHVzZSB0aGUgZnVuY3Rpb24KLWBrZXlzcGFjZTEudXNlcl9mdW5jdGlvbiggaW50IClgOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2dyYW50X2Rlc2NyaWJlLmNxbFtdCi0tLS0tCi0KLVRoaXMgZ3JhbnRzIGFueSB1c2VyIHdpdGggdGhlIGByb2xlX2FkbWluYCByb2xlIHBlcm1pc3Npb24gdG8gdmlldyBhbnkKLWFuZCBhbGwgcm9sZXMgaW4gdGhlIHN5c3RlbSB3aXRoIGEgYExJU1QgUk9MRVNgIHN0YXRlbWVudC4KLQotPT09PSBHUkFOVCBBTEwKLQotV2hlbiB0aGUgYEdSQU5UIEFMTGAgZm9ybSBpcyB1c2VkLCB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHBlcm1pc3Npb25zIGlzCi1kZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIHRhcmdldCByZXNvdXJjZS4KLQotPT09PSBBdXRvbWF0aWMgR3JhbnRpbmcKLQotV2hlbiBhIHJlc291cmNlIGlzIGNyZWF0ZWQsIHZpYSBhIGBDUkVBVEUgS0VZU1BBQ0VgLCBgQ1JFQVRFIFRBQkxFYCwKLWBDUkVBVEUgRlVOQ1RJT05gLCBgQ1JFQVRFIEFHR1JFR0FURWAgb3IgYENSRUFURSBST0xFYCBzdGF0ZW1lbnQsIHRoZQotY3JlYXRvciAodGhlIHJvbGUgdGhlIGRhdGFiYXNlIHVzZXIgd2hvIGlzc3VlcyB0aGUgc3RhdGVtZW50IGlzCi1pZGVudGlmaWVkIGFzKSwgaXMgYXV0b21hdGljYWxseSBncmFudGVkIGFsbCBhcHBsaWNhYmxlIHBlcm1pc3Npb25zIG9uCi10aGUgbmV3IHJlc291cmNlLgotCi1bW3Jldm9rZS1wZXJtaXNzaW9uLXN0YXRlbWVudF1dCi09PT0gUkVWT0tFIFBFUk1JU1NJT04KLQotUmV2b2tpbmcgYSBwZXJtaXNzaW9uIGZyb20gYSByb2xlIHVzZXMgdGhlIGBSRVZPS0UgUEVSTUlTU0lPTmAKLXN0YXRlbWVudDoKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvcmV2b2tlX3Blcm1pc3Npb25fc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3Jldm9rZV9wZXJtLmNxbFtdCi0tLS0tCi0KLUJlY2F1c2Ugb2YgdGhlaXIgZnVuY3Rpb24gaW4gbm9ybWFsIGRyaXZlciBvcGVyYXRpb25zLCBjZXJ0YWluIHRhYmxlcwotY2Fubm90IGhhdmUgdGhlaXIgYFNFTEVDVGAgcGVybWlzc2lvbnMgcmV2b2tlZC4gVGhlCi1mb2xsb3dpbmcgdGFibGVzIHdpbGwgYmUgYXZhaWxhYmxlIHRvIGFsbCBhdXRob3JpemVkIHVzZXJzIHJlZ2FyZGxlc3Mgb2YKLXRoZWlyIGFzc2lnbmVkIHJvbGU6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvbm9fcmV2b2tlLmNxbFtdCi0tLS0tCi0KLVtbbGlzdC1wZXJtaXNzaW9ucy1zdGF0ZW1lbnRdXQotPT09IExJU1QgUEVSTUlTU0lPTlMKLQotTGlzdGluZyBncmFudGVkIHBlcm1pc3Npb25zIHVzZXMgdGhlIGBMSVNUIFBFUk1JU1NJT05TYCBzdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2xpc3RfcGVybWlzc2lvbnNfc3RhdGVtZW50LmJuZltdCi0tLS0tCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2xpc3RfcGVybS5jcWxbXQotLS0tLQotCi1TaG93IGFsbCBwZXJtaXNzaW9ucyBncmFudGVkIHRvIGBhbGljZWAsIGluY2x1ZGluZyB0aG9zZSBhY3F1aXJlZAotdHJhbnNpdGl2ZWx5IGZyb20gYW55IG90aGVyIHJvbGVzOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2xpc3RfYWxsX3Blcm0uY3FsW10KLS0tLS0KLQotU2hvdyBhbGwgcGVybWlzc2lvbnMgb24gYGtleXNwYWNlMS50YWJsZTFgIGdyYW50ZWQgdG8gYGJvYmAsIGluY2x1ZGluZwotdGhvc2UgYWNxdWlyZWQgdHJhbnNpdGl2ZWx5IGZyb20gYW55IG90aGVyIHJvbGVzLiBUaGlzIGFsc28gaW5jbHVkZXMgYW55Ci1wZXJtaXNzaW9ucyBoaWdoZXIgdXAgdGhlIHJlc291cmNlIGhpZXJhcmNoeSB3aGljaCBjYW4gYmUgYXBwbGllZCB0bwotYGtleXNwYWNlMS50YWJsZTFgLiBGb3IgZXhhbXBsZSwgc2hvdWxkIGBib2JgIGhhdmUgYEFMVEVSYCBwZXJtaXNzaW9uIG9uCi1ga2V5c3BhY2UxYCwgdGhhdCB3b3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0cyBvZiB0aGlzIHF1ZXJ5LiBBZGRpbmcKLXRoZSBgTk9SRUNVUlNJVkVgIHN3aXRjaCByZXN0cmljdHMgdGhlIHJlc3VsdHMgdG8gb25seSB0aG9zZSBwZXJtaXNzaW9ucwotd2hpY2ggd2VyZSBkaXJlY3RseSBncmFudGVkIHRvIGBib2JgIG9yIG9uZSBvZiBgYm9iYCdzIHJvbGVzOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2xpc3Rfc2VsZWN0X3Blcm0uY3FsW10KLS0tLS0KLQotU2hvdyBhbnkgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byBgY2FybG9zYCBvciBhbnkgb2YgYGNhcmxvc2AncyByb2xlcywKLWxpbWl0ZWQgdG8gYFNFTEVDVGAgcGVybWlzc2lvbnMgb24gYW55IHJlc291cmNlLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC90eXBlcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC90eXBlcy5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M3OGI1Li4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvdHlwZXMuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDUzOSArMCwwIEBACi09IERhdGEgVHlwZXMKLQotQ1FMIGlzIGEgdHlwZWQgbGFuZ3VhZ2UgYW5kIHN1cHBvcnRzIGEgcmljaCBzZXQgb2YgZGF0YSB0eXBlcywgaW5jbHVkaW5nCi14cmVmOmNxbC90eXBlcy5hZG9jI25hdGl2ZS10eXBlc1tuYXRpdmUgdHlwZXNdLCB4cmVmOmNxbC90eXBlcy5hZG9jI2NvbGxlY3Rpb25zW2NvbGxlY3Rpb24gdHlwZXNdLAoteHJlZjpjcWwvdHlwZXMuYWRvYyN1ZHRzW3VzZXItZGVmaW5lZCB0eXBlc10sIHhyZWY6Y3FsL3R5cGVzLmFkb2MjdHVwbGVzW3R1cGxlIHR5cGVzXSwgYW5kIHhyZWY6Y3FsL3R5cGVzLmFkb2MjY3VzdG9tLXR5cGVzW2N1c3RvbQotdHlwZXNdOgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9jcWxfdHlwZS5ibmZbXQotLS0tLQotCi09PSBOYXRpdmUgdHlwZXMKLQotVGhlIG5hdGl2ZSB0eXBlcyBzdXBwb3J0ZWQgYnkgQ1FMIGFyZToKLQotW3NvdXJjZSwgYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvbmF0aXZlX3R5cGUuYm5mW10KLS0tLS0KLQotVGhlIGZvbGxvd2luZyB0YWJsZSBnaXZlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9ucyBvbiB0aGUgbmF0aXZlIGRhdGEKLXR5cGVzLCBhbmQgb24gd2hpY2gga2luZCBvZiB4cmVmOmNxbC9kZWZpbml0aW9ucy5hZG9jI2NvbnN0YW50c1tjb25zdGFudHNdIGVhY2ggdHlwZSBzdXBwb3J0czoKLQotW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXwgVHlwZSB8IENvbnN0YW50cyBzdXBwb3J0ZWQgfCBEZXNjcmlwdGlvbgotCi18IGBhc2NpaWAgfCBgc3RyaW5nYCB8IEFTQ0lJIGNoYXJhY3RlciBzdHJpbmcKLXwgYGJpZ2ludGAgfCBgaW50ZWdlcmAgfCA2NC1iaXQgc2lnbmVkIGxvbmcKLXwgYGJsb2JgIHwgYGJsb2JgIHwgQXJiaXRyYXJ5IGJ5dGVzIChubyB2YWxpZGF0aW9uKQotfCBgYm9vbGVhbmAgfCBgYm9vbGVhbmAgfCBFaXRoZXIgYHRydWVgIG9yIGBmYWxzZWAgCi18IGBjb3VudGVyYCB8IGBpbnRlZ2VyYCB8IENvdW50ZXIgY29sdW1uICg2NC1iaXQgc2lnbmVkIHZhbHVlKS4gU2VlIGBjb3VudGVyc2AgZm9yIGRldGFpbHMuCi18IGBkYXRlYCB8IGBpbnRlZ2VyYCwgYHN0cmluZ2AgfCBBIGRhdGUgKHdpdGggbm8gY29ycmVzcG9uZGluZyB0aW1lIHZhbHVlKS4gU2VlIGBkYXRlc2AgYmVsb3cgZm9yIGRldGFpbHMuCi18IGBkZWNpbWFsYCB8IGBpbnRlZ2VyYCwgYGZsb2F0YCB8IFZhcmlhYmxlLXByZWNpc2lvbiBkZWNpbWFsCi18IGBkb3VibGVgIHwgYGludGVnZXJgIGBmbG9hdGAgfCA2NC1iaXQgSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQKLXwgYGR1cmF0aW9uYCB8IGBkdXJhdGlvbmAsIHwgQSBkdXJhdGlvbiB3aXRoIG5hbm9zZWNvbmQgcHJlY2lzaW9uLiBTZWUgYGR1cmF0aW9uc2AgYmVsb3cgZm9yIGRldGFpbHMuCi18IGBmbG9hdGAgfCBgaW50ZWdlcmAsIGBmbG9hdGAgfCAzMi1iaXQgSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQKLXwgYGluZXRgIHwgYHN0cmluZ2AgfCBBbiBJUCBhZGRyZXNzLCBlaXRoZXIgSVB2NCAoNCBieXRlcyBsb25nKSBvciBJUHY2ICgxNiBieXRlcyBsb25nKS4gTm90ZQotdGhhdCB0aGVyZSBpcyBubyBgaW5ldGAgY29uc3RhbnQsIElQIGFkZHJlc3Mgc2hvdWxkIGJlIGlucHV0IGFzIHN0cmluZ3MuCi18IGBpbnRgIHwgYGludGVnZXJgIHwgMzItYml0IHNpZ25lZCBpbnQKLXwgYHNtYWxsaW50YCB8IGBpbnRlZ2VyYCB8IDE2LWJpdCBzaWduZWQgaW50Ci18IGB0ZXh0YCB8IGBzdHJpbmdgIHwgVVRGOCBlbmNvZGVkIHN0cmluZwotfCBgdGltZWAgfCBgaW50ZWdlcmAsIGBzdHJpbmdgIHwgQSB0aW1lICh3aXRoIG5vIGNvcnJlc3BvbmRpbmcgZGF0ZSB2YWx1ZSkgd2l0aCBuYW5vc2Vjb25kIHByZWNpc2lvbi4gU2VlCi1gdGltZXNgIGJlbG93IGZvciBkZXRhaWxzLgotfCBgdGltZXN0YW1wYCB8IGBpbnRlZ2VyYCwgYHN0cmluZ2AgfCBBIHRpbWVzdGFtcCAoZGF0ZSBhbmQgdGltZSkgd2l0aCBtaWxsaXNlY29uZCBwcmVjaXNpb24uIFNlZSBgdGltZXN0YW1wc2AKLWJlbG93IGZvciBkZXRhaWxzLgotfCBgdGltZXV1aWRgIHwgYHV1aWRgIHwgVmVyc2lvbiAxIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXZlcnNhbGx5X3VuaXF1ZV9pZGVudGlmaWVyW1VVSURdLAotZ2VuZXJhbGx5IHVzZWQgYXMgYSDigJxjb25mbGljdC1mcmVl4oCdIHRpbWVzdGFtcC4gQWxzbyBzZWUgYHRpbWV1dWlkLWZ1bmN0aW9uc2AuCi18IGB0aW55aW50YCB8IGBpbnRlZ2VyYCB8IDgtYml0IHNpZ25lZCBpbnQKLXwgYHV1aWRgIHwgYHV1aWRgIHwgQSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml2ZXJzYWxseV91bmlxdWVfaWRlbnRpZmllcltVVUlEXSAob2YgYW55IHZlcnNpb24pCi18IGB2YXJjaGFyYCB8IGBzdHJpbmdgIHwgVVRGOCBlbmNvZGVkIHN0cmluZwotfCBgdmFyaW50YCB8IGBpbnRlZ2VyYCB8IEFyYml0cmFyeS1wcmVjaXNpb24gaW50ZWdlcgotfD09PQotCi09PT0gQ291bnRlcnMKLQotVGhlIGBjb3VudGVyYCB0eXBlIGlzIHVzZWQgdG8gZGVmaW5lIF9jb3VudGVyIGNvbHVtbnNfLiBBIGNvdW50ZXIgY29sdW1uCi1pcyBhIGNvbHVtbiB3aG9zZSB2YWx1ZSBpcyBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciBhbmQgb24gd2hpY2ggMgotb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkOiBpbmNyZW1lbnRpbmcgYW5kIGRlY3JlbWVudGluZyAoc2VlIHRoZQoteHJlZjpjcWwvZG1sLmFkb2MjdXBkYXRlLXN0YXRlbWVudFtVUERBVEVdIHN0YXRlbWVudCBmb3Igc3ludGF4KS4gCi1Ob3RlIHRoYXQgdGhlIHZhbHVlIG9mIGEgY291bnRlciBjYW5ub3QKLWJlIHNldDogYSBjb3VudGVyIGRvZXMgbm90IGV4aXN0IHVudGlsIGZpcnN0IGluY3JlbWVudGVkL2RlY3JlbWVudGVkLAotYW5kIHRoYXQgZmlyc3QgaW5jcmVtZW50L2RlY3JlbWVudCBpcyBtYWRlIGFzIGlmIHRoZSBwcmlvciB2YWx1ZSB3YXMgMC4KLQotW1tjb3VudGVyLWxpbWl0YXRpb25zXV0KLUNvdW50ZXJzIGhhdmUgYSBudW1iZXIgb2YgaW1wb3J0YW50IGxpbWl0YXRpb25zOgotCi0qIFRoZXkgY2Fubm90IGJlIHVzZWQgZm9yIGNvbHVtbnMgcGFydCBvZiB0aGUgYFBSSU1BUlkgS0VZYCBvZiBhIHRhYmxlLgotKiBBIHRhYmxlIHRoYXQgY29udGFpbnMgYSBjb3VudGVyIGNhbiBvbmx5IGNvbnRhaW4gY291bnRlcnMuIEluIG90aGVyCi13b3JkcywgZWl0aGVyIGFsbCB0aGUgY29sdW1ucyBvZiBhIHRhYmxlIG91dHNpZGUgdGhlIGBQUklNQVJZIEtFWWAgaGF2ZQotdGhlIGBjb3VudGVyYCB0eXBlLCBvciBub25lIG9mIHRoZW0gaGF2ZSBpdC4KLSogQ291bnRlcnMgZG8gbm90IHN1cHBvcnQgeHJlZjpjcWwvZG1sLmFkb2Mjd3JpdGV0aW1lLWFuZC10dGwtZnVuY3Rpb25bZXhwaXJhdGlvbl0uCi0qIFRoZSBkZWxldGlvbiBvZiBjb3VudGVycyBpcyBzdXBwb3J0ZWQsIGJ1dCBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gd29yawotdGhlIGZpcnN0IHRpbWUgeW91IGRlbGV0ZSBhIGNvdW50ZXIuIEluIG90aGVyIHdvcmRzLCB5b3Ugc2hvdWxkIG5vdAotcmUtdXBkYXRlIGEgY291bnRlciB0aGF0IHlvdSBoYXZlIGRlbGV0ZWQgKGlmIHlvdSBkbywgcHJvcGVyIGJlaGF2aW9yIGlzCi1ub3QgZ3VhcmFudGVlZCkuCi0qIENvdW50ZXIgdXBkYXRlcyBhcmUsIGJ5IG5hdHVyZSwgbm90Ci1odHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JZGVtcG90ZW5jZVtpZGVtcHRvdGVudF0uIEFuIGltcG9ydGFudAotY29uc2VxdWVuY2UgaXMgdGhhdCBpZiBhIGNvdW50ZXIgdXBkYXRlIGZhaWxzIHVuZXhwZWN0ZWRseSAodGltZW91dCBvcgotbG9zcyBvZiBjb25uZWN0aW9uIHRvIHRoZSBjb29yZGluYXRvciBub2RlKSwgdGhlIGNsaWVudCBoYXMgbm8gd2F5IHRvCi1rbm93IGlmIHRoZSB1cGRhdGUgaGFzIGJlZW4gYXBwbGllZCBvciBub3QuIEluIHBhcnRpY3VsYXIsIHJlcGxheWluZyB0aGUKLXVwZGF0ZSBtYXkgb3IgbWF5IG5vdCBsZWFkIHRvIGFuIG92ZXIgY291bnQuCi0KLVtbdGltZXN0YW1wc11dCi09PSBXb3JraW5nIHdpdGggdGltZXN0YW1wcwotCi1WYWx1ZXMgb2YgdGhlIGB0aW1lc3RhbXBgIHR5cGUgYXJlIGVuY29kZWQgYXMgNjQtYml0IHNpZ25lZCBpbnRlZ2VycwotcmVwcmVzZW50aW5nIGEgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgc3RhbmRhcmQgYmFzZSB0aW1lIGtub3duCi1hcyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml4X3RpbWVbdGhlIGVwb2NoXTogSmFudWFyeSAxIDE5NzAgYXQKLTAwOjAwOjAwIEdNVC4KLQotVGltZXN0YW1wcyBjYW4gYmUgaW5wdXQgaW4gQ1FMIGVpdGhlciB1c2luZyB0aGVpciB2YWx1ZSBhcyBhbiBgaW50ZWdlcmAsCi1vciB1c2luZyBhIGBzdHJpbmdgIHRoYXQgcmVwcmVzZW50cyBhbgotaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDFbSVNPIDg2MDFdIGRhdGUuIEZvciBpbnN0YW5jZSwgYWxsCi1vZiB0aGUgdmFsdWVzIGJlbG93IGFyZSB2YWxpZCBgdGltZXN0YW1wYCB2YWx1ZXMgZm9yIE1hciAyLCAyMDExLCBhdAotMDQ6MDU6MDAgQU0sIEdNVDoKLQotKiBgMTI5OTAzODcwMDAwMGAKLSogYCcyMDExLTAyLTAzIDA0OjA1KzAwMDAnYAotKiBgJzIwMTEtMDItMDMgMDQ6MDU6MDArMDAwMCdgCi0qIGAnMjAxMS0wMi0wMyAwNDowNTowMC4wMDArMDAwMCdgCi0qIGAnMjAxMS0wMi0wM1QwNDowNSswMDAwJ2AKLSogYCcyMDExLTAyLTAzVDA0OjA1OjAwKzAwMDAnYAotKiBgJzIwMTEtMDItMDNUMDQ6MDU6MDAuMDAwKzAwMDAnYAotCi1UaGUgYCswMDAwYCBhYm92ZSBpcyBhbiBSRkMgODIyIDQtZGlnaXQgdGltZSB6b25lIHNwZWNpZmljYXRpb247IGArMDAwMGAKLXJlZmVycyB0byBHTVQuIFVTIFBhY2lmaWMgU3RhbmRhcmQgVGltZSBpcyBgLTA4MDBgLiBUaGUgdGltZSB6b25lIG1heSBiZQotb21pdHRlZCBpZiBkZXNpcmVkIChgJzIwMTEtMDItMDMgMDQ6MDU6MDAnYCksIGFuZCBpZiBzbywgdGhlIGRhdGUgd2lsbAotYmUgaW50ZXJwcmV0ZWQgYXMgYmVpbmcgaW4gdGhlIHRpbWUgem9uZSB1bmRlciB3aGljaCB0aGUgY29vcmRpbmF0aW5nCi1DYXNzYW5kcmEgbm9kZSBpcyBjb25maWd1cmVkLiBUaGVyZSBhcmUgaG93ZXZlciBkaWZmaWN1bHRpZXMgaW5oZXJlbnQgaW4KLXJlbHlpbmcgb24gdGhlIHRpbWUgem9uZSBjb25maWd1cmF0aW9uIGJlaW5nIGFzIGV4cGVjdGVkLCBzbyBpdCBpcwotcmVjb21tZW5kZWQgdGhhdCB0aGUgdGltZSB6b25lIGFsd2F5cyBiZSBzcGVjaWZpZWQgZm9yIHRpbWVzdGFtcHMgd2hlbgotZmVhc2libGUuCi0KLVRoZSB0aW1lIG9mIGRheSBtYXkgYWxzbyBiZSBvbWl0dGVkIChgJzIwMTEtMDItMDMnYCBvcgotYCcyMDExLTAyLTAzKzAwMDAnYCksIGluIHdoaWNoIGNhc2UgdGhlIHRpbWUgb2YgZGF5IHdpbGwgZGVmYXVsdCB0bwotMDA6MDA6MDAgaW4gdGhlIHNwZWNpZmllZCBvciBkZWZhdWx0IHRpbWUgem9uZS4gSG93ZXZlciwgaWYgb25seSB0aGUKLWRhdGUgcGFydCBpcyByZWxldmFudCwgY29uc2lkZXIgdXNpbmcgdGhlIHhyZWY6Y3FsL3R5cGVzLmFkb2MjZGF0ZXNbZGF0ZV0gdHlwZS4KLQotW1tkYXRlc11dCi09PSBEYXRlIHR5cGUKLQotVmFsdWVzIG9mIHRoZSBgZGF0ZWAgdHlwZSBhcmUgZW5jb2RlZCBhcyAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcnMKLXJlcHJlc2VudGluZyBhIG51bWJlciBvZiBkYXlzIHdpdGgg4oCcdGhlIGVwb2No4oCdIGF0IHRoZSBjZW50ZXIgb2YgdGhlCi1yYW5nZSAoMl4zMSkuIEVwb2NoIGlzIEphbnVhcnkgMXN0LCAxOTcwCi0KLUZvciB4cmVmOmNxbC90eXBlcy5hZG9jI3RpbWVzdGFtcHNbdGltZXN0YW1wc10sIGEgZGF0ZSBjYW4gYmUgaW5wdXQgZWl0aGVyIGFzIGFuCi1gaW50ZWdlcmAgb3IgdXNpbmcgYSBkYXRlIGBzdHJpbmdgLiBJbiB0aGUgbGF0ZXIgY2FzZSwgdGhlIGZvcm1hdCBzaG91bGQKLWJlIGB5eXl5LW1tLWRkYCAoc28gYCcyMDExLTAyLTAzJ2AgZm9yIGluc3RhbmNlKS4KLQotW1t0aW1lc11dCi09PSBUaW1lIHR5cGUKLQotVmFsdWVzIG9mIHRoZSBgdGltZWAgdHlwZSBhcmUgZW5jb2RlZCBhcyA2NC1iaXQgc2lnbmVkIGludGVnZXJzCi1yZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyBzaW5jZSBtaWRuaWdodC4KLQotRm9yIHhyZWY6Y3FsL3R5cGVzLmFkb2MjdGltZXN0YW1wc1t0aW1lc3RhbXBzXSwgYSB0aW1lIGNhbiBiZSBpbnB1dCBlaXRoZXIgYXMgYW4KLWBpbnRlZ2VyYCBvciB1c2luZyBhIGBzdHJpbmdgIHJlcHJlc2VudGluZyB0aGUgdGltZS4gSW4gdGhlIGxhdGVyIGNhc2UsCi10aGUgZm9ybWF0IHNob3VsZCBiZSBgaGg6bW06c3NbLmZmZmZmZmZmZl1gICh3aGVyZSB0aGUgc3ViLXNlY29uZAotcHJlY2lzaW9uIGlzIG9wdGlvbmFsIGFuZCBpZiBwcm92aWRlZCwgY2FuIGJlIGxlc3MgdGhhbiB0aGUgbmFub3NlY29uZCkuCi1TbyBmb3IgaW5zdGFuY2UsIHRoZSBmb2xsb3dpbmcgYXJlIHZhbGlkIGlucHV0cyBmb3IgYSB0aW1lOgotCi0qIGAnMDg6MTI6NTQnYAotKiBgJzA4OjEyOjU0LjEyMydgCi0qIGAnMDg6MTI6NTQuMTIzNDU2J2AKLSogYCcwODoxMjo1NC4xMjM0NTY3ODknYAotCi1bW2R1cmF0aW9uc11dCi09PSBEdXJhdGlvbiB0eXBlCi0KLVZhbHVlcyBvZiB0aGUgYGR1cmF0aW9uYCB0eXBlIGFyZSBlbmNvZGVkIGFzIDMgc2lnbmVkIGludGVnZXIgb2YKLXZhcmlhYmxlIGxlbmd0aHMuIFRoZSBmaXJzdCBpbnRlZ2VyIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBtb250aHMsIHRoZQotc2Vjb25kIHRoZSBudW1iZXIgb2YgZGF5cyBhbmQgdGhlIHRoaXJkIHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMuIFRoaXMKLWlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IHRoZSBudW1iZXIgb2YgZGF5cyBpbiBhIG1vbnRoIGNhbiBjaGFuZ2UsIGFuZCBhCi1kYXkgY2FuIGhhdmUgMjMgb3IgMjUgaG91cnMgZGVwZW5kaW5nIG9uIHRoZSBkYXlsaWdodCBzYXZpbmcuCi1JbnRlcm5hbGx5LCB0aGUgbnVtYmVyIG9mIG1vbnRocyBhbmQgZGF5cyBhcmUgZGVjb2RlZCBhcyAzMiBiaXRzCi1pbnRlZ2VycyB3aGVyZWFzIHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgaXMgZGVjb2RlZCBhcyBhIDY0IGJpdHMKLWludGVnZXIuCi0KLUEgZHVyYXRpb24gY2FuIGJlIGlucHV0IGFzOgotCi0qIGAocXVhbnRpdHkgdW5pdCkrYCBsaWtlIGAxMmgzMG1gIHdoZXJlIHRoZSB1bml0IGNhbiBiZToKLSoqIGB5YDogeWVhcnMgKDEyIG1vbnRocykKLSoqIGBtb2A6IG1vbnRocyAoMSBtb250aCkKLSoqIGB3YDogd2Vla3MgKDcgZGF5cykKLSoqIGBkYDogZGF5cyAoMSBkYXkpCi0qKiBgaGA6IGhvdXJzICgzLDYwMCwwMDAsMDAwLDAwMCBuYW5vc2Vjb25kcykKLSoqIGBtYDogbWludXRlcyAoNjAsMDAwLDAwMCwwMDAgbmFub3NlY29uZHMpCi0qKiBgc2A6IHNlY29uZHMgKDEsMDAwLDAwMCwwMDAgbmFub3NlY29uZHMpCi0qKiBgbXNgOiBtaWxsaXNlY29uZHMgKDEsMDAwLDAwMCBuYW5vc2Vjb25kcykKLSoqIGB1c2Agb3IgYMK1c2AgOiBtaWNyb3NlY29uZHMgKDEwMDAgbmFub3NlY29uZHMpCi0qKiBgbnNgOiBuYW5vc2Vjb25kcyAoMSBuYW5vc2Vjb25kKQotKiBJU08gODYwMSBmb3JtYXQ6IGBQW25dWVtuXU1bbl1EVFtuXUhbbl1NW25dUyBvciBQW25dV2AKLSogSVNPIDg2MDEgYWx0ZXJuYXRpdmUgZm9ybWF0OiBgUFtZWVlZXS1bTU1dLVtERF1UW2hoXTpbbW1dOltzc11gCi0KLUZvciBleGFtcGxlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2luc2VydF9kdXJhdGlvbi5jcWxbXQotLS0tLQotCi1bW2R1cmF0aW9uLWxpbWl0YXRpb25dXQotRHVyYXRpb24gY29sdW1ucyBjYW5ub3QgYmUgdXNlZCBpbiBhIHRhYmxlJ3MgYFBSSU1BUlkgS0VZYC4gVGhpcwotbGltaXRhdGlvbiBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCBkdXJhdGlvbnMgY2Fubm90IGJlIG9yZGVyZWQuIEl0IGlzCi1lZmZlY3RpdmVseSBub3QgcG9zc2libGUgdG8ga25vdyBpZiBgMW1vYCBpcyBncmVhdGVyIHRoYW4gYDI5ZGAgd2l0aG91dAotYSBkYXRlIGNvbnRleHQuCi0KLUEgYDFkYCBkdXJhdGlvbiBpcyBub3QgZXF1YWwgdG8gYSBgMjRoYCBvbmUgYXMgdGhlIGR1cmF0aW9uIHR5cGUgaGFzCi1iZWVuIGNyZWF0ZWQgdG8gYmUgYWJsZSB0byBzdXBwb3J0IGRheWxpZ2h0IHNhdmluZy4KLQotPT0gQ29sbGVjdGlvbnMKLQotQ1FMIHN1cHBvcnRzIHRocmVlIGtpbmRzIG9mIGNvbGxlY3Rpb25zOiBgbWFwc2AsIGBzZXRzYCBhbmQgYGxpc3RzYC4gVGhlCi10eXBlcyBvZiB0aG9zZSBjb2xsZWN0aW9ucyBpcyBkZWZpbmVkIGJ5OgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL2NvbGxlY3Rpb25fdHlwZS5ibmZbXQotLS0tLQotCi1hbmQgdGhlaXIgdmFsdWVzIGNhbiBiZSBpbnB1dGQgdXNpbmcgY29sbGVjdGlvbiBsaXRlcmFsczoKLQotW3NvdXJjZSxibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9jb2xsZWN0aW9uX2xpdGVyYWwuYm5mW10KLS0tLS0KLQotTm90ZSBob3dldmVyIHRoYXQgbmVpdGhlciBgYmluZF9tYXJrZXJgIG5vciBgTlVMTGAgYXJlIHN1cHBvcnRlZCBpbnNpZGUKLWNvbGxlY3Rpb24gbGl0ZXJhbHMuCi0KLT09PSBOb3Rld29ydGh5IGNoYXJhY3RlcmlzdGljcwotCi1Db2xsZWN0aW9ucyBhcmUgbWVhbnQgZm9yIHN0b3JpbmcvZGVub3JtYWxpemluZyByZWxhdGl2ZWx5IHNtYWxsIGFtb3VudAotb2YgZGF0YS4gVGhleSB3b3JrIHdlbGwgZm9yIHRoaW5ncyBsaWtlIOKAnHRoZSBwaG9uZSBudW1iZXJzIG9mIGEgZ2l2ZW4KLXVzZXLigJ0sIOKAnGxhYmVscyBhcHBsaWVkIHRvIGFuIGVtYWls4oCdLCBldGMuIEJ1dCB3aGVuIGl0ZW1zIGFyZSBleHBlY3RlZCB0bwotZ3JvdyB1bmJvdW5kZWQgKOKAnGFsbCBtZXNzYWdlcyBzZW50IGJ5IGEgdXNlcuKAnSwg4oCcZXZlbnRzIHJlZ2lzdGVyZWQgYnkgYQotc2Vuc29y4oCdLi4uKSwgdGhlbiBjb2xsZWN0aW9ucyBhcmUgbm90IGFwcHJvcHJpYXRlIGFuZCBhIHNwZWNpZmljIHRhYmxlCi0od2l0aCBjbHVzdGVyaW5nIGNvbHVtbnMpIHNob3VsZCBiZSB1c2VkLiBDb25jcmV0ZWx5LCAobm9uLWZyb3plbikKLWNvbGxlY3Rpb25zIGhhdmUgdGhlIGZvbGxvd2luZyBub3Rld29ydGh5IGNoYXJhY3RlcmlzdGljcyBhbmQKLWxpbWl0YXRpb25zOgotCi0qIEluZGl2aWR1YWwgY29sbGVjdGlvbnMgYXJlIG5vdCBpbmRleGVkIGludGVybmFsbHkuIFdoaWNoIG1lYW5zIHRoYXQKLWV2ZW4gdG8gYWNjZXNzIGEgc2luZ2xlIGVsZW1lbnQgb2YgYSBjb2xsZWN0aW9uLCB0aGUgd2hpbGUgY29sbGVjdGlvbgotaGFzIHRvIGJlIHJlYWQgKGFuZCByZWFkaW5nIG9uZSBpcyBub3QgcGFnZWQgaW50ZXJuYWxseSkuCi0qIFdoaWxlIGluc2VydGlvbiBvcGVyYXRpb25zIG9uIHNldHMgYW5kIG1hcHMgbmV2ZXIgaW5jdXIgYQotcmVhZC1iZWZvcmUtd3JpdGUgaW50ZXJuYWxseSwgc29tZSBvcGVyYXRpb25zIG9uIGxpc3RzIGRvLiBGdXJ0aGVyLCBzb21lCi1saXN0cyBvcGVyYXRpb25zIGFyZSBub3QgaWRlbXBvdGVudCBieSBuYXR1cmUgKHNlZSB0aGUgc2VjdGlvbiBvbgoteHJlZjpjcWwvdHlwZXMuYWRvYyNsaXN0c1tsaXN0c10gYmVsb3cgZm9yIGRldGFpbHMpLCBtYWtpbmcgdGhlaXIgcmV0cnkgaW4gY2FzZSBvZgotdGltZW91dCBwcm9ibGVtYXRpYy4gSXQgaXMgdGh1cyBhZHZpc2VkIHRvIHByZWZlciBzZXRzIG92ZXIgbGlzdHMgd2hlbgotcG9zc2libGUuCi0KLVBsZWFzZSBub3RlIHRoYXQgd2hpbGUgc29tZSBvZiB0aG9zZSBsaW1pdGF0aW9ucyBtYXkgb3IgbWF5IG5vdCBiZQotcmVtb3ZlZC9pbXByb3ZlZCB1cG9uIGluIHRoZSBmdXR1cmUsIGl0IGlzIGEgYW50aS1wYXR0ZXJuIHRvIHVzZSBhCi0oc2luZ2xlKSBjb2xsZWN0aW9uIHRvIHN0b3JlIGxhcmdlIGFtb3VudHMgb2YgZGF0YS4KLQotPT09IE1hcHMKLQotQSBgbWFwYCBpcyBhIChzb3J0ZWQpIHNldCBvZiBrZXktdmFsdWUgcGFpcnMsIHdoZXJlIGtleXMgYXJlIHVuaXF1ZSBhbmQKLXRoZSBtYXAgaXMgc29ydGVkIGJ5IGl0cyBrZXlzLiBZb3UgY2FuIGRlZmluZSBhbmQgaW5zZXJ0IGEgbWFwIHdpdGg6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvbWFwLmNxbFtdCi0tLS0tCi0KLUZ1cnRoZXIsIG1hcHMgc3VwcG9ydDoKLQotKiBVcGRhdGluZyBvciBpbnNlcnRpbmcgb25lIG9yIG1vcmUgZWxlbWVudHM6Ci0rCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3VwZGF0ZV9tYXAuY3FsW10KLS0tLS0KLSogUmVtb3Zpbmcgb25lIG9yIG1vcmUgZWxlbWVudCAoaWYgYW4gZWxlbWVudCBkb2Vzbid0IGV4aXN0LCByZW1vdmluZyBpdAotaXMgYSBuby1vcCBidXQgbm8gZXJyb3IgaXMgdGhyb3duKToKLSsKLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvZGVsZXRlX21hcC5jcWxbXQotLS0tLQotKwotTm90ZSB0aGF0IGZvciByZW1vdmluZyBtdWx0aXBsZSBlbGVtZW50cyBpbiBhIGBtYXBgLCB5b3UgcmVtb3ZlIGZyb20gaXQKLWEgYHNldGAgb2Yga2V5cy4KLQotTGFzdGx5LCBUVExzIGFyZSBhbGxvd2VkIGZvciBib3RoIGBJTlNFUlRgIGFuZCBgVVBEQVRFYCwgYnV0IGluIGJvdGgKLWNhc2UgdGhlIFRUTCBzZXQgb25seSBhcHBseSB0byB0aGUgbmV3bHkgaW5zZXJ0ZWQvdXBkYXRlZCBlbGVtZW50cy4gSW4KLW90aGVyIHdvcmRzOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3VwZGF0ZV90dGxfbWFwLmNxbFtdCi0tLS0tCi0KLXdpbGwgb25seSBhcHBseSB0aGUgVFRMIHRvIHRoZSBgeyAnY29sb3InIDogJ2dyZWVuJyB9YCByZWNvcmQsIHRoZSByZXN0Ci1vZiB0aGUgbWFwIHJlbWFpbmluZyB1bmFmZmVjdGVkLgotCi09PT0gU2V0cwotCi1BIGBzZXRgIGlzIGEgKHNvcnRlZCkgY29sbGVjdGlvbiBvZiB1bmlxdWUgdmFsdWVzLiBZb3UgY2FuIGRlZmluZSBhbmQKLWluc2VydCBhIG1hcCB3aXRoOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3NldC5jcWxbXQotLS0tLQotCi1GdXJ0aGVyLCBzZXRzIHN1cHBvcnQ6Ci0KLSogQWRkaW5nIG9uZSBvciBtdWx0aXBsZSBlbGVtZW50cyAoYXMgdGhpcyBpcyBhIHNldCwgaW5zZXJ0aW5nIGFuCi1hbHJlYWR5IGV4aXN0aW5nIGVsZW1lbnQgaXMgYSBuby1vcCk6Ci0rCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML3VwZGF0ZV9zZXQuY3FsW10KLS0tLS0KLSogUmVtb3Zpbmcgb25lIG9yIG11bHRpcGxlIGVsZW1lbnRzIChpZiBhbiBlbGVtZW50IGRvZXNuJ3QgZXhpc3QsCi1yZW1vdmluZyBpdCBpcyBhIG5vLW9wIGJ1dCBubyBlcnJvciBpcyB0aHJvd24pOgotKwotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9kZWxldGVfc2V0LmNxbFtdCi0tLS0tCi0KLUxhc3RseSwgZm9yIHhyZWY6Y3FsL3R5cGVzLmFkb2Mjc2V0c1tzZXRzXSwgVFRMcyBhcmUgb25seSBhcHBsaWVkIHRvIG5ld2x5IGluc2VydGVkIHZhbHVlcy4KLQotPT09IExpc3RzCi0KLVtOT1RFXQotLk5vdGUKLT09PT0KLUFzIG1lbnRpb25lZCBhYm92ZSBhbmQgZnVydGhlciBkaXNjdXNzZWQgYXQgdGhlIGVuZCBvZiB0aGlzIHNlY3Rpb24sCi1saXN0cyBoYXZlIGxpbWl0YXRpb25zIGFuZCBzcGVjaWZpYyBwZXJmb3JtYW5jZSBjb25zaWRlcmF0aW9ucyB0aGF0IHlvdQotc2hvdWxkIHRha2UgaW50byBhY2NvdW50IGJlZm9yZSB1c2luZyB0aGVtLiBJbiBnZW5lcmFsLCBpZiB5b3UgY2FuIHVzZSBhCi14cmVmOmNxbC90eXBlcy5hZG9jI3NldHNbc2V0XSBpbnN0ZWFkIG9mIGxpc3QsIGFsd2F5cyBwcmVmZXIgYSBzZXQuCi09PT09Ci0KLUEgYGxpc3RgIGlzIGEgKHNvcnRlZCkgY29sbGVjdGlvbiBvZiBub24tdW5pcXVlIHZhbHVlcyB3aGVyZQotZWxlbWVudHMgYXJlIG9yZGVyZWQgYnkgdGhlcmUgcG9zaXRpb24gaW4gdGhlIGxpc3QuIFlvdSBjYW4gZGVmaW5lIGFuZAotaW5zZXJ0IGEgbGlzdCB3aXRoOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2xpc3QuY3FsW10KLS0tLS0KLQotRnVydGhlciwgbGlzdHMgc3VwcG9ydDoKLQotKiBBcHBlbmRpbmcgYW5kIHByZXBlbmRpbmcgdmFsdWVzIHRvIGEgbGlzdDoKLSsKLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvdXBkYXRlX2xpc3QuY3FsW10KLS0tLS0KLQotW1dBUk5JTkddCi0uV2FybmluZwotPT09PQotVGhlIGFwcGVuZCBhbmQgcHJlcGVuZCBvcGVyYXRpb25zIGFyZSBub3QgaWRlbXBvdGVudCBieSBuYXR1cmUuIFNvIGluCi1wYXJ0aWN1bGFyLCBpZiBvbmUgb2YgdGhlc2Ugb3BlcmF0aW9uIHRpbWVvdXQsIHRoZW4gcmV0cnlpbmcgdGhlCi1vcGVyYXRpb24gaXMgbm90IHNhZmUgYW5kIGl0IG1heSAob3IgbWF5IG5vdCkgbGVhZCB0bwotYXBwZW5kaW5nL3ByZXBlbmRpbmcgdGhlIHZhbHVlIHR3aWNlLgotPT09PQotCi0qIFNldHRpbmcgdGhlIHZhbHVlIGF0IGEgcGFydGljdWxhciBwb3NpdGlvbiBpbiBhIGxpc3QgdGhhdCBoYXMgYSBwcmUtZXhpc3RpbmcgZWxlbWVudCBmb3IgdGhhdCBwb3NpdGlvbi4gQW4gZXJyb3IKLXdpbGwgYmUgdGhyb3duIGlmIHRoZSBsaXN0IGRvZXMgbm90IGhhdmUgdGhlIHBvc2l0aW9uLjoKLSsKLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvdXBkYXRlX3BhcnRpY3VsYXJfbGlzdF9lbGVtZW50LmNxbFtdCi0tLS0tCi0qIFJlbW92aW5nIGFuIGVsZW1lbnQgYnkgaXRzIHBvc2l0aW9uIGluIHRoZSBsaXN0IHRoYXQgaGFzIGEgcHJlLWV4aXN0aW5nIGVsZW1lbnQgZm9yIHRoYXQgcG9zaXRpb24uIEFuIGVycm9yCi13aWxsIGJlIHRocm93biBpZiB0aGUgbGlzdCBkb2VzIG5vdCBoYXZlIHRoZSBwb3NpdGlvbi4gRnVydGhlciwgYXMgdGhlIG9wZXJhdGlvbiByZW1vdmVzIGFuCi1lbGVtZW50IGZyb20gdGhlIGxpc3QsIHRoZSBsaXN0IHNpemUgd2lsbCBkZWNyZWFzZSBieSBvbmUgZWxlbWVudCwgc2hpZnRpbmcKLXRoZSBwb3NpdGlvbiBvZiBhbGwgdGhlIGZvbGxvd2luZyBlbGVtZW50cyBvbmUgZm9yd2FyZDoKLSsKLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvZGVsZXRlX2VsZW1lbnRfbGlzdC5jcWxbXQotLS0tLQotCi0qIERlbGV0aW5nIF9hbGxfIHRoZSBvY2N1cnJlbmNlcyBvZiBwYXJ0aWN1bGFyIHZhbHVlcyBpbiB0aGUgbGlzdCAoaWYgYQotcGFydGljdWxhciBlbGVtZW50IGRvZXNuJ3Qgb2NjdXIgYXQgYWxsIGluIHRoZSBsaXN0LCBpdCBpcyBzaW1wbHkKLWlnbm9yZWQgYW5kIG5vIGVycm9yIGlzIHRocm93bik6Ci0rCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2RlbGV0ZV9hbGxfZWxlbWVudHNfbGlzdC5jcWxbXQotLS0tLQotCi1bV0FSTklOR10KLS5XYXJuaW5nCi09PT09Ci1TZXR0aW5nIGFuZCByZW1vdmluZyBhbiBlbGVtZW50IGJ5IHBvc2l0aW9uIGFuZCByZW1vdmluZyBvY2N1cmVuY2VzIG9mCi1wYXJ0aWN1bGFyIHZhbHVlcyBpbmN1ciBhbiBpbnRlcm5hbCBfcmVhZC1iZWZvcmUtd3JpdGVfLiBUaGVzZSBvcGVyYXRpb25zIHdpbGwKLXJ1biBzbG93bHkgYW5kIHVzZSBtb3JlIHJlc291cmNlcyB0aGFuIHVzdWFsIHVwZGF0ZXMgKHdpdGggdGhlCi1leGNsdXNpb24gb2YgY29uZGl0aW9uYWwgd3JpdGUgdGhhdCBoYXZlIHRoZWlyIG93biBjb3N0KS4KLT09PT0KLQotTGFzdGx5LCBmb3IgeHJlZjpjcWwvdHlwZXMuYWRvYyNsaXN0c1tsaXN0c10sIFRUTHMgb25seSBhcHBseSB0byBuZXdseSBpbnNlcnRlZCB2YWx1ZXMuCi0KLVtbdWR0c11dCi09PSBVc2VyLURlZmluZWQgVHlwZXMgKFVEVHMpCi0KLUNRTCBzdXBwb3J0IHRoZSBkZWZpbml0aW9uIG9mIHVzZXItZGVmaW5lZCB0eXBlcyAoVURUcykuIFN1Y2ggYQotdHlwZSBjYW4gYmUgY3JlYXRlZCwgbW9kaWZpZWQgYW5kIHJlbW92ZWQgdXNpbmcgdGhlCi1gY3JlYXRlX3R5cGVfc3RhdGVtZW50YCwgYGFsdGVyX3R5cGVfc3RhdGVtZW50YCBhbmQKLWBkcm9wX3R5cGVfc3RhdGVtZW50YCBkZXNjcmliZWQgYmVsb3cuIEJ1dCBvbmNlIGNyZWF0ZWQsIGEgVURUIGlzIHNpbXBseQotcmVmZXJyZWQgdG8gYnkgaXRzIG5hbWU6Ci0KLVtzb3VyY2UsIGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL3VkdC5ibmZbXQotLS0tLQotCi09PT0gQ3JlYXRpbmcgYSBVRFQKLQotQ3JlYXRpbmcgYSBuZXcgdXNlci1kZWZpbmVkIHR5cGUgaXMgZG9uZSB1c2luZyBhIGBDUkVBVEUgVFlQRWAgc3RhdGVtZW50Ci1kZWZpbmVkIGJ5OgotCi1bc291cmNlLCBibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9jcmVhdGVfdHlwZS5ibmZbXQotLS0tLQotCi1BIFVEVCBoYXMgYSBuYW1lICh1c2VkIHRvIGRlY2xhcmVkIGNvbHVtbnMgb2YgdGhhdCB0eXBlKSBhbmQgaXMgYSBzZXQgb2YKLW5hbWVkIGFuZCB0eXBlZCBmaWVsZHMuIEZpZWxkcyBuYW1lIGNhbiBiZSBhbnkgdHlwZSwgaW5jbHVkaW5nCi1jb2xsZWN0aW9ucyBvciBvdGhlciBVRFQuIEZvciBpbnN0YW5jZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC91ZHQuY3FsW10KLS0tLS0KLQotVGhpbmdzIHRvIGtlZXAgaW4gbWluZCBhYm91dCBVRFRzOgotCi0qIEF0dGVtcHRpbmcgdG8gY3JlYXRlIGFuIGFscmVhZHkgZXhpc3RpbmcgdHlwZSB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvcgotdW5sZXNzIHRoZSBgSUYgTk9UIEVYSVNUU2Agb3B0aW9uIGlzIHVzZWQuIElmIGl0IGlzIHVzZWQsIHRoZSBzdGF0ZW1lbnQKLXdpbGwgYmUgYSBuby1vcCBpZiB0aGUgdHlwZSBhbHJlYWR5IGV4aXN0cy4KLSogQSB0eXBlIGlzIGludHJpbnNpY2FsbHkgYm91bmQgdG8gdGhlIGtleXNwYWNlIGluIHdoaWNoIGl0IGlzIGNyZWF0ZWQsCi1hbmQgY2FuIG9ubHkgYmUgdXNlZCBpbiB0aGF0IGtleXNwYWNlLiBBdCBjcmVhdGlvbiwgaWYgdGhlIHR5cGUgbmFtZSBpcwotcHJlZml4ZWQgYnkgYSBrZXlzcGFjZSBuYW1lLCBpdCBpcyBjcmVhdGVkIGluIHRoYXQga2V5c3BhY2UuIE90aGVyd2lzZSwKLWl0IGlzIGNyZWF0ZWQgaW4gdGhlIGN1cnJlbnQga2V5c3BhY2UuCi0qIEFzIG9mIENhc3NhbmRyYSAsIFVEVCBoYXZlIHRvIGJlIGZyb3plbiBpbiBtb3N0IGNhc2VzLCBoZW5jZSB0aGUKLWBmcm96ZW48YWRkcmVzcz5gIGluIHRoZSB0YWJsZSBkZWZpbml0aW9uIGFib3ZlLiBQbGVhc2Ugc2VlIHRoZSBzZWN0aW9uCi1vbiB4cmVmOmNxbC90eXBlcy5hZG9jI2Zyb3plbltmcm96ZW5dIGZvciBtb3JlIGRldGFpbHMuCi0KLT09PSBVRFQgbGl0ZXJhbHMKLQotT25jZSBhIHVzZWQtZGVmaW5lZCB0eXBlIGhhcyBiZWVuIGNyZWF0ZWQsIHZhbHVlIGNhbiBiZSBpbnB1dCB1c2luZyBhCi1VRFQgbGl0ZXJhbDoKLQotW3NvdXJjZSxibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi91ZHRfbGl0ZXJhbC5ibmZbXQotLS0tLQotCi1JbiBvdGhlciB3b3JkcywgYSBVRFQgbGl0ZXJhbCBpcyBsaWtlIGEgeHJlZjpjcWwvdHlwZXMuYWRvYyNtYXBzW21hcF1gIGxpdGVyYWwgYnV0IGl0cwota2V5cyBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgb2YgdGhlIHR5cGUuIEZvciBpbnN0YW5jZSwgb25lIGNvdWxkCi1pbnNlcnQgaW50byB0aGUgdGFibGUgZGVmaW5lIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uIHVzaW5nOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2luc2VydF91ZHQuY3FsW10KLS0tLS0KLQotVG8gYmUgdmFsaWQsIGEgVURUIGxpdGVyYWwgY2FuIG9ubHkgaW5jbHVkZSBmaWVsZHMgZGVmaW5lZCBieSB0aGUKLXR5cGUgaXQgaXMgYSBsaXRlcmFsIG9mLCBidXQgaXQgY2FuIG9taXQgc29tZSBmaWVsZHMgKHRoZXNlIHdpbGwgYmUgc2V0IHRvIGBOVUxMYCkuCi0KLT09PSBBbHRlcmluZyBhIFVEVAotCi1BbiBleGlzdGluZyB1c2VyLWRlZmluZWQgdHlwZSBjYW4gYmUgbW9kaWZpZWQgdXNpbmcgYW4gYEFMVEVSIFRZUEVgCi1zdGF0ZW1lbnQ6Ci0KLVtzb3VyY2UsYm5mXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCTkYvYWx0ZXJfdWR0X3N0YXRlbWVudC5ibmZbXQotLS0tLQotSWYgdGhlIHR5cGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotWW91IGNhbjoKLQotKiBBZGQgYSBuZXcgZmllbGQgdG8gdGhlIHR5cGUgKGBBTFRFUiBUWVBFIGFkZHJlc3MgQUREIGNvdW50cnkgdGV4dGApLgotVGhhdCBuZXcgZmllbGQgd2lsbCBiZSBgTlVMTGAgZm9yIGFueSB2YWx1ZXMgb2YgdGhlIHR5cGUgY3JlYXRlZCBiZWZvcmUKLXRoZSBhZGRpdGlvbi4gSWYgdGhlIG5ldyBmaWVsZCBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgTk9UIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KLSogUmVuYW1lIHRoZSBmaWVsZHMgb2YgdGhlIHR5cGUuIElmIHRoZSBmaWVsZChzKSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCi0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvcmVuYW1lX3VkdF9maWVsZC5jcWxbXQotLS0tLQotCi09PT0gRHJvcHBpbmcgYSBVRFQKLQotWW91IGNhbiBkcm9wIGFuIGV4aXN0aW5nIHVzZXItZGVmaW5lZCB0eXBlIHVzaW5nIGEgYERST1AgVFlQRWAKLXN0YXRlbWVudDoKLQotW3NvdXJjZSxibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9kcm9wX3VkdF9zdGF0ZW1lbnQuYm5mW10KLS0tLS0KLQotRHJvcHBpbmcgYSB0eXBlIHJlc3VsdHMgaW4gdGhlIGltbWVkaWF0ZSwgaXJyZXZlcnNpYmxlIHJlbW92YWwgb2YgdGhhdAotdHlwZS4gSG93ZXZlciwgYXR0ZW1wdGluZyB0byBkcm9wIGEgdHlwZSB0aGF0IGlzIHN0aWxsIGluIHVzZSBieSBhbm90aGVyCi10eXBlLCB0YWJsZSBvciBmdW5jdGlvbiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4KLQotSWYgdGhlIHR5cGUgZHJvcHBlZCBkb2VzIG5vdCBleGlzdCwgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCB1bmxlc3MKLWBJRiBFWElTVFNgIGlzIHVzZWQsIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgotCi09PSBUdXBsZXMKLQotQ1FMIGFsc28gc3VwcG9ydCB0dXBsZXMgYW5kIHR1cGxlIHR5cGVzICh3aGVyZSB0aGUgZWxlbWVudHMgY2FuIGJlIG9mCi1kaWZmZXJlbnQgdHlwZXMpLiBGdW5jdGlvbmFsbHksIHR1cGxlcyBjYW4gYmUgdGhvdWdoIGFzIGFub255bW91cyBVRFQKLXdpdGggYW5vbnltb3VzIGZpZWxkcy4gVHVwbGUgdHlwZXMgYW5kIHR1cGxlIGxpdGVyYWxzIGFyZSBkZWZpbmVkIGJ5OgotCi1bc291cmNlLGJuZl0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQk5GL3R1cGxlLmJuZltdCi0tLS0tCi0KLWFuZCBjYW4gYmUgY3JlYXRlZDoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC90dXBsZS5jcWxbXQotLS0tLQotCi1Vbmxpa2Ugb3RoZXIgY29tcG9zZWQgdHlwZXMsIGxpa2UgY29sbGVjdGlvbnMgYW5kIFVEVHMsIGEgdHVwbGUgaXMgYWx3YXlzCi1gZnJvemVuIDxmcm96ZW4+YCAod2l0aG91dCB0aGUgbmVlZCBvZiB0aGUgYGZyb3plbmAga2V5d29yZCkKLWFuZCBpdCBpcyBub3QgcG9zc2libGUgdG8gdXBkYXRlIG9ubHkgc29tZSBlbGVtZW50cyBvZiBhIHR1cGxlICh3aXRob3V0Ci11cGRhdGluZyB0aGUgd2hvbGUgdHVwbGUpLiBBbHNvLCBhIHR1cGxlIGxpdGVyYWwgc2hvdWxkIGFsd2F5cyBoYXZlIHRoZQotc2FtZSBudW1iZXIgb2YgdmFsdWUgdGhhbiBkZWNsYXJlZCBpbiB0aGUgdHlwZSBpdCBpcyBhIHR1cGxlIG9mIChzb21lIG9mCi10aG9zZSB2YWx1ZXMgY2FuIGJlIG51bGwgYnV0IHRoZXkgbmVlZCB0byBiZSBleHBsaWNpdGx5IGRlY2xhcmVkIGFzIHNvKS4KLQotPT0gQ3VzdG9tIFR5cGVzCi0KLVtOT1RFXQotLk5vdGUKLT09PT0KLUN1c3RvbSB0eXBlcyBleGlzdHMgbW9zdGx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHB1cnBvc2VzIGFuZCB0aGVpcgotdXNhZ2UgaXMgZGlzY291cmFnZWQuIFRoZWlyIHVzYWdlIGlzIGNvbXBsZXgsIG5vdCB1c2VyIGZyaWVuZGx5IGFuZCB0aGUKLW90aGVyIHByb3ZpZGVkIHR5cGVzLCBwYXJ0aWN1bGFybHkgeHJlZjpjcWwvdHlwZXMuYWRvYyN1ZHRzW3VzZXItZGVmaW5lZCB0eXBlc10sIHNob3VsZAotYWxtb3N0IGFsd2F5cyBiZSBlbm91Z2guCi09PT09Ci0KLUEgY3VzdG9tIHR5cGUgaXMgZGVmaW5lZCBieToKLQotW3NvdXJjZSxibmZdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJORi9jdXN0b21fdHlwZS5ibmZbXQotLS0tLQotCi1BIGN1c3RvbSB0eXBlIGlzIGEgYHN0cmluZ2AgdGhhdCBjb250YWlucyB0aGUgbmFtZSBvZiBKYXZhIGNsYXNzIHRoYXQKLWV4dGVuZHMgdGhlIHNlcnZlciBzaWRlIGBBYnN0cmFjdFR5cGVgIGNsYXNzIGFuZCB0aGF0IGNhbiBiZSBsb2FkZWQgYnkKLUNhc3NhbmRyYSAoaXQgc2hvdWxkIHRodXMgYmUgaW4gdGhlIGBDTEFTU1BBVEhgIG9mIGV2ZXJ5IG5vZGUgcnVubmluZwotQ2Fzc2FuZHJhKS4gVGhhdCBjbGFzcyB3aWxsIGRlZmluZSB3aGF0IHZhbHVlcyBhcmUgdmFsaWQgZm9yIHRoZSB0eXBlCi1hbmQgaG93IHRoZSB0aW1lIHNvcnRzIHdoZW4gdXNlZCBmb3IgYSBjbHVzdGVyaW5nIGNvbHVtbi4gRm9yIGFueSBvdGhlcgotcHVycG9zZSwgYSB2YWx1ZSBvZiBhIGN1c3RvbSB0eXBlIGlzIHRoZSBzYW1lIHRoYW4gdGhhdCBvZiBhIGBibG9iYCwgYW5kCi1jYW4gaW4gcGFydGljdWxhciBiZSBpbnB1dCB1c2luZyB0aGUgYGJsb2JgIGxpdGVyYWwgc3ludGF4LgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19jb25jZXB0dWFsLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX2NvbmNlcHR1YWwuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFlMTAyNy4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX2NvbmNlcHR1YWwuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLT0gQ29uY2VwdHVhbCBEYXRhIE1vZGVsaW5nCi0KLUZpcnN0LCBsZXTigJlzIGNyZWF0ZSBhIHNpbXBsZSBkb21haW4gbW9kZWwgdGhhdCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQgaW4KLXRoZSByZWxhdGlvbmFsIHdvcmxkLCBhbmQgdGhlbiBzZWUgaG93IHlvdSBtaWdodCBtYXAgaXQgZnJvbSBhCi1yZWxhdGlvbmFsIHRvIGEgZGlzdHJpYnV0ZWQgaGFzaHRhYmxlIG1vZGVsIGluIENhc3NhbmRyYS4KLQotTGV0J3MgdXNlIGFuIGV4YW1wbGUgdGhhdCBpcyBjb21wbGV4IGVub3VnaCB0byBzaG93IHRoZSB2YXJpb3VzIGRhdGEKLXN0cnVjdHVyZXMgYW5kIGRlc2lnbiBwYXR0ZXJucywgYnV0IG5vdCBzb21ldGhpbmcgdGhhdCB3aWxsIGJvZyB5b3UgZG93bgotd2l0aCBkZXRhaWxzLiBBbHNvLCBhIGRvbWFpbiB0aGF04oCZcyBmYW1pbGlhciB0byBldmVyeW9uZSB3aWxsIGFsbG93IHlvdQotdG8gY29uY2VudHJhdGUgb24gaG93IHRvIHdvcmsgd2l0aCBDYXNzYW5kcmEsIG5vdCBvbiB3aGF0IHRoZQotYXBwbGljYXRpb24gZG9tYWluIGlzIGFsbCBhYm91dC4KLQotRm9yIGV4YW1wbGUsIGxldCdzIHVzZSBhIGRvbWFpbiB0aGF0IGlzIGVhc2lseSB1bmRlcnN0b29kIGFuZCB0aGF0Ci1ldmVyeW9uZSBjYW4gcmVsYXRlIHRvOiBtYWtpbmcgaG90ZWwgcmVzZXJ2YXRpb25zLgotCi1UaGUgY29uY2VwdHVhbCBkb21haW4gaW5jbHVkZXMgaG90ZWxzLCBndWVzdHMgdGhhdCBzdGF5IGluIHRoZSBob3RlbHMsIGEKLWNvbGxlY3Rpb24gb2Ygcm9vbXMgZm9yIGVhY2ggaG90ZWwsIHRoZSByYXRlcyBhbmQgYXZhaWxhYmlsaXR5IG9mIHRob3NlCi1yb29tcywgYW5kIGEgcmVjb3JkIG9mIHJlc2VydmF0aW9ucyBib29rZWQgZm9yIGd1ZXN0cy4gSG90ZWxzIHR5cGljYWxseQotYWxzbyBtYWludGFpbiBhIGNvbGxlY3Rpb24gb2Yg4oCccG9pbnRzIG9mIGludGVyZXN0LOKAnSB3aGljaCBhcmUgcGFya3MsCi1tdXNldW1zLCBzaG9wcGluZyBnYWxsZXJpZXMsIG1vbnVtZW50cywgb3Igb3RoZXIgcGxhY2VzIG5lYXIgdGhlIGhvdGVsCi10aGF0IGd1ZXN0cyBtaWdodCB3YW50IHRvIHZpc2l0IGR1cmluZyB0aGVpciBzdGF5LiBCb3RoIGhvdGVscyBhbmQKLXBvaW50cyBvZiBpbnRlcmVzdCBuZWVkIHRvIG1haW50YWluIGdlb2xvY2F0aW9uIGRhdGEgc28gdGhhdCB0aGV5IGNhbiBiZQotZm91bmQgb24gbWFwcyBmb3IgbWFzaHVwcywgYW5kIHRvIGNhbGN1bGF0ZSBkaXN0YW5jZXMuCi0KLVRoZSBjb25jZXB0dWFsIGRvbWFpbiBpcyBkZXBpY3RlZCBiZWxvdyB1c2luZyB0aGUgZW50aXR54oCTcmVsYXRpb25zaGlwCi1tb2RlbCBwb3B1bGFyaXplZCBieSBQZXRlciBDaGVuLiBUaGlzIHNpbXBsZSBkaWFncmFtIHJlcHJlc2VudHMgdGhlCi1lbnRpdGllcyBpbiB0aGUgZG9tYWluIHdpdGggcmVjdGFuZ2xlcywgYW5kIGF0dHJpYnV0ZXMgb2YgdGhvc2UgZW50aXRpZXMKLXdpdGggb3ZhbHMuIEF0dHJpYnV0ZXMgdGhhdCByZXByZXNlbnQgdW5pcXVlIGlkZW50aWZpZXJzIGZvciBpdGVtcyBhcmUKLXVuZGVybGluZWQuIFJlbGF0aW9uc2hpcHMgYmV0d2VlbiBlbnRpdGllcyBhcmUgcmVwcmVzZW50ZWQgYXMgZGlhbW9uZHMsCi1hbmQgdGhlIGNvbm5lY3RvcnMgYmV0d2VlbiB0aGUgcmVsYXRpb25zaGlwIGFuZCBlYWNoIGVudGl0eSBzaG93IHRoZQotbXVsdGlwbGljaXR5IG9mIHRoZSBjb25uZWN0aW9uLgotCi1pbWFnZTo6ZGF0YV9tb2RlbGluZ19ob3RlbF9lcmQucG5nW2ltYWdlXQotCi1PYnZpb3VzbHksIGluIHRoZSByZWFsIHdvcmxkLCB0aGVyZSB3b3VsZCBiZSBtYW55IG1vcmUgY29uc2lkZXJhdGlvbnMKLWFuZCBtdWNoIG1vcmUgY29tcGxleGl0eS4gRm9yIGV4YW1wbGUsIGhvdGVsIHJhdGVzIGFyZSBub3RvcmlvdXNseQotZHluYW1pYywgYW5kIGNhbGN1bGF0aW5nIHRoZW0gaW52b2x2ZXMgYSB3aWRlIGFycmF5IG9mIGZhY3RvcnMuIEhlcmUKLXlvdeKAmXJlIGRlZmluaW5nIHNvbWV0aGluZyBjb21wbGV4IGVub3VnaCB0byBiZSBpbnRlcmVzdGluZyBhbmQgdG91Y2ggb24KLXRoZSBpbXBvcnRhbnQgcG9pbnRzLCBidXQgc2ltcGxlIGVub3VnaCB0byBtYWludGFpbiB0aGUgZm9jdXMgb24KLWxlYXJuaW5nIENhc3NhbmRyYS4KLQotX01hdGVyaWFsIGFkYXB0ZWQgZnJvbSBDYXNzYW5kcmEsIFRoZSBEZWZpbml0aXZlIEd1aWRlLiBQdWJsaXNoZWQgYnkKLU8nUmVpbGx5IE1lZGlhLCBJbmMuIENvcHlyaWdodCDCqSAyMDIwIEplZmYgQ2FycGVudGVyLCBFYmVuIEhld2l0dC4gQWxsCi1yaWdodHMgcmVzZXJ2ZWQuIFVzZWQgd2l0aCBwZXJtaXNzaW9uLl8KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfbG9naWNhbC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19sb2dpY2FsLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYmZhNzguLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19sb2dpY2FsLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotPSBMb2dpY2FsIERhdGEgTW9kZWxpbmcKLQotTm93IHRoYXQgeW91IGhhdmUgZGVmaW5lZCB5b3VyIHF1ZXJpZXMsIHlvdeKAmXJlIHJlYWR5IHRvIGJlZ2luIGRlc2lnbmluZwotQ2Fzc2FuZHJhIHRhYmxlcy4gRmlyc3QsIGNyZWF0ZSBhIGxvZ2ljYWwgbW9kZWwgY29udGFpbmluZyBhIHRhYmxlIGZvcgotZWFjaCBxdWVyeSwgY2FwdHVyaW5nIGVudGl0aWVzIGFuZCByZWxhdGlvbnNoaXBzIGZyb20gdGhlIGNvbmNlcHR1YWwKLW1vZGVsLgotCi1UbyBuYW1lIGVhY2ggdGFibGUsIHlvdeKAmWxsIGlkZW50aWZ5IHRoZSBwcmltYXJ5IGVudGl0eSB0eXBlIGZvciB3aGljaAoteW91IGFyZSBxdWVyeWluZyBhbmQgdXNlIHRoYXQgdG8gc3RhcnQgdGhlIGVudGl0eSBuYW1lLiBJZiB5b3UgYXJlCi1xdWVyeWluZyBieSBhdHRyaWJ1dGVzIG9mIG90aGVyIHJlbGF0ZWQgZW50aXRpZXMsIGFwcGVuZCB0aG9zZSB0byB0aGUKLXRhYmxlIG5hbWUsIHNlcGFyYXRlZCB3aXRoIGBfYnlfYC4gRm9yIGV4YW1wbGUsIGBob3RlbHNfYnlfcG9pYC4KLQotTmV4dCwgeW91IGlkZW50aWZ5IHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIHRhYmxlLCBhZGRpbmcgcGFydGl0aW9uIGtleQotY29sdW1ucyBiYXNlZCBvbiB0aGUgcmVxdWlyZWQgcXVlcnkgYXR0cmlidXRlcywgYW5kIGNsdXN0ZXJpbmcgY29sdW1ucwotaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MgYW5kIHN1cHBvcnQgZGVzaXJlZCBzb3J0IG9yZGVyaW5nLgotCi1UaGUgZGVzaWduIG9mIHRoZSBwcmltYXJ5IGtleSBpcyBleHRyZW1lbHkgaW1wb3J0YW50LCBhcyBpdCB3aWxsCi1kZXRlcm1pbmUgaG93IG11Y2ggZGF0YSB3aWxsIGJlIHN0b3JlZCBpbiBlYWNoIHBhcnRpdGlvbiBhbmQgaG93IHRoYXQKLWRhdGEgaXMgb3JnYW5pemVkIG9uIGRpc2ssIHdoaWNoIGluIHR1cm4gd2lsbCBhZmZlY3QgaG93IHF1aWNrbHkKLUNhc3NhbmRyYSBwcm9jZXNzZXMgcmVhZHMuCi0KLUNvbXBsZXRlIGVhY2ggdGFibGUgYnkgYWRkaW5nIGFueSBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgaWRlbnRpZmllZCBieQotdGhlIHF1ZXJ5LiBJZiBhbnkgb2YgdGhlc2UgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIGFyZSB0aGUgc2FtZSBmb3IgZXZlcnkKLWluc3RhbmNlIG9mIHRoZSBwYXJ0aXRpb24ga2V5LCBtYXJrIHRoZSBjb2x1bW4gYXMgc3RhdGljLgotCi1Ob3cgdGhhdCB3YXMgYSBwcmV0dHkgcXVpY2sgZGVzY3JpcHRpb24gb2YgYSBmYWlybHkgaW52b2x2ZWQgcHJvY2Vzcywgc28KLWl0IHdpbGwgYmUgd29ydGh3aGlsZSB0byB3b3JrIHRocm91Z2ggYSBkZXRhaWxlZCBleGFtcGxlLiBGaXJzdCwgbGV04oCZcwotaW50cm9kdWNlIGEgbm90YXRpb24gdGhhdCB5b3UgY2FuIHVzZSB0byByZXByZXNlbnQgbG9naWNhbCBtb2RlbHMuCi0KLVNldmVyYWwgaW5kaXZpZHVhbHMgd2l0aGluIHRoZSBDYXNzYW5kcmEgY29tbXVuaXR5IGhhdmUgcHJvcG9zZWQKLW5vdGF0aW9ucyBmb3IgY2FwdHVyaW5nIGRhdGEgbW9kZWxzIGluIGRpYWdyYW1tYXRpYyBmb3JtLiBUaGlzIGRvY3VtZW50Ci11c2VzIGEgbm90YXRpb24gcG9wdWxhcml6ZWQgYnkgQXJ0ZW0gQ2hlYm90a28gd2hpY2ggcHJvdmlkZXMgYSBzaW1wbGUsCi1pbmZvcm1hdGl2ZSB3YXkgdG8gdmlzdWFsaXplIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gcXVlcmllcyBhbmQKLXRhYmxlcyBpbiB5b3VyIGRlc2lnbnMuIFRoaXMgZmlndXJlIHNob3dzIHRoZSBDaGVib3RrbyBub3RhdGlvbiBmb3IgYQotbG9naWNhbCBkYXRhIG1vZGVsLgotCi1pbWFnZTo6ZGF0YV9tb2RlbGluZ19jaGVib3Rrb19sb2dpY2FsLnBuZ1tpbWFnZV0KLQotRWFjaCB0YWJsZSBpcyBzaG93biB3aXRoIGl0cyB0aXRsZSBhbmQgYSBsaXN0IG9mIGNvbHVtbnMuIFByaW1hcnkga2V5Ci1jb2x1bW5zIGFyZSBpZGVudGlmaWVkIHZpYSBzeW1ib2xzIHN1Y2ggYXMgKksqIGZvciBwYXJ0aXRpb24ga2V5IGNvbHVtbnMKLWFuZCAqKkMqKuKGkSBvciAqKkMqKuKGkyB0byByZXByZXNlbnQgY2x1c3RlcmluZyBjb2x1bW5zLiBMaW5lcyBhcmUgc2hvd24KLWVudGVyaW5nIHRhYmxlcyBvciBiZXR3ZWVuIHRhYmxlcyB0byBpbmRpY2F0ZSB0aGUgcXVlcmllcyB0aGF0IGVhY2gKLXRhYmxlIGlzIGRlc2lnbmVkIHRvIHN1cHBvcnQuCi0KLT09IEhvdGVsIExvZ2ljYWwgRGF0YSBNb2RlbAotCi1UaGUgZmlndXJlIGJlbG93IHNob3dzIGEgQ2hlYm90a28gbG9naWNhbCBkYXRhIG1vZGVsIGZvciB0aGUgcXVlcmllcwotaW52b2x2aW5nIGhvdGVscywgcG9pbnRzIG9mIGludGVyZXN0LCByb29tcywgYW5kIGFtZW5pdGllcy4gT25lIHRoaW5nCi15b3UnbGwgbm90aWNlIGltbWVkaWF0ZWx5IGlzIHRoYXQgdGhlIENhc3NhbmRyYSBkZXNpZ24gZG9lc27igJl0IGluY2x1ZGUKLWRlZGljYXRlZCB0YWJsZXMgZm9yIHJvb21zIG9yIGFtZW5pdGllcywgYXMgeW91IGhhZCBpbiB0aGUgcmVsYXRpb25hbAotZGVzaWduLiBUaGlzIGlzIGJlY2F1c2UgdGhlIHdvcmtmbG93IGRpZG7igJl0IGlkZW50aWZ5IGFueSBxdWVyaWVzCi1yZXF1aXJpbmcgdGhpcyBkaXJlY3QgYWNjZXNzLgotCi1pbWFnZTo6ZGF0YV9tb2RlbGluZ19ob3RlbF9sb2dpY2FsLnBuZ1tpbWFnZV0KLQotTGV04oCZcyBleHBsb3JlIHRoZSBkZXRhaWxzIG9mIGVhY2ggb2YgdGhlc2UgdGFibGVzLgotCi1UaGUgZmlyc3QgcXVlcnkgUTEgaXMgdG8gZmluZCBob3RlbHMgbmVhciBhIHBvaW50IG9mIGludGVyZXN0LCBzbyB5b3XigJlsbAotY2FsbCB0aGlzIHRhYmxlIGBob3RlbHNfYnlfcG9pYC4gU2VhcmNoaW5nIGJ5IGEgbmFtZWQgcG9pbnQgb2YgaW50ZXJlc3QKLWlzIGEgY2x1ZSB0aGF0IHRoZSBwb2ludCBvZiBpbnRlcmVzdCBzaG91bGQgYmUgYSBwYXJ0IG9mIHRoZSBwcmltYXJ5Ci1rZXkuIExldOKAmXMgcmVmZXJlbmNlIHRoZSBwb2ludCBvZiBpbnRlcmVzdCBieSBuYW1lLCBiZWNhdXNlIGFjY29yZGluZyB0bwotdGhlIHdvcmtmbG93IHRoYXQgaXMgaG93IHVzZXJzIHdpbGwgc3RhcnQgdGhlaXIgc2VhcmNoLgotCi1Zb3XigJlsbCBub3RlIHRoYXQgeW91IGNlcnRhaW5seSBjb3VsZCBoYXZlIG1vcmUgdGhhbiBvbmUgaG90ZWwgbmVhciBhCi1naXZlbiBwb2ludCBvZiBpbnRlcmVzdCwgc28geW914oCZbGwgbmVlZCBhbm90aGVyIGNvbXBvbmVudCBpbiB0aGUgcHJpbWFyeQota2V5IGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhIHVuaXF1ZSBwYXJ0aXRpb24gZm9yIGVhY2ggaG90ZWwuIFNvCi15b3UgYWRkIHRoZSBob3RlbCBrZXkgYXMgYSBjbHVzdGVyaW5nIGNvbHVtbi4KLQotQW4gaW1wb3J0YW50IGNvbnNpZGVyYXRpb24gaW4gZGVzaWduaW5nIHlvdXIgdGFibGXigJlzIHByaW1hcnkga2V5IGlzCi1tYWtpbmcgc3VyZSB0aGF0IGl0IGRlZmluZXMgYSB1bmlxdWUgZGF0YSBlbGVtZW50LiBPdGhlcndpc2UgeW91IHJ1biB0aGUKLXJpc2sgb2YgYWNjaWRlbnRhbGx5IG92ZXJ3cml0aW5nIGRhdGEuCi0KLU5vdyBmb3IgdGhlIHNlY29uZCBxdWVyeSAoUTIpLCB5b3XigJlsbCBuZWVkIGEgdGFibGUgdG8gZ2V0IGluZm9ybWF0aW9uCi1hYm91dCBhIHNwZWNpZmljIGhvdGVsLiBPbmUgYXBwcm9hY2ggd291bGQgaGF2ZSBiZWVuIHRvIHB1dCBhbGwgb2YgdGhlCi1hdHRyaWJ1dGVzIG9mIGEgaG90ZWwgaW4gdGhlIGBob3RlbHNfYnlfcG9pYCB0YWJsZSwgYnV0IHlvdSBhZGRlZCBvbmx5Ci10aG9zZSBhdHRyaWJ1dGVzIHRoYXQgd2VyZSByZXF1aXJlZCBieSB0aGUgYXBwbGljYXRpb24gd29ya2Zsb3cuCi0KLUZyb20gdGhlIHdvcmtmbG93IGRpYWdyYW0sIHlvdSBrbm93IHRoYXQgdGhlIGBob3RlbHNfYnlfcG9pYCB0YWJsZSBpcwotdXNlZCB0byBkaXNwbGF5IGEgbGlzdCBvZiBob3RlbHMgd2l0aCBiYXNpYyBpbmZvcm1hdGlvbiBvbiBlYWNoIGhvdGVsLAotYW5kIHRoZSBhcHBsaWNhdGlvbiBrbm93cyB0aGUgdW5pcXVlIGlkZW50aWZpZXJzIG9mIHRoZSBob3RlbHMgcmV0dXJuZWQuCi1XaGVuIHRoZSB1c2VyIHNlbGVjdHMgYSBob3RlbCB0byB2aWV3IGRldGFpbHMsIHlvdSBjYW4gdGhlbiB1c2UgUTIsCi13aGljaCBpcyB1c2VkIHRvIG9idGFpbiBkZXRhaWxzIGFib3V0IHRoZSBob3RlbC4gQmVjYXVzZSB5b3UgYWxyZWFkeQotaGF2ZSB0aGUgYGhvdGVsX2lkYCBmcm9tIFExLCB5b3UgdXNlIHRoYXQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGhvdGVsCi15b3XigJlyZSBsb29raW5nIGZvci4gVGhlcmVmb3JlIHRoZSBzZWNvbmQgdGFibGUgaXMganVzdCBjYWxsZWQgYGhvdGVsc2AuCi0KLUFub3RoZXIgb3B0aW9uIHdvdWxkIGhhdmUgYmVlbiB0byBzdG9yZSBhIHNldCBvZiBgcG9pX25hbWVzYCBpbiB0aGUKLWhvdGVscyB0YWJsZS4gVGhpcyBpcyBhbiBlcXVhbGx5IHZhbGlkIGFwcHJvYWNoLiBZb3XigJlsbCBsZWFybiB0aHJvdWdoCi1leHBlcmllbmNlIHdoaWNoIGFwcHJvYWNoIGlzIGJlc3QgZm9yIHlvdXIgYXBwbGljYXRpb24uCi0KLVEzIGlzIGp1c3QgYSByZXZlcnNlIG9mIFEx4oCUbG9va2luZyBmb3IgcG9pbnRzIG9mIGludGVyZXN0IG5lYXIgYSBob3RlbCwKLXJhdGhlciB0aGFuIGhvdGVscyBuZWFyIGEgcG9pbnQgb2YgaW50ZXJlc3QuIFRoaXMgdGltZSwgaG93ZXZlciwgeW91Ci1uZWVkIHRvIGFjY2VzcyB0aGUgZGV0YWlscyBvZiBlYWNoIHBvaW50IG9mIGludGVyZXN0LCBhcyByZXByZXNlbnRlZCBieQotdGhlIGBwb2lzX2J5X2hvdGVsYCB0YWJsZS4gQXMgcHJldmlvdXNseSwgeW91IGFkZCB0aGUgcG9pbnQgb2YgaW50ZXJlc3QKLW5hbWUgYXMgYSBjbHVzdGVyaW5nIGtleSB0byBndWFyYW50ZWUgdW5pcXVlbmVzcy4KLQotQXQgdGhpcyBwb2ludCwgbGV04oCZcyBub3cgY29uc2lkZXIgaG93IHRvIHN1cHBvcnQgcXVlcnkgUTQgdG8gaGVscCB0aGUKLXVzZXIgZmluZCBhdmFpbGFibGUgcm9vbXMgYXQgYSBzZWxlY3RlZCBob3RlbCBmb3IgdGhlIG5pZ2h0cyB0aGV5IGFyZQotaW50ZXJlc3RlZCBpbiBzdGF5aW5nLiBOb3RlIHRoYXQgdGhpcyBxdWVyeSBpbnZvbHZlcyBib3RoIGEgc3RhcnQgZGF0ZQotYW5kIGFuIGVuZCBkYXRlLiBCZWNhdXNlIHlvdeKAmXJlIHF1ZXJ5aW5nIG92ZXIgYSByYW5nZSBpbnN0ZWFkIG9mIGEKLXNpbmdsZSBkYXRlLCB5b3Uga25vdyB0aGF0IHlvdeKAmWxsIG5lZWQgdG8gdXNlIHRoZSBkYXRlIGFzIGEgY2x1c3RlcmluZwota2V5LiBVc2UgdGhlIGBob3RlbF9pZGAgYXMgYSBwcmltYXJ5IGtleSB0byBncm91cCByb29tIGRhdGEgZm9yIGVhY2gKLWhvdGVsIG9uIGEgc2luZ2xlIHBhcnRpdGlvbiwgd2hpY2ggc2hvdWxkIGhlbHAgc2VhcmNoZXMgYmUgc3VwZXIgZmFzdC4KLUxldOKAmXMgY2FsbCB0aGlzIHRoZSBgYXZhaWxhYmxlX3Jvb21zX2J5X2hvdGVsX2RhdGVgIHRhYmxlLgotCi1UbyBzdXBwb3J0IHNlYXJjaGluZyBvdmVyIGEgcmFuZ2UsIHVzZSBgY2x1c3RlcmluZyBjb2x1bW5zCi08Y2x1c3RlcmluZy1jb2x1bW5zPmAgdG8gc3RvcmUgYXR0cmlidXRlcyB0aGF0IHlvdSBuZWVkIHRvIGFjY2VzcyBpbiBhCi1yYW5nZSBxdWVyeS4gUmVtZW1iZXIgdGhhdCB0aGUgb3JkZXIgb2YgdGhlIGNsdXN0ZXJpbmcgY29sdW1ucyBpcwotaW1wb3J0YW50LgotCi1UaGUgZGVzaWduIG9mIHRoZSBgYXZhaWxhYmxlX3Jvb21zX2J5X2hvdGVsX2RhdGVgIHRhYmxlIGlzIGFuIGluc3RhbmNlCi1vZiB0aGUgKndpZGUgcGFydGl0aW9uKiBwYXR0ZXJuLiBUaGlzIHBhdHRlcm4gaXMgc29tZXRpbWVzIGNhbGxlZCB0aGUKLSp3aWRlIHJvdyogcGF0dGVybiB3aGVuIGRpc2N1c3NpbmcgZGF0YWJhc2VzIHRoYXQgc3VwcG9ydCBzaW1pbGFyCi1tb2RlbHMsIGJ1dCB3aWRlIHBhcnRpdGlvbiBpcyBhIG1vcmUgYWNjdXJhdGUgZGVzY3JpcHRpb24gZnJvbSBhCi1DYXNzYW5kcmEgcGVyc3BlY3RpdmUuIFRoZSBlc3NlbmNlIG9mIHRoZSBwYXR0ZXJuIGlzIHRvIGdyb3VwIG11bHRpcGxlCi1yZWxhdGVkIHJvd3MgaW4gYSBwYXJ0aXRpb24gaW4gb3JkZXIgdG8gc3VwcG9ydCBmYXN0IGFjY2VzcyB0byBtdWx0aXBsZQotcm93cyB3aXRoaW4gdGhlIHBhcnRpdGlvbiBpbiBhIHNpbmdsZSBxdWVyeS4KLQotSW4gb3JkZXIgdG8gcm91bmQgb3V0IHRoZSBzaG9wcGluZyBwb3J0aW9uIG9mIHRoZSBkYXRhIG1vZGVsLCBhZGQgdGhlCi1gYW1lbml0aWVzX2J5X3Jvb21gIHRhYmxlIHRvIHN1cHBvcnQgUTUuIFRoaXMgd2lsbCBhbGxvdyB1c2VycyB0byB2aWV3Ci10aGUgYW1lbml0aWVzIG9mIG9uZSBvZiB0aGUgcm9vbXMgdGhhdCBpcyBhdmFpbGFibGUgZm9yIHRoZSBkZXNpcmVkIHN0YXkKLWRhdGVzLgotCi09PSBSZXNlcnZhdGlvbiBMb2dpY2FsIERhdGEgTW9kZWwKLQotTm93IGxldCdzIHN3aXRjaCBnZWFycyB0byBsb29rIGF0IHRoZSByZXNlcnZhdGlvbiBxdWVyaWVzLiBUaGUgZmlndXJlCi1zaG93cyBhIGxvZ2ljYWwgZGF0YSBtb2RlbCBmb3IgcmVzZXJ2YXRpb25zLiBZb3XigJlsbCBub3RpY2UgdGhhdCB0aGVzZQotdGFibGVzIHJlcHJlc2VudCBhIGRlbm9ybWFsaXplZCBkZXNpZ247IHRoZSBzYW1lIGRhdGEgYXBwZWFycyBpbgotbXVsdGlwbGUgdGFibGVzLCB3aXRoIGRpZmZlcmluZyBrZXlzLgotCi1pbWFnZTo6ZGF0YV9tb2RlbGluZ19yZXNlcnZhdGlvbl9sb2dpY2FsLnBuZ1tpbWFnZV0KLQotSW4gb3JkZXIgdG8gc2F0aXNmeSBRNiwgdGhlIGByZXNlcnZhdGlvbnNfYnlfZ3Vlc3RgIHRhYmxlIGNhbiBiZSB1c2VkIHRvCi1sb29rIHVwIHRoZSByZXNlcnZhdGlvbiBieSBndWVzdCBuYW1lLiBZb3UgY291bGQgZW52aXNpb24gcXVlcnkgUTcgYmVpbmcKLXVzZWQgb24gYmVoYWxmIG9mIGEgZ3Vlc3Qgb24gYSBzZWxmLXNlcnZlIHdlYnNpdGUgb3IgYSBjYWxsIGNlbnRlciBhZ2VudAotdHJ5aW5nIHRvIGFzc2lzdCB0aGUgZ3Vlc3QuIEJlY2F1c2UgdGhlIGd1ZXN0IG5hbWUgbWlnaHQgbm90IGJlIHVuaXF1ZSwKLXlvdSBpbmNsdWRlIHRoZSBndWVzdCBJRCBoZXJlIGFzIGEgY2x1c3RlcmluZyBjb2x1bW4gYXMgd2VsbC4KLQotUTggYW5kIFE5IGluIHBhcnRpY3VsYXIgaGVscCB0byByZW1pbmQgeW91IHRvIGNyZWF0ZSBxdWVyaWVzIHRoYXQKLXN1cHBvcnQgdmFyaW91cyBzdGFrZWhvbGRlcnMgb2YgdGhlIGFwcGxpY2F0aW9uLCBub3QganVzdCBjdXN0b21lcnMgYnV0Ci1zdGFmZiBhcyB3ZWxsLCBhbmQgcGVyaGFwcyBldmVuIHRoZSBhbmFseXRpY3MgdGVhbSwgc3VwcGxpZXJzLCBhbmQgc28KLW9uLgotCi1UaGUgaG90ZWwgc3RhZmYgbWlnaHQgd2lzaCB0byBzZWUgYSByZWNvcmQgb2YgdXBjb21pbmcgcmVzZXJ2YXRpb25zIGJ5Ci1kYXRlIGluIG9yZGVyIHRvIGdldCBpbnNpZ2h0IGludG8gaG93IHRoZSBob3RlbCBpcyBwZXJmb3JtaW5nLCBzdWNoIGFzCi13aGF0IGRhdGVzIHRoZSBob3RlbCBpcyBzb2xkIG91dCBvciB1bmRlcnNvbGQuIFE4IHN1cHBvcnRzIHRoZSByZXRyaWV2YWwKLW9mIHJlc2VydmF0aW9ucyBmb3IgYSBnaXZlbiBob3RlbCBieSBkYXRlLgotCi1GaW5hbGx5LCB5b3UgY3JlYXRlIGEgYGd1ZXN0c2AgdGFibGUuIFRoaXMgcHJvdmlkZXMgYSBzaW5nbGUgbG9jYXRpb24KLXRoYXQgdXNlZCB0byBzdG9yZSBndWVzdCBpbmZvcm1hdGlvbi4gSW4gdGhpcyBjYXNlLCB5b3Ugc3BlY2lmeSBhCi1zZXBhcmF0ZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgZ3Vlc3QgcmVjb3JkcywgYXMgaXQgaXMgbm90IHVuY29tbW9uIGZvcgotZ3Vlc3RzIHRvIGhhdmUgdGhlIHNhbWUgbmFtZS4gSW4gbWFueSBvcmdhbml6YXRpb25zLCBhIGN1c3RvbWVyIGRhdGFiYXNlCi1zdWNoIGFzIHRoZSBgZ3Vlc3RzYCB0YWJsZSB3b3VsZCBiZSBwYXJ0IG9mIGEgc2VwYXJhdGUgY3VzdG9tZXIKLW1hbmFnZW1lbnQgYXBwbGljYXRpb24sIHdoaWNoIGlzIHdoeSBvdGhlciBndWVzdCBhY2Nlc3MgcGF0dGVybnMgd2VyZQotb21pdHRlZCBmcm9tIHRoZSBleGFtcGxlLgotCi09PSBQYXR0ZXJucyBhbmQgQW50aS1QYXR0ZXJucwotCi1BcyB3aXRoIG90aGVyIHR5cGVzIG9mIHNvZnR3YXJlIGRlc2lnbiwgdGhlcmUgYXJlIHNvbWUgd2VsbC1rbm93bgotcGF0dGVybnMgYW5kIGFudGktcGF0dGVybnMgZm9yIGRhdGEgbW9kZWxpbmcgaW4gQ2Fzc2FuZHJhLiBZb3XigJl2ZQotYWxyZWFkeSB1c2VkIG9uZSBvZiB0aGUgbW9zdCBjb21tb24gcGF0dGVybnMgaW4gdGhpcyBob3RlbCBtb2RlbOKAlHRoZQotd2lkZSBwYXJ0aXRpb24gcGF0dGVybi4KLQotVGhlICp0aW1lIHNlcmllcyogcGF0dGVybiBpcyBhbiBleHRlbnNpb24gb2YgdGhlIHdpZGUgcGFydGl0aW9uIHBhdHRlcm4uCi1JbiB0aGlzIHBhdHRlcm4sIGEgc2VyaWVzIG9mIG1lYXN1cmVtZW50cyBhdCBzcGVjaWZpYyB0aW1lIGludGVydmFscyBhcmUKLXN0b3JlZCBpbiBhIHdpZGUgcGFydGl0aW9uLCB3aGVyZSB0aGUgbWVhc3VyZW1lbnQgdGltZSBpcyB1c2VkIGFzIHBhcnQKLW9mIHRoZSBwYXJ0aXRpb24ga2V5LiBUaGlzIHBhdHRlcm4gaXMgZnJlcXVlbnRseSB1c2VkIGluIGRvbWFpbnMKLWluY2x1ZGluZyBidXNpbmVzcyBhbmFseXNpcywgc2Vuc29yIGRhdGEgbWFuYWdlbWVudCwgYW5kIHNjaWVudGlmaWMKLWV4cGVyaW1lbnRzLgotCi1UaGUgdGltZSBzZXJpZXMgcGF0dGVybiBpcyBhbHNvIHVzZWZ1bCBmb3IgZGF0YSBvdGhlciB0aGFuIG1lYXN1cmVtZW50cy4KLUNvbnNpZGVyIHRoZSBleGFtcGxlIG9mIGEgYmFua2luZyBhcHBsaWNhdGlvbi4gWW91IGNvdWxkIHN0b3JlIGVhY2gKLWN1c3RvbWVy4oCZcyBiYWxhbmNlIGluIGEgcm93LCBidXQgdGhhdCBtaWdodCBsZWFkIHRvIGEgbG90IG9mIHJlYWQgYW5kCi13cml0ZSBjb250ZW50aW9uIGFzIHZhcmlvdXMgY3VzdG9tZXJzIGNoZWNrIHRoZWlyIGJhbGFuY2Ugb3IgbWFrZQotdHJhbnNhY3Rpb25zLiBZb3XigJlkIHByb2JhYmx5IGJlIHRlbXB0ZWQgdG8gd3JhcCBhIHRyYW5zYWN0aW9uIGFyb3VuZAotd3JpdGVzIGp1c3QgdG8gcHJvdGVjdCB0aGUgYmFsYW5jZSBmcm9tIGJlaW5nIHVwZGF0ZWQgaW4gZXJyb3IuIEluCi1jb250cmFzdCwgYSB0aW1lIHNlcmllc+KAk3N0eWxlIGRlc2lnbiB3b3VsZCBzdG9yZSBlYWNoIHRyYW5zYWN0aW9uIGFzIGEKLXRpbWVzdGFtcGVkIHJvdyBhbmQgbGVhdmUgdGhlIHdvcmsgb2YgY2FsY3VsYXRpbmcgdGhlIGN1cnJlbnQgYmFsYW5jZSB0bwotdGhlIGFwcGxpY2F0aW9uLgotCi1PbmUgZGVzaWduIHRyYXAgdGhhdCBtYW55IG5ldyB1c2VycyBmYWxsIGludG8gaXMgYXR0ZW1wdGluZyB0byB1c2UKLUNhc3NhbmRyYSBhcyBhIHF1ZXVlLiBFYWNoIGl0ZW0gaW4gdGhlIHF1ZXVlIGlzIHN0b3JlZCB3aXRoIGEgdGltZXN0YW1wCi1pbiBhIHdpZGUgcGFydGl0aW9uLiBJdGVtcyBhcmUgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgcXVldWUgYW5kIHJlYWQKLWZyb20gdGhlIGZyb250LCBiZWluZyBkZWxldGVkIGFmdGVyIHRoZXkgYXJlIHJlYWQuIFRoaXMgaXMgYSBkZXNpZ24gdGhhdAotc2VlbXMgYXR0cmFjdGl2ZSwgZXNwZWNpYWxseSBnaXZlbiBpdHMgYXBwYXJlbnQgc2ltaWxhcml0eSB0byB0aGUgdGltZQotc2VyaWVzIHBhdHRlcm4uIFRoZSBwcm9ibGVtIHdpdGggdGhpcyBhcHByb2FjaCBpcyB0aGF0IHRoZSBkZWxldGVkIGl0ZW1zCi1hcmUgbm93IGB0b21ic3RvbmVzIDxhc3luY2gtZGVsZXRlcz5gIHRoYXQgQ2Fzc2FuZHJhIG11c3Qgc2NhbiBwYXN0IGluCi1vcmRlciB0byByZWFkIGZyb20gdGhlIGZyb250IG9mIHRoZSBxdWV1ZS4gT3ZlciB0aW1lLCBhIGdyb3dpbmcgbnVtYmVyCi1vZiB0b21ic3RvbmVzIGJlZ2lucyB0byBkZWdyYWRlIHJlYWQgcGVyZm9ybWFuY2UuCi0KLVRoZSBxdWV1ZSBhbnRpLXBhdHRlcm4gc2VydmVzIGFzIGEgcmVtaW5kZXIgdGhhdCBhbnkgZGVzaWduIHRoYXQgcmVsaWVzCi1vbiB0aGUgZGVsZXRpb24gb2YgZGF0YSBpcyBwb3RlbnRpYWxseSBhIHBvb3JseSBwZXJmb3JtaW5nIGRlc2lnbi4KLQotX01hdGVyaWFsIGFkYXB0ZWQgZnJvbSBDYXNzYW5kcmEsIFRoZSBEZWZpbml0aXZlIEd1aWRlLiBQdWJsaXNoZWQgYnkKLU8nUmVpbGx5IE1lZGlhLCBJbmMuIENvcHlyaWdodCDCqSAyMDIwIEplZmYgQ2FycGVudGVyLCBFYmVuIEhld2l0dC4gQWxsCi1yaWdodHMgcmVzZXJ2ZWQuIFVzZWQgd2l0aCBwZXJtaXNzaW9uLl8KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfcGh5c2ljYWwuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfcGh5c2ljYWwuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzNDA2Ny4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3BoeXNpY2FsLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi09IFBoeXNpY2FsIERhdGEgTW9kZWxpbmcKLQotT25jZSB5b3UgaGF2ZSBhIGxvZ2ljYWwgZGF0YSBtb2RlbCBkZWZpbmVkLCBjcmVhdGluZyB0aGUgcGh5c2ljYWwgbW9kZWwKLWlzIGEgcmVsYXRpdmVseSBzaW1wbGUgcHJvY2Vzcy4KLQotWW91IHdhbGsgdGhyb3VnaCBlYWNoIG9mIHRoZSBsb2dpY2FsIG1vZGVsIHRhYmxlcywgYXNzaWduaW5nIHR5cGVzIHRvCi1lYWNoIGl0ZW0uIFlvdSBjYW4gdXNlIGFueSB2YWxpZCBgQ1FMIGRhdGEgdHlwZSA8ZGF0YS10eXBlcz5gLCBpbmNsdWRpbmcKLXRoZSBiYXNpYyB0eXBlcywgY29sbGVjdGlvbnMsIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMuIFlvdSBtYXkgaWRlbnRpZnkKLWFkZGl0aW9uYWwgdXNlci1kZWZpbmVkIHR5cGVzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdG8gc2ltcGxpZnkgeW91cgotZGVzaWduLgotCi1BZnRlciB5b3XigJl2ZSBhc3NpZ25lZCBkYXRhIHR5cGVzLCB5b3UgYW5hbHl6ZSB0aGUgbW9kZWwgYnkgcGVyZm9ybWluZwotc2l6ZSBjYWxjdWxhdGlvbnMgYW5kIHRlc3Rpbmcgb3V0IGhvdyB0aGUgbW9kZWwgd29ya3MuIFlvdSBtYXkgbWFrZSBzb21lCi1hZGp1c3RtZW50cyBiYXNlZCBvbiB5b3VyIGZpbmRpbmdzLiBPbmNlIGFnYWluIGxldCdzIGNvdmVyIHRoZSBkYXRhCi1tb2RlbGluZyBwcm9jZXNzIGluIG1vcmUgZGV0YWlsIGJ5IHdvcmtpbmcgdGhyb3VnaCBhbiBleGFtcGxlLgotCi1CZWZvcmUgZ2V0dGluZyBzdGFydGVkLCBsZXTigJlzIGxvb2sgYXQgYSBmZXcgYWRkaXRpb25zIHRvIHRoZSBDaGVib3Rrbwotbm90YXRpb24gZm9yIHBoeXNpY2FsIGRhdGEgbW9kZWxzLiBUbyBkcmF3IHBoeXNpY2FsIG1vZGVscywgeW91IG5lZWQgdG8KLWJlIGFibGUgdG8gYWRkIHRoZSB0eXBpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2ggY29sdW1uLiBUaGlzIGZpZ3VyZSBzaG93cwotdGhlIGFkZGl0aW9uIG9mIGEgdHlwZSBmb3IgZWFjaCBjb2x1bW4gaW4gYSBzYW1wbGUgdGFibGUuCi0KLWltYWdlOjpkYXRhX21vZGVsaW5nX2NoZWJvdGtvX3BoeXNpY2FsLnBuZ1tpbWFnZV0KLQotVGhlIGZpZ3VyZSBpbmNsdWRlcyBhIGRlc2lnbmF0aW9uIG9mIHRoZSBrZXlzcGFjZSBjb250YWluaW5nIGVhY2ggdGFibGUKLWFuZCB2aXN1YWwgY3VlcyBmb3IgY29sdW1ucyByZXByZXNlbnRlZCB1c2luZyBjb2xsZWN0aW9ucyBhbmQKLXVzZXItZGVmaW5lZCB0eXBlcy4gTm90ZSB0aGUgZGVzaWduYXRpb24gb2Ygc3RhdGljIGNvbHVtbnMgYW5kIHNlY29uZGFyeQotaW5kZXggY29sdW1ucy4gVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gYXNzaWduaW5nIHRoZXNlIGFzIHBhcnQgb2YgYQotbG9naWNhbCBtb2RlbCwgYnV0IHRoZXkgYXJlIHR5cGljYWxseSBtb3JlIG9mIGEgcGh5c2ljYWwgZGF0YSBtb2RlbGluZwotY29uY2Vybi4KLQotPT0gSG90ZWwgUGh5c2ljYWwgRGF0YSBNb2RlbAotCi1Ob3cgbGV04oCZcyBnZXQgdG8gd29yayBvbiB0aGUgcGh5c2ljYWwgbW9kZWwuIEZpcnN0LCB5b3UgbmVlZCBrZXlzcGFjZXMKLXRvIGNvbnRhaW4gdGhlIHRhYmxlcy4gVG8ga2VlcCB0aGUgZGVzaWduIHJlbGF0aXZlbHkgc2ltcGxlLCBjcmVhdGUgYQotYGhvdGVsYCBrZXlzcGFjZSB0byBjb250YWluIHRhYmxlcyBmb3IgaG90ZWwgYW5kIGF2YWlsYWJpbGl0eSBkYXRhLCBhbmQKLWEgYHJlc2VydmF0aW9uYCBrZXlzcGFjZSB0byBjb250YWluIHRhYmxlcyBmb3IgcmVzZXJ2YXRpb24gYW5kIGd1ZXN0Ci1kYXRhLiBJbiBhIHJlYWwgc3lzdGVtLCB5b3UgbWlnaHQgZGl2aWRlIHRoZSB0YWJsZXMgYWNyb3NzIGV2ZW4gbW9yZQota2V5c3BhY2VzIGluIG9yZGVyIHRvIHNlcGFyYXRlIGNvbmNlcm5zLgotCi1Gb3IgdGhlIGBob3RlbHNgIHRhYmxlLCB1c2UgQ2Fzc2FuZHJh4oCZcyBgdGV4dGAgdHlwZSB0byByZXByZXNlbnQgdGhlCi1ob3RlbOKAmXMgYGlkYC4gRm9yIHRoZSBhZGRyZXNzLCBjcmVhdGUgYW4gYGFkZHJlc3NgIHVzZXIgZGVmaW5lZCB0eXBlLgotVXNlIHRoZSBgdGV4dGAgdHlwZSB0byByZXByZXNlbnQgdGhlIHBob25lIG51bWJlciwgYXMgdGhlcmUgaXMKLWNvbnNpZGVyYWJsZSB2YXJpYW5jZSBpbiB0aGUgZm9ybWF0dGluZyBvZiBudW1iZXJzIGJldHdlZW4gY291bnRyaWVzLgotCi1XaGlsZSBpdCB3b3VsZCBtYWtlIHNlbnNlIHRvIHVzZSB0aGUgYHV1aWRgIHR5cGUgZm9yIGF0dHJpYnV0ZXMgc3VjaCBhcwotdGhlIGBob3RlbF9pZGAsIHRoaXMgZG9jdW1lbnQgdXNlcyBtb3N0bHkgYHRleHRgIGF0dHJpYnV0ZXMgYXMKLWlkZW50aWZpZXJzLCB0byBrZWVwIHRoZSBzYW1wbGVzIHNpbXBsZSBhbmQgcmVhZGFibGUuIEZvciBleGFtcGxlLCBhCi1jb21tb24gY29udmVudGlvbiBpbiB0aGUgaG9zcGl0YWxpdHkgaW5kdXN0cnkgaXMgdG8gcmVmZXJlbmNlIHByb3BlcnRpZXMKLWJ5IHNob3J0IGNvZGVzIGxpa2UgIkFaMTIzIiBvciAiTlkyMjkiLiBUaGlzIGV4YW1wbGUgdXNlcyB0aGVzZSB2YWx1ZXMKLWZvciBgaG90ZWxfaWRzYCwgd2hpbGUgYWNrbm93bGVkZ2luZyB0aGV5IGFyZSBub3QgbmVjZXNzYXJpbHkgZ2xvYmFsbHkKLXVuaXF1ZS4KLQotWW914oCZbGwgZmluZCB0aGF0IGl04oCZcyBvZnRlbiBoZWxwZnVsIHRvIHVzZSB1bmlxdWUgSURzIHRvIHVuaXF1ZWx5Ci1yZWZlcmVuY2UgZWxlbWVudHMsIGFuZCB0byB1c2UgdGhlc2UgYHV1aWRzYCBhcyByZWZlcmVuY2VzIGluIHRhYmxlcwotcmVwcmVzZW50aW5nIG90aGVyIGVudGl0aWVzLiBUaGlzIGhlbHBzIHRvIG1pbmltaXplIGNvdXBsaW5nIGJldHdlZW4KLWRpZmZlcmVudCBlbnRpdHkgdHlwZXMuIFRoaXMgbWF5IHByb3ZlIGVzcGVjaWFsbHkgZWZmZWN0aXZlIGlmIHlvdSBhcmUKLXVzaW5nIGEgbWljcm9zZXJ2aWNlIGFyY2hpdGVjdHVyYWwgc3R5bGUgZm9yIHlvdXIgYXBwbGljYXRpb24sIGluIHdoaWNoCi10aGVyZSBhcmUgc2VwYXJhdGUgc2VydmljZXMgcmVzcG9uc2libGUgZm9yIGVhY2ggZW50aXR5IHR5cGUuCi0KLUFzIHlvdSB3b3JrIHRvIGNyZWF0ZSBwaHlzaWNhbCByZXByZXNlbnRhdGlvbnMgb2YgdmFyaW91cyB0YWJsZXMgaW4gdGhlCi1sb2dpY2FsIGhvdGVsIGRhdGEgbW9kZWwsIHlvdSB1c2UgdGhlIHNhbWUgYXBwcm9hY2guIFRoZSByZXN1bHRpbmcKLWRlc2lnbiBpcyBzaG93biBpbiB0aGlzIGZpZ3VyZToKLQotaW1hZ2U6OmRhdGFfbW9kZWxpbmdfaG90ZWxfcGh5c2ljYWwucG5nW2ltYWdlXQotCi1Ob3RlIHRoYXQgdGhlIGBhZGRyZXNzYCB0eXBlIGlzIGFsc28gaW5jbHVkZWQgaW4gdGhlIGRlc2lnbi4gSXQgaXMKLWRlc2lnbmF0ZWQgd2l0aCBhbiBhc3RlcmlzayB0byBkZW5vdGUgdGhhdCBpdCBpcyBhIHVzZXItZGVmaW5lZCB0eXBlLAotYW5kIGhhcyBubyBwcmltYXJ5IGtleSBjb2x1bW5zIGlkZW50aWZpZWQuIFRoaXMgdHlwZSBpcyB1c2VkIGluIHRoZQotYGhvdGVsc2AgYW5kIGBob3RlbHNfYnlfcG9pYCB0YWJsZXMuCi0KLVVzZXItZGVmaW5lZCB0eXBlcyBhcmUgZnJlcXVlbnRseSB1c2VkIHRvIGhlbHAgcmVkdWNlIGR1cGxpY2F0aW9uIG9mCi1ub24tcHJpbWFyeSBrZXkgY29sdW1ucywgYXMgd2FzIGRvbmUgd2l0aCB0aGUgYGFkZHJlc3NgIHVzZXItZGVmaW5lZAotdHlwZS4gVGhpcyBjYW4gcmVkdWNlIGNvbXBsZXhpdHkgaW4gdGhlIGRlc2lnbi4KLQotUmVtZW1iZXIgdGhhdCB0aGUgc2NvcGUgb2YgYSBVRFQgaXMgdGhlIGtleXNwYWNlIGluIHdoaWNoIGl0IGlzIGRlZmluZWQuCi1UbyB1c2UgYGFkZHJlc3NgIGluIHRoZSBgcmVzZXJ2YXRpb25gIGtleXNwYWNlIGRlZmluZWQgYmVsb3cgZGVzaWduLAoteW914oCZbGwgaGF2ZSB0byBkZWNsYXJlIGl0IGFnYWluLiBUaGlzIGlzIGp1c3Qgb25lIG9mIHRoZSBtYW55IHRyYWRlLW9mZnMKLXlvdSBoYXZlIHRvIG1ha2UgaW4gZGF0YSBtb2RlbCBkZXNpZ24uCi0KLT09IFJlc2VydmF0aW9uIFBoeXNpY2FsIERhdGEgTW9kZWwKLQotTm93LCBsZXTigJlzIGV4YW1pbmUgcmVzZXJ2YXRpb24gdGFibGVzIGluIHRoZSBkZXNpZ24uIFJlbWVtYmVyIHRoYXQgdGhlCi1sb2dpY2FsIG1vZGVsIGNvbnRhaW5lZCB0aHJlZSBkZW5vcm1hbGl6ZWQgdGFibGVzIHRvIHN1cHBvcnQgcXVlcmllcyBmb3IKLXJlc2VydmF0aW9ucyBieSBjb25maXJtYXRpb24gbnVtYmVyLCBndWVzdCwgYW5kIGhvdGVsIGFuZCBkYXRlLiBGb3IgdGhlCi1maXJzdCBpdGVyYXRpb24gb2YgeW91ciBwaHlzaWNhbCBkYXRhIG1vZGVsIGRlc2lnbiwgYXNzdW1lIHlvdSdyZSBnb2luZwotdG8gbWFuYWdlIHRoaXMgZGVub3JtYWxpemF0aW9uIG1hbnVhbGx5LiBOb3RlIHRoYXQgdGhpcyBkZXNpZ24gY291bGQgYmUKLXJldmlzZWQgdG8gdXNlIENhc3NhbmRyYeKAmXMgKGV4cGVyaW1lbnRhbCkgbWF0ZXJpYWxpemVkIHZpZXcgZmVhdHVyZS4KLQotaW1hZ2U6OmRhdGFfbW9kZWxpbmdfcmVzZXJ2YXRpb25fcGh5c2ljYWwucG5nW2ltYWdlXQotCi1Ob3RlIHRoYXQgdGhlIGBhZGRyZXNzYCB0eXBlIGlzIHJlcHJvZHVjZWQgaW4gdGhpcyBrZXlzcGFjZSBhbmQKLWBndWVzdF9pZGAgaXMgbW9kZWxlZCBhcyBhIGB1dWlkYCB0eXBlIGluIGFsbCBvZiB0aGUgdGFibGVzLgotCi1fTWF0ZXJpYWwgYWRhcHRlZCBmcm9tIENhc3NhbmRyYSwgVGhlIERlZmluaXRpdmUgR3VpZGUuIFB1Ymxpc2hlZCBieQotTydSZWlsbHkgTWVkaWEsIEluYy4gQ29weXJpZ2h0IMKpIDIwMjAgSmVmZiBDYXJwZW50ZXIsIEViZW4gSGV3aXR0LiBBbGwKLXJpZ2h0cyByZXNlcnZlZC4gVXNlZCB3aXRoIHBlcm1pc3Npb24uXwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19xdWVyaWVzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3F1ZXJpZXMuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0MGZiOC4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3F1ZXJpZXMuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLT0gRGVmaW5pbmcgQXBwbGljYXRpb24gUXVlcmllcwotCi1MZXTigJlzIHRyeSB0aGUgcXVlcnktZmlyc3QgYXBwcm9hY2ggdG8gc3RhcnQgZGVzaWduaW5nIHRoZSBkYXRhIG1vZGVsIGZvcgotYSBob3RlbCBhcHBsaWNhdGlvbi4gVGhlIHVzZXIgaW50ZXJmYWNlIGRlc2lnbiBmb3IgdGhlIGFwcGxpY2F0aW9uIGlzCi1vZnRlbiBhIGdyZWF0IGFydGlmYWN0IHRvIHVzZSB0byBiZWdpbiBpZGVudGlmeWluZyBxdWVyaWVzLiBMZXTigJlzIGFzc3VtZQotdGhhdCB5b3XigJl2ZSB0YWxrZWQgd2l0aCB0aGUgcHJvamVjdCBzdGFrZWhvbGRlcnMgYW5kIHlvdXIgVVggZGVzaWduZXJzCi1oYXZlIHByb2R1Y2VkIHVzZXIgaW50ZXJmYWNlIGRlc2lnbnMgb3Igd2lyZWZyYW1lcyBmb3IgdGhlIGtleSB1c2UKLWNhc2VzLiBZb3XigJlsbCBsaWtlbHkgaGF2ZSBhIGxpc3Qgb2Ygc2hvcHBpbmcgcXVlcmllcyBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0KLSogUTEuIEZpbmQgaG90ZWxzIG5lYXIgYSBnaXZlbiBwb2ludCBvZiBpbnRlcmVzdC4KLSogUTIuIEZpbmQgaW5mb3JtYXRpb24gYWJvdXQgYSBnaXZlbiBob3RlbCwgc3VjaCBhcyBpdHMgbmFtZSBhbmQKLWxvY2F0aW9uLgotKiBRMy4gRmluZCBwb2ludHMgb2YgaW50ZXJlc3QgbmVhciBhIGdpdmVuIGhvdGVsLgotKiBRNC4gRmluZCBhbiBhdmFpbGFibGUgcm9vbSBpbiBhIGdpdmVuIGRhdGUgcmFuZ2UuCi0qIFE1LiBGaW5kIHRoZSByYXRlIGFuZCBhbWVuaXRpZXMgZm9yIGEgcm9vbS4KLQotSXQgaXMgb2Z0ZW4gaGVscGZ1bCB0byBiZSBhYmxlIHRvIHJlZmVyIHRvIHF1ZXJpZXMgYnkgYSBzaG9ydGhhbmQgbnVtYmVyCi1yYXRoZXIgdGhhdCBleHBsYWluaW5nIHRoZW0gaW4gZnVsbC4gVGhlIHF1ZXJpZXMgbGlzdGVkIGhlcmUgYXJlCi1udW1iZXJlZCBRMSwgUTIsIGFuZCBzbyBvbiwgd2hpY2ggaXMgaG93IHRoZXkgYXJlIHJlZmVyZW5jZWQgaW4gZGlhZ3JhbXMKLXRocm91Z2hvdXQgdGhlIGV4YW1wbGUuCi0KLU5vdyBpZiB0aGUgYXBwbGljYXRpb24gaXMgdG8gYmUgYSBzdWNjZXNzLCB5b3XigJlsbCBjZXJ0YWlubHkgd2FudAotY3VzdG9tZXJzIHRvIGJlIGFibGUgdG8gYm9vayByZXNlcnZhdGlvbnMgYXQgaG90ZWxzLiBUaGlzIGluY2x1ZGVzIHN0ZXBzCi1zdWNoIGFzIHNlbGVjdGluZyBhbiBhdmFpbGFibGUgcm9vbSBhbmQgZW50ZXJpbmcgdGhlaXIgZ3Vlc3QKLWluZm9ybWF0aW9uLiBTbyBjbGVhcmx5IHlvdSB3aWxsIGFsc28gbmVlZCBzb21lIHF1ZXJpZXMgdGhhdCBhZGRyZXNzIHRoZQotcmVzZXJ2YXRpb24gYW5kIGd1ZXN0IGVudGl0aWVzIGZyb20gdGhlIGNvbmNlcHR1YWwgZGF0YSBtb2RlbC4gRXZlbgotaGVyZSwgaG93ZXZlciwgeW914oCZbGwgd2FudCB0byB0aGluayBub3Qgb25seSBmcm9tIHRoZSBjdXN0b21lcgotcGVyc3BlY3RpdmUgaW4gdGVybXMgb2YgaG93IHRoZSBkYXRhIGlzIHdyaXR0ZW4sIGJ1dCBhbHNvIGluIHRlcm1zIG9mCi1ob3cgdGhlIGRhdGEgd2lsbCBiZSBxdWVyaWVkIGJ5IGRvd25zdHJlYW0gdXNlIGNhc2VzLgotCi1Zb3VyIG5hdHVyYWwgdGVuZGVuY3kgbWlnaHQgYmUgdG8gZm9jdXMgZmlyc3Qgb24gZGVzaWduaW5nIHRoZSB0YWJsZXMKLXRvIHN0b3JlIHJlc2VydmF0aW9uIGFuZCBndWVzdCByZWNvcmRzLCBhbmQgb25seSB0aGVuIHN0YXJ0IHRoaW5raW5nCi1hYm91dCB0aGUgcXVlcmllcyB0aGF0IHdvdWxkIGFjY2VzcyB0aGVtLiBZb3UgbWF5IGhhdmUgZmVsdCBhIHNpbWlsYXIKLXRlbnNpb24gYWxyZWFkeSB3aGVuIGRpc2N1c3NpbmcgdGhlIHNob3BwaW5nIHF1ZXJpZXMgYmVmb3JlLCB0aGlua2luZwot4oCcYnV0IHdoZXJlIGRpZCB0aGUgaG90ZWwgYW5kIHBvaW50IG9mIGludGVyZXN0IGRhdGEgY29tZSBmcm9tP+KAnSBEb27igJl0Ci13b3JyeSwgeW91IHdpbGwgc2VlIHNvb24gZW5vdWdoLiBIZXJlIGFyZSBzb21lIHF1ZXJpZXMgdGhhdCBkZXNjcmliZSBob3cKLXVzZXJzIHdpbGwgYWNjZXNzIHJlc2VydmF0aW9uczoKLQotKiBRNi4gTG9va3VwIGEgcmVzZXJ2YXRpb24gYnkgY29uZmlybWF0aW9uIG51bWJlci4KLSogUTcuIExvb2t1cCBhIHJlc2VydmF0aW9uIGJ5IGhvdGVsLCBkYXRlLCBhbmQgZ3Vlc3QgbmFtZS4KLSogUTguIExvb2t1cCBhbGwgcmVzZXJ2YXRpb25zIGJ5IGd1ZXN0IG5hbWUuCi0qIFE5LiBWaWV3IGd1ZXN0IGRldGFpbHMuCi0KLUFsbCBvZiB0aGUgcXVlcmllcyBhcmUgc2hvd24gaW4gdGhlIGNvbnRleHQgb2YgdGhlIHdvcmtmbG93IG9mIHRoZQotYXBwbGljYXRpb24gaW4gdGhlIGZpZ3VyZSBiZWxvdy4gRWFjaCBib3ggb24gdGhlIGRpYWdyYW0gcmVwcmVzZW50cyBhCi1zdGVwIGluIHRoZSBhcHBsaWNhdGlvbiB3b3JrZmxvdywgd2l0aCBhcnJvd3MgaW5kaWNhdGluZyB0aGUgZmxvd3MKLWJldHdlZW4gc3RlcHMgYW5kIHRoZSBhc3NvY2lhdGVkIHF1ZXJ5LiBJZiB5b3XigJl2ZSBtb2RlbGVkIHRoZQotYXBwbGljYXRpb24gd2VsbCwgZWFjaCBzdGVwIG9mIHRoZSB3b3JrZmxvdyBhY2NvbXBsaXNoZXMgYSB0YXNrIHRoYXQKLeKAnHVubG9ja3PigJ0gc3Vic2VxdWVudCBzdGVwcy4gRm9yIGV4YW1wbGUsIHRoZSDigJxWaWV3IGhvdGVscyBuZWFyIFBPSeKAnSB0YXNrCi1oZWxwcyB0aGUgYXBwbGljYXRpb24gbGVhcm4gYWJvdXQgc2V2ZXJhbCBob3RlbHMsIGluY2x1ZGluZyB0aGVpciB1bmlxdWUKLWtleXMuIFRoZSBrZXkgZm9yIGEgc2VsZWN0ZWQgaG90ZWwgbWF5IGJlIHVzZWQgYXMgcGFydCBvZiBRMiwgaW4gb3JkZXIKLXRvIG9idGFpbiBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgaG90ZWwuIFRoZSBhY3Qgb2YgYm9va2luZyBhIHJvb20KLWNyZWF0ZXMgYSByZXNlcnZhdGlvbiByZWNvcmQgdGhhdCBtYXkgYmUgYWNjZXNzZWQgYnkgdGhlIGd1ZXN0IGFuZCBob3RlbAotc3RhZmYgYXQgYSBsYXRlciB0aW1lIHRocm91Z2ggdmFyaW91cyBhZGRpdGlvbmFsIHF1ZXJpZXMuCi0KLWltYWdlOjpkYXRhX21vZGVsaW5nX2hvdGVsX3F1ZXJpZXMucG5nW2ltYWdlXQotCi1fTWF0ZXJpYWwgYWRhcHRlZCBmcm9tIENhc3NhbmRyYSwgVGhlIERlZmluaXRpdmUgR3VpZGUuIFB1Ymxpc2hlZCBieQotTydSZWlsbHkgTWVkaWEsIEluYy4gQ29weXJpZ2h0IMKpIDIwMjAgSmVmZiBDYXJwZW50ZXIsIEViZW4gSGV3aXR0LiBBbGwKLXJpZ2h0cyByZXNlcnZlZC4gVXNlZCB3aXRoIHBlcm1pc3Npb24uXwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19yZGJtcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19yZGJtcy5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWNkNmNjLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfcmRibXMuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi09IFJEQk1TIERlc2lnbgotCi1XaGVuIHlvdSBzZXQgb3V0IHRvIGJ1aWxkIGEgbmV3IGRhdGEtZHJpdmVuIGFwcGxpY2F0aW9uIHRoYXQgd2lsbCB1c2UgYQotcmVsYXRpb25hbCBkYXRhYmFzZSwgeW91IG1pZ2h0IHN0YXJ0IGJ5IG1vZGVsaW5nIHRoZSBkb21haW4gYXMgYSBzZXQgb2YKLXByb3Blcmx5IG5vcm1hbGl6ZWQgdGFibGVzIGFuZCB1c2UgZm9yZWlnbiBrZXlzIHRvIHJlZmVyZW5jZSByZWxhdGVkCi1kYXRhIGluIG90aGVyIHRhYmxlcy4KLQotVGhlIGZpZ3VyZSBiZWxvdyBzaG93cyBob3cgeW91IG1pZ2h0IHJlcHJlc2VudCB0aGUgZGF0YSBzdG9yYWdlIGZvciB5b3VyCi1hcHBsaWNhdGlvbiB1c2luZyBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgbW9kZWwuIFRoZSByZWxhdGlvbmFsIG1vZGVsCi1pbmNsdWRlcyBhIGNvdXBsZSBvZiDigJxqb2lu4oCdIHRhYmxlcyBpbiBvcmRlciB0byByZWFsaXplIHRoZSBtYW55LXRvLW1hbnkKLXJlbGF0aW9uc2hpcHMgZnJvbSB0aGUgY29uY2VwdHVhbCBtb2RlbCBvZiBob3RlbHMtdG8tcG9pbnRzIG9mIGludGVyZXN0LAotcm9vbXMtdG8tYW1lbml0aWVzLCByb29tcy10by1hdmFpbGFiaWxpdHksIGFuZCBndWVzdHMtdG8tcm9vbXMgKHZpYSBhCi1yZXNlcnZhdGlvbikuCi0KLWltYWdlOjpkYXRhX21vZGVsaW5nX2hvdGVsX3JlbGF0aW9uYWwucG5nW2ltYWdlXQotCi09PSBEZXNpZ24gRGlmZmVyZW5jZXMgQmV0d2VlbiBSREJNUyBhbmQgQ2Fzc2FuZHJhCi0KLUxldOKAmXMgdGFrZSBhIG1pbnV0ZSB0byBoaWdobGlnaHQgc29tZSBvZiB0aGUga2V5IGRpZmZlcmVuY2VzIGluIGRvaW5nCi1kYXRhIG1vZGVsaW5nIGZvciBDYXNzYW5kcmEgdmVyc3VzIGEgcmVsYXRpb25hbCBkYXRhYmFzZS4KLQotPT09IE5vIGpvaW5zCi0KLVlvdSBjYW5ub3QgcGVyZm9ybSBqb2lucyBpbiBDYXNzYW5kcmEuIElmIHlvdSBoYXZlIGRlc2lnbmVkIGEgZGF0YSBtb2RlbAotYW5kIGZpbmQgdGhhdCB5b3UgbmVlZCBzb21ldGhpbmcgbGlrZSBhIGpvaW4sIHlvdeKAmWxsIGhhdmUgdG8gZWl0aGVyIGRvCi10aGUgd29yayBvbiB0aGUgY2xpZW50IHNpZGUsIG9yIGNyZWF0ZSBhIGRlbm9ybWFsaXplZCBzZWNvbmQgdGFibGUgdGhhdAotcmVwcmVzZW50cyB0aGUgam9pbiByZXN1bHRzIGZvciB5b3UuIFRoaXMgbGF0dGVyIG9wdGlvbiBpcyBwcmVmZXJyZWQgaW4KLUNhc3NhbmRyYSBkYXRhIG1vZGVsaW5nLiBQZXJmb3JtaW5nIGpvaW5zIG9uIHRoZSBjbGllbnQgc2hvdWxkIGJlIGEgdmVyeQotcmFyZSBjYXNlOyB5b3UgcmVhbGx5IHdhbnQgdG8gZHVwbGljYXRlIChkZW5vcm1hbGl6ZSkgdGhlIGRhdGEgaW5zdGVhZC4KLQotPT09IE5vIHJlZmVyZW50aWFsIGludGVncml0eQotCi1BbHRob3VnaCBDYXNzYW5kcmEgc3VwcG9ydHMgZmVhdHVyZXMgc3VjaCBhcyBsaWdodHdlaWdodCB0cmFuc2FjdGlvbnMKLWFuZCBiYXRjaGVzLCBDYXNzYW5kcmEgaXRzZWxmIGhhcyBubyBjb25jZXB0IG9mIHJlZmVyZW50aWFsIGludGVncml0eQotYWNyb3NzIHRhYmxlcy4gSW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlLCB5b3UgY291bGQgc3BlY2lmeSBmb3JlaWduIGtleXMKLWluIGEgdGFibGUgdG8gcmVmZXJlbmNlIHRoZSBwcmltYXJ5IGtleSBvZiBhIHJlY29yZCBpbiBhbm90aGVyIHRhYmxlLgotQnV0IENhc3NhbmRyYSBkb2VzIG5vdCBlbmZvcmNlIHRoaXMuIEl0IGlzIHN0aWxsIGEgY29tbW9uIGRlc2lnbgotcmVxdWlyZW1lbnQgdG8gc3RvcmUgSURzIHJlbGF0ZWQgdG8gb3RoZXIgZW50aXRpZXMgaW4geW91ciB0YWJsZXMsIGJ1dAotb3BlcmF0aW9ucyBzdWNoIGFzIGNhc2NhZGluZyBkZWxldGVzIGFyZSBub3QgYXZhaWxhYmxlLgotCi09PT0gRGVub3JtYWxpemF0aW9uCi0KLUluIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduLCB5b3UgYXJlIG9mdGVuIHRhdWdodCB0aGUgaW1wb3J0YW5jZSBvZgotbm9ybWFsaXphdGlvbi4gVGhpcyBpcyBub3QgYW4gYWR2YW50YWdlIHdoZW4gd29ya2luZyB3aXRoIENhc3NhbmRyYQotYmVjYXVzZSBpdCBwZXJmb3JtcyBiZXN0IHdoZW4gdGhlIGRhdGEgbW9kZWwgaXMgZGVub3JtYWxpemVkLiBJdCBpcwotb2Z0ZW4gdGhlIGNhc2UgdGhhdCBjb21wYW5pZXMgZW5kIHVwIGRlbm9ybWFsaXppbmcgZGF0YSBpbiByZWxhdGlvbmFsCi1kYXRhYmFzZXMgYXMgd2VsbC4gVGhlcmUgYXJlIHR3byBjb21tb24gcmVhc29ucyBmb3IgdGhpcy4gT25lIGlzCi1wZXJmb3JtYW5jZS4gQ29tcGFuaWVzIHNpbXBseSBjYW7igJl0IGdldCB0aGUgcGVyZm9ybWFuY2UgdGhleSBuZWVkIHdoZW4KLXRoZXkgaGF2ZSB0byBkbyBzbyBtYW55IGpvaW5zIG9uIHllYXJz4oCZIHdvcnRoIG9mIGRhdGEsIHNvIHRoZXkKLWRlbm9ybWFsaXplIGFsb25nIHRoZSBsaW5lcyBvZiBrbm93biBxdWVyaWVzLiBUaGlzIGVuZHMgdXAgd29ya2luZywgYnV0Ci1nb2VzIGFnYWluc3QgdGhlIGdyYWluIG9mIGhvdyByZWxhdGlvbmFsIGRhdGFiYXNlcyBhcmUgaW50ZW5kZWQgdG8gYmUKLWRlc2lnbmVkLCBhbmQgdWx0aW1hdGVseSBtYWtlcyBvbmUgcXVlc3Rpb24gd2hldGhlciB1c2luZyBhIHJlbGF0aW9uYWwKLWRhdGFiYXNlIGlzIHRoZSBiZXN0IGFwcHJvYWNoIGluIHRoZXNlIGNpcmN1bXN0YW5jZXMuCi0KLUEgc2Vjb25kIHJlYXNvbiB0aGF0IHJlbGF0aW9uYWwgZGF0YWJhc2VzIGdldCBkZW5vcm1hbGl6ZWQgb24gcHVycG9zZSBpcwotYSBidXNpbmVzcyBkb2N1bWVudCBzdHJ1Y3R1cmUgdGhhdCByZXF1aXJlcyByZXRlbnRpb24uIFRoYXQgaXMsIHlvdSBoYXZlCi1hbiBlbmNsb3NpbmcgdGFibGUgdGhhdCByZWZlcnMgdG8gYSBsb3Qgb2YgZXh0ZXJuYWwgdGFibGVzIHdob3NlIGRhdGEKLWNvdWxkIGNoYW5nZSBvdmVyIHRpbWUsIGJ1dCB5b3UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgZW5jbG9zaW5nIGRvY3VtZW50Ci1hcyBhIHNuYXBzaG90IGluIGhpc3RvcnkuIFRoZSBjb21tb24gZXhhbXBsZSBoZXJlIGlzIHdpdGggaW52b2ljZXMuIFlvdQotYWxyZWFkeSBoYXZlIGN1c3RvbWVyIGFuZCBwcm9kdWN0IHRhYmxlcywgYW5kIHlvdeKAmWQgdGhpbmsgdGhhdCB5b3UgY291bGQKLWp1c3QgbWFrZSBhbiBpbnZvaWNlIHRoYXQgcmVmZXJzIHRvIHRob3NlIHRhYmxlcy4gQnV0IHRoaXMgc2hvdWxkIG5ldmVyCi1iZSBkb25lIGluIHByYWN0aWNlLiBDdXN0b21lciBvciBwcmljZSBpbmZvcm1hdGlvbiBjb3VsZCBjaGFuZ2UsIGFuZAotdGhlbiB5b3Ugd291bGQgbG9zZSB0aGUgaW50ZWdyaXR5IG9mIHRoZSBpbnZvaWNlIGRvY3VtZW50IGFzIGl0IHdhcyBvbgotdGhlIGludm9pY2UgZGF0ZSwgd2hpY2ggY291bGQgdmlvbGF0ZSBhdWRpdHMsIHJlcG9ydHMsIG9yIGxhd3MsIGFuZAotY2F1c2Ugb3RoZXIgcHJvYmxlbXMuCi0KLUluIHRoZSByZWxhdGlvbmFsIHdvcmxkLCBkZW5vcm1hbGl6YXRpb24gdmlvbGF0ZXMgQ29kZOKAmXMgbm9ybWFsIGZvcm1zLAotYW5kIHlvdSB0cnkgdG8gYXZvaWQgaXQuIEJ1dCBpbiBDYXNzYW5kcmEsIGRlbm9ybWFsaXphdGlvbiBpcywgd2VsbCwKLXBlcmZlY3RseSBub3JtYWwuIEl04oCZcyBub3QgcmVxdWlyZWQgaWYgeW91ciBkYXRhIG1vZGVsIGlzIHNpbXBsZS4gQnV0Ci1kb27igJl0IGJlIGFmcmFpZCBvZiBpdC4KLQotSGlzdG9yaWNhbGx5LCBkZW5vcm1hbGl6YXRpb24gaW4gQ2Fzc2FuZHJhIGhhcyByZXF1aXJlZCBkZXNpZ25pbmcgYW5kCi1tYW5hZ2luZyBtdWx0aXBsZSB0YWJsZXMgdXNpbmcgdGVjaG5pcXVlcyBkZXNjcmliZWQgaW4gdGhpcwotZG9jdW1lbnRhdGlvbi4gQmVnaW5uaW5nIHdpdGggdGhlIDMuMCByZWxlYXNlLCBDYXNzYW5kcmEgcHJvdmlkZXMgYQotZmVhdHVyZSBrbm93biBhcyBgbWF0ZXJpYWxpemVkIHZpZXdzIDxtYXRlcmlhbGl6ZWQtdmlld3M+YCB3aGljaCBhbGxvd3MKLXlvdSB0byBjcmVhdGUgbXVsdGlwbGUgZGVub3JtYWxpemVkIHZpZXdzIG9mIGRhdGEgYmFzZWQgb24gYSBiYXNlIHRhYmxlCi1kZXNpZ24uIENhc3NhbmRyYSBtYW5hZ2VzIG1hdGVyaWFsaXplZCB2aWV3cyBvbiB0aGUgc2VydmVyLCBpbmNsdWRpbmcKLXRoZSB3b3JrIG9mIGtlZXBpbmcgdGhlIHZpZXdzIGluIHN5bmMgd2l0aCB0aGUgdGFibGUuCi0KLT09PSBRdWVyeS1maXJzdCBkZXNpZ24KLQotUmVsYXRpb25hbCBtb2RlbGluZywgaW4gc2ltcGxlIHRlcm1zLCBtZWFucyB0aGF0IHlvdSBzdGFydCBmcm9tIHRoZQotY29uY2VwdHVhbCBkb21haW4gYW5kIHRoZW4gcmVwcmVzZW50IHRoZSBub3VucyBpbiB0aGUgZG9tYWluIGluIHRhYmxlcy4KLVlvdSB0aGVuIGFzc2lnbiBwcmltYXJ5IGtleXMgYW5kIGZvcmVpZ24ga2V5cyB0byBtb2RlbCByZWxhdGlvbnNoaXBzLgotV2hlbiB5b3UgaGF2ZSBhIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAsIHlvdSBjcmVhdGUgdGhlIGpvaW4gdGFibGVzCi10aGF0IHJlcHJlc2VudCBqdXN0IHRob3NlIGtleXMuIFRoZSBqb2luIHRhYmxlcyBkb27igJl0IGV4aXN0IGluIHRoZSByZWFsCi13b3JsZCwgYW5kIGFyZSBhIG5lY2Vzc2FyeSBzaWRlIGVmZmVjdCBvZiB0aGUgd2F5IHJlbGF0aW9uYWwgbW9kZWxzCi13b3JrLiBBZnRlciB5b3UgaGF2ZSBhbGwgeW91ciB0YWJsZXMgbGFpZCBvdXQsIHlvdSBjYW4gc3RhcnQgd3JpdGluZwotcXVlcmllcyB0aGF0IHB1bGwgdG9nZXRoZXIgZGlzcGFyYXRlIGRhdGEgdXNpbmcgdGhlIHJlbGF0aW9uc2hpcHMKLWRlZmluZWQgYnkgdGhlIGtleXMuIFRoZSBxdWVyaWVzIGluIHRoZSByZWxhdGlvbmFsIHdvcmxkIGFyZSB2ZXJ5IG11Y2gKLXNlY29uZGFyeS4gSXQgaXMgYXNzdW1lZCB0aGF0IHlvdSBjYW4gYWx3YXlzIGdldCB0aGUgZGF0YSB5b3Ugd2FudCBhcwotbG9uZyBhcyB5b3UgaGF2ZSB5b3VyIHRhYmxlcyBtb2RlbGVkIHByb3Blcmx5LiBFdmVuIGlmIHlvdSBoYXZlIHRvIHVzZQotc2V2ZXJhbCBjb21wbGV4IHN1YnF1ZXJpZXMgb3Igam9pbiBzdGF0ZW1lbnRzLCB0aGlzIGlzIHVzdWFsbHkgdHJ1ZS4KLQotQnkgY29udHJhc3QsIGluIENhc3NhbmRyYSB5b3UgZG9u4oCZdCBzdGFydCB3aXRoIHRoZSBkYXRhIG1vZGVsOyB5b3Ugc3RhcnQKLXdpdGggdGhlIHF1ZXJ5IG1vZGVsLiBJbnN0ZWFkIG9mIG1vZGVsaW5nIHRoZSBkYXRhIGZpcnN0IGFuZCB0aGVuCi13cml0aW5nIHF1ZXJpZXMsIHdpdGggQ2Fzc2FuZHJhIHlvdSBtb2RlbCB0aGUgcXVlcmllcyBhbmQgbGV0IHRoZSBkYXRhCi1iZSBvcmdhbml6ZWQgYXJvdW5kIHRoZW0uIFRoaW5rIG9mIHRoZSBtb3N0IGNvbW1vbiBxdWVyeSBwYXRocyB5b3VyCi1hcHBsaWNhdGlvbiB3aWxsIHVzZSwgYW5kIHRoZW4gY3JlYXRlIHRoZSB0YWJsZXMgdGhhdCB5b3UgbmVlZCB0bwotc3VwcG9ydCB0aGVtLgotCi1EZXRyYWN0b3JzIGhhdmUgc3VnZ2VzdGVkIHRoYXQgZGVzaWduaW5nIHRoZSBxdWVyaWVzIGZpcnN0IGlzIG92ZXJseQotY29uc3RyYWluaW5nIG9uIGFwcGxpY2F0aW9uIGRlc2lnbiwgbm90IHRvIG1lbnRpb24gZGF0YWJhc2UgbW9kZWxpbmcuCi1CdXQgaXQgaXMgcGVyZmVjdGx5IHJlYXNvbmFibGUgdG8gZXhwZWN0IHRoYXQgeW91IHNob3VsZCB0aGluayBoYXJkCi1hYm91dCB0aGUgcXVlcmllcyBpbiB5b3VyIGFwcGxpY2F0aW9uLCBqdXN0IGFzIHlvdSB3b3VsZCwgcHJlc3VtYWJseSwKLXRoaW5rIGhhcmQgYWJvdXQgeW91ciByZWxhdGlvbmFsIGRvbWFpbi4gWW91IG1heSBnZXQgaXQgd3JvbmcsIGFuZCB0aGVuCi15b3XigJlsbCBoYXZlIHByb2JsZW1zIGluIGVpdGhlciB3b3JsZC4gT3IgeW91ciBxdWVyeSBuZWVkcyBtaWdodCBjaGFuZ2UKLW92ZXIgdGltZSwgYW5kIHRoZW4geW914oCZbGwgaGF2ZSB0byB3b3JrIHRvIHVwZGF0ZSB5b3VyIGRhdGEgc2V0LiBCdXQKLXRoaXMgaXMgbm8gZGlmZmVyZW50IGZyb20gZGVmaW5pbmcgdGhlIHdyb25nIHRhYmxlcywgb3IgbmVlZGluZwotYWRkaXRpb25hbCB0YWJsZXMsIGluIGFuIFJEQk1TLgotCi09PT0gRGVzaWduaW5nIGZvciBvcHRpbWFsIHN0b3JhZ2UKLQotSW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlLCBpdCBpcyBmcmVxdWVudGx5IHRyYW5zcGFyZW50IHRvIHRoZSB1c2VyIGhvdwotdGFibGVzIGFyZSBzdG9yZWQgb24gZGlzaywgYW5kIGl0IGlzIHJhcmUgdG8gaGVhciBvZiByZWNvbW1lbmRhdGlvbnMKLWFib3V0IGRhdGEgbW9kZWxpbmcgYmFzZWQgb24gaG93IHRoZSBSREJNUyBtaWdodCBzdG9yZSB0YWJsZXMgb24gZGlzay4KLUhvd2V2ZXIsIHRoYXQgaXMgYW4gaW1wb3J0YW50IGNvbnNpZGVyYXRpb24gaW4gQ2Fzc2FuZHJhLiBCZWNhdXNlCi1DYXNzYW5kcmEgdGFibGVzIGFyZSBlYWNoIHN0b3JlZCBpbiBzZXBhcmF0ZSBmaWxlcyBvbiBkaXNrLCBpdOKAmXMKLWltcG9ydGFudCB0byBrZWVwIHJlbGF0ZWQgY29sdW1ucyBkZWZpbmVkIHRvZ2V0aGVyIGluIHRoZSBzYW1lIHRhYmxlLgotCi1BIGtleSBnb2FsIHRoYXQgeW91IHdpbGwgc2VlIGFzIHlvdSBiZWdpbiBjcmVhdGluZyBkYXRhIG1vZGVscyBpbgotQ2Fzc2FuZHJhIGlzIHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgcGFydGl0aW9ucyB0aGF0IG11c3QgYmUgc2VhcmNoZWQKLWluIG9yZGVyIHRvIHNhdGlzZnkgYSBnaXZlbiBxdWVyeS4gQmVjYXVzZSB0aGUgcGFydGl0aW9uIGlzIGEgdW5pdCBvZgotc3RvcmFnZSB0aGF0IGRvZXMgbm90IGdldCBkaXZpZGVkIGFjcm9zcyBub2RlcywgYSBxdWVyeSB0aGF0IHNlYXJjaGVzIGEKLXNpbmdsZSBwYXJ0aXRpb24gd2lsbCB0eXBpY2FsbHkgeWllbGQgdGhlIGJlc3QgcGVyZm9ybWFuY2UuCi0KLT09PSBTb3J0aW5nIGlzIGEgZGVzaWduIGRlY2lzaW9uCi0KLUluIGFuIFJEQk1TLCB5b3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIG9yZGVyIGluIHdoaWNoIHJlY29yZHMgYXJlCi1yZXR1cm5lZCB0byB5b3UgYnkgdXNpbmcgYE9SREVSIEJZYCBpbiB5b3VyIHF1ZXJ5LiBUaGUgZGVmYXVsdCBzb3J0Ci1vcmRlciBpcyBub3QgY29uZmlndXJhYmxlOyBieSBkZWZhdWx0LCByZWNvcmRzIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIKLWluIHdoaWNoIHRoZXkgYXJlIHdyaXR0ZW4uIElmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgb3JkZXIsIHlvdSBqdXN0Ci1tb2RpZnkgeW91ciBxdWVyeSwgYW5kIHlvdSBjYW4gc29ydCBieSBhbnkgbGlzdCBvZiBjb2x1bW5zLgotCi1JbiBDYXNzYW5kcmEsIGhvd2V2ZXIsIHNvcnRpbmcgaXMgdHJlYXRlZCBkaWZmZXJlbnRseTsgaXQgaXMgYSBkZXNpZ24KLWRlY2lzaW9uLiBUaGUgc29ydCBvcmRlciBhdmFpbGFibGUgb24gcXVlcmllcyBpcyBmaXhlZCwgYW5kIGlzCi1kZXRlcm1pbmVkIGVudGlyZWx5IGJ5IHRoZSBzZWxlY3Rpb24gb2YgY2x1c3RlcmluZyBjb2x1bW5zIHlvdSBzdXBwbHkgaW4KLXRoZSBgQ1JFQVRFIFRBQkxFYCBjb21tYW5kLiBUaGUgQ1FMIGBTRUxFQ1RgIHN0YXRlbWVudCBkb2VzIHN1cHBvcnQKLWBPUkRFUiBCWWAgc2VtYW50aWNzLCBidXQgb25seSBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSBjbHVzdGVyaW5nCi1jb2x1bW5zLgotCi1fTWF0ZXJpYWwgYWRhcHRlZCBmcm9tIENhc3NhbmRyYSwgVGhlIERlZmluaXRpdmUgR3VpZGUuIFB1Ymxpc2hlZCBieQotTydSZWlsbHkgTWVkaWEsIEluYy4gQ29weXJpZ2h0IMKpIDIwMjAgSmVmZiBDYXJwZW50ZXIsIEViZW4gSGV3aXR0LiBBbGwKLXJpZ2h0cyByZXNlcnZlZC4gVXNlZCB3aXRoIHBlcm1pc3Npb24uXwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19yZWZpbmluZy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19yZWZpbmluZy5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDVhODBjLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfcmVmaW5pbmcuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi09IEV2YWx1YXRpbmcgYW5kIFJlZmluaW5nIERhdGEgTW9kZWxzCi06c3RlbTogbGF0ZXhtYXRoCi0KLU9uY2UgeW914oCZdmUgY3JlYXRlZCBhIHBoeXNpY2FsIG1vZGVsLCB0aGVyZSBhcmUgc29tZSBzdGVwcyB5b3XigJlsbCB3YW50Ci10byB0YWtlIHRvIGV2YWx1YXRlIGFuZCByZWZpbmUgdGFibGUgZGVzaWducyB0byBoZWxwIGVuc3VyZSBvcHRpbWFsCi1wZXJmb3JtYW5jZS4KLQotPT0gQ2FsY3VsYXRpbmcgUGFydGl0aW9uIFNpemUKLQotVGhlIGZpcnN0IHRoaW5nIHRoYXQgeW91IHdhbnQgdG8gbG9vayBmb3IgaXMgd2hldGhlciB5b3VyIHRhYmxlcyB3aWxsCi1oYXZlIHBhcnRpdGlvbnMgdGhhdCB3aWxsIGJlIG92ZXJseSBsYXJnZSwgb3IgdG8gcHV0IGl0IGFub3RoZXIgd2F5LCB0b28KLXdpZGUuIFBhcnRpdGlvbiBzaXplIGlzIG1lYXN1cmVkIGJ5IHRoZSBudW1iZXIgb2YgY2VsbHMgKHZhbHVlcykgdGhhdAotYXJlIHN0b3JlZCBpbiB0aGUgcGFydGl0aW9uLiBDYXNzYW5kcmHigJlzIGhhcmQgbGltaXQgaXMgMiBiaWxsaW9uIGNlbGxzCi1wZXIgcGFydGl0aW9uLCBidXQgeW914oCZbGwgbGlrZWx5IHJ1biBpbnRvIHBlcmZvcm1hbmNlIGlzc3VlcyBiZWZvcmUKLXJlYWNoaW5nIHRoYXQgbGltaXQuCi0KLUluIG9yZGVyIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBwYXJ0aXRpb25zLCB1c2UgdGhlIGZvbGxvd2luZyBmb3JtdWxhOgotCi1bbGF0ZXhtYXRoXQotKysrKwotXFtOX3YgPSBOX3IgKE5fYyAtIE5fe3BrfSAtIE5fcykgKyBOX3NcXQotKysrKwotCi1UaGUgbnVtYmVyIG9mIHZhbHVlcyAob3IgY2VsbHMpIGluIHRoZSBwYXJ0aXRpb24gKE5+dn4pIGlzIGVxdWFsIHRvIHRoZQotbnVtYmVyIG9mIHN0YXRpYyBjb2x1bW5zIChOfnN+KSBwbHVzIHRoZSBwcm9kdWN0IG9mIHRoZSBudW1iZXIgb2Ygcm93cwotKE5+cn4pIGFuZCB0aGUgbnVtYmVyIG9mIG9mIHZhbHVlcyBwZXIgcm93LiBUaGUgbnVtYmVyIG9mIHZhbHVlcyBwZXIgcm93Ci1pcyBkZWZpbmVkIGFzIHRoZSBudW1iZXIgb2YgY29sdW1ucyAoTn5jfikgbWludXMgdGhlIG51bWJlciBvZiBwcmltYXJ5Ci1rZXkgY29sdW1ucyAoTn5wa34pIGFuZCBzdGF0aWMgY29sdW1ucyAoTn5zfikuCi0KLVRoZSBudW1iZXIgb2YgY29sdW1ucyB0ZW5kcyB0byBiZSByZWxhdGl2ZWx5IHN0YXRpYywgYWx0aG91Z2ggaXQgaXMKLXBvc3NpYmxlIHRvIGFsdGVyIHRhYmxlcyBhdCBydW50aW1lLiBGb3IgdGhpcyByZWFzb24sIGEgcHJpbWFyeSBkcml2ZXIKLW9mIHBhcnRpdGlvbiBzaXplIGlzIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgcGFydGl0aW9uLiBUaGlzIGlzIGEga2V5Ci1mYWN0b3IgdGhhdCB5b3UgbXVzdCBjb25zaWRlciBpbiBkZXRlcm1pbmluZyB3aGV0aGVyIGEgcGFydGl0aW9uIGhhcyB0aGUKLXBvdGVudGlhbCB0byBnZXQgdG9vIGxhcmdlLiBUd28gYmlsbGlvbiB2YWx1ZXMgc291bmRzIGxpa2UgYSBsb3QsIGJ1dCBpbgotYSBzZW5zb3Igc3lzdGVtIHdoZXJlIHRlbnMgb3IgaHVuZHJlZHMgb2YgdmFsdWVzIGFyZSBtZWFzdXJlZCBldmVyeQotbWlsbGlzZWNvbmQsIHRoZSBudW1iZXIgb2YgdmFsdWVzIHN0YXJ0cyB0byBhZGQgdXAgcHJldHR5IGZhc3QuCi0KLUxldOKAmXMgdGFrZSBhIGxvb2sgYXQgb25lIG9mIHRoZSB0YWJsZXMgdG8gYW5hbHl6ZSB0aGUgcGFydGl0aW9uIHNpemUuCi1CZWNhdXNlIGl0IGhhcyBhIHdpZGUgcGFydGl0aW9uIGRlc2lnbiB3aXRoIG9uZSBwYXJ0aXRpb24gcGVyIGhvdGVsLAotbG9vayBhdCB0aGUgYGF2YWlsYWJsZV9yb29tc19ieV9ob3RlbF9kYXRlYCB0YWJsZS4gVGhlIHRhYmxlIGhhcyBmb3VyCi1jb2x1bW5zIHRvdGFsIChOfmN+ID0gNCksIGluY2x1ZGluZyB0aHJlZSBwcmltYXJ5IGtleSBjb2x1bW5zIChOfnBrfiA9Ci0zKSBhbmQgbm8gc3RhdGljIGNvbHVtbnMgKE5+c34gPSAwKS4gUGx1Z2dpbmcgdGhlc2UgdmFsdWVzIGludG8gdGhlCi1mb3JtdWxhLCB0aGUgcmVzdWx0IGlzOgotCi1bbGF0ZXhtYXRoXQotKysrKwotXFtOX3YgPSBOX3IgKDQgLSAzIC0gMCkgKyAwID0gMU5fclxdCi0rKysrCi0KLVRoZXJlZm9yZSB0aGUgbnVtYmVyIG9mIHZhbHVlcyBmb3IgdGhpcyB0YWJsZSBpcyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mCi1yb3dzLiBZb3Ugc3RpbGwgbmVlZCB0byBkZXRlcm1pbmUgYSBudW1iZXIgb2Ygcm93cy4gVG8gZG8gdGhpcywgbWFrZQotZXN0aW1hdGVzIGJhc2VkIG9uIHRoZSBhcHBsaWNhdGlvbiBkZXNpZ24uIFRoZSB0YWJsZSBpcyBzdG9yaW5nIGEgcmVjb3JkCi1mb3IgZWFjaCByb29tLCBpbiBlYWNoIG9mIGhvdGVsLCBmb3IgZXZlcnkgbmlnaHQuIExldCdzIGFzc3VtZSB0aGUKLXN5c3RlbSB3aWxsIGJlIHVzZWQgdG8gc3RvcmUgdHdvIHllYXJzIG9mIGludmVudG9yeSBhdCBhIHRpbWUsIGFuZCB0aGVyZQotYXJlIDUsMDAwIGhvdGVscyBpbiB0aGUgc3lzdGVtLCB3aXRoIGFuIGF2ZXJhZ2Ugb2YgMTAwIHJvb21zIGluIGVhY2gKLWhvdGVsLgotCi1TaW5jZSB0aGVyZSBpcyBhIHBhcnRpdGlvbiBmb3IgZWFjaCBob3RlbCwgdGhlIGVzdGltYXRlZCBudW1iZXIgb2Ygcm93cwotcGVyIHBhcnRpdGlvbiBpcyBhcyBmb2xsb3dzOgotCi1bbGF0ZXhtYXRoXQotKysrKwotXFtOX3IgPSAxMDAgcm9vbXMvaG90ZWwgXHRpbWVzIDczMCBkYXlzID0gNzMsMDAwIHJvd3NcXQotKysrKwotCi1UaGlzIHJlbGF0aXZlbHkgc21hbGwgbnVtYmVyIG9mIHJvd3MgcGVyIHBhcnRpdGlvbiBpcyBub3QgZ29pbmcgdG8gZ2V0Ci15b3UgaW4gdG9vIG11Y2ggdHJvdWJsZSwgYnV0IGlmIHlvdSBzdGFydCBzdG9yaW5nIG1vcmUgZGF0ZXMgb2YKLWludmVudG9yeSwgb3IgZG9u4oCZdCBtYW5hZ2UgdGhlIHNpemUgb2YgdGhlIGludmVudG9yeSB3ZWxsIHVzaW5nIFRUTCwgeW91Ci1jb3VsZCBzdGFydCBoYXZpbmcgaXNzdWVzLiBZb3Ugc3RpbGwgbWlnaHQgd2FudCB0byBsb29rIGF0IGJyZWFraW5nIHVwCi10aGlzIGxhcmdlIHBhcnRpdGlvbiwgd2hpY2ggeW91J2xsIHNlZSBob3cgdG8gZG8gc2hvcnRseS4KLQotV2hlbiBwZXJmb3JtaW5nIHNpemluZyBjYWxjdWxhdGlvbnMsIGl0IGlzIHRlbXB0aW5nIHRvIGFzc3VtZSB0aGUKLW5vbWluYWwgb3IgYXZlcmFnZSBjYXNlIGZvciB2YXJpYWJsZXMgc3VjaCBhcyB0aGUgbnVtYmVyIG9mIHJvd3MuCi1Db25zaWRlciBjYWxjdWxhdGluZyB0aGUgd29yc3QgY2FzZSBhcyB3ZWxsLCBhcyB0aGVzZSBzb3J0cyBvZgotcHJlZGljdGlvbnMgaGF2ZSBhIHdheSBvZiBjb21pbmcgdHJ1ZSBpbiBzdWNjZXNzZnVsIHN5c3RlbXMuCi0KLT09IENhbGN1bGF0aW5nIFNpemUgb24gRGlzawotCi1JbiBhZGRpdGlvbiB0byBjYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiBhIHBhcnRpdGlvbiwgaXQgaXMgYWxzbyBhbgotZXhjZWxsZW50IGlkZWEgdG8gZXN0aW1hdGUgdGhlIGFtb3VudCBvZiBkaXNrIHNwYWNlIHRoYXQgd2lsbCBiZQotcmVxdWlyZWQgZm9yIGVhY2ggdGFibGUgeW91IHBsYW4gdG8gc3RvcmUgaW4gdGhlIGNsdXN0ZXIuIEluIG9yZGVyIHRvCi1kZXRlcm1pbmUgdGhlIHNpemUsIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGEgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIFN+dH4KLW9mIGEgcGFydGl0aW9uOgotCi1bbGF0ZXhtYXRoXQotKysrKwotXFtTX3QgPSBcZGlzcGxheXN0eWxlXHN1bV9pIHNpemVPZlxiaWcgKGNfe2tfaX1cYmlnKSArIFxkaXNwbGF5c3R5bGVcc3VtX2ogc2l6ZU9mXGJpZyhjX3tzX2p9XGJpZykgKyBOX3JcdGltZXMgXGJpZ2coXGRpc3BsYXlzdHlsZVxzdW1fayBzaXplT2ZcYmlnKGNfe3Jfa31cYmlnKSArIFxkaXNwbGF5c3R5bGVcc3VtX2wgc2l6ZU9mXGJpZyhjX3tjX2x9XGJpZylcYmlnZykgK1xdCi0rKysrCi0KLVtsYXRleG1hdGhdCi0rKysrCi1cW05fdlx0aW1lcyBzaXplT2ZcYmlnKHRfe2F2Z31cYmlnKVxdCi0rKysrCi0KLVRoaXMgaXMgYSBiaXQgbW9yZSBjb21wbGV4IHRoYW4gdGhlIHByZXZpb3VzIGZvcm11bGEsIGJ1dCBsZXQncyBicmVhayBpdAotZG93biBhIGJpdCBhdCBhIHRpbWUuIExldOKAmXMgdGFrZSBhIGxvb2sgYXQgdGhlIG5vdGF0aW9uIGZpcnN0OgotCi0qIEluIHRoaXMgZm9ybXVsYSwgY35rfiByZWZlcnMgdG8gcGFydGl0aW9uIGtleSBjb2x1bW5zLCBjfnN+IHRvIHN0YXRpYwotY29sdW1ucywgY35yfiB0byByZWd1bGFyIGNvbHVtbnMsIGFuZCBjfmN+IHRvIGNsdXN0ZXJpbmcgY29sdW1ucy4KLSogVGhlIHRlcm0gdH5hdmd+IHJlZmVycyB0byB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYnl0ZXMgb2YgbWV0YWRhdGEKLXN0b3JlZCBwZXIgY2VsbCwgc3VjaCBhcyB0aW1lc3RhbXBzLiBJdCBpcyB0eXBpY2FsIHRvIHVzZSBhbiBlc3RpbWF0ZSBvZgotOCBieXRlcyBmb3IgdGhpcyB2YWx1ZS4KLSogWW91J2xsIHJlY29nbml6ZSB0aGUgbnVtYmVyIG9mIHJvd3MgTn5yfiBhbmQgbnVtYmVyIG9mIHZhbHVlcyBOfnZ+Ci1mcm9tIHByZXZpb3VzIGNhbGN1bGF0aW9ucy4KLSogVGhlICpzaXplT2YoKSogZnVuY3Rpb24gcmVmZXJzIHRvIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBDUUwgZGF0YQotdHlwZSBvZiBlYWNoIHJlZmVyZW5jZWQgY29sdW1uLgotCi1UaGUgZmlyc3QgdGVybSBhc2tzIHlvdSB0byBzdW0gdGhlIHNpemUgb2YgdGhlIHBhcnRpdGlvbiBrZXkgY29sdW1ucy4KLUZvciB0aGlzIGV4YW1wbGUsIHRoZSBgYXZhaWxhYmxlX3Jvb21zX2J5X2hvdGVsX2RhdGVgIHRhYmxlIGhhcyBhIHNpbmdsZQotcGFydGl0aW9uIGtleSBjb2x1bW4sIHRoZSBgaG90ZWxfaWRgLCB3aGljaCBpcyBvZiB0eXBlIGB0ZXh0YC4gQXNzdW1pbmcKLXRoYXQgaG90ZWwgaWRlbnRpZmllcnMgYXJlIHNpbXBsZSA1LWNoYXJhY3RlciBjb2RlcywgeW91IGhhdmUgYSA1LWJ5dGUKLXZhbHVlLCBzbyB0aGUgc3VtIG9mIHRoZSBwYXJ0aXRpb24ga2V5IGNvbHVtbiBzaXplcyBpcyA1IGJ5dGVzLgotCi1UaGUgc2Vjb25kIHRlcm0gYXNrcyB5b3UgdG8gc3VtIHRoZSBzaXplIG9mIHRoZSBzdGF0aWMgY29sdW1ucy4gVGhpcwotdGFibGUgaGFzIG5vIHN0YXRpYyBjb2x1bW5zLCBzbyB0aGUgc2l6ZSBpcyAwIGJ5dGVzLgotCi1UaGUgdGhpcmQgdGVybSBpcyB0aGUgbW9zdCBpbnZvbHZlZCwgYW5kIGZvciBnb29kIHJlYXNvbuKAlGl0IGlzCi1jYWxjdWxhdGluZyB0aGUgc2l6ZSBvZiB0aGUgY2VsbHMgaW4gdGhlIHBhcnRpdGlvbi4gU3VtIHRoZSBzaXplIG9mIHRoZQotY2x1c3RlcmluZyBjb2x1bW5zIGFuZCByZWd1bGFyIGNvbHVtbnMuIFRoZSB0d28gY2x1c3RlcmluZyBjb2x1bW5zIGFyZQotdGhlIGBkYXRlYCwgd2hpY2ggaXMgNCBieXRlcywgYW5kIHRoZSBgcm9vbV9udW1iZXJgLCB3aGljaCBpcyBhIDItYnl0ZQotc2hvcnQgaW50ZWdlciwgZ2l2aW5nIGEgc3VtIG9mIDYgYnl0ZXMuIFRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgcmVndWxhcgotY29sdW1uLCB0aGUgYm9vbGVhbiBgaXNfYXZhaWxhYmxlYCwgd2hpY2ggaXMgMSBieXRlIGluIHNpemUuIFN1bW1pbmcgdGhlCi1yZWd1bGFyIGNvbHVtbiBzaXplICgxIGJ5dGUpIHBsdXMgdGhlIGNsdXN0ZXJpbmcgY29sdW1uIHNpemUgKDYgYnl0ZXMpCi1naXZlcyBhIHRvdGFsIG9mIDcgYnl0ZXMuIFRvIGZpbmlzaCB1cCB0aGUgdGVybSwgbXVsdGlwbHkgdGhpcyB2YWx1ZSBieQotdGhlIG51bWJlciBvZiByb3dzICg3MywwMDApLCBnaXZpbmcgYSByZXN1bHQgb2YgNTExLDAwMCBieXRlcyAoMC41MSBNQikuCi0KLVRoZSBmb3VydGggdGVybSBpcyBzaW1wbHkgY291bnRpbmcgdGhlIG1ldGFkYXRhIHRoYXQgdGhhdCBDYXNzYW5kcmEKLXN0b3JlcyBmb3IgZWFjaCBjZWxsLiBJbiB0aGUgc3RvcmFnZSBmb3JtYXQgdXNlZCBieSBDYXNzYW5kcmEgMy4wIGFuZAotbGF0ZXIsIHRoZSBhbW91bnQgb2YgbWV0YWRhdGEgZm9yIGEgZ2l2ZW4gY2VsbCB2YXJpZXMgYmFzZWQgb24gdGhlIHR5cGUKLW9mIGRhdGEgYmVpbmcgc3RvcmVkLCBhbmQgd2hldGhlciBvciBub3QgY3VzdG9tIHRpbWVzdGFtcCBvciBUVEwgdmFsdWVzCi1hcmUgc3BlY2lmaWVkIGZvciBpbmRpdmlkdWFsIGNlbGxzLiBGb3IgdGhpcyB0YWJsZSwgcmV1c2UgdGhlIG51bWJlciBvZgotdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIGNhbGN1bGF0aW9uICg3MywwMDApIGFuZCBtdWx0aXBseSBieSA4LCB3aGljaAotZ2l2ZXMgMC41OCBNQi4KLQotQWRkaW5nIHRoZXNlIHRlcm1zIHRvZ2V0aGVyLCB5b3UgZ2V0IGEgZmluYWwgZXN0aW1hdGU6Ci0KLVtsYXRleG1hdGhdCi0rKysrCi1cW1BhcnRpdGlvbiBzaXplID0gMTYgYnl0ZXMgKyAwIGJ5dGVzICsgMC41MSBNQiArIDAuNTggTUIgPSAxLjEgTUJcXQotKysrKwotCi1UaGlzIGZvcm11bGEgaXMgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgYWN0dWFsIHNpemUgb2YgYSBwYXJ0aXRpb24gb24KLWRpc2ssIGJ1dCBpcyBhY2N1cmF0ZSBlbm91Z2ggdG8gYmUgcXVpdGUgdXNlZnVsLiBSZW1lbWJlcmluZyB0aGF0IHRoZQotcGFydGl0aW9uIG11c3QgYmUgYWJsZSB0byBmaXQgb24gYSBzaW5nbGUgbm9kZSwgaXQgbG9va3MgbGlrZSB0aGUgdGFibGUKLWRlc2lnbiB3aWxsIG5vdCBwdXQgYSBsb3Qgb2Ygc3RyYWluIG9uIGRpc2sgc3RvcmFnZS4KLQotQ2Fzc2FuZHJh4oCZcyBzdG9yYWdlIGVuZ2luZSB3YXMgcmUtaW1wbGVtZW50ZWQgZm9yIHRoZSAzLjAgcmVsZWFzZSwKLWluY2x1ZGluZyBhIG5ldyBmb3JtYXQgZm9yIFNTVGFibGUgZmlsZXMuIFRoZSBwcmV2aW91cyBmb3JtYXQgc3RvcmVkIGEKLXNlcGFyYXRlIGNvcHkgb2YgdGhlIGNsdXN0ZXJpbmcgY29sdW1ucyBhcyBwYXJ0IG9mIHRoZSByZWNvcmQgZm9yIGVhY2gKLWNlbGwuIFRoZSBuZXdlciBmb3JtYXQgZWxpbWluYXRlcyB0aGlzIGR1cGxpY2F0aW9uLCB3aGljaCByZWR1Y2VzIHRoZQotc2l6ZSBvZiBzdG9yZWQgZGF0YSBhbmQgc2ltcGxpZmllcyB0aGUgZm9ybXVsYSBmb3IgY29tcHV0aW5nIHRoYXQgc2l6ZS4KLQotS2VlcCBpbiBtaW5kIGFsc28gdGhhdCB0aGlzIGVzdGltYXRlIG9ubHkgY291bnRzIGEgc2luZ2xlIHJlcGxpY2Egb2YKLWRhdGEuIFlvdSB3aWxsIG5lZWQgdG8gbXVsdGlwbHkgdGhlIHZhbHVlIG9idGFpbmVkIGhlcmUgYnkgdGhlIG51bWJlciBvZgotcGFydGl0aW9ucyBhbmQgdGhlIG51bWJlciBvZiByZXBsaWNhcyBzcGVjaWZpZWQgYnkgdGhlIGtleXNwYWNl4oCZcwotcmVwbGljYXRpb24gc3RyYXRlZ3kgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHRoZSB0b3RhbCByZXF1aXJlZCB0b3RhbAotY2FwYWNpdHkgZm9yIGVhY2ggdGFibGUuIFRoaXMgd2lsbCBjb21lIGluIGhhbmR5IHdoZW4geW91IHBsYW4geW91cgotY2x1c3Rlci4KLQotPT0gQnJlYWtpbmcgVXAgTGFyZ2UgUGFydGl0aW9ucwotCi1BcyBkaXNjdXNzZWQgcHJldmlvdXNseSwgdGhlIGdvYWwgaXMgdG8gZGVzaWduIHRhYmxlcyB0aGF0IGNhbiBwcm92aWRlCi10aGUgZGF0YSB5b3UgbmVlZCB3aXRoIHF1ZXJpZXMgdGhhdCB0b3VjaCBhIHNpbmdsZSBwYXJ0aXRpb24sIG9yIGZhaWxpbmcKLXRoYXQsIHRoZSBtaW5pbXVtIHBvc3NpYmxlIG51bWJlciBvZiBwYXJ0aXRpb25zLiBIb3dldmVyLCBhcyBzaG93biBpbgotdGhlIGV4YW1wbGVzLCBpdCBpcyBxdWl0ZSBwb3NzaWJsZSB0byBkZXNpZ24gd2lkZSBwYXJ0aXRpb24tc3R5bGUgdGFibGVzCi10aGF0IGFwcHJvYWNoIENhc3NhbmRyYeKAmXMgYnVpbHQtaW4gbGltaXRzLiBQZXJmb3JtaW5nIHNpemluZyBhbmFseXNpcyBvbgotdGFibGVzIG1heSByZXZlYWwgcGFydGl0aW9ucyB0aGF0IGFyZSBwb3RlbnRpYWxseSB0b28gbGFyZ2UsIGVpdGhlciBpbgotbnVtYmVyIG9mIHZhbHVlcywgc2l6ZSBvbiBkaXNrLCBvciBib3RoLgotCi1UaGUgdGVjaG5pcXVlIGZvciBzcGxpdHRpbmcgYSBsYXJnZSBwYXJ0aXRpb24gaXMgc3RyYWlnaHRmb3J3YXJkOiBhZGQgYW4KLWFkZGl0aW9uYWwgY29sdW1uIHRvIHRoZSBwYXJ0aXRpb24ga2V5LiBJbiBtb3N0IGNhc2VzLCBtb3Zpbmcgb25lIG9mIHRoZQotZXhpc3RpbmcgY29sdW1ucyBpbnRvIHRoZSBwYXJ0aXRpb24ga2V5IHdpbGwgYmUgc3VmZmljaWVudC4gQW5vdGhlcgotb3B0aW9uIGlzIHRvIGludHJvZHVjZSBhbiBhZGRpdGlvbmFsIGNvbHVtbiB0byB0aGUgdGFibGUgdG8gYWN0IGFzIGEKLXNoYXJkaW5nIGtleSwgYnV0IHRoaXMgcmVxdWlyZXMgYWRkaXRpb25hbCBhcHBsaWNhdGlvbiBsb2dpYy4KLQotQ29udGludWluZyB0byBleGFtaW5lIHRoZSBhdmFpbGFibGUgcm9vbXMgZXhhbXBsZSwgaWYgeW91IGFkZCB0aGUgYGRhdGVgCi1jb2x1bW4gdG8gdGhlIHBhcnRpdGlvbiBrZXkgZm9yIHRoZSBgYXZhaWxhYmxlX3Jvb21zX2J5X2hvdGVsX2RhdGVgCi10YWJsZSwgZWFjaCBwYXJ0aXRpb24gd291bGQgdGhlbiByZXByZXNlbnQgdGhlIGF2YWlsYWJpbGl0eSBvZiByb29tcyBhdAotYSBzcGVjaWZpYyBob3RlbCBvbiBhIHNwZWNpZmljIGRhdGUuIFRoaXMgd2lsbCBjZXJ0YWlubHkgeWllbGQKLXBhcnRpdGlvbnMgdGhhdCBhcmUgc2lnbmlmaWNhbnRseSBzbWFsbGVyLCBwZXJoYXBzIHRvbyBzbWFsbCwgYXMgdGhlCi1kYXRhIGZvciBjb25zZWN1dGl2ZSBkYXlzIHdpbGwgbGlrZWx5IGJlIG9uIHNlcGFyYXRlIG5vZGVzLgotCi1Bbm90aGVyIHRlY2huaXF1ZSBrbm93biBhcyAqYnVja2V0aW5nKiBpcyBvZnRlbiB1c2VkIHRvIGJyZWFrIHRoZSBkYXRhCi1pbnRvIG1vZGVyYXRlLXNpemUgcGFydGl0aW9ucy4gRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBidWNrZXRpemUgdGhlCi1gYXZhaWxhYmxlX3Jvb21zX2J5X2hvdGVsX2RhdGVgIHRhYmxlIGJ5IGFkZGluZyBhIGBtb250aGAgY29sdW1uIHRvIHRoZQotcGFydGl0aW9uIGtleSwgcGVyaGFwcyByZXByZXNlbnRlZCBhcyBhbiBpbnRlZ2VyLiBUaGUgY29tcGFyaXNpb24gd2l0aAotdGhlIG9yaWdpbmFsIGRlc2lnbiBpcyBzaG93biBpbiB0aGUgZmlndXJlIGJlbG93LiBXaGlsZSB0aGUgYG1vbnRoYAotY29sdW1uIGlzIHBhcnRpYWxseSBkdXBsaWNhdGl2ZSBvZiB0aGUgYGRhdGVgLCBpdCBwcm92aWRlcyBhIG5pY2Ugd2F5IG9mCi1ncm91cGluZyByZWxhdGVkIGRhdGEgaW4gYSBwYXJ0aXRpb24gdGhhdCB3aWxsIG5vdCBnZXQgdG9vIGxhcmdlLgotCi1pbWFnZTo6ZGF0YV9tb2RlbGluZ19ob3RlbF9idWNrZXRpbmcucG5nW2ltYWdlXQotCi1JZiB5b3UgcmVhbGx5IGZlbHQgc3Ryb25nbHkgYWJvdXQgcHJlc2VydmluZyBhIHdpZGUgcGFydGl0aW9uIGRlc2lnbiwKLXlvdSBjb3VsZCBpbnN0ZWFkIGFkZCB0aGUgYHJvb21faWRgIHRvIHRoZSBwYXJ0aXRpb24ga2V5LCBzbyB0aGF0IGVhY2gKLXBhcnRpdGlvbiB3b3VsZCByZXByZXNlbnQgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgcm9vbSBhY3Jvc3MgYWxsIGRhdGVzLgotQmVjYXVzZSB0aGVyZSB3YXMgbm8gcXVlcnkgaWRlbnRpZmllZCB0aGF0IGludm9sdmVzIHNlYXJjaGluZwotYXZhaWxhYmlsaXR5IG9mIGEgc3BlY2lmaWMgcm9vbSwgdGhlIGZpcnN0IG9yIHNlY29uZCBkZXNpZ24gYXBwcm9hY2ggaXMKLW1vc3Qgc3VpdGFibGUgdG8gdGhlIGFwcGxpY2F0aW9uIG5lZWRzLgotCi1fTWF0ZXJpYWwgYWRhcHRlZCBmcm9tIENhc3NhbmRyYSwgVGhlIERlZmluaXRpdmUgR3VpZGUuIFB1Ymxpc2hlZCBieQotTydSZWlsbHkgTWVkaWEsIEluYy4gQ29weXJpZ2h0IMKpIDIwMjAgSmVmZiBDYXJwZW50ZXIsIEViZW4gSGV3aXR0LiBBbGwKLXJpZ2h0cyByZXNlcnZlZC4gVXNlZCB3aXRoIHBlcm1pc3Npb24uXwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19zY2hlbWEuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfc2NoZW1hLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMGNmNWMuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19zY2hlbWEuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi09IERlZmluaW5nIERhdGFiYXNlIFNjaGVtYQotCi1PbmNlIHlvdSBoYXZlIGZpbmlzaGVkIGV2YWx1YXRpbmcgYW5kIHJlZmluaW5nIHRoZSBwaHlzaWNhbCBtb2RlbCwKLXlvdeKAmXJlIHJlYWR5IHRvIGltcGxlbWVudCB0aGUgc2NoZW1hIGluIENRTC4gSGVyZSBpcyB0aGUgc2NoZW1hIGZvciB0aGUKLWBob3RlbGAga2V5c3BhY2UsIHVzaW5nIENRTOKAmXMgY29tbWVudCBmZWF0dXJlIHRvIGRvY3VtZW50IHRoZSBxdWVyeQotcGF0dGVybiBzdXBwb3J0ZWQgYnkgZWFjaCB0YWJsZToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1DUkVBVEUgS0VZU1BBQ0UgaG90ZWwgV0lUSCByZXBsaWNhdGlvbiA9Ci0gIHvigJhjbGFzc+KAmTog4oCYU2ltcGxlU3RyYXRlZ3nigJksIOKAmHJlcGxpY2F0aW9uX2ZhY3RvcuKAmSA6IDN9OwotCi1DUkVBVEUgVFlQRSBob3RlbC5hZGRyZXNzICgKLSAgc3RyZWV0IHRleHQsCi0gIGNpdHkgdGV4dCwKLSAgc3RhdGVfb3JfcHJvdmluY2UgdGV4dCwKLSAgcG9zdGFsX2NvZGUgdGV4dCwKLSAgY291bnRyeSB0ZXh0ICk7Ci0KLUNSRUFURSBUQUJMRSBob3RlbC5ob3RlbHNfYnlfcG9pICgKLSAgcG9pX25hbWUgdGV4dCwKLSAgaG90ZWxfaWQgdGV4dCwKLSAgbmFtZSB0ZXh0LAotICBwaG9uZSB0ZXh0LAotICBhZGRyZXNzIGZyb3plbjxhZGRyZXNzPiwKLSAgUFJJTUFSWSBLRVkgKChwb2lfbmFtZSksIGhvdGVsX2lkKSApCi0gIFdJVEggY29tbWVudCA9IOKAmFExLiBGaW5kIGhvdGVscyBuZWFyIGdpdmVuIHBvaeKAmQotICBBTkQgQ0xVU1RFUklORyBPUkRFUiBCWSAoaG90ZWxfaWQgQVNDKSA7Ci0KLUNSRUFURSBUQUJMRSBob3RlbC5ob3RlbHMgKAotICBpZCB0ZXh0IFBSSU1BUlkgS0VZLAotICBuYW1lIHRleHQsCi0gIHBob25lIHRleHQsCi0gIGFkZHJlc3MgZnJvemVuPGFkZHJlc3M+LAotICBwb2lzIHNldCApCi0gIFdJVEggY29tbWVudCA9IOKAmFEyLiBGaW5kIGluZm9ybWF0aW9uIGFib3V0IGEgaG90ZWzigJk7Ci0KLUNSRUFURSBUQUJMRSBob3RlbC5wb2lzX2J5X2hvdGVsICgKLSAgcG9pX25hbWUgdGV4dCwKLSAgaG90ZWxfaWQgdGV4dCwKLSAgZGVzY3JpcHRpb24gdGV4dCwKLSAgUFJJTUFSWSBLRVkgKChob3RlbF9pZCksIHBvaV9uYW1lKSApCi0gIFdJVEggY29tbWVudCA9IFEzLiBGaW5kIHBvaXMgbmVhciBhIGhvdGVs4oCZOwotCi1DUkVBVEUgVEFCTEUgaG90ZWwuYXZhaWxhYmxlX3Jvb21zX2J5X2hvdGVsX2RhdGUgKAotICBob3RlbF9pZCB0ZXh0LAotICBkYXRlIGRhdGUsCi0gIHJvb21fbnVtYmVyIHNtYWxsaW50LAotICBpc19hdmFpbGFibGUgYm9vbGVhbiwKLSAgUFJJTUFSWSBLRVkgKChob3RlbF9pZCksIGRhdGUsIHJvb21fbnVtYmVyKSApCi0gIFdJVEggY29tbWVudCA9IOKAmFE0LiBGaW5kIGF2YWlsYWJsZSByb29tcyBieSBob3RlbCBkYXRl4oCZOwotCi1DUkVBVEUgVEFCTEUgaG90ZWwuYW1lbml0aWVzX2J5X3Jvb20gKAotICBob3RlbF9pZCB0ZXh0LAotICByb29tX251bWJlciBzbWFsbGludCwKLSAgYW1lbml0eV9uYW1lIHRleHQsCi0gIGRlc2NyaXB0aW9uIHRleHQsCi0gIFBSSU1BUlkgS0VZICgoaG90ZWxfaWQsIHJvb21fbnVtYmVyKSwgYW1lbml0eV9uYW1lKSApCi0gIFdJVEggY29tbWVudCA9IOKAmFE1LiBGaW5kIGFtZW5pdGllcyBmb3IgYSByb29t4oCZOwotLS0tLQotCi1Ob3RpY2UgdGhhdCB0aGUgZWxlbWVudHMgb2YgdGhlIHBhcnRpdGlvbiBrZXkgYXJlIHN1cnJvdW5kZWQgd2l0aAotcGFyZW50aGVzZXMsIGV2ZW4gdGhvdWdoIHRoZSBwYXJ0aXRpb24ga2V5IGNvbnNpc3RzIG9mIHRoZSBzaW5nbGUgY29sdW1uCi1gcG9pX25hbWVgLiBUaGlzIGlzIGEgYmVzdCBwcmFjdGljZSB0aGF0IG1ha2VzIHRoZSBzZWxlY3Rpb24gb2YKLXBhcnRpdGlvbiBrZXkgbW9yZSBleHBsaWNpdCB0byBvdGhlcnMgcmVhZGluZyB5b3VyIENRTC4KLQotU2ltaWxhcmx5LCBoZXJlIGlzIHRoZSBzY2hlbWEgZm9yIHRoZSBgcmVzZXJ2YXRpb25gIGtleXNwYWNlOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLUNSRUFURSBLRVlTUEFDRSByZXNlcnZhdGlvbiBXSVRIIHJlcGxpY2F0aW9uID0ge+KAmGNsYXNz4oCZOgotICDigJhTaW1wbGVTdHJhdGVneeKAmSwg4oCYcmVwbGljYXRpb25fZmFjdG9y4oCZIDogM307Ci0KLUNSRUFURSBUWVBFIHJlc2VydmF0aW9uLmFkZHJlc3MgKAotICBzdHJlZXQgdGV4dCwKLSAgY2l0eSB0ZXh0LAotICBzdGF0ZV9vcl9wcm92aW5jZSB0ZXh0LAotICBwb3N0YWxfY29kZSB0ZXh0LAotICBjb3VudHJ5IHRleHQgKTsKLQotQ1JFQVRFIFRBQkxFIHJlc2VydmF0aW9uLnJlc2VydmF0aW9uc19ieV9jb25maXJtYXRpb24gKAotICBjb25maXJtX251bWJlciB0ZXh0LAotICBob3RlbF9pZCB0ZXh0LAotICBzdGFydF9kYXRlIGRhdGUsCi0gIGVuZF9kYXRlIGRhdGUsCi0gIHJvb21fbnVtYmVyIHNtYWxsaW50LAotICBndWVzdF9pZCB1dWlkLAotICBQUklNQVJZIEtFWSAoY29uZmlybV9udW1iZXIpICkKLSAgV0lUSCBjb21tZW50ID0g4oCYUTYuIEZpbmQgcmVzZXJ2YXRpb25zIGJ5IGNvbmZpcm1hdGlvbiBudW1iZXLigJk7Ci0KLUNSRUFURSBUQUJMRSByZXNlcnZhdGlvbi5yZXNlcnZhdGlvbnNfYnlfaG90ZWxfZGF0ZSAoCi0gIGhvdGVsX2lkIHRleHQsCi0gIHN0YXJ0X2RhdGUgZGF0ZSwKLSAgZW5kX2RhdGUgZGF0ZSwKLSAgcm9vbV9udW1iZXIgc21hbGxpbnQsCi0gIGNvbmZpcm1fbnVtYmVyIHRleHQsCi0gIGd1ZXN0X2lkIHV1aWQsCi0gIFBSSU1BUlkgS0VZICgoaG90ZWxfaWQsIHN0YXJ0X2RhdGUpLCByb29tX251bWJlcikgKQotICBXSVRIIGNvbW1lbnQgPSDigJhRNy4gRmluZCByZXNlcnZhdGlvbnMgYnkgaG90ZWwgYW5kIGRhdGXigJk7Ci0KLUNSRUFURSBUQUJMRSByZXNlcnZhdGlvbi5yZXNlcnZhdGlvbnNfYnlfZ3Vlc3QgKAotICBndWVzdF9sYXN0X25hbWUgdGV4dCwKLSAgaG90ZWxfaWQgdGV4dCwKLSAgc3RhcnRfZGF0ZSBkYXRlLAotICBlbmRfZGF0ZSBkYXRlLAotICByb29tX251bWJlciBzbWFsbGludCwKLSAgY29uZmlybV9udW1iZXIgdGV4dCwKLSAgZ3Vlc3RfaWQgdXVpZCwKLSAgUFJJTUFSWSBLRVkgKChndWVzdF9sYXN0X25hbWUpLCBob3RlbF9pZCkgKQotICBXSVRIIGNvbW1lbnQgPSDigJhROC4gRmluZCByZXNlcnZhdGlvbnMgYnkgZ3Vlc3QgbmFtZeKAmTsKLQotQ1JFQVRFIFRBQkxFIHJlc2VydmF0aW9uLmd1ZXN0cyAoCi0gIGd1ZXN0X2lkIHV1aWQgUFJJTUFSWSBLRVksCi0gIGZpcnN0X25hbWUgdGV4dCwKLSAgbGFzdF9uYW1lIHRleHQsCi0gIHRpdGxlIHRleHQsCi0gIGVtYWlscyBzZXQsCi0gIHBob25lX251bWJlcnMgbGlzdCwKLSAgYWRkcmVzc2VzIG1hcDx0ZXh0LAotICBmcm96ZW48YWRkcmVzcz4sCi0gIGNvbmZpcm1fbnVtYmVyIHRleHQgKQotICBXSVRIIGNvbW1lbnQgPSDigJhROS4gRmluZCBndWVzdCBieSBJROKAmTsKLS0tLS0KLQotWW91IG5vdyBoYXZlIGEgY29tcGxldGUgQ2Fzc2FuZHJhIHNjaGVtYSBmb3Igc3RvcmluZyBkYXRhIGZvciBhIGhvdGVsCi1hcHBsaWNhdGlvbi4KLQotX01hdGVyaWFsIGFkYXB0ZWQgZnJvbSBDYXNzYW5kcmEsIFRoZSBEZWZpbml0aXZlIEd1aWRlLiBQdWJsaXNoZWQgYnkKLU8nUmVpbGx5IE1lZGlhLCBJbmMuIENvcHlyaWdodCDCqSAyMDIwIEplZmYgQ2FycGVudGVyLCBFYmVuIEhld2l0dC4gQWxsCi1yaWdodHMgcmVzZXJ2ZWQuIFVzZWQgd2l0aCBwZXJtaXNzaW9uLl8KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfdG9vbHMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfdG9vbHMuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzNTU2Zi4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3Rvb2xzLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi09IENhc3NhbmRyYSBEYXRhIE1vZGVsaW5nIFRvb2xzCi0KLVRoZXJlIGFyZSBzZXZlcmFsIHRvb2xzIGF2YWlsYWJsZSB0byBoZWxwIHlvdSBkZXNpZ24gYW5kIG1hbmFnZSB5b3VyCi1DYXNzYW5kcmEgc2NoZW1hIGFuZCBidWlsZCBxdWVyaWVzLgotCi0qIGh0dHBzOi8vaGFja29sYWRlLmNvbS9ub3NxbGRiLmh0bWwjY2Fzc2FuZHJhW0hhY2tvbGFkZV0gaXMgYSBkYXRhCi1tb2RlbGluZyB0b29sIHRoYXQgc3VwcG9ydHMgc2NoZW1hIGRlc2lnbiBmb3IgQ2Fzc2FuZHJhIGFuZCBtYW55IG90aGVyCi1Ob1NRTCBkYXRhYmFzZXMuIEhhY2tvbGFkZSBzdXBwb3J0cyB0aGUgdW5pcXVlIGNvbmNlcHRzIG9mIENRTCBzdWNoIGFzCi1wYXJ0aXRpb24ga2V5cyBhbmQgY2x1c3RlcmluZyBjb2x1bW5zLCBhcyB3ZWxsIGFzIGRhdGEgdHlwZXMgaW5jbHVkaW5nCi1jb2xsZWN0aW9ucyBhbmQgVURUcy4gSXQgYWxzbyBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBjcmVhdGUgQ2hlYm90a28KLWRpYWdyYW1zLgotKiBodHRwOi8va2RtLmRhdGF2aWV3Lm9yZy9bS2FzaGxldiBEYXRhIE1vZGVsZXJdIGlzIGEgQ2Fzc2FuZHJhIGRhdGEKLW1vZGVsaW5nIHRvb2wgdGhhdCBhdXRvbWF0ZXMgdGhlIGRhdGEgbW9kZWxpbmcgbWV0aG9kb2xvZ3kgZGVzY3JpYmVkIGluCi10aGlzIGRvY3VtZW50YXRpb24sIGluY2x1ZGluZyBpZGVudGlmeWluZyBhY2Nlc3MgcGF0dGVybnMsIGNvbmNlcHR1YWwsCi1sb2dpY2FsLCBhbmQgcGh5c2ljYWwgZGF0YSBtb2RlbGluZywgYW5kIHNjaGVtYSBnZW5lcmF0aW9uLiBJdCBhbHNvCi1pbmNsdWRlcyBtb2RlbCBwYXR0ZXJucyB0aGF0IHlvdSBjYW4gb3B0aW9uYWxseSBsZXZlcmFnZSBhcyBhIHN0YXJ0aW5nCi1wb2ludCBmb3IgeW91ciBkZXNpZ25zLgotKiBEYXRhU3RheCBEZXZDZW50ZXIgaXMgYSB0b29sIGZvciBtYW5hZ2luZyBzY2hlbWEsIGV4ZWN1dGluZyBxdWVyaWVzCi1hbmQgdmlld2luZyByZXN1bHRzLiBXaGlsZSB0aGUgdG9vbCBpcyBubyBsb25nZXIgYWN0aXZlbHkgc3VwcG9ydGVkLCBpdAotaXMgc3RpbGwgcG9wdWxhciB3aXRoIG1hbnkgZGV2ZWxvcGVycyBhbmQgaXMgYXZhaWxhYmxlIGFzIGEKLWh0dHBzOi8vYWNhZGVteS5kYXRhc3RheC5jb20vZG93bmxvYWRzW2ZyZWUgZG93bmxvYWRdLiBEZXZDZW50ZXIKLWZlYXR1cmVzIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIENRTCBjb21tYW5kcywgdHlwZXMsIGFuZCBuYW1lIGxpdGVyYWxzLgotRGV2Q2VudGVyIHByb3ZpZGVzIGNvbW1hbmQgY29tcGxldGlvbiBhcyB5b3UgdHlwZSBvdXQgQ1FMIGNvbW1hbmRzIGFuZAotaW50ZXJwcmV0cyB0aGUgY29tbWFuZHMgeW91IHR5cGUsIGhpZ2hsaWdodGluZyBhbnkgZXJyb3JzIHlvdSBtYWtlLiBUaGUKLXRvb2wgcHJvdmlkZXMgcGFuZXMgZm9yIG1hbmFnaW5nIG11bHRpcGxlIENRTCBzY3JpcHRzIGFuZCBjb25uZWN0aW9ucyB0bwotbXVsdGlwbGUgY2x1c3RlcnMuIFRoZSBjb25uZWN0aW9ucyBhcmUgdXNlZCB0byBydW4gQ1FMIGNvbW1hbmRzIGFnYWluc3QKLWxpdmUgY2x1c3RlcnMgYW5kIHZpZXcgdGhlIHJlc3VsdHMuIFRoZSB0b29sIGFsc28gaGFzIGEgcXVlcnkgdHJhY2UKLWZlYXR1cmUgdGhhdCBpcyB1c2VmdWwgZm9yIGdhaW5pbmcgaW5zaWdodCBpbnRvIHRoZSBwZXJmb3JtYW5jZSBvZiB5b3VyCi1xdWVyaWVzLgotKiBJREUgUGx1Z2lucyAtIFRoZXJlIGFyZSBDUUwgcGx1Z2lucyBhdmFpbGFibGUgZm9yIHNldmVyYWwgSW50ZWdyYXRlZAotRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnRzIChJREVzKSwgc3VjaCBhcyBJbnRlbGxpSiBJREVBIGFuZCBBcGFjaGUKLU5ldEJlYW5zLiBUaGVzZSBwbHVnaW5zIHR5cGljYWxseSBwcm92aWRlIGZlYXR1cmVzIHN1Y2ggYXMgc2NoZW1hCi1tYW5hZ2VtZW50IGFuZCBxdWVyeSBleGVjdXRpb24uCi0KLVNvbWUgSURFcyBhbmQgdG9vbHMgdGhhdCBjbGFpbSB0byBzdXBwb3J0IENhc3NhbmRyYSBkbyBub3QgYWN0dWFsbHkKLXN1cHBvcnQgQ1FMIG5hdGl2ZWx5LCBidXQgaW5zdGVhZCBhY2Nlc3MgQ2Fzc2FuZHJhIHVzaW5nIGEgSkRCQy9PREJDCi1kcml2ZXIgYW5kIGludGVyYWN0IHdpdGggQ2Fzc2FuZHJhIGFzIGlmIGl0IHdlcmUgYSByZWxhdGlvbmFsIGRhdGFiYXNlCi13aXRoIFNRTCBzdXBwb3J0LiBXbmVuIHNlbGVjdGluZyB0b29scyBmb3Igd29ya2luZyB3aXRoIENhc3NhbmRyYSB5b3XigJlsbAotd2FudCB0byBtYWtlIHN1cmUgdGhleSBzdXBwb3J0IENRTCBhbmQgcmVpbmZvcmNlIENhc3NhbmRyYSBiZXN0Ci1wcmFjdGljZXMgZm9yIGRhdGEgbW9kZWxpbmcgYXMgcHJlc2VudGVkIGluIHRoaXMgZG9jdW1lbnRhdGlvbi4KLQotX01hdGVyaWFsIGFkYXB0ZWQgZnJvbSBDYXNzYW5kcmEsIFRoZSBEZWZpbml0aXZlIEd1aWRlLiBQdWJsaXNoZWQgYnkKLU8nUmVpbGx5IE1lZGlhLCBJbmMuIENvcHlyaWdodCDCqSAyMDIwIEplZmYgQ2FycGVudGVyLCBFYmVuIEhld2l0dC4gQWxsCi1yaWdodHMgcmVzZXJ2ZWQuIFVzZWQgd2l0aCBwZXJtaXNzaW9uLl8KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2luZGV4LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbmRleC5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDVmNWEzLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2luZGV4LmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi09IERhdGEgTW9kZWxpbmcKLQotKiB4cmVmOmRhdGFfbW9kZWxpbmcvaW50cm8uYWRvY1tJbnRyb2R1Y3Rpb25dCi0qIHhyZWY6ZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX3JkYm1zLmFkb2NbUkRCTVNdCi0qIHhyZWY6ZGF0YV9tb2RlbGluZy9kYXRhX21vZGVsaW5nX2NvbmNlcHR1YWwuYWRvY1tDb25jZXB0dWFsXQotKiB4cmVmOmRhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19sb2dpY2FsLmFkb2NbTG9naWNhbF0KLSogeHJlZjpkYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfcGh5c2ljYWwuYWRvY1tQaHlzaWNhbF0KLSogeHJlZjpkYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfc2NoZW1hLmFkb2NbU2NoZW1hXQotKiB4cmVmOmRhdGFfbW9kZWxpbmcvZGF0YV9tb2RlbGluZ19xdWVyaWVzLmFkb2NbUXVlcmllc10KLSogeHJlZjpkYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfcmVmaW5pbmcuYWRvY1tSZWZpbmluZ10KLSogeHJlZjpkYXRhX21vZGVsaW5nL2RhdGFfbW9kZWxpbmdfdG9vbHMuYWRvY1tUb29sc10KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvU0FTSS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL1NBU0kuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9TQVNJLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9TQVNJLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9hcHBlbmRpY2VzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvYXBwZW5kaWNlcy5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjExM2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvYXBwZW5kaWNlcy5hZG9jCkBAIC0wLDAgKzEsMTgzIEBACis9IEFwcGVuZGljZXMKKworW1thcHBlbmRpeC1BXV0KKz09IEFwcGVuZGl4IEE6IENRTCBLZXl3b3JkcworCitDUUwgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIF9yZXNlcnZlZF8gYW5kIF9ub24tcmVzZXJ2ZWRfIGtleXdvcmRzLgorUmVzZXJ2ZWQga2V5d29yZHMgY2Fubm90IGJlIHVzZWQgYXMgaWRlbnRpZmllciwgdGhleSBhcmUgdHJ1bHkgcmVzZXJ2ZWQKK2ZvciB0aGUgbGFuZ3VhZ2UgKGJ1dCBvbmUgY2FuIGVuY2xvc2UgYSByZXNlcnZlZCBrZXl3b3JkIGJ5Citkb3VibGUtcXVvdGVzIHRvIHVzZSBpdCBhcyBhbiBpZGVudGlmaWVyKS4gTm9uLXJlc2VydmVkIGtleXdvcmRzIGhvd2V2ZXIKK29ubHkgaGF2ZSBhIHNwZWNpZmljIG1lYW5pbmcgaW4gY2VydGFpbiBjb250ZXh0IGJ1dCBjYW4gdXNlZCBhcworaWRlbnRpZmllciBvdGhlcndpc2UuIFRoZSBvbmx5IF9yYWlzb24gZOKAmcOqdHJlXyBvZiB0aGVzZSBub24tcmVzZXJ2ZWQKK2tleXdvcmRzIGlzIGNvbnZlbmllbmNlOiBzb21lIGtleXdvcmQgYXJlIG5vbi1yZXNlcnZlZCB3aGVuIGl0IHdhcworYWx3YXlzIGVhc3kgZm9yIHRoZSBwYXJzZXIgdG8gZGVjaWRlIHdoZXRoZXIgdGhleSB3ZXJlIHVzZWQgYXMga2V5d29yZHMKK29yIG5vdC4KKworW3dpZHRoPSI0OCUiLGNvbHM9IjYwJSw0MCUiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfEtleXdvcmQgfFJlc2VydmVkPworfGBBRERgIHx5ZXMKK3xgQUdHUkVHQVRFYCB8bm8KK3xgQUxMYCB8bm8KK3xgQUxMT1dgIHx5ZXMKK3xgQUxURVJgIHx5ZXMKK3xgQU5EYCB8eWVzCit8YEFQUExZYCB8eWVzCit8YEFTYCB8bm8KK3xgQVNDYCB8eWVzCit8YEFTQ0lJYCB8bm8KK3xgQVVUSE9SSVpFYCB8eWVzCit8YEJBVENIYCB8eWVzCit8YEJFR0lOYCB8eWVzCit8YEJJR0lOVGAgfG5vCit8YEJMT0JgIHxubworfGBCT09MRUFOYCB8bm8KK3xgQllgIHx5ZXMKK3xgQ0FMTEVEYCB8bm8KK3xgQ0xVU1RFUklOR2AgfG5vCit8YENPTFVNTkZBTUlMWWAgfHllcworfGBDT01QQUNUYCB8bm8KK3xgQ09OVEFJTlNgIHxubworfGBDT1VOVGAgfG5vCit8YENPVU5URVJgIHxubworfGBDUkVBVEVgIHx5ZXMKK3xgQ1VTVE9NYCB8bm8KK3xgREFURWAgfG5vCit8YERFQ0lNQUxgIHxubworfGBERUxFVEVgIHx5ZXMKK3xgREVTQ2AgfHllcworfGBERVNDUklCRWAgfHllcworfGBESVNUSU5DVGAgfG5vCit8YERPVUJMRWAgfG5vCit8YERST1BgIHx5ZXMKK3xgRU5UUklFU2AgfHllcworfGBFWEVDVVRFYCB8eWVzCit8YEVYSVNUU2AgfG5vCit8YEZJTFRFUklOR2AgfG5vCit8YEZJTkFMRlVOQ2AgfG5vCit8YEZMT0FUYCB8bm8KK3xgRlJPTWAgfHllcworfGBGUk9aRU5gIHxubworfGBGVUxMYCB8eWVzCit8YEZVTkNUSU9OYCB8bm8KK3xgRlVOQ1RJT05TYCB8bm8KK3xgR1JBTlRgIHx5ZXMKK3xgSUZgIHx5ZXMKK3xgSU5gIHx5ZXMKK3xgSU5ERVhgIHx5ZXMKK3xgSU5FVGAgfG5vCit8YElORklOSVRZYCB8eWVzCit8YElOSVRDT05EYCB8bm8KK3xgSU5QVVRgIHxubworfGBJTlNFUlRgIHx5ZXMKK3xgSU5UYCB8bm8KK3xgSU5UT2AgfHllcworfGBKU09OYCB8bm8KK3xgS0VZYCB8bm8KK3xgS0VZU2AgfG5vCit8YEtFWVNQQUNFYCB8eWVzCit8YEtFWVNQQUNFU2AgfG5vCit8YExBTkdVQUdFYCB8bm8KK3xgTElNSVRgIHx5ZXMKK3xgTElTVGAgfG5vCit8YExPR0lOYCB8bm8KK3xgTUFQYCB8bm8KK3xgTUFTS0VEYCB8bm8KK3xgTU9ESUZZYCB8eWVzCit8YE5BTmAgfHllcworfGBOT0xPR0lOYCB8bm8KK3xgTk9SRUNVUlNJVkVgIHx5ZXMKK3xgTk9TVVBFUlVTRVJgIHxubworfGBOT1RgIHx5ZXMKK3xgTlVMTGAgfHllcworfGBPRmAgfHllcworfGBPTmAgfHllcworfGBPUFRJT05TYCB8bm8KK3xgT1JgIHx5ZXMKK3xgT1JERVJgIHx5ZXMKK3xgUEFTU1dPUkRgIHxubworfGBQRVJNSVNTSU9OYCB8bm8KK3xgUEVSTUlTU0lPTlNgIHxubworfGBQUklNQVJZYCB8eWVzCit8YFJFTkFNRWAgfHllcworfGBSRVBMQUNFYCB8eWVzCit8YFJFVFVSTlNgIHxubworfGBSRVZPS0VgIHx5ZXMKK3xgUk9MRWAgfG5vCit8YFJPTEVTYCB8bm8KK3xgU0NIRU1BYCB8eWVzCit8YFNFTEVDVGAgfHllcworfGBTRUxFQ1RfTUFTS0VEYCB8bm8KK3xgU0VUYCB8eWVzCit8YFNGVU5DYCB8bm8KK3xgU01BTExJTlRgIHxubworfGBTVEFUSUNgIHxubworfGBTVE9SQUdFYCB8bm8KK3xgU1RZUEVgIHxubworfGBTVVBFUlVTRVJgIHxubworfGBUQUJMRWAgfHllcworfGBURVhUYCB8bm8KK3xgVElNRWAgfG5vCit8YFRJTUVTVEFNUGAgfG5vCit8YFRJTUVVVUlEYCB8bm8KK3xgVElOWUlOVGAgfG5vCit8YFRPYCB8eWVzCit8YFRPS0VOYCB8eWVzCit8YFRSSUdHRVJgIHxubworfGBUUlVOQ0FURWAgfHllcworfGBUVExgIHxubworfGBUVVBMRWAgfG5vCit8YFRZUEVgIHxubworfGBVTkxPR0dFRGAgfHllcworfGBVTk1BU0tgIHxubworfGBVUERBVEVgIHx5ZXMKK3xgVVNFYCB8eWVzCit8YFVTRVJgIHxubworfGBVU0VSU2AgfG5vCit8YFVTSU5HYCB8eWVzCit8YFVVSURgIHxubworfGBWQUxVRVNgIHxubworfGBWQVJDSEFSYCB8bm8KK3xgVkFSSU5UYCB8bm8KK3xgV0hFUkVgIHx5ZXMKK3xgV0lUSGAgfHllcworfGBXUklURVRJTUVgIHxubworfGBNQVhXUklURVRJTUVgIHxubworfD09PQorCis9PSBBcHBlbmRpeCBCOiBDUUwgUmVzZXJ2ZWQgVHlwZXMKKworVGhlIGZvbGxvd2luZyB0eXBlIG5hbWVzIGFyZSBub3QgY3VycmVudGx5IHVzZWQgYnkgQ1FMLCBidXQgYXJlIHJlc2VydmVkCitmb3IgcG90ZW50aWFsIGZ1dHVyZSB1c2UuIFVzZXItZGVmaW5lZCB0eXBlcyBtYXkgbm90IHVzZSByZXNlcnZlZCB0eXBlCituYW1lcyBhcyB0aGVpciBuYW1lLgorCitbd2lkdGg9IjI1JSIsY29scz0iMTAwJSIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8dHlwZQorfGBiaXRzdHJpbmdgCit8YGJ5dGVgCit8YGNvbXBsZXhgCit8YGVudW1gCit8YGludGVydmFsYAorfGBtYWNhZGRyYAorfD09PQorCis9PSBBcHBlbmRpeCBDOiBEcm9wcGluZyBDb21wYWN0IFN0b3JhZ2UKKworU3RhcnRpbmcgdmVyc2lvbiA0LjAsIFRocmlmdCBhbmQgQ09NUEFDVCBTVE9SQUdFIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuCisKK2BBTFRFUiAuLi4gRFJPUCBDT01QQUNUIFNUT1JBR0VgIHN0YXRlbWVudCBtYWtlcyBDb21wYWN0IFRhYmxlcworQ1FMLWNvbXBhdGlibGUsIGV4cG9zaW5nIGludGVybmFsIHN0cnVjdHVyZSBvZiBUaHJpZnQvQ29tcGFjdCBUYWJsZXM6CisKKyogQ1FMLWNyZWF0ZWQgQ29tcGFjdCBUYWJsZXMgdGhhdCBoYXZlIG5vIGNsdXN0ZXJpbmcgY29sdW1ucywgd2lsbAorZXhwb3NlIGFuIGFkZGl0aW9uYWwgY2x1c3RlcmluZyBjb2x1bW4gYGNvbHVtbjFgIHdpdGggYFVURjhUeXBlYC4KKyogQ1FMLWNyZWF0ZWQgQ29tcGFjdCBUYWJsZXMgdGhhdCBoYWQgbm8gcmVndWxhciBjb2x1bW5zLCB3aWxsIGV4cG9zZSBhCityZWd1bGFyIGNvbHVtbiBgdmFsdWVgIHdpdGggYEJ5dGVzVHlwZWAuCisqIEZvciBDUUwtQ3JlYXRlZCBDb21wYWN0IFRhYmxlcywgYWxsIGNvbHVtbnMgb3JpZ2luYWxseSBkZWZpbmVkIGFzCitgcmVndWxhcmAgd2lsbCBiZSBjb21lIGBzdGF0aWNgCisqIENRTC1jcmVhdGVkIENvbXBhY3QgVGFibGVzIHRoYXQgaGF2ZSBjbHVzdGVyaW5nIGJ1dCBoYXZlIG5vIHJlZ3VsYXIKK2NvbHVtbnMgd2lsbCBoYXZlIGFuIGVtcHR5IHZhbHVlIGNvbHVtbiAob2YgYEVtcHR5VHlwZWApCisqIFN1cGVyQ29sdW1uIFRhYmxlcyAoY2FuIG9ubHkgYmUgY3JlYXRlZCB0aHJvdWdoIFRocmlmdCkgd2lsbCBleHBvc2UgYQorY29tcGFjdCB2YWx1ZSBtYXAgd2l0aCBhbiBlbXB0eSBuYW1lLgorKiBUaHJpZnQtY3JlYXRlZCBDb21wYWN0IFRhYmxlcyB3aWxsIGhhdmUgdHlwZXMgY29ycmVzcG9uZGluZyB0byB0aGVpcgorVGhyaWZ0IGRlZmluaXRpb24uCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvY2hhbmdlcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2NoYW5nZXMuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTJhMTgyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2NoYW5nZXMuYWRvYwpAQCAtMCwwICsxLDIzNCBAQAorPSBDaGFuZ2VzCisKK1RoZSBmb2xsb3dpbmcgZGVzY3JpYmVzIHRoZSBjaGFuZ2VzIGluIGVhY2ggdmVyc2lvbiBvZiBDUUwuCisKKz09IDMuNC43CisKKyogUmVtb3ZlIGRlcHJlY2F0ZWQgZnVuY3Rpb25zIGBkYXRlT2ZgIGFuZCBgdW5peFRpbWVzdGFtcE9mYCwgcmVwbGFjZWQgYnkgYHRvVGltZXN0YW1wYCBhbmQgYHRvVW5peFRpbWVzdGFtcGAgKGAxODMyOGApCisqIEFkZGVkIHN1cHBvcnQgZm9yIGF0dGFjaGluZyBtYXNraW5nIGZ1bmN0aW9ucyB0byB0YWJsZSBjb2x1bW5zIChgMTgwNjhgKQorKiBBZGQgVU5NQVNLIHBlcm1pc3Npb24gKGAxODA2OWApCisqIEFkZCBTRUxFQ1RfTUFTS0VEIHBlcm1pc3Npb24gKGAxODA3MGApCisqIEFkZCBzdXBwb3J0IGZvciB1c2luZyBVREZzIGFzIG1hc2tpbmcgZnVuY3Rpb25zIChgMTgwNzFgKQorKiBBZG9wdCBzbmFrZV9jYXNlIGZ1bmN0aW9uIG5hbWVzLCBkZXByZWNhdGluZyBhbGwgcHJldmlvdXMgY2FtZWxDYXNlIG9yIGFsbHRvZ2V0aGVyd2l0aG91dHNwYWNlcyBmdW5jdGlvbiBuYW1lcyAoYDE4MDM3YCkKKworPT0gMy40LjYKKworKiBBZGQgc3VwcG9ydCBmb3IgSUYgRVhJU1RTIGFuZCBJRiBOT1QgRVhJU1RTIGluIEFMVEVSIHN0YXRlbWVudHMgIChgMTY5MTZgKQorKiBBbGxvdyBHUkFOVC9SRVZPS0UgbXVsdGlwbGUgcGVybWlzc2lvbnMgaW4gYSBzaW5nbGUgc3RhdGVtZW50IChgMTcwMzBgKQorKiBQcmUgaGFzaGVkIHBhc3N3b3JkcyBpbiBDUUwgKGAxNzMzNGApCisqIEFkZCBzdXBwb3J0IGZvciB0eXBlIGNhc3RpbmcgaW4gV0hFUkUgY2xhdXNlIGNvbXBvbmVudHMgYW5kIGluIHRoZSB2YWx1ZXMgb2YgSU5TRVJUL1VQREFURSBzdGF0ZW1lbnRzIChgMTQzMzdgKQorKiBBZGQgc3VwcG9ydCBmb3IgQ09OVEFJTlMgYW5kIENPTlRBSU5TIEtFWSBpbiBjb25kaXRpb25hbCBVUERBVEUgYW5kIERFTEVURSBzdGF0ZW1lbnQgKGAxMDUzN2ApCisqIEFsbG93IHRvIGdyYW50IHBlcm1pc3Npb24gZm9yIGFsbCB0YWJsZXMgaW4gYSBrZXlzcGFjZSAoYDE3MDI3YCkKKyogQWxsb3cgdG8gYWdncmVnYXRlIGJ5IHRpbWUgaW50ZXJ2YWxzIChgMTE4NzFgKQorCis9PSAzLjQuNQorCisqIEFkZHMgc3VwcG9ydCBmb3IgYXJpdGhtZXRpYyBvcGVyYXRvcnMgKGAxMTkzNWApCisqIEFkZHMgc3VwcG9ydCBmb3IgYCtgIGFuZCBgLWAgb3BlcmF0aW9ucyBvbiBkYXRlcyAoYDExOTM2YCkKKyogQWRkcyBgY3VycmVudFRpbWVzdGFtcGAsIGBjdXJyZW50RGF0ZWAsIGBjdXJyZW50VGltZWAgYW5kCitgY3VycmVudFRpbWVVVUlEYCBmdW5jdGlvbnMgKGAxMzEzMmApCisKKz09IDMuNC40CisKKyogYEFMVEVSIFRBQkxFYCBgQUxURVJgIGhhcyBiZWVuIHJlbW92ZWQ7IGEgY29sdW1uJ3MgdHlwZSBtYXkgbm90IGJlCitjaGFuZ2VkIGFmdGVyIGNyZWF0aW9uIChgMTI0NDNgKS4KKyogYEFMVEVSIFRZUEVgIGBBTFRFUmAgaGFzIGJlZW4gcmVtb3ZlZDsgYSBmaWVsZCdzIHR5cGUgbWF5IG5vdCBiZQorY2hhbmdlZCBhZnRlciBjcmVhdGlvbiAoYDEyNDQzYCkuCisKKz09IDMuNC4zCisKKyogQWRkcyBhIG5ldyBgZHVyYXRpb25gIGBkYXRhIHR5cGVzIDxkYXRhLXR5cGVzPmAgKGAxMTg3M2ApLgorKiBTdXBwb3J0IGZvciBgR1JPVVAgQllgIChgMTA3MDdgKS4KKyogQWRkcyBhIGBERUZBVUxUIFVOU0VUYCBvcHRpb24gZm9yIGBJTlNFUlQgSlNPTmAgdG8gaWdub3JlIG9taXR0ZWQKK2NvbHVtbnMgKGAxMTQyNGApLgorKiBBbGxvd3MgYG51bGxgIGFzIGEgbGVnYWwgdmFsdWUgZm9yIFRUTCBvbiBpbnNlcnQgYW5kIHVwZGF0ZS4gSXQgd2lsbAorYmUgdHJlYXRlZCBhcyBlcXVpdmFsZW50IHRvIGluc2VydGluZyBhIDAgKGAxMjIxNmApLgorCis9PSAzLjQuMgorCisqIElmIGEgdGFibGUgaGFzIGEgbm9uIHplcm8gYGRlZmF1bHRfdGltZV90b19saXZlYCwgdGhlbiBleHBsaWNpdGx5CitzcGVjaWZ5aW5nIGEgVFRMIG9mIDAgaW4gYW4gYElOU0VSVGAgb3IgYFVQREFURWAgc3RhdGVtZW50IHdpbGwgcmVzdWx0CitpbiB0aGUgbmV3IHdyaXRlcyBub3QgaGF2aW5nIGFueSBleHBpcmF0aW9uICh0aGF0IGlzLCBhbiBleHBsaWNpdCBUVEwgb2YKKzAgY2FuY2VscyB0aGUgYGRlZmF1bHRfdGltZV90b19saXZlYCkuIFRoaXMgd2Fzbid0IHRoZSBjYXNlIGJlZm9yZSBhbmQKK3RoZSBgZGVmYXVsdF90aW1lX3RvX2xpdmVgIHdhcyBhcHBsaWVkIGV2ZW4gdGhvdWdoIGEgVFRMIGhhZCBiZWVuCitleHBsaWNpdGx5IHNldC4KKyogYEFMVEVSIFRBQkxFYCBgQUREYCBhbmQgYERST1BgIG5vdyBhbGxvdyBtdWx0aXBsZSBjb2x1bW5zIHRvIGJlCithZGRlZC9yZW1vdmVkLgorKiBOZXcgYFBFUiBQQVJUSVRJT04gTElNSVRgIG9wdGlvbiBmb3IgYFNFTEVDVGAgc3RhdGVtZW50cyAoc2VlCitodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS03MDE3KVtDQVNTQU5EUkEtNzAxN10uCisqIGBVc2VyLWRlZmluZWQgZnVuY3Rpb25zIDxjcWwtZnVuY3Rpb25zPmAgY2FuIG5vdyBpbnN0YW50aWF0ZQorYFVEVFZhbHVlYCBhbmQgYFR1cGxlVmFsdWVgIGluc3RhbmNlcyB2aWEgdGhlIG5ldyBgVURGQ29udGV4dGAgaW50ZXJmYWNlCisoc2VlCitodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xMDgxOClbQ0FTU0FORFJBLTEwODE4XS4KKyogYFVzZXItZGVmaW5lZCB0eXBlcyA8dWR0cz5gIG1heSBub3cgYmUgc3RvcmVkIGluIGEgbm9uLWZyb3plbiBmb3JtLAorYWxsb3dpbmcgaW5kaXZpZHVhbCBmaWVsZHMgdG8gYmUgdXBkYXRlZCBhbmQgZGVsZXRlZCBpbiBgVVBEQVRFYAorc3RhdGVtZW50cyBhbmQgYERFTEVURWAgc3RhdGVtZW50cywgcmVzcGVjdGl2ZWx5LgorKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTc0MjMpW0NBU1NBTkRSQS03NDIzXSkuCisKKz09IDMuNC4xCisKKyogQWRkcyBgQ0FTVGAgZnVuY3Rpb25zLgorCis9PSAzLjQuMAorCisqIFN1cHBvcnQgZm9yIGBtYXRlcmlhbGl6ZWQgdmlld3MgPG1hdGVyaWFsaXplZC12aWV3cz5gLgorKiBgREVMRVRFYCBzdXBwb3J0IGZvciBpbmVxdWFsaXR5IGV4cHJlc3Npb25zIGFuZCBgSU5gIHJlc3RyaWN0aW9ucyBvbgorYW55IHByaW1hcnkga2V5IGNvbHVtbnMuCisqIGBVUERBVEVgIHN1cHBvcnQgZm9yIGBJTmAgcmVzdHJpY3Rpb25zIG9uIGFueSBwcmltYXJ5IGtleSBjb2x1bW5zLgorCis9PSAzLjMuMQorCisqIFRoZSBzeW50YXggYFRSVU5DQVRFIFRBQkxFIFhgIGlzIG5vdyBhY2NlcHRlZCBhcyBhbiBhbGlhcyBmb3IKK2BUUlVOQ0FURSBYYC4KKworPT0gMy4zLjAKKworKiBgVXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBhbmQgYWdncmVnYXRlcyA8Y3FsLWZ1bmN0aW9ucz5gIGFyZSBub3cKK3N1cHBvcnRlZC4KKyogQWxsb3dzIGRvdWJsZS1kb2xsYXIgZW5jbG9zZWQgc3RyaW5ncyBsaXRlcmFscyBhcyBhbiBhbHRlcm5hdGl2ZSB0bworc2luZ2xlLXF1b3RlIGVuY2xvc2VkIHN0cmluZ3MuCisqIEludHJvZHVjZXMgUm9sZXMgdG8gc3VwZXJzZWRlIHVzZXIgYmFzZWQgYXV0aGVudGljYXRpb24gYW5kIGFjY2VzcworY29udHJvbAorKiBOZXcgYGRhdGVgLCBgdGltZWAsIGB0aW55aW50YCBhbmQgYHNtYWxsaW50YCBgZGF0YSB0eXBlcyA8ZGF0YS10eXBlcz5gCitoYXZlIGJlZW4gYWRkZWQuCisqIGBKU09OIHN1cHBvcnQgPGNxbC1qc29uPmAgaGFzIGJlZW4gYWRkZWQKKyogQWRkcyBuZXcgdGltZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhbmQgZGVwcmVjYXRlIGBkYXRlT2ZgIGFuZAorYHVuaXhUaW1lc3RhbXBPZmAuCisKKz09IDMuMi4wCisKKyogYFVzZXItZGVmaW5lZCB0eXBlcyA8dWR0cz5gIHN1cHBvcnRlZC4KKyogYENSRUFURSBJTkRFWGAgbm93IHN1cHBvcnRzIGluZGV4aW5nIGNvbGxlY3Rpb24gY29sdW1ucywgaW5jbHVkaW5nCitpbmRleGluZyB0aGUga2V5cyBvZiBtYXAgY29sbGVjdGlvbnMgdGhyb3VnaCB0aGUgYGtleXMoKWAgZnVuY3Rpb24KKyogSW5kZXhlcyBvbiBjb2xsZWN0aW9ucyBtYXkgYmUgcXVlcmllZCB1c2luZyB0aGUgbmV3IGBDT05UQUlOU2AgYW5kCitgQ09OVEFJTlMgS0VZYCBvcGVyYXRvcnMKKyogYFR1cGxlIHR5cGVzIDx0dXBsZXM+YCB3ZXJlIGFkZGVkIHRvIGhvbGQgZml4ZWQtbGVuZ3RoIHNldHMgb2YgdHlwZWQKK3Bvc2l0aW9uYWwgZmllbGRzLgorKiBgRFJPUCBJTkRFWGAgbm93IHN1cHBvcnRzIG9wdGlvbmFsbHkgc3BlY2lmeWluZyBhIGtleXNwYWNlLgorCis9PSAzLjEuNworCisqIGBTRUxFQ1RgIHN0YXRlbWVudHMgbm93IHN1cHBvcnQgc2VsZWN0aW5nIG11bHRpcGxlIHJvd3MgaW4gYSBzaW5nbGUKK3BhcnRpdGlvbiB1c2luZyBhbiBgSU5gIGNsYXVzZSBvbiBjb21iaW5hdGlvbnMgb2YgY2x1c3RlcmluZyBjb2x1bW5zLgorKiBgSUYgTk9UIEVYSVNUU2AgYW5kIGBJRiBFWElTVFNgIHN5bnRheCBpcyBub3cgc3VwcG9ydGVkIGJ5CitgQ1JFQVRFIFVTRVJgIGFuZCBgRFJPUCBVU0VSYCBzdGF0ZW1lbnRzLCByZXNwZWN0aXZlbHkuCisKKz09IDMuMS42CisKKyogQSBuZXcgYHV1aWQoKWAgbWV0aG9kIGhhcyBiZWVuIGFkZGVkLgorKiBTdXBwb3J0IGZvciBgREVMRVRFIC4uLiBJRiBFWElTVFNgIHN5bnRheC4KKworPT0gMy4xLjUKKworKiBJdCBpcyBub3cgcG9zc2libGUgdG8gZ3JvdXAgY2x1c3RlcmluZyBjb2x1bW5zIGluIGEgcmVsYXRpb24sIHNlZQorYFdIRVJFIDx3aGVyZS1jbGF1c2U+YCBjbGF1c2VzLgorKiBBZGRlZCBzdXBwb3J0IGZvciBgc3RhdGljIGNvbHVtbnMgPHN0YXRpYy1jb2x1bW5zPmAuCisKKz09IDMuMS40CisKKyogYENSRUFURSBJTkRFWGAgbm93IGFsbG93cyBzcGVjaWZ5aW5nIG9wdGlvbnMgd2hlbiBjcmVhdGluZyBDVVNUT00KK2luZGV4ZXMuCisKKz09IDMuMS4zCisKKyogTWlsbGlzZWNvbmQgcHJlY2lzaW9uIGZvcm1hdHMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZQorYHRpbWVzdGFtcCA8dGltZXN0YW1wcz5gIHBhcnNlci4KKworPT0gMy4xLjIKKworKiBgTmFOYCBhbmQgYEluZmluaXR5YCBoYXMgYmVlbiBhZGRlZCBhcyB2YWxpZCBmbG9hdCBjb25zdGFudHMuIFRoZXkgYXJlCitub3cgcmVzZXJ2ZWQga2V5d29yZHMuIEluIHRoZSB1bmxpa2VseSBjYXNlIHlvdSB3ZSB1c2luZyB0aGVtIGFzIGEKK2NvbHVtbiBpZGVudGlmaWVyIChvciBrZXlzcGFjZS90YWJsZSBvbmUpLCB5b3Ugd2lsbCBub3cgbmVlZCB0byBkb3VibGUKK3F1b3RlIHRoZW0uCisKKz09IDMuMS4xCisKKyogYFNFTEVDVGAgc3RhdGVtZW50IG5vdyBhbGxvd3MgbGlzdGluZyB0aGUgcGFydGl0aW9uIGtleXMgKHVzaW5nIHRoZQorYERJU1RJTkNUYCBtb2RpZmllcikuIFNlZQoraHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNDUzNltDQVNTQU5EUkEtNDUzNl0uCisqIFRoZSBzeW50YXggYGMgSU4gP2AgaXMgbm93IHN1cHBvcnRlZCBpbiBgV0hFUkVgIGNsYXVzZXMuIEluIHRoYXQgY2FzZSwKK3RoZSB2YWx1ZSBleHBlY3RlZCBmb3IgdGhlIGJpbmQgdmFyaWFibGUgd2lsbCBiZSBhIGxpc3Qgb2Ygd2hhdGV2ZXIgdHlwZQorYGNgIGlzLgorKiBJdCBpcyBub3cgcG9zc2libGUgdG8gdXNlIG5hbWVkIGJpbmQgdmFyaWFibGVzICh1c2luZyBgOm5hbWVgIGluc3RlYWQKK29mIGA/YCkuCisKKz09IDMuMS4wCisKKyogYEFMVEVSIFRBQkxFYCBgRFJPUGAgb3B0aW9uIGFkZGVkLgorKiBgU0VMRUNUYCBzdGF0ZW1lbnQgbm93IHN1cHBvcnRzIGFsaWFzZXMgaW4gc2VsZWN0IGNsYXVzZS4gQWxpYXNlcyBpbgorV0hFUkUgYW5kIE9SREVSIEJZIGNsYXVzZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCisqIGBDUkVBVEVgIHN0YXRlbWVudHMgZm9yIGBLRVlTUEFDRWAsIGBUQUJMRWAgYW5kIGBJTkRFWGAgbm93IHN1cHBvcnRzCithbiBgSUYgTk9UIEVYSVNUU2AgY29uZGl0aW9uLiBTaW1pbGFybHksIGBEUk9QYCBzdGF0ZW1lbnRzIHN1cHBvcnQgYQorYElGIEVYSVNUU2AgY29uZGl0aW9uLgorKiBgSU5TRVJUYCBzdGF0ZW1lbnRzIG9wdGlvbmFsbHkgc3VwcG9ydHMgYSBgSUYgTk9UIEVYSVNUU2AgY29uZGl0aW9uCithbmQgYFVQREFURWAgc3VwcG9ydHMgYElGYCBjb25kaXRpb25zLgorCis9PSAzLjAuNQorCisqIGBTRUxFQ1RgLCBgVVBEQVRFYCwgYW5kIGBERUxFVEVgIHN0YXRlbWVudHMgbm93IGFsbG93IGVtcHR5IGBJTmAKK3JlbGF0aW9ucyAoc2VlCitodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS01NjI2KVtDQVNTQU5EUkEtNTYyNl0uCisKKz09IDMuMC40CisKKyogVXBkYXRlZCB0aGUgc3ludGF4IGZvciBjdXN0b20gYHNlY29uZGFyeSBpbmRleGVzIDxzZWNvbmRhcnktaW5kZXhlcz5gLgorKiBOb24tZXF1YWwgY29uZGl0aW9uIG9uIHRoZSBwYXJ0aXRpb24ga2V5IGFyZSBub3cgbmV2ZXIgc3VwcG9ydGVkLCBldmVuCitmb3Igb3JkZXJpbmcgcGFydGl0aW9uZXIgYXMgdGhpcyB3YXMgbm90IGNvcnJlY3QgKHRoZSBvcmRlciB3YXMgKm5vdCoKK3RoZSBvbmUgb2YgdGhlIHR5cGUgb2YgdGhlIHBhcnRpdGlvbiBrZXkpLiBJbnN0ZWFkLCB0aGUgYHRva2VuYCBtZXRob2QKK3Nob3VsZCBhbHdheXMgYmUgdXNlZCBmb3IgcmFuZ2UgcXVlcmllcyBvbiB0aGUgcGFydGl0aW9uIGtleSAoc2VlCitgV0hFUkUgY2xhdXNlcyA8d2hlcmUtY2xhdXNlPmApLgorCis9PSAzLjAuMworCisqIFN1cHBvcnQgZm9yIGN1c3RvbSBgc2Vjb25kYXJ5IGluZGV4ZXMgPHNlY29uZGFyeS1pbmRleGVzPmAgaGFzIGJlZW4KK2FkZGVkLgorCis9PSAzLjAuMgorCisqIFR5cGUgdmFsaWRhdGlvbiBmb3IgdGhlIGBjb25zdGFudHMgPGNvbnN0YW50cz5gIGhhcyBiZWVuIGZpeGVkLiBGb3IKK2luc3RhbmNlLCB0aGUgaW1wbGVtZW50YXRpb24gdXNlZCB0byBhbGxvdyBgJzInYCBhcyBhIHZhbGlkIHZhbHVlIGZvciBhbgorYGludGAgY29sdW1uIChpbnRlcnByZXRpbmcgaXQgaGFzIHRoZSBlcXVpdmFsZW50IG9mIGAyYCksIG9yIGA0MmAgYXMgYQordmFsaWQgYGJsb2JgIHZhbHVlIChpbiB3aGljaCBjYXNlIGA0MmAgd2FzIGludGVycHJldGVkIGFzIGFuIGhleGFkZWNpbWFsCityZXByZXNlbnRhdGlvbiBvZiB0aGUgYmxvYikuIFRoaXMgaXMgbm8gbG9uZ2VyIHRoZSBjYXNlLCB0eXBlIHZhbGlkYXRpb24KK29mIGNvbnN0YW50cyBpcyBub3cgbW9yZSBzdHJpY3QuIFNlZSB0aGUgYGRhdGEgdHlwZXMgPGRhdGEtdHlwZXM+YAorc2VjdGlvbiBmb3IgZGV0YWlscyBvbiB3aGljaCBjb25zdGFudCBpcyBhbGxvd2VkIGZvciB3aGljaCB0eXBlLgorKiBUaGUgdHlwZSB2YWxpZGF0aW9uIGZpeGVkIG9mIHRoZSBwcmV2aW91cyBwb2ludCBoYXMgbGVhZCB0byB0aGUKK2ludHJvZHVjdGlvbiBvZiBibG9icyBjb25zdGFudHMgdG8gYWxsb3cgdGhlIGlucHV0IG9mIGJsb2JzLiBEbyBub3RlCit0aGF0IHdoaWxlIHRoZSBpbnB1dCBvZiBibG9icyBhcyBzdHJpbmdzIGNvbnN0YW50IGlzIHN0aWxsIHN1cHBvcnRlZCBieQordGhpcyB2ZXJzaW9uICh0byBhbGxvdyBzbW9vdGhlciB0cmFuc2l0aW9uIHRvIGJsb2IgY29uc3RhbnQpLCBpdCBpcyBub3cKK2RlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBieSBhIGZ1dHVyZSB2ZXJzaW9uLiBJZiB5b3Ugd2VyZSB1c2luZworc3RyaW5ncyBhcyBibG9icywgeW91IHNob3VsZCB0aHVzIHVwZGF0ZSB5b3VyIGNsaWVudCBjb2RlIEFTQVAgdG8gc3dpdGNoCitibG9iIGNvbnN0YW50cy4KKyogQSBudW1iZXIgb2YgZnVuY3Rpb25zIHRvIGNvbnZlcnQgbmF0aXZlIHR5cGVzIHRvIGJsb2JzIGhhdmUgYWxzbyBiZWVuCitpbnRyb2R1Y2VkLiBGdXJ0aGVybW9yZSB0aGUgdG9rZW4gZnVuY3Rpb24gaXMgbm93IGFsc28gYWxsb3dlZCBpbiBzZWxlY3QKK2NsYXVzZXMuIFNlZSB0aGUgYHNlY3Rpb24gb24gZnVuY3Rpb25zIDxjcWwtZnVuY3Rpb25zPmAgZm9yIGRldGFpbHMuCisKKz09IDMuMC4xCisKKyogRGF0ZSBzdHJpbmdzIChhbmQgdGltZXN0YW1wcykgYXJlIG5vIGxvbmdlciBhY2NlcHRlZCBhcyB2YWxpZAorYHRpbWV1dWlkYCB2YWx1ZXMuIERvaW5nIHNvIHdhcyBhIGJ1ZyBpbiB0aGUgc2Vuc2UgdGhhdCBkYXRlIHN0cmluZyBhcmUKK25vdCB2YWxpZCBgdGltZXV1aWRgLCBhbmQgaXQgd2FzIHRodXMgcmVzdWx0aW5nIGluCitodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS00OTM2W2NvbmZ1c2luZworYmVoYXZpb3JzXS4gSG93ZXZlciwgdGhlIGZvbGxvd2luZyBuZXcgbWV0aG9kcyBoYXZlIGJlZW4gYWRkZWQgdG8gaGVscAord29ya2luZyB3aXRoIGB0aW1ldXVpZGA6IGBub3dgLCBgbWluVGltZXV1aWRgLCBgbWF4VGltZXV1aWRgICwgYGRhdGVPZmAKK2FuZCBgdW5peFRpbWVzdGFtcE9mYC4KKyogRmxvYXQgY29uc3RhbnRzIG5vdyBzdXBwb3J0IHRoZSBleHBvbmVudCBub3RhdGlvbi4gSW4gb3RoZXIgd29yZHMsCitgNC4yRTEwYCBpcyBub3cgYSB2YWxpZCBmbG9hdGluZyBwb2ludCB2YWx1ZS4KKworPT0gVmVyc2lvbmluZworCitWZXJzaW9uaW5nIG9mIHRoZSBDUUwgbGFuZ3VhZ2UgYWRoZXJlcyB0byB0aGUgaHR0cDovL3NlbXZlci5vcmdbU2VtYW50aWMKK1ZlcnNpb25pbmddIGd1aWRlbGluZXMuIFZlcnNpb25zIHRha2UgdGhlIGZvcm0gWC5ZLlogd2hlcmUgWCwgWSwgYW5kIFoKK2FyZSBpbnRlZ2VyIHZhbHVlcyByZXByZXNlbnRpbmcgbWFqb3IsIG1pbm9yLCBhbmQgcGF0Y2ggbGV2ZWwKK3Jlc3BlY3RpdmVseS4gVGhlcmUgaXMgbm8gY29ycmVsYXRpb24gYmV0d2VlbiBDYXNzYW5kcmEgcmVsZWFzZSB2ZXJzaW9ucworYW5kIHRoZSBDUUwgbGFuZ3VhZ2UgdmVyc2lvbi4KKworW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfHZlcnNpb24gfGRlc2NyaXB0aW9uCit8IE1ham9yIHwgVGhlIG1ham9yIHZlcnNpb24gX211c3RfIGJlIGJ1bXBlZCB3aGVuIGJhY2t3YXJkIGluY29tcGF0aWJsZSBjaGFuZ2VzCithcmUgaW50cm9kdWNlZC4gVGhpcyBzaG91bGQgcmFyZWx5IG9jY3VyLgorfCBNaW5vciB8IE1pbm9yIHZlcnNpb24gaW5jcmVtZW50cyBvY2N1ciB3aGVuIG5ldywgYnV0IGJhY2t3YXJkIGNvbXBhdGlibGUsCitmdW5jdGlvbmFsaXR5IGlzIGludHJvZHVjZWQuCit8IFBhdGNoIHwgVGhlIHBhdGNoIHZlcnNpb24gaXMgaW5jcmVtZW50ZWQgd2hlbiBidWdzIGFyZSBmaXhlZC4KK3w9PT0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9jcWxfc2luZ2xlZmlsZS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2NxbF9zaW5nbGVmaWxlLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAyYWMzYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9jcWxfc2luZ2xlZmlsZS5hZG9jCkBAIC0wLDAgKzEsMzkyMiBAQAorPT0gQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlIChDUUwpIHYzLjQuMworCitce3RvYzptYXhMZXZlbD0zfQorCis9PT0gQ1FMIFN5bnRheAorCis9PT09IFByZWFtYmxlCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UgKENRTCkgdmVyc2lvbiAzLgorQ1FMIHYzIGlzIG5vdCBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggQ1FMIHYyIGFuZCBkaWZmZXJzIGZyb20gaXQgaW4KK251bWVyb3VzIHdheXMuIE5vdGUgdGhhdCB0aGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgbGFzdCB2ZXJzaW9uIG9mIHRoZQorbGFuZ3VhZ2VzLiBIb3dldmVyLCB0aGUgbGluazojY2hhbmdlc1tjaGFuZ2VzXSBzZWN0aW9uIHByb3ZpZGVzIHRoZSBkaWZmCitiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgQ1FMIHYzLgorCitDUUwgdjMgb2ZmZXJzIGEgbW9kZWwgdmVyeSBjbG9zZSB0byBTUUwgaW4gdGhlIHNlbnNlIHRoYXQgZGF0YSBpcyBwdXQgaW4KK190YWJsZXNfIGNvbnRhaW5pbmcgX3Jvd3NfIG9mIF9jb2x1bW5zXy4gRm9yIHRoYXQgcmVhc29uLCB3aGVuIHVzZWQgaW4KK3RoaXMgZG9jdW1lbnQsIHRoZXNlIHRlcm1zICh0YWJsZXMsIHJvd3MgYW5kIGNvbHVtbnMpIGhhdmUgdGhlIHNhbWUKK2RlZmluaXRpb24gdGhhbiB0aGV5IGhhdmUgaW4gU1FMLiBCdXQgcGxlYXNlIG5vdGUgdGhhdCBhcyBzdWNoLCB0aGV5IGRvCisqbm90KiByZWZlciB0byB0aGUgY29uY2VwdCBvZiByb3dzIGFuZCBjb2x1bW5zIGZvdW5kIGluIHRoZSBpbnRlcm5hbAoraW1wbGVtZW50YXRpb24gb2YgQ2Fzc2FuZHJhIGFuZCBpbiB0aGUgdGhyaWZ0IGFuZCBDUUwgdjIgQVBJLgorCis9PT09IENvbnZlbnRpb25zCisKK1RvIGFpZCBpbiBzcGVjaWZ5aW5nIHRoZSBDUUwgc3ludGF4LCB3ZSB3aWxsIHVzZSB0aGUgZm9sbG93aW5nCitjb252ZW50aW9ucyBpbiB0aGlzIGRvY3VtZW50OgorCisqIExhbmd1YWdlIHJ1bGVzIHdpbGwgYmUgZ2l2ZW4gaW4gYQoraHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CYWNrdXMlRTIlODAlOTNOYXVyX0Zvcm1bQk5GXSAtbGlrZQorbm90YXRpb246CisKK2JjKHN5bnRheCkuIDo6PSBURVJNSU5BTAorCisqIE5vbnRlcm1pbmFsIHN5bWJvbHMgd2lsbCBoYXZlIGA8YW5nbGUgYnJhY2tldHM+YC4KKyogQXMgYWRkaXRpb25hbCBzaG9ydGN1dCBub3RhdGlvbnMgdG8gQk5GLCB3ZeKAmWxsIHVzZSB0cmFkaXRpb25hbCByZWd1bGFyCitleHByZXNzaW9u4oCZcyBzeW1ib2xzIChgP2AsIGArYCBhbmQgYCpgKSB0byBzaWduaWZ5IHRoYXQgYSBnaXZlbiBzeW1ib2wKK2lzIG9wdGlvbmFsIGFuZC9vciBjYW4gYmUgcmVwZWF0ZWQuIFdl4oCZbGwgYWxzbyBhbGxvdyBwYXJlbnRoZXNlcyB0bworZ3JvdXAgc3ltYm9scyBhbmQgdGhlIGBbPGNoYXJhY3RlcnM+XWAgbm90YXRpb24gdG8gcmVwcmVzZW50IGFueSBvbmUgb2YKK2A8Y2hhcmFjdGVycz5gLgorKiBUaGUgZ3JhbW1hciBpcyBwcm92aWRlZCBmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcyBhbmQgbGVhdmUgc29tZQorbWlub3IgZGV0YWlscyBvdXQuIEZvciBpbnN0YW5jZSwgdGhlIGxhc3QgY29sdW1uIGRlZmluaXRpb24gaW4gYQorYENSRUFURSBUQUJMRWAgc3RhdGVtZW50IGlzIG9wdGlvbmFsIGJ1dCBzdXBwb3J0ZWQgaWYgcHJlc2VudCBldmVuCit0aG91Z2ggdGhlIHByb3ZpZGVkIGdyYW1tYXIgaW4gdGhpcyBkb2N1bWVudCBzdWdnZXN0IGl0IGlzIG5vdAorc3VwcG9ydGVkLgorKiBTYW1wbGUgY29kZSB3aWxsIGJlIHByb3ZpZGVkIGluIGEgY29kZSBibG9jazoKKworYmMoc2FtcGxlKS4gU0VMRUNUIHNhbXBsZV91c2FnZSBGUk9NIGNxbDsKKworKiBSZWZlcmVuY2VzIHRvIGtleXdvcmRzIG9yIHBpZWNlcyBvZiBDUUwgY29kZSBpbiBydW5uaW5nIHRleHQgd2lsbCBiZQorc2hvd24gaW4gYSBgZml4ZWQtd2lkdGggZm9udGAuCisKK1tbaWRlbnRpZmllcnNdXQorPT09PSBJZGVudGlmaWVycyBhbmQga2V5d29yZHMKKworVGhlIENRTCBsYW5ndWFnZSB1c2VzIF9pZGVudGlmaWVyc18gKG9yIF9uYW1lc18pIHRvIGlkZW50aWZ5IHRhYmxlcywKK2NvbHVtbnMgYW5kIG90aGVyIG9iamVjdHMuIEFuIGlkZW50aWZpZXIgaXMgYSB0b2tlbiBtYXRjaGluZyB0aGUgcmVndWxhcgorZXhwcmVzc2lvbiBgW2EtekEtWl1gYFthLXpBLVowLTlfXWBgKmAuCisKK0EgbnVtYmVyIG9mIHN1Y2ggaWRlbnRpZmllcnMsIGxpa2UgYFNFTEVDVGAgb3IgYFdJVEhgLCBhcmUgX2tleXdvcmRzXy4KK1RoZXkgaGF2ZSBhIGZpeGVkIG1lYW5pbmcgZm9yIHRoZSBsYW5ndWFnZSBhbmQgbW9zdCBhcmUgcmVzZXJ2ZWQuIFRoZQorbGlzdCBvZiB0aG9zZSBrZXl3b3JkcyBjYW4gYmUgZm91bmQgaW4gbGluazojYXBwZW5kaXhBW0FwcGVuZGl4IEFdLgorCitJZGVudGlmaWVycyBhbmQgKHVucXVvdGVkKSBrZXl3b3JkcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZS4gVGh1cyBgU0VMRUNUYAoraXMgdGhlIHNhbWUgdGhhbiBgc2VsZWN0YCBvciBgc0VsRWNUYCwgYW5kIGBteUlkYCBpcyB0aGUgc2FtZSB0aGFuCitgbXlpZGAgb3IgYE1ZSURgIGZvciBpbnN0YW5jZS4gQSBjb252ZW50aW9uIG9mdGVuIHVzZWQgKGluIHBhcnRpY3VsYXIgYnkKK3RoZSBzYW1wbGVzIG9mIHRoaXMgZG9jdW1lbnRhdGlvbikgaXMgdG8gdXNlIHVwcGVyIGNhc2UgZm9yIGtleXdvcmRzIGFuZAorbG93ZXIgY2FzZSBmb3Igb3RoZXIgaWRlbnRpZmllcnMuCisKK1RoZXJlIGlzIGEgc2Vjb25kIGtpbmQgb2YgaWRlbnRpZmllcnMgY2FsbGVkIF9xdW90ZWQgaWRlbnRpZmllcnNfCitkZWZpbmVkIGJ5IGVuY2xvc2luZyBhbiBhcmJpdHJhcnkgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycyBpbgorZG91YmxlLXF1b3RlcyhgImApLiBRdW90ZWQgaWRlbnRpZmllcnMgYXJlIG5ldmVyIGtleXdvcmRzLiBUaHVzCitgInNlbGVjdCJgIGlzIG5vdCBhIHJlc2VydmVkIGtleXdvcmQgYW5kIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIGEKK2NvbHVtbiwgd2hpbGUgYHNlbGVjdGAgd291bGQgcmFpc2UgYSBwYXJzZSBlcnJvci4gQWxzbywgY29udHJhcmlseSB0bwordW5xdW90ZWQgaWRlbnRpZmllcnMgYW5kIGtleXdvcmRzLCBxdW90ZWQgaWRlbnRpZmllcnMgYXJlIGNhc2Ugc2Vuc2l0aXZlCisoYCJNeSBRdW90ZWQgSWQiYCBpcyBfZGlmZmVyZW50XyBmcm9tIGAibXkgcXVvdGVkIGlkImApLiBBIGZ1bGx5Citsb3dlcmNhc2UgcXVvdGVkIGlkZW50aWZpZXIgdGhhdCBtYXRjaGVzIGBbYS16QS1aXWBgW2EtekEtWjAtOV9dYGAqYCBpcworZXF1aXZhbGVudCB0byB0aGUgdW5xdW90ZWQgaWRlbnRpZmllciBvYnRhaW5lZCBieSByZW1vdmluZyB0aGUKK2RvdWJsZS1xdW90ZSAoc28gYCJteWlkImAgaXMgZXF1aXZhbGVudCB0byBgbXlpZGAgYW5kIHRvIGBteUlkYCBidXQKK2RpZmZlcmVudCBmcm9tIGAibXlJZCJgKS4gSW5zaWRlIGEgcXVvdGVkIGlkZW50aWZpZXIsIHRoZSBkb3VibGUtcXVvdGUKK2NoYXJhY3RlciBjYW4gYmUgcmVwZWF0ZWQgdG8gZXNjYXBlIGl0LCBzbyBgImZvbyAiIiBiYXIiYCBpcyBhIHZhbGlkCitpZGVudGlmaWVyLgorCisqV2FybmluZyo6IF9xdW90ZWQgaWRlbnRpZmllcnNfIGFsbG93cyB0byBkZWNsYXJlIGNvbHVtbnMgd2l0aCBhcmJpdHJhcnkKK25hbWVzLCBhbmQgdGhvc2UgY2FuIHNvbWV0aW1lIGNsYXNoIHdpdGggc3BlY2lmaWMgbmFtZXMgdXNlZCBieSB0aGUKK3NlcnZlci4gRm9yIGluc3RhbmNlLCB3aGVuIHVzaW5nIGNvbmRpdGlvbmFsIHVwZGF0ZSwgdGhlIHNlcnZlciB3aWxsCityZXNwb25kIHdpdGggYSByZXN1bHQtc2V0IGNvbnRhaW5pbmcgYSBzcGVjaWFsIHJlc3VsdCBuYW1lZAorYCJbYXBwbGllZF0iYC4gSWYgeW914oCZdmUgZGVjbGFyZWQgYSBjb2x1bW4gd2l0aCBzdWNoIGEgbmFtZSwgdGhpcyBjb3VsZAorcG90ZW50aWFsbHkgY29uZnVzZSBzb21lIHRvb2xzIGFuZCBzaG91bGQgYmUgYXZvaWRlZC4gSW4gZ2VuZXJhbCwKK3VucXVvdGVkIGlkZW50aWZpZXJzIHNob3VsZCBiZSBwcmVmZXJyZWQgYnV0IGlmIHlvdSB1c2UgcXVvdGVkCitpZGVudGlmaWVycywgaXQgaXMgc3Ryb25nbHkgYWR2aXNlZCB0byBhdm9pZCBhbnkgbmFtZSBlbmNsb3NlZCBieQorc3F1YXJlZCBicmFja2V0cyAobGlrZSBgIlthcHBsaWVkXSJgKSBhbmQgYW55IG5hbWUgdGhhdCBsb29rcyBsaWtlIGEKK2Z1bmN0aW9uIGNhbGwgKGxpa2UgYCJmKHgpImApLgorCis9PT09IENvbnN0YW50cworCitDUUwgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGtpbmQgb2YgX2NvbnN0YW50c186IHN0cmluZ3MsIGludGVnZXJzLAorZmxvYXRzLCBib29sZWFucywgdXVpZHMgYW5kIGJsb2JzOgorCisqIEEgc3RyaW5nIGNvbnN0YW50IGlzIGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGNoYXJhY3RlcnMKK2VuY2xvc2VkIGJ5IHNpbmdsZS1xdW90ZShgJ2ApLiBPbmUgY2FuIGluY2x1ZGUgYSBzaW5nbGUtcXVvdGUgaW4gYQorc3RyaW5nIGJ5IHJlcGVhdGluZyBpdCwgZS5nLiBgJ0l0JydzIHJhaW5pbmcgdG9kYXknYC4gVGhvc2UgYXJlIG5vdCB0bworYmUgY29uZnVzZWQgd2l0aCBxdW90ZWQgaWRlbnRpZmllcnMgdGhhdCB1c2UgZG91YmxlLXF1b3Rlcy4KKyogQW4gaW50ZWdlciBjb25zdGFudCBpcyBkZWZpbmVkIGJ5IGAnLSc/WzAtOV0rYC4KKyogQSBmbG9hdCBjb25zdGFudCBpcyBkZWZpbmVkIGJ5CitgJy0nP1swLTldKygnLidbMC05XSopPyhbZUVdWystXT9bMC05K10pP2AuIE9uIHRvcCBvZiB0aGF0LCBgTmFOYCBhbmQKK2BJbmZpbml0eWAgYXJlIGFsc28gZmxvYXQgY29uc3RhbnRzLgorKiBBIGJvb2xlYW4gY29uc3RhbnQgaXMgZWl0aGVyIGB0cnVlYCBvciBgZmFsc2VgIHVwIHRvCitjYXNlLWluc2Vuc2l0aXZpdHkgKGkuZS4gYFRydWVgIGlzIGEgdmFsaWQgYm9vbGVhbiBjb25zdGFudCkuCisqIEEgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Vbml2ZXJzYWxseV91bmlxdWVfaWRlbnRpZmllcltVVUlEXQorY29uc3RhbnQgaXMgZGVmaW5lZCBieSBgaGV4ezh9LWhleHs0fS1oZXh7NH0taGV4ezR9LWhleHsxMn1gIHdoZXJlIGBoZXhgCitpcyBhbiBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIsIGUuZy4gYFswLTlhLWZBLUZdYCBhbmQgYHs0fWAgaXMgdGhlIG51bWJlcgorb2Ygc3VjaCBjaGFyYWN0ZXJzLgorKiBBIGJsb2IgY29uc3RhbnQgaXMgYW4gaGV4YWRlY2ltYWwgbnVtYmVyIGRlZmluZWQgYnkgYDBbeFhdKGhleCkrYAord2hlcmUgYGhleGAgaXMgYW4gaGV4YWRlY2ltYWwgY2hhcmFjdGVyLCBlLmcuIGBbMC05YS1mQS1GXWAuCisKK0ZvciBob3cgdGhlc2UgY29uc3RhbnRzIGFyZSB0eXBlZCwgc2VlIHRoZSBsaW5rOiN0eXBlc1tkYXRhIHR5cGVzCitzZWN0aW9uXS4KKworPT09PSBDb21tZW50cworCitBIGNvbW1lbnQgaW4gQ1FMIGlzIGEgbGluZSBiZWdpbm5pbmcgYnkgZWl0aGVyIGRvdWJsZSBkYXNoZXMgKGAtLWApIG9yCitkb3VibGUgc2xhc2ggKGAvL2ApLgorCitNdWx0aS1saW5lIGNvbW1lbnRzIGFyZSBhbHNvIHN1cHBvcnRlZCB0aHJvdWdoIGVuY2xvc3VyZSB3aXRoaW4gYC8qYCBhbmQKK2AqL2AgKGJ1dCBuZXN0aW5nIGlzIG5vdCBzdXBwb3J0ZWQpLgorCitiYyhzYW1wbGUpLiArCivigJQgVGhpcyBpcyBhIGNvbW1lbnQgKworLy8gVGhpcyBpcyBhIGNvbW1lbnQgdG9vICsKKy8qIFRoaXMgaXMgKworYSBtdWx0aS1saW5lIGNvbW1lbnQgKi8KKworPT09PSBTdGF0ZW1lbnRzCisKK0NRTCBjb25zaXN0cyBvZiBzdGF0ZW1lbnRzLiBBcyBpbiBTUUwsIHRoZXNlIHN0YXRlbWVudHMgY2FuIGJlIGRpdmlkZWQKK2luIDMgY2F0ZWdvcmllczoKKworKiBEYXRhIGRlZmluaXRpb24gc3RhdGVtZW50cywgdGhhdCBhbGxvdyB0byBzZXQgYW5kIGNoYW5nZSB0aGUgd2F5IGRhdGEKK2lzIHN0b3JlZC4KKyogRGF0YSBtYW5pcHVsYXRpb24gc3RhdGVtZW50cywgdGhhdCBhbGxvdyB0byBjaGFuZ2UgZGF0YQorKiBRdWVyaWVzLCB0byBsb29rIHVwIGRhdGEKKworQWxsIHN0YXRlbWVudHMgZW5kIHdpdGggYSBzZW1pY29sb24gKGA7YCkgYnV0IHRoYXQgc2VtaWNvbG9uIGNhbiBiZQorb21pdHRlZCB3aGVuIGRlYWxpbmcgd2l0aCBhIHNpbmdsZSBzdGF0ZW1lbnQuIFRoZSBzdXBwb3J0ZWQgc3RhdGVtZW50cworYXJlIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLiBXaGVuIGRlc2NyaWJpbmcgdGhlIGdyYW1tYXIgb2YKK3NhaWQgc3RhdGVtZW50cywgd2Ugd2lsbCByZXVzZSB0aGUgbm9uLXRlcm1pbmFsIHN5bWJvbHMgZGVmaW5lZCBiZWxvdzoKKworYmMoc3ludGF4KS4uICsKKzo6PSBhbnkgcXVvdGVkIG9yIHVucXVvdGVkIGlkZW50aWZpZXIsIGV4Y2x1ZGluZyByZXNlcnZlZCBrZXl3b3JkcyArCis6Oj0gKCBgLicpPworCis6Oj0gYSBzdHJpbmcgY29uc3RhbnQgKworOjo9IGFuIGludGVnZXIgY29uc3RhbnQgKworOjo9IGEgZmxvYXQgY29uc3RhbnQgKworOjo9IHwgICsKKzo6PSBhIHV1aWQgY29uc3RhbnQgKworOjo9IGEgYm9vbGVhbiBjb25zdGFudCArCis6Oj0gYSBibG9iIGNvbnN0YW50CisKKzo6PSAgKworfCAgKworfCAgKworfCAgKworfCAgKworOjo9IGA/JyArCit8IGA6JyAgKworOjo9ICArCit8ICArCit8ICArCit8IGAoJyAoIChgLCcgKSopPyBgKScKKworOjo9ICArCit8ICArCit8ICArCis6Oj0gYFx7JyAoIGA6JyAoIGAsJyBgOicgKSogKT8gYH0nICsKKzo6PSBgXHsnICggKCBgLCcgKSogKT8gYH0nICsKKzo6PSBgWycgKCAoIGAsJyApKiApPyBgXScKKworOjo9CisKKzo6PSAoQU5EICkqICsKKzo6PSBgPScgKCB8IHwgKSArCitwLiArCitQbGVhc2Ugbm90ZSB0aGF0IG5vdCBldmVyeSBwb3NzaWJsZSBwcm9kdWN0aW9ucyBvZiB0aGUgZ3JhbW1hciBhYm92ZQord2lsbCBiZSB2YWxpZCBpbiBwcmFjdGljZS4gTW9zdCBub3RhYmx5LCBgPHZhcmlhYmxlPmAgYW5kIG5lc3RlZAorYDxjb2xsZWN0aW9uLWxpdGVyYWw+YCBhcmUgY3VycmVudGx5IG5vdCBhbGxvd2VkIGluc2lkZQorYDxjb2xsZWN0aW9uLWxpdGVyYWw+YC4KKworQSBgPHZhcmlhYmxlPmAgY2FuIGJlIGVpdGhlciBhbm9ueW1vdXMgKGEgcXVlc3Rpb24gbWFyayAoYD9gKSkgb3IgbmFtZWQKKyhhbiBpZGVudGlmaWVyIHByZWNlZGVkIGJ5IGA6YCkuIEJvdGggZGVjbGFyZSBhIGJpbmQgdmFyaWFibGVzIGZvcgorbGluazojcHJlcGFyZWRTdGF0ZW1lbnRbcHJlcGFyZWQgc3RhdGVtZW50c10uIFRoZSBvbmx5IGRpZmZlcmVuY2UKK2JldHdlZW4gYW4gYW55bW91cyBhbmQgYSBuYW1lZCB2YXJpYWJsZSBpcyB0aGF0IGEgbmFtZWQgb25lIHdpbGwgYmUKK2Vhc2llciB0byByZWZlciB0byAoaG93IGV4YWN0bHkgZGVwZW5kcyBvbiB0aGUgY2xpZW50IGRyaXZlciB1c2VkKS4KKworVGhlIGA8cHJvcGVydGllcz5gIHByb2R1Y3Rpb24gaXMgdXNlIGJ5IHN0YXRlbWVudCB0aGF0IGNyZWF0ZSBhbmQgYWx0ZXIKK2tleXNwYWNlcyBhbmQgdGFibGVzLiBFYWNoIGA8cHJvcGVydHk+YCBpcyBlaXRoZXIgYSBfc2ltcGxlXyBvbmUsIGluCit3aGljaCBjYXNlIGl0IGp1c3QgaGFzIGEgdmFsdWUsIG9yIGEgX21hcF8gb25lLCBpbiB3aGljaCBjYXNlIGl04oCZcyB2YWx1ZQoraXMgYSBtYXAgZ3JvdXBpbmcgc3ViLW9wdGlvbnMuIFRoZSBmb2xsb3dpbmcgd2lsbCByZWZlciB0byBvbmUgb3IgdGhlCitvdGhlciBhcyB0aGUgX2tpbmRfIChfc2ltcGxlXyBvciBfbWFwXykgb2YgdGhlIHByb3BlcnR5LgorCitBIGA8dGFibGVuYW1lPmAgd2lsbCBiZSB1c2VkIHRvIGlkZW50aWZ5IGEgdGFibGUuIFRoaXMgaXMgYW4gaWRlbnRpZmllcgorcmVwcmVzZW50aW5nIHRoZSB0YWJsZSBuYW1lIHRoYXQgY2FuIGJlIHByZWNlZGVkIGJ5IGEga2V5c3BhY2UgbmFtZS4gVGhlCitrZXlzcGFjZSBuYW1lLCBpZiBwcm92aWRlZCwgYWxsb3cgdG8gaWRlbnRpZnkgYSB0YWJsZSBpbiBhbm90aGVyCitrZXlzcGFjZSB0aGFuIHRoZSBjdXJyZW50bHkgYWN0aXZlIG9uZSAodGhlIGN1cnJlbnRseSBhY3RpdmUga2V5c3BhY2UgaXMKK3NldCB0aHJvdWdoIHRoZSBgVVNFYCBzdGF0ZW1lbnQpLgorCitGb3Igc3VwcG9ydGVkIGA8ZnVuY3Rpb24+YCwgc2VlIHRoZSBzZWN0aW9uIG9uCitsaW5rOiNmdW5jdGlvbnNbZnVuY3Rpb25zXS4KKworU3RyaW5ncyBjYW4gYmUgZWl0aGVyIGVuY2xvc2VkIHdpdGggc2luZ2xlIHF1b3RlcyBvciB0d28gZG9sbGFyCitjaGFyYWN0ZXJzLiBUaGUgc2Vjb25kIHN5bnRheCBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIGFsbG93IHN0cmluZ3MgdGhhdAorY29udGFpbiBzaW5nbGUgcXVvdGVzLiBUeXBpY2FsIGNhbmRpZGF0ZXMgZm9yIHN1Y2ggc3RyaW5ncyBhcmUgc291cmNlCitjb2RlIGZyYWdtZW50cyBmb3IgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4KKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuLiArCitgc29tZSBzdHJpbmcgdmFsdWUnCisKKyQkZG91YmxlLWRvbGxhciBzdHJpbmcgY2FuIGNvbnRhaW4gc2luZ2xlIOKAmSBxdW90ZXMkJCArCitwLgorCitbW3ByZXBhcmVkU3RhdGVtZW50XV0KKz09PT0gUHJlcGFyZWQgU3RhdGVtZW50CisKK0NRTCBzdXBwb3J0cyBfcHJlcGFyZWQgc3RhdGVtZW50c18uIFByZXBhcmVkIHN0YXRlbWVudCBpcyBhbgorb3B0aW1pemF0aW9uIHRoYXQgYWxsb3dzIHRvIHBhcnNlIGEgcXVlcnkgb25seSBvbmNlIGJ1dCBleGVjdXRlIGl0CittdWx0aXBsZSB0aW1lcyB3aXRoIGRpZmZlcmVudCBjb25jcmV0ZSB2YWx1ZXMuCisKK0luIGEgc3RhdGVtZW50LCBlYWNoIHRpbWUgYSBjb2x1bW4gdmFsdWUgaXMgZXhwZWN0ZWQgKGluIHRoZSBkYXRhCittYW5pcHVsYXRpb24gYW5kIHF1ZXJ5IHN0YXRlbWVudHMpLCBhIGA8dmFyaWFibGU+YCAoc2VlIGFib3ZlKSBjYW4gYmUKK3VzZWQgaW5zdGVhZC4gQSBzdGF0ZW1lbnQgd2l0aCBiaW5kIHZhcmlhYmxlcyBtdXN0IHRoZW4gYmUgX3ByZXBhcmVkXy4KK09uY2UgaXQgaGFzIGJlZW4gcHJlcGFyZWQsIGl0IGNhbiBleGVjdXRlZCBieSBwcm92aWRpbmcgY29uY3JldGUgdmFsdWVzCitmb3IgdGhlIGJpbmQgdmFyaWFibGVzLiBUaGUgZXhhY3QgcHJvY2VkdXJlIHRvIHByZXBhcmUgYSBzdGF0ZW1lbnQgYW5kCitleGVjdXRlIGEgcHJlcGFyZWQgc3RhdGVtZW50IGRlcGVuZHMgb24gdGhlIENRTCBkcml2ZXIgdXNlZCBhbmQgaXMKK2JleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudC4KKworSW4gYWRkaXRpb24gdG8gcHJvdmlkaW5nIGNvbHVtbiB2YWx1ZXMsIGJpbmQgbWFya2VycyBtYXkgYmUgdXNlZCB0bworcHJvdmlkZSB2YWx1ZXMgZm9yIGBMSU1JVGAsIGBUSU1FU1RBTVBgLCBhbmQgYFRUTGAgY2xhdXNlcy4gSWYgYW5vbnltb3VzCitiaW5kIG1hcmtlcnMgYXJlIHVzZWQsIHRoZSBuYW1lcyBmb3IgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMgd2lsbCBiZQorYFtsaW1pdF1gLCBgW3RpbWVzdGFtcF1gLCBhbmQgYFt0dGxdYCwgcmVzcGVjdGl2ZWx5LgorCitbW2RhdGFEZWZpbml0aW9uXV0KKz09PSBEYXRhIERlZmluaXRpb24KKworW1tjcmVhdGVLZXlzcGFjZVN0bXRdXQorPT09PSBDUkVBVEUgS0VZU1BBQ0UKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gQ1JFQVRFIEtFWVNQQUNFIChJRiBOT1QgRVhJU1RTKT8gV0lUSCAgKworcC4gKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuLiArCitDUkVBVEUgS0VZU1BBQ0UgRXhjZWxzaW9yICsKK1dJVEggcmVwbGljYXRpb24gPSBce+KAmWNsYXNz4oCZOiBgU2ltcGxlU3RyYXRlZ3knLCBgcmVwbGljYXRpb25fZmFjdG9yJyA6CiszfTsKKworQ1JFQVRFIEtFWVNQQUNFIEV4Y2FsaWJ1ciArCitXSVRIIHJlcGxpY2F0aW9uID0gXHvigJljbGFzc+KAmTogYE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgYERDMScgOiAxLAorYERDMicgOiAzfSArCitBTkQgZHVyYWJsZV93cml0ZXMgPSBmYWxzZTsgKworcC4gKworVGhlIGBDUkVBVEUgS0VZU1BBQ0VgIHN0YXRlbWVudCBjcmVhdGVzIGEgbmV3IHRvcC1sZXZlbCBfa2V5c3BhY2VfLiBBCitrZXlzcGFjZSBpcyBhIG5hbWVzcGFjZSB0aGF0IGRlZmluZXMgYSByZXBsaWNhdGlvbiBzdHJhdGVneSBhbmQgc29tZQorb3B0aW9ucyBmb3IgYSBzZXQgb2YgdGFibGVzLiBWYWxpZCBrZXlzcGFjZXMgbmFtZXMgYXJlIGlkZW50aWZpZXJzCitjb21wb3NlZCBleGNsdXNpdmVseSBvZiBhbHBoYW51bWVyaWNhbCBjaGFyYWN0ZXJzIGFuZCB3aG9zZSBsZW5ndGggaXMKK2xlc3NlciBvciBlcXVhbCB0byAzMi4gTm90ZSB0aGF0IGFzIGlkZW50aWZpZXJzLCBrZXlzcGFjZSBuYW1lcyBhcmUgY2FzZQoraW5zZW5zaXRpdmU6IHVzZSBhIHF1b3RlZCBpZGVudGlmaWVyIGZvciBjYXNlIHNlbnNpdGl2ZSBrZXlzcGFjZSBuYW1lcy4KKworVGhlIHN1cHBvcnRlZCBgPHByb3BlcnRpZXM+YCBmb3IgYENSRUFURSBLRVlTUEFDRWAgYXJlOgorCitbY29scz0iLCwsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8bmFtZSB8a2luZCB8bWFuZGF0b3J5IHxkZWZhdWx0IHxkZXNjcmlwdGlvbgorfGByZXBsaWNhdGlvbmAgfF9tYXBfIHx5ZXMgfCB8VGhlIHJlcGxpY2F0aW9uIHN0cmF0ZWd5IGFuZCBvcHRpb25zIHRvCit1c2UgZm9yIHRoZSBrZXlzcGFjZS4KKworfGBkdXJhYmxlX3dyaXRlc2AgfF9zaW1wbGVfIHxubyB8dHJ1ZSB8V2hldGhlciB0byB1c2UgdGhlIGNvbW1pdCBsb2cgZm9yCit1cGRhdGVzIG9uIHRoaXMga2V5c3BhY2UgKGRpc2FibGUgdGhpcyBvcHRpb24gYXQgeW91ciBvd24gcmlzayEpLgorfD09PQorCitUaGUgYHJlcGxpY2F0aW9uYCBgPHByb3BlcnR5PmAgaXMgbWFuZGF0b3J5LiBJdCBtdXN0IGF0IGxlYXN0IGNvbnRhaW5zCit0aGUgYCdjbGFzcydgIHN1Yi1vcHRpb24gd2hpY2ggZGVmaW5lcyB0aGUgcmVwbGljYXRpb24gc3RyYXRlZ3kgY2xhc3MgdG8KK3VzZS4gVGhlIHJlc3Qgb2YgdGhlIHN1Yi1vcHRpb25zIGRlcGVuZHMgb24gdGhhdCByZXBsaWNhdGlvbiBzdHJhdGVneQorY2xhc3MuIEJ5IGRlZmF1bHQsIENhc3NhbmRyYSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgYCdjbGFzcydgOgorCisqIGAnU2ltcGxlU3RyYXRlZ3knYDogQSBzaW1wbGUgc3RyYXRlZ3kgdGhhdCBkZWZpbmVzIGEgc2ltcGxlCityZXBsaWNhdGlvbiBmYWN0b3IgZm9yIHRoZSB3aG9sZSBjbHVzdGVyLiBUaGUgb25seSBzdWItb3B0aW9ucyBzdXBwb3J0ZWQKK2lzIGAncmVwbGljYXRpb25fZmFjdG9yJ2AgdG8gZGVmaW5lIHRoYXQgcmVwbGljYXRpb24gZmFjdG9yIGFuZCBpcworbWFuZGF0b3J5LgorKiBgJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5J2A6IEEgcmVwbGljYXRpb24gc3RyYXRlZ3kgdGhhdCBhbGxvd3MgdG8gc2V0Cit0aGUgcmVwbGljYXRpb24gZmFjdG9yIGluZGVwZW5kZW50bHkgZm9yIGVhY2ggZGF0YS1jZW50ZXIuIFRoZSByZXN0IG9mCit0aGUgc3ViLW9wdGlvbnMgYXJlIGtleS12YWx1ZSBwYWlycyB3aGVyZSBlYWNoIHRpbWUgdGhlIGtleSBpcyB0aGUgbmFtZQorb2YgYSBkYXRhY2VudGVyIGFuZCB0aGUgdmFsdWUgdGhlIHJlcGxpY2F0aW9uIGZhY3RvciBmb3IgdGhhdAorZGF0YS1jZW50ZXIuCisKK0F0dGVtcHRpbmcgdG8gY3JlYXRlIGFuIGFscmVhZHkgZXhpc3Rpbmcga2V5c3BhY2Ugd2lsbCByZXR1cm4gYW4gZXJyb3IKK3VubGVzcyB0aGUgYElGIE5PVCBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiBpdCBpcyB1c2VkLCB0aGUgc3RhdGVtZW50Cit3aWxsIGJlIGEgbm8tb3AgaWYgdGhlIGtleXNwYWNlIGFscmVhZHkgZXhpc3RzLgorCitbW3VzZVN0bXRdXQorPT09PSBVU0UKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuIDo6PSBVU0UKKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuIFVTRSBteUFwcDsKKworVGhlIGBVU0VgIHN0YXRlbWVudCB0YWtlcyBhbiBleGlzdGluZyBrZXlzcGFjZSBuYW1lIGFzIGFyZ3VtZW50IGFuZCBzZXQKK2l0IGFzIHRoZSBwZXItY29ubmVjdGlvbiBjdXJyZW50IHdvcmtpbmcga2V5c3BhY2UuIEFsbCBzdWJzZXF1ZW50CitrZXlzcGFjZS1zcGVjaWZpYyBhY3Rpb25zIHdpbGwgYmUgcGVyZm9ybWVkIGluIHRoZSBjb250ZXh0IG9mIHRoZQorc2VsZWN0ZWQga2V5c3BhY2UsIHVubGVzcyBsaW5rOiNzdGF0ZW1lbnRzW290aGVyd2lzZSBzcGVjaWZpZWRdLCB1bnRpbAorYW5vdGhlciBVU0Ugc3RhdGVtZW50IGlzIGlzc3VlZCBvciB0aGUgY29ubmVjdGlvbiB0ZXJtaW5hdGVzLgorCitbW2FsdGVyS2V5c3BhY2VTdG10XV0KKz09PT0gQUxURVIgS0VZU1BBQ0UKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gQUxURVIgS0VZU1BBQ0UgKElGIEVYSVNUUyk/IFdJVEggICsKK3AuICsKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLi4gKworQUxURVIgS0VZU1BBQ0UgRXhjZWxzaW9yICsKK1dJVEggcmVwbGljYXRpb24gPSBce+KAmWNsYXNz4oCZOiBgU2ltcGxlU3RyYXRlZ3knLCBgcmVwbGljYXRpb25fZmFjdG9yJyA6Cis0fTsKKworVGhlIGBBTFRFUiBLRVlTUEFDRWAgc3RhdGVtZW50IGFsdGVycyB0aGUgcHJvcGVydGllcyBvZiBhbiBleGlzdGluZwora2V5c3BhY2UuIFRoZSBzdXBwb3J0ZWQgYDxwcm9wZXJ0aWVzPmAgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUKK2xpbms6I2NyZWF0ZUtleXNwYWNlU3RtdFtgQ1JFQVRFIEtFWVNQQUNFYF0gc3RhdGVtZW50LgorCitbW2Ryb3BLZXlzcGFjZVN0bXRdXQorPT09PSBEUk9QIEtFWVNQQUNFCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLiA6Oj0gRFJPUCBLRVlTUEFDRSAoIElGIEVYSVNUUyApPworCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gRFJPUCBLRVlTUEFDRSBteUFwcDsKKworQSBgRFJPUCBLRVlTUEFDRWAgc3RhdGVtZW50IHJlc3VsdHMgaW4gdGhlIGltbWVkaWF0ZSwgaXJyZXZlcnNpYmxlCityZW1vdmFsIG9mIGFuIGV4aXN0aW5nIGtleXNwYWNlLCBpbmNsdWRpbmcgYWxsIGNvbHVtbiBmYW1pbGllcyBpbiBpdCwKK2FuZCBhbGwgZGF0YSBjb250YWluZWQgaW4gdGhvc2UgY29sdW1uIGZhbWlsaWVzLgorCitJZiB0aGUga2V5c3BhY2UgZG9lcyBub3QgZXhpc3RzLCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLAordW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisKK1tbY3JlYXRlVGFibGVTdG10XV0KKz09PT0gQ1JFQVRFIFRBQkxFCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IENSRUFURSAoIFRBQkxFIHwgQ09MVU1ORkFNSUxZICkgKCBJRiBOT1QgRVhJU1RTICk/ICArCitgKCcgKCBgLCcgKSogYCknICsKKyggV0lUSCAoIEFORCApKiApPworCis6Oj0gKCBTVEFUSUMgKT8gKCBQUklNQVJZIEtFWSApPyArCit8IFBSSU1BUlkgS0VZIGAoJyAoIGAsJyApKiBgKScKKworOjo9ICArCit8IGAoJyAoYCwnICkqIGApJworCis6Oj0gICsKK3wgQ09NUEFDVCBTVE9SQUdFICsKK3wgQ0xVU1RFUklORyBPUkRFUiArCitwLiArCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4uICsKK0NSRUFURSBUQUJMRSBtb25rZXlTcGVjaWVzICggKworc3BlY2llcyB0ZXh0IFBSSU1BUlkgS0VZLCArCitjb21tb25fbmFtZSB0ZXh0LCArCitwb3B1bGF0aW9uIHZhcmludCwgKworYXZlcmFnZV9zaXplIGludCArCispIFdJVEggY29tbWVudD1gSW1wb3J0YW50IGJpb2xvZ2ljYWwgcmVjb3Jkcyc7CisKK0NSRUFURSBUQUJMRSB0aW1lbGluZSAoICsKK3VzZXJpZCB1dWlkLCArCitwb3N0ZWRfbW9udGggaW50LCArCitwb3N0ZWRfdGltZSB1dWlkLCArCitib2R5IHRleHQsICsKK3Bvc3RlZF9ieSB0ZXh0LCArCitQUklNQVJZIEtFWSAodXNlcmlkLCBwb3N0ZWRfbW9udGgsIHBvc3RlZF90aW1lKSArCispIFdJVEggY29tcGFjdGlvbiA9IFx7IGBjbGFzcycgOiBgTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneScgfTsgKworcC4gKworVGhlIGBDUkVBVEUgVEFCTEVgIHN0YXRlbWVudCBjcmVhdGVzIGEgbmV3IHRhYmxlLiBFYWNoIHN1Y2ggdGFibGUgaXMgYQorc2V0IG9mIF9yb3dzXyAodXN1YWxseSByZXByZXNlbnRpbmcgcmVsYXRlZCBlbnRpdGllcykgZm9yIHdoaWNoIGl0CitkZWZpbmVzIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMuIEEgdGFibGUgaXMgZGVmaW5lZCBieSBhCitsaW5rOiNjcmVhdGVUYWJsZU5hbWVbbmFtZV0sIGl0IGRlZmluZXMgdGhlIGNvbHVtbnMgY29tcG9zaW5nIHJvd3Mgb2YKK3RoZSB0YWJsZSBhbmQgaGF2ZSBhIG51bWJlciBvZiBsaW5rOiNjcmVhdGVUYWJsZU9wdGlvbnNbb3B0aW9uc10uIE5vdGUKK3RoYXQgdGhlIGBDUkVBVEUgQ09MVU1ORkFNSUxZYCBzeW50YXggaXMgc3VwcG9ydGVkIGFzIGFuIGFsaWFzIGZvcgorYENSRUFURSBUQUJMRWAgKGZvciBoaXN0b3JpY2FsIHJlYXNvbnMpLgorCitBdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBhbHJlYWR5IGV4aXN0aW5nIHRhYmxlIHdpbGwgcmV0dXJuIGFuIGVycm9yCit1bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgaXQgaXMgdXNlZCwgdGhlIHN0YXRlbWVudAord2lsbCBiZSBhIG5vLW9wIGlmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cy4KKworW1tjcmVhdGVUYWJsZU5hbWVdXQorPT09PT0gYDx0YWJsZW5hbWU+YAorCitWYWxpZCB0YWJsZSBuYW1lcyBhcmUgdGhlIHNhbWUgYXMgdmFsaWQKK2xpbms6I2NyZWF0ZUtleXNwYWNlU3RtdFtrZXlzcGFjZSBuYW1lc10gKHVwIHRvIDMyIGNoYXJhY3RlcnMgbG9uZworYWxwaGFudW1lcmljYWwgaWRlbnRpZmllcnMpLiBJZiB0aGUgdGFibGUgbmFtZSBpcyBwcm92aWRlZCBhbG9uZSwgdGhlCit0YWJsZSBpcyBjcmVhdGVkIHdpdGhpbiB0aGUgY3VycmVudCBrZXlzcGFjZSAoc2VlIGBVU0VgKSwgYnV0IGlmIGl0IGlzCitwcmVmaXhlZCBieSBhbiBleGlzdGluZyBrZXlzcGFjZSBuYW1lIChzZWUKK2xpbms6I3N0YXRlbWVudHNbYDx0YWJsZW5hbWU+YF0gZ3JhbW1hciksIGl0IGlzIGNyZWF0ZWQgaW4gdGhlIHNwZWNpZmllZAora2V5c3BhY2UgKGJ1dCBkb2VzICpub3QqIGNoYW5nZSB0aGUgY3VycmVudCBrZXlzcGFjZSkuCisKK1tbY3JlYXRlVGFibGVDb2x1bW5dXQorPT09PT0gYDxjb2x1bW4tZGVmaW5pdGlvbj5gCisKK0EgYENSRUFURSBUQUJMRWAgc3RhdGVtZW50IGRlZmluZXMgdGhlIGNvbHVtbnMgdGhhdCByb3dzIG9mIHRoZSB0YWJsZQorY2FuIGhhdmUuIEEgX2NvbHVtbl8gaXMgZGVmaW5lZCBieSBpdHMgbmFtZSAoYW4gaWRlbnRpZmllcikgYW5kIGl0cyB0eXBlCisoc2VlIHRoZSBsaW5rOiN0eXBlc1tkYXRhIHR5cGVzXSBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMgb24gYWxsb3dlZAordHlwZXMgYW5kIHRoZWlyIHByb3BlcnRpZXMpLgorCitXaXRoaW4gYSB0YWJsZSwgYSByb3cgaXMgdW5pcXVlbHkgaWRlbnRpZmllZCBieSBpdHMgYFBSSU1BUlkgS0VZYCAob3IKK21vcmUgc2ltcGx5IHRoZSBrZXkpLCBhbmQgaGVuY2UgYWxsIHRhYmxlIGRlZmluaXRpb25zICptdXN0KiBkZWZpbmUgYQorUFJJTUFSWSBLRVkgKGFuZCBvbmx5IG9uZSkuIEEgYFBSSU1BUlkgS0VZYCBpcyBjb21wb3NlZCBvZiBvbmUgb3IgbW9yZQorb2YgdGhlIGNvbHVtbnMgZGVmaW5lZCBpbiB0aGUgdGFibGUuIElmIHRoZSBgUFJJTUFSWSBLRVlgIGlzIG9ubHkgb25lCitjb2x1bW4sIHRoaXMgY2FuIGJlIHNwZWNpZmllZCBkaXJlY3RseSBhZnRlciB0aGUgY29sdW1uIGRlZmluaXRpb24uCitPdGhlcndpc2UsIGl0IG11c3QgYmUgc3BlY2lmaWVkIGJ5IGZvbGxvd2luZyBgUFJJTUFSWSBLRVlgIGJ5IHRoZQorY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY29sdW1uIG5hbWVzIGNvbXBvc2luZyB0aGUga2V5IHdpdGhpbgorcGFyZW50aGVzaXMuIE5vdGUgdGhhdDoKKworYmMoc2FtcGxlKS4gKworQ1JFQVRFIFRBQkxFIHQgKCArCitrIGludCBQUklNQVJZIEtFWSwgKworb3RoZXIgdGV4dCArCispCisKK2lzIGVxdWl2YWxlbnQgdG8KKworYmMoc2FtcGxlKS4gKworQ1JFQVRFIFRBQkxFIHQgKCArCitrIGludCwgKworb3RoZXIgdGV4dCwgKworUFJJTUFSWSBLRVkgKGspICsKKykKKworW1tjcmVhdGVUYWJsZXBhcnRpdGlvbkNsdXN0ZXJpbmddXQorPT09PT0gUGFydGl0aW9uIGtleSBhbmQgY2x1c3RlcmluZyBjb2x1bW5zCisKK0luIENRTCwgdGhlIG9yZGVyIGluIHdoaWNoIGNvbHVtbnMgYXJlIGRlZmluZWQgZm9yIHRoZSBgUFJJTUFSWSBLRVlgCittYXR0ZXJzLiBUaGUgZmlyc3QgY29sdW1uIG9mIHRoZSBrZXkgaXMgY2FsbGVkIHRoZSBfcGFydGl0aW9uIGtleV8uIEl0CitoYXMgdGhlIHByb3BlcnR5IHRoYXQgYWxsIHRoZSByb3dzIHNoYXJpbmcgdGhlIHNhbWUgcGFydGl0aW9uIGtleSAoZXZlbgorYWNyb3NzIHRhYmxlIGluIGZhY3QpIGFyZSBzdG9yZWQgb24gdGhlIHNhbWUgcGh5c2ljYWwgbm9kZS4gQWxzbywKK2luc2VydGlvbi91cGRhdGUvZGVsZXRpb24gb24gcm93cyBzaGFyaW5nIHRoZSBzYW1lIHBhcnRpdGlvbiBrZXkgZm9yIGEKK2dpdmVuIHRhYmxlIGFyZSBwZXJmb3JtZWQgX2F0b21pY2FsbHlfIGFuZCBpbiBfaXNvbGF0aW9uXy4gTm90ZSB0aGF0IGl0CitpcyBwb3NzaWJsZSB0byBoYXZlIGEgY29tcG9zaXRlIHBhcnRpdGlvbiBrZXksIGkuZS4gYSBwYXJ0aXRpb24ga2V5Citmb3JtZWQgb2YgbXVsdGlwbGUgY29sdW1ucywgdXNpbmcgYW4gZXh0cmEgc2V0IG9mIHBhcmVudGhlc2VzIHRvIGRlZmluZQord2hpY2ggY29sdW1ucyBmb3JtcyB0aGUgcGFydGl0aW9uIGtleS4KKworVGhlIHJlbWFpbmluZyBjb2x1bW5zIG9mIHRoZSBgUFJJTUFSWSBLRVlgIGRlZmluaXRpb24sIGlmIGFueSwgYXJlCitjYWxsZWQgX19jbHVzdGVyaW5nIGNvbHVtbnMuIE9uIGEgZ2l2ZW4gcGh5c2ljYWwgbm9kZSwgcm93cyBmb3IgYSBnaXZlbgorcGFydGl0aW9uIGtleSBhcmUgc3RvcmVkIGluIHRoZSBvcmRlciBpbmR1Y2VkIGJ5IHRoZSBjbHVzdGVyaW5nIGNvbHVtbnMsCittYWtpbmcgdGhlIHJldHJpZXZhbCBvZiByb3dzIGluIHRoYXQgY2x1c3RlcmluZyBvcmRlciBwYXJ0aWN1bGFybHkKK2VmZmljaWVudCAoc2VlIGBTRUxFQ1RgKS4KKworW1tjcmVhdGVUYWJsZVN0YXRpY11dCis9PT09PSBgU1RBVElDYCBjb2x1bW5zCisKK1NvbWUgY29sdW1ucyBjYW4gYmUgZGVjbGFyZWQgYXMgYFNUQVRJQ2AgaW4gYSB0YWJsZSBkZWZpbml0aW9uLiBBIGNvbHVtbgordGhhdCBpcyBzdGF0aWMgd2lsbCBiZSBgYHNoYXJlZCcnIGJ5IGFsbCB0aGUgcm93cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUKK3BhcnRpdGlvbiAoaGF2aW5nIHRoZSBzYW1lIHBhcnRpdGlvbiBrZXkpLiBGb3IgaW5zdGFuY2UsIGluOgorCitiYyhzYW1wbGUpLiArCitDUkVBVEUgVEFCTEUgdGVzdCAoICsKK3BrIGludCwgKwordCBpbnQsICsKK3YgdGV4dCwgKworcyB0ZXh0IHN0YXRpYywgKworUFJJTUFSWSBLRVkgKHBrLCB0KSArCispOyArCitJTlNFUlQgSU5UTyB0ZXN0KHBrLCB0LCB2LCBzKSBWQUxVRVMgKDAsIDAsIGB2YWwwJywgYHN0YXRpYzAnKTsgKworSU5TRVJUIElOVE8gdGVzdChwaywgdCwgdiwgcykgVkFMVUVTICgwLCAxLCBgdmFsMScsIGBzdGF0aWMxJyk7ICsKK1NFTEVDVCAqIEZST00gdGVzdCBXSEVSRSBwaz0wIEFORCB0PTA7CisKK3RoZSBsYXN0IHF1ZXJ5IHdpbGwgcmV0dXJuIGAnc3RhdGljMSdgIGFzIHZhbHVlIGZvciBgc2AsIHNpbmNlIGBzYCBpcworc3RhdGljIGFuZCB0aHVzIHRoZSAybmQgaW5zZXJ0aW9uIG1vZGlmaWVkIHRoaXMgYGBzaGFyZWQnJyB2YWx1ZS4gTm90ZQoraG93ZXZlciB0aGF0IHN0YXRpYyBjb2x1bW5zIGFyZSBvbmx5IHN0YXRpYyB3aXRoaW4gYSBnaXZlbiBwYXJ0aXRpb24sCithbmQgaWYgaW4gdGhlIGV4YW1wbGUgYWJvdmUgYm90aCByb3dzIHdoZXJlIGZyb20gZGlmZmVyZW50IHBhcnRpdGlvbnMKKyhpLmUuIGlmIHRoZXkgaGFkIGRpZmZlcmVudCB2YWx1ZSBmb3IgYHBrYCksIHRoZW4gdGhlIDJuZCBpbnNlcnRpb24KK3dvdWxkIG5vdCBoYXZlIG1vZGlmaWVkIHRoZSB2YWx1ZSBvZiBgc2AgZm9yIHRoZSBmaXJzdCByb3cuCisKK0EgZmV3IHJlc3RyaWN0aW9ucyBhcHBsaWVzIHRvIHdoZW4gc3RhdGljIGNvbHVtbnMgYXJlIGFsbG93ZWQ6CisKKyogdGFibGVzIHdpdGggdGhlIGBDT01QQUNUIFNUT1JBR0VgIG9wdGlvbiAoc2VlIGJlbG93KSBjYW5ub3QgaGF2ZSB0aGVtCisqIGEgdGFibGUgd2l0aG91dCBjbHVzdGVyaW5nIGNvbHVtbnMgY2Fubm90IGhhdmUgc3RhdGljIGNvbHVtbnMgKGluIGEKK3RhYmxlIHdpdGhvdXQgY2x1c3RlcmluZyBjb2x1bW5zLCBldmVyeSBwYXJ0aXRpb24gaGFzIG9ubHkgb25lIHJvdywgYW5kCitzbyBldmVyeSBjb2x1bW4gaXMgaW5oZXJlbnRseSBzdGF0aWMpLgorKiBvbmx5IG5vbiBgUFJJTUFSWSBLRVlgIGNvbHVtbnMgY2FuIGJlIHN0YXRpYworCitbW2NyZWF0ZVRhYmxlT3B0aW9uc11dCis9PT09PSBgPG9wdGlvbj5gCisKK1RoZSBgQ1JFQVRFIFRBQkxFYCBzdGF0ZW1lbnQgc3VwcG9ydHMgYSBudW1iZXIgb2Ygb3B0aW9ucyB0aGF0IGNvbnRyb2xzCit0aGUgY29uZmlndXJhdGlvbiBvZiBhIG5ldyB0YWJsZS4gVGhlc2Ugb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIGFmdGVyCit0aGUgYFdJVEhgIGtleXdvcmQuCisKK1RoZSBmaXJzdCBvZiB0aGVzZSBvcHRpb24gaXMgYENPTVBBQ1QgU1RPUkFHRWAuIFRoaXMgb3B0aW9uIGlzIG1haW5seQordGFyZ2V0ZWQgdG93YXJkcyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBkZWZpbml0aW9ucyBjcmVhdGVkIGJlZm9yZQorQ1FMMyAoc2VlCitodHRwOi8vd3d3LmRhdGFzdGF4LmNvbS9kZXYvYmxvZy90aHJpZnQtdG8tY3FsM1t3d3cuZGF0YXN0YXguY29tL2Rldi9ibG9nL3RocmlmdC10by1jcWwzXQorZm9yIG1vcmUgZGV0YWlscykuIFRoZSBvcHRpb24gYWxzbyBwcm92aWRlcyBhIHNsaWdodGx5IG1vcmUgY29tcGFjdAorbGF5b3V0IG9mIGRhdGEgb24gZGlzayBidXQgYXQgdGhlIHByaWNlIG9mIGRpbWluaXNoZWQgZmxleGliaWxpdHkgYW5kCitleHRlbnNpYmlsaXR5IGZvciB0aGUgdGFibGUuIE1vc3Qgbm90YWJseSwgYENPTVBBQ1QgU1RPUkFHRWAgdGFibGVzCitjYW5ub3QgaGF2ZSBjb2xsZWN0aW9ucyBub3Igc3RhdGljIGNvbHVtbnMgYW5kIGEgYENPTVBBQ1QgU1RPUkFHRWAgdGFibGUKK3dpdGggYXQgbGVhc3Qgb25lIGNsdXN0ZXJpbmcgY29sdW1uIHN1cHBvcnRzIGV4YWN0bHkgb25lIChhcyBpbiBub3QgMAorbm9yIG1vcmUgdGhhbiAxKSBjb2x1bW4gbm90IHBhcnQgb2YgdGhlIGBQUklNQVJZIEtFWWAgZGVmaW5pdGlvbiAod2hpY2gKK2ltcGx5IGluIHBhcnRpY3VsYXIgdGhhdCB5b3UgY2Fubm90IGFkZCBub3IgcmVtb3ZlIGNvbHVtbnMgYWZ0ZXIKK2NyZWF0aW9uKS4gRm9yIHRob3NlIHJlYXNvbnMsIGBDT01QQUNUIFNUT1JBR0VgIGlzIG5vdCByZWNvbW1lbmRlZAorb3V0c2lkZSBvZiB0aGUgYmFja3dhcmQgY29tcGF0aWJpbGl0eSByZWFzb24gZXZva2VkIGFib3ZlLgorCitBbm90aGVyIG9wdGlvbiBpcyBgQ0xVU1RFUklORyBPUkRFUmAuIEl0IGFsbG93cyB0byBkZWZpbmUgdGhlIG9yZGVyaW5nCitvZiByb3dzIG9uIGRpc2suIEl0IHRha2VzIHRoZSBsaXN0IG9mIHRoZSBjbHVzdGVyaW5nIGNvbHVtbiBuYW1lcyB3aXRoLAorZm9yIGVhY2ggb2YgdGhlbSwgdGhlIG9uLWRpc2sgb3JkZXIgKEFzY2VuZGluZyBvciBkZXNjZW5kaW5nKS4gTm90ZSB0aGF0Cit0aGlzIG9wdGlvbiBhZmZlY3RzIGxpbms6I3NlbGVjdE9yZGVyQnlbd2hhdCBgT1JERVIgQllgIGFyZSBhbGxvd2VkCitkdXJpbmcgYFNFTEVDVGBdLgorCitUYWJsZSBjcmVhdGlvbiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG90aGVyIGA8cHJvcGVydHk+YDoKKworW2NvbHM9IiwsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8b3B0aW9uIHxraW5kIHxkZWZhdWx0IHxkZXNjcmlwdGlvbgorfGBjb21tZW50YCB8X3NpbXBsZV8gfG5vbmUgfEEgZnJlZS1mb3JtLCBodW1hbi1yZWFkYWJsZSBjb21tZW50LgorCit8YGdjX2dyYWNlX3NlY29uZHNgIHxfc2ltcGxlXyB8ODY0MDAwIHxUaW1lIHRvIHdhaXQgYmVmb3JlIGdhcmJhZ2UKK2NvbGxlY3RpbmcgdG9tYnN0b25lcyAoZGVsZXRpb24gbWFya2VycykuCisKK3xgYmxvb21fZmlsdGVyX2ZwX2NoYW5jZWAgfF9zaW1wbGVfIHwwLjAwMDc1IHxUaGUgdGFyZ2V0IHByb2JhYmlsaXR5IG9mCitmYWxzZSBwb3NpdGl2ZSBvZiB0aGUgc3N0YWJsZSBibG9vbSBmaWx0ZXJzLiBTYWlkIGJsb29tIGZpbHRlcnMgd2lsbCBiZQorc2l6ZWQgdG8gcHJvdmlkZSB0aGUgcHJvdmlkZWQgcHJvYmFiaWxpdHkgKHRodXMgbG93ZXJpbmcgdGhpcyB2YWx1ZQoraW1wYWN0IHRoZSBzaXplIG9mIGJsb29tIGZpbHRlcnMgaW4tbWVtb3J5IGFuZCBvbi1kaXNrKQorCit8YGRlZmF1bHRfdGltZV90b19saXZlYCB8X3NpbXBsZV8gfDAgfFRoZSBkZWZhdWx0IGV4cGlyYXRpb24gdGltZQorKGBgVFRMJycpIGluIHNlY29uZHMgZm9yIGEgdGFibGUuCisKK3xgY29tcGFjdGlvbmAgfF9tYXBfIHxfc2VlIGJlbG93XyB8Q29tcGFjdGlvbiBvcHRpb25zLCBzZWUKK2xpbms6I2NvbXBhY3Rpb25PcHRpb25zW2JlbG93XS4KKworfGBjb21wcmVzc2lvbmAgfF9tYXBfIHxfc2VlIGJlbG93XyB8Q29tcHJlc3Npb24gb3B0aW9ucywgc2VlCitsaW5rOiNjb21wcmVzc2lvbk9wdGlvbnNbYmVsb3ddLgorCit8YGNhY2hpbmdgIHxfbWFwXyB8X3NlZSBiZWxvd18gfENhY2hpbmcgb3B0aW9ucywgc2VlCitsaW5rOiNjYWNoaW5nT3B0aW9uc1tiZWxvd10uCit8PT09CisKK1tbY29tcGFjdGlvbk9wdGlvbnNdXQorPT09PT0gQ29tcGFjdGlvbiBvcHRpb25zCisKK1RoZSBgY29tcGFjdGlvbmAgcHJvcGVydHkgbXVzdCBhdCBsZWFzdCBkZWZpbmUgdGhlIGAnY2xhc3MnYCBzdWItb3B0aW9uLAordGhhdCBkZWZpbmVzIHRoZSBjb21wYWN0aW9uIHN0cmF0ZWd5IGNsYXNzIHRvIHVzZS4gVGhlIGRlZmF1bHQgc3VwcG9ydGVkCitjbGFzcyBhcmUgYCdTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J2AsCitgJ0xldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3knYCBhbmQKK2AnVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSdgLiBDdXN0b20gc3RyYXRlZ3kgY2FuIGJlIHByb3ZpZGVkIGJ5CitzcGVjaWZ5aW5nIHRoZSBmdWxsIGNsYXNzIG5hbWUgYXMgYSBsaW5rOiNjb25zdGFudHNbc3RyaW5nIGNvbnN0YW50XS4KK1RoZSByZXN0IG9mIHRoZSBzdWItb3B0aW9ucyBkZXBlbmRzIG9uIHRoZSBjaG9zZW4gY2xhc3MuIFRoZSBzdWItb3B0aW9ucworc3VwcG9ydGVkIGJ5IHRoZSBkZWZhdWx0IGNsYXNzZXMgYXJlOgorCitbY29scz0iLCwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xvcHRpb24gfHN1cHBvcnRlZCBjb21wYWN0aW9uIHN0cmF0ZWd5IHxkZWZhdWx0IHxkZXNjcmlwdGlvbgorfGBlbmFibGVkYCB8X2FsbF8gfHRydWUgfEEgYm9vbGVhbiBkZW5vdGluZyB3aGV0aGVyIGNvbXBhY3Rpb24gc2hvdWxkIGJlCitlbmFibGVkIG9yIG5vdC4KKworfGB0b21ic3RvbmVfdGhyZXNob2xkYCB8X2FsbF8gfDAuMiB8QSByYXRpbyBzdWNoIHRoYXQgaWYgYSBzc3RhYmxlIGhhcworbW9yZSB0aGFuIHRoaXMgcmF0aW8gb2YgZ2NhYmxlIHRvbWJzdG9uZXMgb3ZlciBhbGwgY29udGFpbmVkIGNvbHVtbnMsCit0aGUgc3N0YWJsZSB3aWxsIGJlIGNvbXBhY3RlZCAod2l0aCBubyBvdGhlciBzc3RhYmxlcykgZm9yIHRoZSBwdXJwb3NlCitvZiBwdXJnaW5nIHRob3NlIHRvbWJzdG9uZXMuCisKK3xgdG9tYnN0b25lX2NvbXBhY3Rpb25faW50ZXJ2YWxgIHxfYWxsXyB8MSBkYXkgfFRoZSBtaW5pbXVtIHRpbWUgdG8gd2FpdAorYWZ0ZXIgYW4gc3N0YWJsZSBjcmVhdGlvbiB0aW1lIGJlZm9yZSBjb25zaWRlcmluZyBpdCBmb3IgYGB0b21ic3RvbmUKK2NvbXBhY3Rpb24nJywgd2hlcmUgYGB0b21ic3RvbmUgY29tcGFjdGlvbicnIGlzIHRoZSBjb21wYWN0aW9uIHRyaWdnZXJlZAoraWYgdGhlIHNzdGFibGUgaGFzIG1vcmUgZ2NhYmxlIHRvbWJzdG9uZXMgdGhhbiBgdG9tYnN0b25lX3RocmVzaG9sZGAuCisKK3xgdW5jaGVja2VkX3RvbWJzdG9uZV9jb21wYWN0aW9uYCB8X2FsbF8gfGZhbHNlIHxTZXR0aW5nIHRoaXMgdG8gdHJ1ZQorZW5hYmxlcyBtb3JlIGFnZ3Jlc3NpdmUgdG9tYnN0b25lIGNvbXBhY3Rpb25zIC0gc2luZ2xlIHNzdGFibGUgdG9tYnN0b25lCitjb21wYWN0aW9ucyB3aWxsIHJ1biB3aXRob3V0IGNoZWNraW5nIGhvdyBsaWtlbHkgaXQgaXMgdGhhdCB0aGV5IHdpbGwgYmUKK3N1Y2Nlc3NmdWwuCisKK3xgbWluX3NzdGFibGVfc2l6ZWAgfFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgfDUwTUIgfFRoZSBzaXplIHRpZXJlZAorc3RyYXRlZ3kgZ3JvdXBzIFNTVGFibGVzIHRvIGNvbXBhY3QgaW4gYnVja2V0cy4gQSBidWNrZXQgZ3JvdXBzIFNTVGFibGVzCit0aGF0IGRpZmZlcnMgZnJvbSBsZXNzIHRoYW4gNTAlIGluIHNpemUuIEhvd2V2ZXIsIGZvciBzbWFsbCBzaXplcywgdGhpcword291bGQgcmVzdWx0IGluIGEgYnVja2V0aW5nIHRoYXQgaXMgdG9vIGZpbmUgZ3JhaW5lZC4gYG1pbl9zc3RhYmxlX3NpemVgCitkZWZpbmVzIGEgc2l6ZSB0aHJlc2hvbGQgKGluIGJ5dGVzKSBiZWxvdyB3aGljaCBhbGwgU1NUYWJsZXMgYmVsb25nIHRvCitvbmUgdW5pcXVlIGJ1Y2tldAorCit8YG1pbl90aHJlc2hvbGRgIHxTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5IHw0IHxNaW5pbXVtIG51bWJlciBvZgorU1NUYWJsZXMgbmVlZGVkIHRvIHN0YXJ0IGEgbWlub3IgY29tcGFjdGlvbi4KKworfGBtYXhfdGhyZXNob2xkYCB8U2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSB8MzIgfE1heGltdW0gbnVtYmVyIG9mCitTU1RhYmxlcyBwcm9jZXNzZWQgYnkgb25lIG1pbm9yIGNvbXBhY3Rpb24uCisKK3xgYnVja2V0X2xvd2AgfFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgfDAuNSB8U2l6ZSB0aWVyZWQgY29uc2lkZXIKK3NzdGFibGVzIHRvIGJlIHdpdGhpbiB0aGUgc2FtZSBidWNrZXQgaWYgdGhlaXIgc2l6ZSBpcyB3aXRoaW4KK1thdmVyYWdlX3NpemUgKiBgYnVja2V0X2xvd2AsIGF2ZXJhZ2Vfc2l6ZSAqIGBidWNrZXRfaGlnaGAgXSAoaS5lIHRoZQorZGVmYXVsdCBncm91cHMgc3N0YWJsZSB3aG9zZSBzaXplcyBkaXZlcmdlcyBieSBhdCBtb3N0IDUwJSkKKworfGBidWNrZXRfaGlnaGAgfFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgfDEuNSB8U2l6ZSB0aWVyZWQgY29uc2lkZXIKK3NzdGFibGVzIHRvIGJlIHdpdGhpbiB0aGUgc2FtZSBidWNrZXQgaWYgdGhlaXIgc2l6ZSBpcyB3aXRoaW4KK1thdmVyYWdlX3NpemUgKiBgYnVja2V0X2xvd2AsIGF2ZXJhZ2Vfc2l6ZSAqIGBidWNrZXRfaGlnaGAgXSAoaS5lIHRoZQorZGVmYXVsdCBncm91cHMgc3N0YWJsZSB3aG9zZSBzaXplcyBkaXZlcmdlcyBieSBhdCBtb3N0IDUwJSkuCisKK3xgc3N0YWJsZV9zaXplX2luX21iYCB8TGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneSB8NU1CIHxUaGUgdGFyZ2V0IHNpemUKKyhpbiBNQikgZm9yIHNzdGFibGVzIGluIHRoZSBsZXZlbGVkIHN0cmF0ZWd5LiBOb3RlIHRoYXQgd2hpbGUgc3N0YWJsZQorc2l6ZXMgc2hvdWxkIHN0YXkgbGVzcyBvciBlcXVhbCB0byBgc3N0YWJsZV9zaXplX2luX21iYCwgaXQgaXMgcG9zc2libGUKK3RvIGV4Y2VwdGlvbmFsbHkgaGF2ZSBhIGxhcmdlciBzc3RhYmxlIGFzIGR1cmluZyBjb21wYWN0aW9uLCBkYXRhIGZvciBhCitnaXZlbiBwYXJ0aXRpb24ga2V5IGFyZSBuZXZlciBzcGxpdCBpbnRvIDIgc3N0YWJsZXMKKworfGB0aW1lc3RhbXBfcmVzb2x1dGlvbmAgfFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kgfE1JQ1JPU0VDT05EUyB8VGhlCit0aW1lc3RhbXAgcmVzb2x1dGlvbiB1c2VkIHdoZW4gaW5zZXJ0aW5nIGRhdGEsIGNvdWxkIGJlIE1JTExJU0VDT05EUywKK01JQ1JPU0VDT05EUyBldGMgKHNob3VsZCBiZSB1bmRlcnN0YW5kYWJsZSBieSBKYXZhIFRpbWVVbml0KSAtIGRvbuKAmXQKK2NoYW5nZSB0aGlzIHVubGVzcyB5b3UgZG8gbXV0YXRpb25zIHdpdGggVVNJTkcgVElNRVNUQU1QIChvciBlcXVpdmFsZW50CitkaXJlY3RseSBpbiB0aGUgY2xpZW50KQorCit8YGNvbXBhY3Rpb25fd2luZG93X3VuaXRgIHxUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5IHxEQVlTIHxUaGUgSmF2YQorVGltZVVuaXQgdXNlZCBmb3IgdGhlIHdpbmRvdyBzaXplLCBzZXQgaW4gY29uanVuY3Rpb24gd2l0aAorYGNvbXBhY3Rpb25fd2luZG93X3NpemVgLiBNdXN0IGJlIG9uZSBvZiBEQVlTLCBIT1VSUywgTUlOVVRFUworCit8YGNvbXBhY3Rpb25fd2luZG93X3NpemVgIHxUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5IHwxIHxUaGUgbnVtYmVyCitvZiBgY29tcGFjdGlvbl93aW5kb3dfdW5pdGAgdW5pdHMgdGhhdCBtYWtlIHVwIGEgdGltZSB3aW5kb3cuCisKK3xgdW5zYWZlX2FnZ3Jlc3NpdmVfc3N0YWJsZV9leHBpcmF0aW9uYCB8VGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneQorfGZhbHNlIHxFeHBpcmVkIHNzdGFibGVzIHdpbGwgYmUgZHJvcHBlZCB3aXRob3V0IGNoZWNraW5nIGl0cyBkYXRhIGlzCitzaGFkb3dpbmcgb3RoZXIgc3N0YWJsZXMuIFRoaXMgaXMgYSBwb3RlbnRpYWxseSByaXNreSBvcHRpb24gdGhhdCBjYW4KK2xlYWQgdG8gZGF0YSBsb3NzIG9yIGRlbGV0ZWQgZGF0YSByZS1hcHBlYXJpbmcsIGdvaW5nIGJleW9uZCB3aGF0CitgdW5jaGVja2VkX3RvbWJzdG9uZV9jb21wYWN0aW9uYCBkb2VzIGZvciBzaW5nbGUgc3N0YWJsZSBjb21wYWN0aW9uLiBEdWUKK3RvIHRoZSByaXNrIHRoZSBqdm0gbXVzdCBhbHNvIGJlIHN0YXJ0ZWQgd2l0aAorYC1EY2Fzc2FuZHJhLnVuc2FmZV9hZ2dyZXNzaXZlX3NzdGFibGVfZXhwaXJhdGlvbj10cnVlYC4KK3w9PT0KKworW1tjb21wcmVzc2lvbk9wdGlvbnNdXQorPT09PT0gQ29tcHJlc3Npb24gb3B0aW9ucworCitGb3IgdGhlIGBjb21wcmVzc2lvbmAgcHJvcGVydHksIHRoZSBmb2xsb3dpbmcgc3ViLW9wdGlvbnMgYXJlIGF2YWlsYWJsZToKKworW2NvbHM9IiwsLCwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xvcHRpb24gfGRlZmF1bHQgfGRlc2NyaXB0aW9uIHwgfCB8Cit8YGNsYXNzYCB8TFo0Q29tcHJlc3NvciB8VGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSB0byB1c2UuIERlZmF1bHQKK2NvbXByZXNzb3IgYXJlOiBMWjRDb21wcmVzc29yLCBTbmFwcHlDb21wcmVzc29yIGFuZCBEZWZsYXRlQ29tcHJlc3Nvci4KK1VzZSBgJ2VuYWJsZWQnIDogZmFsc2VgIHRvIGRpc2FibGUgY29tcHJlc3Npb24uIEN1c3RvbSBjb21wcmVzc29yIGNhbiBiZQorcHJvdmlkZWQgYnkgc3BlY2lmeWluZyB0aGUgZnVsbCBjbGFzcyBuYW1lIGFzIGEgbGluazojY29uc3RhbnRzW3N0cmluZworY29uc3RhbnRdLiB8IHwgfAorCit8YGVuYWJsZWRgIHx0cnVlIHxCeSBkZWZhdWx0IGNvbXByZXNzaW9uIGlzIGVuYWJsZWQuIFRvIGRpc2FibGUgaXQsIHNldAorYGVuYWJsZWRgIHRvIGBmYWxzZWAgfGBjaHVua19sZW5ndGhfaW5fa2JgIHw2NEtCIHxPbiBkaXNrIFNTVGFibGVzIGFyZQorY29tcHJlc3NlZCBieSBibG9jayAodG8gYWxsb3cgcmFuZG9tIHJlYWRzKS4gVGhpcyBkZWZpbmVzIHRoZSBzaXplIChpbgorS0IpIG9mIHNhaWQgYmxvY2suIEJpZ2dlciB2YWx1ZXMgbWF5IGltcHJvdmUgdGhlIGNvbXByZXNzaW9uIHJhdGUsIGJ1dAoraW5jcmVhc2VzIHRoZSBtaW5pbXVtIHNpemUgb2YgZGF0YSB0byBiZSByZWFkIGZyb20gZGlzayBmb3IgYSByZWFkCisKK3xgY3JjX2NoZWNrX2NoYW5jZWAgfDEuMCB8V2hlbiBjb21wcmVzc2lvbiBpcyBlbmFibGVkLCBlYWNoIGNvbXByZXNzZWQKK2Jsb2NrIGluY2x1ZGVzIGEgY2hlY2tzdW0gb2YgdGhhdCBibG9jayBmb3IgdGhlIHB1cnBvc2Ugb2YgZGV0ZWN0aW5nCitkaXNrIGJpdHJvdCBhbmQgYXZvaWRpbmcgdGhlIHByb3BhZ2F0aW9uIG9mIGNvcnJ1cHRpb24gdG8gb3RoZXIgcmVwbGljYS4KK1RoaXMgb3B0aW9uIGRlZmluZXMgdGhlIHByb2JhYmlsaXR5IHdpdGggd2hpY2ggdGhvc2UgY2hlY2tzdW1zIGFyZQorY2hlY2tlZCBkdXJpbmcgcmVhZC4gQnkgZGVmYXVsdCB0aGV5IGFyZSBhbHdheXMgY2hlY2tlZC4gU2V0IHRvIDAgdG8KK2Rpc2FibGUgY2hlY2tzdW0gY2hlY2tpbmcgYW5kIHRvIDAuNSBmb3IgaW5zdGFuY2UgdG8gY2hlY2sgdGhlbSBldmVyeQorb3RoZXIgcmVhZCB8IHwgfAorfD09PQorCitbW2NhY2hpbmdPcHRpb25zXV0KKz09PT09IENhY2hpbmcgb3B0aW9ucworCitGb3IgdGhlIGBjYWNoaW5nYCBwcm9wZXJ0eSwgdGhlIGZvbGxvd2luZyBzdWItb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfG9wdGlvbiB8ZGVmYXVsdCB8ZGVzY3JpcHRpb24KK3xga2V5c2AgfEFMTCB8V2hldGhlciB0byBjYWNoZSBrZXlzIChgYGtleSBjYWNoZScnKSBmb3IgdGhpcyB0YWJsZS4KK1ZhbGlkIHZhbHVlcyBhcmU6IGBBTExgIGFuZCBgTk9ORWAuCisKK3xgcm93c19wZXJfcGFydGl0aW9uYCB8Tk9ORSB8VGhlIGFtb3VudCBvZiByb3dzIHRvIGNhY2hlIHBlciBwYXJ0aXRpb24KKyhgYHJvdyBjYWNoZScnKS4gSWYgYW4gaW50ZWdlciBgbmAgaXMgc3BlY2lmaWVkLCB0aGUgZmlyc3QgYG5gIHF1ZXJpZWQKK3Jvd3Mgb2YgYSBwYXJ0aXRpb24gd2lsbCBiZSBjYWNoZWQuIE90aGVyIHBvc3NpYmxlIG9wdGlvbnMgYXJlIGBBTExgLCB0bworY2FjaGUgYWxsIHJvd3Mgb2YgYSBxdWVyaWVkIHBhcnRpdGlvbiwgb3IgYE5PTkVgIHRvIGRpc2FibGUgcm93IGNhY2hpbmcuCit8PT09CisKKz09PT09IE90aGVyIGNvbnNpZGVyYXRpb25zOgorCisqIFdoZW4gbGluazojaW5zZXJ0U3RtdFtpbnNlcnRpbmddIC8gbGluazojdXBkYXRlU3RtdFt1cGRhdGluZ10gYSBnaXZlbgorcm93LCBub3QgYWxsIGNvbHVtbnMgbmVlZHMgdG8gYmUgZGVmaW5lZCAoZXhjZXB0IGZvciB0aG9zZSBwYXJ0IG9mIHRoZQora2V5KSwgYW5kIG1pc3NpbmcgY29sdW1ucyBvY2N1cHkgbm8gc3BhY2Ugb24gZGlzay4gRnVydGhlcm1vcmUsIGFkZGluZworbmV3IGNvbHVtbnMgKHNlZSBgQUxURVIgVEFCTEVgKSBpcyBhIGNvbnN0YW50IHRpbWUgb3BlcmF0aW9uLiBUaGVyZSBpcwordGh1cyBubyBuZWVkIHRvIHRyeSB0byBhbnRpY2lwYXRlIGZ1dHVyZSB1c2FnZSAob3IgdG8gY3J5IHdoZW4geW91CitoYXZlbuKAmXQpIHdoZW4gY3JlYXRpbmcgYSB0YWJsZS4KKworW1thbHRlclRhYmxlU3RtdF1dCis9PT09IEFMVEVSIFRBQkxFCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IEFMVEVSIChUQUJMRSB8IENPTFVNTkZBTUlMWSkgKElGIEVYSVNUUyk/CisKKzo6PSBBREQgKElGIE5PVCBFWElTVFMpPyArCit8IEFERCAgKElGIE5PVCBFWElTVFMpPyAoICggLCApKiApICsKK3wgRFJPUCAoSUYgRVhJU1RTKT8gICsKK3wgRFJPUCAoSUYgRVhJU1RTKT8gKCAoICwgKSogKSArCit8IFJFTkFNRSAoSUYgRVhJU1RTKT8gVE8gKEFORCBUTykqICsKK3wgV0lUSCAoIEFORCApKiArCitwLiArCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4uICsKK0FMVEVSIFRBQkxFIGFkZGFtc0ZhbWlseQorCitBTFRFUiBUQUJMRSBhZGRhbXNGYW1pbHkgKworQUREIGdyYXZlc2l0ZSB2YXJjaGFyOworCitBTFRFUiBUQUJMRSBhZGRhbXNGYW1pbHkgKworV0lUSCBjb21tZW50ID0gYEEgbW9zdCBleGNlbGxlbnQgYW5kIHVzZWZ1bCBjb2x1bW4gZmFtaWx5JzsgKworcC4gKworVGhlIGBBTFRFUmAgc3RhdGVtZW50IGlzIHVzZWQgdG8gbWFuaXB1bGF0ZSB0YWJsZSBkZWZpbml0aW9ucy4gSXQgYWxsb3dzCitmb3IgYWRkaW5nIG5ldyBjb2x1bW5zLCBkcm9wcGluZyBleGlzdGluZyBvbmVzLCBvciB1cGRhdGluZyB0aGUgdGFibGUKK29wdGlvbnMuIEFzIHdpdGggdGFibGUgY3JlYXRpb24sIGBBTFRFUiBDT0xVTU5GQU1JTFlgIGlzIGFsbG93ZWQgYXMgYW4KK2FsaWFzIGZvciBgQUxURVIgVEFCTEVgLgorSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKworVGhlIGA8dGFibGVuYW1lPmAgaXMgdGhlIHRhYmxlIG5hbWUgb3B0aW9uYWxseSBwcmVjZWRlZCBieSB0aGUga2V5c3BhY2UKK25hbWUuIFRoZSBgPGluc3RydWN0aW9uPmAgZGVmaW5lcyB0aGUgYWx0ZXJhdGlvbiB0byBwZXJmb3JtOgorCisqIGBBRERgOiBBZGRzIGEgbmV3IGNvbHVtbiB0byB0aGUgdGFibGUuIFRoZSBgPGlkZW50aWZpZXI+YCBmb3IgdGhlIG5ldworY29sdW1uIG11c3Qgbm90IGNvbmZsaWN0IHdpdGggYW4gZXhpc3RpbmcgY29sdW1uLiBNb3Jlb3ZlciwgY29sdW1ucworY2Fubm90IGJlIGFkZGVkIHRvIHRhYmxlcyBkZWZpbmVkIHdpdGggdGhlIGBDT01QQUNUIFNUT1JBR0VgIG9wdGlvbi4KK0lmIHRoZSBuZXcgY29sdW1uIGFscmVhZHkgZXhpc3RzLCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIE5PVCBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisqIGBEUk9QYDogUmVtb3ZlcyBhIGNvbHVtbiBmcm9tIHRoZSB0YWJsZS4gRHJvcHBlZCBjb2x1bW5zIHdpbGwKK2ltbWVkaWF0ZWx5IGJlY29tZSB1bmF2YWlsYWJsZSBpbiB0aGUgcXVlcmllcyBhbmQgd2lsbCBub3QgYmUgaW5jbHVkZWQKK2luIGNvbXBhY3RlZCBzc3RhYmxlcyBpbiB0aGUgZnV0dXJlLiBJZiBhIGNvbHVtbiBpcyByZWFkZGVkLCBxdWVyaWVzCit3b27igJl0IHJldHVybiB2YWx1ZXMgd3JpdHRlbiBiZWZvcmUgdGhlIGNvbHVtbiB3YXMgbGFzdCBkcm9wcGVkLiBJdCBpcworYXNzdW1lZCB0aGF0IHRpbWVzdGFtcHMgcmVwcmVzZW50IGFjdHVhbCB0aW1lLCBzbyBpZiB0aGlzIGlzIG5vdCB5b3VyCitjYXNlLCB5b3Ugc2hvdWxkIE5PVCByZWFkIHByZXZpb3VzbHkgZHJvcHBlZCBjb2x1bW5zLiBDb2x1bW5zIGNhbuKAmXQgYmUKK2Ryb3BwZWQgZnJvbSB0YWJsZXMgZGVmaW5lZCB3aXRoIHRoZSBgQ09NUEFDVCBTVE9SQUdFYCBvcHRpb24uCitJZiB0aGUgZHJvcHBlZCBjb2x1bW4gZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisqIGBSRU5BTUVgIGEgcHJpbWFyeSBrZXkgY29sdW1uIG9mIGEgdGFibGUuIE5vbiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbm5vdCBiZSByZW5hbWVkLgorRnVydGhlcm1vcmUsIHJlbmFtaW5nIGEgY29sdW1uIHRvIGFub3RoZXIgbmFtZSB3aGljaCBhbHJlYWR5IGV4aXN0cyBpc24ndCBhbGxvd2VkLgorSXQncyBpbXBvcnRhbnQgdG8ga2VlcCBpbiBtaW5kIHRoYXQgcmVuYW1lZCBjb2x1bW5zIHNob3VsZG4ndCBoYXZlIGRlcGVuZGVudCBzZWNvbmRheSBpbmRleGVzLgorSWYgdGhlIHJlbmFtZWQgY29sdW1uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorCisqIGBXSVRIYDogQWxsb3dzIHRvIHVwZGF0ZSB0aGUgb3B0aW9ucyBvZiB0aGUgdGFibGUuIFRoZQorbGluazojY3JlYXRlVGFibGVPcHRpb25zW3N1cHBvcnRlZCBgPG9wdGlvbj5gXSAoYW5kIHN5bnRheCkgYXJlIHRoZSBzYW1lCithcyBmb3IgdGhlIGBDUkVBVEUgVEFCTEVgIHN0YXRlbWVudCBleGNlcHQgdGhhdCBgQ09NUEFDVCBTVE9SQUdFYCBpcyBub3QKK3N1cHBvcnRlZC4gTm90ZSB0aGF0IHNldHRpbmcgYW55IGBjb21wYWN0aW9uYCBzdWItb3B0aW9ucyBoYXMgdGhlIGVmZmVjdAorb2YgZXJhc2luZyBhbGwgcHJldmlvdXMgYGNvbXBhY3Rpb25gIG9wdGlvbnMsIHNvIHlvdSBuZWVkIHRvIHJlLXNwZWNpZnkKK2FsbCB0aGUgc3ViLW9wdGlvbnMgaWYgeW91IHdhbnQgdG8ga2VlcCB0aGVtLiBUaGUgc2FtZSBub3RlIGFwcGxpZXMgdG8KK3RoZSBzZXQgb2YgYGNvbXByZXNzaW9uYCBzdWItb3B0aW9ucy4KKworPT09PT0gQ1FMIHR5cGUgY29tcGF0aWJpbGl0eToKKworQ1FMIGRhdGEgdHlwZXMgbWF5IGJlIGNvbnZlcnRlZCBvbmx5IGFzIHRoZSBmb2xsb3dpbmcgdGFibGUuCisKK1tjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xEYXRhIHR5cGUgbWF5IGJlIGFsdGVyZWQgdG86IHxEYXRhIHR5cGUKK3x0aW1lc3RhbXAgfGJpZ2ludAorCit8YXNjaWksIGJpZ2ludCwgYm9vbGVhbiwgZGF0ZSwgZGVjaW1hbCwgZG91YmxlLCBmbG9hdCwgaW5ldCwgaW50LAorc21hbGxpbnQsIHRleHQsIHRpbWUsIHRpbWVzdGFtcCwgdGltZXV1aWQsIHRpbnlpbnQsIHV1aWQsIHZhcmNoYXIsCit2YXJpbnQgfGJsb2IKKworfGludCB8ZGF0ZQorCit8YXNjaWksIHZhcmNoYXIgfHRleHQKKworfGJpZ2ludCB8dGltZQorCit8YmlnaW50IHx0aW1lc3RhbXAKKworfHRpbWV1dWlkIHx1dWlkCisKK3xhc2NpaSwgdGV4dCB8dmFyY2hhcgorCit8YmlnaW50LCBpbnQsIHRpbWVzdGFtcCB8dmFyaW50Cit8PT09CisKK0NsdXN0ZXJpbmcgY29sdW1ucyBoYXZlIHN0cmljdGVyIHJlcXVpcmVtZW50cywgb25seSB0aGUgYmVsb3cKK2NvbnZlcnNpb25zIGFyZSBhbGxvd2VkLgorCitbY29scz0iLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8RGF0YSB0eXBlIG1heSBiZSBhbHRlcmVkIHRvOiB8RGF0YSB0eXBlCit8YXNjaWksIHRleHQsIHZhcmNoYXIgfGJsb2IKK3xhc2NpaSwgdmFyY2hhciB8dGV4dAorfGFzY2lpLCB0ZXh0IHx2YXJjaGFyCit8PT09CisKK1tbZHJvcFRhYmxlU3RtdF1dCis9PT09IERST1AgVEFCTEUKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuIDo6PSBEUk9QIFRBQkxFICggSUYgRVhJU1RTICk/CisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiBEUk9QIFRBQkxFIHdvcmxkU2VyaWVzQXR0ZW5kZWVzOworCitUaGUgYERST1AgVEFCTEVgIHN0YXRlbWVudCByZXN1bHRzIGluIHRoZSBpbW1lZGlhdGUsIGlycmV2ZXJzaWJsZQorcmVtb3ZhbCBvZiBhIHRhYmxlLCBpbmNsdWRpbmcgYWxsIGRhdGEgY29udGFpbmVkIGluIGl0LiBBcyBmb3IgdGFibGUKK2NyZWF0aW9uLCBgRFJPUCBDT0xVTU5GQU1JTFlgIGlzIGFsbG93ZWQgYXMgYW4gYWxpYXMgZm9yIGBEUk9QIFRBQkxFYC4KKworSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MKK2BJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisKK1tbdHJ1bmNhdGVTdG10XV0KKz09PT0gVFJVTkNBVEUKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuIDo6PSBUUlVOQ0FURSAoIFRBQkxFIHwgQ09MVU1ORkFNSUxZICk/CisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiBUUlVOQ0FURSBzdXBlckltcG9ydGFudERhdGE7CisKK1RoZSBgVFJVTkNBVEVgIHN0YXRlbWVudCBwZXJtYW5lbnRseSByZW1vdmVzIGFsbCBkYXRhIGZyb20gYSB0YWJsZS4KKworW1tjcmVhdGVJbmRleFN0bXRdXQorPT09PSBDUkVBVEUgSU5ERVgKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gQ1JFQVRFICggQ1VTVE9NICk/IElOREVYICggSUYgTk9UIEVYSVNUUyApPyAoICk/ICsKK09OIGAoJyBgKScgKworKCBVU0lORyAoIFdJVEggT1BUSU9OUyA9ICk/ICk/CisKKzo6PSAgKworfCBrZXlzKCApICsKK3AuICsKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitDUkVBVEUgSU5ERVggdXNlckluZGV4IE9OIE5lcmRNb3ZpZXMgKHVzZXIpOyArCitDUkVBVEUgSU5ERVggT04gTXV0YW50cyAoYWJpbGl0eUlkKTsgKworQ1JFQVRFIElOREVYIE9OIHVzZXJzIChrZXlzKGZhdnMpKTsgKworQ1JFQVRFIENVU1RPTSBJTkRFWCBPTiB1c2VycyAoZW1haWwpIFVTSU5HIGBwYXRoLnRvLnRoZS5JbmRleENsYXNzJzsgKworQ1JFQVRFIENVU1RPTSBJTkRFWCBPTiB1c2VycyAoZW1haWwpIFVTSU5HIGBwYXRoLnRvLnRoZS5JbmRleENsYXNzJyBXSVRICitPUFRJT05TID0gXHvigJlzdG9yYWdl4oCZOiBgL21udC9zc2QvaW5kZXhlcy8nfTsKKworVGhlIGBDUkVBVEUgSU5ERVhgIHN0YXRlbWVudCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyAoYXV0b21hdGljKQorc2Vjb25kYXJ5IGluZGV4IGZvciBhIGdpdmVuIChleGlzdGluZykgY29sdW1uIGluIGEgZ2l2ZW4gdGFibGUuIEEgbmFtZQorZm9yIHRoZSBpbmRleCBpdHNlbGYgY2FuIGJlIHNwZWNpZmllZCBiZWZvcmUgdGhlIGBPTmAga2V5d29yZCwgaWYKK2Rlc2lyZWQuIElmIGRhdGEgYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBjb2x1bW4sIGl0IHdpbGwgYmUgaW5kZXhlZAorYXN5bmNocm9ub3VzbHkuIEFmdGVyIHRoZSBpbmRleCBpcyBjcmVhdGVkLCBuZXcgZGF0YSBmb3IgdGhlIGNvbHVtbiBpcworaW5kZXhlZCBhdXRvbWF0aWNhbGx5IGF0IGluc2VydGlvbiB0aW1lLgorCitBdHRlbXB0aW5nIHRvIGNyZWF0ZSBhbiBhbHJlYWR5IGV4aXN0aW5nIGluZGV4IHdpbGwgcmV0dXJuIGFuIGVycm9yCit1bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgaXQgaXMgdXNlZCwgdGhlIHN0YXRlbWVudAord2lsbCBiZSBhIG5vLW9wIGlmIHRoZSBpbmRleCBhbHJlYWR5IGV4aXN0cy4KKworW1trZXlzSW5kZXhdXQorPT09PT0gSW5kZXhlcyBvbiBNYXAgS2V5cworCitXaGVuIGNyZWF0aW5nIGFuIGluZGV4IG9uIGEgbGluazojbWFwW21hcCBjb2x1bW5dLCB5b3UgbWF5IGluZGV4IGVpdGhlcgordGhlIGtleXMgb3IgdGhlIHZhbHVlcy4gSWYgdGhlIGNvbHVtbiBpZGVudGlmaWVyIGlzIHBsYWNlZCB3aXRoaW4gdGhlCitga2V5cygpYCBmdW5jdGlvbiwgdGhlIGluZGV4IHdpbGwgYmUgb24gdGhlIG1hcCBrZXlzLCBhbGxvd2luZyB5b3UgdG8KK3VzZSBgQ09OVEFJTlMgS0VZYCBpbiBgV0hFUkVgIGNsYXVzZXMuIE90aGVyd2lzZSwgdGhlIGluZGV4IHdpbGwgYmUgb24KK3RoZSBtYXAgdmFsdWVzLgorCitbW2Ryb3BJbmRleFN0bXRdXQorPT09PSBEUk9QIElOREVYCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLiA6Oj0gRFJPUCBJTkRFWCAoIElGIEVYSVNUUyApPyAoIGAuJyApPworCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4uICsKK0RST1AgSU5ERVggdXNlckluZGV4OworCitEUk9QIElOREVYIHVzZXJrZXlzcGFjZS5hZGRyZXNzX2luZGV4OyArCitwLiArCitUaGUgYERST1AgSU5ERVhgIHN0YXRlbWVudCBpcyB1c2VkIHRvIGRyb3AgYW4gZXhpc3Rpbmcgc2Vjb25kYXJ5IGluZGV4LgorVGhlIGFyZ3VtZW50IG9mIHRoZSBzdGF0ZW1lbnQgaXMgdGhlIGluZGV4IG5hbWUsIHdoaWNoIG1heSBvcHRpb25hbGx5CitzcGVjaWZ5IHRoZSBrZXlzcGFjZSBvZiB0aGUgaW5kZXguCisKK0lmIHRoZSBpbmRleCBkb2VzIG5vdCBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcworYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKworW1tjcmVhdGVNVlN0bXRdXQorPT09PSBDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXICggSUYgTk9UIEVYSVNUUyApPyBBUyArCitTRUxFQ1QgKCBgKCcgKCBgLCcgKSAqIGApJyB8IGAqJyApICsKK0ZST00gICsKKyggV0hFUkUgKT8gKworUFJJTUFSWSBLRVkgYCgnICggYCwnICkqIGApJyArCisoIFdJVEggKCBBTkQgKSogKT8gKworcC4gKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuLiArCitDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgbW9ua2V5U3BlY2llc19ieV9wb3B1bGF0aW9uIEFTICsKK1NFTEVDVCAqICsKK0ZST00gbW9ua2V5U3BlY2llcyArCitXSEVSRSBwb3B1bGF0aW9uIElTIE5PVCBOVUxMIEFORCBzcGVjaWVzIElTIE5PVCBOVUxMICsKK1BSSU1BUlkgS0VZIChwb3B1bGF0aW9uLCBzcGVjaWVzKSArCitXSVRIIGNvbW1lbnQ9YEFsbG93IHF1ZXJ5IGJ5IHBvcHVsYXRpb24gaW5zdGVhZCBvZiBzcGVjaWVzJzsgKworcC4gKworVGhlIGBDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVdgIHN0YXRlbWVudCBjcmVhdGVzIGEgbmV3IG1hdGVyaWFsaXplZAordmlldy4gRWFjaCBzdWNoIHZpZXcgaXMgYSBzZXQgb2YgX3Jvd3NfIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHJvd3Mgd2hpY2gKK2FyZSBwcmVzZW50IGluIHRoZSB1bmRlcmx5aW5nLCBvciBiYXNlLCB0YWJsZSBzcGVjaWZpZWQgaW4gdGhlIGBTRUxFQ1RgCitzdGF0ZW1lbnQuIEEgbWF0ZXJpYWxpemVkIHZpZXcgY2Fubm90IGJlIGRpcmVjdGx5IHVwZGF0ZWQsIGJ1dCB1cGRhdGVzCit0byB0aGUgYmFzZSB0YWJsZSB3aWxsIGNhdXNlIGNvcnJlc3BvbmRpbmcgdXBkYXRlcyBpbiB0aGUgdmlldy4KKworQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gYWxyZWFkeSBleGlzdGluZyBtYXRlcmlhbGl6ZWQgdmlldyB3aWxsIHJldHVybgorYW4gZXJyb3IgdW5sZXNzIHRoZSBgSUYgTk9UIEVYSVNUU2Agb3B0aW9uIGlzIHVzZWQuIElmIGl0IGlzIHVzZWQsIHRoZQorc3RhdGVtZW50IHdpbGwgYmUgYSBuby1vcCBpZiB0aGUgbWF0ZXJpYWxpemVkIHZpZXcgYWxyZWFkeSBleGlzdHMuCisKK1tbY3JlYXRlTVZXaGVyZV1dCis9PT09PSBgV0hFUkVgIENsYXVzZQorCitUaGUgYDx3aGVyZS1jbGF1c2U+YCBpcyBzaW1pbGFyIHRvIHRoZSBsaW5rOiNzZWxlY3RXaGVyZVt3aGVyZSBjbGF1c2Ugb2YKK2EgYFNFTEVDVGAgc3RhdGVtZW50XSwgd2l0aCBhIGZldyBkaWZmZXJlbmNlcy4gRmlyc3QsIHRoZSB3aGVyZSBjbGF1c2UKK211c3QgY29udGFpbiBhbiBleHByZXNzaW9uIHRoYXQgZGlzYWxsb3dzIGBOVUxMYCB2YWx1ZXMgaW4gY29sdW1ucyBpbgordGhlIHZpZXfigJlzIHByaW1hcnkga2V5LiBJZiBubyBvdGhlciByZXN0cmljdGlvbiBpcyBkZXNpcmVkLCB0aGlzIGNhbiBiZQorYWNjb21wbGlzaGVkIHdpdGggYW4gYElTIE5PVCBOVUxMYCBleHByZXNzaW9uLiBTZWNvbmQsIG9ubHkgY29sdW1ucword2hpY2ggYXJlIGluIHRoZSBiYXNlIHRhYmxl4oCZcyBwcmltYXJ5IGtleSBtYXkgYmUgcmVzdHJpY3RlZCB3aXRoCitleHByZXNzaW9ucyBvdGhlciB0aGFuIGBJUyBOT1QgTlVMTGAuIChOb3RlIHRoYXQgdGhpcyBzZWNvbmQgcmVzdHJpY3Rpb24KK21heSBiZSBsaWZ0ZWQgaW4gdGhlIGZ1dHVyZS4pCisKK1tbYWx0ZXJNVlN0bXRdXQorPT09PSBBTFRFUiBNQVRFUklBTElaRUQgVklFVworCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4gOjo9IEFMVEVSIE1BVEVSSUFMSVpFRCBWSUVXICArCitXSVRIICggQU5EICkqCisKK1RoZSBgQUxURVIgTUFURVJJQUxJWkVEIFZJRVdgIHN0YXRlbWVudCBhbGxvd3Mgb3B0aW9ucyB0byBiZSB1cGRhdGU7Cit0aGVzZSBvcHRpb25zIGFyZSB0aGUgc2FtZSBhcyBgQ1JFQVRFIFRBQkxFYOKAmXMgb3B0aW9ucy4KKworW1tkcm9wTVZTdG10XV0KKz09PT0gRFJPUCBNQVRFUklBTElaRUQgVklFVworCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4gOjo9IERST1AgTUFURVJJQUxJWkVEIFZJRVcgKCBJRiBFWElTVFMgKT8KKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuIERST1AgTUFURVJJQUxJWkVEIFZJRVcgbW9ua2V5U3BlY2llc19ieV9wb3B1bGF0aW9uOworCitUaGUgYERST1AgTUFURVJJQUxJWkVEIFZJRVdgIHN0YXRlbWVudCBpcyB1c2VkIHRvIGRyb3AgYW4gZXhpc3RpbmcKK21hdGVyaWFsaXplZCB2aWV3LgorCitJZiB0aGUgbWF0ZXJpYWxpemVkIHZpZXcgZG9lcyBub3QgZXhpc3RzLCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuCitlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEKK25vLW9wLgorCitbW2NyZWF0ZVR5cGVTdG10XV0KKz09PT0gQ1JFQVRFIFRZUEUKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gQ1JFQVRFIFRZUEUgKCBJRiBOT1QgRVhJU1RTICk/ICArCitgKCcgKCBgLCcgKSogYCknCisKKzo6PSAoIGAuJyApPworCis6Oj0KKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuLiArCitDUkVBVEUgVFlQRSBhZGRyZXNzICggKworc3RyZWV0X25hbWUgdGV4dCwgKworc3RyZWV0X251bWJlciBpbnQsICsKK2NpdHkgdGV4dCwgKworc3RhdGUgdGV4dCwgKworemlwIGludCArCispCisKK0NSRUFURSBUWVBFIHdvcmtfYW5kX2hvbWVfYWRkcmVzc2VzICggKworaG9tZV9hZGRyZXNzIGFkZHJlc3MsICsKK3dvcmtfYWRkcmVzcyBhZGRyZXNzICsKKykgKworcC4gKworVGhlIGBDUkVBVEUgVFlQRWAgc3RhdGVtZW50IGNyZWF0ZXMgYSBuZXcgdXNlci1kZWZpbmVkIHR5cGUuIEVhY2ggdHlwZQoraXMgYSBzZXQgb2YgbmFtZWQsIHR5cGVkIGZpZWxkcy4gRmllbGQgdHlwZXMgbWF5IGJlIGFueSB2YWxpZCB0eXBlLAoraW5jbHVkaW5nIGNvbGxlY3Rpb25zIGFuZCBvdGhlciBleGlzdGluZyB1c2VyLWRlZmluZWQgdHlwZXMuCisKK0F0dGVtcHRpbmcgdG8gY3JlYXRlIGFuIGFscmVhZHkgZXhpc3RpbmcgdHlwZSB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvcgordW5sZXNzIHRoZSBgSUYgTk9UIEVYSVNUU2Agb3B0aW9uIGlzIHVzZWQuIElmIGl0IGlzIHVzZWQsIHRoZSBzdGF0ZW1lbnQKK3dpbGwgYmUgYSBuby1vcCBpZiB0aGUgdHlwZSBhbHJlYWR5IGV4aXN0cy4KKworW1tjcmVhdGVUeXBlTmFtZV1dCis9PT09PSBgPHR5cGVuYW1lPmAKKworVmFsaWQgdHlwZSBuYW1lcyBhcmUgaWRlbnRpZmllcnMuIFRoZSBuYW1lcyBvZiBleGlzdGluZyBDUUwgdHlwZXMgYW5kCitsaW5rOiNhcHBlbmRpeEJbcmVzZXJ2ZWQgdHlwZSBuYW1lc10gbWF5IG5vdCBiZSB1c2VkLgorCitJZiB0aGUgdHlwZSBuYW1lIGlzIHByb3ZpZGVkIGFsb25lLCB0aGUgdHlwZSBpcyBjcmVhdGVkIHdpdGggdGhlIGN1cnJlbnQKK2tleXNwYWNlIChzZWUgYFVTRWApLiBJZiBpdCBpcyBwcmVmaXhlZCBieSBhbiBleGlzdGluZyBrZXlzcGFjZSBuYW1lLAordGhlIHR5cGUgaXMgY3JlYXRlZCB3aXRoaW4gdGhlIHNwZWNpZmllZCBrZXlzcGFjZSBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50CitrZXlzcGFjZS4KKworW1thbHRlclR5cGVTdG10XV0KKz09PT0gQUxURVIgVFlQRQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBBTFRFUiBUWVBFIChJRiBFWElTVFMpPworCis6Oj0gQUREIChJRiBOT1QgRVhJU1RTKT8gICsKK3wgUkVOQU1FIChJRiBFWElTVFMpPyBUTyAoIEFORCBUTyApKiArCitwLiArCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4uICsKK0FMVEVSIFRZUEUgYWRkcmVzcyBBREQgY291bnRyeSB0ZXh0CisKK0FMVEVSIFRZUEUgYWRkcmVzcyBSRU5BTUUgemlwIFRPIHppcGNvZGUgQU5EIHN0cmVldF9uYW1lIFRPIHN0cmVldCArCitwLiArCitUaGUgYEFMVEVSIFRZUEVgIHN0YXRlbWVudCBpcyB1c2VkIHRvIG1hbmlwdWxhdGUgdHlwZSBkZWZpbml0aW9ucy4gSXQKK2FsbG93cyBmb3IgYWRkaW5nIG5ldyBmaWVsZHMsIHJlbmFtaW5nIGV4aXN0aW5nIGZpZWxkcywgb3IgY2hhbmdpbmcgdGhlCit0eXBlIG9mIGV4aXN0aW5nIGZpZWxkcy4gSWYgdGhlIHR5cGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorCitbW2Ryb3BUeXBlU3RtdF1dCis9PT09IERST1AgVFlQRQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBEUk9QIFRZUEUgKCBJRiBFWElTVFMgKT8gICsKK3AuICsKK1RoZSBgRFJPUCBUWVBFYCBzdGF0ZW1lbnQgcmVzdWx0cyBpbiB0aGUgaW1tZWRpYXRlLCBpcnJldmVyc2libGUgcmVtb3ZhbAorb2YgYSB0eXBlLiBBdHRlbXB0aW5nIHRvIGRyb3AgYSB0eXBlIHRoYXQgaXMgc3RpbGwgaW4gdXNlIGJ5IGFub3RoZXIKK3R5cGUgb3IgYSB0YWJsZSB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4KKworSWYgdGhlIHR5cGUgZG9lcyBub3QgZXhpc3QsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgdW5sZXNzIGBJRiBFWElTVFNgCitpcyB1c2VkLCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKworW1tjcmVhdGVUcmlnZ2VyU3RtdF1dCis9PT09IENSRUFURSBUUklHR0VSCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IENSRUFURSBUUklHR0VSICggSUYgTk9UIEVYSVNUUyApPyAoICk/ICsKK09OICArCitVU0lORworCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gKworQ1JFQVRFIFRSSUdHRVIgbXlUcmlnZ2VyIE9OIG15VGFibGUgVVNJTkcKK2BvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmlnZ2Vycy5JbnZlcnRlZEluZGV4JzsKKworVGhlIGFjdHVhbCBsb2dpYyB0aGF0IG1ha2VzIHVwIHRoZSB0cmlnZ2VyIGNhbiBiZSB3cml0dGVuIGluIGFueSBKYXZhCisoSlZNKSBsYW5ndWFnZSBhbmQgZXhpc3RzIG91dHNpZGUgdGhlIGRhdGFiYXNlLiBZb3UgcGxhY2UgdGhlIHRyaWdnZXIKK2NvZGUgaW4gYSBgbGliL3RyaWdnZXJzYCBzdWJkaXJlY3Rvcnkgb2YgdGhlIENhc3NhbmRyYSBpbnN0YWxsYXRpb24KK2RpcmVjdG9yeSwgaXQgbG9hZHMgZHVyaW5nIGNsdXN0ZXIgc3RhcnR1cCwgYW5kIGV4aXN0cyBvbiBldmVyeSBub2RlCit0aGF0IHBhcnRpY2lwYXRlcyBpbiBhIGNsdXN0ZXIuIFRoZSB0cmlnZ2VyIGRlZmluZWQgb24gYSB0YWJsZSBmaXJlcworYmVmb3JlIGEgcmVxdWVzdGVkIERNTCBzdGF0ZW1lbnQgb2NjdXJzLCB3aGljaCBlbnN1cmVzIHRoZSBhdG9taWNpdHkgb2YKK3RoZSB0cmFuc2FjdGlvbi4KKworW1tkcm9wVHJpZ2dlclN0bXRdXQorPT09PSBEUk9QIFRSSUdHRVIKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gRFJPUCBUUklHR0VSICggSUYgRVhJU1RTICk/ICggKT8gKworT04gICsKK3AuICsKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitEUk9QIFRSSUdHRVIgbXlUcmlnZ2VyIE9OIG15VGFibGU7CisKK2BEUk9QIFRSSUdHRVJgIHN0YXRlbWVudCByZW1vdmVzIHRoZSByZWdpc3RyYXRpb24gb2YgYSB0cmlnZ2VyIGNyZWF0ZWQKK3VzaW5nIGBDUkVBVEUgVFJJR0dFUmAuCisKK1tbY3JlYXRlRnVuY3Rpb25TdG10XV0KKz09PT0gQ1JFQVRFIEZVTkNUSU9OCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IENSRUFURSAoIE9SIFJFUExBQ0UgKT8gKworRlVOQ1RJT04gKCBJRiBOT1QgRVhJU1RTICk/ICsKKyggYC4nICk/ICArCitgKCcgKCBgLCcgKSogYCknICsKKyggQ0FMTEVEIHwgUkVUVVJOUyBOVUxMICkgT04gTlVMTCBJTlBVVCArCitSRVRVUk5TICArCitMQU5HVUFHRSAgKworQVMKKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuICsKK0NSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIHNvbWVmdW5jdGlvbiArCisoIHNvbWVhcmcgaW50LCBhbm90aGVyYXJnIHRleHQsIGNvbXBsZXhhcmcgZnJvemVuLCBsaXN0YXJnIGxpc3QgKSArCitSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCArCitSRVRVUk5TIHRleHQgKworTEFOR1VBR0UgamF2YSArCitBUyAkJCArCisvLyBzb21lIEphdmEgY29kZSArCiskJDsgKworQ1JFQVRFIEZVTkNUSU9OIGFrZXlzcGFjZS5mbmFtZSBJRiBOT1QgRVhJU1RTICsKKyggc29tZUFyZyBpbnQgKSArCitDQUxMRUQgT04gTlVMTCBJTlBVVCArCitSRVRVUk5TIHRleHQgKworTEFOR1VBR0UgamF2YSArCitBUyAkJCArCisvLyBzb21lIEphdmEgY29kZSArCiskJDsKKworYENSRUFURSBGVU5DVElPTmAgY3JlYXRlcyBvciByZXBsYWNlcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbi4KKworW1tmdW5jdGlvblNpZ25hdHVyZV1dCis9PT09PSBGdW5jdGlvbiBTaWduYXR1cmUKKworU2lnbmF0dXJlcyBhcmUgdXNlZCB0byBkaXN0aW5ndWlzaCBpbmRpdmlkdWFsIGZ1bmN0aW9ucy4gVGhlIHNpZ25hdHVyZQorY29uc2lzdHMgb2Y6CisKKy4gVGhlIGZ1bGx5IHF1YWxpZmllZCBmdW5jdGlvbiBuYW1lIC0gaS5lIF9rZXlzcGFjZV8gcGx1cworX2Z1bmN0aW9uLW5hbWVfCisuIFRoZSBjb25jYXRlbmF0ZWQgbGlzdCBvZiBhbGwgYXJndW1lbnQgdHlwZXMKKworTm90ZSB0aGF0IGtleXNwYWNlIG5hbWVzLCBmdW5jdGlvbiBuYW1lcyBhbmQgYXJndW1lbnQgdHlwZXMgYXJlIHN1YmplY3QKK3RvIHRoZSBkZWZhdWx0IG5hbWluZyBjb252ZW50aW9ucyBhbmQgY2FzZS1zZW5zaXRpdml0eSBydWxlcy4KKworYENSRUFURSBGVU5DVElPTmAgd2l0aCB0aGUgb3B0aW9uYWwgYE9SIFJFUExBQ0VgIGtleXdvcmRzIGVpdGhlciBjcmVhdGVzCithIGZ1bmN0aW9uIG9yIHJlcGxhY2VzIGFuIGV4aXN0aW5nIG9uZSB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZS4gQQorYENSRUFURSBGVU5DVElPTmAgd2l0aG91dCBgT1IgUkVQTEFDRWAgZmFpbHMgaWYgYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lCitzaWduYXR1cmUgYWxyZWFkeSBleGlzdHMuCisKK0JlaGF2aW9yIG9uIGludm9jYXRpb24gd2l0aCBgbnVsbGAgdmFsdWVzIG11c3QgYmUgZGVmaW5lZCBmb3IgZWFjaAorZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gb3B0aW9uczoKKworLiBgUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVRgIGRlY2xhcmVzIHRoYXQgdGhlIGZ1bmN0aW9uIHdpbGwgYWx3YXlzCityZXR1cm4gYG51bGxgIGlmIGFueSBvZiB0aGUgaW5wdXQgYXJndW1lbnRzIGlzIGBudWxsYC4KKy4gYENBTExFRCBPTiBOVUxMIElOUFVUYCBkZWNsYXJlcyB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGFsd2F5cyBiZQorZXhlY3V0ZWQuCisKK0lmIHRoZSBvcHRpb25hbCBgSUYgTk9UIEVYSVNUU2Aga2V5d29yZHMgYXJlIHVzZWQsIHRoZSBmdW5jdGlvbiB3aWxsCitvbmx5IGJlIGNyZWF0ZWQgaWYgYW5vdGhlciBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBkb2VzIG5vdAorZXhpc3QuCisKK2BPUiBSRVBMQUNFYCBhbmQgYElGIE5PVCBFWElTVGAgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuCisKK0Z1bmN0aW9ucyBiZWxvbmcgdG8gYSBrZXlzcGFjZS4gSWYgbm8ga2V5c3BhY2UgaXMgc3BlY2lmaWVkIGluCitgPGZ1bmN0aW9uLW5hbWU+YCwgdGhlIGN1cnJlbnQga2V5c3BhY2UgaXMgdXNlZCAoaS5lLiB0aGUga2V5c3BhY2UKK3NwZWNpZmllZCB1c2luZyB0aGUgbGluazojdXNlU3RtdFtgVVNFYF0gc3RhdGVtZW50KS4gSXQgaXMgbm90IHBvc3NpYmxlCit0byBjcmVhdGUgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gaW4gb25lIG9mIHRoZSBzeXN0ZW0ga2V5c3BhY2VzLgorCitTZWUgdGhlIHNlY3Rpb24gb24gbGluazojdWRmc1t1c2VyLWRlZmluZWQgZnVuY3Rpb25zXSBmb3IgbW9yZQoraW5mb3JtYXRpb24uCisKK1tbZHJvcEZ1bmN0aW9uU3RtdF1dCis9PT09IERST1AgRlVOQ1RJT04KKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gRFJPUCBGVU5DVElPTiAoIElGIEVYSVNUUyApPyArCisoIGAuJyApPyAgKworKCBgKCcgKCBgLCcgKSogYCknICk/CisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitEUk9QIEZVTkNUSU9OIG15ZnVuY3Rpb247ICsKK0RST1AgRlVOQ1RJT04gbXlrZXlzcGFjZS5hZnVuY3Rpb247ICsKK0RST1AgRlVOQ1RJT04gYWZ1bmN0aW9uICggaW50ICk7ICsKK0RST1AgRlVOQ1RJT04gYWZ1bmN0aW9uICggdGV4dCApOworCitgRFJPUCBGVU5DVElPTmAgc3RhdGVtZW50IHJlbW92ZXMgYSBmdW5jdGlvbiBjcmVhdGVkIHVzaW5nCitgQ1JFQVRFIEZVTkNUSU9OYC4gKworWW91IG11c3Qgc3BlY2lmeSB0aGUgYXJndW1lbnQgdHlwZXMgKGxpbms6I2Z1bmN0aW9uU2lnbmF0dXJlW3NpZ25hdHVyZV0KKykgb2YgdGhlIGZ1bmN0aW9uIHRvIGRyb3AgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lCituYW1lIGJ1dCBhIGRpZmZlcmVudCBzaWduYXR1cmUgKG92ZXJsb2FkZWQgZnVuY3Rpb25zKS4KKworYERST1AgRlVOQ1RJT05gIHdpdGggdGhlIG9wdGlvbmFsIGBJRiBFWElTVFNgIGtleXdvcmRzIGRyb3BzIGEgZnVuY3Rpb24KK2lmIGl0IGV4aXN0cy4KKworW1tjcmVhdGVBZ2dyZWdhdGVTdG10XV0KKz09PT0gQ1JFQVRFIEFHR1JFR0FURQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBDUkVBVEUgKCBPUiBSRVBMQUNFICk/ICsKK0FHR1JFR0FURSAoIElGIE5PVCBFWElTVFMgKT8gKworKCBgLicgKT8gICsKK2AoJyAoIGAsJyApKiBgKScgKworU0ZVTkMgICsKK1NUWVBFICArCisoIEZJTkFMRlVOQyApPyArCisoIElOSVRDT05EICk/ICsKK3AuICsKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitDUkVBVEUgQUdHUkVHQVRFIG15YWdncmVnYXRlICggdmFsIHRleHQgKSArCitTRlVOQyBteWFnZ3JlZ2F0ZV9zdGF0ZSArCitTVFlQRSB0ZXh0ICsKK0ZJTkFMRlVOQyBteWFnZ3JlZ2F0ZV9maW5hbCArCitJTklUQ09ORCBgZm9vJzsKKworU2VlIHRoZSBzZWN0aW9uIG9uIGxpbms6I3VkYXNbdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXNdIGZvciBhIGNvbXBsZXRlCitleGFtcGxlLgorCitgQ1JFQVRFIEFHR1JFR0FURWAgY3JlYXRlcyBvciByZXBsYWNlcyBhIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGUuCisKK2BDUkVBVEUgQUdHUkVHQVRFYCB3aXRoIHRoZSBvcHRpb25hbCBgT1IgUkVQTEFDRWAga2V5d29yZHMgZWl0aGVyCitjcmVhdGVzIGFuIGFnZ3JlZ2F0ZSBvciByZXBsYWNlcyBhbiBleGlzdGluZyBvbmUgd2l0aCB0aGUgc2FtZQorc2lnbmF0dXJlLiBBIGBDUkVBVEUgQUdHUkVHQVRFYCB3aXRob3V0IGBPUiBSRVBMQUNFYCBmYWlscyBpZiBhbgorYWdncmVnYXRlIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFscmVhZHkgZXhpc3RzLgorCitgQ1JFQVRFIEFHR1JFR0FURWAgd2l0aCB0aGUgb3B0aW9uYWwgYElGIE5PVCBFWElTVFNgIGtleXdvcmRzIGVpdGhlcgorY3JlYXRlcyBhbiBhZ2dyZWdhdGUgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KKworYE9SIFJFUExBQ0VgIGFuZCBgSUYgTk9UIEVYSVNUYCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci4KKworQWdncmVnYXRlcyBiZWxvbmcgdG8gYSBrZXlzcGFjZS4gSWYgbm8ga2V5c3BhY2UgaXMgc3BlY2lmaWVkIGluCitgPGFnZ3JlZ2F0ZS1uYW1lPmAsIHRoZSBjdXJyZW50IGtleXNwYWNlIGlzIHVzZWQgKGkuZS4gdGhlIGtleXNwYWNlCitzcGVjaWZpZWQgdXNpbmcgdGhlIGxpbms6I3VzZVN0bXRbYFVTRWBdIHN0YXRlbWVudCkuIEl0IGlzIG5vdCBwb3NzaWJsZQordG8gY3JlYXRlIGEgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSBpbiBvbmUgb2YgdGhlIHN5c3RlbSBrZXlzcGFjZXMuCisKK1NpZ25hdHVyZXMgZm9yIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGVzIGZvbGxvdyB0aGUKK2xpbms6I2Z1bmN0aW9uU2lnbmF0dXJlW3NhbWUgcnVsZXNdIGFzIGZvciB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLgorCitgU1RZUEVgIGRlZmluZXMgdGhlIHR5cGUgb2YgdGhlIHN0YXRlIHZhbHVlIGFuZCBtdXN0IGJlIHNwZWNpZmllZC4KKworVGhlIG9wdGlvbmFsIGBJTklUQ09ORGAgZGVmaW5lcyB0aGUgaW5pdGlhbCBzdGF0ZSB2YWx1ZSBmb3IgdGhlCithZ2dyZWdhdGUuIEl0IGRlZmF1bHRzIHRvIGBudWxsYC4gQSBub24tYG51bGxgIGBJTklUQ09ORGAgbXVzdCBiZQorc3BlY2lmaWVkIGZvciBzdGF0ZSBmdW5jdGlvbnMgdGhhdCBhcmUgZGVjbGFyZWQgd2l0aAorYFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUYC4KKworYFNGVU5DYCByZWZlcmVuY2VzIGFuIGV4aXN0aW5nIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYXMgdGhlIHN0YXRlCittb2RpZnlpbmcgZnVuY3Rpb24uIFRoZSB0eXBlIG9mIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBzdGF0ZSBmdW5jdGlvbgorbXVzdCBtYXRjaCBgU1RZUEVgLiBUaGUgcmVtYWluaW5nIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBzdGF0ZSBmdW5jdGlvbgorbXVzdCBtYXRjaCB0aGUgYXJndW1lbnQgdHlwZXMgb2YgdGhlIGFnZ3JlZ2F0ZSBmdW5jdGlvbi4gU3RhdGUgaXMgbm90Cit1cGRhdGVkIGZvciBzdGF0ZSBmdW5jdGlvbnMgZGVjbGFyZWQgd2l0aCBgUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVRgCithbmQgY2FsbGVkIHdpdGggYG51bGxgLgorCitUaGUgb3B0aW9uYWwgYEZJTkFMRlVOQ2AgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBhZ2dyZWdhdGUgcmVzdWx0IGlzCityZXR1cm5lZC4gSXQgbXVzdCB0YWtlIG9ubHkgb25lIGFyZ3VtZW50IHdpdGggdHlwZSBgU1RZUEVgLiBUaGUgcmV0dXJuCit0eXBlIG9mIHRoZSBgRklOQUxGVU5DYCBtYXkgYmUgYSBkaWZmZXJlbnQgdHlwZS4gQSBmaW5hbCBmdW5jdGlvbgorZGVjbGFyZWQgd2l0aCBgUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVRgIG1lYW5zIHRoYXQgdGhlIGFnZ3JlZ2F0ZeKAmXMKK3JldHVybiB2YWx1ZSB3aWxsIGJlIGBudWxsYCwgaWYgdGhlIGxhc3Qgc3RhdGUgaXMgYG51bGxgLgorCitJZiBubyBgRklOQUxGVU5DYCBpcyBkZWZpbmVkLCB0aGUgb3ZlcmFsbCByZXR1cm4gdHlwZSBvZiB0aGUgYWdncmVnYXRlCitmdW5jdGlvbiBpcyBgU1RZUEVgLiBJZiBhIGBGSU5BTEZVTkNgIGlzIGRlZmluZWQsIGl0IGlzIHRoZSByZXR1cm4gdHlwZQorb2YgdGhhdCBmdW5jdGlvbi4KKworU2VlIHRoZSBzZWN0aW9uIG9uIGxpbms6I3VkYXNbdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXNdIGZvciBtb3JlCitpbmZvcm1hdGlvbi4KKworW1tkcm9wQWdncmVnYXRlU3RtdF1dCis9PT09IERST1AgQUdHUkVHQVRFCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IERST1AgQUdHUkVHQVRFICggSUYgRVhJU1RTICk/ICsKKyggYC4nICk/ICArCisoIGAoJyAoIGAsJyApKiBgKScgKT8gKworcC4KKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuICsKK0RST1AgQUdHUkVHQVRFIG15QWdncmVnYXRlOyArCitEUk9QIEFHR1JFR0FURSBteUtleXNwYWNlLmFuQWdncmVnYXRlOyArCitEUk9QIEFHR1JFR0FURSBzb21lQWdncmVnYXRlICggaW50ICk7ICsKK0RST1AgQUdHUkVHQVRFIHNvbWVBZ2dyZWdhdGUgKCB0ZXh0ICk7CisKK1RoZSBgRFJPUCBBR0dSRUdBVEVgIHN0YXRlbWVudCByZW1vdmVzIGFuIGFnZ3JlZ2F0ZSBjcmVhdGVkIHVzaW5nCitgQ1JFQVRFIEFHR1JFR0FURWAuIFlvdSBtdXN0IHNwZWNpZnkgdGhlIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBhZ2dyZWdhdGUKK3RvIGRyb3AgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGFnZ3JlZ2F0ZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBhCitkaWZmZXJlbnQgc2lnbmF0dXJlIChvdmVybG9hZGVkIGFnZ3JlZ2F0ZXMpLgorCitgRFJPUCBBR0dSRUdBVEVgIHdpdGggdGhlIG9wdGlvbmFsIGBJRiBFWElTVFNgIGtleXdvcmRzIGRyb3BzIGFuCithZ2dyZWdhdGUgaWYgaXQgZXhpc3RzLCBhbmQgZG9lcyBub3RoaW5nIGlmIGEgZnVuY3Rpb24gd2l0aCB0aGUKK3NpZ25hdHVyZSBkb2VzIG5vdCBleGlzdC4KKworU2lnbmF0dXJlcyBmb3IgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgZm9sbG93IHRoZQorbGluazojZnVuY3Rpb25TaWduYXR1cmVbc2FtZSBydWxlc10gYXMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuCisKK1tbZGF0YU1hbmlwdWxhdGlvbl1dCis9PT0gRGF0YSBNYW5pcHVsYXRpb24KKworW1tpbnNlcnRTdG10XV0KKz09PT0gSU5TRVJUCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IElOU0VSVCBJTlRPICArCisoICggVkFMVUVTICkgKworfCAoIEpTT04gKSkgKworKCBJRiBOT1QgRVhJU1RTICk/ICsKKyggVVNJTkcgKCBBTkQgKSogKT8KKworOjo9IGAoJyAoIGAsJyApKiBgKScKKworOjo9IGAoJyAoIGAsJyApKiBgKScKKworOjo9IFRJTUVTVEFNUCAgKworfCBUVEwgICsKK3AuICsKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLi4gKworSU5TRVJUIElOVE8gTmVyZE1vdmllcyAobW92aWUsIGRpcmVjdG9yLCBtYWluX2FjdG9yLCB5ZWFyKSArCitWQUxVRVMgKGBTZXJlbml0eScsIGBKb3NzIFdoZWRvbicsIGBOYXRoYW4gRmlsbGlvbicsIDIwMDUpICsKK1VTSU5HIFRUTCA4NjQwMDsKKworSU5TRVJUIElOVE8gTmVyZE1vdmllcyBKU09OIGBce2BgbW92aWUnJzogYGBTZXJlbml0eScnLCBgYGRpcmVjdG9yJyc6CitgYEpvc3MgV2hlZG9uJycsIGBgeWVhcicnOiAyMDA1fScgKworcC4gKworVGhlIGBJTlNFUlRgIHN0YXRlbWVudCB3cml0ZXMgb25lIG9yIG1vcmUgY29sdW1ucyBmb3IgYSBnaXZlbiByb3cgaW4gYQordGFibGUuIE5vdGUgdGhhdCBzaW5jZSBhIHJvdyBpcyBpZGVudGlmaWVkIGJ5IGl0cyBgUFJJTUFSWSBLRVlgLCBhdAorbGVhc3QgdGhlIGNvbHVtbnMgY29tcG9zaW5nIGl0IG11c3QgYmUgc3BlY2lmaWVkLiBUaGUgbGlzdCBvZiBjb2x1bW5zIHRvCitpbnNlcnQgdG8gbXVzdCBiZSBzdXBwbGllZCB3aGVuIHVzaW5nIHRoZSBgVkFMVUVTYCBzeW50YXguIFdoZW4gdXNpbmcKK3RoZSBgSlNPTmAgc3ludGF4LCB0aGV5IGFyZSBvcHRpb25hbC4gU2VlIHRoZSBzZWN0aW9uIG9uCitsaW5rOiNpbnNlcnRKc29uW2BJTlNFUlQgSlNPTmBdIGZvciBtb3JlIGRldGFpbHMuCisKK05vdGUgdGhhdCB1bmxpa2UgaW4gU1FMLCBgSU5TRVJUYCBkb2VzIG5vdCBjaGVjayB0aGUgcHJpb3IgZXhpc3RlbmNlIG9mCit0aGUgcm93IGJ5IGRlZmF1bHQ6IHRoZSByb3cgaXMgY3JlYXRlZCBpZiBub25lIGV4aXN0ZWQgYmVmb3JlLCBhbmQKK3VwZGF0ZWQgb3RoZXJ3aXNlLiBGdXJ0aGVybW9yZSwgdGhlcmUgaXMgbm8gbWVhbiB0byBrbm93IHdoaWNoIG9mCitjcmVhdGlvbiBvciB1cGRhdGUgaGFwcGVuZWQuCisKK0l0IGlzIGhvd2V2ZXIgcG9zc2libGUgdG8gdXNlIHRoZSBgSUYgTk9UIEVYSVNUU2AgY29uZGl0aW9uIHRvIG9ubHkKK2luc2VydCBpZiB0aGUgcm93IGRvZXMgbm90IGV4aXN0IHByaW9yIHRvIHRoZSBpbnNlcnRpb24uIEJ1dCBwbGVhc2Ugbm90ZQordGhhdCB1c2luZyBgSUYgTk9UIEVYSVNUU2Agd2lsbCBpbmN1ciBhIG5vbiBuZWdsaWdpYmxlIHBlcmZvcm1hbmNlIGNvc3QKKyhpbnRlcm5hbGx5LCBQYXhvcyB3aWxsIGJlIHVzZWQpIHNvIHRoaXMgc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5LgorCitBbGwgdXBkYXRlcyBmb3IgYW4gYElOU0VSVGAgYXJlIGFwcGxpZWQgYXRvbWljYWxseSBhbmQgaW4gaXNvbGF0aW9uLgorCitQbGVhc2UgcmVmZXIgdG8gdGhlIGxpbms6I3VwZGF0ZU9wdGlvbnNbYFVQREFURWBdIHNlY3Rpb24gZm9yCitpbmZvcm1hdGlvbiBvbiB0aGUgYDxvcHRpb24+YCBhdmFpbGFibGUgYW5kIHRvIHRoZQorbGluazojY29sbGVjdGlvbnNbY29sbGVjdGlvbnNdIHNlY3Rpb24gZm9yIHVzZSBvZgorYDxjb2xsZWN0aW9uLWxpdGVyYWw+YC4gQWxzbyBub3RlIHRoYXQgYElOU0VSVGAgZG9lcyBub3Qgc3VwcG9ydAorY291bnRlcnMsIHdoaWxlIGBVUERBVEVgIGRvZXMuCisKK1tbdXBkYXRlU3RtdF1dCis9PT09IFVQREFURQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBVUERBVEUgICsKKyggVVNJTkcgKCBBTkQgKSogKT8gKworU0VUICggYCwnICkqICsKK1dIRVJFICArCisoIElGICggQU5EIGNvbmRpdGlvbiApKiApPworCis6Oj0gYD0nICArCit8IGA9JyAoYCsnIHwgYC0nKSAoIHwgfCApICsKK3wgYD0nIGArJyAgKworfCBgWycgYF0nIGA9JyAgKworfCBgLicgYD0nCisKKzo6PSAgKworfCBDT05UQUlOUyAoS0VZKT8gKworfCBJTiAgKworfCBgWycgYF0nICArCit8IGBbJyBgXScgSU4gICsKK3wgYC4nICArCit8IGAuJyBJTgorCis6Oj0gYDwnIHwgYDw9JyB8IGA9JyB8IGAhPScgfCBgPj0nIHwgYD4nICsKKzo6PSAoIHwgYCgnICggKCBgLCcgKSogKT8gYCknKQorCis6Oj0gKCBBTkQgKSoKKworOjo9IGA9JyAgKworfCBgKCcgKGAsJyApKiBgKScgYD0nICArCit8IElOIGAoJyAoICggYCwnICkqICk/IGApJyArCit8IElOICArCit8IGAoJyAoYCwnICkqIGApJyBJTiBgKCcgKCAoIGAsJyApKiApPyBgKScgKworfCBgKCcgKGAsJyApKiBgKScgSU4KKworOjo9IFRJTUVTVEFNUCAgKworfCBUVEwgICsKK3AuICsKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLi4gKworVVBEQVRFIE5lcmRNb3ZpZXMgVVNJTkcgVFRMIDQwMCArCitTRVQgZGlyZWN0b3IgPSBgSm9zcyBXaGVkb24nLCArCittYWluX2FjdG9yID0gYE5hdGhhbiBGaWxsaW9uJywgKworeWVhciA9IDIwMDUgKworV0hFUkUgbW92aWUgPSBgU2VyZW5pdHknOworCitVUERBVEUgVXNlckFjdGlvbnMgU0VUIHRvdGFsID0gdG90YWwgKyAyIFdIRVJFIHVzZXIgPQorQjcwREUxRDAtOTkwOC00QUUzLUJFMzQtNTU3M0U1QjA5RjE0IEFORCBhY3Rpb24gPSBgY2xpY2snOyArCitwLiArCitUaGUgYFVQREFURWAgc3RhdGVtZW50IHdyaXRlcyBvbmUgb3IgbW9yZSBjb2x1bW5zIGZvciBhIGdpdmVuIHJvdyBpbiBhCit0YWJsZS4gVGhlIGA8d2hlcmUtY2xhdXNlPmAgaXMgdXNlZCB0byBzZWxlY3QgdGhlIHJvdyB0byB1cGRhdGUgYW5kIG11c3QKK2luY2x1ZGUgYWxsIGNvbHVtbnMgY29tcG9zaW5nIHRoZSBgUFJJTUFSWSBLRVlgLiBPdGhlciBjb2x1bW5zIHZhbHVlcworYXJlIHNwZWNpZmllZCB0aHJvdWdoIGA8YXNzaWdubWVudD5gIGFmdGVyIHRoZSBgU0VUYCBrZXl3b3JkLgorCitOb3RlIHRoYXQgdW5saWtlIGluIFNRTCwgYFVQREFURWAgZG9lcyBub3QgY2hlY2sgdGhlIHByaW9yIGV4aXN0ZW5jZSBvZgordGhlIHJvdyBieSBkZWZhdWx0IChleGNlcHQgdGhyb3VnaCB0aGUgdXNlIG9mIGA8Y29uZGl0aW9uPmAsIHNlZSBiZWxvdyk6Cit0aGUgcm93IGlzIGNyZWF0ZWQgaWYgbm9uZSBleGlzdGVkIGJlZm9yZSwgYW5kIHVwZGF0ZWQgb3RoZXJ3aXNlLgorRnVydGhlcm1vcmUsIHRoZXJlIGFyZSBubyBtZWFucyB0byBrbm93IHdoZXRoZXIgYSBjcmVhdGlvbiBvciB1cGRhdGUKK29jY3VycmVkLgorCitJdCBpcyBob3dldmVyIHBvc3NpYmxlIHRvIHVzZSB0aGUgY29uZGl0aW9ucyBvbiBzb21lIGNvbHVtbnMgdGhyb3VnaAorYElGYCwgaW4gd2hpY2ggY2FzZSB0aGUgcm93IHdpbGwgbm90IGJlIHVwZGF0ZWQgdW5sZXNzIHRoZSBjb25kaXRpb25zCithcmUgbWV0LiBCdXQsIHBsZWFzZSBub3RlIHRoYXQgdXNpbmcgYElGYCBjb25kaXRpb25zIHdpbGwgaW5jdXIgYQorbm9uLW5lZ2xpZ2libGUgcGVyZm9ybWFuY2UgY29zdCAoaW50ZXJuYWxseSwgUGF4b3Mgd2lsbCBiZSB1c2VkKSBzbyB0aGlzCitzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkuCisKK0luIGFuIGBVUERBVEVgIHN0YXRlbWVudCwgYWxsIHVwZGF0ZXMgd2l0aGluIHRoZSBzYW1lIHBhcnRpdGlvbiBrZXkgYXJlCithcHBsaWVkIGF0b21pY2FsbHkgYW5kIGluIGlzb2xhdGlvbi4KKworVGhlIGBjID0gYyArIDNgIGZvcm0gb2YgYDxhc3NpZ25tZW50PmAgaXMgdXNlZCB0byBpbmNyZW1lbnQvZGVjcmVtZW50Citjb3VudGVycy4gVGhlIGlkZW50aWZpZXIgYWZ0ZXIgdGhlIGA9JyBzaWduICptdXN0KiBiZSB0aGUgc2FtZSB0aGFuIHRoZQorb25lIGJlZm9yZSB0aGUgYD0nIHNpZ24gKE9ubHkgaW5jcmVtZW50L2RlY3JlbWVudCBpcyBzdXBwb3J0ZWQgb24KK2NvdW50ZXJzLCBub3QgdGhlIGFzc2lnbm1lbnQgb2YgYSBzcGVjaWZpYyB2YWx1ZSkuCisKK1RoZSBgaWQgPSBpZCArIDxjb2xsZWN0aW9uLWxpdGVyYWw+YCBhbmQgYGlkW3ZhbHVlMV0gPSB2YWx1ZTJgIGZvcm1zIG9mCitgPGFzc2lnbm1lbnQ+YCBhcmUgZm9yIGNvbGxlY3Rpb25zLiBQbGVhc2UgcmVmZXIgdG8gdGhlCitsaW5rOiNjb2xsZWN0aW9uc1tyZWxldmFudCBzZWN0aW9uXSBmb3IgbW9yZSBkZXRhaWxzLgorCitUaGUgYGlkLmZpZWxkID0gPHRlcm0+YCBmb3JtIG9mIGA8YXNzaWduZW10PmAgaXMgZm9yIHNldHRpbmcgdGhlIHZhbHVlCitvZiBhIHNpbmdsZSBmaWVsZCBvbiBhIG5vbi1mcm96ZW4gdXNlci1kZWZpbmVkIHR5cGVzLgorCitbW3VwZGF0ZU9wdGlvbnNdXQorPT09PT0gYDxvcHRpb25zPmAKKworVGhlIGBVUERBVEVgIGFuZCBgSU5TRVJUYCBzdGF0ZW1lbnRzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCisqIGBUSU1FU1RBTVBgOiBzZXRzIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBvcGVyYXRpb24uIElmIG5vdCBzcGVjaWZpZWQsCit0aGUgY29vcmRpbmF0b3Igd2lsbCB1c2UgdGhlIGN1cnJlbnQgdGltZSAoaW4gbWljcm9zZWNvbmRzKSBhdCB0aGUgc3RhcnQKK29mIHN0YXRlbWVudCBleGVjdXRpb24gYXMgdGhlIHRpbWVzdGFtcC4gVGhpcyBpcyB1c3VhbGx5IGEgc3VpdGFibGUKK2RlZmF1bHQuCisqIGBUVExgOiBzcGVjaWZpZXMgYW4gb3B0aW9uYWwgVGltZSBUbyBMaXZlIChpbiBzZWNvbmRzKSBmb3IgdGhlCitpbnNlcnRlZCB2YWx1ZXMuIElmIHNldCwgdGhlIGluc2VydGVkIHZhbHVlcyBhcmUgYXV0b21hdGljYWxseSByZW1vdmVkCitmcm9tIHRoZSBkYXRhYmFzZSBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWUuIE5vdGUgdGhhdCB0aGUgVFRMIGNvbmNlcm5zCit0aGUgaW5zZXJ0ZWQgdmFsdWVzLCBub3QgdGhlIGNvbHVtbnMgdGhlbXNlbHZlcy4gVGhpcyBtZWFucyB0aGF0IGFueQorc3Vic2VxdWVudCB1cGRhdGUgb2YgdGhlIGNvbHVtbiB3aWxsIGFsc28gcmVzZXQgdGhlIFRUTCAodG8gd2hhdGV2ZXIgVFRMCitpcyBzcGVjaWZpZWQgaW4gdGhhdCB1cGRhdGUpLiBCeSBkZWZhdWx0LCB2YWx1ZXMgbmV2ZXIgZXhwaXJlLiBBIFRUTCBvZgorMCBpcyBlcXVpdmFsZW50IHRvIG5vIFRUTC4gSWYgdGhlIHRhYmxlIGhhcyBhIGRlZmF1bHRfdGltZV90b19saXZlLCBhCitUVEwgb2YgMCB3aWxsIHJlbW92ZSB0aGUgVFRMIGZvciB0aGUgaW5zZXJ0ZWQgb3IgdXBkYXRlZCB2YWx1ZXMuCisKK1tbZGVsZXRlU3RtdF1dCis9PT09IERFTEVURQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBERUxFVEUgKCAoIGAsJyApKiApPyArCitGUk9NICArCisoIFVTSU5HIFRJTUVTVEFNUCApPyArCitXSEVSRSAgKworKCBJRiAoIEVYSVNUUyB8ICggKCBBTkQgKSopICkgKT8KKworOjo9ICArCit8IGBbJyBgXScgKworfCBgLicKKworOjo9ICggQU5EICkqCisKKzo6PSAgKworfCBgKCcgKGAsJyApKiBgKScgICsKK3wgSU4gYCgnICggKCBgLCcgKSogKT8gYCknICsKK3wgSU4gICsKK3wgYCgnIChgLCcgKSogYCknIElOIGAoJyAoICggYCwnICkqICk/IGApJyArCit8IGAoJyAoYCwnICkqIGApJyBJTgorCis6Oj0gYD0nIHwgYDwnIHwgYD4nIHwgYDw9JyB8IGA+PScgKworOjo9ICggfCBgKCcgKCAoIGAsJyApKiApPyBgKScpCisKKzo6PSAoIHwgYCE9JykgICsKK3wgQ09OVEFJTlMgKEtFWSk/ICsKK3wgSU4gICsKK3wgYFsnIGBdJyAoIHwgYCE9JykgICsKK3wgYFsnIGBdJyBJTiAgKworfCBgLicgKCB8IGAhPScpICArCit8IGAuJyBJTgorCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4uICsKK0RFTEVURSBGUk9NIE5lcmRNb3ZpZXMgVVNJTkcgVElNRVNUQU1QIDEyNDAwMDMxMzQgV0hFUkUgbW92aWUgPQorYFNlcmVuaXR5JzsKKworREVMRVRFIHBob25lIEZST00gVXNlcnMgV0hFUkUgdXNlcmlkIElOCisoQzczREUxRDMtQUYwOC00MEYzLUIxMjQtM0ZGM0U1MTA5RjIyLAorQjcwREUxRDAtOTkwOC00QUUzLUJFMzQtNTU3M0U1QjA5RjE0KTsgKworcC4gKworVGhlIGBERUxFVEVgIHN0YXRlbWVudCBkZWxldGVzIGNvbHVtbnMgYW5kIHJvd3MuIElmIGNvbHVtbiBuYW1lcyBhcmUKK3Byb3ZpZGVkIGRpcmVjdGx5IGFmdGVyIHRoZSBgREVMRVRFYCBrZXl3b3JkLCBvbmx5IHRob3NlIGNvbHVtbnMgYXJlCitkZWxldGVkIGZyb20gdGhlIHJvdyBpbmRpY2F0ZWQgYnkgdGhlIGA8d2hlcmUtY2xhdXNlPmAuIFRoZSBgaWRbdmFsdWVdYAorc3ludGF4IGluIGA8c2VsZWN0aW9uPmAgaXMgZm9yIG5vbi1mcm96ZW4gY29sbGVjdGlvbnMgKHBsZWFzZSByZWZlciB0bwordGhlIGxpbms6I2NvbGxlY3Rpb25zW2NvbGxlY3Rpb24gc2VjdGlvbl0gZm9yIG1vcmUgZGV0YWlscykuIFRoZQorYGlkLmZpZWxkYCBzeW50YXggaXMgZm9yIHRoZSBkZWxldGlvbiBvZiBub24tZnJvemVuIHVzZXItZGVmaW5lZCB0eXBlcy4KK090aGVyd2lzZSwgd2hvbGUgcm93cyBhcmUgcmVtb3ZlZC4gVGhlIGA8d2hlcmUtY2xhdXNlPmAgc3BlY2lmaWVzIHdoaWNoCityb3dzIGFyZSB0byBiZSBkZWxldGVkLiBNdWx0aXBsZSByb3dzIG1heSBiZSBkZWxldGVkIHdpdGggb25lIHN0YXRlbWVudAorYnkgdXNpbmcgYW4gYElOYCBjbGF1c2UuIEEgcmFuZ2Ugb2Ygcm93cyBtYXkgYmUgZGVsZXRlZCB1c2luZyBhbgoraW5lcXVhbGl0eSBvcGVyYXRvciAoc3VjaCBhcyBgPj1gKS4KKworYERFTEVURWAgc3VwcG9ydHMgdGhlIGBUSU1FU1RBTVBgIG9wdGlvbiB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUKK2xpbms6I3VwZGF0ZVN0bXRbYFVQREFURWBdIHN0YXRlbWVudC4KKworSW4gYSBgREVMRVRFYCBzdGF0ZW1lbnQsIGFsbCBkZWxldGlvbnMgd2l0aGluIHRoZSBzYW1lIHBhcnRpdGlvbiBrZXkgYXJlCithcHBsaWVkIGF0b21pY2FsbHkgYW5kIGluIGlzb2xhdGlvbi4KKworQSBgREVMRVRFYCBvcGVyYXRpb24gY2FuIGJlIGNvbmRpdGlvbmFsIHRocm91Z2ggdGhlIHVzZSBvZiBhbiBgSUZgCitjbGF1c2UsIHNpbWlsYXIgdG8gYFVQREFURWAgYW5kIGBJTlNFUlRgIHN0YXRlbWVudHMuIEhvd2V2ZXIsIGFzIHdpdGgKK2BJTlNFUlRgIGFuZCBgVVBEQVRFYCBzdGF0ZW1lbnRzLCB0aGlzIHdpbGwgaW5jdXIgYSBub24tbmVnbGlnaWJsZQorcGVyZm9ybWFuY2UgY29zdCAoaW50ZXJuYWxseSwgUGF4b3Mgd2lsbCBiZSB1c2VkKSBhbmQgc28gc2hvdWxkIGJlIHVzZWQKK3NwYXJpbmdseS4KKworW1tiYXRjaFN0bXRdXQorPT09PSBCQVRDSAorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBCRUdJTiAoIFVOTE9HR0VEIHwgQ09VTlRFUiApIEJBVENIICsKKyggVVNJTkcgKCBBTkQgKSogKT8gKworKCBgOycgKSogKworQVBQTFkgQkFUQ0gKKworOjo9ICArCit8ICArCit8CisKKzo6PSBUSU1FU1RBTVAgICsKK3AuICsKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitCRUdJTiBCQVRDSCArCitJTlNFUlQgSU5UTyB1c2VycyAodXNlcmlkLCBwYXNzd29yZCwgbmFtZSkgVkFMVUVTIChgdXNlcjInLCBgY2hAbmdlbTNiJywKK2BzZWNvbmQgdXNlcicpOyArCitVUERBVEUgdXNlcnMgU0VUIHBhc3N3b3JkID0gYHBzMjJkaGRzJyBXSEVSRSB1c2VyaWQgPSBgdXNlcjMnOyArCitJTlNFUlQgSU5UTyB1c2VycyAodXNlcmlkLCBwYXNzd29yZCkgVkFMVUVTIChgdXNlcjQnLCBgY2hAbmdlbTNjJyk7ICsKK0RFTEVURSBuYW1lIEZST00gdXNlcnMgV0hFUkUgdXNlcmlkID0gYHVzZXIxJzsgKworQVBQTFkgQkFUQ0g7CisKK1RoZSBgQkFUQ0hgIHN0YXRlbWVudCBncm91cCBtdWx0aXBsZSBtb2RpZmljYXRpb24gc3RhdGVtZW50cworKGluc2VydGlvbnMvdXBkYXRlcyBhbmQgZGVsZXRpb25zKSBpbnRvIGEgc2luZ2xlIHN0YXRlbWVudC4gSXQgc2VydmVzCitzZXZlcmFsIHB1cnBvc2VzOgorCisuIEl0IHNhdmVzIG5ldHdvcmsgcm91bmQtdHJpcHMgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCB0aGUgc2VydmVyIChhbmQKK3NvbWV0aW1lcyBiZXR3ZWVuIHRoZSBzZXJ2ZXIgY29vcmRpbmF0b3IgYW5kIHRoZSByZXBsaWNhcykgd2hlbiBiYXRjaGluZworbXVsdGlwbGUgdXBkYXRlcy4KKy4gQWxsIHVwZGF0ZXMgaW4gYSBgQkFUQ0hgIGJlbG9uZ2luZyB0byBhIGdpdmVuIHBhcnRpdGlvbiBrZXkgYXJlCitwZXJmb3JtZWQgaW4gaXNvbGF0aW9uLgorLiBCeSBkZWZhdWx0LCBhbGwgb3BlcmF0aW9ucyBpbiB0aGUgYmF0Y2ggYXJlIHBlcmZvcm1lZCBhcyBgTE9HR0VEYCwgdG8KK2Vuc3VyZSBhbGwgbXV0YXRpb25zIGV2ZW50dWFsbHkgY29tcGxldGUgKG9yIG5vbmUgd2lsbCkuIFNlZSB0aGUgbm90ZXMKK29uIGxpbms6I3VubG9nZ2VkQmF0Y2hbYFVOTE9HR0VEYF0gZm9yIG1vcmUgZGV0YWlscy4KKworTm90ZSB0aGF0OgorCisqIGBCQVRDSGAgc3RhdGVtZW50cyBtYXkgb25seSBjb250YWluIGBVUERBVEVgLCBgSU5TRVJUYCBhbmQgYERFTEVURWAKK3N0YXRlbWVudHMuCisqIEJhdGNoZXMgYXJlIF9ub3RfIGEgZnVsbCBhbmFsb2d1ZSBmb3IgU1FMIHRyYW5zYWN0aW9ucy4KKyogSWYgYSB0aW1lc3RhbXAgaXMgbm90IHNwZWNpZmllZCBmb3IgZWFjaCBvcGVyYXRpb24sIHRoZW4gYWxsCitvcGVyYXRpb25zIHdpbGwgYmUgYXBwbGllZCB3aXRoIHRoZSBzYW1lIHRpbWVzdGFtcC4gRHVlIHRvIENhc3NhbmRyYeKAmXMKK2NvbmZsaWN0IHJlc29sdXRpb24gcHJvY2VkdXJlIGluIHRoZSBjYXNlIG9mCitodHRwOi8vd2lraS5hcGFjaGUub3JnL2Nhc3NhbmRyYS9GQVEjY2xvY2t0aWVbdGltZXN0YW1wIHRpZXNdLAorb3BlcmF0aW9ucyBtYXkgYmUgYXBwbGllZCBpbiBhbiBvcmRlciB0aGF0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRlcgordGhleSBhcmUgbGlzdGVkIGluIHRoZSBgQkFUQ0hgIHN0YXRlbWVudC4gVG8gZm9yY2UgYSBwYXJ0aWN1bGFyCitvcGVyYXRpb24gb3JkZXJpbmcsIHlvdSBtdXN0IHNwZWNpZnkgcGVyLW9wZXJhdGlvbiB0aW1lc3RhbXBzLgorCitbW3VubG9nZ2VkQmF0Y2hdXQorPT09PT0gYFVOTE9HR0VEYAorCitCeSBkZWZhdWx0LCBDYXNzYW5kcmEgdXNlcyBhIGJhdGNoIGxvZyB0byBlbnN1cmUgYWxsIG9wZXJhdGlvbnMgaW4gYQorYmF0Y2ggZXZlbnR1YWxseSBjb21wbGV0ZSBvciBub25lIHdpbGwgKG5vdGUgaG93ZXZlciB0aGF0IG9wZXJhdGlvbnMgYXJlCitvbmx5IGlzb2xhdGVkIHdpdGhpbiBhIHNpbmdsZSBwYXJ0aXRpb24pLgorCitUaGVyZSBpcyBhIHBlcmZvcm1hbmNlIHBlbmFsdHkgZm9yIGJhdGNoIGF0b21pY2l0eSB3aGVuIGEgYmF0Y2ggc3BhbnMKK211bHRpcGxlIHBhcnRpdGlvbnMuIElmIHlvdSBkbyBub3Qgd2FudCB0byBpbmN1ciB0aGlzIHBlbmFsdHksIHlvdSBjYW4KK3RlbGwgQ2Fzc2FuZHJhIHRvIHNraXAgdGhlIGJhdGNobG9nIHdpdGggdGhlIGBVTkxPR0dFRGAgb3B0aW9uLiBJZiB0aGUKK2BVTkxPR0dFRGAgb3B0aW9uIGlzIHVzZWQsIGEgZmFpbGVkIGJhdGNoIG1pZ2h0IGxlYXZlIHRoZSBwYXRjaCBvbmx5CitwYXJ0bHkgYXBwbGllZC4KKworW1tjb3VudGVyQmF0Y2hdXQorPT09PT0gYENPVU5URVJgCisKK1VzZSB0aGUgYENPVU5URVJgIG9wdGlvbiBmb3IgYmF0Y2hlZCBjb3VudGVyIHVwZGF0ZXMuIFVubGlrZSBvdGhlcgordXBkYXRlcyBpbiBDYXNzYW5kcmEsIGNvdW50ZXIgdXBkYXRlcyBhcmUgbm90IGlkZW1wb3RlbnQuCisKK1tbYmF0Y2hPcHRpb25zXV0KKz09PT09IGA8b3B0aW9uPmAKKworYEJBVENIYCBzdXBwb3J0cyBib3RoIHRoZSBgVElNRVNUQU1QYCBvcHRpb24sIHdpdGggc2ltaWxhciBzZW1hbnRpYyB0bwordGhlIG9uZSBkZXNjcmliZWQgaW4gdGhlIGxpbms6I3VwZGF0ZU9wdGlvbnNbYFVQREFURWBdIHN0YXRlbWVudCAodGhlCit0aW1lc3RhbXAgYXBwbGllcyB0byBhbGwgdGhlIHN0YXRlbWVudCBpbnNpZGUgdGhlIGJhdGNoKS4gSG93ZXZlciwgaWYKK3VzZWQsIGBUSU1FU1RBTVBgICptdXN0IG5vdCogYmUgdXNlZCBpbiB0aGUgc3RhdGVtZW50cyB3aXRoaW4gdGhlIGJhdGNoLgorCis9PT0gUXVlcmllcworCitbW3NlbGVjdFN0bXRdXQorPT09PSBTRUxFQ1QKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gU0VMRUNUICggSlNPTiApPyAgKworRlJPTSAgKworKCBXSEVSRSApPyArCisoIEdST1VQIEJZICk/ICsKKyggT1JERVIgQlkgKT8gKworKCBQRVIgUEFSVElUSU9OIExJTUlUICk/ICsKKyggTElNSVQgKT8gKworKCBBTExPVyBGSUxURVJJTkcgKT8KKworOjo9IERJU1RJTkNUPworCis6Oj0gKEFTICk/ICggYCwnIChBUyApPyApKiArCit8IGAqJworCis6Oj0gICsKK3wgICsKK3wgV1JJVEVUSU1FIGAoJyBgKScgKworfCBNQVhXUklURVRJTUUgYCgnIGApJyArCit8IENPVU5UIGAoJyBgKicgYCknICsKK3wgVFRMIGAoJyBgKScgKworfCBDQVNUIGAoJyBBUyBgKScgKworfCBgKCcgKCAoYCwnICkqKT8gYCknICsKK3wgYC4nICArCit8IGBbJyBgXScgKworfCBgWycgPyAuLiA/IGBdJworCis6Oj0gKCBBTkQgKSoKKworOjo9ICArCit8IGAoJyAoYCwnICkqIGApJyAgKworfCBJTiBgKCcgKCAoIGAsJyApKiApPyBgKScgKworfCBgKCcgKGAsJyApKiBgKScgSU4gYCgnICggKCBgLCcgKSogKT8gYCknICsKK3wgVE9LRU4gYCgnICggYCwnICkqIGApJworCis6Oj0gYD0nIHwgYDwnIHwgYD4nIHwgYDw9JyB8IGA+PScgfCBDT05UQUlOUyB8IENPTlRBSU5TIEtFWSArCis6Oj0gKGAsJyApKiArCis6Oj0gKCBgLCcgKSogKworOjo9ICggQVNDIHwgREVTQyApPyArCis6Oj0gYCgnIChgLCcgKSogYCknICsKK3AuICsKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLi4gKworU0VMRUNUIG5hbWUsIG9jY3VwYXRpb24gRlJPTSB1c2VycyBXSEVSRSB1c2VyaWQgSU4gKDE5OSwgMjAwLCAyMDcpOworCitTRUxFQ1QgSlNPTiBuYW1lLCBvY2N1cGF0aW9uIEZST00gdXNlcnMgV0hFUkUgdXNlcmlkID0gMTk5OworCitTRUxFQ1QgbmFtZSBBUyB1c2VyX25hbWUsIG9jY3VwYXRpb24gQVMgdXNlcl9vY2N1cGF0aW9uIEZST00gdXNlcnM7CisKK1NFTEVDVCB0aW1lLCB2YWx1ZSArCitGUk9NIGV2ZW50cyArCitXSEVSRSBldmVudF90eXBlID0gYG15RXZlbnQnICsKK0FORCB0aW1lID4gYDIwMTEtMDItMDMnICsKK0FORCB0aW1lIDw9IGAyMDEyLTAxLTAxJworCitTRUxFQ1QgQ09VTlQgKCopIEZST00gdXNlcnM7CisKK1NFTEVDVCBDT1VOVCAoKikgQVMgdXNlcl9jb3VudCBGUk9NIHVzZXJzOworCitUaGUgYFNFTEVDVGAgc3RhdGVtZW50cyByZWFkcyBvbmUgb3IgbW9yZSBjb2x1bW5zIGZvciBvbmUgb3IgbW9yZSByb3dzCitpbiBhIHRhYmxlLiBJdCByZXR1cm5zIGEgcmVzdWx0LXNldCBvZiByb3dzLCB3aGVyZSBlYWNoIHJvdyBjb250YWlucyB0aGUKK2NvbGxlY3Rpb24gb2YgY29sdW1ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBxdWVyeS4gSWYgdGhlIGBKU09OYCBrZXl3b3JkCitpcyB1c2VkLCB0aGUgcmVzdWx0cyBmb3IgZWFjaCByb3cgd2lsbCBjb250YWluIG9ubHkgYSBzaW5nbGUgY29sdW1uCituYW1lZCBgYGpzb24nJy4gU2VlIHRoZSBzZWN0aW9uIG9uIGxpbms6I3NlbGVjdEpzb25bYFNFTEVDVCBKU09OYF0gZm9yCittb3JlIGRldGFpbHMuCisKK1tbc2VsZWN0U2VsZWN0aW9uXV0KKz09PT09IGA8c2VsZWN0LWNsYXVzZT5gCisKK1RoZSBgPHNlbGVjdC1jbGF1c2U+YCBkZXRlcm1pbmVzIHdoaWNoIGNvbHVtbnMgbmVlZHMgdG8gYmUgcXVlcmllZCBhbmQKK3JldHVybmVkIGluIHRoZSByZXN1bHQtc2V0LiBJdCBjb25zaXN0cyBvZiBlaXRoZXIgdGhlIGNvbW1hLXNlcGFyYXRlZAorbGlzdCBvZiBvciB0aGUgd2lsZGNhcmQgY2hhcmFjdGVyIChgKmApIHRvIHNlbGVjdCBhbGwgdGhlIGNvbHVtbnMKK2RlZmluZWQgZm9yIHRoZSB0YWJsZS4gUGxlYXNlIG5vdGUgdGhhdCBmb3Igd2lsZGNhcmQgYFNFTEVDVGAgcXVlcmllcwordGhlIG9yZGVyIG9mIGNvbHVtbnMgcmV0dXJuZWQgaXMgbm90IHNwZWNpZmllZCBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8KK2JlIHN0YWJsZSBiZXR3ZWVuIENhc3NhbmRyYSB2ZXJzaW9ucy4KKworQSBgPHNlbGVjdG9yPmAgaXMgZWl0aGVyIGEgY29sdW1uIG5hbWUgdG8gcmV0cmlldmUgb3IgYSBgPGZ1bmN0aW9uPmAgb2YKK29uZSBvciBtb3JlIGA8dGVybT5gcy4gVGhlIGZ1bmN0aW9uIGFsbG93ZWQgYXJlIHRoZSBzYW1lIGFzIGZvciBgPHRlcm0+YAorYW5kIGFyZSBkZXNjcmliZWQgaW4gdGhlIGxpbms6I2Z1bmN0aW9uc1tmdW5jdGlvbiBzZWN0aW9uXS4gSW4gYWRkaXRpb24KK3RvIHRoZXNlIGdlbmVyaWMgZnVuY3Rpb25zLCB0aGUgYFdSSVRFVElNRWAgYW5kIGBNQVhXUklURVRJTUVgIChyZXNwLiBgVFRMYCkKK2Z1bmN0aW9uIGFsbG93cyB0byBzZWxlY3QgdGhlIHRpbWVzdGFtcCBvZiB3aGVuIHRoZSBjb2x1bW4gd2FzIGluc2VydGVkIChyZXNwLgordGhlIHRpbWUgdG8gbGl2ZSAoaW4gc2Vjb25kcykgZm9yIHRoZSBjb2x1bW4gKG9yIG51bGwgaWYgdGhlIGNvbHVtbiBoYXMKK25vIGV4cGlyYXRpb24gc2V0KSkgYW5kIHRoZSBsaW5rOiNjYXN0RnVuW2BDQVNUYF0gZnVuY3Rpb24gY2FuIGJlIHVzZWQKK3RvIGNvbnZlcnQgb25lIGRhdGEgdHlwZSB0byBhbm90aGVyLiBUaGUgYFdSSVRFVElNRWAgYW5kIGBUVExgIGZ1bmN0aW9ucworY2FuJ3QgYmUgdXNlZCBvbiBtdWx0aS1jZWxsIGNvbHVtbnMgc3VjaCBhcyBub24tZnJvemVuIGNvbGxlY3Rpb25zIG9yCitub24tZnJvemVuIHVzZXItZGVmaW5lZCB0eXBlcy4KKworQWRkaXRpb25hbGx5LCBpbmRpdmlkdWFsIHZhbHVlcyBvZiBtYXBzIGFuZCBzZXRzIGNhbiBiZSBzZWxlY3RlZCB1c2luZworYFsgPHRlcm0+IF1gLiBGb3IgbWFwcywgdGhpcyB3aWxsIHJldHVybiB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUKK2tleSwgaWYgc3VjaCBlbnRyeSBleGlzdHMuIEZvciBzZXRzLCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBrZXkgdGhhdCBpcworc2VsZWN0ZWQgaWYgaXQgZXhpc3RzIGFuZCBpcyB0aHVzIG1haW5seSBhIHdheSB0byBjaGVjayBlbGVtZW50CitleGlzdGVuY2UuIEl0IGlzIGFsc28gcG9zc2libGUgdG8gc2VsZWN0IGEgc2xpY2Ugb2YgYSBzZXQgb3IgbWFwIHdpdGgKK2BbIDx0ZXJtPiAuLi4gPHRlcm0+IGBdLCB3aGVyZSBib3RoIGJvdW5kIGNhbiBiZSBvbWl0dGVkLgorCitBbnkgYDxzZWxlY3Rvcj5gIGNhbiBiZSBhbGlhc2VkIHVzaW5nIGBBU2Aga2V5d29yZCAoc2VlIGV4YW1wbGVzKS4KK1BsZWFzZSBub3RlIHRoYXQgYDx3aGVyZS1jbGF1c2U+YCBhbmQgYDxvcmRlci1ieT5gIGNsYXVzZSBzaG91bGQgcmVmZXIKK3RvIHRoZSBjb2x1bW5zIGJ5IHRoZWlyIG9yaWdpbmFsIG5hbWVzIGFuZCBub3QgYnkgdGhlaXIgYWxpYXNlcy4KKworVGhlIGBDT1VOVGAga2V5d29yZCBjYW4gYmUgdXNlZCB3aXRoIHBhcmVudGhlc2lzIGVuY2xvc2luZyBgKmAuIElmIHNvLAordGhlIHF1ZXJ5IHdpbGwgcmV0dXJuIGEgc2luZ2xlIHJlc3VsdDogdGhlIG51bWJlciBvZiByb3dzIG1hdGNoaW5nIHRoZQorcXVlcnkuIE5vdGUgdGhhdCBgQ09VTlQoMSlgIGlzIHN1cHBvcnRlZCBhcyBhbiBhbGlhcy4KKworW1tzZWxlY3RXaGVyZV1dCis9PT09PSBgPHdoZXJlLWNsYXVzZT5gCisKK1RoZSBgPHdoZXJlLWNsYXVzZT5gIHNwZWNpZmllcyB3aGljaCByb3dzIG11c3QgYmUgcXVlcmllZC4gSXQgaXMKK2NvbXBvc2VkIG9mIHJlbGF0aW9ucyBvbiB0aGUgY29sdW1ucyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBgUFJJTUFSWSBLRVlgCithbmQvb3IgaGF2ZSBhIGxpbms6I2NyZWF0ZUluZGV4U3RtdFtzZWNvbmRhcnkgaW5kZXhdIGRlZmluZWQgb24gdGhlbS4KKworTm90IGFsbCByZWxhdGlvbnMgYXJlIGFsbG93ZWQgaW4gYSBxdWVyeS4gRm9yIGluc3RhbmNlLCBub24tZXF1YWwKK3JlbGF0aW9ucyAod2hlcmUgYElOYCBpcyBjb25zaWRlcmVkIGFzIGFuIGVxdWFsIHJlbGF0aW9uKSBvbiBhIHBhcnRpdGlvbgora2V5IGFyZSBub3Qgc3VwcG9ydGVkIChidXQgc2VlIHRoZSB1c2Ugb2YgdGhlIGBUT0tFTmAgbWV0aG9kIGJlbG93IHRvIGRvCitub24tZXF1YWwgcXVlcmllcyBvbiB0aGUgcGFydGl0aW9uIGtleSkuIE1vcmVvdmVyLCBmb3IgYSBnaXZlbiBwYXJ0aXRpb24KK2tleSwgdGhlIGNsdXN0ZXJpbmcgY29sdW1ucyBpbmR1Y2UgYW4gb3JkZXJpbmcgb2Ygcm93cyBhbmQgcmVsYXRpb25zIG9uCit0aGVtIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIHJlbGF0aW9ucyB0aGF0IGFsbG93IHRvIHNlbGVjdCBhICpjb250aWd1b3VzKgorKGZvciB0aGUgb3JkZXJpbmcpIHNldCBvZiByb3dzLiBGb3IgaW5zdGFuY2UsIGdpdmVuCisKK2JjKHNhbXBsZSkuICsKK0NSRUFURSBUQUJMRSBwb3N0cyAoICsKK3VzZXJpZCB0ZXh0LCArCitibG9nX3RpdGxlIHRleHQsICsKK3Bvc3RlZF9hdCB0aW1lc3RhbXAsICsKK2VudHJ5X3RpdGxlIHRleHQsICsKK2NvbnRlbnQgdGV4dCwgKworY2F0ZWdvcnkgaW50LCArCitQUklNQVJZIEtFWSAodXNlcmlkLCBibG9nX3RpdGxlLCBwb3N0ZWRfYXQpICsKKykKKworVGhlIGZvbGxvd2luZyBxdWVyeSBpcyBhbGxvd2VkOgorCitiYyhzYW1wbGUpLiArCitTRUxFQ1QgZW50cnlfdGl0bGUsIGNvbnRlbnQgRlJPTSBwb3N0cyBXSEVSRSB1c2VyaWQ9YGpvaG4gZG9lJyBBTkQKK2Jsb2dfdGl0bGU9YEpvaG4nYHMgQmxvZycgQU5EIHBvc3RlZF9hdCA+PSBgMjAxMi0wMS0wMScgQU5EIHBvc3RlZF9hdCA8CitgMjAxMi0wMS0zMScKKworQnV0IHRoZSBmb2xsb3dpbmcgb25lIGlzIG5vdCwgYXMgaXQgZG9lcyBub3Qgc2VsZWN0IGEgY29udGlndW91cyBzZXQgb2YKK3Jvd3MgKGFuZCB3ZSBzdXBwb3NlIG5vIHNlY29uZGFyeSBpbmRleGVzIGFyZSBzZXQpOgorCitiYyhzYW1wbGUpLiArCisvLyBOZWVkcyBhIGJsb2dfdGl0bGUgdG8gYmUgc2V0IHRvIHNlbGVjdCByYW5nZXMgb2YgcG9zdGVkX2F0ICsKK1NFTEVDVCBlbnRyeV90aXRsZSwgY29udGVudCBGUk9NIHBvc3RzIFdIRVJFIHVzZXJpZD1gam9obiBkb2UnIEFORAorcG9zdGVkX2F0ID49IGAyMDEyLTAxLTAxJyBBTkQgcG9zdGVkX2F0IDwgYDIwMTItMDEtMzEnCisKK1doZW4gc3BlY2lmeWluZyByZWxhdGlvbnMsIHRoZSBgVE9LRU5gIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIG9uIHRoZQorYFBBUlRJVElPTiBLRVlgIGNvbHVtbiB0byBxdWVyeS4gSW4gdGhhdCBjYXNlLCByb3dzIHdpbGwgYmUgc2VsZWN0ZWQKK2Jhc2VkIG9uIHRoZSB0b2tlbiBvZiB0aGVpciBgUEFSVElUSU9OX0tFWWAgcmF0aGVyIHRoYW4gb24gdGhlIHZhbHVlLgorTm90ZSB0aGF0IHRoZSB0b2tlbiBvZiBhIGtleSBkZXBlbmRzIG9uIHRoZSBwYXJ0aXRpb25lciBpbiB1c2UsIGFuZCB0aGF0CitpbiBwYXJ0aWN1bGFyIHRoZSBSYW5kb21QYXJ0aXRpb25lciB3b27igJl0IHlpZWxkIGEgbWVhbmluZ2Z1bCBvcmRlci4gQWxzbworbm90ZSB0aGF0IG9yZGVyaW5nIHBhcnRpdGlvbmVycyBhbHdheXMgb3JkZXIgdG9rZW4gdmFsdWVzIGJ5IGJ5dGVzIChzbworZXZlbiBpZiB0aGUgcGFydGl0aW9uIGtleSBpcyBvZiB0eXBlIGludCwgYHRva2VuKC0xKSA+IHRva2VuKDApYCBpbgorcGFydGljdWxhcikuIEV4YW1wbGU6CisKK2JjKHNhbXBsZSkuICsKK1NFTEVDVCAqIEZST00gcG9zdHMgV0hFUkUgdG9rZW4odXNlcmlkKSA+IHRva2VuKGB0b20nKSBBTkQgdG9rZW4odXNlcmlkKQorPCB0b2tlbihgYm9iJykKKworTW9yZW92ZXIsIHRoZSBgSU5gIHJlbGF0aW9uIGlzIG9ubHkgYWxsb3dlZCBvbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlCitwYXJ0aXRpb24ga2V5IGFuZCBvbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlIGZ1bGwgcHJpbWFyeSBrZXkuCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8gYGBncm91cCcnIGBDTFVTVEVSSU5HIENPTFVNTlNgIHRvZ2V0aGVyIGluIGEKK3JlbGF0aW9uIHVzaW5nIHRoZSB0dXBsZSBub3RhdGlvbi4gRm9yIGluc3RhbmNlOgorCitiYyhzYW1wbGUpLiArCitTRUxFQ1QgKiBGUk9NIHBvc3RzIFdIRVJFIHVzZXJpZD1gam9obiBkb2UnIEFORCAoYmxvZ190aXRsZSwgcG9zdGVkX2F0KQorPiAoYEpvaG4nYHMgQmxvZycsIGAyMDEyLTAxLTAxJykKKword2lsbCByZXF1ZXN0IGFsbCByb3dzIHRoYXQgc29ydHMgYWZ0ZXIgdGhlIG9uZSBoYXZpbmcgYGBKb2hu4oCZcyBCbG9nJycgYXMKK2BibG9nX3RpbGVgIGFuZCBgMjAxMi0wMS0wMScgZm9yIGBwb3N0ZWRfYXRgIGluIHRoZSBjbHVzdGVyaW5nIG9yZGVyLiBJbgorcGFydGljdWxhciwgcm93cyBoYXZpbmcgYSBgcG9zdF9hdCA8PSAnMjAxMi0wMS0wMSdgIHdpbGwgYmUgcmV0dXJuZWQgYXMKK2xvbmcgYXMgdGhlaXIgYGJsb2dfdGl0bGUgPiAnSm9obicncyBCbG9nJ2AsIHdoaWNoIHdvdWxkbuKAmXQgYmUgdGhlIGNhc2UKK2ZvcjoKKworYmMoc2FtcGxlKS4gKworU0VMRUNUICogRlJPTSBwb3N0cyBXSEVSRSB1c2VyaWQ9YGpvaG4gZG9lJyBBTkQgYmxvZ190aXRsZSA+IGBKb2huJ2BzCitCbG9nJyBBTkQgcG9zdGVkX2F0ID4gYDIwMTItMDEtMDEnCisKK1RoZSB0dXBsZSBub3RhdGlvbiBtYXkgYWxzbyBiZSB1c2VkIGZvciBgSU5gIGNsYXVzZXMgb24KK2BDTFVTVEVSSU5HIENPTFVNTlNgOgorCitiYyhzYW1wbGUpLiArCitTRUxFQ1QgKiBGUk9NIHBvc3RzIFdIRVJFIHVzZXJpZD1gam9obiBkb2UnIEFORCAoYmxvZ190aXRsZSwgcG9zdGVkX2F0KQorSU4gKChgSm9obidgcyBCbG9nJywgYDIwMTItMDEtMDEpLCAo4oCZRXh0cmVtZSBDaGVzcycsIGAyMDE0LTA2LTAxJykpCisKK1RoZSBgQ09OVEFJTlNgIG9wZXJhdG9yIG1heSBvbmx5IGJlIHVzZWQgb24gY29sbGVjdGlvbiBjb2x1bW5zIChsaXN0cywKK3NldHMsIGFuZCBtYXBzKS4gSW4gdGhlIGNhc2Ugb2YgbWFwcywgYENPTlRBSU5TYCBhcHBsaWVzIHRvIHRoZSBtYXAKK3ZhbHVlcy4gVGhlIGBDT05UQUlOUyBLRVlgIG9wZXJhdG9yIG1heSBvbmx5IGJlIHVzZWQgb24gbWFwIGNvbHVtbnMgYW5kCithcHBsaWVzIHRvIHRoZSBtYXAga2V5cy4KKworW1tzZWxlY3RPcmRlckJ5XV0KKz09PT09IGA8b3JkZXItYnk+YAorCitUaGUgYE9SREVSIEJZYCBvcHRpb24gYWxsb3dzIHRvIHNlbGVjdCB0aGUgb3JkZXIgb2YgdGhlIHJldHVybmVkCityZXN1bHRzLiBJdCB0YWtlcyBhcyBhcmd1bWVudCBhIGxpc3Qgb2YgY29sdW1uIG5hbWVzIGFsb25nIHdpdGggdGhlCitvcmRlciBmb3IgdGhlIGNvbHVtbiAoYEFTQ2AgZm9yIGFzY2VuZGFudCBhbmQgYERFU0NgIGZvciBkZXNjZW5kYW50LAorb21pdHRpbmcgdGhlIG9yZGVyIGJlaW5nIGVxdWl2YWxlbnQgdG8gYEFTQ2ApLiBDdXJyZW50bHkgdGhlIHBvc3NpYmxlCitvcmRlcmluZ3MgYXJlIGxpbWl0ZWQgKHdoaWNoIGRlcGVuZHMgb24gdGhlIHRhYmxlCitsaW5rOiNjcmVhdGVUYWJsZU9wdGlvbnNbYENMVVNURVJJTkcgT1JERVJgXSApOgorCisqIGlmIHRoZSB0YWJsZSBoYXMgYmVlbiBkZWZpbmVkIHdpdGhvdXQgYW55IHNwZWNpZmljIGBDTFVTVEVSSU5HIE9SREVSYCwKK3RoZW4gdGhlbiBhbGxvd2VkIG9yZGVyaW5ncyBhcmUgdGhlIG9yZGVyIGluZHVjZWQgYnkgdGhlIGNsdXN0ZXJpbmcKK2NvbHVtbnMgYW5kIHRoZSByZXZlcnNlIG9mIHRoYXQgb25lLgorKiBvdGhlcndpc2UsIHRoZSBvcmRlcmluZ3MgYWxsb3dlZCBhcmUgdGhlIG9yZGVyIG9mIHRoZQorYENMVVNURVJJTkcgT1JERVJgIG9wdGlvbiBhbmQgdGhlIHJldmVyc2VkIG9uZS4KKworW1tzZWxlY3RHcm91cEJ5XV0KKz09PT09IGA8Z3JvdXAtYnk+YAorCitUaGUgYEdST1VQIEJZYCBvcHRpb24gYWxsb3dzIHRvIGNvbmRlbnNlIGludG8gYSBzaW5nbGUgcm93IGFsbCBzZWxlY3RlZAorcm93cyB0aGF0IHNoYXJlIHRoZSBzYW1lIHZhbHVlcyBmb3IgYSBzZXQgb2YgY29sdW1ucy4KKworVXNpbmcgdGhlIGBHUk9VUCBCWWAgb3B0aW9uLCBpdCBpcyBvbmx5IHBvc3NpYmxlIHRvIGdyb3VwIHJvd3MgYXQgdGhlCitwYXJ0aXRpb24ga2V5IGxldmVsIG9yIGF0IGEgY2x1c3RlcmluZyBjb2x1bW4gbGV2ZWwuIEJ5IGNvbnNlcXVlbmNlLCB0aGUKK2BHUk9VUCBCWWAgb3B0aW9uIG9ubHkgYWNjZXB0IGFzIGFyZ3VtZW50cyBwcmltYXJ5IGtleSBjb2x1bW4gbmFtZXMgaW4KK3RoZSBwcmltYXJ5IGtleSBvcmRlci4gSWYgYSBwcmltYXJ5IGtleSBjb2x1bW4gaXMgcmVzdHJpY3RlZCBieSBhbgorZXF1YWxpdHkgcmVzdHJpY3Rpb24gaXQgaXMgbm90IHJlcXVpcmVkIHRvIGJlIHByZXNlbnQgaW4gdGhlIGBHUk9VUCBCWWAKK2NsYXVzZS4KKworQWdncmVnYXRlIGZ1bmN0aW9ucyB3aWxsIHByb2R1Y2UgYSBzZXBhcmF0ZSB2YWx1ZSBmb3IgZWFjaCBncm91cC4gSWYgbm8KK2BHUk9VUCBCWWAgY2xhdXNlIGlzIHNwZWNpZmllZCwgYWdncmVnYXRlcyBmdW5jdGlvbnMgd2lsbCBwcm9kdWNlIGEKK3NpbmdsZSB2YWx1ZSBmb3IgYWxsIHRoZSByb3dzLgorCitJZiBhIGNvbHVtbiBpcyBzZWxlY3RlZCB3aXRob3V0IGFuIGFnZ3JlZ2F0ZSBmdW5jdGlvbiwgaW4gYSBzdGF0ZW1lbnQKK3dpdGggYSBgR1JPVVAgQllgLCB0aGUgZmlyc3QgdmFsdWUgZW5jb3VudGVyIGluIGVhY2ggZ3JvdXAgd2lsbCBiZQorcmV0dXJuZWQuCisKK1tbc2VsZWN0TGltaXRdXQorPT09PT0gYExJTUlUYCBhbmQgYFBFUiBQQVJUSVRJT04gTElNSVRgCisKK1RoZSBgTElNSVRgIG9wdGlvbiB0byBhIGBTRUxFQ1RgIHN0YXRlbWVudCBsaW1pdHMgdGhlIG51bWJlciBvZiByb3dzCityZXR1cm5lZCBieSBhIHF1ZXJ5LCB3aGlsZSB0aGUgYFBFUiBQQVJUSVRJT04gTElNSVRgIG9wdGlvbiBsaW1pdHMgdGhlCitudW1iZXIgb2Ygcm93cyByZXR1cm5lZCBmb3IgYSBnaXZlbiBwYXJ0aXRpb24gYnkgdGhlIHF1ZXJ5LiBOb3RlIHRoYXQKK2JvdGggdHlwZSBvZiBsaW1pdCBjYW4gdXNlZCBpbiB0aGUgc2FtZSBzdGF0ZW1lbnQuCisKK1tbc2VsZWN0QWxsb3dGaWx0ZXJpbmddXQorPT09PT0gYEFMTE9XIEZJTFRFUklOR2AKKworQnkgZGVmYXVsdCwgQ1FMIG9ubHkgYWxsb3dzIHNlbGVjdCBxdWVyaWVzIHRoYXQgZG9u4oCZdCBpbnZvbHZlCitgYGZpbHRlcmluZycnIHNlcnZlciBzaWRlLCBpLmUuIHF1ZXJpZXMgd2hlcmUgd2Uga25vdyB0aGF0IGFsbCAobGl2ZSkKK3JlY29yZCByZWFkIHdpbGwgYmUgcmV0dXJuZWQgKG1heWJlIHBhcnRseSkgaW4gdGhlIHJlc3VsdCBzZXQuIFRoZQorcmVhc29uaW5nIGlzIHRoYXQgdGhvc2UgYGBub24gZmlsdGVyaW5nJycgcXVlcmllcyBoYXZlIHByZWRpY3RhYmxlCitwZXJmb3JtYW5jZSBpbiB0aGUgc2Vuc2UgdGhhdCB0aGV5IHdpbGwgZXhlY3V0ZSBpbiBhIHRpbWUgdGhhdCBpcworcHJvcG9ydGlvbmFsIHRvIHRoZSBhbW91bnQgb2YgZGF0YSAqcmV0dXJuZWQqIGJ5IHRoZSBxdWVyeSAod2hpY2ggY2FuIGJlCitjb250cm9sbGVkIHRocm91Z2ggYExJTUlUYCkuCisKK1RoZSBgQUxMT1cgRklMVEVSSU5HYCBvcHRpb24gYWxsb3dzIHRvIGV4cGxpY2l0bHkgYWxsb3cgKHNvbWUpIHF1ZXJpZXMKK3RoYXQgcmVxdWlyZSBmaWx0ZXJpbmcuIFBsZWFzZSBub3RlIHRoYXQgYSBxdWVyeSB1c2luZyBgQUxMT1cgRklMVEVSSU5HYAorbWF5IHRodXMgaGF2ZSB1bnByZWRpY3RhYmxlIHBlcmZvcm1hbmNlIChmb3IgdGhlIGRlZmluaXRpb24gYWJvdmUpLCBpLmUuCitldmVuIGEgcXVlcnkgdGhhdCBzZWxlY3RzIGEgaGFuZGZ1bCBvZiByZWNvcmRzICptYXkqIGV4aGliaXQgcGVyZm9ybWFuY2UKK3RoYXQgZGVwZW5kcyBvbiB0aGUgdG90YWwgYW1vdW50IG9mIGRhdGEgc3RvcmVkIGluIHRoZSBjbHVzdGVyLgorCitGb3IgaW5zdGFuY2UsIGNvbnNpZGVyaW5nIHRoZSBmb2xsb3dpbmcgdGFibGUgaG9sZGluZyB1c2VyIHByb2ZpbGVzIHdpdGgKK3RoZWlyIHllYXIgb2YgYmlydGggKHdpdGggYSBzZWNvbmRhcnkgaW5kZXggb24gaXQpIGFuZCBjb3VudHJ5IG9mCityZXNpZGVuY2U6CisKK2JjKHNhbXBsZSkuLiArCitDUkVBVEUgVEFCTEUgdXNlcnMgKCArCit1c2VybmFtZSB0ZXh0IFBSSU1BUlkgS0VZLCArCitmaXJzdG5hbWUgdGV4dCwgKworbGFzdG5hbWUgdGV4dCwgKworYmlydGhfeWVhciBpbnQsICsKK2NvdW50cnkgdGV4dCArCispCisKK0NSRUFURSBJTkRFWCBPTiB1c2VycyhiaXJ0aF95ZWFyKTsgKworcC4KKworVGhlbiB0aGUgZm9sbG93aW5nIHF1ZXJpZXMgYXJlIHZhbGlkOgorCitiYyhzYW1wbGUpLiArCitTRUxFQ1QgKiBGUk9NIHVzZXJzOyArCitTRUxFQ1QgZmlyc3RuYW1lLCBsYXN0bmFtZSBGUk9NIHVzZXJzIFdIRVJFIGJpcnRoX3llYXIgPSAxOTgxOworCitiZWNhdXNlIGluIGJvdGggY2FzZSwgQ2Fzc2FuZHJhIGd1YXJhbnRlZXMgdGhhdCB0aGVzZSBxdWVyaWVzCitwZXJmb3JtYW5jZSB3aWxsIGJlIHByb3BvcnRpb25hbCB0byB0aGUgYW1vdW50IG9mIGRhdGEgcmV0dXJuZWQuIEluCitwYXJ0aWN1bGFyLCBpZiBubyB1c2VycyBhcmUgYm9ybiBpbiAxOTgxLCB0aGVuIHRoZSBzZWNvbmQgcXVlcnkKK3BlcmZvcm1hbmNlIHdpbGwgbm90IGRlcGVuZCBvZiB0aGUgbnVtYmVyIG9mIHVzZXIgcHJvZmlsZSBzdG9yZWQgaW4gdGhlCitkYXRhYmFzZSAobm90IGRpcmVjdGx5IGF0IGxlYXN0OiBkdWUgdG8gc2Vjb25kYXJ5IGluZGV4IGltcGxlbWVudGF0aW9uCitjb25zaWRlcmF0aW9uLCB0aGlzIHF1ZXJ5IG1heSBzdGlsbCBkZXBlbmQgb24gdGhlIG51bWJlciBvZiBub2RlIGluIHRoZQorY2x1c3Rlciwgd2hpY2ggaW5kaXJlY3RseSBkZXBlbmRzIG9uIHRoZSBhbW91bnQgb2YgZGF0YSBzdG9yZWQuCitOZXZlcnRoZWxlc3MsIHRoZSBudW1iZXIgb2Ygbm9kZXMgd2lsbCBhbHdheXMgYmUgbXVsdGlwbGUgbnVtYmVyIG9mCittYWduaXR1ZGUgbG93ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHVzZXIgcHJvZmlsZSBzdG9yZWQpLiBPZiBjb3Vyc2UsIGJvdGgKK3F1ZXJ5IG1heSByZXR1cm4gdmVyeSBsYXJnZSByZXN1bHQgc2V0IGluIHByYWN0aWNlLCBidXQgdGhlIGFtb3VudCBvZgorZGF0YSByZXR1cm5lZCBjYW4gYWx3YXlzIGJlIGNvbnRyb2xsZWQgYnkgYWRkaW5nIGEgYExJTUlUYC4KKworSG93ZXZlciwgdGhlIGZvbGxvd2luZyBxdWVyeSB3aWxsIGJlIHJlamVjdGVkOgorCitiYyhzYW1wbGUpLiArCitTRUxFQ1QgZmlyc3RuYW1lLCBsYXN0bmFtZSBGUk9NIHVzZXJzIFdIRVJFIGJpcnRoX3llYXIgPSAxOTgxIEFORAorY291bnRyeSA9IGBGUic7CisKK2JlY2F1c2UgQ2Fzc2FuZHJhIGNhbm5vdCBndWFyYW50ZWUgdGhhdCBpdCB3b27igJl0IGhhdmUgdG8gc2NhbiBsYXJnZQorYW1vdW50IG9mIGRhdGEgZXZlbiBpZiB0aGUgcmVzdWx0IHRvIHRob3NlIHF1ZXJ5IGlzIHNtYWxsLiBUeXBpY2FsbHksIGl0Cit3aWxsIHNjYW4gYWxsIHRoZSBpbmRleCBlbnRyaWVzIGZvciB1c2VycyBib3JuIGluIDE5ODEgZXZlbiBpZiBvbmx5IGEKK2hhbmRmdWwgYXJlIGFjdHVhbGx5IGZyb20gRnJhbmNlLiBIb3dldmVyLCBpZiB5b3UgYGBrbm93IHdoYXQgeW91IGFyZQorZG9pbmcnJywgeW91IGNhbiBmb3JjZSB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgcXVlcnkgYnkgdXNpbmcKK2BBTExPVyBGSUxURVJJTkdgIGFuZCBzbyB0aGUgZm9sbG93aW5nIHF1ZXJ5IGlzIHZhbGlkOgorCitiYyhzYW1wbGUpLiArCitTRUxFQ1QgZmlyc3RuYW1lLCBsYXN0bmFtZSBGUk9NIHVzZXJzIFdIRVJFIGJpcnRoX3llYXIgPSAxOTgxIEFORAorY291bnRyeSA9IGBGUicgQUxMT1cgRklMVEVSSU5HOworCitbW2RhdGFiYXNlUm9sZXNdXQorPT09IERhdGFiYXNlIFJvbGVzCisKK1tbY3JlYXRlUm9sZVN0bXRdXQorPT09PSBDUkVBVEUgUk9MRQorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBDUkVBVEUgUk9MRSAoIElGIE5PVCBFWElTVFMgKT8gKCBXSVRIICggQU5EICkqICk/CisKKzo6PSBQQVNTV09SRCA9ICArCit8IExPR0lOID0gICsKK3wgU1VQRVJVU0VSID0gICsKK3wgT1BUSU9OUyA9ICArCitwLgorCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gKworQ1JFQVRFIFJPTEUgbmV3X3JvbGU7ICsKK0NSRUFURSBST0xFIGFsaWNlIFdJVEggUEFTU1dPUkQgPSBgcGFzc3dvcmRfYScgQU5EIExPR0lOID0gdHJ1ZTsgKworQ1JFQVRFIFJPTEUgYm9iIFdJVEggUEFTU1dPUkQgPSBgcGFzc3dvcmRfYicgQU5EIExPR0lOID0gdHJ1ZSBBTkQKK1NVUEVSVVNFUiA9IHRydWU7ICsKK0NSRUFURSBST0xFIGNhcmxvcyBXSVRIIE9QVElPTlMgPSBceyBgY3VzdG9tX29wdGlvbjEnIDogYG9wdGlvbjFfdmFsdWUnLAorYGN1c3RvbV9vcHRpb24yJyA6IDk5IH07CisKK0J5IGRlZmF1bHQgcm9sZXMgZG8gbm90IHBvc3Nlc3MgYExPR0lOYCBwcml2aWxlZ2VzIG9yIGBTVVBFUlVTRVJgCitzdGF0dXMuCisKK2xpbms6I3Blcm1pc3Npb25zW1Blcm1pc3Npb25zXSBvbiBkYXRhYmFzZSByZXNvdXJjZXMgYXJlIGdyYW50ZWQgdG8KK3JvbGVzOyB0eXBlcyBvZiByZXNvdXJjZXMgaW5jbHVkZSBrZXlzcGFjZXMsIHRhYmxlcywgZnVuY3Rpb25zIGFuZCByb2xlcwordGhlbXNlbHZlcy4gUm9sZXMgbWF5IGJlIGdyYW50ZWQgdG8gb3RoZXIgcm9sZXMgdG8gY3JlYXRlIGhpZXJhcmNoaWNhbAorcGVybWlzc2lvbnMgc3RydWN0dXJlczsgaW4gdGhlc2UgaGllcmFyY2hpZXMsIHBlcm1pc3Npb25zIGFuZAorYFNVUEVSVVNFUmAgc3RhdHVzIGFyZSBpbmhlcml0ZWQsIGJ1dCB0aGUgYExPR0lOYCBwcml2aWxlZ2UgaXMgbm90LgorCitJZiBhIHJvbGUgaGFzIHRoZSBgTE9HSU5gIHByaXZpbGVnZSwgY2xpZW50cyBtYXkgaWRlbnRpZnkgYXMgdGhhdCByb2xlCit3aGVuIGNvbm5lY3RpbmcuIEZvciB0aGUgZHVyYXRpb24gb2YgdGhhdCBjb25uZWN0aW9uLCB0aGUgY2xpZW50IHdpbGwKK2FjcXVpcmUgYW55IHJvbGVzIGFuZCBwcml2aWxlZ2VzIGdyYW50ZWQgdG8gdGhhdCByb2xlLgorCitPbmx5IGEgY2xpZW50IHdpdGggd2l0aCB0aGUgYENSRUFURWAgcGVybWlzc2lvbiBvbiB0aGUgZGF0YWJhc2Ugcm9sZXMKK3Jlc291cmNlIG1heSBpc3N1ZSBgQ1JFQVRFIFJPTEVgIHJlcXVlc3RzIChzZWUgdGhlCitsaW5rOiNwZXJtaXNzaW9uc1tyZWxldmFudCBzZWN0aW9uXSBiZWxvdyksIHVubGVzcyB0aGUgY2xpZW50IGlzIGEKK2BTVVBFUlVTRVJgLiBSb2xlIG1hbmFnZW1lbnQgaW4gQ2Fzc2FuZHJhIGlzIHBsdWdnYWJsZSBhbmQgY3VzdG9tCitpbXBsZW1lbnRhdGlvbnMgbWF5IHN1cHBvcnQgb25seSBhIHN1YnNldCBvZiB0aGUgbGlzdGVkIG9wdGlvbnMuCisKK1JvbGUgbmFtZXMgc2hvdWxkIGJlIHF1b3RlZCBpZiB0aGV5IGNvbnRhaW4gbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLgorCitbW2NyZWF0ZVJvbGVQd2RdXQorPT09PT0gU2V0dGluZyBjcmVkZW50aWFscyBmb3IgaW50ZXJuYWwgYXV0aGVudGljYXRpb24KKworVXNlIHRoZSBgV0lUSCBQQVNTV09SRGAgY2xhdXNlIHRvIHNldCBhIHBhc3N3b3JkIGZvciBpbnRlcm5hbAorYXV0aGVudGljYXRpb24sIGVuY2xvc2luZyB0aGUgcGFzc3dvcmQgaW4gc2luZ2xlIHF1b3RhdGlvbiBtYXJrcy4gKworSWYgaW50ZXJuYWwgYXV0aGVudGljYXRpb24gaGFzIG5vdCBiZWVuIHNldCB1cCBvciB0aGUgcm9sZSBkb2VzIG5vdCBoYXZlCitgTE9HSU5gIHByaXZpbGVnZXMsIHRoZSBgV0lUSCBQQVNTV09SRGAgY2xhdXNlIGlzIG5vdCBuZWNlc3NhcnkuCisKK1tbY3JlYXRlUm9sZUNvbmRpdGlvbmFsXV0KKz09PT09IENyZWF0aW5nIGEgcm9sZSBjb25kaXRpb25hbGx5CisKK0F0dGVtcHRpbmcgdG8gY3JlYXRlIGFuIGV4aXN0aW5nIHJvbGUgcmVzdWx0cyBpbiBhbiBpbnZhbGlkIHF1ZXJ5Citjb25kaXRpb24gdW5sZXNzIHRoZSBgSUYgTk9UIEVYSVNUU2Agb3B0aW9uIGlzIHVzZWQuIElmIHRoZSBvcHRpb24gaXMKK3VzZWQgYW5kIHRoZSByb2xlIGV4aXN0cywgdGhlIHN0YXRlbWVudCBpcyBhIG5vLW9wLgorCitiYyhzYW1wbGUpLiArCitDUkVBVEUgUk9MRSBvdGhlcl9yb2xlOyArCitDUkVBVEUgUk9MRSBJRiBOT1QgRVhJU1RTIG90aGVyX3JvbGU7CisKK1tbYWx0ZXJSb2xlU3RtdF1dCis9PT09IEFMVEVSIFJPTEUKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gQUxURVIgUk9MRSAoSUYgRVhJU1RTKT8gKCBXSVRIICggQU5EICkqICk/CisKKzo6PSBQQVNTV09SRCA9ICArCit8IExPR0lOID0gICsKK3wgU1VQRVJVU0VSID0gICsKK3wgT1BUSU9OUyA9ICArCitwLgorCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gKworQUxURVIgUk9MRSBib2IgV0lUSCBQQVNTV09SRCA9IGBQQVNTV09SRF9CJyBBTkQgU1VQRVJVU0VSID0gZmFsc2U7CisKK0lmIHRoZSByb2xlIGRvZXMgbm90IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKworQ29uZGl0aW9ucyBvbiBleGVjdXRpbmcgYEFMVEVSIFJPTEVgIHN0YXRlbWVudHM6CisKKyogQSBjbGllbnQgbXVzdCBoYXZlIGBTVVBFUlVTRVJgIHN0YXR1cyB0byBhbHRlciB0aGUgYFNVUEVSVVNFUmAgc3RhdHVzCitvZiBhbm90aGVyIHJvbGUKKyogQSBjbGllbnQgY2Fubm90IGFsdGVyIHRoZSBgU1VQRVJVU0VSYCBzdGF0dXMgb2YgYW55IHJvbGUgaXQgY3VycmVudGx5Citob2xkcworKiBBIGNsaWVudCBjYW4gb25seSBtb2RpZnkgY2VydGFpbiBwcm9wZXJ0aWVzIG9mIHRoZSByb2xlIHdpdGggd2hpY2ggaXQKK2lkZW50aWZpZWQgYXQgbG9naW4gKGUuZy4gYFBBU1NXT1JEYCkKKyogVG8gbW9kaWZ5IHByb3BlcnRpZXMgb2YgYSByb2xlLCB0aGUgY2xpZW50IG11c3QgYmUgZ3JhbnRlZCBgQUxURVJgCitsaW5rOiNwZXJtaXNzaW9uc1twZXJtaXNzaW9uXSBvbiB0aGF0IHJvbGUKKworW1tkcm9wUm9sZVN0bXRdXQorPT09PSBEUk9QIFJPTEUKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gRFJPUCBST0xFICggSUYgRVhJU1RTICk/ICArCitwLgorCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gKworRFJPUCBST0xFIGFsaWNlOyArCitEUk9QIFJPTEUgSUYgRVhJU1RTIGJvYjsKKworYERST1AgUk9MRWAgcmVxdWlyZXMgdGhlIGNsaWVudCB0byBoYXZlIGBEUk9QYAorbGluazojcGVybWlzc2lvbnNbcGVybWlzc2lvbl0gb24gdGhlIHJvbGUgaW4gcXVlc3Rpb24uIEluIGFkZGl0aW9uLAorY2xpZW50IG1heSBub3QgYERST1BgIHRoZSByb2xlIHdpdGggd2hpY2ggaXQgaWRlbnRpZmllZCBhdCBsb2dpbi4KK0ZpbmFseSwgb25seSBhIGNsaWVudCB3aXRoIGBTVVBFUlVTRVJgIHN0YXR1cyBtYXkgYERST1BgIGFub3RoZXIKK2BTVVBFUlVTRVJgIHJvbGUuICsKK0F0dGVtcHRpbmcgdG8gZHJvcCBhIHJvbGUgd2hpY2ggZG9lcyBub3QgZXhpc3QgcmVzdWx0cyBpbiBhbiBpbnZhbGlkCitxdWVyeSBjb25kaXRpb24gdW5sZXNzIHRoZSBgSUYgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgdGhlIG9wdGlvbiBpcwordXNlZCBhbmQgdGhlIHJvbGUgZG9lcyBub3QgZXhpc3QgdGhlIHN0YXRlbWVudCBpcyBhIG5vLW9wLgorCitbW2dyYW50Um9sZVN0bXRdXQorPT09PSBHUkFOVCBST0xFCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLiArCis6Oj0gR1JBTlQgVE8KKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuICsKK0dSQU5UIHJlcG9ydF93cml0ZXIgVE8gYWxpY2U7CisKK1RoaXMgc3RhdGVtZW50IGdyYW50cyB0aGUgYHJlcG9ydF93cml0ZXJgIHJvbGUgdG8gYGFsaWNlYC4gQW55CitwZXJtaXNzaW9ucyBncmFudGVkIHRvIGByZXBvcnRfd3JpdGVyYCBhcmUgYWxzbyBhY3F1aXJlZCBieSBgYWxpY2VgLiArCitSb2xlcyBhcmUgbW9kZWxsZWQgYXMgYSBkaXJlY3RlZCBhY3ljbGljIGdyYXBoLCBzbyBjaXJjdWxhciBncmFudHMgYXJlCitub3QgcGVybWl0dGVkLiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHJlc3VsdCBpbiBlcnJvciBjb25kaXRpb25zOgorCitiYyhzYW1wbGUpLiArCitHUkFOVCByb2xlX2EgVE8gcm9sZV9iOyArCitHUkFOVCByb2xlX2IgVE8gcm9sZV9hOworCitiYyhzYW1wbGUpLiArCitHUkFOVCByb2xlX2EgVE8gcm9sZV9iOyArCitHUkFOVCByb2xlX2IgVE8gcm9sZV9jOyArCitHUkFOVCByb2xlX2MgVE8gcm9sZV9hOworCitbW3Jldm9rZVJvbGVTdG10XV0KKz09PT0gUkVWT0tFIFJPTEUKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuICsKKzo6PSBSRVZPS0UgRlJPTQorCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gKworUkVWT0tFIHJlcG9ydF93cml0ZXIgRlJPTSBhbGljZTsKKworVGhpcyBzdGF0ZW1lbnQgcmV2b2tlcyB0aGUgYHJlcG9ydF93cml0ZXJgIHJvbGUgZnJvbSBgYWxpY2VgLiBBbnkKK3Blcm1pc3Npb25zIHRoYXQgYGFsaWNlYCBoYXMgYWNxdWlyZWQgdmlhIHRoZSBgcmVwb3J0X3dyaXRlcmAgcm9sZSBhcmUKK2Fsc28gcmV2b2tlZC4KKworW1tsaXN0Um9sZXNTdG10XV0KKz09PT09IExJU1QgUk9MRVMKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuICsKKzo6PSBMSVNUIFJPTEVTICggT0YgKT8gKCBOT1JFQ1VSU0lWRSApPworCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gKworTElTVCBST0xFUzsKKworUmV0dXJuIGFsbCBrbm93biByb2xlcyBpbiB0aGUgc3lzdGVtLCB0aGlzIHJlcXVpcmVzIGBERVNDUklCRWAKK3Blcm1pc3Npb24gb24gdGhlIGRhdGFiYXNlIHJvbGVzIHJlc291cmNlLgorCitiYyhzYW1wbGUpLiArCitMSVNUIFJPTEVTIE9GIGBhbGljZWA7CisKK0VudW1lcmF0ZSBhbGwgcm9sZXMgZ3JhbnRlZCB0byBgYWxpY2VgLCBpbmNsdWRpbmcgdGhvc2UgdHJhbnNpdGl2ZWx5CithcXVpcmVkLgorCitiYyhzYW1wbGUpLiArCitMSVNUIFJPTEVTIE9GIGBib2JgIE5PUkVDVVJTSVZFCisKK0xpc3QgYWxsIHJvbGVzIGRpcmVjdGx5IGdyYW50ZWQgdG8gYGJvYmAuCisKK1tbY3JlYXRlVXNlclN0bXRdXQorPT09PSBDUkVBVEUgVVNFUgorCitQcmlvciB0byB0aGUgaW50cm9kdWN0aW9uIG9mIHJvbGVzIGluIENhc3NhbmRyYSAyLjIsIGF1dGhlbnRpY2F0aW9uIGFuZAorYXV0aG9yaXphdGlvbiB3ZXJlIGJhc2VkIGFyb3VuZCB0aGUgY29uY2VwdCBvZiBhIGBVU0VSYC4gRm9yIGJhY2t3YXJkCitjb21wYXRpYmlsaXR5LCB0aGUgbGVnYWN5IHN5bnRheCBoYXMgYmVlbiBwcmVzZXJ2ZWQgd2l0aCBgVVNFUmAgY2VudHJpYworc3RhdG1lbnRzIGJlY29taW5nIHN5bm9ueW1zIGZvciB0aGUgYFJPTEVgIGJhc2VkIGVxdWl2YWxlbnRzLgorCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBDUkVBVEUgVVNFUiAoIElGIE5PVCBFWElTVFMgKT8gKCBXSVRIIFBBU1NXT1JEICk/ICgpPworCis6Oj0gU1VQRVJVU0VSICsKK3wgTk9TVVBFUlVTRVIgKworcC4KKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuICsKK0NSRUFURSBVU0VSIGFsaWNlIFdJVEggUEFTU1dPUkQgYHBhc3N3b3JkX2EnIFNVUEVSVVNFUjsgKworQ1JFQVRFIFVTRVIgYm9iIFdJVEggUEFTU1dPUkQgYHBhc3N3b3JkX2InIE5PU1VQRVJVU0VSOworCitgQ1JFQVRFIFVTRVJgIGlzIGVxdWl2YWxlbnQgdG8gYENSRUFURSBST0xFYCB3aGVyZSB0aGUgYExPR0lOYCBvcHRpb24gaXMKK2B0cnVlYC4gU28sIHRoZSBmb2xsb3dpbmcgcGFpcnMgb2Ygc3RhdGVtZW50cyBhcmUgZXF1aXZhbGVudDoKKworYmMoc2FtcGxlKS4uICsKK0NSRUFURSBVU0VSIGFsaWNlIFdJVEggUEFTU1dPUkQgYHBhc3N3b3JkX2EnIFNVUEVSVVNFUjsgKworQ1JFQVRFIFJPTEUgYWxpY2UgV0lUSCBQQVNTV09SRCA9IGBwYXNzd29yZF9hJyBBTkQgTE9HSU4gPSB0cnVlIEFORAorU1VQRVJVU0VSID0gdHJ1ZTsKKworQ1JFQVRFIFVTRVIgSUYgTk9UIEVYSVNUUyBhbGljZSBXSVRIIFBBU1NXT1JEIGBwYXNzd29yZF9hJyBTVVBFUlVTRVI7ICsKK0NSRUFURSBST0xFIElGIE5PVCBFWElTVFMgYWxpY2UgV0lUSCBQQVNTV09SRCA9IGBwYXNzd29yZF9hJyBBTkQgTE9HSU4gPQordHJ1ZSBBTkQgU1VQRVJVU0VSID0gdHJ1ZTsKKworQ1JFQVRFIFVTRVIgYWxpY2UgV0lUSCBQQVNTV09SRCBgcGFzc3dvcmRfYScgTk9TVVBFUlVTRVI7ICsKK0NSRUFURSBST0xFIGFsaWNlIFdJVEggUEFTU1dPUkQgPSBgcGFzc3dvcmRfYScgQU5EIExPR0lOID0gdHJ1ZSBBTkQKK1NVUEVSVVNFUiA9IGZhbHNlOworCitDUkVBVEUgVVNFUiBhbGljZSBXSVRIIFBBU1NXT1JEIGBwYXNzd29yZF9hJyBOT1NVUEVSVVNFUjsgKworQ1JFQVRFIFJPTEUgYWxpY2UgV0lUSCBQQVNTV09SRCA9IGBwYXNzd29yZF9hJyBBTkQgTE9HSU4gPSB0cnVlOworCitDUkVBVEUgVVNFUiBhbGljZSBXSVRIIFBBU1NXT1JEIGBwYXNzd29yZF9hJzsgKworQ1JFQVRFIFJPTEUgYWxpY2UgV0lUSCBQQVNTV09SRCA9IGBwYXNzd29yZF9hJyBBTkQgTE9HSU4gPSB0cnVlOyArCitwLgorCitbW2FsdGVyVXNlclN0bXRdXQorPT09PSBBTFRFUiBVU0VSCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IEFMVEVSIFVTRVIgKElGIEVYSVNUUyk/ICggV0lUSCBQQVNTV09SRCApPyAoICk/CisKKzo6PSBTVVBFUlVTRVIgKworfCBOT1NVUEVSVVNFUiArCitwLgorCitiYyhzYW1wbGUpLiArCitBTFRFUiBVU0VSIGFsaWNlIFdJVEggUEFTU1dPUkQgYFBBU1NXT1JEX0EnOyArCitBTFRFUiBVU0VSIGJvYiBTVVBFUlVTRVI7CisKK0lmIHRoZSB1c2VyIGRvZXMgbm90IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKworW1tkcm9wVXNlclN0bXRdXQorPT09PSBEUk9QIFVTRVIKKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gRFJPUCBVU0VSICggSUYgRVhJU1RTICk/ICArCitwLgorCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gKworRFJPUCBVU0VSIGFsaWNlOyArCitEUk9QIFVTRVIgSUYgRVhJU1RTIGJvYjsKKworW1tsaXN0VXNlcnNTdG10XV0KKz09PT0gTElTVCBVU0VSUworCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4gKworOjo9IExJU1QgVVNFUlM7CisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitMSVNUIFVTRVJTOworCitUaGlzIHN0YXRlbWVudCBpcyBlcXVpdmFsZW50IHRvCisKK2JjKHNhbXBsZSkuICsKK0xJU1QgUk9MRVM7CisKK2J1dCBvbmx5IHJvbGVzIHdpdGggdGhlIGBMT0dJTmAgcHJpdmlsZWdlIGFyZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgorCitbW2RhdGFDb250cm9sXV0KKz09PSBEYXRhIENvbnRyb2wKKworPT09PSBQZXJtaXNzaW9ucworCitQZXJtaXNzaW9ucyBvbiByZXNvdXJjZXMgYXJlIGdyYW50ZWQgdG8gcm9sZXM7IHRoZXJlIGFyZSBzZXZlcmFsCitkaWZmZXJlbnQgdHlwZXMgb2YgcmVzb3VyY2VzIGluIENhc3NhbmRyYSBhbmQgZWFjaCB0eXBlIGlzIG1vZGVsbGVkCitoaWVyYXJjaGljYWxseToKKworKiBUaGUgaGllcmFyY2h5IG9mIERhdGEgcmVzb3VyY2VzLCBLZXlzcGFjZXMgYW5kIFRhYmxlcyBoYXMgdGhlCitzdHJ1Y3R1cmUgYEFMTCBLRVlTUEFDRVNgIC0+IGBLRVlTUEFDRWAgLT4gYFRBQkxFYAorKiBGdW5jdGlvbiByZXNvdXJjZXMgaGF2ZSB0aGUgc3RydWN0dXJlIGBBTEwgRlVOQ1RJT05TYCAtPiBgS0VZU1BBQ0VgIC0+CitgRlVOQ1RJT05gCisqIFJlc291cmNlcyByZXByZXNlbnRpbmcgcm9sZXMgaGF2ZSB0aGUgc3RydWN0dXJlIGBBTEwgUk9MRVNgIC0+IGBST0xFYAorKiBSZXNvdXJjZXMgcmVwcmVzZW50aW5nIEpNWCBPYmplY3ROYW1lcywgd2hpY2ggbWFwIHRvIHNldHMgb2YKK01CZWFucy9NWEJlYW5zLCBoYXZlIHRoZSBzdHJ1Y3R1cmUgYEFMTCBNQkVBTlNgIC0+IGBNQkVBTmAKKworUGVybWlzc2lvbnMgY2FuIGJlIGdyYW50ZWQgYXQgYW55IGxldmVsIG9mIHRoZXNlIGhpZXJhcmNoaWVzIGFuZCB0aGV5CitmbG93IGRvd253YXJkcy4gU28gZ3JhbnRpbmcgYSBwZXJtaXNzaW9uIG9uIGEgcmVzb3VyY2UgaGlnaGVyIHVwIHRoZQorY2hhaW4gYXV0b21hdGljYWxseSBncmFudHMgdGhhdCBzYW1lIHBlcm1pc3Npb24gb24gYWxsIHJlc291cmNlcyBsb3dlcgorZG93bi4gRm9yIGV4YW1wbGUsIGdyYW50aW5nIGBTRUxFQ1RgIG9uIGEgYEtFWVNQQUNFYCBhdXRvbWF0aWNhbGx5CitncmFudHMgaXQgb24gYWxsIGBUQUJMRVNgIGluIHRoYXQgYEtFWVNQQUNFYC4gTGlrZXdpc2UsIGdyYW50aW5nIGEKK3Blcm1pc3Npb24gb24gYEFMTCBGVU5DVElPTlNgIGdyYW50cyBpdCBvbiBldmVyeSBkZWZpbmVkIGZ1bmN0aW9uLAorcmVnYXJkbGVzcyBvZiB3aGljaCBrZXlzcGFjZSBpdCBpcyBzY29wZWQgaW4uIEl0IGlzIGFsc28gcG9zc2libGUgdG8KK2dyYW50IHBlcm1pc3Npb25zIG9uIGFsbCBmdW5jdGlvbnMgc2NvcGVkIHRvIGEgcGFydGljdWxhciBrZXlzcGFjZS4KKworTW9kaWZpY2F0aW9ucyB0byBwZXJtaXNzaW9ucyBhcmUgdmlzaWJsZSB0byBleGlzdGluZyBjbGllbnQgc2Vzc2lvbnM7Cit0aGF0IGlzLCBjb25uZWN0aW9ucyBuZWVkIG5vdCBiZSByZS1lc3RhYmxpc2hlZCBmb2xsb3dpbmcgcGVybWlzc2lvbnMKK2NoYW5nZXMuCisKK1RoZSBmdWxsIHNldCBvZiBhdmFpbGFibGUgcGVybWlzc2lvbnMgaXM6CisKKyogYENSRUFURWAKKyogYEFMVEVSYAorKiBgRFJPUGAKKyogYFNFTEVDVGAKKyogYE1PRElGWWAKKyogYEFVVEhPUklaRWAKKyogYERFU0NSSUJFYAorKiBgRVhFQ1VURWAKKyogYFVOTUFTS2AKKyogYFNFTEVDVF9NQVNLRURgCisKK05vdCBhbGwgcGVybWlzc2lvbnMgYXJlIGFwcGxpY2FibGUgdG8gZXZlcnkgdHlwZSBvZiByZXNvdXJjZS4gRm9yCitpbnN0YW5jZSwgYEVYRUNVVEVgIGlzIG9ubHkgcmVsZXZhbnQgaW4gdGhlIGNvbnRleHQgb2YgZnVuY3Rpb25zIG9yCittYmVhbnM7IGdyYW50aW5nIGBFWEVDVVRFYCBvbiBhIHJlc291cmNlIHJlcHJlc2VudGluZyBhIHRhYmxlIGlzCitub25zZW5zaWNhbC4gQXR0ZW1wdGluZyB0byBgR1JBTlRgIGEgcGVybWlzc2lvbiBvbiByZXNvdXJjZSB0byB3aGljaCBpdAorY2Fubm90IGJlIGFwcGxpZWQgcmVzdWx0cyBpbiBhbiBlcnJvciByZXNwb25zZS4gVGhlIGZvbGxvd2luZworaWxsdXN0cmF0ZXMgd2hpY2ggcGVybWlzc2lvbnMgY2FuIGJlIGdyYW50ZWQgb24gd2hpY2ggdHlwZXMgb2YgcmVzb3VyY2UsCithbmQgd2hpY2ggc3RhdGVtZW50cyBhcmUgZW5hYmxlZCBieSB0aGF0IHBlcm1pc3Npb24uCisKK1tjb2xzPSIsLCwsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8cGVybWlzc2lvbiB8cmVzb3VyY2UgfG9wZXJhdGlvbnMgfCB8IHwKK3xgQ1JFQVRFYCB8YEFMTCBLRVlTUEFDRVNgIHxgQ1JFQVRFIEtFWVNQQUNFYCA8YnI+IGBDUkVBVEUgVEFCTEVgIGluIGFueQora2V5c3BhY2UgfCB8IHwKKworfGBDUkVBVEVgIHxgS0VZU1BBQ0VgIHxgQ1JFQVRFIFRBQkxFYCBpbiBzcGVjaWZpZWQga2V5c3BhY2UgfCB8IHwKKworfGBDUkVBVEVgIHxgQUxMIEZVTkNUSU9OU2AgfGBDUkVBVEUgRlVOQ1RJT05gIGluIGFueSBrZXlzcGFjZSA8YnI+CitgQ1JFQVRFIEFHR1JFR0FURWAgaW4gYW55IGtleXNwYWNlIHwgfCB8CisKK3xgQ1JFQVRFYCB8YEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHxgQ1JFQVRFIEZVTkNUSU9OYCBpbiBrZXlzcGFjZQorPGJyPiBgQ1JFQVRFIEFHR1JFR0FURWAgaW4ga2V5c3BhY2UgfCB8IHwKKworfGBDUkVBVEVgIHxgQUxMIFJPTEVTYCB8YENSRUFURSBST0xFYCB8IHwgfAorCit8YEFMVEVSYCB8YEFMTCBLRVlTUEFDRVNgIHxgQUxURVIgS0VZU1BBQ0VgIDxicj4gYEFMVEVSIFRBQkxFYCBpbiBhbnkKK2tleXNwYWNlIHwgfCB8CisKK3xgQUxURVJgIHxgS0VZU1BBQ0VgIHxgQUxURVIgS0VZU1BBQ0VgIDxicj4gYEFMVEVSIFRBQkxFYCBpbiBrZXlzcGFjZSB8Cit8IHwKKworfGBBTFRFUmAgfGBUQUJMRWAgfGBBTFRFUiBUQUJMRWAgfCB8IHwKKworfGBBTFRFUmAgfGBBTEwgRlVOQ1RJT05TYCB8YENSRUFURSBGVU5DVElPTmAgcmVwbGFjaW5nIGFueSBleGlzdGluZyA8YnI+CitgQ1JFQVRFIEFHR1JFR0FURWAgcmVwbGFjaW5nIGFueSBleGlzdGluZyB8IHwgfAorCit8YEFMVEVSYCB8YEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHxgQ1JFQVRFIEZVTkNUSU9OYCByZXBsYWNpbmcKK2V4aXN0aW5nIGluIGtleXNwYWNlIDxicj4gYENSRUFURSBBR0dSRUdBVEVgIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgaW4KK2tleXNwYWNlIHwgfCB8CisKK3xgQUxURVJgIHxgRlVOQ1RJT05gIHxgQ1JFQVRFIEZVTkNUSU9OYCByZXBsYWNpbmcgZXhpc3RpbmcgPGJyPgorYENSRUFURSBBR0dSRUdBVEVgIHJlcGxhY2luZyBleGlzdGluZyB8IHwgfAorCit8YEFMVEVSYCB8YEFMTCBST0xFU2AgfGBBTFRFUiBST0xFYCBvbiBhbnkgcm9sZSB8IHwgfAorCit8YEFMVEVSYCB8YFJPTEVgIHxgQUxURVIgUk9MRWAgfCB8IHwKKworfGBEUk9QYCB8YEFMTCBLRVlTUEFDRVNgIHxgRFJPUCBLRVlTUEFDRWAgPGJyPiBgRFJPUCBUQUJMRWAgaW4gYW55CitrZXlzcGFjZSB8IHwgfAorCit8YERST1BgIHxgS0VZU1BBQ0VgIHxgRFJPUCBUQUJMRWAgaW4gc3BlY2lmaWVkIGtleXNwYWNlIHwgfCB8CisKK3xgRFJPUGAgfGBUQUJMRWAgfGBEUk9QIFRBQkxFYCB8IHwgfAorCit8YERST1BgIHxgQUxMIEZVTkNUSU9OU2AgfGBEUk9QIEZVTkNUSU9OYCBpbiBhbnkga2V5c3BhY2UgPGJyPgorYERST1AgQUdHUkVHQVRFYCBpbiBhbnkgZXhpc3RpbmcgfCB8IHwKKworfGBEUk9QYCB8YEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHxgRFJPUCBGVU5DVElPTmAgaW4ga2V5c3BhY2UgPGJyPgorYERST1AgQUdHUkVHQVRFYCBpbiBleGlzdGluZyB8IHwgfAorCit8YERST1BgIHxgRlVOQ1RJT05gIHxgRFJPUCBGVU5DVElPTmAgfCB8IHwKKworfGBEUk9QYCB8YEFMTCBST0xFU2AgfGBEUk9QIFJPTEVgIG9uIGFueSByb2xlIHwgfCB8CisKK3xgRFJPUGAgfGBST0xFYCB8YERST1AgUk9MRWAgfCB8IHwKKworfGBTRUxFQ1RgIHxgQUxMIEtFWVNQQUNFU2AgfGBTRUxFQ1RgIG9uIGFueSB0YWJsZSB8IHwgfAorCit8YFNFTEVDVGAgfGBLRVlTUEFDRWAgfGBTRUxFQ1RgIG9uIGFueSB0YWJsZSBpbiBrZXlzcGFjZSB8IHwgfAorCit8YFNFTEVDVGAgfGBUQUJMRWAgfGBTRUxFQ1RgIG9uIHNwZWNpZmllZCB0YWJsZSB8IHwgfAorCit8YFNFTEVDVGAgfGBBTEwgTUJFQU5TYCB8Q2FsbCBnZXR0ZXIgbWV0aG9kcyBvbiBhbnkgbWJlYW4gfCB8IHwKKworfGBTRUxFQ1RgIHxgTUJFQU5TYCB8Q2FsbCBnZXR0ZXIgbWV0aG9kcyBvbiBhbnkgbWJlYW4gbWF0Y2hpbmcgYQord2lsZGNhcmQgcGF0dGVybiB8IHwgfAorCit8YFNFTEVDVGAgfGBNQkVBTmAgfENhbGwgZ2V0dGVyIG1ldGhvZHMgb24gbmFtZWQgbWJlYW4gfCB8IHwKKworfGBNT0RJRllgIHxgQUxMIEtFWVNQQUNFU2AgfGBJTlNFUlRgIG9uIGFueSB0YWJsZSA8YnI+IGBVUERBVEVgIG9uIGFueQordGFibGUgPGJyPiBgREVMRVRFYCBvbiBhbnkgdGFibGUgPGJyPiBgVFJVTkNBVEVgIG9uIGFueSB0YWJsZSB8IHwgfAorCit8YE1PRElGWWAgfGBLRVlTUEFDRWAgfGBJTlNFUlRgIG9uIGFueSB0YWJsZSBpbiBrZXlzcGFjZSA8YnI+IGBVUERBVEVgCitvbiBhbnkgdGFibGUgaW4ga2V5c3BhY2UgPGJyPiAgIGBERUxFVEVgIG9uIGFueSB0YWJsZSBpbiBrZXlzcGFjZSA8YnI+CitgVFJVTkNBVEVgIG9uIGFueSB0YWJsZSBpbiBrZXlzcGFjZSB8YE1PRElGWWAgfGBUQUJMRWAgfGBJTlNFUlRgIDxicj4KK2BVUERBVEVgIDxicj4gYERFTEVURWAgPGJyPiBgVFJVTkNBVEVgCisKK3xgTU9ESUZZYCB8YEFMTCBNQkVBTlNgIHxDYWxsIHNldHRlciBtZXRob2RzIG9uIGFueSBtYmVhbiB8IHwgfAorCit8YE1PRElGWWAgfGBNQkVBTlNgIHxDYWxsIHNldHRlciBtZXRob2RzIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhCit3aWxkY2FyZCBwYXR0ZXJuIHwgfCB8CisKK3xgTU9ESUZZYCB8YE1CRUFOYCB8Q2FsbCBzZXR0ZXIgbWV0aG9kcyBvbiBuYW1lZCBtYmVhbiB8IHwgfAorCit8YEFVVEhPUklaRWAgfGBBTEwgS0VZU1BBQ0VTYCB8YEdSQU5UIFBFUk1JU1NJT05gIG9uIGFueSB0YWJsZSA8YnI+CitgUkVWT0tFIFBFUk1JU1NJT05gIG9uIGFueSB0YWJsZSB8IHwgfAorCit8YEFVVEhPUklaRWAgfGBLRVlTUEFDRWAgfGBHUkFOVCBQRVJNSVNTSU9OYCBvbiB0YWJsZSBpbiBrZXlzcGFjZSA8YnI+CitgUkVWT0tFIFBFUk1JU1NJT05gIG9uIHRhYmxlIGluIGtleXNwYWNlIHwgfCB8CisKK3xgQVVUSE9SSVpFYCB8YFRBQkxFYCB8YEdSQU5UIFBFUk1JU1NJT05gIDxicj4gYFJFVk9LRSBQRVJNSVNTSU9OYCB8IHwgfAorCit8YEFVVEhPUklaRWAgfGBBTEwgRlVOQ1RJT05TYCB8YEdSQU5UIFBFUk1JU1NJT05gIG9uIGFueSBmdW5jdGlvbiA8YnI+CitgUkVWT0tFIFBFUk1JU1NJT05gIG9uIGFueSBmdW5jdGlvbiB8IHwgfAorCit8YEFVVEhPUklaRWAgfGBBTEwgRlVOQ1RJT05TIElOIEtFWVNQQUNFYCB8YEdSQU5UIFBFUk1JU1NJT05gIGluCitrZXlzcGFjZSA8YnI+IGBSRVZPS0UgUEVSTUlTU0lPTmAgaW4ga2V5c3BhY2UgfCB8IHwKKworfGBBVVRIT1JJWkVgIHxgQUxMIEZVTkNUSU9OUyBJTiBLRVlTUEFDRWAgfGBHUkFOVCBQRVJNSVNTSU9OYCBpbgora2V5c3BhY2UgPGJyPiBgUkVWT0tFIFBFUk1JU1NJT05gIGluIGtleXNwYWNlIHwgfCB8CisKK3xgQVVUSE9SSVpFYCB8YEZVTkNUSU9OYCB8YEdSQU5UIFBFUk1JU1NJT05gIDxicj4gYFJFVk9LRSBQRVJNSVNTSU9OYCB8Cit8IHwKKworfGBBVVRIT1JJWkVgIHxgQUxMIE1CRUFOU2AgfGBHUkFOVCBQRVJNSVNTSU9OYCBvbiBhbnkgbWJlYW4gPGJyPgorYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBhbnkgbWJlYW4gfCB8IHwKKworfGBBVVRIT1JJWkVgIHxgTUJFQU5TYCB8YEdSQU5UIFBFUk1JU1NJT05gIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhCit3aWxkY2FyZCBwYXR0ZXJuIDxicj4gYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBhbnkgbWJlYW4gbWF0Y2hpbmcgYQord2lsZGNhcmQgcGF0dGVybiB8IHwgfAorCit8YEFVVEhPUklaRWAgfGBNQkVBTmAgfGBHUkFOVCBQRVJNSVNTSU9OYCBvbiBuYW1lZCBtYmVhbiA8YnI+CitgUkVWT0tFIFBFUk1JU1NJT05gIG9uIG5hbWVkIG1iZWFuIHwgfCB8CisKK3xgQVVUSE9SSVpFYCB8YEFMTCBST0xFU2AgfGBHUkFOVCBST0xFYCBncmFudCBhbnkgcm9sZSA8YnI+CitgUkVWT0tFIFJPTEVgIHJldm9rZSBhbnkgcm9sZSB8IHwgfAorCit8YEFVVEhPUklaRWAgfGBST0xFU2AgfGBHUkFOVCBST0xFYCBncmFudCByb2xlIDxicj4gYFJFVk9LRSBST0xFYCByZXZva2UKK3JvbGUgfCB8IHwKKworfGBERVNDUklCRWAgfGBBTEwgUk9MRVNgIHxgTElTVCBST0xFU2AgYWxsIHJvbGVzIG9yIG9ubHkgcm9sZXMgZ3JhbnRlZAordG8gYW5vdGhlciwgc3BlY2lmaWVkIHJvbGUgfCB8IHwKKworfGBERVNDUklCRWAgfEBBTEwgTUJFQU5TIHxSZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBhbnkgbWJlYW4gZnJvbSB0aGUKK3BsYXRmb3Jt4oCZcyBNQmVhblNlcnZlciB8IHwgfAorCit8YERFU0NSSUJFYCB8QE1CRUFOUyB8UmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgYW55IG1iZWFuIG1hdGNoaW5nIGEKK3dpbGRjYXJkIHBhdHRlciBmcm9tIHRoZSBwbGF0Zm9ybeKAmXMgTUJlYW5TZXJ2ZXIgfCB8IHwKKworfGBERVNDUklCRWAgfEBNQkVBTiB8UmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgYSBuYW1lZCBtYmVhbiBmcm9tIHRoZQorcGxhdGZvcm3igJlzIE1CZWFuU2VydmVyIHwgfCB8CisKK3xgRVhFQ1VURWAgfGBBTEwgRlVOQ1RJT05TYCB8YFNFTEVDVGAsIGBJTlNFUlRgLCBgVVBEQVRFYCB1c2luZyBhbnkKK2Z1bmN0aW9uIDxicj4gdXNlIG9mIGFueSBmdW5jdGlvbiBpbiBgQ1JFQVRFIEFHR1JFR0FURWAgfCB8IHwKKworfGBFWEVDVVRFYCB8YEFMTCBGVU5DVElPTlMgSU4gS0VZU1BBQ0VgIHxgU0VMRUNUYCwgYElOU0VSVGAsIGBVUERBVEVgCit1c2luZyBhbnkgZnVuY3Rpb24gaW4ga2V5c3BhY2UgPGJyPiB1c2Ugb2YgYW55IGZ1bmN0aW9uIGluIGtleXNwYWNlIGluCitgQ1JFQVRFIEFHR1JFR0FURWAgfCB8IHwKKworfGBFWEVDVVRFYCB8YEZVTkNUSU9OYCB8YFNFTEVDVGAsIGBJTlNFUlRgLCBgVVBEQVRFYCB1c2luZyBmdW5jdGlvbiA8YnI+Cit1c2Ugb2YgZnVuY3Rpb24gaW4gYENSRUFURSBBR0dSRUdBVEVgIHwgfCB8CisKK3xgRVhFQ1VURWAgfGBBTEwgTUJFQU5TYCB8RXhlY3V0ZSBvcGVyYXRpb25zIG9uIGFueSBtYmVhbiB8IHwgfAorCit8YEVYRUNVVEVgIHxgTUJFQU5TYCB8RXhlY3V0ZSBvcGVyYXRpb25zIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhCit3aWxkY2FyZCBwYXR0ZXJuIHwgfCB8CisKK3xgRVhFQ1VURWAgfGBNQkVBTmAgfEV4ZWN1dGUgb3BlcmF0aW9ucyBvbiBuYW1lZCBtYmVhbiB8IHwgfAorCit8YFVOTUFTS2AgfGBBTEwgS0VZU1BBQ0VTYCB8U2VlIHRoZSBjbGVhciBjb250ZW50cyBvZiBtYXNrZWQgY29sdW1ucyBvbiBhbnkgdGFibGUgfCB8IHwKKworfGBVTk1BU0tgIHxgS0VZU1BBQ0VgIHxTZWUgdGhlIGNsZWFyIGNvbnRlbnRzIG9mIG1hc2tlZCBjb2x1bW5zIG9uIGFueSB0YWJsZSBpbiBrZXlzcGFjZSB8IHwgfAorCit8YFVOTUFTS2AgfGBUQUJMRWAgfFNlZSB0aGUgY2xlYXIgY29udGVudHMgb2YgbWFza2VkIGNvbHVtbnMgb24gdGhlIHNwZWNpZmllZCB0YWJsZSB8IHwgfAorCit8YFNFTEVDVF9NQVNLRURgIHwgYEFMTCBLRVlTUEFDRVNgIHwgYFNFTEVDVGAgcmVzdHJpY3RpbmcgbWFza2VkIGNvbHVtbnMgb24gYW55IHRhYmxlIHwgfCB8CisKK3xgU0VMRUNUX01BU0tFRGAgfCBgS0VZU1BBQ0VgIHwgYFNFTEVDVGAgcmVzdHJpY3RpbmcgbWFza2VkIGNvbHVtbnMgb24gYW55IHRhYmxlIGluIHNwZWNpZmllZCBrZXlzcGFjZSB8IHwgfAorCit8YFNFTEVDVF9NQVNLRURgIHwgYFRBQkxFYCB8IGBTRUxFQ1RgIHJlc3RyaWN0aW5nIG1hc2tlZCBjb2x1bW5zIG9uIHRoZSBzcGVjaWZpZWQgdGFibGUgfCB8IHwKK3w9PT0KKworW1tncmFudFBlcm1pc3Npb25zU3RtdF1dCis9PT09IEdSQU5UIFBFUk1JU1NJT04KKworX1N5bnRheDpfCisKK2JjKHN5bnRheCkuLiArCis6Oj0gR1JBTlQgKCBBTEwgKCBQRVJNSVNTSU9OUyApPyB8ICggUEVSTUlTU0lPTiApPyApIE9OIFRPCisKKzo6PSBDUkVBVEUgfCBBTFRFUiB8IERST1AgfCBTRUxFQ1QgfCBNT0RJRlkgfCBBVVRIT1JJWkUgfCBERVNSSUJFIHwgVU5NQVNLIHwgU0VMRUNUX01BU0tFRAorRVhFQ1VURQorCis6Oj0gQUxMIEtFWVNQQUNFUyArCit8IEtFWVNQQUNFICArCit8ICggVEFCTEUgKT8gICsKK3wgQUxMIFJPTEVTICsKK3wgUk9MRSAgKworfCBBTEwgRlVOQ1RJT05TICggSU4gS0VZU1BBQ0UgKT8gKworfCBGVU5DVElPTiAgKworfCBBTEwgTUJFQU5TICsKK3wgKCBNQkVBTiB8IE1CRUFOUyApICArCitwLgorCitfU2FtcGxlOl8KKworYmMoc2FtcGxlKS4gKworR1JBTlQgU0VMRUNUIE9OIEFMTCBLRVlTUEFDRVMgVE8gZGF0YV9yZWFkZXI7CisKK1RoaXMgZ2l2ZXMgYW55IHVzZXIgd2l0aCB0aGUgcm9sZSBgZGF0YV9yZWFkZXJgIHBlcm1pc3Npb24gdG8gZXhlY3V0ZQorYFNFTEVDVGAgc3RhdGVtZW50cyBvbiBhbnkgdGFibGUgYWNyb3NzIGFsbCBrZXlzcGFjZXMKKworYmMoc2FtcGxlKS4gKworR1JBTlQgTU9ESUZZIE9OIEtFWVNQQUNFIGtleXNwYWNlMSBUTyBkYXRhX3dyaXRlcjsKKworVGhpcyBnaXZlIGFueSB1c2VyIHdpdGggdGhlIHJvbGUgYGRhdGFfd3JpdGVyYCBwZXJtaXNzaW9uIHRvIHBlcmZvcm0KK2BVUERBVEVgLCBgSU5TRVJUYCwgYFVQREFURWAsIGBERUxFVEVgIGFuZCBgVFJVTkNBVEVgIHF1ZXJpZXMgb24gYWxsCit0YWJsZXMgaW4gdGhlIGBrZXlzcGFjZTFgIGtleXNwYWNlCisKK2JjKHNhbXBsZSkuICsKK0dSQU5UIERST1AgT04ga2V5c3BhY2UxLnRhYmxlMSBUTyBzY2hlbWFfb3duZXI7CisKK1RoaXMgZ2l2ZXMgYW55IHVzZXIgd2l0aCB0aGUgYHNjaGVtYV9vd25lcmAgcm9sZSBwZXJtaXNzaW9ucyB0byBgRFJPUGAKK2BrZXlzcGFjZTEudGFibGUxYC4KKworYmMoc2FtcGxlKS4gKworR1JBTlQgRVhFQ1VURSBPTiBGVU5DVElPTiBrZXlzcGFjZTEudXNlcl9mdW5jdGlvbiggaW50ICkgVE8KK3JlcG9ydF93cml0ZXI7CisKK1RoaXMgZ3JhbnRzIGFueSB1c2VyIHdpdGggdGhlIGByZXBvcnRfd3JpdGVyYCByb2xlIHBlcm1pc3Npb24gdG8gZXhlY3V0ZQorYFNFTEVDVGAsIGBJTlNFUlRgIGFuZCBgVVBEQVRFYCBxdWVyaWVzIHdoaWNoIHVzZSB0aGUgZnVuY3Rpb24KK2BrZXlzcGFjZTEudXNlcl9mdW5jdGlvbiggaW50IClgCisKK2JjKHNhbXBsZSkuICsKK0dSQU5UIERFU0NSSUJFIE9OIEFMTCBST0xFUyBUTyByb2xlX2FkbWluOworCitUaGlzIGdyYW50cyBhbnkgdXNlciB3aXRoIHRoZSBgcm9sZV9hZG1pbmAgcm9sZSBwZXJtaXNzaW9uIHRvIHZpZXcgYW55CithbmQgYWxsIHJvbGVzIGluIHRoZSBzeXN0ZW0gd2l0aCBhIGBMSVNUIFJPTEVTYCBzdGF0ZW1lbnQKKworW1tncmFudEFsbF1dCis9PT09PSBHUkFOVCBBTEwKKworV2hlbiB0aGUgYEdSQU5UIEFMTGAgZm9ybSBpcyB1c2VkLCB0aGUgYXBwcm9wcmlhdGUgc2V0IG9mIHBlcm1pc3Npb25zIGlzCitkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gdGhlIHRhcmdldCByZXNvdXJjZS4KKworW1thdXRvR3JhbnRQZXJtaXNzaW9uc11dCis9PT09PSBBdXRvbWF0aWMgR3JhbnRpbmcKKworV2hlbiBhIHJlc291cmNlIGlzIGNyZWF0ZWQsIHZpYSBhIGBDUkVBVEUgS0VZU1BBQ0VgLCBgQ1JFQVRFIFRBQkxFYCwKK2BDUkVBVEUgRlVOQ1RJT05gLCBgQ1JFQVRFIEFHR1JFR0FURWAgb3IgYENSRUFURSBST0xFYCBzdGF0ZW1lbnQsIHRoZQorY3JlYXRvciAodGhlIHJvbGUgdGhlIGRhdGFiYXNlIHVzZXIgd2hvIGlzc3VlcyB0aGUgc3RhdGVtZW50IGlzCitpZGVudGlmaWVkIGFzKSwgaXMgYXV0b21hdGljYWxseSBncmFudGVkIGFsbCBhcHBsaWNhYmxlIHBlcm1pc3Npb25zIG9uCit0aGUgbmV3IHJlc291cmNlLgorCitbW3Jldm9rZVBlcm1pc3Npb25zU3RtdF1dCis9PT09IFJFVk9LRSBQRVJNSVNTSU9OCisKK19TeW50YXg6XworCitiYyhzeW50YXgpLi4gKworOjo9IFJFVk9LRSAoIEFMTCAoIFBFUk1JU1NJT05TICk/IHwgKCBQRVJNSVNTSU9OICk/ICkgT04gRlJPTQorCis6Oj0gQ1JFQVRFIHwgQUxURVIgfCBEUk9QIHwgU0VMRUNUIHwgTU9ESUZZIHwgQVVUSE9SSVpFIHwgREVTUklCRSB8IFVOTUFTSyB8IFNFTEVDVF9NQVNLRUQKK0VYRUNVVEUKKworOjo9IEFMTCBLRVlTUEFDRVMgKworfCBLRVlTUEFDRSAgKworfCAoIFRBQkxFICk/ICArCit8IEFMTCBST0xFUyArCit8IFJPTEUgICsKK3wgQUxMIEZVTkNUSU9OUyAoIElOIEtFWVNQQUNFICk/ICsKK3wgRlVOQ1RJT04gICsKK3wgQUxMIE1CRUFOUyArCit8ICggTUJFQU4gfCBNQkVBTlMgKSAgKworcC4KKworX1NhbXBsZTpfCisKK2JjKHNhbXBsZSkuLiArCitSRVZPS0UgU0VMRUNUIE9OIEFMTCBLRVlTUEFDRVMgRlJPTSBkYXRhX3JlYWRlcjsgKworUkVWT0tFIE1PRElGWSBPTiBLRVlTUEFDRSBrZXlzcGFjZTEgRlJPTSBkYXRhX3dyaXRlcjsgKworUkVWT0tFIERST1AgT04ga2V5c3BhY2UxLnRhYmxlMSBGUk9NIHNjaGVtYV9vd25lcjsgKworUkVWT0tFIEVYRUNVVEUgT04gRlVOQ1RJT04ga2V5c3BhY2UxLnVzZXJfZnVuY3Rpb24oIGludCApIEZST00KK3JlcG9ydF93cml0ZXI7ICsKK1JFVk9LRSBERVNDUklCRSBPTiBBTEwgUk9MRVMgRlJPTSByb2xlX2FkbWluOyArCitwLgorCitbW2xpc3RQZXJtaXNzaW9uc1N0bXRdXQorPT09PT0gTElTVCBQRVJNSVNTSU9OUworCitfU3ludGF4Ol8KKworYmMoc3ludGF4KS4uICsKKzo6PSBMSVNUICggQUxMICggUEVSTUlTU0lPTlMgKT8gfCApICsKKyggT04gKT8gKworKCBPRiAoIE5PUkVDVVJTSVZFICk/ICk/CisKKzo6PSBBTEwgS0VZU1BBQ0VTICsKK3wgS0VZU1BBQ0UgICsKK3wgKCBUQUJMRSApPyAgKworfCBBTEwgUk9MRVMgKworfCBST0xFICArCit8IEFMTCBGVU5DVElPTlMgKCBJTiBLRVlTUEFDRSApPyArCit8IEZVTkNUSU9OICArCit8IEFMTCBNQkVBTlMgKworfCAoIE1CRUFOIHwgTUJFQU5TICkgICsKK3AuCisKK19TYW1wbGU6XworCitiYyhzYW1wbGUpLiArCitMSVNUIEFMTCBQRVJNSVNTSU9OUyBPRiBhbGljZTsKKworU2hvdyBhbGwgcGVybWlzc2lvbnMgZ3JhbnRlZCB0byBgYWxpY2VgLCBpbmNsdWRpbmcgdGhvc2UgYWNxdWlyZWQKK3RyYW5zaXRpdmVseSBmcm9tIGFueSBvdGhlciByb2xlcy4KKworYmMoc2FtcGxlKS4gKworTElTVCBBTEwgUEVSTUlTU0lPTlMgT04ga2V5c3BhY2UxLnRhYmxlMSBPRiBib2I7CisKK1Nob3cgYWxsIHBlcm1pc3Npb25zIG9uIGBrZXlzcGFjZTEudGFibGUxYCBncmFudGVkIHRvIGBib2JgLCBpbmNsdWRpbmcKK3Rob3NlIGFjcXVpcmVkIHRyYW5zaXRpdmVseSBmcm9tIGFueSBvdGhlciByb2xlcy4gVGhpcyBhbHNvIGluY2x1ZGVzIGFueQorcGVybWlzc2lvbnMgaGlnaGVyIHVwIHRoZSByZXNvdXJjZSBoaWVyYXJjaHkgd2hpY2ggY2FuIGJlIGFwcGxpZWQgdG8KK2BrZXlzcGFjZTEudGFibGUxYC4gRm9yIGV4YW1wbGUsIHNob3VsZCBgYm9iYCBoYXZlIGBBTFRFUmAgcGVybWlzc2lvbiBvbgorYGtleXNwYWNlMWAsIHRoYXQgd291bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdHMgb2YgdGhpcyBxdWVyeS4gQWRkaW5nCit0aGUgYE5PUkVDVVJTSVZFYCBzd2l0Y2ggcmVzdHJpY3RzIHRoZSByZXN1bHRzIHRvIG9ubHkgdGhvc2UgcGVybWlzc2lvbnMKK3doaWNoIHdlcmUgZGlyZWN0bHkgZ3JhbnRlZCB0byBgYm9iYCBvciBvbmUgb2YgYGJvYmDigJlzIHJvbGVzLgorCitiYyhzYW1wbGUpLiArCitMSVNUIFNFTEVDVCBQRVJNSVNTSU9OUyBPRiBjYXJsb3M7CisKK1Nob3cgYW55IHBlcm1pc3Npb25zIGdyYW50ZWQgdG8gYGNhcmxvc2Agb3IgYW55IG9mIGBjYXJsb3Ng4oCZcyByb2xlcywKK2xpbWl0ZWQgdG8gYFNFTEVDVGAgcGVybWlzc2lvbnMgb24gYW55IHJlc291cmNlLgorCitbW3R5cGVzXV0KKz09PSBEYXRhIFR5cGVzCisKK0NRTCBzdXBwb3J0cyBhIHJpY2ggc2V0IG9mIGRhdGEgdHlwZXMgZm9yIGNvbHVtbnMgZGVmaW5lZCBpbiBhIHRhYmxlLAoraW5jbHVkaW5nIGNvbGxlY3Rpb24gdHlwZXMuIE9uIHRvcCBvZiB0aG9zZSBuYXRpdmUgKworYW5kIGNvbGxlY3Rpb24gdHlwZXMsIHVzZXJzIGNhbiBhbHNvIHByb3ZpZGUgY3VzdG9tIHR5cGVzICh0aHJvdWdoIGEKK0pBVkEgY2xhc3MgZXh0ZW5kaW5nIGBBYnN0cmFjdFR5cGVgIGxvYWRhYmxlIGJ5ICsKK0Nhc3NhbmRyYSkuIFRoZSBzeW50YXggb2YgdHlwZXMgaXMgdGh1czoKKworYmMoc3ludGF4KS4uICsKKzo6PSAgKworfCAgKworfCAgKworfCAvLyBVc2VkIGZvciBjdXN0b20gdHlwZXMuIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhIEpBVkEgY2xhc3MKKworOjo9IGFzY2lpICsKK3wgYmlnaW50ICsKK3wgYmxvYiArCit8IGJvb2xlYW4gKworfCBjb3VudGVyICsKK3wgZGF0ZSArCit8IGRlY2ltYWwgKworfCBkb3VibGUgKworfCBmbG9hdCArCit8IGluZXQgKworfCBpbnQgKworfCBzbWFsbGludCArCit8IHRleHQgKworfCB0aW1lICsKK3wgdGltZXN0YW1wICsKK3wgdGltZXV1aWQgKworfCB0aW55aW50ICsKK3wgdXVpZCArCit8IHZhcmNoYXIgKworfCB2YXJpbnQKKworOjo9IGxpc3QgYDwnIGA+JyArCit8IHNldCBgPCcgYD4nICsKK3wgbWFwIGA8JyBgLCcgYD4nICsKKzo6PSB0dXBsZSBgPCcgKGAsJyApKiBgPicgKworcC4gTm90ZSB0aGF0IHRoZSBuYXRpdmUgdHlwZXMgYXJlIGtleXdvcmRzIGFuZCBhcyBzdWNoIGFyZQorY2FzZS1pbnNlbnNpdGl2ZS4gVGhleSBhcmUgaG93ZXZlciBub3QgcmVzZXJ2ZWQgb25lcy4KKworVGhlIGZvbGxvd2luZyB0YWJsZSBnaXZlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9ucyBvbiB0aGUgbmF0aXZlIGRhdGEKK3R5cGVzLCBhbmQgb24gd2hpY2gga2luZCBvZiBsaW5rOiNjb25zdGFudHNbY29uc3RhbnRzXSBlYWNoIHR5cGUKK3N1cHBvcnRzOgorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfHR5cGUgfGNvbnN0YW50cyBzdXBwb3J0ZWQgfGRlc2NyaXB0aW9uCit8YGFzY2lpYCB8c3RyaW5ncyB8QVNDSUkgY2hhcmFjdGVyIHN0cmluZworCit8YGJpZ2ludGAgfGludGVnZXJzIHw2NC1iaXQgc2lnbmVkIGxvbmcKKworfGBibG9iYCB8YmxvYnMgfEFyYml0cmFyeSBieXRlcyAobm8gdmFsaWRhdGlvbikKKworfGBib29sZWFuYCB8Ym9vbGVhbnMgfHRydWUgb3IgZmFsc2UKKworfGBjb3VudGVyYCB8aW50ZWdlcnMgfENvdW50ZXIgY29sdW1uICg2NC1iaXQgc2lnbmVkIHZhbHVlKS4gU2VlCitsaW5rOiNjb3VudGVyc1tDb3VudGVyc10gZm9yIGRldGFpbHMKKworfGBkYXRlYCB8aW50ZWdlcnMsIHN0cmluZ3MgfEEgZGF0ZSAod2l0aCBubyBjb3JyZXNwb25kaW5nIHRpbWUgdmFsdWUpLgorU2VlIGxpbms6I3VzaW5nZGF0ZXNbV29ya2luZyB3aXRoIGRhdGVzXSBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworfGBkZWNpbWFsYCB8aW50ZWdlcnMsIGZsb2F0cyB8VmFyaWFibGUtcHJlY2lzaW9uIGRlY2ltYWwKKworfGBkb3VibGVgIHxpbnRlZ2VycyB8NjQtYml0IElFRUUtNzU0IGZsb2F0aW5nIHBvaW50CisKK3xgZmxvYXRgIHxpbnRlZ2VycywgZmxvYXRzIHwzMi1iaXQgSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQKKworfGBpbmV0YCB8c3RyaW5ncyB8QW4gSVAgYWRkcmVzcy4gSXQgY2FuIGJlIGVpdGhlciA0IGJ5dGVzIGxvbmcgKElQdjQpIG9yCisxNiBieXRlcyBsb25nIChJUHY2KS4gVGhlcmUgaXMgbm8gYGluZXRgIGNvbnN0YW50LCBJUCBhZGRyZXNzIHNob3VsZCBiZQoraW5wdXRlZCBhcyBzdHJpbmdzCisKK3xgaW50YCB8aW50ZWdlcnMgfDMyLWJpdCBzaWduZWQgaW50CisKK3xgc21hbGxpbnRgIHxpbnRlZ2VycyB8MTYtYml0IHNpZ25lZCBpbnQKKworfGB0ZXh0YCB8c3RyaW5ncyB8VVRGOCBlbmNvZGVkIHN0cmluZworCit8YHRpbWVgIHxpbnRlZ2Vycywgc3RyaW5ncyB8QSB0aW1lIHdpdGggbmFub3NlY29uZCBwcmVjaXNpb24uIFNlZQorbGluazojdXNpbmd0aW1lW1dvcmtpbmcgd2l0aCB0aW1lXSBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworfGB0aW1lc3RhbXBgIHxpbnRlZ2Vycywgc3RyaW5ncyB8QSB0aW1lc3RhbXAuIFN0cmluZ3MgY29uc3RhbnQgYXJlIGFsbG93Cit0byBpbnB1dCB0aW1lc3RhbXBzIGFzIGRhdGVzLCBzZWUgbGluazojdXNpbmd0aW1lc3RhbXBzW1dvcmtpbmcgd2l0aAordGltZXN0YW1wc10gYmVsb3cgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK3xgdGltZXV1aWRgIHx1dWlkcyB8VHlwZSAxIFVVSUQuIFRoaXMgaXMgZ2VuZXJhbGx5IHVzZWQgYXMgYQorYGBjb25mbGljdC1mcmVlJycgdGltZXN0YW1wLiBBbHNvIHNlZSB0aGUgbGluazojdGltZXV1aWRGdW5bZnVuY3Rpb25zIG9uCitUaW1ldXVpZF0KKworfGB0aW55aW50YCB8aW50ZWdlcnMgfDgtYml0IHNpZ25lZCBpbnQKKworfGB1dWlkYCB8dXVpZHMgfFR5cGUgMSBvciB0eXBlIDQgVVVJRAorCit8YHZhcmNoYXJgIHxzdHJpbmdzIHxVVEY4IGVuY29kZWQgc3RyaW5nCisKK3xgdmFyaW50YCB8aW50ZWdlcnMgfEFyYml0cmFyeS1wcmVjaXNpb24gaW50ZWdlcgorfD09PQorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoZSBjb2xsZWN0aW9uIHR5cGVzLCBzZWUgdGhlCitsaW5rOiNjb2xsZWN0aW9uc1tXb3JraW5nIHdpdGggY29sbGVjdGlvbnNdIHNlY3Rpb24gYmVsb3cuCisKK1tbdXNpbmd0aW1lc3RhbXBzXV0KKz09PT0gV29ya2luZyB3aXRoIHRpbWVzdGFtcHMKKworVmFsdWVzIG9mIHRoZSBgdGltZXN0YW1wYCB0eXBlIGFyZSBlbmNvZGVkIGFzIDY0LWJpdCBzaWduZWQgaW50ZWdlcnMKK3JlcHJlc2VudGluZyBhIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlIHN0YW5kYXJkIGJhc2UgdGltZSBrbm93bgorYXMgYGB0aGUgZXBvY2gnJzogSmFudWFyeSAxIDE5NzAgYXQgMDA6MDA6MDAgR01ULgorCitUaW1lc3RhbXAgY2FuIGJlIGlucHV0IGluIENRTCBhcyBzaW1wbGUgbG9uZyBpbnRlZ2VycywgZ2l2aW5nIHRoZSBudW1iZXIKK29mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2gsIGFzIGRlZmluZWQgYWJvdmUuCisKK1RoZXkgY2FuIGFsc28gYmUgaW5wdXQgYXMgc3RyaW5nIGxpdGVyYWxzIGluIGFueSBvZiB0aGUgZm9sbG93aW5nIElTTworODYwMSBmb3JtYXRzLCBlYWNoIHJlcHJlc2VudGluZyB0aGUgdGltZSBhbmQgZGF0ZSBNYXIgMiwgMjAxMSwgYXQKKzA0OjA1OjAwIEFNLCBHTVQuOgorCisqIGAyMDExLTAyLTAzIDA0OjA1KzAwMDBgCisqIGAyMDExLTAyLTAzIDA0OjA1OjAwKzAwMDBgCisqIGAyMDExLTAyLTAzIDA0OjA1OjAwLjAwMCswMDAwYAorKiBgMjAxMS0wMi0wM1QwNDowNSswMDAwYAorKiBgMjAxMS0wMi0wM1QwNDowNTowMCswMDAwYAorKiBgMjAxMS0wMi0wM1QwNDowNTowMC4wMDArMDAwMGAKKworVGhlIGArMDAwMGAgYWJvdmUgaXMgYW4gUkZDIDgyMiA0LWRpZ2l0IHRpbWUgem9uZSBzcGVjaWZpY2F0aW9uOyBgKzAwMDBgCityZWZlcnMgdG8gR01ULiBVUyBQYWNpZmljIFN0YW5kYXJkIFRpbWUgaXMgYC0wODAwYC4gVGhlIHRpbWUgem9uZSBtYXkgYmUKK29taXR0ZWQgaWYgZGVzaXJlZOKAlCB0aGUgZGF0ZSB3aWxsIGJlIGludGVycHJldGVkIGFzIGJlaW5nIGluIHRoZSB0aW1lCit6b25lIHVuZGVyIHdoaWNoIHRoZSBjb29yZGluYXRpbmcgQ2Fzc2FuZHJhIG5vZGUgaXMgY29uZmlndXJlZC4KKworKiBgMjAxMS0wMi0wMyAwNDowNWAKKyogYDIwMTEtMDItMDMgMDQ6MDU6MDBgCisqIGAyMDExLTAyLTAzIDA0OjA1OjAwLjAwMGAKKyogYDIwMTEtMDItMDNUMDQ6MDVgCisqIGAyMDExLTAyLTAzVDA0OjA1OjAwYAorKiBgMjAxMS0wMi0wM1QwNDowNTowMC4wMDBgCisKK1RoZXJlIGFyZSBjbGVhciBkaWZmaWN1bHRpZXMgaW5oZXJlbnQgaW4gcmVseWluZyBvbiB0aGUgdGltZSB6b25lCitjb25maWd1cmF0aW9uIGJlaW5nIGFzIGV4cGVjdGVkLCB0aG91Z2gsIHNvIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlCit0aW1lIHpvbmUgYWx3YXlzIGJlIHNwZWNpZmllZCBmb3IgdGltZXN0YW1wcyB3aGVuIGZlYXNpYmxlLgorCitUaGUgdGltZSBvZiBkYXkgbWF5IGFsc28gYmUgb21pdHRlZCwgaWYgdGhlIGRhdGUgaXMgdGhlIG9ubHkgcGllY2UgdGhhdAorbWF0dGVyczoKKworKiBgMjAxMS0wMi0wM2AKKyogYDIwMTEtMDItMDMrMDAwMGAKKworSW4gdGhhdCBjYXNlLCB0aGUgdGltZSBvZiBkYXkgd2lsbCBkZWZhdWx0IHRvIDAwOjAwOjAwLCBpbiB0aGUgc3BlY2lmaWVkCitvciBkZWZhdWx0IHRpbWUgem9uZS4KKworW1t1c2luZ2RhdGVzXV0KKz09PT0gV29ya2luZyB3aXRoIGRhdGVzCisKK1ZhbHVlcyBvZiB0aGUgYGRhdGVgIHR5cGUgYXJlIGVuY29kZWQgYXMgMzItYml0IHVuc2lnbmVkIGludGVnZXJzCityZXByZXNlbnRpbmcgYSBudW1iZXIgb2YgZGF5cyB3aXRoIGBgdGhlIGVwb2NoJycgYXQgdGhlIGNlbnRlciBvZiB0aGUKK3JhbmdlICgyXjMxKS4gRXBvY2ggaXMgSmFudWFyeSAxc3QsIDE5NzAKKworQSBkYXRlIGNhbiBiZSBpbnB1dCBpbiBDUUwgYXMgYW4gdW5zaWduZWQgaW50ZWdlciBhcyBkZWZpbmVkIGFib3ZlLgorCitUaGV5IGNhbiBhbHNvIGJlIGlucHV0IGFzIHN0cmluZyBsaXRlcmFscyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKworKiBgMjAxNC0wMS0wMWAKKworW1t1c2luZ3RpbWVdXQorPT09PSBXb3JraW5nIHdpdGggdGltZQorCitWYWx1ZXMgb2YgdGhlIGB0aW1lYCB0eXBlIGFyZSBlbmNvZGVkIGFzIDY0LWJpdCBzaWduZWQgaW50ZWdlcnMKK3JlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHNpbmNlIG1pZG5pZ2h0LgorCitBIHRpbWUgY2FuIGJlIGlucHV0IGluIENRTCBhcyBzaW1wbGUgbG9uZyBpbnRlZ2VycywgZ2l2aW5nIHRoZSBudW1iZXIgb2YKK25hbm9zZWNvbmRzIHNpbmNlIG1pZG5pZ2h0LgorCitUaGV5IGNhbiBhbHNvIGJlIGlucHV0IGFzIHN0cmluZyBsaXRlcmFscyBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZworZm9ybWF0czoKKworKiBgMDg6MTI6NTRgCisqIGAwODoxMjo1NC4xMjNgCisqIGAwODoxMjo1NC4xMjM0NTZgCisqIGAwODoxMjo1NC4xMjM0NTY3ODlgCisKKz09PT0gQ291bnRlcnMKKworVGhlIGBjb3VudGVyYCB0eXBlIGlzIHVzZWQgdG8gZGVmaW5lIF9jb3VudGVyIGNvbHVtbnNfLiBBIGNvdW50ZXIgY29sdW1uCitpcyBhIGNvbHVtbiB3aG9zZSB2YWx1ZSBpcyBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciBhbmQgb24gd2hpY2ggMgorb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkOiBpbmNyZW1lbnRhdGlvbiBhbmQgZGVjcmVtZW50YXRpb24gKHNlZQorbGluazojdXBkYXRlU3RtdFtgVVBEQVRFYF0gZm9yIHN5bnRheCkuIE5vdGUgdGhlIHZhbHVlIG9mIGEgY291bnRlcgorY2Fubm90IGJlIHNldC4gQSBjb3VudGVyIGRvZXNu4oCZdCBleGlzdCB1bnRpbCBmaXJzdAoraW5jcmVtZW50ZWQvZGVjcmVtZW50ZWQsIGFuZCB0aGUgZmlyc3QgaW5jcmVtZW50YXRpb24vZGVjcmVtZW50YXRpb24gaXMKK21hZGUgYXMgaWYgdGhlIHByZXZpb3VzIHZhbHVlIHdhcyAwLiBEZWxldGlvbiBvZiBjb3VudGVyIGNvbHVtbnMgaXMKK3N1cHBvcnRlZCBidXQgaGF2ZSBzb21lIGxpbWl0YXRpb25zIChzZWUgdGhlCitodHRwOi8vd2lraS5hcGFjaGUub3JnL2Nhc3NhbmRyYS9Db3VudGVyc1tDYXNzYW5kcmEgV2lraV0gZm9yIG1vcmUKK2luZm9ybWF0aW9uKS4KKworVGhlIHVzZSBvZiB0aGUgY291bnRlciB0eXBlIGlzIGxpbWl0ZWQgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisKKyogSXQgY2Fubm90IGJlIHVzZWQgZm9yIGNvbHVtbiB0aGF0IGlzIHBhcnQgb2YgdGhlIGBQUklNQVJZIEtFWWAgb2YgYQordGFibGUuCisqIEEgdGFibGUgdGhhdCBjb250YWlucyBhIGNvdW50ZXIgY2FuIG9ubHkgY29udGFpbiBjb3VudGVycy4gSW4gb3RoZXIKK3dvcmRzLCBlaXRoZXIgYWxsIHRoZSBjb2x1bW5zIG9mIGEgdGFibGUgb3V0c2lkZSB0aGUgYFBSSU1BUlkgS0VZYCBoYXZlCit0aGUgY291bnRlciB0eXBlLCBvciBub25lIG9mIHRoZW0gaGF2ZSBpdC4KKworW1tjb2xsZWN0aW9uc11dCis9PT09IFdvcmtpbmcgd2l0aCBjb2xsZWN0aW9ucworCis9PT09PSBOb3Rld29ydGh5IGNoYXJhY3RlcmlzdGljcworCitDb2xsZWN0aW9ucyBhcmUgbWVhbnQgZm9yIHN0b3JpbmcvZGVub3JtYWxpemluZyByZWxhdGl2ZWx5IHNtYWxsIGFtb3VudAorb2YgZGF0YS4gVGhleSB3b3JrIHdlbGwgZm9yIHRoaW5ncyBsaWtlIGBgdGhlIHBob25lIG51bWJlcnMgb2YgYSBnaXZlbgordXNlcicnLCBgYGxhYmVscyBhcHBsaWVkIHRvIGFuIGVtYWlsJycsIGV0Yy4gQnV0IHdoZW4gaXRlbXMgYXJlIGV4cGVjdGVkCit0byBncm93IHVuYm91bmRlZCAoYGBhbGwgdGhlIG1lc3NhZ2VzIHNlbnQgYnkgYSBnaXZlbiB1c2VyJycsIGBgZXZlbnRzCityZWdpc3RlcmVkIGJ5IGEgc2Vuc29yJycsIOKApiksIHRoZW4gY29sbGVjdGlvbnMgYXJlIG5vdCBhcHByb3ByaWF0ZQorYW55bW9yZSBhbmQgYSBzcGVjaWZpYyB0YWJsZSAod2l0aCBjbHVzdGVyaW5nIGNvbHVtbnMpIHNob3VsZCBiZSB1c2VkLgorQ29uY3JldGVseSwgY29sbGVjdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIGxpbWl0YXRpb25zOgorCisqIENvbGxlY3Rpb25zIGFyZSBhbHdheXMgcmVhZCBpbiB0aGVpciBlbnRpcmV0eSAoYW5kIHJlYWRpbmcgb25lIGlzIG5vdAorcGFnZWQgaW50ZXJuYWxseSkuCisqIENvbGxlY3Rpb25zIGNhbm5vdCBoYXZlIG1vcmUgdGhhbiA2NTUzNSBlbGVtZW50cy4gTW9yZSBwcmVjaXNlbHksCit3aGlsZSBpdCBtYXkgYmUgcG9zc2libGUgdG8gaW5zZXJ0IG1vcmUgdGhhbiA2NTUzNSBlbGVtZW50cywgaXQgaXMgbm90Citwb3NzaWJsZSB0byByZWFkIG1vcmUgdGhhbiB0aGUgNjU1MzUgZmlyc3QgZWxlbWVudHMgKHNlZQoraHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNTQyOFtDQVNTQU5EUkEtNTQyOF0gZm9yCitkZXRhaWxzKS4KKyogV2hpbGUgaW5zZXJ0aW9uIG9wZXJhdGlvbnMgb24gc2V0cyBhbmQgbWFwcyBuZXZlciBpbmN1ciBhCityZWFkLWJlZm9yZS13cml0ZSBpbnRlcm5hbGx5LCBzb21lIG9wZXJhdGlvbnMgb24gbGlzdHMgZG8gKHNlZSB0aGUKK3NlY3Rpb24gb24gbGlzdHMgYmVsb3cgZm9yIGRldGFpbHMpLiBJdCBpcyB0aHVzIGFkdmlzZWQgdG8gcHJlZmVyIHNldHMKK292ZXIgbGlzdHMgd2hlbiBwb3NzaWJsZS4KKworUGxlYXNlIG5vdGUgdGhhdCB3aGlsZSBzb21lIG9mIHRob3NlIGxpbWl0YXRpb25zIG1heSBvciBtYXkgbm90IGJlCitsb29zZW4gaW4gdGhlIGZ1dHVyZSwgdGhlIGdlbmVyYWwgcnVsZSB0aGF0IGNvbGxlY3Rpb25zIGFyZSBmb3IKK2Rlbm9ybWFsaXppbmcgc21hbGwgYW1vdW50IG9mIGRhdGEgaXMgbWVhbnQgdG8gc3RheS4KKworW1ttYXBdXQorPT09PT0gTWFwcworCitBIGBtYXBgIGlzIGEgbGluazojdHlwZXNbdHlwZWRdIHNldCBvZiBrZXktdmFsdWUgcGFpcnMsIHdoZXJlIGtleXMgYXJlCit1bmlxdWUuIEZ1cnRoZXJtb3JlLCBub3RlIHRoYXQgdGhlIG1hcCBhcmUgaW50ZXJuYWxseSBzb3J0ZWQgYnkgdGhlaXIKK2tleXMgYW5kIHdpbGwgdGh1cyBhbHdheXMgYmUgcmV0dXJuZWQgaW4gdGhhdCBvcmRlci4gVG8gY3JlYXRlIGEgY29sdW1uCitvZiB0eXBlIGBtYXBgLCB1c2UgdGhlIGBtYXBgIGtleXdvcmQgc3VmZml4ZWQgd2l0aCBjb21tYS1zZXBhcmF0ZWQga2V5CithbmQgdmFsdWUgdHlwZXMsIGVuY2xvc2VkIGluIGFuZ2xlIGJyYWNrZXRzLiBGb3IgZXhhbXBsZToKKworYmMoc2FtcGxlKS4gKworQ1JFQVRFIFRBQkxFIHVzZXJzICggKworaWQgdGV4dCBQUklNQVJZIEtFWSwgKworZ2l2ZW4gdGV4dCwgKworc3VybmFtZSB0ZXh0LCArCitmYXZzIG1hcDx0ZXh0LCB0ZXh0PiAvLyBBIG1hcCBvZiB0ZXh0IGtleXMsIGFuZCB0ZXh0IHZhbHVlcyArCispCisKK1dyaXRpbmcgYG1hcGAgZGF0YSBpcyBhY2NvbXBsaXNoZWQgd2l0aCBhIEpTT04taW5zcGlyZWQgc3ludGF4LiBUbyB3cml0ZQorYSByZWNvcmQgdXNpbmcgYElOU0VSVGAsIHNwZWNpZnkgdGhlIGVudGlyZSBtYXAgYXMgYSBKU09OLXN0eWxlCithc3NvY2lhdGl2ZSBhcnJheS4gX05vdGU6IFRoaXMgZm9ybSB3aWxsIGFsd2F5cyByZXBsYWNlIHRoZSBlbnRpcmUgbWFwLl8KKworYmMoc2FtcGxlKS4gKworLy8gSW5zZXJ0aW5nIChvciBVcGRhdGluZykgKworSU5TRVJUIElOVE8gdXNlcnMgKGlkLCBnaXZlbiwgc3VybmFtZSwgZmF2cykgKworVkFMVUVTIChganNtaXRoJywgYEpvaG4nLCBgU21pdGgnLCBceyBgZnJ1aXQnIDogYGFwcGxlJywgYGJhbmQnIDoKK2BCZWF0bGVzJyB9KQorCitBZGRpbmcgb3IgdXBkYXRpbmcga2V5LXZhbHVlcyBvZiBhIChwb3RlbnRpYWxseSkgZXhpc3RpbmcgbWFwIGNhbiBiZQorYWNjb21wbGlzaGVkIGVpdGhlciBieSBzdWJzY3JpcHRpbmcgdGhlIG1hcCBjb2x1bW4gaW4gYW4gYFVQREFURWAKK3N0YXRlbWVudCBvciBieSBhZGRpbmcgYSBuZXcgbWFwIGxpdGVyYWw6CisKK2JjKHNhbXBsZSkuICsKKy8vIFVwZGF0aW5nIChvciBpbnNlcnRpbmcpICsKK1VQREFURSB1c2VycyBTRVQgZmF2c1tgYXV0aG9yJ10gPSBgRWQgUG9lJyBXSEVSRSBpZCA9IGBqc21pdGgnICsKK1VQREFURSB1c2VycyBTRVQgZmF2cyA9IGZhdnMgKyBceyBgbW92aWUnIDogYENhc3NhYmxhbmNhJyB9IFdIRVJFIGlkID0KK2Bqc21pdGgnCisKK05vdGUgdGhhdCBUVExzIGFyZSBhbGxvd2VkIGZvciBib3RoIGBJTlNFUlRgIGFuZCBgVVBEQVRFYCwgYnV0IGluIGJvdGgKK2Nhc2UgdGhlIFRUTCBzZXQgb25seSBhcHBseSB0byB0aGUgbmV3bHkgaW5zZXJ0ZWQvdXBkYXRlZCBfdmFsdWVzXy4gSW4KK290aGVyIHdvcmRzLAorCitiYyhzYW1wbGUpLiArCisvLyBVcGRhdGluZyAob3IgaW5zZXJ0aW5nKSArCitVUERBVEUgdXNlcnMgVVNJTkcgVFRMIDEwIFNFVCBmYXZzW2Bjb2xvciddID0gYGdyZWVuJyBXSEVSRSBpZCA9CitganNtaXRoJworCit3aWxsIG9ubHkgYXBwbHkgdGhlIFRUTCB0byB0aGUgYHsgJ2NvbG9yJyA6ICdncmVlbicgfWAgcmVjb3JkLCB0aGUgcmVzdAorb2YgdGhlIG1hcCByZW1haW5pbmcgdW5hZmZlY3RlZC4KKworRGVsZXRpbmcgYSBtYXAgcmVjb3JkIGlzIGRvbmUgd2l0aDoKKworYmMoc2FtcGxlKS4gKworREVMRVRFIGZhdnNbYGF1dGhvciddIEZST00gdXNlcnMgV0hFUkUgaWQgPSBganNtaXRoJworCitbW3NldF1dCis9PT09PSBTZXRzCisKK0EgYHNldGAgaXMgYSBsaW5rOiN0eXBlc1t0eXBlZF0gY29sbGVjdGlvbiBvZiB1bmlxdWUgdmFsdWVzLiBTZXRzIGFyZQorb3JkZXJlZCBieSB0aGVpciB2YWx1ZXMuIFRvIGNyZWF0ZSBhIGNvbHVtbiBvZiB0eXBlIGBzZXRgLCB1c2UgdGhlIGBzZXRgCitrZXl3b3JkIHN1ZmZpeGVkIHdpdGggdGhlIHZhbHVlIHR5cGUgZW5jbG9zZWQgaW4gYW5nbGUgYnJhY2tldHMuIEZvcgorZXhhbXBsZToKKworYmMoc2FtcGxlKS4gKworQ1JFQVRFIFRBQkxFIGltYWdlcyAoICsKK25hbWUgdGV4dCBQUklNQVJZIEtFWSwgKworb3duZXIgdGV4dCwgKworZGF0ZSB0aW1lc3RhbXAsICsKK3RhZ3Mgc2V0ICsKKyk7CisKK1dyaXRpbmcgYSBgc2V0YCBpcyBhY2NvbXBsaXNoZWQgYnkgY29tbWEgc2VwYXJhdGluZyB0aGUgc2V0IHZhbHVlcywgYW5kCitlbmNsb3NpbmcgdGhlbSBpbiBjdXJseSBicmFjZXMuIF9Ob3RlOiBBbiBgSU5TRVJUYCB3aWxsIGFsd2F5cyByZXBsYWNlCit0aGUgZW50aXJlIHNldC5fCisKK2JjKHNhbXBsZSkuICsKK0lOU0VSVCBJTlRPIGltYWdlcyAobmFtZSwgb3duZXIsIGRhdGUsIHRhZ3MpICsKK1ZBTFVFUyAoYGNhdC5qcGcnLCBganNtaXRoJywgYG5vdycsIFx7IGBraXR0ZW4nLCBgY2F0JywgYHBldCcgfSk7CisKK0FkZGluZyBhbmQgcmVtb3ZpbmcgdmFsdWVzIG9mIGEgc2V0IGNhbiBiZSBhY2NvbXBsaXNoZWQgd2l0aCBhbiBgVVBEQVRFYAorYnkgYWRkaW5nL3JlbW92aW5nIG5ldyBzZXQgdmFsdWVzIHRvIGFuIGV4aXN0aW5nIGBzZXRgIGNvbHVtbi4KKworYmMoc2FtcGxlKS4gKworVVBEQVRFIGltYWdlcyBTRVQgdGFncyA9IHRhZ3MgKyBceyBgY3V0ZScsIGBjdWRkbHknIH0gV0hFUkUgbmFtZSA9CitgY2F0LmpwZyc7ICsKK1VQREFURSBpbWFnZXMgU0VUIHRhZ3MgPSB0YWdzIC0gXHsgYGxhbWUnIH0gV0hFUkUgbmFtZSA9IGBjYXQuanBnJzsKKworQXMgd2l0aCBsaW5rOiNtYXBbbWFwc10sIFRUTHMgaWYgdXNlZCBvbmx5IGFwcGx5IHRvIHRoZSBuZXdseQoraW5zZXJ0ZWQvdXBkYXRlZCBfdmFsdWVzXy4KKworW1tsaXN0XV0KKz09PT09IExpc3RzCisKK0EgYGxpc3RgIGlzIGEgbGluazojdHlwZXNbdHlwZWRdIGNvbGxlY3Rpb24gb2Ygbm9uLXVuaXF1ZSB2YWx1ZXMgd2hlcmUKK2VsZW1lbnRzIGFyZSBvcmRlcmVkIGJ5IHRoZXJlIHBvc2l0aW9uIGluIHRoZSBsaXN0LiBUbyBjcmVhdGUgYSBjb2x1bW4KK29mIHR5cGUgYGxpc3RgLCB1c2UgdGhlIGBsaXN0YCBrZXl3b3JkIHN1ZmZpeGVkIHdpdGggdGhlIHZhbHVlIHR5cGUKK2VuY2xvc2VkIGluIGFuZ2xlIGJyYWNrZXRzLiBGb3IgZXhhbXBsZToKKworYmMoc2FtcGxlKS4gKworQ1JFQVRFIFRBQkxFIHBsYXlzICggKworaWQgdGV4dCBQUklNQVJZIEtFWSwgKworZ2FtZSB0ZXh0LCArCitwbGF5ZXJzIGludCwgKworc2NvcmVzIGxpc3QgKworKQorCitEbyBub3RlIHRoYXQgYXMgZXhwbGFpbmVkIGJlbG93LCBsaXN0cyBoYXZlIHNvbWUgbGltaXRhdGlvbnMgYW5kCitwZXJmb3JtYW5jZSBjb25zaWRlcmF0aW9ucyB0byB0YWtlIGludG8gYWNjb3VudCwgYW5kIGl0IGlzIGFkdmlzZWQgdG8KK3ByZWZlciBsaW5rOiNzZXRbc2V0c10gb3ZlciBsaXN0cyB3aGVuIHRoaXMgaXMgcG9zc2libGUuCisKK1dyaXRpbmcgYGxpc3RgIGRhdGEgaXMgYWNjb21wbGlzaGVkIHdpdGggYSBKU09OLXN0eWxlIHN5bnRheC4gVG8gd3JpdGUgYQorcmVjb3JkIHVzaW5nIGBJTlNFUlRgLCBzcGVjaWZ5IHRoZSBlbnRpcmUgbGlzdCBhcyBhIEpTT04gYXJyYXkuIF9Ob3RlOgorQW4gYElOU0VSVGAgd2lsbCBhbHdheXMgcmVwbGFjZSB0aGUgZW50aXJlIGxpc3QuXworCitiYyhzYW1wbGUpLiArCitJTlNFUlQgSU5UTyBwbGF5cyAoaWQsIGdhbWUsIHBsYXllcnMsIHNjb3JlcykgKworVkFMVUVTIChgMTIzLWFmZGUnLCBgcXVha2UnLCAzLCBbMTcsIDQsIDJdKTsKKworQWRkaW5nIChhcHBlbmRpbmcgb3IgcHJlcGVuZGluZykgdmFsdWVzIHRvIGEgbGlzdCBjYW4gYmUgYWNjb21wbGlzaGVkIGJ5CithZGRpbmcgYSBuZXcgSlNPTi1zdHlsZSBhcnJheSB0byBhbiBleGlzdGluZyBgbGlzdGAgY29sdW1uLgorCitiYyhzYW1wbGUpLiArCitVUERBVEUgcGxheXMgU0VUIHBsYXllcnMgPSA1LCBzY29yZXMgPSBzY29yZXMgKyBbIDE0LCAyMSBdIFdIRVJFIGlkID0KK2AxMjMtYWZkZSc7ICsKK1VQREFURSBwbGF5cyBTRVQgcGxheWVycyA9IDUsIHNjb3JlcyA9IFsgMTIgXSArIHNjb3JlcyBXSEVSRSBpZCA9CitgMTIzLWFmZGUnOworCitJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBhcHBlbmQgYW5kIHByZXBlbmQgYXJlIG5vdCBpZGVtcG90ZW50CitvcGVyYXRpb25zLiBUaGlzIG1lYW5zIHRoYXQgaWYgZHVyaW5nIGFuIGFwcGVuZCBvciBhIHByZXBlbmQgdGhlCitvcGVyYXRpb24gdGltZW91dCwgaXQgaXMgbm90IGFsd2F5cyBzYWZlIHRvIHJldHJ5IHRoZSBvcGVyYXRpb24gKGFzIHRoaXMKK2NvdWxkIHJlc3VsdCBpbiB0aGUgcmVjb3JkIGFwcGVuZGVkIG9yIHByZXBlbmRlZCB0d2ljZSkuCisKK0xpc3RzIGFsc28gcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBvcGVyYXRpb246IHNldHRpbmcgYW4gZWxlbWVudCBieSBpdHMKK3Bvc2l0aW9uIGluIHRoZSBsaXN0LCByZW1vdmluZyBhbiBlbGVtZW50IGJ5IGl0cyBwb3NpdGlvbiBpbiB0aGUgbGlzdAorYW5kIHJlbW92ZSBhbGwgdGhlIG9jY3VycmVuY2Ugb2YgYSBnaXZlbiB2YWx1ZSBpbiB0aGUgbGlzdC4gX0hvd2V2ZXIsCithbmQgY29udHJhcmlseSB0byBhbGwgdGhlIG90aGVyIGNvbGxlY3Rpb24gb3BlcmF0aW9ucywgdGhlc2UgdGhyZWUKK29wZXJhdGlvbnMgaW5kdWNlIGFuIGludGVybmFsIHJlYWQgYmVmb3JlIHRoZSB1cGRhdGUsIGFuZCB3aWxsIHRodXMKK3R5cGljYWxseSBoYXZlIHNsb3dlciBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3NfLiBUaG9zZSBvcGVyYXRpb25zCitoYXZlIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorCitiYyhzYW1wbGUpLiArCitVUERBVEUgcGxheXMgU0VUIHNjb3Jlc1sxXSA9IDcgV0hFUkUgaWQgPSBgMTIzLWFmZGUnOyAvLyBzZXRzIHRoZSAybmQKK2VsZW1lbnQgb2Ygc2NvcmVzIHRvIDcgKHJhaXNlcyBhbiBlcnJvciBpcyBzY29yZXMgaGFzIGxlc3MgdGhhbiAyCitlbGVtZW50cykgKworREVMRVRFIHNjb3Jlc1sxXSBGUk9NIHBsYXlzIFdIRVJFIGlkID0gYDEyMy1hZmRlJzsgLy8gZGVsZXRlcyB0aGUgMm5kCitlbGVtZW50IG9mIHNjb3JlcyAocmFpc2VzIGFuIGVycm9yIGlzIHNjb3JlcyBoYXMgbGVzcyB0aGFuIDIgZWxlbWVudHMpICsKK1VQREFURSBwbGF5cyBTRVQgc2NvcmVzID0gc2NvcmVzIC0gWyAxMiwgMjEgXSBXSEVSRSBpZCA9IGAxMjMtYWZkZSc7IC8vCityZW1vdmVzIGFsbCBvY2N1cnJlbmNlcyBvZiAxMiBhbmQgMjEgZnJvbSBzY29yZXMKKworQXMgd2l0aCBsaW5rOiNtYXBbbWFwc10sIFRUTHMgaWYgdXNlZCBvbmx5IGFwcGx5IHRvIHRoZSBuZXdseQoraW5zZXJ0ZWQvdXBkYXRlZCBfdmFsdWVzXy4KKworPT09IEZ1bmN0aW9ucworCitDUUwzIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBidWlsdC1pbiBmdW5jdGlvbnMgKHNvIGNhbGxlZCBgbmF0aXZlCitmdW5jdGlvbnMnKSBhbmQgbGluazojdWRmc1t1c2VyLWRlZmluZWQgZnVuY3Rpb25zXS4gQ1FMMyBpbmNsdWRlcworc2V2ZXJhbCBuYXRpdmUgZnVuY3Rpb25zLCBkZXNjcmliZWQgYmVsb3c6CisKK1tbY2FzdEZ1bl1dCis9PT09IENhc3QKKworVGhlIGBjYXN0YCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjb252ZXJ0cyBvbmUgbmF0aXZlIGRhdGF0eXBlIHRvCithbm90aGVyLgorCitUaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUgY29udmVyc2lvbnMgc3VwcG9ydGVkIGJ5IHRoZSBgY2FzdGAKK2Z1bmN0aW9uLiBDYXNzYW5kcmEgd2lsbCBzaWxlbnRseSBpZ25vcmUgYW55IGNhc3QgY29udmVydGluZyBhIGRhdGF0eXBlCitpbnRvIGl0cyBvd24gZGF0YXR5cGUuCisKK1tjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xmcm9tIHx0bworfGBhc2NpaWAgfGB0ZXh0YCwgYHZhcmNoYXJgCisKK3xgYmlnaW50YCB8YHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwKK2B2YXJpbnRgLCBgdGV4dGAsIGB2YXJjaGFyYAorCit8YGJvb2xlYW5gIHxgdGV4dGAsIGB2YXJjaGFyYAorCit8YGNvdW50ZXJgIHxgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsCitgZGVjaW1hbGAsIGB2YXJpbnRgLCBgdGV4dGAsIGB2YXJjaGFyYAorCit8YGRhdGVgIHxgdGltZXN0YW1wYAorCit8YGRlY2ltYWxgIHxgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsCitgdmFyaW50YCwgYHRleHRgLCBgdmFyY2hhcmAKKworfGBkb3VibGVgIHxgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRlY2ltYWxgLAorYHZhcmludGAsIGB0ZXh0YCwgYHZhcmNoYXJgCisKK3xgZmxvYXRgIHxgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwKK2B2YXJpbnRgLCBgdGV4dGAsIGB2YXJjaGFyYAorCit8YGluZXRgIHxgdGV4dGAsIGB2YXJjaGFyYAorCit8YGludGAgfGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsCitgdmFyaW50YCwgYHRleHRgLCBgdmFyY2hhcmAKKworfGBzbWFsbGludGAgfGB0aW55aW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwgYGRlY2ltYWxgLAorYHZhcmludGAsIGB0ZXh0YCwgYHZhcmNoYXJgCisKK3xgdGltZWAgfGB0ZXh0YCwgYHZhcmNoYXJgCisKK3xgdGltZXN0YW1wYCB8YGRhdGVgLCBgdGV4dGAsIGB2YXJjaGFyYAorCit8YHRpbWV1dWlkYCB8YHRpbWVzdGFtcGAsIGBkYXRlYCwgYHRleHRgLCBgdmFyY2hhcmAKKworfGB0aW55aW50YCB8YHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkb3VibGVgLAorYGRlY2ltYWxgLCBgdmFyaW50YCwgYHRleHRgLCBgdmFyY2hhcmAKKworfGB1dWlkYCB8YHRleHRgLCBgdmFyY2hhcmAKKworfGB2YXJpbnRgIHxgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsCitgZGVjaW1hbGAsIGB0ZXh0YCwgYHZhcmNoYXJgCit8PT09CisKK1RoZSBjb252ZXJzaW9ucyByZWx5IHN0cmljdGx5IG9uIEphdmHigJlzIHNlbWFudGljcy4gRm9yIGV4YW1wbGUsIHRoZQorZG91YmxlIHZhbHVlIDEgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHRleHQgdmFsdWUgYDEuMCcuCisKK2JjKHNhbXBsZSkuICsKK1NFTEVDVCBhdmcoY2FzdChjb3VudCBhcyBkb3VibGUpKSBGUk9NIG15VGFibGUKKworW1t0b2tlbkZ1bl1dCis9PT09IFRva2VuCisKK1RoZSBgdG9rZW5gIGZ1bmN0aW9uIGFsbG93cyB0byBjb21wdXRlIHRoZSB0b2tlbiBmb3IgYSBnaXZlbiBwYXJ0aXRpb24KK2tleS4gVGhlIGV4YWN0IHNpZ25hdHVyZSBvZiB0aGUgdG9rZW4gZnVuY3Rpb24gZGVwZW5kcyBvbiB0aGUgdGFibGUKK2NvbmNlcm5lZCBhbmQgb2YgdGhlIHBhcnRpdGlvbmVyIHVzZWQgYnkgdGhlIGNsdXN0ZXIuCisKK1RoZSB0eXBlIG9mIHRoZSBhcmd1bWVudHMgb2YgdGhlIGB0b2tlbmAgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIHRoZQorcGFydGl0aW9uIGtleSBjb2x1bW5zLiBUaGUgcmV0dXJuIHR5cGUgZGVwZW5kIG9uIHRoZSBwYXJ0aXRpb25lciBpbiB1c2U6CisKKyogRm9yIE11cm11cjNQYXJ0aXRpb25lciwgdGhlIHJldHVybiB0eXBlIGlzIGBiaWdpbnRgLgorKiBGb3IgUmFuZG9tUGFydGl0aW9uZXIsIHRoZSByZXR1cm4gdHlwZSBpcyBgdmFyaW50YC4KKyogRm9yIEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIsIHRoZSByZXR1cm4gdHlwZSBpcyBgYmxvYmAuCisKK0ZvciBpbnN0YW5jZSwgaW4gYSBjbHVzdGVyIHVzaW5nIHRoZSBkZWZhdWx0IE11cm11cjNQYXJ0aXRpb25lciwgaWYgYQordGFibGUgaXMgZGVmaW5lZCBieQorCitiYyhzYW1wbGUpLiArCitDUkVBVEUgVEFCTEUgdXNlcnMgKCArCit1c2VyaWQgdGV4dCBQUklNQVJZIEtFWSwgKwordXNlcm5hbWUgdGV4dCwgKwor4oCmICsKKykKKwordGhlbiB0aGUgYHRva2VuYCBmdW5jdGlvbiB3aWxsIHRha2UgYSBzaW5nbGUgYXJndW1lbnQgb2YgdHlwZSBgdGV4dGAgKGluCit0aGF0IGNhc2UsIHRoZSBwYXJ0aXRpb24ga2V5IGlzIGB1c2VyaWRgICh0aGVyZSBpcyBubyBjbHVzdGVyaW5nIGNvbHVtbnMKK3NvIHRoZSBwYXJ0aXRpb24ga2V5IGlzIHRoZSBzYW1lIHRoYW4gdGhlIHByaW1hcnkga2V5KSksIGFuZCB0aGUgcmV0dXJuCit0eXBlIHdpbGwgYmUgYGJpZ2ludGAuCisKK1tbdXVpZEZ1bl1dCis9PT09IFV1aWQKKworVGhlIGB1dWlkYCBmdW5jdGlvbiB0YWtlcyBubyBwYXJhbWV0ZXJzIGFuZCBnZW5lcmF0ZXMgYSByYW5kb20gdHlwZSA0Cit1dWlkIHN1aXRhYmxlIGZvciB1c2UgaW4gSU5TRVJUIG9yIFNFVCBzdGF0ZW1lbnRzLgorCitbW3RpbWV1dWlkRnVuXV0KKz09PT0gVGltZXV1aWQgZnVuY3Rpb25zCisKKz09PT09IGBub3dgCisKK1RoZSBgbm93YCBmdW5jdGlvbiB0YWtlcyBubyBhcmd1bWVudHMgYW5kIGdlbmVyYXRlcywgb24gdGhlIGNvb3JkaW5hdG9yCitub2RlLCBhIG5ldyB1bmlxdWUgdGltZXV1aWQgKGF0IHRoZSB0aW1lIHdoZXJlIHRoZSBzdGF0ZW1lbnQgdXNpbmcgaXQgaXMKK2V4ZWN1dGVkKS4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgaW5zZXJ0aW9uIGJ1dCBpcyBsYXJnZWx5Citub24tc2Vuc2ljYWwgaW4gYFdIRVJFYCBjbGF1c2VzLiBGb3IgaW5zdGFuY2UsIGEgcXVlcnkgb2YgdGhlIGZvcm0KKworYmMoc2FtcGxlKS4gKworU0VMRUNUICogRlJPTSBteVRhYmxlIFdIRVJFIHQgPSBub3coKQorCit3aWxsIG5ldmVyIHJldHVybiBhbnkgcmVzdWx0IGJ5IGRlc2lnbiwgc2luY2UgdGhlIHZhbHVlIHJldHVybmVkIGJ5Citgbm93KClgIGlzIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlLgorCis9PT09PSBgbWluX3RpbWV1dWlkYCBhbmQgYG1heF90aW1ldXVpZGAKKworVGhlIGBtaW5fdGltZXV1aWRgIChyZXNwLiBgbWF4X3RpbWV1dWlkYCkgZnVuY3Rpb24gdGFrZXMgYSBgdGltZXN0YW1wYAordmFsdWUgYHRgICh3aGljaCBjYW4gYmUgbGluazojdXNpbmd0aW1lc3RhbXBzW2VpdGhlciBhIHRpbWVzdGFtcCBvciBhCitkYXRlIHN0cmluZ10gKSBhbmQgcmV0dXJuIGEgX2Zha2VfIGB0aW1ldXVpZGAgY29ycmVzcG9uZGluZyB0byB0aGUKK19zbWFsbGVzdF8gKHJlc3AuIF9iaWdnZXN0XykgcG9zc2libGUgYHRpbWV1dWlkYCBoYXZpbmcgZm9yIHRpbWVzdGFtcAorYHRgLiBTbyBmb3IgaW5zdGFuY2U6CisKK2JjKHNhbXBsZSkuICsKK1NFTEVDVCAqIEZST00gbXlUYWJsZSBXSEVSRSB0ID4gbWF4X3RpbWV1dWlkKGAyMDEzLTAxLTAxIDAwOjA1KzAwMDAnKSBBTkQKK3QgPCBtaW5fdGltZXV1aWQoYDIwMTMtMDItMDIgMTA6MDArMDAwMCcpCisKK3dpbGwgc2VsZWN0IGFsbCByb3dzIHdoZXJlIHRoZSBgdGltZXV1aWRgIGNvbHVtbiBgdGAgaXMgc3RyaWN0bHkgb2xkZXIKK3RoYW4gYDIwMTMtMDEtMDEgMDA6MDUrMDAwMCcgYnV0IHN0cmljdGx5IHlvdW5nZXIgdGhhbiBgMjAxMy0wMi0wMgorMTA6MDArMDAwMCcuIFBsZWFzZSBub3RlIHRoYXQKK2B0ID49IG1heF90aW1ldXVpZCgnMjAxMy0wMS0wMSAwMDowNSswMDAwJylgIHdvdWxkIHN0aWxsIF9ub3RfIHNlbGVjdCBhCitgdGltZXV1aWRgIGdlbmVyYXRlZCBleGFjdGx5IGF0IGAyMDEzLTAxLTAxIDAwOjA1KzAwMDAnIGFuZCBpcworZXNzZW50aWFsbHkgZXF1aXZhbGVudCB0byBgdCA+IG1heF90aW1ldXVpZCgnMjAxMy0wMS0wMSAwMDowNSswMDAwJylgLgorCitfV2FybmluZ186IFdlIGNhbGxlZCB0aGUgdmFsdWVzIGdlbmVyYXRlZCBieSBgbWluX3RpbWV1dWlkYCBhbmQKK2BtYXhfdGltZXV1aWRgIF9mYWtlXyBVVUlEIGJlY2F1c2UgdGhleSBkbyBubyByZXNwZWN0IHRoZSBUaW1lLUJhc2VkIFVVSUQKK2dlbmVyYXRpb24gcHJvY2VzcyBzcGVjaWZpZWQgYnkgdGhlCitodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MTIyLnR4dFtSRkMgNDEyMl0uIEluIHBhcnRpY3VsYXIsIHRoZSB2YWx1ZQorcmV0dXJuZWQgYnkgdGhlc2UgMiBtZXRob2RzIHdpbGwgbm90IGJlIHVuaXF1ZS4gVGhpcyBtZWFucyB5b3Ugc2hvdWxkCitvbmx5IHVzZSB0aG9zZSBtZXRob2RzIGZvciBxdWVyeWluZyAoYXMgaW4gdGhlIGV4YW1wbGUgYWJvdmUpLiBJbnNlcnRpbmcKK3RoZSByZXN1bHQgb2YgdGhvc2UgbWV0aG9kcyBpcyBhbG1vc3QgY2VydGFpbmx5IF9hIGJhZCBpZGVhXy4KKworW1t0aW1lRnVuXV0KKz09PT0gVGltZSBjb252ZXJzaW9uIGZ1bmN0aW9ucworCitBIG51bWJlciBvZiBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkIHRvIGBgY29udmVydCcnIGEgYHRpbWV1dWlkYCwgYQorYHRpbWVzdGFtcGAgb3IgYSBgZGF0ZWAgaW50byBhbm90aGVyIGBuYXRpdmVgIHR5cGUuCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8ZnVuY3Rpb24gbmFtZSB8aW5wdXQgdHlwZSB8ZGVzY3JpcHRpb24KK3xgdG9fZGF0ZWAgfGB0aW1ldXVpZGAgfENvbnZlcnRzIHRoZSBgdGltZXV1aWRgIGFyZ3VtZW50IGludG8gYSBgZGF0ZWAKK3R5cGUKKworfGB0b19kYXRlYCB8YHRpbWVzdGFtcGAgfENvbnZlcnRzIHRoZSBgdGltZXN0YW1wYCBhcmd1bWVudCBpbnRvIGEgYGRhdGVgCit0eXBlCisKK3xgdG9fdGltZXN0YW1wYCB8YHRpbWV1dWlkYCB8Q29udmVydHMgdGhlIGB0aW1ldXVpZGAgYXJndW1lbnQgaW50byBhCitgdGltZXN0YW1wYCB0eXBlCisKK3xgdG9fdGltZXN0YW1wYCB8YGRhdGVgIHxDb252ZXJ0cyB0aGUgYGRhdGVgIGFyZ3VtZW50IGludG8gYSBgdGltZXN0YW1wYAordHlwZQorCit8YHRvX3VuaXhfdGltZXN0YW1wYCB8YHRpbWV1dWlkYCB8Q29udmVydHMgdGhlIGB0aW1ldXVpZGAgYXJndW1lbnQgaW50byBhCitgYmlnSW50YCByYXcgdmFsdWUKKworfGB0b191bml4X3RpbWVzdGFtcGAgfGB0aW1lc3RhbXBgIHxDb252ZXJ0cyB0aGUgYHRpbWVzdGFtcGAgYXJndW1lbnQgaW50bworYSBgYmlnSW50YCByYXcgdmFsdWUKKworfGB0b191bml4X3RpbWVzdGFtcGAgfGBkYXRlYCB8Q29udmVydHMgdGhlIGBkYXRlYCBhcmd1bWVudCBpbnRvIGEgYGJpZ0ludGAKK3JhdyB2YWx1ZQorfD09PQorCitbW2Jsb2JGdW5dXQorPT09PSBCbG9iIGNvbnZlcnNpb24gZnVuY3Rpb25zCisKK0EgbnVtYmVyIG9mIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgdG8gYGBjb252ZXJ0JycgdGhlIG5hdGl2ZSB0eXBlcyBpbnRvCitiaW5hcnkgZGF0YSAoYGJsb2JgKS4gRm9yIGV2ZXJ5IGA8bmF0aXZlLXR5cGU+YCBgdHlwZWAgc3VwcG9ydGVkIGJ5IENRTDMKKyhhIG5vdGFibGUgZXhjZXB0aW9ucyBpcyBgYmxvYmAsIGZvciBvYnZpb3VzIHJlYXNvbnMpLCB0aGUgZnVuY3Rpb24KK2B0eXBlX2FzX2Jsb2JgIHRha2VzIGEgYXJndW1lbnQgb2YgdHlwZSBgdHlwZWAgYW5kIHJldHVybiBpdCBhcyBhIGBibG9iYC4KK0NvbnZlcnNlbHksIHRoZSBmdW5jdGlvbiBgYmxvYl9hc190eXBlYCB0YWtlcyBhIDY0LWJpdCBgYmxvYmAgYXJndW1lbnQgYW5kCitjb252ZXJ0IGl0IHRvIGEgYGJpZ2ludGAgdmFsdWUuIEFuZCBzbyBmb3IgaW5zdGFuY2UsIGBiaWdpbnRfYXNfYmxvYigzKWAKK2lzIGAweDAwMDAwMDAwMDAwMDAwMDNgIGFuZCBgYmxvYl9hc19iaWdpbnQoMHgwMDAwMDAwMDAwMDAwMDAzKWAgaXMgYDNgLgorCis9PT0gQWdncmVnYXRlcworCitBZ2dyZWdhdGUgZnVuY3Rpb25zIHdvcmsgb24gYSBzZXQgb2Ygcm93cy4gVGhleSByZWNlaXZlIHZhbHVlcyBmb3IgZWFjaAorcm93IGFuZCByZXR1cm5zIG9uZSB2YWx1ZSBmb3IgdGhlIHdob2xlIHNldC4gKworSWYgYG5vcm1hbGAgY29sdW1ucywgYHNjYWxhciBmdW5jdGlvbnNgLCBgVURUYCBmaWVsZHMsIGB3cml0ZXRpbWVgLCBgbWF4d3JpdGV0aW1lYAorb3IgYHR0bGAgYXJlIHNlbGVjdGVkIHRvZ2V0aGVyIHdpdGggYWdncmVnYXRlIGZ1bmN0aW9ucywgdGhlIHZhbHVlcworcmV0dXJuZWQgZm9yIHRoZW0gd2lsbCBiZSB0aGUgb25lcyBvZiB0aGUgZmlyc3Qgcm93IG1hdGNoaW5nIHRoZSBxdWVyeS4KKworQ1FMMyBkaXN0aW5ndWlzaGVzIGJldHdlZW4gYnVpbHQtaW4gYWdncmVnYXRlcyAoc28gY2FsbGVkIGBuYXRpdmUKK2FnZ3JlZ2F0ZXMnKSBhbmQgbGluazojdWRhc1t1c2VyLWRlZmluZWQgYWdncmVnYXRlc10uIENRTDMgaW5jbHVkZXMKK3NldmVyYWwgbmF0aXZlIGFnZ3JlZ2F0ZXMsIGRlc2NyaWJlZCBiZWxvdzoKKworW1tjb3VudEZjdF1dCis9PT09IENvdW50CisKK1RoZSBgY291bnRgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvdW50IHRoZSByb3dzIHJldHVybmVkIGJ5IGEgcXVlcnkuCitFeGFtcGxlOgorCitiYyhzYW1wbGUpLiArCitTRUxFQ1QgQ09VTlQgKCopIEZST00gcGxheXM7ICsKK1NFTEVDVCBDT1VOVCAoMSkgRlJPTSBwbGF5czsKKworSXQgYWxzbyBjYW4gYmUgdXNlZCB0byBjb3VudCB0aGUgbm9uIG51bGwgdmFsdWUgb2YgYSBnaXZlbiBjb2x1bW4uCitFeGFtcGxlOgorCitiYyhzYW1wbGUpLiArCitTRUxFQ1QgQ09VTlQgKHNjb3JlcykgRlJPTSBwbGF5czsKKworW1ttYXhNaW5GY3RzXV0KKz09PT0gTWF4IGFuZCBNaW4KKworVGhlIGBtYXhgIGFuZCBgbWluYCBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgbWF4aW11bSBhbmQgdGhlCittaW5pbXVtIHZhbHVlIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgZ2l2ZW4gY29sdW1uLgorCitiYyhzYW1wbGUpLiArCitTRUxFQ1QgTUlOIChwbGF5ZXJzKSwgTUFYIChwbGF5ZXJzKSBGUk9NIHBsYXlzIFdIRVJFIGdhbWUgPSBgcXVha2UnOworCitbW3N1bUZjdF1dCis9PT09IFN1bQorCitUaGUgYHN1bWAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gc3VtIHVwIGFsbCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGEKK3F1ZXJ5IGZvciBhIGdpdmVuIGNvbHVtbi4KKworYmMoc2FtcGxlKS4gKworU0VMRUNUIFNVTSAocGxheWVycykgRlJPTSBwbGF5czsKKworW1thdmdGY3RdXQorPT09PSBBdmcKKworVGhlIGBhdmdgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIGF2ZXJhZ2Ugb2YgYWxsIHRoZSB2YWx1ZXMKK3JldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgZ2l2ZW4gY29sdW1uLgorCitiYyhzYW1wbGUpLiArCitTRUxFQ1QgQVZHIChwbGF5ZXJzKSBGUk9NIHBsYXlzOworCitbW3VkZnNdXQorPT09IFVzZXItRGVmaW5lZCBGdW5jdGlvbnMKKworVXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBhbGxvdyBleGVjdXRpb24gb2YgdXNlci1wcm92aWRlZCBjb2RlIGluCitDYXNzYW5kcmEuIEJ5IGRlZmF1bHQsIENhc3NhbmRyYSBzdXBwb3J0cyBkZWZpbmluZyBmdW5jdGlvbnMgaW4gX0phdmFfCithbmQgX0phdmFTY3JpcHRfLiBTdXBwb3J0IGZvciBvdGhlciBKU1IgMjIzIGNvbXBsaWFudCBzY3JpcHRpbmcKK2xhbmd1YWdlcyAoc3VjaCBhcyBQeXRob24sIFJ1YnksIGFuZCBTY2FsYSkgaGFzIGJlZW4gcmVtb3ZlZCBpbiAzLjAuMTEuCisKK1VERnMgYXJlIHBhcnQgb2YgdGhlIENhc3NhbmRyYSBzY2hlbWEuIEFzIHN1Y2gsIHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkKK3Byb3BhZ2F0ZWQgdG8gYWxsIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorCitVREZzIGNhbiBiZSBfb3ZlcmxvYWRlZF8gLSBpLmUuIG11bHRpcGxlIFVERnMgd2l0aCBkaWZmZXJlbnQgYXJndW1lbnQKK3R5cGVzIGJ1dCB0aGUgc2FtZSBmdW5jdGlvbiBuYW1lLiBFeGFtcGxlOgorCitiYyhzYW1wbGUpLiArCitDUkVBVEUgRlVOQ1RJT04gc2FtcGxlICggYXJnIGludCApIOKApjsgKworQ1JFQVRFIEZVTkNUSU9OIHNhbXBsZSAoIGFyZyB0ZXh0ICkg4oCmOworCitVc2VyLWRlZmluZWQgZnVuY3Rpb25zIGFyZSBzdXNjZXB0aWJsZSB0byBhbGwgb2YgdGhlIG5vcm1hbCBwcm9ibGVtcword2l0aCB0aGUgY2hvc2VuIHByb2dyYW1taW5nIGxhbmd1YWdlLiBBY2NvcmRpbmdseSwgaW1wbGVtZW50YXRpb25zCitzaG91bGQgYmUgc2FmZSBhZ2FpbnN0IG51bGwgcG9pbnRlciBleGNlcHRpb25zLCBpbGxlZ2FsIGFyZ3VtZW50cywgb3IKK2FueSBvdGhlciBwb3RlbnRpYWwgc291cmNlIG9mIGV4Y2VwdGlvbnMuIEFuIGV4Y2VwdGlvbiBkdXJpbmcgZnVuY3Rpb24KK2V4ZWN1dGlvbiB3aWxsIHJlc3VsdCBpbiB0aGUgZW50aXJlIHN0YXRlbWVudCBmYWlsaW5nLgorCitJdCBpcyB2YWxpZCB0byB1c2UgX2NvbXBsZXhfIHR5cGVzIGxpa2UgY29sbGVjdGlvbnMsIHR1cGxlIHR5cGVzIGFuZAordXNlci1kZWZpbmVkIHR5cGVzIGFzIGFyZ3VtZW50IGFuZCByZXR1cm4gdHlwZXMuIFR1cGxlIHR5cGVzIGFuZAordXNlci1kZWZpbmVkIHR5cGVzIGFyZSBoYW5kbGVkIGJ5IHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBvZiB0aGUKK0RhdGFTdGF4IEphdmEgRHJpdmVyLiBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBKYXZhIERyaXZlcgorZm9yIGRldGFpbHMgb24gaGFuZGxpbmcgdHVwbGUgdHlwZXMgYW5kIHVzZXItZGVmaW5lZCB0eXBlcy4KKworQXJndW1lbnRzIGZvciBmdW5jdGlvbnMgY2FuIGJlIGxpdGVyYWxzIG9yIHRlcm1zLiBQcmVwYXJlZCBzdGF0ZW1lbnQKK3BsYWNlaG9sZGVycyBjYW4gYmUgdXNlZCwgdG9vLgorCitOb3RlIHRoYXQgeW91IGNhbiB1c2UgdGhlIGRvdWJsZS1xdW90ZWQgc3RyaW5nIHN5bnRheCB0byBlbmNsb3NlIHRoZSBVREYKK3NvdXJjZSBjb2RlLiBGb3IgZXhhbXBsZToKKworYmMoc2FtcGxlKS4uICsKK0NSRUFURSBGVU5DVElPTiBzb21lX2Z1bmN0aW9uICggYXJnIGludCApICsKK1JFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICsKK1JFVFVSTlMgaW50ICsKK0xBTkdVQUdFIGphdmEgKworQVMgJCQgcmV0dXJuIGFyZzsgJCQ7CisKK1NFTEVDVCBzb21lX2Z1bmN0aW9uKGNvbHVtbikgRlJPTSBhdGFibGUg4oCmOyArCitVUERBVEUgYXRhYmxlIFNFVCBjb2wgPSBzb21lX2Z1bmN0aW9uKD8pIOKApjsgKworcC4KKworYmMoc2FtcGxlKS4gKworQ1JFQVRFIFRZUEUgY3VzdG9tX3R5cGUgKHR4dCB0ZXh0LCBpIGludCk7ICsKK0NSRUFURSBGVU5DVElPTiBmY3RfdXNpbmdfdWR0ICggdWR0YXJnIGZyb3plbiApICsKK1JFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICsKK1JFVFVSTlMgdGV4dCArCitMQU5HVUFHRSBqYXZhICsKK0FTICQkIHJldHVybiB1ZHRhcmcuZ2V0U3RyaW5nKGBgdHh0JycpOyAkJDsKKworVXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCBpbiBsaW5rOiNzZWxlY3RTdG10W2BTRUxFQ1RgXSwKK2xpbms6I2luc2VydFN0bXRbYElOU0VSVGBdIGFuZCBsaW5rOiN1cGRhdGVTdG10W2BVUERBVEVgXSBzdGF0ZW1lbnRzLgorCitUaGUgaW1wbGljaXRseSBhdmFpbGFibGUgYHVkZkNvbnRleHRgIGZpZWxkIChvciBiaW5kaW5nIGZvciBzY3JpcHQgVURGcykKK3Byb3ZpZGVzIHRoZSBuZWNjZXNzYXJ5IGZ1bmN0aW9uYWxpdHkgdG8gY3JlYXRlIG5ldyBVRFQgYW5kIHR1cGxlCit2YWx1ZXMuCisKK2JjKHNhbXBsZSkuICsKK0NSRUFURSBUWVBFIGN1c3RvbV90eXBlICh0eHQgdGV4dCwgaSBpbnQpOyArCitDUkVBVEUgRlVOQ1RJT04gZmN0X3VzaW5nX3VkdCAoIHNvbWVhcmcgaW50ICkgKworUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgKworUkVUVVJOUyBjdXN0b21fdHlwZSArCitMQU5HVUFHRSBqYXZhICsKK0FTICQkICsKK1VEVFZhbHVlIHVkdCA9IHVkZkNvbnRleHQubmV3UmV0dXJuVURUVmFsdWUoKTsgKwordWR0LnNldFN0cmluZyhgYHR4dCcnLCBgYHNvbWUgc3RyaW5nJycpOyArCit1ZHQuc2V0SW50KGBgaScnLCA0Mik7ICsKK3JldHVybiB1ZHQ7ICsKKyQkOworCitUaGUgZGVmaW5pdGlvbiBvZiB0aGUgYFVERkNvbnRleHRgIGludGVyZmFjZSBjYW4gYmUgZm91bmQgaW4gdGhlIEFwYWNoZQorQ2Fzc2FuZHJhIHNvdXJjZSBjb2RlIGZvcgorYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlVERkNvbnRleHRgLgorCitiYyhzYW1wbGUpLiArCitwdWJsaWMgaW50ZXJmYWNlIFVERkNvbnRleHQgKworXHsgKworVURUVmFsdWUgbmV3QXJnVURUVmFsdWUoU3RyaW5nIGFyZ05hbWUpOyArCitVRFRWYWx1ZSBuZXdBcmdVRFRWYWx1ZShpbnQgYXJnTnVtKTsgKworVURUVmFsdWUgbmV3UmV0dXJuVURUVmFsdWUoKTsgKworVURUVmFsdWUgbmV3VURUVmFsdWUoU3RyaW5nIHVkdE5hbWUpOyArCitUdXBsZVZhbHVlIG5ld0FyZ1R1cGxlVmFsdWUoU3RyaW5nIGFyZ05hbWUpOyArCitUdXBsZVZhbHVlIG5ld0FyZ1R1cGxlVmFsdWUoaW50IGFyZ051bSk7ICsKK1R1cGxlVmFsdWUgbmV3UmV0dXJuVHVwbGVWYWx1ZSgpOyArCitUdXBsZVZhbHVlIG5ld1R1cGxlVmFsdWUoU3RyaW5nIGNxbERlZmluaXRpb24pOyArCit9CisKK0phdmEgVURGcyBhbHJlYWR5IGhhdmUgc29tZSBpbXBvcnRzIGZvciBjb21tb24gaW50ZXJmYWNlcyBhbmQgY2xhc3NlcworZGVmaW5lZC4gVGhlc2UgaW1wb3J0cyBhcmU6ICsKK1BsZWFzZSBub3RlLCB0aGF0IHRoZXNlIGNvbnZlbmllbmNlIGltcG9ydHMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHNjcmlwdAorVURGcy4KKworYmMoc2FtcGxlKS4gKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7ICsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsgKworaW1wb3J0IGphdmEudXRpbC5NYXA7ICsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OyArCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVURGQ29udGV4dDsgKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5UeXBlQ29kZWM7ICsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuVHVwbGVWYWx1ZTsgKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5VRFRWYWx1ZTsKKworU2VlIGxpbms6I2NyZWF0ZUZ1bmN0aW9uU3RtdFtgQ1JFQVRFIEZVTkNUSU9OYF0gYW5kCitsaW5rOiNkcm9wRnVuY3Rpb25TdG10W2BEUk9QIEZVTkNUSU9OYF0uCisKK1tbdWRhc11dCis9PT0gVXNlci1EZWZpbmVkIEFnZ3JlZ2F0ZXMKKworVXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgYWxsb3cgY3JlYXRpb24gb2YgY3VzdG9tIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMKK3VzaW5nIGxpbms6I3VkZnNbVURGc10uIENvbW1vbiBleGFtcGxlcyBvZiBhZ2dyZWdhdGUgZnVuY3Rpb25zIGFyZQorX2NvdW50XywgX21pbl8sIGFuZCBfbWF4Xy4KKworRWFjaCBhZ2dyZWdhdGUgcmVxdWlyZXMgYW4gX2luaXRpYWwgc3RhdGVfIChgSU5JVENPTkRgLCB3aGljaCBkZWZhdWx0cwordG8gYG51bGxgKSBvZiB0eXBlIGBTVFlQRWAuIFRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgc3RhdGUgZnVuY3Rpb24KK211c3QgaGF2ZSB0eXBlIGBTVFlQRWAuIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIG9mIHRoZSBzdGF0ZSBmdW5jdGlvbgorbXVzdCBtYXRjaCB0aGUgdHlwZXMgb2YgdGhlIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGUgYXJndW1lbnRzLiBUaGUgc3RhdGUKK2Z1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIHJvdywgYW5kIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUKK3N0YXRlIGZ1bmN0aW9uIGJlY29tZXMgdGhlIG5ldyBzdGF0ZS4gQWZ0ZXIgYWxsIHJvd3MgYXJlIHByb2Nlc3NlZCwgdGhlCitvcHRpb25hbCBgRklOQUxGVU5DYCBpcyBleGVjdXRlZCB3aXRoIGxhc3Qgc3RhdGUgdmFsdWUgYXMgaXRzIGFyZ3VtZW50LgorCitgU1RZUEVgIGlzIG1hbmRhdG9yeSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIHBvc3NpYmx5CitvdmVybG9hZGVkIHZlcnNpb25zIG9mIHRoZSBzdGF0ZSBhbmQvb3IgZmluYWwgZnVuY3Rpb24gKHNpbmNlIHRoZQorb3ZlcmxvYWQgY2FuIGFwcGVhciBhZnRlciBjcmVhdGlvbiBvZiB0aGUgYWdncmVnYXRlKS4KKworVXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgY2FuIGJlIHVzZWQgaW4gbGluazojc2VsZWN0U3RtdFtgU0VMRUNUYF0KK3N0YXRlbWVudC4KKworQSBjb21wbGV0ZSB3b3JraW5nIGV4YW1wbGUgZm9yIHVzZXItZGVmaW5lZCBhZ2dyZWdhdGVzIChhc3N1bWluZyB0aGF0IGEKK2tleXNwYWNlIGhhcyBiZWVuIHNlbGVjdGVkIHVzaW5nIHRoZSBsaW5rOiN1c2VTdG10W2BVU0VgXSBzdGF0ZW1lbnQpOgorCitiYyhzYW1wbGUpLi4gKworQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gYXZlcmFnZVN0YXRlICggc3RhdGUgdHVwbGU8aW50LGJpZ2ludD4sIHZhbAoraW50ICkgKworQ0FMTEVEIE9OIE5VTEwgSU5QVVQgKworUkVUVVJOUyB0dXBsZTxpbnQsYmlnaW50PiArCitMQU5HVUFHRSBqYXZhICsKK0FTIOKAmSArCitpZiAodmFsICE9IG51bGwpIFx7ICsKK3N0YXRlLnNldEludCgwLCBzdGF0ZS5nZXRJbnQoMCkrMSk7ICsKK3N0YXRlLnNldExvbmcoMSwgc3RhdGUuZ2V0TG9uZygxKSt2YWwuaW50VmFsdWUoKSk7ICsKK30gKworcmV0dXJuIHN0YXRlOyArCivigJk7CisKK0NSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIGF2ZXJhZ2VGaW5hbCAoIHN0YXRlIHR1cGxlPGludCxiaWdpbnQ+ICkgKworQ0FMTEVEIE9OIE5VTEwgSU5QVVQgKworUkVUVVJOUyBkb3VibGUgKworTEFOR1VBR0UgamF2YSArCitBUyDigJkgKworZG91YmxlIHIgPSAwOyArCitpZiAoc3RhdGUuZ2V0SW50KDApID09IDApIHJldHVybiBudWxsOyArCityID0gc3RhdGUuZ2V0TG9uZygxKTsgKworciAvPSBzdGF0ZS5nZXRJbnQoMCk7ICsKK3JldHVybiBEb3VibGUudmFsdWVPZsKuOyArCivigJk7CisKK0NSRUFURSBPUiBSRVBMQUNFIEFHR1JFR0FURSBhdmVyYWdlICggaW50ICkgKworU0ZVTkMgYXZlcmFnZVN0YXRlICsKK1NUWVBFIHR1cGxlPGludCxiaWdpbnQ+ICsKK0ZJTkFMRlVOQyBhdmVyYWdlRmluYWwgKworSU5JVENPTkQgKDAsIDApOworCitDUkVBVEUgVEFCTEUgYXRhYmxlICggKworcGsgaW50IFBSSU1BUlkgS0VZLCArCit2YWwgaW50KTsgKworSU5TRVJUIElOVE8gYXRhYmxlIChwaywgdmFsKSBWQUxVRVMgKDEsMSk7ICsKK0lOU0VSVCBJTlRPIGF0YWJsZSAocGssIHZhbCkgVkFMVUVTICgyLDIpOyArCitJTlNFUlQgSU5UTyBhdGFibGUgKHBrLCB2YWwpIFZBTFVFUyAoMywzKTsgKworSU5TRVJUIElOVE8gYXRhYmxlIChwaywgdmFsKSBWQUxVRVMgKDQsNCk7ICsKK1NFTEVDVCBhdmVyYWdlKHZhbCkgRlJPTSBhdGFibGU7ICsKK3AuCisKK1NlZSBsaW5rOiNjcmVhdGVBZ2dyZWdhdGVTdG10W2BDUkVBVEUgQUdHUkVHQVRFYF0gYW5kCitsaW5rOiNkcm9wQWdncmVnYXRlU3RtdFtgRFJPUCBBR0dSRUdBVEVgXS4KKworW1tqc29uXV0KKz09PSBKU09OIFN1cHBvcnQKKworQ2Fzc2FuZHJhIDIuMiBpbnRyb2R1Y2VzIEpTT04gc3VwcG9ydCB0byBsaW5rOiNzZWxlY3RTdG10W2BTRUxFQ1RgXSBhbmQKK2xpbms6I2luc2VydFN0bXRbYElOU0VSVGBdIHN0YXRlbWVudHMuIFRoaXMgc3VwcG9ydCBkb2VzIG5vdAorZnVuZGFtZW50YWxseSBhbHRlciB0aGUgQ1FMIEFQSSAoZm9yIGV4YW1wbGUsIHRoZSBzY2hlbWEgaXMgc3RpbGwKK2VuZm9yY2VkKSwgaXQgc2ltcGx5IHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gd29yayB3aXRoIEpTT04KK2RvY3VtZW50cy4KKworW1tzZWxlY3RKc29uXV0KKz09PT0gU0VMRUNUIEpTT04KKworV2l0aCBgU0VMRUNUYCBzdGF0ZW1lbnRzLCB0aGUgbmV3IGBKU09OYCBrZXl3b3JkIGNhbiBiZSB1c2VkIHRvIHJldHVybgorZWFjaCByb3cgYXMgYSBzaW5nbGUgYEpTT05gIGVuY29kZWQgbWFwLiBUaGUgcmVtYWluZGVyIG9mIHRoZSBgU0VMRUNUYAorc3RhdG1lbnQgYmVoYXZpb3IgaXMgdGhlIHNhbWUuCisKK1RoZSByZXN1bHQgbWFwIGtleXMgYXJlIHRoZSBzYW1lIGFzIHRoZSBjb2x1bW4gbmFtZXMgaW4gYSBub3JtYWwgcmVzdWx0CitzZXQuIEZvciBleGFtcGxlLCBhIHN0YXRlbWVudCBsaWtlIGBgYFNFTEVDVCBKU09OIGEsIHR0bChiKSBGUk9NIC4uLmAnJword291bGQgcmVzdWx0IGluIGEgbWFwIHdpdGgga2V5cyBgImEiYCBhbmQgYCJ0dGwoYikiYC4gSG93ZXZlciwgdGhpcyBpcworb25lIG5vdGFibGUgZXhjZXB0aW9uOiBmb3Igc3ltbWV0cnkgd2l0aCBgSU5TRVJUIEpTT05gIGJlaGF2aW9yLAorY2FzZS1zZW5zaXRpdmUgY29sdW1uIG5hbWVzIHdpdGggdXBwZXItY2FzZSBsZXR0ZXJzIHdpbGwgYmUgc3Vycm91bmRlZAord2l0aCBkb3VibGUgcXVvdGVzLiBGb3IgZXhhbXBsZSwgYGBgU0VMRUNUIEpTT04gbXlDb2x1bW4gRlJPTSAuLi5gJycKK3dvdWxkIHJlc3VsdCBpbiBhIG1hcCBrZXkgYCJcIm15Q29sdW1uXCIiYCAobm90ZSB0aGUgZXNjYXBlZCBxdW90ZXMpLgorCitUaGUgbWFwIHZhbHVlcyB3aWxsIGBKU09OYC1lbmNvZGVkIHJlcHJlc2VudGF0aW9ucyAoYXMgZGVzY3JpYmVkIGJlbG93KQorb2YgdGhlIHJlc3VsdCBzZXQgdmFsdWVzLgorCitbW2luc2VydEpzb25dXQorPT09PSBJTlNFUlQgSlNPTgorCitXaXRoIGBJTlNFUlRgIHN0YXRlbWVudHMsIHRoZSBuZXcgYEpTT05gIGtleXdvcmQgY2FuIGJlIHVzZWQgdG8gZW5hYmxlCitpbnNlcnRpbmcgYSBgSlNPTmAgZW5jb2RlZCBtYXAgYXMgYSBzaW5nbGUgcm93LiBUaGUgZm9ybWF0IG9mIHRoZSBgSlNPTmAKK21hcCBzaG91bGQgZ2VuZXJhbGx5IG1hdGNoIHRoYXQgcmV0dXJuZWQgYnkgYSBgU0VMRUNUIEpTT05gIHN0YXRlbWVudCBvbgordGhlIHNhbWUgdGFibGUuIEluIHBhcnRpY3VsYXIsIGNhc2Utc2Vuc2l0aXZlIGNvbHVtbiBuYW1lcyBzaG91bGQgYmUKK3N1cnJvdW5kZWQgd2l0aCBkb3VibGUgcXVvdGVzLiBGb3IgZXhhbXBsZSwgdG8gaW5zZXJ0IGludG8gYSB0YWJsZSB3aXRoCit0d28gY29sdW1ucyBuYW1lZCBgYG15S2V5JycgYW5kIGBgdmFsdWUnJywgeW91IHdvdWxkIGRvIHRoZSBmb2xsb3dpbmc6CisKK2JjKHNhbXBsZSkuICsKK0lOU0VSVCBJTlRPIG15dGFibGUgSlNPTiBgXHtgYFwnJ215S2V5XGBgJyc6IDAsIGBgdmFsdWUnJzogMH0nCisKK0FueSBjb2x1bW5zIHdoaWNoIGFyZSBvbW1pdHRlZCBmcm9tIHRoZSBgSlNPTmAgbWFwIHdpbGwgYmUgZGVmYXVsdGVkIHRvCithIGBOVUxMYCB2YWx1ZSAod2hpY2ggd2lsbCByZXN1bHQgaW4gYSB0b21ic3RvbmUgYmVpbmcgY3JlYXRlZCkuCisKK1tbanNvbkVuY29kaW5nXV0KKz09PT0gSlNPTiBFbmNvZGluZyBvZiBDYXNzYW5kcmEgRGF0YSBUeXBlcworCitXaGVyZSBwb3NzaWJsZSwgQ2Fzc2FuZHJhIHdpbGwgcmVwcmVzZW50IGFuZCBhY2NlcHQgZGF0YSB0eXBlcyBpbiB0aGVpcgorbmF0aXZlIGBKU09OYCByZXByZXNlbnRhdGlvbi4gQ2Fzc2FuZHJhIHdpbGwgYWxzbyBhY2NlcHQgc3RyaW5nCityZXByZXNlbnRhdGlvbnMgbWF0Y2hpbmcgdGhlIENRTCBsaXRlcmFsIGZvcm1hdCBmb3IgYWxsIHNpbmdsZS1maWVsZAordHlwZXMuIEZvciBleGFtcGxlLCBmbG9hdHMsIGludHMsIFVVSURzLCBhbmQgZGF0ZXMgY2FuIGJlIHJlcHJlc2VudGVkIGJ5CitDUUwgbGl0ZXJhbCBzdHJpbmdzLiBIb3dldmVyLCBjb21wb3VuZCB0eXBlcywgc3VjaCBhcyBjb2xsZWN0aW9ucywKK3R1cGxlcywgYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBtdXN0IGJlIHJlcHJlc2VudGVkIGJ5IG5hdGl2ZSBgSlNPTmAKK2NvbGxlY3Rpb25zIChtYXBzIGFuZCBsaXN0cykgb3IgYSBKU09OLWVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mCit0aGUgY29sbGVjdGlvbi4KKworVGhlIGZvbGxvd2luZyB0YWJsZSBkZXNjcmliZXMgdGhlIGVuY29kaW5ncyB0aGF0IENhc3NhbmRyYSB3aWxsIGFjY2VwdAoraW4gYElOU0VSVCBKU09OYCB2YWx1ZXMgKGFuZCBgZnJvbV9qc29uKClgIGFyZ3VtZW50cykgYXMgd2VsbCBhcyB0aGUKK2Zvcm1hdCBDYXNzYW5kcmEgd2lsbCB1c2Ugd2hlbiByZXR1cm5pbmcgZGF0YSBmb3IgYFNFTEVDVCBKU09OYAorc3RhdGVtZW50cyAoYW5kIGBmcm9tX2pzb24oKWApOgorCitbY29scz0iLCwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3x0eXBlIHxmb3JtYXRzIGFjY2VwdGVkIHxyZXR1cm4gZm9ybWF0IHxub3RlcworfGBhc2NpaWAgfHN0cmluZyB8c3RyaW5nIHxVc2VzIEpTT07igJlzIGBcdWAgY2hhcmFjdGVyIGVzY2FwZQorCit8YGJpZ2ludGAgfGludGVnZXIsIHN0cmluZyB8aW50ZWdlciB8U3RyaW5nIG11c3QgYmUgdmFsaWQgNjQgYml0IGludGVnZXIKKworfGBibG9iYCB8c3RyaW5nIHxzdHJpbmcgfFN0cmluZyBzaG91bGQgYmUgMHggZm9sbG93ZWQgYnkgYW4gZXZlbiBudW1iZXIKK29mIGhleCBkaWdpdHMKKworfGBib29sZWFuYCB8Ym9vbGVhbiwgc3RyaW5nIHxib29sZWFuIHxTdHJpbmcgbXVzdCBiZSBgYHRydWUnJyBvcgorYGBmYWxzZScnCisKK3xgZGF0ZWAgfHN0cmluZyB8c3RyaW5nIHxEYXRlIGluIGZvcm1hdCBgWVlZWS1NTS1ERGAsIHRpbWV6b25lIFVUQworCit8YGRlY2ltYWxgIHxpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nIHxmbG9hdCB8TWF5IGV4Y2VlZCAzMiBvciA2NC1iaXQKK0lFRUUtNzU0IGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBpbiBjbGllbnQtc2lkZSBkZWNvZGVyCisKK3xgZG91YmxlYCB8aW50ZWdlciwgZmxvYXQsIHN0cmluZyB8ZmxvYXQgfFN0cmluZyBtdXN0IGJlIHZhbGlkIGludGVnZXIKK29yIGZsb2F0CisKK3xgZmxvYXRgIHxpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nIHxmbG9hdCB8U3RyaW5nIG11c3QgYmUgdmFsaWQgaW50ZWdlciBvcgorZmxvYXQKKworfGBpbmV0YCB8c3RyaW5nIHxzdHJpbmcgfElQdjQgb3IgSVB2NiBhZGRyZXNzCisKK3xgaW50YCB8aW50ZWdlciwgc3RyaW5nIHxpbnRlZ2VyIHxTdHJpbmcgbXVzdCBiZSB2YWxpZCAzMiBiaXQgaW50ZWdlcgorCit8YGxpc3RgIHxsaXN0LCBzdHJpbmcgfGxpc3QgfFVzZXMgSlNPTuKAmXMgbmF0aXZlIGxpc3QgcmVwcmVzZW50YXRpb24KKworfGBtYXBgIHxtYXAsIHN0cmluZyB8bWFwIHxVc2VzIEpTT07igJlzIG5hdGl2ZSBtYXAgcmVwcmVzZW50YXRpb24KKworfGBzbWFsbGludGAgfGludGVnZXIsIHN0cmluZyB8aW50ZWdlciB8U3RyaW5nIG11c3QgYmUgdmFsaWQgMTYgYml0CitpbnRlZ2VyCisKK3xgc2V0YCB8bGlzdCwgc3RyaW5nIHxsaXN0IHxVc2VzIEpTT07igJlzIG5hdGl2ZSBsaXN0IHJlcHJlc2VudGF0aW9uCisKK3xgdGV4dGAgfHN0cmluZyB8c3RyaW5nIHxVc2VzIEpTT07igJlzIGBcdWAgY2hhcmFjdGVyIGVzY2FwZQorCit8YHRpbWVgIHxzdHJpbmcgfHN0cmluZyB8VGltZSBvZiBkYXkgaW4gZm9ybWF0IGBISC1NTS1TU1suZmZmZmZmZmZmXWAKKworfGB0aW1lc3RhbXBgIHxpbnRlZ2VyLCBzdHJpbmcgfHN0cmluZyB8QSB0aW1lc3RhbXAuIFN0cmluZ3MgY29uc3RhbnQgYXJlCithbGxvdyB0byBpbnB1dCB0aW1lc3RhbXBzIGFzIGRhdGVzLCBzZWUgbGluazojdXNpbmdkYXRlc1tXb3JraW5nIHdpdGgKK2RhdGVzXSBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gRGF0ZXN0YW1wcyB3aXRoIGZvcm1hdAorYFlZWVktTU0tREQgSEg6TU06U1MuU1NTYCBhcmUgcmV0dXJuZWQuCisKK3xgdGltZXV1aWRgIHxzdHJpbmcgfHN0cmluZyB8VHlwZSAxIFVVSUQuIFNlZSBsaW5rOiNjb25zdGFudHNbQ29uc3RhbnRzXQorZm9yIHRoZSBVVUlEIGZvcm1hdAorCit8YHRpbnlpbnRgIHxpbnRlZ2VyLCBzdHJpbmcgfGludGVnZXIgfFN0cmluZyBtdXN0IGJlIHZhbGlkIDggYml0IGludGVnZXIKKworfGB0dXBsZWAgfGxpc3QsIHN0cmluZyB8bGlzdCB8VXNlcyBKU09O4oCZcyBuYXRpdmUgbGlzdCByZXByZXNlbnRhdGlvbgorCit8YFVEVGAgfG1hcCwgc3RyaW5nIHxtYXAgfFVzZXMgSlNPTuKAmXMgbmF0aXZlIG1hcCByZXByZXNlbnRhdGlvbiB3aXRoCitmaWVsZCBuYW1lcyBhcyBrZXlzCisKK3xgdXVpZGAgfHN0cmluZyB8c3RyaW5nIHxTZWUgbGluazojY29uc3RhbnRzW0NvbnN0YW50c10gZm9yIHRoZSBVVUlECitmb3JtYXQKKworfGB2YXJjaGFyYCB8c3RyaW5nIHxzdHJpbmcgfFVzZXMgSlNPTuKAmXMgYFx1YCBjaGFyYWN0ZXIgZXNjYXBlCisKK3xgdmFyaW50YCB8aW50ZWdlciwgc3RyaW5nIHxpbnRlZ2VyIHxWYXJpYWJsZSBsZW5ndGg7IG1heSBvdmVyZmxvdyAzMiBvcgorNjQgYml0IGludGVnZXJzIGluIGNsaWVudC1zaWRlIGRlY29kZXIKK3w9PT0KKworW1tmcm9tX2pzb25dXQorPT09PSBUaGUgZnJvbV9qc29uKCkgRnVuY3Rpb24KKworVGhlIGBmcm9tX2pzb24oKWAgZnVuY3Rpb24gbWF5IGJlIHVzZWQgc2ltaWxhcmx5IHRvIGBJTlNFUlQgSlNPTmAsIGJ1dAorZm9yIGEgc2luZ2xlIGNvbHVtbiB2YWx1ZS4gSXQgbWF5IG9ubHkgYmUgdXNlZCBpbiB0aGUgYFZBTFVFU2AgY2xhdXNlIG9mCithbiBgSU5TRVJUYCBzdGF0ZW1lbnQgb3IgYXMgb25lIG9mIHRoZSBjb2x1bW4gdmFsdWVzIGluIGFuIGBVUERBVEVgLAorYERFTEVURWAsIG9yIGBTRUxFQ1RgIHN0YXRlbWVudC4gRm9yIGV4YW1wbGUsIGl0IGNhbm5vdCBiZSB1c2VkIGluIHRoZQorc2VsZWN0aW9uIGNsYXVzZSBvZiBhIGBTRUxFQ1RgIHN0YXRlbWVudC4KKworW1t0b19qc29uXV0KKz09PT0gVGhlIHRvX2pzb24oKSBGdW5jdGlvbgorCitUaGUgYHRvX2pzb24oKWAgZnVuY3Rpb24gbWF5IGJlIHVzZWQgc2ltaWxhcmx5IHRvIGBTRUxFQ1QgSlNPTmAsIGJ1dCBmb3IKK2Egc2luZ2xlIGNvbHVtbiB2YWx1ZS4gSXQgbWF5IG9ubHkgYmUgdXNlZCBpbiB0aGUgc2VsZWN0aW9uIGNsYXVzZSBvZiBhCitgU0VMRUNUYCBzdGF0ZW1lbnQuCisKK1tbYXBwZW5kaXhBXV0KKz09PSBBcHBlbmRpeCBBOiBDUUwgS2V5d29yZHMKKworQ1FMIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBfcmVzZXJ2ZWRfIGFuZCBfbm9uLXJlc2VydmVkXyBrZXl3b3Jkcy4KK1Jlc2VydmVkIGtleXdvcmRzIGNhbm5vdCBiZSB1c2VkIGFzIGlkZW50aWZpZXIsIHRoZXkgYXJlIHRydWx5IHJlc2VydmVkCitmb3IgdGhlIGxhbmd1YWdlIChidXQgb25lIGNhbiBlbmNsb3NlIGEgcmVzZXJ2ZWQga2V5d29yZCBieQorZG91YmxlLXF1b3RlcyB0byB1c2UgaXQgYXMgYW4gaWRlbnRpZmllcikuIE5vbi1yZXNlcnZlZCBrZXl3b3JkcyBob3dldmVyCitvbmx5IGhhdmUgYSBzcGVjaWZpYyBtZWFuaW5nIGluIGNlcnRhaW4gY29udGV4dCBidXQgY2FuIHVzZWQgYXMKK2lkZW50aWZlciBvdGhlcndpc2UuIFRoZSBvbmx5IF9yYWlzb24gZOKAmcOqdHJlXyBvZiB0aGVzZSBub24tcmVzZXJ2ZWQKK2tleXdvcmRzIGlzIGNvbnZlbmllbmNlOiBzb21lIGtleXdvcmQgYXJlIG5vbi1yZXNlcnZlZCB3aGVuIGl0IHdhcworYWx3YXlzIGVhc3kgZm9yIHRoZSBwYXJzZXIgdG8gZGVjaWRlIHdoZXRoZXIgdGhleSB3ZXJlIHVzZWQgYXMga2V5d29yZHMKK29yIG5vdC4KKworW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfEtleXdvcmQgfFJlc2VydmVkPworfGBBRERgIHx5ZXMKK3xgQUdHUkVHQVRFYCB8bm8KK3xgQUxMYCB8bm8KK3xgQUxMT1dgIHx5ZXMKK3xgQUxURVJgIHx5ZXMKK3xgQU5EYCB8eWVzCit8YEFQUExZYCB8eWVzCit8YEFTYCB8bm8KK3xgQVNDYCB8eWVzCit8YEFTQ0lJYCB8bm8KK3xgQVVUSE9SSVpFYCB8eWVzCit8YEJBVENIYCB8eWVzCit8YEJFR0lOYCB8eWVzCit8YEJJR0lOVGAgfG5vCit8YEJMT0JgIHxubworfGBCT09MRUFOYCB8bm8KK3xgQllgIHx5ZXMKK3xgQ0FMTEVEYCB8bm8KK3xgQ0FTVGAgfG5vCit8YENMVVNURVJJTkdgIHxubworfGBDT0xVTU5GQU1JTFlgIHx5ZXMKK3xgQ09NUEFDVGAgfG5vCit8YENPTlRBSU5TYCB8bm8KK3xgQ09VTlRgIHxubworfGBDT1VOVEVSYCB8bm8KK3xgQ1JFQVRFYCB8eWVzCit8YENVU1RPTWAgfG5vCit8YERBVEVgIHxubworfGBERUNJTUFMYCB8bm8KK3xgREVGQVVMVGAgfHllcworfGBERUxFVEVgIHx5ZXMKK3xgREVTQ2AgfHllcworfGBERVNDUklCRWAgfHllcworfGBESVNUSU5DVGAgfG5vCit8YERPVUJMRWAgfG5vCit8YERST1BgIHx5ZXMKK3xgRFVSQVRJT05gIHxubworfGBFTlRSSUVTYCB8eWVzCit8YEVYRUNVVEVgIHx5ZXMKK3xgRVhJU1RTYCB8bm8KK3xgRklMVEVSSU5HYCB8bm8KK3xgRklOQUxGVU5DYCB8bm8KK3xgRkxPQVRgIHxubworfGBGUk9NYCB8eWVzCit8YEZST1pFTmAgfG5vCit8YEZVTExgIHx5ZXMKK3xgRlVOQ1RJT05gIHxubworfGBGVU5DVElPTlNgIHxubworfGBHUkFOVGAgfHllcworfGBHUk9VUGAgfG5vCit8YElGYCB8eWVzCit8YElOYCB8eWVzCit8YElOREVYYCB8eWVzCit8YElORVRgIHxubworfGBJTkZJTklUWWAgfHllcworfGBJTklUQ09ORGAgfG5vCit8YElOUFVUYCB8bm8KK3xgSU5TRVJUYCB8eWVzCit8YElOVGAgfG5vCit8YElOVE9gIHx5ZXMKK3xgSVNgIHx5ZXMKK3xgSlNPTmAgfG5vCit8YEtFWWAgfG5vCit8YEtFWVNgIHxubworfGBLRVlTUEFDRWAgfHllcworfGBLRVlTUEFDRVNgIHxubworfGBMQU5HVUFHRWAgfG5vCit8YExJS0VgIHxubworfGBMSU1JVGAgfHllcworfGBMSVNUYCB8bm8KK3xgTE9HSU5gIHxubworfGBNQVBgIHxubworfGBNQVNLRURgIHxubworfGBNQVRFUklBTElaRURgIHx5ZXMKK3xgTUJFQU5gIHx5ZXMKK3xgTUJFQU5TYCB8eWVzCit8YE1PRElGWWAgfHllcworfGBOQU5gIHx5ZXMKK3xgTk9MT0dJTmAgfG5vCit8YE5PUkVDVVJTSVZFYCB8eWVzCit8YE5PU1VQRVJVU0VSYCB8bm8KK3xgTk9UYCB8eWVzCit8YE5VTExgIHx5ZXMKK3xgT0ZgIHx5ZXMKK3xgT05gIHx5ZXMKK3xgT1BUSU9OU2AgfG5vCit8YE9SYCB8eWVzCit8YE9SREVSYCB8eWVzCit8YFBBUlRJVElPTmAgfG5vCit8YFBBU1NXT1JEYCB8bm8KK3xgUEVSYCB8bm8KK3xgUEVSTUlTU0lPTmAgfG5vCit8YFBFUk1JU1NJT05TYCB8bm8KK3xgUFJJTUFSWWAgfHllcworfGBSRU5BTUVgIHx5ZXMKK3xgUkVQTEFDRWAgfHllcworfGBSRVRVUk5TYCB8bm8KK3xgUkVWT0tFYCB8eWVzCit8YFJPTEVgIHxubworfGBST0xFU2AgfG5vCit8YFNDSEVNQWAgfHllcworfGBTRUxFQ1RgIHx5ZXMKK3xgU0VMRUNUX01BU0tFRGAgfG5vCit8YFNFVGAgfHllcworfGBTRlVOQ2AgfG5vCit8YFNNQUxMSU5UYCB8bm8KK3xgU1RBVElDYCB8bm8KK3xgU1RPUkFHRWAgfG5vCit8YFNUWVBFYCB8bm8KK3xgU1VQRVJVU0VSYCB8bm8KK3xgVEFCTEVgIHx5ZXMKK3xgVEVYVGAgfG5vCit8YFRJTUVgIHxubworfGBUSU1FU1RBTVBgIHxubworfGBUSU1FVVVJRGAgfG5vCit8YFRJTllJTlRgIHxubworfGBUT2AgfHllcworfGBUT0tFTmAgfHllcworfGBUUklHR0VSYCB8bm8KK3xgVFJVTkNBVEVgIHx5ZXMKK3xgVFRMYCB8bm8KK3xgVFVQTEVgIHxubworfGBUWVBFYCB8bm8KK3xgVU5MT0dHRURgIHx5ZXMKK3xgVU5NQVNLYCB8bm8KK3xgVU5TRVRgIHx5ZXMKK3xgVVBEQVRFYCB8eWVzCit8YFVTRWAgfHllcworfGBVU0VSYCB8bm8KK3xgVVNFUlNgIHxubworfGBVU0lOR2AgfHllcworfGBVVUlEYCB8bm8KK3xgVkFMVUVTYCB8bm8KK3xgVkFSQ0hBUmAgfG5vCit8YFZBUklOVGAgfG5vCit8YFZJRVdgIHx5ZXMKK3xgV0hFUkVgIHx5ZXMKK3xgV0lUSGAgfHllcworfGBXUklURVRJTUVgIHxubworfD09PQorCitbW2FwcGVuZGl4Ql1dCis9PT0gQXBwZW5kaXggQjogQ1FMIFJlc2VydmVkIFR5cGVzCisKK1RoZSBmb2xsb3dpbmcgdHlwZSBuYW1lcyBhcmUgbm90IGN1cnJlbnRseSB1c2VkIGJ5IENRTCwgYnV0IGFyZSByZXNlcnZlZAorZm9yIHBvdGVudGlhbCBmdXR1cmUgdXNlLiBVc2VyLWRlZmluZWQgdHlwZXMgbWF5IG5vdCB1c2UgcmVzZXJ2ZWQgdHlwZQorbmFtZXMgYXMgdGhlaXIgbmFtZS4KKworW2NvbHM9IiIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8dHlwZQorfGBiaXRzdHJpbmdgCit8YGJ5dGVgCit8YGNvbXBsZXhgCit8YGRhdGVgCit8YGVudW1gCit8YGludGVydmFsYAorfGBtYWNhZGRyYAorfD09PQorCis9PT0gQ2hhbmdlcworCitUaGUgZm9sbG93aW5nIGRlc2NyaWJlcyB0aGUgY2hhbmdlcyBpbiBlYWNoIHZlcnNpb24gb2YgQ1FMLgorCis9PT09IDMuNC4zCisKKyogU3VwcG9ydCBmb3IgYEdST1VQIEJZYC4gU2VlIGxpbms6I3NlbGVjdEdyb3VwQnlbYDxncm91cC1ieT5gXSAoc2VlCitodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xMDcwNylbQ0FTU0FORFJBLTEwNzA3XS4KKworPT09PSAzLjQuMgorCisqIFN1cHBvcnQgZm9yIHNlbGVjdGluZyBlbGVtZW50cyBhbmQgc2xpY2VzIG9mIGEgY29sbGVjdGlvbgorKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTczOTYpW0NBU1NBTkRSQS03Mzk2XS4KKworPT09PSAzLjQuMgorCisqIGxpbms6I3VwZGF0ZU9wdGlvbnNbYElOU0VSVC9VUERBVEUgb3B0aW9uc2BdIGZvciB0YWJsZXMgaGF2aW5nIGEKK2RlZmF1bHRfdGltZV90b19saXZlIHNwZWNpZnlpbmcgYSBUVEwgb2YgMCB3aWxsIHJlbW92ZSB0aGUgVFRMIGZyb20gdGhlCitpbnNlcnRlZCBvciB1cGRhdGVkIHZhbHVlcworKiBsaW5rOiNhbHRlclRhYmxlU3RtdFtgQUxURVIgVEFCTEVgXSBgQUREYCBhbmQgYERST1BgIG5vdyBhbGxvdyBtdXRpcGxlCitjb2x1bW5zIHRvIGJlIGFkZGVkL3JlbW92ZWQKKyogTmV3IGxpbms6I3NlbGVjdExpbWl0W2BQRVIgUEFSVElUSU9OIExJTUlUYF0gb3B0aW9uIChzZWUKK2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTcwMTcpW0NBU1NBTkRSQS03MDE3XS4KKyogbGluazojdWRmc1tVc2VyLWRlZmluZWQgZnVuY3Rpb25zXSBjYW4gbm93IGluc3RhbnRpYXRlIGBVRFRWYWx1ZWAgYW5kCitgVHVwbGVWYWx1ZWAgaW5zdGFuY2VzIHZpYSB0aGUgbmV3IGBVREZDb250ZXh0YCBpbnRlcmZhY2UgKHNlZQoraHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTA4MTgpW0NBU1NBTkRSQS0xMDgxOF0uCisqIGBgVXNlci1kZWZpbmVkIHR5cGVzJycjY3JlYXRlVHlwZVN0bXQgbWF5IG5vdyBiZSBzdG9yZWQgaW4gYQorbm9uLWZyb3plbiBmb3JtLCBhbGxvd2luZyBpbmRpdmlkdWFsIGZpZWxkcyB0byBiZSB1cGRhdGVkIGFuZCBkZWxldGVkIGluCitsaW5rOiN1cGRhdGVTdG10W2BVUERBVEVgIHN0YXRlbWVudHNdIGFuZCBsaW5rOiNkZWxldGVTdG10W2BERUxFVEVgCitzdGF0ZW1lbnRzXSwgcmVzcGVjdGl2ZWx5LgorKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTc0MjMpW0NBU1NBTkRSQS03NDIzXQorCis9PT09IDMuNC4xCisKKyogQWRkcyBgQ0FTVGAgZnVuY3Rpb25zLiBTZWUgbGluazojY2FzdEZ1bltgQ2FzdGBdLgorCis9PT09IDMuNC4wCisKKyogU3VwcG9ydCBmb3IgbGluazojY3JlYXRlTVZTdG10W21hdGVyaWFsaXplZCB2aWV3c10KKyogbGluazojZGVsZXRlU3RtdFtgREVMRVRFYF0gc3VwcG9ydCBmb3IgaW5lcXVhbGl0eSBleHByZXNzaW9ucyBhbmQgYElOYAorcmVzdHJpY3Rpb25zIG9uIGFueSBwcmltYXJ5IGtleSBjb2x1bW5zCisqIGxpbms6I3VwZGF0ZVN0bXRbYFVQREFURWBdIHN1cHBvcnQgZm9yIGBJTmAgcmVzdHJpY3Rpb25zIG9uIGFueQorcHJpbWFyeSBrZXkgY29sdW1ucworCis9PT09IDMuMy4xCisKKyogVGhlIHN5bnRheCBgVFJVTkNBVEUgVEFCTEUgWGAgaXMgbm93IGFjY2VwdGVkIGFzIGFuIGFsaWFzIGZvcgorYFRSVU5DQVRFIFhgCisKKz09PT0gMy4zLjAKKworKiBBZGRzIG5ldyBsaW5rOiNhZ2dyZWdhdGVzW2FnZ3JlZ2F0ZXNdCisqIFVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYXJlIG5vdyBzdXBwb3J0ZWQgdGhyb3VnaAorbGluazojY3JlYXRlRnVuY3Rpb25TdG10W2BDUkVBVEUgRlVOQ1RJT05gXSBhbmQKK2xpbms6I2Ryb3BGdW5jdGlvblN0bXRbYERST1AgRlVOQ1RJT05gXS4KKyogVXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgYXJlIG5vdyBzdXBwb3J0ZWQgdGhyb3VnaAorbGluazojY3JlYXRlQWdncmVnYXRlU3RtdFtgQ1JFQVRFIEFHR1JFR0FURWBdIGFuZAorbGluazojZHJvcEFnZ3JlZ2F0ZVN0bXRbYERST1AgQUdHUkVHQVRFYF0uCisqIEFsbG93cyBkb3VibGUtZG9sbGFyIGVuY2xvc2VkIHN0cmluZ3MgbGl0ZXJhbHMgYXMgYW4gYWx0ZXJuYXRpdmUgdG8KK3NpbmdsZS1xdW90ZSBlbmNsb3NlZCBzdHJpbmdzLgorKiBJbnRyb2R1Y2VzIFJvbGVzIHRvIHN1cGVyY2VkZSB1c2VyIGJhc2VkIGF1dGhlbnRpY2F0aW9uIGFuZCBhY2Nlc3MKK2NvbnRyb2wKKyogbGluazojdXNpbmdkYXRlc1tgRGF0ZWBdIGFuZCBsaW5rOnVzaW5ndGltZVtgVGltZWBdIGRhdGEgdHlwZXMgaGF2ZQorYmVlbiBhZGRlZAorKiBsaW5rOiNqc29uW2BKU09OYF0gc3VwcG9ydCBoYXMgYmVlbiBhZGRlZAorKiBgVGlueWludGAgYW5kIGBTbWFsbGludGAgZGF0YSB0eXBlcyBoYXZlIGJlZW4gYWRkZWQKKyogQWRkcyBuZXcgdGltZSBjb252ZXJzaW9uIGZ1bmN0aW9ucyBhbmQgZGVwcmVjYXRlIGBkYXRlT2ZgIGFuZAorYHVuaXhUaW1lc3RhbXBPZmAuIFNlZSBsaW5rOiN0aW1lRnVuW2BUaW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zYF0KKworPT09PSAzLjIuMAorCisqIFVzZXItZGVmaW5lZCB0eXBlcyBhcmUgbm93IHN1cHBvcnRlZCB0aHJvdWdoCitsaW5rOiNjcmVhdGVUeXBlU3RtdFtgQ1JFQVRFIFRZUEVgXSwgbGluazojYWx0ZXJUeXBlU3RtdFtgQUxURVIgVFlQRWBdLAorYW5kIGxpbms6I2Ryb3BUeXBlU3RtdFtgRFJPUCBUWVBFYF0KKyogbGluazojY3JlYXRlSW5kZXhTdG10W2BDUkVBVEUgSU5ERVhgXSBub3cgc3VwcG9ydHMgaW5kZXhpbmcgY29sbGVjdGlvbgorY29sdW1ucywgaW5jbHVkaW5nIGluZGV4aW5nIHRoZSBrZXlzIG9mIG1hcCBjb2xsZWN0aW9ucyB0aHJvdWdoIHRoZQorYGtleXMoKWAgZnVuY3Rpb24KKyogSW5kZXhlcyBvbiBjb2xsZWN0aW9ucyBtYXkgYmUgcXVlcmllZCB1c2luZyB0aGUgbmV3IGBDT05UQUlOU2AgYW5kCitgQ09OVEFJTlMgS0VZYCBvcGVyYXRvcnMKKyogVHVwbGUgdHlwZXMgd2VyZSBhZGRlZCB0byBob2xkIGZpeGVkLWxlbmd0aCBzZXRzIG9mIHR5cGVkIHBvc2l0aW9uYWwKK2ZpZWxkcyAoc2VlIHRoZSBzZWN0aW9uIG9uIGxpbms6I3R5cGVzW3R5cGVzXSApCisqIGxpbms6I2Ryb3BJbmRleFN0bXRbYERST1AgSU5ERVhgXSBub3cgc3VwcG9ydHMgb3B0aW9uYWxseSBzcGVjaWZ5aW5nIGEKK2tleXNwYWNlCisKKz09PT0gMy4xLjcKKworKiBgU0VMRUNUYCBzdGF0ZW1lbnRzIG5vdyBzdXBwb3J0IHNlbGVjdGluZyBtdWx0aXBsZSByb3dzIGluIGEgc2luZ2xlCitwYXJ0aXRpb24gdXNpbmcgYW4gYElOYCBjbGF1c2Ugb24gY29tYmluYXRpb25zIG9mIGNsdXN0ZXJpbmcgY29sdW1ucy4KK1NlZSBsaW5rOiNzZWxlY3RXaGVyZVtTRUxFQ1QgV0hFUkVdIGNsYXVzZXMuCisqIGBJRiBOT1QgRVhJU1RTYCBhbmQgYElGIEVYSVNUU2Agc3ludGF4IGlzIG5vdyBzdXBwb3J0ZWQgYnkKK2BDUkVBVEUgVVNFUmAgYW5kIGBEUk9QIFVTRVJgIHN0YXRtZW5ldHMsIHJlc3BlY3RpdmVseS4KKworPT09PSAzLjEuNgorCisqIEEgbmV3IGxpbms6I3V1aWRGdW5bYHV1aWRgIG1ldGhvZF0gaGFzIGJlZW4gYWRkZWQuCisqIFN1cHBvcnQgZm9yIGBERUxFVEUgLi4uIElGIEVYSVNUU2Agc3ludGF4LgorCis9PT09IDMuMS41CisKKyogSXQgaXMgbm93IHBvc3NpYmxlIHRvIGdyb3VwIGNsdXN0ZXJpbmcgY29sdW1ucyBpbiBhIHJlbGF0aWlvbiwgc2VlCitsaW5rOiNzZWxlY3RXaGVyZVtTRUxFQ1QgV0hFUkVdIGNsYXVzZXMuCisqIEFkZGVkIHN1cHBvcnQgZm9yIGBTVEFUSUNgIGNvbHVtbnMsIHNlZSBsaW5rOiNjcmVhdGVUYWJsZVN0YXRpY1tzdGF0aWMKK2luIENSRUFURSBUQUJMRV0uCisKKz09PT0gMy4xLjQKKworKiBgQ1JFQVRFIElOREVYYCBub3cgYWxsb3dzIHNwZWNpZnlpbmcgb3B0aW9ucyB3aGVuIGNyZWF0aW5nIENVU1RPTQoraW5kZXhlcyAoc2VlIGxpbms6I2NyZWF0ZUluZGV4U3RtdFtDUkVBVEUgSU5ERVggcmVmZXJlbmNlXSApLgorCis9PT09IDMuMS4zCisKKyogTWlsbGlzZWNvbmQgcHJlY2lzaW9uIGZvcm1hdHMgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSB0aW1lc3RhbXAgcGFyc2VyCisoc2VlIGxpbms6I3VzaW5ndGltZXN0YW1wc1t3b3JraW5nIHdpdGggZGF0ZXNdICkuCisKKz09PT0gMy4xLjIKKworKiBgTmFOYCBhbmQgYEluZmluaXR5YCBoYXMgYmVlbiBhZGRlZCBhcyB2YWxpZCBmbG9hdCBjb250YW50cy4gVGhleSBhcmUKK25vdyByZXNlcnZlZCBrZXl3b3Jkcy4gSW4gdGhlIHVubGlrZWx5IGNhc2UgeW91IHdlIHVzaW5nIHRoZW0gYXMgYQorY29sdW1uIGlkZW50aWZpZXIgKG9yIGtleXNwYWNlL3RhYmxlIG9uZSksIHlvdSB3aWxsIG5vZXcgbmVlZCB0byBkb3VibGUKK3F1b3RlIHRoZW0gKHNlZSBsaW5rOiNpZGVudGlmaWVyc1txdW90ZSBpZGVudGlmaWVyc10gKS4KKworPT09PSAzLjEuMQorCisqIGBTRUxFQ1RgIHN0YXRlbWVudCBub3cgYWxsb3dzIGxpc3RpbmcgdGhlIHBhcnRpdGlvbiBrZXlzICh1c2luZyB0aGUKK2BESVNUSU5DVGAgbW9kaWZpZXIpLiBTZWUKK2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTQ1MzZbQ0FTU0FORFJBLTQ1MzZdLgorKiBUaGUgc3ludGF4IGBjIElOID9gIGlzIG5vdyBzdXBwb3J0ZWQgaW4gYFdIRVJFYCBjbGF1c2VzLiBJbiB0aGF0IGNhc2UsCit0aGUgdmFsdWUgZXhwZWN0ZWQgZm9yIHRoZSBiaW5kIHZhcmlhYmxlIHdpbGwgYmUgYSBsaXN0IG9mIHdoYXRldmVyIHR5cGUKK2BjYCBpcy4KKyogSXQgaXMgbm93IHBvc3NpYmxlIHRvIHVzZSBuYW1lZCBiaW5kIHZhcmlhYmxlcyAodXNpbmcgYDpuYW1lYCBpbnN0ZWFkCitvZiBgP2ApLgorCis9PT09IDMuMS4wCisKKyogbGluazojYWx0ZXJUYWJsZVN0bXRbQUxURVIgVEFCTEVdIGBEUk9QYCBvcHRpb24gaGFzIGJlZW4gcmVlbmFibGVkIGZvcgorQ1FMMyB0YWJsZXMgYW5kIGhhcyBuZXcgc2VtYW50aWNzIG5vdzogdGhlIHNwYWNlIGZvcm1lcmx5IHVzZWQgYnkKK2Ryb3BwZWQgY29sdW1ucyB3aWxsIG5vdyBiZSBldmVudHVhbGx5IHJlY2xhaW1lZCAocG9zdC1jb21wYWN0aW9uKS4gWW91CitzaG91bGQgbm90IHJlYWRkIHByZXZpb3VzbHkgZHJvcHBlZCBjb2x1bW5zIHVubGVzcyB5b3UgdXNlIHRpbWVzdGFtcHMKK3dpdGggbWljcm9zZWNvbmQgcHJlY2lzaW9uIChzZWUKK2h0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTM5MTlbQ0FTU0FORFJBLTM5MTldIGZvcgorbW9yZSBkZXRhaWxzKS4KKyogYFNFTEVDVGAgc3RhdGVtZW50IG5vdyBzdXBwb3J0cyBhbGlhc2VzIGluIHNlbGVjdCBjbGF1c2UuIEFsaWFzZXMgaW4KK1dIRVJFIGFuZCBPUkRFUiBCWSBjbGF1c2VzIGFyZSBub3Qgc3VwcG9ydGVkLiBTZWUgdGhlCitsaW5rOiNzZWxlY3RTdG10W3NlY3Rpb24gb24gc2VsZWN0XSBmb3IgZGV0YWlscy4KKyogYENSRUFURWAgc3RhdGVtZW50cyBmb3IgYEtFWVNQQUNFYCwgYFRBQkxFYCBhbmQgYElOREVYYCBub3cgc3VwcG9ydHMKK2FuIGBJRiBOT1QgRVhJU1RTYCBjb25kaXRpb24uIFNpbWlsYXJseSwgYERST1BgIHN0YXRlbWVudHMgc3VwcG9ydCBhCitgSUYgRVhJU1RTYCBjb25kaXRpb24uCisqIGBJTlNFUlRgIHN0YXRlbWVudHMgb3B0aW9uYWxseSBzdXBwb3J0cyBhIGBJRiBOT1QgRVhJU1RTYCBjb25kaXRpb24KK2FuZCBgVVBEQVRFYCBzdXBwb3J0cyBgSUZgIGNvbmRpdGlvbnMuCisKKz09PT0gMy4wLjUKKworKiBgU0VMRUNUYCwgYFVQREFURWAsIGFuZCBgREVMRVRFYCBzdGF0ZW1lbnRzIG5vdyBhbGxvdyBlbXB0eSBgSU5gCityZWxhdGlvbnMgKHNlZQoraHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNTYyNilbQ0FTU0FORFJBLTU2MjZdLgorCis9PT09IDMuMC40CisKKyogVXBkYXRlZCB0aGUgc3ludGF4IGZvciBjdXN0b20gbGluazojY3JlYXRlSW5kZXhTdG10W3NlY29uZGFyeQoraW5kZXhlc10uCisqIE5vbi1lcXVhbCBjb25kaXRpb24gb24gdGhlIHBhcnRpdGlvbiBrZXkgYXJlIG5vdyBuZXZlciBzdXBwb3J0ZWQsIGV2ZW4KK2ZvciBvcmRlcmluZyBwYXJ0aXRpb25lciBhcyB0aGlzIHdhcyBub3QgY29ycmVjdCAodGhlIG9yZGVyIHdhcyAqbm90KgordGhlIG9uZSBvZiB0aGUgdHlwZSBvZiB0aGUgcGFydGl0aW9uIGtleSkuIEluc3RlYWQsIHRoZSBgdG9rZW5gIG1ldGhvZAorc2hvdWxkIGFsd2F5cyBiZSB1c2VkIGZvciByYW5nZSBxdWVyaWVzIG9uIHRoZSBwYXJ0aXRpb24ga2V5IChzZWUKK2xpbms6I3NlbGVjdFdoZXJlW1dIRVJFIGNsYXVzZXNdICkuCisKKz09PT0gMy4wLjMKKworKiBTdXBwb3J0IGZvciBjdXN0b20gbGluazojY3JlYXRlSW5kZXhTdG10W3NlY29uZGFyeSBpbmRleGVzXSBoYXMgYmVlbgorYWRkZWQuCisKKz09PT0gMy4wLjIKKworKiBUeXBlIHZhbGlkYXRpb24gZm9yIHRoZSBsaW5rOiNjb25zdGFudHNbY29uc3RhbnRzXSBoYXMgYmVlbiBmaXhlZC4gRm9yCitpbnN0YW5jZSwgdGhlIGltcGxlbWVudGF0aW9uIHVzZWQgdG8gYWxsb3cgYCcyJ2AgYXMgYSB2YWxpZCB2YWx1ZSBmb3IgYW4KK2BpbnRgIGNvbHVtbiAoaW50ZXJwcmV0aW5nIGl0IGhhcyB0aGUgZXF1aXZhbGVudCBvZiBgMmApLCBvciBgNDJgIGFzIGEKK3ZhbGlkIGBibG9iYCB2YWx1ZSAoaW4gd2hpY2ggY2FzZSBgNDJgIHdhcyBpbnRlcnByZXRlZCBhcyBhbiBoZXhhZGVjaW1hbAorcmVwcmVzZW50YXRpb24gb2YgdGhlIGJsb2IpLiBUaGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZSwgdHlwZSB2YWxpZGF0aW9uCitvZiBjb25zdGFudHMgaXMgbm93IG1vcmUgc3RyaWN0LiBTZWUgdGhlIGxpbms6I3R5cGVzW2RhdGEgdHlwZXNdIHNlY3Rpb24KK2ZvciBkZXRhaWxzIG9uIHdoaWNoIGNvbnN0YW50IGlzIGFsbG93ZWQgZm9yIHdoaWNoIHR5cGUuCisqIFRoZSB0eXBlIHZhbGlkYXRpb24gZml4ZWQgb2YgdGhlIHByZXZpb3VzIHBvaW50IGhhcyBsZWFkIHRvIHRoZQoraW50cm9kdWN0aW9uIG9mIGxpbms6I2NvbnN0YW50c1tibG9icyBjb25zdGFudHNdIHRvIGFsbG93IGlucHV0aW5nCitibG9icy4gRG8gbm90ZSB0aGF0IHdoaWxlIGlucHV0aW5nIGJsb2JzIGFzIHN0cmluZ3MgY29uc3RhbnQgaXMgc3RpbGwKK3N1cHBvcnRlZCBieSB0aGlzIHZlcnNpb24gKHRvIGFsbG93IHNtb290aGVyIHRyYW5zaXRpb24gdG8gYmxvYgorY29uc3RhbnQpLCBpdCBpcyBub3cgZGVwcmVjYXRlZCAoaW4gcGFydGljdWxhciB0aGUgbGluazojdHlwZXNbZGF0YQordHlwZXNdIHNlY3Rpb24gZG9lcyBub3QgbGlzdCBzdHJpbmdzIGNvbnN0YW50cyBhcyB2YWxpZCBibG9icykgYW5kIHdpbGwKK2JlIHJlbW92ZWQgYnkgYSBmdXR1cmUgdmVyc2lvbi4gSWYgeW91IHdlcmUgdXNpbmcgc3RyaW5ncyBhcyBibG9icywgeW91CitzaG91bGQgdGh1cyB1cGRhdGUgeW91ciBjbGllbnQgY29kZSBBU0FQIHRvIHN3aXRjaCBibG9iIGNvbnN0YW50cy4KKyogQSBudW1iZXIgb2YgZnVuY3Rpb25zIHRvIGNvbnZlcnQgbmF0aXZlIHR5cGVzIHRvIGJsb2JzIGhhdmUgYWxzbyBiZWVuCitpbnRyb2R1Y2VkLiBGdXJ0aGVybW9yZSB0aGUgdG9rZW4gZnVuY3Rpb24gaXMgbm93IGFsc28gYWxsb3dlZCBpbiBzZWxlY3QKK2NsYXVzZXMuIFNlZSB0aGUgbGluazojZnVuY3Rpb25zW3NlY3Rpb24gb24gZnVuY3Rpb25zXSBmb3IgZGV0YWlscy4KKworPT09PSAzLjAuMQorCisqIGxpbms6I3VzaW5ndGltZXN0YW1wc1tEYXRlIHN0cmluZ3NdIChhbmQgdGltZXN0YW1wcykgYXJlIG5vIGxvbmdlcgorYWNjZXB0ZWQgYXMgdmFsaWQgYHRpbWV1dWlkYCB2YWx1ZXMuIERvaW5nIHNvIHdhcyBhIGJ1ZyBpbiB0aGUgc2Vuc2UKK3RoYXQgZGF0ZSBzdHJpbmcgYXJlIG5vdCB2YWxpZCBgdGltZXV1aWRgLCBhbmQgaXQgd2FzIHRodXMgcmVzdWx0aW5nIGluCitodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS00OTM2W2NvbmZ1c2luZworYmVoYXZpb3JzXS4gSG93ZXZlciwgdGhlIGZvbGxvd2luZyBuZXcgbWV0aG9kcyBoYXZlIGJlZW4gYWRkZWQgdG8gaGVscAord29ya2luZyB3aXRoIGB0aW1ldXVpZGA6IGBub3dgLCBgbWluVGltZXV1aWRgLCBgbWF4VGltZXV1aWRgICwgYGRhdGVPZmAKK2FuZCBgdW5peFRpbWVzdGFtcE9mYC4gU2VlIHRoZSBsaW5rOiN0aW1ldXVpZEZ1bltzZWN0aW9uIGRlZGljYXRlZCB0bwordGhlc2UgbWV0aG9kc10gZm9yIG1vcmUgZGV0YWlsLgorKiBgYEZsb2F0IGNvbnN0YW50cycnI2NvbnN0YW50cyBub3cgc3VwcG9ydCB0aGUgZXhwb25lbnQgbm90YXRpb24uIEluCitvdGhlciB3b3JkcywgYDQuMkUxMGAgaXMgbm93IGEgdmFsaWQgZmxvYXRpbmcgcG9pbnQgdmFsdWUuCisKKz09PSBWZXJzaW9uaW5nCisKK1ZlcnNpb25pbmcgb2YgdGhlIENRTCBsYW5ndWFnZSBhZGhlcmVzIHRvIHRoZSBodHRwOi8vc2VtdmVyLm9yZ1tTZW1hbnRpYworVmVyc2lvbmluZ10gZ3VpZGVsaW5lcy4gVmVyc2lvbnMgdGFrZSB0aGUgZm9ybSBYLlkuWiB3aGVyZSBYLCBZLCBhbmQgWgorYXJlIGludGVnZXIgdmFsdWVzIHJlcHJlc2VudGluZyBtYWpvciwgbWlub3IsIGFuZCBwYXRjaCBsZXZlbAorcmVzcGVjdGl2ZWx5LiBUaGVyZSBpcyBubyBjb3JyZWxhdGlvbiBiZXR3ZWVuIENhc3NhbmRyYSByZWxlYXNlIHZlcnNpb25zCithbmQgdGhlIENRTCBsYW5ndWFnZSB2ZXJzaW9uLgorCitbY29scz0iLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8dmVyc2lvbiB8ZGVzY3JpcHRpb24KK3xNYWpvciB8VGhlIG1ham9yIHZlcnNpb24gX211c3RfIGJlIGJ1bXBlZCB3aGVuIGJhY2t3YXJkIGluY29tcGF0aWJsZQorY2hhbmdlcyBhcmUgaW50cm9kdWNlZC4gVGhpcyBzaG91bGQgcmFyZWx5IG9jY3VyLgorCit8TWlub3IgfE1pbm9yIHZlcnNpb24gaW5jcmVtZW50cyBvY2N1ciB3aGVuIG5ldywgYnV0IGJhY2t3YXJkCitjb21wYXRpYmxlLCBmdW5jdGlvbmFsaXR5IGlzIGludHJvZHVjZWQuCisKK3xQYXRjaCB8VGhlIHBhdGNoIHZlcnNpb24gaXMgaW5jcmVtZW50ZWQgd2hlbiBidWdzIGFyZSBmaXhlZC4KK3w9PT0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9kZGwuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9kZGwuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjkwNWY1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2RkbC5hZG9jCkBAIC0wLDAgKzEsODA2IEBACis9IERhdGEgRGVmaW5pdGlvbgorOnRhYnM6CisKK0NRTCBzdG9yZXMgZGF0YSBpbiBfdGFibGVzXywgd2hvc2Ugc2NoZW1hIGRlZmluZXMgdGhlIGxheW91dCBvZiB0aGUKK2RhdGEgaW4gdGhlIHRhYmxlLiBUYWJsZXMgYXJlIGxvY2F0ZWQgaW4gX2tleXNwYWNlc18uIAorQSBrZXlzcGFjZSBkZWZpbmVzIG9wdGlvbnMgdGhhdCBhcHBseSB0byBhbGwgdGhlIGtleXNwYWNlJ3MgdGFibGVzLiAKK1RoZSB4cmVmOmNxbC9kZGwuYWRvYyNyZXBsaWNhdGlvbi1zdHJhdGVneVtyZXBsaWNhdGlvbiBzdHJhdGVneV0KK2lzIGFuIGltcG9ydGFudCBrZXlzcGFjZSBvcHRpb24sIGFzIGlzIHRoZSByZXBsaWNhdGlvbiBmYWN0b3IuIAorQSBnb29kIGdlbmVyYWwgcnVsZSBpcyBvbmUga2V5c3BhY2UgcGVyIGFwcGxpY2F0aW9uLgorSXQgaXMgY29tbW9uIGZvciBhIGNsdXN0ZXIgdG8gZGVmaW5lIG9ubHkgb25lIGtleXNwYWNlIGZvciBhbiBhY3RpdmUgYXBwbGljYXRpb24uCisKK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIHN0YXRlbWVudHMgdXNlZCB0byBjcmVhdGUsIG1vZGlmeSwgYW5kIHJlbW92ZQordGhvc2Uga2V5c3BhY2UgYW5kIHRhYmxlcy4KKworPT0gQ29tbW9uIGRlZmluaXRpb25zCisKK1RoZSBuYW1lcyBvZiB0aGUga2V5c3BhY2VzIGFuZCB0YWJsZXMgYXJlIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZworZ3JhbW1hcjoKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9rc190YWJsZS5ibmZbXQorLS0tLQorCitCb3RoIGtleXNwYWNlIGFuZCB0YWJsZSBuYW1lIHNob3VsZCBiZSBjb21wcmlzZWQgb2Ygb25seSBhbHBoYW51bWVyaWMKK2NoYXJhY3RlcnMsIGNhbm5vdCBiZSBlbXB0eSBhbmQgYXJlIGxpbWl0ZWQgaW4gc2l6ZSB0byA0OCBjaGFyYWN0ZXJzCisodGhhdCBsaW1pdCBleGlzdHMgbW9zdGx5IHRvIGF2b2lkIGZpbGVuYW1lcyAod2hpY2ggbWF5IGluY2x1ZGUgdGhlCitrZXlzcGFjZSBhbmQgdGFibGUgbmFtZSkgdG8gZ28gb3ZlciB0aGUgbGltaXRzIG9mIGNlcnRhaW4gZmlsZSBzeXN0ZW1zKS4KK0J5IGRlZmF1bHQsIGtleXNwYWNlIGFuZCB0YWJsZSBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZSAoYG15VGFibGVgIGlzCitlcXVpdmFsZW50IHRvIGBteXRhYmxlYCkgYnV0IGNhc2Ugc2Vuc2l0aXZpdHkgY2FuIGJlIGZvcmNlZCBieSB1c2luZworZG91YmxlLXF1b3RlcyAoYCJteVRhYmxlImAgaXMgZGlmZmVyZW50IGZyb20gYG15dGFibGVgKS4KKworRnVydGhlciwgYSB0YWJsZSBpcyBhbHdheXMgcGFydCBvZiBhIGtleXNwYWNlIGFuZCBhIHRhYmxlIG5hbWUgY2FuIGJlCitwcm92aWRlZCBmdWxseS1xdWFsaWZpZWQgYnkgdGhlIGtleXNwYWNlIGl0IGlzIHBhcnQgb2YuIElmIGlzIGlzIG5vdAorZnVsbHktcXVhbGlmaWVkLCB0aGUgdGFibGUgaXMgYXNzdW1lZCB0byBiZSBpbiB0aGUgX2N1cnJlbnRfIGtleXNwYWNlCisoc2VlIHhyZWY6Y3FsL2RkbC5hZG9jI3VzZS1zdGF0ZW1lbnRbVVNFXSBzdGF0ZW1lbnQpLgorCitGdXJ0aGVyLCB0aGUgdmFsaWQgbmFtZXMgZm9yIGNvbHVtbnMgYXJlIGRlZmluZWQgYXM6CisKK1tzb3VyY2UsYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvY29sdW1uLmJuZltdCistLS0tCisKK1dlIGFsc28gZGVmaW5lIHRoZSBub3Rpb24gb2Ygc3RhdGVtZW50IG9wdGlvbnMgZm9yIHVzZSBpbiB0aGUgZm9sbG93aW5nCitzZWN0aW9uOgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL29wdGlvbnMuYm5mW10KKy0tLS0KKworW1tjcmVhdGUta2V5c3BhY2Utc3RhdGVtZW50XV0KKz09IENSRUFURSBLRVlTUEFDRQorCitBIGtleXNwYWNlIGlzIGNyZWF0ZWQgd2l0aCBhIGBDUkVBVEUgS0VZU1BBQ0VgIHN0YXRlbWVudDoKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9jcmVhdGVfa3MuYm5mW10KKy0tLS0KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX2tzLmNxbFtdCistLS0tCisKK0F0dGVtcHRpbmcgdG8gY3JlYXRlIGEga2V5c3BhY2UgdGhhdCBhbHJlYWR5IGV4aXN0cyB3aWxsIHJldHVybiBhbiBlcnJvcgordW5sZXNzIHRoZSBgSUYgTk9UIEVYSVNUU2Agb3B0aW9uIGlzIHVzZWQuIElmIGl0IGlzIHVzZWQsIHRoZSBzdGF0ZW1lbnQKK3dpbGwgYmUgYSBuby1vcCBpZiB0aGUga2V5c3BhY2UgYWxyZWFkeSBleGlzdHMuCisKK1RoZSBzdXBwb3J0ZWQgYG9wdGlvbnNgIGFyZToKKworW2NvbHM9IiwsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfG5hbWUgfCBraW5kIHwgbWFuZGF0b3J5IHwgZGVmYXVsdCB8IGRlc2NyaXB0aW9uCit8YHJlcGxpY2F0aW9uYCB8IF9tYXBfIHwgeWVzIHwgbi9hIHwgVGhlIHJlcGxpY2F0aW9uIHN0cmF0ZWd5IGFuZCBvcHRpb25zIHRvIHVzZSBmb3IgdGhlIGtleXNwYWNlIChzZWUKK2RldGFpbHMgYmVsb3cpLgorfGBkdXJhYmxlX3dyaXRlc2AgfCBfc2ltcGxlXyB8IG5vIHwgdHJ1ZSB8IFdoZXRoZXIgdG8gdXNlIHRoZSBjb21taXQgbG9nIGZvciB1cGRhdGVzIG9uIHRoaXMga2V5c3BhY2UgKGRpc2FibGUgdGhpcworb3B0aW9uIGF0IHlvdXIgb3duIHJpc2shKS4KK3w9PT0KKworVGhlIGByZXBsaWNhdGlvbmAgcHJvcGVydHkgaXMgbWFuZGF0b3J5IGFuZCBtdXN0IGNvbnRhaW4gdGhlIGAnY2xhc3MnYCBzdWItb3B0aW9uIHRoYXQgZGVmaW5lcyB0aGUgZGVzaXJlZAoreHJlZjpjcWwvZGRsLmFkb2MjcmVwbGljYXRpb24tc3RyYXRlZ3lbcmVwbGljYXRpb24gc3RyYXRlZ3ldIGNsYXNzLiAKK1RoZSByZXN0IG9mIHRoZSBzdWItb3B0aW9ucyBkZXBlbmQgb24gd2hpY2ggcmVwbGljYXRpb24gc3RyYXRlZ3kgaXMgdXNlZC4gCitCeSBkZWZhdWx0LCBDYXNzYW5kcmEgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBgJ2NsYXNzJ2AgdmFsdWVzOgorCitbW3JlcGxpY2F0aW9uLXN0cmF0ZWd5XV0KKz09PSBgU2ltcGxlU3RyYXRlZ3lgCisKK0Egc2ltcGxlIHN0cmF0ZWd5IHRoYXQgZGVmaW5lcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBmb3IgZGF0YSB0byBiZQorc3ByZWFkIGFjcm9zcyB0aGUgZW50aXJlIGNsdXN0ZXIuIFRoaXMgaXMgZ2VuZXJhbGx5IG5vdCBhIHdpc2UgY2hvaWNlCitmb3IgcHJvZHVjdGlvbiwgYXMgaXQgZG9lcyBub3QgcmVzcGVjdCBkYXRhY2VudGVyIGxheW91dHMgYW5kIGNhbgorbGVhZCB0byB3aWxkbHkgdmFyeWluZyBxdWVyeSBsYXRlbmN5LiBGb3IgcHJvZHVjdGlvbiwgdXNlCitgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3lgLiBgU2ltcGxlU3RyYXRlZ3lgIHN1cHBvcnRzIGEgc2luZ2xlCittYW5kYXRvcnkgYXJndW1lbnQ6CisKK1tjb2xzPSIsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfHN1Yi1vcHRpb24gfHR5cGUgfHNpbmNlIHxkZXNjcmlwdGlvbgorfGAncmVwbGljYXRpb25fZmFjdG9yJ2AgfCBpbnQgfCBhbGwgfCBUaGUgbnVtYmVyIG9mIHJlcGxpY2FzIHRvIHN0b3JlIHBlciByYW5nZQorfD09PQorCis9PT0gYE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5YAorCitBIHByb2R1Y3Rpb24tcmVhZHkgcmVwbGljYXRpb24gc3RyYXRlZ3kgdGhhdCBzZXRzIHRoZQorcmVwbGljYXRpb24gZmFjdG9yIGluZGVwZW5kZW50bHkgZm9yIGVhY2ggZGF0YS1jZW50ZXIuIFRoZSByZXN0IG9mIHRoZQorc3ViLW9wdGlvbnMgYXJlIGtleS12YWx1ZSBwYWlycywgd2l0aCBhIGtleSBzZXQgdG8gYSBkYXRhLWNlbnRlciBuYW1lIGFuZAoraXRzIHZhbHVlIHNldCB0byB0aGUgYXNzb2NpYXRlZCByZXBsaWNhdGlvbiBmYWN0b3IuIE9wdGlvbnM6CisKK1tjb2xzPSIsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfHN1Yi1vcHRpb24gfHR5cGUgfGRlc2NyaXB0aW9uCit8YCc8ZGF0YWNlbnRlcj4nYCB8IGludCB8IFRoZSBudW1iZXIgb2YgcmVwbGljYXMgdG8gc3RvcmUgcGVyIHJhbmdlIGluIHRoZSBwcm92aWRlZCBkYXRhY2VudGVyLgorfGAncmVwbGljYXRpb25fZmFjdG9yJ2AgfCBpbnQgfCBUaGUgbnVtYmVyIG9mIHJlcGxpY2FzIHRvIHVzZSBhcyBhIGRlZmF1bHQgcGVyIGRhdGFjZW50ZXIgaWYgbm90CitzcGVjaWZpY2FsbHkgcHJvdmlkZWQuIE5vdGUgdGhhdCB0aGlzIGFsd2F5cyBkZWZlcnMgdG8gZXhpc3RpbmcKK2RlZmluaXRpb25zIG9yIGV4cGxpY2l0IGRhdGFjZW50ZXIgc2V0dGluZ3MuIEZvciBleGFtcGxlLCB0byBoYXZlIHRocmVlCityZXBsaWNhcyBwZXIgZGF0YWNlbnRlciwgc2V0IGEgdmFsdWUgb2YgMy4KK3w9PT0KKworV2hlbiBsYXRlciBhbHRlcmluZyBrZXlzcGFjZXMgYW5kIGNoYW5naW5nIHRoZSBgcmVwbGljYXRpb25fZmFjdG9yYCwKK2F1dG8tZXhwYW5zaW9uIHdpbGwgb25seSBfYWRkXyBuZXcgZGF0YWNlbnRlcnMgZm9yIHNhZmV0eSwgaXQgd2lsbCBub3QKK2FsdGVyIGV4aXN0aW5nIGRhdGFjZW50ZXJzIG9yIHJlbW92ZSBhbnksIGV2ZW4gaWYgdGhleSBhcmUgbm8gbG9uZ2VyIGluCit0aGUgY2x1c3Rlci4gSWYgeW91IHdhbnQgdG8gcmVtb3ZlIGRhdGFjZW50ZXJzIHdoaWxlIHNldHRpbmcgdGhlIAorYHJlcGxpY2F0aW9uX2ZhY3RvcmAsIGV4cGxpY2l0bHkgemVybyBvdXQgdGhlIGRhdGFjZW50ZXIgeW91IHdhbnQgdG8KK2hhdmUgemVybyByZXBsaWNhcy4KKworQW4gZXhhbXBsZSBvZiBhdXRvLWV4cGFuZGluZyBkYXRhY2VudGVycyB3aXRoIHR3byBkYXRhY2VudGVyczogYERDMWAgYW5kCitgREMyYDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9hdXRvZXhwYW5kX2tzLmNxbFtdCistLS0tCit3aWxsIHJlc3VsdCBpbjoKK1tzb3VyY2UscGxhaW50ZXh0XQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL2F1dG9leHBhbmRfa3MucmVzdWx0W10KKy0tLS0KKworQW4gZXhhbXBsZSBvZiBhdXRvLWV4cGFuZGluZyBhbmQgb3ZlcnJpZGluZyBhIGRhdGFjZW50ZXI6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvYXV0b2V4cGFuZF9rc19vdmVycmlkZS5jcWxbXQorLS0tLQord2lsbCByZXN1bHQgaW46Citbc291cmNlLHBsYWludGV4dF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9hdXRvZXhwYW5kX2tzX292ZXJyaWRlLnJlc3VsdFtdCistLS0tCisKK0FuIGV4YW1wbGUgdGhhdCBleGNsdWRlcyBhIGRhdGFjZW50ZXIgd2hpbGUgdXNpbmcgYHJlcGxpY2F0aW9uX2ZhY3RvcmA6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvYXV0b2V4cGFuZF9leGNsdWRlX2RjLmNxbFtdCistLS0tCit3aWxsIHJlc3VsdCBpbjoKK1tzb3VyY2UscGxhaW50ZXh0XQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL2F1dG9leHBhbmRfZXhjbHVkZV9kYy5yZXN1bHRbXQorLS0tLQorCitJZiB4cmVmOm5ldy90cmFuc2llbnRyZXBsaWNhdGlvbi5hZG9jW3RyYW5zaWVudCByZXBsaWNhdGlvbl0gaGFzIGJlZW4gZW5hYmxlZCwgdHJhbnNpZW50IHJlcGxpY2FzIGNhbiBiZQorY29uZmlndXJlZCBmb3IgYm90aCBgU2ltcGxlU3RyYXRlZ3lgIGFuZCBgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3lgIGJ5CitkZWZpbmluZyByZXBsaWNhdGlvbiBmYWN0b3JzIGluIHRoZSBmb3JtYXQKK2AnPHRvdGFsX3JlcGxpY2FzPi88dHJhbnNpZW50X3JlcGxpY2FzPidgCisKK0ZvciBpbnN0YW5jZSwgdGhpcyBrZXlzcGFjZSB3aWxsIGhhdmUgMyByZXBsaWNhcyBpbiBEQzEsIDEgb2Ygd2hpY2ggaXMKK3RyYW5zaWVudCwgYW5kIDUgcmVwbGljYXMgaW4gREMyLCAyIG9mIHdoaWNoIGFyZSB0cmFuc2llbnQ6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX2tzX3RyYW5zX3JlcGwuY3FsW10KKy0tLS0KKworW1t1c2Utc3RhdGVtZW50XV0KKz09IFVTRQorCitUaGUgYFVTRWAgc3RhdGVtZW50IGNoYW5nZXMgdGhlIF9jdXJyZW50XyBrZXlzcGFjZSB0byB0aGUgc3BlY2lmaWVkIGtleXNwYWNlLiAKK0EgbnVtYmVyIG9mIG9iamVjdHMgaW4gQ1FMIGFyZSBib3VuZCB0byBhIGtleXNwYWNlICh0YWJsZXMsIHVzZXItZGVmaW5lZCB0eXBlcywgZnVuY3Rpb25zLCBldGMuKSBhbmQgdGhlCitjdXJyZW50IGtleXNwYWNlIGlzIHRoZSBkZWZhdWx0IGtleXNwYWNlIHVzZWQgd2hlbiB0aG9zZSBvYmplY3RzIGFyZQorcmVmZXJyZWQgdG8gaW4gYSBxdWVyeSB3aXRob3V0IGEgZnVsbHktcXVhbGlmaWVkIG5hbWUgKHdpdGhvdXQgYSBwcmVmaXhlZCBrZXlzcGFjZSBuYW1lKS4gCitBIGBVU0VgIHN0YXRlbWVudCBzcGVjaWZpZXMgdGhlIGtleXNwYWNlIHRvIHVzZSBhcyBhbiBhcmd1bWVudDoKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi91c2Vfa3MuYm5mW10KKy0tLS0KK1VzaW5nIENRTDoKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvdXNlX2tzLmNxbFtdCistLS0tCisKK1tbYWx0ZXIta2V5c3BhY2Utc3RhdGVtZW50XV0KKz09IEFMVEVSIEtFWVNQQUNFCisKK0FuIGBBTFRFUiBLRVlTUEFDRWAgc3RhdGVtZW50IG1vZGlmaWVzIHRoZSBvcHRpb25zIG9mIGEga2V5c3BhY2U6CisKK1tzb3VyY2UsYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvYWx0ZXJfa3MuYm5mW10KKy0tLS0KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvYWx0ZXJfa3MuY3FsW10KKy0tLS0KK0lmIHRoZSBrZXlzcGFjZSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCitUaGUgc3VwcG9ydGVkIG9wdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciB4cmVmOmNxbC9kZGwuYWRvYyNjcmVhdGUta2V5c3BhY2Utc3RhdGVtZW50W2NyZWF0aW5nIGEga2V5c3BhY2VdLgorCitbW2Ryb3Ata2V5c3BhY2Utc3RhdGVtZW50XV0KKz09IERST1AgS0VZU1BBQ0UKKworRHJvcHBpbmcgYSBrZXlzcGFjZSBpcyBkb25lIHdpdGggdGhlIGBEUk9QIEtFWVNQQUNFYCBzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvZHJvcF9rcy5ibmZbXQorLS0tLQorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9kcm9wX2tzLmNxbFtdCistLS0tCisKK0Ryb3BwaW5nIGEga2V5c3BhY2UgcmVzdWx0cyBpbiB0aGUgaW1tZWRpYXRlLCBpcnJldmVyc2libGUgcmVtb3ZhbCBvZgordGhhdCBrZXlzcGFjZSwgaW5jbHVkaW5nIGFsbCB0aGUgdGFibGVzLCB1c2VyLWRlZmluZWQgdHlwZXMsIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMsIGFuZAorYWxsIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aG9zZSB0YWJsZXMuCisKK0lmIHRoZSBrZXlzcGFjZSBkb2VzIG5vdCBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsCit1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKworW1tjcmVhdGUtdGFibGUtc3RhdGVtZW50XV0KKz09IENSRUFURSBUQUJMRQorCitDcmVhdGluZyBhIG5ldyB0YWJsZSB1c2VzIHRoZSBgQ1JFQVRFIFRBQkxFYCBzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvY3JlYXRlX3RhYmxlLmJuZltdCistLS0tCisKK0ZvciBleGFtcGxlLCBoZXJlIGFyZSBzb21lIENRTCBzdGF0ZW1lbnRzIHRvIGNyZWF0ZSB0YWJsZXM6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3RhYmxlLmNxbFtdCistLS0tCisKK0EgQ1FMIHRhYmxlIGhhcyBhIG5hbWUgYW5kIGlzIGNvbXBvc2VkIG9mIGEgc2V0IG9mIF9yb3dzXy4gCitDcmVhdGluZyBhIHRhYmxlIGFtb3VudHMgdG8gZGVmaW5pbmcgd2hpY2ggeHJlZjpjcWwvZGRsLmFkb2MjY29sdW1uLWRlZmluaXRpb25bY29sdW1uc10gZWFjaCByb3dzIHdpbGwgaGF2ZSwgCit3aGljaCBvZiB0aG9zZSBjb2x1bW5zIGNvbXByaXNlIHRoZSB4cmVmOmNxbC9kZGwuYWRvYyNwcmltYXJ5LWtleVtwcmltYXJ5IGtleV0sIGFzIHdlbGwgYXMgZGVmaW5lZAoreHJlZjpjcWwvZGRsLmFkb2MjY3JlYXRlLXRhYmxlLW9wdGlvbnNbb3B0aW9uc10gZm9yIHRoZSB0YWJsZS4KKworQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gYWxyZWFkeSBleGlzdGluZyB0YWJsZSB3aWxsIHJldHVybiBhbiBlcnJvcgordW5sZXNzIHRoZSBgSUYgTk9UIEVYSVNUU2AgZGlyZWN0aXZlIGlzIHVzZWQuIElmIGl0IGlzIHVzZWQsIHRoZQorc3RhdGVtZW50IHdpbGwgYmUgYSBuby1vcCBpZiB0aGUgdGFibGUgYWxyZWFkeSBleGlzdHMuCisKK1tbY29sdW1uLWRlZmluaXRpb25dXQorPT09IENvbHVtbiBkZWZpbml0aW9ucworCitFdmVyeSByb3cgaW4gYSBDUUwgdGFibGUgd2lsbCBoYXZlIHRoZSBwcmVkZWZpbmVkIGNvbHVtbnMgZGVmaW5lZCBhdCB0YWJsZSBjcmVhdGlvbi4gCitDb2x1bW5zIGNhbiBiZSBhZGRlZCBsYXRlciB1c2luZyBhbiB4cmVmOmNxbC9kZGwuYWRvYyNhbHRlci10YWJsZS1zdGF0ZW1lbnRbYWx0ZXIgc3RhdGVtZW50XS4KKworQSBgY29sdW1uX2RlZmluaXRpb25gIGlzIGNvbXByaXNlZCBvZiB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIGFuZCBpdHMgeHJlZjpjcWwvZGRsLmFkb2MjZGF0YS10eXBlW3R5cGVdLCAKK3Jlc3RyaWN0aW5nIHRoZSAgdmFsdWVzIHRoYXQgYXJlIGFjY2VwdGVkIGZvciB0aGF0IGNvbHVtbi4gQWRkaXRpb25hbGx5LCBhIGNvbHVtbiBkZWZpbml0aW9uIGNhbiBoYXZlIHRoZQorZm9sbG93aW5nIG1vZGlmaWVyczoKKworKiBgU1RBVElDYDogZGVjbGFyZXMgdGhlIGNvbHVtbiBhcyBhIHhyZWY6Y3FsL2RkbC5hZG9jI3N0YXRpYy1jb2x1bW5bc3RhdGljIGNvbHVtbl0KKyogYFBSSU1BUlkgS0VZYDogZGVjbGFyZXMgdGhlIGNvbHVtbiBhcyB0aGUgc29sZSBjb21wb25lbnQgb2YgdGhlIHhyZWY6Y3FsL2RkbC5hZG9jI3ByaW1hcnkta2V5W3ByaW1hcnkga2V5XSBvZiB0aGUgdGFibGUKKworW1tzdGF0aWMtY29sdW1uXV0KKz09PT0gU3RhdGljIGNvbHVtbnMKKworU29tZSBjb2x1bW5zIGNhbiBiZSBkZWNsYXJlZCBhcyBgU1RBVElDYCBpbiBhIHRhYmxlIGRlZmluaXRpb24uIEEgY29sdW1uCit0aGF0IGlzIHN0YXRpYyB3aWxsIGJlIOKAnHNoYXJlZOKAnSBieSBhbGwgdGhlIHJvd3MgYmVsb25naW5nIHRvIHRoZSBzYW1lCitwYXJ0aXRpb24gKGhhdmluZyB0aGUgc2FtZSB4cmVmOmNxbC9kZGwuYWRvYyNwYXJ0aXRpb24ta2V5W3BhcnRpdGlvbiBrZXldLiAKKworRm9yIGV4YW1wbGU6CisKK1t7dGFic31dIAorPT09PSAKK0NvZGU6OiAKKysgCistLSAKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3N0YXRpY19jb2x1bW4uY3FsW10KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2luc2VydF9zdGF0aWNfZGF0YS5jcWxbXQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvc2VsZWN0X3N0YXRpY19kYXRhLmNxbFtdCistLS0tCistLQorCitSZXN1bHRzOjoKKysKKy0tCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zZWxlY3Rfc3RhdGljX2RhdGEucmVzdWx0W10KKy0tLS0KKy0tCis9PT09CisKK0FzIGNhbiBiZSBzZWVuLCB0aGUgYHNgIHZhbHVlIGlzIHRoZSBzYW1lIChgc3RhdGljMWApIGZvciBib3RoIG9mIHRoZQorcm93cyBpbiB0aGUgcGFydGl0aW9uICh0aGUgcGFydGl0aW9uIGtleSBiZWluZyBgcGtgLCBhbmQgYm90aAorcm93cyBhcmUgaW4gdGhlIHNhbWUgcGFydGl0aW9uKTogdGhlIHNlY29uZCBpbnNlcnRpb24gb3ZlcnJpZGVzIHRoZQordmFsdWUgZm9yIGBzYC4KKworVGhlIHVzZSBvZiBzdGF0aWMgY29sdW1ucyBoYXMgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKyogQSB0YWJsZSB3aXRob3V0IGNsdXN0ZXJpbmcgY29sdW1ucyBjYW5ub3QgaGF2ZSBzdGF0aWMgY29sdW1ucy4gCitJbiBhIHRhYmxlIHdpdGhvdXQgY2x1c3RlcmluZyBjb2x1bW5zLCBldmVyeSBwYXJ0aXRpb24gaGFzIG9ubHkgb25lIHJvdywgYW5kCitzbyBldmVyeSBjb2x1bW4gaXMgaW5oZXJlbnRseSBzdGF0aWMpCisqIE9ubHkgbm9uLXByaW1hcnkga2V5IGNvbHVtbnMgY2FuIGJlIHN0YXRpYy4KKworW1twcmltYXJ5LWtleV1dCis9PT0gVGhlIFByaW1hcnkga2V5CisKK1dpdGhpbiBhIHRhYmxlLCBhIHJvdyBpcyB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IGl0cyBgUFJJTUFSWSBLRVlgLCBhbmQKK2hlbmNlIGFsbCB0YWJsZXMgKm11c3QqIGRlZmluZSBhIHNpbmdsZSBQUklNQVJZIEtFWS4gCitBIGBQUklNQVJZIEtFWWAgaXMgY29tcG9zZWQgb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGRlZmluZWQgY29sdW1ucyBpbiB0aGUgdGFibGUuIAorU3ludGFjdGljYWxseSwgdGhlIHByaW1hcnkga2V5IGlzIGRlZmluZWQgd2l0aCB0aGUgcGhyYXNlIGBQUklNQVJZIEtFWWAgCitmb2xsb3dlZCBieSBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBjb2x1bW4gbmFtZXMgd2l0aGluIHBhcmVudGhlc2lzLgorSWYgdGhlIHByaW1hcnkga2V5IGhhcyBvbmx5IG9uZSBjb2x1bW4sIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSBhZGQgdGhlIGBQUklNQVJZIEtFWWAgcGhyYXNlIHRvCit0aGF0IGNvbHVtbiBpbiB0aGUgdGFibGUgZGVmaW5pdGlvbi4gCitUaGUgb3JkZXIgb2YgdGhlIGNvbHVtbnMgaW4gdGhlIHByaW1hcnkga2V5IGRlZmluaXRpb24gZGVmaW5lcyB0aGUgcGFydGl0aW9uIGtleSBhbmQgCitjbHVzdGVyaW5nIGNvbHVtbnMuCisKK0EgQ1FMIHByaW1hcnkga2V5IGlzIGNvbXBvc2VkIG9mIHR3byBwYXJ0czoKKworeHJlZjpjcWwvZGRsLmFkb2MjcGFydGl0aW9uLWtleVtwYXJ0aXRpb24ga2V5XTo6CisqIEl0IGlzIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIHByaW1hcnkga2V5IGRlZmluaXRpb24uIAorSXQgY2FuIGJlIGEgc2luZ2xlIGNvbHVtbiBvciwgdXNpbmcgYW4gYWRkaXRpb25hbCBzZXQgb2YgcGFyZW50aGVzaXMsIGNhbiBiZSBtdWx0aXBsZSBjb2x1bW5zLiAKK0EgdGFibGUgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBwYXJ0aXRpb24ga2V5LCB0aGUgc21hbGxlc3QgcG9zc2libGUgdGFibGUgZGVmaW5pdGlvbiBpczoKKysKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3RhYmxlX3NpbmdsZV9way5jcWxbXQorLS0tLQoreHJlZjpjcWwvZGRsLmFkb2MjY2x1c3RlcmluZy1jb2x1bW5zW2NsdXN0ZXJpbmcgY29sdW1uc106OgorKiBUaGUgY29sdW1ucyBhcmUgdGhlIGNvbHVtbnMgdGhhdCBmb2xsb3cgdGhlIHBhcnRpdGlvbiBrZXkgaW4gdGhlIHByaW1hcnkga2V5IGRlZmluaXRpb24uCitUaGUgb3JkZXIgb2YgdGhvc2UgY29sdW1ucyBkZWZpbmUgdGhlIF9jbHVzdGVyaW5nIG9yZGVyXy4KKworU29tZSBleGFtcGxlcyBvZiBwcmltYXJ5IGtleSBkZWZpbml0aW9uIGFyZToKKworKiBgUFJJTUFSWSBLRVkgKGEpYDogYGFgIGlzIHRoZSBzaW5nbGUgcGFydGl0aW9uIGtleSBhbmQgdGhlcmUgYXJlIG5vIGNsdXN0ZXJpbmcgY29sdW1ucworKiBgUFJJTUFSWSBLRVkgKGEsIGIsIGMpYCA6IGBhYCBpcyB0aGUgc2luZ2xlIHBhcnRpdGlvbiBrZXkgYW5kIGBiYCBhbmQgYGNgIGFyZSB0aGUgY2x1c3RlcmluZyBjb2x1bW5zCisqIGBQUklNQVJZIEtFWSAoKGEsIGIpLCBjKWAgOiBgYWAgYW5kIGBiYCBjb21wb3NlIHRoZSBfY29tcG9zaXRlXyBwYXJ0aXRpb24ga2V5IGFuZCBgY2AgaXMgdGhlIGNsdXN0ZXJpbmcgY29sdW1uCisKK1tJTVBPUlRBTlRdCis9PT09CitUaGUgcHJpbWFyeSBrZXkgdW5pcXVlbHkgaWRlbnRpZmllcyBhIHJvdyBpbiB0aGUgdGFibGUsIGFzIGRlc2NyaWJlZCBhYm92ZS4gCitBIGNvbnNlcXVlbmNlIG9mIHRoaXMgdW5pcXVlbmVzcyBpcyB0aGF0IGlmIGFub3RoZXIgcm93IGlzIGluc2VydGVkIHVzaW5nIHRoZSBzYW1lIHByaW1hcnkga2V5LCAKK3RoZW4gYW4gYFVQU0VSVGAgb2NjdXJzIGFuZCBhbiBleGlzdGluZyByb3cgd2l0aCB0aGUgc2FtZSBwcmltYXJ5IGtleSBpcyByZXBsYWNlZC4gCitDb2x1bW5zIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleSBjYW5ub3QgZGVmaW5lIHVuaXF1ZW5lc3MuCis9PT09CisKK1tbcGFydGl0aW9uLWtleV1dCis9PT09IFBhcnRpdGlvbiBrZXkKKworV2l0aGluIGEgdGFibGUsIENRTCBkZWZpbmVzIHRoZSBub3Rpb24gb2YgYSBfcGFydGl0aW9uXyB0aGF0IGRlZmluZXMgdGhlIGxvY2F0aW9uIG9mIGRhdGEgd2l0aGluIGEgQ2Fzc2FuZHJhIGNsdXN0ZXIuCitBIHBhcnRpdGlvbiBpcyB0aGUgc2V0IG9mIHJvd3MgdGhhdCBzaGFyZSB0aGUgc2FtZSB2YWx1ZSBmb3IgdGhlaXIgcGFydGl0aW9uIGtleS4gCisKK05vdGUgdGhhdCBpZiB0aGUgcGFydGl0aW9uIGtleSBpcyBjb21wb3NlZCBvZiBtdWx0aXBsZSBjb2x1bW5zLCB0aGVuIHJvd3MgYmVsb25nIHRvIHRoZSBzYW1lIHBhcnRpdGlvbiAKK3doZW4gdGhleSBoYXZlIHRoZSBzYW1lIHZhbHVlcyBmb3IgYWxsIHRob3NlIHBhcnRpdGlvbiBrZXkgY29sdW1ucy4gCitBIGhhc2ggaXMgY29tcHV0ZWQgZnJvbSB0aGUgcGFydGl0aW9uIGtleSBjb2x1bW5zIGFuZCB0aGF0IGhhc2ggdmFsdWUgZGVmaW5lcyB0aGUgcGFydGl0aW9uIGxvY2F0aW9uLgorU28sIGZvciBpbnN0YW5jZSwgZ2l2ZW4gdGhlIGZvbGxvd2luZyB0YWJsZSBkZWZpbml0aW9uIGFuZCBjb250ZW50OgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV90YWJsZV9jb21wb3VuZF9way5jcWxbXQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvaW5zZXJ0X3RhYmxlX2NvbXBvdW5kX3BrLmNxbFtdCitpbmNsdWRlOjpleGFtcGxlJENRTC9zZWxlY3RfdGFibGVfY29tcG91bmRfcGsuY3FsW10KKy0tLS0KKword2lsbCByZXN1bHQgaW4KK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NlbGVjdF90YWJsZV9jb21wb3VuZF9way5yZXN1bHRbXQorLS0tLQorPDE+IFJvd3MgMSBhbmQgMiBhcmUgaW4gdGhlIHNhbWUgcGFydGl0aW9uLCBiZWNhdXNlIGJvdGggY29sdW1ucyBgYWAgYW5kIGBiYCBhcmUgemVyby4KKzwyPiBSb3dzIDMgYW5kIDQgYXJlIGluIHRoZSBzYW1lIHBhcnRpdGlvbiwgYnV0IGEgZGlmZmVyZW50IG9uZSwgYmVjYXVzZSBjb2x1bW4gYGFgIGlzIHplcm8gYW5kIGNvbHVtbiBgYmAgaXMgMSBpbiBib3RoIHJvd3MuCis8Mz4gUm93IDUgaXMgaW4gYSB0aGlyZCBwYXJ0aXRpb24gYnkgaXRzZWxmLCBiZWNhdXNlIGJvdGggY29sdW1ucyBgYWAgYW5kIGBiYCBhcmUgMS4KKworTm90ZSB0aGF0IGEgdGFibGUgYWx3YXlzIGhhcyBhIHBhcnRpdGlvbiBrZXksIGFuZCB0aGF0IGlmIHRoZSB0YWJsZSBoYXMKK25vIGBjbHVzdGVyaW5nIGNvbHVtbnNgLCB0aGVuIGV2ZXJ5IHBhcnRpdGlvbiBvZiB0aGF0IHRhYmxlIGhhcyBhIHNpbmdsZSByb3cuCitiZWNhdXNlIHRoZSBwYXJ0aXRpb24ga2V5LCBjb21wb3VuZCBvciBvdGhlcndpc2UsIGlkZW50aWZpZXMgYSBzaW5nbGUgbG9jYXRpb24uCisKK1RoZSBtb3N0IGltcG9ydGFudCBwcm9wZXJ0eSBvZiBwYXJ0aXRpb24gaXMgdGhhdCBhbGwgdGhlIHJvd3MgYmVsb25naW5nCit0byB0aGUgc2FtZSBwYXJ0aXRpb24gYXJlIGd1YXJhbnRlZWQgdG8gYmUgc3RvcmVkIG9uIHRoZSBzYW1lIHNldCBvZgorcmVwbGljYSBub2Rlcy4gCitJbiBvdGhlciB3b3JkcywgdGhlIHBhcnRpdGlvbiBrZXkgb2YgYSB0YWJsZSBkZWZpbmVzIHdoaWNoIHJvd3Mgd2lsbCBiZSBsb2NhbGl6ZWQgb24gdGhlIHNhbWUgCitub2RlIGluIHRoZSBjbHVzdGVyLiAKK1RoZSBsb2NhbGl6YXRpb24gb2YgZGF0YSBpcyBpbXBvcnRhbnQgdG8gdGhlIGVmZmljaWVudCByZXRyaWV2YWwgb2YgZGF0YSwgcmVxdWlyaW5nIHRoZSBDYXNzYW5kcmEgY29vcmRpbmF0b3IKK3RvIGNvbnRhY3QgYXMgZmV3IG5vZGVzIGFzIHBvc3NpYmxlLgorSG93ZXZlciwgdGhlcmUgaXMgYSBmbGlwLXNpZGUgdG8gdGhpcyBndWFyYW50ZWUsIGFuZCBhbGwgcm93cyBzaGFyaW5nIGEgcGFydGl0aW9uIGtleSB3aWxsIGJlIHN0b3JlZCBvbiB0aGUgc2FtZSAKK25vZGUsIGNyZWF0aW5nIGEgaG90c3BvdCBmb3IgYm90aCByZWFkaW5nIGFuZCB3cml0aW5nLgorV2hpbGUgc2VsZWN0aW5nIGEgcHJpbWFyeSBrZXkgdGhhdCBncm91cHMgdGFibGUgcm93cyBhc3Npc3RzIGJhdGNoIHVwZGF0ZXMgYW5kIGNhbiBlbnN1cmUgdGhhdCB0aGUgdXBkYXRlcyBhcmUgCitfYXRvbWljXyBhbmQgZG9uZSBpbiBfaXNvbGF0aW9uXywgdGhlIHBhcnRpdGlvbnMgbXVzdCBiZSBzaXplZCAianVzdCByaWdodCwgbm90IHRvbyBiaWcgbm9yIHRvbyBzbWFsbCIuCisKK0RhdGEgbW9kZWxpbmcgdGhhdCBjb25zaWRlcnMgdGhlIHF1ZXJ5aW5nIHBhdHRlcm5zIGFuZCBhc3NpZ25zIHByaW1hcnkga2V5cyBiYXNlZCBvbiB0aGUgcXVlcmllcyB3aWxsIGhhdmUgdGhlIGxvd2VzdCAKK2xhdGVuY3kgaW4gZmV0Y2hpbmcgZGF0YS4KKworW1tjbHVzdGVyaW5nLWNvbHVtbnNdXQorPT09PSBDbHVzdGVyaW5nIGNvbHVtbnMKKworVGhlIGNsdXN0ZXJpbmcgY29sdW1ucyBvZiBhIHRhYmxlIGRlZmluZSB0aGUgY2x1c3RlcmluZyBvcmRlciBmb3IgdGhlIHBhcnRpdGlvbiBvZiB0aGF0IHRhYmxlLiAKK0ZvciBhIGdpdmVuIGBwYXJ0aXRpb25gLCBhbGwgcm93cyBhcmUgb3JkZXJlZCBieSB0aGF0IGNsdXN0ZXJpbmcgb3JkZXIuIENsdXN0ZXJpbmcgY29sdW1ucyBhbHNvIGFkZCB1bmlxdWVuZXNzIHRvCithIHJvdyBpbiBhIHRhYmxlLgorCitGb3IgaW5zdGFuY2UsIGdpdmVuOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV90YWJsZV9jbHVzdGVyY29sdW1uLmNxbFtdCitpbmNsdWRlOjpleGFtcGxlJENRTC9pbnNlcnRfdGFibGVfY2x1c3RlcmNvbHVtbi5jcWxbXQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvc2VsZWN0X3RhYmxlX2NsdXN0ZXJjb2x1bW4uY3FsW10KKy0tLS0KKword2lsbCByZXN1bHQgaW4KK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NlbGVjdF90YWJsZV9jbHVzdGVyY29sdW1uLnJlc3VsdFtdCistLS0tCis8MT4gUm93IDEgaXMgaW4gb25lIHBhcnRpdGlvbiwgYW5kIFJvd3MgMi01IGFyZSBpbiBhIGRpZmZlcmVudCBvbmUuIFRoZSBkaXNwbGF5IG9yZGVyIGlzIGFsc28gZGlmZmVyZW50LgorCitMb29raW5nIG1vcmUgY2xvc2VseSBhdCB0aGUgZm91ciByb3dzIGluIHRoZSBzYW1lIHBhcnRpdGlvbiwgdGhlIGBiYCBjbHVzdGVyaW5nIGNvbHVtbiBkZWZpbmVzIHRoZSBvcmRlciBpbiB3aGljaCB0aG9zZSByb3dzIAorYXJlIGRpc3BsYXllZC4gCitXaGVyZWFzIHRoZSBwYXJ0aXRpb24ga2V5IG9mIHRoZSB0YWJsZSBncm91cHMgcm93cyBvbiB0aGUgc2FtZSBub2RlLCB0aGUgY2x1c3RlcmluZyBjb2x1bW5zIGNvbnRyb2wgCitob3cgdGhvc2Ugcm93cyBhcmUgc3RvcmVkIG9uIHRoZSBub2RlLiAKKworVGhhdCBzb3J0aW5nIGFsbG93cyB0aGUgdmVyeSBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGEgcmFuZ2Ugb2Ygcm93cyB3aXRoaW4gYSBwYXJ0aXRpb246CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvc2VsZWN0X3JhbmdlLmNxbFtdCistLS0tCisKK3dpbGwgcmVzdWx0IGluCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zZWxlY3RfcmFuZ2UucmVzdWx0W10KKy0tLS0KKworW1tjcmVhdGUtdGFibGUtb3B0aW9uc11dCis9PT0gVGFibGUgb3B0aW9ucworCitBIENRTCB0YWJsZSBoYXMgYSBudW1iZXIgb2Ygb3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgYXQgY3JlYXRpb24gKGFuZCwKK2ZvciBtb3N0IG9mIHRoZW0sIGFsdGVyZWQgbGF0ZXIpLiBUaGVzZSBvcHRpb25zIGFyZSBzcGVjaWZpZWQgYWZ0ZXIgdGhlCitgV0lUSGAga2V5d29yZC4KKworT25lIGltcG9ydGFudCBvcHRpb24gdGhhdCBjYW5ub3QgYmUgY2hhbmdlZCBhZnRlciBjcmVhdGlvbiwgYENMVVNURVJJTkcgT1JERVIgQllgLCBpbmZsdWVuY2VzIGhvdyBxdWVyaWVzIGNhbiBiZSBkb25lIGFnYWluc3QgdGhlIHRhYmxlLiBJdCBpcyB3b3J0aCBkaXNjdXNzaW5nIGluIG1vcmUgZGV0YWlsIGhlcmUuCisKK1tbY2x1c3RlcmluZy1vcmRlcl1dCis9PT09IENsdXN0ZXJpbmcgb3JkZXIKKworVGhlIGNsdXN0ZXJpbmcgb3JkZXIgb2YgYSB0YWJsZSBpcyBkZWZpbmVkIGJ5IHRoZSBjbHVzdGVyaW5nIGNvbHVtbnMuIAorQnkgZGVmYXVsdCwgdGhlIGNsdXN0ZXJpbmcgb3JkZXIgaXMgYXNjZW5kaW5nIGZvciB0aGUgY2x1c3RlcmluZyBjb2x1bW4ncyBkYXRhIHR5cGVzLiAKK0ZvciBleGFtcGxlLCBpbnRlZ2VycyBvcmRlciBmcm9tIDEsIDIsIC4uLiBuLCB3aGlsZSB0ZXh0IG9yZGVycyBmcm9tIEEgdG8gWi4gCisKK1RoZSBgQ0xVU1RFUklORyBPUkRFUiBCWWAgdGFibGUgb3B0aW9uIHVzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUKK2NsdXN0ZXJpbmcgY29sdW1ucywgZWFjaCBzZXQgZm9yIGVpdGhlciBgQVNDYCAoZm9yIF9hc2NlbmRpbmdfIG9yZGVyKSBvciBgREVTQ2AgKGZvciBfZGVzY2VuZGluZyBvcmRlcikuCitUaGUgZGVmYXVsdCBpcyBhc2NlbmRpbmcgZm9yIGFsbCBjbHVzdGVyaW5nIGNvbHVtbnMgaWYgdGhlIGBDTFVTVEVSSU5HIE9SREVSIEJZYCBvcHRpb24gaXMgbm90IHNldC4gCisKK1RoaXMgb3B0aW9uIGlzIGJhc2ljYWxseSBhIGhpbnQgZm9yIHRoZSBzdG9yYWdlIGVuZ2luZSB0aGF0IGNoYW5nZXMgdGhlIG9yZGVyIGluIHdoaWNoIGl0IHN0b3JlcyB0aGUgcm93LgorQmV3YXJlIG9mIHRoZSBjb25zZXF1ZW5jZXMgb2Ygc2V0dGluZyB0aGlzIG9wdGlvbjoKKworKiBJdCBjaGFuZ2VzIHRoZSBkZWZhdWx0IGFzY2VuZGluZyBvcmRlciBvZiByZXN1bHRzIHdoZW4gcXVlcmllZCB3aXRoIGEgYFNFTEVDVGAgc3RhdGVtZW50IHdpdGggbm8gYE9SREVSIEJZYCBjbGF1c2UuCisKKyogSXQgbGltaXRzIGhvdyB0aGUgYE9SREVSIEJZYCBjbGF1c2UgaXMgdXNlZCBpbiBgU0VMRUNUYCBzdGF0ZW1lbnRzIG9uIHRoYXQgdGFibGUuIAorUmVzdWx0cyBjYW4gb25seSBiZSBvcmRlcmVkIHdpdGggZWl0aGVyIHRoZSBvcmlnaW5hbCBjbHVzdGVyaW5nIG9yZGVyIG9yIHRoZSByZXZlcnNlIGNsdXN0ZXJpbmcgb3JkZXIuCitTdXBwb3NlIHlvdSBjcmVhdGUgYSB0YWJsZSB3aXRoIHR3byBjbHVzdGVyaW5nIGNvbHVtbnMgYGFgIGFuZCBgYmAsIGRlZmluZWQgYFdJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAoYSBERVNDLCBiIEFTQylgLgorUXVlcmllcyBvbiB0aGUgdGFibGUgY2FuIHVzZSBgT1JERVIgQlkgKGEgREVTQywgYiBBU0MpYCBvciBgT1JERVIgQlkgKGEgQVNDLCBiIERFU0MpYC4gCitNaXhlZCBvcmRlciwgc3VjaCBhcyBgT1JERVIgQlkgKGEgQVNDLCBiIEFTQylgIG9yIGBPUkRFUiBCWSAoYSBERVNDLCBiIERFU0MpYCB3aWxsIG5vdCByZXR1cm4gZXhwZWN0ZWQgb3JkZXIuCisKKyogSXQgaGFzIGEgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIHF1ZXJpZXMuIFF1ZXJpZXMgaW4gcmV2ZXJzZSBjbHVzdGVyaW5nIG9yZGVyIGFyZSBzbG93ZXIgdGhhbiB0aGUgZGVmYXVsdCBhc2NlbmRpbmcgb3JkZXIuCitJZiB5b3UgcGxhbiB0byBxdWVyeSBtb3N0bHkgaW4gZGVzY2VuZGluZyBvcmRlciwgZGVjbGFyZSB0aGUgY2x1c3RlcmluZyBvcmRlciBpbiB0aGUgdGFibGUgc2NoZW1hIHVzaW5nIGBXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKClgLiAKK1RoaXMgb3B0aW1pemF0aW9uIGlzIGNvbW1vbiBmb3IgdGltZSBzZXJpZXMsIHRvIHJldHJpZXZlIHRoZSBkYXRhIGZyb20gbmV3ZXN0IHRvIG9sZGVzdC4KKworW1tjcmVhdGUtdGFibGUtZ2VuZXJhbC1vcHRpb25zXV0KKz09PT0gT3RoZXIgdGFibGUgb3B0aW9ucworCitBIHRhYmxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworW3dpZHRoPSIxMDAlIixjb2xzPSIzMCUsOSUsMTElLDUwJSIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8b3B0aW9uIHwga2luZCB8IGRlZmF1bHQgfCBkZXNjcmlwdGlvbgorCit8IGBjb21tZW50YCB8IF9zaW1wbGVfIHwgbm9uZSB8IEEgZnJlZS1mb3JtLCBodW1hbi1yZWFkYWJsZSBjb21tZW50Cit8IHhyZWY6Y3FsL2RkbC5hZG9jI3NwZWNfcmV0cnlbYHNwZWN1bGF0aXZlX3JldHJ5YF0gfCBfc2ltcGxlXyB8IDk5UEVSQ0VOVElMRSB8IFNwZWN1bGF0aXZlIHJldHJ5IG9wdGlvbnMKK3wgYGNkY2AgfF9ib29sZWFuXyB8ZmFsc2UgfENyZWF0ZSBhIENoYW5nZSBEYXRhIENhcHR1cmUgKENEQykgbG9nIG9uIHRoZSB0YWJsZQorfCBgYWRkaXRpb25hbF93cml0ZV9wb2xpY3lgIHxfc2ltcGxlXyB8OTlQRVJDRU5USUxFIHwgU2FtZSBhcyBgc3BlY3VsYXRpdmVfcmV0cnlgCit8IGBnY19ncmFjZV9zZWNvbmRzYCB8X3NpbXBsZV8gfDg2NDAwMCB8VGltZSB0byB3YWl0IGJlZm9yZSBnYXJiYWdlIGNvbGxlY3RpbmcgdG9tYnN0b25lcyAoZGVsZXRpb24gbWFya2VycykKK3wgYGJsb29tX2ZpbHRlcl9mcF9jaGFuY2VgIHxfc2ltcGxlXyB8MC4wMDA3NSB8VGhlIHRhcmdldCBwcm9iYWJpbGl0eSBvZgorZmFsc2UgcG9zaXRpdmUgb2YgdGhlIHNzdGFibGUgYmxvb20gZmlsdGVycy4gU2FpZCBibG9vbSBmaWx0ZXJzIHdpbGwgYmUKK3NpemVkIHRvIHByb3ZpZGUgdGhlIHByb3ZpZGVkIHByb2JhYmlsaXR5LCB0aHVzIGxvd2VyaW5nIHRoaXMgdmFsdWUKK2ltcGFjdHMgdGhlIHNpemUgb2YgYmxvb20gZmlsdGVycyBpbi1tZW1vcnkgYW5kIG9uLWRpc2suCit8IGBkZWZhdWx0X3RpbWVfdG9fbGl2ZWAgfF9zaW1wbGVfIHwwIHxEZWZhdWx0IGV4cGlyYXRpb24gdGltZSAo4oCcVFRM4oCdKSBpbiBzZWNvbmRzIGZvciBhIHRhYmxlCit8IGBjb21wYWN0aW9uYCB8X21hcF8gfF9zZWUgYmVsb3dfIHwgeHJlZjpvcGVyYXRpbmcvY29tcGFjdGlvbi9pbmRleC5hZG9jI2NxbC1jb21wYWN0aW9uLW9wdGlvbnNbQ29tcGFjdGlvbiBvcHRpb25zXQorfCBgY29tcHJlc3Npb25gIHxfbWFwXyB8X3NlZSBiZWxvd18gfCB4cmVmOm9wZXJhdGluZy9jb21wcmVzc2lvbi9pbmRleC5hZG9jI2NxbC1jb21wcmVzc2lvbi1vcHRpb25zW0NvbXByZXNzaW9uIG9wdGlvbnNdCit8IGBjYWNoaW5nYCB8X21hcF8gfF9zZWUgYmVsb3dfIHxDYWNoaW5nIG9wdGlvbnMKK3wgYG1lbXRhYmxlX2ZsdXNoX3BlcmlvZF9pbl9tc2AgfF9zaW1wbGVfIHwwIHxUaW1lIChpbiBtcykgYmVmb3JlIENhc3NhbmRyYSBmbHVzaGVzIG1lbXRhYmxlcyB0byBkaXNrCit8IGByZWFkX3JlcGFpcmAgfF9zaW1wbGVfIHxCTE9DS0lORyB8U2V0cyByZWFkIHJlcGFpciBiZWhhdmlvciAoc2VlIGJlbG93KQorfD09PQorCitbW3NwZWNfcmV0cnldXQorPT09PT0gU3BlY3VsYXRpdmUgcmV0cnkgb3B0aW9ucworCitCeSBkZWZhdWx0LCBDYXNzYW5kcmEgcmVhZCBjb29yZGluYXRvcnMgb25seSBxdWVyeSBhcyBtYW55IHJlcGxpY2FzIGFzCituZWNlc3NhcnkgdG8gc2F0aXNmeSBjb25zaXN0ZW5jeSBsZXZlbHM6IG9uZSBmb3IgY29uc2lzdGVuY3kgbGV2ZWwKK2BPTkVgLCBhIHF1b3J1bSBmb3IgYFFVT1JVTWAsIGFuZCBzbyBvbi4gYHNwZWN1bGF0aXZlX3JldHJ5YCBkZXRlcm1pbmVzCit3aGVuIGNvb3JkaW5hdG9ycyBtYXkgcXVlcnkgYWRkaXRpb25hbCByZXBsaWNhcywgYSB1c2VmdWwgYWN0aW9uIHdoZW4KK3JlcGxpY2FzIGFyZSBzbG93IG9yIHVucmVzcG9uc2l2ZS4gU3BlY3VsYXRpdmUgcmV0cmllcyByZWR1Y2UgdGhlIGxhdGVuY3kuIAorVGhlIHNwZWN1bGF0aXZlX3JldHJ5IG9wdGlvbiBjb25maWd1cmVzIHJhcGlkIHJlYWQgcHJvdGVjdGlvbiwgd2hlcmUgYSBjb29yZGluYXRvciBzZW5kcyBtb3JlCityZXF1ZXN0cyB0aGFuIG5lZWRlZCB0byBzYXRpc2Z5IHRoZSBjb25zaXN0ZW5jeSBsZXZlbC4KKworW0lNUE9SVEFOVF0KKz09PT0KK0ZyZXF1ZW50bHkgcmVhZGluZyBmcm9tIGFkZGl0aW9uYWwgcmVwbGljYXMgY2FuIGh1cnQgY2x1c3RlcgorcGVyZm9ybWFuY2UuIFdoZW4gaW4gZG91YnQsIGtlZXAgdGhlIGRlZmF1bHQgYDk5UEVSQ0VOVElMRWAuCis9PT09CisKK1ByZS1DYXNzYW5kcmEgNC4wIHNwZWN1bGF0aXZlIHJldHJ5IHBvbGljeSB0YWtlcyBhIHNpbmdsZSBzdHJpbmcgYXMgYSBwYXJhbWV0ZXI6CisKKyogYE5PTkVgCisqIGBBTFdBWVNgCisqIGA5OVBFUkNFTlRJTEVgIChQRVJDRU5USUxFKQorKiBgNTBNU2AgKENVU1RPTSkKKworQW4gZXhhbXBsZSBvZiBzZXR0aW5nIHNwZWN1bGF0aXZlIHJldHJ5IHNldHMgYSBjdXN0b20gdmFsdWU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvYWx0ZXJfdGFibGVfc3BlY19yZXRyeS5jcWxbXQorLS0tLQorCitUaGlzIGV4YW1wbGUgdXNlcyBhIHBlcmNlbnRpbGUgZm9yIHRoZSBzZXR0aW5nOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2FsdGVyX3RhYmxlX3NwZWNfcmV0cnlfcGVyY2VudC5jcWxbXQorLS0tLQorCitBIHBlcmNlbnRpbGUgc2V0dGluZyBjYW4gYmFja2ZpcmUuIElmIGEgc2luZ2xlIGhvc3QgYmVjb21lcyB1bmF2YWlsYWJsZSwgaXQgY2FuCitmb3JjZSB1cCB0aGUgcGVyY2VudGlsZXMuIEEgdmFsdWUgb2YgYHA5OWAgd2lsbCBub3Qgc3BlY3VsYXRlIGFzIGludGVuZGVkIGJlY2F1c2UgdGhlIAordmFsdWUgYXQgdGhlIHNwZWNpZmllZCBwZXJjZW50aWxlIGhhcyBpbmNyZWFzZWQgdG9vIG11Y2guIElmIHRoZSBjb25zaXN0ZW5jeSBsZXZlbCBpcyBzZXQgdG8gYEFMTGAsIGFsbCAKK3JlcGxpY2FzIGFyZSBxdWVyaWVkIHJlZ2FyZGxlc3Mgb2YgdGhlIHNwZWN1bGF0aXZlIHJldHJ5IHNldHRpbmcuIAorCitDYXNzYW5kcmEgNC4wIHN1cHBvcnRzIGNhc2UtaW5zZW5zaXRpdml0eSBmb3Igc3BlY3VsYXRpdmUgcmV0cnkgdmFsdWVzIChodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xNDI5M1tDQVNTQU5EUkEtMTQyOTNdKS4gRm9yIGV4YW1wbGUsIGFzc2lnbmluZyB0aGUgdmFsdWUgYXMgYG5vbmVgLCBgTm9uZWAsIG9yIGBOT05FYCBoYXMgdGhlIHNhbWUgZWZmZWN0LgorCitBZGRpdGlvbmFsbHksIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBhZGRlZDoKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xGb3JtYXQgfEV4YW1wbGUgfERlc2NyaXB0aW9uCit8IGBYUEVSQ0VOVElMRWAgfCA5MC41UEVSQ0VOVElMRSB8IENvb3JkaW5hdG9ycyByZWNvcmQgYXZlcmFnZSBwZXItdGFibGUgcmVzcG9uc2UgdGltZXMKK2ZvciBhbGwgcmVwbGljYXMuIElmIGEgcmVwbGljYSB0YWtlcyBsb25nZXIgdGhhbiBgWGAgcGVyY2VudCBvZiB0aGlzCit0YWJsZSdzIGF2ZXJhZ2UgcmVzcG9uc2UgdGltZSwgdGhlIGNvb3JkaW5hdG9yIHF1ZXJpZXMgYW4gYWRkaXRpb25hbAorcmVwbGljYS4gYFhgIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxMDAuCit8IGBYUGAgfCA5MC41UCB8IFNhbWUgYXMgYFhQRVJDRU5USUxFYAorfCBgWW1zYCB8IDI1bXMgfCBJZiBhIHJlcGxpY2EgdGFrZXMgbW9yZSB0aGFuIGBZYCBtaWxsaXNlY29uZHMgdG8gcmVzcG9uZCwgdGhlCitjb29yZGluYXRvciBxdWVyaWVzIGFuIGFkZGl0aW9uYWwgcmVwbGljYS4KK3wgYE1JTihYUEVSQ0VOVElMRSxZTVMpYCB8IE1JTig5OVBFUkNFTlRJTEUsMzVNUykgfCBBIGh5YnJpZCBwb2xpY3kgdGhhdCB1c2VzIGVpdGhlciB0aGUKK3NwZWNpZmllZCBwZXJjZW50aWxlIG9yIGZpeGVkIG1pbGxpc2Vjb25kcyBkZXBlbmRpbmcgb24gd2hpY2ggdmFsdWUgaXMKK2xvd2VyIGF0IHRoZSB0aW1lIG9mIGNhbGN1bGF0aW9uLiBQYXJhbWV0ZXJzIGFyZSBgWFBFUkNFTlRJTEVgLCBgWFBgLCBvcgorYFltc2AuIFRoaXMgc2V0dGluZyBoZWxwcyBwcm90ZWN0IGFnYWluc3QgYSBzaW5nbGUgc2xvdyBpbnN0YW5jZS4KKworfCBgTUFYKFhQRVJDRU5USUxFLFlNUylgIGBBTFdBWVNgIGBORVZFUmAgfCBNQVgoOTAuNVAsMjVtcykgfCBBIGh5YnJpZCBwb2xpY3kgdGhhdCB1c2VzIGVpdGhlciB0aGUgc3BlY2lmaWVkCitwZXJjZW50aWxlIG9yIGZpeGVkIG1pbGxpc2Vjb25kcyBkZXBlbmRpbmcgb24gd2hpY2ggdmFsdWUgaXMgaGlnaGVyIGF0Cit0aGUgdGltZSBvZiBjYWxjdWxhdGlvbi4gCit8PT09CisKK0Nhc3NhbmRyYSA0LjAgYWRkcyBzdXBwb3J0IGZvciBoeWJyaWQgYE1JTigpYCBhbmQgYE1BWCgpYCBzcGVjdWxhdGl2ZSByZXRyeSBwb2xpY2llcywgd2l0aCBhIG1peCBhbmQgbWF0Y2ggb2YgZWl0aGVyIGBNSU4oKSwgTUFYKClgLCBgTUlOKCksIE1JTigpYCwgb3IgYE1BWCgpLCBNQVgoKWAgKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE0MjkzW0NBU1NBTkRSQS0xNDI5M10pLgorVGhlIGh5YnJpZCBtb2RlIHdpbGwgc3RpbGwgc3BlY3VsYXRlIGlmIHRoZSBub3JtYWwgYHA5OWAgZm9yIHRoZSB0YWJsZSBpcyA8IDUwbXMsIHRoZSBtaW5pbXVtIHZhbHVlLgorQnV0IGlmIHRoZSBgcDk5YCBsZXZlbCBnb2VzIGhpZ2hlciB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlLCB0aGVuIHRoYXQgdmFsdWUgY2FuIGJlIHVzZWQuIAorSW4gYSBoeWJyaWQgdmFsdWUsIG9uZSB2YWx1ZSBtdXN0IGJlIGEgZml4ZWQgdGltZSAobXMpIHZhbHVlIGFuZCB0aGUgb3RoZXIgYSBwZXJjZW50aWxlIHZhbHVlLgorCitUbyBpbGx1c3RyYXRlIHZhcmlhdGlvbnMsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYXJlIGFsbCB2YWxpZDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9zcGVjX3JldHJ5X3ZhbHVlcy5jcWxbXQorLS0tLQorCitUaGUgYGFkZGl0aW9uYWxfd3JpdGVfcG9saWN5YCBzZXR0aW5nIHNwZWNpZmllcyB0aGUgdGhyZXNob2xkIGF0IHdoaWNoIGEgY2hlYXAKK3F1b3J1bSB3cml0ZSB3aWxsIGJlIHVwZ3JhZGVkIHRvIGluY2x1ZGUgdHJhbnNpZW50IHJlcGxpY2FzLgorCitbW2NxbC1jb21wYWN0aW9uLW9wdGlvbnNdXQorPT09PT0gQ29tcGFjdGlvbiBvcHRpb25zCisKK1RoZSBgY29tcGFjdGlvbmAgb3B0aW9ucyBtdXN0IG1pbmltYWxseSBkZWZpbmUgdGhlIGAnY2xhc3MnYCBzdWItb3B0aW9uLAordG8gc3BlY2lmeSB0aGUgY29tcGFjdGlvbiBzdHJhdGVneSBjbGFzcyB0byB1c2UuIAorVGhlIHN1cHBvcnRlZCBjbGFzc2VzIGFyZTogCisKKyogYCdTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J2AsIHhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vc3Rjcy5hZG9jI3N0Y3NbU1RDU10gKERlZmF1bHQpCisqIGAnTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneSdgLCB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL2xjcy5hZG9jI2xjc1tMQ1NdCisqIGAnVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSdgLCB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL3R3Y3MuYWRvYyN0d2NzW1RXQ1NdIAorCitJZiBhIGN1c3RvbSBzdHJhdGVnaWVzIGlzIHJlcXVpcmVkLCBzcGVjaWZ5IHRoZSBmdWxsIGNsYXNzIG5hbWUgYXMgYSB4cmVmOmNxbC9kZWZpbml0aW9ucy5hZG9jI2NvbnN0YW50c1tzdHJpbmcgY29uc3RhbnRdLiAgCisKK0FsbCBkZWZhdWx0IHN0cmF0ZWdpZXMgc3VwcG9ydCBhIG51bWJlciBvZiB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL2luZGV4LmFkb2MjY29tcGFjdGlvbi1vcHRpb25zW2NvbW1vbiBvcHRpb25zXSwgYXMgd2VsbCBhcyBvcHRpb25zIHNwZWNpZmljIHRvIHRoZSBzdHJhdGVneSBjaG9zZW4uIFNlZSB0aGUgc2VjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHlvdXIgc3RyYXRlZ3kgZm9yIGRldGFpbHM6IHhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vc3Rjcy5hZG9jI3N0Y3Nfb3B0aW9uc1tTVENTXSwgeHJlZjpvcGVyYXRpbmcvY29tcGFjdGlvbi9sY3MuYWRvYyNsY3Nfb3B0aW9uc1tMQ1NdLCB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL3R3Y3MuYWRvYyN0d2NzX29wdGlvbnNbVFdDU10uCisKK1tbY3FsLWNvbXByZXNzaW9uLW9wdGlvbnNdXQorPT09PT0gQ29tcHJlc3Npb24gb3B0aW9ucworCitUaGUgYGNvbXByZXNzaW9uYCBvcHRpb25zIGRlZmluZSBpZiBhbmQgaG93IHRoZSBTU1RhYmxlcyBvZiB0aGUgdGFibGUKK2FyZSBjb21wcmVzc2VkLiBDb21wcmVzc2lvbiBpcyBjb25maWd1cmVkIG9uIGEgcGVyLXRhYmxlIGJhc2lzIGFzIGFuCitvcHRpb25hbCBhcmd1bWVudCB0byBgQ1JFQVRFIFRBQkxFYCBvciBgQUxURVIgVEFCTEVgLiBUaGUgZm9sbG93aW5nCitzdWItb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE9wdGlvbiB8RGVmYXVsdCB8RGVzY3JpcHRpb24KK3wgYGNsYXNzYCB8IExaNENvbXByZXNzb3IgfCBUaGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIHRvIHVzZS4gRGVmYXVsdCBjb21wcmVzc29yIGFyZTogTFo0Q29tcHJlc3NvciwKK1NuYXBweUNvbXByZXNzb3IsIERlZmxhdGVDb21wcmVzc29yIGFuZCBac3RkQ29tcHJlc3Nvci4gCitVc2UgYCdlbmFibGVkJyA6IGZhbHNlYCB0byBkaXNhYmxlIGNvbXByZXNzaW9uLiAKK0N1c3RvbSBjb21wcmVzc29yIGNhbiBiZSBwcm92aWRlZCBieSBzcGVjaWZ5aW5nIHRoZSBmdWxsIGNsYXNzIG5hbWUgYXMgYSB4cmVmOmNxbC9kZWZpbml0aW9ucy5hZG9jI2NvbnN0YW50c1tzdHJpbmcgY29uc3RhbnRdLgorCit8IGBlbmFibGVkYCB8IHRydWUgfCBFbmFibGUvZGlzYWJsZSBzc3RhYmxlIGNvbXByZXNzaW9uLiAKK0lmIHRoZSBgZW5hYmxlZGAgb3B0aW9uIGlzIHNldCB0byBgZmFsc2VgLCBubyBvdGhlciBvcHRpb25zIG11c3QgYmUgc3BlY2lmaWVkLgorCit8IGBjaHVua19sZW5ndGhfaW5fa2JgIHwgNjQgfCBPbiBkaXNrIFNTVGFibGVzIGFyZSBjb21wcmVzc2VkIGJ5IGJsb2NrICh0byBhbGxvdyByYW5kb20gcmVhZHMpLiAKK1RoaXMgb3B0aW9uIGRlZmluZXMgdGhlIHNpemUgKGluIEtCKSBvZiBzYWlkIGJsb2NrLiBTZWUgeHJlZjpjcWwvZGRsLmFkb2MjY2h1bmtfbm90ZVtub3RlXSBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKworfCBgY3JjX2NoZWNrX2NoYW5jZWAgfCAxLjAgfCBEZXRlcm1pbmVzIGhvdyBsaWtlbHkgQ2Fzc2FuZHJhIGlzIHRvIHZlcmlmeSB0aGUgY2hlY2tzdW0gb24gZWFjaAorY29tcHJlc3Npb24gY2h1bmsgZHVyaW5nIHJlYWRzLgorCit8IGBjb21wcmVzc2lvbl9sZXZlbGAgfCAzIHwgQ29tcHJlc3Npb24gbGV2ZWwuIE9ubHkgYXBwbGljYWJsZSBmb3IgYFpzdGRDb21wcmVzc29yYC4gIAorQWNjZXB0cyB2YWx1ZXMgYmV0d2VlbiBgLTEzMTA3MmAgYW5kIGAyMmAuCit8PT09CisKK1tbY2h1bmtfbm90ZV1dCitbTk9URV0KKz09PT0KK0JpZ2dlciB2YWx1ZXMgbWF5IGltcHJvdmUgdGhlIGNvbXByZXNzaW9uIHJhdGUsIGJ1dCB3aWxsIGluY3JlYXNlIHRoZSBtaW5pbXVtIHNpemUgb2YgZGF0YSB0byBiZSByZWFkIGZyb20KK2Rpc2sgZm9yIGEgcmVhZC4gCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBvcHRpbWFsIHZhbHVlIGZvciBjb21wcmVzc2luZyB0YWJsZXMuIAorQ2h1bmsgbGVuZ3RoIG11c3QgYmUgYSBwb3dlciBvZiAyIHdoZW4gY29tcHV0aW5nIHRoZSBjaHVuayBudW1iZXIgZnJvbSBhbiB1bmNvbXByZXNzZWQgZmlsZSBvZmZzZXQuIAorQmxvY2sgc2l6ZSBtYXkgYmUgYWRqdXN0ZWQgYmFzZWQgb24gcmVhZC93cml0ZSBhY2Nlc3MgcGF0dGVybnMgc3VjaCBhczoKKworKiBIb3cgbXVjaCBkYXRhIGlzIHR5cGljYWxseSByZXF1ZXN0ZWQgYXQgb25jZQorKiBBdmVyYWdlIHNpemUgb2Ygcm93cyBpbiB0aGUgdGFibGUKKz09PT0KKworRm9yIGluc3RhbmNlLCB0byBjcmVhdGUgYSB0YWJsZSB3aXRoIExaNENvbXByZXNzb3IgYW5kIGEgYGNodW5rX2xlbmd0aF9pbl9rYmAgb2YgNCBLQjoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jaHVua19sZW5ndGguY3FsW10KKy0tLS0KKworW1tjcWwtY2FjaGluZy1vcHRpb25zXV0KKz09PT09IENhY2hpbmcgb3B0aW9ucworCitDYWNoaW5nIG9wdGltaXplcyB0aGUgdXNlIG9mIGNhY2hlIG1lbW9yeSBvZiBhIHRhYmxlLiBUaGUgY2FjaGVkIGRhdGEgaXMKK3dlaWdoZWQgYnkgc2l6ZSBhbmQgYWNjZXNzIGZyZXF1ZW5jeS4gCitUaGUgYGNhY2hpbmdgIG9wdGlvbnMgY2FuIGNvbmZpZ3VyZSBib3RoIHRoZSBga2V5IGNhY2hlYCBhbmQgdGhlIGByb3cgY2FjaGVgIGZvciB0aGUgdGFibGUuIAorVGhlIGZvbGxvd2luZyBzdWItb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE9wdGlvbiB8RGVmYXVsdCB8RGVzY3JpcHRpb24KK3wgYGtleXNgIHwgQUxMIHwgV2hldGhlciB0byBjYWNoZSBrZXlzIChrZXkgY2FjaGUpIGZvciB0aGlzIHRhYmxlLiBWYWxpZCB2YWx1ZXMgYXJlOiBgQUxMYCBhbmQgYE5PTkVgLgorCit8IGByb3dzX3Blcl9wYXJ0aXRpb25gIHwgTk9ORSB8IFRoZSBhbW91bnQgb2Ygcm93cyB0byBjYWNoZSBwZXIgcGFydGl0aW9uIChyb3cgY2FjaGUpLiAKK0lmIGFuIGludGVnZXIgYG5gIGlzIHNwZWNpZmllZCwgdGhlIGZpcnN0IGBuYCBxdWVyaWVkIHJvd3Mgb2YgYSBwYXJ0aXRpb24gd2lsbCBiZSBjYWNoZWQuIAorVmFsaWQgdmFsdWVzIGFyZTogYEFMTGAsIHRvIGNhY2hlIGFsbCByb3dzIG9mIGEgcXVlcmllZCBwYXJ0aXRpb24sIG9yIGBOT05FYCB0byBkaXNhYmxlIHJvdyBjYWNoaW5nLgorfD09PQorCitGb3IgaW5zdGFuY2UsIHRvIGNyZWF0ZSBhIHRhYmxlIHdpdGggYm90aCBhIGtleSBjYWNoZSBhbmQgMTAgcm93cyBjYWNoZWQgcGVyIHBhcnRpdGlvbjoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jYWNoaW5nX29wdGlvbi5jcWxbXQorLS0tLQorCitbW3JlYWQtcmVwYWlyLW9wdGlvbnNdXQorPT09PT0gUmVhZCBSZXBhaXIgb3B0aW9ucworCitUaGUgYHJlYWRfcmVwYWlyYCBvcHRpb25zIGNvbmZpZ3VyZSB0aGUgcmVhZCByZXBhaXIgYmVoYXZpb3IsIHR1bmluZyBmb3IgdmFyaW91cyBwZXJmb3JtYW5jZSBhbmQgY29uc2lzdGVuY3kgYmVoYXZpb3JzLiAKKworVGhlIHZhbHVlcyBhcmU6CitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE9wdGlvbiB8RGVmYXVsdCB8RGVzY3JpcHRpb24KK3xgQkxPQ0tJTkdgIHwgeWVzIHwgSWYgYSByZWFkIHJlcGFpciBpcyB0cmlnZ2VyZWQsIHRoZSByZWFkIGJsb2NrcyB3cml0ZXMgc2VudCB0byBvdGhlciByZXBsaWNhcyB1bnRpbCB0aGUgY29uc2lzdGVuY3kgbGV2ZWwgaXMgcmVhY2hlZCBieSB0aGUgd3JpdGVzLgorCit8YE5PTkVgIHwgbm8gfCBJZiBzZXQsIHRoZSBjb29yZGluYXRvciByZWNvbmNpbGVzIGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHJlcGxpY2FzLCBidXQgZG9lc24ndCBhdHRlbXB0IHRvIHJlcGFpciB0aGVtLgorfD09PQorCitUd28gY29uc2lzdGVuY3kgcHJvcGVydGllcyBhcmUgYWZmZWN0ZWQgYnkgcmVhZCByZXBhaXIgYmVoYXZpb3IuCisKKyogTW9ub3RvbmljIHF1b3J1bSByZWFkczogTW9ub3RvbmljIHF1b3J1bSByZWFkcworcHJldmVudHMgcmVhZHMgZnJvbSBhcHBlYXJpbmcgdG8gZ28gYmFjayBpbiB0aW1lIGluIHNvbWUgY2lyY3Vtc3RhbmNlcy4KK1doZW4gbW9ub3RvbmljIHF1b3J1bSByZWFkcyBhcmUgbm90IHByb3ZpZGVkIGFuZCBhIHdyaXRlIGZhaWxzIHRvIHJlYWNoCithIHF1b3J1bSBvZiByZXBsaWNhcywgdGhlIHJlYWQgdmFsdWVzIG1heSBiZSB2aXNpYmxlIGluIG9uZSByZWFkLCBhbmQgdGhlbiBkaXNhcHBlYXIKK2luIGEgc3Vic2VxdWVudCByZWFkLiBgQkxPQ0tJTkdgIHByb3ZpZGVzIHRoaXMgYmVoYXZpb3IuCisqIFdyaXRlIGF0b21pY2l0eTogV3JpdGUgYXRvbWljaXR5IHByZXZlbnRzIHJlYWRzCitmcm9tIHJldHVybmluZyBwYXJ0aWFsbHktYXBwbGllZCB3cml0ZXMuIENhc3NhbmRyYSBhdHRlbXB0cyB0byBwcm92aWRlCitwYXJ0aXRpb24tbGV2ZWwgd3JpdGUgYXRvbWljaXR5LCBidXQgc2luY2Ugb25seSB0aGUgZGF0YSBjb3ZlcmVkIGJ5IGEKK1NFTEVDVCBzdGF0ZW1lbnQgaXMgcmVwYWlyZWQgYnkgYSByZWFkIHJlcGFpciwgcmVhZCByZXBhaXIgY2FuIGJyZWFrCit3cml0ZSBhdG9taWNpdHkgd2hlbiBkYXRhIGlzIHJlYWQgYXQgYSBtb3JlIGdyYW51bGFyIGxldmVsIHRoYW4gaXQgaXMKK3dyaXR0ZW4uIEZvciBleGFtcGxlLCByZWFkIHJlcGFpciBjYW4gYnJlYWsgd3JpdGUgYXRvbWljaXR5IGlmIHlvdSB3cml0ZQorbXVsdGlwbGUgcm93cyB0byBhIGNsdXN0ZXJlZCBwYXJ0aXRpb24gaW4gYSBiYXRjaCwgYnV0IHRoZW4gc2VsZWN0IGEKK3NpbmdsZSByb3cgYnkgc3BlY2lmeWluZyB0aGUgY2x1c3RlcmluZyBjb2x1bW4gaW4gYSBTRUxFQ1Qgc3RhdGVtZW50LgorYE5PTkVgIHByb3ZpZGVzIHRoaXMgYmVoYXZpb3IuCisKKz09PT09IE90aGVyIGNvbnNpZGVyYXRpb25zOgorCisqIEFkZGluZyBuZXcgY29sdW1ucyAoc2VlIGBBTFRFUiBUQUJMRWAgYmVsb3cpIGlzIGEgY29uc3RhbnQgdGltZQorb3BlcmF0aW9uLiBUaHVzLCB0aGVyZSBpcyBubyBuZWVkIHRvIGFudGljaXBhdGUgZnV0dXJlIHVzYWdlIHdoaWxlIGluaXRpYWxseSBjcmVhdGluZyBhIHRhYmxlLgorCitbW2FsdGVyLXRhYmxlLXN0YXRlbWVudF1dCis9PSBBTFRFUiBUQUJMRQorCitBbHRlcmluZyBhbiBleGlzdGluZyB0YWJsZSB1c2VzIHRoZSBgQUxURVIgVEFCTEVgIHN0YXRlbWVudDoKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9hbHRlcl90YWJsZS5ibmZbXQorLS0tLQorSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvYWx0ZXJfdGFibGVfYWRkX2NvbHVtbi5jcWxbXQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvYWx0ZXJfdGFibGVfd2l0aF9jb21tZW50LmNxbFtdCistLS0tCisKK1RoZSBgQUxURVIgVEFCTEVgIHN0YXRlbWVudCBjYW46CisKKyogYEFERGAgYSBuZXcgY29sdW1uIHRvIGEgdGFibGUuIFRoZSBwcmltYXJ5IGtleSBvZiBhIHRhYmxlIGNhbm5vdCBldmVyIGJlIGFsdGVyZWQuCitBIG5ldyBjb2x1bW4sIHRodXMsIGNhbm5vdCBiZSBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleS4gCitBZGRpbmcgYSBjb2x1bW4gaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbiBiYXNlZCBvbiB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIHRhYmxlLgorSWYgdGhlIG5ldyBjb2x1bW4gYWxyZWFkeSBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgTk9UIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKyogYERST1BgIGEgY29sdW1uIGZyb20gYSB0YWJsZS4gVGhpcyBjb21tYW5kIGRyb3BzIGJvdGggdGhlIGNvbHVtbiBhbmQgYWxsCitpdHMgY29udGVudC4gQmUgYXdhcmUgdGhhdCwgd2hpbGUgdGhlIGNvbHVtbiBiZWNvbWVzIGltbWVkaWF0ZWx5Cit1bmF2YWlsYWJsZSwgaXRzIGNvbnRlbnQgYXJlIHJlbW92ZWQgbGF6aWx5IGR1cmluZyBjb21wYWN0aW9uLiBCZWNhdXNlIG9mIHRoaXMgbGF6eSByZW1vdmFsLAordGhlIGNvbW1hbmQgaXMgYSBjb25zdGFudC10aW1lIG9wZXJhdGlvbiBiYXNlZCBvbiB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhlIHRhYmxlLiAKK0Fsc28sIGl0IGlzIGltcG9ydGFudCB0byBrbm93IHRoYXQgb25jZSBhIGNvbHVtbiBpcyBkcm9wcGVkLCBhIGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUgY2FuIGJlIHJlLWFkZGVkLAordW5sZXNzIHRoZSBkcm9wcGVkIGNvbHVtbiB3YXMgYSBub24tZnJvemVuIGNvbHVtbiBsaWtlIGEgY29sbGVjdGlvbi4KK0lmIHRoZSBkcm9wcGVkIGNvbHVtbiBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MgYElGIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKworW1dBUk5JTkddCisuV2FybmluZworPT09PQorRHJvcHBpbmcgYSBjb2x1bW4gYXNzdW1lcyB0aGF0IHRoZSB0aW1lc3RhbXBzIHVzZWQgZm9yIHRoZSB2YWx1ZSBvZiB0aGlzCitjb2x1bW4gYXJlICJyZWFsIiB0aW1lc3RhbXAgaW4gbWljcm9zZWNvbmRzLiBVc2luZyAicmVhbCIgdGltZXN0YW1wcyBpbgorbWljcm9zZWNvbmRzIGlzIHRoZSBkZWZhdWx0IGlzIGFuZCBpcyAqc3Ryb25nbHkqIHJlY29tbWVuZGVkIGJ1dCBhcworQ2Fzc2FuZHJhIGFsbG93cyB0aGUgY2xpZW50IHRvIHByb3ZpZGUgYW55IHRpbWVzdGFtcCBvbiBhbnkgdGFibGUsIGl0IGlzCit0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIHRvIHVzZSBhbm90aGVyIGNvbnZlbnRpb24uIFBsZWFzZSBiZSBhd2FyZSB0aGF0CitpZiB5b3UgZG8gc28sIGRyb3BwaW5nIGEgY29sdW1uIHdpbGwgbm90IGNvcnJlY3RseSBleGVjdXRlLgorPT09PQorCisqIGBSRU5BTUVgIGEgcHJpbWFyeSBrZXkgY29sdW1uIG9mIGEgdGFibGUuIE5vbiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbm5vdCBiZSByZW5hbWVkLgorRnVydGhlcm1vcmUsIHJlbmFtaW5nIGEgY29sdW1uIHRvIGFub3RoZXIgbmFtZSB3aGljaCBhbHJlYWR5IGV4aXN0cyBpc24ndCBhbGxvd2VkLgorSXQncyBpbXBvcnRhbnQgdG8ga2VlcCBpbiBtaW5kIHRoYXQgcmVuYW1lZCBjb2x1bW5zIHNob3VsZG4ndCBoYXZlIGRlcGVuZGVudCBzZWNvbmRheSBpbmRleGVzLgorSWYgdGhlIHJlbmFtZWQgY29sdW1uIGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorCisqIFVzZSBgV0lUSGAgdG8gY2hhbmdlIGEgdGFibGUgb3B0aW9uLiBUaGUgeHJlZjpDUUwvZGRsLmFkb2MjY3JlYXRlLXRhYmxlLW9wdGlvbnNbc3VwcG9ydGVkIG9wdGlvbnNdCithcmUgdGhlIHNhbWUgYXMgdGhvc2UgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGFibGUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBgQ0xVU1RFUklORyBPUkRFUmAuCitIb3dldmVyLCBzZXR0aW5nIGFueSBgY29tcGFjdGlvbmAgc3ViLW9wdGlvbnMgd2lsbCBlcmFzZSAqQUxMKiBwcmV2aW91cyBgY29tcGFjdGlvbmAgb3B0aW9ucywgc28geW91IG5lZWQgdG8gcmUtc3BlY2lmeQorYWxsIHRoZSBzdWItb3B0aW9ucyB5b3Ugd2lzaCB0byBrZWVwLiBUaGUgc2FtZSBpcyB0cnVlIGZvciBgY29tcHJlc3Npb25gIHN1Yi1vcHRpb25zLgorCitbW2Ryb3AtdGFibGUtc3RhdGVtZW50XV0KKz09IERST1AgVEFCTEUKKworRHJvcHBpbmcgYSB0YWJsZSB1c2VzIHRoZSBgRFJPUCBUQUJMRWAgc3RhdGVtZW50OgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2Ryb3BfdGFibGUuYm5mW10KKy0tLS0KKworRHJvcHBpbmcgYSB0YWJsZSByZXN1bHRzIGluIHRoZSBpbW1lZGlhdGUsIGlycmV2ZXJzaWJsZSByZW1vdmFsIG9mIHRoZQordGFibGUsIGluY2x1ZGluZyBhbGwgZGF0YSBpdCBjb250YWlucy4KKworSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCB0aGUgc3RhdGVtZW50IHdpbGwgcmV0dXJuIGFuIGVycm9yLCB1bmxlc3MKK2BJRiBFWElTVFNgIGlzIHVzZWQsIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorCitbW3RydW5jYXRlLXN0YXRlbWVudF1dCis9PSBUUlVOQ0FURQorCitBIHRhYmxlIGNhbiBiZSB0cnVuY2F0ZWQgdXNpbmcgdGhlIGBUUlVOQ0FURWAgc3RhdGVtZW50OgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL3RydW5jYXRlX3RhYmxlLmJuZltdCistLS0tCisKK2BUUlVOQ0FURSBUQUJMRSBmb29gIGlzIHRoZSBwcmVmZXJyZWQgc3ludGF4IGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIERETAorc3RhdGVtZW50cy4gCitIb3dldmVyLCB0YWJsZXMgYXJlIHRoZSBvbmx5IG9iamVjdCB0aGF0IGNhbiBiZSB0cnVuY2F0ZWQgY3VycmVudGx5LCBhbmQgdGhlIGBUQUJMRWAga2V5d29yZCBjYW4gYmUgb21pdHRlZC4KKworVHJ1bmNhdGluZyBhIHRhYmxlIHBlcm1hbmVudGx5IHJlbW92ZXMgYWxsIGV4aXN0aW5nIGRhdGEgZnJvbSB0aGUgdGFibGUsIGJ1dCB3aXRob3V0IHJlbW92aW5nIHRoZSB0YWJsZSBpdHNlbGYuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvZGVmaW5pdGlvbnMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9kZWZpbml0aW9ucy5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZTYwNDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvZGVmaW5pdGlvbnMuYWRvYwpAQCAtMCwwICsxLDE4NyBAQAorPSBEZWZpbml0aW9ucworCis9PSBDb252ZW50aW9ucworCitUbyBhaWQgaW4gc3BlY2lmeWluZyB0aGUgQ1FMIHN5bnRheCwgd2Ugd2lsbCB1c2UgdGhlIGZvbGxvd2luZworY29udmVudGlvbnMgaW4gdGhpcyBkb2N1bWVudDoKKworKiBMYW5ndWFnZSBydWxlcyB3aWxsIGJlIGdpdmVuIGluIGFuIGluZm9ybWFsCitodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JhY2t1cyVFMiU4MCU5M05hdXJfRm9ybSNWYXJpYW50c1tCTkYKK3ZhcmlhbnRdIG5vdGF0aW9uLiBJbiBwYXJ0aWN1bGFyLCB3ZSdsbCB1c2Ugc3F1YXJlIGJyYWtldHMgKGBbIGl0ZW0gXWApCitmb3Igb3B0aW9uYWwgaXRlbXMsIGAqYCBhbmQgYCtgIGZvciByZXBlYXRlZCBpdGVtcyAod2hlcmUgYCtgIGltcGx5IGF0CitsZWFzdCBvbmUpLgorKiBUaGUgZ3JhbW1hciB3aWxsIGFsc28gdXNlIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbiBmb3IgY29udmVuaWVuY2U6Citub24tdGVybWluYWwgdGVybSB3aWxsIGJlIGxvd2VyY2FzZSAoYW5kIGxpbmsgdG8gdGhlaXIgZGVmaW5pdGlvbikgd2hpbGUKK3Rlcm1pbmFsIGtleXdvcmRzIHdpbGwgYmUgcHJvdmlkZWQgImFsbCBjYXBzIi4gTm90ZSBob3dldmVyIHRoYXQKK2tleXdvcmRzIGFyZSBgaWRlbnRpZmllcnNgIGFuZCBhcmUgdGh1cyBjYXNlIGluc2Vuc2l0aXZlIGluIHByYWN0aWNlLiBXZQord2lsbCBhbHNvIGRlZmluZSBzb21lIGVhcmx5IGNvbnN0cnVjdGlvbiB1c2luZyByZWdleHAsIHdoaWNoIHdlJ2xsCitpbmRpY2F0ZSB3aXRoIGByZSg8c29tZSByZWd1bGFyIGV4cHJlc3Npb24+KWAuCisqIFRoZSBncmFtbWFyIGlzIHByb3ZpZGVkIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzIGFuZCBsZWF2ZSBzb21lCittaW5vciBkZXRhaWxzIG91dC4gRm9yIGluc3RhbmNlLCB0aGUgY29tbWEgb24gdGhlIGxhc3QgY29sdW1uIGRlZmluaXRpb24KK2luIGEgYENSRUFURSBUQUJMRWAgc3RhdGVtZW50IGlzIG9wdGlvbmFsIGJ1dCBzdXBwb3J0ZWQgaWYgcHJlc2VudCBldmVuCit0aG91Z2ggdGhlIGdyYW1tYXIgaW4gdGhpcyBkb2N1bWVudCBzdWdnZXN0cyBvdGhlcndpc2UuIEFsc28sIG5vdAorZXZlcnl0aGluZyBhY2NlcHRlZCBieSB0aGUgZ3JhbW1hciBpcyBuZWNlc3NhcmlseSB2YWxpZCBDUUwuCisqIFJlZmVyZW5jZXMgdG8ga2V5d29yZHMgb3IgcGllY2VzIG9mIENRTCBjb2RlIGluIHJ1bm5pbmcgdGV4dCB3aWxsIGJlCitzaG93biBpbiBhIGBmaXhlZC13aWR0aCBmb250YC4KKworW1tpZGVudGlmaWVyc11dCis9PSBJZGVudGlmaWVycyBhbmQga2V5d29yZHMKKworVGhlIENRTCBsYW5ndWFnZSB1c2VzIF9pZGVudGlmaWVyc18gKG9yIF9uYW1lc18pIHRvIGlkZW50aWZ5IHRhYmxlcywKK2NvbHVtbnMgYW5kIG90aGVyIG9iamVjdHMuIEFuIGlkZW50aWZpZXIgaXMgYSB0b2tlbiBtYXRjaGluZyB0aGUgcmVndWxhcgorZXhwcmVzc2lvbiBgW2EtekEtWl1bYS16QS1aMC05X10qYC4KKworQSBudW1iZXIgb2Ygc3VjaCBpZGVudGlmaWVycywgbGlrZSBgU0VMRUNUYCBvciBgV0lUSGAsIGFyZSBfa2V5d29yZHNfLgorVGhleSBoYXZlIGEgZml4ZWQgbWVhbmluZyBmb3IgdGhlIGxhbmd1YWdlIGFuZCBtb3N0IGFyZSByZXNlcnZlZC4gVGhlCitsaXN0IG9mIHRob3NlIGtleXdvcmRzIGNhbiBiZSBmb3VuZCBpbiB4cmVmOmNxbC9hcHBlbmRpY2VzLmFkb2MjYXBwZW5kaXgtQVtBcHBlbmRpeCBBXS4KKworSWRlbnRpZmllcnMgYW5kICh1bnF1b3RlZCkga2V5d29yZHMgYXJlIGNhc2UgaW5zZW5zaXRpdmUuIFRodXMgYFNFTEVDVGAKK2lzIHRoZSBzYW1lIHRoYW4gYHNlbGVjdGAgb3IgYHNFbEVjVGAsIGFuZCBgbXlJZGAgaXMgdGhlIHNhbWUgdGhhbgorYG15aWRgIG9yIGBNWUlEYC4gQSBjb252ZW50aW9uIG9mdGVuIHVzZWQgKGluIHBhcnRpY3VsYXIgYnkgdGhlIHNhbXBsZXMKK29mIHRoaXMgZG9jdW1lbnRhdGlvbikgaXMgdG8gdXNlIHVwcGVyY2FzZSBmb3Iga2V5d29yZHMgYW5kIGxvd2VyY2FzZQorZm9yIG90aGVyIGlkZW50aWZpZXJzLgorCitUaGVyZSBpcyBhIHNlY29uZCBraW5kIG9mIGlkZW50aWZpZXIgY2FsbGVkIGEgX3F1b3RlZCBpZGVudGlmaWVyXworZGVmaW5lZCBieSBlbmNsb3NpbmcgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgKG5vbi1lbXB0eSkgaW4KK2RvdWJsZS1xdW90ZXMoYCJgKS4gUXVvdGVkIGlkZW50aWZpZXJzIGFyZSBuZXZlciBrZXl3b3Jkcy4gVGh1cworYCJzZWxlY3QiYCBpcyBub3QgYSByZXNlcnZlZCBrZXl3b3JkIGFuZCBjYW4gYmUgdXNlZCB0byByZWZlciB0byBhCitjb2x1bW4gKG5vdGUgdGhhdCB1c2luZyB0aGlzIGlzIHBhcnRpY3VsYXJseSBpbGwtYWR2aXNlZCksIHdoaWxlIGBzZWxlY3RgCit3b3VsZCByYWlzZSBhIHBhcnNpbmcgZXJyb3IuIEFsc28sIHVubGlrZSB1bnF1b3RlZCBpZGVudGlmaWVycworYW5kIGtleXdvcmRzLCBxdW90ZWQgaWRlbnRpZmllcnMgYXJlIGNhc2Ugc2Vuc2l0aXZlIChgIk15IFF1b3RlZCBJZCJgIGlzCitfZGlmZmVyZW50XyBmcm9tIGAibXkgcXVvdGVkIGlkImApLiBBIGZ1bGx5IGxvd2VyY2FzZSBxdW90ZWQgaWRlbnRpZmllcgordGhhdCBtYXRjaGVzIGBbYS16QS1aXVthLXpBLVowLTlfXSpgIGlzIGhvd2V2ZXIgX2VxdWl2YWxlbnRfIHRvIHRoZQordW5xdW90ZWQgaWRlbnRpZmllciBvYnRhaW5lZCBieSByZW1vdmluZyB0aGUgZG91YmxlLXF1b3RlIChzbyBgIm15aWQiYAoraXMgZXF1aXZhbGVudCB0byBgbXlpZGAgYW5kIHRvIGBteUlkYCBidXQgZGlmZmVyZW50IGZyb20gYCJteUlkImApLgorSW5zaWRlIGEgcXVvdGVkIGlkZW50aWZpZXIsIHRoZSBkb3VibGUtcXVvdGUgY2hhcmFjdGVyIGNhbiBiZSByZXBlYXRlZAordG8gZXNjYXBlIGl0LCBzbyBgImZvbyAiIiBiYXIiYCBpcyBhIHZhbGlkIGlkZW50aWZpZXIuCisKK1tOT1RFXQorLk5vdGUKKz09PT0KK1RoZSBfcXVvdGVkIGlkZW50aWZpZXJfIGNhbiBkZWNsYXJlIGNvbHVtbnMgd2l0aCBhcmJpdHJhcnkgbmFtZXMsIGFuZAordGhlc2UgY2FuIHNvbWV0aW1lIGNsYXNoIHdpdGggc3BlY2lmaWMgbmFtZXMgdXNlZCBieSB0aGUgc2VydmVyLiBGb3IKK2luc3RhbmNlLCB3aGVuIHVzaW5nIGNvbmRpdGlvbmFsIHVwZGF0ZSwgdGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgd2l0aCBhCityZXN1bHQgc2V0IGNvbnRhaW5pbmcgYSBzcGVjaWFsIHJlc3VsdCBuYW1lZCBgIlthcHBsaWVkXSJgLiBJZiB5b3XigJl2ZQorZGVjbGFyZWQgYSBjb2x1bW4gd2l0aCBzdWNoIGEgbmFtZSwgdGhpcyBjb3VsZCBwb3RlbnRpYWxseSBjb25mdXNlIHNvbWUKK3Rvb2xzIGFuZCBzaG91bGQgYmUgYXZvaWRlZC4gSW4gZ2VuZXJhbCwgdW5xdW90ZWQgaWRlbnRpZmllcnMgc2hvdWxkIGJlCitwcmVmZXJyZWQgYnV0IGlmIHlvdSB1c2UgcXVvdGVkIGlkZW50aWZpZXJzLCBpdCBpcyBzdHJvbmdseSBhZHZpc2VkIHRoYXQgeW91Cithdm9pZCBhbnkgbmFtZSBlbmNsb3NlZCBieSBzcXVhcmVkIGJyYWNrZXRzIChsaWtlIGAiW2FwcGxpZWRdImApIGFuZCBhbnkKK25hbWUgdGhhdCBsb29rcyBsaWtlIGEgZnVuY3Rpb24gY2FsbCAobGlrZSBgImYoeCkiYCkuCis9PT09CisKK01vcmUgZm9ybWFsbHksIHdlIGhhdmU6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2lkZW50aWZpZXIuYm5mW10KKy0tLS0KKworW1tjb25zdGFudHNdXQorPT0gQ29uc3RhbnRzCisKK0NRTCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgX2NvbnN0YW50c186CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2NvbnN0YW50LmJuZltdCistLS0tCisKK0luIG90aGVyIHdvcmRzOgorCisqIEEgc3RyaW5nIGNvbnN0YW50IGlzIGFuIGFyYml0cmFyeSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIGVuY2xvc2VkIGJ5CitzaW5nbGUtcXVvdGUoYCdgKS4gQSBzaW5nbGUtcXVvdGUgY2FuIGJlIGluY2x1ZGVkIGJ5IHJlcGVhdGluZyBpdCwgZS5nLgorYCdJdCcncyByYWluaW5nIHRvZGF5J2AuIFRob3NlIGFyZSBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBxdW90ZWQKK2BpZGVudGlmaWVyc2AgdGhhdCB1c2UgZG91YmxlLXF1b3Rlcy4gQWx0ZXJuYXRpdmVseSwgYSBzdHJpbmcgY2FuIGJlCitkZWZpbmVkIGJ5IGVuY2xvc2luZyB0aGUgYXJiaXRyYXJ5IHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYnkgdHdvIGRvbGxhcgorY2hhcmFjdGVycywgaW4gd2hpY2ggY2FzZSBzaW5nbGUtcXVvdGUgY2FuIGJlIHVzZWQgd2l0aG91dCBlc2NhcGluZworKGAkJEl0J3MgcmFpbmluZyB0b2RheSQkYCkuIFRoYXQgbGF0dGVyIGZvcm0gaXMgb2Z0ZW4gdXNlZCB3aGVuIGRlZmluaW5nCit4cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyN1ZGZzW3VzZXItZGVmaW5lZCBmdW5jdGlvbnNdIHRvIGF2b2lkIGhhdmluZyB0byBlc2NhcGUgc2luZ2xlLXF1b3RlCitjaGFyYWN0ZXJzIGluIGZ1bmN0aW9uIGJvZHkgKGFzIHRoZXkgYXJlIG1vcmUgbGlrZWx5IHRvIG9jY3VyIHRoYW4KK2AkJGApLgorKiBJbnRlZ2VyLCBmbG9hdCBhbmQgYm9vbGVhbiBjb25zdGFudCBhcmUgZGVmaW5lZCBhcyBleHBlY3RlZC4gTm90ZQoraG93ZXZlciB0aGFuIGZsb2F0IGFsbG93cyB0aGUgc3BlY2lhbCBgTmFOYCBhbmQgYEluZmluaXR5YCBjb25zdGFudHMuCisqIENRTCBzdXBwb3J0cworaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfdW5pcXVlX2lkZW50aWZpZXJbVVVJRF0KK2NvbnN0YW50cy4KKyogVGhlIGNvbnRlbnQgZm9yIGJsb2JzIGlzIHByb3ZpZGVkIGluIGhleGFkZWNpbWFsIGFuZCBwcmVmaXhlZCBieSBgMHhgLgorKiBUaGUgc3BlY2lhbCBgTlVMTGAgY29uc3RhbnQgZGVub3RlcyB0aGUgYWJzZW5jZSBvZiB2YWx1ZS4KKworRm9yIGhvdyB0aGVzZSBjb25zdGFudHMgYXJlIHR5cGVkLCBzZWUgdGhlIHhyZWY6Y3FsL3R5cGVzLmFkb2NbRGF0YSB0eXBlc10gc2VjdGlvbi4KKworPT0gVGVybXMKKworQ1FMIGhhcyB0aGUgbm90aW9uIG9mIGEgX3Rlcm1fLCB3aGljaCBkZW5vdGVzIHRoZSBraW5kIG9mIHZhbHVlcyB0aGF0CitDUUwgc3VwcG9ydC4gVGVybXMgYXJlIGRlZmluZWQgYnk6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL3Rlcm0uYm5mW10KKy0tLS0KKworQSB0ZXJtIGlzIHRodXMgb25lIG9mOgorCisqIEEgeHJlZjpjcWwvZGVmaW50aW9ucy5hZG9jI2NvbnN0YW50c1tjb25zdGFudF0KKyogQSBsaXRlcmFsIGZvciBlaXRoZXIgYSB4cmVmOmNxbC90eXBlcy5hZG9jI2NvbGxlY3Rpb25zW2NvbGxlY3Rpb25dLAorYSB4cmVmOmNxbC90eXBlcy5hZG9jI3VkdHNbdXNlci1kZWZpbmVkIHR5cGVdIG9yIGEgeHJlZjpjcWwvdHlwZXMuYWRvYyN0dXBsZXNbdHVwbGVdCisqIEEgeHJlZjpjcWwvZnVuY3Rpb25zLmFkb2MjY3FsLWZ1bmN0aW9uc1tmdW5jdGlvbl0gY2FsbCwgZWl0aGVyIGEgeHJlZjpjcWwvZnVuY3Rpb25zLmFkb2Mjc2NhbGFyLW5hdGl2ZS1mdW5jdGlvbnNbbmF0aXZlIGZ1bmN0aW9uXQorb3IgYSB4cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyN1c2VyLWRlZmluZWQtc2NhbGFyLWZ1bmN0aW9uc1t1c2VyLWRlZmluZWQgZnVuY3Rpb25dCisqIEFuIHhyZWY6Y3FsL29wZXJhdG9ycy5hZG9jI2FyaXRobWV0aWNfb3BlcmF0b3JzW2FyaXRobWV0aWMgb3BlcmF0aW9uXSBiZXR3ZWVuIHRlcm1zCisqIEEgdHlwZSBoaW50CisqIEEgYmluZCBtYXJrZXIsIHdoaWNoIGRlbm90ZXMgYSB2YXJpYWJsZSB0byBiZSBib3VuZCBhdCBleGVjdXRpb24gdGltZS4KK1NlZSB0aGUgc2VjdGlvbiBvbiBgcHJlcGFyZWQtc3RhdGVtZW50c2AgZm9yIGRldGFpbHMuIEEgYmluZCBtYXJrZXIgY2FuCitiZSBlaXRoZXIgYW5vbnltb3VzIChgP2ApIG9yIG5hbWVkIChgOnNvbWVfbmFtZWApLiBUaGUgbGF0dGVyIGZvcm0KK3Byb3ZpZGVzIGEgbW9yZSBjb252ZW5pZW50IHdheSB0byByZWZlciB0byB0aGUgdmFyaWFibGUgZm9yIGJpbmRpbmcgaXQKK2FuZCBzaG91bGQgZ2VuZXJhbGx5IGJlIHByZWZlcnJlZC4KKworPT0gQ29tbWVudHMKKworQSBjb21tZW50IGluIENRTCBpcyBhIGxpbmUgYmVnaW5uaW5nIGJ5IGVpdGhlciBkb3VibGUgZGFzaGVzIChgLS1gKSBvcgorZG91YmxlIHNsYXNoIChgLy9gKS4KKworTXVsdGktbGluZSBjb21tZW50cyBhcmUgYWxzbyBzdXBwb3J0ZWQgdGhyb3VnaCBlbmNsb3N1cmUgd2l0aGluIGAvKmAgYW5kCitgKi9gIChidXQgbmVzdGluZyBpcyBub3Qgc3VwcG9ydGVkKS4KKworW3NvdXJjZSxjcWxdCistLS0tCistLSBUaGlzIGlzIGEgY29tbWVudAorLy8gVGhpcyBpcyBhIGNvbW1lbnQgdG9vCisvKiBUaGlzIGlzCisgICBhIG11bHRpLWxpbmUgY29tbWVudCAqLworLS0tLQorCis9PSBTdGF0ZW1lbnRzCisKK0NRTCBjb25zaXN0cyBvZiBzdGF0ZW1lbnRzIHRoYXQgY2FuIGJlIGRpdmlkZWQgaW4gdGhlIGZvbGxvd2luZworY2F0ZWdvcmllczoKKworKiBgZGF0YS1kZWZpbml0aW9uYCBzdGF0ZW1lbnRzLCB0byBkZWZpbmUgYW5kIGNoYW5nZSBob3cgdGhlIGRhdGEgaXMKK3N0b3JlZCAoa2V5c3BhY2VzIGFuZCB0YWJsZXMpLgorKiBgZGF0YS1tYW5pcHVsYXRpb25gIHN0YXRlbWVudHMsIGZvciBzZWxlY3RpbmcsIGluc2VydGluZyBhbmQgZGVsZXRpbmcKK2RhdGEuCisqIGBzZWNvbmRhcnktaW5kZXhlc2Agc3RhdGVtZW50cy4KKyogYG1hdGVyaWFsaXplZC12aWV3c2Agc3RhdGVtZW50cy4KKyogYGNxbC1yb2xlc2Agc3RhdGVtZW50cy4KKyogYGNxbC1wZXJtaXNzaW9uc2Agc3RhdGVtZW50cy4KKyogYFVzZXItRGVmaW5lZCBGdW5jdGlvbnMgKFVERnMpYCBzdGF0ZW1lbnRzLgorKiBgdWR0c2Agc3RhdGVtZW50cy4KKyogYGNxbC10cmlnZ2Vyc2Agc3RhdGVtZW50cy4KKworQWxsIHRoZSBzdGF0ZW1lbnRzIGFyZSBsaXN0ZWQgYmVsb3cgYW5kIGFyZSBkZXNjcmliZWQgaW4gdGhlIHJlc3Qgb2YKK3RoaXMgZG9jdW1lbnRhdGlvbiAoc2VlIGxpbmtzIGFib3ZlKToKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvY3FsX3N0YXRlbWVudC5ibmZbXQorLS0tLQorCis9PSBQcmVwYXJlZCBTdGF0ZW1lbnRzCisKK0NRTCBzdXBwb3J0cyBfcHJlcGFyZWQgc3RhdGVtZW50c18uIFByZXBhcmVkIHN0YXRlbWVudHMgYXJlIGFuCitvcHRpbWl6YXRpb24gdGhhdCBhbGxvd3MgdG8gcGFyc2UgYSBxdWVyeSBvbmx5IG9uY2UgYnV0IGV4ZWN1dGUgaXQKK211bHRpcGxlIHRpbWVzIHdpdGggZGlmZmVyZW50IGNvbmNyZXRlIHZhbHVlcy4KKworQW55IHN0YXRlbWVudCB0aGF0IHVzZXMgYXQgbGVhc3Qgb25lIGJpbmQgbWFya2VyIChzZWUgYGJpbmRfbWFya2VyYCkKK3dpbGwgbmVlZCB0byBiZSBfcHJlcGFyZWRfLiBBZnRlciB3aGljaCB0aGUgc3RhdGVtZW50IGNhbiBiZSBfZXhlY3V0ZWRfCitieSBwcm92aWRlZCBjb25jcmV0ZSB2YWx1ZXMgZm9yIGVhY2ggb2YgaXRzIG1hcmtlci4gVGhlIGV4YWN0IGRldGFpbHMgb2YKK2hvdyBhIHN0YXRlbWVudCBpcyBwcmVwYXJlZCBhbmQgdGhlbiBleGVjdXRlZCBkZXBlbmRzIG9uIHRoZSBDUUwgZHJpdmVyCit1c2VkIGFuZCB5b3Ugc2hvdWxkIHJlZmVyIHRvIHlvdXIgZHJpdmVyIGRvY3VtZW50YXRpb24uCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvZG1sLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvZG1sLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiOTM3NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9kbWwuYWRvYwpAQCAtMCwwICsxLDQ2NSBAQAorPSBEYXRhIE1hbmlwdWxhdGlvbgorCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBzdGF0ZW1lbnRzIHN1cHBvcnRlZCBieSBDUUwgdG8gaW5zZXJ0LAordXBkYXRlLCBkZWxldGUgYW5kIHF1ZXJ5IGRhdGEuCisKK1tbc2VsZWN0LXN0YXRlbWVudF1dCis9PSBTRUxFQ1QKKworUXVlcnlpbmcgZGF0YSBmcm9tIGRhdGEgaXMgZG9uZSB1c2luZyBhIGBTRUxFQ1RgIHN0YXRlbWVudDoKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9zZWxlY3Rfc3RhdGVtZW50LmJuZltdCistLS0tCisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3NlbGVjdF9zdGF0ZW1lbnQuY3FsW10KKy0tLS0KKworVGhlIGBTRUxFQ1RgIHN0YXRlbWVudHMgcmVhZHMgb25lIG9yIG1vcmUgY29sdW1ucyBmb3Igb25lIG9yIG1vcmUgcm93cworaW4gYSB0YWJsZS4gSXQgcmV0dXJucyBhIHJlc3VsdC1zZXQgb2YgdGhlIHJvd3MgbWF0Y2hpbmcgdGhlIHJlcXVlc3QsCit3aGVyZSBlYWNoIHJvdyBjb250YWlucyB0aGUgdmFsdWVzIGZvciB0aGUgc2VsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8KK3RoZSBxdWVyeS4gQWRkaXRpb25hbGx5LCB4cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyNjcWwtZnVuY3Rpb25zW2Z1bmN0aW9uc10gaW5jbHVkaW5nCit4cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyNhZ2dyZWdhdGUtZnVuY3Rpb25zW2FnZ3JlZ2F0aW9uc10gY2FuIGJlIGFwcGxpZWQgdG8gdGhlIHJlc3VsdC4KKworQSBgU0VMRUNUYCBzdGF0ZW1lbnQgY29udGFpbnMgYXQgbGVhc3QgYSB4cmVmOmNxbC9kbWwuYWRvYyNzZWxlY3Rpb24tY2xhdXNlW3NlbGVjdGlvbiBjbGF1c2VdIGFuZCB0aGUgbmFtZSBvZiB0aGUgdGFibGUgb24gd2hpY2gKK3RoZSBzZWxlY3Rpb24gaXMgZXhlY3V0ZWQuIAorQ1FMIGRvZXMgKm5vdCogZXhlY3V0ZSBqb2lucyBvciBzdWItcXVlcmllcyBhbmQgYSBzZWxlY3Qgc3RhdGVtZW50IG9ubHkgYXBwbHkgdG8gYSBzaW5nbGUgdGFibGUuIAorQSBzZWxlY3Qgc3RhdGVtZW50IGNhbiBhbHNvIGhhdmUgYSB4cmVmOmNxbC9kbWwuYWRvYyN3aGVyZS1jbGF1c2Vbd2hlcmUgY2xhdXNlXSB0aGF0IGNhbiBmdXJ0aGVyIG5hcnJvdyB0aGUgcXVlcnkgcmVzdWx0cy4KK0FkZGl0aW9uYWwgY2xhdXNlcyBjYW4geHJlZjpjcWwvZG1sLmFkb2Mjb3JkZXJpbmctY2xhdXNlW29yZGVyXSBvciB4cmVmOmNxbC9kbWwuYWRvYyNsaW1pdC1jbGF1c2VbbGltaXRdIHRoZSByZXN1bHRzLiAKK0xhc3RseSwgeHJlZjpjcWwvZG1sLmFkb2MjYWxsb3ctZmlsdGVyaW5nW3F1ZXJpZXMgdGhhdCByZXF1aXJlIGZ1bGwgY2x1c3RlciBmaWx0ZXJpbmddIGNhbiBhcHBlbmQgYEFMTE9XIEZJTFRFUklOR2AgdG8gYW55IHF1ZXJ5LgorRm9yIHZpcnR1YWwgdGFibGVzLCBmcm9tIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE4MjM4W0NBU1NBTkRSQS0xODIzOF0sIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gc3BlY2lmeSBgQUxMT1cgRklMVEVSSU5HYCB3aGVuIGEgcXVlcnkgd291bGQgbm9ybWFsbHkgcmVxdWlyZSB0aGF0LiBQbGVhc2UgY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdmlydHVhbCB0YWJsZXMgdG8ga25vdyBtb3JlLgorCitbW3NlbGVjdGlvbi1jbGF1c2VdXQorPT09IFNlbGVjdGlvbiBjbGF1c2UKKworVGhlIGBzZWxlY3RfY2xhdXNlYCBkZXRlcm1pbmVzIHdoaWNoIGNvbHVtbnMgd2lsbCBiZSBxdWVyaWVkIGFuZCByZXR1cm5lZCBpbiB0aGUgcmVzdWx0IHNldC4gCitUaGlzIGNsYXVzZSBjYW4gYWxzbyBhcHBseSB0cmFuc2Zvcm1hdGlvbnMgdG8gYXBwbHkgdG8gdGhlIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiAKK1RoZSBzZWxlY3Rpb24gY2xhdXNlIGNvbnNpc3RzIG9mIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygc3BlY2lmaWMgX3NlbGVjdG9yc18gb3IsIGFsdGVybmF0aXZlbHksIHRoZSB3aWxkY2FyZCBjaGFyYWN0ZXIgKGAqYCkgdG8gc2VsZWN0IGFsbCB0aGUgY29sdW1ucyBkZWZpbmVkIGluIHRoZSB0YWJsZS4KKworPT09PSBTZWxlY3RvcnMKKworQSBgc2VsZWN0b3JgIGNhbiBiZSBvbmUgb2Y6CisKKyogQSBjb2x1bW4gbmFtZSBvZiB0aGUgdGFibGUgc2VsZWN0ZWQsIHRvIHJldHJpZXZlIHRoZSB2YWx1ZXMgZm9yIHRoYXQKK2NvbHVtbi4KKyogQSB0ZXJtLCB3aGljaCBpcyB1c3VhbGx5IHVzZWQgbmVzdGVkIGluc2lkZSBvdGhlciBzZWxlY3RvcnMgbGlrZQorZnVuY3Rpb25zIChpZiBhIHRlcm0gaXMgc2VsZWN0ZWQgZGlyZWN0bHksIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgY29sdW1uCitvZiB0aGUgcmVzdWx0LXNldCB3aWxsIHNpbXBseSBoYXZlIHRoZSB2YWx1ZSBvZiB0aGlzIHRlcm0gZm9yIGV2ZXJ5IHJvdworcmV0dXJuZWQpLgorKiBBIGNhc3RpbmcsIHdoaWNoIGFsbG93cyB0byBjb252ZXJ0IGEgbmVzdGVkIHNlbGVjdG9yIHRvIGEgKGNvbXBhdGlibGUpCit0eXBlLgorKiBBIGZ1bmN0aW9uIGNhbGwsIHdoZXJlIHRoZSBhcmd1bWVudHMgYXJlIHNlbGVjdG9yIHRoZW1zZWx2ZXMuIFNlZSB0aGUKK3NlY3Rpb24gb24geHJlZjpjcWwvZnVuY3Rpb25zLmFkb2MjY3FsLWZ1bmN0aW9uc1tmdW5jdGlvbnNdIGZvciBtb3JlIGRldGFpbHMuCisqIFRoZSBzcGVjaWFsIGNhbGwgYENPVU5UKCopYCB0byB0aGUgeHJlZjpjcWwvZnVuY3Rpb25zLmFkb2MjY291bnQtZnVuY3Rpb25bQ09VTlQgZnVuY3Rpb25dLAord2hpY2ggY291bnRzIGFsbCBub24tbnVsbCByZXN1bHRzLgorCis9PT09IEFsaWFzZXMKKworRXZlcnkgX3RvcC1sZXZlbF8gc2VsZWN0b3IgY2FuIGFsc28gYmUgYWxpYXNlZCAodXNpbmcgQVMpLgorSWYgc28sIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIGNvbHVtbiBpbiB0aGUgcmVzdWx0IHNldCB3aWxsIGJlCit0aGF0IG9mIHRoZSBhbGlhcy4gRm9yIGluc3RhbmNlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2FzLmNxbFtdCistLS0tCisKK1tOT1RFXQorPT09PQorQ3VycmVudGx5LCBhbGlhc2VzIGFyZW4ndCByZWNvZ25pemVkIGluIHRoZSBgV0hFUkVgIG9yIGBPUkRFUiBCWWAgY2xhdXNlcyBpbiB0aGUgc3RhdGVtZW50LgorWW91IG11c3QgdXNlIHRoZSBvcmlnbmFsIGNvbHVtbiBuYW1lIGluc3RlYWQuCis9PT09CisKK1tbd3JpdGV0aW1lLWFuZC10dGwtZnVuY3Rpb25dXQorPT09PSBgV1JJVEVUSU1FYCwgYE1BWFdSSVRFVElNRWAgYW5kIGBUVExgIGZ1bmN0aW9uCisKK1NlbGVjdGlvbiBzdXBwb3J0cyB0aHJlZSBzcGVjaWFsIGZ1bmN0aW9ucyB0aGF0IGFyZW4ndCBhbGxvd2VkIGFueXdoZXJlCitlbHNlOiBgV1JJVEVUSU1FYCwgYE1BWFdSSVRFVElNRWAgYW5kIGBUVExgLgorQWxsIGZ1bmN0aW9ucyB0YWtlIG9ubHkgb25lIGFyZ3VtZW50LCBhIGNvbHVtbiBuYW1lLiBJZiB0aGUgY29sdW1uIGlzIGEgY29sbGVjdGlvbiBvciBVRFQsIGl0J3MgcG9zc2libGUgdG8gYWRkIGVsZW1lbnQKK3NlbGVjdG9ycywgc3VjaCBhcyBgV1JJVEVUVElNRShwaG9uZXNbMi4uNF0pYCBvciBgV1JJVEVUVElNRSh1c2VyLm5hbWUpYC4KK1RoZXNlIGZ1bmN0aW9ucyByZXRyaWV2ZSBtZXRhLWluZm9ybWF0aW9uIHRoYXQgaXMgc3RvcmVkIGludGVybmFsbHkgZm9yIGVhY2ggY29sdW1uOgorCisqIGBXUklURVRJTUVgIHN0b3JlcyB0aGUgdGltZXN0YW1wIG9mIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLgorKiBgTUFYV1JJVEVUSU1FYCBzdG9yZXMgdGhlIGxhcmdlc3QgdGltZXN0YW1wIG9mIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uLiBGb3Igbm9uLWNvbGxlY3Rpb24gYW5kIG5vbi1VRFQgY29sdW1ucywgYE1BWFdSSVRFVElNRWAKK2lzIGVxdWl2YWxlbnQgdG8gYFdSSVRFVElNRWAuIEluIHRoZSBvdGhlciBjYXNlcywgaXQgcmV0dXJucyB0aGUgbGFyZ2VzdCB0aW1lc3RhbXAgb2YgdGhlIHZhbHVlcyBpbiB0aGUgY29sdW1uLgorKiBgVFRMYCBzdG9yZXMgdGhlIHJlbWFpbmluZyB0aW1lIHRvIGxpdmUgKGluIHNlY29uZHMpIGZvciB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtbiBpZiBpdCBpcyBzZXQgdG8gZXhwaXJlOyBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIGBudWxsYC4KKworVGhlIGBXUklURVRJTUVgIGFuZCBgVFRMYCBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgb24gbXVsdGktY2VsbCBjb2x1bW5zIHN1Y2ggYXMgbm9uLWZyb3plbiBjb2xsZWN0aW9ucyBvciBub24tZnJvemVuCit1c2VyLWRlZmluZWQgdHlwZXMuIEluIHRoYXQgY2FzZSwgdGhlIGZ1bmN0aW9ucyB3aWxsIHJldHVybiB0aGUgbGlzdCBvZiB0aW1lc3RhbXBzIG9yIFRUTHMgZm9yIGVhY2ggc2VsZWN0ZWQgY2VsbC4KKworW1t3aGVyZS1jbGF1c2VdXQorPT09IFRoZSBgV0hFUkVgIGNsYXVzZQorCitUaGUgYFdIRVJFYCBjbGF1c2Ugc3BlY2lmaWVzIHdoaWNoIHJvd3MgYXJlIHF1ZXJpZWQuIEl0IHNwZWNpZmllcworYSByZWxhdGlvbnNoaXAgZm9yIGBQUklNQVJZIEtFWWAgY29sdW1ucyBvciBhIGNvbHVtbiB0aGF0IGhhcworYSB4cmVmOmNxbC9pbmRleGVzLmFkb2MjY3JlYXRlLWluZGV4LXN0YXRlbWVudFtzZWNvbmRhcnkgaW5kZXhdIGRlZmluZWQsIGFsb25nIHdpdGggYSBzZXQgdmFsdWUuCisKK05vdCBhbGwgcmVsYXRpb25zaGlwcyBhcmUgYWxsb3dlZCBpbiBhIHF1ZXJ5LiBGb3IgaW5zdGFuY2UsIG9ubHkgYW4gZXF1YWxpdHkKK2lzIGFsbG93ZWQgb24gYSBwYXJ0aXRpb24ga2V5LiBUaGUgYElOYCBjbGF1c2UgaXMgY29uc2lkZXJlZCBhbiBlcXVhbGl0eSBmb3Igb25lIG9yIG1vcmUgdmFsdWVzLgorVGhlIGBUT0tFTmAgY2xhdXNlIGNhbiBiZSB1c2VkIHRvIHF1ZXJ5IGZvciBwYXJ0aXRpb24ga2V5IG5vbi1lcXVhbGl0aWVzLgorQSBwYXJ0aXRpb24ga2V5IG11c3QgYmUgc3BlY2lmaWVkIGJlZm9yZSBjbHVzdGVyaW5nIGNvbHVtbnMgaW4gdGhlIGBXSEVSRWAgY2xhdXNlLiBUaGUgcmVsYXRpb25zaGlwIAorZm9yIGNsdXN0ZXJpbmcgY29sdW1ucyBtdXN0IHNwZWNpZnkgYSAqY29udGlndW91cyogc2V0IG9mIHJvd3MgdG8gb3JkZXIuCisKK0ZvciBpbnN0YW5jZSwgZ2l2ZW46CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvdGFibGVfZm9yX3doZXJlLmNxbFtdCistLS0tCisKK1RoZSBmb2xsb3dpbmcgcXVlcnkgaXMgYWxsb3dlZDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC93aGVyZS5jcWxbXQorLS0tLQorCitCdXQgdGhlIGZvbGxvd2luZyBvbmUgaXMgbm90LCBhcyBpdCBkb2VzIG5vdCBzZWxlY3QgYSBjb250aWd1b3VzIHNldCBvZgorcm93cyAoYW5kIHdlIHN1cHBvc2Ugbm8gc2Vjb25kYXJ5IGluZGV4ZXMgYXJlIHNldCk6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvd2hlcmVfZmFpbC5jcWxbXQorLS0tLQorCitXaGVuIHNwZWNpZnlpbmcgcmVsYXRpb25zaGlwcywgdGhlIGBUT0tFTmAgZnVuY3Rpb24gY2FuIGJlIGFwcGxpZWQgdG8gdGhlIGBQQVJUSVRJT04gS0VZYCBjb2x1bW4gdG8gcXVlcnkuIAorUm93cyB3aWxsIGJlIHNlbGVjdGVkIGJhc2VkIG9uIHRoZSB0b2tlbiBvZiB0aGUgYFBBUlRJVElPTl9LRVlgIHJhdGhlciB0aGFuIG9uIHRoZSB2YWx1ZS4KK1tJTVBPUlRBTlRdCis9PT09CitUaGUgdG9rZW4gb2YgYSBrZXkgZGVwZW5kcyBvbiB0aGUgcGFydGl0aW9uZXIgaW4gdXNlLCBhbmQgdGhhdAoraW4gcGFydGljdWxhciB0aGUgYFJhbmRvbVBhcnRpdGlvbmVyYCB3b24ndCB5aWVsZCBhIG1lYW5pbmdmdWwgb3JkZXIuIAorQWxzbyBub3RlIHRoYXQgb3JkZXJpbmcgcGFydGl0aW9uZXJzIGFsd2F5cyBvcmRlciB0b2tlbiB2YWx1ZXMgYnkgYnl0ZXMgKHNvCitldmVuIGlmIHRoZSBwYXJ0aXRpb24ga2V5IGlzIG9mIHR5cGUgaW50LCBgdG9rZW4oLTEpID4gdG9rZW4oMClgIGluCitwYXJ0aWN1bGFyKS4gCis9PT09CisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3Rva2VuLmNxbFtdCistLS0tCisKK1RoZSBgSU5gIHJlbGF0aW9uc2hpcCBpcyBvbmx5IGFsbG93ZWQgb24gdGhlIGxhc3QgY29sdW1uIG9mIHRoZQorcGFydGl0aW9uIGtleSBvciBvbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlIGZ1bGwgcHJpbWFyeSBrZXkuCisKK0l0IGlzIGFsc28gcG9zc2libGUgdG8g4oCcZ3JvdXDigJ0gYENMVVNURVJJTkcgQ09MVU1OU2AgdG9nZXRoZXIgaW4gYQorcmVsYXRpb24gdXNpbmcgdGhlIHR1cGxlIG5vdGF0aW9uLiAKKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvd2hlcmVfZ3JvdXBfY2x1c3Rlcl9jb2x1bW5zLmNxbFtdCistLS0tCisKK1RoaXMgcXVlcnkgd2lsbCByZXR1cm4gYWxsIHJvd3MgdGhhdCBzb3J0IGFmdGVyIHRoZSBvbmUgaGF2aW5nIOKAnEpvaG4ncyBCbG9n4oCdIGFzCitgYmxvZ190aWxlYCBhbmQgJzIwMTItMDEtMDEnIGZvciBgcG9zdGVkX2F0YCBpbiB0aGUgY2x1c3RlcmluZyBvcmRlci4gSW4KK3BhcnRpY3VsYXIsIHJvd3MgaGF2aW5nIGEgYHBvc3RfYXQgPD0gJzIwMTItMDEtMDEnYCB3aWxsIGJlIHJldHVybmVkLCBhcworbG9uZyBhcyB0aGVpciBgYmxvZ190aXRsZSA+ICdKb2huJydzIEJsb2cnYC4gCisKK1RoYXQgd291bGQgbm90IGJlIHRoZSBjYXNlIGZvciB0aGlzIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvd2hlcmVfbm9fZ3JvdXBfY2x1c3Rlcl9jb2x1bW5zLmNxbFtdCistLS0tCisKK1RoZSB0dXBsZSBub3RhdGlvbiBtYXkgYWxzbyBiZSB1c2VkIGZvciBgSU5gIGNsYXVzZXMgb24gY2x1c3RlcmluZyBjb2x1bW5zOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3doZXJlX2luX3R1cGxlLmNxbFtdCistLS0tCisKK1RoZSBgQ09OVEFJTlNgIG9wZXJhdG9yIG1heSBvbmx5IGJlIHVzZWQgZm9yIGNvbGxlY3Rpb24gY29sdW1ucyAobGlzdHMsCitzZXRzLCBhbmQgbWFwcykuIEluIHRoZSBjYXNlIG9mIG1hcHMsIGBDT05UQUlOU2AgYXBwbGllcyB0byB0aGUgbWFwCit2YWx1ZXMuIFRoZSBgQ09OVEFJTlMgS0VZYCBvcGVyYXRvciBtYXkgb25seSBiZSB1c2VkIG9uIG1hcCBjb2x1bW5zIGFuZAorYXBwbGllcyB0byB0aGUgbWFwIGtleXMuCisKK1tbZ3JvdXAtYnktY2xhdXNlXV0KKz09PSBHcm91cGluZyByZXN1bHRzCisKK1RoZSBgR1JPVVAgQllgIG9wdGlvbiBjYW4gY29uZGVuc2UgYWxsIHNlbGVjdGVkCityb3dzIHRoYXQgc2hhcmUgdGhlIHNhbWUgdmFsdWVzIGZvciBhIHNldCBvZiBjb2x1bW5zIGludG8gYSBzaW5nbGUgcm93LgorCitVc2luZyB0aGUgYEdST1VQIEJZYCBvcHRpb24sIHJvd3MgY2FuIGJlIGdyb3VwZWQgYXQgdGhlIHBhcnRpdGlvbiBrZXkgb3IgY2x1c3RlcmluZyBjb2x1bW4gbGV2ZWwuIAorQ29uc2VxdWVudGx5LCB0aGUgYEdST1VQIEJZYCBvcHRpb24gb25seSBhY2NlcHRzIHByaW1hcnkga2V5IGNvbHVtbnMgaW4gZGVmaW5lZCBvcmRlciBhcyBhcmd1bWVudHMuCitJZiBhIHByaW1hcnkga2V5IGNvbHVtbiBpcyByZXN0cmljdGVkIGJ5IGFuIGVxdWFsaXR5IHJlc3RyaWN0aW9uLCBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGBHUk9VUCBCWWAgY2xhdXNlLgorCitBZ2dyZWdhdGUgZnVuY3Rpb25zIHdpbGwgcHJvZHVjZSBhIHNlcGFyYXRlIHZhbHVlIGZvciBlYWNoIGdyb3VwLiAKK0lmIG5vIGBHUk9VUCBCWWAgY2xhdXNlIGlzIHNwZWNpZmllZCwgYWdncmVnYXRlcyBmdW5jdGlvbnMgd2lsbCBwcm9kdWNlIGEgc2luZ2xlIHZhbHVlIGZvciBhbGwgdGhlIHJvd3MuCisKK0lmIGEgY29sdW1uIGlzIHNlbGVjdGVkIHdpdGhvdXQgYW4gYWdncmVnYXRlIGZ1bmN0aW9uLCBpbiBhIHN0YXRlbWVudAord2l0aCBhIGBHUk9VUCBCWWAsIHRoZSBmaXJzdCB2YWx1ZSBlbmNvdW50ZXIgaW4gZWFjaCBncm91cCB3aWxsIGJlCityZXR1cm5lZC4KKworW1tvcmRlcmluZy1jbGF1c2VdXQorPT09IE9yZGVyaW5nIHJlc3VsdHMKKworVGhlIGBPUkRFUiBCWWAgY2xhdXNlIHNlbGVjdHMgdGhlIG9yZGVyIG9mIHRoZSByZXR1cm5lZCByZXN1bHRzLiAKK1RoZSBhcmd1bWVudCBpcyBhIGxpc3Qgb2YgY29sdW1uIG5hbWVzIGFuZCBlYWNoIGNvbHVtbidzIG9yZGVyIAorKGBBU0NgIGZvciBhc2NlbmRhbnQgYW5kIGBERVNDYCBmb3IgZGVzY2VuZGFudCwKK1RoZSBwb3NzaWJsZSBvcmRlcmluZ3MgYXJlIGxpbWl0ZWQgYnkgdGhlIHhyZWY6Y3FsL2RkbC5hZG9jI2NsdXN0ZXJpbmctb3JkZXJbY2x1c3RlcmluZyBvcmRlcl0gZGVmaW5lZCBvbiB0aGUgdGFibGU6CisKKyogaWYgdGhlIHRhYmxlIGhhcyBiZWVuIGRlZmluZWQgd2l0aG91dCBhbnkgc3BlY2lmaWMgYENMVVNURVJJTkcgT1JERVJgLCB0aGVuIHRoZSBvcmRlciBpcyBhcyBkZWZpbmVkIGJ5IHRoZSBjbHVzdGVyaW5nIGNvbHVtbnMKK29yIHRoZSByZXZlcnNlCisqIG90aGVyd2lzZSwgdGhlIG9yZGVyIGlzIGRlZmluZWQgYnkgdGhlIGBDTFVTVEVSSU5HIE9SREVSYCBvcHRpb24gYW5kIHRoZSByZXZlcnNlZCBvbmUuCisKK1tbbGltaXQtY2xhdXNlXV0KKz09PSBMaW1pdGluZyByZXN1bHRzCisKK1RoZSBgTElNSVRgIG9wdGlvbiB0byBhIGBTRUxFQ1RgIHN0YXRlbWVudCBsaW1pdHMgdGhlIG51bWJlciBvZiByb3dzCityZXR1cm5lZCBieSBhIHF1ZXJ5LiBUaGUgYFBFUiBQQVJUSVRJT04gTElNSVRgIG9wdGlvbiBsaW1pdHMgdGhlCitudW1iZXIgb2Ygcm93cyByZXR1cm5lZCBmb3IgYSBnaXZlbiBwYXJ0aXRpb24gYnkgdGhlIHF1ZXJ5LiBCb3RoIHR5cGVzIG9mIGxpbWl0cyBjYW4gdXNlZCBpbiB0aGUgc2FtZSBzdGF0ZW1lbnQuCisKK1tbYWxsb3ctZmlsdGVyaW5nXV0KKz09PSBBbGxvd2luZyBmaWx0ZXJpbmcKKworQnkgZGVmYXVsdCwgQ1FMIG9ubHkgYWxsb3dzIHNlbGVjdCBxdWVyaWVzIHRoYXQgZG9uJ3QgaW52b2x2ZSBhIGZ1bGwgc2NhbiBvZiBhbGwgcGFydGl0aW9ucy4gCitJZiBhbGwgcGFydGl0aW9ucyBhcmUgc2Nhbm5lZCwgdGhlbiByZXR1cm5pbmcgdGhlIHJlc3VsdHMgbWF5IGV4cGVyaWVuY2UgYSBzaWduaWZpY2FudCBsYXRlbmN5IHByb3BvcnRpb25hbCB0byB0aGUgCithbW91bnQgb2YgZGF0YSBpbiB0aGUgdGFibGUuIFRoZSBgQUxMT1cgRklMVEVSSU5HYCBvcHRpb24gZXhwbGljaXRseSBleGVjdXRlcyBhIGZ1bGwgc2Nhbi4gVGh1cywgdGhlIHBlcmZvcm1hbmNlIG9mIAordGhlIHF1ZXJ5IGNhbiBiZSB1bnByZWRpY3RhYmxlLgorCitGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyB0YWJsZSBvZiB1c2VyIHByb2ZpbGVzIHdpdGggYmlydGggeWVhciBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuIAorVGhlIGJpcnRoIHllYXIgaGFzIGEgc2Vjb25kYXJ5IGluZGV4IGRlZmluZWQuCisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvYWxsb3dfZmlsdGVyaW5nLmNxbFtdCistLS0tCisKK1RoZSBmb2xsb3dpbmcgcXVlcmllcyBhcmUgdmFsaWQ6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvcXVlcnlfYWxsb3dfZmlsdGVyaW5nLmNxbFtdCistLS0tCisKK0luIGJvdGggY2FzZXMsIHRoZSBxdWVyeSBwZXJmb3JtYW5jZSBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlIGFtb3VudCBvZiBkYXRhIHJldHVybmVkLiAKK1RoZSBmaXJzdCBxdWVyeSByZXR1cm5zIGFsbCByb3dzLCBiZWNhdXNlIGFsbCB1c2VycyBhcmUgc2VsZWN0ZWQuCitUaGUgc2Vjb25kIHF1ZXJ5IHJldHVybnMgb25seSB0aGUgcm93cyBkZWZpbmVkIGJ5IHRoZSBzZWNvbmRhcnkgaW5kZXgsIGEgcGVyLW5vZGUgaW1wbGVtZW50YXRpb247IHRoZSByZXN1bHRzIHdpbGwKK2RlcGVuZCBvbiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBjbHVzdGVyLCBhbmQgaXMgaW5kaXJlY3RseSBwcm9wb3J0aW9uYWwgdG8gdGhlIGFtb3VudCBvZiBkYXRhIHN0b3JlZC4KK1RoZSBudW1iZXIgb2Ygbm9kZXMgd2lsbCBhbHdheXMgYmUgbXVsdGlwbGUgbnVtYmVyIG9mIG1hZ25pdHVkZSBsb3dlciB0aGFuIHRoZSBudW1iZXIgb2YgdXNlciBwcm9maWxlcyBzdG9yZWQuIAorQm90aCBxdWVyaWVzIG1heSByZXR1cm4gdmVyeSBsYXJnZSByZXN1bHQgc2V0cywgYnV0IHRoZSBhZGRpdGlvbiBvZiBhIGBMSU1JVGAgY2xhdXNlIGNhbiByZWR1Y2VkIHRoZSBsYXRlbmN5LgorCitUaGUgZm9sbG93aW5nIHF1ZXJ5IHdpbGwgYmUgcmVqZWN0ZWQ6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvcXVlcnlfZmFpbF9hbGxvd19maWx0ZXJpbmcuY3FsW10KKy0tLS0KKworQ2Fzc2FuZHJhIGNhbm5vdCBndWFyYW50ZWUgdGhhdCBsYXJnZSBhbW91bnRzIG9mIGRhdGEgd29uJ3QgaGF2ZSB0byBzY2FubmVkIGFtb3VudCBvZiBkYXRhLCBldmVuIGlmIHRoZSByZXN1bHQgaXMgc21hbGwuIAorSWYgeW91IGtub3cgdGhhdCB0aGUgZGF0YXNldCBpcyBzbWFsbCwgYW5kIHRoZSBwZXJmb3JtYW5jZSB3aWxsIGJlIHJlYXNvbmFibGUsIGFkZCBgQUxMT1cgRklMVEVSSU5HYCB0byBhbGxvdyB0aGUgcXVlcnkgdG8gCitleGVjdXRlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3F1ZXJ5X25vZmFpbF9hbGxvd19maWx0ZXJpbmcuY3FsW10KKy0tLS0KKworW1tpbnNlcnQtc3RhdGVtZW50XV0KKz09IElOU0VSVAorCitJbnNlcnRpbmcgZGF0YSBmb3IgYSByb3cgaXMgZG9uZSB1c2luZyBhbiBgSU5TRVJUYCBzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvaW5zZXJ0X3N0YXRlbWVudC5ibmZbXQorLS0tLQorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9pbnNlcnRfc3RhdGVtZW50LmNxbFtdCistLS0tCisKK1RoZSBgSU5TRVJUYCBzdGF0ZW1lbnQgd3JpdGVzIG9uZSBvciBtb3JlIGNvbHVtbnMgZm9yIGEgZ2l2ZW4gcm93IGluIGEKK3RhYmxlLiAKK1NpbmNlIGEgcm93IGlzIGlkZW50aWZpZWQgYnkgaXRzIGBQUklNQVJZIEtFWWAsIGF0IGxlYXN0IG9uZSBjb2x1bW5zIG11c3QgYmUgc3BlY2lmaWVkLiAKK1RoZSBsaXN0IG9mIGNvbHVtbnMgdG8gaW5zZXJ0IG11c3QgYmUgc3VwcGxpZWQgd2l0aCB0aGUgYFZBTFVFU2Agc3ludGF4LiAKK1doZW4gdXNpbmcgdGhlIGBKU09OYCBzeW50YXgsIGBWQUxVRVNgIGFyZSBvcHRpb25hbC4gCitTZWUgdGhlIHNlY3Rpb24gb24geHJlZjpjcWwvZG1sLmFkb2MjY3FsLWpzb25bSlNPTiBzdXBwb3J0XSBmb3IgbW9yZSBkZXRhaWwuCitBbGwgdXBkYXRlcyBmb3IgYW4gYElOU0VSVGAgYXJlIGFwcGxpZWQgYXRvbWljYWxseSBhbmQgaW4gaXNvbGF0aW9uLgorCitVbmxpa2UgaW4gU1FMLCBgSU5TRVJUYCBkb2VzIG5vdCBjaGVjayB0aGUgcHJpb3IgZXhpc3RlbmNlIG9mIHRoZSByb3cgYnkgZGVmYXVsdC4gCitUaGUgcm93IGlzIGNyZWF0ZWQgaWYgbm9uZSBleGlzdGVkIGJlZm9yZSwgYW5kIHVwZGF0ZWQgb3RoZXJ3aXNlLiAKK0Z1cnRoZXJtb3JlLCB0aGVyZSBpcyBubyBtZWFucyBvZiBrbm93aW5nIHdoaWNoIGFjdGlvbiBvY2N1cnJlZC4KKworVGhlIGBJRiBOT1QgRVhJU1RTYCBjb25kaXRpb24gY2FuIHJlc3RyaWN0IHRoZSBpbnNlcnRpb24gaWYgdGhlIHJvdyBkb2VzIG5vdCBleGlzdC4gCitIb3dldmVyLCBub3RlIHRoYXQgdXNpbmcgYElGIE5PVCBFWElTVFNgIHdpbGwgaW5jdXIgYSBub24tbmVnbGlnaWJsZSBwZXJmb3JtYW5jZSBjb3N0LCBiZWNhdXNlIFBheG9zIGlzIHVzZWQsCitzbyB0aGlzIHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseS4KKworUGxlYXNlIHJlZmVyIHRvIHRoZSB4cmVmOmNxbC9kbWwuYWRvYyN1cGRhdGUtcGFyYW1ldGVyc1tVUERBVEVdIHNlY3Rpb24gZm9yIGluZm9ybWF0aW9ucyBvbiB0aGUgYHVwZGF0ZV9wYXJhbWV0ZXJgLgorQWxzbyBub3RlIHRoYXQgYElOU0VSVGAgZG9lcyBub3Qgc3VwcG9ydCBjb3VudGVycywgd2hpbGUgYFVQREFURWAgZG9lcy4KKworW1t1cGRhdGUtc3RhdGVtZW50XV0KKz09IFVQREFURQorCitVcGRhdGluZyBhIHJvdyBpcyBkb25lIHVzaW5nIGFuIGBVUERBVEVgIHN0YXRlbWVudDoKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvdXBkYXRlX3N0YXRlbWVudC5ibmZbXQorLS0tLQorCitGb3IgaW5zdGFuY2U6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvdXBkYXRlX3N0YXRlbWVudC5jcWxbXQorLS0tLQorCitUaGUgYFVQREFURWAgc3RhdGVtZW50IHdyaXRlcyBvbmUgb3IgbW9yZSBjb2x1bW5zIGZvciBhIGdpdmVuIHJvdyBpbiBhCit0YWJsZS4gCitUaGUgYFdIRVJFYCBjbGF1c2UgaXMgdXNlZCB0byBzZWxlY3QgdGhlIHJvdyB0byB1cGRhdGUgYW5kIG11c3QgaW5jbHVkZSBhbGwgY29sdW1ucyBvZiB0aGUgYFBSSU1BUlkgS0VZYC4gCitOb24tcHJpbWFyeSBrZXkgY29sdW1ucyBhcmUgc2V0IHVzaW5nIHRoZSBgU0VUYCBrZXl3b3JkLgorSW4gYW4gYFVQREFURWAgc3RhdGVtZW50LCBhbGwgdXBkYXRlcyB3aXRoaW4gdGhlIHNhbWUgcGFydGl0aW9uIGtleSBhcmUgYXBwbGllZCBhdG9taWNhbGx5IGFuZCBpbiBpc29sYXRpb24uCisKK1VubGlrZSBpbiBTUUwsIGBVUERBVEVgIGRvZXMgbm90IGNoZWNrIHRoZSBwcmlvciBleGlzdGVuY2Ugb2YgdGhlIHJvdyBieSBkZWZhdWx0LgorVGhlIHJvdyBpcyBjcmVhdGVkIGlmIG5vbmUgZXhpc3RlZCBiZWZvcmUsIGFuZCB1cGRhdGVkIG90aGVyd2lzZS4KK0Z1cnRoZXJtb3JlLCB0aGVyZSBpcyBubyBtZWFucyBvZiBrbm93aW5nIHdoaWNoIGFjdGlvbiBvY2N1cnJlZC4KKworVGhlIGBJRmAgY29uZGl0aW9uIGNhbiBiZSB1c2VkIHRvIGNob29zZSB3aGV0aGVyIHRoZSByb3cgaXMgdXBkYXRlZCBvciBub3QgaWYgYSBwYXJ0aWN1bGFyIGNvbmRpdGlvbiBpcyBtZXQuCitIb3dldmVyLCBsaWtlIHRoZSBgSUYgTk9UIEVYSVNUU2AgY29uZGl0aW9uLCBhIG5vbi1uZWdsaWdpYmxlIHBlcmZvcm1hbmNlIGNvc3QgY2FuIGJlIGluY3VycmVkLgorCitSZWdhcmRpbmcgdGhlIGBTRVRgIGFzc2lnbm1lbnQ6CisKKyogYGMgPSBjICsgM2Agd2lsbCBpbmNyZW1lbnQvZGVjcmVtZW50IGNvdW50ZXJzLCB0aGUgb25seSBvcGVyYXRpb24gYWxsb3dlZC4gCitUaGUgY29sdW1uIG5hbWUgYWZ0ZXIgdGhlICc9JyBzaWduICptdXN0KiBiZSB0aGUgc2FtZSB0aGFuIHRoZSBvbmUgYmVmb3JlIHRoZSAnPScgc2lnbi4KK0luY3JlbWVudC9kZWNyZW1lbnQgaXMgb25seSBhbGxvd2VkIG9uIGNvdW50ZXJzLiAKK1NlZSB0aGUgc2VjdGlvbiBvbiB4cmVmOmNxbC9kbWwuYWRvYyNjb3VudGVyc1tjb3VudGVyc10gZm9yIGRldGFpbHMuCisqIGBpZCA9IGlkICsgPHNvbWUtY29sbGVjdGlvbj5gIGFuZCBgaWRbdmFsdWUxXSA9IHZhbHVlMmAgYXJlIGZvciBjb2xsZWN0aW9ucy4gCitTZWUgdGhlIHhyZWY6Y3FsL3R5cGVzLmFkb2MjY29sbGVjdGlvbnNbY29sbGVjdGlvbnNdIGZvciBkZXRhaWxzLiAgCisqIGBpZC5maWVsZCA9IDNgIGlzIGZvciBzZXR0aW5nIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIG9uIGEgbm9uLWZyb3plbiB1c2VyLWRlZmluZWQgdHlwZXMuIAorU2VlIHRoZSB4cmVmOmNxbC90eXBlcy5hZG9jI3VkdHNbVURUc10gZm9yIGRldGFpbHMuCisKKz09PSBVcGRhdGUgcGFyYW1ldGVycworCitgVVBEQVRFYCBhbmQgYElOU0VSVGAgc3RhdGVtZW50cyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworKiBgVFRMYDogc3BlY2lmaWVzIGFuIG9wdGlvbmFsIFRpbWUgVG8gTGl2ZSAoaW4gc2Vjb25kcykgZm9yIHRoZQoraW5zZXJ0ZWQgdmFsdWVzLiBJZiBzZXQsIHRoZSBpbnNlcnRlZCB2YWx1ZXMgYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZAorZnJvbSB0aGUgZGF0YWJhc2UgYWZ0ZXIgdGhlIHNwZWNpZmllZCB0aW1lLiBOb3RlIHRoYXQgdGhlIFRUTCBjb25jZXJucwordGhlIGluc2VydGVkIHZhbHVlcywgbm90IHRoZSBjb2x1bW5zIHRoZW1zZWx2ZXMuIFRoaXMgbWVhbnMgdGhhdCBhbnkKK3N1YnNlcXVlbnQgdXBkYXRlIG9mIHRoZSBjb2x1bW4gd2lsbCBhbHNvIHJlc2V0IHRoZSBUVEwgKHRvIHdoYXRldmVyIFRUTAoraXMgc3BlY2lmaWVkIGluIHRoYXQgdXBkYXRlKS4gQnkgZGVmYXVsdCwgdmFsdWVzIG5ldmVyIGV4cGlyZS4gQSBUVEwgb2YKKzAgaXMgZXF1aXZhbGVudCB0byBubyBUVEwuIElmIHRoZSB0YWJsZSBoYXMgYSBkZWZhdWx0X3RpbWVfdG9fbGl2ZSwgYQorVFRMIG9mIDAgd2lsbCByZW1vdmUgdGhlIFRUTCBmb3IgdGhlIGluc2VydGVkIG9yIHVwZGF0ZWQgdmFsdWVzLiBBIFRUTAorb2YgYG51bGxgIGlzIGVxdWl2YWxlbnQgdG8gaW5zZXJ0aW5nIHdpdGggYSBUVEwgb2YgMC4KKworYFVQREFURWAsIGBJTlNFUlRgLCBgREVMRVRFYCBhbmQgYEJBVENIYCBzdGF0ZW1lbnRzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorCisqIGBUSU1FU1RBTVBgOiBzZXRzIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBvcGVyYXRpb24uIElmIG5vdCBzcGVjaWZpZWQsCit0aGUgY29vcmRpbmF0b3Igd2lsbCB1c2UgdGhlIGN1cnJlbnQgdGltZSAoaW4gbWljcm9zZWNvbmRzKSBhdCB0aGUgc3RhcnQKK29mIHN0YXRlbWVudCBleGVjdXRpb24gYXMgdGhlIHRpbWVzdGFtcC4gVGhpcyBpcyB1c3VhbGx5IGEgc3VpdGFibGUKK2RlZmF1bHQuCisKK1tbZGVsZXRlX3N0YXRlbWVudF1dCis9PSBERUxFVEUKKworRGVsZXRpbmcgcm93cyBvciBwYXJ0cyBvZiByb3dzIHVzZXMgdGhlIGBERUxFVEVgIHN0YXRlbWVudDoKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9kZWxldGVfc3RhdGVtZW50LmJuZltdCistLS0tCisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2RlbGV0ZV9zdGF0ZW1lbnQuY3FsW10KKy0tLS0KKworVGhlIGBERUxFVEVgIHN0YXRlbWVudCBkZWxldGVzIGNvbHVtbnMgYW5kIHJvd3MuIElmIGNvbHVtbiBuYW1lcyBhcmUKK3Byb3ZpZGVkIGRpcmVjdGx5IGFmdGVyIHRoZSBgREVMRVRFYCBrZXl3b3JkLCBvbmx5IHRob3NlIGNvbHVtbnMgYXJlCitkZWxldGVkIGZyb20gdGhlIHJvdyBpbmRpY2F0ZWQgYnkgdGhlIGBXSEVSRWAgY2xhdXNlLiBPdGhlcndpc2UsIHdob2xlCityb3dzIGFyZSByZW1vdmVkLgorCitUaGUgYFdIRVJFYCBjbGF1c2Ugc3BlY2lmaWVzIHdoaWNoIHJvd3MgYXJlIHRvIGJlIGRlbGV0ZWQuIE11bHRpcGxlIHJvd3MKK21heSBiZSBkZWxldGVkIHdpdGggb25lIHN0YXRlbWVudCBieSB1c2luZyBhbiBgSU5gIG9wZXJhdG9yLiBBIHJhbmdlIG9mCityb3dzIG1heSBiZSBkZWxldGVkIHVzaW5nIGFuIGluZXF1YWxpdHkgb3BlcmF0b3IgKHN1Y2ggYXMgYD49YCkuCisKK2BERUxFVEVgIHN1cHBvcnRzIHRoZSBgVElNRVNUQU1QYCBvcHRpb24gd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgaW4KK3hyZWY6Y3FsL2RtbC5hZG9jI3VwZGF0ZS1wYXJhbWV0ZXJzW3VwZGF0ZXNdLgorCitJbiBhIGBERUxFVEVgIHN0YXRlbWVudCwgYWxsIGRlbGV0aW9ucyB3aXRoaW4gdGhlIHNhbWUgcGFydGl0aW9uIGtleSBhcmUKK2FwcGxpZWQgYXRvbWljYWxseSBhbmQgaW4gaXNvbGF0aW9uLgorCitBIGBERUxFVEVgIG9wZXJhdGlvbiBjYW4gYmUgY29uZGl0aW9uYWwgdGhyb3VnaCB0aGUgdXNlIG9mIGFuIGBJRmAKK2NsYXVzZSwgc2ltaWxhciB0byBgVVBEQVRFYCBhbmQgYElOU0VSVGAgc3RhdGVtZW50cy4gSG93ZXZlciwgYXMgd2l0aAorYElOU0VSVGAgYW5kIGBVUERBVEVgIHN0YXRlbWVudHMsIHRoaXMgd2lsbCBpbmN1ciBhIG5vbi1uZWdsaWdpYmxlCitwZXJmb3JtYW5jZSBjb3N0IGJlY2F1c2UgUGF4b3MgaXMgdXNlZCwgYW5kIHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseS4KKworW1tiYXRjaF9zdGF0ZW1lbnRdXQorPT0gQkFUQ0gKKworTXVsdGlwbGUgYElOU0VSVGAsIGBVUERBVEVgIGFuZCBgREVMRVRFYCBjYW4gYmUgZXhlY3V0ZWQgaW4gYSBzaW5nbGUKK3N0YXRlbWVudCBieSBncm91cGluZyB0aGVtIHRocm91Z2ggYSBgQkFUQ0hgIHN0YXRlbWVudDoKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvYmF0Y2hfc3RhdGVtZW50LmJuZltdCistLS0tCisKK0ZvciBpbnN0YW5jZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9iYXRjaF9zdGF0ZW1lbnQuY3FsW10KKy0tLS0KKworVGhlIGBCQVRDSGAgc3RhdGVtZW50IGdyb3VwIG11bHRpcGxlIG1vZGlmaWNhdGlvbiBzdGF0ZW1lbnRzCisoaW5zZXJ0aW9ucy91cGRhdGVzIGFuZCBkZWxldGlvbnMpIGludG8gYSBzaW5nbGUgc3RhdGVtZW50LiBJdCBzZXJ2ZXMKK3NldmVyYWwgcHVycG9zZXM6CisKKyogSXQgc2F2ZXMgbmV0d29yayByb3VuZC10cmlwcyBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIgKGFuZAorc29tZXRpbWVzIGJldHdlZW4gdGhlIHNlcnZlciBjb29yZGluYXRvciBhbmQgdGhlIHJlcGxpY2FzKSB3aGVuIGJhdGNoaW5nCittdWx0aXBsZSB1cGRhdGVzLgorKiBBbGwgdXBkYXRlcyBpbiBhIGBCQVRDSGAgYmVsb25naW5nIHRvIGEgZ2l2ZW4gcGFydGl0aW9uIGtleSBhcmUKK3BlcmZvcm1lZCBpbiBpc29sYXRpb24uCisqIEJ5IGRlZmF1bHQsIGFsbCBvcGVyYXRpb25zIGluIHRoZSBiYXRjaCBhcmUgcGVyZm9ybWVkIGFzIF9sb2dnZWRfLCB0bworZW5zdXJlIGFsbCBtdXRhdGlvbnMgZXZlbnR1YWxseSBjb21wbGV0ZSAob3Igbm9uZSB3aWxsKS4gU2VlIHRoZSBub3Rlcworb24geHJlZjpjcWwvZG1sLmFkb2MjdW5sb2dnZWQtYmF0Y2hlc1tVTkxPR0dFRCBiYXRjaGVzXSBmb3IgbW9yZSBkZXRhaWxzLgorCitOb3RlIHRoYXQ6CisKKyogYEJBVENIYCBzdGF0ZW1lbnRzIG1heSBvbmx5IGNvbnRhaW4gYFVQREFURWAsIGBJTlNFUlRgIGFuZCBgREVMRVRFYAorc3RhdGVtZW50cyAobm90IG90aGVyIGJhdGNoZXMgZm9yIGluc3RhbmNlKS4KKyogQmF0Y2hlcyBhcmUgX25vdF8gYSBmdWxsIGFuYWxvZ3VlIGZvciBTUUwgdHJhbnNhY3Rpb25zLgorKiBJZiBhIHRpbWVzdGFtcCBpcyBub3Qgc3BlY2lmaWVkIGZvciBlYWNoIG9wZXJhdGlvbiwgdGhlbiBhbGwKK29wZXJhdGlvbnMgd2lsbCBiZSBhcHBsaWVkIHdpdGggdGhlIHNhbWUgdGltZXN0YW1wIChlaXRoZXIgb25lIGdlbmVyYXRlZAorYXV0b21hdGljYWxseSwgb3IgdGhlIHRpbWVzdGFtcCBwcm92aWRlZCBhdCB0aGUgYmF0Y2ggbGV2ZWwpLiBEdWUgdG8KK0Nhc3NhbmRyYSdzIGNvbmZsaWN0IHJlc29sdXRpb24gcHJvY2VkdXJlIGluIHRoZSBjYXNlIG9mCitodHRwOi8vd2lraS5hcGFjaGUub3JnL2Nhc3NhbmRyYS9GQVEjY2xvY2t0aWVbdGltZXN0YW1wIHRpZXNdLAorb3BlcmF0aW9ucyBtYXkgYmUgYXBwbGllZCBpbiBhbiBvcmRlciB0aGF0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBvcmRlcgordGhleSBhcmUgbGlzdGVkIGluIHRoZSBgQkFUQ0hgIHN0YXRlbWVudC4gVG8gZm9yY2UgYSBwYXJ0aWN1bGFyCitvcGVyYXRpb24gb3JkZXJpbmcsIHlvdSBtdXN0IHNwZWNpZnkgcGVyLW9wZXJhdGlvbiB0aW1lc3RhbXBzLgorKiBBIExPR0dFRCBiYXRjaCB0byBhIHNpbmdsZSBwYXJ0aXRpb24gd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYW4gVU5MT0dHRUQKK2JhdGNoIGFzIGFuIG9wdGltaXphdGlvbi4KKworW1t1bmxvZ2dlZC1iYXRjaGVzXV0KKz09PSBgVU5MT0dHRURgIGJhdGNoZXMKKworQnkgZGVmYXVsdCwgQ2Fzc2FuZHJhIHVzZXMgYSBiYXRjaCBsb2cgdG8gZW5zdXJlIGFsbCBvcGVyYXRpb25zIGluIGEKK2JhdGNoIGV2ZW50dWFsbHkgY29tcGxldGUgb3Igbm9uZSB3aWxsIChub3RlIGhvd2V2ZXIgdGhhdCBvcGVyYXRpb25zIGFyZQorb25seSBpc29sYXRlZCB3aXRoaW4gYSBzaW5nbGUgcGFydGl0aW9uKS4KKworVGhlcmUgaXMgYSBwZXJmb3JtYW5jZSBwZW5hbHR5IGZvciBiYXRjaCBhdG9taWNpdHkgd2hlbiBhIGJhdGNoIHNwYW5zCittdWx0aXBsZSBwYXJ0aXRpb25zLiBJZiB5b3UgZG8gbm90IHdhbnQgdG8gaW5jdXIgdGhpcyBwZW5hbHR5LCB5b3UgY2FuCit0ZWxsIENhc3NhbmRyYSB0byBza2lwIHRoZSBiYXRjaGxvZyB3aXRoIHRoZSBgVU5MT0dHRURgIG9wdGlvbi4gSWYgdGhlCitgVU5MT0dHRURgIG9wdGlvbiBpcyB1c2VkLCBhIGZhaWxlZCBiYXRjaCBtaWdodCBsZWF2ZSB0aGUgcGF0Y2ggb25seQorcGFydGx5IGFwcGxpZWQuCisKKz09PSBgQ09VTlRFUmAgYmF0Y2hlcworCitVc2UgdGhlIGBDT1VOVEVSYCBvcHRpb24gZm9yIGJhdGNoZWQgY291bnRlciB1cGRhdGVzLiBVbmxpa2Ugb3RoZXIKK3VwZGF0ZXMgaW4gQ2Fzc2FuZHJhLCBjb3VudGVyIHVwZGF0ZXMgYXJlIG5vdCBpZGVtcG90ZW50LgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2Z1bmN0aW9ucy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2Z1bmN0aW9ucy5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NzRiNzIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvZnVuY3Rpb25zLmFkb2MKQEAgLTAsMCArMSw1NzkgQEAKKy8vIE5lZWQgc29tZSBpbnRybyBmb3IgVURGIGFuZCBuYXRpdmUgZnVuY3Rpb25zIGluIGdlbmVyYWwgYW5kIHBvaW50IHRob3NlIHRvIGl0LiAgCisvLyBbW2NxbC1mdW5jdGlvbnNdXVtbbmF0aXZlLWZ1bmN0aW9uc11dIAorCis9PSBGdW5jdGlvbnMKKworQ1FMIHN1cHBvcnRzIDIgbWFpbiBjYXRlZ29yaWVzIG9mIGZ1bmN0aW9uczoKKworKiB4cmVmOmNxbC9mdW5jdGlvbnMuYWRvYyNzY2FsYXItZnVuY3Rpb25zW3NjYWxhciBmdW5jdGlvbnNdIHRoYXQgdGFrZSBhIG51bWJlciBvZiB2YWx1ZXMgYW5kIHByb2R1Y2UgYW4gb3V0cHV0CisqIHhyZWY6Y3FsL2Z1bmN0aW9ucy5hZG9jI2FnZ3JlZ2F0ZS1mdW5jdGlvbnNbYWdncmVnYXRlIGZ1bmN0aW9uc10gdGhhdCBhZ2dyZWdhdGUgbXVsdGlwbGUgcm93cyByZXN1bHRpbmcgZnJvbSBhIGBTRUxFQ1RgIHN0YXRlbWVudAorCitJbiBib3RoIGNhc2VzLCBDUUwgcHJvdmlkZXMgYSBudW1iZXIgb2YgbmF0aXZlICJoYXJkLWNvZGVkIiBmdW5jdGlvbnMgYXMKK3dlbGwgYXMgdGhlIGFiaWxpdHkgdG8gY3JlYXRlIG5ldyB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLgorCitbTk9URV0KKy5Ob3RlCis9PT09CitCeSBkZWZhdWx0LCB0aGUgdXNlIG9mIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBmb3IKK3NlY3VyaXR5IGNvbmNlcm5zIChldmVuIHdoZW4gZW5hYmxlZCwgdGhlIGV4ZWN1dGlvbiBvZiB1c2VyLWRlZmluZWQKK2Z1bmN0aW9ucyBpcyBzYW5kYm94ZWQgYW5kIGEgInJvZ3VlIiBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGFsbG93ZWQgdG8KK2RvIGV2aWwsIGJ1dCBubyBzYW5kYm94IGlzIHBlcmZlY3Qgc28gdXNpbmcgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBpcworb3B0LWluKS4gU2VlIHRoZSBgdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkYCBpbiBgY2Fzc2FuZHJhLnlhbWxgIHRvCitlbmFibGUgdGhlbS4KKz09PT0KKworQSBmdW5jdGlvbiBpcyBpZGVudGlmaWVyIGJ5IGl0cyBuYW1lOgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9mdW5jdGlvbi5ibmZbXQorLS0tLQorCis9PT0gU2NhbGFyIGZ1bmN0aW9ucworCitbW3NjYWxhci1uYXRpdmUtZnVuY3Rpb25zXV0KKz09PT0gTmF0aXZlIGZ1bmN0aW9ucworCis9PT09PSBDYXN0CisKK1RoZSBgY2FzdGAgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY29udmVydHMgb25lIG5hdGl2ZSBkYXRhdHlwZSB0bworYW5vdGhlci4KKworVGhlIGZvbGxvd2luZyB0YWJsZSBkZXNjcmliZXMgdGhlIGNvbnZlcnNpb25zIHN1cHBvcnRlZCBieSB0aGUgYGNhc3RgCitmdW5jdGlvbi4gQ2Fzc2FuZHJhIHdpbGwgc2lsZW50bHkgaWdub3JlIGFueSBjYXN0IGNvbnZlcnRpbmcgYSBkYXRhdHlwZQoraW50byBpdHMgb3duIGRhdGF0eXBlLgorCitbY29scz0iLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8RnJvbSB8VG8KKworfCBgYXNjaWlgIHwgYHRleHRgLCBgdmFyY2hhcmAKKworfCBgYmlnaW50YCB8IGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBmbG9hdGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsIGB2YXJpbnRgLAorYHRleHRgLCBgdmFyY2hhcmAKKworfCBgYm9vbGVhbmAgfCBgdGV4dGAsIGB2YXJjaGFyYAorCit8IGBjb3VudGVyYCB8IGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZG91YmxlYCwgYGRlY2ltYWxgLAorYHZhcmludGAsIGB0ZXh0YCwgYHZhcmNoYXJgCisKK3wgYGRhdGVgIHwgYHRpbWVzdGFtcGAKKworfCBgZGVjaW1hbGAgfCBgdGlueWludGAsIGBzbWFsbGludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGB2YXJpbnRgLAorYHRleHRgLCBgdmFyY2hhcmAKKworfCBgZG91YmxlYCB8IGB0aW55aW50YCwgYHNtYWxsaW50YCwgYGludGAsIGBiaWdpbnRgLCBgZmxvYXRgLCBgZGVjaW1hbGAsIGB2YXJpbnRgLAorYHRleHRgLCBgdmFyY2hhcmAKKworfCBgZmxvYXRgIHwgYHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsIGB2YXJpbnRgLAorYHRleHRgLCBgdmFyY2hhcmAKKworfCBgaW5ldGAgfCBgdGV4dGAsIGB2YXJjaGFyYAorCit8IGBpbnRgIHwgYHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwgYHZhcmludGAsCitgdGV4dGAsIGB2YXJjaGFyYAorCit8IGBzbWFsbGludGAgfCBgdGlueWludGAsIGBpbnRgLCBgYmlnaW50YCwgYGZsb2F0YCwgYGRvdWJsZWAsIGBkZWNpbWFsYCwgYHZhcmludGAsCitgdGV4dGAsIGB2YXJjaGFyYAorCit8IGB0aW1lYCB8IGB0ZXh0YCwgYHZhcmNoYXJgCisKK3wgYHRpbWVzdGFtcGAgfCBgZGF0ZWAsIGB0ZXh0YCwgYHZhcmNoYXJgCisKK3wgYHRpbWV1dWlkYCB8IGB0aW1lc3RhbXBgLCBgZGF0ZWAsIGB0ZXh0YCwgYHZhcmNoYXJgCisKK3wgYHRpbnlpbnRgIHwgYHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsCitgdmFyaW50YCwgYHRleHRgLCBgdmFyY2hhcmAKKworfCBgdXVpZGAgfCBgdGV4dGAsIGB2YXJjaGFyYAorCit8IGB2YXJpbnRgIHwgYHRpbnlpbnRgLCBgc21hbGxpbnRgLCBgaW50YCwgYGJpZ2ludGAsIGBmbG9hdGAsIGBkb3VibGVgLCBgZGVjaW1hbGAsCitgdGV4dGAsIGB2YXJjaGFyYAorfD09PQorCitUaGUgY29udmVyc2lvbnMgcmVseSBzdHJpY3RseSBvbiBKYXZhJ3Mgc2VtYW50aWNzLiBGb3IgZXhhbXBsZSwgdGhlCitkb3VibGUgdmFsdWUgMSB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgdGV4dCB2YWx1ZSAnMS4wJy4gRm9yIGluc3RhbmNlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK1NFTEVDVCBhdmcoY2FzdChjb3VudCBhcyBkb3VibGUpKSBGUk9NIG15VGFibGUKKy0tLS0KKworPT09PT0gVG9rZW4KKworVGhlIGB0b2tlbmAgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIHRva2VuIGZvciBhIGdpdmVuIHBhcnRpdGlvbiBrZXkuIAorVGhlIGV4YWN0IHNpZ25hdHVyZSBvZiB0aGUgdG9rZW4gZnVuY3Rpb24gZGVwZW5kcyBvbiB0aGUgdGFibGUgY29uY2VybmVkIGFuZCB0aGUgcGFydGl0aW9uZXIgdXNlZCBieSB0aGUgY2x1c3Rlci4KKworVGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50cyBvZiB0aGUgYHRva2VuYCBkZXBlbmQgb24gdGhlIHBhcnRpdGlvbiBrZXkgY29sdW1uIHR5cGUuIFRoZSByZXR1cm5lZCB0eXBlIGRlcGVuZHMgb24gdGhlIGRlZmluZWQgcGFydGl0aW9uZXI6CisKK1tjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xQYXJ0aXRpb25lciB8IFJldHVybmVkIHR5cGUKK3wgTXVybXVyM1BhcnRpdGlvbmVyIHwgYGJpZ2ludGAKK3wgUmFuZG9tUGFydGl0aW9uZXIgfCBgdmFyaW50YAorfCBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyIHwgYGJsb2JgCit8PT09CisKK0ZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV90YWJsZV9zaW1wbGUuY3FsW10KKy0tLS0KKworVGhlIHRhYmxlIHVzZXMgdGhlIGRlZmF1bHQgTXVybXVyM1BhcnRpdGlvbmVyLgorVGhlIGB0b2tlbmAgZnVuY3Rpb24gdXNlcyB0aGUgc2luZ2xlIGFyZ3VtZW50IGB0ZXh0YCwgYmVjYXVzZSB0aGUgcGFydGl0aW9uIGtleSBpcyBgdXNlcmlkYCBvZiB0ZXh0IHR5cGUuCitUaGUgcmV0dXJuZWQgdHlwZSB3aWxsIGJlIGBiaWdpbnRgLgorCis9PT09PSBVdWlkCisKK1RoZSBgdXVpZGAgZnVuY3Rpb24gdGFrZXMgbm8gcGFyYW1ldGVycyBhbmQgZ2VuZXJhdGVzIGEgcmFuZG9tIHR5cGUgNAordXVpZCBzdWl0YWJsZSBmb3IgdXNlIGluIGBJTlNFUlRgIG9yIGBVUERBVEVgIHN0YXRlbWVudHMuCisKKz09PT09IFRpbWV1dWlkIGZ1bmN0aW9ucworCis9PT09PT0gYG5vd2AKKworVGhlIGBub3dgIGZ1bmN0aW9uIHRha2VzIG5vIGFyZ3VtZW50cyBhbmQgZ2VuZXJhdGVzLCBvbiB0aGUgY29vcmRpbmF0b3IKK25vZGUsIGEgbmV3IHVuaXF1ZSB0aW1ldXVpZCBhdCB0aGUgdGltZSB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZC4gTm90ZQordGhhdCB0aGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGluc2VydGlvbiBidXQgaXMgbGFyZ2VseSBub24tc2Vuc2ljYWwgaW4KK2BXSEVSRWAgY2xhdXNlcy4gCisKK0ZvciBleGFtcGxlLCBhIHF1ZXJ5IG9mIHRoZSBmb3JtOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3RpbWV1dWlkX25vdy5jcWxbXQorLS0tLQorCit3aWxsIG5vdCByZXR1cm4gYSByZXN1bHQsIGJ5IGRlc2lnbiwgc2luY2UgdGhlIHZhbHVlIHJldHVybmVkIGJ5Citgbm93KClgIGlzIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlLgorCitgY3VycmVudF90aW1ldXVpZGAgaXMgYW4gYWxpYXMgb2YgYG5vd2AuCisKKz09PT09PSBgbWluX3RpbWV1dWlkYCBhbmQgYG1heF90aW1ldXVpZGAKKworVGhlIGBtaW5fdGltZXV1aWRgIGZ1bmN0aW9uIHRha2VzIGEgYHRpbWVzdGFtcGAgdmFsdWUgYHRgLCBlaXRoZXIgYSB0aW1lc3RhbXAgb3IgYSBkYXRlIHN0cmluZy4KK0l0IHJldHVybnMgYSBfZmFrZV8gYHRpbWV1dWlkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBfc21hbGxlc3RfIHBvc3NpYmxlIGB0aW1ldXVpZGAgZm9yIHRpbWVzdGFtcCBgdGAuCitUaGUgYG1heF90aW1ldXVpZGAgd29ya3Mgc2ltaWxhcmx5LCBidXQgcmV0dXJucyB0aGUgX2xhcmdlc3RfIHBvc3NpYmxlIGB0aW1ldXVpZGAuCisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3RpbWV1dWlkX21pbl9tYXguY3FsW10KKy0tLS0KKword2lsbCBzZWxlY3QgYWxsIHJvd3Mgd2hlcmUgdGhlIGB0aW1ldXVpZGAgY29sdW1uIGB0YCBpcyBsYXRlciB0aGFuIGAnMjAxMy0wMS0wMSAwMDowNSswMDAwJ2AgYW5kIGVhcmxpZXIgdGhhbiBgJzIwMTMtMDItMDIgMTA6MDArMDAwMCdgLiAKK1RoZSBjbGF1c2UgYHQgPj0gbWF4VGltZXV1aWQoJzIwMTMtMDEtMDEgMDA6MDUrMDAwMCcpYCB3b3VsZCBzdGlsbCBfbm90XyBzZWxlY3QgYSBgdGltZXV1aWRgIGdlbmVyYXRlZCBleGFjdGx5IGF0ICcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnLCBhbmQgaXMgZXNzZW50aWFsbHkgZXF1aXZhbGVudCB0byBgdCA+IG1heFRpbWV1dWlkKCcyMDEzLTAxLTAxIDAwOjA1KzAwMDAnKWAuCisKK1tOT1RFXQorLk5vdGUKKz09PT0KK1RoZSB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IGBtaW5fdGltZXV1aWRgIGFuZCBgbWF4X3RpbWV1dWlkYCBhcmUgY2FsbGVkIF9mYWtlXyBVVUlEIGJlY2F1c2UgdGhleSBkbyBubyByZXNwZWN0IHRoZSB0aW1lLWJhc2VkIFVVSUQgZ2VuZXJhdGlvbiBwcm9jZXNzCitzcGVjaWZpZWQgYnkgdGhlIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzQxMjIudHh0W0lFVEYgUkZDIDQxMjJdLgorSW4gcGFydGljdWxhciwgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZXNlIHR3byBtZXRob2RzIHdpbGwgbm90IGJlIHVuaXF1ZS4KK1RodXMsIG9ubHkgdXNlIHRoZXNlIG1ldGhvZHMgZm9yICpxdWVyeWluZyosIG5vdCBmb3IgKmluc2VydGlvbiosIHRvIHByZXZlbnQgcG9zc2libGUgZGF0YSBvdmVyd3JpdGluZy4gCis9PT09CisKKz09PT09IERhdGV0aW1lIGZ1bmN0aW9ucworCis9PT09PT0gUmV0cmlldmluZyB0aGUgY3VycmVudCBkYXRlL3RpbWUKKworVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgdGhlIGRhdGUvdGltZSBhdCB0aGUKK3RpbWUgd2hlcmUgdGhlIGZ1bmN0aW9uIGlzIGludm9rZWQ6CisKK1tjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xGdW5jdGlvbiBuYW1lIHxPdXRwdXQgdHlwZQorCit8IGBjdXJyZW50X3RpbWVzdGFtcGAgfCBgdGltZXN0YW1wYAorCit8IGBjdXJyZW50X2RhdGVgIHwgYGRhdGVgCisKK3wgYGN1cnJlbnRfdGltZWAgfCBgdGltZWAKKworfCBgY3VycmVudF90aW1ldXVpZGAgfCBgdGltZVVVSURgCit8PT09CisKK0ZvciBleGFtcGxlIHRoZSBsYXN0IHR3byBkYXlzIG9mIGRhdGEgY2FuIGJlIHJldHJpZXZlZCB1c2luZzoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jdXJyZW50X2RhdGUuY3FsW10KKy0tLS0KKworPT09PT09IFRpbWUgY29udmVyc2lvbiBmdW5jdGlvbnMKKworQSBudW1iZXIgb2YgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0byBjb252ZXJ0IGEgYHRpbWV1dWlkYCwgYSBgdGltZXN0YW1wYCBvciBhIGBkYXRlYCBpbnRvIGFub3RoZXIgYG5hdGl2ZWAgdHlwZS4KKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xGdW5jdGlvbiBuYW1lIHxJbnB1dCB0eXBlIHxEZXNjcmlwdGlvbgorCit8IGB0b19kYXRlYCB8IGB0aW1ldXVpZGAgfCBDb252ZXJ0cyB0aGUgYHRpbWV1dWlkYCBhcmd1bWVudCBpbnRvIGEgYGRhdGVgIHR5cGUKKworfCBgdG9fZGF0ZWAgfCBgdGltZXN0YW1wYCB8IENvbnZlcnRzIHRoZSBgdGltZXN0YW1wYCBhcmd1bWVudCBpbnRvIGEgYGRhdGVgIHR5cGUKKworfCBgdG9fdGltZXN0YW1wYCB8IGB0aW1ldXVpZGAgfCBDb252ZXJ0cyB0aGUgYHRpbWV1dWlkYCBhcmd1bWVudCBpbnRvIGEgYHRpbWVzdGFtcGAgdHlwZQorCit8IGB0b190aW1lc3RhbXBgIHwgYGRhdGVgIHwgQ29udmVydHMgdGhlIGBkYXRlYCBhcmd1bWVudCBpbnRvIGEgYHRpbWVzdGFtcGAgdHlwZQorCit8IGB0b191bml4X3RpbWVzdGFtcGAgfCBgdGltZXV1aWRgIHwgQ29udmVydHMgdGhlIGB0aW1ldXVpZGAgYXJndW1lbnQgaW50byBhIGBiaWdJbnRgIHJhdyB2YWx1ZQorCit8IGB0b191bml4X3RpbWVzdGFtcGAgfCBgdGltZXN0YW1wYCB8IENvbnZlcnRzIHRoZSBgdGltZXN0YW1wYCBhcmd1bWVudCBpbnRvIGEgYGJpZ0ludGAgcmF3IHZhbHVlCisKK3wgYHRvX3VuaXhfdGltZXN0YW1wYCB8IGBkYXRlYCB8IENvbnZlcnRzIHRoZSBgZGF0ZWAgYXJndW1lbnQgaW50byBhIGBiaWdJbnRgIHJhdyB2YWx1ZQorfD09PQorCis9PT09PSBCbG9iIGNvbnZlcnNpb24gZnVuY3Rpb25zCisKK0EgbnVtYmVyIG9mIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgdG8gY29udmVydCB0aGUgbmF0aXZlIHR5cGVzIGludG8KK2JpbmFyeSBkYXRhLCBvciBhIGBibG9iYC4gCitGb3IgZXZlcnkgeHJlZjpjcWwvdHlwZXMuYWRvYyNuYXRpdmUtdHlwZXNbdHlwZV0gc3VwcG9ydGVkIGJ5IENRTCwgdGhlIGZ1bmN0aW9uIGB0eXBlX2FzX2Jsb2JgIHRha2VzIGEgYXJndW1lbnQgb2YgdHlwZSBgdHlwZWAgYW5kIHJldHVybnMgaXQgYXMgYSBgYmxvYmAuCitDb252ZXJzZWx5LCB0aGUgZnVuY3Rpb24gYGJsb2JfYXNfdHlwZWAgdGFrZXMgYSA2NC1iaXQgYGJsb2JgIGFyZ3VtZW50IGFuZCBjb252ZXJ0cyBpdCB0byBhIGBiaWdpbnRgIHZhbHVlLgorRm9yIGV4YW1wbGUsIGBiaWdpbnRfYXNfYmxvYigzKWAgcmV0dXJucyBgMHgwMDAwMDAwMDAwMDAwMDAzYCBhbmQgYGJsb2JfYXNfYmlnaW50KDB4MDAwMDAwMDAwMDAwMDAwMylgIHJldHVybnMgYDNgLgorCis9PT09PSBNYXRoIEZ1bmN0aW9ucworCitDcWwgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBtYXRoIGZ1bmN0aW9uczogYGFic2AsIGBleHBgLCBgbG9nYCwgYGxvZzEwYCwgYW5kIGByb3VuZGAuCitUaGUgcmV0dXJuIHR5cGUgZm9yIHRoZXNlIGZ1bmN0aW9ucyBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIGlucHV0IHR5cGUuCisKK1tjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xGdW5jdGlvbiBuYW1lIHxEZXNjcmlwdGlvbgorCit8YGFic2AgfCBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgaW5wdXQuCisKK3xgZXhwYCB8IFJldHVybnMgdGhlIG51bWJlciBlIHRvIHRoZSBwb3dlciBvZiB0aGUgaW5wdXQuCisKK3xgbG9nYCB8IFJldHVybnMgdGhlIG5hdHVyYWwgbG9nIG9mIHRoZSBpbnB1dC4KKworfGBsb2cxMGAgfCBSZXR1cm5zIHRoZSBsb2cgYmFzZSAxMCBvZiB0aGUgaW5wdXQuCisKK3xgcm91bmRgIHwgUm91bmRzIHRoZSBpbnB1dCB0byB0aGUgbmVhcmVzdCB3aG9sZSBudW1iZXIgdXNpbmcgcm91bmRpbmcgbW9kZSBgSEFMRl9VUGAuCit8PT09CisKKz09PT09IENvbGxlY3Rpb24gZnVuY3Rpb25zCisKK0EgbnVtYmVyIG9mIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgdG8gb3BlcmF0ZSBvbiBjb2xsZWN0aW9uIGNvbHVtbnMuCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8RnVuY3Rpb24gbmFtZSB8SW5wdXQgdHlwZSB8RGVzY3JpcHRpb24KKworfCBgbWFwX2tleXNgIHwgYG1hcGAgfCBHZXRzIHRoZSBrZXlzIG9mIHRoZSBgbWFwYCBhcmd1bWVudCwgcmV0dXJuZWQgYXMgYSBgc2V0YC4KKworfCBgbWFwX3ZhbHVlc2AgfCBgbWFwYCB8IEdldHMgdGhlIHZhbHVlcyBvZiB0aGUgYG1hcGAgYXJndW1lbnQsIHJldHVybmVkIGFzIGEgYGxpc3RgLgorCit8IGBjb2xsZWN0aW9uX2NvdW50YCB8IGBtYXBgLCBgc2V0YCBvciBgbGlzdGAgfCBHZXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24gYXJndW1lbnQuCisKK3wgYGNvbGxlY3Rpb25fbWluYCB8IGBzZXRgIG9yIGBsaXN0YCB8IEdldHMgdGhlIG1pbmltdW0gZWxlbWVudCBpbiB0aGUgY29sbGVjdGlvbiBhcmd1bWVudC4KKworfCBgY29sbGVjdGlvbl9tYXhgIHwgYHNldGAgb3IgYGxpc3RgIHwgR2V0cyB0aGUgbWF4aW11bSBlbGVtZW50IGluIHRoZSBjb2xsZWN0aW9uIGFyZ3VtZW50LgorCit8IGBjb2xsZWN0aW9uX3N1bWAgfCBudW1lcmljIGBzZXRgIG9yIGBsaXN0YCB8IENvbXB1dGVzIHRoZSBzdW0gb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uIGFyZ3VtZW50LiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaW5wdXQgY29sbGVjdGlvbiBlbGVtZW50cywgc28gdGhlcmUgaXMgYSByaXNrIG9mIG92ZXJmbG93aW5nIHRoZSBkYXRhIHR5cGUgaWYgdGhlIHN1bSBvZiB0aGUgdmFsdWVzIGV4Y2VlZHMgdGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgdHlwZSBjYW4gcmVwcmVzZW50LgorCit8IGBjb2xsZWN0aW9uX2F2Z2AgfCBudW1lcmljIGBzZXRgIG9yIGBsaXN0YCB8IENvbXB1dGVzIHRoZSBhdmVyYWdlIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgY29sbGVjdGlvbiBhcmd1bWVudC4gVGhlIGF2ZXJhZ2Ugb2YgYW4gZW1wdHkgY29sbGVjdGlvbiByZXR1cm5zIHplcm8uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBpbnB1dCBjb2xsZWN0aW9uIGVsZW1lbnRzLCB3aGljaCBtaWdodCBpbmNsdWRlIHJvdW5kaW5nIGFuZCB0cnVuY2F0aW9ucy4gRm9yIGV4YW1wbGUgYGNvbGxlY3Rpb25fYXZnKFsxLCAyXSlgIHJldHVybnMgYDFgIGluc3RlYWQgb2YgYDEuNWAuCit8PT09CisKK1tbZGF0YS1tYXNraW5nLWZ1bmN0aW9uc11dCis9PT09PSBEYXRhIG1hc2tpbmcgZnVuY3Rpb25zCisKK0EgbnVtYmVyIG9mIGZ1bmN0aW9ucyBhbGxvdyB0byBvYnNjdXJlIHRoZSByZWFsIGNvbnRlbnRzIG9mIGEgY29sdW1uIGNvbnRhaW5pbmcgc2Vuc2l0aXZlIGRhdGEuCisKK2luY2x1ZGU6OnBhcnRpYWwkbWFza2luZ19mdW5jdGlvbnMuYWRvY1tdCisKK1tbdXNlci1kZWZpbmVkLXNjYWxhci1mdW5jdGlvbnNdXQorPT09PSBVc2VyLWRlZmluZWQgZnVuY3Rpb25zCisKK1VzZXItZGVmaW5lZCBmdW5jdGlvbnMgKFVERnMpIGV4ZWN1dGUgdXNlci1wcm92aWRlZCBjb2RlIGluIENhc3NhbmRyYS4gCitCeSBkZWZhdWx0LCBDYXNzYW5kcmEgc3VwcG9ydHMgZGVmaW5pbmcgZnVuY3Rpb25zIGluIF9KYXZhXy4KKworVURGcyBhcmUgcGFydCBvZiB0aGUgQ2Fzc2FuZHJhIHNjaGVtYSwgYW5kIGFyZSBhdXRvbWF0aWNhbGx5IHByb3BhZ2F0ZWQgdG8gYWxsIG5vZGVzIGluIHRoZSBjbHVzdGVyLiAgCitVREZzIGNhbiBiZSBfb3ZlcmxvYWRlZF8sIHNvIHRoYXQgbXVsdGlwbGUgVURGcyB3aXRoIGRpZmZlcmVudCBhcmd1bWVudCB0eXBlcyBjYW4gaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbiBuYW1lLgorCisKK1tOT1RFXQorLk5vdGUKKz09PT0KK19KYXZhU2NyaXB0XyB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIGhhdmUgYmVlbiBkZXByZWNhdGVkIGluIENhc3NhbmRyYSA0LjEuIEluIHByZXBhcmF0aW9uIGZvciBDYXNzYW5kcmEgNS4wLCB0aGVpciByZW1vdmFsIGlzCithbHJlYWR5IGluIHByb2dyZXNzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiAtIENBU1NBTkRSQS0xNzI4MSwgQ0FTU0FORFJBLTE4MjUyLgorPT09PQorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9mdW5jdGlvbl9vdmVybG9hZC5jcWxbXQorLS0tLQorCitVREZzIGFyZSBzdXNjZXB0aWJsZSB0byBhbGwgb2YgdGhlIG5vcm1hbCBwcm9ibGVtcyB3aXRoIHRoZSBjaG9zZW4gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIAorQWNjb3JkaW5nbHksIGltcGxlbWVudGF0aW9ucyBzaG91bGQgYmUgc2FmZSBhZ2FpbnN0IG51bGwgcG9pbnRlciBleGNlcHRpb25zLCBpbGxlZ2FsIGFyZ3VtZW50cywgb3IgYW55IG90aGVyIHBvdGVudGlhbCBzb3VyY2Ugb2YgZXhjZXB0aW9ucy4gCitBbiBleGNlcHRpb24gZHVyaW5nIGZ1bmN0aW9uIGV4ZWN1dGlvbiB3aWxsIHJlc3VsdCBpbiB0aGUgZW50aXJlIHN0YXRlbWVudCBmYWlsaW5nLgorVmFsaWQgcXVlcmllcyBmb3IgVURGIHVzZSBhcmUgYFNFTEVDVGAsIGBJTlNFUlRgIGFuZCBgVVBEQVRFYCBzdGF0ZW1lbnRzLgorCitfQ29tcGxleF8gdHlwZXMgbGlrZSBjb2xsZWN0aW9ucywgdHVwbGUgdHlwZXMgYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBhcmUgdmFsaWQgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcyBpbiBVREZzLiAKK1R1cGxlIHR5cGVzIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgdXNlIHRoZSBEYXRhU3RheCBKYXZhIERyaXZlciBjb252ZXJzaW9uIGZ1bmN0aW9ucy4KK1BsZWFzZSBzZWUgdGhlIEphdmEgRHJpdmVyIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgb24gaGFuZGxpbmcgdHVwbGUgdHlwZXMgYW5kIHVzZXItZGVmaW5lZCB0eXBlcy4KKworQXJndW1lbnRzIGZvciBmdW5jdGlvbnMgY2FuIGJlIGxpdGVyYWxzIG9yIHRlcm1zLiAKK1ByZXBhcmVkIHN0YXRlbWVudCBwbGFjZWhvbGRlcnMgY2FuIGJlIHVzZWQsIHRvby4KKworTm90ZSB0aGUgdXNlIHRoZSBkb3VibGUgZG9sbGFyLXNpZ24gc3ludGF4IHRvIGVuY2xvc2UgdGhlIFVERiBzb3VyY2UgY29kZS4gCisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2Z1bmN0aW9uX2RvbGxhcnNpZ24uY3FsW10KKy0tLS0KKworVGhlIGltcGxpY2l0bHkgYXZhaWxhYmxlIGB1ZGZDb250ZXh0YCBmaWVsZCAob3IgYmluZGluZyBmb3Igc2NyaXB0IFVERnMpIHByb3ZpZGVzIHRoZSBuZWNlc3NhcnkgZnVuY3Rpb25hbGl0eSB0byBjcmVhdGUgbmV3IFVEVCBhbmQgdHVwbGUgdmFsdWVzOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2Z1bmN0aW9uX3VkZmNvbnRleHQuY3FsW10KKy0tLS0KKworVGhlIGRlZmluaXRpb24gb2YgdGhlIGBVREZDb250ZXh0YCBpbnRlcmZhY2UgY2FuIGJlIGZvdW5kIGluIHRoZSBBcGFjaGUgQ2Fzc2FuZHJhIHNvdXJjZSBjb2RlIGZvciBgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVURGQ29udGV4dGAuCisKK1tzb3VyY2UsamF2YV0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkSkFWQS91ZGZjb250ZXh0LmphdmFbXQorLS0tLQorCitKYXZhIFVERnMgYWxyZWFkeSBoYXZlIHNvbWUgaW1wb3J0cyBmb3IgY29tbW9uIGludGVyZmFjZXMgYW5kIGNsYXNzZXMgZGVmaW5lZC4gVGhlc2UgaW1wb3J0cyBhcmU6CisKK1tzb3VyY2UsamF2YV0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkSkFWQS91ZGZfaW1wb3J0cy5qYXZhW10KKy0tLS0KKworUGxlYXNlIG5vdGUsIHRoYXQgdGhlc2UgY29udmVuaWVuY2UgaW1wb3J0cyBhcmUgbm90IGF2YWlsYWJsZSBmb3Igc2NyaXB0IFVERnMuCisKK1tbY3JlYXRlLWZ1bmN0aW9uLXN0YXRlbWVudF1dCis9PT09IENSRUFURSBGVU5DVElPTiBzdGF0ZW1lbnQKKworQ3JlYXRpbmcgYSBuZXcgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIHVzZXMgdGhlIGBDUkVBVEUgRlVOQ1RJT05gIHN0YXRlbWVudDoKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9jcmVhdGVfZnVuY3Rpb25fc3RhdGVtZW50LmJuZltdCistLS0tCisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV9mdW5jdGlvbi5jcWxbXQorLS0tLQorCitgQ1JFQVRFIEZVTkNUSU9OYCB3aXRoIHRoZSBvcHRpb25hbCBgT1IgUkVQTEFDRWAga2V5d29yZHMgY3JlYXRlcyBlaXRoZXIgYSBmdW5jdGlvbiBvciByZXBsYWNlcyBhbiBleGlzdGluZyBvbmUgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUuIAorQSBgQ1JFQVRFIEZVTkNUSU9OYCB3aXRob3V0IGBPUiBSRVBMQUNFYCBmYWlscyBpZiBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFscmVhZHkgZXhpc3RzLiAgCitJZiB0aGUgb3B0aW9uYWwgYElGIE5PVCBFWElTVFNgIGtleXdvcmRzIGFyZSB1c2VkLCB0aGUgZnVuY3Rpb24gd2lsbCBvbmx5IGJlIGNyZWF0ZWQgb25seSBpZiBhbm90aGVyIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGRvZXMgbm90CitleGlzdC4KK2BPUiBSRVBMQUNFYCBhbmQgYElGIE5PVCBFWElTVFNgIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLgorCitCZWhhdmlvciBmb3IgYG51bGxgIGlucHV0IHZhbHVlcyBtdXN0IGJlIGRlZmluZWQgZm9yIGVhY2ggZnVuY3Rpb246CisKKyogYFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUYCBkZWNsYXJlcyB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gYG51bGxgIGlmIGFueSBvZiB0aGUgaW5wdXQgYXJndW1lbnRzIGlzIGBudWxsYC4KKyogYENBTExFRCBPTiBOVUxMIElOUFVUYCBkZWNsYXJlcyB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGFsd2F5cyBiZSBleGVjdXRlZC4KKworPT09PT0gRnVuY3Rpb24gU2lnbmF0dXJlCisKK1NpZ25hdHVyZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggaW5kaXZpZHVhbCBmdW5jdGlvbnMuIFRoZSBzaWduYXR1cmUgY29uc2lzdHMgb2YgYSBmdWxseS1xdWFsaWZpZWQgZnVuY3Rpb24gbmFtZSBvZiB0aGUgPGtleXNwYWNlPi48ZnVuY3Rpb25fbmFtZT4gYW5kIGEgY29uY2F0ZW5hdGVkIGxpc3Qgb2YgYWxsIHRoZSBhcmd1bWVudCB0eXBlcy4KKworTm90ZSB0aGF0IGtleXNwYWNlIG5hbWVzLCBmdW5jdGlvbiBuYW1lcyBhbmQgYXJndW1lbnQgdHlwZXMgYXJlIHN1YmplY3QgdG8gdGhlIGRlZmF1bHQgbmFtaW5nIGNvbnZlbnRpb25zIGFuZCBjYXNlLXNlbnNpdGl2aXR5IHJ1bGVzLgorCitGdW5jdGlvbnMgYmVsb25nIHRvIGEga2V5c3BhY2U7IGlmIG5vIGtleXNwYWNlIGlzIHNwZWNpZmllZCwgdGhlIGN1cnJlbnQga2V5c3BhY2UgaXMgdXNlZC4gCitVc2VyLWRlZmluZWQgZnVuY3Rpb25zIGFyZSBub3QgYWxsb3dlZCBpbiB0aGUgc3lzdGVtIGtleXNwYWNlcy4KKworW1tkcm9wLWZ1bmN0aW9uLXN0YXRlbWVudF1dCis9PT09IERST1AgRlVOQ1RJT04gc3RhdGVtZW50CisKK0Ryb3BwaW5nIGEgZnVuY3Rpb24gdXNlcyB0aGUgYERST1AgRlVOQ1RJT05gIHN0YXRlbWVudDoKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvZHJvcF9mdW5jdGlvbl9zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvZHJvcF9mdW5jdGlvbi5jcWxbXQorLS0tLQorCitZb3UgbXVzdCBzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcyBvZiB0aGUgZnVuY3Rpb24sIHRoZSBhcmd1bWVudHNfc2lnbmF0dXJlLCBpbiB0aGUgZHJvcCBjb21tYW5kIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyB3aXRoIHRoZSBzYW1lIG5hbWUgYnV0IGRpZmZlcmVudCBzaWduYXR1cmVzLiAgCitgRFJPUCBGVU5DVElPTmAgd2l0aCB0aGUgb3B0aW9uYWwgYElGIEVYSVNUU2Aga2V5d29yZHMgZHJvcHMgYSBmdW5jdGlvbiBpZiBpdCBleGlzdHMsIGJ1dCBkb2VzIG5vdCB0aHJvdyBhbiBlcnJvciBpZiBpdCBkb2Vzbid0LgorCitbW2FnZ3JlZ2F0ZS1mdW5jdGlvbnNdXQorPT09IEFnZ3JlZ2F0ZSBmdW5jdGlvbnMKKworQWdncmVnYXRlIGZ1bmN0aW9ucyB3b3JrIG9uIGEgc2V0IG9mIHJvd3MuIAorVmFsdWVzIGZvciBlYWNoIHJvdyBhcmUgaW5wdXQsIHRvIHJldHVybiBhIHNpbmdsZSB2YWx1ZSBmb3IgdGhlIHNldCBvZiByb3dzIGFnZ3JlZ2F0ZWQuCisKK0lmIGBub3JtYWxgIGNvbHVtbnMsIGBzY2FsYXIgZnVuY3Rpb25zYCwgYFVEVGAgZmllbGRzLCBgd3JpdGV0aW1lYCwgb3IgYHR0bGAgYXJlIHNlbGVjdGVkIHRvZ2V0aGVyIHdpdGggYWdncmVnYXRlIGZ1bmN0aW9ucywgdGhlIHZhbHVlcworcmV0dXJuZWQgZm9yIHRoZW0gd2lsbCBiZSB0aGUgb25lcyBvZiB0aGUgZmlyc3Qgcm93IG1hdGNoaW5nIHRoZSBxdWVyeS4KKworPT09PSBOYXRpdmUgYWdncmVnYXRlcworCitbW2NvdW50LWZ1bmN0aW9uXV0KKz09PT09IENvdW50CisKK1RoZSBgY291bnRgIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNvdW50IHRoZSByb3dzIHJldHVybmVkIGJ5IGEgcXVlcnkuCisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2NvdW50LmNxbFtdCistLS0tCisKK0l0IGFsc28gY2FuIGNvdW50IHRoZSBub24tbnVsbCB2YWx1ZXMgb2YgYSBnaXZlbiBjb2x1bW46CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY291bnRfbm9ubnVsbC5jcWxbXQorLS0tLQorCis9PT09PSBNYXggYW5kIE1pbgorCitUaGUgYG1heGAgYW5kIGBtaW5gIGZ1bmN0aW9ucyBjb21wdXRlIHRoZSBtYXhpbXVtIGFuZCB0aGUgbWluaW11bSB2YWx1ZSByZXR1cm5lZCBieSBhIHF1ZXJ5IGZvciBhIGdpdmVuIGNvbHVtbi4gCisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML21pbl9tYXguY3FsW10KKy0tLS0KKworPT09PT0gU3VtCisKK1RoZSBgc3VtYCBmdW5jdGlvbiBzdW1zIHVwIGFsbCB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IGEgcXVlcnkgZm9yIGEgZ2l2ZW4gY29sdW1uLgorCitUaGUgcmV0dXJuZWQgdmFsdWUgaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaW5wdXQgY29sbGVjdGlvbiBlbGVtZW50cywgc28gdGhlcmUgaXMgYSByaXNrIG9mIG92ZXJmbG93aW5nIGlmIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBleGNlZWRzIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIHR5cGUgY2FuIHJlcHJlc2VudC4KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvc3VtLmNxbFtdCistLS0tCisKK1RoZSByZXR1cm5lZCB2YWx1ZSBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBpbnB1dCB2YWx1ZXMsIHNvIHRoZXJlIGlzIGEgcmlzayBvZiBvdmVyZmxvd2luZyB0aGUgdHlwZSBpZiB0aGUgc3VtIG9mIHRoZQordmFsdWVzIGV4Y2VlZHMgdGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgdHlwZSBjYW4gcmVwcmVzZW50LiBZb3UgY2FuIHVzZSB0eXBlIGNhc3RpbmcgdG8gY2FzdCB0aGUgaW5wdXQgdmFsdWVzIGFzIGEKK3R5cGUgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIHR5cGUuIEZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3N1bV93aXRoX2Nhc3QuY3FsW10KKy0tLS0KKworPT09PT0gQXZnCisKK1RoZSBgYXZnYCBmdW5jdGlvbiBjb21wdXRlcyB0aGUgYXZlcmFnZSBvZiBhbGwgdGhlIHZhbHVlcyByZXR1cm5lZCBieSBhIHF1ZXJ5IGZvciBhIGdpdmVuIGNvbHVtbi4KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvYXZnLmNxbFtdCistLS0tCisKK1RoZSBhdmVyYWdlIG9mIGFuIGVtcHR5IGNvbGxlY3Rpb24gcmV0dXJucyB6ZXJvLgorCitUaGUgcmV0dXJuZWQgdmFsdWUgaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaW5wdXQgdmFsdWVzLCB3aGljaCBtaWdodCBpbmNsdWRlIHJvdW5kaW5nIGFuZCB0cnVuY2F0aW9ucy4KK0ZvciBleGFtcGxlIGBjb2xsZWN0aW9uX2F2ZyhbMSwgMl0pYCByZXR1cm5zIGAxYCBpbnN0ZWFkIG9mIGAxLjVgLgorWW91IGNhbiB1c2UgdHlwZSBjYXN0aW5nIHRvIGNhc3QgdG8gYSB0eXBlIHdpdGggdGhlIGRlc2lyZWQgZGVjaW1hbCBwcmVjaXNpb24uIEZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2F2Z193aXRoX2Nhc3QuY3FsW10KKy0tLS0KKworW1t1c2VyLWRlZmluZWQtYWdncmVnYXRlcy1mdW5jdGlvbnNdXQorPT09PSBVc2VyLURlZmluZWQgQWdncmVnYXRlcyAoVURBcykKKworVXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZXMgYWxsb3cgdGhlIGNyZWF0aW9uIG9mIGN1c3RvbSBhZ2dyZWdhdGUgZnVuY3Rpb25zLiAKK1VzZXItZGVmaW5lZCBhZ2dyZWdhdGVzIGNhbiBiZSB1c2VkIGluIGBTRUxFQ1RgIHN0YXRlbWVudC4KKworRWFjaCBhZ2dyZWdhdGUgcmVxdWlyZXMgYW4gX2luaXRpYWwgc3RhdGVfIG9mIHR5cGUgYFNUWVBFYCBkZWZpbmVkIHdpdGggdGhlIGBJTklUQ09ORGB2YWx1ZSAoZGVmYXVsdCB2YWx1ZTogYG51bGxgKS4gCitUaGUgZmlyc3QgYXJndW1lbnQgb2YgdGhlIHN0YXRlIGZ1bmN0aW9uIG11c3QgaGF2ZSB0eXBlIGBTVFlQRWAuIAorVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgb2YgdGhlIHN0YXRlIGZ1bmN0aW9uIG11c3QgbWF0Y2ggdGhlIHR5cGVzIG9mIHRoZSB1c2VyLWRlZmluZWQgYWdncmVnYXRlIGFyZ3VtZW50cy4gCitUaGUgc3RhdGUgZnVuY3Rpb24gaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggcm93LCBhbmQgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBzdGF0ZSBmdW5jdGlvbiBiZWNvbWVzIHRoZSBuZXcgc3RhdGUuIAorQWZ0ZXIgYWxsIHJvd3MgYXJlIHByb2Nlc3NlZCwgdGhlIG9wdGlvbmFsIGBGSU5BTEZVTkNgIGlzIGV4ZWN1dGVkIHdpdGggbGFzdCBzdGF0ZSB2YWx1ZSBhcyBpdHMgYXJndW1lbnQuCisKK1RoZSBgU1RZUEVgIHZhbHVlIGlzIG1hbmRhdG9yeSBpbiBvcmRlciB0byBkaXN0aW5ndWlzaCBwb3NzaWJseSBvdmVybG9hZGVkIHZlcnNpb25zIG9mIHRoZSBzdGF0ZSBhbmQvb3IgZmluYWwgZnVuY3Rpb24sIHNpbmNlIHRoZQorb3ZlcmxvYWQgY2FuIGFwcGVhciBhZnRlciBjcmVhdGlvbiBvZiB0aGUgYWdncmVnYXRlLgorCisKK0EgY29tcGxldGUgd29ya2luZyBleGFtcGxlIGZvciB1c2VyLWRlZmluZWQgYWdncmVnYXRlcyAoYXNzdW1pbmcgdGhhdCBhCitrZXlzcGFjZSBoYXMgYmVlbiBzZWxlY3RlZCB1c2luZyB0aGUgYFVTRWAgc3RhdGVtZW50KToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC91ZGEuY3FsW10KKy0tLS0KKworW1tjcmVhdGUtYWdncmVnYXRlLXN0YXRlbWVudF1dCis9PT09IENSRUFURSBBR0dSRUdBVEUgc3RhdGVtZW50CisKK0NyZWF0aW5nIChvciByZXBsYWNpbmcpIGEgdXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSBmdW5jdGlvbiB1c2VzIHRoZQorYENSRUFURSBBR0dSRUdBVEVgIHN0YXRlbWVudDoKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvY3JlYXRlX2FnZ3JlZ2F0ZV9zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworU2VlIGFib3ZlIGZvciBhIGNvbXBsZXRlIGV4YW1wbGUuCisKK1RoZSBgQ1JFQVRFIEFHR1JFR0FURWAgY29tbWFuZCB3aXRoIHRoZSBvcHRpb25hbCBgT1IgUkVQTEFDRWAga2V5d29yZHMgY3JlYXRlcyBlaXRoZXIgYW4gYWdncmVnYXRlIG9yIHJlcGxhY2VzIGFuIGV4aXN0aW5nIG9uZSB3aXRoIHRoZSBzYW1lCitzaWduYXR1cmUuIAorQSBgQ1JFQVRFIEFHR1JFR0FURWAgd2l0aG91dCBgT1IgUkVQTEFDRWAgZmFpbHMgaWYgYW4gYWdncmVnYXRlIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFscmVhZHkgZXhpc3RzLgorVGhlIGBDUkVBVEUgQUdHUkVHQVRFYCBjb21tYW5kIHdpdGggdGhlIG9wdGlvbmFsIGBJRiBOT1QgRVhJU1RTYCBrZXl3b3JkcyBjcmVhdGVzIGFuIGFnZ3JlZ2F0ZSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorVGhlIGBPUiBSRVBMQUNFYCBhbmQgYElGIE5PVCBFWElTVFNgIHBocmFzZXMgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuCisKK1RoZSBgU1RZUEVgIHZhbHVlIGRlZmluZXMgdGhlIHR5cGUgb2YgdGhlIHN0YXRlIHZhbHVlIGFuZCBtdXN0IGJlIHNwZWNpZmllZC4KK1RoZSBvcHRpb25hbCBgSU5JVENPTkRgIGRlZmluZXMgdGhlIGluaXRpYWwgc3RhdGUgdmFsdWUgZm9yIHRoZSBhZ2dyZWdhdGU7IHRoZSBkZWZhdWx0IHZhbHVlIGlzIGBudWxsYC4gCitBIG5vbi1udWxsIGBJTklUQ09ORGAgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIHN0YXRlIGZ1bmN0aW9ucyB0aGF0IGFyZSBkZWNsYXJlZCB3aXRoIGBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVGAuCisKK1RoZSBgU0ZVTkNgIHZhbHVlIHJlZmVyZW5jZXMgYW4gZXhpc3RpbmcgZnVuY3Rpb24gdG8gdXNlIGFzIHRoZSBzdGF0ZS1tb2RpZnlpbmcgZnVuY3Rpb24uIAorVGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBzdGF0ZSBmdW5jdGlvbiBtdXN0IGhhdmUgdHlwZSBgU1RZUEVgLgorVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgb2YgdGhlIHN0YXRlIGZ1bmN0aW9uIG11c3QgbWF0Y2ggdGhlIHR5cGVzIG9mIHRoZSB1c2VyLWRlZmluZWQgYWdncmVnYXRlIGFyZ3VtZW50cy4KK1RoZSBzdGF0ZSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCByb3csIGFuZCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIHN0YXRlIGZ1bmN0aW9uIGJlY29tZXMgdGhlIG5ldyBzdGF0ZS4KK1N0YXRlIGlzIG5vdCB1cGRhdGVkIGZvciBzdGF0ZSBmdW5jdGlvbnMgZGVjbGFyZWQgd2l0aCBgUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVRgIGFuZCBjYWxsZWQgd2l0aCBgbnVsbGAuCitBZnRlciBhbGwgcm93cyBhcmUgcHJvY2Vzc2VkLCB0aGUgb3B0aW9uYWwgYEZJTkFMRlVOQ2AgaXMgZXhlY3V0ZWQgd2l0aCBsYXN0IHN0YXRlIHZhbHVlIGFzIGl0cyBhcmd1bWVudC4KK0l0IG11c3QgdGFrZSBvbmx5IG9uZSBhcmd1bWVudCB3aXRoIHR5cGUgYFNUWVBFYCwgYnV0IHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgYEZJTkFMRlVOQ2AgbWF5IGJlIGEgZGlmZmVyZW50IHR5cGUuIAorQSBmaW5hbCBmdW5jdGlvbiBkZWNsYXJlZCB3aXRoIGBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVGAgbWVhbnMgdGhhdCB0aGUgYWdncmVnYXRlJ3MgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYG51bGxgLCBpZiB0aGUgbGFzdCBzdGF0ZSBpcyBgbnVsbGAuCisKK0lmIG5vIGBGSU5BTEZVTkNgIGlzIGRlZmluZWQsIHRoZSBvdmVyYWxsIHJldHVybiB0eXBlIG9mIHRoZSBhZ2dyZWdhdGUgZnVuY3Rpb24gaXMgYFNUWVBFYC4gCitJZiBhIGBGSU5BTEZVTkNgIGlzIGRlZmluZWQsIGl0IGlzIHRoZSByZXR1cm4gdHlwZSBvZiB0aGF0IGZ1bmN0aW9uLgorCitbW2Ryb3AtYWdncmVnYXRlLXN0YXRlbWVudF1dCis9PT09IERST1AgQUdHUkVHQVRFIHN0YXRlbWVudAorCitEcm9wcGluZyBhbiB1c2VyLWRlZmluZWQgYWdncmVnYXRlIGZ1bmN0aW9uIHVzZXMgdGhlIGBEUk9QIEFHR1JFR0FURWAKK3N0YXRlbWVudDoKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvZHJvcF9hZ2dyZWdhdGVfc3RhdGVtZW50LmJuZltdCistLS0tCisKK0ZvciBpbnN0YW5jZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9kcm9wX2FnZ3JlZ2F0ZS5jcWxbXQorLS0tLQorCitUaGUgYERST1AgQUdHUkVHQVRFYCBzdGF0ZW1lbnQgcmVtb3ZlcyBhbiBhZ2dyZWdhdGUgY3JlYXRlZCB1c2luZyBgQ1JFQVRFIEFHR1JFR0FURWAuIAorWW91IG11c3Qgc3BlY2lmeSB0aGUgYXJndW1lbnQgdHlwZXMgb2YgdGhlIGFnZ3JlZ2F0ZSB0byBkcm9wIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBvdmVybG9hZGVkIGFnZ3JlZ2F0ZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBhCitkaWZmZXJlbnQgc2lnbmF0dXJlLgorCitUaGUgYERST1AgQUdHUkVHQVRFYCBjb21tYW5kIHdpdGggdGhlIG9wdGlvbmFsIGBJRiBFWElTVFNgIGtleXdvcmRzIGRyb3BzIGFuIGFnZ3JlZ2F0ZSBpZiBpdCBleGlzdHMsIGFuZCBkb2VzIG5vdGhpbmcgaWYgYSBmdW5jdGlvbiB3aXRoIHRoZQorc2lnbmF0dXJlIGRvZXMgbm90IGV4aXN0LgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2luZGV4LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvaW5kZXguYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGU4NGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2luZGV4LmFkb2MKQEAgLTAsMCArMSwyNSBAQAorPSBUaGUgQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlIChDUUwpCisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UKKyhDUUwpIHZlcnNpb24gMy4KK05vdGUgdGhhdCB0aGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgbGFzdCB2ZXJzaW9uIG9mIHRoZSBsYW5ndWFnZS4KK0hvd2V2ZXIsIHRoZSB4cmVmOmNxbC9jaGFuZ2VzLmFkb2NbY2hhbmdlc10gc2VjdGlvbiBwcm92aWRlcyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdmVyc2lvbnMgb2YgQ1FMIHNpbmNlIHZlcnNpb24gMy4wLgorCitDUUwgb2ZmZXJzIGEgbW9kZWwgc2ltaWxhciB0byBTUUwuCitUaGUgZGF0YSBpcyBzdG9yZWQgaW4gKnRhYmxlcyogY29udGFpbmluZyAqcm93cyogb2YgKmNvbHVtbnMqLgorRm9yIHRoYXQgcmVhc29uLCB3aGVuIHVzZWQgaW4gdGhpcyBkb2N1bWVudCwgdGhlc2UgdGVybXMgKHRhYmxlcywgcm93cyBhbmQgY29sdW1ucykgaGF2ZSB0aGUgc2FtZSBkZWZpbml0aW9uIHRoYXQgdGhleSBoYXZlIGluIFNRTC4KKworKiB4cmVmOmNxbC9kZWZpbml0aW9ucy5hZG9jW0RlZmluaXRpb25zXQorKiB4cmVmOmNxbC90eXBlcy5hZG9jW0RhdGEgdHlwZXNdCisqIHhyZWY6Y3FsL2RkbC5hZG9jW0RhdGEgZGVmaW5pdGlvbiBsYW5ndWFnZV0KKyogeHJlZjpjcWwvZG1sLmFkb2NbRGF0YSBtYW5pcHVsYXRpb24gbGFuZ3VhZ2VdCisqIHhyZWY6Y3FsL29wZXJhdG9ycy5hZG9jW09wZXJhdG9yc10KKyogeHJlZjpjcWwvaW5kZXhlcy5hZG9jW1NlY29uZGFyeSBpbmRleGVzXQorKiB4cmVmOmNxbC9tdnMuYWRvY1tNYXRlcmlhbGl6ZWQgdmlld3NdCisqIHhyZWY6Y3FsL2Z1bmN0aW9ucy5hZG9jW0Z1bmN0aW9uc10KKyogeHJlZjpjcWwvanNvbi5hZG9jW0pTT05dCisqIHhyZWY6Y3FsL3NlY3VyaXR5LmFkb2NbQ1FMIHNlY3VyaXR5XQorKiB4cmVmOmNxbC9keW5hbWljX2RhdGFfbWFza2luZy5hZG9jW0R5bmFtaWMgZGF0YSBtYXNraW5nXQorKiB4cmVmOmNxbC90cmlnZ2Vycy5hZG9jW1RyaWdnZXJzXQorKiB4cmVmOmNxbC9hcHBlbmRpY2VzLmFkb2NbQXBwZW5kaWNlc10KKyogeHJlZjpjcWwvY2hhbmdlcy5hZG9jW0NoYW5nZXNdCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL2luZGV4ZXMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9pbmRleGVzLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvaW5kZXhlcy5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvaW5kZXhlcy5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvanNvbi5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2pzb24uYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzQ2MmU4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL2pzb24uYWRvYwpAQCAtMCwwICsxLDEyNSBAQAorPSBKU09OIFN1cHBvcnQKKworQ2Fzc2FuZHJhIDIuMiBpbnRyb2R1Y2VzIEpTT04gc3VwcG9ydCB0byBgU0VMRUNUIDxzZWxlY3Qtc3RhdGVtZW50PmAgYW5kCitgSU5TRVJUIDxpbnNlcnQtc3RhdGVtZW50PmAgc3RhdGVtZW50cy4gCitUaGlzIHN1cHBvcnQgZG9lcyBub3QgZnVuZGFtZW50YWxseSBhbHRlciB0aGUgQ1FMIEFQSSAoZm9yIGV4YW1wbGUsIHRoZSBzY2hlbWEgaXMgc3RpbGwKK2VuZm9yY2VkKS4KK0l0IHNpbXBseSBwcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IHRvIHdvcmsgd2l0aCBKU09OIGRvY3VtZW50cy4KKworPT0gU0VMRUNUIEpTT04KKworV2l0aCBgU0VMRUNUYCBzdGF0ZW1lbnRzLCB0aGUgYEpTT05gIGtleXdvcmQgaXMgdXNlZCB0byByZXR1cm4gZWFjaCByb3cgYXMgYSBzaW5nbGUgYEpTT05gIGVuY29kZWQgbWFwLiAKK1RoZSByZW1haW5kZXIgb2YgdGhlIGBTRUxFQ1RgIHN0YXRlbWVudCBiZWhhdmlvciBpcyB0aGUgc2FtZS4KKworVGhlIHJlc3VsdCBtYXAga2V5cyBtYXRjaCB0aGUgY29sdW1uIG5hbWVzIGluIGEgbm9ybWFsIHJlc3VsdCBzZXQuIAorRm9yIGV4YW1wbGUsIGEgc3RhdGVtZW50IGxpa2UgYFNFTEVDVCBKU09OIGEsIHR0bChiKSBGUk9NIC4uLmAgd291bGQgcmVzdWx0IGluIGEgbWFwIHdpdGgga2V5cyBgImEiYCBhbmQgYCJ0dGwoYikiYC4gCitIb3dldmVyLCB0aGVyZSBpcyBvbmUgbm90YWJsZSBleGNlcHRpb246IGZvciBzeW1tZXRyeSB3aXRoIGBJTlNFUlQgSlNPTmAgYmVoYXZpb3IsIGNhc2Utc2Vuc2l0aXZlIGNvbHVtbiBuYW1lcyB3aXRoIHVwcGVyLWNhc2UgbGV0dGVycyB3aWxsIGJlIHN1cnJvdW5kZWQgd2l0aCBkb3VibGUgcXVvdGVzLiAKK0ZvciBleGFtcGxlLCBgU0VMRUNUIEpTT04gbXlDb2x1bW4gRlJPTSAuLi5gIHdvdWxkIHJlc3VsdCBpbiBhIG1hcCBrZXkgYCJcIm15Q29sdW1uXCIiYCB3aXRoIGVzY2FwZWQgcXVvdGVzKS4KKworVGhlIG1hcCB2YWx1ZXMgd2lsbCBKU09OLWVuY29kZWQgcmVwcmVzZW50YXRpb25zIChhcyBkZXNjcmliZWQgYmVsb3cpIG9mIHRoZSByZXN1bHQgc2V0IHZhbHVlcy4KKworPT0gSU5TRVJUIEpTT04KKworV2l0aCBgSU5TRVJUYCBzdGF0ZW1lbnRzLCB0aGUgbmV3IGBKU09OYCBrZXl3b3JkIGNhbiBiZSB1c2VkIHRvIGVuYWJsZQoraW5zZXJ0aW5nIGEgYEpTT05gIGVuY29kZWQgbWFwIGFzIGEgc2luZ2xlIHJvdy4gVGhlIGZvcm1hdCBvZiB0aGUgYEpTT05gCittYXAgc2hvdWxkIGdlbmVyYWxseSBtYXRjaCB0aGF0IHJldHVybmVkIGJ5IGEgYFNFTEVDVCBKU09OYCBzdGF0ZW1lbnQgb24KK3RoZSBzYW1lIHRhYmxlLiBJbiBwYXJ0aWN1bGFyLCBjYXNlLXNlbnNpdGl2ZSBjb2x1bW4gbmFtZXMgc2hvdWxkIGJlCitzdXJyb3VuZGVkIHdpdGggZG91YmxlIHF1b3Rlcy4gRm9yIGV4YW1wbGUsIHRvIGluc2VydCBpbnRvIGEgdGFibGUgd2l0aAordHdvIGNvbHVtbnMgbmFtZWQgIm15S2V5IiBhbmQgInZhbHVlIiwgeW91IHdvdWxkIGRvIHRoZSBmb2xsb3dpbmc6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvaW5zZXJ0X2pzb24uY3FsW10KKy0tLS0KKworQnkgZGVmYXVsdCAob3IgaWYgYERFRkFVTFQgTlVMTGAgaXMgZXhwbGljaXRseSB1c2VkKSwgYSBjb2x1bW4gb21pdHRlZAorZnJvbSB0aGUgYEpTT05gIG1hcCB3aWxsIGJlIHNldCB0byBgTlVMTGAsIG1lYW5pbmcgdGhhdCBhbnkgcHJlLWV4aXN0aW5nCit2YWx1ZSBmb3IgdGhhdCBjb2x1bW4gd2lsbCBiZSByZW1vdmVkIChyZXN1bHRpbmcgaW4gYSB0b21ic3RvbmUgYmVpbmcKK2NyZWF0ZWQpLiBBbHRlcm5hdGl2ZWx5LCBpZiB0aGUgYERFRkFVTFQgVU5TRVRgIGRpcmVjdGl2ZSBpcyB1c2VkIGFmdGVyCit0aGUgdmFsdWUsIG9taXR0ZWQgY29sdW1uIHZhbHVlcyB3aWxsIGJlIGxlZnQgdW5zZXQsIG1lYW5pbmcgdGhhdAorcHJlLWV4aXN0aW5nIHZhbHVlcyBmb3IgdGhvc2UgY29sdW1uIHdpbGwgYmUgcHJlc2VydmVkLgorCis9PSBKU09OIEVuY29kaW5nIG9mIENhc3NhbmRyYSBEYXRhIFR5cGVzCisKK1doZXJlIHBvc3NpYmxlLCBDYXNzYW5kcmEgd2lsbCByZXByZXNlbnQgYW5kIGFjY2VwdCBkYXRhIHR5cGVzIGluIHRoZWlyCituYXRpdmUgYEpTT05gIHJlcHJlc2VudGF0aW9uLiBDYXNzYW5kcmEgd2lsbCBhbHNvIGFjY2VwdCBzdHJpbmcKK3JlcHJlc2VudGF0aW9ucyBtYXRjaGluZyB0aGUgQ1FMIGxpdGVyYWwgZm9ybWF0IGZvciBhbGwgc2luZ2xlLWZpZWxkCit0eXBlcy4gRm9yIGV4YW1wbGUsIGZsb2F0cywgaW50cywgVVVJRHMsIGFuZCBkYXRlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYnkKK0NRTCBsaXRlcmFsIHN0cmluZ3MuIEhvd2V2ZXIsIGNvbXBvdW5kIHR5cGVzLCBzdWNoIGFzIGNvbGxlY3Rpb25zLAordHVwbGVzLCBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIG11c3QgYmUgcmVwcmVzZW50ZWQgYnkgbmF0aXZlIGBKU09OYAorY29sbGVjdGlvbnMgKG1hcHMgYW5kIGxpc3RzKSBvciBhIEpTT04tZW5jb2RlZCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YKK3RoZSBjb2xsZWN0aW9uLgorCitUaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUgZW5jb2RpbmdzIHRoYXQgQ2Fzc2FuZHJhIHdpbGwgYWNjZXB0CitpbiBgSU5TRVJUIEpTT05gIHZhbHVlcyAoYW5kIGBmcm9tX2pzb24oKWAgYXJndW1lbnRzKSBhcyB3ZWxsIGFzIHRoZQorZm9ybWF0IENhc3NhbmRyYSB3aWxsIHVzZSB3aGVuIHJldHVybmluZyBkYXRhIGZvciBgU0VMRUNUIEpTT05gCitzdGF0ZW1lbnRzIChhbmQgYGZyb21fanNvbigpYCk6CisKK1tjb2xzPSIsLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfFR5cGUgfEZvcm1hdHMgYWNjZXB0ZWQgfFJldHVybiBmb3JtYXQgfE5vdGVzCisKK3wgYGFzY2lpYCB8IHN0cmluZyB8IHN0cmluZyB8IFVzZXMgSlNPTidzIGBcdWAgY2hhcmFjdGVyIGVzY2FwZQorCit8IGBiaWdpbnRgIHwgaW50ZWdlciwgc3RyaW5nIHwgaW50ZWdlciB8IFN0cmluZyBtdXN0IGJlIHZhbGlkIDY0IGJpdCBpbnRlZ2VyCisKK3wgYGJsb2JgIHwgc3RyaW5nIHwgc3RyaW5nIHwgU3RyaW5nIHNob3VsZCBiZSAweCBmb2xsb3dlZCBieSBhbiBldmVuIG51bWJlciBvZiBoZXggZGlnaXRzCisKK3wgYGJvb2xlYW5gIHwgYm9vbGVhbiwgc3RyaW5nIHwgYm9vbGVhbiB8IFN0cmluZyBtdXN0IGJlICJ0cnVlIiBvciAiZmFsc2UiCisKK3wgYGRhdGVgIHwgc3RyaW5nIHwgc3RyaW5nIHwgRGF0ZSBpbiBmb3JtYXQgYFlZWVktTU0tRERgLCB0aW1lem9uZSBVVEMKKworfCBgZGVjaW1hbGAgfCBpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nIHwgZmxvYXQgfCBNYXkgZXhjZWVkIDMyIG9yIDY0LWJpdCBJRUVFLTc1NCBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gaW4gY2xpZW50LXNpZGUgZGVjb2RlcgorCit8IGBkb3VibGVgIHwgaW50ZWdlciwgZmxvYXQsIHN0cmluZyB8IGZsb2F0IHwgU3RyaW5nIG11c3QgYmUgdmFsaWQgaW50ZWdlciBvciBmbG9hdAorCit8IGBmbG9hdGAgfCBpbnRlZ2VyLCBmbG9hdCwgc3RyaW5nIHwgZmxvYXQgfCBTdHJpbmcgbXVzdCBiZSB2YWxpZCBpbnRlZ2VyIG9yIGZsb2F0CisKK3wgYGluZXRgIHwgc3RyaW5nIHwgc3RyaW5nIHwgSVB2NCBvciBJUHY2IGFkZHJlc3MKKworfCBgaW50YCB8IGludGVnZXIsIHN0cmluZyB8IGludGVnZXIgfCBTdHJpbmcgbXVzdCBiZSB2YWxpZCAzMiBiaXQgaW50ZWdlcgorCit8IGBsaXN0YCB8IGxpc3QsIHN0cmluZyB8IGxpc3QgfCBVc2VzIEpTT04ncyBuYXRpdmUgbGlzdCByZXByZXNlbnRhdGlvbgorCit8IGBtYXBgIHwgbWFwLCBzdHJpbmcgfCBtYXAgfCBVc2VzIEpTT04ncyBuYXRpdmUgbWFwIHJlcHJlc2VudGF0aW9uCisKK3wgYHNtYWxsaW50YCB8IGludGVnZXIsIHN0cmluZyB8IGludGVnZXIgfCBTdHJpbmcgbXVzdCBiZSB2YWxpZCAxNiBiaXQgaW50ZWdlcgorCit8IGBzZXRgIHwgbGlzdCwgc3RyaW5nIHwgbGlzdCB8IFVzZXMgSlNPTidzIG5hdGl2ZSBsaXN0IHJlcHJlc2VudGF0aW9uCisKK3wgYHRleHRgIHwgc3RyaW5nIHwgc3RyaW5nIHwgVXNlcyBKU09OJ3MgYFx1YCBjaGFyYWN0ZXIgZXNjYXBlCisKK3wgYHRpbWVgIHwgc3RyaW5nIHwgc3RyaW5nIHwgVGltZSBvZiBkYXkgaW4gZm9ybWF0IGBISC1NTS1TU1suZmZmZmZmZmZmXWAKKworfCBgdGltZXN0YW1wYCB8IGludGVnZXIsIHN0cmluZyB8IHN0cmluZyB8IEEgdGltZXN0YW1wLiBTdHJpbmdzIGNvbnN0YW50IGFsbG93cyB0byBpbnB1dCBgdGltZXN0YW1wcworYXMgZGF0ZXMgPHRpbWVzdGFtcHM+YC4gRGF0ZXN0YW1wcyB3aXRoIGZvcm1hdCBgWVlZWS1NTS1ERCBISDpNTTpTUy5TU1NgCithcmUgcmV0dXJuZWQuCisKK3wgYHRpbWV1dWlkYCB8IHN0cmluZyB8IHN0cmluZyB8IFR5cGUgMSBVVUlELiBTZWUgYGNvbnN0YW50YCBmb3IgdGhlIFVVSUQgZm9ybWF0CisKK3wgYHRpbnlpbnRgIHwgaW50ZWdlciwgc3RyaW5nIHwgaW50ZWdlciB8IFN0cmluZyBtdXN0IGJlIHZhbGlkIDggYml0IGludGVnZXIKKworfCBgdHVwbGVgIHwgbGlzdCwgc3RyaW5nIHwgbGlzdCB8IFVzZXMgSlNPTidzIG5hdGl2ZSBsaXN0IHJlcHJlc2VudGF0aW9uCisKK3wgYFVEVGAgfCBtYXAsIHN0cmluZyB8IG1hcCB8IFVzZXMgSlNPTidzIG5hdGl2ZSBtYXAgcmVwcmVzZW50YXRpb24gd2l0aCBmaWVsZCBuYW1lcyBhcyBrZXlzCisKK3wgYHV1aWRgIHwgc3RyaW5nIHwgc3RyaW5nIHwgU2VlIGBjb25zdGFudGAgZm9yIHRoZSBVVUlEIGZvcm1hdAorCit8IGB2YXJjaGFyYCB8IHN0cmluZyB8IHN0cmluZyB8IFVzZXMgSlNPTidzIGBcdWAgY2hhcmFjdGVyIGVzY2FwZQorCit8IGB2YXJpbnRgIHwgaW50ZWdlciwgc3RyaW5nIHwgaW50ZWdlciB8IFZhcmlhYmxlIGxlbmd0aDsgbWF5IG92ZXJmbG93IDMyIG9yIDY0IGJpdCBpbnRlZ2VycyBpbiBjbGllbnQtc2lkZSBkZWNvZGVyCit8PT09CisKKz09IFRoZSBmcm9tX2pzb24oKSBGdW5jdGlvbgorCitUaGUgYGZyb21fanNvbigpYCBmdW5jdGlvbiBtYXkgYmUgdXNlZCBzaW1pbGFybHkgdG8gYElOU0VSVCBKU09OYCwgYnV0Citmb3IgYSBzaW5nbGUgY29sdW1uIHZhbHVlLiBJdCBtYXkgb25seSBiZSB1c2VkIGluIHRoZSBgVkFMVUVTYCBjbGF1c2Ugb2YKK2FuIGBJTlNFUlRgIHN0YXRlbWVudCBvciBhcyBvbmUgb2YgdGhlIGNvbHVtbiB2YWx1ZXMgaW4gYW4gYFVQREFURWAsCitgREVMRVRFYCwgb3IgYFNFTEVDVGAgc3RhdGVtZW50LiBGb3IgZXhhbXBsZSwgaXQgY2Fubm90IGJlIHVzZWQgaW4gdGhlCitzZWxlY3Rpb24gY2xhdXNlIG9mIGEgYFNFTEVDVGAgc3RhdGVtZW50LgorCis9PSBUaGUgdG9fanNvbigpIEZ1bmN0aW9uCisKK1RoZSBgdG9fanNvbigpYCBmdW5jdGlvbiBtYXkgYmUgdXNlZCBzaW1pbGFybHkgdG8gYFNFTEVDVCBKU09OYCwgYnV0IGZvcgorYSBzaW5nbGUgY29sdW1uIHZhbHVlLiBJdCBtYXkgb25seSBiZSB1c2VkIGluIHRoZSBzZWxlY3Rpb24gY2xhdXNlIG9mIGEKK2BTRUxFQ1RgIHN0YXRlbWVudC4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvbXZzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvbXZzLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jcWwvbXZzLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9tdnMuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9vcGVyYXRvcnMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9vcGVyYXRvcnMuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC9vcGVyYXRvcnMuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL29wZXJhdG9ycy5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvc2VjdXJpdHkuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2NxbC9zZWN1cml0eS5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NmViODcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvc2VjdXJpdHkuYWRvYwpAQCAtMCwwICsxLDYzMCBAQAorcm9sZV9uYW1lIDo6PSBpZGVudGlmaWVyIHwgc3RyaW5nPSBTZWN1cml0eQorCitbW2NxbC1yb2xlc11dCis9PSBEYXRhYmFzZSBSb2xlcworCitDUUwgdXNlcyBkYXRhYmFzZSByb2xlcyB0byByZXByZXNlbnQgdXNlcnMgYW5kIGdyb3VwIG9mIHVzZXJzLgorU3ludGFjdGljYWxseSwgYSByb2xlIGlzIGRlZmluZWQgYnk6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL3JvbGVfbmFtZS5ibmZbXQorLS0tLQorCisKK1tbY3JlYXRlLXJvbGUtc3RhdGVtZW50XV0KKz09PSBDUkVBVEUgUk9MRQorCitDcmVhdGluZyBhIHJvbGUgdXNlcyB0aGUgYENSRUFURSBST0xFYCBzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2NyZWF0ZV9yb2xlX3N0YXRlbWVudC5ibmZbXQorLS0tLQorCitGb3IgaW5zdGFuY2U6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3JvbGUuY3FsW10KKy0tLS0KKworQnkgZGVmYXVsdCByb2xlcyBkbyBub3QgcG9zc2VzcyBgTE9HSU5gIHByaXZpbGVnZXMgb3IgYFNVUEVSVVNFUmAKK3N0YXR1cy4KKworeHJlZjpjcWwvc2VjdXJpdHkuYWRvYyNjcWwtcGVybWlzc2lvbnNbUGVybWlzc2lvbnNdIG9uIGRhdGFiYXNlIHJlc291cmNlcyBhcmUgZ3JhbnRlZCB0bworcm9sZXM7IHR5cGVzIG9mIHJlc291cmNlcyBpbmNsdWRlIGtleXNwYWNlcywgdGFibGVzLCBmdW5jdGlvbnMgYW5kIHJvbGVzCit0aGVtc2VsdmVzLiBSb2xlcyBtYXkgYmUgZ3JhbnRlZCB0byBvdGhlciByb2xlcyB0byBjcmVhdGUgaGllcmFyY2hpY2FsCitwZXJtaXNzaW9ucyBzdHJ1Y3R1cmVzOyBpbiB0aGVzZSBoaWVyYXJjaGllcywgcGVybWlzc2lvbnMgYW5kCitgU1VQRVJVU0VSYCBzdGF0dXMgYXJlIGluaGVyaXRlZCwgYnV0IHRoZSBgTE9HSU5gIHByaXZpbGVnZSBpcyBub3QuCisKK0lmIGEgcm9sZSBoYXMgdGhlIGBMT0dJTmAgcHJpdmlsZWdlLCBjbGllbnRzIG1heSBpZGVudGlmeSBhcyB0aGF0IHJvbGUKK3doZW4gY29ubmVjdGluZy4gRm9yIHRoZSBkdXJhdGlvbiBvZiB0aGF0IGNvbm5lY3Rpb24sIHRoZSBjbGllbnQgd2lsbAorYWNxdWlyZSBhbnkgcm9sZXMgYW5kIHByaXZpbGVnZXMgZ3JhbnRlZCB0byB0aGF0IHJvbGUuCisKK09ubHkgYSBjbGllbnQgd2l0aCB3aXRoIHRoZSBgQ1JFQVRFYCBwZXJtaXNzaW9uIG9uIHRoZSBkYXRhYmFzZSByb2xlcworcmVzb3VyY2UgbWF5IGlzc3VlIGBDUkVBVEUgUk9MRWAgcmVxdWVzdHMgKHNlZSB0aGUKK3hyZWY6Y3FsL3NlY3VyaXR5LmFkb2MjY3FsLXBlcm1pc3Npb25zW3JlbGV2YW50IHNlY3Rpb25dKSwgdW5sZXNzIHRoZSBjbGllbnQgaXMgYQorYFNVUEVSVVNFUmAuIFJvbGUgbWFuYWdlbWVudCBpbiBDYXNzYW5kcmEgaXMgcGx1Z2dhYmxlIGFuZCBjdXN0b20KK2ltcGxlbWVudGF0aW9ucyBtYXkgc3VwcG9ydCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBsaXN0ZWQgb3B0aW9ucy4KKworUm9sZSBuYW1lcyBzaG91bGQgYmUgcXVvdGVkIGlmIHRoZXkgY29udGFpbiBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuCisKKz09PT0gU2V0dGluZyBjcmVkZW50aWFscyBmb3IgaW50ZXJuYWwgYXV0aGVudGljYXRpb24KKworVXNlIHRoZSBgV0lUSCBQQVNTV09SRGAgY2xhdXNlIHRvIHNldCBhIHBhc3N3b3JkIGZvciBpbnRlcm5hbAorYXV0aGVudGljYXRpb24sIGVuY2xvc2luZyB0aGUgcGFzc3dvcmQgaW4gc2luZ2xlIHF1b3RhdGlvbiBtYXJrcy4KKworSWYgaW50ZXJuYWwgYXV0aGVudGljYXRpb24gaGFzIG5vdCBiZWVuIHNldCB1cCBvciB0aGUgcm9sZSBkb2VzIG5vdCBoYXZlCitgTE9HSU5gIHByaXZpbGVnZXMsIHRoZSBgV0lUSCBQQVNTV09SRGAgY2xhdXNlIGlzIG5vdCBuZWNlc3NhcnkuCisKK1VTRSBgV0lUSCBIQVNIRUQgUEFTU1dPUkRgIHRvIHByb3ZpZGUgdGhlIGpCY3J5cHQgaGFzaGVkIHBhc3N3b3JkIGRpcmVjdGx5LiBTZWUgdGhlIGBoYXNoX3Bhc3N3b3JkYCB0b29sLgorCis9PT09IFJlc3RyaWN0aW5nIGNvbm5lY3Rpb25zIHRvIHNwZWNpZmljIGRhdGFjZW50ZXJzCisKK0lmIGEgYG5ldHdvcmtfYXV0aG9yaXplcmAgaGFzIGJlZW4gY29uZmlndXJlZCwgeW91IGNhbiByZXN0cmljdCBsb2dpbgorcm9sZXMgdG8gc3BlY2lmaWMgZGF0YWNlbnRlcnMgd2l0aCB0aGUgYEFDQ0VTUyBUTyBEQVRBQ0VOVEVSU2AgY2xhdXNlCitmb2xsb3dlZCBieSBhIHNldCBsaXRlcmFsIG9mIGRhdGFjZW50ZXJzIHRoZSB1c2VyIGNhbiBhY2Nlc3MuIE5vdAorc3BlY2lmaXlpbmcgZGF0YWNlbnRlcnMgaW1wbGljaXRseSBncmFudHMgYWNjZXNzIHRvIGFsbCBkYXRhY2VudGVycy4gVGhlCitjbGF1c2UgYEFDQ0VTUyBUTyBBTEwgREFUQUNFTlRFUlNgIGNhbiBiZSB1c2VkIGZvciBleHBsaWNpdG5lc3MsIGJ1dAordGhlcmUncyBubyBmdW5jdGlvbmFsIGRpZmZlcmVuY2UuCisKKz09PT0gQ3JlYXRpbmcgYSByb2xlIGNvbmRpdGlvbmFsbHkKKworQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gZXhpc3Rpbmcgcm9sZSByZXN1bHRzIGluIGFuIGludmFsaWQgcXVlcnkKK2NvbmRpdGlvbiB1bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgdGhlIG9wdGlvbiBpcwordXNlZCBhbmQgdGhlIHJvbGUgZXhpc3RzLCB0aGUgc3RhdGVtZW50IGlzIGEgbm8tb3A6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3JvbGVfaWZub3RleGlzdHMuY3FsW10KKy0tLS0KKworW1thbHRlci1yb2xlLXN0YXRlbWVudF1dCis9PT0gQUxURVIgUk9MRQorCitBbHRlcmluZyBhIHJvbGUgb3B0aW9ucyB1c2VzIHRoZSBgQUxURVIgUk9MRWAgc3RhdGVtZW50OgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9hbHRlcl9yb2xlX3N0YXRlbWVudC5ibmZbXQorLS0tLQorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9hbHRlcl9yb2xlLmNxbFtdCistLS0tCitJZiB0aGUgcm9sZSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisKK1VTRSBgV0lUSCBIQVNIRUQgUEFTU1dPUkRgIHRvIHByb3ZpZGUgdGhlIGpCY3J5cHQgaGFzaGVkIHBhc3N3b3JkIGRpcmVjdGx5LiBTZWUgdGhlIGBoYXNoX3Bhc3N3b3JkYCB0b29sLgorCis9PT09IFJlc3RyaWN0aW5nIGNvbm5lY3Rpb25zIHRvIHNwZWNpZmljIGRhdGFjZW50ZXJzCisKK0lmIGEgYG5ldHdvcmtfYXV0aG9yaXplcmAgaGFzIGJlZW4gY29uZmlndXJlZCwgeW91IGNhbiByZXN0cmljdCBsb2dpbgorcm9sZXMgdG8gc3BlY2lmaWMgZGF0YWNlbnRlcnMgd2l0aCB0aGUgYEFDQ0VTUyBUTyBEQVRBQ0VOVEVSU2AgY2xhdXNlCitmb2xsb3dlZCBieSBhIHNldCBsaXRlcmFsIG9mIGRhdGFjZW50ZXJzIHRoZSB1c2VyIGNhbiBhY2Nlc3MuIFRvIHJlbW92ZQorYW55IGRhdGEgY2VudGVyIHJlc3RyaWN0aW9ucywgdXNlIHRoZSBgQUNDRVNTIFRPIEFMTCBEQVRBQ0VOVEVSU2AKK2NsYXVzZS4KKworQ29uZGl0aW9ucyBvbiBleGVjdXRpbmcgYEFMVEVSIFJPTEVgIHN0YXRlbWVudHM6CisKKyogYSBjbGllbnQgbXVzdCBoYXZlIGBTVVBFUlVTRVJgIHN0YXR1cyB0byBhbHRlciB0aGUgYFNVUEVSVVNFUmAgc3RhdHVzCitvZiBhbm90aGVyIHJvbGUKKyogYSBjbGllbnQgY2Fubm90IGFsdGVyIHRoZSBgU1VQRVJVU0VSYCBzdGF0dXMgb2YgYW55IHJvbGUgaXQgY3VycmVudGx5Citob2xkcworKiBhIGNsaWVudCBjYW4gb25seSBtb2RpZnkgY2VydGFpbiBwcm9wZXJ0aWVzIG9mIHRoZSByb2xlIHdpdGggd2hpY2ggaXQKK2lkZW50aWZpZWQgYXQgbG9naW4gKGUuZy4gYFBBU1NXT1JEYCkKKyogdG8gbW9kaWZ5IHByb3BlcnRpZXMgb2YgYSByb2xlLCB0aGUgY2xpZW50IG11c3QgYmUgZ3JhbnRlZCBgQUxURVJgCitgcGVybWlzc2lvbiA8Y3FsLXBlcm1pc3Npb25zPmAgb24gdGhhdCByb2xlCisKK1tbZHJvcC1yb2xlLXN0YXRlbWVudF1dCis9PT0gRFJPUCBST0xFCisKK0Ryb3BwaW5nIGEgcm9sZSB1c2VzIHRoZSBgRFJPUCBST0xFYCBzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2Ryb3Bfcm9sZV9zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworYERST1AgUk9MRWAgcmVxdWlyZXMgdGhlIGNsaWVudCB0byBoYXZlIGBEUk9QYAorYHBlcm1pc3Npb24gPGNxbC1wZXJtaXNzaW9ucz5gIG9uIHRoZSByb2xlIGluIHF1ZXN0aW9uLiBJbiBhZGRpdGlvbiwKK2NsaWVudCBtYXkgbm90IGBEUk9QYCB0aGUgcm9sZSB3aXRoIHdoaWNoIGl0IGlkZW50aWZpZWQgYXQgbG9naW4uCitGaW5hbGx5LCBvbmx5IGEgY2xpZW50IHdpdGggYFNVUEVSVVNFUmAgc3RhdHVzIG1heSBgRFJPUGAgYW5vdGhlcgorYFNVUEVSVVNFUmAgcm9sZS4KKworQXR0ZW1wdGluZyB0byBkcm9wIGEgcm9sZSB3aGljaCBkb2VzIG5vdCBleGlzdCByZXN1bHRzIGluIGFuIGludmFsaWQKK3F1ZXJ5IGNvbmRpdGlvbiB1bmxlc3MgdGhlIGBJRiBFWElTVFNgIG9wdGlvbiBpcyB1c2VkLiBJZiB0aGUgb3B0aW9uIGlzCit1c2VkIGFuZCB0aGUgcm9sZSBkb2VzIG5vdCBleGlzdCB0aGUgc3RhdGVtZW50IGlzIGEgbm8tb3AuCisKK1tOT1RFXQorLk5vdGUKKz09PT0KK0RST1AgUk9MRSBpbnRlbnRpb25hbGx5IGRvZXMgbm90IHRlcm1pbmF0ZSBhbnkgb3BlbiB1c2VyIHNlc3Npb25zLgorQ3VycmVudGx5IGNvbm5lY3RlZCBzZXNzaW9ucyB3aWxsIHJlbWFpbiBjb25uZWN0ZWQgYW5kIHdpbGwgcmV0YWluIHRoZQorYWJpbGl0eSB0byBwZXJmb3JtIGFueSBkYXRhYmFzZSBhY3Rpb25zIHdoaWNoIGRvIG5vdCByZXF1aXJlCit4cmVmOmNxbC9zZWN1cml0eS5hZG9jI2F1dGhvcml6YXRpb25bYXV0aG9yaXphdGlvbl0uIAorSG93ZXZlciwgaWYgYXV0aG9yaXphdGlvbiBpcyBlbmFibGVkLCB4cmVmOmNxbC9zZWN1cml0eS5hZG9jI2NxbC1wZXJtaXNzaW9uc1twZXJtaXNzaW9uc10gb2YgdGhlIGRyb3BwZWQgcm9sZSBhcmUgYWxzbyByZXZva2VkLAorc3ViamVjdCB0byB0aGUgeHJlZjpjcWwvc2VjdXJpdHkuYWRvYyNhdXRoLWNhY2hpbmdbY2FjaGluZyBvcHRpb25zXSBjb25maWd1cmVkIGluIHhyZWY6Y3FsL2NvbmZpZ3VyaW5nLmFkb2MjY2Fzc2FuZHJhLnlhbWxbY2Fzc2FuZHJhLXlhbWxdIGZpbGUuIAorU2hvdWxkIGEgZHJvcHBlZCByb2xlIGJlIHN1YnNlcXVlbnRseSByZWNyZWF0ZWQgYW5kIGhhdmUgbmV3IHhyZWY6c2VjdXJpdHkuYWRvYyNncmFudC1wZXJtaXNzaW9uLXN0YXRlbWVudFtwZXJtaXNzaW9uc10gb3IKK3hyZWY6c2VjdXJpdHkuYWRvYyNncmFudC1yb2xlLXN0YXRlbWVudFtyb2xlc11gIGdyYW50ZWQgdG8gaXQsIGFueSBjbGllbnQgc2Vzc2lvbnMgc3RpbGwKK2Nvbm5lY3RlZCB3aWxsIGFjcXVpcmUgdGhlIG5ld2x5IGdyYW50ZWQgcGVybWlzc2lvbnMgYW5kIHJvbGVzLgorPT09PQorCitbW2dyYW50LXJvbGUtc3RhdGVtZW50XV0KKz09PSBHUkFOVCBST0xFCisKK0dyYW50aW5nIGEgcm9sZSB0byBhbm90aGVyIHVzZXMgdGhlIGBHUkFOVCBST0xFYCBzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2dyYW50X3JvbGVfc3RhdGVtZW50LmJuZltdCistLS0tCisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2dyYW50X3JvbGUuY3FsW10KKy0tLS0KKworVGhpcyBzdGF0ZW1lbnQgZ3JhbnRzIHRoZSBgcmVwb3J0X3dyaXRlcmAgcm9sZSB0byBgYWxpY2VgLiBBbnkKK3Blcm1pc3Npb25zIGdyYW50ZWQgdG8gYHJlcG9ydF93cml0ZXJgIGFyZSBhbHNvIGFjcXVpcmVkIGJ5IGBhbGljZWAuCisKK1JvbGVzIGFyZSBtb2RlbGxlZCBhcyBhIGRpcmVjdGVkIGFjeWNsaWMgZ3JhcGgsIHNvIGNpcmN1bGFyIGdyYW50cyBhcmUKK25vdCBwZXJtaXR0ZWQuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgcmVzdWx0IGluIGVycm9yIGNvbmRpdGlvbnM6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvcm9sZV9lcnJvci5jcWxbXQorLS0tLQorCitbW3Jldm9rZS1yb2xlLXN0YXRlbWVudF1dCis9PT0gUkVWT0tFIFJPTEUKKworUmV2b2tpbmcgYSByb2xlIHVzZXMgdGhlIGBSRVZPS0UgUk9MRWAgc3RhdGVtZW50OgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9yZXZva2Vfcm9sZV9zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvcmV2b2tlX3JvbGUuY3FsW10KKy0tLS0KKworVGhpcyBzdGF0ZW1lbnQgcmV2b2tlcyB0aGUgYHJlcG9ydF93cml0ZXJgIHJvbGUgZnJvbSBgYWxpY2VgLiBBbnkKK3Blcm1pc3Npb25zIHRoYXQgYGFsaWNlYCBoYXMgYWNxdWlyZWQgdmlhIHRoZSBgcmVwb3J0X3dyaXRlcmAgcm9sZSBhcmUKK2Fsc28gcmV2b2tlZC4KKworW1tsaXN0LXJvbGVzLXN0YXRlbWVudF1dCis9PT0gTElTVCBST0xFUworCitBbGwgdGhlIGtub3duIHJvbGVzIChpbiB0aGUgc3lzdGVtIG9yIGdyYW50ZWQgdG8gc3BlY2lmaWMgcm9sZSkgY2FuIGJlCitsaXN0ZWQgdXNpbmcgdGhlIGBMSVNUIFJPTEVTYCBzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2xpc3Rfcm9sZXNfc3RhdGVtZW50LmJuZltdCistLS0tCisKK0ZvciBpbnN0YW5jZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9saXN0X3JvbGVzLmNxbFtdCistLS0tCisKK3JldHVybnMgYWxsIGtub3duIHJvbGVzIGluIHRoZSBzeXN0ZW0sIHRoaXMgcmVxdWlyZXMgYERFU0NSSUJFYAorcGVybWlzc2lvbiBvbiB0aGUgZGF0YWJhc2Ugcm9sZXMgcmVzb3VyY2UuIAorCitUaGlzIGV4YW1wbGUgZW51bWVyYXRlcyBhbGwgcm9sZXMgZ3JhbnRlZCB0byBgYWxpY2VgLCBpbmNsdWRpbmcgdGhvc2UgdHJhbnNpdGl2ZWx5CithY3F1aXJlZDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9saXN0X3JvbGVzX29mLmNxbFtdCistLS0tCisKK1RoaXMgZXhhbXBsZSBsaXN0cyBhbGwgcm9sZXMgZGlyZWN0bHkgZ3JhbnRlZCB0byBgYm9iYCB3aXRob3V0IGluY2x1ZGluZyBhbnkgb2YgdGhlCit0cmFuc2l0aXZlbHkgYWNxdWlyZWQgb25lczoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9saXN0X3JvbGVzX25vbnJlY3Vyc2l2ZS5jcWxbXQorLS0tLQorCis9PSBVc2VycworCitQcmlvciB0byB0aGUgaW50cm9kdWN0aW9uIG9mIHJvbGVzIGluIENhc3NhbmRyYSAyLjIsIGF1dGhlbnRpY2F0aW9uIGFuZAorYXV0aG9yaXphdGlvbiB3ZXJlIGJhc2VkIGFyb3VuZCB0aGUgY29uY2VwdCBvZiBhIGBVU0VSYC4gRm9yIGJhY2t3YXJkCitjb21wYXRpYmlsaXR5LCB0aGUgbGVnYWN5IHN5bnRheCBoYXMgYmVlbiBwcmVzZXJ2ZWQgd2l0aCBgVVNFUmAgY2VudHJpYworc3RhdGVtZW50cyBiZWNvbWluZyBzeW5vbnltcyBmb3IgdGhlIGBST0xFYCBiYXNlZCBlcXVpdmFsZW50cy4gSW4gb3RoZXIKK3dvcmRzLCBjcmVhdGluZy91cGRhdGluZyBhIHVzZXIgaXMganVzdCBhIGRpZmZlcmVudCBzeW50YXggZm9yCitjcmVhdGluZy91cGRhdGluZyBhIHJvbGUuCisKK1tbY3JlYXRlLXVzZXItc3RhdGVtZW50XV0KKz09PSBDUkVBVEUgVVNFUgorCitDcmVhdGluZyBhIHVzZXIgdXNlcyB0aGUgYENSRUFURSBVU0VSYCBzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2NyZWF0ZV91c2VyX3N0YXRlbWVudC5ibmZbXQorLS0tLQorCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfdXNlci5jcWxbXQorLS0tLQorCitUaGUgYENSRUFURSBVU0VSYCBjb21tYW5kIGlzIGVxdWl2YWxlbnQgdG8gYENSRUFURSBST0xFYCB3aGVyZSB0aGUgYExPR0lOYCBvcHRpb24gaXMgYHRydWVgLiAKK1NvLCB0aGUgZm9sbG93aW5nIHBhaXJzIG9mIHN0YXRlbWVudHMgYXJlIGVxdWl2YWxlbnQ6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3VzZXJfcm9sZS5jcWxbXQorLS0tLQorCitbW2FsdGVyLXVzZXItc3RhdGVtZW50XV0KKz09PSBBTFRFUiBVU0VSCisKK0FsdGVyaW5nIHRoZSBvcHRpb25zIG9mIGEgdXNlciB1c2VzIHRoZSBgQUxURVIgVVNFUmAgc3RhdGVtZW50OgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9hbHRlcl91c2VyX3N0YXRlbWVudC5ibmZbXQorLS0tLQorSWYgdGhlIHJvbGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvYWx0ZXJfdXNlci5jcWxbXQorLS0tLQorCitbW2Ryb3AtdXNlci1zdGF0ZW1lbnRdXQorPT09IERST1AgVVNFUgorCitEcm9wcGluZyBhIHVzZXIgdXNlcyB0aGUgYERST1AgVVNFUmAgc3RhdGVtZW50OgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9kcm9wX3VzZXJfc3RhdGVtZW50LmJuZltdCistLS0tCisKK1tbbGlzdC11c2Vycy1zdGF0ZW1lbnRdXQorPT09IExJU1QgVVNFUlMKKworRXhpc3RpbmcgdXNlcnMgY2FuIGJlIGxpc3RlZCB1c2luZyB0aGUgYExJU1QgVVNFUlNgIHN0YXRlbWVudDoKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvbGlzdF91c2Vyc19zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworTm90ZSB0aGF0IHRoaXMgc3RhdGVtZW50IGlzIGVxdWl2YWxlbnQgdG8geHJlZjpzZWN1cml0eS5hZG9jI2xpc3Qtcm9sZXMtc3RhdGVtZW50W2BMSVNUIFJPTEVTXSwgYnV0IG9ubHkgcm9sZXMgd2l0aCB0aGUgYExPR0lOYCBwcml2aWxlZ2UgYXJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCisKKz09IERhdGEgQ29udHJvbAorCitbW2NxbC1wZXJtaXNzaW9uc11dCis9PT0gUGVybWlzc2lvbnMKKworUGVybWlzc2lvbnMgb24gcmVzb3VyY2VzIGFyZSBncmFudGVkIHRvIHJvbGVzOyB0aGVyZSBhcmUgc2V2ZXJhbAorZGlmZmVyZW50IHR5cGVzIG9mIHJlc291cmNlcyBpbiBDYXNzYW5kcmEgYW5kIGVhY2ggdHlwZSBpcyBtb2RlbGxlZAoraGllcmFyY2hpY2FsbHk6CisKKyogVGhlIGhpZXJhcmNoeSBvZiBEYXRhIHJlc291cmNlcywgS2V5c3BhY2VzIGFuZCBUYWJsZXMgaGFzIHRoZQorc3RydWN0dXJlIGBBTEwgS0VZU1BBQ0VTYCAtPiBgS0VZU1BBQ0VgIC0+IGBUQUJMRWAuCisqIEZ1bmN0aW9uIHJlc291cmNlcyBoYXZlIHRoZSBzdHJ1Y3R1cmUgYEFMTCBGVU5DVElPTlNgIC0+IGBLRVlTUEFDRWAgLT4KK2BGVU5DVElPTmAKKyogUmVzb3VyY2VzIHJlcHJlc2VudGluZyByb2xlcyBoYXZlIHRoZSBzdHJ1Y3R1cmUgYEFMTCBST0xFU2AgLT4gYFJPTEVgCisqIFJlc291cmNlcyByZXByZXNlbnRpbmcgSk1YIE9iamVjdE5hbWVzLCB3aGljaCBtYXAgdG8gc2V0cyBvZgorTUJlYW5zL01YQmVhbnMsIGhhdmUgdGhlIHN0cnVjdHVyZSBgQUxMIE1CRUFOU2AgLT4gYE1CRUFOYAorCitQZXJtaXNzaW9ucyBjYW4gYmUgZ3JhbnRlZCBhdCBhbnkgbGV2ZWwgb2YgdGhlc2UgaGllcmFyY2hpZXMgYW5kIHRoZXkKK2Zsb3cgZG93bndhcmRzLiBTbyBncmFudGluZyBhIHBlcm1pc3Npb24gb24gYSByZXNvdXJjZSBoaWdoZXIgdXAgdGhlCitjaGFpbiBhdXRvbWF0aWNhbGx5IGdyYW50cyB0aGF0IHNhbWUgcGVybWlzc2lvbiBvbiBhbGwgcmVzb3VyY2VzIGxvd2VyCitkb3duLiBGb3IgZXhhbXBsZSwgZ3JhbnRpbmcgYFNFTEVDVGAgb24gYSBgS0VZU1BBQ0VgIGF1dG9tYXRpY2FsbHkKK2dyYW50cyBpdCBvbiBhbGwgYFRBQkxFU2AgaW4gdGhhdCBgS0VZU1BBQ0VgLiBMaWtld2lzZSwgZ3JhbnRpbmcgYQorcGVybWlzc2lvbiBvbiBgQUxMIEZVTkNUSU9OU2AgZ3JhbnRzIGl0IG9uIGV2ZXJ5IGRlZmluZWQgZnVuY3Rpb24sCityZWdhcmRsZXNzIG9mIHdoaWNoIGtleXNwYWNlIGl0IGlzIHNjb3BlZCBpbi4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0bworZ3JhbnQgcGVybWlzc2lvbnMgb24gYWxsIGZ1bmN0aW9ucyBzY29wZWQgdG8gYSBwYXJ0aWN1bGFyIGtleXNwYWNlLgorCitNb2RpZmljYXRpb25zIHRvIHBlcm1pc3Npb25zIGFyZSB2aXNpYmxlIHRvIGV4aXN0aW5nIGNsaWVudCBzZXNzaW9uczsKK3RoYXQgaXMsIGNvbm5lY3Rpb25zIG5lZWQgbm90IGJlIHJlLWVzdGFibGlzaGVkIGZvbGxvd2luZyBwZXJtaXNzaW9ucworY2hhbmdlcy4KKworVGhlIGZ1bGwgc2V0IG9mIGF2YWlsYWJsZSBwZXJtaXNzaW9ucyBpczoKKworKiBgQ1JFQVRFYAorKiBgQUxURVJgCisqIGBEUk9QYAorKiBgU0VMRUNUYAorKiBgTU9ESUZZYAorKiBgQVVUSE9SSVpFYAorKiBgREVTQ1JJQkVgCisqIGBFWEVDVVRFYAorKiBgVU5NQVNLYAorKiBgU0VMRUNUX01BU0tFRGAKKworTm90IGFsbCBwZXJtaXNzaW9ucyBhcmUgYXBwbGljYWJsZSB0byBldmVyeSB0eXBlIG9mIHJlc291cmNlLiBGb3IKK2luc3RhbmNlLCBgRVhFQ1VURWAgaXMgb25seSByZWxldmFudCBpbiB0aGUgY29udGV4dCBvZiBmdW5jdGlvbnMgb3IKK21iZWFuczsgZ3JhbnRpbmcgYEVYRUNVVEVgIG9uIGEgcmVzb3VyY2UgcmVwcmVzZW50aW5nIGEgdGFibGUgaXMKK25vbnNlbnNpY2FsLiBBdHRlbXB0aW5nIHRvIGBHUkFOVGAgYSBwZXJtaXNzaW9uIG9uIHJlc291cmNlIHRvIHdoaWNoIGl0CitjYW5ub3QgYmUgYXBwbGllZCByZXN1bHRzIGluIGFuIGVycm9yIHJlc3BvbnNlLiBUaGUgZm9sbG93aW5nCitpbGx1c3RyYXRlcyB3aGljaCBwZXJtaXNzaW9ucyBjYW4gYmUgZ3JhbnRlZCBvbiB3aGljaCB0eXBlcyBvZiByZXNvdXJjZSwKK2FuZCB3aGljaCBzdGF0ZW1lbnRzIGFyZSBlbmFibGVkIGJ5IHRoYXQgcGVybWlzc2lvbi4KKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xQZXJtaXNzaW9uIHxSZXNvdXJjZSB8T3BlcmF0aW9ucworCit8IGBDUkVBVEVgIHwgYEFMTCBLRVlTUEFDRVNgIHwgYENSRUFURSBLRVlTUEFDRWAgYW5kIGBDUkVBVEUgVEFCTEVgIGluIGFueSBrZXlzcGFjZQorCit8IGBDUkVBVEVgIHwgYEtFWVNQQUNFYCB8IGBDUkVBVEUgVEFCTEVgIGluIHNwZWNpZmllZCBrZXlzcGFjZQorCit8IGBDUkVBVEVgIHwgYEFMTCBGVU5DVElPTlNgIHwgYENSRUFURSBGVU5DVElPTmAgaW4gYW55IGtleXNwYWNlIGFuZCBgQ1JFQVRFIEFHR1JFR0FURWAgaW4gYW55IGtleXNwYWNlCisKK3wgYENSRUFURWAgfCBgQUxMIEZVTkNUSU9OUyBJTiBLRVlTUEFDRWAgfCBgQ1JFQVRFIEZVTkNUSU9OYCBhbmQgYENSRUFURSBBR0dSRUdBVEVgIGluIHNwZWNpZmllZCBrZXlzcGFjZQorCit8IGBDUkVBVEVgIHwgYEFMTCBST0xFU2AgfCBgQ1JFQVRFIFJPTEVgCisKK3wgYEFMVEVSYCB8IGBBTEwgS0VZU1BBQ0VTYCB8IGBBTFRFUiBLRVlTUEFDRWAgYW5kIGBBTFRFUiBUQUJMRWAgaW4gYW55IGtleXNwYWNlCisKK3wgYEFMVEVSYCB8IGBLRVlTUEFDRWAgfCBgQUxURVIgS0VZU1BBQ0VgIGFuZCBgQUxURVIgVEFCTEVgIGluIHNwZWNpZmllZCBrZXlzcGFjZSAKKworfCBgQUxURVJgIHwgYFRBQkxFYCB8IGBBTFRFUiBUQUJMRWAKKworfCBgQUxURVJgIHwgYEFMTCBGVU5DVElPTlNgIHwgYENSRUFURSBGVU5DVElPTmAgYW5kIGBDUkVBVEUgQUdHUkVHQVRFYDogcmVwbGFjaW5nIGFueSBleGlzdGluZworCit8IGBBTFRFUmAgfCBgQUxMIEZVTkNUSU9OUyBJTiBLRVlTUEFDRWAgfCBgQ1JFQVRFIEZVTkNUSU9OYCBhbmQgYENSRUFURSBBR0dSRUdBVEVgOiByZXBsYWNpbmcgZXhpc3RpbmcgaW4gc3BlY2lmaWVkIGtleXNwYWNlCisKK3wgYEFMVEVSYCB8IGBGVU5DVElPTmAgfCBgQ1JFQVRFIEZVTkNUSU9OYCBhbmQgYENSRUFURSBBR0dSRUdBVEVgOiByZXBsYWNpbmcgZXhpc3RpbmcKKworfCBgQUxURVJgIHwgYEFMTCBST0xFU2AgfCBgQUxURVIgUk9MRWAgb24gYW55IHJvbGUKKworfCBgQUxURVJgIHwgYFJPTEVgIHwgYEFMVEVSIFJPTEVgCisKK3wgYERST1BgIHwgYEFMTCBLRVlTUEFDRVNgIHwgYERST1AgS0VZU1BBQ0VgIGFuZCBgRFJPUCBUQUJMRWAgaW4gYW55IGtleXNwYWNlCisKK3wgYERST1BgIHwgYEtFWVNQQUNFYCB8IGBEUk9QIFRBQkxFYCBpbiBzcGVjaWZpZWQga2V5c3BhY2UKKworfCBgRFJPUGAgfCBgVEFCTEVgIHwgYERST1AgVEFCTEVgCisKK3wgYERST1BgIHwgYEFMTCBGVU5DVElPTlNgIHwgYERST1AgRlVOQ1RJT05gIGFuZCBgRFJPUCBBR0dSRUdBVEVgIGluIGFueSBrZXlzcGFjZQorCit8IGBEUk9QYCB8IGBBTEwgRlVOQ1RJT05TIElOIEtFWVNQQUNFYCB8IGBEUk9QIEZVTkNUSU9OYCBhbmQgYERST1AgQUdHUkVHQVRFYCBpbiBzcGVjaWZpZWQga2V5c3BhY2UKKworfCBgRFJPUGAgfCBgRlVOQ1RJT05gIHwgYERST1AgRlVOQ1RJT05gCisKK3wgYERST1BgIHwgYEFMTCBST0xFU2AgfCBgRFJPUCBST0xFYCBvbiBhbnkgcm9sZQorCit8IGBEUk9QYCB8IGBST0xFYCB8IGBEUk9QIFJPTEVgCisKK3wgYFNFTEVDVGAgfCBgQUxMIEtFWVNQQUNFU2AgfCBgU0VMRUNUYCBvbiBhbnkgdGFibGUKKworfCBgU0VMRUNUYCB8IGBLRVlTUEFDRWAgfCBgU0VMRUNUYCBvbiBhbnkgdGFibGUgaW4gc3BlY2lmaWVkIGtleXNwYWNlCisKK3wgYFNFTEVDVGAgfCBgVEFCTEVgIHwgYFNFTEVDVGAgb24gc3BlY2lmaWVkIHRhYmxlCisKK3wgYFNFTEVDVGAgfCBgQUxMIE1CRUFOU2AgfCBDYWxsIGdldHRlciBtZXRob2RzIG9uIGFueSBtYmVhbgorCit8IGBTRUxFQ1RgIHwgYE1CRUFOU2AgfCBDYWxsIGdldHRlciBtZXRob2RzIG9uIGFueSBtYmVhbiBtYXRjaGluZyBhIHdpbGRjYXJkIHBhdHRlcm4gCisKK3wgYFNFTEVDVGAgfCBgTUJFQU5gIHwgQ2FsbCBnZXR0ZXIgbWV0aG9kcyBvbiBuYW1lZCBtYmVhbgorCit8IGBNT0RJRllgIHwgYEFMTCBLRVlTUEFDRVNgIHwgYElOU0VSVGAsIGBVUERBVEVgLCBgREVMRVRFYCBhbmQgYFRSVU5DQVRFYCBvbiBhbnkgdGFibGUKKworfCBgTU9ESUZZYCB8IGBLRVlTUEFDRWAgfCBgSU5TRVJUYCwgYFVQREFURWAsIGBERUxFVEVgIGFuZCBgVFJVTkNBVEVgIG9uIGFueSB0YWJsZSBpbiBzcGVjaWZpZWQKK2tleXNwYWNlCisKK3wgYE1PRElGWWAgfCBgVEFCTEVgIHwgYElOU0VSVGAsIGBVUERBVEVgLCBgREVMRVRFYCBhbmQgYFRSVU5DQVRFYCBvbiBzcGVjaWZpZWQgdGFibGUKKworfCBgTU9ESUZZYCB8IGBBTEwgTUJFQU5TYCB8IENhbGwgc2V0dGVyIG1ldGhvZHMgb24gYW55IG1iZWFuCisKK3wgYE1PRElGWWAgfCBgTUJFQU5TYCB8IENhbGwgc2V0dGVyIG1ldGhvZHMgb24gYW55IG1iZWFuIG1hdGNoaW5nIGEgd2lsZGNhcmQgcGF0dGVybgorCit8IGBNT0RJRllgIHwgYE1CRUFOYCB8IENhbGwgc2V0dGVyIG1ldGhvZHMgb24gbmFtZWQgbWJlYW4KKworfCBgQVVUSE9SSVpFYCB8IGBBTEwgS0VZU1BBQ0VTYCB8IGBHUkFOVCBQRVJNSVNTSU9OYCBhbmQgYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBhbnkgdGFibGUKKworfCBgQVVUSE9SSVpFYCB8IGBLRVlTUEFDRWAgfCBgR1JBTlQgUEVSTUlTU0lPTmAgYW5kIGBSRVZPS0UgUEVSTUlTU0lPTmAgb24gYW55IHRhYmxlIGluIHNwZWNpZmllZCBrZXlzcGFjZQorCit8IGBBVVRIT1JJWkVgIHwgYFRBQkxFYCB8IGBHUkFOVCBQRVJNSVNTSU9OYCBhbmQgYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBzcGVjaWZpZWQgdGFibGUKKworfCBgQVVUSE9SSVpFYCB8IGBBTEwgRlVOQ1RJT05TYCB8IGBHUkFOVCBQRVJNSVNTSU9OYCBhbmQgYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBhbnkgZnVuY3Rpb24KKworfCBgQVVUSE9SSVpFYCB8IGBBTEwgRlVOQ1RJT05TIElOIEtFWVNQQUNFYCB8IGBHUkFOVCBQRVJNSVNTSU9OYCBhbmQgYFJFVk9LRSBQRVJNSVNTSU9OYCBpbiBzcGVjaWZpZWQga2V5c3BhY2UKKworfCBgQVVUSE9SSVpFYCB8IGBGVU5DVElPTmAgfCBgR1JBTlQgUEVSTUlTU0lPTmAgYW5kIGBSRVZPS0UgUEVSTUlTU0lPTmAgb24gc3BlY2lmaWVkIGZ1bmN0aW9uCisKK3wgYEFVVEhPUklaRWAgfCBgQUxMIE1CRUFOU2AgfCBgR1JBTlQgUEVSTUlTU0lPTmAgYW5kIGBSRVZPS0UgUEVSTUlTU0lPTmAgb24gYW55IG1iZWFuCisKK3wgYEFVVEhPUklaRWAgfCBgTUJFQU5TYCB8IGBHUkFOVCBQRVJNSVNTSU9OYCBhbmQgYFJFVk9LRSBQRVJNSVNTSU9OYCBvbiBhbnkgbWJlYW4gbWF0Y2hpbmcgYSB3aWxkY2FyZCBwYXR0ZXJuCisKK3wgYEFVVEhPUklaRWAgfCBgTUJFQU5gIHwgYEdSQU5UIFBFUk1JU1NJT05gIGFuZCBgUkVWT0tFIFBFUk1JU1NJT05gIG9uIG5hbWVkIG1iZWFuCisKK3wgYEFVVEhPUklaRWAgfCBgQUxMIFJPTEVTYCB8IGBHUkFOVCBST0xFYCBhbmQgYFJFVk9LRSBST0xFYCBvbiBhbnkgcm9sZQorCit8IGBBVVRIT1JJWkVgIHwgYFJPTEVTYCB8IGBHUkFOVCBST0xFYCBhbmQgYFJFVk9LRSBST0xFYCBvbiBzcGVjaWZpZWQgcm9sZXMKKworfCBgREVTQ1JJQkVgIHwgYEFMTCBST0xFU2AgfCBgTElTVCBST0xFU2Agb24gYWxsIHJvbGVzIG9yIG9ubHkgcm9sZXMgZ3JhbnRlZCB0byBhbm90aGVyLCBzcGVjaWZpZWQgcm9sZQorCit8IGBERVNDUklCRWAgfCBgQUxMIE1CRUFOU2AgfCBSZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBhbnkgbWJlYW4gZnJvbSB0aGUgcGxhdGZvcm0ncyBNQmVhblNlcnZlcgorCisKK3wgYERFU0NSSUJFYCB8IGBNQkVBTlNgIHwgUmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgYW55IG1iZWFuIG1hdGNoaW5nIGEgd2lsZGNhcmQgcGF0dGVyIGZyb20gdGhlCitwbGF0Zm9ybSdzIE1CZWFuU2VydmVyCisKK3wgYERFU0NSSUJFYCB8IGBNQkVBTmAgfCBSZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBhIG5hbWVkIG1iZWFuIGZyb20gdGhlIHBsYXRmb3JtJ3MgTUJlYW5TZXJ2ZXIKKworfCBgRVhFQ1VURWAgfCBgQUxMIEZVTkNUSU9OU2AgfCBgU0VMRUNUYCwgYElOU0VSVGAgYW5kIGBVUERBVEVgIHVzaW5nIGFueSBmdW5jdGlvbiwgYW5kIHVzZSBvZiBhbnkKK2Z1bmN0aW9uIGluIGBDUkVBVEUgQUdHUkVHQVRFYAorCit8IGBFWEVDVVRFYCB8IGBBTEwgRlVOQ1RJT05TIElOIEtFWVNQQUNFYCB8IGBTRUxFQ1RgLCBgSU5TRVJUYCBhbmQgYFVQREFURWAgdXNpbmcgYW55IGZ1bmN0aW9uIGluIHNwZWNpZmllZCBrZXlzcGFjZQorYW5kIHVzZSBvZiBhbnkgZnVuY3Rpb24gaW4ga2V5c3BhY2UgaW4gYENSRUFURSBBR0dSRUdBVEVgCisKK3wgYEVYRUNVVEVgIHwgYEZVTkNUSU9OYCB8IGBTRUxFQ1RgLCBgSU5TRVJUYCBhbmQgYFVQREFURWAgdXNpbmcgc3BlY2lmaWVkIGZ1bmN0aW9uIGFuZCB1c2Ugb2YgdGhlIGZ1bmN0aW9uIGluIGBDUkVBVEUgQUdHUkVHQVRFYAorCit8IGBFWEVDVVRFYCB8IGBBTEwgTUJFQU5TYCB8IEV4ZWN1dGUgb3BlcmF0aW9ucyBvbiBhbnkgbWJlYW4KKworfCBgRVhFQ1VURWAgfCBgTUJFQU5TYCB8IEV4ZWN1dGUgb3BlcmF0aW9ucyBvbiBhbnkgbWJlYW4gbWF0Y2hpbmcgYSB3aWxkY2FyZCBwYXR0ZXJuCisKK3wgYEVYRUNVVEVgIHwgYE1CRUFOYCB8IEV4ZWN1dGUgb3BlcmF0aW9ucyBvbiBuYW1lZCBtYmVhbgorCit8YFVOTUFTS2AgfGBBTEwgS0VZU1BBQ0VTYCB8IFNlZSB0aGUgY2xlYXIgY29udGVudHMgb2YgbWFza2VkIGNvbHVtbnMgb24gYW55IHRhYmxlCisKK3xgVU5NQVNLYCB8YEtFWVNQQUNFYCB8IFNlZSB0aGUgY2xlYXIgY29udGVudHMgb2YgbWFza2VkIGNvbHVtbnMgb24gYW55IHRhYmxlIGluIGtleXNwYWNlCisKK3xgVU5NQVNLYCB8YFRBQkxFYCB8IFNlZSB0aGUgY2xlYXIgY29udGVudHMgb2YgbWFza2VkIGNvbHVtbnMgb24gdGhlIHNwZWNpZmllZCB0YWJsZQorCit8YFNFTEVDVF9NQVNLRURgIHwgYEFMTCBLRVlTUEFDRVNgIHwgYFNFTEVDVGAgcmVzdHJpY3RpbmcgbWFza2VkIGNvbHVtbnMgb24gYW55IHRhYmxlCisKK3xgU0VMRUNUX01BU0tFRGAgfCBgS0VZU1BBQ0VgIHwgYFNFTEVDVGAgcmVzdHJpY3RpbmcgbWFza2VkIGNvbHVtbnMgb24gYW55IHRhYmxlIGluIHNwZWNpZmllZCBrZXlzcGFjZQorCit8YFNFTEVDVF9NQVNLRURgIHwgYFRBQkxFYCB8IGBTRUxFQ1RgIHJlc3RyaWN0aW5nIG1hc2tlZCBjb2x1bW5zIG9uIHRoZSBzcGVjaWZpZWQgdGFibGUKK3w9PT0KKworW1tncmFudC1wZXJtaXNzaW9uLXN0YXRlbWVudF1dCis9PT0gR1JBTlQgUEVSTUlTU0lPTgorCitHcmFudGluZyBhIHBlcm1pc3Npb24gdXNlcyB0aGUgYEdSQU5UIFBFUk1JU1NJT05gIHN0YXRlbWVudDoKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvZ3JhbnRfcGVybWlzc2lvbl9zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvZ3JhbnRfcGVybS5jcWxbXQorLS0tLQorCitUaGlzIGV4YW1wbGUgZ2l2ZXMgYW55IHVzZXIgd2l0aCB0aGUgcm9sZSBgZGF0YV9yZWFkZXJgIHBlcm1pc3Npb24gdG8gZXhlY3V0ZQorYFNFTEVDVGAgc3RhdGVtZW50cyBvbiBhbnkgdGFibGUgYWNyb3NzIGFsbCBrZXlzcGFjZXM6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvZ3JhbnRfbW9kaWZ5LmNxbFtdCistLS0tCisKK1RvIGdpdmUgYW55IHVzZXIgd2l0aCB0aGUgcm9sZSBgZGF0YV93cml0ZXJgIHBlcm1pc3Npb24gdG8gcGVyZm9ybQorYFVQREFURWAsIGBJTlNFUlRgLCBgVVBEQVRFYCwgYERFTEVURWAgYW5kIGBUUlVOQ0FURWAgcXVlcmllcyBvbiBhbGwKK3RhYmxlcyBpbiB0aGUgYGtleXNwYWNlMWAga2V5c3BhY2U6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvZ3JhbnRfZHJvcC5jcWxbXQorLS0tLQorCitUbyBnaXZlIGFueSB1c2VyIHdpdGggdGhlIGBzY2hlbWFfb3duZXJgIHJvbGUgcGVybWlzc2lvbnMgdG8gYERST1BgIGEgc3BlY2lmaWMKK2BrZXlzcGFjZTEudGFibGUxYDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9ncmFudF9leGVjdXRlLmNxbFtdCistLS0tCisKK1RoaXMgY29tbWFuZCBncmFudHMgYW55IHVzZXIgd2l0aCB0aGUgYHJlcG9ydF93cml0ZXJgIHJvbGUgcGVybWlzc2lvbiB0byBleGVjdXRlCitgU0VMRUNUYCwgYElOU0VSVGAgYW5kIGBVUERBVEVgIHF1ZXJpZXMgd2hpY2ggdXNlIHRoZSBmdW5jdGlvbgorYGtleXNwYWNlMS51c2VyX2Z1bmN0aW9uKCBpbnQgKWA6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvZ3JhbnRfZGVzY3JpYmUuY3FsW10KKy0tLS0KKworVGhpcyBncmFudHMgYW55IHVzZXIgd2l0aCB0aGUgYHJvbGVfYWRtaW5gIHJvbGUgcGVybWlzc2lvbiB0byB2aWV3IGFueQorYW5kIGFsbCByb2xlcyBpbiB0aGUgc3lzdGVtIHdpdGggYSBgTElTVCBST0xFU2Agc3RhdGVtZW50LgorCis9PT09IEdSQU5UIEFMTAorCitXaGVuIHRoZSBgR1JBTlQgQUxMYCBmb3JtIGlzIHVzZWQsIHRoZSBhcHByb3ByaWF0ZSBzZXQgb2YgcGVybWlzc2lvbnMgaXMKK2RldGVybWluZWQgYXV0b21hdGljYWxseSBiYXNlZCBvbiB0aGUgdGFyZ2V0IHJlc291cmNlLgorCis9PT09IEF1dG9tYXRpYyBHcmFudGluZworCitXaGVuIGEgcmVzb3VyY2UgaXMgY3JlYXRlZCwgdmlhIGEgYENSRUFURSBLRVlTUEFDRWAsIGBDUkVBVEUgVEFCTEVgLAorYENSRUFURSBGVU5DVElPTmAsIGBDUkVBVEUgQUdHUkVHQVRFYCBvciBgQ1JFQVRFIFJPTEVgIHN0YXRlbWVudCwgdGhlCitjcmVhdG9yICh0aGUgcm9sZSB0aGUgZGF0YWJhc2UgdXNlciB3aG8gaXNzdWVzIHRoZSBzdGF0ZW1lbnQgaXMKK2lkZW50aWZpZWQgYXMpLCBpcyBhdXRvbWF0aWNhbGx5IGdyYW50ZWQgYWxsIGFwcGxpY2FibGUgcGVybWlzc2lvbnMgb24KK3RoZSBuZXcgcmVzb3VyY2UuCisKK1tbcmV2b2tlLXBlcm1pc3Npb24tc3RhdGVtZW50XV0KKz09PSBSRVZPS0UgUEVSTUlTU0lPTgorCitSZXZva2luZyBhIHBlcm1pc3Npb24gZnJvbSBhIHJvbGUgdXNlcyB0aGUgYFJFVk9LRSBQRVJNSVNTSU9OYAorc3RhdGVtZW50OgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9yZXZva2VfcGVybWlzc2lvbl9zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvcmV2b2tlX3Blcm0uY3FsW10KKy0tLS0KKworQmVjYXVzZSBvZiB0aGVpciBmdW5jdGlvbiBpbiBub3JtYWwgZHJpdmVyIG9wZXJhdGlvbnMsIGNlcnRhaW4gdGFibGVzCitjYW5ub3QgaGF2ZSB0aGVpciBgU0VMRUNUYCBwZXJtaXNzaW9ucyByZXZva2VkLiBUaGUKK2ZvbGxvd2luZyB0YWJsZXMgd2lsbCBiZSBhdmFpbGFibGUgdG8gYWxsIGF1dGhvcml6ZWQgdXNlcnMgcmVnYXJkbGVzcyBvZgordGhlaXIgYXNzaWduZWQgcm9sZToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9ub19yZXZva2UuY3FsW10KKy0tLS0KKworW1tsaXN0LXBlcm1pc3Npb25zLXN0YXRlbWVudF1dCis9PT0gTElTVCBQRVJNSVNTSU9OUworCitMaXN0aW5nIGdyYW50ZWQgcGVybWlzc2lvbnMgdXNlcyB0aGUgYExJU1QgUEVSTUlTU0lPTlNgIHN0YXRlbWVudDoKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvbGlzdF9wZXJtaXNzaW9uc19zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvbGlzdF9wZXJtLmNxbFtdCistLS0tCisKK1Nob3cgYWxsIHBlcm1pc3Npb25zIGdyYW50ZWQgdG8gYGFsaWNlYCwgaW5jbHVkaW5nIHRob3NlIGFjcXVpcmVkCit0cmFuc2l0aXZlbHkgZnJvbSBhbnkgb3RoZXIgcm9sZXM6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvbGlzdF9hbGxfcGVybS5jcWxbXQorLS0tLQorCitTaG93IGFsbCBwZXJtaXNzaW9ucyBvbiBga2V5c3BhY2UxLnRhYmxlMWAgZ3JhbnRlZCB0byBgYm9iYCwgaW5jbHVkaW5nCit0aG9zZSBhY3F1aXJlZCB0cmFuc2l0aXZlbHkgZnJvbSBhbnkgb3RoZXIgcm9sZXMuIFRoaXMgYWxzbyBpbmNsdWRlcyBhbnkKK3Blcm1pc3Npb25zIGhpZ2hlciB1cCB0aGUgcmVzb3VyY2UgaGllcmFyY2h5IHdoaWNoIGNhbiBiZSBhcHBsaWVkIHRvCitga2V5c3BhY2UxLnRhYmxlMWAuIEZvciBleGFtcGxlLCBzaG91bGQgYGJvYmAgaGF2ZSBgQUxURVJgIHBlcm1pc3Npb24gb24KK2BrZXlzcGFjZTFgLCB0aGF0IHdvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzIG9mIHRoaXMgcXVlcnkuIEFkZGluZwordGhlIGBOT1JFQ1VSU0lWRWAgc3dpdGNoIHJlc3RyaWN0cyB0aGUgcmVzdWx0cyB0byBvbmx5IHRob3NlIHBlcm1pc3Npb25zCit3aGljaCB3ZXJlIGRpcmVjdGx5IGdyYW50ZWQgdG8gYGJvYmAgb3Igb25lIG9mIGBib2JgJ3Mgcm9sZXM6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvbGlzdF9zZWxlY3RfcGVybS5jcWxbXQorLS0tLQorCitTaG93IGFueSBwZXJtaXNzaW9ucyBncmFudGVkIHRvIGBjYXJsb3NgIG9yIGFueSBvZiBgY2FybG9zYCdzIHJvbGVzLAorbGltaXRlZCB0byBgU0VMRUNUYCBwZXJtaXNzaW9ucyBvbiBhbnkgcmVzb3VyY2UuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY3FsL3RyaWdnZXJzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvdHJpZ2dlcnMuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NxbC90cmlnZ2Vycy5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvdHJpZ2dlcnMuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL3R5cGVzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9jcWwvdHlwZXMuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTdkYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvY3FsL3R5cGVzLmFkb2MKQEAgLTAsMCArMSw1MzggQEAKKz0gRGF0YSBUeXBlcworCitDUUwgaXMgYSB0eXBlZCBsYW5ndWFnZSBhbmQgc3VwcG9ydHMgYSByaWNoIHNldCBvZiBkYXRhIHR5cGVzLCBpbmNsdWRpbmcKK3hyZWY6Y3FsL3R5cGVzLmFkb2MjbmF0aXZlLXR5cGVzW25hdGl2ZSB0eXBlc10sIHhyZWY6Y3FsL3R5cGVzLmFkb2MjY29sbGVjdGlvbnNbY29sbGVjdGlvbiB0eXBlc10sCit4cmVmOmNxbC90eXBlcy5hZG9jI3VkdHNbdXNlci1kZWZpbmVkIHR5cGVzXSwgeHJlZjpjcWwvdHlwZXMuYWRvYyN0dXBsZXNbdHVwbGUgdHlwZXNdLCBhbmQgeHJlZjpjcWwvdHlwZXMuYWRvYyNjdXN0b20tdHlwZXNbY3VzdG9tCit0eXBlc106CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2NxbF90eXBlLmJuZltdCistLS0tCisKKz09IE5hdGl2ZSB0eXBlcworCitUaGUgbmF0aXZlIHR5cGVzIHN1cHBvcnRlZCBieSBDUUwgYXJlOgorCitbc291cmNlLCBibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9uYXRpdmVfdHlwZS5ibmZbXQorLS0tLQorCitUaGUgZm9sbG93aW5nIHRhYmxlIGdpdmVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb25zIG9uIHRoZSBuYXRpdmUgZGF0YQordHlwZXMsIGFuZCBvbiB3aGljaCBraW5kIG9mIHhyZWY6Y3FsL2RlZmluaXRpb25zLmFkb2MjY29uc3RhbnRzW2NvbnN0YW50c10gZWFjaCB0eXBlIHN1cHBvcnRzOgorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfCBUeXBlIHwgQ29uc3RhbnRzIHN1cHBvcnRlZCB8IERlc2NyaXB0aW9uCisKK3wgYGFzY2lpYCB8IGBzdHJpbmdgIHwgQVNDSUkgY2hhcmFjdGVyIHN0cmluZworfCBgYmlnaW50YCB8IGBpbnRlZ2VyYCB8IDY0LWJpdCBzaWduZWQgbG9uZworfCBgYmxvYmAgfCBgYmxvYmAgfCBBcmJpdHJhcnkgYnl0ZXMgKG5vIHZhbGlkYXRpb24pCit8IGBib29sZWFuYCB8IGBib29sZWFuYCB8IEVpdGhlciBgdHJ1ZWAgb3IgYGZhbHNlYCAKK3wgYGNvdW50ZXJgIHwgYGludGVnZXJgIHwgQ291bnRlciBjb2x1bW4gKDY0LWJpdCBzaWduZWQgdmFsdWUpLiBTZWUgYGNvdW50ZXJzYCBmb3IgZGV0YWlscy4KK3wgYGRhdGVgIHwgYGludGVnZXJgLCBgc3RyaW5nYCB8IEEgZGF0ZSAod2l0aCBubyBjb3JyZXNwb25kaW5nIHRpbWUgdmFsdWUpLiBTZWUgYGRhdGVzYCBiZWxvdyBmb3IgZGV0YWlscy4KK3wgYGRlY2ltYWxgIHwgYGludGVnZXJgLCBgZmxvYXRgIHwgVmFyaWFibGUtcHJlY2lzaW9uIGRlY2ltYWwKK3wgYGRvdWJsZWAgfCBgaW50ZWdlcmAgYGZsb2F0YCB8IDY0LWJpdCBJRUVFLTc1NCBmbG9hdGluZyBwb2ludAorfCBgZHVyYXRpb25gIHwgYGR1cmF0aW9uYCwgfCBBIGR1cmF0aW9uIHdpdGggbmFub3NlY29uZCBwcmVjaXNpb24uIFNlZSBgZHVyYXRpb25zYCBiZWxvdyBmb3IgZGV0YWlscy4KK3wgYGZsb2F0YCB8IGBpbnRlZ2VyYCwgYGZsb2F0YCB8IDMyLWJpdCBJRUVFLTc1NCBmbG9hdGluZyBwb2ludAorfCBgaW5ldGAgfCBgc3RyaW5nYCB8IEFuIElQIGFkZHJlc3MsIGVpdGhlciBJUHY0ICg0IGJ5dGVzIGxvbmcpIG9yIElQdjYgKDE2IGJ5dGVzIGxvbmcpLiBOb3RlCit0aGF0IHRoZXJlIGlzIG5vIGBpbmV0YCBjb25zdGFudCwgSVAgYWRkcmVzcyBzaG91bGQgYmUgaW5wdXQgYXMgc3RyaW5ncy4KK3wgYGludGAgfCBgaW50ZWdlcmAgfCAzMi1iaXQgc2lnbmVkIGludAorfCBgc21hbGxpbnRgIHwgYGludGVnZXJgIHwgMTYtYml0IHNpZ25lZCBpbnQKK3wgYHRleHRgIHwgYHN0cmluZ2AgfCBVVEY4IGVuY29kZWQgc3RyaW5nCit8IGB0aW1lYCB8IGBpbnRlZ2VyYCwgYHN0cmluZ2AgfCBBIHRpbWUgKHdpdGggbm8gY29ycmVzcG9uZGluZyBkYXRlIHZhbHVlKSB3aXRoIG5hbm9zZWNvbmQgcHJlY2lzaW9uLiBTZWUKK2B0aW1lc2AgYmVsb3cgZm9yIGRldGFpbHMuCit8IGB0aW1lc3RhbXBgIHwgYGludGVnZXJgLCBgc3RyaW5nYCB8IEEgdGltZXN0YW1wIChkYXRlIGFuZCB0aW1lKSB3aXRoIG1pbGxpc2Vjb25kIHByZWNpc2lvbi4gU2VlIGB0aW1lc3RhbXBzYAorYmVsb3cgZm9yIGRldGFpbHMuCit8IGB0aW1ldXVpZGAgfCBgdXVpZGAgfCBWZXJzaW9uIDEgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfdW5pcXVlX2lkZW50aWZpZXJbVVVJRF0sCitnZW5lcmFsbHkgdXNlZCBhcyBhIOKAnGNvbmZsaWN0LWZyZWXigJ0gdGltZXN0YW1wLiBBbHNvIHNlZSBgdGltZXV1aWQtZnVuY3Rpb25zYC4KK3wgYHRpbnlpbnRgIHwgYGludGVnZXJgIHwgOC1iaXQgc2lnbmVkIGludAorfCBgdXVpZGAgfCBgdXVpZGAgfCBBIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXZlcnNhbGx5X3VuaXF1ZV9pZGVudGlmaWVyW1VVSURdIChvZiBhbnkgdmVyc2lvbikKK3wgYHZhcmNoYXJgIHwgYHN0cmluZ2AgfCBVVEY4IGVuY29kZWQgc3RyaW5nCit8IGB2YXJpbnRgIHwgYGludGVnZXJgIHwgQXJiaXRyYXJ5LXByZWNpc2lvbiBpbnRlZ2VyCit8PT09CisKKz09PSBDb3VudGVycworCitUaGUgYGNvdW50ZXJgIHR5cGUgaXMgdXNlZCB0byBkZWZpbmUgX2NvdW50ZXIgY29sdW1uc18uIEEgY291bnRlciBjb2x1bW4KK2lzIGEgY29sdW1uIHdob3NlIHZhbHVlIGlzIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGFuZCBvbiB3aGljaCAyCitvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQ6IGluY3JlbWVudGluZyBhbmQgZGVjcmVtZW50aW5nIChzZWUgdGhlCit4cmVmOmNxbC9kbWwuYWRvYyN1cGRhdGUtc3RhdGVtZW50W1VQREFURV0gc3RhdGVtZW50IGZvciBzeW50YXgpLiAKK05vdGUgdGhhdCB0aGUgdmFsdWUgb2YgYSBjb3VudGVyIGNhbm5vdAorYmUgc2V0OiBhIGNvdW50ZXIgZG9lcyBub3QgZXhpc3QgdW50aWwgZmlyc3QgaW5jcmVtZW50ZWQvZGVjcmVtZW50ZWQsCithbmQgdGhhdCBmaXJzdCBpbmNyZW1lbnQvZGVjcmVtZW50IGlzIG1hZGUgYXMgaWYgdGhlIHByaW9yIHZhbHVlIHdhcyAwLgorCitbW2NvdW50ZXItbGltaXRhdGlvbnNdXQorQ291bnRlcnMgaGF2ZSBhIG51bWJlciBvZiBpbXBvcnRhbnQgbGltaXRhdGlvbnM6CisKKyogVGhleSBjYW5ub3QgYmUgdXNlZCBmb3IgY29sdW1ucyBwYXJ0IG9mIHRoZSBgUFJJTUFSWSBLRVlgIG9mIGEgdGFibGUuCisqIEEgdGFibGUgdGhhdCBjb250YWlucyBhIGNvdW50ZXIgY2FuIG9ubHkgY29udGFpbiBjb3VudGVycy4gSW4gb3RoZXIKK3dvcmRzLCBlaXRoZXIgYWxsIHRoZSBjb2x1bW5zIG9mIGEgdGFibGUgb3V0c2lkZSB0aGUgYFBSSU1BUlkgS0VZYCBoYXZlCit0aGUgYGNvdW50ZXJgIHR5cGUsIG9yIG5vbmUgb2YgdGhlbSBoYXZlIGl0LgorKiBDb3VudGVycyBkbyBub3Qgc3VwcG9ydCB4cmVmOmNxbC9kbWwuYWRvYyN3cml0ZXRpbWUtYW5kLXR0bC1mdW5jdGlvbltleHBpcmF0aW9uXS4KKyogVGhlIGRlbGV0aW9uIG9mIGNvdW50ZXJzIGlzIHN1cHBvcnRlZCwgYnV0IGlzIG9ubHkgZ3VhcmFudGVlZCB0byB3b3JrCit0aGUgZmlyc3QgdGltZSB5b3UgZGVsZXRlIGEgY291bnRlci4gSW4gb3RoZXIgd29yZHMsIHlvdSBzaG91bGQgbm90CityZS11cGRhdGUgYSBjb3VudGVyIHRoYXQgeW91IGhhdmUgZGVsZXRlZCAoaWYgeW91IGRvLCBwcm9wZXIgYmVoYXZpb3IgaXMKK25vdCBndWFyYW50ZWVkKS4KKyogQ291bnRlciB1cGRhdGVzIGFyZSwgYnkgbmF0dXJlLCBub3QKK2h0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lkZW1wb3RlbmNlW2lkZW1wdG90ZW50XS4gQW4gaW1wb3J0YW50Citjb25zZXF1ZW5jZSBpcyB0aGF0IGlmIGEgY291bnRlciB1cGRhdGUgZmFpbHMgdW5leHBlY3RlZGx5ICh0aW1lb3V0IG9yCitsb3NzIG9mIGNvbm5lY3Rpb24gdG8gdGhlIGNvb3JkaW5hdG9yIG5vZGUpLCB0aGUgY2xpZW50IGhhcyBubyB3YXkgdG8KK2tub3cgaWYgdGhlIHVwZGF0ZSBoYXMgYmVlbiBhcHBsaWVkIG9yIG5vdC4gSW4gcGFydGljdWxhciwgcmVwbGF5aW5nIHRoZQordXBkYXRlIG1heSBvciBtYXkgbm90IGxlYWQgdG8gYW4gb3ZlciBjb3VudC4KKworW1t0aW1lc3RhbXBzXV0KKz09IFdvcmtpbmcgd2l0aCB0aW1lc3RhbXBzCisKK1ZhbHVlcyBvZiB0aGUgYHRpbWVzdGFtcGAgdHlwZSBhcmUgZW5jb2RlZCBhcyA2NC1iaXQgc2lnbmVkIGludGVnZXJzCityZXByZXNlbnRpbmcgYSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIHRoZSBzdGFuZGFyZCBiYXNlIHRpbWUga25vd24KK2FzIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaXhfdGltZVt0aGUgZXBvY2hdOiBKYW51YXJ5IDEgMTk3MCBhdAorMDA6MDA6MDAgR01ULgorCitUaW1lc3RhbXBzIGNhbiBiZSBpbnB1dCBpbiBDUUwgZWl0aGVyIHVzaW5nIHRoZWlyIHZhbHVlIGFzIGFuIGBpbnRlZ2VyYCwKK29yIHVzaW5nIGEgYHN0cmluZ2AgdGhhdCByZXByZXNlbnRzIGFuCitodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMVtJU08gODYwMV0gZGF0ZS4gRm9yIGluc3RhbmNlLCBhbGwKK29mIHRoZSB2YWx1ZXMgYmVsb3cgYXJlIHZhbGlkIGB0aW1lc3RhbXBgIHZhbHVlcyBmb3IgTWFyIDIsIDIwMTEsIGF0CiswNDowNTowMCBBTSwgR01UOgorCisqIGAxMjk5MDM4NzAwMDAwYAorKiBgJzIwMTEtMDItMDMgMDQ6MDUrMDAwMCdgCisqIGAnMjAxMS0wMi0wMyAwNDowNTowMCswMDAwJ2AKKyogYCcyMDExLTAyLTAzIDA0OjA1OjAwLjAwMCswMDAwJ2AKKyogYCcyMDExLTAyLTAzVDA0OjA1KzAwMDAnYAorKiBgJzIwMTEtMDItMDNUMDQ6MDU6MDArMDAwMCdgCisqIGAnMjAxMS0wMi0wM1QwNDowNTowMC4wMDArMDAwMCdgCisKK1RoZSBgKzAwMDBgIGFib3ZlIGlzIGFuIFJGQyA4MjIgNC1kaWdpdCB0aW1lIHpvbmUgc3BlY2lmaWNhdGlvbjsgYCswMDAwYAorcmVmZXJzIHRvIEdNVC4gVVMgUGFjaWZpYyBTdGFuZGFyZCBUaW1lIGlzIGAtMDgwMGAuIFRoZSB0aW1lIHpvbmUgbWF5IGJlCitvbWl0dGVkIGlmIGRlc2lyZWQgKGAnMjAxMS0wMi0wMyAwNDowNTowMCdgKSwgYW5kIGlmIHNvLCB0aGUgZGF0ZSB3aWxsCitiZSBpbnRlcnByZXRlZCBhcyBiZWluZyBpbiB0aGUgdGltZSB6b25lIHVuZGVyIHdoaWNoIHRoZSBjb29yZGluYXRpbmcKK0Nhc3NhbmRyYSBub2RlIGlzIGNvbmZpZ3VyZWQuIFRoZXJlIGFyZSBob3dldmVyIGRpZmZpY3VsdGllcyBpbmhlcmVudCBpbgorcmVseWluZyBvbiB0aGUgdGltZSB6b25lIGNvbmZpZ3VyYXRpb24gYmVpbmcgYXMgZXhwZWN0ZWQsIHNvIGl0IGlzCityZWNvbW1lbmRlZCB0aGF0IHRoZSB0aW1lIHpvbmUgYWx3YXlzIGJlIHNwZWNpZmllZCBmb3IgdGltZXN0YW1wcyB3aGVuCitmZWFzaWJsZS4KKworVGhlIHRpbWUgb2YgZGF5IG1heSBhbHNvIGJlIG9taXR0ZWQgKGAnMjAxMS0wMi0wMydgIG9yCitgJzIwMTEtMDItMDMrMDAwMCdgKSwgaW4gd2hpY2ggY2FzZSB0aGUgdGltZSBvZiBkYXkgd2lsbCBkZWZhdWx0IHRvCiswMDowMDowMCBpbiB0aGUgc3BlY2lmaWVkIG9yIGRlZmF1bHQgdGltZSB6b25lLiBIb3dldmVyLCBpZiBvbmx5IHRoZQorZGF0ZSBwYXJ0IGlzIHJlbGV2YW50LCBjb25zaWRlciB1c2luZyB0aGUgeHJlZjpjcWwvdHlwZXMuYWRvYyNkYXRlc1tkYXRlXSB0eXBlLgorCitbW2RhdGVzXV0KKz09IERhdGUgdHlwZQorCitWYWx1ZXMgb2YgdGhlIGBkYXRlYCB0eXBlIGFyZSBlbmNvZGVkIGFzIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VycworcmVwcmVzZW50aW5nIGEgbnVtYmVyIG9mIGRheXMgd2l0aCDigJx0aGUgZXBvY2jigJ0gYXQgdGhlIGNlbnRlciBvZiB0aGUKK3JhbmdlICgyXjMxKS4gRXBvY2ggaXMgSmFudWFyeSAxc3QsIDE5NzAKKworRm9yIHhyZWY6Y3FsL3R5cGVzLmFkb2MjdGltZXN0YW1wc1t0aW1lc3RhbXBzXSwgYSBkYXRlIGNhbiBiZSBpbnB1dCBlaXRoZXIgYXMgYW4KK2BpbnRlZ2VyYCBvciB1c2luZyBhIGRhdGUgYHN0cmluZ2AuIEluIHRoZSBsYXRlciBjYXNlLCB0aGUgZm9ybWF0IHNob3VsZAorYmUgYHl5eXktbW0tZGRgIChzbyBgJzIwMTEtMDItMDMnYCBmb3IgaW5zdGFuY2UpLgorCitbW3RpbWVzXV0KKz09IFRpbWUgdHlwZQorCitWYWx1ZXMgb2YgdGhlIGB0aW1lYCB0eXBlIGFyZSBlbmNvZGVkIGFzIDY0LWJpdCBzaWduZWQgaW50ZWdlcnMKK3JlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHNpbmNlIG1pZG5pZ2h0LgorCitGb3IgeHJlZjpjcWwvdHlwZXMuYWRvYyN0aW1lc3RhbXBzW3RpbWVzdGFtcHNdLCBhIHRpbWUgY2FuIGJlIGlucHV0IGVpdGhlciBhcyBhbgorYGludGVnZXJgIG9yIHVzaW5nIGEgYHN0cmluZ2AgcmVwcmVzZW50aW5nIHRoZSB0aW1lLiBJbiB0aGUgbGF0ZXIgY2FzZSwKK3RoZSBmb3JtYXQgc2hvdWxkIGJlIGBoaDptbTpzc1suZmZmZmZmZmZmXWAgKHdoZXJlIHRoZSBzdWItc2Vjb25kCitwcmVjaXNpb24gaXMgb3B0aW9uYWwgYW5kIGlmIHByb3ZpZGVkLCBjYW4gYmUgbGVzcyB0aGFuIHRoZSBuYW5vc2Vjb25kKS4KK1NvIGZvciBpbnN0YW5jZSwgdGhlIGZvbGxvd2luZyBhcmUgdmFsaWQgaW5wdXRzIGZvciBhIHRpbWU6CisKKyogYCcwODoxMjo1NCdgCisqIGAnMDg6MTI6NTQuMTIzJ2AKKyogYCcwODoxMjo1NC4xMjM0NTYnYAorKiBgJzA4OjEyOjU0LjEyMzQ1Njc4OSdgCisKK1tbZHVyYXRpb25zXV0KKz09IER1cmF0aW9uIHR5cGUKKworVmFsdWVzIG9mIHRoZSBgZHVyYXRpb25gIHR5cGUgYXJlIGVuY29kZWQgYXMgMyBzaWduZWQgaW50ZWdlciBvZgordmFyaWFibGUgbGVuZ3Rocy4gVGhlIGZpcnN0IGludGVnZXIgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIG1vbnRocywgdGhlCitzZWNvbmQgdGhlIG51bWJlciBvZiBkYXlzIGFuZCB0aGUgdGhpcmQgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcy4gVGhpcworaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIG51bWJlciBvZiBkYXlzIGluIGEgbW9udGggY2FuIGNoYW5nZSwgYW5kIGEKK2RheSBjYW4gaGF2ZSAyMyBvciAyNSBob3VycyBkZXBlbmRpbmcgb24gdGhlIGRheWxpZ2h0IHNhdmluZy4KK0ludGVybmFsbHksIHRoZSBudW1iZXIgb2YgbW9udGhzIGFuZCBkYXlzIGFyZSBkZWNvZGVkIGFzIDMyIGJpdHMKK2ludGVnZXJzIHdoZXJlYXMgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyBpcyBkZWNvZGVkIGFzIGEgNjQgYml0cworaW50ZWdlci4KKworQSBkdXJhdGlvbiBjYW4gYmUgaW5wdXQgYXM6CisKKyogYChxdWFudGl0eSB1bml0KStgIGxpa2UgYDEyaDMwbWAgd2hlcmUgdGhlIHVuaXQgY2FuIGJlOgorKiogYHlgOiB5ZWFycyAoMTIgbW9udGhzKQorKiogYG1vYDogbW9udGhzICgxIG1vbnRoKQorKiogYHdgOiB3ZWVrcyAoNyBkYXlzKQorKiogYGRgOiBkYXlzICgxIGRheSkKKyoqIGBoYDogaG91cnMgKDMsNjAwLDAwMCwwMDAsMDAwIG5hbm9zZWNvbmRzKQorKiogYG1gOiBtaW51dGVzICg2MCwwMDAsMDAwLDAwMCBuYW5vc2Vjb25kcykKKyoqIGBzYDogc2Vjb25kcyAoMSwwMDAsMDAwLDAwMCBuYW5vc2Vjb25kcykKKyoqIGBtc2A6IG1pbGxpc2Vjb25kcyAoMSwwMDAsMDAwIG5hbm9zZWNvbmRzKQorKiogYHVzYCBvciBgwrVzYCA6IG1pY3Jvc2Vjb25kcyAoMTAwMCBuYW5vc2Vjb25kcykKKyoqIGBuc2A6IG5hbm9zZWNvbmRzICgxIG5hbm9zZWNvbmQpCisqIElTTyA4NjAxIGZvcm1hdDogYFBbbl1ZW25dTVtuXURUW25dSFtuXU1bbl1TIG9yIFBbbl1XYAorKiBJU08gODYwMSBhbHRlcm5hdGl2ZSBmb3JtYXQ6IGBQW1lZWVldLVtNTV0tW0REXVRbaGhdOlttbV06W3NzXWAKKworRm9yIGV4YW1wbGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvaW5zZXJ0X2R1cmF0aW9uLmNxbFtdCistLS0tCisKK1tbZHVyYXRpb24tbGltaXRhdGlvbl1dCitEdXJhdGlvbiBjb2x1bW5zIGNhbm5vdCBiZSB1c2VkIGluIGEgdGFibGUncyBgUFJJTUFSWSBLRVlgLiBUaGlzCitsaW1pdGF0aW9uIGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IGR1cmF0aW9ucyBjYW5ub3QgYmUgb3JkZXJlZC4gSXQgaXMKK2VmZmVjdGl2ZWx5IG5vdCBwb3NzaWJsZSB0byBrbm93IGlmIGAxbW9gIGlzIGdyZWF0ZXIgdGhhbiBgMjlkYCB3aXRob3V0CithIGRhdGUgY29udGV4dC4KKworQSBgMWRgIGR1cmF0aW9uIGlzIG5vdCBlcXVhbCB0byBhIGAyNGhgIG9uZSBhcyB0aGUgZHVyYXRpb24gdHlwZSBoYXMKK2JlZW4gY3JlYXRlZCB0byBiZSBhYmxlIHRvIHN1cHBvcnQgZGF5bGlnaHQgc2F2aW5nLgorCis9PSBDb2xsZWN0aW9ucworCitDUUwgc3VwcG9ydHMgdGhyZWUga2luZHMgb2YgY29sbGVjdGlvbnM6IGBtYXBzYCwgYHNldHNgIGFuZCBgbGlzdHNgLiBUaGUKK3R5cGVzIG9mIHRob3NlIGNvbGxlY3Rpb25zIGlzIGRlZmluZWQgYnk6CisKK1tzb3VyY2UsYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvY29sbGVjdGlvbl90eXBlLmJuZltdCistLS0tCisKK2FuZCB0aGVpciB2YWx1ZXMgY2FuIGJlIGlucHV0ZCB1c2luZyBjb2xsZWN0aW9uIGxpdGVyYWxzOgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2NvbGxlY3Rpb25fbGl0ZXJhbC5ibmZbXQorLS0tLQorCitOb3RlIGhvd2V2ZXIgdGhhdCBuZWl0aGVyIGBiaW5kX21hcmtlcmAgbm9yIGBOVUxMYCBhcmUgc3VwcG9ydGVkIGluc2lkZQorY29sbGVjdGlvbiBsaXRlcmFscy4KKworPT09IE5vdGV3b3J0aHkgY2hhcmFjdGVyaXN0aWNzCisKK0NvbGxlY3Rpb25zIGFyZSBtZWFudCBmb3Igc3RvcmluZy9kZW5vcm1hbGl6aW5nIHJlbGF0aXZlbHkgc21hbGwgYW1vdW50CitvZiBkYXRhLiBUaGV5IHdvcmsgd2VsbCBmb3IgdGhpbmdzIGxpa2Ug4oCcdGhlIHBob25lIG51bWJlcnMgb2YgYSBnaXZlbgordXNlcuKAnSwg4oCcbGFiZWxzIGFwcGxpZWQgdG8gYW4gZW1haWzigJ0sIGV0Yy4gQnV0IHdoZW4gaXRlbXMgYXJlIGV4cGVjdGVkIHRvCitncm93IHVuYm91bmRlZCAo4oCcYWxsIG1lc3NhZ2VzIHNlbnQgYnkgYSB1c2Vy4oCdLCDigJxldmVudHMgcmVnaXN0ZXJlZCBieSBhCitzZW5zb3LigJ0uLi4pLCB0aGVuIGNvbGxlY3Rpb25zIGFyZSBub3QgYXBwcm9wcmlhdGUgYW5kIGEgc3BlY2lmaWMgdGFibGUKKyh3aXRoIGNsdXN0ZXJpbmcgY29sdW1ucykgc2hvdWxkIGJlIHVzZWQuIENvbmNyZXRlbHksIChub24tZnJvemVuKQorY29sbGVjdGlvbnMgaGF2ZSB0aGUgZm9sbG93aW5nIG5vdGV3b3J0aHkgY2hhcmFjdGVyaXN0aWNzIGFuZAorbGltaXRhdGlvbnM6CisKKyogSW5kaXZpZHVhbCBjb2xsZWN0aW9ucyBhcmUgbm90IGluZGV4ZWQgaW50ZXJuYWxseS4gV2hpY2ggbWVhbnMgdGhhdAorZXZlbiB0byBhY2Nlc3MgYSBzaW5nbGUgZWxlbWVudCBvZiBhIGNvbGxlY3Rpb24sIHRoZSB3aG9sZSBjb2xsZWN0aW9uCitoYXMgdG8gYmUgcmVhZCAoYW5kIHJlYWRpbmcgb25lIGlzIG5vdCBwYWdlZCBpbnRlcm5hbGx5KS4KKyogV2hpbGUgaW5zZXJ0aW9uIG9wZXJhdGlvbnMgb24gc2V0cyBhbmQgbWFwcyBuZXZlciBpbmN1ciBhCityZWFkLWJlZm9yZS13cml0ZSBpbnRlcm5hbGx5LCBzb21lIG9wZXJhdGlvbnMgb24gbGlzdHMgZG8uIEZ1cnRoZXIsIHNvbWUKK2xpc3RzIG9wZXJhdGlvbnMgYXJlIG5vdCBpZGVtcG90ZW50IGJ5IG5hdHVyZSAoc2VlIHRoZSBzZWN0aW9uIG9uCit4cmVmOmNxbC90eXBlcy5hZG9jI2xpc3RzW2xpc3RzXSBiZWxvdyBmb3IgZGV0YWlscyksIG1ha2luZyB0aGVpciByZXRyeSBpbiBjYXNlIG9mCit0aW1lb3V0IHByb2JsZW1hdGljLiBJdCBpcyB0aHVzIGFkdmlzZWQgdG8gcHJlZmVyIHNldHMgb3ZlciBsaXN0cyB3aGVuCitwb3NzaWJsZS4KKworUGxlYXNlIG5vdGUgdGhhdCB3aGlsZSBzb21lIG9mIHRob3NlIGxpbWl0YXRpb25zIG1heSBvciBtYXkgbm90IGJlCityZW1vdmVkL2ltcHJvdmVkIHVwb24gaW4gdGhlIGZ1dHVyZSwgaXQgaXMgYSBhbnRpLXBhdHRlcm4gdG8gdXNlIGEKKyhzaW5nbGUpIGNvbGxlY3Rpb24gdG8gc3RvcmUgbGFyZ2UgYW1vdW50cyBvZiBkYXRhLgorCis9PT0gTWFwcworCitBIGBtYXBgIGlzIGEgKHNvcnRlZCkgc2V0IG9mIGtleS12YWx1ZSBwYWlycywgd2hlcmUga2V5cyBhcmUgdW5pcXVlIGFuZAordGhlIG1hcCBpcyBzb3J0ZWQgYnkgaXRzIGtleXMuIFlvdSBjYW4gZGVmaW5lIGFuZCBpbnNlcnQgYSBtYXAgd2l0aDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9tYXAuY3FsW10KKy0tLS0KKworRnVydGhlciwgbWFwcyBzdXBwb3J0OgorCisqIFVwZGF0aW5nIG9yIGluc2VydGluZyBvbmUgb3IgbW9yZSBlbGVtZW50czoKKysKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvdXBkYXRlX21hcC5jcWxbXQorLS0tLQorKiBSZW1vdmluZyBvbmUgb3IgbW9yZSBlbGVtZW50IChpZiBhbiBlbGVtZW50IGRvZXNuJ3QgZXhpc3QsIHJlbW92aW5nIGl0CitpcyBhIG5vLW9wIGJ1dCBubyBlcnJvciBpcyB0aHJvd24pOgorKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9kZWxldGVfbWFwLmNxbFtdCistLS0tCisrCitOb3RlIHRoYXQgZm9yIHJlbW92aW5nIG11bHRpcGxlIGVsZW1lbnRzIGluIGEgYG1hcGAsIHlvdSByZW1vdmUgZnJvbSBpdAorYSBgc2V0YCBvZiBrZXlzLgorCitMYXN0bHksIFRUTHMgYXJlIGFsbG93ZWQgZm9yIGJvdGggYElOU0VSVGAgYW5kIGBVUERBVEVgLCBidXQgaW4gYm90aAorY2FzZXMgdGhlIFRUTCBzZXQgb25seSBhcHBseSB0byB0aGUgbmV3bHkgaW5zZXJ0ZWQvdXBkYXRlZCBlbGVtZW50cy4gSW4KK290aGVyIHdvcmRzOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3VwZGF0ZV90dGxfbWFwLmNxbFtdCistLS0tCisKK3dpbGwgb25seSBhcHBseSB0aGUgVFRMIHRvIHRoZSBgeyAnY29sb3InIDogJ2dyZWVuJyB9YCByZWNvcmQsIHRoZSByZXN0CitvZiB0aGUgbWFwIHJlbWFpbmluZyB1bmFmZmVjdGVkLgorCis9PT0gU2V0cworCitBIGBzZXRgIGlzIGEgKHNvcnRlZCkgY29sbGVjdGlvbiBvZiB1bmlxdWUgdmFsdWVzLiBZb3UgY2FuIGRlZmluZSBhbmQKK2luc2VydCBhIHNldCB3aXRoOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3NldC5jcWxbXQorLS0tLQorCitGdXJ0aGVyLCBzZXRzIHN1cHBvcnQ6CisKKyogQWRkaW5nIG9uZSBvciBtdWx0aXBsZSBlbGVtZW50cyAoYXMgdGhpcyBpcyBhIHNldCwgaW5zZXJ0aW5nIGFuCithbHJlYWR5IGV4aXN0aW5nIGVsZW1lbnQgaXMgYSBuby1vcCk6CisrCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3VwZGF0ZV9zZXQuY3FsW10KKy0tLS0KKyogUmVtb3Zpbmcgb25lIG9yIG11bHRpcGxlIGVsZW1lbnRzIChpZiBhbiBlbGVtZW50IGRvZXNuJ3QgZXhpc3QsCityZW1vdmluZyBpdCBpcyBhIG5vLW9wIGJ1dCBubyBlcnJvciBpcyB0aHJvd24pOgorKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9kZWxldGVfc2V0LmNxbFtdCistLS0tCisKK0xhc3RseSwgZm9yIHhyZWY6Y3FsL3R5cGVzLmFkb2Mjc2V0c1tzZXRzXSwgVFRMcyBhcmUgb25seSBhcHBsaWVkIHRvIG5ld2x5IGluc2VydGVkIHZhbHVlcy4KKworPT09IExpc3RzCisKK1tOT1RFXQorLk5vdGUKKz09PT0KK0FzIG1lbnRpb25lZCBhYm92ZSBhbmQgZnVydGhlciBkaXNjdXNzZWQgYXQgdGhlIGVuZCBvZiB0aGlzIHNlY3Rpb24sCitsaXN0cyBoYXZlIGxpbWl0YXRpb25zIGFuZCBzcGVjaWZpYyBwZXJmb3JtYW5jZSBjb25zaWRlcmF0aW9ucyB0aGF0IHlvdQorc2hvdWxkIHRha2UgaW50byBhY2NvdW50IGJlZm9yZSB1c2luZyB0aGVtLiBJbiBnZW5lcmFsLCBpZiB5b3UgY2FuIHVzZSBhCit4cmVmOmNxbC90eXBlcy5hZG9jI3NldHNbc2V0XSBpbnN0ZWFkIG9mIGxpc3QsIGFsd2F5cyBwcmVmZXIgYSBzZXQuCis9PT09CisKK0EgYGxpc3RgIGlzIGEgKHNvcnRlZCkgY29sbGVjdGlvbiBvZiBub24tdW5pcXVlIHZhbHVlcyB3aGVyZQorZWxlbWVudHMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgcG9zaXRpb24gaW4gdGhlIGxpc3QuIFlvdSBjYW4gZGVmaW5lIGFuZAoraW5zZXJ0IGEgbGlzdCB3aXRoOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2xpc3QuY3FsW10KKy0tLS0KKworRnVydGhlciwgbGlzdHMgc3VwcG9ydDoKKworKiBBcHBlbmRpbmcgYW5kIHByZXBlbmRpbmcgdmFsdWVzIHRvIGEgbGlzdDoKKysKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvdXBkYXRlX2xpc3QuY3FsW10KKy0tLS0KKworW1dBUk5JTkddCisuV2FybmluZworPT09PQorVGhlIGFwcGVuZCBhbmQgcHJlcGVuZCBvcGVyYXRpb25zIGFyZSBub3QgaWRlbXBvdGVudCBieSBuYXR1cmUuIFNvIGluCitwYXJ0aWN1bGFyLCBpZiBvbmUgb2YgdGhlc2Ugb3BlcmF0aW9ucyB0aW1lcyBvdXQsIHRoZW4gcmV0cnlpbmcgdGhlCitvcGVyYXRpb24gaXMgbm90IHNhZmUgYW5kIGl0IG1heSAob3IgbWF5IG5vdCkgbGVhZCB0bworYXBwZW5kaW5nL3ByZXBlbmRpbmcgdGhlIHZhbHVlIHR3aWNlLgorPT09PQorCisqIFNldHRpbmcgdGhlIHZhbHVlIGF0IGEgcGFydGljdWxhciBwb3NpdGlvbiBpbiBhIGxpc3QgdGhhdCBoYXMgYSBwcmUtZXhpc3RpbmcgZWxlbWVudCBmb3IgdGhhdCBwb3NpdGlvbi4gQW4gZXJyb3IKK3dpbGwgYmUgdGhyb3duIGlmIHRoZSBsaXN0IGRvZXMgbm90IGhhdmUgdGhlIHBvc2l0aW9uOgorKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC91cGRhdGVfcGFydGljdWxhcl9saXN0X2VsZW1lbnQuY3FsW10KKy0tLS0KKyogUmVtb3ZpbmcgYW4gZWxlbWVudCBieSBpdHMgcG9zaXRpb24gaW4gdGhlIGxpc3QgdGhhdCBoYXMgYSBwcmUtZXhpc3RpbmcgZWxlbWVudCBmb3IgdGhhdCBwb3NpdGlvbi4gQW4gZXJyb3IKK3dpbGwgYmUgdGhyb3duIGlmIHRoZSBsaXN0IGRvZXMgbm90IGhhdmUgdGhlIHBvc2l0aW9uLiBGdXJ0aGVyLCBhcyB0aGUgb3BlcmF0aW9uIHJlbW92ZXMgYW4KK2VsZW1lbnQgZnJvbSB0aGUgbGlzdCwgdGhlIGxpc3Qgc2l6ZSB3aWxsIGRlY3JlYXNlIGJ5IG9uZSBlbGVtZW50LCBzaGlmdGluZwordGhlIHBvc2l0aW9uIG9mIGFsbCB0aGUgZm9sbG93aW5nIGVsZW1lbnRzIG9uZSBmb3J3YXJkOgorKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9kZWxldGVfZWxlbWVudF9saXN0LmNxbFtdCistLS0tCisKKyogRGVsZXRpbmcgX2FsbF8gdGhlIG9jY3VycmVuY2VzIG9mIHBhcnRpY3VsYXIgdmFsdWVzIGluIHRoZSBsaXN0IChpZiBhCitwYXJ0aWN1bGFyIGVsZW1lbnQgZG9lc24ndCBvY2N1ciBhdCBhbGwgaW4gdGhlIGxpc3QsIGl0IGlzIHNpbXBseQoraWdub3JlZCBhbmQgbm8gZXJyb3IgaXMgdGhyb3duKToKKysKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvZGVsZXRlX2FsbF9lbGVtZW50c19saXN0LmNxbFtdCistLS0tCisKK1tXQVJOSU5HXQorLldhcm5pbmcKKz09PT0KK1NldHRpbmcgYW5kIHJlbW92aW5nIGFuIGVsZW1lbnQgYnkgcG9zaXRpb24gYW5kIHJlbW92aW5nIG9jY3VyZW5jZXMgb2YKK3BhcnRpY3VsYXIgdmFsdWVzIGluY3VyIGFuIGludGVybmFsIF9yZWFkLWJlZm9yZS13cml0ZV8uIFRoZXNlIG9wZXJhdGlvbnMgd2lsbAorcnVuIHNsb3dseSBhbmQgdXNlIG1vcmUgcmVzb3VyY2VzIHRoYW4gdXN1YWwgdXBkYXRlcyAod2l0aCB0aGUKK2V4Y2x1c2lvbiBvZiBjb25kaXRpb25hbCB3cml0ZSB0aGF0IGhhdmUgdGhlaXIgb3duIGNvc3QpLgorPT09PQorCitMYXN0bHksIGZvciB4cmVmOmNxbC90eXBlcy5hZG9jI2xpc3RzW2xpc3RzXSwgVFRMcyBvbmx5IGFwcGx5IHRvIG5ld2x5IGluc2VydGVkIHZhbHVlcy4KKworW1t1ZHRzXV0KKz09IFVzZXItRGVmaW5lZCBUeXBlcyAoVURUcykKKworQ1FMIHN1cHBvcnQgdGhlIGRlZmluaXRpb24gb2YgdXNlci1kZWZpbmVkIHR5cGVzIChVRFRzKS4gU3VjaCBhCit0eXBlIGNhbiBiZSBjcmVhdGVkLCBtb2RpZmllZCBhbmQgcmVtb3ZlZCB1c2luZyB0aGUKK2BjcmVhdGVfdHlwZV9zdGF0ZW1lbnRgLCBgYWx0ZXJfdHlwZV9zdGF0ZW1lbnRgIGFuZAorYGRyb3BfdHlwZV9zdGF0ZW1lbnRgIGRlc2NyaWJlZCBiZWxvdy4gQnV0IG9uY2UgY3JlYXRlZCwgYSBVRFQgaXMgc2ltcGx5CityZWZlcnJlZCB0byBieSBpdHMgbmFtZToKKworW3NvdXJjZSwgYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvdWR0LmJuZltdCistLS0tCisKKz09PSBDcmVhdGluZyBhIFVEVAorCitDcmVhdGluZyBhIG5ldyB1c2VyLWRlZmluZWQgdHlwZSBpcyBkb25lIHVzaW5nIGEgYENSRUFURSBUWVBFYCBzdGF0ZW1lbnQKK2RlZmluZWQgYnk6CisKK1tzb3VyY2UsIGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL2NyZWF0ZV90eXBlLmJuZltdCistLS0tCisKK0EgVURUIGhhcyBhIG5hbWUgKHVzZWQgdG8gZGVjbGFyZWQgY29sdW1ucyBvZiB0aGF0IHR5cGUpIGFuZCBpcyBhIHNldCBvZgorbmFtZWQgYW5kIHR5cGVkIGZpZWxkcy4gRmllbGRzIG5hbWUgY2FuIGJlIGFueSB0eXBlLCBpbmNsdWRpbmcKK2NvbGxlY3Rpb25zIG9yIG90aGVyIFVEVC4gRm9yIGluc3RhbmNlOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML3VkdC5jcWxbXQorLS0tLQorCitUaGluZ3MgdG8ga2VlcCBpbiBtaW5kIGFib3V0IFVEVHM6CisKKyogQXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gYWxyZWFkeSBleGlzdGluZyB0eXBlIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yCit1bmxlc3MgdGhlIGBJRiBOT1QgRVhJU1RTYCBvcHRpb24gaXMgdXNlZC4gSWYgaXQgaXMgdXNlZCwgdGhlIHN0YXRlbWVudAord2lsbCBiZSBhIG5vLW9wIGlmIHRoZSB0eXBlIGFscmVhZHkgZXhpc3RzLgorKiBBIHR5cGUgaXMgaW50cmluc2ljYWxseSBib3VuZCB0byB0aGUga2V5c3BhY2UgaW4gd2hpY2ggaXQgaXMgY3JlYXRlZCwKK2FuZCBjYW4gb25seSBiZSB1c2VkIGluIHRoYXQga2V5c3BhY2UuIEF0IGNyZWF0aW9uLCBpZiB0aGUgdHlwZSBuYW1lIGlzCitwcmVmaXhlZCBieSBhIGtleXNwYWNlIG5hbWUsIGl0IGlzIGNyZWF0ZWQgaW4gdGhhdCBrZXlzcGFjZS4gT3RoZXJ3aXNlLAoraXQgaXMgY3JlYXRlZCBpbiB0aGUgY3VycmVudCBrZXlzcGFjZS4KKyogQXMgb2YgQ2Fzc2FuZHJhICwgVURUIGhhdmUgdG8gYmUgZnJvemVuIGluIG1vc3QgY2FzZXMsIGhlbmNlIHRoZQorYGZyb3plbjxhZGRyZXNzPmAgaW4gdGhlIHRhYmxlIGRlZmluaXRpb24gYWJvdmUuCisKKz09PSBVRFQgbGl0ZXJhbHMKKworT25jZSBhIHVzZXItZGVmaW5lZCB0eXBlIGhhcyBiZWVuIGNyZWF0ZWQsIHZhbHVlIGNhbiBiZSBpbnB1dCB1c2luZyBhCitVRFQgbGl0ZXJhbDoKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi91ZHRfbGl0ZXJhbC5ibmZbXQorLS0tLQorCitJbiBvdGhlciB3b3JkcywgYSBVRFQgbGl0ZXJhbCBpcyBsaWtlIGEgeHJlZjpjcWwvdHlwZXMuYWRvYyNtYXBzW21hcF1gIGxpdGVyYWwgYnV0IGl0cwora2V5cyBhcmUgdGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgb2YgdGhlIHR5cGUuIEZvciBpbnN0YW5jZSwgb25lIGNvdWxkCitpbnNlcnQgaW50byB0aGUgdGFibGUgZGVmaW5lIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uIHVzaW5nOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2luc2VydF91ZHQuY3FsW10KKy0tLS0KKworVG8gYmUgdmFsaWQsIGEgVURUIGxpdGVyYWwgY2FuIG9ubHkgaW5jbHVkZSBmaWVsZHMgZGVmaW5lZCBieSB0aGUKK3R5cGUgaXQgaXMgYSBsaXRlcmFsIG9mLCBidXQgaXQgY2FuIG9taXQgc29tZSBmaWVsZHMgKHRoZXNlIHdpbGwgYmUgc2V0IHRvIGBOVUxMYCkuCisKKz09PSBBbHRlcmluZyBhIFVEVAorCitBbiBleGlzdGluZyB1c2VyLWRlZmluZWQgdHlwZSBjYW4gYmUgbW9kaWZpZWQgdXNpbmcgYW4gYEFMVEVSIFRZUEVgCitzdGF0ZW1lbnQ6CisKK1tzb3VyY2UsYm5mXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCTkYvYWx0ZXJfdWR0X3N0YXRlbWVudC5ibmZbXQorLS0tLQorSWYgdGhlIHR5cGUgZG9lcyBub3QgZXhpc3QsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgRVhJU1RTYCBpcyB1c2VkIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorWW91IGNhbjoKKworKiBBZGQgYSBuZXcgZmllbGQgdG8gdGhlIHR5cGUgKGBBTFRFUiBUWVBFIGFkZHJlc3MgQUREIGNvdW50cnkgdGV4dGApLgorVGhhdCBuZXcgZmllbGQgd2lsbCBiZSBgTlVMTGAgZm9yIGFueSB2YWx1ZXMgb2YgdGhlIHR5cGUgY3JlYXRlZCBiZWZvcmUKK3RoZSBhZGRpdGlvbi4gSWYgdGhlIG5ldyBmaWVsZCBleGlzdHMsIHRoZSBzdGF0ZW1lbnQgd2lsbCByZXR1cm4gYW4gZXJyb3IsIHVubGVzcyBgSUYgTk9UIEVYSVNUU2AgaXMgdXNlZCBpbiB3aGljaCBjYXNlIHRoZSBvcGVyYXRpb24gaXMgYSBuby1vcC4KKyogUmVuYW1lIHRoZSBmaWVsZHMgb2YgdGhlIHR5cGUuIElmIHRoZSBmaWVsZChzKSBkb2VzIG5vdCBleGlzdCwgdGhlIHN0YXRlbWVudCB3aWxsIHJldHVybiBhbiBlcnJvciwgdW5sZXNzIGBJRiBFWElTVFNgIGlzIHVzZWQgaW4gd2hpY2ggY2FzZSB0aGUgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvcmVuYW1lX3VkdF9maWVsZC5jcWxbXQorLS0tLQorCis9PT0gRHJvcHBpbmcgYSBVRFQKKworWW91IGNhbiBkcm9wIGFuIGV4aXN0aW5nIHVzZXItZGVmaW5lZCB0eXBlIHVzaW5nIGEgYERST1AgVFlQRWAKK3N0YXRlbWVudDoKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9kcm9wX3VkdF9zdGF0ZW1lbnQuYm5mW10KKy0tLS0KKworRHJvcHBpbmcgYSB0eXBlIHJlc3VsdHMgaW4gdGhlIGltbWVkaWF0ZSwgaXJyZXZlcnNpYmxlIHJlbW92YWwgb2YgdGhhdAordHlwZS4gSG93ZXZlciwgYXR0ZW1wdGluZyB0byBkcm9wIGEgdHlwZSB0aGF0IGlzIHN0aWxsIGluIHVzZSBieSBhbm90aGVyCit0eXBlLCB0YWJsZSBvciBmdW5jdGlvbiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4KKworSWYgdGhlIHR5cGUgZHJvcHBlZCBkb2VzIG5vdCBleGlzdCwgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCB1bmxlc3MKK2BJRiBFWElTVFNgIGlzIHVzZWQsIGluIHdoaWNoIGNhc2UgdGhlIG9wZXJhdGlvbiBpcyBhIG5vLW9wLgorCis9PSBUdXBsZXMKKworQ1FMIGFsc28gc3VwcG9ydCB0dXBsZXMgYW5kIHR1cGxlIHR5cGVzICh3aGVyZSB0aGUgZWxlbWVudHMgY2FuIGJlIG9mCitkaWZmZXJlbnQgdHlwZXMpLiBGdW5jdGlvbmFsbHksIHR1cGxlcyBjYW4gYmUgdGhvdWdoIGFzIGFub255bW91cyBVRFQKK3dpdGggYW5vbnltb3VzIGZpZWxkcy4gVHVwbGUgdHlwZXMgYW5kIHR1cGxlIGxpdGVyYWxzIGFyZSBkZWZpbmVkIGJ5OgorCitbc291cmNlLGJuZl0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQk5GL3R1cGxlLmJuZltdCistLS0tCisKK2FuZCBjYW4gYmUgY3JlYXRlZDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC90dXBsZS5jcWxbXQorLS0tLQorCitVbmxpa2Ugb3RoZXIgY29tcG9zZWQgdHlwZXMsIGxpa2UgY29sbGVjdGlvbnMgYW5kIFVEVHMsIGEgdHVwbGUgaXMgYWx3YXlzCitgZnJvemVuIDxmcm96ZW4+YCAod2l0aG91dCB0aGUgbmVlZCBvZiB0aGUgYGZyb3plbmAga2V5d29yZCkKK2FuZCBpdCBpcyBub3QgcG9zc2libGUgdG8gdXBkYXRlIG9ubHkgc29tZSBlbGVtZW50cyBvZiBhIHR1cGxlICh3aXRob3V0Cit1cGRhdGluZyB0aGUgd2hvbGUgdHVwbGUpLiBBbHNvLCBhIHR1cGxlIGxpdGVyYWwgc2hvdWxkIGFsd2F5cyBoYXZlIHRoZQorc2FtZSBudW1iZXIgb2YgdmFsdWUgdGhhbiBkZWNsYXJlZCBpbiB0aGUgdHlwZSBpdCBpcyBhIHR1cGxlIG9mIChzb21lIG9mCit0aG9zZSB2YWx1ZXMgY2FuIGJlIG51bGwgYnV0IHRoZXkgbmVlZCB0byBiZSBleHBsaWNpdGx5IGRlY2xhcmVkIGFzIHNvKS4KKworPT0gQ3VzdG9tIFR5cGVzCisKK1tOT1RFXQorLk5vdGUKKz09PT0KK0N1c3RvbSB0eXBlcyBleGlzdHMgbW9zdGx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHB1cnBvc2VzIGFuZCB0aGVpcgordXNhZ2UgaXMgZGlzY291cmFnZWQuIFRoZWlyIHVzYWdlIGlzIGNvbXBsZXgsIG5vdCB1c2VyIGZyaWVuZGx5IGFuZCB0aGUKK290aGVyIHByb3ZpZGVkIHR5cGVzLCBwYXJ0aWN1bGFybHkgeHJlZjpjcWwvdHlwZXMuYWRvYyN1ZHRzW3VzZXItZGVmaW5lZCB0eXBlc10sIHNob3VsZAorYWxtb3N0IGFsd2F5cyBiZSBlbm91Z2guCis9PT09CisKK0EgY3VzdG9tIHR5cGUgaXMgZGVmaW5lZCBieToKKworW3NvdXJjZSxibmZdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJORi9jdXN0b21fdHlwZS5ibmZbXQorLS0tLQorCitBIGN1c3RvbSB0eXBlIGlzIGEgYHN0cmluZ2AgdGhhdCBjb250YWlucyB0aGUgbmFtZSBvZiBKYXZhIGNsYXNzIHRoYXQKK2V4dGVuZHMgdGhlIHNlcnZlciBzaWRlIGBBYnN0cmFjdFR5cGVgIGNsYXNzIGFuZCB0aGF0IGNhbiBiZSBsb2FkZWQgYnkKK0Nhc3NhbmRyYSAoaXQgc2hvdWxkIHRodXMgYmUgaW4gdGhlIGBDTEFTU1BBVEhgIG9mIGV2ZXJ5IG5vZGUgcnVubmluZworQ2Fzc2FuZHJhKS4gVGhhdCBjbGFzcyB3aWxsIGRlZmluZSB3aGF0IHZhbHVlcyBhcmUgdmFsaWQgZm9yIHRoZSB0eXBlCithbmQgaG93IHRoZSB0aW1lIHNvcnRzIHdoZW4gdXNlZCBmb3IgYSBjbHVzdGVyaW5nIGNvbHVtbi4gRm9yIGFueSBvdGhlcgorcHVycG9zZSwgYSB2YWx1ZSBvZiBhIGN1c3RvbSB0eXBlIGlzIHRoZSBzYW1lIHRoYW4gdGhhdCBvZiBhIGBibG9iYCwgYW5kCitjYW4gaW4gcGFydGljdWxhciBiZSBpbnB1dCB1c2luZyB0aGUgYGJsb2JgIGxpdGVyYWwgc3ludGF4LgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX2NvbmNlcHR1YWwuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19jb25jZXB0dWFsLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZmZGQxZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19jb25jZXB0dWFsLmFkb2MKQEAgLTAsMCArMSw0NCBAQAorPSBDb25jZXB0dWFsIERhdGEgTW9kZWxpbmcKKworRmlyc3QsIGxldOKAmXMgY3JlYXRlIGEgc2ltcGxlIGRvbWFpbiBtb2RlbCB0aGF0IGlzIGVhc3kgdG8gdW5kZXJzdGFuZCBpbgordGhlIHJlbGF0aW9uYWwgd29ybGQsIGFuZCB0aGVuIHNlZSBob3cgeW91IG1pZ2h0IG1hcCBpdCBmcm9tIGEKK3JlbGF0aW9uYWwgdG8gYSBkaXN0cmlidXRlZCBoYXNodGFibGUgbW9kZWwgaW4gQ2Fzc2FuZHJhLgorCitMZXQncyB1c2UgYW4gZXhhbXBsZSB0aGF0IGlzIGNvbXBsZXggZW5vdWdoIHRvIHNob3cgdGhlIHZhcmlvdXMgZGF0YQorc3RydWN0dXJlcyBhbmQgZGVzaWduIHBhdHRlcm5zLCBidXQgbm90IHNvbWV0aGluZyB0aGF0IHdpbGwgYm9nIHlvdSBkb3duCit3aXRoIGRldGFpbHMuIEFsc28sIGEgZG9tYWluIHRoYXTigJlzIGZhbWlsaWFyIHRvIGV2ZXJ5b25lIHdpbGwgYWxsb3cgeW91Cit0byBjb25jZW50cmF0ZSBvbiBob3cgdG8gd29yayB3aXRoIENhc3NhbmRyYSwgbm90IG9uIHdoYXQgdGhlCithcHBsaWNhdGlvbiBkb21haW4gaXMgYWxsIGFib3V0LgorCitGb3IgZXhhbXBsZSwgbGV0J3MgdXNlIGEgZG9tYWluIHRoYXQgaXMgZWFzaWx5IHVuZGVyc3Rvb2QgYW5kIHRoYXQKK2V2ZXJ5b25lIGNhbiByZWxhdGUgdG86IG1ha2luZyBob3RlbCByZXNlcnZhdGlvbnMuCisKK1RoZSBjb25jZXB0dWFsIGRvbWFpbiBpbmNsdWRlcyBob3RlbHMsIGd1ZXN0cyB0aGF0IHN0YXkgaW4gdGhlIGhvdGVscywgYQorY29sbGVjdGlvbiBvZiByb29tcyBmb3IgZWFjaCBob3RlbCwgdGhlIHJhdGVzIGFuZCBhdmFpbGFiaWxpdHkgb2YgdGhvc2UKK3Jvb21zLCBhbmQgYSByZWNvcmQgb2YgcmVzZXJ2YXRpb25zIGJvb2tlZCBmb3IgZ3Vlc3RzLiBIb3RlbHMgdHlwaWNhbGx5CithbHNvIG1haW50YWluIGEgY29sbGVjdGlvbiBvZiDigJxwb2ludHMgb2YgaW50ZXJlc3Qs4oCdIHdoaWNoIGFyZSBwYXJrcywKK211c2V1bXMsIHNob3BwaW5nIGdhbGxlcmllcywgbW9udW1lbnRzLCBvciBvdGhlciBwbGFjZXMgbmVhciB0aGUgaG90ZWwKK3RoYXQgZ3Vlc3RzIG1pZ2h0IHdhbnQgdG8gdmlzaXQgZHVyaW5nIHRoZWlyIHN0YXkuIEJvdGggaG90ZWxzIGFuZAorcG9pbnRzIG9mIGludGVyZXN0IG5lZWQgdG8gbWFpbnRhaW4gZ2VvbG9jYXRpb24gZGF0YSBzbyB0aGF0IHRoZXkgY2FuIGJlCitmb3VuZCBvbiBtYXBzIGZvciBtYXNodXBzLCBhbmQgdG8gY2FsY3VsYXRlIGRpc3RhbmNlcy4KKworVGhlIGNvbmNlcHR1YWwgZG9tYWluIGlzIGRlcGljdGVkIGJlbG93IHVzaW5nIHRoZSBlbnRpdHnigJNyZWxhdGlvbnNoaXAKK21vZGVsIHBvcHVsYXJpemVkIGJ5IFBldGVyIENoZW4uIFRoaXMgc2ltcGxlIGRpYWdyYW0gcmVwcmVzZW50cyB0aGUKK2VudGl0aWVzIGluIHRoZSBkb21haW4gd2l0aCByZWN0YW5nbGVzLCBhbmQgYXR0cmlidXRlcyBvZiB0aG9zZSBlbnRpdGllcword2l0aCBvdmFscy4gQXR0cmlidXRlcyB0aGF0IHJlcHJlc2VudCB1bmlxdWUgaWRlbnRpZmllcnMgZm9yIGl0ZW1zIGFyZQordW5kZXJsaW5lZC4gUmVsYXRpb25zaGlwcyBiZXR3ZWVuIGVudGl0aWVzIGFyZSByZXByZXNlbnRlZCBhcyBkaWFtb25kcywKK2FuZCB0aGUgY29ubmVjdG9ycyBiZXR3ZWVuIHRoZSByZWxhdGlvbnNoaXAgYW5kIGVhY2ggZW50aXR5IHNob3cgdGhlCittdWx0aXBsaWNpdHkgb2YgdGhlIGNvbm5lY3Rpb24uCisKK2ltYWdlOjpkYXRhLW1vZGVsaW5nX2hvdGVsX2VyZC5wbmdbaW1hZ2VdCisKK09idmlvdXNseSwgaW4gdGhlIHJlYWwgd29ybGQsIHRoZXJlIHdvdWxkIGJlIG1hbnkgbW9yZSBjb25zaWRlcmF0aW9ucworYW5kIG11Y2ggbW9yZSBjb21wbGV4aXR5LiBGb3IgZXhhbXBsZSwgaG90ZWwgcmF0ZXMgYXJlIG5vdG9yaW91c2x5CitkeW5hbWljLCBhbmQgY2FsY3VsYXRpbmcgdGhlbSBpbnZvbHZlcyBhIHdpZGUgYXJyYXkgb2YgZmFjdG9ycy4gSGVyZQoreW914oCZcmUgZGVmaW5pbmcgc29tZXRoaW5nIGNvbXBsZXggZW5vdWdoIHRvIGJlIGludGVyZXN0aW5nIGFuZCB0b3VjaCBvbgordGhlIGltcG9ydGFudCBwb2ludHMsIGJ1dCBzaW1wbGUgZW5vdWdoIHRvIG1haW50YWluIHRoZSBmb2N1cyBvbgorbGVhcm5pbmcgQ2Fzc2FuZHJhLgorCitfTWF0ZXJpYWwgYWRhcHRlZCBmcm9tIENhc3NhbmRyYSwgVGhlIERlZmluaXRpdmUgR3VpZGUuIFB1Ymxpc2hlZCBieQorTydSZWlsbHkgTWVkaWEsIEluYy4gQ29weXJpZ2h0IMKpIDIwMjAgSmVmZiBDYXJwZW50ZXIsIEViZW4gSGV3aXR0LiBBbGwKK3JpZ2h0cyByZXNlcnZlZC4gVXNlZCB3aXRoIHBlcm1pc3Npb24uXwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX2xvZ2ljYWwuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19sb2dpY2FsLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjNjllZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19sb2dpY2FsLmFkb2MKQEAgLTAsMCArMSwxOTUgQEAKKz0gTG9naWNhbCBEYXRhIE1vZGVsaW5nCisKK05vdyB0aGF0IHlvdSBoYXZlIGRlZmluZWQgeW91ciBxdWVyaWVzLCB5b3XigJlyZSByZWFkeSB0byBiZWdpbiBkZXNpZ25pbmcKK0Nhc3NhbmRyYSB0YWJsZXMuIEZpcnN0LCBjcmVhdGUgYSBsb2dpY2FsIG1vZGVsIGNvbnRhaW5pbmcgYSB0YWJsZSBmb3IKK2VhY2ggcXVlcnksIGNhcHR1cmluZyBlbnRpdGllcyBhbmQgcmVsYXRpb25zaGlwcyBmcm9tIHRoZSBjb25jZXB0dWFsCittb2RlbC4KKworVG8gbmFtZSBlYWNoIHRhYmxlLCB5b3XigJlsbCBpZGVudGlmeSB0aGUgcHJpbWFyeSBlbnRpdHkgdHlwZSBmb3Igd2hpY2gKK3lvdSBhcmUgcXVlcnlpbmcgYW5kIHVzZSB0aGF0IHRvIHN0YXJ0IHRoZSBlbnRpdHkgbmFtZS4gSWYgeW91IGFyZQorcXVlcnlpbmcgYnkgYXR0cmlidXRlcyBvZiBvdGhlciByZWxhdGVkIGVudGl0aWVzLCBhcHBlbmQgdGhvc2UgdG8gdGhlCit0YWJsZSBuYW1lLCBzZXBhcmF0ZWQgd2l0aCBgX2J5X2AuIEZvciBleGFtcGxlLCBgaG90ZWxzX2J5X3BvaWAuCisKK05leHQsIHlvdSBpZGVudGlmeSB0aGUgcHJpbWFyeSBrZXkgZm9yIHRoZSB0YWJsZSwgYWRkaW5nIHBhcnRpdGlvbiBrZXkKK2NvbHVtbnMgYmFzZWQgb24gdGhlIHJlcXVpcmVkIHF1ZXJ5IGF0dHJpYnV0ZXMsIGFuZCBjbHVzdGVyaW5nIGNvbHVtbnMKK2luIG9yZGVyIHRvIGd1YXJhbnRlZSB1bmlxdWVuZXNzIGFuZCBzdXBwb3J0IGRlc2lyZWQgc29ydCBvcmRlcmluZy4KKworVGhlIGRlc2lnbiBvZiB0aGUgcHJpbWFyeSBrZXkgaXMgZXh0cmVtZWx5IGltcG9ydGFudCwgYXMgaXQgd2lsbAorZGV0ZXJtaW5lIGhvdyBtdWNoIGRhdGEgd2lsbCBiZSBzdG9yZWQgaW4gZWFjaCBwYXJ0aXRpb24gYW5kIGhvdyB0aGF0CitkYXRhIGlzIG9yZ2FuaXplZCBvbiBkaXNrLCB3aGljaCBpbiB0dXJuIHdpbGwgYWZmZWN0IGhvdyBxdWlja2x5CitDYXNzYW5kcmEgcHJvY2Vzc2VzIHJlYWRzLgorCitDb21wbGV0ZSBlYWNoIHRhYmxlIGJ5IGFkZGluZyBhbnkgYWRkaXRpb25hbCBhdHRyaWJ1dGVzIGlkZW50aWZpZWQgYnkKK3RoZSBxdWVyeS4gSWYgYW55IG9mIHRoZXNlIGFkZGl0aW9uYWwgYXR0cmlidXRlcyBhcmUgdGhlIHNhbWUgZm9yIGV2ZXJ5CitpbnN0YW5jZSBvZiB0aGUgcGFydGl0aW9uIGtleSwgbWFyayB0aGUgY29sdW1uIGFzIHN0YXRpYy4KKworTm93IHRoYXQgd2FzIGEgcHJldHR5IHF1aWNrIGRlc2NyaXB0aW9uIG9mIGEgZmFpcmx5IGludm9sdmVkIHByb2Nlc3MsIHNvCitpdCB3aWxsIGJlIHdvcnRod2hpbGUgdG8gd29yayB0aHJvdWdoIGEgZGV0YWlsZWQgZXhhbXBsZS4gRmlyc3QsIGxldOKAmXMKK2ludHJvZHVjZSBhIG5vdGF0aW9uIHRoYXQgeW91IGNhbiB1c2UgdG8gcmVwcmVzZW50IGxvZ2ljYWwgbW9kZWxzLgorCitTZXZlcmFsIGluZGl2aWR1YWxzIHdpdGhpbiB0aGUgQ2Fzc2FuZHJhIGNvbW11bml0eSBoYXZlIHByb3Bvc2VkCitub3RhdGlvbnMgZm9yIGNhcHR1cmluZyBkYXRhIG1vZGVscyBpbiBkaWFncmFtbWF0aWMgZm9ybS4gVGhpcyBkb2N1bWVudAordXNlcyBhIG5vdGF0aW9uIHBvcHVsYXJpemVkIGJ5IEFydGVtIENoZWJvdGtvIHdoaWNoIHByb3ZpZGVzIGEgc2ltcGxlLAoraW5mb3JtYXRpdmUgd2F5IHRvIHZpc3VhbGl6ZSB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHF1ZXJpZXMgYW5kCit0YWJsZXMgaW4geW91ciBkZXNpZ25zLiBUaGlzIGZpZ3VyZSBzaG93cyB0aGUgQ2hlYm90a28gbm90YXRpb24gZm9yIGEKK2xvZ2ljYWwgZGF0YSBtb2RlbC4KKworaW1hZ2U6OmRhdGEtbW9kZWxpbmdfY2hlYm90a29fbG9naWNhbC5wbmdbaW1hZ2VdCisKK0VhY2ggdGFibGUgaXMgc2hvd24gd2l0aCBpdHMgdGl0bGUgYW5kIGEgbGlzdCBvZiBjb2x1bW5zLiBQcmltYXJ5IGtleQorY29sdW1ucyBhcmUgaWRlbnRpZmllZCB2aWEgc3ltYm9scyBzdWNoIGFzICpLKiBmb3IgcGFydGl0aW9uIGtleSBjb2x1bW5zCithbmQgKipDKirihpEgb3IgKipDKirihpMgdG8gcmVwcmVzZW50IGNsdXN0ZXJpbmcgY29sdW1ucy4gTGluZXMgYXJlIHNob3duCitlbnRlcmluZyB0YWJsZXMgb3IgYmV0d2VlbiB0YWJsZXMgdG8gaW5kaWNhdGUgdGhlIHF1ZXJpZXMgdGhhdCBlYWNoCit0YWJsZSBpcyBkZXNpZ25lZCB0byBzdXBwb3J0LgorCis9PSBIb3RlbCBMb2dpY2FsIERhdGEgTW9kZWwKKworVGhlIGZpZ3VyZSBiZWxvdyBzaG93cyBhIENoZWJvdGtvIGxvZ2ljYWwgZGF0YSBtb2RlbCBmb3IgdGhlIHF1ZXJpZXMKK2ludm9sdmluZyBob3RlbHMsIHBvaW50cyBvZiBpbnRlcmVzdCwgcm9vbXMsIGFuZCBhbWVuaXRpZXMuIE9uZSB0aGluZworeW91J2xsIG5vdGljZSBpbW1lZGlhdGVseSBpcyB0aGF0IHRoZSBDYXNzYW5kcmEgZGVzaWduIGRvZXNu4oCZdCBpbmNsdWRlCitkZWRpY2F0ZWQgdGFibGVzIGZvciByb29tcyBvciBhbWVuaXRpZXMsIGFzIHlvdSBoYWQgaW4gdGhlIHJlbGF0aW9uYWwKK2Rlc2lnbi4gVGhpcyBpcyBiZWNhdXNlIHRoZSB3b3JrZmxvdyBkaWRu4oCZdCBpZGVudGlmeSBhbnkgcXVlcmllcworcmVxdWlyaW5nIHRoaXMgZGlyZWN0IGFjY2Vzcy4KKworaW1hZ2U6OmRhdGEtbW9kZWxpbmdfaG90ZWxfbG9naWNhbC5wbmdbaW1hZ2VdCisKK0xldOKAmXMgZXhwbG9yZSB0aGUgZGV0YWlscyBvZiBlYWNoIG9mIHRoZXNlIHRhYmxlcy4KKworVGhlIGZpcnN0IHF1ZXJ5IFExIGlzIHRvIGZpbmQgaG90ZWxzIG5lYXIgYSBwb2ludCBvZiBpbnRlcmVzdCwgc28geW914oCZbGwKK2NhbGwgdGhpcyB0YWJsZSBgaG90ZWxzX2J5X3BvaWAuIFNlYXJjaGluZyBieSBhIG5hbWVkIHBvaW50IG9mIGludGVyZXN0CitpcyBhIGNsdWUgdGhhdCB0aGUgcG9pbnQgb2YgaW50ZXJlc3Qgc2hvdWxkIGJlIGEgcGFydCBvZiB0aGUgcHJpbWFyeQora2V5LiBMZXTigJlzIHJlZmVyZW5jZSB0aGUgcG9pbnQgb2YgaW50ZXJlc3QgYnkgbmFtZSwgYmVjYXVzZSBhY2NvcmRpbmcgdG8KK3RoZSB3b3JrZmxvdyB0aGF0IGlzIGhvdyB1c2VycyB3aWxsIHN0YXJ0IHRoZWlyIHNlYXJjaC4KKworWW914oCZbGwgbm90ZSB0aGF0IHlvdSBjZXJ0YWlubHkgY291bGQgaGF2ZSBtb3JlIHRoYW4gb25lIGhvdGVsIG5lYXIgYQorZ2l2ZW4gcG9pbnQgb2YgaW50ZXJlc3QsIHNvIHlvdeKAmWxsIG5lZWQgYW5vdGhlciBjb21wb25lbnQgaW4gdGhlIHByaW1hcnkKK2tleSBpbiBvcmRlciB0byBtYWtlIHN1cmUgeW91IGhhdmUgYSB1bmlxdWUgcGFydGl0aW9uIGZvciBlYWNoIGhvdGVsLiBTbworeW91IGFkZCB0aGUgaG90ZWwga2V5IGFzIGEgY2x1c3RlcmluZyBjb2x1bW4uCisKK0FuIGltcG9ydGFudCBjb25zaWRlcmF0aW9uIGluIGRlc2lnbmluZyB5b3VyIHRhYmxl4oCZcyBwcmltYXJ5IGtleSBpcworbWFraW5nIHN1cmUgdGhhdCBpdCBkZWZpbmVzIGEgdW5pcXVlIGRhdGEgZWxlbWVudC4gT3RoZXJ3aXNlIHlvdSBydW4gdGhlCityaXNrIG9mIGFjY2lkZW50YWxseSBvdmVyd3JpdGluZyBkYXRhLgorCitOb3cgZm9yIHRoZSBzZWNvbmQgcXVlcnkgKFEyKSwgeW914oCZbGwgbmVlZCBhIHRhYmxlIHRvIGdldCBpbmZvcm1hdGlvbgorYWJvdXQgYSBzcGVjaWZpYyBob3RlbC4gT25lIGFwcHJvYWNoIHdvdWxkIGhhdmUgYmVlbiB0byBwdXQgYWxsIG9mIHRoZQorYXR0cmlidXRlcyBvZiBhIGhvdGVsIGluIHRoZSBgaG90ZWxzX2J5X3BvaWAgdGFibGUsIGJ1dCB5b3UgYWRkZWQgb25seQordGhvc2UgYXR0cmlidXRlcyB0aGF0IHdlcmUgcmVxdWlyZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdvcmtmbG93LgorCitGcm9tIHRoZSB3b3JrZmxvdyBkaWFncmFtLCB5b3Uga25vdyB0aGF0IHRoZSBgaG90ZWxzX2J5X3BvaWAgdGFibGUgaXMKK3VzZWQgdG8gZGlzcGxheSBhIGxpc3Qgb2YgaG90ZWxzIHdpdGggYmFzaWMgaW5mb3JtYXRpb24gb24gZWFjaCBob3RlbCwKK2FuZCB0aGUgYXBwbGljYXRpb24ga25vd3MgdGhlIHVuaXF1ZSBpZGVudGlmaWVycyBvZiB0aGUgaG90ZWxzIHJldHVybmVkLgorV2hlbiB0aGUgdXNlciBzZWxlY3RzIGEgaG90ZWwgdG8gdmlldyBkZXRhaWxzLCB5b3UgY2FuIHRoZW4gdXNlIFEyLAord2hpY2ggaXMgdXNlZCB0byBvYnRhaW4gZGV0YWlscyBhYm91dCB0aGUgaG90ZWwuIEJlY2F1c2UgeW91IGFscmVhZHkKK2hhdmUgdGhlIGBob3RlbF9pZGAgZnJvbSBRMSwgeW91IHVzZSB0aGF0IGFzIGEgcmVmZXJlbmNlIHRvIHRoZSBob3RlbAoreW914oCZcmUgbG9va2luZyBmb3IuIFRoZXJlZm9yZSB0aGUgc2Vjb25kIHRhYmxlIGlzIGp1c3QgY2FsbGVkIGBob3RlbHNgLgorCitBbm90aGVyIG9wdGlvbiB3b3VsZCBoYXZlIGJlZW4gdG8gc3RvcmUgYSBzZXQgb2YgYHBvaV9uYW1lc2AgaW4gdGhlCitob3RlbHMgdGFibGUuIFRoaXMgaXMgYW4gZXF1YWxseSB2YWxpZCBhcHByb2FjaC4gWW914oCZbGwgbGVhcm4gdGhyb3VnaAorZXhwZXJpZW5jZSB3aGljaCBhcHByb2FjaCBpcyBiZXN0IGZvciB5b3VyIGFwcGxpY2F0aW9uLgorCitRMyBpcyBqdXN0IGEgcmV2ZXJzZSBvZiBRMeKAlGxvb2tpbmcgZm9yIHBvaW50cyBvZiBpbnRlcmVzdCBuZWFyIGEgaG90ZWwsCityYXRoZXIgdGhhbiBob3RlbHMgbmVhciBhIHBvaW50IG9mIGludGVyZXN0LiBUaGlzIHRpbWUsIGhvd2V2ZXIsIHlvdQorbmVlZCB0byBhY2Nlc3MgdGhlIGRldGFpbHMgb2YgZWFjaCBwb2ludCBvZiBpbnRlcmVzdCwgYXMgcmVwcmVzZW50ZWQgYnkKK3RoZSBgcG9pc19ieV9ob3RlbGAgdGFibGUuIEFzIHByZXZpb3VzbHksIHlvdSBhZGQgdGhlIHBvaW50IG9mIGludGVyZXN0CituYW1lIGFzIGEgY2x1c3RlcmluZyBrZXkgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MuCisKK0F0IHRoaXMgcG9pbnQsIGxldOKAmXMgbm93IGNvbnNpZGVyIGhvdyB0byBzdXBwb3J0IHF1ZXJ5IFE0IHRvIGhlbHAgdGhlCit1c2VyIGZpbmQgYXZhaWxhYmxlIHJvb21zIGF0IGEgc2VsZWN0ZWQgaG90ZWwgZm9yIHRoZSBuaWdodHMgdGhleSBhcmUKK2ludGVyZXN0ZWQgaW4gc3RheWluZy4gTm90ZSB0aGF0IHRoaXMgcXVlcnkgaW52b2x2ZXMgYm90aCBhIHN0YXJ0IGRhdGUKK2FuZCBhbiBlbmQgZGF0ZS4gQmVjYXVzZSB5b3XigJlyZSBxdWVyeWluZyBvdmVyIGEgcmFuZ2UgaW5zdGVhZCBvZiBhCitzaW5nbGUgZGF0ZSwgeW91IGtub3cgdGhhdCB5b3XigJlsbCBuZWVkIHRvIHVzZSB0aGUgZGF0ZSBhcyBhIGNsdXN0ZXJpbmcKK2tleS4gVXNlIHRoZSBgaG90ZWxfaWRgIGFzIGEgcHJpbWFyeSBrZXkgdG8gZ3JvdXAgcm9vbSBkYXRhIGZvciBlYWNoCitob3RlbCBvbiBhIHNpbmdsZSBwYXJ0aXRpb24sIHdoaWNoIHNob3VsZCBoZWxwIHNlYXJjaGVzIGJlIHN1cGVyIGZhc3QuCitMZXTigJlzIGNhbGwgdGhpcyB0aGUgYGF2YWlsYWJsZV9yb29tc19ieV9ob3RlbF9kYXRlYCB0YWJsZS4KKworVG8gc3VwcG9ydCBzZWFyY2hpbmcgb3ZlciBhIHJhbmdlLCB1c2UgYGNsdXN0ZXJpbmcgY29sdW1ucworPGNsdXN0ZXJpbmctY29sdW1ucz5gIHRvIHN0b3JlIGF0dHJpYnV0ZXMgdGhhdCB5b3UgbmVlZCB0byBhY2Nlc3MgaW4gYQorcmFuZ2UgcXVlcnkuIFJlbWVtYmVyIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBjbHVzdGVyaW5nIGNvbHVtbnMgaXMKK2ltcG9ydGFudC4KKworVGhlIGRlc2lnbiBvZiB0aGUgYGF2YWlsYWJsZV9yb29tc19ieV9ob3RlbF9kYXRlYCB0YWJsZSBpcyBhbiBpbnN0YW5jZQorb2YgdGhlICp3aWRlIHBhcnRpdGlvbiogcGF0dGVybi4gVGhpcyBwYXR0ZXJuIGlzIHNvbWV0aW1lcyBjYWxsZWQgdGhlCisqd2lkZSByb3cqIHBhdHRlcm4gd2hlbiBkaXNjdXNzaW5nIGRhdGFiYXNlcyB0aGF0IHN1cHBvcnQgc2ltaWxhcgorbW9kZWxzLCBidXQgd2lkZSBwYXJ0aXRpb24gaXMgYSBtb3JlIGFjY3VyYXRlIGRlc2NyaXB0aW9uIGZyb20gYQorQ2Fzc2FuZHJhIHBlcnNwZWN0aXZlLiBUaGUgZXNzZW5jZSBvZiB0aGUgcGF0dGVybiBpcyB0byBncm91cCBtdWx0aXBsZQorcmVsYXRlZCByb3dzIGluIGEgcGFydGl0aW9uIGluIG9yZGVyIHRvIHN1cHBvcnQgZmFzdCBhY2Nlc3MgdG8gbXVsdGlwbGUKK3Jvd3Mgd2l0aGluIHRoZSBwYXJ0aXRpb24gaW4gYSBzaW5nbGUgcXVlcnkuCisKK0luIG9yZGVyIHRvIHJvdW5kIG91dCB0aGUgc2hvcHBpbmcgcG9ydGlvbiBvZiB0aGUgZGF0YSBtb2RlbCwgYWRkIHRoZQorYGFtZW5pdGllc19ieV9yb29tYCB0YWJsZSB0byBzdXBwb3J0IFE1LiBUaGlzIHdpbGwgYWxsb3cgdXNlcnMgdG8gdmlldwordGhlIGFtZW5pdGllcyBvZiBvbmUgb2YgdGhlIHJvb21zIHRoYXQgaXMgYXZhaWxhYmxlIGZvciB0aGUgZGVzaXJlZCBzdGF5CitkYXRlcy4KKworPT0gUmVzZXJ2YXRpb24gTG9naWNhbCBEYXRhIE1vZGVsCisKK05vdyBsZXQncyBzd2l0Y2ggZ2VhcnMgdG8gbG9vayBhdCB0aGUgcmVzZXJ2YXRpb24gcXVlcmllcy4gVGhlIGZpZ3VyZQorc2hvd3MgYSBsb2dpY2FsIGRhdGEgbW9kZWwgZm9yIHJlc2VydmF0aW9ucy4gWW914oCZbGwgbm90aWNlIHRoYXQgdGhlc2UKK3RhYmxlcyByZXByZXNlbnQgYSBkZW5vcm1hbGl6ZWQgZGVzaWduOyB0aGUgc2FtZSBkYXRhIGFwcGVhcnMgaW4KK211bHRpcGxlIHRhYmxlcywgd2l0aCBkaWZmZXJpbmcga2V5cy4KKworaW1hZ2U6OmRhdGEtbW9kZWxpbmdfcmVzZXJ2YXRpb25fbG9naWNhbC5wbmdbaW1hZ2VdCisKK0luIG9yZGVyIHRvIHNhdGlzZnkgUTYsIHRoZSBgcmVzZXJ2YXRpb25zX2J5X2d1ZXN0YCB0YWJsZSBjYW4gYmUgdXNlZCB0bworbG9vayB1cCB0aGUgcmVzZXJ2YXRpb24gYnkgZ3Vlc3QgbmFtZS4gWW91IGNvdWxkIGVudmlzaW9uIHF1ZXJ5IFE3IGJlaW5nCit1c2VkIG9uIGJlaGFsZiBvZiBhIGd1ZXN0IG9uIGEgc2VsZi1zZXJ2ZSB3ZWJzaXRlIG9yIGEgY2FsbCBjZW50ZXIgYWdlbnQKK3RyeWluZyB0byBhc3Npc3QgdGhlIGd1ZXN0LiBCZWNhdXNlIHRoZSBndWVzdCBuYW1lIG1pZ2h0IG5vdCBiZSB1bmlxdWUsCit5b3UgaW5jbHVkZSB0aGUgZ3Vlc3QgSUQgaGVyZSBhcyBhIGNsdXN0ZXJpbmcgY29sdW1uIGFzIHdlbGwuCisKK1E4IGFuZCBROSBpbiBwYXJ0aWN1bGFyIGhlbHAgdG8gcmVtaW5kIHlvdSB0byBjcmVhdGUgcXVlcmllcyB0aGF0CitzdXBwb3J0IHZhcmlvdXMgc3Rha2Vob2xkZXJzIG9mIHRoZSBhcHBsaWNhdGlvbiwgbm90IGp1c3QgY3VzdG9tZXJzIGJ1dAorc3RhZmYgYXMgd2VsbCwgYW5kIHBlcmhhcHMgZXZlbiB0aGUgYW5hbHl0aWNzIHRlYW0sIHN1cHBsaWVycywgYW5kIHNvCitvbi4KKworVGhlIGhvdGVsIHN0YWZmIG1pZ2h0IHdpc2ggdG8gc2VlIGEgcmVjb3JkIG9mIHVwY29taW5nIHJlc2VydmF0aW9ucyBieQorZGF0ZSBpbiBvcmRlciB0byBnZXQgaW5zaWdodCBpbnRvIGhvdyB0aGUgaG90ZWwgaXMgcGVyZm9ybWluZywgc3VjaCBhcword2hhdCBkYXRlcyB0aGUgaG90ZWwgaXMgc29sZCBvdXQgb3IgdW5kZXJzb2xkLiBROCBzdXBwb3J0cyB0aGUgcmV0cmlldmFsCitvZiByZXNlcnZhdGlvbnMgZm9yIGEgZ2l2ZW4gaG90ZWwgYnkgZGF0ZS4KKworRmluYWxseSwgeW91IGNyZWF0ZSBhIGBndWVzdHNgIHRhYmxlLiBUaGlzIHByb3ZpZGVzIGEgc2luZ2xlIGxvY2F0aW9uCit0aGF0IHVzZWQgdG8gc3RvcmUgZ3Vlc3QgaW5mb3JtYXRpb24uIEluIHRoaXMgY2FzZSwgeW91IHNwZWNpZnkgYQorc2VwYXJhdGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGd1ZXN0IHJlY29yZHMsIGFzIGl0IGlzIG5vdCB1bmNvbW1vbiBmb3IKK2d1ZXN0cyB0byBoYXZlIHRoZSBzYW1lIG5hbWUuIEluIG1hbnkgb3JnYW5pemF0aW9ucywgYSBjdXN0b21lciBkYXRhYmFzZQorc3VjaCBhcyB0aGUgYGd1ZXN0c2AgdGFibGUgd291bGQgYmUgcGFydCBvZiBhIHNlcGFyYXRlIGN1c3RvbWVyCittYW5hZ2VtZW50IGFwcGxpY2F0aW9uLCB3aGljaCBpcyB3aHkgb3RoZXIgZ3Vlc3QgYWNjZXNzIHBhdHRlcm5zIHdlcmUKK29taXR0ZWQgZnJvbSB0aGUgZXhhbXBsZS4KKworPT0gUGF0dGVybnMgYW5kIEFudGktUGF0dGVybnMKKworQXMgd2l0aCBvdGhlciB0eXBlcyBvZiBzb2Z0d2FyZSBkZXNpZ24sIHRoZXJlIGFyZSBzb21lIHdlbGwta25vd24KK3BhdHRlcm5zIGFuZCBhbnRpLXBhdHRlcm5zIGZvciBkYXRhIG1vZGVsaW5nIGluIENhc3NhbmRyYS4gWW914oCZdmUKK2FscmVhZHkgdXNlZCBvbmUgb2YgdGhlIG1vc3QgY29tbW9uIHBhdHRlcm5zIGluIHRoaXMgaG90ZWwgbW9kZWzigJR0aGUKK3dpZGUgcGFydGl0aW9uIHBhdHRlcm4uCisKK1RoZSAqdGltZSBzZXJpZXMqIHBhdHRlcm4gaXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSB3aWRlIHBhcnRpdGlvbiBwYXR0ZXJuLgorSW4gdGhpcyBwYXR0ZXJuLCBhIHNlcmllcyBvZiBtZWFzdXJlbWVudHMgYXQgc3BlY2lmaWMgdGltZSBpbnRlcnZhbHMgYXJlCitzdG9yZWQgaW4gYSB3aWRlIHBhcnRpdGlvbiwgd2hlcmUgdGhlIG1lYXN1cmVtZW50IHRpbWUgaXMgdXNlZCBhcyBwYXJ0CitvZiB0aGUgcGFydGl0aW9uIGtleS4gVGhpcyBwYXR0ZXJuIGlzIGZyZXF1ZW50bHkgdXNlZCBpbiBkb21haW5zCitpbmNsdWRpbmcgYnVzaW5lc3MgYW5hbHlzaXMsIHNlbnNvciBkYXRhIG1hbmFnZW1lbnQsIGFuZCBzY2llbnRpZmljCitleHBlcmltZW50cy4KKworVGhlIHRpbWUgc2VyaWVzIHBhdHRlcm4gaXMgYWxzbyB1c2VmdWwgZm9yIGRhdGEgb3RoZXIgdGhhbiBtZWFzdXJlbWVudHMuCitDb25zaWRlciB0aGUgZXhhbXBsZSBvZiBhIGJhbmtpbmcgYXBwbGljYXRpb24uIFlvdSBjb3VsZCBzdG9yZSBlYWNoCitjdXN0b21lcuKAmXMgYmFsYW5jZSBpbiBhIHJvdywgYnV0IHRoYXQgbWlnaHQgbGVhZCB0byBhIGxvdCBvZiByZWFkIGFuZAord3JpdGUgY29udGVudGlvbiBhcyB2YXJpb3VzIGN1c3RvbWVycyBjaGVjayB0aGVpciBiYWxhbmNlIG9yIG1ha2UKK3RyYW5zYWN0aW9ucy4gWW914oCZZCBwcm9iYWJseSBiZSB0ZW1wdGVkIHRvIHdyYXAgYSB0cmFuc2FjdGlvbiBhcm91bmQKK3dyaXRlcyBqdXN0IHRvIHByb3RlY3QgdGhlIGJhbGFuY2UgZnJvbSBiZWluZyB1cGRhdGVkIGluIGVycm9yLiBJbgorY29udHJhc3QsIGEgdGltZSBzZXJpZXPigJNzdHlsZSBkZXNpZ24gd291bGQgc3RvcmUgZWFjaCB0cmFuc2FjdGlvbiBhcyBhCit0aW1lc3RhbXBlZCByb3cgYW5kIGxlYXZlIHRoZSB3b3JrIG9mIGNhbGN1bGF0aW5nIHRoZSBjdXJyZW50IGJhbGFuY2UgdG8KK3RoZSBhcHBsaWNhdGlvbi4KKworT25lIGRlc2lnbiB0cmFwIHRoYXQgbWFueSBuZXcgdXNlcnMgZmFsbCBpbnRvIGlzIGF0dGVtcHRpbmcgdG8gdXNlCitDYXNzYW5kcmEgYXMgYSBxdWV1ZS4gRWFjaCBpdGVtIGluIHRoZSBxdWV1ZSBpcyBzdG9yZWQgd2l0aCBhIHRpbWVzdGFtcAoraW4gYSB3aWRlIHBhcnRpdGlvbi4gSXRlbXMgYXJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHF1ZXVlIGFuZCByZWFkCitmcm9tIHRoZSBmcm9udCwgYmVpbmcgZGVsZXRlZCBhZnRlciB0aGV5IGFyZSByZWFkLiBUaGlzIGlzIGEgZGVzaWduIHRoYXQKK3NlZW1zIGF0dHJhY3RpdmUsIGVzcGVjaWFsbHkgZ2l2ZW4gaXRzIGFwcGFyZW50IHNpbWlsYXJpdHkgdG8gdGhlIHRpbWUKK3NlcmllcyBwYXR0ZXJuLiBUaGUgcHJvYmxlbSB3aXRoIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCB0aGUgZGVsZXRlZCBpdGVtcworYXJlIG5vdyBgdG9tYnN0b25lcyA8YXN5bmNoLWRlbGV0ZXM+YCB0aGF0IENhc3NhbmRyYSBtdXN0IHNjYW4gcGFzdCBpbgorb3JkZXIgdG8gcmVhZCBmcm9tIHRoZSBmcm9udCBvZiB0aGUgcXVldWUuIE92ZXIgdGltZSwgYSBncm93aW5nIG51bWJlcgorb2YgdG9tYnN0b25lcyBiZWdpbnMgdG8gZGVncmFkZSByZWFkIHBlcmZvcm1hbmNlLgorCitUaGUgcXVldWUgYW50aS1wYXR0ZXJuIHNlcnZlcyBhcyBhIHJlbWluZGVyIHRoYXQgYW55IGRlc2lnbiB0aGF0IHJlbGllcworb24gdGhlIGRlbGV0aW9uIG9mIGRhdGEgaXMgcG90ZW50aWFsbHkgYSBwb29ybHkgcGVyZm9ybWluZyBkZXNpZ24uCisKK19NYXRlcmlhbCBhZGFwdGVkIGZyb20gQ2Fzc2FuZHJhLCBUaGUgRGVmaW5pdGl2ZSBHdWlkZS4gUHVibGlzaGVkIGJ5CitPJ1JlaWxseSBNZWRpYSwgSW5jLiBDb3B5cmlnaHQgwqkgMjAyMCBKZWZmIENhcnBlbnRlciwgRWJlbiBIZXdpdHQuIEFsbAorcmlnaHRzIHJlc2VydmVkLiBVc2VkIHdpdGggcGVybWlzc2lvbi5fCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfcGh5c2ljYWwuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19waHlzaWNhbC5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNjY5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfcGh5c2ljYWwuYWRvYwpAQCAtMCwwICsxLDk2IEBACis9IFBoeXNpY2FsIERhdGEgTW9kZWxpbmcKKworT25jZSB5b3UgaGF2ZSBhIGxvZ2ljYWwgZGF0YSBtb2RlbCBkZWZpbmVkLCBjcmVhdGluZyB0aGUgcGh5c2ljYWwgbW9kZWwKK2lzIGEgcmVsYXRpdmVseSBzaW1wbGUgcHJvY2Vzcy4KKworWW91IHdhbGsgdGhyb3VnaCBlYWNoIG9mIHRoZSBsb2dpY2FsIG1vZGVsIHRhYmxlcywgYXNzaWduaW5nIHR5cGVzIHRvCitlYWNoIGl0ZW0uIFlvdSBjYW4gdXNlIGFueSB2YWxpZCBgQ1FMIGRhdGEgdHlwZSA8ZGF0YS10eXBlcz5gLCBpbmNsdWRpbmcKK3RoZSBiYXNpYyB0eXBlcywgY29sbGVjdGlvbnMsIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMuIFlvdSBtYXkgaWRlbnRpZnkKK2FkZGl0aW9uYWwgdXNlci1kZWZpbmVkIHR5cGVzIHRoYXQgY2FuIGJlIGNyZWF0ZWQgdG8gc2ltcGxpZnkgeW91cgorZGVzaWduLgorCitBZnRlciB5b3XigJl2ZSBhc3NpZ25lZCBkYXRhIHR5cGVzLCB5b3UgYW5hbHl6ZSB0aGUgbW9kZWwgYnkgcGVyZm9ybWluZworc2l6ZSBjYWxjdWxhdGlvbnMgYW5kIHRlc3Rpbmcgb3V0IGhvdyB0aGUgbW9kZWwgd29ya3MuIFlvdSBtYXkgbWFrZSBzb21lCithZGp1c3RtZW50cyBiYXNlZCBvbiB5b3VyIGZpbmRpbmdzLiBPbmNlIGFnYWluIGxldCdzIGNvdmVyIHRoZSBkYXRhCittb2RlbGluZyBwcm9jZXNzIGluIG1vcmUgZGV0YWlsIGJ5IHdvcmtpbmcgdGhyb3VnaCBhbiBleGFtcGxlLgorCitCZWZvcmUgZ2V0dGluZyBzdGFydGVkLCBsZXTigJlzIGxvb2sgYXQgYSBmZXcgYWRkaXRpb25zIHRvIHRoZSBDaGVib3Rrbworbm90YXRpb24gZm9yIHBoeXNpY2FsIGRhdGEgbW9kZWxzLiBUbyBkcmF3IHBoeXNpY2FsIG1vZGVscywgeW91IG5lZWQgdG8KK2JlIGFibGUgdG8gYWRkIHRoZSB0eXBpbmcgaW5mb3JtYXRpb24gZm9yIGVhY2ggY29sdW1uLiBUaGlzIGZpZ3VyZSBzaG93cwordGhlIGFkZGl0aW9uIG9mIGEgdHlwZSBmb3IgZWFjaCBjb2x1bW4gaW4gYSBzYW1wbGUgdGFibGUuCisKK2ltYWdlOjpkYXRhLW1vZGVsaW5nX2NoZWJvdGtvX3BoeXNpY2FsLnBuZ1tpbWFnZV0KKworVGhlIGZpZ3VyZSBpbmNsdWRlcyBhIGRlc2lnbmF0aW9uIG9mIHRoZSBrZXlzcGFjZSBjb250YWluaW5nIGVhY2ggdGFibGUKK2FuZCB2aXN1YWwgY3VlcyBmb3IgY29sdW1ucyByZXByZXNlbnRlZCB1c2luZyBjb2xsZWN0aW9ucyBhbmQKK3VzZXItZGVmaW5lZCB0eXBlcy4gTm90ZSB0aGUgZGVzaWduYXRpb24gb2Ygc3RhdGljIGNvbHVtbnMgYW5kIHNlY29uZGFyeQoraW5kZXggY29sdW1ucy4gVGhlcmUgaXMgbm8gcmVzdHJpY3Rpb24gb24gYXNzaWduaW5nIHRoZXNlIGFzIHBhcnQgb2YgYQorbG9naWNhbCBtb2RlbCwgYnV0IHRoZXkgYXJlIHR5cGljYWxseSBtb3JlIG9mIGEgcGh5c2ljYWwgZGF0YSBtb2RlbGluZworY29uY2Vybi4KKworPT0gSG90ZWwgUGh5c2ljYWwgRGF0YSBNb2RlbAorCitOb3cgbGV04oCZcyBnZXQgdG8gd29yayBvbiB0aGUgcGh5c2ljYWwgbW9kZWwuIEZpcnN0LCB5b3UgbmVlZCBrZXlzcGFjZXMKK3RvIGNvbnRhaW4gdGhlIHRhYmxlcy4gVG8ga2VlcCB0aGUgZGVzaWduIHJlbGF0aXZlbHkgc2ltcGxlLCBjcmVhdGUgYQorYGhvdGVsYCBrZXlzcGFjZSB0byBjb250YWluIHRhYmxlcyBmb3IgaG90ZWwgYW5kIGF2YWlsYWJpbGl0eSBkYXRhLCBhbmQKK2EgYHJlc2VydmF0aW9uYCBrZXlzcGFjZSB0byBjb250YWluIHRhYmxlcyBmb3IgcmVzZXJ2YXRpb24gYW5kIGd1ZXN0CitkYXRhLiBJbiBhIHJlYWwgc3lzdGVtLCB5b3UgbWlnaHQgZGl2aWRlIHRoZSB0YWJsZXMgYWNyb3NzIGV2ZW4gbW9yZQora2V5c3BhY2VzIGluIG9yZGVyIHRvIHNlcGFyYXRlIGNvbmNlcm5zLgorCitGb3IgdGhlIGBob3RlbHNgIHRhYmxlLCB1c2UgQ2Fzc2FuZHJh4oCZcyBgdGV4dGAgdHlwZSB0byByZXByZXNlbnQgdGhlCitob3RlbOKAmXMgYGlkYC4gRm9yIHRoZSBhZGRyZXNzLCBjcmVhdGUgYW4gYGFkZHJlc3NgIHVzZXIgZGVmaW5lZCB0eXBlLgorVXNlIHRoZSBgdGV4dGAgdHlwZSB0byByZXByZXNlbnQgdGhlIHBob25lIG51bWJlciwgYXMgdGhlcmUgaXMKK2NvbnNpZGVyYWJsZSB2YXJpYW5jZSBpbiB0aGUgZm9ybWF0dGluZyBvZiBudW1iZXJzIGJldHdlZW4gY291bnRyaWVzLgorCitXaGlsZSBpdCB3b3VsZCBtYWtlIHNlbnNlIHRvIHVzZSB0aGUgYHV1aWRgIHR5cGUgZm9yIGF0dHJpYnV0ZXMgc3VjaCBhcwordGhlIGBob3RlbF9pZGAsIHRoaXMgZG9jdW1lbnQgdXNlcyBtb3N0bHkgYHRleHRgIGF0dHJpYnV0ZXMgYXMKK2lkZW50aWZpZXJzLCB0byBrZWVwIHRoZSBzYW1wbGVzIHNpbXBsZSBhbmQgcmVhZGFibGUuIEZvciBleGFtcGxlLCBhCitjb21tb24gY29udmVudGlvbiBpbiB0aGUgaG9zcGl0YWxpdHkgaW5kdXN0cnkgaXMgdG8gcmVmZXJlbmNlIHByb3BlcnRpZXMKK2J5IHNob3J0IGNvZGVzIGxpa2UgIkFaMTIzIiBvciAiTlkyMjkiLiBUaGlzIGV4YW1wbGUgdXNlcyB0aGVzZSB2YWx1ZXMKK2ZvciBgaG90ZWxfaWRzYCwgd2hpbGUgYWNrbm93bGVkZ2luZyB0aGV5IGFyZSBub3QgbmVjZXNzYXJpbHkgZ2xvYmFsbHkKK3VuaXF1ZS4KKworWW914oCZbGwgZmluZCB0aGF0IGl04oCZcyBvZnRlbiBoZWxwZnVsIHRvIHVzZSB1bmlxdWUgSURzIHRvIHVuaXF1ZWx5CityZWZlcmVuY2UgZWxlbWVudHMsIGFuZCB0byB1c2UgdGhlc2UgYHV1aWRzYCBhcyByZWZlcmVuY2VzIGluIHRhYmxlcworcmVwcmVzZW50aW5nIG90aGVyIGVudGl0aWVzLiBUaGlzIGhlbHBzIHRvIG1pbmltaXplIGNvdXBsaW5nIGJldHdlZW4KK2RpZmZlcmVudCBlbnRpdHkgdHlwZXMuIFRoaXMgbWF5IHByb3ZlIGVzcGVjaWFsbHkgZWZmZWN0aXZlIGlmIHlvdSBhcmUKK3VzaW5nIGEgbWljcm9zZXJ2aWNlIGFyY2hpdGVjdHVyYWwgc3R5bGUgZm9yIHlvdXIgYXBwbGljYXRpb24sIGluIHdoaWNoCit0aGVyZSBhcmUgc2VwYXJhdGUgc2VydmljZXMgcmVzcG9uc2libGUgZm9yIGVhY2ggZW50aXR5IHR5cGUuCisKK0FzIHlvdSB3b3JrIHRvIGNyZWF0ZSBwaHlzaWNhbCByZXByZXNlbnRhdGlvbnMgb2YgdmFyaW91cyB0YWJsZXMgaW4gdGhlCitsb2dpY2FsIGhvdGVsIGRhdGEgbW9kZWwsIHlvdSB1c2UgdGhlIHNhbWUgYXBwcm9hY2guIFRoZSByZXN1bHRpbmcKK2Rlc2lnbiBpcyBzaG93biBpbiB0aGlzIGZpZ3VyZToKKworaW1hZ2U6OmRhdGEtbW9kZWxpbmdfaG90ZWxfcGh5c2ljYWwucG5nW2ltYWdlXQorCitOb3RlIHRoYXQgdGhlIGBhZGRyZXNzYCB0eXBlIGlzIGFsc28gaW5jbHVkZWQgaW4gdGhlIGRlc2lnbi4gSXQgaXMKK2Rlc2lnbmF0ZWQgd2l0aCBhbiBhc3RlcmlzayB0byBkZW5vdGUgdGhhdCBpdCBpcyBhIHVzZXItZGVmaW5lZCB0eXBlLAorYW5kIGhhcyBubyBwcmltYXJ5IGtleSBjb2x1bW5zIGlkZW50aWZpZWQuIFRoaXMgdHlwZSBpcyB1c2VkIGluIHRoZQorYGhvdGVsc2AgYW5kIGBob3RlbHNfYnlfcG9pYCB0YWJsZXMuCisKK1VzZXItZGVmaW5lZCB0eXBlcyBhcmUgZnJlcXVlbnRseSB1c2VkIHRvIGhlbHAgcmVkdWNlIGR1cGxpY2F0aW9uIG9mCitub24tcHJpbWFyeSBrZXkgY29sdW1ucywgYXMgd2FzIGRvbmUgd2l0aCB0aGUgYGFkZHJlc3NgIHVzZXItZGVmaW5lZAordHlwZS4gVGhpcyBjYW4gcmVkdWNlIGNvbXBsZXhpdHkgaW4gdGhlIGRlc2lnbi4KKworUmVtZW1iZXIgdGhhdCB0aGUgc2NvcGUgb2YgYSBVRFQgaXMgdGhlIGtleXNwYWNlIGluIHdoaWNoIGl0IGlzIGRlZmluZWQuCitUbyB1c2UgYGFkZHJlc3NgIGluIHRoZSBgcmVzZXJ2YXRpb25gIGtleXNwYWNlIGRlZmluZWQgYmVsb3cgZGVzaWduLAoreW914oCZbGwgaGF2ZSB0byBkZWNsYXJlIGl0IGFnYWluLiBUaGlzIGlzIGp1c3Qgb25lIG9mIHRoZSBtYW55IHRyYWRlLW9mZnMKK3lvdSBoYXZlIHRvIG1ha2UgaW4gZGF0YSBtb2RlbCBkZXNpZ24uCisKKz09IFJlc2VydmF0aW9uIFBoeXNpY2FsIERhdGEgTW9kZWwKKworTm93LCBsZXTigJlzIGV4YW1pbmUgcmVzZXJ2YXRpb24gdGFibGVzIGluIHRoZSBkZXNpZ24uIFJlbWVtYmVyIHRoYXQgdGhlCitsb2dpY2FsIG1vZGVsIGNvbnRhaW5lZCB0aHJlZSBkZW5vcm1hbGl6ZWQgdGFibGVzIHRvIHN1cHBvcnQgcXVlcmllcyBmb3IKK3Jlc2VydmF0aW9ucyBieSBjb25maXJtYXRpb24gbnVtYmVyLCBndWVzdCwgYW5kIGhvdGVsIGFuZCBkYXRlLiBGb3IgdGhlCitmaXJzdCBpdGVyYXRpb24gb2YgeW91ciBwaHlzaWNhbCBkYXRhIG1vZGVsIGRlc2lnbiwgYXNzdW1lIHlvdSdyZSBnb2luZwordG8gbWFuYWdlIHRoaXMgZGVub3JtYWxpemF0aW9uIG1hbnVhbGx5LiBOb3RlIHRoYXQgdGhpcyBkZXNpZ24gY291bGQgYmUKK3JldmlzZWQgdG8gdXNlIENhc3NhbmRyYeKAmXMgKGV4cGVyaW1lbnRhbCkgbWF0ZXJpYWxpemVkIHZpZXcgZmVhdHVyZS4KKworaW1hZ2U6OmRhdGEtbW9kZWxpbmdfcmVzZXJ2YXRpb25fcGh5c2ljYWwucG5nW2ltYWdlXQorCitOb3RlIHRoYXQgdGhlIGBhZGRyZXNzYCB0eXBlIGlzIHJlcHJvZHVjZWQgaW4gdGhpcyBrZXlzcGFjZSBhbmQKK2BndWVzdF9pZGAgaXMgbW9kZWxlZCBhcyBhIGB1dWlkYCB0eXBlIGluIGFsbCBvZiB0aGUgdGFibGVzLgorCitfTWF0ZXJpYWwgYWRhcHRlZCBmcm9tIENhc3NhbmRyYSwgVGhlIERlZmluaXRpdmUgR3VpZGUuIFB1Ymxpc2hlZCBieQorTydSZWlsbHkgTWVkaWEsIEluYy4gQ29weXJpZ2h0IMKpIDIwMjAgSmVmZiBDYXJwZW50ZXIsIEViZW4gSGV3aXR0LiBBbGwKK3JpZ2h0cyByZXNlcnZlZC4gVXNlZCB3aXRoIHBlcm1pc3Npb24uXwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3F1ZXJpZXMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19xdWVyaWVzLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3ODAwNgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19xdWVyaWVzLmFkb2MKQEAgLTAsMCArMSw2MCBAQAorPSBEZWZpbmluZyBBcHBsaWNhdGlvbiBRdWVyaWVzCisKK0xldOKAmXMgdHJ5IHRoZSBxdWVyeS1maXJzdCBhcHByb2FjaCB0byBzdGFydCBkZXNpZ25pbmcgdGhlIGRhdGEgbW9kZWwgZm9yCithIGhvdGVsIGFwcGxpY2F0aW9uLiBUaGUgdXNlciBpbnRlcmZhY2UgZGVzaWduIGZvciB0aGUgYXBwbGljYXRpb24gaXMKK29mdGVuIGEgZ3JlYXQgYXJ0aWZhY3QgdG8gdXNlIHRvIGJlZ2luIGlkZW50aWZ5aW5nIHF1ZXJpZXMuIExldOKAmXMgYXNzdW1lCit0aGF0IHlvdeKAmXZlIHRhbGtlZCB3aXRoIHRoZSBwcm9qZWN0IHN0YWtlaG9sZGVycyBhbmQgeW91ciBVWCBkZXNpZ25lcnMKK2hhdmUgcHJvZHVjZWQgdXNlciBpbnRlcmZhY2UgZGVzaWducyBvciB3aXJlZnJhbWVzIGZvciB0aGUga2V5IHVzZQorY2FzZXMuIFlvdeKAmWxsIGxpa2VseSBoYXZlIGEgbGlzdCBvZiBzaG9wcGluZyBxdWVyaWVzIGxpa2UgdGhlIGZvbGxvd2luZzoKKworKiBRMS4gRmluZCBob3RlbHMgbmVhciBhIGdpdmVuIHBvaW50IG9mIGludGVyZXN0LgorKiBRMi4gRmluZCBpbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIGhvdGVsLCBzdWNoIGFzIGl0cyBuYW1lIGFuZAorbG9jYXRpb24uCisqIFEzLiBGaW5kIHBvaW50cyBvZiBpbnRlcmVzdCBuZWFyIGEgZ2l2ZW4gaG90ZWwuCisqIFE0LiBGaW5kIGFuIGF2YWlsYWJsZSByb29tIGluIGEgZ2l2ZW4gZGF0ZSByYW5nZS4KKyogUTUuIEZpbmQgdGhlIHJhdGUgYW5kIGFtZW5pdGllcyBmb3IgYSByb29tLgorCitJdCBpcyBvZnRlbiBoZWxwZnVsIHRvIGJlIGFibGUgdG8gcmVmZXIgdG8gcXVlcmllcyBieSBhIHNob3J0aGFuZCBudW1iZXIKK3JhdGhlciB0aGF0IGV4cGxhaW5pbmcgdGhlbSBpbiBmdWxsLiBUaGUgcXVlcmllcyBsaXN0ZWQgaGVyZSBhcmUKK251bWJlcmVkIFExLCBRMiwgYW5kIHNvIG9uLCB3aGljaCBpcyBob3cgdGhleSBhcmUgcmVmZXJlbmNlZCBpbiBkaWFncmFtcwordGhyb3VnaG91dCB0aGUgZXhhbXBsZS4KKworTm93IGlmIHRoZSBhcHBsaWNhdGlvbiBpcyB0byBiZSBhIHN1Y2Nlc3MsIHlvdeKAmWxsIGNlcnRhaW5seSB3YW50CitjdXN0b21lcnMgdG8gYmUgYWJsZSB0byBib29rIHJlc2VydmF0aW9ucyBhdCBob3RlbHMuIFRoaXMgaW5jbHVkZXMgc3RlcHMKK3N1Y2ggYXMgc2VsZWN0aW5nIGFuIGF2YWlsYWJsZSByb29tIGFuZCBlbnRlcmluZyB0aGVpciBndWVzdAoraW5mb3JtYXRpb24uIFNvIGNsZWFybHkgeW91IHdpbGwgYWxzbyBuZWVkIHNvbWUgcXVlcmllcyB0aGF0IGFkZHJlc3MgdGhlCityZXNlcnZhdGlvbiBhbmQgZ3Vlc3QgZW50aXRpZXMgZnJvbSB0aGUgY29uY2VwdHVhbCBkYXRhIG1vZGVsLiBFdmVuCitoZXJlLCBob3dldmVyLCB5b3XigJlsbCB3YW50IHRvIHRoaW5rIG5vdCBvbmx5IGZyb20gdGhlIGN1c3RvbWVyCitwZXJzcGVjdGl2ZSBpbiB0ZXJtcyBvZiBob3cgdGhlIGRhdGEgaXMgd3JpdHRlbiwgYnV0IGFsc28gaW4gdGVybXMgb2YKK2hvdyB0aGUgZGF0YSB3aWxsIGJlIHF1ZXJpZWQgYnkgZG93bnN0cmVhbSB1c2UgY2FzZXMuCisKK1lvdSBuYXR1cmFsIHRlbmRlbmN5IGFzIG1pZ2h0IGJlIHRvIGZvY3VzIGZpcnN0IG9uIGRlc2lnbmluZyB0aGUgdGFibGVzCit0byBzdG9yZSByZXNlcnZhdGlvbiBhbmQgZ3Vlc3QgcmVjb3JkcywgYW5kIG9ubHkgdGhlbiBzdGFydCB0aGlua2luZworYWJvdXQgdGhlIHF1ZXJpZXMgdGhhdCB3b3VsZCBhY2Nlc3MgdGhlbS4gWW91IG1heSBoYXZlIGZlbHQgYSBzaW1pbGFyCit0ZW5zaW9uIGFscmVhZHkgd2hlbiBkaXNjdXNzaW5nIHRoZSBzaG9wcGluZyBxdWVyaWVzIGJlZm9yZSwgdGhpbmtpbmcKK+KAnGJ1dCB3aGVyZSBkaWQgdGhlIGhvdGVsIGFuZCBwb2ludCBvZiBpbnRlcmVzdCBkYXRhIGNvbWUgZnJvbT/igJ0gRG9u4oCZdAord29ycnksIHlvdSB3aWxsIHNlZSBzb29uIGVub3VnaC4gSGVyZSBhcmUgc29tZSBxdWVyaWVzIHRoYXQgZGVzY3JpYmUgaG93Cit1c2VycyB3aWxsIGFjY2VzcyByZXNlcnZhdGlvbnM6CisKKyogUTYuIExvb2t1cCBhIHJlc2VydmF0aW9uIGJ5IGNvbmZpcm1hdGlvbiBudW1iZXIuCisqIFE3LiBMb29rdXAgYSByZXNlcnZhdGlvbiBieSBob3RlbCwgZGF0ZSwgYW5kIGd1ZXN0IG5hbWUuCisqIFE4LiBMb29rdXAgYWxsIHJlc2VydmF0aW9ucyBieSBndWVzdCBuYW1lLgorKiBROS4gVmlldyBndWVzdCBkZXRhaWxzLgorCitBbGwgb2YgdGhlIHF1ZXJpZXMgYXJlIHNob3duIGluIHRoZSBjb250ZXh0IG9mIHRoZSB3b3JrZmxvdyBvZiB0aGUKK2FwcGxpY2F0aW9uIGluIHRoZSBmaWd1cmUgYmVsb3cuIEVhY2ggYm94IG9uIHRoZSBkaWFncmFtIHJlcHJlc2VudHMgYQorc3RlcCBpbiB0aGUgYXBwbGljYXRpb24gd29ya2Zsb3csIHdpdGggYXJyb3dzIGluZGljYXRpbmcgdGhlIGZsb3dzCitiZXR3ZWVuIHN0ZXBzIGFuZCB0aGUgYXNzb2NpYXRlZCBxdWVyeS4gSWYgeW914oCZdmUgbW9kZWxlZCB0aGUKK2FwcGxpY2F0aW9uIHdlbGwsIGVhY2ggc3RlcCBvZiB0aGUgd29ya2Zsb3cgYWNjb21wbGlzaGVzIGEgdGFzayB0aGF0CivigJx1bmxvY2tz4oCdIHN1YnNlcXVlbnQgc3RlcHMuIEZvciBleGFtcGxlLCB0aGUg4oCcVmlldyBob3RlbHMgbmVhciBQT0nigJ0gdGFzaworaGVscHMgdGhlIGFwcGxpY2F0aW9uIGxlYXJuIGFib3V0IHNldmVyYWwgaG90ZWxzLCBpbmNsdWRpbmcgdGhlaXIgdW5pcXVlCitrZXlzLiBUaGUga2V5IGZvciBhIHNlbGVjdGVkIGhvdGVsIG1heSBiZSB1c2VkIGFzIHBhcnQgb2YgUTIsIGluIG9yZGVyCit0byBvYnRhaW4gZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGhvdGVsLiBUaGUgYWN0IG9mIGJvb2tpbmcgYSByb29tCitjcmVhdGVzIGEgcmVzZXJ2YXRpb24gcmVjb3JkIHRoYXQgbWF5IGJlIGFjY2Vzc2VkIGJ5IHRoZSBndWVzdCBhbmQgaG90ZWwKK3N0YWZmIGF0IGEgbGF0ZXIgdGltZSB0aHJvdWdoIHZhcmlvdXMgYWRkaXRpb25hbCBxdWVyaWVzLgorCitpbWFnZTo6ZGF0YS1tb2RlbGluZ19ob3RlbF9xdWVyaWVzLnBuZ1tpbWFnZV0KKworX01hdGVyaWFsIGFkYXB0ZWQgZnJvbSBDYXNzYW5kcmEsIFRoZSBEZWZpbml0aXZlIEd1aWRlLiBQdWJsaXNoZWQgYnkKK08nUmVpbGx5IE1lZGlhLCBJbmMuIENvcHlyaWdodCDCqSAyMDIwIEplZmYgQ2FycGVudGVyLCBFYmVuIEhld2l0dC4gQWxsCityaWdodHMgcmVzZXJ2ZWQuIFVzZWQgd2l0aCBwZXJtaXNzaW9uLl8KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19yZGJtcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3JkYm1zLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAwMDdkNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19yZGJtcy5hZG9jCkBAIC0wLDAgKzEsMTQ0IEBACis9IFJEQk1TIERlc2lnbgorCitXaGVuIHlvdSBzZXQgb3V0IHRvIGJ1aWxkIGEgbmV3IGRhdGEtZHJpdmVuIGFwcGxpY2F0aW9uIHRoYXQgd2lsbCB1c2UgYQorcmVsYXRpb25hbCBkYXRhYmFzZSwgeW91IG1pZ2h0IHN0YXJ0IGJ5IG1vZGVsaW5nIHRoZSBkb21haW4gYXMgYSBzZXQgb2YKK3Byb3Blcmx5IG5vcm1hbGl6ZWQgdGFibGVzIGFuZCB1c2UgZm9yZWlnbiBrZXlzIHRvIHJlZmVyZW5jZSByZWxhdGVkCitkYXRhIGluIG90aGVyIHRhYmxlcy4KKworVGhlIGZpZ3VyZSBiZWxvdyBzaG93cyBob3cgeW91IG1pZ2h0IHJlcHJlc2VudCB0aGUgZGF0YSBzdG9yYWdlIGZvciB5b3VyCithcHBsaWNhdGlvbiB1c2luZyBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgbW9kZWwuIFRoZSByZWxhdGlvbmFsIG1vZGVsCitpbmNsdWRlcyBhIGNvdXBsZSBvZiDigJxqb2lu4oCdIHRhYmxlcyBpbiBvcmRlciB0byByZWFsaXplIHRoZSBtYW55LXRvLW1hbnkKK3JlbGF0aW9uc2hpcHMgZnJvbSB0aGUgY29uY2VwdHVhbCBtb2RlbCBvZiBob3RlbHMtdG8tcG9pbnRzIG9mIGludGVyZXN0LAorcm9vbXMtdG8tYW1lbml0aWVzLCByb29tcy10by1hdmFpbGFiaWxpdHksIGFuZCBndWVzdHMtdG8tcm9vbXMgKHZpYSBhCityZXNlcnZhdGlvbikuCisKK2ltYWdlOjpkYXRhLW1vZGVsaW5nX2hvdGVsX3JlbGF0aW9uYWwucG5nW2ltYWdlXQorCis9PSBEZXNpZ24gRGlmZmVyZW5jZXMgQmV0d2VlbiBSREJNUyBhbmQgQ2Fzc2FuZHJhCisKK0xldOKAmXMgdGFrZSBhIG1pbnV0ZSB0byBoaWdobGlnaHQgc29tZSBvZiB0aGUga2V5IGRpZmZlcmVuY2VzIGluIGRvaW5nCitkYXRhIG1vZGVsaW5nIGZvciBDYXNzYW5kcmEgdmVyc3VzIGEgcmVsYXRpb25hbCBkYXRhYmFzZS4KKworPT09IE5vIGpvaW5zCisKK1lvdSBjYW5ub3QgcGVyZm9ybSBqb2lucyBpbiBDYXNzYW5kcmEuIElmIHlvdSBoYXZlIGRlc2lnbmVkIGEgZGF0YSBtb2RlbAorYW5kIGZpbmQgdGhhdCB5b3UgbmVlZCBzb21ldGhpbmcgbGlrZSBhIGpvaW4sIHlvdeKAmWxsIGhhdmUgdG8gZWl0aGVyIGRvCit0aGUgd29yayBvbiB0aGUgY2xpZW50IHNpZGUsIG9yIGNyZWF0ZSBhIGRlbm9ybWFsaXplZCBzZWNvbmQgdGFibGUgdGhhdAorcmVwcmVzZW50cyB0aGUgam9pbiByZXN1bHRzIGZvciB5b3UuIFRoaXMgbGF0dGVyIG9wdGlvbiBpcyBwcmVmZXJyZWQgaW4KK0Nhc3NhbmRyYSBkYXRhIG1vZGVsaW5nLiBQZXJmb3JtaW5nIGpvaW5zIG9uIHRoZSBjbGllbnQgc2hvdWxkIGJlIGEgdmVyeQorcmFyZSBjYXNlOyB5b3UgcmVhbGx5IHdhbnQgdG8gZHVwbGljYXRlIChkZW5vcm1hbGl6ZSkgdGhlIGRhdGEgaW5zdGVhZC4KKworPT09IE5vIHJlZmVyZW50aWFsIGludGVncml0eQorCitBbHRob3VnaCBDYXNzYW5kcmEgc3VwcG9ydHMgZmVhdHVyZXMgc3VjaCBhcyBsaWdodHdlaWdodCB0cmFuc2FjdGlvbnMKK2FuZCBiYXRjaGVzLCBDYXNzYW5kcmEgaXRzZWxmIGhhcyBubyBjb25jZXB0IG9mIHJlZmVyZW50aWFsIGludGVncml0eQorYWNyb3NzIHRhYmxlcy4gSW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlLCB5b3UgY291bGQgc3BlY2lmeSBmb3JlaWduIGtleXMKK2luIGEgdGFibGUgdG8gcmVmZXJlbmNlIHRoZSBwcmltYXJ5IGtleSBvZiBhIHJlY29yZCBpbiBhbm90aGVyIHRhYmxlLgorQnV0IENhc3NhbmRyYSBkb2VzIG5vdCBlbmZvcmNlIHRoaXMuIEl0IGlzIHN0aWxsIGEgY29tbW9uIGRlc2lnbgorcmVxdWlyZW1lbnQgdG8gc3RvcmUgSURzIHJlbGF0ZWQgdG8gb3RoZXIgZW50aXRpZXMgaW4geW91ciB0YWJsZXMsIGJ1dAorb3BlcmF0aW9ucyBzdWNoIGFzIGNhc2NhZGluZyBkZWxldGVzIGFyZSBub3QgYXZhaWxhYmxlLgorCis9PT0gRGVub3JtYWxpemF0aW9uCisKK0luIHJlbGF0aW9uYWwgZGF0YWJhc2UgZGVzaWduLCB5b3UgYXJlIG9mdGVuIHRhdWdodCB0aGUgaW1wb3J0YW5jZSBvZgorbm9ybWFsaXphdGlvbi4gVGhpcyBpcyBub3QgYW4gYWR2YW50YWdlIHdoZW4gd29ya2luZyB3aXRoIENhc3NhbmRyYQorYmVjYXVzZSBpdCBwZXJmb3JtcyBiZXN0IHdoZW4gdGhlIGRhdGEgbW9kZWwgaXMgZGVub3JtYWxpemVkLiBJdCBpcworb2Z0ZW4gdGhlIGNhc2UgdGhhdCBjb21wYW5pZXMgZW5kIHVwIGRlbm9ybWFsaXppbmcgZGF0YSBpbiByZWxhdGlvbmFsCitkYXRhYmFzZXMgYXMgd2VsbC4gVGhlcmUgYXJlIHR3byBjb21tb24gcmVhc29ucyBmb3IgdGhpcy4gT25lIGlzCitwZXJmb3JtYW5jZS4gQ29tcGFuaWVzIHNpbXBseSBjYW7igJl0IGdldCB0aGUgcGVyZm9ybWFuY2UgdGhleSBuZWVkIHdoZW4KK3RoZXkgaGF2ZSB0byBkbyBzbyBtYW55IGpvaW5zIG9uIHllYXJz4oCZIHdvcnRoIG9mIGRhdGEsIHNvIHRoZXkKK2Rlbm9ybWFsaXplIGFsb25nIHRoZSBsaW5lcyBvZiBrbm93biBxdWVyaWVzLiBUaGlzIGVuZHMgdXAgd29ya2luZywgYnV0Citnb2VzIGFnYWluc3QgdGhlIGdyYWluIG9mIGhvdyByZWxhdGlvbmFsIGRhdGFiYXNlcyBhcmUgaW50ZW5kZWQgdG8gYmUKK2Rlc2lnbmVkLCBhbmQgdWx0aW1hdGVseSBtYWtlcyBvbmUgcXVlc3Rpb24gd2hldGhlciB1c2luZyBhIHJlbGF0aW9uYWwKK2RhdGFiYXNlIGlzIHRoZSBiZXN0IGFwcHJvYWNoIGluIHRoZXNlIGNpcmN1bXN0YW5jZXMuCisKK0Egc2Vjb25kIHJlYXNvbiB0aGF0IHJlbGF0aW9uYWwgZGF0YWJhc2VzIGdldCBkZW5vcm1hbGl6ZWQgb24gcHVycG9zZSBpcworYSBidXNpbmVzcyBkb2N1bWVudCBzdHJ1Y3R1cmUgdGhhdCByZXF1aXJlcyByZXRlbnRpb24uIFRoYXQgaXMsIHlvdSBoYXZlCithbiBlbmNsb3NpbmcgdGFibGUgdGhhdCByZWZlcnMgdG8gYSBsb3Qgb2YgZXh0ZXJuYWwgdGFibGVzIHdob3NlIGRhdGEKK2NvdWxkIGNoYW5nZSBvdmVyIHRpbWUsIGJ1dCB5b3UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgZW5jbG9zaW5nIGRvY3VtZW50CithcyBhIHNuYXBzaG90IGluIGhpc3RvcnkuIFRoZSBjb21tb24gZXhhbXBsZSBoZXJlIGlzIHdpdGggaW52b2ljZXMuIFlvdQorYWxyZWFkeSBoYXZlIGN1c3RvbWVyIGFuZCBwcm9kdWN0IHRhYmxlcywgYW5kIHlvdeKAmWQgdGhpbmsgdGhhdCB5b3UgY291bGQKK2p1c3QgbWFrZSBhbiBpbnZvaWNlIHRoYXQgcmVmZXJzIHRvIHRob3NlIHRhYmxlcy4gQnV0IHRoaXMgc2hvdWxkIG5ldmVyCitiZSBkb25lIGluIHByYWN0aWNlLiBDdXN0b21lciBvciBwcmljZSBpbmZvcm1hdGlvbiBjb3VsZCBjaGFuZ2UsIGFuZAordGhlbiB5b3Ugd291bGQgbG9zZSB0aGUgaW50ZWdyaXR5IG9mIHRoZSBpbnZvaWNlIGRvY3VtZW50IGFzIGl0IHdhcyBvbgordGhlIGludm9pY2UgZGF0ZSwgd2hpY2ggY291bGQgdmlvbGF0ZSBhdWRpdHMsIHJlcG9ydHMsIG9yIGxhd3MsIGFuZAorY2F1c2Ugb3RoZXIgcHJvYmxlbXMuCisKK0luIHRoZSByZWxhdGlvbmFsIHdvcmxkLCBkZW5vcm1hbGl6YXRpb24gdmlvbGF0ZXMgQ29kZOKAmXMgbm9ybWFsIGZvcm1zLAorYW5kIHlvdSB0cnkgdG8gYXZvaWQgaXQuIEJ1dCBpbiBDYXNzYW5kcmEsIGRlbm9ybWFsaXphdGlvbiBpcywgd2VsbCwKK3BlcmZlY3RseSBub3JtYWwuIEl04oCZcyBub3QgcmVxdWlyZWQgaWYgeW91ciBkYXRhIG1vZGVsIGlzIHNpbXBsZS4gQnV0Citkb27igJl0IGJlIGFmcmFpZCBvZiBpdC4KKworSGlzdG9yaWNhbGx5LCBkZW5vcm1hbGl6YXRpb24gaW4gQ2Fzc2FuZHJhIGhhcyByZXF1aXJlZCBkZXNpZ25pbmcgYW5kCittYW5hZ2luZyBtdWx0aXBsZSB0YWJsZXMgdXNpbmcgdGVjaG5pcXVlcyBkZXNjcmliZWQgaW4gdGhpcworZG9jdW1lbnRhdGlvbi4gQmVnaW5uaW5nIHdpdGggdGhlIDMuMCByZWxlYXNlLCBDYXNzYW5kcmEgcHJvdmlkZXMgYQorZmVhdHVyZSBrbm93biBhcyBgbWF0ZXJpYWxpemVkIHZpZXdzIDxtYXRlcmlhbGl6ZWQtdmlld3M+YCB3aGljaCBhbGxvd3MKK3lvdSB0byBjcmVhdGUgbXVsdGlwbGUgZGVub3JtYWxpemVkIHZpZXdzIG9mIGRhdGEgYmFzZWQgb24gYSBiYXNlIHRhYmxlCitkZXNpZ24uIENhc3NhbmRyYSBtYW5hZ2VzIG1hdGVyaWFsaXplZCB2aWV3cyBvbiB0aGUgc2VydmVyLCBpbmNsdWRpbmcKK3RoZSB3b3JrIG9mIGtlZXBpbmcgdGhlIHZpZXdzIGluIHN5bmMgd2l0aCB0aGUgdGFibGUuCisKKz09PSBRdWVyeS1maXJzdCBkZXNpZ24KKworUmVsYXRpb25hbCBtb2RlbGluZywgaW4gc2ltcGxlIHRlcm1zLCBtZWFucyB0aGF0IHlvdSBzdGFydCBmcm9tIHRoZQorY29uY2VwdHVhbCBkb21haW4gYW5kIHRoZW4gcmVwcmVzZW50IHRoZSBub3VucyBpbiB0aGUgZG9tYWluIGluIHRhYmxlcy4KK1lvdSB0aGVuIGFzc2lnbiBwcmltYXJ5IGtleXMgYW5kIGZvcmVpZ24ga2V5cyB0byBtb2RlbCByZWxhdGlvbnNoaXBzLgorV2hlbiB5b3UgaGF2ZSBhIG1hbnktdG8tbWFueSByZWxhdGlvbnNoaXAsIHlvdSBjcmVhdGUgdGhlIGpvaW4gdGFibGVzCit0aGF0IHJlcHJlc2VudCBqdXN0IHRob3NlIGtleXMuIFRoZSBqb2luIHRhYmxlcyBkb27igJl0IGV4aXN0IGluIHRoZSByZWFsCit3b3JsZCwgYW5kIGFyZSBhIG5lY2Vzc2FyeSBzaWRlIGVmZmVjdCBvZiB0aGUgd2F5IHJlbGF0aW9uYWwgbW9kZWxzCit3b3JrLiBBZnRlciB5b3UgaGF2ZSBhbGwgeW91ciB0YWJsZXMgbGFpZCBvdXQsIHlvdSBjYW4gc3RhcnQgd3JpdGluZworcXVlcmllcyB0aGF0IHB1bGwgdG9nZXRoZXIgZGlzcGFyYXRlIGRhdGEgdXNpbmcgdGhlIHJlbGF0aW9uc2hpcHMKK2RlZmluZWQgYnkgdGhlIGtleXMuIFRoZSBxdWVyaWVzIGluIHRoZSByZWxhdGlvbmFsIHdvcmxkIGFyZSB2ZXJ5IG11Y2gKK3NlY29uZGFyeS4gSXQgaXMgYXNzdW1lZCB0aGF0IHlvdSBjYW4gYWx3YXlzIGdldCB0aGUgZGF0YSB5b3Ugd2FudCBhcworbG9uZyBhcyB5b3UgaGF2ZSB5b3VyIHRhYmxlcyBtb2RlbGVkIHByb3Blcmx5LiBFdmVuIGlmIHlvdSBoYXZlIHRvIHVzZQorc2V2ZXJhbCBjb21wbGV4IHN1YnF1ZXJpZXMgb3Igam9pbiBzdGF0ZW1lbnRzLCB0aGlzIGlzIHVzdWFsbHkgdHJ1ZS4KKworQnkgY29udHJhc3QsIGluIENhc3NhbmRyYSB5b3UgZG9u4oCZdCBzdGFydCB3aXRoIHRoZSBkYXRhIG1vZGVsOyB5b3Ugc3RhcnQKK3dpdGggdGhlIHF1ZXJ5IG1vZGVsLiBJbnN0ZWFkIG9mIG1vZGVsaW5nIHRoZSBkYXRhIGZpcnN0IGFuZCB0aGVuCit3cml0aW5nIHF1ZXJpZXMsIHdpdGggQ2Fzc2FuZHJhIHlvdSBtb2RlbCB0aGUgcXVlcmllcyBhbmQgbGV0IHRoZSBkYXRhCitiZSBvcmdhbml6ZWQgYXJvdW5kIHRoZW0uIFRoaW5rIG9mIHRoZSBtb3N0IGNvbW1vbiBxdWVyeSBwYXRocyB5b3VyCithcHBsaWNhdGlvbiB3aWxsIHVzZSwgYW5kIHRoZW4gY3JlYXRlIHRoZSB0YWJsZXMgdGhhdCB5b3UgbmVlZCB0bworc3VwcG9ydCB0aGVtLgorCitEZXRyYWN0b3JzIGhhdmUgc3VnZ2VzdGVkIHRoYXQgZGVzaWduaW5nIHRoZSBxdWVyaWVzIGZpcnN0IGlzIG92ZXJseQorY29uc3RyYWluaW5nIG9uIGFwcGxpY2F0aW9uIGRlc2lnbiwgbm90IHRvIG1lbnRpb24gZGF0YWJhc2UgbW9kZWxpbmcuCitCdXQgaXQgaXMgcGVyZmVjdGx5IHJlYXNvbmFibGUgdG8gZXhwZWN0IHRoYXQgeW91IHNob3VsZCB0aGluayBoYXJkCithYm91dCB0aGUgcXVlcmllcyBpbiB5b3VyIGFwcGxpY2F0aW9uLCBqdXN0IGFzIHlvdSB3b3VsZCwgcHJlc3VtYWJseSwKK3RoaW5rIGhhcmQgYWJvdXQgeW91ciByZWxhdGlvbmFsIGRvbWFpbi4gWW91IG1heSBnZXQgaXQgd3JvbmcsIGFuZCB0aGVuCit5b3XigJlsbCBoYXZlIHByb2JsZW1zIGluIGVpdGhlciB3b3JsZC4gT3IgeW91ciBxdWVyeSBuZWVkcyBtaWdodCBjaGFuZ2UKK292ZXIgdGltZSwgYW5kIHRoZW4geW914oCZbGwgaGF2ZSB0byB3b3JrIHRvIHVwZGF0ZSB5b3VyIGRhdGEgc2V0LiBCdXQKK3RoaXMgaXMgbm8gZGlmZmVyZW50IGZyb20gZGVmaW5pbmcgdGhlIHdyb25nIHRhYmxlcywgb3IgbmVlZGluZworYWRkaXRpb25hbCB0YWJsZXMsIGluIGFuIFJEQk1TLgorCis9PT0gRGVzaWduaW5nIGZvciBvcHRpbWFsIHN0b3JhZ2UKKworSW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlLCBpdCBpcyBmcmVxdWVudGx5IHRyYW5zcGFyZW50IHRvIHRoZSB1c2VyIGhvdwordGFibGVzIGFyZSBzdG9yZWQgb24gZGlzaywgYW5kIGl0IGlzIHJhcmUgdG8gaGVhciBvZiByZWNvbW1lbmRhdGlvbnMKK2Fib3V0IGRhdGEgbW9kZWxpbmcgYmFzZWQgb24gaG93IHRoZSBSREJNUyBtaWdodCBzdG9yZSB0YWJsZXMgb24gZGlzay4KK0hvd2V2ZXIsIHRoYXQgaXMgYW4gaW1wb3J0YW50IGNvbnNpZGVyYXRpb24gaW4gQ2Fzc2FuZHJhLiBCZWNhdXNlCitDYXNzYW5kcmEgdGFibGVzIGFyZSBlYWNoIHN0b3JlZCBpbiBzZXBhcmF0ZSBmaWxlcyBvbiBkaXNrLCBpdOKAmXMKK2ltcG9ydGFudCB0byBrZWVwIHJlbGF0ZWQgY29sdW1ucyBkZWZpbmVkIHRvZ2V0aGVyIGluIHRoZSBzYW1lIHRhYmxlLgorCitBIGtleSBnb2FsIHRoYXQgeW91IHdpbGwgc2VlIGFzIHlvdSBiZWdpbiBjcmVhdGluZyBkYXRhIG1vZGVscyBpbgorQ2Fzc2FuZHJhIGlzIHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgcGFydGl0aW9ucyB0aGF0IG11c3QgYmUgc2VhcmNoZWQKK2luIG9yZGVyIHRvIHNhdGlzZnkgYSBnaXZlbiBxdWVyeS4gQmVjYXVzZSB0aGUgcGFydGl0aW9uIGlzIGEgdW5pdCBvZgorc3RvcmFnZSB0aGF0IGRvZXMgbm90IGdldCBkaXZpZGVkIGFjcm9zcyBub2RlcywgYSBxdWVyeSB0aGF0IHNlYXJjaGVzIGEKK3NpbmdsZSBwYXJ0aXRpb24gd2lsbCB0eXBpY2FsbHkgeWllbGQgdGhlIGJlc3QgcGVyZm9ybWFuY2UuCisKKz09PSBTb3J0aW5nIGlzIGEgZGVzaWduIGRlY2lzaW9uCisKK0luIGFuIFJEQk1TLCB5b3UgY2FuIGVhc2lseSBjaGFuZ2UgdGhlIG9yZGVyIGluIHdoaWNoIHJlY29yZHMgYXJlCityZXR1cm5lZCB0byB5b3UgYnkgdXNpbmcgYE9SREVSIEJZYCBpbiB5b3VyIHF1ZXJ5LiBUaGUgZGVmYXVsdCBzb3J0CitvcmRlciBpcyBub3QgY29uZmlndXJhYmxlOyBieSBkZWZhdWx0LCByZWNvcmRzIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIKK2luIHdoaWNoIHRoZXkgYXJlIHdyaXR0ZW4uIElmIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgb3JkZXIsIHlvdSBqdXN0Cittb2RpZnkgeW91ciBxdWVyeSwgYW5kIHlvdSBjYW4gc29ydCBieSBhbnkgbGlzdCBvZiBjb2x1bW5zLgorCitJbiBDYXNzYW5kcmEsIGhvd2V2ZXIsIHNvcnRpbmcgaXMgdHJlYXRlZCBkaWZmZXJlbnRseTsgaXQgaXMgYSBkZXNpZ24KK2RlY2lzaW9uLiBUaGUgc29ydCBvcmRlciBhdmFpbGFibGUgb24gcXVlcmllcyBpcyBmaXhlZCwgYW5kIGlzCitkZXRlcm1pbmVkIGVudGlyZWx5IGJ5IHRoZSBzZWxlY3Rpb24gb2YgY2x1c3RlcmluZyBjb2x1bW5zIHlvdSBzdXBwbHkgaW4KK3RoZSBgQ1JFQVRFIFRBQkxFYCBjb21tYW5kLiBUaGUgQ1FMIGBTRUxFQ1RgIHN0YXRlbWVudCBkb2VzIHN1cHBvcnQKK2BPUkRFUiBCWWAgc2VtYW50aWNzLCBidXQgb25seSBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSBjbHVzdGVyaW5nCitjb2x1bW5zLgorCitfTWF0ZXJpYWwgYWRhcHRlZCBmcm9tIENhc3NhbmRyYSwgVGhlIERlZmluaXRpdmUgR3VpZGUuIFB1Ymxpc2hlZCBieQorTydSZWlsbHkgTWVkaWEsIEluYy4gQ29weXJpZ2h0IMKpIDIwMjAgSmVmZiBDYXJwZW50ZXIsIEViZW4gSGV3aXR0LiBBbGwKK3JpZ2h0cyByZXNlcnZlZC4gVXNlZCB3aXRoIHBlcm1pc3Npb24uXwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3JlZmluaW5nLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfcmVmaW5pbmcuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQ4ZmZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3JlZmluaW5nLmFkb2MKQEAgLTAsMCArMSwyMDIgQEAKKz0gRXZhbHVhdGluZyBhbmQgUmVmaW5pbmcgRGF0YSBNb2RlbHMKKzpzdGVtOiBsYXRleG1hdGgKKworT25jZSB5b3XigJl2ZSBjcmVhdGVkIGEgcGh5c2ljYWwgbW9kZWwsIHRoZXJlIGFyZSBzb21lIHN0ZXBzIHlvdeKAmWxsIHdhbnQKK3RvIHRha2UgdG8gZXZhbHVhdGUgYW5kIHJlZmluZSB0YWJsZSBkZXNpZ25zIHRvIGhlbHAgZW5zdXJlIG9wdGltYWwKK3BlcmZvcm1hbmNlLgorCis9PSBDYWxjdWxhdGluZyBQYXJ0aXRpb24gU2l6ZQorCitUaGUgZmlyc3QgdGhpbmcgdGhhdCB5b3Ugd2FudCB0byBsb29rIGZvciBpcyB3aGV0aGVyIHlvdXIgdGFibGVzIHdpbGwKK2hhdmUgcGFydGl0aW9ucyB0aGF0IHdpbGwgYmUgb3Zlcmx5IGxhcmdlLCBvciB0byBwdXQgaXQgYW5vdGhlciB3YXksIHRvbword2lkZS4gUGFydGl0aW9uIHNpemUgaXMgbWVhc3VyZWQgYnkgdGhlIG51bWJlciBvZiBjZWxscyAodmFsdWVzKSB0aGF0CithcmUgc3RvcmVkIGluIHRoZSBwYXJ0aXRpb24uIENhc3NhbmRyYeKAmXMgaGFyZCBsaW1pdCBpcyAyIGJpbGxpb24gY2VsbHMKK3BlciBwYXJ0aXRpb24sIGJ1dCB5b3XigJlsbCBsaWtlbHkgcnVuIGludG8gcGVyZm9ybWFuY2UgaXNzdWVzIGJlZm9yZQorcmVhY2hpbmcgdGhhdCBsaW1pdC4KKworSW4gb3JkZXIgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHBhcnRpdGlvbnMsIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisKK1tsYXRleG1hdGhdCisrKysrCitcW05fdiA9IE5fciAoTl9jIC0gTl97cGt9IC0gTl9zKSArIE5fc1xdCisrKysrCisKK1RoZSBudW1iZXIgb2YgdmFsdWVzIChvciBjZWxscykgaW4gdGhlIHBhcnRpdGlvbiAoTn52fikgaXMgZXF1YWwgdG8gdGhlCitudW1iZXIgb2Ygc3RhdGljIGNvbHVtbnMgKE5+c34pIHBsdXMgdGhlIHByb2R1Y3Qgb2YgdGhlIG51bWJlciBvZiByb3dzCisoTn5yfikgYW5kIHRoZSBudW1iZXIgb2Ygb2YgdmFsdWVzIHBlciByb3cuIFRoZSBudW1iZXIgb2YgdmFsdWVzIHBlciByb3cKK2lzIGRlZmluZWQgYXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIChOfmN+KSBtaW51cyB0aGUgbnVtYmVyIG9mIHByaW1hcnkKK2tleSBjb2x1bW5zIChOfnBrfikgYW5kIHN0YXRpYyBjb2x1bW5zIChOfnN+KS4KKworVGhlIG51bWJlciBvZiBjb2x1bW5zIHRlbmRzIHRvIGJlIHJlbGF0aXZlbHkgc3RhdGljLCBhbHRob3VnaCBpdCBpcworcG9zc2libGUgdG8gYWx0ZXIgdGFibGVzIGF0IHJ1bnRpbWUuIEZvciB0aGlzIHJlYXNvbiwgYSBwcmltYXJ5IGRyaXZlcgorb2YgcGFydGl0aW9uIHNpemUgaXMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBwYXJ0aXRpb24uIFRoaXMgaXMgYSBrZXkKK2ZhY3RvciB0aGF0IHlvdSBtdXN0IGNvbnNpZGVyIGluIGRldGVybWluaW5nIHdoZXRoZXIgYSBwYXJ0aXRpb24gaGFzIHRoZQorcG90ZW50aWFsIHRvIGdldCB0b28gbGFyZ2UuIFR3byBiaWxsaW9uIHZhbHVlcyBzb3VuZHMgbGlrZSBhIGxvdCwgYnV0IGluCithIHNlbnNvciBzeXN0ZW0gd2hlcmUgdGVucyBvciBodW5kcmVkcyBvZiB2YWx1ZXMgYXJlIG1lYXN1cmVkIGV2ZXJ5CittaWxsaXNlY29uZCwgdGhlIG51bWJlciBvZiB2YWx1ZXMgc3RhcnRzIHRvIGFkZCB1cCBwcmV0dHkgZmFzdC4KKworTGV04oCZcyB0YWtlIGEgbG9vayBhdCBvbmUgb2YgdGhlIHRhYmxlcyB0byBhbmFseXplIHRoZSBwYXJ0aXRpb24gc2l6ZS4KK0JlY2F1c2UgaXQgaGFzIGEgd2lkZSBwYXJ0aXRpb24gZGVzaWduIHdpdGggb25lIHBhcnRpdGlvbiBwZXIgaG90ZWwsCitsb29rIGF0IHRoZSBgYXZhaWxhYmxlX3Jvb21zX2J5X2hvdGVsX2RhdGVgIHRhYmxlLiBUaGUgdGFibGUgaGFzIGZvdXIKK2NvbHVtbnMgdG90YWwgKE5+Y34gPSA0KSwgaW5jbHVkaW5nIHRocmVlIHByaW1hcnkga2V5IGNvbHVtbnMgKE5+cGt+ID0KKzMpIGFuZCBubyBzdGF0aWMgY29sdW1ucyAoTn5zfiA9IDApLiBQbHVnZ2luZyB0aGVzZSB2YWx1ZXMgaW50byB0aGUKK2Zvcm11bGEsIHRoZSByZXN1bHQgaXM6CisKK1tsYXRleG1hdGhdCisrKysrCitcW05fdiA9IE5fciAoNCAtIDMgLSAwKSArIDAgPSAxTl9yXF0KKysrKysKKworVGhlcmVmb3JlIHRoZSBudW1iZXIgb2YgdmFsdWVzIGZvciB0aGlzIHRhYmxlIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YKK3Jvd3MuIFlvdSBzdGlsbCBuZWVkIHRvIGRldGVybWluZSBhIG51bWJlciBvZiByb3dzLiBUbyBkbyB0aGlzLCBtYWtlCitlc3RpbWF0ZXMgYmFzZWQgb24gdGhlIGFwcGxpY2F0aW9uIGRlc2lnbi4gVGhlIHRhYmxlIGlzIHN0b3JpbmcgYSByZWNvcmQKK2ZvciBlYWNoIHJvb20sIGluIGVhY2ggb2YgaG90ZWwsIGZvciBldmVyeSBuaWdodC4gTGV0J3MgYXNzdW1lIHRoZQorc3lzdGVtIHdpbGwgYmUgdXNlZCB0byBzdG9yZSB0d28geWVhcnMgb2YgaW52ZW50b3J5IGF0IGEgdGltZSwgYW5kIHRoZXJlCithcmUgNSwwMDAgaG90ZWxzIGluIHRoZSBzeXN0ZW0sIHdpdGggYW4gYXZlcmFnZSBvZiAxMDAgcm9vbXMgaW4gZWFjaAoraG90ZWwuCisKK1NpbmNlIHRoZXJlIGlzIGEgcGFydGl0aW9uIGZvciBlYWNoIGhvdGVsLCB0aGUgZXN0aW1hdGVkIG51bWJlciBvZiByb3dzCitwZXIgcGFydGl0aW9uIGlzIGFzIGZvbGxvd3M6CisKK1tsYXRleG1hdGhdCisrKysrCitcW05fciA9IDEwMCByb29tcy9ob3RlbCBcdGltZXMgNzMwIGRheXMgPSA3MywwMDAgcm93c1xdCisrKysrCisKK1RoaXMgcmVsYXRpdmVseSBzbWFsbCBudW1iZXIgb2Ygcm93cyBwZXIgcGFydGl0aW9uIGlzIG5vdCBnb2luZyB0byBnZXQKK3lvdSBpbiB0b28gbXVjaCB0cm91YmxlLCBidXQgaWYgeW91IHN0YXJ0IHN0b3JpbmcgbW9yZSBkYXRlcyBvZgoraW52ZW50b3J5LCBvciBkb27igJl0IG1hbmFnZSB0aGUgc2l6ZSBvZiB0aGUgaW52ZW50b3J5IHdlbGwgdXNpbmcgVFRMLCB5b3UKK2NvdWxkIHN0YXJ0IGhhdmluZyBpc3N1ZXMuIFlvdSBzdGlsbCBtaWdodCB3YW50IHRvIGxvb2sgYXQgYnJlYWtpbmcgdXAKK3RoaXMgbGFyZ2UgcGFydGl0aW9uLCB3aGljaCB5b3UnbGwgc2VlIGhvdyB0byBkbyBzaG9ydGx5LgorCitXaGVuIHBlcmZvcm1pbmcgc2l6aW5nIGNhbGN1bGF0aW9ucywgaXQgaXMgdGVtcHRpbmcgdG8gYXNzdW1lIHRoZQorbm9taW5hbCBvciBhdmVyYWdlIGNhc2UgZm9yIHZhcmlhYmxlcyBzdWNoIGFzIHRoZSBudW1iZXIgb2Ygcm93cy4KK0NvbnNpZGVyIGNhbGN1bGF0aW5nIHRoZSB3b3JzdCBjYXNlIGFzIHdlbGwsIGFzIHRoZXNlIHNvcnRzIG9mCitwcmVkaWN0aW9ucyBoYXZlIGEgd2F5IG9mIGNvbWluZyB0cnVlIGluIHN1Y2Nlc3NmdWwgc3lzdGVtcy4KKworPT0gQ2FsY3VsYXRpbmcgU2l6ZSBvbiBEaXNrCisKK0luIGFkZGl0aW9uIHRvIGNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIGEgcGFydGl0aW9uLCBpdCBpcyBhbHNvIGFuCitleGNlbGxlbnQgaWRlYSB0byBlc3RpbWF0ZSB0aGUgYW1vdW50IG9mIGRpc2sgc3BhY2UgdGhhdCB3aWxsIGJlCityZXF1aXJlZCBmb3IgZWFjaCB0YWJsZSB5b3UgcGxhbiB0byBzdG9yZSBpbiB0aGUgY2x1c3Rlci4gSW4gb3JkZXIgdG8KK2RldGVybWluZSB0aGUgc2l6ZSwgdXNlIHRoZSBmb2xsb3dpbmcgZm9ybXVsYSB0byBkZXRlcm1pbmUgdGhlIHNpemUgU350fgorb2YgYSBwYXJ0aXRpb246CisKK1tsYXRleG1hdGhdCisrKysrCitcW1NfdCA9IFxkaXNwbGF5c3R5bGVcc3VtX2kgc2l6ZU9mXGJpZyAoY197a19pfVxiaWcpICsgXGRpc3BsYXlzdHlsZVxzdW1faiBzaXplT2ZcYmlnKGNfe3Nfan1cYmlnKSArIE5fclx0aW1lcyBcYmlnZyhcZGlzcGxheXN0eWxlXHN1bV9rIHNpemVPZlxiaWcoY197cl9rfVxiaWcpICsgXGRpc3BsYXlzdHlsZVxzdW1fbCBzaXplT2ZcYmlnKGNfe2NfbH1cYmlnKVxiaWdnKSArXF0KKysrKysKKworW2xhdGV4bWF0aF0KKysrKysKK1xbTl92XHRpbWVzIHNpemVPZlxiaWcodF97YXZnfVxiaWcpXF0KKysrKysKKworVGhpcyBpcyBhIGJpdCBtb3JlIGNvbXBsZXggdGhhbiB0aGUgcHJldmlvdXMgZm9ybXVsYSwgYnV0IGxldCdzIGJyZWFrIGl0Citkb3duIGEgYml0IGF0IGEgdGltZS4gTGV04oCZcyB0YWtlIGEgbG9vayBhdCB0aGUgbm90YXRpb24gZmlyc3Q6CisKKyogSW4gdGhpcyBmb3JtdWxhLCBjfmt+IHJlZmVycyB0byBwYXJ0aXRpb24ga2V5IGNvbHVtbnMsIGN+c34gdG8gc3RhdGljCitjb2x1bW5zLCBjfnJ+IHRvIHJlZ3VsYXIgY29sdW1ucywgYW5kIGN+Y34gdG8gY2x1c3RlcmluZyBjb2x1bW5zLgorKiBUaGUgdGVybSB0fmF2Z34gcmVmZXJzIHRvIHRoZSBhdmVyYWdlIG51bWJlciBvZiBieXRlcyBvZiBtZXRhZGF0YQorc3RvcmVkIHBlciBjZWxsLCBzdWNoIGFzIHRpbWVzdGFtcHMuIEl0IGlzIHR5cGljYWwgdG8gdXNlIGFuIGVzdGltYXRlIG9mCis4IGJ5dGVzIGZvciB0aGlzIHZhbHVlLgorKiBZb3UnbGwgcmVjb2duaXplIHRoZSBudW1iZXIgb2Ygcm93cyBOfnJ+IGFuZCBudW1iZXIgb2YgdmFsdWVzIE5+dn4KK2Zyb20gcHJldmlvdXMgY2FsY3VsYXRpb25zLgorKiBUaGUgKnNpemVPZigpKiBmdW5jdGlvbiByZWZlcnMgdG8gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIENRTCBkYXRhCit0eXBlIG9mIGVhY2ggcmVmZXJlbmNlZCBjb2x1bW4uCisKK1RoZSBmaXJzdCB0ZXJtIGFza3MgeW91IHRvIHN1bSB0aGUgc2l6ZSBvZiB0aGUgcGFydGl0aW9uIGtleSBjb2x1bW5zLgorRm9yIHRoaXMgZXhhbXBsZSwgdGhlIGBhdmFpbGFibGVfcm9vbXNfYnlfaG90ZWxfZGF0ZWAgdGFibGUgaGFzIGEgc2luZ2xlCitwYXJ0aXRpb24ga2V5IGNvbHVtbiwgdGhlIGBob3RlbF9pZGAsIHdoaWNoIGlzIG9mIHR5cGUgYHRleHRgLiBBc3N1bWluZwordGhhdCBob3RlbCBpZGVudGlmaWVycyBhcmUgc2ltcGxlIDUtY2hhcmFjdGVyIGNvZGVzLCB5b3UgaGF2ZSBhIDUtYnl0ZQordmFsdWUsIHNvIHRoZSBzdW0gb2YgdGhlIHBhcnRpdGlvbiBrZXkgY29sdW1uIHNpemVzIGlzIDUgYnl0ZXMuCisKK1RoZSBzZWNvbmQgdGVybSBhc2tzIHlvdSB0byBzdW0gdGhlIHNpemUgb2YgdGhlIHN0YXRpYyBjb2x1bW5zLiBUaGlzCit0YWJsZSBoYXMgbm8gc3RhdGljIGNvbHVtbnMsIHNvIHRoZSBzaXplIGlzIDAgYnl0ZXMuCisKK1RoZSB0aGlyZCB0ZXJtIGlzIHRoZSBtb3N0IGludm9sdmVkLCBhbmQgZm9yIGdvb2QgcmVhc29u4oCUaXQgaXMKK2NhbGN1bGF0aW5nIHRoZSBzaXplIG9mIHRoZSBjZWxscyBpbiB0aGUgcGFydGl0aW9uLiBTdW0gdGhlIHNpemUgb2YgdGhlCitjbHVzdGVyaW5nIGNvbHVtbnMgYW5kIHJlZ3VsYXIgY29sdW1ucy4gVGhlIHR3byBjbHVzdGVyaW5nIGNvbHVtbnMgYXJlCit0aGUgYGRhdGVgLCB3aGljaCBpcyA0IGJ5dGVzLCBhbmQgdGhlIGByb29tX251bWJlcmAsIHdoaWNoIGlzIGEgMi1ieXRlCitzaG9ydCBpbnRlZ2VyLCBnaXZpbmcgYSBzdW0gb2YgNiBieXRlcy4gVGhlcmUgaXMgb25seSBhIHNpbmdsZSByZWd1bGFyCitjb2x1bW4sIHRoZSBib29sZWFuIGBpc19hdmFpbGFibGVgLCB3aGljaCBpcyAxIGJ5dGUgaW4gc2l6ZS4gU3VtbWluZyB0aGUKK3JlZ3VsYXIgY29sdW1uIHNpemUgKDEgYnl0ZSkgcGx1cyB0aGUgY2x1c3RlcmluZyBjb2x1bW4gc2l6ZSAoNiBieXRlcykKK2dpdmVzIGEgdG90YWwgb2YgNyBieXRlcy4gVG8gZmluaXNoIHVwIHRoZSB0ZXJtLCBtdWx0aXBseSB0aGlzIHZhbHVlIGJ5Cit0aGUgbnVtYmVyIG9mIHJvd3MgKDczLDAwMCksIGdpdmluZyBhIHJlc3VsdCBvZiA1MTEsMDAwIGJ5dGVzICgwLjUxIE1CKS4KKworVGhlIGZvdXJ0aCB0ZXJtIGlzIHNpbXBseSBjb3VudGluZyB0aGUgbWV0YWRhdGEgdGhhdCB0aGF0IENhc3NhbmRyYQorc3RvcmVzIGZvciBlYWNoIGNlbGwuIEluIHRoZSBzdG9yYWdlIGZvcm1hdCB1c2VkIGJ5IENhc3NhbmRyYSAzLjAgYW5kCitsYXRlciwgdGhlIGFtb3VudCBvZiBtZXRhZGF0YSBmb3IgYSBnaXZlbiBjZWxsIHZhcmllcyBiYXNlZCBvbiB0aGUgdHlwZQorb2YgZGF0YSBiZWluZyBzdG9yZWQsIGFuZCB3aGV0aGVyIG9yIG5vdCBjdXN0b20gdGltZXN0YW1wIG9yIFRUTCB2YWx1ZXMKK2FyZSBzcGVjaWZpZWQgZm9yIGluZGl2aWR1YWwgY2VsbHMuIEZvciB0aGlzIHRhYmxlLCByZXVzZSB0aGUgbnVtYmVyIG9mCit2YWx1ZXMgZnJvbSB0aGUgcHJldmlvdXMgY2FsY3VsYXRpb24gKDczLDAwMCkgYW5kIG11bHRpcGx5IGJ5IDgsIHdoaWNoCitnaXZlcyAwLjU4IE1CLgorCitBZGRpbmcgdGhlc2UgdGVybXMgdG9nZXRoZXIsIHlvdSBnZXQgYSBmaW5hbCBlc3RpbWF0ZToKKworW2xhdGV4bWF0aF0KKysrKysKK1xbUGFydGl0aW9uIHNpemUgPSAxNiBieXRlcyArIDAgYnl0ZXMgKyAwLjUxIE1CICsgMC41OCBNQiA9IDEuMSBNQlxdCisrKysrCisKK1RoaXMgZm9ybXVsYSBpcyBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSBhY3R1YWwgc2l6ZSBvZiBhIHBhcnRpdGlvbiBvbgorZGlzaywgYnV0IGlzIGFjY3VyYXRlIGVub3VnaCB0byBiZSBxdWl0ZSB1c2VmdWwuIFJlbWVtYmVyaW5nIHRoYXQgdGhlCitwYXJ0aXRpb24gbXVzdCBiZSBhYmxlIHRvIGZpdCBvbiBhIHNpbmdsZSBub2RlLCBpdCBsb29rcyBsaWtlIHRoZSB0YWJsZQorZGVzaWduIHdpbGwgbm90IHB1dCBhIGxvdCBvZiBzdHJhaW4gb24gZGlzayBzdG9yYWdlLgorCitDYXNzYW5kcmHigJlzIHN0b3JhZ2UgZW5naW5lIHdhcyByZS1pbXBsZW1lbnRlZCBmb3IgdGhlIDMuMCByZWxlYXNlLAoraW5jbHVkaW5nIGEgbmV3IGZvcm1hdCBmb3IgU1NUYWJsZSBmaWxlcy4gVGhlIHByZXZpb3VzIGZvcm1hdCBzdG9yZWQgYQorc2VwYXJhdGUgY29weSBvZiB0aGUgY2x1c3RlcmluZyBjb2x1bW5zIGFzIHBhcnQgb2YgdGhlIHJlY29yZCBmb3IgZWFjaAorY2VsbC4gVGhlIG5ld2VyIGZvcm1hdCBlbGltaW5hdGVzIHRoaXMgZHVwbGljYXRpb24sIHdoaWNoIHJlZHVjZXMgdGhlCitzaXplIG9mIHN0b3JlZCBkYXRhIGFuZCBzaW1wbGlmaWVzIHRoZSBmb3JtdWxhIGZvciBjb21wdXRpbmcgdGhhdCBzaXplLgorCitLZWVwIGluIG1pbmQgYWxzbyB0aGF0IHRoaXMgZXN0aW1hdGUgb25seSBjb3VudHMgYSBzaW5nbGUgcmVwbGljYSBvZgorZGF0YS4gWW91IHdpbGwgbmVlZCB0byBtdWx0aXBseSB0aGUgdmFsdWUgb2J0YWluZWQgaGVyZSBieSB0aGUgbnVtYmVyIG9mCitwYXJ0aXRpb25zIGFuZCB0aGUgbnVtYmVyIG9mIHJlcGxpY2FzIHNwZWNpZmllZCBieSB0aGUga2V5c3BhY2XigJlzCityZXBsaWNhdGlvbiBzdHJhdGVneSBpbiBvcmRlciB0byBkZXRlcm1pbmUgdGhlIHRvdGFsIHJlcXVpcmVkIHRvdGFsCitjYXBhY2l0eSBmb3IgZWFjaCB0YWJsZS4gVGhpcyB3aWxsIGNvbWUgaW4gaGFuZHkgd2hlbiB5b3UgcGxhbiB5b3VyCitjbHVzdGVyLgorCis9PSBCcmVha2luZyBVcCBMYXJnZSBQYXJ0aXRpb25zCisKK0FzIGRpc2N1c3NlZCBwcmV2aW91c2x5LCB0aGUgZ29hbCBpcyB0byBkZXNpZ24gdGFibGVzIHRoYXQgY2FuIHByb3ZpZGUKK3RoZSBkYXRhIHlvdSBuZWVkIHdpdGggcXVlcmllcyB0aGF0IHRvdWNoIGEgc2luZ2xlIHBhcnRpdGlvbiwgb3IgZmFpbGluZwordGhhdCwgdGhlIG1pbmltdW0gcG9zc2libGUgbnVtYmVyIG9mIHBhcnRpdGlvbnMuIEhvd2V2ZXIsIGFzIHNob3duIGluCit0aGUgZXhhbXBsZXMsIGl0IGlzIHF1aXRlIHBvc3NpYmxlIHRvIGRlc2lnbiB3aWRlIHBhcnRpdGlvbi1zdHlsZSB0YWJsZXMKK3RoYXQgYXBwcm9hY2ggQ2Fzc2FuZHJh4oCZcyBidWlsdC1pbiBsaW1pdHMuIFBlcmZvcm1pbmcgc2l6aW5nIGFuYWx5c2lzIG9uCit0YWJsZXMgbWF5IHJldmVhbCBwYXJ0aXRpb25zIHRoYXQgYXJlIHBvdGVudGlhbGx5IHRvbyBsYXJnZSwgZWl0aGVyIGluCitudW1iZXIgb2YgdmFsdWVzLCBzaXplIG9uIGRpc2ssIG9yIGJvdGguCisKK1RoZSB0ZWNobmlxdWUgZm9yIHNwbGl0dGluZyBhIGxhcmdlIHBhcnRpdGlvbiBpcyBzdHJhaWdodGZvcndhcmQ6IGFkZCBhbgorYWRkaXRpb25hbCBjb2x1bW4gdG8gdGhlIHBhcnRpdGlvbiBrZXkuIEluIG1vc3QgY2FzZXMsIG1vdmluZyBvbmUgb2YgdGhlCitleGlzdGluZyBjb2x1bW5zIGludG8gdGhlIHBhcnRpdGlvbiBrZXkgd2lsbCBiZSBzdWZmaWNpZW50LiBBbm90aGVyCitvcHRpb24gaXMgdG8gaW50cm9kdWNlIGFuIGFkZGl0aW9uYWwgY29sdW1uIHRvIHRoZSB0YWJsZSB0byBhY3QgYXMgYQorc2hhcmRpbmcga2V5LCBidXQgdGhpcyByZXF1aXJlcyBhZGRpdGlvbmFsIGFwcGxpY2F0aW9uIGxvZ2ljLgorCitDb250aW51aW5nIHRvIGV4YW1pbmUgdGhlIGF2YWlsYWJsZSByb29tcyBleGFtcGxlLCBpZiB5b3UgYWRkIHRoZSBgZGF0ZWAKK2NvbHVtbiB0byB0aGUgcGFydGl0aW9uIGtleSBmb3IgdGhlIGBhdmFpbGFibGVfcm9vbXNfYnlfaG90ZWxfZGF0ZWAKK3RhYmxlLCBlYWNoIHBhcnRpdGlvbiB3b3VsZCB0aGVuIHJlcHJlc2VudCB0aGUgYXZhaWxhYmlsaXR5IG9mIHJvb21zIGF0CithIHNwZWNpZmljIGhvdGVsIG9uIGEgc3BlY2lmaWMgZGF0ZS4gVGhpcyB3aWxsIGNlcnRhaW5seSB5aWVsZAorcGFydGl0aW9ucyB0aGF0IGFyZSBzaWduaWZpY2FudGx5IHNtYWxsZXIsIHBlcmhhcHMgdG9vIHNtYWxsLCBhcyB0aGUKK2RhdGEgZm9yIGNvbnNlY3V0aXZlIGRheXMgd2lsbCBsaWtlbHkgYmUgb24gc2VwYXJhdGUgbm9kZXMuCisKK0Fub3RoZXIgdGVjaG5pcXVlIGtub3duIGFzICpidWNrZXRpbmcqIGlzIG9mdGVuIHVzZWQgdG8gYnJlYWsgdGhlIGRhdGEKK2ludG8gbW9kZXJhdGUtc2l6ZSBwYXJ0aXRpb25zLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGJ1Y2tldGl6ZSB0aGUKK2BhdmFpbGFibGVfcm9vbXNfYnlfaG90ZWxfZGF0ZWAgdGFibGUgYnkgYWRkaW5nIGEgYG1vbnRoYCBjb2x1bW4gdG8gdGhlCitwYXJ0aXRpb24ga2V5LCBwZXJoYXBzIHJlcHJlc2VudGVkIGFzIGFuIGludGVnZXIuIFRoZSBjb21wYXJpc2lvbiB3aXRoCit0aGUgb3JpZ2luYWwgZGVzaWduIGlzIHNob3duIGluIHRoZSBmaWd1cmUgYmVsb3cuIFdoaWxlIHRoZSBgbW9udGhgCitjb2x1bW4gaXMgcGFydGlhbGx5IGR1cGxpY2F0aXZlIG9mIHRoZSBgZGF0ZWAsIGl0IHByb3ZpZGVzIGEgbmljZSB3YXkgb2YKK2dyb3VwaW5nIHJlbGF0ZWQgZGF0YSBpbiBhIHBhcnRpdGlvbiB0aGF0IHdpbGwgbm90IGdldCB0b28gbGFyZ2UuCisKK2ltYWdlOjpkYXRhLW1vZGVsaW5nX2hvdGVsX2J1Y2tldGluZy5wbmdbaW1hZ2VdCisKK0lmIHlvdSByZWFsbHkgZmVsdCBzdHJvbmdseSBhYm91dCBwcmVzZXJ2aW5nIGEgd2lkZSBwYXJ0aXRpb24gZGVzaWduLAoreW91IGNvdWxkIGluc3RlYWQgYWRkIHRoZSBgcm9vbV9pZGAgdG8gdGhlIHBhcnRpdGlvbiBrZXksIHNvIHRoYXQgZWFjaAorcGFydGl0aW9uIHdvdWxkIHJlcHJlc2VudCB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSByb29tIGFjcm9zcyBhbGwgZGF0ZXMuCitCZWNhdXNlIHRoZXJlIHdhcyBubyBxdWVyeSBpZGVudGlmaWVkIHRoYXQgaW52b2x2ZXMgc2VhcmNoaW5nCithdmFpbGFiaWxpdHkgb2YgYSBzcGVjaWZpYyByb29tLCB0aGUgZmlyc3Qgb3Igc2Vjb25kIGRlc2lnbiBhcHByb2FjaCBpcworbW9zdCBzdWl0YWJsZSB0byB0aGUgYXBwbGljYXRpb24gbmVlZHMuCisKK19NYXRlcmlhbCBhZGFwdGVkIGZyb20gQ2Fzc2FuZHJhLCBUaGUgRGVmaW5pdGl2ZSBHdWlkZS4gUHVibGlzaGVkIGJ5CitPJ1JlaWxseSBNZWRpYSwgSW5jLiBDb3B5cmlnaHQgwqkgMjAyMCBKZWZmIENhcnBlbnRlciwgRWJlbiBIZXdpdHQuIEFsbAorcmlnaHRzIHJlc2VydmVkLiBVc2VkIHdpdGggcGVybWlzc2lvbi5fCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfc2NoZW1hLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfc2NoZW1hLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhMDQzNAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19zY2hlbWEuYWRvYwpAQCAtMCwwICsxLDEzMCBAQAorPSBEZWZpbmluZyBEYXRhYmFzZSBTY2hlbWEKKworT25jZSB5b3UgaGF2ZSBmaW5pc2hlZCBldmFsdWF0aW5nIGFuZCByZWZpbmluZyB0aGUgcGh5c2ljYWwgbW9kZWwsCit5b3XigJlyZSByZWFkeSB0byBpbXBsZW1lbnQgdGhlIHNjaGVtYSBpbiBDUUwuIEhlcmUgaXMgdGhlIHNjaGVtYSBmb3IgdGhlCitgaG90ZWxgIGtleXNwYWNlLCB1c2luZyBDUUzigJlzIGNvbW1lbnQgZmVhdHVyZSB0byBkb2N1bWVudCB0aGUgcXVlcnkKK3BhdHRlcm4gc3VwcG9ydGVkIGJ5IGVhY2ggdGFibGU6CisKK1tzb3VyY2UsY3FsXQorLS0tLQorQ1JFQVRFIEtFWVNQQUNFIGhvdGVsIFdJVEggcmVwbGljYXRpb24gPQorICB74oCYY2xhc3PigJk6IOKAmFNpbXBsZVN0cmF0ZWd54oCZLCDigJhyZXBsaWNhdGlvbl9mYWN0b3LigJkgOiAzfTsKKworQ1JFQVRFIFRZUEUgaG90ZWwuYWRkcmVzcyAoCisgIHN0cmVldCB0ZXh0LAorICBjaXR5IHRleHQsCisgIHN0YXRlX29yX3Byb3ZpbmNlIHRleHQsCisgIHBvc3RhbF9jb2RlIHRleHQsCisgIGNvdW50cnkgdGV4dCApOworCitDUkVBVEUgVEFCTEUgaG90ZWwuaG90ZWxzX2J5X3BvaSAoCisgIHBvaV9uYW1lIHRleHQsCisgIGhvdGVsX2lkIHRleHQsCisgIG5hbWUgdGV4dCwKKyAgcGhvbmUgdGV4dCwKKyAgYWRkcmVzcyBmcm96ZW48YWRkcmVzcz4sCisgIFBSSU1BUlkgS0VZICgocG9pX25hbWUpLCBob3RlbF9pZCkgKQorICBXSVRIIGNvbW1lbnQgPSDigJhRMS4gRmluZCBob3RlbHMgbmVhciBnaXZlbiBwb2nigJkKKyAgQU5EIENMVVNURVJJTkcgT1JERVIgQlkgKGhvdGVsX2lkIEFTQykgOworCitDUkVBVEUgVEFCTEUgaG90ZWwuaG90ZWxzICgKKyAgaWQgdGV4dCBQUklNQVJZIEtFWSwKKyAgbmFtZSB0ZXh0LAorICBwaG9uZSB0ZXh0LAorICBhZGRyZXNzIGZyb3plbjxhZGRyZXNzPiwKKyAgcG9pcyBzZXQ8dGV4dD4gKQorICBXSVRIIGNvbW1lbnQgPSDigJhRMi4gRmluZCBpbmZvcm1hdGlvbiBhYm91dCBhIGhvdGVs4oCZOworCitDUkVBVEUgVEFCTEUgaG90ZWwucG9pc19ieV9ob3RlbCAoCisgIHBvaV9uYW1lIHRleHQsCisgIGhvdGVsX2lkIHRleHQsCisgIGRlc2NyaXB0aW9uIHRleHQsCisgIFBSSU1BUlkgS0VZICgoaG90ZWxfaWQpLCBwb2lfbmFtZSkgKQorICBXSVRIIGNvbW1lbnQgPSBRMy4gRmluZCBwb2lzIG5lYXIgYSBob3RlbOKAmTsKKworQ1JFQVRFIFRBQkxFIGhvdGVsLmF2YWlsYWJsZV9yb29tc19ieV9ob3RlbF9kYXRlICgKKyAgaG90ZWxfaWQgdGV4dCwKKyAgZGF0ZSBkYXRlLAorICByb29tX251bWJlciBzbWFsbGludCwKKyAgaXNfYXZhaWxhYmxlIGJvb2xlYW4sCisgIFBSSU1BUlkgS0VZICgoaG90ZWxfaWQpLCBkYXRlLCByb29tX251bWJlcikgKQorICBXSVRIIGNvbW1lbnQgPSDigJhRNC4gRmluZCBhdmFpbGFibGUgcm9vbXMgYnkgaG90ZWwgZGF0ZeKAmTsKKworQ1JFQVRFIFRBQkxFIGhvdGVsLmFtZW5pdGllc19ieV9yb29tICgKKyAgaG90ZWxfaWQgdGV4dCwKKyAgcm9vbV9udW1iZXIgc21hbGxpbnQsCisgIGFtZW5pdHlfbmFtZSB0ZXh0LAorICBkZXNjcmlwdGlvbiB0ZXh0LAorICBQUklNQVJZIEtFWSAoKGhvdGVsX2lkLCByb29tX251bWJlciksIGFtZW5pdHlfbmFtZSkgKQorICBXSVRIIGNvbW1lbnQgPSDigJhRNS4gRmluZCBhbWVuaXRpZXMgZm9yIGEgcm9vbeKAmTsKKy0tLS0KKworTm90aWNlIHRoYXQgdGhlIGVsZW1lbnRzIG9mIHRoZSBwYXJ0aXRpb24ga2V5IGFyZSBzdXJyb3VuZGVkIHdpdGgKK3BhcmVudGhlc2VzLCBldmVuIHRob3VnaCB0aGUgcGFydGl0aW9uIGtleSBjb25zaXN0cyBvZiB0aGUgc2luZ2xlIGNvbHVtbgorYHBvaV9uYW1lYC4gVGhpcyBpcyBhIGJlc3QgcHJhY3RpY2UgdGhhdCBtYWtlcyB0aGUgc2VsZWN0aW9uIG9mCitwYXJ0aXRpb24ga2V5IG1vcmUgZXhwbGljaXQgdG8gb3RoZXJzIHJlYWRpbmcgeW91ciBDUUwuCisKK1NpbWlsYXJseSwgaGVyZSBpcyB0aGUgc2NoZW1hIGZvciB0aGUgYHJlc2VydmF0aW9uYCBrZXlzcGFjZToKKworW3NvdXJjZSxjcWxdCistLS0tCitDUkVBVEUgS0VZU1BBQ0UgcmVzZXJ2YXRpb24gV0lUSCByZXBsaWNhdGlvbiA9IHvigJhjbGFzc+KAmToKKyAg4oCYU2ltcGxlU3RyYXRlZ3nigJksIOKAmHJlcGxpY2F0aW9uX2ZhY3RvcuKAmSA6IDN9OworCitDUkVBVEUgVFlQRSByZXNlcnZhdGlvbi5hZGRyZXNzICgKKyAgc3RyZWV0IHRleHQsCisgIGNpdHkgdGV4dCwKKyAgc3RhdGVfb3JfcHJvdmluY2UgdGV4dCwKKyAgcG9zdGFsX2NvZGUgdGV4dCwKKyAgY291bnRyeSB0ZXh0ICk7CisKK0NSRUFURSBUQUJMRSByZXNlcnZhdGlvbi5yZXNlcnZhdGlvbnNfYnlfY29uZmlybWF0aW9uICgKKyAgY29uZmlybV9udW1iZXIgdGV4dCwKKyAgaG90ZWxfaWQgdGV4dCwKKyAgc3RhcnRfZGF0ZSBkYXRlLAorICBlbmRfZGF0ZSBkYXRlLAorICByb29tX251bWJlciBzbWFsbGludCwKKyAgZ3Vlc3RfaWQgdXVpZCwKKyAgUFJJTUFSWSBLRVkgKGNvbmZpcm1fbnVtYmVyKSApCisgIFdJVEggY29tbWVudCA9IOKAmFE2LiBGaW5kIHJlc2VydmF0aW9ucyBieSBjb25maXJtYXRpb24gbnVtYmVy4oCZOworCitDUkVBVEUgVEFCTEUgcmVzZXJ2YXRpb24ucmVzZXJ2YXRpb25zX2J5X2hvdGVsX2RhdGUgKAorICBob3RlbF9pZCB0ZXh0LAorICBzdGFydF9kYXRlIGRhdGUsCisgIGVuZF9kYXRlIGRhdGUsCisgIHJvb21fbnVtYmVyIHNtYWxsaW50LAorICBjb25maXJtX251bWJlciB0ZXh0LAorICBndWVzdF9pZCB1dWlkLAorICBQUklNQVJZIEtFWSAoKGhvdGVsX2lkLCBzdGFydF9kYXRlKSwgcm9vbV9udW1iZXIpICkKKyAgV0lUSCBjb21tZW50ID0g4oCYUTcuIEZpbmQgcmVzZXJ2YXRpb25zIGJ5IGhvdGVsIGFuZCBkYXRl4oCZOworCitDUkVBVEUgVEFCTEUgcmVzZXJ2YXRpb24ucmVzZXJ2YXRpb25zX2J5X2d1ZXN0ICgKKyAgZ3Vlc3RfbGFzdF9uYW1lIHRleHQsCisgIGhvdGVsX2lkIHRleHQsCisgIHN0YXJ0X2RhdGUgZGF0ZSwKKyAgZW5kX2RhdGUgZGF0ZSwKKyAgcm9vbV9udW1iZXIgc21hbGxpbnQsCisgIGNvbmZpcm1fbnVtYmVyIHRleHQsCisgIGd1ZXN0X2lkIHV1aWQsCisgIFBSSU1BUlkgS0VZICgoZ3Vlc3RfbGFzdF9uYW1lKSwgaG90ZWxfaWQpICkKKyAgV0lUSCBjb21tZW50ID0g4oCYUTguIEZpbmQgcmVzZXJ2YXRpb25zIGJ5IGd1ZXN0IG5hbWXigJk7CisKK0NSRUFURSBUQUJMRSByZXNlcnZhdGlvbi5ndWVzdHMgKAorICBndWVzdF9pZCB1dWlkIFBSSU1BUlkgS0VZLAorICBmaXJzdF9uYW1lIHRleHQsCisgIGxhc3RfbmFtZSB0ZXh0LAorICB0aXRsZSB0ZXh0LAorICBlbWFpbHMgc2V0LAorICBwaG9uZV9udW1iZXJzIGxpc3QsCisgIGFkZHJlc3NlcyBtYXA8dGV4dCwKKyAgZnJvemVuPGFkZHJlc3M+LAorICBjb25maXJtX251bWJlciB0ZXh0ICkKKyAgV0lUSCBjb21tZW50ID0g4oCYUTkuIEZpbmQgZ3Vlc3QgYnkgSUTigJk7CistLS0tCisKK1lvdSBub3cgaGF2ZSBhIGNvbXBsZXRlIENhc3NhbmRyYSBzY2hlbWEgZm9yIHN0b3JpbmcgZGF0YSBmb3IgYSBob3RlbAorYXBwbGljYXRpb24uCisKK19NYXRlcmlhbCBhZGFwdGVkIGZyb20gQ2Fzc2FuZHJhLCBUaGUgRGVmaW5pdGl2ZSBHdWlkZS4gUHVibGlzaGVkIGJ5CitPJ1JlaWxseSBNZWRpYSwgSW5jLiBDb3B5cmlnaHQgwqkgMjAyMCBKZWZmIENhcnBlbnRlciwgRWJlbiBIZXdpdHQuIEFsbAorcmlnaHRzIHJlc2VydmVkLiBVc2VkIHdpdGggcGVybWlzc2lvbi5fCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfdG9vbHMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ190b29scy5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOGNhYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfdG9vbHMuYWRvYwpAQCAtMCwwICsxLDQ0IEBACis9IENhc3NhbmRyYSBEYXRhIE1vZGVsaW5nIFRvb2xzCisKK1RoZXJlIGFyZSBzZXZlcmFsIHRvb2xzIGF2YWlsYWJsZSB0byBoZWxwIHlvdSBkZXNpZ24gYW5kIG1hbmFnZSB5b3VyCitDYXNzYW5kcmEgc2NoZW1hIGFuZCBidWlsZCBxdWVyaWVzLgorCisqIGh0dHBzOi8vaGFja29sYWRlLmNvbS9ub3NxbGRiLmh0bWwjY2Fzc2FuZHJhW0hhY2tvbGFkZV0gaXMgYSBkYXRhCittb2RlbGluZyB0b29sIHRoYXQgc3VwcG9ydHMgc2NoZW1hIGRlc2lnbiBmb3IgQ2Fzc2FuZHJhIGFuZCBtYW55IG90aGVyCitOb1NRTCBkYXRhYmFzZXMuIEhhY2tvbGFkZSBzdXBwb3J0cyB0aGUgdW5pcXVlIGNvbmNlcHRzIG9mIENRTCBzdWNoIGFzCitwYXJ0aXRpb24ga2V5cyBhbmQgY2x1c3RlcmluZyBjb2x1bW5zLCBhcyB3ZWxsIGFzIGRhdGEgdHlwZXMgaW5jbHVkaW5nCitjb2xsZWN0aW9ucyBhbmQgVURUcy4gSXQgYWxzbyBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBjcmVhdGUgQ2hlYm90a28KK2RpYWdyYW1zLgorKiBodHRwOi8va2RtLmRhdGF2aWV3Lm9yZy9bS2FzaGxldiBEYXRhIE1vZGVsZXJdIGlzIGEgQ2Fzc2FuZHJhIGRhdGEKK21vZGVsaW5nIHRvb2wgdGhhdCBhdXRvbWF0ZXMgdGhlIGRhdGEgbW9kZWxpbmcgbWV0aG9kb2xvZ3kgZGVzY3JpYmVkIGluCit0aGlzIGRvY3VtZW50YXRpb24sIGluY2x1ZGluZyBpZGVudGlmeWluZyBhY2Nlc3MgcGF0dGVybnMsIGNvbmNlcHR1YWwsCitsb2dpY2FsLCBhbmQgcGh5c2ljYWwgZGF0YSBtb2RlbGluZywgYW5kIHNjaGVtYSBnZW5lcmF0aW9uLiBJdCBhbHNvCitpbmNsdWRlcyBtb2RlbCBwYXR0ZXJucyB0aGF0IHlvdSBjYW4gb3B0aW9uYWxseSBsZXZlcmFnZSBhcyBhIHN0YXJ0aW5nCitwb2ludCBmb3IgeW91ciBkZXNpZ25zLgorKiBEYXRhU3RheCBEZXZDZW50ZXIgaXMgYSB0b29sIGZvciBtYW5hZ2luZyBzY2hlbWEsIGV4ZWN1dGluZyBxdWVyaWVzCithbmQgdmlld2luZyByZXN1bHRzLiBXaGlsZSB0aGUgdG9vbCBpcyBubyBsb25nZXIgYWN0aXZlbHkgc3VwcG9ydGVkLCBpdAoraXMgc3RpbGwgcG9wdWxhciB3aXRoIG1hbnkgZGV2ZWxvcGVycyBhbmQgaXMgYXZhaWxhYmxlIGFzIGEKK2h0dHBzOi8vYWNhZGVteS5kYXRhc3RheC5jb20vZG93bmxvYWRzW2ZyZWUgZG93bmxvYWRdLiBEZXZDZW50ZXIKK2ZlYXR1cmVzIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIENRTCBjb21tYW5kcywgdHlwZXMsIGFuZCBuYW1lIGxpdGVyYWxzLgorRGV2Q2VudGVyIHByb3ZpZGVzIGNvbW1hbmQgY29tcGxldGlvbiBhcyB5b3UgdHlwZSBvdXQgQ1FMIGNvbW1hbmRzIGFuZAoraW50ZXJwcmV0cyB0aGUgY29tbWFuZHMgeW91IHR5cGUsIGhpZ2hsaWdodGluZyBhbnkgZXJyb3JzIHlvdSBtYWtlLiBUaGUKK3Rvb2wgcHJvdmlkZXMgcGFuZXMgZm9yIG1hbmFnaW5nIG11bHRpcGxlIENRTCBzY3JpcHRzIGFuZCBjb25uZWN0aW9ucyB0bworbXVsdGlwbGUgY2x1c3RlcnMuIFRoZSBjb25uZWN0aW9ucyBhcmUgdXNlZCB0byBydW4gQ1FMIGNvbW1hbmRzIGFnYWluc3QKK2xpdmUgY2x1c3RlcnMgYW5kIHZpZXcgdGhlIHJlc3VsdHMuIFRoZSB0b29sIGFsc28gaGFzIGEgcXVlcnkgdHJhY2UKK2ZlYXR1cmUgdGhhdCBpcyB1c2VmdWwgZm9yIGdhaW5pbmcgaW5zaWdodCBpbnRvIHRoZSBwZXJmb3JtYW5jZSBvZiB5b3VyCitxdWVyaWVzLgorKiBJREUgUGx1Z2lucyAtIFRoZXJlIGFyZSBDUUwgcGx1Z2lucyBhdmFpbGFibGUgZm9yIHNldmVyYWwgSW50ZWdyYXRlZAorRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnRzIChJREVzKSwgc3VjaCBhcyBJbnRlbGxpSiBJREVBIGFuZCBBcGFjaGUKK05ldEJlYW5zLiBUaGVzZSBwbHVnaW5zIHR5cGljYWxseSBwcm92aWRlIGZlYXR1cmVzIHN1Y2ggYXMgc2NoZW1hCittYW5hZ2VtZW50IGFuZCBxdWVyeSBleGVjdXRpb24uCisKK1NvbWUgSURFcyBhbmQgdG9vbHMgdGhhdCBjbGFpbSB0byBzdXBwb3J0IENhc3NhbmRyYSBkbyBub3QgYWN0dWFsbHkKK3N1cHBvcnQgQ1FMIG5hdGl2ZWx5LCBidXQgaW5zdGVhZCBhY2Nlc3MgQ2Fzc2FuZHJhIHVzaW5nIGEgSkRCQy9PREJDCitkcml2ZXIgYW5kIGludGVyYWN0IHdpdGggQ2Fzc2FuZHJhIGFzIGlmIGl0IHdlcmUgYSByZWxhdGlvbmFsIGRhdGFiYXNlCit3aXRoIFNRTCBzdXBwb3J0LiBXaGVuIHNlbGVjdGluZyB0b29scyBmb3Igd29ya2luZyB3aXRoIENhc3NhbmRyYSB5b3XigJlsbAord2FudCB0byBtYWtlIHN1cmUgdGhleSBzdXBwb3J0IENRTCBhbmQgcmVpbmZvcmNlIENhc3NhbmRyYSBiZXN0CitwcmFjdGljZXMgZm9yIGRhdGEgbW9kZWxpbmcgYXMgcHJlc2VudGVkIGluIHRoaXMgZG9jdW1lbnRhdGlvbi4KKworX01hdGVyaWFsIGFkYXB0ZWQgZnJvbSBDYXNzYW5kcmEsIFRoZSBEZWZpbml0aXZlIEd1aWRlLiBQdWJsaXNoZWQgYnkKK08nUmVpbGx5IE1lZGlhLCBJbmMuIENvcHlyaWdodCDCqSAyMDIwIEplZmYgQ2FycGVudGVyLCBFYmVuIEhld2l0dC4gQWxsCityaWdodHMgcmVzZXJ2ZWQuIFVzZWQgd2l0aCBwZXJtaXNzaW9uLl8KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9GaWd1cmVfMV9kYXRhX21vZGVsLmpwZyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL0ZpZ3VyZV8xX2RhdGFfbW9kZWwuanBnCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbWFnZXMvRmlndXJlXzFfZGF0YV9tb2RlbC5qcGcKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL0ZpZ3VyZV8xX2RhdGFfbW9kZWwuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9GaWd1cmVfMl9kYXRhX21vZGVsLmpwZyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL0ZpZ3VyZV8yX2RhdGFfbW9kZWwuanBnCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbWFnZXMvRmlndXJlXzJfZGF0YV9tb2RlbC5qcGcKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL0ZpZ3VyZV8yX2RhdGFfbW9kZWwuanBnCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2NoZWJvdGtvX2xvZ2ljYWwucG5nIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19jaGVib3Rrb19sb2dpY2FsLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfY2hlYm90a29fbG9naWNhbC5wbmcKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfY2hlYm90a29fbG9naWNhbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfY2hlYm90a29fcGh5c2ljYWwucG5nIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19jaGVib3Rrb19waHlzaWNhbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2NoZWJvdGtvX3BoeXNpY2FsLnBuZwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19jaGVib3Rrb19waHlzaWNhbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfYnVja2V0aW5nLnBuZyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfYnVja2V0aW5nLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfYnVja2V0aW5nLnBuZwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9idWNrZXRpbmcucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2hvdGVsX2VyZC5wbmcgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2hvdGVsX2VyZC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2hvdGVsX2VyZC5wbmcKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfZXJkLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9sb2dpY2FsLnBuZyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfbG9naWNhbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2hvdGVsX2xvZ2ljYWwucG5nCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2hvdGVsX2xvZ2ljYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2hvdGVsX3BoeXNpY2FsLnBuZyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfcGh5c2ljYWwucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9waHlzaWNhbC5wbmcKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfcGh5c2ljYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2hvdGVsX3F1ZXJpZXMucG5nIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9xdWVyaWVzLnBuZwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfcXVlcmllcy5wbmcKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfcXVlcmllcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfaG90ZWxfcmVsYXRpb25hbC5wbmcgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX2hvdGVsX3JlbGF0aW9uYWwucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9yZWxhdGlvbmFsLnBuZwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19ob3RlbF9yZWxhdGlvbmFsLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19yZXNlcnZhdGlvbl9sb2dpY2FsLnBuZyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfcmVzZXJ2YXRpb25fbG9naWNhbC5wbmcKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX3Jlc2VydmF0aW9uX2xvZ2ljYWwucG5nCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGV2ZWxvcGluZy9kYXRhLW1vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX3Jlc2VydmF0aW9uX2xvZ2ljYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kYXRhX21vZGVsaW5nL2ltYWdlcy9kYXRhX21vZGVsaW5nX3Jlc2VydmF0aW9uX3BoeXNpY2FsLnBuZyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfcmVzZXJ2YXRpb25fcGh5c2ljYWwucG5nCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZGF0YV9tb2RlbGluZy9pbWFnZXMvZGF0YV9tb2RlbGluZ19yZXNlcnZhdGlvbl9waHlzaWNhbC5wbmcKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW1hZ2VzL2RhdGFfbW9kZWxpbmdfcmVzZXJ2YXRpb25fcGh5c2ljYWwucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW5kZXguYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTNlNDNhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbmRleC5hZG9jCkBAIC0wLDAgKzEsMTEgQEAKKz0gRGF0YSBNb2RlbGluZworCisqIHhyZWY6ZGF0YS1tb2RlbGluZy9pbnRyby5hZG9jW0ludHJvZHVjdGlvbl0KKyogeHJlZjpkYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfcmRibXMuYWRvY1tSREJNU10KKyogeHJlZjpkYXRhLW1vZGVsaW5nL2RhdGEtbW9kZWxpbmdfY29uY2VwdHVhbC5hZG9jW0NvbmNlcHR1YWxdCisqIHhyZWY6ZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX2xvZ2ljYWwuYWRvY1tMb2dpY2FsXQorKiB4cmVmOmRhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19waHlzaWNhbC5hZG9jW1BoeXNpY2FsXQorKiB4cmVmOmRhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19zY2hlbWEuYWRvY1tTY2hlbWFdCisqIHhyZWY6ZGF0YS1tb2RlbGluZy9kYXRhLW1vZGVsaW5nX3F1ZXJpZXMuYWRvY1tRdWVyaWVzXQorKiB4cmVmOmRhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ19yZWZpbmluZy5hZG9jW1JlZmluaW5nXQorKiB4cmVmOmRhdGEtbW9kZWxpbmcvZGF0YS1tb2RlbGluZ190b29scy5hZG9jW1Rvb2xzXQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW50cm8uYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9kZXZlbG9waW5nL2RhdGEtbW9kZWxpbmcvaW50cm8uYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RhdGFfbW9kZWxpbmcvaW50cm8uYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2RldmVsb3BpbmcvZGF0YS1tb2RlbGluZy9pbnRyby5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZmFxL2luZGV4LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZmFxL2luZGV4LmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzRkYjkuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2ZhcS9pbmRleC5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLT0gRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMKLQotW1t3aHktY2FudC1saXN0LWFsbF1dCi09PSBXaHkgY2FuJ3QgSSBzZXQgYGxpc3Rlbl9hZGRyZXNzYCB0byBsaXN0ZW4gb24gMC4wLjAuMCAoYWxsIG15IGFkZHJlc3Nlcyk/Ci0KLUNhc3NhbmRyYSBpcyBhIGdvc3NpcC1iYXNlZCBkaXN0cmlidXRlZCBzeXN0ZW0gYW5kIGBsaXN0ZW5fYWRkcmVzc2AgaXMKLXRoZSBhZGRyZXNzIGEgbm9kZSB0ZWxscyBvdGhlciBub2RlcyB0byByZWFjaCBpdCBhdC4gVGVsbGluZyBvdGhlciBub2RlcwotImNvbnRhY3QgbWUgb24gYW55IG9mIG15IGFkZHJlc3NlcyIgaXMgYSBiYWQgaWRlYTsgaWYgZGlmZmVyZW50IG5vZGVzIGluCi10aGUgY2x1c3RlciBwaWNrIGRpZmZlcmVudCBhZGRyZXNzZXMgZm9yIHlvdSwgQmFkIFRoaW5ncyBoYXBwZW4uCi0KLUlmIHlvdSBkb24ndCB3YW50IHRvIG1hbnVhbGx5IHNwZWNpZnkgYW4gSVAgdG8gYGxpc3Rlbl9hZGRyZXNzYCBmb3IgZWFjaAotbm9kZSBpbiB5b3VyIGNsdXN0ZXIgKHVuZGVyc3RhbmRhYmxlISksIGxlYXZlIGl0IGJsYW5rIGFuZCBDYXNzYW5kcmEKLXdpbGwgdXNlIGBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKWAgdG8gcGljayBhbiBhZGRyZXNzLiBUaGVuIGl0J3MgdXAKLXRvIHlvdSBvciB5b3VyIG9wcyB0ZWFtIHRvIG1ha2UgdGhpbmdzIHJlc29sdmUgY29ycmVjdGx5IChgL2V0Yy9ob3N0cy9gLAotZG5zLCBldGMpLgotCi1PbmUgZXhjZXB0aW9uIHRvIHRoaXMgcHJvY2VzcyBpcyBKTVgsIHdoaWNoIGJ5IGRlZmF1bHQgYmluZHMgdG8gMC4wLjAuMAotKEphdmEgYnVnIDY0MjU3NjkpLgotCi1TZWUgYDI1NmAgYW5kIGA0M2AgZm9yIG1vcmUgZ29yeSBkZXRhaWxzLgotCi1bW3doYXQtcG9ydHNdXQotPT0gV2hhdCBwb3J0cyBkb2VzIENhc3NhbmRyYSB1c2U/Ci0KLUJ5IGRlZmF1bHQsIENhc3NhbmRyYSB1c2VzIDcwMDAgZm9yIGNsdXN0ZXIgY29tbXVuaWNhdGlvbiAoNzAwMSBpZiBTU0wKLWlzIGVuYWJsZWQpLCA5MDQyIGZvciBuYXRpdmUgcHJvdG9jb2wgY2xpZW50cywgYW5kIDcxOTkgZm9yIEpNWC4gVGhlCi1pbnRlcm5vZGUgY29tbXVuaWNhdGlvbiBhbmQgbmF0aXZlIHByb3RvY29sIHBvcnRzIGFyZSBjb25maWd1cmFibGUgaW4KLXRoZSBgY2Fzc2FuZHJhLXlhbWxgLiBUaGUgSk1YIHBvcnQgaXMgY29uZmlndXJhYmxlIGluIGBjYXNzYW5kcmEtZW52LnNoYAotKHRocm91Z2ggSlZNIG9wdGlvbnMpLiBBbGwgcG9ydHMgYXJlIFRDUC4KLQotW1t3aGF0LWhhcHBlbnMtb24tam9pbnNdXQotPT0gV2hhdCBoYXBwZW5zIHRvIGV4aXN0aW5nIGRhdGEgaW4gbXkgY2x1c3RlciB3aGVuIEkgYWRkIG5ldyBub2Rlcz8KLQotV2hlbiBhIG5ldyBub2RlcyBqb2lucyBhIGNsdXN0ZXIsIGl0IHdpbGwgYXV0b21hdGljYWxseSBjb250YWN0IHRoZQotb3RoZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIgYW5kIGNvcHkgdGhlIHJpZ2h0IGRhdGEgdG8gaXRzZWxmLiBTZWUKLWB0b3BvbG9neS1jaGFuZ2VzYC4KLQotW1thc3luY2gtZGVsZXRlc11dCi09PSBJIGRlbGV0ZSBkYXRhIGZyb20gQ2Fzc2FuZHJhLCBidXQgZGlzayB1c2FnZSBzdGF5cyB0aGUgc2FtZS4gV2hhdCBnaXZlcz8KLQotRGF0YSB5b3Ugd3JpdGUgdG8gQ2Fzc2FuZHJhIGdldHMgcGVyc2lzdGVkIHRvIFNTVGFibGVzLiBTaW5jZSBTU1RhYmxlcwotYXJlIGltbXV0YWJsZSwgdGhlIGRhdGEgY2FuJ3QgYWN0dWFsbHkgYmUgcmVtb3ZlZCB3aGVuIHlvdSBwZXJmb3JtIGEKLWRlbGV0ZSwgaW5zdGVhZCwgYSBtYXJrZXIgKGFsc28gY2FsbGVkIGEgInRvbWJzdG9uZSIpIGlzIHdyaXR0ZW4gdG8KLWluZGljYXRlIHRoZSB2YWx1ZSdzIG5ldyBzdGF0dXMuIE5ldmVyIGZlYXIgdGhvdWdoLCBvbiB0aGUgZmlyc3QKLWNvbXBhY3Rpb24gdGhhdCBvY2N1cnMgYmV0d2VlbiB0aGUgZGF0YSBhbmQgdGhlIHRvbWJzdG9uZSwgdGhlIGRhdGEgd2lsbAotYmUgZXhwdW5nZWQgY29tcGxldGVseSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZGlzayBzcGFjZSByZWNvdmVyZWQuIFNlZQotYGNvbXBhY3Rpb25gIGZvciBtb3JlIGRldGFpbC4KLQotW1tvbmUtZW50cnktcmluZ11dCi09PSBXaHkgZG9lcyBub2RldG9vbCByaW5nIG9ubHkgc2hvdyBvbmUgZW50cnksIGV2ZW4gdGhvdWdoIG15IG5vZGVzIGxvZ2dlZCB0aGF0IHRoZXkgc2VlIGVhY2ggb3RoZXIgam9pbmluZyB0aGUgcmluZz8KLQotVGhpcyBoYXBwZW5zIHdoZW4geW91IGhhdmUgdGhlIHNhbWUgdG9rZW4gYXNzaWduZWQgdG8gZWFjaCBub2RlLiBEb24ndAotZG8gdGhhdC4KLQotTW9zdCBvZnRlbiB0aGlzIGJpdGVzIHBlb3BsZSB3aG8gZGVwbG95IGJ5IGluc3RhbGxpbmcgQ2Fzc2FuZHJhIG9uIGEgVk0KLShlc3BlY2lhbGx5IHdoZW4gdXNpbmcgdGhlIERlYmlhbiBwYWNrYWdlLCB3aGljaCBhdXRvLXN0YXJ0cyBDYXNzYW5kcmEKLWFmdGVyIGluc3RhbGxhdGlvbiwgdGh1cyBnZW5lcmF0aW5nIGFuZCBzYXZpbmcgYSB0b2tlbiksIHRoZW4gY2xvbmluZwotdGhhdCBWTSB0byBvdGhlciBub2Rlcy4KLQotVGhlIGVhc2llc3QgZml4IGlzIHRvIHdpcGUgdGhlIGRhdGEgYW5kIGNvbW1pdGxvZyBkaXJlY3RvcmllcywgdGh1cwotbWFraW5nIHN1cmUgdGhhdCBlYWNoIG5vZGUgd2lsbCBnZW5lcmF0ZSBhIHJhbmRvbSB0b2tlbiBvbiB0aGUgbmV4dAotcmVzdGFydC4KLQotW1tjaGFuZ2UtcmVwbGljYXRpb24tZmFjdG9yXV0KLT09IENhbiBJIGNoYW5nZSB0aGUgcmVwbGljYXRpb24gZmFjdG9yIChhIGEga2V5c3BhY2UpIG9uIGEgbGl2ZSBjbHVzdGVyPwotCi1ZZXMsIGJ1dCBpdCB3aWxsIHJlcXVpcmUgcnVubmluZyBhIGZ1bGwgcmVwYWlyIChvciBjbGVhbnVwKSB0byBjaGFuZ2UKLXRoZSByZXBsaWNhIGNvdW50IG9mIGV4aXN0aW5nIGRhdGE6Ci0KLSogYEFsdGVyIDxhbHRlci1rZXlzcGFjZS1zdGF0ZW1lbnQ+YCB0aGUgcmVwbGljYXRpb24gZmFjdG9yIGZvciBkZXNpcmVkCi1rZXlzcGFjZSAodXNpbmcgY3Fsc2ggZm9yIGluc3RhbmNlKS4KLSogSWYgeW91J3JlIHJlZHVjaW5nIHRoZSByZXBsaWNhdGlvbiBmYWN0b3IsIHJ1biBgbm9kZXRvb2wgY2xlYW51cGAgb24KLXRoZSBjbHVzdGVyIHRvIHJlbW92ZSBzdXJwbHVzIHJlcGxpY2F0ZWQgZGF0YS4gQ2xlYW51cCBydW5zIG9uIGEKLXBlci1ub2RlIGJhc2lzLgotKiBJZiB5b3UncmUgaW5jcmVhc2luZyB0aGUgcmVwbGljYXRpb24gZmFjdG9yLCBydW4KLWBub2RldG9vbCByZXBhaXIgLWZ1bGxgIHRvIGVuc3VyZSBkYXRhIGlzIHJlcGxpY2F0ZWQgYWNjb3JkaW5nIHRvIHRoZQotbmV3IGNvbmZpZ3VyYXRpb24uIFJlcGFpciBydW5zIG9uIGEgcGVyLXJlcGxpY2Egc2V0IGJhc2lzLiBUaGlzIGlzIGFuCi1pbnRlbnNpdmUgcHJvY2VzcyB0aGF0IG1heSByZXN1bHQgaW4gYWR2ZXJzZSBjbHVzdGVyIHBlcmZvcm1hbmNlLiBJdCdzCi1oaWdobHkgcmVjb21tZW5kZWQgdG8gZG8gcm9sbGluZyByZXBhaXJzLCBhcyBhbiBhdHRlbXB0IHRvIHJlcGFpciB0aGUKLWVudGlyZSBjbHVzdGVyIGF0IG9uY2Ugd2lsbCBtb3N0IGxpa2VseSBzd2FtcCBpdC4gTm90ZSB0aGF0IHlvdSB3aWxsCi1uZWVkIHRvIHJ1biBhIGZ1bGwgcmVwYWlyIChgLWZ1bGxgKSB0byBtYWtlIHN1cmUgdGhhdCBhbHJlYWR5IHJlcGFpcmVkCi1zc3RhYmxlcyBhcmUgbm90IHNraXBwZWQuCi0KLVtbY2FuLWxhcmdlLWJsb2JdXQotPT0gQ2FuIEkgU3RvcmUgKGxhcmdlKSBCTE9CcyBpbiBDYXNzYW5kcmE/Ci0KLUNhc3NhbmRyYSBpc24ndCBvcHRpbWl6ZWQgZm9yIGxhcmdlIGZpbGUgb3IgQkxPQiBzdG9yYWdlIGFuZCBhIHNpbmdsZQotYGJsb2JgIHZhbHVlIGlzIGFsd2F5cyByZWFkIGFuZCBzZW5kIHRvIHRoZSBjbGllbnQgZW50aXJlbHkuIEFzIHN1Y2gsCi1zdG9yaW5nIHNtYWxsIGJsb2JzIChsZXNzIHRoYW4gc2luZ2xlIGRpZ2l0IE1CKSBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSwKLWJ1dCBpdCBpcyBhZHZpc2VkIHRvIG1hbnVhbGx5IHNwbGl0IGxhcmdlIGJsb2JzIGludG8gc21hbGxlciBjaHVua3MuCi0KLVBsZWFzZSBub3RlIGluIHBhcnRpY3VsYXIgdGhhdCBieSBkZWZhdWx0LCBhbnkgdmFsdWUgZ3JlYXRlciB0aGFuIDE2TWlCCi13aWxsIGJlIHJlamVjdGVkIGJ5IENhc3NhbmRyYSBkdWUgdGhlIGBtYXhfbXV0YXRpb25fc2l6ZWAKLWNvbmZpZ3VyYXRpb24gb2YgdGhlIGBjYXNzYW5kcmEteWFtbGAgZmlsZSAod2hpY2ggZGVmYXVsdCB0byBoYWxmIG9mCi1gY29tbWl0bG9nX3NlZ21lbnRfc2l6ZWAsIHdoaWNoIGl0c2VsZiBkZWZhdWx0IHRvIDMyTWlCKS4KLQotW1tub2RldG9vbC1jb25uZWN0aW9uLXJlZnVzZWRdXQotPT0gTm9kZXRvb2wgc2F5cyAiQ29ubmVjdGlvbiByZWZ1c2VkIHRvIGhvc3Q6IDEyNy4wLjEuMSIgZm9yIGFueSByZW1vdGUgaG9zdC4gV2hhdCBnaXZlcz8KLQotTm9kZXRvb2wgcmVsaWVzIG9uIEpNWCwgd2hpY2ggaW4gdHVybiByZWxpZXMgb24gUk1JLCB3aGljaCBpbiB0dXJuIHNldHMKLXVwIGl0cyBvd24gbGlzdGVuZXJzIGFuZCBjb25uZWN0b3JzIGFzIG5lZWRlZCBvbiBlYWNoIGVuZCBvZiB0aGUKLWV4Y2hhbmdlLiBOb3JtYWxseSBhbGwgb2YgdGhpcyBoYXBwZW5zIGJlaGluZCB0aGUgc2NlbmVzIHRyYW5zcGFyZW50bHksCi1idXQgaW5jb3JyZWN0IG5hbWUgcmVzb2x1dGlvbiBmb3IgZWl0aGVyIHRoZSBob3N0IGNvbm5lY3RpbmcsIG9yIHRoZSBvbmUKLWJlaW5nIGNvbm5lY3RlZCB0bywgY2FuIHJlc3VsdCBpbiBjcm9zc2VkIHdpcmVzIGFuZCBjb25mdXNpbmcKLWV4Y2VwdGlvbnMuCi0KLUlmIHlvdSBhcmUgbm90IHVzaW5nIEROUywgdGhlbiBtYWtlIHN1cmUgdGhhdCB5b3VyIGAvZXRjL2hvc3RzYCBmaWxlcwotYXJlIGFjY3VyYXRlIG9uIGJvdGggZW5kcy4gSWYgdGhhdCBmYWlscywgdHJ5IHNldHRpbmcgdGhlCi1gLURqYXZhLnJtaS5zZXJ2ZXIuaG9zdG5hbWU9PHB1YmxpYyBuYW1lPmAgSlZNIG9wdGlvbiBuZWFyIHRoZSBib3R0b20gb2YKLWBjYXNzYW5kcmEtZW52LnNoYCB0byBhbiBpbnRlcmZhY2UgdGhhdCB5b3UgY2FuIHJlYWNoIGZyb20gdGhlIHJlbW90ZQotbWFjaGluZS4KLQotW1t0by1iYXRjaC1vci1ub3QtdG8tYmF0Y2hdXQotPT0gV2lsbCBiYXRjaGluZyBteSBvcGVyYXRpb25zIHNwZWVkIHVwIG15IGJ1bGsgbG9hZD8KLQotTm8uIFVzaW5nIGJhdGNoZXMgdG8gbG9hZCBkYXRhIHdpbGwgZ2VuZXJhbGx5IGp1c3QgYWRkICJzcGlrZXMiIG9mCi1sYXRlbmN5LiBVc2UgYXN5bmNocm9ub3VzIElOU0VSVHMgaW5zdGVhZCwgb3IgdXNlIHRydWUgYGJ1bGstbG9hZGluZ2AuCi0KLUFuIGV4Y2VwdGlvbiBpcyBiYXRjaGluZyB1cGRhdGVzIHRvIGEgc2luZ2xlIHBhcnRpdGlvbiwgd2hpY2ggY2FuIGJlIGEKLUdvb2QgVGhpbmcgKGFzIGxvbmcgYXMgdGhlIHNpemUgb2YgYSBzaW5nbGUgYmF0Y2ggc3RheSByZWFzb25hYmxlKS4gQnV0Ci1uZXZlciBldmVyIGJsaW5kbHkgYmF0Y2ggZXZlcnl0aGluZyEKLQotW1tzZWxpbnV4XV0KLT09IE9uIFJIRUwgbm9kZXMgYXJlIHVuYWJsZSB0byBqb2luIHRoZSByaW5nCi0KLUNoZWNrIGlmIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NlY3VyaXR5LUVuaGFuY2VkX0xpbnV4W1NFTGludXhdCi1pcyBvbjsgaWYgaXQgaXMsIHR1cm4gaXQgb2ZmLgotCi1bW2hvdy10by11bnN1YnNjcmliZV1dCi09PSBIb3cgZG8gSSB1bnN1YnNjcmliZSBmcm9tIHRoZSBlbWFpbCBsaXN0PwotCi1TZW5kIGFuIGVtYWlsIHRvIGB1c2VyLXVuc3Vic2NyaWJlQGNhc3NhbmRyYS5hcGFjaGUub3JnYC4KLQotW1tjYXNzYW5kcmEtZWF0cy1hbGwtbXktbWVtb3J5XV0KLT09IFdoeSBkb2VzIHRvcCByZXBvcnQgdGhhdCBDYXNzYW5kcmEgaXMgdXNpbmcgYSBsb3QgbW9yZSBtZW1vcnkgdGhhbiB0aGUgSmF2YSBoZWFwIG1heD8KLQotQ2Fzc2FuZHJhIHVzZXMgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWVtb3J5LW1hcHBlZF9maWxlW01lbW9yeQotTWFwcGVkIEZpbGVzXSAobW1hcCkgaW50ZXJuYWxseS4gVGhhdCBpcywgd2UgdXNlIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MKLXZpcnR1YWwgbWVtb3J5IHN5c3RlbSB0byBtYXAgYSBudW1iZXIgb2Ygb24tZGlzayBmaWxlcyBpbnRvIHRoZQotQ2Fzc2FuZHJhIHByb2Nlc3MnIGFkZHJlc3Mgc3BhY2UuIFRoaXMgd2lsbCAidXNlIiB2aXJ0dWFsIG1lbW9yeTsgaS5lLgotYWRkcmVzcyBzcGFjZSwgYW5kIHdpbGwgYmUgcmVwb3J0ZWQgYnkgdG9vbHMgbGlrZSB0b3AgYWNjb3JkaW5nbHksIGJ1dAotb24gNjQgYml0IHN5c3RlbXMgdmlydHVhbCBhZGRyZXNzIHNwYWNlIGlzIGVmZmVjdGl2ZWx5IHVubGltaXRlZCBzbyB5b3UKLXNob3VsZCBub3Qgd29ycnkgYWJvdXQgdGhhdC4KLQotV2hhdCBtYXR0ZXJzIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mICJtZW1vcnkgdXNlIiBpbiB0aGUgc2Vuc2UgYXMgaXQgaXMKLW5vcm1hbGx5IG1lYW50LCBpcyB0aGUgYW1vdW50IG9mIGRhdGEgYWxsb2NhdGVkIG9uIGJyaygpIG9yIG1tYXAnZAotL2Rldi96ZXJvLCB3aGljaCByZXByZXNlbnQgcmVhbCBtZW1vcnkgdXNlZC4gVGhlIGtleSBpc3N1ZSBpcyB0aGF0IGZvciBhCi1tbWFwJ2QgZmlsZSwgdGhlcmUgaXMgbmV2ZXIgYSBuZWVkIHRvIHJldGFpbiB0aGUgZGF0YSByZXNpZGVudCBpbgotcGh5c2ljYWwgbWVtb3J5LiBUaHVzLCB3aGF0ZXZlciB5b3UgZG8ga2VlcCByZXNpZGVudCBpbiBwaHlzaWNhbCBtZW1vcnkKLWlzIGVzc2VudGlhbGx5IGp1c3QgdGhlcmUgYXMgYSBjYWNoZSwgaW4gdGhlIHNhbWUgd2F5IGFzIG5vcm1hbCBJL08gd2lsbAotY2F1c2UgdGhlIGtlcm5lbCBwYWdlIGNhY2hlIHRvIHJldGFpbiBkYXRhIHRoYXQgeW91IHJlYWQvd3JpdGUuCi0KLVRoZSBkaWZmZXJlbmNlIGJldHdlZW4gbm9ybWFsIEkvTyBhbmQgbW1hcCgpIGlzIHRoYXQgaW4gdGhlIG1tYXAoKSBjYXNlCi10aGUgbWVtb3J5IGlzIGFjdHVhbGx5IG1hcHBlZCB0byB0aGUgcHJvY2VzcywgdGh1cyBhZmZlY3RpbmcgdGhlIHZpcnR1YWwKLXNpemUgYXMgcmVwb3J0ZWQgYnkgdG9wLiBUaGUgbWFpbiBhcmd1bWVudCBmb3IgdXNpbmcgbW1hcCgpIGluc3RlYWQgb2YKLXN0YW5kYXJkIEkvTyBpcyB0aGUgZmFjdCB0aGF0IHJlYWRpbmcgZW50YWlscyBqdXN0IHRvdWNoaW5nIG1lbW9yeSAtIGluCi10aGUgY2FzZSBvZiB0aGUgbWVtb3J5IGJlaW5nIHJlc2lkZW50LCB5b3UganVzdCByZWFkIGl0IC0geW91IGRvbid0IGV2ZW4KLXRha2UgYSBwYWdlIGZhdWx0IChzbyBubyBvdmVyaGVhZCBpbiBlbnRlcmluZyB0aGUga2VybmVsIGFuZCBkb2luZyBhCi1zZW1pLWNvbnRleHQgc3dpdGNoKS4gVGhpcyBpcyBjb3ZlcmVkIGluIG1vcmUgZGV0YWlsCi1odHRwOi8vd3d3LnZhcm5pc2gtY2FjaGUub3JnL3RyYWMvd2lraS9BcmNoaXRlY3ROb3Rlc1toZXJlXS4KLQotPT0gV2hhdCBhcmUgc2VlZHM/Ci0KLVNlZWRzIGFyZSB1c2VkIGR1cmluZyBzdGFydHVwIHRvIGRpc2NvdmVyIHRoZSBjbHVzdGVyLgotCi1JZiB5b3UgY29uZmlndXJlIHlvdXIgbm9kZXMgdG8gcmVmZXIgc29tZSBub2RlIGFzIHNlZWQsIG5vZGVzIGluIHlvdXIKLXJpbmcgdGVuZCB0byBzZW5kIEdvc3NpcCBtZXNzYWdlIHRvIHNlZWRzIG1vcmUgb2Z0ZW4gKGFsc28gc2VlIHRoZQotYHNlY3Rpb24gb24gZ29zc2lwIDxnb3NzaXA+YCkgdGhhbiB0byBub24tc2VlZHMuIEluIG90aGVyIHdvcmRzLCBzZWVkcwotYXJlIHdvcmtlZCBhcyBodWJzIG9mIEdvc3NpcCBuZXR3b3JrLiBXaXRoIHNlZWRzLCBlYWNoIG5vZGUgY2FuIGRldGVjdAotc3RhdHVzIGNoYW5nZXMgb2Ygb3RoZXIgbm9kZXMgcXVpY2tseS4KLQotU2VlZHMgYXJlIGFsc28gcmVmZXJyZWQgYnkgbmV3IG5vZGVzIG9uIGJvb3RzdHJhcCB0byBsZWFybiBvdGhlciBub2RlcwotaW4gcmluZy4gV2hlbiB5b3UgYWRkIGEgbmV3IG5vZGUgdG8gcmluZywgeW91IG5lZWQgdG8gc3BlY2lmeSBhdCBsZWFzdAotb25lIGxpdmUgc2VlZCB0byBjb250YWN0LiBPbmNlIGEgbm9kZSBqb2luIHRoZSByaW5nLCBpdCBsZWFybnMgYWJvdXQgdGhlCi1vdGhlciBub2Rlcywgc28gaXQgZG9lc24ndCBuZWVkIHNlZWQgb24gc3Vic2VxdWVudCBib290LgotCi1Zb3UgY2FuIG1ha2UgYSBzZWVkIGEgbm9kZSBhdCBhbnkgdGltZS4gVGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0Ci1zZWVkIG5vZGVzLiBJZiB5b3UgbGlzdCB0aGUgbm9kZSBpbiBzZWVkIGxpc3QgaXQgaXMgYSBzZWVkCi0KLVNlZWRzIGRvIG5vdCBhdXRvIGJvb3RzdHJhcCAoaS5lLiBpZiBhIG5vZGUgaGFzIGl0c2VsZiBpbiBpdHMgc2VlZCBsaXN0Ci1pdCB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IHRyYW5zZmVyIGRhdGEgdG8gaXRzZWxmKSBJZiB5b3Ugd2FudCBhIG5vZGUgdG8KLWRvIHRoYXQsIGJvb3RzdHJhcCBpdCBmaXJzdCBhbmQgdGhlbiBhZGQgaXQgdG8gc2VlZHMgbGF0ZXIuIElmIHlvdSBoYXZlCi1ubyBkYXRhIChuZXcgaW5zdGFsbCkgeW91IGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IGJvb3RzdHJhcCBhdCBhbGwuCi0KLVJlY29tbWVuZGVkIHVzYWdlIG9mIHNlZWRzOgotCi0qIHBpY2sgdHdvIChvciBtb3JlKSBub2RlcyBwZXIgZGF0YSBjZW50ZXIgYXMgc2VlZCBub2Rlcy4KLSogc3luYyB0aGUgc2VlZCBsaXN0IHRvIGFsbCB5b3VyIG5vZGVzCi0KLVtbYXJlLXNlZWRzLVNQT0ZdXQotPT0gRG9lcyBzaW5nbGUgc2VlZCBtZWFuIHNpbmdsZSBwb2ludCBvZiBmYWlsdXJlPwotCi1UaGUgcmluZyBjYW4gb3BlcmF0ZSBvciBib290IHdpdGhvdXQgYSBzZWVkOyBob3dldmVyLCB5b3Ugd2lsbCBub3QgYmUKLWFibGUgdG8gYWRkIG5ldyBub2RlcyB0byB0aGUgY2x1c3Rlci4gSXQgaXMgcmVjb21tZW5kZWQgdG8gY29uZmlndXJlCi1tdWx0aXBsZSBzZWVkcyBpbiBwcm9kdWN0aW9uIHN5c3RlbS4KLQotW1tjYW50LWNhbGwtam14LW1ldGhvZF1dCi09PSBXaHkgY2FuJ3QgSSBjYWxsIGpteCBtZXRob2QgWCBvbiBqY29uc29sZT8KLQotU29tZSBvZiBKTVggb3BlcmF0aW9ucyB1c2UgYXJyYXkgYXJndW1lbnQgYW5kIGFzIGpjb25zb2xlIGRvZXNuJ3QKLXN1cHBvcnQgYXJyYXkgYXJndW1lbnQsIHRob3NlIG9wZXJhdGlvbnMgY2FuJ3QgYmUgY2FsbGVkIHdpdGggamNvbnNvbGUKLSh0aGUgYnV0dG9ucyBhcmUgaW5hY3RpdmUgZm9yIHRoZW0pLiBZb3UgbmVlZCB0byB3cml0ZSBhIEpNWCBjbGllbnQgdG8KLWNhbGwgc3VjaCBvcGVyYXRpb25zIG9yIG5lZWQgYXJyYXktY2FwYWJsZSBKTVggbW9uaXRvcmluZyB0b29sLgotCi1bW3doeS1tZXNzYWdlLWRyb3BwZWRdXQotPT0gV2h5IGRvIEkgc2VlICIuLi4gbWVzc2FnZXMgZHJvcHBlZCAuLi4iIGluIHRoZSBsb2dzPwotCi1UaGlzIGlzIGEgc3ltcHRvbSBvZiBsb2FkIHNoZWRkaW5nIC0tIENhc3NhbmRyYSBkZWZlbmRpbmcgaXRzZWxmIGFnYWluc3QKLW1vcmUgcmVxdWVzdHMgdGhhbiBpdCBjYW4gaGFuZGxlLgotCi1JbnRlcm5vZGUgbWVzc2FnZXMgd2hpY2ggYXJlIHJlY2VpdmVkIGJ5IGEgbm9kZSwgYnV0IGRvIG5vdCBnZXQgbm90IHRvCi1iZSBwcm9jZXNzZWQgd2l0aGluIHRoZWlyIHByb3BlciB0aW1lb3V0IChzZWUgYHJlYWRfcmVxdWVzdF90aW1lb3V0YCwKLWB3cml0ZV9yZXF1ZXN0X3RpbWVvdXRgLCAuLi4gaW4gdGhlIGBjYXNzYW5kcmEteWFtbGApLCBhcmUgZHJvcHBlZAotcmF0aGVyIHRoYW4gcHJvY2Vzc2VkIChzaW5jZSB0aGUgYXMgdGhlIGNvb3JkaW5hdG9yIG5vZGUgd2lsbCBubyBsb25nZXIKLWJlIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UpLgotCi1Gb3Igd3JpdGVzLCB0aGlzIG1lYW5zIHRoYXQgdGhlIG11dGF0aW9uIHdhcyBub3QgYXBwbGllZCB0byBhbGwgcmVwbGljYXMKLWl0IHdhcyBzZW50IHRvLiBUaGUgaW5jb25zaXN0ZW5jeSB3aWxsIGJlIHJlcGFpcmVkIGJ5IHJlYWQgcmVwYWlyLCBoaW50cwotb3IgYSBtYW51YWwgcmVwYWlyLiBUaGUgd3JpdGUgb3BlcmF0aW9uIG1heSBhbHNvIGhhdmUgdGltZW91dGVkIGFzIGEKLXJlc3VsdC4KLQotRm9yIHJlYWRzLCB0aGlzIG1lYW5zIGEgcmVhZCByZXF1ZXN0IG1heSBub3QgaGF2ZSBjb21wbGV0ZWQuCi0KLUxvYWQgc2hlZGRpbmcgaXMgcGFydCBvZiB0aGUgQ2Fzc2FuZHJhIGFyY2hpdGVjdHVyZSwgaWYgdGhpcyBpcyBhCi1wZXJzaXN0ZW50IGlzc3VlIGl0IGlzIGdlbmVyYWxseSBhIHNpZ24gb2YgYW4gb3ZlcmxvYWRlZCBub2RlIG9yCi1jbHVzdGVyLgotCi1bW29vbS1tYXAtZmFpbGVkXV0KLT09IENhc3NhbmRyYSBkaWVzIHdpdGggYGphdmEubGFuZy5PdXRPZk1lbW9yeUVycm9yOiBNYXAgZmFpbGVkYAotCi1JZiBDYXNzYW5kcmEgaXMgZHlpbmcgKnNwZWNpZmljYWxseSogd2l0aCB0aGUgIk1hcCBmYWlsZWQiIG1lc3NhZ2UsIGl0Ci1tZWFucyB0aGUgT1MgaXMgZGVueWluZyBqYXZhIHRoZSBhYmlsaXR5IHRvIGxvY2sgbW9yZSBtZW1vcnkuIEluIGxpbnV4LAotdGhpcyB0eXBpY2FsbHkgbWVhbnMgbWVtbG9jayBpcyBsaW1pdGVkLiBDaGVjawotYC9wcm9jLzxwaWQgb2YgY2Fzc2FuZHJhPi9saW1pdHNgIHRvIHZlcmlmeSB0aGlzIGFuZCByYWlzZSBpdCAoZWcsIHZpYQotdWxpbWl0IGluIGJhc2gpLiBZb3UgbWF5IGFsc28gbmVlZCB0byBpbmNyZWFzZSBgdm0ubWF4X21hcF9jb3VudC5gIE5vdGUKLXRoYXQgdGhlIGRlYmlhbiBwYWNrYWdlIGhhbmRsZXMgdGhpcyBmb3IgeW91IGF1dG9tYXRpY2FsbHkuCi0KLVtbd2hhdC1vbi1zYW1lLXRpbWVzdGFtcC11cGRhdGVdXQotPT0gV2hhdCBoYXBwZW5zIGlmIHR3byB1cGRhdGVzIGFyZSBtYWRlIHdpdGggdGhlIHNhbWUgdGltZXN0YW1wPwotCi1VcGRhdGVzIG11c3QgYmUgY29tbXV0YXRpdmUsIHNpbmNlIHRoZXkgbWF5IGFycml2ZSBpbiBkaWZmZXJlbnQgb3JkZXJzCi1vbiBkaWZmZXJlbnQgcmVwbGljYXMuIEFzIGxvbmcgYXMgQ2Fzc2FuZHJhIGhhcyBhIGRldGVybWluaXN0aWMgd2F5IHRvCi1waWNrIHRoZSB3aW5uZXIgKGluIGEgdGltZXN0YW1wIHRpZSksIHRoZSBvbmUgc2VsZWN0ZWQgaXMgYXMgdmFsaWQgYXMKLWFueSBvdGhlciwgYW5kIHRoZSBzcGVjaWZpY3Mgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYW4gaW1wbGVtZW50YXRpb24KLWRldGFpbC4gVGhhdCBzYWlkLCBpbiB0aGUgY2FzZSBvZiBhIHRpbWVzdGFtcCB0aWUsIENhc3NhbmRyYSBmb2xsb3dzIHR3bwotcnVsZXM6IGZpcnN0LCBkZWxldGVzIHRha2UgcHJlY2VkZW5jZSBvdmVyIGluc2VydHMvdXBkYXRlcy4gU2Vjb25kLCBpZgotdGhlcmUgYXJlIHR3byB1cGRhdGVzLCB0aGUgb25lIHdpdGggdGhlIGxleGljYWxseSBsYXJnZXIgdmFsdWUgaXMKLXNlbGVjdGVkLgotCi1bW3doeS1ib290c3RyYXBwaW5nLXN0cmVhbS1lcnJvcl1dCi09PSBXaHkgYm9vdHN0cmFwcGluZyBhIG5ldyBub2RlIGZhaWxzIHdpdGggYSAiU3RyZWFtIGZhaWxlZCIgZXJyb3I/Ci0KLVR3byBtYWluIHBvc3NpYmlsaXRpZXM6Ci0KLS4gdGhlIEdDIG1heSBiZSBjcmVhdGluZyBsb25nIHBhdXNlcyBkaXNydXB0aW5nIHRoZSBzdHJlYW1pbmcgcHJvY2VzcwotLiBjb21wYWN0aW9ucyBoYXBwZW5pbmcgaW4gdGhlIGJhY2tncm91bmQgaG9sZCBzdHJlYW1pbmcgbG9uZyBlbm91Z2gKLXRoYXQgdGhlIFRDUCBjb25uZWN0aW9uIGZhaWxzCi0KLUluIHRoZSBmaXJzdCBjYXNlLCByZWd1bGFyIEdDIHR1bmluZyBhZHZpY2VzIGFwcGx5LiBJbiB0aGUgc2Vjb25kIGNhc2UsCi15b3UgbmVlZCB0byBzZXQgVENQIGtlZXBhbGl2ZSB0byBhIGxvd2VyIHZhbHVlIChkZWZhdWx0IGlzIHZlcnkgaGlnaCBvbgotTGludXgpLiBUcnkgdG8ganVzdCBydW4gdGhlIGZvbGxvd2luZzoKLQotLi4uLgotJCBzdWRvIC9zYmluL3N5c2N0bCAtdyBuZXQuaXB2NC50Y3Bfa2VlcGFsaXZlX3RpbWU9NjAgbmV0LmlwdjQudGNwX2tlZXBhbGl2ZV9pbnR2bD02MCBuZXQuaXB2NC50Y3Bfa2VlcGFsaXZlX3Byb2Jlcz01Ci0uLi4uCi0KLVRvIG1ha2UgdGhvc2Ugc2V0dGluZ3MgcGVybWFuZW50LCBhZGQgdGhlbSB0byB5b3VyIGAvZXRjL3N5c2N0bC5jb25mYAotZmlsZS4KLQotTm90ZTogaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2NvbXB1dGUvW0dDRV0ncyBmaXJld2FsbCB3aWxsIGFsd2F5cwotaW50ZXJydXB0IFRDUCBjb25uZWN0aW9ucyB0aGF0IGFyZSBpbmFjdGl2ZSBmb3IgbW9yZSB0aGFuIDEwIG1pbi4KLVJ1bm5pbmcgdGhlIGFib3ZlIGNvbW1hbmQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIGluIHRoYXQgZW52aXJvbm1lbnQuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL2NvbmZpZ3VyaW5nLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZy1zdGFydGVkL2NvbmZpZ3VyaW5nLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvY29uZmlndXJpbmcuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmctc3RhcnRlZC9jb25maWd1cmluZy5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZy1zdGFydGVkL2RyaXZlcnMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZWI2MTMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZy1zdGFydGVkL2RyaXZlcnMuYWRvYwpAQCAtMCwwICsxLDkwIEBACis9IENsaWVudCBkcml2ZXJzCisKK0hlcmUgYXJlIGtub3duIENhc3NhbmRyYSBjbGllbnQgZHJpdmVycyBvcmdhbml6ZWQgYnkgbGFuZ3VhZ2UuIEJlZm9yZQorY2hvb3NpbmcgYSBkcml2ZXIsIHlvdSBzaG91bGQgdmVyaWZ5IHRoZSBDYXNzYW5kcmEgdmVyc2lvbiBhbmQKK2Z1bmN0aW9uYWxpdHkgc3VwcG9ydGVkIGJ5IGEgc3BlY2lmaWMgZHJpdmVyLgorCis9PSBKYXZhCisKKyogaHR0cDovL2FjaGlsbGVzLmFyY2hpbm5vdi5pbmZvL1tBY2hpbGxlc10KKyogaHR0cHM6Ly9naXRodWIuY29tL05ldGZsaXgvYXN0eWFuYXgvd2lraS9HZXR0aW5nLVN0YXJ0ZWRbQXN0eWFuYXhdCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub29ycS9jYXNzZXJbQ2Fzc2VyXQorKiBodHRwczovL2dpdGh1Yi5jb20vZGF0YXN0YXgvamF2YS1kcml2ZXJbRGF0YXN0YXggSmF2YSBkcml2ZXJdCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9JbXBldHVzL2t1bmRlcmFbS3VuZGVyYV0KKyogaHR0cHM6Ly9naXRodWIuY29tL2RlYW5oaWxsZXIvcGxheW9ybVtQbGF5T1JNXQorCis9PSBQeXRob24KKworKiBodHRwczovL2dpdGh1Yi5jb20vZGF0YXN0YXgvcHl0aG9uLWRyaXZlcltEYXRhc3RheCBQeXRob24gZHJpdmVyXQorCis9PSBSdWJ5CisKKyogaHR0cHM6Ly9naXRodWIuY29tL2RhdGFzdGF4L3J1YnktZHJpdmVyW0RhdGFzdGF4IFJ1YnkgZHJpdmVyXQorCis9PSBDIyAvIC5ORVQKKworKiBodHRwczovL2dpdGh1Yi5jb20vcGNoYWxhbWV0L2Nhc3NhbmRyYS1zaGFycFtDYXNzYW5kcmEgU2hhcnBdCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9jc2hhcnAtZHJpdmVyW0RhdGFzdGF4IEMjIGRyaXZlcl0KKyogaHR0cHM6Ly9naXRodWIuY29tL21hbmFnZWRmdXNpb24vZmx1ZW50Y2Fzc2FuZHJhW0ZsdWVudCBDYXNzYW5kcmFdCisKKz09IE5vZGVqcworCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9ub2RlanMtZHJpdmVyW0RhdGFzdGF4IE5vZGVqcyBkcml2ZXJdCisKKz09IFBIUAorCisqIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vYS9hcGFjaGUtZXh0cmFzLm9yZy9wL2Nhc3NhbmRyYS1wZG9bQ1FMIHwgUEhQXQorKiBodHRwczovL2dpdGh1Yi5jb20vZGF0YXN0YXgvcGhwLWRyaXZlci9bRGF0YXN0YXggUEhQIGRyaXZlcl0KKyogaHR0cHM6Ly9naXRodWIuY29tL2FwYXJraG9tZW5rby9waHAtY2Fzc2FuZHJhW1BIUC1DYXNzYW5kcmFdCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9kdW9zaHVvL3BocC1jYXNzYW5kcmFbUEhQIExpYnJhcnkgZm9yIENhc3NhbmRyYV0KKworPT0gQysrCisKKyogaHR0cHM6Ly9naXRodWIuY29tL2RhdGFzdGF4L2NwcC1kcml2ZXJbRGF0YXN0YXggQysrIGRyaXZlcl0KKyogaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9saWJxdGNhc3NhbmRyYVtsaWJRVENhc3NhbmRyYV0KKworPT0gU2NhbGEKKworKiBodHRwczovL2dpdGh1Yi5jb20vZGF0YXN0YXgvc3BhcmstY2Fzc2FuZHJhLWNvbm5lY3RvcltEYXRhc3RheCBTcGFyaworY29ubmVjdG9yXQorKiBodHRwczovL2dpdGh1Yi5jb20vbmV3emx5L3BoYW50b21bUGhhbnRvbV0KKyogaHR0cHM6Ly9naXRodWIuY29tL2dldHF1aWxsL3F1aWxsW1F1aWxsXQorCis9PSBDbG9qdXJlCisKKyogaHR0cHM6Ly9naXRodWIuY29tL21wZW5ldC9hbGlhW0FsaWFdCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG9qdXJld2Vya3ovY2Fzc2Fmb3J0ZVtDYXNzYWZvcnRlXQorKiBodHRwczovL2dpdGh1Yi5jb20vbXBlbmV0L2hheXRbSGF5dF0KKworPT0gRXJsYW5nCisKKyogaHR0cHM6Ly9naXRodWIuY29tL21hdGVoYXQvY3FlcmxbQ1FlcmxdCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9zaWx2aXVjcHAvZXJsY2Fzc1tFcmxjYXNzXQorCis9PSBHbworCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZWxvcHMvY3FsY1tDUUxjXQorKiBodHRwczovL2dpdGh1Yi5jb20vaGFpbG9jYWIvZ29jYXNzYVtHb2Nhc3NhXQorKiBodHRwczovL2dpdGh1Yi5jb20vZ29jcWwvZ29jcWxbR29DUUxdCisKKz09IEhhc2tlbGwKKworKiBodHRwczovL2dpdGh1Yi5jb20vb3phdGFtYW4vY2Fzc3lbQ2Fzc3ldCisKKz09IFJ1c3QKKworKiBodHRwczovL2dpdGh1Yi5jb20vbmVpY2gvcnVzdC1jcWxbUnVzdCBDUUxdCisKKz09IFBlcmwKKworKiBodHRwczovL2dpdGh1Yi5jb20vdHZkdy9wZXJsLWRiZC1jYXNzYW5kcmFbQ2Fzc2FuZHJhOjpDbGllbnQgYW5kCitEQkQ6OkNhc3NhbmRyYV0KKworPT0gRWxpeGlyCisKKyogaHR0cHM6Ly9naXRodWIuY29tL2xleGhpZGUveGFuZHJhW1hhbmRyYV0KKyogaHR0cHM6Ly9naXRodWIuY29tL21hdGVoYXQvY3FleFtDUUV4XQorCis9PSBEYXJ0CisKKyogaHR0cHM6Ly9naXRodWIuY29tL2FjaGlsbGVhc2EvZGFydF9jYXNzYW5kcmFfY3FsW2RhcnRfY2Fzc2FuZHJhX2NxbF0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nLXN0YXJ0ZWQvaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nLXN0YXJ0ZWQvaW5kZXguYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDNjODIzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmctc3RhcnRlZC9pbmRleC5hZG9jCkBAIC0wLDAgKzEsMzAgQEAKKz0gR2V0dGluZyBTdGFydGVkCisKK1RoaXMgc2VjdGlvbiBjb3ZlcnMgaG93IHRvIGdldCBzdGFydGVkIHVzaW5nIEFwYWNoZSBDYXNzYW5kcmEgYW5kIHNob3VsZAorYmUgdGhlIGZpcnN0IHRoaW5nIHRvIHJlYWQgaWYgeW91IGFyZSBuZXcgdG8gQ2Fzc2FuZHJhLgorCisqIHhyZWY6aW5zdGFsbGluZy9pbnN0YWxsaW5nLmFkb2NbSW5zdGFsbGluZyBDYXNzYW5kcmFdOiBJbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIHBsdXMgaW5mb3JtYXRpb24gb24gY2hvb3NpbmcgYSBtZXRob2QuICAKKyoqIFsgeHJlZjppbnN0YWxsaW5nL2luc3RhbGxpbmcuYWRvYyNpbnN0YWxsaW5nLXRoZS1kb2NrZXItaW1hZ2VbRG9ja2VyXSBdCitbIHhyZWY6aW5zdGFsbGluZy9pbnN0YWxsaW5nLmFkb2MjaW5zdGFsbGluZy10aGUtYmluYXJ5LXRhcmJhbGxbdGFyYmFsbF0gXQorWyB4cmVmOmluc3RhbGxpbmcvaW5zdGFsbGluZy5hZG9jI2luc3RhbGxpbmctdGhlLWRlYmlhbi1wYWNrYWdlc1tEZWJpYW5dIF0KK1sgeHJlZjppbnN0YWxsaW5nL2luc3RhbGxpbmcuYWRvYyNpbnN0YWxsaW5nLXRoZS1ycG0tcGFja2FnZXNbUlBNXSBdCisqIHhyZWY6Z2V0dGluZy1zdGFydGVkL2NvbmZpZ3VyaW5nLmFkb2NbQ29uZmlndXJpbmcgQ2Fzc2FuZHJhXQorKiB4cmVmOmdldHRpbmctc3RhcnRlZC9xdWVyeWluZy5hZG9jW0luc2VydGluZyBhbmQgcXVlcnlpbmcgZGF0YV0KKyogeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jW0NsaWVudCBkcml2ZXJzXTogRHJpdmVycyBmb3IgdmFyaW91cyBsYW5ndWFnZXMuCisqKiBbIHhyZWY6Z2V0dGluZy1zdGFydGVkL2RyaXZlcnMuYWRvYyNqYXZhW0phdmFdIF0KKyBbIHhyZWY6Z2V0dGluZy1zdGFydGVkL2RyaXZlcnMuYWRvYyNweXRob25bUHl0aG9uXSBdCisgWyB4cmVmOmdldHRpbmctc3RhcnRlZC9kcml2ZXJzLmFkb2MjcnVieVtSdWJ5XSBdCisgWyB4cmVmOmdldHRpbmctc3RhcnRlZC9kcml2ZXJzLmFkb2MjYy1uZXRbQyMgLyAuTkVUXSBdCisgWyB4cmVmOmdldHRpbmctc3RhcnRlZC9kcml2ZXJzLmFkb2Mjbm9kZWpzW05vZGUuanNdIF0KKyBbIHhyZWY6Z2V0dGluZy1zdGFydGVkL2RyaXZlcnMuYWRvYyNwaHBbUEhQXSBdCisgWyB4cmVmOmdldHRpbmctc3RhcnRlZC9kcml2ZXJzLmFkb2MjY1tDKytdIF0KKyBbIHhyZWY6Z2V0dGluZy1zdGFydGVkL2RyaXZlcnMuYWRvYyNzY2FsYVtTY2FsYV0gXQorIFsgeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jI2Nsb2p1cmVbQ2xvanVyZV0gXQorIFsgeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jI2VybGFuZ1tFcmxhbmddIF0KKyBbIHhyZWY6Z2V0dGluZy1zdGFydGVkL2RyaXZlcnMuYWRvYyNnb1tHb10gXQorIFsgeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jI2hhc2tlbGxbSGFza2VsbF0gXQorIFsgeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jI3J1c3RbUnVzdF0gXQorIFsgeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jI3BlcmxbUGVybF0gXQorIFsgeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvZHJpdmVycy5hZG9jI2VsaXhpcltFbGl4aXJdIF0KKyBbIHhyZWY6Z2V0dGluZy1zdGFydGVkL2RyaXZlcnMuYWRvYyNkYXJ0W0RhcnRdIF0KKyogeHJlZjpnZXR0aW5nLXN0YXJ0ZWQvcHJvZHVjdGlvbi5hZG9jW1Byb2R1Y3Rpb24gcmVjb21tZW5kYXRpb25zXQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmctc3RhcnRlZC9wcm9kdWN0aW9uLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZy1zdGFydGVkL3Byb2R1Y3Rpb24uYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDI4YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmctc3RhcnRlZC9wcm9kdWN0aW9uLmFkb2MKQEAgLTAsMCArMSwxNjMgQEAKKz0gUHJvZHVjdGlvbiByZWNvbW1lbmRhdGlvbnMKKworVGhlIGBjYXNzYW5kcmEueWFtbGAgYW5kIGBqdm0ub3B0aW9uc2AgZmlsZXMgaGF2ZSBhIG51bWJlciBvZiBub3RlcyBhbmQKK3JlY29tbWVuZGF0aW9ucyBmb3IgcHJvZHVjdGlvbiB1c2FnZS4KK1RoaXMgcGFnZSBleHBhbmRzIG9uIHNvbWUgb2YgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBmaWxlcy4KKworPT0gVG9rZW5zCisKK1VzaW5nIG1vcmUgdGhhbiBvbmUgdG9rZW4tcmFuZ2UgcGVyIG5vZGUgaXMgcmVmZXJyZWQgdG8gYXMgdmlydHVhbCBub2Rlcywgb3Igdm5vZGVzLgorYHZub2Rlc2AgZmFjaWxpdGF0ZSBmbGV4aWJsZSBleHBhbnNpb24gd2l0aCBtb3JlIHN0cmVhbWluZyBwZWVycyB3aGVuIGEgbmV3IG5vZGUgYm9vdHN0cmFwcworaW50byBhIGNsdXN0ZXIuCitMaW1pdGluZyB0aGUgbmVnYXRpdmUgaW1wYWN0IG9mIHN0cmVhbWluZyAoSS9PIGFuZCBDUFUgb3ZlcmhlYWQpIGVuYWJsZXMgaW5jcmVtZW50YWwgY2x1c3RlciBleHBhbnNpb24uCitIb3dldmVyLCBtb3JlIHRva2VucyBsZWFkcyB0byBzaGFyaW5nIGRhdGEgd2l0aCBtb3JlIHBlZXJzLCBhbmQgcmVzdWx0cyBpbiBkZWNyZWFzZWQgYXZhaWxhYmlsaXR5LgorVGhlc2UgdHdvIGZhY3RvcnMgbXVzdCBiZSBiYWxhbmNlZCBiYXNlZCBvbiBhIGNsdXN0ZXIncyBjaGFyYWN0ZXJpc3RpYyByZWFkcyBhbmQgd3JpdGVzLgorVG8gbGVhcm4gbW9yZSwKK2h0dHBzOi8vZ2l0aHViLmNvbS9qb2x5bmNoL3B5dGhvbl9wZXJmb3JtYW5jZV90b29sa2l0L3Jhdy9tYXN0ZXIvbm90ZWJvb2tzL2Nhc3NhbmRyYV9hdmFpbGFiaWxpdHkvd2hpdGVwYXBlci9jYXNzYW5kcmEtYXZhaWxhYmlsaXR5LXZpcnR1YWwucGRmW0Nhc3NhbmRyYSBBdmFpbGFiaWxpdHkgaW4gVmlydHVhbCBOb2RlcywgSm9zZXBoIEx5bmNoIGFuZCBKb3NoIFNueWRlcl0gaXMgcmVjb21tZW5kZWQgcmVhZGluZy4KKworQ2hhbmdlIHRoZSBudW1iZXIgb2YgdG9rZW5zIHVzaW5nIHRoZSBzZXR0aW5nIGluIHRoZSBgY2Fzc2FuZHJhLnlhbWxgIGZpbGU6CisKK2BudW1fdG9rZW5zOiAxNmAKKworSGVyZSBhcmUgdGhlIG1vc3QgY29tbW9uIHRva2VuIGNvdW50cyB3aXRoIGEgYnJpZWYgZXhwbGFuYXRpb24gb2Ygd2hlbgorYW5kIHdoeSB5b3Ugd291bGQgdXNlIGVhY2ggb25lLgorCitbd2lkdGg9IjEwMCUiLGNvbHM9IjEzJSw4NyUiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfFRva2VuIENvdW50IHxEZXNjcmlwdGlvbgorfDEgfE1heGltdW0gYXZhaWxhYmxpbGl0eSwgbWF4aW11bSBjbHVzdGVyIHNpemUsIGZld2VzdCBwZWVycywgYnV0CitpbmZsZXhpYmxlIGV4cGFuc2lvbi4gTXVzdCBhbHdheXMgZG91YmxlIHNpemUgb2YgY2x1c3RlciB0byBleHBhbmQgYW5kCityZW1haW4gYmFsYW5jZWQuCisKK3w0IHxBIGhlYWx0aHkgbWl4IG9mIGVsYXN0aWNpdHkgYW5kIGF2YWlsYWJpbGl0eS4gUmVjb21tZW5kZWQgZm9yCitjbHVzdGVycyB3aGljaCB3aWxsIGV2ZW50dWFsbHkgcmVhY2ggb3ZlciAzMCBub2Rlcy4gUmVxdWlyZXMgYWRkaW5nCithcHByb3hpbWF0ZWx5IDIwJSBtb3JlIG5vZGVzIHRvIHJlbWFpbiBiYWxhbmNlZC4gU2hyaW5raW5nIGEgY2x1c3RlciBtYXkKK3Jlc3VsdCBpbiBjbHVzdGVyIGltYmFsYW5jZS4KKworfDggfCBVc2luZyA4IHZub2RlcyBkaXN0cmlidXRlcyB0aGUgd29ya2xvYWQgYmV0d2VlbiBzeXN0ZW1zIHdpdGggYSB+MTAlIHZhcmlhbmNlCithbmQgaGFzIG1pbmltYWwgaW1wYWN0IG9uIHBlcmZvcm1hbmNlLgorCit8MTYgfEJlc3QgZm9yIGhlYXZpbHkgZWxhc3RpYyBjbHVzdGVycyB3aGljaCBleHBhbmQgYW5kIHNocmluaworcmVndWxhcmx5LCBidXQgbWF5IGhhdmUgaXNzdWVzIGF2YWlsYWJpbGl0eSB3aXRoIGxhcmdlciBjbHVzdGVycy4gTm90CityZWNvbW1lbmRlZCBmb3IgY2x1c3RlcnMgb3ZlciA1MCBub2Rlcy4KK3w9PT0KKworSW4gYWRkaXRpb24gdG8gc2V0dGluZyB0aGUgdG9rZW4gY291bnQsIGl0J3MgZXh0cmVtZWx5IGltcG9ydGFudCB0aGF0CitgYWxsb2NhdGVfdG9rZW5zX2Zvcl9sb2NhbF9yZXBsaWNhdGlvbl9mYWN0b3JgIGluIGBjYXNzYW5kcmEueWFtbGAgaXMgc2V0IHRvIGFuCithcHByb3ByaWF0ZSBudW1iZXIgb2YgcmVwbGljYXRlcywgdG8gZW5zdXJlIGV2ZW4gdG9rZW4gYWxsb2NhdGlvbi4KKworPT0gUmVhZCBhaGVhZAorCitSZWFkIGFoZWFkIGlzIGFuIG9wZXJhdGluZyBzeXN0ZW0gZmVhdHVyZSB0aGF0IGF0dGVtcHRzIHRvIGtlZXAgYXMgbXVjaAorZGF0YSBhcyBwb3NzaWJsZSBsb2FkZWQgaW4gdGhlIHBhZ2UgY2FjaGUuCitTcGlubmluZyBkaXNrcyBjYW4gaGF2ZSBsb25nIHNlZWsgdGltZXMgY2F1c2luZyBoaWdoIGxhdGVuY3ksIHNvIGFkZGl0aW9uYWwKK3Rocm91Z2hwdXQgb24gcmVhZHMgdXNpbmcgcGFnZSBjYWNoZSBjYW4gaW1wcm92ZSBwZXJmb3JtYW5jZS4KK0J5IGxldmVyYWdpbmcgcmVhZCBhaGVhZCwgdGhlIE9TIGNhbiBwdWxsIGFkZGl0aW9uYWwgZGF0YSBpbnRvIG1lbW9yeSB3aXRob3V0Cit0aGUgY29zdCBvZiBhZGRpdGlvbmFsIHNlZWtzLgorVGhpcyBtZXRob2Qgd29ya3Mgd2VsbCB3aGVuIHRoZSBhdmFpbGFibGUgUkFNIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUKK2hvdCBkYXRhc2V0LCBidXQgY2FuIGJlIHByb2JsZW1hdGljIHdoZW4gdGhlIHJldmVyc2UgaXMgdHJ1ZSAoZGF0YXNldCA+IFJBTSkuCitUaGUgbGFyZ2VyIHRoZSBob3QgZGF0YXNldCwgdGhlIGxlc3MgcmVhZCBhaGVhZCBpcyB1c2VmdWwuCisKK1JlYWQgYWhlYWQgaXMgZGVmaW5pdGVseSBub3QgdXNlZnVsIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6CisKKyogU21hbGwgcGFydGl0aW9ucywgc3VjaCBhcyB0YWJsZXMgd2l0aCBhIHNpbmdsZSBwYXJ0aXRpb24ga2V5CisqIFNvbGlkIHN0YXRlIGRyaXZlcyAoU1NEcykKKworCitSZWFkIGFoZWFkIGNhbiBhY3R1YWxseSBpbmNyZWFzZSBkaXNrIHVzYWdlLCBhbmQgaW4gc29tZSBjYXNlcyByZXN1bHQgaW4gYXMgbXVjaAorYXMgYSA1eCBsYXRlbmN5IGFuZCB0aHJvdWdocHV0IHBlcmZvcm1hbmNlIHBlbmFsdHkuCitSZWFkLWhlYXZ5LCBrZXkvdmFsdWUgdGFibGVzIHdpdGggc21hbGwgKHVuZGVyIDFLQikgcm93cyBhcmUgZXNwZWNpYWxseSBwcm9uZQordG8gdGhpcyBwcm9ibGVtLgorCitUaGUgcmVjb21tZW5kZWQgcmVhZCBhaGVhZCBzZXR0aW5ncyBhcmU6CisKK1t3aWR0aD0iNTklIixjb2xzPSI0MCUsNjAlIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xIYXJkd2FyZSB8SW5pdGlhbCBSZWNvbW1lbmRhdGlvbgorfFNwaW5uaW5nIERpc2tzIHw2NEtCCit8U1NEIHw0S0IKK3w9PT0KKworUmVhZCBhaGVhZCBjYW4gYmUgYWRqdXN0ZWQgb24gTGludXggc3lzdGVtcyB1c2luZyB0aGUgYGJsb2NrZGV2YCB0b29sLgorCitGb3IgZXhhbXBsZSwgc2V0IHRoZSByZWFkIGFoZWFkIG9mIHRoZSBkaXNrIGAvZGV2L3NkYTFgIHRvIDRLQjoKKworW3NvdXJjZSwgc2hlbGxdCistLS0tCiskIGJsb2NrZGV2IC0tc2V0cmEgOCAvZGV2L3NkYTEKKy0tLS0KK1tOT1RFXQorPT09PQorVGhlIGBibG9ja2RldmAgc2V0dGluZyBzZXRzIHRoZSBudW1iZXIgb2YgNTEyIGJ5dGUgc2VjdG9ycyB0byByZWFkIGFoZWFkLgorVGhlIGFyZ3VtZW50IG9mIDggYWJvdmUgaXMgZXF1aXZhbGVudCB0byA0S0IsIG9yIDggKiA1MTIgYnl0ZXMuCis9PT09CisKK0FsbCBzeXN0ZW1zIGFyZSBkaWZmZXJlbnQsIHNvIHVzZSB0aGVzZSByZWNvbW1lbmRhdGlvbnMgYXMgYSBzdGFydGluZyBwb2ludCBhbmQKK3R1bmUsIGJhc2VkIG9uIHlvdXIgU0xBIGFuZCB0aHJvdWdocHV0IHJlcXVpcmVtZW50cy4KK1RvIHVuZGVyc3RhbmQgaG93IHJlYWQgYWhlYWQgaW1wYWN0cyBkaXNrIHJlc291cmNlIHVzYWdlLCB3ZSByZWNvbW1lbmQgY2FyZWZ1bGx5CityZWFkaW5nIHRocm91Z2ggdGhlIHhyZWY6dHJvdWJsZXNob290aW5nL3VzZV90b29scy5hZG9jW0RpdmluZyBEZWVwLCB1c2luZyBleHRlcm5hbCB0b29sc10KK3NlY3Rpb24uCisKKz09IENvbXByZXNzaW9uCisKK0NvbXByZXNzZWQgZGF0YSBpcyBzdG9yZWQgYnkgY29tcHJlc3NpbmcgZml4ZWQtc2l6ZSBieXRlIGJ1ZmZlcnMgYW5kIHdyaXRpbmcgdGhlCitkYXRhIHRvIGRpc2suCitUaGUgYnVmZmVyIHNpemUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYGNodW5rX2xlbmd0aF9pbl9rYmAgZWxlbWVudCBpbiB0aGUgY29tcHJlc3Npb24KK21hcCBvZiBhIHRhYmxlJ3Mgc2NoZW1hIHNldHRpbmdzIGZvciBgV0lUSCBDT01QUkVTU0lPTmAuCitUaGUgZGVmYXVsdCBzZXR0aW5nIGlzIDE2S0Igc3RhcnRpbmcgd2l0aCBDYXNzYW5kcmEgezQwX3ZlcnNpb259LgorCitTaW5jZSB0aGUgZW50aXJlIGNvbXByZXNzZWQgYnVmZmVyIG11c3QgYmUgcmVhZCBvZmYtZGlzaywgdXNpbmcgYSBjb21wcmVzc2lvbgorY2h1bmsgbGVuZ3RoIHRoYXQgaXMgdG9vIGxhcmdlIGNhbiBsZWFkIHRvIHNpZ25pZmljYW50IG92ZXJoZWFkIHdoZW4gcmVhZGluZyBzbWFsbCByZWNvcmRzLgorQ29tYmluZWQgd2l0aCB0aGUgZGVmYXVsdCByZWFkIGFoZWFkIHNldHRpbmcsIHRoZSByZXN1bHQgY2FuIGJlIG1hc3NpdmUKK3JlYWQgYW1wbGlmaWNhdGlvbiBmb3IgY2VydGFpbiB3b3JrbG9hZHMuIFRoZXJlZm9yZSwgcGlja2luZyBhbiBhcHByb3ByaWF0ZQordmFsdWUgZm9yIHRoaXMgc2V0dGluZyBpcyBpbXBvcnRhbnQuCisKK0xaNENvbXByZXNzb3IgaXMgdGhlIGRlZmF1bHQgYW5kIHJlY29tbWVuZGVkIGNvbXByZXNzaW9uIGFsZ29yaXRobS4KK0lmIHlvdSBuZWVkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gY29tcHJlc3Npb24sIHJlYWQKK2h0dHBzOi8vdGhlbGFzdHBpY2tsZS5jb20vYmxvZy8yMDE4LzA4LzA4L2NvbXByZXNzaW9uX3BlcmZvcm1hbmNlLmh0bWxbVGhlIExhc3QgUGlja2xlIGJsb2dwb3N0IG9uIGNvbXByZXNzaW9uIHBlcmZvcm1hbmNlXS4KKworPT0gQ29tcGFjdGlvbgorCitUaGVyZSBhcmUgZGlmZmVyZW50IHhyZWY6Y29tcGFjdGlvbi9pbmRleC5hZG9jW2NvbXBhY3Rpb25dIHN0cmF0ZWdpZXMgYXZhaWxhYmxlCitmb3IgZGlmZmVyZW50IHdvcmtsb2Fkcy4KK1dlIHJlY29tbWVuZCByZWFkaW5nIGFib3V0IHRoZSBkaWZmZXJlbnQgc3RyYXRlZ2llcyB0byB1bmRlcnN0YW5kIHdoaWNoIGlzIHRoZQorYmVzdCBmb3IgeW91ciBlbnZpcm9ubWVudC4KK0RpZmZlcmVudCB0YWJsZXMgbWF5LCBhbmQgZnJlcXVlbnRseSBkbyB1c2UgZGlmZmVyZW50IGNvbXBhY3Rpb24gc3RyYXRlZ2llcyBpbgordGhlIHNhbWUgY2x1c3Rlci4KKworPT0gRW5jcnlwdGlvbgorCitJdCBpcyBzaWduaWZpY2FudGx5IGJldHRlciB0byBzZXQgdXAgcGVlci10by1wZWVyIGVuY3J5cHRpb24gYW5kIGNsaWVudCBzZXJ2ZXIKK2VuY3J5cHRpb24gd2hlbiBzZXR0aW5nIHVwIHlvdXIgcHJvZHVjdGlvbiBjbHVzdGVyLgorU2V0dGluZyBpdCB1cCBhZnRlciB0aGUgY2x1c3RlciBpcyBzZXJ2aW5nIHByb2R1Y3Rpb24gdHJhZmZpYyBpcyBjaGFsbGVuZ2luZwordG8gZG8gY29ycmVjdGx5LgorSWYgeW91IGV2ZXIgcGxhbiB0byB1c2UgbmV0d29yayBlbmNyeXB0aW9uIG9mIGFueSB0eXBlLCB3ZSByZWNvbW1lbmQgc2V0dGluZyBpdAordXAgd2hlbiBpbml0aWFsbHkgY29uZmlndXJpbmcgeW91ciBjbHVzdGVyLgorQ2hhbmdpbmcgdGhlc2UgY29uZmlndXJhdGlvbnMgbGF0ZXIgaXMgbm90IGltcG9zc2libGUsIGJ1dCBtaXN0YWtlcyBjYW4KK3Jlc3VsdCBpbiBkb3dudGltZSBvciBkYXRhIGxvc3MuCisKKz09IEVuc3VyZSBrZXlzcGFjZXMgYXJlIGNyZWF0ZWQgd2l0aCBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneQorCitQcm9kdWN0aW9uIGNsdXN0ZXJzIHNob3VsZCBuZXZlciB1c2UgYFNpbXBsZVN0cmF0ZWd5YC4KK1Byb2R1Y3Rpb24ga2V5c3BhY2VzIHNob3VsZCB1c2UgdGhlIGBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneWAgKE5UUykuCitGb3IgZXhhbXBsZToKKworW3NvdXJjZSwgY3FsXQorLS0tLQorQ1JFQVRFIEtFWVNQQUNFIG15a2V5c3BhY2UgV0lUSCByZXBsaWNhdGlvbiA9ICAgICB7CisgICAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLAorICAgJ2RhdGFjZW50ZXIxJzogMworfTsKKy0tLS0KKworQ2Fzc2FuZHJhIGNsdXN0ZXJzIGluaXRpYWxpemVkIHdpdGggYE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5YCBjYW4gdGFrZSBhZHZhbnRhZ2UKK29mIHRoZSBhYmlsaXR5IHRvIGNvbmZpZ3VyZSBtdWx0aXBsZSByYWNrcyBhbmQgZGF0YSBjZW50ZXJzLgorCis9PSBDb25maWd1cmUgcmFja3MgYW5kIHNuaXRjaAorCisqKkNvcnJlY3RseSBjb25maWd1cmluZyBvciBjaGFuZ2luZyByYWNrcyBhZnRlciBhIGNsdXN0ZXIgaGFzIGJlZW4gcHJvdmlzaW9uZWQgaXMgYW4gdW5zdXBwb3J0ZWQgcHJvY2VzcyoqLgorTWlncmF0aW5nIGZyb20gYSBzaW5nbGUgcmFjayB0byBtdWx0aXBsZSByYWNrcyBpcyBhbHNvIHVuc3VwcG9ydGVkIGFuZCBjYW4KK3Jlc3VsdCBpbiBkYXRhIGxvc3MuCitVc2luZyBgR29zc2lwaW5nUHJvcGVydHlGaWxlU25pdGNoYCBpcyB0aGUgbW9zdCBmbGV4aWJsZSBzb2x1dGlvbiBmb3IKK29uLXByZW1pc2Ugb3IgbWl4ZWQgY2xvdWQgZW52aXJvbm1lbnRzLgorYEVjMlNuaXRjaGAgaXMgcmVsaWFibGUgZm9yIEFXUyBFQzIgb25seSBlbnZpcm9ubWVudHMuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZy1zdGFydGVkL3F1ZXJ5aW5nLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZy1zdGFydGVkL3F1ZXJ5aW5nLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhNmQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nLXN0YXJ0ZWQvcXVlcnlpbmcuYWRvYwpAQCAtMCwwICsxLDMxIEBACis9IEluc2VydGluZyBhbmQgcXVlcnlpbmcKKworVGhlIEFQSSBmb3IgQ2Fzc2FuZHJhIGlzIHhyZWY6Y3FsL2RkbC5hZG9jW2BDUUxgLCB0aGUgQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlXS4gVG8KK3VzZSBDUUwsIHlvdSB3aWxsIG5lZWQgdG8gY29ubmVjdCB0byB0aGUgY2x1c3RlciwgdXNpbmcgZWl0aGVyOgorCisqIGBjcWxzaGAsIGEgc2hlbGwgZm9yIENRTAorKiBhIGNsaWVudCBkcml2ZXIgZm9yIENhc3NhbmRyYQorKiBmb3IgdGhlIGFkdmVudHVyb3VzLCBjaGVjayBvdXQgaHR0cHM6Ly96ZXBwZWxpbi5hcGFjaGUub3JnL2RvY3MvMC43LjAvaW50ZXJwcmV0ZXIvY2Fzc2FuZHJhLmh0bWxbQXBhY2hlIFplcHBlbGluXSwgYSBub3RlYm9vay1zdHlsZSB0b29sCisKKz09IENRTFNICisKK2BjcWxzaGAgaXMgYSBjb21tYW5kLWxpbmUgc2hlbGwgZm9yIGludGVyYWN0aW5nIHdpdGggQ2Fzc2FuZHJhIHVzaW5nCitDUUwuIEl0IGlzIHNoaXBwZWQgd2l0aCBldmVyeSBDYXNzYW5kcmEgcGFja2FnZSwgYW5kIGNhbiBiZSBmb3VuZCBpbiB0aGUKK2BiaW5gIGRpcmVjdG9yeSBhbG9uZ3NpZGUgdGhlIGBjYXNzYW5kcmFgIGV4ZWN1dGFibGUuIEl0IGNvbm5lY3RzIHRvIHRoZQorc2luZ2xlIG5vZGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgorCitbc291cmNlLCBzaGVsbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9jcWxzaF9sb2NhbGhvc3Quc2hbXQorLS0tLQorW3NvdXJjZSwgY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL2NxbHNoX2xvY2FsaG9zdC5yZXN1bHRbXQorLS0tLQorSWYgdGhlIGNvbW1hbmQgaXMgdXNlZCB3aXRob3V0IHNwZWNpZnlpbmcgYSBub2RlLCBgbG9jYWxob3N0YCBpcyB0aGUgZGVmYXVsdC4gU2VlIHRoZSB4cmVmOnRvb2xzL2NxbHNoLmFkb2NbYGNxbHNoYCBzZWN0aW9uXSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLgorCis9PSBDbGllbnQgZHJpdmVycworCitBIGxvdCBvZiB4cmVmOmdldHRpbmctc3RhcnRlZC9kcml2ZXJzLmFkb2NbY2xpZW50IGRyaXZlcnNdIGFyZSBwcm92aWRlZCBieSB0aGUgQ29tbXVuaXR5IGFuZCBhIGxpc3Qgb2YKK2tub3duIGRyaXZlcnMgaXMgcHJvdmlkZWQuIFlvdSBzaG91bGQgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgZWFjaCBkcml2ZXIKK2ZvciBtb3JlIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmctc3RhcnRlZC9xdWlja3N0YXJ0LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZy1zdGFydGVkL3F1aWNrc3RhcnQuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjNkMjY5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmctc3RhcnRlZC9xdWlja3N0YXJ0LmFkb2MKQEAgLTAsMCArMSwxMTYgQEAKKz0gQXBhY2hlIENhc3NhbmRyYSBRdWlja3N0YXJ0Cis6dGFiczoKKworX0ludGVyZXN0ZWQgaW4gZ2V0dGluZyBzdGFydGVkIHdpdGggQ2Fzc2FuZHJhPyBGb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zLl8KKworKlNURVAgMTogR0VUIENBU1NBTkRSQSBVU0lORyBET0NLRVIqCisKK1lvdSdsbCBuZWVkIHRvIGhhdmUgRG9ja2VyIERlc2t0b3AgZm9yIE1hYywgRG9ja2VyIERlc2t0b3AgZm9yIFdpbmRvd3MsIG9yCitzaW1pbGFyIHNvZnR3YXJlIGluc3RhbGxlZCBvbiB5b3VyIGNvbXB1dGVyLgorCitbc291cmNlLCBwbGFpbnRleHRdCistLS0tCitkb2NrZXIgcHVsbCBjYXNzYW5kcmE6bGF0ZXN0CistLS0tCisKK0FwYWNoZSBDYXNzYW5kcmEgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBodHRwczovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2Rvd25sb2FkL1t0YXJiYWxsIG9yIHBhY2thZ2UgZG93bmxvYWRdLgorCisqU1RFUCAyOiBTVEFSVCBDQVNTQU5EUkEqCisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK2RvY2tlciBydW4gLS1uYW1lIGNhc3NhbmRyYSBjYXNzYW5kcmEKKy0tLS0KKworKlNURVAgMzogQ1JFQVRFIEZJTEVTKgorCitJbiB0aGUgZGlyZWN0b3J5IHdoZXJlIHlvdSBwbGFuIHRvIHJ1biB0aGUgbmV4dCBzdGVwLCBjcmVhdGUgdGhlc2UgdHdvIGZpbGVzCitzbyB0aGF0IHNvbWUgZGF0YSBjYW4gYmUgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbiB0aGUgbmV4dCBzdGVwLgorCitBIF9jcWxzaHJjXyBmaWxlIHdpbGwgbG9nIGludG8gdGhlIENhc3NhbmRyYSBkYXRhYmFzZSB3aXRoIHRoZSBkZWZhdWx0IHN1cGVydXNlcjoKKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQorW2F1dGhlbnRpY2F0aW9uXQorCXVzZXJuYW1lID0gY2Fzc2FuZHJhCisJcGFzc3dvcmQgPSBjYXNzYW5kcmEKKy0tLS0KKworQ3JlYXRlIGEgX3NjcmlwdHNfIGRpcmVjdG9yeSBhbmQgY2hhbmdlIHRvIHRoYXQgZGlyZWN0b3J5LgorVGhlIGZvbGxvd2luZyBfZGF0YS5jcWxfIGZpbGUgd2lsbCBjcmVhdGUgYSBrZXlzcGFjZSwgdGhlIGxheWVyIGF0IHdoaWNoIENhc3NhbmRyYQorcmVwbGljYXRlcyBpdHMgZGF0YSwgYSB0YWJsZSB0byBob2xkIHRoZSBkYXRhLCBhbmQgaW5zZXJ0IHNvbWUgZGF0YToKKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQorIyBDcmVhdGUgYSBrZXlzcGFjZQorQ1JFQVRFIEtFWVNQQUNFIElGIE5PVCBFWElTVFMgc3RvcmUgV0lUSCBSRVBMSUNBVElPTiA9IHsgJ2NsYXNzJyA6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogJzEnIH07CisKKyMgQ3JlYXRlIGEgdGFibGUKK0NSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIHN0b3JlLnNob3BwaW5nX2NhcnQgICgKKwl1c2VyaWQgdGV4dCBQUklNQVJZIEtFWSwKKwlpdGVtX2NvdW50IGludCwKKwlsYXN0X3VwZGF0ZV90aW1lc3RhbXAgdGltZXN0YW1wCispOworCisjIEluc2VydCBzb21lIGRhdGEKK0lOU0VSVCBJTlRPIHN0b3JlLnNob3BwaW5nX2NhcnQKKyh1c2VyaWQsIGl0ZW1fY291bnQsIGxhc3RfdXBkYXRlX3RpbWVzdGFtcCkKK1ZBTFVFUyAoJzk4NzYnLCAyLCB0b190aW1lc3RhbXAodG9fZGF0ZShub3cpKSkpOworSU5TRVJUIElOVE8gc3RvcmUuc2hvcHBpbmdfY2FydAorKHVzZXJpZCwgaXRlbV9jb3VudCwgbGFzdF91cGRhdGVfdGltZXN0YW1wKQorVkFMVUVTICgxMjM0LCA1LCB0b190aW1lc3RhbXAodG9EYXRlKG5vdykpKSk7CistLS0tCisKK1lvdSBzaG91bGQgbm93IGhhdmUgYSBfY3Fsc2hyY18gZmlsZSBhbmQgXzxjdXJyZW50ZGlyPi9zY3JpcHRzL2RhdGEuY3FsXyBmaWxlLgorCisqU1RFUCA0OiBSVU4gQ1FMU0ggVE8gSU5URVJBQ1QqCisKK0Nhc3NhbmRyYSBpcyBhIGRpc3RyaWJ1dGVkIGRhdGFiYXNlIHRoYXQgY2FuIHJlYWQgYW5kIHdyaXRlIGRhdGEgYWNyb3NzIG11bHRpcGxlCitub2RlcyB3aXRoICBwZWVyLXRvLXBlZXIgcmVwbGljYXRpb24uIFRoZSBDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UgKENRTCkgaXMKK3NpbWlsYXIgdG8gU1FMIGJ1dCBzdWl0ZWQgZm9yIHRoZSBKT0lObGVzcyBzdHJ1Y3R1cmUgb2YgQ2Fzc2FuZHJhLiBUaGUgQ1FMCitzaGVsbCwgb3IgYGNxbHNoYCwgaXMgb25lIHRvb2wgdG8gdXNlIGluIGludGVyYWN0aW5nIHdpdGggdGhlIGRhdGFiYXNlLgorCitbc291cmNlLCBwbGFpbnRleHRdCistLS0tCitkb2NrZXIgcnVuIC0tcm0gLWl0IC12IC88Y3VycmVudGRpcj4vc2NyaXB0czovc2NyaXB0cyAgXAorLXYgLzxjdXJyZW50ZGlyL2NxbHNocmM6Ly5jYXNzYW5kcmEvY3Fsc2hyYyAgXAorLS1lbnYgQ1FMU0hfSE9TVD1ob3N0LmRvY2tlci5pbnRlcm5hbCAtLWVudiBDUUxTSF9QT1JUPTkwNDIgIG51dm8vZG9ja2VyLWNxbHNoCistLS0tCisKK0ZvciB0aGlzIHF1aWNrc3RhcnQsIHRoaXMgY3Fsc2ggZG9ja2VyIGltYWdlIGFsc28gbG9hZHMgc29tZSBkYXRhIGF1dG9tYXRpY2FsbHksCitzbyB5b3UgY2FuIHN0YXJ0IHJ1bm5pbmcgcXVlcmllcy4KKworKlNURVAgNTogUkVBRCBTT01FIERBVEEqCisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK1NFTEVDVCAqIEZST00gc3RvcmUuc2hvcHBpbmdfY2FydDsKKy0tLS0KKworKlNURVAgNjogV1JJVEUgU09NRSBNT1JFIERBVEEqCisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK0lOU0VSVCAodXNlcmlkLCBpdGVtX2NvdW50KSBWQUxVRVMgKDQ1NjcsIDIwKSBJTlRPIHN0b3JlLnNob3BwaW5nX2NhcnQ7CistLS0tCisKKypTVEVQIDc6IFRFUk1JTkFURSBDQVNTQU5EUkEqCisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK2RvY2tlciBybSBjYXNzYW5kcmEKKy0tLS0KKworKkNPTkdSQVRVTEFUSU9OUyEqCisKK0hleSwgdGhhdCB3YXNuJ3Qgc28gaGFyZCwgd2FzIGl0PworCitUbyBsZWFybiBtb3JlLCB3ZSBzdWdnZXN0IHRoZSBmb2xsb3dpbmcgbmV4dCBzdGVwczoKKworKiBSZWFkIHRocm91Z2ggdGhlICpuZWVkIGxpbmsqW092ZXJ2aWV3XSB0byBsZWFybiBtYWluIGNvbmNlcHRzIGFuZCBob3cgQ2Fzc2FuZHJhIHdvcmtzIGF0IGEKK2hpZ2ggbGV2ZWwuCisqIFRvIHVuZGVyc3RhbmQgQ2Fzc2FuZHJhIGluIG1vcmUgZGV0YWlsLCBoZWFkIG92ZXIgdG8gdGhlCitodHRwczovL2Nhc3NhbmRyYS5hcGFjaGUub3JnL2RvYy9sYXRlc3QvW0RvY3NdLgorKiBCcm93c2UgdGhyb3VnaCB0aGUgaHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9jYXNlLXN0dWRpZXMvW0Nhc2UgU3R1ZGllc10gdG8KK2xlYXJuIGhvdyBvdGhlciB1c2VycyBpbiBvdXIgd29ybGR3aWRlIGNvbW11bml0eSBhcmUgZ2V0dGluZyB2YWx1ZSBvdXQgb2YKK0Nhc3NhbmRyYS4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvZHJpdmVycy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTVhNTUuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi09IENsaWVudCBkcml2ZXJzCi0KLUhlcmUgYXJlIGtub3duIENhc3NhbmRyYSBjbGllbnQgZHJpdmVycyBvcmdhbml6ZWQgYnkgbGFuZ3VhZ2UuIEJlZm9yZQotY2hvb3NpbmcgYSBkcml2ZXIsIHlvdSBzaG91bGQgdmVyaWZ5IHRoZSBDYXNzYW5kcmEgdmVyc2lvbiBhbmQKLWZ1bmN0aW9uYWxpdHkgc3VwcG9ydGVkIGJ5IGEgc3BlY2lmaWMgZHJpdmVyLgotCi09PSBKYXZhCi0KLSogaHR0cDovL2FjaGlsbGVzLmFyY2hpbm5vdi5pbmZvL1tBY2hpbGxlc10KLSogaHR0cHM6Ly9naXRodWIuY29tL05ldGZsaXgvYXN0eWFuYXgvd2lraS9HZXR0aW5nLVN0YXJ0ZWRbQXN0eWFuYXhdCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9ub29ycS9jYXNzZXJbQ2Fzc2VyXQotKiBodHRwczovL2dpdGh1Yi5jb20vZGF0YXN0YXgvamF2YS1kcml2ZXJbRGF0YXN0YXggSmF2YSBkcml2ZXJdCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9pbXBldHVzLW9wZW5zb3VyY2UvS3VuZGVyYVtLdW5kZXJhXQotKiBodHRwczovL2dpdGh1Yi5jb20vZGVhbmhpbGxlci9wbGF5b3JtW1BsYXlPUk1dCi0KLT09IFB5dGhvbgotCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9weXRob24tZHJpdmVyW0RhdGFzdGF4IFB5dGhvbiBkcml2ZXJdCi0KLT09IFJ1YnkKLQotKiBodHRwczovL2dpdGh1Yi5jb20vZGF0YXN0YXgvcnVieS1kcml2ZXJbRGF0YXN0YXggUnVieSBkcml2ZXJdCi0KLT09IEMjIC8gLk5FVAotCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9wY2hhbGFtZXQvY2Fzc2FuZHJhLXNoYXJwW0Nhc3NhbmRyYSBTaGFycF0KLSogaHR0cHM6Ly9naXRodWIuY29tL2RhdGFzdGF4L2NzaGFycC1kcml2ZXJbRGF0YXN0YXggQyMgZHJpdmVyXQotKiBodHRwczovL2dpdGh1Yi5jb20vbWFuYWdlZGZ1c2lvbi9mbHVlbnRjYXNzYW5kcmFbRmx1ZW50IENhc3NhbmRyYV0KLQotPT0gTm9kZWpzCi0KLSogaHR0cHM6Ly9naXRodWIuY29tL2RhdGFzdGF4L25vZGVqcy1kcml2ZXJbRGF0YXN0YXggTm9kZWpzIGRyaXZlcl0KLQotPT0gUEhQCi0KLSogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hL2FwYWNoZS1leHRyYXMub3JnL3AvY2Fzc2FuZHJhLXBkb1tDUUwgfCBQSFBdCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9waHAtZHJpdmVyL1tEYXRhc3RheCBQSFAgZHJpdmVyXQotKiBodHRwczovL2dpdGh1Yi5jb20vYXBhcmtob21lbmtvL3BocC1jYXNzYW5kcmFbUEhQLUNhc3NhbmRyYV0KLSogaHR0cHM6Ly9naXRodWIuY29tL2R1b3NodW8vcGhwLWNhc3NhbmRyYVtQSFAgTGlicmFyeSBmb3IgQ2Fzc2FuZHJhXQotCi09PSBDKysKLQotKiBodHRwczovL2dpdGh1Yi5jb20vZGF0YXN0YXgvY3BwLWRyaXZlcltEYXRhc3RheCBDKysgZHJpdmVyXQotKiBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2xpYnF0Y2Fzc2FuZHJhW2xpYlFUQ2Fzc2FuZHJhXQotCi09PSBTY2FsYQotCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhc3RheC9zcGFyay1jYXNzYW5kcmEtY29ubmVjdG9yW0RhdGFzdGF4IFNwYXJrCi1jb25uZWN0b3JdCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9uZXd6bHkvcGhhbnRvbVtQaGFudG9tXQotKiBodHRwczovL2dpdGh1Yi5jb20vZ2V0cXVpbGwvcXVpbGxbUXVpbGxdCi0KLT09IENsb2p1cmUKLQotKiBodHRwczovL2dpdGh1Yi5jb20vbXBlbmV0L2FsaWFbQWxpYV0KLSogaHR0cHM6Ly9naXRodWIuY29tL2Nsb2p1cmV3ZXJrei9jYXNzYWZvcnRlW0Nhc3NhZm9ydGVdCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9tcGVuZXQvaGF5dFtIYXl0XQotCi09PSBFcmxhbmcKLQotKiBodHRwczovL2dpdGh1Yi5jb20vbWF0ZWhhdC9jcWVybFtDUWVybF0KLSogaHR0cHM6Ly9naXRodWIuY29tL3NpbHZpdWNwcC9lcmxjYXNzW0VybGNhc3NdCi0KLT09IEdvCi0KLSogaHR0cHM6Ly9naXRodWIuY29tL3JlbG9wcy9jcWxjW0NRTGNdCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9oYWlsb2NhYi9nb2Nhc3NhW0dvY2Fzc2FdCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9nb2NxbC9nb2NxbFtHb0NRTF0KLQotPT0gSGFza2VsbAotCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9vemF0YW1hbi9jYXNzeVtDYXNzeV0KLQotPT0gUnVzdAotCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS9uZWljaC9ydXN0LWNxbFtSdXN0IENRTF0KLQotPT0gUGVybAotCi0qIGh0dHBzOi8vZ2l0aHViLmNvbS90dmR3L3BlcmwtZGJkLWNhc3NhbmRyYVtDYXNzYW5kcmE6OkNsaWVudCBhbmQKLURCRDo6Q2Fzc2FuZHJhXQotCi09PSBFbGl4aXIKLQotKiBodHRwczovL2dpdGh1Yi5jb20vbGV4aGlkZS94YW5kcmFbWGFuZHJhXQotKiBodHRwczovL2dpdGh1Yi5jb20vbWF0ZWhhdC9jcWV4W0NRRXhdCi0KLT09IERhcnQKLQotKiBodHRwczovL2dpdGh1Yi5jb20vYWNoaWxsZWFzYS9kYXJ0X2Nhc3NhbmRyYV9jcWxbZGFydF9jYXNzYW5kcmFfY3FsXQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9pbmRleC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9pbmRleC5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjQzYzE3Li4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvaW5kZXguYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLT0gR2V0dGluZyBTdGFydGVkCi0KLVRoaXMgc2VjdGlvbiBjb3ZlcnMgaG93IHRvIGdldCBzdGFydGVkIHVzaW5nIEFwYWNoZSBDYXNzYW5kcmEgYW5kIHNob3VsZAotYmUgdGhlIGZpcnN0IHRoaW5nIHRvIHJlYWQgaWYgeW91IGFyZSBuZXcgdG8gQ2Fzc2FuZHJhLgotCi0qIHhyZWY6Z2V0dGluZ19zdGFydGVkL2luc3RhbGxpbmcuYWRvY1tJbnN0YWxsaW5nIENhc3NhbmRyYV06IEluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgcGx1cyBpbmZvcm1hdGlvbiBvbiBjaG9vc2luZyBhIG1ldGhvZC4gIAotKiogWyB4cmVmOmdldHRpbmdfc3RhcnRlZC9pbnN0YWxsaW5nLmFkb2MjaW5zdGFsbGluZy10aGUtZG9ja2VyLWltYWdlW0RvY2tlcl0gXQotWyB4cmVmOmdldHRpbmdfc3RhcnRlZC9pbnN0YWxsaW5nLmFkb2MjaW5zdGFsbGluZy10aGUtYmluYXJ5LXRhcmJhbGxbdGFyYmFsbF0gXQotWyB4cmVmOmdldHRpbmdfc3RhcnRlZC9pbnN0YWxsaW5nLmFkb2MjaW5zdGFsbGluZy10aGUtZGViaWFuLXBhY2thZ2VzW0RlYmlhbl0gXQotWyB4cmVmOmdldHRpbmdfc3RhcnRlZC9pbnN0YWxsaW5nLmFkb2MjaW5zdGFsbGluZy10aGUtcnBtLXBhY2thZ2VzW1JQTV0gXQotKiB4cmVmOmdldHRpbmdfc3RhcnRlZC9jb25maWd1cmluZy5hZG9jW0NvbmZpZ3VyaW5nIENhc3NhbmRyYV0KLSogeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvcXVlcnlpbmcuYWRvY1tJbnNlcnRpbmcgYW5kIHF1ZXJ5aW5nIGRhdGFdCi0qIHhyZWY6Z2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvY1tDbGllbnQgZHJpdmVyc106IERyaXZlcnMgZm9yIHZhcmlvdXMgbGFuZ3VhZ2VzLgotKiogWyB4cmVmOmdldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2MjamF2YVtKYXZhXSBdCi0gWyB4cmVmOmdldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2MjcHl0aG9uW1B5dGhvbl0gXQotIFsgeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvZHJpdmVycy5hZG9jI3J1YnlbUnVieV0gXQotIFsgeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvZHJpdmVycy5hZG9jI2MtbmV0W0MjIC8gLk5FVF0gXQotIFsgeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvZHJpdmVycy5hZG9jI25vZGVqc1tOb2RlLmpzXSBdCi0gWyB4cmVmOmdldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2MjcGhwW1BIUF0gXQotIFsgeHJlZjpnZXR0aW5nX3N0YXJ0ZWQvZHJpdmVycy5hZG9jI2NbQysrXSBdCi0gWyB4cmVmOmdldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2Mjc2NhbGFbU2NhbGFdIF0KLSBbIHhyZWY6Z2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvYyNjbG9qdXJlW0Nsb2p1cmVdIF0KLSBbIHhyZWY6Z2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvYyNlcmxhbmdbRXJsYW5nXSBdCi0gWyB4cmVmOmdldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2MjZ29bR29dIF0KLSBbIHhyZWY6Z2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvYyNoYXNrZWxsW0hhc2tlbGxdIF0KLSBbIHhyZWY6Z2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvYyNydXN0W1J1c3RdIF0KLSBbIHhyZWY6Z2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvYyNwZXJsW1BlcmxdIF0KLSBbIHhyZWY6Z2V0dGluZ19zdGFydGVkL2RyaXZlcnMuYWRvYyNlbGl4aXJbRWxpeGlyXSBdCi0gWyB4cmVmOmdldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2MjZGFydFtEYXJ0XSBdCi0qIHhyZWY6Z2V0dGluZ19zdGFydGVkL3Byb2R1Y3Rpb24uYWRvY1tQcm9kdWN0aW9uIHJlY29tbWVuZGF0aW9uc10KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvaW5zdGFsbGluZy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9pbnN0YWxsaW5nLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZGRjZDAuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9pbnN0YWxsaW5nLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotPSBJbnN0YWxsaW5nIENhc3NhbmRyYQotOnRhYnM6Ci0KLVRoZXNlIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGZvciBkZXBsb3lpbmcgdGhlIHN1cHBvcnRlZCByZWxlYXNlcyBvZgotQXBhY2hlIENhc3NhbmRyYSBvbiBMaW51eCBzZXJ2ZXJzLgotCi1DYXNzYW5kcmEgcnVucyBvbiBhIHdpZGUgYXJyYXkgb2YgTGludXggZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgKGJ1dCBub3QKLWxpbWl0ZWQgdG8pOgotCi0qIFVidW50dSwgbW9zdCBub3RhYmx5IExUUyByZWxlYXNlcyAxNi4wNCB0byAxOC4wNAotKiBDZW50T1MgJiBSZWRIYXQgRW50ZXJwcmlzZSBMaW51eCAoUkhFTCkgaW5jbHVkaW5nIDYuNiB0byA3LjcKLSogQW1hem9uIExpbnV4IEFNSXMgaW5jbHVkaW5nIDIwMTYuMDkgdGhyb3VnaCB0byBMaW51eCAyCi0qIERlYmlhbiB2ZXJzaW9ucyA4ICYgOQotKiBTVVNFIEVudGVycHJpc2UgTGludXggMTIKLQotVGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0IG9mIG9wZXJhdGluZyBzeXN0ZW0gcGxhdGZvcm1zLCBub3IgaXMgaXQKLXByZXNjcmlwdGl2ZS4gSG93ZXZlciwgdXNlcnMgd2lsbCBiZSB3ZWxsLWFkdmlzZWQgdG8gY29uZHVjdCBleGhhdXN0aXZlCi10ZXN0cyBvZiB0aGVpciBvd24gcGFydGljdWxhcmx5IGZvciBsZXNzLXBvcHVsYXIgZGlzdHJpYnV0aW9ucyBvZiBMaW51eC4KLURlcGxveWluZyBvbiBvbGRlciB2ZXJzaW9ucyBpcyBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdSBoYXZlIHByZXZpb3VzCi1leHBlcmllbmNlIHdpdGggdGhlIG9sZGVyIGRpc3RyaWJ1dGlvbiBpbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuCi0KLT09IFByZXJlcXVpc2l0ZXMKLQotKiBJbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBKYXZhIDggb3IgSmF2YSAxMSwgZWl0aGVyIHRoZQotaHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvamF2YXNlL2Rvd25sb2Fkcy9pbmRleC5odG1sW09yYWNsZQotSmF2YSBTdGFuZGFyZCBFZGl0aW9uIDhdIC8gaHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvamF2YXNlL2Rvd25sb2Fkcy9pbmRleC5odG1sW09yYWNsZSBKYXZhIFN0YW5kYXJkIEVkaXRpb24gMTEgKExvbmcgVGVybSBTdXBwb3J0KV0KLW9yIGh0dHA6Ly9vcGVuamRrLmphdmEubmV0L1tPcGVuSkRLIDhdIC8gaHR0cDovL29wZW5qZGsuamF2YS5uZXQvW09wZW5KREsgMTFdLiBUbwotdmVyaWZ5IHRoYXQgeW91IGhhdmUgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiBqYXZhIGluc3RhbGxlZCwgdHlwZQotYGphdmEgLXZlcnNpb25gLgotKiAqTk9URSo6IEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBKYXZhIDExIHdhcyBhZGRlZCBpbiBDYXNzYW5kcmEgezQwX3ZlcnNpb259Ci0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtOTYwOFtDQVNTQU5EUkEtOTYwOF0pLgotRnVsbCBzdXBwb3J0IGlzIGVmZmVjdGl2ZSBDYXNzYW5kcmEgNC4wLjIgdmVyc2lvbiAoaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTY4OTRbQ0FTU0FORFJBLTE2ODk0XSkKLUZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKLWh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhL2Jsb2IvdHJ1bmsvTkVXUy50eHRbTkVXUy50eHRdLgotKiBGb3IgdXNpbmcgY3Fsc2gsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZgotUHl0aG9uIDMuNisgb3IgUHl0aG9uIDIuNyAoc3VwcG9ydCBkZXByZWNhdGVkKS4gVG8gdmVyaWZ5Ci10aGF0IHlvdSBoYXZlIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgUHl0aG9uIGluc3RhbGxlZCwgdHlwZQotYHB5dGhvbiAtLXZlcnNpb25gLgotCi09PSBDaG9vc2luZyBhbiBpbnN0YWxsYXRpb24gbWV0aG9kCi0KLVRoZXJlIGFyZSB0aHJlZSBtZXRob2RzIG9mIGluc3RhbGxpbmcgQ2Fzc2FuZHJhIHRoYXQgYXJlIGNvbW1vbjoKLQotKiBEb2NrZXIgaW1hZ2UKLSogVGFyYmFsbCBiaW5hcnkgZmlsZQotKiBQYWNrYWdlIGluc3RhbGxhdGlvbiAoUlBNLCBZVU0pCi0KLUlmIHlvdSBhcmUgYSBjdXJyZW50IERvY2tlciB1c2VyLCBpbnN0YWxsaW5nIGEgRG9ja2VyIGltYWdlIGlzIHNpbXBsZS4gCi1Zb3UnbGwgbmVlZCB0byBpbnN0YWxsIERvY2tlciBEZXNrdG9wIGZvciBNYWMsIERvY2tlciBEZXNrdG9wIGZvciBXaW5kb3dzLAotb3IgaGF2ZSBgZG9ja2VyYCBpbnN0YWxsZWQgb24gTGludXguIAotUHVsbCB0aGUgYXBwcm9wcmlhdGUgaW1hZ2UgYW5kIHRoZW4gc3RhcnQgQ2Fzc2FuZHJhIHdpdGggYSBydW4gY29tbWFuZC4gCi0KLUZvciBtb3N0IHVzZXJzLCBpbnN0YWxsaW5nIHRoZSBiaW5hcnkgdGFyYmFsbCBpcyBhbHNvIGEgc2ltcGxlIGNob2ljZS4KLVRoZSB0YXJiYWxsIHVucGFja3MgYWxsIGl0cyBjb250ZW50cyBpbnRvIGEgc2luZ2xlIGxvY2F0aW9uIHdpdGgKLWJpbmFyaWVzIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzIGxvY2F0ZWQgaW4gdGhlaXIgb3duIHN1YmRpcmVjdG9yaWVzLgotVGhlIG1vc3Qgb2J2aW91cyBhdHRyaWJ1dGUgb2YgdGhlIHRhcmJhbGwgaW5zdGFsbGF0aW9uIGlzIGl0IGRvZXMgbm90Ci1yZXF1aXJlIGByb290YCBwZXJtaXNzaW9ucyBhbmQgY2FuIGJlIGluc3RhbGxlZCBvbiBhbnkgTGludXgKLWRpc3RyaWJ1dGlvbi4KLQotUGFja2FnZWQgaW5zdGFsbGF0aW9ucyByZXF1aXJlIGByb290YCBwZXJtaXNzaW9ucywgYW5kIGFyZSBtb3N0IGFwcHJvcHJpYXRlIGZvcgotcHJvZHVjdGlvbiBpbnN0YWxscy4gCi1JbnN0YWxsIHRoZSBSUE0gYnVpbGQgb24gQ2VudE9TIGFuZCBSSEVMLWJhc2VkIGRpc3RyaWJ1dGlvbnMgaWYgeW91IHdhbnQgdG8gCi1pbnN0YWxsIENhc3NhbmRyYSB1c2luZyBZVU0uIAotSW5zdGFsbCB0aGUgRGViaWFuIGJ1aWxkIG9uIFVidW50dSBhbmQgb3RoZXIgRGViaWFuLWJhc2VkCi1kaXN0cmlidXRpb25zIGlmIHlvdSB3YW50IHRvIGluc3RhbGwgQ2Fzc2FuZHJhIHVzaW5nIEFQVC4gCi1Ob3RlIHRoYXQgYm90aCB0aGUgWVVNIGFuZCBBUFQgbWV0aG9kcyByZXF1aXJlZCBgcm9vdGAgcGVybWlzc2lvbnMgYW5kIAotd2lsbCBpbnN0YWxsIHRoZSBiaW5hcmllcyBhbmQgY29uZmlndXJhdGlvbiBmaWxlcyBhcyB0aGUgYGNhc3NhbmRyYWAgT1MgdXNlci4KLQotPT0gSW5zdGFsbGluZyB0aGUgZG9ja2VyIGltYWdlCi0KLVthcmFiaWMsIHN0YXJ0PTFdCi0uIFB1bGwgdGhlIGRvY2tlciBpbWFnZS4gRm9yIHRoZSBsYXRlc3QgaW1hZ2UsIHVzZToKLQotW3NvdXJjZSwgc2hlbGxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvZG9ja2VyX3B1bGwuc2hbXQotLS0tLQotCi1UaGlzIGBkb2NrZXIgcHVsbGAgY29tbWFuZCB3aWxsIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlICdEb2NrZXIgT2ZmaWNpYWwnCi1BcGFjaGUgQ2Fzc2FuZHJhIGltYWdlIGF2YWlsYWJsZSBmcm9tIHRoZSBodHRwczovL2h1Yi5kb2NrZXIuY29tL18vY2Fzc2FuZHJhW0RvY2tlcmh1Yl0uCi0KLVthcmFiaWMsIHN0YXJ0PTJdCi0uIFN0YXJ0IENhc3NhbmRyYSB3aXRoIGEgYGRvY2tlciBydW5gIGNvbW1hbmQ6Ci0KLVtzb3VyY2UsIHNoZWxsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2RvY2tlcl9ydW4uc2hbXQotLS0tLQotCi1UaGUgYC0tbmFtZWAgb3B0aW9uIHdpbGwgYmUgdGhlIG5hbWUgb2YgdGhlIENhc3NhbmRyYSBjbHVzdGVyIGNyZWF0ZWQuCi0KLVthcmFiaWMsIHN0YXJ0PTNdCi0uIFN0YXJ0IHRoZSBDUUwgc2hlbGwsIGBjcWxzaGAgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgQ2Fzc2FuZHJhIG5vZGUgY3JlYXRlZDoKLQotW3NvdXJjZSwgc2hlbGxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvZG9ja2VyX2NxbHNoLnNoW10KLS0tLS0KLT09IEluc3RhbGxpbmcgdGhlIGJpbmFyeSB0YXJiYWxsCi0KLWluY2x1ZGU6OnBhcnRpYWwkamF2YV92ZXJzaW9uLmFkb2NbXQotCi1bYXJhYmljLCBzdGFydD0yXQotLiBEb3dubG9hZCB0aGUgYmluYXJ5IHRhcmJhbGwgZnJvbSBvbmUgb2YgdGhlIG1pcnJvcnMgb24gdGhlCi17Y2Fzc191cmx9ZG93bmxvYWQvW0FwYWNoZSBDYXNzYW5kcmEgRG93bmxvYWRdIHNpdGUuCi1Gb3IgZXhhbXBsZSwgdG8gZG93bmxvYWQgQ2Fzc2FuZHJhIHs0MF92ZXJzaW9ufToKLQotW3NvdXJjZSxzaGVsbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9jdXJsX2luc3RhbGwuc2hbXQotLS0tLQotCi1OT1RFOiBUaGUgbWlycm9ycyBvbmx5IGhvc3QgdGhlIGxhdGVzdCB2ZXJzaW9ucyBvZiBlYWNoIG1ham9yIHN1cHBvcnRlZAotcmVsZWFzZS4gVG8gZG93bmxvYWQgYW4gZWFybGllciB2ZXJzaW9uIG9mIENhc3NhbmRyYSwgdmlzaXQgdGhlCi1odHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvY2Fzc2FuZHJhL1tBcGFjaGUgQXJjaGl2ZXNdLgotCi1bYXJhYmljLCBzdGFydD0zXQotLiBPUFRJT05BTDogVmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGRvd25sb2FkZWQgdGFyYmFsbCB1c2luZyBvbmUgb2YKLXRoZSBtZXRob2RzIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kjdmVyaWZ5W2hlcmVdLiBGb3IKLWV4YW1wbGUsIHRvIHZlcmlmeSB0aGUgaGFzaCBvZiB0aGUgZG93bmxvYWRlZCBmaWxlIHVzaW5nIEdQRzoKLQotW3t0YWJzfV0KLT09PT0KLUNvbW1hbmQ6OgotKwotLS0KLVtzb3VyY2Usc2hlbGxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvdmVyaWZ5X2dwZy5zaFtdCi0tLS0tCi0tLQotCi1SZXN1bHQ6OgotKwotLS0KLVtzb3VyY2UscGxhaW50ZXh0XQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3ZlcmlmeV9ncGcucmVzdWx0W10KLS0tLS0KLS0tCi09PT09Ci0KLUNvbXBhcmUgdGhlIHNpZ25hdHVyZSB3aXRoIHRoZSBTSEEyNTYgZmlsZSBmcm9tIHRoZSBEb3dubG9hZHMgc2l0ZToKLQotW3t0YWJzfV0KLT09PT0KLUNvbW1hbmQ6OgotKwotLS0KLVtzb3VyY2Usc2hlbGxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvY3VybF92ZXJpZnlfc2hhLnNoW10KLS0tLS0KLS0tCi0KLVJlc3VsdDo6Ci0rCi0tLQotW3NvdXJjZSxwbGFpbnRleHRdCi0tLS0tCi0yODc1N2RkZTU4OWY3MDQxMGY5YTZhOTVjMzllZTdlNmNkZTYzNDQwZTJiMDZiOTFhZTZiMjAwNjE0ZmEzNjRkCi0tLS0tCi0tLQotPT09PQotCi1bYXJhYmljLCBzdGFydD00XQotLiBVbnBhY2sgdGhlIHRhcmJhbGw6Ci0KLVtzb3VyY2Usc2hlbGxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvdGFyYmFsbC5zaFtdCi0tLS0tCi0KLVRoZSBmaWxlcyB3aWxsIGJlIGV4dHJhY3RlZCB0byB0aGUgYGFwYWNoZS1jYXNzYW5kcmEtNC4wLjAvYCBkaXJlY3RvcnkuCi1UaGlzIGlzIHRoZSB0YXJiYWxsIGluc3RhbGxhdGlvbiBsb2NhdGlvbi4KLQotW2FyYWJpYywgc3RhcnQ9NV0KLS4gTG9jYXRlZCBpbiB0aGUgdGFyYmFsbCBpbnN0YWxsYXRpb24gbG9jYXRpb24gYXJlIHRoZSBkaXJlY3RvcmllcyBmb3IKLXRoZSBzY3JpcHRzLCBiaW5hcmllcywgdXRpbGl0aWVzLCBjb25maWd1cmF0aW9uLCBkYXRhIGFuZCBsb2cgZmlsZXM6Ci0KLVtzb3VyY2UscGxhaW50ZXh0XQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRURVhUL3RhcmJhbGxfaW5zdGFsbF9kaXJzLnR4dFtdCi0tLS0tCi08MT4gbG9jYXRpb24gb2YgdGhlIGNvbW1hbmRzIHRvIHJ1biBjYXNzYW5kcmEsIGNxbHNoLCBub2RldG9vbCwgYW5kIFNTVGFibGUgdG9vbHMKLTwyPiBsb2NhdGlvbiBvZiBjYXNzYW5kcmEueWFtbCBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBmaWxlcwotPDM+IGxvY2F0aW9uIG9mIHRoZSBjb21taXQgbG9ncywgaGludHMsIGFuZCBTU1RhYmxlcwotPDQ+IGxvY2F0aW9uIG9mIHN5c3RlbSBhbmQgZGVidWcgbG9ncwotPDU+bG9jYXRpb24gb2YgY2Fzc2FuZHJhLXN0cmVzcyB0b29sCi0KLUZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29uZmlndXJlIHlvdXIgaW5zdGFsbGF0aW9uLCBzZWUKLXtjYXNzX3VybH1kb2MvbGF0ZXN0L2dldHRpbmdfc3RhcnRlZC9jb25maWd1cmluZy5odG1sW0NvbmZpZ3VyaW5nCi1DYXNzYW5kcmFdLgotCi1bYXJhYmljLCBzdGFydD02XQotLiBTdGFydCBDYXNzYW5kcmE6Ci0KLVtzb3VyY2Usc2hlbGxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvc3RhcnRfdGFyYmFsbC5zaFtdCi0tLS0tCi0KLU5PVEU6IFRoaXMgd2lsbCBydW4gQ2Fzc2FuZHJhIGFzIHRoZSBhdXRoZW50aWNhdGVkIExpbnV4IHVzZXIuCi0KLWluY2x1ZGU6OnBhcnRpYWwkdGFpbF9zeXNsb2cuYWRvY1tdCi1Zb3UgY2FuIG1vbml0b3IgdGhlIHByb2dyZXNzIG9mIHRoZSBzdGFydHVwIHdpdGg6Ci0KLVt7dGFic31dCi09PT09Ci1Db21tYW5kOjoKLSsKLS0tCi1bc291cmNlLHNoZWxsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3RhaWxfc3lzbG9nLnNoW10KLS0tLS0KLS0tCi0KLVJlc3VsdDo6Ci0rCi0tLQotQ2Fzc2FuZHJhIGlzIHJlYWR5IHdoZW4geW91IHNlZSBhbiBlbnRyeSBsaWtlIHRoaXMgaW4gdGhlIGBzeXN0ZW0ubG9nYDoKLQotW3NvdXJjZSxwbGFpbnRleHRdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvdGFpbF9zeXNsb2cucmVzdWx0W10KLS0tLS0KLS0tCi09PT09Ci0KLWluY2x1ZGU6OnBhcnRpYWwkbm9kZXRvb2xfYW5kX2NxbHNoLmFkb2NbXQotCi09PSBJbnN0YWxsaW5nIHRoZSBEZWJpYW4gcGFja2FnZXMKLQotaW5jbHVkZTo6cGFydGlhbCRqYXZhX3ZlcnNpb24uYWRvY1tdCi0KLVthcmFiaWMsIHN0YXJ0PTJdCi0uIEFkZCB0aGUgQXBhY2hlIHJlcG9zaXRvcnkgb2YgQ2Fzc2FuZHJhIHRvIHRoZSBmaWxlCi1gY2Fzc2FuZHJhLnNvdXJjZXMubGlzdGAuIAotaW5jbHVkZTo6cGFydGlhbCRwYWNrYWdlX3ZlcnNpb25zLmFkb2NbXQotCi1bc291cmNlLHNoZWxsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2dldF9kZWJfcGFja2FnZS5zaFtdCi0tLS0tCi0KLVthcmFiaWMsIHN0YXJ0PTNdCi0uIEFkZCB0aGUgQXBhY2hlIENhc3NhbmRyYSByZXBvc2l0b3J5IGtleXMgdG8gdGhlIGxpc3Qgb2YgdHJ1c3RlZCBrZXlzCi1vbiB0aGUgc2VydmVyOgotCi1be3RhYnN9XQotPT09PQotQ29tbWFuZDo6Ci0rCi0tLQotW3NvdXJjZSxzaGVsbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9hZGRfcmVwb19rZXlzLnNoW10KLS0tLS0KLS0tCi0KLVJlc3VsdDo6Ci0rCi0tLQotW3NvdXJjZSxwbGFpbnRleHRdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvYWRkX3JlcG9fa2V5cy5yZXN1bHRbXQotLS0tLQotLS0KLT09PT0KLQotW2FyYWJpYywgc3RhcnQ9NF0KLS4gVXBkYXRlIHRoZSBwYWNrYWdlIGluZGV4IGZyb20gc291cmNlczoKLQotW3NvdXJjZSxzaGVsbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9hcHQtZ2V0X3VwZGF0ZS5zaFtdCi0tLS0tCi0KLVthcmFiaWMsIHN0YXJ0PTVdCi0uIEluc3RhbGwgQ2Fzc2FuZHJhIHdpdGggQVBUOgotCi1bc291cmNlLHNoZWxsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2FwdC1nZXRfY2Fzcy5zaFtdCi0tLS0tCi0KLU5PVEU6IEZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29uZmlndXJlIHlvdXIgaW5zdGFsbGF0aW9uLCBzZWUKLXtjYXNzX3VybH1kb2MvbGF0ZXN0L2dldHRpbmdfc3RhcnRlZC9jb25maWd1cmluZy5odG1sW0NvbmZpZ3VyaW5nCi1DYXNzYW5kcmFdLgotCi1pbmNsdWRlOjpwYXJ0aWFsJHRhaWxfc3lzbG9nLmFkb2NbXQotCi1pbmNsdWRlOjpwYXJ0aWFsJG5vZGV0b29sX2FuZF9jcWxzaF9ub2Jpbi5hZG9jW10KLQotPT0gSW5zdGFsbGluZyB0aGUgUlBNIHBhY2thZ2VzCi0KLWluY2x1ZGU6OnBhcnRpYWwkamF2YV92ZXJzaW9uLmFkb2NbXQotCi1bYXJhYmljLCBzdGFydD0yXQotLiBBZGQgdGhlIEFwYWNoZSByZXBvc2l0b3J5IG9mIENhc3NhbmRyYSB0byB0aGUgZmlsZQotYC9ldGMveXVtLnJlcG9zLmQvY2Fzc2FuZHJhLnJlcG9gIChhcyB0aGUgYHJvb3RgIHVzZXIpLgotaW5jbHVkZTo6cGFydGlhbCRwYWNrYWdlX3ZlcnNpb25zLmFkb2NbXQotIAotW3NvdXJjZSxwbGFpbnRleHRdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvYWRkX3l1bV9yZXBvLnJlc3VsdFtdCi0tLS0tCi0KLVthcmFiaWMsIHN0YXJ0PTNdCi0uIFVwZGF0ZSB0aGUgcGFja2FnZSBpbmRleCBmcm9tIHNvdXJjZXM6Ci0KLVtzb3VyY2Usc2hlbGxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gveXVtX3VwZGF0ZS5zaFtdCi0tLS0tCi0KLVthcmFiaWMsIHN0YXJ0PTRdCi0uIEluc3RhbGwgQ2Fzc2FuZHJhIHdpdGggWVVNOgotCi1bc291cmNlLHNoZWxsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3l1bV9jYXNzLnNoW10KLS0tLS0KLQotTk9URTogQSBuZXcgTGludXggdXNlciBgY2Fzc2FuZHJhYCB3aWxsIGdldCBjcmVhdGVkIGFzIHBhcnQgb2YgdGhlCi1pbnN0YWxsYXRpb24uIFRoZSBDYXNzYW5kcmEgc2VydmljZSB3aWxsIGFsc28gYmUgcnVuIGFzIHRoaXMgdXNlci4KLQotW2FyYWJpYywgc3RhcnQ9NV0KLS4gU3RhcnQgdGhlIENhc3NhbmRyYSBzZXJ2aWNlOgotCi1bc291cmNlLHNoZWxsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3l1bV9zdGFydC5zaFtdCi0tLS0tCi0KLWluY2x1ZGU6OnBhcnRpYWwkdGFpbF9zeXNsb2cuYWRvY1tdCi0KLWluY2x1ZGU6OnBhcnRpYWwkbm9kZXRvb2xfYW5kX2NxbHNoX25vYmluLmFkb2NbXQotCi09PSBGdXJ0aGVyIGluc3RhbGxhdGlvbiBpbmZvCi0KLUZvciBoZWxwIHdpdGggaW5zdGFsbGF0aW9uIGlzc3Vlcywgc2VlIHRoZQote2Nhc3NfdXJsfWRvYy9sYXRlc3QvdHJvdWJsZXNob290aW5nL2luZGV4Lmh0bWxbVHJvdWJsZXNob290aW5nXQotc2VjdGlvbi4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvamF2YTExLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL2phdmExMS5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjFhNTdmLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvamF2YTExLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotPSBTdXBwb3J0IGZvciBKYXZhIDExCi0KLUluIHRoZSBuZXcgSmF2YSByZWxlYXNlIGNhZGVuY2UgYSBuZXcgSmF2YSB2ZXJzaW9uIGlzIG1hZGUgYXZhaWxhYmxlCi1ldmVyeSBzaXggbW9udGhzLiBUaGUgbW9yZSBmcmVxdWVudCByZWxlYXNlIGN5Y2xlIGlzIGZhdm9yZWQgYXMgaXQKLWJyaW5ncyBuZXcgSmF2YSBmZWF0dXJlcyB0byB0aGUgZGV2ZWxvcGVycyBhcyBhbmQgd2hlbiB0aGV5IGFyZQotZGV2ZWxvcGVkIHdpdGhvdXQgdGhlIHdhaXQgdGhhdCB0aGUgZWFybGllciAzIHllYXIgcmVsZWFzZSBtb2RlbAotaW5jdXJyZWQuIE5vdCBldmVyeSBKYXZhIHZlcnNpb24gaXMgYSBMb25nIFRlcm0gU3VwcG9ydCAoTFRTKSB2ZXJzaW9uLgotQWZ0ZXIgSmF2YSA4IHRoZSBuZXh0IExUUyB2ZXJzaW9uIGlzIEphdmEgMTEuIEphdmEgOSwgMTAsIDEyIGFuZCAxMyBhcmUKLWFsbCBub24tTFRTIHZlcnNpb25zLgotCi1PbmUgb2YgdGhlIG9iamVjdGl2ZXMgb2YgdGhlIEFwYWNoZSBDYXNzYW5kcmEgNC4wIHZlcnNpb24gaXMgdG8gc3VwcG9ydAotdGhlIHJlY2VudCBMVFMgSmF2YSB2ZXJzaW9ucyA4IGFuZCAxMQotKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTk2MDhbQ0FTU0FORFJBLTk2MDhdKS4KLUphdmEgOCBhbmQgSmF2YSAxMSBtYXkgYmUgdXNlZCB0byBidWlsZCBhbmQgcnVuIEFwYWNoZSBDYXNzYW5kcmEgNC4wLiBFZmZlY3RpdmUgQ2Fzc2FuZHJhCi00LjAuMiB0aGVyZSBpcyBmdWxsIEphdmEgMTEgc3VwcG9ydCwgaXQgaXMgbm90IGV4cGVyaW1lbnRhbCBhbnltb3JlLgotCi09PSBTdXBwb3J0IE1hdHJpeAotCi1UaGUgc3VwcG9ydCBtYXRyaXggZm9yIHRoZSBKYXZhIHZlcnNpb25zIGZvciBjb21waWxpbmcgYW5kIHJ1bm5pbmcKLUFwYWNoZSBDYXNzYW5kcmEgNC4wIGlzIGRldGFpbGVkIGluIFRhYmxlIDEuIFRoZSBidWlsZCB2ZXJzaW9uIGlzIGFsb25nCi10aGUgdmVydGljYWwgYXhpcyBhbmQgdGhlIHJ1biB2ZXJzaW9uIGlzIGFsb25nIHRoZSBob3Jpem9udGFsIGF4aXMuCi0KLVRhYmxlIDEgOiBTdXBwb3J0IE1hdHJpeCBmb3IgSmF2YQotCi1bd2lkdGg9IjY4JSIsY29scz0iMzQlLDMwJSwzNiUiLF0KLXw9PT0KLXwgfEphdmEgOCAoUnVuKSB8SmF2YSAxMSAoUnVuKQotfEphdmEgOCAoQnVpbGQpIHxTdXBwb3J0ZWQgfFN1cHBvcnRlZAotfEphdmEgMTEoQnVpbGQpIHxOb3QgU3VwcG9ydGVkIHxTdXBwb3J0ZWQKLXw9PT0KLQotRXNzZW50aWFsbHkgQXBhY2hlIDQuMCBzb3VyY2UgY29kZSBidWlsdCB3aXRoIEphdmEgMTEgY2Fubm90IGJlIHJ1biB3aXRoCi1KYXZhIDguIE5leHQsIHdlIHNoYWxsIGRpc2N1c3MgdXNpbmcgZWFjaCBvZiBKYXZhIDggYW5kIDExIHRvIGJ1aWxkIGFuZAotcnVuIEFwYWNoZSBDYXNzYW5kcmEgNC4wLgotCi09PSBVc2luZyBKYXZhIDggdG8gQnVpbGQKLQotVG8gc3RhcnQgd2l0aCwgaW5zdGFsbCBKYXZhIDguIEFzIGFuIGV4YW1wbGUsIGZvciBpbnN0YWxsaW5nIEphdmEgOCBvbgotUmVkSGF0IExpbnV4IHRoZSBjb21tYW5kIGlzIGFzIGZvbGxvd3M6Ci0KLS4uLi4KLSQgc3VkbyB5dW0gaW5zdGFsbCBqYXZhLTEuOC4wLW9wZW5qZGstZGV2ZWwKLS4uLi4KLQotU2V0IGBKQVZBX0hPTUVgIGFuZCBgSlJFX0hPTUVgIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiB0aGUgc2hlbGwgYmFzaAotc2NyaXB0LiBGaXJzdCwgb3BlbiB0aGUgYmFzaCBzY3JpcHQ6Ci0KLS4uLi4KLSQgc3VkbyB2aSB+Ly5iYXNocmMKLS4uLi4KLQotU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaW5jbHVkaW5nIHRoZSBgUEFUSGAuCi0KLS4uLi4KLSQgZXhwb3J0IEpBVkFfSE9NRT0vdXNyL2xpYi9qdm0vamF2YS0xLjguMC1vcGVuamRrCi0kIGV4cG9ydCBKUkVfSE9NRT0vdXNyL2xpYi9qdm0vamF2YS0xLjguMC1vcGVuamRrL2pyZQotJCBleHBvcnQgUEFUSD0kUEFUSDokSkFWQV9IT01FL2JpbjokSlJFX0hPTUUvYmluCi0uLi4uCi0KLURvd25sb2FkIGFuZCBpbnN0YWxsIEFwYWNoZSBDYXNzYW5kcmEgNC4wIHNvdXJjZSBjb2RlIGZyb20gdGhlIEdpdCBhbG9uZwotd2l0aCB0aGUgZGVwZW5kZW5jaWVzLgotCi0uLi4uCi0kIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS5naXQKLS4uLi4KLQotSWYgQ2Fzc2FuZHJhIGlzIGFscmVhZHkgcnVubmluZyBzdG9wIENhc3NhbmRyYSB3aXRoIHRoZSBmb2xsb3dpbmcKLWNvbW1hbmQuCi0KLS4uLi4KLVtlYzItdXNlckBpcC0xNzItMzAtMy0xNDYgYmluXSQgLi9ub2RldG9vbCBzdG9wZGFlbW9uCi0uLi4uCi0KLUJ1aWxkIHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBgY2Fzc2FuZHJhYCBkaXJlY3RvcnksIHdoaWNoIGhhcyB0aGUKLWBidWlsZC54bWxgIGJ1aWxkIHNjcmlwdC4gVGhlIEFwYWNoZSBBbnQgdXNlcyB0aGUgSmF2YSB2ZXJzaW9uIHNldCBpbgotdGhlIGBKQVZBX0hPTUVgIGVudmlyb25tZW50IHZhcmlhYmxlLgotCi0uLi4uCi0kIGNkIH4vY2Fzc2FuZHJhCi0kIGFudAotLi4uLgotCi1BcGFjaGUgQ2Fzc2FuZHJhIDQuMCBnZXRzIGJ1aWx0IHdpdGggSmF2YSA4LiBTZXQgdGhlIGVudmlyb25tZW50Ci12YXJpYWJsZSBmb3IgYENBU1NBTkRSQV9IT01FYCBpbiB0aGUgYmFzaCBzY3JpcHQuIEFsc28gYWRkIHRoZQotYENBU1NBTkRSQV9IT01FL2JpbmAgdG8gdGhlIGBQQVRIYCB2YXJpYWJsZS4KLQotLi4uLgotJCBleHBvcnQgQ0FTU0FORFJBX0hPTUU9fi9jYXNzYW5kcmEKLSQgZXhwb3J0IFBBVEg9JFBBVEg6JEpBVkFfSE9NRS9iaW46JEpSRV9IT01FL2JpbjokQ0FTU0FORFJBX0hPTUUvYmluCi0uLi4uCi0KLVRvIHJ1biBBcGFjaGUgQ2Fzc2FuZHJhIDQuMCB3aXRoIGVpdGhlciBvZiBKYXZhIDggb3IgSmF2YSAxMSBydW4gdGhlCi1DYXNzYW5kcmEgYXBwbGljYXRpb24gaW4gdGhlIGBDQVNTQU5EUkFfSE9NRS9iaW5gIGRpcmVjdG9yeSwgd2hpY2ggaXMgaW4KLXRoZSBgUEFUSGAgZW52IHZhcmlhYmxlLgotCi0uLi4uCi0kIGNhc3NhbmRyYQotLi4uLgotCi1UaGUgSmF2YSB2ZXJzaW9uIHVzZWQgdG8gcnVuIENhc3NhbmRyYSBnZXRzIG91dHB1dCBhcyBDYXNzYW5kcmEgaXMKLWdldHRpbmcgc3RhcnRlZC4gQXMgYW4gZXhhbXBsZSBpZiBKYXZhIDExIGlzIHVzZWQsIHRoZSBydW4gb3V0cHV0IHNob3VsZAotaW5jbHVkZSBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgb3V0cHV0IHNuaXBwZXQ6Ci0KLS4uLi4KLUlORk8gIFttYWluXSAyMDE5LTA3LTMxIDIxOjE4OjE2LDg2MiBDYXNzYW5kcmFEYWVtb24uamF2YTo0ODAgLSBIb3N0bmFtZTogaXAtMTcyLTMwLTMtIAotMTQ2LmVjMi5pbnRlcm5hbDo3MDAwOjcwMDEKLUlORk8gIFttYWluXSAyMDE5LTA3LTMxIDIxOjE4OjE2LDg2MiBDYXNzYW5kcmFEYWVtb24uamF2YTo0ODcgLSBKVk0gdmVuZG9yL3ZlcnNpb246IE9wZW5KREsgCi02NC1CaXQgU2VydmVyIFZNLzExLjAuMwotSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MTYsODYzIENhc3NhbmRyYURhZW1vbi5qYXZhOjQ4OCAtIEhlYXAgc2l6ZTogCi0xMDA0LjAwME1pQi8xMDA0LjAwME1pQgotLi4uLgotCi1UaGUgZm9sbG93aW5nIG91dHB1dCBpbmRpY2F0ZXMgYSBzaW5nbGUgbm9kZSBDYXNzYW5kcmEgNC4wIGNsdXN0ZXIgaGFzCi1zdGFydGVkLgotCi0uLi4uCi1JTkZPICBbbWFpbl0gMjAxOS0wNy0zMSAyMToxODoxOSw2ODcgSW5ib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuamF2YToxMzAgLSBMaXN0ZW5pbmcgb24gCi1hZGRyZXNzOiAoMTI3LjAuMC4xOjcwMDApLCBuaWM6IGxvLCBlbmNyeXB0aW9uOiBlbmFibGVkIChvcGVuc3NsKQotLi4uCi0uLi4KLUlORk8gIFttYWluXSAyMDE5LTA3LTMxIDIxOjE4OjE5LDg1MCBTdG9yYWdlU2VydmljZS5qYXZhOjUxMiAtIFVuYWJsZSB0byBnb3NzaXAgd2l0aCBhbnkgCi1wZWVycyBidXQgY29udGludWluZyBhbnl3YXkgc2luY2Ugbm9kZSBpcyBpbiBpdHMgb3duIHNlZWQgbGlzdAotSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MTksODY0IFN0b3JhZ2VTZXJ2aWNlLmphdmE6Njk1IC0gTG9hZGluZyBwZXJzaXN0ZWQgcmluZyBzdGF0ZQotSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MTksODY1IFN0b3JhZ2VTZXJ2aWNlLmphdmE6ODE0IC0gU3RhcnRpbmcgdXAgc2VydmVyIGdvc3NpcAotSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MjAsMDg4IEJ1ZmZlclBvb2wuamF2YToyMTYgLSBHbG9iYWwgYnVmZmVyIHBvb2wgaXMgZW5hYmxlZCwgIAotd2hlbiBwb29sIGlzIGV4aGF1c3RlZCAobWF4IGlzIDI1MS4wMDBNaUIpIGl0IHdpbGwgYWxsb2NhdGUgb24gaGVhcAotSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MjAsMTEwIFN0b3JhZ2VTZXJ2aWNlLmphdmE6ODc1IC0gVGhpcyBub2RlIHdpbGwgbm90IGF1dG8gCi1ib290c3RyYXAgYmVjYXVzZSBpdCBpcyBjb25maWd1cmVkIHRvIGJlIGEgc2VlZCBub2RlLgotLi4uCi0uLi4KLUlORk8gIFttYWluXSAyMDE5LTA3LTMxIDIxOjE4OjIwLDgwOSBTdG9yYWdlU2VydmljZS5qYXZhOjE1MDcgLSBKT0lOSU5HOiBGaW5pc2ggam9pbmluZyByaW5nCi1JTkZPICBbbWFpbl0gMjAxOS0wNy0zMSAyMToxODoyMCw5MjEgU3RvcmFnZVNlcnZpY2UuamF2YToyNTA4IC0gTm9kZSAxMjcuMC4wLjE6NzAwMCBzdGF0ZSAKLWp1bXAgdG8gTk9STUFMCi0uLi4uCi0KLT09IFVzaW5nIEphdmEgMTEgdG8gQnVpbGQKLQotSWYgSmF2YSAxMSBpcyB1c2VkIHRvIGJ1aWxkIEFwYWNoZSBDYXNzYW5kcmEgNC4wLCBmaXJzdCBKYXZhIDExIG11c3QgYmUKLWluc3RhbGxlZCBhbmQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQuIEFzIGFuIGV4YW1wbGUsIHRvIGRvd25sb2FkCi1hbmQgaW5zdGFsbCBKYXZhIDExIG9uIFJlZEhhdCBMaW51eCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kLgotCi0uLi4uCi0kIHl1bSBpbnN0YWxsIGphdmEtMTEtb3Blbmpkay1kZXZlbAotLi4uLgotCi1TZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiB0aGUgYmFzaCBzY3JpcHQgZm9yIEphdmEgMTEuIFRoZSBmaXJzdAotY29tbWFuZCBpcyB0byBvcGVuIHRoZSBiYXNoIHNjcmlwdC4KLQotLi4uLgotJCBzdWRvIHZpIH4vLmJhc2hyYyAKLSQgZXhwb3J0IEpBVkFfSE9NRT0vdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrCi0kIGV4cG9ydCBKUkVfSE9NRT0vdXNyL2xpYi9qdm0vamF2YS0xMS1vcGVuamRrL2pyZQotJCBleHBvcnQgUEFUSD0kUEFUSDokSkFWQV9IT01FL2JpbjokSlJFX0hPTUUvYmluCi0uLi4uCi0KLVRvIGJ1aWxkIHNvdXJjZSBjb2RlIHdpdGggSmF2YSAxMSBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gb3B0aW9ucyBtdXN0Ci1iZSB1c2VkLgotCi1fX19fCi1bYXJhYmljXQotLiB7Ymxhbmt9Ci0rCi1JbmNsdWRlIEFwYWNoZSBBbnQgY29tbWFuZC1saW5lIG9wdGlvbiBgLUR1c2UuamRrPTExYCBhcyBmb2xsb3dzOjo6Ci0uLi4uCi0kIGFudCAtRHVzZS5qZGs9MTEKLS4uLi4KLS4ge2JsYW5rfQotKwotU2V0IGVudmlyb25tZW50IHZhcmlhYmxlIGBDQVNTQU5EUkFfVVNFX0pESzExYCB0byBgdHJ1ZWA6OjoKLS4uLi4KLSQgZXhwb3J0IENBU1NBTkRSQV9VU0VfSkRLMTE9dHJ1ZQotLi4uLgotX19fXwotCi1BcyBhbiBleGFtcGxlLCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGBDQVNTQU5EUkFfVVNFX0pESzExYCB0bwotYHRydWVgLgotCi0uLi4uCi1bZWMyLXVzZXJAaXAtMTcyLTMwLTMtMTQ2IGNhc3NhbmRyYV0kIGV4cG9ydCBDQVNTQU5EUkFfVVNFX0pESzExPXRydWUKLVtlYzItdXNlckBpcC0xNzItMzAtMy0xNDYgY2Fzc2FuZHJhXSQgYW50Ci1CdWlsZGZpbGU6IC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC54bWwKLS4uLi4KLQotT3IsIHNldCB0aGUgY29tbWFuZC1saW5lIG9wdGlvbi4KLQotLi4uLgotW2VjMi11c2VyQGlwLTE3Mi0zMC0zLTE0NiBjYXNzYW5kcmFdJCBhbnQgLUR1c2UuamRrMTE9dHJ1ZQotLi4uLgotCi1UaGUgYnVpbGQgb3V0cHV0IHNob3VsZCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcuCi0KLS4uLi4KLV9idWlsZF9qYXZhOgotICAgIFtlY2hvXSBDb21waWxpbmcgZm9yIEphdmEgMTEKLS4uLgotLi4uCi1idWlsZDoKLQotX21haW4tamFyOgotICAgICAgICAgW2NvcHldIENvcHlpbmcgMSBmaWxlIHRvIC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC9jbGFzc2VzL21haW4vTUVUQS1JTkYKLSAgICAgW2phcl0gQnVpbGRpbmcgamFyOiAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQvYXBhY2hlLWNhc3NhbmRyYS00LjAtU05BUFNIT1QuamFyCi0uLi4KLS4uLgotX2J1aWxkLXRlc3Q6Ci0gICBbamF2YWNdIENvbXBpbGluZyA3Mzkgc291cmNlIGZpbGVzIHRvIC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2NsYXNzZXMKLSAgICBbY29weV0gQ29weWluZyAyNSBmaWxlcyB0byAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQvdGVzdC9jbGFzc2VzCi0uLi4KLS4uLgotamFyOgotICAgW21rZGlyXSBDcmVhdGVkIGRpcjogL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2J1aWxkL2NsYXNzZXMvc3RyZXNzL01FVEEtSU5GCi0gICBbbWtkaXJdIENyZWF0ZWQgZGlyOiAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQvdG9vbHMvbGliCi0gICAgIFtqYXJdIEJ1aWxkaW5nIGphcjogL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2J1aWxkL3Rvb2xzL2xpYi9zdHJlc3MuamFyCi0gICBbbWtkaXJdIENyZWF0ZWQgZGlyOiAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQvY2xhc3Nlcy9mcWx0b29sL01FVEEtSU5GCi0gICAgIFtqYXJdIEJ1aWxkaW5nIGphcjogL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2J1aWxkL3Rvb2xzL2xpYi9mcWx0b29sLmphcgotCi1CVUlMRCBTVUNDRVNTRlVMCi1Ub3RhbCB0aW1lOiAxIG1pbnV0ZSAzIHNlY29uZHMKLVtlYzItdXNlckBpcC0xNzItMzAtMy0xNDYgY2Fzc2FuZHJhXSQgCi0uLi4uCi0KLT09IENvbW1vbiBJc3N1ZXMKLQotT25lIG9mIHRoZSB0d28gb3B0aW9ucyBtZW50aW9uZWQgbXVzdCBiZSB1c2VkIHRvIGNvbXBpbGUgd2l0aCBKREsgMTEgb3IKLXRoZSBidWlsZCBmYWlscyBhbmQgdGhlIGZvbGxvd2luZyBlcnJvciBtZXNzYWdlIGlzIG91dHB1dC4KLQotLi4uLgotW2VjMi11c2VyQGlwLTE3Mi0zMC0zLTE0NiBjYXNzYW5kcmFdJCBhbnQKLUJ1aWxkZmlsZTogL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2J1aWxkLnhtbAotdmFsaWRhdGUtYnVpbGQtY29uZjoKLQotQlVJTEQgRkFJTEVECi0vaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQueG1sOjI5MzogLUR1c2UuamRrMTE9dHJ1ZSBvciAkQ0FTU0FORFJBX1VTRV9KREsxMT10cnVlIG11c3QgCi1iZSBzZXQgd2hlbiBidWlsZGluZyBmcm9tIGphdmEgMTEKLVRvdGFsIHRpbWU6IDEgc2Vjb25kCi1bZWMyLXVzZXJAaXAtMTcyLTMwLTMtMTQ2IGNhc3NhbmRyYV0kIAotLi4uLgotCi1UaGUgSmF2YSAxMSBidWlsdCBBcGFjaGUgQ2Fzc2FuZHJhIDQuMCBzb3VyY2UgY29kZSBtYXkgYmUgcnVuIHdpdGggSmF2YQotMTEgb25seS4gSWYgYSBKYXZhIDExIGJ1aWx0IGNvZGUgaXMgcnVuIHdpdGggSmF2YSA4IHRoZSBmb2xsb3dpbmcgZXJyb3IKLW1lc3NhZ2UgZ2V0cyBvdXRwdXQuCi0KLS4uLi4KLVtyb290QGxvY2FsaG9zdCB+XSMgc3NoIC1pIGNhc3NhbmRyYS5wZW0gZWMyLXVzZXJAZWMyLTMtODUtODUtNzUuY29tcHV0ZS0xLmFtYXpvbmF3cy5jb20KLUxhc3QgbG9naW46IFdlZCBKdWwgMzEgMjA6NDc6MjYgMjAxOSBmcm9tIDc1LjE1NS4yNTUuNTEKLVtlYzItdXNlckBpcC0xNzItMzAtMy0xNDYgfl0kIGVjaG8gJEpBVkFfSE9NRQotL3Vzci9saWIvanZtL2phdmEtMS44LjAtb3BlbmpkawotW2VjMi11c2VyQGlwLTE3Mi0zMC0zLTE0NiB+XSQgY2Fzc2FuZHJhIAotLi4uCi0uLi4KLUVycm9yOiBBIEpOSSBlcnJvciBoYXMgb2NjdXJyZWQsIHBsZWFzZSBjaGVjayB5b3VyIGluc3RhbGxhdGlvbiBhbmQgdHJ5IGFnYWluCi1FeGNlcHRpb24gaW4gdGhyZWFkICJtYWluIiBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRDbGFzc1ZlcnNpb25FcnJvcjogCi1vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0Nhc3NhbmRyYURhZW1vbiBoYXMgYmVlbiBjb21waWxlZCBieSBhIG1vcmUgcmVjZW50IHZlcnNpb24gb2YgCi10aGUgSmF2YSBSdW50aW1lIChjbGFzcyBmaWxlIHZlcnNpb24gNTUuMCksIHRoaXMgdmVyc2lvbiBvZiB0aGUgSmF2YSBSdW50aW1lIG9ubHkgcmVjb2duaXplcyAKLWNsYXNzIGZpbGUgdmVyc2lvbnMgdXAgdG8gNTIuMAotICBhdCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIuZGVmaW5lQ2xhc3MxKE5hdGl2ZSBNZXRob2QpCi0gIGF0IGphdmEubGFuZy5DbGFzc0xvYWRlci5kZWZpbmVDbGFzcyhDbGFzc0xvYWRlci5qYXZhOjc2MykKLSAgYXQgLi4uCi0uLi4KLS4uLi4KLQotVGhlIGBDQVNTQU5EUkFfVVNFX0pESzExYCB2YXJpYWJsZSBvciB0aGUgY29tbWFuZC1saW5lIG9wdGlvbgotYC1EdXNlLmpkazExYCBjYW5ub3QgYmUgdXNlZCB0byBidWlsZCB3aXRoIEphdmEgOC4gVG8gZGVtb25zdHJhdGUgc2V0Ci1gSkFWQV9IT01FYCB0byB2ZXJzaW9uIDguCi0KLS4uLi4KLVtyb290QGxvY2FsaG9zdCB+XSMgc3NoIC1pIGNhc3NhbmRyYS5wZW0gZWMyLXVzZXJAZWMyLTMtODUtODUtNzUuY29tcHV0ZS0xLmFtYXpvbmF3cy5jb20KLUxhc3QgbG9naW46IFdlZCBKdWwgMzEgMjE6NDE6NTAgMjAxOSBmcm9tIDc1LjE1NS4yNTUuNTEKLVtlYzItdXNlckBpcC0xNzItMzAtMy0xNDYgfl0kIGVjaG8gJEpBVkFfSE9NRQotL3Vzci9saWIvanZtL2phdmEtMS44LjAtb3BlbmpkawotLi4uLgotCi1TZXQgdGhlIGBDQVNTQU5EUkFfVVNFX0pESzExPXRydWVgIG9yIGNvbW1hbmQtbGluZSBvcHRpb24KLWAtRHVzZS5qZGsxMT10cnVlYC4gU3Vic2VxdWVudGx5LCBydW4gQXBhY2hlIEFudCB0byBzdGFydCB0aGUgYnVpbGQuIFRoZQotYnVpbGQgZmFpbHMgd2l0aCBlcnJvciBtZXNzYWdlIGxpc3RlZC4KLQotLi4uLgotW2VjMi11c2VyQGlwLTE3Mi0zMC0zLTE0NiB+XSQgY2QgCi1jYXNzYW5kcmEKLVtlYzItdXNlckBpcC0xNzItMzAtMy0xNDYgY2Fzc2FuZHJhXSQgZXhwb3J0IENBU1NBTkRSQV9VU0VfSkRLMTE9dHJ1ZQotW2VjMi11c2VyQGlwLTE3Mi0zMC0zLTE0NiBjYXNzYW5kcmFdJCBhbnQgCi1CdWlsZGZpbGU6IC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC54bWwKLQotdmFsaWRhdGUtYnVpbGQtY29uZjoKLQotQlVJTEQgRkFJTEVECi0vaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQueG1sOjI4NTogLUR1c2UuamRrMTE9dHJ1ZSBvciAkQ0FTU0FORFJBX1VTRV9KREsxMT10cnVlIGNhbm5vdCAKLWJlIHNldCB3aGVuIGJ1aWxkaW5nIGZyb20gamF2YSA4Ci0KLVRvdGFsIHRpbWU6IDAgc2Vjb25kcwotLi4uLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9wcm9kdWN0aW9uLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL3Byb2R1Y3Rpb24uYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiMjYwOC4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL3Byb2R1Y3Rpb24uYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi09IFByb2R1Y3Rpb24gcmVjb21tZW5kYXRpb25zCi0KLVRoZSBgY2Fzc2FuZHJhLnlhbWxgIGFuZCBganZtLm9wdGlvbnNgIGZpbGVzIGhhdmUgYSBudW1iZXIgb2Ygbm90ZXMgYW5kCi1yZWNvbW1lbmRhdGlvbnMgZm9yIHByb2R1Y3Rpb24gdXNhZ2UuCi1UaGlzIHBhZ2UgZXhwYW5kcyBvbiBzb21lIG9mIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZmlsZXMuCi0KLT09IFRva2VucwotCi1Vc2luZyBtb3JlIHRoYW4gb25lIHRva2VuLXJhbmdlIHBlciBub2RlIGlzIHJlZmVycmVkIHRvIGFzIHZpcnR1YWwgbm9kZXMsIG9yIHZub2Rlcy4KLWB2bm9kZXNgIGZhY2lsaXRhdGUgZmxleGlibGUgZXhwYW5zaW9uIHdpdGggbW9yZSBzdHJlYW1pbmcgcGVlcnMgd2hlbiBhIG5ldyBub2RlIGJvb3RzdHJhcHMKLWludG8gYSBjbHVzdGVyLgotTGltaXRpbmcgdGhlIG5lZ2F0aXZlIGltcGFjdCBvZiBzdHJlYW1pbmcgKEkvTyBhbmQgQ1BVIG92ZXJoZWFkKSBlbmFibGVzIGluY3JlbWVudGFsIGNsdXN0ZXIgZXhwYW5zaW9uLgotSG93ZXZlciwgbW9yZSB0b2tlbnMgbGVhZHMgdG8gc2hhcmluZyBkYXRhIHdpdGggbW9yZSBwZWVycywgYW5kIHJlc3VsdHMgaW4gZGVjcmVhc2VkIGF2YWlsYWJpbGl0eS4KLVRoZXNlIHR3byBmYWN0b3JzIG11c3QgYmUgYmFsYW5jZWQgYmFzZWQgb24gYSBjbHVzdGVyJ3MgY2hhcmFjdGVyaXN0aWMgcmVhZHMgYW5kIHdyaXRlcy4KLVRvIGxlYXJuIG1vcmUsCi1odHRwczovL2dpdGh1Yi5jb20vam9seW5jaC9weXRob25fcGVyZm9ybWFuY2VfdG9vbGtpdC9yYXcvbWFzdGVyL25vdGVib29rcy9jYXNzYW5kcmFfYXZhaWxhYmlsaXR5L3doaXRlcGFwZXIvY2Fzc2FuZHJhLWF2YWlsYWJpbGl0eS12aXJ0dWFsLnBkZltDYXNzYW5kcmEgQXZhaWxhYmlsaXR5IGluIFZpcnR1YWwgTm9kZXMsIEpvc2VwaCBMeW5jaCBhbmQgSm9zaCBTbnlkZXJdIGlzIHJlY29tbWVuZGVkIHJlYWRpbmcuCi0KLUNoYW5nZSB0aGUgbnVtYmVyIG9mIHRva2VucyB1c2luZyB0aGUgc2V0dGluZyBpbiB0aGUgYGNhc3NhbmRyYS55YW1sYCBmaWxlOgotCi1gbnVtX3Rva2VuczogMTZgCi0KLUhlcmUgYXJlIHRoZSBtb3N0IGNvbW1vbiB0b2tlbiBjb3VudHMgd2l0aCBhIGJyaWVmIGV4cGxhbmF0aW9uIG9mIHdoZW4KLWFuZCB3aHkgeW91IHdvdWxkIHVzZSBlYWNoIG9uZS4KLQotW3dpZHRoPSIxMDAlIixjb2xzPSIxMyUsODclIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxUb2tlbiBDb3VudCB8RGVzY3JpcHRpb24KLXwxIHxNYXhpbXVtIGF2YWlsYWJsaWxpdHksIG1heGltdW0gY2x1c3RlciBzaXplLCBmZXdlc3QgcGVlcnMsIGJ1dAotaW5mbGV4aWJsZSBleHBhbnNpb24uIE11c3QgYWx3YXlzIGRvdWJsZSBzaXplIG9mIGNsdXN0ZXIgdG8gZXhwYW5kIGFuZAotcmVtYWluIGJhbGFuY2VkLgotCi18NCB8QSBoZWFsdGh5IG1peCBvZiBlbGFzdGljaXR5IGFuZCBhdmFpbGFiaWxpdHkuIFJlY29tbWVuZGVkIGZvcgotY2x1c3RlcnMgd2hpY2ggd2lsbCBldmVudHVhbGx5IHJlYWNoIG92ZXIgMzAgbm9kZXMuIFJlcXVpcmVzIGFkZGluZwotYXBwcm94aW1hdGVseSAyMCUgbW9yZSBub2RlcyB0byByZW1haW4gYmFsYW5jZWQuIFNocmlua2luZyBhIGNsdXN0ZXIgbWF5Ci1yZXN1bHQgaW4gY2x1c3RlciBpbWJhbGFuY2UuCi0KLXw4IHwgVXNpbmcgOCB2bm9kZXMgZGlzdHJpYnV0ZXMgdGhlIHdvcmtsb2FkIGJldHdlZW4gc3lzdGVtcyB3aXRoIGEgfjEwJSB2YXJpYW5jZQotYW5kIGhhcyBtaW5pbWFsIGltcGFjdCBvbiBwZXJmb3JtYW5jZS4KLQotfDE2IHxCZXN0IGZvciBoZWF2aWx5IGVsYXN0aWMgY2x1c3RlcnMgd2hpY2ggZXhwYW5kIGFuZCBzaHJpbmsKLXJlZ3VsYXJseSwgYnV0IG1heSBoYXZlIGlzc3VlcyBhdmFpbGFiaWxpdHkgd2l0aCBsYXJnZXIgY2x1c3RlcnMuIE5vdAotcmVjb21tZW5kZWQgZm9yIGNsdXN0ZXJzIG92ZXIgNTAgbm9kZXMuCi18PT09Ci0KLUluIGFkZGl0aW9uIHRvIHNldHRpbmcgdGhlIHRva2VuIGNvdW50LCBpdCdzIGV4dHJlbWVseSBpbXBvcnRhbnQgdGhhdAotYGFsbG9jYXRlX3Rva2Vuc19mb3JfbG9jYWxfcmVwbGljYXRpb25fZmFjdG9yYCBpbiBgY2Fzc2FuZHJhLnlhbWxgIGlzIHNldCB0byBhbgotYXBwcm9wcmlhdGUgbnVtYmVyIG9mIHJlcGxpY2F0ZXMsIHRvIGVuc3VyZSBldmVuIHRva2VuIGFsbG9jYXRpb24uCi0KLT09IFJlYWQgYWhlYWQKLQotUmVhZCBhaGVhZCBpcyBhbiBvcGVyYXRpbmcgc3lzdGVtIGZlYXR1cmUgdGhhdCBhdHRlbXB0cyB0byBrZWVwIGFzIG11Y2gKLWRhdGEgYXMgcG9zc2libGUgbG9hZGVkIGluIHRoZSBwYWdlIGNhY2hlLgotU3Bpbm5pbmcgZGlza3MgY2FuIGhhdmUgbG9uZyBzZWVrIHRpbWVzIGNhdXNpbmcgaGlnaCBsYXRlbmN5LCBzbyBhZGRpdGlvbmFsCi10aHJvdWdocHV0IG9uIHJlYWRzIHVzaW5nIHBhZ2UgY2FjaGUgY2FuIGltcHJvdmUgcGVyZm9ybWFuY2UuCi1CeSBsZXZlcmFnaW5nIHJlYWQgYWhlYWQsIHRoZSBPUyBjYW4gcHVsbCBhZGRpdGlvbmFsIGRhdGEgaW50byBtZW1vcnkgd2l0aG91dAotdGhlIGNvc3Qgb2YgYWRkaXRpb25hbCBzZWVrcy4KLVRoaXMgbWV0aG9kIHdvcmtzIHdlbGwgd2hlbiB0aGUgYXZhaWxhYmxlIFJBTSBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2YgdGhlCi1ob3QgZGF0YXNldCwgYnV0IGNhbiBiZSBwcm9ibGVtYXRpYyB3aGVuIHRoZSByZXZlcnNlIGlzIHRydWUgKGRhdGFzZXQgPiBSQU0pLgotVGhlIGxhcmdlciB0aGUgaG90IGRhdGFzZXQsIHRoZSBsZXNzIHJlYWQgYWhlYWQgaXMgdXNlZnVsLgotCi1SZWFkIGFoZWFkIGlzIGRlZmluaXRlbHkgbm90IHVzZWZ1bCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgotCi0qIFNtYWxsIHBhcnRpdGlvbnMsIHN1Y2ggYXMgdGFibGVzIHdpdGggYSBzaW5nbGUgcGFydGl0aW9uIGtleQotKiBTb2xpZCBzdGF0ZSBkcml2ZXMgKFNTRHMpCi0KLQotUmVhZCBhaGVhZCBjYW4gYWN0dWFsbHkgaW5jcmVhc2UgZGlzayB1c2FnZSwgYW5kIGluIHNvbWUgY2FzZXMgcmVzdWx0IGluIGFzIG11Y2gKLWFzIGEgNXggbGF0ZW5jeSBhbmQgdGhyb3VnaHB1dCBwZXJmb3JtYW5jZSBwZW5hbHR5LgotUmVhZC1oZWF2eSwga2V5L3ZhbHVlIHRhYmxlcyB3aXRoIHNtYWxsICh1bmRlciAxS0IpIHJvd3MgYXJlIGVzcGVjaWFsbHkgcHJvbmUKLXRvIHRoaXMgcHJvYmxlbS4KLQotVGhlIHJlY29tbWVuZGVkIHJlYWQgYWhlYWQgc2V0dGluZ3MgYXJlOgotCi1bd2lkdGg9IjU5JSIsY29scz0iNDAlLDYwJSIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18SGFyZHdhcmUgfEluaXRpYWwgUmVjb21tZW5kYXRpb24KLXxTcGlubmluZyBEaXNrcyB8NjRLQgotfFNTRCB8NEtCCi18PT09Ci0KLVJlYWQgYWhlYWQgY2FuIGJlIGFkanVzdGVkIG9uIExpbnV4IHN5c3RlbXMgdXNpbmcgdGhlIGBibG9ja2RldmAgdG9vbC4KLQotRm9yIGV4YW1wbGUsIHNldCB0aGUgcmVhZCBhaGVhZCBvZiB0aGUgZGlzayBgL2Rldi9zZGExXGAgdG8gNEtCOgotCi1bc291cmNlLCBzaGVsbF0KLS0tLS0KLSQgYmxvY2tkZXYgLS1zZXRyYSA4IC9kZXYvc2RhMQotLS0tLQotW05PVEVdCi09PT09Ci1UaGUgYGJsb2NrZGV2YCBzZXR0aW5nIHNldHMgdGhlIG51bWJlciBvZiA1MTIgYnl0ZSBzZWN0b3JzIHRvIHJlYWQgYWhlYWQuCi1UaGUgYXJndW1lbnQgb2YgOCBhYm92ZSBpcyBlcXVpdmFsZW50IHRvIDRLQiwgb3IgOCAqIDUxMiBieXRlcy4KLT09PT0KLQotQWxsIHN5c3RlbXMgYXJlIGRpZmZlcmVudCwgc28gdXNlIHRoZXNlIHJlY29tbWVuZGF0aW9ucyBhcyBhIHN0YXJ0aW5nIHBvaW50IGFuZAotdHVuZSwgYmFzZWQgb24geW91ciBTTEEgYW5kIHRocm91Z2hwdXQgcmVxdWlyZW1lbnRzLgotVG8gdW5kZXJzdGFuZCBob3cgcmVhZCBhaGVhZCBpbXBhY3RzIGRpc2sgcmVzb3VyY2UgdXNhZ2UsIHdlIHJlY29tbWVuZCBjYXJlZnVsbHkKLXJlYWRpbmcgdGhyb3VnaCB0aGUgeHJlZjp0cm91Ymxlc2hvb3RpbmcvdXNlX3Rvb2xzLmFkb2NbRGl2aW5nIERlZXAsIHVzaW5nIGV4dGVybmFsIHRvb2xzXQotc2VjdGlvbi4KLQotPT0gQ29tcHJlc3Npb24KLQotQ29tcHJlc3NlZCBkYXRhIGlzIHN0b3JlZCBieSBjb21wcmVzc2luZyBmaXhlZCBzaXplIGJ5dGUgYnVmZmVycyBhbmQgd3JpdGluZyB0aGUKLWRhdGEgdG8gZGlzay4KLVRoZSBidWZmZXIgc2l6ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBgY2h1bmtfbGVuZ3RoX2luX2tiYCBlbGVtZW50IGluIHRoZSBjb21wcmVzc2lvbgotbWFwIG9mIGEgdGFibGUncyBzY2hlbWEgc2V0dGluZ3MgZm9yIGBXSVRIIENPTVBSRVNTSU9OYC4KLVRoZSBkZWZhdWx0IHNldHRpbmcgaXMgMTZLQiBzdGFydGluZyB3aXRoIENhc3NhbmRyYSB7NDBfdmVyc2lvbn0uCi0KLVNpbmNlIHRoZSBlbnRpcmUgY29tcHJlc3NlZCBidWZmZXIgbXVzdCBiZSByZWFkIG9mZi1kaXNrLCB1c2luZyBhIGNvbXByZXNzaW9uCi1jaHVuayBsZW5ndGggdGhhdCBpcyB0b28gbGFyZ2UgY2FuIGxlYWQgdG8gc2lnbmlmaWNhbnQgb3ZlcmhlYWQgd2hlbiByZWFkaW5nIHNtYWxsIHJlY29yZHMuCi1Db21iaW5lZCB3aXRoIHRoZSBkZWZhdWx0IHJlYWQgYWhlYWQgc2V0dGluZywgdGhlIHJlc3VsdCBjYW4gYmUgbWFzc2l2ZQotcmVhZCBhbXBsaWZpY2F0aW9uIGZvciBjZXJ0YWluIHdvcmtsb2Fkcy4gVGhlcmVmb3JlLCBwaWNraW5nIGFuIGFwcHJvcHJpYXRlCi12YWx1ZSBmb3IgdGhpcyBzZXR0aW5nIGlzIGltcG9ydGFudC4KLQotTFo0Q29tcHJlc3NvciBpcyB0aGUgZGVmYXVsdCBhbmQgcmVjb21tZW5kZWQgY29tcHJlc3Npb24gYWxnb3JpdGhtLgotSWYgeW91IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBjb21wcmVzc2lvbiwgcmVhZAotaHR0cHM6Ly90aGVsYXN0cGlja2xlLmNvbS9ibG9nLzIwMTgvMDgvMDgvY29tcHJlc3Npb25fcGVyZm9ybWFuY2UuaHRtbFtUaGUgTGFzdCBQaWNrbGUgYmxvZ3Bvc3Qgb24gY29tcHJlc3Npb24gcGVyZm9ybWFuY2VdLgotCi09PSBDb21wYWN0aW9uCi0KLVRoZXJlIGFyZSBkaWZmZXJlbnQgeHJlZjpjb21wYWN0aW9uL2luZGV4LmFkb2NbY29tcGFjdGlvbl0gc3RyYXRlZ2llcyBhdmFpbGFibGUKLWZvciBkaWZmZXJlbnQgd29ya2xvYWRzLgotV2UgcmVjb21tZW5kIHJlYWRpbmcgYWJvdXQgdGhlIGRpZmZlcmVudCBzdHJhdGVnaWVzIHRvIHVuZGVyc3RhbmQgd2hpY2ggaXMgdGhlCi1iZXN0IGZvciB5b3VyIGVudmlyb25tZW50LgotRGlmZmVyZW50IHRhYmxlcyBtYXksIGFuZCBmcmVxdWVudGx5IGRvIHVzZSBkaWZmZXJlbnQgY29tcGFjdGlvbiBzdHJhdGVnaWVzIGluCi10aGUgc2FtZSBjbHVzdGVyLgotCi09PSBFbmNyeXB0aW9uCi0KLUl0IGlzIHNpZ25pZmljYW50bHkgYmV0dGVyIHRvIHNldCB1cCBwZWVyLXRvLXBlZXIgZW5jcnlwdGlvbiBhbmQgY2xpZW50IHNlcnZlcgotZW5jcnlwdGlvbiB3aGVuIHNldHRpbmcgdXAgeW91ciBwcm9kdWN0aW9uIGNsdXN0ZXIuCi1TZXR0aW5nIGl0IHVwIGFmdGVyIHRoZSBjbHVzdGVyIGlzIHNlcnZpbmcgcHJvZHVjdGlvbiB0cmFmZmljIGlzIGNoYWxsZW5naW5nCi10byBkbyBjb3JyZWN0bHkuCi1JZiB5b3UgZXZlciBwbGFuIHRvIHVzZSBuZXR3b3JrIGVuY3J5cHRpb24gb2YgYW55IHR5cGUsIHdlIHJlY29tbWVuZCBzZXR0aW5nIGl0Ci11cCB3aGVuIGluaXRpYWxseSBjb25maWd1cmluZyB5b3VyIGNsdXN0ZXIuCi1DaGFuZ2luZyB0aGVzZSBjb25maWd1cmF0aW9ucyBsYXRlciBpcyBub3QgaW1wb3NzaWJsZSwgYnV0IG1pc3Rha2VzIGNhbgotcmVzdWx0IGluIGRvd250aW1lIG9yIGRhdGEgbG9zcy4KLQotPT0gRW5zdXJlIGtleXNwYWNlcyBhcmUgY3JlYXRlZCB3aXRoIE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5Ci0KLVByb2R1Y3Rpb24gY2x1c3RlcnMgc2hvdWxkIG5ldmVyIHVzZSBgU2ltcGxlU3RyYXRlZ3lgLgotUHJvZHVjdGlvbiBrZXlzcGFjZXMgc2hvdWxkIHVzZSB0aGUgYE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5YCAoTlRTKS4KLUZvciBleGFtcGxlOgotCi1bc291cmNlLCBjcWxdCi0tLS0tCi1DUkVBVEUgS0VZU1BBQ0UgbXlrZXlzcGFjZSBXSVRIIHJlcGxpY2F0aW9uID0gICAgIHsKLSAgICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsCi0gICAnZGF0YWNlbnRlcjEnOiAzCi19OwotLS0tLQotCi1DYXNzYW5kcmEgY2x1c3RlcnMgaW5pdGlhbGl6ZWQgd2l0aCBgTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3lgIGNhbiB0YWtlIGFkdmFudGFnZQotb2YgdGhlIGFiaWxpdHkgdG8gY29uZmlndXJlIG11bHRpcGxlIHJhY2tzIGFuZCBkYXRhIGNlbnRlcnMuCi0KLT09IENvbmZpZ3VyZSByYWNrcyBhbmQgc25pdGNoCi0KLSoqQ29ycmVjdGx5IGNvbmZpZ3VyaW5nIG9yIGNoYW5naW5nIHJhY2tzIGFmdGVyIGEgY2x1c3RlciBoYXMgYmVlbiBwcm92aXNpb25lZCBpcyBhbiB1bnN1cHBvcnRlZCBwcm9jZXNzKiouCi1NaWdyYXRpbmcgZnJvbSBhIHNpbmdsZSByYWNrIHRvIG11bHRpcGxlIHJhY2tzIGlzIGFsc28gdW5zdXBwb3J0ZWQgYW5kIGNhbgotcmVzdWx0IGluIGRhdGEgbG9zcy4KLVVzaW5nIGBHb3NzaXBpbmdQcm9wZXJ0eUZpbGVTbml0Y2hgIGlzIHRoZSBtb3N0IGZsZXhpYmxlIHNvbHV0aW9uIGZvciBvbgotcHJlbWlzZSBvciBtaXhlZCBjbG91ZCBlbnZpcm9ubWVudHMuCi1gRWMyU25pdGNoYCBpcyByZWxpYWJsZSBmb3IgQVdTIEVDMiBvbmx5IGVudmlyb25tZW50cy4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvcXVlcnlpbmcuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9nZXR0aW5nX3N0YXJ0ZWQvcXVlcnlpbmcuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiMzQ4YS4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL3F1ZXJ5aW5nLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi09IEluc2VydGluZyBhbmQgcXVlcnlpbmcKLQotVGhlIEFQSSBmb3IgQ2Fzc2FuZHJhIGlzIHhyZWY6Y3FsL2RkbC5hZG9jW2BDUUxgLCB0aGUgQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlXS4gVG8KLXVzZSBDUUwsIHlvdSB3aWxsIG5lZWQgdG8gY29ubmVjdCB0byB0aGUgY2x1c3RlciwgdXNpbmcgZWl0aGVyOgotCi0qIGBjcWxzaGAsIGEgc2hlbGwgZm9yIENRTAotKiBhIGNsaWVudCBkcml2ZXIgZm9yIENhc3NhbmRyYQotKiBmb3IgdGhlIGFkdmVudHVyb3VzLCBjaGVjayBvdXQgaHR0cHM6Ly96ZXBwZWxpbi5hcGFjaGUub3JnL2RvY3MvMC43LjAvaW50ZXJwcmV0ZXIvY2Fzc2FuZHJhLmh0bWxbQXBhY2hlIFplcHBlbGluXSwgYSBub3RlYm9vay1zdHlsZSB0b29sCi0KLT09IENRTFNICi0KLWBjcWxzaGAgaXMgYSBjb21tYW5kLWxpbmUgc2hlbGwgZm9yIGludGVyYWN0aW5nIHdpdGggQ2Fzc2FuZHJhIHVzaW5nCi1DUUwuIEl0IGlzIHNoaXBwZWQgd2l0aCBldmVyeSBDYXNzYW5kcmEgcGFja2FnZSwgYW5kIGNhbiBiZSBmb3VuZCBpbiB0aGUKLWBiaW5gIGRpcmVjdG9yeSBhbG9uZ3NpZGUgdGhlIGBjYXNzYW5kcmFgIGV4ZWN1dGFibGUuIEl0IGNvbm5lY3RzIHRvIHRoZQotc2luZ2xlIG5vZGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZvciBleGFtcGxlOgotCi1bc291cmNlLCBzaGVsbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9jcWxzaF9sb2NhbGhvc3Quc2hbXQotLS0tLQotW3NvdXJjZSwgY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL2NxbHNoX2xvY2FsaG9zdC5yZXN1bHRbXQotLS0tLQotSWYgdGhlIGNvbW1hbmQgaXMgdXNlZCB3aXRob3V0IHNwZWNpZnlpbmcgYSBub2RlLCBgbG9jYWxob3N0YCBpcyB0aGUgZGVmYXVsdC4gU2VlIHRoZSB4cmVmOnRvb2xzL2NxbHNoLmFkb2NbYGNxbHNoYCBzZWN0aW9uXSBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLgotCi09PSBDbGllbnQgZHJpdmVycwotCi1BIGxvdCBvZiB4cmVmOmdldHRpbmdfc3RhcnRlZC9kcml2ZXJzLmFkb2NbY2xpZW50IGRyaXZlcnNdIGFyZSBwcm92aWRlZCBieSB0aGUgQ29tbXVuaXR5IGFuZCBhIGxpc3Qgb2YKLWtub3duIGRyaXZlcnMgaXMgcHJvdmlkZWQuIFlvdSBzaG91bGQgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgZWFjaCBkcml2ZXIKLWZvciBtb3JlIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2dldHRpbmdfc3RhcnRlZC9xdWlja3N0YXJ0LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL3F1aWNrc3RhcnQuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliNTVhNi4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvZ2V0dGluZ19zdGFydGVkL3F1aWNrc3RhcnQuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi09IEFwYWNoZSBDYXNzYW5kcmEgUXVpY2tzdGFydAotOnRhYnM6Ci0KLV9JbnRlcmVzdGVkIGluIGdldHRpbmcgc3RhcnRlZCB3aXRoIENhc3NhbmRyYT8gRm9sbG93IHRoZXNlIGluc3RydWN0aW9ucy5fCi0KLSpTVEVQIDE6IEdFVCBDQVNTQU5EUkEgVVNJTkcgRE9DS0VSKgotCi1Zb3UnbGwgbmVlZCB0byBoYXZlIERvY2tlciBEZXNrdG9wIGZvciBNYWMsIERvY2tlciBEZXNrdG9wIGZvciBXaW5kb3dzLCBvcgotc2ltaWxhciBzb2Z0d2FyZSBpbnN0YWxsZWQgb24geW91ciBjb21wdXRlci4KLQotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotZG9ja2VyIHB1bGwgY2Fzc2FuZHJhOmxhdGVzdAotLS0tLQotCi1BcGFjaGUgQ2Fzc2FuZHJhIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgaHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9kb3dubG9hZC9bdGFyYmFsbCBvciBwYWNrYWdlIGRvd25sb2FkXS4KLQotKlNURVAgMjogU1RBUlQgQ0FTU0FORFJBKgotCi1bc291cmNlLCBwbGFpbnRleHRdCi0tLS0tCi1kb2NrZXIgcnVuIC0tbmFtZSBjYXNzYW5kcmEgY2Fzc2FuZHJhCi0tLS0tCi0KLSpTVEVQIDM6IENSRUFURSBGSUxFUyoKLQotSW4gdGhlIGRpcmVjdG9yeSB3aGVyZSB5b3UgcGxhbiB0byBydW4gdGhlIG5leHQgc3RlcCwgY3JlYXRlIHRoZXNlIHR3byBmaWxlcwotc28gdGhhdCBzb21lIGRhdGEgY2FuIGJlIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgaW4gdGhlIG5leHQgc3RlcC4KLQotQSBfY3Fsc2hyY18gZmlsZSB3aWxsIGxvZyBpbnRvIHRoZSBDYXNzYW5kcmEgZGF0YWJhc2Ugd2l0aCB0aGUgZGVmYXVsdCBzdXBlcnVzZXI6Ci0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLVthdXRoZW50aWNhdGlvbl0KLQl1c2VybmFtZSA9IGNhc3NhbmRyYQotCXBhc3N3b3JkID0gY2Fzc2FuZHJhCi0tLS0tCi0KLUNyZWF0ZSBhIF9zY3JpcHRzXyBkaXJlY3RvcnkgYW5kIGNoYW5nZSB0byB0aGF0IGRpcmVjdG9yeS4KLVRoZSBmb2xsb3dpbmcgX2RhdGEuY3FsXyBmaWxlIHdpbGwgY3JlYXRlIGEga2V5c3BhY2UsIHRoZSBsYXllciBhdCB3aGljaCBDYXNzYW5kcmEKLXJlcGxpY2F0ZXMgaXRzIGRhdGEsIGEgdGFibGUgdG8gaG9sZCB0aGUgZGF0YSwgYW5kIGluc2VydCBzb21lIGRhdGE6Ci0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLSMgQ3JlYXRlIGEga2V5c3BhY2UKLUNSRUFURSBLRVlTUEFDRSBJRiBOT1QgRVhJU1RTIHN0b3JlIFdJVEggUkVQTElDQVRJT04gPSB7ICdjbGFzcycgOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJyA6ICcxJyB9OwotCi0jIENyZWF0ZSBhIHRhYmxlCi1DUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBzdG9yZS5zaG9wcGluZ19jYXJ0ICAoCi0JdXNlcmlkIHRleHQgUFJJTUFSWSBLRVksCi0JaXRlbV9jb3VudCBpbnQsCi0JbGFzdF91cGRhdGVfdGltZXN0YW1wIHRpbWVzdGFtcAotKTsKLQotIyBJbnNlcnQgc29tZSBkYXRhCi1JTlNFUlQgSU5UTyBzdG9yZS5zaG9wcGluZ19jYXJ0Ci0odXNlcmlkLCBpdGVtX2NvdW50LCBsYXN0X3VwZGF0ZV90aW1lc3RhbXApCi1WQUxVRVMgKCc5ODc2JywgMiwgdG9UaW1lU3RhbXAodG9EYXRlKG5vdykpKSk7Ci1JTlNFUlQgSU5UTyBzdG9yZS5zaG9wcGluZ19jYXJ0Ci0odXNlcmlkLCBpdGVtX2NvdW50LCBsYXN0X3VwZGF0ZV90aW1lc3RhbXApCi1WQUxVRVMgKDEyMzQsIDUsIHRvVGltZVN0YW1wKHRvRGF0ZShub3cpKSkpOwotLS0tLQotCi1Zb3Ugc2hvdWxkIG5vdyBoYXZlIGEgX2NxbHNocmNfIGZpbGUgYW5kIF88Y3VycmVudGRpcj4vc2NyaXB0cy9kYXRhLmNxbF8gZmlsZS4KLQotKlNURVAgNDogUlVOIENRTFNIIFRPIElOVEVSQUNUKgotCi1DYXNzYW5kcmEgaXMgYSBkaXN0cmlidXRlZCBkYXRhYmFzZSB0aGF0IGNhbiByZWFkIGFuZCB3cml0ZSBkYXRhIGFjcm9zcyBtdWx0aXBsZQotbm9kZXMgd2l0aCAgcGVlci10by1wZWVyIHJlcGxpY2F0aW9uLiBUaGUgQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlIChDUUwpIGlzCi1zaW1pbGFyIHRvIFNRTCBidXQgc3VpdGVkIGZvciB0aGUgSk9JTmxlc3Mgc3RydWN0dXJlIG9mIENhc3NhbmRyYS4gVGhlIENRTAotc2hlbGwsIG9yIGBjcWxzaGAsIGlzIG9uZSB0b29sIHRvIHVzZSBpbiBpbnRlcmFjdGluZyB3aXRoIHRoZSBkYXRhYmFzZS4KLQotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotZG9ja2VyIHJ1biAtLXJtIC1pdCAtdiAvPGN1cnJlbnRkaXI+L3NjcmlwdHM6L3NjcmlwdHMgIFwKLS12IC88Y3VycmVudGRpci9jcWxzaHJjOi8uY2Fzc2FuZHJhL2NxbHNocmMgIFwKLS0tZW52IENRTFNIX0hPU1Q9aG9zdC5kb2NrZXIuaW50ZXJuYWwgLS1lbnYgQ1FMU0hfUE9SVD05MDQyICBudXZvL2RvY2tlci1jcWxzaAotLS0tLQotCi1Gb3IgdGhpcyBxdWlja3N0YXJ0LCB0aGlzIGNxbHNoIGRvY2tlciBpbWFnZSBhbHNvIGxvYWRzIHNvbWUgZGF0YSBhdXRvbWF0aWNhbGx5LAotc28geW91IGNhbiBzdGFydCBydW5uaW5nIHF1ZXJpZXMuCi0KLSpTVEVQIDU6IFJFQUQgU09NRSBEQVRBKgotCi1bc291cmNlLCBwbGFpbnRleHRdCi0tLS0tCi1TRUxFQ1QgKiBGUk9NIHN0b3JlLnNob3BwaW5nX2NhcnQ7Ci0tLS0tCi0KLSpTVEVQIDY6IFdSSVRFIFNPTUUgTU9SRSBEQVRBKgotCi1bc291cmNlLCBwbGFpbnRleHRdCi0tLS0tCi1JTlNFUlQgKHVzZXJpZCwgaXRlbV9jb3VudCkgVkFMVUVTICg0NTY3LCAyMCkgSU5UTyBzdG9yZS5zaG9wcGluZ19jYXJ0OwotLS0tLQotCi0qU1RFUCA3OiBURVJNSU5BVEUgQ0FTU0FORFJBKgotCi1bc291cmNlLCBwbGFpbnRleHRdCi0tLS0tCi1kb2NrZXIgcm0gY2Fzc2FuZHJhCi0tLS0tCi0KLSpDT05HUkFUVUxBVElPTlMhKgotCi1IZXksIHRoYXQgd2Fzbid0IHNvIGhhcmQsIHdhcyBpdD8KLQotVG8gbGVhcm4gbW9yZSwgd2Ugc3VnZ2VzdCB0aGUgZm9sbG93aW5nIG5leHQgc3RlcHM6Ci0KLSogUmVhZCB0aHJvdWdoIHRoZSAqbmVlZCBsaW5rKltPdmVydmlld10gdG8gbGVhcm4gbWFpbiBjb25jZXB0cyBhbmQgaG93IENhc3NhbmRyYSB3b3JrcyBhdCBhCi1oaWdoIGxldmVsLgotKiBUbyB1bmRlcnN0YW5kIENhc3NhbmRyYSBpbiBtb3JlIGRldGFpbCwgaGVhZCBvdmVyIHRvIHRoZQotaHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9kb2MvbGF0ZXN0L1tEb2NzXS4KLSogQnJvd3NlIHRocm91Z2ggdGhlIGh0dHBzOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvY2FzZS1zdHVkaWVzL1tDYXNlIFN0dWRpZXNdIHRvCi1sZWFybiBob3cgb3RoZXIgdXNlcnMgaW4gb3VyIHdvcmxkd2lkZSBjb21tdW5pdHkgYXJlIGdldHRpbmcgdmFsdWUgb3V0IG9mCi1DYXNzYW5kcmEuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvaW5zdGFsbGluZy9pbnN0YWxsaW5nLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvaW5zdGFsbGluZy9pbnN0YWxsaW5nLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjMzA4OQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9pbnN0YWxsaW5nL2luc3RhbGxpbmcuYWRvYwpAQCAtMCwwICsxLDM0NSBAQAorPSBJbnN0YWxsaW5nIENhc3NhbmRyYQorOnRhYnM6CisKK1RoZXNlIGFyZSB0aGUgaW5zdHJ1Y3Rpb25zIGZvciBkZXBsb3lpbmcgdGhlIHN1cHBvcnRlZCByZWxlYXNlcyBvZgorQXBhY2hlIENhc3NhbmRyYSBvbiBMaW51eCBzZXJ2ZXJzLgorCitDYXNzYW5kcmEgcnVucyBvbiBhIHdpZGUgYXJyYXkgb2YgTGludXggZGlzdHJpYnV0aW9ucyBpbmNsdWRpbmcgKGJ1dCBub3QKK2xpbWl0ZWQgdG8pOgorCisqIFVidW50dSwgbW9zdCBub3RhYmx5IExUUyByZWxlYXNlcyAxNi4wNCB0byAxOC4wNAorKiBDZW50T1MgJiBSZWRIYXQgRW50ZXJwcmlzZSBMaW51eCAoUkhFTCkgaW5jbHVkaW5nIDYuNiB0byA3LjcKKyogQW1hem9uIExpbnV4IEFNSXMgaW5jbHVkaW5nIDIwMTYuMDkgdGhyb3VnaCB0byBMaW51eCAyCisqIERlYmlhbiB2ZXJzaW9ucyA4ICYgOQorKiBTVVNFIEVudGVycHJpc2UgTGludXggMTIKKworVGhpcyBpcyBub3QgYW4gZXhoYXVzdGl2ZSBsaXN0IG9mIG9wZXJhdGluZyBzeXN0ZW0gcGxhdGZvcm1zLCBub3IgaXMgaXQKK3ByZXNjcmlwdGl2ZS4gSG93ZXZlciwgdXNlcnMgd2lsbCBiZSB3ZWxsLWFkdmlzZWQgdG8gY29uZHVjdCBleGhhdXN0aXZlCit0ZXN0cyBvZiB0aGVpciBvd24gcGFydGljdWxhcmx5IGZvciBsZXNzLXBvcHVsYXIgZGlzdHJpYnV0aW9ucyBvZiBMaW51eC4KK0RlcGxveWluZyBvbiBvbGRlciB2ZXJzaW9ucyBpcyBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdSBoYXZlIHByZXZpb3VzCitleHBlcmllbmNlIHdpdGggdGhlIG9sZGVyIGRpc3RyaWJ1dGlvbiBpbiBhIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuCisKKz09IFByZXJlcXVpc2l0ZXMKKworKiBJbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBKYXZhIDggb3IgSmF2YSAxMSwgZWl0aGVyIHRoZQoraHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvamF2YXNlL2Rvd25sb2Fkcy9pbmRleC5odG1sW09yYWNsZQorSmF2YSBTdGFuZGFyZCBFZGl0aW9uIDhdIC8gaHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvamF2YXNlL2Rvd25sb2Fkcy9pbmRleC5odG1sW09yYWNsZSBKYXZhIFN0YW5kYXJkIEVkaXRpb24gMTEgKExvbmcgVGVybSBTdXBwb3J0KV0KK29yIGh0dHA6Ly9vcGVuamRrLmphdmEubmV0L1tPcGVuSkRLIDhdIC8gaHR0cDovL29wZW5qZGsuamF2YS5uZXQvW09wZW5KREsgMTFdLiBUbwordmVyaWZ5IHRoYXQgeW91IGhhdmUgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiBqYXZhIGluc3RhbGxlZCwgdHlwZQorYGphdmEgLXZlcnNpb25gLgorKiAqTk9URSo6IEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBKYXZhIDExIHdhcyBhZGRlZCBpbiBDYXNzYW5kcmEgezQwX3ZlcnNpb259CisoaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtOTYwOFtDQVNTQU5EUkEtOTYwOF0pLgorRnVsbCBzdXBwb3J0IGlzIGVmZmVjdGl2ZSBDYXNzYW5kcmEgNC4wLjIgdmVyc2lvbiAoaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTY4OTRbQ0FTU0FORFJBLTE2ODk0XSkKK0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKK2h0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhL2Jsb2IvdHJ1bmsvTkVXUy50eHRbTkVXUy50eHRdLgorKiBGb3IgdXNpbmcgY3Fsc2gsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZgorUHl0aG9uIDMuNisgb3IgUHl0aG9uIDIuNyAoc3VwcG9ydCBkZXByZWNhdGVkKS4gVG8gdmVyaWZ5Cit0aGF0IHlvdSBoYXZlIHRoZSBjb3JyZWN0IHZlcnNpb24gb2YgUHl0aG9uIGluc3RhbGxlZCwgdHlwZQorYHB5dGhvbiAtLXZlcnNpb25gLgorCis9PSBDaG9vc2luZyBhbiBpbnN0YWxsYXRpb24gbWV0aG9kCisKK1RoZXJlIGFyZSB0aHJlZSBtZXRob2RzIG9mIGluc3RhbGxpbmcgQ2Fzc2FuZHJhIHRoYXQgYXJlIGNvbW1vbjoKKworKiBEb2NrZXIgaW1hZ2UKKyogVGFyYmFsbCBiaW5hcnkgZmlsZQorKiBQYWNrYWdlIGluc3RhbGxhdGlvbiAoUlBNLCBZVU0pCisKK0lmIHlvdSBhcmUgYSBjdXJyZW50IERvY2tlciB1c2VyLCBpbnN0YWxsaW5nIGEgRG9ja2VyIGltYWdlIGlzIHNpbXBsZS4gCitZb3UnbGwgbmVlZCB0byBpbnN0YWxsIERvY2tlciBEZXNrdG9wIGZvciBNYWMsIERvY2tlciBEZXNrdG9wIGZvciBXaW5kb3dzLAorb3IgaGF2ZSBgZG9ja2VyYCBpbnN0YWxsZWQgb24gTGludXguIAorUHVsbCB0aGUgYXBwcm9wcmlhdGUgaW1hZ2UgYW5kIHRoZW4gc3RhcnQgQ2Fzc2FuZHJhIHdpdGggYSBydW4gY29tbWFuZC4gCisKK0ZvciBtb3N0IHVzZXJzLCBpbnN0YWxsaW5nIHRoZSBiaW5hcnkgdGFyYmFsbCBpcyBhbHNvIGEgc2ltcGxlIGNob2ljZS4KK1RoZSB0YXJiYWxsIHVucGFja3MgYWxsIGl0cyBjb250ZW50cyBpbnRvIGEgc2luZ2xlIGxvY2F0aW9uIHdpdGgKK2JpbmFyaWVzIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzIGxvY2F0ZWQgaW4gdGhlaXIgb3duIHN1YmRpcmVjdG9yaWVzLgorVGhlIG1vc3Qgb2J2aW91cyBhdHRyaWJ1dGUgb2YgdGhlIHRhcmJhbGwgaW5zdGFsbGF0aW9uIGlzIGl0IGRvZXMgbm90CityZXF1aXJlIGByb290YCBwZXJtaXNzaW9ucyBhbmQgY2FuIGJlIGluc3RhbGxlZCBvbiBhbnkgTGludXgKK2Rpc3RyaWJ1dGlvbi4KKworUGFja2FnZWQgaW5zdGFsbGF0aW9ucyByZXF1aXJlIGByb290YCBwZXJtaXNzaW9ucywgYW5kIGFyZSBtb3N0IGFwcHJvcHJpYXRlIGZvcgorcHJvZHVjdGlvbiBpbnN0YWxscy4gCitJbnN0YWxsIHRoZSBSUE0gYnVpbGQgb24gQ2VudE9TIGFuZCBSSEVMLWJhc2VkIGRpc3RyaWJ1dGlvbnMgaWYgeW91IHdhbnQgdG8gCitpbnN0YWxsIENhc3NhbmRyYSB1c2luZyBZVU0uIAorSW5zdGFsbCB0aGUgRGViaWFuIGJ1aWxkIG9uIFVidW50dSBhbmQgb3RoZXIgRGViaWFuLWJhc2VkCitkaXN0cmlidXRpb25zIGlmIHlvdSB3YW50IHRvIGluc3RhbGwgQ2Fzc2FuZHJhIHVzaW5nIEFQVC4gCitOb3RlIHRoYXQgYm90aCB0aGUgWVVNIGFuZCBBUFQgbWV0aG9kcyByZXF1aXJlZCBgcm9vdGAgcGVybWlzc2lvbnMgYW5kIAord2lsbCBpbnN0YWxsIHRoZSBiaW5hcmllcyBhbmQgY29uZmlndXJhdGlvbiBmaWxlcyBhcyB0aGUgYGNhc3NhbmRyYWAgT1MgdXNlci4KKworPT0gSW5zdGFsbGluZyB0aGUgZG9ja2VyIGltYWdlCisKK1thcmFiaWMsIHN0YXJ0PTFdCisuIFB1bGwgdGhlIGRvY2tlciBpbWFnZS4gRm9yIHRoZSBsYXRlc3QgaW1hZ2UsIHVzZToKKworW3NvdXJjZSwgc2hlbGxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvZG9ja2VyX3B1bGwuc2hbXQorLS0tLQorCitUaGlzIGBkb2NrZXIgcHVsbGAgY29tbWFuZCB3aWxsIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlICdEb2NrZXIgT2ZmaWNpYWwnCitBcGFjaGUgQ2Fzc2FuZHJhIGltYWdlIGF2YWlsYWJsZSBmcm9tIHRoZSBodHRwczovL2h1Yi5kb2NrZXIuY29tL18vY2Fzc2FuZHJhW0RvY2tlcmh1Yl0uCisKK1thcmFiaWMsIHN0YXJ0PTJdCisuIFN0YXJ0IENhc3NhbmRyYSB3aXRoIGEgYGRvY2tlciBydW5gIGNvbW1hbmQ6CisKK1tzb3VyY2UsIHNoZWxsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2RvY2tlcl9ydW4uc2hbXQorLS0tLQorCitUaGUgYC0tbmFtZWAgb3B0aW9uIHdpbGwgYmUgdGhlIG5hbWUgb2YgdGhlIENhc3NhbmRyYSBjbHVzdGVyIGNyZWF0ZWQuCisKK1thcmFiaWMsIHN0YXJ0PTNdCisuIFN0YXJ0IHRoZSBDUUwgc2hlbGwsIGBjcWxzaGAgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgQ2Fzc2FuZHJhIG5vZGUgY3JlYXRlZDoKKworW3NvdXJjZSwgc2hlbGxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvZG9ja2VyX2NxbHNoLnNoW10KKy0tLS0KKz09IEluc3RhbGxpbmcgdGhlIGJpbmFyeSB0YXJiYWxsCisKK2luY2x1ZGU6OnBhcnRpYWwkamF2YV92ZXJzaW9uLmFkb2NbXQorCitbYXJhYmljLCBzdGFydD0yXQorLiBEb3dubG9hZCB0aGUgYmluYXJ5IHRhcmJhbGwgZnJvbSBvbmUgb2YgdGhlIG1pcnJvcnMgb24gdGhlCit7Y2Fzc191cmx9ZG93bmxvYWQvW0FwYWNoZSBDYXNzYW5kcmEgRG93bmxvYWRdIHNpdGUuCitGb3IgZXhhbXBsZSwgdG8gZG93bmxvYWQgQ2Fzc2FuZHJhIHs0MF92ZXJzaW9ufToKKworW3NvdXJjZSxzaGVsbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9jdXJsX2luc3RhbGwuc2hbXQorLS0tLQorCitOT1RFOiBUaGUgbWlycm9ycyBvbmx5IGhvc3QgdGhlIGxhdGVzdCB2ZXJzaW9ucyBvZiBlYWNoIG1ham9yIHN1cHBvcnRlZAorcmVsZWFzZS4gVG8gZG93bmxvYWQgYW4gZWFybGllciB2ZXJzaW9uIG9mIENhc3NhbmRyYSwgdmlzaXQgdGhlCitodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvY2Fzc2FuZHJhL1tBcGFjaGUgQXJjaGl2ZXNdLgorCitbYXJhYmljLCBzdGFydD0zXQorLiBPUFRJT05BTDogVmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgdGhlIGRvd25sb2FkZWQgdGFyYmFsbCB1c2luZyBvbmUgb2YKK3RoZSBtZXRob2RzIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvZHluL2Nsb3Nlci5jZ2kjdmVyaWZ5W2hlcmVdLiBGb3IKK2V4YW1wbGUsIHRvIHZlcmlmeSB0aGUgaGFzaCBvZiB0aGUgZG93bmxvYWRlZCBmaWxlIHVzaW5nIEdQRzoKKworW3t0YWJzfV0KKz09PT0KK0NvbW1hbmQ6OgorKworLS0KK1tzb3VyY2Usc2hlbGxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvdmVyaWZ5X2dwZy5zaFtdCistLS0tCistLQorCitSZXN1bHQ6OgorKworLS0KK1tzb3VyY2UscGxhaW50ZXh0XQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3ZlcmlmeV9ncGcucmVzdWx0W10KKy0tLS0KKy0tCis9PT09CisKK0NvbXBhcmUgdGhlIHNpZ25hdHVyZSB3aXRoIHRoZSBTSEEyNTYgZmlsZSBmcm9tIHRoZSBEb3dubG9hZHMgc2l0ZToKKworW3t0YWJzfV0KKz09PT0KK0NvbW1hbmQ6OgorKworLS0KK1tzb3VyY2Usc2hlbGxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvY3VybF92ZXJpZnlfc2hhLnNoW10KKy0tLS0KKy0tCisKK1Jlc3VsdDo6CisrCistLQorW3NvdXJjZSxwbGFpbnRleHRdCistLS0tCisyODc1N2RkZTU4OWY3MDQxMGY5YTZhOTVjMzllZTdlNmNkZTYzNDQwZTJiMDZiOTFhZTZiMjAwNjE0ZmEzNjRkCistLS0tCistLQorPT09PQorCitbYXJhYmljLCBzdGFydD00XQorLiBVbnBhY2sgdGhlIHRhcmJhbGw6CisKK1tzb3VyY2Usc2hlbGxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvdGFyYmFsbC5zaFtdCistLS0tCisKK1RoZSBmaWxlcyB3aWxsIGJlIGV4dHJhY3RlZCB0byB0aGUgYGFwYWNoZS1jYXNzYW5kcmEtNC4wLjAvYCBkaXJlY3RvcnkuCitUaGlzIGlzIHRoZSB0YXJiYWxsIGluc3RhbGxhdGlvbiBsb2NhdGlvbi4KKworW2FyYWJpYywgc3RhcnQ9NV0KKy4gTG9jYXRlZCBpbiB0aGUgdGFyYmFsbCBpbnN0YWxsYXRpb24gbG9jYXRpb24gYXJlIHRoZSBkaXJlY3RvcmllcyBmb3IKK3RoZSBzY3JpcHRzLCBiaW5hcmllcywgdXRpbGl0aWVzLCBjb25maWd1cmF0aW9uLCBkYXRhIGFuZCBsb2cgZmlsZXM6CisKK1tzb3VyY2UscGxhaW50ZXh0XQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRURVhUL3RhcmJhbGxfaW5zdGFsbF9kaXJzLnR4dFtdCistLS0tCis8MT4gbG9jYXRpb24gb2YgdGhlIGNvbW1hbmRzIHRvIHJ1biBjYXNzYW5kcmEsIGNxbHNoLCBub2RldG9vbCwgYW5kIFNTVGFibGUgdG9vbHMKKzwyPiBsb2NhdGlvbiBvZiBjYXNzYW5kcmEueWFtbCBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBmaWxlcworPDM+IGxvY2F0aW9uIG9mIHRoZSBjb21taXQgbG9ncywgaGludHMsIGFuZCBTU1RhYmxlcworPDQ+IGxvY2F0aW9uIG9mIHN5c3RlbSBhbmQgZGVidWcgbG9ncworPDU+bG9jYXRpb24gb2YgY2Fzc2FuZHJhLXN0cmVzcyB0b29sCisKK0ZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29uZmlndXJlIHlvdXIgaW5zdGFsbGF0aW9uLCBzZWUKK3tjYXNzX3VybH1kb2MvbGF0ZXN0L2dldHRpbmctc3RhcnRlZC9jb25maWd1cmluZy5odG1sW0NvbmZpZ3VyaW5nCitDYXNzYW5kcmFdLgorCitbYXJhYmljLCBzdGFydD02XQorLiBTdGFydCBDYXNzYW5kcmE6CisKK1tzb3VyY2Usc2hlbGxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvc3RhcnRfdGFyYmFsbC5zaFtdCistLS0tCisKK05PVEU6IFRoaXMgd2lsbCBydW4gQ2Fzc2FuZHJhIGFzIHRoZSBhdXRoZW50aWNhdGVkIExpbnV4IHVzZXIuCisKK2luY2x1ZGU6OnBhcnRpYWwkdGFpbF9zeXNsb2cuYWRvY1tdCitZb3UgY2FuIG1vbml0b3IgdGhlIHByb2dyZXNzIG9mIHRoZSBzdGFydHVwIHdpdGg6CisKK1t7dGFic31dCis9PT09CitDb21tYW5kOjoKKysKKy0tCitbc291cmNlLHNoZWxsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3RhaWxfc3lzbG9nLnNoW10KKy0tLS0KKy0tCisKK1Jlc3VsdDo6CisrCistLQorQ2Fzc2FuZHJhIGlzIHJlYWR5IHdoZW4geW91IHNlZSBhbiBlbnRyeSBsaWtlIHRoaXMgaW4gdGhlIGBzeXN0ZW0ubG9nYDoKKworW3NvdXJjZSxwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvdGFpbF9zeXNsb2cucmVzdWx0W10KKy0tLS0KKy0tCis9PT09CisKK2luY2x1ZGU6OnBhcnRpYWwkbm9kZXRvb2xfYW5kX2NxbHNoLmFkb2NbXQorCis9PSBJbnN0YWxsaW5nIHRoZSBEZWJpYW4gcGFja2FnZXMKKworaW5jbHVkZTo6cGFydGlhbCRqYXZhX3ZlcnNpb24uYWRvY1tdCisKK1thcmFiaWMsIHN0YXJ0PTJdCisuIEFkZCB0aGUgQXBhY2hlIHJlcG9zaXRvcnkgb2YgQ2Fzc2FuZHJhIHRvIHRoZSBmaWxlCitgY2Fzc2FuZHJhLnNvdXJjZXMubGlzdGAuIAoraW5jbHVkZTo6cGFydGlhbCRwYWNrYWdlX3ZlcnNpb25zLmFkb2NbXQorCitbc291cmNlLHNoZWxsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2dldF9kZWJfcGFja2FnZS5zaFtdCistLS0tCisKK1thcmFiaWMsIHN0YXJ0PTNdCisuIEFkZCB0aGUgQXBhY2hlIENhc3NhbmRyYSByZXBvc2l0b3J5IGtleXMgdG8gdGhlIGxpc3Qgb2YgdHJ1c3RlZCBrZXlzCitvbiB0aGUgc2VydmVyOgorCitbe3RhYnN9XQorPT09PQorQ29tbWFuZDo6CisrCistLQorW3NvdXJjZSxzaGVsbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9hZGRfcmVwb19rZXlzLnNoW10KKy0tLS0KKy0tCisKK1Jlc3VsdDo6CisrCistLQorW3NvdXJjZSxwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvYWRkX3JlcG9fa2V5cy5yZXN1bHRbXQorLS0tLQorLS0KKz09PT0KKworW2FyYWJpYywgc3RhcnQ9NF0KKy4gVXBkYXRlIHRoZSBwYWNrYWdlIGluZGV4IGZyb20gc291cmNlczoKKworW3NvdXJjZSxzaGVsbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9hcHQtZ2V0X3VwZGF0ZS5zaFtdCistLS0tCisKK1thcmFiaWMsIHN0YXJ0PTVdCisuIEluc3RhbGwgQ2Fzc2FuZHJhIHdpdGggQVBUOgorCitbc291cmNlLHNoZWxsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2FwdC1nZXRfY2Fzcy5zaFtdCistLS0tCisKK05PVEU6IEZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29uZmlndXJlIHlvdXIgaW5zdGFsbGF0aW9uLCBzZWUKK3tjYXNzX3VybH1kb2MvbGF0ZXN0L2dldHRpbmctc3RhcnRlZC9jb25maWd1cmluZy5odG1sW0NvbmZpZ3VyaW5nCitDYXNzYW5kcmFdLgorCitpbmNsdWRlOjpwYXJ0aWFsJHRhaWxfc3lzbG9nLmFkb2NbXQorCitpbmNsdWRlOjpwYXJ0aWFsJG5vZGV0b29sX2FuZF9jcWxzaF9ub2Jpbi5hZG9jW10KKworPT0gSW5zdGFsbGluZyB0aGUgUlBNIHBhY2thZ2VzCisKK2luY2x1ZGU6OnBhcnRpYWwkamF2YV92ZXJzaW9uLmFkb2NbXQorCitbYXJhYmljLCBzdGFydD0yXQorLiBBZGQgdGhlIEFwYWNoZSByZXBvc2l0b3J5IG9mIENhc3NhbmRyYSB0byB0aGUgZmlsZQorYC9ldGMveXVtLnJlcG9zLmQvY2Fzc2FuZHJhLnJlcG9gIChhcyB0aGUgYHJvb3RgIHVzZXIpLgoraW5jbHVkZTo6cGFydGlhbCRwYWNrYWdlX3ZlcnNpb25zLmFkb2NbXQorIAorW3NvdXJjZSxwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvYWRkX3l1bV9yZXBvLnJlc3VsdFtdCistLS0tCisKK1thcmFiaWMsIHN0YXJ0PTNdCisuIFVwZGF0ZSB0aGUgcGFja2FnZSBpbmRleCBmcm9tIHNvdXJjZXM6CisKK1tzb3VyY2Usc2hlbGxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gveXVtX3VwZGF0ZS5zaFtdCistLS0tCisKK1thcmFiaWMsIHN0YXJ0PTRdCisuIEluc3RhbGwgQ2Fzc2FuZHJhIHdpdGggWVVNOgorCitbc291cmNlLHNoZWxsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3l1bV9jYXNzLnNoW10KKy0tLS0KKworTk9URTogQSBuZXcgTGludXggdXNlciBgY2Fzc2FuZHJhYCB3aWxsIGdldCBjcmVhdGVkIGFzIHBhcnQgb2YgdGhlCitpbnN0YWxsYXRpb24uIFRoZSBDYXNzYW5kcmEgc2VydmljZSB3aWxsIGFsc28gYmUgcnVuIGFzIHRoaXMgdXNlci4KKworW2FyYWJpYywgc3RhcnQ9NV0KKy4gU3RhcnQgdGhlIENhc3NhbmRyYSBzZXJ2aWNlOgorCitbc291cmNlLHNoZWxsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3l1bV9zdGFydC5zaFtdCistLS0tCisKK2luY2x1ZGU6OnBhcnRpYWwkdGFpbF9zeXNsb2cuYWRvY1tdCisKK2luY2x1ZGU6OnBhcnRpYWwkbm9kZXRvb2xfYW5kX2NxbHNoX25vYmluLmFkb2NbXQorCis9PSBGdXJ0aGVyIGluc3RhbGxhdGlvbiBpbmZvCisKK0ZvciBoZWxwIHdpdGggaW5zdGFsbGF0aW9uIGlzc3Vlcywgc2VlIHRoZQore2Nhc3NfdXJsfWRvYy9sYXRlc3QvdHJvdWJsZXNob290aW5nL2luZGV4Lmh0bWxbVHJvdWJsZXNob290aW5nXQorc2VjdGlvbi4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9wbHVnaW5zL2luZGV4LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvaW50ZWdyYXRpbmcvcGx1Z2lucy9pbmRleC5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvcGx1Z2lucy9pbmRleC5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvaW50ZWdyYXRpbmcvcGx1Z2lucy9pbmRleC5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY29uZmlndXJhdGlvbi9jYXNzX2NsX2FyY2hpdmVfZmlsZS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL2NvbmZpZ3VyYXRpb24vY2Fzc19jbF9hcmNoaXZlX2ZpbGUuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NvbmZpZ3VyYXRpb24vY2Fzc19jbF9hcmNoaXZlX2ZpbGUuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL2NvbmZpZ3VyYXRpb24vY2Fzc19jbF9hcmNoaXZlX2ZpbGUuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NvbmZpZ3VyYXRpb24vY2Fzc19lbnZfc2hfZmlsZS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL2NvbmZpZ3VyYXRpb24vY2Fzc19lbnZfc2hfZmlsZS5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY29uZmlndXJhdGlvbi9jYXNzX2Vudl9zaF9maWxlLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9jb25maWd1cmF0aW9uL2Nhc3NfZW52X3NoX2ZpbGUuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NvbmZpZ3VyYXRpb24vY2Fzc19qdm1fb3B0aW9uc19maWxlLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvY29uZmlndXJhdGlvbi9jYXNzX2p2bV9vcHRpb25zX2ZpbGUuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NvbmZpZ3VyYXRpb24vY2Fzc19qdm1fb3B0aW9uc19maWxlLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9jb25maWd1cmF0aW9uL2Nhc3NfanZtX29wdGlvbnNfZmlsZS5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvY29uZmlndXJhdGlvbi9jYXNzX2xvZ2JhY2tfeG1sX2ZpbGUuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9jb25maWd1cmF0aW9uL2Nhc3NfbG9nYmFja194bWxfZmlsZS5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNjRhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvY29uZmlndXJhdGlvbi9jYXNzX2xvZ2JhY2tfeG1sX2ZpbGUuYWRvYwpAQCAtMCwwICsxLDE5NyBAQAorPSBsb2diYWNrLnhtbCBmaWxlCisKK1RoZSBgbG9nYmFjay54bWxgIGNvbmZpZ3VyYXRpb24gZmlsZSBjYW4gb3B0aW9uYWxseSBzZXQgbG9nZ2luZyBsZXZlbHMKK2ZvciB0aGUgbG9ncyB3cml0dGVuIHRvIGBzeXN0ZW0ubG9nYCBhbmQgYGRlYnVnLmxvZ2AuIFRoZSBsb2dnaW5nIGxldmVscworY2FuIGFsc28gYmUgc2V0IHVzaW5nIGBub2RldG9vbCBzZXRsb2dnaW5nbGV2ZWxzYC4KKworPT0gT3B0aW9ucworCis9PT0gYGFwcGVuZGVyIG5hbWU9IjxhcHBlbmRlcl9jaG9pY2U+Ii4uLjwvYXBwZW5kZXI+YCAKKworU3BlY2lmeSBsb2cgdHlwZSBhbmQgc2V0dGluZ3MuIFBvc3NpYmxlIGFwcGVuZGVyIG5hbWVzIGFyZTogYFNZU1RFTUxPR2AsCitgREVCVUdMT0dgLCBgQVNZTkNERUJVR0xPR2AsIGFuZCBgU1RET1VUYC4gYFNZU1RFTUxPR2AgZW5zdXJlcyB0aGF0IFdBUk4KK2FuZCBFUlJPUiBtZXNzYWdlIGFyZSB3cml0dGVuIHN5bmNocm9ub3VzbHkgdG8gdGhlIHNwZWNpZmllZCBmaWxlLgorYERFQlVHTE9HYCBhbmQgYEFTWU5DREVCVUdMT0dgIGVuc3VyZSB0aGF0IERFQlVHIG1lc3NhZ2VzIGFyZSB3cml0dGVuCitlaXRoZXIgc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseSwgcmVzcGVjdGl2ZWx5LCB0byB0aGUgc3BlY2lmaWVkCitmaWxlLiBgU1RET1VUYCB3cml0ZXMgYWxsIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlIGluIGEgaHVtYW4tcmVhZGFibGUKK2Zvcm1hdC4KKworKkV4YW1wbGU6KiA8YXBwZW5kZXIgbmFtZT0iU1lTVEVNTE9HIgorY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5Sb2xsaW5nRmlsZUFwcGVuZGVyIj4KKworPT09IGA8ZmlsZT4gPGZpbGVuYW1lPiA8L2ZpbGU+YCAKKworU3BlY2lmeSB0aGUgZmlsZW5hbWUgZm9yIGEgbG9nLgorCisqRXhhbXBsZToqIDxmaWxlPiRce2Nhc3NhbmRyYS5sb2dkaXJ9L3N5c3RlbS5sb2c8L2ZpbGU+CisKKz09PSBgPGxldmVsPiA8bG9nX2xldmVsPiA8L2xldmVsPmAKKworU3BlY2lmeSB0aGUgbGV2ZWwgZm9yIGEgbG9nLiBQYXJ0IG9mIHRoZSBmaWx0ZXIuIExldmVscyBhcmU6IGBBTExgLAorYFRSQUNFYCwgYERFQlVHYCwgYElORk9gLCBgV0FSTmAsIGBFUlJPUmAsIGBPRkZgLiBgVFJBQ0VgIGNyZWF0ZXMgdGhlCittb3N0IHZlcmJvc2UgbG9nLCBgRVJST1JgIHRoZSBsZWFzdC4KKworW05PVEVdCisuTm90ZQorPT09PQorTm90ZTogSW5jcmVhc2luZyBsb2dnaW5nIGxldmVscyBjYW4gZ2VuZXJhdGUgaGVhdnkgbG9nZ2luZyBvdXRwdXQgb24KK2EgbW9kZXJhdGVseSB0cmFmZmlja2VkIGNsdXN0ZXIuIFlvdSBjYW4gdXNlIHRoZQorYG5vZGV0b29sIGdldGxvZ2dpbmdsZXZlbHNgIGNvbW1hbmQgdG8gc2VlIHRoZSBjdXJyZW50IGxvZ2dpbmcKK2NvbmZpZ3VyYXRpb24uCis9PT09CisKKypEZWZhdWx0OiogSU5GTworCisqRXhhbXBsZToqIDxsZXZlbD5JTkZPPC9sZXZlbD4KKworPT09IGA8cm9sbGluZ1BvbGljeSBjbGFzcz0iPHJvbGxpbmdfcG9saWN5X2Nob2ljZT4iIDxmaWxlTmFtZVBhdHRlcm4+PHBhdHRlcm5faW5mbz48L2ZpbGVOYW1lUGF0dGVybj4gLi4uIDwvcm9sbGluZ1BvbGljeT5gCisKK1NwZWNpZnkgdGhlIHBvbGljeSBmb3Igcm9sbGluZyBsb2dzIG92ZXIgdG8gYW4gYXJjaGl2ZS4KKworKkV4YW1wbGU6KiA8cm9sbGluZ1BvbGljeQorY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5TaXplQW5kVGltZUJhc2VkUm9sbGluZ1BvbGljeSI+CisKKz09PSBgPGZpbGVOYW1lUGF0dGVybj4gPHBhdHRlcm5faW5mbz4gPC9maWxlTmFtZVBhdHRlcm4+YAorCitTcGVjaWZ5IHRoZSBwYXR0ZXJuIGluZm9ybWF0aW9uIGZvciByb2xsaW5nIG92ZXIgdGhlIGxvZyB0byBhcmNoaXZlLgorUGFydCBvZiB0aGUgcm9sbGluZyBwb2xpY3kuCisKKypFeGFtcGxlOioKKzxmaWxlTmFtZVBhdHRlcm4+JFx7Y2Fzc2FuZHJhLmxvZ2Rpcn0vc3lzdGVtLmxvZy4lZFx7eXl5eS1NTS1kZH0uJWkuemlwPC9maWxlTmFtZVBhdHRlcm4+CisKKz09PSBgPG1heEZpbGVTaXplPiA8c2l6ZT4gPC9tYXhGaWxlU2l6ZT5gCisKK1NwZWNpZnkgdGhlIG1heGltdW0gZmlsZSBzaXplIHRvIHRyaWdnZXIgcm9sbGluZyBhIGxvZy4gUGFydCBvZiB0aGUKK3JvbGxpbmcgcG9saWN5LgorCisqRXhhbXBsZToqIDxtYXhGaWxlU2l6ZT41ME1CPC9tYXhGaWxlU2l6ZT4KKworPT09IGA8bWF4SGlzdG9yeT4gPG51bWJlcl9vZl9kYXlzPiA8L21heEhpc3Rvcnk+YAorCitTcGVjaWZ5IHRoZSBtYXhpbXVtIGhpc3RvcnkgaW4gZGF5cyB0byB0cmlnZ2VyIHJvbGxpbmcgYSBsb2cuIFBhcnQgb2YKK3RoZSByb2xsaW5nIHBvbGljeS4KKworKkV4YW1wbGU6KiA8bWF4SGlzdG9yeT43PC9tYXhIaXN0b3J5PgorCis9PT0gYDxlbmNvZGVyPiA8cGF0dGVybj4uLi48L3BhdHRlcm4+IDwvZW5jb2Rlcj5gCisKK1NwZWNpZnkgdGhlIGZvcm1hdCBvZiB0aGUgbWVzc2FnZS4gUGFydCBvZiB0aGUgcm9sbGluZyBwb2xpY3kuCisKKypFeGFtcGxlOiogPG1heEhpc3Rvcnk+NzwvbWF4SGlzdG9yeT4gKkV4YW1wbGU6KiA8ZW5jb2Rlcj4KKzxwYXR0ZXJuPiUtNWxldmVsIFsldGhyZWFkXSAlZGF0ZVx7SVNPODYwMX0gJUY6JUwgLSAlbXNnJW48L3BhdHRlcm4+Cis8L2VuY29kZXI+CisKKz09PSBMb2dnaW5nIHRvIENhc3NhbmRyYSB2aXJ0dWFsIHRhYmxlCisKK0l0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSBsb2diYWNrLnhtbCBpbiBzdWNoIGEgd2F5IHRoYXQgbG9ncyB3b3VsZCBhcHBlYXIgaW4gYHN5c3RlbV92aWV3cy5zeXN0ZW1fbG9nYCB0YWJsZS4KK1RoaXMgaXMgYWNoaWV2ZWQgYnkgYXBwZW5kZXIgaW1wbGVtZW50ZWQgaW4gY2xhc3MgYFZpcnR1YWxUYWJsZUFwcGVuZGVyYCB3aGljaCBpcyBjYWxsZWQgYENRTExPR2AgaW4gdGhlCitkZWZhdWx0IGNvbmZpZ3JhdGlvbi4gV2hlbiB0aGUgYXBwZW5kZXIgaXMgY29tbWVudGVkIG91dCwgbm8gc3lzdGVtIGxvZ3MgYXJlIHdyaXR0ZW4gdG8gdGhlIHZpcnR1YWwgdGFibGUuCisKK0NRTExPRyBhcHBlbmRlciBpcyBzcGVjaWFsIGFzIHRoZSB1bmRlcmx5aW5nIHN0cnVjdHVyZSBpdCBzYXZlcyBsb2cgbWVzc2FnZXMgaW50byBjYW4gbm90IGdyb3cgd2l0aG91dCBhbnkgYm91bmQKK2FzIGEgbm9kZSB3b3VsZCBydW4gb3V0IG9mIG1lbW9yeS4gRm9yIHRoaXMgcmVhc29uLCBgc3lzdGVtX2xvZ2AgdGFibGUgaXMgbGltaXRlZCBvbiBpdHMgc2l6ZS4KK0J5IGRlZmF1bHQsIGl0IGNhbiBob2xkIGF0IG1vc3QgNTAgMDAwIGxvZyBtZXNzYWdlcywgaXQgY2FuIG5ldmVyIGhvbGQgbW9yZSB0aGFuIDEwMCAwMDAgbG9nIG1lc3NhZ2VzLgorCitUbyBzcGVjaWZ5IGhvdyBtYW55IHJvd3MgeW91IHdhbnQgdGhhdCB2aXJ0dWFsIHRhYmxlIHRvIGhvbGQgYXQgbW9zdCwgdGhlcmUgaXMKK2Egc3lzdGVtIHByb3BlcnR5IGNhbGxlZCBgY2Fzc2FuZHJhLnZpcnR1YWwubG9ncy5tYXgucm93c2Agd2hpY2ggdGFrZXMgYW4gaW50ZWdlciBhcyB2YWx1ZS4KKworWW91IGNhbiBleGVjdXRlIENRTCBgdHJ1bmNhdGVgIHF1ZXJ5IGZvciBgc3lzdGVtX3ZpZXdzLnN5c3RlbV9sb2dgIGlmIHlvdSB3YW50IHRvIHdpcGUgb3V0IGFsbCB0aGUgbG9ncyBpbiB2aXJ0dWFsIHRhYmxlCit0byBlLmcuIHNhdmUgc29tZSBtZW1vcnkuCisKK0l0IGlzIHJlY29tbWVuZGVkIHRvIHNldCBmaWx0ZXIgdG8gYXQgbGVhc3QgYFdBUk5gIGxldmVsIHNvIHRoaXMgdGFibGUgaG9sZHMgb25seSBpbXBvcnRhbnQgbG9nZ2luZyBtZXNzYWdlcyBhcworZWFjaCBtZXNzYWdlIHdpbGwgb2NjdXB5IG1lbW9yeS4KKworVGhlIGFwcGVuZGVyIHRvIHZpcnR1YWwgdGFibGUgaXMgY29tbWVudGVkIG91dCBieSBkZWZhdWx0IHNvIGxvZ2dpbmcgdG8gdmlydHVhbCB0YWJsZSBpcyBub3QgYWN0aXZlLgorCis9PT0gQ29udGVudHMgb2YgZGVmYXVsdCBgbG9nYmFjay54bWxgCisKK1tzb3VyY2UsWE1MXQorLS0tLQorPGNvbmZpZ3VyYXRpb24gc2Nhbj0idHJ1ZSIgc2NhblBlcmlvZD0iNjAgc2Vjb25kcyI+CisgIDxqbXhDb25maWd1cmF0b3IgLz4KKworICA8IS0tIE5vIHNodXRkb3duIGhvb2s7IHdlIHJ1biBpdCBvdXJzZWx2ZXMgaW4gU3RvcmFnZVNlcnZpY2UgYWZ0ZXIgc2h1dGRvd24gLS0+CisKKyAgPCEtLSBTWVNURU1MT0cgcm9sbGluZyBmaWxlIGFwcGVuZGVyIHRvIHN5c3RlbS5sb2cgKElORk8gbGV2ZWwpIC0tPgorCisgIDxhcHBlbmRlciBuYW1lPSJTWVNURU1MT0ciIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuUm9sbGluZ0ZpbGVBcHBlbmRlciI+CisgICAgPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5maWx0ZXIuVGhyZXNob2xkRmlsdGVyIj4KKyAgPGxldmVsPklORk88L2xldmVsPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWxlPiR7Y2Fzc2FuZHJhLmxvZ2Rpcn0vc3lzdGVtLmxvZzwvZmlsZT4KKyAgICA8cm9sbGluZ1BvbGljeSBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5yb2xsaW5nLlNpemVBbmRUaW1lQmFzZWRSb2xsaW5nUG9saWN5Ij4KKyAgICAgIDwhLS0gcm9sbG92ZXIgZGFpbHkgLS0+CisgICAgICA8ZmlsZU5hbWVQYXR0ZXJuPiR7Y2Fzc2FuZHJhLmxvZ2Rpcn0vc3lzdGVtLmxvZy4lZHt5eXl5LU1NLWRkfS4laS56aXA8L2ZpbGVOYW1lUGF0dGVybj4KKyAgICAgIDwhLS0gZWFjaCBmaWxlIHNob3VsZCBiZSBhdCBtb3N0IDUwTUIsIGtlZXAgNyBkYXlzIHdvcnRoIG9mIGhpc3RvcnksIGJ1dCBhdCBtb3N0IDVHQiAtLT4KKyAgICAgIDxtYXhGaWxlU2l6ZT41ME1CPC9tYXhGaWxlU2l6ZT4KKyAgICAgIDxtYXhIaXN0b3J5Pjc8L21heEhpc3Rvcnk+CisgICAgICA8dG90YWxTaXplQ2FwPjVHQjwvdG90YWxTaXplQ2FwPgorICAgIDwvcm9sbGluZ1BvbGljeT4KKyAgICA8ZW5jb2Rlcj4KKyAgICAgIDxwYXR0ZXJuPiUtNWxldmVsIFsldGhyZWFkXSAlZGF0ZXtJU084NjAxfSAlRjolTCAtICVtc2clbjwvcGF0dGVybj4KKyAgICA8L2VuY29kZXI+CisgIDwvYXBwZW5kZXI+CisKKyAgPCEtLSBERUJVR0xPRyByb2xsaW5nIGZpbGUgYXBwZW5kZXIgdG8gZGVidWcubG9nIChhbGwgbGV2ZWxzKSAtLT4KKworICA8YXBwZW5kZXIgbmFtZT0iREVCVUdMT0ciIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLnJvbGxpbmcuUm9sbGluZ0ZpbGVBcHBlbmRlciI+CisgICAgPGZpbGU+JHtjYXNzYW5kcmEubG9nZGlyfS9kZWJ1Zy5sb2c8L2ZpbGU+CisgICAgPHJvbGxpbmdQb2xpY3kgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUucm9sbGluZy5TaXplQW5kVGltZUJhc2VkUm9sbGluZ1BvbGljeSI+CisgICAgICA8IS0tIHJvbGxvdmVyIGRhaWx5IC0tPgorICAgICAgPGZpbGVOYW1lUGF0dGVybj4ke2Nhc3NhbmRyYS5sb2dkaXJ9L2RlYnVnLmxvZy4lZHt5eXl5LU1NLWRkfS4laS56aXA8L2ZpbGVOYW1lUGF0dGVybj4KKyAgICAgIDwhLS0gZWFjaCBmaWxlIHNob3VsZCBiZSBhdCBtb3N0IDUwTUIsIGtlZXAgNyBkYXlzIHdvcnRoIG9mIGhpc3RvcnksIGJ1dCBhdCBtb3N0IDVHQiAtLT4KKyAgICAgIDxtYXhGaWxlU2l6ZT41ME1CPC9tYXhGaWxlU2l6ZT4KKyAgICAgIDxtYXhIaXN0b3J5Pjc8L21heEhpc3Rvcnk+CisgICAgICA8dG90YWxTaXplQ2FwPjVHQjwvdG90YWxTaXplQ2FwPgorICAgIDwvcm9sbGluZ1BvbGljeT4KKyAgICA8ZW5jb2Rlcj4KKyAgICAgIDxwYXR0ZXJuPiUtNWxldmVsIFsldGhyZWFkXSAlZGF0ZXtJU084NjAxfSAlRjolTCAtICVtc2clbjwvcGF0dGVybj4KKyAgICA8L2VuY29kZXI+CisgIDwvYXBwZW5kZXI+CisKKyAgPCEtLSBBU1lOQ0xPRyBhc3N5bmNocm9ub3VzIGFwcGVuZGVyIHRvIGRlYnVnLmxvZyAoYWxsIGxldmVscykgLS0+CisKKyAgPGFwcGVuZGVyIG5hbWU9IkFTWU5DREVCVUdMT0ciIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLkFzeW5jQXBwZW5kZXIiPgorICAgIDxxdWV1ZVNpemU+MTAyNDwvcXVldWVTaXplPgorICAgIDxkaXNjYXJkaW5nVGhyZXNob2xkPjA8L2Rpc2NhcmRpbmdUaHJlc2hvbGQ+CisgICAgPGluY2x1ZGVDYWxsZXJEYXRhPnRydWU8L2luY2x1ZGVDYWxsZXJEYXRhPgorICAgIDxhcHBlbmRlci1yZWYgcmVmPSJERUJVR0xPRyIgLz4KKyAgPC9hcHBlbmRlcj4KKworICA8IS0tIFNURE9VVCBjb25zb2xlIGFwcGVuZGVyIHRvIHN0ZG91dCAoSU5GTyBsZXZlbCkgLS0+CisKKyAgPGFwcGVuZGVyIG5hbWU9IlNURE9VVCIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuQ29uc29sZUFwcGVuZGVyIj4KKyAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmZpbHRlci5UaHJlc2hvbGRGaWx0ZXIiPgorICAgICAgPGxldmVsPklORk88L2xldmVsPgorICAgIDwvZmlsdGVyPgorICAgIDxlbmNvZGVyPgorICAgICAgPHBhdHRlcm4+JS01bGV2ZWwgWyV0aHJlYWRdICVkYXRle0lTTzg2MDF9ICVGOiVMIC0gJW1zZyVuPC9wYXR0ZXJuPgorICAgIDwvZW5jb2Rlcj4KKyAgPC9hcHBlbmRlcj4KKworICA8IS0tIFVuY29tbWVudCBiZWxsb3cgYW5kIGNvcnJlc3BvbmRpbmcgYXBwZW5kZXItcmVmIHRvIGFjdGl2YXRlIGxvZ2JhY2sgbWV0cmljcworICA8YXBwZW5kZXIgbmFtZT0iTG9nYmFja01ldHJpY3MiIGNsYXNzPSJjb20uY29kYWhhbGUubWV0cmljcy5sb2diYWNrLkluc3RydW1lbnRlZEFwcGVuZGVyIiAvPgorICAgLS0+CisKKyAgPCEtLSBVbmNvbW1lbnQgYmVsb3cgY29uZmlndXJhdGlvbiBhbmQgY29ycmVzcG9uZGluZyBhcHBlbmRlci1yZWYgdG8gYWN0aXZhdGUKKyAgbG9nZ2luZyBpbnRvIHN5c3RlbV92aWV3cy5zeXN0ZW1fbG9ncyB2aXJ0dWFsIHRhYmxlLiAtLT4KKyAgPCEtLSA8YXBwZW5kZXIgbmFtZT0iQ1FMTE9HIiBjbGFzcz0ib3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubG9nZ2luZy5WaXJ0dWFsVGFibGVBcHBlbmRlciI+CisgICAgPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5maWx0ZXIuVGhyZXNob2xkRmlsdGVyIj4KKyAgICAgIDxsZXZlbD5XQVJOPC9sZXZlbD4KKyAgICA8L2ZpbHRlcj4KKyAgPC9hcHBlbmRlcj4gLS0+CisKKyAgPHJvb3QgbGV2ZWw9IklORk8iPgorICAgIDxhcHBlbmRlci1yZWYgcmVmPSJTWVNURU1MT0ciIC8+CisgICAgPGFwcGVuZGVyLXJlZiByZWY9IlNURE9VVCIgLz4KKyAgICA8YXBwZW5kZXItcmVmIHJlZj0iQVNZTkNERUJVR0xPRyIgLz4gPCEtLSBDb21tZW50IHRoaXMgbGluZSB0byBkaXNhYmxlIGRlYnVnLmxvZyAtLT4KKyAgICA8IS0tCisgICAgPGFwcGVuZGVyLXJlZiByZWY9IkxvZ2JhY2tNZXRyaWNzIiAvPgorICAgIC0tPgorICAgIDwhLS0KKyAgICA8YXBwZW5kZXItcmVmIHJlZj0iQ1FMTE9HIi8+CisgICAgLS0+CisgIDwvcm9vdD4KKworICA8bG9nZ2VyIG5hbWU9Im9yZy5hcGFjaGUuY2Fzc2FuZHJhIiBsZXZlbD0iREVCVUciLz4KKzwvY29uZmlndXJhdGlvbj4KKy0tLS0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jb25maWd1cmF0aW9uL2Nhc3NfcmFja2RjX2ZpbGUuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9jb25maWd1cmF0aW9uL2Nhc3NfcmFja2RjX2ZpbGUuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NvbmZpZ3VyYXRpb24vY2Fzc19yYWNrZGNfZmlsZS5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvY29uZmlndXJhdGlvbi9jYXNzX3JhY2tkY19maWxlLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jb25maWd1cmF0aW9uL2Nhc3NfdG9wb19maWxlLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvY29uZmlndXJhdGlvbi9jYXNzX3RvcG9fZmlsZS5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY29uZmlndXJhdGlvbi9jYXNzX3RvcG9fZmlsZS5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvY29uZmlndXJhdGlvbi9jYXNzX3RvcG9fZmlsZS5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvY29uZmlndXJhdGlvbi9jb25maWd1cmF0aW9uLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9jb25maWd1cmF0aW9uL2NvbmZpZ3VyYXRpb24uYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL2NvbmZpZ3VyYXRpb24vY29uZmlndXJhdGlvbi5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvY29uZmlndXJhdGlvbi9pbmRleC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL2NvbmZpZ3VyYXRpb24vaW5kZXguYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL2NvbmZpZ3VyYXRpb24vaW5kZXguYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL2NvbmZpZ3VyYXRpb24vaW5kZXguYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9hdWRpdF9sb2dnaW5nLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2F1ZGl0X2xvZ2dpbmcuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9hdWRpdF9sb2dnaW5nLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvYXVkaXRfbG9nZ2luZy5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2F1ZGl0bG9nZ2luZy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9hdWRpdGxvZ2dpbmcuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODNjNWFhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9hdWRpdGxvZ2dpbmcuYWRvYwpAQCAtMCwwICsxLDU0OSBAQAorPSBBdWRpdCBMb2dnaW5nCisKK0F1ZGl0IExvZ2dpbmcgaXMgYSBuZXcgZmVhdHVyZSBpbiBBcGFjaGUgQ2Fzc2FuZHJhIDQuMCAoaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTIxNTFbQ0FTU0FORFJBLTEyMTUxXSkuCitUaGlzIG5ldyBmZWF0dXJlIGlzIHNhZmUgZm9yIHByb2R1Y3Rpb24gdXNlLCB3aXRoIGNvbmZpZ3VyYWJsZSBsaW1pdHMgdG8gaGVhcCBtZW1vcnkgYW5kIGRpc2sgc3BhY2UgdG8gcHJldmVudCBvdXQtb2YtbWVtb3J5IGVycm9ycy4KK0FsbCBkYXRhYmFzZSBhY3Rpdml0eSBpcyBsb2dnZWQgcGVyLW5vZGUgYXMgZmlsZS1iYXNlZCByZWNvcmRzIHRvIGEgc3BlY2lmaWVkIGxvY2FsIGZpbGVzeXN0ZW0gZGlyZWN0b3J5LiAKK1RoZSBhdWRpdCBsb2cgZmlsZXMgYXJlIHJvbGxlZCBwZXJpb2RpY2FsbHkgYmFzZWQgb24gYSBjb25maWd1cmFibGUgdmFsdWUuIAorCitTb21lIG9mIHRoZSBmZWF0dXJlcyBvZiBhdWRpdCBsb2dnaW5nIGFyZToKKworKiBObyBhZGRpdGlvbmFsIGRhdGFiYXNlIGNhcGFjaXR5IGlzIG5lZWRlZCB0byBzdG9yZSBhdWRpdCBsb2dzLgorKiBObyBxdWVyeSB0b29sIGlzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSBhdWRpdCBsb2dzLgorKiBMYXRlbmN5IG9mIGRhdGFiYXNlIG9wZXJhdGlvbnMgaXMgbm90IGFmZmVjdGVkLCBzbyB0aGVyZSBpcyBubyBwZXJmb3JtYW5jZSBpbXBhY3QuCisqIEhlYXAgbWVtb3J5IHVzYWdlIGlzIGJvdW5kZWQgYnkgYSB3ZWlnaHRlZCBxdWV1ZSwgd2l0aCBjb25maWd1cmFibGUgbWF4aW11bSB3ZWlnaHQgc2l0dGluZyBpbiBmcm9udCBvZiBsb2dnaW5nIHRocmVhZC4KKyogRGlzayB1dGlsaXphdGlvbiBpcyBib3VuZGVkIGJ5IGEgY29uZmlndXJhYmxlIHNpemUsIGRlbGV0aW5nIG9sZCBsb2cgc2VnbWVudHMgb25jZSB0aGUgbGltaXQgaXMgcmVhY2hlZC4KKyogQ2FuIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgYXQgc3RhcnR1cCB0aW1lIHVzaW5nIGBjYXNzYW5kcmEueWFtbGAgb3IgYXQgcnVudGltZSB1c2luZyB0aGUgSk1YIHRvb2wsIGBgbm9kZXRvb2xgYC4KKyogQ2FuIGNvbmZpZ3VyZSB0aGUgc2V0dGluZ3MgaW4gZWl0aGVyIHRoZSBgY2Fzc2FuZHJhLnlhbWxgIGZpbGUgb3IgYnkgdXNpbmcgYGBub2RldG9vbGBgLgorCitBdWRpdCBsb2dnaW5nIGluY2x1ZGVzIGFsbCBDUUwgcmVxdWVzdHMsIGJvdGggc3VjY2Vzc2Z1bCBhbmQgZmFpbGVkLiAKK0l0IGFsc28gY2FwdHVyZXMgYWxsIHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCBhdXRoZW50aWNhdGlvbiBhbmQgYXV0aG9yaXphdGlvbiBldmVudHMsIHN1Y2ggYXMgbG9naW4gYXR0ZW1wdHMuIAorVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBGdWxsIFF1ZXJ5IExvZ2dpbmcgKEZRTCkgYW5kIGF1ZGl0IGxvZ2dpbmcgaXMgdGhhdCBGUUwgY2FwdHVyZXMgb25seSBzdWNjZXNzZnVsIENRTCByZXF1ZXN0cywgd2hpY2ggYWxsb3cgcmVwbGF5IG9yIGNvbXBhcmlzb24gb2YgbG9ncy4KK0F1ZGl0IGxvZ3MgYXJlIHVzZWZ1bCBmb3IgY29tcGxpYW5jZSBhbmQgZGVidWdnaW5nLCB3aGlsZSBGUUwgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcsIHBlcmZvcm1hbmNlIGJlbmNobWFya2luZywgdGVzdGluZyBhbmQgYXVkaXRpbmcgQ1FMIHF1ZXJpZXMuCisKKz09IEF1ZGl0IGluZm9ybWF0aW9uIGxvZ2dlZAorCitUaGUgYXVkaXQgbG9nIGNvbnRhaW5zOgorCisqIGFsbCBldmVudHMgaW4gdGhlIGNvbmZpZ3VyZWQga2V5c3BhY2VzIHRvIGluY2x1ZGUKKyogYWxsIGV2ZW50cyBpbiB0aGUgY29uZmlndXJlZCBjYXRlZ29yaWVzIHRvIGluY2x1ZGUKKyogYWxsIGV2ZW50cyBleGVjdXRlZCBieSB0aGUgY29uZmlndXJlZCB1c2VycyB0byBpbmNsdWRlCisKK1RoZSBhdWRpdCBsb2cgZG9lcyBub3QgY29udGFpbjoKKworKiBjb25maWd1cmF0aW9uIGNoYW5nZXMgbWFkZSBpbiBgY2Fzc2FuZHJhLnlhbWxgIGZpbGUKKyogYG5vZGV0b29sYCBjb21tYW5kcworKiBQYXNzd29yZHMgbWVudGlvbmVkIGFzIHBhcnQgb2YgRENMIHN0YXRlbWVudHM6IFBhc3N3b3JkcyB3aWxsIGJlIG9iZnVzY2F0ZWQgYXMgXCpcKlwqXCpcKlwqXCouCisgKiogU3RhdGVtZW50cyB0aGF0IGZhaWwgdG8gcGFyc2Ugd2lsbCBoYXZlIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHdvcmQgcGFzc3dvcmQgb2JmdXNjYXRlZCBhcyBcKlwqXCpcKlwqXCpcKi4KKyAqKiBTdGF0ZW1lbnRzIHdpdGggYSBtaXN0eXBlZCB3b3JkICdwYXNzd29yZCcgd2lsbCBiZSBsb2dnZWQgd2l0aG91dCBvYmZ1c2NhdGlvbi4gUGxlYXNlIG1ha2Ugc3VyZSB0byB1c2UgYSBkaWZmZXJlbnQgcGFzc3dvcmQgb24gcmV0cmllcy4KKworVGhlIGF1ZGl0IGxvZyBpcyBhIHNlcmllcyBvZiBsb2cgZW50cmllcy4gCitBbiBhdWRpdCBsb2cgZW50cnkgY29udGFpbnM6CisKKyoga2V5c3BhY2UgKFN0cmluZykgLSBLZXlzcGFjZSBvbiB3aGljaCByZXF1ZXN0IGlzIG1hZGUKKyogb3BlcmF0aW9uIChTdHJpbmcpIC0gRGF0YWJhc2Ugb3BlcmF0aW9uIHN1Y2ggYXMgQ1FMIGNvbW1hbmQKKyogdXNlciAoU3RyaW5nKSAtIFVzZXIgbmFtZQorKiBzY29wZSAoU3RyaW5nKSAtIFNjb3BlIG9mIHJlcXVlc3Qgc3VjaCBhcyBUYWJsZS9GdW5jdGlvbi9BZ2dyZWdhdGUgbmFtZQorKiB0eXBlIChBdWRpdExvZ0VudHJ5VHlwZSkgLSBUeXBlIG9mIHJlcXVlc3QKKyoqIENRTCBBdWRpdCBMb2cgRW50cnkgVHlwZQorKiogQ29tbW9uIEF1ZGl0IExvZyBFbnRyeSBUeXBlCisqIHNvdXJjZSAoSW5ldEFkZHJlc3NBbmRQb3J0KSAtIFNvdXJjZSBJUCBBZGRyZXNzIGZyb20gd2hpY2ggcmVxdWVzdCBvcmlnaW5hdGVkCisqIHRpbWVzdGFtcCAobG9uZyApIC0gVGltZXN0YW1wIG9mIHRoZSByZXF1ZXN0CisqIGJhdGNoIChVVUlEKSAtIEJhdGNoIG9mIHJlcXVlc3QKKyogb3B0aW9ucyAoUXVlcnlPcHRpb25zKSAtIENRTCBRdWVyeSBvcHRpb25zCisqIHN0YXRlIChRdWVyeVN0YXRlKSAtIFN0YXRlIHJlbGF0ZWQgdG8gYSBnaXZlbiBxdWVyeQorCitFYWNoIGVudHJ5IGNvbnRhaW5zIGFsbCBhcHBsaWNhYmxlIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBldmVudCwgY29uY2F0ZW5hdGVkIHdpdGggYSBwaXBlICh8KS4KKworQ1FMIGF1ZGl0IGxvZyBlbnRyeSB0eXBlcyBhcmUgdGhlIGZvbGxvd2luZyBDUUwgY29tbWFuZHMuIEVhY2ggY29tbWFuZCBpcyBhc3NpZ25lZCB0byBhIHBhcnRpY3VsYXIgc3BlY2lmaWVkIGNhdGVnb3J5IHRvIGxvZzoKKworW3dpZHRoPSIxMDAlIixjb2xzPSIyMCUsODAlIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3wgQ2F0ZWdvcnkgfCBDUUwgY29tbWFuZHMKKworfCBEREwgfCBBTFRFUl9LRVlTUEFDRSwgQ1JFQVRFX0tFWVNQQUNFLCBEUk9QX0tFWVNQQUNFLCAKK0FMVEVSX1RBQkxFLCBDUkVBVEVfVEFCTEUsIERST1BfVEFCTEUsIAorQ1JFQVRFX0ZVTkNUSU9OLCBEUk9QX0ZVTkNUSU9OLCAKK0NSRUFURV9BR0dSRUdBVEUsIERST1BfQUdHUkVHQVRFLCAKK0NSRUFURV9JTkRFWCwgRFJPUF9JTkRFWCwgCitBTFRFUl9UWVBFLCBDUkVBVEVfVFlQRSwgRFJPUF9UWVBFLAorQ1JFQVRFX1RSSUdHRVIsIERST1BfVFJJR0dFUiwKK0FMVEVSX1ZJRVcsIENSRUFURV9WSUVXLCBEUk9QX1ZJRVcsCitUUlVOQ0FURQorfCBETUwgfCBCQVRDSCwgREVMRVRFLCBVUERBVEUKK3wgRENMIHwgR1JBTlQsIFJFVk9LRSwgCitBTFRFUl9ST0xFLCBDUkVBVEVfUk9MRSwgRFJPUF9ST0xFLCAKK0xJU1RfUk9MRVMsIExJU1RfUEVSTUlTU0lPTlMsIExJU1RfVVNFUlMKK3wgT1RIRVIgfCBVU0VfS0VZU1BBQ0UKK3wgUVVFUlkgfCBTRUxFQ1QKK3wgUFJFUEFSRSB8IFBSRVBBUkVfU1RBVEVNRU5UCit8PT09CisKK0NvbW1vbiBhdWRpdCBsb2cgZW50cnkgdHlwZXMgYXJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCitbd2lkdGg9IjEwMCUiLGNvbHM9IjUwJSw1MCUiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfCBDYXRlZ29yeSB8IENRTCBjb21tYW5kcworCit8IEFVVEggfCBMT0dJTl9TVUNDRVNTLCBMT0dJTl9FUlJPUiwgVU5BVVRIT1JJWkVEX0FUVEVNUFQKK3wgRVJST1IgfCBSRVFVRVNUX0ZBSUxVUkUKK3w9PT0KKworPT0gQXZhaWxhYmlsaXR5IGFuZCBkdXJhYmlsaXR5CisKK05PVEU6IFVubGlrZSBkYXRhLCBhdWRpdCBsb2cgZW50cmllcyBhcmUgbm90IHJlcGxpY2F0ZWQKKworRm9yIGEgZ2l2ZW4gcXVlcnksIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGl0IGVudHJ5IGlzIG9ubHkgc3RvcmVkIG9uIHRoZSBjb29yZGluYXRvciBub2RlLgorRm9yIGV4YW1wbGUsIGFuIGBgSU5TRVJUYGAgaW4gYSBrZXlzcGFjZSB3aXRoIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAzIHdpbGwgcHJvZHVjZSBhbiBhdWRpdCBlbnRyeSBvbiBvbmUgbm9kZSwgdGhlIGNvb3JkaW5hdG9yIHdobyBoYW5kbGVkIHRoZSByZXF1ZXN0LCBhbmQgbm90IG9uIHRoZSB0d28gb3RoZXIgbm9kZXMuCitGb3IgdGhpcyByZWFzb24sIGFuZCBkZXBlbmRpbmcgb24gY29tcGxpYW5jZSByZXF1aXJlbWVudHMgeW91IG11c3QgbWVldCwKK21ha2Ugc3VyZSB0aGF0IGF1ZGl0IGxvZ3MgYXJlIHN0b3JlZCBvbiBhIG5vbi1lcGhlbWVyYWwgc3RvcmFnZS4KKworWW91IGNhbiBhY2hpZXZlIGN1c3RvbSBuZWVkcyB3aXRoIHRoZSA8PGFyY2hpdmVfY29tbWFuZD4+IG9wdGlvbi4KKworPT0gQ29uZmlndXJpbmcgYXVkaXQgbG9nZ2luZyBpbiBjYXNzYW5kcmEueWFtbAorCitUaGUgYGNhc3NhbmRyYS55YW1sYCBmaWxlIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSBhbmQgZW5hYmxlIGF1ZGl0IGxvZ2dpbmcuCitDb25maWd1cmF0aW9uIGFuZCBlbmFibGVtZW50IG1heSBiZSB0aGUgc2FtZSBvciBkaWZmZXJlbnQgb24gZWFjaCBub2RlLCBkZXBlbmRpbmcgb24gdGhlIGBjYXNzYW5kcmEueWFtbGAgZmlsZSBzZXR0aW5ncy4KKworQXVkaXQgbG9nZ2luZyBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHVzaW5nIGBgbm9kZXRvb2xgYCB3aGVuIGVuYWJsaW5nIHRoZSBmZWF0dXJlLCBhbmQgd2lsbCBvdmVycmlkZSBhbnkgdmFsdWVzIHNldCBpbiB0aGUgYGNhc3NhbmRyYS55YW1sYCBmaWxlLCBhcyBkaXNjdXNzZWQgaW4gPDxlbmFibGluZ19hdWRpdF93aXRoX25vZGV0b29sLCBFbmFibGluZyBBdWRpdCBMb2dnaW5nIHdpdGggbm9kZXRvb2w+Pi4KKworQXVkaXQgbG9ncyBhcmUgZ2VuZXJhdGVkIG9uIGVhY2ggZW5hYmxlZCBub2RlLCBzbyBsb2dzIG9uIGVhY2ggbm9kZSB3aWxsIGhhdmUgdGhhdCBub2RlJ3MgcXVlcmllcy4KK0FsbCBvcHRpb25zIGZvciBhdWRpdCBsb2dnaW5nIGNhbiBiZSBzZXQgaW4gdGhlIGBjYXNzYW5kcmEueWFtbGAgZmlsZSB1bmRlciB0aGUgYGBhdWRpdF9sb2dnaW5nX29wdGlvbnM6YGAuCisKK1RoZSBmaWxlIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0aGF0IGNhbiBiZSB1bmNvbW1lbnRlZCBmb3IgdXNlOgorCitbc291cmNlLCB5YW1sXQorLS0tLQorIyBBdWRpdCBsb2dnaW5nIC0gTG9ncyBldmVyeSBpbmNvbWluZyBDUUwgY29tbWFuZCByZXF1ZXN0LCBhdXRoZW50aWNhdGlvbiB0byBhIG5vZGUuIFNlZSB0aGUgZG9jcworIyBvbiBhdWRpdF9sb2dnaW5nIGZvciBmdWxsIGRldGFpbHMgYWJvdXQgdGhlIHZhcmlvdXMgY29uZmlndXJhdGlvbiBvcHRpb25zLgorYXVkaXRfbG9nZ2luZ19vcHRpb25zOgorICAgIGVuYWJsZWQ6IGZhbHNlCisgICAgbG9nZ2VyOgorICAgICAgLSBjbGFzc19uYW1lOiBCaW5BdWRpdExvZ2dlcgorICAgICMgYXVkaXRfbG9nc19kaXI6CisgICAgIyBpbmNsdWRlZF9rZXlzcGFjZXM6CisgICAgIyBleGNsdWRlZF9rZXlzcGFjZXM6IHN5c3RlbSwgc3lzdGVtX3NjaGVtYSwgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hCisgICAgIyBpbmNsdWRlZF9jYXRlZ29yaWVzOgorICAgICMgZXhjbHVkZWRfY2F0ZWdvcmllczoKKyAgICAjIGluY2x1ZGVkX3VzZXJzOgorICAgICMgZXhjbHVkZWRfdXNlcnM6CisgICAgIyByb2xsX2N5Y2xlOiBIT1VSTFkKKyAgICAjIGJsb2NrOiB0cnVlCisgICAgIyBtYXhfcXVldWVfd2VpZ2h0OiAyNjg0MzU0NTYgIyAyNTYgTWlCCisgICAgIyBtYXhfbG9nX3NpemU6IDE3MTc5ODY5MTg0ICMgMTYgR2lCCisgICAgIyMgYXJjaGl2ZSBjb21tYW5kIGlzICIvcGF0aC90by9zY3JpcHQuc2ggJXBhdGgiIHdoZXJlICVwYXRoIGlzIHJlcGxhY2VkIHdpdGggdGhlIGZpbGUgYmVpbmcgcm9sbGVkOgorICAgICMgYXJjaGl2ZV9jb21tYW5kOgorICAgICMgbWF4X2FyY2hpdmVfcmV0cmllczogMTAKKy0tLS0KKworPT09IGVuYWJsZWQKKworQ29udHJvbCB3aGV0aGVyIGF1ZGl0IGxvZ2dpbmcgaXMgZW5hYmxlZCBvciBkaXNhYmxlZCAoZGVmYXVsdCkuCisKK1RvIGVuYWJsZSBhdWRpdCBsb2dnaW5nIHNldCBgYGVuYWJsZWQ6IHRydWVgYC4KKworSWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgYXVkaXQgbG9nZ2luZyB3aWxsIHN0YXJ0IHdoZW4gQ2Fzc2FuZHJhIGlzIHN0YXJ0ZWQuCitJdCBjYW4gYmUgZGlzYWJsZWQgYWZ0ZXJ3YXJkcyBhdCBydW50aW1lIHdpdGggPDxlbmFibGluZ19hdWRpdF93aXRoX25vZGV0b29sLCBub2RldG9vbD4+LgorCitUSVA6IFlvdSBjYW4gbW9uaXRvciB3aGV0aGVyIGF1ZGl0IGxvZ2dpbmcgaXMgZW5hYmxlZCB3aXRoIGBgQXVkaXRMb2dFbmFibGVkYGAgYXR0cmlidXRlIG9mIHRoZSBKTVggTUJlYW4gYGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPVN0b3JhZ2VTZXJ2aWNlYGAuCisKKz09PSBsb2dnZXIKKworVGhlIHR5cGUgb2YgYXVkaXQgbG9nZ2VyIGlzIHNldCB3aXRoIHRoZSBgbG9nZ2VyYCBvcHRpb24uIAorU3VwcG9ydGVkIHZhbHVlcyBhcmU6CisKKy0gYEJpbkF1ZGl0TG9nZ2VyYCAoZGVmYXVsdCkKKy0gYEZpbGVBdWRpdExvZ2dlcmAKKy0gYE5vT3BBdWRpdExvZ2dlcmAKKworYEJpbkF1ZGl0TG9nZ2VyYCBsb2dzIGV2ZW50cyB0byBhIGZpbGUgaW4gYmluYXJ5IGZvcm1hdC4KK2BGaWxlQXVkaXRMb2dnZXJgIHVzZXMgdGhlIHN0YW5kYXJkIGxvZ2dpbmcgbWVjaGFuaXNtLCBgc2xmNGpgIHRvIGxvZyBldmVudHMgdG8gdGhlIGBhdWRpdC9hdWRpdC5sb2dgIGZpbGUuIEl0IGlzIGEgc3luY2hyb25vdXMsIGZpbGUtYmFzZWQgYXVkaXQgbG9nZ2VyLiBUaGUgcm9sbF9jeWNsZSB3aWxsIGJlIHNldCBpbiB0aGUgYGxvZ2JhY2sueG1sYCBmaWxlLgorYE5vT3BBdWRpdExvZ2dlcmAgaXMgYSBuby1vcCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYXVkaXQgbG9nZ2VyIHRoYXQgc2hvdWRsIGJlIHNwZWNpZmllZCB3aGVuIGF1ZGl0IGxvZ2dpbmcgaXMgZGlzYWJsZWQuCisKK0ZvciBleGFtcGxlOgorCitbc291cmNlLCB5YW1sXQorLS0tLQorbG9nZ2VyOiAKKyAgLSBjbGFzc19uYW1lOiBGaWxlQXVkaXRMb2dnZXIKKy0tLS0KKworVElQOiAgYEJpbkF1ZGl0TG9nZ2VyYCBtYWtlIHVzZSBvZiBvcGVuIHNvdXJjZSBodHRwczovL2dpdGh1Yi5jb20vT3BlbkhGVC9DaHJvbmljbGUtUXVldWVbQ2hyb25pY2xlIFF1ZXVlXSB1bmRlciB0aGUgaG9vZC4gSWYgeW91IGNvbnNpZGVyIHVzaW5nIGF1ZGl0IGxvZ2dpbmcgZm9yIHJlZ3VsYXRvcnkgY29tcGxpYW5jZSBwdXJwb3NlLCBpdCBtaWdodCBiZSB3aXNlIHRvIGJlIHNvbWV3aGF0IGZhbWlsaWFyIHdpdGggdGhpcyBsaWJyYXJ5LiBTZWUgPDxhcmNoaXZlX2NvbW1hbmQ+PiBhbmQgPDxyb2xsX2N5Y2xlPj4gZm9yIGFuIGV4YW1wbGUgb2YgdGhlIGltcGxpY2F0aW9ucy4KKworPT09IGF1ZGl0X2xvZ3NfZGlyCisKK1RvIHdyaXRlIGF1ZGl0IGxvZ3MsIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSBtdXN0IGJlIHNldCBpbiBgYGF1ZGl0X2xvZ3NfZGlyYGAuCisKK1RoZSBkaXJlY3RvcnkgbXVzdCBoYXZlIGFwcHJvcHJpYXRlIHBlcm1pc3Npb25zIHNldCB0byBhbGxvdyByZWFkaW5nLCB3cml0aW5nLCBhbmQgZXhlY3V0aW5nLgorTG9nZ2luZyB3aWxsIHJlY3Vyc2l2ZWx5IGRlbGV0ZSB0aGUgZGlyZWN0b3J5IGNvbnRlbnRzIGFzIG5lZWRlZC4KK0RvIG5vdCBwbGFjZSBsaW5rcyBpbiB0aGlzIGRpcmVjdG9yeSB0byBvdGhlciBzZWN0aW9ucyBvZiB0aGUgZmlsZXN5c3RlbS4KK0ZvciBleGFtcGxlLCBgYGF1ZGl0X2xvZ3NfZGlyOiAvbm9uX2VwaGVtZXJhbF9zdG9yYWdlL2F1ZGl0L2xvZ3MvaG91cmx5YGAuCisKK1RoZSBhdWRpdCBsb2cgZGlyZWN0b3J5IGNhbiBhbHNvIGJlIGNvbmZpZ3VyZWQgdXNpbmcgdGhlIHN5c3RlbSBwcm9wZXJ0eSBgY2Fzc2FuZHJhLmxvZ2Rpci5hdWRpdGAsIHdoaWNoIGJ5IGRlZmF1bHQgaXMgc2V0IHRvIGBjYXNzYW5kcmEubG9nZGlyICsgL2F1ZGl0L2AuCisKKz09PSBpbmNsdWRlZF9rZXlzcGFjZXMgYW5kIGV4Y2x1ZGVkX2tleXNwYWNlcworCitTZXQgdGhlIGtleXNwYWNlcyB0byBpbmNsdWRlIHdpdGggdGhlIGBpbmNsdWRlZF9rZXlzcGFjZXNgIG9wdGlvbiBhbmQKK3RoZSBrZXlzcGFjZXMgdG8gZXhjbHVkZSB3aXRoIHRoZSBgZXhjbHVkZWRfa2V5c3BhY2VzYCBvcHRpb24uIAorQnkgZGVmYXVsdCwgYHN5c3RlbWAsIGBzeXN0ZW1fc2NoZW1hYCBhbmQgYHN5c3RlbV92aXJ0dWFsX3NjaGVtYWAgYXJlIGV4Y2x1ZGVkLCBhbmQgYWxsIG90aGVyIGtleXNwYWNlcyBhcmUgaW5jbHVkZWQuCisKK0ZvciBleGFtcGxlOgorW3NvdXJjZSwgeWFtbF0KKy0tLS0KK2luY2x1ZGVkX2tleXNwYWNlczogdGVzdCwgZGVtbworZXhjbHVkZWRfa2V5c3BhY2VzOiBzeXN0ZW0sIHN5c3RlbV9zY2hlbWEsIHN5c3RlbV92aXJ0dWFsX3NjaGVtYQorLS0tLQorCis9PT0gaW5jbHVkZWRfY2F0ZWdvcmllcyBhbmQgZXhjbHVkZWRfY2F0ZWdvcmllcworCitUaGUgY2F0ZWdvcmllcyBvZiBkYXRhYmFzZSBvcGVyYXRpb25zIHRvIGluY2x1ZGUgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSBgaW5jbHVkZWRfY2F0ZWdvcmllc2Agb3B0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QuIAorVGhlIGNhdGVnb3JpZXMgb2YgZGF0YWJhc2Ugb3BlcmF0aW9ucyB0byBleGNsdWRlIGFyZSBzcGVjaWZpZWQgd2l0aCBgZXhjbHVkZWRfY2F0ZWdvcmllc2Agb3B0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QuIAorVGhlIHN1cHBvcnRlZCBjYXRlZ29yaWVzIGZvciBhdWRpdCBsb2cgYXJlOiBgQVVUSGAsIGBEQ0xgLCBgRERMYCwgYERNTGAsIGBFUlJPUmAsIGBPVEhFUmAsIGBQUkVQQVJFYCwgYW5kIGBRVUVSWWAuCitCeSBkZWZhdWx0LCBhbGwgc3VwcG9ydGVkIGNhdGVnb3JpZXMgYXJlIGluY2x1ZGVkLCBhbmQgbm8gY2F0ZWdvcnkgaXMgZXhjbHVkZWQuCisKK1tzb3VyY2UsIHlhbWxdCistLS0tCitpbmNsdWRlZF9jYXRlZ29yaWVzOiBBVVRILCBFUlJPUiwgRENMCitleGNsdWRlZF9jYXRlZ29yaWVzOiBEREwsIERNTCwgUVVFUlksIFBSRVBBUkUKKy0tLS0KKworPT09IGluY2x1ZGVkX3VzZXJzIGFuZCBleGNsdWRlZF91c2VycworCitVc2VycyB0byBhdWRpdCBsb2cgYXJlIHNldCB3aXRoIHRoZSBgaW5jbHVkZWRfdXNlcnNgIGFuZCBgZXhjbHVkZWRfdXNlcnNgIG9wdGlvbnMuIAorVGhlIGBpbmNsdWRlZF91c2Vyc2Agb3B0aW9uIHNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHVzZXJzIHRvIGluY2x1ZGUgZXhwbGljaXRseS4KK1RoZSBgZXhjbHVkZWRfdXNlcnNgIG9wdGlvbiBzcGVjaWZpZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB1c2VycyB0byBleGNsdWRlIGV4cGxpY2l0bHkuCitCeSBkZWZhdWx0LCBhbGwgdXNlcnMgYXJlIGluY2x1ZGVkLCBhbmQgbm8gdXNlcnMgYXJlIGV4Y2x1ZGVkLgorCitbc291cmNlLCB5YW1sXQorLS0tLQoraW5jbHVkZWRfdXNlcnM6IAorZXhjbHVkZWRfdXNlcnM6IGpvaG4sIG1hcnkKKy0tLS0KKworW1tyb2xsX2N5Y2xlXV0KKz09PSByb2xsX2N5Y2xlCisKK1RoZSBgYHJvbGxfY3ljbGVgYCBkZWZpbmVzIHRoZSBmcmVxdWVuY3kgd2l0aCB3aGljaCB0aGUgYXVkaXQgbG9nIHNlZ21lbnRzIGFyZSByb2xsZWQuCitTdXBwb3J0ZWQgdmFsdWVzIGFyZToKKworLSBgYE1JTlVURUxZYGAKKy0gYGBGSVZFX01JTlVURUxZYGAKKy0gYGBURU5fTUlOVVRFTFlgYAorLSBgYFRXRU5UWV9NSU5VVEVMWWBgCistIGBgSEFMRl9IT1VSTFlgYAorLSBgYEhPVVJMWWBgIChkZWZhdWx0KQorLSBgYFRXT19IT1VSTFlgYAorLSBgYEZPVVJfSE9VUkxZYGAKKy0gYGBTSVhfSE9VUkxZYGAKKy0gYGBEQUlMWWBgCisKK0ZvciBleGFtcGxlOiBgYHJvbGxfY3ljbGU6IERBSUxZYGAKKworV0FSTklORzogUmVhZCB0aGUgZm9sbG93aW5nIHBhcmFncmFwaCB3aGVuIGNoYW5naW5nIGBgcm9sbF9jeWNsZWBgIG9uIGEgcHJvZHVjdGlvbiBub2RlLgorCitXaXRoIHRoZSBgQmluTG9nZ2VyYCBpbXBsZW1lbnRhdGlvbiwgYW55IGF0dGVtcHQgdG8gbW9kaWZ5IHRoZSByb2xsIGN5Y2xlIG9uIGEgbm9kZSB3aGVyZSBhdWRpdCBsb2dnaW5nIHdhcyBwcmV2aW91c2x5IGVuYWJsZWQgd2lsbCBmYWlsIHNpbGVudGVseSBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL09wZW5IRlQvQ2hyb25pY2xlLVF1ZXVlW0Nocm9uaWNsZSBRdWV1ZV0gcm9sbCBjeWNsZSBpbmZlcmVuY2UgbWVjaGFuaXNtIChldmVuIGlmIHlvdSBkZWxldGUgdGhlIGBgbWV0YWRhdGEuY3E0dGBgIGZpbGUpLgorCitIZXJlIGlzIGFuIGV4YW1wbGUgb2Ygc3VjaCBhbiBvdmVycmlkZSB2aXNpYmxlIGluIENhc3NhbmRyYSBsb2dzOgorLS0tLQorSU5GTyAgW21haW5dIDxEQVRFIFRJTUU+IEJpbkxvZy5qYXZhOjQyMCAtIEF0dGVtcHRpbmcgdG8gY29uZmlndXJlIGJpbiBsb2c6IFBhdGg6IC9wYXRoL3RvL2F1ZGl0IFJvbGwgY3ljbGU6IFRXT19IT1VSTFkgWy4uLl0KK1dBUk4gIFttYWluXSA8REFURSBUSU1FPiBTaW5nbGVDaHJvbmljbGVRdWV1ZUJ1aWxkZXIuamF2YTo0NzcgLSBPdmVycmlkaW5nIHJvbGwgY3ljbGUgZnJvbSBUV09fSE9VUkxZIHRvIEZJVkVfTUlOVVRFCistLS0tCisKK0luIG9yZGVyIHRvIGNoYW5nZSBgYHJvbGxfY3ljbGVgYCBvbiBhIG5vZGUsIHlvdSBoYXZlIHRvOgorCisxLiBTdG9wIENhc3NhbmRyYQorMi4gTW92ZSBvciBvZmZsb2FkIGFsbCBhdWRpdCBsb2dzIHNvbWV3aGVyZSBlbHNlIChpbiBhIHNhZmUgYW5kIGR1cmFibGUgbG9jYXRpb24pCiszLiBSZXN0YXJ0IENhc3NhbmRyYS4KKzQuIENoZWNrIENhc3NhbmRyYSBsb2dzCis1LiBNYWtlIHN1cmUgdGhhdCBhdWRpdCBsb2cgZmlsZW5hbWVzIHVuZGVyIGBgYXVkaXRfbG9nc19kaXJgYCBjb3JyZXNwb25kIHRvIHRoZSBuZXcgcm9sbCBjeWNsZS4KKworPT09IGJsb2NrCisKK1RoZSBgYGJsb2NrYGAgb3B0aW9uIHNwZWNpZmllcyB3aGV0aGVyIGF1ZGl0IGxvZ2dpbmcgc2hvdWxkIGJsb2NrIHdyaXRpbmcgb3IgZHJvcCBsb2cgcmVjb3JkcyBpZiB0aGUgYXVkaXQgbG9nZ2luZyBmYWxscyBiZWhpbmQuIFN1cHBvcnRlZCBib29sZWFuIHZhbHVlcyBhcmUgYGB0cnVlYGAgKGRlZmF1bHQpIG9yIGBgZmFsc2VgYC4KKworRm9yIGV4YW1wbGU6IGBgYmxvY2s6IGZhbHNlYGAgdG8gZHJvcCByZWNvcmRzIChlLmcuIGlmIGF1ZGl0IGlzIHVzZWQgZm9yIHRyb29ibGVzaG9vdGluZykKKworRm9yIHJlZ3VsYXRvcnkgY29tcGxpYW5jZSBwdXJwb3NlcywgaXQncyBhIGdvb2QgcHJhY3RpY2UgdG8gZXhwbGljaXRseSBzZXQgYGBibG9jazogdHJ1ZWBgIHRvIHByZXZlbnQgYW55IHJlZ3Jlc3Npb24gaW4gY2FzZSBvZiBmdXR1cmUgZGVmYXVsdCB2YWx1ZSBjaGFuZ2UuCisKKz09PSBtYXhfcXVldWVfd2VpZ2h0CisKK1RoZSBgYG1heF9xdWV1ZV93ZWlnaHRgYCBvcHRpb24gc2V0cyB0aGUgbWF4aW11bSB3ZWlnaHQgb2YgaW4tbWVtb3J5IHF1ZXVlIGZvciByZWNvcmRzIHdhaXRpbmcgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZSBiZWZvcmUgYmxvY2tpbmcgb3IgZHJvcHBpbmcuICBUaGUgb3B0aW9uIG11c3QgYmUgc2V0IHRvIGEgcG9zaXRpdmUgdmFsdWUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDI2ODQzNTQ1Niwgb3IgMjU2IE1pQi4KKworRm9yIGV4YW1wbGUsIHRvIGNoYW5nZSB0aGUgZGVmYXVsdDogYGBtYXhfcXVldWVfd2VpZ2h0OiAxMzQyMTc3MjggIyAxMjggTWlCYGAKKworPT09IG1heF9sb2dfc2l6ZQorCitUaGUgYGBtYXhfbG9nX3NpemVgYCBvcHRpb24gc2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSByb2xsZWQgZmlsZXMgdG8gcmV0YWluIG9uIGRpc2sgYmVmb3JlIGRlbGV0aW5nIHRoZSBvbGRlc3QgZmlsZS4gIFRoZSBvcHRpb24gbXVzdCBiZSBzZXQgdG8gYSBwb3NpdGl2ZSB2YWx1ZS4gVGhlIGRlZmF1bHQgaXMgMTcxNzk4NjkxODQsIG9yIDE2IEdpQi4KK0ZvciBleGFtcGxlLCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQ6IGBgbWF4X2xvZ19zaXplOiAzNDM1OTczODM2OCAjIDMyIEdpQmBgCisKK1dBUk5JTkc6IGBgbWF4X2xvZ19zaXplYGAgaXMgaWdub3JlZCBpZiBgYGFyY2hpdmVfY29tbWFuZGBgIG9wdGlvbiBpcyBzZXQuCisKK1tbYXJjaGl2ZV9jb21tYW5kXV0KKz09PSBhcmNoaXZlX2NvbW1hbmQKKworTk9URTogSWYgYGBhcmNoaXZlX2NvbW1hbmRgYCBvcHRpb24gaXMgZW1wdHkgb3IgdW5zZXQgKGRlZmF1bHQpLCBDYXNzYW5kcmEgdXNlcyBhIGJ1aWx0LWluIERlbGV0aW5nQXJjaGl2ZXIgdGhhdCBkZWxldGVzIHRoZSBvbGRlc3QgZmlsZXMgaWYgYGBtYXhfbG9nX3NpemVgYCBpcyByZWFjaGVkLgorCitUaGUgYGBhcmNoaXZlX2NvbW1hbmRgYCBvcHRpb24gc2V0cyB0aGUgdXNlci1kZWZpbmVkIGFyY2hpdmUgc2NyaXB0IHRvIGV4ZWN1dGUgb24gcm9sbGVkIGxvZyBmaWxlcy4KK0ZvciBleGFtcGxlOiBgYGFyY2hpdmVfY29tbWFuZDogIi91c3IvbG9jYWwvYmluL2FyY2hpdmVpdC5zaCAlcGF0aCJgYAorCitgYCVwYXRoYGAgaXMgcmVwbGFjZWQgd2l0aCB0aGUgYWJzb2x1dGUgZmlsZSBwYXRoIG9mIHRoZSBmaWxlIGJlaW5nIHJvbGxlZC4KKworV2hlbiB1c2luZyBhIHVzZXItZGVmaW5lZCBzY3JpcHQsIENhc3NhbmRyYSBkb2VzICoqbm90KiogdXNlIHRoZSBEZWxldGluZ0FyY2hpdmVyLCBzbyBpdCdzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgc2NyaXB0IHRvIG1ha2UgYW55IHJlcXVpcmVkIGNsZWFudXAuCisKK0Nhc3NhbmRyYSB3aWxsIGNhbGwgdGhlIHVzZXItZGVmaW5lZCBzY3JpcHQgYXMgc29vbiBhcyB0aGUgbG9nIGZpbGUgaXMgcm9sbGVkLiBJdCBtZWFucyB0aGF0IENocm9uaWNsZSBRdWV1ZSdzIFF1ZXVlRmlsZVNocmlua01hbmFnZXIgd2lsbCBub3QgYmUgYWJsZSB0byBzaHJpbmsgdGhlIHNwYXJzZSBsb2cgZmlsZSBiZWNhdXNlIGl0J3MgZG9uZSBhc3luY2hyb25vdXNseS4gSW4gb3RoZXIgd29yZHMsIGFsbCBsb2cgZmlsZXMgd2lsbCBoYXZlIGF0IGxlYXN0IHRoZSBzaXplIG9mIHRoZSBkZWZhdWx0IGJsb2NrIHNpemUgKDgwIE1pQiksIGV2ZW4gaWYgdGhlcmUgYXJlIG9ubHkgYSBmZXcgS0Igb2YgcmVhbCBkYXRhLiBDb25zZXF1ZW50bHksIHNvbWUgd2FybmluZ3Mgd2lsbCBhcHBlYXIgaW4gQ2Fzc2FuZHJhIHN5c3RlbS5sb2c6CisKKy0tLS0KK1dBUk4gIFttYWluL3F1ZXVlfmZpbGV+c2hyaW5rfmRhZW1vbl0gPERBVEUgVElNRT4gUXVldWVGaWxlU2hyaW5rTWFuYWdlci5qYXZhOjYzIC0gRmFpbGVkIHRvIHNocmluayBmaWxlIGFzIGl0IGV4aXN0cyBubyBsb25nZXIsIGZpbGU9L3BhdGgvdG8veHh4LmNxNAorLS0tLQorCitUSVA6IEJlY2F1c2UgQ2Fzc2FuZHJhIGRvZXMgbm90IG1ha2UgdXNlIG9mIFByZXRvdWNoZXIsIHlvdSBjYW4gY29uZmlndXJlIENocm9uaWNsZSBRdWV1ZSB0byBzaHJpbmsgZmlsZXMgc3luY2hyb25vdXNseSAtLSBpLmUuIGFzIHNvb24gYXMgdGhlIGZpbGUgaXMgcm9sbGVkIC0tIHdpdGggYGBjaHJvbmljbGUucXVldWUuc3luY2hyb25vdXNGaWxlU2hyaW5raW5nYGAgSlZNIHByb3BlcnRpZXMuIEZvciBpbnN0YW5jZSwgeW91IGNhbiBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIGF0IHRoZSBlbmQgb2YgYGBjYXNzYW5kcmEtZW52LnNoYGA6IGBgSlZNX09QVFM9IiRKVk1fT1BUUyAtRGNocm9uaWNsZS5xdWV1ZS5zeW5jaHJvbm91c0ZpbGVTaHJpbmtpbmc9dHJ1ZSJgYAorCis9PT0gbWF4X2FyY2hpdmVfcmV0cmllcworCitUaGUgYGBtYXhfYXJjaGl2ZV9yZXRyaWVzYGAgb3B0aW9uIHNldHMgdGhlIG1heCBudW1iZXIgb2YgcmV0cmllcyBvZiBmYWlsZWQgYXJjaGl2ZSBjb21tYW5kcy4gVGhlIGRlZmF1bHQgaXMgMTAuCisKK0ZvciBleGFtcGxlOiBgYG1heF9hcmNoaXZlX3JldHJpZXM6IDEwYGAKKworSW50ZXJ2YWwgYmV0d2VlbiBlYWNoIHJldHJ5IGlzIGhhcmQgY29kZWQgdG8gNSBtaW51dGVzLgorCitbW2VuYWJsaW5nX2F1ZGl0X3dpdGhfbm9kZXRvb2xdXQorPT0gRW5hYmxpbmcgQXVkaXQgTG9nZ2luZyB3aXRoIGBgbm9kZXRvb2xgYAorIAorQXVkaXQgbG9nZ2luZyBpcyBlbmFibGVkIG9uIGEgcGVyLW5vZGUgYmFzaXMgdXNpbmcgdGhlIGBgbm9kZXRvb2wgZW5hYmxlYXVkaXRsb2dgYCBjb21tYW5kLiBUaGUgbG9nZ2luZyBkaXJlY3RvcnkgbXVzdCBiZSBkZWZpbmVkIHdpdGggYGBhdWRpdF9sb2dzX2RpcmBgIGluIHRoZSBgY2Fzc2FuZHJhLnlhbWxgIGZpbGUgb3IgdXNlcyB0aGUgZGVmYXVsdCB2YWx1ZSBgYGNhc3NhbmRyYS5sb2dkaXIuYXVkaXRgYC4KKworVGhlIHN5bnRheCBvZiB0aGUgYGBub2RldG9vbCBlbmFibGVhdWRpdGxvZ2BgIGNvbW1hbmQgaGFzIGFsbCB0aGUgc2FtZSBvcHRpb25zIHRoYXQgY2FuIGJlIHNldCBpbiB0aGUgYGBjYXNzYW5kcmEueWFtbGBgIGZpbGUgZXhjZXB0IGBgYXVkaXRfbG9nc19kaXJgYC4KK0luIGFkZGl0aW9uLCBgYG5vZGV0b29sYGAgaGFzIG9wdGlvbnMgdG8gc2V0IHdoaWNoIGhvc3QgYW5kIHBvcnQgdG8gcnVuIHRoZSBjb21tYW5kIG9uLCBhbmQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGlmIHRoZSBjb21tYW5kIHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uLgorCitbc291cmNlLCBwbGFpbnRleHRdCistLS0tCisgICAgICAgbm9kZXRvb2wgWygtaCA8aG9zdD4gfCAtLWhvc3QgPGhvc3Q+KV0gWygtcCA8cG9ydD4gfCAtLXBvcnQgPHBvcnQ+KV0KKyAgICAgICAgICAgICAgICBbKC1wcCB8IC0tcHJpbnQtcG9ydCldIFsoLXB3IDxwYXNzd29yZD4gfCAtLXBhc3N3b3JkIDxwYXNzd29yZD4pXQorICAgICAgICAgICAgICAgIFsoLXB3ZiA8cGFzc3dvcmRGaWxlUGF0aD4gfCAtLXBhc3N3b3JkLWZpbGUgPHBhc3N3b3JkRmlsZVBhdGg+KV0KKyAgICAgICAgICAgICAgICBbKC11IDx1c2VybmFtZT4gfCAtLXVzZXJuYW1lIDx1c2VybmFtZT4pXSBlbmFibGVhdWRpdGxvZworICAgICAgICAgICAgICAgIFstLWV4Y2x1ZGVkLWNhdGVnb3JpZXMgPGV4Y2x1ZGVkX2NhdGVnb3JpZXM+XQorICAgICAgICAgICAgICAgIFstLWV4Y2x1ZGVkLWtleXNwYWNlcyA8ZXhjbHVkZWRfa2V5c3BhY2VzPl0KKyAgICAgICAgICAgICAgICBbLS1leGNsdWRlZC11c2VycyA8ZXhjbHVkZWRfdXNlcnM+XQorICAgICAgICAgICAgICAgIFstLWluY2x1ZGVkLWNhdGVnb3JpZXMgPGluY2x1ZGVkX2NhdGVnb3JpZXM+XQorICAgICAgICAgICAgICAgIFstLWluY2x1ZGVkLWtleXNwYWNlcyA8aW5jbHVkZWRfa2V5c3BhY2VzPl0KKyAgICAgICAgICAgICAgICBbLS1pbmNsdWRlZC11c2VycyA8aW5jbHVkZWRfdXNlcnM+XSBbLS1sb2dnZXIgPGxvZ2dlcj5dCisKK09QVElPTlMKKyAgICAgICAgLS1leGNsdWRlZC1jYXRlZ29yaWVzIDxleGNsdWRlZF9jYXRlZ29yaWVzPgorICAgICAgICAgICAgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgQXVkaXQgTG9nIENhdGVnb3JpZXMgdG8gYmUgZXhjbHVkZWQgZm9yCisgICAgICAgICAgICBhdWRpdCBsb2cuIElmIG5vdCBzZXQgdGhlIHZhbHVlIGZyb20gY2Fzc2FuZHJhLnlhbWwgd2lsbCBiZSB1c2VkCisKKyAgICAgICAgLS1leGNsdWRlZC1rZXlzcGFjZXMgPGV4Y2x1ZGVkX2tleXNwYWNlcz4KKyAgICAgICAgICAgIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGtleXNwYWNlcyB0byBiZSBleGNsdWRlZCBmb3IgYXVkaXQgbG9nLiBJZgorICAgICAgICAgICAgbm90IHNldCB0aGUgdmFsdWUgZnJvbSBjYXNzYW5kcmEueWFtbCB3aWxsIGJlIHVzZWQKKworICAgICAgICAtLWV4Y2x1ZGVkLXVzZXJzIDxleGNsdWRlZF91c2Vycz4KKyAgICAgICAgICAgIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHVzZXJzIHRvIGJlIGV4Y2x1ZGVkIGZvciBhdWRpdCBsb2cuIElmIG5vdAorICAgICAgICAgICAgc2V0IHRoZSB2YWx1ZSBmcm9tIGNhc3NhbmRyYS55YW1sIHdpbGwgYmUgdXNlZAorCisgICAgICAgIC1oIDxob3N0PiwgLS1ob3N0IDxob3N0PgorICAgICAgICAgICAgTm9kZSBob3N0bmFtZSBvciBpcCBhZGRyZXNzCisKKyAgICAgICAgLS1pbmNsdWRlZC1jYXRlZ29yaWVzIDxpbmNsdWRlZF9jYXRlZ29yaWVzPgorICAgICAgICAgICAgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgQXVkaXQgTG9nIENhdGVnb3JpZXMgdG8gYmUgaW5jbHVkZWQgZm9yCisgICAgICAgICAgICBhdWRpdCBsb2cuIElmIG5vdCBzZXQgdGhlIHZhbHVlIGZyb20gY2Fzc2FuZHJhLnlhbWwgd2lsbCBiZSB1c2VkCisKKyAgICAgICAgLS1pbmNsdWRlZC1rZXlzcGFjZXMgPGluY2x1ZGVkX2tleXNwYWNlcz4KKyAgICAgICAgICAgIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGtleXNwYWNlcyB0byBiZSBpbmNsdWRlZCBmb3IgYXVkaXQgbG9nLiBJZgorICAgICAgICAgICAgbm90IHNldCB0aGUgdmFsdWUgZnJvbSBjYXNzYW5kcmEueWFtbCB3aWxsIGJlIHVzZWQKKworICAgICAgICAtLWluY2x1ZGVkLXVzZXJzIDxpbmNsdWRlZF91c2Vycz4KKyAgICAgICAgICAgIENvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHVzZXJzIHRvIGJlIGluY2x1ZGVkIGZvciBhdWRpdCBsb2cuIElmIG5vdAorICAgICAgICAgICAgc2V0IHRoZSB2YWx1ZSBmcm9tIGNhc3NhbmRyYS55YW1sIHdpbGwgYmUgdXNlZAorCisgICAgICAgIC0tbG9nZ2VyIDxsb2dnZXI+CisgICAgICAgICAgICBMb2dnZXIgbmFtZSB0byBiZSB1c2VkIGZvciBBdWRpdExvZ2dpbmcuIERlZmF1bHQgQmluQXVkaXRMb2dnZXIuIElmCisgICAgICAgICAgICBub3Qgc2V0IHRoZSB2YWx1ZSBmcm9tIGNhc3NhbmRyYS55YW1sIHdpbGwgYmUgdXNlZAorCisgICAgICAgIC1wIDxwb3J0PiwgLS1wb3J0IDxwb3J0PgorICAgICAgICAgICAgUmVtb3RlIGpteCBhZ2VudCBwb3J0IG51bWJlcgorCisgICAgICAgIC1wcCwgLS1wcmludC1wb3J0CisgICAgICAgICAgICBPcGVyYXRlIGluIDQuMCBtb2RlIHdpdGggaG9zdHMgZGlzYW1iaWd1YXRlZCBieSBwb3J0IG51bWJlcgorCisgICAgICAgIC1wdyA8cGFzc3dvcmQ+LCAtLXBhc3N3b3JkIDxwYXNzd29yZD4KKyAgICAgICAgICAgIFJlbW90ZSBqbXggYWdlbnQgcGFzc3dvcmQKKworICAgICAgICAtcHdmIDxwYXNzd29yZEZpbGVQYXRoPiwgLS1wYXNzd29yZC1maWxlIDxwYXNzd29yZEZpbGVQYXRoPgorICAgICAgICAgICAgUGF0aCB0byB0aGUgSk1YIHBhc3N3b3JkIGZpbGUKKworICAgICAgICAtdSA8dXNlcm5hbWU+LCAtLXVzZXJuYW1lIDx1c2VybmFtZT4KKyAgICAgICAgICAgIFJlbW90ZSBqbXggYWdlbnQgdXNlcm5hbWUKKy0tLS0KKworVG8gZW5hYmxlIGF1ZGl0IGxvZ2dpbmcsIHJ1biBmb2xsb3dpbmcgY29tbWFuZCBvbiBlYWNoIG5vZGUgaW4gdGhlIGNsdXN0ZXIgb24gd2hpY2ggeW91IHdhbnQgdG8gZW5hYmxlIGxvZ2dpbmc6CisKK1tzb3VyY2UsIGJhc2hdCistLS0tCiskIG5vZGV0b29sIGVuYWJsZWF1ZGl0bG9nCistLS0tCisKKz09IERpc2FibGluZyBhdWRpdCBsb2dnaW5nCisKK1VzZSB0aGUgYG5vZGV0b29sIGRpc2FibGVhdWRpdGxvZ2AgY29tbWFuZCB0byBkaXNhYmxlIGF1ZGl0IGxvZ2dpbmcuIAorCis9PSBWaWV3aW5nIGF1ZGl0IGxvZ3MKKworVGhlIGBhdWRpdGxvZ3ZpZXdlcmAgdG9vbCBpcyB1c2VkIHRvIHZpZXcgKGR1bXApIGF1ZGl0IGxvZ3MgaWYgdGhlIGxvZ2dlciB3YXMgYGBCaW5BdWRpdExvZ2dlcmBgLi4gCitgYGF1ZGl0bG9ndmlld2VyYGAgY29udmVydHMgdGhlIGJpbmFyeSBsb2cgZmlsZXMgaW50byBodW1hbi1yZWFkYWJsZSBmb3JtYXQ7IG9ubHkgdGhlIGF1ZGl0IGxvZyBkaXJlY3RvcnkgbXVzdCBiZSBzdXBwbGllZCBhcyBhIGNvbW1hbmQtbGluZSBvcHRpb24uCitJZiB0aGUgbG9nZ2VyIGBgRmlsZUF1ZGl0TG9nZ2VyYGAgd2FzIHNldCwgdGhlIGxvZyBmaWxlIGFyZSBhbHJlYWR5IGluIGh1bWFuLXJlYWRhYmxlIGZvcm1hdCBhbmQgYGBhdWRpdGxvZ3ZpZXdlcmBgIGlzIG5vdCBuZWVkZWQgdG8gcmVhZCBmaWxlcy4gCisKKworVGhlIHN5bnRheCBvZiBgYXVkaXRsb2d2aWV3ZXJgIGlzOgorCitbc291cmNlLCBwbGFpbnRleHRdCistLS0tCithdWRpdGxvZ3ZpZXdlcgorCitBdWRpdCBsb2cgZmlsZXMgZGlyZWN0b3J5IHBhdGggaXMgYSByZXF1aXJlZCBhcmd1bWVudC4KK3VzYWdlOiBhdWRpdGxvZ3ZpZXdlciA8cGF0aDE+IFs8cGF0aDI+Li4uPHBhdGhOPl0gW29wdGlvbnNdCistLQorVmlldyB0aGUgYXVkaXQgbG9nIGNvbnRlbnRzIGluIGh1bWFuIHJlYWRhYmxlIGZvcm1hdAorLS0KK09wdGlvbnMgYXJlOgorLWYsLS1mb2xsb3cgICAgICAgVXBvbiByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBsb2cgY29udGludWUgaW5kZWZpbml0ZWx5CisgICAgICAgICAgICAgICAgICB3YWl0aW5nIGZvciBtb3JlIHJlY29yZHMKKy1oLC0taGVscCAgICAgICAgIGRpc3BsYXkgdGhpcyBoZWxwIG1lc3NhZ2UKKy1yLC0tcm9sbF9jeWNsZSAgIEhvdyBvZnRlbiB0byByb2xsIHRoZSBsb2cgZmlsZSB3YXMgcm9sbGVkLiBNYXkgYmUKKyAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgQ2hyb25pY2xlIHRvIGNvcnJlY3RseSBwYXJzZSBmaWxlIG5hbWVzLiAoTUlOVVRFTFksIEhPVVJMWSwKKyAgICAgICAgICAgICAgICAgIERBSUxZKS4gRGVmYXVsdCBIT1VSTFkuCistLS0tCisKKz09IEV4YW1wbGUKKworW2FyYWJpYywgc3RhcnQ9MV0KKy4gVG8gZGVtb25zdHJhdGUgYXVkaXQgbG9nZ2luZywgZmlyc3QgY29uZmlndXJlIHRoZSBgYGNhc3NhbmRyYS55YW1sYGAgZmlsZSB3aXRoIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3M6CisKK1tzb3VyY2UsIHlhbWxdCistLS0tCithdWRpdF9sb2dnaW5nX29wdGlvbnM6CisgICBlbmFibGVkOiB0cnVlCisgICBsb2dnZXI6IEJpbkF1ZGl0TG9nZ2VyCisgICBhdWRpdF9sb2dzX2RpcjogIi9jYXNzYW5kcmEvYXVkaXQvbG9ncy9ob3VybHkiCisgICAjIGluY2x1ZGVkX2tleXNwYWNlczoKKyAgICMgZXhjbHVkZWRfa2V5c3BhY2VzOiBzeXN0ZW0sIHN5c3RlbV9zY2hlbWEsIHN5c3RlbV92aXJ0dWFsX3NjaGVtYQorICAgIyBpbmNsdWRlZF9jYXRlZ29yaWVzOgorICAgIyBleGNsdWRlZF9jYXRlZ29yaWVzOgorICAgIyBpbmNsdWRlZF91c2VyczoKKyAgICMgZXhjbHVkZWRfdXNlcnM6CisgICByb2xsX2N5Y2xlOiBIT1VSTFkKKyAgICMgYmxvY2s6IHRydWUKKyAgICMgbWF4X3F1ZXVlX3dlaWdodDogMjY4NDM1NDU2ICMgMjU2IE1pQgorICAgIyBtYXhfbG9nX3NpemU6IDE3MTc5ODY5MTg0ICMgMTYgR2lCCisgICAjIyBhcmNoaXZlIGNvbW1hbmQgaXMgIi9wYXRoL3RvL3NjcmlwdC5zaCAlcGF0aCIgd2hlcmUgJXBhdGggaXMgcmVwbGFjZWQgd2l0aCB0aGUgZmlsZSBiZWluZyByb2xsZWQ6CisgICAjIGFyY2hpdmVfY29tbWFuZDoKKyAgICMgbWF4X2FyY2hpdmVfcmV0cmllczogMTAKKy0tLS0KKworW2FyYWJpYywgc3RhcnQ9Ml0KKy4gQ3JlYXRlIHRoZSBhdWRpdCBsb2cgZGlyZWN0b3J5IGAvY2Fzc2FuZHJhL2F1ZGl0L2xvZ3MvaG91cmx5YCBhbmQgc2V0IHRoZSBkaXJlY3RvcnkgcGVybWlzc2lvbnMgdG8gcmVhZCwgd3JpdGUsIGFuZCBleGVjdXRlIGZvciBhbGwuIAorCitbYXJhYmljLCBzdGFydD0zXQorLiBOb3cgY3JlYXRlIGEgZGVtbyBrZXlzcGFjZSBhbmQgdGFibGUgYW5kIGluc2VydCBzb21lIGRhdGEgdXNpbmcgYGBjcWxzaGBgOgorCitbc291cmNlLCBjcWxdCistLS0tCisgY3Fsc2g+IENSRUFURSBLRVlTUEFDRSBhdWRpdGxvZ2tleXNwYWNlCisgICAuLi4gV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJyA6IDF9OworIGNxbHNoPiBVU0UgYXVkaXRsb2drZXlzcGFjZTsKKyBjcWxzaDphdWRpdGxvZ2tleXNwYWNlPiBDUkVBVEUgVEFCTEUgdCAoCisgLi4uaWQgaW50LAorIC4uLmsgaW50LAorIC4uLnYgdGV4dCwKKyAuLi5QUklNQVJZIEtFWSAoaWQpCisgLi4uICk7CisgY3Fsc2g6YXVkaXRsb2drZXlzcGFjZT4gSU5TRVJUIElOVE8gdCAoaWQsIGssIHYpIFZBTFVFUyAoMCwgMCwgJ3ZhbDAnKTsKKyBjcWxzaDphdWRpdGxvZ2tleXNwYWNlPiBJTlNFUlQgSU5UTyB0IChpZCwgaywgdikgVkFMVUVTICgwLCAxLCAndmFsMScpOworLS0tLQorCitBbGwgdGhlIHN1cHBvcnRlZCBDUUwgY29tbWFuZHMgd2lsbCBiZSBsb2dnZWQgdG8gdGhlIGF1ZGl0IGxvZyBkaXJlY3RvcnkuCisKK1thcmFiaWMsIHN0YXJ0PTRdCisuIENoYW5nZSBkaXJlY3RvcnkgdG8gdGhlIGF1ZGl0IGxvZ3MgZGlyZWN0b3J5LgorCitbc291cmNlLCBiYXNoXQorLS0tLQorJCBjZCAvY2Fzc2FuZHJhL2F1ZGl0L2xvZ3MvaG91cmx5CistLS0tCisKK1thcmFiaWMsIHN0YXJ0PTVdCisuIExpc3QgdGhlIGF1ZGl0IGxvZyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuIAorCitbc291cmNlLCBiYXNoXQorLS0tLQorJCBscyAtbAorLS0tLQorCitZb3Ugc2hvdWxkIHNlZSByZXN1bHRzIHNpbWlsYXIgdG86CisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK3RvdGFsIDI4Cistcnctcnctci0tLiAxIGVjMi11c2VyIGVjMi11c2VyICAgIDY1NTM2IEF1ZyAgMiAwMzowMSBkaXJlY3RvcnktbGlzdGluZy5jcTR0Cistcnctcnctci0tLiAxIGVjMi11c2VyIGVjMi11c2VyIDgzODg2MDgwIEF1ZyAgMiAwMzowMSAyMDE5MDgwMi0wMi5jcTQKKy1ydy1ydy1yLS0uIDEgZWMyLXVzZXIgZWMyLXVzZXIgODM4ODYwODAgQXVnICAyIDAzOjAxIDIwMTkwODAyLTAzLmNxNAorLS0tLQorCitUaGUgYXVkaXQgbG9nIGZpbGVzIHdpbGwgYWxsIGJlIGxpc3RlZCB3aXRoIGEgYC5jcTRgIGZpbGUgdHlwZS4gVGhlIGF1ZGl0IGRpcmVjdG9yeSBpcyBvZiBgLmNxNHRgIHR5cGUuCisKK1thcmFiaWMsIHN0YXJ0PTZdCisuIFJ1biBgYXVkaXRsb2d2aWV3ZXJgIHRvb2wgdG8gdmlldyB0aGUgYXVkaXQgbG9ncy4gCisKK1tzb3VyY2UsIGJhc2hdCistLS0tCiskIGF1ZGl0bG9ndmlld2VyIC9jYXNzYW5kcmEvYXVkaXQvbG9ncy9ob3VybHkKKy0tLS0KKworVGhpcyBjb21tYW5kIHdpbGwgcmV0dXJuIGEgcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgbG9nLiBIZXJlIGlzIGEgcGFydGlhbCBzYW1wbGUgb2YgdGhlIGxvZyBmb3IgdGhlIGNvbW1hbmRzIGluIHRoaXMgZGVtbzoKKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQorV0FSTiAgMDM6MTI6MTEsMTI0IFVzaW5nIFBhdXNlci5zbGVlcHkoKSBhcyBub3QgZW5vdWdoIHByb2Nlc3NvcnMsIGhhdmUgMiwgbmVlZHMgOCsKK1R5cGU6IEF1ZGl0TG9nCitMb2dNZXNzYWdlOgordXNlcjphbm9ueW1vdXN8aG9zdDoxMC4wLjIuMjM4OjcwMDB8c291cmNlOi8xMjcuMC4wLjF8cG9ydDo0NjI2NHx0aW1lc3RhbXA6MTU2NDcxMTQyNzMyOHx0eXBlIDpVU0VfS0VZU1BBQ0V8Y2F0ZWdvcnk6T1RIRVJ8a3M6YXVkaXRsb2drZXlzcGFjZXxvcGVyYXRpb246VVNFIEF1ZGl0TG9nS2V5c3BhY2U7CitUeXBlOiBBdWRpdExvZworTG9nTWVzc2FnZToKK3VzZXI6YW5vbnltb3VzfGhvc3Q6MTAuMC4yLjIzODo3MDAwfHNvdXJjZTovMTI3LjAuMC4xfHBvcnQ6NDYyNjR8dGltZXN0YW1wOjE1NjQ3MTE0MjczMjl8dHlwZSA6VVNFX0tFWVNQQUNFfGNhdGVnb3J5Ok9USEVSfGtzOmF1ZGl0bG9na2V5c3BhY2V8b3BlcmF0aW9uOlVTRSAiYXVkaXRsb2drZXlzcGFjZSIKK1R5cGU6IEF1ZGl0TG9nCitMb2dNZXNzYWdlOgordXNlcjphbm9ueW1vdXN8aG9zdDoxMC4wLjIuMjM4OjcwMDB8c291cmNlOi8xMjcuMC4wLjF8cG9ydDo0NjI2NHx0aW1lc3RhbXA6MTU2NDcxMTQ0NjI3OXx0eXBlIDpTRUxFQ1R8Y2F0ZWdvcnk6UVVFUll8a3M6YXVkaXRsb2drZXlzcGFjZXxzY29wZTp0fG9wZXJhdGlvbjpTRUxFQ1QgKiBGUk9NIHQ7CitUeXBlOiBBdWRpdExvZworTG9nTWVzc2FnZToKK3VzZXI6YW5vbnltb3VzfGhvc3Q6MTAuMC4yLjIzODo3MDAwfHNvdXJjZTovMTI3LjAuMC4xfHBvcnQ6NDYyNjR8dGltZXN0YW1wOjE1NjQ3MTM4Nzg4MzR8dHlwZSA6RFJPUF9UQUJMRXxjYXRlZ29yeTpEREx8a3M6YXVkaXRsb2drZXlzcGFjZXxzY29wZTp0fG9wZXJhdGlvbjpEUk9QIFRBQkxFIElGIEVYSVNUUworQXVkaXRMb2dLZXlzcGFjZS50OworVHlwZTogQXVkaXRMb2cKK0xvZ01lc3NhZ2U6Cit1c2VyOmFub255bW91c3xob3N0OjEwLjAuMi4yMzg6NzAwMHxzb3VyY2U6LzMuOTEuNTYuMTY0fHBvcnQ6NDIzODJ8dGltZXN0YW1wOjE1NjQ3MTQ2MTgzNjB8dHkKK3BlOlJFUVVFU1RfRkFJTFVSRXxjYXRlZ29yeTpFUlJPUnxvcGVyYXRpb246Q1JFQVRFIEtFWVNQQUNFIEF1ZGl0TG9nS2V5c3BhY2UKK1dJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3RvcicgOiAxfTs7IENhbm5vdCBhZGQKK2V4aXN0aW5nIGtleXNwYWNlICJhdWRpdGxvZ2tleXNwYWNlIgorVHlwZTogQXVkaXRMb2cKK0xvZ01lc3NhZ2U6Cit1c2VyOmFub255bW91c3xob3N0OjEwLjAuMi4yMzg6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjQ2MjY0fHRpbWVzdGFtcDoxNTY0NzE0NjkwOTY4fHR5cGUgOkRST1BfS0VZU1BBQ0V8Y2F0ZWdvcnk6RERMfGtzOmF1ZGl0bG9na2V5c3BhY2V8b3BlcmF0aW9uOkRST1AgS0VZU1BBQ0UgQXVkaXRMb2dLZXlzcGFjZTsKK1R5cGU6IEF1ZGl0TG9nCitMb2dNZXNzYWdlOgordXNlcjphbm9ueW1vdXN8aG9zdDoxMC4wLjIuMjM4OjcwMDB8c291cmNlOi8zLjkxLjU2LjE2NHxwb3J0OjQyNDA2fHRpbWVzdGFtcDoxNTY0NzE0NzA4MzI5fHR5IHBlOkNSRUFURV9LRVlTUEFDRXxjYXRlZ29yeTpEREx8a3M6YXVkaXRsb2drZXlzcGFjZXxvcGVyYXRpb246Q1JFQVRFIEtFWVNQQUNFCitBdWRpdExvZ0tleXNwYWNlCitXSVRIIHJlcGxpY2F0aW9uID0geydjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogMX07CitUeXBlOiBBdWRpdExvZworTG9nTWVzc2FnZToKK3VzZXI6YW5vbnltb3VzfGhvc3Q6MTAuMC4yLjIzODo3MDAwfHNvdXJjZTovMTI3LjAuMC4xfHBvcnQ6NDYyNjR8dGltZXN0YW1wOjE1NjQ3MTQ4NzA2Nzh8dHlwZSA6VVNFX0tFWVNQQUNFfGNhdGVnb3J5Ok9USEVSfGtzOmF1ZGl0bG9na2V5c3BhY2V8b3BlcmF0aW9uOlVTRSBhdWRpdGxvZ2tleXNwYWNlOworCitQYXNzd29yZCBvYmZ1c2NhdGlvbiBleGFtcGxlczoKK0xvZ01lc3NhZ2U6IHVzZXI6Y2Fzc2FuZHJhfGhvc3Q6bG9jYWxob3N0LzEyNy4wLjAuMTo3MDAwfHNvdXJjZTovMTI3LjAuMC4xfHBvcnQ6NjUyODJ8dGltZXN0YW1wOjE2MjI2MzA0OTY3MDh8dHlwZTpDUkVBVEVfUk9MRXxjYXRlZ29yeTpEQ0x8b3BlcmF0aW9uOkNSRUFURSBST0xFIHJvbGUxIFdJVEggUEFTU1dPUkQgPSAnKioqKioqKic7CitUeXBlOiBhdWRpdAorTG9nTWVzc2FnZTogdXNlcjpjYXNzYW5kcmF8aG9zdDpsb2NhbGhvc3QvMTI3LjAuMC4xOjcwMDB8c291cmNlOi8xMjcuMC4wLjF8cG9ydDo2NTI4Mnx0aW1lc3RhbXA6MTYyMjYzMDYzNDU1Mnx0eXBlOkFMVEVSX1JPTEV8Y2F0ZWdvcnk6RENMfG9wZXJhdGlvbjpBVExFUiBST0xFIHJvbGUxIFdJVEggUEFTU1dPUkQgPSAnKioqKioqKic7CitUeXBlOiBhdWRpdAorTG9nTWVzc2FnZTogdXNlcjpjYXNzYW5kcmF8aG9zdDpsb2NhbGhvc3QvMTI3LjAuMC4xOjcwMDB8c291cmNlOi8xMjcuMC4wLjF8cG9ydDo2NTI4Mnx0aW1lc3RhbXA6MTYyMjYzMDY5ODY4Nnx0eXBlOkNSRUFURV9ST0xFfGNhdGVnb3J5OkRDTHxvcGVyYXRpb246Q1JFQVRFIFVTRVIgdXNlcjEgV0lUSCBQQVNTV09SRCAnKioqKioqKic7CitUeXBlOiBhdWRpdAorTG9nTWVzc2FnZTogdXNlcjpjYXNzYW5kcmF8aG9zdDpsb2NhbGhvc3QvMTI3LjAuMC4xOjcwMDB8c291cmNlOi8xMjcuMC4wLjF8cG9ydDo2NTI4Mnx0aW1lc3RhbXA6MTYyMjYzMDc0NzM0NHx0eXBlOkFMVEVSX1JPTEV8Y2F0ZWdvcnk6RENMfG9wZXJhdGlvbjpBTFRFUiBVU0VSIHVzZXIxIFdJVEggUEFTU1dPUkQgJyoqKioqKionOworLS0tLQorCis9PSBEaWFnbm9zdGljIGV2ZW50cyBmb3IgdXNlciBhdWRpdCBsb2dnaW5nCisKK0FueSBuYXRpdmUgdHJhbnNwb3J0LWVuYWJsZWQgY2xpZW50IGNhbiBzdWJzY3JpYmUgdG8gYXVkaXQgbG9nIGV2ZW50cyBmb3IgZGlhZ25vc2luZyBjbHVzdGVyIGlzc3Vlcy4KK1RoZXNlIGV2ZW50cyBjYW4gYmUgY29uc3VtZWQgYnkgZXh0ZXJuYWwgdG9vbHMgdG8gaW1wbGVtZW50IGEgQ2Fzc2FuZHJhIHVzZXIgYXVkaXRpbmcgc29sdXRpb24uCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2JhY2t1cHMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvYmFja3Vwcy5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjkxODYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2JhY2t1cHMuYWRvYwpAQCAtMCwwICsxLDUxNyBAQAorPSBCYWNrdXBzCisKK0FwYWNoZSBDYXNzYW5kcmEgc3RvcmVzIGRhdGEgaW4gaW1tdXRhYmxlIFNTVGFibGUgZmlsZXMuIEJhY2t1cHMgaW4KK0FwYWNoZSBDYXNzYW5kcmEgZGF0YWJhc2UgYXJlIGJhY2t1cCBjb3BpZXMgb2YgdGhlIGRhdGFiYXNlIGRhdGEgdGhhdCBpcworc3RvcmVkIGFzIFNTVGFibGUgZmlsZXMuIEJhY2t1cHMgYXJlIHVzZWQgZm9yIHNldmVyYWwgcHVycG9zZXMgaW5jbHVkaW5nCit0aGUgZm9sbG93aW5nOgorCisqIFRvIHN0b3JlIGEgZGF0YSBjb3B5IGZvciBkdXJhYmlsaXR5CisqIFRvIGJlIGFibGUgdG8gcmVzdG9yZSBhIHRhYmxlIGlmIHRhYmxlIGRhdGEgaXMgbG9zdCBkdWUgdG8KK25vZGUvcGFydGl0aW9uL25ldHdvcmsgZmFpbHVyZQorKiBUbyBiZSBhYmxlIHRvIHRyYW5zZmVyIHRoZSBTU1RhYmxlIGZpbGVzIHRvIGEgZGlmZmVyZW50IG1hY2hpbmU7IGZvcgorcG9ydGFiaWxpdHkKKworPT0gVHlwZXMgb2YgQmFja3VwcworCitBcGFjaGUgQ2Fzc2FuZHJhIHN1cHBvcnRzIHR3byBraW5kcyBvZiBiYWNrdXAgc3RyYXRlZ2llcy4KKworKiBTbmFwc2hvdHMKKyogSW5jcmVtZW50YWwgQmFja3VwcworCitBIF9zbmFwc2hvdF8gaXMgYSBjb3B5IG9mIGEgdGFibGXigJlzIFNTVGFibGUgZmlsZXMgYXQgYSBnaXZlbiB0aW1lLAorY3JlYXRlZCB2aWEgaGFyZCBsaW5rcy4gCitUaGUgRERMIHRvIGNyZWF0ZSB0aGUgdGFibGUgaXMgc3RvcmVkIGFzIHdlbGwuCitTbmFwc2hvdHMgbWF5IGJlIGNyZWF0ZWQgYnkgYSB1c2VyIG9yIGNyZWF0ZWQgYXV0b21hdGljYWxseS4gCitUaGUgc2V0dGluZyBgc25hcHNob3RfYmVmb3JlX2NvbXBhY3Rpb25gIGluIHRoZSBgY2Fzc2FuZHJhLnlhbWxgIGZpbGUgZGV0ZXJtaW5lcyBpZgorc25hcHNob3RzIGFyZSBjcmVhdGVkIGJlZm9yZSBlYWNoIGNvbXBhY3Rpb24uIAorQnkgZGVmYXVsdCwgYHNuYXBzaG90X2JlZm9yZV9jb21wYWN0aW9uYCBpcyBzZXQgdG8gZmFsc2UuIAorU25hcHNob3RzIG1heSBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYmVmb3JlIGtleXNwYWNlIHRydW5jYXRpb24gb3IgZHJvcHBpbmcgb2YgYSB0YWJsZSBieQorc2V0dGluZyBgYXV0b19zbmFwc2hvdGAgdG8gdHJ1ZSAoZGVmYXVsdCkgaW4gYGNhc3NhbmRyYS55YW1sYC4gCitUcnVuY2F0ZXMgY291bGQgYmUgZGVsYXllZCBkdWUgdG8gdGhlIGF1dG8gc25hcHNob3RzIGFuZCBhbm90aGVyIHNldHRpbmcgaW4KK2BjYXNzYW5kcmEueWFtbGAgZGV0ZXJtaW5lcyBob3cgbG9uZyB0aGUgY29vcmRpbmF0b3Igc2hvdWxkIHdhaXQgZm9yCit0cnVuY2F0ZXMgdG8gY29tcGxldGUuIAorQnkgZGVmYXVsdCBDYXNzYW5kcmEgd2FpdHMgNjAgc2Vjb25kcyBmb3IgYXV0byBzbmFwc2hvdHMgdG8gY29tcGxldGUuCisKK0FuIF9pbmNyZW1lbnRhbCBiYWNrdXBfIGlzIGEgY29weSBvZiBhIHRhYmxl4oCZcyBTU1RhYmxlIGZpbGVzIGNyZWF0ZWQgYnkKK2EgaGFyZCBsaW5rIHdoZW4gbWVtdGFibGVzIGFyZSBmbHVzaGVkIHRvIGRpc2sgYXMgU1NUYWJsZXMuIAorVHlwaWNhbGx5IGluY3JlbWVudGFsIGJhY2t1cHMgYXJlIHBhaXJlZCB3aXRoIHNuYXBzaG90cyB0byByZWR1Y2UgdGhlIGJhY2t1cCB0aW1lCithcyB3ZWxsIGFzIHJlZHVjZSBkaXNrIHNwYWNlLiAKK0luY3JlbWVudGFsIGJhY2t1cHMgYXJlIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgZW5hYmxlZCBleHBsaWNpdGx5IGluIGBjYXNzYW5kcmEueWFtbGAgKHdpdGgKK2BpbmNyZW1lbnRhbF9iYWNrdXBzYCBzZXR0aW5nKSBvciB3aXRoIGBub2RldG9vbGAuIAorT25jZSBlbmFibGVkLCBDYXNzYW5kcmEgY3JlYXRlcyBhIGhhcmQgbGluayB0byBlYWNoIFNTVGFibGUgZmx1c2hlZCBvciBzdHJlYW1lZAorbG9jYWxseSBpbiBhIGBiYWNrdXBzL2Agc3ViZGlyZWN0b3J5IG9mIHRoZSBrZXlzcGFjZSBkYXRhLiAKK0luY3JlbWVudGFsIGJhY2t1cHMgb2Ygc3lzdGVtIHRhYmxlcyBhcmUgYWxzbyBjcmVhdGVkLgorCis9PSBEYXRhIERpcmVjdG9yeSBTdHJ1Y3R1cmUKKworVGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb2YgQ2Fzc2FuZHJhIGRhdGEgY29uc2lzdHMgb2YgZGlmZmVyZW50CitkaXJlY3RvcmllcyBmb3Iga2V5c3BhY2VzLCBhbmQgdGFibGVzIHdpdGggdGhlIGRhdGEgZmlsZXMgd2l0aGluIHRoZQordGFibGUgZGlyZWN0b3JpZXMuIAorRGlyZWN0b3JpZXMgYmFja3VwcyBhbmQgc25hcHNob3RzIHRvIHN0b3JlIGJhY2t1cHMKK2FuZCBzbmFwc2hvdHMgcmVzcGVjdGl2ZWx5IGZvciBhIHBhcnRpY3VsYXIgdGFibGUgYXJlIGFsc28gc3RvcmVkIHdpdGhpbgordGhlIHRhYmxlIGRpcmVjdG9yeS4gCitUaGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3IgQ2Fzc2FuZHJhIGlzIGlsbHVzdHJhdGVkIGluIEZpZ3VyZSAxLgorCitpbWFnZTo6RmlndXJlXzFfYmFja3Vwcy5qcGdbRGF0YSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBiYWNrdXBzXQorCitGaWd1cmUgMS4gRGlyZWN0b3J5IFN0cnVjdHVyZSBmb3IgQ2Fzc2FuZHJhIERhdGEKKworPT09IFNldHRpbmcgVXAgRXhhbXBsZSBUYWJsZXMgZm9yIEJhY2t1cHMgYW5kIFNuYXBzaG90cworCitJbiB0aGlzIHNlY3Rpb24gd2Ugc2hhbGwgY3JlYXRlIHNvbWUgZXhhbXBsZSBkYXRhIHRoYXQgY291bGQgYmUgdXNlZCB0bworZGVtb25zdHJhdGUgaW5jcmVtZW50YWwgYmFja3VwcyBhbmQgc25hcHNob3RzLiAKK1dlIGhhdmUgdXNlZCBhIHRocmVlIG5vZGUgQ2Fzc2FuZHJhIGNsdXN0ZXIuIAorRmlyc3QsIHRoZSBrZXlzcGFjZXMgYXJlIGNyZWF0ZWQuIAorVGhlbiB0YWJsZXMgYXJlIGNyZWF0ZWQgd2l0aGluIGEga2V5c3BhY2UgYW5kIHRhYmxlIGRhdGEgaXMgYWRkZWQuIAorV2UgaGF2ZSB1c2VkIHR3byBrZXlzcGFjZXMgYGNxbGtleXNwYWNlYCBhbmQgYGNhdGFsb2drZXlzcGFjZWAgd2l0aCB0d28gdGFibGVzIHdpdGhpbgorZWFjaC4gCisKK0NyZWF0ZSB0aGUga2V5c3BhY2UgYGNxbGtleXNwYWNlYDoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfa3NfYmFja3VwLmNxbFtdCistLS0tCisKK0NyZWF0ZSB0d28gdGFibGVzIGB0YCBhbmQgYHQyYCBpbiB0aGUgYGNxbGtleXNwYWNlYCBrZXlzcGFjZS4KKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfdGFibGVfYmFja3VwLmNxbFtdCistLS0tCisKK0FkZCBkYXRhIHRvIHRoZSB0YWJsZXM6IAorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2luc2VydF9kYXRhX2JhY2t1cC5jcWxbXQorLS0tLQorCitRdWVyeSB0aGUgdGFibGUgdG8gbGlzdCB0aGUgZGF0YToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9zZWxlY3RfZGF0YV9iYWNrdXAuY3FsW10KKy0tLS0KKworcmVzdWx0cyBpbgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zZWxlY3RfZGF0YV9iYWNrdXAucmVzdWx0W10KKy0tLS0KKworQ3JlYXRlIGEgc2Vjb25kIGtleXNwYWNlIGBjYXRhbG9na2V5c3BhY2VgOgorCitbc291cmNlLGNxbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV9rczJfYmFja3VwLmNxbFtdCistLS0tCisKK0NyZWF0ZSB0d28gdGFibGVzIGBqb3VybmFsYCAgYW5kIGBtYWdhemluZWAgaW4gYGNhdGFsb2drZXlzcGFjZWA6CisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3RhYmxlMl9iYWNrdXAuY3FsW10KKy0tLS0KKworQWRkIGRhdGEgdG8gdGhlIHRhYmxlczoKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9pbnNlcnRfZGF0YTJfYmFja3VwLmNxbFtdCistLS0tCisKK1F1ZXJ5IHRoZSB0YWJsZXMgdG8gbGlzdCB0aGUgZGF0YToKKworW3NvdXJjZSxjcWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJENRTC9zZWxlY3RfZGF0YTJfYmFja3VwLmNxbFtdCistLS0tCisKK3Jlc3VsdHMgaW4gCisKK1tzb3VyY2UsY3FsXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NlbGVjdF9kYXRhMl9iYWNrdXAucmVzdWx0W10KKy0tLS0KKworPT0gU25hcHNob3RzCisKK0luIHRoaXMgc2VjdGlvbiwgd2UgZGVtb25zdHJhdGUgY3JlYXRpbmcgc25hcHNob3RzLiAKK1RoZSBjb21tYW5kIHVzZWQgdG8gY3JlYXRlIGEgc25hcHNob3QgaXMgYG5vZGV0b29sIHNuYXBzaG90YCB3aXRoIHRoZSB1c2FnZToKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL25vZGV0b29sX3NuYXBzaG90LnNoW10KKy0tLS0KKworcmVzdWx0cyBpbgorCitbc291cmNlLCBwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvbm9kZXRvb2xfc25hcHNob3RfaGVscC5yZXN1bHRbXQorLS0tLQorCis9PT0gQ29uZmlndXJpbmcgZm9yIFNuYXBzaG90cworCitUbyBkZW1vbnN0cmF0ZSBjcmVhdGluZyBzbmFwc2hvdHMgd2l0aCBOb2RldG9vbCBvbiB0aGUgY29tbWFuZGxpbmUgd2UKK2hhdmUgc2V0IGBhdXRvX3NuYXBzaG90c2Agc2V0dGluZyB0byBgZmFsc2VgIGluIHRoZSBgY2Fzc2FuZHJhLnlhbWxgIGZpbGU6CisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkWUFNTC9hdXRvX3NuYXBzaG90LnlhbWxbXQorLS0tLQorCitBbHNvIHNldCBgc25hcHNob3RfYmVmb3JlX2NvbXBhY3Rpb25gIHRvIGBmYWxzZWAgdG8gZGlzYWJsZSBjcmVhdGluZworc25hcHNob3RzIGF1dG9tYXRpY2FsbHkgYmVmb3JlIGNvbXBhY3Rpb246CisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkWUFNTC9zbmFwc2hvdF9iZWZvcmVfY29tcGFjdGlvbi55YW1sW10KKy0tLS0KKworPT09IENyZWF0aW5nIFNuYXBzaG90cworCitCZWZvcmUgY3JlYXRpbmcgYW55IHNuYXBzaG90cywgc2VhcmNoIGZvciBzbmFwc2hvdHMgYW5kIG5vbmUgd2lsbCBiZSBsaXN0ZWQ6CisKK1tzb3VyY2UsYmFzaF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9maW5kX3NuYXBzaG90cy5zaFtdCistLS0tCisKK1dlIHNoYWxsIGJlIHVzaW5nIHRoZSBleGFtcGxlIGtleXNwYWNlcyBhbmQgdGFibGVzIHRvIGNyZWF0ZSBzbmFwc2hvdHMuCisKKz09PT0gVGFraW5nIFNuYXBzaG90cyBvZiBhbGwgVGFibGVzIGluIGEgS2V5c3BhY2UKKworVXNpbmcgdGhlIHN5bnRheCBhYm92ZSwgY3JlYXRlIGEgc25hcHNob3QgY2FsbGVkIGBjYXRhbG9nLWtzYCBmb3IgYWxsIHRoZSB0YWJsZXMKK2luIHRoZSBgY2F0YWxvZ2tleXNwYWNlYCBrZXlzcGFjZToKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3NuYXBzaG90X2JhY2t1cDIuc2hbXQorLS0tLQorCityZXN1bHRzIGluCisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zbmFwc2hvdF9iYWNrdXAyLnJlc3VsdFtdCistLS0tCisKK1VzaW5nIHRoZSBgZmluZGAgY29tbWFuZCBhYm92ZSwgdGhlIHNuYXBzaG90cyBhbmQgYHNuYXBzaG90c2AgZGlyZWN0b3JpZXMgCithcmUgbm93IGZvdW5kIHdpdGggbGlzdGVkIGZpbGVzIHNpbWlsYXIgdG86CisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zbmFwc2hvdF9iYWNrdXAyX2ZpbmQucmVzdWx0W10KKy0tLS0KKworU25hcHNob3RzIG9mIGFsbCB0YWJsZXMgaW4gbXVsdGlwbGUga2V5c3BhY2VzIG1heSBiZSBjcmVhdGVkIHNpbWlsYXJseToKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3NuYXBzaG90X2JvdGhfYmFja3Vwcy5zaFtdCistLS0tCisKKz09PT0gVGFraW5nIFNuYXBzaG90cyBvZiBTaW5nbGUgVGFibGUgaW4gYSBLZXlzcGFjZQorCitUbyB0YWtlIGEgc25hcHNob3Qgb2YgYSBzaW5nbGUgdGFibGUgdGhlIGBub2RldG9vbCBzbmFwc2hvdGAgY29tbWFuZAorc3ludGF4IGJlY29tZXMgYXMgZm9sbG93czoKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3NuYXBzaG90X29uZV90YWJsZS5zaFtdCistLS0tCisKK1VzaW5nIHRoZSBzeW50YXggYWJvdmUsIGNyZWF0ZSBhIHNuYXBzaG90IGZvciB0YWJsZSBgbWFnYXppbmVgIGluIGtleXNwYWNlIGBjYXRhbG9na2V5c3BhY2VgOgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvc25hcHNob3Rfb25lX3RhYmxlMi5zaFtdCistLS0tCisKK3Jlc3VsdHMgaW4KKyAKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zbmFwc2hvdF9vbmVfdGFibGUyLnJlc3VsdFtdCistLS0tCisKKz09PT0gVGFraW5nIFNuYXBzaG90IG9mIE11bHRpcGxlIFRhYmxlcyBmcm9tIHNhbWUgS2V5c3BhY2UKKworVG8gdGFrZSBzbmFwc2hvdHMgb2YgbXVsdGlwbGUgdGFibGVzIGluIGEga2V5c3BhY2UgdGhlIGxpc3Qgb2YKK19LZXlzcGFjZS50YWJsZV8gbXVzdCBiZSBzcGVjaWZpZWQgd2l0aCBvcHRpb24gYC0ta3QtbGlzdGAuIAorRm9yIGV4YW1wbGUsIGNyZWF0ZSBzbmFwc2hvdHMgZm9yIHRhYmxlcyBgdGAgYW5kIGB0MmAgaW4gdGhlIGBjcWxrZXlzcGFjZWAga2V5c3BhY2U6CisKK1tzb3VyY2UsYmFzaF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9zbmFwc2hvdF9tdWx0X3RhYmxlcy5zaFtdCistLS0tCisKK3Jlc3VsdHMgaW4KKworW3NvdXJjZSxwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvc25hcHNob3RfbXVsdF90YWJsZXMucmVzdWx0W10KKy0tLS0KKworTXVsdGlwbGUgc25hcHNob3RzIG9mIHRoZSBzYW1lIHNldCBvZiB0YWJsZXMgbWF5IGJlIGNyZWF0ZWQgYW5kIHRhZ2dlZCB3aXRoIGEgZGlmZmVyZW50IG5hbWUuIAorQXMgYW4gZXhhbXBsZSwgY3JlYXRlIGFub3RoZXIgc25hcHNob3QgZm9yIHRoZSBzYW1lIHNldCBvZiB0YWJsZXMgYHRgIGFuZCBgdDJgIGluIHRoZSBgY3Fsa2V5c3BhY2VgIAora2V5c3BhY2UgYW5kIHRhZyB0aGUgc25hcHNob3RzIGRpZmZlcmVudGx5OgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvc25hcHNob3RfbXVsdF90YWJsZXNfYWdhaW4uc2hbXQorLS0tLQorCityZXN1bHRzIGluCisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zbmFwc2hvdF9tdWx0X3RhYmxlc19hZ2Fpbi5yZXN1bHRbXQorLS0tLQorCis9PT09IFRha2luZyBTbmFwc2hvdCBvZiBNdWx0aXBsZSBUYWJsZXMgZnJvbSBEaWZmZXJlbnQgS2V5c3BhY2VzCisKK1RvIHRha2Ugc25hcHNob3RzIG9mIG11bHRpcGxlIHRhYmxlcyB0aGF0IGFyZSBpbiBkaWZmZXJlbnQga2V5c3BhY2VzIHRoZQorY29tbWFuZCBzeW50YXggaXMgdGhlIHNhbWUgYXMgd2hlbiBtdWx0aXBsZSB0YWJsZXMgYXJlIGluIHRoZSBzYW1lCitrZXlzcGFjZS4gCitFYWNoIDxrZXlzcGFjZT4uPHRhYmxlPiBtdXN0IGJlIHNwZWNpZmllZCBzZXBhcmF0ZWx5IGluIHRoZQorYC0ta3QtbGlzdGAgb3B0aW9uLiAKKworRm9yIGV4YW1wbGUsIGNyZWF0ZSBhIHNuYXBzaG90IGZvciB0YWJsZSBgdGAgaW4KK3RoZSBgY3Fsa2V5c3BhY2VgIGFuZCB0YWJsZSBgam91cm5hbGAgaW4gdGhlIGNhdGFsb2drZXlzcGFjZSBhbmQgdGFnIHRoZQorc25hcHNob3QgYG11bHRpLWtzYC4KKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3NuYXBzaG90X211bHRfa3Muc2hbXQorLS0tLQorCityZXN1bHRzIGluCitbc291cmNlLCBwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvc25hcHNob3RfbXVsdF9rcy5yZXN1bHRbXQorLS0tLQorCis9PT0gTGlzdGluZyBTbmFwc2hvdHMKKworVG8gbGlzdCBzbmFwc2hvdHMgdXNlIHRoZSBgbm9kZXRvb2wgbGlzdHNuYXBzaG90c2AgY29tbWFuZC4gQWxsIHRoZQorc25hcHNob3RzIHRoYXQgd2UgY3JlYXRlZCBpbiB0aGUgcHJlY2VkaW5nIGV4YW1wbGVzIGdldCBsaXN0ZWQ6CisKK1tzb3VyY2UsYmFzaF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9ub2RldG9vbF9saXN0X3NuYXBzaG90cy5zaFtdCistLS0tCisKK3Jlc3VsdHMgaW4KKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL25vZGV0b29sX2xpc3Rfc25hcHNob3RzLnJlc3VsdFtdCistLS0tCisKKz09PSBGaW5kaW5nIFNuYXBzaG90cyBEaXJlY3RvcmllcworCitUaGUgYHNuYXBzaG90c2AgZGlyZWN0b3JpZXMgbWF5IGJlIGxpc3RlZCB3aXRoIGBmaW5kIOKAk25hbWUgc25hcHNob3RzYAorY29tbWFuZDoKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2ZpbmRfc25hcHNob3RzLnNoW10KKy0tLS0KKworcmVzdWx0cyBpbgorCitbc291cmNlLCBwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvc25hcHNob3RfYWxsLnJlc3VsdFtdCistLS0tCisKK1RvIGxpc3QgdGhlIHNuYXBzaG90cyBmb3IgYSBwYXJ0aWN1bGFyIHRhYmxlIGZpcnN0IGNoYW5nZSB0byB0aGUgc25hcHNob3RzIGRpcmVjdG9yeSBmb3IgdGhhdCB0YWJsZS4gCitGb3IgZXhhbXBsZSwgbGlzdCB0aGUgc25hcHNob3RzIGZvciB0aGUgYGNhdGFsb2drZXlzcGFjZS9qb3VybmFsYCB0YWJsZToKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2ZpbmRfdHdvX3NuYXBzaG90cy5zaFtdCistLS0tCisKK3Jlc3VsdHMgaW4KKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL2ZpbmRfdHdvX3NuYXBzaG90cy5yZXN1bHRbXQorLS0tLQorCitBIGBzbmFwc2hvdHNgIGRpcmVjdG9yeSBsaXN0cyB0aGUgU1NUYWJsZSBmaWxlcyBpbiB0aGUgc25hcHNob3QuCitBIGBzY2hlbWEuY3FsYCBmaWxlIGlzIGFsc28gY3JlYXRlZCBpbiBlYWNoIHNuYXBzaG90IHRoYXQgZGVmaW5lcyBzY2hlbWEKK3RoYXQgY2FuIHJlY3JlYXRlIHRoZSB0YWJsZSB3aXRoIENRTCB3aGVuIHJlc3RvcmluZyBmcm9tIGEgc25hcHNob3Q6CisKK1tzb3VyY2UsYmFzaF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9zbmFwc2hvdF9maWxlcy5zaFtdCistLS0tCisKK3Jlc3VsdHMgaW4KKworW3NvdXJjZSwgcGxhaW50ZXh0XQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NuYXBzaG90X2ZpbGVzLnJlc3VsdFtdCistLS0tCisKKz09PSBDbGVhcmluZyBTbmFwc2hvdHMKKworU25hcHNob3RzIG1heSBiZSBjbGVhcmVkIG9yIGRlbGV0ZWQgd2l0aCB0aGUgYG5vZGV0b29sIGNsZWFyc25hcHNob3RgCitjb21tYW5kLiBFaXRoZXIgYSBzcGVjaWZpYyBzbmFwc2hvdCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIG9yIHRoZSBg4oCTYWxsYAorb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkLiAKKworRm9yIGV4YW1wbGUsIGRlbGV0ZSBhIHNuYXBzaG90IGNhbGxlZCBgbWFnYXppbmVgIGZyb20ga2V5c3BhY2UgYGNxbGtleXNwYWNlYDoKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL25vZGV0b29sX2NsZWFyc25hcHNob3Quc2hbXQorLS0tLQorCitvciBkZWxldGUgYWxsIHNuYXBzaG90cyBmcm9tIGBjcWxrZXlzcGFjZWAgd2l0aCB0aGUg4oCTYWxsIG9wdGlvbjoKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL25vZGV0b29sX2NsZWFyc25hcHNob3RfYWxsLnNoW10KKy0tLS0KKworPT0gSW5jcmVtZW50YWwgQmFja3VwcworCitJbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLCB3ZSBzaGFsbCBkaXNjdXNzIGNvbmZpZ3VyaW5nIGFuZCBjcmVhdGluZworaW5jcmVtZW50YWwgYmFja3Vwcy4KKworPT09IENvbmZpZ3VyaW5nIGZvciBJbmNyZW1lbnRhbCBCYWNrdXBzCisKK1RvIGNyZWF0ZSBpbmNyZW1lbnRhbCBiYWNrdXBzIHNldCBgaW5jcmVtZW50YWxfYmFja3Vwc2AgdG8gYHRydWVgIGluCitgY2Fzc2FuZHJhLnlhbWxgLgorCitbc291cmNlLHlhbWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFlBTUwvaW5jcmVtZW50YWxfYnVwcy55YW1sW10KKy0tLS0KKworVGhpcyBpcyB0aGUgb25seSBzZXR0aW5nIG5lZWRlZCB0byBjcmVhdGUgaW5jcmVtZW50YWwgYmFja3Vwcy4gCitCeSBkZWZhdWx0IGBpbmNyZW1lbnRhbF9iYWNrdXBzYCBzZXR0aW5nIGlzIHNldCB0byBgZmFsc2VgIGJlY2F1c2UgYSBuZXcKK3NldCBvZiBTU1RhYmxlIGZpbGVzIGlzIGNyZWF0ZWQgZm9yIGVhY2ggZGF0YSBmbHVzaCBhbmQgaWYgc2V2ZXJhbCBDUUwKK3N0YXRlbWVudHMgYXJlIHRvIGJlIHJ1biB0aGUgYGJhY2t1cHNgIGRpcmVjdG9yeSBjb3VsZCBmaWxsIHVwIHF1aWNrbHkKK2FuZCB1c2UgdXAgc3RvcmFnZSB0aGF0IGlzIG5lZWRlZCB0byBzdG9yZSB0YWJsZSBkYXRhLiAKK0luY3JlbWVudGFsIGJhY2t1cHMgbWF5IGFsc28gYmUgZW5hYmxlZCBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGggdGhlIG5vZGV0b29sCitjb21tYW5kIGBub2RldG9vbCBlbmFibGViYWNrdXBgLiAKK0luY3JlbWVudGFsIGJhY2t1cHMgbWF5IGJlIGRpc2FibGVkIHdpdGggYG5vZGV0b29sIGRpc2FibGViYWNrdXBgIGNvbW1hbmQuIAorU3RhdHVzIG9mIGluY3JlbWVudGFsIGJhY2t1cHMsIHdoZXRoZXIgdGhleSBhcmUgZW5hYmxlZCBtYXkgYmUgY2hlY2tlZCB3aXRoIGBub2RldG9vbCBzdGF0dXNiYWNrdXBgLgorCis9PT0gQ3JlYXRpbmcgSW5jcmVtZW50YWwgQmFja3VwcworCitBZnRlciBlYWNoIHRhYmxlIGlzIGNyZWF0ZWQgZmx1c2ggdGhlIHRhYmxlIGRhdGEgd2l0aCBgbm9kZXRvb2wgZmx1c2hgCitjb21tYW5kLiBJbmNyZW1lbnRhbCBiYWNrdXBzIGdldCBjcmVhdGVkLgorCitbc291cmNlLGJhc2hdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJEJBU0gvbm9kZXRvb2xfZmx1c2guc2hbXQorLS0tLQorCis9PT0gRmluZGluZyBJbmNyZW1lbnRhbCBCYWNrdXBzCisKK0luY3JlbWVudGFsIGJhY2t1cHMgYXJlIGNyZWF0ZWQgd2l0aGluIHRoZSBDYXNzYW5kcmHigJlzIGBkYXRhYCBkaXJlY3RvcnkKK3dpdGhpbiBhIHRhYmxlIGRpcmVjdG9yeS4gQmFja3VwcyBtYXkgYmUgZm91bmQgd2l0aCBmb2xsb3dpbmcgY29tbWFuZC4KKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2ZpbmRfYmFja3Vwcy5zaFtdCistLS0tCityZXN1bHRzIGluCitbc291cmNlLG5vbmVdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvZmluZF9iYWNrdXBzLnJlc3VsdFtdCistLS0tCisKKz09PSBDcmVhdGluZyBhbiBJbmNyZW1lbnRhbCBCYWNrdXAKKworVGhpcyBzZWN0aW9uIGRpc2N1c3NlcyBob3cgaW5jcmVtZW50YWwgYmFja3VwcyBhcmUgY3JlYXRlZCBpbiBtb3JlCitkZXRhaWwgdXNpbmcgdGhlIGtleXNwYWNlIGFuZCB0YWJsZSBwcmV2aW91c2x5IGNyZWF0ZWQuCisKK0ZsdXNoIHRoZSBrZXlzcGFjZSBhbmQgdGFibGU6CisKK1tzb3VyY2UsYmFzaF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkQkFTSC9ub2RldG9vbF9mbHVzaF90YWJsZS5zaFtdCistLS0tCisKK0Egc2VhcmNoIGZvciBiYWNrdXBzIGFuZCBhIGBiYWNrdXBzYCBkaXJlY3Rvcnkgd2lsbCBsaXN0IGEgYmFja3VwIGRpcmVjdG9yeSwKK2V2ZW4gaWYgd2UgaGF2ZSBhZGRlZCBubyB0YWJsZSBkYXRhIHlldC4KKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2ZpbmRfYmFja3Vwcy5zaFtdCistLS0tCisKK3Jlc3VsdHMgaW4KKworW3NvdXJjZSxwbGFpbnRleHRdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvZmluZF9iYWNrdXBzX3RhYmxlLnJlc3VsdFtdCistLS0tCisKK0NoZWNraW5nIHRoZSBgYmFja3Vwc2AgZGlyZWN0b3J5IHdpbGwgc2hvdyB0aGF0IHRoZXJlIGFyZSBhbHNvIG5vIGJhY2t1cCBmaWxlczoKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2NoZWNrX2JhY2t1cHMuc2hbXQorLS0tLQorCityZXN1bHRzIGluCisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9ub19idXBzLnJlc3VsdFtdCistLS0tCisKK0lmIGEgcm93IG9mIGRhdGEgaXMgYWRkZWQgdG8gdGhlIGRhdGEsIHJ1bm5pbmcgdGhlIGBub2RldG9vbCBmbHVzaGAgY29tbWFuZCB3aWxsCitmbHVzaCB0aGUgdGFibGUgZGF0YSBhbmQgYW4gaW5jcmVtZW50YWwgYmFja3VwIHdpbGwgYmUgY3JlYXRlZDoKKworW3NvdXJjZSxiYXNoXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2ZsdXNoX2FuZF9jaGVjay5zaFtdCistLS0tCisKK3Jlc3VsdHMgaW4gCisKK1tzb3VyY2UsIHBsYWludGV4dF0KKy0tLS0KK2luY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9mbHVzaF9hbmRfY2hlY2sucmVzdWx0W10KKy0tLS0KKworW05PVEVdCisubm90ZQorPT09PQorVGhlIGBiYWNrdXBzYCBkaXJlY3RvcnkgZm9yIGFueSB0YWJsZSwgc3VjaCBhcyBgY3Fsa2V5c3BhY2UvdGAgaXMgY3JlYXRlZCBpbiB0aGUKK2BkYXRhYCBkaXJlY3RvcnkgZm9yIHRoYXQgdGFibGUuCis9PT09CisKK0FkZGluZyBhbm90aGVyIHJvdyBvZiBkYXRhIGFuZCBmbHVzaGluZyB3aWxsIHJlc3VsdCBpbiBhbm90aGVyIHNldCBvZiBpbmNyZW1lbnRhbCBiYWNrdXAgZmlsZXMuCitUaGUgU1NUYWJsZSBmaWxlcyBhcmUgdGltZXN0YW1wZWQsIHdoaWNoIGRpc3Rpbmd1aXNoZXMgdGhlIGZpcnN0IGluY3JlbWVudGFsIGJhY2t1cCBmcm9tIHRoZQorc2Vjb25kOgorCitbc291cmNlLG5vbmVdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvZmx1c2hfYW5kX2NoZWNrMi5yZXN1bHRbXQorLS0tLQorCis9PSBSZXN0b3JpbmcgZnJvbSBJbmNyZW1lbnRhbCBCYWNrdXBzIGFuZCBTbmFwc2hvdHMKKworVGhlIHR3byBtYWluIHRvb2xzL2NvbW1hbmRzIGZvciByZXN0b3JpbmcgYSB0YWJsZSBhZnRlciBpdCBoYXMgYmVlbgorZHJvcHBlZCBhcmU6CisKKyogc3N0YWJsZWxvYWRlcgorKiBub2RldG9vbCByZWZyZXNoCisKK0Egc25hcHNob3QgY29udGFpbnMgZXNzZW50aWFsbHkgdGhlIHNhbWUgc2V0IG9mIFNTVGFibGUgZmlsZXMgYXMgYW4KK2luY3JlbWVudGFsIGJhY2t1cCBkb2VzIHdpdGggYSBmZXcgYWRkaXRpb25hbCBmaWxlcy4gQSBzbmFwc2hvdCBpbmNsdWRlcworYSBgc2NoZW1hLmNxbGAgZmlsZSBmb3IgdGhlIHNjaGVtYSBEREwgdG8gY3JlYXRlIGEgdGFibGUgaW4gQ1FMLiBBIHRhYmxlCitiYWNrdXAgZG9lcyBub3QgaW5jbHVkZSBEREwgd2hpY2ggbXVzdCBiZSBvYnRhaW5lZCBmcm9tIGEgc25hcHNob3Qgd2hlbgorcmVzdG9yaW5nIGZyb20gYW4gaW5jcmVtZW50YWwgYmFja3VwLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9ibG9vbV9maWx0ZXJzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2Jsb29tX2ZpbHRlcnMuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9ibG9vbV9maWx0ZXJzLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvYmxvb21fZmlsdGVycy5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2J1bGtfbG9hZGluZy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9idWxrX2xvYWRpbmcuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9idWxrX2xvYWRpbmcuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9idWxrX2xvYWRpbmcuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9jZGMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvY2RjLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvY2RjLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvY2RjLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvY29tcGFjdGlvbi9pbmRleC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9jb21wYWN0aW9uL2luZGV4LmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5NWYwMwotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvY29tcGFjdGlvbi9pbmRleC5hZG9jCkBAIC0wLDAgKzEsMzM2IEBACis9IENvbXBhY3Rpb24KKworPT0gU3RyYXRlZ2llcworCitQaWNraW5nIHRoZSByaWdodCBjb21wYWN0aW9uIHN0cmF0ZWd5IGZvciB5b3VyIHdvcmtsb2FkIHdpbGwgZW5zdXJlIHRoZQorYmVzdCBwZXJmb3JtYW5jZSBmb3IgYm90aCBxdWVyeWluZyBhbmQgZm9yIGNvbXBhY3Rpb24gaXRzZWxmLgorCit4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL3N0Y3MuYWRvY1tgU2l6ZSBUaWVyZWQgQ29tcGFjdGlvbiBTdHJhdGVneSAoU1RDUylgXTo6CisgIFRoZSBkZWZhdWx0IGNvbXBhY3Rpb24gc3RyYXRlZ3kuIFVzZWZ1bCBhcyBhIGZhbGxiYWNrIHdoZW4gb3RoZXIKKyAgc3RyYXRlZ2llcyBkb24ndCBmaXQgdGhlIHdvcmtsb2FkLiBNb3N0IHVzZWZ1bCBmb3Igbm9uIHB1cmUgdGltZQorICBzZXJpZXMgd29ya2xvYWRzIHdpdGggc3Bpbm5pbmcgZGlza3MsIG9yIHdoZW4gdGhlIEkvTyBmcm9tIGBMQ1NgCisgIGlzIHRvbyBoaWdoLgoreHJlZjpvcGVyYXRpbmcvY29tcGFjdGlvbi9sY3MuYWRvY1tgTGV2ZWxlZCBDb21wYWN0aW9uIFN0cmF0ZWd5IChMQ1MpYF06OgorICBMZXZlbGVkIENvbXBhY3Rpb24gU3RyYXRlZ3kgKExDUykgaXMgb3B0aW1pemVkIGZvciByZWFkIGhlYXZ5CisgIHdvcmtsb2Fkcywgb3Igd29ya2xvYWRzIHdpdGggbG90cyBvZiB1cGRhdGVzIGFuZCBkZWxldGVzLiBJdCBpcyBub3QgYQorICBnb29kIGNob2ljZSBmb3IgaW1tdXRhYmxlIHRpbWUgc2VyaWVzIGRhdGEuCit4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL3R3Y3MuYWRvY1tgVGltZSBXaW5kb3cgQ29tcGFjdGlvbiBTdHJhdGVneSAoVFdDUylgXTo6CisgIFRpbWUgV2luZG93IENvbXBhY3Rpb24gU3RyYXRlZ3kgaXMgZGVzaWduZWQgZm9yIFRUTCdlZCwgbW9zdGx5CisgIGltbXV0YWJsZSB0aW1lIHNlcmllcyBkYXRhLgorCis9PSBUeXBlcyBvZiBjb21wYWN0aW9uCisKK1RoZSBjb25jZXB0IG9mIGNvbXBhY3Rpb24gaXMgdXNlZCBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIG9wZXJhdGlvbnMgaW4KK0Nhc3NhbmRyYSwgdGhlIGNvbW1vbiB0aGluZyBhYm91dCB0aGVzZSBvcGVyYXRpb25zIGlzIHRoYXQgaXQgdGFrZXMgb25lCitvciBtb3JlIFNTVGFibGVzIGFuZCBvdXRwdXQgbmV3IFNTVGFibGVzLiBUaGUgdHlwZXMgb2YgY29tcGFjdGlvbnMgYXJlOgorCitNaW5vciBjb21wYWN0aW9uOjoKKyAgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkgaW4gQ2Fzc2FuZHJhLgorTWFqb3IgY29tcGFjdGlvbjo6CisgIGEgdXNlciBleGVjdXRlcyBhIGNvbXBhY3Rpb24gb3ZlciBhbGwgU1NUYWJsZXMgb24gdGhlIG5vZGUuCitVc2VyIGRlZmluZWQgY29tcGFjdGlvbjo6CisgIGEgdXNlciB0cmlnZ2VycyBhIGNvbXBhY3Rpb24gb24gYSBnaXZlbiBzZXQgb2YgU1NUYWJsZXMuCitTY3J1Yjo6CisgIHRyeSB0byBmaXggYW55IGJyb2tlbiBTU1RhYmxlcy4gVGhpcyBjYW4gYWN0dWFsbHkgcmVtb3ZlIHZhbGlkIGRhdGEgaWYKKyAgdGhhdCBkYXRhIGlzIGNvcnJ1cHRlZCwgaWYgdGhhdCBoYXBwZW5zIHlvdSB3aWxsIG5lZWQgdG8gcnVuIGEgZnVsbAorICByZXBhaXIgb24gdGhlIG5vZGUuCitVcGdyYWRlU1NUYWJsZXM6OgorICB1cGdyYWRlIFNTVGFibGVzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbi4gUnVuIHRoaXMgYWZ0ZXIgdXBncmFkaW5nIHRvIGEKKyAgbmV3IG1ham9yIHZlcnNpb24uCitDbGVhbnVwOjoKKyAgcmVtb3ZlIGFueSByYW5nZXMgdGhpcyBub2RlIGRvZXMgbm90IG93biBhbnltb3JlLCB0eXBpY2FsbHkgdHJpZ2dlcmVkCisgIG9uIG5laWdoYm91cmluZyBub2RlcyBhZnRlciBhIG5vZGUgaGFzIGJlZW4gYm9vdHN0cmFwcGVkIHNpbmNlIHRoYXQKKyAgbm9kZSB3aWxsIHRha2Ugb3duZXJzaGlwIG9mIHNvbWUgcmFuZ2VzIGZyb20gdGhvc2Ugbm9kZXMuCitTZWNvbmRhcnkgaW5kZXggcmVidWlsZDo6CisgIHJlYnVpbGQgdGhlIHNlY29uZGFyeSBpbmRleGVzIG9uIHRoZSBub2RlLgorQW50aWNvbXBhY3Rpb246OgorICBhZnRlciByZXBhaXIgdGhlIHJhbmdlcyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVwYWlyZWQgYXJlIHNwbGl0IG91dCBvZgorICB0aGUgU1NUYWJsZXMgdGhhdCBleGlzdGVkIHdoZW4gcmVwYWlyIHN0YXJ0ZWQuCitTdWIgcmFuZ2UgY29tcGFjdGlvbjo6CisgIEl0IGlzIHBvc3NpYmxlIHRvIG9ubHkgY29tcGFjdCBhIGdpdmVuIHN1YiByYW5nZSAtIHRoaXMgY291bGQgYmUKKyAgdXNlZnVsIGlmIHlvdSBrbm93IGEgdG9rZW4gdGhhdCBoYXMgYmVlbiBtaXNiZWhhdmluZyAtIGVpdGhlcgorICBnYXRoZXJpbmcgbWFueSB1cGRhdGVzIG9yIG1hbnkgZGVsZXRlcy4KKyAgKGBub2RldG9vbCBjb21wYWN0IC1zdCB4IC1ldCB5YCkgd2lsbCBwaWNrIGFsbCBTU1RhYmxlcyBjb250YWluaW5nIHRoZQorICByYW5nZSBiZXR3ZWVuIHggYW5kIHkgYW5kIGlzc3VlIGEgY29tcGFjdGlvbiBmb3IgdGhvc2UgU1NUYWJsZXMuIEZvcgorICBTVENTIHRoaXMgd2lsbCBtb3N0IGxpa2VseSBpbmNsdWRlIGFsbCBTU1RhYmxlcyBidXQgd2l0aCBMQ1MgaXQgY2FuCisgIGlzc3VlIHRoZSBjb21wYWN0aW9uIGZvciBhIHN1YnNldCBvZiB0aGUgU1NUYWJsZXMuIFdpdGggTENTIHRoZQorICByZXN1bHRpbmcgc3N0YWJsZSB3aWxsIGVuZCB1cCBpbiBMMC4KKworPT0gV2hlbiBpcyBhIG1pbm9yIGNvbXBhY3Rpb24gdHJpZ2dlcmVkPworCisqIFdoZW4gYW4gc3N0YWJsZSBpcyBhZGRlZCB0byB0aGUgbm9kZSB0aHJvdWdoIGZsdXNoaW5nL3N0cmVhbWluZworKiBXaGVuIGF1dG9jb21wYWN0aW9uIGlzIGVuYWJsZWQgYWZ0ZXIgYmVpbmcgZGlzYWJsZWQgKGBub2RldG9vbCBlbmFibGVhdXRvY29tcGFjdGlvbmApIAorKiBXaGVuIGNvbXBhY3Rpb24gYWRkcyBuZXcgU1NUYWJsZXMgCisqIEEgY2hlY2sgZm9yIG5ldyBtaW5vciBjb21wYWN0aW9ucyBldmVyeSA1IG1pbnV0ZXMKKworPT0gTWVyZ2luZyBTU1RhYmxlcworCitDb21wYWN0aW9uIGlzIGFib3V0IG1lcmdpbmcgU1NUYWJsZXMsIHNpbmNlIHBhcnRpdGlvbnMgaW4gU1NUYWJsZXMgYXJlCitzb3J0ZWQgYmFzZWQgb24gdGhlIGhhc2ggb2YgdGhlIHBhcnRpdGlvbiBrZXkgaXQgaXMgcG9zc2libGUgdG8KK2VmZmljaWVudGx5IG1lcmdlIHNlcGFyYXRlIFNTVGFibGVzLiBDb250ZW50IG9mIGVhY2ggcGFydGl0aW9uIGlzIGFsc28KK3NvcnRlZCBzbyBlYWNoIHBhcnRpdGlvbiBjYW4gYmUgbWVyZ2VkIGVmZmljaWVudGx5LgorCis9PSBUb21ic3RvbmVzIGFuZCBHYXJiYWdlIENvbGxlY3Rpb24gKEdDKSBHcmFjZQorCis9PT0gV2h5IFRvbWJzdG9uZXMKKworV2hlbiBhIGRlbGV0ZSByZXF1ZXN0IGlzIHJlY2VpdmVkIGJ5IENhc3NhbmRyYSBpdCBkb2VzIG5vdCBhY3R1YWxseQorcmVtb3ZlIHRoZSBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgc3RvcmUuIEluc3RlYWQgaXQgd3JpdGVzIGEgc3BlY2lhbAorcGllY2Ugb2YgZGF0YSBrbm93biBhcyBhIHRvbWJzdG9uZS4gVGhlIFRvbWJzdG9uZSByZXByZXNlbnRzIHRoZSBkZWxldGUKK2FuZCBjYXVzZXMgYWxsIHZhbHVlcyB3aGljaCBvY2N1cnJlZCBiZWZvcmUgdGhlIHRvbWJzdG9uZSB0byBub3QgYXBwZWFyCitpbiBxdWVyaWVzIHRvIHRoZSBkYXRhYmFzZS4gVGhpcyBhcHByb2FjaCBpcyB1c2VkIGluc3RlYWQgb2YgcmVtb3ZpbmcKK3ZhbHVlcyBiZWNhdXNlIG9mIHRoZSBkaXN0cmlidXRlZCBuYXR1cmUgb2YgQ2Fzc2FuZHJhLgorCis9PT0gRGVsZXRlcyB3aXRob3V0IHRvbWJzdG9uZXMKKworSW1hZ2luZSBhIHRocmVlIG5vZGUgY2x1c3RlciB3aGljaCBoYXMgdGhlIHZhbHVlIFtBXSByZXBsaWNhdGVkIHRvIGV2ZXJ5Citub2RlLjoKKworW3NvdXJjZSxub25lXQorLS0tLQorW0FdLCBbQV0sIFtBXQorLS0tLQorCitJZiBvbmUgb2YgdGhlIG5vZGVzIGZhaWxzIGFuZCBhbmQgb3VyIGRlbGV0ZSBvcGVyYXRpb24gb25seSByZW1vdmVzCitleGlzdGluZyB2YWx1ZXMgd2UgY2FuIGVuZCB1cCB3aXRoIGEgY2x1c3RlciB0aGF0IGxvb2tzIGxpa2U6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK1tdLCBbXSwgW0FdCistLS0tCisKK1RoZW4gYSByZXBhaXIgb3BlcmF0aW9uIHdvdWxkIHJlcGxhY2UgdGhlIHZhbHVlIG9mIFtBXSBiYWNrIG9udG8gdGhlIHR3bworbm9kZXMgd2hpY2ggYXJlIG1pc3NpbmcgdGhlIHZhbHVlLjoKKworW3NvdXJjZSxub25lXQorLS0tLQorW0FdLCBbQV0sIFtBXQorLS0tLQorCitUaGlzIHdvdWxkIGNhdXNlIG91ciBkYXRhIHRvIGJlIHJlc3VycmVjdGVkIGV2ZW4gdGhvdWdoIGl0IGhhZCBiZWVuCitkZWxldGVkLgorCis9PT0gRGVsZXRlcyB3aXRoIFRvbWJzdG9uZXMKKworU3RhcnRpbmcgYWdhaW4gd2l0aCBhIHRocmVlIG5vZGUgY2x1c3RlciB3aGljaCBoYXMgdGhlIHZhbHVlIFtBXQorcmVwbGljYXRlZCB0byBldmVyeSBub2RlLjoKKworW3NvdXJjZSxub25lXQorLS0tLQorW0FdLCBbQV0sIFtBXQorLS0tLQorCitJZiBpbnN0ZWFkIG9mIHJlbW92aW5nIGRhdGEgd2UgYWRkIGEgdG9tYnN0b25lIHJlY29yZCwgb3VyIHNpbmdsZSBub2RlCitmYWlsdXJlIHNpdHVhdGlvbiB3aWxsIGxvb2sgbGlrZSB0aGlzLjoKKworW3NvdXJjZSxub25lXQorLS0tLQorW0EsIFRvbWJzdG9uZVtBXV0sIFtBLCBUb21ic3RvbmVbQV1dLCBbQV0KKy0tLS0KKworTm93IHdoZW4gd2UgaXNzdWUgYSByZXBhaXIgdGhlIFRvbWJzdG9uZSB3aWxsIGJlIGNvcGllZCB0byB0aGUgcmVwbGljYSwKK3JhdGhlciB0aGFuIHRoZSBkZWxldGVkIGRhdGEgYmVpbmcgcmVzdXJyZWN0ZWQuOgorCitbc291cmNlLG5vbmVdCistLS0tCitbQSwgVG9tYnN0b25lW0FdXSwgW0EsIFRvbWJzdG9uZVtBXV0sIFtBLCBUb21ic3RvbmVbQV1dCistLS0tCisKK091ciByZXBhaXIgb3BlcmF0aW9uIHdpbGwgY29ycmVjdGx5IHB1dCB0aGUgc3RhdGUgb2YgdGhlIHN5c3RlbSB0byB3aGF0Cit3ZSBleHBlY3Qgd2l0aCB0aGUgcmVjb3JkIFtBXSBtYXJrZWQgYXMgZGVsZXRlZCBvbiBhbGwgbm9kZXMuIFRoaXMgZG9lcworbWVhbiB3ZSB3aWxsIGVuZCB1cCBhY2NydWluZyBUb21ic3RvbmVzIHdoaWNoIHdpbGwgcGVybWFuZW50bHkKK2FjY3VtdWxhdGUgZGlzayBzcGFjZS4gVG8gYXZvaWQga2VlcGluZyB0b21ic3RvbmVzIGZvcmV2ZXIgd2UgaGF2ZSBhCitwYXJhbWV0ZXIga25vd24gYXMgYGdjX2dyYWNlX3NlY29uZHNgIGZvciBldmVyeSB0YWJsZSBpbiBDYXNzYW5kcmEuCisKKz09PSBUaGUgZ2NfZ3JhY2Vfc2Vjb25kcyBwYXJhbWV0ZXIgYW5kIFRvbWJzdG9uZSBSZW1vdmFsCisKK1RoZSB0YWJsZSBsZXZlbCBgZ2NfZ3JhY2Vfc2Vjb25kc2AgcGFyYW1ldGVyIGNvbnRyb2xzIGhvdyBsb25nIENhc3NhbmRyYQord2lsbCByZXRhaW4gdG9tYnN0b25lcyB0aHJvdWdoIGNvbXBhY3Rpb24gZXZlbnRzIGJlZm9yZSBmaW5hbGx5IHJlbW92aW5nCit0aGVtLiBUaGlzIGR1cmF0aW9uIHNob3VsZCBkaXJlY3RseSByZWZsZWN0IHRoZSBhbW91bnQgb2YgdGltZSBhIHVzZXIKK2V4cGVjdHMgdG8gYWxsb3cgYmVmb3JlIHJlY292ZXJpbmcgYSBmYWlsZWQgbm9kZS4gQWZ0ZXIKK2BnY19ncmFjZV9zZWNvbmRzYCBoYXMgZXhwaXJlZCB0aGUgdG9tYnN0b25lIG1heSBiZSByZW1vdmVkIChtZWFuaW5nCit0aGVyZSB3aWxsIG5vIGxvbmdlciBiZSBhbnkgcmVjb3JkIHRoYXQgYSBjZXJ0YWluIHBpZWNlIG9mIGRhdGEgd2FzCitkZWxldGVkKSwgYnV0IGFzIGEgdG9tYnN0b25lIGNhbiBsaXZlIGluIG9uZSBzc3RhYmxlIGFuZCB0aGUgZGF0YSBpdAorY292ZXJzIGluIGFub3RoZXIsIGEgY29tcGFjdGlvbiBtdXN0IGFsc28gaW5jbHVkZSBib3RoIHNzdGFibGUgZm9yIGEKK3RvbWJzdG9uZSB0byBiZSByZW1vdmVkLiBNb3JlIHByZWNpc2VseSwgdG8gYmUgYWJsZSB0byBkcm9wIGFuIGFjdHVhbAordG9tYnN0b25lIHRoZSBmb2xsb3dpbmcgbmVlZHMgdG8gYmUgdHJ1ZTsKKworKiBUaGUgdG9tYnN0b25lIG11c3QgYmUgb2xkZXIgdGhhbiBgZ2NfZ3JhY2Vfc2Vjb25kc2AKKyogSWYgcGFydGl0aW9uIFggY29udGFpbnMgdGhlIHRvbWJzdG9uZSwgdGhlIHNzdGFibGUgY29udGFpbmluZyB0aGUKK3BhcnRpdGlvbiBwbHVzIGFsbCBTU1RhYmxlcyBjb250YWluaW5nIGRhdGEgb2xkZXIgdGhhbiB0aGUgdG9tYnN0b25lCitjb250YWluaW5nIFggbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgc2FtZSBjb21wYWN0aW9uLiBXZSBkb24ndCBuZWVkIHRvCitjYXJlIGlmIHRoZSBwYXJ0aXRpb24gaXMgaW4gYW4gc3N0YWJsZSBpZiB3ZSBjYW4gZ3VhcmFudGVlIHRoYXQgYWxsIGRhdGEKK2luIHRoYXQgc3N0YWJsZSBpcyBuZXdlciB0aGFuIHRoZSB0b21ic3RvbmUuIElmIHRoZSB0b21ic3RvbmUgaXMgb2xkZXIKK3RoYW4gdGhlIGRhdGEgaXQgY2Fubm90IHNoYWRvdyB0aGF0IGRhdGEuCisqIElmIHRoZSBvcHRpb24gYG9ubHlfcHVyZ2VfcmVwYWlyZWRfdG9tYnN0b25lc2AgaXMgZW5hYmxlZCwgdG9tYnN0b25lcworYXJlIG9ubHkgcmVtb3ZlZCBpZiB0aGUgZGF0YSBoYXMgYWxzbyBiZWVuIHJlcGFpcmVkLgorCitJZiBhIG5vZGUgcmVtYWlucyBkb3duIG9yIGRpc2Nvbm5lY3RlZCBmb3IgbG9uZ2VyIHRoYW4KK2BnY19ncmFjZV9zZWNvbmRzYCBpdCdzIGRlbGV0ZWQgZGF0YSB3aWxsIGJlIHJlcGFpcmVkIGJhY2sgdG8gdGhlIG90aGVyCitub2RlcyBhbmQgcmUtYXBwZWFyIGluIHRoZSBjbHVzdGVyLiBUaGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBpbiB0aGUKKyJEZWxldGVzIHdpdGhvdXQgVG9tYnN0b25lcyIgc2VjdGlvbi4gTm90ZSB0aGF0IHRvbWJzdG9uZXMgd2lsbCBub3QgYmUKK3JlbW92ZWQgdW50aWwgYSBjb21wYWN0aW9uIGV2ZW50IGV2ZW4gaWYgYGdjX2dyYWNlX3NlY29uZHNgIGhhcyBlbGFwc2VkLgorCitUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgYGdjX2dyYWNlX3NlY29uZHNgIGlzIDg2NDAwMCB3aGljaCBpcyBlcXVpdmFsZW50Cit0byAxMCBkYXlzLiBUaGlzIGNhbiBiZSBzZXQgd2hlbiBjcmVhdGluZyBvciBhbHRlcmluZyBhIHRhYmxlIHVzaW5nCitgV0lUSCBnY19ncmFjZV9zZWNvbmRzYC4KKworPT0gVFRMCisKK0RhdGEgaW4gQ2Fzc2FuZHJhIGNhbiBoYXZlIGFuIGFkZGl0aW9uYWwgcHJvcGVydHkgY2FsbGVkIHRpbWUgdG8gbGl2ZSAtCit0aGlzIGlzIHVzZWQgdG8gYXV0b21hdGljYWxseSBkcm9wIGRhdGEgdGhhdCBoYXMgZXhwaXJlZCBvbmNlIHRoZSB0aW1lCitpcyByZWFjaGVkLiBPbmNlIHRoZSBUVEwgaGFzIGV4cGlyZWQgdGhlIGRhdGEgaXMgY29udmVydGVkIHRvIGEKK3RvbWJzdG9uZSB3aGljaCBzdGF5cyBhcm91bmQgZm9yIGF0IGxlYXN0IGBnY19ncmFjZV9zZWNvbmRzYC4gTm90ZSB0aGF0CitpZiB5b3UgbWl4IGRhdGEgd2l0aCBUVEwgYW5kIGRhdGEgd2l0aG91dCBUVEwgKG9yIGp1c3QgZGlmZmVyZW50IGxlbmd0aAorb2YgdGhlIFRUTCkgQ2Fzc2FuZHJhIHdpbGwgaGF2ZSBhIGhhcmQgdGltZSBkcm9wcGluZyB0aGUgdG9tYnN0b25lcworY3JlYXRlZCBzaW5jZSB0aGUgcGFydGl0aW9uIG1pZ2h0IHNwYW4gbWFueSBTU1RhYmxlcyBhbmQgbm90IGFsbCBhcmUKK2NvbXBhY3RlZCBhdCBvbmNlLgorCis9PSBGdWxseSBleHBpcmVkIFNTVGFibGVzCisKK0lmIGFuIFNTVGFibGUgY29udGFpbnMgb25seSB0b21ic3RvbmVzIGFuZCBpdCBpcyBndWFyYW50ZWVkIHRoYXQKK1NTVGFibGUgaXMgbm90IHNoYWRvd2luZyBkYXRhIGluIGFueSBvdGhlciBTU1RhYmxlLCB0aGVuIHRoZSBjb21wYWN0aW9uIGNhbiBkcm9wCit0aGF0IFNTVGFibGUuIElmIHlvdSBzZWUgU1NUYWJsZXMgd2l0aCBvbmx5IHRvbWJzdG9uZXMgKG5vdGUgdGhhdCBUVEwtZWQKK2RhdGEgaXMgY29uc2lkZXJlZCB0b21ic3RvbmVzIG9uY2UgdGhlIHRpbWUtdG8tbGl2ZSBoYXMgZXhwaXJlZCksIGJ1dCBpdAoraXMgbm90IGJlaW5nIGRyb3BwZWQgYnkgY29tcGFjdGlvbiwgaXQgaXMgbGlrZWx5IHRoYXQgb3RoZXIgU1NUYWJsZXMKK2NvbnRhaW4gb2xkZXIgZGF0YS4gVGhlcmUgaXMgYSB0b29sIGNhbGxlZCBgc3N0YWJsZWV4cGlyZWRibG9ja2Vyc2AgdGhhdAord2lsbCBsaXN0IHdoaWNoIFNTVGFibGVzIGFyZSBkcm9wcGFibGUgYW5kIHdoaWNoIGFyZSBibG9ja2luZyB0aGVtIGZyb20KK2JlaW5nIGRyb3BwZWQuIFdpdGggYFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3lgIGl0CitpcyBwb3NzaWJsZSB0byByZW1vdmUgdGhlIGd1YXJhbnRlZSAobm90IGNoZWNrIGZvciBzaGFkb3dpbmcgZGF0YSkgYnkKK2VuYWJsaW5nIGB1bnNhZmVfYWdncmVzc2l2ZV9zc3RhYmxlX2V4cGlyYXRpb25gLgorCis9PSBSZXBhaXJlZC91bnJlcGFpcmVkIGRhdGEKKworV2l0aCBpbmNyZW1lbnRhbCByZXBhaXJzIENhc3NhbmRyYSBtdXN0IGtlZXAgdHJhY2sgb2Ygd2hhdCBkYXRhIGlzCityZXBhaXJlZCBhbmQgd2hhdCBkYXRhIGlzIHVucmVwYWlyZWQuIFdpdGggYW50aWNvbXBhY3Rpb24gcmVwYWlyZWQgZGF0YQoraXMgc3BsaXQgb3V0IGludG8gcmVwYWlyZWQgYW5kIHVucmVwYWlyZWQgU1NUYWJsZXMuIFRvIGF2b2lkIG1peGluZyB1cAordGhlIGRhdGEgYWdhaW4gc2VwYXJhdGUgY29tcGFjdGlvbiBzdHJhdGVneSBpbnN0YW5jZXMgYXJlIHJ1biBvbiB0aGUgdHdvCitzZXRzIG9mIGRhdGEsIGVhY2ggaW5zdGFuY2Ugb25seSBrbm93aW5nIGFib3V0IGVpdGhlciB0aGUgcmVwYWlyZWQgb3IKK3RoZSB1bnJlcGFpcmVkIFNTVGFibGVzLiBUaGlzIG1lYW5zIHRoYXQgaWYgeW91IG9ubHkgcnVuIGluY3JlbWVudGFsCityZXBhaXIgb25jZSBhbmQgdGhlbiBuZXZlciBhZ2FpbiwgeW91IG1pZ2h0IGhhdmUgdmVyeSBvbGQgZGF0YSBpbiB0aGUKK3JlcGFpcmVkIFNTVGFibGVzIHRoYXQgYmxvY2sgY29tcGFjdGlvbiBmcm9tIGRyb3BwaW5nIHRvbWJzdG9uZXMgaW4gdGhlCit1bnJlcGFpcmVkIChwcm9iYWJseSBuZXdlcikgU1NUYWJsZXMuCisKKz09IERhdGEgZGlyZWN0b3JpZXMKKworU2luY2UgdG9tYnN0b25lcyBhbmQgZGF0YSBjYW4gbGl2ZSBpbiBkaWZmZXJlbnQgU1NUYWJsZXMgaXQgaXMgaW1wb3J0YW50Cit0byByZWFsaXplIHRoYXQgbG9zaW5nIGFuIHNzdGFibGUgbWlnaHQgbGVhZCB0byBkYXRhIGJlY29taW5nIGxpdmUgYWdhaW4KKy0gdGhlIG1vc3QgY29tbW9uIHdheSBvZiBsb3NpbmcgU1NUYWJsZXMgaXMgdG8gaGF2ZSBhIGhhcmQgZHJpdmUgYnJlYWsKK2Rvd24uIFRvIGF2b2lkIG1ha2luZyBkYXRhIGxpdmUgdG9tYnN0b25lcyBhbmQgYWN0dWFsIGRhdGEgYXJlIGFsd2F5cyBpbgordGhlIHNhbWUgZGF0YSBkaXJlY3RvcnkuIFRoaXMgd2F5LCBpZiBhIGRpc2sgaXMgbG9zdCwgYWxsIHZlcnNpb25zIG9mIGEKK3BhcnRpdGlvbiBhcmUgbG9zdCBhbmQgbm8gZGF0YSBjYW4gZ2V0IHVuZGVsZXRlZC4gVG8gYWNoaWV2ZSB0aGlzIGEKK2NvbXBhY3Rpb24gc3RyYXRlZ3kgaW5zdGFuY2UgcGVyIGRhdGEgZGlyZWN0b3J5IGlzIHJ1biBpbiBhZGRpdGlvbiB0bwordGhlIGNvbXBhY3Rpb24gc3RyYXRlZ3kgaW5zdGFuY2VzIGNvbnRhaW5pbmcgcmVwYWlyZWQvdW5yZXBhaXJlZCBkYXRhLAordGhpcyBtZWFucyB0aGF0IGlmIHlvdSBoYXZlIDQgZGF0YSBkaXJlY3RvcmllcyB0aGVyZSB3aWxsIGJlIDgKK2NvbXBhY3Rpb24gc3RyYXRlZ3kgaW5zdGFuY2VzIHJ1bm5pbmcuIFRoaXMgaGFzIGEgZmV3IG1vcmUgYmVuZWZpdHMgdGhhbgoranVzdCBhdm9pZGluZyBkYXRhIGdldHRpbmcgdW5kZWxldGVkOgorCisqIEl0IGlzIHBvc3NpYmxlIHRvIHJ1biBtb3JlIGNvbXBhY3Rpb25zIGluIHBhcmFsbGVsIC0gbGV2ZWxlZAorY29tcGFjdGlvbiB3aWxsIGhhdmUgc2V2ZXJhbCB0b3RhbGx5IHNlcGFyYXRlIGxldmVsaW5ncyBhbmQgZWFjaCBvbmUgY2FuCitydW4gY29tcGFjdGlvbnMgaW5kZXBlbmRlbnRseSBmcm9tIHRoZSBvdGhlcnMuCisqIFVzZXJzIGNhbiBiYWNrdXAgYW5kIHJlc3RvcmUgYSBzaW5nbGUgZGF0YSBkaXJlY3RvcnkuCisqIE5vdGUgdGhvdWdoIHRoYXQgY3VycmVudGx5IGFsbCBkYXRhIGRpcmVjdG9yaWVzIGFyZSBjb25zaWRlcmVkIGVxdWFsLAorc28gaWYgeW91IGhhdmUgYSB0aW55IGRpc2sgYW5kIGEgYmlnIGRpc2sgYmFja2luZyB0d28gZGF0YSBkaXJlY3RvcmllcywKK3RoZSBiaWcgb25lIHdpbGwgYmUgbGltaXRlZCB0aGUgYnkgdGhlIHNtYWxsIG9uZS4gT25lIHdvcmsgYXJvdW5kIHRvCit0aGlzIGlzIHRvIGNyZWF0ZSBtb3JlIGRhdGEgZGlyZWN0b3JpZXMgYmFja2VkIGJ5IHRoZSBiaWcgZGlzay4KKworPT0gU2luZ2xlIHNzdGFibGUgdG9tYnN0b25lIGNvbXBhY3Rpb24KKworV2hlbiBhbiBzc3RhYmxlIGlzIHdyaXR0ZW4gYSBoaXN0b2dyYW0gd2l0aCB0aGUgdG9tYnN0b25lIGV4cGlyeSB0aW1lcworaXMgY3JlYXRlZCBhbmQgdGhpcyBpcyB1c2VkIHRvIHRyeSB0byBmaW5kIFNTVGFibGVzIHdpdGggdmVyeSBtYW55Cit0b21ic3RvbmVzIGFuZCBydW4gc2luZ2xlIHNzdGFibGUgY29tcGFjdGlvbiBvbiB0aGF0IHNzdGFibGUgaW4gaG9wZSBvZgorYmVpbmcgYWJsZSB0byBkcm9wIHRvbWJzdG9uZXMgaW4gdGhhdCBzc3RhYmxlLiBCZWZvcmUgc3RhcnRpbmcgdGhpcyBpdAoraXMgYWxzbyBjaGVja2VkIGhvdyBsaWtlbHkgaXQgaXMgdGhhdCBhbnkgdG9tYnN0b25lcyB3aWxsIGFjdHVhbGx5IHdpbGwKK2JlIGFibGUgdG8gYmUgZHJvcHBlZCBob3cgbXVjaCB0aGlzIHNzdGFibGUgb3ZlcmxhcHMgd2l0aCBvdGhlcgorU1NUYWJsZXMuIFRvIGF2b2lkIG1vc3Qgb2YgdGhlc2UgY2hlY2tzIHRoZSBjb21wYWN0aW9uIG9wdGlvbgorYHVuY2hlY2tlZF90b21ic3RvbmVfY29tcGFjdGlvbmAgY2FuIGJlIGVuYWJsZWQuCisKK1tbY29tcGFjdGlvbi1vcHRpb25zXV0KKz09IENvbW1vbiBvcHRpb25zCisKK1RoZXJlIGlzIGEgbnVtYmVyIG9mIGNvbW1vbiBvcHRpb25zIGZvciBhbGwgdGhlIGNvbXBhY3Rpb24gc3RyYXRlZ2llczsKKworYGVuYWJsZWRgIChkZWZhdWx0OiB0cnVlKTo6CisgIFdoZXRoZXIgbWlub3IgY29tcGFjdGlvbnMgc2hvdWxkIHJ1bi4gTm90ZSB0aGF0IHlvdSBjYW4gaGF2ZQorICAnZW5hYmxlZCc6IHRydWUgYXMgYSBjb21wYWN0aW9uIG9wdGlvbiBhbmQgdGhlbiBkbyAnbm9kZXRvb2wKKyAgZW5hYmxlYXV0b2NvbXBhY3Rpb24nIHRvIHN0YXJ0IHJ1bm5pbmcgY29tcGFjdGlvbnMuCitgdG9tYnN0b25lX3RocmVzaG9sZGAgKGRlZmF1bHQ6IDAuMik6OgorICBIb3cgbXVjaCBvZiB0aGUgc3N0YWJsZSBzaG91bGQgYmUgdG9tYnN0b25lcyBmb3IgdXMgdG8gY29uc2lkZXIgZG9pbmcKKyAgYSBzaW5nbGUgc3N0YWJsZSBjb21wYWN0aW9uIG9mIHRoYXQgc3N0YWJsZS4KK2B0b21ic3RvbmVfY29tcGFjdGlvbl9pbnRlcnZhbGAgKGRlZmF1bHQ6IDg2NDAwcyAoMSBkYXkpKTo6CisgIFNpbmNlIGl0IG1pZ2h0IG5vdCBiZSBwb3NzaWJsZSB0byBkcm9wIGFueSB0b21ic3RvbmVzIHdoZW4gZG9pbmcgYQorICBzaW5nbGUgc3N0YWJsZSBjb21wYWN0aW9uIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgb25lIHNzdGFibGUgaXMgbm90CisgIGNvbnN0YW50bHkgZ2V0dGluZyByZWNvbXBhY3RlZCAtIHRoaXMgb3B0aW9uIHN0YXRlcyBob3cgb2Z0ZW4gd2UKKyAgc2hvdWxkIHRyeSBmb3IgYSBnaXZlbiBzc3RhYmxlLgorYGxvZ19hbGxgIChkZWZhdWx0OiBmYWxzZSk6OgorICBOZXcgZGV0YWlsZWQgY29tcGFjdGlvbiBsb2dnaW5nLCBzZWUKKyAgYGJlbG93IDxkZXRhaWxlZC1jb21wYWN0aW9uLWxvZ2dpbmc+YC4KK2B1bmNoZWNrZWRfdG9tYnN0b25lX2NvbXBhY3Rpb25gIChkZWZhdWx0OiBmYWxzZSk6OgorICBUaGUgc2luZ2xlIHNzdGFibGUgY29tcGFjdGlvbiBoYXMgcXVpdGUgc3RyaWN0IGNoZWNrcyBmb3Igd2hldGhlciBpdAorICBzaG91bGQgYmUgc3RhcnRlZCwgdGhpcyBvcHRpb24gZGlzYWJsZXMgdGhvc2UgY2hlY2tzIGFuZCBmb3Igc29tZQorICB1c2VjYXNlcyB0aGlzIG1pZ2h0IGJlIG5lZWRlZC4gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgY2hhbmdlIGFueXRoaW5nCisgIGZvciB0aGUgYWN0dWFsIGNvbXBhY3Rpb24sIHRvbWJzdG9uZXMgYXJlIG9ubHkgZHJvcHBlZCBpZiBpdCBpcyBzYWZlCisgIHRvIGRvIHNvIC0gaXQgbWlnaHQganVzdCByZXdyaXRlIGFuIHNzdGFibGUgd2l0aG91dCBiZWluZyBhYmxlIHRvIGRyb3AKKyAgYW55IHRvbWJzdG9uZXMuCitgb25seV9wdXJnZV9yZXBhaXJlZF90b21ic3RvbmVgIChkZWZhdWx0OiBmYWxzZSk6OgorICBPcHRpb24gdG8gZW5hYmxlIHRoZSBleHRyYSBzYWZldHkgb2YgbWFraW5nIHN1cmUgdGhhdCB0b21ic3RvbmVzIGFyZQorICBvbmx5IGRyb3BwZWQgaWYgdGhlIGRhdGEgaGFzIGJlZW4gcmVwYWlyZWQuCitgbWluX3RocmVzaG9sZGAgKGRlZmF1bHQ6IDQpOjoKKyAgTG93ZXIgbGltaXQgb2YgbnVtYmVyIG9mIFNTVGFibGVzIGJlZm9yZSBhIGNvbXBhY3Rpb24gaXMgdHJpZ2dlcmVkLgorICBOb3QgdXNlZCBmb3IgYExldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3lgLgorYG1heF90aHJlc2hvbGRgIChkZWZhdWx0OiAzMik6OgorICBVcHBlciBsaW1pdCBvZiBudW1iZXIgb2YgU1NUYWJsZXMgYmVmb3JlIGEgY29tcGFjdGlvbiBpcyB0cmlnZ2VyZWQuCisgIE5vdCB1c2VkIGZvciBgTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneWAuCisKK0Z1cnRoZXIsIHNlZSB0aGUgc2VjdGlvbiBvbiBlYWNoIHN0cmF0ZWd5IGZvciBzcGVjaWZpYyBhZGRpdGlvbmFsCitvcHRpb25zLgorCis9PSBDb21wYWN0aW9uIG5vZGV0b29sIGNvbW1hbmRzCisKK1RoZSBgbm9kZXRvb2wgPG5vZGV0b29sPmAgdXRpbGl0eSBwcm92aWRlcyBhIG51bWJlciBvZiBjb21tYW5kcyByZWxhdGVkCit0byBjb21wYWN0aW9uOgorCitgZW5hYmxlYXV0b2NvbXBhY3Rpb25gOjoKKyAgRW5hYmxlIGNvbXBhY3Rpb24uCitgZGlzYWJsZWF1dG9jb21wYWN0aW9uYDo6CisgIERpc2FibGUgY29tcGFjdGlvbi4KK2BzZXRjb21wYWN0aW9udGhyb3VnaHB1dGA6OgorICBIb3cgZmFzdCBjb21wYWN0aW9uIHNob3VsZCBydW4gYXQgbW9zdCAtIGRlZmF1bHRzIHRvIDY0TWlCL3MuCitgY29tcGFjdGlvbnN0YXRzYDo6CisgIFN0YXRpc3RpY3MgYWJvdXQgY3VycmVudCBhbmQgcGVuZGluZyBjb21wYWN0aW9ucy4KK2Bjb21wYWN0aW9uaGlzdG9yeWA6OgorICBMaXN0IGRldGFpbHMgYWJvdXQgdGhlIGxhc3QgY29tcGFjdGlvbnMuCitgc2V0Y29tcGFjdGlvbnRocmVzaG9sZGA6OgorICBTZXQgdGhlIG1pbi9tYXggc3N0YWJsZSBjb3VudCBmb3Igd2hlbiB0byB0cmlnZ2VyIGNvbXBhY3Rpb24sIGRlZmF1bHRzCisgIHRvIDQvMzIuCisKKz09IFN3aXRjaGluZyB0aGUgY29tcGFjdGlvbiBzdHJhdGVneSBhbmQgb3B0aW9ucyB1c2luZyBKTVgKKworSXQgaXMgcG9zc2libGUgdG8gc3dpdGNoIGNvbXBhY3Rpb24gc3RyYXRlZ2llcyBhbmQgaXRzIG9wdGlvbnMgb24ganVzdCBhCitzaW5nbGUgbm9kZSB1c2luZyBKTVgsIHRoaXMgaXMgYSBncmVhdCB3YXkgdG8gZXhwZXJpbWVudCB3aXRoIHNldHRpbmdzCit3aXRob3V0IGFmZmVjdGluZyB0aGUgd2hvbGUgY2x1c3Rlci4gVGhlIG1iZWFuIGlzOgorCitbc291cmNlLG5vbmVdCistLS0tCitvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPUNvbHVtbkZhbWlsaWVzLGtleXNwYWNlPTxrZXlzcGFjZV9uYW1lPixjb2x1bW5mYW1pbHk9PHRhYmxlX25hbWU+CistLS0tCisKK2FuZCB0aGUgYXR0cmlidXRlIHRvIGNoYW5nZSBpcyBgQ29tcGFjdGlvblBhcmFtZXRlcnNgIG9yCitgQ29tcGFjdGlvblBhcmFtZXRlcnNKc29uYCBpZiB5b3UgdXNlIGpjb25zb2xlIG9yIGptYy4gVGhlIHN5bnRheCBmb3IKK3RoZSBqc29uIHZlcnNpb24gaXMgdGhlIHNhbWUgYXMgeW91IHdvdWxkIHVzZSBpbiBhbgorYEFMVEVSIFRBQkxFIDxhbHRlci10YWJsZS1zdGF0ZW1lbnQ+YCBzdGF0ZW1lbnQgLWZvciBleGFtcGxlOgorCitbc291cmNlLG5vbmVdCistLS0tCit7ICdjbGFzcyc6ICdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5JywgJ3NzdGFibGVfc2l6ZV9pbl9tYic6IDEyMywgJ2Zhbm91dF9zaXplJzogMTB9CistLS0tCisKK1RoZSBzZXR0aW5nIGlzIGtlcHQgdW50aWwgc29tZW9uZSBleGVjdXRlcyBhbgorYEFMVEVSIFRBQkxFIDxhbHRlci10YWJsZS1zdGF0ZW1lbnQ+YCB0aGF0IHRvdWNoZXMgdGhlIGNvbXBhY3Rpb24KK3NldHRpbmdzIG9yIHJlc3RhcnRzIHRoZSBub2RlLgorCitbW2RldGFpbGVkLWNvbXBhY3Rpb24tbG9nZ2luZ11dCis9PSBNb3JlIGRldGFpbGVkIGNvbXBhY3Rpb24gbG9nZ2luZworCitFbmFibGUgd2l0aCB0aGUgY29tcGFjdGlvbiBvcHRpb24gYGxvZ19hbGxgIGFuZCBhIG1vcmUgZGV0YWlsZWQKK2NvbXBhY3Rpb24gbG9nIGZpbGUgd2lsbCBiZSBwcm9kdWNlZCBpbiB5b3VyIGxvZyBkaXJlY3RvcnkuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2NvbXBhY3Rpb24vbGNzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2NvbXBhY3Rpb24vbGNzLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvY29tcGFjdGlvbi9sY3MuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9jb21wYWN0aW9uL2xjcy5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2NvbXBhY3Rpb24vc3Rjcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9jb21wYWN0aW9uL3N0Y3MuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9jb21wYWN0aW9uL3N0Y3MuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9jb21wYWN0aW9uL3N0Y3MuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9jb21wYWN0aW9uL3R3Y3MuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvY29tcGFjdGlvbi90d2NzLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvY29tcGFjdGlvbi90d2NzLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvY29tcGFjdGlvbi90d2NzLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvY29tcHJlc3Npb24uYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvY29tcHJlc3Npb24uYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9jb21wcmVzc2lvbi5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2NvbXByZXNzaW9uLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvZGVueWxpc3RpbmdfcGFydGl0aW9ucy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9kZW55bGlzdGluZ19wYXJ0aXRpb25zLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxZGM4MAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvZGVueWxpc3RpbmdfcGFydGl0aW9ucy5hZG9jCkBAIC0wLDAgKzEsMTQzIEBACis9IERlbnlsaXN0aW5nIFBhcnRpdGlvbnMKKworRHVlIHRvIGFjY2VzcyBwYXR0ZXJucyBhbmQgZGF0YSBtb2RlbGluZywgc29tZXRpbWVzIHRoZXJlIGFyZSBzcGVjaWZpYyBwYXJ0aXRpb25zCit0aGF0IGFyZSAiaG90IiBhbmQgY2FuIGNhdXNlIGluc3RhYmlsaXR5IGluIGEgQ2Fzc2FuZHJhIGNsdXN0ZXIuIFRoaXMgb2Z0ZW4gb2NjdXJzCit3aGVuIHlvdXIgZGF0YSBtb2RlbCBpbmNsdWRlcyBtYW55IHVwZGF0ZSBvciBpbnNlcnQgb3BlcmF0aW9ucyBvbiBhIHNpbmdsZSBwYXJ0aXRpb24sCitjYXVzaW5nIHRoZSBwYXJ0aXRpb24gdG8gZ3JvdyB2ZXJ5IGxhcmdlIG92ZXIgdGltZSBhbmQgaW4gdHVybiBtYWtpbmcgaXQgdmVyeSBleHBlbnNpdmUKK3RvIHJlYWQgYW5kIG1haW50YWluLgorCitDYXNzYW5kcmEgc3VwcG9ydHMgImRlbnlsaXN0aW5nIiB0aGVzZSBwcm9ibGVtYXRpYyBwYXJ0aXRpb25zIHNvIHRoYXQgd2hlbiBjbGllbnRzCitpc3N1ZSBwb2ludCByZWFkcyAoYFNFTEVDVGAgc3RhdGVtZW50cyB3aXRoIHRoZSBwYXJ0aXRpb24ga2V5IHNwZWNpZmllZCkgb3IgcmFuZ2UKK3JlYWRzIChgU0VMRUNUICpgLCBldGMgdGhhdCBwdWxsIGEgcmFuZ2Ugb2YgZGF0YSkgdGhhdCBpbnRlcnNlY3Qgd2l0aCBhIGJsb2NrZWQKK3BhcnRpdGlvbiBrZXksIHRoZSBxdWVyeSB3aWxsIGJlIGltbWVkaWF0ZWx5IHJlamVjdGVkIHdpdGggYW4gYEludmFsaWRRdWVyeUV4Y2VwdGlvbmAuCisKKz09IEhvdyB0byBkZW55bGlzdCBhIHBhcnRpdGlvbiBrZXkKKworVGhlIGBgc3lzdGVtX2Rpc3RyaWJ1dGVkLmRlbnlsaXN0ZWRfcGFydGl0aW9uc2BgIHRhYmxlIGNhbiBiZSB1c2VkIHRvIGRlbnlsaXN0IHBhcnRpdGlvbnMuCitUaGVyZSBhcmUgYSBjb3VwbGUgb2Ygd2F5cyB0byBpbnRlcmFjdCB3aXRoIGFuZCBtdXRhdGUgdGhpcyBkYXRhLiBGaXJzdDogZGlyZWN0bHkKK3ZpYSBDUUwgYnkgaW5zZXJ0aW5nIGEgcmVjb3JkIHdpdGggdGhlIGZvbGxvd2luZyBkZXRhaWxzOgorCistIEtleXNwYWNlIG5hbWUgKGtzX25hbWUpCistIFRhYmxlIG5hbWUgKHRhYmxlX25hbWUpCistIFBhcnRpdGlvbiBLZXkgKHBhcnRpdGlvbl9rZXkpCisKK1RoZSBwYXJ0aXRpb24ga2V5IGZvcm1hdCBuZWVkcyB0byBiZSBpbiB0aGUgc2FtZSBmb3JtIHJlcXVpcmVkIGJ5IGBgbm9kZXRvb2wgZ2V0ZW5kcG9pbnRzYGAuCisKK0ZvbGxvd2luZyBhcmUgc2V2ZXJhbCBleGFtcGxlcyBmb3IgZGVueWxpc3RpbmcgcGFydGl0aW9uIGtleXMgaW4ga2V5c3BhY2UgYGtzYCBhbmQKK3RhYmxlIGB0YWJsZTFgIGZvciBkaWZmZXJlbnQgZGF0YSB0eXBlcyBvbiB0aGUgcHJpbWFyeSBrZXkgYElkYDoKKworLSBJZCBpcyBhIHNpbXBsZSB0eXBlIC0gYElOU0VSVCBJTlRPIHN5c3RlbV9kaXN0cmlidXRlZC5kZW55bGlzdGVkX3BhcnRpdGlvbnMgKGtzX25hbWUsIHRhYmxlX25hbWUsIHBhcnRpdGlvbl9rZXkpIFZBTFVFUyAoJ2tzJywndGFibGUxJywnMScpO2AKKy0gSWQgaXMgYSBibG9iICAgICAgICAtIGBJTlNFUlQgSU5UTyBzeXN0ZW1fZGlzdHJpYnV0ZWQuZGVueWxpc3RlZF9wYXJ0aXRpb25zIChrc19uYW1lLCB0YWJsZV9uYW1lLCBwYXJ0aXRpb25fa2V5KSBWQUxVRVMgKCdrcycsJ3RhYmxlMScsJzEyMzQ1ZicpO2AKKy0gSWQgaGFzIGEgY29sb24gICAgICAtIGBJTlNFUlQgSU5UTyBzeXN0ZW1fZGlzdHJpYnV0ZWQuZGVueWxpc3RlZF9wYXJ0aXRpb25zIChrc19uYW1lLCB0YWJsZV9uYW1lLCBwYXJ0aXRpb25fa2V5KSBWQUxVRVMgKCdrcycsJ3RhYmxlMScsJzFcOjInKTtgCisKK0luIHRoZSBjYXNlIG9mIGNvbXBvc2l0ZSBjb2x1bW4gcGFydGl0aW9uIGtleXMgKEtleTEsIEtleTIpOgorCistIGBJTlNFUlQgSU5UTyBzeXN0ZW1fZGlzdHJpYnV0ZWQuZGVueWxpc3RlZF9wYXJ0aXRpb25zIChrc19uYW1lLCB0YWJsZV9uYW1lLCBwYXJ0aXRpb25fa2V5KSBWQUxVRVMgKCdrcycsICd0YWJsZTEnLCAnazExOmsyMScpYAorCisKKz09PSBTcGVjaWFsIGNvbnNpZGVyYXRpb25zCisKK1RoZSBkZW55bGlzdCBoYXMgdGhlIHByb3BlcnR5IGluIHRoYXQgeW91IHdhbnQgdG8ga2VlcCB5b3VyIGNhY2hlIChzZWUgYmVsb3cpIGFuZAorQ1FMIGRhdGEgb24gYSByZXBsaWNhIHNldCBhcyBjbG9zZSB0b2dldGhlciBhcyBwb3NzaWJsZSwgc28geW91IGRvbid0IGhhdmUgZGlmZmVyZW50Citub2RlcyBpbiB5b3VyIGNsdXN0ZXIgZGVueWluZyBvciBhbGxvd2luZyBkaWZmZXJlbnQga2V5cy4gVG8gYmVzdCBhY2hpZXZlIHRoaXMsCit0aGUgd29ya2Zsb3cgZm9yIGEgZGVueWxpc3QgY2hhbmdlIChhZGRpdGlvbiBvciBkZWxldGlvbikgc2hvdWxkIGFsd2F5cyBiZSBhcyBmb2xsb3dzOgorCitKTVggUEFUSCAocHJlZmVycmVkIGZvciBzaW5nbGUgY2hhbmdlcyk6CisKKzEuIENhbGwgdGhlIEpNWCBob29rIGZvciBgYGRlbnlsaXN0S2V5KClgYCB3aXRoIHRoZSBkZXNpcmVkIGtleQorMi4gRG91YmxlLWNoZWNrIHRoZSBjYWNoZSByZWxvYWRlZCB3aXRoIGBgaXNLZXlEZW55bGlzdGVkKClgYAorMy4gQ2hlY2sgZm9yIHdhcm5pbmdzIGFib3V0IHVucmVjb2duaXplZCBrZXlzcGFjZS90YWJsZSBjb21iaW5hdGlvbnMsIGxpbWl0cywgb3IKK2NvbnNpc3RlbmN5IGxldmVsLiBJZiB5b3UgZ2V0IGEgbWVzc2FnZSBhYm91dCBub2RlcyBiZWluZyBkb3duIGFuZCBub3QgaGl0dGluZyBDTAorZm9yIGRlbnlsaXN0LCByZWNvdmVyIHRoZSBkb3duZWQgbm9kZXMgYW5kIHRoZW4gdHJpZ2dlciBhIHJlLWxvYWQgb2YgdGhlIGNhY2hlIG9uIGVhY2gKK25vZGUgd2l0aCBgYGxvYWRQYXJ0aXRpb25EZW55bGlzdCgpYGAKKworQ1FMIFBBVEggKHByZWZlcnJlZCBmb3IgYnVsayBjaGFuZ2VzKToKKworMS4gTXV0YXRlIHRoZSBkZW55bGlzdGVkIHBhcnRpdGlvbiBsaXN0cyB2aWEgQ1FMCisyLiBUcmlnZ2VyIGEgcmUtbG9hZCBvZiB0aGUgZGVueWxpc3QgY2FjaGUgb24gZWFjaCBub2RlIHZpYSBKTVggYGBsb2FkUGFydGl0aW9uRGVueWxpc3QoKWBgIChzZWUgYmVsb3cpCiszLiBDaGVjayBmb3Igd2FybmluZ3MgYWJvdXQgbGFjayBvZiBhdmFpbGFiaWxpdHkgZm9yIGEgZGVueWxpc3QgcmVmcmVzaC4gSW4gdGhlIGV2ZW50IG5vZGVzIGFyZSBkb3duLCByZWNvdmVyIHRoZW0sIHRoZW4gZ28gdG8gMi4KKworRHVlIHRvIGNvbmRpdGlvbnMgb24ga25vd24gdW5hdmFpbGFibGUgcmFuZ2Ugc2xpY2VzIGxlYWRpbmcgdG8gYWxlcnQgc3Rvcm1pbmcgb24KK3N0YXJ0dXAsIHRoZSBkZW55bGlzdCBjYWNoZSB3aWxsIG5vdCBsb2FkIG9uIG5vZGUgc3RhcnQgdW5sZXNzIGl0IGNhbiBhY2hpZXZlIHRoZQorY29uZmlndXJlZCBjb25zaXN0ZW5jeSBsZXZlbCBpbiBgY2Fzc2FuZHJhLnlhbWxgIC0gYGRlbnlsaXN0X2NvbnNpc3RlbmN5X2xldmVsYC4KK1RoZSBKTVggY2FsbCB0byBgbG9hZFBhcnRpdGlvbkRlbnlsaXN0YCB3aWxsLCBob3dldmVyLCBsb2FkIHRoZSBjYWNoZSByZWdhcmRsZXNzCitvZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGF2YWlsYWJsZS4gVGhpcyBsZWF2ZXMgdGhlIGNvbnRyb2wgZm9yIGRlbnlsaXN0aW5nIG9yIG5vdAorZGVueWxpc3RpbmcgZHVyaW5nIGRlZ3JhZGVkIGNsdXN0ZXIgc3RhdGVzIGluIHRoZSBoYW5kcyBvZiB0aGUgb3BlcmF0b3IuCisKKz09IERlbnlsaXN0ZWQgUGFydGl0aW9ucyBDYWNoZQorCitDYXNzYW5kcmEgaW50ZXJuYWxseSBtYWludGFpbnMgYW4gb24taGVhcCBjYWNoZSBvZiBkZW55bGlzdGVkIHBhcnRpdGlvbnMgbG9hZGVkCitmcm9tIGBgc3lzdGVtX2Rpc3RyaWJ1dGVkLmRlbnlsaXN0ZWRfcGFydGl0aW9uc2BgLiBUaGUgdmFsdWVzIGZvciBhIHRhYmxlIHdpbGwgYmUKK2F1dG9tYXRpY2FsbHkgcmVwb3B1bGF0ZWQgZXZlcnkgYGBkZW55bGlzdF9yZWZyZXNoYGAgYXMgc3BlY2lmaWVkIGluIHRoZQorYGNvbmYvY2Fzc2FuZHJhLnlhbWxgIGZpbGUsIGRlZmF1bHRpbmcgdG8gYDYwMHNgLCBvciAxMCBtaW51dGVzLiBJbnZhbGlkIHJlY29yZHMKKyh1bmtub3duIGtleXNwYWNlcywgdGFibGVzLCBvciBrZXlzKSB3aWxsIGJlIGlnbm9yZWQgYW5kIG5vdCBjYWNoZWQgb24gbG9hZC4KKworVGhlIGNhY2hlIGNhbiBiZSByZWZyZXNoZWQgaW4gdGhlIGZvbGxvd2luZyB3YXlzOgorCistIER1cmluZyBDYXNzYW5kcmEgbm9kZSBzdGFydHVwCistIFZpYSB0aGUgYXV0b21hdGljIG9uLWhlYXAgY2FjaGUgcmVmcmVzaCBtZWNoYW5pc21zLiBOb3RlOiB0aGlzIHdpbGwgb2NjdXIgYXN5bmNocm9ub3VzbHkKK29uIHF1ZXJ5IGFmdGVyIHRoZSBgYGRlbnlsaXN0X3JlZnJlc2hgYCB0aW1lIGlzIGhpdC4KKy0gVmlhIHRoZSBKTVggY29tbWFuZDogYGBsb2FkUGFydGl0aW9uRGVueWxpc3RgYCBpbiBgYHRoZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLgorU3RvcmFnZVByb3h5TUJlYW5gYCBpbnZvY2F0aW9uIHBvaW50LgorCitUaGUgQ2FjaGUgc2l6ZSBpcyBib3VuZGVkIGJ5IHRoZSBmb2xsb3dpbmcgdHdvIGNvbmZpZyBwcm9wZXJ0aWVzCisKKy0gZGVueWxpc3RfbWF4X2tleXNfcGVyX3RhYmxlCistIGRlbnlsaXN0X21heF9rZXlzX3RvdGFsCisKK09uIGNhY2hlIGxvYWQsIGlmIGEgdGFibGUgZXhjZWVkcyB0aGUgdmFsdWUgYWxsb3dlZCBpbiBgZGVueWxpc3RfbWF4X2tleXNfcGVyX3RhYmxlYCAoZGVmYXVsdHMgdG8gMTAwMCksCithIHdhcm5pbmcgd2lsbCBiZSBwcmludGVkIHRvIHRoZSBsb2dzIGFuZCB0aGUgcmVtYWluZGVyIG9mIHRoZSBrZXlzIHdpbGwgbm90IGJlIGNhY2hlZC4KK1NpbWlsYXJseSwgaWYgdGhlIHRvdGFsIGFsbG93ZWQgc2l6ZSBpcyBleGNlZWRlZCwgc3Vic2VxdWVudCBrc19uYW1lICsgdGFibGVfbmFtZQorY29tYmluYXRpb25zIChpbiBjbHVzdGVyaW5nIC8gbGV4aWNvZ3JhcGhpY2FsIG9yZGVyKSB3aWxsIGJlIHNraXBwZWQgYXMgd2VsbCwgYW5kIGEKK3dhcm5pbmcgbG9nZ2VkIHRvIHRoZSBzZXJ2ZXIgbG9ncy4KKworW05PVEVdCis9PT09CitHaXZlbiB0aGUgcmVxdWlyZWQgd29ya2Zsb3cgb2YgMSkgTXV0YXRlLCAyKSBSZWxvYWQgY2FjaGUsIHRoZSBhdXRvLXJlbG9hZAorcHJvcGVydHkgc2VlbXMgc3VwZXJmbHVvdXMuIEl0IGV4aXN0cyB0byBlbnN1cmUgdGhhdCwgc2hvdWxkIGFuIG9wZXJhdG9yIG1ha2UgYQorbWlzdGFrZSBhbmQgZGVueWxpc3QgKG9yIHVuZGVueWxpc3QpIGEga2V5IGJ1dCBmb3JnZXQgdG8gcmVsb2FkIHRoZSBjYWNoZSwgdGhhdAoraW50ZW50IHdpbGwgYmUgY2FwdHVyZWQgb24gdGhlIG5leHQgY2FjaGUgcmVsb2FkLgorPT09PQorCis9PSBKTVggSW50ZXJmYWNlCisKK1tjb2xzPSIxLDEiXQorfD09PQorfCBDb21tYW5kIHwgRWZmZWN0CisKK3wgbG9hZFBhcnRpdGlvbkRlbnlsaXN0KCkKK3wgUmVsb2FkcyBjYWNoZWQgZGVueWxpc3QgZnJvbSBDUUwgdGFibGUKKworfCBnZXRQYXJ0aXRpb25EZW55bGlzdExvYWRBdHRlbXB0cygpCit8IEdldHMgdGhlIGNvdW50IG9mIGNhY2hlIHJlbG9hZCBhdHRlbXB0cworCit8IGdldFBhcnRpdGlvbkRlbnlsaXN0TG9hZFN1Y2Nlc3NlcygpCit8IEdldHMgdGhlIGNvdW50IG9mIGNhY2hlIHJlbG9hZCBzdWNjZXNzZXMKKworfCBzZXRFbmFibGVQYXJ0aXRpb25EZW55bGlzdChib29sZWFuIGVuYWJsZWQpCit8IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHBhcnRpdGlvbiBkZW55bGlzdGluZyBmdW5jdGlvbmFsaXR5CisKK3wgc2V0RW5hYmxlRGVueWxpc3RXcml0ZXMoYm9vbGVhbiBlbmFibGVkKQorfCBFbmFibGVzIG9yIGRpc2FibGVzIHdyaXRlIGRlbnlsaXN0aW5nIGZ1bmN0aW9uYWxpdHkKKworfCBzZXRFbmFibGVEZW55bGlzdFJlYWRzKGJvb2xlYW4gZW5hYmxlZCkKK3wgRW5hYmxlcyBvciBkaXNhYmxlcyByZWFkIGRlbnlsaXN0aW5nIGZ1bmN0aW9uYWxpdHkKKworfCBzZXRFbmFibGVEZW55bGlzdFJhbmdlUmVhZHMoYm9vbGVhbiBlbmFibGVkKQorfCBFbmFibGVzIG9yIGRpc2FibGVzIHJhbmdlIHJlYWQgZGVueWxpc3RpbmcgZnVuY3Rpb25hbGl0eQorCit8IGRlbnlsaXN0S2V5KFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBTdHJpbmcgcGFydGl0aW9uS2V5QXNTdHJpbmcpCit8IEFkZHMgYSBzcGVjaWZpYyBrZXlzcGFjZSwgdGFibGUsIGFuZCBwYXJ0aXRpb24ga2V5IGNvbWJvIHRvIHRoZSBkZW55bGlzdAorCit8IHJlbW92ZURlbnlsaXN0S2V5KFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIGNmLCBTdHJpbmcgcGFydGl0aW9uS2V5QXNTdHJpbmcpCit8IFJlbW92ZXMgYSBzcGVjaWZpYyBrZXlzcGFjZSwgdGFibGUsIGFuZCBwYXJ0aXRpb24ga2V5IGNvbWJvIGZyb20gdGhlIGRlbnlsaXN0CisKK3wgc2V0RGVueWxpc3RNYXhLZXlzUGVyVGFibGUoaW50IHZhbHVlKQorfCBMaW1pdHMgY291bnQgb2YgYWxsb3dlZCBrZXlzIHBlciB0YWJsZSBpbiB0aGUgZGVueWxpc3QKKworfCBzZXREZW55bGlzdE1heEtleXNUb3RhbChpbnQgdmFsdWUpCit8IExpbWl0cyB0aGUgdG90YWwgY291bnQgb2YgYWxsb3dhYmxlIGRlbnlsaXN0ZWQga2V5cyBpbiB0aGUgc3lzdGVtCisKK3wgaXNLZXlEZW55bGlzdGVkKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBTdHJpbmcgcGFydGl0aW9uS2V5QXNTdHJpbmcpCit8IEluZGljYXRlcyB3aGV0aGVyIHRoZSBrZXlzcGFjZS50YWJsZSBoYXMgdGhlIGlucHV0IHBhcnRpdGlvbiBrZXkgZGVuaWVkCit8PT09CmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2ZxbGxvZ2dpbmcuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvZnFsbG9nZ2luZy5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2ZxbGxvZ2dpbmcuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9mcWxsb2dnaW5nLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvaGFyZHdhcmUuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvaGFyZHdhcmUuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9oYXJkd2FyZS5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2hhcmR3YXJlLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvaGludHMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvaGludHMuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9oaW50cy5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL2hpbnRzLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvaW5kZXguYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWVlMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9pbmRleC5hZG9jCkBAIC0wLDAgKzEsMTYgQEAKKz09IE9wZXJhdGluZyBDYXNzYW5kcmEKKworKiB4cmVmOm9wZXJhdGluZy9oYXJkd2FyZS5hZG9jW0hhcmR3YXJlXQorKiB4cmVmOm9wZXJhdGluZy9zZWN1cml0eS5hZG9jW1NlY3VyaXR5XQorKiB4cmVmOm9wZXJhdGluZy90b3BvX2NoYW5nZXMuYWRvY1tUb3BvbG9neSBjaGFuZ2VzXQorKiB4cmVmOm9wZXJhdGluZy9oaW50cy5hZG9jW0hpbnRzXQorKiB4cmVmOm9wZXJhdGluZy9yZXBhaXIuYWRvY1tSZXBhaXJdCisqIHhyZWY6b3BlcmF0aW5nL3JlYWRfcmVwYWlyLmFkb2NbUmVhZCByZXBhaXJdCisqIHhyZWY6b3BlcmF0aW5nL2JhY2t1cHMuYWRvY1tCYWNrdXBzXQorKiB4cmVmOm9wZXJhdGluZy9jb21wcmVzc2lvbi5hZG9jW0NvbXByZXNzaW9uXQorKiB4cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL2luZGV4LmFkb2NbQ29tcGFjdGlvbl0KKyogeHJlZjpvcGVyYXRpbmcvbWV0cmljcy5hZG9jW01vbml0b3JpbmddCisqIHhyZWY6b3BlcmF0aW5nL2J1bGtfbG9hZGluZy5hZG9jW0J1bGsgbG9hZGluZ10KKyogeHJlZjpvcGVyYXRpbmcvY2RjLmFkb2NbQ0RDXQorKiB4cmVmOm9wZXJhdGluZy9ibG9vbV9maWx0ZXJzLmFkb2NbQmxvb20gZmlsdGVyc10KKyogeHJlZjpvcGVyYXRpbmcvZGVueWxpc3RpbmdfcGFydGl0aW9ucy5hZG9jW0RlbnlsaXN0aW5nIHBhcnRpdGlvbnNdCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL21ldHJpY3MuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvbWV0cmljcy5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMDIyODUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL21ldHJpY3MuYWRvYwpAQCAtMCwwICsxLDEwOTcgQEAKKz0gTW9uaXRvcmluZworCitNZXRyaWNzIGluIENhc3NhbmRyYSBhcmUgbWFuYWdlZCB1c2luZyB0aGUKK2h0dHA6Ly9tZXRyaWNzLmRyb3B3aXphcmQuaW9bRHJvcHdpemFyZCBNZXRyaWNzXSBsaWJyYXJ5LiBUaGVzZSBtZXRyaWNzCitjYW4gYmUgcXVlcmllZCB2aWEgSk1YIG9yIHB1c2hlZCB0byBleHRlcm5hbCBtb25pdG9yaW5nIHN5c3RlbXMgdXNpbmcgYQorbnVtYmVyIG9mCitodHRwOi8vbWV0cmljcy5kcm9wd2l6YXJkLmlvLzMuMS4wL2dldHRpbmctc3RhcnRlZC8jb3RoZXItcmVwb3J0aW5nW2J1aWx0Citpbl0gYW5kIGh0dHA6Ly9tZXRyaWNzLmRyb3B3aXphcmQuaW8vMy4xLjAvbWFudWFsL3RoaXJkLXBhcnR5L1t0aGlyZAorcGFydHldIHJlcG9ydGVyIHBsdWdpbnMuCisKK01ldHJpY3MgYXJlIGNvbGxlY3RlZCBmb3IgYSBzaW5nbGUgbm9kZS4gSXQncyB1cCB0byB0aGUgb3BlcmF0b3IgdG8gdXNlCithbiBleHRlcm5hbCBtb25pdG9yaW5nIHN5c3RlbSB0byBhZ2dyZWdhdGUgdGhlbS4KKworPT0gTWV0cmljIFR5cGVzCisKK0FsbCBtZXRyaWNzIHJlcG9ydGVkIGJ5IGNhc3NhbmRyYSBmaXQgaW50byBvbmUgb2YgdGhlIGZvbGxvd2luZyB0eXBlcy4KKworYEdhdWdlYDo6CisgIEFuIGluc3RhbnRhbmVvdXMgbWVhc3VyZW1lbnQgb2YgYSB2YWx1ZS4KK2BDb3VudGVyYDo6CisgIEEgZ2F1Z2UgZm9yIGFuIGBBdG9taWNMb25nYCBpbnN0YW5jZS4gVHlwaWNhbGx5IHRoaXMgaXMgY29uc3VtZWQgYnkKKyAgbW9uaXRvcmluZyB0aGUgY2hhbmdlIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbGFyZ2UKKyAgaW5jcmVhc2UgY29tcGFyZWQgdG8gdGhlIG5vcm0uCitgSGlzdG9ncmFtYDo6CisgIE1lYXN1cmVzIHRoZSBzdGF0aXN0aWNhbCBkaXN0cmlidXRpb24gb2YgdmFsdWVzIGluIGEgc3RyZWFtIG9mIGRhdGEuCisgICsKKyAgSW4gYWRkaXRpb24gdG8gbWluaW11bSwgbWF4aW11bSwgbWVhbiwgZXRjLiwgaXQgYWxzbyBtZWFzdXJlcyBtZWRpYW4sCisgIDc1dGgsIDkwdGgsIDk1dGgsIDk4dGgsIDk5dGgsIGFuZCA5OS45dGggcGVyY2VudGlsZXMuCitgVGltZXJgOjoKKyAgTWVhc3VyZXMgYm90aCB0aGUgcmF0ZSB0aGF0IGEgcGFydGljdWxhciBwaWVjZSBvZiBjb2RlIGlzIGNhbGxlZCBhbmQKKyAgdGhlIGhpc3RvZ3JhbSBvZiBpdHMgZHVyYXRpb24uCitgTGF0ZW5jeWA6OgorICBTcGVjaWFsIHR5cGUgdGhhdCB0cmFja3MgbGF0ZW5jeSAoaW4gbWljcm9zZWNvbmRzKSB3aXRoIGEgYFRpbWVyYCBwbHVzCisgIGEgYENvdW50ZXJgIHRoYXQgdHJhY2tzIHRoZSB0b3RhbCBsYXRlbmN5IGFjY3J1ZWQgc2luY2Ugc3RhcnRpbmcuIFRoZQorICBmb3JtZXIgaXMgdXNlZnVsIGlmIHlvdSB0cmFjayB0aGUgY2hhbmdlIGluIHRvdGFsIGxhdGVuY3kgc2luY2UgdGhlCisgIGxhc3QgY2hlY2suIEVhY2ggbWV0cmljIG5hbWUgb2YgdGhpcyB0eXBlIHdpbGwgaGF2ZSAnTGF0ZW5jeScgYW5kCisgICdUb3RhbExhdGVuY3knIGFwcGVuZGVkIHRvIGl0LgorYE1ldGVyYDo6CisgIEEgbWV0ZXIgbWV0cmljIHdoaWNoIG1lYXN1cmVzIG1lYW4gdGhyb3VnaHB1dCBhbmQgb25lLSwgZml2ZS0sIGFuZAorICBmaWZ0ZWVuLW1pbnV0ZSBleHBvbmVudGlhbGx5LXdlaWdodGVkIG1vdmluZyBhdmVyYWdlIHRocm91Z2hwdXRzLgorCis9PSBUYWJsZSBNZXRyaWNzCisKK0VhY2ggdGFibGUgaW4gQ2Fzc2FuZHJhIGhhcyBtZXRyaWNzIHJlc3BvbnNpYmxlIGZvciB0cmFja2luZyBpdHMgc3RhdGUKK2FuZCBwZXJmb3JtYW5jZS4KKworVGhlIG1ldHJpYyBuYW1lcyBhcmUgYWxsIGFwcGVuZGVkIHdpdGggdGhlIHNwZWNpZmljIGBLZXlzcGFjZWAgYW5kCitgVGFibGVgIG5hbWUuCisKK1JlcG9ydGVkIG5hbWUgZm9ybWF0OgorCisqTWV0cmljIE5hbWUqOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuVGFibGUuPE1ldHJpY05hbWU+LjxLZXlzcGFjZT4uPFRhYmxlPmAKKypKTVggTUJlYW4qOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1UYWJsZSBrZXlzcGFjZT08S2V5c3BhY2U+IHNjb3BlPTxUYWJsZT4gbmFtZT08TWV0cmljTmFtZT5gCisKK1tOT1RFXQorPT09PQorVGhlcmUgaXMgYSBzcGVjaWFsIHRhYmxlIGNhbGxlZCAnYGFsbGAnIHdpdGhvdXQgYSBrZXlzcGFjZS4gVGhpcworcmVwcmVzZW50cyB0aGUgYWdncmVnYXRpb24gb2YgbWV0cmljcyBhY3Jvc3MgKmFsbCogdGFibGVzIGFuZCBrZXlzcGFjZXMKK29uIHRoZSBub2RlLgorPT09PQorW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfE1lbXRhYmxlT25IZWFwU2l6ZSB8R2F1Z2U8TG9uZz4gfFRvdGFsIGFtb3VudCBvZiBkYXRhIHN0b3JlZCBpbiB0aGUKK21lbXRhYmxlIHRoYXQgcmVzaWRlcyAqb24qLWhlYXAsIGluY2x1ZGluZyBjb2x1bW4gcmVsYXRlZCBvdmVyaGVhZCBhbmQKK3BhcnRpdGlvbnMgb3ZlcndyaXR0ZW4uCisKK3xNZW10YWJsZU9mZkhlYXBTaXplIHxHYXVnZTxMb25nPiB8VG90YWwgYW1vdW50IG9mIGRhdGEgc3RvcmVkIGluIHRoZQorbWVtdGFibGUgdGhhdCByZXNpZGVzICpvZmYqLWhlYXAsIGluY2x1ZGluZyBjb2x1bW4gcmVsYXRlZCBvdmVyaGVhZCBhbmQKK3BhcnRpdGlvbnMgb3ZlcndyaXR0ZW4uCisKK3xNZW10YWJsZUxpdmVEYXRhU2l6ZSB8R2F1Z2U8TG9uZz4gfFRvdGFsIGFtb3VudCBvZiBsaXZlIGRhdGEgc3RvcmVkIGluCit0aGUgbWVtdGFibGUsIGV4Y2x1ZGluZyBhbnkgZGF0YSBzdHJ1Y3R1cmUgb3ZlcmhlYWQuCisKK3xBbGxNZW10YWJsZXNPbkhlYXBTaXplIHxHYXVnZTxMb25nPiB8VG90YWwgYW1vdW50IG9mIGRhdGEgc3RvcmVkIGluIHRoZQorbWVtdGFibGVzICgyaSBhbmQgcGVuZGluZyBmbHVzaCBtZW10YWJsZXMgaW5jbHVkZWQpIHRoYXQgcmVzaWRlcworKm9uKi1oZWFwLgorCit8QWxsTWVtdGFibGVzT2ZmSGVhcFNpemUgfEdhdWdlPExvbmc+IHxUb3RhbCBhbW91bnQgb2YgZGF0YSBzdG9yZWQgaW4KK3RoZSBtZW10YWJsZXMgKDJpIGFuZCBwZW5kaW5nIGZsdXNoIG1lbXRhYmxlcyBpbmNsdWRlZCkgdGhhdCByZXNpZGVzCisqb2ZmKi1oZWFwLgorCit8QWxsTWVtdGFibGVzTGl2ZURhdGFTaXplIHxHYXVnZTxMb25nPiB8VG90YWwgYW1vdW50IG9mIGxpdmUgZGF0YSBzdG9yZWQKK2luIHRoZSBtZW10YWJsZXMgKDJpIGFuZCBwZW5kaW5nIGZsdXNoIG1lbXRhYmxlcyBpbmNsdWRlZCkgdGhhdCByZXNpZGVzCitvZmYtaGVhcCwgZXhjbHVkaW5nIGFueSBkYXRhIHN0cnVjdHVyZSBvdmVyaGVhZC4KKworfE1lbXRhYmxlQ29sdW1uc0NvdW50IHxHYXVnZTxMb25nPiB8VG90YWwgbnVtYmVyIG9mIGNvbHVtbnMgcHJlc2VudCBpbgordGhlIG1lbXRhYmxlLgorCit8TWVtdGFibGVTd2l0Y2hDb3VudCB8Q291bnRlciB8TnVtYmVyIG9mIHRpbWVzIGZsdXNoIGhhcyByZXN1bHRlZCBpbiB0aGUKK21lbXRhYmxlIGJlaW5nIHN3aXRjaGVkIG91dC4KKworfENvbXByZXNzaW9uUmF0aW8gfEdhdWdlPERvdWJsZT4gfEN1cnJlbnQgY29tcHJlc3Npb24gcmF0aW8gZm9yIGFsbAorU1NUYWJsZXMuCisKK3xFc3RpbWF0ZWRQYXJ0aXRpb25TaXplSGlzdG9ncmFtIHxHYXVnZTxsb25nW10+IHxIaXN0b2dyYW0gb2YgZXN0aW1hdGVkCitwYXJ0aXRpb24gc2l6ZSAoaW4gYnl0ZXMpLgorCit8RXN0aW1hdGVkUGFydGl0aW9uQ291bnQgfEdhdWdlPExvbmc+IHxBcHByb3hpbWF0ZSBudW1iZXIgb2Yga2V5cyBpbgordGFibGUuCisKK3xFc3RpbWF0ZWRDb2x1bW5Db3VudEhpc3RvZ3JhbSB8R2F1Z2U8bG9uZ1tdPiB8SGlzdG9ncmFtIG9mIGVzdGltYXRlZAorbnVtYmVyIG9mIGNvbHVtbnMuCisKK3xTU1RhYmxlc1BlclJlYWRIaXN0b2dyYW0gfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG9mIHRoZSBudW1iZXIgb2Ygc3N0YWJsZQorZGF0YSBmaWxlcyBhY2Nlc3NlZCBwZXIgc2luZ2xlIHBhcnRpdGlvbiByZWFkLiBTU1RhYmxlcyBza2lwcGVkIGR1ZSB0bworQmxvb20gRmlsdGVycywgbWluLW1heCBrZXkgb3IgcGFydGl0aW9uIGluZGV4IGxvb2t1cCBhcmUgbm90IHRha2VuIGludG8KK2Fjb291bnQuCisKK3xSZWFkTGF0ZW5jeSB8TGF0ZW5jeSB8TG9jYWwgcmVhZCBsYXRlbmN5IGZvciB0aGlzIHRhYmxlLgorCit8UmFuZ2VMYXRlbmN5IHxMYXRlbmN5IHxMb2NhbCByYW5nZSBzY2FuIGxhdGVuY3kgZm9yIHRoaXMgdGFibGUuCisKK3xXcml0ZUxhdGVuY3kgfExhdGVuY3kgfExvY2FsIHdyaXRlIGxhdGVuY3kgZm9yIHRoaXMgdGFibGUuCisKK3xDb29yZGluYXRvclJlYWRMYXRlbmN5IHxUaW1lciB8Q29vcmRpbmF0b3IgcmVhZCBsYXRlbmN5IGZvciB0aGlzIHRhYmxlLgorCit8Q29vcmRpbmF0b3JXcml0ZUxhdGVuY3kgfFRpbWVyIHxDb29yZGluYXRvciB3cml0ZSBsYXRlbmN5IGZvciB0aGlzCit0YWJsZS4KKworfENvb3JkaW5hdG9yU2NhbkxhdGVuY3kgfFRpbWVyIHxDb29yZGluYXRvciByYW5nZSBzY2FuIGxhdGVuY3kgZm9yIHRoaXMKK3RhYmxlLgorCit8UGVuZGluZ0ZsdXNoZXMgfENvdW50ZXIgfEVzdGltYXRlZCBudW1iZXIgb2YgZmx1c2ggdGFza3MgcGVuZGluZyBmb3IKK3RoaXMgdGFibGUuCisKK3xCeXRlc0ZsdXNoZWQgfENvdW50ZXIgfFRvdGFsIG51bWJlciBvZiBieXRlcyBmbHVzaGVkIHNpbmNlIHNlcnZlcgorW3JlXXN0YXJ0LgorCit8Q29tcGFjdGlvbkJ5dGVzV3JpdHRlbiB8Q291bnRlciB8VG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gYnkKK2NvbXBhY3Rpb24gc2luY2Ugc2VydmVyIFtyZV1zdGFydC4KKworfFBlbmRpbmdDb21wYWN0aW9ucyB8R2F1Z2U8SW50ZWdlcj4gfEVzdGltYXRlIG9mIG51bWJlciBvZiBwZW5kaW5nCitjb21wYWN0aW9ucyBmb3IgdGhpcyB0YWJsZS4KKworfExpdmVTU1RhYmxlQ291bnQgfEdhdWdlPEludGVnZXI+IHxOdW1iZXIgb2YgU1NUYWJsZXMgb24gZGlzayBmb3IgdGhpcwordGFibGUuCisKK3xMaXZlRGlza1NwYWNlVXNlZCB8Q291bnRlciB8RGlzayBzcGFjZSB1c2VkIGJ5IFNTVGFibGVzIGJlbG9uZ2luZyB0bwordGhpcyB0YWJsZSAoaW4gYnl0ZXMpLgorCit8VG90YWxEaXNrU3BhY2VVc2VkIHxDb3VudGVyIHxUb3RhbCBkaXNrIHNwYWNlIHVzZWQgYnkgU1NUYWJsZXMKK2JlbG9uZ2luZyB0byB0aGlzIHRhYmxlLCBpbmNsdWRpbmcgb2Jzb2xldGUgb25lcyB3YWl0aW5nIHRvIGJlIEdDJ2QuCisKK3xNYXhTU1RhYmxlU2l6ZSB8R2F1Z2U8TG9uZz4gfE1heGltdW0gc2l6ZSBvZiBTU1RhYmxlIG9mIHRoaXMgdGFibGUgLQordGhlIHBoeXNpY2FsIHNpemUgb24gZGlzayBvZiBhbGwgY29tcG9uZW50cyBmb3Igc3VjaCBTU1RhYmxlIGluIGJ5dGVzLiBFcXVhbHMgdG8KK3plcm8gaWYgdGhlcmUgaXMgbm90IGFueSBTU1RhYmxlIG9uIGRpc2suCisKK3xNYXhTU1RhYmxlRHVyYXRpb24gfEdhdWdlPExvbmc+IHxNYXhpbXVtIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyBvZiBhbiBTU1RhYmxlIGZvciB0aGlzIHRhYmxlLAorY29tcHV0ZWQgYXMgYG1heFRpbWVzdGFtcCAtIG1pblRpbWVzdGFtcGAuIEVxdWFscyB0byB6ZXJvIGlmIG1pbiBvciBtYXggdGltZXN0YW1wIGlzIGBMb25nLk1BWF9WQUxVRWAuCisKK3xNaW5QYXJ0aXRpb25TaXplIHxHYXVnZTxMb25nPiB8U2l6ZSBvZiB0aGUgc21hbGxlc3QgY29tcGFjdGVkIHBhcnRpdGlvbgorKGluIGJ5dGVzKS4KKworfE1heFBhcnRpdGlvblNpemUgfEdhdWdlPExvbmc+IHxTaXplIG9mIHRoZSBsYXJnZXN0IGNvbXBhY3RlZCBwYXJ0aXRpb24KKyhpbiBieXRlcykuCisKK3xNZWFuUGFydGl0aW9uU2l6ZSB8R2F1Z2U8TG9uZz4gfFNpemUgb2YgdGhlIGF2ZXJhZ2UgY29tcGFjdGVkIHBhcnRpdGlvbgorKGluIGJ5dGVzKS4KKworfEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXMgfEdhdWdlPExvbmc+IHxOdW1iZXIgb2YgZmFsc2UgcG9zaXRpdmVzIG9uCit0YWJsZSdzIGJsb29tIGZpbHRlci4KKworfEJsb29tRmlsdGVyRmFsc2VSYXRpbyB8R2F1Z2U8RG91YmxlPiB8RmFsc2UgcG9zaXRpdmUgcmF0aW8gb2YgdGFibGUncworYmxvb20gZmlsdGVyLgorCit8Qmxvb21GaWx0ZXJEaXNrU3BhY2VVc2VkIHxHYXVnZTxMb25nPiB8RGlzayBzcGFjZSB1c2VkIGJ5IGJsb29tIGZpbHRlcgorKGluIGJ5dGVzKS4KKworfEJsb29tRmlsdGVyT2ZmSGVhcE1lbW9yeVVzZWQgfEdhdWdlPExvbmc+IHxPZmYtaGVhcCBtZW1vcnkgdXNlZCBieQorYmxvb20gZmlsdGVyLgorCit8SW5kZXhTdW1tYXJ5T2ZmSGVhcE1lbW9yeVVzZWQgfEdhdWdlPExvbmc+IHxPZmYtaGVhcCBtZW1vcnkgdXNlZCBieQoraW5kZXggc3VtbWFyeS4KKworfENvbXByZXNzaW9uTWV0YWRhdGFPZmZIZWFwTWVtb3J5VXNlZCB8R2F1Z2U8TG9uZz4gfE9mZi1oZWFwIG1lbW9yeSB1c2VkCitieSBjb21wcmVzc2lvbiBtZXRhIGRhdGEuCisKK3xLZXlDYWNoZUhpdFJhdGUgfEdhdWdlPERvdWJsZT4gfEtleSBjYWNoZSBoaXQgcmF0ZSBmb3IgdGhpcyB0YWJsZS4KKworfFRvbWJzdG9uZVNjYW5uZWRIaXN0b2dyYW0gfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG9mIHRvbWJzdG9uZXMgc2Nhbm5lZAoraW4gcXVlcmllcyBvbiB0aGlzIHRhYmxlLgorCit8TGl2ZVNjYW5uZWRIaXN0b2dyYW0gfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG9mIGxpdmUgY2VsbHMgc2Nhbm5lZCBpbgorcXVlcmllcyBvbiB0aGlzIHRhYmxlLgorCit8Q29sVXBkYXRlVGltZURlbHRhSGlzdG9ncmFtIHxIaXN0b2dyYW0gfEhpc3RvZ3JhbSBvZiBjb2x1bW4gdXBkYXRlIHRpbWUKK2RlbHRhIG9uIHRoaXMgdGFibGUuCisKK3xWaWV3TG9ja0FjcXVpcmVUaW1lIHxUaW1lciB8VGltZSB0YWtlbiBhY3F1aXJpbmcgYSBwYXJ0aXRpb24gbG9jayBmb3IKK21hdGVyaWFsaXplZCB2aWV3IHVwZGF0ZXMgb24gdGhpcyB0YWJsZS4KKworfFZpZXdSZWFkVGltZSB8VGltZXIgfFRpbWUgdGFrZW4gZHVyaW5nIHRoZSBsb2NhbCByZWFkIG9mIGEgbWF0ZXJpYWxpemVkCit2aWV3IHVwZGF0ZS4KKworfFRydWVTbmFwc2hvdHNTaXplIHxHYXVnZTxMb25nPiB8RGlzayBzcGFjZSB1c2VkIGJ5IHNuYXBzaG90cyBvZiB0aGlzCit0YWJsZSBpbmNsdWRpbmcgYWxsIFNTVGFibGUgY29tcG9uZW50cy4KKworfFJvd0NhY2hlSGl0T3V0T2ZSYW5nZSB8Q291bnRlciB8TnVtYmVyIG9mIHRhYmxlIHJvdyBjYWNoZSBoaXRzIHRoYXQgZG8KK25vdCBzYXRpc2Z5IHRoZSBxdWVyeSBmaWx0ZXIsIHRodXMgd2VudCB0byBkaXNrLgorCit8Um93Q2FjaGVIaXQgfENvdW50ZXIgfE51bWJlciBvZiB0YWJsZSByb3cgY2FjaGUgaGl0cy4KKworfFJvd0NhY2hlTWlzcyB8Q291bnRlciB8TnVtYmVyIG9mIHRhYmxlIHJvdyBjYWNoZSBtaXNzZXMuCisKK3xDYXNQcmVwYXJlIHxMYXRlbmN5IHxMYXRlbmN5IG9mIHBheG9zIHByZXBhcmUgcm91bmQuCisKK3xDYXNQcm9wb3NlIHxMYXRlbmN5IHxMYXRlbmN5IG9mIHBheG9zIHByb3Bvc2Ugcm91bmQuCisKK3xDYXNDb21taXQgfExhdGVuY3kgfExhdGVuY3kgb2YgcGF4b3MgY29tbWl0IHJvdW5kLgorCit8UGVyY2VudFJlcGFpcmVkIHxHYXVnZTxEb3VibGU+IHxQZXJjZW50IG9mIHRhYmxlIGRhdGEgdGhhdCBpcyByZXBhaXJlZAorb24gZGlzay4KKworfEJ5dGVzUmVwYWlyZWQgfEdhdWdlPExvbmc+IHxTaXplIG9mIHRhYmxlIGRhdGEgcmVwYWlyZWQgb24gZGlzaworCit8Qnl0ZXNVbnJlcGFpcmVkIHxHYXVnZTxMb25nPiB8U2l6ZSBvZiB0YWJsZSBkYXRhIHVucmVwYWlyZWQgb24gZGlzaworCit8Qnl0ZXNQZW5kaW5nUmVwYWlyIHxHYXVnZTxMb25nPiB8U2l6ZSBvZiB0YWJsZSBkYXRhIGlzb2xhdGVkIGZvciBhbgorb25nb2luZyBpbmNyZW1lbnRhbCByZXBhaXIKKworfFNwZWN1bGF0aXZlUmV0cmllcyB8Q291bnRlciB8TnVtYmVyIG9mIHRpbWVzIHNwZWN1bGF0aXZlIHJldHJpZXMgd2VyZQorc2VudCBmb3IgdGhpcyB0YWJsZS4KKworfFNwZWN1bGF0aXZlRmFpbGVkUmV0cmllcyB8Q291bnRlciB8TnVtYmVyIG9mIHNwZWN1bGF0aXZlIHJldHJpZXMgdGhhdAorZmFpbGVkIHRvIHByZXZlbnQgYSB0aW1lb3V0CisKK3xTcGVjdWxhdGl2ZUluc3VmZmljaWVudFJlcGxpY2FzIHxDb3VudGVyIHxOdW1iZXIgb2Ygc3BlY3VsYXRpdmUgcmV0cmllcwordGhhdCBjb3VsZG4ndCBiZSBhdHRlbXB0ZWQgZHVlIHRvIGxhY2sgb2YgcmVwbGljYXMKKworfFNwZWN1bGF0aXZlU2FtcGxlTGF0ZW5jeU5hbm9zIHxHYXVnZTxMb25nPiB8TnVtYmVyIG9mIG5hbm9zZWNvbmRzIHRvCit3YWl0IGJlZm9yZSBzcGVjdWxhdGlvbiBpcyBhdHRlbXB0ZWQuIFZhbHVlIG1heSBiZSBzdGF0aWNhbGx5IGNvbmZpZ3VyZWQKK29yIHVwZGF0ZWQgcGVyaW9kaWNhbGx5IGJhc2VkIG9uIGNvb3JkaW5hdG9yIGxhdGVuY3kuCisKK3xXYWl0aW5nT25GcmVlTWVtdGFibGVTcGFjZSB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgdGltZSBzcGVudCB3YWl0aW5nCitmb3IgZnJlZSBtZW10YWJsZSBzcGFjZSwgZWl0aGVyIG9uLSBvciBvZmYtaGVhcC4KKworfERyb3BwZWRNdXRhdGlvbnMgfENvdW50ZXIgfE51bWJlciBvZiBkcm9wcGVkIG11dGF0aW9ucyBvbiB0aGlzIHRhYmxlLgorCit8QW50aWNvbXBhY3Rpb25UaW1lIHxUaW1lciB8VGltZSBzcGVudCBhbnRpY29tcGFjdGluZyBiZWZvcmUgYQorY29uc2lzdGVudCByZXBhaXIuCisKK3xWYWxpZGF0aW9uVGltZSB8VGltZXIgfFRpbWUgc3BlbnQgZG9pbmcgdmFsaWRhdGlvbiBjb21wYWN0aW9uIGR1cmluZworcmVwYWlyLgorCit8U3luY1RpbWUgfFRpbWVyIHxUaW1lIHNwZW50IGRvaW5nIHN0cmVhbWluZyBkdXJpbmcgcmVwYWlyLgorCit8Qnl0ZXNWYWxpZGF0ZWQgfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG92ZXIgdGhlIGFtb3VudCBvZiBieXRlcyByZWFkCitkdXJpbmcgdmFsaWRhdGlvbi4KKworfFBhcnRpdGlvbnNWYWxpZGF0ZWQgfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG92ZXIgdGhlIG51bWJlciBvZiBwYXJ0aXRpb25zCityZWFkIGR1cmluZyB2YWxpZGF0aW9uLgorCit8Qnl0ZXNBbnRpY29tcGFjdGVkIHxDb3VudGVyIHxIb3cgbWFueSBieXRlcyB3ZSBhbnRpY29tcGFjdGVkLgorCit8Qnl0ZXNNdXRhdGVkQW50aWNvbXBhY3Rpb24gfENvdW50ZXIgfEhvdyBtYW55IGJ5dGVzIHdlIGF2b2lkZWQKK2FudGljb21wYWN0aW5nIGJlY2F1c2UgdGhlIHNzdGFibGUgd2FzIGZ1bGx5IGNvbnRhaW5lZCBpbiB0aGUgcmVwYWlyZWQKK3JhbmdlLgorCit8TXV0YXRlZEFudGljb21wYWN0aW9uR2F1Z2UgfEdhdWdlPERvdWJsZT4gfFJhdGlvIG9mIGJ5dGVzIG11dGF0ZWQgdnMKK3RvdGFsIGJ5dGVzIHJlcGFpcmVkLgorfD09PQorCis9PSBLZXlzcGFjZSBNZXRyaWNzCisKK0VhY2gga2V5c3BhY2UgaW4gQ2Fzc2FuZHJhIGhhcyBtZXRyaWNzIHJlc3BvbnNpYmxlIGZvciB0cmFja2luZyBpdHMKK3N0YXRlIGFuZCBwZXJmb3JtYW5jZS4KKworTW9zdCBvZiB0aGVzZSBtZXRyaWNzIGFyZSB0aGUgc2FtZSBhcyB0aGUgYFRhYmxlIE1ldHJpY3NgIGFib3ZlLCBvbmx5Cit0aGV5IGFyZSBhZ2dyZWdhdGVkIGF0IHRoZSBLZXlzcGFjZSBsZXZlbC4gVGhlIGtleXNwYWNlIHNwZWNpZmljIG1ldHJpY3MKK2FyZSBzcGVjaWZpZWQgaW4gdGhlIHRhYmxlIGJlbG93LgorCitSZXBvcnRlZCBuYW1lIGZvcm1hdDoKKworKk1ldHJpYyBOYW1lKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLmtleXNwYWNlLjxNZXRyaWNOYW1lPi48S2V5c3BhY2U+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUtleXNwYWNlIHNjb3BlPTxLZXlzcGFjZT4gbmFtZT08TWV0cmljTmFtZT5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xXcml0ZUZhaWxlZElkZWFDTCB8Q291bnRlciB8TnVtYmVyIG9mIHdyaXRlcyB0aGF0IGZhaWxlZCB0byBhY2hpZXZlIHRoZQorY29uZmlndXJlZCBpZGVhbCBjb25zaXN0ZW5jeSBsZXZlbCBvciAwIGlmIG5vbmUgaXMgY29uZmlndXJlZAorCit8SWRlYWxDTFdyaXRlTGF0ZW5jeSB8TGF0ZW5jeSB8Q29vcmRpbmF0b3IgbGF0ZW5jeSBvZiB3cml0ZXMgYXQgdGhlCitjb25maWd1cmVkIGlkZWFsIGNvbnNpc3RlbmN5IGxldmVsLiBObyB2YWx1ZXMgYXJlIHJlY29yZGVkIGlmIGlkZWFsCitjb25zaXN0ZW5jeSBsZXZlbCBpcyBub3QgY29uZmlndXJlZAorCit8UmVwYWlyVGltZSB8VGltZXIgfFRvdGFsIHRpbWUgc3BlbnQgYXMgcmVwYWlyIGNvb3JkaW5hdG9yLgorCit8UmVwYWlyUHJlcGFyZVRpbWUgfFRpbWVyIHxUb3RhbCB0aW1lIHNwZW50IHByZXBhcmluZyBmb3IgcmVwYWlyLgorfD09PQorCis9PSBUaHJlYWRQb29sIE1ldHJpY3MKKworQ2Fzc2FuZHJhIHNwbGl0cyB3b3JrIG9mIGEgcGFydGljdWxhciB0eXBlIGludG8gaXRzIG93biB0aHJlYWQgcG9vbC4KK1RoaXMgcHJvdmlkZXMgYmFjay1wcmVzc3VyZSBhbmQgYXN5bmNocm9ueSBmb3IgcmVxdWVzdHMgb24gYSBub2RlLiBJdCdzCitpbXBvcnRhbnQgdG8gbW9uaXRvciB0aGUgc3RhdGUgb2YgdGhlc2UgdGhyZWFkIHBvb2xzIHNpbmNlIHRoZXkgY2FuIHRlbGwKK3lvdSBob3cgc2F0dXJhdGVkIGEgbm9kZSBpcy4KKworVGhlIG1ldHJpYyBuYW1lcyBhcmUgYWxsIGFwcGVuZGVkIHdpdGggdGhlIHNwZWNpZmljIGBUaHJlYWRQb29sYCBuYW1lLgorVGhlIHRocmVhZCBwb29scyBhcmUgYWxzbyBjYXRlZ29yaXplZCB1bmRlciBhIHNwZWNpZmljIHR5cGUuCisKK1JlcG9ydGVkIG5hbWUgZm9ybWF0OgorCisqTWV0cmljIE5hbWUqOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuVGhyZWFkUG9vbHMuPE1ldHJpY05hbWU+LjxQYXRoPi48VGhyZWFkUG9vbE5hbWU+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPVRocmVhZFBvb2xzIHBhdGg9PFBhdGg+IHNjb3BlPTxUaHJlYWRQb29sTmFtZT4gbmFtZT08TWV0cmljTmFtZT5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xBY3RpdmVUYXNrcyB8R2F1Z2U8SW50ZWdlcj4gfE51bWJlciBvZiB0YXNrcyBiZWluZyBhY3RpdmVseSB3b3JrZWQgb24KK2J5IHRoaXMgcG9vbC4KKworfFBlbmRpbmdUYXNrcyB8R2F1Z2U8SW50ZWdlcj4gfE51bWJlciBvZiBxdWV1ZWQgdGFza3MgcXVldWVkIHVwIG9uIHRoaXMKK3Bvb2wuCisKK3xDb21wbGV0ZWRUYXNrcyB8Q291bnRlciB8TnVtYmVyIG9mIHRhc2tzIGNvbXBsZXRlZC4KKworfFRvdGFsQmxvY2tlZFRhc2tzIHxDb3VudGVyIHxOdW1iZXIgb2YgdGFza3MgdGhhdCB3ZXJlIGJsb2NrZWQgZHVlIHRvCitxdWV1ZSBzYXR1cmF0aW9uLgorCit8Q3VycmVudGx5QmxvY2tlZFRhc2sgfENvdW50ZXIgfE51bWJlciBvZiB0YXNrcyB0aGF0IGFyZSBjdXJyZW50bHkKK2Jsb2NrZWQgZHVlIHRvIHF1ZXVlIHNhdHVyYXRpb24gYnV0IG9uIHJldHJ5IHdpbGwgYmVjb21lIHVuYmxvY2tlZC4KKworfE1heFBvb2xTaXplIHxHYXVnZTxJbnRlZ2VyPiB8VGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgaW4gdGhpcworcG9vbC4KKworfE1heFRhc2tzUXVldWVkIHxHYXVnZTxJbnRlZ2VyPiB8VGhlIG1heGltdW0gbnVtYmVyIG9mIHRhc2tzIHF1ZXVlZAorYmVmb3JlIGEgdGFzayBnZXQgYmxvY2tlZC4KK3w9PT0KKworVGhlIGZvbGxvd2luZyB0aHJlYWQgcG9vbHMgY2FuIGJlIG1vbml0b3JlZC4KKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfE5hdGl2ZS1UcmFuc3BvcnQtUmVxdWVzdHMgfHRyYW5zcG9ydCB8SGFuZGxlcyBjbGllbnQgQ1FMIHJlcXVlc3RzCisKK3xDb3VudGVyTXV0YXRpb25TdGFnZSB8cmVxdWVzdCB8UmVzcG9uc2libGUgZm9yIGNvdW50ZXIgd3JpdGVzCisKK3xWaWV3TXV0YXRpb25TdGFnZSB8cmVxdWVzdCB8UmVzcG9uc2libGUgZm9yIG1hdGVyaWFsaXplZCB2aWV3IHdyaXRlcworCit8TXV0YXRpb25TdGFnZSB8cmVxdWVzdCB8UmVzcG9uc2libGUgZm9yIGFsbCBvdGhlciB3cml0ZXMKKworfFJlYWRSZXBhaXJTdGFnZSB8cmVxdWVzdCB8UmVhZFJlcGFpciBoYXBwZW5zIG9uIHRoaXMgdGhyZWFkIHBvb2wKKworfFJlYWRTdGFnZSB8cmVxdWVzdCB8TG9jYWwgcmVhZHMgcnVuIG9uIHRoaXMgdGhyZWFkIHBvb2wKKworfFJlcXVlc3RSZXNwb25zZVN0YWdlIHxyZXF1ZXN0IHxDb29yZGluYXRvciByZXF1ZXN0cyB0byB0aGUgY2x1c3RlciBydW4KK29uIHRoaXMgdGhyZWFkIHBvb2wKKworfEFudGlFbnRyb3B5U3RhZ2UgfGludGVybmFsIHxCdWlsZHMgbWVya2xlIHRyZWUgZm9yIHJlcGFpcnMKKworfENhY2hlQ2xlYW51cEV4ZWN1dG9yIHxpbnRlcm5hbCB8Q2FjaGUgbWFpbnRlbmFuY2UgcGVyZm9ybWVkIG9uIHRoaXMKK3RocmVhZCBwb29sCisKK3xDb21wYWN0aW9uRXhlY3V0b3IgfGludGVybmFsIHxDb21wYWN0aW9ucyBhcmUgcnVuIG9uIHRoZXNlIHRocmVhZHMKKworfEdvc3NpcFN0YWdlIHxpbnRlcm5hbCB8SGFuZGxlcyBnb3NzaXAgcmVxdWVzdHMKKworfEhpbnRzRGlzcGF0Y2hlciB8aW50ZXJuYWwgfFBlcmZvcm1zIGhpbnRlZCBoYW5kb2ZmCisKK3xJbnRlcm5hbFJlc3BvbnNlU3RhZ2UgfGludGVybmFsIHxSZXNwb25zaWJsZSBmb3IgaW50cmEtY2x1c3RlcgorY2FsbGJhY2tzCisKK3xNZW10YWJsZUZsdXNoV3JpdGVyIHxpbnRlcm5hbCB8V3JpdGVzIG1lbXRhYmxlcyB0byBkaXNrCisKK3xNZW10YWJsZVBvc3RGbHVzaCB8aW50ZXJuYWwgfENsZWFucyB1cCBjb21taXQgbG9nIGFmdGVyIG1lbXRhYmxlIGlzCit3cml0dGVuIHRvIGRpc2sKKworfE1lbXRhYmxlUmVjbGFpbU1lbW9yeSB8aW50ZXJuYWwgfE1lbXRhYmxlIHJlY3ljbGluZworCit8TWlncmF0aW9uU3RhZ2UgfGludGVybmFsIHxSdW5zIHNjaGVtYSBtaWdyYXRpb25zCisKK3xNaXNjU3RhZ2UgfGludGVybmFsIHxNaXNjZWxlbmVvdXMgdGFza3MgcnVuIGhlcmUKKworfFBlbmRpbmdSYW5nZUNhbGN1bGF0b3IgfGludGVybmFsIHxDYWxjdWxhdGVzIHRva2VuIHJhbmdlCisKK3xQZXJEaXNrTWVtdGFibGVGbHVzaFdyaXRlcl8wIHxpbnRlcm5hbCB8UmVzcG9uc2libGUgZm9yIHdyaXRpbmcgYSBzcGVjCisodGhlcmUgaXMgb25lIG9mIHRoZXNlIHBlciBkaXNrIDAtTikKKworfFNhbXBsZXIgfGludGVybmFsIHxSZXNwb25zaWJsZSBmb3IgcmUtc2FtcGxpbmcgdGhlIGluZGV4IHN1bW1hcmllcyBvZgorU1N0YWJsZXMKKworfFNlY29uZGFyeUluZGV4TWFuYWdlbWVudCB8aW50ZXJuYWwgfFBlcmZvcm1zIHVwZGF0ZXMgdG8gc2Vjb25kYXJ5CitpbmRleGVzCisKK3xWYWxpZGF0aW9uRXhlY3V0b3IgfGludGVybmFsIHxQZXJmb3JtcyB2YWxpZGF0aW9uIGNvbXBhY3Rpb24gb3IKK3NjcnViYmluZworCit8Vmlld0J1aWxkRXhlY3V0b3IgfGludGVybmFsIHxQZXJmb3JtcyBtYXRlcmlhbGl6ZWQgdmlld3MgaW5pdGlhbCBidWlsZAorfD09PQorCis9PSBDbGllbnQgUmVxdWVzdCBNZXRyaWNzCisKK0NsaWVudCByZXF1ZXN0cyBoYXZlIHRoZWlyIG93biBzZXQgb2YgbWV0cmljcyB0aGF0IGVuY2Fwc3VsYXRlIHRoZSB3b3JrCitoYXBwZW5pbmcgYXQgY29vcmRpbmF0b3IgbGV2ZWwuCisKK0RpZmZlcmVudCB0eXBlcyBvZiBjbGllbnQgcmVxdWVzdHMgYXJlIGJyb2tlbiBkb3duIGJ5IGBSZXF1ZXN0VHlwZWAuCisKK1JlcG9ydGVkIG5hbWUgZm9ybWF0OgorCisqTWV0cmljIE5hbWUqOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2xpZW50UmVxdWVzdC48TWV0cmljTmFtZT4uPFJlcXVlc3RUeXBlPmAKKypKTVggTUJlYW4qOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1DbGllbnRSZXF1ZXN0IHNjb3BlPTxSZXF1ZXN0VHlwZT4gbmFtZT08TWV0cmljTmFtZT5gCisKK1JlcXVlc3RUeXBlOjoKKyAgQ0FTUmVhZAorRGVzY3JpcHRpb246OgorICBNZXRyaWNzIHJlbGF0ZWQgdG8gdHJhbnNhY3Rpb25hbCByZWFkIHJlcXVlc3RzLgorTWV0cmljczo6CitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCit8VGltZW91dHMgfENvdW50ZXIgfE51bWJlciBvZiB0aW1lb3V0cyBlbmNvdW50ZXJlZC4KKworfEZhaWx1cmVzIHxDb3VudGVyIHxOdW1iZXIgb2YgdHJhbnNhY3Rpb24gZmFpbHVyZXMgZW5jb3VudGVyZWQuCisKK3zCoCB8TGF0ZW5jeSB8VHJhbnNhY3Rpb24gcmVhZCBsYXRlbmN5LgorCit8VW5hdmFpbGFibGVzIHxDb3VudGVyIHxOdW1iZXIgb2YgdW5hdmFpbGFibGUgZXhjZXB0aW9ucyBlbmNvdW50ZXJlZC4KKworfFVuZmluaXNoZWRDb21taXQgfENvdW50ZXIgfE51bWJlciBvZiB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIGNvbW1pdHRlZAorb24gcmVhZC4KKworfENvbmRpdGlvbk5vdE1ldCB8Q291bnRlciB8TnVtYmVyIG9mIHRyYW5zYWN0aW9uIHByZWNvbmRpdGlvbnMgZGlkIG5vdAorbWF0Y2ggY3VycmVudCB2YWx1ZXMuCisKK3xDb250ZW50aW9uSGlzdG9ncmFtIHxIaXN0b2dyYW0gfEhvdyBtYW55IGNvbnRlbmRlZCByZWFkcyB3ZXJlCitlbmNvdW50ZXJlZAorfD09PQorUmVxdWVzdFR5cGU6OgorICBDQVNXcml0ZQorRGVzY3JpcHRpb246OgorICBNZXRyaWNzIHJlbGF0ZWQgdG8gdHJhbnNhY3Rpb25hbCB3cml0ZSByZXF1ZXN0cy4KK01ldHJpY3M6OgorW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfFRpbWVvdXRzIHxDb3VudGVyIHxOdW1iZXIgb2YgdGltZW91dHMgZW5jb3VudGVyZWQuCisKK3xGYWlsdXJlcyB8Q291bnRlciB8TnVtYmVyIG9mIHRyYW5zYWN0aW9uIGZhaWx1cmVzIGVuY291bnRlcmVkLgorCit8wqAgfExhdGVuY3kgfFRyYW5zYWN0aW9uIHdyaXRlIGxhdGVuY3kuCisKK3xVbmF2YWlsYWJsZXMgfENvdW50ZXIgfE51bWJlciBvZiB1bmF2YWlsYWJsZSBleGNlcHRpb25zIGVuY291bnRlcmVkLgorCit8VW5maW5pc2hlZENvbW1pdCB8Q291bnRlciB8TnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgY29tbWl0dGVkCitvbiB3cml0ZS4KKworfENvbmRpdGlvbk5vdE1ldCB8Q291bnRlciB8TnVtYmVyIG9mIHRyYW5zYWN0aW9uIHByZWNvbmRpdGlvbnMgZGlkIG5vdAorbWF0Y2ggY3VycmVudCB2YWx1ZXMuCisKK3xDb250ZW50aW9uSGlzdG9ncmFtIHxIaXN0b2dyYW0gfEhvdyBtYW55IGNvbnRlbmRlZCB3cml0ZXMgd2VyZQorZW5jb3VudGVyZWQKKworfE11dGF0aW9uU2l6ZUhpc3RvZ3JhbSB8SGlzdG9ncmFtIHxUb3RhbCBzaXplIGluIGJ5dGVzIG9mIHRoZSByZXF1ZXN0cworbXV0YXRpb25zLgorfD09PQorUmVxdWVzdFR5cGU6OgorICBSZWFkCitEZXNjcmlwdGlvbjo6CisgIE1ldHJpY3MgcmVsYXRlZCB0byBzdGFuZGFyZCByZWFkIHJlcXVlc3RzLgorTWV0cmljczo6CitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCit8VGltZW91dHMgfENvdW50ZXIgfE51bWJlciBvZiB0aW1lb3V0cyBlbmNvdW50ZXJlZC4KK3xGYWlsdXJlcyB8Q291bnRlciB8TnVtYmVyIG9mIHJlYWQgZmFpbHVyZXMgZW5jb3VudGVyZWQuCit8wqAgfExhdGVuY3kgfFJlYWQgbGF0ZW5jeS4KK3xVbmF2YWlsYWJsZXMgfENvdW50ZXIgfE51bWJlciBvZiB1bmF2YWlsYWJsZSBleGNlcHRpb25zIGVuY291bnRlcmVkLgorfD09PQorUmVxdWVzdFR5cGU6OgorICBSYW5nZVNsaWNlCitEZXNjcmlwdGlvbjo6CisgIE1ldHJpY3MgcmVsYXRlZCB0byB0b2tlbiByYW5nZSByZWFkIHJlcXVlc3RzLgorTWV0cmljczo6CitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCit8VGltZW91dHMgfENvdW50ZXIgfE51bWJlciBvZiB0aW1lb3V0cyBlbmNvdW50ZXJlZC4KK3xGYWlsdXJlcyB8Q291bnRlciB8TnVtYmVyIG9mIHJhbmdlIHF1ZXJ5IGZhaWx1cmVzIGVuY291bnRlcmVkLgorfMKgIHxMYXRlbmN5IHxSYW5nZSBxdWVyeSBsYXRlbmN5LgorfFVuYXZhaWxhYmxlcyB8Q291bnRlciB8TnVtYmVyIG9mIHVuYXZhaWxhYmxlIGV4Y2VwdGlvbnMgZW5jb3VudGVyZWQuCit8PT09CitSZXF1ZXN0VHlwZTo6CisgIFdyaXRlCitEZXNjcmlwdGlvbjo6CisgIE1ldHJpY3MgcmVsYXRlZCB0byByZWd1bGFyIHdyaXRlIHJlcXVlc3RzLgorTWV0cmljczo6CitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCit8VGltZW91dHMgfENvdW50ZXIgfE51bWJlciBvZiB0aW1lb3V0cyBlbmNvdW50ZXJlZC4KKworfEZhaWx1cmVzIHxDb3VudGVyIHxOdW1iZXIgb2Ygd3JpdGUgZmFpbHVyZXMgZW5jb3VudGVyZWQuCisKK3zCoCB8TGF0ZW5jeSB8V3JpdGUgbGF0ZW5jeS4KKworfFVuYXZhaWxhYmxlcyB8Q291bnRlciB8TnVtYmVyIG9mIHVuYXZhaWxhYmxlIGV4Y2VwdGlvbnMgZW5jb3VudGVyZWQuCisKK3xNdXRhdGlvblNpemVIaXN0b2dyYW0gfEhpc3RvZ3JhbSB8VG90YWwgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVxdWVzdHMKK211dGF0aW9ucy4KK3w9PT0KK1JlcXVlc3RUeXBlOjoKKyAgVmlld1dyaXRlCitEZXNjcmlwdGlvbjo6CisgIE1ldHJpY3MgcmVsYXRlZCB0byBtYXRlcmlhbGl6ZWQgdmlldyB3cml0ZSB3cnRlcy4KK01ldHJpY3M6OgorW2NvbHM9IiwsIixdCit8PT09Cit8VGltZW91dHMgfENvdW50ZXIgfE51bWJlciBvZiB0aW1lb3V0cyBlbmNvdW50ZXJlZC4KKworfEZhaWx1cmVzIHxDb3VudGVyIHxOdW1iZXIgb2YgdHJhbnNhY3Rpb24gZmFpbHVyZXMgZW5jb3VudGVyZWQuCisKK3xVbmF2YWlsYWJsZXMgfENvdW50ZXIgfE51bWJlciBvZiB1bmF2YWlsYWJsZSBleGNlcHRpb25zIGVuY291bnRlcmVkLgorCit8Vmlld1JlcGxpY2FzQXR0ZW1wdGVkIHxDb3VudGVyIHxUb3RhbCBudW1iZXIgb2YgYXR0ZW1wdGVkIHZpZXcKK3JlcGxpY2Egd3JpdGVzLgorCit8Vmlld1JlcGxpY2FzU3VjY2VzcyB8Q291bnRlciB8VG90YWwgbnVtYmVyIG9mIHN1Y2NlZGVkIHZpZXcgcmVwbGljYQord3JpdGVzLgorCit8Vmlld1BlbmRpbmdNdXRhdGlvbnMgfEdhdWdlPExvbmc+IHxWaWV3UmVwbGljYXNBdHRlbXB0ZWQgLQorVmlld1JlcGxpY2FzU3VjY2Vzcy4KKworfFZpZXdXcml0ZUxhdGVuY3kgfFRpbWVyIHxUaW1lIGJldHdlZW4gd2hlbiBtdXRhdGlvbiBpcyBhcHBsaWVkIHRvCitiYXNlIHRhYmxlIGFuZCB3aGVuIENMLk9ORSBpcyBhY2hpZXZlZCBvbiB2aWV3LgorfD09PQorCis9PSBDYWNoZSBNZXRyaWNzCisKK0Nhc3NhbmRyYSBjYWNoZXMgaGF2ZSBtZXRyaWNzIHRvIHRyYWNrIHRoZSBlZmZlY3Rpdm5lc3Mgb2YgdGhlIGNhY2hlcy4KK1Rob3VnaCB0aGUgYFRhYmxlIE1ldHJpY3NgIG1pZ2h0IGJlIG1vcmUgdXNlZnVsLgorCitSZXBvcnRlZCBuYW1lIGZvcm1hdDoKKworKk1ldHJpYyBOYW1lKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNhY2hlLjxNZXRyaWNOYW1lPi48Q2FjaGVOYW1lPmAKKypKTVggTUJlYW4qOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1DYWNoZSBzY29wZT08Q2FjaGVOYW1lPiBuYW1lPTxNZXRyaWNOYW1lPmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfENhcGFjaXR5IHxHYXVnZTxMb25nPiB8Q2FjaGUgY2FwYWNpdHkgaW4gYnl0ZXMuCit8RW50cmllcyB8R2F1Z2U8SW50ZWdlcj4gfFRvdGFsIG51bWJlciBvZiBjYWNoZSBlbnRyaWVzLgorfEZpZnRlZW5NaW51dGVDYWNoZUhpdFJhdGUgfEdhdWdlPERvdWJsZT4gfDE1bSBjYWNoZSBoaXQgcmF0ZS4KK3xGaXZlTWludXRlQ2FjaGVIaXRSYXRlIHxHYXVnZTxEb3VibGU+IHw1bSBjYWNoZSBoaXQgcmF0ZS4KK3xPbmVNaW51dGVDYWNoZUhpdFJhdGUgfEdhdWdlPERvdWJsZT4gfDFtIGNhY2hlIGhpdCByYXRlLgorfEhpdFJhdGUgfEdhdWdlPERvdWJsZT4gfEFsbCB0aW1lIGNhY2hlIGhpdCByYXRlLgorfEhpdHMgfE1ldGVyIHxUb3RhbCBudW1iZXIgb2YgY2FjaGUgaGl0cy4KK3xNaXNzZXMgfE1ldGVyIHxUb3RhbCBudW1iZXIgb2YgY2FjaGUgbWlzc2VzLgorfE1pc3NMYXRlbmN5IHxUaW1lciB8TGF0ZW5jeSBvZiBtaXNzZXMuCit8UmVxdWVzdHMgfEdhdWdlPExvbmc+IHxUb3RhbCBudW1iZXIgb2YgY2FjaGUgcmVxdWVzdHMuCit8U2l6ZSB8R2F1Z2U8TG9uZz4gfFRvdGFsIHNpemUgb2Ygb2NjdXBpZWQgY2FjaGUsIGluIGJ5dGVzLgorfD09PQorCitUaGUgZm9sbG93aW5nIGNhY2hlcyBhcmUgY292ZXJlZDoKKworW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfERlc2NyaXB0aW9uCit8Q291bnRlckNhY2hlIHxLZWVwcyBob3QgY291bnRlcnMgaW4gbWVtb3J5IGZvciBwZXJmb3JtYW5jZS4KK3xDaHVua0NhY2hlIHxJbiBwcm9jZXNzIHVuY29tcHJlc3NlZCBwYWdlIGNhY2hlLgorfEtleUNhY2hlIHxDYWNoZSBmb3IgcGFydGl0aW9uIHRvIHNzdGFibGUgb2Zmc2V0cy4KK3xSb3dDYWNoZSB8Q2FjaGUgZm9yIHJvd3Mga2VwdCBpbiBtZW1vcnkuCit8PT09CisKK1tOT1RFXQorPT09PQorTWlzc2VzIGFuZCBNaXNzTGF0ZW5jeSBhcmUgb25seSBkZWZpbmVkIGZvciB0aGUgQ2h1bmtDYWNoZQorPT09PQorPT0gQ1FMIE1ldHJpY3MKKworTWV0cmljcyBzcGVjaWZpYyB0byBDUUwgcHJlcGFyZWQgc3RhdGVtZW50IGNhY2hpbmcuCisKK1JlcG9ydGVkIG5hbWUgZm9ybWF0OgorCisqTWV0cmljIE5hbWUqOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ1FMLjxNZXRyaWNOYW1lPmAKKypKTVggTUJlYW4qOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1DUUwgbmFtZT08TWV0cmljTmFtZT5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xQcmVwYXJlZFN0YXRlbWVudHNDb3VudCB8R2F1Z2U8SW50ZWdlcj4gfE51bWJlciBvZiBjYWNoZWQgcHJlcGFyZWQKK3N0YXRlbWVudHMuCisKK3xQcmVwYXJlZFN0YXRlbWVudHNFdmljdGVkIHxDb3VudGVyIHxOdW1iZXIgb2YgcHJlcGFyZWQgc3RhdGVtZW50cworZXZpY3RlZCBmcm9tIHRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQgY2FjaGUKKworfFByZXBhcmVkU3RhdGVtZW50c0V4ZWN1dGVkIHxDb3VudGVyIHxOdW1iZXIgb2YgcHJlcGFyZWQgc3RhdGVtZW50cworZXhlY3V0ZWQuCisKK3xSZWd1bGFyU3RhdGVtZW50c0V4ZWN1dGVkIHxDb3VudGVyIHxOdW1iZXIgb2YgKm5vbiogcHJlcGFyZWQgc3RhdGVtZW50cworZXhlY3V0ZWQuCisKK3xQcmVwYXJlZFN0YXRlbWVudHNSYXRpbyB8R2F1Z2U8RG91YmxlPiB8UGVyY2VudGFnZSBvZiBzdGF0ZW1lbnRzIHRoYXQKK2FyZSBwcmVwYXJlZCB2cyB1bnByZXBhcmVkLgorfD09PQorCitbW2Ryb3BwZWQtbWV0cmljc11dCis9PSBEcm9wcGVkTWVzc2FnZSBNZXRyaWNzCisKK01ldHJpY3Mgc3BlY2lmaWMgdG8gdHJhY2tpbmcgZHJvcHBlZCBtZXNzYWdlcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mCityZXF1ZXN0cy4gRHJvcHBlZCB3cml0ZXMgYXJlIHN0b3JlZCBhbmQgcmV0cmllZCBieSBgSGludGVkIEhhbmRvZmZgCisKK1JlcG9ydGVkIG5hbWUgZm9ybWF0OgorCisqTWV0cmljIE5hbWUqOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuRHJvcHBlZE1lc3NhZ2UuPE1ldHJpY05hbWU+LjxUeXBlPmAKKypKTVggTUJlYW4qOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1Ecm9wcGVkTWVzc2FnZSBzY29wZT08VHlwZT4gbmFtZT08TWV0cmljTmFtZT5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xDcm9zc05vZGVEcm9wcGVkTGF0ZW5jeSB8VGltZXIgfFRoZSBkcm9wcGVkIGxhdGVuY3kgYWNyb3NzIG5vZGVzLgorfEludGVybmFsRHJvcHBlZExhdGVuY3kgfFRpbWVyIHxUaGUgZHJvcHBlZCBsYXRlbmN5IHdpdGhpbiBub2RlLgorfERyb3BwZWQgfE1ldGVyIHxOdW1iZXIgb2YgZHJvcHBlZCBtZXNzYWdlcy4KK3w9PT0KKworVGhlIGRpZmZlcmVudCB0eXBlcyBvZiBtZXNzYWdlcyB0cmFja2VkIGFyZToKKworW2NvbHM9IiwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfERlc2NyaXB0aW9uCit8QkFUQ0hfU1RPUkUgfEJhdGNobG9nIHdyaXRlCit8QkFUQ0hfUkVNT1ZFIHxCYXRjaGxvZyBjbGVhbnVwIChhZnRlciBzdWNjZXNmdWxseSBhcHBsaWVkKQorfENPVU5URVJfTVVUQVRJT04gfENvdW50ZXIgd3JpdGVzCit8SElOVCB8SGludCByZXBsYXkKK3xNVVRBVElPTiB8UmVndWxhciB3cml0ZXMKK3xSRUFEIHxSZWd1bGFyIHJlYWRzCit8UkVBRF9SRVBBSVIgfFJlYWQgcmVwYWlyCit8UEFHRURfU0xJQ0UgfFBhZ2VkIHJlYWQKK3xSQU5HRV9TTElDRSB8VG9rZW4gcmFuZ2UgcmVhZAorfFJFUVVFU1RfUkVTUE9OU0UgfFJQQyBDYWxsYmFja3MKK3xfVFJBQ0UgfFRyYWNpbmcgd3JpdGVzCit8PT09CisKKz09IFN0cmVhbWluZyBNZXRyaWNzCisKK01ldHJpY3MgcmVwb3J0ZWQgZHVyaW5nIGBTdHJlYW1pbmdgIG9wZXJhdGlvbnMsIHN1Y2ggYXMgcmVwYWlyLAorYm9vdHN0cmFwLCByZWJ1aWxkLgorCitUaGVzZSBtZXRyaWNzIGFyZSBzcGVjaWZpYyB0byBhIHBlZXIgZW5kcG9pbnQsIHdpdGggdGhlIHNvdXJjZSBub2RlCitiZWluZyB0aGUgbm9kZSB5b3UgYXJlIHB1bGxpbmcgdGhlIG1ldHJpY3MgZnJvbS4KKworUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6CisKKypNZXRyaWMgTmFtZSo6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TdHJlYW1pbmcuPE1ldHJpY05hbWU+LjxQZWVySVA+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPVN0cmVhbWluZyBzY29wZT08UGVlcklQPiBuYW1lPTxNZXRyaWNOYW1lPmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfEluY29taW5nQnl0ZXMgfENvdW50ZXIgfE51bWJlciBvZiBieXRlcyBzdHJlYW1lZCB0byB0aGlzIG5vZGUgZnJvbSB0aGUKK3BlZXIuCisKK3xPdXRnb2luZ0J5dGVzIHxDb3VudGVyIHxOdW1iZXIgb2YgYnl0ZXMgc3RyZWFtZWQgdG8gdGhlIHBlZXIgZW5kcG9pbnQKK2Zyb20gdGhpcyBub2RlLgorfD09PQorCis9PSBDb21wYWN0aW9uIE1ldHJpY3MKKworTWV0cmljcyBzcGVjaWZpYyB0byBgQ29tcGFjdGlvbmAgd29yay4KKworUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6CisKKypNZXRyaWMgTmFtZSo6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5Db21wYWN0aW9uLjxNZXRyaWNOYW1lPmAKKypKTVggTUJlYW4qOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1Db21wYWN0aW9uIG5hbWU9PE1ldHJpY05hbWU+YAorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCit8Qnl0ZXNDb21wYWN0ZWQgfENvdW50ZXIgfFRvdGFsIG51bWJlciBvZiBieXRlcyBjb21wYWN0ZWQgc2luY2Ugc2VydmVyCitbcmVdc3RhcnQuCisKK3xQZW5kaW5nVGFza3MgfEdhdWdlPEludGVnZXI+IHxFc3RpbWF0ZWQgbnVtYmVyIG9mIGNvbXBhY3Rpb25zIHJlbWFpbmluZwordG8gcGVyZm9ybS4KKworfENvbXBsZXRlZFRhc2tzIHxHYXVnZTxMb25nPiB8TnVtYmVyIG9mIGNvbXBsZXRlZCBjb21wYWN0aW9ucyBzaW5jZQorc2VydmVyIFtyZV1zdGFydC4KKworfFRvdGFsQ29tcGFjdGlvbnNDb21wbGV0ZWQgfE1ldGVyIHxUaHJvdWdocHV0IG9mIGNvbXBsZXRlZCBjb21wYWN0aW9ucworc2luY2Ugc2VydmVyIFtyZV1zdGFydC4KKworfFBlbmRpbmdUYXNrc0J5VGFibGVOYW1lIHxHYXVnZTxNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBJbnRlZ2VyPj4+Cit8RXN0aW1hdGVkIG51bWJlciBvZiBjb21wYWN0aW9ucyByZW1haW5pbmcgdG8gcGVyZm9ybSwgZ3JvdXBlZCBieQora2V5c3BhY2UgYW5kIHRoZW4gdGFibGUgbmFtZS4gVGhpcyBpbmZvIGlzIGFsc28ga2VwdCBpbiBgVGFibGUgTWV0cmljc2AuCit8PT09CisKKz09IENvbW1pdExvZyBNZXRyaWNzCisKK01ldHJpY3Mgc3BlY2lmaWMgdG8gdGhlIGBDb21taXRMb2dgCisKK1JlcG9ydGVkIG5hbWUgZm9ybWF0OgorCisqTWV0cmljIE5hbWUqOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ29tbWl0TG9nLjxNZXRyaWNOYW1lPmAKKypKTVggTUJlYW4qOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1Db21taXRMb2cgbmFtZT08TWV0cmljTmFtZT5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xDb21wbGV0ZWRUYXNrcyB8R2F1Z2U8TG9uZz4gfFRvdGFsIG51bWJlciBvZiBjb21taXQgbG9nIG1lc3NhZ2VzCit3cml0dGVuIHNpbmNlIFtyZV1zdGFydC4KKworfFBlbmRpbmdUYXNrcyB8R2F1Z2U8TG9uZz4gfE51bWJlciBvZiBjb21taXQgbG9nIG1lc3NhZ2VzIHdyaXR0ZW4gYnV0Cit5ZXQgdG8gYmUgZnN5bmMnZC4KKworfFRvdGFsQ29tbWl0TG9nU2l6ZSB8R2F1Z2U8TG9uZz4gfEN1cnJlbnQgc2l6ZSwgaW4gYnl0ZXMsIHVzZWQgYnkgYWxsCit0aGUgY29tbWl0IGxvZyBzZWdtZW50cy4KKworfFdhaXRpbmdPblNlZ21lbnRBbGxvY2F0aW9uIHxUaW1lciB8VGltZSBzcGVudCB3YWl0aW5nIGZvciBhCitDb21taXRMb2dTZWdtZW50IHRvIGJlIGFsbG9jYXRlZCAtIHVuZGVyIG5vcm1hbCBjb25kaXRpb25zIHRoaXMgc2hvdWxkCitiZSB6ZXJvLgorCit8V2FpdGluZ09uQ29tbWl0IHxUaW1lciB8VGhlIHRpbWUgc3BlbnQgd2FpdGluZyBvbiBDTCBmc3luYzsgZm9yCitQZXJpb2RpYyB0aGlzIGlzIG9ubHkgb2NjdXJzIHdoZW4gdGhlIHN5bmMgaXMgbGFnZ2luZyBpdHMgc3luYyBpbnRlcnZhbC4KK3w9PT0KKworPT0gU3RvcmFnZSBNZXRyaWNzCisKK01ldHJpY3Mgc3BlY2lmaWMgdG8gdGhlIHN0b3JhZ2UgZW5naW5lLgorCitSZXBvcnRlZCBuYW1lIGZvcm1hdDoKKworKk1ldHJpYyBOYW1lKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0b3JhZ2UuPE1ldHJpY05hbWU+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPVN0b3JhZ2UgbmFtZT08TWV0cmljTmFtZT5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xFeGNlcHRpb25zIHxDb3VudGVyIHxOdW1iZXIgb2YgaW50ZXJuYWwgZXhjZXB0aW9ucyBjYXVnaHQuIFVuZGVyIG5vcm1hbAorZXhjZXB0aW9ucyB0aGlzIHNob3VsZCBiZSB6ZXJvLgorCit8TG9hZCB8Q291bnRlciB8U2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBvbiBkaXNrIGRhdGEgc2l6ZSB0aGlzIG5vZGUKK21hbmFnZXMuCisKK3xUb3RhbEhpbnRzIHxDb3VudGVyIHxOdW1iZXIgb2YgaGludCBtZXNzYWdlcyB3cml0dGVuIHRvIHRoaXMgbm9kZSBzaW5jZQorW3JlXXN0YXJ0LiBJbmNsdWRlcyBvbmUgZW50cnkgZm9yIGVhY2ggaG9zdCB0byBiZSBoaW50ZWQgcGVyIGhpbnQuCisKK3xUb3RhbEhpbnRzSW5Qcm9ncmVzcyB8Q291bnRlciB8TnVtYmVyIG9mIGhpbnRzIGF0dGVtcGluZyB0byBiZSBzZW50CitjdXJyZW50bHkuCit8PT09CisKK1tbaGFuZG9mZi1tZXRyaWNzXV0KKz09IEhpbnRlZEhhbmRvZmYgTWV0cmljcworCitNZXRyaWNzIHNwZWNpZmljIHRvIEhpbnRlZCBIYW5kb2ZmLiBUaGVyZSBhcmUgYWxzbyBzb21lIG1ldHJpY3MgcmVsYXRlZAordG8gaGludHMgdHJhY2tlZCBpbiBgU3RvcmFnZSBNZXRyaWNzYAorCitUaGVzZSBtZXRyaWNzIGluY2x1ZGUgdGhlIHBlZXIgZW5kcG9pbnQgKmluIHRoZSBtZXRyaWMgbmFtZSoKKworUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6CisKKypNZXRyaWMgTmFtZSo6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5IaW50ZWRIYW5kT2ZmTWFuYWdlci48TWV0cmljTmFtZT5gCisqSk1YIE1CZWFuKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9SGludGVkSGFuZE9mZk1hbmFnZXIgbmFtZT08TWV0cmljTmFtZT5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xIaW50c19jcmVhdGVkLTxQZWVySVA+IGF8CitfX19fCitDb3VudGVyCitfX19fCisKK2F8CitfX19fCitOdW1iZXIgb2YgaGludHMgb24gZGlzayBmb3IgdGhpcyBwZWVyLgorX19fXworCit8SGludHNfbm90X3N0b3JlZC08UGVlcklQPiBhfAorX19fXworQ291bnRlcgorX19fXworCithfAorX19fXworTnVtYmVyIG9mIGhpbnRzIG5vdCBzdG9yZWQgZm9yIHRoaXMgcGVlciwgZHVlIHRvIGJlaW5nIGRvd24gcGFzdCB0aGUKK2NvbmZpZ3VyZWQgaGludCB3aW5kb3cuCitfX19fCisKK3w9PT0KKworPT0gSGludHNTZXJ2aWNlIE1ldHJpY3MKKworTWV0cmljcyBzcGVjaWZpYyB0byB0aGUgSGludHMgZGVsaXZlcnkgc2VydmljZS4gVGhlcmUgYXJlIGFsc28gc29tZQorbWV0cmljcyByZWxhdGVkIHRvIGhpbnRzIHRyYWNrZWQgaW4gYFN0b3JhZ2UgTWV0cmljc2AKKworVGhlc2UgbWV0cmljcyBpbmNsdWRlIHRoZSBwZWVyIGVuZHBvaW50ICppbiB0aGUgbWV0cmljIG5hbWUqCisKK1JlcG9ydGVkIG5hbWUgZm9ybWF0OgorCisqTWV0cmljIE5hbWUqOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuSGludHNTZXJ2aWNlLjxNZXRyaWNOYW1lPmAKKypKTVggTUJlYW4qOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1IaW50c1NlcnZpY2UgbmFtZT08TWV0cmljTmFtZT5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xIaW50c1N1Y2NlZWRlZCBhfAorX19fXworTWV0ZXIKK19fX18KKworYXwKK19fX18KK0EgbWV0ZXIgb2YgdGhlIGhpbnRzIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQKK19fX18KKworfEhpbnRzRmFpbGVkIGF8CitfX19fCitNZXRlcgorX19fXworCithfAorX19fXworQSBtZXRlciBvZiB0aGUgaGludHMgdGhhdCBmYWlsZWQgZGVsaXZlcgorX19fXworCit8SGludHNUaW1lZE91dCBhfAorX19fXworTWV0ZXIKK19fX18KKworYXwKK19fX18KK0EgbWV0ZXIgb2YgdGhlIGhpbnRzIHRoYXQgdGltZWQgb3V0CitfX19fCisKK3xIaW50X2RlbGF5cyB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgaGludCBkZWxpdmVyeSBkZWxheXMgKGluCittaWxsaXNlY29uZHMpCisKK3xIaW50X2RlbGF5cy08UGVlcklQPiB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgaGludCBkZWxpdmVyeSBkZWxheXMgKGluCittaWxsaXNlY29uZHMpIHBlciBwZWVyCit8PT09CisKKz09IFNTVGFibGUgSW5kZXggTWV0cmljcworCitNZXRyaWNzIHNwZWNpZmljIHRvIHRoZSBTU1RhYmxlIGluZGV4IG1ldGFkYXRhLgorCitSZXBvcnRlZCBuYW1lIGZvcm1hdDoKKworKk1ldHJpYyBOYW1lKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkluZGV4LjxNZXRyaWNOYW1lPi5Sb3dJbmRleEVudHJ5YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUluZGV4IHNjb3BlPVJvd0luZGV4RW50cnkgbmFtZT08TWV0cmljTmFtZT5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xJbmRleGVkRW50cnlTaXplIHxIaXN0b2dyYW0gfEhpc3RvZ3JhbSBvZiB0aGUgb24taGVhcCBzaXplLCBpbiBieXRlcywKK29mIHRoZSBpbmRleCBhY3Jvc3MgYWxsIFNTVGFibGVzLgorCit8SW5kZXhJbmZvQ291bnQgfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG9mIHRoZSBudW1iZXIgb2Ygb24taGVhcCBpbmRleAorZW50cmllcyBtYW5hZ2VkIGFjcm9zcyBhbGwgU1NUYWJsZXMuCisKK3xJbmRleEluZm9HZXRzIHxIaXN0b2dyYW0gfEhpc3RvZ3JhbSBvZiB0aGUgbnVtYmVyIGluZGV4IHNlZWtzIHBlcmZvcm1lZAorcGVyIFNTVGFibGUuCit8PT09CisKKz09IEJ1ZmZlclBvb2wgTWV0cmljcworCitNZXRyaWNzIHNwZWNpZmljIHRvIHRoZSBpbnRlcm5hbCByZWN5Y2xlZCBidWZmZXIgcG9vbCBDYXNzYW5kcmEgbWFuYWdlcy4KK1RoaXMgcG9vbCBpcyBtZWFudCB0byBrZWVwIGFsbG9jYXRpb25zIGFuZCBHQyBsb3dlciBieSByZWN5Y2xpbmcgb24gYW5kCitvZmYgaGVhcCBidWZmZXJzLgorCitSZXBvcnRlZCBuYW1lIGZvcm1hdDoKKworKk1ldHJpYyBOYW1lKjo6CisgIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkJ1ZmZlclBvb2wuPE1ldHJpY05hbWU+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUJ1ZmZlclBvb2wgbmFtZT08TWV0cmljTmFtZT5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xTaXplIHxHYXVnZTxMb25nPiB8U2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBtYW5hZ2VkIGJ1ZmZlciBwb29sCisKK3xNaXNzZXMgfE1ldGVyIGF8CitfX19fCitUaGUgcmF0ZSBvZiBtaXNzZXMgaW4gdGhlIHBvb2wuIFRoZSBoaWdoZXIgdGhpcyBpcyB0aGUgbW9yZSBhbGxvY2F0aW9ucworaW5jdXJyZWQuCitfX19fCisKK3w9PT0KKworPT0gQ2xpZW50IE1ldHJpY3MKKworTWV0cmljcyBzcGVjaWZjIHRvIGNsaWVudCBtYW5hZ21lbnQuCisKK1JlcG9ydGVkIG5hbWUgZm9ybWF0OgorCisqTWV0cmljIE5hbWUqOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2xpZW50LjxNZXRyaWNOYW1lPmAKKypKTVggTUJlYW4qOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1DbGllbnQgbmFtZT08TWV0cmljTmFtZT5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xjb25uZWN0ZWROYXRpdmVDbGllbnRzIHxHYXVnZTxJbnRlZ2VyPiB8TnVtYmVyIG9mIGNsaWVudHMgY29ubmVjdGVkIHRvCit0aGlzIG5vZGVzIG5hdGl2ZSBwcm90b2NvbCBzZXJ2ZXIKKworfGNvbm5lY3Rpb25zIHxHYXVnZTxMaXN0PE1hcDxTdHJpbmcsIFN0cmluZz4+IHxMaXN0IG9mIGFsbCBjb25uZWN0aW9ucworYW5kIHRoZWlyIHN0YXRlIGluZm9ybWF0aW9uCisKK3xjb25uZWN0ZWROYXRpdmVDbGllbnRzQnlVc2VyIHxHYXVnZTxNYXA8U3RyaW5nLCBJbnQ+IHxOdW1iZXIgb2YKK2Nvbm5uZWN0aXZlIG5hdGl2ZSBjbGllbnRzIGJ5IHVzZXJuYW1lCit8PT09CisKKz09IEJhdGNoIE1ldHJpY3MKKworTWV0cmljcyBzcGVjaWZjIHRvIGJhdGNoIHN0YXRlbWVudHMuCisKK1JlcG9ydGVkIG5hbWUgZm9ybWF0OgorCisqTWV0cmljIE5hbWUqOjoKKyAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQmF0Y2guPE1ldHJpY05hbWU+YAorKkpNWCBNQmVhbio6OgorICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUJhdGNoIG5hbWU9PE1ldHJpY05hbWU+YAorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCit8UGFydGl0aW9uc1BlckNvdW50ZXJCYXRjaCB8SGlzdG9ncmFtIHxEaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZgorcGFydGl0aW9ucyBwcm9jZXNzZWQgcGVyIGNvdW50ZXIgYmF0Y2gKKworfFBhcnRpdGlvbnNQZXJMb2dnZWRCYXRjaCB8SGlzdG9ncmFtIHxEaXN0cmlidXRpb24gb2YgdGhlIG51bWJlciBvZgorcGFydGl0aW9ucyBwcm9jZXNzZWQgcGVyIGxvZ2dlZCBiYXRjaAorCit8UGFydGl0aW9uc1BlclVubG9nZ2VkQmF0Y2ggfEhpc3RvZ3JhbSB8RGlzdHJpYnV0aW9uIG9mIHRoZSBudW1iZXIgb2YKK3BhcnRpdGlvbnMgcHJvY2Vzc2VkIHBlciB1bmxvZ2dlZCBiYXRjaAorfD09PQorCis9PSBKVk0gTWV0cmljcworCitKVk0gbWV0cmljcyBzdWNoIGFzIG1lbW9yeSBhbmQgZ2FyYmFnZSBjb2xsZWN0aW9uIHN0YXRpc3RpY3MgY2FuIGVpdGhlcgorYmUgYWNjZXNzZWQgYnkgY29ubmVjdGluZyB0byB0aGUgSlZNIHVzaW5nIEpNWCBvciBjYW4gYmUgZXhwb3J0ZWQgdXNpbmcKKzw8bWV0cmljX3JlcG9ydGVycz4+LgorCis9PT0gQnVmZmVyUG9vbAorCisqTWV0cmljIE5hbWUqOjoKKyAgYGp2bS5idWZmZXJzLjxkaXJlY3R8bWFwcGVkPi48TWV0cmljTmFtZT5gCisqSk1YIE1CZWFuKjo6CisgIGBqYXZhLm5pbzp0eXBlPUJ1ZmZlclBvb2wgbmFtZT08ZGlyZWN0fG1hcHBlZD5gCisKK1tjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCit8PT09Cit8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KK3xDYXBhY2l0eSB8R2F1Z2U8TG9uZz4gfEVzdGltYXRlZCB0b3RhbCBjYXBhY2l0eSBvZiB0aGUgYnVmZmVycyBpbiB0aGlzCitwb29sCisKK3xDb3VudCB8R2F1Z2U8TG9uZz4gfEVzdGltYXRlZCBudW1iZXIgb2YgYnVmZmVycyBpbiB0aGUgcG9vbAorCit8VXNlZCB8R2F1Z2U8TG9uZz4gfEVzdGltYXRlZCBtZW1vcnkgdGhhdCB0aGUgSmF2YSB2aXJ0dWFsIG1hY2hpbmUgaXMKK3VzaW5nIGZvciB0aGlzIGJ1ZmZlciBwb29sCit8PT09CisKKz09PSBGaWxlRGVzY3JpcHRvclJhdGlvCisKKypNZXRyaWMgTmFtZSo6OgorICBganZtLmZkLjxNZXRyaWNOYW1lPmAKKypKTVggTUJlYW4qOjoKKyAgYGphdmEubGFuZzp0eXBlPU9wZXJhdGluZ1N5c3RlbSBuYW1lPTxPcGVuRmlsZURlc2NyaXB0b3JDb3VudHxNYXhGaWxlRGVzY3JpcHRvckNvdW50PmAKKworW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgorfFVzYWdlIHxSYXRpbyB8UmF0aW8gb2YgdXNlZCB0byB0b3RhbCBmaWxlIGRlc2NyaXB0b3JzCit8PT09CisKKz09PSBHYXJiYWdlQ29sbGVjdG9yCisKKypNZXRyaWMgTmFtZSo6OgorICBganZtLmdjLjxnY190eXBlPi48TWV0cmljTmFtZT5gCisqSk1YIE1CZWFuKjo6CisgIGBqYXZhLmxhbmc6dHlwZT1HYXJiYWdlQ29sbGVjdG9yIG5hbWU9PGdjX3R5cGU+YAorCitbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQorfD09PQorfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCit8Q291bnQgfEdhdWdlPExvbmc+IHxUb3RhbCBudW1iZXIgb2YgY29sbGVjdGlvbnMgdGhhdCBoYXZlIG9jY3VycmVkCisKK3xUaW1lIHxHYXVnZTxMb25nPiB8QXBwcm94aW1hdGUgYWNjdW11bGF0ZWQgY29sbGVjdGlvbiBlbGFwc2VkIHRpbWUgaW4KK21pbGxpc2Vjb25kcworfD09PQorCis9PT0gTWVtb3J5CisKKypNZXRyaWMgTmFtZSo6OgorICBganZtLm1lbW9yeS48aGVhcC9ub24taGVhcC90b3RhbD4uPE1ldHJpY05hbWU+YAorKkpNWCBNQmVhbio6OgorICBgamF2YS5sYW5nOnR5cGU9TWVtb3J5YAorCitbY29scz0iLCwiLF0KK3w9PT0KK3xDb21taXR0ZWQgfEdhdWdlPExvbmc+IHxBbW91bnQgb2YgbWVtb3J5IGluIGJ5dGVzIHRoYXQgaXMgY29tbWl0dGVkIGZvcgordGhlIEpWTSB0byB1c2UKKworfEluaXQgfEdhdWdlPExvbmc+IHxBbW91bnQgb2YgbWVtb3J5IGluIGJ5dGVzIHRoYXQgdGhlIEpWTSBpbml0aWFsbHkKK3JlcXVlc3RzIGZyb20gdGhlIE9TCisKK3xNYXggfEdhdWdlPExvbmc+IHxNYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdGhhdCBjYW4gYmUgdXNlZAorZm9yIG1lbW9yeSBtYW5hZ2VtZW50CisKK3xVc2FnZSB8UmF0aW8gfFJhdGlvIG9mIHVzZWQgdG8gbWF4aW11bSBtZW1vcnkKKworfFVzZWQgfEdhdWdlPExvbmc+IHxBbW91bnQgb2YgdXNlZCBtZW1vcnkgaW4gYnl0ZXMKK3w9PT0KKworPT09IE1lbW9yeVBvb2wKKworKk1ldHJpYyBOYW1lKjo6CisgIGBqdm0ubWVtb3J5LnBvb2xzLjxtZW1vcnlfcG9vbD4uPE1ldHJpY05hbWU+YAorKkpNWCBNQmVhbio6OgorICBgamF2YS5sYW5nOnR5cGU9TWVtb3J5UG9vbCBuYW1lPTxtZW1vcnlfcG9vbD5gCisKK1tjb2xzPSIsLCIsXQorfD09PQorfENvbW1pdHRlZCB8R2F1Z2U8TG9uZz4gfEFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdGhhdCBpcyBjb21taXR0ZWQgZm9yCit0aGUgSlZNIHRvIHVzZQorCit8SW5pdCB8R2F1Z2U8TG9uZz4gfEFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdGhhdCB0aGUgSlZNIGluaXRpYWxseQorcmVxdWVzdHMgZnJvbSB0aGUgT1MKKworfE1heCB8R2F1Z2U8TG9uZz4gfE1heGltdW0gYW1vdW50IG9mIG1lbW9yeSBpbiBieXRlcyB0aGF0IGNhbiBiZSB1c2VkCitmb3IgbWVtb3J5IG1hbmFnZW1lbnQKKworfFVzYWdlIHxSYXRpbyB8UmF0aW8gb2YgdXNlZCB0byBtYXhpbXVtIG1lbW9yeQorCit8VXNlZCB8R2F1Z2U8TG9uZz4gfEFtb3VudCBvZiB1c2VkIG1lbW9yeSBpbiBieXRlcworfD09PQorCis9PSBKTVgKKworQW55IEpNWCBiYXNlZCBjbGllbnQgY2FuIGFjY2VzcyBtZXRyaWNzIGZyb20gY2Fzc2FuZHJhLgorCitJZiB5b3Ugd2lzaCB0byBhY2Nlc3MgSk1YIG1ldHJpY3Mgb3ZlciBodHRwIGl0J3MgcG9zc2libGUgdG8gZG93bmxvYWQKK2h0dHA6Ly9teDRqLnNvdXJjZWZvcmdlLm5ldC9bTXg0alRvb2xdIGFuZCBwbGFjZSBgbXg0ai10b29scy5qYXJgIGludG8KK3RoZSBjbGFzc3BhdGguIE9uIHN0YXJ0dXAgeW91IHdpbGwgc2VlIGluIHRoZSBsb2c6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK0h0dHBBZGFwdG9yIHZlcnNpb24gMy4wLjIgc3RhcnRlZCBvbiBwb3J0IDgwODEKKy0tLS0KKworVG8gY2hvb3NlIGEgZGlmZmVyZW50IHBvcnQgKDgwODEgaXMgdGhlIGRlZmF1bHQpIG9yIGEgZGlmZmVyZW50IGxpc3RlbgorYWRkcmVzcyAoMC4wLjAuMCBpcyBub3QgdGhlIGRlZmF1bHQpIGVkaXQgYGNvbmYvY2Fzc2FuZHJhLWVudi5zaGAgYW5kCit1bmNvbW1lbnQ6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KKyNNWDRKX0FERFJFU1M9Ii1EbXg0amFkZHJlc3M9MC4wLjAuMCIKKworI01YNEpfUE9SVD0iLURteDRqcG9ydD04MDgxIgorLS0tLQorCis9PSBNZXRyaWMgUmVwb3J0ZXJzIFtbbWV0cmljX3JlcG9ydGVyc11dCisKK0FzIG1lbnRpb25lZCBhdCB0aGUgdG9wIG9mIHRoaXMgc2VjdGlvbiBvbiBtb25pdG9yaW5nIHRoZSBDYXNzYW5kcmEKK21ldHJpY3MgY2FuIGJlIGV4cG9ydGVkIHRvIGEgbnVtYmVyIG9mIG1vbml0b3Jpbmcgc3lzdGVtIGEgbnVtYmVyIG9mCitodHRwOi8vbWV0cmljcy5kcm9wd2l6YXJkLmlvLzMuMS4wL2dldHRpbmctc3RhcnRlZC8jb3RoZXItcmVwb3J0aW5nW2J1aWx0Citpbl0gYW5kIGh0dHA6Ly9tZXRyaWNzLmRyb3B3aXphcmQuaW8vMy4xLjAvbWFudWFsL3RoaXJkLXBhcnR5L1t0aGlyZAorcGFydHldIHJlcG9ydGVyIHBsdWdpbnMuCisKK1RoZSBjb25maWd1cmF0aW9uIG9mIHRoZXNlIHBsdWdpbnMgaXMgbWFuYWdlZCBieSB0aGUKK2h0dHBzOi8vZ2l0aHViLmNvbS9hZGR0aGlzL21ldHJpY3MtcmVwb3J0ZXItY29uZmlnW21ldHJpY3MgcmVwb3J0ZXIKK2NvbmZpZyBwcm9qZWN0XS4gVGhlcmUgaXMgYSBzYW1wbGUgY29uZmlndXJhdGlvbiBmaWxlIGxvY2F0ZWQgYXQKK2Bjb25mL21ldHJpY3MtcmVwb3J0ZXItY29uZmlnLXNhbXBsZS55YW1sYC4KKworT25jZSBjb25maWd1cmVkLCB5b3Ugc2ltcGx5IHN0YXJ0IGNhc3NhbmRyYSB3aXRoIHRoZSBmbGFnCitgLURjYXNzYW5kcmEubWV0cmljc1JlcG9ydGVyQ29uZmlnRmlsZT1tZXRyaWNzLXJlcG9ydGVyLWNvbmZpZy55YW1sYC4KK1RoZSBzcGVjaWZpZWQgLnlhbWwgZmlsZSBwbHVzIGFueSAzcmQgcGFydHkgcmVwb3J0ZXIgamFycyBtdXN0IGFsbCBiZSBpbgorQ2Fzc2FuZHJhJ3MgY2xhc3NwYXRoLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9yZWFkX3JlcGFpci5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy9yZWFkX3JlcGFpci5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL3JlYWRfcmVwYWlyLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvcmVhZF9yZXBhaXIuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9yZXBhaXIuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvcmVwYWlyLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvcmVwYWlyLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvcmVwYWlyLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvc2VjdXJpdHkuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvc2VjdXJpdHkuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9zZWN1cml0eS5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL3NlY3VyaXR5LmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvdG9wb19jaGFuZ2VzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL3RvcG9fY2hhbmdlcy5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL3RvcG9fY2hhbmdlcy5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL3RvcG9fY2hhbmdlcy5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL3RyYW5zaWVudHJlcGxpY2F0aW9uLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL3RyYW5zaWVudHJlcGxpY2F0aW9uLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvdHJhbnNpZW50cmVwbGljYXRpb24uYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL29wZXJhdGluZy90cmFuc2llbnRyZXBsaWNhdGlvbi5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL3ZpcnR1YWx0YWJsZXMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy9vcGVyYXRpbmcvdmlydHVhbHRhYmxlcy5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMGJjYjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvb3BlcmF0aW5nL3ZpcnR1YWx0YWJsZXMuYWRvYwpAQCAtMCwwICsxLDQ4NCBAQAorPSBWaXJ0dWFsIFRhYmxlcworCitBcGFjaGUgQ2Fzc2FuZHJhIDQuMCBpbXBsZW1lbnRzIHZpcnR1YWwgdGFibGVzIChodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS03NjIyW0NBU1NBTkRSQS03NjIyXSkuCitWaXJ0dWFsIHRhYmxlcyBhcmUgdGFibGVzIGJhY2tlZCBieSBhbiBBUEkgaW5zdGVhZCBvZiBkYXRhIGV4cGxpY2l0bHkgbWFuYWdlZCBhbmQgc3RvcmVkIGFzIFNTVGFibGVzLiAKK0FwYWNoZSBDYXNzYW5kcmEgNC4wIGltcGxlbWVudHMgYSB2aXJ0dWFsIGtleXNwYWNlIGludGVyZmFjZSBmb3IgdmlydHVhbCB0YWJsZXMuIAorVmlydHVhbCB0YWJsZXMgYXJlIHNwZWNpZmljIHRvIGVhY2ggbm9kZS4KKworU29tZSBvZiB0aGUgZmVhdHVyZXMgb2YgdmlydHVhbCB0YWJsZXMgYXJlIHRoZSBhYmlsaXR5IHRvOgorCisqIGV4cG9zZSBtZXRyaWNzIHRocm91Z2ggQ1FMCisqIGV4cG9zZSBZQU1MIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKworVmlydHVhbCBrZXlzcGFjZXMgYW5kIHRhYmxlcyBhcmUgcXVpdGUgZGlmZmVyZW50IGZyb20gcmVndWxhciB0YWJsZXMgYW5kIGtleXNwYWNlczoKKworKiBWaXJ0dWFsIHRhYmxlcyBhcmUgY3JlYXRlZCBpbiBzcGVjaWFsIGtleXNwYWNlcyBhbmQgbm90IGp1c3QgYW55IGtleXNwYWNlLgorKiBWaXJ0dWFsIHRhYmxlcyBhcmUgbWFuYWdlZCBieSBDYXNzYW5kcmEuIFVzZXJzIGNhbm5vdCBydW4gRERMIHRvIGNyZWF0ZSBuZXcgdmlydHVhbCB0YWJsZXMgb3IgRE1MIHRvIG1vZGlmeSBleGlzdGluZyB2aXJ0dWFsIHRhYmxlcy4KKyogVmlydHVhbCB0YWJsZXMgYXJlIGN1cnJlbnRseSByZWFkLW9ubHksIGFsdGhvdWdoIHRoYXQgbWF5IGNoYW5nZSBpbiBhIGxhdGVyIHZlcnNpb24uCisqIFZpcnR1YWwgdGFibGVzIGFyZSBsb2NhbCBvbmx5LCBub24tZGlzdHJpYnV0ZWQsIGFuZCB0aHVzIG5vdCByZXBsaWNhdGVkLgorKiBWaXJ0dWFsIHRhYmxlcyBoYXZlIG5vIGFzc29jaWF0ZWQgU1NUYWJsZXMuCisqIENvbnNpc3RlbmN5IGxldmVsIG9mIHRoZSBxdWVyaWVzIHNlbnQgdG8gdmlydHVhbCB0YWJsZXMgYXJlIGlnbm9yZWQuCisqIEFsbCBleGlzdGluZyB2aXJ0dWFsIHRhYmxlcyB1c2UgYExvY2FsUGFydGl0aW9uZXJgLiAKK1NpbmNlIGEgdmlydHVhbCB0YWJsZSBpcyBub3QgcmVwbGljYXRlZCB0aGUgcGFydGl0aW9uZXIgc29ydHMgaW4gb3JkZXIgb2YgcGFydGl0aW9uIGtleXMgaW5zdGVhZCBvZiBieSB0aGVpciBoYXNoLgorKiBNYWtpbmcgYWR2YW5jZWQgcXVlcmllcyB1c2luZyBgQUxMT1cgRklMVEVSSU5HYCBhbmQgYWdncmVnYXRpb24gZnVuY3Rpb25zIGNhbiBiZSBleGVjdXRlZCBpbiB2aXJ0dWFsIHRhYmxlcywgZXZlbiB0aG91Z2ggaW4gbm9ybWFsIHRhYmxlcyB3ZSBkbyBub3QgcmVjb21tZW5kIGl0LgorRnJvbSBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xODIzOFtDQVNTQU5EUkEtMTgyMzhdLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHNwZWNpZnkgYEFMTE9XIEZJTFRFUklOR2Agd2hlbiBhIHF1ZXJ5IHdvdWxkIG5vcm1hbGx5IHJlcXVpcmUgdGhhdCwgZXhjZXB0IHdoZW4gcXVlcnlpbmcgdGhlIHRhYmxlIGBzeXN0ZW1fdmlld3Muc3lzdGVtX2xvZ3NgLgorCis9PSBWaXJ0dWFsIEtleXNwYWNlcworCitBcGFjaGUgQ2Fzc2FuZHJhIDQuMCBoYXMgYWRkZWQgdHdvIG5ldyBrZXlzcGFjZXMgZm9yIHZpcnR1YWwgdGFibGVzOgorCisqIGBzeXN0ZW1fdmlydHVhbF9zY2hlbWFgIAorKiBgc3lzdGVtX3ZpZXdzYC4gCisKK1RoZSBgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hYCBrZXlzcGFjZSBoYXMgdGhyZWUgdGFibGVzOiBga2V5c3BhY2VzYCwKK2Bjb2x1bW5zYCBhbmQgYHRhYmxlc2AgZm9yIHRoZSB2aXJ0dWFsIGtleXNwYWNlLCB0YWJsZSwgYW5kIGNvbHVtbiBkZWZpbml0aW9ucywgcmVzcGVjdGl2ZWx5LgorVGhlc2UgdGFibGVzIGNvbnRhaW4gc2NoZW1hIGluZm9ybWF0aW9uIGZvciB0aGUgdmlydHVhbCB0YWJsZXMuCitJdCBpcyB1c2VkIGJ5IENhc3NhbmRyYSBpbnRlcm5hbGx5IGFuZCBhIHVzZXIgc2hvdWxkIG5vdCBhY2Nlc3MgaXQgZGlyZWN0bHkuCisKK1RoZSBgc3lzdGVtX3ZpZXdzYCBrZXlzcGFjZSBjb250YWlucyB0aGUgYWN0dWFsIHZpcnR1YWwgdGFibGVzLgorCis9PSBWaXJ0dWFsIFRhYmxlIExpbWl0YXRpb25zCisKK0JlZm9yZSBkaXNjY3VzaW5nIHZpcnR1YWwga2V5c3BhY2VzIGFuZCB0YWJsZXMsIG5vdGUgdGhhdCB2aXJ0dWFsIGtleXNwYWNlcyBhbmQgdGFibGVzIGhhdmUgc29tZSBsaW1pdGF0aW9ucy4gCitUaGVzZSBsaW1pdGF0aW9ucyBhcmUgc3ViamVjdCB0byBjaGFuZ2UuCitWaXJ0dWFsIGtleXNwYWNlcyBjYW5ub3QgYmUgYWx0ZXJlZCBvciBkcm9wcGVkLiAKK0luIGZhY3QsIG5vIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBhZ2FpbnN0IHZpcnR1YWwga2V5c3BhY2VzLgorCitWaXJ0dWFsIHRhYmxlcyBjYW5ub3QgYmUgY3JlYXRlZCBpbiB2aXJ0dWFsIGtleXNwYWNlcy4KK1ZpcnR1YWwgdGFibGVzIGNhbm5vdCBiZSBhbHRlcmVkLCBkcm9wcGVkLCBvciB0cnVuY2F0ZWQuCitTZWNvbmRhcnkgaW5kZXhlcywgdHlwZXMsIGZ1bmN0aW9ucywgYWdncmVnYXRlcywgbWF0ZXJpYWxpemVkIHZpZXdzLCBhbmQgdHJpZ2dlcnMgY2Fubm90IGJlIGNyZWF0ZWQgZm9yIHZpcnR1YWwgdGFibGVzLgorRXhwaXJpbmcgdGltZS10by1saXZlIChUVEwpIGNvbHVtbnMgY2Fubm90IGJlIGNyZWF0ZWQuCitWaXJ0dWFsIHRhYmxlcyBkbyBub3Qgc3VwcG9ydCBjb25kaXRpb25hbCB1cGRhdGVzIG9yIGRlbGV0ZXMuCitBZ2dyZWdhdGVzIG1heSBiZSBydW4gaW4gU0VMRUNUIHN0YXRlbWVudHMuCisKK0NvbmRpdGlvbmFsIGJhdGNoIHN0YXRlbWVudHMgY2Fubm90IGluY2x1ZGUgbXV0YXRpb25zIGZvciB2aXJ0dWFsIHRhYmxlcywgbm9yIGNhbiBhIHZpcnR1YWwgdGFibGUgc3RhdGVtZW50IGJlIGluY2x1ZGVkIGluIGEgbG9nZ2VkIGJhdGNoLgorSW4gZmFjdCwgbXV0YXRpb25zIGZvciB2aXJ0dWFsIGFuZCByZWd1bGFyIHRhYmxlcyBjYW5ub3Qgb2NjdXIgaW4gdGhlIHNhbWUgYmF0Y2ggdGFibGUuCisKKz09IFZpcnR1YWwgVGFibGVzCisKK0VhY2ggb2YgdGhlIHZpcnR1YWwgdGFibGVzIGluIHRoZSBgc3lzdGVtX3ZpZXdzYCB2aXJ0dWFsIGtleXNwYWNlIGNvbnRhaW4gZGlmZmVyZW50IGluZm9ybWF0aW9uLgorCitUaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUgdmlydHVhbCB0YWJsZXM6IAorCitbd2lkdGg9Ijk4JSIsY29scz0iMjclLDczJSIsXQorfD09PQorfFZpcnR1YWwgVGFibGUgfERlc2NyaXB0aW9uCisKK3xjYWNoZXMgfERpc3BsYXlzIHRoZSBnZW5lcmFsIGNhY2hlIGluZm9ybWF0aW9uIGluY2x1ZGluZyBjYWNoZSBuYW1lLCBjYXBhY2l0eV9ieXRlcywgZW50cnlfY291bnQsIGhpdF9jb3VudCwgaGl0X3JhdGlvIGRvdWJsZSwKK3JlY2VudF9oaXRfcmF0ZV9wZXJfc2Vjb25kLCByZWNlbnRfcmVxdWVzdF9yYXRlX3Blcl9zZWNvbmQsIHJlcXVlc3RfY291bnQsIGFuZCBzaXplX2J5dGVzLgorCit8Y2xpZW50cyB8TGlzdHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGNvbm5lY3RlZCBjbGllbnRzLgorCit8Y29vcmRpbmF0b3JfcmVhZF9sYXRlbmN5IHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBjb29yZGluYXRvciByZWFkcy4KKworfGNvb3JkaW5hdG9yX3NjYW4gfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGNvb3JkaW5hdG9yIHNjYW5zLgorCit8Y29vcmRpbmF0b3Jfd3JpdGVfbGF0ZW5jeSB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgY29vcmRpbmF0b3Igd3JpdGVzLgorCit8ZGlza191c2FnZSB8UmVjb3JkcyBkaXNrIHVzYWdlIGluY2x1ZGluZyBkaXNrX3NwYWNlLCBrZXlzcGFjZV9uYW1lLCBhbmQgdGFibGVfbmFtZSwgc29ydGVkIGJ5IHN5c3RlbSBrZXlzcGFjZXMuCisKK3xpbnRlcm5vZGVfaW5ib3VuZCB8TGlzdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluYm91bmQgaW50ZXJub2RlIG1lc3NhZ2luZy4KKworfGludGVybm9kZV9vdXRib3VuZCB8SW5mb3JtYXRpb24gYWJvdXQgdGhlIG91dGJvdW5kIGludGVybm9kZSBtZXNzYWdpbmcuCisKK3xsb2NhbF9yZWFkX2xhdGVuY3kgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGxvY2FsIHJlYWRzLgorCit8bG9jYWxfc2NhbiB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgbG9jYWwgc2NhbnMuCisKK3xsb2NhbF93cml0ZV9sYXRlbmN5IHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBsb2NhbCB3cml0ZXMuCisKK3xtYXhfcGFydGl0aW9uX3NpemUgfEEgdGFibGUgbWV0cmljIGZvciBtYXhpbXVtIHBhcnRpdGlvbiBzaXplLgorCit8cm93c19wZXJfcmVhZCB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxla19uYW1lLCBtYXgsIGFuZCBtZWRpYW4gZm9yIHJvd3MgcmVhZC4KKworfHNldHRpbmdzIHxEaXNwbGF5cyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGluIGNhc3NhbmRyYS55YW1sLgorCit8c3N0YWJsZV90YXNrcyB8TGlzdHMgY3VycmVudGx5IHJ1bm5pbmcgdGFza3MgYW5kIHByb2dyZXNzIG9uIFNTVGFibGVzLCBmb3Igb3BlcmF0aW9ucyBsaWtlIGNvbXBhY3Rpb24gYW5kIHVwZ3JhZGUuCisKK3xzeXN0ZW1fbG9ncyB8RGlzcGxheXMgQ2Fzc2FuZHJhIGxvZ3MgaWYgbG9nZ2VkIHZpYSBDUUxMT0cgYXBwZW5kZXIgaW4gbG9nYmFjay54bWwKKworfHN5c3RlbV9wcm9wZXJ0aWVzIHxEaXNwbGF5cyBlbnZpcm9ubWVudGFsIHN5c3RlbSBwcm9wZXJ0aWVzIHNldCBvbiB0aGUgbm9kZS4KKworfHRocmVhZF9wb29scyB8TGlzdHMgbWV0cmljcyBmb3IgZWFjaCB0aHJlYWQgcG9vbC4KKworfHRvbWJzdG9uZXNfcGVyX3JlYWQgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZWtfbmFtZSwgbWF4LCBhbmQgbWVkaWFuIGZvciB0b21ic3RvbmVzLgorfD09PQorCitGb3IgaW1wcm92ZWQgdXNhYmlsaXR5LCBmcm9tIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE4MjM4W0NBU1NBTkRSQS0xODIzOF0sCithbGwgdGFibGVzIGV4Y2VwdCBgc3lzdGVtX2xvZ3NgIGhhdmUgYEFMTE9XIEZJTFRFUklOR2AgaW1wbGljaXRseSBhZGRlZCB0byBhIHF1ZXJ5IHdoZW4gcmVxdWlyZWQgYnkgQ1FMIHNwZWNpZmljYXRpb24uCisKK1dlIHNoYWxsIGRpc2N1c3Mgc29tZSBvZiB0aGUgdmlydHVhbCB0YWJsZXMgaW4gbW9yZSBkZXRhaWwgbmV4dC4KKworPT09IENsaWVudHMgVmlydHVhbCBUYWJsZQorCitUaGUgYGNsaWVudHNgIHZpcnR1YWwgdGFibGUgbGlzdHMgYWxsIGFjdGl2ZSBjb25uZWN0aW9ucyAoY29ubmVjdGVkCitjbGllbnRzKSBpbmNsdWRpbmcgdGhlaXIgaXAgYWRkcmVzcywgcG9ydCwgY2xpZW50X29wdGlvbnMsIGNvbm5lY3Rpb24gc3RhZ2UsIGRyaXZlcgorbmFtZSwgZHJpdmVyIHZlcnNpb24sIGhvc3RuYW1lLCBwcm90b2NvbCB2ZXJzaW9uLCByZXF1ZXN0IGNvdW50LCBzc2wKK2VuYWJsZWQsIHNzbCBwcm90b2NvbCBhbmQgdXNlciBuYW1lOgorCisuLi4uCitjcWxzaD4gRVhQQU5EIE9OIDsKK05vdyBFeHBhbmRlZCBvdXRwdXQgaXMgZW5hYmxlZAorY3Fsc2g+IFNFTEVDVCAqIEZST00gc3lzdGVtX3ZpZXdzLmNsaWVudHM7CisKK0AgUm93IDEKKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIGFkZHJlc3MgICAgICAgICAgfCAxMjcuMC4wLjEKKyBwb3J0ICAgICAgICAgICAgIHwgNTA2ODcKKyBjbGllbnRfb3B0aW9ucyAgIHwgeydDUUxfVkVSU0lPTic6ICczLjQuNycsICdEUklWRVJfTkFNRSc6ICdEYXRhU3RheCBQeXRob24gRHJpdmVyJywgJ0RSSVZFUl9WRVJTSU9OJzogJzMuMjUuMCd9CisgY29ubmVjdGlvbl9zdGFnZSB8IHJlYWR5CisgZHJpdmVyX25hbWUgICAgICB8IERhdGFTdGF4IFB5dGhvbiBEcml2ZXIKKyBkcml2ZXJfdmVyc2lvbiAgIHwgMy4yNS4wCisgaG9zdG5hbWUgICAgICAgICB8IGxvY2FsaG9zdAorIHByb3RvY29sX3ZlcnNpb24gfCA1CisgcmVxdWVzdF9jb3VudCAgICB8IDE2Cisgc3NsX2NpcGhlcl9zdWl0ZSB8IG51bGwKKyBzc2xfZW5hYmxlZCAgICAgIHwgRmFsc2UKKyBzc2xfcHJvdG9jb2wgICAgIHwgbnVsbAorIHVzZXJuYW1lICAgICAgICAgfCBhbm9ueW1vdXMKKworQCBSb3cgMgorLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgYWRkcmVzcyAgICAgICAgICB8IDEyNy4wLjAuMQorIHBvcnQgICAgICAgICAgICAgfCA1MDY4OAorIGNsaWVudF9vcHRpb25zICAgfCB7J0NRTF9WRVJTSU9OJzogJzMuNC43JywgJ0RSSVZFUl9OQU1FJzogJ0RhdGFTdGF4IFB5dGhvbiBEcml2ZXInLCAnRFJJVkVSX1ZFUlNJT04nOiAnMy4yNS4wJ30KKyBjb25uZWN0aW9uX3N0YWdlIHwgcmVhZHkKKyBkcml2ZXJfbmFtZSAgICAgIHwgRGF0YVN0YXggUHl0aG9uIERyaXZlcgorIGRyaXZlcl92ZXJzaW9uICAgfCAzLjI1LjAKKyBob3N0bmFtZSAgICAgICAgIHwgbG9jYWxob3N0CisgcHJvdG9jb2xfdmVyc2lvbiB8IDUKKyByZXF1ZXN0X2NvdW50ICAgIHwgNAorIHNzbF9jaXBoZXJfc3VpdGUgfCBudWxsCisgc3NsX2VuYWJsZWQgICAgICB8IEZhbHNlCisgc3NsX3Byb3RvY29sICAgICB8IG51bGwKKyB1c2VybmFtZSAgICAgICAgIHwgYW5vbnltb3VzCisKK0AgUm93IDMKKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIGFkZHJlc3MgICAgICAgICAgfCAxMjcuMC4wLjEKKyBwb3J0ICAgICAgICAgICAgIHwgNTA3NTMKKyBjbGllbnRfb3B0aW9ucyAgIHwgeydBUFBMSUNBVElPTl9OQU1FJzogJ1Rlc3RBcHAnLCAnQVBQTElDQVRJT05fVkVSU0lPTic6ICcxLjAuMCcsICdDTElFTlRfSUQnOiAnNTViM2VmYmQtYzU2Yi00NjlkLThjY2EtMDE2Yjg2MGIyZjAzJywgJ0NRTF9WRVJTSU9OJzogJzMuMC4wJywgJ0RSSVZFUl9OQU1FJzogJ0RhdGFTdGF4IEphdmEgZHJpdmVyIGZvciBBcGFjaGUgQ2Fzc2FuZHJhKFIpJywgJ0RSSVZFUl9WRVJTSU9OJzogJzQuMTMuMCd9CisgY29ubmVjdGlvbl9zdGFnZSB8IHJlYWR5CisgZHJpdmVyX25hbWUgICAgICB8IERhdGFTdGF4IEphdmEgZHJpdmVyIGZvciBBcGFjaGUgQ2Fzc2FuZHJhKFIpCisgZHJpdmVyX3ZlcnNpb24gICB8IDQuMTMuMAorIGhvc3RuYW1lICAgICAgICAgfCBsb2NhbGhvc3QKKyBwcm90b2NvbF92ZXJzaW9uIHwgNQorIHJlcXVlc3RfY291bnQgICAgfCAxOAorIHNzbF9jaXBoZXJfc3VpdGUgfCBudWxsCisgc3NsX2VuYWJsZWQgICAgICB8IEZhbHNlCisgc3NsX3Byb3RvY29sICAgICB8IG51bGwKKyB1c2VybmFtZSAgICAgICAgIHwgYW5vbnltb3VzCisKK0AgUm93IDQKKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIGFkZHJlc3MgICAgICAgICAgfCAxMjcuMC4wLjEKKyBwb3J0ICAgICAgICAgICAgIHwgNTA3NTUKKyBjbGllbnRfb3B0aW9ucyAgIHwgeydBUFBMSUNBVElPTl9OQU1FJzogJ1Rlc3RBcHAnLCAnQVBQTElDQVRJT05fVkVSU0lPTic6ICcxLjAuMCcsICdDTElFTlRfSUQnOiAnNTViM2VmYmQtYzU2Yi00NjlkLThjY2EtMDE2Yjg2MGIyZjAzJywgJ0NRTF9WRVJTSU9OJzogJzMuMC4wJywgJ0RSSVZFUl9OQU1FJzogJ0RhdGFTdGF4IEphdmEgZHJpdmVyIGZvciBBcGFjaGUgQ2Fzc2FuZHJhKFIpJywgJ0RSSVZFUl9WRVJTSU9OJzogJzQuMTMuMCd9CisgY29ubmVjdGlvbl9zdGFnZSB8IHJlYWR5CisgZHJpdmVyX25hbWUgICAgICB8IERhdGFTdGF4IEphdmEgZHJpdmVyIGZvciBBcGFjaGUgQ2Fzc2FuZHJhKFIpCisgZHJpdmVyX3ZlcnNpb24gICB8IDQuMTMuMAorIGhvc3RuYW1lICAgICAgICAgfCBsb2NhbGhvc3QKKyBwcm90b2NvbF92ZXJzaW9uIHwgNQorIHJlcXVlc3RfY291bnQgICAgfCA3Cisgc3NsX2NpcGhlcl9zdWl0ZSB8IG51bGwKKyBzc2xfZW5hYmxlZCAgICAgIHwgRmFsc2UKKyBzc2xfcHJvdG9jb2wgICAgIHwgbnVsbAorIHVzZXJuYW1lICAgICAgICAgfCBhbm9ueW1vdXMKKworKDQgcm93cykKKy4uLi4KKworU29tZSBleGFtcGxlcyBvZiBob3cgYGNsaWVudHNgIGNhbiBiZSB1c2VkIGFyZToKKworKiBUbyBmaW5kIGFwcGxpY2F0aW9ucyB1c2luZyBvbGQgaW5jb21wYXRpYmxlIHZlcnNpb25zIG9mIGRyaXZlcnMgYmVmb3JlCit1cGdyYWRpbmcgYW5kIHdpdGggYG5vZGV0b29sIGVuYWJsZW9sZHByb3RvY29sdmVyc2lvbnNgIGFuZAorYG5vZGV0b29sIGRpc2FibGVvbGRwcm90b2NvbHZlcnNpb25zYCBkdXJpbmcgdXBncmFkZXMuCisqIFRvIGlkZW50aWZ5IGNsaWVudHMgc2VuZGluZyB0b28gbWFueSByZXF1ZXN0cy4KKyogVG8gZmluZCBpZiBTU0wgaXMgZW5hYmxlZCBkdXJpbmcgdGhlIG1pZ3JhdGlvbiB0byBhbmQgZnJvbSBzc2wuCisKK1RoZSB2aXJ0dWFsIHRhYmxlcyBtYXkgYmUgZGVzY3JpYmVkIHdpdGggYERFU0NSSUJFYCBzdGF0ZW1lbnQuIFRoZSBEREwKK2xpc3RlZCBob3dldmVyIGNhbm5vdCBiZSBydW4gdG8gY3JlYXRlIGEgdmlydHVhbCB0YWJsZS4gQXMgYW4gZXhhbXBsZQorZGVzY3JpYmUgdGhlIGBzeXN0ZW1fdmlld3MuY2xpZW50c2AgdmlydHVhbCB0YWJsZToKKworLi4uLgorY3Fsc2g+IERFU0NSSUJFIFRBQkxFIHN5c3RlbV92aWV3cy5jbGllbnRzOworCisvKgorV2FybmluZzogVGFibGUgc3lzdGVtX3ZpZXdzLmNsaWVudHMgaXMgYSB2aXJ0dWFsIHRhYmxlIGFuZCBjYW5ub3QgYmUgcmVjcmVhdGVkIHdpdGggQ1FMLgorU3RydWN0dXJlLCBmb3IgcmVmZXJlbmNlOgorVklSVFVBTCBUQUJMRSBzeXN0ZW1fdmlld3MuY2xpZW50cyAoCisgIGFkZHJlc3MgaW5ldCwKKyAgcG9ydCBpbnQsCisgIGNsaWVudF9vcHRpb25zIGZyb3plbjxtYXA8dGV4dCwgdGV4dD4+LAorICBjb25uZWN0aW9uX3N0YWdlIHRleHQsCisgIGRyaXZlcl9uYW1lIHRleHQsCisgIGRyaXZlcl92ZXJzaW9uIHRleHQsCisgIGhvc3RuYW1lIHRleHQsCisgIHByb3RvY29sX3ZlcnNpb24gaW50LAorICByZXF1ZXN0X2NvdW50IGJpZ2ludCwKKyAgc3NsX2NpcGhlcl9zdWl0ZSB0ZXh0LAorICBzc2xfZW5hYmxlZCBib29sZWFuLAorICBzc2xfcHJvdG9jb2wgdGV4dCwKKyAgdXNlcm5hbWUgdGV4dCwKKyAgICBQUklNQVJZIEtFWSAoYWRkcmVzcywgcG9ydCkKKykgV0lUSCBDTFVTVEVSSU5HIE9SREVSIEJZIChwb3J0IEFTQykKKyAgICBBTkQgY29tbWVudCA9ICdjdXJyZW50bHkgY29ubmVjdGVkIGNsaWVudHMnOworKi8KKy4uLi4KKworPT09IENhY2hlcyBWaXJ0dWFsIFRhYmxlCisKK1RoZSBgY2FjaGVzYCB2aXJ0dWFsIHRhYmxlIGxpc3RzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYWNoZXMuIFRoZSBmb3VyCitjYWNoZXMgcHJlc2VudGx5IGNyZWF0ZWQgYXJlIGNodW5rcywgY291bnRlcnMsIGtleXMgYW5kIHJvd3MuIEEgcXVlcnkgb24KK3RoZSBgY2FjaGVzYCB2aXJ0dWFsIHRhYmxlIHJldHVybnMgdGhlIGZvbGxvd2luZyBkZXRhaWxzOgorCisuLi4uCitjcWxzaDpzeXN0ZW1fdmlld3M+IFNFTEVDVCAqIEZST00gc3lzdGVtX3ZpZXdzLmNhY2hlczsKK25hbWUgICAgIHwgY2FwYWNpdHlfYnl0ZXMgfCBlbnRyeV9jb3VudCB8IGhpdF9jb3VudCB8IGhpdF9yYXRpbyB8IHJlY2VudF9oaXRfcmF0ZV9wZXJfc2Vjb25kIHwgcmVjZW50X3JlcXVlc3RfcmF0ZV9wZXJfc2Vjb25kIHwgcmVxdWVzdF9jb3VudCB8IHNpemVfYnl0ZXMKKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tCisgIGNodW5rcyB8ICAgICAgMjI5NjM4MTQ0IHwgICAgICAgICAgMjkgfCAgICAgICAxNjYgfCAgICAgIDAuODMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgNSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiB8ICAgICAgICAgICAyMDAgfCAgICAgNDc1MTM2Citjb3VudGVycyB8ICAgICAgIDI2MjE0NDAwIHwgICAgICAgICAgIDAgfCAgICAgICAgIDAgfCAgICAgICBOYU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAwCisgICAga2V5cyB8ICAgICAgIDUyNDI4ODAwIHwgICAgICAgICAgMTQgfCAgICAgICAxMjQgfCAgMC44NzMyMzkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgNCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCB8ICAgICAgICAgICAxNDIgfCAgICAgICAxMjQ4CisgICAgcm93cyB8ICAgICAgICAgICAgICAwIHwgICAgICAgICAgIDAgfCAgICAgICAgIDAgfCAgICAgICBOYU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAwCisKKyg0IHJvd3MpCisuLi4uCisKKz09PSBTZXR0aW5ncyBWaXJ0dWFsIFRhYmxlCisKK1RoZSBgc2V0dGluZ3NgIHRhYmxlIGlzIHJhdGhlciB1c2VmdWwgYW5kIGxpc3RzIGFsbCB0aGUgY3VycmVudAorY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmcm9tIHRoZSBgY2Fzc2FuZHJhLnlhbWxgLiBUaGUgZW5jcnlwdGlvbiBvcHRpb25zCithcmUgb3ZlcnJpZGRlbiB0byBoaWRlIHRoZSBzZW5zaXRpdmUgdHJ1c3RzdG9yZSBpbmZvcm1hdGlvbiBvcgorcGFzc3dvcmRzLiBUaGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBob3dldmVyIGNhbm5vdCBiZSBzZXQgdXNpbmcgRE1MIG9uCit0aGUgdmlydHVhbCB0YWJsZSBwcmVzZW50bHk6IDoKKworLi4uLgorY3Fsc2g6c3lzdGVtX3ZpZXdzPiBTRUxFQ1QgKiBGUk9NIHN5c3RlbV92aWV3cy5zZXR0aW5nczsKKworbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYWxsb2NhdGVfdG9rZW5zX2Zvcl9rZXlzcGFjZSAgICAgICB8IG51bGwKKyAgYXVkaXRfbG9nZ2luZ19vcHRpb25zX2VuYWJsZWQgICAgICB8IGZhbHNlCisgIGF1dG9fc25hcHNob3QgICAgICAgICAgICAgICAgICAgICAgfCB0cnVlCisgIGF1dG9tYXRpY19zc3RhYmxlX3VwZ3JhZGUgICAgICAgICAgfCBmYWxzZQorICBjbHVzdGVyX25hbWUgICAgICAgICAgICAgICAgICAgICAgIHwgVGVzdCBDbHVzdGVyCisgIGVuYWJsZV90cmFuc2llbnRfcmVwbGljYXRpb24gICAgICAgfCBmYWxzZQorICBoaW50ZWRfaGFuZG9mZl9lbmFibGVkICAgICAgICAgICAgIHwgdHJ1ZQorICBoaW50c19kaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgIHwgL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2RhdGEvaGludHMKKyAgaW5jcmVtZW50YWxfYmFja3VwcyAgICAgICAgICAgICAgICB8IGZhbHNlCisgIGluaXRpYWxfdG9rZW4gICAgICAgICAgICAgICAgICAgICAgfCBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCisgIHJwY19hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgfCBsb2NhbGhvc3QKKyAgc3NsX3N0b3JhZ2VfcG9ydCAgICAgICAgICAgICAgICAgICB8IDcwMDEKKyAgc3RhcnRfbmF0aXZlX3RyYW5zcG9ydCAgICAgICAgICAgICB8IHRydWUKKyAgc3RvcmFnZV9wb3J0ICAgICAgICAgICAgICAgICAgICAgICB8IDcwMDAKKyAgc3RyZWFtX2VudGlyZV9zc3RhYmxlcyAgICAgICAgICAgICB8IHRydWUKKyAgKDIyNCByb3dzKQorLi4uLgorCitUaGUgYHNldHRpbmdzYCB0YWJsZSBjYW4gYmUgcmVhbGx5IHVzZWZ1bCBpZiB5YW1sIGZpbGUgaGFzIGJlZW4gY2hhbmdlZAorc2luY2Ugc3RhcnR1cCBhbmQgZG9udCBrbm93IHJ1bm5pbmcgY29uZmlndXJhdGlvbiwgb3IgdG8gZmluZCBpZiB0aGV5CitoYXZlIGJlZW4gbW9kaWZpZWQgdmlhIGpteC9ub2RldG9vbCBvciB2aXJ0dWFsIHRhYmxlcy4KKworPT09IFRocmVhZCBQb29scyBWaXJ0dWFsIFRhYmxlCisKK1RoZSBgdGhyZWFkX3Bvb2xzYCB0YWJsZSBsaXN0cyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgdGhyZWFkIHBvb2xzLgorVGhyZWFkIHBvb2wgaW5mb3JtYXRpb24gaW5jbHVkZXMgYWN0aXZlIHRhc2tzLCBhY3RpdmUgdGFza3MgbGltaXQsCitibG9ja2VkIHRhc2tzLCBibG9ja2VkIHRhc2tzIGFsbCB0aW1lLCBjb21wbGV0ZWQgdGFza3MsIGFuZCBwZW5kaW5nCit0YXNrcy4gQSBxdWVyeSBvbiB0aGUgYHRocmVhZF9wb29sc2AgcmV0dXJucyBmb2xsb3dpbmcgZGV0YWlsczoKKworLi4uLgorY3Fsc2g6c3lzdGVtX3ZpZXdzPiBzZWxlY3QgKiBmcm9tIHN5c3RlbV92aWV3cy50aHJlYWRfcG9vbHM7CisKK25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgfCBhY3RpdmVfdGFza3MgfCBhY3RpdmVfdGFza3NfbGltaXQgfCBibG9ja2VkX3Rhc2tzIHwgYmxvY2tlZF90YXNrc19hbGxfdGltZSB8IGNvbXBsZXRlZF90YXNrcyB8IHBlbmRpbmdfdGFza3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQW50aUVudHJvcHlTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICBDYWNoZUNsZWFudXBFeGVjdXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgIENvbXBhY3Rpb25FeGVjdXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgODgxIHwgICAgICAgICAgICAgMAorICAgICAgICBDb3VudGVyTXV0YXRpb25TdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAzMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICBHb3NzaXBTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgIEhpbnRzRGlzcGF0Y2hlciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgIEludGVybmFsUmVzcG9uc2VTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgTWVtdGFibGVGbHVzaFdyaXRlciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMAorICAgICAgICAgICBNZW10YWJsZVBvc3RGbHVzaCB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMAorICAgICAgIE1lbXRhYmxlUmVjbGFpbU1lbW9yeSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgICBNaWdyYXRpb25TdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICAgIE1pc2NTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgTXV0YXRpb25TdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAzMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgTmF0aXZlLVRyYW5zcG9ydC1SZXF1ZXN0cyB8ICAgICAgICAgICAgMSB8ICAgICAgICAgICAgICAgIDEyOCB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMTMwIHwgICAgICAgICAgICAgMAorICAgICAgUGVuZGluZ1JhbmdlQ2FsY3VsYXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMAorUGVyRGlza01lbXRhYmxlRmx1c2hXcml0ZXJfMCB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICAgIFJlYWRTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAzMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgIDEzIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICBSZXBhaXItVGFzayB8ICAgICAgICAgICAgMCB8ICAgICAgICAgMjE0NzQ4MzY0NyB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICBSZXF1ZXN0UmVzcG9uc2VTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICAgICAgU2FtcGxlciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgIFNlY29uZGFyeUluZGV4TWFuYWdlbWVudCB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgIFZhbGlkYXRpb25FeGVjdXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgMjE0NzQ4MzY0NyB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgICBWaWV3QnVpbGRFeGVjdXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgICBWaWV3TXV0YXRpb25TdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAzMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorLi4uLgorCisoMjQgcm93cykKKworPT09IEludGVybm9kZSBJbmJvdW5kIE1lc3NhZ2luZyBWaXJ0dWFsIFRhYmxlCisKK1RoZSBgaW50ZXJub2RlX2luYm91bmRgIHZpcnR1YWwgdGFibGUgaXMgZm9yIHRoZSBpbnRlcm5vZGUgaW5ib3VuZAorbWVzc2FnaW5nLiBJbml0aWFsbHkgbm8gaW50ZXJub2RlIGluYm91bmQgbWVzc2FnaW5nIG1heSBnZXQgbGlzdGVkLiBJbgorYWRkaXRpb24gdG8gdGhlIGFkZHJlc3MsIHBvcnQsIGRhdGFjZW50ZXIgYW5kIHJhY2sgaW5mb3JtYXRpb24gaW5jbHVkZXMKK2NvcnJ1cHQgZnJhbWVzIHJlY292ZXJlZCwgY29ycnVwdCBmcmFtZXMgdW5yZWNvdmVyZWQsIGVycm9yIGJ5dGVzLCBlcnJvcgorY291bnQsIGV4cGlyZWQgYnl0ZXMsIGV4cGlyZWQgY291bnQsIHByb2Nlc3NlZCBieXRlcywgcHJvY2Vzc2VkIGNvdW50LAorcmVjZWl2ZWQgYnl0ZXMsIHJlY2VpdmVkIGNvdW50LCBzY2hlZHVsZWQgYnl0ZXMsIHNjaGVkdWxlZCBjb3VudCwKK3Rocm90dGxlZCBjb3VudCwgdGhyb3R0bGVkIG5hbm9zLCB1c2luZyBieXRlcywgdXNpbmcgcmVzZXJ2ZSBieXRlcy4gQQorcXVlcnkgb24gdGhlIGBpbnRlcm5vZGVfaW5ib3VuZGAgcmV0dXJucyBmb2xsb3dpbmcgZGV0YWlsczoKKworLi4uLgorY3Fsc2g6c3lzdGVtX3ZpZXdzPiBTRUxFQ1QgKiBGUk9NIHN5c3RlbV92aWV3cy5pbnRlcm5vZGVfaW5ib3VuZDsKK2FkZHJlc3MgfCBwb3J0IHwgZGMgfCByYWNrIHwgY29ycnVwdF9mcmFtZXNfcmVjb3ZlcmVkIHwgY29ycnVwdF9mcmFtZXNfdW5yZWNvdmVyZWQgfAorZXJyb3JfYnl0ZXMgfCBlcnJvcl9jb3VudCB8IGV4cGlyZWRfYnl0ZXMgfCBleHBpcmVkX2NvdW50IHwgcHJvY2Vzc2VkX2J5dGVzIHwKK3Byb2Nlc3NlZF9jb3VudCB8IHJlY2VpdmVkX2J5dGVzIHwgcmVjZWl2ZWRfY291bnQgfCBzY2hlZHVsZWRfYnl0ZXMgfCBzY2hlZHVsZWRfY291bnQgfCB0aHJvdHRsZWRfY291bnQgfCB0aHJvdHRsZWRfbmFub3MgfCB1c2luZ19ieXRlcyB8IHVzaW5nX3Jlc2VydmVfYnl0ZXMKKy0tLS0tLS0tLSstLS0tLS0rLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstCistLS0tLS0tLS0tCisoMCByb3dzKQorLi4uLgorCis9PT0gU1NUYWJsZXMgVGFza3MgVmlydHVhbCBUYWJsZQorCitUaGUgYHNzdGFibGVfdGFza3NgIGNvdWxkIGJlIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHJ1bm5pbmcKK3Rhc2tzLiBJdCBsaXN0cyBmb2xsb3dpbmcgY29sdW1uczoKKworLi4uLgorY3Fsc2g6c3lzdGVtX3ZpZXdzPiBTRUxFQ1QgKiBGUk9NIHNzdGFibGVfdGFza3M7CitrZXlzcGFjZV9uYW1lIHwgdGFibGVfbmFtZSB8IHRhc2tfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtpbmQgICAgICAgfCBwcm9ncmVzcyB8IHRvdGFsICAgIHwgdW5pdAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0KKyAgICAgICBiYXNpYyB8ICAgICAgd2lkZTIgfCBjMzkwOTc0MC1jZGY3LTExZTktYThlZC0wZjAzZGUyZDlhZTEgfCBjb21wYWN0aW9uIHwgNjA0MTg3NjEgfCA3MDg4MjExMCB8IGJ5dGVzCisgICAgICAgYmFzaWMgfCAgICAgIHdpZGUyIHwgYzc1NTY3NzAtY2RmNy0xMWU5LWE4ZWQtMGYwM2RlMmQ5YWUxIHwgY29tcGFjdGlvbiB8ICAyOTk1NjIzIHwgNDAzMTQ2NzkgfCBieXRlcworLi4uLgorCitBcyBhbm90aGVyIGV4YW1wbGUsIHRvIGZpbmQgaG93IG11Y2ggdGltZSBpcyByZW1haW5pbmcgZm9yIFNTVGFibGUKK3Rhc2tzLCB1c2UgdGhlIGZvbGxvd2luZyBxdWVyeToKKworLi4uLgorU0VMRUNUIHRvdGFsIC0gcHJvZ3Jlc3MgQVMgcmVtYWluaW5nCitGUk9NIHN5c3RlbV92aWV3cy5zc3RhYmxlX3Rhc2tzOworLi4uLgorCis9PT0gT3RoZXIgVmlydHVhbCBUYWJsZXMKKworU29tZSBleGFtcGxlcyBvZiB1c2luZyBvdGhlciB2aXJ0dWFsIHRhYmxlcyBhcmUgYXMgZm9sbG93cy4KKworRmluZCB0YWJsZXMgd2l0aCBtb3N0IGRpc2sgdXNhZ2U6CisKKy4uLi4KK2NxbHNoPiBTRUxFQ1QgKiBGUk9NIGRpc2tfdXNhZ2UgV0hFUkUgbWViaWJ5dGVzID4gMSBBTExPVyBGSUxURVJJTkc7CisKK2tleXNwYWNlX25hbWUgfCB0YWJsZV9uYW1lIHwgbWViaWJ5dGVzCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tCisgICBrZXlzcGFjZTEgfCAgc3RhbmRhcmQxIHwgICAgICAgMjg4CisgIHRscF9zdHJlc3MgfCAgIGtleXZhbHVlIHwgICAgICAzMjExCisuLi4uCisKK0ZpbmQgcXVlcmllcyBvbiB0YWJsZS9zIHdpdGggZ3JlYXRlc3QgcmVhZCBsYXRlbmN5OgorCisuLi4uCitjcWxzaD4gU0VMRUNUICogRlJPTSAgbG9jYWxfcmVhZF9sYXRlbmN5IFdIRVJFIHBlcl9zZWNvbmQgPiAxIEFMTE9XIEZJTFRFUklORzsKKwora2V5c3BhY2VfbmFtZSB8IHRhYmxlX25hbWUgfCBwNTB0aF9tcyB8IHA5OXRoX21zIHwgY291bnQgICAgfCBtYXhfbXMgIHwgcGVyX3NlY29uZAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0tCisgIHRscF9zdHJlc3MgfCAgIGtleXZhbHVlIHwgICAgMC4wNDMgfCAgICAwLjE1MiB8IDQ5Nzg1MTU4IHwgMTg2LjU2MyB8ICAxMTQxOC4zNTYKKy4uLi4KKworCis9PSBFeGFtcGxlCisKK1thcmFiaWMsIHN0YXJ0PTFdCisuIFRvIGxpc3QgdGhlIGtleXNwYWNlcywgZW50ZXIgYGBjcWxzaGBgIGFuZCBydW4gdGhlIENRTCBjb21tYW5kIGBgREVTQ1JJQkUgS0VZU1BBQ0VTYGA6CisKK1tzb3VyY2UsIGNxbF0KKy0tLS0KK2NxbHNoPiBERVNDIEtFWVNQQUNFUzsKK3N5c3RlbV9zY2hlbWEgIHN5c3RlbSAgICAgICAgICBzeXN0ZW1fZGlzdHJpYnV0ZWQgIHN5c3RlbV92aXJ0dWFsX3NjaGVtYQorc3lzdGVtX2F1dGggICAgc3lzdGVtX3RyYWNlcyAgIHN5c3RlbV92aWV3cworLS0tLQorCitbYXJhYmljLCBzdGFydD0yXQorLiBUbyB2aWV3IHRoZSB2aXJ0dWFsIHRhYmxlIHNjaGVtYSwgcnVuIHRoZSBDUUwgY29tbWFuZHMgYGBVU0Ugc3lzdGVtX3ZpcnR1YWxfc2NoZW1hYGAgYW5kIGBgU0VMRUNUICogRlJPTSB0YWJsZXNgYDoKKworW3NvdXJjZSwgY3FsXQorLS0tLQorY3Fsc2g+IFVTRSBzeXN0ZW1fdmlydHVhbF9zY2hlbWE7CitjcWxzaD4gU0VMRUNUICogRlJPTSB0YWJsZXM7CistLS0tCisgCityZXN1bHRzIGluOgorCitbc291cmNlLCBjcWxdCistLS0tCisga2V5c3BhY2VfbmFtZSAgICAgICAgIHwgdGFibGVfbmFtZSAgICAgICAgICAgICAgICB8IGNvbW1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgICAgICAgICBjYWNoZXMgfCAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBjYWNoZXMKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgICAgICBjbGllbnRzIHwgICAgICAgICAgY3VycmVudGx5IGNvbm5lY3RlZCBjbGllbnRzCisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgIGNvb3JkaW5hdG9yX3JlYWRfbGF0ZW5jeSB8CisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgIGNvb3JkaW5hdG9yX3NjYW5fbGF0ZW5jeSB8CisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgY29vcmRpbmF0b3Jfd3JpdGVfbGF0ZW5jeSB8CisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgICAgZGlza191c2FnZSB8CisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICBpbnRlcm5vZGVfaW5ib3VuZCB8CisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgIGludGVybm9kZV9vdXRib3VuZCB8CisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgIGxvY2FsX3JlYWRfbGF0ZW5jeSB8CisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgIGxvY2FsX3NjYW5fbGF0ZW5jeSB8CisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgbG9jYWxfd3JpdGVfbGF0ZW5jeSB8CisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgIG1heF9wYXJ0aXRpb25fc2l6ZSB8CisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgcm93c19wZXJfcmVhZCB8CisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgICAgICBzZXR0aW5ncyB8ICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBzZXR0aW5ncworICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgIHNzdGFibGVfdGFza3MgfCAgICAgICAgICAgICAgICBjdXJyZW50IHNzdGFibGUgdGFza3MKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgIHN5c3RlbV9wcm9wZXJ0aWVzIHwgQ2Fzc2FuZHJhIHJlbGV2YW50IHN5c3RlbSBwcm9wZXJ0aWVzCisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgIHRocmVhZF9wb29scyB8CisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgdG9tYnN0b25lc19wZXJfcmVhZCB8Cisgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hIHwgICAgICAgICAgICAgICAgICAgY29sdW1ucyB8ICAgICAgICAgICB2aXJ0dWFsIGNvbHVtbiBkZWZpbml0aW9ucworIHN5c3RlbV92aXJ0dWFsX3NjaGVtYSB8ICAgICAgICAgICAgICAgICBrZXlzcGFjZXMgfCAgICAgICAgIHZpcnR1YWwga2V5c3BhY2UgZGVmaW5pdGlvbnMKKyBzeXN0ZW1fdmlydHVhbF9zY2hlbWEgfCAgICAgICAgICAgICAgICAgICAgdGFibGVzIHwgICAgICAgICAgICB2aXJ0dWFsIHRhYmxlIGRlZmluaXRpb25zCisKKygyMSByb3dzKQorLS0tLQorCitbYXJhYmljLCBzdGFydD0zXQorLiBUbyB2aWV3IHRoZSB2aXJ0dWFsIHRhYmxlcywgcnVuIHRoZSBDUUwgY29tbWFuZHMgYGBVU0Ugc3lzdGVtX3ZpZXdgYCBhbmQgYGBERVNDUklCRSB0YWJsZXNgYDoKKworW3NvdXJjZSwgY3FsXQorLS0tLQorY3Fsc2g+IFVTRSBzeXN0ZW1fdmlldzs7CitjcWxzaD4gREVTQ1JJQkUgdGFibGVzOworLS0tLQorCityZXN1bHRzIGluOgorCitbc291cmNlLCBjcWxdCistLS0tCitzc3RhYmxlX3Rhc2tzICAgICAgIGNsaWVudHMgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0b3Jfd3JpdGVfbGF0ZW5jeQorZGlza191c2FnZSAgICAgICAgICBsb2NhbF93cml0ZV9sYXRlbmN5ICAgICAgIHRvbWJzdG9uZXNfcGVyX3JlYWQKK3RocmVhZF9wb29scyAgICAgICAgaW50ZXJub2RlX291dGJvdW5kICAgICAgICBzZXR0aW5ncworbG9jYWxfc2Nhbl9sYXRlbmN5ICBjb29yZGluYXRvcl9zY2FuX2xhdGVuY3kgIHN5c3RlbV9wcm9wZXJ0aWVzCitpbnRlcm5vZGVfaW5ib3VuZCAgIGNvb3JkaW5hdG9yX3JlYWRfbGF0ZW5jeSAgbWF4X3BhcnRpdGlvbl9zaXplCitsb2NhbF9yZWFkX2xhdGVuY3kgIHJvd3NfcGVyX3JlYWQgICAgICAgICAgICAgY2FjaGVzCistLS0tCisKK1thcmFiaWMsIHN0YXJ0PTRdCisuIFRvIGxvb2sgYXQgYW55IHRhYmxlIGRhdGEsIHJ1biB0aGUgQ1FMIGNvbW1hbmQgYGBTRUxFQ1RgYDoKKworW3NvdXJjZSwgY3FsXQorLS0tLQorY3Fsc2g+IFVTRSBzeXN0ZW1fdmlldzs7CitjcWxzaD4gU0VMRUNUICogRlJPTSBjbGllbnRzIExJTUlUIDI7CistLS0tCisgcmVzdWx0cyBpbjoKKworW3NvdXJjZSwgY3FsXQorLS0tLQorIGFkZHJlc3MgICB8IHBvcnQgIHwgY29ubmVjdGlvbl9zdGFnZSB8IGRyaXZlcl9uYW1lICAgICAgICAgICAgfCBkcml2ZXJfdmVyc2lvbiB8IGhvc3RuYW1lICB8IHByb3RvY29sX3ZlcnNpb24gfCByZXF1ZXN0X2NvdW50IHwgc3NsX2NpcGhlcl9zdWl0ZSB8IHNzbF9lbmFibGVkIHwgc3NsX3Byb3RvY29sIHwgdXNlcm5hbWUKKy0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KKyAxMjcuMC4wLjEgfCAzNzMwOCB8ICAgICAgICAgICAgcmVhZHkgfCBEYXRhU3RheCBQeXRob24gRHJpdmVyIHwgICAzLjIxLjAucG9zdDAgfCBsb2NhbGhvc3QgfCAgICAgICAgICAgICAgICA0IHwgICAgICAgICAgICAxNyB8ICAgICAgICAgICAgIG51bGwgfCAgICAgICBGYWxzZSB8ICAgICAgICAgbnVsbCB8IGFub255bW91cworIDEyNy4wLjAuMSB8IDM3MzEwIHwgICAgICAgICAgICByZWFkeSB8IERhdGFTdGF4IFB5dGhvbiBEcml2ZXIgfCAgIDMuMjEuMC5wb3N0MCB8IGxvY2FsaG9zdCB8ICAgICAgICAgICAgICAgIDQgfCAgICAgICAgICAgICA4IHwgICAgICAgICAgICAgbnVsbCB8ICAgICAgIEZhbHNlIHwgICAgICAgICBudWxsIHwgYW5vbnltb3VzCisKKygyIHJvd3MpCistLS0tCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvY2Fzc2FuZHJhX3N0cmVzcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL2Nhc3NhbmRyYV9zdHJlc3MuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDZmMGExCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL2Nhc3NhbmRyYV9zdHJlc3MuYWRvYwpAQCAtMCwwICsxLDMzMCBAQAorPSBDYXNzYW5kcmEgU3RyZXNzCisKK1RoZSBgY2Fzc2FuZHJhLXN0cmVzc2AgdG9vbCBpcyB1c2VkIHRvIGJlbmNobWFyayBhbmQgbG9hZC10ZXN0IGEgQ2Fzc2FuZHJhCitjbHVzdGVyLiAKK2BjYXNzYW5kcmEtc3RyZXNzYCBzdXBwb3J0cyB0ZXN0aW5nIGFyYml0cmFyeSBDUUwgdGFibGVzIGFuZCBxdWVyaWVzLCBhbGxvd2luZyB1c2VycyB0byBiZW5jaG1hcmsgdGhlaXIgb3duIGRhdGEgbW9kZWwuCisKK1RoaXMgZG9jdW1lbnRhdGlvbiBmb2N1c2VzIG9uIHVzZXIgbW9kZSB0byB0ZXN0IHBlcnNvbmFsIHNjaGVtYS4KKworPT0gVXNhZ2UKKworVGhlcmUgYXJlIHNldmVyYWwgb3BlcmF0aW9uIHR5cGVzOgorCisqIHdyaXRlLW9ubHksIHJlYWQtb25seSwgYW5kIG1peGVkIHdvcmtsb2FkcyBvZiBzdGFuZGFyZCBkYXRhCisqIHdyaXRlLW9ubHkgYW5kIHJlYWQtb25seSB3b3JrbG9hZHMgZm9yIGNvdW50ZXIgY29sdW1ucworKiB1c2VyIGNvbmZpZ3VyZWQgd29ya2xvYWRzLCBydW5uaW5nIGN1c3RvbSBxdWVyaWVzIG9uIGN1c3RvbSBzY2hlbWFzCisKK1RoZSBzeW50YXggaXMgYGNhc3NhbmRyYS1zdHJlc3MgPGNvbW1hbmQ+IFtvcHRpb25zXWAuIAorRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gYSBnaXZlbiBjb21tYW5kIG9yIG9wdGlvbnMsIHJ1biBgY2Fzc2FuZHJhLXN0cmVzcyBoZWxwIDxjb21tYW5kfG9wdGlvbj5gLgorCitDb21tYW5kczo6OgorICByZWFkOjs7CisgICAgTXVsdGlwbGUgY29uY3VycmVudCByZWFkcyAtIHRoZSBjbHVzdGVyIG11c3QgZmlyc3QgYmUgcG9wdWxhdGVkIGJ5IGEKKyAgICB3cml0ZSB0ZXN0CisgIHdyaXRlOjs7CisgICAgTXVsdGlwbGUgY29uY3VycmVudCB3cml0ZXMgYWdhaW5zdCB0aGUgY2x1c3RlcgorICBtaXhlZDo7OworICAgIEludGVybGVhdmluZyBvZiBhbnkgYmFzaWMgY29tbWFuZHMsIHdpdGggY29uZmlndXJhYmxlIHJhdGlvIGFuZAorICAgIGRpc3RyaWJ1dGlvbiAtIHRoZSBjbHVzdGVyIG11c3QgZmlyc3QgYmUgcG9wdWxhdGVkIGJ5IGEgd3JpdGUgdGVzdAorICBjb3VudGVyX3dyaXRlOjs7CisgICAgTXVsdGlwbGUgY29uY3VycmVudCB1cGRhdGVzIG9mIGNvdW50ZXJzLgorICBjb3VudGVyX3JlYWQ6OzsKKyAgICBNdWx0aXBsZSBjb25jdXJyZW50IHJlYWRzIG9mIGNvdW50ZXJzLiBUaGUgY2x1c3RlciBtdXN0IGZpcnN0IGJlCisgICAgcG9wdWxhdGVkIGJ5IGEgY291bnRlcndyaXRlIHRlc3QuCisgIHVzZXI6OzsKKyAgICBJbnRlcmxlYXZpbmcgb2YgdXNlciBwcm92aWRlZCBxdWVyaWVzLCB3aXRoIGNvbmZpZ3VyYWJsZSByYXRpbyBhbmQKKyAgICBkaXN0cmlidXRpb24uCisgIGhlbHA6OzsKKyAgICBQcmludCBoZWxwIGZvciBhIGNvbW1hbmQgb3Igb3B0aW9uCisgIHByaW50Ojs7CisgICAgSW5zcGVjdCB0aGUgb3V0cHV0IG9mIGEgZGlzdHJpYnV0aW9uIGRlZmluaXRpb24KKyAgbGVnYWN5Ojs7CisgICAgTGVnYWN5IHN1cHBvcnQgbW9kZQorUHJpbWFyeSBPcHRpb25zOjo6CisgIC1wb3A6OzsKKyAgICBQb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBhbmQgaW50cmEtcGFydGl0aW9uIHZpc2l0IG9yZGVyCisgIC1pbnNlcnQ6OzsKKyAgICBJbnNlcnQgc3BlY2lmaWMgb3B0aW9ucyByZWxhdGluZyB0byB2YXJpb3VzIG1ldGhvZHMgZm9yIGJhdGNoaW5nIGFuZAorICAgIHNwbGl0dGluZyBwYXJ0aXRpb24gdXBkYXRlcworICAtY29sOjs7CisgICAgQ29sdW1uIGRldGFpbHMgc3VjaCBhcyBzaXplIGFuZCBjb3VudCBkaXN0cmlidXRpb24sIGRhdGEgZ2VuZXJhdG9yLAorICAgIG5hbWVzLCBjb21wYXJhdG9yIGFuZCBpZiBzdXBlciBjb2x1bW5zIHNob3VsZCBiZSB1c2VkCisgIC1yYXRlOjs7CisgICAgVGhyZWFkIGNvdW50LCByYXRlIGxpbWl0IG9yIGF1dG9tYXRpYyBtb2RlIChkZWZhdWx0IGlzIGF1dG8pCisgIC1tb2RlOjs7CisgICAgVGhyaWZ0IG9yIENRTCB3aXRoIG9wdGlvbnMKKyAgLWVycm9yczo7OworICAgIEhvdyB0byBoYW5kbGUgZXJyb3JzIHdoZW4gZW5jb3VudGVyZWQgZHVyaW5nIHN0cmVzcworICAtc2FtcGxlOjs7CisgICAgU3BlY2lmeSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gY29sbGVjdCBmb3IgbWVhc3VyaW5nIGxhdGVuY3kKKyAgLXNjaGVtYTo7OworICAgIFJlcGxpY2F0aW9uIHNldHRpbmdzLCBjb21wcmVzc2lvbiwgY29tcGFjdGlvbiwgZXRjLgorICAtbm9kZTo7OworICAgIE5vZGVzIHRvIGNvbm5lY3QgdG8KKyAgLWxvZzo7OworICAgIFdoZXJlIHRvIGxvZyBwcm9ncmVzcyB0bywgYW5kIHRoZSBpbnRlcnZhbCBhdCB3aGljaCB0byBkbyBpdAorICAtdHJhbnNwb3J0Ojs7CisgICAgQ3VzdG9tIHRyYW5zcG9ydCBmYWN0b3JpZXMKKyAgLXBvcnQ6OzsKKyAgICBUaGUgcG9ydCB0byBjb25uZWN0IHRvIGNhc3NhbmRyYSBub2RlcyBvbgorICAtZ3JhcGg6OzsKKyAgICBHcmFwaCByZWNvcmRlZCBtZXRyaWNzCisgIC10b2tlbnJhbmdlOjs7CisgICAgVG9rZW4gcmFuZ2Ugc2V0dGluZ3MKKyAgLWpteDo7OworICAgIFVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IgSk1YIGNvbm5lY3Rpb24KKyAgLWNyZWRlbnRpYWxzLWZpbGUgPHBhdGg+Ojs7CisgICAgQ3JlZGVudGlhbHMgZmlsZSB0byBzcGVjaWZ5IGZvciBDUUwsIEpNWCBhbmQgdHJhbnNwb3J0CisgIC1yZXBvcnRpbmc6OzsKKyAgICBGcmVxdWVuY3kgb2YgcHJpbnRpbmcgc3RhdGlzdGljcyBhbmQgaGVhZGVyIGZvciBzdHJlc3Mgb3V0cHV0CitTdWJvcHRpb25zOjo6CisgIEV2ZXJ5IGNvbW1hbmQgYW5kIHByaW1hcnkgb3B0aW9uIGhhcyBpdHMgb3duIGNvbGxlY3Rpb24gb2Ygc3Vib3B0aW9ucy4KKyAgVGhlc2UgYXJlIHRvbyBudW1lcm91cyB0byBsaXN0IGhlcmUuIEZvciBpbmZvcm1hdGlvbiBvbiB0aGUgc3Vib3B0aW9ucworICBmb3IgZWFjaCBjb21tYW5kIG9yIG9wdGlvbiwgcGxlYXNlIHVzZSB0aGUgaGVscCBjb21tYW5kLAorICBgY2Fzc2FuZHJhLXN0cmVzcyBoZWxwIDxjb21tYW5kfG9wdGlvbj5gLgorCis9PSBVc2VyIG1vZGUKKworVXNlciBtb2RlIGFsbG93cyB5b3UgdG8gc3RyZXNzIHlvdXIgb3duIHNjaGVtYXMsIHRvIHNhdmUgeW91IHRpbWUKK2luIHRoZSBsb25nIHJ1bi4gRmluZCBvdXQgaWYgeW91ciBhcHBsaWNhdGlvbiBjYW4gc2NhbGUgdXNpbmcgc3RyZXNzIHRlc3Qgd2l0aCB5b3VyIHNjaGVtYS4KKworPT09IFByb2ZpbGUKKworVXNlciBtb2RlIGRlZmluZXMgYSBwcm9maWxlIHVzaW5nIFlBTUwuIAorTXVsdGlwbGUgWUFNTCBmaWxlcyBtYXkgYmUgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIG9wZXJhdGlvbnMgaW4gdGhlIG9wcyBhcmd1bWVudCBhcmUgcmVmZXJlbmNlZCBhcworc3BlY25hbWUub3BuYW1lLgorCitBbiBpZGVudGlmaWVyIGZvciB0aGUgcHJvZmlsZToKKworW3NvdXJjZSx5YW1sXQorLS0tLQorc3BlY25hbWU6IHN0YWZmX2FjdGl2aXRpZXMKKy0tLS0KKworVGhlIGtleXNwYWNlIGZvciB0aGUgdGVzdDoKKworW3NvdXJjZSx5YW1sXQorLS0tLQora2V5c3BhY2U6IHN0YWZmCistLS0tCisKK0NRTCBmb3IgdGhlIGtleXNwYWNlLiBPcHRpb25hbCBpZiB0aGUga2V5c3BhY2UgYWxyZWFkeSBleGlzdHM6CisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK2tleXNwYWNlX2RlZmluaXRpb246IHwKKyBDUkVBVEUgS0VZU1BBQ0Ugc3RyZXNzY3FsIFdJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6IDN9OworLS0tLQorCitUaGUgdGFibGUgdG8gYmUgc3RyZXNzZWQ6CisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK3RhYmxlOiBzdGFmZl9hY3Rpdml0aWVzCistLS0tCisKK0NRTCBmb3IgdGhlIHRhYmxlLiBPcHRpb25hbCBpZiB0aGUgdGFibGUgYWxyZWFkeSBleGlzdHM6CisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK3RhYmxlX2RlZmluaXRpb246IHwKKyAgQ1JFQVRFIFRBQkxFIHN0YWZmX2FjdGl2aXRpZXMgKAorICAgICAgbmFtZSB0ZXh0LAorICAgICAgd2hlbiB0aW1ldXVpZCwKKyAgICAgIHdoYXQgdGV4dCwKKyAgICAgIFBSSU1BUlkgS0VZKG5hbWUsIHdoZW4sIHdoYXQpCisgICkgCistLS0tCisKK09wdGlvbmFsIG1ldGEtaW5mb3JtYXRpb24gb24gdGhlIGdlbmVyYXRlZCBjb2x1bW5zIGluIHRoZSBhYm92ZSB0YWJsZS4KK1RoZSBtaW4gYW5kIG1heCBvbmx5IGFwcGx5IHRvIHRleHQgYW5kIGJsb2IgdHlwZXMuIFRoZSBkaXN0cmlidXRpb24KK2ZpZWxkIHJlcHJlc2VudHMgdGhlIHRvdGFsIHVuaXF1ZSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiB0aGF0IGNvbHVtbgorYWNyb3NzIHJvd3M6CisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK2NvbHVtbnNwZWM6CisgIC0gbmFtZTogbmFtZQorICAgIHNpemU6IHVuaWZvcm0oNS4uMTApICMgVGhlIG5hbWVzIG9mIHRoZSBzdGFmZiBtZW1iZXJzIGFyZSBiZXR3ZWVuIDUtMTAgY2hhcmFjdGVycworICAgIHBvcHVsYXRpb246IHVuaWZvcm0oMS4uMTApICMgMTAgcG9zc2libGUgc3RhZmYgbWVtYmVycyB0byBwaWNrIGZyb20KKyAgLSBuYW1lOiB3aGVuCisgICAgY2x1c3RlcjogdW5pZm9ybSgyMC4uNTAwKSAjIFN0YWZmIG1lbWJlcnMgZG8gYmV0d2VlbiAyMCBhbmQgNTAwIGV2ZW50cworICAtIG5hbWU6IHdoYXQKKyAgICBzaXplOiBub3JtYWwoMTAuLjEwMCw1MCkKKy0tLS0KKworU3VwcG9ydGVkIHR5cGVzIGFyZToKKworQW4gZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uIG92ZXIgdGhlIHJhbmdlIFttaW4uLm1heF06CisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK0VYUChtaW4uLm1heCkKKy0tLS0KKworQW4gZXh0cmVtZSB2YWx1ZSAoV2VpYnVsbCkgZGlzdHJpYnV0aW9uIG92ZXIgdGhlIHJhbmdlIFttaW4uLm1heF06CisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK0VYVFJFTUUobWluLi5tYXgsc2hhcGUpCistLS0tCisKK0EgZ2F1c3NpYW4vbm9ybWFsIGRpc3RyaWJ1dGlvbiwgd2hlcmUgbWVhbj0obWluK21heCkvMiwgYW5kIHN0ZGV2IGlzCisobWVhbi1taW4pL3N0ZHZybmc6CisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK0dBVVNTSUFOKG1pbi4ubWF4LHN0ZHZybmcpCistLS0tCisKK0EgZ2F1c3NpYW4vbm9ybWFsIGRpc3RyaWJ1dGlvbiwgd2l0aCBleHBsaWNpdGx5IGRlZmluZWQgbWVhbiBhbmQgc3RkZXY6CisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK0dBVVNTSUFOKG1pbi4ubWF4LG1lYW4sc3RkZXYpCistLS0tCisKK0EgdW5pZm9ybSBkaXN0cmlidXRpb24gb3ZlciB0aGUgcmFuZ2UgW21pbiwgbWF4XToKKworW3NvdXJjZSx5YW1sXQorLS0tLQorVU5JRk9STShtaW4uLm1heCkKKy0tLS0KKworQSBmaXhlZCBkaXN0cmlidXRpb24sIGFsd2F5cyByZXR1cm5pbmcgdGhlIHNhbWUgdmFsdWU6CisKK1tzb3VyY2UseWFtbF0KKy0tLS0KK0ZJWEVEKHZhbCkKKy0tLS0KKworSWYgcHJlY2VkZWQgYnkgfiwgdGhlIGRpc3RyaWJ1dGlvbiBpcyBpbnZlcnRlZAorCitEZWZhdWx0cyBmb3IgYWxsIGNvbHVtbnMgYXJlIHNpemU6IHVuaWZvcm0oNC4uOCksIHBvcHVsYXRpb246Cit1bmlmb3JtKDEuLjEwMEIpLCBjbHVzdGVyOiBmaXhlZCgxKQorCitJbnNlcnQgZGlzdHJpYnV0aW9uczoKKworW3NvdXJjZSx5YW1sXQorLS0tLQoraW5zZXJ0OgorICAjIEhvdyBtYW55IHBhcnRpdGlvbiB0byBpbnNlcnQgcGVyIGJhdGNoCisgIHBhcnRpdGlvbnM6IGZpeGVkKDEpCisgICMgSG93IG1hbnkgcm93cyB0byB1cGRhdGUgcGVyIHBhcnRpdGlvbgorICBzZWxlY3Q6IGZpeGVkKDEpLzUwMAorICAjIFVOTE9HR0VEIG9yIExPR0dFRCBiYXRjaCBmb3IgaW5zZXJ0CisgIGJhdGNodHlwZTogVU5MT0dHRUQKKy0tLS0KKworQ3VycmVudGx5IGFsbCBpbnNlcnRzIGFyZSBkb25lIGluc2lkZSBiYXRjaGVzLgorCitSZWFkIHN0YXRlbWVudHMgdG8gdXNlIGR1cmluZyB0aGUgdGVzdDoKKworW3NvdXJjZSx5YW1sXQorLS0tLQorcXVlcmllczoKKyAgIGV2ZW50czoKKyAgICAgIGNxbDogc2VsZWN0ICogIGZyb20gc3RhZmZfYWN0aXZpdGllcyB3aGVyZSBuYW1lID0gPworICAgICAgZmllbGRzOiBzYW1lcm93CisgICBsYXRlc3RfZXZlbnQ6CisgICAgICBjcWw6IHNlbGVjdCAqIGZyb20gc3RhZmZfYWN0aXZpdGllcyB3aGVyZSBuYW1lID0gPyAgTElNSVQgMQorICAgICAgZmllbGRzOiBzYW1lcm93CistLS0tCisKK1J1bm5pbmcgYSB1c2VyIG1vZGUgdGVzdDoKKworW3NvdXJjZSx5YW1sXQorLS0tLQorY2Fzc2FuZHJhLXN0cmVzcyB1c2VyIHByb2ZpbGU9Li9leGFtcGxlLnlhbWwgZHVyYXRpb249MW0gIm9wcyhpbnNlcnQ9MSxsYXRlc3RfZXZlbnQ9MSxldmVudHM9MSkiIHRydW5jYXRlPW9uY2UKKy0tLS0KKworVGhpcyB3aWxsIGNyZWF0ZSB0aGUgc2NoZW1hIHRoZW4gcnVuIHRlc3RzIGZvciAxIG1pbnV0ZSB3aXRoIGFuIGVxdWFsCitudW1iZXIgb2YgaW5zZXJ0cywgbGF0ZXN0X2V2ZW50IHF1ZXJpZXMgYW5kIGV2ZW50cyBxdWVyaWVzLiBBZGRpdGlvbmFsbHkKK3RoZSB0YWJsZSB3aWxsIGJlIHRydW5jYXRlZCBvbmNlIGJlZm9yZSB0aGUgdGVzdC4KKworVGhlIGZ1bGwgZXhhbXBsZSBjYW4gYmUgZm91bmQgaGVyZToKK1tzb3VyY2UsIHlhbWxdCistLS0tCitpbmNsdWRlOjpleGFtcGxlJFlBTUwvc3RyZXNzLWV4YW1wbGUueWFtbFtdCistLS0tIAorCitSdW5uaW5nIGEgdXNlciBtb2RlIHRlc3Qgd2l0aCBtdWx0aXBsZSB5YW1sIGZpbGVzOjo6OgorICBjYXNzYW5kcmEtc3RyZXNzIHVzZXIgcHJvZmlsZT0uL2V4YW1wbGUueWFtbCwuL2V4YW1wbGUyLnlhbWwKKyAgZHVyYXRpb249MW0gIm9wcyhleDEuaW5zZXJ0PTEsZXgxLmxhdGVzdF9ldmVudD0xLGV4Mi5pbnNlcnQ9MikiCisgIHRydW5jYXRlPW9uY2UKK1RoaXMgd2lsbCBydW4gb3BlcmF0aW9ucyBhcyBzcGVjaWZpZWQgaW4gYm90aCB0aGUgZXhhbXBsZS55YW1sIGFuZAorZXhhbXBsZTIueWFtbCBmaWxlcy4gZXhhbXBsZS55YW1sIGFuZCBleGFtcGxlMi55YW1sIGNhbiByZWZlcmVuY2UgdGhlCitzYW1lIHRhYmxlLCBhbHRob3VnaCBjYXJlIG11c3QgYmUgdGFrZW4gdGhhdCB0aGUgdGFibGUgZGVmaW5pdGlvbiBpcyBpZGVudGljYWwKKyAoZGF0YSBnZW5lcmF0aW9uIHNwZWNzIGNhbiBiZSBkaWZmZXJlbnQpLgorCis9PT0gTGlnaHR3ZWlnaHQgdHJhbnNhY3Rpb24gc3VwcG9ydAorCitjYXNzYW5kcmEtc3RyZXNzIHN1cHBvcnRzIGxpZ2h0d2VpZ2h0IHRyYW5zYWN0aW9ucy4gCitUbyB1c2UgdGhpcyBmZWF0dXJlLCB0aGUgY29tbWFuZCB3aWxsIGZpcnN0IHJlYWQgY3VycmVudCBkYXRhIGZyb20gQ2Fzc2FuZHJhLCBhbmQgdGhlbiB1c2VzIHJlYWQgdmFsdWVzIHRvCitmdWxmaWxsIGxpZ2h0d2VpZ2h0IHRyYW5zYWN0aW9uIGNvbmRpdGlvbnMuCisKK0xpZ2h0d2VpZ2h0IHRyYW5zYWN0aW9uIHVwZGF0ZSBxdWVyeToKKworW3NvdXJjZSx5YW1sXQorLS0tLQorcXVlcmllczoKKyAgcmVndWxhcnVwZGF0ZToKKyAgICAgIGNxbDogdXBkYXRlIGJsb2dwb3N0cyBzZXQgYXV0aG9yID0gPyB3aGVyZSBkb21haW4gPSA/IGFuZCBwdWJsaXNoZWRfZGF0ZSA9ID8KKyAgICAgIGZpZWxkczogc2FtZXJvdworICB1cGRhdGV3aXRobHd0OgorICAgICAgY3FsOiB1cGRhdGUgYmxvZ3Bvc3RzIHNldCBhdXRob3IgPSA/IHdoZXJlIGRvbWFpbiA9ID8gYW5kIHB1Ymxpc2hlZF9kYXRlID0gPyBJRiBib2R5ID0gPyBBTkQgdXJsID0gPworICAgICAgZmllbGRzOiBzYW1lcm93CistLS0tCisKK1RoZSBmdWxsIGV4YW1wbGUgY2FuIGJlIGZvdW5kIGhlcmU6Citbc291cmNlLCB5YW1sXQorLS0tLQoraW5jbHVkZTo6ZXhhbXBsZSRZQU1ML3N0cmVzcy1sd3QtZXhhbXBsZS55YW1sW10KKy0tLS0KKworPT0gR3JhcGhpbmcKKworR3JhcGhzIGNhbiBiZSBnZW5lcmF0ZWQgZm9yIGVhY2ggcnVuIG9mIHN0cmVzcy4KKworaW1hZ2U6OmV4YW1wbGUtc3RyZXNzLWdyYXBoLnBuZ1tleGFtcGxlIGNhc3NhbmRyYS1zdHJlc3MgZ3JhcGhdCisKK1RvIGNyZWF0ZSBhIG5ldyBncmFwaDoKKworW3NvdXJjZSx5YW1sXQorLS0tLQorY2Fzc2FuZHJhLXN0cmVzcyB1c2VyIHByb2ZpbGU9Li9zdHJlc3MtZXhhbXBsZS55YW1sICJvcHMoaW5zZXJ0PTEsbGF0ZXN0X2V2ZW50PTEsZXZlbnRzPTEpIiAtZ3JhcGggZmlsZT1ncmFwaC5odG1sIHRpdGxlPSJBd2Vzb21lIGdyYXBoIgorLS0tLQorCitUbyBhZGQgYSBuZXcgcnVuIHRvIGFuIGV4aXN0aW5nIGdyYXBoIHBvaW50IHRvIGFuIGV4aXN0aW5nIGZpbGUgYW5kIGFkZAorYSByZXZpc2lvbiBuYW1lOgorCitbc291cmNlLHlhbWxdCistLS0tCitjYXNzYW5kcmEtc3RyZXNzIHVzZXIgcHJvZmlsZT0uL3N0cmVzcy1leGFtcGxlLnlhbWwgZHVyYXRpb249MW0gIm9wcyhpbnNlcnQ9MSxsYXRlc3RfZXZlbnQ9MSxldmVudHM9MSkiIC1ncmFwaCBmaWxlPWdyYXBoLmh0bWwgdGl0bGU9IkF3ZXNvbWUgZ3JhcGgiIHJldmlzaW9uPSJTZWNvbmQgcnVuIgorLS0tLQorCis9PSBGQVEKKworKkhvdyBkbyB5b3UgdXNlIE5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5IGZvciB0aGUga2V5c3BhY2U/KgorCitVc2UgdGhlIHNjaGVtYSBvcHRpb24gbWFraW5nIHN1cmUgdG8gZWl0aGVyIGVzY2FwZSB0aGUgcGFyZW50aGVzaXMgb3IKK2VuY2xvc2UgaW4gcXVvdGVzOgorCitbc291cmNlLHlhbWxdCistLS0tCitjYXNzYW5kcmEtc3RyZXNzIHdyaXRlIC1zY2hlbWEgInJlcGxpY2F0aW9uKHN0cmF0ZWd5PU5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5LGRhdGFjZW50ZXIxPTMpIgorLS0tLQorCisqSG93IGRvIHlvdSB1c2UgU1NMPyoKKworVXNlIHRoZSB0cmFuc3BvcnQgb3B0aW9uOgorCitbc291cmNlLHlhbWxdCistLS0tCitjYXNzYW5kcmEtc3RyZXNzICJ3cml0ZSBuPTEwMGsgY2w9T05FIG5vLXdhcm11cCIgLXRyYW5zcG9ydCAidHJ1c3RzdG9yZT0kSE9NRS9qa3MvdHJ1c3RzdG9yZS5qa3MgdHJ1c3RzdG9yZS1wYXNzd29yZD1jYXNzYW5kcmEiCistLS0tCisKKypJcyBDYXNzYW5kcmEgU3RyZXNzIGEgc2VjdXJlZCB0b29sPyoKKworQ2Fzc2FuZHJhIHN0cmVzcyBpcyBub3QgYSBzZWN1cmVkIHRvb2wuIFNlcmlhbGl6YXRpb24gYW5kIG90aGVyIGFzcGVjdHMKK29mIHRoZSB0b29sIG9mZmVyIG5vIHNlY3VyaXR5IGd1YXJhbnRlZXMuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvY3Fsc2guYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9jcWxzaC5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjA5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvY3Fsc2guYWRvYwpAQCAtMCwwICsxLDU1NiBAQAorPSBjcWxzaDogdGhlIENRTCBzaGVsbAorCitgY3Fsc2hgIGlzIGEgY29tbWFuZC1saW5lIGludGVyZmFjZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBDYXNzYW5kcmEgdXNpbmcgQ1FMICh0aGUgQ2Fzc2FuZHJhIFF1ZXJ5IExhbmd1YWdlKS4gCitJdCBpcyBzaGlwcGVkIHdpdGggZXZlcnkgQ2Fzc2FuZHJhIHBhY2thZ2UsIGFuZCBjYW4gYmUgZm91bmQgaW4gdGhlIGJpbi8gZGlyZWN0b3J5IGFsb25nc2lkZSB0aGUgY2Fzc2FuZHJhCitleGVjdXRhYmxlLiAKK2BjcWxzaGAgaXMgaW1wbGVtZW50ZWQgd2l0aCB0aGUgUHl0aG9uIG5hdGl2ZSBwcm90b2NvbCBkcml2ZXIsIGFuZCBjb25uZWN0cyB0byB0aGUgc2luZ2xlIHNwZWNpZmllZCBub2RlLgorCis9PSBDb21wYXRpYmlsaXR5CisKK2BjcWxzaGAgaXMgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjcuCisKK0luIGdlbmVyYWwsIGEgZ2l2ZW4gdmVyc2lvbiBvZiBgY3Fsc2hgIGlzIG9ubHkgZ3VhcmFudGVlZCB0byB3b3JrIHdpdGggdGhlCit2ZXJzaW9uIG9mIENhc3NhbmRyYSB0aGF0IGl0IHdhcyByZWxlYXNlZCB3aXRoLiAKK0luIHNvbWUgY2FzZXMsIGBjcWxzaGAgbWF5IHdvcmsgd2l0aCBvbGRlciBvciBuZXdlciB2ZXJzaW9ucyBvZiBDYXNzYW5kcmEsIGJ1dCB0aGlzIGlzIG5vdAorb2ZmaWNpYWxseSBzdXBwb3J0ZWQuCisKKz09IE9wdGlvbmFsIERlcGVuZGVuY2llcworCitgY3Fsc2hgIHNoaXBzIHdpdGggYWxsIGVzc2VudGlhbCBkZXBlbmRlbmNpZXMuIEhvd2V2ZXIsIHRoZXJlIGFyZSBzb21lCitvcHRpb25hbCBkZXBlbmRlbmNpZXMgdGhhdCBjYW4gYmUgaW5zdGFsbGVkIHRvIGltcHJvdmUgdGhlIGNhcGFiaWxpdGllcworb2YgYGNxbHNoYC4KKworPT09IHB5dHoKKworQnkgZGVmYXVsdCwgYGNxbHNoYCBkaXNwbGF5cyBhbGwgdGltZXN0YW1wcyB3aXRoIGEgVVRDIHRpbWV6b25lLiAKK1RvIHN1cHBvcnQgZGlzcGxheSBvZiB0aW1lc3RhbXBzIHdpdGggYW5vdGhlciB0aW1lem9uZSwgaW5zdGFsbAordGhlIGh0dHA6Ly9weXR6LnNvdXJjZWZvcmdlLm5ldC9bcHl0el0gbGlicmFyeS4gCitTZWUgdGhlIGB0aW1lem9uZWAgb3B0aW9uIGluIHhyZWY6Y3FsL3Rvb2xzL2NxbHNoLmFkb2MjY3Fsc2hyY1tjcWxzaHJjXSBmb3Igc3BlY2lmeWluZyBhIHRpbWV6b25lIHRvCit1c2UuCisKKz09PSBjeXRob24KKworVGhlIHBlcmZvcm1hbmNlIG9mIGNxbHNoJ3MgYENPUFlgIG9wZXJhdGlvbnMgY2FuIGJlIGltcHJvdmVkIGJ5CitpbnN0YWxsaW5nIGh0dHA6Ly9jeXRob24ub3JnL1tjeXRob25dLiBUaGlzIHdpbGwgY29tcGlsZSB0aGUgcHl0aG9uCittb2R1bGVzIHRoYXQgYXJlIGNlbnRyYWwgdG8gdGhlIHBlcmZvcm1hbmNlIG9mIGBDT1BZYC4KKworW1tjcWxzaHJjXV0KKz09IGNxbHNocmMKKworVGhlIGBjcWxzaHJjYCBmaWxlIGhvbGRzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgYGNxbHNoYC4gCitCeSBkZWZhdWx0LCB0aGUgZmlsZSBpcyBsb2NhdGVkIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgYXQgYH4vLmNhc3NhbmRyYS9jcWxzaHJjYCwgYnV0IGEKK2N1c3RvbSBsb2NhdGlvbiBjYW4gYmUgc3BlY2lmaWVkIHdpdGggdGhlIGAtLWNxbHNocmNgIG9wdGlvbi4KKworRXhhbXBsZSBjb25maWcgdmFsdWVzIGFuZCBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZCBpbiB0aGUKK2Bjb25mL2NxbHNocmMuc2FtcGxlYCBmaWxlIG9mIGEgdGFyYmFsbCBpbnN0YWxsYXRpb24uIAorWW91IGNhbiBhbHNvIHZpZXcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZQoraHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9jYXNzYW5kcmEvYmxvYi90cnVuay9jb25mL2NxbHNocmMuc2FtcGxlW2NxbHNocmMgZmlsZSBvbmxpbmVdLgorCitbW2NxbF9oaXN0b3J5XV0KKz09IGNxbCBoaXN0b3J5CisKK0FsbCBDUUwgY29tbWFuZHMgeW91IGV4ZWN1dGUgYXJlIHdyaXR0ZW4gdG8gYSBoaXN0b3J5IGZpbGUuIEJ5IGRlZmF1bHQsIENRTCBoaXN0b3J5IHdpbGwgYmUgd3JpdHRlbiB0byBgfi8uY2Fzc2FuZHJhL2NxbF9oaXN0b3J5YC4gWW91IGNhbiBjaGFuZ2UgdGhpcyBkZWZhdWx0IGJ5IHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGBDUUxfSElTVE9SWWAgbGlrZSBgfi9zb21lL290aGVyL3BhdGgvdG8vY3Fsc2hfaGlzdG9yeWAgd2hlcmUgYGNxbHNoX2hpc3RvcnlgIGlzIGEgZmlsZS4gQWxsIHBhcmVudCBkaXJlY3RvcmllcyB0byBoaXN0b3J5IGZpbGUgd2lsbCBiZSBjcmVhdGVkIGlmIHRoZXkgZG8gbm90IGV4aXN0LiBJZiB5b3UgZG8gbm90IHdhbnQgdG8gcGVyc2lzdCBoaXN0b3J5LCB5b3UgY2FuIGRvIHNvIGJ5IHNldHRpbmcgQ1FMX0hJU1RPUlkgdG8gL2Rldi9udWxsLgorVGhpcyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBmcm9tIENhc3NhbmRyYSA0LjEuCisKKz09IENvbW1hbmQgTGluZSBPcHRpb25zCisKK1VzYWdlOiBgY3Fsc2gucHkgW29wdGlvbnNdIFtob3N0IFtwb3J0XV1gCisKK0NRTCBTaGVsbCBmb3IgQXBhY2hlIENhc3NhbmRyYQorCitPcHRpb25zOgorCitgLS12ZXJzaW9uYDo6CisgIHNob3cgcHJvZ3JhbSdzIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0CisKK2AtaGAgYC0taGVscGA6OgorICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CitgLUNgIGAtLWNvbG9yYDo6CisgIEFsd2F5cyB1c2UgY29sb3Igb3V0cHV0CitgLS1uby1jb2xvcmA6OgorICBOZXZlciB1c2UgY29sb3Igb3V0cHV0CitgLS1icm93c2VyPUJST1dTRVJgOjoKKyAgVGhlIGJyb3dzZXIgdG8gdXNlIHRvIGRpc3BsYXkgQ1FMIGhlbHAsIHdoZXJlIEJST1dTRVIgY2FuIGJlOgorICBvbmUgb2YgdGhlIHN1cHBvcnRlZCBicm93c2VycyBpbiBodHRwczovL2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvd2ViYnJvd3Nlci5odG1sLgorICBicm93c2VyIHBhdGggZm9sbG93ZWQgYnkgJXMsIGV4YW1wbGU6IC91c3IvYmluL2dvb2dsZS1jaHJvbWUtc3RhYmxlICVzCitgLS1zc2xgOjoKKyAgVXNlIFNTTAorCitgLXUgVVNFUk5BTUVgIGAtLXVzZXJuYW1lPVVTRVJOQU1FYDo6CisgIEF1dGhlbnRpY2F0ZSBhcyB1c2VyLgorYC1wIFBBU1NXT1JEYCBgLS1wYXNzd29yZD1QQVNTV09SRGA6OgorICBBdXRoZW50aWNhdGUgdXNpbmcgcGFzc3dvcmQuCitgLWsgS0VZU1BBQ0VgIGAtLWtleXNwYWNlPUtFWVNQQUNFYDo6CisgIEF1dGhlbnRpY2F0ZSB0byB0aGUgZ2l2ZW4ga2V5c3BhY2UuCitgLWYgRklMRWAgYC0tZmlsZT1GSUxFYDo6CisgIEV4ZWN1dGUgY29tbWFuZHMgZnJvbSBGSUxFLCB0aGVuIGV4aXQKK2AtLWRlYnVnYDo6CisgIFNob3cgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KK2AtLWNvdmVyYWdlYDo6CisgIENvbGxlY3QgY292ZXJhZ2UgZGF0YQorYC0tZW5jb2Rpbmc9RU5DT0RJTkdgOjoKKyAgU3BlY2lmeSBhIG5vbi1kZWZhdWx0IGVuY29kaW5nIGZvciBvdXRwdXQuIChEZWZhdWx0OiB1dGYtOCkKK2AtLWNxbHNocmM9Q1FMU0hSQ2A6OgorICBTcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGNxbHNocmMgZmlsZSBsb2NhdGlvbi4KK2AtLWNyZWRlbnRpYWxzPUNSRURFTlRJQUxTYDo6CisgIFNwZWNpZnkgYW4gYWx0ZXJuYXRpdmUgY3JlZGVudGlhbHMgZmlsZSBsb2NhdGlvbi4KK2AtLWNxbHZlcnNpb249Q1FMVkVSU0lPTmA6OgorICBTcGVjaWZ5IGEgcGFydGljdWxhciBDUUwgdmVyc2lvbiwgYnkgZGVmYXVsdCB0aGUKKyAgaGlnaGVzdCB2ZXJzaW9uIHN1cHBvcnRlZCBieSB0aGUgc2VydmVyIHdpbGwgYmUgdXNlZC4KKyAgRXhhbXBsZXM6ICIzLjAuMyIsICIzLjEuMCIKK2AtLXByb3RvY29sLXZlcnNpb249UFJPVE9DT0xfVkVSU0lPTmA6OgorICBTcGVjaWZ5IGEgc3BlY2lmaWMgcHJvdGNvbCB2ZXJzaW9uIG90aGVyd2lzZSB0aGUKKyAgY2xpZW50IHdpbGwgZGVmYXVsdCBhbmQgZG93bmdyYWRlIGFzIG5lY2Vzc2FyeQorYC1lIEVYRUNVVEVgIGAtLWV4ZWN1dGU9RVhFQ1VURWA6OgorICBFeGVjdXRlIHRoZSBzdGF0ZW1lbnQgYW5kIHF1aXQuCitgLS1jb25uZWN0LXRpbWVvdXQ9Q09OTkVDVF9USU1FT1VUYDo6CisgIFNwZWNpZnkgdGhlIGNvbm5lY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzIChkZWZhdWx0OiA1IHNlY29uZHMpLgorYC0tcmVxdWVzdC10aW1lb3V0PVJFUVVFU1RfVElNRU9VVGA6OgorICBTcGVjaWZ5IHRoZSBkZWZhdWx0IHJlcXVlc3QgdGltZW91dCBpbiBzZWNvbmRzCisgIChkZWZhdWx0OiAxMCBzZWNvbmRzKS4KK2AtdCwgLS10dHlgOjoKKyAgRm9yY2UgdHR5IG1vZGUgKGNvbW1hbmQgcHJvbXB0KS4KK2AtdmAgYC0tdmA6OgorICBQcmludCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIGNxbHNoLgorCis9PSBTcGVjaWFsIENvbW1hbmRzCisKK0luIGFkZGl0aW9uIHRvIHN1cHBvcnRpbmcgcmVndWxhciBDUUwgc3RhdGVtZW50cywgYGNxbHNoYCBhbHNvIHN1cHBvcnRzIGEKK251bWJlciBvZiBzcGVjaWFsIGNvbW1hbmRzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIENRTC4gVGhlc2UgYXJlIGRldGFpbGVkCitiZWxvdy4KKworPT09IGBDT05TSVNURU5DWWAKKworYFVzYWdlYDogYENPTlNJU1RFTkNZIDxjb25zaXN0ZW5jeSBsZXZlbD5gCisKK1NldHMgdGhlIGNvbnNpc3RlbmN5IGxldmVsIGZvciBvcGVyYXRpb25zIHRvIGZvbGxvdy4gVmFsaWQgYXJndW1lbnRzCitpbmNsdWRlOgorCisqIGBBTllgCisqIGBPTkVgCisqIGBUV09gCisqIGBUSFJFRWAKKyogYFFVT1JVTWAKKyogYEFMTGAKKyogYExPQ0FMX1FVT1JVTWAKKyogYExPQ0FMX09ORWAKKyogYFNFUklBTGAKKyogYExPQ0FMX1NFUklBTGAKKworPT09IGBTRVJJQUwgQ09OU0lTVEVOQ1lgCisKK2BVc2FnZWA6IGBTRVJJQUwgQ09OU0lTVEVOQ1kgPGNvbnNpc3RlbmN5IGxldmVsPmAKKworU2V0cyB0aGUgc2VyaWFsIGNvbnNpc3RlbmN5IGxldmVsIGZvciBvcGVyYXRpb25zIHRvIGZvbGxvdy4gVmFsaWQKK2FyZ3VtZW50cyBpbmNsdWRlOgorCisqIGBTRVJJQUxgCisqIGBMT0NBTF9TRVJJQUxgCisKK1RoZSBzZXJpYWwgY29uc2lzdGVuY3kgbGV2ZWwgaXMgb25seSB1c2VkIGJ5IGNvbmRpdGlvbmFsIHVwZGF0ZXMKKyhgSU5TRVJUYCwgYFVQREFURWAgYW5kIGBERUxFVEVgIHdpdGggYW4gYElGYCBjb25kaXRpb24pLiBGb3IgdGhvc2UsIHRoZQorc2VyaWFsIGNvbnNpc3RlbmN5IGxldmVsIGRlZmluZXMgdGhlIGNvbnNpc3RlbmN5IGxldmVsIG9mIHRoZSBzZXJpYWwKK3BoYXNlIChvciDigJxwYXhvc+KAnSBwaGFzZSkgd2hpbGUgdGhlIG5vcm1hbCBjb25zaXN0ZW5jeSBsZXZlbCBkZWZpbmVzIHRoZQorY29uc2lzdGVuY3kgZm9yIHRoZSDigJxsZWFybuKAnSBwaGFzZSwgaS5lLiB3aGF0IHR5cGUgb2YgcmVhZHMgd2lsbCBiZQorZ3VhcmFudGVlZCB0byBzZWUgdGhlIHVwZGF0ZSByaWdodCBhd2F5LiBGb3IgZXhhbXBsZSwgaWYgYSBjb25kaXRpb25hbAord3JpdGUgaGFzIGEgY29uc2lzdGVuY3kgbGV2ZWwgb2YgYFFVT1JVTWAgKGFuZCBpcyBzdWNjZXNzZnVsKSwgdGhlbiBhCitgUVVPUlVNYCByZWFkIGlzIGd1YXJhbnRlZWQgdG8gc2VlIHRoYXQgd3JpdGUuIEJ1dCBpZiB0aGUgcmVndWxhcgorY29uc2lzdGVuY3kgbGV2ZWwgb2YgdGhhdCB3cml0ZSBpcyBgQU5ZYCwgdGhlbiBvbmx5IGEgcmVhZCB3aXRoIGEKK2NvbnNpc3RlbmN5IGxldmVsIG9mIGBTRVJJQUxgIGlzIGd1YXJhbnRlZWQgdG8gc2VlIGl0IChldmVuIGEgcmVhZCB3aXRoCitjb25zaXN0ZW5jeSBgQUxMYCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBlbm91Z2gpLgorCis9PT0gYFNIT1cgVkVSU0lPTmAKKworUHJpbnRzIHRoZSBgY3Fsc2hgLCBDYXNzYW5kcmEsIENRTCwgYW5kIG5hdGl2ZSBwcm90b2NvbCB2ZXJzaW9ucyBpbiB1c2UuCitFeGFtcGxlOgorCitbc291cmNlLG5vbmVdCistLS0tCitjcWxzaD4gU0hPVyBWRVJTSU9OCitbY3Fsc2ggNS4wLjEgfCBDYXNzYW5kcmEgMy44IHwgQ1FMIHNwZWMgMy40LjIgfCBOYXRpdmUgcHJvdG9jb2wgdjRdCistLS0tCisKKz09PSBgU0hPVyBIT1NUYAorCitQcmludHMgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgb2YgdGhlIENhc3NhbmRyYSBub2RlIHRoYXQgYGNxbHNoYCBpcworY29ubmVjdGVkIHRvIGluIGFkZGl0aW9uIHRvIHRoZSBjbHVzdGVyIG5hbWUuIEV4YW1wbGU6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK2NxbHNoPiBTSE9XIEhPU1QKK0Nvbm5lY3RlZCB0byBQcm9kX0NsdXN0ZXIgYXQgMTkyLjAuMC4xOjkwNDIuCistLS0tCisKKz09PSBgU0hPVyBSRVBMSUNBU2AKKworUHJpbnRzIHRoZSBJUCBhZGRyZXNzZXMgb2YgdGhlIENhc3NhbmRyYSBub2RlcyB3aGljaCBhcmUgcmVwbGljYXMgZm9yIHRoZQorbGlzdGVkIGdpdmVuIHRva2VuIGFuZCBrZXlzcGFjZS4gVGhpcyBjb21tYW5kIGlzIGF2YWlsYWJsZSBmcm9tIENhc3NhbmRyYSA0LjIuCisKK2BVc2FnZWA6IGBTSE9XIFJFUExJQ0FTIDx0b2tlbj4gKDxrZXlzcGFjZT4pYAorCitFeGFtcGxlIHVzYWdlOgorCitbc291cmNlLG5vbmVdCistLS0tCitjcWxzaD4gU0hPVyBSRVBMSUNBUyA5NQorWycxOTIuMC4wLjEnLCAnMTkyLjAuMC4yJ10KKy0tLS0KKworPT09IGBTSE9XIFNFU1NJT05gCisKK1ByZXR0eSBwcmludHMgYSBzcGVjaWZpYyB0cmFjaW5nIHNlc3Npb24uCisKK2BVc2FnZWA6IGBTSE9XIFNFU1NJT04gPHNlc3Npb24gaWQ+YAorCitFeGFtcGxlIHVzYWdlOgorCitbc291cmNlLG5vbmVdCistLS0tCitjcWxzaD4gU0hPVyBTRVNTSU9OIDk1YWM2NDcwLTMyN2UtMTFlNi1iZWNhLWRmYjY2MGQ5MmFkOAorCitUcmFjaW5nIHNlc3Npb246IDk1YWM2NDcwLTMyN2UtMTFlNi1iZWNhLWRmYjY2MGQ5MmFkOAorCisgYWN0aXZpdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGltZXN0YW1wICAgICAgICAgICAgICAgICAgfCBzb3VyY2UgICAgfCBzb3VyY2VfZWxhcHNlZCB8IGNsaWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0ZSBDUUwzIHF1ZXJ5IHwgMjAxNi0wNi0xNCAxNzoyMzoxMy45NzkwMDAgfCAxMjcuMC4wLjEgfCAgICAgICAgICAgICAgMCB8IDEyNy4wLjAuMQorIFBhcnNpbmcgU0VMRUNUICogRlJPTSBzeXN0ZW0ubG9jYWw7IFtTaGFyZWRQb29sLVdvcmtlci0xXSB8IDIwMTYtMDYtMTQgMTc6MjM6MTMuOTgyMDAwIHwgMTI3LjAuMC4xIHwgICAgICAgICAgIDM4NDMgfCAxMjcuMC4wLjEKKy4uLgorLS0tLQorCis9PT0gYFNPVVJDRWAKKworUmVhZHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBhbmQgZXhlY3V0ZXMgZWFjaCBsaW5lIGFzIGEgQ1FMIHN0YXRlbWVudAorb3Igc3BlY2lhbCBjcWxzaCBjb21tYW5kLgorCitgVXNhZ2VgOiBgU09VUkNFIDxzdHJpbmcgZmlsZW5hbWU+YAorCitFeGFtcGxlIHVzYWdlOgorCitbc291cmNlLG5vbmVdCistLS0tCitjcWxzaD4gU09VUkNFICcvaG9tZS9jYWx2aW5ob2Jicy9jb21tYW5kcy5jcWwnCistLS0tCisKKz09PSBgQ0FQVFVSRWAKKworQmVnaW5zIGNhcHR1cmluZyBjb21tYW5kIG91dHB1dCBhbmQgYXBwZW5kaW5nIGl0IHRvIGEgc3BlY2lmaWVkIGZpbGUuCitPdXRwdXQgd2lsbCBub3QgYmUgc2hvd24gYXQgdGhlIGNvbnNvbGUgd2hpbGUgaXQgaXMgY2FwdHVyZWQuCisKK2BVc2FnZWA6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK0NBUFRVUkUgJzxmaWxlPic7CitDQVBUVVJFIE9GRjsKK0NBUFRVUkU7CistLS0tCisKK1RoYXQgaXMsIHRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGJlIGFwcGVuZGVkIHRvIG11c3QgYmUgZ2l2ZW4gaW5zaWRlIGEKK3N0cmluZyBsaXRlcmFsLiBUaGUgcGF0aCBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nCitkaXJlY3RvcnkuIFRoZSB0aWxkZSBzaG9ydGhhbmQgbm90YXRpb24gKGAnfi9teWRpcidgKSBpcyBzdXBwb3J0ZWQgZm9yCityZWZlcnJpbmcgdG8gYCRIT01FYC4KKworT25seSBxdWVyeSByZXN1bHQgb3V0cHV0IGlzIGNhcHR1cmVkLiBFcnJvcnMgYW5kIG91dHB1dCBmcm9tIGNxbHNoLW9ubHkKK2NvbW1hbmRzIHdpbGwgc3RpbGwgYmUgc2hvd24gaW4gdGhlIGNxbHNoIHNlc3Npb24uCisKK1RvIHN0b3AgY2FwdHVyaW5nIG91dHB1dCBhbmQgc2hvdyBpdCBpbiB0aGUgY3Fsc2ggc2Vzc2lvbiBhZ2FpbiwgdXNlCitgQ0FQVFVSRSBPRkZgLgorCitUbyBpbnNwZWN0IHRoZSBjdXJyZW50IGNhcHR1cmUgY29uZmlndXJhdGlvbiwgdXNlIGBDQVBUVVJFYCB3aXRoIG5vCithcmd1bWVudHMuCisKKz09PSBgSEVMUGAKKworR2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgY3Fsc2ggY29tbWFuZHMuIFRvIHNlZSBhdmFpbGFibGUgdG9waWNzLCBlbnRlcgorYEhFTFBgIHdpdGhvdXQgYW55IGFyZ3VtZW50cy4gVG8gc2VlIGhlbHAgb24gYSB0b3BpYywgdXNlCitgSEVMUCA8dG9waWM+YC4gQWxzbyBzZWUgdGhlIGAtLWJyb3dzZXJgIGFyZ3VtZW50IGZvciBjb250cm9sbGluZyB3aGF0Citicm93c2VyIGlzIHVzZWQgdG8gZGlzcGxheSBoZWxwLgorCis9PT0gYEhJU1RPUllgCisKK1ByaW50cyB0byB0aGUgc2NyZWVuIHRoZSBsYXN0IGBuYCBjcWxzaCBjb21tYW5kcyBleGVjdXRlZCBvbiB0aGUgc2VydmVyLgorVGhlIG51bWJlciBvZiBsaW5lcyBkZWZhdWx0cyB0byA1MCBpZiBub3Qgc3BlY2lmaWVkLiBgbmAgaXMgc2V0IGZvcgordGhlIGN1cnJlbnQgQ1FMIHNlc3Npb24gc28gaWYgeW91IHNldCBpdCBlLmcuIHRvIGAxMGAsIGZyb20gdGhhdCBwb2ludAordGhlcmUgd2lsbCBiZSBhdCBtb3N0IDEwIGxhc3QgY29tbWFuZHMgcmV0dXJuZWQgdG8geW91LgorCitgVXNhZ2VgOgorCitbc291cmNlLG5vbmVdCistLS0tCitISVNUT1JZIDxuPgorLS0tLQorCis9PT0gYFRSQUNJTkdgCisKK0VuYWJsZXMgb3IgZGlzYWJsZXMgdHJhY2luZyBmb3IgcXVlcmllcy4gV2hlbiB0cmFjaW5nIGlzIGVuYWJsZWQsIG9uY2UgYQorcXVlcnkgY29tcGxldGVzLCBhIHRyYWNlIG9mIHRoZSBldmVudHMgZHVyaW5nIHRoZSBxdWVyeSB3aWxsIGJlIHByaW50ZWQuCisKK2BVc2FnZWA6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK1RSQUNJTkcgT04KK1RSQUNJTkcgT0ZGCistLS0tCisKKz09PSBgUEFHSU5HYAorCitFbmFibGVzIHBhZ2luZywgZGlzYWJsZXMgcGFnaW5nLCBvciBzZXRzIHRoZSBwYWdlIHNpemUgZm9yIHJlYWQgcXVlcmllcy4KK1doZW4gcGFnaW5nIGlzIGVuYWJsZWQsIG9ubHkgb25lIHBhZ2Ugb2YgZGF0YSB3aWxsIGJlIGZldGNoZWQgYXQgYSB0aW1lCithbmQgYSBwcm9tcHQgd2lsbCBhcHBlYXIgdG8gZmV0Y2ggdGhlIG5leHQgcGFnZS4gR2VuZXJhbGx5LCBpdCdzIGEgZ29vZAoraWRlYSB0byBsZWF2ZSBwYWdpbmcgZW5hYmxlZCBpbiBhbiBpbnRlcmFjdGl2ZSBzZXNzaW9uIHRvIGF2b2lkIGZldGNoaW5nCithbmQgcHJpbnRpbmcgbGFyZ2UgYW1vdW50cyBvZiBkYXRhIGF0IG9uY2UuCisKK2BVc2FnZWA6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK1BBR0lORyBPTgorUEFHSU5HIE9GRgorUEFHSU5HIDxwYWdlIHNpemUgaW4gcm93cz4KKy0tLS0KKworPT09IGBFWFBBTkRgCisKK0VuYWJsZXMgb3IgZGlzYWJsZXMgdmVydGljYWwgcHJpbnRpbmcgb2Ygcm93cy4gRW5hYmxpbmcgYEVYUEFORGAgaXMKK3VzZWZ1bCB3aGVuIG1hbnkgY29sdW1ucyBhcmUgZmV0Y2hlZCwgb3IgdGhlIGNvbnRlbnRzIG9mIGEgc2luZ2xlIGNvbHVtbgorYXJlIGxhcmdlLgorCitgVXNhZ2VgOgorCitbc291cmNlLG5vbmVdCistLS0tCitFWFBBTkQgT04KK0VYUEFORCBPRkYKKy0tLS0KKworPT09IGBMT0dJTmAKKworQXV0aGVudGljYXRlIGFzIGEgc3BlY2lmaWVkIENhc3NhbmRyYSB1c2VyIGZvciB0aGUgY3VycmVudCBzZXNzaW9uLgorCitgVXNhZ2VgOgorCitbc291cmNlLG5vbmVdCistLS0tCitMT0dJTiA8dXNlcm5hbWU+IFs8cGFzc3dvcmQ+XQorLS0tLQorCis9PT0gYEVYSVRgCisKK0VuZHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbmQgdGVybWluYXRlcyB0aGUgY3Fsc2ggcHJvY2Vzcy4KKworYFVzYWdlYDoKKworW3NvdXJjZSxub25lXQorLS0tLQorRVhJVAorUVVJVAorLS0tLQorCis9PT0gYENMRUFSYAorCitDbGVhcnMgdGhlIGNvbnNvbGUuCisKK2BVc2FnZWA6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK0NMRUFSCitDTFMKKy0tLS0KKworPT09IGBERVNDUklCRWAKKworUHJpbnRzIGEgZGVzY3JpcHRpb24gKHR5cGljYWxseSBhIHNlcmllcyBvZiBEREwgc3RhdGVtZW50cykgb2YgYSBzY2hlbWEKK2VsZW1lbnQgb3IgdGhlIGNsdXN0ZXIuIFRoaXMgaXMgdXNlZnVsIGZvciBkdW1waW5nIGFsbCBvciBwb3J0aW9ucyBvZgordGhlIHNjaGVtYS4KKworYFVzYWdlYDoKKworW3NvdXJjZSxub25lXQorLS0tLQorREVTQ1JJQkUgQ0xVU1RFUgorREVTQ1JJQkUgU0NIRU1BCitERVNDUklCRSBLRVlTUEFDRVMKK0RFU0NSSUJFIEtFWVNQQUNFIDxrZXlzcGFjZSBuYW1lPgorREVTQ1JJQkUgVEFCTEVTCitERVNDUklCRSBUQUJMRSA8dGFibGUgbmFtZT4KK0RFU0NSSUJFIElOREVYIDxpbmRleCBuYW1lPgorREVTQ1JJQkUgTUFURVJJQUxJWkVEIFZJRVcgPHZpZXcgbmFtZT4KK0RFU0NSSUJFIFRZUEVTCitERVNDUklCRSBUWVBFIDx0eXBlIG5hbWU+CitERVNDUklCRSBGVU5DVElPTlMKK0RFU0NSSUJFIEZVTkNUSU9OIDxmdW5jdGlvbiBuYW1lPgorREVTQ1JJQkUgQUdHUkVHQVRFUworREVTQ1JJQkUgQUdHUkVHQVRFIDxhZ2dyZWdhdGUgZnVuY3Rpb24gbmFtZT4KKy0tLS0KKworSW4gYW55IG9mIHRoZSBjb21tYW5kcywgYERFU0NgIG1heSBiZSB1c2VkIGluIHBsYWNlIG9mIGBERVNDUklCRWAuCisKK1RoZSBgREVTQ1JJQkUgQ0xVU1RFUmAgY29tbWFuZCBwcmludHMgdGhlIGNsdXN0ZXIgbmFtZSBhbmQgcGFydGl0aW9uZXI6CisKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK2NxbHNoPiBERVNDUklCRSBDTFVTVEVSCisKK0NsdXN0ZXI6IFRlc3QgQ2x1c3RlcgorUGFydGl0aW9uZXI6IE11cm11cjNQYXJ0aXRpb25lcgorLS0tLQorCitUaGUgYERFU0NSSUJFIFNDSEVNQWAgY29tbWFuZCBwcmludHMgdGhlIERETCBzdGF0ZW1lbnRzIG5lZWRlZCB0bworcmVjcmVhdGUgdGhlIGVudGlyZSBzY2hlbWEuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIGR1bXBpbmcgdGhlCitzY2hlbWEgaW4gb3JkZXIgdG8gY2xvbmUgYSBjbHVzdGVyIG9yIHJlc3RvcmUgZnJvbSBhIGJhY2t1cC4KKworPT09IGBDT1BZIFRPYAorCitDb3BpZXMgZGF0YSBmcm9tIGEgdGFibGUgdG8gYSBDU1YgZmlsZS4KKworYFVzYWdlYDoKKworW3NvdXJjZSxub25lXQorLS0tLQorQ09QWSA8dGFibGUgbmFtZT4gWyg8Y29sdW1uPiwgLi4uKV0gVE8gPGZpbGUgbmFtZT4gV0lUSCA8Y29weSBvcHRpb24+IFtBTkQgPGNvcHkgb3B0aW9uPiAuLi5dCistLS0tCisKK0lmIG5vIGNvbHVtbnMgYXJlIHNwZWNpZmllZCwgYWxsIGNvbHVtbnMgZnJvbSB0aGUgdGFibGUgd2lsbCBiZSBjb3BpZWQKK3RvIHRoZSBDU1YgZmlsZS4gQSBzdWJzZXQgb2YgY29sdW1ucyB0byBjb3B5IG1heSBiZSBzcGVjaWZpZWQgYnkgYWRkaW5nCithIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGNvbHVtbiBuYW1lcyBzdXJyb3VuZGVkIGJ5IHBhcmVudGhlc2lzIGFmdGVyCit0aGUgdGFibGUgbmFtZS4KKworVGhlIGA8ZmlsZSBuYW1lPmAgc2hvdWxkIGJlIGEgc3RyaW5nIGxpdGVyYWwgKHdpdGggc2luZ2xlIHF1b3RlcykKK3JlcHJlc2VudGluZyBhIHBhdGggdG8gdGhlIGRlc3RpbmF0aW9uIGZpbGUuIFRoaXMgY2FuIGFsc28gdGhlIHNwZWNpYWwKK3ZhbHVlIGBTVERPVVRgICh3aXRob3V0IHNpbmdsZSBxdW90ZXMpIHRvIHByaW50IHRoZSBDU1YgdG8gc3Rkb3V0LgorCitTZWUgYHNoYXJlZC1jb3B5LW9wdGlvbnNgIGZvciBvcHRpb25zIHRoYXQgYXBwbHkgdG8gYm90aCBgQ09QWSBUT2AgYW5kCitgQ09QWSBGUk9NYC4KKworPT09PSBPcHRpb25zIGZvciBgQ09QWSBUT2AKKworYE1BWFJFUVVFU1RTYDo6CisgIFRoZSBtYXhpbXVtIG51bWJlciB0b2tlbiByYW5nZXMgdG8gZmV0Y2ggc2ltdWx0YW5lb3VzbHkuIERlZmF1bHRzIHRvCisgIDYuCitgUEFHRVNJWkVgOjoKKyAgVGhlIG51bWJlciBvZiByb3dzIHRvIGZldGNoIGluIGEgc2luZ2xlIHBhZ2UuIERlZmF1bHRzIHRvIDEwMDAuCitgUEFHRVRJTUVPVVRgOjoKKyAgQnkgZGVmYXVsdCB0aGUgcGFnZSB0aW1lb3V0IGlzIDEwIHNlY29uZHMgcGVyIDEwMDAgZW50cmllcyBpbiB0aGUgcGFnZQorICBzaXplIG9yIDEwIHNlY29uZHMgaWYgcGFnZXNpemUgaXMgc21hbGxlci4KK2BCRUdJTlRPS0VOYCwgYEVORFRPS0VOYDo6CisgIFRva2VuIHJhbmdlIHRvIGV4cG9ydC4gRGVmYXVsdHMgdG8gZXhwb3J0aW5nIHRoZSBmdWxsIHJpbmcuCitgTUFYT1VUUFVUU0laRWA6OgorICBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBvdXRwdXQgZmlsZSBtZWFzdXJlZCBpbiBudW1iZXIgb2YgbGluZXM7CisgIGJleW9uZCB0aGlzIG1heGltdW0gdGhlIG91dHB1dCBmaWxlIHdpbGwgYmUgc3BsaXQgaW50byBzZWdtZW50cy4gLTEKKyAgbWVhbnMgdW5saW1pdGVkLCBhbmQgaXMgdGhlIGRlZmF1bHQuCitgRU5DT0RJTkdgOjoKKyAgVGhlIGVuY29kaW5nIHVzZWQgZm9yIGNoYXJhY3RlcnMuIERlZmF1bHRzIHRvIGB1dGY4YC4KKworPT09IGBDT1BZIEZST01gCisKK0NvcGllcyBkYXRhIGZyb20gYSBDU1YgZmlsZSB0byB0YWJsZS4KKworYFVzYWdlYDoKKworW3NvdXJjZSxub25lXQorLS0tLQorQ09QWSA8dGFibGUgbmFtZT4gWyg8Y29sdW1uPiwgLi4uKV0gRlJPTSA8ZmlsZSBuYW1lPiBXSVRIIDxjb3B5IG9wdGlvbj4gW0FORCA8Y29weSBvcHRpb24+IC4uLl0KKy0tLS0KKworSWYgbm8gY29sdW1ucyBhcmUgc3BlY2lmaWVkLCBhbGwgY29sdW1ucyBmcm9tIHRoZSBDU1YgZmlsZSB3aWxsIGJlCitjb3BpZWQgdG8gdGhlIHRhYmxlLiBBIHN1YnNldCBvZiBjb2x1bW5zIHRvIGNvcHkgbWF5IGJlIHNwZWNpZmllZCBieQorYWRkaW5nIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY29sdW1uIG5hbWVzIHN1cnJvdW5kZWQgYnkgcGFyZW50aGVzaXMKK2FmdGVyIHRoZSB0YWJsZSBuYW1lLgorCitUaGUgYDxmaWxlIG5hbWU+YCBzaG91bGQgYmUgYSBzdHJpbmcgbGl0ZXJhbCAod2l0aCBzaW5nbGUgcXVvdGVzKQorcmVwcmVzZW50aW5nIGEgcGF0aCB0byB0aGUgc291cmNlIGZpbGUuIFRoaXMgY2FuIGFsc28gdGhlIHNwZWNpYWwgdmFsdWUKK2BTVERJTmAgKHdpdGhvdXQgc2luZ2xlIHF1b3RlcykgdG8gcmVhZCB0aGUgQ1NWIGRhdGEgZnJvbSBzdGRpbi4KKworU2VlIGBzaGFyZWQtY29weS1vcHRpb25zYCBmb3Igb3B0aW9ucyB0aGF0IGFwcGx5IHRvIGJvdGggYENPUFkgVE9gIGFuZAorYENPUFkgRlJPTWAuCisKKz09PT0gT3B0aW9ucyBmb3IgYENPUFkgRlJPTWAKKworYElOR0VTVFJBVEVgOjoKKyAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcHJvY2VzcyBwZXIgc2Vjb25kLiBEZWZhdWx0cyB0byAxMDAwMDAuCitgTUFYUk9XU2A6OgorICBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBpbXBvcnQuIC0xIG1lYW5zIHVubGltaXRlZCwgYW5kIGlzIHRoZQorICBkZWZhdWx0LgorYFNLSVBST1dTYDo6CisgIEEgbnVtYmVyIG9mIGluaXRpYWwgcm93cyB0byBza2lwLiBEZWZhdWx0cyB0byAwLgorYFNLSVBDT0xTYDo6CisgIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY29sdW1uIG5hbWVzIHRvIGlnbm9yZS4gQnkgZGVmYXVsdCwgbm8KKyAgY29sdW1ucyBhcmUgc2tpcHBlZC4KK2BNQVhQQVJTRUVSUk9SU2A6OgorICBUaGUgbWF4aW11bSBnbG9iYWwgbnVtYmVyIG9mIHBhcnNpbmcgZXJyb3JzIHRvIGlnbm9yZS4gLTEgbWVhbnMKKyAgdW5saW1pdGVkLCBhbmQgaXMgdGhlIGRlZmF1bHQuCitgTUFYSU5TRVJURVJST1JTYDo6CisgIFRoZSBtYXhpbXVtIGdsb2JhbCBudW1iZXIgb2YgaW5zZXJ0IGVycm9ycyB0byBpZ25vcmUuIC0xIG1lYW5zCisgIHVubGltaXRlZC4gVGhlIGRlZmF1bHQgaXMgMTAwMC4KK2BFUlJGSUxFYCA9OjoKKyAgQSBmaWxlIHRvIHN0b3JlIGFsbCByb3dzIHRoYXQgY291bGQgbm90IGJlIGltcG9ydGVkLCBieSBkZWZhdWx0IHRoaXMKKyAgaXMgYGltcG9ydF88a3M+Xzx0YWJsZT4uZXJyYCB3aGVyZSBgPGtzPmAgaXMgeW91ciBrZXlzcGFjZSBhbmQKKyAgYDx0YWJsZT5gIGlzIHlvdXIgdGFibGUgbmFtZS4KK2BNQVhCQVRDSFNJWkVgOjoKKyAgVGhlIG1heCBudW1iZXIgb2Ygcm93cyBpbnNlcnRlZCBpbiBhIHNpbmdsZSBiYXRjaC4gRGVmYXVsdHMgdG8gMjAuCitgTUlOQkFUQ0hTSVpFYDo6CisgIFRoZSBtaW4gbnVtYmVyIG9mIHJvd3MgaW5zZXJ0ZWQgaW4gYSBzaW5nbGUgYmF0Y2guIERlZmF1bHRzIHRvIDEwLgorYENIVU5LU0laRWA6OgorICBUaGUgbnVtYmVyIG9mIHJvd3MgdGhhdCBhcmUgcGFzc2VkIHRvIGNoaWxkIHdvcmtlciBwcm9jZXNzZXMgZnJvbSB0aGUKKyAgbWFpbiBwcm9jZXNzIGF0IGEgdGltZS4gRGVmYXVsdHMgdG8gNTAwMC4KKworPT09PSBTaGFyZWQgQ09QWSBPcHRpb25zCisKK09wdGlvbnMgdGhhdCBhcmUgY29tbW9uIHRvIGJvdGggYENPUFkgVE9gIGFuZCBgQ09QWSBGUk9NYC4KKworYE5VTExWQUxgOjoKKyAgVGhlIHN0cmluZyBwbGFjZWhvbGRlciBmb3IgbnVsbCB2YWx1ZXMuIERlZmF1bHRzIHRvIGBudWxsYC4KK2BIRUFERVJgOjoKKyAgRm9yIGBDT1BZIFRPYCwgY29udHJvbHMgd2hldGhlciB0aGUgZmlyc3QgbGluZSBpbiB0aGUgQ1NWIG91dHB1dCBmaWxlCisgIHdpbGwgY29udGFpbiB0aGUgY29sdW1uIG5hbWVzLiBGb3IgQ09QWSBGUk9NLCBzcGVjaWZpZXMgd2hldGhlciB0aGUKKyAgZmlyc3QgbGluZSBpbiB0aGUgQ1NWIGlucHV0IGZpbGUgY29udGFpbnMgY29sdW1uIG5hbWVzLiBEZWZhdWx0cyB0bworICBgZmFsc2VgLgorYERFQ0lNQUxTRVBgOjoKKyAgVGhlIGNoYXJhY3RlciB0aGF0IGlzIHVzZWQgYXMgdGhlIGRlY2ltYWwgcG9pbnQgc2VwYXJhdG9yLiBEZWZhdWx0cyB0bworICBgLmAuCitgVEhPVVNBTkRTU0VQYDo6CisgIFRoZSBjaGFyYWN0ZXIgdGhhdCBpcyB1c2VkIHRvIHNlcGFyYXRlIHRob3VzYW5kcy4gRGVmYXVsdHMgdG8gdGhlCisgIGVtcHR5IHN0cmluZy4KK2BCT09MU1RZbEVgOjoKKyAgVGhlIHN0cmluZyBsaXRlcmFsIGZvcm1hdCBmb3IgYm9vbGVhbiB2YWx1ZXMuIERlZmF1bHRzIHRvCisgIGBUcnVlLEZhbHNlYC4KK2BOVU1QUk9DRVNTRVNgOjoKKyAgVGhlIG51bWJlciBvZiBjaGlsZCB3b3JrZXIgcHJvY2Vzc2VzIHRvIGNyZWF0ZSBmb3IgYENPUFlgIHRhc2tzLgorICBEZWZhdWx0cyB0byAxNiBmb3IgYENPUFlgIHRhc2tzLiBIb3dldmVyLCBhdCBtb3N0IChudW1fY29yZXMgLSAxKQorICBwcm9jZXNzZXMgd2lsbCBiZSBjcmVhdGVkLgorYE1BWEFUVEVNUFRTYDo6CisgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBmYWlsZWQgYXR0ZW1wdHMgdG8gZmV0Y2ggYSByYW5nZSBvZiBkYXRhICh3aGVuCisgIHVzaW5nIGBDT1BZIFRPYCkgb3IgaW5zZXJ0IGEgY2h1bmsgb2YgZGF0YSAod2hlbiB1c2luZyBgQ09QWSBGUk9NYCkKKyAgYmVmb3JlIGdpdmluZyB1cC4gRGVmYXVsdHMgdG8gNS4KK2BSRVBPUlRGUkVRVUVOQ1lgOjoKKyAgSG93IG9mdGVuIHN0YXR1cyB1cGRhdGVzIGFyZSByZWZyZXNoZWQsIGluIHNlY29uZHMuIERlZmF1bHRzIHRvIDAuMjUuCitgUkFURUZJTEVgOjoKKyAgQW4gb3B0aW9uYWwgZmlsZSB0byBvdXRwdXQgcmF0ZSBzdGF0aXN0aWNzIHRvLiBCeSBkZWZhdWx0LCBzdGF0aXN0aWNzCisgIGFyZSBub3Qgb3V0cHV0IHRvIGEgZmlsZS4KKworPT0gRXNjYXBpbmcgUXVvdGVzCisKK0RhdGVzLCBJUCBhZGRyZXNzZXMsIGFuZCBzdHJpbmdzIG5lZWQgdG8gYmUgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3RhdGlvbiBtYXJrcy4gVG8gdXNlIGEgc2luZ2xlIHF1b3RhdGlvbiBtYXJrIGl0c2VsZiBpbiBhIHN0cmluZyBsaXRlcmFsLCBlc2NhcGUgaXQgdXNpbmcgYSBzaW5nbGUgcXVvdGF0aW9uIG1hcmsuCisKK1doZW4gZmV0Y2hpbmcgc2ltcGxlIHRleHQgZGF0YSwgYGNxbHNoYCB3aWxsIHJldHVybiBhbiB1bnF1b3RlZCBzdHJpbmcuIEhvd2V2ZXIsIHdoZW4gZmV0Y2hpbmcgdGV4dCBkYXRhIGZyb20gY29tcGxleCB0eXBlcyAoY29sbGVjdGlvbnMsIHVzZXItZGVmaW5lZCB0eXBlcywgZXRjLikgYGNxbHNoYCB3aWxsIHJldHVybiBhIHF1b3RlZCBzdHJpbmcgY29udGFpbmluZyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXJzLiBGb3IgZXhhbXBsZToKKworU2ltcGxlIGRhdGEKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK2NxbHNoPiBDUkVBVEUgVEFCTEUgdGVzdC5zaW1wbGVfZGF0YSAoaWQgaW50LCBkYXRhIHRleHQsIFBSSU1BUlkgS0VZIChpZCkpOworY3Fsc2g+IElOU0VSVCBJTlRPIHRlc3Quc2ltcGxlX2RhdGEgKGlkLCBkYXRhKSB2YWx1ZXMoMSwgJ0knJ20gZmluZScpOworY3Fsc2g+IFNFTEVDVCBkYXRhIGZyb20gdGVzdC5zaW1wbGVfZGF0YTsgZGF0YQorLS0tLS0tLS0tLQorIEknbSBmaW5lCistLS0tCitDb21wbGV4IGRhdGEKK1tzb3VyY2Usbm9uZV0KKy0tLS0KK2NxbHNoPiBDUkVBVEUgVEFCTEUgdGVzdC5jb21wbGV4X2RhdGEgKGlkIGludCwgZGF0YSBtYXA8aW50LCB0ZXh0PiwgUFJJTUFSWSBLRVkgKGlkKSk7CitjcWxzaD4gSU5TRVJUIElOVE8gdGVzdC5jb21wbGV4X2RhdGEgKGlkLCBkYXRhKSB2YWx1ZXMoMSwgezE6J0knJ20gZmluZSd9KTsKK2NxbHNoPiBTRUxFQ1QgZGF0YSBmcm9tIHRlc3QuY29tcGxleF9kYXRhOyBkYXRhCistLS0tLS0tLS0tLS0tLS0tLS0KKyB7MTogJ0knJ20gZmluZSd9CistLS0tCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvaGFzaF9wYXNzd29yZC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL2hhc2hfcGFzc3dvcmQuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL2hhc2hfcGFzc3dvcmQuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL2hhc2hfcGFzc3dvcmQuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL2luZGV4LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvaW5kZXguYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL2luZGV4LmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9pbmRleC5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9pbmRleC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvaW5kZXguYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzc2MzdjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvaW5kZXguYWRvYwpAQCAtMCwwICsxLDIxIEBACis9IFNTVGFibGUgVG9vbHMKKworVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgdmFyaW91cyBzc3RhYmxlIHRvb2xzLgorCitDYXNzYW5kcmEgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSB0aGVzZSB0b29scyBhcmUgZXhlY3V0ZWQsIG9yIHVuZXhwZWN0ZWQKK3Jlc3VsdHMgd2lsbCBvY2N1ci4gTm90ZTogdGhlIHNjcmlwdHMgZG8gbm90IHZlcmlmeSB0aGF0IENhc3NhbmRyYSBpcworc3RvcHBlZC4KKworKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZWR1bXAuYWRvY1tzc3RhYmxlZHVtcF0KKyogeHJlZjp0b29scy9zc3RhYmxlL3NzdGFibGVleHBpcmVkYmxvY2tlcnMuYWRvY1tzc3RhYmxlZXhwaXJlZGJsb2NrZXJzXQorKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZWxldmVscmVzZXQuYWRvY1tzc3RhYmxlbGV2ZWxyZXNldF0KKyogeHJlZjp0b29scy9zc3RhYmxlL3NzdGFibGVsb2FkZXIuYWRvY1tzc3RhYmxlbG9hZGVyXQorKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZW1ldGFkYXRhLmFkb2Nbc3N0YWJsZW1ldGFkYXRhXQorKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZW9mZmxpbmVyZWxldmVsLmFkb2Nbc3N0YWJsZW9mZmxpbmVyZWxldmVsXQorKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZXBhcnRpdGlvbnMuYWRvY1tzc3RhYmxlcGFydGl0aW9uc10KKyogeHJlZjp0b29scy9zc3RhYmxlL3NzdGFibGVyZXBhaXJlZHNldC5hZG9jW3NzdGFibGVyZXBhaXJkc2V0XQorKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZXNjcnViLmFkb2Nbc3N0YWJsZXNjcnViXQorKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZXNwbGl0LmFkb2Nbc3N0YWJsZXNwbGl0XQorKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZXVwZ3JhZGUuYWRvY1tzc3RhYmxldXBncmFkZV0KKyogeHJlZjp0b29scy9zc3RhYmxlL3NzdGFibGV1dGlsLmFkb2Nbc3N0YWJsZXV0aWxdCisqIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxldmVyaWZ5LmFkb2Nbc3N0YWJsZXZlcmlmeV0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGVkdW1wLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlZHVtcC5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxlZHVtcC5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlZHVtcC5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxlZXhwaXJlZGJsb2NrZXJzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlZXhwaXJlZGJsb2NrZXJzLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGVleHBpcmVkYmxvY2tlcnMuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZWV4cGlyZWRibG9ja2Vycy5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlbGV2ZWxyZXNldC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZWxldmVscmVzZXQuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWJiZjQyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZWxldmVscmVzZXQuYWRvYwpAQCAtMCwwICsxLDY5IEBACis9IHNzdGFibGVsZXZlbHJlc2V0CisKK0lmIExldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3kgaXMgc2V0LCB0aGlzIHNjcmlwdCBjYW4gYmUgdXNlZCB0byByZXNldAorbGV2ZWwgdG8gMCBvbiBhIGdpdmVuIHNldCBvZiBzc3RhYmxlcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8sCitmb3IgZXhhbXBsZSwgY2hhbmdlIHRoZSBtaW5pbXVtIHNzdGFibGUgc2l6ZSwgYW5kIHRoZXJlZm9yZSByZXN0YXJ0IHRoZQorY29tcGFjdGlvbiBwcm9jZXNzIHVzaW5nIHRoaXMgbmV3IGNvbmZpZ3VyYXRpb24uCisKK1NlZQoraHR0cHM6Ly9jYXNzYW5kcmEuYXBhY2hlLm9yZy9kb2MvbGF0ZXN0L29wZXJhdGluZy9jb21wYWN0aW9uL2xjcy5odG1sI2xjcworZm9yIGluZm9ybWF0aW9uIG9uIGhvdyBsZXZlbHMgYXJlIHVzZWQgaW4gdGhpcyBjb21wYWN0aW9uIHN0cmF0ZWd5LgorCitDYXNzYW5kcmEgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSB0aGlzIHRvb2wgaXMgZXhlY3V0ZWQsIG9yIHVuZXhwZWN0ZWQKK3Jlc3VsdHMgd2lsbCBvY2N1ci4gTm90ZTogdGhlIHNjcmlwdCBkb2VzIG5vdCB2ZXJpZnkgdGhhdCBDYXNzYW5kcmEgaXMKK3N0b3BwZWQuCisKK3JlZjogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNTI3MQorCis9PSBVc2FnZQorCitzc3RhYmxlbGV2ZWxyZXNldCAtLXJlYWxseS1yZXNldCA8a2V5c3BhY2U+IDx0YWJsZT4KKworVGhlIHJlYWxseS1yZXNldCBmbGFnIGlzIHJlcXVpcmVkLCB0byBlbnN1cmUgdGhpcyBpbnRydXNpdmUgY29tbWFuZCBpcworbm90IHJ1biBhY2NpZGVudGFsbHkuCisKKz09IFRhYmxlIG5vdCBmb3VuZAorCitJZiB0aGUga2V5c3BhY2UgYW5kL29yIHRhYmxlIGlzIG5vdCBpbiB0aGUgc2NoZW1hIChlLmcuLCBpZiB5b3UKK21pc3NwZWxsZWQgdGhlIHRhYmxlIG5hbWUpLCB0aGUgc2NyaXB0IHdpbGwgcmV0dXJuIGFuIGVycm9yLgorCitFeGFtcGxlOgorCisuLi4uCitDb2x1bW5GYW1pbHkgbm90IGZvdW5kOiBrZXlzcGFjZS9ldmVubG9nLgorLi4uLgorCis9PSBUYWJsZSBoYXMgbm8gc3N0YWJsZXMKKworRXhhbXBsZToKKworLi4uLgorRm91bmQgbm8gc3N0YWJsZXMsIGRpZCB5b3UgZ2l2ZSB0aGUgY29ycmVjdCBrZXlzcGFjZS90YWJsZT8KKy4uLi4KKworPT0gVGFibGUgYWxyZWFkeSBhdCBsZXZlbCAwCisKK1RoZSBzY3JpcHQgd2lsbCBub3Qgc2V0IHRoZSBsZXZlbCBpZiBpdCBpcyBhbHJlYWR5IHNldCB0byAwLgorCitFeGFtcGxlOgorCisuLi4uCitTa2lwcGVkIC92YXIvbGliL2Nhc3NhbmRyYS9kYXRhL2tleXNwYWNlL2V2ZW50bG9nLTY1YzQyOWUwOGM1YTExZTg5MzllZGY0ZjQwMzk3OWVmL21jLTEtYmlnLURhdGEuZGIgc2luY2UgaXQgaXMgYWxyZWFkeSBvbiBsZXZlbCAwCisuLi4uCisKKz09IFRhYmxlIGxldmVscyByZWR1Y2VkIHRvIDAKKworSWYgdGhlIGxldmVsIGlzIG5vdCBhbHJlYWR5IDAsIHRoZW4gdGhpcyB3aWxsIHJlc2V0IGl0IHRvIDAuCisKK0V4YW1wbGU6CisKKy4uLi4KK3NzdGFibGVtZXRhZGF0YSAvdmFyL2xpYi9jYXNzYW5kcmEvZGF0YS9rZXlzcGFjZS9ldmVudGxvZy02MzY1MzMyMDk0ZGQxMWU4OGYzMjRmOWM1MDNlNDc1My9tYy04LWJpZy1EYXRhLmRiIHwgZ3JlcCAtaSBsZXZlbAorU1NUYWJsZSBMZXZlbDogMQorCitzc3RhYmxlbGV2ZWxyZXNldCAtLXJlYWxseS1yZXNldCBrZXlzcGFjZSBldmVudGxvZworQ2hhbmdpbmcgbGV2ZWwgZnJvbSAxIHRvIDAgb24gL3Zhci9saWIvY2Fzc2FuZHJhL2RhdGEva2V5c3BhY2UvZXZlbnRsb2ctNjM2NTMzMjA5NGRkMTFlODhmMzI0ZjljNTAzZTQ3NTMvbWMtOC1iaWctRGF0YS5kYgorCitzc3RhYmxlbWV0YWRhdGEgL3Zhci9saWIvY2Fzc2FuZHJhL2RhdGEva2V5c3BhY2UvZXZlbnRsb2ctNjM2NTMzMjA5NGRkMTFlODhmMzI0ZjljNTAzZTQ3NTMvbWMtOC1iaWctRGF0YS5kYiB8IGdyZXAgLWkgbGV2ZWwKK1NTVGFibGUgTGV2ZWw6IDAKKy4uLi4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGVsb2FkZXIuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGVsb2FkZXIuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZWxvYWRlci5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlbG9hZGVyLmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGVtZXRhZGF0YS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZW1ldGFkYXRhLmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGVtZXRhZGF0YS5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlbWV0YWRhdGEuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZW9mZmxpbmVyZWxldmVsLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlb2ZmbGluZXJlbGV2ZWwuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZW9mZmxpbmVyZWxldmVsLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGVvZmZsaW5lcmVsZXZlbC5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlcGFydGl0aW9ucy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXBhcnRpdGlvbnMuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njg0OTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXBhcnRpdGlvbnMuYWRvYwpAQCAtMCwwICsxLDE3MSBAQAorPSBzc3RhYmxlcGFydGl0aW9ucworCitJZGVudGlmaWVzIGxhcmdlIHBhcnRpdGlvbnMgb2YgU1NUYWJsZXMgYW5kIG91dHB1dHMgdGhlIHBhcnRpdGlvbiBzaXplIGluIGJ5dGVzLCByb3cgY291bnQsIGNlbGwgY291bnQsIGFuZCB0b21ic3RvbmUgY291bnQuCisKK1lvdSBjYW4gc3VwcGx5IGFueSBudW1iZXIgb2Ygc3N0YWJsZXMgZmlsZSBwYXRocywgb3IgZGlyZWN0b3JpZXMgY29udGFpbmluZyBzc3RhYmxlcy4gRWFjaCBzc3RhYmxlIHdpbGwgYmUgYW5hbHl6ZWQgc2VwYXJhdGVseS4KKworSWYgYSBtZXRyaWNzIHRocmVzaG9sZCBzdWNoIGFzIGAtLW1pbi1zaXplYCwgYC0tbWluLXJvd3NgLCBgLS1taW4tY2VsbHNgIG9yIGAtLW1pbi10b21ic3RvbmVzYCBpcyBwcm92aWRlZCwKK3RoZW4gdGhlIHBhcnRpdGlvbiBrZXlzIGV4Y2VlZGluZyBvZiB0aGUgdGhyZXNob2xkIHdpbGwgYmUgcHJpbnRlZCBpbiB0aGUgb3V0cHV0LgorSXQgYWxzbyBwcmludHMgYSBzdW1tYXJ5IG9mIG1ldHJpY3MgZm9yIHRoZSB0YWJsZS4gVGhlIHBlcmNlbnRpbGVzIGluIHRoZSBtZXRyaWNzIGFyZSBlc3RpbWF0ZXMsCit3aGlsZSB0aGUgbWluL21heC9jb3VudCBtZXRyaWNzIGFyZSBhY2N1cmF0ZS4KKworVGhlIGRlZmF1bHQgb3V0cHV0IG9mIHRoaXMgdG9vbCBpcyBtZWFudCB0byBiZSByZWFkIGJ5IGh1bWFuIGV5ZXMuCitGdXR1cmUgdmVyc2lvbnMgbWlnaHQgaW5jbHVkZSBzbWFsbCBmb3JtYXR0aW5nIGNoYW5nZXMgb3IgcHJlc2VudCBuZXcgZGF0YSB0aGF0IGNhbiBmb29sIHNjcmlwdHMgcmVhZGluZyBpdC4KK1NjcmlwdHMgb3Igb3RoZXIgYXV0b21hdGljIHRvb2xzIHNob3VsZCB1c2UgdGhlIGAtLWNzdmAgZmxhZyB0byBwcm9kdWNlIG1hY2hpbmUtcmVhZGFibGUgb3V0cHV0LgorRnV0dXJlIHZlcnNpb25zIHdpbGwgbm90IGNoYW5nZSB0aGUgZm9ybWF0IG9mIHRoZSBDU1Ygb3V0cHV0IGV4Y2VwdCBmb3IgbWF5YmUgYWRkaW5nIG5ldyBjb2x1bW5zLAorc28gYSBwcm9wZXIgQ1NWIHBhcnNlciBjb25zdW1pbmcgdGhlIG91dHB1dCBzaG91bGQga2VlcCB3b3JraW5nLgorCitDYXNzYW5kcmEgZG9lc24ndCBuZWVkIHRvIGJlIHJ1bm5pbmcgYmVmb3JlIHRoaXMgdG9vbCBpcyBleGVjdXRlZC4KKworPT0gVXNhZ2UKKworc3N0YWJsZXBhcnRpdGlvbnMgPG9wdGlvbnM+IDxzc3RhYmxlIGZpbGVzIG9yIGRpcmVjdG9yaWVzPgorCitbY29scz0iLCIsXQorfD09PQorfC10LCAtLW1pbi1zaXplIDxhcmc+ICAgICAgICAgICAgfFBhcnRpdGlvbiBzaXplIHRocmVzaG9sZCwgZXhwcmVzc2VkIGFzIGVpdGhlciB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9yIGEgc2l6ZSB3aXRoIHVuaXQgb2YgdGhlIGZvcm0gMTBLaUIsIDIwTWlCLCAzMEdpQiwgZXRjLgorfC13LCAtLW1pbi1yb3dzIDxhcmc+ICAgICAgICAgICAgfFBhcnRpdGlvbiByb3cgY291bnQgdGhyZXNob2xkLgorfC1jLCAtLW1pbi1jZWxscyA8YXJnPiAgICAgICAgICAgfFBhcnRpdGlvbiBjZWxsIGNvdW50IHRocmVzaG9sZAorfC1vLCAtLW1pbi10b21ic3RvbmVzIDxhcmc+ICAgICAgfFBhcnRpdGlvbiB0b21ic3RvbmUgY291bnQgdGhyZXNob2xkLgorfC1rLCAtLWtleSA8YXJnPiAgICAgICAgICAgICAgICAgfFBhcnRpdGlvbiBrZXlzIHRvIGluY2x1ZGUsIGluc3RlYWQgb2Ygc2Nhbm5pbmcgYWxsIHBhcnRpdGlvbnMuCit8LXgsIC0tZXhjbHVkZS1rZXkgPGFyZz4gICAgICAgICB8UGFydGl0aW9uIGtleXMgdG8gZXhjbHVkZS4KK3wtciwgLS1yZWN1cnNpdmUgICAgICAgICAgICAgICAgIHxTY2FuIGZvciBzc3RhYmxlcyByZWN1cnNpdmVseQorfC1iLCAtLWJhY2t1cHMgICAgICAgICAgICAgICAgICAgfEluY2x1ZGUgYmFja3VwcyBwcmVzZW50IGluIGRhdGEgZGlyZWN0b3JpZXMgd2hlbiBzY2FubmluZyBkaXJlY3RvcmllcworfC1zLCAtLXNuYXBoc290cyAgICAgICAgICAgICAgICAgfEluY2x1ZGUgc25hcHNob3RzIHByZXNlbnQgaW4gZGF0YSBkaXJlY3RvcmllcyB3aGVuIHNjYW5uaW5nIGRpcmVjdG9yaWVzCit8LXUsIC0tY3VycmVudC10aW1lc3RhbXAgPGFyZz4gICB8VGltZXN0YW1wIChzZWNvbmRzIHNpbmNlIGVwb2NoLCB1bml0IHRpbWUpIGZvciBUVEwgZXhwaXJlZCBjYWxjdWxhdGlvbi4KK3wteSwgLS1wYXJ0aXRpb25zLW9ubHkgICAgICAgICAgIHxPbmx5IGJyaWVmIHBhcnRpdGlvbiBpbmZvcm1hdGlvbi4gRXhjbHVkZSBwZXItcGFydGl0aW9uIGRldGFpbGVkIHJvdy9jZWxsL3RvbWJzdG9uZSBpbmZvcm1hdGlvbiBmcm9tIHByb2Nlc3MgYW5kIG91dHB1dC4KK3wtbSwgLS1jc3YgICAgICAgICAgICAgICAgICAgICAgIHxQcm9kdWNlZCBDU1Ygb3V0cHV0IChtYWNoaW5lIHJlYWRhYmxlKQorfD09PQorCis9PSBFeGFtcGxlcworCis9PT0gQW5hbHl6ZSBwYXJ0aXRpb24gc3RhdGlzdGljcyBmb3IgYSBzaW5nbGUgU1NUYWJsZQorCitVc2UgdGhlIHBhdGggdG8gdGhlIFNTVGFibGUgZmlsZSBhcyB0aGUgb25seSBhcmd1bWVudC4KKworRXhhbXBsZToKKworLi4uLgorc3N0YWJsZXBhcnRpdGlvbnMgZGF0YS9kYXRhL2svdC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYi9uYy04LWJpZy1EYXRhLmRiCisKK1Byb2Nlc3Npbmcgay50LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiICM4IChiaWctbmMpICgxLjM2OCBHaUIgdW5jb21wcmVzc2VkLCA1MzQuOTc5IE1pQiBvbiBkaXNrKQorICAgICAgICAgICAgICAgUGFydGl0aW9uIHNpemUgICAgICAgICAgICBSb3cgY291bnQgICAgICAgICAgIENlbGwgY291bnQgICAgICBUb21ic3RvbmUgY291bnQKKyAgfnA1MCAgICAgICAgICAgIDc2Ny41MTkgS2lCICAgICAgICAgICAgICAgICAgNzcwICAgICAgICAgICAgICAgICAxOTE2ICAgICAgICAgICAgICAgICAgICAwCisgIH5wNzUgICAgICAgICAgICAgIDIuMjM4IE1pQiAgICAgICAgICAgICAgICAgMjI5OSAgICAgICAgICAgICAgICAgNTcyMiAgICAgICAgICAgICAgICAgICAgMAorICB+cDkwICAgICAgICAgICAgICAzLjg2NyBNaUIgICAgICAgICAgICAgICAgIDMzMTEgICAgICAgICAgICAgICAgIDk4ODcgICAgICAgICAgICAgICAgICAgNTAKKyAgfnA5NSAgICAgICAgICAgICAxNi42MjkgTWlCICAgICAgICAgICAgICAgIDE0MjM3ICAgICAgICAgICAgICAgIDQyNTEwICAgICAgICAgICAgICAgICAgNDQ2CisgIH5wOTkgICAgICAgICAgICAxNDguMjY3IE1pQiAgICAgICAgICAgICAgIDEyNjkzNCAgICAgICAgICAgICAgIDM3OTAyMiAgICAgICAgICAgICAgICAgMTMzMQorICB+cDk5OSAgICAgICAgICAgMzY4LjkzNiBNaUIgICAgICAgICAgICAgICAzMTU4NTIgICAgICAgICAgICAgICA5NDMxMjcgICAgICAgICAgICAgICAgIDI3NTkKKyAgbWluICAgICAgICAgICAgICA1Ni44NTQgS2lCICAgICAgICAgICAgICAgICAgMTAwICAgICAgICAgICAgICAgICAgMTUwICAgICAgICAgICAgICAgICAgICAwCisgIG1heCAgICAgICAgICAgICAzNTYuMDY3IE1pQiAgICAgICAgICAgICAgIDMxMDcwNiAgICAgICAgICAgICAgIDkzMjExOCAgICAgICAgICAgICAgICAgMjQ1MAorICBjb3VudCAgICAgICAgICAgICAgICAgICAyMTAKKy4uLi4KKworPT09IEFuYWx5emUgcGFydGl0aW9uIHN0YXRpc3RpY3MgZm9yIGFsbCBTU1RhYmxlcyBpbiBhIGRpcmVjdG9yeQorCitVc2UgdGhlIHBhdGggdG8gdGhlIFNTVGFibGVzIGRpcmVjdG9yeSBhcyB0aGUgb25seSBhcmd1bWVudC4KKworRXhhbXBsZToKKworLi4uLgorc3N0YWJsZXBhcnRpdGlvbnMgZGF0YS9kYXRhL2svdC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYgorCitQcm9jZXNzaW5nIGsudC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYiAjOCAoYmlnLW5jKSAoMS4zNjggR2lCIHVuY29tcHJlc3NlZCwgNTM0Ljk3OSBNaUIgb24gZGlzaykKKyAgICAgICAgICAgICAgIFBhcnRpdGlvbiBzaXplICAgICAgICAgICAgUm93IGNvdW50ICAgICAgICAgICBDZWxsIGNvdW50ICAgICAgVG9tYnN0b25lIGNvdW50CisgIH5wNTAgICAgICAgICAgICA3NjcuNTE5IEtpQiAgICAgICAgICAgICAgICAgIDc3MCAgICAgICAgICAgICAgICAgMTkxNiAgICAgICAgICAgICAgICAgICAgMAorICB+cDc1ICAgICAgICAgICAgICAyLjIzOCBNaUIgICAgICAgICAgICAgICAgIDIyOTkgICAgICAgICAgICAgICAgIDU3MjIgICAgICAgICAgICAgICAgICAgIDAKKyAgfnA5MCAgICAgICAgICAgICAgMy44NjcgTWlCICAgICAgICAgICAgICAgICAzMzExICAgICAgICAgICAgICAgICA5ODg3ICAgICAgICAgICAgICAgICAgIDUwCisgIH5wOTUgICAgICAgICAgICAgMTYuNjI5IE1pQiAgICAgICAgICAgICAgICAxNDIzNyAgICAgICAgICAgICAgICA0MjUxMCAgICAgICAgICAgICAgICAgIDQ0NgorICB+cDk5ICAgICAgICAgICAgMTQ4LjI2NyBNaUIgICAgICAgICAgICAgICAxMjY5MzQgICAgICAgICAgICAgICAzNzkwMjIgICAgICAgICAgICAgICAgIDEzMzEKKyAgfnA5OTkgICAgICAgICAgIDM2OC45MzYgTWlCICAgICAgICAgICAgICAgMzE1ODUyICAgICAgICAgICAgICAgOTQzMTI3ICAgICAgICAgICAgICAgICAyNzU5CisgIG1pbiAgICAgICAgICAgICAgNTYuODU0IEtpQiAgICAgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgICAgIDE1MCAgICAgICAgICAgICAgICAgICAgMAorICBtYXggICAgICAgICAgICAgMzU2LjA2NyBNaUIgICAgICAgICAgICAgICAzMTA3MDYgICAgICAgICAgICAgICA5MzIxMTggICAgICAgICAgICAgICAgIDI0NTAKKyAgY291bnQgICAgICAgICAgICAgICAgICAgMjEwCisKK1Byb2Nlc3Npbmcgay50LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiICM5IChiaWctbmMpICg0NTcuNTQwIE1pQiB1bmNvbXByZXNzZWQsIDE3NC44ODAgTWlCIG9uIGRpc2spCisgICAgICAgICAgICAgICBQYXJ0aXRpb24gc2l6ZSAgICAgICAgICAgIFJvdyBjb3VudCAgICAgICAgICAgQ2VsbCBjb3VudCAgICAgIFRvbWJzdG9uZSBjb3VudAorICB+cDUwICAgICAgICAgICAgICAxLjg2NSBNaUIgICAgICAgICAgICAgICAgIDE1OTcgICAgICAgICAgICAgICAgIDQ3NjggICAgICAgICAgICAgICAgICAgIDAKKyAgfnA3NSAgICAgICAgICAgICAxMy44NTggTWlCICAgICAgICAgICAgICAgIDE0MjM3ICAgICAgICAgICAgICAgIDQyNTEwICAgICAgICAgICAgICAgICAgICAwCisgIH5wOTAgICAgICAgICAgICAgMjguNzM1IE1pQiAgICAgICAgICAgICAgICAyOTUyMSAgICAgICAgICAgICAgICA3MzQ1NyAgICAgICAgICAgICAgICAgICA1MAorICB+cDk1ICAgICAgICAgICAgIDM0LjQ4MiBNaUIgICAgICAgICAgICAgICAgMjk1MjEgICAgICAgICAgICAgICAgODgxNDggICAgICAgICAgICAgICAgIDgyMzkKKyAgfnA5OSAgICAgICAgICAgICA0OS42NTQgTWlCICAgICAgICAgICAgICAgIDQyNTEwICAgICAgICAgICAgICAgMTI2OTM0ICAgICAgICAgICAgICAgIDE0MjM3CisgIH5wOTk5ICAgICAgICAgICAgNDkuNjU0IE1pQiAgICAgICAgICAgICAgICA0MjUxMCAgICAgICAgICAgICAgIDEyNjkzNCAgICAgICAgICAgICAgICAxNDIzNworICBtaW4gICAgICAgICAgICAgIDQ3LjI3MiBLaUIgICAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgICAgICAgICAxNTAgICAgICAgICAgICAgICAgICAgIDAKKyAgbWF4ICAgICAgICAgICAgICA0NS4xMzMgTWlCICAgICAgICAgICAgICAgIDM5NDI5ICAgICAgICAgICAgICAgMTE4Mjg3ICAgICAgICAgICAgICAgIDEzMDMwCisgIGNvdW50ICAgICAgICAgICAgICAgICAgICA1NworLi4uLgorCis9PT0gT3V0cHV0IG9ubHkgcGFydGl0aW9ucyBvdmVyIDEwME1pQiBpbiBzaXplCisKK1VzZSB0aGUgYC0tbWluLXNpemVgIG9wdGlvbiB0byBzcGVjaWZ5IHRoZSBtaW5pbXVtIHNpemUgYSBwYXJ0aXRpb24gbXVzdCBoYXZlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCisKK0V4YW1wbGU6CisKKy4uLi4KK3NzdGFibGVwYXJ0aXRpb25zIGRhdGEvZGF0YS9rL3QtZDdiZTVlOTBlOTAxMTFlZDhiNTRlZmUzYzM5Y2IwYmIvbmMtOC1iaWctRGF0YS5kYiAtLW1pbi1zaXplIDEwME1pQgorCitQcm9jZXNzaW5nIGsudC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYiAjOCAoYmlnLW5jKSAoMS4zNjggR2lCIHVuY29tcHJlc3NlZCwgNTM0Ljk3OSBNaUIgb24gZGlzaykKKyAgUGFydGl0aW9uOiAnMTMnICgwMDAwMDAwZCkgbGl2ZSwgc2l6ZTogMTA1LjA1NiBNaUIsIHJvd3M6IDkxNDkwLCBjZWxsczogMjc0NDcwLCB0b21ic3RvbmVzOiA1MCAocm93OjUwLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApCisgIFBhcnRpdGlvbjogJzEnICgwMDAwMDAwMSkgbGl2ZSwgc2l6ZTogMTI3LjI0MSBNaUIsIHJvd3M6IDExMTA2NSwgY2VsbHM6IDMzMzE5NSwgdG9tYnN0b25lczogNTAgKHJvdzo1MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKQorICBQYXJ0aXRpb246ICc4JyAoMDAwMDAwMDgpIGxpdmUsIHNpemU6IDM1Ni4wNjcgTWlCLCByb3dzOiAzMTA3MDYsIGNlbGxzOiA5MzIxMTgsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApCisgIFBhcnRpdGlvbjogJzInICgwMDAwMDAwMikgbGl2ZSwgc2l6ZTogMjEzLjM0MSBNaUIsIHJvd3M6IDE4NjU4MiwgY2VsbHM6IDU1OTEyNSwgdG9tYnN0b25lczogOTc4IChyb3c6OTc4LCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApCitTdW1tYXJ5IG9mIGsudC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYiAjOCAoYmlnLW5jKToKKyAgRmlsZTogL1VzZXJzL2FkZWxhcGVuYS9zcmMvY2Fzc2FuZHJhL3RydW5rL2RhdGEvZGF0YS9rL3QtZDdiZTVlOTBlOTAxMTFlZDhiNTRlZmUzYzM5Y2IwYmIvbmMtOC1iaWctRGF0YS5kYgorICA0IHBhcnRpdGlvbnMgbWF0Y2gKKyAgS2V5czogMTMgMSA4IDIKKyAgICAgICAgICAgICAgIFBhcnRpdGlvbiBzaXplICAgICAgICAgICAgUm93IGNvdW50ICAgICAgICAgICBDZWxsIGNvdW50ICAgICAgVG9tYnN0b25lIGNvdW50CisgIH5wNTAgICAgICAgICAgICA3NjcuNTE5IEtpQiAgICAgICAgICAgICAgICAgIDc3MCAgICAgICAgICAgICAgICAgMTkxNiAgICAgICAgICAgICAgICAgICAgMAorICB+cDc1ICAgICAgICAgICAgICAyLjIzOCBNaUIgICAgICAgICAgICAgICAgIDIyOTkgICAgICAgICAgICAgICAgIDU3MjIgICAgICAgICAgICAgICAgICAgIDAKKyAgfnA5MCAgICAgICAgICAgICAgMy44NjcgTWlCICAgICAgICAgICAgICAgICAzMzExICAgICAgICAgICAgICAgICA5ODg3ICAgICAgICAgICAgICAgICAgIDUwCisgIH5wOTUgICAgICAgICAgICAgMTYuNjI5IE1pQiAgICAgICAgICAgICAgICAxNDIzNyAgICAgICAgICAgICAgICA0MjUxMCAgICAgICAgICAgICAgICAgIDQ0NgorICB+cDk5ICAgICAgICAgICAgMTQ4LjI2NyBNaUIgICAgICAgICAgICAgICAxMjY5MzQgICAgICAgICAgICAgICAzNzkwMjIgICAgICAgICAgICAgICAgIDEzMzEKKyAgfnA5OTkgICAgICAgICAgIDM2OC45MzYgTWlCICAgICAgICAgICAgICAgMzE1ODUyICAgICAgICAgICAgICAgOTQzMTI3ICAgICAgICAgICAgICAgICAyNzU5CisgIG1pbiAgICAgICAgICAgICAgNTYuODU0IEtpQiAgICAgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgICAgIDE1MCAgICAgICAgICAgICAgICAgICAgMAorICBtYXggICAgICAgICAgICAgMzU2LjA2NyBNaUIgICAgICAgICAgICAgICAzMTA3MDYgICAgICAgICAgICAgICA5MzIxMTggICAgICAgICAgICAgICAgIDI0NTAKKyAgY291bnQgICAgICAgICAgICAgICAgICAgMjEwCisuLi4uCisKKz09PSBPdXRwdXQgb25seSBwYXJ0aXRpb25zIHdpdGggbW9yZSB0aGFuIDEwMDAgdG9tYnN0b25lcworCitVc2UgdGhlIGAtLW1pbi10b21ic3RvbmVzYCBvcHRpb24gdG8gc3BlY2lmeSB0aGUgbWluaW11bSBudW1iZXIgb2YgdG9tYnN0b25lcyBhIHBhcnRpdGlvbiBtdXN0IGhhdmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KKworRXhhbXBsZToKKworLi4uLgorc3N0YWJsZXBhcnRpdGlvbnMgZGF0YS9kYXRhL2svdC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYi9uYy04LWJpZy1EYXRhLmRiIC0tbWluLXRvbWJzdG9uZXMgMTAwMAorCitQcm9jZXNzaW5nIGsudC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYiAjOCAoYmlnLW5jKSAoMS4zNjggR2lCIHVuY29tcHJlc3NlZCwgNTM0Ljk3OSBNaUIgb24gZGlzaykKKyAgUGFydGl0aW9uOiAnNTUnICgwMDAwMDAzNykgbGl2ZSwgc2l6ZTogMS4yOTAgTWlCLCByb3dzOiAyMzE3LCBjZWxsczogMzQ3NCwgdG9tYnN0b25lczogMTE1OSAocm93OjExNTksIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MCkKKyAgUGFydGl0aW9uOiAnMjgnICgwMDAwMDAxYykgbGl2ZSwgc2l6ZTogMS4xOTggTWlCLCByb3dzOiAyMDk5LCBjZWxsczogMzE0NywgdG9tYnN0b25lczogMTA1MCAocm93OjEwNTAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MCkKKyAgUGFydGl0aW9uOiAnODknICgwMDAwMDA1OSkgbGl2ZSwgc2l6ZTogMS4zNDYgTWlCLCByb3dzOiAyMjI2LCBjZWxsczogMzMzOSwgdG9tYnN0b25lczogMTExMyAocm93OjExMTMsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MCkKKyAgUGFydGl0aW9uOiAnMjEnICgwMDAwMDAxNSkgbGl2ZSwgc2l6ZTogMy44NTMgTWlCLCByb3dzOiA0OTAwLCBjZWxsczogOTkyNywgdG9tYnN0b25lczogMjQ1MCAocm93OjI0NTAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MCkKK1N1bW1hcnkgb2Ygay50LWQ3YmU1ZTkwZTkwMTExZWQ4YjU0ZWZlM2MzOWNiMGJiICM4IChiaWctbmMpOgorICBGaWxlOiAvVXNlcnMvYWRlbGFwZW5hL3NyYy9jYXNzYW5kcmEvdHJ1bmsvZGF0YS9kYXRhL2svdC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYi9uYy04LWJpZy1EYXRhLmRiCisgIDQgcGFydGl0aW9ucyBtYXRjaAorICBLZXlzOiA1NSAyOCA4OSAyMQorICAgICAgICAgICAgICAgUGFydGl0aW9uIHNpemUgICAgICAgICAgICBSb3cgY291bnQgICAgICAgICAgIENlbGwgY291bnQgICAgICBUb21ic3RvbmUgY291bnQKKyAgfnA1MCAgICAgICAgICAgIDc2Ny41MTkgS2lCICAgICAgICAgICAgICAgICAgNzcwICAgICAgICAgICAgICAgICAxOTE2ICAgICAgICAgICAgICAgICAgICAwCisgIH5wNzUgICAgICAgICAgICAgIDIuMjM4IE1pQiAgICAgICAgICAgICAgICAgMjI5OSAgICAgICAgICAgICAgICAgNTcyMiAgICAgICAgICAgICAgICAgICAgMAorICB+cDkwICAgICAgICAgICAgICAzLjg2NyBNaUIgICAgICAgICAgICAgICAgIDMzMTEgICAgICAgICAgICAgICAgIDk4ODcgICAgICAgICAgICAgICAgICAgNTAKKyAgfnA5NSAgICAgICAgICAgICAxNi42MjkgTWlCICAgICAgICAgICAgICAgIDE0MjM3ICAgICAgICAgICAgICAgIDQyNTEwICAgICAgICAgICAgICAgICAgNDQ2CisgIH5wOTkgICAgICAgICAgICAxNDguMjY3IE1pQiAgICAgICAgICAgICAgIDEyNjkzNCAgICAgICAgICAgICAgIDM3OTAyMiAgICAgICAgICAgICAgICAgMTMzMQorICB+cDk5OSAgICAgICAgICAgMzY4LjkzNiBNaUIgICAgICAgICAgICAgICAzMTU4NTIgICAgICAgICAgICAgICA5NDMxMjcgICAgICAgICAgICAgICAgIDI3NTkKKyAgbWluICAgICAgICAgICAgICA1Ni44NTQgS2lCICAgICAgICAgICAgICAgICAgMTAwICAgICAgICAgICAgICAgICAgMTUwICAgICAgICAgICAgICAgICAgICAwCisgIG1heCAgICAgICAgICAgICAzNTYuMDY3IE1pQiAgICAgICAgICAgICAgIDMxMDcwNiAgICAgICAgICAgICAgIDkzMjExOCAgICAgICAgICAgICAgICAgMjQ1MAorICBjb3VudCAgICAgICAgICAgICAgICAgICAyMTAKKy4uLi4KKworPT09IE91dHB1dCBDU1YgbWFjaGluZS1yZWFkYWJsZSBvdXRwdXQKKworVXNlIHRoZSBgLS1jc3ZgIG9wdGlvbiB0byBvdXRwdXQgYSBDU1YgbWFjaGluZS1yZWFkYWJsZSBvdXRwdXQsIGNvbWJpbmVkIHdpdGggYW55IHRocmVzaG9sZCB2YWx1ZS4KKworRXhhbXBsZToKKworLi4uLgorc3N0YWJsZXBhcnRpdGlvbnMgZGF0YS9kYXRhL2svdC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYi9uYy04LWJpZy1EYXRhLmRiIC0tbWluLXNpemUgMTAwTWlCIC0tY3N2CitrZXksa2V5QmluYXJ5LGxpdmUsb2Zmc2V0LHNpemUscm93Q291bnQsY2VsbENvdW50LHRvbWJzdG9uZUNvdW50LHJvd1RvbWJzdG9uZUNvdW50LHJhbmdlVG9tYnN0b25lQ291bnQsY29tcGxleFRvbWJzdG9uZUNvdW50LGNlbGxUb21ic3RvbmVDb3VudCxyb3dUdGxFeHBpcmVkLGNlbGxUdGxFeHBpcmVkLGRpcmVjdG9yeSxrZXlzcGFjZSx0YWJsZSxpbmRleCxzbmFwc2hvdCxiYWNrdXAsZ2VuZXJhdGlvbixmb3JtYXQsdmVyc2lvbgorIjEzIiwwMDAwMDAwZCx0cnVlLDE4NjQwMzU0MywxMTAxNTg5NjUsOTE0OTAsMjc0NDcwLDUwLDUwLDAsMCwwLDAsMCwvVXNlcnMvYWRlbGFwZW5hL3NyYy9jYXNzYW5kcmEvdHJ1bmsvZGF0YS9kYXRhL2svdC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYi9uYy04LWJpZy1EYXRhLmRiLGssdCwsLCw4LGJpZyxuYworIjEiLDAwMDAwMDAxLHRydWUsMzI1MTQxNTQyLDEzMzQyMjE4MywxMTEwNjUsMzMzMTk1LDUwLDUwLDAsMCwwLDAsMCwvVXNlcnMvYWRlbGFwZW5hL3NyYy9jYXNzYW5kcmEvdHJ1bmsvZGF0YS9kYXRhL2svdC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYi9uYy04LWJpZy1EYXRhLmRiLGssdCwsLCw4LGJpZyxuYworIjgiLDAwMDAwMDA4LHRydWUsNDc3MTMzNzUyLDM3MzM2MjgxOSwzMTA3MDYsOTMyMTE4LDAsMCwwLDAsMCwwLDAsL1VzZXJzL2FkZWxhcGVuYS9zcmMvY2Fzc2FuZHJhL3RydW5rL2RhdGEvZGF0YS9rL3QtZDdiZTVlOTBlOTAxMTFlZDhiNTRlZmUzYzM5Y2IwYmIvbmMtOC1iaWctRGF0YS5kYixrLHQsLCwsOCxiaWcsbmMKKyIyIiwwMDAwMDAwMix0cnVlLDg1MTg0MTM2MywyMjM3MDQxOTIsMTg2NTgyLDU1OTEyNSw5NzgsOTc4LDAsMCwwLDAsMCwvVXNlcnMvYWRlbGFwZW5hL3NyYy9jYXNzYW5kcmEvdHJ1bmsvZGF0YS9kYXRhL2svdC1kN2JlNWU5MGU5MDExMWVkOGI1NGVmZTNjMzljYjBiYi9uYy04LWJpZy1EYXRhLmRiLGssdCwsLCw4LGJpZyxuYworLi4uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGVyZXBhaXJlZHNldC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXJlcGFpcmVkc2V0LmFkb2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGVyZXBhaXJlZHNldC5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlcmVwYWlyZWRzZXQuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXNjcnViLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxlc2NydWIuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXNjcnViLmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGVzY3J1Yi5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxlc3BsaXQuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGVzcGxpdC5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxlc3BsaXQuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXNwbGl0LmFkb2MKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGV1cGdyYWRlLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxldXBncmFkZS5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxldXBncmFkZS5hZG9jCnJlbmFtZSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbWFuYWdpbmcvdG9vbHMvc3N0YWJsZS9zc3RhYmxldXBncmFkZS5hZG9jCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxldXRpbC5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXV0aWwuYWRvYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXV0aWwuYWRvYwpyZW5hbWUgdG8gZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXV0aWwuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXZlcmlmeS5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3Rvb2xzL3NzdGFibGUvc3N0YWJsZXZlcmlmeS5hZG9jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9zc3RhYmxldmVyaWZ5LmFkb2MKcmVuYW1lIHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy90b29scy9zc3RhYmxlL3NzdGFibGV2ZXJpZnkuYWRvYwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL21hbmFnaW5nL3ZpcnR1YWx0YWJsZXMuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy92aXJ0dWFsdGFibGVzLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyNjJjMQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9tYW5hZ2luZy92aXJ0dWFsdGFibGVzLmFkb2MKQEAgLTAsMCArMSw1MTcgQEAKKz0gVmlydHVhbCBUYWJsZXMKKworQXBhY2hlIENhc3NhbmRyYSA0LjAgaW1wbGVtZW50cyB2aXJ0dWFsIHRhYmxlcyAoaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNzYyMltDQVNTQU5EUkEtNzYyMl0pLgorVmlydHVhbCB0YWJsZXMgYXJlIHRhYmxlcyBiYWNrZWQgYnkgYW4gQVBJIGluc3RlYWQgb2YgZGF0YSBleHBsaWNpdGx5IG1hbmFnZWQgYW5kIHN0b3JlZCBhcyBTU1RhYmxlcy4gCitBcGFjaGUgQ2Fzc2FuZHJhIDQuMCBpbXBsZW1lbnRzIGEgdmlydHVhbCBrZXlzcGFjZSBpbnRlcmZhY2UgZm9yIHZpcnR1YWwgdGFibGVzLiAKK1ZpcnR1YWwgdGFibGVzIGFyZSBzcGVjaWZpYyB0byBlYWNoIG5vZGUuCisKK1NvbWUgb2YgdGhlIGZlYXR1cmVzIG9mIHZpcnR1YWwgdGFibGVzIGFyZSB0aGUgYWJpbGl0eSB0bzoKKworKiBleHBvc2UgbWV0cmljcyB0aHJvdWdoIENRTAorKiBleHBvc2UgWUFNTCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCisKK1ZpcnR1YWwga2V5c3BhY2VzIGFuZCB0YWJsZXMgYXJlIHF1aXRlIGRpZmZlcmVudCBmcm9tIHJlZ3VsYXIgdGFibGVzIGFuZCBrZXlzcGFjZXM6CisKKyogVmlydHVhbCB0YWJsZXMgYXJlIGNyZWF0ZWQgaW4gc3BlY2lhbCBrZXlzcGFjZXMgYW5kIG5vdCBqdXN0IGFueSBrZXlzcGFjZS4KKyogVmlydHVhbCB0YWJsZXMgYXJlIG1hbmFnZWQgYnkgQ2Fzc2FuZHJhLiBVc2VycyBjYW5ub3QgcnVuIERETCB0byBjcmVhdGUgbmV3IHZpcnR1YWwgdGFibGVzIG9yIERNTCB0byBtb2RpZnkgZXhpc3RpbmcgdmlydHVhbCB0YWJsZXMuCisqIFZpcnR1YWwgdGFibGVzIGFyZSBjdXJyZW50bHkgcmVhZC1vbmx5LCBhbHRob3VnaCB0aGF0IG1heSBjaGFuZ2UgaW4gYSBsYXRlciB2ZXJzaW9uLgorKiBWaXJ0dWFsIHRhYmxlcyBhcmUgbG9jYWwgb25seSwgbm9uLWRpc3RyaWJ1dGVkLCBhbmQgdGh1cyBub3QgcmVwbGljYXRlZC4KKyogVmlydHVhbCB0YWJsZXMgaGF2ZSBubyBhc3NvY2lhdGVkIFNTVGFibGVzLgorKiBDb25zaXN0ZW5jeSBsZXZlbCBvZiB0aGUgcXVlcmllcyBzZW50IHRvIHZpcnR1YWwgdGFibGVzIGFyZSBpZ25vcmVkLgorKiBBbGwgZXhpc3RpbmcgdmlydHVhbCB0YWJsZXMgdXNlIGBMb2NhbFBhcnRpdGlvbmVyYC4gCitTaW5jZSBhIHZpcnR1YWwgdGFibGUgaXMgbm90IHJlcGxpY2F0ZWQgdGhlIHBhcnRpdGlvbmVyIHNvcnRzIGluIG9yZGVyIG9mIHBhcnRpdGlvbiBrZXlzIGluc3RlYWQgb2YgYnkgdGhlaXIgaGFzaC4KKyogTWFraW5nIGFkdmFuY2VkIHF1ZXJpZXMgdXNpbmcgYEFMTE9XIEZJTFRFUklOR2AgYW5kIGFnZ3JlZ2F0aW9uIGZ1bmN0aW9ucyBjYW4gYmUgZXhlY3V0ZWQgaW4gdmlydHVhbCB0YWJsZXMsIGV2ZW4gdGhvdWdoIGluIG5vcm1hbCB0YWJsZXMgd2UgZG9udCByZWNvbW1lbmQgaXQuCisKKz09IFZpcnR1YWwgS2V5c3BhY2VzCisKK0FwYWNoZSBDYXNzYW5kcmEgNC4wIGhhcyBhZGRlZCB0d28gbmV3IGtleXNwYWNlcyBmb3IgdmlydHVhbCB0YWJsZXM6CisKKyogYHN5c3RlbV92aXJ0dWFsX3NjaGVtYWAgCisqIGBzeXN0ZW1fdmlld3NgLiAKKworVGhlIGBzeXN0ZW1fdmlydHVhbF9zY2hlbWFgIGtleXNwYWNlIGhhcyB0aHJlZSB0YWJsZXM6IGBrZXlzcGFjZXNgLAorYGNvbHVtbnNgIGFuZCBgdGFibGVzYCBmb3IgdGhlIHZpcnR1YWwga2V5c3BhY2UsIHRhYmxlLCBhbmQgY29sdW1uIGRlZmluaXRpb25zLCByZXNwZWN0aXZlbHkuCitUaGVzZSB0YWJsZXMgY29udGFpbiBzY2hlbWEgaW5mb3JtYXRpb24gZm9yIHRoZSB2aXJ0dWFsIHRhYmxlcy4KK0l0IGlzIHVzZWQgYnkgQ2Fzc2FuZHJhIGludGVybmFsbHkgYW5kIGEgdXNlciBzaG91bGQgbm90IGFjY2VzcyBpdCBkaXJlY3RseS4KKworVGhlIGBzeXN0ZW1fdmlld3NgIGtleXNwYWNlIGNvbnRhaW5zIHRoZSBhY3R1YWwgdmlydHVhbCB0YWJsZXMuCisKKz09IFZpcnR1YWwgVGFibGUgTGltaXRhdGlvbnMKKworQmVmb3JlIGRpc2NjdXNpbmcgdmlydHVhbCBrZXlzcGFjZXMgYW5kIHRhYmxlcywgbm90ZSB0aGF0IHZpcnR1YWwga2V5c3BhY2VzIGFuZCB0YWJsZXMgaGF2ZSBzb21lIGxpbWl0YXRpb25zLiAKK1RoZXNlIGxpbWl0YXRpb25zIGFyZSBzdWJqZWN0IHRvIGNoYW5nZS4KK1ZpcnR1YWwga2V5c3BhY2VzIGNhbm5vdCBiZSBhbHRlcmVkIG9yIGRyb3BwZWQuIAorSW4gZmFjdCwgbm8gb3BlcmF0aW9ucyBjYW4gYmUgcGVyZm9ybWVkIGFnYWluc3QgdmlydHVhbCBrZXlzcGFjZXMuCisKK1ZpcnR1YWwgdGFibGVzIGNhbm5vdCBiZSBjcmVhdGVkIGluIHZpcnR1YWwga2V5c3BhY2VzLgorVmlydHVhbCB0YWJsZXMgY2Fubm90IGJlIGFsdGVyZWQsIGRyb3BwZWQsIG9yIHRydW5jYXRlZC4KK1NlY29uZGFyeSBpbmRleGVzLCB0eXBlcywgZnVuY3Rpb25zLCBhZ2dyZWdhdGVzLCBtYXRlcmlhbGl6ZWQgdmlld3MsIGFuZCB0cmlnZ2VycyBjYW5ub3QgYmUgY3JlYXRlZCBmb3IgdmlydHVhbCB0YWJsZXMuCitFeHBpcmluZyB0aW1lLXRvLWxpdmUgKFRUTCkgY29sdW1ucyBjYW5ub3QgYmUgY3JlYXRlZC4KK1ZpcnR1YWwgdGFibGVzIGRvIG5vdCBzdXBwb3J0IGNvbmRpdGlvbmFsIHVwZGF0ZXMgb3IgZGVsZXRlcy4KK0FnZ3JlZ2F0ZXMgbWF5IGJlIHJ1biBpbiBTRUxFQ1Qgc3RhdGVtZW50cy4KKworQ29uZGl0aW9uYWwgYmF0Y2ggc3RhdGVtZW50cyBjYW5ub3QgaW5jbHVkZSBtdXRhdGlvbnMgZm9yIHZpcnR1YWwgdGFibGVzLCBub3IgY2FuIGEgdmlydHVhbCB0YWJsZSBzdGF0ZW1lbnQgYmUgaW5jbHVkZWQgaW4gYSBsb2dnZWQgYmF0Y2guCitJbiBmYWN0LCBtdXRhdGlvbnMgZm9yIHZpcnR1YWwgYW5kIHJlZ3VsYXIgdGFibGVzIGNhbm5vdCBvY2N1ciBpbiB0aGUgc2FtZSBiYXRjaCB0YWJsZS4KKworPT0gVmlydHVhbCBUYWJsZXMKKworRWFjaCBvZiB0aGUgdmlydHVhbCB0YWJsZXMgaW4gdGhlIGBzeXN0ZW1fdmlld3NgIHZpcnR1YWwga2V5c3BhY2UgY29udGFpbiBkaWZmZXJlbnQgaW5mb3JtYXRpb24uCisKK1RoZSBmb2xsb3dpbmcgdGFibGUgZGVzY3JpYmVzIHRoZSB2aXJ0dWFsIHRhYmxlczogCisKK1t3aWR0aD0iOTglIixjb2xzPSIyNyUsNzMlIixdCit8PT09Cit8VmlydHVhbCBUYWJsZSB8RGVzY3JpcHRpb24KKworfGNhY2hlcyB8RGlzcGxheXMgdGhlIGdlbmVyYWwgY2FjaGUgaW5mb3JtYXRpb24gaW5jbHVkaW5nIGNhY2hlIG5hbWUsIGNhcGFjaXR5X2J5dGVzLCBlbnRyeV9jb3VudCwgaGl0X2NvdW50LCBoaXRfcmF0aW8gZG91YmxlLAorcmVjZW50X2hpdF9yYXRlX3Blcl9zZWNvbmQsIHJlY2VudF9yZXF1ZXN0X3JhdGVfcGVyX3NlY29uZCwgcmVxdWVzdF9jb3VudCwgYW5kIHNpemVfYnl0ZXMuCisKK3xjbGllbnRzIHxMaXN0cyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgY29ubmVjdGVkIGNsaWVudHMuCisKK3xjb29yZGluYXRvcl9yZWFkX2xhdGVuY3kgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGNvb3JkaW5hdG9yIHJlYWRzLgorCit8Y29vcmRpbmF0b3Jfc2NhbiB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgY29vcmRpbmF0b3Igc2NhbnMuCisKK3xjb29yZGluYXRvcl93cml0ZV9sYXRlbmN5IHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBjb29yZGluYXRvciB3cml0ZXMuCisKK3xjcWxfbWV0cmljcyB8TWV0cmljcyBzcGVjaWZpYyB0byBDUUwgcHJlcGFyZWQgc3RhdGVtZW50IGNhY2hpbmcuCisKK3xkaXNrX3VzYWdlIHxSZWNvcmRzIGRpc2sgdXNhZ2UgaW5jbHVkaW5nIGRpc2tfc3BhY2UsIGtleXNwYWNlX25hbWUsIGFuZCB0YWJsZV9uYW1lLCBzb3J0ZWQgYnkgc3lzdGVtIGtleXNwYWNlcy4KKworfGdvc3NpcF9pbmZvIHxMaXN0cyB0aGUgZ29zc2lwIGluZm9ybWF0aW9uIGZvciB0aGUgY2x1c3Rlci4KKworfGludGVybm9kZV9pbmJvdW5kIHxMaXN0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5ib3VuZCBpbnRlcm5vZGUgbWVzc2FnaW5nLgorCit8aW50ZXJub2RlX291dGJvdW5kIHxJbmZvcm1hdGlvbiBhYm91dCB0aGUgb3V0Ym91bmQgaW50ZXJub2RlIG1lc3NhZ2luZy4KKworfGxvY2FsX3JlYWRfbGF0ZW5jeSB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgbG9jYWwgcmVhZHMuCisKK3xsb2NhbF9zY2FuIHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBsb2NhbCBzY2Fucy4KKworfGxvY2FsX3dyaXRlX2xhdGVuY3kgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGxvY2FsIHdyaXRlcy4KKworfG1heF9wYXJ0aXRpb25fc2l6ZSB8QSB0YWJsZSBtZXRyaWMgZm9yIG1heGltdW0gcGFydGl0aW9uIHNpemUuCisKK3xyb3dzX3Blcl9yZWFkIHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVrX25hbWUsIG1heCwgYW5kIG1lZGlhbiBmb3Igcm93cyByZWFkLgorCit8c2V0dGluZ3MgfERpc3BsYXlzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgaW4gY2Fzc2FuZHJhLnlhbWwuCisKK3xzc3RhYmxlX3Rhc2tzIHxMaXN0cyBjdXJyZW50bHkgcnVubmluZyB0YXNrcyBhbmQgcHJvZ3Jlc3Mgb24gU1NUYWJsZXMsIGZvciBvcGVyYXRpb25zIGxpa2UgY29tcGFjdGlvbiBhbmQgdXBncmFkZS4KKworfHN5c3RlbV9wcm9wZXJ0aWVzIHxEaXNwbGF5cyBlbnZpcm9ubWVudGFsIHN5c3RlbSBwcm9wZXJ0aWVzIHNldCBvbiB0aGUgbm9kZS4KKworfHRocmVhZF9wb29scyB8TGlzdHMgbWV0cmljcyBmb3IgZWFjaCB0aHJlYWQgcG9vbC4KKworfHRvbWJzdG9uZXNfcGVyX3JlYWQgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZWtfbmFtZSwgbWF4LCBhbmQgbWVkaWFuIGZvciB0b21ic3RvbmVzLgorCit8PT09CisKK1dlIHNoYWxsIGRpc2N1c3Mgc29tZSBvZiB0aGUgdmlydHVhbCB0YWJsZXMgaW4gbW9yZSBkZXRhaWwgbmV4dC4KKworPT09IENsaWVudHMgVmlydHVhbCBUYWJsZQorCitUaGUgYGNsaWVudHNgIHZpcnR1YWwgdGFibGUgbGlzdHMgYWxsIGFjdGl2ZSBjb25uZWN0aW9ucyAoY29ubmVjdGVkCitjbGllbnRzKSBpbmNsdWRpbmcgdGhlaXIgaXAgYWRkcmVzcywgcG9ydCwgY2xpZW50X29wdGlvbnMsIGNvbm5lY3Rpb24gc3RhZ2UsIGRyaXZlcgorbmFtZSwgZHJpdmVyIHZlcnNpb24sIGhvc3RuYW1lLCBwcm90b2NvbCB2ZXJzaW9uLCByZXF1ZXN0IGNvdW50LCBzc2wKK2VuYWJsZWQsIHNzbCBwcm90b2NvbCBhbmQgdXNlciBuYW1lOgorCisuLi4uCitjcWxzaD4gRVhQQU5EIE9OIDsKK05vdyBFeHBhbmRlZCBvdXRwdXQgaXMgZW5hYmxlZAorY3Fsc2g+IFNFTEVDVCAqIEZST00gc3lzdGVtX3ZpZXdzLmNsaWVudHM7CisKK0AgUm93IDEKKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIGFkZHJlc3MgICAgICAgICAgfCAxMjcuMC4wLjEKKyBwb3J0ICAgICAgICAgICAgIHwgNTA2ODcKKyBjbGllbnRfb3B0aW9ucyAgIHwgeydDUUxfVkVSU0lPTic6ICczLjQuNycsICdEUklWRVJfTkFNRSc6ICdEYXRhU3RheCBQeXRob24gRHJpdmVyJywgJ0RSSVZFUl9WRVJTSU9OJzogJzMuMjUuMCd9CisgY29ubmVjdGlvbl9zdGFnZSB8IHJlYWR5CisgZHJpdmVyX25hbWUgICAgICB8IERhdGFTdGF4IFB5dGhvbiBEcml2ZXIKKyBkcml2ZXJfdmVyc2lvbiAgIHwgMy4yNS4wCisgaG9zdG5hbWUgICAgICAgICB8IGxvY2FsaG9zdAorIHByb3RvY29sX3ZlcnNpb24gfCA1CisgcmVxdWVzdF9jb3VudCAgICB8IDE2Cisgc3NsX2NpcGhlcl9zdWl0ZSB8IG51bGwKKyBzc2xfZW5hYmxlZCAgICAgIHwgRmFsc2UKKyBzc2xfcHJvdG9jb2wgICAgIHwgbnVsbAorIHVzZXJuYW1lICAgICAgICAgfCBhbm9ueW1vdXMKKworQCBSb3cgMgorLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgYWRkcmVzcyAgICAgICAgICB8IDEyNy4wLjAuMQorIHBvcnQgICAgICAgICAgICAgfCA1MDY4OAorIGNsaWVudF9vcHRpb25zICAgfCB7J0NRTF9WRVJTSU9OJzogJzMuNC43JywgJ0RSSVZFUl9OQU1FJzogJ0RhdGFTdGF4IFB5dGhvbiBEcml2ZXInLCAnRFJJVkVSX1ZFUlNJT04nOiAnMy4yNS4wJ30KKyBjb25uZWN0aW9uX3N0YWdlIHwgcmVhZHkKKyBkcml2ZXJfbmFtZSAgICAgIHwgRGF0YVN0YXggUHl0aG9uIERyaXZlcgorIGRyaXZlcl92ZXJzaW9uICAgfCAzLjI1LjAKKyBob3N0bmFtZSAgICAgICAgIHwgbG9jYWxob3N0CisgcHJvdG9jb2xfdmVyc2lvbiB8IDUKKyByZXF1ZXN0X2NvdW50ICAgIHwgNAorIHNzbF9jaXBoZXJfc3VpdGUgfCBudWxsCisgc3NsX2VuYWJsZWQgICAgICB8IEZhbHNlCisgc3NsX3Byb3RvY29sICAgICB8IG51bGwKKyB1c2VybmFtZSAgICAgICAgIHwgYW5vbnltb3VzCisKK0AgUm93IDMKKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIGFkZHJlc3MgICAgICAgICAgfCAxMjcuMC4wLjEKKyBwb3J0ICAgICAgICAgICAgIHwgNTA3NTMKKyBjbGllbnRfb3B0aW9ucyAgIHwgeydBUFBMSUNBVElPTl9OQU1FJzogJ1Rlc3RBcHAnLCAnQVBQTElDQVRJT05fVkVSU0lPTic6ICcxLjAuMCcsICdDTElFTlRfSUQnOiAnNTViM2VmYmQtYzU2Yi00NjlkLThjY2EtMDE2Yjg2MGIyZjAzJywgJ0NRTF9WRVJTSU9OJzogJzMuMC4wJywgJ0RSSVZFUl9OQU1FJzogJ0RhdGFTdGF4IEphdmEgZHJpdmVyIGZvciBBcGFjaGUgQ2Fzc2FuZHJhKFIpJywgJ0RSSVZFUl9WRVJTSU9OJzogJzQuMTMuMCd9CisgY29ubmVjdGlvbl9zdGFnZSB8IHJlYWR5CisgZHJpdmVyX25hbWUgICAgICB8IERhdGFTdGF4IEphdmEgZHJpdmVyIGZvciBBcGFjaGUgQ2Fzc2FuZHJhKFIpCisgZHJpdmVyX3ZlcnNpb24gICB8IDQuMTMuMAorIGhvc3RuYW1lICAgICAgICAgfCBsb2NhbGhvc3QKKyBwcm90b2NvbF92ZXJzaW9uIHwgNQorIHJlcXVlc3RfY291bnQgICAgfCAxOAorIHNzbF9jaXBoZXJfc3VpdGUgfCBudWxsCisgc3NsX2VuYWJsZWQgICAgICB8IEZhbHNlCisgc3NsX3Byb3RvY29sICAgICB8IG51bGwKKyB1c2VybmFtZSAgICAgICAgIHwgYW5vbnltb3VzCisKK0AgUm93IDQKKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIGFkZHJlc3MgICAgICAgICAgfCAxMjcuMC4wLjEKKyBwb3J0ICAgICAgICAgICAgIHwgNTA3NTUKKyBjbGllbnRfb3B0aW9ucyAgIHwgeydBUFBMSUNBVElPTl9OQU1FJzogJ1Rlc3RBcHAnLCAnQVBQTElDQVRJT05fVkVSU0lPTic6ICcxLjAuMCcsICdDTElFTlRfSUQnOiAnNTViM2VmYmQtYzU2Yi00NjlkLThjY2EtMDE2Yjg2MGIyZjAzJywgJ0NRTF9WRVJTSU9OJzogJzMuMC4wJywgJ0RSSVZFUl9OQU1FJzogJ0RhdGFTdGF4IEphdmEgZHJpdmVyIGZvciBBcGFjaGUgQ2Fzc2FuZHJhKFIpJywgJ0RSSVZFUl9WRVJTSU9OJzogJzQuMTMuMCd9CisgY29ubmVjdGlvbl9zdGFnZSB8IHJlYWR5CisgZHJpdmVyX25hbWUgICAgICB8IERhdGFTdGF4IEphdmEgZHJpdmVyIGZvciBBcGFjaGUgQ2Fzc2FuZHJhKFIpCisgZHJpdmVyX3ZlcnNpb24gICB8IDQuMTMuMAorIGhvc3RuYW1lICAgICAgICAgfCBsb2NhbGhvc3QKKyBwcm90b2NvbF92ZXJzaW9uIHwgNQorIHJlcXVlc3RfY291bnQgICAgfCA3Cisgc3NsX2NpcGhlcl9zdWl0ZSB8IG51bGwKKyBzc2xfZW5hYmxlZCAgICAgIHwgRmFsc2UKKyBzc2xfcHJvdG9jb2wgICAgIHwgbnVsbAorIHVzZXJuYW1lICAgICAgICAgfCBhbm9ueW1vdXMKKworKDQgcm93cykKKy4uLi4KKworU29tZSBleGFtcGxlcyBvZiBob3cgYGNsaWVudHNgIGNhbiBiZSB1c2VkIGFyZToKKworKiBUbyBmaW5kIGFwcGxpY2F0aW9ucyB1c2luZyBvbGQgaW5jb21wYXRpYmxlIHZlcnNpb25zIG9mIGRyaXZlcnMgYmVmb3JlCit1cGdyYWRpbmcgYW5kIHdpdGggYG5vZGV0b29sIGVuYWJsZW9sZHByb3RvY29sdmVyc2lvbnNgIGFuZAorYG5vZGV0b29sIGRpc2FibGVvbGRwcm90b2NvbHZlcnNpb25zYCBkdXJpbmcgdXBncmFkZXMuCisqIFRvIGlkZW50aWZ5IGNsaWVudHMgc2VuZGluZyB0b28gbWFueSByZXF1ZXN0cy4KKyogVG8gZmluZCBpZiBTU0wgaXMgZW5hYmxlZCBkdXJpbmcgdGhlIG1pZ3JhdGlvbiB0byBhbmQgZnJvbSBzc2wuCisqIFRvIGlkZW50aWZ5IGFsbCBvcHRpb25zIHRoZSBjbGllbnQgaXMgc2VuZGluZywgZS5nLiBBUFBMSUNBVElPTl9OQU1FIGFuZCBBUFBMSUNBVElPTl9WRVJTSU9OCisKK1RoZSB2aXJ0dWFsIHRhYmxlcyBtYXkgYmUgZGVzY3JpYmVkIHdpdGggYERFU0NSSUJFYCBzdGF0ZW1lbnQuIFRoZSBEREwKK2xpc3RlZCBob3dldmVyIGNhbm5vdCBiZSBydW4gdG8gY3JlYXRlIGEgdmlydHVhbCB0YWJsZS4gQXMgYW4gZXhhbXBsZQorZGVzY3JpYmUgdGhlIGBzeXN0ZW1fdmlld3MuY2xpZW50c2AgdmlydHVhbCB0YWJsZToKKworLi4uLgorY3Fsc2g+IERFU0NSSUJFIFRBQkxFIHN5c3RlbV92aWV3cy5jbGllbnRzOworCisvKgorV2FybmluZzogVGFibGUgc3lzdGVtX3ZpZXdzLmNsaWVudHMgaXMgYSB2aXJ0dWFsIHRhYmxlIGFuZCBjYW5ub3QgYmUgcmVjcmVhdGVkIHdpdGggQ1FMLgorU3RydWN0dXJlLCBmb3IgcmVmZXJlbmNlOgorVklSVFVBTCBUQUJMRSBzeXN0ZW1fdmlld3MuY2xpZW50cyAoCisgICAgYWRkcmVzcyBpbmV0LAorICAgIHBvcnQgaW50LAorICAgIGNsaWVudF9vcHRpb25zIGZyb3plbjxtYXA8dGV4dCwgdGV4dD4+LAorICAgIGNvbm5lY3Rpb25fc3RhZ2UgdGV4dCwKKyAgICBkcml2ZXJfbmFtZSB0ZXh0LAorICAgIGRyaXZlcl92ZXJzaW9uIHRleHQsCisgICAgaG9zdG5hbWUgdGV4dCwKKyAgICBwcm90b2NvbF92ZXJzaW9uIGludCwKKyAgICByZXF1ZXN0X2NvdW50IGJpZ2ludCwKKyAgICBzc2xfY2lwaGVyX3N1aXRlIHRleHQsCisgICAgc3NsX2VuYWJsZWQgYm9vbGVhbiwKKyAgICBzc2xfcHJvdG9jb2wgdGV4dCwKKyAgICB1c2VybmFtZSB0ZXh0LAorICAgIFBSSU1BUlkgS0VZIChhZGRyZXNzLCBwb3J0KQorKSBXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKHBvcnQgQVNDKQorICAgIEFORCBjb21tZW50ID0gJ2N1cnJlbnRseSBjb25uZWN0ZWQgY2xpZW50cyc7CisqLworLi4uLgorCis9PT0gQ2FjaGVzIFZpcnR1YWwgVGFibGUKKworVGhlIGBjYWNoZXNgIHZpcnR1YWwgdGFibGUgbGlzdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhY2hlcy4gVGhlIGZvdXIKK2NhY2hlcyBwcmVzZW50bHkgY3JlYXRlZCBhcmUgY2h1bmtzLCBjb3VudGVycywga2V5cyBhbmQgcm93cy4gQSBxdWVyeSBvbgordGhlIGBjYWNoZXNgIHZpcnR1YWwgdGFibGUgcmV0dXJucyB0aGUgZm9sbG93aW5nIGRldGFpbHM6CisKKy4uLi4KK2NxbHNoOnN5c3RlbV92aWV3cz4gU0VMRUNUICogRlJPTSBzeXN0ZW1fdmlld3MuY2FjaGVzOworbmFtZSAgICAgfCBjYXBhY2l0eV9ieXRlcyB8IGVudHJ5X2NvdW50IHwgaGl0X2NvdW50IHwgaGl0X3JhdGlvIHwgcmVjZW50X2hpdF9yYXRlX3Blcl9zZWNvbmQgfCByZWNlbnRfcmVxdWVzdF9yYXRlX3Blcl9zZWNvbmQgfCByZXF1ZXN0X2NvdW50IHwgc2l6ZV9ieXRlcworLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0KKyAgY2h1bmtzIHwgICAgICAyMjk2MzgxNDQgfCAgICAgICAgICAyOSB8ICAgICAgIDE2NiB8ICAgICAgMC44MyB8ICAgICAgICAgICAgICAgICAgICAgICAgICA1IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2IHwgICAgICAgICAgIDIwMCB8ICAgICA0NzUxMzYKK2NvdW50ZXJzIHwgICAgICAgMjYyMTQ0MDAgfCAgICAgICAgICAgMCB8ICAgICAgICAgMCB8ICAgICAgIE5hTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgIDAKKyAgICBrZXlzIHwgICAgICAgNTI0Mjg4MDAgfCAgICAgICAgICAxNCB8ICAgICAgIDEyNCB8ICAwLjg3MzIzOSB8ICAgICAgICAgICAgICAgICAgICAgICAgICA0IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IHwgICAgICAgICAgIDE0MiB8ICAgICAgIDEyNDgKKyAgICByb3dzIHwgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgMCB8ICAgICAgICAgMCB8ICAgICAgIE5hTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgIDAKKworKDQgcm93cykKKy4uLi4KKworPT09IENRTCBtZXRyaWNzIFZpcnR1YWwgVGFibGUKK1RoZSBgY3FsX21ldHJpY3NgIHZpcnR1YWwgdGFibGUgbGlzdHMgbWV0cmljcyBzcGVjaWZpYyB0byBDUUwgcHJlcGFyZWQgc3RhdGVtZW50IGNhY2hpbmcuIEEgcXVlcnkgb24gYGNxbF9tZXRyaWNzYCB2aXJ0dWFsIHRhYmxlIGxpc3RzIGJlbG93IG1ldHJpY3MuCisKKy4uLi4KK2NxbHNoPiBzZWxlY3QgKiBmcm9tIHN5c3RlbV92aWV3cy5jcWxfbWV0cmljcyA7CisKKyBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tCisgICAgcHJlcGFyZWRfc3RhdGVtZW50c19jb3VudCB8ICAgICAwCisgIHByZXBhcmVkX3N0YXRlbWVudHNfZXZpY3RlZCB8ICAgICAwCisgcHJlcGFyZWRfc3RhdGVtZW50c19leGVjdXRlZCB8ICAgICAwCisgICAgcHJlcGFyZWRfc3RhdGVtZW50c19yYXRpbyB8ICAgICAwCisgIHJlZ3VsYXJfc3RhdGVtZW50c19leGVjdXRlZCB8ICAgIDE3CisuLi4uCisKKz09PSBTZXR0aW5ncyBWaXJ0dWFsIFRhYmxlCisKK1RoZSBgc2V0dGluZ3NgIHRhYmxlIGlzIHJhdGhlciB1c2VmdWwgYW5kIGxpc3RzIGFsbCB0aGUgY3VycmVudAorY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmcm9tIHRoZSBgY2Fzc2FuZHJhLnlhbWxgLiBUaGUgZW5jcnlwdGlvbiBvcHRpb25zCithcmUgb3ZlcnJpZGRlbiB0byBoaWRlIHRoZSBzZW5zaXRpdmUgdHJ1c3RzdG9yZSBpbmZvcm1hdGlvbiBvcgorcGFzc3dvcmRzLiBUaGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBob3dldmVyIGNhbm5vdCBiZSBzZXQgdXNpbmcgRE1MIG9uCit0aGUgdmlydHVhbCB0YWJsZSBwcmVzZW50bHk6IDoKKworLi4uLgorY3Fsc2g6c3lzdGVtX3ZpZXdzPiBTRUxFQ1QgKiBGUk9NIHN5c3RlbV92aWV3cy5zZXR0aW5nczsKKworbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdmFsdWUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYWxsb2NhdGVfdG9rZW5zX2Zvcl9rZXlzcGFjZSAgICAgICB8IG51bGwKKyAgYXVkaXRfbG9nZ2luZ19vcHRpb25zX2VuYWJsZWQgICAgICB8IGZhbHNlCisgIGF1dG9fc25hcHNob3QgICAgICAgICAgICAgICAgICAgICAgfCB0cnVlCisgIGF1dG9tYXRpY19zc3RhYmxlX3VwZ3JhZGUgICAgICAgICAgfCBmYWxzZQorICBjbHVzdGVyX25hbWUgICAgICAgICAgICAgICAgICAgICAgIHwgVGVzdCBDbHVzdGVyCisgIHRyYW5zaWVudF9yZXBsaWNhdGlvbl9lbmFibGVkICAgICAgfCBmYWxzZQorICBoaW50ZWRfaGFuZG9mZl9lbmFibGVkICAgICAgICAgICAgIHwgdHJ1ZQorICBoaW50c19kaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgIHwgL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2RhdGEvaGludHMKKyAgaW5jcmVtZW50YWxfYmFja3VwcyAgICAgICAgICAgICAgICB8IGZhbHNlCisgIGluaXRpYWxfdG9rZW4gICAgICAgICAgICAgICAgICAgICAgfCBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCisgIHJwY19hZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgfCBsb2NhbGhvc3QKKyAgc3NsX3N0b3JhZ2VfcG9ydCAgICAgICAgICAgICAgICAgICB8IDcwMDEKKyAgc3RhcnRfbmF0aXZlX3RyYW5zcG9ydCAgICAgICAgICAgICB8IHRydWUKKyAgc3RvcmFnZV9wb3J0ICAgICAgICAgICAgICAgICAgICAgICB8IDcwMDAKKyAgc3RyZWFtX2VudGlyZV9zc3RhYmxlcyAgICAgICAgICAgICB8IHRydWUKKyAgKDIyNCByb3dzKQorLi4uLgorCitUaGUgYHNldHRpbmdzYCB0YWJsZSBjYW4gYmUgcmVhbGx5IHVzZWZ1bCBpZiB5YW1sIGZpbGUgaGFzIGJlZW4gY2hhbmdlZAorc2luY2Ugc3RhcnR1cCBhbmQgZG9udCBrbm93IHJ1bm5pbmcgY29uZmlndXJhdGlvbiwgb3IgdG8gZmluZCBpZiB0aGV5CitoYXZlIGJlZW4gbW9kaWZpZWQgdmlhIGpteC9ub2RldG9vbCBvciB2aXJ0dWFsIHRhYmxlcy4KKworPT09IFRocmVhZCBQb29scyBWaXJ0dWFsIFRhYmxlCisKK1RoZSBgdGhyZWFkX3Bvb2xzYCB0YWJsZSBsaXN0cyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgdGhyZWFkIHBvb2xzLgorVGhyZWFkIHBvb2wgaW5mb3JtYXRpb24gaW5jbHVkZXMgYWN0aXZlIHRhc2tzLCBhY3RpdmUgdGFza3MgbGltaXQsCitibG9ja2VkIHRhc2tzLCBibG9ja2VkIHRhc2tzIGFsbCB0aW1lLCBjb21wbGV0ZWQgdGFza3MsIGFuZCBwZW5kaW5nCit0YXNrcy4gQSBxdWVyeSBvbiB0aGUgYHRocmVhZF9wb29sc2AgcmV0dXJucyBmb2xsb3dpbmcgZGV0YWlsczoKKworLi4uLgorY3Fsc2g6c3lzdGVtX3ZpZXdzPiBzZWxlY3QgKiBmcm9tIHN5c3RlbV92aWV3cy50aHJlYWRfcG9vbHM7CisKK25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgfCBhY3RpdmVfdGFza3MgfCBhY3RpdmVfdGFza3NfbGltaXQgfCBibG9ja2VkX3Rhc2tzIHwgYmxvY2tlZF90YXNrc19hbGxfdGltZSB8IGNvbXBsZXRlZF90YXNrcyB8IHBlbmRpbmdfdGFza3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgQW50aUVudHJvcHlTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICBDYWNoZUNsZWFudXBFeGVjdXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgIENvbXBhY3Rpb25FeGVjdXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgODgxIHwgICAgICAgICAgICAgMAorICAgICAgICBDb3VudGVyTXV0YXRpb25TdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAzMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICBHb3NzaXBTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgIEhpbnRzRGlzcGF0Y2hlciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgIEludGVybmFsUmVzcG9uc2VTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgTWVtdGFibGVGbHVzaFdyaXRlciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMAorICAgICAgICAgICBNZW10YWJsZVBvc3RGbHVzaCB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMAorICAgICAgIE1lbXRhYmxlUmVjbGFpbU1lbW9yeSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgICBNaWdyYXRpb25TdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICAgIE1pc2NTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgTXV0YXRpb25TdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAzMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgTmF0aXZlLVRyYW5zcG9ydC1SZXF1ZXN0cyB8ICAgICAgICAgICAgMSB8ICAgICAgICAgICAgICAgIDEyOCB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMTMwIHwgICAgICAgICAgICAgMAorICAgICAgUGVuZGluZ1JhbmdlQ2FsY3VsYXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMAorUGVyRGlza01lbXRhYmxlRmx1c2hXcml0ZXJfMCB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICAgIFJlYWRTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAzMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgIDEzIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICBSZXBhaXItVGFzayB8ICAgICAgICAgICAgMCB8ICAgICAgICAgMjE0NzQ4MzY0NyB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICBSZXF1ZXN0UmVzcG9uc2VTdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICAgICAgU2FtcGxlciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgIFNlY29uZGFyeUluZGV4TWFuYWdlbWVudCB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgIFZhbGlkYXRpb25FeGVjdXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgMjE0NzQ4MzY0NyB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgICBWaWV3QnVpbGRFeGVjdXRvciB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorICAgICAgICAgICBWaWV3TXV0YXRpb25TdGFnZSB8ICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAzMiB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMAorLi4uLgorCisoMjQgcm93cykKKworPT09IEludGVybm9kZSBJbmJvdW5kIE1lc3NhZ2luZyBWaXJ0dWFsIFRhYmxlCisKK1RoZSBgaW50ZXJub2RlX2luYm91bmRgIHZpcnR1YWwgdGFibGUgaXMgZm9yIHRoZSBpbnRlcm5vZGUgaW5ib3VuZAorbWVzc2FnaW5nLiBJbml0aWFsbHkgbm8gaW50ZXJub2RlIGluYm91bmQgbWVzc2FnaW5nIG1heSBnZXQgbGlzdGVkLiBJbgorYWRkaXRpb24gdG8gdGhlIGFkZHJlc3MsIHBvcnQsIGRhdGFjZW50ZXIgYW5kIHJhY2sgaW5mb3JtYXRpb24gaW5jbHVkZXMKK2NvcnJ1cHQgZnJhbWVzIHJlY292ZXJlZCwgY29ycnVwdCBmcmFtZXMgdW5yZWNvdmVyZWQsIGVycm9yIGJ5dGVzLCBlcnJvcgorY291bnQsIGV4cGlyZWQgYnl0ZXMsIGV4cGlyZWQgY291bnQsIHByb2Nlc3NlZCBieXRlcywgcHJvY2Vzc2VkIGNvdW50LAorcmVjZWl2ZWQgYnl0ZXMsIHJlY2VpdmVkIGNvdW50LCBzY2hlZHVsZWQgYnl0ZXMsIHNjaGVkdWxlZCBjb3VudCwKK3Rocm90dGxlZCBjb3VudCwgdGhyb3R0bGVkIG5hbm9zLCB1c2luZyBieXRlcywgdXNpbmcgcmVzZXJ2ZSBieXRlcy4gQQorcXVlcnkgb24gdGhlIGBpbnRlcm5vZGVfaW5ib3VuZGAgcmV0dXJucyBmb2xsb3dpbmcgZGV0YWlsczoKKworLi4uLgorY3Fsc2g6c3lzdGVtX3ZpZXdzPiBTRUxFQ1QgKiBGUk9NIHN5c3RlbV92aWV3cy5pbnRlcm5vZGVfaW5ib3VuZDsKK2FkZHJlc3MgfCBwb3J0IHwgZGMgfCByYWNrIHwgY29ycnVwdF9mcmFtZXNfcmVjb3ZlcmVkIHwgY29ycnVwdF9mcmFtZXNfdW5yZWNvdmVyZWQgfAorZXJyb3JfYnl0ZXMgfCBlcnJvcl9jb3VudCB8IGV4cGlyZWRfYnl0ZXMgfCBleHBpcmVkX2NvdW50IHwgcHJvY2Vzc2VkX2J5dGVzIHwKK3Byb2Nlc3NlZF9jb3VudCB8IHJlY2VpdmVkX2J5dGVzIHwgcmVjZWl2ZWRfY291bnQgfCBzY2hlZHVsZWRfYnl0ZXMgfCBzY2hlZHVsZWRfY291bnQgfCB0aHJvdHRsZWRfY291bnQgfCB0aHJvdHRsZWRfbmFub3MgfCB1c2luZ19ieXRlcyB8IHVzaW5nX3Jlc2VydmVfYnl0ZXMKKy0tLS0tLS0tLSstLS0tLS0rLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstCistLS0tLS0tLS0tCisoMCByb3dzKQorLi4uLgorCis9PT0gU1NUYWJsZXMgVGFza3MgVmlydHVhbCBUYWJsZQorCitUaGUgYHNzdGFibGVfdGFza3NgIGNvdWxkIGJlIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHJ1bm5pbmcKK3Rhc2tzLiBJdCBsaXN0cyBmb2xsb3dpbmcgY29sdW1uczoKKworLi4uLgorY3Fsc2g6c3lzdGVtX3ZpZXdzPiBTRUxFQ1QgKiBGUk9NIHNzdGFibGVfdGFza3M7CitrZXlzcGFjZV9uYW1lIHwgdGFibGVfbmFtZSB8IHRhc2tfaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGtpbmQgICAgICAgfCBwcm9ncmVzcyB8IHRvdGFsICAgIHwgdW5pdAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0KKyAgICAgICBiYXNpYyB8ICAgICAgd2lkZTIgfCBjMzkwOTc0MC1jZGY3LTExZTktYThlZC0wZjAzZGUyZDlhZTEgfCBjb21wYWN0aW9uIHwgNjA0MTg3NjEgfCA3MDg4MjExMCB8IGJ5dGVzCisgICAgICAgYmFzaWMgfCAgICAgIHdpZGUyIHwgYzc1NTY3NzAtY2RmNy0xMWU5LWE4ZWQtMGYwM2RlMmQ5YWUxIHwgY29tcGFjdGlvbiB8ICAyOTk1NjIzIHwgNDAzMTQ2NzkgfCBieXRlcworLi4uLgorCitBcyBhbm90aGVyIGV4YW1wbGUsIHRvIGZpbmQgaG93IG11Y2ggdGltZSBpcyByZW1haW5pbmcgZm9yIFNTVGFibGUKK3Rhc2tzLCB1c2UgdGhlIGZvbGxvd2luZyBxdWVyeToKKworLi4uLgorU0VMRUNUIHRvdGFsIC0gcHJvZ3Jlc3MgQVMgcmVtYWluaW5nCitGUk9NIHN5c3RlbV92aWV3cy5zc3RhYmxlX3Rhc2tzOworLi4uLgorCis9PT0gR29zc2lwIEluZm9ybWF0aW9uIFZpcnR1YWwgVGFibGUKKworVGhlIGBnb3NzaXBfaW5mb2AgdmlydHVhbCB0YWJsZSBsaXN0cyB0aGUgR29zc2lwIGluZm9ybWF0aW9uIGZvciB0aGUgY2x1c3Rlci4gQW4gZXhhbXBsZSBxdWVyeSBpcyBhcyBmb2xsb3dzOgorCisuLi4uCitjcWxzaD4gc2VsZWN0IGFkZHJlc3MsIHBvcnQsIGdlbmVyYXRpb24sIGhlYXJ0YmVhdCwgbG9hZCwgZGMsIHJhY2sgZnJvbSBzeXN0ZW1fdmlld3MuZ29zc2lwX2luZm87CisKKyBhZGRyZXNzICAgfCBwb3J0IHwgZ2VuZXJhdGlvbiB8IGhlYXJ0YmVhdCB8IGxvYWQgICAgfCBkYyAgICAgICAgICB8IHJhY2sKKy0tLS0tLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLQorIDEyNy4wLjAuMSB8IDcwMDAgfCAxNjQ1NTc1MTQwIHwgICAgICAgMzEyIHwgNzA1NDIuMCB8IGRhdGFjZW50ZXIxIHwgcmFjazEKKyAxMjcuMC4wLjIgfCA3MDAwIHwgMTY0NTU3NTEzNSB8ICAgICAgIDMxOCB8IDcwNDk5LjAgfCBkYXRhY2VudGVyMSB8IHJhY2sxCisgMTI3LjAuMC4zIHwgNzAwMCB8IDE2NDU1NzUxNDAgfCAgICAgICAzMTIgfCA3MDUwNC4wIHwgZGF0YWNlbnRlcjEgfCByYWNrMQorIDEyNy4wLjAuNCB8IDcwMDAgfCAxNjQ1NTc1MTQxIHwgICAgICAgMzExIHwgNzA1MDIuMCB8IGRhdGFjZW50ZXIxIHwgcmFjazEKKyAxMjcuMC4wLjUgfCA3MDAwIHwgMTY0NTU3NTEzNiB8ICAgICAgIDMxNSB8IDcwNTAwLjAgfCBkYXRhY2VudGVyMSB8IHJhY2sxCisKKyg1IHJvd3MpCisuLi4uCisKKz09PSBPdGhlciBWaXJ0dWFsIFRhYmxlcworCitTb21lIGV4YW1wbGVzIG9mIHVzaW5nIG90aGVyIHZpcnR1YWwgdGFibGVzIGFyZSBhcyBmb2xsb3dzLgorCitGaW5kIHRhYmxlcyB3aXRoIG1vc3QgZGlzayB1c2FnZToKKworLi4uLgorY3Fsc2g+IFNFTEVDVCAqIEZST00gZGlza191c2FnZSBXSEVSRSBtZWJpYnl0ZXMgPiAxIEFMTE9XIEZJTFRFUklORzsKKwora2V5c3BhY2VfbmFtZSB8IHRhYmxlX25hbWUgfCBtZWJpYnl0ZXMKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KKyAgIGtleXNwYWNlMSB8ICBzdGFuZGFyZDEgfCAgICAgICAyODgKKyAgdGxwX3N0cmVzcyB8ICAga2V5dmFsdWUgfCAgICAgIDMyMTEKKy4uLi4KKworRmluZCBxdWVyaWVzIG9uIHRhYmxlL3Mgd2l0aCBncmVhdGVzdCByZWFkIGxhdGVuY3k6CisKKy4uLi4KK2NxbHNoPiBTRUxFQ1QgKiBGUk9NICBsb2NhbF9yZWFkX2xhdGVuY3kgV0hFUkUgcGVyX3NlY29uZCA+IDEgQUxMT1cgRklMVEVSSU5HOworCitrZXlzcGFjZV9uYW1lIHwgdGFibGVfbmFtZSB8IHA1MHRoX21zIHwgcDk5dGhfbXMgfCBjb3VudCAgICB8IG1heF9tcyAgfCBwZXJfc2Vjb25kCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0KKyAgdGxwX3N0cmVzcyB8ICAga2V5dmFsdWUgfCAgICAwLjA0MyB8ICAgIDAuMTUyIHwgNDk3ODUxNTggfCAxODYuNTYzIHwgIDExNDE4LjM1NgorLi4uLgorCisKKz09IEV4YW1wbGUKKworW2FyYWJpYywgc3RhcnQ9MV0KKy4gVG8gbGlzdCB0aGUga2V5c3BhY2VzLCBlbnRlciBgYGNxbHNoYGAgYW5kIHJ1biB0aGUgQ1FMIGNvbW1hbmQgYGBERVNDUklCRSBLRVlTUEFDRVNgYDoKKworW3NvdXJjZSwgY3FsXQorLS0tLQorY3Fsc2g+IERFU0MgS0VZU1BBQ0VTOworc3lzdGVtX3NjaGVtYSAgc3lzdGVtICAgICAgICAgIHN5c3RlbV9kaXN0cmlidXRlZCAgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hCitzeXN0ZW1fYXV0aCAgICBzeXN0ZW1fdHJhY2VzICAgc3lzdGVtX3ZpZXdzCistLS0tCisKK1thcmFiaWMsIHN0YXJ0PTJdCisuIFRvIHZpZXcgdGhlIHZpcnR1YWwgdGFibGUgc2NoZW1hLCBydW4gdGhlIENRTCBjb21tYW5kcyBgYFVTRSBzeXN0ZW1fdmlydHVhbF9zY2hlbWFgYCBhbmQgYGBTRUxFQ1QgKiBGUk9NIHRhYmxlc2BgOgorCitbc291cmNlLCBjcWxdCistLS0tCitjcWxzaD4gVVNFIHN5c3RlbV92aXJ0dWFsX3NjaGVtYTsKK2NxbHNoPiBTRUxFQ1QgKiBGUk9NIHRhYmxlczsKKy0tLS0KKyAKK3Jlc3VsdHMgaW46CisKK1tzb3VyY2UsIGNxbF0KKy0tLS0KKyBrZXlzcGFjZV9uYW1lICAgICAgICAgfCB0YWJsZV9uYW1lICAgICAgICAgICAgICAgIHwgY29tbWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgICAgICAgIGNhY2hlcyB8ICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtIGNhY2hlcworICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgICAgICAgIGNsaWVudHMgfCAgICAgICAgICBjdXJyZW50bHkgY29ubmVjdGVkIGNsaWVudHMKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgY29vcmRpbmF0b3JfcmVhZF9sYXRlbmN5IHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgY29vcmRpbmF0b3Jfc2Nhbl9sYXRlbmN5IHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCBjb29yZGluYXRvcl93cml0ZV9sYXRlbmN5IHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgICBkaXNrX3VzYWdlIHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgIGludGVybm9kZV9pbmJvdW5kIHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgaW50ZXJub2RlX291dGJvdW5kIHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgbG9jYWxfcmVhZF9sYXRlbmN5IHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgbG9jYWxfc2Nhbl9sYXRlbmN5IHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICBsb2NhbF93cml0ZV9sYXRlbmN5IHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgbWF4X3BhcnRpdGlvbl9zaXplIHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICByb3dzX3Blcl9yZWFkIHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgICAgIHNldHRpbmdzIHwgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHNldHRpbmdzCisgICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgc3N0YWJsZV90YXNrcyB8ICAgICAgICAgICAgICAgIGN1cnJlbnQgc3N0YWJsZSB0YXNrcworICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgc3lzdGVtX3Byb3BlcnRpZXMgfCBDYXNzYW5kcmEgcmVsZXZhbnQgc3lzdGVtIHByb3BlcnRpZXMKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgdGhyZWFkX3Bvb2xzIHwKKyAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICB0b21ic3RvbmVzX3Blcl9yZWFkIHwKKyBzeXN0ZW1fdmlydHVhbF9zY2hlbWEgfCAgICAgICAgICAgICAgICAgICBjb2x1bW5zIHwgICAgICAgICAgIHZpcnR1YWwgY29sdW1uIGRlZmluaXRpb25zCisgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hIHwgICAgICAgICAgICAgICAgIGtleXNwYWNlcyB8ICAgICAgICAgdmlydHVhbCBrZXlzcGFjZSBkZWZpbml0aW9ucworIHN5c3RlbV92aXJ0dWFsX3NjaGVtYSB8ICAgICAgICAgICAgICAgICAgICB0YWJsZXMgfCAgICAgICAgICAgIHZpcnR1YWwgdGFibGUgZGVmaW5pdGlvbnMKKworKDIxIHJvd3MpCistLS0tCisKK1thcmFiaWMsIHN0YXJ0PTNdCisuIFRvIHZpZXcgdGhlIHZpcnR1YWwgdGFibGVzLCBydW4gdGhlIENRTCBjb21tYW5kcyBgYFVTRSBzeXN0ZW1fdmlld2BgIGFuZCBgYERFU0NSSUJFIHRhYmxlc2BgOgorCitbc291cmNlLCBjcWxdCistLS0tCitjcWxzaD4gVVNFIHN5c3RlbV92aWV3OzsKK2NxbHNoPiBERVNDUklCRSB0YWJsZXM7CistLS0tCisKK3Jlc3VsdHMgaW46CisKK1tzb3VyY2UsIGNxbF0KKy0tLS0KK3NzdGFibGVfdGFza3MgICAgICAgY2xpZW50cyAgICAgICAgICAgICAgICAgICBjb29yZGluYXRvcl93cml0ZV9sYXRlbmN5CitkaXNrX3VzYWdlICAgICAgICAgIGxvY2FsX3dyaXRlX2xhdGVuY3kgICAgICAgdG9tYnN0b25lc19wZXJfcmVhZAordGhyZWFkX3Bvb2xzICAgICAgICBpbnRlcm5vZGVfb3V0Ym91bmQgICAgICAgIHNldHRpbmdzCitsb2NhbF9zY2FuX2xhdGVuY3kgIGNvb3JkaW5hdG9yX3NjYW5fbGF0ZW5jeSAgc3lzdGVtX3Byb3BlcnRpZXMKK2ludGVybm9kZV9pbmJvdW5kICAgY29vcmRpbmF0b3JfcmVhZF9sYXRlbmN5ICBtYXhfcGFydGl0aW9uX3NpemUKK2xvY2FsX3JlYWRfbGF0ZW5jeSAgcm93c19wZXJfcmVhZCAgICAgICAgICAgICBjYWNoZXMKKy0tLS0KKworW2FyYWJpYywgc3RhcnQ9NF0KKy4gVG8gbG9vayBhdCBhbnkgdGFibGUgZGF0YSwgcnVuIHRoZSBDUUwgY29tbWFuZCBgYFNFTEVDVGBgOgorCitbc291cmNlLCBjcWxdCistLS0tCitjcWxzaD4gVVNFIHN5c3RlbV92aWV3OzsKK2NxbHNoPiBTRUxFQ1QgKiBGUk9NIGNsaWVudHMgTElNSVQgMjsKKy0tLS0KKyByZXN1bHRzIGluOgorCitbc291cmNlLCBjcWxdCistLS0tCisgYWRkcmVzcyAgIHwgcG9ydCAgfCBjb25uZWN0aW9uX3N0YWdlIHwgZHJpdmVyX25hbWUgICAgICAgICAgICB8IGRyaXZlcl92ZXJzaW9uIHwgaG9zdG5hbWUgIHwgcHJvdG9jb2xfdmVyc2lvbiB8IHJlcXVlc3RfY291bnQgfCBzc2xfY2lwaGVyX3N1aXRlIHwgc3NsX2VuYWJsZWQgfCBzc2xfcHJvdG9jb2wgfCB1c2VybmFtZQorLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLQorIDEyNy4wLjAuMSB8IDM3MzA4IHwgICAgICAgICAgICByZWFkeSB8IERhdGFTdGF4IFB5dGhvbiBEcml2ZXIgfCAgIDMuMjEuMC5wb3N0MCB8IGxvY2FsaG9zdCB8ICAgICAgICAgICAgICAgIDQgfCAgICAgICAgICAgIDE3IHwgICAgICAgICAgICAgbnVsbCB8ICAgICAgIEZhbHNlIHwgICAgICAgICBudWxsIHwgYW5vbnltb3VzCisgMTI3LjAuMC4xIHwgMzczMTAgfCAgICAgICAgICAgIHJlYWR5IHwgRGF0YVN0YXggUHl0aG9uIERyaXZlciB8ICAgMy4yMS4wLnBvc3QwIHwgbG9jYWxob3N0IHwgICAgICAgICAgICAgICAgNCB8ICAgICAgICAgICAgIDggfCAgICAgICAgICAgICBudWxsIHwgICAgICAgRmFsc2UgfCAgICAgICAgIG51bGwgfCBhbm9ueW1vdXMKKworKDIgcm93cykKKy0tLS0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9uZXcvaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9uZXcvaW5kZXguYWRvYwppbmRleCBhNjU0NWE3Li4xYTYwMjhjIDEwMDY0NAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbmV3L2luZGV4LmFkb2MKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL25ldy9pbmRleC5hZG9jCkBAIC0xLDIwICsxLDE2IEBACi09IE5ldyBGZWF0dXJlcyBpbiBBcGFjaGUgQ2Fzc2FuZHJhIDQuMQorPSBOZXcgRmVhdHVyZXMKIAotVGhpcyBzZWN0aW9uIGNvdmVycyB0aGUgbmV3IGZlYXR1cmVzIGluIEFwYWNoZSBDYXNzYW5kcmEgNC4xLgorPT0gTmV3IEZlYXR1cmVzIGluIEFwYWNoZSBDYXNzYW5kcmEgNS4wCiAKK1RoaXMgc2VjdGlvbiBjb3ZlcnMgdGhlIG5ldyBmZWF0dXJlcyBpbiBBcGFjaGUgQ2Fzc2FuZHJhIDUuMC4KIAotKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xNzE2NFtQYXhvcyB2Ml0KLSogbGluazovXy9ibG9nL0FwYWNoZS1DYXNzYW5kcmEtNC4xLUZlYXR1cmVzLUd1YXJkcmFpbHMtRnJhbWV3b3JrLmh0bWxbR3VhcmRyYWlsc10KLSogbGluazovXy9ibG9nL0FwYWNoZS1DYXNzYW5kcmEtNC4xLUNvbmZpZ3VyYXRpb24tU3RhbmRhcmRpemF0aW9uLmh0bWxbTmV3IGFuZCBJbXByb3ZlZCBDb25maWd1cmF0aW9uIEZvcm1hdF0KLSogbGluazovXy9ibG9nL0FwYWNoZS1DYXNzYW5kcmEtNC4xLUZlYXR1cmVzLUNsaWVudC1zaWRlLVBhc3N3b3JkLUhhc2hpbmcuaHRtbFtDbGllbnQtc2lkZSBQYXNzd29yZCBIYXNoaW5nXQotKiBsaW5rOi9fL2Jsb2cvQXBhY2hlLUNhc3NhbmRyYS00LjEtRGVueWxpc3RpbmctUGFydGl0aW9ucy5odG1sW1BhcnRpdGlvbiBEZW55bGlzdF0KLSogTG90cyBvZiBDUUwgaW1wcm92ZW1lbnRzCi0qIGxpbms6L18vYmxvZy9BcGFjaGUtQ2Fzc2FuZHJhLTQuMS1OZXctU1NUYWJsZS1JZGVudGlmaWVycy5odG1sW05ldyBTU1RhYmxlIElkZW50aWZpZXJzXQotKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xNzQyM1tOYXRpdmUgVHJhbnNwb3J0IHJhdGUgbGltaXRpbmddCi0qIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE2MzEwW1RvcCBwYXJ0aXRpb24gdHJhY2tpbmcgcGVyIHRhYmxlXQotKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xNDMwOVtIaW50IFdpbmRvdyBjb25zaXN0ZW5jeV0KLSogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTcwNDRbUGx1Z2dhYmlsaXR5XQotKiogbGluazovXy9ibG9nL0FwYWNoZS1DYXNzYW5kcmEtNC4xLUZlYXR1cmVzLVBsdWdnYWJsZS1NZW10YWJsZS1JbXBsZW1lbnRhdGlvbnMuaHRtbFtNZW10YWJsZV0KLSoqIEVuY3J5cHRpb24KLSoqIGxpbms6L18vYmxvZy9BcGFjaGUtQ2Fzc2FuZHJhLTQuMS1GZWF0dXJlcy1BdXRoZW50aWNhdGlvbi1QbHVnaW4tU3VwcG9ydC1mb3ItQ1FMU0guaHRtbFtDUUxTSCBBdXRoZW50aWNhdGlvbl0KLSogYW5kIG11Y2ggbGluazpodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS9ibG9iL2Nhc3NhbmRyYS00LjEvTkVXUy50eHRbbW9yZV0KKyogaHR0cHM6Ly9jd2lraS5hcGFjaGUub3JnL2NvbmZsdWVuY2UveC9GUVJBQ3dbQUNJRCBUcmFuc2FjdGlvbnMgKEFjY29yZCldCisqIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE2MDUyW1N0b3JhZ2UgQXR0YWNoZWQgSW5kZXhlc10KKyogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTcyNDBbVHJpZSBNZW10YWJsZXNdCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhL2Jsb2IvdHJ1bmsvTkVXUy50eHRbTW9yZSBHdWFyZHJhaWxzXQorKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS04ODc3W1RUTCBhbmQgd3JpdGV0aW1lIG9uIGNvbGxlY3Rpb25zIGFuZCBVRFRzXQorKiBodHRwczovL2N3aWtpLmFwYWNoZS5vcmcvY29uZmx1ZW5jZS94L1l5RDFEW1RyYW5zYWN0aW9uYWwgQ2x1c3RlciBNZXRhZGF0YV0KKyogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTY4OTVbSkRLIDE3XQorKiBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xNzIyMVtBZGQgbmV3IE1hdGhlbWF0aWNhbCBDUUwgZnVuY3Rpb25zOiBhYnMsIGV4cCwgbG9nLCBsb2cxMCBhbmQgcm91bmRdCisqIGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTE4MDYwW0FkZGVkIG5ldyBDUUwgbmF0aXZlIHNjYWxhciBmdW5jdGlvbnMgZm9yIGNvbGxlY3Rpb25zXSAKKyoqIFRoZSBuZXcgZnVuY3Rpb25zIGFyZSBtb3N0bHkgYW5hbG9nb3VzIHRvIHRoZSBleGlzdGluZyBhZ2dyZWdhdGlvbiBmdW5jdGlvbnMsIGJ1dCB0aGV5IG9wZXJhdGUgb24gdGhlIGVsZW1lbnRzIG9mIGNvbGxlY3Rpb24gY29sdW1ucy4gVGhlIG5ldyBmdW5jdGlvbnMgYXJlIGBtYXBfa2V5c2AsIGBtYXBfdmFsdWVzYCwgYGNvbGxlY3Rpb25fY291bnRgLCBgY29sbGVjdGlvbl9taW5gLCBgY29sbGVjdGlvbl9tYXhgLCBgY29sbGVjdGlvbl9zdW1gIGFuZCBgY29sbGVjdGlvbl9hdmdgLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL25ldy92aXJ0dWFsdGFibGVzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbmV3L3ZpcnR1YWx0YWJsZXMuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E3YTRiZS4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvbmV3L3ZpcnR1YWx0YWJsZXMuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi09IFZpcnR1YWwgVGFibGVzCi0KLUFwYWNoZSBDYXNzYW5kcmEgNC4wIGltcGxlbWVudHMgdmlydHVhbCB0YWJsZXMgKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTc2MjJbQ0FTU0FORFJBLTc2MjJdKS4KLVZpcnR1YWwgdGFibGVzIGFyZSB0YWJsZXMgYmFja2VkIGJ5IGFuIEFQSSBpbnN0ZWFkIG9mIGRhdGEgZXhwbGljaXRseSBtYW5hZ2VkIGFuZCBzdG9yZWQgYXMgU1NUYWJsZXMuIAotQXBhY2hlIENhc3NhbmRyYSA0LjAgaW1wbGVtZW50cyBhIHZpcnR1YWwga2V5c3BhY2UgaW50ZXJmYWNlIGZvciB2aXJ0dWFsIHRhYmxlcy4gCi1WaXJ0dWFsIHRhYmxlcyBhcmUgc3BlY2lmaWMgdG8gZWFjaCBub2RlLgotCi1Tb21lIG9mIHRoZSBmZWF0dXJlcyBvZiB2aXJ0dWFsIHRhYmxlcyBhcmUgdGhlIGFiaWxpdHkgdG86Ci0KLSogZXhwb3NlIG1ldHJpY3MgdGhyb3VnaCBDUUwKLSogZXhwb3NlIFlBTUwgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgotCi1WaXJ0dWFsIGtleXNwYWNlcyBhbmQgdGFibGVzIGFyZSBxdWl0ZSBkaWZmZXJlbnQgZnJvbSByZWd1bGFyIHRhYmxlcyBhbmQga2V5c3BhY2VzOgotCi0qIFZpcnR1YWwgdGFibGVzIGFyZSBjcmVhdGVkIGluIHNwZWNpYWwga2V5c3BhY2VzIGFuZCBub3QganVzdCBhbnkga2V5c3BhY2UuCi0qIFZpcnR1YWwgdGFibGVzIGFyZSBtYW5hZ2VkIGJ5IENhc3NhbmRyYS4gVXNlcnMgY2Fubm90IHJ1biBEREwgdG8gY3JlYXRlIG5ldyB2aXJ0dWFsIHRhYmxlcyBvciBETUwgdG8gbW9kaWZ5IGV4aXN0aW5nIHZpcnR1YWwgdGFibGVzLgotKiBWaXJ0dWFsIHRhYmxlcyBhcmUgY3VycmVudGx5IHJlYWQtb25seSwgYWx0aG91Z2ggdGhhdCBtYXkgY2hhbmdlIGluIGEgbGF0ZXIgdmVyc2lvbi4KLSogVmlydHVhbCB0YWJsZXMgYXJlIGxvY2FsIG9ubHksIG5vbi1kaXN0cmlidXRlZCwgYW5kIHRodXMgbm90IHJlcGxpY2F0ZWQuCi0qIFZpcnR1YWwgdGFibGVzIGhhdmUgbm8gYXNzb2NpYXRlZCBTU1RhYmxlcy4KLSogQ29uc2lzdGVuY3kgbGV2ZWwgb2YgdGhlIHF1ZXJpZXMgc2VudCB0byB2aXJ0dWFsIHRhYmxlcyBhcmUgaWdub3JlZC4KLSogQWxsIGV4aXN0aW5nIHZpcnR1YWwgdGFibGVzIHVzZSBgTG9jYWxQYXJ0aXRpb25lcmAuIAotU2luY2UgYSB2aXJ0dWFsIHRhYmxlIGlzIG5vdCByZXBsaWNhdGVkIHRoZSBwYXJ0aXRpb25lciBzb3J0cyBpbiBvcmRlciBvZiBwYXJ0aXRpb24ga2V5cyBpbnN0ZWFkIG9mIGJ5IHRoZWlyIGhhc2guCi0qIE1ha2luZyBhZHZhbmNlZCBxdWVyaWVzIHVzaW5nIGBBTExPVyBGSUxURVJJTkdgIGFuZCBhZ2dyZWdhdGlvbiBmdW5jdGlvbnMgY2FuIGJlIGV4ZWN1dGVkIGluIHZpcnR1YWwgdGFibGVzLCBldmVuIHRob3VnaCBpbiBub3JtYWwgdGFibGVzIHdlIGRvbnQgcmVjb21tZW5kIGl0LgotCi09PSBWaXJ0dWFsIEtleXNwYWNlcwotCi1BcGFjaGUgQ2Fzc2FuZHJhIDQuMCBoYXMgYWRkZWQgdHdvIG5ldyBrZXlzcGFjZXMgZm9yIHZpcnR1YWwgdGFibGVzOgotCi0qIGBzeXN0ZW1fdmlydHVhbF9zY2hlbWFgIAotKiBgc3lzdGVtX3ZpZXdzYC4gCi0KLVRoZSBgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hYCBrZXlzcGFjZSBoYXMgdGhyZWUgdGFibGVzOiBga2V5c3BhY2VzYCwKLWBjb2x1bW5zYCBhbmQgYHRhYmxlc2AgZm9yIHRoZSB2aXJ0dWFsIGtleXNwYWNlLCB0YWJsZSwgYW5kIGNvbHVtbiBkZWZpbml0aW9ucywgcmVzcGVjdGl2ZWx5LgotVGhlc2UgdGFibGVzIGNvbnRhaW4gc2NoZW1hIGluZm9ybWF0aW9uIGZvciB0aGUgdmlydHVhbCB0YWJsZXMuCi1JdCBpcyB1c2VkIGJ5IENhc3NhbmRyYSBpbnRlcm5hbGx5IGFuZCBhIHVzZXIgc2hvdWxkIG5vdCBhY2Nlc3MgaXQgZGlyZWN0bHkuCi0KLVRoZSBgc3lzdGVtX3ZpZXdzYCBrZXlzcGFjZSBjb250YWlucyB0aGUgYWN0dWFsIHZpcnR1YWwgdGFibGVzLgotCi09PSBWaXJ0dWFsIFRhYmxlIExpbWl0YXRpb25zCi0KLUJlZm9yZSBkaXNjY3VzaW5nIHZpcnR1YWwga2V5c3BhY2VzIGFuZCB0YWJsZXMsIG5vdGUgdGhhdCB2aXJ0dWFsIGtleXNwYWNlcyBhbmQgdGFibGVzIGhhdmUgc29tZSBsaW1pdGF0aW9ucy4gCi1UaGVzZSBsaW1pdGF0aW9ucyBhcmUgc3ViamVjdCB0byBjaGFuZ2UuCi1WaXJ0dWFsIGtleXNwYWNlcyBjYW5ub3QgYmUgYWx0ZXJlZCBvciBkcm9wcGVkLiAKLUluIGZhY3QsIG5vIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBhZ2FpbnN0IHZpcnR1YWwga2V5c3BhY2VzLgotCi1WaXJ0dWFsIHRhYmxlcyBjYW5ub3QgYmUgY3JlYXRlZCBpbiB2aXJ0dWFsIGtleXNwYWNlcy4KLVZpcnR1YWwgdGFibGVzIGNhbm5vdCBiZSBhbHRlcmVkLCBkcm9wcGVkLCBvciB0cnVuY2F0ZWQuCi1TZWNvbmRhcnkgaW5kZXhlcywgdHlwZXMsIGZ1bmN0aW9ucywgYWdncmVnYXRlcywgbWF0ZXJpYWxpemVkIHZpZXdzLCBhbmQgdHJpZ2dlcnMgY2Fubm90IGJlIGNyZWF0ZWQgZm9yIHZpcnR1YWwgdGFibGVzLgotRXhwaXJpbmcgdGltZS10by1saXZlIChUVEwpIGNvbHVtbnMgY2Fubm90IGJlIGNyZWF0ZWQuCi1WaXJ0dWFsIHRhYmxlcyBkbyBub3Qgc3VwcG9ydCBjb25kaXRpb25hbCB1cGRhdGVzIG9yIGRlbGV0ZXMuCi1BZ2dyZWdhdGVzIG1heSBiZSBydW4gaW4gU0VMRUNUIHN0YXRlbWVudHMuCi0KLUNvbmRpdGlvbmFsIGJhdGNoIHN0YXRlbWVudHMgY2Fubm90IGluY2x1ZGUgbXV0YXRpb25zIGZvciB2aXJ0dWFsIHRhYmxlcywgbm9yIGNhbiBhIHZpcnR1YWwgdGFibGUgc3RhdGVtZW50IGJlIGluY2x1ZGVkIGluIGEgbG9nZ2VkIGJhdGNoLgotSW4gZmFjdCwgbXV0YXRpb25zIGZvciB2aXJ0dWFsIGFuZCByZWd1bGFyIHRhYmxlcyBjYW5ub3Qgb2NjdXIgaW4gdGhlIHNhbWUgYmF0Y2ggdGFibGUuCi0KLT09IFZpcnR1YWwgVGFibGVzCi0KLUVhY2ggb2YgdGhlIHZpcnR1YWwgdGFibGVzIGluIHRoZSBgc3lzdGVtX3ZpZXdzYCB2aXJ0dWFsIGtleXNwYWNlIGNvbnRhaW4gZGlmZmVyZW50IGluZm9ybWF0aW9uLgotCi1UaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUgdmlydHVhbCB0YWJsZXM6IAotCi1bd2lkdGg9Ijk4JSIsY29scz0iMjclLDczJSIsXQotfD09PQotfFZpcnR1YWwgVGFibGUgfERlc2NyaXB0aW9uCi0KLXxjYWNoZXMgfERpc3BsYXlzIHRoZSBnZW5lcmFsIGNhY2hlIGluZm9ybWF0aW9uIGluY2x1ZGluZyBjYWNoZSBuYW1lLCBjYXBhY2l0eV9ieXRlcywgZW50cnlfY291bnQsIGhpdF9jb3VudCwgaGl0X3JhdGlvIGRvdWJsZSwKLXJlY2VudF9oaXRfcmF0ZV9wZXJfc2Vjb25kLCByZWNlbnRfcmVxdWVzdF9yYXRlX3Blcl9zZWNvbmQsIHJlcXVlc3RfY291bnQsIGFuZCBzaXplX2J5dGVzLgotCi18Y2xpZW50cyB8TGlzdHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGNvbm5lY3RlZCBjbGllbnRzLgotCi18Y29vcmRpbmF0b3JfcmVhZF9sYXRlbmN5IHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBjb29yZGluYXRvciByZWFkcy4KLQotfGNvb3JkaW5hdG9yX3NjYW4gfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGNvb3JkaW5hdG9yIHNjYW5zLgotCi18Y29vcmRpbmF0b3Jfd3JpdGVfbGF0ZW5jeSB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgY29vcmRpbmF0b3Igd3JpdGVzLgotCi18Y3FsX21ldHJpY3MgfE1ldHJpY3Mgc3BlY2lmaWMgdG8gQ1FMIHByZXBhcmVkIHN0YXRlbWVudCBjYWNoaW5nLgotCi18ZGlza191c2FnZSB8UmVjb3JkcyBkaXNrIHVzYWdlIGluY2x1ZGluZyBkaXNrX3NwYWNlLCBrZXlzcGFjZV9uYW1lLCBhbmQgdGFibGVfbmFtZSwgc29ydGVkIGJ5IHN5c3RlbSBrZXlzcGFjZXMuCi0KLXxnb3NzaXBfaW5mbyB8TGlzdHMgdGhlIGdvc3NpcCBpbmZvcm1hdGlvbiBmb3IgdGhlIGNsdXN0ZXIuCi0KLXxpbnRlcm5vZGVfaW5ib3VuZCB8TGlzdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluYm91bmQgaW50ZXJub2RlIG1lc3NhZ2luZy4KLQotfGludGVybm9kZV9vdXRib3VuZCB8SW5mb3JtYXRpb24gYWJvdXQgdGhlIG91dGJvdW5kIGludGVybm9kZSBtZXNzYWdpbmcuCi0KLXxsb2NhbF9yZWFkX2xhdGVuY3kgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGxvY2FsIHJlYWRzLgotCi18bG9jYWxfc2NhbiB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgbG9jYWwgc2NhbnMuCi0KLXxsb2NhbF93cml0ZV9sYXRlbmN5IHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBsb2NhbCB3cml0ZXMuCi0KLXxtYXhfcGFydGl0aW9uX3NpemUgfEEgdGFibGUgbWV0cmljIGZvciBtYXhpbXVtIHBhcnRpdGlvbiBzaXplLgotCi18cm93c19wZXJfcmVhZCB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxla19uYW1lLCBtYXgsIGFuZCBtZWRpYW4gZm9yIHJvd3MgcmVhZC4KLQotfHNldHRpbmdzIHxEaXNwbGF5cyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGluIGNhc3NhbmRyYS55YW1sLgotCi18c3N0YWJsZV90YXNrcyB8TGlzdHMgY3VycmVudGx5IHJ1bm5pbmcgdGFza3MgYW5kIHByb2dyZXNzIG9uIFNTVGFibGVzLCBmb3Igb3BlcmF0aW9ucyBsaWtlIGNvbXBhY3Rpb24gYW5kIHVwZ3JhZGUuCi0KLXxzeXN0ZW1fcHJvcGVydGllcyB8RGlzcGxheXMgZW52aXJvbm1lbnRhbCBzeXN0ZW0gcHJvcGVydGllcyBzZXQgb24gdGhlIG5vZGUuCi0KLXx0aHJlYWRfcG9vbHMgfExpc3RzIG1ldHJpY3MgZm9yIGVhY2ggdGhyZWFkIHBvb2wuCi0KLXx0b21ic3RvbmVzX3Blcl9yZWFkIHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVrX25hbWUsIG1heCwgYW5kIG1lZGlhbiBmb3IgdG9tYnN0b25lcy4KLQotfD09PQotCi1XZSBzaGFsbCBkaXNjdXNzIHNvbWUgb2YgdGhlIHZpcnR1YWwgdGFibGVzIGluIG1vcmUgZGV0YWlsIG5leHQuCi0KLT09PSBDbGllbnRzIFZpcnR1YWwgVGFibGUKLQotVGhlIGBjbGllbnRzYCB2aXJ0dWFsIHRhYmxlIGxpc3RzIGFsbCBhY3RpdmUgY29ubmVjdGlvbnMgKGNvbm5lY3RlZAotY2xpZW50cykgaW5jbHVkaW5nIHRoZWlyIGlwIGFkZHJlc3MsIHBvcnQsIGNsaWVudF9vcHRpb25zLCBjb25uZWN0aW9uIHN0YWdlLCBkcml2ZXIKLW5hbWUsIGRyaXZlciB2ZXJzaW9uLCBob3N0bmFtZSwgcHJvdG9jb2wgdmVyc2lvbiwgcmVxdWVzdCBjb3VudCwgc3NsCi1lbmFibGVkLCBzc2wgcHJvdG9jb2wgYW5kIHVzZXIgbmFtZToKLQotLi4uLgotY3Fsc2g+IEVYUEFORCBPTiA7Ci1Ob3cgRXhwYW5kZWQgb3V0cHV0IGlzIGVuYWJsZWQKLWNxbHNoPiBTRUxFQ1QgKiBGUk9NIHN5c3RlbV92aWV3cy5jbGllbnRzOwotCi1AIFJvdyAxCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBhZGRyZXNzICAgICAgICAgIHwgMTI3LjAuMC4xCi0gcG9ydCAgICAgICAgICAgICB8IDUwNjg3Ci0gY2xpZW50X29wdGlvbnMgICB8IHsnQ1FMX1ZFUlNJT04nOiAnMy40LjYnLCAnRFJJVkVSX05BTUUnOiAnRGF0YVN0YXggUHl0aG9uIERyaXZlcicsICdEUklWRVJfVkVSU0lPTic6ICczLjI1LjAnfQotIGNvbm5lY3Rpb25fc3RhZ2UgfCByZWFkeQotIGRyaXZlcl9uYW1lICAgICAgfCBEYXRhU3RheCBQeXRob24gRHJpdmVyCi0gZHJpdmVyX3ZlcnNpb24gICB8IDMuMjUuMAotIGhvc3RuYW1lICAgICAgICAgfCBsb2NhbGhvc3QKLSBwcm90b2NvbF92ZXJzaW9uIHwgNQotIHJlcXVlc3RfY291bnQgICAgfCAxNgotIHNzbF9jaXBoZXJfc3VpdGUgfCBudWxsCi0gc3NsX2VuYWJsZWQgICAgICB8IEZhbHNlCi0gc3NsX3Byb3RvY29sICAgICB8IG51bGwKLSB1c2VybmFtZSAgICAgICAgIHwgYW5vbnltb3VzCi0KLUAgUm93IDIKLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIGFkZHJlc3MgICAgICAgICAgfCAxMjcuMC4wLjEKLSBwb3J0ICAgICAgICAgICAgIHwgNTA2ODgKLSBjbGllbnRfb3B0aW9ucyAgIHwgeydDUUxfVkVSU0lPTic6ICczLjQuNicsICdEUklWRVJfTkFNRSc6ICdEYXRhU3RheCBQeXRob24gRHJpdmVyJywgJ0RSSVZFUl9WRVJTSU9OJzogJzMuMjUuMCd9Ci0gY29ubmVjdGlvbl9zdGFnZSB8IHJlYWR5Ci0gZHJpdmVyX25hbWUgICAgICB8IERhdGFTdGF4IFB5dGhvbiBEcml2ZXIKLSBkcml2ZXJfdmVyc2lvbiAgIHwgMy4yNS4wCi0gaG9zdG5hbWUgICAgICAgICB8IGxvY2FsaG9zdAotIHByb3RvY29sX3ZlcnNpb24gfCA1Ci0gcmVxdWVzdF9jb3VudCAgICB8IDQKLSBzc2xfY2lwaGVyX3N1aXRlIHwgbnVsbAotIHNzbF9lbmFibGVkICAgICAgfCBGYWxzZQotIHNzbF9wcm90b2NvbCAgICAgfCBudWxsCi0gdXNlcm5hbWUgICAgICAgICB8IGFub255bW91cwotCi1AIFJvdyAzCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBhZGRyZXNzICAgICAgICAgIHwgMTI3LjAuMC4xCi0gcG9ydCAgICAgICAgICAgICB8IDUwNzUzCi0gY2xpZW50X29wdGlvbnMgICB8IHsnQVBQTElDQVRJT05fTkFNRSc6ICdUZXN0QXBwJywgJ0FQUExJQ0FUSU9OX1ZFUlNJT04nOiAnMS4wLjAnLCAnQ0xJRU5UX0lEJzogJzU1YjNlZmJkLWM1NmItNDY5ZC04Y2NhLTAxNmI4NjBiMmYwMycsICdDUUxfVkVSU0lPTic6ICczLjAuMCcsICdEUklWRVJfTkFNRSc6ICdEYXRhU3RheCBKYXZhIGRyaXZlciBmb3IgQXBhY2hlIENhc3NhbmRyYShSKScsICdEUklWRVJfVkVSU0lPTic6ICc0LjEzLjAnfQotIGNvbm5lY3Rpb25fc3RhZ2UgfCByZWFkeQotIGRyaXZlcl9uYW1lICAgICAgfCBEYXRhU3RheCBKYXZhIGRyaXZlciBmb3IgQXBhY2hlIENhc3NhbmRyYShSKQotIGRyaXZlcl92ZXJzaW9uICAgfCA0LjEzLjAKLSBob3N0bmFtZSAgICAgICAgIHwgbG9jYWxob3N0Ci0gcHJvdG9jb2xfdmVyc2lvbiB8IDUKLSByZXF1ZXN0X2NvdW50ICAgIHwgMTgKLSBzc2xfY2lwaGVyX3N1aXRlIHwgbnVsbAotIHNzbF9lbmFibGVkICAgICAgfCBGYWxzZQotIHNzbF9wcm90b2NvbCAgICAgfCBudWxsCi0gdXNlcm5hbWUgICAgICAgICB8IGFub255bW91cwotCi1AIFJvdyA0Ci0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBhZGRyZXNzICAgICAgICAgIHwgMTI3LjAuMC4xCi0gcG9ydCAgICAgICAgICAgICB8IDUwNzU1Ci0gY2xpZW50X29wdGlvbnMgICB8IHsnQVBQTElDQVRJT05fTkFNRSc6ICdUZXN0QXBwJywgJ0FQUExJQ0FUSU9OX1ZFUlNJT04nOiAnMS4wLjAnLCAnQ0xJRU5UX0lEJzogJzU1YjNlZmJkLWM1NmItNDY5ZC04Y2NhLTAxNmI4NjBiMmYwMycsICdDUUxfVkVSU0lPTic6ICczLjAuMCcsICdEUklWRVJfTkFNRSc6ICdEYXRhU3RheCBKYXZhIGRyaXZlciBmb3IgQXBhY2hlIENhc3NhbmRyYShSKScsICdEUklWRVJfVkVSU0lPTic6ICc0LjEzLjAnfQotIGNvbm5lY3Rpb25fc3RhZ2UgfCByZWFkeQotIGRyaXZlcl9uYW1lICAgICAgfCBEYXRhU3RheCBKYXZhIGRyaXZlciBmb3IgQXBhY2hlIENhc3NhbmRyYShSKQotIGRyaXZlcl92ZXJzaW9uICAgfCA0LjEzLjAKLSBob3N0bmFtZSAgICAgICAgIHwgbG9jYWxob3N0Ci0gcHJvdG9jb2xfdmVyc2lvbiB8IDUKLSByZXF1ZXN0X2NvdW50ICAgIHwgNwotIHNzbF9jaXBoZXJfc3VpdGUgfCBudWxsCi0gc3NsX2VuYWJsZWQgICAgICB8IEZhbHNlCi0gc3NsX3Byb3RvY29sICAgICB8IG51bGwKLSB1c2VybmFtZSAgICAgICAgIHwgYW5vbnltb3VzCi0KLSg0IHJvd3MpCi0uLi4uCi0KLVNvbWUgZXhhbXBsZXMgb2YgaG93IGBjbGllbnRzYCBjYW4gYmUgdXNlZCBhcmU6Ci0KLSogVG8gZmluZCBhcHBsaWNhdGlvbnMgdXNpbmcgb2xkIGluY29tcGF0aWJsZSB2ZXJzaW9ucyBvZiBkcml2ZXJzIGJlZm9yZQotdXBncmFkaW5nIGFuZCB3aXRoIGBub2RldG9vbCBlbmFibGVvbGRwcm90b2NvbHZlcnNpb25zYCBhbmQKLWBub2RldG9vbCBkaXNhYmxlb2xkcHJvdG9jb2x2ZXJzaW9uc2AgZHVyaW5nIHVwZ3JhZGVzLgotKiBUbyBpZGVudGlmeSBjbGllbnRzIHNlbmRpbmcgdG9vIG1hbnkgcmVxdWVzdHMuCi0qIFRvIGZpbmQgaWYgU1NMIGlzIGVuYWJsZWQgZHVyaW5nIHRoZSBtaWdyYXRpb24gdG8gYW5kIGZyb20gc3NsLgotKiBUbyBpZGVudGlmeSBhbGwgb3B0aW9ucyB0aGUgY2xpZW50IGlzIHNlbmRpbmcsIGUuZy4gQVBQTElDQVRJT05fTkFNRSBhbmQgQVBQTElDQVRJT05fVkVSU0lPTgotCi1UaGUgdmlydHVhbCB0YWJsZXMgbWF5IGJlIGRlc2NyaWJlZCB3aXRoIGBERVNDUklCRWAgc3RhdGVtZW50LiBUaGUgRERMCi1saXN0ZWQgaG93ZXZlciBjYW5ub3QgYmUgcnVuIHRvIGNyZWF0ZSBhIHZpcnR1YWwgdGFibGUuIEFzIGFuIGV4YW1wbGUKLWRlc2NyaWJlIHRoZSBgc3lzdGVtX3ZpZXdzLmNsaWVudHNgIHZpcnR1YWwgdGFibGU6Ci0KLS4uLi4KLWNxbHNoPiBERVNDUklCRSBUQUJMRSBzeXN0ZW1fdmlld3MuY2xpZW50czsKLQotLyoKLVdhcm5pbmc6IFRhYmxlIHN5c3RlbV92aWV3cy5jbGllbnRzIGlzIGEgdmlydHVhbCB0YWJsZSBhbmQgY2Fubm90IGJlIHJlY3JlYXRlZCB3aXRoIENRTC4KLVN0cnVjdHVyZSwgZm9yIHJlZmVyZW5jZToKLVZJUlRVQUwgVEFCTEUgc3lzdGVtX3ZpZXdzLmNsaWVudHMgKAotICAgIGFkZHJlc3MgaW5ldCwKLSAgICBwb3J0IGludCwKLSAgICBjbGllbnRfb3B0aW9ucyBmcm96ZW48bWFwPHRleHQsIHRleHQ+PiwKLSAgICBjb25uZWN0aW9uX3N0YWdlIHRleHQsCi0gICAgZHJpdmVyX25hbWUgdGV4dCwKLSAgICBkcml2ZXJfdmVyc2lvbiB0ZXh0LAotICAgIGhvc3RuYW1lIHRleHQsCi0gICAgcHJvdG9jb2xfdmVyc2lvbiBpbnQsCi0gICAgcmVxdWVzdF9jb3VudCBiaWdpbnQsCi0gICAgc3NsX2NpcGhlcl9zdWl0ZSB0ZXh0LAotICAgIHNzbF9lbmFibGVkIGJvb2xlYW4sCi0gICAgc3NsX3Byb3RvY29sIHRleHQsCi0gICAgdXNlcm5hbWUgdGV4dCwKLSAgICBQUklNQVJZIEtFWSAoYWRkcmVzcywgcG9ydCkKLSkgV0lUSCBDTFVTVEVSSU5HIE9SREVSIEJZIChwb3J0IEFTQykKLSAgICBBTkQgY29tbWVudCA9ICdjdXJyZW50bHkgY29ubmVjdGVkIGNsaWVudHMnOwotKi8KLS4uLi4KLQotPT09IENhY2hlcyBWaXJ0dWFsIFRhYmxlCi0KLVRoZSBgY2FjaGVzYCB2aXJ0dWFsIHRhYmxlIGxpc3RzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjYWNoZXMuIFRoZSBmb3VyCi1jYWNoZXMgcHJlc2VudGx5IGNyZWF0ZWQgYXJlIGNodW5rcywgY291bnRlcnMsIGtleXMgYW5kIHJvd3MuIEEgcXVlcnkgb24KLXRoZSBgY2FjaGVzYCB2aXJ0dWFsIHRhYmxlIHJldHVybnMgdGhlIGZvbGxvd2luZyBkZXRhaWxzOgotCi0uLi4uCi1jcWxzaDpzeXN0ZW1fdmlld3M+IFNFTEVDVCAqIEZST00gc3lzdGVtX3ZpZXdzLmNhY2hlczsKLW5hbWUgICAgIHwgY2FwYWNpdHlfYnl0ZXMgfCBlbnRyeV9jb3VudCB8IGhpdF9jb3VudCB8IGhpdF9yYXRpbyB8IHJlY2VudF9oaXRfcmF0ZV9wZXJfc2Vjb25kIHwgcmVjZW50X3JlcXVlc3RfcmF0ZV9wZXJfc2Vjb25kIHwgcmVxdWVzdF9jb3VudCB8IHNpemVfYnl0ZXMKLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tCi0gIGNodW5rcyB8ICAgICAgMjI5NjM4MTQ0IHwgICAgICAgICAgMjkgfCAgICAgICAxNjYgfCAgICAgIDAuODMgfCAgICAgICAgICAgICAgICAgICAgICAgICAgNSB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiB8ICAgICAgICAgICAyMDAgfCAgICAgNDc1MTM2Ci1jb3VudGVycyB8ICAgICAgIDI2MjE0NDAwIHwgICAgICAgICAgIDAgfCAgICAgICAgIDAgfCAgICAgICBOYU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAwCi0gICAga2V5cyB8ICAgICAgIDUyNDI4ODAwIHwgICAgICAgICAgMTQgfCAgICAgICAxMjQgfCAgMC44NzMyMzkgfCAgICAgICAgICAgICAgICAgICAgICAgICAgNCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCB8ICAgICAgICAgICAxNDIgfCAgICAgICAxMjQ4Ci0gICAgcm93cyB8ICAgICAgICAgICAgICAwIHwgICAgICAgICAgIDAgfCAgICAgICAgIDAgfCAgICAgICBOYU4gfCAgICAgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAgfCAgICAgICAgICAwCi0KLSg0IHJvd3MpCi0uLi4uCi0KLT09PSBDUUwgbWV0cmljcyBWaXJ0dWFsIFRhYmxlCi1UaGUgYGNxbF9tZXRyaWNzYCB2aXJ0dWFsIHRhYmxlIGxpc3RzIG1ldHJpY3Mgc3BlY2lmaWMgdG8gQ1FMIHByZXBhcmVkIHN0YXRlbWVudCBjYWNoaW5nLiBBIHF1ZXJ5IG9uIGBjcWxfbWV0cmljc2AgdmlydHVhbCB0YWJsZSBsaXN0cyBiZWxvdyBtZXRyaWNzLgotCi0uLi4uCi1jcWxzaD4gc2VsZWN0ICogZnJvbSBzeXN0ZW1fdmlld3MuY3FsX21ldHJpY3MgOwotCi0gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLQotICAgIHByZXBhcmVkX3N0YXRlbWVudHNfY291bnQgfCAgICAgMAotICBwcmVwYXJlZF9zdGF0ZW1lbnRzX2V2aWN0ZWQgfCAgICAgMAotIHByZXBhcmVkX3N0YXRlbWVudHNfZXhlY3V0ZWQgfCAgICAgMAotICAgIHByZXBhcmVkX3N0YXRlbWVudHNfcmF0aW8gfCAgICAgMAotICByZWd1bGFyX3N0YXRlbWVudHNfZXhlY3V0ZWQgfCAgICAxNwotLi4uLgotCi09PT0gU2V0dGluZ3MgVmlydHVhbCBUYWJsZQotCi1UaGUgYHNldHRpbmdzYCB0YWJsZSBpcyByYXRoZXIgdXNlZnVsIGFuZCBsaXN0cyBhbGwgdGhlIGN1cnJlbnQKLWNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZnJvbSB0aGUgYGNhc3NhbmRyYS55YW1sYC4gVGhlIGVuY3J5cHRpb24gb3B0aW9ucwotYXJlIG92ZXJyaWRkZW4gdG8gaGlkZSB0aGUgc2Vuc2l0aXZlIHRydXN0c3RvcmUgaW5mb3JtYXRpb24gb3IKLXBhc3N3b3Jkcy4gVGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgaG93ZXZlciBjYW5ub3QgYmUgc2V0IHVzaW5nIERNTCBvbgotdGhlIHZpcnR1YWwgdGFibGUgcHJlc2VudGx5OiA6Ci0KLS4uLi4KLWNxbHNoOnN5c3RlbV92aWV3cz4gU0VMRUNUICogRlJPTSBzeXN0ZW1fdmlld3Muc2V0dGluZ3M7Ci0KLW5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHZhbHVlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGFsbG9jYXRlX3Rva2Vuc19mb3Jfa2V5c3BhY2UgICAgICAgfCBudWxsCi0gIGF1ZGl0X2xvZ2dpbmdfb3B0aW9uc19lbmFibGVkICAgICAgfCBmYWxzZQotICBhdXRvX3NuYXBzaG90ICAgICAgICAgICAgICAgICAgICAgIHwgdHJ1ZQotICBhdXRvbWF0aWNfc3N0YWJsZV91cGdyYWRlICAgICAgICAgIHwgZmFsc2UKLSAgY2x1c3Rlcl9uYW1lICAgICAgICAgICAgICAgICAgICAgICB8IFRlc3QgQ2x1c3RlcgotICB0cmFuc2llbnRfcmVwbGljYXRpb25fZW5hYmxlZCAgICAgIHwgZmFsc2UKLSAgaGludGVkX2hhbmRvZmZfZW5hYmxlZCAgICAgICAgICAgICB8IHRydWUKLSAgaGludHNfZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICB8IC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9kYXRhL2hpbnRzCi0gIGluY3JlbWVudGFsX2JhY2t1cHMgICAgICAgICAgICAgICAgfCBmYWxzZQotICBpbml0aWFsX3Rva2VuICAgICAgICAgICAgICAgICAgICAgIHwgbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgotICBycGNfYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgIHwgbG9jYWxob3N0Ci0gIHNzbF9zdG9yYWdlX3BvcnQgICAgICAgICAgICAgICAgICAgfCA3MDAxCi0gIHN0YXJ0X25hdGl2ZV90cmFuc3BvcnQgICAgICAgICAgICAgfCB0cnVlCi0gIHN0b3JhZ2VfcG9ydCAgICAgICAgICAgICAgICAgICAgICAgfCA3MDAwCi0gIHN0cmVhbV9lbnRpcmVfc3N0YWJsZXMgICAgICAgICAgICAgfCB0cnVlCi0gICgyMjQgcm93cykKLS4uLi4KLQotVGhlIGBzZXR0aW5nc2AgdGFibGUgY2FuIGJlIHJlYWxseSB1c2VmdWwgaWYgeWFtbCBmaWxlIGhhcyBiZWVuIGNoYW5nZWQKLXNpbmNlIHN0YXJ0dXAgYW5kIGRvbnQga25vdyBydW5uaW5nIGNvbmZpZ3VyYXRpb24sIG9yIHRvIGZpbmQgaWYgdGhleQotaGF2ZSBiZWVuIG1vZGlmaWVkIHZpYSBqbXgvbm9kZXRvb2wgb3IgdmlydHVhbCB0YWJsZXMuCi0KLT09PSBUaHJlYWQgUG9vbHMgVmlydHVhbCBUYWJsZQotCi1UaGUgYHRocmVhZF9wb29sc2AgdGFibGUgbGlzdHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIHRocmVhZCBwb29scy4KLVRocmVhZCBwb29sIGluZm9ybWF0aW9uIGluY2x1ZGVzIGFjdGl2ZSB0YXNrcywgYWN0aXZlIHRhc2tzIGxpbWl0LAotYmxvY2tlZCB0YXNrcywgYmxvY2tlZCB0YXNrcyBhbGwgdGltZSwgY29tcGxldGVkIHRhc2tzLCBhbmQgcGVuZGluZwotdGFza3MuIEEgcXVlcnkgb24gdGhlIGB0aHJlYWRfcG9vbHNgIHJldHVybnMgZm9sbG93aW5nIGRldGFpbHM6Ci0KLS4uLi4KLWNxbHNoOnN5c3RlbV92aWV3cz4gc2VsZWN0ICogZnJvbSBzeXN0ZW1fdmlld3MudGhyZWFkX3Bvb2xzOwotCi1uYW1lICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWN0aXZlX3Rhc2tzIHwgYWN0aXZlX3Rhc2tzX2xpbWl0IHwgYmxvY2tlZF90YXNrcyB8IGJsb2NrZWRfdGFza3NfYWxsX3RpbWUgfCBjb21wbGV0ZWRfdGFza3MgfCBwZW5kaW5nX3Rhc2tzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIEFudGlFbnRyb3B5U3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgQ2FjaGVDbGVhbnVwRXhlY3V0b3IgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICBDb21wYWN0aW9uRXhlY3V0b3IgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDg4MSB8ICAgICAgICAgICAgIDAKLSAgICAgICAgQ291bnRlck11dGF0aW9uU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgMzIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAgICAgR29zc2lwU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICBIaW50c0Rpc3BhdGNoZXIgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICBJbnRlcm5hbFJlc3BvbnNlU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgIE1lbXRhYmxlRmx1c2hXcml0ZXIgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgTWVtdGFibGVQb3N0Rmx1c2ggfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMiB8ICAgICAgICAgICAgIDAKLSAgICAgICBNZW10YWJsZVJlY2xhaW1NZW1vcnkgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAgTWlncmF0aW9uU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAgICAgICBNaXNjU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAgIE11dGF0aW9uU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgMzIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgIE5hdGl2ZS1UcmFuc3BvcnQtUmVxdWVzdHMgfCAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAgICAxMjggfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDEzMCB8ICAgICAgICAgICAgIDAKLSAgICAgIFBlbmRpbmdSYW5nZUNhbGN1bGF0b3IgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAKLVBlckRpc2tNZW10YWJsZUZsdXNoV3JpdGVyXzAgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMSB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAgICAgICBSZWFkU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgMzIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAxMyB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAgICAgUmVwYWlyLVRhc2sgfCAgICAgICAgICAgIDAgfCAgICAgICAgIDIxNDc0ODM2NDcgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgUmVxdWVzdFJlc3BvbnNlU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgICAgICAgICAgIFNhbXBsZXIgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICBTZWNvbmRhcnlJbmRleE1hbmFnZW1lbnQgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICBWYWxpZGF0aW9uRXhlY3V0b3IgfCAgICAgICAgICAgIDAgfCAgICAgICAgIDIxNDc0ODM2NDcgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgVmlld0J1aWxkRXhlY3V0b3IgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLSAgICAgICAgICAgVmlld011dGF0aW9uU3RhZ2UgfCAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgICAgMzIgfCAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgIDAKLS4uLi4KLQotKDI0IHJvd3MpCi0KLT09PSBJbnRlcm5vZGUgSW5ib3VuZCBNZXNzYWdpbmcgVmlydHVhbCBUYWJsZQotCi1UaGUgYGludGVybm9kZV9pbmJvdW5kYCB2aXJ0dWFsIHRhYmxlIGlzIGZvciB0aGUgaW50ZXJub2RlIGluYm91bmQKLW1lc3NhZ2luZy4gSW5pdGlhbGx5IG5vIGludGVybm9kZSBpbmJvdW5kIG1lc3NhZ2luZyBtYXkgZ2V0IGxpc3RlZC4gSW4KLWFkZGl0aW9uIHRvIHRoZSBhZGRyZXNzLCBwb3J0LCBkYXRhY2VudGVyIGFuZCByYWNrIGluZm9ybWF0aW9uIGluY2x1ZGVzCi1jb3JydXB0IGZyYW1lcyByZWNvdmVyZWQsIGNvcnJ1cHQgZnJhbWVzIHVucmVjb3ZlcmVkLCBlcnJvciBieXRlcywgZXJyb3IKLWNvdW50LCBleHBpcmVkIGJ5dGVzLCBleHBpcmVkIGNvdW50LCBwcm9jZXNzZWQgYnl0ZXMsIHByb2Nlc3NlZCBjb3VudCwKLXJlY2VpdmVkIGJ5dGVzLCByZWNlaXZlZCBjb3VudCwgc2NoZWR1bGVkIGJ5dGVzLCBzY2hlZHVsZWQgY291bnQsCi10aHJvdHRsZWQgY291bnQsIHRocm90dGxlZCBuYW5vcywgdXNpbmcgYnl0ZXMsIHVzaW5nIHJlc2VydmUgYnl0ZXMuIEEKLXF1ZXJ5IG9uIHRoZSBgaW50ZXJub2RlX2luYm91bmRgIHJldHVybnMgZm9sbG93aW5nIGRldGFpbHM6Ci0KLS4uLi4KLWNxbHNoOnN5c3RlbV92aWV3cz4gU0VMRUNUICogRlJPTSBzeXN0ZW1fdmlld3MuaW50ZXJub2RlX2luYm91bmQ7Ci1hZGRyZXNzIHwgcG9ydCB8IGRjIHwgcmFjayB8IGNvcnJ1cHRfZnJhbWVzX3JlY292ZXJlZCB8IGNvcnJ1cHRfZnJhbWVzX3VucmVjb3ZlcmVkIHwKLWVycm9yX2J5dGVzIHwgZXJyb3JfY291bnQgfCBleHBpcmVkX2J5dGVzIHwgZXhwaXJlZF9jb3VudCB8IHByb2Nlc3NlZF9ieXRlcyB8Ci1wcm9jZXNzZWRfY291bnQgfCByZWNlaXZlZF9ieXRlcyB8IHJlY2VpdmVkX2NvdW50IHwgc2NoZWR1bGVkX2J5dGVzIHwgc2NoZWR1bGVkX2NvdW50IHwgdGhyb3R0bGVkX2NvdW50IHwgdGhyb3R0bGVkX25hbm9zIHwgdXNpbmdfYnl0ZXMgfCB1c2luZ19yZXNlcnZlX2J5dGVzCi0tLS0tLS0tLS0rLS0tLS0tKy0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLQotLS0tLS0tLS0tLQotKDAgcm93cykKLS4uLi4KLQotPT09IFNTVGFibGVzIFRhc2tzIFZpcnR1YWwgVGFibGUKLQotVGhlIGBzc3RhYmxlX3Rhc2tzYCBjb3VsZCBiZSB1c2VkIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBydW5uaW5nCi10YXNrcy4gSXQgbGlzdHMgZm9sbG93aW5nIGNvbHVtbnM6Ci0KLS4uLi4KLWNxbHNoOnN5c3RlbV92aWV3cz4gU0VMRUNUICogRlJPTSBzc3RhYmxlX3Rhc2tzOwota2V5c3BhY2VfbmFtZSB8IHRhYmxlX25hbWUgfCB0YXNrX2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBraW5kICAgICAgIHwgcHJvZ3Jlc3MgfCB0b3RhbCAgICB8IHVuaXQKLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tCi0gICAgICAgYmFzaWMgfCAgICAgIHdpZGUyIHwgYzM5MDk3NDAtY2RmNy0xMWU5LWE4ZWQtMGYwM2RlMmQ5YWUxIHwgY29tcGFjdGlvbiB8IDYwNDE4NzYxIHwgNzA4ODIxMTAgfCBieXRlcwotICAgICAgIGJhc2ljIHwgICAgICB3aWRlMiB8IGM3NTU2NzcwLWNkZjctMTFlOS1hOGVkLTBmMDNkZTJkOWFlMSB8IGNvbXBhY3Rpb24gfCAgMjk5NTYyMyB8IDQwMzE0Njc5IHwgYnl0ZXMKLS4uLi4KLQotQXMgYW5vdGhlciBleGFtcGxlLCB0byBmaW5kIGhvdyBtdWNoIHRpbWUgaXMgcmVtYWluaW5nIGZvciBTU1RhYmxlCi10YXNrcywgdXNlIHRoZSBmb2xsb3dpbmcgcXVlcnk6Ci0KLS4uLi4KLVNFTEVDVCB0b3RhbCAtIHByb2dyZXNzIEFTIHJlbWFpbmluZwotRlJPTSBzeXN0ZW1fdmlld3Muc3N0YWJsZV90YXNrczsKLS4uLi4KLQotPT09IEdvc3NpcCBJbmZvcm1hdGlvbiBWaXJ0dWFsIFRhYmxlCi0KLVRoZSBgZ29zc2lwX2luZm9gIHZpcnR1YWwgdGFibGUgbGlzdHMgdGhlIEdvc3NpcCBpbmZvcm1hdGlvbiBmb3IgdGhlIGNsdXN0ZXIuIEFuIGV4YW1wbGUgcXVlcnkgaXMgYXMgZm9sbG93czoKLQotLi4uLgotY3Fsc2g+IHNlbGVjdCBhZGRyZXNzLCBwb3J0LCBnZW5lcmF0aW9uLCBoZWFydGJlYXQsIGxvYWQsIGRjLCByYWNrIGZyb20gc3lzdGVtX3ZpZXdzLmdvc3NpcF9pbmZvOwotCi0gYWRkcmVzcyAgIHwgcG9ydCB8IGdlbmVyYXRpb24gfCBoZWFydGJlYXQgfCBsb2FkICAgIHwgZGMgICAgICAgICAgfCByYWNrCi0tLS0tLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0KLSAxMjcuMC4wLjEgfCA3MDAwIHwgMTY0NTU3NTE0MCB8ICAgICAgIDMxMiB8IDcwNTQyLjAgfCBkYXRhY2VudGVyMSB8IHJhY2sxCi0gMTI3LjAuMC4yIHwgNzAwMCB8IDE2NDU1NzUxMzUgfCAgICAgICAzMTggfCA3MDQ5OS4wIHwgZGF0YWNlbnRlcjEgfCByYWNrMQotIDEyNy4wLjAuMyB8IDcwMDAgfCAxNjQ1NTc1MTQwIHwgICAgICAgMzEyIHwgNzA1MDQuMCB8IGRhdGFjZW50ZXIxIHwgcmFjazEKLSAxMjcuMC4wLjQgfCA3MDAwIHwgMTY0NTU3NTE0MSB8ICAgICAgIDMxMSB8IDcwNTAyLjAgfCBkYXRhY2VudGVyMSB8IHJhY2sxCi0gMTI3LjAuMC41IHwgNzAwMCB8IDE2NDU1NzUxMzYgfCAgICAgICAzMTUgfCA3MDUwMC4wIHwgZGF0YWNlbnRlcjEgfCByYWNrMQotCi0oNSByb3dzKQotLi4uLgotCi09PT0gT3RoZXIgVmlydHVhbCBUYWJsZXMKLQotU29tZSBleGFtcGxlcyBvZiB1c2luZyBvdGhlciB2aXJ0dWFsIHRhYmxlcyBhcmUgYXMgZm9sbG93cy4KLQotRmluZCB0YWJsZXMgd2l0aCBtb3N0IGRpc2sgdXNhZ2U6Ci0KLS4uLi4KLWNxbHNoPiBTRUxFQ1QgKiBGUk9NIGRpc2tfdXNhZ2UgV0hFUkUgbWViaWJ5dGVzID4gMSBBTExPVyBGSUxURVJJTkc7Ci0KLWtleXNwYWNlX25hbWUgfCB0YWJsZV9uYW1lIHwgbWViaWJ5dGVzCi0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tCi0gICBrZXlzcGFjZTEgfCAgc3RhbmRhcmQxIHwgICAgICAgMjg4Ci0gIHRscF9zdHJlc3MgfCAgIGtleXZhbHVlIHwgICAgICAzMjExCi0uLi4uCi0KLUZpbmQgcXVlcmllcyBvbiB0YWJsZS9zIHdpdGggZ3JlYXRlc3QgcmVhZCBsYXRlbmN5OgotCi0uLi4uCi1jcWxzaD4gU0VMRUNUICogRlJPTSAgbG9jYWxfcmVhZF9sYXRlbmN5IFdIRVJFIHBlcl9zZWNvbmQgPiAxIEFMTE9XIEZJTFRFUklORzsKLQota2V5c3BhY2VfbmFtZSB8IHRhYmxlX25hbWUgfCBwNTB0aF9tcyB8IHA5OXRoX21zIHwgY291bnQgICAgfCBtYXhfbXMgIHwgcGVyX3NlY29uZAotLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0tCi0gIHRscF9zdHJlc3MgfCAgIGtleXZhbHVlIHwgICAgMC4wNDMgfCAgICAwLjE1MiB8IDQ5Nzg1MTU4IHwgMTg2LjU2MyB8ICAxMTQxOC4zNTYKLS4uLi4KLQotCi09PSBFeGFtcGxlCi0KLVthcmFiaWMsIHN0YXJ0PTFdCi0uIFRvIGxpc3QgdGhlIGtleXNwYWNlcywgZW50ZXIgYGBjcWxzaGBgIGFuZCBydW4gdGhlIENRTCBjb21tYW5kIGBgREVTQ1JJQkUgS0VZU1BBQ0VTYGA6Ci0KLVtzb3VyY2UsIGNxbF0KLS0tLS0KLWNxbHNoPiBERVNDIEtFWVNQQUNFUzsKLXN5c3RlbV9zY2hlbWEgIHN5c3RlbSAgICAgICAgICBzeXN0ZW1fZGlzdHJpYnV0ZWQgIHN5c3RlbV92aXJ0dWFsX3NjaGVtYQotc3lzdGVtX2F1dGggICAgc3lzdGVtX3RyYWNlcyAgIHN5c3RlbV92aWV3cwotLS0tLQotCi1bYXJhYmljLCBzdGFydD0yXQotLiBUbyB2aWV3IHRoZSB2aXJ0dWFsIHRhYmxlIHNjaGVtYSwgcnVuIHRoZSBDUUwgY29tbWFuZHMgYGBVU0Ugc3lzdGVtX3ZpcnR1YWxfc2NoZW1hYGAgYW5kIGBgU0VMRUNUICogRlJPTSB0YWJsZXNgYDoKLQotW3NvdXJjZSwgY3FsXQotLS0tLQotY3Fsc2g+IFVTRSBzeXN0ZW1fdmlydHVhbF9zY2hlbWE7Ci1jcWxzaD4gU0VMRUNUICogRlJPTSB0YWJsZXM7Ci0tLS0tCi0gCi1yZXN1bHRzIGluOgotCi1bc291cmNlLCBjcWxdCi0tLS0tCi0ga2V5c3BhY2VfbmFtZSAgICAgICAgIHwgdGFibGVfbmFtZSAgICAgICAgICAgICAgICB8IGNvbW1lbnQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgICAgICAgICBjYWNoZXMgfCAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSBjYWNoZXMKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgICAgICBjbGllbnRzIHwgICAgICAgICAgY3VycmVudGx5IGNvbm5lY3RlZCBjbGllbnRzCi0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgIGNvb3JkaW5hdG9yX3JlYWRfbGF0ZW5jeSB8Ci0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgIGNvb3JkaW5hdG9yX3NjYW5fbGF0ZW5jeSB8Ci0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgY29vcmRpbmF0b3Jfd3JpdGVfbGF0ZW5jeSB8Ci0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgICAgZGlza191c2FnZSB8Ci0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICBpbnRlcm5vZGVfaW5ib3VuZCB8Ci0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgIGludGVybm9kZV9vdXRib3VuZCB8Ci0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgIGxvY2FsX3JlYWRfbGF0ZW5jeSB8Ci0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgIGxvY2FsX3NjYW5fbGF0ZW5jeSB8Ci0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgbG9jYWxfd3JpdGVfbGF0ZW5jeSB8Ci0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgIG1heF9wYXJ0aXRpb25fc2l6ZSB8Ci0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgcm93c19wZXJfcmVhZCB8Ci0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgICAgICBzZXR0aW5ncyB8ICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBzZXR0aW5ncwotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgIHNzdGFibGVfdGFza3MgfCAgICAgICAgICAgICAgICBjdXJyZW50IHNzdGFibGUgdGFza3MKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgIHN5c3RlbV9wcm9wZXJ0aWVzIHwgQ2Fzc2FuZHJhIHJlbGV2YW50IHN5c3RlbSBwcm9wZXJ0aWVzCi0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgIHRocmVhZF9wb29scyB8Ci0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgdG9tYnN0b25lc19wZXJfcmVhZCB8Ci0gc3lzdGVtX3ZpcnR1YWxfc2NoZW1hIHwgICAgICAgICAgICAgICAgICAgY29sdW1ucyB8ICAgICAgICAgICB2aXJ0dWFsIGNvbHVtbiBkZWZpbml0aW9ucwotIHN5c3RlbV92aXJ0dWFsX3NjaGVtYSB8ICAgICAgICAgICAgICAgICBrZXlzcGFjZXMgfCAgICAgICAgIHZpcnR1YWwga2V5c3BhY2UgZGVmaW5pdGlvbnMKLSBzeXN0ZW1fdmlydHVhbF9zY2hlbWEgfCAgICAgICAgICAgICAgICAgICAgdGFibGVzIHwgICAgICAgICAgICB2aXJ0dWFsIHRhYmxlIGRlZmluaXRpb25zCi0KLSgyMSByb3dzKQotLS0tLQotCi1bYXJhYmljLCBzdGFydD0zXQotLiBUbyB2aWV3IHRoZSB2aXJ0dWFsIHRhYmxlcywgcnVuIHRoZSBDUUwgY29tbWFuZHMgYGBVU0Ugc3lzdGVtX3ZpZXdgYCBhbmQgYGBERVNDUklCRSB0YWJsZXNgYDoKLQotW3NvdXJjZSwgY3FsXQotLS0tLQotY3Fsc2g+IFVTRSBzeXN0ZW1fdmlldzs7Ci1jcWxzaD4gREVTQ1JJQkUgdGFibGVzOwotLS0tLQotCi1yZXN1bHRzIGluOgotCi1bc291cmNlLCBjcWxdCi0tLS0tCi1zc3RhYmxlX3Rhc2tzICAgICAgIGNsaWVudHMgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0b3Jfd3JpdGVfbGF0ZW5jeQotZGlza191c2FnZSAgICAgICAgICBsb2NhbF93cml0ZV9sYXRlbmN5ICAgICAgIHRvbWJzdG9uZXNfcGVyX3JlYWQKLXRocmVhZF9wb29scyAgICAgICAgaW50ZXJub2RlX291dGJvdW5kICAgICAgICBzZXR0aW5ncwotbG9jYWxfc2Nhbl9sYXRlbmN5ICBjb29yZGluYXRvcl9zY2FuX2xhdGVuY3kgIHN5c3RlbV9wcm9wZXJ0aWVzCi1pbnRlcm5vZGVfaW5ib3VuZCAgIGNvb3JkaW5hdG9yX3JlYWRfbGF0ZW5jeSAgbWF4X3BhcnRpdGlvbl9zaXplCi1sb2NhbF9yZWFkX2xhdGVuY3kgIHJvd3NfcGVyX3JlYWQgICAgICAgICAgICAgY2FjaGVzCi0tLS0tCi0KLVthcmFiaWMsIHN0YXJ0PTRdCi0uIFRvIGxvb2sgYXQgYW55IHRhYmxlIGRhdGEsIHJ1biB0aGUgQ1FMIGNvbW1hbmQgYGBTRUxFQ1RgYDoKLQotW3NvdXJjZSwgY3FsXQotLS0tLQotY3Fsc2g+IFVTRSBzeXN0ZW1fdmlldzs7Ci1jcWxzaD4gU0VMRUNUICogRlJPTSBjbGllbnRzIExJTUlUIDI7Ci0tLS0tCi0gcmVzdWx0cyBpbjoKLQotW3NvdXJjZSwgY3FsXQotLS0tLQotIGFkZHJlc3MgICB8IHBvcnQgIHwgY29ubmVjdGlvbl9zdGFnZSB8IGRyaXZlcl9uYW1lICAgICAgICAgICAgfCBkcml2ZXJfdmVyc2lvbiB8IGhvc3RuYW1lICB8IHByb3RvY29sX3ZlcnNpb24gfCByZXF1ZXN0X2NvdW50IHwgc3NsX2NpcGhlcl9zdWl0ZSB8IHNzbF9lbmFibGVkIHwgc3NsX3Byb3RvY29sIHwgdXNlcm5hbWUKLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KLSAxMjcuMC4wLjEgfCAzNzMwOCB8ICAgICAgICAgICAgcmVhZHkgfCBEYXRhU3RheCBQeXRob24gRHJpdmVyIHwgICAzLjIxLjAucG9zdDAgfCBsb2NhbGhvc3QgfCAgICAgICAgICAgICAgICA0IHwgICAgICAgICAgICAxNyB8ICAgICAgICAgICAgIG51bGwgfCAgICAgICBGYWxzZSB8ICAgICAgICAgbnVsbCB8IGFub255bW91cwotIDEyNy4wLjAuMSB8IDM3MzEwIHwgICAgICAgICAgICByZWFkeSB8IERhdGFTdGF4IFB5dGhvbiBEcml2ZXIgfCAgIDMuMjEuMC5wb3N0MCB8IGxvY2FsaG9zdCB8ICAgICAgICAgICAgICAgIDQgfCAgICAgICAgICAgICA4IHwgICAgICAgICAgICAgbnVsbCB8ICAgICAgIEZhbHNlIHwgICAgICAgICBudWxsIHwgYW5vbnltb3VzCi0KLSgyIHJvd3MpCi0tLS0tCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2F1ZGl0bG9nZ2luZy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9hdWRpdGxvZ2dpbmcuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3OTkyMS4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2F1ZGl0bG9nZ2luZy5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsNDc1ICswLDAgQEAKLT0gQXVkaXQgTG9nZ2luZwotCi1BdWRpdCBMb2dnaW5nIGlzIGEgbmV3IGZlYXR1cmUgaW4gQXBhY2hlIENhc3NhbmRyYSA0LjAgKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTEyMTUxW0NBU1NBTkRSQS0xMjE1MV0pLgotVGhpcyBuZXcgZmVhdHVyZSBpcyBzYWZlIGZvciBwcm9kdWN0aW9uIHVzZSwgd2l0aCBjb25maWd1cmFibGUgbGltaXRzIHRvIGhlYXAgbWVtb3J5IGFuZCBkaXNrIHNwYWNlIHRvIHByZXZlbnQgb3V0LW9mLW1lbW9yeSBlcnJvcnMuCi1BbGwgZGF0YWJhc2UgYWN0aXZpdHkgaXMgbG9nZ2VkIHBlci1ub2RlIGFzIGZpbGUtYmFzZWQgcmVjb3JkcyB0byBhIHNwZWNpZmllZCBsb2NhbCBmaWxlc3lzdGVtIGRpcmVjdG9yeS4gCi1UaGUgYXVkaXQgbG9nIGZpbGVzIGFyZSByb2xsZWQgcGVyaW9kaWNhbGx5IGJhc2VkIG9uIGEgY29uZmlndXJhYmxlIHZhbHVlLiAKLQotU29tZSBvZiB0aGUgZmVhdHVyZXMgb2YgYXVkaXQgbG9nZ2luZyBhcmU6Ci0KLSogTm8gYWRkaXRpb25hbCBkYXRhYmFzZSBjYXBhY2l0eSBpcyBuZWVkZWQgdG8gc3RvcmUgYXVkaXQgbG9ncy4KLSogTm8gcXVlcnkgdG9vbCBpcyByZXF1aXJlZCB0byBzdG9yZSB0aGUgYXVkaXQgbG9ncy4KLSogTGF0ZW5jeSBvZiBkYXRhYmFzZSBvcGVyYXRpb25zIGlzIG5vdCBhZmZlY3RlZCwgc28gdGhlcmUgaXMgbm8gcGVyZm9ybWFuY2UgaW1wYWN0LgotKiBIZWFwIG1lbW9yeSB1c2FnZSBpcyBib3VuZGVkIGJ5IGEgd2VpZ2h0ZWQgcXVldWUsIHdpdGggY29uZmlndXJhYmxlIG1heGltdW0gd2VpZ2h0IHNpdHRpbmcgaW4gZnJvbnQgb2YgbG9nZ2luZyB0aHJlYWQuCi0qIERpc2sgdXRpbGl6YXRpb24gaXMgYm91bmRlZCBieSBhIGNvbmZpZ3VyYWJsZSBzaXplLCBkZWxldGluZyBvbGQgbG9nIHNlZ21lbnRzIG9uY2UgdGhlIGxpbWl0IGlzIHJlYWNoZWQuCi0qIENhbiBiZSBlbmFibGVkLCBkaXNhYmxlZCwgb3IgcmVzZXQgKHRvIGRlbGV0ZSBvbi1kaXNrIGRhdGEpIHVzaW5nIHRoZSBKTVggdG9vbCwgYGBub2RldG9vbGBgLgotKiBDYW4gY29uZmlndXJlIHRoZSBzZXR0aW5ncyBpbiBlaXRoZXIgdGhlIGBjYXNzYW5kcmEueWFtbGAgZmlsZSBvciBieSB1c2luZyBgYG5vZGV0b29sYGAuCi0KLUF1ZGl0IGxvZ2dpbmcgaW5jbHVkZXMgYWxsIENRTCByZXF1ZXN0cywgYm90aCBzdWNjZXNzZnVsIGFuZCBmYWlsZWQuIAotSXQgYWxzbyBjYXB0dXJlcyBhbGwgc3VjY2Vzc2Z1bCBhbmQgZmFpbGVkIGF1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uIGV2ZW50cywgc3VjaCBhcyBsb2dpbiBhdHRlbXB0cy4gCi1UaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIEZ1bGwgUXVlcnkgTG9nZ2luZyAoRlFMKSBhbmQgYXVkaXQgbG9nZ2luZyBpcyB0aGF0IEZRTCBjYXB0dXJlcyBvbmx5IHN1Y2Nlc3NmdWwgQ1FMIHJlcXVlc3RzLCB3aGljaCBhbGxvdyByZXBsYXkgb3IgY29tcGFyaXNvbiBvZiBsb2dzLgotQXVkaXQgbG9ncyBhcmUgdXNlZnVsIGZvciBjb21wbGlhbmNlIGFuZCBkZWJ1Z2dpbmcsIHdoaWxlIEZRTCBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZywgcGVyZm9ybWFuY2UgYmVuY2htYXJraW5nLCB0ZXN0aW5nIGFuZCBhdWRpdGluZyBDUUwgcXVlcmllcy4KLQotPT0gQXVkaXQgaW5mb3JtYXRpb24gbG9nZ2VkCi0KLVRoZSBhdWRpdCBsb2cgY29udGFpbnM6Ci0KLSogYWxsIGV2ZW50cyBpbiB0aGUgY29uZmlndXJlZCBrZXlzcGFjZXMgdG8gaW5jbHVkZQotKiBhbGwgZXZlbnRzIGluIHRoZSBjb25maWd1cmVkIGNhdGVnb3JpZXMgdG8gaW5jbHVkZQotKiBhbGwgZXZlbnRzIGV4ZWN1dGVkIGJ5IHRoZSBjb25maWd1cmVkIHVzZXJzIHRvIGluY2x1ZGUKLQotVGhlIGF1ZGl0IGxvZyBkb2VzIG5vdCBjb250YWluOgotCi0qIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBtYWRlIGluIGBjYXNzYW5kcmEueWFtbGAgZmlsZQotKiBgbm9kZXRvb2xgIGNvbW1hbmRzCi0qIFBhc3N3b3JkcyBtZW50aW9uZWQgYXMgcGFydCBvZiBEQ0wgc3RhdGVtZW50czogUGFzc3dvcmRzIHdpbGwgYmUgb2JmdXNjYXRlZCBhcyBcKlwqXCpcKlwqXCpcKi4KLSAqKiBTdGF0ZW1lbnRzIHRoYXQgZmFpbCB0byBwYXJzZSB3aWxsIGhhdmUgZXZlcnl0aGluZyBhZnRlciB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgd29yZCBwYXNzd29yZCBvYmZ1c2NhdGVkIGFzIFwqXCpcKlwqXCpcKlwqLgotICoqIFN0YXRlbWVudHMgd2l0aCBhIG1pc3R5cGVkIHdvcmQgJ3Bhc3N3b3JkJyB3aWxsIGJlIGxvZ2dlZCB3aXRob3V0IG9iZnVzY2F0aW9uLiBQbGVhc2UgbWFrZSBzdXJlIHRvIHVzZSBhIGRpZmZlcmVudCBwYXNzd29yZCBvbiByZXRyaWVzLgotCi1UaGUgYXVkaXQgbG9nIGlzIGEgc2VyaWVzIG9mIGxvZyBlbnRyaWVzLiAKLUFuIGF1ZGl0IGxvZyBlbnRyeSBjb250YWluczoKLQotKiBrZXlzcGFjZSAoU3RyaW5nKSAtIEtleXNwYWNlIG9uIHdoaWNoIHJlcXVlc3QgaXMgbWFkZQotKiBvcGVyYXRpb24gKFN0cmluZykgLSBEYXRhYmFzZSBvcGVyYXRpb24gc3VjaCBhcyBDUUwgY29tbWFuZAotKiB1c2VyIChTdHJpbmcpIC0gVXNlciBuYW1lCi0qIHNjb3BlIChTdHJpbmcpIC0gU2NvcGUgb2YgcmVxdWVzdCBzdWNoIGFzIFRhYmxlL0Z1bmN0aW9uL0FnZ3JlZ2F0ZSBuYW1lCi0qIHR5cGUgKEF1ZGl0TG9nRW50cnlUeXBlKSAtIFR5cGUgb2YgcmVxdWVzdAotKiogQ1FMIEF1ZGl0IExvZyBFbnRyeSBUeXBlCi0qKiBDb21tb24gQXVkaXQgTG9nIEVudHJ5IFR5cGUKLSogc291cmNlIChJbmV0QWRkcmVzc0FuZFBvcnQpIC0gU291cmNlIElQIEFkZHJlc3MgZnJvbSB3aGljaCByZXF1ZXN0IG9yaWdpbmF0ZWQKLSogdGltZXN0YW1wIChsb25nICkgLSBUaW1lc3RhbXAgb2YgdGhlIHJlcXVlc3QKLSogYmF0Y2ggKFVVSUQpIC0gQmF0Y2ggb2YgcmVxdWVzdAotKiBvcHRpb25zIChRdWVyeU9wdGlvbnMpIC0gQ1FMIFF1ZXJ5IG9wdGlvbnMKLSogc3RhdGUgKFF1ZXJ5U3RhdGUpIC0gU3RhdGUgcmVsYXRlZCB0byBhIGdpdmVuIHF1ZXJ5Ci0KLUVhY2ggZW50cnkgY29udGFpbnMgYWxsIGFwcGxpY2FibGUgYXR0cmlidXRlcyBmb3IgdGhlIGdpdmVuIGV2ZW50LCBjb25jYXRlbmF0ZWQgd2l0aCBhIHBpcGUgKHwpLgotCi1DUUwgYXVkaXQgbG9nIGVudHJ5IHR5cGVzIGFyZSB0aGUgZm9sbG93aW5nIENRTCBjb21tYW5kcy4gRWFjaCBjb21tYW5kIGlzIGFzc2lnbmVkIHRvIGEgcGFydGljdWxhciBzcGVjaWZpZWQgY2F0ZWdvcnkgdG8gbG9nOgotCi1bd2lkdGg9IjEwMCUiLGNvbHM9IjIwJSw4MCUiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfCBDYXRlZ29yeSB8IENRTCBjb21tYW5kcwotCi18IERETCB8IEFMVEVSX0tFWVNQQUNFLCBDUkVBVEVfS0VZU1BBQ0UsIERST1BfS0VZU1BBQ0UsIAotQUxURVJfVEFCTEUsIENSRUFURV9UQUJMRSwgRFJPUF9UQUJMRSwgCi1DUkVBVEVfRlVOQ1RJT04sIERST1BfRlVOQ1RJT04sIAotQ1JFQVRFX0FHR1JFR0FURSwgRFJPUF9BR0dSRUdBVEUsIAotQ1JFQVRFX0lOREVYLCBEUk9QX0lOREVYLCAKLUFMVEVSX1RZUEUsIENSRUFURV9UWVBFLCBEUk9QX1RZUEUsCi1DUkVBVEVfVFJJR0dFUiwgRFJPUF9UUklHR0VSLAotQUxURVJfVklFVywgQ1JFQVRFX1ZJRVcsIERST1BfVklFVywKLVRSVU5DQVRFCi18IERNTCB8IEJBVENILCBERUxFVEUsIFVQREFURQotfCBEQ0wgfCBHUkFOVCwgUkVWT0tFLCAKLUFMVEVSX1JPTEUsIENSRUFURV9ST0xFLCBEUk9QX1JPTEUsIAotTElTVF9ST0xFUywgTElTVF9QRVJNSVNTSU9OUywgTElTVF9VU0VSUwotfCBPVEhFUiB8IFVTRV9LRVlTUEFDRQotfCBRVUVSWSB8IFNFTEVDVAotfCBQUkVQQVJFIHwgUFJFUEFSRV9TVEFURU1FTlQKLXw9PT0KLQotQ29tbW9uIGF1ZGl0IGxvZyBlbnRyeSB0eXBlcyBhcmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0KLVt3aWR0aD0iMTAwJSIsY29scz0iNTAlLDUwJSIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18IENhdGVnb3J5IHwgQ1FMIGNvbW1hbmRzCi0KLXwgQVVUSCB8IExPR0lOX1NVQ0NFU1MsIExPR0lOX0VSUk9SLCBVTkFVVEhPUklaRURfQVRURU1QVAotfCBFUlJPUiB8IFJFUVVFU1RfRkFJTFVSRQotfD09PQotCi09PSBDb25maWd1cmluZyBhdWRpdCBsb2dnaW5nIGluIGNhc3NhbmRyYS55YW1sCi0KLVRoZSBgY2Fzc2FuZHJhLnlhbWxgIGZpbGUgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIGFuZCBlbmFibGUgYXVkaXQgbG9nZ2luZy4KLUNvbmZpZ3VyYXRpb24gYW5kIGVuYWJsZW1lbnQgbWF5IGJlIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBvbiBlYWNoIG5vZGUsIGRlcGVuZGluZyBvbiB0aGUgYGNhc3NhbmRyYS55YW1sYCBmaWxlIHNldHRpbmdzLgotQXVkaXQgbG9ncyBhcmUgZ2VuZXJhdGVkIG9uIGVhY2ggZW5hYmxlZCBub2RlLCBzbyBsb2dzIG9uIGVhY2ggbm9kZSB3aWxsIGhhdmUgdGhhdCBub2RlJ3MgcXVlcmllcy4KLUFsbCBvcHRpb25zIGZvciBhdWRpdCBsb2dnaW5nIGNhbiBiZSBzZXQgaW4gdGhlIGBjYXNzYW5kcmEueWFtbGAgZmlsZSB1bmRlciB0aGUgYGBhdWRpdF9sb2dnaW5nX29wdGlvbnM6YGAuCi0KLVRoZSBmaWxlIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB0aGF0IGNhbiBiZSB1bmNvbW1lbnRlZCBmb3IgdXNlOgotCi1bc291cmNlLCB5YW1sXQotLS0tLQotIyBBdWRpdCBsb2dnaW5nIC0gTG9ncyBldmVyeSBpbmNvbWluZyBDUUwgY29tbWFuZCByZXF1ZXN0LCBhdXRoZW50aWNhdGlvbiB0byBhIG5vZGUuIFNlZSB0aGUgZG9jcwotIyBvbiBhdWRpdF9sb2dnaW5nIGZvciBmdWxsIGRldGFpbHMgYWJvdXQgdGhlIHZhcmlvdXMgY29uZmlndXJhdGlvbiBvcHRpb25zLgotYXVkaXRfbG9nZ2luZ19vcHRpb25zOgotICAgIGVuYWJsZWQ6IGZhbHNlCi0gICAgbG9nZ2VyOgotICAgICAgLSBjbGFzc19uYW1lOiBCaW5BdWRpdExvZ2dlcgotICAgICMgYXVkaXRfbG9nc19kaXI6Ci0gICAgIyBpbmNsdWRlZF9rZXlzcGFjZXM6Ci0gICAgIyBleGNsdWRlZF9rZXlzcGFjZXM6IHN5c3RlbSwgc3lzdGVtX3NjaGVtYSwgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hCi0gICAgIyBpbmNsdWRlZF9jYXRlZ29yaWVzOgotICAgICMgZXhjbHVkZWRfY2F0ZWdvcmllczoKLSAgICAjIGluY2x1ZGVkX3VzZXJzOgotICAgICMgZXhjbHVkZWRfdXNlcnM6Ci0gICAgIyByb2xsX2N5Y2xlOiBIT1VSTFkKLSAgICAjIGJsb2NrOiB0cnVlCi0gICAgIyBtYXhfcXVldWVfd2VpZ2h0OiAyNjg0MzU0NTYgIyAyNTYgTWlCCi0gICAgIyBtYXhfbG9nX3NpemU6IDE3MTc5ODY5MTg0ICMgMTYgR2lCCi0gICAgIyMgYXJjaGl2ZSBjb21tYW5kIGlzICIvcGF0aC90by9zY3JpcHQuc2ggJXBhdGgiIHdoZXJlICVwYXRoIGlzIHJlcGxhY2VkIHdpdGggdGhlIGZpbGUgYmVpbmcgcm9sbGVkOgotICAgICMgYXJjaGl2ZV9jb21tYW5kOgotICAgICMgbWF4X2FyY2hpdmVfcmV0cmllczogMTAKLS0tLS0KLQotPT09IGVuYWJsZWQKLQotQXVkaXQgbG9nZ2luZyBpcyBlbmFibGVkIGJ5IHNldHRpbmcgdGhlIGBlbmFibGVkYCBvcHRpb24gdG8gYHRydWVgIGluCi10aGUgYGF1ZGl0X2xvZ2dpbmdfb3B0aW9uc2Agc2V0dGluZy4gCi1JZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCBhdWRpdCBsb2dnaW5nIHdpbGwgc3RhcnQgd2hlbiBDYXNzYW5kcmEgaXMgc3RhcnRlZC4KLUZvciBleGFtcGxlLCBgYGVuYWJsZWQ6IHRydWVgYC4KLQotPT09IGxvZ2dlcgotCi1UaGUgdHlwZSBvZiBhdWRpdCBsb2dnZXIgaXMgc2V0IHdpdGggdGhlIGBsb2dnZXJgIG9wdGlvbi4gCi1TdXBwb3J0ZWQgdmFsdWVzIGFyZTogYEJpbkF1ZGl0TG9nZ2VyYCAoZGVmYXVsdCksIGBGaWxlQXVkaXRMb2dnZXJgIGFuZCBgTm9PcEF1ZGl0TG9nZ2VyYC4KLWBCaW5BdWRpdExvZ2dlcmAgbG9ncyBldmVudHMgdG8gYSBmaWxlIGluIGJpbmFyeSBmb3JtYXQuIAotYEZpbGVBdWRpdExvZ2dlcmAgdXNlcyB0aGUgc3RhbmRhcmQgbG9nZ2luZyBtZWNoYW5pc20sIGBzbGY0amAgdG8gbG9nIGV2ZW50cyB0byB0aGUgYGF1ZGl0L2F1ZGl0LmxvZ2AgZmlsZS4gSXQgaXMgYSBzeW5jaHJvbm91cywgZmlsZS1iYXNlZCBhdWRpdCBsb2dnZXIuIFRoZSByb2xsX2N5Y2xlIHdpbGwgYmUgc2V0IGluIHRoZSBgbG9nYmFjay54bWxgIGZpbGUuCi1gTm9PcEF1ZGl0TG9nZ2VyYCBpcyBhIG5vLW9wIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhdWRpdCBsb2dnZXIgdGhhdCBzaG91ZGwgYmUgc3BlY2lmaWVkIHdoZW4gYXVkaXQgbG9nZ2luZyBpcyBkaXNhYmxlZC4KLQotRm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2UsIHlhbWxdCi0tLS0tCi1sb2dnZXI6IAotICAtIGNsYXNzX25hbWU6IEZpbGVBdWRpdExvZ2dlcgotLS0tLQotCi09PT0gYXVkaXRfbG9nc19kaXIKLQotVG8gd3JpdGUgYXVkaXQgbG9ncywgYW4gZXhpc3RpbmcgZGlyZWN0b3J5IG11c3QgYmUgc2V0IGluIGBgYXVkaXRfbG9nc19kaXJgYC4KLQotVGhlIGRpcmVjdG9yeSBtdXN0IGhhdmUgYXBwcm9wcmlhdGUgcGVybWlzc2lvbnMgc2V0IHRvIGFsbG93IHJlYWRpbmcsIHdyaXRpbmcsIGFuZCBleGVjdXRpbmcuCi1Mb2dnaW5nIHdpbGwgcmVjdXJzaXZlbHkgZGVsZXRlIHRoZSBkaXJlY3RvcnkgY29udGVudHMgYXMgbmVlZGVkLgotRG8gbm90IHBsYWNlIGxpbmtzIGluIHRoaXMgZGlyZWN0b3J5IHRvIG90aGVyIHNlY3Rpb25zIG9mIHRoZSBmaWxlc3lzdGVtLgotRm9yIGV4YW1wbGUsIGBgYXVkaXRfbG9nc19kaXI6IC9jYXNzYW5kcmEvYXVkaXQvbG9ncy9ob3VybHlgYC4KLQotVGhlIGF1ZGl0IGxvZyBkaXJlY3RvcnkgY2FuIGFsc28gYmUgY29uZmlndXJlZCB1c2luZyB0aGUgc3lzdGVtIHByb3BlcnR5IGBjYXNzYW5kcmEubG9nZGlyLmF1ZGl0YCwgd2hpY2ggYnkgZGVmYXVsdCBpcyBzZXQgdG8gYGNhc3NhbmRyYS5sb2dkaXIgKyAvYXVkaXQvYC4KLQotPT09IGluY2x1ZGVkX2tleXNwYWNlcyBhbmQgZXhjbHVkZWRfa2V5c3BhY2VzCi0KLVNldCB0aGUga2V5c3BhY2VzIHRvIGluY2x1ZGUgd2l0aCB0aGUgYGluY2x1ZGVkX2tleXNwYWNlc2Agb3B0aW9uIGFuZAotdGhlIGtleXNwYWNlcyB0byBleGNsdWRlIHdpdGggdGhlIGBleGNsdWRlZF9rZXlzcGFjZXNgIG9wdGlvbi4gCi1CeSBkZWZhdWx0LCBgc3lzdGVtYCwgYHN5c3RlbV9zY2hlbWFgIGFuZCBgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hYCBhcmUgZXhjbHVkZWQsIGFuZCBhbGwgb3RoZXIga2V5c3BhY2VzIGFyZSBpbmNsdWRlZC4KLQotRm9yIGV4YW1wbGU6Ci1bc291cmNlLCB5YW1sXQotLS0tLQotaW5jbHVkZWRfa2V5c3BhY2VzOiB0ZXN0LCBkZW1vCi1leGNsdWRlZF9rZXlzcGFjZXM6IHN5c3RlbSwgc3lzdGVtX3NjaGVtYSwgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hCi0tLS0tCi0KLT09PSBpbmNsdWRlZF9jYXRlZ29yaWVzIGFuZCBleGNsdWRlZF9jYXRlZ29yaWVzCi0KLVRoZSBjYXRlZ29yaWVzIG9mIGRhdGFiYXNlIG9wZXJhdGlvbnMgdG8gaW5jbHVkZSBhcmUgc3BlY2lmaWVkIHdpdGggdGhlIGBpbmNsdWRlZF9jYXRlZ29yaWVzYCBvcHRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4gCi1UaGUgY2F0ZWdvcmllcyBvZiBkYXRhYmFzZSBvcGVyYXRpb25zIHRvIGV4Y2x1ZGUgYXJlIHNwZWNpZmllZCB3aXRoIGBleGNsdWRlZF9jYXRlZ29yaWVzYCBvcHRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4gCi1UaGUgc3VwcG9ydGVkIGNhdGVnb3JpZXMgZm9yIGF1ZGl0IGxvZyBhcmU6IGBBVVRIYCwgYERDTGAsIGBERExgLCBgRE1MYCwgYEVSUk9SYCwgYE9USEVSYCwgYFBSRVBBUkVgLCBhbmQgYFFVRVJZYC4KLUJ5IGRlZmF1bHQgYWxsIHN1cHBvcnRlZCBjYXRlZ29yaWVzIGFyZSBpbmNsdWRlZCwgYW5kIG5vIGNhdGVnb3J5IGlzIGV4Y2x1ZGVkLiAKLQotW3NvdXJjZSwgeWFtbF0KLS0tLS0KLWluY2x1ZGVkX2NhdGVnb3JpZXM6IEFVVEgsIEVSUk9SLCBEQ0wKLWV4Y2x1ZGVkX2NhdGVnb3JpZXM6IERETCwgRE1MLCBRVUVSWSwgUFJFUEFSRQotLS0tLQotCi09PT0gaW5jbHVkZWRfdXNlcnMgYW5kIGV4Y2x1ZGVkX3VzZXJzCi0KLVVzZXJzIHRvIGF1ZGl0IGxvZyBhcmUgc2V0IHdpdGggdGhlIGBpbmNsdWRlZF91c2Vyc2AgYW5kIGBleGNsdWRlZF91c2Vyc2Agb3B0aW9ucy4gCi1UaGUgYGluY2x1ZGVkX3VzZXJzYCBvcHRpb24gc3BlY2lmaWVzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdXNlcnMgdG8gaW5jbHVkZSBleHBsaWNpdGx5LgotVGhlIGBleGNsdWRlZF91c2Vyc2Agb3B0aW9uIHNwZWNpZmllcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHVzZXJzIHRvIGV4Y2x1ZGUgZXhwbGljaXRseS4KLUJ5IGRlZmF1bHQgYWxsIHVzZXJzIGFyZSBpbmNsdWRlZCwgYW5kIG5vIHVzZXJzIGFyZSBleGNsdWRlZC4gCi0KLVtzb3VyY2UsIHlhbWxdCi0tLS0tCi1pbmNsdWRlZF91c2VyczogCi1leGNsdWRlZF91c2Vyczogam9obiwgbWFyeQotLS0tLQotCi09PT0gcm9sbF9jeWNsZQotCi1UaGUgYGByb2xsX2N5Y2xlYGAgZGVmaW5lcyB0aGUgZnJlcXVlbmN5IHdpdGggd2hpY2ggdGhlIGF1ZGl0IGxvZyBzZWdtZW50cyBhcmUgcm9sbGVkLgotU3VwcG9ydGVkIHZhbHVlcyBhcmUgYGBIT1VSTFlgYCAoZGVmYXVsdCksIGBgTUlOVVRFTFlgYCwgYW5kIGBgREFJTFlgYC4KLUZvciBleGFtcGxlOiBgYHJvbGxfY3ljbGU6IERBSUxZYGAKLQotPT09IGJsb2NrCi0KLVRoZSBgYGJsb2NrYGAgb3B0aW9uIHNwZWNpZmllcyB3aGV0aGVyIGF1ZGl0IGxvZ2dpbmcgc2hvdWxkIGJsb2NrIHdyaXRpbmcgb3IgZHJvcCBsb2cgcmVjb3JkcyBpZiB0aGUgYXVkaXQgbG9nZ2luZyBmYWxscyBiZWhpbmQuIFN1cHBvcnRlZCBib29sZWFuIHZhbHVlcyBhcmUgYGB0cnVlYGAgKGRlZmF1bHQpIG9yIGBgZmFsc2VgYC4KLUZvciBleGFtcGxlOiBgYGJsb2NrOiBmYWxzZWBgIHRvIGRyb3AgcmVjb3JkcwotCi09PT0gbWF4X3F1ZXVlX3dlaWdodAotCi1UaGUgYGBtYXhfcXVldWVfd2VpZ2h0YGAgb3B0aW9uIHNldHMgdGhlIG1heGltdW0gd2VpZ2h0IG9mIGluLW1lbW9yeSBxdWV1ZSBmb3IgcmVjb3JkcyB3YWl0aW5nIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGZpbGUgYmVmb3JlIGJsb2NraW5nIG9yIGRyb3BwaW5nLiAgVGhlIG9wdGlvbiBtdXN0IGJlIHNldCB0byBhIHBvc2l0aXZlIHZhbHVlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAyNjg0MzU0NTYsIG9yIDI1NiBNaUIuCi1Gb3IgZXhhbXBsZSwgdG8gY2hhbmdlIHRoZSBkZWZhdWx0OiBgYG1heF9xdWV1ZV93ZWlnaHQ6IDEzNDIxNzcyOCAjIDEyOCBNaUJgYAotCi09PT0gbWF4X2xvZ19zaXplCi0KLVRoZSBgYG1heF9sb2dfc2l6ZWBgIG9wdGlvbiBzZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHJvbGxlZCBmaWxlcyB0byByZXRhaW4gb24gZGlzayBiZWZvcmUgZGVsZXRpbmcgdGhlIG9sZGVzdCBmaWxlLiAgVGhlIG9wdGlvbiBtdXN0IGJlIHNldCB0byBhIHBvc2l0aXZlIHZhbHVlLiBUaGUgZGVmYXVsdCBpcyAxNzE3OTg2OTE4NCwgb3IgMTYgR2lCLgotRm9yIGV4YW1wbGUsIHRvIGNoYW5nZSB0aGUgZGVmYXVsdDogYGBtYXhfbG9nX3NpemU6IDM0MzU5NzM4MzY4ICMgMzIgR2lCYGAKLQotPT09IGFyY2hpdmVfY29tbWFuZAotCi1UaGUgYGBhcmNoaXZlX2NvbW1hbmRgYCBvcHRpb24gc2V0cyB0aGUgdXNlci1kZWZpbmVkIGFyY2hpdmUgc2NyaXB0IHRvIGV4ZWN1dGUgb24gcm9sbGVkIGxvZyBmaWxlcy4KLUZvciBleGFtcGxlOiBgYGFyY2hpdmVfY29tbWFuZDogL3Vzci9sb2NhbC9iaW4vYXJjaGl2ZWl0LnNoICVwYXRoICMgJXBhdGggaXMgdGhlIGZpbGUgYmVpbmcgcm9sbGVkYGAKLQotPT09IG1heF9hcmNoaXZlX3JldHJpZXMKLQotVGhlIGBgbWF4X2FyY2hpdmVfcmV0cmllc2BgIG9wdGlvbiBzZXRzIHRoZSBtYXggbnVtYmVyIG9mIHJldHJpZXMgb2YgZmFpbGVkIGFyY2hpdmUgY29tbWFuZHMuIFRoZSBkZWZhdWx0IGlzIDEwLgotRm9yIGV4YW1wbGU6IGBgbWF4X2FyY2hpdmVfcmV0cmllczogMTBgYAotCi0KLUFuIGF1ZGl0IGxvZyBmaWxlIGNvdWxkIGdldCByb2xsZWQgZm9yIG90aGVyIHJlYXNvbnMgYXMgd2VsbCBzdWNoIGFzIGEKLWxvZyBmaWxlIHJlYWNoZXMgdGhlIGNvbmZpZ3VyZWQgc2l6ZSB0aHJlc2hvbGQuCi0KLUF1ZGl0IGxvZ2dpbmcgY2FuIGFsc28gYmUgY29uZmlndXJlZCB1c2luZyBgYG5vZGV0b29sYCB3aGVuIGVuYWJsaW5nIHRoZSBmZWF0dXJlLCBhbmQgd2lsbCBvdmVycmlkZSBhbnkgdmFsdWVzIHNldCBpbiB0aGUgYGNhc3NhbmRyYS55YW1sYCBmaWxlLCBhcyBkaXNjdXNzZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4KLQotCi09PSBFbmFibGluZyBBdWRpdCBMb2dnaW5nIHdpdGggYGBub2RldG9vbGBgCi0gCi1BdWRpdCBsb2dnaW5nIGlzIGVuYWJsZWQgb24gYSBwZXItbm9kZSBiYXNpcyB1c2luZyB0aGUgYGBub2RldG9vbCBlbmFibGVhdWRpdGxvZ2BgIGNvbW1hbmQuIFRoZSBsb2dnaW5nIGRpcmVjdG9yeSBtdXN0IGJlIGRlZmluZWQgd2l0aCBgYGF1ZGl0X2xvZ3NfZGlyYGAgaW4gdGhlIGBjYXNzYW5kcmEueWFtbGAgZmlsZSBvciB1c2VzIHRoZSBkZWZhdWx0IHZhbHVlIGBgY2Fzc2FuZHJhLmxvZ2Rpci5hdWRpdGBgLgotCi1UaGUgc3ludGF4IG9mIHRoZSBgYG5vZGV0b29sIGVuYWJsZWF1ZGl0bG9nYGAgY29tbWFuZCBoYXMgYWxsIHRoZSBzYW1lIG9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IGluIHRoZSBgYGNhc3NhbmRyYS55YW1sYGAgZmlsZSBleGNlcHQgYGBhdWRpdF9sb2dzX2RpcmBgLgotSW4gYWRkaXRpb24sIGBgbm9kZXRvb2xgYCBoYXMgb3B0aW9ucyB0byBzZXQgd2hpY2ggaG9zdCBhbmQgcG9ydCB0byBydW4gdGhlIGNvbW1hbmQgb24sIGFuZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQgaWYgdGhlIGNvbW1hbmQgcmVxdWlyZXMgYXV0aGVudGljYXRpb24uCi0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLSAgICAgICBub2RldG9vbCBbKC1oIDxob3N0PiB8IC0taG9zdCA8aG9zdD4pXSBbKC1wIDxwb3J0PiB8IC0tcG9ydCA8cG9ydD4pXQotICAgICAgICAgICAgICAgIFsoLXBwIHwgLS1wcmludC1wb3J0KV0gWygtcHcgPHBhc3N3b3JkPiB8IC0tcGFzc3dvcmQgPHBhc3N3b3JkPildCi0gICAgICAgICAgICAgICAgWygtcHdmIDxwYXNzd29yZEZpbGVQYXRoPiB8IC0tcGFzc3dvcmQtZmlsZSA8cGFzc3dvcmRGaWxlUGF0aD4pXQotICAgICAgICAgICAgICAgIFsoLXUgPHVzZXJuYW1lPiB8IC0tdXNlcm5hbWUgPHVzZXJuYW1lPildIGVuYWJsZWF1ZGl0bG9nCi0gICAgICAgICAgICAgICAgWy0tZXhjbHVkZWQtY2F0ZWdvcmllcyA8ZXhjbHVkZWRfY2F0ZWdvcmllcz5dCi0gICAgICAgICAgICAgICAgWy0tZXhjbHVkZWQta2V5c3BhY2VzIDxleGNsdWRlZF9rZXlzcGFjZXM+XQotICAgICAgICAgICAgICAgIFstLWV4Y2x1ZGVkLXVzZXJzIDxleGNsdWRlZF91c2Vycz5dCi0gICAgICAgICAgICAgICAgWy0taW5jbHVkZWQtY2F0ZWdvcmllcyA8aW5jbHVkZWRfY2F0ZWdvcmllcz5dCi0gICAgICAgICAgICAgICAgWy0taW5jbHVkZWQta2V5c3BhY2VzIDxpbmNsdWRlZF9rZXlzcGFjZXM+XQotICAgICAgICAgICAgICAgIFstLWluY2x1ZGVkLXVzZXJzIDxpbmNsdWRlZF91c2Vycz5dIFstLWxvZ2dlciA8bG9nZ2VyPl0KLQotT1BUSU9OUwotICAgICAgICAtLWV4Y2x1ZGVkLWNhdGVnb3JpZXMgPGV4Y2x1ZGVkX2NhdGVnb3JpZXM+Ci0gICAgICAgICAgICBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBBdWRpdCBMb2cgQ2F0ZWdvcmllcyB0byBiZSBleGNsdWRlZCBmb3IKLSAgICAgICAgICAgIGF1ZGl0IGxvZy4gSWYgbm90IHNldCB0aGUgdmFsdWUgZnJvbSBjYXNzYW5kcmEueWFtbCB3aWxsIGJlIHVzZWQKLQotICAgICAgICAtLWV4Y2x1ZGVkLWtleXNwYWNlcyA8ZXhjbHVkZWRfa2V5c3BhY2VzPgotICAgICAgICAgICAgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Yga2V5c3BhY2VzIHRvIGJlIGV4Y2x1ZGVkIGZvciBhdWRpdCBsb2cuIElmCi0gICAgICAgICAgICBub3Qgc2V0IHRoZSB2YWx1ZSBmcm9tIGNhc3NhbmRyYS55YW1sIHdpbGwgYmUgdXNlZAotCi0gICAgICAgIC0tZXhjbHVkZWQtdXNlcnMgPGV4Y2x1ZGVkX3VzZXJzPgotICAgICAgICAgICAgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdXNlcnMgdG8gYmUgZXhjbHVkZWQgZm9yIGF1ZGl0IGxvZy4gSWYgbm90Ci0gICAgICAgICAgICBzZXQgdGhlIHZhbHVlIGZyb20gY2Fzc2FuZHJhLnlhbWwgd2lsbCBiZSB1c2VkCi0KLSAgICAgICAgLWggPGhvc3Q+LCAtLWhvc3QgPGhvc3Q+Ci0gICAgICAgICAgICBOb2RlIGhvc3RuYW1lIG9yIGlwIGFkZHJlc3MKLQotICAgICAgICAtLWluY2x1ZGVkLWNhdGVnb3JpZXMgPGluY2x1ZGVkX2NhdGVnb3JpZXM+Ci0gICAgICAgICAgICBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBBdWRpdCBMb2cgQ2F0ZWdvcmllcyB0byBiZSBpbmNsdWRlZCBmb3IKLSAgICAgICAgICAgIGF1ZGl0IGxvZy4gSWYgbm90IHNldCB0aGUgdmFsdWUgZnJvbSBjYXNzYW5kcmEueWFtbCB3aWxsIGJlIHVzZWQKLQotICAgICAgICAtLWluY2x1ZGVkLWtleXNwYWNlcyA8aW5jbHVkZWRfa2V5c3BhY2VzPgotICAgICAgICAgICAgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Yga2V5c3BhY2VzIHRvIGJlIGluY2x1ZGVkIGZvciBhdWRpdCBsb2cuIElmCi0gICAgICAgICAgICBub3Qgc2V0IHRoZSB2YWx1ZSBmcm9tIGNhc3NhbmRyYS55YW1sIHdpbGwgYmUgdXNlZAotCi0gICAgICAgIC0taW5jbHVkZWQtdXNlcnMgPGluY2x1ZGVkX3VzZXJzPgotICAgICAgICAgICAgQ29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdXNlcnMgdG8gYmUgaW5jbHVkZWQgZm9yIGF1ZGl0IGxvZy4gSWYgbm90Ci0gICAgICAgICAgICBzZXQgdGhlIHZhbHVlIGZyb20gY2Fzc2FuZHJhLnlhbWwgd2lsbCBiZSB1c2VkCi0KLSAgICAgICAgLS1sb2dnZXIgPGxvZ2dlcj4KLSAgICAgICAgICAgIExvZ2dlciBuYW1lIHRvIGJlIHVzZWQgZm9yIEF1ZGl0TG9nZ2luZy4gRGVmYXVsdCBCaW5BdWRpdExvZ2dlci4gSWYKLSAgICAgICAgICAgIG5vdCBzZXQgdGhlIHZhbHVlIGZyb20gY2Fzc2FuZHJhLnlhbWwgd2lsbCBiZSB1c2VkCi0KLSAgICAgICAgLXAgPHBvcnQ+LCAtLXBvcnQgPHBvcnQ+Ci0gICAgICAgICAgICBSZW1vdGUgam14IGFnZW50IHBvcnQgbnVtYmVyCi0KLSAgICAgICAgLXBwLCAtLXByaW50LXBvcnQKLSAgICAgICAgICAgIE9wZXJhdGUgaW4gNC4wIG1vZGUgd2l0aCBob3N0cyBkaXNhbWJpZ3VhdGVkIGJ5IHBvcnQgbnVtYmVyCi0KLSAgICAgICAgLXB3IDxwYXNzd29yZD4sIC0tcGFzc3dvcmQgPHBhc3N3b3JkPgotICAgICAgICAgICAgUmVtb3RlIGpteCBhZ2VudCBwYXNzd29yZAotCi0gICAgICAgIC1wd2YgPHBhc3N3b3JkRmlsZVBhdGg+LCAtLXBhc3N3b3JkLWZpbGUgPHBhc3N3b3JkRmlsZVBhdGg+Ci0gICAgICAgICAgICBQYXRoIHRvIHRoZSBKTVggcGFzc3dvcmQgZmlsZQotCi0gICAgICAgIC11IDx1c2VybmFtZT4sIC0tdXNlcm5hbWUgPHVzZXJuYW1lPgotICAgICAgICAgICAgUmVtb3RlIGpteCBhZ2VudCB1c2VybmFtZQotLS0tLQotCi1UbyBlbmFibGUgYXVkaXQgbG9nZ2luZywgcnVuIGZvbGxvd2luZyBjb21tYW5kIG9uIGVhY2ggbm9kZSBpbiB0aGUgY2x1c3RlciBvbiB3aGljaCB5b3Ugd2FudCB0byBlbmFibGUgbG9nZ2luZzoKLQotW3NvdXJjZSwgYmFzaF0KLS0tLS0KLSQgbm9kZXRvb2wgZW5hYmxlYXVkaXRsb2cKLS0tLS0KLQotPT0gRGlzYWJsaW5nIGF1ZGl0IGxvZ2dpbmcKLQotVXNlIHRoZSBgbm9kZXRvb2wgZGlzYWJsZWF1ZGl0bG9nYCBjb21tYW5kIHRvIGRpc2FibGUgYXVkaXQgbG9nZ2luZy4gCi0KLT09IFZpZXdpbmcgYXVkaXQgbG9ncwotCi1UaGUgYGF1ZGl0bG9ndmlld2VyYCB0b29sIGlzIHVzZWQgdG8gdmlldyAoZHVtcCkgYXVkaXQgbG9ncyBpZiB0aGUgbG9nZ2VyIHdhcyBgYEJpbkF1ZGl0TG9nZ2VyYGAuLiAKLWBgYXVkaXRsb2d2aWV3ZXJgYCBjb252ZXJ0cyB0aGUgYmluYXJ5IGxvZyBmaWxlcyBpbnRvIGh1bWFuLXJlYWRhYmxlIGZvcm1hdDsgb25seSB0aGUgYXVkaXQgbG9nIGRpcmVjdG9yeSBtdXN0IGJlIHN1cHBsaWVkIGFzIGEgY29tbWFuZC1saW5lIG9wdGlvbi4KLUlmIHRoZSBsb2dnZXIgYGBGaWxlQXVkaXRMb2dnZXJgYCB3YXMgc2V0LCB0aGUgbG9nIGZpbGUgYXJlIGFscmVhZHkgaW4gaHVtYW4tcmVhZGFibGUgZm9ybWF0IGFuZCBgYGF1ZGl0bG9ndmlld2VyYGAgaXMgbm90IG5lZWRlZCB0byByZWFkIGZpbGVzLiAKLQotCi1UaGUgc3ludGF4IG9mIGBhdWRpdGxvZ3ZpZXdlcmAgaXM6Ci0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLWF1ZGl0bG9ndmlld2VyCi0KLUF1ZGl0IGxvZyBmaWxlcyBkaXJlY3RvcnkgcGF0aCBpcyBhIHJlcXVpcmVkIGFyZ3VtZW50LgotdXNhZ2U6IGF1ZGl0bG9ndmlld2VyIDxwYXRoMT4gWzxwYXRoMj4uLi48cGF0aE4+XSBbb3B0aW9uc10KLS0tCi1WaWV3IHRoZSBhdWRpdCBsb2cgY29udGVudHMgaW4gaHVtYW4gcmVhZGFibGUgZm9ybWF0Ci0tLQotT3B0aW9ucyBhcmU6Ci0tZiwtLWZvbGxvdyAgICAgICBVcG9uIHJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGxvZyBjb250aW51ZSBpbmRlZmluaXRlbHkKLSAgICAgICAgICAgICAgICAgIHdhaXRpbmcgZm9yIG1vcmUgcmVjb3JkcwotLWgsLS1oZWxwICAgICAgICAgZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZQotLXIsLS1yb2xsX2N5Y2xlICAgSG93IG9mdGVuIHRvIHJvbGwgdGhlIGxvZyBmaWxlIHdhcyByb2xsZWQuIE1heSBiZQotICAgICAgICAgICAgICAgICAgbmVjZXNzYXJ5IGZvciBDaHJvbmljbGUgdG8gY29ycmVjdGx5IHBhcnNlIGZpbGUgbmFtZXMuIChNSU5VVEVMWSwgSE9VUkxZLAotICAgICAgICAgICAgICAgICAgREFJTFkpLiBEZWZhdWx0IEhPVVJMWS4KLS0tLS0KLQotPT0gRXhhbXBsZQotCi1bYXJhYmljLCBzdGFydD0xXQotLiBUbyBkZW1vbnN0cmF0ZSBhdWRpdCBsb2dnaW5nLCBmaXJzdCBjb25maWd1cmUgdGhlIGBgY2Fzc2FuZHJhLnlhbWxgYCBmaWxlIHdpdGggdGhlIGZvbGxvd2luZyBzZXR0aW5nczoKLQotW3NvdXJjZSwgeWFtbF0KLS0tLS0KLWF1ZGl0X2xvZ2dpbmdfb3B0aW9uczoKLSAgIGVuYWJsZWQ6IHRydWUKLSAgIGxvZ2dlcjogQmluQXVkaXRMb2dnZXIKLSAgIGF1ZGl0X2xvZ3NfZGlyOiAiL2Nhc3NhbmRyYS9hdWRpdC9sb2dzL2hvdXJseSIKLSAgICMgaW5jbHVkZWRfa2V5c3BhY2VzOgotICAgIyBleGNsdWRlZF9rZXlzcGFjZXM6IHN5c3RlbSwgc3lzdGVtX3NjaGVtYSwgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hCi0gICAjIGluY2x1ZGVkX2NhdGVnb3JpZXM6Ci0gICAjIGV4Y2x1ZGVkX2NhdGVnb3JpZXM6Ci0gICAjIGluY2x1ZGVkX3VzZXJzOgotICAgIyBleGNsdWRlZF91c2VyczoKLSAgIHJvbGxfY3ljbGU6IEhPVVJMWQotICAgIyBibG9jazogdHJ1ZQotICAgIyBtYXhfcXVldWVfd2VpZ2h0OiAyNjg0MzU0NTYgIyAyNTYgTWlCCi0gICAjIG1heF9sb2dfc2l6ZTogMTcxNzk4NjkxODQgIyAxNiBHaUIKLSAgICMjIGFyY2hpdmUgY29tbWFuZCBpcyAiL3BhdGgvdG8vc2NyaXB0LnNoICVwYXRoIiB3aGVyZSAlcGF0aCBpcyByZXBsYWNlZCB3aXRoIHRoZSBmaWxlIGJlaW5nIHJvbGxlZDoKLSAgICMgYXJjaGl2ZV9jb21tYW5kOgotICAgIyBtYXhfYXJjaGl2ZV9yZXRyaWVzOiAxMAotLS0tLQotCi1bYXJhYmljLCBzdGFydD0yXQotLiBDcmVhdGUgdGhlIGF1ZGl0IGxvZyBkaXJlY3RvcnkgYC9jYXNzYW5kcmEvYXVkaXQvbG9ncy9ob3VybHlgIGFuZCBzZXQgdGhlIGRpcmVjdG9yeSBwZXJtaXNzaW9ucyB0byByZWFkLCB3cml0ZSwgYW5kIGV4ZWN1dGUgZm9yIGFsbC4gCi0KLVthcmFiaWMsIHN0YXJ0PTNdCi0uIE5vdyBjcmVhdGUgYSBkZW1vIGtleXNwYWNlIGFuZCB0YWJsZSBhbmQgaW5zZXJ0IHNvbWUgZGF0YSB1c2luZyBgYGNxbHNoYGA6Ci0KLVtzb3VyY2UsIGNxbF0KLS0tLS0KLSBjcWxzaD4gQ1JFQVRFIEtFWVNQQUNFIGF1ZGl0bG9na2V5c3BhY2UKLSAgIC4uLiBXSVRIIHJlcGxpY2F0aW9uID0geydjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogMX07Ci0gY3Fsc2g+IFVTRSBhdWRpdGxvZ2tleXNwYWNlOwotIGNxbHNoOmF1ZGl0bG9na2V5c3BhY2U+IENSRUFURSBUQUJMRSB0ICgKLSAuLi5pZCBpbnQsCi0gLi4uayBpbnQsCi0gLi4udiB0ZXh0LAotIC4uLlBSSU1BUlkgS0VZIChpZCkKLSAuLi4gKTsKLSBjcWxzaDphdWRpdGxvZ2tleXNwYWNlPiBJTlNFUlQgSU5UTyB0IChpZCwgaywgdikgVkFMVUVTICgwLCAwLCAndmFsMCcpOwotIGNxbHNoOmF1ZGl0bG9na2V5c3BhY2U+IElOU0VSVCBJTlRPIHQgKGlkLCBrLCB2KSBWQUxVRVMgKDAsIDEsICd2YWwxJyk7Ci0tLS0tCi0KLUFsbCB0aGUgc3VwcG9ydGVkIENRTCBjb21tYW5kcyB3aWxsIGJlIGxvZ2dlZCB0byB0aGUgYXVkaXQgbG9nIGRpcmVjdG9yeS4KLQotW2FyYWJpYywgc3RhcnQ9NF0KLS4gQ2hhbmdlIGRpcmVjdG9yeSB0byB0aGUgYXVkaXQgbG9ncyBkaXJlY3RvcnkuCi0KLVtzb3VyY2UsIGJhc2hdCi0tLS0tCi0kIGNkIC9jYXNzYW5kcmEvYXVkaXQvbG9ncy9ob3VybHkKLS0tLS0KLQotW2FyYWJpYywgc3RhcnQ9NV0KLS4gTGlzdCB0aGUgYXVkaXQgbG9nIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4gCi0KLVtzb3VyY2UsIGJhc2hdCi0tLS0tCi0kIGxzIC1sCi0tLS0tCi0KLVlvdSBzaG91bGQgc2VlIHJlc3VsdHMgc2ltaWxhciB0bzoKLQotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotdG90YWwgMjgKLS1ydy1ydy1yLS0uIDEgZWMyLXVzZXIgZWMyLXVzZXIgICAgNjU1MzYgQXVnICAyIDAzOjAxIGRpcmVjdG9yeS1saXN0aW5nLmNxNHQKLS1ydy1ydy1yLS0uIDEgZWMyLXVzZXIgZWMyLXVzZXIgODM4ODYwODAgQXVnICAyIDAzOjAxIDIwMTkwODAyLTAyLmNxNAotLXJ3LXJ3LXItLS4gMSBlYzItdXNlciBlYzItdXNlciA4Mzg4NjA4MCBBdWcgIDIgMDM6MDEgMjAxOTA4MDItMDMuY3E0Ci0tLS0tCi0KLVRoZSBhdWRpdCBsb2cgZmlsZXMgd2lsbCBhbGwgYmUgbGlzdGVkIHdpdGggYSBgLmNxNGAgZmlsZSB0eXBlLiBUaGUgYXVkaXQgZGlyZWN0b3J5IGlzIG9mIGAuY3E0dGAgdHlwZS4KLQotW2FyYWJpYywgc3RhcnQ9Nl0KLS4gUnVuIGBhdWRpdGxvZ3ZpZXdlcmAgdG9vbCB0byB2aWV3IHRoZSBhdWRpdCBsb2dzLiAKLQotW3NvdXJjZSwgYmFzaF0KLS0tLS0KLSQgYXVkaXRsb2d2aWV3ZXIgL2Nhc3NhbmRyYS9hdWRpdC9sb2dzL2hvdXJseQotLS0tLQotCi1UaGlzIGNvbW1hbmQgd2lsbCByZXR1cm4gYSByZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBsb2cuIEhlcmUgaXMgYSBwYXJ0aWFsIHNhbXBsZSBvZiB0aGUgbG9nIGZvciB0aGUgY29tbWFuZHMgaW4gdGhpcyBkZW1vOgotCi1bc291cmNlLCBwbGFpbnRleHRdCi0tLS0tCi1XQVJOICAwMzoxMjoxMSwxMjQgVXNpbmcgUGF1c2VyLnNsZWVweSgpIGFzIG5vdCBlbm91Z2ggcHJvY2Vzc29ycywgaGF2ZSAyLCBuZWVkcyA4KwotVHlwZTogQXVkaXRMb2cKLUxvZ01lc3NhZ2U6Ci11c2VyOmFub255bW91c3xob3N0OjEwLjAuMi4yMzg6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjQ2MjY0fHRpbWVzdGFtcDoxNTY0NzExNDI3MzI4fHR5cGUgOlVTRV9LRVlTUEFDRXxjYXRlZ29yeTpPVEhFUnxrczphdWRpdGxvZ2tleXNwYWNlfG9wZXJhdGlvbjpVU0UgQXVkaXRMb2dLZXlzcGFjZTsKLVR5cGU6IEF1ZGl0TG9nCi1Mb2dNZXNzYWdlOgotdXNlcjphbm9ueW1vdXN8aG9zdDoxMC4wLjIuMjM4OjcwMDB8c291cmNlOi8xMjcuMC4wLjF8cG9ydDo0NjI2NHx0aW1lc3RhbXA6MTU2NDcxMTQyNzMyOXx0eXBlIDpVU0VfS0VZU1BBQ0V8Y2F0ZWdvcnk6T1RIRVJ8a3M6YXVkaXRsb2drZXlzcGFjZXxvcGVyYXRpb246VVNFICJhdWRpdGxvZ2tleXNwYWNlIgotVHlwZTogQXVkaXRMb2cKLUxvZ01lc3NhZ2U6Ci11c2VyOmFub255bW91c3xob3N0OjEwLjAuMi4yMzg6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjQ2MjY0fHRpbWVzdGFtcDoxNTY0NzExNDQ2Mjc5fHR5cGUgOlNFTEVDVHxjYXRlZ29yeTpRVUVSWXxrczphdWRpdGxvZ2tleXNwYWNlfHNjb3BlOnR8b3BlcmF0aW9uOlNFTEVDVCAqIEZST00gdDsKLVR5cGU6IEF1ZGl0TG9nCi1Mb2dNZXNzYWdlOgotdXNlcjphbm9ueW1vdXN8aG9zdDoxMC4wLjIuMjM4OjcwMDB8c291cmNlOi8xMjcuMC4wLjF8cG9ydDo0NjI2NHx0aW1lc3RhbXA6MTU2NDcxMzg3ODgzNHx0eXBlIDpEUk9QX1RBQkxFfGNhdGVnb3J5OkRETHxrczphdWRpdGxvZ2tleXNwYWNlfHNjb3BlOnR8b3BlcmF0aW9uOkRST1AgVEFCTEUgSUYgRVhJU1RTCi1BdWRpdExvZ0tleXNwYWNlLnQ7Ci1UeXBlOiBBdWRpdExvZwotTG9nTWVzc2FnZToKLXVzZXI6YW5vbnltb3VzfGhvc3Q6MTAuMC4yLjIzODo3MDAwfHNvdXJjZTovMy45MS41Ni4xNjR8cG9ydDo0MjM4Mnx0aW1lc3RhbXA6MTU2NDcxNDYxODM2MHx0eQotcGU6UkVRVUVTVF9GQUlMVVJFfGNhdGVnb3J5OkVSUk9SfG9wZXJhdGlvbjpDUkVBVEUgS0VZU1BBQ0UgQXVkaXRMb2dLZXlzcGFjZQotV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJyA6IDF9OzsgQ2Fubm90IGFkZAotZXhpc3Rpbmcga2V5c3BhY2UgImF1ZGl0bG9na2V5c3BhY2UiCi1UeXBlOiBBdWRpdExvZwotTG9nTWVzc2FnZToKLXVzZXI6YW5vbnltb3VzfGhvc3Q6MTAuMC4yLjIzODo3MDAwfHNvdXJjZTovMTI3LjAuMC4xfHBvcnQ6NDYyNjR8dGltZXN0YW1wOjE1NjQ3MTQ2OTA5Njh8dHlwZSA6RFJPUF9LRVlTUEFDRXxjYXRlZ29yeTpEREx8a3M6YXVkaXRsb2drZXlzcGFjZXxvcGVyYXRpb246RFJPUCBLRVlTUEFDRSBBdWRpdExvZ0tleXNwYWNlOwotVHlwZTogQXVkaXRMb2cKLUxvZ01lc3NhZ2U6Ci11c2VyOmFub255bW91c3xob3N0OjEwLjAuMi4yMzg6NzAwMHxzb3VyY2U6LzMuOTEuNTYuMTY0fHBvcnQ6NDI0MDZ8dGltZXN0YW1wOjE1NjQ3MTQ3MDgzMjl8dHkgcGU6Q1JFQVRFX0tFWVNQQUNFfGNhdGVnb3J5OkRETHxrczphdWRpdGxvZ2tleXNwYWNlfG9wZXJhdGlvbjpDUkVBVEUgS0VZU1BBQ0UKLUF1ZGl0TG9nS2V5c3BhY2UKLVdJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3RvcicgOiAxfTsKLVR5cGU6IEF1ZGl0TG9nCi1Mb2dNZXNzYWdlOgotdXNlcjphbm9ueW1vdXN8aG9zdDoxMC4wLjIuMjM4OjcwMDB8c291cmNlOi8xMjcuMC4wLjF8cG9ydDo0NjI2NHx0aW1lc3RhbXA6MTU2NDcxNDg3MDY3OHx0eXBlIDpVU0VfS0VZU1BBQ0V8Y2F0ZWdvcnk6T1RIRVJ8a3M6YXVkaXRsb2drZXlzcGFjZXxvcGVyYXRpb246VVNFIGF1ZGl0bG9na2V5c3BhY2U7Ci0KLVBhc3N3b3JkIG9iZnVzY2F0aW9uIGV4YW1wbGVzOgotTG9nTWVzc2FnZTogdXNlcjpjYXNzYW5kcmF8aG9zdDpsb2NhbGhvc3QvMTI3LjAuMC4xOjcwMDB8c291cmNlOi8xMjcuMC4wLjF8cG9ydDo2NTI4Mnx0aW1lc3RhbXA6MTYyMjYzMDQ5NjcwOHx0eXBlOkNSRUFURV9ST0xFfGNhdGVnb3J5OkRDTHxvcGVyYXRpb246Q1JFQVRFIFJPTEUgcm9sZTEgV0lUSCBQQVNTV09SRCA9ICcqKioqKioqJzsKLVR5cGU6IGF1ZGl0Ci1Mb2dNZXNzYWdlOiB1c2VyOmNhc3NhbmRyYXxob3N0OmxvY2FsaG9zdC8xMjcuMC4wLjE6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjY1MjgyfHRpbWVzdGFtcDoxNjIyNjMwNjM0NTUyfHR5cGU6QUxURVJfUk9MRXxjYXRlZ29yeTpEQ0x8b3BlcmF0aW9uOkFUTEVSIFJPTEUgcm9sZTEgV0lUSCBQQVNTV09SRCA9ICcqKioqKioqJzsKLVR5cGU6IGF1ZGl0Ci1Mb2dNZXNzYWdlOiB1c2VyOmNhc3NhbmRyYXxob3N0OmxvY2FsaG9zdC8xMjcuMC4wLjE6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjY1MjgyfHRpbWVzdGFtcDoxNjIyNjMwNjk4Njg2fHR5cGU6Q1JFQVRFX1JPTEV8Y2F0ZWdvcnk6RENMfG9wZXJhdGlvbjpDUkVBVEUgVVNFUiB1c2VyMSBXSVRIIFBBU1NXT1JEICcqKioqKioqJzsKLVR5cGU6IGF1ZGl0Ci1Mb2dNZXNzYWdlOiB1c2VyOmNhc3NhbmRyYXxob3N0OmxvY2FsaG9zdC8xMjcuMC4wLjE6NzAwMHxzb3VyY2U6LzEyNy4wLjAuMXxwb3J0OjY1MjgyfHRpbWVzdGFtcDoxNjIyNjMwNzQ3MzQ0fHR5cGU6QUxURVJfUk9MRXxjYXRlZ29yeTpEQ0x8b3BlcmF0aW9uOkFMVEVSIFVTRVIgdXNlcjEgV0lUSCBQQVNTV09SRCAnKioqKioqKic7Ci0tLS0tCi0KLT09IERpYWdub3N0aWMgZXZlbnRzIGZvciB1c2VyIGF1ZGl0IGxvZ2dpbmcKLQotQW55IG5hdGl2ZSB0cmFuc3BvcnQtZW5hYmxlZCBjbGllbnQgY2FuIHN1YnNjcmliZSB0byBhdWRpdCBsb2cgZXZlbnRzIGZvciBkaWFnbm9zaW5nIGNsdXN0ZXIgaXNzdWVzLgotVGhlc2UgZXZlbnRzIGNhbiBiZSBjb25zdW1lZCBieSBleHRlcm5hbCB0b29scyB0byBpbXBsZW1lbnQgYSBDYXNzYW5kcmEgdXNlciBhdWRpdGluZyBzb2x1dGlvbi4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvYmFja3Vwcy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9iYWNrdXBzLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODNkNWIuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy9iYWNrdXBzLmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MTcgKzAsMCBAQAotPSBCYWNrdXBzCi0KLUFwYWNoZSBDYXNzYW5kcmEgc3RvcmVzIGRhdGEgaW4gaW1tdXRhYmxlIFNTVGFibGUgZmlsZXMuIEJhY2t1cHMgaW4KLUFwYWNoZSBDYXNzYW5kcmEgZGF0YWJhc2UgYXJlIGJhY2t1cCBjb3BpZXMgb2YgdGhlIGRhdGFiYXNlIGRhdGEgdGhhdCBpcwotc3RvcmVkIGFzIFNTVGFibGUgZmlsZXMuIEJhY2t1cHMgYXJlIHVzZWQgZm9yIHNldmVyYWwgcHVycG9zZXMgaW5jbHVkaW5nCi10aGUgZm9sbG93aW5nOgotCi0qIFRvIHN0b3JlIGEgZGF0YSBjb3B5IGZvciBkdXJhYmlsaXR5Ci0qIFRvIGJlIGFibGUgdG8gcmVzdG9yZSBhIHRhYmxlIGlmIHRhYmxlIGRhdGEgaXMgbG9zdCBkdWUgdG8KLW5vZGUvcGFydGl0aW9uL25ldHdvcmsgZmFpbHVyZQotKiBUbyBiZSBhYmxlIHRvIHRyYW5zZmVyIHRoZSBTU1RhYmxlIGZpbGVzIHRvIGEgZGlmZmVyZW50IG1hY2hpbmU7IGZvcgotcG9ydGFiaWxpdHkKLQotPT0gVHlwZXMgb2YgQmFja3VwcwotCi1BcGFjaGUgQ2Fzc2FuZHJhIHN1cHBvcnRzIHR3byBraW5kcyBvZiBiYWNrdXAgc3RyYXRlZ2llcy4KLQotKiBTbmFwc2hvdHMKLSogSW5jcmVtZW50YWwgQmFja3VwcwotCi1BIF9zbmFwc2hvdF8gaXMgYSBjb3B5IG9mIGEgdGFibGXigJlzIFNTVGFibGUgZmlsZXMgYXQgYSBnaXZlbiB0aW1lLAotY3JlYXRlZCB2aWEgaGFyZCBsaW5rcy4gCi1UaGUgRERMIHRvIGNyZWF0ZSB0aGUgdGFibGUgaXMgc3RvcmVkIGFzIHdlbGwuCi1TbmFwc2hvdHMgbWF5IGJlIGNyZWF0ZWQgYnkgYSB1c2VyIG9yIGNyZWF0ZWQgYXV0b21hdGljYWxseS4gCi1UaGUgc2V0dGluZyBgc25hcHNob3RfYmVmb3JlX2NvbXBhY3Rpb25gIGluIHRoZSBgY2Fzc2FuZHJhLnlhbWxgIGZpbGUgZGV0ZXJtaW5lcyBpZgotc25hcHNob3RzIGFyZSBjcmVhdGVkIGJlZm9yZSBlYWNoIGNvbXBhY3Rpb24uIAotQnkgZGVmYXVsdCwgYHNuYXBzaG90X2JlZm9yZV9jb21wYWN0aW9uYCBpcyBzZXQgdG8gZmFsc2UuIAotU25hcHNob3RzIG1heSBiZSBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYmVmb3JlIGtleXNwYWNlIHRydW5jYXRpb24gb3IgZHJvcHBpbmcgb2YgYSB0YWJsZSBieQotc2V0dGluZyBgYXV0b19zbmFwc2hvdGAgdG8gdHJ1ZSAoZGVmYXVsdCkgaW4gYGNhc3NhbmRyYS55YW1sYC4gCi1UcnVuY2F0ZXMgY291bGQgYmUgZGVsYXllZCBkdWUgdG8gdGhlIGF1dG8gc25hcHNob3RzIGFuZCBhbm90aGVyIHNldHRpbmcgaW4KLWBjYXNzYW5kcmEueWFtbGAgZGV0ZXJtaW5lcyBob3cgbG9uZyB0aGUgY29vcmRpbmF0b3Igc2hvdWxkIHdhaXQgZm9yCi10cnVuY2F0ZXMgdG8gY29tcGxldGUuIAotQnkgZGVmYXVsdCBDYXNzYW5kcmEgd2FpdHMgNjAgc2Vjb25kcyBmb3IgYXV0byBzbmFwc2hvdHMgdG8gY29tcGxldGUuCi0KLUFuIF9pbmNyZW1lbnRhbCBiYWNrdXBfIGlzIGEgY29weSBvZiBhIHRhYmxl4oCZcyBTU1RhYmxlIGZpbGVzIGNyZWF0ZWQgYnkKLWEgaGFyZCBsaW5rIHdoZW4gbWVtdGFibGVzIGFyZSBmbHVzaGVkIHRvIGRpc2sgYXMgU1NUYWJsZXMuIAotVHlwaWNhbGx5IGluY3JlbWVudGFsIGJhY2t1cHMgYXJlIHBhaXJlZCB3aXRoIHNuYXBzaG90cyB0byByZWR1Y2UgdGhlIGJhY2t1cCB0aW1lCi1hcyB3ZWxsIGFzIHJlZHVjZSBkaXNrIHNwYWNlLiAKLUluY3JlbWVudGFsIGJhY2t1cHMgYXJlIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgZW5hYmxlZCBleHBsaWNpdGx5IGluIGBjYXNzYW5kcmEueWFtbGAgKHdpdGgKLWBpbmNyZW1lbnRhbF9iYWNrdXBzYCBzZXR0aW5nKSBvciB3aXRoIGBub2RldG9vbGAuIAotT25jZSBlbmFibGVkLCBDYXNzYW5kcmEgY3JlYXRlcyBhIGhhcmQgbGluayB0byBlYWNoIFNTVGFibGUgZmx1c2hlZCBvciBzdHJlYW1lZAotbG9jYWxseSBpbiBhIGBiYWNrdXBzL2Agc3ViZGlyZWN0b3J5IG9mIHRoZSBrZXlzcGFjZSBkYXRhLiAKLUluY3JlbWVudGFsIGJhY2t1cHMgb2Ygc3lzdGVtIHRhYmxlcyBhcmUgYWxzbyBjcmVhdGVkLgotCi09PSBEYXRhIERpcmVjdG9yeSBTdHJ1Y3R1cmUKLQotVGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgb2YgQ2Fzc2FuZHJhIGRhdGEgY29uc2lzdHMgb2YgZGlmZmVyZW50Ci1kaXJlY3RvcmllcyBmb3Iga2V5c3BhY2VzLCBhbmQgdGFibGVzIHdpdGggdGhlIGRhdGEgZmlsZXMgd2l0aGluIHRoZQotdGFibGUgZGlyZWN0b3JpZXMuIAotRGlyZWN0b3JpZXMgYmFja3VwcyBhbmQgc25hcHNob3RzIHRvIHN0b3JlIGJhY2t1cHMKLWFuZCBzbmFwc2hvdHMgcmVzcGVjdGl2ZWx5IGZvciBhIHBhcnRpY3VsYXIgdGFibGUgYXJlIGFsc28gc3RvcmVkIHdpdGhpbgotdGhlIHRhYmxlIGRpcmVjdG9yeS4gCi1UaGUgZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3IgQ2Fzc2FuZHJhIGlzIGlsbHVzdHJhdGVkIGluIEZpZ3VyZSAxLgotCi1pbWFnZTo6RmlndXJlXzFfYmFja3Vwcy5qcGdbRGF0YSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciBiYWNrdXBzXQotCi1GaWd1cmUgMS4gRGlyZWN0b3J5IFN0cnVjdHVyZSBmb3IgQ2Fzc2FuZHJhIERhdGEKLQotPT09IFNldHRpbmcgVXAgRXhhbXBsZSBUYWJsZXMgZm9yIEJhY2t1cHMgYW5kIFNuYXBzaG90cwotCi1JbiB0aGlzIHNlY3Rpb24gd2Ugc2hhbGwgY3JlYXRlIHNvbWUgZXhhbXBsZSBkYXRhIHRoYXQgY291bGQgYmUgdXNlZCB0bwotZGVtb25zdHJhdGUgaW5jcmVtZW50YWwgYmFja3VwcyBhbmQgc25hcHNob3RzLiAKLVdlIGhhdmUgdXNlZCBhIHRocmVlIG5vZGUgQ2Fzc2FuZHJhIGNsdXN0ZXIuIAotRmlyc3QsIHRoZSBrZXlzcGFjZXMgYXJlIGNyZWF0ZWQuIAotVGhlbiB0YWJsZXMgYXJlIGNyZWF0ZWQgd2l0aGluIGEga2V5c3BhY2UgYW5kIHRhYmxlIGRhdGEgaXMgYWRkZWQuIAotV2UgaGF2ZSB1c2VkIHR3byBrZXlzcGFjZXMgYGNxbGtleXNwYWNlYCBhbmQgYGNhdGFsb2drZXlzcGFjZWAgd2l0aCB0d28gdGFibGVzIHdpdGhpbgotZWFjaC4gCi0KLUNyZWF0ZSB0aGUga2V5c3BhY2UgYGNxbGtleXNwYWNlYDoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfa3NfYmFja3VwLmNxbFtdCi0tLS0tCi0KLUNyZWF0ZSB0d28gdGFibGVzIGB0YCBhbmQgYHQyYCBpbiB0aGUgYGNxbGtleXNwYWNlYCBrZXlzcGFjZS4KLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9jcmVhdGVfdGFibGVfYmFja3VwLmNxbFtdCi0tLS0tCi0KLUFkZCBkYXRhIHRvIHRoZSB0YWJsZXM6IAotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2luc2VydF9kYXRhX2JhY2t1cC5jcWxbXQotLS0tLQotCi1RdWVyeSB0aGUgdGFibGUgdG8gbGlzdCB0aGUgZGF0YToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9zZWxlY3RfZGF0YV9iYWNrdXAuY3FsW10KLS0tLS0KLQotcmVzdWx0cyBpbgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zZWxlY3RfZGF0YV9iYWNrdXAucmVzdWx0W10KLS0tLS0KLQotQ3JlYXRlIGEgc2Vjb25kIGtleXNwYWNlIGBjYXRhbG9na2V5c3BhY2VgOgotCi1bc291cmNlLGNxbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQ1FML2NyZWF0ZV9rczJfYmFja3VwLmNxbFtdCi0tLS0tCi0KLUNyZWF0ZSB0d28gdGFibGVzIGBqb3VybmFsYCAgYW5kIGBtYWdhemluZWAgaW4gYGNhdGFsb2drZXlzcGFjZWA6Ci0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRDUUwvY3JlYXRlX3RhYmxlMl9iYWNrdXAuY3FsW10KLS0tLS0KLQotQWRkIGRhdGEgdG8gdGhlIHRhYmxlczoKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9pbnNlcnRfZGF0YTJfYmFja3VwLmNxbFtdCi0tLS0tCi0KLVF1ZXJ5IHRoZSB0YWJsZXMgdG8gbGlzdCB0aGUgZGF0YToKLQotW3NvdXJjZSxjcWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJENRTC9zZWxlY3RfZGF0YTJfYmFja3VwLmNxbFtdCi0tLS0tCi0KLXJlc3VsdHMgaW4gCi0KLVtzb3VyY2UsY3FsXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NlbGVjdF9kYXRhMl9iYWNrdXAucmVzdWx0W10KLS0tLS0KLQotPT0gU25hcHNob3RzCi0KLUluIHRoaXMgc2VjdGlvbiwgd2UgZGVtb25zdHJhdGUgY3JlYXRpbmcgc25hcHNob3RzLiAKLVRoZSBjb21tYW5kIHVzZWQgdG8gY3JlYXRlIGEgc25hcHNob3QgaXMgYG5vZGV0b29sIHNuYXBzaG90YCB3aXRoIHRoZSB1c2FnZToKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL25vZGV0b29sX3NuYXBzaG90LnNoW10KLS0tLS0KLQotcmVzdWx0cyBpbgotCi1bc291cmNlLCBwbGFpbnRleHRdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvbm9kZXRvb2xfc25hcHNob3RfaGVscC5yZXN1bHRbXQotLS0tLQotCi09PT0gQ29uZmlndXJpbmcgZm9yIFNuYXBzaG90cwotCi1UbyBkZW1vbnN0cmF0ZSBjcmVhdGluZyBzbmFwc2hvdHMgd2l0aCBOb2RldG9vbCBvbiB0aGUgY29tbWFuZGxpbmUgd2UKLWhhdmUgc2V0IGBhdXRvX3NuYXBzaG90c2Agc2V0dGluZyB0byBgZmFsc2VgIGluIHRoZSBgY2Fzc2FuZHJhLnlhbWxgIGZpbGU6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkWUFNTC9hdXRvX3NuYXBzaG90LnlhbWxbXQotLS0tLQotCi1BbHNvIHNldCBgc25hcHNob3RfYmVmb3JlX2NvbXBhY3Rpb25gIHRvIGBmYWxzZWAgdG8gZGlzYWJsZSBjcmVhdGluZwotc25hcHNob3RzIGF1dG9tYXRpY2FsbHkgYmVmb3JlIGNvbXBhY3Rpb246Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkWUFNTC9zbmFwc2hvdF9iZWZvcmVfY29tcGFjdGlvbi55YW1sW10KLS0tLS0KLQotPT09IENyZWF0aW5nIFNuYXBzaG90cwotCi1CZWZvcmUgY3JlYXRpbmcgYW55IHNuYXBzaG90cywgc2VhcmNoIGZvciBzbmFwc2hvdHMgYW5kIG5vbmUgd2lsbCBiZSBsaXN0ZWQ6Ci0KLVtzb3VyY2UsYmFzaF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9maW5kX3NuYXBzaG90cy5zaFtdCi0tLS0tCi0KLVdlIHNoYWxsIGJlIHVzaW5nIHRoZSBleGFtcGxlIGtleXNwYWNlcyBhbmQgdGFibGVzIHRvIGNyZWF0ZSBzbmFwc2hvdHMuCi0KLT09PT0gVGFraW5nIFNuYXBzaG90cyBvZiBhbGwgVGFibGVzIGluIGEgS2V5c3BhY2UKLQotVXNpbmcgdGhlIHN5bnRheCBhYm92ZSwgY3JlYXRlIGEgc25hcHNob3QgY2FsbGVkIGBjYXRhbG9nLWtzYCBmb3IgYWxsIHRoZSB0YWJsZXMKLWluIHRoZSBgY2F0YWxvZ2tleXNwYWNlYCBrZXlzcGFjZToKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3NuYXBzaG90X2JhY2t1cDIuc2hbXQotLS0tLQotCi1yZXN1bHRzIGluCi0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zbmFwc2hvdF9iYWNrdXAyLnJlc3VsdFtdCi0tLS0tCi0KLVVzaW5nIHRoZSBgZmluZGAgY29tbWFuZCBhYm92ZSwgdGhlIHNuYXBzaG90cyBhbmQgYHNuYXBzaG90c2AgZGlyZWN0b3JpZXMgCi1hcmUgbm93IGZvdW5kIHdpdGggbGlzdGVkIGZpbGVzIHNpbWlsYXIgdG86Ci0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zbmFwc2hvdF9iYWNrdXAyX2ZpbmQucmVzdWx0W10KLS0tLS0KLQotU25hcHNob3RzIG9mIGFsbCB0YWJsZXMgaW4gbXVsdGlwbGUga2V5c3BhY2VzIG1heSBiZSBjcmVhdGVkIHNpbWlsYXJseToKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3NuYXBzaG90X2JvdGhfYmFja3Vwcy5zaFtdCi0tLS0tCi0KLT09PT0gVGFraW5nIFNuYXBzaG90cyBvZiBTaW5nbGUgVGFibGUgaW4gYSBLZXlzcGFjZQotCi1UbyB0YWtlIGEgc25hcHNob3Qgb2YgYSBzaW5nbGUgdGFibGUgdGhlIGBub2RldG9vbCBzbmFwc2hvdGAgY29tbWFuZAotc3ludGF4IGJlY29tZXMgYXMgZm9sbG93czoKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3NuYXBzaG90X29uZV90YWJsZS5zaFtdCi0tLS0tCi0KLVVzaW5nIHRoZSBzeW50YXggYWJvdmUsIGNyZWF0ZSBhIHNuYXBzaG90IGZvciB0YWJsZSBgbWFnYXppbmVgIGluIGtleXNwYWNlIGBjYXRhbG9na2V5c3BhY2VgOgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvc25hcHNob3Rfb25lX3RhYmxlMi5zaFtdCi0tLS0tCi0KLXJlc3VsdHMgaW4KLSAKLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zbmFwc2hvdF9vbmVfdGFibGUyLnJlc3VsdFtdCi0tLS0tCi0KLT09PT0gVGFraW5nIFNuYXBzaG90IG9mIE11bHRpcGxlIFRhYmxlcyBmcm9tIHNhbWUgS2V5c3BhY2UKLQotVG8gdGFrZSBzbmFwc2hvdHMgb2YgbXVsdGlwbGUgdGFibGVzIGluIGEga2V5c3BhY2UgdGhlIGxpc3Qgb2YKLV9LZXlzcGFjZS50YWJsZV8gbXVzdCBiZSBzcGVjaWZpZWQgd2l0aCBvcHRpb24gYC0ta3QtbGlzdGAuIAotRm9yIGV4YW1wbGUsIGNyZWF0ZSBzbmFwc2hvdHMgZm9yIHRhYmxlcyBgdGAgYW5kIGB0MmAgaW4gdGhlIGBjcWxrZXlzcGFjZWAga2V5c3BhY2U6Ci0KLVtzb3VyY2UsYmFzaF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9zbmFwc2hvdF9tdWx0X3RhYmxlcy5zaFtdCi0tLS0tCi0KLXJlc3VsdHMgaW4KLQotW3NvdXJjZSxwbGFpbnRleHRdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvc25hcHNob3RfbXVsdF90YWJsZXMucmVzdWx0W10KLS0tLS0KLQotTXVsdGlwbGUgc25hcHNob3RzIG9mIHRoZSBzYW1lIHNldCBvZiB0YWJsZXMgbWF5IGJlIGNyZWF0ZWQgYW5kIHRhZ2dlZCB3aXRoIGEgZGlmZmVyZW50IG5hbWUuIAotQXMgYW4gZXhhbXBsZSwgY3JlYXRlIGFub3RoZXIgc25hcHNob3QgZm9yIHRoZSBzYW1lIHNldCBvZiB0YWJsZXMgYHRgIGFuZCBgdDJgIGluIHRoZSBgY3Fsa2V5c3BhY2VgIAota2V5c3BhY2UgYW5kIHRhZyB0aGUgc25hcHNob3RzIGRpZmZlcmVudGx5OgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvc25hcHNob3RfbXVsdF90YWJsZXNfYWdhaW4uc2hbXQotLS0tLQotCi1yZXN1bHRzIGluCi0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9zbmFwc2hvdF9tdWx0X3RhYmxlc19hZ2Fpbi5yZXN1bHRbXQotLS0tLQotCi09PT09IFRha2luZyBTbmFwc2hvdCBvZiBNdWx0aXBsZSBUYWJsZXMgZnJvbSBEaWZmZXJlbnQgS2V5c3BhY2VzCi0KLVRvIHRha2Ugc25hcHNob3RzIG9mIG11bHRpcGxlIHRhYmxlcyB0aGF0IGFyZSBpbiBkaWZmZXJlbnQga2V5c3BhY2VzIHRoZQotY29tbWFuZCBzeW50YXggaXMgdGhlIHNhbWUgYXMgd2hlbiBtdWx0aXBsZSB0YWJsZXMgYXJlIGluIHRoZSBzYW1lCi1rZXlzcGFjZS4gCi1FYWNoIDxrZXlzcGFjZT4uPHRhYmxlPiBtdXN0IGJlIHNwZWNpZmllZCBzZXBhcmF0ZWx5IGluIHRoZQotYC0ta3QtbGlzdGAgb3B0aW9uLiAKLQotRm9yIGV4YW1wbGUsIGNyZWF0ZSBhIHNuYXBzaG90IGZvciB0YWJsZSBgdGAgaW4KLXRoZSBgY3Fsa2V5c3BhY2VgIGFuZCB0YWJsZSBgam91cm5hbGAgaW4gdGhlIGNhdGFsb2drZXlzcGFjZSBhbmQgdGFnIHRoZQotc25hcHNob3QgYG11bHRpLWtzYC4KLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL3NuYXBzaG90X211bHRfa3Muc2hbXQotLS0tLQotCi1yZXN1bHRzIGluCi1bc291cmNlLCBwbGFpbnRleHRdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvc25hcHNob3RfbXVsdF9rcy5yZXN1bHRbXQotLS0tLQotCi09PT0gTGlzdGluZyBTbmFwc2hvdHMKLQotVG8gbGlzdCBzbmFwc2hvdHMgdXNlIHRoZSBgbm9kZXRvb2wgbGlzdHNuYXBzaG90c2AgY29tbWFuZC4gQWxsIHRoZQotc25hcHNob3RzIHRoYXQgd2UgY3JlYXRlZCBpbiB0aGUgcHJlY2VkaW5nIGV4YW1wbGVzIGdldCBsaXN0ZWQ6Ci0KLVtzb3VyY2UsYmFzaF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9ub2RldG9vbF9saXN0X3NuYXBzaG90cy5zaFtdCi0tLS0tCi0KLXJlc3VsdHMgaW4KLQotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL25vZGV0b29sX2xpc3Rfc25hcHNob3RzLnJlc3VsdFtdCi0tLS0tCi0KLT09PSBGaW5kaW5nIFNuYXBzaG90cyBEaXJlY3RvcmllcwotCi1UaGUgYHNuYXBzaG90c2AgZGlyZWN0b3JpZXMgbWF5IGJlIGxpc3RlZCB3aXRoIGBmaW5kIOKAk25hbWUgc25hcHNob3RzYAotY29tbWFuZDoKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2ZpbmRfc25hcHNob3RzLnNoW10KLS0tLS0KLQotcmVzdWx0cyBpbgotCi1bc291cmNlLCBwbGFpbnRleHRdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvc25hcHNob3RfYWxsLnJlc3VsdFtdCi0tLS0tCi0KLVRvIGxpc3QgdGhlIHNuYXBzaG90cyBmb3IgYSBwYXJ0aWN1bGFyIHRhYmxlIGZpcnN0IGNoYW5nZSB0byB0aGUgc25hcHNob3RzIGRpcmVjdG9yeSBmb3IgdGhhdCB0YWJsZS4gCi1Gb3IgZXhhbXBsZSwgbGlzdCB0aGUgc25hcHNob3RzIGZvciB0aGUgYGNhdGFsb2drZXlzcGFjZS9qb3VybmFsYCB0YWJsZToKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2ZpbmRfdHdvX3NuYXBzaG90cy5zaFtdCi0tLS0tCi0KLXJlc3VsdHMgaW4KLQotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL2ZpbmRfdHdvX3NuYXBzaG90cy5yZXN1bHRbXQotLS0tLQotCi1BIGBzbmFwc2hvdHNgIGRpcmVjdG9yeSBsaXN0cyB0aGUgU1NUYWJsZSBmaWxlcyBpbiB0aGUgc25hcHNob3QuCi1BIGBzY2hlbWEuY3FsYCBmaWxlIGlzIGFsc28gY3JlYXRlZCBpbiBlYWNoIHNuYXBzaG90IHRoYXQgZGVmaW5lcyBzY2hlbWEKLXRoYXQgY2FuIHJlY3JlYXRlIHRoZSB0YWJsZSB3aXRoIENRTCB3aGVuIHJlc3RvcmluZyBmcm9tIGEgc25hcHNob3Q6Ci0KLVtzb3VyY2UsYmFzaF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9zbmFwc2hvdF9maWxlcy5zaFtdCi0tLS0tCi0KLXJlc3VsdHMgaW4KLQotW3NvdXJjZSwgcGxhaW50ZXh0XQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRSRVNVTFRTL3NuYXBzaG90X2ZpbGVzLnJlc3VsdFtdCi0tLS0tCi0KLT09PSBDbGVhcmluZyBTbmFwc2hvdHMKLQotU25hcHNob3RzIG1heSBiZSBjbGVhcmVkIG9yIGRlbGV0ZWQgd2l0aCB0aGUgYG5vZGV0b29sIGNsZWFyc25hcHNob3RgCi1jb21tYW5kLiBFaXRoZXIgYSBzcGVjaWZpYyBzbmFwc2hvdCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIG9yIHRoZSBg4oCTYWxsYAotb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkLiAKLQotRm9yIGV4YW1wbGUsIGRlbGV0ZSBhIHNuYXBzaG90IGNhbGxlZCBgbWFnYXppbmVgIGZyb20ga2V5c3BhY2UgYGNxbGtleXNwYWNlYDoKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL25vZGV0b29sX2NsZWFyc25hcHNob3Quc2hbXQotLS0tLQotCi1vciBkZWxldGUgYWxsIHNuYXBzaG90cyBmcm9tIGBjcWxrZXlzcGFjZWAgd2l0aCB0aGUg4oCTYWxsIG9wdGlvbjoKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL25vZGV0b29sX2NsZWFyc25hcHNob3RfYWxsLnNoW10KLS0tLS0KLQotPT0gSW5jcmVtZW50YWwgQmFja3VwcwotCi1JbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLCB3ZSBzaGFsbCBkaXNjdXNzIGNvbmZpZ3VyaW5nIGFuZCBjcmVhdGluZwotaW5jcmVtZW50YWwgYmFja3Vwcy4KLQotPT09IENvbmZpZ3VyaW5nIGZvciBJbmNyZW1lbnRhbCBCYWNrdXBzCi0KLVRvIGNyZWF0ZSBpbmNyZW1lbnRhbCBiYWNrdXBzIHNldCBgaW5jcmVtZW50YWxfYmFja3Vwc2AgdG8gYHRydWVgIGluCi1gY2Fzc2FuZHJhLnlhbWxgLgotCi1bc291cmNlLHlhbWxdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFlBTUwvaW5jcmVtZW50YWxfYnVwcy55YW1sW10KLS0tLS0KLQotVGhpcyBpcyB0aGUgb25seSBzZXR0aW5nIG5lZWRlZCB0byBjcmVhdGUgaW5jcmVtZW50YWwgYmFja3Vwcy4gCi1CeSBkZWZhdWx0IGBpbmNyZW1lbnRhbF9iYWNrdXBzYCBzZXR0aW5nIGlzIHNldCB0byBgZmFsc2VgIGJlY2F1c2UgYSBuZXcKLXNldCBvZiBTU1RhYmxlIGZpbGVzIGlzIGNyZWF0ZWQgZm9yIGVhY2ggZGF0YSBmbHVzaCBhbmQgaWYgc2V2ZXJhbCBDUUwKLXN0YXRlbWVudHMgYXJlIHRvIGJlIHJ1biB0aGUgYGJhY2t1cHNgIGRpcmVjdG9yeSBjb3VsZCBmaWxsIHVwIHF1aWNrbHkKLWFuZCB1c2UgdXAgc3RvcmFnZSB0aGF0IGlzIG5lZWRlZCB0byBzdG9yZSB0YWJsZSBkYXRhLiAKLUluY3JlbWVudGFsIGJhY2t1cHMgbWF5IGFsc28gYmUgZW5hYmxlZCBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGggdGhlIG5vZGV0b29sCi1jb21tYW5kIGBub2RldG9vbCBlbmFibGViYWNrdXBgLiAKLUluY3JlbWVudGFsIGJhY2t1cHMgbWF5IGJlIGRpc2FibGVkIHdpdGggYG5vZGV0b29sIGRpc2FibGViYWNrdXBgIGNvbW1hbmQuIAotU3RhdHVzIG9mIGluY3JlbWVudGFsIGJhY2t1cHMsIHdoZXRoZXIgdGhleSBhcmUgZW5hYmxlZCBtYXkgYmUgY2hlY2tlZCB3aXRoIGBub2RldG9vbCBzdGF0dXNiYWNrdXBgLgotCi09PT0gQ3JlYXRpbmcgSW5jcmVtZW50YWwgQmFja3VwcwotCi1BZnRlciBlYWNoIHRhYmxlIGlzIGNyZWF0ZWQgZmx1c2ggdGhlIHRhYmxlIGRhdGEgd2l0aCBgbm9kZXRvb2wgZmx1c2hgCi1jb21tYW5kLiBJbmNyZW1lbnRhbCBiYWNrdXBzIGdldCBjcmVhdGVkLgotCi1bc291cmNlLGJhc2hdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJEJBU0gvbm9kZXRvb2xfZmx1c2guc2hbXQotLS0tLQotCi09PT0gRmluZGluZyBJbmNyZW1lbnRhbCBCYWNrdXBzCi0KLUluY3JlbWVudGFsIGJhY2t1cHMgYXJlIGNyZWF0ZWQgd2l0aGluIHRoZSBDYXNzYW5kcmHigJlzIGBkYXRhYCBkaXJlY3RvcnkKLXdpdGhpbiBhIHRhYmxlIGRpcmVjdG9yeS4gQmFja3VwcyBtYXkgYmUgZm91bmQgd2l0aCBmb2xsb3dpbmcgY29tbWFuZC4KLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2ZpbmRfYmFja3Vwcy5zaFtdCi0tLS0tCi1yZXN1bHRzIGluCi1bc291cmNlLG5vbmVdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvZmluZF9iYWNrdXBzLnJlc3VsdFtdCi0tLS0tCi0KLT09PSBDcmVhdGluZyBhbiBJbmNyZW1lbnRhbCBCYWNrdXAKLQotVGhpcyBzZWN0aW9uIGRpc2N1c3NlcyBob3cgaW5jcmVtZW50YWwgYmFja3VwcyBhcmUgY3JlYXRlZCBpbiBtb3JlCi1kZXRhaWwgdXNpbmcgdGhlIGtleXNwYWNlIGFuZCB0YWJsZSBwcmV2aW91c2x5IGNyZWF0ZWQuCi0KLUZsdXNoIHRoZSBrZXlzcGFjZSBhbmQgdGFibGU6Ci0KLVtzb3VyY2UsYmFzaF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkQkFTSC9ub2RldG9vbF9mbHVzaF90YWJsZS5zaFtdCi0tLS0tCi0KLUEgc2VhcmNoIGZvciBiYWNrdXBzIGFuZCBhIGBiYWNrdXBzYCBkaXJlY3Rvcnkgd2lsbCBsaXN0IGEgYmFja3VwIGRpcmVjdG9yeSwKLWV2ZW4gaWYgd2UgaGF2ZSBhZGRlZCBubyB0YWJsZSBkYXRhIHlldC4KLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2ZpbmRfYmFja3Vwcy5zaFtdCi0tLS0tCi0KLXJlc3VsdHMgaW4KLQotW3NvdXJjZSxwbGFpbnRleHRdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvZmluZF9iYWNrdXBzX3RhYmxlLnJlc3VsdFtdCi0tLS0tCi0KLUNoZWNraW5nIHRoZSBgYmFja3Vwc2AgZGlyZWN0b3J5IHdpbGwgc2hvdyB0aGF0IHRoZXJlIGFyZSBhbHNvIG5vIGJhY2t1cCBmaWxlczoKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2NoZWNrX2JhY2t1cHMuc2hbXQotLS0tLQotCi1yZXN1bHRzIGluCi0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9ub19idXBzLnJlc3VsdFtdCi0tLS0tCi0KLUlmIGEgcm93IG9mIGRhdGEgaXMgYWRkZWQgdG8gdGhlIGRhdGEsIHJ1bm5pbmcgdGhlIGBub2RldG9vbCBmbHVzaGAgY29tbWFuZCB3aWxsCi1mbHVzaCB0aGUgdGFibGUgZGF0YSBhbmQgYW4gaW5jcmVtZW50YWwgYmFja3VwIHdpbGwgYmUgY3JlYXRlZDoKLQotW3NvdXJjZSxiYXNoXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRCQVNIL2ZsdXNoX2FuZF9jaGVjay5zaFtdCi0tLS0tCi0KLXJlc3VsdHMgaW4gCi0KLVtzb3VyY2UsIHBsYWludGV4dF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkUkVTVUxUUy9mbHVzaF9hbmRfY2hlY2sucmVzdWx0W10KLS0tLS0KLQotW05PVEVdCi0ubm90ZQotPT09PQotVGhlIGBiYWNrdXBzYCBkaXJlY3RvcnkgZm9yIGFueSB0YWJsZSwgc3VjaCBhcyBgY3Fsa2V5c3BhY2UvdGAgaXMgY3JlYXRlZCBpbiB0aGUKLWBkYXRhYCBkaXJlY3RvcnkgZm9yIHRoYXQgdGFibGUuCi09PT09Ci0KLUFkZGluZyBhbm90aGVyIHJvdyBvZiBkYXRhIGFuZCBmbHVzaGluZyB3aWxsIHJlc3VsdCBpbiBhbm90aGVyIHNldCBvZiBpbmNyZW1lbnRhbCBiYWNrdXAgZmlsZXMuCi1UaGUgU1NUYWJsZSBmaWxlcyBhcmUgdGltZXN0YW1wZWQsIHdoaWNoIGRpc3Rpbmd1aXNoZXMgdGhlIGZpcnN0IGluY3JlbWVudGFsIGJhY2t1cCBmcm9tIHRoZQotc2Vjb25kOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1pbmNsdWRlOjpleGFtcGxlJFJFU1VMVFMvZmx1c2hfYW5kX2NoZWNrMi5yZXN1bHRbXQotLS0tLQotCi09PSBSZXN0b3JpbmcgZnJvbSBJbmNyZW1lbnRhbCBCYWNrdXBzIGFuZCBTbmFwc2hvdHMKLQotVGhlIHR3byBtYWluIHRvb2xzL2NvbW1hbmRzIGZvciByZXN0b3JpbmcgYSB0YWJsZSBhZnRlciBpdCBoYXMgYmVlbgotZHJvcHBlZCBhcmU6Ci0KLSogc3N0YWJsZWxvYWRlcgotKiBub2RldG9vbCBpbXBvcnQKLQotQSBzbmFwc2hvdCBjb250YWlucyBlc3NlbnRpYWxseSB0aGUgc2FtZSBzZXQgb2YgU1NUYWJsZSBmaWxlcyBhcyBhbgotaW5jcmVtZW50YWwgYmFja3VwIGRvZXMgd2l0aCBhIGZldyBhZGRpdGlvbmFsIGZpbGVzLiBBIHNuYXBzaG90IGluY2x1ZGVzCi1hIGBzY2hlbWEuY3FsYCBmaWxlIGZvciB0aGUgc2NoZW1hIERETCB0byBjcmVhdGUgYSB0YWJsZSBpbiBDUUwuIEEgdGFibGUKLWJhY2t1cCBkb2VzIG5vdCBpbmNsdWRlIERETCB3aGljaCBtdXN0IGJlIG9idGFpbmVkIGZyb20gYSBzbmFwc2hvdCB3aGVuCi1yZXN0b3JpbmcgZnJvbSBhbiBpbmNyZW1lbnRhbCBiYWNrdXAuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2NvbXBhY3Rpb24vaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvY29tcGFjdGlvbi9pbmRleC5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTIwNjU2Li4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvY29tcGFjdGlvbi9pbmRleC5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLT0gQ29tcGFjdGlvbgotCi09PSBTdHJhdGVnaWVzCi0KLVBpY2tpbmcgdGhlIHJpZ2h0IGNvbXBhY3Rpb24gc3RyYXRlZ3kgZm9yIHlvdXIgd29ya2xvYWQgd2lsbCBlbnN1cmUgdGhlCi1iZXN0IHBlcmZvcm1hbmNlIGZvciBib3RoIHF1ZXJ5aW5nIGFuZCBmb3IgY29tcGFjdGlvbiBpdHNlbGYuCi0KLXhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vc3Rjcy5hZG9jW2BTaXplIFRpZXJlZCBDb21wYWN0aW9uIFN0cmF0ZWd5IChTVENTKWBdOjoKLSAgVGhlIGRlZmF1bHQgY29tcGFjdGlvbiBzdHJhdGVneS4gVXNlZnVsIGFzIGEgZmFsbGJhY2sgd2hlbiBvdGhlcgotICBzdHJhdGVnaWVzIGRvbid0IGZpdCB0aGUgd29ya2xvYWQuIE1vc3QgdXNlZnVsIGZvciBub24gcHVyZSB0aW1lCi0gIHNlcmllcyB3b3JrbG9hZHMgd2l0aCBzcGlubmluZyBkaXNrcywgb3Igd2hlbiB0aGUgSS9PIGZyb20gYExDU2AKLSAgaXMgdG9vIGhpZ2guCi14cmVmOm9wZXJhdGluZy9jb21wYWN0aW9uL2xjcy5hZG9jW2BMZXZlbGVkIENvbXBhY3Rpb24gU3RyYXRlZ3kgKExDUylgXTo6Ci0gIExldmVsZWQgQ29tcGFjdGlvbiBTdHJhdGVneSAoTENTKSBpcyBvcHRpbWl6ZWQgZm9yIHJlYWQgaGVhdnkKLSAgd29ya2xvYWRzLCBvciB3b3JrbG9hZHMgd2l0aCBsb3RzIG9mIHVwZGF0ZXMgYW5kIGRlbGV0ZXMuIEl0IGlzIG5vdCBhCi0gIGdvb2QgY2hvaWNlIGZvciBpbW11dGFibGUgdGltZSBzZXJpZXMgZGF0YS4KLXhyZWY6b3BlcmF0aW5nL2NvbXBhY3Rpb24vdHdjcy5hZG9jW2BUaW1lIFdpbmRvdyBDb21wYWN0aW9uIFN0cmF0ZWd5IChUV0NTKWBdOjoKLSAgVGltZSBXaW5kb3cgQ29tcGFjdGlvbiBTdHJhdGVneSBpcyBkZXNpZ25lZCBmb3IgVFRMJ2VkLCBtb3N0bHkKLSAgaW1tdXRhYmxlIHRpbWUgc2VyaWVzIGRhdGEuCi0KLT09IFR5cGVzIG9mIGNvbXBhY3Rpb24KLQotVGhlIGNvbmNlcHQgb2YgY29tcGFjdGlvbiBpcyB1c2VkIGZvciBkaWZmZXJlbnQga2luZHMgb2Ygb3BlcmF0aW9ucyBpbgotQ2Fzc2FuZHJhLCB0aGUgY29tbW9uIHRoaW5nIGFib3V0IHRoZXNlIG9wZXJhdGlvbnMgaXMgdGhhdCBpdCB0YWtlcyBvbmUKLW9yIG1vcmUgU1NUYWJsZXMgYW5kIG91dHB1dCBuZXcgU1NUYWJsZXMuIFRoZSB0eXBlcyBvZiBjb21wYWN0aW9ucyBhcmU6Ci0KLU1pbm9yIGNvbXBhY3Rpb246OgotICB0cmlnZ2VyZWQgYXV0b21hdGljYWxseSBpbiBDYXNzYW5kcmEuCi1NYWpvciBjb21wYWN0aW9uOjoKLSAgYSB1c2VyIGV4ZWN1dGVzIGEgY29tcGFjdGlvbiBvdmVyIGFsbCBTU1RhYmxlcyBvbiB0aGUgbm9kZS4KLVVzZXIgZGVmaW5lZCBjb21wYWN0aW9uOjoKLSAgYSB1c2VyIHRyaWdnZXJzIGEgY29tcGFjdGlvbiBvbiBhIGdpdmVuIHNldCBvZiBTU1RhYmxlcy4KLVNjcnViOjoKLSAgdHJ5IHRvIGZpeCBhbnkgYnJva2VuIFNTVGFibGVzLiBUaGlzIGNhbiBhY3R1YWxseSByZW1vdmUgdmFsaWQgZGF0YSBpZgotICB0aGF0IGRhdGEgaXMgY29ycnVwdGVkLCBpZiB0aGF0IGhhcHBlbnMgeW91IHdpbGwgbmVlZCB0byBydW4gYSBmdWxsCi0gIHJlcGFpciBvbiB0aGUgbm9kZS4KLVVwZ3JhZGVTU1RhYmxlczo6Ci0gIHVwZ3JhZGUgU1NUYWJsZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLiBSdW4gdGhpcyBhZnRlciB1cGdyYWRpbmcgdG8gYQotICBuZXcgbWFqb3IgdmVyc2lvbi4KLUNsZWFudXA6OgotICByZW1vdmUgYW55IHJhbmdlcyB0aGlzIG5vZGUgZG9lcyBub3Qgb3duIGFueW1vcmUsIHR5cGljYWxseSB0cmlnZ2VyZWQKLSAgb24gbmVpZ2hib3VyaW5nIG5vZGVzIGFmdGVyIGEgbm9kZSBoYXMgYmVlbiBib290c3RyYXBwZWQgc2luY2UgdGhhdAotICBub2RlIHdpbGwgdGFrZSBvd25lcnNoaXAgb2Ygc29tZSByYW5nZXMgZnJvbSB0aG9zZSBub2Rlcy4KLVNlY29uZGFyeSBpbmRleCByZWJ1aWxkOjoKLSAgcmVidWlsZCB0aGUgc2Vjb25kYXJ5IGluZGV4ZXMgb24gdGhlIG5vZGUuCi1BbnRpY29tcGFjdGlvbjo6Ci0gIGFmdGVyIHJlcGFpciB0aGUgcmFuZ2VzIHRoYXQgd2VyZSBhY3R1YWxseSByZXBhaXJlZCBhcmUgc3BsaXQgb3V0IG9mCi0gIHRoZSBTU1RhYmxlcyB0aGF0IGV4aXN0ZWQgd2hlbiByZXBhaXIgc3RhcnRlZC4KLVN1YiByYW5nZSBjb21wYWN0aW9uOjoKLSAgSXQgaXMgcG9zc2libGUgdG8gb25seSBjb21wYWN0IGEgZ2l2ZW4gc3ViIHJhbmdlIC0gdGhpcyBjb3VsZCBiZQotICB1c2VmdWwgaWYgeW91IGtub3cgYSB0b2tlbiB0aGF0IGhhcyBiZWVuIG1pc2JlaGF2aW5nIC0gZWl0aGVyCi0gIGdhdGhlcmluZyBtYW55IHVwZGF0ZXMgb3IgbWFueSBkZWxldGVzLgotICAoYG5vZGV0b29sIGNvbXBhY3QgLXN0IHggLWV0IHlgKSB3aWxsIHBpY2sgYWxsIFNTVGFibGVzIGNvbnRhaW5pbmcgdGhlCi0gIHJhbmdlIGJldHdlZW4geCBhbmQgeSBhbmQgaXNzdWUgYSBjb21wYWN0aW9uIGZvciB0aG9zZSBTU1RhYmxlcy4gRm9yCi0gIFNUQ1MgdGhpcyB3aWxsIG1vc3QgbGlrZWx5IGluY2x1ZGUgYWxsIFNTVGFibGVzIGJ1dCB3aXRoIExDUyBpdCBjYW4KLSAgaXNzdWUgdGhlIGNvbXBhY3Rpb24gZm9yIGEgc3Vic2V0IG9mIHRoZSBTU1RhYmxlcy4gV2l0aCBMQ1MgdGhlCi0gIHJlc3VsdGluZyBzc3RhYmxlIHdpbGwgZW5kIHVwIGluIEwwLgotCi09PSBXaGVuIGlzIGEgbWlub3IgY29tcGFjdGlvbiB0cmlnZ2VyZWQ/Ci0KLSogV2hlbiBhbiBzc3RhYmxlIGlzIGFkZGVkIHRvIHRoZSBub2RlIHRocm91Z2ggZmx1c2hpbmcvc3RyZWFtaW5nCi0qIFdoZW4gYXV0b2NvbXBhY3Rpb24gaXMgZW5hYmxlZCBhZnRlciBiZWluZyBkaXNhYmxlZCAoYG5vZGV0b29sIGVuYWJsZWF1dG9jb21wYWN0aW9uYCkgCi0qIFdoZW4gY29tcGFjdGlvbiBhZGRzIG5ldyBTU1RhYmxlcyAKLSogQSBjaGVjayBmb3IgbmV3IG1pbm9yIGNvbXBhY3Rpb25zIGV2ZXJ5IDUgbWludXRlcwotCi09PSBNZXJnaW5nIFNTVGFibGVzCi0KLUNvbXBhY3Rpb24gaXMgYWJvdXQgbWVyZ2luZyBTU1RhYmxlcywgc2luY2UgcGFydGl0aW9ucyBpbiBTU1RhYmxlcyBhcmUKLXNvcnRlZCBiYXNlZCBvbiB0aGUgaGFzaCBvZiB0aGUgcGFydGl0aW9uIGtleSBpdCBpcyBwb3NzaWJsZSB0bwotZWZmaWNpZW50bHkgbWVyZ2Ugc2VwYXJhdGUgU1NUYWJsZXMuIENvbnRlbnQgb2YgZWFjaCBwYXJ0aXRpb24gaXMgYWxzbwotc29ydGVkIHNvIGVhY2ggcGFydGl0aW9uIGNhbiBiZSBtZXJnZWQgZWZmaWNpZW50bHkuCi0KLT09IFRvbWJzdG9uZXMgYW5kIEdhcmJhZ2UgQ29sbGVjdGlvbiAoR0MpIEdyYWNlCi0KLT09PSBXaHkgVG9tYnN0b25lcwotCi1XaGVuIGEgZGVsZXRlIHJlcXVlc3QgaXMgcmVjZWl2ZWQgYnkgQ2Fzc2FuZHJhIGl0IGRvZXMgbm90IGFjdHVhbGx5Ci1yZW1vdmUgdGhlIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyBzdG9yZS4gSW5zdGVhZCBpdCB3cml0ZXMgYSBzcGVjaWFsCi1waWVjZSBvZiBkYXRhIGtub3duIGFzIGEgdG9tYnN0b25lLiBUaGUgVG9tYnN0b25lIHJlcHJlc2VudHMgdGhlIGRlbGV0ZQotYW5kIGNhdXNlcyBhbGwgdmFsdWVzIHdoaWNoIG9jY3VycmVkIGJlZm9yZSB0aGUgdG9tYnN0b25lIHRvIG5vdCBhcHBlYXIKLWluIHF1ZXJpZXMgdG8gdGhlIGRhdGFiYXNlLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgaW5zdGVhZCBvZiByZW1vdmluZwotdmFsdWVzIGJlY2F1c2Ugb2YgdGhlIGRpc3RyaWJ1dGVkIG5hdHVyZSBvZiBDYXNzYW5kcmEuCi0KLT09PSBEZWxldGVzIHdpdGhvdXQgdG9tYnN0b25lcwotCi1JbWFnaW5lIGEgdGhyZWUgbm9kZSBjbHVzdGVyIHdoaWNoIGhhcyB0aGUgdmFsdWUgW0FdIHJlcGxpY2F0ZWQgdG8gZXZlcnkKLW5vZGUuOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1bQV0sIFtBXSwgW0FdCi0tLS0tCi0KLUlmIG9uZSBvZiB0aGUgbm9kZXMgZmFpbHMgYW5kIGFuZCBvdXIgZGVsZXRlIG9wZXJhdGlvbiBvbmx5IHJlbW92ZXMKLWV4aXN0aW5nIHZhbHVlcyB3ZSBjYW4gZW5kIHVwIHdpdGggYSBjbHVzdGVyIHRoYXQgbG9va3MgbGlrZToKLQotW3NvdXJjZSxub25lXQotLS0tLQotW10sIFtdLCBbQV0KLS0tLS0KLQotVGhlbiBhIHJlcGFpciBvcGVyYXRpb24gd291bGQgcmVwbGFjZSB0aGUgdmFsdWUgb2YgW0FdIGJhY2sgb250byB0aGUgdHdvCi1ub2RlcyB3aGljaCBhcmUgbWlzc2luZyB0aGUgdmFsdWUuOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1bQV0sIFtBXSwgW0FdCi0tLS0tCi0KLVRoaXMgd291bGQgY2F1c2Ugb3VyIGRhdGEgdG8gYmUgcmVzdXJyZWN0ZWQgZXZlbiB0aG91Z2ggaXQgaGFkIGJlZW4KLWRlbGV0ZWQuCi0KLT09PSBEZWxldGVzIHdpdGggVG9tYnN0b25lcwotCi1TdGFydGluZyBhZ2FpbiB3aXRoIGEgdGhyZWUgbm9kZSBjbHVzdGVyIHdoaWNoIGhhcyB0aGUgdmFsdWUgW0FdCi1yZXBsaWNhdGVkIHRvIGV2ZXJ5IG5vZGUuOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1bQV0sIFtBXSwgW0FdCi0tLS0tCi0KLUlmIGluc3RlYWQgb2YgcmVtb3ZpbmcgZGF0YSB3ZSBhZGQgYSB0b21ic3RvbmUgcmVjb3JkLCBvdXIgc2luZ2xlIG5vZGUKLWZhaWx1cmUgc2l0dWF0aW9uIHdpbGwgbG9vayBsaWtlIHRoaXMuOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1bQSwgVG9tYnN0b25lW0FdXSwgW0EsIFRvbWJzdG9uZVtBXV0sIFtBXQotLS0tLQotCi1Ob3cgd2hlbiB3ZSBpc3N1ZSBhIHJlcGFpciB0aGUgVG9tYnN0b25lIHdpbGwgYmUgY29waWVkIHRvIHRoZSByZXBsaWNhLAotcmF0aGVyIHRoYW4gdGhlIGRlbGV0ZWQgZGF0YSBiZWluZyByZXN1cnJlY3RlZC46Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLVtBLCBUb21ic3RvbmVbQV1dLCBbQSwgVG9tYnN0b25lW0FdXSwgW0EsIFRvbWJzdG9uZVtBXV0KLS0tLS0KLQotT3VyIHJlcGFpciBvcGVyYXRpb24gd2lsbCBjb3JyZWN0bHkgcHV0IHRoZSBzdGF0ZSBvZiB0aGUgc3lzdGVtIHRvIHdoYXQKLXdlIGV4cGVjdCB3aXRoIHRoZSByZWNvcmQgW0FdIG1hcmtlZCBhcyBkZWxldGVkIG9uIGFsbCBub2Rlcy4gVGhpcyBkb2VzCi1tZWFuIHdlIHdpbGwgZW5kIHVwIGFjY3J1aW5nIFRvbWJzdG9uZXMgd2hpY2ggd2lsbCBwZXJtYW5lbnRseQotYWNjdW11bGF0ZSBkaXNrIHNwYWNlLiBUbyBhdm9pZCBrZWVwaW5nIHRvbWJzdG9uZXMgZm9yZXZlciB3ZSBoYXZlIGEKLXBhcmFtZXRlciBrbm93biBhcyBgZ2NfZ3JhY2Vfc2Vjb25kc2AgZm9yIGV2ZXJ5IHRhYmxlIGluIENhc3NhbmRyYS4KLQotPT09IFRoZSBnY19ncmFjZV9zZWNvbmRzIHBhcmFtZXRlciBhbmQgVG9tYnN0b25lIFJlbW92YWwKLQotVGhlIHRhYmxlIGxldmVsIGBnY19ncmFjZV9zZWNvbmRzYCBwYXJhbWV0ZXIgY29udHJvbHMgaG93IGxvbmcgQ2Fzc2FuZHJhCi13aWxsIHJldGFpbiB0b21ic3RvbmVzIHRocm91Z2ggY29tcGFjdGlvbiBldmVudHMgYmVmb3JlIGZpbmFsbHkgcmVtb3ZpbmcKLXRoZW0uIFRoaXMgZHVyYXRpb24gc2hvdWxkIGRpcmVjdGx5IHJlZmxlY3QgdGhlIGFtb3VudCBvZiB0aW1lIGEgdXNlcgotZXhwZWN0cyB0byBhbGxvdyBiZWZvcmUgcmVjb3ZlcmluZyBhIGZhaWxlZCBub2RlLiBBZnRlcgotYGdjX2dyYWNlX3NlY29uZHNgIGhhcyBleHBpcmVkIHRoZSB0b21ic3RvbmUgbWF5IGJlIHJlbW92ZWQgKG1lYW5pbmcKLXRoZXJlIHdpbGwgbm8gbG9uZ2VyIGJlIGFueSByZWNvcmQgdGhhdCBhIGNlcnRhaW4gcGllY2Ugb2YgZGF0YSB3YXMKLWRlbGV0ZWQpLCBidXQgYXMgYSB0b21ic3RvbmUgY2FuIGxpdmUgaW4gb25lIHNzdGFibGUgYW5kIHRoZSBkYXRhIGl0Ci1jb3ZlcnMgaW4gYW5vdGhlciwgYSBjb21wYWN0aW9uIG11c3QgYWxzbyBpbmNsdWRlIGJvdGggc3N0YWJsZSBmb3IgYQotdG9tYnN0b25lIHRvIGJlIHJlbW92ZWQuIE1vcmUgcHJlY2lzZWx5LCB0byBiZSBhYmxlIHRvIGRyb3AgYW4gYWN0dWFsCi10b21ic3RvbmUgdGhlIGZvbGxvd2luZyBuZWVkcyB0byBiZSB0cnVlOwotCi0qIFRoZSB0b21ic3RvbmUgbXVzdCBiZSBvbGRlciB0aGFuIGBnY19ncmFjZV9zZWNvbmRzYAotKiBJZiBwYXJ0aXRpb24gWCBjb250YWlucyB0aGUgdG9tYnN0b25lLCB0aGUgc3N0YWJsZSBjb250YWluaW5nIHRoZQotcGFydGl0aW9uIHBsdXMgYWxsIFNTVGFibGVzIGNvbnRhaW5pbmcgZGF0YSBvbGRlciB0aGFuIHRoZSB0b21ic3RvbmUKLWNvbnRhaW5pbmcgWCBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBzYW1lIGNvbXBhY3Rpb24uIFdlIGRvbid0IG5lZWQgdG8KLWNhcmUgaWYgdGhlIHBhcnRpdGlvbiBpcyBpbiBhbiBzc3RhYmxlIGlmIHdlIGNhbiBndWFyYW50ZWUgdGhhdCBhbGwgZGF0YQotaW4gdGhhdCBzc3RhYmxlIGlzIG5ld2VyIHRoYW4gdGhlIHRvbWJzdG9uZS4gSWYgdGhlIHRvbWJzdG9uZSBpcyBvbGRlcgotdGhhbiB0aGUgZGF0YSBpdCBjYW5ub3Qgc2hhZG93IHRoYXQgZGF0YS4KLSogSWYgdGhlIG9wdGlvbiBgb25seV9wdXJnZV9yZXBhaXJlZF90b21ic3RvbmVzYCBpcyBlbmFibGVkLCB0b21ic3RvbmVzCi1hcmUgb25seSByZW1vdmVkIGlmIHRoZSBkYXRhIGhhcyBhbHNvIGJlZW4gcmVwYWlyZWQuCi0KLUlmIGEgbm9kZSByZW1haW5zIGRvd24gb3IgZGlzY29ubmVjdGVkIGZvciBsb25nZXIgdGhhbgotYGdjX2dyYWNlX3NlY29uZHNgIGl0J3MgZGVsZXRlZCBkYXRhIHdpbGwgYmUgcmVwYWlyZWQgYmFjayB0byB0aGUgb3RoZXIKLW5vZGVzIGFuZCByZS1hcHBlYXIgaW4gdGhlIGNsdXN0ZXIuIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIGluIHRoZQotIkRlbGV0ZXMgd2l0aG91dCBUb21ic3RvbmVzIiBzZWN0aW9uLiBOb3RlIHRoYXQgdG9tYnN0b25lcyB3aWxsIG5vdCBiZQotcmVtb3ZlZCB1bnRpbCBhIGNvbXBhY3Rpb24gZXZlbnQgZXZlbiBpZiBgZ2NfZ3JhY2Vfc2Vjb25kc2AgaGFzIGVsYXBzZWQuCi0KLVRoZSBkZWZhdWx0IHZhbHVlIGZvciBgZ2NfZ3JhY2Vfc2Vjb25kc2AgaXMgODY0MDAwIHdoaWNoIGlzIGVxdWl2YWxlbnQKLXRvIDEwIGRheXMuIFRoaXMgY2FuIGJlIHNldCB3aGVuIGNyZWF0aW5nIG9yIGFsdGVyaW5nIGEgdGFibGUgdXNpbmcKLWBXSVRIIGdjX2dyYWNlX3NlY29uZHNgLgotCi09PSBUVEwKLQotRGF0YSBpbiBDYXNzYW5kcmEgY2FuIGhhdmUgYW4gYWRkaXRpb25hbCBwcm9wZXJ0eSBjYWxsZWQgdGltZSB0byBsaXZlIC0KLXRoaXMgaXMgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGRyb3AgZGF0YSB0aGF0IGhhcyBleHBpcmVkIG9uY2UgdGhlIHRpbWUKLWlzIHJlYWNoZWQuIE9uY2UgdGhlIFRUTCBoYXMgZXhwaXJlZCB0aGUgZGF0YSBpcyBjb252ZXJ0ZWQgdG8gYQotdG9tYnN0b25lIHdoaWNoIHN0YXlzIGFyb3VuZCBmb3IgYXQgbGVhc3QgYGdjX2dyYWNlX3NlY29uZHNgLiBOb3RlIHRoYXQKLWlmIHlvdSBtaXggZGF0YSB3aXRoIFRUTCBhbmQgZGF0YSB3aXRob3V0IFRUTCAob3IganVzdCBkaWZmZXJlbnQgbGVuZ3RoCi1vZiB0aGUgVFRMKSBDYXNzYW5kcmEgd2lsbCBoYXZlIGEgaGFyZCB0aW1lIGRyb3BwaW5nIHRoZSB0b21ic3RvbmVzCi1jcmVhdGVkIHNpbmNlIHRoZSBwYXJ0aXRpb24gbWlnaHQgc3BhbiBtYW55IFNTVGFibGVzIGFuZCBub3QgYWxsIGFyZQotY29tcGFjdGVkIGF0IG9uY2UuCi0KLT09IEZ1bGx5IGV4cGlyZWQgU1NUYWJsZXMKLQotSWYgYW4gc3N0YWJsZSBjb250YWlucyBvbmx5IHRvbWJzdG9uZXMgYW5kIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGF0Ci1zc3RhYmxlIGlzIG5vdCBzaGFkb3dpbmcgZGF0YSBpbiBhbnkgb3RoZXIgc3N0YWJsZSBjb21wYWN0aW9uIGNhbiBkcm9wCi10aGF0IHNzdGFibGUuIElmIHlvdSBzZWUgU1NUYWJsZXMgd2l0aCBvbmx5IHRvbWJzdG9uZXMgKG5vdGUgdGhhdCBUVEw6ZWQKLWRhdGEgaXMgY29uc2lkZXJlZCB0b21ic3RvbmVzIG9uY2UgdGhlIHRpbWUgdG8gbGl2ZSBoYXMgZXhwaXJlZCkgYnV0IGl0Ci1pcyBub3QgYmVpbmcgZHJvcHBlZCBieSBjb21wYWN0aW9uLCBpdCBpcyBsaWtlbHkgdGhhdCBvdGhlciBTU1RhYmxlcwotY29udGFpbiBvbGRlciBkYXRhLiBUaGVyZSBpcyBhIHRvb2wgY2FsbGVkIGBzc3RhYmxlZXhwaXJlZGJsb2NrZXJzYCB0aGF0Ci13aWxsIGxpc3Qgd2hpY2ggU1NUYWJsZXMgYXJlIGRyb3BwYWJsZSBhbmQgd2hpY2ggYXJlIGJsb2NraW5nIHRoZW0gZnJvbQotYmVpbmcgZHJvcHBlZC4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgdGltZSBzZXJpZXMgY29tcGFjdGlvbiB3aXRoCi1gVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneWAgKGFuZCB0aGUgZGVwcmVjYXRlZAotYERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lgKS4gV2l0aCBgVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneWAgaXQKLWlzIHBvc3NpYmxlIHRvIHJlbW92ZSB0aGUgZ3VhcmFudGVlIChub3QgY2hlY2sgZm9yIHNoYWRvd2luZyBkYXRhKSBieQotZW5hYmxpbmcgYHVuc2FmZV9hZ2dyZXNzaXZlX3NzdGFibGVfZXhwaXJhdGlvbmAuCi0KLT09IFJlcGFpcmVkL3VucmVwYWlyZWQgZGF0YQotCi1XaXRoIGluY3JlbWVudGFsIHJlcGFpcnMgQ2Fzc2FuZHJhIG11c3Qga2VlcCB0cmFjayBvZiB3aGF0IGRhdGEgaXMKLXJlcGFpcmVkIGFuZCB3aGF0IGRhdGEgaXMgdW5yZXBhaXJlZC4gV2l0aCBhbnRpY29tcGFjdGlvbiByZXBhaXJlZCBkYXRhCi1pcyBzcGxpdCBvdXQgaW50byByZXBhaXJlZCBhbmQgdW5yZXBhaXJlZCBTU1RhYmxlcy4gVG8gYXZvaWQgbWl4aW5nIHVwCi10aGUgZGF0YSBhZ2FpbiBzZXBhcmF0ZSBjb21wYWN0aW9uIHN0cmF0ZWd5IGluc3RhbmNlcyBhcmUgcnVuIG9uIHRoZSB0d28KLXNldHMgb2YgZGF0YSwgZWFjaCBpbnN0YW5jZSBvbmx5IGtub3dpbmcgYWJvdXQgZWl0aGVyIHRoZSByZXBhaXJlZCBvcgotdGhlIHVucmVwYWlyZWQgU1NUYWJsZXMuIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3Ugb25seSBydW4gaW5jcmVtZW50YWwKLXJlcGFpciBvbmNlIGFuZCB0aGVuIG5ldmVyIGFnYWluLCB5b3UgbWlnaHQgaGF2ZSB2ZXJ5IG9sZCBkYXRhIGluIHRoZQotcmVwYWlyZWQgU1NUYWJsZXMgdGhhdCBibG9jayBjb21wYWN0aW9uIGZyb20gZHJvcHBpbmcgdG9tYnN0b25lcyBpbiB0aGUKLXVucmVwYWlyZWQgKHByb2JhYmx5IG5ld2VyKSBTU1RhYmxlcy4KLQotPT0gRGF0YSBkaXJlY3RvcmllcwotCi1TaW5jZSB0b21ic3RvbmVzIGFuZCBkYXRhIGNhbiBsaXZlIGluIGRpZmZlcmVudCBTU1RhYmxlcyBpdCBpcyBpbXBvcnRhbnQKLXRvIHJlYWxpemUgdGhhdCBsb3NpbmcgYW4gc3N0YWJsZSBtaWdodCBsZWFkIHRvIGRhdGEgYmVjb21pbmcgbGl2ZSBhZ2FpbgotLSB0aGUgbW9zdCBjb21tb24gd2F5IG9mIGxvc2luZyBTU1RhYmxlcyBpcyB0byBoYXZlIGEgaGFyZCBkcml2ZSBicmVhawotZG93bi4gVG8gYXZvaWQgbWFraW5nIGRhdGEgbGl2ZSB0b21ic3RvbmVzIGFuZCBhY3R1YWwgZGF0YSBhcmUgYWx3YXlzIGluCi10aGUgc2FtZSBkYXRhIGRpcmVjdG9yeS4gVGhpcyB3YXksIGlmIGEgZGlzayBpcyBsb3N0LCBhbGwgdmVyc2lvbnMgb2YgYQotcGFydGl0aW9uIGFyZSBsb3N0IGFuZCBubyBkYXRhIGNhbiBnZXQgdW5kZWxldGVkLiBUbyBhY2hpZXZlIHRoaXMgYQotY29tcGFjdGlvbiBzdHJhdGVneSBpbnN0YW5jZSBwZXIgZGF0YSBkaXJlY3RvcnkgaXMgcnVuIGluIGFkZGl0aW9uIHRvCi10aGUgY29tcGFjdGlvbiBzdHJhdGVneSBpbnN0YW5jZXMgY29udGFpbmluZyByZXBhaXJlZC91bnJlcGFpcmVkIGRhdGEsCi10aGlzIG1lYW5zIHRoYXQgaWYgeW91IGhhdmUgNCBkYXRhIGRpcmVjdG9yaWVzIHRoZXJlIHdpbGwgYmUgOAotY29tcGFjdGlvbiBzdHJhdGVneSBpbnN0YW5jZXMgcnVubmluZy4gVGhpcyBoYXMgYSBmZXcgbW9yZSBiZW5lZml0cyB0aGFuCi1qdXN0IGF2b2lkaW5nIGRhdGEgZ2V0dGluZyB1bmRlbGV0ZWQ6Ci0KLSogSXQgaXMgcG9zc2libGUgdG8gcnVuIG1vcmUgY29tcGFjdGlvbnMgaW4gcGFyYWxsZWwgLSBsZXZlbGVkCi1jb21wYWN0aW9uIHdpbGwgaGF2ZSBzZXZlcmFsIHRvdGFsbHkgc2VwYXJhdGUgbGV2ZWxpbmdzIGFuZCBlYWNoIG9uZSBjYW4KLXJ1biBjb21wYWN0aW9ucyBpbmRlcGVuZGVudGx5IGZyb20gdGhlIG90aGVycy4KLSogVXNlcnMgY2FuIGJhY2t1cCBhbmQgcmVzdG9yZSBhIHNpbmdsZSBkYXRhIGRpcmVjdG9yeS4KLSogTm90ZSB0aG91Z2ggdGhhdCBjdXJyZW50bHkgYWxsIGRhdGEgZGlyZWN0b3JpZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwsCi1zbyBpZiB5b3UgaGF2ZSBhIHRpbnkgZGlzayBhbmQgYSBiaWcgZGlzayBiYWNraW5nIHR3byBkYXRhIGRpcmVjdG9yaWVzLAotdGhlIGJpZyBvbmUgd2lsbCBiZSBsaW1pdGVkIHRoZSBieSB0aGUgc21hbGwgb25lLiBPbmUgd29yayBhcm91bmQgdG8KLXRoaXMgaXMgdG8gY3JlYXRlIG1vcmUgZGF0YSBkaXJlY3RvcmllcyBiYWNrZWQgYnkgdGhlIGJpZyBkaXNrLgotCi09PSBTaW5nbGUgc3N0YWJsZSB0b21ic3RvbmUgY29tcGFjdGlvbgotCi1XaGVuIGFuIHNzdGFibGUgaXMgd3JpdHRlbiBhIGhpc3RvZ3JhbSB3aXRoIHRoZSB0b21ic3RvbmUgZXhwaXJ5IHRpbWVzCi1pcyBjcmVhdGVkIGFuZCB0aGlzIGlzIHVzZWQgdG8gdHJ5IHRvIGZpbmQgU1NUYWJsZXMgd2l0aCB2ZXJ5IG1hbnkKLXRvbWJzdG9uZXMgYW5kIHJ1biBzaW5nbGUgc3N0YWJsZSBjb21wYWN0aW9uIG9uIHRoYXQgc3N0YWJsZSBpbiBob3BlIG9mCi1iZWluZyBhYmxlIHRvIGRyb3AgdG9tYnN0b25lcyBpbiB0aGF0IHNzdGFibGUuIEJlZm9yZSBzdGFydGluZyB0aGlzIGl0Ci1pcyBhbHNvIGNoZWNrZWQgaG93IGxpa2VseSBpdCBpcyB0aGF0IGFueSB0b21ic3RvbmVzIHdpbGwgYWN0dWFsbHkgd2lsbAotYmUgYWJsZSB0byBiZSBkcm9wcGVkIGhvdyBtdWNoIHRoaXMgc3N0YWJsZSBvdmVybGFwcyB3aXRoIG90aGVyCi1TU1RhYmxlcy4gVG8gYXZvaWQgbW9zdCBvZiB0aGVzZSBjaGVja3MgdGhlIGNvbXBhY3Rpb24gb3B0aW9uCi1gdW5jaGVja2VkX3RvbWJzdG9uZV9jb21wYWN0aW9uYCBjYW4gYmUgZW5hYmxlZC4KLQotW1tjb21wYWN0aW9uLW9wdGlvbnNdXQotPT0gQ29tbW9uIG9wdGlvbnMKLQotVGhlcmUgaXMgYSBudW1iZXIgb2YgY29tbW9uIG9wdGlvbnMgZm9yIGFsbCB0aGUgY29tcGFjdGlvbiBzdHJhdGVnaWVzOwotCi1gZW5hYmxlZGAgKGRlZmF1bHQ6IHRydWUpOjoKLSAgV2hldGhlciBtaW5vciBjb21wYWN0aW9ucyBzaG91bGQgcnVuLiBOb3RlIHRoYXQgeW91IGNhbiBoYXZlCi0gICdlbmFibGVkJzogdHJ1ZSBhcyBhIGNvbXBhY3Rpb24gb3B0aW9uIGFuZCB0aGVuIGRvICdub2RldG9vbAotICBlbmFibGVhdXRvY29tcGFjdGlvbicgdG8gc3RhcnQgcnVubmluZyBjb21wYWN0aW9ucy4KLWB0b21ic3RvbmVfdGhyZXNob2xkYCAoZGVmYXVsdDogMC4yKTo6Ci0gIEhvdyBtdWNoIG9mIHRoZSBzc3RhYmxlIHNob3VsZCBiZSB0b21ic3RvbmVzIGZvciB1cyB0byBjb25zaWRlciBkb2luZwotICBhIHNpbmdsZSBzc3RhYmxlIGNvbXBhY3Rpb24gb2YgdGhhdCBzc3RhYmxlLgotYHRvbWJzdG9uZV9jb21wYWN0aW9uX2ludGVydmFsYCAoZGVmYXVsdDogODY0MDBzICgxIGRheSkpOjoKLSAgU2luY2UgaXQgbWlnaHQgbm90IGJlIHBvc3NpYmxlIHRvIGRyb3AgYW55IHRvbWJzdG9uZXMgd2hlbiBkb2luZyBhCi0gIHNpbmdsZSBzc3RhYmxlIGNvbXBhY3Rpb24gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBvbmUgc3N0YWJsZSBpcyBub3QKLSAgY29uc3RhbnRseSBnZXR0aW5nIHJlY29tcGFjdGVkIC0gdGhpcyBvcHRpb24gc3RhdGVzIGhvdyBvZnRlbiB3ZQotICBzaG91bGQgdHJ5IGZvciBhIGdpdmVuIHNzdGFibGUuCi1gbG9nX2FsbGAgKGRlZmF1bHQ6IGZhbHNlKTo6Ci0gIE5ldyBkZXRhaWxlZCBjb21wYWN0aW9uIGxvZ2dpbmcsIHNlZQotICBgYmVsb3cgPGRldGFpbGVkLWNvbXBhY3Rpb24tbG9nZ2luZz5gLgotYHVuY2hlY2tlZF90b21ic3RvbmVfY29tcGFjdGlvbmAgKGRlZmF1bHQ6IGZhbHNlKTo6Ci0gIFRoZSBzaW5nbGUgc3N0YWJsZSBjb21wYWN0aW9uIGhhcyBxdWl0ZSBzdHJpY3QgY2hlY2tzIGZvciB3aGV0aGVyIGl0Ci0gIHNob3VsZCBiZSBzdGFydGVkLCB0aGlzIG9wdGlvbiBkaXNhYmxlcyB0aG9zZSBjaGVja3MgYW5kIGZvciBzb21lCi0gIHVzZWNhc2VzIHRoaXMgbWlnaHQgYmUgbmVlZGVkLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBjaGFuZ2UgYW55dGhpbmcKLSAgZm9yIHRoZSBhY3R1YWwgY29tcGFjdGlvbiwgdG9tYnN0b25lcyBhcmUgb25seSBkcm9wcGVkIGlmIGl0IGlzIHNhZmUKLSAgdG8gZG8gc28gLSBpdCBtaWdodCBqdXN0IHJld3JpdGUgYW4gc3N0YWJsZSB3aXRob3V0IGJlaW5nIGFibGUgdG8gZHJvcAotICBhbnkgdG9tYnN0b25lcy4KLWBvbmx5X3B1cmdlX3JlcGFpcmVkX3RvbWJzdG9uZWAgKGRlZmF1bHQ6IGZhbHNlKTo6Ci0gIE9wdGlvbiB0byBlbmFibGUgdGhlIGV4dHJhIHNhZmV0eSBvZiBtYWtpbmcgc3VyZSB0aGF0IHRvbWJzdG9uZXMgYXJlCi0gIG9ubHkgZHJvcHBlZCBpZiB0aGUgZGF0YSBoYXMgYmVlbiByZXBhaXJlZC4KLWBtaW5fdGhyZXNob2xkYCAoZGVmYXVsdDogNCk6OgotICBMb3dlciBsaW1pdCBvZiBudW1iZXIgb2YgU1NUYWJsZXMgYmVmb3JlIGEgY29tcGFjdGlvbiBpcyB0cmlnZ2VyZWQuCi0gIE5vdCB1c2VkIGZvciBgTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneWAuCi1gbWF4X3RocmVzaG9sZGAgKGRlZmF1bHQ6IDMyKTo6Ci0gIFVwcGVyIGxpbWl0IG9mIG51bWJlciBvZiBTU1RhYmxlcyBiZWZvcmUgYSBjb21wYWN0aW9uIGlzIHRyaWdnZXJlZC4KLSAgTm90IHVzZWQgZm9yIGBMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5YC4KLQotRnVydGhlciwgc2VlIHRoZSBzZWN0aW9uIG9uIGVhY2ggc3RyYXRlZ3kgZm9yIHNwZWNpZmljIGFkZGl0aW9uYWwKLW9wdGlvbnMuCi0KLT09IENvbXBhY3Rpb24gbm9kZXRvb2wgY29tbWFuZHMKLQotVGhlIGBub2RldG9vbCA8bm9kZXRvb2w+YCB1dGlsaXR5IHByb3ZpZGVzIGEgbnVtYmVyIG9mIGNvbW1hbmRzIHJlbGF0ZWQKLXRvIGNvbXBhY3Rpb246Ci0KLWBlbmFibGVhdXRvY29tcGFjdGlvbmA6OgotICBFbmFibGUgY29tcGFjdGlvbi4KLWBkaXNhYmxlYXV0b2NvbXBhY3Rpb25gOjoKLSAgRGlzYWJsZSBjb21wYWN0aW9uLgotYHNldGNvbXBhY3Rpb250aHJvdWdocHV0YDo6Ci0gIEhvdyBmYXN0IGNvbXBhY3Rpb24gc2hvdWxkIHJ1biBhdCBtb3N0IC0gZGVmYXVsdHMgdG8gNjRNaUIvcy4KLWBjb21wYWN0aW9uc3RhdHNgOjoKLSAgU3RhdGlzdGljcyBhYm91dCBjdXJyZW50IGFuZCBwZW5kaW5nIGNvbXBhY3Rpb25zLgotYGNvbXBhY3Rpb25oaXN0b3J5YDo6Ci0gIExpc3QgZGV0YWlscyBhYm91dCB0aGUgbGFzdCBjb21wYWN0aW9ucy4KLWBzZXRjb21wYWN0aW9udGhyZXNob2xkYDo6Ci0gIFNldCB0aGUgbWluL21heCBzc3RhYmxlIGNvdW50IGZvciB3aGVuIHRvIHRyaWdnZXIgY29tcGFjdGlvbiwgZGVmYXVsdHMKLSAgdG8gNC8zMi4KLQotPT0gU3dpdGNoaW5nIHRoZSBjb21wYWN0aW9uIHN0cmF0ZWd5IGFuZCBvcHRpb25zIHVzaW5nIEpNWAotCi1JdCBpcyBwb3NzaWJsZSB0byBzd2l0Y2ggY29tcGFjdGlvbiBzdHJhdGVnaWVzIGFuZCBpdHMgb3B0aW9ucyBvbiBqdXN0IGEKLXNpbmdsZSBub2RlIHVzaW5nIEpNWCwgdGhpcyBpcyBhIGdyZWF0IHdheSB0byBleHBlcmltZW50IHdpdGggc2V0dGluZ3MKLXdpdGhvdXQgYWZmZWN0aW5nIHRoZSB3aG9sZSBjbHVzdGVyLiBUaGUgbWJlYW4gaXM6Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLW9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOnR5cGU9Q29sdW1uRmFtaWxpZXMsa2V5c3BhY2U9PGtleXNwYWNlX25hbWU+LGNvbHVtbmZhbWlseT08dGFibGVfbmFtZT4KLS0tLS0KLQotYW5kIHRoZSBhdHRyaWJ1dGUgdG8gY2hhbmdlIGlzIGBDb21wYWN0aW9uUGFyYW1ldGVyc2Agb3IKLWBDb21wYWN0aW9uUGFyYW1ldGVyc0pzb25gIGlmIHlvdSB1c2UgamNvbnNvbGUgb3Igam1jLiBUaGUgc3ludGF4IGZvcgotdGhlIGpzb24gdmVyc2lvbiBpcyB0aGUgc2FtZSBhcyB5b3Ugd291bGQgdXNlIGluIGFuCi1gQUxURVIgVEFCTEUgPGFsdGVyLXRhYmxlLXN0YXRlbWVudD5gIHN0YXRlbWVudCAtZm9yIGV4YW1wbGU6Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLXsgJ2NsYXNzJzogJ0xldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3knLCAnc3N0YWJsZV9zaXplX2luX21iJzogMTIzLCAnZmFub3V0X3NpemUnOiAxMH0KLS0tLS0KLQotVGhlIHNldHRpbmcgaXMga2VwdCB1bnRpbCBzb21lb25lIGV4ZWN1dGVzIGFuCi1gQUxURVIgVEFCTEUgPGFsdGVyLXRhYmxlLXN0YXRlbWVudD5gIHRoYXQgdG91Y2hlcyB0aGUgY29tcGFjdGlvbgotc2V0dGluZ3Mgb3IgcmVzdGFydHMgdGhlIG5vZGUuCi0KLVtbZGV0YWlsZWQtY29tcGFjdGlvbi1sb2dnaW5nXV0KLT09IE1vcmUgZGV0YWlsZWQgY29tcGFjdGlvbiBsb2dnaW5nCi0KLUVuYWJsZSB3aXRoIHRoZSBjb21wYWN0aW9uIG9wdGlvbiBgbG9nX2FsbGAgYW5kIGEgbW9yZSBkZXRhaWxlZAotY29tcGFjdGlvbiBsb2cgZmlsZSB3aWxsIGJlIHByb2R1Y2VkIGluIHlvdXIgbG9nIGRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvaW5kZXguYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY3NDMwYS4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL2luZGV4LmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi09PSBPcGVyYXRpbmcgQ2Fzc2FuZHJhCi0KLSogeHJlZjpvcGVyYXRpbmcvaGFyZHdhcmUuYWRvY1tIYXJkd2FyZV0KLSogeHJlZjpvcGVyYXRpbmcvc2VjdXJpdHkuYWRvY1tTZWN1cml0eV0KLSogeHJlZjpvcGVyYXRpbmcvdG9wb19jaGFuZ2VzLmFkb2NbVG9wb2xvZ3kgY2hhbmdlc10KLSogeHJlZjpvcGVyYXRpbmcvaGludHMuYWRvY1tIaW50c10KLSogeHJlZjpvcGVyYXRpbmcvcmVwYWlyLmFkb2NbUmVwYWlyXQotKiB4cmVmOm9wZXJhdGluZy9yZWFkX3JlcGFpci5hZG9jW1JlYWQgcmVwYWlyXQotKiB4cmVmOm9wZXJhdGluZy9iYWNrdXBzLmFkb2NbQmFja3Vwc10KLSogeHJlZjpvcGVyYXRpbmcvY29tcHJlc3Npb24uYWRvY1tDb21wcmVzc2lvbl0KLSogeHJlZjpvcGVyYXRpbmcvY29tcGFjdGlvbi9pbmRleC5hZG9jW0NvbXBhY3Rpb25dCi0qIHhyZWY6b3BlcmF0aW5nL21ldHJpY3MuYWRvY1tNb25pdG9yaW5nXQotKiB4cmVmOm9wZXJhdGluZy9idWxrX2xvYWRpbmcuYWRvY1tCdWxrIGxvYWRpbmddCi0qIHhyZWY6b3BlcmF0aW5nL2NkYy5hZG9jW0NEQ10KLSogeHJlZjpvcGVyYXRpbmcvYmxvb21fZmlsdGVycy5hZG9jW0Jsb29tIGZpbHRlcnNdCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL21ldHJpY3MuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvbWV0cmljcy5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWI4MTU2Li4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vcGVyYXRpbmcvbWV0cmljcy5hZG9jCisrKyAvZGV2L251bGwKQEAgLTEsMTA4OCArMCwwIEBACi09IE1vbml0b3JpbmcKLQotTWV0cmljcyBpbiBDYXNzYW5kcmEgYXJlIG1hbmFnZWQgdXNpbmcgdGhlCi1odHRwOi8vbWV0cmljcy5kcm9wd2l6YXJkLmlvW0Ryb3B3aXphcmQgTWV0cmljc10gbGlicmFyeS4gVGhlc2UgbWV0cmljcwotY2FuIGJlIHF1ZXJpZWQgdmlhIEpNWCBvciBwdXNoZWQgdG8gZXh0ZXJuYWwgbW9uaXRvcmluZyBzeXN0ZW1zIHVzaW5nIGEKLW51bWJlciBvZgotaHR0cDovL21ldHJpY3MuZHJvcHdpemFyZC5pby8zLjEuMC9nZXR0aW5nLXN0YXJ0ZWQvI290aGVyLXJlcG9ydGluZ1tidWlsdAotaW5dIGFuZCBodHRwOi8vbWV0cmljcy5kcm9wd2l6YXJkLmlvLzMuMS4wL21hbnVhbC90aGlyZC1wYXJ0eS9bdGhpcmQKLXBhcnR5XSByZXBvcnRlciBwbHVnaW5zLgotCi1NZXRyaWNzIGFyZSBjb2xsZWN0ZWQgZm9yIGEgc2luZ2xlIG5vZGUuIEl0J3MgdXAgdG8gdGhlIG9wZXJhdG9yIHRvIHVzZQotYW4gZXh0ZXJuYWwgbW9uaXRvcmluZyBzeXN0ZW0gdG8gYWdncmVnYXRlIHRoZW0uCi0KLT09IE1ldHJpYyBUeXBlcwotCi1BbGwgbWV0cmljcyByZXBvcnRlZCBieSBjYXNzYW5kcmEgZml0IGludG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMuCi0KLWBHYXVnZWA6OgotICBBbiBpbnN0YW50YW5lb3VzIG1lYXN1cmVtZW50IG9mIGEgdmFsdWUuCi1gQ291bnRlcmA6OgotICBBIGdhdWdlIGZvciBhbiBgQXRvbWljTG9uZ2AgaW5zdGFuY2UuIFR5cGljYWxseSB0aGlzIGlzIGNvbnN1bWVkIGJ5Ci0gIG1vbml0b3JpbmcgdGhlIGNoYW5nZSBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGxhcmdlCi0gIGluY3JlYXNlIGNvbXBhcmVkIHRvIHRoZSBub3JtLgotYEhpc3RvZ3JhbWA6OgotICBNZWFzdXJlcyB0aGUgc3RhdGlzdGljYWwgZGlzdHJpYnV0aW9uIG9mIHZhbHVlcyBpbiBhIHN0cmVhbSBvZiBkYXRhLgotICArCi0gIEluIGFkZGl0aW9uIHRvIG1pbmltdW0sIG1heGltdW0sIG1lYW4sIGV0Yy4sIGl0IGFsc28gbWVhc3VyZXMgbWVkaWFuLAotICA3NXRoLCA5MHRoLCA5NXRoLCA5OHRoLCA5OXRoLCBhbmQgOTkuOXRoIHBlcmNlbnRpbGVzLgotYFRpbWVyYDo6Ci0gIE1lYXN1cmVzIGJvdGggdGhlIHJhdGUgdGhhdCBhIHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZSBpcyBjYWxsZWQgYW5kCi0gIHRoZSBoaXN0b2dyYW0gb2YgaXRzIGR1cmF0aW9uLgotYExhdGVuY3lgOjoKLSAgU3BlY2lhbCB0eXBlIHRoYXQgdHJhY2tzIGxhdGVuY3kgKGluIG1pY3Jvc2Vjb25kcykgd2l0aCBhIGBUaW1lcmAgcGx1cwotICBhIGBDb3VudGVyYCB0aGF0IHRyYWNrcyB0aGUgdG90YWwgbGF0ZW5jeSBhY2NydWVkIHNpbmNlIHN0YXJ0aW5nLiBUaGUKLSAgZm9ybWVyIGlzIHVzZWZ1bCBpZiB5b3UgdHJhY2sgdGhlIGNoYW5nZSBpbiB0b3RhbCBsYXRlbmN5IHNpbmNlIHRoZQotICBsYXN0IGNoZWNrLiBFYWNoIG1ldHJpYyBuYW1lIG9mIHRoaXMgdHlwZSB3aWxsIGhhdmUgJ0xhdGVuY3knIGFuZAotICAnVG90YWxMYXRlbmN5JyBhcHBlbmRlZCB0byBpdC4KLWBNZXRlcmA6OgotICBBIG1ldGVyIG1ldHJpYyB3aGljaCBtZWFzdXJlcyBtZWFuIHRocm91Z2hwdXQgYW5kIG9uZS0sIGZpdmUtLCBhbmQKLSAgZmlmdGVlbi1taW51dGUgZXhwb25lbnRpYWxseS13ZWlnaHRlZCBtb3ZpbmcgYXZlcmFnZSB0aHJvdWdocHV0cy4KLQotPT0gVGFibGUgTWV0cmljcwotCi1FYWNoIHRhYmxlIGluIENhc3NhbmRyYSBoYXMgbWV0cmljcyByZXNwb25zaWJsZSBmb3IgdHJhY2tpbmcgaXRzIHN0YXRlCi1hbmQgcGVyZm9ybWFuY2UuCi0KLVRoZSBtZXRyaWMgbmFtZXMgYXJlIGFsbCBhcHBlbmRlZCB3aXRoIHRoZSBzcGVjaWZpYyBgS2V5c3BhY2VgIGFuZAotYFRhYmxlYCBuYW1lLgotCi1SZXBvcnRlZCBuYW1lIGZvcm1hdDoKLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlRhYmxlLjxNZXRyaWNOYW1lPi48S2V5c3BhY2U+LjxUYWJsZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9VGFibGUga2V5c3BhY2U9PEtleXNwYWNlPiBzY29wZT08VGFibGU+IG5hbWU9PE1ldHJpY05hbWU+YAotCi1bTk9URV0KLS5Ob3RlCi09PT09Ci1UaGVyZSBpcyBhIHNwZWNpYWwgdGFibGUgY2FsbGVkICdgYWxsYCcgd2l0aG91dCBhIGtleXNwYWNlLiBUaGlzCi1yZXByZXNlbnRzIHRoZSBhZ2dyZWdhdGlvbiBvZiBtZXRyaWNzIGFjcm9zcyAqYWxsKiB0YWJsZXMgYW5kIGtleXNwYWNlcwotb24gdGhlIG5vZGUuCi09PT09W2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgotfE1lbXRhYmxlT25IZWFwU2l6ZSB8R2F1Z2U8TG9uZz4gfFRvdGFsIGFtb3VudCBvZiBkYXRhIHN0b3JlZCBpbiB0aGUKLW1lbXRhYmxlIHRoYXQgcmVzaWRlcyAqb24qLWhlYXAsIGluY2x1ZGluZyBjb2x1bW4gcmVsYXRlZCBvdmVyaGVhZCBhbmQKLXBhcnRpdGlvbnMgb3ZlcndyaXR0ZW4uCi0KLXxNZW10YWJsZU9mZkhlYXBTaXplIHxHYXVnZTxMb25nPiB8VG90YWwgYW1vdW50IG9mIGRhdGEgc3RvcmVkIGluIHRoZQotbWVtdGFibGUgdGhhdCByZXNpZGVzICpvZmYqLWhlYXAsIGluY2x1ZGluZyBjb2x1bW4gcmVsYXRlZCBvdmVyaGVhZCBhbmQKLXBhcnRpdGlvbnMgb3ZlcndyaXR0ZW4uCi0KLXxNZW10YWJsZUxpdmVEYXRhU2l6ZSB8R2F1Z2U8TG9uZz4gfFRvdGFsIGFtb3VudCBvZiBsaXZlIGRhdGEgc3RvcmVkIGluCi10aGUgbWVtdGFibGUsIGV4Y2x1ZGluZyBhbnkgZGF0YSBzdHJ1Y3R1cmUgb3ZlcmhlYWQuCi0KLXxBbGxNZW10YWJsZXNPbkhlYXBTaXplIHxHYXVnZTxMb25nPiB8VG90YWwgYW1vdW50IG9mIGRhdGEgc3RvcmVkIGluIHRoZQotbWVtdGFibGVzICgyaSBhbmQgcGVuZGluZyBmbHVzaCBtZW10YWJsZXMgaW5jbHVkZWQpIHRoYXQgcmVzaWRlcwotKm9uKi1oZWFwLgotCi18QWxsTWVtdGFibGVzT2ZmSGVhcFNpemUgfEdhdWdlPExvbmc+IHxUb3RhbCBhbW91bnQgb2YgZGF0YSBzdG9yZWQgaW4KLXRoZSBtZW10YWJsZXMgKDJpIGFuZCBwZW5kaW5nIGZsdXNoIG1lbXRhYmxlcyBpbmNsdWRlZCkgdGhhdCByZXNpZGVzCi0qb2ZmKi1oZWFwLgotCi18QWxsTWVtdGFibGVzTGl2ZURhdGFTaXplIHxHYXVnZTxMb25nPiB8VG90YWwgYW1vdW50IG9mIGxpdmUgZGF0YSBzdG9yZWQKLWluIHRoZSBtZW10YWJsZXMgKDJpIGFuZCBwZW5kaW5nIGZsdXNoIG1lbXRhYmxlcyBpbmNsdWRlZCkgdGhhdCByZXNpZGVzCi1vZmYtaGVhcCwgZXhjbHVkaW5nIGFueSBkYXRhIHN0cnVjdHVyZSBvdmVyaGVhZC4KLQotfE1lbXRhYmxlQ29sdW1uc0NvdW50IHxHYXVnZTxMb25nPiB8VG90YWwgbnVtYmVyIG9mIGNvbHVtbnMgcHJlc2VudCBpbgotdGhlIG1lbXRhYmxlLgotCi18TWVtdGFibGVTd2l0Y2hDb3VudCB8Q291bnRlciB8TnVtYmVyIG9mIHRpbWVzIGZsdXNoIGhhcyByZXN1bHRlZCBpbiB0aGUKLW1lbXRhYmxlIGJlaW5nIHN3aXRjaGVkIG91dC4KLQotfENvbXByZXNzaW9uUmF0aW8gfEdhdWdlPERvdWJsZT4gfEN1cnJlbnQgY29tcHJlc3Npb24gcmF0aW8gZm9yIGFsbAotU1NUYWJsZXMuCi0KLXxFc3RpbWF0ZWRQYXJ0aXRpb25TaXplSGlzdG9ncmFtIHxHYXVnZTxsb25nW10+IHxIaXN0b2dyYW0gb2YgZXN0aW1hdGVkCi1wYXJ0aXRpb24gc2l6ZSAoaW4gYnl0ZXMpLgotCi18RXN0aW1hdGVkUGFydGl0aW9uQ291bnQgfEdhdWdlPExvbmc+IHxBcHByb3hpbWF0ZSBudW1iZXIgb2Yga2V5cyBpbgotdGFibGUuCi0KLXxFc3RpbWF0ZWRDb2x1bW5Db3VudEhpc3RvZ3JhbSB8R2F1Z2U8bG9uZ1tdPiB8SGlzdG9ncmFtIG9mIGVzdGltYXRlZAotbnVtYmVyIG9mIGNvbHVtbnMuCi0KLXxTU1RhYmxlc1BlclJlYWRIaXN0b2dyYW0gfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG9mIHRoZSBudW1iZXIgb2Ygc3N0YWJsZQotZGF0YSBmaWxlcyBhY2Nlc3NlZCBwZXIgc2luZ2xlIHBhcnRpdGlvbiByZWFkLiBTU1RhYmxlcyBza2lwcGVkIGR1ZSB0bwotQmxvb20gRmlsdGVycywgbWluLW1heCBrZXkgb3IgcGFydGl0aW9uIGluZGV4IGxvb2t1cCBhcmUgbm90IHRha2VuIGludG8KLWFjb291bnQuCi0KLXxSZWFkTGF0ZW5jeSB8TGF0ZW5jeSB8TG9jYWwgcmVhZCBsYXRlbmN5IGZvciB0aGlzIHRhYmxlLgotCi18UmFuZ2VMYXRlbmN5IHxMYXRlbmN5IHxMb2NhbCByYW5nZSBzY2FuIGxhdGVuY3kgZm9yIHRoaXMgdGFibGUuCi0KLXxXcml0ZUxhdGVuY3kgfExhdGVuY3kgfExvY2FsIHdyaXRlIGxhdGVuY3kgZm9yIHRoaXMgdGFibGUuCi0KLXxDb29yZGluYXRvclJlYWRMYXRlbmN5IHxUaW1lciB8Q29vcmRpbmF0b3IgcmVhZCBsYXRlbmN5IGZvciB0aGlzIHRhYmxlLgotCi18Q29vcmRpbmF0b3JXcml0ZUxhdGVuY3kgfFRpbWVyIHxDb29yZGluYXRvciB3cml0ZSBsYXRlbmN5IGZvciB0aGlzCi10YWJsZS4KLQotfENvb3JkaW5hdG9yU2NhbkxhdGVuY3kgfFRpbWVyIHxDb29yZGluYXRvciByYW5nZSBzY2FuIGxhdGVuY3kgZm9yIHRoaXMKLXRhYmxlLgotCi18UGVuZGluZ0ZsdXNoZXMgfENvdW50ZXIgfEVzdGltYXRlZCBudW1iZXIgb2YgZmx1c2ggdGFza3MgcGVuZGluZyBmb3IKLXRoaXMgdGFibGUuCi0KLXxCeXRlc0ZsdXNoZWQgfENvdW50ZXIgfFRvdGFsIG51bWJlciBvZiBieXRlcyBmbHVzaGVkIHNpbmNlIHNlcnZlcgotW3JlXXN0YXJ0LgotCi18Q29tcGFjdGlvbkJ5dGVzV3JpdHRlbiB8Q291bnRlciB8VG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gYnkKLWNvbXBhY3Rpb24gc2luY2Ugc2VydmVyIFtyZV1zdGFydC4KLQotfFBlbmRpbmdDb21wYWN0aW9ucyB8R2F1Z2U8SW50ZWdlcj4gfEVzdGltYXRlIG9mIG51bWJlciBvZiBwZW5kaW5nCi1jb21wYWN0aW9ucyBmb3IgdGhpcyB0YWJsZS4KLQotfExpdmVTU1RhYmxlQ291bnQgfEdhdWdlPEludGVnZXI+IHxOdW1iZXIgb2YgU1NUYWJsZXMgb24gZGlzayBmb3IgdGhpcwotdGFibGUuCi0KLXxMaXZlRGlza1NwYWNlVXNlZCB8Q291bnRlciB8RGlzayBzcGFjZSB1c2VkIGJ5IFNTVGFibGVzIGJlbG9uZ2luZyB0bwotdGhpcyB0YWJsZSAoaW4gYnl0ZXMpLgotCi18VG90YWxEaXNrU3BhY2VVc2VkIHxDb3VudGVyIHxUb3RhbCBkaXNrIHNwYWNlIHVzZWQgYnkgU1NUYWJsZXMKLWJlbG9uZ2luZyB0byB0aGlzIHRhYmxlLCBpbmNsdWRpbmcgb2Jzb2xldGUgb25lcyB3YWl0aW5nIHRvIGJlIEdDJ2QuCi0KLXxNaW5QYXJ0aXRpb25TaXplIHxHYXVnZTxMb25nPiB8U2l6ZSBvZiB0aGUgc21hbGxlc3QgY29tcGFjdGVkIHBhcnRpdGlvbgotKGluIGJ5dGVzKS4KLQotfE1heFBhcnRpdGlvblNpemUgfEdhdWdlPExvbmc+IHxTaXplIG9mIHRoZSBsYXJnZXN0IGNvbXBhY3RlZCBwYXJ0aXRpb24KLShpbiBieXRlcykuCi0KLXxNZWFuUGFydGl0aW9uU2l6ZSB8R2F1Z2U8TG9uZz4gfFNpemUgb2YgdGhlIGF2ZXJhZ2UgY29tcGFjdGVkIHBhcnRpdGlvbgotKGluIGJ5dGVzKS4KLQotfEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXMgfEdhdWdlPExvbmc+IHxOdW1iZXIgb2YgZmFsc2UgcG9zaXRpdmVzIG9uCi10YWJsZSdzIGJsb29tIGZpbHRlci4KLQotfEJsb29tRmlsdGVyRmFsc2VSYXRpbyB8R2F1Z2U8RG91YmxlPiB8RmFsc2UgcG9zaXRpdmUgcmF0aW8gb2YgdGFibGUncwotYmxvb20gZmlsdGVyLgotCi18Qmxvb21GaWx0ZXJEaXNrU3BhY2VVc2VkIHxHYXVnZTxMb25nPiB8RGlzayBzcGFjZSB1c2VkIGJ5IGJsb29tIGZpbHRlcgotKGluIGJ5dGVzKS4KLQotfEJsb29tRmlsdGVyT2ZmSGVhcE1lbW9yeVVzZWQgfEdhdWdlPExvbmc+IHxPZmYtaGVhcCBtZW1vcnkgdXNlZCBieQotYmxvb20gZmlsdGVyLgotCi18SW5kZXhTdW1tYXJ5T2ZmSGVhcE1lbW9yeVVzZWQgfEdhdWdlPExvbmc+IHxPZmYtaGVhcCBtZW1vcnkgdXNlZCBieQotaW5kZXggc3VtbWFyeS4KLQotfENvbXByZXNzaW9uTWV0YWRhdGFPZmZIZWFwTWVtb3J5VXNlZCB8R2F1Z2U8TG9uZz4gfE9mZi1oZWFwIG1lbW9yeSB1c2VkCi1ieSBjb21wcmVzc2lvbiBtZXRhIGRhdGEuCi0KLXxLZXlDYWNoZUhpdFJhdGUgfEdhdWdlPERvdWJsZT4gfEtleSBjYWNoZSBoaXQgcmF0ZSBmb3IgdGhpcyB0YWJsZS4KLQotfFRvbWJzdG9uZVNjYW5uZWRIaXN0b2dyYW0gfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG9mIHRvbWJzdG9uZXMgc2Nhbm5lZAotaW4gcXVlcmllcyBvbiB0aGlzIHRhYmxlLgotCi18TGl2ZVNjYW5uZWRIaXN0b2dyYW0gfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG9mIGxpdmUgY2VsbHMgc2Nhbm5lZCBpbgotcXVlcmllcyBvbiB0aGlzIHRhYmxlLgotCi18Q29sVXBkYXRlVGltZURlbHRhSGlzdG9ncmFtIHxIaXN0b2dyYW0gfEhpc3RvZ3JhbSBvZiBjb2x1bW4gdXBkYXRlIHRpbWUKLWRlbHRhIG9uIHRoaXMgdGFibGUuCi0KLXxWaWV3TG9ja0FjcXVpcmVUaW1lIHxUaW1lciB8VGltZSB0YWtlbiBhY3F1aXJpbmcgYSBwYXJ0aXRpb24gbG9jayBmb3IKLW1hdGVyaWFsaXplZCB2aWV3IHVwZGF0ZXMgb24gdGhpcyB0YWJsZS4KLQotfFZpZXdSZWFkVGltZSB8VGltZXIgfFRpbWUgdGFrZW4gZHVyaW5nIHRoZSBsb2NhbCByZWFkIG9mIGEgbWF0ZXJpYWxpemVkCi12aWV3IHVwZGF0ZS4KLQotfFRydWVTbmFwc2hvdHNTaXplIHxHYXVnZTxMb25nPiB8RGlzayBzcGFjZSB1c2VkIGJ5IHNuYXBzaG90cyBvZiB0aGlzCi10YWJsZSBpbmNsdWRpbmcgYWxsIFNTVGFibGUgY29tcG9uZW50cy4KLQotfFJvd0NhY2hlSGl0T3V0T2ZSYW5nZSB8Q291bnRlciB8TnVtYmVyIG9mIHRhYmxlIHJvdyBjYWNoZSBoaXRzIHRoYXQgZG8KLW5vdCBzYXRpc2Z5IHRoZSBxdWVyeSBmaWx0ZXIsIHRodXMgd2VudCB0byBkaXNrLgotCi18Um93Q2FjaGVIaXQgfENvdW50ZXIgfE51bWJlciBvZiB0YWJsZSByb3cgY2FjaGUgaGl0cy4KLQotfFJvd0NhY2hlTWlzcyB8Q291bnRlciB8TnVtYmVyIG9mIHRhYmxlIHJvdyBjYWNoZSBtaXNzZXMuCi0KLXxDYXNQcmVwYXJlIHxMYXRlbmN5IHxMYXRlbmN5IG9mIHBheG9zIHByZXBhcmUgcm91bmQuCi0KLXxDYXNQcm9wb3NlIHxMYXRlbmN5IHxMYXRlbmN5IG9mIHBheG9zIHByb3Bvc2Ugcm91bmQuCi0KLXxDYXNDb21taXQgfExhdGVuY3kgfExhdGVuY3kgb2YgcGF4b3MgY29tbWl0IHJvdW5kLgotCi18UGVyY2VudFJlcGFpcmVkIHxHYXVnZTxEb3VibGU+IHxQZXJjZW50IG9mIHRhYmxlIGRhdGEgdGhhdCBpcyByZXBhaXJlZAotb24gZGlzay4KLQotfEJ5dGVzUmVwYWlyZWQgfEdhdWdlPExvbmc+IHxTaXplIG9mIHRhYmxlIGRhdGEgcmVwYWlyZWQgb24gZGlzawotCi18Qnl0ZXNVbnJlcGFpcmVkIHxHYXVnZTxMb25nPiB8U2l6ZSBvZiB0YWJsZSBkYXRhIHVucmVwYWlyZWQgb24gZGlzawotCi18Qnl0ZXNQZW5kaW5nUmVwYWlyIHxHYXVnZTxMb25nPiB8U2l6ZSBvZiB0YWJsZSBkYXRhIGlzb2xhdGVkIGZvciBhbgotb25nb2luZyBpbmNyZW1lbnRhbCByZXBhaXIKLQotfFNwZWN1bGF0aXZlUmV0cmllcyB8Q291bnRlciB8TnVtYmVyIG9mIHRpbWVzIHNwZWN1bGF0aXZlIHJldHJpZXMgd2VyZQotc2VudCBmb3IgdGhpcyB0YWJsZS4KLQotfFNwZWN1bGF0aXZlRmFpbGVkUmV0cmllcyB8Q291bnRlciB8TnVtYmVyIG9mIHNwZWN1bGF0aXZlIHJldHJpZXMgdGhhdAotZmFpbGVkIHRvIHByZXZlbnQgYSB0aW1lb3V0Ci0KLXxTcGVjdWxhdGl2ZUluc3VmZmljaWVudFJlcGxpY2FzIHxDb3VudGVyIHxOdW1iZXIgb2Ygc3BlY3VsYXRpdmUgcmV0cmllcwotdGhhdCBjb3VsZG4ndCBiZSBhdHRlbXB0ZWQgZHVlIHRvIGxhY2sgb2YgcmVwbGljYXMKLQotfFNwZWN1bGF0aXZlU2FtcGxlTGF0ZW5jeU5hbm9zIHxHYXVnZTxMb25nPiB8TnVtYmVyIG9mIG5hbm9zZWNvbmRzIHRvCi13YWl0IGJlZm9yZSBzcGVjdWxhdGlvbiBpcyBhdHRlbXB0ZWQuIFZhbHVlIG1heSBiZSBzdGF0aWNhbGx5IGNvbmZpZ3VyZWQKLW9yIHVwZGF0ZWQgcGVyaW9kaWNhbGx5IGJhc2VkIG9uIGNvb3JkaW5hdG9yIGxhdGVuY3kuCi0KLXxXYWl0aW5nT25GcmVlTWVtdGFibGVTcGFjZSB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgdGltZSBzcGVudCB3YWl0aW5nCi1mb3IgZnJlZSBtZW10YWJsZSBzcGFjZSwgZWl0aGVyIG9uLSBvciBvZmYtaGVhcC4KLQotfERyb3BwZWRNdXRhdGlvbnMgfENvdW50ZXIgfE51bWJlciBvZiBkcm9wcGVkIG11dGF0aW9ucyBvbiB0aGlzIHRhYmxlLgotCi18QW50aWNvbXBhY3Rpb25UaW1lIHxUaW1lciB8VGltZSBzcGVudCBhbnRpY29tcGFjdGluZyBiZWZvcmUgYQotY29uc2lzdGVudCByZXBhaXIuCi0KLXxWYWxpZGF0aW9uVGltZSB8VGltZXIgfFRpbWUgc3BlbnQgZG9pbmcgdmFsaWRhdGlvbiBjb21wYWN0aW9uIGR1cmluZwotcmVwYWlyLgotCi18U3luY1RpbWUgfFRpbWVyIHxUaW1lIHNwZW50IGRvaW5nIHN0cmVhbWluZyBkdXJpbmcgcmVwYWlyLgotCi18Qnl0ZXNWYWxpZGF0ZWQgfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG92ZXIgdGhlIGFtb3VudCBvZiBieXRlcyByZWFkCi1kdXJpbmcgdmFsaWRhdGlvbi4KLQotfFBhcnRpdGlvbnNWYWxpZGF0ZWQgfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG92ZXIgdGhlIG51bWJlciBvZiBwYXJ0aXRpb25zCi1yZWFkIGR1cmluZyB2YWxpZGF0aW9uLgotCi18Qnl0ZXNBbnRpY29tcGFjdGVkIHxDb3VudGVyIHxIb3cgbWFueSBieXRlcyB3ZSBhbnRpY29tcGFjdGVkLgotCi18Qnl0ZXNNdXRhdGVkQW50aWNvbXBhY3Rpb24gfENvdW50ZXIgfEhvdyBtYW55IGJ5dGVzIHdlIGF2b2lkZWQKLWFudGljb21wYWN0aW5nIGJlY2F1c2UgdGhlIHNzdGFibGUgd2FzIGZ1bGx5IGNvbnRhaW5lZCBpbiB0aGUgcmVwYWlyZWQKLXJhbmdlLgotCi18TXV0YXRlZEFudGljb21wYWN0aW9uR2F1Z2UgfEdhdWdlPERvdWJsZT4gfFJhdGlvIG9mIGJ5dGVzIG11dGF0ZWQgdnMKLXRvdGFsIGJ5dGVzIHJlcGFpcmVkLgotfD09PQotCi09PSBLZXlzcGFjZSBNZXRyaWNzCi0KLUVhY2gga2V5c3BhY2UgaW4gQ2Fzc2FuZHJhIGhhcyBtZXRyaWNzIHJlc3BvbnNpYmxlIGZvciB0cmFja2luZyBpdHMKLXN0YXRlIGFuZCBwZXJmb3JtYW5jZS4KLQotTW9zdCBvZiB0aGVzZSBtZXRyaWNzIGFyZSB0aGUgc2FtZSBhcyB0aGUgYFRhYmxlIE1ldHJpY3NgIGFib3ZlLCBvbmx5Ci10aGV5IGFyZSBhZ2dyZWdhdGVkIGF0IHRoZSBLZXlzcGFjZSBsZXZlbC4gVGhlIGtleXNwYWNlIHNwZWNpZmljIG1ldHJpY3MKLWFyZSBzcGVjaWZpZWQgaW4gdGhlIHRhYmxlIGJlbG93LgotCi1SZXBvcnRlZCBuYW1lIGZvcm1hdDoKLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLmtleXNwYWNlLjxNZXRyaWNOYW1lPi48S2V5c3BhY2U+YAotKkpNWCBNQmVhbio6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUtleXNwYWNlIHNjb3BlPTxLZXlzcGFjZT4gbmFtZT08TWV0cmljTmFtZT5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxXcml0ZUZhaWxlZElkZWFDTCB8Q291bnRlciB8TnVtYmVyIG9mIHdyaXRlcyB0aGF0IGZhaWxlZCB0byBhY2hpZXZlIHRoZQotY29uZmlndXJlZCBpZGVhbCBjb25zaXN0ZW5jeSBsZXZlbCBvciAwIGlmIG5vbmUgaXMgY29uZmlndXJlZAotCi18SWRlYWxDTFdyaXRlTGF0ZW5jeSB8TGF0ZW5jeSB8Q29vcmRpbmF0b3IgbGF0ZW5jeSBvZiB3cml0ZXMgYXQgdGhlCi1jb25maWd1cmVkIGlkZWFsIGNvbnNpc3RlbmN5IGxldmVsLiBObyB2YWx1ZXMgYXJlIHJlY29yZGVkIGlmIGlkZWFsCi1jb25zaXN0ZW5jeSBsZXZlbCBpcyBub3QgY29uZmlndXJlZAotCi18UmVwYWlyVGltZSB8VGltZXIgfFRvdGFsIHRpbWUgc3BlbnQgYXMgcmVwYWlyIGNvb3JkaW5hdG9yLgotCi18UmVwYWlyUHJlcGFyZVRpbWUgfFRpbWVyIHxUb3RhbCB0aW1lIHNwZW50IHByZXBhcmluZyBmb3IgcmVwYWlyLgotfD09PQotCi09PSBUaHJlYWRQb29sIE1ldHJpY3MKLQotQ2Fzc2FuZHJhIHNwbGl0cyB3b3JrIG9mIGEgcGFydGljdWxhciB0eXBlIGludG8gaXRzIG93biB0aHJlYWQgcG9vbC4KLVRoaXMgcHJvdmlkZXMgYmFjay1wcmVzc3VyZSBhbmQgYXN5bmNocm9ueSBmb3IgcmVxdWVzdHMgb24gYSBub2RlLiBJdCdzCi1pbXBvcnRhbnQgdG8gbW9uaXRvciB0aGUgc3RhdGUgb2YgdGhlc2UgdGhyZWFkIHBvb2xzIHNpbmNlIHRoZXkgY2FuIHRlbGwKLXlvdSBob3cgc2F0dXJhdGVkIGEgbm9kZSBpcy4KLQotVGhlIG1ldHJpYyBuYW1lcyBhcmUgYWxsIGFwcGVuZGVkIHdpdGggdGhlIHNwZWNpZmljIGBUaHJlYWRQb29sYCBuYW1lLgotVGhlIHRocmVhZCBwb29scyBhcmUgYWxzbyBjYXRlZ29yaXplZCB1bmRlciBhIHNwZWNpZmljIHR5cGUuCi0KLVJlcG9ydGVkIG5hbWUgZm9ybWF0OgotCi0qTWV0cmljIE5hbWUqOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuVGhyZWFkUG9vbHMuPE1ldHJpY05hbWU+LjxQYXRoPi48VGhyZWFkUG9vbE5hbWU+YAotKkpNWCBNQmVhbio6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPVRocmVhZFBvb2xzIHBhdGg9PFBhdGg+IHNjb3BlPTxUaHJlYWRQb29sTmFtZT4gbmFtZT08TWV0cmljTmFtZT5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxBY3RpdmVUYXNrcyB8R2F1Z2U8SW50ZWdlcj4gfE51bWJlciBvZiB0YXNrcyBiZWluZyBhY3RpdmVseSB3b3JrZWQgb24KLWJ5IHRoaXMgcG9vbC4KLQotfFBlbmRpbmdUYXNrcyB8R2F1Z2U8SW50ZWdlcj4gfE51bWJlciBvZiBxdWV1ZWQgdGFza3MgcXVldWVkIHVwIG9uIHRoaXMKLXBvb2wuCi0KLXxDb21wbGV0ZWRUYXNrcyB8Q291bnRlciB8TnVtYmVyIG9mIHRhc2tzIGNvbXBsZXRlZC4KLQotfFRvdGFsQmxvY2tlZFRhc2tzIHxDb3VudGVyIHxOdW1iZXIgb2YgdGFza3MgdGhhdCB3ZXJlIGJsb2NrZWQgZHVlIHRvCi1xdWV1ZSBzYXR1cmF0aW9uLgotCi18Q3VycmVudGx5QmxvY2tlZFRhc2sgfENvdW50ZXIgfE51bWJlciBvZiB0YXNrcyB0aGF0IGFyZSBjdXJyZW50bHkKLWJsb2NrZWQgZHVlIHRvIHF1ZXVlIHNhdHVyYXRpb24gYnV0IG9uIHJldHJ5IHdpbGwgYmVjb21lIHVuYmxvY2tlZC4KLQotfE1heFBvb2xTaXplIHxHYXVnZTxJbnRlZ2VyPiB8VGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgaW4gdGhpcwotcG9vbC4KLQotfE1heFRhc2tzUXVldWVkIHxHYXVnZTxJbnRlZ2VyPiB8VGhlIG1heGltdW0gbnVtYmVyIG9mIHRhc2tzIHF1ZXVlZAotYmVmb3JlIGEgdGFzayBnZXQgYmxvY2tlZC4KLXw9PT0KLQotVGhlIGZvbGxvd2luZyB0aHJlYWQgcG9vbHMgY2FuIGJlIG1vbml0b3JlZC4KLQotW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgotfE5hdGl2ZS1UcmFuc3BvcnQtUmVxdWVzdHMgfHRyYW5zcG9ydCB8SGFuZGxlcyBjbGllbnQgQ1FMIHJlcXVlc3RzCi0KLXxDb3VudGVyTXV0YXRpb25TdGFnZSB8cmVxdWVzdCB8UmVzcG9uc2libGUgZm9yIGNvdW50ZXIgd3JpdGVzCi0KLXxWaWV3TXV0YXRpb25TdGFnZSB8cmVxdWVzdCB8UmVzcG9uc2libGUgZm9yIG1hdGVyaWFsaXplZCB2aWV3IHdyaXRlcwotCi18TXV0YXRpb25TdGFnZSB8cmVxdWVzdCB8UmVzcG9uc2libGUgZm9yIGFsbCBvdGhlciB3cml0ZXMKLQotfFJlYWRSZXBhaXJTdGFnZSB8cmVxdWVzdCB8UmVhZFJlcGFpciBoYXBwZW5zIG9uIHRoaXMgdGhyZWFkIHBvb2wKLQotfFJlYWRTdGFnZSB8cmVxdWVzdCB8TG9jYWwgcmVhZHMgcnVuIG9uIHRoaXMgdGhyZWFkIHBvb2wKLQotfFJlcXVlc3RSZXNwb25zZVN0YWdlIHxyZXF1ZXN0IHxDb29yZGluYXRvciByZXF1ZXN0cyB0byB0aGUgY2x1c3RlciBydW4KLW9uIHRoaXMgdGhyZWFkIHBvb2wKLQotfEFudGlFbnRyb3B5U3RhZ2UgfGludGVybmFsIHxCdWlsZHMgbWVya2xlIHRyZWUgZm9yIHJlcGFpcnMKLQotfENhY2hlQ2xlYW51cEV4ZWN1dG9yIHxpbnRlcm5hbCB8Q2FjaGUgbWFpbnRlbmFuY2UgcGVyZm9ybWVkIG9uIHRoaXMKLXRocmVhZCBwb29sCi0KLXxDb21wYWN0aW9uRXhlY3V0b3IgfGludGVybmFsIHxDb21wYWN0aW9ucyBhcmUgcnVuIG9uIHRoZXNlIHRocmVhZHMKLQotfEdvc3NpcFN0YWdlIHxpbnRlcm5hbCB8SGFuZGxlcyBnb3NzaXAgcmVxdWVzdHMKLQotfEhpbnRzRGlzcGF0Y2hlciB8aW50ZXJuYWwgfFBlcmZvcm1zIGhpbnRlZCBoYW5kb2ZmCi0KLXxJbnRlcm5hbFJlc3BvbnNlU3RhZ2UgfGludGVybmFsIHxSZXNwb25zaWJsZSBmb3IgaW50cmEtY2x1c3RlcgotY2FsbGJhY2tzCi0KLXxNZW10YWJsZUZsdXNoV3JpdGVyIHxpbnRlcm5hbCB8V3JpdGVzIG1lbXRhYmxlcyB0byBkaXNrCi0KLXxNZW10YWJsZVBvc3RGbHVzaCB8aW50ZXJuYWwgfENsZWFucyB1cCBjb21taXQgbG9nIGFmdGVyIG1lbXRhYmxlIGlzCi13cml0dGVuIHRvIGRpc2sKLQotfE1lbXRhYmxlUmVjbGFpbU1lbW9yeSB8aW50ZXJuYWwgfE1lbXRhYmxlIHJlY3ljbGluZwotCi18TWlncmF0aW9uU3RhZ2UgfGludGVybmFsIHxSdW5zIHNjaGVtYSBtaWdyYXRpb25zCi0KLXxNaXNjU3RhZ2UgfGludGVybmFsIHxNaXNjZWxlbmVvdXMgdGFza3MgcnVuIGhlcmUKLQotfFBlbmRpbmdSYW5nZUNhbGN1bGF0b3IgfGludGVybmFsIHxDYWxjdWxhdGVzIHRva2VuIHJhbmdlCi0KLXxQZXJEaXNrTWVtdGFibGVGbHVzaFdyaXRlcl8wIHxpbnRlcm5hbCB8UmVzcG9uc2libGUgZm9yIHdyaXRpbmcgYSBzcGVjCi0odGhlcmUgaXMgb25lIG9mIHRoZXNlIHBlciBkaXNrIDAtTikKLQotfFNhbXBsZXIgfGludGVybmFsIHxSZXNwb25zaWJsZSBmb3IgcmUtc2FtcGxpbmcgdGhlIGluZGV4IHN1bW1hcmllcyBvZgotU1N0YWJsZXMKLQotfFNlY29uZGFyeUluZGV4TWFuYWdlbWVudCB8aW50ZXJuYWwgfFBlcmZvcm1zIHVwZGF0ZXMgdG8gc2Vjb25kYXJ5Ci1pbmRleGVzCi0KLXxWYWxpZGF0aW9uRXhlY3V0b3IgfGludGVybmFsIHxQZXJmb3JtcyB2YWxpZGF0aW9uIGNvbXBhY3Rpb24gb3IKLXNjcnViYmluZwotCi18Vmlld0J1aWxkRXhlY3V0b3IgfGludGVybmFsIHxQZXJmb3JtcyBtYXRlcmlhbGl6ZWQgdmlld3MgaW5pdGlhbCBidWlsZAotfD09PQotCi09PSBDbGllbnQgUmVxdWVzdCBNZXRyaWNzCi0KLUNsaWVudCByZXF1ZXN0cyBoYXZlIHRoZWlyIG93biBzZXQgb2YgbWV0cmljcyB0aGF0IGVuY2Fwc3VsYXRlIHRoZSB3b3JrCi1oYXBwZW5pbmcgYXQgY29vcmRpbmF0b3IgbGV2ZWwuCi0KLURpZmZlcmVudCB0eXBlcyBvZiBjbGllbnQgcmVxdWVzdHMgYXJlIGJyb2tlbiBkb3duIGJ5IGBSZXF1ZXN0VHlwZWAuCi0KLVJlcG9ydGVkIG5hbWUgZm9ybWF0OgotCi0qTWV0cmljIE5hbWUqOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2xpZW50UmVxdWVzdC48TWV0cmljTmFtZT4uPFJlcXVlc3RUeXBlPmAKLSpKTVggTUJlYW4qOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1DbGllbnRSZXF1ZXN0IHNjb3BlPTxSZXF1ZXN0VHlwZT4gbmFtZT08TWV0cmljTmFtZT5gCi0KLVJlcXVlc3RUeXBlOjoKLSAgQ0FTUmVhZAotRGVzY3JpcHRpb246OgotICBNZXRyaWNzIHJlbGF0ZWQgdG8gdHJhbnNhY3Rpb25hbCByZWFkIHJlcXVlc3RzLgotTWV0cmljczo6Ci0gIFtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi0gIHw9PT0KLSAgfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi0gIHxUaW1lb3V0cyB8Q291bnRlciB8TnVtYmVyIG9mIHRpbWVvdXRzIGVuY291bnRlcmVkLgotCi0gIHxGYWlsdXJlcyB8Q291bnRlciB8TnVtYmVyIG9mIHRyYW5zYWN0aW9uIGZhaWx1cmVzIGVuY291bnRlcmVkLgotCi0gIHzCoCB8TGF0ZW5jeSB8VHJhbnNhY3Rpb24gcmVhZCBsYXRlbmN5LgotCi0gIHxVbmF2YWlsYWJsZXMgfENvdW50ZXIgfE51bWJlciBvZiB1bmF2YWlsYWJsZSBleGNlcHRpb25zIGVuY291bnRlcmVkLgotCi0gIHxVbmZpbmlzaGVkQ29tbWl0IHxDb3VudGVyIHxOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBjb21taXR0ZWQKLSAgb24gcmVhZC4KLQotICB8Q29uZGl0aW9uTm90TWV0IHxDb3VudGVyIHxOdW1iZXIgb2YgdHJhbnNhY3Rpb24gcHJlY29uZGl0aW9ucyBkaWQgbm90Ci0gIG1hdGNoIGN1cnJlbnQgdmFsdWVzLgotCi0gIHxDb250ZW50aW9uSGlzdG9ncmFtIHxIaXN0b2dyYW0gfEhvdyBtYW55IGNvbnRlbmRlZCByZWFkcyB3ZXJlCi0gIGVuY291bnRlcmVkCi0gIHw9PT0KLVJlcXVlc3RUeXBlOjoKLSAgQ0FTV3JpdGUKLURlc2NyaXB0aW9uOjoKLSAgTWV0cmljcyByZWxhdGVkIHRvIHRyYW5zYWN0aW9uYWwgd3JpdGUgcmVxdWVzdHMuCi1NZXRyaWNzOjoKLSAgW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLSAgfD09PQotICB8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLSAgfFRpbWVvdXRzIHxDb3VudGVyIHxOdW1iZXIgb2YgdGltZW91dHMgZW5jb3VudGVyZWQuCi0KLSAgfEZhaWx1cmVzIHxDb3VudGVyIHxOdW1iZXIgb2YgdHJhbnNhY3Rpb24gZmFpbHVyZXMgZW5jb3VudGVyZWQuCi0KLSAgfMKgIHxMYXRlbmN5IHxUcmFuc2FjdGlvbiB3cml0ZSBsYXRlbmN5LgotCi0gIHxVbmZpbmlzaGVkQ29tbWl0IHxDb3VudGVyIHxOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBjb21taXR0ZWQKLSAgb24gd3JpdGUuCi0KLSAgfENvbmRpdGlvbk5vdE1ldCB8Q291bnRlciB8TnVtYmVyIG9mIHRyYW5zYWN0aW9uIHByZWNvbmRpdGlvbnMgZGlkIG5vdAotICBtYXRjaCBjdXJyZW50IHZhbHVlcy4KLQotICB8Q29udGVudGlvbkhpc3RvZ3JhbSB8SGlzdG9ncmFtIHxIb3cgbWFueSBjb250ZW5kZWQgd3JpdGVzIHdlcmUKLSAgZW5jb3VudGVyZWQKLQotICB8TXV0YXRpb25TaXplSGlzdG9ncmFtIHxIaXN0b2dyYW0gfFRvdGFsIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlcXVlc3RzCi0gIG11dGF0aW9ucy4KLSAgfD09PQotUmVxdWVzdFR5cGU6OgotICBSZWFkCi1EZXNjcmlwdGlvbjo6Ci0gIE1ldHJpY3MgcmVsYXRlZCB0byBzdGFuZGFyZCByZWFkIHJlcXVlc3RzLgotTWV0cmljczo6Ci0gIFtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi0gIHw9PT0KLSAgfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi0gIHxUaW1lb3V0cyB8Q291bnRlciB8TnVtYmVyIG9mIHRpbWVvdXRzIGVuY291bnRlcmVkLgotICB8RmFpbHVyZXMgfENvdW50ZXIgfE51bWJlciBvZiByZWFkIGZhaWx1cmVzIGVuY291bnRlcmVkLgotICB8wqAgfExhdGVuY3kgfFJlYWQgbGF0ZW5jeS4KLSAgfFVuYXZhaWxhYmxlcyB8Q291bnRlciB8TnVtYmVyIG9mIHVuYXZhaWxhYmxlIGV4Y2VwdGlvbnMgZW5jb3VudGVyZWQuCi0gIHw9PT0KLVJlcXVlc3RUeXBlOjoKLSAgUmFuZ2VTbGljZQotRGVzY3JpcHRpb246OgotICBNZXRyaWNzIHJlbGF0ZWQgdG8gdG9rZW4gcmFuZ2UgcmVhZCByZXF1ZXN0cy4KLU1ldHJpY3M6OgotICBbY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotICB8PT09Ci0gIHxOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgotICB8VGltZW91dHMgfENvdW50ZXIgfE51bWJlciBvZiB0aW1lb3V0cyBlbmNvdW50ZXJlZC4KLSAgfEZhaWx1cmVzIHxDb3VudGVyIHxOdW1iZXIgb2YgcmFuZ2UgcXVlcnkgZmFpbHVyZXMgZW5jb3VudGVyZWQuCi0gIHzCoCB8TGF0ZW5jeSB8UmFuZ2UgcXVlcnkgbGF0ZW5jeS4KLSAgfFVuYXZhaWxhYmxlcyB8Q291bnRlciB8TnVtYmVyIG9mIHVuYXZhaWxhYmxlIGV4Y2VwdGlvbnMgZW5jb3VudGVyZWQuCi0gIHw9PT0KLVJlcXVlc3RUeXBlOjoKLSAgV3JpdGUKLURlc2NyaXB0aW9uOjoKLSAgTWV0cmljcyByZWxhdGVkIHRvIHJlZ3VsYXIgd3JpdGUgcmVxdWVzdHMuCi1NZXRyaWNzOjoKLSAgW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLSAgfD09PQotICB8TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLSAgfFRpbWVvdXRzIHxDb3VudGVyIHxOdW1iZXIgb2YgdGltZW91dHMgZW5jb3VudGVyZWQuCi0KLSAgfEZhaWx1cmVzIHxDb3VudGVyIHxOdW1iZXIgb2Ygd3JpdGUgZmFpbHVyZXMgZW5jb3VudGVyZWQuCi0KLSAgfMKgIHxMYXRlbmN5IHxXcml0ZSBsYXRlbmN5LgotCi0gIHxVbmF2YWlsYWJsZXMgfENvdW50ZXIgfE51bWJlciBvZiB1bmF2YWlsYWJsZSBleGNlcHRpb25zIGVuY291bnRlcmVkLgotCi0gIHxNdXRhdGlvblNpemVIaXN0b2dyYW0gfEhpc3RvZ3JhbSB8VG90YWwgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVxdWVzdHMKLSAgbXV0YXRpb25zLgotICB8PT09Ci1SZXF1ZXN0VHlwZTo6Ci0gIFZpZXdXcml0ZQotRGVzY3JpcHRpb246OgotICBNZXRyaWNzIHJlbGF0ZWQgdG8gbWF0ZXJpYWxpemVkIHZpZXcgd3JpdGUgd3J0ZXMuCi1NZXRyaWNzOjoKLSAgW2NvbHM9IiwsIixdCi0gIHw9PT0KLSAgfFRpbWVvdXRzIHxDb3VudGVyIHxOdW1iZXIgb2YgdGltZW91dHMgZW5jb3VudGVyZWQuCi0KLSAgfEZhaWx1cmVzIHxDb3VudGVyIHxOdW1iZXIgb2YgdHJhbnNhY3Rpb24gZmFpbHVyZXMgZW5jb3VudGVyZWQuCi0KLSAgfFVuYXZhaWxhYmxlcyB8Q291bnRlciB8TnVtYmVyIG9mIHVuYXZhaWxhYmxlIGV4Y2VwdGlvbnMgZW5jb3VudGVyZWQuCi0KLSAgfFZpZXdSZXBsaWNhc0F0dGVtcHRlZCB8Q291bnRlciB8VG90YWwgbnVtYmVyIG9mIGF0dGVtcHRlZCB2aWV3Ci0gIHJlcGxpY2Egd3JpdGVzLgotCi0gIHxWaWV3UmVwbGljYXNTdWNjZXNzIHxDb3VudGVyIHxUb3RhbCBudW1iZXIgb2Ygc3VjY2VkZWQgdmlldyByZXBsaWNhCi0gIHdyaXRlcy4KLQotICB8Vmlld1BlbmRpbmdNdXRhdGlvbnMgfEdhdWdlPExvbmc+IHxWaWV3UmVwbGljYXNBdHRlbXB0ZWQgLQotICBWaWV3UmVwbGljYXNTdWNjZXNzLgotCi0gIHxWaWV3V3JpdGVMYXRlbmN5IHxUaW1lciB8VGltZSBiZXR3ZWVuIHdoZW4gbXV0YXRpb24gaXMgYXBwbGllZCB0bwotICBiYXNlIHRhYmxlIGFuZCB3aGVuIENMLk9ORSBpcyBhY2hpZXZlZCBvbiB2aWV3LgotICB8PT09Ci0KLT09IENhY2hlIE1ldHJpY3MKLQotQ2Fzc2FuZHJhIGNhY2hlcyBoYXZlIG1ldHJpY3MgdG8gdHJhY2sgdGhlIGVmZmVjdGl2bmVzcyBvZiB0aGUgY2FjaGVzLgotVGhvdWdoIHRoZSBgVGFibGUgTWV0cmljc2AgbWlnaHQgYmUgbW9yZSB1c2VmdWwuCi0KLVJlcG9ydGVkIG5hbWUgZm9ybWF0OgotCi0qTWV0cmljIE5hbWUqOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2FjaGUuPE1ldHJpY05hbWU+LjxDYWNoZU5hbWU+YAotKkpNWCBNQmVhbio6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUNhY2hlIHNjb3BlPTxDYWNoZU5hbWU+IG5hbWU9PE1ldHJpY05hbWU+YAotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18Q2FwYWNpdHkgfEdhdWdlPExvbmc+IHxDYWNoZSBjYXBhY2l0eSBpbiBieXRlcy4KLXxFbnRyaWVzIHxHYXVnZTxJbnRlZ2VyPiB8VG90YWwgbnVtYmVyIG9mIGNhY2hlIGVudHJpZXMuCi18RmlmdGVlbk1pbnV0ZUNhY2hlSGl0UmF0ZSB8R2F1Z2U8RG91YmxlPiB8MTVtIGNhY2hlIGhpdCByYXRlLgotfEZpdmVNaW51dGVDYWNoZUhpdFJhdGUgfEdhdWdlPERvdWJsZT4gfDVtIGNhY2hlIGhpdCByYXRlLgotfE9uZU1pbnV0ZUNhY2hlSGl0UmF0ZSB8R2F1Z2U8RG91YmxlPiB8MW0gY2FjaGUgaGl0IHJhdGUuCi18SGl0UmF0ZSB8R2F1Z2U8RG91YmxlPiB8QWxsIHRpbWUgY2FjaGUgaGl0IHJhdGUuCi18SGl0cyB8TWV0ZXIgfFRvdGFsIG51bWJlciBvZiBjYWNoZSBoaXRzLgotfE1pc3NlcyB8TWV0ZXIgfFRvdGFsIG51bWJlciBvZiBjYWNoZSBtaXNzZXMuCi18TWlzc0xhdGVuY3kgfFRpbWVyIHxMYXRlbmN5IG9mIG1pc3Nlcy4KLXxSZXF1ZXN0cyB8R2F1Z2U8TG9uZz4gfFRvdGFsIG51bWJlciBvZiBjYWNoZSByZXF1ZXN0cy4KLXxTaXplIHxHYXVnZTxMb25nPiB8VG90YWwgc2l6ZSBvZiBvY2N1cGllZCBjYWNoZSwgaW4gYnl0ZXMuCi18PT09Ci0KLVRoZSBmb2xsb3dpbmcgY2FjaGVzIGFyZSBjb3ZlcmVkOgotCi1bY29scz0iLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8RGVzY3JpcHRpb24KLXxDb3VudGVyQ2FjaGUgfEtlZXBzIGhvdCBjb3VudGVycyBpbiBtZW1vcnkgZm9yIHBlcmZvcm1hbmNlLgotfENodW5rQ2FjaGUgfEluIHByb2Nlc3MgdW5jb21wcmVzc2VkIHBhZ2UgY2FjaGUuCi18S2V5Q2FjaGUgfENhY2hlIGZvciBwYXJ0aXRpb24gdG8gc3N0YWJsZSBvZmZzZXRzLgotfFJvd0NhY2hlIHxDYWNoZSBmb3Igcm93cyBrZXB0IGluIG1lbW9yeS4KLXw9PT0KLQotW05PVEVdCi0uTm90ZQotPT09PQotTWlzc2VzIGFuZCBNaXNzTGF0ZW5jeSBhcmUgb25seSBkZWZpbmVkIGZvciB0aGUgQ2h1bmtDYWNoZQotPT09PT09IENRTCBNZXRyaWNzCi0KLU1ldHJpY3Mgc3BlY2lmaWMgdG8gQ1FMIHByZXBhcmVkIHN0YXRlbWVudCBjYWNoaW5nLgotCi1SZXBvcnRlZCBuYW1lIGZvcm1hdDoKLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNRTC48TWV0cmljTmFtZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9Q1FMIG5hbWU9PE1ldHJpY05hbWU+YAotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18UHJlcGFyZWRTdGF0ZW1lbnRzQ291bnQgfEdhdWdlPEludGVnZXI+IHxOdW1iZXIgb2YgY2FjaGVkIHByZXBhcmVkCi1zdGF0ZW1lbnRzLgotCi18UHJlcGFyZWRTdGF0ZW1lbnRzRXZpY3RlZCB8Q291bnRlciB8TnVtYmVyIG9mIHByZXBhcmVkIHN0YXRlbWVudHMKLWV2aWN0ZWQgZnJvbSB0aGUgcHJlcGFyZWQgc3RhdGVtZW50IGNhY2hlCi0KLXxQcmVwYXJlZFN0YXRlbWVudHNFeGVjdXRlZCB8Q291bnRlciB8TnVtYmVyIG9mIHByZXBhcmVkIHN0YXRlbWVudHMKLWV4ZWN1dGVkLgotCi18UmVndWxhclN0YXRlbWVudHNFeGVjdXRlZCB8Q291bnRlciB8TnVtYmVyIG9mICpub24qIHByZXBhcmVkIHN0YXRlbWVudHMKLWV4ZWN1dGVkLgotCi18UHJlcGFyZWRTdGF0ZW1lbnRzUmF0aW8gfEdhdWdlPERvdWJsZT4gfFBlcmNlbnRhZ2Ugb2Ygc3RhdGVtZW50cyB0aGF0Ci1hcmUgcHJlcGFyZWQgdnMgdW5wcmVwYXJlZC4KLXw9PT0KLQotW1tkcm9wcGVkLW1ldHJpY3NdXQotPT0gRHJvcHBlZE1lc3NhZ2UgTWV0cmljcwotCi1NZXRyaWNzIHNwZWNpZmljIHRvIHRyYWNraW5nIGRyb3BwZWQgbWVzc2FnZXMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZgotcmVxdWVzdHMuIERyb3BwZWQgd3JpdGVzIGFyZSBzdG9yZWQgYW5kIHJldHJpZWQgYnkgYEhpbnRlZCBIYW5kb2ZmYAotCi1SZXBvcnRlZCBuYW1lIGZvcm1hdDoKLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkRyb3BwZWRNZXNzYWdlLjxNZXRyaWNOYW1lPi48VHlwZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9RHJvcHBlZE1lc3NhZ2Ugc2NvcGU9PFR5cGU+IG5hbWU9PE1ldHJpY05hbWU+YAotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18Q3Jvc3NOb2RlRHJvcHBlZExhdGVuY3kgfFRpbWVyIHxUaGUgZHJvcHBlZCBsYXRlbmN5IGFjcm9zcyBub2Rlcy4KLXxJbnRlcm5hbERyb3BwZWRMYXRlbmN5IHxUaW1lciB8VGhlIGRyb3BwZWQgbGF0ZW5jeSB3aXRoaW4gbm9kZS4KLXxEcm9wcGVkIHxNZXRlciB8TnVtYmVyIG9mIGRyb3BwZWQgbWVzc2FnZXMuCi18PT09Ci0KLVRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgbWVzc2FnZXMgdHJhY2tlZCBhcmU6Ci0KLVtjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxOYW1lIHxEZXNjcmlwdGlvbgotfEJBVENIX1NUT1JFIHxCYXRjaGxvZyB3cml0ZQotfEJBVENIX1JFTU9WRSB8QmF0Y2hsb2cgY2xlYW51cCAoYWZ0ZXIgc3VjY2VzZnVsbHkgYXBwbGllZCkKLXxDT1VOVEVSX01VVEFUSU9OIHxDb3VudGVyIHdyaXRlcwotfEhJTlQgfEhpbnQgcmVwbGF5Ci18TVVUQVRJT04gfFJlZ3VsYXIgd3JpdGVzCi18UkVBRCB8UmVndWxhciByZWFkcwotfFJFQURfUkVQQUlSIHxSZWFkIHJlcGFpcgotfFBBR0VEX1NMSUNFIHxQYWdlZCByZWFkCi18UkFOR0VfU0xJQ0UgfFRva2VuIHJhbmdlIHJlYWQKLXxSRVFVRVNUX1JFU1BPTlNFIHxSUEMgQ2FsbGJhY2tzCi18X1RSQUNFIHxUcmFjaW5nIHdyaXRlcwotfD09PQotCi09PSBTdHJlYW1pbmcgTWV0cmljcwotCi1NZXRyaWNzIHJlcG9ydGVkIGR1cmluZyBgU3RyZWFtaW5nYCBvcGVyYXRpb25zLCBzdWNoIGFzIHJlcGFpciwKLWJvb3RzdHJhcCwgcmVidWlsZC4KLQotVGhlc2UgbWV0cmljcyBhcmUgc3BlY2lmaWMgdG8gYSBwZWVyIGVuZHBvaW50LCB3aXRoIHRoZSBzb3VyY2Ugbm9kZQotYmVpbmcgdGhlIG5vZGUgeW91IGFyZSBwdWxsaW5nIHRoZSBtZXRyaWNzIGZyb20uCi0KLVJlcG9ydGVkIG5hbWUgZm9ybWF0OgotCi0qTWV0cmljIE5hbWUqOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuU3RyZWFtaW5nLjxNZXRyaWNOYW1lPi48UGVlcklQPmAKLSpKTVggTUJlYW4qOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1TdHJlYW1pbmcgc2NvcGU9PFBlZXJJUD4gbmFtZT08TWV0cmljTmFtZT5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxJbmNvbWluZ0J5dGVzIHxDb3VudGVyIHxOdW1iZXIgb2YgYnl0ZXMgc3RyZWFtZWQgdG8gdGhpcyBub2RlIGZyb20gdGhlCi1wZWVyLgotCi18T3V0Z29pbmdCeXRlcyB8Q291bnRlciB8TnVtYmVyIG9mIGJ5dGVzIHN0cmVhbWVkIHRvIHRoZSBwZWVyIGVuZHBvaW50Ci1mcm9tIHRoaXMgbm9kZS4KLXw9PT0KLQotPT0gQ29tcGFjdGlvbiBNZXRyaWNzCi0KLU1ldHJpY3Mgc3BlY2lmaWMgdG8gYENvbXBhY3Rpb25gIHdvcmsuCi0KLVJlcG9ydGVkIG5hbWUgZm9ybWF0OgotCi0qTWV0cmljIE5hbWUqOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ29tcGFjdGlvbi48TWV0cmljTmFtZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9Q29tcGFjdGlvbiBuYW1lPTxNZXRyaWNOYW1lPmAKLQotW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgotfEJ5dGVzQ29tcGFjdGVkIHxDb3VudGVyIHxUb3RhbCBudW1iZXIgb2YgYnl0ZXMgY29tcGFjdGVkIHNpbmNlIHNlcnZlcgotW3JlXXN0YXJ0LgotCi18UGVuZGluZ1Rhc2tzIHxHYXVnZTxJbnRlZ2VyPiB8RXN0aW1hdGVkIG51bWJlciBvZiBjb21wYWN0aW9ucyByZW1haW5pbmcKLXRvIHBlcmZvcm0uCi0KLXxDb21wbGV0ZWRUYXNrcyB8R2F1Z2U8TG9uZz4gfE51bWJlciBvZiBjb21wbGV0ZWQgY29tcGFjdGlvbnMgc2luY2UKLXNlcnZlciBbcmVdc3RhcnQuCi0KLXxUb3RhbENvbXBhY3Rpb25zQ29tcGxldGVkIHxNZXRlciB8VGhyb3VnaHB1dCBvZiBjb21wbGV0ZWQgY29tcGFjdGlvbnMKLXNpbmNlIHNlcnZlciBbcmVdc3RhcnQuCi0KLXxQZW5kaW5nVGFza3NCeVRhYmxlTmFtZSB8R2F1Z2U8TWFwPFN0cmluZywgTWFwPFN0cmluZywgSW50ZWdlcj4+PgotfEVzdGltYXRlZCBudW1iZXIgb2YgY29tcGFjdGlvbnMgcmVtYWluaW5nIHRvIHBlcmZvcm0sIGdyb3VwZWQgYnkKLWtleXNwYWNlIGFuZCB0aGVuIHRhYmxlIG5hbWUuIFRoaXMgaW5mbyBpcyBhbHNvIGtlcHQgaW4gYFRhYmxlIE1ldHJpY3NgLgotfD09PQotCi09PSBDb21taXRMb2cgTWV0cmljcwotCi1NZXRyaWNzIHNwZWNpZmljIHRvIHRoZSBgQ29tbWl0TG9nYAotCi1SZXBvcnRlZCBuYW1lIGZvcm1hdDoKLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNvbW1pdExvZy48TWV0cmljTmFtZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9Q29tbWl0TG9nIG5hbWU9PE1ldHJpY05hbWU+YAotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18Q29tcGxldGVkVGFza3MgfEdhdWdlPExvbmc+IHxUb3RhbCBudW1iZXIgb2YgY29tbWl0IGxvZyBtZXNzYWdlcwotd3JpdHRlbiBzaW5jZSBbcmVdc3RhcnQuCi0KLXxQZW5kaW5nVGFza3MgfEdhdWdlPExvbmc+IHxOdW1iZXIgb2YgY29tbWl0IGxvZyBtZXNzYWdlcyB3cml0dGVuIGJ1dAoteWV0IHRvIGJlIGZzeW5jJ2QuCi0KLXxUb3RhbENvbW1pdExvZ1NpemUgfEdhdWdlPExvbmc+IHxDdXJyZW50IHNpemUsIGluIGJ5dGVzLCB1c2VkIGJ5IGFsbAotdGhlIGNvbW1pdCBsb2cgc2VnbWVudHMuCi0KLXxXYWl0aW5nT25TZWdtZW50QWxsb2NhdGlvbiB8VGltZXIgfFRpbWUgc3BlbnQgd2FpdGluZyBmb3IgYQotQ29tbWl0TG9nU2VnbWVudCB0byBiZSBhbGxvY2F0ZWQgLSB1bmRlciBub3JtYWwgY29uZGl0aW9ucyB0aGlzIHNob3VsZAotYmUgemVyby4KLQotfFdhaXRpbmdPbkNvbW1pdCB8VGltZXIgfFRoZSB0aW1lIHNwZW50IHdhaXRpbmcgb24gQ0wgZnN5bmM7IGZvcgotUGVyaW9kaWMgdGhpcyBpcyBvbmx5IG9jY3VycyB3aGVuIHRoZSBzeW5jIGlzIGxhZ2dpbmcgaXRzIHN5bmMgaW50ZXJ2YWwuCi18PT09Ci0KLT09IFN0b3JhZ2UgTWV0cmljcwotCi1NZXRyaWNzIHNwZWNpZmljIHRvIHRoZSBzdG9yYWdlIGVuZ2luZS4KLQotUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6Ci0KLSpNZXRyaWMgTmFtZSo6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TdG9yYWdlLjxNZXRyaWNOYW1lPmAKLSpKTVggTUJlYW4qOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1TdG9yYWdlIG5hbWU9PE1ldHJpY05hbWU+YAotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18RXhjZXB0aW9ucyB8Q291bnRlciB8TnVtYmVyIG9mIGludGVybmFsIGV4Y2VwdGlvbnMgY2F1Z2h0LiBVbmRlciBub3JtYWwKLWV4Y2VwdGlvbnMgdGhpcyBzaG91bGQgYmUgemVyby4KLQotfExvYWQgfENvdW50ZXIgfFNpemUsIGluIGJ5dGVzLCBvZiB0aGUgb24gZGlzayBkYXRhIHNpemUgdGhpcyBub2RlCi1tYW5hZ2VzLgotCi18VG90YWxIaW50cyB8Q291bnRlciB8TnVtYmVyIG9mIGhpbnQgbWVzc2FnZXMgd3JpdHRlbiB0byB0aGlzIG5vZGUgc2luY2UKLVtyZV1zdGFydC4gSW5jbHVkZXMgb25lIGVudHJ5IGZvciBlYWNoIGhvc3QgdG8gYmUgaGludGVkIHBlciBoaW50LgotCi18VG90YWxIaW50c0luUHJvZ3Jlc3MgfENvdW50ZXIgfE51bWJlciBvZiBoaW50cyBhdHRlbXBpbmcgdG8gYmUgc2VudAotY3VycmVudGx5LgotfD09PQotCi1bW2hhbmRvZmYtbWV0cmljc11dCi09PSBIaW50ZWRIYW5kb2ZmIE1ldHJpY3MKLQotTWV0cmljcyBzcGVjaWZpYyB0byBIaW50ZWQgSGFuZG9mZi4gVGhlcmUgYXJlIGFsc28gc29tZSBtZXRyaWNzIHJlbGF0ZWQKLXRvIGhpbnRzIHRyYWNrZWQgaW4gYFN0b3JhZ2UgTWV0cmljc2AKLQotVGhlc2UgbWV0cmljcyBpbmNsdWRlIHRoZSBwZWVyIGVuZHBvaW50ICppbiB0aGUgbWV0cmljIG5hbWUqCi0KLVJlcG9ydGVkIG5hbWUgZm9ybWF0OgotCi0qTWV0cmljIE5hbWUqOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuSGludGVkSGFuZE9mZk1hbmFnZXIuPE1ldHJpY05hbWU+YAotKkpNWCBNQmVhbio6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUhpbnRlZEhhbmRPZmZNYW5hZ2VyIG5hbWU9PE1ldHJpY05hbWU+YAotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18SGludHNfY3JlYXRlZC08UGVlcklQPiBhfAotX19fXwotQ291bnRlcgotX19fXwotCi1hfAotX19fXwotTnVtYmVyIG9mIGhpbnRzIG9uIGRpc2sgZm9yIHRoaXMgcGVlci4KLV9fX18KLQotfEhpbnRzX25vdF9zdG9yZWQtPFBlZXJJUD4gYXwKLV9fX18KLUNvdW50ZXIKLV9fX18KLQotYXwKLV9fX18KLU51bWJlciBvZiBoaW50cyBub3Qgc3RvcmVkIGZvciB0aGlzIHBlZXIsIGR1ZSB0byBiZWluZyBkb3duIHBhc3QgdGhlCi1jb25maWd1cmVkIGhpbnQgd2luZG93LgotX19fXwotCi18PT09Ci0KLT09IEhpbnRzU2VydmljZSBNZXRyaWNzCi0KLU1ldHJpY3Mgc3BlY2lmaWMgdG8gdGhlIEhpbnRzIGRlbGl2ZXJ5IHNlcnZpY2UuIFRoZXJlIGFyZSBhbHNvIHNvbWUKLW1ldHJpY3MgcmVsYXRlZCB0byBoaW50cyB0cmFja2VkIGluIGBTdG9yYWdlIE1ldHJpY3NgCi0KLVRoZXNlIG1ldHJpY3MgaW5jbHVkZSB0aGUgcGVlciBlbmRwb2ludCAqaW4gdGhlIG1ldHJpYyBuYW1lKgotCi1SZXBvcnRlZCBuYW1lIGZvcm1hdDoKLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkhpbnRzU2VydmljZS48TWV0cmljTmFtZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9SGludHNTZXJ2aWNlIG5hbWU9PE1ldHJpY05hbWU+YAotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18SGludHNTdWNjZWVkZWQgYXwKLV9fX18KLU1ldGVyCi1fX19fCi0KLWF8Ci1fX19fCi1BIG1ldGVyIG9mIHRoZSBoaW50cyBzdWNjZXNzZnVsbHkgZGVsaXZlcmVkCi1fX19fCi0KLXxIaW50c0ZhaWxlZCBhfAotX19fXwotTWV0ZXIKLV9fX18KLQotYXwKLV9fX18KLUEgbWV0ZXIgb2YgdGhlIGhpbnRzIHRoYXQgZmFpbGVkIGRlbGl2ZXIKLV9fX18KLQotfEhpbnRzVGltZWRPdXQgYXwKLV9fX18KLU1ldGVyCi1fX19fCi0KLWF8Ci1fX19fCi1BIG1ldGVyIG9mIHRoZSBoaW50cyB0aGF0IHRpbWVkIG91dAotX19fXwotCi18SGludF9kZWxheXMgfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG9mIGhpbnQgZGVsaXZlcnkgZGVsYXlzIChpbgotbWlsbGlzZWNvbmRzKQotCi18SGludF9kZWxheXMtPFBlZXJJUD4gfEhpc3RvZ3JhbSB8SGlzdG9ncmFtIG9mIGhpbnQgZGVsaXZlcnkgZGVsYXlzIChpbgotbWlsbGlzZWNvbmRzKSBwZXIgcGVlcgotfD09PQotCi09PSBTU1RhYmxlIEluZGV4IE1ldHJpY3MKLQotTWV0cmljcyBzcGVjaWZpYyB0byB0aGUgU1NUYWJsZSBpbmRleCBtZXRhZGF0YS4KLQotUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6Ci0KLSpNZXRyaWMgTmFtZSo6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5JbmRleC48TWV0cmljTmFtZT4uUm93SW5kZXhFbnRyeWAKLSpKTVggTUJlYW4qOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1JbmRleCBzY29wZT1Sb3dJbmRleEVudHJ5IG5hbWU9PE1ldHJpY05hbWU+YAotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18SW5kZXhlZEVudHJ5U2l6ZSB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgdGhlIG9uLWhlYXAgc2l6ZSwgaW4gYnl0ZXMsCi1vZiB0aGUgaW5kZXggYWNyb3NzIGFsbCBTU1RhYmxlcy4KLQotfEluZGV4SW5mb0NvdW50IHxIaXN0b2dyYW0gfEhpc3RvZ3JhbSBvZiB0aGUgbnVtYmVyIG9mIG9uLWhlYXAgaW5kZXgKLWVudHJpZXMgbWFuYWdlZCBhY3Jvc3MgYWxsIFNTVGFibGVzLgotCi18SW5kZXhJbmZvR2V0cyB8SGlzdG9ncmFtIHxIaXN0b2dyYW0gb2YgdGhlIG51bWJlciBpbmRleCBzZWVrcyBwZXJmb3JtZWQKLXBlciBTU1RhYmxlLgotfD09PQotCi09PSBCdWZmZXJQb29sIE1ldHJpY3MKLQotTWV0cmljcyBzcGVjaWZpYyB0byB0aGUgaW50ZXJuYWwgcmVjeWNsZWQgYnVmZmVyIHBvb2wgQ2Fzc2FuZHJhIG1hbmFnZXMuCi1UaGlzIHBvb2wgaXMgbWVhbnQgdG8ga2VlcCBhbGxvY2F0aW9ucyBhbmQgR0MgbG93ZXIgYnkgcmVjeWNsaW5nIG9uIGFuZAotb2ZmIGhlYXAgYnVmZmVycy4KLQotUmVwb3J0ZWQgbmFtZSBmb3JtYXQ6Ci0KLSpNZXRyaWMgTmFtZSo6OgotICBgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5CdWZmZXJQb29sLjxNZXRyaWNOYW1lPmAKLSpKTVggTUJlYW4qOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1CdWZmZXJQb29sIG5hbWU9PE1ldHJpY05hbWU+YAotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18U2l6ZSB8R2F1Z2U8TG9uZz4gfFNpemUsIGluIGJ5dGVzLCBvZiB0aGUgbWFuYWdlZCBidWZmZXIgcG9vbAotCi18TWlzc2VzIHxNZXRlciBhfAotX19fXwotVGhlIHJhdGUgb2YgbWlzc2VzIGluIHRoZSBwb29sLiBUaGUgaGlnaGVyIHRoaXMgaXMgdGhlIG1vcmUgYWxsb2NhdGlvbnMKLWluY3VycmVkLgotX19fXwotCi18PT09Ci0KLT09IENsaWVudCBNZXRyaWNzCi0KLU1ldHJpY3Mgc3BlY2lmYyB0byBjbGllbnQgbWFuYWdtZW50LgotCi1SZXBvcnRlZCBuYW1lIGZvcm1hdDoKLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudC48TWV0cmljTmFtZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9Q2xpZW50IG5hbWU9PE1ldHJpY05hbWU+YAotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18Y29ubmVjdGVkTmF0aXZlQ2xpZW50cyB8R2F1Z2U8SW50ZWdlcj4gfE51bWJlciBvZiBjbGllbnRzIGNvbm5lY3RlZCB0bwotdGhpcyBub2RlcyBuYXRpdmUgcHJvdG9jb2wgc2VydmVyCi0KLXxjb25uZWN0aW9ucyB8R2F1Z2U8TGlzdDxNYXA8U3RyaW5nLCBTdHJpbmc+PiB8TGlzdCBvZiBhbGwgY29ubmVjdGlvbnMKLWFuZCB0aGVpciBzdGF0ZSBpbmZvcm1hdGlvbgotCi18Y29ubmVjdGVkTmF0aXZlQ2xpZW50c0J5VXNlciB8R2F1Z2U8TWFwPFN0cmluZywgSW50PiB8TnVtYmVyIG9mCi1jb25ubmVjdGl2ZSBuYXRpdmUgY2xpZW50cyBieSB1c2VybmFtZQotfD09PQotCi09PSBCYXRjaCBNZXRyaWNzCi0KLU1ldHJpY3Mgc3BlY2lmYyB0byBiYXRjaCBzdGF0ZW1lbnRzLgotCi1SZXBvcnRlZCBuYW1lIGZvcm1hdDoKLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkJhdGNoLjxNZXRyaWNOYW1lPmAKLSpKTVggTUJlYW4qOjoKLSAgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1CYXRjaCBuYW1lPTxNZXRyaWNOYW1lPmAKLQotW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgotfFBhcnRpdGlvbnNQZXJDb3VudGVyQmF0Y2ggfEhpc3RvZ3JhbSB8RGlzdHJpYnV0aW9uIG9mIHRoZSBudW1iZXIgb2YKLXBhcnRpdGlvbnMgcHJvY2Vzc2VkIHBlciBjb3VudGVyIGJhdGNoCi0KLXxQYXJ0aXRpb25zUGVyTG9nZ2VkQmF0Y2ggfEhpc3RvZ3JhbSB8RGlzdHJpYnV0aW9uIG9mIHRoZSBudW1iZXIgb2YKLXBhcnRpdGlvbnMgcHJvY2Vzc2VkIHBlciBsb2dnZWQgYmF0Y2gKLQotfFBhcnRpdGlvbnNQZXJVbmxvZ2dlZEJhdGNoIHxIaXN0b2dyYW0gfERpc3RyaWJ1dGlvbiBvZiB0aGUgbnVtYmVyIG9mCi1wYXJ0aXRpb25zIHByb2Nlc3NlZCBwZXIgdW5sb2dnZWQgYmF0Y2gKLXw9PT0KLQotPT0gSlZNIE1ldHJpY3MKLQotSlZNIG1ldHJpY3Mgc3VjaCBhcyBtZW1vcnkgYW5kIGdhcmJhZ2UgY29sbGVjdGlvbiBzdGF0aXN0aWNzIGNhbiBlaXRoZXIKLWJlIGFjY2Vzc2VkIGJ5IGNvbm5lY3RpbmcgdG8gdGhlIEpWTSB1c2luZyBKTVggb3IgY2FuIGJlIGV4cG9ydGVkIHVzaW5nCi1saW5rOiNtZXRyaWMtcmVwb3J0ZXJzW01ldHJpYyBSZXBvcnRlcnNdLgotCi09PT0gQnVmZmVyUG9vbAotCi0qTWV0cmljIE5hbWUqOjoKLSAgYGp2bS5idWZmZXJzLjxkaXJlY3R8bWFwcGVkPi48TWV0cmljTmFtZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBqYXZhLm5pbzp0eXBlPUJ1ZmZlclBvb2wgbmFtZT08ZGlyZWN0fG1hcHBlZD5gCi0KLVtjb2xzPSIsLCIsb3B0aW9ucz0iaGVhZGVyIixdCi18PT09Ci18TmFtZSB8VHlwZSB8RGVzY3JpcHRpb24KLXxDYXBhY2l0eSB8R2F1Z2U8TG9uZz4gfEVzdGltYXRlZCB0b3RhbCBjYXBhY2l0eSBvZiB0aGUgYnVmZmVycyBpbiB0aGlzCi1wb29sCi0KLXxDb3VudCB8R2F1Z2U8TG9uZz4gfEVzdGltYXRlZCBudW1iZXIgb2YgYnVmZmVycyBpbiB0aGUgcG9vbAotCi18VXNlZCB8R2F1Z2U8TG9uZz4gfEVzdGltYXRlZCBtZW1vcnkgdGhhdCB0aGUgSmF2YSB2aXJ0dWFsIG1hY2hpbmUgaXMKLXVzaW5nIGZvciB0aGlzIGJ1ZmZlciBwb29sCi18PT09Ci0KLT09PSBGaWxlRGVzY3JpcHRvclJhdGlvCi0KLSpNZXRyaWMgTmFtZSo6OgotICBganZtLmZkLjxNZXRyaWNOYW1lPmAKLSpKTVggTUJlYW4qOjoKLSAgYGphdmEubGFuZzp0eXBlPU9wZXJhdGluZ1N5c3RlbSBuYW1lPTxPcGVuRmlsZURlc2NyaXB0b3JDb3VudHxNYXhGaWxlRGVzY3JpcHRvckNvdW50PmAKLQotW2NvbHM9IiwsIixvcHRpb25zPSJoZWFkZXIiLF0KLXw9PT0KLXxOYW1lIHxUeXBlIHxEZXNjcmlwdGlvbgotfFVzYWdlIHxSYXRpbyB8UmF0aW8gb2YgdXNlZCB0byB0b3RhbCBmaWxlIGRlc2NyaXB0b3JzCi18PT09Ci0KLT09PSBHYXJiYWdlQ29sbGVjdG9yCi0KLSpNZXRyaWMgTmFtZSo6OgotICBganZtLmdjLjxnY190eXBlPi48TWV0cmljTmFtZT5gCi0qSk1YIE1CZWFuKjo6Ci0gIGBqYXZhLmxhbmc6dHlwZT1HYXJiYWdlQ29sbGVjdG9yIG5hbWU9PGdjX3R5cGU+YAotCi1bY29scz0iLCwiLG9wdGlvbnM9ImhlYWRlciIsXQotfD09PQotfE5hbWUgfFR5cGUgfERlc2NyaXB0aW9uCi18Q291bnQgfEdhdWdlPExvbmc+IHxUb3RhbCBudW1iZXIgb2YgY29sbGVjdGlvbnMgdGhhdCBoYXZlIG9jY3VycmVkCi0KLXxUaW1lIHxHYXVnZTxMb25nPiB8QXBwcm94aW1hdGUgYWNjdW11bGF0ZWQgY29sbGVjdGlvbiBlbGFwc2VkIHRpbWUgaW4KLW1pbGxpc2Vjb25kcwotfD09PQotCi09PT0gTWVtb3J5Ci0KLSpNZXRyaWMgTmFtZSo6OgotICBganZtLm1lbW9yeS48aGVhcC9ub24taGVhcC90b3RhbD4uPE1ldHJpY05hbWU+YAotKkpNWCBNQmVhbio6OgotICBgamF2YS5sYW5nOnR5cGU9TWVtb3J5YAotCi1bY29scz0iLCwiLF0KLXw9PT0KLXxDb21taXR0ZWQgfEdhdWdlPExvbmc+IHxBbW91bnQgb2YgbWVtb3J5IGluIGJ5dGVzIHRoYXQgaXMgY29tbWl0dGVkIGZvcgotdGhlIEpWTSB0byB1c2UKLQotfEluaXQgfEdhdWdlPExvbmc+IHxBbW91bnQgb2YgbWVtb3J5IGluIGJ5dGVzIHRoYXQgdGhlIEpWTSBpbml0aWFsbHkKLXJlcXVlc3RzIGZyb20gdGhlIE9TCi0KLXxNYXggfEdhdWdlPExvbmc+IHxNYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdGhhdCBjYW4gYmUgdXNlZAotZm9yIG1lbW9yeSBtYW5hZ2VtZW50Ci0KLXxVc2FnZSB8UmF0aW8gfFJhdGlvIG9mIHVzZWQgdG8gbWF4aW11bSBtZW1vcnkKLQotfFVzZWQgfEdhdWdlPExvbmc+IHxBbW91bnQgb2YgdXNlZCBtZW1vcnkgaW4gYnl0ZXMKLXw9PT0KLQotPT09IE1lbW9yeVBvb2wKLQotKk1ldHJpYyBOYW1lKjo6Ci0gIGBqdm0ubWVtb3J5LnBvb2xzLjxtZW1vcnlfcG9vbD4uPE1ldHJpY05hbWU+YAotKkpNWCBNQmVhbio6OgotICBgamF2YS5sYW5nOnR5cGU9TWVtb3J5UG9vbCBuYW1lPTxtZW1vcnlfcG9vbD5gCi0KLVtjb2xzPSIsLCIsXQotfD09PQotfENvbW1pdHRlZCB8R2F1Z2U8TG9uZz4gfEFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdGhhdCBpcyBjb21taXR0ZWQgZm9yCi10aGUgSlZNIHRvIHVzZQotCi18SW5pdCB8R2F1Z2U8TG9uZz4gfEFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdGhhdCB0aGUgSlZNIGluaXRpYWxseQotcmVxdWVzdHMgZnJvbSB0aGUgT1MKLQotfE1heCB8R2F1Z2U8TG9uZz4gfE1heGltdW0gYW1vdW50IG9mIG1lbW9yeSBpbiBieXRlcyB0aGF0IGNhbiBiZSB1c2VkCi1mb3IgbWVtb3J5IG1hbmFnZW1lbnQKLQotfFVzYWdlIHxSYXRpbyB8UmF0aW8gb2YgdXNlZCB0byBtYXhpbXVtIG1lbW9yeQotCi18VXNlZCB8R2F1Z2U8TG9uZz4gfEFtb3VudCBvZiB1c2VkIG1lbW9yeSBpbiBieXRlcwotfD09PQotCi09PSBKTVgKLQotQW55IEpNWCBiYXNlZCBjbGllbnQgY2FuIGFjY2VzcyBtZXRyaWNzIGZyb20gY2Fzc2FuZHJhLgotCi1JZiB5b3Ugd2lzaCB0byBhY2Nlc3MgSk1YIG1ldHJpY3Mgb3ZlciBodHRwIGl0J3MgcG9zc2libGUgdG8gZG93bmxvYWQKLWh0dHA6Ly9teDRqLnNvdXJjZWZvcmdlLm5ldC9bTXg0alRvb2xdIGFuZCBwbGFjZSBgbXg0ai10b29scy5qYXJgIGludG8KLXRoZSBjbGFzc3BhdGguIE9uIHN0YXJ0dXAgeW91IHdpbGwgc2VlIGluIHRoZSBsb2c6Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLUh0dHBBZGFwdG9yIHZlcnNpb24gMy4wLjIgc3RhcnRlZCBvbiBwb3J0IDgwODEKLS0tLS0KLQotVG8gY2hvb3NlIGEgZGlmZmVyZW50IHBvcnQgKDgwODEgaXMgdGhlIGRlZmF1bHQpIG9yIGEgZGlmZmVyZW50IGxpc3RlbgotYWRkcmVzcyAoMC4wLjAuMCBpcyBub3QgdGhlIGRlZmF1bHQpIGVkaXQgYGNvbmYvY2Fzc2FuZHJhLWVudi5zaGAgYW5kCi11bmNvbW1lbnQ6Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLSNNWDRKX0FERFJFU1M9Ii1EbXg0amFkZHJlc3M9MC4wLjAuMCIKLQotI01YNEpfUE9SVD0iLURteDRqcG9ydD04MDgxIgotLS0tLQotCi09PSBNZXRyaWMgUmVwb3J0ZXJzCi0KLUFzIG1lbnRpb25lZCBhdCB0aGUgdG9wIG9mIHRoaXMgc2VjdGlvbiBvbiBtb25pdG9yaW5nIHRoZSBDYXNzYW5kcmEKLW1ldHJpY3MgY2FuIGJlIGV4cG9ydGVkIHRvIGEgbnVtYmVyIG9mIG1vbml0b3Jpbmcgc3lzdGVtIGEgbnVtYmVyIG9mCi1odHRwOi8vbWV0cmljcy5kcm9wd2l6YXJkLmlvLzMuMS4wL2dldHRpbmctc3RhcnRlZC8jb3RoZXItcmVwb3J0aW5nW2J1aWx0Ci1pbl0gYW5kIGh0dHA6Ly9tZXRyaWNzLmRyb3B3aXphcmQuaW8vMy4xLjAvbWFudWFsL3RoaXJkLXBhcnR5L1t0aGlyZAotcGFydHldIHJlcG9ydGVyIHBsdWdpbnMuCi0KLVRoZSBjb25maWd1cmF0aW9uIG9mIHRoZXNlIHBsdWdpbnMgaXMgbWFuYWdlZCBieSB0aGUKLWh0dHBzOi8vZ2l0aHViLmNvbS9hZGR0aGlzL21ldHJpY3MtcmVwb3J0ZXItY29uZmlnW21ldHJpY3MgcmVwb3J0ZXIKLWNvbmZpZyBwcm9qZWN0XS4gVGhlcmUgaXMgYSBzYW1wbGUgY29uZmlndXJhdGlvbiBmaWxlIGxvY2F0ZWQgYXQKLWBjb25mL21ldHJpY3MtcmVwb3J0ZXItY29uZmlnLXNhbXBsZS55YW1sYC4KLQotT25jZSBjb25maWd1cmVkLCB5b3Ugc2ltcGx5IHN0YXJ0IGNhc3NhbmRyYSB3aXRoIHRoZSBmbGFnCi1gLURjYXNzYW5kcmEubWV0cmljc1JlcG9ydGVyQ29uZmlnRmlsZT1tZXRyaWNzLXJlcG9ydGVyLWNvbmZpZy55YW1sYC4KLVRoZSBzcGVjaWZpZWQgLnlhbWwgZmlsZSBwbHVzIGFueSAzcmQgcGFydHkgcmVwb3J0ZXIgamFycyBtdXN0IGFsbCBiZSBpbgotQ2Fzc2FuZHJhJ3MgY2xhc3NwYXRoLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL29wZXJhdGluZy92aXJ0dWFsdGFibGVzLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL3ZpcnR1YWx0YWJsZXMuYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2M2VjYi4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3BlcmF0aW5nL3ZpcnR1YWx0YWJsZXMuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDQ3OCArMCwwIEBACi09IFZpcnR1YWwgVGFibGVzCi0KLUFwYWNoZSBDYXNzYW5kcmEgNC4wIGltcGxlbWVudHMgdmlydHVhbCB0YWJsZXMgKGh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQ0FTU0FORFJBLTc2MjJbQ0FTU0FORFJBLTc2MjJdKS4KLVZpcnR1YWwgdGFibGVzIGFyZSB0YWJsZXMgYmFja2VkIGJ5IGFuIEFQSSBpbnN0ZWFkIG9mIGRhdGEgZXhwbGljaXRseSBtYW5hZ2VkIGFuZCBzdG9yZWQgYXMgU1NUYWJsZXMuIAotQXBhY2hlIENhc3NhbmRyYSA0LjAgaW1wbGVtZW50cyBhIHZpcnR1YWwga2V5c3BhY2UgaW50ZXJmYWNlIGZvciB2aXJ0dWFsIHRhYmxlcy4gCi1WaXJ0dWFsIHRhYmxlcyBhcmUgc3BlY2lmaWMgdG8gZWFjaCBub2RlLgotCi1Tb21lIG9mIHRoZSBmZWF0dXJlcyBvZiB2aXJ0dWFsIHRhYmxlcyBhcmUgdGhlIGFiaWxpdHkgdG86Ci0KLSogZXhwb3NlIG1ldHJpY3MgdGhyb3VnaCBDUUwKLSogZXhwb3NlIFlBTUwgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbgotCi1WaXJ0dWFsIGtleXNwYWNlcyBhbmQgdGFibGVzIGFyZSBxdWl0ZSBkaWZmZXJlbnQgZnJvbSByZWd1bGFyIHRhYmxlcyBhbmQga2V5c3BhY2VzOgotCi0qIFZpcnR1YWwgdGFibGVzIGFyZSBjcmVhdGVkIGluIHNwZWNpYWwga2V5c3BhY2VzIGFuZCBub3QganVzdCBhbnkga2V5c3BhY2UuCi0qIFZpcnR1YWwgdGFibGVzIGFyZSBtYW5hZ2VkIGJ5IENhc3NhbmRyYS4gVXNlcnMgY2Fubm90IHJ1biBEREwgdG8gY3JlYXRlIG5ldyB2aXJ0dWFsIHRhYmxlcyBvciBETUwgdG8gbW9kaWZ5IGV4aXN0aW5nIHZpcnR1YWwgdGFibGVzLgotKiBWaXJ0dWFsIHRhYmxlcyBhcmUgY3VycmVudGx5IHJlYWQtb25seSwgYWx0aG91Z2ggdGhhdCBtYXkgY2hhbmdlIGluIGEgbGF0ZXIgdmVyc2lvbi4KLSogVmlydHVhbCB0YWJsZXMgYXJlIGxvY2FsIG9ubHksIG5vbi1kaXN0cmlidXRlZCwgYW5kIHRodXMgbm90IHJlcGxpY2F0ZWQuCi0qIFZpcnR1YWwgdGFibGVzIGhhdmUgbm8gYXNzb2NpYXRlZCBTU1RhYmxlcy4KLSogQ29uc2lzdGVuY3kgbGV2ZWwgb2YgdGhlIHF1ZXJpZXMgc2VudCB0byB2aXJ0dWFsIHRhYmxlcyBhcmUgaWdub3JlZC4KLSogQWxsIGV4aXN0aW5nIHZpcnR1YWwgdGFibGVzIHVzZSBgTG9jYWxQYXJ0aXRpb25lcmAuIAotU2luY2UgYSB2aXJ0dWFsIHRhYmxlIGlzIG5vdCByZXBsaWNhdGVkIHRoZSBwYXJ0aXRpb25lciBzb3J0cyBpbiBvcmRlciBvZiBwYXJ0aXRpb24ga2V5cyBpbnN0ZWFkIG9mIGJ5IHRoZWlyIGhhc2guCi0qIE1ha2luZyBhZHZhbmNlZCBxdWVyaWVzIHVzaW5nIGBBTExPVyBGSUxURVJJTkdgIGFuZCBhZ2dyZWdhdGlvbiBmdW5jdGlvbnMgY2FuIGJlIGV4ZWN1dGVkIGluIHZpcnR1YWwgdGFibGVzLCBldmVuIHRob3VnaCBpbiBub3JtYWwgdGFibGVzIHdlIGRvbnQgcmVjb21tZW5kIGl0LgotCi09PSBWaXJ0dWFsIEtleXNwYWNlcwotCi1BcGFjaGUgQ2Fzc2FuZHJhIDQuMCBoYXMgYWRkZWQgdHdvIG5ldyBrZXlzcGFjZXMgZm9yIHZpcnR1YWwgdGFibGVzOgotCi0qIGBzeXN0ZW1fdmlydHVhbF9zY2hlbWFgIAotKiBgc3lzdGVtX3ZpZXdzYC4gCi0KLVRoZSBgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hYCBrZXlzcGFjZSBoYXMgdGhyZWUgdGFibGVzOiBga2V5c3BhY2VzYCwKLWBjb2x1bW5zYCBhbmQgYHRhYmxlc2AgZm9yIHRoZSB2aXJ0dWFsIGtleXNwYWNlLCB0YWJsZSwgYW5kIGNvbHVtbiBkZWZpbml0aW9ucywgcmVzcGVjdGl2ZWx5LgotVGhlc2UgdGFibGVzIGNvbnRhaW4gc2NoZW1hIGluZm9ybWF0aW9uIGZvciB0aGUgdmlydHVhbCB0YWJsZXMuCi1JdCBpcyB1c2VkIGJ5IENhc3NhbmRyYSBpbnRlcm5hbGx5IGFuZCBhIHVzZXIgc2hvdWxkIG5vdCBhY2Nlc3MgaXQgZGlyZWN0bHkuCi0KLVRoZSBgc3lzdGVtX3ZpZXdzYCBrZXlzcGFjZSBjb250YWlucyB0aGUgYWN0dWFsIHZpcnR1YWwgdGFibGVzLgotCi09PSBWaXJ0dWFsIFRhYmxlIExpbWl0YXRpb25zCi0KLUJlZm9yZSBkaXNjY3VzaW5nIHZpcnR1YWwga2V5c3BhY2VzIGFuZCB0YWJsZXMsIG5vdGUgdGhhdCB2aXJ0dWFsIGtleXNwYWNlcyBhbmQgdGFibGVzIGhhdmUgc29tZSBsaW1pdGF0aW9ucy4gCi1UaGVzZSBsaW1pdGF0aW9ucyBhcmUgc3ViamVjdCB0byBjaGFuZ2UuCi1WaXJ0dWFsIGtleXNwYWNlcyBjYW5ub3QgYmUgYWx0ZXJlZCBvciBkcm9wcGVkLiAKLUluIGZhY3QsIG5vIG9wZXJhdGlvbnMgY2FuIGJlIHBlcmZvcm1lZCBhZ2FpbnN0IHZpcnR1YWwga2V5c3BhY2VzLgotCi1WaXJ0dWFsIHRhYmxlcyBjYW5ub3QgYmUgY3JlYXRlZCBpbiB2aXJ0dWFsIGtleXNwYWNlcy4KLVZpcnR1YWwgdGFibGVzIGNhbm5vdCBiZSBhbHRlcmVkLCBkcm9wcGVkLCBvciB0cnVuY2F0ZWQuCi1TZWNvbmRhcnkgaW5kZXhlcywgdHlwZXMsIGZ1bmN0aW9ucywgYWdncmVnYXRlcywgbWF0ZXJpYWxpemVkIHZpZXdzLCBhbmQgdHJpZ2dlcnMgY2Fubm90IGJlIGNyZWF0ZWQgZm9yIHZpcnR1YWwgdGFibGVzLgotRXhwaXJpbmcgdGltZS10by1saXZlIChUVEwpIGNvbHVtbnMgY2Fubm90IGJlIGNyZWF0ZWQuCi1WaXJ0dWFsIHRhYmxlcyBkbyBub3Qgc3VwcG9ydCBjb25kaXRpb25hbCB1cGRhdGVzIG9yIGRlbGV0ZXMuCi1BZ2dyZWdhdGVzIG1heSBiZSBydW4gaW4gU0VMRUNUIHN0YXRlbWVudHMuCi0KLUNvbmRpdGlvbmFsIGJhdGNoIHN0YXRlbWVudHMgY2Fubm90IGluY2x1ZGUgbXV0YXRpb25zIGZvciB2aXJ0dWFsIHRhYmxlcywgbm9yIGNhbiBhIHZpcnR1YWwgdGFibGUgc3RhdGVtZW50IGJlIGluY2x1ZGVkIGluIGEgbG9nZ2VkIGJhdGNoLgotSW4gZmFjdCwgbXV0YXRpb25zIGZvciB2aXJ0dWFsIGFuZCByZWd1bGFyIHRhYmxlcyBjYW5ub3Qgb2NjdXIgaW4gdGhlIHNhbWUgYmF0Y2ggdGFibGUuCi0KLT09IFZpcnR1YWwgVGFibGVzCi0KLUVhY2ggb2YgdGhlIHZpcnR1YWwgdGFibGVzIGluIHRoZSBgc3lzdGVtX3ZpZXdzYCB2aXJ0dWFsIGtleXNwYWNlIGNvbnRhaW4gZGlmZmVyZW50IGluZm9ybWF0aW9uLgotCi1UaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUgdmlydHVhbCB0YWJsZXM6IAotCi1bd2lkdGg9Ijk4JSIsY29scz0iMjclLDczJSIsXQotfD09PQotfFZpcnR1YWwgVGFibGUgfERlc2NyaXB0aW9uCi0KLXxjYWNoZXMgfERpc3BsYXlzIHRoZSBnZW5lcmFsIGNhY2hlIGluZm9ybWF0aW9uIGluY2x1ZGluZyBjYWNoZSBuYW1lLCBjYXBhY2l0eV9ieXRlcywgZW50cnlfY291bnQsIGhpdF9jb3VudCwgaGl0X3JhdGlvIGRvdWJsZSwKLXJlY2VudF9oaXRfcmF0ZV9wZXJfc2Vjb25kLCByZWNlbnRfcmVxdWVzdF9yYXRlX3Blcl9zZWNvbmQsIHJlcXVlc3RfY291bnQsIGFuZCBzaXplX2J5dGVzLgotCi18Y2xpZW50cyB8TGlzdHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGNvbm5lY3RlZCBjbGllbnRzLgotCi18Y29vcmRpbmF0b3JfcmVhZF9sYXRlbmN5IHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBjb29yZGluYXRvciByZWFkcy4KLQotfGNvb3JkaW5hdG9yX3NjYW4gfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGNvb3JkaW5hdG9yIHNjYW5zLgotCi18Y29vcmRpbmF0b3Jfd3JpdGVfbGF0ZW5jeSB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgY29vcmRpbmF0b3Igd3JpdGVzLgotCi18ZGlza191c2FnZSB8UmVjb3JkcyBkaXNrIHVzYWdlIGluY2x1ZGluZyBkaXNrX3NwYWNlLCBrZXlzcGFjZV9uYW1lLCBhbmQgdGFibGVfbmFtZSwgc29ydGVkIGJ5IHN5c3RlbSBrZXlzcGFjZXMuCi0KLXxpbnRlcm5vZGVfaW5ib3VuZCB8TGlzdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluYm91bmQgaW50ZXJub2RlIG1lc3NhZ2luZy4KLQotfGludGVybm9kZV9vdXRib3VuZCB8SW5mb3JtYXRpb24gYWJvdXQgdGhlIG91dGJvdW5kIGludGVybm9kZSBtZXNzYWdpbmcuCi0KLXxsb2NhbF9yZWFkX2xhdGVuY3kgfFJlY29yZHMgY291bnRzLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBtYXgsIG1lZGlhbiwgYW5kIHBlcl9zZWNvbmQgZm9yIGxvY2FsIHJlYWRzLgotCi18bG9jYWxfc2NhbiB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIG1heCwgbWVkaWFuLCBhbmQgcGVyX3NlY29uZCBmb3IgbG9jYWwgc2NhbnMuCi0KLXxsb2NhbF93cml0ZV9sYXRlbmN5IHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVfbmFtZSwgbWF4LCBtZWRpYW4sIGFuZCBwZXJfc2Vjb25kIGZvciBsb2NhbCB3cml0ZXMuCi0KLXxtYXhfcGFydGl0aW9uX3NpemUgfEEgdGFibGUgbWV0cmljIGZvciBtYXhpbXVtIHBhcnRpdGlvbiBzaXplLgotCi18cm93c19wZXJfcmVhZCB8UmVjb3JkcyBjb3VudHMsIGtleXNwYWNlX25hbWUsIHRhYmxla19uYW1lLCBtYXgsIGFuZCBtZWRpYW4gZm9yIHJvd3MgcmVhZC4KLQotfHNldHRpbmdzIHxEaXNwbGF5cyBjb25maWd1cmF0aW9uIHNldHRpbmdzIGluIGNhc3NhbmRyYS55YW1sLgotCi18c3N0YWJsZV90YXNrcyB8TGlzdHMgY3VycmVudGx5IHJ1bm5pbmcgdGFza3MgYW5kIHByb2dyZXNzIG9uIFNTVGFibGVzLCBmb3Igb3BlcmF0aW9ucyBsaWtlIGNvbXBhY3Rpb24gYW5kIHVwZ3JhZGUuCi0KLXxzeXN0ZW1fcHJvcGVydGllcyB8RGlzcGxheXMgZW52aXJvbm1lbnRhbCBzeXN0ZW0gcHJvcGVydGllcyBzZXQgb24gdGhlIG5vZGUuCi0KLXx0aHJlYWRfcG9vbHMgfExpc3RzIG1ldHJpY3MgZm9yIGVhY2ggdGhyZWFkIHBvb2wuCi0KLXx0b21ic3RvbmVzX3Blcl9yZWFkIHxSZWNvcmRzIGNvdW50cywga2V5c3BhY2VfbmFtZSwgdGFibGVrX25hbWUsIG1heCwgYW5kIG1lZGlhbiBmb3IgdG9tYnN0b25lcy4KLXw9PT0KLQotV2Ugc2hhbGwgZGlzY3VzcyBzb21lIG9mIHRoZSB2aXJ0dWFsIHRhYmxlcyBpbiBtb3JlIGRldGFpbCBuZXh0LgotCi09PT0gQ2xpZW50cyBWaXJ0dWFsIFRhYmxlCi0KLVRoZSBgY2xpZW50c2AgdmlydHVhbCB0YWJsZSBsaXN0cyBhbGwgYWN0aXZlIGNvbm5lY3Rpb25zIChjb25uZWN0ZWQKLWNsaWVudHMpIGluY2x1ZGluZyB0aGVpciBpcCBhZGRyZXNzLCBwb3J0LCBjbGllbnRfb3B0aW9ucywgY29ubmVjdGlvbiBzdGFnZSwgZHJpdmVyCi1uYW1lLCBkcml2ZXIgdmVyc2lvbiwgaG9zdG5hbWUsIHByb3RvY29sIHZlcnNpb24sIHJlcXVlc3QgY291bnQsIHNzbAotZW5hYmxlZCwgc3NsIHByb3RvY29sIGFuZCB1c2VyIG5hbWU6Ci0KLS4uLi4KLWNxbHNoPiBFWFBBTkQgT04gOwotTm93IEV4cGFuZGVkIG91dHB1dCBpcyBlbmFibGVkCi1jcWxzaD4gU0VMRUNUICogRlJPTSBzeXN0ZW1fdmlld3MuY2xpZW50czsKLQotQCBSb3cgMQotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gYWRkcmVzcyAgICAgICAgICB8IDEyNy4wLjAuMQotIHBvcnQgICAgICAgICAgICAgfCA1MDY4NwotIGNsaWVudF9vcHRpb25zICAgfCB7J0NRTF9WRVJTSU9OJzogJzMuNC42JywgJ0RSSVZFUl9OQU1FJzogJ0RhdGFTdGF4IFB5dGhvbiBEcml2ZXInLCAnRFJJVkVSX1ZFUlNJT04nOiAnMy4yNS4wJ30KLSBjb25uZWN0aW9uX3N0YWdlIHwgcmVhZHkKLSBkcml2ZXJfbmFtZSAgICAgIHwgRGF0YVN0YXggUHl0aG9uIERyaXZlcgotIGRyaXZlcl92ZXJzaW9uICAgfCAzLjI1LjAKLSBob3N0bmFtZSAgICAgICAgIHwgbG9jYWxob3N0Ci0gcHJvdG9jb2xfdmVyc2lvbiB8IDUKLSByZXF1ZXN0X2NvdW50ICAgIHwgMTYKLSBzc2xfY2lwaGVyX3N1aXRlIHwgbnVsbAotIHNzbF9lbmFibGVkICAgICAgfCBGYWxzZQotIHNzbF9wcm90b2NvbCAgICAgfCBudWxsCi0gdXNlcm5hbWUgICAgICAgICB8IGFub255bW91cwotCi1AIFJvdyAyCi0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBhZGRyZXNzICAgICAgICAgIHwgMTI3LjAuMC4xCi0gcG9ydCAgICAgICAgICAgICB8IDUwNjg4Ci0gY2xpZW50X29wdGlvbnMgICB8IHsnQ1FMX1ZFUlNJT04nOiAnMy40LjYnLCAnRFJJVkVSX05BTUUnOiAnRGF0YVN0YXggUHl0aG9uIERyaXZlcicsICdEUklWRVJfVkVSU0lPTic6ICczLjI1LjAnfQotIGNvbm5lY3Rpb25fc3RhZ2UgfCByZWFkeQotIGRyaXZlcl9uYW1lICAgICAgfCBEYXRhU3RheCBQeXRob24gRHJpdmVyCi0gZHJpdmVyX3ZlcnNpb24gICB8IDMuMjUuMAotIGhvc3RuYW1lICAgICAgICAgfCBsb2NhbGhvc3QKLSBwcm90b2NvbF92ZXJzaW9uIHwgNQotIHJlcXVlc3RfY291bnQgICAgfCA0Ci0gc3NsX2NpcGhlcl9zdWl0ZSB8IG51bGwKLSBzc2xfZW5hYmxlZCAgICAgIHwgRmFsc2UKLSBzc2xfcHJvdG9jb2wgICAgIHwgbnVsbAotIHVzZXJuYW1lICAgICAgICAgfCBhbm9ueW1vdXMKLQotQCBSb3cgMwotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gYWRkcmVzcyAgICAgICAgICB8IDEyNy4wLjAuMQotIHBvcnQgICAgICAgICAgICAgfCA1MDc1MwotIGNsaWVudF9vcHRpb25zICAgfCB7J0FQUExJQ0FUSU9OX05BTUUnOiAnVGVzdEFwcCcsICdBUFBMSUNBVElPTl9WRVJTSU9OJzogJzEuMC4wJywgJ0NMSUVOVF9JRCc6ICc1NWIzZWZiZC1jNTZiLTQ2OWQtOGNjYS0wMTZiODYwYjJmMDMnLCAnQ1FMX1ZFUlNJT04nOiAnMy4wLjAnLCAnRFJJVkVSX05BTUUnOiAnRGF0YVN0YXggSmF2YSBkcml2ZXIgZm9yIEFwYWNoZSBDYXNzYW5kcmEoUiknLCAnRFJJVkVSX1ZFUlNJT04nOiAnNC4xMy4wJ30KLSBjb25uZWN0aW9uX3N0YWdlIHwgcmVhZHkKLSBkcml2ZXJfbmFtZSAgICAgIHwgRGF0YVN0YXggSmF2YSBkcml2ZXIgZm9yIEFwYWNoZSBDYXNzYW5kcmEoUikKLSBkcml2ZXJfdmVyc2lvbiAgIHwgNC4xMy4wCi0gaG9zdG5hbWUgICAgICAgICB8IGxvY2FsaG9zdAotIHByb3RvY29sX3ZlcnNpb24gfCA1Ci0gcmVxdWVzdF9jb3VudCAgICB8IDE4Ci0gc3NsX2NpcGhlcl9zdWl0ZSB8IG51bGwKLSBzc2xfZW5hYmxlZCAgICAgIHwgRmFsc2UKLSBzc2xfcHJvdG9jb2wgICAgIHwgbnVsbAotIHVzZXJuYW1lICAgICAgICAgfCBhbm9ueW1vdXMKLQotQCBSb3cgNAotLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gYWRkcmVzcyAgICAgICAgICB8IDEyNy4wLjAuMQotIHBvcnQgICAgICAgICAgICAgfCA1MDc1NQotIGNsaWVudF9vcHRpb25zICAgfCB7J0FQUExJQ0FUSU9OX05BTUUnOiAnVGVzdEFwcCcsICdBUFBMSUNBVElPTl9WRVJTSU9OJzogJzEuMC4wJywgJ0NMSUVOVF9JRCc6ICc1NWIzZWZiZC1jNTZiLTQ2OWQtOGNjYS0wMTZiODYwYjJmMDMnLCAnQ1FMX1ZFUlNJT04nOiAnMy4wLjAnLCAnRFJJVkVSX05BTUUnOiAnRGF0YVN0YXggSmF2YSBkcml2ZXIgZm9yIEFwYWNoZSBDYXNzYW5kcmEoUiknLCAnRFJJVkVSX1ZFUlNJT04nOiAnNC4xMy4wJ30KLSBjb25uZWN0aW9uX3N0YWdlIHwgcmVhZHkKLSBkcml2ZXJfbmFtZSAgICAgIHwgRGF0YVN0YXggSmF2YSBkcml2ZXIgZm9yIEFwYWNoZSBDYXNzYW5kcmEoUikKLSBkcml2ZXJfdmVyc2lvbiAgIHwgNC4xMy4wCi0gaG9zdG5hbWUgICAgICAgICB8IGxvY2FsaG9zdAotIHByb3RvY29sX3ZlcnNpb24gfCA1Ci0gcmVxdWVzdF9jb3VudCAgICB8IDcKLSBzc2xfY2lwaGVyX3N1aXRlIHwgbnVsbAotIHNzbF9lbmFibGVkICAgICAgfCBGYWxzZQotIHNzbF9wcm90b2NvbCAgICAgfCBudWxsCi0gdXNlcm5hbWUgICAgICAgICB8IGFub255bW91cwotCi0oNCByb3dzKQotLi4uLgotCi1Tb21lIGV4YW1wbGVzIG9mIGhvdyBgY2xpZW50c2AgY2FuIGJlIHVzZWQgYXJlOgotCi0qIFRvIGZpbmQgYXBwbGljYXRpb25zIHVzaW5nIG9sZCBpbmNvbXBhdGlibGUgdmVyc2lvbnMgb2YgZHJpdmVycyBiZWZvcmUKLXVwZ3JhZGluZyBhbmQgd2l0aCBgbm9kZXRvb2wgZW5hYmxlb2xkcHJvdG9jb2x2ZXJzaW9uc2AgYW5kCi1gbm9kZXRvb2wgZGlzYWJsZW9sZHByb3RvY29sdmVyc2lvbnNgIGR1cmluZyB1cGdyYWRlcy4KLSogVG8gaWRlbnRpZnkgY2xpZW50cyBzZW5kaW5nIHRvbyBtYW55IHJlcXVlc3RzLgotKiBUbyBmaW5kIGlmIFNTTCBpcyBlbmFibGVkIGR1cmluZyB0aGUgbWlncmF0aW9uIHRvIGFuZCBmcm9tIHNzbC4KLQotVGhlIHZpcnR1YWwgdGFibGVzIG1heSBiZSBkZXNjcmliZWQgd2l0aCBgREVTQ1JJQkVgIHN0YXRlbWVudC4gVGhlIERETAotbGlzdGVkIGhvd2V2ZXIgY2Fubm90IGJlIHJ1biB0byBjcmVhdGUgYSB2aXJ0dWFsIHRhYmxlLiBBcyBhbiBleGFtcGxlCi1kZXNjcmliZSB0aGUgYHN5c3RlbV92aWV3cy5jbGllbnRzYCB2aXJ0dWFsIHRhYmxlOgotCi0uLi4uCi1jcWxzaD4gREVTQ1JJQkUgVEFCTEUgc3lzdGVtX3ZpZXdzLmNsaWVudHM7Ci0KLS8qCi1XYXJuaW5nOiBUYWJsZSBzeXN0ZW1fdmlld3MuY2xpZW50cyBpcyBhIHZpcnR1YWwgdGFibGUgYW5kIGNhbm5vdCBiZSByZWNyZWF0ZWQgd2l0aCBDUUwuCi1TdHJ1Y3R1cmUsIGZvciByZWZlcmVuY2U6Ci1WSVJUVUFMIFRBQkxFIHN5c3RlbV92aWV3cy5jbGllbnRzICgKLSAgYWRkcmVzcyBpbmV0LAotICBwb3J0IGludCwKLSAgY2xpZW50X29wdGlvbnMgZnJvemVuPG1hcDx0ZXh0LCB0ZXh0Pj4sCi0gIGNvbm5lY3Rpb25fc3RhZ2UgdGV4dCwKLSAgZHJpdmVyX25hbWUgdGV4dCwKLSAgZHJpdmVyX3ZlcnNpb24gdGV4dCwKLSAgaG9zdG5hbWUgdGV4dCwKLSAgcHJvdG9jb2xfdmVyc2lvbiBpbnQsCi0gIHJlcXVlc3RfY291bnQgYmlnaW50LAotICBzc2xfY2lwaGVyX3N1aXRlIHRleHQsCi0gIHNzbF9lbmFibGVkIGJvb2xlYW4sCi0gIHNzbF9wcm90b2NvbCB0ZXh0LAotICB1c2VybmFtZSB0ZXh0LAotICAgIFBSSU1BUlkgS0VZIChhZGRyZXNzLCBwb3J0KQotKSBXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKHBvcnQgQVNDKQotICAgIEFORCBjb21tZW50ID0gJ2N1cnJlbnRseSBjb25uZWN0ZWQgY2xpZW50cyc7Ci0qLwotLi4uLgotCi09PT0gQ2FjaGVzIFZpcnR1YWwgVGFibGUKLQotVGhlIGBjYWNoZXNgIHZpcnR1YWwgdGFibGUgbGlzdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhY2hlcy4gVGhlIGZvdXIKLWNhY2hlcyBwcmVzZW50bHkgY3JlYXRlZCBhcmUgY2h1bmtzLCBjb3VudGVycywga2V5cyBhbmQgcm93cy4gQSBxdWVyeSBvbgotdGhlIGBjYWNoZXNgIHZpcnR1YWwgdGFibGUgcmV0dXJucyB0aGUgZm9sbG93aW5nIGRldGFpbHM6Ci0KLS4uLi4KLWNxbHNoOnN5c3RlbV92aWV3cz4gU0VMRUNUICogRlJPTSBzeXN0ZW1fdmlld3MuY2FjaGVzOwotbmFtZSAgICAgfCBjYXBhY2l0eV9ieXRlcyB8IGVudHJ5X2NvdW50IHwgaGl0X2NvdW50IHwgaGl0X3JhdGlvIHwgcmVjZW50X2hpdF9yYXRlX3Blcl9zZWNvbmQgfCByZWNlbnRfcmVxdWVzdF9yYXRlX3Blcl9zZWNvbmQgfCByZXF1ZXN0X2NvdW50IHwgc2l6ZV9ieXRlcwotLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0KLSAgY2h1bmtzIHwgICAgICAyMjk2MzgxNDQgfCAgICAgICAgICAyOSB8ICAgICAgIDE2NiB8ICAgICAgMC44MyB8ICAgICAgICAgICAgICAgICAgICAgICAgICA1IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2IHwgICAgICAgICAgIDIwMCB8ICAgICA0NzUxMzYKLWNvdW50ZXJzIHwgICAgICAgMjYyMTQ0MDAgfCAgICAgICAgICAgMCB8ICAgICAgICAgMCB8ICAgICAgIE5hTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgIDAKLSAgICBrZXlzIHwgICAgICAgNTI0Mjg4MDAgfCAgICAgICAgICAxNCB8ICAgICAgIDEyNCB8ICAwLjg3MzIzOSB8ICAgICAgICAgICAgICAgICAgICAgICAgICA0IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IHwgICAgICAgICAgIDE0MiB8ICAgICAgIDEyNDgKLSAgICByb3dzIHwgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgMCB8ICAgICAgICAgMCB8ICAgICAgIE5hTiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgIDAKLQotKDQgcm93cykKLS4uLi4KLQotPT09IFNldHRpbmdzIFZpcnR1YWwgVGFibGUKLQotVGhlIGBzZXR0aW5nc2AgdGFibGUgaXMgcmF0aGVyIHVzZWZ1bCBhbmQgbGlzdHMgYWxsIHRoZSBjdXJyZW50Ci1jb25maWd1cmF0aW9uIHNldHRpbmdzIGZyb20gdGhlIGBjYXNzYW5kcmEueWFtbGAuIFRoZSBlbmNyeXB0aW9uIG9wdGlvbnMKLWFyZSBvdmVycmlkZGVuIHRvIGhpZGUgdGhlIHNlbnNpdGl2ZSB0cnVzdHN0b3JlIGluZm9ybWF0aW9uIG9yCi1wYXNzd29yZHMuIFRoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIGhvd2V2ZXIgY2Fubm90IGJlIHNldCB1c2luZyBETUwgb24KLXRoZSB2aXJ0dWFsIHRhYmxlIHByZXNlbnRseTogOgotCi0uLi4uCi1jcWxzaDpzeXN0ZW1fdmlld3M+IFNFTEVDVCAqIEZST00gc3lzdGVtX3ZpZXdzLnNldHRpbmdzOwotCi1uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB2YWx1ZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLQotICBhbGxvY2F0ZV90b2tlbnNfZm9yX2tleXNwYWNlICAgICAgIHwgbnVsbAotICBhdWRpdF9sb2dnaW5nX29wdGlvbnNfZW5hYmxlZCAgICAgIHwgZmFsc2UKLSAgYXV0b19zbmFwc2hvdCAgICAgICAgICAgICAgICAgICAgICB8IHRydWUKLSAgYXV0b21hdGljX3NzdGFibGVfdXBncmFkZSAgICAgICAgICB8IGZhbHNlCi0gIGNsdXN0ZXJfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgfCBUZXN0IENsdXN0ZXIKLSAgZW5hYmxlX3RyYW5zaWVudF9yZXBsaWNhdGlvbiAgICAgICB8IGZhbHNlCi0gIGhpbnRlZF9oYW5kb2ZmX2VuYWJsZWQgICAgICAgICAgICAgfCB0cnVlCi0gIGhpbnRzX2RpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgfCAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvZGF0YS9oaW50cwotICBpbmNyZW1lbnRhbF9iYWNrdXBzICAgICAgICAgICAgICAgIHwgZmFsc2UKLSAgaW5pdGlhbF90b2tlbiAgICAgICAgICAgICAgICAgICAgICB8IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KLSAgcnBjX2FkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICB8IGxvY2FsaG9zdAotICBzc2xfc3RvcmFnZV9wb3J0ICAgICAgICAgICAgICAgICAgIHwgNzAwMQotICBzdGFydF9uYXRpdmVfdHJhbnNwb3J0ICAgICAgICAgICAgIHwgdHJ1ZQotICBzdG9yYWdlX3BvcnQgICAgICAgICAgICAgICAgICAgICAgIHwgNzAwMAotICBzdHJlYW1fZW50aXJlX3NzdGFibGVzICAgICAgICAgICAgIHwgdHJ1ZQotICAoMjI0IHJvd3MpCi0uLi4uCi0KLVRoZSBgc2V0dGluZ3NgIHRhYmxlIGNhbiBiZSByZWFsbHkgdXNlZnVsIGlmIHlhbWwgZmlsZSBoYXMgYmVlbiBjaGFuZ2VkCi1zaW5jZSBzdGFydHVwIGFuZCBkb250IGtub3cgcnVubmluZyBjb25maWd1cmF0aW9uLCBvciB0byBmaW5kIGlmIHRoZXkKLWhhdmUgYmVlbiBtb2RpZmllZCB2aWEgam14L25vZGV0b29sIG9yIHZpcnR1YWwgdGFibGVzLgotCi09PT0gVGhyZWFkIFBvb2xzIFZpcnR1YWwgVGFibGUKLQotVGhlIGB0aHJlYWRfcG9vbHNgIHRhYmxlIGxpc3RzIGluZm9ybWF0aW9uIGFib3V0IGFsbCB0aHJlYWQgcG9vbHMuCi1UaHJlYWQgcG9vbCBpbmZvcm1hdGlvbiBpbmNsdWRlcyBhY3RpdmUgdGFza3MsIGFjdGl2ZSB0YXNrcyBsaW1pdCwKLWJsb2NrZWQgdGFza3MsIGJsb2NrZWQgdGFza3MgYWxsIHRpbWUsIGNvbXBsZXRlZCB0YXNrcywgYW5kIHBlbmRpbmcKLXRhc2tzLiBBIHF1ZXJ5IG9uIHRoZSBgdGhyZWFkX3Bvb2xzYCByZXR1cm5zIGZvbGxvd2luZyBkZXRhaWxzOgotCi0uLi4uCi1jcWxzaDpzeXN0ZW1fdmlld3M+IHNlbGVjdCAqIGZyb20gc3lzdGVtX3ZpZXdzLnRocmVhZF9wb29sczsKLQotbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICB8IGFjdGl2ZV90YXNrcyB8IGFjdGl2ZV90YXNrc19saW1pdCB8IGJsb2NrZWRfdGFza3MgfCBibG9ja2VkX3Rhc2tzX2FsbF90aW1lIHwgY29tcGxldGVkX3Rhc2tzIHwgcGVuZGluZ190YXNrcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgICBBbnRpRW50cm9weVN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICAgICAgIENhY2hlQ2xlYW51cEV4ZWN1dG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICAgICAgICAgQ29tcGFjdGlvbkV4ZWN1dG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICA4ODEgfCAgICAgICAgICAgICAwCi0gICAgICAgIENvdW50ZXJNdXRhdGlvblN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgIDMyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICAgICAgICAgICAgICAgIEdvc3NpcFN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICAgICAgICAgICAgSGludHNEaXNwYXRjaGVyIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICAgICAgSW50ZXJuYWxSZXNwb25zZVN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICAgICAgICBNZW10YWJsZUZsdXNoV3JpdGVyIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwCi0gICAgICAgICAgIE1lbXRhYmxlUG9zdEZsdXNoIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDIgfCAgICAgICAgICAgICAwCi0gICAgICAgTWVtdGFibGVSZWNsYWltTWVtb3J5IHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwCi0gICAgICAgICAgICAgIE1pZ3JhdGlvblN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICAgICAgICAgICAgICAgICAgTWlzY1N0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICAgICAgICAgICAgICBNdXRhdGlvblN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgIDMyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICBOYXRpdmUtVHJhbnNwb3J0LVJlcXVlc3RzIHwgICAgICAgICAgICAxIHwgICAgICAgICAgICAgICAgMTI4IHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAxMzAgfCAgICAgICAgICAgICAwCi0gICAgICBQZW5kaW5nUmFuZ2VDYWxjdWxhdG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwCi1QZXJEaXNrTWVtdGFibGVGbHVzaFdyaXRlcl8wIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDEgfCAgICAgICAgICAgICAwCi0gICAgICAgICAgICAgICAgICAgUmVhZFN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgIDMyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgMTMgfCAgICAgICAgICAgICAwCi0gICAgICAgICAgICAgICAgIFJlcGFpci1UYXNrIHwgICAgICAgICAgICAwIHwgICAgICAgICAyMTQ3NDgzNjQ3IHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICAgICAgIFJlcXVlc3RSZXNwb25zZVN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICAgICAgICAgICAgICAgICAgICBTYW1wbGVyIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICAgU2Vjb25kYXJ5SW5kZXhNYW5hZ2VtZW50IHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICAgICAgICAgVmFsaWRhdGlvbkV4ZWN1dG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAyMTQ3NDgzNjQ3IHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICAgICAgICAgIFZpZXdCdWlsZEV4ZWN1dG9yIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgICAxIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0gICAgICAgICAgIFZpZXdNdXRhdGlvblN0YWdlIHwgICAgICAgICAgICAwIHwgICAgICAgICAgICAgICAgIDMyIHwgICAgICAgICAgICAgMCB8ICAgICAgICAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAgIDAgfCAgICAgICAgICAgICAwCi0uLi4uCi0KLSgyNCByb3dzKQotCi09PT0gSW50ZXJub2RlIEluYm91bmQgTWVzc2FnaW5nIFZpcnR1YWwgVGFibGUKLQotVGhlIGBpbnRlcm5vZGVfaW5ib3VuZGAgdmlydHVhbCB0YWJsZSBpcyBmb3IgdGhlIGludGVybm9kZSBpbmJvdW5kCi1tZXNzYWdpbmcuIEluaXRpYWxseSBubyBpbnRlcm5vZGUgaW5ib3VuZCBtZXNzYWdpbmcgbWF5IGdldCBsaXN0ZWQuIEluCi1hZGRpdGlvbiB0byB0aGUgYWRkcmVzcywgcG9ydCwgZGF0YWNlbnRlciBhbmQgcmFjayBpbmZvcm1hdGlvbiBpbmNsdWRlcwotY29ycnVwdCBmcmFtZXMgcmVjb3ZlcmVkLCBjb3JydXB0IGZyYW1lcyB1bnJlY292ZXJlZCwgZXJyb3IgYnl0ZXMsIGVycm9yCi1jb3VudCwgZXhwaXJlZCBieXRlcywgZXhwaXJlZCBjb3VudCwgcHJvY2Vzc2VkIGJ5dGVzLCBwcm9jZXNzZWQgY291bnQsCi1yZWNlaXZlZCBieXRlcywgcmVjZWl2ZWQgY291bnQsIHNjaGVkdWxlZCBieXRlcywgc2NoZWR1bGVkIGNvdW50LAotdGhyb3R0bGVkIGNvdW50LCB0aHJvdHRsZWQgbmFub3MsIHVzaW5nIGJ5dGVzLCB1c2luZyByZXNlcnZlIGJ5dGVzLiBBCi1xdWVyeSBvbiB0aGUgYGludGVybm9kZV9pbmJvdW5kYCByZXR1cm5zIGZvbGxvd2luZyBkZXRhaWxzOgotCi0uLi4uCi1jcWxzaDpzeXN0ZW1fdmlld3M+IFNFTEVDVCAqIEZST00gc3lzdGVtX3ZpZXdzLmludGVybm9kZV9pbmJvdW5kOwotYWRkcmVzcyB8IHBvcnQgfCBkYyB8IHJhY2sgfCBjb3JydXB0X2ZyYW1lc19yZWNvdmVyZWQgfCBjb3JydXB0X2ZyYW1lc191bnJlY292ZXJlZCB8Ci1lcnJvcl9ieXRlcyB8IGVycm9yX2NvdW50IHwgZXhwaXJlZF9ieXRlcyB8IGV4cGlyZWRfY291bnQgfCBwcm9jZXNzZWRfYnl0ZXMgfAotcHJvY2Vzc2VkX2NvdW50IHwgcmVjZWl2ZWRfYnl0ZXMgfCByZWNlaXZlZF9jb3VudCB8IHNjaGVkdWxlZF9ieXRlcyB8IHNjaGVkdWxlZF9jb3VudCB8IHRocm90dGxlZF9jb3VudCB8IHRocm90dGxlZF9uYW5vcyB8IHVzaW5nX2J5dGVzIHwgdXNpbmdfcmVzZXJ2ZV9ieXRlcwotLS0tLS0tLS0tKy0tLS0tLSstLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0KLS0tLS0tLS0tLS0KLSgwIHJvd3MpCi0uLi4uCi0KLT09PSBTU1RhYmxlcyBUYXNrcyBWaXJ0dWFsIFRhYmxlCi0KLVRoZSBgc3N0YWJsZV90YXNrc2AgY291bGQgYmUgdXNlZCB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgcnVubmluZwotdGFza3MuIEl0IGxpc3RzIGZvbGxvd2luZyBjb2x1bW5zOgotCi0uLi4uCi1jcWxzaDpzeXN0ZW1fdmlld3M+IFNFTEVDVCAqIEZST00gc3N0YWJsZV90YXNrczsKLWtleXNwYWNlX25hbWUgfCB0YWJsZV9uYW1lIHwgdGFza19pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwga2luZCAgICAgICB8IHByb2dyZXNzIHwgdG90YWwgICAgfCB1bml0Ci0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLQotICAgICAgIGJhc2ljIHwgICAgICB3aWRlMiB8IGMzOTA5NzQwLWNkZjctMTFlOS1hOGVkLTBmMDNkZTJkOWFlMSB8IGNvbXBhY3Rpb24gfCA2MDQxODc2MSB8IDcwODgyMTEwIHwgYnl0ZXMKLSAgICAgICBiYXNpYyB8ICAgICAgd2lkZTIgfCBjNzU1Njc3MC1jZGY3LTExZTktYThlZC0wZjAzZGUyZDlhZTEgfCBjb21wYWN0aW9uIHwgIDI5OTU2MjMgfCA0MDMxNDY3OSB8IGJ5dGVzCi0uLi4uCi0KLUFzIGFub3RoZXIgZXhhbXBsZSwgdG8gZmluZCBob3cgbXVjaCB0aW1lIGlzIHJlbWFpbmluZyBmb3IgU1NUYWJsZQotdGFza3MsIHVzZSB0aGUgZm9sbG93aW5nIHF1ZXJ5OgotCi0uLi4uCi1TRUxFQ1QgdG90YWwgLSBwcm9ncmVzcyBBUyByZW1haW5pbmcKLUZST00gc3lzdGVtX3ZpZXdzLnNzdGFibGVfdGFza3M7Ci0uLi4uCi0KLT09PSBPdGhlciBWaXJ0dWFsIFRhYmxlcwotCi1Tb21lIGV4YW1wbGVzIG9mIHVzaW5nIG90aGVyIHZpcnR1YWwgdGFibGVzIGFyZSBhcyBmb2xsb3dzLgotCi1GaW5kIHRhYmxlcyB3aXRoIG1vc3QgZGlzayB1c2FnZToKLQotLi4uLgotY3Fsc2g+IFNFTEVDVCAqIEZST00gZGlza191c2FnZSBXSEVSRSBtZWJpYnl0ZXMgPiAxIEFMTE9XIEZJTFRFUklORzsKLQota2V5c3BhY2VfbmFtZSB8IHRhYmxlX25hbWUgfCBtZWJpYnl0ZXMKLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KLSAgIGtleXNwYWNlMSB8ICBzdGFuZGFyZDEgfCAgICAgICAyODgKLSAgdGxwX3N0cmVzcyB8ICAga2V5dmFsdWUgfCAgICAgIDMyMTEKLS4uLi4KLQotRmluZCBxdWVyaWVzIG9uIHRhYmxlL3Mgd2l0aCBncmVhdGVzdCByZWFkIGxhdGVuY3k6Ci0KLS4uLi4KLWNxbHNoPiBTRUxFQ1QgKiBGUk9NICBsb2NhbF9yZWFkX2xhdGVuY3kgV0hFUkUgcGVyX3NlY29uZCA+IDEgQUxMT1cgRklMVEVSSU5HOwotCi1rZXlzcGFjZV9uYW1lIHwgdGFibGVfbmFtZSB8IHA1MHRoX21zIHwgcDk5dGhfbXMgfCBjb3VudCAgICB8IG1heF9tcyAgfCBwZXJfc2Vjb25kCi0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0KLSAgdGxwX3N0cmVzcyB8ICAga2V5dmFsdWUgfCAgICAwLjA0MyB8ICAgIDAuMTUyIHwgNDk3ODUxNTggfCAxODYuNTYzIHwgIDExNDE4LjM1NgotLi4uLgotCi0KLT09IEV4YW1wbGUKLQotW2FyYWJpYywgc3RhcnQ9MV0KLS4gVG8gbGlzdCB0aGUga2V5c3BhY2VzLCBlbnRlciBgYGNxbHNoYGAgYW5kIHJ1biB0aGUgQ1FMIGNvbW1hbmQgYGBERVNDUklCRSBLRVlTUEFDRVNgYDoKLQotW3NvdXJjZSwgY3FsXQotLS0tLQotY3Fsc2g+IERFU0MgS0VZU1BBQ0VTOwotc3lzdGVtX3NjaGVtYSAgc3lzdGVtICAgICAgICAgIHN5c3RlbV9kaXN0cmlidXRlZCAgc3lzdGVtX3ZpcnR1YWxfc2NoZW1hCi1zeXN0ZW1fYXV0aCAgICBzeXN0ZW1fdHJhY2VzICAgc3lzdGVtX3ZpZXdzCi0tLS0tCi0KLVthcmFiaWMsIHN0YXJ0PTJdCi0uIFRvIHZpZXcgdGhlIHZpcnR1YWwgdGFibGUgc2NoZW1hLCBydW4gdGhlIENRTCBjb21tYW5kcyBgYFVTRSBzeXN0ZW1fdmlydHVhbF9zY2hlbWFgYCBhbmQgYGBTRUxFQ1QgKiBGUk9NIHRhYmxlc2BgOgotCi1bc291cmNlLCBjcWxdCi0tLS0tCi1jcWxzaD4gVVNFIHN5c3RlbV92aXJ0dWFsX3NjaGVtYTsKLWNxbHNoPiBTRUxFQ1QgKiBGUk9NIHRhYmxlczsKLS0tLS0KLSAKLXJlc3VsdHMgaW46Ci0KLVtzb3VyY2UsIGNxbF0KLS0tLS0KLSBrZXlzcGFjZV9uYW1lICAgICAgICAgfCB0YWJsZV9uYW1lICAgICAgICAgICAgICAgIHwgY29tbWVudAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgICAgICAgIGNhY2hlcyB8ICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtIGNhY2hlcwotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgICAgICAgICAgIGNsaWVudHMgfCAgICAgICAgICBjdXJyZW50bHkgY29ubmVjdGVkIGNsaWVudHMKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgY29vcmRpbmF0b3JfcmVhZF9sYXRlbmN5IHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgY29vcmRpbmF0b3Jfc2Nhbl9sYXRlbmN5IHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCBjb29yZGluYXRvcl93cml0ZV9sYXRlbmN5IHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgICBkaXNrX3VzYWdlIHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgIGludGVybm9kZV9pbmJvdW5kIHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgaW50ZXJub2RlX291dGJvdW5kIHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgbG9jYWxfcmVhZF9sYXRlbmN5IHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgbG9jYWxfc2Nhbl9sYXRlbmN5IHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICBsb2NhbF93cml0ZV9sYXRlbmN5IHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgbWF4X3BhcnRpdGlvbl9zaXplIHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICByb3dzX3Blcl9yZWFkIHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgICAgIHNldHRpbmdzIHwgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHNldHRpbmdzCi0gICAgICAgICAgc3lzdGVtX3ZpZXdzIHwgICAgICAgICAgICAgc3N0YWJsZV90YXNrcyB8ICAgICAgICAgICAgICAgIGN1cnJlbnQgc3N0YWJsZSB0YXNrcwotICAgICAgICAgIHN5c3RlbV92aWV3cyB8ICAgICAgICAgc3lzdGVtX3Byb3BlcnRpZXMgfCBDYXNzYW5kcmEgcmVsZXZhbnQgc3lzdGVtIHByb3BlcnRpZXMKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICAgICAgICAgdGhyZWFkX3Bvb2xzIHwKLSAgICAgICAgICBzeXN0ZW1fdmlld3MgfCAgICAgICB0b21ic3RvbmVzX3Blcl9yZWFkIHwKLSBzeXN0ZW1fdmlydHVhbF9zY2hlbWEgfCAgICAgICAgICAgICAgICAgICBjb2x1bW5zIHwgICAgICAgICAgIHZpcnR1YWwgY29sdW1uIGRlZmluaXRpb25zCi0gc3lzdGVtX3ZpcnR1YWxfc2NoZW1hIHwgICAgICAgICAgICAgICAgIGtleXNwYWNlcyB8ICAgICAgICAgdmlydHVhbCBrZXlzcGFjZSBkZWZpbml0aW9ucwotIHN5c3RlbV92aXJ0dWFsX3NjaGVtYSB8ICAgICAgICAgICAgICAgICAgICB0YWJsZXMgfCAgICAgICAgICAgIHZpcnR1YWwgdGFibGUgZGVmaW5pdGlvbnMKLQotKDIxIHJvd3MpCi0tLS0tCi0KLVthcmFiaWMsIHN0YXJ0PTNdCi0uIFRvIHZpZXcgdGhlIHZpcnR1YWwgdGFibGVzLCBydW4gdGhlIENRTCBjb21tYW5kcyBgYFVTRSBzeXN0ZW1fdmlld2BgIGFuZCBgYERFU0NSSUJFIHRhYmxlc2BgOgotCi1bc291cmNlLCBjcWxdCi0tLS0tCi1jcWxzaD4gVVNFIHN5c3RlbV92aWV3OzsKLWNxbHNoPiBERVNDUklCRSB0YWJsZXM7Ci0tLS0tCi0KLXJlc3VsdHMgaW46Ci0KLVtzb3VyY2UsIGNxbF0KLS0tLS0KLXNzdGFibGVfdGFza3MgICAgICAgY2xpZW50cyAgICAgICAgICAgICAgICAgICBjb29yZGluYXRvcl93cml0ZV9sYXRlbmN5Ci1kaXNrX3VzYWdlICAgICAgICAgIGxvY2FsX3dyaXRlX2xhdGVuY3kgICAgICAgdG9tYnN0b25lc19wZXJfcmVhZAotdGhyZWFkX3Bvb2xzICAgICAgICBpbnRlcm5vZGVfb3V0Ym91bmQgICAgICAgIHNldHRpbmdzCi1sb2NhbF9zY2FuX2xhdGVuY3kgIGNvb3JkaW5hdG9yX3NjYW5fbGF0ZW5jeSAgc3lzdGVtX3Byb3BlcnRpZXMKLWludGVybm9kZV9pbmJvdW5kICAgY29vcmRpbmF0b3JfcmVhZF9sYXRlbmN5ICBtYXhfcGFydGl0aW9uX3NpemUKLWxvY2FsX3JlYWRfbGF0ZW5jeSAgcm93c19wZXJfcmVhZCAgICAgICAgICAgICBjYWNoZXMKLS0tLS0KLQotW2FyYWJpYywgc3RhcnQ9NF0KLS4gVG8gbG9vayBhdCBhbnkgdGFibGUgZGF0YSwgcnVuIHRoZSBDUUwgY29tbWFuZCBgYFNFTEVDVGBgOgotCi1bc291cmNlLCBjcWxdCi0tLS0tCi1jcWxzaD4gVVNFIHN5c3RlbV92aWV3OzsKLWNxbHNoPiBTRUxFQ1QgKiBGUk9NIGNsaWVudHMgTElNSVQgMjsKLS0tLS0KLSByZXN1bHRzIGluOgotCi1bc291cmNlLCBjcWxdCi0tLS0tCi0gYWRkcmVzcyAgIHwgcG9ydCAgfCBjb25uZWN0aW9uX3N0YWdlIHwgZHJpdmVyX25hbWUgICAgICAgICAgICB8IGRyaXZlcl92ZXJzaW9uIHwgaG9zdG5hbWUgIHwgcHJvdG9jb2xfdmVyc2lvbiB8IHJlcXVlc3RfY291bnQgfCBzc2xfY2lwaGVyX3N1aXRlIHwgc3NsX2VuYWJsZWQgfCBzc2xfcHJvdG9jb2wgfCB1c2VybmFtZQotLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLQotIDEyNy4wLjAuMSB8IDM3MzA4IHwgICAgICAgICAgICByZWFkeSB8IERhdGFTdGF4IFB5dGhvbiBEcml2ZXIgfCAgIDMuMjEuMC5wb3N0MCB8IGxvY2FsaG9zdCB8ICAgICAgICAgICAgICAgIDQgfCAgICAgICAgICAgIDE3IHwgICAgICAgICAgICAgbnVsbCB8ICAgICAgIEZhbHNlIHwgICAgICAgICBudWxsIHwgYW5vbnltb3VzCi0gMTI3LjAuMC4xIHwgMzczMTAgfCAgICAgICAgICAgIHJlYWR5IHwgRGF0YVN0YXggUHl0aG9uIERyaXZlciB8ICAgMy4yMS4wLnBvc3QwIHwgbG9jYWxob3N0IHwgICAgICAgICAgICAgICAgNCB8ICAgICAgICAgICAgIDggfCAgICAgICAgICAgICBudWxsIHwgICAgICAgRmFsc2UgfCAgICAgICAgIG51bGwgfCBhbm9ueW1vdXMKLQotKDIgcm93cykKLS0tLS0KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vdmVydmlldy9mYXEvaW5kZXguYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vdmVydmlldy9mYXEvaW5kZXguYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzQ1ZTEzOAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vdmVydmlldy9mYXEvaW5kZXguYWRvYwpAQCAtMCwwICsxLDI3NSBAQAorPSBGcmVxdWVudGx5IEFza2VkIFF1ZXN0aW9ucworCitbW3doeS1jYW50LWxpc3QtYWxsXV0KKz09IFdoeSBjYW4ndCBJIHNldCBgbGlzdGVuX2FkZHJlc3NgIHRvIGxpc3RlbiBvbiAwLjAuMC4wIChhbGwgbXkgYWRkcmVzc2VzKT8KKworQ2Fzc2FuZHJhIGlzIGEgZ29zc2lwLWJhc2VkIGRpc3RyaWJ1dGVkIHN5c3RlbSBhbmQgYGxpc3Rlbl9hZGRyZXNzYCBpcwordGhlIGFkZHJlc3MgYSBub2RlIHRlbGxzIG90aGVyIG5vZGVzIHRvIHJlYWNoIGl0IGF0LiBUZWxsaW5nIG90aGVyIG5vZGVzCisiY29udGFjdCBtZSBvbiBhbnkgb2YgbXkgYWRkcmVzc2VzIiBpcyBhIGJhZCBpZGVhOyBpZiBkaWZmZXJlbnQgbm9kZXMgaW4KK3RoZSBjbHVzdGVyIHBpY2sgZGlmZmVyZW50IGFkZHJlc3NlcyBmb3IgeW91LCBCYWQgVGhpbmdzIGhhcHBlbi4KKworSWYgeW91IGRvbid0IHdhbnQgdG8gbWFudWFsbHkgc3BlY2lmeSBhbiBJUCB0byBgbGlzdGVuX2FkZHJlc3NgIGZvciBlYWNoCitub2RlIGluIHlvdXIgY2x1c3RlciAodW5kZXJzdGFuZGFibGUhKSwgbGVhdmUgaXQgYmxhbmsgYW5kIENhc3NhbmRyYQord2lsbCB1c2UgYEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpYCB0byBwaWNrIGFuIGFkZHJlc3MuIFRoZW4gaXQncyB1cAordG8geW91IG9yIHlvdXIgb3BzIHRlYW0gdG8gbWFrZSB0aGluZ3MgcmVzb2x2ZSBjb3JyZWN0bHkgKGAvZXRjL2hvc3RzL2AsCitkbnMsIGV0YykuCisKK09uZSBleGNlcHRpb24gdG8gdGhpcyBwcm9jZXNzIGlzIEpNWCwgd2hpY2ggYnkgZGVmYXVsdCBiaW5kcyB0byAwLjAuMC4wCisoSmF2YSBidWcgNjQyNTc2OSkuCisKK1NlZSBgMjU2YCBhbmQgYDQzYCBmb3IgbW9yZSBnb3J5IGRldGFpbHMuCisKK1tbd2hhdC1wb3J0c11dCis9PSBXaGF0IHBvcnRzIGRvZXMgQ2Fzc2FuZHJhIHVzZT8KKworQnkgZGVmYXVsdCwgQ2Fzc2FuZHJhIHVzZXMgNzAwMCBmb3IgY2x1c3RlciBjb21tdW5pY2F0aW9uICg3MDAxIGlmIFNTTAoraXMgZW5hYmxlZCksIDkwNDIgZm9yIG5hdGl2ZSBwcm90b2NvbCBjbGllbnRzLCBhbmQgNzE5OSBmb3IgSk1YLiBUaGUKK2ludGVybm9kZSBjb21tdW5pY2F0aW9uIGFuZCBuYXRpdmUgcHJvdG9jb2wgcG9ydHMgYXJlIGNvbmZpZ3VyYWJsZSBpbgordGhlIGBjYXNzYW5kcmEteWFtbGAuIFRoZSBKTVggcG9ydCBpcyBjb25maWd1cmFibGUgaW4gYGNhc3NhbmRyYS1lbnYuc2hgCisodGhyb3VnaCBKVk0gb3B0aW9ucykuIEFsbCBwb3J0cyBhcmUgVENQLgorCitbW3doYXQtaGFwcGVucy1vbi1qb2luc11dCis9PSBXaGF0IGhhcHBlbnMgdG8gZXhpc3RpbmcgZGF0YSBpbiBteSBjbHVzdGVyIHdoZW4gSSBhZGQgbmV3IG5vZGVzPworCitXaGVuIGEgbmV3IG5vZGVzIGpvaW5zIGEgY2x1c3RlciwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGNvbnRhY3QgdGhlCitvdGhlciBub2RlcyBpbiB0aGUgY2x1c3RlciBhbmQgY29weSB0aGUgcmlnaHQgZGF0YSB0byBpdHNlbGYuIFNlZQorYHRvcG9sb2d5LWNoYW5nZXNgLgorCitbW2FzeW5jaC1kZWxldGVzXV0KKz09IEkgZGVsZXRlIGRhdGEgZnJvbSBDYXNzYW5kcmEsIGJ1dCBkaXNrIHVzYWdlIHN0YXlzIHRoZSBzYW1lLiBXaGF0IGdpdmVzPworCitEYXRhIHlvdSB3cml0ZSB0byBDYXNzYW5kcmEgZ2V0cyBwZXJzaXN0ZWQgdG8gU1NUYWJsZXMuIFNpbmNlIFNTVGFibGVzCithcmUgaW1tdXRhYmxlLCB0aGUgZGF0YSBjYW4ndCBhY3R1YWxseSBiZSByZW1vdmVkIHdoZW4geW91IHBlcmZvcm0gYQorZGVsZXRlLCBpbnN0ZWFkLCBhIG1hcmtlciAoYWxzbyBjYWxsZWQgYSAidG9tYnN0b25lIikgaXMgd3JpdHRlbiB0bworaW5kaWNhdGUgdGhlIHZhbHVlJ3MgbmV3IHN0YXR1cy4gTmV2ZXIgZmVhciB0aG91Z2gsIG9uIHRoZSBmaXJzdAorY29tcGFjdGlvbiB0aGF0IG9jY3VycyBiZXR3ZWVuIHRoZSBkYXRhIGFuZCB0aGUgdG9tYnN0b25lLCB0aGUgZGF0YSB3aWxsCitiZSBleHB1bmdlZCBjb21wbGV0ZWx5IGFuZCB0aGUgY29ycmVzcG9uZGluZyBkaXNrIHNwYWNlIHJlY292ZXJlZC4gU2VlCitgY29tcGFjdGlvbmAgZm9yIG1vcmUgZGV0YWlsLgorCitbW29uZS1lbnRyeS1yaW5nXV0KKz09IFdoeSBkb2VzIG5vZGV0b29sIHJpbmcgb25seSBzaG93IG9uZSBlbnRyeSwgZXZlbiB0aG91Z2ggbXkgbm9kZXMgbG9nZ2VkIHRoYXQgdGhleSBzZWUgZWFjaCBvdGhlciBqb2luaW5nIHRoZSByaW5nPworCitUaGlzIGhhcHBlbnMgd2hlbiB5b3UgaGF2ZSB0aGUgc2FtZSB0b2tlbiBhc3NpZ25lZCB0byBlYWNoIG5vZGUuIERvbid0CitkbyB0aGF0LgorCitNb3N0IG9mdGVuIHRoaXMgYml0ZXMgcGVvcGxlIHdobyBkZXBsb3kgYnkgaW5zdGFsbGluZyBDYXNzYW5kcmEgb24gYSBWTQorKGVzcGVjaWFsbHkgd2hlbiB1c2luZyB0aGUgRGViaWFuIHBhY2thZ2UsIHdoaWNoIGF1dG8tc3RhcnRzIENhc3NhbmRyYQorYWZ0ZXIgaW5zdGFsbGF0aW9uLCB0aHVzIGdlbmVyYXRpbmcgYW5kIHNhdmluZyBhIHRva2VuKSwgdGhlbiBjbG9uaW5nCit0aGF0IFZNIHRvIG90aGVyIG5vZGVzLgorCitUaGUgZWFzaWVzdCBmaXggaXMgdG8gd2lwZSB0aGUgZGF0YSBhbmQgY29tbWl0bG9nIGRpcmVjdG9yaWVzLCB0aHVzCittYWtpbmcgc3VyZSB0aGF0IGVhY2ggbm9kZSB3aWxsIGdlbmVyYXRlIGEgcmFuZG9tIHRva2VuIG9uIHRoZSBuZXh0CityZXN0YXJ0LgorCitbW2NoYW5nZS1yZXBsaWNhdGlvbi1mYWN0b3JdXQorPT0gQ2FuIEkgY2hhbmdlIHRoZSByZXBsaWNhdGlvbiBmYWN0b3IgKGEgYSBrZXlzcGFjZSkgb24gYSBsaXZlIGNsdXN0ZXI/CisKK1llcywgYnV0IGl0IHdpbGwgcmVxdWlyZSBydW5uaW5nIGEgZnVsbCByZXBhaXIgKG9yIGNsZWFudXApIHRvIGNoYW5nZQordGhlIHJlcGxpY2EgY291bnQgb2YgZXhpc3RpbmcgZGF0YToKKworKiBgQWx0ZXIgPGFsdGVyLWtleXNwYWNlLXN0YXRlbWVudD5gIHRoZSByZXBsaWNhdGlvbiBmYWN0b3IgZm9yIGRlc2lyZWQKK2tleXNwYWNlICh1c2luZyBjcWxzaCBmb3IgaW5zdGFuY2UpLgorKiBJZiB5b3UncmUgcmVkdWNpbmcgdGhlIHJlcGxpY2F0aW9uIGZhY3RvciwgcnVuIGBub2RldG9vbCBjbGVhbnVwYCBvbgordGhlIGNsdXN0ZXIgdG8gcmVtb3ZlIHN1cnBsdXMgcmVwbGljYXRlZCBkYXRhLiBDbGVhbnVwIHJ1bnMgb24gYQorcGVyLW5vZGUgYmFzaXMuCisqIElmIHlvdSdyZSBpbmNyZWFzaW5nIHRoZSByZXBsaWNhdGlvbiBmYWN0b3IsIHJ1bgorYG5vZGV0b29sIHJlcGFpciAtZnVsbGAgdG8gZW5zdXJlIGRhdGEgaXMgcmVwbGljYXRlZCBhY2NvcmRpbmcgdG8gdGhlCituZXcgY29uZmlndXJhdGlvbi4gUmVwYWlyIHJ1bnMgb24gYSBwZXItcmVwbGljYSBzZXQgYmFzaXMuIFRoaXMgaXMgYW4KK2ludGVuc2l2ZSBwcm9jZXNzIHRoYXQgbWF5IHJlc3VsdCBpbiBhZHZlcnNlIGNsdXN0ZXIgcGVyZm9ybWFuY2UuIEl0J3MKK2hpZ2hseSByZWNvbW1lbmRlZCB0byBkbyByb2xsaW5nIHJlcGFpcnMsIGFzIGFuIGF0dGVtcHQgdG8gcmVwYWlyIHRoZQorZW50aXJlIGNsdXN0ZXIgYXQgb25jZSB3aWxsIG1vc3QgbGlrZWx5IHN3YW1wIGl0LiBOb3RlIHRoYXQgeW91IHdpbGwKK25lZWQgdG8gcnVuIGEgZnVsbCByZXBhaXIgKGAtZnVsbGApIHRvIG1ha2Ugc3VyZSB0aGF0IGFscmVhZHkgcmVwYWlyZWQKK3NzdGFibGVzIGFyZSBub3Qgc2tpcHBlZC4gWW91IHNob3VsZCB1c2UgYENvbnNpc3RlbmN5TGV2ZWwuUVVPUlVNYCBvcgorYEFMTGAgKGRlcGVuZGluZyBvbiB5b3VyIGV4aXN0aW5nIHJlcGxpY2F0aW9uIGZhY3RvcikgdG8gbWFrZSBzdXJlIHRoYXQKK2EgcmVwbGljYSB0aGF0IGFjdHVhbGx5IGhhcyB0aGUgZGF0YSBpcyBjb25zdWx0ZWQuIE90aGVyd2lzZSBzb21lCitjbGllbnRzIHBvdGVudGlhbGx5IGJlaW5nIHRvbGQgbm8gZGF0YSBleGlzdHMgdW50aWwgcmVwYWlyIGlzIGRvbmUuCisKK1tbY2FuLWxhcmdlLWJsb2JdXQorPT0gQ2FuIEkgU3RvcmUgKGxhcmdlKSBCTE9CcyBpbiBDYXNzYW5kcmE/CisKK0Nhc3NhbmRyYSBpc24ndCBvcHRpbWl6ZWQgZm9yIGxhcmdlIGZpbGUgb3IgQkxPQiBzdG9yYWdlIGFuZCBhIHNpbmdsZQorYGJsb2JgIHZhbHVlIGlzIGFsd2F5cyByZWFkIGFuZCBzZW5kIHRvIHRoZSBjbGllbnQgZW50aXJlbHkuIEFzIHN1Y2gsCitzdG9yaW5nIHNtYWxsIGJsb2JzIChsZXNzIHRoYW4gc2luZ2xlIGRpZ2l0IE1CKSBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSwKK2J1dCBpdCBpcyBhZHZpc2VkIHRvIG1hbnVhbGx5IHNwbGl0IGxhcmdlIGJsb2JzIGludG8gc21hbGxlciBjaHVua3MuCisKK1BsZWFzZSBub3RlIGluIHBhcnRpY3VsYXIgdGhhdCBieSBkZWZhdWx0LCBhbnkgdmFsdWUgZ3JlYXRlciB0aGFuIDE2TWlCCit3aWxsIGJlIHJlamVjdGVkIGJ5IENhc3NhbmRyYSBkdWUgdGhlIGBtYXhfbXV0YXRpb25fc2l6ZWAKK2NvbmZpZ3VyYXRpb24gb2YgdGhlIGBjYXNzYW5kcmEteWFtbGAgZmlsZSAod2hpY2ggZGVmYXVsdCB0byBoYWxmIG9mCitgY29tbWl0bG9nX3NlZ21lbnRfc2l6ZWAsIHdoaWNoIGl0c2VsZiBkZWZhdWx0IHRvIDMyTWlCKS4KKworW1tub2RldG9vbC1jb25uZWN0aW9uLXJlZnVzZWRdXQorPT0gTm9kZXRvb2wgc2F5cyAiQ29ubmVjdGlvbiByZWZ1c2VkIHRvIGhvc3Q6IDEyNy4wLjEuMSIgZm9yIGFueSByZW1vdGUgaG9zdC4gV2hhdCBnaXZlcz8KKworTm9kZXRvb2wgcmVsaWVzIG9uIEpNWCwgd2hpY2ggaW4gdHVybiByZWxpZXMgb24gUk1JLCB3aGljaCBpbiB0dXJuIHNldHMKK3VwIGl0cyBvd24gbGlzdGVuZXJzIGFuZCBjb25uZWN0b3JzIGFzIG5lZWRlZCBvbiBlYWNoIGVuZCBvZiB0aGUKK2V4Y2hhbmdlLiBOb3JtYWxseSBhbGwgb2YgdGhpcyBoYXBwZW5zIGJlaGluZCB0aGUgc2NlbmVzIHRyYW5zcGFyZW50bHksCitidXQgaW5jb3JyZWN0IG5hbWUgcmVzb2x1dGlvbiBmb3IgZWl0aGVyIHRoZSBob3N0IGNvbm5lY3RpbmcsIG9yIHRoZSBvbmUKK2JlaW5nIGNvbm5lY3RlZCB0bywgY2FuIHJlc3VsdCBpbiBjcm9zc2VkIHdpcmVzIGFuZCBjb25mdXNpbmcKK2V4Y2VwdGlvbnMuCisKK0lmIHlvdSBhcmUgbm90IHVzaW5nIEROUywgdGhlbiBtYWtlIHN1cmUgdGhhdCB5b3VyIGAvZXRjL2hvc3RzYCBmaWxlcworYXJlIGFjY3VyYXRlIG9uIGJvdGggZW5kcy4gSWYgdGhhdCBmYWlscywgdHJ5IHNldHRpbmcgdGhlCitgLURqYXZhLnJtaS5zZXJ2ZXIuaG9zdG5hbWU9PHB1YmxpYyBuYW1lPmAgSlZNIG9wdGlvbiBuZWFyIHRoZSBib3R0b20gb2YKK2BjYXNzYW5kcmEtZW52LnNoYCB0byBhbiBpbnRlcmZhY2UgdGhhdCB5b3UgY2FuIHJlYWNoIGZyb20gdGhlIHJlbW90ZQorbWFjaGluZS4KKworW1t0by1iYXRjaC1vci1ub3QtdG8tYmF0Y2hdXQorPT0gV2lsbCBiYXRjaGluZyBteSBvcGVyYXRpb25zIHNwZWVkIHVwIG15IGJ1bGsgbG9hZD8KKworTm8uIFVzaW5nIGJhdGNoZXMgdG8gbG9hZCBkYXRhIHdpbGwgZ2VuZXJhbGx5IGp1c3QgYWRkICJzcGlrZXMiIG9mCitsYXRlbmN5LiBVc2UgYXN5bmNocm9ub3VzIElOU0VSVHMgaW5zdGVhZCwgb3IgdXNlIHRydWUgYGJ1bGstbG9hZGluZ2AuCisKK0FuIGV4Y2VwdGlvbiBpcyBiYXRjaGluZyB1cGRhdGVzIHRvIGEgc2luZ2xlIHBhcnRpdGlvbiwgd2hpY2ggY2FuIGJlIGEKK0dvb2QgVGhpbmcgKGFzIGxvbmcgYXMgdGhlIHNpemUgb2YgYSBzaW5nbGUgYmF0Y2ggc3RheSByZWFzb25hYmxlKS4gQnV0CituZXZlciBldmVyIGJsaW5kbHkgYmF0Y2ggZXZlcnl0aGluZyEKKworW1tzZWxpbnV4XV0KKz09IE9uIFJIRUwgbm9kZXMgYXJlIHVuYWJsZSB0byBqb2luIHRoZSByaW5nCisKK0NoZWNrIGlmIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NlY3VyaXR5LUVuaGFuY2VkX0xpbnV4W1NFTGludXhdCitpcyBvbjsgaWYgaXQgaXMsIHR1cm4gaXQgb2ZmLgorCitbW2hvdy10by11bnN1YnNjcmliZV1dCis9PSBIb3cgZG8gSSB1bnN1YnNjcmliZSBmcm9tIHRoZSBlbWFpbCBsaXN0PworCitTZW5kIGFuIGVtYWlsIHRvIGB1c2VyLXVuc3Vic2NyaWJlQGNhc3NhbmRyYS5hcGFjaGUub3JnYC4KKworW1tjYXNzYW5kcmEtZWF0cy1hbGwtbXktbWVtb3J5XV0KKz09IFdoeSBkb2VzIHRvcCByZXBvcnQgdGhhdCBDYXNzYW5kcmEgaXMgdXNpbmcgYSBsb3QgbW9yZSBtZW1vcnkgdGhhbiB0aGUgSmF2YSBoZWFwIG1heD8KKworQ2Fzc2FuZHJhIHVzZXMgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTWVtb3J5LW1hcHBlZF9maWxlW01lbW9yeQorTWFwcGVkIEZpbGVzXSAobW1hcCkgaW50ZXJuYWxseS4gVGhhdCBpcywgd2UgdXNlIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MKK3ZpcnR1YWwgbWVtb3J5IHN5c3RlbSB0byBtYXAgYSBudW1iZXIgb2Ygb24tZGlzayBmaWxlcyBpbnRvIHRoZQorQ2Fzc2FuZHJhIHByb2Nlc3MnIGFkZHJlc3Mgc3BhY2UuIFRoaXMgd2lsbCAidXNlIiB2aXJ0dWFsIG1lbW9yeTsgaS5lLgorYWRkcmVzcyBzcGFjZSwgYW5kIHdpbGwgYmUgcmVwb3J0ZWQgYnkgdG9vbHMgbGlrZSB0b3AgYWNjb3JkaW5nbHksIGJ1dAorb24gNjQgYml0IHN5c3RlbXMgdmlydHVhbCBhZGRyZXNzIHNwYWNlIGlzIGVmZmVjdGl2ZWx5IHVubGltaXRlZCBzbyB5b3UKK3Nob3VsZCBub3Qgd29ycnkgYWJvdXQgdGhhdC4KKworV2hhdCBtYXR0ZXJzIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mICJtZW1vcnkgdXNlIiBpbiB0aGUgc2Vuc2UgYXMgaXQgaXMKK25vcm1hbGx5IG1lYW50LCBpcyB0aGUgYW1vdW50IG9mIGRhdGEgYWxsb2NhdGVkIG9uIGJyaygpIG9yIG1tYXAnZAorL2Rldi96ZXJvLCB3aGljaCByZXByZXNlbnQgcmVhbCBtZW1vcnkgdXNlZC4gVGhlIGtleSBpc3N1ZSBpcyB0aGF0IGZvciBhCittbWFwJ2QgZmlsZSwgdGhlcmUgaXMgbmV2ZXIgYSBuZWVkIHRvIHJldGFpbiB0aGUgZGF0YSByZXNpZGVudCBpbgorcGh5c2ljYWwgbWVtb3J5LiBUaHVzLCB3aGF0ZXZlciB5b3UgZG8ga2VlcCByZXNpZGVudCBpbiBwaHlzaWNhbCBtZW1vcnkKK2lzIGVzc2VudGlhbGx5IGp1c3QgdGhlcmUgYXMgYSBjYWNoZSwgaW4gdGhlIHNhbWUgd2F5IGFzIG5vcm1hbCBJL08gd2lsbAorY2F1c2UgdGhlIGtlcm5lbCBwYWdlIGNhY2hlIHRvIHJldGFpbiBkYXRhIHRoYXQgeW91IHJlYWQvd3JpdGUuCisKK1RoZSBkaWZmZXJlbmNlIGJldHdlZW4gbm9ybWFsIEkvTyBhbmQgbW1hcCgpIGlzIHRoYXQgaW4gdGhlIG1tYXAoKSBjYXNlCit0aGUgbWVtb3J5IGlzIGFjdHVhbGx5IG1hcHBlZCB0byB0aGUgcHJvY2VzcywgdGh1cyBhZmZlY3RpbmcgdGhlIHZpcnR1YWwKK3NpemUgYXMgcmVwb3J0ZWQgYnkgdG9wLiBUaGUgbWFpbiBhcmd1bWVudCBmb3IgdXNpbmcgbW1hcCgpIGluc3RlYWQgb2YKK3N0YW5kYXJkIEkvTyBpcyB0aGUgZmFjdCB0aGF0IHJlYWRpbmcgZW50YWlscyBqdXN0IHRvdWNoaW5nIG1lbW9yeSAtIGluCit0aGUgY2FzZSBvZiB0aGUgbWVtb3J5IGJlaW5nIHJlc2lkZW50LCB5b3UganVzdCByZWFkIGl0IC0geW91IGRvbid0IGV2ZW4KK3Rha2UgYSBwYWdlIGZhdWx0IChzbyBubyBvdmVyaGVhZCBpbiBlbnRlcmluZyB0aGUga2VybmVsIGFuZCBkb2luZyBhCitzZW1pLWNvbnRleHQgc3dpdGNoKS4gVGhpcyBpcyBjb3ZlcmVkIGluIG1vcmUgZGV0YWlsCitodHRwOi8vd3d3LnZhcm5pc2gtY2FjaGUub3JnL3RyYWMvd2lraS9BcmNoaXRlY3ROb3Rlc1toZXJlXS4KKworPT0gV2hhdCBhcmUgc2VlZHM/CisKK1NlZWRzIGFyZSB1c2VkIGR1cmluZyBzdGFydHVwIHRvIGRpc2NvdmVyIHRoZSBjbHVzdGVyLgorCitJZiB5b3UgY29uZmlndXJlIHlvdXIgbm9kZXMgdG8gcmVmZXIgc29tZSBub2RlIGFzIHNlZWQsIG5vZGVzIGluIHlvdXIKK3JpbmcgdGVuZCB0byBzZW5kIEdvc3NpcCBtZXNzYWdlIHRvIHNlZWRzIG1vcmUgb2Z0ZW4gKGFsc28gc2VlIHRoZQorYHNlY3Rpb24gb24gZ29zc2lwIDxnb3NzaXA+YCkgdGhhbiB0byBub24tc2VlZHMuIEluIG90aGVyIHdvcmRzLCBzZWVkcworYXJlIHdvcmtlZCBhcyBodWJzIG9mIEdvc3NpcCBuZXR3b3JrLiBXaXRoIHNlZWRzLCBlYWNoIG5vZGUgY2FuIGRldGVjdAorc3RhdHVzIGNoYW5nZXMgb2Ygb3RoZXIgbm9kZXMgcXVpY2tseS4KKworU2VlZHMgYXJlIGFsc28gcmVmZXJyZWQgYnkgbmV3IG5vZGVzIG9uIGJvb3RzdHJhcCB0byBsZWFybiBvdGhlciBub2RlcworaW4gcmluZy4gV2hlbiB5b3UgYWRkIGEgbmV3IG5vZGUgdG8gcmluZywgeW91IG5lZWQgdG8gc3BlY2lmeSBhdCBsZWFzdAorb25lIGxpdmUgc2VlZCB0byBjb250YWN0LiBPbmNlIGEgbm9kZSBqb2luIHRoZSByaW5nLCBpdCBsZWFybnMgYWJvdXQgdGhlCitvdGhlciBub2Rlcywgc28gaXQgZG9lc24ndCBuZWVkIHNlZWQgb24gc3Vic2VxdWVudCBib290LgorCitZb3UgY2FuIG1ha2UgYSBzZWVkIGEgbm9kZSBhdCBhbnkgdGltZS4gVGhlcmUgaXMgbm90aGluZyBzcGVjaWFsIGFib3V0CitzZWVkIG5vZGVzLiBJZiB5b3UgbGlzdCB0aGUgbm9kZSBpbiBzZWVkIGxpc3QgaXQgaXMgYSBzZWVkCisKK1NlZWRzIGRvIG5vdCBhdXRvIGJvb3RzdHJhcCAoaS5lLiBpZiBhIG5vZGUgaGFzIGl0c2VsZiBpbiBpdHMgc2VlZCBsaXN0CitpdCB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IHRyYW5zZmVyIGRhdGEgdG8gaXRzZWxmKSBJZiB5b3Ugd2FudCBhIG5vZGUgdG8KK2RvIHRoYXQsIGJvb3RzdHJhcCBpdCBmaXJzdCBhbmQgdGhlbiBhZGQgaXQgdG8gc2VlZHMgbGF0ZXIuIElmIHlvdSBoYXZlCitubyBkYXRhIChuZXcgaW5zdGFsbCkgeW91IGRvIG5vdCBoYXZlIHRvIHdvcnJ5IGFib3V0IGJvb3RzdHJhcCBhdCBhbGwuCisKK1JlY29tbWVuZGVkIHVzYWdlIG9mIHNlZWRzOgorCisqIHBpY2sgdHdvIChvciBtb3JlKSBub2RlcyBwZXIgZGF0YSBjZW50ZXIgYXMgc2VlZCBub2Rlcy4KKyogc3luYyB0aGUgc2VlZCBsaXN0IHRvIGFsbCB5b3VyIG5vZGVzCisKK1tbYXJlLXNlZWRzLVNQT0ZdXQorPT0gRG9lcyBzaW5nbGUgc2VlZCBtZWFuIHNpbmdsZSBwb2ludCBvZiBmYWlsdXJlPworCitUaGUgcmluZyBjYW4gb3BlcmF0ZSBvciBib290IHdpdGhvdXQgYSBzZWVkOyBob3dldmVyLCB5b3Ugd2lsbCBub3QgYmUKK2FibGUgdG8gYWRkIG5ldyBub2RlcyB0byB0aGUgY2x1c3Rlci4gSXQgaXMgcmVjb21tZW5kZWQgdG8gY29uZmlndXJlCittdWx0aXBsZSBzZWVkcyBpbiBwcm9kdWN0aW9uIHN5c3RlbS4KKworW1tjYW50LWNhbGwtam14LW1ldGhvZF1dCis9PSBXaHkgY2FuJ3QgSSBjYWxsIGpteCBtZXRob2QgWCBvbiBqY29uc29sZT8KKworU29tZSBvZiBKTVggb3BlcmF0aW9ucyB1c2UgYXJyYXkgYXJndW1lbnQgYW5kIGFzIGpjb25zb2xlIGRvZXNuJ3QKK3N1cHBvcnQgYXJyYXkgYXJndW1lbnQsIHRob3NlIG9wZXJhdGlvbnMgY2FuJ3QgYmUgY2FsbGVkIHdpdGggamNvbnNvbGUKKyh0aGUgYnV0dG9ucyBhcmUgaW5hY3RpdmUgZm9yIHRoZW0pLiBZb3UgbmVlZCB0byB3cml0ZSBhIEpNWCBjbGllbnQgdG8KK2NhbGwgc3VjaCBvcGVyYXRpb25zIG9yIG5lZWQgYXJyYXktY2FwYWJsZSBKTVggbW9uaXRvcmluZyB0b29sLgorCitbW3doeS1tZXNzYWdlLWRyb3BwZWRdXQorPT0gV2h5IGRvIEkgc2VlICIuLi4gbWVzc2FnZXMgZHJvcHBlZCAuLi4iIGluIHRoZSBsb2dzPworCitUaGlzIGlzIGEgc3ltcHRvbSBvZiBsb2FkIHNoZWRkaW5nIC0tIENhc3NhbmRyYSBkZWZlbmRpbmcgaXRzZWxmIGFnYWluc3QKK21vcmUgcmVxdWVzdHMgdGhhbiBpdCBjYW4gaGFuZGxlLgorCitJbnRlcm5vZGUgbWVzc2FnZXMgd2hpY2ggYXJlIHJlY2VpdmVkIGJ5IGEgbm9kZSwgYnV0IGRvIG5vdCBnZXQgbm90IHRvCitiZSBwcm9jZXNzZWQgd2l0aGluIHRoZWlyIHByb3BlciB0aW1lb3V0IChzZWUgYHJlYWRfcmVxdWVzdF90aW1lb3V0YCwKK2B3cml0ZV9yZXF1ZXN0X3RpbWVvdXRgLCAuLi4gaW4gdGhlIGBjYXNzYW5kcmEteWFtbGApLCBhcmUgZHJvcHBlZAorcmF0aGVyIHRoYW4gcHJvY2Vzc2VkIChzaW5jZSB0aGUgYXMgdGhlIGNvb3JkaW5hdG9yIG5vZGUgd2lsbCBubyBsb25nZXIKK2JlIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UpLgorCitGb3Igd3JpdGVzLCB0aGlzIG1lYW5zIHRoYXQgdGhlIG11dGF0aW9uIHdhcyBub3QgYXBwbGllZCB0byBhbGwgcmVwbGljYXMKK2l0IHdhcyBzZW50IHRvLiBUaGUgaW5jb25zaXN0ZW5jeSB3aWxsIGJlIHJlcGFpcmVkIGJ5IHJlYWQgcmVwYWlyLCBoaW50cworb3IgYSBtYW51YWwgcmVwYWlyLiBUaGUgd3JpdGUgb3BlcmF0aW9uIG1heSBhbHNvIGhhdmUgdGltZW91dGVkIGFzIGEKK3Jlc3VsdC4KKworRm9yIHJlYWRzLCB0aGlzIG1lYW5zIGEgcmVhZCByZXF1ZXN0IG1heSBub3QgaGF2ZSBjb21wbGV0ZWQuCisKK0xvYWQgc2hlZGRpbmcgaXMgcGFydCBvZiB0aGUgQ2Fzc2FuZHJhIGFyY2hpdGVjdHVyZSwgaWYgdGhpcyBpcyBhCitwZXJzaXN0ZW50IGlzc3VlIGl0IGlzIGdlbmVyYWxseSBhIHNpZ24gb2YgYW4gb3ZlcmxvYWRlZCBub2RlIG9yCitjbHVzdGVyLgorCitbW29vbS1tYXAtZmFpbGVkXV0KKz09IENhc3NhbmRyYSBkaWVzIHdpdGggYGphdmEubGFuZy5PdXRPZk1lbW9yeUVycm9yOiBNYXAgZmFpbGVkYAorCitJZiBDYXNzYW5kcmEgaXMgZHlpbmcgKnNwZWNpZmljYWxseSogd2l0aCB0aGUgIk1hcCBmYWlsZWQiIG1lc3NhZ2UsIGl0CittZWFucyB0aGUgT1MgaXMgZGVueWluZyBqYXZhIHRoZSBhYmlsaXR5IHRvIGxvY2sgbW9yZSBtZW1vcnkuIEluIGxpbnV4LAordGhpcyB0eXBpY2FsbHkgbWVhbnMgbWVtbG9jayBpcyBsaW1pdGVkLiBDaGVjaworYC9wcm9jLzxwaWQgb2YgY2Fzc2FuZHJhPi9saW1pdHNgIHRvIHZlcmlmeSB0aGlzIGFuZCByYWlzZSBpdCAoZWcsIHZpYQordWxpbWl0IGluIGJhc2gpLiBZb3UgbWF5IGFsc28gbmVlZCB0byBpbmNyZWFzZSBgdm0ubWF4X21hcF9jb3VudC5gIE5vdGUKK3RoYXQgdGhlIGRlYmlhbiBwYWNrYWdlIGhhbmRsZXMgdGhpcyBmb3IgeW91IGF1dG9tYXRpY2FsbHkuCisKK1tbd2hhdC1vbi1zYW1lLXRpbWVzdGFtcC11cGRhdGVdXQorPT0gV2hhdCBoYXBwZW5zIGlmIHR3byB1cGRhdGVzIGFyZSBtYWRlIHdpdGggdGhlIHNhbWUgdGltZXN0YW1wPworCitVcGRhdGVzIG11c3QgYmUgY29tbXV0YXRpdmUsIHNpbmNlIHRoZXkgbWF5IGFycml2ZSBpbiBkaWZmZXJlbnQgb3JkZXJzCitvbiBkaWZmZXJlbnQgcmVwbGljYXMuIEFzIGxvbmcgYXMgQ2Fzc2FuZHJhIGhhcyBhIGRldGVybWluaXN0aWMgd2F5IHRvCitwaWNrIHRoZSB3aW5uZXIgKGluIGEgdGltZXN0YW1wIHRpZSksIHRoZSBvbmUgc2VsZWN0ZWQgaXMgYXMgdmFsaWQgYXMKK2FueSBvdGhlciwgYW5kIHRoZSBzcGVjaWZpY3Mgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYW4gaW1wbGVtZW50YXRpb24KK2RldGFpbC4gVGhhdCBzYWlkLCBpbiB0aGUgY2FzZSBvZiBhIHRpbWVzdGFtcCB0aWUsIENhc3NhbmRyYSBmb2xsb3dzIHR3bworcnVsZXM6IGZpcnN0LCBkZWxldGVzIHRha2UgcHJlY2VkZW5jZSBvdmVyIGluc2VydHMvdXBkYXRlcy4gU2Vjb25kLCBpZgordGhlcmUgYXJlIHR3byB1cGRhdGVzLCB0aGUgb25lIHdpdGggdGhlIGxleGljYWxseSBsYXJnZXIgdmFsdWUgaXMKK3NlbGVjdGVkLgorCitbW3doeS1ib290c3RyYXBwaW5nLXN0cmVhbS1lcnJvcl1dCis9PSBXaHkgYm9vdHN0cmFwcGluZyBhIG5ldyBub2RlIGZhaWxzIHdpdGggYSAiU3RyZWFtIGZhaWxlZCIgZXJyb3I/CisKK1R3byBtYWluIHBvc3NpYmlsaXRpZXM6CisKKy4gdGhlIEdDIG1heSBiZSBjcmVhdGluZyBsb25nIHBhdXNlcyBkaXNydXB0aW5nIHRoZSBzdHJlYW1pbmcgcHJvY2VzcworLiBjb21wYWN0aW9ucyBoYXBwZW5pbmcgaW4gdGhlIGJhY2tncm91bmQgaG9sZCBzdHJlYW1pbmcgbG9uZyBlbm91Z2gKK3RoYXQgdGhlIFRDUCBjb25uZWN0aW9uIGZhaWxzCisKK0luIHRoZSBmaXJzdCBjYXNlLCByZWd1bGFyIEdDIHR1bmluZyBhZHZpY2VzIGFwcGx5LiBJbiB0aGUgc2Vjb25kIGNhc2UsCit5b3UgbmVlZCB0byBzZXQgVENQIGtlZXBhbGl2ZSB0byBhIGxvd2VyIHZhbHVlIChkZWZhdWx0IGlzIHZlcnkgaGlnaCBvbgorTGludXgpLiBUcnkgdG8ganVzdCBydW4gdGhlIGZvbGxvd2luZzoKKworLi4uLgorJCBzdWRvIC9zYmluL3N5c2N0bCAtdyBuZXQuaXB2NC50Y3Bfa2VlcGFsaXZlX3RpbWU9NjAgbmV0LmlwdjQudGNwX2tlZXBhbGl2ZV9pbnR2bD02MCBuZXQuaXB2NC50Y3Bfa2VlcGFsaXZlX3Byb2Jlcz01CisuLi4uCisKK1RvIG1ha2UgdGhvc2Ugc2V0dGluZ3MgcGVybWFuZW50LCBhZGQgdGhlbSB0byB5b3VyIGAvZXRjL3N5c2N0bC5jb25mYAorZmlsZS4KKworTm90ZTogaHR0cHM6Ly9jbG91ZC5nb29nbGUuY29tL2NvbXB1dGUvW0dDRV0ncyBmaXJld2FsbCB3aWxsIGFsd2F5cworaW50ZXJydXB0IFRDUCBjb25uZWN0aW9ucyB0aGF0IGFyZSBpbmFjdGl2ZSBmb3IgbW9yZSB0aGFuIDEwIG1pbi4KK1J1bm5pbmcgdGhlIGFib3ZlIGNvbW1hbmQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIGluIHRoYXQgZW52aXJvbm1lbnQuCmRpZmYgLS1naXQgYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3ZlcnZpZXcvdGVybWlub2xvZ3kuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy9vdmVydmlldy90ZXJtaW5vbG9neS5hZG9jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMDAwNTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvb3ZlcnZpZXcvdGVybWlub2xvZ3kuYWRvYwpAQCAtMCwwICsxLDIzIEBACis9IFRlcm1pbm9sb2d5CisKK2EgfCBiIHwgeHJlZjojY1tjXSB8IGQgfCBlIHwgZgorCitbW2NdXQorY2x1c3Rlcjo6CitBIHJpbmcgb2Ygbm9kZXMgdGhhdCBob2xkcyBhIGRhdGFiYXNlLgorCitub2RlOjoKK0EgbWFjaGluZSB0aGF0IGhvbGRzIENhc3NhbmRyYSByZXBsaWNhcy4KK0VhY2ggbm9kZSBob2xkcyBhIHBvcnRpb24gb2YgdGhlIHdob2xlIGRhdGFiYXNlLgorCityZXBsaWNhOjoKK0EgY29weSBvZiBhIHBvcnRpb24gb2YgdGhlIHdob2xlIGRhdGFiYXNlLiBFYWNoIG5vZGUgaG9sZHMgc29tZSByZXBsaWNhcy4KKworcmVwbGljYXRpb246OgorVGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgcmVwbGljYXMgYWNyb3NzIG5vZGVzIGluIGEgY2x1c3Rlci4KKworcmVwbGljYXRpb24gZmFjdG9yIChSRik6OgorQSBzY2FsYXIgdmFsdWUgdGhhdCBzZXRzIHRoZSBudW1iZXIgb2YgcmVwbGljYXMgb2YgZWFjaCBwYXJ0aXRpb24gaW4gYSBjbHVzdGVyLgorRm9yIGV4YW1wbGUsIGFuZCBSRj0zIG1lYW5zIHRoYXQgdGhyZWUgbm9kZXMgaG9sZCBhIHJlcGxpY2Egb2YgZWFjaCBwYXJ0aXRpb24uCisKKwpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3JlZmVyZW5jZXMvamF2YTExLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvcmVmZXJlbmNlcy9qYXZhMTEuYWRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWQ1YzJlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3JlZmVyZW5jZXMvamF2YTExLmFkb2MKQEAgLTAsMCArMSwyMDYgQEAKKz0gU3VwcG9ydCBmb3IgSmF2YSAxMQorCitJbiB0aGUgbmV3IEphdmEgcmVsZWFzZSBjYWRlbmNlIGEgbmV3IEphdmEgdmVyc2lvbiBpcyBtYWRlIGF2YWlsYWJsZQorZXZlcnkgc2l4IG1vbnRocy4gVGhlIG1vcmUgZnJlcXVlbnQgcmVsZWFzZSBjeWNsZSBpcyBmYXZvcmVkIGFzIGl0CiticmluZ3MgbmV3IEphdmEgZmVhdHVyZXMgdG8gdGhlIGRldmVsb3BlcnMgYXMgYW5kIHdoZW4gdGhleSBhcmUKK2RldmVsb3BlZCB3aXRob3V0IHRoZSB3YWl0IHRoYXQgdGhlIGVhcmxpZXIgMyB5ZWFyIHJlbGVhc2UgbW9kZWwKK2luY3VycmVkLiBOb3QgZXZlcnkgSmF2YSB2ZXJzaW9uIGlzIGEgTG9uZyBUZXJtIFN1cHBvcnQgKExUUykgdmVyc2lvbi4KK0FmdGVyIEphdmEgOCB0aGUgbmV4dCBMVFMgdmVyc2lvbiBpcyBKYXZhIDExLiBKYXZhIDksIDEwLCAxMiBhbmQgMTMgYXJlCithbGwgbm9uLUxUUyB2ZXJzaW9ucy4KKworT25lIG9mIHRoZSBvYmplY3RpdmVzIG9mIHRoZSBBcGFjaGUgQ2Fzc2FuZHJhIDQuMCB2ZXJzaW9uIGlzIHRvIHN1cHBvcnQKK3RoZSByZWNlbnQgTFRTIEphdmEgdmVyc2lvbnMgOCBhbmQgMTEKKyhodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS05NjA4W0NBU1NBTkRSQS05NjA4XSkuCitKYXZhIDggYW5kIEphdmEgMTEgbWF5IGJlIHVzZWQgdG8gYnVpbGQgYW5kIHJ1biBBcGFjaGUgQ2Fzc2FuZHJhIDQuMC4gRWZmZWN0aXZlIENhc3NhbmRyYQorNC4wLjIgdGhlcmUgaXMgZnVsbCBKYXZhIDExIHN1cHBvcnQsIGl0IGlzIG5vdCBleHBlcmltZW50YWwgYW55bW9yZS4KKworPT0gU3VwcG9ydCBNYXRyaXgKKworVGhlIHN1cHBvcnQgbWF0cml4IGZvciB0aGUgSmF2YSB2ZXJzaW9ucyBmb3IgY29tcGlsaW5nIGFuZCBydW5uaW5nCitBcGFjaGUgQ2Fzc2FuZHJhIDQuMCBpcyBkZXRhaWxlZCBpbiBUYWJsZSAxLiBUaGUgYnVpbGQgdmVyc2lvbiBpcyBhbG9uZwordGhlIHZlcnRpY2FsIGF4aXMgYW5kIHRoZSBydW4gdmVyc2lvbiBpcyBhbG9uZyB0aGUgaG9yaXpvbnRhbCBheGlzLgorCitUYWJsZSAxIDogU3VwcG9ydCBNYXRyaXggZm9yIEphdmEKKworW3dpZHRoPSI2OCUiLGNvbHM9IjM0JSwzMCUsMzYlIixdCit8PT09Cit8IHxKYXZhIDggKFJ1bikgfEphdmEgMTEgKFJ1bikKK3xKYXZhIDggKEJ1aWxkKSB8U3VwcG9ydGVkIHxTdXBwb3J0ZWQKK3xKYXZhIDExKEJ1aWxkKSB8Tm90IFN1cHBvcnRlZCB8RXhwZXJpbWVudGFsCit8PT09CisKK0FwYWNoZSA0LjAgc291cmNlIGNvZGUgYnVpbHQgd2l0aCBKYXZhIDExIGNhbm5vdCBiZSBydW4gd2l0aAorSmF2YSA4LgorCitBbGwgYmluYXJ5IHJlbGVhc2VzIGFyZSBidWlsdCB3aXRoIEphdmEgOC4KKworTmV4dCwgd2Ugc2hhbGwgZGlzY3VzcyB1c2luZyBlYWNoIG9mIEphdmEgOCBhbmQgMTEgdG8gYnVpbGQgYW5kCitydW4gQXBhY2hlIENhc3NhbmRyYSA0LjAuCisKKz09IFVzaW5nIEphdmEgOCB0byBCdWlsZAorCitUbyBzdGFydCB3aXRoLCBpbnN0YWxsIEphdmEgOC4gQXMgYW4gZXhhbXBsZSwgZm9yIGluc3RhbGxpbmcgSmF2YSA4IG9uCitSZWRIYXQgTGludXggdGhlIGNvbW1hbmQgaXMgYXMgZm9sbG93czoKKworLi4uLgorJCBzdWRvIHl1bSBpbnN0YWxsIGphdmEtMS44LjAtb3Blbmpkay1kZXZlbAorLi4uLgorCitTZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBgSkFWQV9IT01FYCBhbmQgYFBBVEhgLgorCisuLi4uCiskIGV4cG9ydCBKQVZBX0hPTUU9L3Vzci9saWIvanZtL2phdmEtMS44LjAtb3BlbmpkaworJCBleHBvcnQgUEFUSD0kUEFUSDokSkFWQV9IT01FL2JpbjokSlJFX0hPTUUvYmluCisuLi4uCisKK0Rvd25sb2FkIGFuZCBpbnN0YWxsIEFwYWNoZSBDYXNzYW5kcmEgNC4wIHNvdXJjZSBjb2RlIGZyb20gdGhlIEdpdCBhbG9uZword2l0aCB0aGUgZGVwZW5kZW5jaWVzLgorCisuLi4uCiskIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2Nhc3NhbmRyYS5naXQKKy4uLi4KKworSWYgQ2Fzc2FuZHJhIGlzIGFscmVhZHkgcnVubmluZyBzdG9wIENhc3NhbmRyYSB3aXRoIHRoZSBmb2xsb3dpbmcKK2NvbW1hbmQuCisKKy4uLi4KKyQgLi9ub2RldG9vbCBzdG9wZGFlbW9uCisuLi4uCisKK0J1aWxkIHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBgY2Fzc2FuZHJhYCBkaXJlY3RvcnksIHdoaWNoIGhhcyB0aGUKK2BidWlsZC54bWxgIGJ1aWxkIHNjcmlwdC4gVGhlIEFwYWNoZSBBbnQgdXNlcyB0aGUgSmF2YSB2ZXJzaW9uIHNldCBpbgordGhlIGBKQVZBX0hPTUVgIGVudmlyb25tZW50IHZhcmlhYmxlLgorCisuLi4uCiskIGNkIH4vY2Fzc2FuZHJhCiskIGFudAorLi4uLgorCitBcGFjaGUgQ2Fzc2FuZHJhIDQuMCBnZXRzIGJ1aWx0IHdpdGggSmF2YSA4LiBTZXQgdGhlIGVudmlyb25tZW50Cit2YXJpYWJsZSBmb3IgYENBU1NBTkRSQV9IT01FYCBpbiB0aGUgYmFzaCBzY3JpcHQuIEFsc28gYWRkIHRoZQorYENBU1NBTkRSQV9IT01FL2JpbmAgdG8gdGhlIGBQQVRIYCB2YXJpYWJsZS4KKworLi4uLgorJCBleHBvcnQgQ0FTU0FORFJBX0hPTUU9fi9jYXNzYW5kcmEKKyQgZXhwb3J0IFBBVEg9JFBBVEg6JEpBVkFfSE9NRS9iaW46JEpSRV9IT01FL2JpbjokQ0FTU0FORFJBX0hPTUUvYmluCisuLi4uCisKK1RvIHJ1biBBcGFjaGUgQ2Fzc2FuZHJhIDQuMCB3aXRoIGVpdGhlciBvZiBKYXZhIDggb3IgSmF2YSAxMSBydW4gdGhlCitDYXNzYW5kcmEgYXBwbGljYXRpb24gaW4gdGhlIGBDQVNTQU5EUkFfSE9NRS9iaW5gIGRpcmVjdG9yeSwgd2hpY2ggaXMgaW4KK3RoZSBgUEFUSGAgZW52IHZhcmlhYmxlLgorCisuLi4uCiskIGNhc3NhbmRyYQorLi4uLgorCitUaGUgSmF2YSB2ZXJzaW9uIHVzZWQgdG8gcnVuIENhc3NhbmRyYSBnZXRzIG91dHB1dCBhcyBDYXNzYW5kcmEgaXMKK2dldHRpbmcgc3RhcnRlZC4gQXMgYW4gZXhhbXBsZSBpZiBKYXZhIDExIGlzIHVzZWQsIHRoZSBydW4gb3V0cHV0IHNob3VsZAoraW5jbHVkZSBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgb3V0cHV0IHNuaXBwZXQ6CisKKy4uLi4KK0lORk8gIFttYWluXSAyMDE5LTA3LTMxIDIxOjE4OjE2LDg2MiBDYXNzYW5kcmFEYWVtb24uamF2YTo0ODAgLSBIb3N0bmFtZTogaXAtMTcyLTMwLTMtIAorMTQ2LmVjMi5pbnRlcm5hbDo3MDAwOjcwMDEKK0lORk8gIFttYWluXSAyMDE5LTA3LTMxIDIxOjE4OjE2LDg2MiBDYXNzYW5kcmFEYWVtb24uamF2YTo0ODcgLSBKVk0gdmVuZG9yL3ZlcnNpb246IE9wZW5KREsgCis2NC1CaXQgU2VydmVyIFZNLzExLjAuMworSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MTYsODYzIENhc3NhbmRyYURhZW1vbi5qYXZhOjQ4OCAtIEhlYXAgc2l6ZTogCisxMDA0LjAwME1pQi8xMDA0LjAwME1pQgorLi4uLgorCitUaGUgZm9sbG93aW5nIG91dHB1dCBpbmRpY2F0ZXMgYSBzaW5nbGUgbm9kZSBDYXNzYW5kcmEgNC4wIGNsdXN0ZXIgaGFzCitzdGFydGVkLgorCisuLi4uCitJTkZPICBbbWFpbl0gMjAxOS0wNy0zMSAyMToxODoxOSw2ODcgSW5ib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuamF2YToxMzAgLSBMaXN0ZW5pbmcgb24gCithZGRyZXNzOiAoMTI3LjAuMC4xOjcwMDApLCBuaWM6IGxvLCBlbmNyeXB0aW9uOiBlbmFibGVkIChvcGVuc3NsKQorLi4uCisuLi4KK0lORk8gIFttYWluXSAyMDE5LTA3LTMxIDIxOjE4OjE5LDg1MCBTdG9yYWdlU2VydmljZS5qYXZhOjUxMiAtIFVuYWJsZSB0byBnb3NzaXAgd2l0aCBhbnkgCitwZWVycyBidXQgY29udGludWluZyBhbnl3YXkgc2luY2Ugbm9kZSBpcyBpbiBpdHMgb3duIHNlZWQgbGlzdAorSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MTksODY0IFN0b3JhZ2VTZXJ2aWNlLmphdmE6Njk1IC0gTG9hZGluZyBwZXJzaXN0ZWQgcmluZyBzdGF0ZQorSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MTksODY1IFN0b3JhZ2VTZXJ2aWNlLmphdmE6ODE0IC0gU3RhcnRpbmcgdXAgc2VydmVyIGdvc3NpcAorSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MjAsMDg4IEJ1ZmZlclBvb2wuamF2YToyMTYgLSBHbG9iYWwgYnVmZmVyIHBvb2wgaXMgZW5hYmxlZCwgIAord2hlbiBwb29sIGlzIGV4aGF1c3RlZCAobWF4IGlzIDI1MS4wMDBNaUIpIGl0IHdpbGwgYWxsb2NhdGUgb24gaGVhcAorSU5GTyAgW21haW5dIDIwMTktMDctMzEgMjE6MTg6MjAsMTEwIFN0b3JhZ2VTZXJ2aWNlLmphdmE6ODc1IC0gVGhpcyBub2RlIHdpbGwgbm90IGF1dG8gCitib290c3RyYXAgYmVjYXVzZSBpdCBpcyBjb25maWd1cmVkIHRvIGJlIGEgc2VlZCBub2RlLgorLi4uCisuLi4KK0lORk8gIFttYWluXSAyMDE5LTA3LTMxIDIxOjE4OjIwLDgwOSBTdG9yYWdlU2VydmljZS5qYXZhOjE1MDcgLSBKT0lOSU5HOiBGaW5pc2ggam9pbmluZyByaW5nCitJTkZPICBbbWFpbl0gMjAxOS0wNy0zMSAyMToxODoyMCw5MjEgU3RvcmFnZVNlcnZpY2UuamF2YToyNTA4IC0gTm9kZSAxMjcuMC4wLjE6NzAwMCBzdGF0ZSAKK2p1bXAgdG8gTk9STUFMCisuLi4uCisKKz09IFVzaW5nIEphdmEgMTEgdG8gQnVpbGQKKworSWYgSmF2YSAxMSBpcyB1c2VkIHRvIGJ1aWxkIEFwYWNoZSBDYXNzYW5kcmEgNC4wLCBmaXJzdCBKYXZhIDExIG11c3QgYmUKK2luc3RhbGxlZCBhbmQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQuIEFzIGFuIGV4YW1wbGUsIHRvIGRvd25sb2FkCithbmQgaW5zdGFsbCBKYXZhIDExIG9uIFJlZEhhdCBMaW51eCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kLgorCisuLi4uCiskIHl1bSBpbnN0YWxsIGphdmEtMTEtb3Blbmpkay1kZXZlbAorLi4uLgorCitTZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBgSkFWQV9IT01FYCBhbmQgYFBBVEhgLgorCisuLi4uCiskIGV4cG9ydCBKQVZBX0hPTUU9L3Vzci9saWIvanZtL2phdmEtMTEtb3BlbmpkaworJCBleHBvcnQgUEFUSD0kUEFUSDokSkFWQV9IT01FL2JpbjokSlJFX0hPTUUvYmluCisuLi4uCisKK1RoZSBidWlsZCBvdXRwdXQgc2hvdWxkIG5vdyBpbmNsdWRlIHRoZSBmb2xsb3dpbmcuCisKKy4uLi4KK1tlY2hvXSBOb24gZGVmYXVsdCBKREsgdmVyc2lvbiB1c2VkOiAxMQorLi4uCisuLi4KK19idWlsZF9qYXZhOgorICAgIFtlY2hvXSBDb21waWxpbmcgZm9yIEphdmEgMTEKKy4uLgorLi4uCitidWlsZDoKKworX21haW4tamFyOgorICAgICAgICAgW2NvcHldIENvcHlpbmcgMSBmaWxlIHRvIC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC9jbGFzc2VzL21haW4vTUVUQS1JTkYKKyAgICAgW2phcl0gQnVpbGRpbmcgamFyOiAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQvYXBhY2hlLWNhc3NhbmRyYS00LjAtU05BUFNIT1QuamFyCisuLi4KKy4uLgorX2J1aWxkLXRlc3Q6CisgICBbamF2YWNdIENvbXBpbGluZyA3Mzkgc291cmNlIGZpbGVzIHRvIC9ob21lL2VjMi11c2VyL2Nhc3NhbmRyYS9idWlsZC90ZXN0L2NsYXNzZXMKKyAgICBbY29weV0gQ29weWluZyAyNSBmaWxlcyB0byAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQvdGVzdC9jbGFzc2VzCisuLi4KKy4uLgoramFyOgorICAgW21rZGlyXSBDcmVhdGVkIGRpcjogL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2J1aWxkL2NsYXNzZXMvc3RyZXNzL01FVEEtSU5GCisgICBbbWtkaXJdIENyZWF0ZWQgZGlyOiAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQvdG9vbHMvbGliCisgICAgIFtqYXJdIEJ1aWxkaW5nIGphcjogL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2J1aWxkL3Rvb2xzL2xpYi9zdHJlc3MuamFyCisgICBbbWtkaXJdIENyZWF0ZWQgZGlyOiAvaG9tZS9lYzItdXNlci9jYXNzYW5kcmEvYnVpbGQvY2xhc3Nlcy9mcWx0b29sL01FVEEtSU5GCisgICAgIFtqYXJdIEJ1aWxkaW5nIGphcjogL2hvbWUvZWMyLXVzZXIvY2Fzc2FuZHJhL2J1aWxkL3Rvb2xzL2xpYi9mcWx0b29sLmphcgorCitCVUlMRCBTVUNDRVNTRlVMCitUb3RhbCB0aW1lOiAxIG1pbnV0ZSAzIHNlY29uZHMKKy4uLi4KKworPT0gQ29tbW9uIElzc3VlcworCitUaGUgSmF2YSAxMSBidWlsdCBBcGFjaGUgQ2Fzc2FuZHJhIDQuMCBzb3VyY2UgY29kZSBtYXkgYmUgcnVuIHdpdGggSmF2YQorMTEgb25seS4gSWYgYSBKYXZhIDExIGJ1aWx0IGNvZGUgaXMgcnVuIHdpdGggSmF2YSA4IHRoZSBmb2xsb3dpbmcgZXJyb3IKK21lc3NhZ2UgZ2V0cyBvdXRwdXQuCisKKy4uLi4KKyMgc3NoIC1pIGNhc3NhbmRyYS5wZW0gZWMyLXVzZXJAZWMyLTMtODUtODUtNzUuY29tcHV0ZS0xLmFtYXpvbmF3cy5jb20KK0xhc3QgbG9naW46IFdlZCBKdWwgMzEgMjA6NDc6MjYgMjAxOSBmcm9tIDc1LjE1NS4yNTUuNTEKKyQgZWNobyAkSkFWQV9IT01FCisvdXNyL2xpYi9qdm0vamF2YS0xLjguMC1vcGVuamRrCiskIGNhc3NhbmRyYSAKKy4uLgorLi4uCitFcnJvcjogQSBKTkkgZXJyb3IgaGFzIG9jY3VycmVkLCBwbGVhc2UgY2hlY2sgeW91ciBpbnN0YWxsYXRpb24gYW5kIHRyeSBhZ2FpbgorRXhjZXB0aW9uIGluIHRocmVhZCAibWFpbiIgamF2YS5sYW5nLlVuc3VwcG9ydGVkQ2xhc3NWZXJzaW9uRXJyb3I6IAorb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9DYXNzYW5kcmFEYWVtb24gaGFzIGJlZW4gY29tcGlsZWQgYnkgYSBtb3JlIHJlY2VudCB2ZXJzaW9uIG9mIAordGhlIEphdmEgUnVudGltZSAoY2xhc3MgZmlsZSB2ZXJzaW9uIDU1LjApLCB0aGlzIHZlcnNpb24gb2YgdGhlIEphdmEgUnVudGltZSBvbmx5IHJlY29nbml6ZXMgCitjbGFzcyBmaWxlIHZlcnNpb25zIHVwIHRvIDUyLjAKKyAgYXQgamF2YS5sYW5nLkNsYXNzTG9hZGVyLmRlZmluZUNsYXNzMShOYXRpdmUgTWV0aG9kKQorICBhdCBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIuZGVmaW5lQ2xhc3MoQ2xhc3NMb2FkZXIuamF2YTo3NjMpCisgIGF0IC4uLgorLi4uCisuLi4uCisKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9kYi5Xcml0ZVJlc3BvbnNlLmJpbiBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29saW5nL2Nhc3Mtc3RyZXNzLWRlcHJlY2F0ZWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuV3JpdGVSZXNwb25zZS5iaW4KY29weSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbGluZy9jYXNzLXN0cmVzcy1kZXByZWNhdGVkCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuV3JpdGVSZXNwb25zZS5iaW4gYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbGluZy9nZW5lcmF0ZS10b2tlbnMKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuV3JpdGVSZXNwb25zZS5iaW4KY29weSB0byBkb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbGluZy9nZW5lcmF0ZS10b2tlbnMKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9kYi5Xcml0ZVJlc3BvbnNlLmJpbiBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29saW5nL2hhc2gtcGFzc3dvcmQtdG9vbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIHRlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9kYi5Xcml0ZVJlc3BvbnNlLmJpbgpjb3B5IHRvIGRvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29saW5nL2hhc2gtcGFzc3dvcmQtdG9vbApkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL2Nhc3NhbmRyYV9zdHJlc3MuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9jYXNzYW5kcmFfc3RyZXNzLmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZjM1NDguLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL2Nhc3NhbmRyYV9zdHJlc3MuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDMyNCArMCwwIEBACi09IENhc3NhbmRyYSBTdHJlc3MKLQotVGhlIGBjYXNzYW5kcmEtc3RyZXNzYCB0b29sIGlzIHVzZWQgdG8gYmVuY2htYXJrIGFuZCBsb2FkLXRlc3QgYSBDYXNzYW5kcmEKLWNsdXN0ZXIuIAotYGNhc3NhbmRyYS1zdHJlc3NgIHN1cHBvcnRzIHRlc3RpbmcgYXJiaXRyYXJ5IENRTCB0YWJsZXMgYW5kIHF1ZXJpZXMsIGFsbG93aW5nIHVzZXJzIHRvIGJlbmNobWFyayB0aGVpciBvd24gZGF0YSBtb2RlbC4KLQotVGhpcyBkb2N1bWVudGF0aW9uIGZvY3VzZXMgb24gdXNlciBtb2RlIHRvIHRlc3QgcGVyc29uYWwgc2NoZW1hLgotCi09PSBVc2FnZQotCi1UaGVyZSBhcmUgc2V2ZXJhbCBvcGVyYXRpb24gdHlwZXM6Ci0KLSogd3JpdGUtb25seSwgcmVhZC1vbmx5LCBhbmQgbWl4ZWQgd29ya2xvYWRzIG9mIHN0YW5kYXJkIGRhdGEKLSogd3JpdGUtb25seSBhbmQgcmVhZC1vbmx5IHdvcmtsb2FkcyBmb3IgY291bnRlciBjb2x1bW5zCi0qIHVzZXIgY29uZmlndXJlZCB3b3JrbG9hZHMsIHJ1bm5pbmcgY3VzdG9tIHF1ZXJpZXMgb24gY3VzdG9tIHNjaGVtYXMKLQotVGhlIHN5bnRheCBpcyBgY2Fzc2FuZHJhLXN0cmVzcyA8Y29tbWFuZD4gW29wdGlvbnNdYC4gCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhIGdpdmVuIGNvbW1hbmQgb3Igb3B0aW9ucywgcnVuIGBjYXNzYW5kcmEtc3RyZXNzIGhlbHAgPGNvbW1hbmR8b3B0aW9uPmAuCi0KLUNvbW1hbmRzOjo6Ci0gIHJlYWQ6OzsKLSAgICBNdWx0aXBsZSBjb25jdXJyZW50IHJlYWRzIC0gdGhlIGNsdXN0ZXIgbXVzdCBmaXJzdCBiZSBwb3B1bGF0ZWQgYnkgYQotICAgIHdyaXRlIHRlc3QKLSAgd3JpdGU6OzsKLSAgICBNdWx0aXBsZSBjb25jdXJyZW50IHdyaXRlcyBhZ2FpbnN0IHRoZSBjbHVzdGVyCi0gIG1peGVkOjs7Ci0gICAgSW50ZXJsZWF2aW5nIG9mIGFueSBiYXNpYyBjb21tYW5kcywgd2l0aCBjb25maWd1cmFibGUgcmF0aW8gYW5kCi0gICAgZGlzdHJpYnV0aW9uIC0gdGhlIGNsdXN0ZXIgbXVzdCBmaXJzdCBiZSBwb3B1bGF0ZWQgYnkgYSB3cml0ZSB0ZXN0Ci0gIGNvdW50ZXJfd3JpdGU6OzsKLSAgICBNdWx0aXBsZSBjb25jdXJyZW50IHVwZGF0ZXMgb2YgY291bnRlcnMuCi0gIGNvdW50ZXJfcmVhZDo7OwotICAgIE11bHRpcGxlIGNvbmN1cnJlbnQgcmVhZHMgb2YgY291bnRlcnMuIFRoZSBjbHVzdGVyIG11c3QgZmlyc3QgYmUKLSAgICBwb3B1bGF0ZWQgYnkgYSBjb3VudGVyd3JpdGUgdGVzdC4KLSAgdXNlcjo7OwotICAgIEludGVybGVhdmluZyBvZiB1c2VyIHByb3ZpZGVkIHF1ZXJpZXMsIHdpdGggY29uZmlndXJhYmxlIHJhdGlvIGFuZAotICAgIGRpc3RyaWJ1dGlvbi4KLSAgaGVscDo7OwotICAgIFByaW50IGhlbHAgZm9yIGEgY29tbWFuZCBvciBvcHRpb24KLSAgcHJpbnQ6OzsKLSAgICBJbnNwZWN0IHRoZSBvdXRwdXQgb2YgYSBkaXN0cmlidXRpb24gZGVmaW5pdGlvbgotICBsZWdhY3k6OzsKLSAgICBMZWdhY3kgc3VwcG9ydCBtb2RlCi1QcmltYXJ5IE9wdGlvbnM6OjoKLSAgLXBvcDo7OwotICAgIFBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIGFuZCBpbnRyYS1wYXJ0aXRpb24gdmlzaXQgb3JkZXIKLSAgLWluc2VydDo7OwotICAgIEluc2VydCBzcGVjaWZpYyBvcHRpb25zIHJlbGF0aW5nIHRvIHZhcmlvdXMgbWV0aG9kcyBmb3IgYmF0Y2hpbmcgYW5kCi0gICAgc3BsaXR0aW5nIHBhcnRpdGlvbiB1cGRhdGVzCi0gIC1jb2w6OzsKLSAgICBDb2x1bW4gZGV0YWlscyBzdWNoIGFzIHNpemUgYW5kIGNvdW50IGRpc3RyaWJ1dGlvbiwgZGF0YSBnZW5lcmF0b3IsCi0gICAgbmFtZXMsIGNvbXBhcmF0b3IgYW5kIGlmIHN1cGVyIGNvbHVtbnMgc2hvdWxkIGJlIHVzZWQKLSAgLXJhdGU6OzsKLSAgICBUaHJlYWQgY291bnQsIHJhdGUgbGltaXQgb3IgYXV0b21hdGljIG1vZGUgKGRlZmF1bHQgaXMgYXV0bykKLSAgLW1vZGU6OzsKLSAgICBUaHJpZnQgb3IgQ1FMIHdpdGggb3B0aW9ucwotICAtZXJyb3JzOjs7Ci0gICAgSG93IHRvIGhhbmRsZSBlcnJvcnMgd2hlbiBlbmNvdW50ZXJlZCBkdXJpbmcgc3RyZXNzCi0gIC1zYW1wbGU6OzsKLSAgICBTcGVjaWZ5IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBjb2xsZWN0IGZvciBtZWFzdXJpbmcgbGF0ZW5jeQotICAtc2NoZW1hOjs7Ci0gICAgUmVwbGljYXRpb24gc2V0dGluZ3MsIGNvbXByZXNzaW9uLCBjb21wYWN0aW9uLCBldGMuCi0gIC1ub2RlOjs7Ci0gICAgTm9kZXMgdG8gY29ubmVjdCB0bwotICAtbG9nOjs7Ci0gICAgV2hlcmUgdG8gbG9nIHByb2dyZXNzIHRvLCBhbmQgdGhlIGludGVydmFsIGF0IHdoaWNoIHRvIGRvIGl0Ci0gIC10cmFuc3BvcnQ6OzsKLSAgICBDdXN0b20gdHJhbnNwb3J0IGZhY3RvcmllcwotICAtcG9ydDo7OwotICAgIFRoZSBwb3J0IHRvIGNvbm5lY3QgdG8gY2Fzc2FuZHJhIG5vZGVzIG9uCi0gIC1ncmFwaDo7OwotICAgIEdyYXBoIHJlY29yZGVkIG1ldHJpY3MKLSAgLXRva2VucmFuZ2U6OzsKLSAgICBUb2tlbiByYW5nZSBzZXR0aW5ncwotU3Vib3B0aW9uczo6OgotICBFdmVyeSBjb21tYW5kIGFuZCBwcmltYXJ5IG9wdGlvbiBoYXMgaXRzIG93biBjb2xsZWN0aW9uIG9mIHN1Ym9wdGlvbnMuCi0gIFRoZXNlIGFyZSB0b28gbnVtZXJvdXMgdG8gbGlzdCBoZXJlLiBGb3IgaW5mb3JtYXRpb24gb24gdGhlIHN1Ym9wdGlvbnMKLSAgZm9yIGVhY2ggY29tbWFuZCBvciBvcHRpb24sIHBsZWFzZSB1c2UgdGhlIGhlbHAgY29tbWFuZCwKLSAgYGNhc3NhbmRyYS1zdHJlc3MgaGVscCA8Y29tbWFuZHxvcHRpb24+YC4KLQotPT0gVXNlciBtb2RlCi0KLVVzZXIgbW9kZSBhbGxvd3MgeW91IHRvIHN0cmVzcyB5b3VyIG93biBzY2hlbWFzLCB0byBzYXZlIHlvdSB0aW1lCi1pbiB0aGUgbG9uZyBydW4uIEZpbmQgb3V0IGlmIHlvdXIgYXBwbGljYXRpb24gY2FuIHNjYWxlIHVzaW5nIHN0cmVzcyB0ZXN0IHdpdGggeW91ciBzY2hlbWEuCi0KLT09PSBQcm9maWxlCi0KLVVzZXIgbW9kZSBkZWZpbmVzIGEgcHJvZmlsZSB1c2luZyBZQU1MLiAKLU11bHRpcGxlIFlBTUwgZmlsZXMgbWF5IGJlIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSBvcGVyYXRpb25zIGluIHRoZSBvcHMgYXJndW1lbnQgYXJlIHJlZmVyZW5jZWQgYXMKLXNwZWNuYW1lLm9wbmFtZS4KLQotQW4gaWRlbnRpZmllciBmb3IgdGhlIHByb2ZpbGU6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLXNwZWNuYW1lOiBzdGFmZl9hY3Rpdml0aWVzCi0tLS0tCi0KLVRoZSBrZXlzcGFjZSBmb3IgdGhlIHRlc3Q6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLWtleXNwYWNlOiBzdGFmZgotLS0tLQotCi1DUUwgZm9yIHRoZSBrZXlzcGFjZS4gT3B0aW9uYWwgaWYgdGhlIGtleXNwYWNlIGFscmVhZHkgZXhpc3RzOgotCi1bc291cmNlLHlhbWxdCi0tLS0tCi1rZXlzcGFjZV9kZWZpbml0aW9uOiB8Ci0gQ1JFQVRFIEtFWVNQQUNFIHN0cmVzc2NxbCBXSVRIIHJlcGxpY2F0aW9uID0geydjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InOiAzfTsKLS0tLS0KLQotVGhlIHRhYmxlIHRvIGJlIHN0cmVzc2VkOgotCi1bc291cmNlLHlhbWxdCi0tLS0tCi10YWJsZTogc3RhZmZfYWN0aXZpdGllcwotLS0tLQotCi1DUUwgZm9yIHRoZSB0YWJsZS4gT3B0aW9uYWwgaWYgdGhlIHRhYmxlIGFscmVhZHkgZXhpc3RzOgotCi1bc291cmNlLHlhbWxdCi0tLS0tCi10YWJsZV9kZWZpbml0aW9uOiB8Ci0gIENSRUFURSBUQUJMRSBzdGFmZl9hY3Rpdml0aWVzICgKLSAgICAgIG5hbWUgdGV4dCwKLSAgICAgIHdoZW4gdGltZXV1aWQsCi0gICAgICB3aGF0IHRleHQsCi0gICAgICBQUklNQVJZIEtFWShuYW1lLCB3aGVuLCB3aGF0KQotICApIAotLS0tLQotCi1PcHRpb25hbCBtZXRhLWluZm9ybWF0aW9uIG9uIHRoZSBnZW5lcmF0ZWQgY29sdW1ucyBpbiB0aGUgYWJvdmUgdGFibGUuCi1UaGUgbWluIGFuZCBtYXggb25seSBhcHBseSB0byB0ZXh0IGFuZCBibG9iIHR5cGVzLiBUaGUgZGlzdHJpYnV0aW9uCi1maWVsZCByZXByZXNlbnRzIHRoZSB0b3RhbCB1bmlxdWUgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gb2YgdGhhdCBjb2x1bW4KLWFjcm9zcyByb3dzOgotCi1bc291cmNlLHlhbWxdCi0tLS0tCi1jb2x1bW5zcGVjOgotICAtIG5hbWU6IG5hbWUKLSAgICBzaXplOiB1bmlmb3JtKDUuLjEwKSAjIFRoZSBuYW1lcyBvZiB0aGUgc3RhZmYgbWVtYmVycyBhcmUgYmV0d2VlbiA1LTEwIGNoYXJhY3RlcnMKLSAgICBwb3B1bGF0aW9uOiB1bmlmb3JtKDEuLjEwKSAjIDEwIHBvc3NpYmxlIHN0YWZmIG1lbWJlcnMgdG8gcGljayBmcm9tCi0gIC0gbmFtZTogd2hlbgotICAgIGNsdXN0ZXI6IHVuaWZvcm0oMjAuLjUwMCkgIyBTdGFmZiBtZW1iZXJzIGRvIGJldHdlZW4gMjAgYW5kIDUwMCBldmVudHMKLSAgLSBuYW1lOiB3aGF0Ci0gICAgc2l6ZTogbm9ybWFsKDEwLi4xMDAsNTApCi0tLS0tCi0KLVN1cHBvcnRlZCB0eXBlcyBhcmU6Ci0KLUFuIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbiBvdmVyIHRoZSByYW5nZSBbbWluLi5tYXhdOgotCi1bc291cmNlLHlhbWxdCi0tLS0tCi1FWFAobWluLi5tYXgpCi0tLS0tCi0KLUFuIGV4dHJlbWUgdmFsdWUgKFdlaWJ1bGwpIGRpc3RyaWJ1dGlvbiBvdmVyIHRoZSByYW5nZSBbbWluLi5tYXhdOgotCi1bc291cmNlLHlhbWxdCi0tLS0tCi1FWFRSRU1FKG1pbi4ubWF4LHNoYXBlKQotLS0tLQotCi1BIGdhdXNzaWFuL25vcm1hbCBkaXN0cmlidXRpb24sIHdoZXJlIG1lYW49KG1pbittYXgpLzIsIGFuZCBzdGRldiBpcwotKG1lYW4tbWluKS9zdGR2cm5nOgotCi1bc291cmNlLHlhbWxdCi0tLS0tCi1HQVVTU0lBTihtaW4uLm1heCxzdGR2cm5nKQotLS0tLQotCi1BIGdhdXNzaWFuL25vcm1hbCBkaXN0cmlidXRpb24sIHdpdGggZXhwbGljaXRseSBkZWZpbmVkIG1lYW4gYW5kIHN0ZGV2OgotCi1bc291cmNlLHlhbWxdCi0tLS0tCi1HQVVTU0lBTihtaW4uLm1heCxtZWFuLHN0ZGV2KQotLS0tLQotCi1BIHVuaWZvcm0gZGlzdHJpYnV0aW9uIG92ZXIgdGhlIHJhbmdlIFttaW4sIG1heF06Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLVVOSUZPUk0obWluLi5tYXgpCi0tLS0tCi0KLUEgZml4ZWQgZGlzdHJpYnV0aW9uLCBhbHdheXMgcmV0dXJuaW5nIHRoZSBzYW1lIHZhbHVlOgotCi1bc291cmNlLHlhbWxdCi0tLS0tCi1GSVhFRCh2YWwpCi0tLS0tCi0KLUlmIHByZWNlZGVkIGJ5IH4sIHRoZSBkaXN0cmlidXRpb24gaXMgaW52ZXJ0ZWQKLQotRGVmYXVsdHMgZm9yIGFsbCBjb2x1bW5zIGFyZSBzaXplOiB1bmlmb3JtKDQuLjgpLCBwb3B1bGF0aW9uOgotdW5pZm9ybSgxLi4xMDBCKSwgY2x1c3RlcjogZml4ZWQoMSkKLQotSW5zZXJ0IGRpc3RyaWJ1dGlvbnM6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLWluc2VydDoKLSAgIyBIb3cgbWFueSBwYXJ0aXRpb24gdG8gaW5zZXJ0IHBlciBiYXRjaAotICBwYXJ0aXRpb25zOiBmaXhlZCgxKQotICAjIEhvdyBtYW55IHJvd3MgdG8gdXBkYXRlIHBlciBwYXJ0aXRpb24KLSAgc2VsZWN0OiBmaXhlZCgxKS81MDAKLSAgIyBVTkxPR0dFRCBvciBMT0dHRUQgYmF0Y2ggZm9yIGluc2VydAotICBiYXRjaHR5cGU6IFVOTE9HR0VECi0tLS0tCi0KLUN1cnJlbnRseSBhbGwgaW5zZXJ0cyBhcmUgZG9uZSBpbnNpZGUgYmF0Y2hlcy4KLQotUmVhZCBzdGF0ZW1lbnRzIHRvIHVzZSBkdXJpbmcgdGhlIHRlc3Q6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLXF1ZXJpZXM6Ci0gICBldmVudHM6Ci0gICAgICBjcWw6IHNlbGVjdCAqICBmcm9tIHN0YWZmX2FjdGl2aXRpZXMgd2hlcmUgbmFtZSA9ID8KLSAgICAgIGZpZWxkczogc2FtZXJvdwotICAgbGF0ZXN0X2V2ZW50OgotICAgICAgY3FsOiBzZWxlY3QgKiBmcm9tIHN0YWZmX2FjdGl2aXRpZXMgd2hlcmUgbmFtZSA9ID8gIExJTUlUIDEKLSAgICAgIGZpZWxkczogc2FtZXJvdwotLS0tLQotCi1SdW5uaW5nIGEgdXNlciBtb2RlIHRlc3Q6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLWNhc3NhbmRyYS1zdHJlc3MgdXNlciBwcm9maWxlPS4vZXhhbXBsZS55YW1sIGR1cmF0aW9uPTFtICJvcHMoaW5zZXJ0PTEsbGF0ZXN0X2V2ZW50PTEsZXZlbnRzPTEpIiB0cnVuY2F0ZT1vbmNlCi0tLS0tCi0KLVRoaXMgd2lsbCBjcmVhdGUgdGhlIHNjaGVtYSB0aGVuIHJ1biB0ZXN0cyBmb3IgMSBtaW51dGUgd2l0aCBhbiBlcXVhbAotbnVtYmVyIG9mIGluc2VydHMsIGxhdGVzdF9ldmVudCBxdWVyaWVzIGFuZCBldmVudHMgcXVlcmllcy4gQWRkaXRpb25hbGx5Ci10aGUgdGFibGUgd2lsbCBiZSB0cnVuY2F0ZWQgb25jZSBiZWZvcmUgdGhlIHRlc3QuCi0KLVRoZSBmdWxsIGV4YW1wbGUgY2FuIGJlIGZvdW5kIGhlcmU6Ci1bc291cmNlLCB5YW1sXQotLS0tLQotaW5jbHVkZTo6ZXhhbXBsZSRZQU1ML3N0cmVzcy1leGFtcGxlLnlhbWxbXQotLS0tLSAKLQotUnVubmluZyBhIHVzZXIgbW9kZSB0ZXN0IHdpdGggbXVsdGlwbGUgeWFtbCBmaWxlczo6OjoKLSAgY2Fzc2FuZHJhLXN0cmVzcyB1c2VyIHByb2ZpbGU9Li9leGFtcGxlLnlhbWwsLi9leGFtcGxlMi55YW1sCi0gIGR1cmF0aW9uPTFtICJvcHMoZXgxLmluc2VydD0xLGV4MS5sYXRlc3RfZXZlbnQ9MSxleDIuaW5zZXJ0PTIpIgotICB0cnVuY2F0ZT1vbmNlCi1UaGlzIHdpbGwgcnVuIG9wZXJhdGlvbnMgYXMgc3BlY2lmaWVkIGluIGJvdGggdGhlIGV4YW1wbGUueWFtbCBhbmQKLWV4YW1wbGUyLnlhbWwgZmlsZXMuIGV4YW1wbGUueWFtbCBhbmQgZXhhbXBsZTIueWFtbCBjYW4gcmVmZXJlbmNlIHRoZQotc2FtZSB0YWJsZSwgYWx0aG91Z2ggY2FyZSBtdXN0IGJlIHRha2VuIHRoYXQgdGhlIHRhYmxlIGRlZmluaXRpb24gaXMgaWRlbnRpY2FsCi0gKGRhdGEgZ2VuZXJhdGlvbiBzcGVjcyBjYW4gYmUgZGlmZmVyZW50KS4KLQotPT09IExpZ2h0d2VpZ2h0IHRyYW5zYWN0aW9uIHN1cHBvcnQKLQotY2Fzc2FuZHJhLXN0cmVzcyBzdXBwb3J0cyBsaWdodHdlaWdodCB0cmFuc2FjdGlvbnMuIAotVG8gdXNlIHRoaXMgZmVhdHVyZSwgdGhlIGNvbW1hbmQgd2lsbCBmaXJzdCByZWFkIGN1cnJlbnQgZGF0YSBmcm9tIENhc3NhbmRyYSwgYW5kIHRoZW4gdXNlcyByZWFkIHZhbHVlcyB0bwotZnVsZmlsbCBsaWdodHdlaWdodCB0cmFuc2FjdGlvbiBjb25kaXRpb25zLgotCi1MaWdodHdlaWdodCB0cmFuc2FjdGlvbiB1cGRhdGUgcXVlcnk6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLXF1ZXJpZXM6Ci0gIHJlZ3VsYXJ1cGRhdGU6Ci0gICAgICBjcWw6IHVwZGF0ZSBibG9ncG9zdHMgc2V0IGF1dGhvciA9ID8gd2hlcmUgZG9tYWluID0gPyBhbmQgcHVibGlzaGVkX2RhdGUgPSA/Ci0gICAgICBmaWVsZHM6IHNhbWVyb3cKLSAgdXBkYXRld2l0aGx3dDoKLSAgICAgIGNxbDogdXBkYXRlIGJsb2dwb3N0cyBzZXQgYXV0aG9yID0gPyB3aGVyZSBkb21haW4gPSA/IGFuZCBwdWJsaXNoZWRfZGF0ZSA9ID8gSUYgYm9keSA9ID8gQU5EIHVybCA9ID8KLSAgICAgIGZpZWxkczogc2FtZXJvdwotLS0tLQotCi1UaGUgZnVsbCBleGFtcGxlIGNhbiBiZSBmb3VuZCBoZXJlOgotW3NvdXJjZSwgeWFtbF0KLS0tLS0KLWluY2x1ZGU6OmV4YW1wbGUkWUFNTC9zdHJlc3MtbHd0LWV4YW1wbGUueWFtbFtdCi0tLS0tCi0KLT09IEdyYXBoaW5nCi0KLUdyYXBocyBjYW4gYmUgZ2VuZXJhdGVkIGZvciBlYWNoIHJ1biBvZiBzdHJlc3MuCi0KLWltYWdlOjpleGFtcGxlLXN0cmVzcy1ncmFwaC5wbmdbZXhhbXBsZSBjYXNzYW5kcmEtc3RyZXNzIGdyYXBoXQotCi1UbyBjcmVhdGUgYSBuZXcgZ3JhcGg6Ci0KLVtzb3VyY2UseWFtbF0KLS0tLS0KLWNhc3NhbmRyYS1zdHJlc3MgdXNlciBwcm9maWxlPS4vc3RyZXNzLWV4YW1wbGUueWFtbCAib3BzKGluc2VydD0xLGxhdGVzdF9ldmVudD0xLGV2ZW50cz0xKSIgLWdyYXBoIGZpbGU9Z3JhcGguaHRtbCB0aXRsZT0iQXdlc29tZSBncmFwaCIKLS0tLS0KLQotVG8gYWRkIGEgbmV3IHJ1biB0byBhbiBleGlzdGluZyBncmFwaCBwb2ludCB0byBhbiBleGlzdGluZyBmaWxlIGFuZCBhZGQKLWEgcmV2aXNpb24gbmFtZToKLQotW3NvdXJjZSx5YW1sXQotLS0tLQotY2Fzc2FuZHJhLXN0cmVzcyB1c2VyIHByb2ZpbGU9Li9zdHJlc3MtZXhhbXBsZS55YW1sIGR1cmF0aW9uPTFtICJvcHMoaW5zZXJ0PTEsbGF0ZXN0X2V2ZW50PTEsZXZlbnRzPTEpIiAtZ3JhcGggZmlsZT1ncmFwaC5odG1sIHRpdGxlPSJBd2Vzb21lIGdyYXBoIiByZXZpc2lvbj0iU2Vjb25kIHJ1biIKLS0tLS0KLQotPT0gRkFRCi0KLSpIb3cgZG8geW91IHVzZSBOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneSBmb3IgdGhlIGtleXNwYWNlPyoKLQotVXNlIHRoZSBzY2hlbWEgb3B0aW9uIG1ha2luZyBzdXJlIHRvIGVpdGhlciBlc2NhcGUgdGhlIHBhcmVudGhlc2lzIG9yCi1lbmNsb3NlIGluIHF1b3RlczoKLQotW3NvdXJjZSx5YW1sXQotLS0tLQotY2Fzc2FuZHJhLXN0cmVzcyB3cml0ZSAtc2NoZW1hICJyZXBsaWNhdGlvbihzdHJhdGVneT1OZXR3b3JrVG9wb2xvZ3lTdHJhdGVneSxkYXRhY2VudGVyMT0zKSIKLS0tLS0KLQotKkhvdyBkbyB5b3UgdXNlIFNTTD8qCi0KLVVzZSB0aGUgdHJhbnNwb3J0IG9wdGlvbjoKLQotW3NvdXJjZSx5YW1sXQotLS0tLQotY2Fzc2FuZHJhLXN0cmVzcyAid3JpdGUgbj0xMDBrIGNsPU9ORSBuby13YXJtdXAiIC10cmFuc3BvcnQgInRydXN0c3RvcmU9JEhPTUUvamtzL3RydXN0c3RvcmUuamtzIHRydXN0c3RvcmUtcGFzc3dvcmQ9Y2Fzc2FuZHJhIgotLS0tLQotCi0qSXMgQ2Fzc2FuZHJhIFN0cmVzcyBhIHNlY3VyZWQgdG9vbD8qCi0KLUNhc3NhbmRyYSBzdHJlc3MgaXMgbm90IGEgc2VjdXJlZCB0b29sLiBTZXJpYWxpemF0aW9uIGFuZCBvdGhlciBhc3BlY3RzCi1vZiB0aGUgdG9vbCBvZmZlciBubyBzZWN1cml0eSBndWFyYW50ZWVzLgpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL2NxbHNoLmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvY3Fsc2guYWRvYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA1MGVlNS4uMDAwMDAwMAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvY3Fsc2guYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi09IGNxbHNoOiB0aGUgQ1FMIHNoZWxsCi0KLWBjcWxzaGAgaXMgYSBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIGZvciBpbnRlcmFjdGluZyB3aXRoIENhc3NhbmRyYSB1c2luZyBDUUwgKHRoZSBDYXNzYW5kcmEgUXVlcnkgTGFuZ3VhZ2UpLiAKLUl0IGlzIHNoaXBwZWQgd2l0aCBldmVyeSBDYXNzYW5kcmEgcGFja2FnZSwgYW5kIGNhbiBiZSBmb3VuZCBpbiB0aGUgYmluLyBkaXJlY3RvcnkgYWxvbmdzaWRlIHRoZSBjYXNzYW5kcmEKLWV4ZWN1dGFibGUuIAotYGNxbHNoYCBpcyBpbXBsZW1lbnRlZCB3aXRoIHRoZSBQeXRob24gbmF0aXZlIHByb3RvY29sIGRyaXZlciwgYW5kIGNvbm5lY3RzIHRvIHRoZSBzaW5nbGUgc3BlY2lmaWVkIG5vZGUuCi0KLT09IENvbXBhdGliaWxpdHkKLQotYGNxbHNoYCBpcyBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuNy4KLQotSW4gZ2VuZXJhbCwgYSBnaXZlbiB2ZXJzaW9uIG9mIGBjcWxzaGAgaXMgb25seSBndWFyYW50ZWVkIHRvIHdvcmsgd2l0aCB0aGUKLXZlcnNpb24gb2YgQ2Fzc2FuZHJhIHRoYXQgaXQgd2FzIHJlbGVhc2VkIHdpdGguIAotSW4gc29tZSBjYXNlcywgYGNxbHNoYCBtYXkgd29yayB3aXRoIG9sZGVyIG9yIG5ld2VyIHZlcnNpb25zIG9mIENhc3NhbmRyYSwgYnV0IHRoaXMgaXMgbm90Ci1vZmZpY2lhbGx5IHN1cHBvcnRlZC4KLQotPT0gT3B0aW9uYWwgRGVwZW5kZW5jaWVzCi0KLWBjcWxzaGAgc2hpcHMgd2l0aCBhbGwgZXNzZW50aWFsIGRlcGVuZGVuY2llcy4gSG93ZXZlciwgdGhlcmUgYXJlIHNvbWUKLW9wdGlvbmFsIGRlcGVuZGVuY2llcyB0aGF0IGNhbiBiZSBpbnN0YWxsZWQgdG8gaW1wcm92ZSB0aGUgY2FwYWJpbGl0aWVzCi1vZiBgY3Fsc2hgLgotCi09PT0gcHl0egotCi1CeSBkZWZhdWx0LCBgY3Fsc2hgIGRpc3BsYXlzIGFsbCB0aW1lc3RhbXBzIHdpdGggYSBVVEMgdGltZXpvbmUuIAotVG8gc3VwcG9ydCBkaXNwbGF5IG9mIHRpbWVzdGFtcHMgd2l0aCBhbm90aGVyIHRpbWV6b25lLCBpbnN0YWxsCi10aGUgaHR0cDovL3B5dHouc291cmNlZm9yZ2UubmV0L1tweXR6XSBsaWJyYXJ5LiAKLVNlZSB0aGUgYHRpbWV6b25lYCBvcHRpb24gaW4geHJlZjpjcWwvdG9vbHMvY3Fsc2guYWRvYyNjcWxzaHJjW2NxbHNocmNdIGZvciBzcGVjaWZ5aW5nIGEgdGltZXpvbmUgdG8KLXVzZS4KLQotPT09IGN5dGhvbgotCi1UaGUgcGVyZm9ybWFuY2Ugb2YgY3Fsc2gncyBgQ09QWWAgb3BlcmF0aW9ucyBjYW4gYmUgaW1wcm92ZWQgYnkKLWluc3RhbGxpbmcgaHR0cDovL2N5dGhvbi5vcmcvW2N5dGhvbl0uIFRoaXMgd2lsbCBjb21waWxlIHRoZSBweXRob24KLW1vZHVsZXMgdGhhdCBhcmUgY2VudHJhbCB0byB0aGUgcGVyZm9ybWFuY2Ugb2YgYENPUFlgLgotCi1bW2NxbHNocmNdXQotPT0gY3Fsc2hyYwotCi1UaGUgYGNxbHNocmNgIGZpbGUgaG9sZHMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBgY3Fsc2hgLiAKLUJ5IGRlZmF1bHQsIHRoZSBmaWxlIGlzIGxvY2FndGVkIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgYXQgYH4vLmNhc3NhbmRyYS9jcWxzaGAsIGJ1dCBhCi1jdXN0b20gbG9jYXRpb24gY2FuIGJlIHNwZWNpZmllZCB3aXRoIHRoZSBgLS1jcWxzaHJjYCBvcHRpb24uCi0KLUV4YW1wbGUgY29uZmlnIHZhbHVlcyBhbmQgZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlCi1gY29uZi9jcWxzaHJjLnNhbXBsZWAgZmlsZSBvZiBhIHRhcmJhbGwgaW5zdGFsbGF0aW9uLiAKLVlvdSBjYW4gYWxzbyB2aWV3IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUKLWh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvY2Fzc2FuZHJhL2Jsb2IvdHJ1bmsvY29uZi9jcWxzaHJjLnNhbXBsZVtjcWxzaHJjIGZpbGUgb25saW5lXS4KLQotW1tjcWxfaGlzdG9yeV1dCi09PSBjcWwgaGlzdG9yeQotCi1BbGwgQ1FMIGNvbW1hbmRzIHlvdSBleGVjdXRlIGFyZSB3cml0dGVuIHRvIGEgaGlzdG9yeSBmaWxlLiBCeSBkZWZhdWx0LCBDUUwgaGlzdG9yeSB3aWxsIGJlIHdyaXR0ZW4gdG8gYH4vLmNhc3NhbmRyYS9jcWxfaGlzdG9yeWAuIFlvdSBjYW4gY2hhbmdlIHRoaXMgZGVmYXVsdCBieSBzZXR0aW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBgQ1FMX0hJU1RPUllgIGxpa2UgYH4vc29tZS9vdGhlci9wYXRoL3RvL2NxbHNoX2hpc3RvcnlgIHdoZXJlIGBjcWxzaF9oaXN0b3J5YCBpcyBhIGZpbGUuIEFsbCBwYXJlbnQgZGlyZWN0b3JpZXMgdG8gaGlzdG9yeSBmaWxlIHdpbGwgYmUgY3JlYXRlZCBpZiB0aGV5IGRvIG5vdCBleGlzdC4gSWYgeW91IGRvIG5vdCB3YW50IHRvIHBlcnNpc3QgaGlzdG9yeSwgeW91IGNhbiBkbyBzbyBieSBzZXR0aW5nIENRTF9ISVNUT1JZIHRvIC9kZXYvbnVsbC4KLVRoaXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgZnJvbSBDYXNzYW5kcmEgNC4xLgotCi09PSBDb21tYW5kIExpbmUgT3B0aW9ucwotCi1Vc2FnZTogYGNxbHNoLnB5IFtvcHRpb25zXSBbaG9zdCBbcG9ydF1dYAotCi1DUUwgU2hlbGwgZm9yIEFwYWNoZSBDYXNzYW5kcmEKLQotT3B0aW9uczoKLQotYC0tdmVyc2lvbmA6OgotICBzaG93IHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdAotCi1gLWhgIGAtLWhlbHBgOjoKLSAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAotYC1DYCBgLS1jb2xvcmA6OgotICBBbHdheXMgdXNlIGNvbG9yIG91dHB1dAotYC0tbm8tY29sb3JgOjoKLSAgTmV2ZXIgdXNlIGNvbG9yIG91dHB1dAotYC0tYnJvd3Nlcj1CUk9XU0VSYDo6Ci0gIFRoZSBicm93c2VyIHRvIHVzZSB0byBkaXNwbGF5IENRTCBoZWxwLCB3aGVyZSBCUk9XU0VSIGNhbiBiZToKLSAgb25lIG9mIHRoZSBzdXBwb3J0ZWQgYnJvd3NlcnMgaW4gaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L3dlYmJyb3dzZXIuaHRtbC4KLSAgYnJvd3NlciBwYXRoIGZvbGxvd2VkIGJ5ICVzLCBleGFtcGxlOiAvdXNyL2Jpbi9nb29nbGUtY2hyb21lLXN0YWJsZSAlcwotYC0tc3NsYDo6Ci0gIFVzZSBTU0wKLQotYC11IFVTRVJOQU1FYCBgLS11c2VybmFtZT1VU0VSTkFNRWA6OgotICBBdXRoZW50aWNhdGUgYXMgdXNlci4KLWAtcCBQQVNTV09SRGAgYC0tcGFzc3dvcmQ9UEFTU1dPUkRgOjoKLSAgQXV0aGVudGljYXRlIHVzaW5nIHBhc3N3b3JkLgotYC1rIEtFWVNQQUNFYCBgLS1rZXlzcGFjZT1LRVlTUEFDRWA6OgotICBBdXRoZW50aWNhdGUgdG8gdGhlIGdpdmVuIGtleXNwYWNlLgotYC1mIEZJTEVgIGAtLWZpbGU9RklMRWA6OgotICBFeGVjdXRlIGNvbW1hbmRzIGZyb20gRklMRSwgdGhlbiBleGl0Ci1gLS1kZWJ1Z2A6OgotICBTaG93IGFkZGl0aW9uYWwgZGVidWdnaW5nIGluZm9ybWF0aW9uCi1gLS1jb3ZlcmFnZWA6OgotICBDb2xsZWN0IGNvdmVyYWdlIGRhdGEKLWAtLWVuY29kaW5nPUVOQ09ESU5HYDo6Ci0gIFNwZWNpZnkgYSBub24tZGVmYXVsdCBlbmNvZGluZyBmb3Igb3V0cHV0LiAoRGVmYXVsdDogdXRmLTgpCi1gLS1jcWxzaHJjPUNRTFNIUkNgOjoKLSAgU3BlY2lmeSBhbiBhbHRlcm5hdGl2ZSBjcWxzaHJjIGZpbGUgbG9jYXRpb24uCi1gLS1jcmVkZW50aWFscz1DUkVERU5USUFMU2A6OgotICBTcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGNyZWRlbnRpYWxzIGZpbGUgbG9jYXRpb24uCi1gLS1jcWx2ZXJzaW9uPUNRTFZFUlNJT05gOjoKLSAgU3BlY2lmeSBhIHBhcnRpY3VsYXIgQ1FMIHZlcnNpb24sIGJ5IGRlZmF1bHQgdGhlCi0gIGhpZ2hlc3QgdmVyc2lvbiBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlciB3aWxsIGJlIHVzZWQuCi0gIEV4YW1wbGVzOiAiMy4wLjMiLCAiMy4xLjAiCi1gLS1wcm90b2NvbC12ZXJzaW9uPVBST1RPQ09MX1ZFUlNJT05gOjoKLSAgU3BlY2lmeSBhIHNwZWNpZmljIHByb3Rjb2wgdmVyc2lvbiBvdGhlcndpc2UgdGhlCi0gIGNsaWVudCB3aWxsIGRlZmF1bHQgYW5kIGRvd25ncmFkZSBhcyBuZWNlc3NhcnkKLWAtZSBFWEVDVVRFYCBgLS1leGVjdXRlPUVYRUNVVEVgOjoKLSAgRXhlY3V0ZSB0aGUgc3RhdGVtZW50IGFuZCBxdWl0LgotYC0tY29ubmVjdC10aW1lb3V0PUNPTk5FQ1RfVElNRU9VVGA6OgotICBTcGVjaWZ5IHRoZSBjb25uZWN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kcyAoZGVmYXVsdDogNSBzZWNvbmRzKS4KLWAtLXJlcXVlc3QtdGltZW91dD1SRVFVRVNUX1RJTUVPVVRgOjoKLSAgU3BlY2lmeSB0aGUgZGVmYXVsdCByZXF1ZXN0IHRpbWVvdXQgaW4gc2Vjb25kcwotICAoZGVmYXVsdDogMTAgc2Vjb25kcykuCi1gLXQsIC0tdHR5YDo6Ci0gIEZvcmNlIHR0eSBtb2RlIChjb21tYW5kIHByb21wdCkuCi1gLXZgIGAtLXZgOjoKLSAgUHJpbnQgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBjcWxzaC4KLQotPT0gU3BlY2lhbCBDb21tYW5kcwotCi1JbiBhZGRpdGlvbiB0byBzdXBwb3J0aW5nIHJlZ3VsYXIgQ1FMIHN0YXRlbWVudHMsIGBjcWxzaGAgYWxzbyBzdXBwb3J0cyBhCi1udW1iZXIgb2Ygc3BlY2lhbCBjb21tYW5kcyB0aGF0IGFyZSBub3QgcGFydCBvZiBDUUwuIFRoZXNlIGFyZSBkZXRhaWxlZAotYmVsb3cuCi0KLT09PSBgQ09OU0lTVEVOQ1lgCi0KLWBVc2FnZWA6IGBDT05TSVNURU5DWSA8Y29uc2lzdGVuY3kgbGV2ZWw+YAotCi1TZXRzIHRoZSBjb25zaXN0ZW5jeSBsZXZlbCBmb3Igb3BlcmF0aW9ucyB0byBmb2xsb3cuIFZhbGlkIGFyZ3VtZW50cwotaW5jbHVkZToKLQotKiBgQU5ZYAotKiBgT05FYAotKiBgVFdPYAotKiBgVEhSRUVgCi0qIGBRVU9SVU1gCi0qIGBBTExgCi0qIGBMT0NBTF9RVU9SVU1gCi0qIGBMT0NBTF9PTkVgCi0qIGBTRVJJQUxgCi0qIGBMT0NBTF9TRVJJQUxgCi0KLT09PSBgU0VSSUFMIENPTlNJU1RFTkNZYAotCi1gVXNhZ2VgOiBgU0VSSUFMIENPTlNJU1RFTkNZIDxjb25zaXN0ZW5jeSBsZXZlbD5gCi0KLVNldHMgdGhlIHNlcmlhbCBjb25zaXN0ZW5jeSBsZXZlbCBmb3Igb3BlcmF0aW9ucyB0byBmb2xsb3cuIFZhbGlkCi1hcmd1bWVudHMgaW5jbHVkZToKLQotKiBgU0VSSUFMYAotKiBgTE9DQUxfU0VSSUFMYAotCi1UaGUgc2VyaWFsIGNvbnNpc3RlbmN5IGxldmVsIGlzIG9ubHkgdXNlZCBieSBjb25kaXRpb25hbCB1cGRhdGVzCi0oYElOU0VSVGAsIGBVUERBVEVgIGFuZCBgREVMRVRFYCB3aXRoIGFuIGBJRmAgY29uZGl0aW9uKS4gRm9yIHRob3NlLCB0aGUKLXNlcmlhbCBjb25zaXN0ZW5jeSBsZXZlbCBkZWZpbmVzIHRoZSBjb25zaXN0ZW5jeSBsZXZlbCBvZiB0aGUgc2VyaWFsCi1waGFzZSAob3Ig4oCccGF4b3PigJ0gcGhhc2UpIHdoaWxlIHRoZSBub3JtYWwgY29uc2lzdGVuY3kgbGV2ZWwgZGVmaW5lcyB0aGUKLWNvbnNpc3RlbmN5IGZvciB0aGUg4oCcbGVhcm7igJ0gcGhhc2UsIGkuZS4gd2hhdCB0eXBlIG9mIHJlYWRzIHdpbGwgYmUKLWd1YXJhbnRlZWQgdG8gc2VlIHRoZSB1cGRhdGUgcmlnaHQgYXdheS4gRm9yIGV4YW1wbGUsIGlmIGEgY29uZGl0aW9uYWwKLXdyaXRlIGhhcyBhIGNvbnNpc3RlbmN5IGxldmVsIG9mIGBRVU9SVU1gIChhbmQgaXMgc3VjY2Vzc2Z1bCksIHRoZW4gYQotYFFVT1JVTWAgcmVhZCBpcyBndWFyYW50ZWVkIHRvIHNlZSB0aGF0IHdyaXRlLiBCdXQgaWYgdGhlIHJlZ3VsYXIKLWNvbnNpc3RlbmN5IGxldmVsIG9mIHRoYXQgd3JpdGUgaXMgYEFOWWAsIHRoZW4gb25seSBhIHJlYWQgd2l0aCBhCi1jb25zaXN0ZW5jeSBsZXZlbCBvZiBgU0VSSUFMYCBpcyBndWFyYW50ZWVkIHRvIHNlZSBpdCAoZXZlbiBhIHJlYWQgd2l0aAotY29uc2lzdGVuY3kgYEFMTGAgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgZW5vdWdoKS4KLQotPT09IGBTSE9XIFZFUlNJT05gCi0KLVByaW50cyB0aGUgYGNxbHNoYCwgQ2Fzc2FuZHJhLCBDUUwsIGFuZCBuYXRpdmUgcHJvdG9jb2wgdmVyc2lvbnMgaW4gdXNlLgotRXhhbXBsZToKLQotW3NvdXJjZSxub25lXQotLS0tLQotY3Fsc2g+IFNIT1cgVkVSU0lPTgotW2NxbHNoIDUuMC4xIHwgQ2Fzc2FuZHJhIDMuOCB8IENRTCBzcGVjIDMuNC4yIHwgTmF0aXZlIHByb3RvY29sIHY0XQotLS0tLQotCi09PT0gYFNIT1cgSE9TVGAKLQotUHJpbnRzIHRoZSBJUCBhZGRyZXNzIGFuZCBwb3J0IG9mIHRoZSBDYXNzYW5kcmEgbm9kZSB0aGF0IGBjcWxzaGAgaXMKLWNvbm5lY3RlZCB0byBpbiBhZGRpdGlvbiB0byB0aGUgY2x1c3RlciBuYW1lLiBFeGFtcGxlOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1jcWxzaD4gU0hPVyBIT1NUCi1Db25uZWN0ZWQgdG8gUHJvZF9DbHVzdGVyIGF0IDE5Mi4wLjAuMTo5MDQyLgotLS0tLQotCi09PT0gYFNIT1cgU0VTU0lPTmAKLQotUHJldHR5IHByaW50cyBhIHNwZWNpZmljIHRyYWNpbmcgc2Vzc2lvbi4KLQotYFVzYWdlYDogYFNIT1cgU0VTU0lPTiA8c2Vzc2lvbiBpZD5gCi0KLUV4YW1wbGUgdXNhZ2U6Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLWNxbHNoPiBTSE9XIFNFU1NJT04gOTVhYzY0NzAtMzI3ZS0xMWU2LWJlY2EtZGZiNjYwZDkyYWQ4Ci0KLVRyYWNpbmcgc2Vzc2lvbjogOTVhYzY0NzAtMzI3ZS0xMWU2LWJlY2EtZGZiNjYwZDkyYWQ4Ci0KLSBhY3Rpdml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aW1lc3RhbXAgICAgICAgICAgICAgICAgICB8IHNvdXJjZSAgICB8IHNvdXJjZV9lbGFwc2VkIHwgY2xpZW50Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRlIENRTDMgcXVlcnkgfCAyMDE2LTA2LTE0IDE3OjIzOjEzLjk3OTAwMCB8IDEyNy4wLjAuMSB8ICAgICAgICAgICAgICAwIHwgMTI3LjAuMC4xCi0gUGFyc2luZyBTRUxFQ1QgKiBGUk9NIHN5c3RlbS5sb2NhbDsgW1NoYXJlZFBvb2wtV29ya2VyLTFdIHwgMjAxNi0wNi0xNCAxNzoyMzoxMy45ODIwMDAgfCAxMjcuMC4wLjEgfCAgICAgICAgICAgMzg0MyB8IDEyNy4wLjAuMQotLi4uCi0tLS0tCi0KLT09PSBgU09VUkNFYAotCi1SZWFkcyB0aGUgY29udGVudHMgb2YgYSBmaWxlIGFuZCBleGVjdXRlcyBlYWNoIGxpbmUgYXMgYSBDUUwgc3RhdGVtZW50Ci1vciBzcGVjaWFsIGNxbHNoIGNvbW1hbmQuCi0KLWBVc2FnZWA6IGBTT1VSQ0UgPHN0cmluZyBmaWxlbmFtZT5gCi0KLUV4YW1wbGUgdXNhZ2U6Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLWNxbHNoPiBTT1VSQ0UgJy9ob21lL2NhbHZpbmhvYmJzL2NvbW1hbmRzLmNxbCcKLS0tLS0KLQotPT09IGBDQVBUVVJFYAotCi1CZWdpbnMgY2FwdHVyaW5nIGNvbW1hbmQgb3V0cHV0IGFuZCBhcHBlbmRpbmcgaXQgdG8gYSBzcGVjaWZpZWQgZmlsZS4KLU91dHB1dCB3aWxsIG5vdCBiZSBzaG93biBhdCB0aGUgY29uc29sZSB3aGlsZSBpdCBpcyBjYXB0dXJlZC4KLQotYFVzYWdlYDoKLQotW3NvdXJjZSxub25lXQotLS0tLQotQ0FQVFVSRSAnPGZpbGU+JzsKLUNBUFRVUkUgT0ZGOwotQ0FQVFVSRTsKLS0tLS0KLQotVGhhdCBpcywgdGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gYmUgYXBwZW5kZWQgdG8gbXVzdCBiZSBnaXZlbiBpbnNpZGUgYQotc3RyaW5nIGxpdGVyYWwuIFRoZSBwYXRoIGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKLWRpcmVjdG9yeS4gVGhlIHRpbGRlIHNob3J0aGFuZCBub3RhdGlvbiAoYCd+L215ZGlyJ2ApIGlzIHN1cHBvcnRlZCBmb3IKLXJlZmVycmluZyB0byBgJEhPTUVgLgotCi1Pbmx5IHF1ZXJ5IHJlc3VsdCBvdXRwdXQgaXMgY2FwdHVyZWQuIEVycm9ycyBhbmQgb3V0cHV0IGZyb20gY3Fsc2gtb25seQotY29tbWFuZHMgd2lsbCBzdGlsbCBiZSBzaG93biBpbiB0aGUgY3Fsc2ggc2Vzc2lvbi4KLQotVG8gc3RvcCBjYXB0dXJpbmcgb3V0cHV0IGFuZCBzaG93IGl0IGluIHRoZSBjcWxzaCBzZXNzaW9uIGFnYWluLCB1c2UKLWBDQVBUVVJFIE9GRmAuCi0KLVRvIGluc3BlY3QgdGhlIGN1cnJlbnQgY2FwdHVyZSBjb25maWd1cmF0aW9uLCB1c2UgYENBUFRVUkVgIHdpdGggbm8KLWFyZ3VtZW50cy4KLQotPT09IGBIRUxQYAotCi1HaXZlcyBpbmZvcm1hdGlvbiBhYm91dCBjcWxzaCBjb21tYW5kcy4gVG8gc2VlIGF2YWlsYWJsZSB0b3BpY3MsIGVudGVyCi1gSEVMUGAgd2l0aG91dCBhbnkgYXJndW1lbnRzLiBUbyBzZWUgaGVscCBvbiBhIHRvcGljLCB1c2UKLWBIRUxQIDx0b3BpYz5gLiBBbHNvIHNlZSB0aGUgYC0tYnJvd3NlcmAgYXJndW1lbnQgZm9yIGNvbnRyb2xsaW5nIHdoYXQKLWJyb3dzZXIgaXMgdXNlZCB0byBkaXNwbGF5IGhlbHAuCi0KLT09PSBgVFJBQ0lOR2AKLQotRW5hYmxlcyBvciBkaXNhYmxlcyB0cmFjaW5nIGZvciBxdWVyaWVzLiBXaGVuIHRyYWNpbmcgaXMgZW5hYmxlZCwgb25jZSBhCi1xdWVyeSBjb21wbGV0ZXMsIGEgdHJhY2Ugb2YgdGhlIGV2ZW50cyBkdXJpbmcgdGhlIHF1ZXJ5IHdpbGwgYmUgcHJpbnRlZC4KLQotYFVzYWdlYDoKLQotW3NvdXJjZSxub25lXQotLS0tLQotVFJBQ0lORyBPTgotVFJBQ0lORyBPRkYKLS0tLS0KLQotPT09IGBQQUdJTkdgCi0KLUVuYWJsZXMgcGFnaW5nLCBkaXNhYmxlcyBwYWdpbmcsIG9yIHNldHMgdGhlIHBhZ2Ugc2l6ZSBmb3IgcmVhZCBxdWVyaWVzLgotV2hlbiBwYWdpbmcgaXMgZW5hYmxlZCwgb25seSBvbmUgcGFnZSBvZiBkYXRhIHdpbGwgYmUgZmV0Y2hlZCBhdCBhIHRpbWUKLWFuZCBhIHByb21wdCB3aWxsIGFwcGVhciB0byBmZXRjaCB0aGUgbmV4dCBwYWdlLiBHZW5lcmFsbHksIGl0J3MgYSBnb29kCi1pZGVhIHRvIGxlYXZlIHBhZ2luZyBlbmFibGVkIGluIGFuIGludGVyYWN0aXZlIHNlc3Npb24gdG8gYXZvaWQgZmV0Y2hpbmcKLWFuZCBwcmludGluZyBsYXJnZSBhbW91bnRzIG9mIGRhdGEgYXQgb25jZS4KLQotYFVzYWdlYDoKLQotW3NvdXJjZSxub25lXQotLS0tLQotUEFHSU5HIE9OCi1QQUdJTkcgT0ZGCi1QQUdJTkcgPHBhZ2Ugc2l6ZSBpbiByb3dzPgotLS0tLQotCi09PT0gYEVYUEFORGAKLQotRW5hYmxlcyBvciBkaXNhYmxlcyB2ZXJ0aWNhbCBwcmludGluZyBvZiByb3dzLiBFbmFibGluZyBgRVhQQU5EYCBpcwotdXNlZnVsIHdoZW4gbWFueSBjb2x1bW5zIGFyZSBmZXRjaGVkLCBvciB0aGUgY29udGVudHMgb2YgYSBzaW5nbGUgY29sdW1uCi1hcmUgbGFyZ2UuCi0KLWBVc2FnZWA6Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLUVYUEFORCBPTgotRVhQQU5EIE9GRgotLS0tLQotCi09PT0gYExPR0lOYAotCi1BdXRoZW50aWNhdGUgYXMgYSBzcGVjaWZpZWQgQ2Fzc2FuZHJhIHVzZXIgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24uCi0KLWBVc2FnZWA6Ci0KLVtzb3VyY2Usbm9uZV0KLS0tLS0KLUxPR0lOIDx1c2VybmFtZT4gWzxwYXNzd29yZD5dCi0tLS0tCi0KLT09PSBgRVhJVGAKLQotRW5kcyB0aGUgY3VycmVudCBzZXNzaW9uIGFuZCB0ZXJtaW5hdGVzIHRoZSBjcWxzaCBwcm9jZXNzLgotCi1gVXNhZ2VgOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1FWElUCi1RVUlUCi0tLS0tCi0KLT09PSBgQ0xFQVJgCi0KLUNsZWFycyB0aGUgY29uc29sZS4KLQotYFVzYWdlYDoKLQotW3NvdXJjZSxub25lXQotLS0tLQotQ0xFQVIKLUNMUwotLS0tLQotCi09PT0gYERFU0NSSUJFYAotCi1QcmludHMgYSBkZXNjcmlwdGlvbiAodHlwaWNhbGx5IGEgc2VyaWVzIG9mIERETCBzdGF0ZW1lbnRzKSBvZiBhIHNjaGVtYQotZWxlbWVudCBvciB0aGUgY2x1c3Rlci4gVGhpcyBpcyB1c2VmdWwgZm9yIGR1bXBpbmcgYWxsIG9yIHBvcnRpb25zIG9mCi10aGUgc2NoZW1hLgotCi1gVXNhZ2VgOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1ERVNDUklCRSBDTFVTVEVSCi1ERVNDUklCRSBTQ0hFTUEKLURFU0NSSUJFIEtFWVNQQUNFUwotREVTQ1JJQkUgS0VZU1BBQ0UgPGtleXNwYWNlIG5hbWU+Ci1ERVNDUklCRSBUQUJMRVMKLURFU0NSSUJFIFRBQkxFIDx0YWJsZSBuYW1lPgotREVTQ1JJQkUgSU5ERVggPGluZGV4IG5hbWU+Ci1ERVNDUklCRSBNQVRFUklBTElaRUQgVklFVyA8dmlldyBuYW1lPgotREVTQ1JJQkUgVFlQRVMKLURFU0NSSUJFIFRZUEUgPHR5cGUgbmFtZT4KLURFU0NSSUJFIEZVTkNUSU9OUwotREVTQ1JJQkUgRlVOQ1RJT04gPGZ1bmN0aW9uIG5hbWU+Ci1ERVNDUklCRSBBR0dSRUdBVEVTCi1ERVNDUklCRSBBR0dSRUdBVEUgPGFnZ3JlZ2F0ZSBmdW5jdGlvbiBuYW1lPgotLS0tLQotCi1JbiBhbnkgb2YgdGhlIGNvbW1hbmRzLCBgREVTQ2AgbWF5IGJlIHVzZWQgaW4gcGxhY2Ugb2YgYERFU0NSSUJFYC4KLQotVGhlIGBERVNDUklCRSBDTFVTVEVSYCBjb21tYW5kIHByaW50cyB0aGUgY2x1c3RlciBuYW1lIGFuZCBwYXJ0aXRpb25lcjoKLQotW3NvdXJjZSxub25lXQotLS0tLQotY3Fsc2g+IERFU0NSSUJFIENMVVNURVIKLQotQ2x1c3RlcjogVGVzdCBDbHVzdGVyCi1QYXJ0aXRpb25lcjogTXVybXVyM1BhcnRpdGlvbmVyCi0tLS0tCi0KLVRoZSBgREVTQ1JJQkUgU0NIRU1BYCBjb21tYW5kIHByaW50cyB0aGUgRERMIHN0YXRlbWVudHMgbmVlZGVkIHRvCi1yZWNyZWF0ZSB0aGUgZW50aXJlIHNjaGVtYS4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IgZHVtcGluZyB0aGUKLXNjaGVtYSBpbiBvcmRlciB0byBjbG9uZSBhIGNsdXN0ZXIgb3IgcmVzdG9yZSBmcm9tIGEgYmFja3VwLgotCi09PT0gYENPUFkgVE9gCi0KLUNvcGllcyBkYXRhIGZyb20gYSB0YWJsZSB0byBhIENTViBmaWxlLgotCi1gVXNhZ2VgOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1DT1BZIDx0YWJsZSBuYW1lPiBbKDxjb2x1bW4+LCAuLi4pXSBUTyA8ZmlsZSBuYW1lPiBXSVRIIDxjb3B5IG9wdGlvbj4gW0FORCA8Y29weSBvcHRpb24+IC4uLl0KLS0tLS0KLQotSWYgbm8gY29sdW1ucyBhcmUgc3BlY2lmaWVkLCBhbGwgY29sdW1ucyBmcm9tIHRoZSB0YWJsZSB3aWxsIGJlIGNvcGllZAotdG8gdGhlIENTViBmaWxlLiBBIHN1YnNldCBvZiBjb2x1bW5zIHRvIGNvcHkgbWF5IGJlIHNwZWNpZmllZCBieSBhZGRpbmcKLWEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY29sdW1uIG5hbWVzIHN1cnJvdW5kZWQgYnkgcGFyZW50aGVzaXMgYWZ0ZXIKLXRoZSB0YWJsZSBuYW1lLgotCi1UaGUgYDxmaWxlIG5hbWU+YCBzaG91bGQgYmUgYSBzdHJpbmcgbGl0ZXJhbCAod2l0aCBzaW5nbGUgcXVvdGVzKQotcmVwcmVzZW50aW5nIGEgcGF0aCB0byB0aGUgZGVzdGluYXRpb24gZmlsZS4gVGhpcyBjYW4gYWxzbyB0aGUgc3BlY2lhbAotdmFsdWUgYFNURE9VVGAgKHdpdGhvdXQgc2luZ2xlIHF1b3RlcykgdG8gcHJpbnQgdGhlIENTViB0byBzdGRvdXQuCi0KLVNlZSBgc2hhcmVkLWNvcHktb3B0aW9uc2AgZm9yIG9wdGlvbnMgdGhhdCBhcHBseSB0byBib3RoIGBDT1BZIFRPYCBhbmQKLWBDT1BZIEZST01gLgotCi09PT09IE9wdGlvbnMgZm9yIGBDT1BZIFRPYAotCi1gTUFYUkVRVUVTVFNgOjoKLSAgVGhlIG1heGltdW0gbnVtYmVyIHRva2VuIHJhbmdlcyB0byBmZXRjaCBzaW11bHRhbmVvdXNseS4gRGVmYXVsdHMgdG8KLSAgNi4KLWBQQUdFU0laRWA6OgotICBUaGUgbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2ggaW4gYSBzaW5nbGUgcGFnZS4gRGVmYXVsdHMgdG8gMTAwMC4KLWBQQUdFVElNRU9VVGA6OgotICBCeSBkZWZhdWx0IHRoZSBwYWdlIHRpbWVvdXQgaXMgMTAgc2Vjb25kcyBwZXIgMTAwMCBlbnRyaWVzIGluIHRoZSBwYWdlCi0gIHNpemUgb3IgMTAgc2Vjb25kcyBpZiBwYWdlc2l6ZSBpcyBzbWFsbGVyLgotYEJFR0lOVE9LRU5gLCBgRU5EVE9LRU5gOjoKLSAgVG9rZW4gcmFuZ2UgdG8gZXhwb3J0LiBEZWZhdWx0cyB0byBleHBvcnRpbmcgdGhlIGZ1bGwgcmluZy4KLWBNQVhPVVRQVVRTSVpFYDo6Ci0gIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG91dHB1dCBmaWxlIG1lYXN1cmVkIGluIG51bWJlciBvZiBsaW5lczsKLSAgYmV5b25kIHRoaXMgbWF4aW11bSB0aGUgb3V0cHV0IGZpbGUgd2lsbCBiZSBzcGxpdCBpbnRvIHNlZ21lbnRzLiAtMQotICBtZWFucyB1bmxpbWl0ZWQsIGFuZCBpcyB0aGUgZGVmYXVsdC4KLWBFTkNPRElOR2A6OgotICBUaGUgZW5jb2RpbmcgdXNlZCBmb3IgY2hhcmFjdGVycy4gRGVmYXVsdHMgdG8gYHV0ZjhgLgotCi09PT0gYENPUFkgRlJPTWAKLQotQ29waWVzIGRhdGEgZnJvbSBhIENTViBmaWxlIHRvIHRhYmxlLgotCi1gVXNhZ2VgOgotCi1bc291cmNlLG5vbmVdCi0tLS0tCi1DT1BZIDx0YWJsZSBuYW1lPiBbKDxjb2x1bW4+LCAuLi4pXSBGUk9NIDxmaWxlIG5hbWU+IFdJVEggPGNvcHkgb3B0aW9uPiBbQU5EIDxjb3B5IG9wdGlvbj4gLi4uXQotLS0tLQotCi1JZiBubyBjb2x1bW5zIGFyZSBzcGVjaWZpZWQsIGFsbCBjb2x1bW5zIGZyb20gdGhlIENTViBmaWxlIHdpbGwgYmUKLWNvcGllZCB0byB0aGUgdGFibGUuIEEgc3Vic2V0IG9mIGNvbHVtbnMgdG8gY29weSBtYXkgYmUgc3BlY2lmaWVkIGJ5Ci1hZGRpbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBjb2x1bW4gbmFtZXMgc3Vycm91bmRlZCBieSBwYXJlbnRoZXNpcwotYWZ0ZXIgdGhlIHRhYmxlIG5hbWUuCi0KLVRoZSBgPGZpbGUgbmFtZT5gIHNob3VsZCBiZSBhIHN0cmluZyBsaXRlcmFsICh3aXRoIHNpbmdsZSBxdW90ZXMpCi1yZXByZXNlbnRpbmcgYSBwYXRoIHRvIHRoZSBzb3VyY2UgZmlsZS4gVGhpcyBjYW4gYWxzbyB0aGUgc3BlY2lhbCB2YWx1ZQotYFNURElOYCAod2l0aG91dCBzaW5nbGUgcXVvdGVzKSB0byByZWFkIHRoZSBDU1YgZGF0YSBmcm9tIHN0ZGluLgotCi1TZWUgYHNoYXJlZC1jb3B5LW9wdGlvbnNgIGZvciBvcHRpb25zIHRoYXQgYXBwbHkgdG8gYm90aCBgQ09QWSBUT2AgYW5kCi1gQ09QWSBGUk9NYC4KLQotPT09PSBPcHRpb25zIGZvciBgQ09QWSBUT2AKLQotYElOR0VTVFJBVEVgOjoKLSAgVGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gcHJvY2VzcyBwZXIgc2Vjb25kLiBEZWZhdWx0cyB0byAxMDAwMDAuCi1gTUFYUk9XU2A6OgotICBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBpbXBvcnQuIC0xIG1lYW5zIHVubGltaXRlZCwgYW5kIGlzIHRoZQotICBkZWZhdWx0LgotYFNLSVBST1dTYDo6Ci0gIEEgbnVtYmVyIG9mIGluaXRpYWwgcm93cyB0byBza2lwLiBEZWZhdWx0cyB0byAwLgotYFNLSVBDT0xTYDo6Ci0gIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgY29sdW1uIG5hbWVzIHRvIGlnbm9yZS4gQnkgZGVmYXVsdCwgbm8KLSAgY29sdW1ucyBhcmUgc2tpcHBlZC4KLWBNQVhQQVJTRUVSUk9SU2A6OgotICBUaGUgbWF4aW11bSBnbG9iYWwgbnVtYmVyIG9mIHBhcnNpbmcgZXJyb3JzIHRvIGlnbm9yZS4gLTEgbWVhbnMKLSAgdW5saW1pdGVkLCBhbmQgaXMgdGhlIGRlZmF1bHQuCi1gTUFYSU5TRVJURVJST1JTYDo6Ci0gIFRoZSBtYXhpbXVtIGdsb2JhbCBudW1iZXIgb2YgaW5zZXJ0IGVycm9ycyB0byBpZ25vcmUuIC0xIG1lYW5zCi0gIHVubGltaXRlZC4gVGhlIGRlZmF1bHQgaXMgMTAwMC4KLWBFUlJGSUxFYCA9OjoKLSAgQSBmaWxlIHRvIHN0b3JlIGFsbCByb3dzIHRoYXQgY291bGQgbm90IGJlIGltcG9ydGVkLCBieSBkZWZhdWx0IHRoaXMKLSAgaXMgYGltcG9ydF88a3M+Xzx0YWJsZT4uZXJyYCB3aGVyZSBgPGtzPmAgaXMgeW91ciBrZXlzcGFjZSBhbmQKLSAgYDx0YWJsZT5gIGlzIHlvdXIgdGFibGUgbmFtZS4KLWBNQVhCQVRDSFNJWkVgOjoKLSAgVGhlIG1heCBudW1iZXIgb2Ygcm93cyBpbnNlcnRlZCBpbiBhIHNpbmdsZSBiYXRjaC4gRGVmYXVsdHMgdG8gMjAuCi1gTUlOQkFUQ0hTSVpFYDo6Ci0gIFRoZSBtaW4gbnVtYmVyIG9mIHJvd3MgaW5zZXJ0ZWQgaW4gYSBzaW5nbGUgYmF0Y2guIERlZmF1bHRzIHRvIDIuCi1gQ0hVTktTSVpFYDo6Ci0gIFRoZSBudW1iZXIgb2Ygcm93cyB0aGF0IGFyZSBwYXNzZWQgdG8gY2hpbGQgd29ya2VyIHByb2Nlc3NlcyBmcm9tIHRoZQotICBtYWluIHByb2Nlc3MgYXQgYSB0aW1lLiBEZWZhdWx0cyB0byAxMDAwLgotCi09PT09IFNoYXJlZCBDT1BZIE9wdGlvbnMKLQotT3B0aW9ucyB0aGF0IGFyZSBjb21tb24gdG8gYm90aCBgQ09QWSBUT2AgYW5kIGBDT1BZIEZST01gLgotCi1gTlVMTFZBTGA6OgotICBUaGUgc3RyaW5nIHBsYWNlaG9sZGVyIGZvciBudWxsIHZhbHVlcy4gRGVmYXVsdHMgdG8gYG51bGxgLgotYEhFQURFUmA6OgotICBGb3IgYENPUFkgVE9gLCBjb250cm9scyB3aGV0aGVyIHRoZSBmaXJzdCBsaW5lIGluIHRoZSBDU1Ygb3V0cHV0IGZpbGUKLSAgd2lsbCBjb250YWluIHRoZSBjb2x1bW4gbmFtZXMuIEZvciBDT1BZIEZST00sIHNwZWNpZmllcyB3aGV0aGVyIHRoZQotICBmaXJzdCBsaW5lIGluIHRoZSBDU1YgaW5wdXQgZmlsZSBjb250YWlucyBjb2x1bW4gbmFtZXMuIERlZmF1bHRzIHRvCi0gIGBmYWxzZWAuCi1gREVDSU1BTFNFUGA6OgotICBUaGUgY2hhcmFjdGVyIHRoYXQgaXMgdXNlZCBhcyB0aGUgZGVjaW1hbCBwb2ludCBzZXBhcmF0b3IuIERlZmF1bHRzIHRvCi0gIGAuYC4KLWBUSE9VU0FORFNTRVBgOjoKLSAgVGhlIGNoYXJhY3RlciB0aGF0IGlzIHVzZWQgdG8gc2VwYXJhdGUgdGhvdXNhbmRzLiBEZWZhdWx0cyB0byB0aGUKLSAgZW1wdHkgc3RyaW5nLgotYEJPT0xTVFlsRWA6OgotICBUaGUgc3RyaW5nIGxpdGVyYWwgZm9ybWF0IGZvciBib29sZWFuIHZhbHVlcy4gRGVmYXVsdHMgdG8KLSAgYFRydWUsRmFsc2VgLgotYE5VTVBST0NFU1NFU2A6OgotICBUaGUgbnVtYmVyIG9mIGNoaWxkIHdvcmtlciBwcm9jZXNzZXMgdG8gY3JlYXRlIGZvciBgQ09QWWAgdGFza3MuCi0gIERlZmF1bHRzIHRvIGEgbWF4IG9mIDQgZm9yIGBDT1BZIEZST01gIGFuZCAxNiBmb3IgYENPUFkgVE9gLiBIb3dldmVyLAotICBhdCBtb3N0IChudW1fY29yZXMgLSAxKSBwcm9jZXNzZXMgd2lsbCBiZSBjcmVhdGVkLgotYE1BWEFUVEVNUFRTYDo6Ci0gIFRoZSBtYXhpbXVtIG51bWJlciBvZiBmYWlsZWQgYXR0ZW1wdHMgdG8gZmV0Y2ggYSByYW5nZSBvZiBkYXRhICh3aGVuCi0gIHVzaW5nIGBDT1BZIFRPYCkgb3IgaW5zZXJ0IGEgY2h1bmsgb2YgZGF0YSAod2hlbiB1c2luZyBgQ09QWSBGUk9NYCkKLSAgYmVmb3JlIGdpdmluZyB1cC4gRGVmYXVsdHMgdG8gNS4KLWBSRVBPUlRGUkVRVUVOQ1lgOjoKLSAgSG93IG9mdGVuIHN0YXR1cyB1cGRhdGVzIGFyZSByZWZyZXNoZWQsIGluIHNlY29uZHMuIERlZmF1bHRzIHRvIDAuMjUuCi1gUkFURUZJTEVgOjoKLSAgQW4gb3B0aW9uYWwgZmlsZSB0byBvdXRwdXQgcmF0ZSBzdGF0aXN0aWNzIHRvLiBCeSBkZWZhdWx0LCBzdGF0aXN0aWNzCi0gIGFyZSBub3Qgb3V0cHV0IHRvIGEgZmlsZS4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL2luZGV4LmFkb2MgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFnZXMvdG9vbHMvc3N0YWJsZS9pbmRleC5hZG9jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjc4N2VjLi4wMDAwMDAwCi0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL2luZGV4LmFkb2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi09IFNTVGFibGUgVG9vbHMKLQotVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgdmFyaW91cyBzc3RhYmxlIHRvb2xzLgotCi1DYXNzYW5kcmEgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSB0aGVzZSB0b29scyBhcmUgZXhlY3V0ZWQsIG9yIHVuZXhwZWN0ZWQKLXJlc3VsdHMgd2lsbCBvY2N1ci4gTm90ZTogdGhlIHNjcmlwdHMgZG8gbm90IHZlcmlmeSB0aGF0IENhc3NhbmRyYSBpcwotc3RvcHBlZC4KLQotKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZWR1bXAuYWRvY1tzc3RhYmxlZHVtcF0KLSogeHJlZjp0b29scy9zc3RhYmxlL3NzdGFibGVleHBpcmVkYmxvY2tlcnMuYWRvY1tzc3RhYmxlZXhwaXJlZGJsb2NrZXJzXQotKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZWxldmVscmVzZXQuYWRvY1tzc3RhYmxlbGV2ZWxyZXNldF0KLSogeHJlZjp0b29scy9zc3RhYmxlL3NzdGFibGVsb2FkZXIuYWRvY1tzc3RhYmxlbG9hZGVyXQotKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZW1ldGFkYXRhLmFkb2Nbc3N0YWJsZW1ldGFkYXRhXQotKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZW9mZmxpbmVyZWxldmVsLmFkb2Nbc3N0YWJsZW9mZmxpbmVyZWxldmVsXQotKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZXJlcGFpcmVkc2V0LmFkb2Nbc3N0YWJsZXJlcGFpcmRzZXRdCi0qIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxlc2NydWIuYWRvY1tzc3RhYmxlc2NydWJdCi0qIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxlc3BsaXQuYWRvY1tzc3RhYmxlc3BsaXRdCi0qIHhyZWY6dG9vbHMvc3N0YWJsZS9zc3RhYmxldXBncmFkZS5hZG9jW3NzdGFibGV1cGdyYWRlXQotKiB4cmVmOnRvb2xzL3NzdGFibGUvc3N0YWJsZXV0aWwuYWRvY1tzc3RhYmxldXRpbF0KLSogeHJlZjp0b29scy9zc3RhYmxlL3NzdGFibGV2ZXJpZnkuYWRvY1tzc3RhYmxldmVyaWZ5XQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZWxldmVscmVzZXQuYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYWdlcy90b29scy9zc3RhYmxlL3NzdGFibGVsZXZlbHJlc2V0LmFkb2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZGMwMmUuLjAwMDAwMDAKLS0tIGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhZ2VzL3Rvb2xzL3NzdGFibGUvc3N0YWJsZWxldmVscmVzZXQuYWRvYworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLT0gc3N0YWJsZWxldmVscmVzZXQKLQotSWYgTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneSBpcyBzZXQsIHRoaXMgc2NyaXB0IGNhbiBiZSB1c2VkIHRvIHJlc2V0Ci1sZXZlbCB0byAwIG9uIGEgZ2l2ZW4gc2V0IG9mIHNzdGFibGVzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bywKLWZvciBleGFtcGxlLCBjaGFuZ2UgdGhlIG1pbmltdW0gc3N0YWJsZSBzaXplLCBhbmQgdGhlcmVmb3JlIHJlc3RhcnQgdGhlCi1jb21wYWN0aW9uIHByb2Nlc3MgdXNpbmcgdGhpcyBuZXcgY29uZmlndXJhdGlvbi4KLQotU2VlCi1odHRwOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvZG9jL2xhdGVzdC9vcGVyYXRpbmcvY29tcGFjdGlvbi5odG1sI2xldmVsZWQtY29tcGFjdGlvbi1zdHJhdGVneQotZm9yIGluZm9ybWF0aW9uIG9uIGhvdyBsZXZlbHMgYXJlIHVzZWQgaW4gdGhpcyBjb21wYWN0aW9uIHN0cmF0ZWd5LgotCi1DYXNzYW5kcmEgbXVzdCBiZSBzdG9wcGVkIGJlZm9yZSB0aGlzIHRvb2wgaXMgZXhlY3V0ZWQsIG9yIHVuZXhwZWN0ZWQKLXJlc3VsdHMgd2lsbCBvY2N1ci4gTm90ZTogdGhlIHNjcmlwdCBkb2VzIG5vdCB2ZXJpZnkgdGhhdCBDYXNzYW5kcmEgaXMKLXN0b3BwZWQuCi0KLXJlZjogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtNTI3MQotCi09PSBVc2FnZQotCi1zc3RhYmxlbGV2ZWxyZXNldCAtLXJlYWxseS1yZXNldCA8a2V5c3BhY2U+IDx0YWJsZT4KLQotVGhlIHJlYWxseS1yZXNldCBmbGFnIGlzIHJlcXVpcmVkLCB0byBlbnN1cmUgdGhpcyBpbnRydXNpdmUgY29tbWFuZCBpcwotbm90IHJ1biBhY2NpZGVudGFsbHkuCi0KLT09IFRhYmxlIG5vdCBmb3VuZAotCi1JZiB0aGUga2V5c3BhY2UgYW5kL29yIHRhYmxlIGlzIG5vdCBpbiB0aGUgc2NoZW1hIChlLmcuLCBpZiB5b3UKLW1pc3NwZWxsZWQgdGhlIHRhYmxlIG5hbWUpLCB0aGUgc2NyaXB0IHdpbGwgcmV0dXJuIGFuIGVycm9yLgotCi1FeGFtcGxlOgotCi0uLi4uCi1Db2x1bW5GYW1pbHkgbm90IGZvdW5kOiBrZXlzcGFjZS9ldmVubG9nLgotLi4uLgotCi09PSBUYWJsZSBoYXMgbm8gc3N0YWJsZXMKLQotRXhhbXBsZToKLQotLi4uLgotRm91bmQgbm8gc3N0YWJsZXMsIGRpZCB5b3UgZ2l2ZSB0aGUgY29ycmVjdCBrZXlzcGFjZS90YWJsZT8KLS4uLi4KLQotPT0gVGFibGUgYWxyZWFkeSBhdCBsZXZlbCAwCi0KLVRoZSBzY3JpcHQgd2lsbCBub3Qgc2V0IHRoZSBsZXZlbCBpZiBpdCBpcyBhbHJlYWR5IHNldCB0byAwLgotCi1FeGFtcGxlOgotCi0uLi4uCi1Ta2lwcGVkIC92YXIvbGliL2Nhc3NhbmRyYS9kYXRhL2tleXNwYWNlL2V2ZW50bG9nLTY1YzQyOWUwOGM1YTExZTg5MzllZGY0ZjQwMzk3OWVmL21jLTEtYmlnLURhdGEuZGIgc2luY2UgaXQgaXMgYWxyZWFkeSBvbiBsZXZlbCAwCi0uLi4uCi0KLT09IFRhYmxlIGxldmVscyByZWR1Y2VkIHRvIDAKLQotSWYgdGhlIGxldmVsIGlzIG5vdCBhbHJlYWR5IDAsIHRoZW4gdGhpcyB3aWxsIHJlc2V0IGl0IHRvIDAuCi0KLUV4YW1wbGU6Ci0KLS4uLi4KLXNzdGFibGVtZXRhZGF0YSAvdmFyL2xpYi9jYXNzYW5kcmEvZGF0YS9rZXlzcGFjZS9ldmVudGxvZy02MzY1MzMyMDk0ZGQxMWU4OGYzMjRmOWM1MDNlNDc1My9tYy04LWJpZy1EYXRhLmRiIHwgZ3JlcCAtaSBsZXZlbAotU1NUYWJsZSBMZXZlbDogMQotCi1zc3RhYmxlbGV2ZWxyZXNldCAtLXJlYWxseS1yZXNldCBrZXlzcGFjZSBldmVudGxvZwotQ2hhbmdpbmcgbGV2ZWwgZnJvbSAxIHRvIDAgb24gL3Zhci9saWIvY2Fzc2FuZHJhL2RhdGEva2V5c3BhY2UvZXZlbnRsb2ctNjM2NTMzMjA5NGRkMTFlODhmMzI0ZjljNTAzZTQ3NTMvbWMtOC1iaWctRGF0YS5kYgotCi1zc3RhYmxlbWV0YWRhdGEgL3Zhci9saWIvY2Fzc2FuZHJhL2RhdGEva2V5c3BhY2UvZXZlbnRsb2ctNjM2NTMzMjA5NGRkMTFlODhmMzI0ZjljNTAzZTQ3NTMvbWMtOC1iaWctRGF0YS5kYiB8IGdyZXAgLWkgbGV2ZWwKLVNTVGFibGUgTGV2ZWw6IDAKLS4uLi4KZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYXJ0aWFscy9tYXNraW5nX2Z1bmN0aW9ucy5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhcnRpYWxzL21hc2tpbmdfZnVuY3Rpb25zLmFkb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZhZGNkMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYXJ0aWFscy9tYXNraW5nX2Z1bmN0aW9ucy5hZG9jCkBAIC0wLDAgKzEsNjEgQEAKK1tjb2xzPSIsIixvcHRpb25zPSJoZWFkZXIiLF0KK3w9PT0KK3xGdW5jdGlvbiB8IERlc2NyaXB0aW9uCisKK3wgYG1hc2tfbnVsbCh2YWx1ZSlgIHwgUmVwbGFjZXMgdGhlIGZpcnN0IGFyZ3VtZW50IGJ5IGEgYG51bGxgIGNvbHVtbi4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGFsd2F5cyBhbiBhYnNlbnQgY29sdW1uLCBhcyBpdCBkaWRuJ3QgZXhpc3QsIGFuZCBub3QgYSBub3QtbnVsbCBjb2x1bW4gcmVwcmVzZW50aW5nIGEgYG51bGxgIHZhbHVlLgorCitFeGFtcGxlczoKKworYG1hc2tfbnVsbCgnQWxpY2UnKWAgLT4gYG51bGxgCisKK2BtYXNrX251bGwoMTIzKWAgLT4gYG51bGxgCisKK3wgYG1hc2tfZGVmYXVsdCh2YWx1ZSlgIHwgUmVwbGFjZXMgaXRzIGFyZ3VtZW50IGJ5IGFuIGFyYml0cmFyeSwgZml4ZWQgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc2FtZSB0eXBlLiBUaGlzIHdpbGwgYmUgYFwqKipcKioqYCBmb3IgdGV4dCB2YWx1ZXMsIHplcm8gZm9yIG51bWVyaWMgdmFsdWVzLCBgZmFsc2VgIGZvciBib29sZWFucywgZXRjLgorCitFeGFtcGxlczoKKworYG1hc2tfZGVmYXVsdCgnQWxpY2UnKWAgLT4gYCdcKioqKidgCisKK2BtYXNrX2RlZmF1bHQoMTIzKWAgLT4gYDBgCisKK3wgYG1hc2tfcmVwbGFjZSh2YWx1ZSwgcmVwbGFjZW1lbnRdKWAgfCBSZXBsYWNlcyB0aGUgZmlyc3QgYXJndW1lbnQgYnkgdGhlIHJlcGxhY2VtZW50IHZhbHVlIG9uIHRoZSBzZWNvbmQgYXJndW1lbnQuIFRoZSByZXBsYWNlbWVudCB2YWx1ZSBuZWVkcyB0byBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgdGhlIHJlcGxhY2VkIHZhbHVlLgorCitFeGFtcGxlczoKKworYG1hc2tfcmVwbGFjZSgnQWxpY2UnLCAnUkVEQUNURUQnKWAgLT4gYCdSRURBQ1RFRCdgCisKK2BtYXNrX3JlcGxhY2UoMTIzLCAtMSlgIC0+IGAtMWAKKworfCBgbWFza19pbm5lcih2YWx1ZSwgYmVnaW4sIGVuZCwgW3BhZGRpbmddKWAgfCBSZXR1cm5zIGEgY29weSBvZiB0aGUgZmlyc3QgYHRleHRgLCBgdmFyY2hhcmAgb3IgYGFzY2lpYCBhcmd1bWVudCwgcmVwbGFjaW5nIGVhY2ggY2hhcmFjdGVyIGV4Y2VwdCB0aGUgZmlyc3QgYW5kIGxhc3Qgb25lcyBieSBhIHBhZGRpbmcgY2hhcmFjdGVyLiBUaGUgMm5kIGFuZCAzcmQgYXJndW1lbnRzIGFyZSB0aGUgc2l6ZSBvZiB0aGUgZXhwb3NlZCBwcmVmaXggYW5kIHN1ZmZpeC4gVGhlIG9wdGlvbmFsIDR0aCBhcmd1bWVudCBpcyB0aGUgcGFkZGluZyBjaGFyYWN0ZXIsIGBcKmAgYnkgZGVmYXVsdC4KKworRXhhbXBsZXM6CisKK2BtYXNrX2lubmVyKCdBbGljZScsIDEsIDIpYCAtPiBgJ0EqKmNlJ2AKKworYG1hc2tfaW5uZXIoJ0FsaWNlJywgMSwgbnVsbClgIC0+IGAnQSoqKionYAorCitgbWFza19pbm5lcignQWxpY2UnLCBudWxsLCAyKWAgLT4gYCcqKipjZSdgCisKK2BtYXNrX2lubmVyKCdBbGljZScsIDIsIDEsICdcIycpYCAtPiBgJ0FsIyNlJ2AKKworfCBgbWFza19vdXRlcih2YWx1ZSwgYmVnaW4sIGVuZCwgW3BhZGRpbmddKWAgfCBSZXR1cm5zIGEgY29weSBvZiB0aGUgZmlyc3QgYHRleHRgLCBgdmFyY2hhcmAgb3IgYGFzY2lpYCBhcmd1bWVudCwgcmVwbGFjaW5nIHRoZSBmaXJzdCBhbmQgbGFzdCBjaGFyYWN0ZXIgYnkgYSBwYWRkaW5nIGNoYXJhY3Rlci4gVGhlIDJuZCBhbmQgM3JkIGFyZ3VtZW50cyBhcmUgdGhlIHNpemUgb2YgdGhlIGV4cG9zZWQgcHJlZml4IGFuZCBzdWZmaXguIFRoZSBvcHRpb25hbCA0dGggYXJndW1lbnQgaXMgdGhlIHBhZGRpbmcgY2hhcmFjdGVyLCBgXCpgIGJ5IGRlZmF1bHQuCisKK0V4YW1wbGVzOgorCitgbWFza19vdXRlcignQWxpY2UnLCAxLCAyKWAgLT4gYCcqbGkqKidgCisKK2BtYXNrX291dGVyKCdBbGljZScsIDEsIG51bGwpYCAtPiBgJypsaWNlJ2AKKworYG1hc2tfb3V0ZXIoJ0FsaWNlJywgbnVsbCwgMilgIC0+IGAnQWxpKionYAorCitgbWFza19vdXRlcignQWxpY2UnLCAyLCAxLCAnXCMnKWAgLT4gYCcjI2ljIydgCisKK3wgYG1hc2tfaGFzaCh2YWx1ZSwgW2FsZ29yaXRobV0pYCB8IFJldHVybnMgYSBgYmxvYmAgY29udGFpbmluZyB0aGUgaGFzaCBvZiB0aGUgZmlyc3QgYXJndW1lbnQuIFRoZSBvcHRpb25hbCAybmQgYXJndW1lbnQgaXMgdGhlIGhhc2hpbmcgYWxnb3JpdGhtIHRvIGJlIHVzZWQsIGFjY29yZGluZyB0aGUgYXZhaWxhYmxlIEphdmEgc2VjdXJpdHkgcHJvdmlkZXIuIFRoZSBkZWZhdWx0IGhhc2hpbmcgYWxnb3JpdGhtIGlzIGBTSEEtMjU2YC4KKworRXhhbXBsZXM6CisKK2BtYXNrX2hhc2goJ0FsaWNlJylgCisKK2BtYXNrX2hhc2goJ0FsaWNlJywgJ1NIQS01MTInKWAKKworfD09PQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYXJ0aWFscy9ub2RldG9vbF9hbmRfY3Fsc2guYWRvYyBiL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYXJ0aWFscy9ub2RldG9vbF9hbmRfY3Fsc2guYWRvYwppbmRleCBkMWM0ZTczLi44MGRhOTE1IDEwMDY0NAotLS0gYS9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFydGlhbHMvbm9kZXRvb2xfYW5kX2NxbHNoLmFkb2MKKysrIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhcnRpYWxzL25vZGV0b29sX2FuZF9jcWxzaC5hZG9jCkBAIC0xLDUgKzEsNSBAQAogTk9URTogRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb25maWd1cmUgeW91ciBpbnN0YWxsYXRpb24sIHNlZQote2Nhc3NfdXJsfWRvYy9sYXRlc3QvZ2V0dGluZ19zdGFydGVkL2NvbmZpZ3VyaW5nLmh0bWxbQ29uZmlndXJpbmcKK3tjYXNzX3VybH1kb2MvbGF0ZXN0L2dldHRpbmctc3RhcnRlZC9jb25maWd1cmluZy5odG1sW0NvbmZpZ3VyaW5nCiBDYXNzYW5kcmFdLgogCiBbYXJhYmljLCBzdGFydD03XQpkaWZmIC0tZ2l0IGEvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhcnRpYWxzL25vZGV0b29sX2FuZF9jcWxzaF9ub2Jpbi5hZG9jIGIvZG9jL21vZHVsZXMvY2Fzc2FuZHJhL3BhcnRpYWxzL25vZGV0b29sX2FuZF9jcWxzaF9ub2Jpbi5hZG9jCmluZGV4IGMxNzk0OWMuLmJmNzRhZDIgMTAwNjQ0Ci0tLSBhL2RvYy9tb2R1bGVzL2Nhc3NhbmRyYS9wYXJ0aWFscy9ub2RldG9vbF9hbmRfY3Fsc2hfbm9iaW4uYWRvYworKysgYi9kb2MvbW9kdWxlcy9jYXNzYW5kcmEvcGFydGlhbHMvbm9kZXRvb2xfYW5kX2NxbHNoX25vYmluLmFkb2MKQEAgLTEsNSArMSw1IEBACiBOT1RFOiBGb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbmZpZ3VyZSB5b3VyIGluc3RhbGxhdGlvbiwgc2VlCi17Y2Fzc191cmx9ZG9jL2xhdGVzdC9nZXR0aW5nX3N0YXJ0ZWQvY29uZmlndXJpbmcuaHRtbFtDb25maWd1cmluZwore2Nhc3NfdXJsfWRvYy9sYXRlc3QvZ2V0dGluZy1zdGFydGVkL2NvbmZpZ3VyaW5nLmh0bWxbQ29uZmlndXJpbmcKIENhc3NhbmRyYV0uCiAKIFthcmFiaWMsIHN0YXJ0PTddCmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2wtZmFjdG9yeS9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvS3ViZXJuZXRlc1NlY3JldHNQRU1Tc2xDb250ZXh0RmFjdG9yeS5qYXZhIGIvZXhhbXBsZXMvc3NsLWZhY3Rvcnkvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0t1YmVybmV0ZXNTZWNyZXRzUEVNU3NsQ29udGV4dEZhY3RvcnkuamF2YQppbmRleCBmYjExYzkxLi4xOGUyMTFiIDEwMDY0NAotLS0gYS9leGFtcGxlcy9zc2wtZmFjdG9yeS9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvS3ViZXJuZXRlc1NlY3JldHNQRU1Tc2xDb250ZXh0RmFjdG9yeS5qYXZhCisrKyBiL2V4YW1wbGVzL3NzbC1mYWN0b3J5L3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9LdWJlcm5ldGVzU2VjcmV0c1BFTVNzbENvbnRleHRGYWN0b3J5LmphdmEKQEAgLTEyNSw2ICsxMjUsOCBAQAogICAgIHByaXZhdGUgU3RyaW5nIHBlbUVuY29kZWRDZXJ0aWZpY2F0ZXM7CiAgICAgcHJpdmF0ZSBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5IHBlbUJhc2VkU3NsQ29udGV4dEZhY3Rvcnk7CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBjaGVja2VkRXhwaXJ5ID0gZmFsc2U7CisKICAgICBwdWJsaWMgS3ViZXJuZXRlc1NlY3JldHNQRU1Tc2xDb250ZXh0RmFjdG9yeSgpCiAgICAgewogICAgICAgICBwZW1CYXNlZFNzbENvbnRleHRGYWN0b3J5ID0gbmV3IFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoKTsKQEAgLTE2NSw3ICsxNjcsNyBAQAogICAgIHByb3RlY3RlZCBLZXlNYW5hZ2VyRmFjdG9yeSBidWlsZEtleU1hbmFnZXJGYWN0b3J5KCkgdGhyb3dzIFNTTEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgS2V5TWFuYWdlckZhY3Rvcnkga21mID0gcGVtQmFzZWRTc2xDb250ZXh0RmFjdG9yeS5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7Ci0gICAgICAgIGNoZWNrZWRFeHBpcnkgPSBwZW1CYXNlZFNzbENvbnRleHRGYWN0b3J5LmNoZWNrZWRFeHBpcnk7CisgICAgICAgIGNoZWNrZWRFeHBpcnkgPSBwZW1CYXNlZFNzbENvbnRleHRGYWN0b3J5LmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5OwogICAgICAgICByZXR1cm4ga21mOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NsLWZhY3Rvcnkvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0t1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuamF2YSBiL2V4YW1wbGVzL3NzbC1mYWN0b3J5L3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9LdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmphdmEKaW5kZXggYzgzZmIwMy4uZWJlYWM2YyAxMDA2NDQKLS0tIGEvZXhhbXBsZXMvc3NsLWZhY3Rvcnkvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0t1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuamF2YQorKysgYi9leGFtcGxlcy9zc2wtZmFjdG9yeS9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5qYXZhCkBAIC0xNDksMTIgKzE0OSwxMiBAQAogCiAgICAgcHVibGljIEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkoKQogICAgIHsKLSAgICAgICAga2V5c3RvcmUgPSBnZXRTdHJpbmcoRW5jcnlwdGlvbk9wdGlvbnMuQ29uZmlnS2V5LktFWVNUT1JFLnRvU3RyaW5nKCksIEtFWVNUT1JFX1BBVEhfVkFMVUUpOwotICAgICAgICBrZXlzdG9yZV9wYXNzd29yZCA9IGdldFZhbHVlRnJvbUVudihLRVlTVE9SRV9QQVNTV09SRF9FTlZfVkFSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfS0VZU1RPUkVfUEFTU1dPUkQpOwotICAgICAgICB0cnVzdHN0b3JlID0gZ2V0U3RyaW5nKEVuY3J5cHRpb25PcHRpb25zLkNvbmZpZ0tleS5UUlVTVFNUT1JFLnRvU3RyaW5nKCksIFRSVVNUU1RPUkVfUEFUSF9WQUxVRSk7Ci0gICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQgPSBnZXRWYWx1ZUZyb21FbnYoVFJVU1RTVE9SRV9QQVNTV09SRF9FTlZfVkFSX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9UUlVTVFNUT1JFX1BBU1NXT1JEKTsKKyAgICAgICAga2V5c3RvcmVDb250ZXh0ID0gbmV3IEZpbGVCYXNlZFN0b3JlQ29udGV4dChnZXRTdHJpbmcoRW5jcnlwdGlvbk9wdGlvbnMuQ29uZmlnS2V5LktFWVNUT1JFLnRvU3RyaW5nKCksIEtFWVNUT1JFX1BBVEhfVkFMVUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbHVlRnJvbUVudihLRVlTVE9SRV9QQVNTV09SRF9FTlZfVkFSX05BTUUsIERFRkFVTFRfS0VZU1RPUkVfUEFTU1dPUkQpKTsKKworICAgICAgICB0cnVzdFN0b3JlQ29udGV4dCA9IG5ldyBGaWxlQmFzZWRTdG9yZUNvbnRleHQoZ2V0U3RyaW5nKEVuY3J5cHRpb25PcHRpb25zLkNvbmZpZ0tleS5UUlVTVFNUT1JFLnRvU3RyaW5nKCksIFRSVVNUU1RPUkVfUEFUSF9WQUxVRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZUZyb21FbnYoVFJVU1RTVE9SRV9QQVNTV09SRF9FTlZfVkFSX05BTUUsIERFRkFVTFRfVFJVU1RTVE9SRV9QQVNTV09SRCkpOworCiAgICAgICAgIGtleXN0b3JlTGFzdFVwZGF0ZWRUaW1lID0gU3lzdGVtLm5hbm9UaW1lKCk7CiAgICAgICAgIGtleXN0b3JlVXBkYXRlZFRpbWVTZWNyZXRLZXlQYXRoID0gZ2V0U3RyaW5nKENvbmZpZ0tleXMuS0VZU1RPUkVfVVBEQVRFRF9USU1FU1RBTVBfUEFUSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZU1RPUkVfVVBEQVRFRF9USU1FU1RBTVBfUEFUSF9WQUxVRSk7CkBAIC0xNjYsMTIgKzE2NiwxMyBAQAogICAgIHB1YmxpYyBLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5KE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1ldGVycykKICAgICB7CiAgICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpOwotICAgICAgICBrZXlzdG9yZSA9IGdldFN0cmluZyhFbmNyeXB0aW9uT3B0aW9ucy5Db25maWdLZXkuS0VZU1RPUkUudG9TdHJpbmcoKSwgS0VZU1RPUkVfUEFUSF9WQUxVRSk7Ci0gICAgICAgIGtleXN0b3JlX3Bhc3N3b3JkID0gZ2V0VmFsdWVGcm9tRW52KGdldFN0cmluZyhDb25maWdLZXlzLktFWVNUT1JFX1BBU1NXT1JEX0VOVl9WQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTVE9SRV9QQVNTV09SRF9FTlZfVkFSX05BTUUpLCBERUZBVUxUX0tFWVNUT1JFX1BBU1NXT1JEKTsKLSAgICAgICAgdHJ1c3RzdG9yZSA9IGdldFN0cmluZyhFbmNyeXB0aW9uT3B0aW9ucy5Db25maWdLZXkuVFJVU1RTVE9SRS50b1N0cmluZygpLCBUUlVTVFNUT1JFX1BBVEhfVkFMVUUpOwotICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkID0gZ2V0VmFsdWVGcm9tRW52KGdldFN0cmluZyhDb25maWdLZXlzLlRSVVNUU1RPUkVfUEFTU1dPUkRfRU5WX1ZBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVU1RTVE9SRV9QQVNTV09SRF9FTlZfVkFSX05BTUUpLCBERUZBVUxUX1RSVVNUU1RPUkVfUEFTU1dPUkQpOworICAgICAgICBrZXlzdG9yZUNvbnRleHQgPSBuZXcgRmlsZUJhc2VkU3RvcmVDb250ZXh0KGdldFN0cmluZyhFbmNyeXB0aW9uT3B0aW9ucy5Db25maWdLZXkuS0VZU1RPUkUudG9TdHJpbmcoKSwgS0VZU1RPUkVfUEFUSF9WQUxVRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVGcm9tRW52KGdldFN0cmluZyhDb25maWdLZXlzLktFWVNUT1JFX1BBU1NXT1JEX0VOVl9WQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTVE9SRV9QQVNTV09SRF9FTlZfVkFSX05BTUUpLCBERUZBVUxUX0tFWVNUT1JFX1BBU1NXT1JEKSk7CisKKyAgICAgICAgdHJ1c3RTdG9yZUNvbnRleHQgPSBuZXcgRmlsZUJhc2VkU3RvcmVDb250ZXh0KGdldFN0cmluZyhFbmNyeXB0aW9uT3B0aW9ucy5Db25maWdLZXkuVFJVU1RTVE9SRS50b1N0cmluZygpLCBUUlVTVFNUT1JFX1BBVEhfVkFMVUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVGcm9tRW52KGdldFN0cmluZyhDb25maWdLZXlzLlRSVVNUU1RPUkVfUEFTU1dPUkRfRU5WX1ZBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVU1RTVE9SRV9QQVNTV09SRF9FTlZfVkFSX05BTUUpLCBERUZBVUxUX1RSVVNUU1RPUkVfUEFTU1dPUkQpKTsKICAgICAgICAga2V5c3RvcmVMYXN0VXBkYXRlZFRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKICAgICAgICAga2V5c3RvcmVVcGRhdGVkVGltZVNlY3JldEtleVBhdGggPSBnZXRTdHJpbmcoQ29uZmlnS2V5cy5LRVlTVE9SRV9VUERBVEVEX1RJTUVTVEFNUF9QQVRILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTVE9SRV9VUERBVEVEX1RJTUVTVEFNUF9QQVRIX1ZBTFVFKTsKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzbC1mYWN0b3J5L3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9LdWJlcm5ldGVzU2VjcmV0c1BFTVNzbENvbnRleHRGYWN0b3J5VGVzdC5qYXZhIGIvZXhhbXBsZXMvc3NsLWZhY3RvcnkvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0t1YmVybmV0ZXNTZWNyZXRzUEVNU3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEKaW5kZXggMmQxMjdmMy4uZjEwMWU4OSAxMDA2NDQKLS0tIGEvZXhhbXBsZXMvc3NsLWZhY3RvcnkvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0t1YmVybmV0ZXNTZWNyZXRzUEVNU3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEKKysrIGIvZXhhbXBsZXMvc3NsLWZhY3RvcnkvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0t1YmVybmV0ZXNTZWNyZXRzUEVNU3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEKQEAgLTE0Nyw3ICsxNDcsNyBAQAogCiAgICAgICAgIEt1YmVybmV0ZXNTZWNyZXRzUEVNU3NsQ29udGV4dEZhY3Rvcnkga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSA9CiAgICAgICAgIG5ldyBLdWJlcm5ldGVzU2VjcmV0c1BFTVNzbENvbnRleHRGYWN0b3J5Rm9yVGVzdE9ubHkoY29uZmlnKTsKLSAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CisgICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkudHJ1c3RTdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmJ1aWxkVHJ1c3RNYW5hZ2VyRmFjdG9yeSgpOwogICAgIH0KIApAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgICAgIGNvbmZpZy5wdXRBbGwoY29tbW9uQ29uZmlnKTsKIAogICAgICAgICBLdWJlcm5ldGVzU2VjcmV0c1BFTVNzbENvbnRleHRGYWN0b3J5IGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkgPSBuZXcgS3ViZXJuZXRlc1NlY3JldHNQRU1Tc2xDb250ZXh0RmFjdG9yeUZvclRlc3RPbmx5KGNvbmZpZyk7Ci0gICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LnRydXN0U3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKICAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0cnVzdE1hbmFnZXJGYWN0b3J5ID0ga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5idWlsZFRydXN0TWFuYWdlckZhY3RvcnkoKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwodHJ1c3RNYW5hZ2VyRmFjdG9yeSk7CiAgICAgfQpAQCAtMTcyLDcgKzE3Miw3IEBACiAKICAgICAgICAgS3ViZXJuZXRlc1NlY3JldHNQRU1Tc2xDb250ZXh0RmFjdG9yeSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5ID0KICAgICAgICAgbmV3IEt1YmVybmV0ZXNTZWNyZXRzUEVNU3NsQ29udGV4dEZhY3RvcnlGb3JUZXN0T25seShjb25maWcpOwotICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmJ1aWxkS2V5TWFuYWdlckZhY3RvcnkoKTsKICAgICB9CiAKQEAgLTI2Miw3ICsyNjIsNyBAQAogICAgICAgICBhZGRLZXlzdG9yZU9wdGlvbnMoY29uZmlnKTsKIAogICAgICAgICBLdWJlcm5ldGVzU2VjcmV0c1BFTVNzbENvbnRleHRGYWN0b3J5IGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkgPSBuZXcgS3ViZXJuZXRlc1NlY3JldHNQRU1Tc2xDb250ZXh0RmFjdG9yeUZvclRlc3RPbmx5KGNvbmZpZyk7Ci0gICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LnRydXN0U3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKICAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0cnVzdE1hbmFnZXJGYWN0b3J5ID0ga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5idWlsZFRydXN0TWFuYWdlckZhY3RvcnkoKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwodHJ1c3RNYW5hZ2VyRmFjdG9yeSk7CiAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LnNob3VsZFJlbG9hZCgpKTsKQEAgLTI4Miw3ICsyODIsNyBAQAogICAgICAgICBhZGRLZXlzdG9yZU9wdGlvbnMoY29uZmlnKTsKIAogICAgICAgICBLdWJlcm5ldGVzU2VjcmV0c1BFTVNzbENvbnRleHRGYWN0b3J5IGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkgPSBuZXcgS3ViZXJuZXRlc1NlY3JldHNQRU1Tc2xDb250ZXh0RmFjdG9yeUZvclRlc3RPbmx5KGNvbmZpZyk7Ci0gICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CiAgICAgICAgIEtleU1hbmFnZXJGYWN0b3J5IGtleU1hbmFnZXJGYWN0b3J5ID0ga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7CiAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGtleU1hbmFnZXJGYWN0b3J5KTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3Rvcnkuc2hvdWxkUmVsb2FkKCkpOwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NsLWZhY3RvcnkvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0t1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEgYi9leGFtcGxlcy9zc2wtZmFjdG9yeS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeVRlc3QuamF2YQppbmRleCBkMzc5OTJhLi4wYzM2NDE5IDEwMDY0NAotLS0gYS9leGFtcGxlcy9zc2wtZmFjdG9yeS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeVRlc3QuamF2YQorKysgYi9leGFtcGxlcy9zc2wtZmFjdG9yeS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeVRlc3QuamF2YQpAQCAtMjAsOCArMjAsOCBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwpAQCAtMzgsNyArMzgsNiBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5LdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LkNvbmZpZ0tleXMuS0VZU1RPUkVfUEFTU1dPUkRfRU5WX1ZBUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5Db25maWdLZXlzLktFWVNUT1JFX1VQREFURURfVElNRVNUQU1QX1BBVEg7CkBAIC02MywxMSArNjIsMTAgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZGVsZXRlRmlsZUlmRXhpc3RzKFN0cmluZyBmaWxlKQogICAgIHsKLSAgICAgICAgUGF0aCBmaWxlUGF0aCA9IFBhdGhzLmdldChmaWxlKTsKLSAgICAgICAgYm9vbGVhbiBkZWxldGVkID0gbmV3IEZpbGUoZmlsZVBhdGgpLnRvSmF2YUlPRmlsZSgpLmRlbGV0ZSgpOworICAgICAgICBib29sZWFuIGRlbGV0ZWQgPSBuZXcgRmlsZShmaWxlKS5kZWxldGUoKTsKICAgICAgICAgaWYgKCFkZWxldGVkKQogICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIud2FybigiRmlsZSB7fSBjb3VsZCBub3QgYmUgZGVsZXRlZC4iLCBmaWxlUGF0aCk7CisgICAgICAgICAgICBsb2dnZXIud2FybigiRmlsZSB7fSBjb3VsZCBub3QgYmUgZGVsZXRlZC4iLCBmaWxlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTA2LDcgKzEwNCw3IEBACiAgICAgICAgIGNvbmZpZy5wdXQoVFJVU1RTVE9SRV9QQVRILCAiL3RoaXMvaXMvcHJvYmFibHkvbm90L2EvZmlsZS9vbi95b3VyL3Rlc3QvbWFjaGluZSIpOwogCiAgICAgICAgIEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3Rvcnkga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSA9IG5ldyBLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5Rm9yVGVzdE9ubHkoY29uZmlnKTsKLSAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CisgICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkudHJ1c3RTdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmJ1aWxkVHJ1c3RNYW5hZ2VyRmFjdG9yeSgpOwogICAgIH0KIApAQCAtMTE5LDcgKzExNyw3IEBACiAgICAgICAgIGNvbmZpZy5wdXQoS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5ERUZBVUxUX1RSVVNUU1RPUkVfUEFTU1dPUkRfRU5WX1ZBUl9OQU1FLCAiSG9tZU9mQmFkUGFzc3dvcmRzIik7CiAKICAgICAgICAgS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5ID0gbmV3IEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnlGb3JUZXN0T25seShjb25maWcpOwotICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS50cnVzdFN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CiAgICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuYnVpbGRUcnVzdE1hbmFnZXJGYWN0b3J5KCk7CiAgICAgfQogCkBAIC0xMzMsNyArMTMxLDcgQEAKICAgICAgICAgY29uZmlnLnB1dChLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LkRFRkFVTFRfVFJVU1RTVE9SRV9QQVNTV09SRF9FTlZfVkFSX05BTUUsICIiKTsKIAogICAgICAgICBLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5IGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkgPSBuZXcgS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeUZvclRlc3RPbmx5KGNvbmZpZyk7Ci0gICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LnRydXN0U3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKICAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5idWlsZFRydXN0TWFuYWdlckZhY3RvcnkoKTsKICAgICB9CiAKQEAgLTE0NCw3ICsxNDIsNyBAQAogICAgICAgICBjb25maWcucHV0QWxsKGNvbW1vbkNvbmZpZyk7CiAKICAgICAgICAgS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5ID0gbmV3IEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnlGb3JUZXN0T25seShjb25maWcpOwotICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS50cnVzdFN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CiAgICAgICAgIFRydXN0TWFuYWdlckZhY3RvcnkgdHJ1c3RNYW5hZ2VyRmFjdG9yeSA9IGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkuYnVpbGRUcnVzdE1hbmFnZXJGYWN0b3J5KCk7CiAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHRydXN0TWFuYWdlckZhY3RvcnkpOwogICAgIH0KQEAgLTE1OSw3ICsxNTcsNyBAQAogICAgICAgICBjb25maWcucHV0KCJNWV9LRVlTVE9SRV9QQVNTV09SRCIsIlRoaXNXb250TWF0dGVyIik7CiAKICAgICAgICAgS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5ID0gbmV3IEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnlGb3JUZXN0T25seShjb25maWcpOwotICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmJ1aWxkS2V5TWFuYWdlckZhY3RvcnkoKTsKICAgICB9CiAKQEAgLTE4MywyMCArMTgxLDIwIEBACiAKICAgICAgICAgS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5MSA9IG5ldyBLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5Rm9yVGVzdE9ubHkoY29uZmlnKTsKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBleGlyeSBjaGVjayBkaWRuJ3QgaGFwcGVuIHNvIGZhciBmb3IgdGhlIHByaXZhdGUga2V5Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5MS5jaGVja2VkRXhwaXJ5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkxLmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKIAogICAgICAgICBhZGRLZXlzdG9yZU9wdGlvbnMoY29uZmlnKTsKICAgICAgICAgS3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5MiA9IG5ldyBLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5Rm9yVGVzdE9ubHkoY29uZmlnKTsKICAgICAgICAgLy8gVHJpZ2dlciB0aGUgcHJpdmF0ZSBrZXkgbG9hZGluZy4gVGhhdCB3aWxsIGFsc28gY2hlY2sgZm9yIGV4cGlyZWQgcHJpdmF0ZSBrZXkKICAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeTIuYnVpbGRLZXlNYW5hZ2VyRmFjdG9yeSgpOwogICAgICAgICAvLyBOb3cgd2Ugc2hvdWxkIGhhdmUgY2hlY2tlZCB0aGUgcHJpdmF0ZSBrZXkncyBleHBpcnkKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoa3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeTIuY2hlY2tlZEV4cGlyeSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkyLmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKIAogICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBuZXcgZmFjdG9yeSBvYmplY3QgcHJlZm9ybXMgdGhlIGZyZXNoIHByaXZhdGUga2V5IGV4cGlyeSBjaGVjawogICAgICAgICBLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5IGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkzID0gbmV3IEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnlGb3JUZXN0T25seShjb25maWcpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2Uoa3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeTMuY2hlY2tlZEV4cGlyeSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5My5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CiAgICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkzLmJ1aWxkS2V5TWFuYWdlckZhY3RvcnkoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoa3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeTMuY2hlY2tlZEV4cGlyeSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkzLmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjA3LDcgKzIwNSw3IEBACiAgICAgICAgIGFkZEtleXN0b3JlT3B0aW9ucyhjb25maWcpOwogCiAgICAgICAgIEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3Rvcnkga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSA9IG5ldyBLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5Rm9yVGVzdE9ubHkoY29uZmlnKTsKLSAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CisgICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3RvcnkudHJ1c3RTdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBUcnVzdE1hbmFnZXJGYWN0b3J5IHRydXN0TWFuYWdlckZhY3RvcnkgPSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmJ1aWxkVHJ1c3RNYW5hZ2VyRmFjdG9yeSgpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCh0cnVzdE1hbmFnZXJGYWN0b3J5KTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3Rvcnkuc2hvdWxkUmVsb2FkKCkpOwpAQCAtMjI3LDcgKzIyNSw3IEBACiAgICAgICAgIGFkZEtleXN0b3JlT3B0aW9ucyhjb25maWcpOwogCiAgICAgICAgIEt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3Rvcnkga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeSA9IG5ldyBLdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5Rm9yVGVzdE9ubHkoY29uZmlnKTsKLSAgICAgICAga3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CisgICAgICAgIGt1YmVybmV0ZXNTZWNyZXRzU3NsQ29udGV4dEZhY3Rvcnkua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKICAgICAgICAgS2V5TWFuYWdlckZhY3Rvcnkga2V5TWFuYWdlckZhY3RvcnkgPSBrdWJlcm5ldGVzU2VjcmV0c1NzbENvbnRleHRGYWN0b3J5LmJ1aWxkS2V5TWFuYWdlckZhY3RvcnkoKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoa2V5TWFuYWdlckZhY3RvcnkpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2Uoa3ViZXJuZXRlc1NlY3JldHNTc2xDb250ZXh0RmFjdG9yeS5zaG91bGRSZWxvYWQoKSk7CmRpZmYgLS1naXQgYS9pZGUvaWRlYS93b3Jrc3BhY2UueG1sIGIvaWRlL2lkZWEvd29ya3NwYWNlLnhtbAppbmRleCA4YWVhMzE1Li5mZmQ3NTMwIDEwMDY0NAotLS0gYS9pZGUvaWRlYS93b3Jrc3BhY2UueG1sCisrKyBiL2lkZS9pZGVhL3dvcmtzcGFjZS54bWwKQEAgLTE1MSw2ICsxNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLURjYXNzYW5kcmEuc3RvcmFnZWRpcj0kUFJPSkVDVF9ESVIkL2RhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EamF2YS5saWJyYXJ5LnBhdGg9JFBST0pFQ1RfRElSJC9saWIvc2lnYXItYmluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRGxvZ2JhY2suY29uZmlndXJhdGlvbkZpbGU9ZmlsZTovLyRQUk9KRUNUX0RJUiQvY29uZi9sb2diYWNrLnhtbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOkhlYXBEdW1wUGF0aD1idWlsZC90ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZWEiIC8+CiAgICAgICA8b3B0aW9uIG5hbWU9IlBST0dSQU1fUEFSQU1FVEVSUyIgdmFsdWU9IiIgLz4KICAgICAgIDxvcHRpb24gbmFtZT0iV09SS0lOR19ESVJFQ1RPUlkiIHZhbHVlPSIiIC8+CkBAIC0xOTgsNyArMTk5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EbG9nYmFjay5jb25maWd1cmF0aW9uRmlsZT1maWxlOi8vJFBST0pFQ1RfRElSJC90ZXN0L2NvbmYvbG9nYmFjay10ZXN0LnhtbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLURtaWdyYXRpb24tc3N0YWJsZS1yb290PSRQUk9KRUNUX0RJUiQvdGVzdC9kYXRhL21pZ3JhdGlvbi1zc3RhYmxlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOkFjdGl2ZVByb2Nlc3NvckNvdW50PTIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1YWDpNYXhNZXRhc3BhY2VTaXplPTM4NE0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1YWDpIZWFwRHVtcFBhdGg9YnVpbGQvdGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOk1heE1ldGFzcGFjZVNpemU9MUcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1YWDpTb2Z0UmVmTFJVUG9saWN5TVNQZXJNQj0wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZWEiIC8+CiAgICAgICA8b3B0aW9uIG5hbWU9IlBBUkFNRVRFUlMiIHZhbHVlPSIiIC8+CkBAIC0yMzAsNiArMjMyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EY2Fzc2FuZHJhLnRyaWdnZXJzX2Rpcj0kUFJPSkVDVF9ESVIkL2NvbmYvdHJpZ2dlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EamF2YS5saWJyYXJ5LnBhdGg9JFBST0pFQ1RfRElSJC9saWIvc2lnYXItYmluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRGxvZ2JhY2suY29uZmlndXJhdGlvbkZpbGU9ZmlsZTovLyRQUk9KRUNUX0RJUiQvY29uZi9sb2diYWNrLnhtbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVhYOkhlYXBEdW1wUGF0aD1idWlsZC90ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtWG14MUcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lYSIgLz4KICAgICAgIDxvcHRpb24gbmFtZT0iUFJPR1JBTV9QQVJBTUVURVJTIiB2YWx1ZT0iIiAvPgpkaWZmIC0tZ2l0IGEvaWRlL25icHJvamVjdC9wcm9qZWN0LnhtbCBiL2lkZS9uYnByb2plY3QvcHJvamVjdC54bWwKaW5kZXggMzkwMGYxZi4uNWVhMjIyNSAxMDA2NDQKLS0tIGEvaWRlL25icHJvamVjdC9wcm9qZWN0LnhtbAorKysgYi9pZGUvbmJwcm9qZWN0L3Byb2plY3QueG1sCkBAIC03LDcgKzcsNyBAQAogICAgICAgICAgICAgPHByb3BlcnRpZXM+CiAgICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb2plY3QuZGlyIj4uLjwvcHJvcGVydHk+CiAgICAgICAgICAgICAgICAgPCEtLSB0aGUgY29tcGlsZSBjbGFzc3BhdGhzIHNob3VsZCBiZSBkaXN0aW5jdCBwZXIgY29tcGlsYXRpb24gdW5pdOKApiBidXQgaXQgaXMga2VwdCBzaW1wbGUgYW5kIHRoZSBidWlsZCB3aWxsIGNhdGNoIGVycm9ycyAtLT4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2Fzc2FuZHJhLmNsYXNzcGF0aC5qYXJzIj4ke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9IZHJIaXN0b2dyYW0tMi4xLjkuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL1NUNC00LjAuOC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvYWlybGluZS0wLjguamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2FudGxyLTMuNS4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9hbnRsci1ydW50aW1lLTMuNS4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9hc20tOS4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9hc3NlcnRqLWNvcmUtMy4xNS4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9ieXRlbWFuLTQuMC42Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9ieXRlbWFuLWJtdW5pdC00LjAuNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvYnl0ZW1hbi1pbnN0YWxsLTQuMC42Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9ieXRlbWFuLXN1Ym1pdC00LjAuNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY2FmZmVpbmUtMi45LjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Nhc3NhbmRyYS1kcml2ZXItY29yZS0zLjExLjAtc2hhZGVkLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jaGVja2VyLXF1YWwtMy4xMC4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jaHJvbmljbGUtYnl0ZXMtMi4yMC4xMTEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Nocm9uaWNsZS1jb3JlLTIuMjAuMTI2Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jaHJvbmljbGUtcXVldWUtNS4yMC4xMjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Nocm9uaWNsZS10aHJlYWRzLTIuMjAuMTExLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jaHJvbmljbGUtd2lyZS0yLjIwLjExNy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1iZWFudXRpbHMtMS43LjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLWNvcmUtMS44LjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtY2xpLTEuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1jb2RlYy0xLjkuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtY29sbGVjdGlvbnMtMy4yLjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtY29uZmlndXJhdGlvbi0xLjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtZGlnZXN0ZXItMS44Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLWVsLTEuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1odHRwY2xpZW50LTMuMC4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLWxhbmczLTMuMTEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtbWF0aC0yLjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtbWF0aDMtMy4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLW5ldC0xLjQuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tcGlsZS1jb21tYW5kLWFubm90YXRpb25zLTEuMi4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21wcmVzcy1semYtMC44LjQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbmN1cnJlbnQtdHJlZXMtMi40LjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Vjai00LjYuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvZXJyb3JfcHJvbmVfYW5ub3RhdGlvbnMtMi41LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Z0cGxldC1hcGktMS4wLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Z0cHNlcnZlci1jb3JlLTEuMC4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9mdHBzZXJ2ZXItZGVwcmVjYXRlZC0xLjAuMC1NMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvZ3VhdmEtMjcuMC1qcmUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2hhZG9vcC1jb3JlLTEuMC4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9oYWRvb3AtbWluaWNsdXN0ZXItMS4wLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2hhZG9vcC10ZXN0LTEuMC4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9oaWdoLXNjYWxlLWxpYi0xLjAuNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvaHBwYy0wLjguMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvaHNxbGRiLTEuOC4wLjEwLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9pcGFkZHJlc3MtNS4zLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2oyb2JqYy1hbm5vdGF0aW9ucy0xLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2phY2tzb24tYW5ub3RhdGlvbnMtMi4xMy4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYWNrc29uLWNvcmUtMi4xMy4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYWNrc29uLWRhdGFiaW5kLTIuMTMuMi4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYWNrc29uLWRhdGF0eXBlLWpzcjMxMC0yLjEzLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2phY29jb2FnZW50Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYW1tLTAuMy4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYXNwZXItY29tcGlsZXItNS41LjEyLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYXNwZXItcnVudGltZS01LjUuMTIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2phdmEtY3VwLXJ1bnRpbWUtMTFiLTIwMTYwNjE1Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYXZheC5pbmplY3QtMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamJjcnlwdC0wLjQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pjbC1vdmVyLXNsZjRqLTEuNy4yNS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamNvbW1hbmRlci0xLjMwLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qY3Rvb2xzLWNvcmUtMy4xLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2plcnNleS1jb3JlLTEuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamVyc2V5LXNlcnZlci0xLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pldHMzdC0wLjcuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamV0dHktNi4xLjI2Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qZXR0eS11dGlsLTYuMS4yNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamZsZXgtMS44LjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2puYS01LjkuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvanNvbi1zaW1wbGUtMS4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qc3AtMi4xLTYuMS4xNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvanNwLWFwaS0yLjEtNi4xLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qc3IzMDUtMi4wLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pzcjMxMS1hcGktMS4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qdm0tYXR0YWNoLWFwaS0xLjUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2tmcy0wLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2xvZzRqLW92ZXItc2xmNGotMS43LjI1Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9sb2diYWNrLWNsYXNzaWMtMS4yLjkuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2xvZ2JhY2stY29yZS0xLjIuOS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbHo0LWphdmEtMS44LjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL21ldHJpY3MtY29yZS0zLjEuNS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbWV0cmljcy1qdm0tMy4xLjUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL21ldHJpY3MtbG9nYmFjay0zLjEuNS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbWluYS1jb3JlLTIuMC4wLU01Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9teGR1bXAtMC4xNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbmV0dHktYWxsLTQuMS41OC5GaW5hbC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbmV0dHktdGNuYXRpdmUtYm9yaW5nc3NsLXN0YXRpYy0yLjAuMzYuRmluYWwuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL29oYy1jb3JlLTAuNS4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9vaGMtY29yZS1qOC0wLjUuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvb3JvLTIuMC44Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9wc2phdmEtMC4xLjE5Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9yZXBvcnRlci1jb25maWctYmFzZS0zLjAuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvcmVwb3J0ZXItY29uZmlnMy0zLjAuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc2VydmxldC1hcGktMi41LTYuMS4xNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc2lnYXItMS42LjQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3Nqay1jbGktMC4xNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc2prLWNvcmUtMC4xNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc2prLWpzb24tMC4xNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc2prLXN0YWNrdHJhY2UtMC4xNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc2xmNGotYXBpLTEuNy4yNS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc25ha2V5YW1sLTEuMjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3NuYXBweS1qYXZhLTEuMS44LjQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3Nub3diYWxsLXN0ZW1tZXItMS4zLjAuNTgxLjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3N0cmVhbS0yLjUuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMveG1sZW5jLTAuNTIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3pzdGQtam5pLTEuNS4wLTQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvU2F4b24tSEUtMTAuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9hbnQtMS4xMC4xMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9hbnQtanVuaXQtMS4xMC4xMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9hbnQtbGF1bmNoZXItMS4xMC4xMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9hbnRsci0yLjcuNy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9hbnRscjQtcnVudGltZS00LjkuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9hc20tYW5hbHlzaXMtOS4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FzbS1jb21tb25zLTkuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9hc20tdHJlZS05LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYXNtLXV0aWwtOS4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FzbS14bWwtNi4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2F3YWl0aWxpdHktNC4wLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYnl0ZS1idWRkeS0xLjEwLjUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYnl0ZS1idWRkeS1hZ2VudC0xLjEwLjUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvY2hlY2tzdHlsZS04LjQwLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuOS40Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2NvbW1vbnMtY29sbGVjdGlvbnMtMy4yLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvY29tbW9ucy1pby0yLjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9jb21tb25zLW1hdGgzLTMuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9jb21waWxlLWNvbW1hbmQtYW5ub3RhdGlvbnMtMS4yLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvZHRlc3QtYXBpLTAuMC4xMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9ndWF2YS0xOC4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2hhbWNyZXN0LTIuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9oYXJyeS1jb3JlLTAuMC4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2phY2tzb24tYW5ub3RhdGlvbnMtMi4xMS4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2phY2tzb24tY29yZS0yLjEzLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvamFja3Nvbi1kYXRhYmluZC0yLjExLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvamFja3Nvbi1kYXRhZm9ybWF0LXlhbWwtMi4xMy4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2phdmEtYWxsb2NhdGlvbi1pbnN0cnVtZW50ZXItMy4xLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvamF2YXNzaXN0LTMuMjguMC1HQS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qaW1mcy0xLjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvam1oLWNvcmUtMS4yMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qbWgtZ2VuZXJhdG9yLWFubnByb2Nlc3MtMS4yMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qb3B0LXNpbXBsZS00LjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvanNyMzA1LTMuMC4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2p1bml0LTQuMTIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvbW9ja2l0by1jb3JlLTMuMi40Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL29iamVuZXNpcy0yLjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvb3JnLmphY29jby5hZ2VudC0wLjguNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9vcmcuamFjb2NvLmFudC0wLjguNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9vcmcuamFjb2NvLmNvcmUtMC44LjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvb3JnLmphY29jby5yZXBvcnQtMC44LjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvcGljb2NsaS00LjYuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9xdWlja3RoZW9yaWVzLTAuMjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvcmVmbGVjdGlvbnMtMC4xMC4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL3NlbXZlcjRqLTMuMS4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL3NpbXVsYXRvci1hc20uamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvc2ltdWxhdG9yLWJvb3RzdHJhcC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9zbGY0ai1hcGktMS43LjMyLmphcjo8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYXNzYW5kcmEuY2xhc3NwYXRoLmphcnMiPiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL0hkckhpc3RvZ3JhbS0yLjEuOS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvU1Q0LTQuMC44Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9hZ3JvbmEtMS4xNy4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9haXJsaW5lLTAuOC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvYW50bHItMy41LjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2FudGxyLXJ1bnRpbWUtMy41LjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2FzbS05LjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Fzc2VydGotY29yZS0zLjE1LjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2JpZy1tYXRoLTIuMy4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9ieXRlbWFuLTQuMC4yMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvYnl0ZW1hbi1ibXVuaXQtNC4wLjIwLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9ieXRlbWFuLWluc3RhbGwtNC4wLjIwLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9ieXRlbWFuLXN1Ym1pdC00LjAuMjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NhZmZlaW5lLTIuOS4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jYXNzYW5kcmEtZHJpdmVyLWNvcmUtMy4xMS4wLXNoYWRlZC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY2hlY2tlci1xdWFsLTMuMTAuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY2hyb25pY2xlLWJ5dGVzLTIuMjAuMTExLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jaHJvbmljbGUtY29yZS0yLjIwLjEyNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY2hyb25pY2xlLXF1ZXVlLTUuMjAuMTIzLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jaHJvbmljbGUtdGhyZWFkcy0yLjIwLjExMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY2hyb25pY2xlLXdpcmUtMi4yMC4xMTcuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuNy4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLWJlYW51dGlscy1jb3JlLTEuOC4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLWNsaS0xLjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtY29kZWMtMS45Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLWNvbGxlY3Rpb25zLTMuMi4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLWNvbmZpZ3VyYXRpb24tMS42Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLWRpZ2VzdGVyLTEuOC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1lbC0xLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbW1vbnMtaHR0cGNsaWVudC0zLjAuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1sYW5nMy0zLjExLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLW1hdGgtMi4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb21tb25zLW1hdGgzLTMuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tbW9ucy1uZXQtMS40LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2NvbXBpbGUtY29tbWFuZC1hbm5vdGF0aW9ucy0xLjIuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvY29tcHJlc3MtbHpmLTAuOC40Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9jb25jdXJyZW50LXRyZWVzLTIuNC4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9lY2otNC42LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2Vycm9yX3Byb25lX2Fubm90YXRpb25zLTIuNS4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9mdHBsZXQtYXBpLTEuMC4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9mdHBzZXJ2ZXItY29yZS0xLjAuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvZnRwc2VydmVyLWRlcHJlY2F0ZWQtMS4wLjAtTTIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2d1YXZhLTI3LjAtanJlLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9oYWRvb3AtY29yZS0xLjAuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvaGFkb29wLW1pbmljbHVzdGVyLTEuMC4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9oYWRvb3AtdGVzdC0xLjAuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvaGlnaC1zY2FsZS1saWItMS4wLjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2hwcGMtMC44LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2hzcWxkYi0xLjguMC4xMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvaXBhZGRyZXNzLTUuMy4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qMm9iamMtYW5ub3RhdGlvbnMtMS4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYWNrc29uLWFubm90YXRpb25zLTIuMTMuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamFja3Nvbi1jb3JlLTIuMTMuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamFja3Nvbi1kYXRhYmluZC0yLjEzLjIuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamFja3Nvbi1kYXRhdHlwZS1qc3IzMTAtMi4xMy4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYWNvY29hZ2VudC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamFtbS0wLjMuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamFzcGVyLWNvbXBpbGVyLTUuNS4xMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamFzcGVyLXJ1bnRpbWUtNS41LjEyLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qYXZhLWN1cC1ydW50aW1lLTExYi0yMDE2MDYxNS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamF2YXguaW5qZWN0LTEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2piY3J5cHQtMC40Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qY2wtb3Zlci1zbGY0ai0xLjcuMjUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pjb21tYW5kZXItMS4zMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamN0b29scy1jb3JlLTMuMS4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qZXJzZXktY29yZS0xLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2plcnNleS1zZXJ2ZXItMS4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qZXRzM3QtMC43LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pldHR5LTYuMS4yNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvamV0dHktdXRpbC02LjEuMjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pmbGV4LTEuOC4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qbmEtNS4xMy4wLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qc29uLXNpbXBsZS0xLjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pzcC0yLjEtNi4xLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9qc3AtYXBpLTIuMS02LjEuMTQuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2pzcjMwNS0yLjAuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvanNyMzExLWFwaS0xLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2p2bS1hdHRhY2gtYXBpLTEuNS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMva2ZzLTAuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbG9nNGotb3Zlci1zbGY0ai0xLjcuMjUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL2xvZ2JhY2stY2xhc3NpYy0xLjIuOS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbG9nYmFjay1jb3JlLTEuMi45Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9sejQtamF2YS0xLjguMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbWV0cmljcy1jb3JlLTMuMS41Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9tZXRyaWNzLWp2bS0zLjEuNS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvbWV0cmljcy1sb2diYWNrLTMuMS41Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9taW5hLWNvcmUtMi4wLjAtTTUuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL214ZHVtcC0wLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9uZXR0eS1hbGwtNC4xLjU4LkZpbmFsLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9uZXR0eS10Y25hdGl2ZS1ib3Jpbmdzc2wtc3RhdGljLTIuMC4zNi5GaW5hbC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvb2hjLWNvcmUtMC41LjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL29oYy1jb3JlLWo4LTAuNS4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9vcm8tMi4wLjguamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3BzamF2YS0wLjEuMTkuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL2xpYi9qYXJzL3JlcG9ydGVyLWNvbmZpZy1iYXNlLTMuMC4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9yZXBvcnRlci1jb25maWczLTMuMC4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zZXJ2bGV0LWFwaS0yLjUtNi4xLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zaWdhci0xLjYuNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc2prLWNsaS0wLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zamstY29yZS0wLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zamstanNvbi0wLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zamstc3RhY2t0cmFjZS0wLjE0Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zbGY0ai1hcGktMS43LjI1Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy9zbmFrZXlhbWwtMS4yNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc25hcHB5LWphdmEtMS4xLjguNC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc25vd2JhbGwtc3RlbW1lci0xLjMuMC41ODEuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvc3RyZWFtLTIuNS4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC9saWIvamFycy94bWxlbmMtMC41Mi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvbGliL2phcnMvenN0ZC1qbmktMS41LjQtMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9TYXhvbi1IRS0xMC4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FudC0xLjEwLjEyLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FudC1qdW5pdC0xLjEwLjEyLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FudC1sYXVuY2hlci0xLjEwLjEyLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FudGxyLTIuNy43Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FudGxyNC1ydW50aW1lLTQuOS4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FzbS05LjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYXNtLWFuYWx5c2lzLTkuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9hc20tY29tbW9ucy05LjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvYXNtLXRyZWUtOS4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2FzbS11dGlsLTkuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9hc20teG1sLTYuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9hd2FpdGlsaXR5LTQuMC4zLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2J5dGUtYnVkZHktMS4xMi4xMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9ieXRlLWJ1ZGR5LWFnZW50LTEuMTIuMTMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvY2hlY2tzdHlsZS04LjQwLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2NvbW1vbnMtYmVhbnV0aWxzLTEuOS40Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2NvbW1vbnMtY29sbGVjdGlvbnMtMy4yLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvY29tbW9ucy1pby0yLjYuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvY29tbW9ucy1sb2dnaW5nLTEuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9jb21tb25zLW1hdGgzLTMuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9kdGVzdC1hcGktMC4wLjEzLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2d1YXZhLTE4LjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvaGFtY3Jlc3QtMi4yLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2hhcnJ5LWNvcmUtMC4wLjEuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvamFja3Nvbi1hbm5vdGF0aW9ucy0yLjExLjMuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvamFja3Nvbi1jb3JlLTIuMTMuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qYWNrc29uLWRhdGFiaW5kLTIuMTEuMy5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qYWNrc29uLWRhdGFmb3JtYXQteWFtbC0yLjEzLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvamF2YS1hbGxvY2F0aW9uLWluc3RydW1lbnRlci0zLjEuMC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qYXZhc3Npc3QtMy4yOC4wLUdBLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2ppbWZzLTEuMS5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qbWgtY29yZS0xLjIxLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2ptaC1nZW5lcmF0b3ItYW5ucHJvY2Vzcy0xLjIxLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL2pvcHQtc2ltcGxlLTQuNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9qc3IzMDUtMy4wLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvanVuaXQtNC4xMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9tb2NraXRvLWNvcmUtNC43LjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvbW9ja2l0by1pbmxpbmUtNC43LjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvb2JqZW5lc2lzLTMuMi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9vcmcuamFjb2NvLmFnZW50LTAuOC44Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL29yZy5qYWNvY28uYW50LTAuOC44Lmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL29yZy5qYWNvY28uY29yZS0wLjguOC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9vcmcuamFjb2NvLnJlcG9ydC0wLjguOC5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9waWNvY2xpLTQuNi4xLmphcjoke3Byb2plY3QuZGlyfS9idWlsZC90ZXN0L2xpYi9qYXJzL3F1aWNrdGhlb3JpZXMtMC4yNi5qYXI6JHtwcm9qZWN0LmRpcn0vYnVpbGQvdGVzdC9saWIvamFycy9yZWZsZWN0aW9ucy0wLjEwLjIuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvc2VtdmVyNGotMy4xLjAuamFyOiR7cHJvamVjdC5kaXJ9L2J1aWxkL3Rlc3QvbGliL2phcnMvc2xmNGotYXBpLTEuNy4zMi5qYXI6PC9wcm9wZXJ0eT4KICAgICAgICAgICAgIDwvcHJvcGVydGllcz4KICAgICAgICAgICAgIDxmb2xkZXJzPgogICAgICAgICAgICAgICAgIDxzb3VyY2UtZm9sZGVyPgpkaWZmIC0tZ2l0IGEvcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoIGIvcHlsaWIvY2Fzc2FuZHJhLWNxbHNoLXRlc3RzLnNoCmluZGV4IGFkNmFlNzUuLmY2YjFmMjEgMTAwNzU1Ci0tLSBhL3B5bGliL2Nhc3NhbmRyYS1jcWxzaC10ZXN0cy5zaAorKysgYi9weWxpYi9jYXNzYW5kcmEtY3Fsc2gtdGVzdHMuc2gKQEAgLTQxLDE4ICs0MSw5IEBACiBleHBvcnQgQ0NNX0NPTkZJR19ESVI9JHtXT1JLU1BBQ0V9Ly5jY20KIGV4cG9ydCBOVU1fVE9LRU5TPSIxNiIKIGV4cG9ydCBDQVNTQU5EUkFfRElSPSR7V09SS1NQQUNFfQotZXhwb3J0IFRFU1RTVUlURV9OQU1FPSJjcWxzaGxpYi4ke1BZVEhPTl9WRVJTSU9OfSIKIAotaWYgWyAteiAiJENBU1NBTkRSQV9VU0VfSkRLMTEiIF07IHRoZW4KLSAgICBleHBvcnQgQ0FTU0FORFJBX1VTRV9KREsxMT1mYWxzZQotZmkKLQotaWYgWyAiJENBU1NBTkRSQV9VU0VfSkRLMTEiID0gdHJ1ZSBdIDsgdGhlbgotICAgIFRFU1RTVUlURV9OQU1FPSIke1RFU1RTVUlURV9OQU1FfS5qZGsxMSIKLWVsc2UKLSAgICBURVNUU1VJVEVfTkFNRT0iJHtURVNUU1VJVEVfTkFNRX0uamRrOCIKLSAgICB1bnNldCBKQVZBMTFfSE9NRQotZmkKK2phdmFfdmVyc2lvbj0kKGphdmEgLXZlcnNpb24gMj4mMSB8IGF3ayAtRiAnIicgJy92ZXJzaW9uLyB7cHJpbnQgJDJ9JyB8IGF3ayAtRi4gJ3twcmludCAkMX0nKQorZXhwb3J0IFRFU1RTVUlURV9OQU1FPSJjcWxzaGxpYi4ke1BZVEhPTl9WRVJTSU9OfS5qZGske2phdmFfdmVyc2lvbn0iCiAKIGFudCAtYnVpbGRmaWxlICR7Q0FTU0FORFJBX0RJUn0vYnVpbGQueG1sIHJlYWxjbGVhbgogIyBMb29wIHRvIHByZXZlbnQgZmFpbHVyZSBkdWUgdG8gbWF2ZW4tYW50LXRhc2tzIG5vdCBkb3dubG9hZGluZyBhIGphci4uCkBAIC05Nyw3ICs4OCw2IEBACiBjY20gcmVtb3ZlIHRlc3QgfHwgdHJ1ZSAjIGluIGNhc2UgYW4gb2xkIGNjbSBjbHVzdGVyIGlzIGxlZnQgYmVoaW5kCiBjY20gY3JlYXRlIHRlc3QgLW4gMSAtLWluc3RhbGwtZGlyPSR7Q0FTU0FORFJBX0RJUn0KIGNjbSB1cGRhdGVjb25mICJ1c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IHRydWUiCi1jY20gdXBkYXRlY29uZiAic2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiB0cnVlIgogCiB2ZXJzaW9uX2Zyb21fYnVpbGQ9JChjY20gbm9kZTEgdmVyc2lvbmZyb21idWlsZCkKIGV4cG9ydCBwcmVfb3JfcG9zdF9jZGM9JChweXRob24gLWMgIiIiZnJvbSBkaXN0dXRpbHMudmVyc2lvbiBpbXBvcnQgTG9vc2VWZXJzaW9uCmRpZmYgLS1naXQgYS9weWxpYi9jcWxzaGxpYi9jcWwzaGFuZGxpbmcucHkgYi9weWxpYi9jcWxzaGxpYi9jcWwzaGFuZGxpbmcucHkKaW5kZXggMDNlMDZkOC4uN2ZmMjUyYiAxMDA2NDQKLS0tIGEvcHlsaWIvY3Fsc2hsaWIvY3FsM2hhbmRsaW5nLnB5CisrKyBiL3B5bGliL2NxbHNobGliL2NxbDNoYW5kbGluZy5weQpAQCAtNDMsMTQgKzQzLDE3IEBACiBjbGFzcyBDcWwzUGFyc2luZ1J1bGVTZXQoQ3FsUGFyc2luZ1J1bGVTZXQpOgogCiAgICAgY29sdW1uZmFtaWx5X2xheW91dF9vcHRpb25zID0gKAorICAgICAgICAoJ2FsbG93X2F1dG9fc25hcHNob3QnLCBOb25lKSwKICAgICAgICAgKCdibG9vbV9maWx0ZXJfZnBfY2hhbmNlJywgTm9uZSksCiAgICAgICAgICgnY29tbWVudCcsIE5vbmUpLAogICAgICAgICAoJ2djX2dyYWNlX3NlY29uZHMnLCBOb25lKSwKKyAgICAgICAgKCdpbmNyZW1lbnRhbF9iYWNrdXBzJywgTm9uZSksCiAgICAgICAgICgnbWluX2luZGV4X2ludGVydmFsJywgTm9uZSksCiAgICAgICAgICgnbWF4X2luZGV4X2ludGVydmFsJywgTm9uZSksCiAgICAgICAgICgnZGVmYXVsdF90aW1lX3RvX2xpdmUnLCBOb25lKSwKICAgICAgICAgKCdzcGVjdWxhdGl2ZV9yZXRyeScsIE5vbmUpLAogICAgICAgICAoJ2FkZGl0aW9uYWxfd3JpdGVfcG9saWN5JywgTm9uZSksCisgICAgICAgICgnbWVtdGFibGUnLCBOb25lKSwKICAgICAgICAgKCdtZW10YWJsZV9mbHVzaF9wZXJpb2RfaW5fbXMnLCBOb25lKSwKICAgICAgICAgKCdjZGMnLCBOb25lKSwKICAgICAgICAgKCdyZWFkX3JlcGFpcicsIE5vbmUpLApAQCAtOTQsMTQgKzk3LDYgQEAKICAgICAgICAgJ2Zhbm91dF9zaXplJwogICAgICkKIAotICAgIGRhdGVfdGllcmVkX2NvbXBhY3Rpb25fc3RyYXRlZ3lfb3B0aW9ucyA9ICgKLSAgICAgICAgJ2Jhc2VfdGltZV9zZWNvbmRzJywKLSAgICAgICAgJ21heF9zc3RhYmxlX2FnZV9kYXlzJywKLSAgICAgICAgJ21pbl90aHJlc2hvbGQnLAotICAgICAgICAnbWF4X3dpbmRvd19zaXplX3NlY29uZHMnLAotICAgICAgICAndGltZXN0YW1wX3Jlc29sdXRpb24nCi0gICAgKQotCiAgICAgdGltZV93aW5kb3dfY29tcGFjdGlvbl9zdHJhdGVneV9vcHRpb25zID0gKAogICAgICAgICAnY29tcGFjdGlvbl93aW5kb3dfdW5pdCcsCiAgICAgICAgICdjb21wYWN0aW9uX3dpbmRvd19zaXplJywKQEAgLTMxMCw3ICszMDUsOSBAQAogCiA8dXNlclR5cGU+IDo6PSB1dG5hbWU9PGNmT3JLc05hbWU+IDsKIAotPHN0b3JhZ2VUeXBlPiA6Oj0gPHNpbXBsZVN0b3JhZ2VUeXBlPiB8IDxjb2xsZWN0aW9uVHlwZT4gfCA8ZnJvemVuQ29sbGVjdGlvblR5cGU+IHwgPHVzZXJUeXBlPiA7Cis8c3RvcmFnZVR5cGU+IDo6PSAoIDxzaW1wbGVTdG9yYWdlVHlwZT4gfCA8Y29sbGVjdGlvblR5cGU+IHwgPGZyb3plbkNvbGxlY3Rpb25UeXBlPiB8IDx1c2VyVHlwZT4gKSAoIDxjb2x1bW5fbWFzaz4gKT8gOworCis8Y29sdW1uX21hc2s+IDo6PSAiTUFTS0VEIiAiV0lUSCIgKCAiREVGQVVMVCIgfCA8ZnVuY3Rpb25OYW1lPiA8c2VsZWN0aW9uRnVuY3Rpb25Bcmd1bWVudHM+ICk7CiAKICMgTm90ZTogYXV0b2NvbXBsZXRlIGZvciBmcm96ZW4gY29sbGVjdGlvbiB0eXBlcyBkb2VzIG5vdCBoYW5kbGUgbmVzdGluZyBwYXN0IGRlcHRoIDEgcHJvcGVybHksCiAjIGJ1dCB0aGF0J3MgYSBsb3Qgb2Ygd29yayB0byBmaXggZm9yIGxpdHRsZSBiZW5lZml0LgpAQCAtNTE5LDYgKzUxNiwxMCBAQAogICAgICAgICByZXR1cm4gW0hpbnQoJzx0cnVlfGZhbHNlPicpXQogICAgIGlmIHRoaXNfb3B0IGluICgncmVhZF9yZXBhaXInKToKICAgICAgICAgcmV0dXJuIFtIaW50KCc8XCdub25lXCd8XCdibG9ja2luZ1wnPicpXQorICAgIGlmIHRoaXNfb3B0ID09ICdhbGxvd19hdXRvX3NuYXBzaG90JzoKKyAgICAgICAgcmV0dXJuIFtIaW50KCc8Ym9vbGVhbj4nKV0KKyAgICBpZiB0aGlzX29wdCA9PSAnaW5jcmVtZW50YWxfYmFja3Vwcyc6CisgICAgICAgIHJldHVybiBbSGludCgnPGJvb2xlYW4+JyldCiAgICAgcmV0dXJuIFtIaW50KCc8b3B0aW9uX3ZhbHVlPicpXQogCiAKQEAgLTU0Nyw4ICs1NDgsNiBAQAogICAgICAgICAgICAgb3B0cyA9IG9wdHMudW5pb24oc2V0KENxbFJ1bGVTZXQuc2l6ZV90aWVyZWRfY29tcGFjdGlvbl9zdHJhdGVneV9vcHRpb25zKSkKICAgICAgICAgZWxpZiBjc2MgPT0gJ0xldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3knOgogICAgICAgICAgICAgb3B0cyA9IG9wdHMudW5pb24oc2V0KENxbFJ1bGVTZXQubGV2ZWxlZF9jb21wYWN0aW9uX3N0cmF0ZWd5X29wdGlvbnMpKQotICAgICAgICBlbGlmIGNzYyA9PSAnRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSc6Ci0gICAgICAgICAgICBvcHRzID0gb3B0cy51bmlvbihzZXQoQ3FsUnVsZVNldC5kYXRlX3RpZXJlZF9jb21wYWN0aW9uX3N0cmF0ZWd5X29wdGlvbnMpKQogICAgICAgICBlbGlmIGNzYyA9PSAnVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSc6CiAgICAgICAgICAgICBvcHRzID0gb3B0cy51bmlvbihzZXQoQ3FsUnVsZVNldC50aW1lX3dpbmRvd19jb21wYWN0aW9uX3N0cmF0ZWd5X29wdGlvbnMpKQogCkBAIC03MzYsNiArNzM1LDcgQEAKIDxzZWxlY3Rvcj4gOjo9IFtjb2xuYW1lXT08Y2lkZW50PiAoICJbIiAoIDx0ZXJtPiAoICIuLiIgPHRlcm0+ICJdIiApPyB8IDx0ZXJtPiAiLi4iICkgKT8KICAgICAgICAgICAgICB8IDx1ZHRTdWJmaWVsZFNlbGVjdGlvbj4KICAgICAgICAgICAgICB8ICJXUklURVRJTUUiICIoIiBbY29sbmFtZV09PGNpZGVudD4gIikiCisgICAgICAgICAgICAgfCAiTUFYV1JJVEVUSU1FIiAiKCIgW2NvbG5hbWVdPTxjaWRlbnQ+ICIpIgogICAgICAgICAgICAgIHwgIlRUTCIgIigiIFtjb2xuYW1lXT08Y2lkZW50PiAiKSIKICAgICAgICAgICAgICB8ICJDT1VOVCIgIigiIHN0YXI9KCAiKiIgfCAiMSIgKSAiKSIKICAgICAgICAgICAgICB8ICJDQVNUIiAiKCIgPHNlbGVjdG9yPiAiQVMiIDxzdG9yYWdlVHlwZT4gIikiCkBAIC0xMzA4LDcgKzEzMDgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICJXSVRIIiA8Y2ZhbVByb3BlcnR5PiAoICJBTkQiIDxjZmFtUHJvcGVydHk+ICkqICk/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAKLTxjcmVhdGVVc2VyVHlwZVN0YXRlbWVudD4gOjo9ICJDUkVBVEUiICJUWVBFIiAoIGtzPTxub25TeXN0ZW1LZXlzcGFjZU5hbWU+IGRvdD0iLiIgKT8gdHlwZW5hbWU9PGNmT3JLc05hbWU+ICIoIiBuZXdjb2w9PGNpZGVudD4gPHN0b3JhZ2VUeXBlPgorPGNyZWF0ZVVzZXJUeXBlU3RhdGVtZW50PiA6Oj0gIkNSRUFURSIgIlRZUEUiICgiSUYiICJOT1QiICJFWElTVFMiKT8gKCBrcz08bm9uU3lzdGVtS2V5c3BhY2VOYW1lPiBkb3Q9Ii4iICk/IHR5cGVuYW1lPTxjZk9yS3NOYW1lPiAiKCIgbmV3Y29sPTxjaWRlbnQ+IDxzdG9yYWdlVHlwZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAiLCIgW25ld2NvbG5hbWVdPTxjaWRlbnQ+IDxzdG9yYWdlVHlwZT4gKSoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKSIKICAgICAgICAgICAgICAgICAgICAgICAgICA7CkBAIC0xMzcyLDcgKzEzNzIsNyBAQAogPGRyb3BNYXRlcmlhbGl6ZWRWaWV3U3RhdGVtZW50PiA6Oj0gIkRST1AiICJNQVRFUklBTElaRUQiICJWSUVXIiAoIklGIiAiRVhJU1RTIik/IG12PTxtYXRlcmlhbGl6ZWRWaWV3TmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAKLTxkcm9wVXNlclR5cGVTdGF0ZW1lbnQ+IDo6PSAiRFJPUCIgIlRZUEUiIHV0PTx1c2VyVHlwZU5hbWU+Cis8ZHJvcFVzZXJUeXBlU3RhdGVtZW50PiA6Oj0gIkRST1AiICJUWVBFIiAoICJJRiIgIkVYSVNUUyIgKT8gdXQ9PHVzZXJUeXBlTmFtZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgOwogCiA8ZHJvcEZ1bmN0aW9uU3RhdGVtZW50PiA6Oj0gIkRST1AiICJGVU5DVElPTiIgKCAiSUYiICJFWElTVFMiICk/IDx1c2VyRnVuY3Rpb25OYW1lPgpAQCAtMTQyMCw2ICsxNDIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICB8ICJXSVRIIiA8Y2ZhbVByb3BlcnR5PiAoICJBTkQiIDxjZmFtUHJvcGVydHk+ICkqCiAgICAgICAgICAgICAgICAgICAgICAgfCAiUkVOQU1FIiAoIklGIiAiRVhJU1RTIik/IGV4aXN0Y29sPTxjaWRlbnQ+ICJUTyIgbmV3Y29sPTxjaWRlbnQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgKCAiQU5EIiBleGlzdGNvbD08Y2lkZW50PiAiVE8iIG5ld2NvbD08Y2lkZW50PiApKgorICAgICAgICAgICAgICAgICAgICAgIHwgIkFMVEVSIiAoIklGIiAiRVhJU1RTIik/IGV4aXN0Y29sPTxjaWRlbnQ+ICggPGNvbHVtbl9tYXNrPiB8ICJEUk9QIiAiTUFTS0VEIiApCiAgICAgICAgICAgICAgICAgICAgICAgOwogCiA8YWx0ZXJVc2VyVHlwZVN0YXRlbWVudD4gOjo9ICJBTFRFUiIgIlRZUEUiICgiSUYiICJFWElTVFMiKT8gdXQ9PHVzZXJUeXBlTmFtZT4KQEAgLTE0ODMsMTIgKzE0ODQsMTIgQEAKICAgICAgICAgICAgICB8IDx1bnJlc2VydmVkS2V5d29yZD4KICAgICAgICAgICAgICA7CiAKLTxjcmVhdGVSb2xlU3RhdGVtZW50PiA6Oj0gIkNSRUFURSIgIlJPTEUiIDxyb2xlbmFtZT4KKzxjcmVhdGVSb2xlU3RhdGVtZW50PiA6Oj0gIkNSRUFURSIgIlJPTEUiICgiSUYiICJOT1QiICJFWElTVFMiKT8gPHJvbGVuYW1lPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAiV0lUSCIgPHJvbGVQcm9wZXJ0eT4gKCJBTkQiIDxyb2xlUHJvcGVydHk+KSopPwogICAgICAgICAgICAgICAgICAgICAgICAgOwogCiA8YWx0ZXJSb2xlU3RhdGVtZW50PiA6Oj0gIkFMVEVSIiAiUk9MRSIgKCJJRiIgIkVYSVNUUyIpPyA8cm9sZW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICJXSVRIIiA8cm9sZVByb3BlcnR5PiAoIkFORCIgPHJvbGVQcm9wZXJ0eT4pKik/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICJXSVRIIiA8cm9sZVByb3BlcnR5PiAoIkFORCIgPHJvbGVQcm9wZXJ0eT4pKikKICAgICAgICAgICAgICAgICAgICAgICAgOwogCiA8cm9sZVByb3BlcnR5PiA6Oj0gKCgiSEFTSEVEIik/ICJQQVNTV09SRCIpICI9IiA8c3RyaW5nTGl0ZXJhbD4KQEAgLTE0OTksNyArMTUwMCw3IEBACiAgICAgICAgICAgICAgICAgIHwgIkFDQ0VTUyIgIlRPIiAiQUxMIiAiREFUQUNFTlRFUlMiCiAgICAgICAgICAgICAgICAgIDsKIAotPGRyb3BSb2xlU3RhdGVtZW50PiA6Oj0gIkRST1AiICJST0xFIiA8cm9sZW5hbWU+Cis8ZHJvcFJvbGVTdGF0ZW1lbnQ+IDo6PSAiRFJPUCIgIlJPTEUiICgiSUYiICJFWElTVFMiKT8gPHJvbGVuYW1lPgogICAgICAgICAgICAgICAgICAgICAgIDsKIAogPGdyYW50Um9sZVN0YXRlbWVudD4gOjo9ICJHUkFOVCIgPHJvbGVuYW1lPiAiVE8iIDxyb2xlbmFtZT4KQEAgLTE1MzIsNiArMTUzMyw4IEBACiAgICAgICAgICAgICAgICB8ICJNT0RJRlkiCiAgICAgICAgICAgICAgICB8ICJERVNDUklCRSIKICAgICAgICAgICAgICAgIHwgIkVYRUNVVEUiCisgICAgICAgICAgICAgICB8ICJVTk1BU0siCisgICAgICAgICAgICAgICB8ICJTRUxFQ1RfTUFTS0VEIgogICAgICAgICAgICAgICAgOwogCiA8cGVybWlzc2lvbkV4cHI+IDo6PSAoIFtuZXdwZXJtaXNzaW9uXT08cGVybWlzc2lvbj4gIlBFUk1JU1NJT04iPyAoICIsIiBbbmV3cGVybWlzc2lvbl09PHBlcm1pc3Npb24+ICJQRVJNSVNTSU9OIj8gKSogKQpkaWZmIC0tZ2l0IGEvcHlsaWIvY3Fsc2hsaWIvY3FsaGFuZGxpbmcucHkgYi9weWxpYi9jcWxzaGxpYi9jcWxoYW5kbGluZy5weQppbmRleCBjYTEyYTI1Li41ZWEwMzkxIDEwMDY0NAotLS0gYS9weWxpYi9jcWxzaGxpYi9jcWxoYW5kbGluZy5weQorKysgYi9weWxpYi9jcWxzaGxpYi9jcWxoYW5kbGluZy5weQpAQCAtNDksNyArNDksNiBAQAogICAgIGF2YWlsYWJsZV9jb21wYWN0aW9uX2NsYXNzZXMgPSAoCiAgICAgICAgICdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5JywKICAgICAgICAgJ1NpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3knLAotICAgICAgICAnRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneScsCiAgICAgICAgICdUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5JwogICAgICkKIApkaWZmIC0tZ2l0IGEvcHlsaWIvY3Fsc2hsaWIvY3Fsc2hoYW5kbGluZy5weSBiL3B5bGliL2NxbHNobGliL2NxbHNoaGFuZGxpbmcucHkKaW5kZXggYWExZmJjMC4uZTZhMTIxZiAxMDA2NDQKLS0tIGEvcHlsaWIvY3Fsc2hsaWIvY3Fsc2hoYW5kbGluZy5weQorKysgYi9weWxpYi9jcWxzaGxpYi9jcWxzaGhhbmRsaW5nLnB5CkBAIC0zNyw3ICszNyw4IEBACiAgICAgJ2V4aXQnLAogICAgICdxdWl0JywKICAgICAnY2xlYXInLAotICAgICdjbHMnCisgICAgJ2NscycsCisgICAgJ2hpc3RvcnknCiApCiAKIGNxbHNoX3N5bnRheF9jb21wbGV0ZXJzID0gW10KQEAgLTczLDYgKzc0LDcgQEAKICAgICAgICAgICAgICAgICAgICB8IDxleGl0Q29tbWFuZD4KICAgICAgICAgICAgICAgICAgICB8IDxwYWdpbmdDb21tYW5kPgogICAgICAgICAgICAgICAgICAgIHwgPGNsZWFyQ29tbWFuZD4KKyAgICAgICAgICAgICAgICAgICB8IDxoaXN0b3J5Q29tbWFuZD4KICAgICAgICAgICAgICAgICAgICA7CiAnJycKIApAQCAtMTMxLDcgKzEzMyw3IEBACiAnJycKIAogY3Fsc2hfc2hvd19jbWRfc3ludGF4X3J1bGVzID0gcicnJwotPHNob3dDb21tYW5kPiA6Oj0gIlNIT1ciIHdoYXQ9KCAiVkVSU0lPTiIgfCAiSE9TVCIgfCAiU0VTU0lPTiIgc2Vzc2lvbmlkPTx1dWlkPiApCis8c2hvd0NvbW1hbmQ+IDo6PSAiU0hPVyIgd2hhdD0oICJWRVJTSU9OIiB8ICJIT1NUIiB8ICJTRVNTSU9OIiBzZXNzaW9uaWQ9PHV1aWQ+IHwgIlJFUExJQ0FTIiB0b2tlbj08aW50ZWdlcj4gKGtleXNwYWNlPTxrZXlzcGFjZU5hbWU+KT8gKQogICAgICAgICAgICAgICAgIDsKICcnJwogCkBAIC0xNDEsNyArMTQzLDcgQEAKICcnJwogCiBjcWxzaF9jYXB0dXJlX2NtZF9zeW50YXhfcnVsZXMgPSByJycnCi08Y2FwdHVyZUNvbW1hbmQ+IDo6PSAiQ0FQVFVSRSIgKCBmbmFtZT0oIDxzdHJpbmdMaXRlcmFsPiB8ICJPRkYiICkgKT8KKzxjYXB0dXJlQ29tbWFuZD4gOjo9ICJDQVBUVVJFIiAoIGZuYW1lPSggPHN0cmluZ0xpdGVyYWw+KSB8ICJPRkYiICk/CiAgICAgICAgICAgICAgICAgICAgOwogJycnCiAKQEAgLTE4OCw3ICsxOTAsNyBAQAogJycnCiAKIGNxbHNoX3BhZ2luZ19jbWRfc3ludGF4X3J1bGVzID0gcicnJwotPHBhZ2luZ0NvbW1hbmQ+IDo6PSAiUEFHSU5HIiAoIHN3aXRjaD0oICJPTiIgfCAiT0ZGIiB8IC9bMC05XSsvKSApPworPHBhZ2luZ0NvbW1hbmQ+IDo6PSAiUEFHSU5HIiAoIHN3aXRjaD0oICJPTiIgfCAiT0ZGIiB8IDx3aG9sZW51bWJlcj4pICk/CiAgICAgICAgICAgICAgICAgICA7CiAnJycKIApAQCAtMjA3LDYgKzIwOSwxMSBAQAogICAgICAgICAgICAgICAgICA7CiAnJycKIAorY3Fsc2hfaGlzdG9yeV9jbWRfc3ludGF4X3J1bGVzID0gcicnJworPGhpc3RvcnlDb21tYW5kPiA6Oj0gImhpc3RvcnkiIChuPTx3aG9sZW51bWJlcj4pPworICAgICAgICAgICAgICAgICAgICA7CisnJycKKwogY3Fsc2hfcXVlc3Rpb25fbWFyayA9IHInJycKIDxxbWFyaz4gOjo9ICI/IiA7CiAnJycKQEAgLTIzMiw2ICsyMzksNyBAQAogICAgIGNxbHNoX2xvZ2luX2NtZF9zeW50YXhfcnVsZXMgKyBcCiAgICAgY3Fsc2hfZXhpdF9jbWRfc3ludGF4X3J1bGVzICsgXAogICAgIGNxbHNoX2NsZWFyX2NtZF9zeW50YXhfcnVsZXMgKyBcCisgICAgY3Fsc2hfaGlzdG9yeV9jbWRfc3ludGF4X3J1bGVzICsgXAogICAgIGNxbHNoX3F1ZXN0aW9uX21hcmsKIAogCmRpZmYgLS1naXQgYS9weWxpYi9jcWxzaGxpYi9jcWxzaG1haW4ucHkgYi9weWxpYi9jcWxzaGxpYi9jcWxzaG1haW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2NmZmQ2OAotLS0gL2Rldi9udWxsCisrKyBiL3B5bGliL2NxbHNobGliL2NxbHNobWFpbi5weQpAQCAtMCwwICsxLDIzNzQgQEAKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCBjbWQKK2ltcG9ydCBjb2RlY3MKK2ltcG9ydCBjb25maWdwYXJzZXIKK2ltcG9ydCBjc3YKK2ltcG9ydCBnZXRwYXNzCitpbXBvcnQgb3B0cGFyc2UKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHdhcm5pbmdzCitpbXBvcnQgd2ViYnJvd3NlcgorZnJvbSBjb250ZXh0bGliIGltcG9ydCBjb250ZXh0bWFuYWdlcgorZnJvbSBpbyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gdXVpZCBpbXBvcnQgVVVJRAorCitVVEY4ID0gJ3V0Zi04JworCitkZXNjcmlwdGlvbiA9ICJDUUwgU2hlbGwgZm9yIEFwYWNoZSBDYXNzYW5kcmEiCit2ZXJzaW9uID0gIjYuMi4wIgorCityZWFkbGluZSA9IE5vbmUKK3RyeToKKyAgICAjIGNoZWNrIGlmIHR0eSBmaXJzdCwgY2F1c2UgcmVhZGxpbmUgZG9lc24ndCBjaGVjaywgYW5kIG9ubHkgY2FyZXMKKyAgICAjIGFib3V0ICRURVJNLiB3ZSBkb24ndCB3YW50IHRoZSBmdW5reSBlc2NhcGUgY29kZSBzdHVmZiB0byBiZQorICAgICMgb3V0cHV0IGlmIG5vdCBhIHR0eS4KKyAgICBpZiBzeXMuc3RkaW4uaXNhdHR5KCk6CisgICAgICAgIGltcG9ydCByZWFkbGluZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKKworIyBPbiBMaW51eCwgdGhlIFB5dGhvbiB3ZWJicm93c2VyIG1vZHVsZSB1c2VzIHRoZSAneGRnLW9wZW4nIGV4ZWN1dGFibGUKKyMgdG8gb3BlbiBhIGZpbGUvVVJMLiBCdXQgdGhhdCBvbmx5IHdvcmtzLCBpZiB0aGUgY3VycmVudCBzZXNzaW9uIGhhcyBiZWVuCisjIG9wZW5lZCBmcm9tIF93aXRoaW5fIGEgZGVza3RvcCBlbnZpcm9ubWVudC4gSS5lLiAneGRnLW9wZW4nIHdpbGwgZmFpbCwKKyMgaWYgdGhlIHNlc3Npb24ncyBiZWVuIG9wZW5lZCB2aWEgc3NoIHRvIGEgcmVtb3RlIGJveC4KKyMKK3RyeToKKyAgICB3ZWJicm93c2VyLnJlZ2lzdGVyX3N0YW5kYXJkX2Jyb3dzZXJzKCkgICMgcmVnaXN0cmF0aW9uIGlzIG90aGVyd2lzZSBsYXp5IGluIFB5dGhvbjMKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICBwYXNzCitpZiB3ZWJicm93c2VyLl90cnlvcmRlciBhbmQgd2ViYnJvd3Nlci5fdHJ5b3JkZXJbMF0gPT0gJ3hkZy1vcGVuJyBhbmQgb3MuZW52aXJvbi5nZXQoJ1hER19EQVRBX0RJUlMnLCAnJykgPT0gJyc6CisgICAgIyBvbmx5IG9uIExpbnV4IChzb21lIE9TIHdpdGggeGRnLW9wZW4pCisgICAgd2ViYnJvd3Nlci5fdHJ5b3JkZXIucmVtb3ZlKCd4ZGctb3BlbicpCisgICAgd2ViYnJvd3Nlci5fdHJ5b3JkZXIuYXBwZW5kKCd4ZGctb3BlbicpCisKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCByIi4qYmxpc3QuKiIpCisKK2ltcG9ydCBjYXNzYW5kcmEKK2Zyb20gY2Fzc2FuZHJhLmF1dGggaW1wb3J0IFBsYWluVGV4dEF1dGhQcm92aWRlcgorZnJvbSBjYXNzYW5kcmEuY2x1c3RlciBpbXBvcnQgQ2x1c3RlcgorZnJvbSBjYXNzYW5kcmEuY3FsdHlwZXMgaW1wb3J0IGNxbF90eXBlbmFtZQorZnJvbSBjYXNzYW5kcmEubWFyc2hhbCBpbXBvcnQgaW50NjRfdW5wYWNrCitmcm9tIGNhc3NhbmRyYS5tZXRhZGF0YSBpbXBvcnQgKENvbHVtbk1ldGFkYXRhLCBLZXlzcGFjZU1ldGFkYXRhLCBUYWJsZU1ldGFkYXRhKQorZnJvbSBjYXNzYW5kcmEucG9saWNpZXMgaW1wb3J0IFdoaXRlTGlzdFJvdW5kUm9iaW5Qb2xpY3kKK2Zyb20gY2Fzc2FuZHJhLnF1ZXJ5IGltcG9ydCBTaW1wbGVTdGF0ZW1lbnQsIG9yZGVyZWRfZGljdF9mYWN0b3J5LCBUcmFjZVVuYXZhaWxhYmxlCitmcm9tIGNhc3NhbmRyYS51dGlsIGltcG9ydCBkYXRldGltZV9mcm9tX3RpbWVzdGFtcAorCitmcm9tIGNxbHNobGliIGltcG9ydCBjcWwzaGFuZGxpbmcsIHB5bGV4b3Ryb24sIHNzbGhhbmRsaW5nLCBjcWxzaGhhbmRsaW5nLCBhdXRocHJvdmlkZXJoYW5kbGluZworZnJvbSBjcWxzaGxpYi5jb3B5dXRpbCBpbXBvcnQgRXhwb3J0VGFzaywgSW1wb3J0VGFzaworZnJvbSBjcWxzaGxpYi5kaXNwbGF5aW5nIGltcG9ydCAoQU5TSV9SRVNFVCwgQkxVRSwgQ09MVU1OX05BTUVfQ09MT1JTLCBDWUFOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVELCBXSElURSwgRm9ybWF0dGVkVmFsdWUsIGNvbG9ybWUpCitmcm9tIGNxbHNobGliLmZvcm1hdHRpbmcgaW1wb3J0IChERUZBVUxUX0RBVEVfRk9STUFULCBERUZBVUxUX05BTk9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVCwgQ3FsVHlwZSwgRGF0ZVRpbWVGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfYnlfdHlwZSkKK2Zyb20gY3Fsc2hsaWIudHJhY2luZyBpbXBvcnQgcHJpbnRfdHJhY2UsIHByaW50X3RyYWNlX3Nlc3Npb24KK2Zyb20gY3Fsc2hsaWIudXRpbCBpbXBvcnQgZ2V0X2ZpbGVfZW5jb2RpbmdfYm9tc2l6ZQorZnJvbSBjcWxzaGxpYi51dGlsIGltcG9ydCBpc19maWxlX3NlY3VyZQorCisKK0RFRkFVTFRfSE9TVCA9ICcxMjcuMC4wLjEnCitERUZBVUxUX1BPUlQgPSA5MDQyCitERUZBVUxUX1NTTCA9IEZhbHNlCitERUZBVUxUX0NPTk5FQ1RfVElNRU9VVF9TRUNPTkRTID0gNQorREVGQVVMVF9SRVFVRVNUX1RJTUVPVVRfU0VDT05EUyA9IDEwCisKK0RFRkFVTFRfRkxPQVRfUFJFQ0lTSU9OID0gNQorREVGQVVMVF9ET1VCTEVfUFJFQ0lTSU9OID0gNQorREVGQVVMVF9NQVhfVFJBQ0VfV0FJVCA9IDEwCisKK2lmIHJlYWRsaW5lIGlzIG5vdCBOb25lIGFuZCByZWFkbGluZS5fX2RvY19fIGlzIG5vdCBOb25lIGFuZCAnbGliZWRpdCcgaW4gcmVhZGxpbmUuX19kb2NfXzoKKyAgICBERUZBVUxUX0NPTVBMRVRFS0VZID0gJ1x0JworZWxzZToKKyAgICBERUZBVUxUX0NPTVBMRVRFS0VZID0gJ3RhYicKKworY3FsZG9jcyA9IE5vbmUKK2NxbHJ1bGVzZXQgPSBOb25lCitDQVNTQU5EUkFfQ1FMX0hUTUwgPSBOb25lCisKK2VwaWxvZyA9ICIiIkNvbm5lY3RzIHRvICUoREVGQVVMVF9IT1NUKXM6JShERUZBVUxUX1BPUlQpZCBieSBkZWZhdWx0LiBUaGVzZQorZGVmYXVsdHMgY2FuIGJlIGNoYW5nZWQgYnkgc2V0dGluZyAkQ1FMU0hfSE9TVCBhbmQvb3IgJENRTFNIX1BPUlQuIFdoZW4gYQoraG9zdCAoYW5kIG9wdGlvbmFsIHBvcnQgbnVtYmVyKSBhcmUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSwgdGhleSB0YWtlCitwcmVjZWRlbmNlIG92ZXIgYW55IGRlZmF1bHRzLiIiIiAlIGdsb2JhbHMoKQorCitwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoZGVzY3JpcHRpb249ZGVzY3JpcHRpb24sIGVwaWxvZz1lcGlsb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2U9IlVzYWdlOiAlcHJvZyBbb3B0aW9uc10gW2hvc3QgW3BvcnRdXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0nY3Fsc2ggJyArIHZlcnNpb24pCitwYXJzZXIuYWRkX29wdGlvbigiLUMiLCAiLS1jb2xvciIsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J2NvbG9yJywKKyAgICAgICAgICAgICAgICAgIGhlbHA9J0Fsd2F5cyB1c2UgY29sb3Igb3V0cHV0JykKK3BhcnNlci5hZGRfb3B0aW9uKCItLW5vLWNvbG9yIiwgYWN0aW9uPSdzdG9yZV9mYWxzZScsIGRlc3Q9J2NvbG9yJywKKyAgICAgICAgICAgICAgICAgIGhlbHA9J05ldmVyIHVzZSBjb2xvciBvdXRwdXQnKQorcGFyc2VyLmFkZF9vcHRpb24oIi0tYnJvd3NlciIsIGRlc3Q9J2Jyb3dzZXInLCBoZWxwPSIiIlRoZSBicm93c2VyIHRvIHVzZSB0byBkaXNwbGF5IENRTCBoZWxwLCB3aGVyZSBCUk9XU0VSIGNhbiBiZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGJyb3dzZXJzIGluIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMvbGlicmFyeS93ZWJicm93c2VyLmh0bWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBicm93c2VyIHBhdGggZm9sbG93ZWQgYnkgJXMsIGV4YW1wbGU6IC91c3IvYmluL2dvb2dsZS1jaHJvbWUtc3RhYmxlICVzIiIiKQorcGFyc2VyLmFkZF9vcHRpb24oJy0tc3NsJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nVXNlIFNTTCcsIGRlZmF1bHQ9RmFsc2UpCitwYXJzZXIuYWRkX29wdGlvbigiLXUiLCAiLS11c2VybmFtZSIsIGhlbHA9IkF1dGhlbnRpY2F0ZSBhcyB1c2VyLiIpCitwYXJzZXIuYWRkX29wdGlvbigiLXAiLCAiLS1wYXNzd29yZCIsIGhlbHA9IkF1dGhlbnRpY2F0ZSB1c2luZyBwYXNzd29yZC4iKQorcGFyc2VyLmFkZF9vcHRpb24oJy1rJywgJy0ta2V5c3BhY2UnLCBoZWxwPSdBdXRoZW50aWNhdGUgdG8gdGhlIGdpdmVuIGtleXNwYWNlLicpCitwYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1maWxlIiwgaGVscD0iRXhlY3V0ZSBjb21tYW5kcyBmcm9tIEZJTEUsIHRoZW4gZXhpdCIpCitwYXJzZXIuYWRkX29wdGlvbignLS1kZWJ1ZycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICBoZWxwPSdTaG93IGFkZGl0aW9uYWwgZGVidWdnaW5nIGluZm9ybWF0aW9uJykKK3BhcnNlci5hZGRfb3B0aW9uKCctLWNvdmVyYWdlJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgIGhlbHA9J0NvbGxlY3QgY292ZXJhZ2UgZGF0YScpCitwYXJzZXIuYWRkX29wdGlvbigiLS1lbmNvZGluZyIsIGhlbHA9IlNwZWNpZnkgYSBub24tZGVmYXVsdCBlbmNvZGluZyBmb3Igb3V0cHV0LiIKKyAgICAgICAgICAgICAgICAgICsgIiAoRGVmYXVsdDogJXMpIiAlIChVVEY4LCkpCitwYXJzZXIuYWRkX29wdGlvbigiLS1jcWxzaHJjIiwgaGVscD0iU3BlY2lmeSBhbiBhbHRlcm5hdGl2ZSBjcWxzaHJjIGZpbGUgbG9jYXRpb24uIikKK3BhcnNlci5hZGRfb3B0aW9uKCItLWNyZWRlbnRpYWxzIiwgaGVscD0iU3BlY2lmeSBhbiBhbHRlcm5hdGl2ZSBjcmVkZW50aWFscyBmaWxlIGxvY2F0aW9uLiIpCitwYXJzZXIuYWRkX29wdGlvbignLS1jcWx2ZXJzaW9uJywgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSBhIHBhcnRpY3VsYXIgQ1FMIHZlcnNpb24sICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ2J5IGRlZmF1bHQgdGhlIGhpZ2hlc3QgdmVyc2lvbiBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlciB3aWxsIGJlIHVzZWQuJworICAgICAgICAgICAgICAgICAgICAgICAnIEV4YW1wbGVzOiAiMy4wLjMiLCAiMy4xLjAiJykKK3BhcnNlci5hZGRfb3B0aW9uKCItLXByb3RvY29sLXZlcnNpb24iLCB0eXBlPSJpbnQiLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICBoZWxwPSdTcGVjaWZ5IGEgc3BlY2lmaWMgcHJvdGNvbCB2ZXJzaW9uIG90aGVyd2lzZSB0aGUgY2xpZW50IHdpbGwgZGVmYXVsdCBhbmQgZG93bmdyYWRlIGFzIG5lY2Vzc2FyeScpCisKK3BhcnNlci5hZGRfb3B0aW9uKCItZSIsICItLWV4ZWN1dGUiLCBoZWxwPSdFeGVjdXRlIHRoZSBzdGF0ZW1lbnQgYW5kIHF1aXQuJykKK3BhcnNlci5hZGRfb3B0aW9uKCItLWNvbm5lY3QtdGltZW91dCIsIGRlZmF1bHQ9REVGQVVMVF9DT05ORUNUX1RJTUVPVVRfU0VDT05EUywgZGVzdD0nY29ubmVjdF90aW1lb3V0JywKKyAgICAgICAgICAgICAgICAgIGhlbHA9J1NwZWNpZnkgdGhlIGNvbm5lY3Rpb24gdGltZW91dCBpbiBzZWNvbmRzIChkZWZhdWx0OiAlZGVmYXVsdCBzZWNvbmRzKS4nKQorcGFyc2VyLmFkZF9vcHRpb24oIi0tcmVxdWVzdC10aW1lb3V0IiwgZGVmYXVsdD1ERUZBVUxUX1JFUVVFU1RfVElNRU9VVF9TRUNPTkRTLCBkZXN0PSdyZXF1ZXN0X3RpbWVvdXQnLAorICAgICAgICAgICAgICAgICAgaGVscD0nU3BlY2lmeSB0aGUgZGVmYXVsdCByZXF1ZXN0IHRpbWVvdXQgaW4gc2Vjb25kcyAoZGVmYXVsdDogJWRlZmF1bHQgc2Vjb25kcykuJykKK3BhcnNlci5hZGRfb3B0aW9uKCItdCIsICItLXR0eSIsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlc3Q9J3R0eScsCisgICAgICAgICAgICAgICAgICBoZWxwPSdGb3JjZSB0dHkgbW9kZSAoY29tbWFuZCBwcm9tcHQpLicpCitwYXJzZXIuYWRkX29wdGlvbignLXYnLCBhY3Rpb249InZlcnNpb24iLCBoZWxwPSdQcmludCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIGNxbHNoLicpCisKKyMgVGhpcyBpcyBhIGhpZGRlbiBvcHRpb24gdG8gc3VwcHJlc3MgdGhlIHdhcm5pbmcgd2hlbiB0aGUgLXAvLS1wYXNzd29yZCBjb21tYW5kIGxpbmUgb3B0aW9uIGlzIHVzZWQuCisjIFBvd2VyIHVzZXJzIG1heSB1c2UgdGhpcyBvcHRpb24gaWYgdGhleSBrbm93IG5vIG90aGVyIHBlb3BsZSBoYXMgYWNjZXNzIHRvIHRoZSBzeXN0ZW0gd2hlcmUgY3Fsc2ggaXMgcnVuIG9yIGRvbid0IGNhcmUgYWJvdXQgc2VjdXJpdHkuCisjIFVzZSBvZiB0aGlzIG9wdGlvbiBpbiBzY3JpcHRpbmcgaXMgZGlzY291cmFnZWQuIFBsZWFzZSB1c2UgYSAodGVtcG9yYXJ5KSBjcmVkZW50aWFscyBmaWxlIHdoZXJlIHBvc3NpYmxlLgorIyBUaGUgQ2Fzc2FuZHJhIGRpc3RyaWJ1dGVkIHRlc3RzIChkdGVzdHMpIGFsc28gdXNlIHRoaXMgb3B0aW9uIGluIHNvbWUgdGVzdHMgd2hlbiBhIHdlbGwta25vd24gcGFzc3dvcmQgaXMgc3VwcGxpZWQgdmlhIHRoZSBjb21tYW5kIGxpbmUuCitwYXJzZXIuYWRkX29wdGlvbigiLS1pbnNlY3VyZS1wYXNzd29yZC13aXRob3V0LXdhcm5pbmciLCBhY3Rpb249J3N0b3JlX3RydWUnLCBkZXN0PSdpbnNlY3VyZV9wYXNzd29yZF93aXRob3V0X3dhcm5pbmcnLAorICAgICAgICAgICAgICAgICAgaGVscD1vcHRwYXJzZS5TVVBQUkVTU19IRUxQKQorCisjIHVzZSBjZm9wdGlvbnMgZm9yIGNvbmZpZyBmaWxlCisKK29wdF92YWx1ZXMgPSBvcHRwYXJzZS5WYWx1ZXMoKQorKGNmb3B0aW9ucywgYXJndW1lbnRzKSA9IHBhcnNlci5wYXJzZV9hcmdzKHN5cy5hcmd2WzE6XSwgdmFsdWVzPW9wdF92YWx1ZXMpCisKKyMgQkVHSU4gaGlzdG9yeSBjb25maWcKKworCitkZWYgbWtkaXJwKHBhdGgpOgorICAgICIiIkNyZWF0ZXMgYWxsIHBhcmVudCBkaXJlY3RvcmllcyB1cCB0byBwYXRoIHBhcmFtZXRlciBvciBmYWlscyB3aGVuIHBhdGggZXhpc3RzLCBidXQgaXQgaXMgbm90IGEgZGlyZWN0b3J5LiIiIgorCisgICAgdHJ5OgorICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICAgICAgICAgIHJhaXNlCisKKworZGVmIHJlc29sdmVfY3FsX2hpc3RvcnlfZmlsZSgpOgorICAgIGRlZmF1bHRfY3FsX2hpc3RvcnkgPSBvcy5wYXRoLmV4cGFuZHVzZXIob3MucGF0aC5qb2luKCd+JywgJy5jYXNzYW5kcmEnLCAnY3Fsc2hfaGlzdG9yeScpKQorICAgIGlmICdDUUxfSElTVE9SWScgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgcmV0dXJuIG9zLmVudmlyb25bJ0NRTF9ISVNUT1JZJ10KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gZGVmYXVsdF9jcWxfaGlzdG9yeQorCisKK0hJU1RPUlkgPSByZXNvbHZlX2NxbF9oaXN0b3J5X2ZpbGUoKQorSElTVE9SWV9ESVIgPSBvcy5wYXRoLmRpcm5hbWUoSElTVE9SWSkKKwordHJ5OgorICAgIG1rZGlycChISVNUT1JZX0RJUikKK2V4Y2VwdCBPU0Vycm9yOgorICAgIHByaW50KCdcbldhcm5pbmc6IENhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IGF0IGAlc2AuIENvbW1hbmQgaGlzdG9yeSB3aWxsIG5vdCBiZSBzYXZlZC4gUGxlYXNlIGNoZWNrIHdoYXQgd2FzIHRoZSBlbnZpcm9ubWVudCBwcm9wZXJ0eSBDUUxfSElTVE9SWSBzZXQgdG8uXG4nICUgSElTVE9SWV9ESVIpCisKKworIyBFTkQgaGlzdG9yeSBjb25maWcKKworCitERUZBVUxUX0NRTFNIUkMgPSBvcy5wYXRoLmV4cGFuZHVzZXIob3MucGF0aC5qb2luKCd+JywgJy5jYXNzYW5kcmEnLCAnY3Fsc2hyYycpKQorCitpZiBoYXNhdHRyKGNmb3B0aW9ucywgJ2NxbHNocmMnKToKKyAgICBDT05GSUdfRklMRSA9IG9zLnBhdGguZXhwYW5kdXNlcihjZm9wdGlvbnMuY3Fsc2hyYykKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoQ09ORklHX0ZJTEUpOgorICAgICAgICBwcmludCgnXG5XYXJuaW5nOiBTcGVjaWZpZWQgY3Fsc2hyYyBsb2NhdGlvbiBgJXNgIGRvZXMgbm90IGV4aXN0LiAgVXNpbmcgYCVzYCBpbnN0ZWFkLlxuJyAlIChDT05GSUdfRklMRSwgREVGQVVMVF9DUUxTSFJDKSkKKyAgICAgICAgQ09ORklHX0ZJTEUgPSBERUZBVUxUX0NRTFNIUkMKK2Vsc2U6CisgICAgQ09ORklHX0ZJTEUgPSBERUZBVUxUX0NRTFNIUkMKKworQ1FMX0RJUiA9IG9zLnBhdGguZGlybmFtZShDT05GSUdfRklMRSkKKworQ1FMX0VSUk9SUyA9ICgKKyAgICBjYXNzYW5kcmEuQWxyZWFkeUV4aXN0cywgY2Fzc2FuZHJhLkF1dGhlbnRpY2F0aW9uRmFpbGVkLCBjYXNzYW5kcmEuQ29vcmRpbmF0aW9uRmFpbHVyZSwKKyAgICBjYXNzYW5kcmEuSW52YWxpZFJlcXVlc3QsIGNhc3NhbmRyYS5UaW1lb3V0LCBjYXNzYW5kcmEuVW5hdXRob3JpemVkLCBjYXNzYW5kcmEuT3BlcmF0aW9uVGltZWRPdXQsCisgICAgY2Fzc2FuZHJhLmNsdXN0ZXIuTm9Ib3N0QXZhaWxhYmxlLAorICAgIGNhc3NhbmRyYS5jb25uZWN0aW9uLkNvbm5lY3Rpb25CdXN5LCBjYXNzYW5kcmEuY29ubmVjdGlvbi5Qcm90b2NvbEVycm9yLCBjYXNzYW5kcmEuY29ubmVjdGlvbi5Db25uZWN0aW9uRXhjZXB0aW9uLAorICAgIGNhc3NhbmRyYS5wcm90b2NvbC5FcnJvck1lc3NhZ2UsIGNhc3NhbmRyYS5wcm90b2NvbC5JbnRlcm5hbEVycm9yLCBjYXNzYW5kcmEucXVlcnkuVHJhY2VVbmF2YWlsYWJsZQorKQorCitkZWJ1Z19jb21wbGV0aW9uID0gYm9vbChvcy5lbnZpcm9uLmdldCgnQ1FMU0hfREVCVUdfQ09NUExFVElPTicsICcnKSA9PSAnWUVTJykKKworCitjbGFzcyBOb0tleXNwYWNlRXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKworY2xhc3MgS2V5c3BhY2VOb3RGb3VuZChFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBDb2x1bW5GYW1pbHlOb3RGb3VuZChFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBJbmRleE5vdEZvdW5kKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIE1hdGVyaWFsaXplZFZpZXdOb3RGb3VuZChFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBPYmplY3ROb3RGb3VuZChFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBWZXJzaW9uTm90U3VwcG9ydGVkKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIFVzZXJUeXBlTm90Rm91bmQoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKworY2xhc3MgRnVuY3Rpb25Ob3RGb3VuZChFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBBZ2dyZWdhdGVOb3RGb3VuZChFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBEZWNvZGVFcnJvcihFeGNlcHRpb24pOgorICAgIHZlcmIgPSAnZGVjb2RlJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRoZWJ5dGVzLCBlcnIsIGNvbG5hbWU9Tm9uZSk6CisgICAgICAgIHNlbGYudGhlYnl0ZXMgPSB0aGVieXRlcworICAgICAgICBzZWxmLmVyciA9IGVycgorICAgICAgICBzZWxmLmNvbG5hbWUgPSBjb2xuYW1lCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmLnRoZWJ5dGVzKQorCisgICAgZGVmIG1lc3NhZ2Uoc2VsZik6CisgICAgICAgIHdoYXQgPSAndmFsdWUgJXInICUgKHNlbGYudGhlYnl0ZXMsKQorICAgICAgICBpZiBzZWxmLmNvbG5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB3aGF0ID0gJ3ZhbHVlICVyIChmb3IgY29sdW1uICVyKScgJSAoc2VsZi50aGVieXRlcywgc2VsZi5jb2xuYW1lKQorICAgICAgICByZXR1cm4gJ0ZhaWxlZCB0byAlcyAlcyA6ICVzJyBcCisgICAgICAgICAgICAgICAlIChzZWxmLnZlcmIsIHdoYXQsIHNlbGYuZXJyKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJzwlcyAlcz4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLm1lc3NhZ2UoKSkKKworCitkZWYgbWF5YmVfZW5zdXJlX3RleHQodmFsKToKKyAgICByZXR1cm4gc3RyKHZhbCkgaWYgdmFsIGVsc2UgdmFsCisKKworY2xhc3MgRm9ybWF0RXJyb3IoRGVjb2RlRXJyb3IpOgorICAgIHZlcmIgPSAnZm9ybWF0JworCisKK2RlZiBmdWxsX2NxbF92ZXJzaW9uKHZlcik6CisgICAgd2hpbGUgdmVyLmNvdW50KCcuJykgPCAyOgorICAgICAgICB2ZXIgKz0gJy4wJworICAgIHZlcl9wYXJ0cyA9IHZlci5zcGxpdCgnLScsIDEpICsgWycnXQorICAgIHZlcnR1cGxlID0gdHVwbGUobGlzdChtYXAoaW50LCB2ZXJfcGFydHNbMF0uc3BsaXQoJy4nKSkpICsgW3Zlcl9wYXJ0c1sxXV0pCisgICAgcmV0dXJuIHZlciwgdmVydHVwbGUKKworCitkZWYgZm9ybWF0X3ZhbHVlKHZhbCwgY3FsdHlwZSwgZW5jb2RpbmcsIGFkZGNvbG9yPUZhbHNlLCBkYXRlX3RpbWVfZm9ybWF0PU5vbmUsCisgICAgICAgICAgICAgICAgIGZsb2F0X3ByZWNpc2lvbj1Ob25lLCBjb2xvcm1hcD1Ob25lLCBudWxsdmFsPU5vbmUpOgorICAgIGlmIGlzaW5zdGFuY2UodmFsLCBEZWNvZGVFcnJvcik6CisgICAgICAgIGlmIGFkZGNvbG9yOgorICAgICAgICAgICAgcmV0dXJuIGNvbG9ybWUocmVwcih2YWwudGhlYnl0ZXMpLCBjb2xvcm1hcCwgJ2Vycm9yJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBGb3JtYXR0ZWRWYWx1ZShyZXByKHZhbC50aGVieXRlcykpCisgICAgcmV0dXJuIGZvcm1hdF9ieV90eXBlKHZhbCwgY3FsdHlwZT1jcWx0eXBlLCBlbmNvZGluZz1lbmNvZGluZywgY29sb3JtYXA9Y29sb3JtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGNvbG9yPWFkZGNvbG9yLCBudWxsdmFsPW51bGx2YWwsIGRhdGVfdGltZV9mb3JtYXQ9ZGF0ZV90aW1lX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRfcHJlY2lzaW9uPWZsb2F0X3ByZWNpc2lvbikKKworCitkZWYgc2hvd193YXJuaW5nX3dpdGhvdXRfcXVvdGluZ19saW5lKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlPU5vbmUsIGxpbmU9Tm9uZSk6CisgICAgaWYgZmlsZSBpcyBOb25lOgorICAgICAgICBmaWxlID0gc3lzLnN0ZGVycgorICAgIHRyeToKKyAgICAgICAgZmlsZS53cml0ZSh3YXJuaW5ncy5mb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lPScnKSkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcGFzcworCisKK3dhcm5pbmdzLnNob3d3YXJuaW5nID0gc2hvd193YXJuaW5nX3dpdGhvdXRfcXVvdGluZ19saW5lCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnYWx3YXlzJywgY2F0ZWdvcnk9Y3FsM2hhbmRsaW5nLlVuZXhwZWN0ZWRUYWJsZVN0cnVjdHVyZSkKKworCitjbGFzcyBTaGVsbChjbWQuQ21kKToKKyAgICBjdXN0b21fcHJvbXB0ID0gb3MuZ2V0ZW52KCdDUUxTSF9QUk9NUFQnLCAnJykKKyAgICBpZiBjdXN0b21fcHJvbXB0ICE9ICcnOgorICAgICAgICBjdXN0b21fcHJvbXB0ICs9ICJcbiIKKyAgICBkZWZhdWx0X3Byb21wdCA9IGN1c3RvbV9wcm9tcHQgKyAiY3Fsc2g+ICIKKyAgICBjb250aW51ZV9wcm9tcHQgPSAiICAgLi4uICIKKyAgICBrZXlzcGFjZV9wcm9tcHQgPSBjdXN0b21fcHJvbXB0ICsgImNxbHNoOnt9PiAiCisgICAga2V5c3BhY2VfY29udGludWVfcHJvbXB0ID0gInt9ICAgIC4uLiAiCisgICAgc2hvd19saW5lX251bXMgPSBGYWxzZQorICAgIGRlYnVnID0gRmFsc2UKKyAgICBjb3ZlcmFnZSA9IEZhbHNlCisgICAgY292ZXJhZ2VyY19wYXRoID0gTm9uZQorICAgIHN0b3AgPSBGYWxzZQorICAgIGxhc3RfaGlzdCA9IE5vbmUKKyAgICBzaHVudGVkX3F1ZXJ5X291dCA9IE5vbmUKKyAgICB1c2VfcGFnaW5nID0gVHJ1ZQorCisgICAgZGVmYXVsdF9wYWdlX3NpemUgPSAxMDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0bmFtZSwgcG9ydCwgY29sb3I9RmFsc2UsCisgICAgICAgICAgICAgICAgIHVzZXJuYW1lPU5vbmUsIGVuY29kaW5nPU5vbmUsIHN0ZGluPU5vbmUsIHR0eT1UcnVlLAorICAgICAgICAgICAgICAgICBjb21wbGV0ZWtleT1ERUZBVUxUX0NPTVBMRVRFS0VZLCBicm93c2VyPU5vbmUsIHVzZV9jb25uPU5vbmUsCisgICAgICAgICAgICAgICAgIGNxbHZlcj1Ob25lLCBrZXlzcGFjZT1Ob25lLAorICAgICAgICAgICAgICAgICB0cmFjaW5nX2VuYWJsZWQ9RmFsc2UsIGV4cGFuZF9lbmFibGVkPUZhbHNlLAorICAgICAgICAgICAgICAgICBkaXNwbGF5X25hbm90aW1lX2Zvcm1hdD1ERUZBVUxUX05BTk9USU1FX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgZGlzcGxheV90aW1lc3RhbXBfZm9ybWF0PURFRkFVTFRfVElNRVNUQU1QX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgZGlzcGxheV9kYXRlX2Zvcm1hdD1ERUZBVUxUX0RBVEVfRk9STUFULAorICAgICAgICAgICAgICAgICBkaXNwbGF5X2Zsb2F0X3ByZWNpc2lvbj1ERUZBVUxUX0ZMT0FUX1BSRUNJU0lPTiwKKyAgICAgICAgICAgICAgICAgZGlzcGxheV9kb3VibGVfcHJlY2lzaW9uPURFRkFVTFRfRE9VQkxFX1BSRUNJU0lPTiwKKyAgICAgICAgICAgICAgICAgZGlzcGxheV90aW1lem9uZT1Ob25lLAorICAgICAgICAgICAgICAgICBtYXhfdHJhY2Vfd2FpdD1ERUZBVUxUX01BWF9UUkFDRV9XQUlULAorICAgICAgICAgICAgICAgICBzc2w9RmFsc2UsCisgICAgICAgICAgICAgICAgIHNpbmdsZV9zdGF0ZW1lbnQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgcmVxdWVzdF90aW1lb3V0PURFRkFVTFRfUkVRVUVTVF9USU1FT1VUX1NFQ09ORFMsCisgICAgICAgICAgICAgICAgIHByb3RvY29sX3ZlcnNpb249Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29ubmVjdF90aW1lb3V0PURFRkFVTFRfQ09OTkVDVF9USU1FT1VUX1NFQ09ORFMsCisgICAgICAgICAgICAgICAgIGlzX3N1YnNoZWxsPUZhbHNlLAorICAgICAgICAgICAgICAgICBhdXRoX3Byb3ZpZGVyPU5vbmUpOgorICAgICAgICBjbWQuQ21kLl9faW5pdF9fKHNlbGYsIGNvbXBsZXRla2V5PWNvbXBsZXRla2V5KQorICAgICAgICBzZWxmLmhvc3RuYW1lID0gaG9zdG5hbWUKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLmF1dGhfcHJvdmlkZXIgPSBhdXRoX3Byb3ZpZGVyCisgICAgICAgIHNlbGYudXNlcm5hbWUgPSB1c2VybmFtZQorCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYXV0aF9wcm92aWRlciwgUGxhaW5UZXh0QXV0aFByb3ZpZGVyKToKKyAgICAgICAgICAgIHNlbGYudXNlcm5hbWUgPSBhdXRoX3Byb3ZpZGVyLnVzZXJuYW1lCisgICAgICAgICAgICBpZiBub3QgYXV0aF9wcm92aWRlci5wYXNzd29yZDoKKyAgICAgICAgICAgICAgICAjIGlmIG5vIHBhc3N3b3JkIGlzIHByb3ZpZGVkLCB3ZSBuZWVkIHRvIHF1ZXJ5IHRoZSB1c2VyIHRvIGdldCBvbmUuCisgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRwYXNzLmdldHBhc3MoKQorICAgICAgICAgICAgICAgIHNlbGYuYXV0aF9wcm92aWRlciA9IFBsYWluVGV4dEF1dGhQcm92aWRlcih1c2VybmFtZT1hdXRoX3Byb3ZpZGVyLnVzZXJuYW1lLCBwYXNzd29yZD1wYXNzd29yZCkKKworICAgICAgICBzZWxmLmtleXNwYWNlID0ga2V5c3BhY2UKKyAgICAgICAgc2VsZi5zc2wgPSBzc2wKKyAgICAgICAgc2VsZi50cmFjaW5nX2VuYWJsZWQgPSB0cmFjaW5nX2VuYWJsZWQKKyAgICAgICAgc2VsZi5wYWdlX3NpemUgPSBzZWxmLmRlZmF1bHRfcGFnZV9zaXplCisgICAgICAgIHNlbGYuZXhwYW5kX2VuYWJsZWQgPSBleHBhbmRfZW5hYmxlZAorICAgICAgICBpZiB1c2VfY29ubjoKKyAgICAgICAgICAgIHNlbGYuY29ubiA9IHVzZV9jb25uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBrd2FyZ3MgPSB7fQorICAgICAgICAgICAgaWYgcHJvdG9jb2xfdmVyc2lvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBrd2FyZ3NbJ3Byb3RvY29sX3ZlcnNpb24nXSA9IHByb3RvY29sX3ZlcnNpb24KKyAgICAgICAgICAgIHNlbGYuY29ubiA9IENsdXN0ZXIoY29udGFjdF9wb2ludHM9KHNlbGYuaG9zdG5hbWUsKSwgcG9ydD1zZWxmLnBvcnQsIGNxbF92ZXJzaW9uPWNxbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9wcm92aWRlcj1zZWxmLmF1dGhfcHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF9vcHRpb25zPXNzbGhhbmRsaW5nLnNzbF9zZXR0aW5ncyhob3N0bmFtZSwgQ09ORklHX0ZJTEUpIGlmIHNzbCBlbHNlIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfYmFsYW5jaW5nX3BvbGljeT1XaGl0ZUxpc3RSb3VuZFJvYmluUG9saWN5KFtzZWxmLmhvc3RuYW1lXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xfY29ubmVjdGlvbl90aW1lb3V0PWNvbm5lY3RfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF90aW1lb3V0PWNvbm5lY3RfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpCisgICAgICAgIHNlbGYub3duc19jb25uZWN0aW9uID0gbm90IHVzZV9jb25uCisKKyAgICAgICAgaWYga2V5c3BhY2U6CisgICAgICAgICAgICBzZWxmLnNlc3Npb24gPSBzZWxmLmNvbm4uY29ubmVjdChrZXlzcGFjZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2Vzc2lvbiA9IHNlbGYuY29ubi5jb25uZWN0KCkKKworICAgICAgICBpZiBicm93c2VyID09ICIiOgorICAgICAgICAgICAgYnJvd3NlciA9IE5vbmUKKyAgICAgICAgc2VsZi5icm93c2VyID0gYnJvd3NlcgorICAgICAgICBzZWxmLmNvbG9yID0gY29sb3IKKworICAgICAgICBzZWxmLmRpc3BsYXlfbmFub3RpbWVfZm9ybWF0ID0gZGlzcGxheV9uYW5vdGltZV9mb3JtYXQKKyAgICAgICAgc2VsZi5kaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQgPSBkaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQKKyAgICAgICAgc2VsZi5kaXNwbGF5X2RhdGVfZm9ybWF0ID0gZGlzcGxheV9kYXRlX2Zvcm1hdAorCisgICAgICAgIHNlbGYuZGlzcGxheV9mbG9hdF9wcmVjaXNpb24gPSBkaXNwbGF5X2Zsb2F0X3ByZWNpc2lvbgorICAgICAgICBzZWxmLmRpc3BsYXlfZG91YmxlX3ByZWNpc2lvbiA9IGRpc3BsYXlfZG91YmxlX3ByZWNpc2lvbgorCisgICAgICAgIHNlbGYuZGlzcGxheV90aW1lem9uZSA9IGRpc3BsYXlfdGltZXpvbmUKKworICAgICAgICBzZWxmLnNlc3Npb24uZGVmYXVsdF90aW1lb3V0ID0gcmVxdWVzdF90aW1lb3V0CisgICAgICAgIHNlbGYuc2Vzc2lvbi5yb3dfZmFjdG9yeSA9IG9yZGVyZWRfZGljdF9mYWN0b3J5CisgICAgICAgIHNlbGYuc2Vzc2lvbi5kZWZhdWx0X2NvbnNpc3RlbmN5X2xldmVsID0gY2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwuT05FCisgICAgICAgIHNlbGYuZ2V0X2Nvbm5lY3Rpb25fdmVyc2lvbnMoKQorICAgICAgICBzZWxmLnNldF9leHBhbmRlZF9jcWxfdmVyc2lvbihzZWxmLmNvbm5lY3Rpb25fdmVyc2lvbnNbJ2NxbCddKQorCisgICAgICAgIHNlbGYuY3VycmVudF9rZXlzcGFjZSA9IGtleXNwYWNlCisKKyAgICAgICAgc2VsZi5tYXhfdHJhY2Vfd2FpdCA9IG1heF90cmFjZV93YWl0CisgICAgICAgIHNlbGYuc2Vzc2lvbi5tYXhfdHJhY2Vfd2FpdCA9IG1heF90cmFjZV93YWl0CisKKyAgICAgICAgc2VsZi50dHkgPSB0dHkKKyAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCisKKyAgICAgICAgc2VsZi5vdXRwdXRfY29kZWMgPSBjb2RlY3MubG9va3VwKGVuY29kaW5nKQorCisgICAgICAgIHNlbGYuc3RhdGVtZW50ID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLmxpbmVubyA9IDEKKyAgICAgICAgc2VsZi5pbl9jb21tZW50ID0gRmFsc2UKKworICAgICAgICBzZWxmLnByb21wdCA9ICcnCisgICAgICAgIGlmIHN0ZGluIGlzIE5vbmU6CisgICAgICAgICAgICBzdGRpbiA9IHN5cy5zdGRpbgorCisgICAgICAgIGlmIHR0eToKKyAgICAgICAgICAgIHNlbGYucmVzZXRfcHJvbXB0KCkKKyAgICAgICAgICAgIHNlbGYucmVwb3J0X2Nvbm5lY3Rpb24oKQorICAgICAgICAgICAgcHJpbnQoJ1VzZSBIRUxQIGZvciBoZWxwLicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNob3dfbGluZV9udW1zID0gVHJ1ZQorICAgICAgICBzZWxmLnN0ZGluID0gc3RkaW4KKyAgICAgICAgc2VsZi5xdWVyeV9vdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHNlbGYuY29uc2lzdGVuY3lfbGV2ZWwgPSBjYXNzYW5kcmEuQ29uc2lzdGVuY3lMZXZlbC5PTkUKKyAgICAgICAgc2VsZi5zZXJpYWxfY29uc2lzdGVuY3lfbGV2ZWwgPSBjYXNzYW5kcmEuQ29uc2lzdGVuY3lMZXZlbC5TRVJJQUwKKworICAgICAgICBzZWxmLmVtcHR5X2xpbmVzID0gMAorICAgICAgICBzZWxmLnN0YXRlbWVudF9lcnJvciA9IEZhbHNlCisgICAgICAgIHNlbGYuc2luZ2xlX3N0YXRlbWVudCA9IHNpbmdsZV9zdGF0ZW1lbnQKKyAgICAgICAgc2VsZi5pc19zdWJzaGVsbCA9IGlzX3N1YnNoZWxsCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgYmF0Y2hfbW9kZShzZWxmKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnR0eQorCisgICAgZGVmIHNldF9leHBhbmRlZF9jcWxfdmVyc2lvbihzZWxmLCB2ZXIpOgorICAgICAgICB2ZXIsIHZlcnR1cGxlID0gZnVsbF9jcWxfdmVyc2lvbih2ZXIpCisgICAgICAgIHNlbGYuY3FsX3ZlcnNpb24gPSB2ZXIKKyAgICAgICAgc2VsZi5jcWxfdmVyX3R1cGxlID0gdmVydHVwbGUKKworICAgIGRlZiBjcWx2ZXJfYXRsZWFzdChzZWxmLCBtYWpvciwgbWlub3I9MCwgcGF0Y2g9MCk6CisgICAgICAgIHJldHVybiBzZWxmLmNxbF92ZXJfdHVwbGVbOjNdID49IChtYWpvciwgbWlub3IsIHBhdGNoKQorCisgICAgZGVmIG15Zm9ybWF0X3ZhbHVlKHNlbGYsIHZhbCwgY3FsdHlwZT1Ob25lLCAqKmt3YXJncyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBEZWNvZGVFcnJvcik6CisgICAgICAgICAgICBzZWxmLmRlY29kaW5nX2Vycm9ycy5hcHBlbmQodmFsKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkdGZvcm1hdHMgPSBEYXRlVGltZUZvcm1hdCh0aW1lc3RhbXBfZm9ybWF0PXNlbGYuZGlzcGxheV90aW1lc3RhbXBfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9mb3JtYXQ9c2VsZi5kaXNwbGF5X2RhdGVfZm9ybWF0LCBuYW5vdGltZV9mb3JtYXQ9c2VsZi5kaXNwbGF5X25hbm90aW1lX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWV6b25lPXNlbGYuZGlzcGxheV90aW1lem9uZSkKKyAgICAgICAgICAgIHByZWNpc2lvbiA9IHNlbGYuZGlzcGxheV9kb3VibGVfcHJlY2lzaW9uIGlmIGNxbHR5cGUgaXMgbm90IE5vbmUgYW5kIGNxbHR5cGUudHlwZV9uYW1lID09ICdkb3VibGUnIFwKKyAgICAgICAgICAgICAgICBlbHNlIHNlbGYuZGlzcGxheV9mbG9hdF9wcmVjaXNpb24KKyAgICAgICAgICAgIHJldHVybiBmb3JtYXRfdmFsdWUodmFsLCBjcWx0eXBlPWNxbHR5cGUsIGVuY29kaW5nPXNlbGYub3V0cHV0X2NvZGVjLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGNvbG9yPXNlbGYuY29sb3IsIGRhdGVfdGltZV9mb3JtYXQ9ZHRmb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdF9wcmVjaXNpb249cHJlY2lzaW9uLCAqKmt3YXJncykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgZXJyID0gRm9ybWF0RXJyb3IodmFsLCBlKQorICAgICAgICAgICAgc2VsZi5kZWNvZGluZ19lcnJvcnMuYXBwZW5kKGVycikKKyAgICAgICAgICAgIHJldHVybiBmb3JtYXRfdmFsdWUoZXJyLCBjcWx0eXBlPWNxbHR5cGUsIGVuY29kaW5nPXNlbGYub3V0cHV0X2NvZGVjLm5hbWUsIGFkZGNvbG9yPXNlbGYuY29sb3IpCisKKyAgICBkZWYgbXlmb3JtYXRfY29sbmFtZShzZWxmLCBuYW1lLCB0YWJsZV9tZXRhPU5vbmUpOgorICAgICAgICBjb2x1bW5fY29sb3JzID0gQ09MVU1OX05BTUVfQ09MT1JTLmNvcHkoKQorICAgICAgICAjIGNoZWNrIGNvbHVtbiByb2xlIGFuZCBjb2xvciBhcHByb3ByaWF0ZWx5CisgICAgICAgIGlmIHRhYmxlX21ldGE6CisgICAgICAgICAgICBpZiBuYW1lIGluIFtjb2wubmFtZSBmb3IgY29sIGluIHRhYmxlX21ldGEucGFydGl0aW9uX2tleV06CisgICAgICAgICAgICAgICAgY29sdW1uX2NvbG9ycy5kZWZhdWx0X2ZhY3RvcnkgPSBsYW1iZGE6IFJFRAorICAgICAgICAgICAgZWxpZiBuYW1lIGluIFtjb2wubmFtZSBmb3IgY29sIGluIHRhYmxlX21ldGEuY2x1c3RlcmluZ19rZXldOgorICAgICAgICAgICAgICAgIGNvbHVtbl9jb2xvcnMuZGVmYXVsdF9mYWN0b3J5ID0gbGFtYmRhOiBDWUFOCisgICAgICAgICAgICBlbGlmIG5hbWUgaW4gdGFibGVfbWV0YS5jb2x1bW5zIGFuZCB0YWJsZV9tZXRhLmNvbHVtbnNbbmFtZV0uaXNfc3RhdGljOgorICAgICAgICAgICAgICAgIGNvbHVtbl9jb2xvcnMuZGVmYXVsdF9mYWN0b3J5ID0gbGFtYmRhOiBXSElURQorICAgICAgICByZXR1cm4gc2VsZi5teWZvcm1hdF92YWx1ZShuYW1lLCBjb2xvcm1hcD1jb2x1bW5fY29sb3JzKQorCisgICAgZGVmIHJlcG9ydF9jb25uZWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLnNob3dfaG9zdCgpCisgICAgICAgIHNlbGYuc2hvd192ZXJzaW9uKCkKKworICAgIGRlZiBzaG93X2hvc3Qoc2VsZik6CisgICAgICAgIHByaW50KCJDb25uZWN0ZWQgdG8gezB9IGF0IHsxfTp7Mn0iCisgICAgICAgICAgICAgIC5mb3JtYXQoc2VsZi5hcHBseWNvbG9yKHNlbGYuZ2V0X2NsdXN0ZXJfbmFtZSgpLCBCTFVFKSwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvc3RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYucG9ydCkpCisKKyAgICBkZWYgc2hvd192ZXJzaW9uKHNlbGYpOgorICAgICAgICB2ZXJzID0gc2VsZi5jb25uZWN0aW9uX3ZlcnNpb25zLmNvcHkoKQorICAgICAgICB2ZXJzWydzaHZlciddID0gdmVyc2lvbgorICAgICAgICAjIHN5c3RlbS5WZXJzaW9uc1snY3FsJ10gYXBwYXJlbnRseSBkb2VzIG5vdCByZWZsZWN0IGNoYW5nZXMgd2l0aAorICAgICAgICAjIHNldF9jcWxfdmVyc2lvbi4KKyAgICAgICAgdmVyc1snY3FsJ10gPSBzZWxmLmNxbF92ZXJzaW9uCisgICAgICAgIHByaW50KCJbY3Fsc2ggJShzaHZlcilzIHwgQ2Fzc2FuZHJhICUoYnVpbGQpcyB8IENRTCBzcGVjICUoY3FsKXMgfCBOYXRpdmUgcHJvdG9jb2wgdiUocHJvdG9jb2wpc10iICUgdmVycykKKworICAgIGRlZiBzaG93X3Nlc3Npb24oc2VsZiwgc2Vzc2lvbmlkLCBwYXJ0aWFsX3Nlc3Npb249RmFsc2UpOgorICAgICAgICBwcmludF90cmFjZV9zZXNzaW9uKHNlbGYsIHNlbGYuc2Vzc2lvbiwgc2Vzc2lvbmlkLCBwYXJ0aWFsX3Nlc3Npb24pCisKKyAgICBkZWYgc2hvd19yZXBsaWNhcyhzZWxmLCB0b2tlbl92YWx1ZSwga2V5c3BhY2U9Tm9uZSk6CisgICAgICAgIGtzID0gc2VsZi5jdXJyZW50X2tleXNwYWNlIGlmIGtleXNwYWNlIGlzIE5vbmUgZWxzZSBrZXlzcGFjZQorICAgICAgICB0b2tlbl9tYXAgPSBzZWxmLmNvbm4ubWV0YWRhdGEudG9rZW5fbWFwCisgICAgICAgIG5vZGVzID0gdG9rZW5fbWFwLmdldF9yZXBsaWNhcyhrcywgdG9rZW5fbWFwLnRva2VuX2NsYXNzKHRva2VuX3ZhbHVlKSkKKyAgICAgICAgYWRkcmVzc2VzID0gW3guYWRkcmVzcyBmb3IgeCBpbiBub2Rlc10KKyAgICAgICAgcHJpbnQoZiJ7YWRkcmVzc2VzfSIpCisKKyAgICBkZWYgZ2V0X2Nvbm5lY3Rpb25fdmVyc2lvbnMoc2VsZik6CisgICAgICAgIHJlc3VsdCwgPSBzZWxmLnNlc3Npb24uZXhlY3V0ZSgic2VsZWN0ICogZnJvbSBzeXN0ZW0ubG9jYWwgd2hlcmUga2V5ID0gJ2xvY2FsJyIpCisgICAgICAgIHZlcnMgPSB7CisgICAgICAgICAgICAnYnVpbGQnOiByZXN1bHRbJ3JlbGVhc2VfdmVyc2lvbiddLAorICAgICAgICAgICAgJ3Byb3RvY29sJzogc2VsZi5jb25uLnByb3RvY29sX3ZlcnNpb24sCisgICAgICAgICAgICAnY3FsJzogcmVzdWx0WydjcWxfdmVyc2lvbiddLAorICAgICAgICB9CisgICAgICAgIHNlbGYuY29ubmVjdGlvbl92ZXJzaW9ucyA9IHZlcnMKKworICAgIGRlZiBnZXRfa2V5c3BhY2VfbmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuY29ubi5tZXRhZGF0YS5rZXlzcGFjZXMpCisKKyAgICBkZWYgZ2V0X2NvbHVtbmZhbWlseV9uYW1lcyhzZWxmLCBrc25hbWU9Tm9uZSk6CisgICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgorICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCisKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrc25hbWUpLnRhYmxlcykKKworICAgIGRlZiBnZXRfbWF0ZXJpYWxpemVkX3ZpZXdfbmFtZXMoc2VsZiwga3NuYW1lPU5vbmUpOgorICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQorCisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKS52aWV3cykKKworICAgIGRlZiBnZXRfaW5kZXhfbmFtZXMoc2VsZiwga3NuYW1lPU5vbmUpOgorICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQorCisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKS5pbmRleGVzKQorCisgICAgZGVmIGdldF9jb2x1bW5fbmFtZXMoc2VsZiwga3NuYW1lLCBjZm5hbWUpOgorICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQorICAgICAgICBsYXlvdXQgPSBzZWxmLmdldF90YWJsZV9tZXRhKGtzbmFtZSwgY2ZuYW1lKQorICAgICAgICByZXR1cm4gbGlzdChsYXlvdXQuY29sdW1ucykKKworICAgIGRlZiBnZXRfdXNlcnR5cGVfbmFtZXMoc2VsZiwga3NuYW1lPU5vbmUpOgorICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQorCisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKS51c2VyX3R5cGVzKQorCisgICAgZGVmIGdldF91c2VydHlwZV9sYXlvdXQoc2VsZiwga3NuYW1lLCB0eXBlbmFtZSk6CisgICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgorICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCisKKyAgICAgICAga3NfbWV0YSA9IHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHVzZXJfdHlwZSA9IGtzX21ldGEudXNlcl90eXBlc1t0eXBlbmFtZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmFpc2UgVXNlclR5cGVOb3RGb3VuZCgiVXNlciB0eXBlIHshcn0gbm90IGZvdW5kIi5mb3JtYXQodHlwZW5hbWUpKQorCisgICAgICAgIHJldHVybiBsaXN0KHppcCh1c2VyX3R5cGUuZmllbGRfbmFtZXMsIHVzZXJfdHlwZS5maWVsZF90eXBlcykpCisKKyAgICBkZWYgZ2V0X3VzZXJmdW5jdGlvbl9uYW1lcyhzZWxmLCBrc25hbWU9Tm9uZSk6CisgICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgorICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCisKKyAgICAgICAgcmV0dXJuIFtmLm5hbWUgZm9yIGYgaW4gbGlzdChzZWxmLmdldF9rZXlzcGFjZV9tZXRhKGtzbmFtZSkuZnVuY3Rpb25zLnZhbHVlcygpKV0KKworICAgIGRlZiBnZXRfdXNlcmFnZ3JlZ2F0ZV9uYW1lcyhzZWxmLCBrc25hbWU9Tm9uZSk6CisgICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgorICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCisKKyAgICAgICAgcmV0dXJuIFtmLm5hbWUgZm9yIGYgaW4gbGlzdChzZWxmLmdldF9rZXlzcGFjZV9tZXRhKGtzbmFtZSkuYWdncmVnYXRlcy52YWx1ZXMoKSldCisKKyAgICBkZWYgZ2V0X2NsdXN0ZXJfbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29ubi5tZXRhZGF0YS5jbHVzdGVyX25hbWUKKworICAgIGRlZiBnZXRfcGFydGl0aW9uZXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNvbm4ubWV0YWRhdGEucGFydGl0aW9uZXIKKworICAgIGRlZiBnZXRfa2V5c3BhY2VfbWV0YShzZWxmLCBrc25hbWUpOgorICAgICAgICBpZiBrc25hbWUgaW4gc2VsZi5jb25uLm1ldGFkYXRhLmtleXNwYWNlczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbm4ubWV0YWRhdGEua2V5c3BhY2VzW2tzbmFtZV0KKworICAgICAgICByYWlzZSBLZXlzcGFjZU5vdEZvdW5kKCdLZXlzcGFjZSAlciBub3QgZm91bmQuJyAlIGtzbmFtZSkKKworICAgIGRlZiBnZXRfa2V5c3BhY2VzKHNlbGYpOgorICAgICAgICByZXR1cm4gbGlzdChzZWxmLmNvbm4ubWV0YWRhdGEua2V5c3BhY2VzLnZhbHVlcygpKQorCisgICAgZGVmIGdldF9yaW5nKHNlbGYsIGtzKToKKyAgICAgICAgc2VsZi5jb25uLm1ldGFkYXRhLnRva2VuX21hcC5yZWJ1aWxkX2tleXNwYWNlKGtzLCBidWlsZF9pZl9hYnNlbnQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuY29ubi5tZXRhZGF0YS50b2tlbl9tYXAudG9rZW5zX3RvX2hvc3RzX2J5X2tzW2tzXQorCisgICAgZGVmIGdldF90YWJsZV9tZXRhKHNlbGYsIGtzbmFtZSwgdGFibGVuYW1lKToKKyAgICAgICAgaWYga3NuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBrc25hbWUgPSBzZWxmLmN1cnJlbnRfa2V5c3BhY2UKKyAgICAgICAga3NtZXRhID0gc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrc25hbWUpCisgICAgICAgIGlmIHRhYmxlbmFtZSBub3QgaW4ga3NtZXRhLnRhYmxlczoKKyAgICAgICAgICAgIGlmIGtzbmFtZSA9PSAnc3lzdGVtX2F1dGgnIGFuZCB0YWJsZW5hbWUgaW4gWydyb2xlcycsICdyb2xlX3Blcm1pc3Npb25zJ106CisgICAgICAgICAgICAgICAgc2VsZi5nZXRfZmFrZV9hdXRoX3RhYmxlX21ldGEoa3NuYW1lLCB0YWJsZW5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbHVtbkZhbWlseU5vdEZvdW5kKCJDb2x1bW4gZmFtaWx5IHt9IG5vdCBmb3VuZCIuZm9ybWF0KHRhYmxlbmFtZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4ga3NtZXRhLnRhYmxlc1t0YWJsZW5hbWVdCisKKyAgICBkZWYgZ2V0X2Zha2VfYXV0aF90YWJsZV9tZXRhKHNlbGYsIGtzbmFtZSwgdGFibGVuYW1lKToKKyAgICAgICAgIyBtYXkgYmUgdXNpbmcgZXh0ZXJuYWwgYXV0aCBpbXBsZW1lbnRhdGlvbiBzbyBpbnRlcm5hbCB0YWJsZXMKKyAgICAgICAgIyBhcmVuJ3QgYWN0dWFsbHkgZGVmaW5lZCBpbiBzY2hlbWEuIEluIHRoaXMgY2FzZSwgd2UnbGwgZmFrZQorICAgICAgICAjIHRoZW0gdXAKKyAgICAgICAgaWYgdGFibGVuYW1lID09ICdyb2xlcyc6CisgICAgICAgICAgICBrc19tZXRhID0gS2V5c3BhY2VNZXRhZGF0YShrc25hbWUsIFRydWUsIE5vbmUsIE5vbmUpCisgICAgICAgICAgICB0YWJsZV9tZXRhID0gVGFibGVNZXRhZGF0YShrc19tZXRhLCAncm9sZXMnKQorICAgICAgICAgICAgdGFibGVfbWV0YS5jb2x1bW5zWydyb2xlJ10gPSBDb2x1bW5NZXRhZGF0YSh0YWJsZV9tZXRhLCAncm9sZScsIGNhc3NhbmRyYS5jcWx0eXBlcy5VVEY4VHlwZSkKKyAgICAgICAgICAgIHRhYmxlX21ldGEuY29sdW1uc1snaXNfc3VwZXJ1c2VyJ10gPSBDb2x1bW5NZXRhZGF0YSh0YWJsZV9tZXRhLCAnaXNfc3VwZXJ1c2VyJywgY2Fzc2FuZHJhLmNxbHR5cGVzLkJvb2xlYW5UeXBlKQorICAgICAgICAgICAgdGFibGVfbWV0YS5jb2x1bW5zWydjYW5fbG9naW4nXSA9IENvbHVtbk1ldGFkYXRhKHRhYmxlX21ldGEsICdjYW5fbG9naW4nLCBjYXNzYW5kcmEuY3FsdHlwZXMuQm9vbGVhblR5cGUpCisgICAgICAgIGVsaWYgdGFibGVuYW1lID09ICdyb2xlX3Blcm1pc3Npb25zJzoKKyAgICAgICAgICAgIGtzX21ldGEgPSBLZXlzcGFjZU1ldGFkYXRhKGtzbmFtZSwgVHJ1ZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgICAgIHRhYmxlX21ldGEgPSBUYWJsZU1ldGFkYXRhKGtzX21ldGEsICdyb2xlX3Blcm1pc3Npb25zJykKKyAgICAgICAgICAgIHRhYmxlX21ldGEuY29sdW1uc1sncm9sZSddID0gQ29sdW1uTWV0YWRhdGEodGFibGVfbWV0YSwgJ3JvbGUnLCBjYXNzYW5kcmEuY3FsdHlwZXMuVVRGOFR5cGUpCisgICAgICAgICAgICB0YWJsZV9tZXRhLmNvbHVtbnNbJ3Jlc291cmNlJ10gPSBDb2x1bW5NZXRhZGF0YSh0YWJsZV9tZXRhLCAncmVzb3VyY2UnLCBjYXNzYW5kcmEuY3FsdHlwZXMuVVRGOFR5cGUpCisgICAgICAgICAgICB0YWJsZV9tZXRhLmNvbHVtbnNbJ3Blcm1pc3Npb24nXSA9IENvbHVtbk1ldGFkYXRhKHRhYmxlX21ldGEsICdwZXJtaXNzaW9uJywgY2Fzc2FuZHJhLmNxbHR5cGVzLlVURjhUeXBlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQ29sdW1uRmFtaWx5Tm90Rm91bmQoIkNvbHVtbiBmYW1pbHkge30gbm90IGZvdW5kIi5mb3JtYXQodGFibGVuYW1lKSkKKworICAgIGRlZiBnZXRfaW5kZXhfbWV0YShzZWxmLCBrc25hbWUsIGlkeG5hbWUpOgorICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQorICAgICAgICBrc21ldGEgPSBzZWxmLmdldF9rZXlzcGFjZV9tZXRhKGtzbmFtZSkKKworICAgICAgICBpZiBpZHhuYW1lIG5vdCBpbiBrc21ldGEuaW5kZXhlczoKKyAgICAgICAgICAgIHJhaXNlIEluZGV4Tm90Rm91bmQoIkluZGV4IHt9IG5vdCBmb3VuZCIuZm9ybWF0KGlkeG5hbWUpKQorCisgICAgICAgIHJldHVybiBrc21ldGEuaW5kZXhlc1tpZHhuYW1lXQorCisgICAgZGVmIGdldF92aWV3X21ldGEoc2VsZiwga3NuYW1lLCB2aWV3bmFtZSk6CisgICAgICAgIGlmIGtzbmFtZSBpcyBOb25lOgorICAgICAgICAgICAga3NuYW1lID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCisgICAgICAgIGtzbWV0YSA9IHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3NuYW1lKQorCisgICAgICAgIGlmIHZpZXduYW1lIG5vdCBpbiBrc21ldGEudmlld3M6CisgICAgICAgICAgICByYWlzZSBNYXRlcmlhbGl6ZWRWaWV3Tm90Rm91bmQoIk1hdGVyaWFsaXplZCB2aWV3ICd7fScgbm90IGZvdW5kIi5mb3JtYXQodmlld25hbWUpKQorICAgICAgICByZXR1cm4ga3NtZXRhLnZpZXdzW3ZpZXduYW1lXQorCisgICAgZGVmIGdldF9vYmplY3RfbWV0YShzZWxmLCBrcywgbmFtZSk6CisgICAgICAgIGlmIG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIGtzIGFuZCBrcyBpbiBzZWxmLmNvbm4ubWV0YWRhdGEua2V5c3BhY2VzOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbm4ubWV0YWRhdGEua2V5c3BhY2VzW2tzXQorICAgICAgICAgICAgZWxpZiBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBPYmplY3ROb3RGb3VuZCgiJ3t9JyBub3QgZm91bmQgaW4ga2V5c3BhY2VzIi5mb3JtYXQoa3MpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYW1lID0ga3MKKyAgICAgICAgICAgICAgICBrcyA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQorCisgICAgICAgIGlmIGtzIGlzIE5vbmU6CisgICAgICAgICAgICBrcyA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQorCisgICAgICAgIGtzbWV0YSA9IHNlbGYuZ2V0X2tleXNwYWNlX21ldGEoa3MpCisKKyAgICAgICAgaWYgbmFtZSBpbiBrc21ldGEudGFibGVzOgorICAgICAgICAgICAgcmV0dXJuIGtzbWV0YS50YWJsZXNbbmFtZV0KKyAgICAgICAgZWxpZiBuYW1lIGluIGtzbWV0YS5pbmRleGVzOgorICAgICAgICAgICAgcmV0dXJuIGtzbWV0YS5pbmRleGVzW25hbWVdCisgICAgICAgIGVsaWYgbmFtZSBpbiBrc21ldGEudmlld3M6CisgICAgICAgICAgICByZXR1cm4ga3NtZXRhLnZpZXdzW25hbWVdCisKKyAgICAgICAgcmFpc2UgT2JqZWN0Tm90Rm91bmQoIid7fScgbm90IGZvdW5kIGluIGtleXNwYWNlICd7fSciLmZvcm1hdChuYW1lLCBrcykpCisKKyAgICBkZWYgZ2V0X3RyaWdnZXJfbmFtZXMoc2VsZiwga3NuYW1lPU5vbmUpOgorICAgICAgICBpZiBrc25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGtzbmFtZSA9IHNlbGYuY3VycmVudF9rZXlzcGFjZQorCisgICAgICAgIHJldHVybiBbdHJpZ2dlci5uYW1lCisgICAgICAgICAgICAgICAgZm9yIHRhYmxlIGluIGxpc3Qoc2VsZi5nZXRfa2V5c3BhY2VfbWV0YShrc25hbWUpLnRhYmxlcy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICBmb3IgdHJpZ2dlciBpbiBsaXN0KHRhYmxlLnRyaWdnZXJzLnZhbHVlcygpKV0KKworICAgIGRlZiByZXNldF9zdGF0ZW1lbnQoc2VsZik6CisgICAgICAgIHNlbGYucmVzZXRfcHJvbXB0KCkKKyAgICAgICAgc2VsZi5zdGF0ZW1lbnQudHJ1bmNhdGUoMCkKKyAgICAgICAgc2VsZi5zdGF0ZW1lbnQuc2VlaygwKQorICAgICAgICBzZWxmLmVtcHR5X2xpbmVzID0gMAorCisgICAgZGVmIHJlc2V0X3Byb21wdChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X2tleXNwYWNlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnNldF9wcm9tcHQoc2VsZi5kZWZhdWx0X3Byb21wdCwgVHJ1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2V0X3Byb21wdChzZWxmLmtleXNwYWNlX3Byb21wdC5mb3JtYXQoc2VsZi5jdXJyZW50X2tleXNwYWNlKSwgVHJ1ZSkKKworICAgIGRlZiBzZXRfY29udGludWVfcHJvbXB0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmVtcHR5X2xpbmVzID49IDM6CisgICAgICAgICAgICBzZWxmLnNldF9wcm9tcHQoIlN0YXRlbWVudHMgYXJlIHRlcm1pbmF0ZWQgd2l0aCBhICc7Jy4gIFlvdSBjYW4gcHJlc3MgQ1RSTC1DIHRvIGNhbmNlbCBhbiBpbmNvbXBsZXRlIHN0YXRlbWVudC4iKQorICAgICAgICAgICAgc2VsZi5lbXB0eV9saW5lcyA9IDAKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2V0X3Byb21wdChzZWxmLmNvbnRpbnVlX3Byb21wdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNwYWNlcyA9ICcgJyAqIGxlbihzdHIoc2VsZi5jdXJyZW50X2tleXNwYWNlKSkKKyAgICAgICAgICAgIHNlbGYuc2V0X3Byb21wdChzZWxmLmtleXNwYWNlX2NvbnRpbnVlX3Byb21wdC5mb3JtYXQoc3BhY2VzKSkKKyAgICAgICAgc2VsZi5lbXB0eV9saW5lcyA9IHNlbGYuZW1wdHlfbGluZXMgKyAxIGlmIG5vdCBzZWxmLmxhc3RjbWQgZWxzZSAwCisKKyAgICBAY29udGV4dG1hbmFnZXIKKyAgICBkZWYgcHJlcGFyZV9sb29wKHNlbGYpOgorICAgICAgICByZWFkbGluZSA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi50dHkgYW5kIHNlbGYuY29tcGxldGVrZXk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IHJlYWRsaW5lCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvbGRfY29tcGxldGVyID0gcmVhZGxpbmUuZ2V0X2NvbXBsZXRlcigpCisgICAgICAgICAgICAgICAgcmVhZGxpbmUuc2V0X2NvbXBsZXRlcihzZWxmLmNvbXBsZXRlKQorICAgICAgICAgICAgICAgIGlmIHJlYWRsaW5lLl9fZG9jX18gaXMgbm90IE5vbmUgYW5kICdsaWJlZGl0JyBpbiByZWFkbGluZS5fX2RvY19fOgorICAgICAgICAgICAgICAgICAgICByZWFkbGluZS5wYXJzZV9hbmRfYmluZCgiYmluZCAtZSIpCisgICAgICAgICAgICAgICAgICAgIHJlYWRsaW5lLnBhcnNlX2FuZF9iaW5kKCJiaW5kICciICsgc2VsZi5jb21wbGV0ZWtleSArICInIHJsX2NvbXBsZXRlIikKKyAgICAgICAgICAgICAgICAgICAgcmVhZGxpbmUucGFyc2VfYW5kX2JpbmQoImJpbmQgXlIgZW0taW5jLXNlYXJjaC1wcmV2IikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZWFkbGluZS5wYXJzZV9hbmRfYmluZChzZWxmLmNvbXBsZXRla2V5ICsgIjogY29tcGxldGUiKQorICAgICAgICAjIHN0YXJ0IGNvdmVyYWdlIGNvbGxlY3Rpb24gaWYgcmVxdWVzdGVkLCB1bmxlc3MgaW4gc3Vic2hlbGwKKyAgICAgICAgaWYgc2VsZi5jb3ZlcmFnZSBhbmQgbm90IHNlbGYuaXNfc3Vic2hlbGw6CisgICAgICAgICAgICAjIGNoZWNrIGZvciBjb3ZlcmFnZXJjIGZpbGUsIHdyaXRlIGl0IGlmIG1pc3NpbmcKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKENRTF9ESVIpOgorICAgICAgICAgICAgICAgIHNlbGYuY292ZXJhZ2VyY19wYXRoID0gb3MucGF0aC5qb2luKENRTF9ESVIsICcuY292ZXJhZ2VyYycpCisgICAgICAgICAgICAgICAgY292ZGF0YV9wYXRoID0gb3MucGF0aC5qb2luKENRTF9ESVIsICcuY292ZXJhZ2UnKQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShzZWxmLmNvdmVyYWdlcmNfcGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLmNvdmVyYWdlcmNfcGF0aCwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZWxpbmVzKFsiW3J1bl1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25jdXJyZW5jeSA9IG11bHRpcHJvY2Vzc2luZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGFfZmlsZSA9IHt9XG4iLmZvcm1hdChjb3ZkYXRhX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYWxsZWwgPSB0cnVlXG4iXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAjIHN0YXJ0IGNvdmVyYWdlCisgICAgICAgICAgICAgICAgaW1wb3J0IGNvdmVyYWdlCisgICAgICAgICAgICAgICAgc2VsZi5jb3YgPSBjb3ZlcmFnZS5Db3ZlcmFnZShjb25maWdfZmlsZT1zZWxmLmNvdmVyYWdlcmNfcGF0aCkKKyAgICAgICAgICAgICAgICBzZWxmLmNvdi5zdGFydCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiByZWFkbGluZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZWFkbGluZS5zZXRfY29tcGxldGVyKG9sZF9jb21wbGV0ZXIpCisgICAgICAgICAgICBpZiBzZWxmLmNvdmVyYWdlIGFuZCBub3Qgc2VsZi5pc19zdWJzaGVsbDoKKyAgICAgICAgICAgICAgICBzZWxmLnN0b3BfY292ZXJhZ2UoKQorCisgICAgZGVmIGdldF9pbnB1dF9saW5lKHNlbGYsIHByb21wdD0nJyk6CisgICAgICAgIGlmIHNlbGYudHR5OgorICAgICAgICAgICAgc2VsZi5sYXN0Y21kID0gaW5wdXQoc3RyKHByb21wdCkpCisgICAgICAgICAgICBsaW5lID0gc2VsZi5sYXN0Y21kICsgJ1xuJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sYXN0Y21kID0gc2VsZi5zdGRpbi5yZWFkbGluZSgpCisgICAgICAgICAgICBsaW5lID0gc2VsZi5sYXN0Y21kCisgICAgICAgICAgICBpZiBub3QgbGVuKGxpbmUpOgorICAgICAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCisgICAgICAgIHNlbGYubGluZW5vICs9IDEKKyAgICAgICAgcmV0dXJuIGxpbmUKKworICAgIGRlZiB1c2Vfc3RkaW5fcmVhZGVyKHNlbGYsIHVudGlsPScnLCBwcm9tcHQ9JycpOgorICAgICAgICB1bnRpbCArPSAnXG4nCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbmV3bGluZSA9IHNlbGYuZ2V0X2lucHV0X2xpbmUocHJvbXB0PXByb21wdCkKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIG5ld2xpbmUgPT0gdW50aWw6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICB5aWVsZCBuZXdsaW5lCisKKyAgICBkZWYgY21kbG9vcChzZWxmLCBpbnRybz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEFkYXB0ZWQgZnJvbSBjbWQuQ21kJ3MgdmVyc2lvbiwgYmVjYXVzZSB0aGVyZSBpcyBsaXRlcmFsbHkgbm8gd2F5IHdpdGgKKyAgICAgICAgY21kLkNtZC5jbWRsb29wKCkgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuICJFT0YiIHNob3dpbmcgdXAgaW4KKyAgICAgICAgaW5wdXQgYW5kIGFuIGFjdHVhbCBFT0YuCisgICAgICAgICIiIgorICAgICAgICB3aXRoIHNlbGYucHJlcGFyZV9sb29wKCk6CisgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5zdG9wOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zaW5nbGVfc3RhdGVtZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuc2luZ2xlX3N0YXRlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdG9wID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuZ2V0X2lucHV0X2xpbmUoc2VsZi5wcm9tcHQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGVtZW50LndyaXRlKGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYub25lY21kKHNlbGYuc3RhdGVtZW50LmdldHZhbHVlKCkpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXNldF9zdGF0ZW1lbnQoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZW9mKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgQ1FMX0VSUk9SUyBhcyBjcWxlcnI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoY3FsZXJyLm1lc3NhZ2UpCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc2V0X3N0YXRlbWVudCgpCisgICAgICAgICAgICAgICAgICAgIHByaW50KCcnKQorCisgICAgZGVmIHN0cmlwX2NvbW1lbnRfYmxvY2tzKHNlbGYsIHN0YXRlbWVudHRleHQpOgorICAgICAgICBjb21tZW50X2Jsb2NrX2luX2xpdGVyYWxfc3RyaW5nID0gcmUuc2VhcmNoKCdbIl0uKlsvXVsqXS4qWypdWy9dLipbIl0nLCBzdGF0ZW1lbnR0ZXh0KQorICAgICAgICBpZiBub3QgY29tbWVudF9ibG9ja19pbl9saXRlcmFsX3N0cmluZzoKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlLnN1YignWy9dWypdLipbKl1bL10nLCAiIiwgc3RhdGVtZW50dGV4dCkKKyAgICAgICAgICAgIGlmICcqLycgaW4gcmVzdWx0IGFuZCAnLyonIG5vdCBpbiByZXN1bHQgYW5kIG5vdCBzZWxmLmluX2NvbW1lbnQ6CisgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoIkVuY291bnRlcmVkIGNvbW1lbnQgYmxvY2sgdGVybWluYXRvciB3aXRob3V0IGJlaW5nIGluIGNvbW1lbnQgYmxvY2siKQorICAgICAgICAgICAgaWYgJy8qJyBpbiByZXN1bHQ6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmUuc3ViKCdbL11bKl0uKicsICIiLCByZXN1bHQpCisgICAgICAgICAgICAgICAgc2VsZi5pbl9jb21tZW50ID0gVHJ1ZQorICAgICAgICAgICAgaWYgJyovJyBpbiByZXN1bHQ6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmUuc3ViKCcuKlsqXVsvXScsICIiLCByZXN1bHQpCisgICAgICAgICAgICAgICAgc2VsZi5pbl9jb21tZW50ID0gRmFsc2UKKyAgICAgICAgICAgIGlmIHNlbGYuaW5fY29tbWVudCBhbmQgbm90IHJlLmZpbmRhbGwoJ1svXVsqXXxbKl1bL10nLCBzdGF0ZW1lbnR0ZXh0KToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAnJworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICByZXR1cm4gc3RhdGVtZW50dGV4dAorCisgICAgZGVmIG9uZWNtZChzZWxmLCBzdGF0ZW1lbnR0ZXh0KToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3RhdGVtZW50IGlzIGNvbXBsZXRlIGFuZCB3YXMgaGFuZGxlZCAobWVhbmluZyBpdAorICAgICAgICBjYW4gYmUgcmVzZXQpLgorICAgICAgICAiIiIKKyAgICAgICAgc3RhdGVtZW50dGV4dCA9IHNlbGYuc3RyaXBfY29tbWVudF9ibG9ja3Moc3RhdGVtZW50dGV4dCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3RhdGVtZW50cywgZW5kdG9rZW5fZXNjYXBlZCA9IGNxbHJ1bGVzZXQuY3FsX3NwbGl0X3N0YXRlbWVudHMoc3RhdGVtZW50dGV4dCkKKyAgICAgICAgZXhjZXB0IHB5bGV4b3Ryb24uTGV4aW5nRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGlmIHNlbGYuc2hvd19saW5lX251bXM6CisgICAgICAgICAgICAgICAgc2VsZi5wcmludGVycignSW52YWxpZCBzeW50YXggYXQgbGluZSB7MH0sIGNoYXIgezF9JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChlLmxpbmVudW0sIGUuY2hhcm51bSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoJ0ludmFsaWQgc3ludGF4IGF0IGNoYXIgezB9Jy5mb3JtYXQoZS5jaGFybnVtKSkKKyAgICAgICAgICAgIHN0YXRlbWVudGxpbmUgPSBzdGF0ZW1lbnR0ZXh0LnNwbGl0KCdcbicpW2UubGluZW51bSAtIDFdCisgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCcgIHswfScuZm9ybWF0KHN0YXRlbWVudGxpbmUpKQorICAgICAgICAgICAgc2VsZi5wcmludGVycignIHswfV4nLmZvcm1hdCgnICcgKiBlLmNoYXJudW0pKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICB3aGlsZSBzdGF0ZW1lbnRzIGFuZCBub3Qgc3RhdGVtZW50c1stMV06CisgICAgICAgICAgICBzdGF0ZW1lbnRzID0gc3RhdGVtZW50c1s6LTFdCisgICAgICAgIGlmIG5vdCBzdGF0ZW1lbnRzOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgZW5kdG9rZW5fZXNjYXBlZCBvciBzdGF0ZW1lbnRzWy0xXVstMV1bMF0gIT0gJ2VuZHRva2VuJzoKKyAgICAgICAgICAgIHNlbGYuc2V0X2NvbnRpbnVlX3Byb21wdCgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZm9yIHN0IGluIHN0YXRlbWVudHM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfc3RhdGVtZW50KHN0LCBzdGF0ZW1lbnR0ZXh0KQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6CisgICAgICAgICAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoZSkKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBoYW5kbGVfZW9mKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnR0eToKKyAgICAgICAgICAgIHByaW50KCcnKQorICAgICAgICBzdGF0ZW1lbnQgPSBzZWxmLnN0YXRlbWVudC5nZXR2YWx1ZSgpCisgICAgICAgIGlmIHN0YXRlbWVudC5zdHJpcCgpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYub25lY21kKHN0YXRlbWVudCk6CisgICAgICAgICAgICAgICAgc2VsZi5wcmludGVycignSW5jb21wbGV0ZSBzdGF0ZW1lbnQgYXQgZW5kIG9mIGZpbGUnKQorICAgICAgICBzZWxmLmRvX2V4aXQoKQorCisgICAgZGVmIGhhbmRsZV9zdGF0ZW1lbnQoc2VsZiwgdG9rZW5zLCBzcmNzdHIpOgorICAgICAgICAjIENvbmNhdCBtdWx0aS1saW5lIHN0YXRlbWVudHMgYW5kIGluc2VydCBpbnRvIGhpc3RvcnkKKyAgICAgICAgaWYgcmVhZGxpbmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBubF9jb3VudCA9IHNyY3N0ci5jb3VudCgiXG4iKQorCisgICAgICAgICAgICBuZXdfaGlzdCA9IHNyY3N0ci5yZXBsYWNlKCJcbiIsICIgIikucnN0cmlwKCkKKworICAgICAgICAgICAgaWYgbmxfY291bnQgPiAxIGFuZCBzZWxmLmxhc3RfaGlzdCAhPSBuZXdfaGlzdDoKKyAgICAgICAgICAgICAgICByZWFkbGluZS5hZGRfaGlzdG9yeShuZXdfaGlzdCkKKworICAgICAgICAgICAgc2VsZi5sYXN0X2hpc3QgPSBuZXdfaGlzdAorICAgICAgICBjbWR3b3JkID0gdG9rZW5zWzBdWzFdCisgICAgICAgIGlmIGNtZHdvcmQgPT0gJz8nOgorICAgICAgICAgICAgY21kd29yZCA9ICdoZWxwJworICAgICAgICBjdXN0b21faGFuZGxlciA9IGdldGF0dHIoc2VsZiwgJ2RvXycgKyBjbWR3b3JkLmxvd2VyKCksIE5vbmUpCisgICAgICAgIGlmIGN1c3RvbV9oYW5kbGVyOgorICAgICAgICAgICAgcGFyc2VkID0gY3FscnVsZXNldC5jcWxfd2hvbGVfcGFyc2VfdG9rZW5zKHRva2Vucywgc3Jjc3RyPXNyY3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHN5bWJvbD0nY3Fsc2hDb21tYW5kJykKKyAgICAgICAgICAgIGlmIHBhcnNlZCBhbmQgbm90IHBhcnNlZC5yZW1haW5kZXI6CisgICAgICAgICAgICAgICAgIyBzdWNjZXNzZnVsIGNvbXBsZXRlIHBhcnNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbV9oYW5kbGVyKHBhcnNlZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlX3BhcnNlX2Vycm9yKGNtZHdvcmQsIHRva2VucywgcGFyc2VkLCBzcmNzdHIpCisgICAgICAgIHJldHVybiBzZWxmLnBlcmZvcm1fc3RhdGVtZW50KGNxbHJ1bGVzZXQuY3FsX2V4dHJhY3Rfb3JpZyh0b2tlbnMsIHNyY3N0cikpCisKKyAgICBkZWYgaGFuZGxlX3BhcnNlX2Vycm9yKHNlbGYsIGNtZHdvcmQsIHRva2VucywgcGFyc2VkLCBzcmNzdHIpOgorICAgICAgICBpZiBjbWR3b3JkLmxvd2VyKCkgaW4gKCdzZWxlY3QnLCAnaW5zZXJ0JywgJ3VwZGF0ZScsICdkZWxldGUnLCAndHJ1bmNhdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjcmVhdGUnLCAnZHJvcCcsICdhbHRlcicsICdncmFudCcsICdyZXZva2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYXRjaCcsICdsaXN0Jyk6CisgICAgICAgICAgICAjIGhleSwgbWF5YmUgdGhleSBrbm93IGFib3V0IHNvbWUgbmV3IHN5bnRheCB3ZSBkb24ndC4gdHlwZQorICAgICAgICAgICAgIyBhc3N1bXB0aW9ucyB3b24ndCB3b3JrLCBidXQgbWF5YmUgdGhlIHF1ZXJ5IHdpbGwuCisgICAgICAgICAgICByZXR1cm4gc2VsZi5wZXJmb3JtX3N0YXRlbWVudChjcWxydWxlc2V0LmNxbF9leHRyYWN0X29yaWcodG9rZW5zLCBzcmNzdHIpKQorICAgICAgICBpZiBwYXJzZWQ6CisgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCdJbXByb3BlciAlcyBjb21tYW5kIChwcm9ibGVtIGF0ICVyKS4nICUgKGNtZHdvcmQsIHBhcnNlZC5yZW1haW5kZXJbMF0pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wcmludGVycihmJ0ltcHJvcGVyIHtjbWR3b3JkfSBjb21tYW5kLicpCisKKyAgICBkZWYgZG9fdXNlKHNlbGYsIHBhcnNlZCk6CisgICAgICAgIGtzbmFtZSA9IHBhcnNlZC5nZXRfYmluZGluZygna3NuYW1lJykKKyAgICAgICAgc3VjY2VzcywgXyA9IHNlbGYucGVyZm9ybV9zaW1wbGVfc3RhdGVtZW50KFNpbXBsZVN0YXRlbWVudChwYXJzZWQuZXh0cmFjdF9vcmlnKCkpKQorICAgICAgICBpZiBzdWNjZXNzOgorICAgICAgICAgICAgaWYga3NuYW1lWzBdID09ICciJyBhbmQga3NuYW1lWy0xXSA9PSAnIic6CisgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50X2tleXNwYWNlID0gc2VsZi5jcWxfdW5wcm90ZWN0X25hbWUoa3NuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgPSBrc25hbWUubG93ZXIoKQorCisgICAgZGVmIGRvX3NlbGVjdChzZWxmLCBwYXJzZWQpOgorICAgICAgICB0cmFjaW5nX3dhc19lbmFibGVkID0gc2VsZi50cmFjaW5nX2VuYWJsZWQKKyAgICAgICAga3NuYW1lID0gcGFyc2VkLmdldF9iaW5kaW5nKCdrc25hbWUnKQorICAgICAgICBzdG9wX3RyYWNpbmcgPSBrc25hbWUgPT0gJ3N5c3RlbV90cmFjZXMnIG9yIChrc25hbWUgaXMgTm9uZSBhbmQgc2VsZi5jdXJyZW50X2tleXNwYWNlID09ICdzeXN0ZW1fdHJhY2VzJykKKyAgICAgICAgc2VsZi50cmFjaW5nX2VuYWJsZWQgPSBzZWxmLnRyYWNpbmdfZW5hYmxlZCBhbmQgbm90IHN0b3BfdHJhY2luZworICAgICAgICBzdGF0ZW1lbnQgPSBwYXJzZWQuZXh0cmFjdF9vcmlnKCkKKyAgICAgICAgc2VsZi5wZXJmb3JtX3N0YXRlbWVudChzdGF0ZW1lbnQpCisgICAgICAgIHNlbGYudHJhY2luZ19lbmFibGVkID0gdHJhY2luZ193YXNfZW5hYmxlZAorCisgICAgZGVmIHBlcmZvcm1fc3RhdGVtZW50KHNlbGYsIHN0YXRlbWVudCk6CisKKyAgICAgICAgc3RtdCA9IFNpbXBsZVN0YXRlbWVudChzdGF0ZW1lbnQsIGNvbnNpc3RlbmN5X2xldmVsPXNlbGYuY29uc2lzdGVuY3lfbGV2ZWwsIHNlcmlhbF9jb25zaXN0ZW5jeV9sZXZlbD1zZWxmLnNlcmlhbF9jb25zaXN0ZW5jeV9sZXZlbCwgZmV0Y2hfc2l6ZT1zZWxmLnBhZ2Vfc2l6ZSBpZiBzZWxmLnVzZV9wYWdpbmcgZWxzZSBOb25lKQorICAgICAgICBzdWNjZXNzLCBmdXR1cmUgPSBzZWxmLnBlcmZvcm1fc2ltcGxlX3N0YXRlbWVudChzdG10KQorCisgICAgICAgIGlmIGZ1dHVyZToKKyAgICAgICAgICAgIGlmIGZ1dHVyZS53YXJuaW5nczoKKyAgICAgICAgICAgICAgICBzZWxmLnByaW50X3dhcm5pbmdzKGZ1dHVyZS53YXJuaW5ncykKKworICAgICAgICAgICAgaWYgc2VsZi50cmFjaW5nX2VuYWJsZWQ6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmb3IgdHJhY2UgaW4gZnV0dXJlLmdldF9hbGxfcXVlcnlfdHJhY2VzKG1heF93YWl0X3Blcj1zZWxmLm1heF90cmFjZV93YWl0LCBxdWVyeV9jbD1zZWxmLmNvbnNpc3RlbmN5X2xldmVsKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3RyYWNlKHNlbGYsIHRyYWNlKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBUcmFjZVVuYXZhaWxhYmxlOgorICAgICAgICAgICAgICAgICAgICBtc2cgPSAiU3RhdGVtZW50IHRyYWNlIGRpZCBub3QgY29tcGxldGUgd2l0aGluICVkIHNlY29uZHM7IHRyYWNlIGRhdGEgbWF5IGJlIGluY29tcGxldGUuIiAlIChzZWxmLnNlc3Npb24ubWF4X3RyYWNlX3dhaXQsKQorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KG1zZywgY29sb3I9UkVEKQorICAgICAgICAgICAgICAgICAgICBmb3IgdHJhY2VfaWQgaW4gZnV0dXJlLmdldF9xdWVyeV90cmFjZV9pZHMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd19zZXNzaW9uKHRyYWNlX2lkLCBwYXJ0aWFsX3Nlc3Npb249VHJ1ZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludGVycigiVW5hYmxlIHRvIGZldGNoIHF1ZXJ5IHRyYWNlOiAlcyIgJSAoc3RyKGVyciksKSkKKworICAgICAgICByZXR1cm4gc3VjY2VzcworCisgICAgZGVmIHBhcnNlX2Zvcl9zZWxlY3RfbWV0YShzZWxmLCBxdWVyeV9zdHJpbmcpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXJzZWQgPSBjcWxydWxlc2V0LmNxbF9wYXJzZShxdWVyeV9zdHJpbmcpWzFdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAga3MgPSBzZWxmLmNxbF91bnByb3RlY3RfbmFtZShwYXJzZWQuZ2V0X2JpbmRpbmcoJ2tzbmFtZScsIE5vbmUpKQorICAgICAgICBuYW1lID0gc2VsZi5jcWxfdW5wcm90ZWN0X25hbWUocGFyc2VkLmdldF9iaW5kaW5nKCdjZm5hbWUnLCBOb25lKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X3RhYmxlX21ldGEoa3MsIG5hbWUpCisgICAgICAgIGV4Y2VwdCBDb2x1bW5GYW1pbHlOb3RGb3VuZDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRfdmlld19tZXRhKGtzLCBuYW1lKQorICAgICAgICAgICAgZXhjZXB0IE1hdGVyaWFsaXplZFZpZXdOb3RGb3VuZDoKKyAgICAgICAgICAgICAgICByYWlzZSBPYmplY3ROb3RGb3VuZCgiJ3t9JyBub3QgZm91bmQgaW4ga2V5c3BhY2UgJ3t9JyIuZm9ybWF0KG5hbWUsIGtzKSkKKworICAgIGRlZiBwYXJzZV9mb3JfdXBkYXRlX21ldGEoc2VsZiwgcXVlcnlfc3RyaW5nKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFyc2VkID0gY3FscnVsZXNldC5jcWxfcGFyc2UocXVlcnlfc3RyaW5nKVsxXQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGtzID0gc2VsZi5jcWxfdW5wcm90ZWN0X25hbWUocGFyc2VkLmdldF9iaW5kaW5nKCdrc25hbWUnLCBOb25lKSkKKyAgICAgICAgY2YgPSBzZWxmLmNxbF91bnByb3RlY3RfbmFtZShwYXJzZWQuZ2V0X2JpbmRpbmcoJ2NmbmFtZScpKQorICAgICAgICByZXR1cm4gc2VsZi5nZXRfdGFibGVfbWV0YShrcywgY2YpCisKKyAgICBkZWYgcGVyZm9ybV9zaW1wbGVfc3RhdGVtZW50KHNlbGYsIHN0YXRlbWVudCk6CisgICAgICAgIGlmIG5vdCBzdGF0ZW1lbnQ6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UsIE5vbmUKKworICAgICAgICBmdXR1cmUgPSBzZWxmLnNlc3Npb24uZXhlY3V0ZV9hc3luYyhzdGF0ZW1lbnQsIHRyYWNlPXNlbGYudHJhY2luZ19lbmFibGVkKQorICAgICAgICByZXN1bHQgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZ1dHVyZS5yZXN1bHQoKQorICAgICAgICBleGNlcHQgQ1FMX0VSUk9SUyBhcyBlcnI6CisgICAgICAgICAgICBlcnJfbXNnID0gZXJyLm1lc3NhZ2UgaWYgaGFzYXR0cihlcnIsICdtZXNzYWdlJykgZWxzZSBzdHIoZXJyKQorICAgICAgICAgICAgc2VsZi5wcmludGVycihzdHIoZXJyLl9fY2xhc3NfXy5fX25hbWVfXykgKyAiOiAiICsgZXJyX21zZykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgIHNlbGYucHJpbnRlcnIodHJhY2ViYWNrLmZvcm1hdF9leGMoKSkKKworICAgICAgICAjIEV2ZW4gaWYgc3RhdGVtZW50IGZhaWxlZCB3ZSB0cnkgdG8gcmVmcmVzaCBzY2hlbWEgaWYgbm90IGFncmVlZCAoc2VlIENBU1NBTkRSQS05Njg5KQorICAgICAgICBpZiBub3QgZnV0dXJlLmlzX3NjaGVtYV9hZ3JlZWQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5jb25uLnJlZnJlc2hfc2NoZW1hX21ldGFkYXRhKDUpICAjIHdpbGwgdGhyb3cgZXhjZXB0aW9uIGlmIHRoZXJlIGlzIGEgc2NoZW1hIG1pc21hdGNoCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoIldhcm5pbmc6IHNjaGVtYSB2ZXJzaW9uIG1pc21hdGNoIGRldGVjdGVkOyBjaGVjayB0aGUgc2NoZW1hIHZlcnNpb25zIG9mIHlvdXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vZGVzIGluIHN5c3RlbS5sb2NhbCBhbmQgc3lzdGVtLnBlZXJzLiIpCisgICAgICAgICAgICAgICAgc2VsZi5jb25uLnJlZnJlc2hfc2NoZW1hX21ldGFkYXRhKC0xKQorCisgICAgICAgIGlmIHJlc3VsdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlLCBOb25lCisKKyAgICAgICAgaWYgc3RhdGVtZW50LnF1ZXJ5X3N0cmluZ1s6Nl0ubG93ZXIoKSA9PSAnc2VsZWN0JzoKKyAgICAgICAgICAgIHNlbGYucHJpbnRfcmVzdWx0KHJlc3VsdCwgc2VsZi5wYXJzZV9mb3Jfc2VsZWN0X21ldGEoc3RhdGVtZW50LnF1ZXJ5X3N0cmluZykpCisgICAgICAgIGVsaWYgc3RhdGVtZW50LnF1ZXJ5X3N0cmluZy5sb3dlcigpLnN0YXJ0c3dpdGgoImxpc3QgdXNlcnMiKSBvciBzdGF0ZW1lbnQucXVlcnlfc3RyaW5nLmxvd2VyKCkuc3RhcnRzd2l0aCgibGlzdCByb2xlcyIpOgorICAgICAgICAgICAgc2VsZi5wcmludF9yZXN1bHQocmVzdWx0LCBzZWxmLmdldF90YWJsZV9tZXRhKCdzeXN0ZW1fYXV0aCcsICdyb2xlcycpKQorICAgICAgICBlbGlmIHN0YXRlbWVudC5xdWVyeV9zdHJpbmcubG93ZXIoKS5zdGFydHN3aXRoKCJsaXN0Iik6CisgICAgICAgICAgICBzZWxmLnByaW50X3Jlc3VsdChyZXN1bHQsIHNlbGYuZ2V0X3RhYmxlX21ldGEoJ3N5c3RlbV9hdXRoJywgJ3JvbGVfcGVybWlzc2lvbnMnKSkKKyAgICAgICAgZWxpZiByZXN1bHQ6CisgICAgICAgICAgICAjIENBUyBJTlNFUlQvVVBEQVRFCisgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCIiKQorICAgICAgICAgICAgc2VsZi5wcmludF9zdGF0aWNfcmVzdWx0KHJlc3VsdCwgc2VsZi5wYXJzZV9mb3JfdXBkYXRlX21ldGEoc3RhdGVtZW50LnF1ZXJ5X3N0cmluZyksIHdpdGhfaGVhZGVyPVRydWUsIHR0eT1zZWxmLnR0eSkKKyAgICAgICAgc2VsZi5mbHVzaF9vdXRwdXQoKQorICAgICAgICByZXR1cm4gVHJ1ZSwgZnV0dXJlCisKKyAgICBkZWYgcHJpbnRfcmVzdWx0KHNlbGYsIHJlc3VsdCwgdGFibGVfbWV0YSk6CisgICAgICAgIHNlbGYuZGVjb2RpbmdfZXJyb3JzID0gW10KKworICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCIiKQorCisgICAgICAgIGRlZiBwcmludF9hbGwocmVzdWx0LCB0YWJsZV9tZXRhLCB0dHkpOgorICAgICAgICAgICAgIyBSZXR1cm4gdGhlIG51bWJlciBvZiByb3dzIGluIHRvdGFsCisgICAgICAgICAgICBudW1fcm93cyA9IDAKKyAgICAgICAgICAgIGlzX2ZpcnN0ID0gVHJ1ZQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAjIEFsd2F5cyBwcmludCBmb3IgdGhlIGZpcnN0IHBhZ2UgZXZlbiBpdCBpcyBlbXB0eQorICAgICAgICAgICAgICAgIGlmIHJlc3VsdC5jdXJyZW50X3Jvd3Mgb3IgaXNfZmlyc3Q6CisgICAgICAgICAgICAgICAgICAgIHdpdGhfaGVhZGVyID0gaXNfZmlyc3Qgb3IgdHR5CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfc3RhdGljX3Jlc3VsdChyZXN1bHQsIHRhYmxlX21ldGEsIHdpdGhfaGVhZGVyLCB0dHksIG51bV9yb3dzKQorICAgICAgICAgICAgICAgICAgICBudW1fcm93cyArPSBsZW4ocmVzdWx0LmN1cnJlbnRfcm93cykKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQuaGFzX21vcmVfcGFnZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuc2h1bnRlZF9xdWVyeV9vdXQgaXMgTm9uZSBhbmQgdHR5OgorICAgICAgICAgICAgICAgICAgICAgICAgIyBPbmx5IHBhdXNlIHdoZW4gbm90IGNhcHR1cmluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0KCItLS1NT1JFLS0tIikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmZldGNoX25leHRfcGFnZSgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHR0eToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoIiIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaXNfZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bV9yb3dzCisKKyAgICAgICAgbnVtX3Jvd3MgPSBwcmludF9hbGwocmVzdWx0LCB0YWJsZV9tZXRhLCBzZWxmLnR0eSkKKyAgICAgICAgc2VsZi53cml0ZXJlc3VsdCgiKCVkIHJvd3MpIiAlIG51bV9yb3dzKQorCisgICAgICAgIGlmIHNlbGYuZGVjb2RpbmdfZXJyb3JzOgorICAgICAgICAgICAgZm9yIGVyciBpbiBzZWxmLmRlY29kaW5nX2Vycm9yc1s6Ml06CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZXJlc3VsdChlcnIubWVzc2FnZSgpLCBjb2xvcj1SRUQpCisgICAgICAgICAgICBpZiBsZW4oc2VsZi5kZWNvZGluZ19lcnJvcnMpID4gMjoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCclZCBtb3JlIGRlY29kaW5nIGVycm9ycyBzdXBwcmVzc2VkLicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGxlbihzZWxmLmRlY29kaW5nX2Vycm9ycykgLSAyKSwgY29sb3I9UkVEKQorCisgICAgZGVmIHByaW50X3N0YXRpY19yZXN1bHQoc2VsZiwgcmVzdWx0LCB0YWJsZV9tZXRhLCB3aXRoX2hlYWRlciwgdHR5LCByb3dfY291bnRfb2Zmc2V0PTApOgorICAgICAgICBpZiBub3QgcmVzdWx0LmNvbHVtbl9uYW1lcyBhbmQgbm90IHRhYmxlX21ldGE6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBjb2x1bW5fbmFtZXMgPSByZXN1bHQuY29sdW1uX25hbWVzIG9yIGxpc3QodGFibGVfbWV0YS5jb2x1bW5zLmtleXMoKSkKKyAgICAgICAgZm9ybWF0dGVkX25hbWVzID0gW3NlbGYubXlmb3JtYXRfY29sbmFtZShuYW1lLCB0YWJsZV9tZXRhKSBmb3IgbmFtZSBpbiBjb2x1bW5fbmFtZXNdCisgICAgICAgIGlmIG5vdCByZXN1bHQuY3VycmVudF9yb3dzOgorICAgICAgICAgICAgIyBwcmludCBoZWFkZXIgb25seQorICAgICAgICAgICAgc2VsZi5wcmludF9mb3JtYXR0ZWRfcmVzdWx0KGZvcm1hdHRlZF9uYW1lcywgTm9uZSwgd2l0aF9oZWFkZXI9VHJ1ZSwgdHR5PXR0eSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGNxbF90eXBlcyA9IFtdCisgICAgICAgIGlmIHJlc3VsdC5jb2x1bW5fdHlwZXM6CisgICAgICAgICAgICBrc19uYW1lID0gdGFibGVfbWV0YS5rZXlzcGFjZV9uYW1lIGlmIHRhYmxlX21ldGEgZWxzZSBzZWxmLmN1cnJlbnRfa2V5c3BhY2UKKyAgICAgICAgICAgIGtzX21ldGEgPSBzZWxmLmNvbm4ubWV0YWRhdGEua2V5c3BhY2VzLmdldChrc19uYW1lLCBOb25lKQorICAgICAgICAgICAgY3FsX3R5cGVzID0gW0NxbFR5cGUoY3FsX3R5cGVuYW1lKHQpLCBrc19tZXRhKSBmb3IgdCBpbiByZXN1bHQuY29sdW1uX3R5cGVzXQorCisgICAgICAgIGZvcm1hdHRlZF92YWx1ZXMgPSBbbGlzdChtYXAoc2VsZi5teWZvcm1hdF92YWx1ZSwgW3Jvd1tjXSBmb3IgYyBpbiBjb2x1bW5fbmFtZXNdLCBjcWxfdHlwZXMpKSBmb3Igcm93IGluIHJlc3VsdC5jdXJyZW50X3Jvd3NdCisKKyAgICAgICAgaWYgc2VsZi5leHBhbmRfZW5hYmxlZDoKKyAgICAgICAgICAgIHNlbGYucHJpbnRfZm9ybWF0dGVkX3Jlc3VsdF92ZXJ0aWNhbGx5KGZvcm1hdHRlZF9uYW1lcywgZm9ybWF0dGVkX3ZhbHVlcywgcm93X2NvdW50X29mZnNldCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHJpbnRfZm9ybWF0dGVkX3Jlc3VsdChmb3JtYXR0ZWRfbmFtZXMsIGZvcm1hdHRlZF92YWx1ZXMsIHdpdGhfaGVhZGVyLCB0dHkpCisKKyAgICBkZWYgcHJpbnRfZm9ybWF0dGVkX3Jlc3VsdChzZWxmLCBmb3JtYXR0ZWRfbmFtZXMsIGZvcm1hdHRlZF92YWx1ZXMsIHdpdGhfaGVhZGVyLCB0dHkpOgorICAgICAgICAjIGRldGVybWluZSBjb2x1bW4gd2lkdGhzCisgICAgICAgIHdpZHRocyA9IFtuLmRpc3BsYXl3aWR0aCBmb3IgbiBpbiBmb3JtYXR0ZWRfbmFtZXNdCisgICAgICAgIGlmIGZvcm1hdHRlZF92YWx1ZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmb3IgZm10cm93IGluIGZvcm1hdHRlZF92YWx1ZXM6CisgICAgICAgICAgICAgICAgZm9yIG51bSwgY29sIGluIGVudW1lcmF0ZShmbXRyb3cpOgorICAgICAgICAgICAgICAgICAgICB3aWR0aHNbbnVtXSA9IG1heCh3aWR0aHNbbnVtXSwgY29sLmRpc3BsYXl3aWR0aCkKKworICAgICAgICAjIHByaW50IGhlYWRlcgorICAgICAgICBpZiB3aXRoX2hlYWRlcjoKKyAgICAgICAgICAgIGhlYWRlciA9ICcgfCAnLmpvaW4oaGRyLmxqdXN0KHcsIGNvbG9yPXNlbGYuY29sb3IpIGZvciAoaGRyLCB3KSBpbiB6aXAoZm9ybWF0dGVkX25hbWVzLCB3aWR0aHMpKQorICAgICAgICAgICAgc2VsZi53cml0ZXJlc3VsdCgnICcgKyBoZWFkZXIucnN0cmlwKCkpCisgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCctJXMtJyAlICctKy0nLmpvaW4oJy0nICogdyBmb3IgdyBpbiB3aWR0aHMpKQorCisgICAgICAgICMgc3RvcCBpZiB0aGVyZSBhcmUgbm8gcm93cworICAgICAgICBpZiBmb3JtYXR0ZWRfdmFsdWVzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCIiKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBwcmludCByb3cgZGF0YQorICAgICAgICBmb3Igcm93IGluIGZvcm1hdHRlZF92YWx1ZXM6CisgICAgICAgICAgICBsaW5lID0gJyB8ICcuam9pbihjb2wucmp1c3QodywgY29sb3I9c2VsZi5jb2xvcikgZm9yIChjb2wsIHcpIGluIHppcChyb3csIHdpZHRocykpCisgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCcgJyArIGxpbmUpCisKKyAgICAgICAgaWYgdHR5OgorICAgICAgICAgICAgc2VsZi53cml0ZXJlc3VsdCgiIikKKworICAgIGRlZiBwcmludF9mb3JtYXR0ZWRfcmVzdWx0X3ZlcnRpY2FsbHkoc2VsZiwgZm9ybWF0dGVkX25hbWVzLCBmb3JtYXR0ZWRfdmFsdWVzLCByb3dfY291bnRfb2Zmc2V0KToKKyAgICAgICAgbWF4X2NvbF93aWR0aCA9IG1heChbbi5kaXNwbGF5d2lkdGggZm9yIG4gaW4gZm9ybWF0dGVkX25hbWVzXSkKKyAgICAgICAgbWF4X3ZhbF93aWR0aCA9IG1heChbbi5kaXNwbGF5d2lkdGggZm9yIHJvdyBpbiBmb3JtYXR0ZWRfdmFsdWVzIGZvciBuIGluIHJvd10pCisKKyAgICAgICAgIyBmb3IgZWFjaCByb3cgcmV0dXJuZWQsIGxpc3QgYWxsIHRoZSBjb2x1bW4tdmFsdWUgcGFpcnMKKyAgICAgICAgZm9yIGksIHJvdyBpbiBlbnVtZXJhdGUoZm9ybWF0dGVkX3ZhbHVlcyk6CisgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCJAIFJvdyAlZCIgJSAocm93X2NvdW50X29mZnNldCArIGkgKyAxKSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVyZXN1bHQoJy0lcy0nICUgJy0rLScuam9pbihbJy0nICogbWF4X2NvbF93aWR0aCwgJy0nICogbWF4X3ZhbF93aWR0aF0pKQorICAgICAgICAgICAgZm9yIGZpZWxkX2lkLCBmaWVsZCBpbiBlbnVtZXJhdGUocm93KToKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSBmb3JtYXR0ZWRfbmFtZXNbZmllbGRfaWRdLmxqdXN0KG1heF9jb2xfd2lkdGgsIGNvbG9yPXNlbGYuY29sb3IpCisgICAgICAgICAgICAgICAgdmFsdWUgPSBmaWVsZC5sanVzdChmaWVsZC5kaXNwbGF5d2lkdGgsIGNvbG9yPXNlbGYuY29sb3IpCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZXJlc3VsdCgnICcgKyAiIHwgIi5qb2luKFtjb2x1bW4sIHZhbHVlXSkpCisgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCcnKQorCisgICAgZGVmIHByaW50X3dhcm5pbmdzKHNlbGYsIHdhcm5pbmdzKToKKyAgICAgICAgaWYgd2FybmluZ3MgaXMgTm9uZSBvciBsZW4od2FybmluZ3MpID09IDA6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCcnKQorICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCdXYXJuaW5ncyA6JykKKyAgICAgICAgZm9yIHdhcm5pbmcgaW4gd2FybmluZ3M6CisgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KHdhcm5pbmcpCisgICAgICAgICAgICBzZWxmLndyaXRlcmVzdWx0KCcnKQorCisgICAgZGVmIGVtcHR5bGluZShzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHBhcnNlbGluZShzZWxmLCBsaW5lKToKKyAgICAgICAgIyB0aGlzIHNob3VsZG4ndCBiZSBuZWVkZWQKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGNvbXBsZXRlKHNlbGYsIHRleHQsIHN0YXRlKToKKyAgICAgICAgaWYgcmVhZGxpbmUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzdGF0ZSA9PSAwOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuY29tcGxldGlvbl9tYXRjaGVzID0gc2VsZi5maW5kX2NvbXBsZXRpb25zKHRleHQpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIGlmIGRlYnVnX2NvbXBsZXRpb246CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tcGxldGlvbl9tYXRjaGVzW3N0YXRlXQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZmluZF9jb21wbGV0aW9ucyhzZWxmLCB0ZXh0KToKKyAgICAgICAgY3VybGluZSA9IHJlYWRsaW5lLmdldF9saW5lX2J1ZmZlcigpCisgICAgICAgIHByZXZsaW5lcyA9IHNlbGYuc3RhdGVtZW50LmdldHZhbHVlKCkKKyAgICAgICAgd2hvbGVzdG10ID0gcHJldmxpbmVzICsgY3VybGluZQorICAgICAgICBiZWdpZHggPSByZWFkbGluZS5nZXRfYmVnaWR4KCkgKyBsZW4ocHJldmxpbmVzKQorICAgICAgICBzdHVmZl90b19jb21wbGV0ZSA9IHdob2xlc3RtdFs6YmVnaWR4XQorICAgICAgICByZXR1cm4gY3FscnVsZXNldC5jcWxfY29tcGxldGUoc3R1ZmZfdG9fY29tcGxldGUsIHRleHQsIGNhc3NhbmRyYV9jb25uPXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz1kZWJ1Z19jb21wbGV0aW9uLCBzdGFydHN5bWJvbD0nY3Fsc2hDb21tYW5kJykKKworICAgIGRlZiBzZXRfcHJvbXB0KHNlbGYsIHByb21wdCwgcHJlcGVuZF91c2VyPUZhbHNlKToKKyAgICAgICAgaWYgcHJlcGVuZF91c2VyIGFuZCBzZWxmLnVzZXJuYW1lOgorICAgICAgICAgICAgc2VsZi5wcm9tcHQgPSAiezB9QHsxfSIuZm9ybWF0KHNlbGYudXNlcm5hbWUsIHByb21wdCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnByb21wdCA9IHByb21wdAorCisgICAgZGVmIGNxbF91bnByb3RlY3RfbmFtZShzZWxmLCBuYW1lc3RyKToKKyAgICAgICAgaWYgbmFtZXN0ciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJldHVybiBjcWxydWxlc2V0LmRlcXVvdGVfbmFtZShuYW1lc3RyKQorCisgICAgZGVmIGNxbF91bnByb3RlY3RfdmFsdWUoc2VsZiwgdmFsc3RyKToKKyAgICAgICAgaWYgdmFsc3RyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGNxbHJ1bGVzZXQuZGVxdW90ZV92YWx1ZSh2YWxzdHIpCisKKyAgICBkZWYgX2NvbHVtbml6ZV91bmljb2RlKHNlbGYsIG5hbWVfbGlzdCk6CisgICAgICAgICIiIgorICAgICAgICBVc2VkIHdoZW4gY29sdW1uaXppbmcgaWRlbnRpZmllcnMgdGhhdCBtYXkgY29udGFpbiB1bmljb2RlCisgICAgICAgICIiIgorICAgICAgICBuYW1lcyA9IFtuIGZvciBuIGluIG5hbWVfbGlzdF0KKyAgICAgICAgY21kLkNtZC5jb2x1bW5pemUoc2VsZiwgbmFtZXMpCisgICAgICAgIHByaW50KCcnKQorCisgICAgZGVmIGRvX2Rlc2NyaWJlKHNlbGYsIHBhcnNlZCk6CisKKyAgICAgICAgIiIiCisgICAgICAgIERFU0NSSUJFIFtjcWxzaCBvbmx5XQorCisgICAgICAgIChERVNDIG1heSBiZSB1c2VkIGFzIGEgc2hvcnRoYW5kLikKKworICAgICAgICAgIE91dHB1dHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbm5lY3RlZCBDYXNzYW5kcmEgY2x1c3Rlciwgb3IgYWJvdXQKKyAgICAgICAgICB0aGUgZGF0YSBvYmplY3RzIHN0b3JlZCBpbiB0aGUgY2x1c3Rlci4gVXNlIGluIG9uZSBvZiB0aGUgZm9sbG93aW5nIHdheXM6CisKKyAgICAgICAgREVTQ1JJQkUgS0VZU1BBQ0VTCisKKyAgICAgICAgICBPdXRwdXQgdGhlIG5hbWVzIG9mIGFsbCBrZXlzcGFjZXMuCisKKyAgICAgICAgREVTQ1JJQkUgS0VZU1BBQ0UgWzxrZXlzcGFjZW5hbWU+XQorCisgICAgICAgICAgT3V0cHV0IENRTCBjb21tYW5kcyB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGdpdmVuIGtleXNwYWNlLAorICAgICAgICAgIGFuZCB0aGUgb2JqZWN0cyBpbiBpdCAoc3VjaCBhcyB0YWJsZXMsIHR5cGVzLCBmdW5jdGlvbnMsIGV0Yy4pLgorICAgICAgICAgIEluIHNvbWUgY2FzZXMsIGFzIHRoZSBDUUwgaW50ZXJmYWNlIG1hdHVyZXMsIHRoZXJlIHdpbGwgYmUgc29tZSBtZXRhZGF0YQorICAgICAgICAgIGFib3V0IGEga2V5c3BhY2UgdGhhdCBpcyBub3QgcmVwcmVzZW50YWJsZSB3aXRoIENRTC4gVGhhdCBtZXRhZGF0YSB3aWxsIG5vdCBiZSBzaG93bi4KKyAgICAgICAgICBUaGUgJzxrZXlzcGFjZW5hbWU+JyBhcmd1bWVudCBtYXkgYmUgb21pdHRlZCwgaW4gd2hpY2ggY2FzZSB0aGUgY3VycmVudAorICAgICAgICAgIGtleXNwYWNlIHdpbGwgYmUgZGVzY3JpYmVkLgorCisgICAgICAgIERFU0NSSUJFIFRBQkxFUworCisgICAgICAgICAgT3V0cHV0IHRoZSBuYW1lcyBvZiBhbGwgdGFibGVzIGluIHRoZSBjdXJyZW50IGtleXNwYWNlLCBvciBpbiBhbGwKKyAgICAgICAgICBrZXlzcGFjZXMgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBrZXlzcGFjZS4KKworICAgICAgICBERVNDUklCRSBUQUJMRSBbPGtleXNwYWNlPi5dPHRhYmxlbmFtZT4KKworICAgICAgICAgIE91dHB1dCBDUUwgY29tbWFuZHMgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlY3JlYXRlIHRoZSBnaXZlbiB0YWJsZS4KKyAgICAgICAgICBJbiBzb21lIGNhc2VzLCBhcyBhYm92ZSwgdGhlcmUgbWF5IGJlIHRhYmxlIG1ldGFkYXRhIHdoaWNoIGlzIG5vdAorICAgICAgICAgIHJlcHJlc2VudGFibGUgYW5kIHdoaWNoIHdpbGwgbm90IGJlIHNob3duLgorCisgICAgICAgIERFU0NSSUJFIElOREVYIDxpbmRleG5hbWU+CisKKyAgICAgICAgICBPdXRwdXQgdGhlIENRTCBjb21tYW5kIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICAgICAgSW4gc29tZSBjYXNlcywgdGhlcmUgbWF5IGJlIGluZGV4IG1ldGFkYXRhIHdoaWNoIGlzIG5vdCByZXByZXNlbnRhYmxlCisgICAgICAgICAgYW5kIHdoaWNoIHdpbGwgbm90IGJlIHNob3duLgorCisgICAgICAgIERFU0NSSUJFIE1BVEVSSUFMSVpFRCBWSUVXIDx2aWV3bmFtZT4KKworICAgICAgICAgIE91dHB1dCB0aGUgQ1FMIGNvbW1hbmQgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlY3JlYXRlIHRoZSBnaXZlbiBtYXRlcmlhbGl6ZWQgdmlldy4KKyAgICAgICAgICBJbiBzb21lIGNhc2VzLCB0aGVyZSBtYXkgYmUgbWF0ZXJpYWxpemVkIHZpZXcgbWV0YWRhdGEgd2hpY2ggaXMgbm90IHJlcHJlc2VudGFibGUKKyAgICAgICAgICBhbmQgd2hpY2ggd2lsbCBub3QgYmUgc2hvd24uCisKKyAgICAgICAgREVTQ1JJQkUgQ0xVU1RFUgorCisgICAgICAgICAgT3V0cHV0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25uZWN0ZWQgQ2Fzc2FuZHJhIGNsdXN0ZXIsIHN1Y2ggYXMgdGhlCisgICAgICAgICAgY2x1c3RlciBuYW1lLCBhbmQgdGhlIHBhcnRpdGlvbmVyIGFuZCBzbml0Y2ggaW4gdXNlLiBXaGVuIHlvdSBhcmUKKyAgICAgICAgICBjb25uZWN0ZWQgdG8gYSBub24tc3lzdGVtIGtleXNwYWNlLCBhbHNvIHNob3dzIGVuZHBvaW50LXJhbmdlCisgICAgICAgICAgb3duZXJzaGlwIGluZm9ybWF0aW9uIGZvciB0aGUgQ2Fzc2FuZHJhIHJpbmcuCisKKyAgICAgICAgREVTQ1JJQkUgW0ZVTExdIFNDSEVNQQorCisgICAgICAgICAgT3V0cHV0IENRTCBjb21tYW5kcyB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGVudGlyZSAobm9uLXN5c3RlbSkgc2NoZW1hLgorICAgICAgICAgIFdvcmtzIGFzIHRob3VnaCAiREVTQ1JJQkUgS0VZU1BBQ0UgayIgd2FzIGludm9rZWQgZm9yIGVhY2ggbm9uLXN5c3RlbSBrZXlzcGFjZQorICAgICAgICAgIGsuIFVzZSBERVNDUklCRSBGVUxMIFNDSEVNQSB0byBpbmNsdWRlIHRoZSBzeXN0ZW0ga2V5c3BhY2VzLgorCisgICAgICAgIERFU0NSSUJFIFRZUEVTCisKKyAgICAgICAgICBPdXRwdXQgdGhlIG5hbWVzIG9mIGFsbCB1c2VyLWRlZmluZWQtdHlwZXMgaW4gdGhlIGN1cnJlbnQga2V5c3BhY2UsIG9yIGluIGFsbAorICAgICAgICAgIGtleXNwYWNlcyBpZiB0aGVyZSBpcyBubyBjdXJyZW50IGtleXNwYWNlLgorCisgICAgICAgIERFU0NSSUJFIFRZUEUgWzxrZXlzcGFjZT4uXTx0eXBlPgorCisgICAgICAgICAgT3V0cHV0IHRoZSBDUUwgY29tbWFuZCB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGdpdmVuIHVzZXItZGVmaW5lZC10eXBlLgorCisgICAgICAgIERFU0NSSUJFIEZVTkNUSU9OUworCisgICAgICAgICAgT3V0cHV0IHRoZSBuYW1lcyBvZiBhbGwgdXNlci1kZWZpbmVkLWZ1bmN0aW9ucyBpbiB0aGUgY3VycmVudCBrZXlzcGFjZSwgb3IgaW4gYWxsCisgICAgICAgICAga2V5c3BhY2VzIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQga2V5c3BhY2UuCisKKyAgICAgICAgREVTQ1JJQkUgRlVOQ1RJT04gWzxrZXlzcGFjZT4uXTxmdW5jdGlvbj4KKworICAgICAgICAgIE91dHB1dCB0aGUgQ1FMIGNvbW1hbmQgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlY3JlYXRlIHRoZSBnaXZlbiB1c2VyLWRlZmluZWQtZnVuY3Rpb24uCisKKyAgICAgICAgREVTQ1JJQkUgQUdHUkVHQVRFUworCisgICAgICAgICAgT3V0cHV0IHRoZSBuYW1lcyBvZiBhbGwgdXNlci1kZWZpbmVkLWFnZ3JlZ2F0ZXMgaW4gdGhlIGN1cnJlbnQga2V5c3BhY2UsIG9yIGluIGFsbAorICAgICAgICAgIGtleXNwYWNlcyBpZiB0aGVyZSBpcyBubyBjdXJyZW50IGtleXNwYWNlLgorCisgICAgICAgIERFU0NSSUJFIEFHR1JFR0FURSBbPGtleXNwYWNlPi5dPGFnZ3JlZ2F0ZT4KKworICAgICAgICAgIE91dHB1dCB0aGUgQ1FMIGNvbW1hbmQgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlY3JlYXRlIHRoZSBnaXZlbiB1c2VyLWRlZmluZWQtYWdncmVnYXRlLgorCisgICAgICAgIERFU0NSSUJFIDxvYmpuYW1lPgorCisgICAgICAgICAgT3V0cHV0IENRTCBjb21tYW5kcyB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgdGhlIGVudGlyZSBvYmplY3Qgc2NoZW1hLAorICAgICAgICAgIHdoZXJlIG9iamVjdCBjYW4gYmUgZWl0aGVyIGEga2V5c3BhY2Ugb3IgYSB0YWJsZSBvciBhbiBpbmRleCBvciBhIG1hdGVyaWFsaXplZAorICAgICAgICAgIHZpZXcgKGluIHRoaXMgb3JkZXIpLgorICAgICAgICAiIiIKKyAgICAgICAgc3RtdCA9IFNpbXBsZVN0YXRlbWVudChwYXJzZWQuZXh0cmFjdF9vcmlnKCksIGNvbnNpc3RlbmN5X2xldmVsPWNhc3NhbmRyYS5Db25zaXN0ZW5jeUxldmVsLkxPQ0FMX09ORSwgZmV0Y2hfc2l6ZT1zZWxmLnBhZ2Vfc2l6ZSBpZiBzZWxmLnVzZV9wYWdpbmcgZWxzZSBOb25lKQorICAgICAgICBmdXR1cmUgPSBzZWxmLnNlc3Npb24uZXhlY3V0ZV9hc3luYyhzdG10KQorCisgICAgICAgIGlmIHNlbGYuY29ubmVjdGlvbl92ZXJzaW9uc1snYnVpbGQnXVswXSA8ICc0JzoKKyAgICAgICAgICAgIHByaW50KCdcbldBUk46IERFU0NSSUJFfERFU0Mgd2FzIG1vdmVkIHRvIHNlcnZlciBzaWRlIGluIENhc3NhbmRyYSA0LjAuIEFzIGEgY29uc2VxdWVuY2UgREVTUklCRXxERVNDICcKKyAgICAgICAgICAgICAgICAgICd3aWxsIG5vdCB3b3JrIGluIGNxbHNoICVyIGNvbm5lY3RlZCB0byBDYXNzYW5kcmEgJXIsIHRoZSB2ZXJzaW9uIHRoYXQgeW91IGFyZSBjb25uZWN0ZWQgdG8uICcKKyAgICAgICAgICAgICAgICAgICdERVNDUklCRSBkb2VzIG5vdCBleGlzdCBzZXJ2ZXIgc2lkZSBwcmlvciBDYXNzYW5kcmEgNC4wLicKKyAgICAgICAgICAgICAgICAgICUgKHZlcnNpb24sIHNlbGYuY29ubmVjdGlvbl92ZXJzaW9uc1snYnVpbGQnXSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZnV0dXJlLnJlc3VsdCgpCisKKyAgICAgICAgICAgICAgICB3aGF0ID0gcGFyc2VkLm1hdGNoZWRbMV1bMV0ubG93ZXIoKQorCisgICAgICAgICAgICAgICAgaWYgd2hhdCBpbiAoJ2NvbHVtbmZhbWlsaWVzJywgJ3RhYmxlcycsICd0eXBlcycsICdmdW5jdGlvbnMnLCAnYWdncmVnYXRlcycpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc2NyaWJlX2xpc3QocmVzdWx0KQorICAgICAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAna2V5c3BhY2VzJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kZXNjcmliZV9rZXlzcGFjZXMocmVzdWx0KQorICAgICAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnY2x1c3Rlcic6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVzY3JpYmVfY2x1c3RlcihyZXN1bHQpCisgICAgICAgICAgICAgICAgZWxpZiB3aGF0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRlc2NyaWJlX2VsZW1lbnQocmVzdWx0KQorCisgICAgICAgICAgICBleGNlcHQgQ1FMX0VSUk9SUyBhcyBlcnI6CisgICAgICAgICAgICAgICAgZXJyX21zZyA9IGVyci5tZXNzYWdlIGlmIGhhc2F0dHIoZXJyLCAnbWVzc2FnZScpIGVsc2Ugc3RyKGVycikKKyAgICAgICAgICAgICAgICBzZWxmLnByaW50ZXJyKGVycl9tc2cucGFydGl0aW9uKCJtZXNzYWdlPSIpWzJdLnN0cmlwKCciJykpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgICAgICBzZWxmLnByaW50ZXJyKHRyYWNlYmFjay5mb3JtYXRfZXhjKCkpCisKKyAgICAgICAgICAgIGlmIGZ1dHVyZToKKyAgICAgICAgICAgICAgICBpZiBmdXR1cmUud2FybmluZ3M6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfd2FybmluZ3MoZnV0dXJlLndhcm5pbmdzKQorCisgICAgZG9fZGVzYyA9IGRvX2Rlc2NyaWJlCisKKyAgICBkZWYgZGVzY3JpYmVfa2V5c3BhY2VzKHNlbGYsIHJvd3MpOgorICAgICAgICAiIiIKKyAgICAgICAgUHJpbnQgdGhlIG91dHB1dCBmb3IgYSBERVNDUklCRSBLRVlTUEFDRVMgcXVlcnkKKyAgICAgICAgIiIiCisgICAgICAgIG5hbWVzID0gW3JbJ25hbWUnXSBmb3IgciBpbiByb3dzXQorCisgICAgICAgIHByaW50KCcnKQorICAgICAgICBjbWQuQ21kLmNvbHVtbml6ZShzZWxmLCBuYW1lcykKKyAgICAgICAgcHJpbnQoJycpCisKKyAgICBkZWYgZGVzY3JpYmVfbGlzdChzZWxmLCByb3dzKToKKyAgICAgICAgIiIiCisgICAgICAgIFByaW50IHRoZSBvdXRwdXQgZm9yIGFsbCB0aGUgREVTQ1JJQkUgcXVlcmllcyBmb3IgZWxlbWVudCBuYW1lcyAoZS5nIERFU0NSSUJFIFRBQkxFUywgREVTQ1JJQkUgRlVOQ1RJT05TIC4uLikKKyAgICAgICAgIiIiCisgICAgICAgIGtleXNwYWNlID0gTm9uZQorICAgICAgICBuYW1lcyA9IGxpc3QoKQorICAgICAgICBmb3Igcm93IGluIHJvd3M6CisgICAgICAgICAgICBpZiByb3dbJ2tleXNwYWNlX25hbWUnXSAhPSBrZXlzcGFjZToKKyAgICAgICAgICAgICAgICBpZiBrZXlzcGFjZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF9rZXlzcGFjZV9lbGVtZW50X25hbWVzKGtleXNwYWNlLCBuYW1lcykKKworICAgICAgICAgICAgICAgIGtleXNwYWNlID0gcm93WydrZXlzcGFjZV9uYW1lJ10KKyAgICAgICAgICAgICAgICBuYW1lcyA9IGxpc3QoKQorCisgICAgICAgICAgICBuYW1lcy5hcHBlbmQoc3RyKHJvd1snbmFtZSddKSkKKworICAgICAgICBpZiBrZXlzcGFjZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucHJpbnRfa2V5c3BhY2VfZWxlbWVudF9uYW1lcyhrZXlzcGFjZSwgbmFtZXMpCisgICAgICAgICAgICBwcmludCgnJykKKworICAgIGRlZiBwcmludF9rZXlzcGFjZV9lbGVtZW50X25hbWVzKHNlbGYsIGtleXNwYWNlLCBuYW1lcyk6CisgICAgICAgIHByaW50KCcnKQorICAgICAgICBpZiBzZWxmLmN1cnJlbnRfa2V5c3BhY2UgaXMgTm9uZToKKyAgICAgICAgICAgIHByaW50KCdLZXlzcGFjZSAlcycgJSAoa2V5c3BhY2UpKQorICAgICAgICAgICAgcHJpbnQoJy0tLS0tLS0tLSVzJyAlICgnLScgKiBsZW4oa2V5c3BhY2UpKSkKKyAgICAgICAgY21kLkNtZC5jb2x1bW5pemUoc2VsZiwgbmFtZXMpCisKKyAgICBkZWYgZGVzY3JpYmVfZWxlbWVudChzZWxmLCByb3dzKToKKyAgICAgICAgIiIiCisgICAgICAgIFByaW50IHRoZSBvdXRwdXQgZm9yIGFsbCB0aGUgREVTQ1JJQkUgcXVlcmllcyB3aGVyZSBhbiBlbGVtZW50IG5hbWUgYXMgYmVlbiBzcGVjaWZpZWQgKGUuZyBERVNDUklCRSBUQUJMRSwgREVTQ1JJQkUgSU5ERVggLi4uKQorICAgICAgICAiIiIKKyAgICAgICAgZm9yIHJvdyBpbiByb3dzOgorICAgICAgICAgICAgcHJpbnQoJycpCisgICAgICAgICAgICBzZWxmLnF1ZXJ5X291dC53cml0ZShyb3dbJ2NyZWF0ZV9zdGF0ZW1lbnQnXSkKKyAgICAgICAgICAgIHByaW50KCcnKQorCisgICAgZGVmIGRlc2NyaWJlX2NsdXN0ZXIoc2VsZiwgcm93cyk6CisgICAgICAgICIiIgorICAgICAgICBQcmludCB0aGUgb3V0cHV0IGZvciBhIERFU0NSSUJFIENMVVNURVIgcXVlcnkuCisKKyAgICAgICAgSWYgYSBzcGVjaWZpZWQga2V5c3BhY2Ugd2FzIGluIHVzZSB0aGUgcmV0dXJuZWQgUmVzdWx0U2V0IHdpbGwgY29udGFpbnMgYSAncmFuZ2Vfb3duZXJzaGlwJyBjb2x1bW4sCisgICAgICAgIG90aGVyd2lzZSBub3QuCisgICAgICAgICIiIgorICAgICAgICBmb3Igcm93IGluIHJvd3M6CisgICAgICAgICAgICBwcmludCgnXG5DbHVzdGVyOiAlcycgJSByb3dbJ2NsdXN0ZXInXSkKKyAgICAgICAgICAgIHByaW50KCdQYXJ0aXRpb25lcjogJXMnICUgcm93WydwYXJ0aXRpb25lciddKQorICAgICAgICAgICAgcHJpbnQoJ1NuaXRjaDogJXNcbicgJSByb3dbJ3NuaXRjaCddKQorICAgICAgICAgICAgaWYgJ3JhbmdlX293bmVyc2hpcCcgaW4gcm93OgorICAgICAgICAgICAgICAgIHByaW50KCJSYW5nZSBvd25lcnNoaXA6IikKKyAgICAgICAgICAgICAgICBmb3IgZW50cnkgaW4gbGlzdChyb3dbJ3JhbmdlX293bmVyc2hpcCddLml0ZW1zKCkpOgorICAgICAgICAgICAgICAgICAgICBwcmludCgnICUzOXMgIFslc10nICUgKGVudHJ5WzBdLCAnLCAnLmpvaW4oW2hvc3QgZm9yIGhvc3QgaW4gZW50cnlbMV1dKSkpCisgICAgICAgICAgICAgICAgcHJpbnQoJycpCisKKyAgICBkZWYgZG9fY29weShzZWxmLCBwYXJzZWQpOgorICAgICAgICByIiIiCisgICAgICAgIENPUFkgW2NxbHNoIG9ubHldCisKKyAgICAgICAgICBDT1BZIHggRlJPTTogSW1wb3J0cyBDU1YgZGF0YSBpbnRvIGEgQ2Fzc2FuZHJhIHRhYmxlCisgICAgICAgICAgQ09QWSB4IFRPOiBFeHBvcnRzIGRhdGEgZnJvbSBhIENhc3NhbmRyYSB0YWJsZSBpbiBDU1YgZm9ybWF0LgorCisgICAgICAgIENPUFkgPHRhYmxlX25hbWU+IFsgKCBjb2x1bW4gWywgLi4uXSApIF0KKyAgICAgICAgICAgICBGUk9NICggJzxmaWxlX3BhdHRlcm5fMSwgZmlsZV9wYXR0ZXJuXzIsIC4uLiBmaWxlX3BhdHRlcm5fbj4nIHwgU1RESU4gKQorICAgICAgICAgICAgIFsgV0lUSCA8b3B0aW9uPj0ndmFsdWUnIFtBTkQgLi4uXSBdOworCisgICAgICAgIEZpbGUgcGF0dGVybnMgYXJlIGVpdGhlciBmaWxlIG5hbWVzIG9yIHZhbGlkIHB5dGhvbiBnbG9iIGV4cHJlc3Npb25zLCBlLmcuICouY3N2IG9yIGZvbGRlci8qLmNzdi4KKworICAgICAgICBDT1BZIDx0YWJsZV9uYW1lPiBbICggY29sdW1uIFssIC4uLl0gKSBdCisgICAgICAgICAgICAgVE8gKCAnPGZpbGVuYW1lPicgfCBTVERPVVQgKQorICAgICAgICAgICAgIFsgV0lUSCA8b3B0aW9uPj0ndmFsdWUnIFtBTkQgLi4uXSBdOworCisgICAgICAgIEF2YWlsYWJsZSBjb21tb24gQ09QWSBvcHRpb25zIGFuZCBkZWZhdWx0czoKKworICAgICAgICAgIERFTElNSVRFUj0nLCcgICAgICAgICAgIC0gY2hhcmFjdGVyIHRoYXQgYXBwZWFycyBiZXR3ZWVuIHJlY29yZHMKKyAgICAgICAgICBRVU9URT0nIicgICAgICAgICAgICAgICAtIHF1b3RpbmcgY2hhcmFjdGVyIHRvIGJlIHVzZWQgdG8gcXVvdGUgZmllbGRzCisgICAgICAgICAgRVNDQVBFPSdcJyAgICAgICAgICAgICAgLSBjaGFyYWN0ZXIgdG8gYXBwZWFyIGJlZm9yZSB0aGUgUVVPVEUgY2hhciB3aGVuIHF1b3RlZAorICAgICAgICAgIEhFQURFUj1mYWxzZSAgICAgICAgICAgIC0gd2hldGhlciB0byBpZ25vcmUgdGhlIGZpcnN0IGxpbmUKKyAgICAgICAgICBOVUxMPScnICAgICAgICAgICAgICAgICAtIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgYSBudWxsIHZhbHVlCisgICAgICAgICAgREFURVRJTUVGT1JNQVQ9ICAgICAgICAgLSB0aW1lc3RhbXAgc3RyZnRpbWUgZm9ybWF0CisgICAgICAgICAgICAnJVktJW0tJWQgJUg6JU06JVMleicgICBkZWZhdWx0cyB0byB0aW1lX2Zvcm1hdCB2YWx1ZSBpbiBjcWxzaHJjCisgICAgICAgICAgTUFYQVRURU1QVFM9NSAgICAgICAgICAgLSB0aGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgcGVyIGJhdGNoIG9yIHJhbmdlCisgICAgICAgICAgUkVQT1JURlJFUVVFTkNZPTAuMjUgICAgLSB0aGUgZnJlcXVlbmN5IHdpdGggd2hpY2ggd2UgZGlzcGxheSBzdGF0dXMgdXBkYXRlcyBpbiBzZWNvbmRzCisgICAgICAgICAgREVDSU1BTFNFUD0nLicgICAgICAgICAgLSB0aGUgc2VwYXJhdG9yIGZvciBkZWNpbWFsIHZhbHVlcworICAgICAgICAgIFRIT1VTQU5EU1NFUD0nJyAgICAgICAgIC0gdGhlIHNlcGFyYXRvciBmb3IgdGhvdXNhbmRzIGRpZ2l0IGdyb3VwcworICAgICAgICAgIEJPT0xTVFlMRT0nVHJ1ZSxGYWxzZScgIC0gdGhlIHJlcHJlc2VudGF0aW9uIGZvciBib29sZWFucywgY2FzZSBpbnNlbnNpdGl2ZSwgc3BlY2lmeSB0cnVlIGZvbGxvd2VkIGJ5IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUgeWVzLG5vIG9yIDEsMAorICAgICAgICAgIE5VTVBST0NFU1NFUz1uICAgICAgICAgIC0gdGhlIG51bWJlciBvZiB3b3JrZXIgcHJvY2Vzc2VzLCBieSBkZWZhdWx0IHRoZSBudW1iZXIgb2YgY29yZXMgbWludXMgb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBwZWQgYXQgMTYKKyAgICAgICAgICBDT05GSUdGSUxFPScnICAgICAgICAgICAtIGEgY29uZmlndXJhdGlvbiBmaWxlIHdpdGggdGhlIHNhbWUgZm9ybWF0IGFzIC5jcWxzaHJjIChzZWUgdGhlIFB5dGhvbiBDb25maWdQYXJzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb24pIHdoZXJlIHlvdSBjYW4gc3BlY2lmeSBXSVRIIG9wdGlvbnMgdW5kZXIgdGhlIGZvbGxvd2luZyBvcHRpb25hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbnM6IFtjb3B5XSwgW2NvcHktdG9dLCBbY29weS1mcm9tXSwgW2NvcHk6a3MudGFibGVdLCBbY29weS10bzprcy50YWJsZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29weS1mcm9tOmtzLnRhYmxlXSwgd2hlcmUgPGtzPiBpcyB5b3VyIGtleXNwYWNlIG5hbWUgYW5kIDx0YWJsZT4gaXMgeW91ciB0YWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS4gT3B0aW9ucyBhcmUgcmVhZCBmcm9tIHRoZXNlIHNlY3Rpb25zLCBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZSwgYW5kIGNvbW1hbmQgbGluZSBvcHRpb25zIGFsd2F5cyBvdmVycmlkZSBvcHRpb25zIGluIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRpbmcgb24gdGhlIENPUFkgZGlyZWN0aW9uLCBvbmx5IHRoZSByZWxldmFudCBjb3B5LWZyb20gb3IgY29weS10byBzZWN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHVzZWQuIElmIG5vIGNvbmZpZ2ZpbGUgaXMgc3BlY2lmaWVkIHRoZW4gLmNxbHNocmMgaXMgc2VhcmNoZWQgaW5zdGVhZC4KKyAgICAgICAgICBSQVRFRklMRT0nJyAgICAgICAgICAgICAtIGFuIG9wdGlvbmFsIGZpbGUgd2hlcmUgdG8gcHJpbnQgdGhlIG91dHB1dCBzdGF0aXN0aWNzCisKKyAgICAgICAgQXZhaWxhYmxlIENPUFkgRlJPTSBvcHRpb25zIGFuZCBkZWZhdWx0czoKKworICAgICAgICAgIENIVU5LU0laRT01MDAwICAgICAgICAgIC0gdGhlIHNpemUgb2YgY2h1bmtzIHBhc3NlZCB0byB3b3JrZXIgcHJvY2Vzc2VzCisgICAgICAgICAgSU5HRVNUUkFURT0xMDAwMDAgICAgICAgLSBhbiBhcHByb3hpbWF0ZSBpbmdlc3QgcmF0ZSBpbiByb3dzIHBlciBzZWNvbmQKKyAgICAgICAgICBNSU5CQVRDSFNJWkU9MTAgICAgICAgICAtIHRoZSBtaW5pbXVtIHNpemUgb2YgYW4gaW1wb3J0IGJhdGNoCisgICAgICAgICAgTUFYQkFUQ0hTSVpFPTIwICAgICAgICAgLSB0aGUgbWF4aW11bSBzaXplIG9mIGFuIGltcG9ydCBiYXRjaAorICAgICAgICAgIE1BWFJPV1M9LTEgICAgICAgICAgICAgIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MsIC0xIG1lYW5zIG5vIG1heGltdW0KKyAgICAgICAgICBTS0lQUk9XUz0wICAgICAgICAgICAgICAtIHRoZSBudW1iZXIgb2Ygcm93cyB0byBza2lwCisgICAgICAgICAgU0tJUENPTFM9JycgICAgICAgICAgICAgLSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGNvbHVtbiBuYW1lcyB0byBza2lwCisgICAgICAgICAgTUFYUEFSU0VFUlJPUlM9LTEgICAgICAgLSB0aGUgbWF4aW11bSBnbG9iYWwgbnVtYmVyIG9mIHBhcnNpbmcgZXJyb3JzLCAtMSBtZWFucyBubyBtYXhpbXVtCisgICAgICAgICAgTUFYSU5TRVJURVJST1JTPTEwMDAgICAgLSB0aGUgbWF4aW11bSBnbG9iYWwgbnVtYmVyIG9mIGluc2VydCBlcnJvcnMsIC0xIG1lYW5zIG5vIG1heGltdW0KKyAgICAgICAgICBFUlJGSUxFPScnICAgICAgICAgICAgICAtIGEgZmlsZSB3aGVyZSB0byBzdG9yZSBhbGwgcm93cyB0aGF0IGNvdWxkIG5vdCBiZSBpbXBvcnRlZCwgYnkgZGVmYXVsdCB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRfa3NfdGFibGUuZXJyIHdoZXJlIDxrcz4gaXMgeW91ciBrZXlzcGFjZSBhbmQgPHRhYmxlPiBpcyB5b3VyIHRhYmxlIG5hbWUuCisgICAgICAgICAgUFJFUEFSRURTVEFURU1FTlRTPVRydWUgLSB3aGV0aGVyIHRvIHVzZSBwcmVwYXJlZCBzdGF0ZW1lbnRzIHdoZW4gaW1wb3J0aW5nLCBieSBkZWZhdWx0IFRydWUuIFNldCB0aGlzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZSBpZiB5b3UgZG9uJ3QgbWluZCBzaGlmdGluZyBkYXRhIHBhcnNpbmcgdG8gdGhlIGNsdXN0ZXIuIFRoZSBjbHVzdGVyIHdpbGwgYWxzbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSB0byBjb21waWxlIGV2ZXJ5IGJhdGNoIHN0YXRlbWVudC4gRm9yIGxhcmdlIGFuZCBvdmVyc2l6ZWQgY2x1c3RlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgd2lsbCByZXN1bHQgaW4gYSBmYXN0ZXIgaW1wb3J0IGJ1dCBmb3Igc21hbGxlciBjbHVzdGVycyBpdCBtYXkgZ2VuZXJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRzLgorICAgICAgICAgIFRUTD0zNjAwICAgICAgICAgICAgICAgIC0gdGhlIHRpbWUgdG8gbGl2ZSBpbiBzZWNvbmRzLCBieSBkZWZhdWx0IGRhdGEgd2lsbCBub3QgZXhwaXJlCisKKyAgICAgICAgQXZhaWxhYmxlIENPUFkgVE8gb3B0aW9ucyBhbmQgZGVmYXVsdHM6CisKKyAgICAgICAgICBFTkNPRElORz0ndXRmOCcgICAgICAgICAgLSBlbmNvZGluZyBmb3IgQ1NWIG91dHB1dAorICAgICAgICAgIFBBR0VTSVpFPScxMDAwJyAgICAgICAgICAtIHRoZSBwYWdlIHNpemUgZm9yIGZldGNoaW5nIHJlc3VsdHMKKyAgICAgICAgICBQQUdFVElNRU9VVD0xMCAgICAgICAgICAgLSB0aGUgcGFnZSB0aW1lb3V0IGluIHNlY29uZHMgZm9yIGZldGNoaW5nIHJlc3VsdHMKKyAgICAgICAgICBCRUdJTlRPS0VOPScnICAgICAgICAgICAgLSB0aGUgbWluaW11bSB0b2tlbiBzdHJpbmcgdG8gY29uc2lkZXIgd2hlbiBleHBvcnRpbmcgZGF0YQorICAgICAgICAgIEVORFRPS0VOPScnICAgICAgICAgICAgICAtIHRoZSBtYXhpbXVtIHRva2VuIHN0cmluZyB0byBjb25zaWRlciB3aGVuIGV4cG9ydGluZyBkYXRhCisgICAgICAgICAgTUFYUkVRVUVTVFM9NiAgICAgICAgICAgIC0gdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIGVhY2ggd29ya2VyIHByb2Nlc3MgY2FuIHdvcmsgb24gaW4gcGFyYWxsZWwKKyAgICAgICAgICBNQVhPVVRQVVRTSVpFPSctMScgICAgICAgLSB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBvdXRwdXQgZmlsZSBtZWFzdXJlZCBpbiBudW1iZXIgb2YgbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV5b25kIHRoaXMgbWF4aW11bSB0aGUgb3V0cHV0IGZpbGUgd2lsbCBiZSBzcGxpdCBpbnRvIHNlZ21lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xIG1lYW5zIHVubGltaXRlZC4KKyAgICAgICAgICBGTE9BVFBSRUNJU0lPTj01ICAgICAgICAgLSB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBkaXNwbGF5ZWQgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgZm9yIGNxbCBmbG9hdCB2YWx1ZXMKKyAgICAgICAgICBET1VCTEVQUkVDSVNJT049MTIgICAgICAgLSB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBkaXNwbGF5ZWQgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgZm9yIGNxbCBkb3VibGUgdmFsdWVzCisKKyAgICAgICAgV2hlbiBlbnRlcmluZyBDU1YgZGF0YSBvbiBTVERJTiwgeW91IGNhbiB1c2UgdGhlIHNlcXVlbmNlICJcLiIKKyAgICAgICAgb24gYSBsaW5lIGJ5IGl0c2VsZiB0byBlbmQgdGhlIGRhdGEgaW5wdXQuCisgICAgICAgICIiIgorCisgICAgICAgIGtzID0gc2VsZi5jcWxfdW5wcm90ZWN0X25hbWUocGFyc2VkLmdldF9iaW5kaW5nKCdrc25hbWUnLCBOb25lKSkKKyAgICAgICAgaWYga3MgaXMgTm9uZToKKyAgICAgICAgICAgIGtzID0gc2VsZi5jdXJyZW50X2tleXNwYWNlCisgICAgICAgICAgICBpZiBrcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vS2V5c3BhY2VFcnJvcigiTm90IGluIGFueSBrZXlzcGFjZS4iKQorICAgICAgICB0YWJsZSA9IHNlbGYuY3FsX3VucHJvdGVjdF9uYW1lKHBhcnNlZC5nZXRfYmluZGluZygnY2ZuYW1lJykpCisgICAgICAgIGNvbHVtbnMgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2NvbG5hbWVzJywgTm9uZSkKKyAgICAgICAgaWYgY29sdW1ucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvbHVtbnMgPSBsaXN0KG1hcChzZWxmLmNxbF91bnByb3RlY3RfbmFtZSwgY29sdW1ucykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGRlZmF1bHQgdG8gYWxsIGtub3duIGNvbHVtbnMKKyAgICAgICAgICAgIGNvbHVtbnMgPSBzZWxmLmdldF9jb2x1bW5fbmFtZXMoa3MsIHRhYmxlKQorCisgICAgICAgIGZuYW1lID0gcGFyc2VkLmdldF9iaW5kaW5nKCdmbmFtZScsIE5vbmUpCisgICAgICAgIGlmIGZuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm5hbWUgPSBzZWxmLmNxbF91bnByb3RlY3RfdmFsdWUoZm5hbWUpCisKKyAgICAgICAgY29weW9wdG5hbWVzID0gbGlzdChtYXAoc3RyLmxvd2VyLCBwYXJzZWQuZ2V0X2JpbmRpbmcoJ29wdG5hbWVzJywgKCkpKSkKKyAgICAgICAgY29weW9wdHZhbHMgPSBsaXN0KG1hcChzZWxmLmNxbF91bnByb3RlY3RfdmFsdWUsIHBhcnNlZC5nZXRfYmluZGluZygnb3B0dmFscycsICgpKSkpCisgICAgICAgIG9wdHMgPSBkaWN0KGxpc3QoemlwKGNvcHlvcHRuYW1lcywgY29weW9wdHZhbHMpKSkKKworICAgICAgICBkaXJlY3Rpb24gPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2RpcicpLnVwcGVyKCkKKyAgICAgICAgaWYgZGlyZWN0aW9uID09ICdGUk9NJzoKKyAgICAgICAgICAgIHRhc2sgPSBJbXBvcnRUYXNrKHNlbGYsIGtzLCB0YWJsZSwgY29sdW1ucywgZm5hbWUsIG9wdHMsIHNlbGYuY29ubi5wcm90b2NvbF92ZXJzaW9uLCBDT05GSUdfRklMRSkKKyAgICAgICAgZWxpZiBkaXJlY3Rpb24gPT0gJ1RPJzoKKyAgICAgICAgICAgIHRhc2sgPSBFeHBvcnRUYXNrKHNlbGYsIGtzLCB0YWJsZSwgY29sdW1ucywgZm5hbWUsIG9wdHMsIHNlbGYuY29ubi5wcm90b2NvbF92ZXJzaW9uLCBDT05GSUdfRklMRSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCJVbmtub3duIGRpcmVjdGlvbiAlcyIgJSBkaXJlY3Rpb24pCisKKyAgICAgICAgdGFzay5ydW4oKQorCisgICAgZGVmIGRvX3Nob3coc2VsZiwgcGFyc2VkKToKKyAgICAgICAgIiIiCisgICAgICAgIFNIT1cgW2NxbHNoIG9ubHldCisKKyAgICAgICAgICBEaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBjcWxzaCBzZXNzaW9uLiBDYW4gYmUgY2FsbGVkIGluCisgICAgICAgICAgdGhlIGZvbGxvd2luZyB3YXlzOgorCisgICAgICAgIFNIT1cgVkVSU0lPTgorCisgICAgICAgICAgU2hvd3MgdGhlIHZlcnNpb24gYW5kIGJ1aWxkIG9mIHRoZSBjb25uZWN0ZWQgQ2Fzc2FuZHJhIGluc3RhbmNlLCBhcworICAgICAgICAgIHdlbGwgYXMgdGhlIHZlcnNpb24gb2YgdGhlIENRTCBzcGVjIHRoYXQgdGhlIGNvbm5lY3RlZCBDYXNzYW5kcmEKKyAgICAgICAgICBpbnN0YW5jZSB1bmRlcnN0YW5kcy4KKworICAgICAgICBTSE9XIEhPU1QKKworICAgICAgICAgIFNob3dzIHdoZXJlIGNxbHNoIGlzIGN1cnJlbnRseSBjb25uZWN0ZWQuCisKKyAgICAgICAgU0hPVyBTRVNTSU9OIDxzZXNzaW9uaWQ+CisKKyAgICAgICAgICBQcmV0dHktcHJpbnRzIHRoZSByZXF1ZXN0ZWQgdHJhY2luZyBzZXNzaW9uLgorCisgICAgICAgIFNIT1cgUkVQTElDQVMgPHRva2VuPiAoPGtleXNwYWNlPikKKworICAgICAgICAgIExpc3RzIHRoZSByZXBsaWNhIG5vZGVzIGJ5IElQIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiB0b2tlbi4gVGhlIGN1cnJlbnQKKyAgICAgICAgICBrZXlzcGFjZSBpcyB1c2VkIGlmIG9uZSBpcyBub3Qgc3BlY2lmaWVkLgorICAgICAgICAiIiIKKyAgICAgICAgc2hvd3doYXQgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3doYXQnKS5sb3dlcigpCisgICAgICAgIGlmIHNob3d3aGF0ID09ICd2ZXJzaW9uJzoKKyAgICAgICAgICAgIHNlbGYuZ2V0X2Nvbm5lY3Rpb25fdmVyc2lvbnMoKQorICAgICAgICAgICAgc2VsZi5zaG93X3ZlcnNpb24oKQorICAgICAgICBlbGlmIHNob3d3aGF0ID09ICdob3N0JzoKKyAgICAgICAgICAgIHNlbGYuc2hvd19ob3N0KCkKKyAgICAgICAgZWxpZiBzaG93d2hhdC5zdGFydHN3aXRoKCdzZXNzaW9uJyk6CisgICAgICAgICAgICBzZXNzaW9uX2lkID0gcGFyc2VkLmdldF9iaW5kaW5nKCdzZXNzaW9uaWQnKS5sb3dlcigpCisgICAgICAgICAgICBzZWxmLnNob3dfc2Vzc2lvbihVVUlEKHNlc3Npb25faWQpKQorICAgICAgICBlbGlmIHNob3d3aGF0LnN0YXJ0c3dpdGgoJ3JlcGxpY2FzJyk6CisgICAgICAgICAgICB0b2tlbl9pZCA9IHBhcnNlZC5nZXRfYmluZGluZygndG9rZW4nKQorICAgICAgICAgICAga2V5c3BhY2UgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2tleXNwYWNlJykKKyAgICAgICAgICAgIHNlbGYuc2hvd19yZXBsaWNhcyh0b2tlbl9pZCwga2V5c3BhY2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCdXYWl0LCBob3cgZG8gSSBzaG93ICVyPycgJSAoc2hvd3doYXQsKSkKKworICAgIGRlZiBkb19zb3VyY2Uoc2VsZiwgcGFyc2VkKToKKyAgICAgICAgIiIiCisgICAgICAgIFNPVVJDRSBbY3Fsc2ggb25seV0KKworICAgICAgICBFeGVjdXRlcyBhIGZpbGUgY29udGFpbmluZyBDUUwgc3RhdGVtZW50cy4gR2l2ZXMgdGhlIG91dHB1dCBmb3IgZWFjaAorICAgICAgICBzdGF0ZW1lbnQgaW4gdHVybiwgaWYgYW55LCBvciBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgYWxvbmcgdGhlIHdheS4KKworICAgICAgICBFcnJvcnMgZG8gTk9UIGFib3J0IGV4ZWN1dGlvbiBvZiB0aGUgQ1FMIHNvdXJjZSBmaWxlLgorCisgICAgICAgIFVzYWdlOgorCisgICAgICAgICAgU09VUkNFICc8ZmlsZT4nOworCisgICAgICAgIFRoYXQgaXMsIHRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGJlIGV4ZWN1dGVkIG11c3QgYmUgZ2l2ZW4gaW5zaWRlIGEKKyAgICAgICAgc3RyaW5nIGxpdGVyYWwuIFRoZSBwYXRoIGlzIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKKyAgICAgICAgZGlyZWN0b3J5LiBUaGUgdGlsZGUgc2hvcnRoYW5kIG5vdGF0aW9uICgnfi9teWRpcicpIGlzIHN1cHBvcnRlZCBmb3IKKyAgICAgICAgcmVmZXJyaW5nIHRvICRIT01FLgorCisgICAgICAgIFNlZSBhbHNvIHRoZSAtLWZpbGUgb3B0aW9uIHRvIGNxbHNoLgorICAgICAgICAiIiIKKyAgICAgICAgZm5hbWUgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2ZuYW1lJykKKyAgICAgICAgZm5hbWUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoc2VsZi5jcWxfdW5wcm90ZWN0X3ZhbHVlKGZuYW1lKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW5jb2RpbmcsIGJvbV9zaXplID0gZ2V0X2ZpbGVfZW5jb2RpbmdfYm9tc2l6ZShmbmFtZSkKKyAgICAgICAgICAgIGYgPSBjb2RlY3Mub3BlbihmbmFtZSwgJ3InLCBlbmNvZGluZykKKyAgICAgICAgICAgIGYuc2Vlayhib21fc2l6ZSkKKyAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoJ0NvdWxkIG5vdCBvcGVuICVyOiAlcycgJSAoZm5hbWUsIGUpKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHN1YnNoZWxsID0gU2hlbGwoc2VsZi5ob3N0bmFtZSwgc2VsZi5wb3J0LCBjb2xvcj1zZWxmLmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lPXNlbGYudXNlcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9c2VsZi5lbmNvZGluZywgc3RkaW49ZiwgdHR5PUZhbHNlLCB1c2VfY29ubj1zZWxmLmNvbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgY3FsdmVyPXNlbGYuY3FsX3ZlcnNpb24sIGtleXNwYWNlPXNlbGYuY3VycmVudF9rZXlzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjaW5nX2VuYWJsZWQ9c2VsZi50cmFjaW5nX2VuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9uYW5vdGltZV9mb3JtYXQ9c2VsZi5kaXNwbGF5X25hbm90aW1lX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQ9c2VsZi5kaXNwbGF5X3RpbWVzdGFtcF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9kYXRlX2Zvcm1hdD1zZWxmLmRpc3BsYXlfZGF0ZV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9mbG9hdF9wcmVjaXNpb249c2VsZi5kaXNwbGF5X2Zsb2F0X3ByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2RvdWJsZV9wcmVjaXNpb249c2VsZi5kaXNwbGF5X2RvdWJsZV9wcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV90aW1lem9uZT1zZWxmLmRpc3BsYXlfdGltZXpvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RyYWNlX3dhaXQ9c2VsZi5tYXhfdHJhY2Vfd2FpdCwgc3NsPXNlbGYuc3NsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfdGltZW91dD1zZWxmLnNlc3Npb24uZGVmYXVsdF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RfdGltZW91dD1zZWxmLmNvbm4uY29ubmVjdF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzX3N1YnNoZWxsPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9wcm92aWRlcj1zZWxmLmF1dGhfcHJvdmlkZXIpCisgICAgICAgICMgZHVwbGljYXRlIGNvdmVyYWdlIHJlbGF0ZWQgc2V0dGluZ3MgaW4gc3Vic2hlbGwKKyAgICAgICAgaWYgc2VsZi5jb3ZlcmFnZToKKyAgICAgICAgICAgIHN1YnNoZWxsLmNvdmVyYWdlID0gVHJ1ZQorICAgICAgICAgICAgc3Vic2hlbGwuY292ZXJhZ2VyY19wYXRoID0gc2VsZi5jb3ZlcmFnZXJjX3BhdGgKKyAgICAgICAgc3Vic2hlbGwuY21kbG9vcCgpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIGRvX2NhcHR1cmUoc2VsZiwgcGFyc2VkKToKKyAgICAgICAgIiIiCisgICAgICAgIENBUFRVUkUgW2NxbHNoIG9ubHldCisKKyAgICAgICAgQmVnaW5zIGNhcHR1cmluZyBjb21tYW5kIG91dHB1dCBhbmQgYXBwZW5kaW5nIGl0IHRvIGEgc3BlY2lmaWVkIGZpbGUuCisgICAgICAgIE91dHB1dCB3aWxsIG5vdCBiZSBzaG93biBhdCB0aGUgY29uc29sZSB3aGlsZSBpdCBpcyBjYXB0dXJlZC4KKworICAgICAgICBVc2FnZToKKworICAgICAgICAgIENBUFRVUkUgJzxmaWxlPic7CisgICAgICAgICAgQ0FQVFVSRSBPRkY7CisgICAgICAgICAgQ0FQVFVSRTsKKworICAgICAgICBUaGF0IGlzLCB0aGUgcGF0aCB0byB0aGUgZmlsZSB0byBiZSBhcHBlbmRlZCB0byBtdXN0IGJlIGdpdmVuIGluc2lkZSBhCisgICAgICAgIHN0cmluZyBsaXRlcmFsLiBUaGUgcGF0aCBpcyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nCisgICAgICAgIGRpcmVjdG9yeS4gVGhlIHRpbGRlIHNob3J0aGFuZCBub3RhdGlvbiAoJ34vbXlkaXInKSBpcyBzdXBwb3J0ZWQgZm9yCisgICAgICAgIHJlZmVycmluZyB0byAkSE9NRS4KKworICAgICAgICBPbmx5IHF1ZXJ5IHJlc3VsdCBvdXRwdXQgaXMgY2FwdHVyZWQuIEVycm9ycyBhbmQgb3V0cHV0IGZyb20gY3Fsc2gtb25seQorICAgICAgICBjb21tYW5kcyB3aWxsIHN0aWxsIGJlIHNob3duIGluIHRoZSBjcWxzaCBzZXNzaW9uLgorCisgICAgICAgIFRvIHN0b3AgY2FwdHVyaW5nIG91dHB1dCBhbmQgc2hvdyBpdCBpbiB0aGUgY3Fsc2ggc2Vzc2lvbiBhZ2FpbiwgdXNlCisgICAgICAgIENBUFRVUkUgT0ZGLgorCisgICAgICAgIFRvIGluc3BlY3QgdGhlIGN1cnJlbnQgY2FwdHVyZSBjb25maWd1cmF0aW9uLCB1c2UgQ0FQVFVSRSB3aXRoIG5vCisgICAgICAgIGFyZ3VtZW50cy4KKyAgICAgICAgIiIiCisgICAgICAgIGZuYW1lID0gcGFyc2VkLmdldF9iaW5kaW5nKCdmbmFtZScpCisgICAgICAgIGlmIGZuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLnNodW50ZWRfcXVlcnlfb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHByaW50KCJDdXJyZW50bHkgY2FwdHVyaW5nIHF1ZXJ5IG91dHB1dCB0byAlci4iICUgKHNlbGYucXVlcnlfb3V0Lm5hbWUsKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQoIkN1cnJlbnRseSBub3QgY2FwdHVyaW5nIHF1ZXJ5IG91dHB1dC4iKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgZm5hbWUudXBwZXIoKSA9PSAnT0ZGJzoKKyAgICAgICAgICAgIGlmIHNlbGYuc2h1bnRlZF9xdWVyeV9vdXQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCdOb3QgY3VycmVudGx5IGNhcHR1cmluZyBvdXRwdXQuJykKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYucXVlcnlfb3V0LmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYucXVlcnlfb3V0ID0gc2VsZi5zaHVudGVkX3F1ZXJ5X291dAorICAgICAgICAgICAgc2VsZi5jb2xvciA9IHNlbGYuc2h1bnRlZF9jb2xvcgorICAgICAgICAgICAgc2VsZi5zaHVudGVkX3F1ZXJ5X291dCA9IE5vbmUKKyAgICAgICAgICAgIGRlbCBzZWxmLnNodW50ZWRfY29sb3IKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIHNlbGYuc2h1bnRlZF9xdWVyeV9vdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCdBbHJlYWR5IGNhcHR1cmluZyBvdXRwdXQgdG8gJXMuIFVzZSBDQVBUVVJFIE9GRicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyB0byBkaXNhYmxlLicgJSAoc2VsZi5xdWVyeV9vdXQubmFtZSwpKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm5hbWUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoc2VsZi5jcWxfdW5wcm90ZWN0X3ZhbHVlKGZuYW1lKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4oZm5hbWUsICdhJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHNlbGYucHJpbnRlcnIoJ0NvdWxkIG5vdCBvcGVuICVyIGZvciBhcHBlbmQ6ICVzJyAlIChmbmFtZSwgZSkpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5zaHVudGVkX3F1ZXJ5X291dCA9IHNlbGYucXVlcnlfb3V0CisgICAgICAgIHNlbGYuc2h1bnRlZF9jb2xvciA9IHNlbGYuY29sb3IKKyAgICAgICAgc2VsZi5xdWVyeV9vdXQgPSBmCisgICAgICAgIHNlbGYuY29sb3IgPSBGYWxzZQorICAgICAgICBwcmludCgnTm93IGNhcHR1cmluZyBxdWVyeSBvdXRwdXQgdG8gJXIuJyAlIChmbmFtZSwpKQorCisgICAgZGVmIGRvX3RyYWNpbmcoc2VsZiwgcGFyc2VkKToKKyAgICAgICAgIiIiCisgICAgICAgIFRSQUNJTkcgW2NxbHNoXQorCisgICAgICAgICAgRW5hYmxlcyBvciBkaXNhYmxlcyByZXF1ZXN0IHRyYWNpbmcuCisKKyAgICAgICAgVFJBQ0lORyBPTgorCisgICAgICAgICAgRW5hYmxlcyB0cmFjaW5nIGZvciBhbGwgZnVydGhlciByZXF1ZXN0cy4KKworICAgICAgICBUUkFDSU5HIE9GRgorCisgICAgICAgICAgRGlzYWJsZXMgdHJhY2luZy4KKworICAgICAgICBUUkFDSU5HCisKKyAgICAgICAgICBUUkFDSU5HIHdpdGggbm8gYXJndW1lbnRzIHNob3dzIHRoZSBjdXJyZW50IHRyYWNpbmcgc3RhdHVzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi50cmFjaW5nX2VuYWJsZWQgPSBTd2l0Y2hDb21tYW5kKCJUUkFDSU5HIiwgIlRyYWNpbmciKS5leGVjdXRlKHNlbGYudHJhY2luZ19lbmFibGVkLCBwYXJzZWQsIHNlbGYucHJpbnRlcnIpCisKKyAgICBkZWYgZG9fZXhwYW5kKHNlbGYsIHBhcnNlZCk6CisgICAgICAgICIiIgorICAgICAgICBFWFBBTkQgW2NxbHNoXQorCisgICAgICAgICAgRW5hYmxlcyBvciBkaXNhYmxlcyBleHBhbmRlZCAodmVydGljYWwpIG91dHB1dC4KKworICAgICAgICBFWFBBTkQgT04KKworICAgICAgICAgIEVuYWJsZXMgZXhwYW5kZWQgKHZlcnRpY2FsKSBvdXRwdXQuCisKKyAgICAgICAgRVhQQU5EIE9GRgorCisgICAgICAgICAgRGlzYWJsZXMgZXhwYW5kZWQgKHZlcnRpY2FsKSBvdXRwdXQuCisKKyAgICAgICAgRVhQQU5ECisKKyAgICAgICAgICBFWFBBTkQgd2l0aCBubyBhcmd1bWVudHMgc2hvd3MgdGhlIGN1cnJlbnQgdmFsdWUgb2YgZXhwYW5kIHNldHRpbmcuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmV4cGFuZF9lbmFibGVkID0gU3dpdGNoQ29tbWFuZCgiRVhQQU5EIiwgIkV4cGFuZGVkIG91dHB1dCIpLmV4ZWN1dGUoc2VsZi5leHBhbmRfZW5hYmxlZCwgcGFyc2VkLCBzZWxmLnByaW50ZXJyKQorCisgICAgZGVmIGRvX2NvbnNpc3RlbmN5KHNlbGYsIHBhcnNlZCk6CisgICAgICAgICIiIgorICAgICAgICBDT05TSVNURU5DWSBbY3Fsc2ggb25seV0KKworICAgICAgICAgICBPdmVycmlkZXMgZGVmYXVsdCBjb25zaXN0ZW5jeSBsZXZlbCAoZGVmYXVsdCBsZXZlbCBpcyBPTkUpLgorCisgICAgICAgIENPTlNJU1RFTkNZIDxsZXZlbD4KKworICAgICAgICAgICBTZXRzIGNvbnNpc3RlbmN5IGxldmVsIGZvciBmdXR1cmUgcmVxdWVzdHMuCisKKyAgICAgICAgICAgVmFsaWQgY29uc2lzdGVuY3kgbGV2ZWxzOgorCisgICAgICAgICAgIEFOWSwgT05FLCBUV08sIFRIUkVFLCBRVU9SVU0sIEFMTCwgTE9DQUxfT05FLCBMT0NBTF9RVU9SVU0sIEVBQ0hfUVVPUlVNLCBTRVJJQUwgYW5kIExPQ0FMX1NFUklBTC4KKworICAgICAgICAgICBTRVJJQUwgYW5kIExPQ0FMX1NFUklBTCBtYXkgYmUgdXNlZCBvbmx5IGZvciBTRUxFQ1RzOyB3aWxsIGJlIHJlamVjdGVkIHdpdGggdXBkYXRlcy4KKworICAgICAgICBDT05TSVNURU5DWQorCisgICAgICAgICAgIENPTlNJU1RFTkNZIHdpdGggbm8gYXJndW1lbnRzIHNob3dzIHRoZSBjdXJyZW50IGNvbnNpc3RlbmN5IGxldmVsLgorICAgICAgICAiIiIKKyAgICAgICAgbGV2ZWwgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ2xldmVsJykKKyAgICAgICAgaWYgbGV2ZWwgaXMgTm9uZToKKyAgICAgICAgICAgIHByaW50KCdDdXJyZW50IGNvbnNpc3RlbmN5IGxldmVsIGlzICVzLicgJSAoY2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwudmFsdWVfdG9fbmFtZVtzZWxmLmNvbnNpc3RlbmN5X2xldmVsXSkpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmNvbnNpc3RlbmN5X2xldmVsID0gY2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwubmFtZV90b192YWx1ZVtsZXZlbC51cHBlcigpXQorICAgICAgICBwcmludCgnQ29uc2lzdGVuY3kgbGV2ZWwgc2V0IHRvICVzLicgJSAobGV2ZWwudXBwZXIoKSwpKQorCisgICAgZGVmIGRvX3NlcmlhbChzZWxmLCBwYXJzZWQpOgorICAgICAgICAiIiIKKyAgICAgICAgU0VSSUFMIENPTlNJU1RFTkNZIFtjcWxzaCBvbmx5XQorCisgICAgICAgICAgIE92ZXJyaWRlcyBzZXJpYWwgY29uc2lzdGVuY3kgbGV2ZWwgKGRlZmF1bHQgbGV2ZWwgaXMgU0VSSUFMKS4KKworICAgICAgICBTRVJJQUwgQ09OU0lTVEVOQ1kgPGxldmVsPgorCisgICAgICAgICAgIFNldHMgY29uc2lzdGVuY3kgbGV2ZWwgZm9yIGZ1dHVyZSBjb25kaXRpb25hbCB1cGRhdGVzLgorCisgICAgICAgICAgIFZhbGlkIGNvbnNpc3RlbmN5IGxldmVsczoKKworICAgICAgICAgICBTRVJJQUwsIExPQ0FMX1NFUklBTC4KKworICAgICAgICBTRVJJQUwgQ09OU0lTVEVOQ1kKKworICAgICAgICAgICBTRVJJQUwgQ09OU0lTVEVOQ1kgd2l0aCBubyBhcmd1bWVudHMgc2hvd3MgdGhlIGN1cnJlbnQgY29uc2lzdGVuY3kgbGV2ZWwuCisgICAgICAgICIiIgorICAgICAgICBsZXZlbCA9IHBhcnNlZC5nZXRfYmluZGluZygnbGV2ZWwnKQorICAgICAgICBpZiBsZXZlbCBpcyBOb25lOgorICAgICAgICAgICAgcHJpbnQoJ0N1cnJlbnQgc2VyaWFsIGNvbnNpc3RlbmN5IGxldmVsIGlzICVzLicgJSAoY2Fzc2FuZHJhLkNvbnNpc3RlbmN5TGV2ZWwudmFsdWVfdG9fbmFtZVtzZWxmLnNlcmlhbF9jb25zaXN0ZW5jeV9sZXZlbF0pKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5zZXJpYWxfY29uc2lzdGVuY3lfbGV2ZWwgPSBjYXNzYW5kcmEuQ29uc2lzdGVuY3lMZXZlbC5uYW1lX3RvX3ZhbHVlW2xldmVsLnVwcGVyKCldCisgICAgICAgIHByaW50KCdTZXJpYWwgY29uc2lzdGVuY3kgbGV2ZWwgc2V0IHRvICVzLicgJSAobGV2ZWwudXBwZXIoKSwpKQorCisgICAgZGVmIGRvX2xvZ2luKHNlbGYsIHBhcnNlZCk6CisgICAgICAgICIiIgorICAgICAgICBMT0dJTiBbY3Fsc2ggb25seV0KKworICAgICAgICAgICBDaGFuZ2VzIGxvZ2luIGluZm9ybWF0aW9uIHdpdGhvdXQgcmVxdWlyaW5nIHJlc3RhcnQuCisKKyAgICAgICAgTE9HSU4gPHVzZXJuYW1lPiAoPHBhc3N3b3JkPikKKworICAgICAgICAgICBMb2dpbiB1c2luZyB0aGUgc3BlY2lmaWVkIHVzZXJuYW1lLiBJZiBwYXNzd29yZCBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdXNlZAorICAgICAgICAgICBvdGhlcndpc2UsIHlvdSB3aWxsIGJlIHByb21wdGVkIHRvIGVudGVyLgorICAgICAgICAiIiIKKyAgICAgICAgdXNlcm5hbWUgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3VzZXJuYW1lJykKKyAgICAgICAgcGFzc3dvcmQgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3Bhc3N3b3JkJykKKyAgICAgICAgaWYgcGFzc3dvcmQgaXMgTm9uZToKKyAgICAgICAgICAgIHBhc3N3b3JkID0gZ2V0cGFzcy5nZXRwYXNzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhc3N3b3JkID0gcGFzc3dvcmRbMTotMV0KKworICAgICAgICBhdXRoX3Byb3ZpZGVyID0gUGxhaW5UZXh0QXV0aFByb3ZpZGVyKHVzZXJuYW1lPXVzZXJuYW1lLCBwYXNzd29yZD1wYXNzd29yZCkKKworICAgICAgICBjb25uID0gQ2x1c3Rlcihjb250YWN0X3BvaW50cz0oc2VsZi5ob3N0bmFtZSwpLCBwb3J0PXNlbGYucG9ydCwgY3FsX3ZlcnNpb249c2VsZi5jb25uLmNxbF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF92ZXJzaW9uPXNlbGYuY29ubi5wcm90b2NvbF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICBhdXRoX3Byb3ZpZGVyPWF1dGhfcHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHNzbF9vcHRpb25zPXNlbGYuY29ubi5zc2xfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9iYWxhbmNpbmdfcG9saWN5PVdoaXRlTGlzdFJvdW5kUm9iaW5Qb2xpY3koW3NlbGYuaG9zdG5hbWVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbF9jb25uZWN0aW9uX3RpbWVvdXQ9c2VsZi5jb25uLmNvbm5lY3RfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF90aW1lb3V0PXNlbGYuY29ubi5jb25uZWN0X3RpbWVvdXQpCisKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50X2tleXNwYWNlOgorICAgICAgICAgICAgc2Vzc2lvbiA9IGNvbm4uY29ubmVjdChzZWxmLmN1cnJlbnRfa2V5c3BhY2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXNzaW9uID0gY29ubi5jb25uZWN0KCkKKworICAgICAgICAjIENvcHkgc2Vzc2lvbiBwcm9wZXJ0aWVzCisgICAgICAgIHNlc3Npb24uZGVmYXVsdF90aW1lb3V0ID0gc2VsZi5zZXNzaW9uLmRlZmF1bHRfdGltZW91dAorICAgICAgICBzZXNzaW9uLnJvd19mYWN0b3J5ID0gc2VsZi5zZXNzaW9uLnJvd19mYWN0b3J5CisgICAgICAgIHNlc3Npb24uZGVmYXVsdF9jb25zaXN0ZW5jeV9sZXZlbCA9IHNlbGYuc2Vzc2lvbi5kZWZhdWx0X2NvbnNpc3RlbmN5X2xldmVsCisgICAgICAgIHNlc3Npb24ubWF4X3RyYWNlX3dhaXQgPSBzZWxmLnNlc3Npb24ubWF4X3RyYWNlX3dhaXQKKworICAgICAgICAjIFVwZGF0ZSBhZnRlciB3ZSd2ZSBjb25uZWN0ZWQgaW4gY2FzZSB3ZSBmYWlsIHRvIGF1dGhlbnRpY2F0ZQorICAgICAgICBzZWxmLmNvbm4gPSBjb25uCisgICAgICAgIHNlbGYuYXV0aF9wcm92aWRlciA9IGF1dGhfcHJvdmlkZXIKKyAgICAgICAgc2VsZi51c2VybmFtZSA9IHVzZXJuYW1lCisgICAgICAgIHNlbGYuc2Vzc2lvbiA9IHNlc3Npb24KKworICAgIGRlZiBkb19leGl0KHNlbGYsIHBhcnNlZD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEVYSVQvUVVJVCBbY3Fsc2ggb25seV0KKworICAgICAgICBFeGl0cyBjcWxzaC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc3RvcCA9IFRydWUKKyAgICAgICAgaWYgc2VsZi5vd25zX2Nvbm5lY3Rpb246CisgICAgICAgICAgICBzZWxmLmNvbm4uc2h1dGRvd24oKQorICAgIGRvX3F1aXQgPSBkb19leGl0CisKKyAgICBkZWYgZG9fY2xlYXIoc2VsZiwgcGFyc2VkKToKKyAgICAgICAgIiIiCisgICAgICAgIENMRUFSL0NMUyBbY3Fsc2ggb25seV0KKworICAgICAgICBDbGVhcnMgdGhlIGNvbnNvbGUuCisgICAgICAgICIiIgorICAgICAgICBzdWJwcm9jZXNzLmNhbGwoJ2NsZWFyJywgc2hlbGw9VHJ1ZSkKKyAgICBkb19jbHMgPSBkb19jbGVhcgorCisgICAgZGVmIGRvX2RlYnVnKHNlbGYsIHBhcnNlZCk6CisgICAgICAgIGltcG9ydCBwZGIKKyAgICAgICAgcGRiLnNldF90cmFjZSgpCisKKyAgICBkZWYgZ2V0X2hlbHBfdG9waWNzKHNlbGYpOgorICAgICAgICB0b3BpY3MgPSBbdFszOl0gZm9yIHQgaW4gZGlyKHNlbGYpIGlmIHQuc3RhcnRzd2l0aCgnZG9fJykgYW5kIGdldGF0dHIoc2VsZiwgdCwgTm9uZSkuX19kb2NfX10KKyAgICAgICAgZm9yIGhpZGVfZnJvbV9oZWxwIGluICgncXVpdCcsKToKKyAgICAgICAgICAgIHRvcGljcy5yZW1vdmUoaGlkZV9mcm9tX2hlbHApCisgICAgICAgIHJldHVybiB0b3BpY3MKKworICAgIGRlZiBjb2x1bW5pemUoc2VsZiwgc2xpc3QsICphLCAqKmt3KToKKyAgICAgICAgcmV0dXJuIGNtZC5DbWQuY29sdW1uaXplKHNlbGYsIHNvcnRlZChbdS51cHBlcigpIGZvciB1IGluIHNsaXN0XSksICphLCAqKmt3KQorCisgICAgZGVmIGRvX2hlbHAoc2VsZiwgcGFyc2VkKToKKyAgICAgICAgIiIiCisgICAgICAgIEhFTFAgW2NxbHNoIG9ubHldCisKKyAgICAgICAgR2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgY3Fsc2ggY29tbWFuZHMuIFRvIHNlZSBhdmFpbGFibGUgdG9waWNzLAorICAgICAgICBlbnRlciAiSEVMUCIgd2l0aG91dCBhbnkgYXJndW1lbnRzLiBUbyBzZWUgaGVscCBvbiBhIHRvcGljLAorICAgICAgICB1c2UgIkhFTFAgPHRvcGljPiIuCisgICAgICAgICIiIgorICAgICAgICB0b3BpY3MgPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3RvcGljJywgKCkpCisgICAgICAgIGlmIG5vdCB0b3BpY3M6CisgICAgICAgICAgICBzaGVsbF90b3BpY3MgPSBbdC51cHBlcigpIGZvciB0IGluIHNlbGYuZ2V0X2hlbHBfdG9waWNzKCldCisgICAgICAgICAgICBzZWxmLnByaW50X3RvcGljcygiXG5Eb2N1bWVudGVkIHNoZWxsIGNvbW1hbmRzOiIsIHNoZWxsX3RvcGljcywgMTUsIDgwKQorICAgICAgICAgICAgY3FsX3RvcGljcyA9IFt0LnVwcGVyKCkgZm9yIHQgaW4gY3FsZG9jcy5nZXRfaGVscF90b3BpY3MoKV0KKyAgICAgICAgICAgIHNlbGYucHJpbnRfdG9waWNzKCJDUUwgaGVscCB0b3BpY3M6IiwgY3FsX3RvcGljcywgMTUsIDgwKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZvciB0IGluIHRvcGljczoKKyAgICAgICAgICAgIGlmIHQubG93ZXIoKSBpbiBzZWxmLmdldF9oZWxwX3RvcGljcygpOgorICAgICAgICAgICAgICAgIGRvYyA9IGdldGF0dHIoc2VsZiwgJ2RvXycgKyB0Lmxvd2VyKCkpLl9fZG9jX18KKyAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC53cml0ZShkb2MgKyAiXG4iKQorICAgICAgICAgICAgZWxpZiB0Lmxvd2VyKCkgaW4gY3FsZG9jcy5nZXRfaGVscF90b3BpY3MoKToKKyAgICAgICAgICAgICAgICB1cmxwYXJ0ID0gY3FsZG9jcy5nZXRfaGVscF90b3BpYyh0KQorICAgICAgICAgICAgICAgIGlmIHVybHBhcnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHVybCA9ICIlcyMlcyIgJSAoQ0FTU0FORFJBX0NRTF9IVE1MLCB1cmxwYXJ0KQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmJyb3dzZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWQgPSB3ZWJicm93c2VyLmdldChzZWxmLmJyb3dzZXIpLm9wZW5fbmV3X3RhYih1cmwpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWQgPSB3ZWJicm93c2VyLm9wZW5fbmV3X3RhYih1cmwpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvcGVuZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByaW50ZXJyKCIqKiogTm8gYnJvd3NlciB0byBkaXNwbGF5IENRTCBoZWxwLiBVUkwgZm9yIGhlbHAgdG9waWMgJXMgOiAlcyIgJSAodCwgdXJsKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5wcmludGVycigiKioqIE5vIGhlbHAgb24gJXMiICUgKHQsKSkKKworICAgIGRlZiBkb19oaXN0b3J5KHNlbGYsIHBhcnNlZCk6CisgICAgICAgICIiIgorICAgICAgICBISVNUT1JZIFtjcWxzaCBvbmx5XQorCisgICAgICAgICAgIERpc3BsYXlzIHRoZSBtb3N0IHJlY2VudCBjb21tYW5kcyBleGVjdXRlZCBpbiBjcWxzaAorCisgICAgICAgIEhJU1RPUlkgKDxuPikKKworICAgICAgICAgICBJZiBuIGlzIHNwZWNpZmllZCwgdGhlIGhpc3RvcnkgZGlzcGxheSBsZW5ndGggaXMgc2V0IHRvIG4gZm9yIHRoaXMgc2Vzc2lvbgorICAgICAgICAiIiIKKworICAgICAgICBoaXN0b3J5X2xlbmd0aCA9IHJlYWRsaW5lLmdldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoKCkKKworICAgICAgICBuID0gcGFyc2VkLmdldF9iaW5kaW5nKCduJykKKyAgICAgICAgaWYgKG4gaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgc2VsZi5tYXhfaGlzdG9yeV9sZW5ndGhfc2hvd24gPSBpbnQobikKKworICAgICAgICBmb3IgaW5kZXggaW4gcmFuZ2UobWF4KDEsIGhpc3RvcnlfbGVuZ3RoIC0gc2VsZi5tYXhfaGlzdG9yeV9sZW5ndGhfc2hvd24pLCBoaXN0b3J5X2xlbmd0aCk6CisgICAgICAgICAgICBwcmludChyZWFkbGluZS5nZXRfaGlzdG9yeV9pdGVtKGluZGV4KSkKKworICAgIGRlZiBkb191bmljb2RlKHNlbGYsIHBhcnNlZCk6CisgICAgICAgICIiIgorICAgICAgICBUZXh0dWFsIGlucHV0L291dHB1dAorCisgICAgICAgIFdoZW4gY29udHJvbCBjaGFyYWN0ZXJzLCBvciBvdGhlciBjaGFyYWN0ZXJzIHdoaWNoIGNhbid0IGJlIGVuY29kZWQKKyAgICAgICAgaW4geW91ciBjdXJyZW50IGxvY2FsZSwgYXJlIGZvdW5kIGluIHZhbHVlcyBvZiAndGV4dCcgb3IgJ2FzY2lpJworICAgICAgICB0eXBlcywgaXQgd2lsbCBiZSBzaG93biBhcyBhIGJhY2tzbGFzaCBlc2NhcGUuIElmIGNvbG9yIGlzIGVuYWJsZWQsCisgICAgICAgIGFueSBzdWNoIGJhY2tzbGFzaCBlc2NhcGVzIHdpbGwgYmUgc2hvd24gaW4gYSBkaWZmZXJlbnQgY29sb3IgZnJvbQorICAgICAgICB0aGUgc3Vycm91bmRpbmcgdGV4dC4KKworICAgICAgICBVbmljb2RlIGNvZGUgcG9pbnRzIGluIHlvdXIgZGF0YSB3aWxsIGJlIG91dHB1dCBpbnRhY3QsIGlmIHRoZQorICAgICAgICBlbmNvZGluZyBmb3IgeW91ciBsb2NhbGUgaXMgY2FwYWJsZSBvZiBkZWNvZGluZyB0aGVtLiBJZiB5b3UgcHJlZmVyCisgICAgICAgIHRoYXQgbm9uLWFzY2lpIGNoYXJhY3RlcnMgYmUgc2hvd24gd2l0aCBQeXRob24tc3R5bGUgIlxcdUFCQ0QiCisgICAgICAgIGVzY2FwZSBzZXF1ZW5jZXMsIGludm9rZSBjcWxzaCB3aXRoIGFuIEFTQ0lJIGxvY2FsZSAoZm9yIGV4YW1wbGUsCisgICAgICAgIGJ5IHNldHRpbmcgdGhlICRMQU5HIGVudmlyb25tZW50IHZhcmlhYmxlIHRvICJDIikuCisgICAgICAgICIiIgorCisgICAgZGVmIGRvX3BhZ2luZyhzZWxmLCBwYXJzZWQpOgorICAgICAgICAiIiIKKyAgICAgICAgUEFHSU5HIFtjcWxzaF0KKworICAgICAgICAgIEVuYWJsZXMgb3IgZGlzYWJsZXMgcXVlcnkgcGFnaW5nLgorCisgICAgICAgIFBBR0lORyBPTgorCisgICAgICAgICAgRW5hYmxlcyBxdWVyeSBwYWdpbmcgZm9yIGFsbCBmdXJ0aGVyIHF1ZXJpZXMuCisKKyAgICAgICAgUEFHSU5HIE9GRgorCisgICAgICAgICAgRGlzYWJsZXMgcGFnaW5nLgorCisgICAgICAgIFBBR0lORworCisgICAgICAgICAgUEFHSU5HIHdpdGggbm8gYXJndW1lbnRzIHNob3dzIHRoZSBjdXJyZW50IHF1ZXJ5IHBhZ2luZyBzdGF0dXMuCisgICAgICAgICIiIgorICAgICAgICAoc2VsZi51c2VfcGFnaW5nLCByZXF1ZXN0ZWRfcGFnZV9zaXplKSA9IFN3aXRjaENvbW1hbmRXaXRoVmFsdWUoCisgICAgICAgICAgICAiUEFHSU5HIiwgIlF1ZXJ5IHBhZ2luZyIsIHZhbHVlX3R5cGU9aW50KS5leGVjdXRlKHNlbGYudXNlX3BhZ2luZywgcGFyc2VkLCBzZWxmLnByaW50ZXJyKQorICAgICAgICBpZiBzZWxmLnVzZV9wYWdpbmcgYW5kIHJlcXVlc3RlZF9wYWdlX3NpemUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnBhZ2Vfc2l6ZSA9IHJlcXVlc3RlZF9wYWdlX3NpemUKKyAgICAgICAgaWYgc2VsZi51c2VfcGFnaW5nOgorICAgICAgICAgICAgcHJpbnQoKCJQYWdlIHNpemU6IHt9Ii5mb3JtYXQoc2VsZi5wYWdlX3NpemUpKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucGFnZV9zaXplID0gc2VsZi5kZWZhdWx0X3BhZ2Vfc2l6ZQorCisgICAgZGVmIGFwcGx5Y29sb3Ioc2VsZiwgdGV4dCwgY29sb3I9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBjb2xvciBvciBub3Qgc2VsZi5jb2xvcjoKKyAgICAgICAgICAgIHJldHVybiB0ZXh0CisgICAgICAgIHJldHVybiBjb2xvciArIHRleHQgKyBBTlNJX1JFU0VUCisKKyAgICBkZWYgd3JpdGVyZXN1bHQoc2VsZiwgdGV4dCwgY29sb3I9Tm9uZSwgbmV3bGluZT1UcnVlLCBvdXQ9Tm9uZSk6CisgICAgICAgIGlmIG91dCBpcyBOb25lOgorICAgICAgICAgICAgb3V0ID0gc2VsZi5xdWVyeV9vdXQKKworICAgICAgICAjIGNvbnZlcnQgRXhjZXB0aW9ucywgZXRjIHRvIHRleHQKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodGV4dCwgc3RyKToKKyAgICAgICAgICAgIHRleHQgPSBzdHIodGV4dCkKKworICAgICAgICB0b193cml0ZSA9IHNlbGYuYXBwbHljb2xvcih0ZXh0LCBjb2xvcikgKyAoJ1xuJyBpZiBuZXdsaW5lIGVsc2UgJycpCisgICAgICAgIG91dC53cml0ZSh0b193cml0ZSkKKworICAgIGRlZiBmbHVzaF9vdXRwdXQoc2VsZik6CisgICAgICAgIHNlbGYucXVlcnlfb3V0LmZsdXNoKCkKKworICAgIGRlZiBwcmludGVycihzZWxmLCB0ZXh0LCBjb2xvcj1SRUQsIG5ld2xpbmU9VHJ1ZSwgc2hvd251bT1Ob25lKToKKyAgICAgICAgc2VsZi5zdGF0ZW1lbnRfZXJyb3IgPSBUcnVlCisgICAgICAgIGlmIHNob3dudW0gaXMgTm9uZToKKyAgICAgICAgICAgIHNob3dudW0gPSBzZWxmLnNob3dfbGluZV9udW1zCisgICAgICAgIGlmIHNob3dudW06CisgICAgICAgICAgICB0ZXh0ID0gJyVzOiVkOiVzJyAlIChzZWxmLnN0ZGluLm5hbWUsIHNlbGYubGluZW5vLCB0ZXh0KQorICAgICAgICBzZWxmLndyaXRlcmVzdWx0KHRleHQsIGNvbG9yLCBuZXdsaW5lPW5ld2xpbmUsIG91dD1zeXMuc3RkZXJyKQorCisgICAgZGVmIHN0b3BfY292ZXJhZ2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY292ZXJhZ2UgYW5kIHNlbGYuY292IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jb3Yuc3RvcCgpCisgICAgICAgICAgICBzZWxmLmNvdi5zYXZlKCkKKyAgICAgICAgICAgIHNlbGYuY292ID0gTm9uZQorCisgICAgZGVmIGluaXRfaGlzdG9yeShzZWxmKToKKyAgICAgICAgaWYgcmVhZGxpbmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVhZGxpbmUucmVhZF9oaXN0b3J5X2ZpbGUoSElTVE9SWSkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlbGltcyA9IHJlYWRsaW5lLmdldF9jb21wbGV0ZXJfZGVsaW1zKCkKKyAgICAgICAgICAgIGRlbGltcy5yZXBsYWNlKCInIiwgIiIpCisgICAgICAgICAgICBkZWxpbXMgKz0gJy4nCisgICAgICAgICAgICByZWFkbGluZS5zZXRfY29tcGxldGVyX2RlbGltcyhkZWxpbXMpCisKKyAgICAgICAgICAgICMgY29uZmlndXJlIGxlbmd0aCBvZiBoaXN0b3J5IHNob3duCisgICAgICAgICAgICBzZWxmLm1heF9oaXN0b3J5X2xlbmd0aF9zaG93biA9IDUwCisKKyAgICBkZWYgc2F2ZV9oaXN0b3J5KHNlbGYpOgorICAgICAgICBpZiByZWFkbGluZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZWFkbGluZS53cml0ZV9oaXN0b3J5X2ZpbGUoSElTVE9SWSkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworCitjbGFzcyBTd2l0Y2hDb21tYW5kKG9iamVjdCk6CisgICAgY29tbWFuZCA9IE5vbmUKKyAgICBkZXNjcmlwdGlvbiA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21tYW5kLCBkZXNjKToKKyAgICAgICAgc2VsZi5jb21tYW5kID0gY29tbWFuZAorICAgICAgICBzZWxmLmRlc2NyaXB0aW9uID0gZGVzYworCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgc3RhdGUsIHBhcnNlZCwgcHJpbnRlcnIpOgorICAgICAgICBzd2l0Y2ggPSBwYXJzZWQuZ2V0X2JpbmRpbmcoJ3N3aXRjaCcpCisgICAgICAgIGlmIHN3aXRjaCBpcyBOb25lOgorICAgICAgICAgICAgaWYgc3RhdGU6CisgICAgICAgICAgICAgICAgcHJpbnQoIiVzIGlzIGN1cnJlbnRseSBlbmFibGVkLiBVc2UgJXMgT0ZGIHRvIGRpc2FibGUiCisgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5kZXNjcmlwdGlvbiwgc2VsZi5jb21tYW5kKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQoIiVzIGlzIGN1cnJlbnRseSBkaXNhYmxlZC4gVXNlICVzIE9OIHRvIGVuYWJsZS4iCisgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5kZXNjcmlwdGlvbiwgc2VsZi5jb21tYW5kKSkKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZQorCisgICAgICAgIGlmIHN3aXRjaC51cHBlcigpID09ICdPTic6CisgICAgICAgICAgICBpZiBzdGF0ZToKKyAgICAgICAgICAgICAgICBwcmludGVycignJXMgaXMgYWxyZWFkeSBlbmFibGVkLiBVc2UgJXMgT0ZGIHRvIGRpc2FibGUuJworICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlbGYuZGVzY3JpcHRpb24sIHNlbGYuY29tbWFuZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlCisgICAgICAgICAgICBwcmludCgnTm93ICVzIGlzIGVuYWJsZWQnICUgKHNlbGYuZGVzY3JpcHRpb24sKSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgaWYgc3dpdGNoLnVwcGVyKCkgPT0gJ09GRic6CisgICAgICAgICAgICBpZiBub3Qgc3RhdGU6CisgICAgICAgICAgICAgICAgcHJpbnRlcnIoJyVzIGlzIG5vdCBlbmFibGVkLicgJSAoc2VsZi5kZXNjcmlwdGlvbiwpKQorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZQorICAgICAgICAgICAgcHJpbnQoJ0Rpc2FibGVkICVzLicgJSAoc2VsZi5kZXNjcmlwdGlvbiwpKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgU3dpdGNoQ29tbWFuZFdpdGhWYWx1ZShTd2l0Y2hDb21tYW5kKToKKyAgICAiIiJUaGUgc2FtZSBhcyBTd2l0Y2hDb21tYW5kIGV4Y2VwdCBpdCBhbHNvIGFjY2VwdHMgYSB2YWx1ZSBpbiBwbGFjZSBvZiBPTi4KKworICAgIFRoaXMgcmV0dXJucyBhIHR1cGxlIG9mIHRoZSBmb3JtOiAoU1dJVENIX1ZBTFVFLCBQQVNTRURfVkFMVUUpCisgICAgZWc6IFBBR0lORyA1MCByZXR1cm5zIChUcnVlLCA1MCkKKyAgICAgICAgUEFHSU5HIE9GRiByZXR1cm5zIChGYWxzZSwgTm9uZSkKKyAgICAgICAgUEFHSU5HIE9OIHJldHVybnMgKFRydWUsIE5vbmUpCisKKyAgICBUaGUgdmFsdWVfdHlwZSBtdXN0IG1hdGNoIGZvciB0aGUgUEFTU0VEX1ZBTFVFLCBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gTm9uZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29tbWFuZCwgZGVzYywgdmFsdWVfdHlwZT1pbnQpOgorICAgICAgICBTd2l0Y2hDb21tYW5kLl9faW5pdF9fKHNlbGYsIGNvbW1hbmQsIGRlc2MpCisgICAgICAgIHNlbGYudmFsdWVfdHlwZSA9IHZhbHVlX3R5cGUKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIHN0YXRlLCBwYXJzZWQsIHByaW50ZXJyKToKKyAgICAgICAgYmluYXJ5X3N3aXRjaF92YWx1ZSA9IFN3aXRjaENvbW1hbmQuZXhlY3V0ZShzZWxmLCBzdGF0ZSwgcGFyc2VkLCBwcmludGVycikKKyAgICAgICAgc3dpdGNoID0gcGFyc2VkLmdldF9iaW5kaW5nKCdzd2l0Y2gnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYudmFsdWVfdHlwZShzd2l0Y2gpCisgICAgICAgICAgICBiaW5hcnlfc3dpdGNoX3ZhbHVlID0gVHJ1ZQorICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAgICAgICB2YWx1ZSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIGJpbmFyeV9zd2l0Y2hfdmFsdWUsIHZhbHVlCisKKworZGVmIG9wdGlvbl93aXRoX2RlZmF1bHQoY3BhcnNlcl9nZXR0ZXIsIHNlY3Rpb24sIG9wdGlvbiwgZGVmYXVsdD1Ob25lKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBjcGFyc2VyX2dldHRlcihzZWN0aW9uLCBvcHRpb24pCisgICAgZXhjZXB0IGNvbmZpZ3BhcnNlci5FcnJvcjoKKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKworCitkZWYgcmF3X29wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncywgc2VjdGlvbiwgb3B0aW9uLCBkZWZhdWx0PU5vbmUpOgorICAgICIiIgorICAgIFNhbWUgKGFsbW9zdCkgYXMgb3B0aW9uX3dpdGhfZGVmYXVsdCgpIGJ1dCB3b24ndCBkbyBhbnkgc3RyaW5nIGludGVycG9sYXRpb24uCisgICAgVXNlZnVsIGZvciBjb25maWcgdmFsdWVzIHRoYXQgaW5jbHVkZSAnJScgc3ltYm9sLCBlLmcuIHRpbWUgZm9ybWF0IHN0cmluZy4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBjb25maWdzLmdldChzZWN0aW9uLCBvcHRpb24sIHJhdz1UcnVlKQorICAgIGV4Y2VwdCBjb25maWdwYXJzZXIuRXJyb3I6CisgICAgICAgIHJldHVybiBkZWZhdWx0CisKKworZGVmIHNob3VsZF91c2VfY29sb3IoKToKKyAgICBpZiBub3Qgc3lzLnN0ZG91dC5pc2F0dHkoKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgb3MuZW52aXJvbi5nZXQoJ1RFUk0nLCAnJykgaW4gKCdkdW1iJywgJycpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICB0cnk6CisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsndHB1dCcsICdjb2xvcnMnXSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc3Rkb3V0LCBfID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIGlmIGludChzdGRvdXQuc3RyaXAoKSkgPCA4OgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZXhjZXB0IChPU0Vycm9yLCBJbXBvcnRFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICMgb2ggd2VsbCwgd2UgdHJpZWQuIGF0IGxlYXN0IHdlIGtub3cgdGhlcmUncyBhICRURVJNIGFuZCBpdCdzCisgICAgICAgICMgbm90ICJkdW1iIi4KKyAgICAgICAgcGFzcworICAgIHJldHVybiBUcnVlCisKKworZGVmIHJlYWRfb3B0aW9ucyhjbWRsaW5lYXJncywgZW52aXJvbm1lbnQ9b3MuZW52aXJvbik6CisgICAgY29uZmlncyA9IGNvbmZpZ3BhcnNlci5Db25maWdQYXJzZXIoKQorICAgIGNvbmZpZ3MucmVhZChDT05GSUdfRklMRSkKKworICAgIHJhd2NvbmZpZ3MgPSBjb25maWdwYXJzZXIuUmF3Q29uZmlnUGFyc2VyKCkKKyAgICByYXdjb25maWdzLnJlYWQoQ09ORklHX0ZJTEUpCisKKyAgICB1c2VybmFtZV9mcm9tX2NxbHNocmMgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAnYXV0aGVudGljYXRpb24nLCAndXNlcm5hbWUnKQorICAgIHBhc3N3b3JkX2Zyb21fY3Fsc2hyYyA9IG9wdGlvbl93aXRoX2RlZmF1bHQocmF3Y29uZmlncy5nZXQsICdhdXRoZW50aWNhdGlvbicsICdwYXNzd29yZCcpCisgICAgaWYgdXNlcm5hbWVfZnJvbV9jcWxzaHJjIG9yIHBhc3N3b3JkX2Zyb21fY3Fsc2hyYzoKKyAgICAgICAgaWYgcGFzc3dvcmRfZnJvbV9jcWxzaHJjIGFuZCBub3QgaXNfZmlsZV9zZWN1cmUob3MucGF0aC5leHBhbmR1c2VyKENPTkZJR19GSUxFKSk6CisgICAgICAgICAgICBwcmludCgiXG5XYXJuaW5nOiBQYXNzd29yZCBpcyBmb3VuZCBpbiBhbiBpbnNlY3VyZSBjcWxzaHJjIGZpbGUuIFRoZSBmaWxlIGlzIG93bmVkIG9yIHJlYWRhYmxlIGJ5IG90aGVyIHVzZXJzIG9uIHRoZSBzeXN0ZW0uIiwKKyAgICAgICAgICAgICAgICAgIGVuZD0nJywgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBwcmludCgiXG5Ob3RpY2U6IENyZWRlbnRpYWxzIGluIHRoZSBjcWxzaHJjIGZpbGUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkIGluIHRoZSBmdXR1cmUuIgorICAgICAgICAgICAgICAiXG5QbGVhc2UgdXNlIGEgY3JlZGVudGlhbHMgZmlsZSB0byBzcGVjaWZ5IHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQuXG4iLCBmaWxlPXN5cy5zdGRlcnIpCisKKyAgICBvcHR2YWx1ZXMgPSBvcHRwYXJzZS5WYWx1ZXMoKQorCisgICAgb3B0dmFsdWVzLnVzZXJuYW1lID0gTm9uZQorICAgIG9wdHZhbHVlcy5wYXNzd29yZCA9IE5vbmUKKyAgICBvcHR2YWx1ZXMuY3JlZGVudGlhbHMgPSBvcy5wYXRoLmV4cGFuZHVzZXIob3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldCwgJ2F1dGhlbnRpY2F0aW9uJywgJ2NyZWRlbnRpYWxzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oQ1FMX0RJUiwgJ2NyZWRlbnRpYWxzJykpKQorICAgIG9wdHZhbHVlcy5rZXlzcGFjZSA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXQsICdhdXRoZW50aWNhdGlvbicsICdrZXlzcGFjZScpCisgICAgb3B0dmFsdWVzLmJyb3dzZXIgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAndWknLCAnYnJvd3NlcicsIE5vbmUpCisgICAgb3B0dmFsdWVzLmNvbXBsZXRla2V5ID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldCwgJ3VpJywgJ2NvbXBsZXRla2V5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQ09NUExFVEVLRVkpCisgICAgb3B0dmFsdWVzLmNvbG9yID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldGJvb2xlYW4sICd1aScsICdjb2xvcicpCisgICAgb3B0dmFsdWVzLnRpbWVfZm9ybWF0ID0gcmF3X29wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncywgJ3VpJywgJ3RpbWVfZm9ybWF0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1RJTUVTVEFNUF9GT1JNQVQpCisgICAgb3B0dmFsdWVzLm5hbm90aW1lX2Zvcm1hdCA9IHJhd19vcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MsICd1aScsICduYW5vdGltZV9mb3JtYXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX05BTk9USU1FX0ZPUk1BVCkKKyAgICBvcHR2YWx1ZXMuZGF0ZV9mb3JtYXQgPSByYXdfb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLCAndWknLCAnZGF0ZV9mb3JtYXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfREFURV9GT1JNQVQpCisgICAgb3B0dmFsdWVzLmZsb2F0X3ByZWNpc2lvbiA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRpbnQsICd1aScsICdmbG9hdF9wcmVjaXNpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfRkxPQVRfUFJFQ0lTSU9OKQorICAgIG9wdHZhbHVlcy5kb3VibGVfcHJlY2lzaW9uID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldGludCwgJ3VpJywgJ2RvdWJsZV9wcmVjaXNpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0RPVUJMRV9QUkVDSVNJT04pCisgICAgb3B0dmFsdWVzLmZpZWxkX3NpemVfbGltaXQgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0aW50LCAnY3N2JywgJ2ZpZWxkX3NpemVfbGltaXQnLCBjc3YuZmllbGRfc2l6ZV9saW1pdCgpKQorICAgIG9wdHZhbHVlcy5tYXhfdHJhY2Vfd2FpdCA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRmbG9hdCwgJ3RyYWNpbmcnLCAnbWF4X3RyYWNlX3dhaXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9NQVhfVFJBQ0VfV0FJVCkKKyAgICBvcHR2YWx1ZXMudGltZXpvbmUgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAndWknLCAndGltZXpvbmUnLCBOb25lKQorCisgICAgb3B0dmFsdWVzLmRlYnVnID0gRmFsc2UKKworICAgIG9wdHZhbHVlcy5jb3ZlcmFnZSA9IEZhbHNlCisgICAgaWYgJ0NRTFNIX0NPVkVSQUdFJyBpbiBlbnZpcm9ubWVudC5rZXlzKCk6CisgICAgICAgIG9wdHZhbHVlcy5jb3ZlcmFnZSA9IFRydWUKKworICAgIG9wdHZhbHVlcy5maWxlID0gTm9uZQorICAgIG9wdHZhbHVlcy5zc2wgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0Ym9vbGVhbiwgJ2Nvbm5lY3Rpb24nLCAnc3NsJywgREVGQVVMVF9TU0wpCisgICAgb3B0dmFsdWVzLmVuY29kaW5nID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldCwgJ3VpJywgJ2VuY29kaW5nJywgVVRGOCkKKworICAgIG9wdHZhbHVlcy50dHkgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0Ym9vbGVhbiwgJ3VpJywgJ3R0eScsIHN5cy5zdGRpbi5pc2F0dHkoKSkKKyAgICBvcHR2YWx1ZXMucHJvdG9jb2xfdmVyc2lvbiA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRpbnQsICdwcm90b2NvbCcsICd2ZXJzaW9uJywgTm9uZSkKKyAgICBvcHR2YWx1ZXMuY3FsdmVyc2lvbiA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXQsICdjcWwnLCAndmVyc2lvbicsIE5vbmUpCisgICAgb3B0dmFsdWVzLmNvbm5lY3RfdGltZW91dCA9IG9wdGlvbl93aXRoX2RlZmF1bHQoY29uZmlncy5nZXRpbnQsICdjb25uZWN0aW9uJywgJ3RpbWVvdXQnLCBERUZBVUxUX0NPTk5FQ1RfVElNRU9VVF9TRUNPTkRTKQorICAgIG9wdHZhbHVlcy5yZXF1ZXN0X3RpbWVvdXQgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0aW50LCAnY29ubmVjdGlvbicsICdyZXF1ZXN0X3RpbWVvdXQnLCBERUZBVUxUX1JFUVVFU1RfVElNRU9VVF9TRUNPTkRTKQorICAgIG9wdHZhbHVlcy5leGVjdXRlID0gTm9uZQorICAgIG9wdHZhbHVlcy5pbnNlY3VyZV9wYXNzd29yZF93aXRob3V0X3dhcm5pbmcgPSBGYWxzZQorCisgICAgKG9wdGlvbnMsIGFyZ3VtZW50cykgPSBwYXJzZXIucGFyc2VfYXJncyhjbWRsaW5lYXJncywgdmFsdWVzPW9wdHZhbHVlcykKKworICAgICMgQ3JlZGVudGlhbHMgZnJvbSBjcWxzaHJjIHdpbGwgYmUgZXhwYW5kZWQsCisgICAgIyBjcmVkZW50aWFscyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYXJlIGFsc28gZXhwYW5kZWQgaWYgdGhlcmUgaXMgYSBzcGFjZS4uLgorICAgICMgd2UgbmVlZCB0aGUgZm9sbG93aW5nIHNvIHRoYXQgdGhlc2UgdHdvIHNjZW5hcmlvcyB3aWxsIHdvcmsKKyAgICAjICAgY3Fsc2ggLS1jcmVkZW50aWFscz1+Ly5jYXNzYW5kcmEvY3JlZHMKKyAgICAjICAgY3Fsc2ggLS1jcmVkZW50aWFscyB+Ly5jYXNzYW5kcmEvY3JlZHMKKyAgICBvcHRpb25zLmNyZWRlbnRpYWxzID0gb3MucGF0aC5leHBhbmR1c2VyKG9wdGlvbnMuY3JlZGVudGlhbHMpCisKKyAgICBpZiBub3QgaXNfZmlsZV9zZWN1cmUob3B0aW9ucy5jcmVkZW50aWFscyk6CisgICAgICAgIHByaW50KCJcbldhcm5pbmc6IENyZWRlbnRpYWxzIGZpbGUgJ3swfScgZXhpc3RzIGJ1dCBpcyBub3QgdXNlZCwgYmVjYXVzZToiCisgICAgICAgICAgICAgICJcbiAgYS4gdGhlIGZpbGUgb3duZXIgaXMgbm90IHRoZSBjdXJyZW50IHVzZXI7IG9yIgorICAgICAgICAgICAgICAiXG4gIGIuIHRoZSBmaWxlIGlzIHJlYWRhYmxlIGJ5IGdyb3VwIG9yIG90aGVyLiIKKyAgICAgICAgICAgICAgIlxuUGxlYXNlIGVuc3VyZSB0aGUgZmlsZSBpcyBvd25lZCBieSB0aGUgY3VycmVudCB1c2VyIGFuZCBpcyBub3QgcmVhZGFibGUgYnkgZ3JvdXAgb3Igb3RoZXIuIgorICAgICAgICAgICAgICAiXG5PbiBhIExpbnV4IG9yIFVOSVgtbGlrZSBzeXN0ZW0sIHlvdSBvZnRlbiBjYW4gZG8gdGhpcyBieSB1c2luZyB0aGUgYGNob3duYCBhbmQgYGNobW9kYCBjb21tYW5kczoiCisgICAgICAgICAgICAgICJcbiAgY2hvd24gWU9VUl9VU0VSTkFNRSBjcmVkZW50aWFscyIKKyAgICAgICAgICAgICAgIlxuICBjaG1vZCA2MDAgY3JlZGVudGlhbHNcbiIuZm9ybWF0KG9wdGlvbnMuY3JlZGVudGlhbHMpLAorICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgIG9wdGlvbnMuY3JlZGVudGlhbHMgPSAnJyAgIyBDb25maWdQYXJzZXIucmVhZCgpIHdpbGwgaWdub3JlIHVucmVhZGFibGUgZmlsZXMKKworICAgIGlmIG5vdCBvcHRpb25zLnVzZXJuYW1lOgorICAgICAgICBjcmVkZW50aWFscyA9IGNvbmZpZ3BhcnNlci5Db25maWdQYXJzZXIoKQorICAgICAgICBjcmVkZW50aWFscy5yZWFkKG9wdGlvbnMuY3JlZGVudGlhbHMpCisKKyAgICAgICAgIyB1c2UgdGhlIHVzZXJuYW1lIGZyb20gY3JlZGVudGlhbHMgZmlsZSBidXQgZmFsbGJhY2sgdG8gY3Fsc2hyYyBpZiB1c2VybmFtZSBpcyBhYnNlbnQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMKKyAgICAgICAgb3B0aW9ucy51c2VybmFtZSA9IHVzZXJuYW1lX2Zyb21fY3Fsc2hyYworCisgICAgaWYgbm90IG9wdGlvbnMucGFzc3dvcmQ6CisgICAgICAgIHJhd2NyZWRlbnRpYWxzID0gY29uZmlncGFyc2VyLlJhd0NvbmZpZ1BhcnNlcigpCisgICAgICAgIHJhd2NyZWRlbnRpYWxzLnJlYWQob3B0aW9ucy5jcmVkZW50aWFscykKKworICAgICAgICAjIGhhbmRsaW5nIHBhc3N3b3JkIGluIHRoZSBzYW1lIHdheSBhcyB1c2VybmFtZSwgcHJpb3JpdHkgY2xpID4gY3JlZGVudGlhbHMgPiBjcWxzaHJjCisgICAgICAgIG9wdGlvbnMucGFzc3dvcmQgPSBvcHRpb25fd2l0aF9kZWZhdWx0KHJhd2NyZWRlbnRpYWxzLmdldCwgJ3BsYWluX3RleHRfYXV0aCcsICdwYXNzd29yZCcsIHBhc3N3b3JkX2Zyb21fY3Fsc2hyYykKKyAgICAgICAgb3B0aW9ucy5wYXNzd29yZCA9IHBhc3N3b3JkX2Zyb21fY3Fsc2hyYworICAgIGVsaWYgbm90IG9wdGlvbnMuaW5zZWN1cmVfcGFzc3dvcmRfd2l0aG91dF93YXJuaW5nOgorICAgICAgICBwcmludCgiXG5XYXJuaW5nOiBVc2luZyBhIHBhc3N3b3JkIG9uIHRoZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIGNhbiBiZSBpbnNlY3VyZS4iCisgICAgICAgICAgICAgICJcblJlY29tbWVuZGF0aW9uOiB1c2UgdGhlIGNyZWRlbnRpYWxzIGZpbGUgdG8gc2VjdXJlbHkgcHJvdmlkZSB0aGUgcGFzc3dvcmQuXG4iLCBmaWxlPXN5cy5zdGRlcnIpCisKKyAgICAjIE1ha2Ugc3VyZSBzb21lIHVzZXIgdmFsdWVzIHJlYWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFyZSBpbiB1bmljb2RlCisgICAgb3B0aW9ucy5leGVjdXRlID0gbWF5YmVfZW5zdXJlX3RleHQob3B0aW9ucy5leGVjdXRlKQorICAgIG9wdGlvbnMudXNlcm5hbWUgPSBtYXliZV9lbnN1cmVfdGV4dChvcHRpb25zLnVzZXJuYW1lKQorICAgIG9wdGlvbnMucGFzc3dvcmQgPSBtYXliZV9lbnN1cmVfdGV4dChvcHRpb25zLnBhc3N3b3JkKQorICAgIG9wdGlvbnMua2V5c3BhY2UgPSBtYXliZV9lbnN1cmVfdGV4dChvcHRpb25zLmtleXNwYWNlKQorCisgICAgaG9zdG5hbWUgPSBvcHRpb25fd2l0aF9kZWZhdWx0KGNvbmZpZ3MuZ2V0LCAnY29ubmVjdGlvbicsICdob3N0bmFtZScsIERFRkFVTFRfSE9TVCkKKyAgICBwb3J0ID0gb3B0aW9uX3dpdGhfZGVmYXVsdChjb25maWdzLmdldCwgJ2Nvbm5lY3Rpb24nLCAncG9ydCcsIERFRkFVTFRfUE9SVCkKKworICAgIHRyeToKKyAgICAgICAgb3B0aW9ucy5jb25uZWN0X3RpbWVvdXQgPSBpbnQob3B0aW9ucy5jb25uZWN0X3RpbWVvdXQpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhcnNlci5lcnJvcignIiVzIiBpcyBub3QgYSB2YWxpZCBjb25uZWN0IHRpbWVvdXQuJyAlIChvcHRpb25zLmNvbm5lY3RfdGltZW91dCwpKQorICAgICAgICBvcHRpb25zLmNvbm5lY3RfdGltZW91dCA9IERFRkFVTFRfQ09OTkVDVF9USU1FT1VUX1NFQ09ORFMKKworICAgIHRyeToKKyAgICAgICAgb3B0aW9ucy5yZXF1ZXN0X3RpbWVvdXQgPSBpbnQob3B0aW9ucy5yZXF1ZXN0X3RpbWVvdXQpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhcnNlci5lcnJvcignIiVzIiBpcyBub3QgYSB2YWxpZCByZXF1ZXN0IHRpbWVvdXQuJyAlIChvcHRpb25zLnJlcXVlc3RfdGltZW91dCwpKQorICAgICAgICBvcHRpb25zLnJlcXVlc3RfdGltZW91dCA9IERFRkFVTFRfUkVRVUVTVF9USU1FT1VUX1NFQ09ORFMKKworICAgIGhvc3RuYW1lID0gZW52aXJvbm1lbnQuZ2V0KCdDUUxTSF9IT1NUJywgaG9zdG5hbWUpCisgICAgcG9ydCA9IGVudmlyb25tZW50LmdldCgnQ1FMU0hfUE9SVCcsIHBvcnQpCisKKyAgICBpZiBsZW4oYXJndW1lbnRzKSA+IDA6CisgICAgICAgIGhvc3RuYW1lID0gYXJndW1lbnRzWzBdCisgICAgaWYgbGVuKGFyZ3VtZW50cykgPiAxOgorICAgICAgICBwb3J0ID0gYXJndW1lbnRzWzFdCisKKyAgICBpZiBvcHRpb25zLmZpbGUgb3Igb3B0aW9ucy5leGVjdXRlOgorICAgICAgICBvcHRpb25zLnR0eSA9IEZhbHNlCisKKyAgICBpZiBvcHRpb25zLmV4ZWN1dGUgYW5kIG5vdCBvcHRpb25zLmV4ZWN1dGUuZW5kc3dpdGgoJzsnKToKKyAgICAgICAgb3B0aW9ucy5leGVjdXRlICs9ICc7JworCisgICAgaWYgb3B0dmFsdWVzLmNvbG9yIGluIChUcnVlLCBGYWxzZSk6CisgICAgICAgIG9wdGlvbnMuY29sb3IgPSBvcHR2YWx1ZXMuY29sb3IKKyAgICBlbHNlOgorICAgICAgICBpZiBvcHRpb25zLmZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvcHRpb25zLmNvbG9yID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wdGlvbnMuY29sb3IgPSBzaG91bGRfdXNlX2NvbG9yKCkKKworICAgIGlmIG9wdGlvbnMuY3FsdmVyc2lvbiBpcyBub3QgTm9uZToKKyAgICAgICAgb3B0aW9ucy5jcWx2ZXJzaW9uLCBjcWx2ZXJ0dXAgPSBmdWxsX2NxbF92ZXJzaW9uKG9wdGlvbnMuY3FsdmVyc2lvbikKKyAgICAgICAgaWYgY3FsdmVydHVwWzBdIDwgMzoKKyAgICAgICAgICAgIHBhcnNlci5lcnJvcignJXIgaXMgbm90IGEgc3VwcG9ydGVkIENRTCB2ZXJzaW9uLicgJSBvcHRpb25zLmNxbHZlcnNpb24pCisgICAgb3B0aW9ucy5jcWxtb2R1bGUgPSBjcWwzaGFuZGxpbmcKKworICAgIHRyeToKKyAgICAgICAgcG9ydCA9IGludChwb3J0KQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBwYXJzZXIuZXJyb3IoJyVyIGlzIG5vdCBhIHZhbGlkIHBvcnQgbnVtYmVyLicgJSBwb3J0KQorICAgIHJldHVybiBvcHRpb25zLCBob3N0bmFtZSwgcG9ydAorCisKK2RlZiBzZXR1cF9jcWxydWxlc2V0KGNxbG1vZHVsZSk6CisgICAgZ2xvYmFsIGNxbHJ1bGVzZXQKKyAgICBjcWxydWxlc2V0ID0gY3FsbW9kdWxlLkNxbFJ1bGVTZXQKKyAgICBjcWxydWxlc2V0LmFwcGVuZF9ydWxlcyhjcWxzaGhhbmRsaW5nLmNxbHNoX2V4dHJhX3N5bnRheF9ydWxlcykKKyAgICBmb3IgcnVsZW5hbWUsIHRlcm1uYW1lLCBmdW5jIGluIGNxbHNoaGFuZGxpbmcuY3Fsc2hfc3ludGF4X2NvbXBsZXRlcnM6CisgICAgICAgIGNxbHJ1bGVzZXQuY29tcGxldGVyX2ZvcihydWxlbmFtZSwgdGVybW5hbWUpKGZ1bmMpCisgICAgY3FscnVsZXNldC5jb21tYW5kc19lbmRfd2l0aF9uZXdsaW5lLnVwZGF0ZShjcWxzaGhhbmRsaW5nLm15X2NvbW1hbmRzX2VuZGluZ193aXRoX25ld2xpbmUpCisKKworZGVmIHNldHVwX2NxbGRvY3MoY3FsbW9kdWxlKToKKyAgICBnbG9iYWwgY3FsZG9jcworICAgIGNxbGRvY3MgPSBjcWxtb2R1bGUuY3FsZG9jcworCisKK2RlZiBzZXR1cF9kb2NzcGF0aChwYXRoKToKKyAgICBnbG9iYWwgQ0FTU0FORFJBX0NRTF9IVE1MCisgICAgQ0FTU0FORFJBX0NRTF9IVE1MX0ZBTExCQUNLID0gJ2h0dHBzOi8vY2Fzc2FuZHJhLmFwYWNoZS5vcmcvZG9jL2xhdGVzdC9jcWwvaW5kZXguaHRtbCcKKyAgICAjCisgICAgIyBkZWZhdWx0IGxvY2F0aW9uIG9mIGxvY2FsIENRTC5odG1sCisgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCArICcvZG9jL2NxbDMvQ1FMLmh0bWwnKToKKyAgICAgICAgIyBkZWZhdWx0IGxvY2F0aW9uIG9mIGxvY2FsIENRTC5odG1sCisgICAgICAgIENBU1NBTkRSQV9DUUxfSFRNTCA9ICdmaWxlOi8vJyArIHBhdGggKyAnL2RvYy9jcWwzL0NRTC5odG1sJworICAgIGVsaWYgb3MucGF0aC5leGlzdHMoJy91c3Ivc2hhcmUvZG9jL2Nhc3NhbmRyYS9DUUwuaHRtbCcpOgorICAgICAgICAjIGZhbGxiYWNrIHRvIHBhY2thZ2UgZmlsZQorICAgICAgICBDQVNTQU5EUkFfQ1FMX0hUTUwgPSAnZmlsZTovLy91c3Ivc2hhcmUvZG9jL2Nhc3NhbmRyYS9DUUwuaHRtbCcKKyAgICBlbHNlOgorICAgICAgICAjIGZhbGxiYWNrIHRvIG9ubGluZSB2ZXJzaW9uCisgICAgICAgIENBU1NBTkRSQV9DUUxfSFRNTCA9IENBU1NBTkRSQV9DUUxfSFRNTF9GQUxMQkFDSworCisKK2RlZiBpbnNlcnRfZHJpdmVyX2hvb2tzKCk6CisKKyAgICBjbGFzcyBEYXRlT3ZlckZsb3dXYXJuaW5nKFJ1bnRpbWVXYXJuaW5nKToKKyAgICAgICAgcGFzcworCisgICAgIyBEaXNwbGF5IG1pbGxpc2Vjb25kcyB3aGVuIGRhdGV0aW1lIG92ZXJmbG93cyAoQ0FTU0FORFJBLTEwNjI1KSwgRS5nLiwgdGhlIHllYXIgMTAwMDAuCisgICAgIyBOYXRpdmUgZGF0ZXRpbWUgdHlwZXMgYmxvdyB1cCBvdXRzaWRlIG9mIGRhdGV0aW1lLltNSU58TUFYXV9ZRUFSLiBXZSB3aWxsIGZhbGwgYmFjayB0byBhbiBpbnQgdGltZXN0YW1wCisgICAgZGVmIGRlc2VyaWFsaXplX2RhdGVfZmFsbGJhY2tfaW50KGJ5dHMsIHByb3RvY29sX3ZlcnNpb24pOgorICAgICAgICB0aW1lc3RhbXBfbXMgPSBpbnQ2NF91bnBhY2soYnl0cykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGRhdGV0aW1lX2Zyb21fdGltZXN0YW1wKHRpbWVzdGFtcF9tcyAvIDEwMDAuMCkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKERhdGVPdmVyRmxvd1dhcm5pbmcoIlNvbWUgdGltZXN0YW1wcyBhcmUgbGFyZ2VyIHRoYW4gUHl0aG9uIGRhdGV0aW1lIGNhbiByZXByZXNlbnQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGltZXN0YW1wcyBhcmUgZGlzcGxheWVkIGluIG1pbGxpc2Vjb25kcyBmcm9tIGVwb2NoLiIpKQorICAgICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcF9tcworCisgICAgY2Fzc2FuZHJhLmNxbHR5cGVzLkRhdGVUeXBlLmRlc2VyaWFsaXplID0gc3RhdGljbWV0aG9kKGRlc2VyaWFsaXplX2RhdGVfZmFsbGJhY2tfaW50KQorCisgICAgaWYgaGFzYXR0cihjYXNzYW5kcmEsICdkZXNlcmlhbGl6ZXJzJyk6CisgICAgICAgIGRlbCBjYXNzYW5kcmEuZGVzZXJpYWxpemVycy5EZXNEYXRlVHlwZQorCisgICAgIyBSZXR1cm4gY2Fzc2FuZHJhLmNxbHR5cGVzLkVNUFRZIGluc3RlYWQgb2YgTm9uZSBmb3IgZW1wdHkgdmFsdWVzCisgICAgY2Fzc2FuZHJhLmNxbHR5cGVzLkNhc3NhbmRyYVR5cGUuc3VwcG9ydF9lbXB0eV92YWx1ZXMgPSBUcnVlCisKKworZGVmIG1haW4oY21kbGluZSwgcGtncGF0aCk6CisgICAgaW5zZXJ0X2RyaXZlcl9ob29rcygpCisgICAgKG9wdGlvbnMsIGhvc3RuYW1lLCBwb3J0KSA9IHJlYWRfb3B0aW9ucyhjbWRsaW5lKQorCisgICAgc2V0dXBfZG9jc3BhdGgocGtncGF0aCkKKyAgICBzZXR1cF9jcWxydWxlc2V0KG9wdGlvbnMuY3FsbW9kdWxlKQorICAgIHNldHVwX2NxbGRvY3Mob3B0aW9ucy5jcWxtb2R1bGUpCisgICAgY3N2LmZpZWxkX3NpemVfbGltaXQob3B0aW9ucy5maWVsZF9zaXplX2xpbWl0KQorCisgICAgaWYgb3B0aW9ucy5maWxlIGlzIE5vbmU6CisgICAgICAgIHN0ZGluID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVuY29kaW5nLCBib21fc2l6ZSA9IGdldF9maWxlX2VuY29kaW5nX2JvbXNpemUob3B0aW9ucy5maWxlKQorICAgICAgICAgICAgc3RkaW4gPSBjb2RlY3Mub3BlbihvcHRpb25zLmZpbGUsICdyJywgZW5jb2RpbmcpCisgICAgICAgICAgICBzdGRpbi5zZWVrKGJvbV9zaXplKQorICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgc3lzLmV4aXQoIkNhbid0IG9wZW4gJXI6ICVzIiAlIChvcHRpb25zLmZpbGUsIGUpKQorCisgICAgaWYgb3B0aW9ucy5kZWJ1ZzoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiVXNpbmcgQ1FMIGRyaXZlcjogJXNcbiIgJSAoY2Fzc2FuZHJhLCkpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlVzaW5nIGNvbm5lY3QgdGltZW91dDogJXMgc2Vjb25kc1xuIiAlIChvcHRpb25zLmNvbm5lY3RfdGltZW91dCwpKQorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJVc2luZyAnJXMnIGVuY29kaW5nXG4iICUgKG9wdGlvbnMuZW5jb2RpbmcsKSkKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiVXNpbmcgc3NsOiAlc1xuIiAlIChvcHRpb25zLnNzbCwpKQorCisgICAgIyBjcmVhdGUgdGltZXpvbmUgYmFzZWQgb24gc2V0dGluZ3MsIGVudmlyb25tZW50IG9yIGF1dG8tZGV0ZWN0aW9uCisgICAgdGltZXpvbmUgPSBOb25lCisgICAgaWYgb3B0aW9ucy50aW1lem9uZSBvciAnVFonIGluIG9zLmVudmlyb246CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBweXR6CisgICAgICAgICAgICBpZiBvcHRpb25zLnRpbWV6b25lOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdGltZXpvbmUgPSBweXR6LnRpbWV6b25lKG9wdGlvbnMudGltZXpvbmUpCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogY291bGQgbm90IHJlY29nbml6ZSB0aW1lem9uZSAnJXMnIHNwZWNpZmllZCBpbiBjcWxzaHJjXG5cbiIgJSAob3B0aW9ucy50aW1lem9uZSkpCisgICAgICAgICAgICBpZiAnVFonIGluIG9zLmVudmlyb246CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB0aW1lem9uZSA9IHB5dHoudGltZXpvbmUob3MuZW52aXJvblsnVFonXSkKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJXYXJuaW5nOiBjb3VsZCBub3QgcmVjb2duaXplIHRpbWV6b25lICclcycgZnJvbSBlbnZpcm9ubWVudCB2YWx1ZSBUWlxuXG4iICUgKG9zLmVudmlyb25bJ1RaJ10pKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJXYXJuaW5nOiBUaW1lem9uZSBkZWZpbmVkIGFuZCAncHl0eicgbW9kdWxlIGZvciB0aW1lem9uZSBjb252ZXJzaW9uIG5vdCBpbnN0YWxsZWQuIFRpbWVzdGFtcHMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gVVRDIHRpbWV6b25lLlxuXG4iKQorCisgICAgIyB0cnkgYXV0by1kZXRlY3QgdGltZXpvbmUgaWYgdHpsb2NhbCBpcyBpbnN0YWxsZWQKKyAgICBpZiBub3QgdGltZXpvbmU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gdHpsb2NhbCBpbXBvcnQgZ2V0X2xvY2Fsem9uZQorICAgICAgICAgICAgdGltZXpvbmUgPSBnZXRfbG9jYWx6b25lKCkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgIyB3ZSBzaWxlbnRseSBpZ25vcmUgYW5kIGZhbGxiYWNrIHRvIFVUQyB1bmxlc3MgYSBjdXN0b20gdGltZXN0YW1wIGZvcm1hdCAod2hpY2ggbGlrZWx5CisgICAgICAgICAgICAjIGRvZXMgY29udGFpbiBhIFRaIHBhcnQpIHdhcyBzcGVjaWZpZWQKKyAgICAgICAgICAgIGlmIG9wdGlvbnMudGltZV9mb3JtYXQgIT0gREVGQVVMVF9USU1FU1RBTVBfRk9STUFUOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIldhcm5pbmc6IGN1c3RvbSB0aW1lc3RhbXAgZm9ybWF0IHNwZWNpZmllZCBpbiBjcWxzaHJjLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJidXQgbG9jYWwgdGltZXpvbmUgY291bGQgbm90IGJlIGRldGVjdGVkLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRWl0aGVyIGluc3RhbGwgUHl0aG9uICd0emxvY2FsJyBtb2R1bGUgZm9yIGF1dG8tZGV0ZWN0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm9yIHNwZWNpZnkgY2xpZW50IHRpbWV6b25lIGluIHlvdXIgY3Fsc2hyYy5cblxuIikKKworICAgIHRyeToKKyAgICAgICAgc2hlbGwgPSBTaGVsbChob3N0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3J0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbG9yPW9wdGlvbnMuY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU9b3B0aW9ucy51c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdGRpbiwKKyAgICAgICAgICAgICAgICAgICAgICB0dHk9b3B0aW9ucy50dHksCisgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVrZXk9b3B0aW9ucy5jb21wbGV0ZWtleSwKKyAgICAgICAgICAgICAgICAgICAgICBicm93c2VyPW9wdGlvbnMuYnJvd3NlciwKKyAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbF92ZXJzaW9uPW9wdGlvbnMucHJvdG9jb2xfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBjcWx2ZXI9b3B0aW9ucy5jcWx2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgIGtleXNwYWNlPW9wdGlvbnMua2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV90aW1lc3RhbXBfZm9ybWF0PW9wdGlvbnMudGltZV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9uYW5vdGltZV9mb3JtYXQ9b3B0aW9ucy5uYW5vdGltZV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9kYXRlX2Zvcm1hdD1vcHRpb25zLmRhdGVfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZmxvYXRfcHJlY2lzaW9uPW9wdGlvbnMuZmxvYXRfcHJlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZG91YmxlX3ByZWNpc2lvbj1vcHRpb25zLmRvdWJsZV9wcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV90aW1lem9uZT10aW1lem9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBtYXhfdHJhY2Vfd2FpdD1vcHRpb25zLm1heF90cmFjZV93YWl0LAorICAgICAgICAgICAgICAgICAgICAgIHNzbD1vcHRpb25zLnNzbCwKKyAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVfc3RhdGVtZW50PW9wdGlvbnMuZXhlY3V0ZSwKKyAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3RpbWVvdXQ9b3B0aW9ucy5yZXF1ZXN0X3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF90aW1lb3V0PW9wdGlvbnMuY29ubmVjdF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nPW9wdGlvbnMuZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgYXV0aF9wcm92aWRlcj1hdXRocHJvdmlkZXJoYW5kbGluZy5sb2FkX2F1dGhfcHJvdmlkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19maWxlPUNPTkZJR19GSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVkX2ZpbGU9b3B0aW9ucy5jcmVkZW50aWFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWU9b3B0aW9ucy51c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ9b3B0aW9ucy5wYXNzd29yZCkpCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICBzeXMuZXhpdCgnQ29ubmVjdGlvbiBhYm9ydGVkLicpCisgICAgZXhjZXB0IENRTF9FUlJPUlMgYXMgZToKKyAgICAgICAgc3lzLmV4aXQoJ0Nvbm5lY3Rpb24gZXJyb3I6ICVzJyAlIChlLCkpCisgICAgZXhjZXB0IFZlcnNpb25Ob3RTdXBwb3J0ZWQgYXMgZToKKyAgICAgICAgc3lzLmV4aXQoJ1Vuc3VwcG9ydGVkIENRTCB2ZXJzaW9uOiAlcycgJSAoZSwpKQorICAgIGlmIG9wdGlvbnMuZGVidWc6CisgICAgICAgIHNoZWxsLmRlYnVnID0gVHJ1ZQorICAgIGlmIG9wdGlvbnMuY292ZXJhZ2U6CisgICAgICAgIHNoZWxsLmNvdmVyYWdlID0gVHJ1ZQorICAgICAgICBpbXBvcnQgc2lnbmFsCisKKyAgICAgICAgZGVmIGhhbmRsZV9zaWdodXAoKToKKyAgICAgICAgICAgIHNoZWxsLnN0b3BfY292ZXJhZ2UoKQorICAgICAgICAgICAgc2hlbGwuZG9fZXhpdCgpCisKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSFVQLCBoYW5kbGVfc2lnaHVwKQorCisgICAgc2hlbGwuaW5pdF9oaXN0b3J5KCkKKyAgICBzaGVsbC5jbWRsb29wKCkKKyAgICBzaGVsbC5zYXZlX2hpc3RvcnkoKQorCisgICAgaWYgc2hlbGwuYmF0Y2hfbW9kZSBhbmQgc2hlbGwuc3RhdGVtZW50X2Vycm9yOgorICAgICAgICBzeXMuZXhpdCgyKQorCisKKyMgdmltOiBzZXQgZnQ9cHl0aG9uIGV0IHRzPTQgc3c9NCA6CmRpZmYgLS1naXQgYS9weWxpYi9jcWxzaGxpYi9mb3JtYXR0aW5nLnB5IGIvcHlsaWIvY3Fsc2hsaWIvZm9ybWF0dGluZy5weQppbmRleCBlYmY5ZmM3Li40ZWIzNjU4IDEwMDY0NAotLS0gYS9weWxpYi9jcWxzaGxpYi9mb3JtYXR0aW5nLnB5CisrKyBiL3B5bGliL2NxbHNobGliL2Zvcm1hdHRpbmcucHkKQEAgLTIwLDEyICsyMCwxMiBAQAogaW1wb3J0IG9zCiBpbXBvcnQgcmUKIGltcG9ydCBzeXMKK2ltcG9ydCB3Y3dpZHRoCiAKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CiAKIGZyb20gY2Fzc2FuZHJhLmNxbHR5cGVzIGltcG9ydCBFTVBUWQogZnJvbSBjYXNzYW5kcmEudXRpbCBpbXBvcnQgZGF0ZXRpbWVfZnJvbV90aW1lc3RhbXAKLWZyb20gLiBpbXBvcnQgd2N3aWR0aAogZnJvbSAuZGlzcGxheWluZyBpbXBvcnQgY29sb3JtZSwgZ2V0X3N0ciwgRm9ybWF0dGVkVmFsdWUsIERFRkFVTFRfVkFMVUVfQ09MT1JTLCBOT19DT0xPUl9NQVAKIGZyb20gLnV0aWwgaW1wb3J0IFVUQwogCkBAIC0zMjYsMTkgKzMyNiw5IEBACiAgICAgcmV0dXJuIGNvbG9ybWUoYnZhbCwgY29sb3JtYXAsICdpbnQnKQogCiAKLSMgV2UgY2FuIGdldCByaWQgb2YgdGhpcyBpbiBjYXNzYW5kcmEtMi4yCi1pZiBzeXMudmVyc2lvbl9pbmZvID49ICgyLCA3KToKLSAgICBkZWYgZm9ybWF0X2ludGVnZXJfd2l0aF90aG91c2FuZHNfc2VwKHZhbCwgdGhvdXNhbmRzX3NlcD0nLCcpOgotICAgICAgICByZXR1cm4gIns6LC4wZn0iLmZvcm1hdCh2YWwpLnJlcGxhY2UoJywnLCB0aG91c2FuZHNfc2VwKQotZWxzZToKLSAgICBkZWYgZm9ybWF0X2ludGVnZXJfd2l0aF90aG91c2FuZHNfc2VwKHZhbCwgdGhvdXNhbmRzX3NlcD0nLCcpOgotICAgICAgICBpZiB2YWwgPCAwOgotICAgICAgICAgICAgcmV0dXJuICctJyArIGZvcm1hdF9pbnRlZ2VyX3dpdGhfdGhvdXNhbmRzX3NlcCgtdmFsLCB0aG91c2FuZHNfc2VwKQotICAgICAgICByZXN1bHQgPSAnJwotICAgICAgICB3aGlsZSB2YWwgPj0gMTAwMDoKLSAgICAgICAgICAgIHZhbCwgciA9IGRpdm1vZCh2YWwsIDEwMDApCi0gICAgICAgICAgICByZXN1bHQgPSAiJXMlMDNkJXMiICUgKHRob3VzYW5kc19zZXAsIHIsIHJlc3VsdCkKLSAgICAgICAgcmV0dXJuICIlZCVzIiAlICh2YWwsIHJlc3VsdCkKK2RlZiBmb3JtYXRfaW50ZWdlcl93aXRoX3Rob3VzYW5kc19zZXAodmFsLCB0aG91c2FuZHNfc2VwPScsJyk6CisgICAgcmV0dXJuICJ7OiwuMGZ9Ii5mb3JtYXQodmFsKS5yZXBsYWNlKCcsJywgdGhvdXNhbmRzX3NlcCkKKwogCiBmb3JtYXR0ZXJfZm9yKCdsb25nJykoZm9ybWF0X2ludGVnZXJfdHlwZSkKIGZvcm1hdHRlcl9mb3IoJ2ludCcpKGZvcm1hdF9pbnRlZ2VyX3R5cGUpCmRpZmYgLS1naXQgYS9weWxpYi9jcWxzaGxpYi9weWxleG90cm9uLnB5IGIvcHlsaWIvY3Fsc2hsaWIvcHlsZXhvdHJvbi5weQppbmRleCA2OWYzMWRjLi5jMWZkNTVlIDEwMDY0NAotLS0gYS9weWxpYi9jcWxzaGxpYi9weWxleG90cm9uLnB5CisrKyBiL3B5bGliL2NxbHNobGliL3B5bGV4b3Ryb24ucHkKQEAgLTE0LDcgKzE0LDEyIEBACiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKKyIiIlB5bGV4b3Ryb24gdXNlcyBQeXRob24ncyByZS5TY2FubmVyIG1vZHVsZSBhcyBhIHNpbXBsZSByZWdleC1iYXNlZCB0b2tlbml6ZXIgZm9yIEJORiBwcm9kdWN0aW9uIHJ1bGVzIiIiCisKIGltcG9ydCByZQoraW1wb3J0IGluc3BlY3QKK2ltcG9ydCBzeXMKK2Zyb20gdHlwaW5nIGltcG9ydCBVbmlvbgogCiBmcm9tIGNxbHNobGliLnNhZmVyc2Nhbm5lciBpbXBvcnQgU2FmZXJTY2FubmVyCiAKQEAgLTU2LDggKzYxLDggQEAKICAgICAgICAgcmV0dXJuICclcyglciknICUgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRleHQpCiAKIAotZGVmIGlzX2hpbnQoeCk6Ci0gICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgSGludCkKK2RlZiBpc19oaW50KG9iaik6CisgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqLCBIaW50KQogCiAKIGNsYXNzIFBhcnNlQ29udGV4dDoKQEAgLTExNSw3ICsxMjAsNyBAQAogICAgICAgICAgICAgICAgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYubWF0Y2hlZCwgc2VsZi5yZW1haW5kZXIsIHNlbGYucHJvZHVjdGlvbm5hbWUsIHNlbGYuYmluZGluZ3MpCiAKIAotY2xhc3MgbWF0Y2hlcjoKK2NsYXNzIE1hdGNoZXI6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgYXJnKToKICAgICAgICAgc2VsZi5hcmcgPSBhcmcKQEAgLTE1NSwzOCArMTYwLDM4IEBACiAgICAgICAgIHJldHVybiAnJXMoJXIpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5hcmcpCiAKIAotY2xhc3MgY2hvaWNlKG1hdGNoZXIpOgorY2xhc3MgQ2hvaWNlKE1hdGNoZXIpOgogCiAgICAgZGVmIG1hdGNoKHNlbGYsIGN0eHQsIGNvbXBsZXRpb25zKToKICAgICAgICAgZm91bmRjdHh0cyA9IFtdCi0gICAgICAgIGZvciBhIGluIHNlbGYuYXJnOgotICAgICAgICAgICAgc3ViY3R4dHMgPSBhLm1hdGNoKGN0eHQsIGNvbXBsZXRpb25zKQorICAgICAgICBmb3IgZWFjaCBpbiBzZWxmLmFyZzoKKyAgICAgICAgICAgIHN1YmN0eHRzID0gZWFjaC5tYXRjaChjdHh0LCBjb21wbGV0aW9ucykKICAgICAgICAgICAgIGZvdW5kY3R4dHMuZXh0ZW5kKHN1YmN0eHRzKQogICAgICAgICByZXR1cm4gZm91bmRjdHh0cwogCiAKLWNsYXNzIG9uZV9vcl9ub25lKG1hdGNoZXIpOgorY2xhc3MgT25lT3JOb25lKE1hdGNoZXIpOgogCiAgICAgZGVmIG1hdGNoKHNlbGYsIGN0eHQsIGNvbXBsZXRpb25zKToKICAgICAgICAgcmV0dXJuIFtjdHh0XSArIGxpc3Qoc2VsZi5hcmcubWF0Y2goY3R4dCwgY29tcGxldGlvbnMpKQogCiAKLWNsYXNzIHJlcGVhdChtYXRjaGVyKToKK2NsYXNzIFJlcGVhdChNYXRjaGVyKToKIAogICAgIGRlZiBtYXRjaChzZWxmLCBjdHh0LCBjb21wbGV0aW9ucyk6CiAgICAgICAgIGZvdW5kID0gW2N0eHRdCiAgICAgICAgIGN0eHRzID0gW2N0eHRdCiAgICAgICAgIHdoaWxlIFRydWU6CiAgICAgICAgICAgICBuZXdfY3R4dHMgPSBbXQotICAgICAgICAgICAgZm9yIGMgaW4gY3R4dHM6Ci0gICAgICAgICAgICAgICAgbmV3X2N0eHRzLmV4dGVuZChzZWxmLmFyZy5tYXRjaChjLCBjb21wbGV0aW9ucykpCisgICAgICAgICAgICBmb3IgZWFjaCBpbiBjdHh0czoKKyAgICAgICAgICAgICAgICBuZXdfY3R4dHMuZXh0ZW5kKHNlbGYuYXJnLm1hdGNoKGVhY2gsIGNvbXBsZXRpb25zKSkKICAgICAgICAgICAgIGlmIG5vdCBuZXdfY3R4dHM6CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kCiAgICAgICAgICAgICBmb3VuZC5leHRlbmQobmV3X2N0eHRzKQogICAgICAgICAgICAgY3R4dHMgPSBuZXdfY3R4dHMKIAogCi1jbGFzcyBydWxlX3JlZmVyZW5jZShtYXRjaGVyKToKK2NsYXNzIFJ1bGVSZWZlcmVuY2UoTWF0Y2hlcik6CiAKICAgICBkZWYgbWF0Y2goc2VsZiwgY3R4dCwgY29tcGxldGlvbnMpOgogICAgICAgICBwcmV2bmFtZSA9IGN0eHQucHJvZHVjdGlvbm5hbWUKQEAgLTE5OCwyNCArMjAzLDI0IEBACiAgICAgICAgIHJldHVybiBbYy53aXRoX3Byb2R1Y3Rpb25fbmFtZWQocHJldm5hbWUpIGZvciBjIGluIG91dHB1dF0KIAogCi1jbGFzcyBydWxlX3NlcmllcyhtYXRjaGVyKToKK2NsYXNzIFJ1bGVTZXJpZXMoTWF0Y2hlcik6CiAKICAgICBkZWYgbWF0Y2goc2VsZiwgY3R4dCwgY29tcGxldGlvbnMpOgogICAgICAgICBjdHh0cyA9IFtjdHh0XQogICAgICAgICBmb3IgcGF0cGllY2UgaW4gc2VsZi5hcmc6CiAgICAgICAgICAgICBuZXdfY3R4dHMgPSBbXQotICAgICAgICAgICAgZm9yIGMgaW4gY3R4dHM6Ci0gICAgICAgICAgICAgICAgbmV3X2N0eHRzLmV4dGVuZChwYXRwaWVjZS5tYXRjaChjLCBjb21wbGV0aW9ucykpCisgICAgICAgICAgICBmb3IgZWFjaCBpbiBjdHh0czoKKyAgICAgICAgICAgICAgICBuZXdfY3R4dHMuZXh0ZW5kKHBhdHBpZWNlLm1hdGNoKGVhY2gsIGNvbXBsZXRpb25zKSkKICAgICAgICAgICAgIGlmIG5vdCBuZXdfY3R4dHM6CiAgICAgICAgICAgICAgICAgcmV0dXJuICgpCiAgICAgICAgICAgICBjdHh0cyA9IG5ld19jdHh0cwogICAgICAgICByZXR1cm4gY3R4dHMKIAogCi1jbGFzcyBuYW1lZF9zeW1ib2wobWF0Y2hlcik6CitjbGFzcyBOYW1lZFN5bWJvbChNYXRjaGVyKToKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBhcmcpOgotICAgICAgICBtYXRjaGVyLl9faW5pdF9fKHNlbGYsIGFyZykKKyAgICAgICAgTWF0Y2hlci5fX2luaXRfXyhzZWxmLCBhcmcpCiAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKIAogICAgIGRlZiBtYXRjaChzZWxmLCBjdHh0LCBjb21wbGV0aW9ucyk6CkBAIC0yMjQsMTMgKzIyOSwxNCBAQAogICAgICAgICAgICAgIyBkb24ndCBjb2xsZWN0IG90aGVyIGNvbXBsZXRpb25zIHVuZGVyIHRoaXM7IHVzZSBhIGR1bW15CiAgICAgICAgICAgICBwYXNzX2luX2NvbXBscyA9IHNldCgpCiAgICAgICAgIHJlc3VsdHMgPSBzZWxmLmFyZy5tYXRjaF93aXRoX3Jlc3VsdHMoY3R4dCwgcGFzc19pbl9jb21wbHMpCi0gICAgICAgIHJldHVybiBbYy53aXRoX2JpbmRpbmcoc2VsZi5uYW1lLCBjdHh0LmV4dHJhY3Rfb3JpZyhtYXRjaHRva3MpKSBmb3IgKGMsIG1hdGNodG9rcykgaW4gcmVzdWx0c10KKyAgICAgICAgcmV0dXJuIFtjLndpdGhfYmluZGluZyhzZWxmLm5hbWUsIGN0eHQuZXh0cmFjdF9vcmlnKG1hdGNodG9rcykpCisgICAgICAgICAgICAgICAgZm9yIChjLCBtYXRjaHRva3MpIGluIHJlc3VsdHNdCiAKICAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAgIHJldHVybiAnJXMoJXIsICVyKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYubmFtZSwgc2VsZi5hcmcpCiAKIAotY2xhc3MgbmFtZWRfY29sbGVjdG9yKG5hbWVkX3N5bWJvbCk6CitjbGFzcyBOYW1lZENvbGxlY3RvcihOYW1lZFN5bWJvbCk6CiAKICAgICBkZWYgbWF0Y2goc2VsZiwgY3R4dCwgY29tcGxldGlvbnMpOgogICAgICAgICBwYXNzX2luX2NvbXBscyA9IGNvbXBsZXRpb25zCkBAIC0yNDQsMTggKzI1MCwyMSBAQAogICAgICAgICByZXR1cm4gb3V0cHV0CiAKIAotY2xhc3MgdGVybWluYWxfbWF0Y2hlcihtYXRjaGVyKToKK2NsYXNzIFRlcm1pbmFsTWF0Y2hlcihNYXRjaGVyKToKKworICAgIGRlZiBtYXRjaChzZWxmLCBjdHh0LCBjb21wbGV0aW9ucyk6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKIAogICAgIGRlZiBwYXR0ZXJuKHNlbGYpOgogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCiAKIAotY2xhc3MgcmVnZXhfcnVsZSh0ZXJtaW5hbF9tYXRjaGVyKToKK2NsYXNzIFJlZ2V4UnVsZShUZXJtaW5hbE1hdGNoZXIpOgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdCk6Ci0gICAgICAgIHRlcm1pbmFsX21hdGNoZXIuX19pbml0X18oc2VsZiwgcGF0KQorICAgICAgICBUZXJtaW5hbE1hdGNoZXIuX19pbml0X18oc2VsZiwgcGF0KQogICAgICAgICBzZWxmLnJlZ2V4ID0gcGF0Ci0gICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKHBhdCArICckJywgcmUuSSB8IHJlLlMpCisgICAgICAgIHNlbGYucmUgPSByZS5jb21waWxlKHBhdCArICckJywgcmUuSUdOT1JFQ0FTRSB8IHJlLkRPVEFMTCkKIAogICAgIGRlZiBtYXRjaChzZWxmLCBjdHh0LCBjb21wbGV0aW9ucyk6CiAgICAgICAgIGlmIGN0eHQucmVtYWluZGVyOgpAQCAtMjY5LDEyICsyNzgsMTIgQEAKICAgICAgICAgcmV0dXJuIHNlbGYucmVnZXgKIAogCi1jbGFzcyB0ZXh0X21hdGNoKHRlcm1pbmFsX21hdGNoZXIpOgorY2xhc3MgVGV4dE1hdGNoKFRlcm1pbmFsTWF0Y2hlcik6CiAgICAgYWxwaGFfcmUgPSByZS5jb21waWxlKHInW2EtekEtWl0nKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHQpOgogICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0ZXJtaW5hbF9tYXRjaGVyLl9faW5pdF9fKHNlbGYsIGV2YWwodGV4dCkpCisgICAgICAgICAgICBUZXJtaW5hbE1hdGNoZXIuX19pbml0X18oc2VsZiwgZXZhbCh0ZXh0KSkKICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgogICAgICAgICAgICAgcHJpbnQoImJhZCBzeW50YXggJXIiICUgKHRleHQsKSkKIApAQCAtMjg5LDEyICsyOTgsMTMgQEAKICAgICBkZWYgcGF0dGVybihzZWxmKToKICAgICAgICAgIyBjYW4ndCB1c2UgKD9pKSBoZXJlLSBTY2FubmVyIGNvbXBvbmVudCByZWdleCBmbGFncyB3b24ndCBiZSBhcHBsaWVkCiAgICAgICAgIGRlZiBpZ25vcmVjYXNlaWZ5KG1hdGNob2JqKToKLSAgICAgICAgICAgIGMgPSBtYXRjaG9iai5ncm91cCgwKQotICAgICAgICAgICAgcmV0dXJuICdbJXMlc10nICUgKGMudXBwZXIoKSwgYy5sb3dlcigpKQorICAgICAgICAgICAgdmFsID0gbWF0Y2hvYmouZ3JvdXAoMCkKKyAgICAgICAgICAgIHJldHVybiAnWyVzJXNdJyAlICh2YWwudXBwZXIoKSwgdmFsLmxvd2VyKCkpCisKICAgICAgICAgcmV0dXJuIHNlbGYuYWxwaGFfcmUuc3ViKGlnbm9yZWNhc2VpZnksIHJlLmVzY2FwZShzZWxmLmFyZykpCiAKIAotY2xhc3MgY2FzZV9tYXRjaCh0ZXh0X21hdGNoKToKK2NsYXNzIENhc2VNYXRjaChUZXh0TWF0Y2gpOgogCiAgICAgZGVmIG1hdGNoKHNlbGYsIGN0eHQsIGNvbXBsZXRpb25zKToKICAgICAgICAgaWYgY3R4dC5yZW1haW5kZXI6CkBAIC0zMDgsMjIgKzMxOCwyMiBAQAogICAgICAgICByZXR1cm4gcmUuZXNjYXBlKHNlbGYuYXJnKQogCiAKLWNsYXNzIHdvcmRfbWF0Y2godGV4dF9tYXRjaCk6CitjbGFzcyBXb3JkTWF0Y2goVGV4dE1hdGNoKToKIAogICAgIGRlZiBwYXR0ZXJuKHNlbGYpOgotICAgICAgICByZXR1cm4gcidcYicgKyB0ZXh0X21hdGNoLnBhdHRlcm4oc2VsZikgKyByJ1xiJworICAgICAgICByZXR1cm4gcidcYicgKyBUZXh0TWF0Y2gucGF0dGVybihzZWxmKSArIHInXGInCiAKIAotY2xhc3MgY2FzZV93b3JkX21hdGNoKGNhc2VfbWF0Y2gpOgorY2xhc3MgQ2FzZVdvcmRNYXRjaChDYXNlTWF0Y2gpOgogCiAgICAgZGVmIHBhdHRlcm4oc2VsZik6Ci0gICAgICAgIHJldHVybiByJ1xiJyArIGNhc2VfbWF0Y2gucGF0dGVybihzZWxmKSArIHInXGInCisgICAgICAgIHJldHVybiByJ1xiJyArIENhc2VNYXRjaC5wYXR0ZXJuKHNlbGYpICsgcidcYicKIAogCi1jbGFzcyB0ZXJtaW5hbF90eXBlX21hdGNoZXIobWF0Y2hlcik6CitjbGFzcyBUZXJtaW5hbFR5cGVNYXRjaGVyKE1hdGNoZXIpOgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRva2VudHlwZSwgc3VibWF0Y2hlcik6Ci0gICAgICAgIG1hdGNoZXIuX19pbml0X18oc2VsZiwgdG9rZW50eXBlKQorICAgICAgICBNYXRjaGVyLl9faW5pdF9fKHNlbGYsIHRva2VudHlwZSkKICAgICAgICAgc2VsZi50b2tlbnR5cGUgPSB0b2tlbnR5cGUKICAgICAgICAgc2VsZi5zdWJtYXRjaGVyID0gc3VibWF0Y2hlcgogCkBAIC0zNDAsMTggKzM1MCwyNCBAQAogCiAKIGNsYXNzIFBhcnNpbmdSdWxlU2V0OgorICAgICIiIkRlZmluZSB0aGUgQk5GIHRva2VuaXphdGlvbiBydWxlcyBmb3IgY3FsM2hhbmRsaW5nLnN5bnRheF9ydWxlcy4gQmFja3VzLU5hdXIgRm9ybSBjb25zaXN0cyBvZgorICAgICAgIC0gUHJvZHVjdGlvbiBydWxlcyBpbiB0aGUgZm9ybTogTGVmdC1IYW5kLVNpZGUgOjo9IFJpZ2h0LUhhbmQtU2lkZS4gIFRoZSBMSFMgaXMgYSBub24tdGVybWluYWwuCisgICAgICAgLSBQcm9kdWN0aW9ucyBvciBub24tdGVybWluYWwgc3ltYm9scworICAgICAgIC0gVGVybWluYWwgc3ltYm9scy4gIEV2ZXJ5IHRlcm1pbmFsIGlzIGEgc2luZ2xlIHRva2VuLgorICAgICIiIgorCiAgICAgUnVsZVNwZWNTY2FubmVyID0gU2FmZXJTY2FubmVyKFsKLSAgICAgICAgKHInOjo9JywgbGFtYmRhIHMsIHQ6IHQpLAorICAgICAgICAocic6Oj0nLCBsYW1iZGEgcywgdDogdCksICAgICAgICAgICAgICAgICAgICMgQk5GIHJ1bGUgZGVmaW5pdGlvbgogICAgICAgICAocidcW1thLXowLTlfXStcXT0nLCBsYW1iZGEgcywgdDogKCduYW1lZF9jb2xsZWN0b3InLCB0WzE6LTJdKSksCiAgICAgICAgIChyJ1thLXowLTlfXSs9JywgbGFtYmRhIHMsIHQ6ICgnbmFtZWRfc3ltYm9sJywgdFs6LTFdKSksCiAgICAgICAgIChyJy8oXFtcXj8uW15dXSpcXXxbXi9dfFxcLikqLycsIGxhbWJkYSBzLCB0OiAoJ3JlZ2V4JywgdFsxOi0xXS5yZXBsYWNlKHInXC8nLCAnLycpKSksCi0gICAgICAgIChyJyIoW14iXXxcXC4pKiInLCBsYW1iZGEgcywgdDogKCdsaXRzdHJpbmcnLCB0KSksCisgICAgICAgIChyJyIoW14iXXxcXC4pKiInLCBsYW1iZGEgcywgdDogKCdzdHJpbmdfbGl0ZXJhbCcsIHQpKSwKICAgICAgICAgKHInPFtePl0qPicsIGxhbWJkYSBzLCB0OiAoJ3JlZmVyZW5jZScsIHRbMTotMV0pKSwKICAgICAgICAgKHInXGJKVU5LXGInLCBsYW1iZGEgcywgdDogKCdqdW5rJywgdCkpLAogICAgICAgICAocidbQCgpfD8qO10nLCBsYW1iZGEgcywgdDogdCksCi0gICAgICAgIChyJ1xzKycsIE5vbmUpLAorICAgICAgICAocidccysnLCBOb25lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2hpdGVzcGFjZQogICAgICAgICAocicjW15cbl0qJywgTm9uZSksCi0gICAgXSwgcmUuSSB8IHJlLlMgfCByZS5VKQorICAgIF0sIHJlLklHTk9SRUNBU0UgfCByZS5ET1RBTEwgfCByZS5VTklDT0RFKQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICBzZWxmLnJ1bGVzZXQgPSB7fQpAQCAtMzY4LDcgKzM4NCw3IEBACiAgICAgZGVmIHBhcnNlX3J1bGVzKGNscywgcnVsZXN0cik6CiAgICAgICAgIHRva2VucywgdW5tYXRjaGVkID0gY2xzLlJ1bGVTcGVjU2Nhbm5lci5zY2FuKHJ1bGVzdHIpCiAgICAgICAgIGlmIHVubWF0Y2hlZDoKLSAgICAgICAgICAgIHJhaXNlIExleGluZ0Vycm9yLmZyb21fdGV4dChydWxlc3RyLCB1bm1hdGNoZWQsIG1zZz0iU3ludGF4IHJ1bGVzIHVucGFyc2VhYmxlIikKKyAgICAgICAgICAgIHJhaXNlIExleGluZ0Vycm9yLmZyb21fdGV4dChydWxlc3RyLCB1bm1hdGNoZWQsIG1zZz0iU3ludGF4IHJ1bGVzIGFyZSB1bnBhcnNlYWJsZSIpCiAgICAgICAgIHJ1bGVzID0ge30KICAgICAgICAgdGVybWluYWxzID0gW10KICAgICAgICAgdG9rZW5pdGVyID0gaXRlcih0b2tlbnMpCkBAIC0zNzksOSArMzk1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5leHBlY3RlZCB0b2tlbiAlcjsgZXhwZWN0ZWQgIjo6PSInICUgKGFzc2lnbiwpKQogICAgICAgICAgICAgICAgIG5hbWUgPSB0WzFdCiAgICAgICAgICAgICAgICAgcHJvZHVjdGlvbiA9IGNscy5yZWFkX3J1bGVfdG9rZW5zX3VudGlsKCc7JywgdG9rZW5pdGVyKQotICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocHJvZHVjdGlvbiwgdGVybWluYWxfbWF0Y2hlcik6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwcm9kdWN0aW9uLCBUZXJtaW5hbE1hdGNoZXIpOgogICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hbHMuYXBwZW5kKChuYW1lLCBwcm9kdWN0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgcHJvZHVjdGlvbiA9IHRlcm1pbmFsX3R5cGVfbWF0Y2hlcihuYW1lLCBwcm9kdWN0aW9uKQorICAgICAgICAgICAgICAgICAgICBwcm9kdWN0aW9uID0gVGVybWluYWxUeXBlTWF0Y2hlcihuYW1lLCBwcm9kdWN0aW9uKQogICAgICAgICAgICAgICAgIHJ1bGVzW25hbWVdID0gcHJvZHVjdGlvbgogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmV4cGVjdGVkIHRva2VuICVyOyBleHBlY3RlZCBuYW1lJyAlICh0LCkpCkBAIC0zOTIsMTEgKzQwOCwxMSBAQAogICAgICAgICBpZiBpc2luc3RhbmNlKHBpZWNlcywgKHR1cGxlLCBsaXN0KSk6CiAgICAgICAgICAgICBpZiBsZW4ocGllY2VzKSA9PSAxOgogICAgICAgICAgICAgICAgIHJldHVybiBwaWVjZXNbMF0KLSAgICAgICAgICAgIHJldHVybiBydWxlX3NlcmllcyhwaWVjZXMpCisgICAgICAgICAgICByZXR1cm4gUnVsZVNlcmllcyhwaWVjZXMpCiAgICAgICAgIHJldHVybiBwaWVjZXMKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiByZWFkX3J1bGVfdG9rZW5zX3VudGlsKGNscywgZW5kdG9rcywgdG9rZW5pdGVyKToKKyAgICBkZWYgcmVhZF9ydWxlX3Rva2Vuc191bnRpbChjbHMsIGVuZHRva3M6IFVuaW9uW3N0ciwgaW50XSwgdG9rZW5pdGVyKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShlbmR0b2tzLCBzdHIpOgogICAgICAgICAgICAgZW5kdG9rcyA9IChlbmR0b2tzLCkKICAgICAgICAgY291bnR0YXJnZXQgPSBOb25lCkBAIC00MTEsMzIgKzQyNywzMiBAQAogICAgICAgICAgICAgaWYgdCBpbiBlbmR0b2tzOgogICAgICAgICAgICAgICAgIGlmIGxlbihteWJyYW5jaGVzKSA9PSAxOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xzLm1rcnVsZShteWJyYW5jaGVzWzBdKQotICAgICAgICAgICAgICAgIHJldHVybiBjaG9pY2UobGlzdChtYXAoY2xzLm1rcnVsZSwgbXlicmFuY2hlcykpKQorICAgICAgICAgICAgICAgIHJldHVybiBDaG9pY2UobGlzdChtYXAoY2xzLm1rcnVsZSwgbXlicmFuY2hlcykpKQogICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0LCB0dXBsZSk6CiAgICAgICAgICAgICAgICAgaWYgdFswXSA9PSAncmVmZXJlbmNlJzoKLSAgICAgICAgICAgICAgICAgICAgdCA9IHJ1bGVfcmVmZXJlbmNlKHRbMV0pCi0gICAgICAgICAgICAgICAgZWxpZiB0WzBdID09ICdsaXRzdHJpbmcnOgorICAgICAgICAgICAgICAgICAgICB0ID0gUnVsZVJlZmVyZW5jZSh0WzFdKQorICAgICAgICAgICAgICAgIGVsaWYgdFswXSA9PSAnc3RyaW5nX2xpdGVyYWwnOgogICAgICAgICAgICAgICAgICAgICBpZiB0WzFdWzFdLmlzYWxudW0oKSBvciB0WzFdWzFdID09ICdfJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB3b3JkX21hdGNoKHRbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICB0ID0gV29yZE1hdGNoKHRbMV0pCiAgICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ID0gdGV4dF9tYXRjaCh0WzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgdCA9IFRleHRNYXRjaCh0WzFdKQogICAgICAgICAgICAgICAgIGVsaWYgdFswXSA9PSAncmVnZXgnOgotICAgICAgICAgICAgICAgICAgICB0ID0gcmVnZXhfcnVsZSh0WzFdKQorICAgICAgICAgICAgICAgICAgICB0ID0gUmVnZXhSdWxlKHRbMV0pCiAgICAgICAgICAgICAgICAgZWxpZiB0WzBdID09ICduYW1lZF9jb2xsZWN0b3InOgotICAgICAgICAgICAgICAgICAgICB0ID0gbmFtZWRfY29sbGVjdG9yKHRbMV0sIGNscy5yZWFkX3J1bGVfdG9rZW5zX3VudGlsKDEsIHRva2VuaXRlcikpCisgICAgICAgICAgICAgICAgICAgIHQgPSBOYW1lZENvbGxlY3Rvcih0WzFdLCBjbHMucmVhZF9ydWxlX3Rva2Vuc191bnRpbCgxLCB0b2tlbml0ZXIpKQogICAgICAgICAgICAgICAgIGVsaWYgdFswXSA9PSAnbmFtZWRfc3ltYm9sJzoKLSAgICAgICAgICAgICAgICAgICAgdCA9IG5hbWVkX3N5bWJvbCh0WzFdLCBjbHMucmVhZF9ydWxlX3Rva2Vuc191bnRpbCgxLCB0b2tlbml0ZXIpKQorICAgICAgICAgICAgICAgICAgICB0ID0gTmFtZWRTeW1ib2wodFsxXSwgY2xzLnJlYWRfcnVsZV90b2tlbnNfdW50aWwoMSwgdG9rZW5pdGVyKSkKICAgICAgICAgICAgIGVsaWYgdCA9PSAnKCc6CiAgICAgICAgICAgICAgICAgdCA9IGNscy5yZWFkX3J1bGVfdG9rZW5zX3VudGlsKCcpJywgdG9rZW5pdGVyKQogICAgICAgICAgICAgZWxpZiB0ID09ICc/JzoKLSAgICAgICAgICAgICAgICB0ID0gb25lX29yX25vbmUobXlydWxlcy5wb3AoLTEpKQorICAgICAgICAgICAgICAgIHQgPSBPbmVPck5vbmUobXlydWxlcy5wb3AoLTEpKQogICAgICAgICAgICAgZWxpZiB0ID09ICcqJzoKLSAgICAgICAgICAgICAgICB0ID0gcmVwZWF0KG15cnVsZXMucG9wKC0xKSkKKyAgICAgICAgICAgICAgICB0ID0gUmVwZWF0KG15cnVsZXMucG9wKC0xKSkKICAgICAgICAgICAgIGVsaWYgdCA9PSAnQCc6Ci0gICAgICAgICAgICAgICAgeCA9IG5leHQodG9rZW5pdGVyKQotICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHgsIHR1cGxlKSBvciB4WzBdICE9ICdsaXRzdHJpbmcnOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmV4cGVjdGVkIHRva2VuICVyIGZvbGxvd2luZyAnQCciICUgKHgsKSkKLSAgICAgICAgICAgICAgICB0ID0gY2FzZV9tYXRjaCh4WzFdKQorICAgICAgICAgICAgICAgIHZhbCA9IG5leHQodG9rZW5pdGVyKQorICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbCwgdHVwbGUpIG9yIHZhbFswXSAhPSAnc3RyaW5nX2xpdGVyYWwnOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmV4cGVjdGVkIHRva2VuICVyIGZvbGxvd2luZyAnQCciICUgKHZhbCwpKQorICAgICAgICAgICAgICAgIHQgPSBDYXNlTWF0Y2godmFsWzFdKQogICAgICAgICAgICAgZWxpZiB0ID09ICd8JzoKICAgICAgICAgICAgICAgICBteXJ1bGVzID0gW10KICAgICAgICAgICAgICAgICBteWJyYW5jaGVzLmFwcGVuZChteXJ1bGVzKQpAQCAtNDQ3LDcgKzQ2Myw3IEBACiAgICAgICAgICAgICBpZiBjb3VudHNvZmFyID09IGNvdW50dGFyZ2V0OgogICAgICAgICAgICAgICAgIGlmIGxlbihteWJyYW5jaGVzKSA9PSAxOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xzLm1rcnVsZShteWJyYW5jaGVzWzBdKQotICAgICAgICAgICAgICAgIHJldHVybiBjaG9pY2UobGlzdChtYXAoY2xzLm1rcnVsZSwgbXlicmFuY2hlcykpKQorICAgICAgICAgICAgICAgIHJldHVybiBDaG9pY2UobGlzdChtYXAoY2xzLm1rcnVsZSwgbXlicmFuY2hlcykpKQogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmV4cGVjdGVkIGVuZCBvZiBydWxlIHRva2VucycpCiAKICAgICBkZWYgYXBwZW5kX3J1bGVzKHNlbGYsIHJ1bGVzdHIpOgpAQCAtNDY1LDggKzQ4MSw5IEBACiAgICAgICAgICAgICBpZiBuYW1lID09ICdKVU5LJzoKICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSBzLCB0OiAobmFtZSwgdCwgcy5tYXRjaC5zcGFuKCkpCisKICAgICAgICAgcmVnZXhlcyA9IFsocC5wYXR0ZXJuKCksIG1ha2VfaGFuZGxlcihuYW1lKSkgZm9yIChuYW1lLCBwKSBpbiBzZWxmLnRlcm1pbmFsc10KLSAgICAgICAgcmV0dXJuIFNhZmVyU2Nhbm5lcihyZWdleGVzLCByZS5JIHwgcmUuUyB8IHJlLlUpLnNjYW4KKyAgICAgICAgcmV0dXJuIFNhZmVyU2Nhbm5lcihyZWdleGVzLCByZS5JR05PUkVDQVNFIHwgcmUuRE9UQUxMIHwgcmUuVU5JQ09ERSkuc2NhbgogCiAgICAgZGVmIGxleChzZWxmLCB0ZXh0KToKICAgICAgICAgaWYgc2VsZi5zY2FubmVyIGlzIE5vbmU6CkBAIC00ODcsOSArNTA0LDkgQEAKICAgICAgICAgYmluZGluZ3MgPSB7fQogICAgICAgICBpZiBzcmNzdHIgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBiaW5kaW5nc1snKlNSQyonXSA9IHNyY3N0cgotICAgICAgICBmb3IgYyBpbiBzZWxmLnBhcnNlKHN0YXJ0c3ltYm9sLCB0b2tlbnMsIGluaXRfYmluZGluZ3M9YmluZGluZ3MpOgotICAgICAgICAgICAgaWYgbm90IGMucmVtYWluZGVyOgotICAgICAgICAgICAgICAgIHJldHVybiBjCisgICAgICAgIGZvciB2YWwgaW4gc2VsZi5wYXJzZShzdGFydHN5bWJvbCwgdG9rZW5zLCBpbml0X2JpbmRpbmdzPWJpbmRpbmdzKToKKyAgICAgICAgICAgIGlmIG5vdCB2YWwucmVtYWluZGVyOgorICAgICAgICAgICAgICAgIHJldHVybiB2YWwKIAogICAgIGRlZiBsZXhfYW5kX3BhcnNlKHNlbGYsIHRleHQsIHN0YXJ0c3ltYm9sPSdTdGFydCcpOgogICAgICAgICByZXR1cm4gc2VsZi5wYXJzZShzdGFydHN5bWJvbCwgc2VsZi5sZXgodGV4dCksIGluaXRfYmluZGluZ3M9eycqU1JDKic6IHRleHR9KQpAQCAtNTExLDkgKzUyOCw2IEBACiAgICAgICAgIHJldHVybiBjb21wbGV0aW9ucwogCiAKLWltcG9ydCBzeXMKLQotCiBjbGFzcyBEZWJ1Z290cm9uKHNldCk6CiAgICAgZGVwdGggPSAxMAogCkBAIC01MjUsOSArNTM5LDkgQEAKICAgICAgICAgc2VsZi5fbm90ZV9hZGRpdGlvbihpdGVtKQogICAgICAgICBzZXQuYWRkKHNlbGYsIGl0ZW0pCiAKLSAgICBkZWYgX25vdGVfYWRkaXRpb24oc2VsZiwgZm9vKToKLSAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoIlxuaXRlbSAlciBhZGRlZCBieTpcbiIgJSAoZm9vLCkpCi0gICAgICAgIGZyYW1lID0gc3lzLl9nZXRmcmFtZSgpLmZfYmFjay5mX2JhY2sKKyAgICBkZWYgX25vdGVfYWRkaXRpb24oc2VsZiwgaXRlbSk6CisgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKCJcbml0ZW0gJXIgYWRkZWQgYnk6XG4iICUgKGl0ZW0sKSkKKyAgICAgICAgZnJhbWUgPSBpbnNwZWN0LmN1cnJlbnRmcmFtZSgpLmZfYmFjay5mX2JhY2sKICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5kZXB0aCk6CiAgICAgICAgICAgICBuYW1lID0gZnJhbWUuZl9jb2RlLmNvX25hbWUKICAgICAgICAgICAgIGZpbGVuYW1lID0gZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCmRpZmYgLS1naXQgYS9weWxpYi9jcWxzaGxpYi90ZXN0L3Rlc3RfY3Fsc2hfY29tcGxldGlvbi5weSBiL3B5bGliL2NxbHNobGliL3Rlc3QvdGVzdF9jcWxzaF9jb21wbGV0aW9uLnB5CmluZGV4IGFmOWQwNWUuLmIwZjBiODcgMTAwNjQ0Ci0tLSBhL3B5bGliL2NxbHNobGliL3Rlc3QvdGVzdF9jcWxzaF9jb21wbGV0aW9uLnB5CisrKyBiL3B5bGliL2NxbHNobGliL3Rlc3QvdGVzdF9jcWxzaF9jb21wbGV0aW9uLnB5CkBAIC0xMjgsNyArMTI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwbGl0X2NvbXBsZXRlZF9saW5lcz1zcGxpdF9jb21wbGV0ZWRfbGluZXMpCiAKICAgICAgICAgaWYgaW1tZWRpYXRlOgotICAgICAgICAgICAgbXNnID0gJ2NxbHNoIGNvbXBsZXRlZCAlciwgYnV0IHdlIGV4cGVjdGVkICVyJyAlIChjb21wbGV0ZWQsIGltbWVkaWF0ZSkKKyAgICAgICAgICAgIG1zZyA9ICdjcWxzaCBjb21wbGV0ZWQgJXIgKCVkKSwgYnV0IHdlIGV4cGVjdGVkICVyICglZCknICUgKGNvbXBsZXRlZCwgbGVuKGNvbXBsZXRlZCksIGltbWVkaWF0ZSwgbGVuKGltbWVkaWF0ZSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXRlZCwgaW1tZWRpYXRlLCBtc2c9bXNnKQogICAgICAgICAgICAgcmV0dXJuCiAKQEAgLTE2NCw3ICsxNjQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ09QWScsICdDUkVBVEUnLCAnREVCVUcnLCAnREVMRVRFJywgJ0RFU0MnLCAnREVTQ1JJQkUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRFJPUCcsICdHUkFOVCcsICdIRUxQJywgJ0lOU0VSVCcsICdMSVNUJywgJ0xPR0lOJywgJ1BBR0lORycsICdSRVZPS0UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU0VMRUNUJywgJ1NIT1cnLCAnU09VUkNFJywgJ1RSQUNJTkcnLCAnRVhQQU5EJywgJ1NFUklBTCcsICdUUlVOQ0FURScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVUERBVEUnLCAnVVNFJywgJ2V4aXQnLCAncXVpdCcsICdDTEVBUicsICdDTFMnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VQREFURScsICdVU0UnLCAnZXhpdCcsICdxdWl0JywgJ0NMRUFSJywgJ0NMUycsICdoaXN0b3J5JykpCiAKICAgICBkZWYgdGVzdF9jb21wbGV0ZV9jb21tYW5kX3dvcmRzKHNlbGYpOgogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdhbHQnLCAnXGJcYlxiQUxURVIgJykKQEAgLTI1MCw3ICsyNTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgJ0NSRUFURScsICdERUJVRycsICdERUxFVEUnLCAnREVTQycsICdERVNDUklCRScsICdEUk9QJywKICAgICAgICAgICAgICAgICAgICAgICdFWFBBTkQnLCAnR1JBTlQnLCAnSEVMUCcsICdJTlNFUlQnLCAnTElTVCcsICdMT0dJTicsICdQQUdJTkcnLAogICAgICAgICAgICAgICAgICAgICAgJ1JFVk9LRScsICdTRUxFQ1QnLCAnU0hPVycsICdTT1VSQ0UnLCAnU0VSSUFMJywgJ1RSQUNJTkcnLAotICAgICAgICAgICAgICAgICAgICAgJ1RSVU5DQVRFJywgJ1VQREFURScsICdVU0UnLCAnZXhpdCcsICdxdWl0JywKKyAgICAgICAgICAgICAgICAgICAgICdUUlVOQ0FURScsICdVUERBVEUnLCAnVVNFJywgJ2V4aXQnLCAnaGlzdG9yeScsICdxdWl0JywKICAgICAgICAgICAgICAgICAgICAgICdDTEVBUicsICdDTFMnXSkKIAogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKApAQCAtNDg5LDggKzQ4OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYiA9ICdlZ2dzJyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WydBTkQnLCAnSUYnLCAnOyddKQogCi0gICAgZGVmIHRlc3RfY29tcGxldGVfaW5fYmF0Y2goc2VsZik6Ci0gICAgICAgIHBhc3MKKyAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9iZWdpbl9iYXRjaChzZWxmKToKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQkVHSU4gJywgY2hvaWNlcz1bJ0JBVENIJywgJ0NPVU5URVInLCAnVU5MT0dHRUQnXSkKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQkVHSU4gQkFUQ0ggJywgY2hvaWNlcz1bJ0RFTEVURScsICdJTlNFUlQnLCAnVVBEQVRFJywgJ1VTSU5HJ10pCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0JFR0lOIEJBVENIIElOU0VSVCAnLCBpbW1lZGlhdGU9J0lOVE8gJyApCiAKICAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9jcmVhdGVfa2V5c3BhY2Uoc2VsZik6CiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ2NyZWF0ZSBrZXlzcGFjZSAnLCAnJywgY2hvaWNlcz0oJzxpZGVudGlmaWVyPicsICc8cXVvdGVkTmFtZT4nLCAnSUYnKSkKQEAgLTU2Niw2ICs1NjgsMjMgQEAKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnRFJPUCBLRVlTUEFDRSBJJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW1lZGlhdGU9J0YgRVhJU1RTICcgKyBzZWxmLmNxbHNoLmtleXNwYWNlICsgJyA7JykKIAorICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2luX2NyZWF0ZV90eXBlKHNlbGYpOgorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdDUkVBVEUgVFlQRSBmb28gJywgY2hvaWNlcz1bJygnLCAnLiddKQorCisgICAgZGVmIHRlc3RfY29tcGxldGVfaW5fZHJvcF90eXBlKHNlbGYpOgorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdEUk9QIFRZUEUgJywgY2hvaWNlcz1bJ0lGJywgJ3N5c3RlbV92aWV3cy4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0YWdzJywgJ3N5c3RlbV90cmFjZXMuJywgJ3N5c3RlbV9kaXN0cmlidXRlZC4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwaG9uZV9udW1iZXInLCAncXVvdGVfdWR0JywgJ2JhbmRfaW5mb190eXBlJywgJ2FkZHJlc3MnLCAnc3lzdGVtLicsICdzeXN0ZW1fc2NoZW1hLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbV9hdXRoLicsICdzeXN0ZW1fdmlydHVhbF9zY2hlbWEuJywgc2VsZi5jcWxzaC5rZXlzcGFjZSArICcuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9jcmVhdGVfdHJpZ2dlcihzZWxmKToKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQ1JFQVRFIFRSSUdHRVIgJywgY2hvaWNlcz1bJzxpZGVudGlmaWVyPicsICc8cXVvdGVkTmFtZT4nLCAnSUYnIF0pCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0NSRUFURSBUUklHR0VSIGZvbyAnLCBpbW1lZGlhdGU9J09OICcgKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdDUkVBVEUgVFJJR0dFUiBmb28gT04gJywgY2hvaWNlcz1bJ3N5c3RlbS4nLCAnc3lzdGVtX2F1dGguJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzdGVtX2Rpc3RyaWJ1dGVkLicsICdzeXN0ZW1fc2NoZW1hLicsICdzeXN0ZW1fdHJhY2VzLicsICdzeXN0ZW1fdmlld3MuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzdGVtX3ZpcnR1YWxfc2NoZW1hLicgXSwgb3RoZXJfY2hvaWNlc19vaz1UcnVlKQorCiAgICAgZGVmIGNyZWF0ZV9jb2x1bW5mYW1pbHlfdGFibGVfdGVtcGxhdGUoc2VsZiwgbmFtZSk6CiAgICAgICAgICIiIlBhcmFtZXRlcml6ZWQgdGVzdCBmb3IgQ1JFQVRFIENPTFVNTkZBTUlMWSBhbmQgQ1JFQVRFIFRBQkxFLiBTaW5jZQogICAgICAgICB0aGV5J3JlIHN5bm9ueW1zLCB0aGV5IHNob3VsZCBoYXZlIHRoZSBzYW1lIGNvbXBsZXRpb24gYmVoYXZpb3IsIHNvIHRoaXMKQEAgLTYwMSw3ICs2MjAsMTIgQEAKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucyhwcmVmaXggKyAnIG5ld190YWJsZSAoY29sX2EgaW5lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW1lZGlhdGU9J3QgJykKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucyhwcmVmaXggKyAnIG5ld190YWJsZSAoY29sX2EgaW50ICcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJywnLCAnUFJJTUFSWSddKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WycsJywgJ01BU0tFRCcsICdQUklNQVJZJ10pCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMocHJlZml4ICsgJyBuZXdfdGFibGUgKGNvbF9hIGludCBNJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW1lZGlhdGU9J0FTS0VEIFdJVEggJykKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucyhwcmVmaXggKyAnIG5ld190YWJsZSAoY29sX2EgaW50IE1BU0tFRCBXSVRIICcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ0RFRkFVTFQnLCBzZWxmLmNxbHNoLmtleXNwYWNlICsgJy4nLCAnc3lzdGVtLiddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2Nob2ljZXNfb2s9VHJ1ZSkKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucyhwcmVmaXggKyAnIG5ld190YWJsZSAoY29sX2EgaW50IFAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZT0nUklNQVJZIEtFWSAnKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKHByZWZpeCArICcgbmV3X3RhYmxlIChjb2xfYSBpbnQgUFJJTUFSWSBLRVkgJywKQEAgLTYxNiwxOSArNjQwLDI1IEBACiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMocHJlZml4ICsgJyBuZXdfdGFibGUgKGNvbF9hIGludCBQUklNQVJZIEtFWSkgVycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlPSdJVEggJykKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucyhwcmVmaXggKyAnIG5ld190YWJsZSAoY29sX2EgaW50IFBSSU1BUlkgS0VZKSBXSVRIICcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ2Jsb29tX2ZpbHRlcl9mcF9jaGFuY2UnLCAnY29tcGFjdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ2FsbG93X2F1dG9fc25hcHNob3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdibG9vbV9maWx0ZXJfZnBfY2hhbmNlJywgJ2NvbXBhY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wcmVzc2lvbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRfdGltZV90b19saXZlJywgJ2djX2dyYWNlX3NlY29uZHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNyZW1lbnRhbF9iYWNrdXBzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4X2luZGV4X2ludGVydmFsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVtdGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtZW10YWJsZV9mbHVzaF9wZXJpb2RfaW5fbXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDTFVTVEVSSU5HJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ09NUEFDVCcsICdjYWNoaW5nJywgJ2NvbW1lbnQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtaW5faW5kZXhfaW50ZXJ2YWwnLCAnc3BlY3VsYXRpdmVfcmV0cnknLCAnYWRkaXRpb25hbF93cml0ZV9wb2xpY3knLCAnY2RjJywgJ3JlYWRfcmVwYWlyJ10pCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMocHJlZml4ICsgJyBuZXdfdGFibGUgKGNvbF9hIGludCBQUklNQVJZIEtFWSkgV0lUSCAnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WydibG9vbV9maWx0ZXJfZnBfY2hhbmNlJywgJ2NvbXBhY3Rpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WydhbGxvd19hdXRvX3NuYXBzaG90JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmxvb21fZmlsdGVyX2ZwX2NoYW5jZScsICdjb21wYWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcHJlc3Npb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0X3RpbWVfdG9fbGl2ZScsICdnY19ncmFjZV9zZWNvbmRzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVtZW50YWxfYmFja3VwcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heF9pbmRleF9pbnRlcnZhbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lbXRhYmxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVtdGFibGVfZmx1c2hfcGVyaW9kX2luX21zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ0xVU1RFUklORycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NPTVBBQ1QnLCAnY2FjaGluZycsICdjb21tZW50JywKQEAgLTY0NCw3ICs2NzQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInsnY2xhc3MnOiAnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3knLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSddKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKHByZWZpeCArICIgbmV3X3RhYmxlIChjb2xfYSBpbnQgUFJJTUFSWSBLRVkpIFdJVEggY29tcGFjdGlvbiA9ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ7J2NsYXNzJzogJ1MiLApAQCAtNjczLDIzICs3MDIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnOycsICdBTkQnXSkKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucyhwcmVmaXggKyAiIG5ld190YWJsZSAoY29sX2EgaW50IFBSSU1BUlkgS0VZKSBXSVRIIGNvbXBhY3Rpb24gPSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAieydjbGFzcyc6ICdTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J30gQU5EICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ2Jsb29tX2ZpbHRlcl9mcF9jaGFuY2UnLCAnY29tcGFjdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ2FsbG93X2F1dG9fc25hcHNob3QnLCAnYmxvb21fZmlsdGVyX2ZwX2NoYW5jZScsICdjb21wYWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcHJlc3Npb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0X3RpbWVfdG9fbGl2ZScsICdnY19ncmFjZV9zZWNvbmRzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jcmVtZW50YWxfYmFja3VwcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heF9pbmRleF9pbnRlcnZhbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lbXRhYmxlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWVtdGFibGVfZmx1c2hfcGVyaW9kX2luX21zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ0xVU1RFUklORycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NPTVBBQ1QnLCAnY2FjaGluZycsICdjb21tZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWluX2luZGV4X2ludGVydmFsJywgJ3NwZWN1bGF0aXZlX3JldHJ5JywgJ2FkZGl0aW9uYWxfd3JpdGVfcG9saWN5JywgJ2NkYycsICdyZWFkX3JlcGFpciddKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKHByZWZpeCArICIgbmV3X3RhYmxlIChjb2xfYSBpbnQgUFJJTUFSWSBLRVkpIFdJVEggY29tcGFjdGlvbiA9ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ7J2NsYXNzJzogJ0RhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3knLCAnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnYmFzZV90aW1lX3NlY29uZHMnLCAnbWF4X3NzdGFibGVfYWdlX2RheXMnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aW1lc3RhbXBfcmVzb2x1dGlvbicsICdtaW5fdGhyZXNob2xkJywgJ2NsYXNzJywgJ21heF90aHJlc2hvbGQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0b21ic3RvbmVfY29tcGFjdGlvbl9pbnRlcnZhbCcsICd0b21ic3RvbmVfdGhyZXNob2xkJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5hYmxlZCcsICd1bmNoZWNrZWRfdG9tYnN0b25lX2NvbXBhY3Rpb24nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXhfd2luZG93X3NpemVfc2Vjb25kcycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29ubHlfcHVyZ2VfcmVwYWlyZWRfdG9tYnN0b25lcycsICdwcm92aWRlX292ZXJsYXBwaW5nX3RvbWJzdG9uZXMnXSkKLSAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucyhwcmVmaXggKyAiIG5ld190YWJsZSAoY29sX2EgaW50IFBSSU1BUlkgS0VZKSBXSVRIIGNvbXBhY3Rpb24gPSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAieydjbGFzcyc6ICdUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5JywgJyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ2NvbXBhY3Rpb25fd2luZG93X3VuaXQnLCAnY29tcGFjdGlvbl93aW5kb3dfc2l6ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbWVzdGFtcF9yZXNvbHV0aW9uJywgJ21pbl90aHJlc2hvbGQnLCAnY2xhc3MnLCAnbWF4X3RocmVzaG9sZCcsCkBAIC04MjIsMjQgKzg0NSwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZ2dtYXgnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9jaG9pY2VzX29rPVRydWUpCiAKLSAgICAjIFRPRE86IENBU1NBTkRSQS0xNjY0MAotICAgICMgZGVmIHRlc3RfY29tcGxldGVfaW5fZHJvcF9jb2x1bW5mYW1pbHkoc2VsZik6Ci0gICAgIyAgICAgcGFzcwotICAgICMKLSAgICAjIGRlZiB0ZXN0X2NvbXBsZXRlX2luX3RydW5jYXRlKHNlbGYpOgotICAgICMgICAgIHBhc3MKLSAgICAjCi0gICAgIyBkZWYgdGVzdF9jb21wbGV0ZV9pbl9hbHRlcl9jb2x1bW5mYW1pbHkoc2VsZik6Ci0gICAgIyAgICAgcGFzcwotICAgICMKLSAgICAjIGRlZiB0ZXN0X2NvbXBsZXRlX2luX3VzZShzZWxmKToKLSAgICAjICAgICBwYXNzCi0gICAgIwotICAgICMgZGVmIHRlc3RfY29tcGxldGVfaW5fY3JlYXRlX2luZGV4KHNlbGYpOgotICAgICMgICAgIHBhc3MKLSAgICAjCi0gICAgIyBkZWYgdGVzdF9jb21wbGV0ZV9pbl9kcm9wX2luZGV4KHNlbGYpOgotICAgICMgICAgIHBhc3MKKyAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9kcm9wX3RhYmxlKHNlbGYpOgorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdEUk9QIFQnLCBjaG9pY2VzPVsnVEFCTEUnLCAnVFJJR0dFUicsICdUWVBFJ10pCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0RST1AgVEEnLCBpbW1lZGlhdGU9J0JMRSAnKQorCisgICAgZGVmIHRlc3RfY29tcGxldGVfaW5fdHJ1bmNhdGUoc2VsZik6CisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ1RSJywgY2hvaWNlcz1bJ1RSQUNJTkcnLCAnVFJVTkNBVEUnXSkKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnVFJVJywgaW1tZWRpYXRlPSdOQ0FURSAnKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdUUlVOQ0FURSBUJywgY2hvaWNlcz1bJ1RBQkxFJywgJ3R3ZW50eV9yb3dzX2NvbXBvc2l0ZV90YWJsZScsICd0d2VudHlfcm93c190YWJsZSddKQorCisgICAgZGVmIHRlc3RfY29tcGxldGVfaW5fdXNlKHNlbGYpOgorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdVUycsIGltbWVkaWF0ZT0nRSAnKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdVU0UgJywgY2hvaWNlcz1bc2VsZi5jcWxzaC5rZXlzcGFjZSwgJ3N5c3RlbScsICdzeXN0ZW1fYXV0aCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbV9kaXN0cmlidXRlZCcsICdzeXN0ZW1fc2NoZW1hJywgJ3N5c3RlbV90cmFjZXMnLCAnc3lzdGVtX3ZpZXdzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzdGVtX3ZpcnR1YWxfc2NoZW1hJyBdKQorCisgICAgZGVmIHRlc3RfY29tcGxldGVfaW5fY3JlYXRlX2luZGV4KHNlbGYpOgorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdDUkVBVEUgSScsIGltbWVkaWF0ZT0nTkRFWCAnKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdDUkVBVEUgSU5ERVggJywgY2hvaWNlcz1bJzxuZXdfaW5kZXhfbmFtZT4nLCAnSUYnLCAnT04nXSkKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQ1JFQVRFIElOREVYIGV4YW1wbGUgJywgaW1tZWRpYXRlPSdPTiAnKQorCisgICAgZGVmIHRlc3RfY29tcGxldGVfaW5fZHJvcF9pbmRleChzZWxmKToKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnRFJPUCBJJywgaW1tZWRpYXRlPSdOREVYICcpCiAKICAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9hbHRlcl9rZXlzcGFjZShzZWxmKToKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQUxURVIgS0VZJywgJ1NQQUNFICcpCkBAIC04NTQsNyArODgxLDcgQEAKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygiR1IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbWVkaWF0ZT0nQU5UICcpCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoIkdSQU5UICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ0FMTCcsICdBTFRFUicsICdBVVRIT1JJWkUnLCAnQ1JFQVRFJywgJ0RFU0NSSUJFJywgJ0RST1AnLCAnRVhFQ1VURScsICdNT0RJRlknLCAnU0VMRUNUJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ0FMTCcsICdBTFRFUicsICdBVVRIT1JJWkUnLCAnQ1JFQVRFJywgJ0RFU0NSSUJFJywgJ0RST1AnLCAnRVhFQ1VURScsICdNT0RJRlknLCAnU0VMRUNUJywgJ1VOTUFTSycsICdTRUxFQ1RfTUFTS0VEJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfY2hvaWNlc19vaz1UcnVlKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCJHUkFOVCBNT0RJRlkgIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnLCcsICdPTicsICdQRVJNSVNTSU9OJ10pCkBAIC04NjMsNyArODkwLDcgQEAKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygiR1JBTlQgTU9ESUZZIFBFUk1JU1NJT04gIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnLCcsICdPTiddKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCJHUkFOVCBNT0RJRlkgUEVSTUlTU0lPTiwgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnQUxURVInLCAnQVVUSE9SSVpFJywgJ0NSRUFURScsICdERVNDUklCRScsICdEUk9QJywgJ0VYRUNVVEUnLCAnU0VMRUNUJ10pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ0FMVEVSJywgJ0FVVEhPUklaRScsICdDUkVBVEUnLCAnREVTQ1JJQkUnLCAnRFJPUCcsICdFWEVDVVRFJywgJ1NFTEVDVCcsICdVTk1BU0snLCAnU0VMRUNUX01BU0tFRCddKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCJHUkFOVCBNT0RJRlkgUEVSTUlTU0lPTiwgRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ0RFU0NSSUJFJywgJ0RST1AnXSkKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygiR1JBTlQgTU9ESUZZIFBFUk1JU1NJT04sIERSIiwKQEAgLTg4NSw3ICs5MTIsNyBAQAogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCJSRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlPSdWT0tFICcpCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoIlJFVk9LRSAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WydBTEwnLCAnQUxURVInLCAnQVVUSE9SSVpFJywgJ0NSRUFURScsICdERVNDUklCRScsICdEUk9QJywgJ0VYRUNVVEUnLCAnTU9ESUZZJywgJ1NFTEVDVCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WydBTEwnLCAnQUxURVInLCAnQVVUSE9SSVpFJywgJ0NSRUFURScsICdERVNDUklCRScsICdEUk9QJywgJ0VYRUNVVEUnLCAnTU9ESUZZJywgJ1NFTEVDVCcsICdVTk1BU0snLCAnU0VMRUNUX01BU0tFRCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2Nob2ljZXNfb2s9VHJ1ZSkKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygiUkVWT0tFIE1PRElGWSAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WycsJywgJ09OJywgJ1BFUk1JU1NJT04nXSkKQEAgLTg5NCw3ICs5MjEsNyBAQAogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCJSRVZPS0UgTU9ESUZZIFBFUk1JU1NJT04gIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnLCcsICdPTiddKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCJSRVZPS0UgTU9ESUZZIFBFUk1JU1NJT04sICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bJ0FMVEVSJywgJ0FVVEhPUklaRScsICdDUkVBVEUnLCAnREVTQ1JJQkUnLCAnRFJPUCcsICdFWEVDVVRFJywgJ1NFTEVDVCddKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXM9WydBTFRFUicsICdBVVRIT1JJWkUnLCAnQ1JFQVRFJywgJ0RFU0NSSUJFJywgJ0RST1AnLCAnRVhFQ1VURScsICdTRUxFQ1QnLCAnVU5NQVNLJywgJ1NFTEVDVF9NQVNLRUQnXSkKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygiUkVWT0tFIE1PRElGWSBQRVJNSVNTSU9OLCBEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnREVTQ1JJQkUnLCAnRFJPUCddKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCJSRVZPS0UgTU9ESUZZIFBFUk1JU1NJT04sIERSIiwKQEAgLTkyMCw3ICs5NDcsNyBAQAogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSAnLCBjaG9pY2VzPVsnSUYnLCAndHdlbnR5X3Jvd3NfdGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXNjaWlfd2l0aF9zcGVjaWFsX2NoYXJzJywgJ3VzZXJzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hhc19hbGxfdHlwZXMnLCAnc3lzdGVtLicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbXB0eV9jb21wb3NpdGVfdGFibGUnLCAnZW1wdHlfdGFibGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW1wdHlfY29tcG9zaXRlX3RhYmxlJywgJ2VzY2FwZV9xdW90ZXMnLCAnZW1wdHlfdGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzdGVtX2F1dGguJywgJ3VuZGVmaW5lZF92YWx1ZXNfdGFibGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHluYW1pY19jb2x1bW5zJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R3ZW50eV9yb3dzX2NvbXBvc2l0ZV90YWJsZScsCkBAIC05MzIsMTUgKzk1OSwyOSBAQAogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSBJRiBFWElTVFMgbmV3X3RhYmxlIEFERCAnLCBjaG9pY2VzPVsnPG5ld19jb2x1bW5fbmFtZT4nLCAnSUYnXSkKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQUxURVIgVEFCTEUgSUYgRVhJU1RTIG5ld190YWJsZSBBREQgSUYgTk9UIEVYSVNUUyAnLCBjaG9pY2VzPVsnPG5ld19jb2x1bW5fbmFtZT4nXSkKICAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQUxURVIgVEFCTEUgbmV3X3RhYmxlIEFERCBJRiBOT1QgRVhJU1RTICcsIGNob2ljZXM9Wyc8bmV3X2NvbHVtbl9uYW1lPiddKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSBuZXdfdGFibGUgQUREIGNvbCBpbnQgJywgY2hvaWNlcz1bJzsnLCAnTUFTS0VEJywgJ3N0YXRpYyddKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSBuZXdfdGFibGUgQUREIGNvbCBpbnQgTScsIGltbWVkaWF0ZT0nQVNLRUQgV0lUSCAnKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSBuZXdfdGFibGUgQUREIGNvbCBpbnQgTUFTS0VEIFdJVEggJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnREVGQVVMVCcsIHNlbGYuY3Fsc2gua2V5c3BhY2UgKyAnLicsICdzeXN0ZW0uJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfY2hvaWNlc19vaz1UcnVlKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSBJRiBFWElTVFMgbmV3X3RhYmxlIFJFTkFNRSAnLCBjaG9pY2VzPVsnSUYnLCAnPHF1b3RlZE5hbWU+JywgJzxpZGVudGlmaWVyPiddKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSBuZXdfdGFibGUgUkVOQU1FICcsIGNob2ljZXM9WydJRicsICc8cXVvdGVkTmFtZT4nLCAnPGlkZW50aWZpZXI+J10pCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRBQkxFIElGIEVYSVNUUyBuZXdfdGFibGUgRFJPUCAnLCBjaG9pY2VzPVsnSUYnLCAnPHF1b3RlZE5hbWU+JywgJzxpZGVudGlmaWVyPiddKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSBJRiBFWElTVFMgbmV3X3RhYmxlIEFMVEVSICcsIGNob2ljZXM9WydJRicsICc8cXVvdGVkTmFtZT4nLCAnPGlkZW50aWZpZXI+J10pCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRBQkxFIElGIEVYSVNUUyBuZXdfdGFibGUgQUxURVIgSUYgRScsIGltbWVkaWF0ZT0nWElTVFMgJykKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQUxURVIgVEFCTEUgSUYgRVhJU1RTIG5ld190YWJsZSBBTFRFUiBJRiBFWElTVFMgY29sICcsIGNob2ljZXM9WydNQVNLRUQnLCAnRFJPUCddKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSBJRiBFWElTVFMgbmV3X3RhYmxlIEFMVEVSIElGIEVYSVNUUyBjb2wgTScsIGltbWVkaWF0ZT0nQVNLRUQgV0lUSCAnKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSBJRiBFWElTVFMgbmV3X3RhYmxlIEFMVEVSIElGIEVYSVNUUyBjb2wgTUFTS0VEIFdJVEggJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsnREVGQVVMVCcsIHNlbGYuY3Fsc2gua2V5c3BhY2UgKyAnLicsICdzeXN0ZW0uJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfY2hvaWNlc19vaz1UcnVlKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUQUJMRSBJRiBFWElTVFMgbmV3X3RhYmxlIEFMVEVSIElGIEVYSVNUUyBjb2wgRCcsIGltbWVkaWF0ZT0nUk9QIE1BU0tFRCA7JykKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQUxURVIgVEFCTEUgSUYgRVhJU1RTIG5ld190YWJsZSBBTFRFUiBJRiBFWElTVFMgY29sIERST1AgTScsIGltbWVkaWF0ZT0nQVNLRUQgOycpCiAKICAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9hbHRlcl90eXBlKHNlbGYpOgogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUWVBFIEknLCBpbW1lZGlhdGU9J0YgRVhJU1RTICcpCiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFRZUEUgJywgY2hvaWNlcz1bJ0lGJywgJ3N5c3RlbV92aWV3cy4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0YWdzJywgJ3N5c3RlbV90cmFjZXMuJywgJ3N5c3RlbV9kaXN0cmlidXRlZC4nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwaG9uZV9udW1iZXInLCAnYmFuZF9pbmZvX3R5cGUnLCAnYWRkcmVzcycsICdzeXN0ZW0uJywgJ3N5c3RlbV9zY2hlbWEuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGhvbmVfbnVtYmVyJywgJ3F1b3RlX3VkdCcsICdiYW5kX2luZm9fdHlwZScsICdhZGRyZXNzJywgJ3N5c3RlbS4nLCAnc3lzdGVtX3NjaGVtYS4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXN0ZW1fYXV0aC4nLCAnc3lzdGVtX3ZpcnR1YWxfc2NoZW1hLicsIHNlbGYuY3Fsc2gua2V5c3BhY2UgKyAnLicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBUWVBFIElGIEVYSVNUUyBuZXdfdHlwZSBBREQgJywgY2hvaWNlcz1bJzxuZXdfZmllbGRfbmFtZT4nLCAnSUYnXSkKQEAgLTk1MCw1ICs5OTEsNDQgQEAKICAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9hbHRlcl91c2VyKHNlbGYpOgogICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdBTFRFUiBVU0VSICcsIGNob2ljZXM9Wyc8aWRlbnRpZmllcj4nLCAnSUYnLCAnPHBnU3RyaW5nTGl0ZXJhbD4nLCAnPHF1b3RlZFN0cmluZ0xpdGVyYWw+J10pCiAKKyAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9jcmVhdGVfcm9sZShzZWxmKToKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQ1JFQVRFIFJPTEUgJywgY2hvaWNlcz1bJzxpZGVudGlmaWVyPicsICdJRicsICc8cXVvdGVkTmFtZT4nXSkKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQ1JFQVRFIFJPTEUgSUYgJywgaW1tZWRpYXRlPSdOT1QgRVhJU1RTICcpOworICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdDUkVBVEUgUk9MRSBmb28gV0lUSCAnLCBjaG9pY2VzPVsnQUNDRVNTJywgJ0hBU0hFRCcsICdMT0dJTicsICdPUFRJT05TJywgJ1BBU1NXT1JEJywgJ1NVUEVSVVNFUiddKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdDUkVBVEUgUk9MRSBmb28gV0lUSCBIQVNIRUQgJywgaW1tZWRpYXRlPSdQQVNTV09SRCA9ICcpOworICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdDUkVBVEUgUk9MRSBmb28gV0lUSCBBQ0NFU1MgVE8gJywgY2hvaWNlcz1bJ0FMTCcsICdEQVRBQ0VOVEVSUyddKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdDUkVBVEUgUk9MRSBmb28gV0lUSCBBQ0NFU1MgVE8gQUxMICcsIGltbWVkaWF0ZT0nREFUQUNFTlRFUlMgJykKKwogICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2luX2FsdGVyX3JvbGUoc2VsZik6CiAgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFJPTEUgJywgY2hvaWNlcz1bJzxpZGVudGlmaWVyPicsICdJRicsICc8cXVvdGVkTmFtZT4nXSkKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQUxURVIgUk9MRSBmb28gJywgaW1tZWRpYXRlPSdXSVRIICcpCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ0FMVEVSIFJPTEUgZm9vIFdJVEggJywgY2hvaWNlcz1bJ0FDQ0VTUycsICdIQVNIRUQnLCAnTE9HSU4nLCAnT1BUSU9OUycsICdQQVNTV09SRCcsICdTVVBFUlVTRVInXSkKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnQUxURVIgUk9MRSBmb28gV0lUSCBBQ0NFU1MgVE8gJywgY2hvaWNlcz1bJ0FMTCcsICdEQVRBQ0VOVEVSUyddKQorCisgICAgZGVmIHRlc3RfY29tcGxldGVfaW5fZHJvcF9yb2xlKHNlbGYpOgorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdEUk9QIFJPTEUgJywgY2hvaWNlcz1bJzxpZGVudGlmaWVyPicsICdJRicsICc8cXVvdGVkTmFtZT4nXSkKKworCisgICAgZGVmIHRlc3RfY29tcGxldGVfaW5fbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnTElTVCAnLCBjaG9pY2VzPVsnQUxMJywgJ0FVVEhPUklaRScsICdERVNDUklCRScsICdFWEVDVVRFJywgJ1JPTEVTJywgJ1VTRVJTJywgJ0FMVEVSJywgJ0NSRUFURScsICdEUk9QJywgJ01PRElGWScsICdTRUxFQ1QnLCAnVU5NQVNLJywgJ1NFTEVDVF9NQVNLRUQnXSkKKworCisgICAgIyBOb24tQ1FMIFNoZWxsIENvbW1hbmRzCisKKyAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9jYXB0dXJlKHNlbGYpOgorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdDQVBUVVJFICcsIGNob2ljZXM9WydPRkYnLCAnOycsICc8ZW50ZXI+J10sIG90aGVyX2Nob2ljZXNfb2s9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2luX3BhZ2luZyhzZWxmKToKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnUEFHSU5HICcsIGNob2ljZXM9WydPTicsICdPRkYnLCAnOycsICc8ZW50ZXI+JywgJzx3aG9sZW51bWJlcj4nIF0gKQorICAgICAgICBzZWxmLnRyeWNvbXBsZXRpb25zKCdQQUdJTkcgNTAgJywgY2hvaWNlcz1bJzsnLCAnPGVudGVyPicgXSApCisKKyAgICBkZWYgdGVzdF9jb21wbGV0ZV9pbl9zZXJpYWwoc2VsZik6CisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ1NFUklBTCBDT05TSVNURU5DWSAnLCBjaG9pY2VzPVsnOycsICc8ZW50ZXI+JywgJ0xPQ0FMX1NFUklBTCcsICdTRVJJQUwnXSkKKworICAgIGRlZiB0ZXN0X2NvbXBsZXRlX2luX3Nob3coc2VsZik6CisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ1NIT1cgJywgY2hvaWNlcz1bJ0hPU1QnLCAnUkVQTElDQVMnLCAnU0VTU0lPTicsICdWRVJTSU9OJ10pCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ1NIT1cgU0VTU0lPTiAnLCBjaG9pY2VzPVsnPHV1aWQ+J10pCisgICAgICAgIHNlbGYudHJ5Y29tcGxldGlvbnMoJ1NIT1cgUkVQTElDQVMgJywgY2hvaWNlcz1bJy0nLCAnPHdob2xlbnVtYmVyPiddKQorCisgICAgZGVmIHRlc3RfY29tcGxldGVfaW5fdHJhY2luZyhzZWxmKToKKyAgICAgICAgc2VsZi50cnljb21wbGV0aW9ucygnVFJBQ0lORyAnLCBjaG9pY2VzPVsnOycsICc8ZW50ZXI+JywgJ09GRicsICdPTiddKQpkaWZmIC0tZ2l0IGEvcHlsaWIvY3Fsc2hsaWIvdGVzdC90ZXN0X2NxbHNoX291dHB1dC5weSBiL3B5bGliL2NxbHNobGliL3Rlc3QvdGVzdF9jcWxzaF9vdXRwdXQucHkKaW5kZXggNTJmNTY0YS4uZmUwOGM4ZCAxMDA2NDQKLS0tIGEvcHlsaWIvY3Fsc2hsaWIvdGVzdC90ZXN0X2NxbHNoX291dHB1dC5weQorKysgYi9weWxpYi9jcWxzaGxpYi90ZXN0L3Rlc3RfY3Fsc2hfb3V0cHV0LnB5CkBAIC02NzUsNiArNjc1LDcgQEAKICAgICAgICAgICAgICAgICB2YXJjaGFyY29sIHRleHQsCiAgICAgICAgICAgICAgICAgdmFyaW50Y29sIHZhcmludAogICAgICAgICAgICAgKSBXSVRIIGFkZGl0aW9uYWxfd3JpdGVfcG9saWN5ID0gJzk5cCcKKyAgICAgICAgICAgICAgICBBTkQgYWxsb3dfYXV0b19zbmFwc2hvdCA9IHRydWUKICAgICAgICAgICAgICAgICBBTkQgYmxvb21fZmlsdGVyX2ZwX2NoYW5jZSA9IDAuMDEKICAgICAgICAgICAgICAgICBBTkQgY2FjaGluZyA9IHsna2V5cyc6ICdBTEwnLCAncm93c19wZXJfcGFydGl0aW9uJzogJ05PTkUnfQogICAgICAgICAgICAgICAgIEFORCBjZGMgPSBmYWxzZQpAQCAtNjg2LDYgKzY4Nyw3IEBACiAgICAgICAgICAgICAgICAgQU5EIGRlZmF1bHRfdGltZV90b19saXZlID0gMAogICAgICAgICAgICAgICAgIEFORCBleHRlbnNpb25zID0ge30KICAgICAgICAgICAgICAgICBBTkQgZ2NfZ3JhY2Vfc2Vjb25kcyA9IDg2NDAwMAorICAgICAgICAgICAgICAgIEFORCBpbmNyZW1lbnRhbF9iYWNrdXBzID0gdHJ1ZQogICAgICAgICAgICAgICAgIEFORCBtYXhfaW5kZXhfaW50ZXJ2YWwgPSAyMDQ4CiAgICAgICAgICAgICAgICAgQU5EIG1lbXRhYmxlX2ZsdXNoX3BlcmlvZF9pbl9tcyA9IDAKICAgICAgICAgICAgICAgICBBTkQgbWluX2luZGV4X2ludGVydmFsID0gMTI4CkBAIC05MzYsMyArOTM4LDUxIEBACiAgICAgICAgIHJvd19oZWFkZXJzID0gW3MgZm9yIHMgaW4gb3V0cHV0LnNwbGl0bGluZXMoKSBpZiAiQCBSb3ciIGluIHNdCiAgICAgICAgIHJvd19pZHMgPSBbaW50KHMuc3BsaXQoJyAnKVsyXSkgZm9yIHMgaW4gcm93X2hlYWRlcnNdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2kgZm9yIGkgaW4gcmFuZ2UoMSwgMjEpXSwgcm93X2lkcykKKworICAgIGRlZiB0ZXN0X3F1b3RlZF9vdXRwdXRfdGV4dF9pbl9tYXAoc2VsZik6CisgICAgICAgIGtzID0gZ2V0X2tleXNwYWNlKCkKKworICAgICAgICBxdWVyeSA9ICJTRUxFQ1QgdGV4dF9kYXRhIEZST00gIiArIGtzICsgIi5lc2NhcGVfcXVvdGVzOyIKKyAgICAgICAgb3V0cHV0LCByZXN1bHQgPSB0ZXN0Y2FsbF9jcWxzaChwcm9tcHQ9Tm9uZSwgZW52PXNlbGYuZGVmYXVsdF9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dHk9RmFsc2UsIGlucHV0PXF1ZXJ5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQuc3BsaXRsaW5lcygpWzNdLnN0cmlwKCksICJJJ20gbmV3YiIpCisKKyAgICAgICAgcXVlcnkgPSAiU0VMRUNUIG1hcF9kYXRhIEZST00gIiArIGtzICsgIi5lc2NhcGVfcXVvdGVzOyIKKyAgICAgICAgb3V0cHV0LCByZXN1bHQgPSB0ZXN0Y2FsbF9jcWxzaChwcm9tcHQ9Tm9uZSwgZW52PXNlbGYuZGVmYXVsdF9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eT1GYWxzZSwgaW5wdXQ9cXVlcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5zcGxpdGxpbmVzKClbM10uc3RyaXAoKSwgInsxOiAnSScnbSBuZXdiJ30iKQorCisgICAgZGVmIHRlc3RfcXVvdGVkX291dHB1dF90ZXh0X2luX3NpbXBsZV9jb2xsZWN0aW9ucyhzZWxmKToKKyAgICAgICAga3MgPSBnZXRfa2V5c3BhY2UoKQorCisgICAgICAgICMgU2V0cworICAgICAgICBxdWVyeSA9ICJTRUxFQ1Qgc2V0X2RhdGEgRlJPTSAiICsga3MgKyAiLmVzY2FwZV9xdW90ZXM7IgorICAgICAgICBvdXRwdXQsIHJlc3VsdCA9IHRlc3RjYWxsX2NxbHNoKHByb21wdD1Ob25lLCBlbnY9c2VsZi5kZWZhdWx0X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHR5PUZhbHNlLCBpbnB1dD1xdWVyeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LnNwbGl0bGluZXMoKVszXS5zdHJpcCgpLCAieydJJydtIG5ld2InfSIpCisKKyAgICAgICAgIyBMaXN0cworICAgICAgICBxdWVyeSA9ICJTRUxFQ1QgbGlzdF9kYXRhIEZST00gIiArIGtzICsgIi5lc2NhcGVfcXVvdGVzOyIKKyAgICAgICAgb3V0cHV0LCByZXN1bHQgPSB0ZXN0Y2FsbF9jcWxzaChwcm9tcHQ9Tm9uZSwgZW52PXNlbGYuZGVmYXVsdF9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eT1GYWxzZSwgaW5wdXQ9cXVlcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5zcGxpdGxpbmVzKClbM10uc3RyaXAoKSwgIlsnSScnbSBuZXdiJ10iKQorCisgICAgICAgICMgVHVwbGVzCisgICAgICAgIHF1ZXJ5ID0gIlNFTEVDVCB0dXBsZV9kYXRhIEZST00gIiArIGtzICsgIi5lc2NhcGVfcXVvdGVzOyIKKyAgICAgICAgb3V0cHV0LCByZXN1bHQgPSB0ZXN0Y2FsbF9jcWxzaChwcm9tcHQ9Tm9uZSwgZW52PXNlbGYuZGVmYXVsdF9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0eT1GYWxzZSwgaW5wdXQ9cXVlcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5zcGxpdGxpbmVzKClbM10uc3RyaXAoKSwgIigxLCAnSScnbSBuZXdiJykiKQorCisgICAgZGVmIHRlc3RfcXVvdGVkX291dHB1dF90ZXh0X2luX3VkdHMoc2VsZik6CisgICAgICAgIGtzID0gZ2V0X2tleXNwYWNlKCkKKworICAgICAgICBxdWVyeSA9ICJTRUxFQ1QgdWR0X2RhdGEgRlJPTSAiICsga3MgKyAiLmVzY2FwZV9xdW90ZXM7IgorICAgICAgICBvdXRwdXQsIHJlc3VsdCA9IHRlc3RjYWxsX2NxbHNoKHByb21wdD1Ob25lLCBlbnY9c2VsZi5kZWZhdWx0X2VudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHR5PUZhbHNlLCBpbnB1dD1xdWVyeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LnNwbGl0bGluZXMoKVszXS5zdHJpcCgpLCAie2RhdGE6ICdJJydtIG5ld2InfSIpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcHlsaWIvY3Fsc2hsaWIvdGVzdC90ZXN0X2tleXNwYWNlX2luaXQuY3FsIGIvcHlsaWIvY3Fsc2hsaWIvdGVzdC90ZXN0X2tleXNwYWNlX2luaXQuY3FsCmluZGV4IDk2YmY5ZWEuLjVmZjQxMDggMTAwNjQ0Ci0tLSBhL3B5bGliL2NxbHNobGliL3Rlc3QvdGVzdF9rZXlzcGFjZV9pbml0LmNxbAorKysgYi9weWxpYi9jcWxzaGxpYi90ZXN0L3Rlc3Rfa2V5c3BhY2VfaW5pdC5jcWwKQEAgLTY5LDkgKzY5LDkgQEAKIElOU0VSVCBJTlRPIGhhc19hbGxfdHlwZXMgKG51bSwgaW50Y29sLCBhc2NpaWNvbCwgYmlnaW50Y29sLCBibG9iY29sLCBib29sZWFuY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbGNvbCwgZG91YmxlY29sLCBmbG9hdGNvbCwgc21hbGxpbnRjb2wsIHRleHRjb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBjb2wsIHRpbnlpbnRjb2wsIHV1aWRjb2wsIHZhcmNoYXJjb2wsIHZhcmludGNvbCkKLVZBTFVFUyAoNCwgYmxvYkFzSW50KDB4KSwgJycsIGJsb2JBc0JpZ2ludCgweCksIDB4LCBibG9iQXNCb29sZWFuKDB4KSwKLQlibG9iQXNEZWNpbWFsKDB4KSwgYmxvYkFzRG91YmxlKDB4KSwgYmxvYkFzRmxvYXQoMHgpLCBibG9iQXNTbWFsbEludCgweDAwMDApLCAnJywKLQlibG9iQXNUaW1lc3RhbXAoMHgpLCBibG9iQXNUaW55SW50KDB4MDApLCBibG9iQXNVdWlkKDB4KSwgJycsIGJsb2JBc1ZhcmludCgweCkpOworVkFMVUVTICg0LCBibG9iX2FzX2ludCgweCksICcnLCBibG9iX2FzX2JpZ2ludCgweCksIDB4LCBibG9iX2FzX2Jvb2xlYW4oMHgpLAorCWJsb2JfYXNfZGVjaW1hbCgweCksIGJsb2JfYXNfZG91YmxlKDB4KSwgYmxvYl9hc19mbG9hdCgweCksIGJsb2JfYXNfc21hbGxJbnQoMHgwMDAwKSwgJycsCisJYmxvYl9hc190aW1lc3RhbXAoMHgpLCBibG9iX2FzX3RpbnlpbnQoMHgwMCksIGJsb2JfYXNfdXVpZCgweCksICcnLCBibG9iX2FzX3ZhcmludCgweCkpOwogCiAKIApAQCAtMTQxLDEzICsxNDEsMTMgQEAKICk7CiAKIC0tICJuZXdsaW5lOlxuIgotSU5TRVJUIElOVE8gYXNjaWlfd2l0aF9zcGVjaWFsX2NoYXJzIChrLCB2YWwpIFZBTFVFUyAoMCwgYmxvYkFzQXNjaWkoMHg2ZTY1Nzc2YzY5NmU2NTNhMGEpKTsKK0lOU0VSVCBJTlRPIGFzY2lpX3dpdGhfc3BlY2lhbF9jaGFycyAoaywgdmFsKSBWQUxVRVMgKDAsIGJsb2JfYXNfYXNjaWkoMHg2ZTY1Nzc2YzY5NmU2NTNhMGEpKTsKIC0tICJyZXR1cm5ccmFuZCBudWxsXDAhIgotSU5TRVJUIElOVE8gYXNjaWlfd2l0aF9zcGVjaWFsX2NoYXJzIChrLCB2YWwpIFZBTFVFUyAoMSwgYmxvYkFzQXNjaWkoMHg3MjY1NzQ3NTcyNmUwZDYxNmU2NDIwNmU3NTZjNmMwMDIxKSk7CitJTlNFUlQgSU5UTyBhc2NpaV93aXRoX3NwZWNpYWxfY2hhcnMgKGssIHZhbCkgVkFMVUVTICgxLCBibG9iX2FzX2FzY2lpKDB4NzI2NTc0NzU3MjZlMGQ2MTZlNjQyMDZlNzU2YzZjMDAyMSkpOwogLS0gIlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNWNvbnRyb2wgY2hhcnNceDA2XHgwNyIKLUlOU0VSVCBJTlRPIGFzY2lpX3dpdGhfc3BlY2lhbF9jaGFycyAoaywgdmFsKSBWQUxVRVMgKDIsIGJsb2JBc0FzY2lpKDB4MDAwMTAyMDMwNDA1NjM2ZjZlNzQ3MjZmNmMyMDYzNjg2MTcyNzMwNjA3KSk7CitJTlNFUlQgSU5UTyBhc2NpaV93aXRoX3NwZWNpYWxfY2hhcnMgKGssIHZhbCkgVkFMVUVTICgyLCBibG9iX2FzX2FzY2lpKDB4MDAwMTAyMDMwNDA1NjM2ZjZlNzQ3MjZmNmMyMDYzNjg2MTcyNzMwNjA3KSk7CiAtLSAiZmFrZSBzcGVjaWFsIGNoYXJzXFx4MDBcXG4iCi1JTlNFUlQgSU5UTyBhc2NpaV93aXRoX3NwZWNpYWxfY2hhcnMgKGssIHZhbCkgVkFMVUVTICgzLCBibG9iQXNBc2NpaSgweDY2NjE2YjY1MjA3MzcwNjU2MzY5NjE2YzIwNjM2ODYxNzI3MzVjNzgzMDMwNWM2ZSkpOworSU5TRVJUIElOVE8gYXNjaWlfd2l0aF9zcGVjaWFsX2NoYXJzIChrLCB2YWwpIFZBTFVFUyAoMywgYmxvYl9hc19hc2NpaSgweDY2NjE2YjY1MjA3MzcwNjU2MzY5NjE2YzIwNjM2ODYxNzI3MzVjNzgzMDMwNWM2ZSkpOwogCiAKIApAQCAtMjgwLDI2ICsyODAsMjYgQEAKIAogQ1JFQVRFIEZVTkNUSU9OIGZCZXN0YmFuZCAoIGlucHV0IGRvdWJsZSApCiAgICAgUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQKLSAgICBSRVRVUk5TIHRleHQgCisgICAgUkVUVVJOUyB0ZXh0CiAgICAgTEFOR1VBR0UgamF2YQogICAgIEFTICdyZXR1cm4gIklyb24gTWFpZGVuIjsnOwogCiBDUkVBVEUgRlVOQ1RJT04gZkJlc3Rzb25nICggaW5wdXQgZG91YmxlICkKICAgICBSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVAotICAgIFJFVFVSTlMgdGV4dCAKKyAgICBSRVRVUk5TIHRleHQKICAgICBMQU5HVUFHRSBqYXZhCiAgICAgQVMgJ3JldHVybiAiUmV2ZWxhdGlvbnMiOyc7CiAKIENSRUFURSBGVU5DVElPTiBmTWF4KGN1cnJlbnQgaW50LCBjYW5kaWRhdGUgaW50KQogICAgIENBTExFRCBPTiBOVUxMIElOUFVUCi0gICAgUkVUVVJOUyBpbnQgCi0gICAgTEFOR1VBR0UgamF2YSAKKyAgICBSRVRVUk5TIGludAorICAgIExBTkdVQUdFIGphdmEKICAgICBBUyAnaWYgKGN1cnJlbnQgPT0gbnVsbCkgcmV0dXJuIGNhbmRpZGF0ZTsgZWxzZSByZXR1cm4gTWF0aC5tYXgoY3VycmVudCwgY2FuZGlkYXRlKTsnIDsKIAogQ1JFQVRFIEZVTkNUSU9OIGZNaW4oY3VycmVudCBpbnQsIGNhbmRpZGF0ZSBpbnQpCiAgICAgQ0FMTEVEIE9OIE5VTEwgSU5QVVQKICAgICBSRVRVUk5TIGludAotICAgIExBTkdVQUdFIGphdmEgCisgICAgTEFOR1VBR0UgamF2YQogICAgIEFTICdpZiAoY3VycmVudCA9PSBudWxsKSByZXR1cm4gY2FuZGlkYXRlOyBlbHNlIHJldHVybiBNYXRoLm1pbihjdXJyZW50LCBjYW5kaWRhdGUpOycgOwogCiBDUkVBVEUgQUdHUkVHQVRFIGFnZ01heChpbnQpCkBAIC0zMTIsMyArMzEyLDE4IEBACiAgICAgU1RZUEUgaW50CiAgICAgSU5JVENPTkQgbnVsbDsKIAorQ1JFQVRFIFRZUEUgcXVvdGVfdWR0ICgKKyAgICBkYXRhIHRleHQKKyk7CisKK0NSRUFURSBUQUJMRSBlc2NhcGVfcXVvdGVzICgKKyAgICBpZCBpbnQgUFJJTUFSWSBLRVksCisgICAgdGV4dF9kYXRhIHRleHQsCisgICAgbWFwX2RhdGEgbWFwPGludCwgdGV4dD4sCisgICAgc2V0X2RhdGEgc2V0PHRleHQ+LAorICAgIGxpc3RfZGF0YSBsaXN0PHRleHQ+LAorICAgIHR1cGxlX2RhdGEgdHVwbGU8aW50LCB0ZXh0PiwKKyAgICB1ZHRfZGF0YSBmcm96ZW48cXVvdGVfdWR0PgorKTsKKworSU5TRVJUIElOVE8gZXNjYXBlX3F1b3RlcyAoaWQsIHRleHRfZGF0YSwgbWFwX2RhdGEsIHNldF9kYXRhLCBsaXN0X2RhdGEsIHR1cGxlX2RhdGEsIHVkdF9kYXRhKSB2YWx1ZXMoMSwgJ0knJ20gbmV3YicsIHsxOidJJydtIG5ld2InfSwgeydJJydtIG5ld2InfSwgWydJJydtIG5ld2InXSwgKDEsICdJJydtIG5ld2InKSwge2RhdGE6ICdJJydtIG5ld2InfSk7CmRpZmYgLS1naXQgYS9weWxpYi9jcWxzaGxpYi93Y3dpZHRoLnB5IGIvcHlsaWIvY3Fsc2hsaWIvd2N3aWR0aC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlM2FmMi4uMDAwMDAwMAotLS0gYS9weWxpYi9jcWxzaGxpYi93Y3dpZHRoLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgYWRhcHRlZCBmcm9tIGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91Y3Mvd2N3aWR0aC5jCi0jIC10aGVwYXVsCi0KLSMgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB3Y3dpZHRoKCkgYW5kIHdjc3dpZHRoKCkgKGRlZmluZWQgaW4KLSMgSUVFRSBTdGQgMTAwMi4xLTIwMDEpIGZvciBVbmljb2RlLgotIwotIyBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvZnVuY3Rpb25zL3djd2lkdGguaHRtbAotIyBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvZnVuY3Rpb25zL3djc3dpZHRoLmh0bWwKLSMKLSMgSW4gZml4ZWQtd2lkdGggb3V0cHV0IGRldmljZXMsIExhdGluIGNoYXJhY3RlcnMgYWxsIG9jY3VweSBhIHNpbmdsZQotIyAiY2VsbCIgcG9zaXRpb24gb2YgZXF1YWwgd2lkdGgsIHdoZXJlYXMgaWRlb2dyYXBoaWMgQ0pLIGNoYXJhY3RlcnMKLSMgb2NjdXB5IHR3byBzdWNoIGNlbGxzLiBJbnRlcm9wZXJhYmlsaXR5IGJldHdlZW4gdGVybWluYWwtbGluZQotIyBhcHBsaWNhdGlvbnMgYW5kICh0ZWxldHlwZS1zdHlsZSkgY2hhcmFjdGVyIHRlcm1pbmFscyB1c2luZyB0aGUKLSMgVVRGLTggZW5jb2RpbmcgcmVxdWlyZXMgYWdyZWVtZW50IG9uIHdoaWNoIGNoYXJhY3RlciBzaG91bGQgYWR2YW5jZQotIyB0aGUgY3Vyc29yIGJ5IGhvdyBtYW55IGNlbGwgcG9zaXRpb25zLiBObyBlc3RhYmxpc2hlZCBmb3JtYWwKLSMgc3RhbmRhcmRzIGV4aXN0IGF0IHByZXNlbnQgb24gd2hpY2ggVW5pY29kZSBjaGFyYWN0ZXIgc2hhbGwgb2NjdXB5Ci0jIGhvdyBtYW55IGNlbGwgcG9zaXRpb25zIG9uIGNoYXJhY3RlciB0ZXJtaW5hbHMuIFRoZXNlIHJvdXRpbmVzIGFyZQotIyBhIGZpcnN0IGF0dGVtcHQgb2YgZGVmaW5pbmcgc3VjaCBiZWhhdmlvciBiYXNlZCBvbiBzaW1wbGUgcnVsZXMKLSMgYXBwbGllZCB0byBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBVbmljb2RlIENvbnNvcnRpdW0uCi0jCi0jIEZvciBzb21lIGdyYXBoaWNhbCBjaGFyYWN0ZXJzLCB0aGUgVW5pY29kZSBzdGFuZGFyZCBleHBsaWNpdGx5Ci0jIGRlZmluZXMgYSBjaGFyYWN0ZXItY2VsbCB3aWR0aCB2aWEgdGhlIGRlZmluaXRpb24gb2YgdGhlIEVhc3QgQXNpYW4KLSMgRnVsbFdpZHRoIChGKSwgV2lkZSAoVyksIEhhbGYtd2lkdGggKEgpLCBhbmQgTmFycm93IChOYSkgY2xhc3Nlcy4KLSMgSW4gYWxsIHRoZXNlIGNhc2VzLCB0aGVyZSBpcyBubyBhbWJpZ3VpdHkgYWJvdXQgd2hpY2ggd2lkdGggYQotIyB0ZXJtaW5hbCBzaGFsbCB1c2UuIEZvciBjaGFyYWN0ZXJzIGluIHRoZSBFYXN0IEFzaWFuIEFtYmlndW91cyAoQSkKLSMgY2xhc3MsIHRoZSB3aWR0aCBjaG9pY2UgZGVwZW5kcyBwdXJlbHkgb24gYSBwcmVmZXJlbmNlIG9mIGJhY2t3YXJkCi0jIGNvbXBhdGliaWxpdHkgd2l0aCBlaXRoZXIgaGlzdG9yaWMgQ0pLIG9yIFdlc3Rlcm4gcHJhY3RpY2UuCi0jIENob29zaW5nIHNpbmdsZS13aWR0aCBmb3IgdGhlc2UgY2hhcmFjdGVycyBpcyBlYXN5IHRvIGp1c3RpZnkgYXMKLSMgdGhlIGFwcHJvcHJpYXRlIGxvbmctdGVybSBzb2x1dGlvbiwgYXMgdGhlIENKSyBwcmFjdGljZSBvZgotIyBkaXNwbGF5aW5nIHRoZXNlIGNoYXJhY3RlcnMgYXMgZG91YmxlLXdpZHRoIGNvbWVzIGZyb20gaGlzdG9yaWMKLSMgaW1wbGVtZW50YXRpb24gc2ltcGxpY2l0eSAoOC1iaXQgZW5jb2RlZCBjaGFyYWN0ZXJzIHdlcmUgZGlzcGxheWVkCi0jIHNpbmdsZS13aWR0aCBhbmQgMTYtYml0IG9uZXMgZG91YmxlLXdpZHRoLCBldmVuIGZvciBHcmVlaywKLSMgQ3lyaWxsaWMsIGV0Yy4pIGFuZCBub3QgYW55IHR5cG9ncmFwaGljIGNvbnNpZGVyYXRpb25zLgotIwotIyBNdWNoIGxlc3MgY2xlYXIgaXMgdGhlIGNob2ljZSBvZiB3aWR0aCBmb3IgdGhlIE5vdCBFYXN0IEFzaWFuCi0jIChOZXV0cmFsKSBjbGFzcy4gRXhpc3RpbmcgcHJhY3RpY2UgZG9lcyBub3QgZGljdGF0ZSBhIHdpZHRoIGZvciBhbnkKLSMgb2YgdGhlc2UgY2hhcmFjdGVycy4gSXQgd291bGQgbmV2ZXJ0aGVsZXNzIG1ha2Ugc2Vuc2UKLSMgdHlwb2dyYXBoaWNhbGx5IHRvIGFsbG9jYXRlIHR3byBjaGFyYWN0ZXIgY2VsbHMgdG8gY2hhcmFjdGVycyBzdWNoCi0jIGFzIGZvciBpbnN0YW5jZSBFTSBTUEFDRSBvciBWT0xVTUUgSU5URUdSQUwsIHdoaWNoIGNhbm5vdCBiZQotIyByZXByZXNlbnRlZCBhZGVxdWF0ZWx5IHdpdGggYSBzaW5nbGUtd2lkdGggZ2x5cGguIFRoZSBmb2xsb3dpbmcKLSMgcm91dGluZXMgYXQgcHJlc2VudCBtZXJlbHkgYXNzaWduIGEgc2luZ2xlLWNlbGwgd2lkdGggdG8gYWxsCi0jIG5ldXRyYWwgY2hhcmFjdGVycywgaW4gdGhlIGludGVyZXN0IG9mIHNpbXBsaWNpdHkuIFRoaXMgaXMgbm90Ci0jIGVudGlyZWx5IHNhdGlzZmFjdG9yeSBhbmQgc2hvdWxkIGJlIHJlY29uc2lkZXJlZCBiZWZvcmUKLSMgZXN0YWJsaXNoaW5nIGEgZm9ybWFsIHN0YW5kYXJkIGluIHRoaXMgYXJlYS4gQXQgdGhlIG1vbWVudCwgdGhlCi0jIGRlY2lzaW9uIHdoaWNoIE5vdCBFYXN0IEFzaWFuIChOZXV0cmFsKSBjaGFyYWN0ZXJzIHNob3VsZCBiZQotIyByZXByZXNlbnRlZCBieSBkb3VibGUtd2lkdGggZ2x5cGhzIGNhbm5vdCB5ZXQgYmUgYW5zd2VyZWQgYnkKLSMgYXBwbHlpbmcgYSBzaW1wbGUgcnVsZSBmcm9tIHRoZSBVbmljb2RlIGRhdGFiYXNlIGNvbnRlbnQuIFNldHRpbmcKLSMgdXAgYSBwcm9wZXIgc3RhbmRhcmQgZm9yIHRoZSBiZWhhdmlvciBvZiBVVEYtOCBjaGFyYWN0ZXIgdGVybWluYWxzCi0jIHdpbGwgcmVxdWlyZSBhIGNhcmVmdWwgYW5hbHlzaXMgbm90IG9ubHkgb2YgZWFjaCBVbmljb2RlIGNoYXJhY3RlciwKLSMgYnV0IGFsc28gb2YgZWFjaCBwcmVzZW50YXRpb24gZm9ybSwgc29tZXRoaW5nIHRoZSBhdXRob3Igb2YgdGhlc2UKLSMgcm91dGluZXMgaGFzIGF2b2lkZWQgdG8gZG8gc28gZmFyLgotIwotIyBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3VuaWNvZGUvcmVwb3J0cy90cjExLwotIwotIyBNYXJrdXMgS3VobiAtLSAyMDA3LTA1LTI2IChVbmljb2RlIDUuMCkKLSMKLSMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQotIyBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLiBUaGUgYXV0aG9yCi0jIGRpc2NsYWltcyBhbGwgd2FycmFudGllcyB3aXRoIHJlZ2FyZCB0byB0aGlzIHNvZnR3YXJlLgotIwotIyBMYXRlc3QgQyB2ZXJzaW9uOiBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bWdrMjUvdWNzL3djd2lkdGguYwotCi0jIGF1eGlsaWFyeSBmdW5jdGlvbiBmb3IgYmluYXJ5IHNlYXJjaCBpbiBpbnRlcnZhbCB0YWJsZQotCi0KLWRlZiBiaXNlYXJjaCh1Y3MsIHRhYmxlKToKLSAgICBtaW4gPSAwCi0gICAgbWF4ID0gbGVuKHRhYmxlKSAtIDEKLSAgICBpZiB1Y3MgPCB0YWJsZVswXVswXSBvciB1Y3MgPiB0YWJsZVttYXhdWzFdOgotICAgICAgICByZXR1cm4gMAotICAgIHdoaWxlIG1heCA+PSBtaW46Ci0gICAgICAgIG1pZCA9IGludCgobWluICsgbWF4KSAvIDIpCi0gICAgICAgIGlmIHVjcyA+IHRhYmxlW21pZF1bMV06Ci0gICAgICAgICAgICBtaW4gPSBtaWQgKyAxCi0gICAgICAgIGVsaWYgdWNzIDwgdGFibGVbbWlkXVswXToKLSAgICAgICAgICAgIG1heCA9IG1pZCAtIDEKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiAxCi0gICAgcmV0dXJuIDAKLQotCi0jIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBkZWZpbmUgdGhlIGNvbHVtbiB3aWR0aCBvZiBhbiBJU08gMTA2NDYKLSMgY2hhcmFjdGVyIGFzIGZvbGxvd3M6Ci0jCi0jICAgIC0gVGhlIG51bGwgY2hhcmFjdGVyIChVKzAwMDApIGhhcyBhIGNvbHVtbiB3aWR0aCBvZiAwLgotIwotIyAgICAtIE90aGVyIEMwL0MxIGNvbnRyb2wgY2hhcmFjdGVycyBhbmQgREVMIHdpbGwgbGVhZCB0byBhIHJldHVybgotIyAgICAgIHZhbHVlIG9mIC0xLgotIwotIyAgICAtIE5vbi1zcGFjaW5nIGFuZCBlbmNsb3NpbmcgY29tYmluaW5nIGNoYXJhY3RlcnMgKGdlbmVyYWwKLSMgICAgICBjYXRlZ29yeSBjb2RlIE1uIG9yIE1lIGluIHRoZSBVbmljb2RlIGRhdGFiYXNlKSBoYXZlIGEKLSMgICAgICBjb2x1bW4gd2lkdGggb2YgMC4KLSMKLSMgICAgLSBTT0ZUIEhZUEhFTiAoVSswMEFEKSBoYXMgYSBjb2x1bW4gd2lkdGggb2YgMS4KLSMKLSMgICAgLSBPdGhlciBmb3JtYXQgY2hhcmFjdGVycyAoZ2VuZXJhbCBjYXRlZ29yeSBjb2RlIENmIGluIHRoZSBVbmljb2RlCi0jICAgICAgZGF0YWJhc2UpIGFuZCBaRVJPIFdJRFRIIFNQQUNFIChVKzIwMEIpIGhhdmUgYSBjb2x1bW4gd2lkdGggb2YgMC4KLSMKLSMgICAgLSBIYW5ndWwgSmFtbyBtZWRpYWwgdm93ZWxzIGFuZCBmaW5hbCBjb25zb25hbnRzIChVKzExNjAtVSsxMUZGKQotIyAgICAgIGhhdmUgYSBjb2x1bW4gd2lkdGggb2YgMC4KLSMKLSMgICAgLSBTcGFjaW5nIGNoYXJhY3RlcnMgaW4gdGhlIEVhc3QgQXNpYW4gV2lkZSAoVykgb3IgRWFzdCBBc2lhbgotIyAgICAgIEZ1bGwtd2lkdGggKEYpIGNhdGVnb3J5IGFzIGRlZmluZWQgaW4gVW5pY29kZSBUZWNobmljYWwKLSMgICAgICBSZXBvcnQgIzExIGhhdmUgYSBjb2x1bW4gd2lkdGggb2YgMi4KLSMKLSMgICAgLSBBbGwgcmVtYWluaW5nIGNoYXJhY3RlcnMgKGluY2x1ZGluZyBhbGwgcHJpbnRhYmxlCi0jICAgICAgSVNPIDg4NTktMSBhbmQgV0dMNCBjaGFyYWN0ZXJzLCBVbmljb2RlIGNvbnRyb2wgY2hhcmFjdGVycywKLSMgICAgICBldGMuKSBoYXZlIGEgY29sdW1uIHdpZHRoIG9mIDEuCi0jCi0jIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IHdjaGFyX3QgY2hhcmFjdGVycyBhcmUgZW5jb2RlZAotIyBpbiBJU08gMTA2NDYuCi0KLSMgc29ydGVkIGxpc3Qgb2Ygbm9uLW92ZXJsYXBwaW5nIGludGVydmFscyBvZiBub24tc3BhY2luZyBjaGFyYWN0ZXJzCi0jIGdlbmVyYXRlZCBieSAidW5pc2V0ICtjYXQ9TWUgK2NhdD1NbiArY2F0PUNmIC0wMEFEICsxMTYwLTExRkYgKzIwMEIgYyIKLWNvbWJpbmluZyA9ICgKLSAgICAoMHgwMzAwLCAweDAzNkYpLCAoMHgwNDgzLCAweDA0ODYpLCAoMHgwNDg4LCAweDA0ODkpLAotICAgICgweDA1OTEsIDB4MDVCRCksICgweDA1QkYsIDB4MDVCRiksICgweDA1QzEsIDB4MDVDMiksCi0gICAgKDB4MDVDNCwgMHgwNUM1KSwgKDB4MDVDNywgMHgwNUM3KSwgKDB4MDYwMCwgMHgwNjAzKSwKLSAgICAoMHgwNjEwLCAweDA2MTUpLCAoMHgwNjRCLCAweDA2NUUpLCAoMHgwNjcwLCAweDA2NzApLAotICAgICgweDA2RDYsIDB4MDZFNCksICgweDA2RTcsIDB4MDZFOCksICgweDA2RUEsIDB4MDZFRCksCi0gICAgKDB4MDcwRiwgMHgwNzBGKSwgKDB4MDcxMSwgMHgwNzExKSwgKDB4MDczMCwgMHgwNzRBKSwKLSAgICAoMHgwN0E2LCAweDA3QjApLCAoMHgwN0VCLCAweDA3RjMpLCAoMHgwOTAxLCAweDA5MDIpLAotICAgICgweDA5M0MsIDB4MDkzQyksICgweDA5NDEsIDB4MDk0OCksICgweDA5NEQsIDB4MDk0RCksCi0gICAgKDB4MDk1MSwgMHgwOTU0KSwgKDB4MDk2MiwgMHgwOTYzKSwgKDB4MDk4MSwgMHgwOTgxKSwKLSAgICAoMHgwOUJDLCAweDA5QkMpLCAoMHgwOUMxLCAweDA5QzQpLCAoMHgwOUNELCAweDA5Q0QpLAotICAgICgweDA5RTIsIDB4MDlFMyksICgweDBBMDEsIDB4MEEwMiksICgweDBBM0MsIDB4MEEzQyksCi0gICAgKDB4MEE0MSwgMHgwQTQyKSwgKDB4MEE0NywgMHgwQTQ4KSwgKDB4MEE0QiwgMHgwQTREKSwKLSAgICAoMHgwQTcwLCAweDBBNzEpLCAoMHgwQTgxLCAweDBBODIpLCAoMHgwQUJDLCAweDBBQkMpLAotICAgICgweDBBQzEsIDB4MEFDNSksICgweDBBQzcsIDB4MEFDOCksICgweDBBQ0QsIDB4MEFDRCksCi0gICAgKDB4MEFFMiwgMHgwQUUzKSwgKDB4MEIwMSwgMHgwQjAxKSwgKDB4MEIzQywgMHgwQjNDKSwKLSAgICAoMHgwQjNGLCAweDBCM0YpLCAoMHgwQjQxLCAweDBCNDMpLCAoMHgwQjRELCAweDBCNEQpLAotICAgICgweDBCNTYsIDB4MEI1NiksICgweDBCODIsIDB4MEI4MiksICgweDBCQzAsIDB4MEJDMCksCi0gICAgKDB4MEJDRCwgMHgwQkNEKSwgKDB4MEMzRSwgMHgwQzQwKSwgKDB4MEM0NiwgMHgwQzQ4KSwKLSAgICAoMHgwQzRBLCAweDBDNEQpLCAoMHgwQzU1LCAweDBDNTYpLCAoMHgwQ0JDLCAweDBDQkMpLAotICAgICgweDBDQkYsIDB4MENCRiksICgweDBDQzYsIDB4MENDNiksICgweDBDQ0MsIDB4MENDRCksCi0gICAgKDB4MENFMiwgMHgwQ0UzKSwgKDB4MEQ0MSwgMHgwRDQzKSwgKDB4MEQ0RCwgMHgwRDREKSwKLSAgICAoMHgwRENBLCAweDBEQ0EpLCAoMHgwREQyLCAweDBERDQpLCAoMHgwREQ2LCAweDBERDYpLAotICAgICgweDBFMzEsIDB4MEUzMSksICgweDBFMzQsIDB4MEUzQSksICgweDBFNDcsIDB4MEU0RSksCi0gICAgKDB4MEVCMSwgMHgwRUIxKSwgKDB4MEVCNCwgMHgwRUI5KSwgKDB4MEVCQiwgMHgwRUJDKSwKLSAgICAoMHgwRUM4LCAweDBFQ0QpLCAoMHgwRjE4LCAweDBGMTkpLCAoMHgwRjM1LCAweDBGMzUpLAotICAgICgweDBGMzcsIDB4MEYzNyksICgweDBGMzksIDB4MEYzOSksICgweDBGNzEsIDB4MEY3RSksCi0gICAgKDB4MEY4MCwgMHgwRjg0KSwgKDB4MEY4NiwgMHgwRjg3KSwgKDB4MEY5MCwgMHgwRjk3KSwKLSAgICAoMHgwRjk5LCAweDBGQkMpLCAoMHgwRkM2LCAweDBGQzYpLCAoMHgxMDJELCAweDEwMzApLAotICAgICgweDEwMzIsIDB4MTAzMiksICgweDEwMzYsIDB4MTAzNyksICgweDEwMzksIDB4MTAzOSksCi0gICAgKDB4MTA1OCwgMHgxMDU5KSwgKDB4MTE2MCwgMHgxMUZGKSwgKDB4MTM1RiwgMHgxMzVGKSwKLSAgICAoMHgxNzEyLCAweDE3MTQpLCAoMHgxNzMyLCAweDE3MzQpLCAoMHgxNzUyLCAweDE3NTMpLAotICAgICgweDE3NzIsIDB4MTc3MyksICgweDE3QjQsIDB4MTdCNSksICgweDE3QjcsIDB4MTdCRCksCi0gICAgKDB4MTdDNiwgMHgxN0M2KSwgKDB4MTdDOSwgMHgxN0QzKSwgKDB4MTdERCwgMHgxN0REKSwKLSAgICAoMHgxODBCLCAweDE4MEQpLCAoMHgxOEE5LCAweDE4QTkpLCAoMHgxOTIwLCAweDE5MjIpLAotICAgICgweDE5MjcsIDB4MTkyOCksICgweDE5MzIsIDB4MTkzMiksICgweDE5MzksIDB4MTkzQiksCi0gICAgKDB4MUExNywgMHgxQTE4KSwgKDB4MUIwMCwgMHgxQjAzKSwgKDB4MUIzNCwgMHgxQjM0KSwKLSAgICAoMHgxQjM2LCAweDFCM0EpLCAoMHgxQjNDLCAweDFCM0MpLCAoMHgxQjQyLCAweDFCNDIpLAotICAgICgweDFCNkIsIDB4MUI3MyksICgweDFEQzAsIDB4MURDQSksICgweDFERkUsIDB4MURGRiksCi0gICAgKDB4MjAwQiwgMHgyMDBGKSwgKDB4MjAyQSwgMHgyMDJFKSwgKDB4MjA2MCwgMHgyMDYzKSwKLSAgICAoMHgyMDZBLCAweDIwNkYpLCAoMHgyMEQwLCAweDIwRUYpLCAoMHgzMDJBLCAweDMwMkYpLAotICAgICgweDMwOTksIDB4MzA5QSksICgweEE4MDYsIDB4QTgwNiksICgweEE4MEIsIDB4QTgwQiksCi0gICAgKDB4QTgyNSwgMHhBODI2KSwgKDB4RkIxRSwgMHhGQjFFKSwgKDB4RkUwMCwgMHhGRTBGKSwKLSAgICAoMHhGRTIwLCAweEZFMjMpLCAoMHhGRUZGLCAweEZFRkYpLCAoMHhGRkY5LCAweEZGRkIpLAotICAgICgweDEwQTAxLCAweDEwQTAzKSwgKDB4MTBBMDUsIDB4MTBBMDYpLCAoMHgxMEEwQywgMHgxMEEwRiksCi0gICAgKDB4MTBBMzgsIDB4MTBBM0EpLCAoMHgxMEEzRiwgMHgxMEEzRiksICgweDFEMTY3LCAweDFEMTY5KSwKLSAgICAoMHgxRDE3MywgMHgxRDE4MiksICgweDFEMTg1LCAweDFEMThCKSwgKDB4MUQxQUEsIDB4MUQxQUQpLAotICAgICgweDFEMjQyLCAweDFEMjQ0KSwgKDB4RTAwMDEsIDB4RTAwMDEpLCAoMHhFMDAyMCwgMHhFMDA3RiksCi0gICAgKDB4RTAxMDAsIDB4RTAxRUYpCi0pCi0KLQotIyBzb3J0ZWQgbGlzdCBvZiBub24tb3ZlcmxhcHBpbmcgaW50ZXJ2YWxzIG9mIEVhc3QgQXNpYW4gQW1iaWd1b3VzCi0jIGNoYXJhY3RlcnMsIGdlbmVyYXRlZCBieSAidW5pc2V0ICtXSURUSC1BIC1jYXQ9TWUgLWNhdD1NbiAtY2F0PUNmIGMiCi1hbWJpZ3VvdXMgPSAoCi0gICAgKDB4MDBBMSwgMHgwMEExKSwgKDB4MDBBNCwgMHgwMEE0KSwgKDB4MDBBNywgMHgwMEE4KSwKLSAgICAoMHgwMEFBLCAweDAwQUEpLCAoMHgwMEFFLCAweDAwQUUpLCAoMHgwMEIwLCAweDAwQjQpLAotICAgICgweDAwQjYsIDB4MDBCQSksICgweDAwQkMsIDB4MDBCRiksICgweDAwQzYsIDB4MDBDNiksCi0gICAgKDB4MDBEMCwgMHgwMEQwKSwgKDB4MDBENywgMHgwMEQ4KSwgKDB4MDBERSwgMHgwMEUxKSwKLSAgICAoMHgwMEU2LCAweDAwRTYpLCAoMHgwMEU4LCAweDAwRUEpLCAoMHgwMEVDLCAweDAwRUQpLAotICAgICgweDAwRjAsIDB4MDBGMCksICgweDAwRjIsIDB4MDBGMyksICgweDAwRjcsIDB4MDBGQSksCi0gICAgKDB4MDBGQywgMHgwMEZDKSwgKDB4MDBGRSwgMHgwMEZFKSwgKDB4MDEwMSwgMHgwMTAxKSwKLSAgICAoMHgwMTExLCAweDAxMTEpLCAoMHgwMTEzLCAweDAxMTMpLCAoMHgwMTFCLCAweDAxMUIpLAotICAgICgweDAxMjYsIDB4MDEyNyksICgweDAxMkIsIDB4MDEyQiksICgweDAxMzEsIDB4MDEzMyksCi0gICAgKDB4MDEzOCwgMHgwMTM4KSwgKDB4MDEzRiwgMHgwMTQyKSwgKDB4MDE0NCwgMHgwMTQ0KSwKLSAgICAoMHgwMTQ4LCAweDAxNEIpLCAoMHgwMTRELCAweDAxNEQpLCAoMHgwMTUyLCAweDAxNTMpLAotICAgICgweDAxNjYsIDB4MDE2NyksICgweDAxNkIsIDB4MDE2QiksICgweDAxQ0UsIDB4MDFDRSksCi0gICAgKDB4MDFEMCwgMHgwMUQwKSwgKDB4MDFEMiwgMHgwMUQyKSwgKDB4MDFENCwgMHgwMUQ0KSwKLSAgICAoMHgwMUQ2LCAweDAxRDYpLCAoMHgwMUQ4LCAweDAxRDgpLCAoMHgwMURBLCAweDAxREEpLAotICAgICgweDAxREMsIDB4MDFEQyksICgweDAyNTEsIDB4MDI1MSksICgweDAyNjEsIDB4MDI2MSksCi0gICAgKDB4MDJDNCwgMHgwMkM0KSwgKDB4MDJDNywgMHgwMkM3KSwgKDB4MDJDOSwgMHgwMkNCKSwKLSAgICAoMHgwMkNELCAweDAyQ0QpLCAoMHgwMkQwLCAweDAyRDApLCAoMHgwMkQ4LCAweDAyREIpLAotICAgICgweDAyREQsIDB4MDJERCksICgweDAyREYsIDB4MDJERiksICgweDAzOTEsIDB4MDNBMSksCi0gICAgKDB4MDNBMywgMHgwM0E5KSwgKDB4MDNCMSwgMHgwM0MxKSwgKDB4MDNDMywgMHgwM0M5KSwKLSAgICAoMHgwNDAxLCAweDA0MDEpLCAoMHgwNDEwLCAweDA0NEYpLCAoMHgwNDUxLCAweDA0NTEpLAotICAgICgweDIwMTAsIDB4MjAxMCksICgweDIwMTMsIDB4MjAxNiksICgweDIwMTgsIDB4MjAxOSksCi0gICAgKDB4MjAxQywgMHgyMDFEKSwgKDB4MjAyMCwgMHgyMDIyKSwgKDB4MjAyNCwgMHgyMDI3KSwKLSAgICAoMHgyMDMwLCAweDIwMzApLCAoMHgyMDMyLCAweDIwMzMpLCAoMHgyMDM1LCAweDIwMzUpLAotICAgICgweDIwM0IsIDB4MjAzQiksICgweDIwM0UsIDB4MjAzRSksICgweDIwNzQsIDB4MjA3NCksCi0gICAgKDB4MjA3RiwgMHgyMDdGKSwgKDB4MjA4MSwgMHgyMDg0KSwgKDB4MjBBQywgMHgyMEFDKSwKLSAgICAoMHgyMTAzLCAweDIxMDMpLCAoMHgyMTA1LCAweDIxMDUpLCAoMHgyMTA5LCAweDIxMDkpLAotICAgICgweDIxMTMsIDB4MjExMyksICgweDIxMTYsIDB4MjExNiksICgweDIxMjEsIDB4MjEyMiksCi0gICAgKDB4MjEyNiwgMHgyMTI2KSwgKDB4MjEyQiwgMHgyMTJCKSwgKDB4MjE1MywgMHgyMTU0KSwKLSAgICAoMHgyMTVCLCAweDIxNUUpLCAoMHgyMTYwLCAweDIxNkIpLCAoMHgyMTcwLCAweDIxNzkpLAotICAgICgweDIxOTAsIDB4MjE5OSksICgweDIxQjgsIDB4MjFCOSksICgweDIxRDIsIDB4MjFEMiksCi0gICAgKDB4MjFENCwgMHgyMUQ0KSwgKDB4MjFFNywgMHgyMUU3KSwgKDB4MjIwMCwgMHgyMjAwKSwKLSAgICAoMHgyMjAyLCAweDIyMDMpLCAoMHgyMjA3LCAweDIyMDgpLCAoMHgyMjBCLCAweDIyMEIpLAotICAgICgweDIyMEYsIDB4MjIwRiksICgweDIyMTEsIDB4MjIxMSksICgweDIyMTUsIDB4MjIxNSksCi0gICAgKDB4MjIxQSwgMHgyMjFBKSwgKDB4MjIxRCwgMHgyMjIwKSwgKDB4MjIyMywgMHgyMjIzKSwKLSAgICAoMHgyMjI1LCAweDIyMjUpLCAoMHgyMjI3LCAweDIyMkMpLCAoMHgyMjJFLCAweDIyMkUpLAotICAgICgweDIyMzQsIDB4MjIzNyksICgweDIyM0MsIDB4MjIzRCksICgweDIyNDgsIDB4MjI0OCksCi0gICAgKDB4MjI0QywgMHgyMjRDKSwgKDB4MjI1MiwgMHgyMjUyKSwgKDB4MjI2MCwgMHgyMjYxKSwKLSAgICAoMHgyMjY0LCAweDIyNjcpLCAoMHgyMjZBLCAweDIyNkIpLCAoMHgyMjZFLCAweDIyNkYpLAotICAgICgweDIyODIsIDB4MjI4MyksICgweDIyODYsIDB4MjI4NyksICgweDIyOTUsIDB4MjI5NSksCi0gICAgKDB4MjI5OSwgMHgyMjk5KSwgKDB4MjJBNSwgMHgyMkE1KSwgKDB4MjJCRiwgMHgyMkJGKSwKLSAgICAoMHgyMzEyLCAweDIzMTIpLCAoMHgyNDYwLCAweDI0RTkpLCAoMHgyNEVCLCAweDI1NEIpLAotICAgICgweDI1NTAsIDB4MjU3MyksICgweDI1ODAsIDB4MjU4RiksICgweDI1OTIsIDB4MjU5NSksCi0gICAgKDB4MjVBMCwgMHgyNUExKSwgKDB4MjVBMywgMHgyNUE5KSwgKDB4MjVCMiwgMHgyNUIzKSwKLSAgICAoMHgyNUI2LCAweDI1QjcpLCAoMHgyNUJDLCAweDI1QkQpLCAoMHgyNUMwLCAweDI1QzEpLAotICAgICgweDI1QzYsIDB4MjVDOCksICgweDI1Q0IsIDB4MjVDQiksICgweDI1Q0UsIDB4MjVEMSksCi0gICAgKDB4MjVFMiwgMHgyNUU1KSwgKDB4MjVFRiwgMHgyNUVGKSwgKDB4MjYwNSwgMHgyNjA2KSwKLSAgICAoMHgyNjA5LCAweDI2MDkpLCAoMHgyNjBFLCAweDI2MEYpLCAoMHgyNjE0LCAweDI2MTUpLAotICAgICgweDI2MUMsIDB4MjYxQyksICgweDI2MUUsIDB4MjYxRSksICgweDI2NDAsIDB4MjY0MCksCi0gICAgKDB4MjY0MiwgMHgyNjQyKSwgKDB4MjY2MCwgMHgyNjYxKSwgKDB4MjY2MywgMHgyNjY1KSwKLSAgICAoMHgyNjY3LCAweDI2NkEpLCAoMHgyNjZDLCAweDI2NkQpLCAoMHgyNjZGLCAweDI2NkYpLAotICAgICgweDI3M0QsIDB4MjczRCksICgweDI3NzYsIDB4Mjc3RiksICgweEUwMDAsIDB4RjhGRiksCi0gICAgKDB4RkZGRCwgMHhGRkZEKSwgKDB4RjAwMDAsIDB4RkZGRkQpLCAoMHgxMDAwMDAsIDB4MTBGRkZEKQotKQotCi0KLWRlZiBta193Y3dpZHRoKHVjcyk6Ci0gICAgIyB0ZXN0IGZvciA4LWJpdCBjb250cm9sIGNoYXJhY3RlcnMKLSAgICBpZiB1Y3MgPT0gMDoKLSAgICAgICAgcmV0dXJuIDAKLSAgICBpZiB1Y3MgPCAzMiBvciAodWNzID49IDB4N2YgYW5kIHVjcyA8IDB4YTApOgotICAgICAgICByZXR1cm4gLTEKLQotICAgICMgYmluYXJ5IHNlYXJjaCBpbiB0YWJsZSBvZiBub24tc3BhY2luZyBjaGFyYWN0ZXJzCi0gICAgaWYgYmlzZWFyY2godWNzLCBjb21iaW5pbmcpOgotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBpZiB3ZSBhcnJpdmUgaGVyZSwgdWNzIGlzIG5vdCBhIGNvbWJpbmluZyBvciBDMC9DMSBjb250cm9sIGNoYXJhY3RlcgotCi0gICAgcmV0dXJuIDEgKyBpbnQoCi0gICAgICAgIHVjcyA+PSAweDExMDAKLSAgICAgICAgYW5kICh1Y3MgPD0gMHgxMTVmICAgICAgICAgICAgICAgICAgICAjIEhhbmd1bCBKYW1vIGluaXQuIGNvbnNvbmFudHMKLSAgICAgICAgICAgICBvciB1Y3MgPT0gMHgyMzI5IG9yIHVjcyA9PSAweDIzMmEKLSAgICAgICAgICAgICBvciAodWNzID49IDB4MmU4MCBhbmQgdWNzIDw9IDB4YTRjZgotICAgICAgICAgICAgICAgICBhbmQgdWNzICE9IDB4MzAzZikgICAgICAgICAgICAgICAgIyBDSksgLi4uIFlpCi0gICAgICAgICAgICAgb3IgKHVjcyA+PSAweGFjMDAgYW5kIHVjcyA8PSAweGQ3YTMpICAjIEhhbmd1bCBTeWxsYWJsZXMKLSAgICAgICAgICAgICBvciAodWNzID49IDB4ZjkwMCBhbmQgdWNzIDw9IDB4ZmFmZikgICMgQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocwotICAgICAgICAgICAgIG9yICh1Y3MgPj0gMHhmZTEwIGFuZCB1Y3MgPD0gMHhmZTE5KSAgIyBWZXJ0aWNhbCBmb3JtcwotICAgICAgICAgICAgIG9yICh1Y3MgPj0gMHhmZTMwIGFuZCB1Y3MgPD0gMHhmZTZmKSAgIyBDSksgQ29tcGF0aWJpbGl0eSBGb3JtcwotICAgICAgICAgICAgIG9yICh1Y3MgPj0gMHhmZjAwIGFuZCB1Y3MgPD0gMHhmZjYwKSAgIyBGdWxsd2lkdGggRm9ybXMKLSAgICAgICAgICAgICBvciAodWNzID49IDB4ZmZlMCBhbmQgdWNzIDw9IDB4ZmZlNikKLSAgICAgICAgICAgICBvciAodWNzID49IDB4MjAwMDAgYW5kIHVjcyA8PSAweDJmZmZkKQotICAgICAgICAgICAgIG9yICh1Y3MgPj0gMHgzMDAwMCBhbmQgdWNzIDw9IDB4M2ZmZmQpKQotICAgICkKLQotCi1kZWYgbWtfd2Nzd2lkdGgocHdjcyk6Ci0gICAgd2lkdGggPSAwCi0gICAgZm9yIGMgaW4gcHdjczoKLSAgICAgICAgdyA9IG1rX3djd2lkdGgoYykKLSAgICAgICAgaWYgdyA8IDA6Ci0gICAgICAgICAgICByZXR1cm4gLTEKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHdpZHRoICs9IHcKLQotICAgIHJldHVybiB3aWR0aAotCi0KLSMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHRoZSBzYW1lIGFzIG1rX3djd2lkdGgoKSBhbmQKLSMgbWtfd2Nzd2lkdGgoKSwgZXhjZXB0IHRoYXQgc3BhY2luZyBjaGFyYWN0ZXJzIGluIHRoZSBFYXN0IEFzaWFuCi0jIEFtYmlndW91cyAoQSkgY2F0ZWdvcnkgYXMgZGVmaW5lZCBpbiBVbmljb2RlIFRlY2huaWNhbCBSZXBvcnQgIzExCi0jIGhhdmUgYSBjb2x1bW4gd2lkdGggb2YgMi4gVGhpcyB2YXJpYW50IG1pZ2h0IGJlIHVzZWZ1bCBmb3IgdXNlcnMgb2YKLSMgQ0pLIGxlZ2FjeSBlbmNvZGluZ3Mgd2hvIHdhbnQgdG8gbWlncmF0ZSB0byBVQ1Mgd2l0aG91dCBjaGFuZ2luZwotIyB0aGUgdHJhZGl0aW9uYWwgdGVybWluYWwgY2hhcmFjdGVyLXdpZHRoIGJlaGF2aW91ci4gSXQgaXMgbm90Ci0jIG90aGVyd2lzZSByZWNvbW1lbmRlZCBmb3IgZ2VuZXJhbCB1c2UuCi1kZWYgbWtfd2N3aWR0aF9jamsodWNzKToKLSAgICAjIGJpbmFyeSBzZWFyY2ggaW4gdGFibGUgb2Ygbm9uLXNwYWNpbmcgY2hhcmFjdGVycwotICAgIGlmIGJpc2VhcmNoKHVjcywgYW1iaWd1b3VzKToKLSAgICAgICAgcmV0dXJuIDIKLQotICAgIHJldHVybiBta193Y3dpZHRoKHVjcykKLQotCi1kZWYgbWtfd2Nzd2lkdGhfY2prKHB3Y3MpOgotICAgIHdpZHRoID0gMAotCi0gICAgZm9yIGMgaW4gcHdjczoKLSAgICAgICAgdyA9IG1rX3djd2lkdGhfY2prKGMpCi0gICAgICAgIGlmIHcgPCAwOgotICAgICAgICAgICAgcmV0dXJuIC0xCi0gICAgICAgIHdpZHRoICs9IHcKLQotICAgIHJldHVybiB3aWR0aAotCi0jIHB5dGhvbi15IHZlcnNpb25zLCBkZWFsaW5nIHdpdGggdW5pY29kZSBvYmplY3RzCi0KLQotZGVmIHdjd2lkdGgoYyk6Ci0gICAgcmV0dXJuIG1rX3djd2lkdGgob3JkKGMpKQotCi0KLWRlZiB3Y3N3aWR0aChzKToKLSAgICByZXR1cm4gbWtfd2Nzd2lkdGgobGlzdChtYXAob3JkLCBzKSkpCi0KLQotZGVmIHdjd2lkdGhfY2prKGMpOgotICAgIHJldHVybiBta193Y3dpZHRoX2NqayhvcmQoYykpCi0KLQotZGVmIHdjc3dpZHRoX2NqayhzKToKLSAgICByZXR1cm4gbWtfd2Nzd2lkdGhfY2prKGxpc3QobWFwKG9yZCwgcykpKQotCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgc2FtcGxlcyA9ICgKLSAgICAgICAgKCdNVVNJQyBTSEFSUCBTSUdOJywgMSksCi0gICAgICAgICgnRlVMTFdJRFRIIFBPVU5EIFNJR04nLCAyKSwKLSAgICAgICAgKCdGVUxMV0lEVEggTEFUSU4gQ0FQSVRBTCBMRVRURVIgUCcsIDIpLAotICAgICAgICAoJ0NKSyBSQURJQ0FMIEJPTFQgT0YgQ0xPVEgnLCAyKSwKLSAgICAgICAgKCdMQVRJTiBTTUFMTCBMRVRURVIgQScsIDEpLAotICAgICAgICAoJ0xBVElOIFNNQUxMIExFVFRFUiBBRScsIDEpLAotICAgICAgICAoJ1NQQUNFJywgMSksCi0gICAgICAgICgnTk8tQlJFQUsgU1BBQ0UnLCAxKSwKLSAgICAgICAgKCdDSksgQ09NUEFUSUJJTElUWSBJREVPR1JBUEgtRjkyMCcsIDIpLAotICAgICAgICAoJ01BTEFZQUxBTSBWT1dFTCBTSUdOIFVVJywgMCksCi0gICAgICAgICgnWkVSTyBXSURUSCBTUEFDRScsIDApLAotICAgICAgICAoJ1pFUk8gV0lEVEggTk8tQlJFQUsgU1BBQ0UnLCAwKSwKLSAgICAgICAgKCdDT01CSU5JTkcgUEFMQVRBTElaRUQgSE9PSyBCRUxPVycsIDApLAotICAgICAgICAoJ0NPTUJJTklORyBHUkFWRSBBQ0NFTlQnLCAwKSwKLSAgICApCi0gICAgbm9ucHJpbnRpbmcgPSAnXHJcblx0XGFcYlxmXHZceDdmJwotCi0gICAgaW1wb3J0IHVuaWNvZGVkYXRhCi0KLSAgICBmb3IgbmFtZSwgcHJpbnR3aWR0aCBpbiBzYW1wbGVzOgotICAgICAgICB1Y2hyID0gdW5pY29kZWRhdGEubG9va3VwKG5hbWUpCi0gICAgICAgIGNhbGN1bGF0ZWR3aWR0aCA9IHdjd2lkdGgodWNocikKLSAgICAgICAgYXNzZXJ0IGNhbGN1bGF0ZWR3aWR0aCA9PSBwcmludHdpZHRoLCBcCi0gICAgICAgICAgICAnd2lkdGggZm9yICVyIHNob3VsZCBiZSAlZCwgYnV0IGlzICVkPycgJSAodWNociwgcHJpbnR3aWR0aCwgY2FsY3VsYXRlZHdpZHRoKQotCi0gICAgZm9yIGMgaW4gbm9ucHJpbnRpbmc6Ci0gICAgICAgIGNhbGN1bGF0ZWR3aWR0aCA9IHdjd2lkdGgoYykKLSAgICAgICAgYXNzZXJ0IGNhbGN1bGF0ZWR3aWR0aCA8IDAsIFwKLSAgICAgICAgICAgICclciBpcyBhIGNvbnRyb2wgY2hhcmFjdGVyLCBidXQgd2N3aWR0aCBnaXZlcyAlZCcgJSAoYywgY2FsY3VsYXRlZHdpZHRoKQotCi0gICAgYXNzZXJ0IHdjd2lkdGgoJ1wwJykgPT0gMCAgIyBzcGVjaWFsIGNhc2UKLQotICAgICMgZGVwZW5kaW5nIG9uIGhvdyBweXRob24gaXMgY29tcGlsZWQsIGNvZGUgcG9pbnRzIGFib3ZlIFUrRkZGRiBtYXkgbm90IGJlCi0gICAgIyB0cmVhdGVkIGFzIHNpbmdsZSBjaGFyYWN0ZXJzLCBzbyBvcmQoKSB3b24ndCB3b3JrLiB0ZXN0IGEgZmV3IG9mIHRoZXNlCi0gICAgIyBtYW51YWxseS4KLQotICAgIGFzc2VydCBta193Y3dpZHRoKDB4ZTAxZWYpID09IDAKLSAgICBhc3NlcnQgbWtfd2N3aWR0aCgweDEwZmZmZikgPT0gMQotICAgIGFzc2VydCBta193Y3dpZHRoKDB4M2ZmZmQpID09IDIKLQotICAgIHRlc3RzdHIgPSAnQlwwaWcgYnJcdTAwZjh3biBtb29zZVx1YjE0M1x1MjAwYicKLSAgICBjYWxjdWxhdGVkd2lkdGggPSB3Y3N3aWR0aCh0ZXN0c3RyKQotICAgIGFzc2VydCBjYWxjdWxhdGVkd2lkdGggPT0gMTcsICdleHBlY3RlZCAxNywgZ290ICVkJyAlIGNhbGN1bGF0ZWR3aWR0aAotCi0gICAgY2FsY3VsYXRlZHdpZHRoID0gd2Nzd2lkdGhfY2prKHRlc3RzdHIpCi0gICAgYXNzZXJ0IGNhbGN1bGF0ZWR3aWR0aCA9PSAxOCwgJ2V4cGVjdGVkIDE4LCBnb3QgJWQnICUgY2FsY3VsYXRlZHdpZHRoCi0KLSAgICBhc3NlcnQgd2Nzd2lkdGgoJ2Zvb2Jhclx1MjAwYlxhJykgPCAwCi0KLSAgICBwcmludCgndGVzdHMgcGFzcy4nKQpkaWZmIC0tZ2l0IGEvcHlsaWIvcmVxdWlyZW1lbnRzLnR4dCBiL3B5bGliL3JlcXVpcmVtZW50cy50eHQKaW5kZXggYzAzMDQ2MC4uMzc5ZjZhZSAxMDA2NDQKLS0tIGEvcHlsaWIvcmVxdWlyZW1lbnRzLnR4dAorKysgYi9weWxpYi9yZXF1aXJlbWVudHMudHh0CkBAIC0zLDMgKzMsNCBAQAogLWUgZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9yaXB0YW5vL2NjbS5naXRAY2Fzc2FuZHJhLXRlc3QjZWdnPWNjbQogY292ZXJhZ2UKIHB5dGVzdAord2N3aWR0aApkaWZmIC0tZ2l0IGEvcHlsaWIvc2V0dXAucHkgYi9weWxpYi9zZXR1cC5weQppbmRleCBhOWY2NTRhLi5mNWZkMTg0IDEwMDc1NQotLS0gYS9weWxpYi9zZXR1cC5weQorKysgYi9weWxpYi9zZXR1cC5weQpAQCAtMSw0ICsxLDQgQEAKLSMhL3Vzci9iaW4vcHl0aG9uCisjIS91c3IvYmluL2VudiBweXRob24zCiAjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKICMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCiAjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCmRpZmYgLS1naXQgYS9yZWRoYXQvY2Fzc2FuZHJhLnNwZWMgYi9yZWRoYXQvY2Fzc2FuZHJhLnNwZWMKaW5kZXggNzQzMWMxYy4uYWU1YWQ0YyAxMDA2NDQKLS0tIGEvcmVkaGF0L2Nhc3NhbmRyYS5zcGVjCisrKyBiL3JlZGhhdC9jYXNzYW5kcmEuc3BlYwpAQCAtMTcsOCArMTcsOCBAQAogIwogCiAlZGVmaW5lIF9famFyX3JlcGFjayAle25pbH0KLSMgVHVybiBvZmYgdGhlIGJycC1weXRob24tYnl0ZWNvbXBpbGUgc2NyaXB0Ci0lZ2xvYmFsIF9fb3NfaW5zdGFsbF9wb3N0ICUoZWNobyAnJXtfX29zX2luc3RhbGxfcG9zdH0nIHwgc2VkIC1lICdzIS91c3IvbGliW15bOnNwYWNlOl1dKi9icnAtcHl0aG9uLWJ5dGVjb21waWxlW1s6c3BhY2U6XV0uKiQhIWcnKQorIyBUdXJuIG9mZiB0aGUgYnJwLXB5dGhvbi1ieXRlY29tcGlsZSBzY3JpcHQgYW5kIG1hbmdsaW5nIHNoZWJhbmdzIGZvciBQeXRob24gc2NyaXB0cworJWdsb2JhbCBfX29zX2luc3RhbGxfcG9zdCAlKGVjaG8gJyV7X19vc19pbnN0YWxsX3Bvc3R9JyB8IHNlZCAtZSAncyEvdXNyL2xpYlteWzpzcGFjZTpdXSovYnJwLXB5dGhvbi1ieXRlY29tcGlsZVtbOnNwYWNlOl1dLiokISFnJyAtZSAncyEvdXNyL2xpYlteWzpzcGFjZTpdXSovYnJwLW1hbmdsZS1zaGViYW5nc1tbOnNwYWNlOl1dLiokISFnJykKIAogIyBycG1idWlsZCBzaG91bGQgbm90IGJhcmYgd2hlbiBpdCBzcG90cyB3ZSBzaGlwCiAjIGJpbmFyeSBleGVjdXRhYmxlIGZpbGVzIGluIG91ciAnbm9hcmNoJyBwYWNrYWdlCkBAIC0xNjEsOSArMTYxLDkgQEAKICV7X3N5c2NvbmZkaXJ9L3NlY3VyaXR5L2xpbWl0cy5kLyV7dXNlcm5hbWV9LmNvbmYKIC91c3Ivc2hhcmUvJXt1c2VybmFtZX0qCiAlY29uZmlnKG5vcmVwbGFjZSkgLyV7X3N5c2NvbmZkaXJ9LyV7dXNlcm5hbWV9Ci0lYXR0cig3NTUsJXt1c2VybmFtZX0sJXt1c2VybmFtZX0pICVjb25maWcobm9yZXBsYWNlKSAvdmFyL2xpYi8le3VzZXJuYW1lfS8qCi0lYXR0cig3NTUsJXt1c2VybmFtZX0sJXt1c2VybmFtZX0pIC92YXIvbG9nLyV7dXNlcm5hbWV9KgotJWF0dHIoNzU1LCV7dXNlcm5hbWV9LCV7dXNlcm5hbWV9KSAvdmFyL3J1bi8le3VzZXJuYW1lfSoKKyVhdHRyKDc1MCwle3VzZXJuYW1lfSwle3VzZXJuYW1lfSkgJWNvbmZpZyhub3JlcGxhY2UpIC92YXIvbGliLyV7dXNlcm5hbWV9LyoKKyVhdHRyKDc1MCwle3VzZXJuYW1lfSwle3VzZXJuYW1lfSkgL3Zhci9sb2cvJXt1c2VybmFtZX0qCislYXR0cig3NTAsJXt1c2VybmFtZX0sJXt1c2VybmFtZX0pIC92YXIvcnVuLyV7dXNlcm5hbWV9KgogJXtweXRob25fc2l0ZWxpYn0vY3Fsc2hsaWIvCiAle3B5dGhvbl9zaXRlbGlifS9jYXNzYW5kcmFfcHlsaWIqLmVnZy1pbmZvCiAKQEAgLTE5OCw2ICsxOTgsNyBAQAogJWF0dHIoNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zc3RhYmxlb2ZmbGluZXJlbGV2ZWwKICVhdHRyKDc1NSxyb290LHJvb3QpICV7X2JpbmRpcn0vc3N0YWJsZXJlcGFpcmVkc2V0CiAlYXR0cig3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L3NzdGFibGVzcGxpdAorJWF0dHIoNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9zc3RhYmxlcGFydGl0aW9ucwogJWF0dHIoNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9hdWRpdGxvZ3ZpZXdlcgogJWF0dHIoNzU1LHJvb3Qscm9vdCkgJXtfYmluZGlyfS9qbXh0b29sCiAlYXR0cig3NTUscm9vdCxyb290KSAle19iaW5kaXJ9L2ZxbHRvb2wKZGlmZiAtLWdpdCBhL3JlZGhhdC9ub2Jvb2xlYW4vY2Fzc2FuZHJhLnNwZWMgYi9yZWRoYXQvbm9ib29sZWFuL2Nhc3NhbmRyYS5zcGVjCmluZGV4IGEzYWJhYTYuLjJiNmNkZDQgMTAwNjQ0Ci0tLSBhL3JlZGhhdC9ub2Jvb2xlYW4vY2Fzc2FuZHJhLnNwZWMKKysrIGIvcmVkaGF0L25vYm9vbGVhbi9jYXNzYW5kcmEuc3BlYwpAQCAtMTcsOCArMTcsOCBAQAogIwogCiAlZGVmaW5lIF9famFyX3JlcGFjayAle25pbH0KLSMgVHVybiBvZmYgdGhlIGJycC1weXRob24tYnl0ZWNvbXBpbGUgc2NyaXB0Ci0lZ2xvYmFsIF9fb3NfaW5zdGFsbF9wb3N0ICUoZWNobyAnJXtfX29zX2luc3RhbGxfcG9zdH0nIHwgc2VkIC1lICdzIS91c3IvbGliW15bOnNwYWNlOl1dKi9icnAtcHl0aG9uLWJ5dGVjb21waWxlW1s6c3BhY2U6XV0uKiQhIWcnKQorIyBUdXJuIG9mZiB0aGUgYnJwLXB5dGhvbi1ieXRlY29tcGlsZSBzY3JpcHQgYW5kIG1hbmdsaW5nIHNoZWJhbmdzIGZvciBQeXRob24gc2NyaXB0cworJWdsb2JhbCBfX29zX2luc3RhbGxfcG9zdCAlKGVjaG8gJyV7X19vc19pbnN0YWxsX3Bvc3R9JyB8IHNlZCAtZSAncyEvdXNyL2xpYlteWzpzcGFjZTpdXSovYnJwLXB5dGhvbi1ieXRlY29tcGlsZVtbOnNwYWNlOl1dLiokISFnJyAtZSAncyEvdXNyL2xpYlteWzpzcGFjZTpdXSovYnJwLW1hbmdsZS1zaGViYW5nc1tbOnNwYWNlOl1dLiokISFnJykKIAogIyBycG1idWlsZCBzaG91bGQgbm90IGJhcmYgd2hlbiBpdCBzcG90cyB3ZSBzaGlwCiAjIGJpbmFyeSBleGVjdXRhYmxlIGZpbGVzIGluIG91ciAnbm9hcmNoJyBwYWNrYWdlCkBAIC0xNjEsOSArMTYxLDkgQEAKICV7X3N5c2NvbmZkaXJ9L3NlY3VyaXR5L2xpbWl0cy5kLyV7dXNlcm5hbWV9LmNvbmYKIC91c3Ivc2hhcmUvJXt1c2VybmFtZX0qCiAlY29uZmlnKG5vcmVwbGFjZSkgLyV7X3N5c2NvbmZkaXJ9LyV7dXNlcm5hbWV9Ci0lYXR0cig3NTUsJXt1c2VybmFtZX0sJXt1c2VybmFtZX0pICVjb25maWcobm9yZXBsYWNlKSAvdmFyL2xpYi8le3VzZXJuYW1lfS8qCi0lYXR0cig3NTUsJXt1c2VybmFtZX0sJXt1c2VybmFtZX0pIC92YXIvbG9nLyV7dXNlcm5hbWV9KgotJWF0dHIoNzU1LCV7dXNlcm5hbWV9LCV7dXNlcm5hbWV9KSAvdmFyL3J1bi8le3VzZXJuYW1lfSoKKyVhdHRyKDc1MCwle3VzZXJuYW1lfSwle3VzZXJuYW1lfSkgJWNvbmZpZyhub3JlcGxhY2UpIC92YXIvbGliLyV7dXNlcm5hbWV9LyoKKyVhdHRyKDc1MCwle3VzZXJuYW1lfSwle3VzZXJuYW1lfSkgL3Zhci9sb2cvJXt1c2VybmFtZX0qCislYXR0cig3NTAsJXt1c2VybmFtZX0sJXt1c2VybmFtZX0pIC92YXIvcnVuLyV7dXNlcm5hbWV9KgogJXtweXRob25fc2l0ZWxpYn0vY3Fsc2hsaWIvCiAle3B5dGhvbl9zaXRlbGlifS9jYXNzYW5kcmFfcHlsaWIqLmVnZy1pbmZvCiAKQEAgLTE5MCw2ICsxOTAsNyBAQAogVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGV4dHJhIHRvb2xzIGZvciB3b3JraW5nIHdpdGggQ2Fzc2FuZHJhIGNsdXN0ZXJzLgogCiAlZmlsZXMgdG9vbHMKKyVhdHRyKDc1NSxyb290LHJvb3QpICV7X2JpbmRpcn0vc3N0YWJsZXBhcnRpdGlvbnMKICVhdHRyKDc1NSxyb290LHJvb3QpICV7X2JpbmRpcn0vc3N0YWJsZWR1bXAKICVhdHRyKDc1NSxyb290LHJvb3QpICV7X2JpbmRpcn0vY29tcGFjdGlvbi1zdHJlc3MKICVhdHRyKDc1NSxyb290LHJvb3QpICV7X2JpbmRpcn0vc3N0YWJsZWV4cGlyZWRibG9ja2VycwpkaWZmIC0tZ2l0IGEvcmVsb2NhdGUtZGVwZW5kZW5jaWVzLnBvbSBiL3JlbG9jYXRlLWRlcGVuZGVuY2llcy5wb20KaW5kZXggMDc3MjhkZC4uOTZkOGQxNiAxMDA2NDQKLS0tIGEvcmVsb2NhdGUtZGVwZW5kZW5jaWVzLnBvbQorKysgYi9yZWxvY2F0ZS1kZXBlbmRlbmNpZXMucG9tCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgICAgICAgICA8cGx1Z2luPgogICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaGFkZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+My4yLjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+My40LjE8L3ZlcnNpb24+CiAKICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgPGNyZWF0ZVNvdXJjZXNKYXI+ZmFsc2U8L2NyZWF0ZVNvdXJjZXNKYXI+CmRpZmYgLS1naXQgYS9zcmMvYW50bHIvQ3FsLmcgYi9zcmMvYW50bHIvQ3FsLmcKaW5kZXggMjcyYzYzYi4uMGViMmFjNSAxMDA2NDQKLS0tIGEvc3JjL2FudGxyL0NxbC5nCisrKyBiL3NyYy9hbnRsci9DcWwuZwpAQCAtMzksNiArMzksNyBAQAogICAgIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLio7CiAgICAgaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuY29uZGl0aW9ucy4qOwogICAgIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy4qOworICAgIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nLio7CiAgICAgaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMucmVzdHJpY3Rpb25zLkN1c3RvbUluZGV4RXhwcmVzc2lvbjsKICAgICBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zZWxlY3Rpb24uKjsKICAgICBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLio7CmRpZmYgLS1naXQgYS9zcmMvYW50bHIvTGV4ZXIuZyBiL3NyYy9hbnRsci9MZXhlci5nCmluZGV4IDcyYWI3ZGIuLjUxMmE4MmQgMTAwNjQ0Ci0tLSBhL3NyYy9hbnRsci9MZXhlci5nCisrKyBiL3NyYy9hbnRsci9MZXhlci5nCkBAIC0xNzgsNiArMTc4LDcgQEAKIEtfVElNRVVVSUQ6ICAgIFQgSSBNIEUgVSBVIEkgRDsKIEtfVE9LRU46ICAgICAgIFQgTyBLIEUgTjsKIEtfV1JJVEVUSU1FOiAgIFcgUiBJIFQgRSBUIEkgTSBFOworS19NQVhXUklURVRJTUU6TSBBIFggVyBSIEkgVCBFIFQgSSBNIEU7CiBLX0RBVEU6ICAgICAgICBEIEEgVCBFOwogS19USU1FOiAgICAgICAgVCBJIE0gRTsKIApAQCAtMjE3LDYgKzIxOCwxMCBAQAogS19VTlNFVDogICAgICAgVSBOIFMgRSBUOwogS19MSUtFOiAgICAgICAgTCBJIEsgRTsKIAorS19NQVNLRUQ6ICAgICAgTSBBIFMgSyBFIEQ7CitLX1VOTUFTSzogICAgICBVIE4gTSBBIFMgSzsKK0tfU0VMRUNUX01BU0tFRDogUyBFIEwgRSBDIFQgJ18nIE0gQSBTIEsgRSBEOworCiAvLyBDYXNlLWluc2Vuc2l0aXZlIGFscGhhIGNoYXJhY3RlcnMKIGZyYWdtZW50IEE6ICgnYSd8J0EnKTsKIGZyYWdtZW50IEI6ICgnYid8J0InKTsKZGlmZiAtLWdpdCBhL3NyYy9hbnRsci9QYXJzZXIuZyBiL3NyYy9hbnRsci9QYXJzZXIuZwppbmRleCBkMDYxZWU0Li4wMjlkN2ZjIDEwMDY0NAotLS0gYS9zcmMvYW50bHIvUGFyc2VyLmcKKysrIGIvc3JjL2FudGxyL1BhcnNlci5nCkBAIC00MTQsMTEgKzQxNCwxMiBAQAogICAgIDsKIAogc2VsZWN0aW9uRnVuY3Rpb24gcmV0dXJucyBbU2VsZWN0YWJsZS5SYXcgc10KLSAgICA6IEtfQ09VTlQgJygnICdcKicgJyknICAgICAgICAgICAgICAgICAgICAgIHsgJHMgPSBTZWxlY3RhYmxlLldpdGhGdW5jdGlvbi5SYXcubmV3Q291bnRSb3dzRnVuY3Rpb24oKTsgfQotICAgIHwgS19XUklURVRJTUUgJygnIGM9c2lkZW50ICcpJyAgICAgICAgICAgICAgeyAkcyA9IG5ldyBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLlJhdyhjLCB0cnVlKTsgfQotICAgIHwgS19UVEwgICAgICAgJygnIGM9c2lkZW50ICcpJyAgICAgICAgICAgICAgeyAkcyA9IG5ldyBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLlJhdyhjLCBmYWxzZSk7IH0KLSAgICB8IEtfQ0FTVCAgICAgICcoJyBzbj11bmFsaWFzZWRTZWxlY3RvciBLX0FTIHQ9bmF0aXZlX3R5cGUgJyknIHskcyA9IG5ldyBTZWxlY3RhYmxlLldpdGhDYXN0LlJhdyhzbiwgdCk7fQotICAgIHwgZj1mdW5jdGlvbk5hbWUgYXJncz1zZWxlY3Rpb25GdW5jdGlvbkFyZ3MgeyAkcyA9IG5ldyBTZWxlY3RhYmxlLldpdGhGdW5jdGlvbi5SYXcoZiwgYXJncyk7IH0KKyAgICA6IEtfQ09VTlQgICAgICAgICcoJyAnXConICcpJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJHMgPSBTZWxlY3RhYmxlLldpdGhGdW5jdGlvbi5SYXcubmV3Q291bnRSb3dzRnVuY3Rpb24oKTsgfQorICAgIHwgS19NQVhXUklURVRJTUUgJygnIGM9c2lkZW50IG09c2VsZWN0b3JNb2RpZmllcltjXSAnKScgICAgICAgICAgeyAkcyA9IG5ldyBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLlJhdyhjLCBtLCBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLktpbmQuTUFYX1dSSVRFX1RJTUUpOyB9CisgICAgfCBLX1dSSVRFVElNRSAgICAnKCcgYz1zaWRlbnQgbT1zZWxlY3Rvck1vZGlmaWVyW2NdICcpJyAgICAgICAgICB7ICRzID0gbmV3IFNlbGVjdGFibGUuV3JpdGV0aW1lT3JUVEwuUmF3KGMsIG0sIFNlbGVjdGFibGUuV3JpdGV0aW1lT3JUVEwuS2luZC5XUklURV9USU1FKTsgfQorICAgIHwgS19UVEwgICAgICAgICAgJygnIGM9c2lkZW50IG09c2VsZWN0b3JNb2RpZmllcltjXSAnKScgICAgICAgICAgeyAkcyA9IG5ldyBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLlJhdyhjLCBtLCBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLktpbmQuVFRMKTsgfQorICAgIHwgS19DQVNUICAgICAgICAgJygnIHNuPXVuYWxpYXNlZFNlbGVjdG9yIEtfQVMgdD1uYXRpdmVfdHlwZSAnKScgeyAkcyA9IG5ldyBTZWxlY3RhYmxlLldpdGhDYXN0LlJhdyhzbiwgdCk7fQorICAgIHwgZj1mdW5jdGlvbk5hbWUgYXJncz1zZWxlY3Rpb25GdW5jdGlvbkFyZ3MgICAgICAgICAgICAgICAgICAgICAgeyAkcyA9IG5ldyBTZWxlY3RhYmxlLldpdGhGdW5jdGlvbi5SYXcoZiwgYXJncyk7IH0KICAgICA7CiAKIHNlbGVjdGlvbkxpdGVyYWwgcmV0dXJucyBbVGVybS5SYXcgdmFsdWVdCkBAIC03ODEsMTEgKzc4MiwyMSBAQAogCiB0YWJsZUNvbHVtbnNbQ3JlYXRlVGFibGVTdGF0ZW1lbnQuUmF3IHN0bXRdCiAgICAgQGluaXQgeyBib29sZWFuIGlzU3RhdGljID0gZmFsc2U7IH0KLSAgICA6IGs9aWRlbnQgdj1jb21wYXJhdG9yVHlwZSAoS19TVEFUSUMgeyBpc1N0YXRpYyA9IHRydWU7IH0pPyB7ICRzdG10LmFkZENvbHVtbihrLCB2LCBpc1N0YXRpYyk7IH0KKyAgICA6IGs9aWRlbnQgdj1jb21wYXJhdG9yVHlwZSAoS19TVEFUSUMgeyBpc1N0YXRpYyA9IHRydWU7IH0pPyAobWFzaz1jb2x1bW5NYXNrKT8geyAkc3RtdC5hZGRDb2x1bW4oaywgdiwgaXNTdGF0aWMsIG1hc2spOyB9CiAgICAgICAgIChLX1BSSU1BUlkgS19LRVkgeyAkc3RtdC5zZXRQYXJ0aXRpb25LZXlDb2x1bW4oayk7IH0pPwogICAgIHwgS19QUklNQVJZIEtfS0VZICcoJyB0YWJsZVBhcnRpdGlvbktleVtzdG10XSAoJywnIGM9aWRlbnQgeyAkc3RtdC5tYXJrQ2x1c3RlcmluZ0NvbHVtbihjKTsgfSApKiAnKScKICAgICA7CiAKK2NvbHVtbk1hc2sgcmV0dXJucyBbQ29sdW1uTWFzay5SYXcgbWFza10KKyAgICBAaW5pdCB7IExpc3Q8VGVybS5SYXc+IGFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOyB9CisgICAgOiBLX01BU0tFRCBLX1dJVEggbmFtZT1mdW5jdGlvbk5hbWUgY29sdW1uTWFza0FyZ3VtZW50c1thcmd1bWVudHNdIHsgJG1hc2sgPSBuZXcgQ29sdW1uTWFzay5SYXcobmFtZSwgYXJndW1lbnRzKTsgfQorICAgIHwgS19NQVNLRUQgS19XSVRIIEtfREVGQVVMVCB7ICRtYXNrID0gbmV3IENvbHVtbk1hc2suUmF3KEZ1bmN0aW9uTmFtZS5uYXRpdmVGdW5jdGlvbigibWFza19kZWZhdWx0IiksIGFyZ3VtZW50cyk7IH0KKyAgICA7CisKK2NvbHVtbk1hc2tBcmd1bWVudHNbTGlzdDxUZXJtLlJhdz4gYXJndW1lbnRzXQorICAgIDogJygnICAnKScgfCAnKCcgYz10ZXJtIHsgYXJndW1lbnRzLmFkZChjKTsgfSAoJywnIGNuPXRlcm0geyBhcmd1bWVudHMuYWRkKGNuKTsgfSkqICcpJworICAgIDsKKwogdGFibGVQYXJ0aXRpb25LZXlbQ3JlYXRlVGFibGVTdGF0ZW1lbnQuUmF3IHN0bXRdCiAgICAgQGluaXQge0xpc3Q8Q29sdW1uSWRlbnRpZmllcj4gbCA9IG5ldyBBcnJheUxpc3Q8Q29sdW1uSWRlbnRpZmllcj4oKTt9CiAgICAgQGFmdGVyeyAkc3RtdC5zZXRQYXJ0aXRpb25LZXlDb2x1bW5zKGwpOyB9CkBAIC05MjgsNyArOTM5LDkgQEAKIAogLyoqCiAgKiBBTFRFUiBUQUJMRSA8dGFibGU+IEFMVEVSIDxjb2x1bW4+IFRZUEUgPG5ld3R5cGU+OwotICogQUxURVIgVEFCTEUgW0lGIEVYSVNUU10gPHRhYmxlPiBBREQgW0lGIE5PVCBFWElTVFNdIDxjb2x1bW4+IDxuZXd0eXBlPjsgfCBBTFRFUiBUQUJMRSBbSUYgRVhJU1RTXSA8dGFibGU+IEFERCBbSUYgTk9UIEVYSVNUU10gKDxjb2x1bW4+IDxuZXd0eXBlPiw8Y29sdW1uMT4gPG5ld3R5cGUxPi4uLi4uIDxjb2x1bW4gbj4gPG5ld3R5cGUgbj4pCisgKiBBTFRFUiBUQUJMRSBbSUYgRVhJU1RTXSA8dGFibGU+IEFMVEVSIFtJRiBFWElTVFNdIDxjb2x1bW4+IE1BU0tFRCBXSVRIIDxtYXNrRnVuY3Rpb24+KTsKKyAqIEFMVEVSIFRBQkxFIFtJRiBFWElTVFNdIDx0YWJsZT4gQUxURVIgW0lGIEVYSVNUU10gPGNvbHVtbj4gRFJPUCBNQVNLRUQ7CisgKiBBTFRFUiBUQUJMRSBbSUYgRVhJU1RTXSA8dGFibGU+IEFERCBbSUYgTk9UIEVYSVNUU10gPGNvbHVtbj4gPG5ld3R5cGU+IDxtYXNrRnVuY3Rpb24+OyB8IEFMVEVSIFRBQkxFIFtJRiBFWElTVFNdIDx0YWJsZT4gQUREIFtJRiBOT1QgRVhJU1RTXSAoPGNvbHVtbj4gPG5ld3R5cGU+IDxtYXNrRnVuY3Rpb24+LCA8Y29sdW1uMT4gPG5ld3R5cGUxPiAgPG1hc2tGdW5jdGlvbjE+Li4uLi4gPGNvbHVtbiBuPiA8bmV3dHlwZSBuPiAgPG1hc2tGdW5jdGlvbiBuPikKICAqIEFMVEVSIFRBQkxFIFtJRiBFWElTVFNdIDx0YWJsZT4gRFJPUCBbSUYgRVhJU1RTXSA8Y29sdW1uPjsgfCBBTFRFUiBUQUJMRSBbSUYgRVhJU1RTXSA8dGFibGU+IERST1AgW0lGIEVYSVNUU10gKCA8Y29sdW1uPiw8Y29sdW1uMT4uLi4uLjxjb2x1bW4gbj4pCiAgKiBBTFRFUiBUQUJMRSBbSUYgRVhJU1RTXSA8dGFibGU+IFJFTkFNRSBbSUYgRVhJU1RTXSA8Y29sdW1uPiBUTyA8Y29sdW1uPjsKICAqIEFMVEVSIFRBQkxFIFtJRiBFWElTVFNdIDx0YWJsZT4gV0lUSCA8cHJvcGVydHk+ID0gPHZhbHVlPjsKQEAgLTk0MCwxMCArOTUzLDE0IEBACiAgICAgICAoCiAgICAgICAgIEtfQUxURVIgaWQ9Y2lkZW50IEtfVFlQRSB2PWNvbXBhcmF0b3JUeXBlIHsgJHN0bXQuYWx0ZXIoaWQsIHYpOyB9CiAKKyAgICAgIHwgS19BTFRFUiAoIEtfSUYgS19FWElTVFMgeyAkc3RtdC5pZkNvbHVtbkV4aXN0cyh0cnVlKTsgfSApPyBpZD1jaWRlbnQKKyAgICAgICAgICAgICAgKCBtYXNrPWNvbHVtbk1hc2sgeyAkc3RtdC5tYXNrKGlkLCBtYXNrKTsgfQorICAgICAgICAgICAgICB8IEtfRFJPUCBLX01BU0tFRCB7ICRzdG10Lm1hc2soaWQsIG51bGwpOyB9ICkKKwogICAgICAgfCBLX0FERCAoIEtfSUYgS19OT1QgS19FWElTVFMgeyAkc3RtdC5pZkNvbHVtbk5vdEV4aXN0cyh0cnVlKTsgfSApPwotICAgICAgICAgICAgICAoICAgICAgICBpZD1pZGVudCAgdj1jb21wYXJhdG9yVHlwZSAgYj1pc1N0YXRpY0NvbHVtbiB7ICRzdG10LmFkZChpZCwgIHYsICBiKTsgIH0KLSAgICAgICAgICAgICAgIHwgKCcoJyAgaWQxPWlkZW50IHYxPWNvbXBhcmF0b3JUeXBlIGIxPWlzU3RhdGljQ29sdW1uIHsgJHN0bXQuYWRkKGlkMSwgdjEsIGIxKTsgfQotICAgICAgICAgICAgICAgICAoICcsJyBpZG49aWRlbnQgdm49Y29tcGFyYXRvclR5cGUgYm49aXNTdGF0aWNDb2x1bW4geyAkc3RtdC5hZGQoaWRuLCB2biwgYm4pOyB9ICkqICcpJykgKQorICAgICAgICAgICAgICAoICAgICAgICBpZD1pZGVudCAgdj1jb21wYXJhdG9yVHlwZSAgYj1pc1N0YXRpY0NvbHVtbiAobT1jb2x1bW5NYXNrKT8geyAkc3RtdC5hZGQoaWQsICB2LCAgYiwgbSk7ICB9CisgICAgICAgICAgICAgICB8ICgnKCcgIGlkMT1pZGVudCB2MT1jb21wYXJhdG9yVHlwZSBiMT1pc1N0YXRpY0NvbHVtbiAobTE9Y29sdW1uTWFzayk/IHsgJHN0bXQuYWRkKGlkMSwgdjEsIGIxLCBtMSk7IH0KKyAgICAgICAgICAgICAgICAgKCAnLCcgaWRuPWlkZW50IHZuPWNvbXBhcmF0b3JUeXBlIGJuPWlzU3RhdGljQ29sdW1uIChtbj1jb2x1bW5NYXNrKT8geyAkc3RtdC5hZGQoaWRuLCB2biwgYm4sIG1uKTsgbW49bnVsbDsgfSApKiAnKScpICkKIAogICAgICAgfCBLX0RST1AgKCBLX0lGIEtfRVhJU1RTIHsgJHN0bXQuaWZDb2x1bW5FeGlzdHModHJ1ZSk7IH0gKT8KICAgICAgICAgICAgICAgICggICAgICAgaWQ9aWRlbnQgeyAkc3RtdC5kcm9wKGlkKTsgIH0KQEAgLTExMTEsNyArMTEyOCw3IEBACiAgICAgOwogCiBwZXJtaXNzaW9uIHJldHVybnMgW1Blcm1pc3Npb24gcGVybV0KLSAgICA6IHA9KEtfQ1JFQVRFIHwgS19BTFRFUiB8IEtfRFJPUCB8IEtfU0VMRUNUIHwgS19NT0RJRlkgfCBLX0FVVEhPUklaRSB8IEtfREVTQ1JJQkUgfCBLX0VYRUNVVEUpCisgICAgOiBwPShLX0NSRUFURSB8IEtfQUxURVIgfCBLX0RST1AgfCBLX1NFTEVDVCB8IEtfTU9ESUZZIHwgS19BVVRIT1JJWkUgfCBLX0RFU0NSSUJFIHwgS19FWEVDVVRFIHwgS19VTk1BU0sgfCBLX1NFTEVDVF9NQVNLRUQpCiAgICAgeyAkcGVybSA9IFBlcm1pc3Npb24udmFsdWVPZigkcC50ZXh0LnRvVXBwZXJDYXNlKCkpOyB9CiAgICAgOwogCkBAIC0xODcwLDcgKzE4ODcsNyBAQAogCiB1bnJlc2VydmVkX2tleXdvcmQgcmV0dXJucyBbU3RyaW5nIHN0cl0KICAgICA6IHU9dW5yZXNlcnZlZF9mdW5jdGlvbl9rZXl3b3JkICAgICB7ICRzdHIgPSB1OyB9Ci0gICAgfCBrPShLX1RUTCB8IEtfQ09VTlQgfCBLX1dSSVRFVElNRSB8IEtfS0VZIHwgS19DQVNUIHwgS19KU09OIHwgS19ESVNUSU5DVCkgeyAkc3RyID0gJGsudGV4dDsgfQorICAgIHwgaz0oS19UVEwgfCBLX0NPVU5UIHwgS19XUklURVRJTUUgfCBLX01BWFdSSVRFVElNRSB8IEtfS0VZIHwgS19DQVNUIHwgS19KU09OIHwgS19ESVNUSU5DVCkgeyAkc3RyID0gJGsudGV4dDsgfQogICAgIDsKIAogdW5yZXNlcnZlZF9mdW5jdGlvbl9rZXl3b3JkIHJldHVybnMgW1N0cmluZyBzdHJdCkBAIC0xOTM5LDUgKzE5NTYsOCBAQAogICAgICAgICB8IEtfTUJFQU5TCiAgICAgICAgIHwgS19SRVBMQUNFCiAgICAgICAgIHwgS19VTlNFVAorICAgICAgICB8IEtfTUFTS0VECisgICAgICAgIHwgS19VTk1BU0sKKyAgICAgICAgfCBLX1NFTEVDVF9NQVNLRUQKICAgICAgICAgKSB7ICRzdHIgPSAkay50ZXh0OyB9CiAgICAgOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9BbGxvd0FsbEludGVybm9kZUF1dGhlbnRpY2F0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvQWxsb3dBbGxJbnRlcm5vZGVBdXRoZW50aWNhdG9yLmphdmEKaW5kZXggZDBkMmQ3NC4uYWM2MmJmYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9BbGxvd0FsbEludGVybm9kZUF1dGhlbnRpY2F0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0FsbG93QWxsSW50ZXJub2RlQXV0aGVudGljYXRvci5qYXZhCkBAIC0yMCwxMiArMjAsMTQgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aDsKIAogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIAogcHVibGljIGNsYXNzIEFsbG93QWxsSW50ZXJub2RlQXV0aGVudGljYXRvciBpbXBsZW1lbnRzIElJbnRlcm5vZGVBdXRoZW50aWNhdG9yCiB7Ci0gICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlKEluZXRBZGRyZXNzIHJlbW90ZUFkZHJlc3MsIGludCByZW1vdGVQb3J0KQorICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShJbmV0QWRkcmVzcyByZW1vdGVBZGRyZXNzLCBpbnQgcmVtb3RlUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMsIEludGVybm9kZUNvbm5lY3Rpb25EaXJlY3Rpb24gY29ubmVjdGlvblR5cGUpCiAgICAgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0F1dGhDYWNoZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9BdXRoQ2FjaGUuamF2YQppbmRleCA2NmEyYTRmLi43ZDNhMTY0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0F1dGhDYWNoZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvQXV0aENhY2hlLmphdmEKQEAgLTQ4LDYgKzQ4LDkgQEAKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yRmFjdG9yeS5HbG9iYWwuZXhlY3V0b3JGYWN0b3J5OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFVVEhfQ0FDSEVfV0FSTUlOR19NQVhfUkVUUklFUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BVVRIX0NBQ0hFX1dBUk1JTkdfUkVUUllfSU5URVJWQUxfTVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRElTQUJMRV9BVVRIX0NBQ0hFU19SRU1PVEVfQ09ORklHVVJBVElPTjsKIAogcHVibGljIGNsYXNzIEF1dGhDYWNoZTxLLCBWPiBpbXBsZW1lbnRzIEF1dGhDYWNoZU1CZWFuLCBTaHV0ZG93bmFibGUKIHsKQEAgLTU1LDExICs1OCw2IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQkVBTl9OQU1FX0JBU0UgPSAib3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aDp0eXBlPSI7CiAKLSAgICAvLyBXZSBleHBlY3QgZGVmYXVsdCB2YWx1ZXMgb24gY2FjaGUgcmV0cmllcyBhbmQgaW50ZXJ2YWwgdG8gYmUgc3VmZmljaWVudCBmb3IgZXZlcnlvbmUgYnV0IGhhdmUgdGhpcyBlc2NhcGUgaGF0Y2gKLSAgICAvLyBqdXN0IGluIGNhc2UuCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9MT0FEX1JFVFJJRVNfUFJPUEVSVFkgPSAiY2Fzc2FuZHJhLmF1dGhfY2FjaGUud2FybWluZy5tYXhfcmV0cmllcyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9MT0FEX1JFVFJZX0lOVEVSVkFMX1BST1BFUlRZID0gImNhc3NhbmRyYS5hdXRoX2NhY2hlLndhcm1pbmcucmV0cnlfaW50ZXJ2YWxfbXMiOwotCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBTY2hlZHVsZWRGdXR1cmUgY2FjaGVSZWZyZXNoZXIgPSBudWxsOwogCiAgICAgLy8gS2VlcCBhIGhhbmRsZSBvbiBjcmVhdGVkIGluc3RhbmNlcyBzbyB0aGVpciBleGVjdXRvcnMgY2FuIGJlIHRlcm1pbmF0ZWQgY2xlYW5seQpAQCAtMjU0LDcgKzI1Miw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFZhbGlkaXR5KGludCB2YWxpZGl0eVBlcmlvZCkKICAgICB7Ci0gICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5kaXNhYmxlX2F1dGhfY2FjaGVzX3JlbW90ZV9jb25maWd1cmF0aW9uIikpCisgICAgICAgIGlmIChESVNBQkxFX0FVVEhfQ0FDSEVTX1JFTU9URV9DT05GSUdVUkFUSU9OLmdldEJvb2xlYW4oKSkKICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiUmVtb3RlIGNvbmZpZ3VyYXRpb24gb2YgYXV0aCBjYWNoZXMgaXMgZGlzYWJsZWQiKTsKIAogICAgICAgICBzZXRWYWxpZGl0eURlbGVnYXRlLmFjY2VwdCh2YWxpZGl0eVBlcmlvZCk7CkBAIC0yNzIsNyArMjcwLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VXBkYXRlSW50ZXJ2YWwoaW50IHVwZGF0ZUludGVydmFsKQogICAgIHsKLSAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLmRpc2FibGVfYXV0aF9jYWNoZXNfcmVtb3RlX2NvbmZpZ3VyYXRpb24iKSkKKyAgICAgICAgaWYgKERJU0FCTEVfQVVUSF9DQUNIRVNfUkVNT1RFX0NPTkZJR1VSQVRJT04uZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJSZW1vdGUgY29uZmlndXJhdGlvbiBvZiBhdXRoIGNhY2hlcyBpcyBkaXNhYmxlZCIpOwogCiAgICAgICAgIHNldFVwZGF0ZUludGVydmFsRGVsZWdhdGUuYWNjZXB0KHVwZGF0ZUludGVydmFsKTsKQEAgLTI5MCw3ICsyODgsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRNYXhFbnRyaWVzKGludCBtYXhFbnRyaWVzKQogICAgIHsKLSAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLmRpc2FibGVfYXV0aF9jYWNoZXNfcmVtb3RlX2NvbmZpZ3VyYXRpb24iKSkKKyAgICAgICAgaWYgKERJU0FCTEVfQVVUSF9DQUNIRVNfUkVNT1RFX0NPTkZJR1VSQVRJT04uZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJSZW1vdGUgY29uZmlndXJhdGlvbiBvZiBhdXRoIGNhY2hlcyBpcyBkaXNhYmxlZCIpOwogCiAgICAgICAgIHNldE1heEVudHJpZXNEZWxlZ2F0ZS5hY2NlcHQobWF4RW50cmllcyk7CkBAIC0zMDksNyArMzA3LDcgQEAKIAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRBY3RpdmVVcGRhdGUoYm9vbGVhbiB1cGRhdGUpCiAgICAgewotICAgICAgICBpZiAoQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEuZGlzYWJsZV9hdXRoX2NhY2hlc19yZW1vdGVfY29uZmlndXJhdGlvbiIpKQorICAgICAgICBpZiAoRElTQUJMRV9BVVRIX0NBQ0hFU19SRU1PVEVfQ09ORklHVVJBVElPTi5nZXRCb29sZWFuKCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlbW90ZSBjb25maWd1cmF0aW9uIG9mIGF1dGggY2FjaGVzIGlzIGRpc2FibGVkIik7CiAKICAgICAgICAgc2V0QWN0aXZlVXBkYXRlLmFjY2VwdCh1cGRhdGUpOwpAQCAtNDA5LDggKzQwNyw4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBpbnQgcmV0cmllcyA9IEludGVnZXIuZ2V0SW50ZWdlcihDQUNIRV9MT0FEX1JFVFJJRVNfUFJPUEVSVFksIDEwKTsKLSAgICAgICAgbG9uZyByZXRyeUludGVydmFsID0gTG9uZy5nZXRMb25nKENBQ0hFX0xPQURfUkVUUllfSU5URVJWQUxfUFJPUEVSVFksIDEwMDApOworICAgICAgICBpbnQgcmV0cmllcyA9IEFVVEhfQ0FDSEVfV0FSTUlOR19NQVhfUkVUUklFUy5nZXRJbnQoMTApOworICAgICAgICBsb25nIHJldHJ5SW50ZXJ2YWwgPSBBVVRIX0NBQ0hFX1dBUk1JTkdfUkVUUllfSU5URVJWQUxfTVMuZ2V0TG9uZygxMDAwKTsKIAogICAgICAgICB3aGlsZSAocmV0cmllcy0tID4gMCkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9BdXRoS2V5c3BhY2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvQXV0aEtleXNwYWNlLmphdmEKaW5kZXggNjdmYzljMS4uZjBhM2RhOCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9BdXRoS2V5c3BhY2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0F1dGhLZXlzcGFjZS5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlczsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVVBFUlVTRVJfU0VUVVBfREVMQVlfTVM7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBBdXRoS2V5c3BhY2UKIHsKQEAgLTU1LDcgKzU2LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9ST0xFX0lOREVYID0gInJlc291cmNlX3JvbGVfcGVybWlzc29uc19pbmRleCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVUV09SS19QRVJNSVNTSU9OUyA9ICJuZXR3b3JrX3Blcm1pc3Npb25zIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBTVVBFUlVTRVJfU0VUVVBfREVMQVkgPSBMb25nLmdldExvbmcoImNhc3NhbmRyYS5zdXBlcnVzZXJfc2V0dXBfZGVsYXlfbXMiLCAxMDAwMCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFNVUEVSVVNFUl9TRVRVUF9ERUxBWSA9IFNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUy5nZXRMb25nKCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUYWJsZU1ldGFkYXRhIFJvbGVzID0KICAgICAgICAgcGFyc2UoUk9MRVMsCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0Nhc3NhbmRyYVJvbGVNYW5hZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0Nhc3NhbmRyYVJvbGVNYW5hZ2VyLmphdmEKaW5kZXggNzMzZTlkYS4uMzdiZGE0ZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9DYXNzYW5kcmFSb2xlTWFuYWdlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvQ2Fzc2FuZHJhUm9sZU1hbmFnZXIuamF2YQpAQCAtMzQsNyArMzQsNiBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy4qOwpAQCAtNDMsMTEgKzQyLDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VQcm94eTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5tZXNzYWdlcy5SZXN1bHRNZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5taW5kcm90LmpiY3J5cHQuQkNyeXB0OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQVVUSF9CQ1JZUFRfR0VOU0FMVF9MT0cyX1JPVU5EUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5RdWVyeVN0YXRlLmZvckludGVybmFsQ2FsbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIApAQCAtODEsNyArODIsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDYXNzYW5kcmFSb2xlTWFuYWdlci5jbGFzcyk7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NVUEVSVVNFUl9OQU1FID0gImNhc3NhbmRyYSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NVUEVSVVNFUl9QQVNTV09SRCA9ICJjYXNzYW5kcmEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU1VQRVJVU0VSX1BBU1NXT1JEID0gImNhc3NhbmRyYSI7CiAKICAgICAvKioKICAgICAgKiBXZSBuZWVkIHRvIHRyZWF0IHRoZSBkZWZhdWx0IHN1cGVydXNlciBhcyBhIHNwZWNpYWwgY2FzZSBzaW5jZSBkdXJpbmcgaW5pdGlhbCBub2RlIHN0YXJ0dXAsIHdlIG1heSBlbmQgdXAgd2l0aApAQCAtMTEyLDE5ICsxMTMsMTUgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICAvLyAyICoqIEdFTlNBTFRfTE9HMl9ST1VORFMgcm91bmRzIG9mIGhhc2hpbmcgd2lsbCBiZSBwZXJmb3JtZWQuCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VOU0FMVF9MT0cyX1JPVU5EU19QUk9QRVJUWSA9IENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiYXV0aF9iY3J5cHRfZ2Vuc2FsdF9sb2cyX3JvdW5kcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFTlNBTFRfTE9HMl9ST1VORFMgPSBnZXRHZW5zYWx0TG9nUm91bmRzKCk7CiAKICAgICBzdGF0aWMgaW50IGdldEdlbnNhbHRMb2dSb3VuZHMoKQogICAgIHsKLSAgICAgICAgIGludCByb3VuZHMgPSBJbnRlZ2VyLmdldEludGVnZXIoR0VOU0FMVF9MT0cyX1JPVU5EU19QUk9QRVJUWSwgMTApOwotICAgICAgICAgaWYgKHJvdW5kcyA8IDQgfHwgcm91bmRzID4gMzApCi0gICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJCYWQgdmFsdWUgZm9yIHN5c3RlbSBwcm9wZXJ0eSAtRCVzLiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHVzZSBhIHZhbHVlIGJldHdlZW4gNCBhbmQgMzAgaW5jbHVzaXZlbHkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5TQUxUX0xPRzJfUk9VTkRTX1BST1BFUlRZKSk7Ci0gICAgICAgICByZXR1cm4gcm91bmRzOworICAgICAgICBpbnQgcm91bmRzID0gQVVUSF9CQ1JZUFRfR0VOU0FMVF9MT0cyX1JPVU5EUy5nZXRJbnQoMTApOworICAgICAgICBpZiAocm91bmRzIDwgNCB8fCByb3VuZHMgPiAzMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkJhZCB2YWx1ZSBmb3Igc3lzdGVtIHByb3BlcnR5ICVzLiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHVzZSBhIHZhbHVlIGJldHdlZW4gNCBhbmQgMzAgaW5jbHVzaXZlbHkiLCBBVVRIX0JDUllQVF9HRU5TQUxUX0xPRzJfUk9VTkRTLmdldEtleSgpKSk7CisgICAgICAgIHJldHVybiByb3VuZHM7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBTZWxlY3RTdGF0ZW1lbnQgbG9hZFJvbGVTdGF0ZW1lbnQ7CkBAIC0zODYsNiArMzgzLDEyIEBACiAgICAgewogICAgICAgICAvLyBUaGUgZGVsYXkgaXMgdG8gZ2l2ZSB0aGUgbm9kZSBhIGNoYW5jZSB0byBzZWUgaXRzIHBlZXJzIGJlZm9yZSBhdHRlbXB0aW5nIHRoZSBvcGVyYXRpb24KICAgICAgICAgU2NoZWR1bGVkRXhlY3V0b3JzLm9wdGlvbmFsVGFza3Muc2NoZWR1bGVTZWxmUmVjdXJyaW5nKCgpIC0+IHsKKyAgICAgICAgICAgIGlmICghU3RvcmFnZVByb3h5LmlzU2FmZVRvUGVyZm9ybVJlYWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIlNldHVwIHRhc2sgbWF5IG5vdCBydW4gZHVlIHRvIGl0IG5vdCBiZWluZyBzYWZlIHRvIHBlcmZvcm0gcmVhZHMuLi4gcmVzY2hlZHVsaW5nIik7CisgICAgICAgICAgICAgICAgc2NoZWR1bGVTZXR1cFRhc2soc2V0dXBUYXNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBzZXR1cFRhc2suY2FsbCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9EYXRhUmVzb3VyY2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvRGF0YVJlc291cmNlLmphdmEKaW5kZXggMjQyMTkzMC4uNDkyM2EwYiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9EYXRhUmVzb3VyY2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0RhdGFSZXNvdXJjZS5qYXZhCkBAIC00Niw3ICs0Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24uRFJPUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbi5TRUxFQ1QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24uTU9ESUZZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLkFVVEhPUklaRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24uQVVUSE9SSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLlVOTUFTSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbi5TRUxFQ1RfTUFTS0VEKTsKIAogICAgIC8vIHBlcm1pc3Npb25zIHdoaWNoIG1heSBiZSBncmFudGVkIG9uIGFsbCB0YWJsZXMgb2YgYSBnaXZlbiBrZXlzcGFjZQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxQZXJtaXNzaW9uPiBBTExfVEFCTEVTX0xFVkVMX1BFUk1JU1NJT05TID0gU2V0cy5pbW11dGFibGVFbnVtU2V0KFBlcm1pc3Npb24uQ1JFQVRFLApAQCAtNTQsNyArNTYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24uRFJPUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLlNFTEVDVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLk1PRElGWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLkFVVEhPUklaRSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbi5BVVRIT1JJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbi5VTk1BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbi5TRUxFQ1RfTUFTS0VEKTsKIAogICAgIC8vIHBlcm1pc3Npb25zIHdoaWNoIG1heSBiZSBncmFudGVkIG9uIG9uZSBvciBhbGwga2V5c3BhY2VzCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFBlcm1pc3Npb24+IEtFWVNQQUNFX0xFVkVMX1BFUk1JU1NJT05TID0gU2V0cy5pbW11dGFibGVFbnVtU2V0KFBlcm1pc3Npb24uQ1JFQVRFLApAQCAtNjIsNyArNjYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLkRST1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24uU0VMRUNULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLk1PRElGWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbi5BVVRIT1JJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uLkFVVEhPUklaRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVybWlzc2lvbi5VTk1BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb24uU0VMRUNUX01BU0tFRCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfTkFNRSA9ICJkYXRhIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEYXRhUmVzb3VyY2UgUk9PVF9SRVNPVVJDRSA9IG5ldyBEYXRhUmVzb3VyY2UoTGV2ZWwuUk9PVCwgbnVsbCwgbnVsbCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvRnVuY3Rpb25SZXNvdXJjZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9GdW5jdGlvblJlc291cmNlLmphdmEKaW5kZXggYTY3ZWYxYS4uODZiMTU5MiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9GdW5jdGlvblJlc291cmNlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9GdW5jdGlvblJlc291cmNlLmphdmEKQEAgLTI5LDEzICsyOSwxNCBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5Vc2VyRnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlR5cGVQYXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwogCiAvKioKICAqIElSZXNvdXJjZSBpbXBsZW1lbnRhdGlvbiByZXByZXNlbnRpbmcgZnVuY3Rpb25zLgpAQCAtMTM1LDcgKzEzNiw3IEBACiAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25SZXNvdXJjZShrZXlzcGFjZSwgbmFtZSwgYXJnVHlwZXMpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgRnVuY3Rpb25SZXNvdXJjZSBmdW5jdGlvbihGdW5jdGlvbiBmdW5jdGlvbikKKyAgICBwdWJsaWMgc3RhdGljIEZ1bmN0aW9uUmVzb3VyY2UgZnVuY3Rpb24oVXNlckZ1bmN0aW9uIGZ1bmN0aW9uKQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvblJlc291cmNlKGZ1bmN0aW9uLm5hbWUoKS5rZXlzcGFjZSwgZnVuY3Rpb24ubmFtZSgpLm5hbWUsIGZ1bmN0aW9uLmFyZ1R5cGVzKCkpOwogICAgIH0KQEAgLTI3MSw2ICsyNzIsNyBAQAogCiAgICAgcHVibGljIGJvb2xlYW4gZXhpc3RzKCkKICAgICB7CisgICAgICAgIHZhbGlkYXRlKCk7CiAgICAgICAgIHN3aXRjaCAobGV2ZWwpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgUk9PVDoKQEAgLTI3OCwxMyArMjgwLDE0IEBACiAgICAgICAgICAgICBjYXNlIEtFWVNQQUNFOgogICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWEuaW5zdGFuY2UuZ2V0S2V5c3BhY2VzKCkuY29udGFpbnMoa2V5c3BhY2UpOwogICAgICAgICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgICAgICAgICAgICByZXR1cm4gU2NoZW1hLmluc3RhbmNlLmZpbmRGdW5jdGlvbihnZXRGdW5jdGlvbk5hbWUoKSwgYXJnVHlwZXMpLmlzUHJlc2VudCgpOworICAgICAgICAgICAgICAgIHJldHVybiBTY2hlbWEuaW5zdGFuY2UuZmluZFVzZXJGdW5jdGlvbihnZXRGdW5jdGlvbk5hbWUoKSwgYXJnVHlwZXMpLmlzUHJlc2VudCgpOwogICAgICAgICB9CiAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOwogICAgIH0KIAogICAgIHB1YmxpYyBTZXQ8UGVybWlzc2lvbj4gYXBwbGljYWJsZVBlcm1pc3Npb25zKCkKICAgICB7CisgICAgICAgIHZhbGlkYXRlKCk7CiAgICAgICAgIHN3aXRjaCAobGV2ZWwpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgUk9PVDoKQEAgLTI5Miw3ICsyOTUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBDT0xMRUNUSU9OX0xFVkVMX1BFUk1JU1NJT05TOwogICAgICAgICAgICAgY2FzZSBGVU5DVElPTjoKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPcHRpb25hbDxGdW5jdGlvbj4gZnVuY3Rpb24gPSBTY2hlbWEuaW5zdGFuY2UuZmluZEZ1bmN0aW9uKGdldEZ1bmN0aW9uTmFtZSgpLCBhcmdUeXBlcyk7CisgICAgICAgICAgICAgICAgT3B0aW9uYWw8VXNlckZ1bmN0aW9uPiBmdW5jdGlvbiA9IFNjaGVtYS5pbnN0YW5jZS5maW5kVXNlckZ1bmN0aW9uKGdldEZ1bmN0aW9uTmFtZSgpLCBhcmdUeXBlcyk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0IGZ1bmN0aW9uLmlzUHJlc2VudCgpIDogIlVuYWJsZSB0byBmaW5kIGZ1bmN0aW9uIG9iamVjdCBmb3IgcmVzb3VyY2UgIiArIHRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uLmdldCgpLmlzQWdncmVnYXRlKCkgPyBBR0dSRUdBVEVfRlVOQ1RJT05fUEVSTUlTU0lPTlMgOiBTQ0FMQVJfRlVOQ1RJT05fUEVSTUlTU0lPTlM7CiAgICAgICAgICAgICB9CkBAIC0zMDAsNiArMzAzLDEyIEBACiAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpCisgICAgeworICAgICAgICBpZiAoU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FLmVxdWFscyhrZXlzcGFjZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oIkFsdGVyaW5nIHBlcm1pc3Npb25zIG9uIGJ1aWx0aW4gZnVuY3Rpb25zIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisKICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhGdW5jdGlvblJlc291cmNlIG8pCiAgICAgewogICAgICAgICByZXR1cm4gdGhpcy5uYW1lLmNvbXBhcmVUbyhvLm5hbWUpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9JQXV0aGVudGljYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9JQXV0aGVudGljYXRvci5qYXZhCmluZGV4IDgwZWE3MTkuLjk5NjNlNGUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvSUF1dGhlbnRpY2F0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0lBdXRoZW50aWNhdG9yLmphdmEKQEAgLTE4LDExICsxOCwxMCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoOwogCiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiAKQEAgLTczLDExICs3MiwxNCBAQAogICAgICAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGdhaW4gYWNjZXNzIHRvIGNsaWVudCdzIGNlcnRpZmljYXRlIGNoYWluLCBpZiBwcmVzZW50LgogICAgICAqIEBwYXJhbSBjbGllbnRBZGRyZXNzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBjbGllbnQgd2hvbSB3ZSB3aXNoIHRvIGF1dGhlbnRpY2F0ZSwgb3IgbnVsbAogICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlmIGFuIGludGVybmFsIGNsaWVudCAob25lIG5vdCBjb25uZWN0ZWQgb3ZlciB0aGUgcmVtb3RlIHRyYW5zcG9ydCkuCi0gICAgICogQHBhcmFtIGNlcnRpZmljYXRlcyB0aGUgcGVlcidzIFg1MDkgQ2VydGlmaWNhdGUgY2hhaW4sIGlmIHByZXNlbnQuCisgICAgICogQHBhcmFtIGNlcnRpZmljYXRlcyB0aGUgcGVlcidzIENlcnRpZmljYXRlIGNoYWluLCBpZiBwcmVzZW50LgorICAgICAqICAgICAgICAgICAgICAgICAgICAgSXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGVzZSB3aWxsIGFsbCBiZSBpbnN0YW5jZXMgb2Yge0BsaW5rIGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGV9LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgYnV0IHdlIHBhc3MgdGhlbSBhcyB0aGUgYmFzZSB7QGxpbmsgQ2VydGlmaWNhdGV9IGluIGNhc2UgZnV0dXJlIGltcGxlbWVudGF0aW9ucyBsZXZlcmFnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgb3RoZXIgY2VydGlmaWNhdGUgdHlwZXMuCiAgICAgICogQHJldHVybiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLklBdXRoZW50aWNhdG9yLlNhc2xOZWdvdGlhdG9yIGltcGxlbWVudGF0aW9uCiAgICAgICogKHNlZSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5QYXNzd29yZEF1dGhlbnRpY2F0b3IuUGxhaW5UZXh0U2FzbEF1dGhlbnRpY2F0b3J9KQogICAgICAqLwotICAgIGRlZmF1bHQgU2FzbE5lZ290aWF0b3IgbmV3U2FzbE5lZ290aWF0b3IoSW5ldEFkZHJlc3MgY2xpZW50QWRkcmVzcywgWDUwOUNlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzKQorICAgIGRlZmF1bHQgU2FzbE5lZ290aWF0b3IgbmV3U2FzbE5lZ290aWF0b3IoSW5ldEFkZHJlc3MgY2xpZW50QWRkcmVzcywgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3U2FzbE5lZ290aWF0b3IoY2xpZW50QWRkcmVzcyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9JSW50ZXJub2RlQXV0aGVudGljYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9JSW50ZXJub2RlQXV0aGVudGljYXRvci5qYXZhCmluZGV4IDhlMDliOTAuLmU1MDM4YzAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvSUludGVybm9kZUF1dGhlbnRpY2F0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0lJbnRlcm5vZGVBdXRoZW50aWNhdG9yLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aDsKIAogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIApAQCAtMzMsNyArMzQsMzUgQEAKICAgICAgKiBAcGFyYW0gcmVtb3RlUG9ydCBwb3J0IG9mIHRoZSBjb25uZWN0aW5nIG5vZGUuCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgogICAgICAqLwotICAgIGJvb2xlYW4gYXV0aGVudGljYXRlKEluZXRBZGRyZXNzIHJlbW90ZUFkZHJlc3MsIGludCByZW1vdGVQb3J0KTsKKyAgICBARGVwcmVjYXRlZAorICAgIGRlZmF1bHQgYm9vbGVhbiBhdXRoZW50aWNhdGUoSW5ldEFkZHJlc3MgcmVtb3RlQWRkcmVzcywgaW50IHJlbW90ZVBvcnQpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjaWRlcyB3aGV0aGVyIGEgcGVlciBpcyBhbGxvd2VkIHRvIGNvbm5lY3QgdG8gdGhpcyBub2RlLgorICAgICAqIElmIHRoaXMgbWV0aG9kIHJldHVybnMgZmFsc2UsIHRoZSBzb2NrZXQgd2lsbCBiZSBpbW1lZGlhdGVseSBjbG9zZWQuCisgICAgICogPHA+CisgICAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyBhdXRoZW50aWNhdGUgbWV0aG9kIGJ5IElQIGFuZCBwb3J0IG1ldGhvZAorICAgICAqIDxwPgorICAgICAqIDEuIElmIGl0IGlzIElQIGJhc2VkIGF1dGhlbnRpY2F0aW9uIGlnbm9yZSB0aGUgY2VydGlmaWNhdGVzICYgY29ubmVjdGlvblR5cGUgcGFyYW1ldGVycyBpbiB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgKiBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKiAyLiBGb3IgY2VydGlmaWNhdGUgYmFzZWQgYXV0aGVudGljYXRpb24gbGlrZSBtVExTLCBzZXJ2ZXIncyBpZGVudGl0eSBmb3Igb3V0Ym91bmQgY29ubmVjdGlvbnMgaXMgdmVyaWZpZWQgYnkgdGhlCisgICAgICogdHJ1c3RlZCByb290IGNlcnRpZmljYXRlcyBpbiB0aGUgb3V0Ym91bmRfa2V5c3RvcmUuIEluIHN1Y2ggY2FzZXMgdGhpcyBtZXRob2QgbWF5IGJlIG92ZXJyaWRkZW4gdG8gcmV0dXJuIHRydWUKKyAgICAgKiB3aGVuIGNlcnRpZmljYXRlVHlwZSBpcyBPVVRCT1VORCwgYXMgdGhlIGF1dGhlbnRpY2F0aW9uIG9mIHRoZSBzZXJ2ZXIgaGFwcGVucyBkdXJpbmcgU1NMIEhhbmRzaGFrZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZW1vdGVBZGRyZXNzICBpcCBhZGRyZXNzIG9mIHRoZSBjb25uZWN0aW5nIG5vZGUuCisgICAgICogQHBhcmFtIHJlbW90ZVBvcnQgICAgIHBvcnQgb2YgdGhlIGNvbm5lY3Rpbmcgbm9kZS4KKyAgICAgKiBAcGFyYW0gY2VydGlmaWNhdGVzICAgcGVlciBjZXJ0aWZpY2F0ZXMKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvblR5cGUgSWYgdGhlIGNvbm5lY3Rpb24gaXMgaW5ib3VuZC9vdXRib3VuZCBjb25uZWN0aW9uLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gYXV0aGVudGljYXRlKEluZXRBZGRyZXNzIHJlbW90ZUFkZHJlc3MsIGludCByZW1vdGVQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMsIEludGVybm9kZUNvbm5lY3Rpb25EaXJlY3Rpb24gY29ubmVjdGlvblR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gYXV0aGVudGljYXRlKHJlbW90ZUFkZHJlc3MsIHJlbW90ZVBvcnQpOworICAgIH0KIAogICAgIC8qKgogICAgICAqIFZhbGlkYXRlcyBjb25maWd1cmF0aW9uIG9mIElJbnRlcm5vZGVBdXRoZW50aWNhdG9yIGltcGxlbWVudGF0aW9uIChpZiBjb25maWd1cmFibGUpLgpAQCAtNDEsNCArNzAsMzAgQEAKICAgICAgKiBAdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gd2hlbiB0aGVyZSBpcyBhIGNvbmZpZ3VyYXRpb24gZXJyb3IuCiAgICAgICovCiAgICAgdm9pZCB2YWxpZGF0ZUNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFNldHVwIGlzIGNhbGxlZCBvbmNlIHVwb24gc3lzdGVtIHN0YXJ0dXAgdG8gaW5pdGlhbGl6ZSB0aGUgSUF1dGhlbnRpY2F0b3IuCisgICAgICoKKyAgICAgKiBGb3IgZXhhbXBsZSwgdXNlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhbnkgcmVxdWlyZWQga2V5c3BhY2VzL2NvbHVtbiBmYW1pbGllcy4KKyAgICAgKi8KKyAgICBkZWZhdWx0IHZvaWQgc2V0dXBJbnRlcm5vZGUoKQorICAgIHsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEVudW0gdGhhdCByZXByZXNlbnRzIGNvbm5lY3Rpb24gdHlwZSBvZiBpbnRlcm5vZGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIElOQk9VTkQgLSBjYWxsZWQgYWZ0ZXIgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCwgd2l0aCBjZXJ0aWZpY2F0ZSBhdmFpbGFibGUgaWYgcHJlc2VudC4KKyAgICAgKiBPVVRCT1VORCAtIGNhbGxlZCBhZnRlciBjb25uZWN0aW9uIGVzdGFibGlzaGVkLCB3aXRoIGNlcnRpZmljYXRlIGF2YWlsYWJsZSBpZiBwcmVzZW50LgorICAgICAqIE9VVEJPVU5EX1BSRUNPTk5FQ1QgLSBjYWxsZWQgYmVmb3JlIGluaXRpYXRpbmcgYSBjb25uZWN0aW9uLCB3aXRob3V0IGNlcnRpZmljYXRlIGF2YWlsYWJsZS4KKyAgICAgKiBUaGUgb3V0Ym91bmQgY29ubmVjdGlvbiB3aWxsIGJlIGF1dGhlbnRpY2F0ZWQgd2l0aCB0aGUgY2VydGlmaWNhdGUgb25jZSBhIHJlZGlyZWN0ZWQgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC4KKyAgICAgKiBUaGlzIGlzIGFuIGV4dHJhIGNoZWNrIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IG1pc2NvbmZpZ3VyYXRpb24gYmVmb3JlIHJlY29ubmVjdGlvbiwgb3IgaWdub3JlZCBieSByZXR1cm5pbmcgdHJ1ZS4KKyAgICAgKi8KKyAgICBlbnVtIEludGVybm9kZUNvbm5lY3Rpb25EaXJlY3Rpb24KKyAgICB7CisgICAgICAgIElOQk9VTkQsCisgICAgICAgIE9VVEJPVU5ELAorICAgICAgICBPVVRCT1VORF9QUkVDT05ORUNUCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9QZXJtaXNzaW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL1Blcm1pc3Npb24uamF2YQppbmRleCBkNTUyMjgwLi5kMzI1NjUyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL1Blcm1pc3Npb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL1Blcm1pc3Npb24uamF2YQpAQCAtNjEsOSArNjEsMTMgQEAKICAgICBERVNDUklCRSwgLy8gcmVxdWlyZWQgb24gdGhlIHJvb3QtbGV2ZWwgUm9sZVJlc291cmNlIHRvIGxpc3QgYWxsIFJvbGVzCiAKICAgICAvLyBVREYgcGVybWlzc2lvbnMKLSAgICBFWEVDVVRFOyAgLy8gcmVxdWlyZWQgdG8gaW52b2tlIGFueSB1c2VyIGRlZmluZWQgZnVuY3Rpb24gb3IgYWdncmVnYXRlCisgICAgRVhFQ1VURSwgIC8vIHJlcXVpcmVkIHRvIGludm9rZSBhbnkgdXNlciBkZWZpbmVkIGZ1bmN0aW9uIG9yIGFnZ3JlZ2F0ZQorCisgICAgVU5NQVNLLCAvLyByZXF1aXJlZCB0byBzZWUgbWFza2VkIGRhdGEKKworICAgIFNFTEVDVF9NQVNLRUQ7IC8vIHJlcXVpcmVkIGZvciBTRUxFQ1Qgb24gYSB0YWJsZSB3aXRoIHJlc3RpY3Rpb25zIG9uIG1hc2tlZCBjb2x1bW5zCiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxQZXJtaXNzaW9uPiBBTEwgPQotICAgICAgICAgICAgU2V0cy5pbW11dGFibGVFbnVtU2V0KEVudW1TZXQucmFuZ2UoUGVybWlzc2lvbi5DUkVBVEUsIFBlcm1pc3Npb24uRVhFQ1VURSkpOworICAgICAgICAgICAgU2V0cy5pbW11dGFibGVFbnVtU2V0KEVudW1TZXQucmFuZ2UoUGVybWlzc2lvbi5DUkVBVEUsIFBlcm1pc3Npb24uU0VMRUNUX01BU0tFRCkpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2V0PFBlcm1pc3Npb24+IE5PTkUgPSBJbW11dGFibGVTZXQub2YoKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2JhdGNobG9nL0JhdGNoLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9iYXRjaGxvZy9CYXRjaC5qYXZhCmluZGV4IGI1YTYyODguLjY2NzI2M2IgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2JhdGNobG9nL0JhdGNoLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYmF0Y2hsb2cvQmF0Y2guamF2YQpAQCAtMTI2LDEwICsxMjYsMTAgQEAKICAgICAgICAgICAgIGJhdGNoLmlkLnNlcmlhbGl6ZShvdXQpOwogICAgICAgICAgICAgb3V0LndyaXRlTG9uZyhiYXRjaC5jcmVhdGlvblRpbWUpOwogCi0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoYmF0Y2guZGVjb2RlZE11dGF0aW9ucy5zaXplKCkpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoYmF0Y2guZGVjb2RlZE11dGF0aW9ucy5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChNdXRhdGlvbiBtdXRhdGlvbiA6IGJhdGNoLmRlY29kZWRNdXRhdGlvbnMpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KG11dGF0aW9uLnNlcmlhbGl6ZWRTaXplKHZlcnNpb24pKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihtdXRhdGlvbi5zZXJpYWxpemVkU2l6ZSh2ZXJzaW9uKSk7CiAgICAgICAgICAgICAgICAgTXV0YXRpb24uc2VyaWFsaXplci5zZXJpYWxpemUobXV0YXRpb24sIG91dCwgdmVyc2lvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE1MCw3ICsxNTAsNyBAQAogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248Qnl0ZUJ1ZmZlcj4gcmVhZEVuY29kZWRNdXRhdGlvbnMoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogCiAgICAgICAgICAgICBBcnJheUxpc3Q8Qnl0ZUJ1ZmZlcj4gbXV0YXRpb25zID0gbmV3IEFycmF5TGlzdDw+KGNvdW50KTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKQEAgLTE2MSwxMiArMTYxLDEyIEBACiAKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxNdXRhdGlvbj4gZGVjb2RlTXV0YXRpb25zKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgaW50IGNvdW50ID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgaW50IGNvdW50ID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAKICAgICAgICAgICAgIEFycmF5TGlzdDxNdXRhdGlvbj4gbXV0YXRpb25zID0gbmV3IEFycmF5TGlzdDw+KGNvdW50KTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbi5yZWFkVW5zaWduZWRWSW50KCk7IC8vIHNraXAgbXV0YXRpb24gc2l6ZQorICAgICAgICAgICAgICAgIGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOyAvLyBza2lwIG11dGF0aW9uIHNpemUKICAgICAgICAgICAgICAgICBtdXRhdGlvbnMuYWRkKE11dGF0aW9uLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24pKTsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYmF0Y2hsb2cvQmF0Y2hsb2dNYW5hZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9iYXRjaGxvZy9CYXRjaGxvZ01hbmFnZXIuamF2YQppbmRleCA2ZDEwMmIwLi5iN2IyNWNiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9iYXRjaGxvZy9CYXRjaGxvZ01hbmFnZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9iYXRjaGxvZy9CYXRjaGxvZ01hbmFnZXIuamF2YQpAQCAtNzcsNiArNzcsNyBAQAogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5CQVRDSExPR19SRVBMQVlfVElNRU9VVF9JTl9NUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWw7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsV2l0aFBhZ2luZzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmIuTVVUQVRJT05fUkVROwpAQCAtOTEsNyArOTIsNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJhdGNobG9nTWFuYWdlci5jbGFzcyk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCYXRjaGxvZ01hbmFnZXIgaW5zdGFuY2UgPSBuZXcgQmF0Y2hsb2dNYW5hZ2VyKCk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEJBVENITE9HX1JFUExBWV9USU1FT1VUID0gTG9uZy5nZXRMb25nKCJjYXNzYW5kcmEuYmF0Y2hsb2cucmVwbGF5X3RpbWVvdXRfaW5fbXMiLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0V3JpdGVScGNUaW1lb3V0KE1JTExJU0VDT05EUykgKiAyKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgQkFUQ0hMT0dfUkVQTEFZX1RJTUVPVVQgPSBCQVRDSExPR19SRVBMQVlfVElNRU9VVF9JTl9NUy5nZXRMb25nKERhdGFiYXNlRGVzY3JpcHRvci5nZXRXcml0ZVJwY1RpbWVvdXQoTUlMTElTRUNPTkRTKSAqIDIpOwogCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIHRvdGFsQmF0Y2hlc1JlcGxheWVkID0gMDsgLy8gbm8gY29uY3VycmVuY3kgcHJvdGVjdGlvbiBuZWNlc3NhcnkgYXMgb25seSB3cml0dGVuIGJ5IHJlcGxheSB0aHJlYWQuCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBUaW1lVVVJRCBsYXN0UmVwbGF5ZWRVdWlkID0gVGltZVVVSUQubWluQXRVbml4TWlsbGlzKDApOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY2FjaGUvQXV0b1NhdmluZ0NhY2hlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jYWNoZS9BdXRvU2F2aW5nQ2FjaGUuamF2YQppbmRleCAxZjM4M2VjLi5kZGUzNmYxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jYWNoZS9BdXRvU2F2aW5nQ2FjaGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jYWNoZS9BdXRvU2F2aW5nQ2FjaGUuamF2YQpAQCAtMTcsMTUgKzE3LDE3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGU7CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlEZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50Lk5vdFRocmVhZFNhZmU7CiAKIGltcG9ydCBvcmcuY2xpZmZjLmhpZ2hfc2NhbGVfbGliLk5vbkJsb2NraW5nSGFzaFNldDsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwpAQCAtMzMsMTkgKzM1LDMwIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkluZm8uVW5pdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbmZvLlVuaXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkNoZWNrc3VtbWVkUmFuZG9tQWNjZXNzUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQ2hlY2tzdW1tZWRTZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQ29ycnVwdEZpbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSW5wdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZU91dHB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuV3JhcHBlZERhdGFPdXRwdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNhY2hlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KVk1TdGFiaWxpdHlJbnNwZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKQEAgLTU5LDggKzcyLDkgQEAKIHsKICAgICBwdWJsaWMgaW50ZXJmYWNlIElTdHJlYW1GYWN0b3J5CiAgICAgewotICAgICAgICBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShGaWxlIGRhdGFQYXRoLCBGaWxlIGNyY1BhdGgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICAgICAgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShGaWxlIGRhdGFQYXRoLCBGaWxlIGNyY1BhdGgpOworICAgICAgICBEYXRhSW5wdXRTdHJlYW1QbHVzIGdldElucHV0U3RyZWFtKEZpbGUgZGF0YVBhdGgsIEZpbGUgY3JjUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgICAgIERhdGFPdXRwdXRTdHJlYW1QbHVzIGdldE91dHB1dFN0cmVhbShGaWxlIGRhdGFQYXRoLCBGaWxlIGNyY1BhdGgpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBdXRvU2F2aW5nQ2FjaGUuY2xhc3MpOwpAQCAtODUsOCArOTksMTAgQEAKICAgICAgKiAiZSIgaW50cm9kdWNlZCB3aXRoIENBU1NBTkRSQS0xMTIwNiwgb21pdHMgSW5kZXhJbmZvIGZyb20ga2V5LWNhY2hlLCBzdG9yZXMgb2Zmc2V0IGludG8gaW5kZXgtZmlsZQogICAgICAqCiAgICAgICogImYiIGludHJvZHVjZWQgd2l0aCBDQVNTQU5EUkEtOTQyNSwgY2hhbmdlcyAia2V5c3BhY2UudGFibGUuaW5kZXgiIGluIGNhY2hlIGtleXMgdG8gVGFibGVNZXRhZGF0YS5pZCtUYWJsZU1ldGFkYXRhLmluZGV4TmFtZQorICAgICAqCisgICAgICogImciIGludHJvZHVjZWQgYW4gZXhwbGljaXQgc3N0YWJsZSBmb3JtYXQgdHlwZSBvcmRpbmFsIG51bWJlciBzbyB0aGF0IHRoZSBlbnRyeSBjYW4gYmUgc2tpcHBlZCByZWdhcmRsZXNzIG9mIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gYW5kIHVzZWQgc2VyaWFsaXplcgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJSRU5UX1ZFUlNJT04gPSAiZiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfVkVSU0lPTiA9ICJnIjsKIAogICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIElTdHJlYW1GYWN0b3J5IHN0cmVhbUZhY3RvcnkgPSBuZXcgSVN0cmVhbUZhY3RvcnkoKQogICAgIHsKQEAgLTk1LDEyICsxMTEsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyaWNrbGVGc3luY0J5dGVJbnRlcnZhbChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0VHJpY2tsZUZzeW5jSW50ZXJ2YWxJbktpQigpICogMTAyNCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmlzaE9uQ2xvc2UodHJ1ZSkuYnVpbGQoKTsKIAotICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oRmlsZSBkYXRhUGF0aCwgRmlsZSBjcmNQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgcHVibGljIERhdGFJbnB1dFN0cmVhbVBsdXMgZ2V0SW5wdXRTdHJlYW0oRmlsZSBkYXRhUGF0aCwgRmlsZSBjcmNQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIENoZWNrc3VtbWVkUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4oZGF0YVBhdGgsIGNyY1BhdGgpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oRmlsZSBkYXRhUGF0aCwgRmlsZSBjcmNQYXRoKQorICAgICAgICBwdWJsaWMgRGF0YU91dHB1dFN0cmVhbVBsdXMgZ2V0T3V0cHV0U3RyZWFtKEZpbGUgZGF0YVBhdGgsIEZpbGUgY3JjUGF0aCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGVja3N1bW1lZFNlcXVlbnRpYWxXcml0ZXIoZGF0YVBhdGgsIGNyY1BhdGgsIG51bGwsIHdyaXRlck9wdGlvbik7CiAgICAgICAgIH0KQEAgLTEyMSwxMiArMTM3LDE3IEBACiAKICAgICBwdWJsaWMgRmlsZSBnZXRDYWNoZURhdGFQYXRoKFN0cmluZyB2ZXJzaW9uKQogICAgIHsKLSAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZXJpYWxpemVkQ2FjaGVQYXRoKCBjYWNoZVR5cGUsIHZlcnNpb24sICJkYiIpOworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlcmlhbGl6ZWRDYWNoZVBhdGgoY2FjaGVUeXBlLCB2ZXJzaW9uLCAiZGIiKTsKICAgICB9CiAKICAgICBwdWJsaWMgRmlsZSBnZXRDYWNoZUNyY1BhdGgoU3RyaW5nIHZlcnNpb24pCiAgICAgewotICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlcmlhbGl6ZWRDYWNoZVBhdGgoIGNhY2hlVHlwZSwgdmVyc2lvbiwgImNyYyIpOworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlcmlhbGl6ZWRDYWNoZVBhdGgoY2FjaGVUeXBlLCB2ZXJzaW9uLCAiY3JjIik7CisgICAgfQorCisgICAgcHVibGljIEZpbGUgZ2V0Q2FjaGVNZXRhZGF0YVBhdGgoU3RyaW5nIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlcmlhbGl6ZWRDYWNoZVBhdGgoY2FjaGVUeXBlLCB2ZXJzaW9uLCAibWV0YWRhdGEiKTsKICAgICB9CiAKICAgICBwdWJsaWMgV3JpdGVyIGdldFdyaXRlcihpbnQga2V5c1RvU2F2ZSkKQEAgLTE3NSw2ICsxOTYsNyBAQAogICAgICAgICByZXR1cm4gY2FjaGVMb2FkOwogICAgIH0KIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAgICAgcHVibGljIGludCBsb2FkU2F2ZWQoKQogICAgIHsKICAgICAgICAgaW50IGNvdW50ID0gMDsKQEAgLTE4MywzOSArMjA1LDMzIEBACiAgICAgICAgIC8vIG1vZGVybiBmb3JtYXQsIGFsbG93cyBib3RoIGtleSBhbmQgdmFsdWUgKHNvIGtleSBjYWNoZSBsb2FkIGNhbiBiZSBwdXJlbHkgc2VxdWVudGlhbCkKICAgICAgICAgRmlsZSBkYXRhUGF0aCA9IGdldENhY2hlRGF0YVBhdGgoQ1VSUkVOVF9WRVJTSU9OKTsKICAgICAgICAgRmlsZSBjcmNQYXRoID0gZ2V0Q2FjaGVDcmNQYXRoKENVUlJFTlRfVkVSU0lPTik7Ci0gICAgICAgIGlmIChkYXRhUGF0aC5leGlzdHMoKSAmJiBjcmNQYXRoLmV4aXN0cygpKQorICAgICAgICBGaWxlIG1ldGFkYXRhUGF0aCA9IGdldENhY2hlTWV0YWRhdGFQYXRoKENVUlJFTlRfVkVSU0lPTik7CisgICAgICAgIGlmIChkYXRhUGF0aC5leGlzdHMoKSAmJiBjcmNQYXRoLmV4aXN0cygpICYmIG1ldGFkYXRhUGF0aC5leGlzdHMoKSkKICAgICAgICAgewogICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtUGx1cyBpbiA9IG51bGw7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygicmVhZGluZyBzYXZlZCBjYWNoZSB7fSIsIGRhdGFQYXRoKTsKLSAgICAgICAgICAgICAgICBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW1QbHVzKG5ldyBMZW5ndGhBdmFpbGFibGVJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHJlYW1GYWN0b3J5LmdldElucHV0U3RyZWFtKGRhdGFQYXRoLCBjcmNQYXRoKSksIGRhdGFQYXRoLmxlbmd0aCgpKSk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlJlYWRpbmcgc2F2ZWQgY2FjaGU6IHt9LCB7fSwge30iLCBkYXRhUGF0aCwgY3JjUGF0aCwgbWV0YWRhdGFQYXRoKTsKKyAgICAgICAgICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbVBsdXMgbWV0YWRhdGFJbiA9IG1ldGFkYXRhUGF0aC5uZXdJbnB1dFN0cmVhbSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVMb2FkZXIuZGVzZXJpYWxpemVNZXRhZGF0YShtZXRhZGF0YUluKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbiA9IHN0cmVhbUZhY3RvcnkuZ2V0SW5wdXRTdHJlYW0oZGF0YVBhdGgsIGNyY1BhdGgpOwogCiAgICAgICAgICAgICAgICAgLy9DaGVjayB0aGUgc2NoZW1hIGhhcyBub3QgY2hhbmdlZCBzaW5jZSBDRnMgYXJlIGxvb2tlZCB1cCBieSBuYW1lIHdoaWNoIGlzIGFtYmlndW91cwogICAgICAgICAgICAgICAgIFVVSUQgc2NoZW1hVmVyc2lvbiA9IG5ldyBVVUlEKGluLnJlYWRMb25nKCksIGluLnJlYWRMb25nKCkpOwogICAgICAgICAgICAgICAgIGlmICghc2NoZW1hVmVyc2lvbi5lcXVhbHMoU2NoZW1hLmluc3RhbmNlLmdldFZlcnNpb24oKSkpCiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYWNoZSBzY2hlbWEgdmVyc2lvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzY2hlbWFWZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgc2NoZW1hIHZlcnNpb24gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU2NoZW1hLmluc3RhbmNlLmdldFZlcnNpb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2NoZW1hVmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgbWF0Y2ggY3VycmVudCBzY2hlbWEgdmVyc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgU2NoZW1hLmluc3RhbmNlLmdldFZlcnNpb24oKSk7CiAKICAgICAgICAgICAgICAgICBBcnJheURlcXVlPEZ1dHVyZTxQYWlyPEssIFY+Pj4gZnV0dXJlcyA9IG5ldyBBcnJheURlcXVlPD4oKTsKICAgICAgICAgICAgICAgICBsb25nIGxvYWRCeU5hbm9zID0gc3RhcnQgKyBUaW1lVW5pdC5TRUNPTkRTLnRvTmFub3MoRGF0YWJhc2VEZXNjcmlwdG9yLmdldENhY2hlTG9hZFRpbWVvdXQoKSk7CiAgICAgICAgICAgICAgICAgd2hpbGUgKG5hbm9UaW1lKCkgPCBsb2FkQnlOYW5vcyAmJiBpbi5hdmFpbGFibGUoKSA+IDApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL3RhYmxlSWQgYW5kIGluZGV4TmFtZSBhcmUgc2VyaWFsaXplZCBieSB0aGUgc2VyaWFsaXplcnMgaW4gQ2FjaGVTZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgIC8vVGhhdCBpcyBkZWxlZ2F0ZWQgdGhlcmUgYmVjYXVzZSB0aGVyZSBhcmUgc2VyaWFsaXplciBzcGVjaWZpYyBjb25kaXRpb25zCi0gICAgICAgICAgICAgICAgICAgIC8vd2hlcmUgYSBjYWNoZSBrZXkgaXMgc2tpcHBlZCBhbmQgbm90IHdyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgVGFibGVJZCB0YWJsZUlkID0gVGFibGVJZC5kZXNlcmlhbGl6ZShpbik7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbmRleE5hbWUgPSBpbi5yZWFkVVRGKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE5hbWUuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhOYW1lID0gbnVsbDsKLQotICAgICAgICAgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmVJbnN0YW5jZSh0YWJsZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4TmFtZSAhPSBudWxsICYmIGNmcyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgY2ZzID0gY2ZzLmluZGV4TWFuYWdlci5nZXRJbmRleEJ5TmFtZShpbmRleE5hbWUpLmdldEJhY2tpbmdUYWJsZSgpLm9yRWxzZShudWxsKTsKLQotICAgICAgICAgICAgICAgICAgICBGdXR1cmU8UGFpcjxLLCBWPj4gZW50cnlGdXR1cmUgPSBjYWNoZUxvYWRlci5kZXNlcmlhbGl6ZShpbiwgY2ZzKTsKKyAgICAgICAgICAgICAgICAgICAgRnV0dXJlPFBhaXI8SywgVj4+IGVudHJ5RnV0dXJlID0gY2FjaGVMb2FkZXIuZGVzZXJpYWxpemUoaW4pOwogICAgICAgICAgICAgICAgICAgICAvLyBLZXkgY2FjaGUgZW50cnkgY2FuIHJldHVybiBudWxsLCBpZiB0aGUgU1NUYWJsZSBkb2Vzbid0IGV4aXN0LgogICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnlGdXR1cmUgPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMjY4LDcgKzI4NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQogICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJjb21wbGV0ZWQgcmVhZGluZyAoe30gbXM7IHt9IGtleXMpIHNhdmVkIGNhY2hlIHt9IiwKLSAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTkFOT1NFQ09ORFMudG9NaWxsaXMobmFub1RpbWUoKSAtIHN0YXJ0KSwgY291bnQsIGRhdGFQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5OQU5PU0VDT05EUy50b01pbGxpcyhuYW5vVGltZSgpIC0gc3RhcnQpLCBjb3VudCwgZGF0YVBhdGgpOwogICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgfQogCkBAIC0zMTMsNyArMzI5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c0VzdGltYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbml0LktFWVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUaW1lVVVJRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRpbWVVVUlEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhY2hlRGF0YVBhdGgoQ1VSUkVOVF9WRVJTSU9OKS50b1BhdGgoKS50b1N0cmluZygpKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBDYWNoZVNlcnZpY2UuQ2FjaGVUeXBlIGNhY2hlVHlwZSgpCkBAIC0zNDEsOCArMzU4LDEyIEBACiAKICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBuYW5vVGltZSgpOwogCi0gICAgICAgICAgICBQYWlyPEZpbGUsIEZpbGU+IGNhY2hlRmlsZVBhdGhzID0gdGVtcENhY2hlRmlsZXMoKTsKLSAgICAgICAgICAgIHRyeSAoV3JhcHBlZERhdGFPdXRwdXRTdHJlYW1QbHVzIHdyaXRlciA9IG5ldyBXcmFwcGVkRGF0YU91dHB1dFN0cmVhbVBsdXMoc3RyZWFtRmFjdG9yeS5nZXRPdXRwdXRTdHJlYW0oY2FjaGVGaWxlUGF0aHMubGVmdCwgY2FjaGVGaWxlUGF0aHMucmlnaHQpKSkKKyAgICAgICAgICAgIEZpbGUgZGF0YVRtcEZpbGUgPSBnZXRUZW1wQ2FjaGVGaWxlKGdldENhY2hlRGF0YVBhdGgoQ1VSUkVOVF9WRVJTSU9OKSk7CisgICAgICAgICAgICBGaWxlIGNyY1RtcEZpbGUgPSBnZXRUZW1wQ2FjaGVGaWxlKGdldENhY2hlQ3JjUGF0aChDVVJSRU5UX1ZFUlNJT04pKTsKKyAgICAgICAgICAgIEZpbGUgbWV0YWRhdGFUbXBGaWxlID0gZ2V0VGVtcENhY2hlRmlsZShnZXRDYWNoZU1ldGFkYXRhUGF0aChDVVJSRU5UX1ZFUlNJT04pKTsKKworICAgICAgICAgICAgdHJ5IChXcmFwcGVkRGF0YU91dHB1dFN0cmVhbVBsdXMgd3JpdGVyID0gbmV3IFdyYXBwZWREYXRhT3V0cHV0U3RyZWFtUGx1cyhzdHJlYW1GYWN0b3J5LmdldE91dHB1dFN0cmVhbShkYXRhVG1wRmlsZSwgY3JjVG1wRmlsZSkpOworICAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtUGx1cyBtZXRhZGF0YVdyaXRlciA9IG1ldGFkYXRhVG1wRmlsZS5uZXdPdXRwdXRTdHJlYW0oRmlsZS5Xcml0ZU1vZGUuT1ZFUldSSVRFKSkKICAgICAgICAgICAgIHsKIAogICAgICAgICAgICAgICAgIC8vTmVlZCB0byBiZSBhYmxlIHRvIGNoZWNrIHNjaGVtYSB2ZXJzaW9uIGJlY2F1c2UgQ0YgbmFtZXMgYXJlIGFtYmlndW91cwpAQCAtMzY2LDYgKzM4Nyw5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlzV3JpdHRlbiA+PSBrZXlzRXN0aW1hdGUpCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYWNoZUxvYWRlci5zZXJpYWxpemVNZXRhZGF0YShtZXRhZGF0YVdyaXRlcik7CisgICAgICAgICAgICAgICAgbWV0YWRhdGFXcml0ZXIuc3luYygpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB8IE5vU3VjaEZpbGVFeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKQEAgLTM3MywzMCArMzk3LDM2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIGNhY2hlRmlsZVBhdGhzLmxlZnQpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgZGF0YVRtcEZpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhY2hlTG9hZGVyLmNsZWFudXBBZnRlclNlcmlhbGl6ZSgpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBGaWxlIGNhY2hlRmlsZSA9IGdldENhY2hlRGF0YVBhdGgoQ1VSUkVOVF9WRVJTSU9OKTsKKyAgICAgICAgICAgIEZpbGUgZGF0YUZpbGUgPSBnZXRDYWNoZURhdGFQYXRoKENVUlJFTlRfVkVSU0lPTik7CiAgICAgICAgICAgICBGaWxlIGNyY0ZpbGUgPSBnZXRDYWNoZUNyY1BhdGgoQ1VSUkVOVF9WRVJTSU9OKTsKKyAgICAgICAgICAgIEZpbGUgbWV0YWRhdGFGaWxlID0gZ2V0Q2FjaGVNZXRhZGF0YVBhdGgoQ1VSUkVOVF9WRVJTSU9OKTsKIAotICAgICAgICAgICAgY2FjaGVGaWxlLnRyeURlbGV0ZSgpOyAvLyBpZ25vcmUgZXJyb3IgaWYgaXQgZGlkbid0IGV4aXN0CisgICAgICAgICAgICBkYXRhRmlsZS50cnlEZWxldGUoKTsgLy8gaWdub3JlIGVycm9yIGlmIGl0IGRpZG4ndCBleGlzdAogICAgICAgICAgICAgY3JjRmlsZS50cnlEZWxldGUoKTsKKyAgICAgICAgICAgIG1ldGFkYXRhRmlsZS50cnlEZWxldGUoKTsKIAotICAgICAgICAgICAgaWYgKCFjYWNoZUZpbGVQYXRocy5sZWZ0LnRyeU1vdmUoY2FjaGVGaWxlKSkKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byByZW5hbWUge30gdG8ge30iLCBjYWNoZUZpbGVQYXRocy5sZWZ0LCBjYWNoZUZpbGUpOworICAgICAgICAgICAgaWYgKCFkYXRhVG1wRmlsZS50cnlNb3ZlKGRhdGFGaWxlKSkKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlVuYWJsZSB0byByZW5hbWUge30gdG8ge30iLCBkYXRhVG1wRmlsZSwgZGF0YUZpbGUpOwogCi0gICAgICAgICAgICBpZiAoIWNhY2hlRmlsZVBhdGhzLnJpZ2h0LnRyeU1vdmUoY3JjRmlsZSkpCi0gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gcmVuYW1lIHt9IHRvIHt9IiwgY2FjaGVGaWxlUGF0aHMucmlnaHQsIGNyY0ZpbGUpOworICAgICAgICAgICAgaWYgKCFjcmNUbXBGaWxlLnRyeU1vdmUoY3JjRmlsZSkpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gcmVuYW1lIHt9IHRvIHt9IiwgY3JjVG1wRmlsZSwgY3JjRmlsZSk7CiAKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTYXZlZCB7fSAoe30gaXRlbXMpIGluIHt9IG1zIiwgY2FjaGVUeXBlLCBrZXlzV3JpdHRlbiwgVGltZVVuaXQuTkFOT1NFQ09ORFMudG9NaWxsaXMobmFub1RpbWUoKSAtIHN0YXJ0KSk7CisgICAgICAgICAgICBpZiAoIW1ldGFkYXRhVG1wRmlsZS50cnlNb3ZlKG1ldGFkYXRhRmlsZSkpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJVbmFibGUgdG8gcmVuYW1lIHt9IHRvIHt9IiwgbWV0YWRhdGFUbXBGaWxlLCBtZXRhZGF0YUZpbGUpOworCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiU2F2ZWQge30gKHt9IGl0ZW1zKSBpbiB7fSBtcyB0byB7fSA6IHt9IE1CIiwgY2FjaGVUeXBlLCBrZXlzV3JpdHRlbiwgVGltZVVuaXQuTkFOT1NFQ09ORFMudG9NaWxsaXMobmFub1RpbWUoKSAtIHN0YXJ0KSwgZGF0YUZpbGUudG9QYXRoKCksIGRhdGFGaWxlLmxlbmd0aCgpIC8gKDEgPDwgMjApKTsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgUGFpcjxGaWxlLCBGaWxlPiB0ZW1wQ2FjaGVGaWxlcygpCisgICAgICAgIHByaXZhdGUgRmlsZSBnZXRUZW1wQ2FjaGVGaWxlKEZpbGUgY2FjaGVGaWxlKQogICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGRhdGFQYXRoID0gZ2V0Q2FjaGVEYXRhUGF0aChDVVJSRU5UX1ZFUlNJT04pOwotICAgICAgICAgICAgRmlsZSBjcmNQYXRoID0gZ2V0Q2FjaGVDcmNQYXRoKENVUlJFTlRfVkVSU0lPTik7Ci0gICAgICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUoRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlKGRhdGFQYXRoLm5hbWUoKSwgbnVsbCwgZGF0YVBhdGgucGFyZW50KCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZShjcmNQYXRoLm5hbWUoKSwgbnVsbCwgY3JjUGF0aC5wYXJlbnQoKSkpOworICAgICAgICAgICAgcmV0dXJuIEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZShjYWNoZUZpbGUubmFtZSgpLCBudWxsLCBjYWNoZUZpbGUucGFyZW50KCkpOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGRlbGV0ZU9sZENhY2hlRmlsZXMoKQpAQCAtNDMyLDEyICs0NjIsOTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FjaGVTZXJpYWxpemVyPEsgZXh0ZW5kcyBDYWNoZUtleSwgVj4KKyAgICAvKioKKyAgICAgKiBBIGJhc2UgY2FjaGUgc2VyaWFsaXplciB0aGF0IGlzIHVzZWQgdG8gc2VyaWFsaXplL2Rlc2VyaWFsaXplIGEgY2FjaGUgdG8vZnJvbSBkaXNrLgorICAgICAqIDxwPgorICAgICAqIEl0IGV4cGVjdHMgdGhlIGZvbGxvd2luZyBsaWZlY3ljbGU6CisgICAgICogU2VyaWFsaXphdGlvbnM6CisgICAgICogMS4ge0BsaW5rICNzZXJpYWxpemUoQ2FjaGVLZXksIERhdGFPdXRwdXRQbHVzLCBDb2x1bW5GYW1pbHlTdG9yZSl9IGlzIGNhbGxlZCBmb3IgZWFjaCBrZXkgaW4gdGhlIGNhY2hlLgorICAgICAqIDIuIHtAbGluayAjc2VyaWFsaXplTWV0YWRhdGEoRGF0YU91dHB1dFBsdXMpfSBpcyBjYWxsZWQgdG8gc2VyaWFsaXplIGFueSBtZXRhZGF0YS4KKyAgICAgKiAzLiB7QGxpbmsgI2NsZWFudXBBZnRlclNlcmlhbGl6ZSgpfSBpcyBjYWxsZWQgdG8gY2xlYW4gdXAgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIHNlcmlhbGl6YXRpb24uCisgICAgICogPHA+CisgICAgICogRGVzZXJpYWxpemF0aW9uczoKKyAgICAgKiAxLiB7QGxpbmsgI2Rlc2VyaWFsaXplTWV0YWRhdGEoRGF0YUlucHV0UGx1cyl9IGlzIGNhbGxlZCB0byBkZXNlcmlhbGl6ZSBhbnkgbWV0YWRhdGEuCisgICAgICogMi4ge0BsaW5rICNkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzKX0gaXMgY2FsbGVkIGZvciBlYWNoIGtleSBpbiB0aGUgY2FjaGUuCisgICAgICogMy4ge0BsaW5rICNjbGVhbnVwQWZ0ZXJEZXNlcmlhbGl6ZSgpfSBpcyBjYWxsZWQgdG8gY2xlYW4gdXAgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGRlc2VyaWFsaXphdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciB0aGUgbWV0YWRhdGEgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24uCisgICAgICogVGhlIG1ldGFkYXRhIGluY2x1ZGVzIGEgZGljdGlvbmFyeSBvZiBjb2x1bW4gZmFtaWx5IHN0b3JlcyBjb2xsZWN0ZWQgZHVyaW5nIHNlcmlhbGl6YXRpb24gd2hlbmV2ZXIKKyAgICAgKiB7QGxpbmsgI3dyaXRlQ0ZTKERhdGFPdXRwdXRQbHVzLCBDb2x1bW5GYW1pbHlTdG9yZSl9IG9yIHtAbGluayAjZ2V0T3JDcmVhdGVDRlNPcmRpbmFsKENvbHVtbkZhbWlseVN0b3JlKX0KKyAgICAgKiBhcmUgY2FsbGVkLiBXaGVuIHN1Y2ggbWV0YWRhdGEgaXMgZGVzZXJpYWxpemVkLCB0aGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rICNkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzKX0gbWF5CisgICAgICogdXNlIHtAbGluayAjcmVhZENGUyhEYXRhSW5wdXRQbHVzKX0gbWV0aG9kIHRvIHJlYWQgdGhlIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlZCB3aXRoCisgICAgICoge0BsaW5rICN3cml0ZUNGUyhEYXRhT3V0cHV0UGx1cywgQ29sdW1uRmFtaWx5U3RvcmUpfS4KKyAgICAgKi8KKyAgICBATm90VGhyZWFkU2FmZQorICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FjaGVTZXJpYWxpemVyPEsgZXh0ZW5kcyBDYWNoZUtleSwgVj4KICAgICB7Ci0gICAgICAgIHZvaWQgc2VyaWFsaXplKEsga2V5LCBEYXRhT3V0cHV0UGx1cyBvdXQsIENvbHVtbkZhbWlseVN0b3JlIGNmcykgdGhyb3dzIElPRXhjZXB0aW9uOworICAgICAgICBwcml2YXRlIENvbHVtbkZhbWlseVN0b3JlW10gY2ZTdG9yZXM7CiAKLSAgICAgICAgRnV0dXJlPFBhaXI8SywgVj4+IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIENvbHVtbkZhbWlseVN0b3JlIGNmcykgdGhyb3dzIElPRXhjZXB0aW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIExpbmtlZEhhc2hNYXA8UGFpcjxUYWJsZUlkLCBTdHJpbmc+LCBJbnRlZ2VyPiBjZnNPcmRpbmFscyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKIAotICAgICAgICBkZWZhdWx0IHZvaWQgY2xlYW51cEFmdGVyRGVzZXJpYWxpemUoKSB7IH0KKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIGludCBnZXRPckNyZWF0ZUNGU09yZGluYWwoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQorICAgICAgICB7CisgICAgICAgICAgICBJbnRlZ2VyIG9yZGluYWwgPSBjZnNPcmRpbmFscy5wdXRJZkFic2VudChQYWlyLmNyZWF0ZShjZnMubWV0YWRhdGEoKS5pZCwgY2ZzLm1ldGFkYXRhKCkuaW5kZXhOYW1lKCkub3JFbHNlKCIiKSksIGNmc09yZGluYWxzLnNpemUoKSk7CisgICAgICAgICAgICBpZiAob3JkaW5hbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIG9yZGluYWwgPSBjZnNPcmRpbmFscy5zaXplKCkgLSAxOworICAgICAgICAgICAgcmV0dXJuIG9yZGluYWw7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgQ29sdW1uRmFtaWx5U3RvcmUgcmVhZENGUyhEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNmU3RvcmVzW2luLnJlYWRVbnNpZ25lZFZJbnQzMigpXTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlQ0ZTKERhdGFPdXRwdXRQbHVzIG91dCwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoZ2V0T3JDcmVhdGVDRlNPcmRpbmFsKGNmcykpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplTWV0YWRhdGEoRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgLy8gd3JpdGUgdGhlIHRhYmxlIGlkcworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoY2ZzT3JkaW5hbHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoUGFpcjxUYWJsZUlkLCBTdHJpbmc+IHRhYmxlQW5kSW5kZXggOiBjZnNPcmRpbmFscy5rZXlTZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YWJsZUFuZEluZGV4LmxlZnQuc2VyaWFsaXplKG91dCk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKHRhYmxlQW5kSW5kZXgucmlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemVNZXRhZGF0YShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRhYmxlRW50cmllcyA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworICAgICAgICAgICAgaWYgKHRhYmxlRW50cmllcyA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNmU3RvcmVzID0gbmV3IENvbHVtbkZhbWlseVN0b3JlW3RhYmxlRW50cmllc107CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlRW50cmllczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRhYmxlSWQgdGFibGVJZCA9IFRhYmxlSWQuZGVzZXJpYWxpemUoaW4pOworICAgICAgICAgICAgICAgIFN0cmluZyBpbmRleE5hbWUgPSBpbi5yZWFkVVRGKCk7CisgICAgICAgICAgICAgICAgY2ZTdG9yZXNbaV0gPSBTY2hlbWEuaW5zdGFuY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmVJbnN0YW5jZSh0YWJsZUlkKTsKKyAgICAgICAgICAgICAgICBpZiAoY2ZTdG9yZXNbaV0gIT0gbnVsbCAmJiAhaW5kZXhOYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgY2ZTdG9yZXNbaV0gPSBjZlN0b3Jlc1tpXS5pbmRleE1hbmFnZXIuZ2V0SW5kZXhCeU5hbWUoaW5kZXhOYW1lKS5nZXRCYWNraW5nVGFibGUoKS5vckVsc2UobnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXJpYWxpemUoSyBrZXksIERhdGFPdXRwdXRQbHVzIG91dCwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IEZ1dHVyZTxQYWlyPEssIFY+PiBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYW51cEFmdGVyU2VyaWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgY2ZzT3JkaW5hbHMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFudXBBZnRlckRlc2VyaWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgY2ZTdG9yZXMgPSBudWxsOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY2FjaGUvQ2h1bmtDYWNoZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY2FjaGUvQ2h1bmtDYWNoZS5qYXZhCmluZGV4IDUxZGJkYzYuLjhmMjJlZTggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NhY2hlL0NodW5rQ2FjaGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jYWNoZS9DaHVua0NhY2hlLmphdmEKQEAgLTIzLDE1ICsyMywyMiBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CiAKLWltcG9ydCBjb20uZ2l0aHViLmJlbm1hbmVzLmNhZmZlaW5lLmNhY2hlLio7CitpbXBvcnQgY29tLmdpdGh1Yi5iZW5tYW5lcy5jYWZmZWluZS5jYWNoZS5DYWNoZUxvYWRlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmJlbm1hbmVzLmNhZmZlaW5lLmNhY2hlLkNhZmZlaW5lOworaW1wb3J0IGNvbS5naXRodWIuYmVubWFuZXMuY2FmZmVpbmUuY2FjaGUuTG9hZGluZ0NhY2hlOworaW1wb3J0IGNvbS5naXRodWIuYmVubWFuZXMuY2FmZmVpbmUuY2FjaGUuUmVtb3ZhbENhdXNlOworaW1wb3J0IGNvbS5naXRodWIuYmVubWFuZXMuY2FmZmVpbmUuY2FjaGUuUmVtb3ZhbExpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuSW1tZWRpYXRlRXhlY3V0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkNoYW5uZWxQcm94eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkNodW5rUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJlYnVmZmVyZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SZWJ1ZmZlcmVyRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNodW5rQ2FjaGVNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5CdWZmZXJQb29sOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5CdWZmZXJQb29sczsKQEAgLTE3MCw3ICsxNzcsNyBAQAogICAgICAgICBjYWNoZS5pbnZhbGlkYXRlQWxsKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBSZWJ1ZmZlcmVyRmFjdG9yeSB3cmFwKENodW5rUmVhZGVyIGZpbGUpCisgICAgcHVibGljIFJlYnVmZmVyZXJGYWN0b3J5IHdyYXAoQ2h1bmtSZWFkZXIgZmlsZSkKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgQ2FjaGluZ1JlYnVmZmVyZXIoZmlsZSk7CiAgICAgfQpAQCAtMTk2LDE0ICsyMDMsNiBAQAogICAgICAgICBjYWNoZS5pbnZhbGlkYXRlQWxsKEl0ZXJhYmxlcy5maWx0ZXIoY2FjaGUuYXNNYXAoKS5rZXlTZXQoKSwgeCAtPiB4LnBhdGguZXF1YWxzKGZpbGVOYW1lKSkpOwogICAgIH0KIAotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyB2b2lkIGVuYWJsZShib29sZWFuIGVuYWJsZWQpCi0gICAgewotICAgICAgICBDaHVua0NhY2hlLmVuYWJsZWQgPSBlbmFibGVkOwotICAgICAgICBjYWNoZS5pbnZhbGlkYXRlQWxsKCk7Ci0gICAgICAgIG1ldHJpY3MucmVzZXQoKTsKLSAgICB9Ci0KICAgICAvLyBUT0RPOiBJbnZhbGlkYXRlIGNhY2hlcyBmb3Igb2Jzb2xldGVkL01PVkVEX1NUQVJUIHRhYmxlcz8KIAogICAgIC8qKgpAQCAtMjM4LDggKzIzNywxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRocm93YWJsZXMucHJvcGFnYXRlSWZJbnN0YW5jZU9mKHQuZ2V0Q2F1c2UoKSwgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24uY2xhc3MpOwotICAgICAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKHQpOworICAgICAgICAgICAgICAgIGlmICh0LmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKXQuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQodCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzE3LDQgKzMxOCw0IEBACiAgICAgICAgICAgICAgICAgLm1hcChwb2xpY3kgLT4gcG9saWN5LndlaWdodGVkU2l6ZSgpLm9yRWxzZUdldChjYWNoZTo6ZXN0aW1hdGVkU2l6ZSkpCiAgICAgICAgICAgICAgICAgLm9yRWxzZUdldChjYWNoZTo6ZXN0aW1hdGVkU2l6ZSk7CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvRGVidWdnYWJsZVRhc2suamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvRGVidWdnYWJsZVRhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzA0ZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9EZWJ1Z2dhYmxlVGFzay5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TaGFyZWQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkLlJlY3Vyc2l2ZS5JTlRFUkZBQ0VTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TaGFyZWQuU2NvcGUuU0lNVUxBVElPTjsKKworLyoqCisgKiBJbnRlcmZhY2UgdG8gaW5jbHVkZSBvbiBhIFJ1bm5hYmxlIG9yIENhbGxhYmxlIHN1Ym1pdHRlZCB0byB0aGUge0BsaW5rIFNoYXJlZEV4ZWN1dG9yUG9vbH0gdG8gcHJvdmlkZSBtb3JlCisgKiBkZXRhaWxlZCBkaWFnbm9zdGljcy4KKyAqLworQFNoYXJlZChzY29wZSA9IFNJTVVMQVRJT04sIGlubmVyID0gSU5URVJGQUNFUykKK3B1YmxpYyBpbnRlcmZhY2UgRGVidWdnYWJsZVRhc2sKK3sKKyAgICBwdWJsaWMgbG9uZyBjcmVhdGlvblRpbWVOYW5vcygpOworCisgICAgcHVibGljIGxvbmcgc3RhcnRUaW1lTmFub3MoKTsKKworICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKTsKKyAgICAKKyAgICBpbnRlcmZhY2UgUnVubmFibGVEZWJ1Z2dhYmxlVGFzayBleHRlbmRzIFJ1bm5hYmxlLCBEZWJ1Z2dhYmxlVGFzayB7fQorCisgICAgLyoqCisgICAgICogV3JhcHMgYSB7QGxpbmsgRGVidWdnYWJsZVRhc2t9IHRvIGluY2x1ZGUgdGhlIG5hbWUgb2YgdGhlIHRocmVhZCBydW5uaW5nIGl0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUnVubmluZ0RlYnVnZ2FibGVUYXNrIGltcGxlbWVudHMgRGVidWdnYWJsZVRhc2sKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgRGVidWdnYWJsZVRhc2sgdGFzazsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGhyZWFkSWQ7CisKKyAgICAgICAgcHVibGljIFJ1bm5pbmdEZWJ1Z2dhYmxlVGFzayhTdHJpbmcgdGhyZWFkSWQsIERlYnVnZ2FibGVUYXNrIHRhc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudGFzayA9IHRhc2s7CisgICAgICAgICAgICB0aGlzLnRocmVhZElkID0gdGhyZWFkSWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRocmVhZElkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRocmVhZElkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzVGFzaygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0YXNrICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgY3JlYXRpb25UaW1lTmFub3MoKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgaGFzVGFzaygpOworICAgICAgICAgICAgcmV0dXJuIHRhc2suY3JlYXRpb25UaW1lTmFub3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBzdGFydFRpbWVOYW5vcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBoYXNUYXNrKCk7CisgICAgICAgICAgICByZXR1cm4gdGFzay5zdGFydFRpbWVOYW5vcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgaGFzVGFzaygpOworICAgICAgICAgICAgcmV0dXJuIHRhc2suZGVzY3JpcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvRXhlY3V0aW9uRmFpbHVyZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9FeGVjdXRpb25GYWlsdXJlLmphdmEKaW5kZXggN2ZhN2RjYi4uMjdhYjg4NSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9FeGVjdXRpb25GYWlsdXJlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9FeGVjdXRpb25GYWlsdXJlLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkRlYnVnZ2FibGVUYXNrLlJ1bm5hYmxlRGVidWdnYWJsZVRhc2s7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIApAQCAtMTA2LDYgKzEwNywxNCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEBzZWUgI3N1cHByZXNzaW5nKFdpdGhSZXNvdXJjZXMsIFJ1bm5hYmxlKQorICAgICAqLworICAgIHN0YXRpYyBSdW5uYWJsZURlYnVnZ2FibGVUYXNrIHN1cHByZXNzaW5nRGVidWdnYWJsZShXaXRoUmVzb3VyY2VzIHdpdGhSZXNvdXJjZXMsIFJ1bm5hYmxlRGVidWdnYWJsZVRhc2sgZGVidWdnYWJsZSkKKyAgICB7CisgICAgICAgIHJldHVybiBlbmZvcmNlT3B0aW9uc0RlYnVnZ2FibGUod2l0aFJlc291cmNlcywgZGVidWdnYWJsZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEVuY2Fwc3VsYXRlIHRoZSBleGVjdXRpb24sIHByb3BhZ2F0aW5nIG9yIHN1cHByZXNzaW5nIGFueSBleGNlcHRpb25zIGFzIHJlcXVlc3RlZC4KICAgICAgKgogICAgICAqIG5vdGUgdGhhdCBpZiB7QGNvZGUgd3JhcH0gaXMgYSB7QGxpbmsgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlfSBpdHMgZXhjZXB0aW9ucyBtYXkgbm90IGJlIGNhcHR1cmVkLApAQCAtMTE5LDcgKzEyOCw3IEBACiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5IChDbG9zZWFibGUgY2xvc2UgPSB3aXRoUmVzb3VyY2VzLmdldCgpKQorICAgICAgICAgICAgICAgIHRyeSAoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENsb3NlYWJsZSBjbG9zZSA9IHdpdGhSZXNvdXJjZXMuZ2V0KCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB3cmFwLnJ1bigpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE0MCw2ICsxNDksNTQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAc2VlICNlbmZvcmNlT3B0aW9ucyhXaXRoUmVzb3VyY2VzLCBSdW5uYWJsZSwgYm9vbGVhbikKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBSdW5uYWJsZURlYnVnZ2FibGVUYXNrIGVuZm9yY2VPcHRpb25zRGVidWdnYWJsZShXaXRoUmVzb3VyY2VzIHdpdGhSZXNvdXJjZXMsIFJ1bm5hYmxlRGVidWdnYWJsZVRhc2sgZGVidWdnYWJsZSwgYm9vbGVhbiBwcm9wYWdhdGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFJ1bm5hYmxlRGVidWdnYWJsZVRhc2soKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5IChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ2xvc2VhYmxlIGNsb3NlID0gd2l0aFJlc291cmNlcy5nZXQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRlYnVnZ2FibGUucnVuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZSh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BhZ2F0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z2dhYmxlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGxvbmcgY3JlYXRpb25UaW1lTmFub3MoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z2dhYmxlLmNyZWF0aW9uVGltZU5hbm9zKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGxvbmcgc3RhcnRUaW1lTmFub3MoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWJ1Z2dhYmxlLnN0YXJ0VGltZU5hbm9zKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlYnVnZ2FibGUuZGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTZWUge0BsaW5rICNlbmZvcmNlT3B0aW9ucyhXaXRoUmVzb3VyY2VzLCBDYWxsYWJsZSl9CiAgICAgICovCiAgICAgc3RhdGljIDxWPiBDYWxsYWJsZTxWPiBwcm9wYWdhdGluZyhDYWxsYWJsZTxWPiB3cmFwKQpAQCAtMTU4LDcgKzIxNSw3IEBACiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBWIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5IChDbG9zZWFibGUgY2xvc2UgPSB3aXRoUmVzb3VyY2VzLmdldCgpKQorICAgICAgICAgICAgICAgIHRyeSAoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENsb3NlYWJsZSBjbG9zZSA9IHdpdGhSZXNvdXJjZXMuZ2V0KCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcC5jYWxsKCk7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9GdXR1cmVUYXNrLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L0Z1dHVyZVRhc2suamF2YQppbmRleCAyMzQ4ZmY2Li43NjM4ODRhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L0Z1dHVyZVRhc2suamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L0Z1dHVyZVRhc2suamF2YQpAQCAtMjAsOSArMjAsMTAgQEAKIAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SdW5uYWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Bc3luY0Z1dHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJ1bm5hYmxlRnV0dXJlOwogCiAvKioKICAqIEEgRnV0dXJlVGFzayB0aGF0IHV0aWxpc2VzIENhc3NhbmRyYSdzIHtAbGluayBBc3luY0Z1dHVyZX0sIG1ha2luZyBpdCBjb21wYXRpYmxlIHdpdGgge0BsaW5rIEV4ZWN1dG9yUGx1c30uCkBAIC0zMSwxNSArMzIsMjggQEAKIHB1YmxpYyBjbGFzcyBGdXR1cmVUYXNrPFY+IGV4dGVuZHMgQXN5bmNGdXR1cmU8Vj4gaW1wbGVtZW50cyBSdW5uYWJsZUZ1dHVyZTxWPgogewogICAgIHByaXZhdGUgQ2FsbGFibGU8PyBleHRlbmRzIFY+IGNhbGw7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBEZWJ1Z2dhYmxlVGFzayBkZWJ1Z2dhYmxlOwogCiAgICAgcHVibGljIEZ1dHVyZVRhc2soQ2FsbGFibGU8PyBleHRlbmRzIFY+IGNhbGwpCiAgICAgewotICAgICAgICB0aGlzLmNhbGwgPSBjYWxsOworICAgICAgICB0aGlzKGNhbGwsIGNhbGwgaW5zdGFuY2VvZiBEZWJ1Z2dhYmxlVGFzayA/IChEZWJ1Z2dhYmxlVGFzaykgY2FsbCA6IG51bGwpOwogICAgIH0KIAogICAgIHB1YmxpYyBGdXR1cmVUYXNrKFJ1bm5hYmxlIHJ1bikKICAgICB7Ci0gICAgICAgIHRoaXMuY2FsbCA9IGNhbGxhYmxlKHJ1bik7CisgICAgICAgIHRoaXMoY2FsbGFibGUocnVuKSwgcnVuIGluc3RhbmNlb2YgRGVidWdnYWJsZVRhc2sgPyAoRGVidWdnYWJsZVRhc2spIHJ1biA6IG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgRnV0dXJlVGFzayhDYWxsYWJsZTw/IGV4dGVuZHMgVj4gY2FsbCwgRGVidWdnYWJsZVRhc2sgZGVidWdnYWJsZSkKKyAgICB7CisgICAgICAgIHRoaXMuY2FsbCA9IGNhbGw7CisgICAgICAgIHRoaXMuZGVidWdnYWJsZSA9IGRlYnVnZ2FibGU7CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgRGVidWdnYWJsZVRhc2sgZGVidWdnYWJsZVRhc2soKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlYnVnZ2FibGU7CiAgICAgfQogCiAgICAgViBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgpAQCAtNjMsNiArNzcsNyBAQAogICAgICAgICBmaW5hbGx5CiAgICAgICAgIHsKICAgICAgICAgICAgIGNhbGwgPSBudWxsOworICAgICAgICAgICAgZGVidWdnYWJsZSA9IG51bGw7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvU0VQRXhlY3V0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvU0VQRXhlY3V0b3IuamF2YQppbmRleCAwNWI1OWM2Li5mNGI3NGMwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L1NFUEV4ZWN1dG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9TRVBFeGVjdXRvci5qYXZhCkBAIC03MCw3ICs3MCw3IEBACiAgICAgU0VQRXhlY3V0b3IoU2hhcmVkRXhlY3V0b3JQb29sIHBvb2wsIGludCBtYXhpbXVtUG9vbFNpemUsIE1heGltdW1Qb29sU2l6ZUxpc3RlbmVyIG1heGltdW1Qb29sU2l6ZUxpc3RlbmVyLCBTdHJpbmcgam14UGF0aCwgU3RyaW5nIG5hbWUpCiAgICAgewogICAgICAgICB0aGlzLnBvb2wgPSBwb29sOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLm5hbWUgPSBOYW1lZFRocmVhZEZhY3RvcnkuZ2xvYmFsUHJlZml4KCkgKyBuYW1lOwogICAgICAgICB0aGlzLm1iZWFuTmFtZSA9ICJvcmcuYXBhY2hlLmNhc3NhbmRyYS4iICsgam14UGF0aCArICI6dHlwZT0iICsgbmFtZTsKICAgICAgICAgdGhpcy5tYXhpbXVtUG9vbFNpemUgPSBuZXcgQXRvbWljSW50ZWdlcihtYXhpbXVtUG9vbFNpemUpOwogICAgICAgICB0aGlzLm1heGltdW1Qb29sU2l6ZUxpc3RlbmVyID0gbWF4aW11bVBvb2xTaXplTGlzdGVuZXI7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L1NFUFdvcmtlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9TRVBXb3JrZXIuamF2YQppbmRleCBjN2I5YWJmLi45M2MwMWZhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L1NFUFdvcmtlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvU0VQV29ya2VyLmphdmEKQEAgLTMwLDEyICszMCwxMyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU0VQRXhlY3V0b3IuVGFrZVRhc2tQZXJtaXRSZXN1bHQuUkVUVVJORURfV09SS19QRVJNSVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU0VQRXhlY3V0b3IuVGFrZVRhc2tQZXJtaXRSZXN1bHQuVE9PS19QRVJNSVQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU0VUX1NFUF9USFJFQURfTkFNRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOwogCiBmaW5hbCBjbGFzcyBTRVBXb3JrZXIgZXh0ZW5kcyBBdG9taWNSZWZlcmVuY2U8U0VQV29ya2VyLldvcms+IGltcGxlbWVudHMgUnVubmFibGUKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU0VQV29ya2VyLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFNFVF9USFJFQURfTkFNRSA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnNldF9zZXBfdGhyZWFkX25hbWUiLCAidHJ1ZSIpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFNFVF9USFJFQURfTkFNRSA9IFNFVF9TRVBfVEhSRUFEX05BTUUuZ2V0Qm9vbGVhbigpOwogCiAgICAgZmluYWwgTG9uZyB3b3JrZXJJZDsKICAgICBmaW5hbCBUaHJlYWQgdGhyZWFkOwpAQCAtNDgsNiArNDksOCBAQAogICAgIGxvbmcgcHJldlN0b3BDaGVjayA9IDA7CiAgICAgbG9uZyBzb2xlU3Bpbm5lclNwaW5UaW1lID0gMDsKIAorICAgIHByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPFJ1bm5hYmxlPiBjdXJyZW50VGFzayA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworCiAgICAgU0VQV29ya2VyKFRocmVhZEdyb3VwIHRocmVhZEdyb3VwLCBMb25nIHdvcmtlcklkLCBXb3JrIGluaXRpYWxTdGF0ZSwgU2hhcmVkRXhlY3V0b3JQb29sIHBvb2wpCiAgICAgewogICAgICAgICB0aGlzLnBvb2wgPSBwb29sOwpAQCAtNTgsOSArNjEsMjcgQEAKICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCB7QGxpbmsgRGVidWdnYWJsZVRhc2t9LCBpZiBvbmUgZXhpc3RzCisgICAgICovCisgICAgcHVibGljIERlYnVnZ2FibGVUYXNrIGN1cnJlbnREZWJ1Z2dhYmxlVGFzaygpCisgICAgeworICAgICAgICAvLyBjYW4gY2hhbmdlIGFmdGVyIG51bGwgY2hlY2sgc28gZ28gb2ZmIGxvY2FsIHJlZmVyZW5jZQorICAgICAgICBSdW5uYWJsZSB0YXNrID0gY3VycmVudFRhc2suZ2V0KCk7CisKKyAgICAgICAgLy8gTG9jYWwgcmVhZCBhbmQgbXV0YXRpb24gUnVubmFibGVzIGFyZSB0aGVtc2VsdmVzIGRlYnVnZ2FibGUKKyAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBEZWJ1Z2dhYmxlVGFzaykKKyAgICAgICAgICAgIHJldHVybiAoRGVidWdnYWJsZVRhc2spIHRhc2s7CisKKyAgICAgICAgaWYgKHRhc2sgaW5zdGFuY2VvZiBGdXR1cmVUYXNrKQorICAgICAgICAgICAgcmV0dXJuICgoRnV0dXJlVGFzazw/PikgdGFzaykuZGVidWdnYWJsZVRhc2soKTsKKyAgICAgICAgICAgIAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBydW4oKQogICAgIHsKLSAgICAgICAgLyoqCisgICAgICAgIC8qCiAgICAgICAgICAqIHdlIG1haW50YWluIHR3byBpbXBvcnRhbnQgaW52YXJpYW50czoKICAgICAgICAgICogMSkgICBhZnRlciBleGl0aW5nIHNwaW5uaW5nIHBoYXNlLCB3ZSBlbnN1cmUgYXQgbGVhc3Qgb25lIG1vcmUgdGFzayBvbiBfZWFjaF8gcXVldWUgd2lsbCBiZSBwcm9jZXNzZWQKICAgICAgICAgICogICAgICBwcm9tcHRseSBhZnRlciB3ZSBiZWdpbiwgYXNzdW1pbmcgYW55IGFyZSBvdXRzdGFuZGluZyBvbiBhbnkgcG9vbHMuIHRoaXMgaXMgdG8gcGVybWl0IHByb2R1Y2VycyB0bwpAQCAtMTAxLDggKzEyMiwxMCBAQAogICAgICAgICAgICAgICAgIGlmIChhc3NpZ25lZCA9PSBudWxsKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICBpZiAoU0VUX1RIUkVBRF9OQU1FKQotICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldE5hbWUoYXNzaWduZWQubmFtZSArICItIiArIHdvcmtlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXROYW1lKGFzc2lnbmVkLm5hbWUgKyAnLScgKyB3b3JrZXJJZCk7CisKICAgICAgICAgICAgICAgICB0YXNrID0gYXNzaWduZWQudGFza3MucG9sbCgpOworICAgICAgICAgICAgICAgIGN1cnJlbnRUYXNrLmxhenlTZXQodGFzayk7CiAKICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBkbyBoYXZlIHRhc2tzIGFzc2lnbmVkLCBub2JvZHkgd2lsbCBjaGFuZ2Ugb3VyIHN0YXRlIHNvIHdlIGNhbiBzaW1wbHkgc2V0IGl0IHRvIFdPUktJTkcKICAgICAgICAgICAgICAgICAvLyAod2hpY2ggaXMgYWxzbyBhIHN0YXRlIHRoYXQgd2lsbCBuZXZlciBiZSBpbnRlcnJ1cHRlZCBleHRlcm5hbGx5KQpAQCAtMTI4LDkgKzE1MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgICAgICAgICAgdGFzayA9IGFzc2lnbmVkLnRhc2tzLnBvbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhc2subGF6eVNldCh0YXNrKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyByZXR1cm4gb3VyIHdvcmsgcGVybWl0LCBhbmQgbWF5YmUgc2lnbmFsIHNodXRkb3duCisgICAgICAgICAgICAgICAgY3VycmVudFRhc2subGF6eVNldChudWxsKTsKKwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gUkVUVVJORURfV09SS19QRVJNSVQpCiAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkLnJldHVybldvcmtQZXJtaXQoKTsKIApAQCAtMTczLDYgKzE5OSwxMSBAQAogICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5leHBlY3RlZCBleGNlcHRpb24ga2lsbGVkIHdvcmtlciIsIHQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgY3VycmVudFRhc2subGF6eVNldChudWxsKTsKKyAgICAgICAgICAgIHBvb2wud29ya2VyRW5kZWQodGhpcyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyB0cnkgdG8gYXNzaWduIHRoaXMgd29ya2VyIHRoZSBwcm92aWRlZCB3b3JrCkBAIC00MjAsNCArNDUxLDIyIEBACiAgICAgICAgICAgICByZXR1cm4gYXNzaWduZWQgIT0gbnVsbDsKICAgICAgICAgfQogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRocmVhZC5nZXROYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gd29ya2VySWQuaW50VmFsdWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiBvYmogPT0gdGhpczsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L1NoYXJlZEV4ZWN1dG9yUG9vbC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9TaGFyZWRFeGVjdXRvclBvb2wuamF2YQppbmRleCBmNzQ4NTRmLi4wNjMxZWM2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L1NoYXJlZEV4ZWN1dG9yUG9vbC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvU2hhcmVkRXhlY3V0b3JQb29sLmphdmEKQEAgLTE3LDggKzE3LDExIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudDsKIAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudFNraXBMaXN0TWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwpAQCAtMjYsNiArMjksOSBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2tTdXBwb3J0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRGVidWdnYWJsZVRhc2suUnVubmluZ0RlYnVnZ2FibGVUYXNrOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU0VQV29ya2VyLldvcms7CkBAIC03Nyw2ICs4Myw4IEBACiAgICAgZmluYWwgQ29uY3VycmVudFNraXBMaXN0TWFwPExvbmcsIFNFUFdvcmtlcj4gc3Bpbm5pbmcgPSBuZXcgQ29uY3VycmVudFNraXBMaXN0TWFwPD4oKTsKICAgICAvLyB0aGUgY29sbGVjdGlvbiBvZiB0aHJlYWRzIHRoYXQgaGF2ZSBiZWVuIGFza2VkIHRvIHN0b3AvZGVzY2hlZHVsZSAtIG5ldyB3b3JrZXJzIGFyZSBzY2hlZHVsZWQgZnJvbSBoZXJlIGxhc3QKICAgICBmaW5hbCBDb25jdXJyZW50U2tpcExpc3RNYXA8TG9uZywgU0VQV29ya2VyPiBkZXNjaGVkdWxlZCA9IG5ldyBDb25jdXJyZW50U2tpcExpc3RNYXA8PigpOworICAgIC8vIEFsbCBTRVBXb3JrZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U0VQV29ya2VyPiBhbGxXb3JrZXJzID0gQ29sbGVjdGlvbnMubmV3U2V0RnJvbU1hcChuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpKTsKIAogICAgIHZvbGF0aWxlIGJvb2xlYW4gc2h1dHRpbmdEb3duID0gZmFsc2U7CiAKQEAgLTEwMiw3ICsxMTAsMjMgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgaWYgKCF3b3JrLmlzU3RvcCgpKQotICAgICAgICAgICAgbmV3IFNFUFdvcmtlcih0aHJlYWRHcm91cCwgd29ya2VySWQuaW5jcmVtZW50QW5kR2V0KCksIHdvcmssIHRoaXMpOworICAgICAgICB7CisgICAgICAgICAgICBTRVBXb3JrZXIgd29ya2VyID0gbmV3IFNFUFdvcmtlcih0aHJlYWRHcm91cCwgd29ya2VySWQuaW5jcmVtZW50QW5kR2V0KCksIHdvcmssIHRoaXMpOworICAgICAgICAgICAgYWxsV29ya2Vycy5hZGQod29ya2VyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgd29ya2VyRW5kZWQoU0VQV29ya2VyIHdvcmtlcikKKyAgICB7CisgICAgICAgIGFsbFdvcmtlcnMucmVtb3ZlKHdvcmtlcik7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8UnVubmluZ0RlYnVnZ2FibGVUYXNrPiBydW5uaW5nVGFza3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFsbFdvcmtlcnMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHdvcmtlciAtPiBuZXcgUnVubmluZ0RlYnVnZ2FibGVUYXNrKHdvcmtlci50b1N0cmluZygpLCB3b3JrZXIuY3VycmVudERlYnVnZ2FibGVUYXNrKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoUnVubmluZ0RlYnVnZ2FibGVUYXNrOjpoYXNUYXNrKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwogICAgIH0KIAogICAgIHZvaWQgbWF5YmVTdGFydFNwaW5uaW5nV29ya2VyKCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvVGFza0ZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmN1cnJlbnQvVGFza0ZhY3RvcnkuamF2YQppbmRleCA1NjA4N2Q5Li5mYWVhYmU2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25jdXJyZW50L1Rhc2tGYWN0b3J5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uY3VycmVudC9UYXNrRmFjdG9yeS5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRGVidWdnYWJsZVRhc2suUnVubmFibGVEZWJ1Z2dhYmxlVGFzazsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TaGFyZWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuV2l0aFJlc291cmNlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJ1bm5hYmxlRnV0dXJlOwpAQCAtMTI3LDYgKzEyOCw5IEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgUnVubmFibGUgdG9FeGVjdXRlKFJ1bm5hYmxlIHJ1bm5hYmxlKQogICAgICAgICB7CisgICAgICAgICAgICBpZiAocnVubmFibGUgaW5zdGFuY2VvZiBSdW5uYWJsZURlYnVnZ2FibGVUYXNrKQorICAgICAgICAgICAgICAgIHJldHVybiBFeGVjdXRpb25GYWlsdXJlLnN1cHByZXNzaW5nRGVidWdnYWJsZShFeGVjdXRvckxvY2Fscy5wcm9wYWdhdGUoKSwgKFJ1bm5hYmxlRGVidWdnYWJsZVRhc2spIHJ1bm5hYmxlKTsKKwogICAgICAgICAgICAgLy8gbm8gcmVhc29uIHRvIHByb3BhZ2F0ZSBleGNlcHRpb24gd2hlbiBpdCBpcyBpbmFjY2Vzc2libGUgdG8gY2FsbGVyCiAgICAgICAgICAgICByZXR1cm4gRXhlY3V0aW9uRmFpbHVyZS5zdXBwcmVzc2luZyhFeGVjdXRvckxvY2Fscy5wcm9wYWdhdGUoKSwgcnVubmFibGUpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvQ2Fzc2FuZHJhUmVsZXZhbnRFbnYuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9DYXNzYW5kcmFSZWxldmFudEVudi5qYXZhCmluZGV4IDQ5NjAzNzQuLjBmZGNkNmMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9DYXNzYW5kcmFSZWxldmFudEVudi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9DYXNzYW5kcmFSZWxldmFudEVudi5qYXZhCkBAIC0xOCwxMyArMTgsMTkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWc7CiAKKy8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIGJlbG93ICdibG9ja1N5c3RlbVByb3BlcnR5VXNhZ2UnCisKIHB1YmxpYyBlbnVtIENhc3NhbmRyYVJlbGV2YW50RW52CiB7CiAgICAgLyoqCiAgICAgICogU2VhcmNoaW5nIGluIHRoZSBKQVZBX0hPTUUgaXMgc2FmZXIgdGhhbiBzZWFyY2hpbmcgaW50byBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpIGFzIHRoZSBPcmFjbGUKICAgICAgKiBKVk0gbWlnaHQgdXNlIHRoZSBKUkUgd2hpY2ggZG8gbm90IGNvbnRhaW5zIGptYXAuCiAgICAgICovCi0gICAgSkFWQV9IT01FICgiSkFWQV9IT01FIik7CisgICAgSkFWQV9IT01FICgiSkFWQV9IT01FIiksCisgICAgQ0lSQ0xFQ0koIkNJUkNMRUNJIiksCisgICAgQ0FTU0FORFJBX1NLSVBfU1lOQygiQ0FTU0FORFJBX1NLSVBfU1lOQyIpCisKKyAgICA7CiAKICAgICBDYXNzYW5kcmFSZWxldmFudEVudihTdHJpbmcga2V5KQogICAgIHsKQEAgLTM4LDYgKzQ0LDE1IEBACiAgICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0ZW52KGtleSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzeXN0ZW0gZW52IGFzIGEgYm9vbGVhbi4KKyAgICAgKiBAcmV0dXJuIFN5c3RlbSBlbnYgYm9vbGVhbiB2YWx1ZSBpZiBpdCBleGlzdHMsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKCkKKyAgICB7CisgICAgICAgIHJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0ZW52KGtleSkpOworICAgIH0KKwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewogICAgICAgICByZXR1cm4ga2V5OwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuamF2YQppbmRleCAzZTQ1ZWJjLi43OGUxOTkyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0Nhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5qYXZhCkBAIC0xOCwzMDIgKzE4LDQ5MyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZzsKIAoraW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5Mb2dNZXNzYWdlc1RhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkZpbGVTeXN0ZW1Pd25lcnNoaXBDaGVjazsKIAorLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgYmVsb3cgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKKwogLyoqIEEgY2xhc3MgdGhhdCBleHRyYWN0cyBzeXN0ZW0gcHJvcGVydGllcyBmb3IgdGhlIGNhc3NhbmRyYSBub2RlIGl0IHJ1bnMgd2l0aGluLiAqLwogcHVibGljIGVudW0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzCiB7Ci0gICAgLy9iYXNlIEpWTSBwcm9wZXJ0aWVzCi0gICAgSkFWQV9IT01FKCJqYXZhLmhvbWUiKSwKLSAgICBDQVNTQU5EUkFfUElEX0ZJTEUgKCJjYXNzYW5kcmEtcGlkZmlsZSIpLAotCisgICAgQUNRVUlSRV9SRVRSWV9TRUNPTkRTKCJjYXNzYW5kcmEuYWNxdWlyZV9yZXRyeV9zZWNvbmRzIiwgIjYwIiksCisgICAgQUNRVUlSRV9TTEVFUF9NUygiY2Fzc2FuZHJhLmFjcXVpcmVfc2xlZXBfbXMiLCAiMTAwMCIpLAorICAgIEFMTE9DQVRFX1RPS0VOU19GT1JfS0VZU1BBQ0UoImNhc3NhbmRyYS5hbGxvY2F0ZV90b2tlbnNfZm9yX2tleXNwYWNlIiksCisgICAgQUxMT1dfQUxURVJfUkZfRFVSSU5HX1JBTkdFX01PVkVNRU5UKCJjYXNzYW5kcmEuYWxsb3dfYWx0ZXJfcmZfZHVyaW5nX3JhbmdlX21vdmVtZW50IiksCisgICAgLyoqIElmIHdlIHNob3VsZCBhbGxvdyBoYXZpbmcgZHVwbGljYXRlIGtleXMgaW4gdGhlIGNvbmZpZyBmaWxlLCBkZWZhdWx0IHRvIHRydWUgZm9yIGxlZ2FjeSByZWFzb25zICovCisgICAgQUxMT1dfRFVQTElDQVRFX0NPTkZJR19LRVlTKCJjYXNzYW5kcmEuYWxsb3dfZHVwbGljYXRlX2NvbmZpZ19rZXlzIiwgInRydWUiKSwKKyAgICAvKiogSWYgd2Ugc2hvdWxkIGFsbG93IGhhdmluZyBib3RoIG5ldyAocG9zdCBDQVNTQU5EUkEtMTUyMzQpIGFuZCBvbGQgY29uZmlnIGtleXMgZm9yIHRoZSBzYW1lIGNvbmZpZyBpdGVtIGluIHRoZSB5YW1sICovCisgICAgQUxMT1dfTkVXX09MRF9DT05GSUdfS0VZUygiY2Fzc2FuZHJhLmFsbG93X25ld19vbGRfY29uZmlnX2tleXMiKSwKKyAgICBBTExPV19VTkxJTUlURURfQ09OQ1VSUkVOVF9WQUxJREFUSU9OUygiY2Fzc2FuZHJhLmFsbG93X3VubGltaXRlZF9jb25jdXJyZW50X3ZhbGlkYXRpb25zIiksCisgICAgQUxMT1dfVU5TQUZFX0FHR1JFU1NJVkVfU1NUQUJMRV9FWFBJUkFUSU9OKCJjYXNzYW5kcmEuYWxsb3dfdW5zYWZlX2FnZ3Jlc3NpdmVfc3N0YWJsZV9leHBpcmF0aW9uIiksCisgICAgQUxMT1dfVU5TQUZFX0pPSU4oImNhc3NhbmRyYS5hbGxvd191bnNhZmVfam9pbiIpLAorICAgIEFMTE9XX1VOU0FGRV9SRVBMQUNFKCJjYXNzYW5kcmEuYWxsb3dfdW5zYWZlX3JlcGxhY2UiKSwKKyAgICBBTExPV19VTlNBRkVfVFJBTlNJRU5UX0NIQU5HRVMoImNhc3NhbmRyYS5hbGxvd191bnNhZmVfdHJhbnNpZW50X2NoYW5nZXMiKSwKKyAgICBBUFBST1hJTUFURV9USU1FX1BSRUNJU0lPTl9NUygiY2Fzc2FuZHJhLmFwcHJveGltYXRlX3RpbWVfcHJlY2lzaW9uX21zIiwgIjIiKSwKKyAgICAvKiogMiAqKiBHRU5TQUxUX0xPRzJfUk9VTkRTIHJvdW5kcyBvZiBoYXNoaW5nIHdpbGwgYmUgcGVyZm9ybWVkLiAqLworICAgIEFVVEhfQkNSWVBUX0dFTlNBTFRfTE9HMl9ST1VORFMoImNhc3NhbmRyYS5hdXRoX2JjcnlwdF9nZW5zYWx0X2xvZzJfcm91bmRzIiksCisgICAgLyoqIFdlIGV4cGVjdCBkZWZhdWx0IHZhbHVlcyBvbiBjYWNoZSByZXRyaWVzIGFuZCBpbnRlcnZhbCB0byBiZSBzdWZmaWNpZW50IGZvciBldmVyeW9uZSBidXQgaGF2ZSB0aGlzIGVzY2FwZSBoYXRjaCBqdXN0IGluIGNhc2UuICovCisgICAgQVVUSF9DQUNIRV9XQVJNSU5HX01BWF9SRVRSSUVTKCJjYXNzYW5kcmEuYXV0aF9jYWNoZS53YXJtaW5nLm1heF9yZXRyaWVzIiksCisgICAgQVVUSF9DQUNIRV9XQVJNSU5HX1JFVFJZX0lOVEVSVkFMX01TKCJjYXNzYW5kcmEuYXV0aF9jYWNoZS53YXJtaW5nLnJldHJ5X2ludGVydmFsX21zIiksCisgICAgQVVUT0NPTVBBQ1RJT05fT05fU1RBUlRVUF9FTkFCTEVEKCJjYXNzYW5kcmEuYXV0b2NvbXBhY3Rpb25fb25fc3RhcnR1cF9lbmFibGVkIiwgInRydWUiKSwKKyAgICBBVVRPX0JPT1RTVFJBUCgiY2Fzc2FuZHJhLmF1dG9fYm9vdHN0cmFwIiksCisgICAgQVVUT19SRVBBSVJfRlJFUVVFTkNZX1NFQ09ORFMoImNhc3NhbmRyYS5hdXRvX3JlcGFpcl9mcmVxdWVuY3lfc2Vjb25kcyIsIGNvbnZlcnRUb1N0cmluZyhUaW1lVW5pdC5NSU5VVEVTLnRvU2Vjb25kcyg1KSkpLAorICAgIEJBVENITE9HX1JFUExBWV9USU1FT1VUX0lOX01TKCJjYXNzYW5kcmEuYmF0Y2hsb2cucmVwbGF5X3RpbWVvdXRfaW5fbXMiKSwKKyAgICBCQVRDSF9DT01NSVRfTE9HX1NZTkNfSU5URVJWQUwoImNhc3NhbmRyYS5iYXRjaF9jb21taXRsb2dfc3luY19pbnRlcnZhbF9taWxsaXMiLCAiMTAwMCIpLAogICAgIC8qKgotICAgICAqIEluZGljYXRlcyB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSB1c2VkIGJ5IHRoZSBKYXZhIFZpcnR1YWwgTWFjaGluZSAoSlZNKQotICAgICAqIHRvIGNyZWF0ZSBhbmQgc3RvcmUgdGVtcG9yYXJ5IGZpbGVzLgorICAgICAqIFdoZW4gYm9vdHN0cmFwaW5nIGhvdyBsb25nIHRvIHdhaXQgZm9yIHNjaGVtYSB2ZXJzaW9ucyB0byBiZSBzZWVuLgogICAgICAqLwotICAgIEpBVkFfSU9fVE1QRElSICgiamF2YS5pby50bXBkaXIiKSwKLQorICAgIEJPT1RTVFJBUF9TQ0hFTUFfREVMQVlfTVMoImNhc3NhbmRyYS5zY2hlbWFfZGVsYXlfbXMiKSwKICAgICAvKioKLSAgICAgKiBQYXRoIGZyb20gd2hpY2ggdG8gbG9hZCBuYXRpdmUgbGlicmFyaWVzLgotICAgICAqIERlZmF1bHQgaXMgYWJzb2x1dGUgcGF0aCB0byBsaWIgZGlyZWN0b3J5LgorICAgICAqIFdoZW4gYm9vdHN0cmFwaW5nIHdlIHdhaXQgZm9yIGFsbCBzY2hlbWEgdmVyc2lvbnMgZm91bmQgaW4gZ29zc2lwIHRvIGJlIHNlZW4sIGFuZCBpZiBub3Qgc2VlbiBpbiB0aW1lIHdlIGZhaWwKKyAgICAgKiB0aGUgYm9vdHN0cmFwOyB0aGlzIHByb3BlcnR5IHdpbGwgYXZvaWQgZmFpbGluZyBhbmQgYWxsb3cgYm9vdHN0cmFwIHRvIGNvbnRpbnVlIGlmIHNldCB0byB0cnVlLgogICAgICAqLwotICAgIEpBVkFfTElCUkFSWV9QQVRIICgiamF2YS5saWJyYXJ5LnBhdGgiKSwKLQotICAgIEpBVkFfU0VDVVJJVFlfRUdEICgiamF2YS5zZWN1cml0eS5lZ2QiKSwKLQotICAgIC8qKiBKYXZhIFJ1bnRpbWUgRW52aXJvbm1lbnQgdmVyc2lvbiAqLwotICAgIEpBVkFfVkVSU0lPTiAoImphdmEudmVyc2lvbiIpLAotCi0gICAgLyoqIEphdmEgVmlydHVhbCBNYWNoaW5lIGltcGxlbWVudGF0aW9uIG5hbWUgKi8KLSAgICBKQVZBX1ZNX05BTUUgKCJqYXZhLnZtLm5hbWUiKSwKLQotICAgIC8qKiBMaW5lIHNlcGFyYXRvciAoIlxuIiBvbiBVTklYKS4gKi8KLSAgICBMSU5FX1NFUEFSQVRPUiAoImxpbmUuc2VwYXJhdG9yIiksCi0KLSAgICAvKiogSmF2YSBjbGFzcyBwYXRoLiAqLwotICAgIEpBVkFfQ0xBU1NfUEFUSCAoImphdmEuY2xhc3MucGF0aCIpLAotCi0gICAgLyoqIE9wZXJhdGluZyBzeXN0ZW0gYXJjaGl0ZWN0dXJlLiAqLwotICAgIE9TX0FSQ0ggKCJvcy5hcmNoIiksCi0KLSAgICAvKiogT3BlcmF0aW5nIHN5c3RlbSBuYW1lLiAqLwotICAgIE9TX05BTUUgKCJvcy5uYW1lIiksCi0KLSAgICAvKiogVXNlcidzIGhvbWUgZGlyZWN0b3J5LiAqLwotICAgIFVTRVJfSE9NRSAoInVzZXIuaG9tZSIpLAotCi0gICAgLyoqIFBsYXRmb3JtIHdvcmQgc2l6ZSBzdW4uYXJjaC5kYXRhLm1vZGVsLiBFeGFtcGxlczogIjMyIiwgIjY0IiwgInVua25vd24iKi8KLSAgICBTVU5fQVJDSF9EQVRBX01PREVMICgic3VuLmFyY2guZGF0YS5tb2RlbCIpLAotCi0gICAgLy9KTVggcHJvcGVydGllcworICAgIEJPT1RTVFJBUF9TS0lQX1NDSEVNQV9DSEVDSygiY2Fzc2FuZHJhLnNraXBfc2NoZW1hX2NoZWNrIiksCisgICAgQlJPQURDQVNUX0lOVEVSVkFMX01TKCJjYXNzYW5kcmEuYnJvYWRjYXN0X2ludGVydmFsX21zIiwgIjYwMDAwIiksCisgICAgQlRSRUVfQlJBTkNIX1NISUZUKCJjYXNzYW5kcmEuYnRyZWUuYnJhbmNoc2hpZnQiLCAiNSIpLAorICAgIEJUUkVFX0ZBTl9GQUNUT1IoImNhc3NhbmRyYS5idHJlZS5mYW5mYWN0b3IiKSwKKyAgICAvKiogUmVwcmVzZW50cyB0aGUgbWF4aW11bSBzaXplIChpbiBieXRlcykgb2YgYSBzZXJpYWxpemVkIG11dGF0aW9uIHRoYXQgY2FuIGJlIGNhY2hlZCAqKi8KKyAgICBDQUNIRUFCTEVfTVVUQVRJT05fU0laRV9MSU1JVCgiY2Fzc2FuZHJhLmNhY2hlYWJsZV9tdXRhdGlvbl9zaXplX2xpbWl0X2J5dGVzIiwgY29udmVydFRvU3RyaW5nKDFfMDAwXzAwMCkpLAorICAgIENBU1NBTkRSQV9BTExPV19TSU1QTEVfU1RSQVRFR1koImNhc3NhbmRyYS5hbGxvd19zaW1wbGVzdHJhdGVneSIpLAorICAgIENBU1NBTkRSQV9BVkFJTEFCTEVfUFJPQ0VTU09SUygiY2Fzc2FuZHJhLmF2YWlsYWJsZV9wcm9jZXNzb3JzIiksCisgICAgLyoqIFRoZSBjbGFzc3BhdGggc3RvcmFnZSBjb25maWd1cmF0aW9uIGZpbGUuICovCisgICAgQ0FTU0FORFJBX0NPTkZJRygiY2Fzc2FuZHJhLmNvbmZpZyIsICJjYXNzYW5kcmEueWFtbCIpLAogICAgIC8qKgotICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IHJlcHJlc2VudHMgdGhlIGhvc3QgbmFtZSBzdHJpbmcKLSAgICAgKiB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggcmVtb3RlIHN0dWJzIGZvciBsb2NhbGx5IGNyZWF0ZWQgcmVtb3RlIG9iamVjdHMsCi0gICAgICogaW4gb3JkZXIgdG8gYWxsb3cgY2xpZW50cyB0byBpbnZva2UgbWV0aG9kcyBvbiB0aGUgcmVtb3RlIG9iamVjdC4KKyAgICAgKiBUaGUgY2Fzc2FuZHJhLWZvcmVncm91bmQgb3B0aW9uIHdpbGwgdGVsbCBDYXNzYW5kcmFEYWVtb24gd2hldGhlcgorICAgICAqIHRvIGNsb3NlIHN0ZG91dC9zdGRlcnIsIGJ1dCBpdCdzIHVwIHRvIHVzIG5vdCB0byBiYWNrZ3JvdW5kLgorICAgICAqIHllcy9udWxsCiAgICAgICovCi0gICAgSkFWQV9STUlfU0VSVkVSX0hPU1ROQU1FICgiamF2YS5ybWkuc2VydmVyLmhvc3RuYW1lIiksCi0KKyAgICBDQVNTQU5EUkFfRk9SRUdST1VORCgiY2Fzc2FuZHJhLWZvcmVncm91bmQiKSwKKyAgICBDQVNTQU5EUkFfSk1YX0FVVEhPUklaRVIoImNhc3NhbmRyYS5qbXguYXV0aG9yaXplciIpLAorICAgIENBU1NBTkRSQV9KTVhfTE9DQUxfUE9SVCgiY2Fzc2FuZHJhLmpteC5sb2NhbC5wb3J0IiksCisgICAgQ0FTU0FORFJBX0pNWF9SRU1PVEVfTE9HSU5fQ09ORklHKCJjYXNzYW5kcmEuam14LnJlbW90ZS5sb2dpbi5jb25maWciKSwKKyAgICAvKiogQ2Fzc2FuZHJhIGpteCByZW1vdGUgYW5kIGxvY2FsIHBvcnQgKi8KKyAgICBDQVNTQU5EUkFfSk1YX1JFTU9URV9QT1JUKCJjYXNzYW5kcmEuam14LnJlbW90ZS5wb3J0IiksCisgICAgQ0FTU0FORFJBX01BWF9ISU5UX1RUTCgiY2Fzc2FuZHJhLm1heEhpbnRUVEwiLCBjb252ZXJ0VG9TdHJpbmcoSW50ZWdlci5NQVhfVkFMVUUpKSwKKyAgICBDQVNTQU5EUkFfTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1IoImNhc3NhbmRyYS5taW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3RvciIpLAorICAgIENBU1NBTkRSQV9ORVRUWV9VU0VfSEVBUF9BTExPQ0FUT1IoImNhc3NhbmRyYS5uZXR0eV91c2VfaGVhcF9hbGxvY2F0b3IiKSwKKyAgICBDQVNTQU5EUkFfUElEX0ZJTEUoImNhc3NhbmRyYS1waWRmaWxlIiksCisgICAgQ0FTU0FORFJBX1JBQ0tEQ19QUk9QRVJUSUVTKCJjYXNzYW5kcmEtcmFja2RjLnByb3BlcnRpZXMiKSwKKyAgICBDQVNTQU5EUkFfU0tJUF9BVVRPTUFUSUNfVURUX0ZJWCgiY2Fzc2FuZHJhLnNraXBhdXRvbWF0aWN1ZHRmaXgiKSwKKyAgICBDQVNTQU5EUkFfU1RSRUFNSU5HX0RFQlVHX1NUQUNLVFJBQ0VfTElNSVQoImNhc3NhbmRyYS5zdHJlYW1pbmcuZGVidWdfc3RhY2t0cmFjZV9saW1pdCIsICIyIiksCisgICAgQ0FTU0FORFJBX1VOU0FGRV9USU1FX1VVSURfTk9ERSgiY2Fzc2FuZHJhLnVuc2FmZS50aW1ldXVpZG5vZGUiKSwKKyAgICBDQVNTQU5EUkFfVkVSU0lPTigiY2Fzc2FuZHJhLnZlcnNpb24iKSwKKyAgICAvKiogZGVmYXVsdCBoZWFydGJlYXRpbmcgcGVyaW9kIGlzIDEgbWludXRlICovCisgICAgQ0hFQ0tfREFUQV9SRVNVUlJFQ1RJT05fSEVBUlRCRUFUX1BFUklPRCgiY2hlY2tfZGF0YV9yZXN1cnJlY3Rpb25faGVhcnRiZWF0X3BlcmlvZF9taWxsaSIsICI2MDAwMCIpLAorICAgIENIUk9OSUNMRV9BTk5PVU5DRVJfRElTQUJMRSgiY2hyb25pY2xlLmFubm91bmNlci5kaXNhYmxlIiksCisgICAgQ0xPQ0tfR0xPQkFMKCJjYXNzYW5kcmEuY2xvY2siKSwKKyAgICBDTE9DS19NT05PVE9OSUNfQVBQUk9YKCJjYXNzYW5kcmEubW9ub3RvbmljX2Nsb2NrLmFwcHJveCIpLAorICAgIENMT0NLX01PTk9UT05JQ19QUkVDSVNFKCJjYXNzYW5kcmEubW9ub3RvbmljX2Nsb2NrLnByZWNpc2UiKSwKKyAgICBDT01NSVRMT0dfQUxMT1dfSUdOT1JFX1NZTkNfQ1JDKCJjYXNzYW5kcmEuY29tbWl0bG9nLmFsbG93X2lnbm9yZV9zeW5jX2NyYyIpLAorICAgIENPTU1JVExPR19JR05PUkVfUkVQTEFZX0VSUk9SUygiY2Fzc2FuZHJhLmNvbW1pdGxvZy5pZ25vcmVyZXBsYXllcnJvcnMiKSwKKyAgICBDT01NSVRMT0dfTUFYX09VVFNUQU5ESU5HX1JFUExBWV9CWVRFUygiY2Fzc2FuZHJhLmNvbW1pdGxvZ19tYXhfb3V0c3RhbmRpbmdfcmVwbGF5X2J5dGVzIiwgY29udmVydFRvU3RyaW5nKDEwMjQgKiAxMDI0ICogNjQpKSwKKyAgICBDT01NSVRMT0dfTUFYX09VVFNUQU5ESU5HX1JFUExBWV9DT1VOVCgiY2Fzc2FuZHJhLmNvbW1pdGxvZ19tYXhfb3V0c3RhbmRpbmdfcmVwbGF5X2NvdW50IiwgIjEwMjQiKSwKKyAgICBDT01NSVRMT0dfU1RPUF9PTl9FUlJPUlMoImNhc3NhbmRyYS5jb21taXRsb2cuc3RvcF9vbl9lcnJvcnMiKSwKICAgICAvKioKLSAgICAgKiBJZiB0aGlzIHZhbHVlIGlzIHRydWUsIG9iamVjdCBpZGVudGlmaWVycyBmb3IgcmVtb3RlIG9iamVjdHMgZXhwb3J0ZWQgYnkgdGhpcyBWTSB3aWxsIGJlIGdlbmVyYXRlZCBieSB1c2luZwotICAgICAqIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KKyAgICAgKiBFbnRpdGllcyB0byByZXBsYXkgbXV0YXRpb25zIGZvciB1cG9uIGNvbW1pdCBsb2cgcmVwbGF5LCBwcm9wZXJ0eSBpcyBtZWFudCB0byBjb250YWluCisgICAgICogY29tbWEtc2VwYXJhdGVkIGVudGl0aWVzIHdoaWNoIGFyZSBlaXRoZXIgbmFtZXMgb2Yga2V5c3BhY2VzIG9yIGtleXNwYWNlcyBhbmQgdGFibGVzIG9yIHRoZWlyIG1peC4KKyAgICAgKiBFeGFtcGxlczoKKyAgICAgKiBqdXN0IGtleXNwYWNlcworICAgICAqIC1EY2Fzc2FuZHJhLnJlcGxheUxpc3Q9a3MxLGtzMixrczMKKyAgICAgKiBzcGVjaWZpYyB0YWJsZXMKKyAgICAgKiAtRGNhc3NhbmRyYS5yZXBsYXlMaXN0PWtzMS50YjEsa3MyLnRiMgorICAgICAqIG1peCBvZiB0YWJsZXMgYW5kIGtleXNwYWNlcworICAgICAqIC1EY2Fzc2FuZHJhLnJlcGxheUxpc3Q9a3MxLnRiMSxrczIKKyAgICAgKgorICAgICAqIElmIG9ubHkga2V5c3BhY2VzIGFyZSBzcGVjaWZpZWQsIG11dGF0aW9ucyBmb3IgYWxsIHRhYmxlcyBpbiBzdWNoIGtleXNwYWNlIHdpbGwgYmUgcmVwbGF5ZWQKKyAgICAgKiAqLworICAgIENPTU1JVF9MT0dfUkVQTEFZX0xJU1QoImNhc3NhbmRyYS5yZXBsYXlMaXN0IiksCisgICAgLyoqCisgICAgICogVGhpcyBwcm9wZXJ0eSBpbmRpY2F0ZXMgdGhlIGxvY2F0aW9uIGZvciB0aGUgYWNjZXNzIGZpbGUuIElmIGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuYXV0aGVudGljYXRlIGlzIGZhbHNlLAorICAgICAqIHRoZW4gdGhpcyBwcm9wZXJ0eSBhbmQgdGhlIHBhc3N3b3JkIGFuZCBhY2Nlc3MgZmlsZXMsIGFyZSBpZ25vcmVkLiBPdGhlcndpc2UsIHRoZSBhY2Nlc3MgZmlsZSBtdXN0IGV4aXN0IGFuZAorICAgICAqIGJlIGluIHRoZSB2YWxpZCBmb3JtYXQuIElmIHRoZSBhY2Nlc3MgZmlsZSBpcyBlbXB0eSBvciBub25leGlzdGVudCwgdGhlbiBubyBhY2Nlc3MgaXMgYWxsb3dlZC4KICAgICAgKi8KLSAgICBKQVZBX1JNSV9TRVJWRVJfUkFORE9NX0lEICgiamF2YS5ybWkuc2VydmVyLnJhbmRvbUlEcyIpLAotCisgICAgQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9BQ0NFU1NfRklMRSgiY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5hY2Nlc3MuZmlsZSIpLAogICAgIC8qKgogICAgICAqIFRoaXMgcHJvcGVydHkgaW5kaWNhdGVzIHdoZXRoZXIgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gZm9yIHJlbW90ZSBtb25pdG9yaW5nIGlzCiAgICAgICogZW5hYmxlZC4gQnkgZGVmYXVsdCBpdCBpcyBkaXNhYmxlZCAtIGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuYXV0aGVudGljYXRlCiAgICAgICovCi0gICAgQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9BVVRIRU5USUNBVEUgKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLmF1dGhlbnRpY2F0ZSIpLAotCisgICAgQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9BVVRIRU5USUNBVEUoImNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuYXV0aGVudGljYXRlIiksCisgICAgLyoqIFRoaXMgcHJvcGVydHkgaW5kaWNhdGVzIHRoZSBwYXRoIHRvIHRoZSBwYXNzd29yZCBmaWxlIC0gY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5wYXNzd29yZC5maWxlICovCisgICAgQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9QQVNTV09SRF9GSUxFKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBhc3N3b3JkLmZpbGUiKSwKKyAgICAvKiogUG9ydCBudW1iZXIgdG8gZW5hYmxlIEpNWCBSTUkgY29ubmVjdGlvbnMgLSBjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBvcnQgKi8KKyAgICBDT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1BPUlQoImNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUucG9ydCIpLAogICAgIC8qKgogICAgICAqIFRoZSBwb3J0IG51bWJlciB0byB3aGljaCB0aGUgUk1JIGNvbm5lY3RvciB3aWxsIGJlIGJvdW5kIC0gY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5ybWkucG9ydC4KICAgICAgKiBBbiBJbnRlZ2VyIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgcmV0dXJuZWQKICAgICAgKiBpZiB0aGVyZSBpcyBubyBwb3J0IHNwZWNpZmllZCwgaWYgdGhlIHBvcnQgZG9lcyBub3QgaGF2ZSB0aGUgY29ycmVjdCBudW1lcmljIGZvcm1hdCwKICAgICAgKiBvciBpZiB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgZW1wdHkgb3IgbnVsbC4KICAgICAgKi8KLSAgICBDT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1JNSV9QT1JUICgiY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5ybWkucG9ydCIsICIwIiksCi0KLSAgICAvKiogQ2Fzc2FuZHJhIGpteCByZW1vdGUgYW5kIGxvY2FsIHBvcnQgKi8KLSAgICBDQVNTQU5EUkFfSk1YX1JFTU9URV9QT1JUKCJjYXNzYW5kcmEuam14LnJlbW90ZS5wb3J0IiksCi0gICAgQ0FTU0FORFJBX0pNWF9MT0NBTF9QT1JUKCJjYXNzYW5kcmEuam14LmxvY2FsLnBvcnQiKSwKLQorICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfUk1JX1BPUlQoImNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUucm1pLnBvcnQiLCAiMCIpLAogICAgIC8qKiBUaGlzIHByb3BlcnR5ICBpbmRpY2F0ZXMgd2hldGhlciBTU0wgaXMgZW5hYmxlZCBmb3IgbW9uaXRvcmluZyByZW1vdGVseS4gRGVmYXVsdCBpcyBzZXQgdG8gZmFsc2UuICovCi0gICAgQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9TU0wgKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbCIpLAotCi0gICAgLyoqCi0gICAgICogVGhpcyBwcm9wZXJ0eSBpbmRpY2F0ZXMgd2hldGhlciBTU0wgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGlzIGVuYWJsZWQgLSBjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbC5uZWVkLmNsaWVudC5hdXRoLgotICAgICAqIERlZmF1bHQgaXMgc2V0IHRvIGZhbHNlLgotICAgICAqLwotICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfU1NMX05FRURfQ0xJRU5UX0FVVEggKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbC5uZWVkLmNsaWVudC5hdXRoIiksCi0KLSAgICAvKioKLSAgICAgKiBUaGlzIHByb3BlcnR5IGluZGljYXRlcyB0aGUgbG9jYXRpb24gZm9yIHRoZSBhY2Nlc3MgZmlsZS4gSWYgY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5hdXRoZW50aWNhdGUgaXMgZmFsc2UsCi0gICAgICogdGhlbiB0aGlzIHByb3BlcnR5IGFuZCB0aGUgcGFzc3dvcmQgYW5kIGFjY2VzcyBmaWxlcywgYXJlIGlnbm9yZWQuIE90aGVyd2lzZSwgdGhlIGFjY2VzcyBmaWxlIG11c3QgZXhpc3QgYW5kCi0gICAgICogYmUgaW4gdGhlIHZhbGlkIGZvcm1hdC4gSWYgdGhlIGFjY2VzcyBmaWxlIGlzIGVtcHR5IG9yIG5vbmV4aXN0ZW50LCB0aGVuIG5vIGFjY2VzcyBpcyBhbGxvd2VkLgotICAgICAqLwotICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfQUNDRVNTX0ZJTEUgKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLmFjY2Vzcy5maWxlIiksCi0KLSAgICAvKiogVGhpcyBwcm9wZXJ0eSBpbmRpY2F0ZXMgdGhlIHBhdGggdG8gdGhlIHBhc3N3b3JkIGZpbGUgLSBjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBhc3N3b3JkLmZpbGUgKi8KLSAgICBDT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1BBU1NXT1JEX0ZJTEUgKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBhc3N3b3JkLmZpbGUiKSwKLQotICAgIC8qKiBQb3J0IG51bWJlciB0byBlbmFibGUgSk1YIFJNSSBjb25uZWN0aW9ucyAtIGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUucG9ydCAqLwotICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfUE9SVCAoImNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUucG9ydCIpLAotCi0gICAgLyoqCi0gICAgICogQSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBTU0wvVExTIHByb3RvY29sIHZlcnNpb25zIHRvIGVuYWJsZS4KLSAgICAgKiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5zc2wgLSBjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbC5lbmFibGVkLnByb3RvY29scwotICAgICAqLwotICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfU1NMX0VOQUJMRURfUFJPVE9DT0xTICgiY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5zc2wuZW5hYmxlZC5wcm90b2NvbHMiKSwKLQorICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfU1NMKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbCIpLAogICAgIC8qKgogICAgICAqIEEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgU1NML1RMUyBjaXBoZXIgc3VpdGVzIHRvIGVuYWJsZS4KICAgICAgKiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5zc2wgLSBjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbC5lbmFibGVkLmNpcGhlci5zdWl0ZXMKICAgICAgKi8KLSAgICBDT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1NTTF9FTkFCTEVEX0NJUEhFUl9TVUlURVMgKCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbC5lbmFibGVkLmNpcGhlci5zdWl0ZXMiKSwKLQotICAgIC8qKiBteDRqYWRkcmVzcyAqLwotICAgIE1YNEpBRERSRVNTICgibXg0amFkZHJlc3MiKSwKLQotICAgIC8qKiBteDRqcG9ydCAqLwotICAgIE1YNEpQT1JUICgibXg0anBvcnQiKSwKLQotICAgIFJJTkdfREVMQVkoImNhc3NhbmRyYS5yaW5nX2RlbGF5X21zIiksCi0KKyAgICBDT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1NTTF9FTkFCTEVEX0NJUEhFUl9TVUlURVMoImNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsLmVuYWJsZWQuY2lwaGVyLnN1aXRlcyIpLAogICAgIC8qKgotICAgICAqIFdoZW4gYm9vdHN0cmFwaW5nIHdlIHdhaXQgZm9yIGFsbCBzY2hlbWEgdmVyc2lvbnMgZm91bmQgaW4gZ29zc2lwIHRvIGJlIHNlZW4sIGFuZCBpZiBub3Qgc2VlbiBpbiB0aW1lIHdlIGZhaWwKLSAgICAgKiB0aGUgYm9vdHN0cmFwOyB0aGlzIHByb3BlcnR5IHdpbGwgYXZvaWQgZmFpbGluZyBhbmQgYWxsb3cgYm9vdHN0cmFwIHRvIGNvbnRpbnVlIGlmIHNldCB0byB0cnVlLgorICAgICAqIEEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgU1NML1RMUyBwcm90b2NvbCB2ZXJzaW9ucyB0byBlbmFibGUuCisgICAgICogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsIC0gY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5zc2wuZW5hYmxlZC5wcm90b2NvbHMKICAgICAgKi8KLSAgICBCT09UU1RSQVBfU0tJUF9TQ0hFTUFfQ0hFQ0soImNhc3NhbmRyYS5za2lwX3NjaGVtYV9jaGVjayIpLAotCisgICAgQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9TU0xfRU5BQkxFRF9QUk9UT0NPTFMoImNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsLmVuYWJsZWQucHJvdG9jb2xzIiksCiAgICAgLyoqCi0gICAgICogV2hlbiBib290c3RyYXBpbmcgaG93IGxvbmcgdG8gd2FpdCBmb3Igc2NoZW1hIHZlcnNpb25zIHRvIGJlIHNlZW4uCisgICAgICogVGhpcyBwcm9wZXJ0eSBpbmRpY2F0ZXMgd2hldGhlciBTU0wgY2xpZW50IGF1dGhlbnRpY2F0aW9uIGlzIGVuYWJsZWQgLSBjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbC5uZWVkLmNsaWVudC5hdXRoLgorICAgICAqIERlZmF1bHQgaXMgc2V0IHRvIGZhbHNlLgogICAgICAqLwotICAgIEJPT1RTVFJBUF9TQ0hFTUFfREVMQVlfTVMoImNhc3NhbmRyYS5zY2hlbWFfZGVsYXlfbXMiKSwKLQorICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfU1NMX05FRURfQ0xJRU5UX0FVVEgoImNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsLm5lZWQuY2xpZW50LmF1dGgiKSwKKyAgICAvKiogRGVmYXVsdHMgdG8gZmFsc2UgZm9yIDQuMSBidXQgcGxhbiB0byBzd2l0Y2ggdG8gdHJ1ZSBpbiBhIGxhdGVyIHJlbGVhc2UgdGhlIHRoaW5raW5nIGlzIHRoYXQgZW52aXJvbm1lbnRzCisgICAgICogbWF5IG5vdCB3b3JrIHJpZ2h0IG9mZiB0aGUgYmF0IHNvIHNhZmVyIHRvIGFkZCB0aGlzIGZlYXR1cmUgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLworICAgIENPTkZJR19BTExPV19TWVNURU1fUFJPUEVSVElFUygiY2Fzc2FuZHJhLmNvbmZpZy5hbGxvd19zeXN0ZW1fcHJvcGVydGllcyIpLAorICAgIENPTkZJR19MT0FERVIoImNhc3NhbmRyYS5jb25maWcubG9hZGVyIiksCisgICAgQ09OU0lTVEVOVF9ESVJFQ1RPUllfTElTVElOR1MoImNhc3NhbmRyYS5jb25zaXN0ZW50X2RpcmVjdG9yeV9saXN0aW5ncyIpLAorICAgIENPTlNJU1RFTlRfUkFOR0VfTU9WRU1FTlQoImNhc3NhbmRyYS5jb25zaXN0ZW50LnJhbmdlbW92ZW1lbnQiLCAidHJ1ZSIpLAorICAgIENPTlNJU1RFTlRfU0lNVUxUQU5FT1VTX01PVkVTX0FMTE9XKCJjYXNzYW5kcmEuY29uc2lzdGVudC5zaW11bHRhbmVvdXNtb3Zlcy5hbGxvdyIpLAorICAgIENVU1RPTV9HVUFSRFJBSUxTX0NPTkZJR19QUk9WSURFUl9DTEFTUygiY2Fzc2FuZHJhLmN1c3RvbV9ndWFyZHJhaWxzX2NvbmZpZ19wcm92aWRlcl9jbGFzcyIpLAorICAgIENVU1RPTV9RVUVSWV9IQU5ETEVSX0NMQVNTKCJjYXNzYW5kcmEuY3VzdG9tX3F1ZXJ5X2hhbmRsZXJfY2xhc3MiKSwKKyAgICBDVVNUT01fVFJBQ0lOR19DTEFTUygiY2Fzc2FuZHJhLmN1c3RvbV90cmFjaW5nX2NsYXNzIiksCisgICAgLyoqIENvbnRyb2xzIHRoZSB0eXBlIG9mIGJ1ZmZmZXIgKGhlYXAvZGlyZWN0KSB1c2VkIGZvciBzaGFyZWQgc2NyYXRjaCBidWZmZXJzICovCisgICAgREFUQV9PVVRQVVRfQlVGRkVSX0FMTE9DQVRFX1RZUEUoImNhc3NhbmRyYS5kb2IuYWxsb2NhdGVfdHlwZSIpLAorICAgIERBVEFfT1VUUFVUX1NUUkVBTV9QTFVTX1RFTVBfQlVGRkVSX1NJWkUoImNhc3NhbmRyYS5kYXRhX291dHB1dF9zdHJlYW1fcGx1c190ZW1wX2J1ZmZlcl9zaXplIiwgIjgxOTIiKSwKKyAgICBERUNBWUlOR19FU1RJTUFURURfSElTVE9HUkFNX1JFU0VSVk9JUl9TVFJJUEVfQ09VTlQoImNhc3NhbmRyYS5kZWhyX3N0cmlwZV9jb3VudCIsICIyIiksCisgICAgREVGQVVMVF9QUk9WSURFX09WRVJMQVBQSU5HX1RPTUJTVE9ORVMoImRlZmF1bHQucHJvdmlkZS5vdmVybGFwcGluZy50b21ic3RvbmVzIiksCisgICAgLyoqIGRldGVybWluaXNtIHByb3BlcnRpZXMgZm9yIHRlc3RpbmcgKi8KKyAgICBERVRFUk1JTklTTV9TU1RBQkxFX0NPTVBSRVNTSU9OX0RFRkFVTFQoImNhc3NhbmRyYS5zc3RhYmxlX2NvbXByZXNzaW9uX2RlZmF1bHQiLCAidHJ1ZSIpLAorICAgIERFVEVSTUlOSVNNX1VOU0FGRV9VVUlEX05PREUoImNhc3NhbmRyYS51bnNhZmUuZGV0ZXJtaW5pc3RpY3V1aWRub2RlIiksCisgICAgRElBR05PU1RJQ19TTkFQU0hPVF9JTlRFUlZBTF9OQU5PUygiY2Fzc2FuZHJhLmRpYWdub3N0aWNfc25hcHNob3RfaW50ZXJ2YWxfbmFub3MiLCAiNjAwMDAwMDAwMDAiKSwKKyAgICBESVNBQkxFX0FVVEhfQ0FDSEVTX1JFTU9URV9DT05GSUdVUkFUSU9OKCJjYXNzYW5kcmEuZGlzYWJsZV9hdXRoX2NhY2hlc19yZW1vdGVfY29uZmlndXJhdGlvbiIpLAorICAgIC8qKiBwcm9wZXJ0aWVzIHRvIGRpc2FibGUgY2VydGFpbiBiZWhhdmlvdXJzIGZvciB0ZXN0aW5nICovCisgICAgRElTQUJMRV9HT1NTSVBfRU5EUE9JTlRfUkVNT1ZBTCgiY2Fzc2FuZHJhLmdvc3NpcC5kaXNhYmxlX2VuZHBvaW50X3JlbW92YWwiKSwKKyAgICBESVNBQkxFX1BBWE9TX0FVVE9fUkVQQUlSUygiY2Fzc2FuZHJhLmRpc2FibGVfcGF4b3NfYXV0b19yZXBhaXJzIiksCisgICAgRElTQUJMRV9QQVhPU19TVEFURV9GTFVTSCgiY2Fzc2FuZHJhLmRpc2FibGVfcGF4b3Nfc3RhdGVfZmx1c2giKSwKKyAgICBESVNBQkxFX1NTVEFCTEVfQUNUSVZJVFlfVFJBQ0tJTkcoImNhc3NhbmRyYS5zc3RhYmxlX2FjdGl2aXR5X3RyYWNraW5nIiwgInRydWUiKSwKKyAgICBESVNBQkxFX1NUQ1NfSU5fTDAoImNhc3NhbmRyYS5kaXNhYmxlX3N0Y3NfaW5fbDAiKSwKKyAgICBESVNBQkxFX1RDQUNUSVZFX09QRU5TU0woImNhc3NhbmRyYS5kaXNhYmxlX3RjYWN0aXZlX29wZW5zc2wiKSwKKyAgICAvKiogcHJvcGVydHkgZm9yIHRoZSByYXRlIG9mIHRoZSBzY2hlZHVsZWQgdGFzayB0aGF0IG1vbml0b3JzIGRpc2sgdXNhZ2UgKi8KKyAgICBESVNLX1VTQUdFX01PTklUT1JfSU5URVJWQUxfTVMoImNhc3NhbmRyYS5kaXNrX3VzYWdlLm1vbml0b3JfaW50ZXJ2YWxfbXMiLCBjb252ZXJ0VG9TdHJpbmcoVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygzMCkpKSwKKyAgICAvKiogcHJvcGVydHkgZm9yIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0aGUgcmVwZWF0ZWQgY2xpZW50IHdhcm5pbmdzIGFuZCBkaWFnbm9zdGljIGV2ZW50cyBhYm91dCBkaXNrIHVzYWdlIGFyZSBpZ25vcmVkICovCisgICAgRElTS19VU0FHRV9OT1RJRllfSU5URVJWQUxfTVMoImNhc3NhbmRyYS5kaXNrX3VzYWdlLm5vdGlmeV9pbnRlcnZhbF9tcyIsIGNvbnZlcnRUb1N0cmluZyhUaW1lVW5pdC5NSU5VVEVTLnRvTWlsbGlzKDMwKSkpLAorICAgIERPQl9ET1VCTElOR19USFJFU0hPTERfTUIoImNhc3NhbmRyYS5ET0JfRE9VQkxJTkdfVEhSRVNIT0xEX01CIiwgIjY0IiksCisgICAgRE9CX01BWF9SRUNZQ0xFX0JZVEVTKCJjYXNzYW5kcmEuZG9iX21heF9yZWN5Y2xlX2J5dGVzIiwgY29udmVydFRvU3RyaW5nKDEwMjQgKiAxMDI0KSksCiAgICAgLyoqCiAgICAgICogV2hlbiBkcmFpbmluZywgaG93IGxvbmcgdG8gd2FpdCBmb3IgbXV0YXRpbmcgZXhlY3V0b3JzIHRvIHNodXRkb3duLgogICAgICAqLwotICAgIERSQUlOX0VYRUNVVE9SX1RJTUVPVVRfTVMoImNhc3NhbmRyYS5kcmFpbl9leGVjdXRvcl90aW1lb3V0X21zIiwgU3RyaW5nLnZhbHVlT2YoVGltZVVuaXQuTUlOVVRFUy50b01pbGxpcyg1KSkpLAotCisgICAgRFJBSU5fRVhFQ1VUT1JfVElNRU9VVF9NUygiY2Fzc2FuZHJhLmRyYWluX2V4ZWN1dG9yX3RpbWVvdXRfbXMiLCBjb252ZXJ0VG9TdHJpbmcoVGltZVVuaXQuTUlOVVRFUy50b01pbGxpcyg1KSkpLAorICAgIERST1BfT1ZFUlNJWkVEX1JFQURfUkVQQUlSX01VVEFUSU9OUygiY2Fzc2FuZHJhLmRyb3Bfb3ZlcnNpemVkX3JlYWRyZXBhaXJfbXV0YXRpb25zIiksCisgICAgRFRFU1RfQVBJX0xPR19UT1BPTE9HWSgiY2Fzc2FuZHJhLmR0ZXN0LmFwaS5sb2cudG9wb2xvZ3kiKSwKKyAgICBFTkFCTEVfRENfTE9DQUxfQ09NTUlUKCJjYXNzYW5kcmEuZW5hYmxlX2RjX2xvY2FsX2NvbW1pdCIsICJ0cnVlIiksCisgICAgLyoqCisgICAgICogV2hldGhlciB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29uc2lzdGVuY3lMZXZlbCNOT0RFX0xPQ0FMfSBzaG91bGQgYmUgYWxsb3dlZC4KKyAgICAgKi8KKyAgICBFTkFCTEVfTk9ERUxPQ0FMX1FVRVJJRVMoImNhc3NhbmRyYS5lbmFibGVfbm9kZWxvY2FsX3F1ZXJpZXMiKSwKKyAgICBFWFBJUkFUSU9OX0RBVEVfT1ZFUkZMT1dfUE9MSUNZKCJjYXNzYW5kcmEuZXhwaXJhdGlvbl9kYXRlX292ZXJmbG93X3BvbGljeSIpLAorICAgIEVYUElSQVRJT05fT1ZFUkZMT1dfV0FSTklOR19JTlRFUlZBTF9NSU5VVEVTKCJjYXNzYW5kcmEuZXhwaXJhdGlvbl9vdmVyZmxvd193YXJuaW5nX2ludGVydmFsX21pbnV0ZXMiLCAiNSIpLAorICAgIEZBSUxVUkVfTE9HR0lOR19JTlRFUlZBTF9TRUNPTkRTKCJjYXNzYW5kcmEucmVxdWVzdF9mYWlsdXJlX2xvZ19pbnRlcnZhbF9zZWNvbmRzIiwgIjYwIiksCisgICAgRkRfSU5JVElBTF9WQUxVRV9NUygiY2Fzc2FuZHJhLmZkX2luaXRpYWxfdmFsdWVfbXMiKSwKKyAgICBGRF9NQVhfSU5URVJWQUxfTVMoImNhc3NhbmRyYS5mZF9tYXhfaW50ZXJ2YWxfbXMiKSwKKyAgICBGSUxFX0NBQ0hFX0VOQUJMRUQoImNhc3NhbmRyYS5maWxlX2NhY2hlX2VuYWJsZWQiKSwKKyAgICAvKiogQGRlcHJlY2F0ZWQgc2hvdWxkIGJlIHJlbW92ZWQgaW4gZmF2b3Igb2YgZW5hYmxlIGZsYWcgb2YgcmVsZXZhbnQgc3RhcnR1cCBjaGVjayAoRmlsZVN5c3RlbU93bmVyc2hpcENoZWNrKSAqLworICAgIEBEZXByZWNhdGVkCisgICAgRklMRV9TWVNURU1fQ0hFQ0tfRU5BQkxFKCJjYXNzYW5kcmEuZW5hYmxlX2ZzX293bmVyc2hpcF9jaGVjayIpLAorICAgIC8qKiBAZGVwcmVjYXRlZCBzaG91bGQgYmUgcmVtb3ZlZCBpbiBmYXZvciBvZiBmbGFncyBpbiByZWxldmFudCBzdGFydHVwIGNoZWNrIChGaWxlU3lzdGVtT3duZXJzaGlwQ2hlY2spICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBGSUxFX1NZU1RFTV9DSEVDS19PV05FUlNISVBfRklMRU5BTUUoImNhc3NhbmRyYS5mc19vd25lcnNoaXBfZmlsZW5hbWUiLCBGaWxlU3lzdGVtT3duZXJzaGlwQ2hlY2suREVGQVVMVF9GU19PV05FUlNISVBfRklMRU5BTUUpLAorICAgIC8qKiBAZGVwcmVjYXRlZCBzaG91bGQgYmUgcmVtb3ZlZCBpbiBmYXZvciBvZiBmbGFncyBpbiByZWxldmFudCBzdGFydHVwIGNoZWNrIChGaWxlU3lzdGVtT3duZXJzaGlwQ2hlY2spICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBGSUxFX1NZU1RFTV9DSEVDS19PV05FUlNISVBfVE9LRU4oRmlsZVN5c3RlbU93bmVyc2hpcENoZWNrLkZJTEVfU1lTVEVNX0NIRUNLX09XTkVSU0hJUF9UT0tFTiksCisgICAgRk9SQ0VfREVGQVVMVF9JTkRFWElOR19QQUdFX1NJWkUoImNhc3NhbmRyYS5mb3JjZV9kZWZhdWx0X2luZGV4aW5nX3BhZ2Vfc2l6ZSIpLAorICAgIC8qKiBVc2VkIHdoZW4gcnVubmluZyBpbiBDbGllbnQgbW9kZSBhbmQgdGhlIHN5c3RlbSBhbmQgc2NoZW1hIGtleXNwYWNlcyBuZWVkIHRvIGJlIGluaXRpYWxpemVkIG91dHNpZGUgb2YgdGhlaXIgbm9ybWFsIGluaXRpYWxpemF0aW9uIHBhdGggKiovCisgICAgRk9SQ0VfTE9BRF9MT0NBTF9LRVlTUEFDRVMoImNhc3NhbmRyYS5zY2hlbWEuZm9yY2VfbG9hZF9sb2NhbF9rZXlzcGFjZXMiKSwKKyAgICBGT1JDRV9QQVhPU19TVEFURV9SRUJVSUxEKCJjYXNzYW5kcmEuZm9yY2VfcGF4b3Nfc3RhdGVfcmVidWlsZCIpLAorICAgIEdJVF9TSEEoImNhc3NhbmRyYS5naXRTSEEiKSwKICAgICAvKioKICAgICAgKiBHb3NzaXAgcXVhcmFudGluZSBkZWxheSBpcyB1c2VkIHdoaWxlIGV2YWx1YXRpbmcgbWVtYmVyc2hpcCBjaGFuZ2VzIGFuZCBzaG91bGQgb25seSBiZSBjaGFuZ2VkIHdpdGggZXh0cmVtZSBjYXJlLgogICAgICAqLwogICAgIEdPU1NJUEVSX1FVQVJBTlRJTkVfREVMQVkoImNhc3NhbmRyYS5nb3NzaXBfcXVhcmFudGluZV9kZWxheV9tcyIpLAotCiAgICAgR09TU0lQRVJfU0tJUF9XQUlUSU5HX1RPX1NFVFRMRSgiY2Fzc2FuZHJhLnNraXBfd2FpdF9mb3JfZ29zc2lwX3RvX3NldHRsZSIsICItMSIpLAotCi0gICAgSUdOT1JFRF9TQ0hFTUFfQ0hFQ0tfVkVSU0lPTlMoImNhc3NhbmRyYS5za2lwX3NjaGVtYV9jaGVja19mb3JfdmVyc2lvbnMiKSwKLQorICAgIEdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OKCJjYXNzYW5kcmEuZ29zc2lwLmRpc2FibGVfdGhyZWFkX3ZhbGlkYXRpb24iKSwKICAgICBJR05PUkVEX1NDSEVNQV9DSEVDS19FTkRQT0lOVFMoImNhc3NhbmRyYS5za2lwX3NjaGVtYV9jaGVja19mb3JfZW5kcG9pbnRzIiksCi0KLSAgICBTSFVURE9XTl9BTk5PVU5DRV9ERUxBWV9JTl9NUygiY2Fzc2FuZHJhLnNodXRkb3duX2Fubm91bmNlX2luX21zIiwgIjIwMDAiKSwKLQorICAgIElHTk9SRURfU0NIRU1BX0NIRUNLX1ZFUlNJT05TKCJjYXNzYW5kcmEuc2tpcF9zY2hlbWFfY2hlY2tfZm9yX3ZlcnNpb25zIiksCisgICAgSUdOT1JFX0NPUlJVUFRFRF9TQ0hFTUFfVEFCTEVTKCJjYXNzYW5kcmEuaWdub3JlX2NvcnJ1cHRlZF9zY2hlbWFfdGFibGVzIiksCisgICAgLyoqIEBkZXByZWNhdGVkIHNob3VsZCBiZSByZW1vdmVkIGluIGZhdm9yIG9mIGVuYWJsZSBmbGFnIG9mIHJlbGV2YW50IHN0YXJ0dXAgY2hlY2sgKGNoZWNrRGF0YWNlbnRlcikgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIElHTk9SRV9EQygiY2Fzc2FuZHJhLmlnbm9yZV9kYyIpLAorICAgIElHTk9SRV9EWU5BTUlDX1NOSVRDSF9TRVZFUklUWSgiY2Fzc2FuZHJhLmlnbm9yZV9keW5hbWljX3NuaXRjaF9zZXZlcml0eSIpLAorICAgIElHTk9SRV9NSVNTSU5HX05BVElWRV9GSUxFX0hJTlRTKCJjYXNzYW5kcmEucmVxdWlyZV9uYXRpdmVfZmlsZV9oaW50cyIpLAorICAgIC8qKiBAZGVwcmVjYXRlZCBzaG91bGQgYmUgcmVtb3ZlZCBpbiBmYXZvciBvZiBlbmFibGUgZmxhZyBvZiByZWxldmFudCBzdGFydHVwIGNoZWNrIChjaGVja1JhY2spICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBJR05PUkVfUkFDSygiY2Fzc2FuZHJhLmlnbm9yZV9yYWNrIiksCisgICAgSU5ERVhfU1VNTUFSWV9FWFBFQ1RFRF9LRVlfU0laRSgiY2Fzc2FuZHJhLmluZGV4X3N1bW1hcnlfZXhwZWN0ZWRfa2V5X3NpemUiLCAiNjQiKSwKKyAgICBJTklUSUFMX1RPS0VOKCJjYXNzYW5kcmEuaW5pdGlhbF90b2tlbiIpLAorICAgIElOVEVSTk9ERV9FVkVOVF9USFJFQURTKCJjYXNzYW5kcmEuaW50ZXJub2RlLWV2ZW50LXRocmVhZHMiKSwKKyAgICBJT19ORVRUWV9FVkVOVExPT1BfVEhSRUFEUygiaW8ubmV0dHkuZXZlbnRMb29wVGhyZWFkcyIpLAorICAgIElPX05FVFRZX1RSQU5TUE9SVF9FU1RJTUFURV9TSVpFX09OX1NVQk1JVCgiaW8ubmV0dHkudHJhbnNwb3J0LmVzdGltYXRlU2l6ZU9uU3VibWl0IiksCisgICAgSkFWQVhfUk1JX1NTTF9DTElFTlRfRU5BQkxFRF9DSVBIRVJfU1VJVEVTKCJqYXZheC5ybWkuc3NsLmNsaWVudC5lbmFibGVkQ2lwaGVyU3VpdGVzIiksCisgICAgSkFWQVhfUk1JX1NTTF9DTElFTlRfRU5BQkxFRF9QUk9UT0NPTFMoImphdmF4LnJtaS5zc2wuY2xpZW50LmVuYWJsZWRQcm90b2NvbHMiKSwKKyAgICAvKiogSmF2YSBjbGFzcyBwYXRoLiAqLworICAgIEpBVkFfQ0xBU1NfUEFUSCgiamF2YS5jbGFzcy5wYXRoIiksCisgICAgSkFWQV9IT01FKCJqYXZhLmhvbWUiKSwKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkgdXNlZCBieSB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUgKEpWTSkKKyAgICAgKiB0byBjcmVhdGUgYW5kIHN0b3JlIHRlbXBvcmFyeSBmaWxlcy4KKyAgICAgKi8KKyAgICBKQVZBX0lPX1RNUERJUigiamF2YS5pby50bXBkaXIiKSwKKyAgICAvKioKKyAgICAgKiBQYXRoIGZyb20gd2hpY2ggdG8gbG9hZCBuYXRpdmUgbGlicmFyaWVzLgorICAgICAqIERlZmF1bHQgaXMgYWJzb2x1dGUgcGF0aCB0byBsaWIgZGlyZWN0b3J5LgorICAgICAqLworICAgIEpBVkFfTElCUkFSWV9QQVRIKCJqYXZhLmxpYnJhcnkucGF0aCIpLAorICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IHJlcHJlc2VudHMgdGhlIGhvc3QgbmFtZSBzdHJpbmcKKyAgICAgKiB0aGF0IHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggcmVtb3RlIHN0dWJzIGZvciBsb2NhbGx5IGNyZWF0ZWQgcmVtb3RlIG9iamVjdHMsCisgICAgICogaW4gb3JkZXIgdG8gYWxsb3cgY2xpZW50cyB0byBpbnZva2UgbWV0aG9kcyBvbiB0aGUgcmVtb3RlIG9iamVjdC4KKyAgICAgKi8KKyAgICBKQVZBX1JNSV9TRVJWRVJfSE9TVE5BTUUoImphdmEucm1pLnNlcnZlci5ob3N0bmFtZSIpLAorICAgIC8qKgorICAgICAqIElmIHRoaXMgdmFsdWUgaXMgdHJ1ZSwgb2JqZWN0IGlkZW50aWZpZXJzIGZvciByZW1vdGUgb2JqZWN0cyBleHBvcnRlZCBieSB0aGlzIFZNIHdpbGwgYmUgZ2VuZXJhdGVkIGJ5IHVzaW5nCisgICAgICogYSBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgorICAgICAqLworICAgIEpBVkFfUk1JX1NFUlZFUl9SQU5ET01fSUQoImphdmEucm1pLnNlcnZlci5yYW5kb21JRHMiKSwKKyAgICBKQVZBX1NFQ1VSSVRZX0FVVEhfTE9HSU5fQ09ORklHKCJqYXZhLnNlY3VyaXR5LmF1dGgubG9naW4uY29uZmlnIiksCisgICAgSkFWQV9TRUNVUklUWV9FR0QoImphdmEuc2VjdXJpdHkuZWdkIiksCisgICAgLyoqIEphdmEgUnVudGltZSBFbnZpcm9ubWVudCB2ZXJzaW9uICovCisgICAgSkFWQV9WRVJTSU9OKCJqYXZhLnZlcnNpb24iKSwKKyAgICAvKiogSmF2YSBWaXJ0dWFsIE1hY2hpbmUgaW1wbGVtZW50YXRpb24gbmFtZSAqLworICAgIEpBVkFfVk1fTkFNRSgiamF2YS52bS5uYW1lIiksCisgICAgSk9JTl9SSU5HKCJjYXNzYW5kcmEuam9pbl9yaW5nIiwgInRydWUiKSwKKyAgICAvKiogc3RhcnR1cCBjaGVja3MgcHJvcGVydGllcyAqLworICAgIExJQkpFTUFMTE9DKCJjYXNzYW5kcmEubGliamVtYWxsb2MiKSwKKyAgICAvKiogTGluZSBzZXBhcmF0b3IgKCJcbiIgb24gVU5JWCkuICovCisgICAgTElORV9TRVBBUkFUT1IoImxpbmUuc2VwYXJhdG9yIiksCisgICAgLyoqIExvYWQgcGVyc2lzdGVuY2UgcmluZyBzdGF0ZS4gRGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgdHJ1ZX0uICovCisgICAgTE9BRF9SSU5HX1NUQVRFKCJjYXNzYW5kcmEubG9hZF9yaW5nX3N0YXRlIiwgInRydWUiKSwKKyAgICBMT0c0SjJfRElTQUJMRV9KTVgoImxvZzRqMi5kaXNhYmxlSm14IiksCisgICAgTE9HNEoyX0RJU0FCTEVfSk1YX0xFR0FDWSgibG9nNGoyLmRpc2FibGUuam14IiksCisgICAgTE9HNEpfU0hVVERPV05fSE9PS19FTkFCTEVEKCJsb2c0ai5zaHV0ZG93bkhvb2tFbmFibGVkIiksCisgICAgTE9HQkFDS19DT05GSUdVUkFUSU9OX0ZJTEUoImxvZ2JhY2suY29uZmlndXJhdGlvbkZpbGUiKSwKKyAgICAvKiogTWF4aW11bSBudW1iZXIgb2Ygcm93cyBpbiBzeXN0ZW1fdmlld3MubG9ncyB0YWJsZSAqLworICAgIExPR1NfVklSVFVBTF9UQUJMRV9NQVhfUk9XUygiY2Fzc2FuZHJhLnZpcnR1YWwubG9ncy5tYXgucm93cyIsIGNvbnZlcnRUb1N0cmluZyhMb2dNZXNzYWdlc1RhYmxlLkxPR1NfVklSVFVBTF9UQUJMRV9ERUZBVUxUX1JPV1MpKSwKKyAgICAvKioKKyAgICAgKiBEaXJlY3Rvcnkgd2hlcmUgQ2Fzc2FuZHJhIHB1dHMgaXRzIGxvZ3MsIGRlZmF1bHRzIHRvICIuIiB3aGljaCBpcyBjdXJyZW50IGRpcmVjdG9yeS4KKyAgICAgKi8KKyAgICBMT0dfRElSKCJjYXNzYW5kcmEubG9nZGlyIiwgIi4iKSwKKyAgICAvKioKKyAgICAgKiBEaXJlY3Rvcnkgd2hlcmUgQ2Fzc2FuZHJhIHBlcnNpc3RzIGxvZ3MgZnJvbSBhdWRpdCBsb2dnaW5nLiBJZiB0aGlzIHByb3BlcnR5IGlzIG5vdCBzZXQsIHRoZSBhdWRpdCBsb2cgZnJhbWV3b3JrCisgICAgICogd2lsbCBzZXQgaXQgYXV0b21hdGljYWxseSB0byB7QGxpbmsgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzI0xPR19ESVJ9ICsgIi9hdWRpdCIuCisgICAgICovCisgICAgTE9HX0RJUl9BVURJVCgiY2Fzc2FuZHJhLmxvZ2Rpci5hdWRpdCIpLAorICAgIC8qKiBMb29zZW4gdGhlIGRlZmluaXRpb24gb2YgImVtcHR5IiBmb3IgZ29zc2lwIHN0YXRlLCBmb3IgdXNlIGR1cmluZyBob3N0IHJlcGxhY2VtZW50cyBpZiB0aGluZ3MgZ28gYXdyeSAqLworICAgIExPT1NFX0RFRl9PRl9FTVBUWV9FTkFCTEVEKENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiZ29zc2lwZXIubG9vc2VfZW1wdHlfZW5hYmxlZCIpLAorICAgIE1BWF9DT05DVVJSRU5UX1JBTkdFX1JFUVVFU1RTKCJjYXNzYW5kcmEubWF4X2NvbmN1cnJlbnRfcmFuZ2VfcmVxdWVzdHMiKSwKKyAgICBNQVhfSElOVF9CVUZGRVJTKCJjYXNzYW5kcmEuTUFYX0hJTlRfQlVGRkVSUyIsICIzIiksCisgICAgTUFYX0xPQ0FMX1BBVVNFX0lOX01TKCJjYXNzYW5kcmEubWF4X2xvY2FsX3BhdXNlX2luX21zIiwgIjUwMDAiKSwKKyAgICAvKiogd2hhdCBjbGFzcyB0byB1c2UgZm9yIG1iZWFuIHJlZ2lzdGVyYXRpb24gKi8KKyAgICBNQkVBTl9SRUdJU1RSQVRJT05fQ0xBU1MoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1iZWFuX3JlZ2lzdHJhdGlvbl9jbGFzcyIpLAorICAgIE1FTVRBQkxFX09WRVJIRUFEX0NPTVBVVEVfU1RFUFMoImNhc3NhbmRyYS5tZW10YWJsZV9yb3dfb3ZlcmhlYWRfY29tcHV0YXRpb25fc3RlcCIsICIxMDAwMDAiKSwKKyAgICBNRU1UQUJMRV9PVkVSSEVBRF9TSVpFKCJjYXNzYW5kcmEubWVtdGFibGUucm93X292ZXJoZWFkX3NpemUiLCAiLTEiKSwKKyAgICBNRU1UQUJMRV9TSEFSRF9DT1VOVCgiY2Fzc2FuZHJhLm1lbXRhYmxlLnNoYXJkLmNvdW50IiksCisgICAgTUVNVEFCTEVfVFJJRV9TSVpFX0xJTUlUKCJjYXNzYW5kcmEudHJpZV9zaXplX2xpbWl0X21iIiksCisgICAgTUVUUklDU19SRVBPUlRFUl9DT05GSUdfRklMRSgiY2Fzc2FuZHJhLm1ldHJpY3NSZXBvcnRlckNvbmZpZ0ZpbGUiKSwKKyAgICBNSUdSQVRJT05fREVMQVkoImNhc3NhbmRyYS5taWdyYXRpb25fZGVsYXlfbXMiLCAiNjAwMDAiKSwKKyAgICAvKiogRGVmaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdW5pcXVlIHRpbWVkIG91dCBxdWVyaWVzIHRoYXQgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgbG9ncy4gVXNlIGEgbmVnYXRpdmUgbnVtYmVyIHRvIHJlbW92ZSBhbnkgbGltaXQuICovCisgICAgTU9OSVRPUklOR19NQVhfT1BFUkFUSU9OUygiY2Fzc2FuZHJhLm1vbml0b3JpbmdfbWF4X29wZXJhdGlvbnMiLCAiNTAiKSwKKyAgICAvKiogRGVmaW5lcyB0aGUgaW50ZXJ2YWwgZm9yIHJlcG9ydGluZyBhbnkgb3BlcmF0aW9ucyB0aGF0IGhhdmUgdGltZWQgb3V0LiAqLworICAgIE1PTklUT1JJTkdfUkVQT1JUX0lOVEVSVkFMX01TKCJjYXNzYW5kcmEubW9uaXRvcmluZ19yZXBvcnRfaW50ZXJ2YWxfbXMiLCAiNTAwMCIpLAorICAgIE1WX0FMTE9XX0ZJTFRFUklOR19OT05LRVlfQ09MVU1OU19VTlNBRkUoImNhc3NhbmRyYS5tdi5hbGxvd19maWx0ZXJpbmdfbm9ua2V5X2NvbHVtbnNfdW5zYWZlIiksCisgICAgTVZfRU5BQkxFX0NPT1JESU5BVE9SX0JBVENITE9HKCJjYXNzYW5kcmEubXZfZW5hYmxlX2Nvb3JkaW5hdG9yX2JhdGNobG9nIiksCisgICAgLyoqIG14NGphZGRyZXNzICovCisgICAgTVg0SkFERFJFU1MoIm14NGphZGRyZXNzIiksCisgICAgLyoqIG14NGpwb3J0ICovCisgICAgTVg0SlBPUlQoIm14NGpwb3J0IiksCisgICAgTkFOT1RJTUVUT01JTExJU19USU1FU1RBTVBfVVBEQVRFX0lOVEVSVkFMKCJjYXNzYW5kcmEuTkFOT1RJTUVUT01JTExJU19USU1FU1RBTVBfVVBEQVRFX0lOVEVSVkFMIiwgIjEwMDAwIiksCisgICAgTkFUSVZFX0VQT0xMX0VOQUJMRUQoImNhc3NhbmRyYS5uYXRpdmUuZXBvbGwuZW5hYmxlZCIsICJ0cnVlIiksCisgICAgLyoqIFRoaXMgaXMgdGhlIHBvcnQgdXNlZCB3aXRoIFJQQyBhZGRyZXNzIGZvciB0aGUgbmF0aXZlIHByb3RvY29sIHRvIGNvbW11bmljYXRlIHdpdGggY2xpZW50cy4gTm93IHRoYXQgdGhyaWZ0IFJQQyBpcyBubyBsb25nZXIgaW4gdXNlIHRoZXJlIGlzIG5vIFJQQyBwb3J0LiAqLworICAgIE5BVElWRV9UUkFOU1BPUlRfUE9SVCgiY2Fzc2FuZHJhLm5hdGl2ZV90cmFuc3BvcnRfcG9ydCIpLAorICAgIE5FVkVSX1BVUkdFX1RPTUJTVE9ORVMoImNhc3NhbmRyYS5uZXZlcl9wdXJnZV90b21ic3RvbmVzIiksCisgICAgTklPX0RBVEFfT1VUUFVUX1NUUkVBTV9QTFVTX0JVRkZFUl9TSVpFKCJjYXNzYW5kcmEubmlvX2RhdGFfb3V0cHV0X3N0cmVhbV9wbHVzX2J1ZmZlcl9zaXplIiwgY29udmVydFRvU3RyaW5nKDMyICogMTAyNCkpLAorICAgIE5PREVUT09MX0pNWF9OT1RJRklDQVRJT05fUE9MTF9JTlRFUlZBTF9TRUNPTkRTKCJjYXNzYW5kcmEubm9kZXRvb2wuam14X25vdGlmaWNhdGlvbl9wb2xsX2ludGVydmFsX3NlY29uZHMiLCBjb252ZXJ0VG9TdHJpbmcoVGltZVVuaXQuU0VDT05EUy5jb252ZXJ0KDUsIFRpbWVVbml0Lk1JTlVURVMpKSksCisgICAgLyoqIElmIHNldCwge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlfSBpcyBzaHV0ZG93biBhYnJ0dXB0bHkgd2l0aG91dCB3YWl0aW5nIGZvciBhbnl0aGluZy4KKyAgICAgKiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiB1c2VkIGluIHVuaXQgdGVzdHMgYmVjdWFzZSB3ZSBuZXZlciByZXN0YXJ0IGEgbm9kZSB0aGVyZS4gVGhlIG9ubHkgbm9kZSBpcyBzdG9wb3BlZAorICAgICAqIHdoZW4gdGhlIEpWTSB0ZXJtaW5hdGVzLiBUaGVyZWZvcmUsIHdlIGNhbiB1c2Ugc3VjaCBvcHRpbWl6YXRpb24gYW5kIG5vdCB3YWl0IHVubmVjZXNzYXJpbHkuICovCisgICAgTk9OX0dSQUNFRlVMX1NIVVRET1dOKCJjYXNzYW5kcmEudGVzdC5tZXNzYWdpbmdTZXJ2aWNlLm5vbkdyYWNlZnVsU2h1dGRvd24iKSwKKyAgICAvKiogZm9yIHNwZWNpZmljIHRlc3RzICovCisgICAgLyoqIFRoaXMgcHJvcGVydHkgaW5kaWNhdGVzIHdoZXRoZXIgZGlzYWJsZV9tYmVhbl9yZWdpc3RyYXRpb24gaXMgdHJ1ZSAqLworICAgIE9SR19BUEFDSEVfQ0FTU0FORFJBX0RJU0FCTEVfTUJFQU5fUkVHSVNUUkFUSU9OKCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXNhYmxlX21iZWFuX3JlZ2lzdHJhdGlvbiIpLAorICAgIC8qKiBPcGVyYXRpbmcgc3lzdGVtIGFyY2hpdGVjdHVyZS4gKi8KKyAgICBPU19BUkNIKCJvcy5hcmNoIiksCisgICAgLyoqIE9wZXJhdGluZyBzeXN0ZW0gbmFtZS4gKi8KKyAgICBPU19OQU1FKCJvcy5uYW1lIiksCisgICAgT1RDUF9MQVJHRV9NRVNTQUdFX1RIUkVTSE9MRCgiY2Fzc2FuZHJhLm90Y3BfbGFyZ2VfbWVzc2FnZV90aHJlc2hvbGQiLCBjb252ZXJ0VG9TdHJpbmcoMTAyNCAqIDY0KSksCisgICAgLyoqIEVuYWJsZWQvZGlzYWJsZSBUQ1BfTk9ERUxBWSBmb3IgaW50cmFkYyBjb25uZWN0aW9ucy4gRGVmYXVsdHMgaXMgZW5hYmxlZC4gKi8KKyAgICBPVENfSU5UUkFEQ19UQ1BfTk9ERUxBWSgiY2Fzc2FuZHJhLm90Y19pbnRyYWRjX3RjcF9ub2RlbGF5IiwgInRydWUiKSwKKyAgICBPVkVSUklERV9ERUNPTU1JU1NJT04oImNhc3NhbmRyYS5vdmVycmlkZV9kZWNvbW1pc3Npb24iKSwKKyAgICBQQVJFTlRfUkVQQUlSX1NUQVRVU19DQUNIRV9TSVpFKCJjYXNzYW5kcmEucGFyZW50X3JlcGFpcl9zdGF0dXNfY2FjaGVfc2l6ZSIsICIxMDAwMDAiKSwKKyAgICBQQVJFTlRfUkVQQUlSX1NUQVRVU19FWFBJUllfU0VDT05EUygiY2Fzc2FuZHJhLnBhcmVudF9yZXBhaXJfc3RhdHVzX2V4cGlyeV9zZWNvbmRzIiwgY29udmVydFRvU3RyaW5nKFRpbWVVbml0LlNFQ09ORFMuY29udmVydCgxLCBUaW1lVW5pdC5EQVlTKSkpLAorICAgIFBBUlRJVElPTkVSKCJjYXNzYW5kcmEucGFydGl0aW9uZXIiKSwKKyAgICBQQVhPU19DTEVBTlVQX1NFU1NJT05fVElNRU9VVF9TRUNPTkRTKCJjYXNzYW5kcmEucGF4b3NfY2xlYW51cF9zZXNzaW9uX3RpbWVvdXRfc2Vjb25kcyIsIGNvbnZlcnRUb1N0cmluZyhUaW1lVW5pdC5IT1VSUy50b1NlY29uZHMoMikpKSwKKyAgICBQQVhPU19ESVNBQkxFX0NPT1JESU5BVE9SX0xPQ0tJTkcoImNhc3NhbmRyYS5wYXhvcy5kaXNhYmxlX2Nvb3JkaW5hdG9yX2xvY2tpbmciKSwKKyAgICBQQVhPU19MT0dfVFRMX0xJTkVBUklaQUJJTElUWV9WSU9MQVRJT05TKCJjYXNzYW5kcmEucGF4b3MubG9nX3R0bF9saW5lYXJpemFiaWxpdHlfdmlvbGF0aW9ucyIsICJ0cnVlIiksCisgICAgUEFYT1NfTU9ERVJOX1JFTEVBU0UoImNhc3NhbmRyYS5wYXhvcy5tb2Rlcm5fcmVsZWFzZSIsICI0LjEiKSwKKyAgICBQQVhPU19SRVBBSVJfQUxMT1dfTVVMVElQTEVfUEVORElOR19VTlNBRkUoImNhc3NhbmRyYS5wYXhvc19yZXBhaXJfYWxsb3dfbXVsdGlwbGVfcGVuZGluZ191bnNhZmUiKSwKKyAgICBQQVhPU19SRVBBSVJfT05fVE9QT0xPR1lfQ0hBTkdFX1JFVFJJRVMoImNhc3NhbmRyYS5wYXhvc19yZXBhaXJfb25fdG9wb2xvZ3lfY2hhbmdlX3JldHJpZXMiLCAiMTAiKSwKKyAgICBQQVhPU19SRVBBSVJfT05fVE9QT0xPR1lfQ0hBTkdFX1JFVFJZX0RFTEFZX1NFQ09ORFMoImNhc3NhbmRyYS5wYXhvc19yZXBhaXJfb25fdG9wb2xvZ3lfY2hhbmdlX3JldHJ5X2RlbGF5X3NlY29uZHMiLCAiMTAiKSwKKyAgICBQQVhPU19SRVBBSVJfUkVUUllfVElNRU9VVF9JTl9NUygiY2Fzc2FuZHJhLnBheG9zX3JlcGFpcl9yZXRyeV90aW1lb3V0X21pbGxpcyIsICI2MDAwMCIpLAorICAgIFBBWE9TX1VTRV9TRUxGX0VYRUNVVElPTigiY2Fzc2FuZHJhLnBheG9zLnVzZV9zZWxmX2V4ZWN1dGlvbiIsICJ0cnVlIiksCisgICAgUFJJTlRfSEVBUF9ISVNUT0dSQU1fT05fT1VUX09GX01FTU9SWV9FUlJPUigiY2Fzc2FuZHJhLnByaW50SGVhcEhpc3RvZ3JhbU9uT3V0T2ZNZW1vcnlFcnJvciIpLAorICAgIFJFQURTX1RIUkVTSE9MRFNfQ09PUkRJTkFUT1JfREVGRU5TSVZFX0NIRUNLU19FTkFCTEVEKCJjYXNzYW5kcmEucmVhZHMudGhyZXNob2xkcy5jb29yZGluYXRvci5kZWZlbnNpdmVfY2hlY2tzX2VuYWJsZWQiKSwKKyAgICBSRUxFQVNFX1ZFUlNJT04oImNhc3NhbmRyYS5yZWxlYXNlVmVyc2lvbiIpLAorICAgIFJFTE9DQVRFRF9TSEFERURfSU9fTkVUVFlfVFJBTlNQT1JUX05PTkFUSVZFKCJyZWxvY2F0ZWQuc2hhZGVkLmlvLm5ldHR5LnRyYW5zcG9ydC5ub05hdGl2ZSIpLAorICAgIFJFUEFJUl9DTEVBTlVQX0lOVEVSVkFMX1NFQ09ORFMoImNhc3NhbmRyYS5yZXBhaXJfY2xlYW51cF9pbnRlcnZhbF9zZWNvbmRzIiwgY29udmVydFRvU3RyaW5nKEludHMuY2hlY2tlZENhc3QoVGltZVVuaXQuTUlOVVRFUy50b1NlY29uZHMoMTApKSkpLAorICAgIFJFUEFJUl9ERUxFVEVfVElNRU9VVF9TRUNPTkRTKCJjYXNzYW5kcmEucmVwYWlyX2RlbGV0ZV90aW1lb3V0X3NlY29uZHMiLCBjb252ZXJ0VG9TdHJpbmcoSW50cy5jaGVja2VkQ2FzdChUaW1lVW5pdC5EQVlTLnRvU2Vjb25kcygxKSkpKSwKKyAgICBSRVBBSVJfRkFJTF9USU1FT1VUX1NFQ09ORFMoImNhc3NhbmRyYS5yZXBhaXJfZmFpbF90aW1lb3V0X3NlY29uZHMiLCBjb252ZXJ0VG9TdHJpbmcoSW50cy5jaGVja2VkQ2FzdChUaW1lVW5pdC5EQVlTLnRvU2Vjb25kcygxKSkpKSwKKyAgICBSRVBBSVJfTVVUQVRJT05fUkVQQUlSX1JPV1NfUEVSX0JBVENIKCJjYXNzYW5kcmEucmVwYWlyLm11dGF0aW9uX3JlcGFpcl9yb3dzX3Blcl9iYXRjaCIsICIxMDAiKSwKKyAgICBSRVBBSVJfU1RBVFVTX0NIRUNLX1RJTUVPVVRfU0VDT05EUygiY2Fzc2FuZHJhLnJlcGFpcl9zdGF0dXNfY2hlY2tfdGltZW91dF9zZWNvbmRzIiwgY29udmVydFRvU3RyaW5nKEludHMuY2hlY2tlZENhc3QoVGltZVVuaXQuSE9VUlMudG9TZWNvbmRzKDEpKSkpLAogICAgIC8qKgogICAgICAqIFdoZW4gZG9pbmcgYSBob3N0IHJlcGxhY2VtZW50IGl0cyBwb3NzaWJsZSB0aGF0IHRoZSBnb3NzaXAgc3RhdGUgaXMgImVtcHR5IiBtZWFuaW5nIHRoYXQgdGhlIGVuZHBvaW50IGlzIGtub3duCiAgICAgICogYnV0IHRoZSBjdXJyZW50IHN0YXRlIGlzbid0IGtub3duLiAgSWYgdGhlIGhvc3QgcmVwbGFjZW1lbnQgaXMgbmVlZGVkIHRvIHJlcGFpciB0aGlzIHN0YXRlLCB0aGlzIHByb3BlcnR5IG11c3QKICAgICAgKiBiZSB0cnVlLgogICAgICAqLwogICAgIFJFUExBQ0VNRU5UX0FMTE9XX0VNUFRZKCJjYXNzYW5kcmEuYWxsb3dfZW1wdHlfcmVwbGFjZV9hZGRyZXNzIiwgInRydWUiKSwKLQorICAgIFJFUExBQ0VfQUREUkVTUygiY2Fzc2FuZHJhLnJlcGxhY2VfYWRkcmVzcyIpLAorICAgIFJFUExBQ0VfQUREUkVTU19GSVJTVF9CT09UKCJjYXNzYW5kcmEucmVwbGFjZV9hZGRyZXNzX2ZpcnN0X2Jvb3QiKSwKKyAgICBSRVBMQUNFX05PREUoImNhc3NhbmRyYS5yZXBsYWNlX25vZGUiKSwKKyAgICBSRVBMQUNFX1RPS0VOKCJjYXNzYW5kcmEucmVwbGFjZV90b2tlbiIpLAogICAgIC8qKgotICAgICAqIERpcmVjdG9yeSB3aGVyZSBDYXNzYW5kcmEgcHV0cyBpdHMgbG9ncywgZGVmYXVsdHMgdG8gIi4iIHdoaWNoIGlzIGN1cnJlbnQgZGlyZWN0b3J5LgorICAgICAqIFdoZXRoZXIgd2UgcmVzZXQgYW55IGZvdW5kIGRhdGEgZnJvbSBwcmV2aW91c2x5IHJ1biBib290c3RyYXBzLgogICAgICAqLwotICAgIExPR19ESVIoImNhc3NhbmRyYS5sb2dkaXIiLCAiLiIpLAotCi0gICAgLyoqCi0gICAgICogRGlyZWN0b3J5IHdoZXJlIENhc3NhbmRyYSBwZXJzaXN0cyBsb2dzIGZyb20gYXVkaXQgbG9nZ2luZy4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBub3Qgc2V0LCB0aGUgYXVkaXQgbG9nIGZyYW1ld29yawotICAgICAqIHdpbGwgc2V0IGl0IGF1dG9tYXRpY2FsbHkgdG8ge0BsaW5rIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyNMT0dfRElSfSArICIvYXVkaXQiLgotICAgICAqLwotICAgIExPR19ESVJfQVVESVQoImNhc3NhbmRyYS5sb2dkaXIuYXVkaXQiKSwKLQotICAgIENPTlNJU1RFTlRfRElSRUNUT1JZX0xJU1RJTkdTKCJjYXNzYW5kcmEuY29uc2lzdGVudF9kaXJlY3RvcnlfbGlzdGluZ3MiLCAiZmFsc2UiKSwKLSAgICBDTE9DS19HTE9CQUwoImNhc3NhbmRyYS5jbG9jayIsIG51bGwpLAotICAgIENMT0NLX01PTk9UT05JQ19BUFBST1goImNhc3NhbmRyYS5tb25vdG9uaWNfY2xvY2suYXBwcm94IiwgbnVsbCksCi0gICAgQ0xPQ0tfTU9OT1RPTklDX1BSRUNJU0UoImNhc3NhbmRyYS5tb25vdG9uaWNfY2xvY2sucHJlY2lzZSIsIG51bGwpLAotCi0gICAgLyoKLSAgICAgKiBXaGV0aGVyIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db25zaXN0ZW5jeUxldmVsI05PREVfTE9DQUx9IHNob3VsZCBiZSBhbGxvd2VkLgotICAgICAqLwotICAgIEVOQUJMRV9OT0RFTE9DQUxfUVVFUklFUygiY2Fzc2FuZHJhLmVuYWJsZV9ub2RlbG9jYWxfcXVlcmllcyIsICJmYWxzZSIpLAotCi0gICAgLy9jYXNzYW5kcmEgcHJvcGVydGllcyAod2l0aG91dCB0aGUgImNhc3NhbmRyYS4iIHByZWZpeCkKLQotICAgIC8qKgotICAgICAqIFRoZSBjYXNzYW5kcmEtZm9yZWdyb3VuZCBvcHRpb24gd2lsbCB0ZWxsIENhc3NhbmRyYURhZW1vbiB3aGV0aGVyCi0gICAgICogdG8gY2xvc2Ugc3Rkb3V0L3N0ZGVyciwgYnV0IGl0J3MgdXAgdG8gdXMgbm90IHRvIGJhY2tncm91bmQuCi0gICAgICogeWVzL251bGwKLSAgICAgKi8KLSAgICBDQVNTQU5EUkFfRk9SRUdST1VORCAoImNhc3NhbmRyYS1mb3JlZ3JvdW5kIiksCi0KLSAgICBERUZBVUxUX1BST1ZJREVfT1ZFUkxBUFBJTkdfVE9NQlNUT05FUyAoImRlZmF1bHQucHJvdmlkZS5vdmVybGFwcGluZy50b21ic3RvbmVzIiksCi0gICAgT1JHX0FQQUNIRV9DQVNTQU5EUkFfRElTQUJMRV9NQkVBTl9SRUdJU1RSQVRJT04gKCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXNhYmxlX21iZWFuX3JlZ2lzdHJhdGlvbiIpLAotCi0gICAgLyoqIFRoaXMgcHJvcGVydHkgaW5kaWNhdGVzIHdoZXRoZXIgZGlzYWJsZV9tYmVhbl9yZWdpc3RyYXRpb24gaXMgdHJ1ZSAqLwotICAgIElTX0RJU0FCTEVEX01CRUFOX1JFR0lTVFJBVElPTigib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzYWJsZV9tYmVhbl9yZWdpc3RyYXRpb24iKSwKLQotICAgIC8qKiBzbmFwc2hvdHMgdHRsIGNsZWFudXAgcGVyaW9kIGluIHNlY29uZHMgKi8KLSAgICBTTkFQU0hPVF9DTEVBTlVQX1BFUklPRF9TRUNPTkRTKCJjYXNzYW5kcmEuc25hcHNob3QudHRsX2NsZWFudXBfcGVyaW9kX3NlY29uZHMiLCAiNjAiKSwKLQotICAgIC8qKiBzbmFwc2hvdHMgdHRsIGNsZWFudXAgaW5pdGlhbCBkZWxheSBpbiBzZWNvbmRzICovCi0gICAgU05BUFNIT1RfQ0xFQU5VUF9JTklUSUFMX0RFTEFZX1NFQ09ORFMoImNhc3NhbmRyYS5zbmFwc2hvdC50dGxfY2xlYW51cF9pbml0aWFsX2RlbGF5X3NlY29uZHMiLCAiNSIpLAotCi0gICAgLyoqIG1pbmltdW0gYWxsb3dlZCBUVEwgZm9yIHNuYXBzaG90cyAqLwotICAgIFNOQVBTSE9UX01JTl9BTExPV0VEX1RUTF9TRUNPTkRTKCJjYXNzYW5kcmEuc25hcHNob3QubWluX2FsbG93ZWRfdHRsX3NlY29uZHMiLCAiNjAiKSwKLQotICAgIC8qKiB3aGF0IGNsYXNzIHRvIHVzZSBmb3IgbWJlYW4gcmVnaXN0ZXJhdGlvbiAqLwotICAgIE1CRUFOX1JFR0lTVFJBVElPTl9DTEFTUygib3JnLmFwYWNoZS5jYXNzYW5kcmEubWJlYW5fcmVnaXN0cmF0aW9uX2NsYXNzIiksCi0KLSAgICBCQVRDSF9DT01NSVRfTE9HX1NZTkNfSU5URVJWQUwoImNhc3NhbmRyYS5iYXRjaF9jb21taXRsb2dfc3luY19pbnRlcnZhbF9taWxsaXMiLCAiMTAwMCIpLAotCi0gICAgU1lTVEVNX0FVVEhfREVGQVVMVF9SRigiY2Fzc2FuZHJhLnN5c3RlbV9hdXRoLmRlZmF1bHRfcmYiLCAiMSIpLAotICAgIFNZU1RFTV9UUkFDRVNfREVGQVVMVF9SRigiY2Fzc2FuZHJhLnN5c3RlbV90cmFjZXMuZGVmYXVsdF9yZiIsICIyIiksCi0gICAgU1lTVEVNX0RJU1RSSUJVVEVEX0RFRkFVTFRfUkYoImNhc3NhbmRyYS5zeXN0ZW1fZGlzdHJpYnV0ZWQuZGVmYXVsdF9yZiIsICIzIiksCi0KLSAgICBNRU1UQUJMRV9PVkVSSEVBRF9TSVpFKCJjYXNzYW5kcmEubWVtdGFibGUucm93X292ZXJoZWFkX3NpemUiLCAiLTEiKSwKLSAgICBNRU1UQUJMRV9PVkVSSEVBRF9DT01QVVRFX1NURVBTKCJjYXNzYW5kcmEubWVtdGFibGVfcm93X292ZXJoZWFkX2NvbXB1dGF0aW9uX3N0ZXAiLCAiMTAwMDAwIiksCi0gICAgTUlHUkFUSU9OX0RFTEFZKCJjYXNzYW5kcmEubWlncmF0aW9uX2RlbGF5X21zIiwgIjYwMDAwIiksCisgICAgUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTKCJjYXNzYW5kcmEucmVzZXRfYm9vdHN0cmFwX3Byb2dyZXNzIiksCisgICAgUklOR19ERUxBWSgiY2Fzc2FuZHJhLnJpbmdfZGVsYXlfbXMiKSwKICAgICAvKiogRGVmaW5lcyBob3cgb2Z0ZW4gc2NoZW1hIGRlZmluaXRpb25zIGFyZSBwdWxsZWQgZnJvbSB0aGUgb3RoZXIgbm9kZXMgKi8KICAgICBTQ0hFTUFfUFVMTF9JTlRFUlZBTF9NUygiY2Fzc2FuZHJhLnNjaGVtYV9wdWxsX2ludGVydmFsX21zIiwgIjYwMDAwIiksCi0KLSAgICBQQVhPU19SRVBBSVJfUkVUUllfVElNRU9VVF9JTl9NUygiY2Fzc2FuZHJhLnBheG9zX3JlcGFpcl9yZXRyeV90aW1lb3V0X21pbGxpcyIsICI2MDAwMCIpLAotCi0gICAgLyoqIElmIHdlIHNob3VsZCBhbGxvdyBoYXZpbmcgZHVwbGljYXRlIGtleXMgaW4gdGhlIGNvbmZpZyBmaWxlLCBkZWZhdWx0IHRvIHRydWUgZm9yIGxlZ2FjeSByZWFzb25zICovCi0gICAgQUxMT1dfRFVQTElDQVRFX0NPTkZJR19LRVlTKCJjYXNzYW5kcmEuYWxsb3dfZHVwbGljYXRlX2NvbmZpZ19rZXlzIiwgInRydWUiKSwKLSAgICAvKiogSWYgd2Ugc2hvdWxkIGFsbG93IGhhdmluZyBib3RoIG5ldyAocG9zdCBDQVNTQU5EUkEtMTUyMzQpIGFuZCBvbGQgY29uZmlnIGtleXMgZm9yIHRoZSBzYW1lIGNvbmZpZyBpdGVtIGluIHRoZSB5YW1sICovCi0gICAgQUxMT1dfTkVXX09MRF9DT05GSUdfS0VZUygiY2Fzc2FuZHJhLmFsbG93X25ld19vbGRfY29uZmlnX2tleXMiLCAiZmFsc2UiKSwKLQotICAgIC8vIHN0YXJ0dXAgY2hlY2tzIHByb3BlcnRpZXMKLSAgICBMSUJKRU1BTExPQygiY2Fzc2FuZHJhLmxpYmplbWFsbG9jIiksCi0gICAgQERlcHJlY2F0ZWQgLy8gc2hvdWxkIGJlIHJlbW92ZWQgaW4gZmF2b3Igb2YgZW5hYmxlIGZsYWcgb2YgcmVsZXZhbnQgc3RhcnR1cCBjaGVjayAoY2hlY2tEYXRhY2VudGVyKQotICAgIElHTk9SRV9EQygiY2Fzc2FuZHJhLmlnbm9yZV9kYyIpLAotICAgIEBEZXByZWNhdGVkIC8vIHNob3VsZCBiZSByZW1vdmVkIGluIGZhdm9yIG9mIGVuYWJsZSBmbGFnIG9mIHJlbGV2YW50IHN0YXJ0dXAgY2hlY2sgKGNoZWNrUmFjaykKLSAgICBJR05PUkVfUkFDSygiY2Fzc2FuZHJhLmlnbm9yZV9yYWNrIiksCi0gICAgQERlcHJlY2F0ZWQgLy8gc2hvdWxkIGJlIHJlbW92ZWQgaW4gZmF2b3Igb2YgZW5hYmxlIGZsYWcgb2YgcmVsZXZhbnQgc3RhcnR1cCBjaGVjayAoRmlsZVN5c3RlbU93bmVyc2hpcENoZWNrKQotICAgIEZJTEVfU1lTVEVNX0NIRUNLX0VOQUJMRSgiY2Fzc2FuZHJhLmVuYWJsZV9mc19vd25lcnNoaXBfY2hlY2siKSwKLSAgICBARGVwcmVjYXRlZCAvLyBzaG91bGQgYmUgcmVtb3ZlZCBpbiBmYXZvciBvZiBmbGFncyBpbiByZWxldmFudCBzdGFydHVwIGNoZWNrIChGaWxlU3lzdGVtT3duZXJzaGlwQ2hlY2spCi0gICAgRklMRV9TWVNURU1fQ0hFQ0tfT1dORVJTSElQX0ZJTEVOQU1FKCJjYXNzYW5kcmEuZnNfb3duZXJzaGlwX2ZpbGVuYW1lIiwgRmlsZVN5c3RlbU93bmVyc2hpcENoZWNrLkRFRkFVTFRfRlNfT1dORVJTSElQX0ZJTEVOQU1FKSwKLSAgICBARGVwcmVjYXRlZCAvLyBzaG91bGQgYmUgcmVtb3ZlZCBpbiBmYXZvciBvZiBmbGFncyBpbiByZWxldmFudCBzdGFydHVwIGNoZWNrIChGaWxlU3lzdGVtT3duZXJzaGlwQ2hlY2spCi0gICAgRklMRV9TWVNURU1fQ0hFQ0tfT1dORVJTSElQX1RPS0VOKEZpbGVTeXN0ZW1Pd25lcnNoaXBDaGVjay5GSUxFX1NZU1RFTV9DSEVDS19PV05FUlNISVBfVE9LRU4pLAotICAgIC8vIGRlZmF1bHQgaGVhcnRiZWF0aW5nIHBlcmlvZCBpcyAxIG1pbnV0ZQotICAgIENIRUNLX0RBVEFfUkVTVVJSRUNUSU9OX0hFQVJUQkVBVF9QRVJJT0QoImNoZWNrX2RhdGFfcmVzdXJyZWN0aW9uX2hlYXJ0YmVhdF9wZXJpb2RfbWlsbGkiLCAiNjAwMDAiKSwKLQotICAgIC8vIGRlZmF1bHRzIHRvIGZhbHNlIGZvciA0LjEgYnV0IHBsYW4gdG8gc3dpdGNoIHRvIHRydWUgaW4gYSBsYXRlciByZWxlYXNlCi0gICAgLy8gdGhlIHRoaW5raW5nIGlzIHRoYXQgZW52aXJvbm1lbnRzIG1heSBub3Qgd29yayByaWdodCBvZmYgdGhlIGJhdCBzbyBzYWZlciB0byBhZGQgdGhpcyBmZWF0dXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQKLSAgICBDT05GSUdfQUxMT1dfU1lTVEVNX1BST1BFUlRJRVMoImNhc3NhbmRyYS5jb25maWcuYWxsb3dfc3lzdGVtX3Byb3BlcnRpZXMiLCAiZmFsc2UiKSwKLQotICAgIC8vIHByb3BlcnRpZXMgZm9yIGRlYnVnZ2luZyBzaW11bGF0b3IgQVNNIG91dHB1dAotICAgIFRFU1RfU0lNVUxBVE9SX1BSSU5UX0FTTSgiY2Fzc2FuZHJhLnRlc3Quc2ltdWxhdG9yLnByaW50X2FzbSIsICJub25lIiksCi0gICAgVEVTVF9TSU1VTEFUT1JfUFJJTlRfQVNNX1RZUEVTKCJjYXNzYW5kcmEudGVzdC5zaW11bGF0b3IucHJpbnRfYXNtX3R5cGVzIiwgIiIpLAotICAgIFRFU1RfU0lNVUxBVE9SX0xJVkVORVNTX0NIRUNLKCJjYXNzYW5kcmEudGVzdC5zaW11bGF0b3IubGl2ZW5lc3NjaGVjayIsICJ0cnVlIiksCi0gICAgVEVTVF9TSU1VTEFUT1JfREVCVUcoImNhc3NhbmRyYS50ZXN0LnNpbXVsYXRvci5kZWJ1ZyIsICJmYWxzZSIpLAotICAgIFRFU1RfU0lNVUxBVE9SX0RFVEVSTUlOSVNNX0NIRUNLKCJjYXNzYW5kcmEudGVzdC5zaW11bGF0b3IuZGV0ZXJtaW5pc21jaGVjayIsICJub25lIiksCi0gICAgVEVTVF9KVk1fRFRFU1RfRElTQUJMRV9TU0woImNhc3NhbmRyYS50ZXN0LmRpc2FibGVfc3NsIiwgImZhbHNlIiksCi0KLSAgICAvLyBkZXRlcm1pbmlzbSBwcm9wZXJ0aWVzIGZvciB0ZXN0aW5nCi0gICAgREVURVJNSU5JU01fU1NUQUJMRV9DT01QUkVTU0lPTl9ERUZBVUxUKCJjYXNzYW5kcmEuc3N0YWJsZV9jb21wcmVzc2lvbl9kZWZhdWx0IiwgInRydWUiKSwKLSAgICBERVRFUk1JTklTTV9DT05TSVNURU5UX0RJUkVDVE9SWV9MSVNUSU5HUygiY2Fzc2FuZHJhLmNvbnNpc3RlbnRfZGlyZWN0b3J5X2xpc3RpbmdzIiwgImZhbHNlIiksCi0gICAgREVURVJNSU5JU01fVU5TQUZFX1VVSURfTk9ERSgiY2Fzc2FuZHJhLnVuc2FmZS5kZXRlcm1pbmlzdGljdXVpZG5vZGUiLCAiZmFsc2UiKSwKLSAgICBGQUlMVVJFX0xPR0dJTkdfSU5URVJWQUxfU0VDT05EUygiY2Fzc2FuZHJhLnJlcXVlc3RfZmFpbHVyZV9sb2dfaW50ZXJ2YWxfc2Vjb25kcyIsICI2MCIpLAotCi0gICAgLy8gcHJvcGVydGllcyB0byBkaXNhYmxlIGNlcnRhaW4gYmVoYXZpb3VycyBmb3IgdGVzdGluZwotICAgIERJU0FCTEVfR09TU0lQX0VORFBPSU5UX1JFTU9WQUwoImNhc3NhbmRyYS5nb3NzaXAuZGlzYWJsZV9lbmRwb2ludF9yZW1vdmFsIiksCi0gICAgSUdOT1JFX01JU1NJTkdfTkFUSVZFX0ZJTEVfSElOVFMoImNhc3NhbmRyYS5yZXF1aXJlX25hdGl2ZV9maWxlX2hpbnRzIiwgImZhbHNlIiksCi0gICAgRElTQUJMRV9TU1RBQkxFX0FDVElWSVRZX1RSQUNLSU5HKCJjYXNzYW5kcmEuc3N0YWJsZV9hY3Rpdml0eV90cmFja2luZyIsICJ0cnVlIiksCi0gICAgVEVTVF9JR05PUkVfU0lHQVIoImNhc3NhbmRyYS50ZXN0Lmlnbm9yZV9zaWdhciIsICJmYWxzZSIpLAotICAgIFBBWE9TX0VYRUNVVEVfT05fU0VMRigiY2Fzc2FuZHJhLnBheG9zLnVzZV9zZWxmX2V4ZWN1dGlvbiIsICJ0cnVlIiksCi0KLSAgICAvKiogcHJvcGVydHkgZm9yIHRoZSByYXRlIG9mIHRoZSBzY2hlZHVsZWQgdGFzayB0aGF0IG1vbml0b3JzIGRpc2sgdXNhZ2UgKi8KLSAgICBESVNLX1VTQUdFX01PTklUT1JfSU5URVJWQUxfTVMoImNhc3NhbmRyYS5kaXNrX3VzYWdlLm1vbml0b3JfaW50ZXJ2YWxfbXMiLCBMb25nLnRvU3RyaW5nKFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMzApKSksCi0KLSAgICAvKiogcHJvcGVydHkgZm9yIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0aGUgcmVwZWF0ZWQgY2xpZW50IHdhcm5pbmdzIGFuZCBkaWFnbm9zdGljIGV2ZW50cyBhYm91dCBkaXNrIHVzYWdlIGFyZSBpZ25vcmVkICovCi0gICAgRElTS19VU0FHRV9OT1RJRllfSU5URVJWQUxfTVMoImNhc3NhbmRyYS5kaXNrX3VzYWdlLm5vdGlmeV9pbnRlcnZhbF9tcyIsIExvbmcudG9TdHJpbmcoVGltZVVuaXQuTUlOVVRFUy50b01pbGxpcygzMCkpKSwKLQotICAgIC8vIGZvciBzcGVjaWZpYyB0ZXN0cwotICAgIE9SR19BUEFDSEVfQ0FTU0FORFJBX0NPTkZfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVNfVEVTVCgib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZi5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXNUZXN0IiksCi0gICAgT1JHX0FQQUNIRV9DQVNTQU5EUkFfREJfVklSVFVBTF9TWVNURU1fUFJPUEVSVElFU19UQUJMRV9URVNUKCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLlN5c3RlbVByb3BlcnRpZXNUYWJsZVRlc3QiKSwKLQotICAgIC8qKiBVc2VkIHdoZW4gcnVubmluZyBpbiBDbGllbnQgbW9kZSBhbmQgdGhlIHN5c3RlbSBhbmQgc2NoZW1hIGtleXNwYWNlcyBuZWVkIHRvIGJlIGluaXRpYWxpemVkIG91dHNpZGUgb2YgdGhlaXIgbm9ybWFsIGluaXRpYWxpemF0aW9uIHBhdGggKiovCi0gICAgRk9SQ0VfTE9BRF9MT0NBTF9LRVlTUEFDRVMoImNhc3NhbmRyYS5zY2hlbWEuZm9yY2VfbG9hZF9sb2NhbF9rZXlzcGFjZXMiKSwKLQotICAgIC8qKiBXaGVuIGVuYWJsZWQsIHJlY3Vyc2l2ZSBkaXJlY3RvcnkgZGVsZXRpb24gd2lsbCBiZSBleGVjdXRlZCB1c2luZyBhIHVuaXggY29tbWFuZCBgcm0gLXJmYCBpbnN0ZWFkIG9mIHRyYXZlcnNpbmcKLSAgICAgKiBhbmQgcmVtb3ZpbmcgaW5kaXZpZHVhbCBmaWxlcy4gVGhpcyBpcyBub3cgdXNlZCBvbmx5IHRlc3RzLCBidXQgZXZlbnR1YWxseSB3ZSB3aWxsIG1ha2UgaXQgdHJ1ZSBieSBkZWZhdWx0LiovCi0gICAgVVNFX05JWF9SRUNVUlNJVkVfREVMRVRFKCJjYXNzYW5kcmEudXNlX25peF9yZWN1cnNpdmVfZGVsZXRlIiksCi0KLSAgICAvKiogSWYgc2V0LCB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2V9IGlzIHNodXRkb3duIGFicnR1cHRseSB3aXRob3V0IHdhaXRpbmcgZm9yIGFueXRoaW5nLgotICAgICAqIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHVzZWQgaW4gdW5pdCB0ZXN0cyBiZWN1YXNlIHdlIG5ldmVyIHJlc3RhcnQgYSBub2RlIHRoZXJlLiBUaGUgb25seSBub2RlIGlzIHN0b3BvcGVkCi0gICAgICogd2hlbiB0aGUgSlZNIHRlcm1pbmF0ZXMuIFRoZXJlZm9yZSwgd2UgY2FuIHVzZSBzdWNoIG9wdGltaXphdGlvbiBhbmQgbm90IHdhaXQgdW5uZWNlc3NhcmlseS4gKi8KLSAgICBOT05fR1JBQ0VGVUxfU0hVVERPV04oImNhc3NhbmRyYS50ZXN0Lm1lc3NhZ2luZ1NlcnZpY2Uubm9uR3JhY2VmdWxTaHV0ZG93biIpLAotCisgICAgU0NIRU1BX1VQREFURV9IQU5ETEVSX0ZBQ1RPUllfQ0xBU1MoImNhc3NhbmRyYS5zY2hlbWEudXBkYXRlX2hhbmRsZXJfZmFjdG9yeS5jbGFzcyIpLAorICAgIFNFQVJDSF9DT05DVVJSRU5DWV9GQUNUT1IoImNhc3NhbmRyYS5zZWFyY2hfY29uY3VycmVuY3lfZmFjdG9yIiwgIjEiKSwKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2VlZHMgcmV0dXJuZWQgYnkgYSBzZWVkIHByb3ZpZGVyIGJlZm9yZSBlbW1pdHRpbmcgYSB3YXJuaW5nLgorICAgICAqIEEgbGFyZ2Ugc2VlZCBsaXN0IG1heSBpbXBhY3QgZWZmZWN0aXZlbmVzcyBvZiB0aGUgdGhpcmQgZ29zc2lwIHJvdW5kLgorICAgICAqIFRoZSBkZWZhdWx0IHVzZWQgaW4gU2ltcGxlU2VlZFByb3ZpZGVyIGlzIDIwLgorICAgICAqLworICAgIFNFRURfQ09VTlRfV0FSTl9USFJFU0hPTEQoImNhc3NhbmRyYS5zZWVkX2NvdW50X3dhcm5fdGhyZXNob2xkIiksCisgICAgU0VSSUFMSVpBVElPTl9FTVBUWV9UWVBFX05PTkVNUFRZX0JFSEFWSU9SKCJjYXNzYW5kcmEuc2VyaWFsaXphdGlvbi5lbXB0eXR5cGUubm9uZW1wdHlfYmVoYXZpb3IiKSwKKyAgICBTRVRfU0VQX1RIUkVBRF9OQU1FKCJjYXNzYW5kcmEuc2V0X3NlcF90aHJlYWRfbmFtZSIsICJ0cnVlIiksCisgICAgU0hVVERPV05fQU5OT1VOQ0VfREVMQVlfSU5fTVMoImNhc3NhbmRyYS5zaHV0ZG93bl9hbm5vdW5jZV9pbl9tcyIsICIyMDAwIiksCisgICAgU0laRV9SRUNPUkRFUl9JTlRFUlZBTCgiY2Fzc2FuZHJhLnNpemVfcmVjb3JkZXJfaW50ZXJ2YWwiLCAiMzAwIiksCisgICAgU0tJUF9QQVhPU19SRVBBSVJfT05fVE9QT0xPR1lfQ0hBTkdFKCJjYXNzYW5kcmEuc2tpcF9wYXhvc19yZXBhaXJfb25fdG9wb2xvZ3lfY2hhbmdlIiksCisgICAgLyoqIElmIG5lY2Vzc2FyeSBmb3Igb3BlcmF0aW9uYWwgcHVycG9zZXMsIHBlcm1pdCBjZXJ0YWluIGtleXNwYWNlcyB0byBiZSBpZ25vcmVkIGZvciBwYXhvcyB0b3BvbG9neSByZXBhaXJzLiAqLworICAgIFNLSVBfUEFYT1NfUkVQQUlSX09OX1RPUE9MT0dZX0NIQU5HRV9LRVlTUEFDRVMoImNhc3NhbmRyYS5za2lwX3BheG9zX3JlcGFpcl9vbl90b3BvbG9neV9jaGFuZ2Vfa2V5c3BhY2VzIiksCisgICAgU0tJUF9QQVhPU19SRVBBSVJfVkVSU0lPTl9WQUxJREFUSU9OKCJjYXNzYW5kcmEuc2tpcF9wYXhvc19yZXBhaXJfdmVyc2lvbl92YWxpZGF0aW9uIiksCisgICAgU0tJUF9QQVhPU19TVEFURV9SRUJVSUxEKCJjYXNzYW5kcmEuc2tpcF9wYXhvc19zdGF0ZV9yZWJ1aWxkIiksCisgICAgLyoqIHNuYXBzaG90cyB0dGwgY2xlYW51cCBpbml0aWFsIGRlbGF5IGluIHNlY29uZHMgKi8KKyAgICBTTkFQU0hPVF9DTEVBTlVQX0lOSVRJQUxfREVMQVlfU0VDT05EUygiY2Fzc2FuZHJhLnNuYXBzaG90LnR0bF9jbGVhbnVwX2luaXRpYWxfZGVsYXlfc2Vjb25kcyIsICI1IiksCisgICAgLyoqIHNuYXBzaG90cyB0dGwgY2xlYW51cCBwZXJpb2QgaW4gc2Vjb25kcyAqLworICAgIFNOQVBTSE9UX0NMRUFOVVBfUEVSSU9EX1NFQ09ORFMoImNhc3NhbmRyYS5zbmFwc2hvdC50dGxfY2xlYW51cF9wZXJpb2Rfc2Vjb25kcyIsICI2MCIpLAorICAgIC8qKiBtaW5pbXVtIGFsbG93ZWQgVFRMIGZvciBzbmFwc2hvdHMgKi8KKyAgICBTTkFQU0hPVF9NSU5fQUxMT1dFRF9UVExfU0VDT05EUygiY2Fzc2FuZHJhLnNuYXBzaG90Lm1pbl9hbGxvd2VkX3R0bF9zZWNvbmRzIiwgIjYwIiksCisgICAgU1NMX0VOQUJMRSgic3NsLmVuYWJsZSIpLAorICAgIFNTTF9TVE9SQUdFX1BPUlQoImNhc3NhbmRyYS5zc2xfc3RvcmFnZV9wb3J0IiksCisgICAgU1NUQUJMRV9GT1JNQVRfREVGQVVMVCgiY2Fzc2FuZHJhLnNzdGFibGUuZm9ybWF0LmRlZmF1bHQiKSwKKyAgICBTVEFSVF9HT1NTSVAoImNhc3NhbmRyYS5zdGFydF9nb3NzaXAiLCAidHJ1ZSIpLAorICAgIFNUQVJUX05BVElWRV9UUkFOU1BPUlQoImNhc3NhbmRyYS5zdGFydF9uYXRpdmVfdHJhbnNwb3J0IiksCisgICAgU1RPUkFHRV9ESVIoImNhc3NhbmRyYS5zdG9yYWdlZGlyIiksCisgICAgU1RPUkFHRV9IT09LKCJjYXNzYW5kcmEuc3RvcmFnZV9ob29rIiksCisgICAgU1RPUkFHRV9QT1JUKCJjYXNzYW5kcmEuc3RvcmFnZV9wb3J0IiksCisgICAgU1RSRUFNSU5HX0hJU1RPR1JBTV9ST1VORF9TRUNPTkRTKCJjYXNzYW5kcmEuc3RyZWFtaW5naGlzdG9ncmFtLnJvdW5kc2Vjb25kcyIsICI2MCIpLAorICAgIFNUUkVBTUlOR19TRVNTSU9OX1BBUkFMTEVMVFJBTlNGRVJTKCJjYXNzYW5kcmEuc3RyZWFtaW5nLnNlc3Npb24ucGFyYWxsZWxUcmFuc2ZlcnMiKSwKKyAgICBTVFJFQU1fSE9PSygiY2Fzc2FuZHJhLnN0cmVhbV9ob29rIiksCisgICAgLyoqIFBsYXRmb3JtIHdvcmQgc2l6ZSBzdW4uYXJjaC5kYXRhLm1vZGVsLiBFeGFtcGxlczogIjMyIiwgIjY0IiwgInVua25vd24iKi8KKyAgICBTVU5fQVJDSF9EQVRBX01PREVMKCJzdW4uYXJjaC5kYXRhLm1vZGVsIiksCisgICAgU1VOX0pBVkFfQ09NTUFORCgic3VuLmphdmEuY29tbWFuZCIsICIiKSwKKyAgICBTVU5fU1RERVJSX0VOQ09ESU5HKCJzdW4uc3RkZXJyLmVuY29kaW5nIiksCisgICAgU1VOX1NURE9VVF9FTkNPRElORygic3VuLnN0ZG91dC5lbmNvZGluZyIpLAorICAgIFNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUygiY2Fzc2FuZHJhLnN1cGVydXNlcl9zZXR1cF9kZWxheV9tcyIsICIxMDAwMCIpLAorICAgIFNZU1RFTV9BVVRIX0RFRkFVTFRfUkYoImNhc3NhbmRyYS5zeXN0ZW1fYXV0aC5kZWZhdWx0X3JmIiwgIjEiKSwKKyAgICBTWVNURU1fRElTVFJJQlVURURfREVGQVVMVF9SRigiY2Fzc2FuZHJhLnN5c3RlbV9kaXN0cmlidXRlZC5kZWZhdWx0X3JmIiwgIjMiKSwKKyAgICBTWVNURU1fVFJBQ0VTX0RFRkFVTFRfUkYoImNhc3NhbmRyYS5zeXN0ZW1fdHJhY2VzLmRlZmF1bHRfcmYiLCAiMiIpLAorICAgIFRFU1RfQkJGQUlMSEVMUEVSX0VOQUJMRUQoInRlc3QuYmJmYWlsaGVscGVyLmVuYWJsZWQiKSwKKyAgICBURVNUX0JMT0JfU0hBUkVEX1NFRUQoImNhc3NhbmRyYS50ZXN0LmJsb2Iuc2hhcmVkLnNlZWQiKSwKKyAgICBURVNUX0JZVEVNQU5fVFJBTlNGT1JNQVRJT05TX0RFQlVHKCJjYXNzYW5kcmEudGVzdC5ieXRlbWFuLnRyYW5zZm9ybWF0aW9ucy5kZWJ1ZyIpLAorICAgIFRFU1RfQ0FTU0FORFJBX0tFRVBCUklFRkJSSUVGKCJjYXNzYW5kcmEua2VlcEJyaWVmQnJpZWYiKSwKKyAgICBURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTKCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25mLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllc1Rlc3QiKSwKKyAgICAvKiogQSBwcm9wZXJ0eSBmb3IgdmFyaW91cyBtZWNoYW5pc21zIGZvciBzeW5jaW5nIGZpbGVzIHRoYXQgbWFrZXMgaXQgcG9zc2libGUgaXQgaW50ZXJjZXB0IGFuZCBza2lwIHN5bmNpbmcuICovCisgICAgVEVTVF9DQVNTQU5EUkFfU0tJUF9TWU5DKCJjYXNzYW5kcmEuc2tpcF9zeW5jIiksCisgICAgVEVTVF9DQVNTQU5EUkFfU1VJVEVOQU1FKCJzdWl0ZW5hbWUiLCAic3VpdGVuYW1lX0lTX1VOREVGSU5FRCIpLAorICAgIFRFU1RfQ0FTU0FORFJBX1RFU1RUQUcoImNhc3NhbmRyYS50ZXN0dGFnIiwgImNhc3NhbmRyYS50ZXN0dGFnX0lTX1VOREVGSU5FRCIpLAorICAgIFRFU1RfQ09NUFJFU1NJT04oImNhc3NhbmRyYS50ZXN0LmNvbXByZXNzaW9uIiksCisgICAgVEVTVF9DT01QUkVTU0lPTl9BTEdPKCJjYXNzYW5kcmEudGVzdC5jb21wcmVzc2lvbi5hbGdvIiwgImx6NCIpLAorICAgIFRFU1RfREVCVUdfUkVGX0NPVU5UKCJjYXNzYW5kcmEuZGVidWdyZWZjb3VudCIpLAorICAgIFRFU1RfRFJJVkVSX0NPTk5FQ1RJT05fVElNRU9VVF9NUygiY2Fzc2FuZHJhLnRlc3QuZHJpdmVyLmNvbm5lY3Rpb25fdGltZW91dF9tcyIsICI1MDAwIiksCisgICAgVEVTVF9EUklWRVJfUkVBRF9USU1FT1VUX01TKCJjYXNzYW5kcmEudGVzdC5kcml2ZXIucmVhZF90aW1lb3V0X21zIiwgIjEyMDAwIiksCisgICAgVEVTVF9GQUlMX01WX0xPQ0tTX0NPVU5UKCJjYXNzYW5kcmEudGVzdC5mYWlsX212X2xvY2tzX2NvdW50IiwgIjAiKSwKKyAgICBURVNUX0ZBSUxfV1JJVEVTX0tTKCJjYXNzYW5kcmEudGVzdC5mYWlsX3dyaXRlc19rcyIsICIiKSwKICAgICAvKiogRmx1c2ggY2hhbmdlcyBvZiB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUtleXNwYWNlfSBhZnRlciBlYWNoIHNjaGVtYSBtb2RpZmljYXRpb24uIEluIHByb2R1Y3Rpb24sCiAgICAgICogd2UgYWx3YXlzIGRvIHRoYXQuIEhvd2V2ZXIsIHRlc3RzIHdoaWNoIGRvIG5vdCByZXN0YXJ0IG5vZGVzIG1heSBkaXNhYmxlIHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBvcmRlciB0byBydW4KICAgICAgKiBmYXN0ZXIuIE5vdGUgdGhhdCB0aGlzIGlzIGRpc2FibGVkIGZvciB1bml0IHRlc3RzIGJ1dCBpZiBhbiBpbmRpdmlkdWFsIHRlc3QgcmVxdWlyZXMgc2NoZW1hIHRvIGJlIGZsdXNoZWQsIGl0CiAgICAgICogY2FuIGJlIGFsc28gZG9uZSBtYW51YWxseSBmb3IgdGhhdCBwYXJ0aWN1bGFyIGNhc2U6IHtAY29kZSBmbHVzaChTY2hlbWFDb25zdGFudHMuU0NIRU1BX0tFWVNQQUNFX05BTUUpO30uICovCi0gICAgRkxVU0hfTE9DQUxfU0NIRU1BX0NIQU5HRVMoImNhc3NhbmRyYS50ZXN0LmZsdXNoX2xvY2FsX3NjaGVtYV9jaGFuZ2VzIiwgInRydWUiKSwKKyAgICBURVNUX0ZMVVNIX0xPQ0FMX1NDSEVNQV9DSEFOR0VTKCJjYXNzYW5kcmEudGVzdC5mbHVzaF9sb2NhbF9zY2hlbWFfY2hhbmdlcyIsICJ0cnVlIiksCisgICAgVEVTVF9JR05PUkVfU0lHQVIoImNhc3NhbmRyYS50ZXN0Lmlnbm9yZV9zaWdhciIpLAorICAgIFRFU1RfSU5WQUxJRF9MRUdBQ1lfU1NUQUJMRV9ST09UKCJpbnZhbGlkLWxlZ2FjeS1zc3RhYmxlLXJvb3QiKSwKKyAgICBURVNUX0pWTV9EVEVTVF9ESVNBQkxFX1NTTCgiY2Fzc2FuZHJhLnRlc3QuZGlzYWJsZV9zc2wiKSwKKyAgICBURVNUX0xFR0FDWV9TU1RBQkxFX1JPT1QoImxlZ2FjeS1zc3RhYmxlLXJvb3QiKSwKKyAgICBURVNUX09SR19DQUZGSU5JVEFTX09IQ19TRUdNRU5UQ09VTlQoIm9yZy5jYWZmaW5pdGFzLm9oYy5zZWdtZW50Q291bnQiKSwKKyAgICBURVNUX1JFQURfSVRFUkFUSU9OX0RFTEFZX01TKCJjYXNzYW5kcmEudGVzdC5yZWFkX2l0ZXJhdGlvbl9kZWxheV9tcyIsICIwIiksCisgICAgVEVTVF9SRVVTRV9QUkVQQVJFRCgiY2Fzc2FuZHJhLnRlc3QucmV1c2VfcHJlcGFyZWQiLCAidHJ1ZSIpLAorICAgIFRFU1RfUk9XX0NBQ0hFX1NJWkUoImNhc3NhbmRyYS50ZXN0LnJvd19jYWNoZV9zaXplIiksCisgICAgVEVTVF9TRVJJQUxJWkFUSU9OX1dSSVRFUygiY2Fzc2FuZHJhLnRlc3Qtc2VyaWFsaXphdGlvbi13cml0ZXMiKSwKKyAgICBURVNUX1NJTVVMQVRPUl9ERUJVRygiY2Fzc2FuZHJhLnRlc3Quc2ltdWxhdG9yLmRlYnVnIiksCisgICAgVEVTVF9TSU1VTEFUT1JfREVURVJNSU5JU01fQ0hFQ0soImNhc3NhbmRyYS50ZXN0LnNpbXVsYXRvci5kZXRlcm1pbmlzbWNoZWNrIiwgIm5vbmUiKSwKKyAgICBURVNUX1NJTVVMQVRPUl9MSVZFTkVTU19DSEVDSygiY2Fzc2FuZHJhLnRlc3Quc2ltdWxhdG9yLmxpdmVuZXNzY2hlY2siLCAidHJ1ZSIpLAorICAgIC8qKiBwcm9wZXJ0aWVzIGZvciBkZWJ1Z2dpbmcgc2ltdWxhdG9yIEFTTSBvdXRwdXQgKi8KKyAgICBURVNUX1NJTVVMQVRPUl9QUklOVF9BU00oImNhc3NhbmRyYS50ZXN0LnNpbXVsYXRvci5wcmludF9hc20iLCAibm9uZSIpLAorICAgIFRFU1RfU0lNVUxBVE9SX1BSSU5UX0FTTV9DTEFTU0VTKCJjYXNzYW5kcmEudGVzdC5zaW11bGF0b3IucHJpbnRfYXNtX2NsYXNzZXMiLCAiIiksCisgICAgVEVTVF9TSU1VTEFUT1JfUFJJTlRfQVNNX09QVFMoImNhc3NhbmRyYS50ZXN0LnNpbXVsYXRvci5wcmludF9hc21fb3B0cyIsICIiKSwKKyAgICBURVNUX1NJTVVMQVRPUl9QUklOVF9BU01fVFlQRVMoImNhc3NhbmRyYS50ZXN0LnNpbXVsYXRvci5wcmludF9hc21fdHlwZXMiLCAiIiksCisgICAgVEVTVF9TU1RBQkxFX0ZPUk1BVF9ERVZFTE9QTUVOVCgiY2Fzc2FuZHJhLnRlc3Quc3N0YWJsZWZvcm1hdGRldmVsb3BtZW50IiksCisgICAgVEVTVF9TVFJJQ1RfTENTX0NIRUNLUygiY2Fzc2FuZHJhLnRlc3Quc3RyaWN0X2xjc19jaGVja3MiKSwKKyAgICAvKiogVHVybnMgc29tZSB3YXJuaW5ncyBpbnRvIGV4Y2VwdGlvbnMgZm9yIHRlc3RpbmcuICovCisgICAgVEVTVF9TVFJJQ1RfUlVOVElNRV9DSEVDS1MoImNhc3NhbmRyYS5zdHJpY3QucnVudGltZS5jaGVja3MiKSwKKyAgICAvKiogTm90IHRvIGJlIHVzZWQgaW4gcHJvZHVjdGlvbiwgdGhpcyBjYXVzZXMgYSBOZXR0eSBsb2dnaW5nIGhhbmRsZXIgdG8gYmUgYWRkZWQgdG8gdGhlIHBpcGVsaW5lLCB3aGljaCB3aWxsIHRocm90dGxlIGEgc3lzdGVtIHVuZGVyIGFueSBub3JtYWwgbG9hZC4gKi8KKyAgICBURVNUX1VOU0FGRV9WRVJCT1NFX0RFQlVHX0NMSUVOVF9QUk9UT0NPTCgiY2Fzc2FuZHJhLnVuc2FmZV92ZXJib3NlX2RlYnVnX2NsaWVudF9wcm90b2NvbCIpLAorICAgIFRFU1RfVVNFX1BSRVBBUkVEKCJjYXNzYW5kcmEudGVzdC51c2VfcHJlcGFyZWQiLCAidHJ1ZSIpLAorICAgIFRFU1RfVVRJTF9BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVCgib3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVXRpbEFMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNUIiksCisgICAgLyoqIEFjdGl2YXRlIHdyaXRlIHN1cnZleSBtb2RlLiBUaGUgbm9kZSBub3QgYmVjb21pbmcgYW4gYWN0aXZlIHJpbmcgbWVtYmVyLCBhbmQgeW91IG11c3QgdXNlIEpNWCBTdG9yYWdlU2VydmljZS0+am9pblJpbmcoKSB0byBmaW5hbGl6ZSB0aGUgcmluZyBqb2luaW5nLiAqLworICAgIFRFU1RfV1JJVEVfU1VSVkVZKCJjYXNzYW5kcmEud3JpdGVfc3VydmV5IiksCisgICAgVE9MRVJBVEVfU1NUQUJMRV9TSVpFKCJjYXNzYW5kcmEudG9sZXJhdGVfc3N0YWJsZV9zaXplIiksCisgICAgVFJJR0dFUlNfRElSKCJjYXNzYW5kcmEudHJpZ2dlcnNfZGlyIiksCisgICAgVFJVTkNBVEVfQkFMTE9UX01FVEFEQVRBKCJjYXNzYW5kcmEudHJ1bmNhdGVfYmFsbG90X21ldGFkYXRhIiksCisgICAgVFlQRV9VRFRfQ09ORkxJQ1RfQkVIQVZJT1IoImNhc3NhbmRyYS50eXBlLnVkdC5jb25mbGljdF9iZWhhdmlvciIpLAorICAgIFVERl9FWEVDVVRPUl9USFJFQURfS0VFUEFMSVZFX01TKCJjYXNzYW5kcmEudWRmX2V4ZWN1dG9yX3RocmVhZF9rZWVwYWxpdmVfbXMiLCAiMzAwMDAiKSwKKyAgICBVTlNBRkVfU1lTVEVNKCJjYXNzYW5kcmEudW5zYWZlc3lzdGVtIiksCisgICAgLyoqIFVzZXIncyBob21lIGRpcmVjdG9yeS4gKi8KKyAgICBVU0VSX0hPTUUoInVzZXIuaG9tZSIpLAorICAgIC8qKiBXaGVuIGVuYWJsZWQsIHJlY3Vyc2l2ZSBkaXJlY3RvcnkgZGVsZXRpb24gd2lsbCBiZSBleGVjdXRlZCB1c2luZyBhIHVuaXggY29tbWFuZCBgcm0gLXJmYCBpbnN0ZWFkIG9mIHRyYXZlcnNpbmcKKyAgICAgKiBhbmQgcmVtb3ZpbmcgaW5kaXZpZHVhbCBmaWxlcy4gVGhpcyBpcyBub3cgdXNlZCBvbmx5IHRlc3RzLCBidXQgZXZlbnR1YWxseSB3ZSB3aWxsIG1ha2UgaXQgdHJ1ZSBieSBkZWZhdWx0LiovCisgICAgVVNFX05JWF9SRUNVUlNJVkVfREVMRVRFKCJjYXNzYW5kcmEudXNlX25peF9yZWN1cnNpdmVfZGVsZXRlIiksCisgICAgLyoqIEdvc3NpcGVyIGNvbXB1dGUgZXhwaXJhdGlvbiB0aW1lb3V0LiBEZWZhdWx0IHZhbHVlIDMgZGF5cy4gKi8KKyAgICBWRVJZX0xPTkdfVElNRV9NUygiY2Fzc2FuZHJhLnZlcnlfbG9uZ190aW1lX21zIiwgIjI1OTIwMDAwMCIpLAorICAgIFdBSVRfRk9SX1RSQUNJTkdfRVZFTlRTX1RJTUVPVVRfU0VDUygiY2Fzc2FuZHJhLndhaXRfZm9yX3RyYWNpbmdfZXZlbnRzX3RpbWVvdXRfc2VjcyIsICIwIik7CiAKLSAgICA7CisgICAgc3RhdGljCisgICAgeworICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXNbXSB2YWx1ZXMgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMudmFsdWVzKCk7CisgICAgICAgIFNldDxTdHJpbmc+IHZpc2l0ZWQgPSBuZXcgSGFzaFNldDw+KHZhbHVlcy5sZW5ndGgpOworICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMgcHJldiA9IG51bGw7CisgICAgICAgIGZvciAoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIG5leHQgOiB2YWx1ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghdmlzaXRlZC5hZGQobmV4dC5nZXRLZXkoKSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU3lzdGVtIHByb3BlcnRpZXMgaGF2ZSBkdXBsaWNhdGUga2V5OiAiICsgbmV4dC5nZXRLZXkoKSk7CisgICAgICAgICAgICBpZiAocHJldiAhPSBudWxsICYmIG5leHQubmFtZSgpLmNvbXBhcmVUbyhwcmV2Lm5hbWUoKSkgPCAwKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVudW0gY29uc3RhbnRzIGFyZSBub3QgaW4gYWxwaGFiZXRpY2FsIG9yZGVyOiAiICsgcHJldi5uYW1lKCkgKyAiIHNob3VsZCBjb21lIGJlZm9yZSAiICsgbmV4dC5uYW1lKCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByZXYgPSBuZXh0OworICAgICAgICB9CisgICAgfQogCiAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzKFN0cmluZyBrZXksIFN0cmluZyBkZWZhdWx0VmFsKQogICAgIHsKQEAgLTM4OSwxMyArNTgwLDMyIEBACiAgICAgICAgIHJldHVybiBjb252ZXJ0ZXIuY29udmVydCh2YWx1ZSk7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEBOdWxsYWJsZSBPYmplY3QgdmFsdWUpCisgICAgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpCisgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgdmFsdWU7CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pCisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi50b1N0cmluZygoQm9vbGVhbikgdmFsdWUpOworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb25nKQorICAgICAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcoKExvbmcpIHZhbHVlKTsKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZWdlcikKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKChJbnRlZ2VyKSB2YWx1ZSk7CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERvdWJsZSkKKyAgICAgICAgICAgIHJldHVybiBEb3VibGUudG9TdHJpbmcoKERvdWJsZSkgdmFsdWUpOworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGbG9hdCkKKyAgICAgICAgICAgIHJldHVybiBGbG9hdC50b1N0cmluZygoRmxvYXQpIHZhbHVlKTsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biB0eXBlICIgKyB2YWx1ZS5nZXRDbGFzcygpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBpbnRvIHN5c3RlbSBwcm9wZXJ0aWVzLgogICAgICAqIEBwYXJhbSB2YWx1ZSB0byBzZXQKICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHZhbHVlKQorICAgIHB1YmxpYyBTdHJpbmcgc2V0U3RyaW5nKFN0cmluZyB2YWx1ZSkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFN5c3RlbS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQyNSwzNiArNjM1LDYxIEBACiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdmFsdWUgaW50byBzeXN0ZW0gcHJvcGVydGllcy4KICAgICAgKiBAcGFyYW0gdmFsdWUgdG8gc2V0CisgICAgICogQHJldHVybiBQcmV2aW91cyB2YWx1ZSBpZiBpdCBleGlzdHMuCiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Qm9vbGVhbihib29sZWFuIHZhbHVlKQorICAgIHB1YmxpYyBCb29sZWFuIHNldEJvb2xlYW4oYm9vbGVhbiB2YWx1ZSkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShrZXksIEJvb2xlYW4udG9TdHJpbmcodmFsdWUpKTsKKyAgICAgICAgU3RyaW5nIHByZXYgPSBTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCBjb252ZXJ0VG9TdHJpbmcodmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIHByZXYgPT0gbnVsbCA/IG51bGwgOiBCT09MRUFOX0NPTlZFUlRFUi5jb252ZXJ0KHByZXYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgdmFsdWUgc2V0IGluIHRoZSBzeXN0ZW0gcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJWYWx1ZSgpCisgICAgeworICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShrZXkpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3lzdGVtIHByb3BlcnR5IGFzIGEgaW50LgotICAgICAqIEByZXR1cm4gc3lzdGVtIHByb3BlcnR5IGludCB2YWx1ZSBpZiBpdCBleGlzdHMsIGRlZmF1bHRWYWx1ZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiBTeXN0ZW0gcHJvcGVydHkgdmFsdWUgaWYgaXQgZXhpc3RzLCBkZWZhdWx0VmFsdWUgb3RoZXJ3aXNlLiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIG5vIGRlZmF1bHQgdmFsdWUgaXMgc2V0LgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgZ2V0SW50KCkKICAgICB7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShrZXkpOwotCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmIGRlZmF1bHRWYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJNaXNzaW5nIHByb3BlcnR5IHZhbHVlIG9yIGRlZmF1bHQgdmFsdWUgaXMgbm90IHNldDogIiArIGtleSk7CiAgICAgICAgIHJldHVybiBJTlRFR0VSX0NPTlZFUlRFUi5jb252ZXJ0KHZhbHVlID09IG51bGwgPyBkZWZhdWx0VmFsIDogdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3lzdGVtIHByb3BlcnR5IGFzIGEgaW50LgotICAgICAqIEByZXR1cm4gc3lzdGVtIHByb3BlcnR5IGludCB2YWx1ZSBpZiBpdCBleGlzdHMsIGRlZmF1bHRWYWx1ZSBvdGhlcndpc2UuCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzeXN0ZW0gcHJvcGVydHkgYXMgYSBsb25nLgorICAgICAqIEByZXR1cm4gU3lzdGVtIHByb3BlcnR5IHZhbHVlIGlmIGl0IGV4aXN0cywgZGVmYXVsdFZhbHVlIG90aGVyd2lzZS4gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBubyBkZWZhdWx0IHZhbHVlIGlzIHNldC4KICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBnZXRMb25nKCkKICAgICB7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShrZXkpOwotCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmIGRlZmF1bHRWYWwgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJNaXNzaW5nIHByb3BlcnR5IHZhbHVlIG9yIGRlZmF1bHQgdmFsdWUgaXMgbm90IHNldDogIiArIGtleSk7CiAgICAgICAgIHJldHVybiBMT05HX0NPTlZFUlRFUi5jb252ZXJ0KHZhbHVlID09IG51bGwgPyBkZWZhdWx0VmFsIDogdmFsdWUpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3lzdGVtIHByb3BlcnR5IGFzIGEgaW50LgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3lzdGVtIHByb3BlcnR5IGFzIGEgbG9uZy4KKyAgICAgKiBAcmV0dXJuIHN5c3RlbSBwcm9wZXJ0eSBsb25nIHZhbHVlIGlmIGl0IGV4aXN0cywgZGVmYXVsdFZhbHVlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRMb25nKGxvbmcgb3ZlcnJpZGVEZWZhdWx0VmFsdWUpCisgICAgeworICAgICAgICBTdHJpbmcgdmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVEZWZhdWx0VmFsdWU7CisKKyAgICAgICAgcmV0dXJuIExPTkdfQ09OVkVSVEVSLmNvbnZlcnQodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3lzdGVtIHByb3BlcnR5IGFzIGFuIGludC4KICAgICAgKiBAcmV0dXJuIHN5c3RlbSBwcm9wZXJ0eSBpbnQgdmFsdWUgaWYgaXQgZXhpc3RzLCBvdmVycmlkZURlZmF1bHRWYWx1ZSBvdGhlcndpc2UuCiAgICAgICovCiAgICAgcHVibGljIGludCBnZXRJbnQoaW50IG92ZXJyaWRlRGVmYXVsdFZhbHVlKQpAQCAtNDY5LDE5ICs3MDQsNzUgQEAKICAgICAvKioKICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBpbnRvIHN5c3RlbSBwcm9wZXJ0aWVzLgogICAgICAqIEBwYXJhbSB2YWx1ZSB0byBzZXQKKyAgICAgKiBAcmV0dXJuIFByZXZpb3VzIHZhbHVlIG9yIG51bGwgaWYgaXQgZGlkIG5vdCBoYXZlIG9uZS4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRJbnQoaW50IHZhbHVlKQorICAgIHB1YmxpYyBJbnRlZ2VyIHNldEludChpbnQgdmFsdWUpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIFN0cmluZyBwcmV2ID0gU3lzdGVtLnNldFByb3BlcnR5KGtleSwgY29udmVydFRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIHJldHVybiBwcmV2ID09IG51bGwgPyBudWxsIDogSU5URUdFUl9DT05WRVJURVIuY29udmVydChwcmV2KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBpbnRvIHN5c3RlbSBwcm9wZXJ0aWVzLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0byBzZXQKKyAgICAgKiBAcmV0dXJuIFByZXZpb3VzIHZhbHVlIG9yIG51bGwgaWYgaXQgZGlkIG5vdCBoYXZlIG9uZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9uZyBzZXRMb25nKGxvbmcgdmFsdWUpCisgICAgeworICAgICAgICBTdHJpbmcgcHJldiA9IFN5c3RlbS5zZXRQcm9wZXJ0eShrZXksIGNvbnZlcnRUb1N0cmluZyh2YWx1ZSkpOworICAgICAgICByZXR1cm4gcHJldiA9PSBudWxsID8gbnVsbCA6IExPTkdfQ09OVkVSVEVSLmNvbnZlcnQocHJldik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgYSBzeXN0ZW0gcHJvcGVydHkgYXMgYSBlbnVtLCBjYWxsaW5nIHtAbGluayBTdHJpbmcjdG9VcHBlckNhc2UoKX0gZmlyc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRvIHJldHVybiB3aGVuIG5vdCBkZWZpbmVkCisgICAgICogQHBhcmFtIDxUPiB0eXBlCisgICAgICogQHJldHVybiBlbnVtIHZhbHVlCisgICAgICovCisgICAgcHVibGljIDxUIGV4dGVuZHMgRW51bTxUPj4gVCBnZXRFbnVtKFQgZGVmYXVsdFZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldEVudW0odHJ1ZSwgZGVmYXVsdFZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIHN5c3RlbSBwcm9wZXJ0eSBhcyBhIGVudW0sIG9wdGlvbmFsbHkgY2FsbGluZyB7QGxpbmsgU3RyaW5nI3RvVXBwZXJDYXNlKCl9IGZpcnN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRvVXBwZXJjYXNlIGJlZm9yZSBjb252ZXJ0aW5nIHRvIGVudW0KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRvIHJldHVybiB3aGVuIG5vdCBkZWZpbmVkCisgICAgICogQHBhcmFtIDxUPiB0eXBlCisgICAgICogQHJldHVybiBlbnVtIHZhbHVlCisgICAgICovCisgICAgcHVibGljIDxUIGV4dGVuZHMgRW51bTxUPj4gVCBnZXRFbnVtKGJvb2xlYW4gdG9VcHBlcmNhc2UsIFQgZGVmYXVsdFZhbHVlKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KGtleSk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgcmV0dXJuIEVudW0udmFsdWVPZihkZWZhdWx0VmFsdWUuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgdG9VcHBlcmNhc2UgPyB2YWx1ZS50b1VwcGVyQ2FzZSgpIDogdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIGEgc3lzdGVtIHByb3BlcnR5IGFzIGFuIGVudW0sIG9wdGlvbmFsbHkgY2FsbGluZyB7QGxpbmsgU3RyaW5nI3RvVXBwZXJDYXNlKCl9IGZpcnN0LgorICAgICAqIElmIHRoZSB2YWx1ZSBpcyBtaXNzaW5nLCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSBpcyB1c2VkCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG9VcHBlcmNhc2UgYmVmb3JlIGNvbnZlcnRpbmcgdG8gZW51bQorICAgICAqIEBwYXJhbSBlbnVtQ2xhc3MgZW51bWVyYXRpb24gY2xhc3MKKyAgICAgKiBAcGFyYW0gPFQ+IHR5cGUKKyAgICAgKiBAcmV0dXJuIGVudW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBFbnVtPFQ+PiBUIGdldEVudW0oYm9vbGVhbiB0b1VwcGVyY2FzZSwgQ2xhc3M8VD4gZW51bUNsYXNzKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KGtleSwgZGVmYXVsdFZhbCk7CisgICAgICAgIHJldHVybiBFbnVtLnZhbHVlT2YoZW51bUNsYXNzLCB0b1VwcGVyY2FzZSA/IHZhbHVlLnRvVXBwZXJDYXNlKCkgOiB2YWx1ZSk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU2V0cyB0aGUgdmFsdWUgaW50byBzeXN0ZW0gcHJvcGVydGllcy4KICAgICAgKiBAcGFyYW0gdmFsdWUgdG8gc2V0CiAgICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TG9uZyhsb25nIHZhbHVlKQorICAgIHB1YmxpYyB2b2lkIHNldEVudW0oRW51bTw/PiB2YWx1ZSkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShrZXksIExvbmcudG9TdHJpbmcodmFsdWUpKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KGtleSwgdmFsdWUubmFtZSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5Q29udmVydGVyPFQ+CkBAIC01MTUsNyArODA2LDcgQEAKICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIHZhbHVlIGZvciBzeXN0ZW0gcHJvcGVydHk6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgaW50ZWdlciB2YWx1ZSBidXQgZ290ICclcyciLCB2YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgbG9uZyB2YWx1ZSBidXQgZ290ICclcyciLCB2YWx1ZSkpOwogICAgICAgICB9CiAgICAgfTsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0NvbmZpZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0NvbmZpZy5qYXZhCmluZGV4IDhhNTljYTIuLjZlNWY4NzMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9Db25maWcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvQ29uZmlnLmphdmEKQEAgLTIxLDI3ICsyMSwzMSBAQAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOwotCiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKLQogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdWRpdC5BdWRpdExvZ09wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29uc2lzdGVuY3lMZXZlbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5mcWwuRnVsbFF1ZXJ5TG9nZ2VyT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RhcnR1cENoZWNrcy5TdGFydHVwQ2hlY2tUeXBlOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQVVUT0NPTVBBQ1RJT05fT05fU1RBUlRVUF9FTkFCTEVEOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkZJTEVfQ0FDSEVfRU5BQkxFRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TS0lQX1BBWE9TX1JFUEFJUl9PTl9UT1BPTE9HWV9DSEFOR0U7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU0tJUF9QQVhPU19SRVBBSVJfT05fVE9QT0xPR1lfQ0hBTkdFX0tFWVNQQUNFUzsKKwogLyoqCiAgKiBBIGNsYXNzIHRoYXQgY29udGFpbnMgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgY2Fzc2FuZHJhIG5vZGUgaXQgcnVucyB3aXRoaW4uCiAgKgpAQCAtMTYwLDYgKzE2NCw4IEBACiAgICAgQFJlcGxhY2VzKG9sZE5hbWUgPSAic2xvd19xdWVyeV9sb2dfdGltZW91dF9pbl9tcyIsIGNvbnZlcnRlciA9IENvbnZlcnRlcnMuTUlMTElTX0RVUkFUSU9OX0xPTkcsIGRlcHJlY2F0ZWQgPSB0cnVlKQogICAgIHB1YmxpYyB2b2xhdGlsZSBEdXJhdGlvblNwZWMuTG9uZ01pbGxpc2Vjb25kc0JvdW5kIHNsb3dfcXVlcnlfbG9nX3RpbWVvdXQgPSBuZXcgRHVyYXRpb25TcGVjLkxvbmdNaWxsaXNlY29uZHNCb3VuZCgiNTAwbXMiKTsKIAorICAgIHB1YmxpYyB2b2xhdGlsZSBEdXJhdGlvblNwZWMuTG9uZ01pbGxpc2Vjb25kc0JvdW5kIHN0cmVhbV90cmFuc2Zlcl90YXNrX3RpbWVvdXQgPSBuZXcgRHVyYXRpb25TcGVjLkxvbmdNaWxsaXNlY29uZHNCb3VuZCgiMTJoIik7CisKICAgICBwdWJsaWMgdm9sYXRpbGUgZG91YmxlIHBoaV9jb252aWN0X3RocmVzaG9sZCA9IDguMDsKIAogICAgIHB1YmxpYyBpbnQgY29uY3VycmVudF9yZWFkcyA9IDMyOwpAQCAtMjY3LDYgKzI3Myw4IEBACiAgICAgcHVibGljIGludCBuYXRpdmVfdHJhbnNwb3J0X21heF90aHJlYWRzID0gMTI4OwogICAgIEBSZXBsYWNlcyhvbGROYW1lID0gIm5hdGl2ZV90cmFuc3BvcnRfbWF4X2ZyYW1lX3NpemVfaW5fbWIiLCBjb252ZXJ0ZXIgPSBDb252ZXJ0ZXJzLk1FQklCWVRFU19EQVRBX1NUT1JBR0VfSU5ULCBkZXByZWNhdGVkID0gdHJ1ZSkKICAgICBwdWJsaWMgRGF0YVN0b3JhZ2VTcGVjLkludE1lYmlieXRlc0JvdW5kIG5hdGl2ZV90cmFuc3BvcnRfbWF4X2ZyYW1lX3NpemUgPSBuZXcgRGF0YVN0b3JhZ2VTcGVjLkludE1lYmlieXRlc0JvdW5kKCIxNk1pQiIpOworICAgIC8qKiBkbyBiY3J5cHQgaGFzaGluZyBpbiBhIGxpbWl0ZWQgcG9vbCB0byBwcmV2ZW50IGNwdSBsb2FkIHNwaWtlczsgbm90ZTogYW55IHZhbHVlIDwgMSB3aWxsIGJlIHNldCB0byAxIG9uIGluaXQgKiovCisgICAgcHVibGljIGludCBuYXRpdmVfdHJhbnNwb3J0X21heF9hdXRoX3RocmVhZHMgPSA0OwogICAgIHB1YmxpYyB2b2xhdGlsZSBsb25nIG5hdGl2ZV90cmFuc3BvcnRfbWF4X2NvbmN1cnJlbnRfY29ubmVjdGlvbnMgPSAtMUw7CiAgICAgcHVibGljIHZvbGF0aWxlIGxvbmcgbmF0aXZlX3RyYW5zcG9ydF9tYXhfY29uY3VycmVudF9jb25uZWN0aW9uc19wZXJfaXAgPSAtMUw7CiAgICAgcHVibGljIGJvb2xlYW4gbmF0aXZlX3RyYW5zcG9ydF9mbHVzaF9pbl9iYXRjaGVzX2xlZ2FjeSA9IGZhbHNlOwpAQCAtMzA3LDcgKzMxNSw3IEBACiAKICAgICAvKiBpZiB0aGUgc2l6ZSBvZiBjb2x1bW5zIG9yIHN1cGVyLWNvbHVtbnMgYXJlIG1vcmUgdGhhbiB0aGlzLCBpbmRleGluZyB3aWxsIGtpY2sgaW4gKi8KICAgICBAUmVwbGFjZXMob2xkTmFtZSA9ICJjb2x1bW5faW5kZXhfc2l6ZV9pbl9rYiIsIGNvbnZlcnRlciA9IENvbnZlcnRlcnMuS0lCSUJZVEVTX0RBVEFTVE9SQUdFLCBkZXByZWNhdGVkID0gdHJ1ZSkKLSAgICBwdWJsaWMgdm9sYXRpbGUgRGF0YVN0b3JhZ2VTcGVjLkludEtpYmlieXRlc0JvdW5kIGNvbHVtbl9pbmRleF9zaXplID0gbmV3IERhdGFTdG9yYWdlU3BlYy5JbnRLaWJpYnl0ZXNCb3VuZCgiNjRLaUIiKTsKKyAgICBwdWJsaWMgdm9sYXRpbGUgRGF0YVN0b3JhZ2VTcGVjLkludEtpYmlieXRlc0JvdW5kIGNvbHVtbl9pbmRleF9zaXplOwogICAgIEBSZXBsYWNlcyhvbGROYW1lID0gImNvbHVtbl9pbmRleF9jYWNoZV9zaXplX2luX2tiIiwgY29udmVydGVyID0gQ29udmVydGVycy5LSUJJQllURVNfREFUQVNUT1JBR0UsIGRlcHJlY2F0ZWQgPSB0cnVlKQogICAgIHB1YmxpYyB2b2xhdGlsZSBEYXRhU3RvcmFnZVNwZWMuSW50S2liaWJ5dGVzQm91bmQgY29sdW1uX2luZGV4X2NhY2hlX3NpemUgPSBuZXcgRGF0YVN0b3JhZ2VTcGVjLkludEtpYmlieXRlc0JvdW5kKCIyS2lCIik7CiAgICAgQFJlcGxhY2VzKG9sZE5hbWUgPSAiYmF0Y2hfc2l6ZV93YXJuX3RocmVzaG9sZF9pbl9rYiIsIGNvbnZlcnRlciA9IENvbnZlcnRlcnMuS0lCSUJZVEVTX0RBVEFTVE9SQUdFLCBkZXByZWNhdGVkID0gdHJ1ZSkKQEAgLTMxOSwxNSArMzI3LDIyIEBACiAgICAgcHVibGljIHZvbGF0aWxlIEludGVnZXIgY29uY3VycmVudF9jb21wYWN0b3JzOwogICAgIEBSZXBsYWNlcyhvbGROYW1lID0gImNvbXBhY3Rpb25fdGhyb3VnaHB1dF9tYl9wZXJfc2VjIiwgY29udmVydGVyID0gQ29udmVydGVycy5NRUJJQllURVNfUEVSX1NFQ09ORF9EQVRBX1JBVEUsIGRlcHJlY2F0ZWQgPSB0cnVlKQogICAgIHB1YmxpYyB2b2xhdGlsZSBEYXRhUmF0ZVNwZWMuTG9uZ0J5dGVzUGVyU2Vjb25kQm91bmQgY29tcGFjdGlvbl90aHJvdWdocHV0ID0gbmV3IERhdGFSYXRlU3BlYy5Mb25nQnl0ZXNQZXJTZWNvbmRCb3VuZCgiNjRNaUIvcyIpOworICAgIEBEZXByZWNhdGVkCiAgICAgQFJlcGxhY2VzKG9sZE5hbWUgPSAiY29tcGFjdGlvbl9sYXJnZV9wYXJ0aXRpb25fd2FybmluZ190aHJlc2hvbGRfbWIiLCBjb252ZXJ0ZXIgPSBDb252ZXJ0ZXJzLk1FQklCWVRFU19EQVRBX1NUT1JBR0VfSU5ULCBkZXByZWNhdGVkID0gdHJ1ZSkKICAgICBwdWJsaWMgdm9sYXRpbGUgRGF0YVN0b3JhZ2VTcGVjLkludE1lYmlieXRlc0JvdW5kIGNvbXBhY3Rpb25fbGFyZ2VfcGFydGl0aW9uX3dhcm5pbmdfdGhyZXNob2xkID0gbmV3IERhdGFTdG9yYWdlU3BlYy5JbnRNZWJpYnl0ZXNCb3VuZCgiMTAwTWlCIik7CiAgICAgQFJlcGxhY2VzKG9sZE5hbWUgPSAibWluX2ZyZWVfc3BhY2VfcGVyX2RyaXZlX2luX21iIiwgY29udmVydGVyID0gQ29udmVydGVycy5NRUJJQllURVNfREFUQV9TVE9SQUdFX0lOVCwgZGVwcmVjYXRlZCA9IHRydWUpCiAgICAgcHVibGljIERhdGFTdG9yYWdlU3BlYy5JbnRNZWJpYnl0ZXNCb3VuZCBtaW5fZnJlZV9zcGFjZV9wZXJfZHJpdmUgPSBuZXcgRGF0YVN0b3JhZ2VTcGVjLkludE1lYmlieXRlc0JvdW5kKCI1ME1pQiIpOwogICAgIHB1YmxpYyB2b2xhdGlsZSBJbnRlZ2VyIGNvbXBhY3Rpb25fdG9tYnN0b25lX3dhcm5pbmdfdGhyZXNob2xkID0gMTAwMDAwOwogCisgICAgLy8gZnJhY3Rpb24gb2YgZnJlZSBkaXNrIHNwYWNlIGF2YWlsYWJsZSBmb3IgY29tcGFjdGlvbiBhZnRlciBtaW4gZnJlZSBzcGFjZSBpcyBzdWJ0cmFjdGVkCisgICAgcHVibGljIHZvbGF0aWxlIERvdWJsZSBtYXhfc3BhY2VfdXNhYmxlX2Zvcl9jb21wYWN0aW9uc19pbl9wZXJjZW50YWdlID0gLjk1OworCiAgICAgcHVibGljIHZvbGF0aWxlIGludCBjb25jdXJyZW50X21hdGVyaWFsaXplZF92aWV3X2J1aWxkZXJzID0gMTsKICAgICBwdWJsaWMgdm9sYXRpbGUgaW50IHJlamVjdF9yZXBhaXJfY29tcGFjdGlvbl90aHJlc2hvbGQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKIAorICAgIC8vIFRoZSBudW1iZXIgb2YgZXhlY3V0b3JzIHRvIHVzZSBmb3IgYnVpbGRpbmcgc2Vjb25kYXJ5IGluZGV4ZXMKKyAgICBwdWJsaWMgaW50IGNvbmN1cnJlbnRfaW5kZXhfYnVpbGRlcnMgPSAyOworCiAgICAgLyoqCiAgICAgICogQGRlcHJlY2F0ZWQgcmV0cnkgc3VwcG9ydCByZW1vdmVkIG9uIENBU1NBTkRSQS0xMDk5MgogICAgICAqLwpAQCAtMzQ0LDYgKzM1OSwxNCBAQAogCiAgICAgcHVibGljIFN0cmluZ1tdIGRhdGFfZmlsZV9kaXJlY3RvcmllcyA9IG5ldyBTdHJpbmdbMF07CiAKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNTVGFibGVDb25maWcKKyAgICB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgc2VsZWN0ZWRfZm9ybWF0ID0gQmlnRm9ybWF0Lk5BTUU7CisgICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBTdHJpbmc+PiBmb3JtYXQgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFNTVGFibGVDb25maWcgc3N0YWJsZSA9IG5ldyBTU1RhYmxlQ29uZmlnKCk7CisKICAgICAvKioKICAgICAgKiBUaGUgZGlyZWN0b3J5IHRvIHVzZSBmb3Igc3RvcmluZyB0aGUgc3lzdGVtIGtleXNwYWNlcyBkYXRhLgogICAgICAqIElmIHVuc3BlY2lmaWVkIHRoZSBkYXRhIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBmaXJzdCBvZiB0aGUgZGF0YV9maWxlX2RpcmVjdG9yaWVzLgpAQCAtMzgzLDYgKzQwNiw5IEBACiAgICAgLy8gV2hlbiB0cnVlLCBuZXcgQ0RDIG11dGF0aW9ucyBhcmUgcmVqZWN0ZWQvYmxvY2tlZCB3aGVuIHJlYWNoaW5nIG1heCBDREMgc3RvcmFnZS4KICAgICAvLyBXaGVuIGZhbHNlLCBuZXcgQ0RDIG11dGF0aW9ucyBjYW4gYWx3YXlzIGJlIGFkZGVkLiBCdXQgaXQgd2lsbCByZW1vdmUgdGhlIG9sZGVzdCBDREMgY29tbWl0IGxvZyBzZWdtZW50IG9uIGZ1bGwuCiAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gY2RjX2Jsb2NrX3dyaXRlcyA9IHRydWU7CisgICAgLy8gV2hlbiB0cnVlLCBDREMgZGF0YSBpbiBTU1RhYmxlIGdvIHRocm91Z2ggY29tbWl0IGxvZ3MgZHVyaW5nIGludGVybm9kZXMgc3RyZWFtaW5nLCBlLmcuIHJlcGFpcgorICAgIC8vIFdoZW4gZmFsc2UsIGl0IGJlaGF2ZXMgdGhlIHNhbWUgYXMgbm9ybWFsIHN0cmVhbWluZy4KKyAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBjZGNfb25fcmVwYWlyX2VuYWJsZWQgPSB0cnVlOwogICAgIHB1YmxpYyBTdHJpbmcgY2RjX3Jhd19kaXJlY3Rvcnk7CiAgICAgQFJlcGxhY2VzKG9sZE5hbWUgPSAiY2RjX3RvdGFsX3NwYWNlX2luX21iIiwgY29udmVydGVyID0gQ29udmVydGVycy5NRUJJQllURVNfREFUQV9TVE9SQUdFX0lOVCwgZGVwcmVjYXRlZCA9IHRydWUpCiAgICAgcHVibGljIERhdGFTdG9yYWdlU3BlYy5JbnRNZWJpYnl0ZXNCb3VuZCBjZGNfdG90YWxfc3BhY2UgPSBuZXcgRGF0YVN0b3JhZ2VTcGVjLkludE1lYmlieXRlc0JvdW5kKCIwTWlCIik7CkBAIC00MjAsNiArNDQ2LDcgQEAKIAogICAgIHB1YmxpYyBQYXJhbWV0ZXJpemVkQ2xhc3MgaGludHNfY29tcHJlc3Npb247CiAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gYXV0b19oaW50c19jbGVhbnVwX2VuYWJsZWQgPSBmYWxzZTsKKyAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiB0cmFuc2Zlcl9oaW50c19vbl9kZWNvbW1pc3Npb24gPSB0cnVlOwogCiAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gaW5jcmVtZW50YWxfYmFja3VwcyA9IGZhbHNlOwogICAgIHB1YmxpYyBib29sZWFuIHRyaWNrbGVfZnN5bmMgPSBmYWxzZTsKQEAgLTQ2NCw3ICs0OTEsNyBAQAogICAgIEBSZXBsYWNlcyhvbGROYW1lID0gImZpbGVfY2FjaGVfc2l6ZV9pbl9tYiIsIGNvbnZlcnRlciA9IENvbnZlcnRlcnMuTUVCSUJZVEVTX0RBVEFfU1RPUkFHRV9JTlQsIGRlcHJlY2F0ZWQgPSB0cnVlKQogICAgIHB1YmxpYyBEYXRhU3RvcmFnZVNwZWMuSW50TWViaWJ5dGVzQm91bmQgZmlsZV9jYWNoZV9zaXplOwogCi0gICAgcHVibGljIGJvb2xlYW4gZmlsZV9jYWNoZV9lbmFibGVkID0gQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEuZmlsZV9jYWNoZV9lbmFibGVkIik7CisgICAgcHVibGljIGJvb2xlYW4gZmlsZV9jYWNoZV9lbmFibGVkID0gRklMRV9DQUNIRV9FTkFCTEVELmdldEJvb2xlYW4oKTsKIAogICAgIC8qKgogICAgICAqIEJlY2F1c2Ugb2YgdGhlIGN1cnJlbnQge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5CdWZmZXJQb29sfSBzbGFiIHNpemVzIG9mIDY0IEtpQiwgd2UKQEAgLTU1Miw2ICs1NzksOCBAQAogCiAgICAgQFJlcGxhY2VzKG9sZE5hbWUgPSAiZW5hYmxlX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnMiLCBjb252ZXJ0ZXIgPSBDb252ZXJ0ZXJzLklERU5USVRZLCBkZXByZWNhdGVkID0gdHJ1ZSkKICAgICBwdWJsaWMgYm9vbGVhbiB1c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQgPSBmYWxzZTsKKworICAgIEBEZXByZWNhdGVkCiAgICAgQFJlcGxhY2VzKG9sZE5hbWUgPSAiZW5hYmxlX3NjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnMiLCBjb252ZXJ0ZXIgPSBDb252ZXJ0ZXJzLklERU5USVRZLCBkZXByZWNhdGVkID0gdHJ1ZSkKICAgICBwdWJsaWMgYm9vbGVhbiBzY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQgPSBmYWxzZTsKIApAQCAtNTk1LDYgKzYyNCw4IEBACiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gYWxsb3dfZXh0cmFfaW5zZWN1cmVfdWRmcyA9IGZhbHNlOwogCisgICAgcHVibGljIGJvb2xlYW4gZHluYW1pY19kYXRhX21hc2tpbmdfZW5hYmxlZCA9IGZhbHNlOworCiAgICAgLyoqCiAgICAgICogVGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgYSB3YXJuaW5nIHdpbGwgYmUgZW1pdHRlZCB0byB0aGUgbG9nIGFuZCB0byB0aGUgY2xpZW50IHRoYXQgYSBVREYgcnVucyB0b28gbG9uZy4KICAgICAgKiAoT25seSB2YWxpZCwgaWYgdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc190aHJlYWRzX2VuYWJsZWQ9PXRydWUpCkBAIC02NTMsNiArNjg0LDggQEAKICAgICBwdWJsaWMgdm9sYXRpbGUgaW50IG1heF9jb25jdXJyZW50X2F1dG9tYXRpY19zc3RhYmxlX3VwZ3JhZGVzID0gMTsKICAgICBwdWJsaWMgYm9vbGVhbiBzdHJlYW1fZW50aXJlX3NzdGFibGVzID0gdHJ1ZTsKIAorICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIHNraXBfc3RyZWFtX2Rpc2tfc3BhY2VfY2hlY2sgPSBmYWxzZTsKKwogICAgIHB1YmxpYyB2b2xhdGlsZSBBdWRpdExvZ09wdGlvbnMgYXVkaXRfbG9nZ2luZ19vcHRpb25zID0gbmV3IEF1ZGl0TG9nT3B0aW9ucygpOwogICAgIHB1YmxpYyB2b2xhdGlsZSBGdWxsUXVlcnlMb2dnZXJPcHRpb25zIGZ1bGxfcXVlcnlfbG9nZ2luZ19vcHRpb25zID0gbmV3IEZ1bGxRdWVyeUxvZ2dlck9wdGlvbnMoKTsKIApAQCAtNzc0LDcgKzgwNyw3IEBACiAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gY2hlY2tfZm9yX2R1cGxpY2F0ZV9yb3dzX2R1cmluZ19yZWFkcyA9IHRydWU7CiAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gY2hlY2tfZm9yX2R1cGxpY2F0ZV9yb3dzX2R1cmluZ19jb21wYWN0aW9uID0gdHJ1ZTsKIAotICAgIHB1YmxpYyBib29sZWFuIGF1dG9jb21wYWN0aW9uX29uX3N0YXJ0dXBfZW5hYmxlZCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmF1dG9jb21wYWN0aW9uX29uX3N0YXJ0dXBfZW5hYmxlZCIsICJ0cnVlIikpOworICAgIHB1YmxpYyBib29sZWFuIGF1dG9jb21wYWN0aW9uX29uX3N0YXJ0dXBfZW5hYmxlZCA9IEFVVE9DT01QQUNUSU9OX09OX1NUQVJUVVBfRU5BQkxFRC5nZXRCb29sZWFuKCk7CiAKICAgICAvLyBzZWUgQ0FTU0FORFJBLTMyMDAgLyBDQVNTQU5EUkEtMTYyNzQKICAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBhdXRvX29wdGltaXNlX2luY19yZXBhaXJfc3RyZWFtcyA9IGZhbHNlOwpAQCAtODMwLDEzICs4NjMsMjAgQEAKICAgICBwdWJsaWMgdm9sYXRpbGUgU2V0PENvbnNpc3RlbmN5TGV2ZWw+IHdyaXRlX2NvbnNpc3RlbmN5X2xldmVsc193YXJuZWQgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwogICAgIHB1YmxpYyB2b2xhdGlsZSBTZXQ8Q29uc2lzdGVuY3lMZXZlbD4gd3JpdGVfY29uc2lzdGVuY3lfbGV2ZWxzX2Rpc2FsbG93ZWQgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwogICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIHVzZXJfdGltZXN0YW1wc19lbmFibGVkID0gdHJ1ZTsKKyAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBhbHRlcl90YWJsZV9lbmFibGVkID0gdHJ1ZTsKICAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBncm91cF9ieV9lbmFibGVkID0gdHJ1ZTsKICAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBkcm9wX3RydW5jYXRlX3RhYmxlX2VuYWJsZWQgPSB0cnVlOworICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIGRyb3Bfa2V5c3BhY2VfZW5hYmxlZCA9IHRydWU7CiAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gc2Vjb25kYXJ5X2luZGV4ZXNfZW5hYmxlZCA9IHRydWU7CiAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gdW5jb21wcmVzc2VkX3RhYmxlc19lbmFibGVkID0gdHJ1ZTsKICAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBjb21wYWN0X3RhYmxlc19lbmFibGVkID0gdHJ1ZTsKICAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiByZWFkX2JlZm9yZV93cml0ZV9saXN0X29wZXJhdGlvbnNfZW5hYmxlZCA9IHRydWU7CiAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gYWxsb3dfZmlsdGVyaW5nX2VuYWJsZWQgPSB0cnVlOworICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIHNpbXBsZXN0cmF0ZWd5X2VuYWJsZWQgPSB0cnVlOworICAgIHB1YmxpYyB2b2xhdGlsZSBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgcGFydGl0aW9uX3NpemVfd2Fybl90aHJlc2hvbGQgPSBudWxsOworICAgIHB1YmxpYyB2b2xhdGlsZSBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgcGFydGl0aW9uX3NpemVfZmFpbF90aHJlc2hvbGQgPSBudWxsOworICAgIHB1YmxpYyB2b2xhdGlsZSBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgY29sdW1uX3ZhbHVlX3NpemVfd2Fybl90aHJlc2hvbGQgPSBudWxsOworICAgIHB1YmxpYyB2b2xhdGlsZSBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgY29sdW1uX3ZhbHVlX3NpemVfZmFpbF90aHJlc2hvbGQgPSBudWxsOwogICAgIHB1YmxpYyB2b2xhdGlsZSBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgY29sbGVjdGlvbl9zaXplX3dhcm5fdGhyZXNob2xkID0gbnVsbDsKICAgICBwdWJsaWMgdm9sYXRpbGUgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIGNvbGxlY3Rpb25fc2l6ZV9mYWlsX3RocmVzaG9sZCA9IG51bGw7CiAgICAgcHVibGljIHZvbGF0aWxlIGludCBpdGVtc19wZXJfY29sbGVjdGlvbl93YXJuX3RocmVzaG9sZCA9IC0xOwpAQCAtODQ4LDYgKzg4OCwxMCBAQAogICAgIHB1YmxpYyB2b2xhdGlsZSBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgZGF0YV9kaXNrX3VzYWdlX21heF9kaXNrX3NpemUgPSBudWxsOwogICAgIHB1YmxpYyB2b2xhdGlsZSBpbnQgbWluaW11bV9yZXBsaWNhdGlvbl9mYWN0b3Jfd2Fybl90aHJlc2hvbGQgPSAtMTsKICAgICBwdWJsaWMgdm9sYXRpbGUgaW50IG1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkID0gLTE7CisgICAgcHVibGljIHZvbGF0aWxlIGludCBtYXhpbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl93YXJuX3RocmVzaG9sZCA9IC0xOworICAgIHB1YmxpYyB2b2xhdGlsZSBpbnQgbWF4aW11bV9yZXBsaWNhdGlvbl9mYWN0b3JfZmFpbF90aHJlc2hvbGQgPSAtMTsKKyAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiB6ZXJvX3R0bF9vbl90d2NzX3dhcm5lZCA9IHRydWU7CisgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gemVyb190dGxfb25fdHdjc19lbmFibGVkID0gdHJ1ZTsKIAogICAgIHB1YmxpYyB2b2xhdGlsZSBEdXJhdGlvblNwZWMuTG9uZ05hbm9zZWNvbmRzQm91bmQgc3RyZWFtaW5nX3N0YXRlX2V4cGlyZXMgPSBuZXcgRHVyYXRpb25TcGVjLkxvbmdOYW5vc2Vjb25kc0JvdW5kKCIzZCIpOwogICAgIHB1YmxpYyB2b2xhdGlsZSBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgc3RyZWFtaW5nX3N0YXRlX3NpemUgPSBuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kKCI0ME1pQiIpOwpAQCAtODYxLDYgKzkwNSwxMiBAQAogICAgIHB1YmxpYyB2b2xhdGlsZSBEdXJhdGlvblNwZWMuTG9uZ05hbm9zZWNvbmRzQm91bmQgcmVwYWlyX3N0YXRlX2V4cGlyZXMgPSBuZXcgRHVyYXRpb25TcGVjLkxvbmdOYW5vc2Vjb25kc0JvdW5kKCIzZCIpOwogICAgIHB1YmxpYyB2b2xhdGlsZSBpbnQgcmVwYWlyX3N0YXRlX3NpemUgPSAxMDBfMDAwOwogCisgICAgLyoqIFRoZSBjb25maWd1cmF0aW9uIG9mIHRpbWVzdGFtcCBib3VuZHMgKi8KKyAgICBwdWJsaWMgdm9sYXRpbGUgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBtYXhpbXVtX3RpbWVzdGFtcF93YXJuX3RocmVzaG9sZCA9IG51bGw7CisgICAgcHVibGljIHZvbGF0aWxlIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgbWF4aW11bV90aW1lc3RhbXBfZmFpbF90aHJlc2hvbGQgPSBudWxsOworICAgIHB1YmxpYyB2b2xhdGlsZSBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIG1pbmltdW1fdGltZXN0YW1wX3dhcm5fdGhyZXNob2xkID0gbnVsbDsKKyAgICBwdWJsaWMgdm9sYXRpbGUgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBtaW5pbXVtX3RpbWVzdGFtcF9mYWlsX3RocmVzaG9sZCA9IG51bGw7CisKICAgICAvKioKICAgICAgKiBUaGUgdmFyaWFudHMgb2YgcGF4b3MgaW1wbGVtZW50YXRpb24gYW5kIHNlbWFudGljcyBzdXBwb3J0ZWQgYnkgQ2Fzc2FuZHJhLgogICAgICAqLwpAQCAtOTUxLDcgKzEwMDEsNyBAQAogICAgICAqIHJhcmUgb3BlcmF0aW9uIGNpcmN1bXN0YW5jZXMgZS5nLiB3aGVyZSBmb3Igc29tZSByZWFzb24gdGhlIHJlcGFpciBpcyBpbXBvc3NpYmxlIHRvIHBlcmZvcm0gKGUuZy4gdG9vIGZldyByZXBsaWNhcykKICAgICAgKiBhbmQgYW4gdW5zYWZlIHRvcG9sb2d5IGNoYW5nZSBtdXN0IGJlIG1hZGUKICAgICAgKi8KLSAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBza2lwX3BheG9zX3JlcGFpcl9vbl90b3BvbG9neV9jaGFuZ2UgPSBCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5za2lwX3BheG9zX3JlcGFpcl9vbl90b3BvbG9neV9jaGFuZ2UiKTsKKyAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBza2lwX3BheG9zX3JlcGFpcl9vbl90b3BvbG9neV9jaGFuZ2UgPSBTS0lQX1BBWE9TX1JFUEFJUl9PTl9UT1BPTE9HWV9DSEFOR0UuZ2V0Qm9vbGVhbigpOwogCiAgICAgLyoqCiAgICAgICogQSBzYWZldHkgbWFyZ2luIHdoZW4gcHVyZ2luZyBwYXhvcyBzdGF0ZSBpbmZvcm1hdGlvbiB0aGF0IGhhcyBiZWVuIHNhZmVseSByZXBsaWNhdGVkIHRvIGEgcXVvcnVtLgpAQCAtMTAxMiw3ICsxMDYyLDcgQEAKICAgICAvKioKICAgICAgKiBJZiBuZWNlc3NhcnkgZm9yIG9wZXJhdGlvbmFsIHB1cnBvc2VzLCBwZXJtaXQgY2VydGFpbiBrZXlzcGFjZXMgdG8gYmUgaWdub3JlZCBmb3IgcGF4b3MgdG9wb2xvZ3kgcmVwYWlycwogICAgICAqLwotICAgIHB1YmxpYyB2b2xhdGlsZSBTZXQ8U3RyaW5nPiBza2lwX3BheG9zX3JlcGFpcl9vbl90b3BvbG9neV9jaGFuZ2Vfa2V5c3BhY2VzID0gc3BsaXRDb21tYURlbGltaXRlZChTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5za2lwX3BheG9zX3JlcGFpcl9vbl90b3BvbG9neV9jaGFuZ2Vfa2V5c3BhY2VzIikpOworICAgIHB1YmxpYyB2b2xhdGlsZSBTZXQ8U3RyaW5nPiBza2lwX3BheG9zX3JlcGFpcl9vbl90b3BvbG9neV9jaGFuZ2Vfa2V5c3BhY2VzID0gc3BsaXRDb21tYURlbGltaXRlZChTS0lQX1BBWE9TX1JFUEFJUl9PTl9UT1BPTE9HWV9DSEFOR0VfS0VZU1BBQ0VTLmdldFN0cmluZygpKTsKIAogICAgIC8qKgogICAgICAqIFNlZSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5Db250ZW50aW9uU3RyYXRlZ3l9CkBAIC0xMDM5LDYgKzEwODksMTAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgdm9sYXRpbGUgaW50IHBheG9zX3JlcGFpcl9wYXJhbGxlbGlzbSA9IC0xOwogCisgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gc3N0YWJsZV9yZWFkX3JhdGVfcGVyc2lzdGVuY2VfZW5hYmxlZCA9IGZhbHNlOworCisgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gY2xpZW50X3JlcXVlc3Rfc2l6ZV9tZXRyaWNzX2VuYWJsZWQgPSB0cnVlOworCiAgICAgcHVibGljIHZvbGF0aWxlIGludCBtYXhfdG9wX3NpemVfcGFydGl0aW9uX2NvdW50ID0gMTA7CiAgICAgcHVibGljIHZvbGF0aWxlIGludCBtYXhfdG9wX3RvbWJzdG9uZV9wYXJ0aXRpb25fY291bnQgPSAxMDsKICAgICBwdWJsaWMgdm9sYXRpbGUgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIG1pbl90cmFja2VkX3BhcnRpdGlvbl9zaXplID0gbmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCgiMU1pQiIpOwpAQCAtMTE3MCw0ICsxMjI0LDkgQEAKIAogICAgICAgICBsb2dnZXIuaW5mbygiTm9kZSBjb25maWd1cmF0aW9uOlt7fV0iLCBKb2luZXIub24oIjsgIikuam9pbihjb25maWdNYXAuZW50cnlTZXQoKSkpOwogICAgIH0KKworICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIGR1bXBfaGVhcF9vbl91bmNhdWdodF9leGNlcHRpb24gPSBmYWxzZTsKKyAgICBwdWJsaWMgU3RyaW5nIGhlYXBfZHVtcF9wYXRoID0gImhlYXBkdW1wIjsKKworICAgIHB1YmxpYyBkb3VibGUgc2V2ZXJpdHlfZHVyaW5nX2RlY29tbWlzc2lvbiA9IDA7CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRGF0YWJhc2VEZXNjcmlwdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRGF0YWJhc2VEZXNjcmlwdG9yLmphdmEKaW5kZXggYTA0ZTg1Yy4uMjUzMWU1YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0RhdGFiYXNlRGVzY3JpcHRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9EYXRhYmFzZURlc2NyaXB0b3IuamF2YQpAQCAtMTgsNiArMTgsOCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWc7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50Lk1hbmFnZW1lbnRGYWN0b3J5OworaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50LlJ1bnRpbWVNWEJlYW47CiBpbXBvcnQgamF2YS5uZXQuSW5ldDRBZGRyZXNzOwogaW1wb3J0IGphdmEubmV0LkluZXQ2QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKQEAgLTI1LDI0ICsyNywzMyBAQAogaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTdG9yZTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsRG91YmxlOworaW1wb3J0IGphdmEudXRpbC5TZXJ2aWNlTG9hZGVyOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKLQoraW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuTG9uZ3M7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlJhdGVMaW1pdGVyOwpAQCAtNTEsNiArNjIsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5jb25jdXJyZW50dHJlZXMuY29tbW9uLkl0ZXJhYmxlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdWRpdC5BdWRpdExvZ09wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5BbGxvd0FsbEludGVybm9kZUF1dGhlbnRpY2F0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5BdXRoQ29uZmlnOwpAQCAtNzIsNiArODQsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmZxbC5GdWxsUXVlcnlMb2dnZXJPcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5JRmFpbHVyZURldGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwpAQCAtOTAsOSArMTA0LDI5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5QYXhvczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFMTE9DQVRFX1RPS0VOU19GT1JfS0VZU1BBQ0U7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQUxMT1dfVU5MSU1JVEVEX0NPTkNVUlJFTlRfVkFMSURBVElPTlM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQVVUT19CT09UU1RSQVA7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09ORklHX0xPQURFUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESVNBQkxFX1NUQ1NfSU5fTDA7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSU5JVElBTF9UT0tFTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JT19ORVRUWV9UUkFOU1BPUlRfRVNUSU1BVEVfU0laRV9PTl9TVUJNSVQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTkFUSVZFX1RSQU5TUE9SVF9QT1JUOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk9TX0FSQ0g7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFSVElUSU9ORVI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUkVQTEFDRV9BRERSRVNTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFUExBQ0VfQUREUkVTU19GSVJTVF9CT09UOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFUExBQ0VfTk9ERTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVBMQUNFX1RPS0VOOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNFQVJDSF9DT05DVVJSRU5DWV9GQUNUT1I7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1NMX1NUT1JBR0VfUE9SVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVE9SQUdFX0RJUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVE9SQUdFX1BPUlQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9TVFJJQ1RfUlVOVElNRV9DSEVDS1M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1VOX0FSQ0hfREFUQV9NT0RFTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0ZBSUxfTVZfTE9DS1NfQ09VTlQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9KVk1fRFRFU1RfRElTQUJMRV9TU0w7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVU5TQUZFX1NZU1RFTTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFSYXRlU3BlYy5EYXRhUmF0ZVVuaXQuQllURVNfUEVSX1NFQ09ORDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFSYXRlU3BlYy5EYXRhUmF0ZVVuaXQuTUVCSUJZVEVTX1BFUl9TRUNPTkQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWMuRGF0YVN0b3JhZ2VVbml0Lk1FQklCWVRFUzsKQEAgLTEwNiw3ICsxNDAsNyBAQAogICAgIHsKICAgICAgICAgLy8gVGhpcyBzdGF0aWMgYmxvY2sgY292ZXJzIG1vc3QgdXNhZ2VzCiAgICAgICAgIEZCVXRpbGl0aWVzLnByZXZlbnRJbGxlZ2FsQWNjZXNzV2FybmluZ3MoKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJpby5uZXR0eS50cmFuc3BvcnQuZXN0aW1hdGVTaXplT25TdWJtaXQiLCAiZmFsc2UiKTsKKyAgICAgICAgSU9fTkVUVFlfVFJBTlNQT1JUX0VTVElNQVRFX1NJWkVfT05fU1VCTUlULnNldEJvb2xlYW4oZmFsc2UpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEYXRhYmFzZURlc2NyaXB0b3IuY2xhc3MpOwpAQCAtMTY0LDI0ICsxOTgsMjkgQEAKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHRvb2xJbml0aWFsaXplZDsKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRhZW1vbkluaXRpYWxpemVkOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNlYXJjaENvbmN1cnJlbmN5RmFjdG9yID0gSW50ZWdlci5wYXJzZUludChTeXN0ZW0uZ2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJzZWFyY2hfY29uY3VycmVuY3lfZmFjdG9yIiwgIjEiKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHNlYXJjaENvbmN1cnJlbmN5RmFjdG9yID0gU0VBUkNIX0NPTkNVUlJFTkNZX0ZBQ1RPUi5nZXRJbnQoKTsKICAgICBwcml2YXRlIHN0YXRpYyBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kIGF1dG9TbmFwc2hvVHRsOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBkaXNhYmxlU1RDU0luTDAgPSBCb29sZWFuLmdldEJvb2xlYW4oQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJkaXNhYmxlX3N0Y3NfaW5fbDAiKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHVuc2FmZVN5c3RlbSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInVuc2FmZXN5c3RlbSIpOworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gZGlzYWJsZVNUQ1NJbkwwID0gRElTQUJMRV9TVENTX0lOX0wwLmdldEJvb2xlYW4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHVuc2FmZVN5c3RlbSA9IFVOU0FGRV9TWVNURU0uZ2V0Qm9vbGVhbigpOwogCiAgICAgLy8gdHVybnMgc29tZSB3YXJuaW5ncyBpbnRvIGV4Y2VwdGlvbnMgZm9yIHRlc3RpbmcKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHN0cmljdFJ1bnRpbWVDaGVja3MgPSBCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5zdHJpY3QucnVudGltZS5jaGVja3MiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHN0cmljdFJ1bnRpbWVDaGVja3MgPSBURVNUX1NUUklDVF9SVU5USU1FX0NIRUNLUy5nZXRCb29sZWFuKCk7CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gYWxsb3dVbmxpbWl0ZWRDb25jdXJyZW50VmFsaWRhdGlvbnMgPSBCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5hbGxvd191bmxpbWl0ZWRfY29uY3VycmVudF92YWxpZGF0aW9ucyIpOworICAgIHB1YmxpYyBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBhbGxvd1VubGltaXRlZENvbmN1cnJlbnRWYWxpZGF0aW9ucyA9IEFMTE9XX1VOTElNSVRFRF9DT05DVVJSRU5UX1ZBTElEQVRJT05TLmdldEJvb2xlYW4oKTsKIAotICAgIC8qKiBUaGUgY29uZmlndXJhdGlvbiBmb3IgZ3VhcmRyYWlscy4gKi8KKyAgICAvKioKKyAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBmb3IgZ3VhcmRyYWlscy4KKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBHdWFyZHJhaWxzT3B0aW9ucyBndWFyZHJhaWxzOwogICAgIHByaXZhdGUgc3RhdGljIFN0YXJ0dXBDaGVja3NPcHRpb25zIHN0YXJ0dXBDaGVja3NPcHRpb25zOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgSW1tdXRhYmxlTWFwPFN0cmluZywgU1NUYWJsZUZvcm1hdDw/LCA/Pj4gc3N0YWJsZUZvcm1hdHM7CisgICAgcHJpdmF0ZSBzdGF0aWMgU1NUYWJsZUZvcm1hdDw/LCA/PiBzZWxlY3RlZFNTVGFibGVGb3JtYXQ7CisKICAgICBwcml2YXRlIHN0YXRpYyBGdW5jdGlvbjxDb21taXRMb2csIEFic3RyYWN0Q29tbWl0TG9nU2VnbWVudE1hbmFnZXI+IGNvbW1pdExvZ1NlZ21lbnRNZ3JQcm92aWRlciA9IGMgLT4gRGF0YWJhc2VEZXNjcmlwdG9yLmlzQ0RDRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBDb21taXRMb2dTZWdtZW50TWFuYWdlckNEQyhjLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29tbWl0TG9nTG9jYXRpb24oKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IENvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyU3RhbmRhcmQoYywgRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbW1pdExvZ0xvY2F0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBDb21taXRMb2dTZWdtZW50TWFuYWdlckNEQyhjLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29tbWl0TG9nTG9jYXRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgQ29tbWl0TG9nU2VnbWVudE1hbmFnZXJTdGFuZGFyZChjLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29tbWl0TG9nTG9jYXRpb24oKSk7CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGFlbW9uSW5pdGlhbGl6YXRpb24oKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKQEAgLTI0MSw2ICsyODAsOCBAQAogCiAgICAgICAgIHNldENvbmZpZyhsb2FkQ29uZmlnKCkpOwogCisgICAgICAgIGFwcGx5U1NUYWJsZUZvcm1hdHMoKTsKKwogICAgICAgICBhcHBseVNpbXBsZUNvbmZpZygpOwogCiAgICAgICAgIGFwcGx5UGFydGl0aW9uZXIoKTsKQEAgLTI1OSw2ICszMDAsMTQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBFcXVpdmFsZW50IHRvIHtAbGluayAjY2xpZW50SW5pdGlhbGl6YXRpb24oYm9vbGVhbikgY2xpZW50SW5pdGlhbGl6YXRpb24odHJ1ZSwgQ29uZmlnOjpuZXcpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xpZW50SW5pdGlhbGl6YXRpb24oYm9vbGVhbiBmYWlsSWZEYWVtb25PclRvb2wpCisgICAgeworICAgICAgICBjbGllbnRJbml0aWFsaXphdGlvbihmYWlsSWZEYWVtb25PclRvb2wsIENvbmZpZzo6bmV3KTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBJbml0aWFsaXplcyB0aGlzIGNsYXNzIGFzIGEgY2xpZW50LCB3aGljaCBtZWFucyB0aGF0IGp1c3QgYW4gZW1wdHkgY29uZmlndXJhdGlvbiB3aWxsCiAgICAgICogYmUgdXNlZC4KICAgICAgKgpAQCAtMjY2LDcgKzMxNSw3IEBACiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgI3Rvb2xJbml0aWFsaXphdGlvbigpfSBoYXMgYmVlbiBwZXJmb3JtZWQgYmVmb3JlLCBhbgogICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIEFzc2VydGlvbkVycm9yfSB3aWxsIGJlIHRocm93bi4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xpZW50SW5pdGlhbGl6YXRpb24oYm9vbGVhbiBmYWlsSWZEYWVtb25PclRvb2wpCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsaWVudEluaXRpYWxpemF0aW9uKGJvb2xlYW4gZmFpbElmRGFlbW9uT3JUb29sLCBTdXBwbGllcjxDb25maWc+IGNvbmZpZ1N1cHBsaWVyKQogICAgIHsKICAgICAgICAgaWYgKCFmYWlsSWZEYWVtb25PclRvb2wgJiYgKGRhZW1vbkluaXRpYWxpemVkIHx8IHRvb2xJbml0aWFsaXplZCkpCiAgICAgICAgIHsKQEAgLTI4NSw4ICszMzQsOSBAQAogICAgICAgICBjbGllbnRJbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgIHNldERlZmF1bHRGYWlsdXJlRGV0ZWN0b3IoKTsKICAgICAgICAgQ29uZmlnLnNldENsaWVudE1vZGUodHJ1ZSk7Ci0gICAgICAgIGNvbmYgPSBuZXcgQ29uZmlnKCk7CisgICAgICAgIGNvbmYgPSBjb25maWdTdXBwbGllci5nZXQoKTsKICAgICAgICAgZGlza09wdGltaXphdGlvblN0cmF0ZWd5ID0gbmV3IFNwaW5uaW5nRGlza09wdGltaXphdGlvblN0cmF0ZWd5KCk7CisgICAgICAgIGFwcGx5U1NUYWJsZUZvcm1hdHMoKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDbGllbnRJbml0aWFsaXplZCgpCkBAIC0zMjAsNyArMzcwLDcgQEAKICAgICAgICAgaWYgKENvbmZpZy5nZXRPdmVycmlkZUxvYWRDb25maWcoKSAhPSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIENvbmZpZy5nZXRPdmVycmlkZUxvYWRDb25maWcoKS5nZXQoKTsKIAotICAgICAgICBTdHJpbmcgbG9hZGVyQ2xhc3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJjb25maWcubG9hZGVyIik7CisgICAgICAgIFN0cmluZyBsb2FkZXJDbGFzcyA9IENPTkZJR19MT0FERVIuZ2V0U3RyaW5nKCk7CiAgICAgICAgIENvbmZpZ3VyYXRpb25Mb2FkZXIgbG9hZGVyID0gbG9hZGVyQ2xhc3MgPT0gbnVsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFlhbWxDb25maWd1cmF0aW9uTG9hZGVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZCVXRpbGl0aWVzLmNvbnN0cnVjdChsb2FkZXJDbGFzcywgImNvbmZpZ3VyYXRpb24gbG9hZGluZyIpOwpAQCAtMzczLDYgKzQyMyw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBseUFsbCgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCiAgICAgewogICAgICAgICAvL0luZXRBZGRyZXNzQW5kUG9ydCBjYXJlcyB0aGF0IGFwcGx5U2ltcGxlQ29uZmlnIHJ1bnMgZmlyc3QKKyAgICAgICAgYXBwbHlTU1RhYmxlRm9ybWF0cygpOworCiAgICAgICAgIGFwcGx5U2ltcGxlQ29uZmlnKCk7CiAKICAgICAgICAgYXBwbHlQYXJ0aXRpb25lcigpOwpAQCAtNDgzLDcgKzUzNSw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiY29uY3VycmVudF9yZWFkcyBtdXN0IGJlIGF0IGxlYXN0IDIsIGJ1dCB3YXMgIiArIGNvbmYuY29uY3VycmVudF9yZWFkcywgZmFsc2UpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGNvbmYuY29uY3VycmVudF93cml0ZXMgPCAyICYmIFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRlc3QuZmFpbF9tdl9sb2Nrc19jb3VudCIsICIiKS5pc0VtcHR5KCkpCisgICAgICAgIGlmIChjb25mLmNvbmN1cnJlbnRfd3JpdGVzIDwgMiAmJiBURVNUX0ZBSUxfTVZfTE9DS1NfQ09VTlQuZ2V0U3RyaW5nKCIiKS5pc0VtcHR5KCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJjb25jdXJyZW50X3dyaXRlcyBtdXN0IGJlIGF0IGxlYXN0IDIsIGJ1dCB3YXMgIiArIGNvbmYuY29uY3VycmVudF93cml0ZXMsIGZhbHNlKTsKICAgICAgICAgfQpAQCAtNTQ5LDcgKzYwMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgICAgIH0KIAotICAgICAgICBjaGVja1ZhbGlkRm9yQnl0ZUNvbnZlcnNpb24oY29uZi5jb2x1bW5faW5kZXhfc2l6ZSwgImNvbHVtbl9pbmRleF9zaXplIik7CisgICAgICAgIGlmIChjb25mLmNvbHVtbl9pbmRleF9zaXplICE9IG51bGwpCisgICAgICAgICAgICBjaGVja1ZhbGlkRm9yQnl0ZUNvbnZlcnNpb24oY29uZi5jb2x1bW5faW5kZXhfc2l6ZSwgImNvbHVtbl9pbmRleF9zaXplIik7CiAgICAgICAgIGNoZWNrVmFsaWRGb3JCeXRlQ29udmVyc2lvbihjb25mLmNvbHVtbl9pbmRleF9jYWNoZV9zaXplLCAiY29sdW1uX2luZGV4X2NhY2hlX3NpemUiKTsKICAgICAgICAgY2hlY2tWYWxpZEZvckJ5dGVDb252ZXJzaW9uKGNvbmYuYmF0Y2hfc2l6ZV93YXJuX3RocmVzaG9sZCwgImJhdGNoX3NpemVfd2Fybl90aHJlc2hvbGQiKTsKIApAQCAtODA4LDcgKzg2MSw4IEBACiAgICAgICAgICAgICBsb2dnZXIud2FybigiQWxsb3dpbmcgamF2YS5sYW5nLlN5c3RlbS4qIGFjY2VzcyBpbiBVREZzIGlzIGRhbmdlcm91cyBhbmQgbm90IHJlY29tbWVuZGVkLiBTZXQgYWxsb3dfZXh0cmFfaW5zZWN1cmVfdWRmczogZmFsc2UgdG8gZGlzYWJsZS4iKTsKIAogICAgICAgICBpZihjb25mLnNjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZCkKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJKYXZhU2NyaXB0IHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQuIFlvdSBjYW4gc3RpbGwgdXNlIHRoZW0gYnV0IHRoZSBwbGFuIGlzIHRvIHJlbW92ZSB0aGVtIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uIC0gQ0FTU0FORFJBLTE3MjgwIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiSmF2YVNjcmlwdCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIHdlcmUgcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTgyNTIuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvb2tzIGFyZSBwbGFubmVkIHRvIGJlIGludHJvZHVjZWQgYXMgcGFydCBvZiBDQVNTQU5EUkEtMTcyODAiKTsKIAogICAgICAgICBpZiAoY29uZi5jb21taXRsb2dfc2VnbWVudF9zaXplLnRvTWViaWJ5dGVzKCkgPT0gMCkKICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJjb21taXRsb2dfc2VnbWVudF9zaXplIG11c3QgYmUgcG9zaXRpdmUsIGJ1dCB3YXMgIgpAQCAtOTA2LDYgKzk2MCwxMiBAQAogICAgICAgICAgICAgY29uZi5wYXhvc19zdGF0ZV9wdXJnaW5nID0gUGF4b3NTdGF0ZVB1cmdpbmcubGVnYWN5OwogCiAgICAgICAgIGxvZ0luaXRpYWxpemF0aW9uT3V0Y29tZShsb2dnZXIpOworCisgICAgICAgIGlmIChjb25mLm1heF9zcGFjZV91c2FibGVfZm9yX2NvbXBhY3Rpb25zX2luX3BlcmNlbnRhZ2UgPCAwIHx8IGNvbmYubWF4X3NwYWNlX3VzYWJsZV9mb3JfY29tcGFjdGlvbnNfaW5fcGVyY2VudGFnZSA+IDEpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigibWF4X3NwYWNlX3VzYWJsZV9mb3JfY29tcGFjdGlvbnNfaW5fcGVyY2VudGFnZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMSIsIGZhbHNlKTsKKworICAgICAgICBpZiAoY29uZi5kdW1wX2hlYXBfb25fdW5jYXVnaHRfZXhjZXB0aW9uICYmIERhdGFiYXNlRGVzY3JpcHRvci5nZXRIZWFwRHVtcFBhdGgoKSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBjb25maWd1cmF0aW9uLiBIZWFwIGR1bXAgaXMgZW5hYmxlZCBidXQgY2Fubm90IGNyZWF0ZSBoZWFwIGR1bXAgb3V0cHV0IHBhdGg6ICVzLiIsIGNvbmYuaGVhcF9kdW1wX3BhdGggIT0gbnVsbCA/IGNvbmYuaGVhcF9kdW1wX3BhdGggOiAibnVsbCIpKTsKICAgICB9CiAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKQEAgLTk0OCw3ICsxMDA4LDcgQEAKICAgICAgICAgZWxzZSBpZiAoY29uZmlnLmNvbmN1cnJlbnRfdmFsaWRhdGlvbnMgPiBjb25maWcuY29uY3VycmVudF9jb21wYWN0b3JzICYmICFhbGxvd1VubGltaXRlZENvbmN1cnJlbnRWYWxpZGF0aW9ucykKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIlRvIHNldCBjb25jdXJyZW50X3ZhbGlkYXRpb25zID4gY29uY3VycmVudF9jb21wYWN0b3JzLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXQgdGhlIHN5c3RlbSBwcm9wZXJ0eSBjYXNzYW5kcmEuYWxsb3dfdW5saW1pdGVkX2NvbmN1cnJlbnRfdmFsaWRhdGlvbnM9dHJ1ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldCB0aGUgc3lzdGVtIHByb3BlcnR5IC1EIiArIEFMTE9XX1VOTElNSVRFRF9DT05DVVJSRU5UX1ZBTElEQVRJT05TLmdldEtleSgpICsgIj10cnVlIik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEwMDksOSArMTA2OSw5IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3RvcmFnZWRpcihTdHJpbmcgZXJyTXNnVHlwZSkKICAgICB7Ci0gICAgICAgIFN0cmluZyBzdG9yYWdlZGlyID0gU3lzdGVtLmdldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAic3RvcmFnZWRpciIsIG51bGwpOworICAgICAgICBTdHJpbmcgc3RvcmFnZWRpciA9IFNUT1JBR0VfRElSLmdldFN0cmluZygpOwogICAgICAgICBpZiAoc3RvcmFnZWRpciA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oZXJyTXNnVHlwZSArICIgaXMgbWlzc2luZyBhbmQgLURjYXNzYW5kcmEuc3RvcmFnZWRpciBpcyBub3Qgc2V0IiwgZmFsc2UpOworICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oZXJyTXNnVHlwZSArICIgaXMgbWlzc2luZyBhbmQgIiArIFNUT1JBR0VfRElSLmdldEtleSgpICsgIiBzeXN0ZW0gcHJvcGVydHkgaXMgbm90IHNldCIsIGZhbHNlKTsKICAgICAgICAgcmV0dXJuIHN0b3JhZ2VkaXI7CiAgICAgfQogCkBAIC0xMzA2LDcgKzEzNjYsNyBAQAogICAgICAgICBTdHJpbmcgbmFtZSA9IGNvbmYucGFydGl0aW9uZXI7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAicGFydGl0aW9uZXIiLCBjb25mLnBhcnRpdGlvbmVyKTsKKyAgICAgICAgICAgIG5hbWUgPSBQQVJUSVRJT05FUi5nZXRTdHJpbmcoY29uZi5wYXJ0aXRpb25lcik7CiAgICAgICAgICAgICBwYXJ0aXRpb25lciA9IEZCVXRpbGl0aWVzLm5ld1BhcnRpdGlvbmVyKG5hbWUpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKQEAgLTEzMTcsMTAgKzEzNzcsOTUgQEAKICAgICAgICAgcGFyaXRpb25lck5hbWUgPSBwYXJ0aXRpb25lci5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlU1NUYWJsZUZvcm1hdEZhY3RvcmllcyhJdGVyYWJsZTxTU1RhYmxlRm9ybWF0LkZhY3Rvcnk+IGZhY3RvcmllcykKKyAgICB7CisgICAgICAgIE1hcDxTdHJpbmcsIFNTVGFibGVGb3JtYXQuRmFjdG9yeT4gZmFjdG9yeUJ5TmFtZSA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChTU1RhYmxlRm9ybWF0LkZhY3RvcnkgZmFjdG9yeSA6IGZhY3RvcmllcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZhY3RvcnkubmFtZSgpID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiU1NUYWJsZSBmb3JtYXQgbmFtZSBpbiAlcyBjYW5ub3QgYmUgbnVsbCIsIGZhY3RvcnkuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpKTsKKworICAgICAgICAgICAgaWYgKCFmYWN0b3J5Lm5hbWUoKS5tYXRjaGVzKCJeW2Etel0rJCIpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlNTVGFibGUgZm9ybWF0IG5hbWUgZm9yICVzIG11c3QgYmUgbm9uLWVtcHR5LCBsb3dlci1jYXNlIGxldHRlcnMgb25seSBzdHJpbmciLCBmYWN0b3J5LmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpKSk7CisKKyAgICAgICAgICAgIFNTVGFibGVGb3JtYXQuRmFjdG9yeSBwcmV2ID0gZmFjdG9yeUJ5TmFtZS5wdXQoZmFjdG9yeS5uYW1lKCksIGZhY3RvcnkpOworICAgICAgICAgICAgaWYgKHByZXYgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJNdWx0aXBsZSBzc3RhYmxlIGZvcm1hdCBpbXBsZW1lbnRhdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lICVzOiAlcyBhbmQgJXMiLCBmYWN0b3J5Lm5hbWUoKSwgZmFjdG9yeS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSwgcHJldi5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSW1tdXRhYmxlTWFwPFN0cmluZywgU3VwcGxpZXI8U1NUYWJsZUZvcm1hdDw/LCA/Pj4+IHZhbGlkYXRlQW5kTWF0Y2hTU1RhYmxlRm9ybWF0T3B0aW9ucyhJdGVyYWJsZTxTU1RhYmxlRm9ybWF0LkZhY3Rvcnk+IGZhY3RvcmllcywgTWFwPFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gb3B0aW9ucykKKyAgICB7CisgICAgICAgIEltbXV0YWJsZU1hcC5CdWlsZGVyPFN0cmluZywgU3VwcGxpZXI8U1NUYWJsZUZvcm1hdDw/LCA/Pj4+IHByb3ZpZGVyc0J1aWxkZXIgPSBJbW11dGFibGVNYXAuYnVpbGRlcigpOworICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgb3B0aW9ucyA9IEltbXV0YWJsZU1hcC5vZigpOworICAgICAgICBmb3IgKFNTVGFibGVGb3JtYXQuRmFjdG9yeSBmYWN0b3J5IDogZmFjdG9yaWVzKQorICAgICAgICB7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGZvcm1hdE9wdGlvbnMgPSBvcHRpb25zLmdldE9yRGVmYXVsdChmYWN0b3J5Lm5hbWUoKSwgSW1tdXRhYmxlTWFwLm9mKCkpOworICAgICAgICAgICAgcHJvdmlkZXJzQnVpbGRlci5wdXQoZmFjdG9yeS5uYW1lKCksICgpIC0+IGZhY3RvcnkuZ2V0SW5zdGFuY2UoSW1tdXRhYmxlTWFwLmNvcHlPZihmb3JtYXRPcHRpb25zKSkpOworICAgICAgICB9CisgICAgICAgIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN1cHBsaWVyPFNTVGFibGVGb3JtYXQ8PywgPz4+PiBwcm92aWRlcnMgPSBwcm92aWRlcnNCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldHMuU2V0VmlldzxTdHJpbmc+IHVua25vd25Gb3JtYXROYW1lcyA9IFNldHMuZGlmZmVyZW5jZShvcHRpb25zLmtleVNldCgpLCBwcm92aWRlcnMua2V5U2V0KCkpOworICAgICAgICAgICAgaWYgKCF1bmtub3duRm9ybWF0TmFtZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNvbmZpZ3VyYXRpb24gY29udGFpbnMgb3B0aW9ucyBvZiB1bmtub3duIHNzdGFibGUgZm9ybWF0czogJXMiLCB1bmtub3duRm9ybWF0TmFtZXMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvdmlkZXJzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFNTVGFibGVGb3JtYXQ8PywgPz4gZ2V0QW5kVmFsaWRhdGVXcml0ZUZvcm1hdChNYXA8U3RyaW5nLCBTU1RhYmxlRm9ybWF0PD8sID8+PiBzc3RhYmxlRm9ybWF0cywgU3RyaW5nIHNlbGVjdGVkRm9ybWF0TmFtZSkKKyAgICB7CisgICAgICAgIFNTVGFibGVGb3JtYXQ8PywgPz4gc2VsZWN0ZWRGb3JtYXQ7CisgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0JsYW5rKHNlbGVjdGVkRm9ybWF0TmFtZSkpCisgICAgICAgICAgICBzZWxlY3RlZEZvcm1hdE5hbWUgPSBCaWdGb3JtYXQuTkFNRTsKKyAgICAgICAgc2VsZWN0ZWRGb3JtYXQgPSBzc3RhYmxlRm9ybWF0cy5nZXQoc2VsZWN0ZWRGb3JtYXROYW1lKTsKKyAgICAgICAgaWYgKHNlbGVjdGVkRm9ybWF0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJTZWxlY3RlZCBzc3RhYmxlIGZvcm1hdCAnJXMnIGlzIG5vdCBhdmFpbGFibGUuIiwgc2VsZWN0ZWRGb3JtYXROYW1lKSk7CisKKyAgICAgICAgcmV0dXJuIHNlbGVjdGVkRm9ybWF0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwbHlTU1RhYmxlRm9ybWF0cygpCisgICAgeworICAgICAgICBTZXJ2aWNlTG9hZGVyPFNTVGFibGVGb3JtYXQuRmFjdG9yeT4gbG9hZGVyID0gU2VydmljZUxvYWRlci5sb2FkKFNTVGFibGVGb3JtYXQuRmFjdG9yeS5jbGFzcywgRGF0YWJhc2VEZXNjcmlwdG9yLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICBMaXN0PFNTVGFibGVGb3JtYXQuRmFjdG9yeT4gZmFjdG9yaWVzID0gSXRlcmFibGVzLnRvTGlzdChsb2FkZXIpOworICAgICAgICBpZiAoZmFjdG9yaWVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGZhY3RvcmllcyA9IEltbXV0YWJsZUxpc3Qub2YobmV3IEJpZ0Zvcm1hdC5CaWdGb3JtYXRGYWN0b3J5KCkpOworICAgICAgICBhcHBseVNTVGFibGVGb3JtYXRzKGZhY3RvcmllcywgY29uZi5zc3RhYmxlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGx5U1NUYWJsZUZvcm1hdHMoSXRlcmFibGU8U1NUYWJsZUZvcm1hdC5GYWN0b3J5PiBmYWN0b3JpZXMsIENvbmZpZy5TU1RhYmxlQ29uZmlnIHNzdGFibGVGb3JtYXRzQ29uZmlnKQorICAgIHsKKyAgICAgICAgaWYgKHNzdGFibGVGb3JtYXRzICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgdmFsaWRhdGVTU1RhYmxlRm9ybWF0RmFjdG9yaWVzKGZhY3Rvcmllcyk7CisgICAgICAgIEltbXV0YWJsZU1hcDxTdHJpbmcsIFN1cHBsaWVyPFNTVGFibGVGb3JtYXQ8PywgPz4+PiBwcm92aWRlcnMgPSB2YWxpZGF0ZUFuZE1hdGNoU1NUYWJsZUZvcm1hdE9wdGlvbnMoZmFjdG9yaWVzLCBzc3RhYmxlRm9ybWF0c0NvbmZpZy5mb3JtYXQpOworCisgICAgICAgIEltbXV0YWJsZU1hcC5CdWlsZGVyPFN0cmluZywgU1NUYWJsZUZvcm1hdDw/LCA/Pj4gc3N0YWJsZUZvcm1hdHNCdWlsZGVyID0gSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKTsKKyAgICAgICAgcHJvdmlkZXJzLmZvckVhY2goKG5hbWUsIHByb3ZpZGVyKSAtPiB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzc3RhYmxlRm9ybWF0c0J1aWxkZXIucHV0KG5hbWUsIHByb3ZpZGVyLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHwgRXJyb3IgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIGluc3RhbnRpYXRlIHNzdGFibGUgZm9ybWF0ICclcyciLCBuYW1lKSwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgc3N0YWJsZUZvcm1hdHMgPSBzc3RhYmxlRm9ybWF0c0J1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICBzZWxlY3RlZFNTVGFibGVGb3JtYXQgPSBnZXRBbmRWYWxpZGF0ZVdyaXRlRm9ybWF0KHNzdGFibGVGb3JtYXRzLCBzc3RhYmxlRm9ybWF0c0NvbmZpZy5zZWxlY3RlZF9mb3JtYXQpOworCisgICAgICAgIHNzdGFibGVGb3JtYXRzLnZhbHVlcygpLmZvckVhY2goU1NUYWJsZUZvcm1hdDo6YWxsQ29tcG9uZW50cyk7IC8vIG1ha2Ugc3VyZSB0byByZWFjaCBhbGwgc3VwcG9ydGVkIGNvbXBvbmVudHMgZm9yIGEgdHlwZSBzbyB0aGF0IHdlIGtub3cgYWxsIG9mIHRoZW0gYXJlIHJlZ2lzdGVyZWQKKyAgICAgICAgbG9nZ2VyLmluZm8oIlN1cHBvcnRlZCBzc3RhYmxlIGZvcm1hdHMgYXJlOiB7fSIsIHNzdGFibGVGb3JtYXRzLnZhbHVlcygpLnN0cmVhbSgpLm1hcChmIC0+IGYubmFtZSgpICsgIiAtPiAiICsgZi5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgd2l0aCBzaW5nbGV0b24gY29tcG9uZW50czogIiArIGYuYWxsQ29tcG9uZW50cygpKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENvbXB1dGVzIHRoZSBzdW0gb2YgdGhlIDIgc3BlY2lmaWVkIHBvc2l0aXZlIHZhbHVlcyByZXR1cm5pbmcge0Bjb2RlIExvbmcuTUFYX1ZBTFVFfSBpZiB0aGUgc3VtIG92ZXJmbG93LgogICAgICAqCi0gICAgICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgb3BlcmFuZAorICAgICAqIEBwYXJhbSBsZWZ0ICB0aGUgbGVmdCBvcGVyYW5kCiAgICAgICogQHBhcmFtIHJpZ2h0IHRoZSByaWdodCBvcGVyYW5kCiAgICAgICogQHJldHVybiB0aGUgc3VtIG9mIHRoZSAyIHNwZWNpZmllZCBwb3NpdGl2ZSB2YWx1ZXMgb2Yge0Bjb2RlIExvbmcuTUFYX1ZBTFVFfSBpZiB0aGUgc3VtIG92ZXJmbG93LgogICAgICAqLwpAQCAtMTU4Miw2ICsxNzI3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJjZGNfcmF3X2RpcmVjdG9yeSBtdXN0IGJlIHNwZWNpZmllZCIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuY3JlYXRlRGlyZWN0b3J5KGNvbmYuY2RjX3Jhd19kaXJlY3RvcnkpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIGNyZWF0ZWQgPSBtYXliZUNyZWF0ZUhlYXBEdW1wUGF0aCgpOworICAgICAgICAgICAgaWYgKCFjcmVhdGVkICYmIGNvbmYuZHVtcF9oZWFwX29uX3VuY2F1Z2h0X2V4Y2VwdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoU3RyaW5nLmZvcm1hdCgiY2Fzc2FuZHJhLnlhbWw6ZHVtcF9oZWFwX29uX3VuY2F1Z2h0X2V4Y2VwdGlvbiBpcyBlbmFibGVkIGJ1dCB1bmFibGUgdG8gY3JlYXRlIGhlYXAgZHVtcCBwYXRoICVzLiBEaXNhYmxpbmcuIiwgY29uZi5oZWFwX2R1bXBfcGF0aCAhPSBudWxsID8gY29uZi5oZWFwX2R1bXBfcGF0aCA6ICJudWxsIikpOworICAgICAgICAgICAgICAgIGNvbmYuZHVtcF9oZWFwX29uX3VuY2F1Z2h0X2V4Y2VwdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKQEAgLTE2MzAsMTkgKzE3ODIsMTkgQEAKICAgICAgICAgbmV3RmFpbHVyZURldGVjdG9yID0gKCkgLT4gY3JlYXRlRmFpbHVyZURldGVjdG9yKCJGYWlsdXJlRGV0ZWN0b3IiKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRDb2x1bW5JbmRleFNpemUoKQorICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldENvbHVtbkluZGV4U2l6ZShpbnQgZGVmYXVsdFZhbHVlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuY29sdW1uX2luZGV4X3NpemUudG9CeXRlcygpOworICAgICAgICByZXR1cm4gY29uZi5jb2x1bW5faW5kZXhfc2l6ZSAhPSBudWxsID8gY29uZi5jb2x1bW5faW5kZXhfc2l6ZS50b0J5dGVzKCkgOiBkZWZhdWx0VmFsdWU7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuY29sdW1uX2luZGV4X3NpemUudG9LaWJpYnl0ZXMoKTsKKyAgICAgICAgcmV0dXJuIGNvbmYuY29sdW1uX2luZGV4X3NpemUgIT0gbnVsbCA/IGNvbmYuY29sdW1uX2luZGV4X3NpemUudG9LaWJpYnl0ZXMoKSA6IC0xOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb2x1bW5JbmRleFNpemUoaW50IHZhbCkKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoaW50IHZhbCkKICAgICB7Ci0gICAgICAgIGNvbmYuY29sdW1uX2luZGV4X3NpemUgPSAgY3JlYXRlSW50S2liaWJ5dGVCb3VuZEFuZEVuc3VyZUl0SXNWYWxpZEZvckJ5dGVDb252ZXJzaW9uKHZhbCwiY29sdW1uX2luZGV4X3NpemUiKTsKKyAgICAgICAgY29uZi5jb2x1bW5faW5kZXhfc2l6ZSA9IHZhbCAhPSAtMSA/IGNyZWF0ZUludEtpYmlieXRlQm91bmRBbmRFbnN1cmVJdElzVmFsaWRGb3JCeXRlQ29udmVyc2lvbih2YWwsImNvbHVtbl9pbmRleF9zaXplIikgOiBudWxsOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldENvbHVtbkluZGV4Q2FjaGVTaXplKCkKQEAgLTE2OTcsMTIgKzE4NDksMTIgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEluaXRpYWxUb2tlbnMoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHRva2Vuc0Zyb21TdHJpbmcoU3lzdGVtLmdldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiaW5pdGlhbF90b2tlbiIsIGNvbmYuaW5pdGlhbF90b2tlbikpOworICAgICAgICByZXR1cm4gdG9rZW5zRnJvbVN0cmluZyhJTklUSUFMX1RPS0VOLmdldFN0cmluZyhjb25mLmluaXRpYWxfdG9rZW4pKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBbGxvY2F0ZVRva2Vuc0ZvcktleXNwYWNlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJhbGxvY2F0ZV90b2tlbnNfZm9yX2tleXNwYWNlIiwgY29uZi5hbGxvY2F0ZV90b2tlbnNfZm9yX2tleXNwYWNlKTsKKyAgICAgICAgcmV0dXJuIEFMTE9DQVRFX1RPS0VOU19GT1JfS0VZU1BBQ0UuZ2V0U3RyaW5nKGNvbmYuYWxsb2NhdGVfdG9rZW5zX2Zvcl9rZXlzcGFjZSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIGdldEFsbG9jYXRlVG9rZW5zRm9yTG9jYWxSZigpCkBAIC0xNzI4LDEwICsxODgwLDE0IEBACiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInJlcGxhY2VfYWRkcmVzcyIsIG51bGwpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoU3lzdGVtLmdldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAicmVwbGFjZV9hZGRyZXNzIiwgbnVsbCkpOwotICAgICAgICAgICAgZWxzZSBpZiAoU3lzdGVtLmdldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAicmVwbGFjZV9hZGRyZXNzX2ZpcnN0X2Jvb3QiLCBudWxsKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInJlcGxhY2VfYWRkcmVzc19maXJzdF9ib290IiwgbnVsbCkpOworICAgICAgICAgICAgU3RyaW5nIHJlcGxhY2VBZGRyZXNzID0gUkVQTEFDRV9BRERSRVNTLmdldFN0cmluZygpOworICAgICAgICAgICAgaWYgKHJlcGxhY2VBZGRyZXNzICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUocmVwbGFjZUFkZHJlc3MpOworCisgICAgICAgICAgICBTdHJpbmcgcmVwbGFjZUFkZHJlc3NGaXJzc3RCb290ID0gUkVQTEFDRV9BRERSRVNTX0ZJUlNUX0JPT1QuZ2V0U3RyaW5nKCk7CisgICAgICAgICAgICBpZiAocmVwbGFjZUFkZHJlc3NGaXJzc3RCb290ICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUocmVwbGFjZUFkZHJlc3NGaXJzc3RCb290KTsKKwogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpCkBAIC0xNzQyLDE0ICsxODk4LDE0IEBACiAKICAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRSZXBsYWNlVG9rZW5zKCkKICAgICB7Ci0gICAgICAgIHJldHVybiB0b2tlbnNGcm9tU3RyaW5nKFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInJlcGxhY2VfdG9rZW4iLCBudWxsKSk7CisgICAgICAgIHJldHVybiB0b2tlbnNGcm9tU3RyaW5nKFJFUExBQ0VfVE9LRU4uZ2V0U3RyaW5nKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgVVVJRCBnZXRSZXBsYWNlTm9kZSgpCiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFVVSUQuZnJvbVN0cmluZyhTeXN0ZW0uZ2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJyZXBsYWNlX25vZGUiLCBudWxsKSk7CisgICAgICAgICAgICByZXR1cm4gVVVJRC5mcm9tU3RyaW5nKFJFUExBQ0VfTk9ERS5nZXRTdHJpbmcoKSk7CiAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBudWxsOwpAQCAtMTc2MywxMiArMTkxOSwxMiBAQAogCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3RvcmFnZVBvcnQoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoU3lzdGVtLmdldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAic3RvcmFnZV9wb3J0IiwgSW50ZWdlci50b1N0cmluZyhjb25mLnN0b3JhZ2VfcG9ydCkpKTsKKyAgICAgICAgcmV0dXJuIFNUT1JBR0VfUE9SVC5nZXRJbnQoY29uZi5zdG9yYWdlX3BvcnQpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFNTTFN0b3JhZ2VQb3J0KCkKICAgICB7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInNzbF9zdG9yYWdlX3BvcnQiLCBJbnRlZ2VyLnRvU3RyaW5nKGNvbmYuc3NsX3N0b3JhZ2VfcG9ydCkpKTsKKyAgICAgICAgcmV0dXJuIFNTTF9TVE9SQUdFX1BPUlQuZ2V0SW50KGNvbmYuc3NsX3N0b3JhZ2VfcG9ydCk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBsb25nIG5hdGl2ZVRyYW5zcG9ydElkbGVUaW1lb3V0KCkKQEAgLTIwMTYsNyArMjE3MiwxMSBAQAogICAgICAgICBjb25mLmNvbXBhY3Rpb25fdGhyb3VnaHB1dCA9IG5ldyBEYXRhUmF0ZVNwZWMuTG9uZ0J5dGVzUGVyU2Vjb25kQm91bmQodmFsdWUsIE1FQklCWVRFU19QRVJfU0VDT05EKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0Q29tcGFjdGlvbkxhcmdlUGFydGl0aW9uV2FybmluZ1RocmVzaG9sZCgpIHsgcmV0dXJuIGNvbmYuY29tcGFjdGlvbl9sYXJnZV9wYXJ0aXRpb25fd2FybmluZ190aHJlc2hvbGQudG9CeXRlc0luTG9uZygpOyB9CisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0Q29tcGFjdGlvbkxhcmdlUGFydGl0aW9uV2FybmluZ1RocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZi5jb21wYWN0aW9uX2xhcmdlX3BhcnRpdGlvbl93YXJuaW5nX3RocmVzaG9sZC50b0J5dGVzSW5Mb25nKCk7CisgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Q29tcGFjdGlvblRvbWJzdG9uZVdhcm5pbmdUaHJlc2hvbGQoKQogICAgIHsKQEAgLTIwMzMsNiArMjE5MywxMSBAQAogICAgICAgICByZXR1cm4gY29uZi5jb25jdXJyZW50X3ZhbGlkYXRpb25zOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldENvbmN1cnJlbnRJbmRleEJ1aWxkZXJzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25mLmNvbmN1cnJlbnRfaW5kZXhfYnVpbGRlcnM7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldENvbmN1cnJlbnRWYWxpZGF0aW9ucyhpbnQgdmFsdWUpCiAgICAgewogICAgICAgICB2YWx1ZSA9IHZhbHVlID4gMCA/IHZhbHVlIDogSW50ZWdlci5NQVhfVkFMVUU7CkBAIC0yMDQ5LDExICsyMjE0LDMzIEBACiAgICAgICAgIGNvbmYuY29uY3VycmVudF9tYXRlcmlhbGl6ZWRfdmlld19idWlsZGVycyA9IHZhbHVlOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRNaW5GcmVlU3BhY2VQZXJEcml2ZUluTWViaWJ5dGVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25mLm1pbl9mcmVlX3NwYWNlX3Blcl9kcml2ZS50b01lYmlieXRlcygpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRNaW5GcmVlU3BhY2VQZXJEcml2ZUluQnl0ZXMoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGNvbmYubWluX2ZyZWVfc3BhY2VfcGVyX2RyaXZlLnRvQnl0ZXNJbkxvbmcoKTsKICAgICB9CiAKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgc2V0TWluRnJlZVNwYWNlUGVyRHJpdmVJbk1lYmlieXRlcyhsb25nIG1lYmlCeXRlcykKKyAgICB7CisgICAgICAgIGNvbmYubWluX2ZyZWVfc3BhY2VfcGVyX2RyaXZlID0gbmV3IERhdGFTdG9yYWdlU3BlYy5JbnRNZWJpYnl0ZXNCb3VuZChtZWJpQnl0ZXMpOworICAgICAgICByZXR1cm4gZ2V0TWluRnJlZVNwYWNlUGVyRHJpdmVJbkJ5dGVzKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0TWF4U3BhY2VGb3JDb21wYWN0aW9uc1BlckRyaXZlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25mLm1heF9zcGFjZV91c2FibGVfZm9yX2NvbXBhY3Rpb25zX2luX3BlcmNlbnRhZ2U7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE1heFNwYWNlRm9yQ29tcGFjdGlvbnNQZXJEcml2ZShkb3VibGUgcGVyY2VudGFnZSkKKyAgICB7CisgICAgICAgIGNvbmYubWF4X3NwYWNlX3VzYWJsZV9mb3JfY29tcGFjdGlvbnNfaW5fcGVyY2VudGFnZSA9IHBlcmNlbnRhZ2U7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldERpc2FibGVTVENTSW5MMCgpCiAgICAgewogICAgICAgICByZXR1cm4gZGlzYWJsZVNUQ1NJbkwwOwpAQCAtMjU0OCw3ICsyNzM1LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGludCBnZXROYXRpdmVUcmFuc3BvcnRQb3J0KCkKICAgICB7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgIm5hdGl2ZV90cmFuc3BvcnRfcG9ydCIsIEludGVnZXIudG9TdHJpbmcoY29uZi5uYXRpdmVfdHJhbnNwb3J0X3BvcnQpKSk7CisgICAgICAgIHJldHVybiBOQVRJVkVfVFJBTlNQT1JUX1BPUlQuZ2V0SW50KGNvbmYubmF0aXZlX3RyYW5zcG9ydF9wb3J0KTsKICAgICB9CiAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKQEAgLTI1NzgsNiArMjc2NSwyMiBAQAogICAgICAgICBjb25mLm5hdGl2ZV90cmFuc3BvcnRfbWF4X3RocmVhZHMgPSBtYXhfdGhyZWFkczsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgZ2V0TmF0aXZlVHJhbnNwb3J0TWF4QXV0aFRocmVhZHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmYubmF0aXZlX3RyYW5zcG9ydF9tYXhfYXV0aF90aHJlYWRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHRoaXMgdmFsdWUgaXMgc2V0IHRvIDw9IDAgaXQgd2lsbCBtb3ZlIGF1dGggcmVxdWVzdHMgdG8gdGhlIHN0YW5kYXJkIHJlcXVlc3QgcG9vbCByZWdhcmRsZXNzIG9mIHRoZSBjdXJyZW50CisgICAgICogc2l6ZSBvZiB0aGUge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5EaXNwYXRjaGVyI2F1dGhFeGVjdXRvcn0ncyBhY3RpdmUgc2l6ZS4KKyAgICAgKgorICAgICAqIHNlZSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LkRpc3BhdGNoZXIjZGlzcGF0Y2h9IGZvciBleGVjdXRvciBzZWxlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TmF0aXZlVHJhbnNwb3J0TWF4QXV0aFRocmVhZHMoaW50IHRocmVhZHMpCisgICAgeworICAgICAgICBjb25mLm5hdGl2ZV90cmFuc3BvcnRfbWF4X2F1dGhfdGhyZWFkcyA9IHRocmVhZHM7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TmF0aXZlVHJhbnNwb3J0TWF4RnJhbWVTaXplKCkKICAgICB7CiAgICAgICAgIHJldHVybiBjb25mLm5hdGl2ZV90cmFuc3BvcnRfbWF4X2ZyYW1lX3NpemUudG9CeXRlcygpOwpAQCAtMjkzNSw3ICszMTM4LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dG9Cb290c3RyYXAoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImF1dG9fYm9vdHN0cmFwIiwgQm9vbGVhbi50b1N0cmluZyhjb25mLmF1dG9fYm9vdHN0cmFwKSkpOworICAgICAgICByZXR1cm4gQVVUT19CT09UU1RSQVAuZ2V0Qm9vbGVhbihjb25mLmF1dG9fYm9vdHN0cmFwKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SGludGVkSGFuZG9mZkVuYWJsZWQoYm9vbGVhbiBoaW50ZWRIYW5kb2ZmRW5hYmxlZCkKQEAgLTMxMjAsNiArMzMyMywxNiBAQAogICAgICAgICBjb25mLmF1dG9faGludHNfY2xlYW51cF9lbmFibGVkID0gdmFsdWU7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldFRyYW5zZmVySGludHNPbkRlY29tbWlzc2lvbigpCisgICAgeworICAgICAgICByZXR1cm4gY29uZi50cmFuc2Zlcl9oaW50c19vbl9kZWNvbW1pc3Npb247CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRyYW5zZmVySGludHNPbkRlY29tbWlzc2lvbihib29sZWFuIGVuYWJsZWQpCisgICAgeworICAgICAgICBjb25mLnRyYW5zZmVyX2hpbnRzX29uX2RlY29tbWlzc2lvbiA9IGVuYWJsZWQ7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5jcmVtZW50YWxCYWNrdXBzRW5hYmxlZCgpCiAgICAgewogICAgICAgICByZXR1cm4gY29uZi5pbmNyZW1lbnRhbF9iYWNrdXBzOwpAQCAtMzEzNSw2ICszMzQ4LDEyIEBACiAgICAgICAgIHJldHVybiBjb25mLmZpbGVfY2FjaGVfZW5hYmxlZDsKICAgICB9CiAKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmlsZUNhY2hlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpCisgICAgeworICAgICAgICBjb25mLmZpbGVfY2FjaGVfZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RmlsZUNhY2hlU2l6ZUluTWlCKCkKICAgICB7CiAgICAgICAgIGlmIChjb25mLmZpbGVfY2FjaGVfc2l6ZSA9PSBudWxsKQpAQCAtMzM0NCw2ICszNTYzLDIxIEBACiAgICAgICAgIHJldHVybiBjb25mLnN0cmVhbV9lbnRpcmVfc3N0YWJsZXM7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBEdXJhdGlvblNwZWMuTG9uZ01pbGxpc2Vjb25kc0JvdW5kIGdldFN0cmVhbVRyYW5zZmVyVGFza1RpbWVvdXQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmYuc3RyZWFtX3RyYW5zZmVyX3Rhc2tfdGltZW91dDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U2tpcFN0cmVhbURpc2tTcGFjZUNoZWNrKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25mLnNraXBfc3RyZWFtX2Rpc2tfc3BhY2VfY2hlY2s7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFNraXBTdHJlYW1EaXNrU3BhY2VDaGVjayhib29sZWFuIHZhbHVlKQorICAgIHsKKyAgICAgICAgY29uZi5za2lwX3N0cmVhbV9kaXNrX3NwYWNlX2NoZWNrID0gdmFsdWU7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYWxEYXRhQ2VudGVyKCkKICAgICB7CiAgICAgICAgIHJldHVybiBsb2NhbERDOwpAQCAtMzQ5NywxMSArMzczMSw2IEBACiAgICAgICAgIHJldHVybiBjb25mLnNjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlU2NyaXB0ZWRVc2VyRGVmaW5lZEZ1bmN0aW9ucyhib29sZWFuIGVuYWJsZVNjcmlwdGVkVXNlckRlZmluZWRGdW5jdGlvbnMpCi0gICAgewotICAgICAgICBjb25mLnNjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZCA9IGVuYWJsZVNjcmlwdGVkVXNlckRlZmluZWRGdW5jdGlvbnM7Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVuYWJsZVVzZXJEZWZpbmVkRnVuY3Rpb25zVGhyZWFkcygpCiAgICAgewogICAgICAgICByZXR1cm4gY29uZi51c2VyX2RlZmluZWRfZnVuY3Rpb25zX3RocmVhZHNfZW5hYmxlZDsKQEAgLTM2MzQsNiArMzg2MywxNiBAQAogICAgICAgICBjb25mLmNkY19ibG9ja193cml0ZXMgPSB2YWw7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ0RDT25SZXBhaXJFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25mLmNkY19vbl9yZXBhaXJfZW5hYmxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q0RDT25SZXBhaXJFbmFibGVkKGJvb2xlYW4gdmFsKQorICAgIHsKKyAgICAgICAgY29uZi5jZGNfb25fcmVwYWlyX2VuYWJsZWQgPSB2YWw7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q0RDTG9nTG9jYXRpb24oKQogICAgIHsKICAgICAgICAgcmV0dXJuIGNvbmYuY2RjX3Jhd19kaXJlY3Rvcnk7CkBAIC00MjM5LDYgKzQ0NzgsMTEgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiZGVmYXVsdF9rZXlzcGFjZV9yZiB0byBiZSBzZXQgKCVkKSBjYW5ub3QgYmUgbGVzcyB0aGFuIG1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkICglZCkiLCB2YWx1ZSwgZ3VhcmRyYWlscy5nZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JGYWlsVGhyZXNob2xkKCkpKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChndWFyZHJhaWxzLmdldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvckZhaWxUaHJlc2hvbGQoKSAhPSAtMSAmJiB2YWx1ZSA+IGd1YXJkcmFpbHMuZ2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yRmFpbFRocmVzaG9sZCgpKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoImRlZmF1bHRfa2V5c3BhY2VfcmYgdG8gYmUgc2V0ICglZCkgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBtYXhpbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZCAoJWQpIiwgdmFsdWUsIGd1YXJkcmFpbHMuZ2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yRmFpbFRocmVzaG9sZCgpKSk7CisgICAgICAgIH0KKwogICAgICAgICBjb25mLmRlZmF1bHRfa2V5c3BhY2VfcmYgPSB2YWx1ZTsKICAgICB9CiAKQEAgLTQ0MDMsNCArNDY0NywxMzAgQEAKICAgICB7CiAgICAgICAgIGNvbmYubWluX3RyYWNrZWRfcGFydGl0aW9uX3RvbWJzdG9uZV9jb3VudCA9IHZhbHVlOwogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREdW1wSGVhcE9uVW5jYXVnaHRFeGNlcHRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmYuZHVtcF9oZWFwX29uX3VuY2F1Z2h0X2V4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIHBhdGggZXhpc3RzIChiZSBpdCBjcmVhdGVkIG5vdyBvciBhbHJlYWR5IHByaW9yKQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF5YmVDcmVhdGVIZWFwRHVtcFBhdGgoKQorICAgIHsKKyAgICAgICAgaWYgKCFjb25mLmR1bXBfaGVhcF9vbl91bmNhdWdodF9leGNlcHRpb24pCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgUGF0aCBoZWFwX2R1bXBfcGF0aCA9IGdldEhlYXBEdW1wUGF0aCgpOworICAgICAgICBpZiAoaGVhcF9kdW1wX3BhdGggPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLndhcm4oIk5laXRoZXIgLVhYOkhlYXBEdW1wUGF0aCBub3IgY2Fzc2FuZHJhLnlhbWw6aGVhcF9kdW1wX3BhdGggYXJlIHNldDsgdW5hYmxlIHRvIGNyZWF0ZSBhIGRpcmVjdG9yeSB0byBob2xkIHRoZSBvdXRwdXQuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFBhdGhVdGlscy5leGlzdHMoRmlsZS5nZXRQYXRoKGNvbmYuaGVhcF9kdW1wX3BhdGgpKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gUGF0aFV0aWxzLmNyZWF0ZURpcmVjdG9yeUlmTm90RXhpc3RzKEZpbGUuZ2V0UGF0aChjb25mLmhlYXBfZHVtcF9wYXRoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXMgdGhpcyBpcyBhdCBpdHMgaGVhcnQgYSBkZWJ1ZyBvcGVyYXRpb24gKGdldHRpbmcgYSBvbmUtc2hvdCBoZWFwZHVtcCBmcm9tIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbiksIHdlIHN1cHBvcnQKKyAgICAgKiBib3RoIHRoZSBtb3JlIGV2b2x2ZWQgY2Fzc2FuZHJhLnlhbWwgYXBwcm9hY2ggYnV0IGFsc28gdGhlIC1YWCBwYXJhbSB0byBvdmVycmlkZSBpdCBvbiBhIG9uZS1vZmYgYmFzaXMgc28geW91IGRvbid0CisgICAgICogaGF2ZSB0byBjaGFuZ2UgdGhlIGZ1bGwgY29uZmlnIG9mIGEgbm9kZSBvciBhIGNsdXN0ZXIgaW4gb3JkZXIgdG8gZ2V0IGEgaGVhcCBkdW1wIGZyb20gYSBzaW5nbGUgbm9kZSB0aGF0J3MKKyAgICAgKiBtaXNiZWhhdmluZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSAtWFggcGFyYW0gaWYgcHJvdmlkZWQsIGVsc2UgdGhlIGhlYXBfZHVtcF9wYXRoIGluIGNhc3NhbmRyYS55YW1sCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXRoIGdldEhlYXBEdW1wUGF0aCgpCisgICAgeworICAgICAgICBSdW50aW1lTVhCZWFuIHJ1bnRpbWVNeEJlYW4gPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRSdW50aW1lTVhCZWFuKCk7CisgICAgICAgIE9wdGlvbmFsPFN0cmluZz4gcGF0aEFyZyA9IHJ1bnRpbWVNeEJlYW4uZ2V0SW5wdXRBcmd1bWVudHMoKS5zdHJlYW0oKS5maWx0ZXIocyAtPiBzLnN0YXJ0c1dpdGgoIi1YWDpIZWFwRHVtcFBhdGg9IikpLmZpbmRGaXJzdCgpOworCisgICAgICAgIGlmIChwYXRoQXJnLmlzUHJlc2VudCgpKQorICAgICAgICB7CisgICAgICAgICAgICBQYXR0ZXJuIEhFQVBfRFVNUF9QQVRIX1NQTElUVEVSID0gUGF0dGVybi5jb21waWxlKCJIZWFwRHVtcFBhdGg9Iik7CisgICAgICAgICAgICBTdHJpbmcgZnVsbEhlYXBQYXRoU3RyaW5nID0gSEVBUF9EVU1QX1BBVEhfU1BMSVRURVIuc3BsaXQocGF0aEFyZy5nZXQoKSlbMV07CisgICAgICAgICAgICBQYXRoIGFic29sdXRlUGF0aCA9IEZpbGUuZ2V0UGF0aChmdWxsSGVhcFBhdGhTdHJpbmcpLnRvQWJzb2x1dGVQYXRoKCk7CisgICAgICAgICAgICBQYXRoIGJhc2VQYXRoID0gZnVsbEhlYXBQYXRoU3RyaW5nLmVuZHNXaXRoKCIuaHByb2YiKSA/IGFic29sdXRlUGF0aC5zdWJwYXRoKDAsIGFic29sdXRlUGF0aC5nZXROYW1lQ291bnQoKSAtIDEpIDogYWJzb2x1dGVQYXRoOworICAgICAgICAgICAgcmV0dXJuIEZpbGUuZ2V0UGF0aCgiLyIpLnJlc29sdmUoYmFzZVBhdGgpOworICAgICAgICB9CisgICAgICAgIGlmIChjb25mLmhlYXBfZHVtcF9wYXRoID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiQXR0ZW1wdGVkIHRvIGdldCBoZWFwIGR1bXAgcGF0aCB3aXRob3V0IC1YWDpIZWFwRHVtcFBhdGggb3IgY2Fzc2FuZHJhLnlhbWw6aGVhcF9kdW1wX3BhdGggc2V0LiIpOworICAgICAgICByZXR1cm4gRmlsZS5nZXRQYXRoKGNvbmYuaGVhcF9kdW1wX3BhdGgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXREdW1wSGVhcE9uVW5jYXVnaHRFeGNlcHRpb24oYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgY29uZi5kdW1wX2hlYXBfb25fdW5jYXVnaHRfZXhjZXB0aW9uID0gZW5hYmxlZDsKKyAgICAgICAgYm9vbGVhbiBwYXRoRXhpc3RzID0gbWF5YmVDcmVhdGVIZWFwRHVtcFBhdGgoKTsKKworICAgICAgICBpZiAoZW5hYmxlZCAmJiAhcGF0aEV4aXN0cykKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJBdHRlbXB0ZWQgdG8gZW5hYmxlIGhlYXAgZHVtcCBidXQgY2Fubm90IGNyZWF0ZSB0aGUgcmVxdWVzdGVkIHBhdGguIERpc2FibGluZy4iKTsKKyAgICAgICAgICAgIGNvbmYuZHVtcF9oZWFwX29uX3VuY2F1Z2h0X2V4Y2VwdGlvbiA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTZXR0aW5nIGR1bXBfaGVhcF9vbl91bmNhdWdodF9leGNlcHRpb24gdG8ge30iLCBlbmFibGVkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0U1N0YWJsZVJlYWRSYXRlUGVyc2lzdGVuY2VFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25mLnNzdGFibGVfcmVhZF9yYXRlX3BlcnNpc3RlbmNlX2VuYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFNTdGFibGVSZWFkUmF0ZVBlcnNpc3RlbmNlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpCisgICAgeworICAgICAgICBpZiAoZW5hYmxlZCAhPSBjb25mLnNzdGFibGVfcmVhZF9yYXRlX3BlcnNpc3RlbmNlX2VuYWJsZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTZXR0aW5nIHNzdGFibGVfcmVhZF9yYXRlX3BlcnNpc3RlbmNlX2VuYWJsZWQgdG8ge30iLCBlbmFibGVkKTsKKyAgICAgICAgICAgIGNvbmYuc3N0YWJsZV9yZWFkX3JhdGVfcGVyc2lzdGVuY2VfZW5hYmxlZCA9IGVuYWJsZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2V0Q2xpZW50UmVxdWVzdFNpemVNZXRyaWNzRW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZi5jbGllbnRfcmVxdWVzdF9zaXplX21ldHJpY3NfZW5hYmxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2xpZW50UmVxdWVzdFNpemVNZXRyaWNzRW5hYmxlZChib29sZWFuIGVuYWJsZWQpCisgICAgeworICAgICAgICBjb25mLmNsaWVudF9yZXF1ZXN0X3NpemVfbWV0cmljc19lbmFibGVkID0gZW5hYmxlZDsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRTU1RhYmxlRm9ybWF0cyhJdGVyYWJsZTxTU1RhYmxlRm9ybWF0LkZhY3Rvcnk+IGZhY3RvcmllcywgQ29uZmlnLlNTVGFibGVDb25maWcgY29uZmlnKQorICAgIHsKKyAgICAgICAgc3N0YWJsZUZvcm1hdHMgPSBudWxsOworICAgICAgICBzZWxlY3RlZFNTVGFibGVGb3JtYXQgPSBudWxsOworICAgICAgICBhcHBseVNTVGFibGVGb3JtYXRzKGZhY3RvcmllcywgY29uZmlnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEltbXV0YWJsZU1hcDxTdHJpbmcsIFNTVGFibGVGb3JtYXQ8PywgPz4+IGdldFNTVGFibGVGb3JtYXRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBPYmplY3RzLnJlcXVpcmVOb25OdWxsKHNzdGFibGVGb3JtYXRzLCAiRm9yZ290IHRvIGluaXRpYWxpemUgRGF0YWJhc2VEZXNjcmlwdG9yPyIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZUZvcm1hdDw/LCA/PiBnZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMucmVxdWlyZU5vbk51bGwoc2VsZWN0ZWRTU1RhYmxlRm9ybWF0LCAiRm9yZ290IHRvIGluaXRpYWxpemUgRGF0YWJhc2VEZXNjcmlwdG9yPyIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREeW5hbWljRGF0YU1hc2tpbmdFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25mLmR5bmFtaWNfZGF0YV9tYXNraW5nX2VuYWJsZWQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldER5bmFtaWNEYXRhTWFza2luZ0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgaWYgKGVuYWJsZWQgIT0gY29uZi5keW5hbWljX2RhdGFfbWFza2luZ19lbmFibGVkKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiU2V0dGluZyBkeW5hbWljX2RhdGFfbWFza2luZ19lbmFibGVkIHRvIHt9IiwgZW5hYmxlZCk7CisgICAgICAgICAgICBjb25mLmR5bmFtaWNfZGF0YV9tYXNraW5nX2VuYWJsZWQgPSBlbmFibGVkOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25hbERvdWJsZSBnZXRTZXZlcml0eUR1cmluZ0RlY29tbWlzc2lvbigpCisgICAgeworICAgICAgICByZXR1cm4gY29uZi5zZXZlcml0eV9kdXJpbmdfZGVjb21taXNzaW9uID4gMCA/CisgICAgICAgICAgICAgICBPcHRpb25hbERvdWJsZS5vZihjb25mLnNldmVyaXR5X2R1cmluZ19kZWNvbW1pc3Npb24pIDoKKyAgICAgICAgICAgICAgIE9wdGlvbmFsRG91YmxlLmVtcHR5KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0R1cmF0aW9uU3BlYy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0R1cmF0aW9uU3BlYy5qYXZhCmluZGV4IDEwZDU2YzIuLjI1MjJkODYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9EdXJhdGlvblNwZWMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRHVyYXRpb25TcGVjLmphdmEKQEAgLTI3Myw2ICsyNzMsNjQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgZHVyYXRpb24gdXNlZCBmb3IgQ2Fzc2FuZHJhIGNvbmZpZ3VyYXRpb24uIFRoZSBib3VuZCBpcyBbMCwgTG9uZy5NQVhfVkFMVUUpIGluIG1pY3Jvc2Vjb25kcy4KKyAgICAgKiBJZiB0aGUgdXNlciBzZXRzIGEgZGlmZmVyZW50IHVuaXQgLSB3ZSBzdGlsbCB2YWxpZGF0ZSB0aGF0IGNvbnZlcnRlZCB0byBtaWNyb3NlY29uZHMgdGhlIHF1YW50aXR5IHdpbGwgbm90IGV4Y2VlZAorICAgICAqIHRoYXQgdXBwZXIgYm91bmQuIChDQVNTQU5EUkEtMTc1NzEpCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBMb25nTWljcm9zZWNvbmRzQm91bmQgZXh0ZW5kcyBEdXJhdGlvblNwZWMKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmR9IG9mIHRoZSBzcGVjaWZpZWQgYW1vdW50LgorICAgICAgICAgKiBUaGUgYm91bmQgaXMgWzAsIExvbmcuTUFYX1ZBTFVFKSBpbiBtaWNyb3NlY29uZHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgZHVyYXRpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMb25nTWljcm9zZWNvbmRzQm91bmQoU3RyaW5nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcih2YWx1ZSwgTUlDUk9TRUNPTkRTLCBMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHtAY29kZSBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kfSBvZiB0aGUgc3BlY2lmaWVkIGFtb3VudCBpbiB0aGUgc3BlY2lmaWVkIHVuaXQuCisgICAgICAgICAqIFRoZSBib3VuZCBpcyBbMCwgTG9uZy5NQVhfVkFMVUUpIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHF1YW50aXR5IHdoZXJlIHF1YW50aXR5IHNob3VsZG4ndCBiZSBiaWdnZXIgdGhhbiBMb25nLk1BWF9WQUxVRSAtIDEgaW4gbWljcm9zZWNvbmRzCisgICAgICAgICAqIEBwYXJhbSB1bml0IGluIHdoaWNoIHRoZSBwcm92aWRlZCBxdWFudGl0eSBpcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExvbmdNaWNyb3NlY29uZHNCb3VuZChsb25nIHF1YW50aXR5LCBUaW1lVW5pdCB1bml0KQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihxdWFudGl0eSwgdW5pdCwgTUlDUk9TRUNPTkRTLCBMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHtAY29kZSBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kfSBvZiB0aGUgc3BlY2lmaWVkIGFtb3VudCBpbiBtaWNyb3NlY29uZHMuCisgICAgICAgICAqIFRoZSBib3VuZCBpcyBbMCwgTG9uZy5NQVhfVkFMVUUpIGluIG1pY3Jvc2Vjb25kcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1pY3Jvc2Vjb25kcyB3aGVyZSBtaWxsaXNlY29uZHMgc2hvdWxkbid0IGJlIGJpZ2dlciB0aGFuIExvbmcuTUFYX1ZBTFVFLTEKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMb25nTWljcm9zZWNvbmRzQm91bmQobG9uZyBtaWNyb3NlY29uZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMobWljcm9zZWNvbmRzLCBNSUNST1NFQ09ORFMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBkdXJhdGlvbiBpbiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgbG9uZyB0b01pY3Jvc2Vjb25kcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB1bml0KCkudG9NaWNyb3MocXVhbnRpdHkoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGlzIGR1cmF0aW9uIGluIG51bWJlciBvZiBzZWNvbmRzCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgbG9uZyB0b1NlY29uZHMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdW5pdCgpLnRvU2Vjb25kcyhxdWFudGl0eSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIFJlcHJlc2VudHMgYSBkdXJhdGlvbiB1c2VkIGZvciBDYXNzYW5kcmEgY29uZmlndXJhdGlvbi4gVGhlIGJvdW5kIGlzIFswLCBMb25nLk1BWF9WQUxVRSkgaW4gbWlsbGlzZWNvbmRzLgogICAgICAqIElmIHRoZSB1c2VyIHNldHMgYSBkaWZmZXJlbnQgdW5pdCAtIHdlIHN0aWxsIHZhbGlkYXRlIHRoYXQgY29udmVydGVkIHRvIG1pbGxpc2Vjb25kcyB0aGUgcXVhbnRpdHkgd2lsbCBub3QgZXhjZWVkCiAgICAgICogdGhhdCB1cHBlciBib3VuZC4gKENBU1NBTkRSQS0xNzU3MSkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9FbmNyeXB0aW9uT3B0aW9ucy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0VuY3J5cHRpb25PcHRpb25zLmphdmEKaW5kZXggMjYxMGZmNi4uYWZhMGQ2NiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0VuY3J5cHRpb25PcHRpb25zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0VuY3J5cHRpb25PcHRpb25zLmphdmEKQEAgLTMzLDcgKzMzLDYgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbklnbm9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLklFbmRwb2ludFNuaXRjaDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5EaXNhYmxlU3NsQ29udGV4dEZhY3Rvcnk7CkBAIC0xMTAsNiArMTA5LDggQEAKICAgICB7CiAgICAgICAgIEtFWVNUT1JFKCJrZXlzdG9yZSIpLAogICAgICAgICBLRVlTVE9SRV9QQVNTV09SRCgia2V5c3RvcmVfcGFzc3dvcmQiKSwKKyAgICAgICAgT1VUQk9VTkRfS0VZU1RPUkUoIm91dGJvdW5kX2tleXN0b3JlIiksCisgICAgICAgIE9VVEJPVU5EX0tFWVNUT1JFX1BBU1NXT1JEKCJvdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCIpLAogICAgICAgICBUUlVTVFNUT1JFKCJ0cnVzdHN0b3JlIiksCiAgICAgICAgIFRSVVNUU1RPUkVfUEFTU1dPUkQoInRydXN0c3RvcmVfcGFzc3dvcmQiKSwKICAgICAgICAgQ0lQSEVSX1NVSVRFUygiY2lwaGVyX3N1aXRlcyIpLApAQCAtMjYyLDExICsyNjMsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTc2xDb250ZXh0RmFjdG9yeSgpCisgICAgcHJvdGVjdGVkIHZvaWQgZmlsbFNzbENvbnRleHRQYXJhbXMoTWFwPFN0cmluZywgT2JqZWN0PiBzc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcnMpCiAgICAgewotICAgICAgICBNYXA8U3RyaW5nLE9iamVjdD4gc3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcmVwYXJlU3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXJpemVkS2V5cyhzc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcnMpOwotCiAgICAgICAgIC8qCiAgICAgICAgICAqIENvcHkgYWxsIGNvbmZpZ3MgdG8gdGhlIE1hcCB0byBwYXNzIGl0IG9uIHRvIHRoZSBJU3NsQ29udGV4dEZhY3RvcnkncyBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgKi8KQEAgLTI4Myw2ICsyODEsMTMgQEAKICAgICAgICAgcHV0U3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXIoc3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXJzLCBDb25maWdLZXkuUkVRVUlSRV9FTkRQT0lOVF9WRVJJRklDQVRJT04sIHRoaXMucmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24pOwogICAgICAgICBwdXRTc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcihzc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcnMsIENvbmZpZ0tleS5FTkFCTEVELCB0aGlzLmVuYWJsZWQpOwogICAgICAgICBwdXRTc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcihzc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcnMsIENvbmZpZ0tleS5PUFRJT05BTCwgdGhpcy5vcHRpb25hbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTc2xDb250ZXh0RmFjdG9yeSgpCisgICAgeworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHNzbENvbnRleHRGYWN0b3J5UGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJlcGFyZVNzbENvbnRleHRGYWN0b3J5UGFyYW1ldGVyaXplZEtleXMoc3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXJzKTsKKyAgICAgICAgZmlsbFNzbENvbnRleHRQYXJhbXMoc3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXJzKTsKIAogICAgICAgICBpZiAoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfSlZNX0RURVNUX0RJU0FCTEVfU1NMLmdldEJvb2xlYW4oKSkKICAgICAgICAgewpAQCAtMjk1LDggKzMwMCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcHV0U3NsQ29udGV4dEZhY3RvcnlQYXJhbWV0ZXIoTWFwPFN0cmluZyxPYmplY3Q+IGV4aXN0aW5nUGFyYW1ldGVycywgQ29uZmlnS2V5IGNvbmZpZ0tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlKQorICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBwdXRTc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcihNYXA8U3RyaW5nLCBPYmplY3Q+IGV4aXN0aW5nUGFyYW1ldGVycywgQ29uZmlnS2V5IGNvbmZpZ0tleSwgT2JqZWN0IHZhbHVlKQogICAgIHsKICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgIGV4aXN0aW5nUGFyYW1ldGVycy5wdXQoY29uZmlnS2V5LmdldEtleU5hbWUoKSwgdmFsdWUpOwpAQCAtNjA3LDE1ICs2MTEsMjEgQEAKICAgICAgICAgcHVibGljIGZpbmFsIEludGVybm9kZUVuY3J5cHRpb24gaW50ZXJub2RlX2VuY3J5cHRpb247CiAgICAgICAgIEBSZXBsYWNlcyhvbGROYW1lID0gImVuYWJsZV9sZWdhY3lfc3NsX3N0b3JhZ2VfcG9ydCIsIGRlcHJlY2F0ZWQgPSB0cnVlKQogICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBsZWdhY3lfc3NsX3N0b3JhZ2VfcG9ydF9lbmFibGVkOworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG91dGJvdW5kX2tleXN0b3JlOworICAgICAgICBATnVsbGFibGUKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBvdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZDsKIAogICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLmludGVybm9kZV9lbmNyeXB0aW9uID0gSW50ZXJub2RlRW5jcnlwdGlvbi5ub25lOwogICAgICAgICAgICAgdGhpcy5sZWdhY3lfc3NsX3N0b3JhZ2VfcG9ydF9lbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLm91dGJvdW5kX2tleXN0b3JlID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMub3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQgPSBudWxsOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zKFBhcmFtZXRlcml6ZWRDbGFzcyBzc2xDb250ZXh0RmFjdG9yeUNsYXNzLCBTdHJpbmcga2V5c3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5c3RvcmVfcGFzc3dvcmQsIFN0cmluZyB0cnVzdHN0b3JlLCBTdHJpbmcgdHJ1c3RzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXlzdG9yZV9wYXNzd29yZCxTdHJpbmcgb3V0Ym91bmRfa2V5c3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIFN0cmluZyB0cnVzdHN0b3JlLCBTdHJpbmcgdHJ1c3RzdG9yZV9wYXNzd29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBjaXBoZXJfc3VpdGVzLCBTdHJpbmcgcHJvdG9jb2wsIExpc3Q8U3RyaW5nPiBhY2NlcHRlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWxnb3JpdGhtLCBTdHJpbmcgc3RvcmVfdHlwZSwgYm9vbGVhbiByZXF1aXJlX2NsaWVudF9hdXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlX2VuZHBvaW50X3ZlcmlmaWNhdGlvbiwgQm9vbGVhbiBvcHRpb25hbCwKQEAgLTYyNiw2ICs2MzYsOCBAQAogICAgICAgICAgICAgbnVsbCwgb3B0aW9uYWwpOwogICAgICAgICAgICAgdGhpcy5pbnRlcm5vZGVfZW5jcnlwdGlvbiA9IGludGVybm9kZV9lbmNyeXB0aW9uOwogICAgICAgICAgICAgdGhpcy5sZWdhY3lfc3NsX3N0b3JhZ2VfcG9ydF9lbmFibGVkID0gbGVnYWN5X3NzbF9zdG9yYWdlX3BvcnRfZW5hYmxlZDsKKyAgICAgICAgICAgIHRoaXMub3V0Ym91bmRfa2V5c3RvcmUgPSBvdXRib3VuZF9rZXlzdG9yZTsKKyAgICAgICAgICAgIHRoaXMub3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQgPSBvdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZDsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyBvcHRpb25zKQpAQCAtNjMzLDYgKzY0NSwxNiBAQAogICAgICAgICAgICAgc3VwZXIob3B0aW9ucyk7CiAgICAgICAgICAgICB0aGlzLmludGVybm9kZV9lbmNyeXB0aW9uID0gb3B0aW9ucy5pbnRlcm5vZGVfZW5jcnlwdGlvbjsKICAgICAgICAgICAgIHRoaXMubGVnYWN5X3NzbF9zdG9yYWdlX3BvcnRfZW5hYmxlZCA9IG9wdGlvbnMubGVnYWN5X3NzbF9zdG9yYWdlX3BvcnRfZW5hYmxlZDsKKyAgICAgICAgICAgIHRoaXMub3V0Ym91bmRfa2V5c3RvcmUgPSBvcHRpb25zLm91dGJvdW5kX2tleXN0b3JlOworICAgICAgICAgICAgdGhpcy5vdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCA9IG9wdGlvbnMub3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZmlsbFNzbENvbnRleHRQYXJhbXMoTWFwPFN0cmluZywgT2JqZWN0PiBzc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyLmZpbGxTc2xDb250ZXh0UGFyYW1zKHNzbENvbnRleHRGYWN0b3J5UGFyYW1ldGVycyk7CisgICAgICAgICAgICBwdXRTc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcihzc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcnMsIENvbmZpZ0tleS5PVVRCT1VORF9LRVlTVE9SRSwgdGhpcy5vdXRib3VuZF9rZXlzdG9yZSk7CisgICAgICAgICAgICBwdXRTc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcihzc2xDb250ZXh0RmFjdG9yeVBhcmFtZXRlcnMsIENvbmZpZ0tleS5PVVRCT1VORF9LRVlTVE9SRV9QQVNTV09SRCwgdGhpcy5vdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTY5Niw3ICs3MTgsNiBAQAogICAgICAgICAgKiB2YWx1ZXMgb2YgImRjIiBhbmQgImFsbCIuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGV4cGxpY2l0LCByYXcgdmFsdWUgb2Yge0BsaW5rICNvcHRpb25hbH0KICAgICAgICAgICogYXMgc2V0IGJ5IHRoZSB1c2VyIChpZiBzZXQgYXQgYWxsKS4KICAgICAgICAgICovCi0gICAgICAgIEBKc29uSWdub3JlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRXhwbGljaXRseU9wdGlvbmFsKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG9wdGlvbmFsICE9IG51bGwgJiYgb3B0aW9uYWw7CkBAIC03MDQsNyArNzI1LDggQEAKIAogICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgd2l0aFNzbENvbnRleHRGYWN0b3J5KFBhcmFtZXRlcml6ZWRDbGFzcyBzc2xDb250ZXh0RmFjdG9yeUNsYXNzKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbENvbnRleHRGYWN0b3J5Q2xhc3MsIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsQ29udGV4dEZhY3RvcnlDbGFzcywga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKQEAgLTcxMyw3ICs3MzUsOCBAQAogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoS2V5U3RvcmUoU3RyaW5nIGtleXN0b3JlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKQEAgLTcyMiw3ICs3NDUsOCBAQAogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoS2V5U3RvcmVQYXNzd29yZChTdHJpbmcga2V5c3RvcmVfcGFzc3dvcmQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAorICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGJvdW5kX2tleXN0b3JlLCBvdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RzdG9yZV9wYXNzd29yZCwgY2lwaGVyX3N1aXRlcywgcHJvdG9jb2wsIGFjY2VwdGVkX3Byb3RvY29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtLCBzdG9yZV90eXBlLCByZXF1aXJlX2NsaWVudF9hdXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2VuZHBvaW50X3ZlcmlmaWNhdGlvbiwgb3B0aW9uYWwsIGludGVybm9kZV9lbmNyeXB0aW9uLApAQCAtNzMxLDcgKzc1NSw4IEBACiAKICAgICAgICAgcHVibGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIHdpdGhUcnVzdFN0b3JlKFN0cmluZyB0cnVzdHN0b3JlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKQEAgLTc0MCw3ICs3NjUsOCBAQAogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoVHJ1c3RTdG9yZVBhc3N3b3JkKFN0cmluZyB0cnVzdHN0b3JlX3Bhc3N3b3JkKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKQEAgLTc0OSwxNiArNzc1LDE4IEBACiAKICAgICAgICAgcHVibGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIHdpdGhDaXBoZXJTdWl0ZXMoTGlzdDxTdHJpbmc+IGNpcGhlcl9zdWl0ZXMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAorICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGJvdW5kX2tleXN0b3JlLCBvdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RzdG9yZV9wYXNzd29yZCwgY2lwaGVyX3N1aXRlcywgcHJvdG9jb2wsIGFjY2VwdGVkX3Byb3RvY29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtLCBzdG9yZV90eXBlLCByZXF1aXJlX2NsaWVudF9hdXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2VuZHBvaW50X3ZlcmlmaWNhdGlvbiwgb3B0aW9uYWwsIGludGVybm9kZV9lbmNyeXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3lfc3NsX3N0b3JhZ2VfcG9ydF9lbmFibGVkKS5hcHBseUNvbmZpZ0ludGVybmFsKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgd2l0aENpcGhlclN1aXRlcyhTdHJpbmcgLi4uIGNpcGhlcl9zdWl0ZXMpCisgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoQ2lwaGVyU3VpdGVzKFN0cmluZy4uLiBjaXBoZXJfc3VpdGVzKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIEFycmF5cy5hc0xpc3QoY2lwaGVyX3N1aXRlcyksIHByb3RvY29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZF9wcm90b2NvbHMsIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKQEAgLTc2Nyw3ICs3OTUsOCBAQAogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoUHJvdG9jb2woU3RyaW5nIHByb3RvY29sKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKQEAgLTc3Niw3ICs4MDUsOCBAQAogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoQWNjZXB0ZWRQcm90b2NvbHMoTGlzdDxTdHJpbmc+IGFjY2VwdGVkX3Byb3RvY29scykKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRfa2V5c3RvcmUsIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBjaXBoZXJfc3VpdGVzLCBwcm90b2NvbCwgYWNjZXB0ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCkBAIC03ODUsNyArODE1LDggQEAKIAogICAgICAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgd2l0aEFsZ29yaXRobShTdHJpbmcgYWxnb3JpdGhtKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKQEAgLTc5NCw3ICs4MjUsOCBAQAogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoU3RvcmVUeXBlKFN0cmluZyBzdG9yZV90eXBlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKQEAgLTgwMyw3ICs4MzUsOCBAQAogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoUmVxdWlyZUNsaWVudEF1dGgoYm9vbGVhbiByZXF1aXJlX2NsaWVudF9hdXRoKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKQEAgLTgxMiw3ICs4NDUsOCBAQAogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoUmVxdWlyZUVuZHBvaW50VmVyaWZpY2F0aW9uKGJvb2xlYW4gcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAorICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGJvdW5kX2tleXN0b3JlLCBvdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RzdG9yZV9wYXNzd29yZCwgY2lwaGVyX3N1aXRlcywgcHJvdG9jb2wsIGFjY2VwdGVkX3Byb3RvY29scywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxnb3JpdGhtLCBzdG9yZV90eXBlLCByZXF1aXJlX2NsaWVudF9hdXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2VuZHBvaW50X3ZlcmlmaWNhdGlvbiwgb3B0aW9uYWwsIGludGVybm9kZV9lbmNyeXB0aW9uLApAQCAtODIxLDcgKzg1NSw4IEBACiAKICAgICAgICAgcHVibGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIHdpdGhPcHRpb25hbChib29sZWFuIG9wdGlvbmFsKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKQEAgLTgzMCw3ICs4NjUsOCBAQAogCiAgICAgICAgIHB1YmxpYyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyB3aXRoSW50ZXJub2RlRW5jcnlwdGlvbihJbnRlcm5vZGVFbmNyeXB0aW9uIGludGVybm9kZV9lbmNyeXB0aW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwgdHJ1c3RzdG9yZSwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoc3NsX2NvbnRleHRfZmFjdG9yeSwga2V5c3RvcmUsIGtleXN0b3JlX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZF9rZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKQEAgLTgzOSwxMiArODc1LDMyIEBACiAKICAgICAgICAgcHVibGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIHdpdGhMZWdhY3lTc2xTdG9yYWdlUG9ydChib29sZWFuIGVuYWJsZV9sZWdhY3lfc3NsX3N0b3JhZ2VfcG9ydCkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRfa2V5c3RvcmUsIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkLCB0cnVzdHN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkLCBjaXBoZXJfc3VpdGVzLCBwcm90b2NvbCwgYWNjZXB0ZWRfcHJvdG9jb2xzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGdvcml0aG0sIHN0b3JlX3R5cGUsIHJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfZW5kcG9pbnRfdmVyaWZpY2F0aW9uLCBvcHRpb25hbCwgaW50ZXJub2RlX2VuY3J5cHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZV9sZWdhY3lfc3NsX3N0b3JhZ2VfcG9ydCkuYXBwbHlDb25maWdJbnRlcm5hbCgpOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIHdpdGhPdXRib3VuZEtleXN0b3JlKFN0cmluZyBvdXRib3VuZEtleXN0b3JlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKHNzbF9jb250ZXh0X2ZhY3RvcnksIGtleXN0b3JlLCBrZXlzdG9yZV9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRLZXlzdG9yZSwgb3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X3NzbF9zdG9yYWdlX3BvcnRfZW5hYmxlZCkuYXBwbHlDb25maWdJbnRlcm5hbCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIHdpdGhPdXRib3VuZEtleXN0b3JlUGFzc3dvcmQoU3RyaW5nIG91dGJvdW5kS2V5c3RvcmVQYXNzd29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhzc2xfY29udGV4dF9mYWN0b3J5LCBrZXlzdG9yZSwga2V5c3RvcmVfcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGJvdW5kX2tleXN0b3JlLCBvdXRib3VuZEtleXN0b3JlUGFzc3dvcmQsIHRydXN0c3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQsIGNpcGhlcl9zdWl0ZXMsIHByb3RvY29sLCBhY2NlcHRlZF9wcm90b2NvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSwgc3RvcmVfdHlwZSwgcmVxdWlyZV9jbGllbnRfYXV0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24sIG9wdGlvbmFsLCBpbnRlcm5vZGVfZW5jcnlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5X3NzbF9zdG9yYWdlX3BvcnRfZW5hYmxlZCkuYXBwbHlDb25maWdJbnRlcm5hbCgpOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0d1YXJkcmFpbHNPcHRpb25zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvR3VhcmRyYWlsc09wdGlvbnMuamF2YQppbmRleCBlNDY5NGI5Li43YWZmZTZmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvR3VhcmRyYWlsc09wdGlvbnMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvR3VhcmRyYWlsc09wdGlvbnMuamF2YQpAQCAtNzYsMTIgKzc2LDE3IEBACiAgICAgICAgIGNvbmZpZy5yZWFkX2NvbnNpc3RlbmN5X2xldmVsc19kaXNhbGxvd2VkID0gdmFsaWRhdGVDb25zaXN0ZW5jeUxldmVscyhjb25maWcucmVhZF9jb25zaXN0ZW5jeV9sZXZlbHNfZGlzYWxsb3dlZCwgInJlYWRfY29uc2lzdGVuY3lfbGV2ZWxzX2Rpc2FsbG93ZWQiKTsKICAgICAgICAgY29uZmlnLndyaXRlX2NvbnNpc3RlbmN5X2xldmVsc193YXJuZWQgPSB2YWxpZGF0ZUNvbnNpc3RlbmN5TGV2ZWxzKGNvbmZpZy53cml0ZV9jb25zaXN0ZW5jeV9sZXZlbHNfd2FybmVkLCAid3JpdGVfY29uc2lzdGVuY3lfbGV2ZWxzX3dhcm5lZCIpOwogICAgICAgICBjb25maWcud3JpdGVfY29uc2lzdGVuY3lfbGV2ZWxzX2Rpc2FsbG93ZWQgPSB2YWxpZGF0ZUNvbnNpc3RlbmN5TGV2ZWxzKGNvbmZpZy53cml0ZV9jb25zaXN0ZW5jeV9sZXZlbHNfZGlzYWxsb3dlZCwgIndyaXRlX2NvbnNpc3RlbmN5X2xldmVsc19kaXNhbGxvd2VkIik7CisgICAgICAgIHZhbGlkYXRlU2l6ZVRocmVzaG9sZChjb25maWcucGFydGl0aW9uX3NpemVfd2Fybl90aHJlc2hvbGQsIGNvbmZpZy5wYXJ0aXRpb25fc2l6ZV9mYWlsX3RocmVzaG9sZCwgZmFsc2UsICJwYXJ0aXRpb25fc2l6ZSIpOworICAgICAgICB2YWxpZGF0ZVNpemVUaHJlc2hvbGQoY29uZmlnLmNvbHVtbl92YWx1ZV9zaXplX3dhcm5fdGhyZXNob2xkLCBjb25maWcuY29sdW1uX3ZhbHVlX3NpemVfZmFpbF90aHJlc2hvbGQsIGZhbHNlLCAiY29sdW1uX3ZhbHVlX3NpemUiKTsKICAgICAgICAgdmFsaWRhdGVTaXplVGhyZXNob2xkKGNvbmZpZy5jb2xsZWN0aW9uX3NpemVfd2Fybl90aHJlc2hvbGQsIGNvbmZpZy5jb2xsZWN0aW9uX3NpemVfZmFpbF90aHJlc2hvbGQsIGZhbHNlLCAiY29sbGVjdGlvbl9zaXplIik7CiAgICAgICAgIHZhbGlkYXRlTWF4SW50VGhyZXNob2xkKGNvbmZpZy5pdGVtc19wZXJfY29sbGVjdGlvbl93YXJuX3RocmVzaG9sZCwgY29uZmlnLml0ZW1zX3Blcl9jb2xsZWN0aW9uX2ZhaWxfdGhyZXNob2xkLCAiaXRlbXNfcGVyX2NvbGxlY3Rpb24iKTsKICAgICAgICAgdmFsaWRhdGVNYXhJbnRUaHJlc2hvbGQoY29uZmlnLmZpZWxkc19wZXJfdWR0X3dhcm5fdGhyZXNob2xkLCBjb25maWcuZmllbGRzX3Blcl91ZHRfZmFpbF90aHJlc2hvbGQsICJmaWVsZHNfcGVyX3VkdCIpOwogICAgICAgICB2YWxpZGF0ZVBlcmNlbnRhZ2VUaHJlc2hvbGQoY29uZmlnLmRhdGFfZGlza191c2FnZV9wZXJjZW50YWdlX3dhcm5fdGhyZXNob2xkLCBjb25maWcuZGF0YV9kaXNrX3VzYWdlX3BlcmNlbnRhZ2VfZmFpbF90aHJlc2hvbGQsICJkYXRhX2Rpc2tfdXNhZ2VfcGVyY2VudGFnZSIpOwogICAgICAgICB2YWxpZGF0ZURhdGFEaXNrVXNhZ2VNYXhEaXNrU2l6ZShjb25maWcuZGF0YV9kaXNrX3VzYWdlX21heF9kaXNrX3NpemUpOwotICAgICAgICB2YWxpZGF0ZU1pblJGVGhyZXNob2xkKGNvbmZpZy5taW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl93YXJuX3RocmVzaG9sZCwgY29uZmlnLm1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkLCAibWluaW11bV9yZXBsaWNhdGlvbl9mYWN0b3IiKTsKKyAgICAgICAgdmFsaWRhdGVNaW5SRlRocmVzaG9sZChjb25maWcubWluaW11bV9yZXBsaWNhdGlvbl9mYWN0b3Jfd2Fybl90aHJlc2hvbGQsIGNvbmZpZy5taW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZCk7CisgICAgICAgIHZhbGlkYXRlTWF4UkZUaHJlc2hvbGQoY29uZmlnLm1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX3dhcm5fdGhyZXNob2xkLCBjb25maWcubWF4aW11bV9yZXBsaWNhdGlvbl9mYWN0b3JfZmFpbF90aHJlc2hvbGQpOworICAgICAgICB2YWxpZGF0ZVRpbWVzdGFtcFRocmVzaG9sZChjb25maWcubWF4aW11bV90aW1lc3RhbXBfd2Fybl90aHJlc2hvbGQsIGNvbmZpZy5tYXhpbXVtX3RpbWVzdGFtcF9mYWlsX3RocmVzaG9sZCwgIm1heGltdW1fdGltZXN0YW1wIik7CisgICAgICAgIHZhbGlkYXRlVGltZXN0YW1wVGhyZXNob2xkKGNvbmZpZy5taW5pbXVtX3RpbWVzdGFtcF93YXJuX3RocmVzaG9sZCwgY29uZmlnLm1pbmltdW1fdGltZXN0YW1wX2ZhaWxfdGhyZXNob2xkLCAibWluaW11bV90aW1lc3RhbXAiKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTM0NCw2ICszNDksMjAgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREcm9wS2V5c3BhY2VFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25maWcuZHJvcF9rZXlzcGFjZV9lbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERyb3BLZXlzcGFjZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgdXBkYXRlUHJvcGVydHlXaXRoTG9nZ2luZygiZHJvcF9rZXlzcGFjZV9lbmFibGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IGNvbmZpZy5kcm9wX2tleXNwYWNlX2VuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtPiBjb25maWcuZHJvcF9rZXlzcGFjZV9lbmFibGVkID0geCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0U2Vjb25kYXJ5SW5kZXhlc0VuYWJsZWQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGNvbmZpZy5zZWNvbmRhcnlfaW5kZXhlc19lbmFibGVkOwpAQCAtMzg2LDYgKzQwNSwyMCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGdldEFsdGVyVGFibGVFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25maWcuYWx0ZXJfdGFibGVfZW5hYmxlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBbHRlclRhYmxlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpCisgICAgeworICAgICAgICB1cGRhdGVQcm9wZXJ0eVdpdGhMb2dnaW5nKCJhbHRlcl90YWJsZV9lbmFibGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IGNvbmZpZy5hbHRlcl90YWJsZV9lbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT4gY29uZmlnLmFsdGVyX3RhYmxlX2VuYWJsZWQgPSB4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBnZXRSZWFkQmVmb3JlV3JpdGVMaXN0T3BlcmF0aW9uc0VuYWJsZWQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGNvbmZpZy5yZWFkX2JlZm9yZV93cml0ZV9saXN0X29wZXJhdGlvbnNfZW5hYmxlZDsKQEAgLTQxNCw2ICs0NDcsMjAgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTaW1wbGVTdHJhdGVneUVuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5zaW1wbGVzdHJhdGVneV9lbmFibGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNpbXBsZVN0cmF0ZWd5RW5hYmxlZChib29sZWFuIGVuYWJsZWQpCisgICAgeworICAgICAgICB1cGRhdGVQcm9wZXJ0eVdpdGhMb2dnaW5nKCJzaW1wbGVzdHJhdGVneV9lbmFibGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IGNvbmZpZy5zaW1wbGVzdHJhdGVneV9lbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT4gY29uZmlnLnNpbXBsZXN0cmF0ZWd5X2VuYWJsZWQgPSB4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldEluU2VsZWN0Q2FydGVzaWFuUHJvZHVjdFdhcm5UaHJlc2hvbGQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGNvbmZpZy5pbl9zZWxlY3RfY2FydGVzaWFuX3Byb2R1Y3Rfd2Fybl90aHJlc2hvbGQ7CkBAIC00OTUsNiArNTQyLDYwIEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIGdldFBhcnRpdGlvblNpemVXYXJuVGhyZXNob2xkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25maWcucGFydGl0aW9uX3NpemVfd2Fybl90aHJlc2hvbGQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCBnZXRQYXJ0aXRpb25TaXplRmFpbFRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnLnBhcnRpdGlvbl9zaXplX2ZhaWxfdGhyZXNob2xkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcnRpdGlvblNpemVUaHJlc2hvbGQoQE51bGxhYmxlIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCB3YXJuLCBATnVsbGFibGUgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIGZhaWwpCisgICAgeworICAgICAgICB2YWxpZGF0ZVNpemVUaHJlc2hvbGQod2FybiwgZmFpbCwgZmFsc2UsICJwYXJ0aXRpb25fc2l6ZSIpOworICAgICAgICB1cGRhdGVQcm9wZXJ0eVdpdGhMb2dnaW5nKCJwYXJ0aXRpb25fc2l6ZV93YXJuX3RocmVzaG9sZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBjb25maWcucGFydGl0aW9uX3NpemVfd2Fybl90aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtPiBjb25maWcucGFydGl0aW9uX3NpemVfd2Fybl90aHJlc2hvbGQgPSB4KTsKKyAgICAgICAgdXBkYXRlUHJvcGVydHlXaXRoTG9nZ2luZygicGFydGl0aW9uX3NpemVfZmFpbF90aHJlc2hvbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY29uZmlnLnBhcnRpdGlvbl9zaXplX2ZhaWxfdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT4gY29uZmlnLnBhcnRpdGlvbl9zaXplX2ZhaWxfdGhyZXNob2xkID0geCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCBnZXRDb2x1bW5WYWx1ZVNpemVXYXJuVGhyZXNob2xkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25maWcuY29sdW1uX3ZhbHVlX3NpemVfd2Fybl90aHJlc2hvbGQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCBnZXRDb2x1bW5WYWx1ZVNpemVGYWlsVGhyZXNob2xkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25maWcuY29sdW1uX3ZhbHVlX3NpemVfZmFpbF90aHJlc2hvbGQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uVmFsdWVTaXplVGhyZXNob2xkKEBOdWxsYWJsZSBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgd2FybiwgQE51bGxhYmxlIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCBmYWlsKQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVTaXplVGhyZXNob2xkKHdhcm4sIGZhaWwsIGZhbHNlLCAiY29sdW1uX3ZhbHVlX3NpemUiKTsKKyAgICAgICAgdXBkYXRlUHJvcGVydHlXaXRoTG9nZ2luZygiY29sdW1uX3ZhbHVlX3NpemVfd2Fybl90aHJlc2hvbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY29uZmlnLmNvbHVtbl92YWx1ZV9zaXplX3dhcm5fdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT4gY29uZmlnLmNvbHVtbl92YWx1ZV9zaXplX3dhcm5fdGhyZXNob2xkID0geCk7CisgICAgICAgIHVwZGF0ZVByb3BlcnR5V2l0aExvZ2dpbmcoImNvbHVtbl92YWx1ZV9zaXplX2ZhaWxfdGhyZXNob2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IGNvbmZpZy5jb2x1bW5fdmFsdWVfc2l6ZV9mYWlsX3RocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0+IGNvbmZpZy5jb2x1bW5fdmFsdWVfc2l6ZV9mYWlsX3RocmVzaG9sZCA9IHgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOdWxsYWJsZQogICAgIHB1YmxpYyBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgZ2V0Q29sbGVjdGlvblNpemVXYXJuVGhyZXNob2xkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBjb25maWcuY29sbGVjdGlvbl9zaXplX3dhcm5fdGhyZXNob2xkOwpAQCAtNjIzLDcgKzcyNCw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBzZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoaW50IHdhcm4sIGludCBmYWlsKQogICAgIHsKLSAgICAgICAgdmFsaWRhdGVNaW5SRlRocmVzaG9sZCh3YXJuLCBmYWlsLCAibWluaW11bV9yZXBsaWNhdGlvbl9mYWN0b3IiKTsKKyAgICAgICAgdmFsaWRhdGVNaW5SRlRocmVzaG9sZCh3YXJuLCBmYWlsKTsKICAgICAgICAgdXBkYXRlUHJvcGVydHlXaXRoTG9nZ2luZygibWluaW11bV9yZXBsaWNhdGlvbl9mYWN0b3Jfd2Fybl90aHJlc2hvbGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY29uZmlnLm1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yX3dhcm5fdGhyZXNob2xkLApAQCAtNjM0LDYgKzczNSwxMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0+IGNvbmZpZy5taW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZCA9IHgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yV2FyblRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnLm1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX3dhcm5fdGhyZXNob2xkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yRmFpbFRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnLm1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZChpbnQgd2FybiwgaW50IGZhaWwpCisgICAgeworICAgICAgICB2YWxpZGF0ZU1heFJGVGhyZXNob2xkKHdhcm4sIGZhaWwpOworICAgICAgICB1cGRhdGVQcm9wZXJ0eVdpdGhMb2dnaW5nKCJtYXhpbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl93YXJuX3RocmVzaG9sZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBjb25maWcubWF4aW11bV9yZXBsaWNhdGlvbl9mYWN0b3Jfd2Fybl90aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtPiBjb25maWcubWF4aW11bV9yZXBsaWNhdGlvbl9mYWN0b3Jfd2Fybl90aHJlc2hvbGQgPSB4KTsKKyAgICAgICAgdXBkYXRlUHJvcGVydHlXaXRoTG9nZ2luZygibWF4aW11bV9yZXBsaWNhdGlvbl9mYWN0b3JfZmFpbF90aHJlc2hvbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gY29uZmlnLm1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT4gY29uZmlnLm1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkID0geCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0WmVyb1RUTE9uVFdDU1dhcm5lZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnLnplcm9fdHRsX29uX3R3Y3Nfd2FybmVkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFplcm9UVExPblRXQ1NXYXJuZWQoYm9vbGVhbiB2YWx1ZSkKKyAgICB7CisgICAgICAgIHVwZGF0ZVByb3BlcnR5V2l0aExvZ2dpbmcoInplcm9fdHRsX29uX3R3Y3Nfd2FybmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBjb25maWcuemVyb190dGxfb25fdHdjc193YXJuZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtPiBjb25maWcuemVyb190dGxfb25fdHdjc193YXJuZWQgPSB4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRaZXJvVFRMT25UV0NTRW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnLnplcm9fdHRsX29uX3R3Y3NfZW5hYmxlZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRaZXJvVFRMT25UV0NTRW5hYmxlZChib29sZWFuIHZhbHVlKQorICAgIHsKKyAgICAgICAgdXBkYXRlUHJvcGVydHlXaXRoTG9nZ2luZygiemVyb190dGxfb25fdHdjc19lbmFibGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBjb25maWcuemVyb190dGxfb25fdHdjc19lbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT4gY29uZmlnLnplcm9fdHRsX29uX3R3Y3NfZW5hYmxlZCA9IHgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyAgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBnZXRNYXhpbXVtVGltZXN0YW1wV2FyblRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnLm1heGltdW1fdGltZXN0YW1wX3dhcm5fdGhyZXNob2xkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIGdldE1heGltdW1UaW1lc3RhbXBGYWlsVGhyZXNob2xkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25maWcubWF4aW11bV90aW1lc3RhbXBfZmFpbF90aHJlc2hvbGQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bVRpbWVzdGFtcFRocmVzaG9sZChATnVsbGFibGUgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCB3YXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgZmFpbCkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlVGltZXN0YW1wVGhyZXNob2xkKHdhcm4sIGZhaWwsICJtYXhpbXVtX3RpbWVzdGFtcCIpOworCisgICAgICAgIHVwZGF0ZVByb3BlcnR5V2l0aExvZ2dpbmcoIm1heGltdW1fdGltZXN0YW1wX3dhcm5fdGhyZXNob2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IGNvbmZpZy5tYXhpbXVtX3RpbWVzdGFtcF93YXJuX3RocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0+IGNvbmZpZy5tYXhpbXVtX3RpbWVzdGFtcF93YXJuX3RocmVzaG9sZCA9IHgpOworCisgICAgICAgIHVwZGF0ZVByb3BlcnR5V2l0aExvZ2dpbmcoIm1heGltdW1fdGltZXN0YW1wX2ZhaWxfdGhyZXNob2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IGNvbmZpZy5tYXhpbXVtX3RpbWVzdGFtcF9mYWlsX3RocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0+IGNvbmZpZy5tYXhpbXVtX3RpbWVzdGFtcF9mYWlsX3RocmVzaG9sZCA9IHgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyAgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBnZXRNaW5pbXVtVGltZXN0YW1wV2FyblRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gY29uZmlnLm1pbmltdW1fdGltZXN0YW1wX3dhcm5fdGhyZXNob2xkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIGdldE1pbmltdW1UaW1lc3RhbXBGYWlsVGhyZXNob2xkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb25maWcubWluaW11bV90aW1lc3RhbXBfZmFpbF90aHJlc2hvbGQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TWluaW11bVRpbWVzdGFtcFRocmVzaG9sZChATnVsbGFibGUgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCB3YXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgZmFpbCkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlVGltZXN0YW1wVGhyZXNob2xkKHdhcm4sIGZhaWwsICJtaW5pbXVtX3RpbWVzdGFtcCIpOworCisgICAgICAgIHVwZGF0ZVByb3BlcnR5V2l0aExvZ2dpbmcoIm1pbmltdW1fdGltZXN0YW1wX3dhcm5fdGhyZXNob2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IGNvbmZpZy5taW5pbXVtX3RpbWVzdGFtcF93YXJuX3RocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0+IGNvbmZpZy5taW5pbXVtX3RpbWVzdGFtcF93YXJuX3RocmVzaG9sZCA9IHgpOworCisgICAgICAgIHVwZGF0ZVByb3BlcnR5V2l0aExvZ2dpbmcoIm1pbmltdW1fdGltZXN0YW1wX2ZhaWxfdGhyZXNob2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IGNvbmZpZy5taW5pbXVtX3RpbWVzdGFtcF9mYWlsX3RocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0+IGNvbmZpZy5taW5pbXVtX3RpbWVzdGFtcF9mYWlsX3RocmVzaG9sZCA9IHgpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIDxUPiB2b2lkIHVwZGF0ZVByb3BlcnR5V2l0aExvZ2dpbmcoU3RyaW5nIHByb3BlcnR5TmFtZSwgVCBuZXdWYWx1ZSwgU3VwcGxpZXI8VD4gZ2V0dGVyLCBDb25zdW1lcjxUPiBzZXR0ZXIpCiAgICAgewogICAgICAgICBUIG9sZFZhbHVlID0gZ2V0dGVyLmdldCgpOwpAQCAtNjQ2LDYgKzg2MCwxMSBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVBvc2l0aXZlTnVtZXJpYyhsb25nIHZhbHVlLCBsb25nIG1heFZhbHVlLCBTdHJpbmcgbmFtZSkKICAgICB7CisgICAgICAgIHZhbGlkYXRlUG9zaXRpdmVOdW1lcmljKHZhbHVlLCBtYXhWYWx1ZSwgbmFtZSwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVQb3NpdGl2ZU51bWVyaWMobG9uZyB2YWx1ZSwgbG9uZyBtYXhWYWx1ZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gYWxsb3daZXJvKQorICAgIHsKICAgICAgICAgaWYgKHZhbHVlID09IC0xKQogICAgICAgICAgICAgcmV0dXJuOwogCkBAIC02NTMsMTIgKzg3MiwxMiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmb3JtYXQoIkludmFsaWQgdmFsdWUgJWQgZm9yICVzOiBtYXhpbXVtIGFsbG93ZWQgdmFsdWUgaXMgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIG5hbWUsIG1heFZhbHVlKSk7CiAKLSAgICAgICAgaWYgKHZhbHVlID09IDApCisgICAgICAgIGlmICghYWxsb3daZXJvICYmIHZhbHVlID09IDApCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZvcm1hdCgiSW52YWxpZCB2YWx1ZSBmb3IgJXM6IDAgaXMgbm90IGFsbG93ZWQ7ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlmIGF0dGVtcHRpbmcgdG8gZGlzYWJsZSB1c2UgLTEiLCBuYW1lKSk7CiAKICAgICAgICAgLy8gV2UgYWxsb3cgLTEgYXMgYSBnZW5lcmFsICJkaXNhYmxpbmciIGZsYWcuIEJ1dCByZWplY3QgYW55dGhpbmcgbG93ZXIgdG8gYXZvaWQgbWlzdGFrZXMuCi0gICAgICAgIGlmICh2YWx1ZSA8PSAwKQorICAgICAgICBpZiAodmFsdWUgPCAwKQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmb3JtYXQoIkludmFsaWQgdmFsdWUgJWQgZm9yICVzOiBuZWdhdGl2ZSB2YWx1ZXMgYXJlIG5vdCBhbGxvd2VkLCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRzaWRlIG9mIC0xIHdoaWNoIGRpc2FibGVzIHRoZSBndWFyZHJhaWwiLCB2YWx1ZSwgbmFtZSkpOwogICAgIH0KQEAgLTY4Miw2ICs5MDEsMTMgQEAKICAgICAgICAgdmFsaWRhdGVXYXJuTG93ZXJUaGFuRmFpbCh3YXJuLCBmYWlsLCBuYW1lKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlTWF4TG9uZ1RocmVzaG9sZChsb25nIHdhcm4sIGxvbmcgZmFpbCwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gYWxsb3daZXJvKQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVQb3NpdGl2ZU51bWVyaWMod2FybiwgTG9uZy5NQVhfVkFMVUUsIG5hbWUgKyAiX3dhcm5fdGhyZXNob2xkIiwgYWxsb3daZXJvKTsKKyAgICAgICAgdmFsaWRhdGVQb3NpdGl2ZU51bWVyaWMoZmFpbCwgTG9uZy5NQVhfVkFMVUUsIG5hbWUgKyAiX2ZhaWxfdGhyZXNob2xkIiwgYWxsb3daZXJvKTsKKyAgICAgICAgdmFsaWRhdGVXYXJuTG93ZXJUaGFuRmFpbCh3YXJuLCBmYWlsLCBuYW1lKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlTWluSW50VGhyZXNob2xkKGludCB3YXJuLCBpbnQgZmFpbCwgU3RyaW5nIG5hbWUpCiAgICAgewogICAgICAgICB2YWxpZGF0ZVBvc2l0aXZlTnVtZXJpYyh3YXJuLCBJbnRlZ2VyLk1BWF9WQUxVRSwgbmFtZSArICJfd2Fybl90aHJlc2hvbGQiKTsKQEAgLTY4OSwxMCArOTE1LDM2IEBACiAgICAgICAgIHZhbGlkYXRlV2FybkdyZWF0ZXJUaGFuRmFpbCh3YXJuLCBmYWlsLCBuYW1lKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlTWluUkZUaHJlc2hvbGQoaW50IHdhcm4sIGludCBmYWlsLCBTdHJpbmcgbmFtZSkKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlTWluUkZUaHJlc2hvbGQoaW50IHdhcm4sIGludCBmYWlsKQogICAgIHsKLSAgICAgICAgdmFsaWRhdGVNaW5JbnRUaHJlc2hvbGQod2FybiwgZmFpbCwgbmFtZSk7Ci0gICAgICAgIHZhbGlkYXRlTWluUkZWZXJzdXNEZWZhdWx0UkYoZmFpbCwgbmFtZSk7CisgICAgICAgIHZhbGlkYXRlTWluSW50VGhyZXNob2xkKHdhcm4sIGZhaWwsICJtaW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3RvciIpOworCisgICAgICAgIGlmIChmYWlsID4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldERlZmF1bHRLZXlzcGFjZVJGKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZvcm1hdCgibWluaW11bV9yZXBsaWNhdGlvbl9mYWN0b3JfZmFpbF90aHJlc2hvbGQgdG8gYmUgc2V0ICglZCkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBkZWZhdWx0X2tleXNwYWNlX3JmICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldERlZmF1bHRLZXlzcGFjZVJGKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlTWF4UkZUaHJlc2hvbGQoaW50IHdhcm4sIGludCBmYWlsKQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVNYXhJbnRUaHJlc2hvbGQod2FybiwgZmFpbCwgIm1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yIik7CisKKyAgICAgICAgaWYgKGZhaWwgIT0gLTEgJiYgZmFpbCA8IERhdGFiYXNlRGVzY3JpcHRvci5nZXREZWZhdWx0S2V5c3BhY2VSRigpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmb3JtYXQoIm1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkIHRvIGJlIHNldCAoJWQpICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBiZSBsZXNzZXIgdGhhbiBkZWZhdWx0X2tleXNwYWNlX3JmICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldERlZmF1bHRLZXlzcGFjZVJGKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVUaW1lc3RhbXBUaHJlc2hvbGQoRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCB3YXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIGZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKQorICAgIHsKKyAgICAgICAgLy8gdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBib3RoIHVwcGVyIGFuZCBsb3dlciB0aHJlc2hvbGRzIGJlY2F1c2UgbG93ZXIgdGhyZXNob2xkIGlzIHJlbGF0aXZlCisgICAgICAgIC8vIGRlc3BpdGUgdXNpbmcgTWluVGhyZXNob2xkIHdlIHN0aWxsIHdhbnQgdGhlIHdhcm4gdGhyZXNob2xkIHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0bworICAgICAgICAvLyB0aGUgZmFpbCB0aHJlc2hvbGQuCisgICAgICAgIHZhbGlkYXRlTWF4TG9uZ1RocmVzaG9sZCh3YXJuID09IG51bGwgPyAtMSA6IHdhcm4udG9NaWNyb3NlY29uZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPT0gbnVsbCA/IC0xIDogZmFpbC50b01pY3Jvc2Vjb25kcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdHJ1ZSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVdhcm5Mb3dlclRoYW5GYWlsKGxvbmcgd2FybiwgbG9uZyBmYWlsLCBTdHJpbmcgbmFtZSkKQEAgLTcxNSwxNSArOTY3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGFuIHRoZSBmYWlsIHRocmVzaG9sZCAlZCIsIHdhcm4sIG5hbWUsIGZhaWwpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlTWluUkZWZXJzdXNEZWZhdWx0UkYoaW50IGZhaWwsIFN0cmluZyBuYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoZmFpbCA+IERhdGFiYXNlRGVzY3JpcHRvci5nZXREZWZhdWx0S2V5c3BhY2VSRigpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzX2ZhaWxfdGhyZXNob2xkIHRvIGJlIHNldCAoJWQpIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gZGVmYXVsdF9rZXlzcGFjZV9yZiAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZmFpbCwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldERlZmF1bHRLZXlzcGFjZVJGKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVTaXplKERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCBzaXplLCBib29sZWFuIGFsbG93WmVybywgU3RyaW5nIG5hbWUpCiAgICAgewogICAgICAgICBpZiAoc2l6ZSA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL1lhbWxDb25maWd1cmF0aW9uTG9hZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvWWFtbENvbmZpZ3VyYXRpb25Mb2FkZXIuamF2YQppbmRleCA1MjhhY2NkLi5lZGZmN2JlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvWWFtbENvbmZpZ3VyYXRpb25Mb2FkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvWWFtbENvbmZpZ3VyYXRpb25Mb2FkZXIuamF2YQpAQCAtMjksNyArMjksNiBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLQogaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKQEAgLTQ2LDggKzQ1LDggQEAKIGltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuVHlwZURlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ZYW1sOwogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5jb21wb3Nlci5Db21wb3NlcjsKLWltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuY29uc3RydWN0b3IuU2FmZUNvbnN0cnVjdG9yOwogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5jb25zdHJ1Y3Rvci5DdXN0b21DbGFzc0xvYWRlckNvbnN0cnVjdG9yOworaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5jb25zdHJ1Y3Rvci5TYWZlQ29uc3RydWN0b3I7CiBpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLmVycm9yLllBTUxFeGNlcHRpb247CiBpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLmludHJvc3BlY3Rvci5NaXNzaW5nUHJvcGVydHk7CiBpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLmludHJvc3BlY3Rvci5Qcm9wZXJ0eTsKQEAgLTU2LDEzICs1NSwxMyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQUxMT1dfRFVQTElDQVRFX0NPTkZJR19LRVlTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFMTE9XX05FV19PTERfQ09ORklHX0tFWVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0NPTkZJRzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlJlcGxhY2VtZW50cy5nZXROYW1lUmVwbGFjZW1lbnRzOwogCiBwdWJsaWMgY2xhc3MgWWFtbENvbmZpZ3VyYXRpb25Mb2FkZXIgaW1wbGVtZW50cyBDb25maWd1cmF0aW9uTG9hZGVyCiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFlhbWxDb25maWd1cmF0aW9uTG9hZGVyLmNsYXNzKTsKIAotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX0NPTkZJR1VSQVRJT04gPSAiY2Fzc2FuZHJhLnlhbWwiOwogICAgIC8qKgogICAgICAqIFRoaXMgaXMgcmVsYXRlZCB0byB7QGxpbmsgQ29uZmlnI1BST1BFUlRZX1BSRUZJWH0gYnV0IGlzIGRpZmZlcmVudCB0byBtYWtlIHN1cmUgQ29uZmlnIHByb3BlcnRpZXMgdXBkYXRlZCB2aWEKICAgICAgKiBzeXN0ZW0gcHJvcGVydGllcyBkbyBub3QgY29uZmxpY3Qgd2l0aCBvdGhlciBzeXN0ZW0gcHJvcGVydGllczsgdGhlIG5hbWUgInNldHRpbmdzIiBtYXRjaGVzIHN5c3RlbV92aWV3cy5zZXR0aW5ncy4KQEAgLTc0LDkgKzczLDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBVUkwgZ2V0U3RvcmFnZUNvbmZpZ1VSTCgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTdHJpbmcgY29uZmlnVXJsID0gU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIik7Ci0gICAgICAgIGlmIChjb25maWdVcmwgPT0gbnVsbCkKLSAgICAgICAgICAgIGNvbmZpZ1VybCA9IERFRkFVTFRfQ09ORklHVVJBVElPTjsKKyAgICAgICAgU3RyaW5nIGNvbmZpZ1VybCA9IENBU1NBTkRSQV9DT05GSUcuZ2V0U3RyaW5nKCk7CiAKICAgICAgICAgVVJMIHVybDsKICAgICAgICAgdHJ5CkBAIC0yMDMsNiArMjAwLDggQEAKICAgICAgICAgWWFtbCByYXdZYW1sID0gbmV3IFlhbWwobG9hZGVyT3B0aW9ucyk7CiAKICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByYXdDb25maWcgPSByYXdZYW1sLmxvYWQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbmZpZ0J5dGVzKSk7CisgICAgICAgIGlmIChyYXdDb25maWcgPT0gbnVsbCkKKyAgICAgICAgICAgIHJhd0NvbmZpZyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgdmVyaWZ5UmVwbGFjZW1lbnRzKHJlcGxhY2VtZW50cywgcmF3Q29uZmlnKTsKIAogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQXNzaWdubWVudFRlc3RhYmxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0Fzc2lnbm1lbnRUZXN0YWJsZS5qYXZhCmluZGV4IDQxYjgwZWIuLmZkZjIxYjkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQXNzaWdubWVudFRlc3RhYmxlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Bc3NpZ25tZW50VGVzdGFibGUuamF2YQpAQCAtMTksNiArMTksMTAgQEAKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworCiBwdWJsaWMgaW50ZXJmYWNlIEFzc2lnbm1lbnRUZXN0YWJsZQogewogICAgIC8qKgpAQCAtMzIsNiArMzYsMjUgQEAKICAgICAgKi8KICAgICBwdWJsaWMgVGVzdFJlc3VsdCB0ZXN0QXNzaWdubWVudChTdHJpbmcga2V5c3BhY2UsIENvbHVtblNwZWNpZmljYXRpb24gcmVjZWl2ZXIpOwogCisgICAgLyoqCisgICAgICogQHJldHVybiBBIGRhdGEgdHlwZSB0aGF0IGNhbiByZXByZXNlbnQgdGhpcywgb3Ige0Bjb2RlIG51bGx9IGlmIHdlIGNhbid0IGRldGVybWluZSB0aGF0IHR5cGUuIFRoZSByZXR1cm5lZCB0eXBlCisgICAgICogd29uJ3QgbmVjZXNzYXJlbHkgYmUgdGhlIGV4YWN0IHR5cGUsIGJ1dCBvbmUgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggaXQuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRDb21wYXRpYmxlVHlwZUlmS25vd24oU3RyaW5nIGtleXNwYWNlKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gQSBkYXRhIHR5cGUgdGhhdCBjYW4gcmVwcmVzZW50IGFsbCB0aGUgc3BlY2lmaWVkIHR5cGVzLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlcmUgaXNuJ3Qgb25lLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBzdGF0aWMgQWJzdHJhY3RUeXBlPD8+IGdldENvbXBhdGlibGVUeXBlSWZLbm93bihDb2xsZWN0aW9uPEFic3RyYWN0VHlwZTw/Pj4gdHlwZXMpCisgICAgeworICAgICAgICByZXR1cm4gdHlwZXMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih0eXBlIC0+IHR5cGVzLnN0cmVhbSgpLmFsbE1hdGNoKHQgLT4gdC50ZXN0QXNzaWdubWVudCh0eXBlKS5pc0Fzc2lnbmFibGUoKSkpCisgICAgICAgICAgICAgICAgICAgIC5maW5kRmlyc3QoKQorICAgICAgICAgICAgICAgICAgICAub3JFbHNlKG51bGwpOworICAgIH0KKwogICAgIHB1YmxpYyBlbnVtIFRlc3RSZXN1bHQKICAgICB7CiAgICAgICAgIEVYQUNUX01BVENILCBXRUFLTFlfQVNTSUdOQUJMRSwgTk9UX0FTU0lHTkFCTEU7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0F0dHJpYnV0ZXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQXR0cmlidXRlcy5qYXZhCmluZGV4IGU4NDE4MjguLjU1OTg4MmYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQXR0cmlidXRlcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQXR0cmlidXRlcy5qYXZhCkBAIC0xMTcsNiArMTE3LDExIEBACiAgICAgICAgIGlmICh0dmFsID09IEJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSKQogICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhLnBhcmFtcy5kZWZhdWx0VGltZVRvTGl2ZTsKIAorICAgICAgICAvLyBieXRlWzBdIGFuZCBudWxsIGFyZSB0aGUgc2FtZSBmb3IgSW50MzJUeXBlLiAgVU5TRVRfQllURV9CVUZGRVIgaXMgYWxzbyBieXRlWzBdIGJ1dCB3ZSByZWx5IG9uIHBvaW50ZXIKKyAgICAgICAgLy8gaWRlbnRpdHksIHNvIG5lZWQgdG8gY2hlY2sgdGhpcyBhZnRlciBjaGVja2luZyB0aGF0CisgICAgICAgIGlmIChCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUi5lcXVhbHModHZhbCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKwogICAgICAgICB0cnkKICAgICAgICAgewogICAgICAgICAgICAgSW50MzJUeXBlLmluc3RhbmNlLnZhbGlkYXRlKHR2YWwpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DUUwzVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DUUwzVHlwZS5qYXZhCmluZGV4IDFkNzkyYjIuLjFkZDY0MWEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ1FMM1R5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0NRTDNUeXBlLmphdmEKQEAgLTI0LDEzICsyNCwxMyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkNvbGxlY3Rpb25UeXBlLktpbmQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5TeW50YXhFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVHlwZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuQ29sbGVjdGlvblNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKQEAgLTU0LDcgKzU0LDYgQEAKICAgICB9CiAKICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldFR5cGUoKTsKLSAgICBkZWZhdWx0IHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0VURGVHlwZSgpIHsgcmV0dXJuIGdldFR5cGUoKTsgfQogCiAgICAgLyoqCiAgICAgICogR2VuZXJhdGVzIENRTCBsaXRlcmFsIGZyb20gYSBiaW5hcnkgdmFsdWUgb2YgdGhpcyB0eXBlLgpAQCAtMTAxLDExICsxMDAsNiBAQAogICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldFVERlR5cGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBUSU1FVVVJRCA/IFVVSUQudHlwZSA6IHR5cGU7Ci0gICAgICAgIH0KLQogICAgICAgICAvKioKICAgICAgICAgICogRGVsZWdhdGUgdG8KICAgICAgICAgICoge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlR5cGVTZXJpYWxpemVyI3RvQ1FMTGl0ZXJhbChCeXRlQnVmZmVyKX0KQEAgLTE3NiwxNCArMTcwLDE0IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbGxlY3Rpb24gaW1wbGVtZW50cyBDUUwzVHlwZQogICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uVHlwZSB0eXBlOworICAgICAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25UeXBlPD8+IHR5cGU7CiAKLSAgICAgICAgcHVibGljIENvbGxlY3Rpb24oQ29sbGVjdGlvblR5cGUgdHlwZSkKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb24oQ29sbGVjdGlvblR5cGU8Pz4gdHlwZSkKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0VHlwZSgpCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uVHlwZTw/PiBnZXRUeXBlKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgICAgIH0KQEAgLTIwMSwxOSArMTk1LDE5IEBACiAKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdGFyZ2V0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5kdXBsaWNhdGUoKTsKLSAgICAgICAgICAgIGludCBzaXplID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZENvbGxlY3Rpb25TaXplKGJ1ZmZlciwgdmVyc2lvbik7Ci0gICAgICAgICAgICBidWZmZXIucG9zaXRpb24oYnVmZmVyLnBvc2l0aW9uKCkgKyBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZDb2xsZWN0aW9uU2l6ZShzaXplLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRDb2xsZWN0aW9uU2l6ZShidWZmZXIsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CisgICAgICAgICAgICBidWZmZXIucG9zaXRpb24oYnVmZmVyLnBvc2l0aW9uKCkgKyBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZDb2xsZWN0aW9uU2l6ZSgpKTsKIAogICAgICAgICAgICAgc3dpdGNoICh0eXBlLmtpbmQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgY2FzZSBMSVNUOgotICAgICAgICAgICAgICAgICAgICBDUUwzVHlwZSBlbGVtZW50cyA9ICgoTGlzdFR5cGUpIHR5cGUpLmdldEVsZW1lbnRzVHlwZSgpLmFzQ1FMM1R5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgQ1FMM1R5cGUgZWxlbWVudHMgPSAoKExpc3RUeXBlPD8+KSB0eXBlKS5nZXRFbGVtZW50c1R5cGUoKS5hc0NRTDNUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5hcHBlbmQoJ1snKTsKICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTZXRPckxpc3RDUUxMaXRlcmFsKGJ1ZmZlciwgdmVyc2lvbiwgdGFyZ2V0LCBzaXplLCBlbGVtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5hcHBlbmQoJ10nKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gKChTZXRUeXBlKSB0eXBlKS5nZXRFbGVtZW50c1R5cGUoKS5hc0NRTDNUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gKChTZXRUeXBlPD8+KSB0eXBlKS5nZXRFbGVtZW50c1R5cGUoKS5hc0NRTDNUeXBlKCk7CiAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5hcHBlbmQoJ3snKTsKICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVTZXRPckxpc3RDUUxMaXRlcmFsKGJ1ZmZlciwgdmVyc2lvbiwgdGFyZ2V0LCBzaXplLCBlbGVtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5hcHBlbmQoJ30nKTsKQEAgLTIyOSwxOSArMjIzLDE5IEBACiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlTWFwQ1FMTGl0ZXJhbChCeXRlQnVmZmVyIGJ1ZmZlciwgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24sIFN0cmluZ0J1aWxkZXIgdGFyZ2V0LCBpbnQgc2l6ZSkKICAgICAgICAgewotICAgICAgICAgICAgQ1FMM1R5cGUga2V5cyA9ICgoTWFwVHlwZSkgdHlwZSkuZ2V0S2V5c1R5cGUoKS5hc0NRTDNUeXBlKCk7Ci0gICAgICAgICAgICBDUUwzVHlwZSB2YWx1ZXMgPSAoKE1hcFR5cGUpIHR5cGUpLmdldFZhbHVlc1R5cGUoKS5hc0NRTDNUeXBlKCk7CisgICAgICAgICAgICBDUUwzVHlwZSBrZXlzID0gKChNYXBUeXBlPD8sID8+KSB0eXBlKS5nZXRLZXlzVHlwZSgpLmFzQ1FMM1R5cGUoKTsKKyAgICAgICAgICAgIENRTDNUeXBlIHZhbHVlcyA9ICgoTWFwVHlwZTw/LCA/PikgdHlwZSkuZ2V0VmFsdWVzVHlwZSgpLmFzQ1FMM1R5cGUoKTsKICAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQogICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgZWxlbWVudCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShidWZmZXIsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgb2Zmc2V0LCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUoZWxlbWVudCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGVsZW1lbnQgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUoYnVmZmVyLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKGVsZW1lbnQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgdGFyZ2V0LmFwcGVuZChrZXlzLnRvQ1FMTGl0ZXJhbChlbGVtZW50LCB2ZXJzaW9uKSk7CiAgICAgICAgICAgICAgICAgdGFyZ2V0LmFwcGVuZCgiOiAiKTsKLSAgICAgICAgICAgICAgICBlbGVtZW50ID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKGJ1ZmZlciwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQsIHZlcnNpb24pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZShlbGVtZW50LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUoYnVmZmVyLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKGVsZW1lbnQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgdGFyZ2V0LmFwcGVuZCh2YWx1ZXMudG9DUUxMaXRlcmFsKGVsZW1lbnQsIHZlcnNpb24pKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjUzLDggKzI0Nyw4IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKGkgPiAwKQogICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgZWxlbWVudCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShidWZmZXIsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgb2Zmc2V0LCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUoZWxlbWVudCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGVsZW1lbnQgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUoYnVmZmVyLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKGVsZW1lbnQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgdGFyZ2V0LmFwcGVuZChlbGVtZW50cy50b0NRTExpdGVyYWwoZWxlbWVudCwgdmVyc2lvbikpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yODMsMTYgKzI3NywxNiBAQAogICAgICAgICAgICAgc3dpdGNoICh0eXBlLmtpbmQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgY2FzZSBMSVNUOgotICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gbGlzdFR5cGUgPSAoKExpc3RUeXBlKXR5cGUpLmdldEVsZW1lbnRzVHlwZSgpOworICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gbGlzdFR5cGUgPSAoKExpc3RUeXBlPD8+KSB0eXBlKS5nZXRFbGVtZW50c1R5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJsaXN0PCIpLmFwcGVuZChsaXN0VHlwZS5hc0NRTDNUeXBlKCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHNldFR5cGUgPSAoKFNldFR5cGUpdHlwZSkuZ2V0RWxlbWVudHNUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBzZXRUeXBlID0gKChTZXRUeXBlPD8+KSB0eXBlKS5nZXRFbGVtZW50c1R5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJzZXQ8IikuYXBwZW5kKHNldFR5cGUuYXNDUUwzVHlwZSgpKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBNQVA6Ci0gICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBrZXlzVHlwZSA9ICgoTWFwVHlwZSl0eXBlKS5nZXRLZXlzVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdmFsdWVzVHlwZSA9ICgoTWFwVHlwZSl0eXBlKS5nZXRWYWx1ZXNUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBrZXlzVHlwZSA9ICgoTWFwVHlwZTw/LCA/PikgdHlwZSkuZ2V0S2V5c1R5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHZhbHVlc1R5cGUgPSAoKE1hcFR5cGU8PywgPz4pIHR5cGUpLmdldFZhbHVlc1R5cGUoKTsKICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJtYXA8IikuYXBwZW5kKGtleXNUeXBlLmFzQ1FMM1R5cGUoKSkuYXBwZW5kKCIsICIpLmFwcGVuZCh2YWx1ZXNUeXBlLmFzQ1FMM1R5cGUoKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC00MTYsNyArNDEwLDcgQEAKICAgICAgICAgICAgIHJldHVybiBuZXcgVHVwbGUodHlwZSk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldFR5cGUoKQorICAgICAgICBwdWJsaWMgVHVwbGVUeXBlIGdldFR5cGUoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Db25zdGFudHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ29uc3RhbnRzLmphdmEKaW5kZXggNjRkOWQ2OS4uZjQ0MThmZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Db25zdGFudHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0NvbnN0YW50cy5qYXZhCkBAIC0yMCwxNyArMjAsMTUgQEAKIGltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwpAQCAtNDEsMTUgKzM5LDE0IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25zdGFudHMKIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29uc3RhbnRzLmNsYXNzKTsKLQogICAgIHB1YmxpYyBlbnVtIFR5cGUKICAgICB7CiAgICAgICAgIFNUUklORwogICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0UHJlZmVyZWRUeXBlRm9yKFN0cmluZyB0ZXh0KQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBpZihDaGFyc2V0LmZvck5hbWUoIlVTLUFTQ0lJIikubmV3RW5jb2RlcigpLmNhbkVuY29kZSh0ZXh0KSkKKyAgICAgICAgICAgICAgICAgaWYgKFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkubmV3RW5jb2RlcigpLmNhbkVuY29kZSh0ZXh0KSkKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFzY2lpVHlwZS5pbnN0YW5jZTsKICAgICAgICAgICAgICAgICAgfQpAQCAtNTksNiArNTYsNyBAQAogICAgICAgICB9LAogICAgICAgICBJTlRFR0VSCiAgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRQcmVmZXJlZFR5cGVGb3IoU3RyaW5nIHRleHQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSB0cnkgdG8gZGV0ZXJtaW5lIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSB0eXBlIGJldHdlZW4gaW50LCBsb25nIGFuZCBCaWdJbnRlZ2VyCkBAIC03Myw5ICs3MSwxOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyVHlwZS5pbnN0YW5jZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSwKLSAgICAgICAgVVVJRCwKKyAgICAgICAgVVVJRAorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0UHJlZmVyZWRUeXBlRm9yKFN0cmluZyB0ZXh0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBqYXZhLnV0aWwuVVVJRC5mcm9tU3RyaW5nKHRleHQpLnZlcnNpb24oKSA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgID8gVGltZVVVSURUeXBlLmluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgICAgIDogVVVJRFR5cGUuaW5zdGFuY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCiAgICAgICAgIEZMT0FUCiAgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRQcmVmZXJlZFR5cGVGb3IoU3RyaW5nIHRleHQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYgKCJOYU4iLmVxdWFscyh0ZXh0KSB8fCAiLU5hTiIuZXF1YWxzKHRleHQpIHx8ICJJbmZpbml0eSIuZXF1YWxzKHRleHQpIHx8ICItSW5maW5pdHkiLmVxdWFscyh0ZXh0KSkKQEAgLTkwLDkgKzk4LDMwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIERlY2ltYWxUeXBlLmluc3RhbmNlOwogICAgICAgICAgICAgfQogICAgICAgICB9LAotICAgICAgICBCT09MRUFOLAotICAgICAgICBIRVgsCi0gICAgICAgIERVUkFUSU9OOworICAgICAgICBCT09MRUFOCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRQcmVmZXJlZFR5cGVGb3IoU3RyaW5nIHRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW5UeXBlLmluc3RhbmNlOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBIRVgKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldFByZWZlcmVkVHlwZUZvcihTdHJpbmcgdGV4dCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQnl0ZVR5cGUuaW5zdGFuY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIERVUkFUSU9OCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRQcmVmZXJlZFR5cGVGb3IoU3RyaW5nIHRleHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIER1cmF0aW9uVHlwZS5pbnN0YW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKIAogICAgICAgICAvKioKICAgICAgICAgICogUmV0dXJucyB0aGUgZXhhY3QgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCB0ZXh0CkBAIC0zNjIsNiArMzkxLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldENvbXBhdGlibGVUeXBlSWZLbm93bihTdHJpbmcga2V5c3BhY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwcmVmZXJlZFR5cGU7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJhd1RleHQoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gdGV4dDsKQEAgLTM4NSw3ICs0MjAsNyBAQAogICAgICAgICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGJ5dGVzOwogICAgICAgICB9CkBAIC00OTQsMTAgKzUyOSw5IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBhcHBlbmQgPSB0LmJpbmRBbmRHZXQocGFyYW1zLm9wdGlvbnMpOwogICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgY3VycmVudCA9IGdldEN1cnJlbnRDZWxsQnVmZmVyKHBhcnRpdGlvbktleSwgcGFyYW1zKTsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIG5ld1ZhbHVlOwogICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoY3VycmVudC5yZW1haW5pbmcoKSArIGFwcGVuZC5yZW1haW5pbmcoKSk7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBuZXdWYWx1ZSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoY3VycmVudC5yZW1haW5pbmcoKSArIGFwcGVuZC5yZW1haW5pbmcoKSk7CiAgICAgICAgICAgICAgICAgRmFzdEJ5dGVPcGVyYXRpb25zLmNvcHkoY3VycmVudCwgY3VycmVudC5wb3NpdGlvbigpLCBuZXdWYWx1ZSwgbmV3VmFsdWUucG9zaXRpb24oKSwgY3VycmVudC5yZW1haW5pbmcoKSk7CiAgICAgICAgICAgICAgICAgRmFzdEJ5dGVPcGVyYXRpb25zLmNvcHkoYXBwZW5kLCBhcHBlbmQucG9zaXRpb24oKSwgbmV3VmFsdWUsIG5ld1ZhbHVlLnBvc2l0aW9uKCkgKyBjdXJyZW50LnJlbWFpbmluZygpLCBhcHBlbmQucmVtYWluaW5nKCkpOwogICAgICAgICAgICAgICAgIHBhcmFtcy5hZGRDZWxsKGNvbHVtbiwgbmV3VmFsdWUpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DdXN0b21QYXlsb2FkTWlycm9yaW5nUXVlcnlIYW5kbGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0N1c3RvbVBheWxvYWRNaXJyb3JpbmdRdWVyeUhhbmRsZXIuamF2YQppbmRleCAxM2FhN2Y1Li5hZjc2NWQwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0N1c3RvbVBheWxvYWRNaXJyb3JpbmdRdWVyeUhhbmRsZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0N1c3RvbVBheWxvYWRNaXJyb3JpbmdRdWVyeUhhbmRsZXIuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLkJhdGNoU3RhdGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5RdWVyeVN0YXRlOwpAQCAtMjksNyArMzAsNyBAQAogLyoqCiAgKiBDdXN0b20gUXVlcnlIYW5kbGVyIHRoYXQgc2VuZHMgY3VzdG9tIHJlcXVlc3QgcGF5bG9hZHMgYmFjayB3aXRoIHRoZSByZXN1bHQuCiAgKiBVc2VkIHRvIGZhY2lsaXRhdGUgdGVzdGluZy4KLSAqIEVuYWJsZWQgd2l0aCBzeXN0ZW0gcHJvcGVydHkgY2Fzc2FuZHJhLmN1c3RvbV9xdWVyeV9oYW5kbGVyX2NsYXNzLgorICogRW5hYmxlZCB3aXRoIHN5c3RlbSBwcm9wZXJ0eSB7QGxpbmsgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzI0NVU1RPTV9RVUVSWV9IQU5ETEVSX0NMQVNTfS4KICAqLwogcHVibGljIGNsYXNzIEN1c3RvbVBheWxvYWRNaXJyb3JpbmdRdWVyeUhhbmRsZXIgaW1wbGVtZW50cyBRdWVyeUhhbmRsZXIKIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvSnNvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Kc29uLmphdmEKaW5kZXggZDA1MDk2YS4uZDYwZWFiZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Kc29uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Kc29uLmphdmEKQEAgLTE4LDQ0ICsxOCwzMSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCi1pbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUudXRpbC5CdWZmZXJSZWN5Y2xlcnM7Ci1pbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdE1hcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKIAotLyoqIFRlcm0tcmVsYXRlZCBjbGFzc2VzIGZvciBJTlNFUlQgSlNPTiBzdXBwb3J0LiAqLwotcHVibGljIGNsYXNzIEpzb24KK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CisKKy8qKgorICogVGVybS1yZWxhdGVkIGNsYXNzZXMgZm9yIElOU0VSVCBKU09OIHN1cHBvcnQuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKc29uCiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RNYXBwZXIgSlNPTl9PQkpFQ1RfTUFQUEVSID0gbmV3IE9iamVjdE1hcHBlcigpOwotCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5JZGVudGlmaWVyIEpTT05fQ09MVU1OX0lEID0gbmV3IENvbHVtbklkZW50aWZpZXIoIltqc29uXSIsIHRydWUpOwogCi0gICAgLyoqCi0gICAgICogUXVvdGVzIHN0cmluZyBjb250ZW50cyB1c2luZyBzdGFuZGFyZCBKU09OIHF1b3RpbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcXVvdGVBc0pzb25TdHJpbmcoU3RyaW5nIHMpCisgICAgcHJpdmF0ZSBKc29uKCkKICAgICB7Ci0gICAgICAgIC8vIEluIGZ1dHVyZSBzaG91bGQgdXBkYXRlIHRvIGRpcmVjdGx5IHVzZSBgSnNvblN0cmluZ0VuY29kZXIuZ2V0SW5zdGFuY2UoKWAgYnV0IGZvciBub3c6Ci0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nKEJ1ZmZlclJlY3ljbGVycy5nZXRKc29uU3RyaW5nRW5jb2RlcigpLnF1b3RlQXNTdHJpbmcocykpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGRlY29kZUpzb24oU3RyaW5nIGpzb24pCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEpTT05fT0JKRUNUX01BUFBFUi5yZWFkVmFsdWUoanNvbiwgT2JqZWN0LmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXhjKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiRXJyb3IgZGVjb2RpbmcgSlNPTiBzdHJpbmc6ICIgKyBleGMuZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBpbnRlcmZhY2UgUmF3CkBAIC0xMzEsMTMgKzExOCwxMyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBUZXJtIHZhbHVlID0gY29sdW1uTWFwLmdldChkZWYubmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbAotICAgICAgICAgICAgICAgICA/IChkZWZhdWx0VW5zZXQgPyBDb25zdGFudHMuVU5TRVRfTElURVJBTCA6IENvbnN0YW50cy5OVUxMX0xJVEVSQUwpCi0gICAgICAgICAgICAgICAgIDogbmV3IENvbHVtblZhbHVlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICA/IChkZWZhdWx0VW5zZXQgPyBDb25zdGFudHMuVU5TRVRfTElURVJBTCA6IENvbnN0YW50cy5OVUxMX0xJVEVSQUwpCisgICAgICAgICAgICAgICAgICAgOiBuZXcgQ29sdW1uVmFsdWUodmFsdWUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogIEEgcHJlcGFyZWQgYmluZCBtYXJrZXIgZm9yIGEgc2V0IG9mIEpTT04gdmFsdWVzCisgICAgICogQSBwcmVwYXJlZCBiaW5kIG1hcmtlciBmb3IgYSBzZXQgb2YgSlNPTiB2YWx1ZXMKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcmVwYXJlZE1hcmtlciBleHRlbmRzIFByZXBhcmVkCiAgICAgewpAQCAtMTU4LDcgKzE0NSw3IEBACiAKICAgICAvKioKICAgICAgKiBBIFRlcm1pbmFsIGZvciBhIHNpbmdsZSBjb2x1bW4uCi0gICAgICoKKyAgICAgKiA8cD4KICAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBpbnRyaW5zaWNhbGx5IGFuIGFscmVhZHkgcHJlcGFyZWQgdGVybSwgYnV0IHRoaXMgc3RpbGwgaW1wbGVtZW50cyBUZXJtLlJhdyBzbyB0aGF0IHdlIGNhbgogICAgICAqIGVhc2lseSB1c2UgaXQgdG8gY3JlYXRlIHJhdyBvcGVyYXRpb25zLgogICAgICAqLwpAQCAtMjY2LDggKzI1Myw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFRlcm0gdGVybSA9IG9wdGlvbnMuZ2V0SnNvbkNvbHVtblZhbHVlKG1hcmtlci5iaW5kSW5kZXgsIGNvbHVtbi5uYW1lLCBtYXJrZXIuY29sdW1ucyk7CiAgICAgICAgICAgICByZXR1cm4gdGVybSA9PSBudWxsCi0gICAgICAgICAgICAgICAgID8gKGRlZmF1bHRVbnNldCA/IENvbnN0YW50cy5VTlNFVF9WQUxVRSA6IG51bGwpCi0gICAgICAgICAgICAgICAgIDogdGVybS5iaW5kKG9wdGlvbnMpOworICAgICAgICAgICAgICAgICAgID8gKGRlZmF1bHRVbnNldCA/IENvbnN0YW50cy5VTlNFVF9WQUxVRSA6IG51bGwpCisgICAgICAgICAgICAgICAgICAgOiB0ZXJtLmJpbmQob3B0aW9ucyk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTI3OSwxNiArMjY2LDE2IEBACiAgICAgLyoqCiAgICAgICogR2l2ZW4gYSBKU09OIHN0cmluZywgcmV0dXJuIGEgbWFwIG9mIGNvbHVtbnMgdG8gdGhlaXIgdmFsdWVzIGZvciB0aGUgaW5zZXJ0LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWFwPENvbHVtbklkZW50aWZpZXIsIFRlcm0+IHBhcnNlSnNvbihTdHJpbmcganNvblN0cmluZywgQ29sbGVjdGlvbjxDb2x1bW5NZXRhZGF0YT4gZXhwZWN0ZWRSZWNlaXZlcnMpCisgICAgc3RhdGljIE1hcDxDb2x1bW5JZGVudGlmaWVyLCBUZXJtPiBwYXJzZUpzb24oU3RyaW5nIGpzb25TdHJpbmcsIENvbGxlY3Rpb248Q29sdW1uTWV0YWRhdGE+IGV4cGVjdGVkUmVjZWl2ZXJzKQogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gdmFsdWVNYXAgPSBKU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKGpzb25TdHJpbmcsIE1hcC5jbGFzcyk7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHZhbHVlTWFwID0gSnNvblV0aWxzLkpTT05fT0JKRUNUX01BUFBFUi5yZWFkVmFsdWUoanNvblN0cmluZywgTWFwLmNsYXNzKTsKIAogICAgICAgICAgICAgaWYgKHZhbHVlTWFwID09IG51bGwpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKCJHb3QgbnVsbCBmb3IgSU5TRVJUIEpTT04gdmFsdWVzIik7CiAKLSAgICAgICAgICAgIGhhbmRsZUNhc2VTZW5zaXRpdml0eSh2YWx1ZU1hcCk7CisgICAgICAgICAgICBKc29uVXRpbHMuaGFuZGxlQ2FzZVNlbnNpdGl2aXR5KHZhbHVlTWFwKTsKIAogICAgICAgICAgICAgTWFwPENvbHVtbklkZW50aWZpZXIsIFRlcm0+IGNvbHVtbk1hcCA9IG5ldyBIYXNoTWFwPD4oZXhwZWN0ZWRSZWNlaXZlcnMuc2l6ZSgpKTsKICAgICAgICAgICAgIGZvciAoQ29sdW1uU3BlY2lmaWNhdGlvbiBzcGVjIDogZXhwZWN0ZWRSZWNlaXZlcnMpCkBAIC0zMTAsNDkgKzI5NywyOCBAQAogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5NYXAucHV0KHNwZWMubmFtZSwgc3BlYy50eXBlLmZyb21KU09OT2JqZWN0KHBhcnNlZEpzb25PYmplY3QpKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaChNYXJzaGFsRXhjZXB0aW9uIGV4YykKKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKE1hcnNoYWxFeGNlcHRpb24gZXhjKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiRXJyb3IgZGVjb2RpbmcgSlNPTiB2YWx1ZSBmb3IgJXM6ICVzIiwgc3BlYy5uYW1lLCBleGMuZ2V0TWVzc2FnZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oZm9ybWF0KCJFcnJvciBkZWNvZGluZyBKU09OIHZhbHVlIGZvciAlczogJXMiLCBzcGVjLm5hbWUsIGV4Yy5nZXRNZXNzYWdlKCkpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKCF2YWx1ZU1hcC5pc0VtcHR5KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAiSlNPTiB2YWx1ZXMgbWFwIGNvbnRhaW5zIHVucmVjb2duaXplZCBjb2x1bW46ICVzIiwgdmFsdWVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCkpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oZm9ybWF0KCJKU09OIHZhbHVlcyBtYXAgY29udGFpbnMgdW5yZWNvZ25pemVkIGNvbHVtbjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVNYXAua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCkpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIGNvbHVtbk1hcDsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXhjKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQ291bGQgbm90IGRlY29kZSBKU09OIHN0cmluZyBhcyBhIG1hcDogJXMuIChTdHJpbmcgd2FzOiAlcykiLCBleGMudG9TdHJpbmcoKSwganNvblN0cmluZykpOworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKGZvcm1hdCgiQ291bGQgbm90IGRlY29kZSBKU09OIHN0cmluZyBhcyBhIG1hcDogJXMuIChTdHJpbmcgd2FzOiAlcykiLCBleGMudG9TdHJpbmcoKSwganNvblN0cmluZykpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChNYXJzaGFsRXhjZXB0aW9uIGV4YykKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKGV4Yy5nZXRNZXNzYWdlKCkpOwogICAgICAgICB9CiAgICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyB1bnF1b3RpbmcgYW5kIGNhc2UtaW5zZW5zaXRpdml0eSBpbiBtYXAga2V5cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlQ2FzZVNlbnNpdGl2aXR5KE1hcDxTdHJpbmcsIE9iamVjdD4gdmFsdWVNYXApCi0gICAgewotICAgICAgICBmb3IgKFN0cmluZyBtYXBLZXkgOiBuZXcgQXJyYXlMaXN0PD4odmFsdWVNYXAua2V5U2V0KCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiBpdCdzIHN1cnJvdW5kZWQgYnkgcXVvdGVzLCByZW1vdmUgdGhlbSBhbmQgcHJlc2VydmUgdGhlIGNhc2UKLSAgICAgICAgICAgIGlmIChtYXBLZXkuc3RhcnRzV2l0aCgiXCIiKSAmJiBtYXBLZXkuZW5kc1dpdGgoIlwiIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsdWVNYXAucHV0KG1hcEtleS5zdWJzdHJpbmcoMSwgbWFwS2V5Lmxlbmd0aCgpIC0gMSksIHZhbHVlTWFwLnJlbW92ZShtYXBLZXkpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBsb3dlcmNhc2UgaXQgaWYgbmVlZGVkCi0gICAgICAgICAgICBTdHJpbmcgbG93ZXJlZCA9IG1hcEtleS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOwotICAgICAgICAgICAgaWYgKCFtYXBLZXkuZXF1YWxzKGxvd2VyZWQpKQotICAgICAgICAgICAgICAgIHZhbHVlTWFwLnB1dChsb3dlcmVkLCB2YWx1ZU1hcC5yZW1vdmUobWFwS2V5KSk7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0xpc3RzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0xpc3RzLmphdmEKaW5kZXggYmRhYzA0Ni4uNjA1YThiZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9MaXN0cy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvTGlzdHMuamF2YQpAQCAtMTcsMTUgKzE3LDEyIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMzsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbnN0YW50cy5VTlNFVF9WQUxVRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IuYXRVbml4TWlsbGlzQXNCeXRlczsKLQogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIGltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbVN1cHBvcnQ7CkBAIC00Nyw2ICs0NCwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db25zdGFudHMuVU5TRVRfVkFMVUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLmF0VW5peE1pbGxpc0FzQnl0ZXM7CisKIC8qKgogICogU3RhdGljIGhlbHBlciBtZXRob2RzIGFuZCBjbGFzc2VzIGZvciBsaXN0cy4KICAqLwpAQCAtNzEsNyArNzIsNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQWJzdHJhY3RUeXBlPD8+IGVsZW1lbnRzVHlwZShBYnN0cmFjdFR5cGU8Pz4gdHlwZSkKICAgICB7Ci0gICAgICAgIHJldHVybiAoKExpc3RUeXBlKSB1bndyYXAodHlwZSkpLmdldEVsZW1lbnRzVHlwZSgpOworICAgICAgICByZXR1cm4gKChMaXN0VHlwZTw/PikgdW53cmFwKHR5cGUpKS5nZXRFbGVtZW50c1R5cGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTExNiw3ICsxMTcsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFN0cmluZyBsaXN0VG9TdHJpbmcoSXRlcmFibGU8VD4gaXRlbXMsIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxULCBTdHJpbmc+IG1hcHBlcikKICAgICB7CiAgICAgICAgIHJldHVybiBTdHJlYW1TdXBwb3J0LnN0cmVhbShpdGVtcy5zcGxpdGVyYXRvcigpLCBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGUgLT4gbWFwcGVyLmFwcGx5KGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAobWFwcGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiLCAiWyIsICJdIikpOwogICAgIH0KIApAQCAtMTI3LDEzICsxMjgsMjEgQEAKICAgICAgKiBAcGFyYW0gbWFwcGVyIHRoZSBtYXBwZXIgdXNlZCB0byByZXRyaWV2ZSB0aGUgZWxlbWVudCB0eXBlcyBmcm9tIHRoZSBpdGVtcwogICAgICAqIEByZXR1cm4gdGhlIGV4YWN0IExpc3RUeXBlIGZyb20gdGhlIGl0ZW1zIGlmIGl0IGNhbiBiZSBrbm93biBvciA8Y29kZT5udWxsPC9jb2RlPgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEFic3RyYWN0VHlwZTw/PiBnZXRFeGFjdExpc3RUeXBlSWZLbm93bihMaXN0PFQ+IGl0ZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248VCwgQWJzdHJhY3RUeXBlPD8+PiBtYXBwZXIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gTGlzdFR5cGU8Pz4gZ2V0RXhhY3RMaXN0VHlwZUlmS25vd24oTGlzdDxUPiBpdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248VCwgQWJzdHJhY3RUeXBlPD8+PiBtYXBwZXIpCiAgICAgewogICAgICAgICBPcHRpb25hbDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGUgPSBpdGVtcy5zdHJlYW0oKS5tYXAobWFwcGVyKS5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkuZmluZEZpcnN0KCk7CiAgICAgICAgIHJldHVybiB0eXBlLmlzUHJlc2VudCgpID8gTGlzdFR5cGUuZ2V0SW5zdGFuY2UodHlwZS5nZXQoKSwgZmFsc2UpIDogbnVsbDsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBMaXN0VHlwZTw/PiBnZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShMaXN0PFQ+IGl0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxULCBBYnN0cmFjdFR5cGU8Pz4+IG1hcHBlcikKKyAgICB7CisgICAgICAgIFNldDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzID0gaXRlbXMuc3RyZWFtKCkubWFwKG1hcHBlcikuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSBBc3NpZ25tZW50VGVzdGFibGUuZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKHR5cGVzKTsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gbnVsbCA/IG51bGwgOiBMaXN0VHlwZS5nZXRJbnN0YW5jZSh0eXBlLCBmYWxzZSk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaXRlcmFsIGV4dGVuZHMgVGVybS5SYXcKICAgICB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxUZXJtLlJhdz4gZWxlbWVudHM7CkBAIC0xOTIsNiArMjAxLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gZ2V0RXhhY3RMaXN0VHlwZUlmS25vd24oZWxlbWVudHMsIHAgLT4gcC5nZXRFeGFjdFR5cGVJZktub3duKGtleXNwYWNlKSk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRDb21wYXRpYmxlVHlwZUlmS25vd24oU3RyaW5nIGtleXNwYWNlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTGlzdHMuZ2V0UHJlZmVycmVkQ29tcGF0aWJsZVR5cGUoZWxlbWVudHMsIHAgLT4gcC5nZXRDb21wYXRpYmxlVHlwZUlmS25vd24oa2V5c3BhY2UpKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBsaXN0VG9TdHJpbmcoZWxlbWVudHMsIFRlcm0uUmF3OjpnZXRUZXh0KTsKQEAgLTIwNywxNSArMjIyLDE1IEBACiAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgc3RhdGljIFZhbHVlIGZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgdmFsdWUsIExpc3RUeXBlIHR5cGUsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KKyAgICAgICAgcHVibGljIHN0YXRpYyA8VD4gVmFsdWUgZnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciB2YWx1ZSwgTGlzdFR5cGU8VD4gdHlwZSkgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIENvbGxlY3Rpb25zIGhhdmUgdGhpcyBzbWFsbCBoYWNrIHRoYXQgdmFsaWRhdGUgY2Fubm90IGJlIGNhbGxlZCBvbiBhIHNlcmlhbGl6ZWQgb2JqZWN0LAogICAgICAgICAgICAgICAgIC8vIGJ1dCBjb21wb3NlIGRvZXMgdGhlIHZhbGlkYXRpb24gKHNvIHdlJ3JlIGZpbmUpLgotICAgICAgICAgICAgICAgIExpc3Q8Pz4gbCA9IHR5cGUuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2wodmFsdWUsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgTGlzdDxUPiBsID0gdHlwZS5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUodmFsdWUsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8PihsLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgZWxlbWVudCA6IGwpCisgICAgICAgICAgICAgICAgZm9yIChUIGVsZW1lbnQgOiBsKQogICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyBjYW4gYmUgbnVsbCBpbiBsaXN0cyB0aGF0IHJlcHJlc2VudCBhIHNldCBvZiBJTiB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKGVsZW1lbnQgPT0gbnVsbCA/IG51bGwgOiB0eXBlLmdldEVsZW1lbnRzVHlwZSgpLmRlY29tcG9zZShlbGVtZW50KSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZShlbGVtZW50cyk7CkBAIC0yMjYsMTIgKzI0MSwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2soZWxlbWVudHMsIGVsZW1lbnRzLnNpemUoKSwgcHJvdG9jb2xWZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGVsZW1lbnRzLCBlbGVtZW50cy5zaXplKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKExpc3RUeXBlIGx0LCBWYWx1ZSB2KQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoTGlzdFR5cGU8Pz4gbHQsIFZhbHVlIHYpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChlbGVtZW50cy5zaXplKCkgIT0gdi5lbGVtZW50cy5zaXplKCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzE4LDcgKzMzMyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICBpZiAodmFsdWUgPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIpCiAgICAgICAgICAgICAgICAgcmV0dXJuIFVOU0VUX1ZBTFVFOwotICAgICAgICAgICAgcmV0dXJuIFZhbHVlLmZyb21TZXJpYWxpemVkKHZhbHVlLCAoTGlzdFR5cGUpcmVjZWl2ZXIudHlwZSwgb3B0aW9ucy5nZXRQcm90b2NvbFZlcnNpb24oKSk7CisgICAgICAgICAgICByZXR1cm4gVmFsdWUuZnJvbVNlcmlhbGl6ZWQodmFsdWUsIChMaXN0VHlwZTw/PikgcmVjZWl2ZXIudHlwZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvTWFwcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9NYXBzLmphdmEKaW5kZXggYTJkMjNhNi4uOTA0MGQxYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9NYXBzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9NYXBzLmphdmEKQEAgLTE3LDI1ICsxNywzOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDM7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db25zdGFudHMuVU5TRVRfVkFMVUU7Ci0KIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHMuR3VhcmRyYWlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZUJ1ZmZlckFjY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTWFwVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlJldmVyc2VkVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsUGF0aDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5Db2xsZWN0aW9uU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbnN0YW50cy5VTlNFVF9WQUxVRTsKKwogLyoqCiAgKiBTdGF0aWMgaGVscGVyIG1ldGhvZHMgYW5kIGNsYXNzZXMgZm9yIG1hcHMuCiAgKi8KQEAgLTEyOCw4ICsxNDEsOCBAQAogICAgICAqIEBwYXJhbSBtYXBwZXIgdGhlIG1hcHBlciB1c2VkIHRvIHJldHJpZXZlIHRoZSBrZXkgYW5kIHZhbHVlIHR5cGVzIGZyb20gdGhlIGVudHJpZXMKICAgICAgKiBAcmV0dXJuIHRoZSBleGFjdCBNYXBUeXBlIGZyb20gdGhlIGVudHJpZXMgaWYgaXQgY2FuIGJlIGtub3duIG9yIDxjb2RlPm51bGw8L2NvZGU+CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gQWJzdHJhY3RUeXBlPD8+IGdldEV4YWN0TWFwVHlwZUlmS25vd24oTGlzdDxQYWlyPFQsIFQ+PiBlbnRyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxULCBBYnN0cmFjdFR5cGU8Pz4+IG1hcHBlcikKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBNYXBUeXBlPD8sID8+IGdldEV4YWN0TWFwVHlwZUlmS25vd24oTGlzdDxQYWlyPFQsIFQ+PiBlbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248VCwgQWJzdHJhY3RUeXBlPD8+PiBtYXBwZXIpCiAgICAgewogICAgICAgICBBYnN0cmFjdFR5cGU8Pz4ga2V5VHlwZSA9IG51bGw7CiAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB2YWx1ZVR5cGUgPSBudWxsOwpAQCAtMTQ1LDYgKzE1OCwyMiBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBNYXBUeXBlPD8sID8+IGdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKExpc3Q8UGFpcjxULCBUPj4gZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxULCBBYnN0cmFjdFR5cGU8Pz4+IG1hcHBlcikKKyAgICB7CisgICAgICAgIFNldDxBYnN0cmFjdFR5cGU8Pz4+IGtleVR5cGVzID0gZW50cmllcy5zdHJlYW0oKS5tYXAoUGFpcjo6bGVmdCkubWFwKG1hcHBlcikuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGtleVR5cGUgPSBBc3NpZ25tZW50VGVzdGFibGUuZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKGtleVR5cGVzKTsKKyAgICAgICAgaWYgKGtleVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFNldDxBYnN0cmFjdFR5cGU8Pz4+IHZhbHVlVHlwZXMgPSBlbnRyaWVzLnN0cmVhbSgpLm1hcChQYWlyOjpyaWdodCkubWFwKG1hcHBlcikuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHZhbHVlVHlwZSA9IEFzc2lnbm1lbnRUZXN0YWJsZS5nZXRDb21wYXRpYmxlVHlwZUlmS25vd24odmFsdWVUeXBlcyk7CisgICAgICAgIGlmICh2YWx1ZVR5cGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHJldHVybiAgTWFwVHlwZS5nZXRJbnN0YW5jZShrZXlUeXBlLCB2YWx1ZVR5cGUsIGZhbHNlKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpdGVyYWwgZXh0ZW5kcyBUZXJtLlJhdwogICAgIHsKICAgICAgICAgcHVibGljIGZpbmFsIExpc3Q8UGFpcjxUZXJtLlJhdywgVGVybS5SYXc+PiBlbnRyaWVzOwpAQCAtMjA4LDYgKzIzNywxMiBAQAogICAgICAgICAgICAgcmV0dXJuIGdldEV4YWN0TWFwVHlwZUlmS25vd24oZW50cmllcywgcCAtPiBwLmdldEV4YWN0VHlwZUlmS25vd24oa2V5c3BhY2UpKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldENvbXBhdGlibGVUeXBlSWZLbm93bihTdHJpbmcga2V5c3BhY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBNYXBzLmdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKGVudHJpZXMsIHAgLT4gcC5nZXRDb21wYXRpYmxlVHlwZUlmS25vd24oa2V5c3BhY2UpKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBtYXBUb1N0cmluZyhlbnRyaWVzLCBUZXJtLlJhdzo6Z2V0VGV4dCk7CkBAIC0yMjMsMTYgKzI1OCwxNiBAQAogICAgICAgICAgICAgdGhpcy5tYXAgPSBtYXA7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgc3RhdGljIFZhbHVlIGZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgdmFsdWUsIE1hcFR5cGUgdHlwZSwgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgc3RhdGljIDxLLCBWPiBWYWx1ZSBmcm9tU2VyaWFsaXplZChCeXRlQnVmZmVyIHZhbHVlLCBNYXBUeXBlPEssIFY+IHR5cGUpIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBDb2xsZWN0aW9ucyBoYXZlIHRoaXMgc21hbGwgaGFjayB0aGF0IHZhbGlkYXRlIGNhbm5vdCBiZSBjYWxsZWQgb24gYSBzZXJpYWxpemVkIG9iamVjdCwKICAgICAgICAgICAgICAgICAvLyBidXQgY29tcG9zZSBkb2VzIHRoZSB2YWxpZGF0aW9uIChzbyB3ZSdyZSBmaW5lKS4KLSAgICAgICAgICAgICAgICBNYXA8PywgPz4gbSA9IHR5cGUuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2wodmFsdWUsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgTWFwPEssIFY+IG0gPSB0eXBlLmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZSh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAvLyBXZSBkZXBlbmQgb24gTWFwcyB0byBiZSBwcm9wZXJseSBzb3J0ZWQgYnkgdGhlaXIga2V5cywgc28gdXNlIGEgc29ydGVkIG1hcCBpbXBsZW1lbnRhdGlvbiBoZXJlLgogICAgICAgICAgICAgICAgIFNvcnRlZE1hcDxCeXRlQnVmZmVyLCBCeXRlQnVmZmVyPiBtYXAgPSBuZXcgVHJlZU1hcDw+KHR5cGUuZ2V0S2V5c1R5cGUoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8PywgPz4gZW50cnkgOiBtLmVudHJ5U2V0KCkpCisgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8SywgVj4gZW50cnkgOiBtLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQodHlwZS5nZXRLZXlzVHlwZSgpLmRlY29tcG9zZShlbnRyeS5nZXRLZXkoKSksIHR5cGUuZ2V0VmFsdWVzVHlwZSgpLmRlY29tcG9zZShlbnRyeS5nZXRWYWx1ZSgpKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZShtYXApOwogICAgICAgICAgICAgfQpAQCAtMjQzLDcgKzI3OCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKICAgICAgICAgewogICAgICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBidWZmZXJzID0gbmV3IEFycmF5TGlzdDw+KDIgKiBtYXAuc2l6ZSgpKTsKICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXI+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpCkBAIC0yNTEsMTAgKzI4NiwxMCBAQAogICAgICAgICAgICAgICAgIGJ1ZmZlcnMuYWRkKGVudHJ5LmdldEtleSgpKTsKICAgICAgICAgICAgICAgICBidWZmZXJzLmFkZChlbnRyeS5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGJ1ZmZlcnMsIG1hcC5zaXplKCksIHByb3RvY29sVmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhidWZmZXJzLCBtYXAuc2l6ZSgpKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhNYXBUeXBlIG10LCBWYWx1ZSB2KQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoTWFwVHlwZTw/LCA/PiBtdCwgVmFsdWUgdikKICAgICAgICAgewogICAgICAgICAgICAgaWYgKG1hcC5zaXplKCkgIT0gdi5tYXAuc2l6ZSgpKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTM0Miw3ICszNzcsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgaWYgKHZhbHVlID09IEJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSKQogICAgICAgICAgICAgICAgIHJldHVybiBVTlNFVF9WQUxVRTsKLSAgICAgICAgICAgIHJldHVybiBWYWx1ZS5mcm9tU2VyaWFsaXplZCh2YWx1ZSwgKE1hcFR5cGUpcmVjZWl2ZXIudHlwZSwgb3B0aW9ucy5nZXRQcm90b2NvbFZlcnNpb24oKSk7CisgICAgICAgICAgICByZXR1cm4gVmFsdWUuZnJvbVNlcmlhbGl6ZWQodmFsdWUsIChNYXBUeXBlPD8sID8+KSByZWNlaXZlci50eXBlKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9RdWVyeVByb2Nlc3Nvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9RdWVyeVByb2Nlc3Nvci5qYXZhCmluZGV4IDFlMmQwZGIuLmJhNzJhZDQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvUXVlcnlQcm9jZXNzb3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1F1ZXJ5UHJvY2Vzc29yLmphdmEKQEAgLTc5LDcgKzc5LDcgQEAKIAogcHVibGljIGNsYXNzIFF1ZXJ5UHJvY2Vzc29yIGltcGxlbWVudHMgUXVlcnlIYW5kbGVyCiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDYXNzYW5kcmFWZXJzaW9uIENRTF9WRVJTSU9OID0gbmV3IENhc3NhbmRyYVZlcnNpb24oIjMuNC42Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDYXNzYW5kcmFWZXJzaW9uIENRTF9WRVJTSU9OID0gbmV3IENhc3NhbmRyYVZlcnNpb24oIjMuNC43Iik7CiAKICAgICAvLyBTZWUgY29tbWVudHMgb24gUXVlcnlQcm9jZXNzb3IgI3ByZXBhcmUKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENhc3NhbmRyYVZlcnNpb24gTkVXX1BSRVBBUkVEX1NUQVRFTUVOVF9CRUhBVklPVVJfU0lOQ0VfMzAgPSBuZXcgQ2Fzc2FuZHJhVmVyc2lvbigiMy4wLjI2Iik7CkBAIC0yMzcsNyArMjM3LDcgQEAKICAgICAgICAgaWYgKGtleSA9PSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUikKICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigiS2V5IG1heSBub3QgYmUgdW5zZXQiKTsKIAotICAgICAgICAvLyBjaGVjayB0aGF0IGtleSBjYW4gYmUgaGFuZGxlZCBieSBGQlV0aWxpdGllcy53cml0ZVNob3J0Qnl0ZUFycmF5CisgICAgICAgIC8vIGNoZWNrIHRoYXQga2V5IGNhbiBiZSBoYW5kbGVkIGJ5IEJ5dGVBcnJheVV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGggYW5kIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFNob3J0TGVuZ3RoCiAgICAgICAgIGlmIChrZXkucmVtYWluaW5nKCkgPiBGQlV0aWxpdGllcy5NQVhfVU5TSUdORURfU0hPUlQpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigiS2V5IGxlbmd0aCBvZiAiICsga2V5LnJlbWFpbmluZygpICsKQEAgLTQ4Myw3ICs0ODMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKG0gLT4gTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLjxSZWFkUmVzcG9uc2U+c2VuZFdpdGhSZXN1bHQobSwgYWRkcmVzcykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKIAotICAgICAgICAgICAgUmVzdWx0U2V0QnVpbGRlciByZXN1bHQgPSBuZXcgUmVzdWx0U2V0QnVpbGRlcihzZWxlY3QuZ2V0UmVzdWx0TWV0YWRhdGEoKSwgc2VsZWN0LmdldFNlbGVjdGlvbigpLm5ld1NlbGVjdG9ycyhvcHRpb25zKSwgbnVsbCk7CisgICAgICAgICAgICBSZXN1bHRTZXRCdWlsZGVyIHJlc3VsdCA9IG5ldyBSZXN1bHRTZXRCdWlsZGVyKHNlbGVjdC5nZXRSZXN1bHRNZXRhZGF0YSgpLCBzZWxlY3QuZ2V0U2VsZWN0aW9uKCkubmV3U2VsZWN0b3JzKG9wdGlvbnMpLCBmYWxzZSk7CiAgICAgICAgICAgICByZXR1cm4gZnV0dXJlLm1hcChsaXN0IC0+IHsKICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgICAgICAgICAgZm9yIChNZXNzYWdlPFJlYWRSZXNwb25zZT4gbSA6IGxpc3QpCkBAIC02MTEsMTcgKzYxMSwxOSBAQAogICAgICAgICByZXR1cm4gc2VsZWN0LmV4ZWN1dGVSYXdJbnRlcm5hbChtYWtlSW50ZXJuYWxPcHRpb25zV2l0aE5vd0luU2VjKHByZXBhcmVkLnN0YXRlbWVudCwgbm93SW5TZWMsIHZhbHVlcyksIGludGVybmFsUXVlcnlTdGF0ZSgpLmdldENsaWVudFN0YXRlKCksIG5vd0luU2VjKTsKICAgICB9CiAKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBwdWJsaWMgc3RhdGljIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0aWZ5KFN0cmluZyBxdWVyeSwgUm93SXRlcmF0b3IgcGFydGl0aW9uKQogICAgIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdGlmeShxdWVyeSwgUGFydGl0aW9uSXRlcmF0b3JzLnNpbmdsZXRvbkl0ZXJhdG9yKHBhcnRpdGlvbikpOwogICAgIH0KIAorICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIHB1YmxpYyBzdGF0aWMgVW50eXBlZFJlc3VsdFNldCByZXN1bHRpZnkoU3RyaW5nIHF1ZXJ5LCBQYXJ0aXRpb25JdGVyYXRvciBwYXJ0aXRpb25zKQogICAgIHsKICAgICAgICAgdHJ5IChQYXJ0aXRpb25JdGVyYXRvciBpdGVyID0gcGFydGl0aW9ucykKICAgICAgICAgewogICAgICAgICAgICAgU2VsZWN0U3RhdGVtZW50IHNzID0gKFNlbGVjdFN0YXRlbWVudCkgZ2V0U3RhdGVtZW50KHF1ZXJ5LCBudWxsKTsKLSAgICAgICAgICAgIFJlc3VsdFNldCBjcWxSb3dzID0gc3MucHJvY2VzcyhpdGVyLCBGQlV0aWxpdGllcy5ub3dJblNlY29uZHMoKSk7CisgICAgICAgICAgICBSZXN1bHRTZXQgY3FsUm93cyA9IHNzLnByb2Nlc3MoaXRlciwgRkJVdGlsaXRpZXMubm93SW5TZWNvbmRzKCksIHRydWUpOwogICAgICAgICAgICAgcmV0dXJuIFVudHlwZWRSZXN1bHRTZXQuY3JlYXRlKGNxbFJvd3MpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAyMiw3ICsxMDI0LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGVyZSBhcmUgb3RoZXIgb3ZlcmxvYWRzLCB3ZSBoYXZlIHRvIHJlbW92ZSBhbGwgb3ZlcmxvYWRzIHNpbmNlIGFyZ3VtZW50IHR5cGUKICAgICAgICAgICAgIC8vIG1hdGNoaW5nIG1heSBjaGFuZ2UgKGR1ZSB0byB0eXBlIGNhc3RpbmcpCi0gICAgICAgICAgICBpZiAoU2NoZW1hLmluc3RhbmNlLmdldEtleXNwYWNlTWV0YWRhdGEoa3NOYW1lKS5mdW5jdGlvbnMuZ2V0KG5ldyBGdW5jdGlvbk5hbWUoa3NOYW1lLCBmdW5jdGlvbk5hbWUpKS5zaXplKCkgPiAxKQorICAgICAgICAgICAgaWYgKFNjaGVtYS5pbnN0YW5jZS5nZXRLZXlzcGFjZU1ldGFkYXRhKGtzTmFtZSkudXNlckZ1bmN0aW9ucy5nZXQobmV3IEZ1bmN0aW9uTmFtZShrc05hbWUsIGZ1bmN0aW9uTmFtZSkpLnNpemUoKSA+IDEpCiAgICAgICAgICAgICAgICAgcmVtb3ZlSW52YWxpZFByZXBhcmVkU3RhdGVtZW50c0ZvckZ1bmN0aW9uKGtzTmFtZSwgZnVuY3Rpb25OYW1lKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1NldHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvU2V0cy5qYXZhCmluZGV4IDEwNGE4NTcuLjAwZDY4NzAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvU2V0cy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvU2V0cy5qYXZhCkBAIC0yMCwxNyArMjAsMzEgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db25zdGFudHMuVU5TRVRfVkFMVUU7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5NYXBUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuUmV2ZXJzZWRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuU2V0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsUGF0aDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5Db2xsZWN0aW9uU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CkBAIC01NSw3ICs2OSw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBBYnN0cmFjdFR5cGU8Pz4gZWxlbWVudHNUeXBlKEFic3RyYWN0VHlwZTw/PiB0eXBlKQogICAgIHsKLSAgICAgICAgcmV0dXJuICgoU2V0VHlwZSkgdW53cmFwKHR5cGUpKS5nZXRFbGVtZW50c1R5cGUoKTsKKyAgICAgICAgcmV0dXJuICgoU2V0VHlwZTw/PikgdW53cmFwKHR5cGUpKS5nZXRFbGVtZW50c1R5cGUoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwNiw3ICsxMjAsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFN0cmluZyBzZXRUb1N0cmluZyhJdGVyYWJsZTxUPiBpdGVtcywgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPFQsIFN0cmluZz4gbWFwcGVyKQogICAgIHsKICAgICAgICAgcmV0dXJuIFN0cmVhbVN1cHBvcnQuc3RyZWFtKGl0ZW1zLnNwbGl0ZXJhdG9yKCksIGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZSAtPiBtYXBwZXIuYXBwbHkoZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChtYXBwZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIsICJ7IiwgIn0iKSk7CiAgICAgfQogCkBAIC0xMTcsMTMgKzEzMSwyMSBAQAogICAgICAqIEBwYXJhbSBtYXBwZXIgdGhlIG1hcHBlciB1c2VkIHRvIHJldHJpZXZlIHRoZSBlbGVtZW50IHR5cGVzIGZyb20gdGhlIGl0ZW1zCiAgICAgICogQHJldHVybiB0aGUgZXhhY3QgU2V0VHlwZSBmcm9tIHRoZSBpdGVtcyBpZiBpdCBjYW4gYmUga25vd24gb3IgPGNvZGU+bnVsbDwvY29kZT4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxUPiBBYnN0cmFjdFR5cGU8Pz4gZ2V0RXhhY3RTZXRUeXBlSWZLbm93bihMaXN0PFQ+IGl0ZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxULCBBYnN0cmFjdFR5cGU8Pz4+IG1hcHBlcikKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBTZXRUeXBlPD8+IGdldEV4YWN0U2V0VHlwZUlmS25vd24oTGlzdDxUPiBpdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPFQsIEFic3RyYWN0VHlwZTw/Pj4gbWFwcGVyKQogICAgIHsKICAgICAgICAgT3B0aW9uYWw8QWJzdHJhY3RUeXBlPD8+PiB0eXBlID0gaXRlbXMuc3RyZWFtKCkubWFwKG1hcHBlcikuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpLmZpbmRGaXJzdCgpOwogICAgICAgICByZXR1cm4gdHlwZS5pc1ByZXNlbnQoKSA/IFNldFR5cGUuZ2V0SW5zdGFuY2UodHlwZS5nZXQoKSwgZmFsc2UpIDogbnVsbDsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBTZXRUeXBlPD8+IGdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKExpc3Q8VD4gaXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248VCwgQWJzdHJhY3RUeXBlPD8+PiBtYXBwZXIpCisgICAgeworICAgICAgICBTZXQ8QWJzdHJhY3RUeXBlPD8+PiB0eXBlcyA9IGl0ZW1zLnN0cmVhbSgpLm1hcChtYXBwZXIpLmZpbHRlcihPYmplY3RzOjpub25OdWxsKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gQXNzaWdubWVudFRlc3RhYmxlLmdldENvbXBhdGlibGVUeXBlSWZLbm93bih0eXBlcyk7CisgICAgICAgIHJldHVybiB0eXBlID09IG51bGwgPyBudWxsIDogU2V0VHlwZS5nZXRJbnN0YW5jZSh0eXBlLCBmYWxzZSk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaXRlcmFsIGV4dGVuZHMgVGVybS5SYXcKICAgICB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxUZXJtLlJhdz4gZWxlbWVudHM7CkBAIC0xOTQsNiArMjE2LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gZ2V0RXhhY3RTZXRUeXBlSWZLbm93bihlbGVtZW50cywgcCAtPiBwLmdldEV4YWN0VHlwZUlmS25vd24oa2V5c3BhY2UpKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldENvbXBhdGlibGVUeXBlSWZLbm93bihTdHJpbmcga2V5c3BhY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTZXRzLmdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKGVsZW1lbnRzLCBwIC0+IHAuZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKGtleXNwYWNlKSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gc2V0VG9TdHJpbmcoZWxlbWVudHMsIFRlcm0uUmF3OjpnZXRUZXh0KTsKQEAgLTIwOSwxNSArMjM3LDE1IEBACiAgICAgICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgc3RhdGljIFZhbHVlIGZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgdmFsdWUsIFNldFR5cGUgdHlwZSwgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgc3RhdGljIDxUPiBWYWx1ZSBmcm9tU2VyaWFsaXplZChCeXRlQnVmZmVyIHZhbHVlLCBTZXRUeXBlPFQ+IHR5cGUpIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBDb2xsZWN0aW9ucyBoYXZlIHRoaXMgc21hbGwgaGFjayB0aGF0IHZhbGlkYXRlIGNhbm5vdCBiZSBjYWxsZWQgb24gYSBzZXJpYWxpemVkIG9iamVjdCwKICAgICAgICAgICAgICAgICAvLyBidXQgY29tcG9zZSBkb2VzIHRoZSB2YWxpZGF0aW9uIChzbyB3ZSdyZSBmaW5lKS4KLSAgICAgICAgICAgICAgICBTZXQ8Pz4gcyA9IHR5cGUuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2wodmFsdWUsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgU2V0PFQ+IHMgPSB0eXBlLmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZSh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKICAgICAgICAgICAgICAgICBTb3J0ZWRTZXQ8Qnl0ZUJ1ZmZlcj4gZWxlbWVudHMgPSBuZXcgVHJlZVNldDw+KHR5cGUuZ2V0RWxlbWVudHNUeXBlKCkpOwotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiBzKQorICAgICAgICAgICAgICAgIGZvciAoVCBlbGVtZW50IDogcykKICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuYWRkKHR5cGUuZ2V0RWxlbWVudHNUeXBlKCkuZGVjb21wb3NlVW50eXBlZChlbGVtZW50KSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZShlbGVtZW50cyk7CiAgICAgICAgICAgICB9CkBAIC0yMjcsMTkgKzI1NSwxOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2soZWxlbWVudHMsIGVsZW1lbnRzLnNpemUoKSwgcHJvdG9jb2xWZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGVsZW1lbnRzLCBlbGVtZW50cy5zaXplKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFNldFR5cGUgc3QsIFZhbHVlIHYpCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhTZXRUeXBlPD8+IHN0LCBWYWx1ZSB2KQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoZWxlbWVudHMuc2l6ZSgpICE9IHYuZWxlbWVudHMuc2l6ZSgpKQogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgSXRlcmF0b3I8Qnl0ZUJ1ZmZlcj4gdGhpc0l0ZXIgPSBlbGVtZW50cy5pdGVyYXRvcigpOwogICAgICAgICAgICAgSXRlcmF0b3I8Qnl0ZUJ1ZmZlcj4gdGhhdEl0ZXIgPSB2LmVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICBBYnN0cmFjdFR5cGUgZWxlbWVudHNUeXBlID0gc3QuZ2V0RWxlbWVudHNUeXBlKCk7CisgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gZWxlbWVudHNUeXBlID0gc3QuZ2V0RWxlbWVudHNUeXBlKCk7CiAgICAgICAgICAgICB3aGlsZSAodGhpc0l0ZXIuaGFzTmV4dCgpKQogICAgICAgICAgICAgICAgIGlmIChlbGVtZW50c1R5cGUuY29tcGFyZSh0aGlzSXRlci5uZXh0KCksIHRoYXRJdGVyLm5leHQoKSkgIT0gMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzA4LDcgKzMzNiw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICBpZiAodmFsdWUgPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIpCiAgICAgICAgICAgICAgICAgcmV0dXJuIFVOU0VUX1ZBTFVFOwotICAgICAgICAgICAgcmV0dXJuIFZhbHVlLmZyb21TZXJpYWxpemVkKHZhbHVlLCAoU2V0VHlwZSlyZWNlaXZlci50eXBlLCBvcHRpb25zLmdldFByb3RvY29sVmVyc2lvbigpKTsKKyAgICAgICAgICAgIHJldHVybiBWYWx1ZS5mcm9tU2VyaWFsaXplZCh2YWx1ZSwgKFNldFR5cGU8Pz4pIHJlY2VpdmVyLnR5cGUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1Rlcm0uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVGVybS5qYXZhCmluZGV4IGY1MzZiYWEuLmM5NGI2MTQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVGVybS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVGVybS5qYXZhCkBAIC0xMTMsMTMgKzExMywxOSBAQAogICAgICAgICAgKgogICAgICAgICAgKiBAcGFyYW0ga2V5c3BhY2UgdGhlIGtleXNwYWNlIG9uIHdoaWNoIHRoZSBzdGF0ZW1lbnQgY29udGFpbmluZyB0aGlzIHRlcm0gaXMgb24uCiAgICAgICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyB7QGNvZGUgVGVybX0gaWYgaW5mZXJyYWJsZSwgb3Ige0Bjb2RlIG51bGx9Ci0gICAgICAgICAqIG90aGVyd2lzZSAoZm9yIGluc3RhbmNlLCB0aGUgdHlwZSBpc24ndCBpbmZlcmFibGUgZm9yIGEgYmluZCBtYXJrZXIuIEV2ZW4gZm9yCisgICAgICAgICAqIG90aGVyd2lzZSAoZm9yIGluc3RhbmNlLCB0aGUgdHlwZSBpc24ndCBpbmZlcnJhYmxlIGZvciBhIGJpbmQgbWFya2VyLiBFdmVuIGZvcgogICAgICAgICAgKiBsaXRlcmFscywgdGhlIGV4YWN0IHR5cGUgaXMgbm90IGluZmVycmFibGUgc2luY2UgdGhleSBhcmUgdmFsaWQgZm9yIG1hbnkKICAgICAgICAgICogZGlmZmVyZW50IHR5cGVzIGFuZCBzbyB0aGlzIHdpbGwgcmV0dXJuIHtAY29kZSBudWxsfSB0b28pLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIGFic3RyYWN0IEFic3RyYWN0VHlwZTw/PiBnZXRFeGFjdFR5cGVJZktub3duKFN0cmluZyBrZXlzcGFjZSk7CiAKICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKFN0cmluZyBrZXlzcGFjZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGdldEV4YWN0VHlwZUlmS25vd24oa2V5c3BhY2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0VGV4dCgpOwpAQCAtMTgxLDkgKzE4Nyw4IEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIEByZXR1cm4gdGhlIHNlcmlhbGl6ZWQgdmFsdWUgb2YgdGhpcyB0ZXJtaW5hbC4KLSAgICAgICAgICogQHBhcmFtIHByb3RvY29sVmVyc2lvbgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgZ2V0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgZ2V0KFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CiAKICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgYmluZEFuZEdldChRdWVyeU9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVGVybXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVGVybXMuamF2YQppbmRleCAzM2NlMmU5Li4zMWIzZmQwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1Rlcm1zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9UZXJtcy5qYXZhCkBAIC0xNDUsMTEgKzE0NSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCgoQ29sbGVjdGlvblR5cGU8Pz4pIHR5cGUpLmtpbmQpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTElTVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAtPiBMaXN0cy5WYWx1ZS5mcm9tU2VyaWFsaXplZChlLCAoTGlzdFR5cGU8Pz4pIHR5cGUsIHZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIC0+IExpc3RzLlZhbHVlLmZyb21TZXJpYWxpemVkKGUsIChMaXN0VHlwZTw/PikgdHlwZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAtPiBTZXRzLlZhbHVlLmZyb21TZXJpYWxpemVkKGUsIChTZXRUeXBlPD8+KSB0eXBlLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZSAtPiBTZXRzLlZhbHVlLmZyb21TZXJpYWxpemVkKGUsIChTZXRUeXBlPD8+KSB0eXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTUFQOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIC0+IE1hcHMuVmFsdWUuZnJvbVNlcmlhbGl6ZWQoZSwgKE1hcFR5cGU8PywgPz4pIHR5cGUsIHZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlIC0+IE1hcHMuVmFsdWUuZnJvbVNlcmlhbGl6ZWQoZSwgKE1hcFR5cGU8PywgPz4pIHR5cGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOwogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVHVwbGVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1R1cGxlcy5qYXZhCmluZGV4IGI4YWNkNTkuLjYwZjk2M2MgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVHVwbGVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9UdXBsZXMuamF2YQpAQCAtMjQsMTEgKzI0LDEyIEBACiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtU3VwcG9ydDsKIAotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5MaXN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlJldmVyc2VkVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlR1cGxlVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKQEAgLTQxLDggKzQyLDYgQEAKICAqLwogcHVibGljIGNsYXNzIFR1cGxlcwogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUdXBsZXMuY2xhc3MpOwotCiAgICAgcHJpdmF0ZSBUdXBsZXMoKSB7fQogCiAgICAgcHVibGljIHN0YXRpYyBDb2x1bW5TcGVjaWZpY2F0aW9uIGNvbXBvbmVudFNwZWNPZihDb2x1bW5TcGVjaWZpY2F0aW9uIGNvbHVtbiwgaW50IGNvbXBvbmVudCkKQEAgLTE1NCwxNyArMTUzLDE3IEBACiAKICAgICAgICAgcHVibGljIHN0YXRpYyBWYWx1ZSBmcm9tU2VyaWFsaXplZChCeXRlQnVmZmVyIGJ5dGVzLCBUdXBsZVR5cGUgdHlwZSkKICAgICAgICAgewotICAgICAgICAgICAgQnl0ZUJ1ZmZlcltdIHZhbHVlcyA9IHR5cGUuc3BsaXQoYnl0ZXMpOworICAgICAgICAgICAgQnl0ZUJ1ZmZlcltdIHZhbHVlcyA9IHR5cGUuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBieXRlcyk7CiAgICAgICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA+IHR5cGUuc2l6ZSgpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAgICAgIlR1cGxlIHZhbHVlIGNvbnRhaW5lZCB0b28gbWFueSBmaWVsZHMgKGV4cGVjdGVkICVzLCBnb3QgJXMpIiwgdHlwZS5zaXplKCksIHZhbHVlcy5sZW5ndGgpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZSh0eXBlLnNwbGl0KGJ5dGVzKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlKHR5cGUuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBieXRlcykpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIFR1cGxlVHlwZS5idWlsZFZhbHVlKGVsZW1lbnRzKTsKICAgICAgICAgfQpAQCAtMjU4LDIxICsyNTcsMjEgQEAKICAgICAgICAgICAgIHRoaXMuZWxlbWVudHMgPSBpdGVtczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgSW5WYWx1ZSBmcm9tU2VyaWFsaXplZChCeXRlQnVmZmVyIHZhbHVlLCBMaXN0VHlwZSB0eXBlLCBRdWVyeU9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCisgICAgICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEluVmFsdWUgZnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciB2YWx1ZSwgTGlzdFR5cGU8VD4gdHlwZSkgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIENvbGxlY3Rpb25zIGhhdmUgdGhpcyBzbWFsbCBoYWNrIHRoYXQgdmFsaWRhdGUgY2Fubm90IGJlIGNhbGxlZCBvbiBhIHNlcmlhbGl6ZWQgb2JqZWN0LAogICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGUgZGVzZXJpYWxpemF0aW9uIGRvZXMgdGhlIHZhbGlkYXRpb24gKHNvIHdlJ3JlIGZpbmUpLgotICAgICAgICAgICAgICAgIExpc3Q8Pz4gbCA9IHR5cGUuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2wodmFsdWUsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgb3B0aW9ucy5nZXRQcm90b2NvbFZlcnNpb24oKSk7CisgICAgICAgICAgICAgICAgTGlzdDxUPiBsID0gdHlwZS5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUodmFsdWUsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CiAKICAgICAgICAgICAgICAgICBhc3NlcnQgdHlwZS5nZXRFbGVtZW50c1R5cGUoKSBpbnN0YW5jZW9mIFR1cGxlVHlwZTsKICAgICAgICAgICAgICAgICBUdXBsZVR5cGUgdHVwbGVUeXBlID0gVHVwbGVzLmdldFR1cGxlVHlwZSh0eXBlLmdldEVsZW1lbnRzVHlwZSgpKTsKIAogICAgICAgICAgICAgICAgIC8vIHR5cGUuc3BsaXQoYnl0ZXMpCiAgICAgICAgICAgICAgICAgTGlzdDxMaXN0PEJ5dGVCdWZmZXI+PiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8PihsLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChPYmplY3QgZWxlbWVudCA6IGwpCi0gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFkZChBcnJheXMuYXNMaXN0KHR1cGxlVHlwZS5zcGxpdCh0eXBlLmdldEVsZW1lbnRzVHlwZSgpLmRlY29tcG9zZShlbGVtZW50KSkpKTsKKyAgICAgICAgICAgICAgICBmb3IgKFQgZWxlbWVudCA6IGwpCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFkZChBcnJheXMuYXNMaXN0KHR1cGxlVHlwZS5zcGxpdChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHR5cGUuZ2V0RWxlbWVudHNUeXBlKCkuZGVjb21wb3NlKGVsZW1lbnQpKSkpOwogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5WYWx1ZShlbGVtZW50cyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoTWFyc2hhbEV4Y2VwdGlvbiBlKQpAQCAtMjgxLDcgKzI4MCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKKyAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0KFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKICAgICAgICAgfQpAQCAtNDE2LDcgKzQxNSw3IEBACiAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gb3B0aW9ucy5nZXRWYWx1ZXMoKS5nZXQoYmluZEluZGV4KTsKICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUikKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCB1bnNldCB2YWx1ZSBmb3IgJXMiLCByZWNlaXZlci5uYW1lKSk7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBJblZhbHVlLmZyb21TZXJpYWxpemVkKHZhbHVlLCAoTGlzdFR5cGUpcmVjZWl2ZXIudHlwZSwgb3B0aW9ucyk7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBJblZhbHVlLmZyb21TZXJpYWxpemVkKHZhbHVlLCAoTGlzdFR5cGU8Pz4pIHJlY2VpdmVyLnR5cGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NDIsNyArNDQxLDcgQEAKICAgICBwdWJsaWMgc3RhdGljIDxUPiBTdHJpbmcgdHVwbGVUb1N0cmluZyhJdGVyYWJsZTxUPiBpdGVtcywgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPFQsIFN0cmluZz4gbWFwcGVyKQogICAgIHsKICAgICAgICAgcmV0dXJuIFN0cmVhbVN1cHBvcnQuc3RyZWFtKGl0ZW1zLnNwbGl0ZXJhdG9yKCksIGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZSAtPiBtYXBwZXIuYXBwbHkoZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChtYXBwZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIsICIoIiwgIikiKSk7CiAgICAgfQogCkBAIC00NTMsOCArNDUyLDggQEAKICAgICAgKiBAcGFyYW0gbWFwcGVyIHRoZSBtYXBwZXIgdXNlZCB0byByZXRyaWV2ZSB0aGUgZWxlbWVudCB0eXBlcyBmcm9tIHRoZSAgaXRlbXMKICAgICAgKiBAcmV0dXJuIHRoZSBleGFjdCBUdXBsZVR5cGUgZnJvbSB0aGUgaXRlbXMgaWYgaXQgY2FuIGJlIGtub3duIG9yIDxjb2RlPm51bGw8L2NvZGU+CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8VD4gQWJzdHJhY3RUeXBlPD8+IGdldEV4YWN0VHVwbGVUeXBlSWZLbm93bihMaXN0PFQ+IGl0ZW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPFQsIEFic3RyYWN0VHlwZTw/Pj4gbWFwcGVyKQorICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFR1cGxlVHlwZSBnZXRFeGFjdFR1cGxlVHlwZUlmS25vd24oTGlzdDxUPiBpdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxULCBBYnN0cmFjdFR5cGU8Pz4+IG1hcHBlcikKICAgICB7CiAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiB0eXBlcyA9IG5ldyBBcnJheUxpc3Q8PihpdGVtcy5zaXplKCkpOwogICAgICAgICBmb3IgKFQgaXRlbSA6IGl0ZW1zKQpAQCAtNTIwLDEyICs1MTksMTIgQEAKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tJZlR1cGxlVHlwZShBYnN0cmFjdFR5cGU8Pz4gdHVwbGUpCiAgICAgewogICAgICAgICByZXR1cm4gKHR1cGxlIGluc3RhbmNlb2YgVHVwbGVUeXBlKSB8fAotICAgICAgICAgICAgICAgKHR1cGxlIGluc3RhbmNlb2YgUmV2ZXJzZWRUeXBlICYmICgoUmV2ZXJzZWRUeXBlKSB0dXBsZSkuYmFzZVR5cGUgaW5zdGFuY2VvZiBUdXBsZVR5cGUpOworICAgICAgICAgICAgICAgKHR1cGxlIGluc3RhbmNlb2YgUmV2ZXJzZWRUeXBlICYmICgoUmV2ZXJzZWRUeXBlPD8+KSB0dXBsZSkuYmFzZVR5cGUgaW5zdGFuY2VvZiBUdXBsZVR5cGUpOwogCiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBUdXBsZVR5cGUgZ2V0VHVwbGVUeXBlKEFic3RyYWN0VHlwZTw/PiB0dXBsZSkKICAgICB7Ci0gICAgICAgIHJldHVybiAodHVwbGUgaW5zdGFuY2VvZiBSZXZlcnNlZFR5cGUgPyAoKFR1cGxlVHlwZSkgKChSZXZlcnNlZFR5cGUpIHR1cGxlKS5iYXNlVHlwZSkgOiAoVHVwbGVUeXBlKXR1cGxlKTsKKyAgICAgICAgcmV0dXJuICh0dXBsZSBpbnN0YW5jZW9mIFJldmVyc2VkVHlwZSA/ICgoVHVwbGVUeXBlKSAoKFJldmVyc2VkVHlwZTw/PikgdHVwbGUpLmJhc2VUeXBlKSA6IChUdXBsZVR5cGUpdHVwbGUpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVW50eXBlZFJlc3VsdFNldC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9VbnR5cGVkUmVzdWx0U2V0LmphdmEKaW5kZXggZjAwYzEzNy4uY2UyY2MwZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9VbnR5cGVkUmVzdWx0U2V0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9VbnR5cGVkUmVzdWx0U2V0LmphdmEKQEAgLTIwLDIyICsyMCwzMiBAQAogCiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIAogaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Db2RlY1V0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLnR5cGVzLkxvY2FsRGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLlNlbGVjdFN0YXRlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29uc2lzdGVuY3lMZXZlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVhZEV4ZWN1dGlvbkNvbnRyb2xsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNvbXBsZXhDb2x1bW5EYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGFnZXIuUXVlcnlQYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkFic3RyYWN0SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CkBAIC0xMTAsNyArMTIwLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdEl0ZXJhdG9yPFJvdz4oKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPExpc3Q8Qnl0ZUJ1ZmZlcj4+IGl0ZXIgPSBjcWxSb3dzLnJvd3MuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxMaXN0PEJ5dGVCdWZmZXI+PiBpdGVyID0gY3FsUm93cy5yb3dzLml0ZXJhdG9yKCk7CiAKICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgUm93IGNvbXB1dGVOZXh0KCkKICAgICAgICAgICAgICAgICB7CkBAIC0xNTIsNyArMTYyLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdEl0ZXJhdG9yPFJvdz4oKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcDxTdHJpbmcsIEJ5dGVCdWZmZXI+PiBpdGVyID0gY3FsUm93cy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPE1hcDxTdHJpbmcsIEJ5dGVCdWZmZXI+PiBpdGVyID0gY3FsUm93cy5pdGVyYXRvcigpOwogCiAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFJvdyBjb21wdXRlTmV4dCgpCiAgICAgICAgICAgICAgICAgewpAQCAtMjExLDcgKzIyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgKFJlYWRFeGVjdXRpb25Db250cm9sbGVyIGV4ZWN1dGlvbkNvbnRyb2xsZXIgPSBwYWdlci5leGVjdXRpb25Db250cm9sbGVyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvbkl0ZXJhdG9yIGl0ZXIgPSBwYWdlci5mZXRjaFBhZ2VJbnRlcm5hbChwYWdlU2l6ZSwgZXhlY3V0aW9uQ29udHJvbGxlcikpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2UgPSBzZWxlY3QucHJvY2VzcyhpdGVyLCBub3dJblNlYykucm93cy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gc2VsZWN0LnByb2Nlc3MoaXRlciwgbm93SW5TZWMsIHRydWUpLnJvd3MuaXRlcmF0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJvdyhtZXRhZGF0YSwgY3VycmVudFBhZ2UubmV4dCgpKTsKQEAgLTI3Niw3ICsyODYsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgKFBhcnRpdGlvbkl0ZXJhdG9yIGl0ZXIgPSBwYWdlci5mZXRjaFBhZ2UocGFnZVNpemUsIGNsLCBjbGllbnRTdGF0ZSwgbmFub1RpbWUoKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2UgPSBzZWxlY3QucHJvY2VzcyhpdGVyLCBub3dJblNlYykucm93cy5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlID0gc2VsZWN0LnByb2Nlc3MoaXRlciwgbm93SW5TZWMsIHRydWUpLnJvd3MuaXRlcmF0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJvdyhtZXRhZGF0YSwgY3VycmVudFBhZ2UubmV4dCgpKTsKQEAgLTMzMSw3ICszNDEsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQ29tcGxleENvbHVtbkRhdGEgY29tcGxleERhdGEgPSByb3cuZ2V0Q29tcGxleENvbHVtbkRhdGEoZGVmKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXhEYXRhICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1dChkZWYubmFtZS50b1N0cmluZygpLCAoKENvbGxlY3Rpb25UeXBlKWRlZi50eXBlKS5zZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChjb21wbGV4RGF0YS5pdGVyYXRvcigpLCBQcm90b2NvbFZlcnNpb24uVjMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucHV0KGRlZi5uYW1lLnRvU3RyaW5nKCksICgoQ29sbGVjdGlvblR5cGU8Pz4pIGRlZi50eXBlKS5zZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChjb21wbGV4RGF0YS5pdGVyYXRvcigpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC00NTEsMTEgKzQ2MSw2IEBACiAgICAgICAgICAgICByZXR1cm4gcmF3ID09IG51bGwgPyBudWxsIDogTWFwVHlwZS5nZXRJbnN0YW5jZShrZXlUeXBlLCB2YWx1ZVR5cGUsIHRydWUpLmNvbXBvc2UocmF3KTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFRleHRNYXAoU3RyaW5nIGNvbHVtbikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGdldE1hcChjb2x1bW4sIFVURjhUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSk7Ci0gICAgICAgIH0KLQogICAgICAgICBwdWJsaWMgPFQ+IFNldDxUPiBnZXRGcm96ZW5TZXQoU3RyaW5nIGNvbHVtbiwgQWJzdHJhY3RUeXBlPFQ+IHR5cGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIEJ5dGVCdWZmZXIgcmF3ID0gZGF0YS5nZXQoY29sdW1uKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVXBkYXRlUGFyYW1ldGVycy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9VcGRhdGVQYXJhbWV0ZXJzLmphdmEKaW5kZXggMmQ1OTM2Ni4uYjUwNTQ4MCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9VcGRhdGVQYXJhbWV0ZXJzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9VcGRhdGVQYXJhbWV0ZXJzLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CkBAIC0xNDMsNiArMTQ0LDE1IEBACiAKICAgICBwdWJsaWMgdm9pZCBhZGRUb21ic3RvbmUoQ29sdW1uTWV0YWRhdGEgY29sdW1uLCBDZWxsUGF0aCBwYXRoKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KICAgICB7CisgICAgICAgIC8vIERlbGV0aW5nIGluZGl2aWR1YWwgZWxlbWVudHMgb2Ygbm9uLWZyb3plbiBzZXRzIGFuZCBtYXBzIGludm9sdmVzIGNyZWF0aW5nIHRvbWJzdG9uZXMgdGhhdCBjb250YWluIHRoZSB2YWx1ZQorICAgICAgICAvLyBvZiB0aGUgZGVsZXRlZCBlbGVtZW50LCBpbmRlcGVuZGVudGx5IG9uIHdoZXRoZXIgdGhlIGVsZW1lbnQgZXhpc3RlZCBvciBub3QuIFRoYXQgdG9tYnN0b25lIHZhbHVlIGlzIGd1YXJkZWQKKyAgICAgICAgLy8gYnkgdGhlIGNvbHVtblZhbHVlU2l6ZSBndWFyZHJhaWwsIHRvIHByZXZlbnQgdGhlIGluc2VydGlvbiBvZiB0b21ic3RvbmVzIG92ZXIgdGhlIHRocmVzaG9sZC4gVGhlIGRvd25zaWRlIGlzCisgICAgICAgIC8vIHRoYXQgZW5hYmxpbmcgb3IgcmFpc2luZyB0aGlzIHRocmVzaG9sZCBjYW4gcHJldmVudCB1c2VycyBmcm9tIGRlbGV0aW5nIHNldC9tYXAgZWxlbWVudHMgdGhhdCB3ZXJlIHdyaXR0ZW4KKyAgICAgICAgLy8gd2hlbiB0aGUgZ3VhcmRyYWlsIHdhcyBkaXNhYmxlZCBvciB3aXRoIGEgbG93ZXIgdmFsdWUuIERlbGV0aW5nIHRoZSBlbnRpcmUgY29sdW1uLCByb3cgb3IgcGFydGl0aW9uIGlzIGFsd2F5cworICAgICAgICAvLyBhbGxvd2VkLCBzaW5jZSB0aGUgdG9tYnN0b25lcyBjcmVhdGVkIGZvciB0aG9zZSBvcGVyYXRpb25zIGRvbid0IGNvbnRhaW4gdGhlIENRTCBjb2x1bW4gdmFsdWVzLgorICAgICAgICBpZiAocGF0aCAhPSBudWxsICYmIGNvbHVtbi50eXBlLmlzTXVsdGlDZWxsKCkpCisgICAgICAgICAgICBHdWFyZHJhaWxzLmNvbHVtblZhbHVlU2l6ZS5ndWFyZChwYXRoLmRhdGFTaXplKCksIGNvbHVtbi5uYW1lLnRvU3RyaW5nKCksIGZhbHNlLCBjbGllbnRTdGF0ZSk7CisKICAgICAgICAgYnVpbGRlci5hZGRDZWxsKEJ1ZmZlckNlbGwudG9tYnN0b25lKGNvbHVtbiwgdGltZXN0YW1wLCBub3dJblNlYywgcGF0aCkpOwogICAgIH0KIApAQCAtMTUzLDYgKzE2MywxMSBAQAogCiAgICAgcHVibGljIENlbGw8Pz4gYWRkQ2VsbChDb2x1bW5NZXRhZGF0YSBjb2x1bW4sIENlbGxQYXRoIHBhdGgsIEJ5dGVCdWZmZXIgdmFsdWUpIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgR3VhcmRyYWlscy5jb2x1bW5WYWx1ZVNpemUuZ3VhcmQodmFsdWUucmVtYWluaW5nKCksIGNvbHVtbi5uYW1lLnRvU3RyaW5nKCksIGZhbHNlLCBjbGllbnRTdGF0ZSk7CisKKyAgICAgICAgaWYgKHBhdGggIT0gbnVsbCAmJiBjb2x1bW4udHlwZS5pc011bHRpQ2VsbCgpKQorICAgICAgICAgICAgR3VhcmRyYWlscy5jb2x1bW5WYWx1ZVNpemUuZ3VhcmQocGF0aC5kYXRhU2l6ZSgpLCBjb2x1bW4ubmFtZS50b1N0cmluZygpLCBmYWxzZSwgY2xpZW50U3RhdGUpOworCiAgICAgICAgIENlbGw8Pz4gY2VsbCA9IHR0bCA9PSBMaXZlbmVzc0luZm8uTk9fVFRMCiAgICAgICAgICAgICAgICAgICAgICAgID8gQnVmZmVyQ2VsbC5saXZlKGNvbHVtbiwgdGltZXN0YW1wLCB2YWx1ZSwgcGF0aCkKICAgICAgICAgICAgICAgICAgICAgICAgOiBCdWZmZXJDZWxsLmV4cGlyaW5nKGNvbHVtbiwgdGltZXN0YW1wLCB0dGwsIG5vd0luU2VjLCB2YWx1ZSwgcGF0aCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1VzZXJUeXBlcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Vc2VyVHlwZXMuamF2YQppbmRleCBiMDIzYThhLi43NjI3NmE3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1VzZXJUeXBlcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVXNlclR5cGVzLmphdmEKQEAgLTIxNywxMCArMjE3LDEwIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgVmFsdWUgZnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciBieXRlcywgVXNlclR5cGUgdHlwZSkKICAgICAgICAgewogICAgICAgICAgICAgdHlwZS52YWxpZGF0ZShieXRlcyk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlKHR5cGUsIHR5cGUuc3BsaXQoYnl0ZXMpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWUodHlwZSwgdHlwZS5zcGxpdChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGJ5dGVzKSk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKKyAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0KFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gVHVwbGVUeXBlLmJ1aWxkVmFsdWUoZWxlbWVudHMpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1ZhbGlkYXRpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmFsaWRhdGlvbi5qYXZhCmluZGV4IDM0YTQwMjcuLjI3YTFiNGUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmFsaWRhdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmFsaWRhdGlvbi5qYXZhCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCBrZXkucmVtYWluaW5nKCkgPT0gMCkKICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigiS2V5IG1heSBub3QgYmUgZW1wdHkiKTsKIAotICAgICAgICAvLyBjaGVjayB0aGF0IGtleSBjYW4gYmUgaGFuZGxlZCBieSBGQlV0aWxpdGllcy53cml0ZVNob3J0Qnl0ZUFycmF5CisgICAgICAgIC8vIGNoZWNrIHRoYXQga2V5IGNhbiBiZSBoYW5kbGVkIGJ5IEJ5dGVBcnJheVV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGggYW5kIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFNob3J0TGVuZ3RoCiAgICAgICAgIGlmIChrZXkucmVtYWluaW5nKCkgPiBGQlV0aWxpdGllcy5NQVhfVU5TSUdORURfU0hPUlQpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigiS2V5IGxlbmd0aCBvZiAiICsga2V5LnJlbWFpbmluZygpICsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvY29uZGl0aW9ucy9Db2x1bW5Db25kaXRpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvY29uZGl0aW9ucy9Db2x1bW5Db25kaXRpb24uamF2YQppbmRleCBlM2Y0NjNhLi42OGNmMmQzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2NvbmRpdGlvbnMvQ29sdW1uQ29uZGl0aW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9jb25kaXRpb25zL0NvbHVtbkNvbmRpdGlvbi5qYXZhCkBAIC02NTAsOCArNjUwLDggQEAKIAogICAgICAgICAgICAgQ2VsbDw/PiBjZWxsID0gZ2V0Q2VsbChyb3csIGNvbHVtbik7CiAgICAgICAgICAgICByZXR1cm4gY2VsbCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgPyBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgOiB1c2VyVHlwZS5zcGxpdChjZWxsLmJ1ZmZlcigpKVt1c2VyVHlwZS5maWVsZFBvc2l0aW9uKGZpZWxkKV07CisgICAgICAgICAgICAgICAgICAgPyBudWxsCisgICAgICAgICAgICAgICAgICAgOiB1c2VyVHlwZS5zcGxpdChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGNlbGwuYnVmZmVyKCkpW3VzZXJUeXBlLmZpZWxkUG9zaXRpb24oZmllbGQpXTsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1NhdGlzZmllZEJ5KEJ5dGVCdWZmZXIgcm93VmFsdWUpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9BYnN0cmFjdEZ1bmN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9BYnN0cmFjdEZ1bmN0aW9uLmphdmEKaW5kZXggYWFiMjA0Ni4uYzMxODNmNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQWJzdHJhY3RGdW5jdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Fic3RyYWN0RnVuY3Rpb24uamF2YQpAQCAtMTE4LDYgKzExOCwxMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKFN0cmluZyBrZXlzcGFjZSkKKyAgICB7CisgICAgICAgIHJldHVybiByZXR1cm5UeXBlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IENxbEJ1aWxkZXIoKS5hcHBlbmQobmFtZSkKQEAgLTE2NSw0ICsxNzEsMzQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJyknKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7CiAgICAgfQorCisgICAgLyoKKyAgICAgKiBXZSBuZWVkIHRvIGNvbXBhcmUgdGhlIENRTDMgcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGUgYmVjYXVzZSBjb21wYXJpbmcKKyAgICAgKiB0aGUgQWJzdHJhY3RUeXBlIHdpbGwgZmFpbCBmb3IgZXhhbXBsZSBpZiBhIFVEVCBoYXMgYmVlbiBjaGFuZ2VkLgorICAgICAqIFJlYXNvbiBpcyB0aGF0IFVzZXJUeXBlLmVxdWFscygpIHRha2VzIHRoZSBmaWVsZCBuYW1lcyBhbmQgdHlwZXMgaW50byBhY2NvdW50LgorICAgICAqIEV4YW1wbGUgQ1FMIHNlcXVlbmNlIHRoYXQgd291bGQgZmFpbCB3aGVuIGNvbXBhcmluZyBBYnN0cmFjdFR5cGU6CisgICAgICogICAgQ1JFQVRFIFRZUEUgZm9vIC4uLgorICAgICAqICAgIENSRUFURSBGVU5DVElPTiBiYXIgKCBwYXIgZm9vICkgUkVUVVJOUyBmb28gLi4uCisgICAgICogICAgQUxURVIgVFlQRSBmb28gQUREIC4uLgorICAgICAqIG9yCisgICAgICogICAgQUxURVIgVFlQRSBmb28gQUxURVIgLi4uCisgICAgICogb3IKKyAgICAgKiAgICBBTFRFUiBUWVBFIGZvbyBSRU5BTUUgLi4uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdHlwZXNNYXRjaChMaXN0PEFic3RyYWN0VHlwZTw/Pj4gdHlwZXMpCisgICAgeworICAgICAgICBpZiAoYXJnVHlwZXMoKS5zaXplKCkgIT0gdHlwZXMuc2l6ZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJnVHlwZXMoKS5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIGlmICghdHlwZXNNYXRjaChhcmdUeXBlcygpLmdldChpKSwgdHlwZXMuZ2V0KGkpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0eXBlc01hdGNoKEFic3RyYWN0VHlwZTw/PiB0MSwgQWJzdHJhY3RUeXBlPD8+IHQyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHQxLmZyZWV6ZSgpLmFzQ1FMM1R5cGUoKS50b1N0cmluZygpLmVxdWFscyh0Mi5mcmVlemUoKS5hc0NRTDNUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQWdncmVnYXRlRmN0cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQWdncmVnYXRlRmN0cy5qYXZhCmluZGV4IDU3OTdkZTQuLmNlOGU4ZTEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0FnZ3JlZ2F0ZUZjdHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9BZ2dyZWdhdGVGY3RzLmphdmEKQEAgLTIxLDEzICsyMSw4IEBACiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5tYXRoLlJvdW5kaW5nTW9kZTsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKQEAgLTM3LDEwICszMiw4IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBZ2dyZWdhdGVGY3RzCiB7Ci0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEFnZ3JlZ2F0ZUZ1bmN0aW9uPiBhbGwoKQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGdW5jdGlvbnNUbyhOYXRpdmVGdW5jdGlvbnMgZnVuY3Rpb25zKQogICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbjxBZ2dyZWdhdGVGdW5jdGlvbj4gZnVuY3Rpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KICAgICAgICAgZnVuY3Rpb25zLmFkZChjb3VudFJvd3NGdW5jdGlvbik7CiAKICAgICAgICAgLy8gc3VtIGZvciBwcmltaXRpdmVzCkBAIC02NSw3MSArNTgsODYgQEAKICAgICAgICAgZnVuY3Rpb25zLmFkZChhdmdGdW5jdGlvbkZvclZhcmludCk7CiAgICAgICAgIGZ1bmN0aW9ucy5hZGQoYXZnRnVuY3Rpb25Gb3JDb3VudGVyKTsKIAotICAgICAgICAvLyBjb3VudCwgbWF4LCBhbmQgbWluIGZvciBhbGwgc3RhbmRhcmQgdHlwZXMKLSAgICAgICAgU2V0PEFic3RyYWN0VHlwZTw/Pj4gdHlwZXMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgIGZvciAoQ1FMM1R5cGUgdHlwZSA6IENRTDNUeXBlLk5hdGl2ZS52YWx1ZXMoKSkKKyAgICAgICAgLy8gY291bnQgZm9yIGFsbCB0eXBlcworICAgICAgICBmdW5jdGlvbnMuYWRkKG1ha2VDb3VudEZ1bmN0aW9uKEJ5dGVzVHlwZS5pbnN0YW5jZSkpOworCisgICAgICAgIC8vIG1heCBmb3IgYWxsIHR5cGVzCisgICAgICAgIGZ1bmN0aW9ucy5hZGQobmV3IEZ1bmN0aW9uRmFjdG9yeSgibWF4IiwgRnVuY3Rpb25QYXJhbWV0ZXIuYW55VHlwZSh0cnVlKSkKICAgICAgICAgewotICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHVkZlR5cGUgPSB0eXBlLmdldFR5cGUoKS51ZGZUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoIXR5cGVzLmFkZCh1ZGZUeXBlKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgZnVuY3Rpb25zLmFkZChBZ2dyZWdhdGVGY3RzLm1ha2VDb3VudEZ1bmN0aW9uKHVkZlR5cGUpKTsKLSAgICAgICAgICAgIGlmICh0eXBlICE9IENRTDNUeXBlLk5hdGl2ZS5DT1VOVEVSKQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgTmF0aXZlRnVuY3Rpb24gZG9HZXRPckNyZWF0ZUZ1bmN0aW9uKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcywgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmdW5jdGlvbnMuYWRkKEFnZ3JlZ2F0ZUZjdHMubWFrZU1heEZ1bmN0aW9uKHVkZlR5cGUpKTsKLSAgICAgICAgICAgICAgICBmdW5jdGlvbnMuYWRkKEFnZ3JlZ2F0ZUZjdHMubWFrZU1pbkZ1bmN0aW9uKHVkZlR5cGUpKTsKKyAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IGFyZ1R5cGVzLmdldCgwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0NvdW50ZXIoKSA/IG1heEZ1bmN0aW9uRm9yQ291bnRlciA6IG1ha2VNYXhGdW5jdGlvbih0eXBlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmdW5jdGlvbnMuYWRkKEFnZ3JlZ2F0ZUZjdHMubWF4RnVuY3Rpb25Gb3JDb3VudGVyKTsKLSAgICAgICAgICAgICAgICBmdW5jdGlvbnMuYWRkKEFnZ3JlZ2F0ZUZjdHMubWluRnVuY3Rpb25Gb3JDb3VudGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICB9KTsKIAotICAgICAgICByZXR1cm4gZnVuY3Rpb25zOworICAgICAgICAvLyBtaW4gZm9yIGFsbCB0eXBlcworICAgICAgICBmdW5jdGlvbnMuYWRkKG5ldyBGdW5jdGlvbkZhY3RvcnkoIm1pbiIsIEZ1bmN0aW9uUGFyYW1ldGVyLmFueVR5cGUodHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSBhcmdUeXBlcy5nZXQoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuaXNDb3VudGVyKCkgPyBtaW5GdW5jdGlvbkZvckNvdW50ZXIgOiBtYWtlTWluRnVuY3Rpb24odHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGNvdW50IHRoZSBudW1iZXIgb2Ygcm93cyBvZiBhIHJlc3VsdCBzZXQuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gQ09VTlQoKikgb3IgQ09VTlQoMSkKICAgICAgKiBpcyBzcGVjaWZpZWQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBjb3VudFJvd3NGdW5jdGlvbiA9Ci0gICAgICAgICAgICBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oImNvdW50Um93cyIsIExvbmdUeXBlLmluc3RhbmNlKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ291bnRSb3dzRnVuY3Rpb24gY291bnRSb3dzRnVuY3Rpb24gPSBuZXcgQ291bnRSb3dzRnVuY3Rpb24oZmFsc2UpOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb3VudFJvd3NGdW5jdGlvbiBleHRlbmRzIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIENvdW50Um93c0Z1bmN0aW9uKGJvb2xlYW4gdXNlTGVnYWN5TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIodXNlTGVnYWN5TmFtZSA/ICJjb3VudFJvd3MiIDogImNvdW50X3Jvd3MiLCBMb25nVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZSgpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQorICAgICAgICAgICAgICAgIHByaXZhdGUgbG9uZyBjb3VudDsKKworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlKCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nIGNvdW50OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBjb21wdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExvbmdUeXBlLmluc3RhbmNlLmRlY29tcG9zZShjb3VudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gdmFsdWVzKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbHVtbk5hbWUoTGlzdDxTdHJpbmc+IGNvbHVtbk5hbWVzKQorICAgICAgICAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGNvbXB1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiY291bnQiOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTG9uZ1R5cGUuaW5zdGFuY2UuZGVjb21wb3NlKGNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbHVtbk5hbWUoTGlzdDxTdHJpbmc+IGNvbHVtbk5hbWVzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gImNvdW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTmF0aXZlRnVuY3Rpb24gd2l0aExlZ2FjeU5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvdW50Um93c0Z1bmN0aW9uKHRydWUpOworICAgICAgICB9CisgICAgfQogCiAgICAgLyoqCiAgICAgICogVGhlIFNVTSBmdW5jdGlvbiBmb3IgZGVjaW1hbCB2YWx1ZXMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBzdW1GdW5jdGlvbkZvckRlY2ltYWwgPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gc3VtRnVuY3Rpb25Gb3JEZWNpbWFsID0KICAgICAgICAgICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigic3VtIiwgRGVjaW1hbFR5cGUuaW5zdGFuY2UsIERlY2ltYWxUeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtMTY1LDggKzE3MywxMCBAQAogCiAgICAgLyoqCiAgICAgICogVGhlIEFWRyBmdW5jdGlvbiBmb3IgZGVjaW1hbCB2YWx1ZXMuCisgICAgICogPC9wPgorICAgICAqIFRoZSBhdmVyYWdlIG9mIGFuIGVtcHR5IHZhbHVlIHNldCByZXR1cm5zIHplcm8uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBhdmdGdW5jdGlvbkZvckRlY2ltYWwgPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gYXZnRnVuY3Rpb25Gb3JEZWNpbWFsID0KICAgICAgICAgICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigiYXZnIiwgRGVjaW1hbFR5cGUuaW5zdGFuY2UsIERlY2ltYWxUeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGUgbmV3QWdncmVnYXRlKCkKQEAgLTIwOSw3ICsyMTksNyBAQAogICAgIC8qKgogICAgICAqIFRoZSBTVU0gZnVuY3Rpb24gZm9yIHZhcmludCB2YWx1ZXMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBzdW1GdW5jdGlvbkZvclZhcmludCA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBzdW1GdW5jdGlvbkZvclZhcmludCA9CiAgICAgICAgICAgICBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oInN1bSIsIEludGVnZXJUeXBlLmluc3RhbmNlLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgQWdncmVnYXRlIG5ld0FnZ3JlZ2F0ZSgpCkBAIC0yNDQsOCArMjU0LDExIEBACiAKICAgICAvKioKICAgICAgKiBUaGUgQVZHIGZ1bmN0aW9uIGZvciB2YXJpbnQgdmFsdWVzLgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgYXZlcmFnZSBvZiBhbiBlbXB0eSB2YWx1ZSBzZXQgcmV0dXJucyB6ZXJvLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaW5wdXQgdmFsdWVzLCAKKyAgICAgKiBzbyB0aGUgcmV0dXJuZWQgYXZlcmFnZSB3b24ndCBoYXZlIGEgZGVjaW1hbCBwYXJ0LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWdncmVnYXRlRnVuY3Rpb24gYXZnRnVuY3Rpb25Gb3JWYXJpbnQgPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gYXZnRnVuY3Rpb25Gb3JWYXJpbnQgPQogICAgICAgICAgICAgbmV3IE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKCJhdmciLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgSW50ZWdlclR5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtMjg3LDggKzMwMCwxMSBAQAogCiAgICAgLyoqCiAgICAgICogVGhlIFNVTSBmdW5jdGlvbiBmb3IgYnl0ZSB2YWx1ZXMgKHRpbnlpbnQpLgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaW5wdXQgdmFsdWVzLCBzbyB0aGVyZSBpcyBhIHJpc2sgb2Ygb3ZlcmZsb3cgaWYgdGhlIHN1bSBvZiB0aGUKKyAgICAgKiB2YWx1ZXMgZXhjZWVkcyB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSB0eXBlIGNhbiByZXByZXNlbnQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBzdW1GdW5jdGlvbkZvckJ5dGUgPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gc3VtRnVuY3Rpb25Gb3JCeXRlID0KICAgICAgICAgICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigic3VtIiwgQnl0ZVR5cGUuaW5zdGFuY2UsIEJ5dGVUeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGUgbmV3QWdncmVnYXRlKCkKQEAgLTMyMyw4ICszMzksMTEgQEAKIAogICAgIC8qKgogICAgICAqIEFWRyBmdW5jdGlvbiBmb3IgYnl0ZSB2YWx1ZXMgKHRpbnlpbnQpLgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgYXZlcmFnZSBvZiBhbiBlbXB0eSB2YWx1ZSBzZXQgcmV0dXJucyB6ZXJvLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaW5wdXQgdmFsdWVzLCAKKyAgICAgKiBzbyB0aGUgcmV0dXJuZWQgYXZlcmFnZSB3b24ndCBoYXZlIGEgZGVjaW1hbCBwYXJ0LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWdncmVnYXRlRnVuY3Rpb24gYXZnRnVuY3Rpb25Gb3JCeXRlID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIGF2Z0Z1bmN0aW9uRm9yQnl0ZSA9CiAgICAgICAgICAgICBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oImF2ZyIsIEJ5dGVUeXBlLmluc3RhbmNlLCBCeXRlVHlwZS5pbnN0YW5jZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgQWdncmVnYXRlIG5ld0FnZ3JlZ2F0ZSgpCkBAIC0zNDEsOCArMzYwLDExIEBACiAKICAgICAvKioKICAgICAgKiBUaGUgU1VNIGZ1bmN0aW9uIGZvciBzaG9ydCB2YWx1ZXMgKHNtYWxsaW50KS4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIHJldHVybmVkIHZhbHVlIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGlucHV0IHZhbHVlcywgc28gdGhlcmUgaXMgYSByaXNrIG9mIG92ZXJmbG93IGlmIHRoZSBzdW0gb2YgdGhlCisgICAgICogdmFsdWVzIGV4Y2VlZHMgdGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgdHlwZSBjYW4gcmVwcmVzZW50LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWdncmVnYXRlRnVuY3Rpb24gc3VtRnVuY3Rpb25Gb3JTaG9ydCA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBzdW1GdW5jdGlvbkZvclNob3J0ID0KICAgICAgICAgICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigic3VtIiwgU2hvcnRUeXBlLmluc3RhbmNlLCBTaG9ydFR5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtMzc3LDggKzM5OSwxMSBAQAogCiAgICAgLyoqCiAgICAgICogQVZHIGZ1bmN0aW9uIGZvciBmb3Igc2hvcnQgdmFsdWVzIChzbWFsbGludCkuCisgICAgICogPC9wPgorICAgICAqIFRoZSBhdmVyYWdlIG9mIGFuIGVtcHR5IHZhbHVlIHNldCByZXR1cm5zIHplcm8uIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBpbnB1dCB2YWx1ZXMsIAorICAgICAqIHNvIHRoZSByZXR1cm5lZCBhdmVyYWdlIHdvbid0IGhhdmUgYSBkZWNpbWFsIHBhcnQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBhdmdGdW5jdGlvbkZvclNob3J0ID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIGF2Z0Z1bmN0aW9uRm9yU2hvcnQgPQogICAgICAgICAgICAgbmV3IE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKCJhdmciLCBTaG9ydFR5cGUuaW5zdGFuY2UsIFNob3J0VHlwZS5pbnN0YW5jZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgQWdncmVnYXRlIG5ld0FnZ3JlZ2F0ZSgpCkBAIC0zOTUsOCArNDIwLDExIEBACiAKICAgICAvKioKICAgICAgKiBUaGUgU1VNIGZ1bmN0aW9uIGZvciBpbnQzMiB2YWx1ZXMuCisgICAgICogPC9wPgorICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBpbnB1dCB2YWx1ZXMsIHNvIHRoZXJlIGlzIGEgcmlzayBvZiBvdmVyZmxvdyBpZiB0aGUgc3VtIG9mIHRoZQorICAgICAqIHZhbHVlcyBleGNlZWRzIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIHR5cGUgY2FuIHJlcHJlc2VudC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFnZ3JlZ2F0ZUZ1bmN0aW9uIHN1bUZ1bmN0aW9uRm9ySW50MzIgPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gc3VtRnVuY3Rpb25Gb3JJbnQzMiA9CiAgICAgICAgICAgICBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oInN1bSIsIEludDMyVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGUgbmV3QWdncmVnYXRlKCkKQEAgLTQzMSw4ICs0NTksMTEgQEAKIAogICAgIC8qKgogICAgICAqIEFWRyBmdW5jdGlvbiBmb3IgaW50MzIgdmFsdWVzLgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgYXZlcmFnZSBvZiBhbiBlbXB0eSB2YWx1ZSBzZXQgcmV0dXJucyB6ZXJvLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaW5wdXQgdmFsdWVzLCAKKyAgICAgKiBzbyB0aGUgcmV0dXJuZWQgYXZlcmFnZSB3b24ndCBoYXZlIGEgZGVjaW1hbCBwYXJ0LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWdncmVnYXRlRnVuY3Rpb24gYXZnRnVuY3Rpb25Gb3JJbnQzMiA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBhdmdGdW5jdGlvbkZvckludDMyID0KICAgICAgICAgICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigiYXZnIiwgSW50MzJUeXBlLmluc3RhbmNlLCBJbnQzMlR5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtNDQ5LDggKzQ4MCwxMSBAQAogCiAgICAgLyoqCiAgICAgICogVGhlIFNVTSBmdW5jdGlvbiBmb3IgbG9uZyB2YWx1ZXMuCisgICAgICogPC9wPgorICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBpbnB1dCB2YWx1ZXMsIHNvIHRoZXJlIGlzIGEgcmlzayBvZiBvdmVyZmxvdyBpZiB0aGUgc3VtIG9mIHRoZQorICAgICAqIHZhbHVlcyBleGNlZWRzIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIHR5cGUgY2FuIHJlcHJlc2VudC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFnZ3JlZ2F0ZUZ1bmN0aW9uIHN1bUZ1bmN0aW9uRm9yTG9uZyA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBzdW1GdW5jdGlvbkZvckxvbmcgPQogICAgICAgICAgICAgbmV3IE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKCJzdW0iLCBMb25nVHlwZS5pbnN0YW5jZSwgTG9uZ1R5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtNDYxLDggKzQ5NSwxMSBAQAogCiAgICAgLyoqCiAgICAgICogQVZHIGZ1bmN0aW9uIGZvciBsb25nIHZhbHVlcy4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIGF2ZXJhZ2Ugb2YgYW4gZW1wdHkgdmFsdWUgc2V0IHJldHVybnMgemVyby4gVGhlIHJldHVybmVkIHZhbHVlIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGlucHV0IHZhbHVlcywgCisgICAgICogc28gdGhlIHJldHVybmVkIGF2ZXJhZ2Ugd29uJ3QgaGF2ZSBhIGRlY2ltYWwgcGFydC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFnZ3JlZ2F0ZUZ1bmN0aW9uIGF2Z0Z1bmN0aW9uRm9yTG9uZyA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBhdmdGdW5jdGlvbkZvckxvbmcgPQogICAgICAgICAgICAgbmV3IE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKCJhdmciLCBMb25nVHlwZS5pbnN0YW5jZSwgTG9uZ1R5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtNDc5LDggKzUxNiwxMSBAQAogCiAgICAgLyoqCiAgICAgICogVGhlIFNVTSBmdW5jdGlvbiBmb3IgZmxvYXQgdmFsdWVzLgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaW5wdXQgdmFsdWVzLCBzbyB0aGVyZSBpcyBhIHJpc2sgb2Ygb3ZlcmZsb3cgaWYgdGhlIHN1bSBvZiB0aGUKKyAgICAgKiB2YWx1ZXMgZXhjZWVkcyB0aGUgbWF4aW11bSB2YWx1ZSB0aGF0IHRoZSB0eXBlIGNhbiByZXByZXNlbnQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBzdW1GdW5jdGlvbkZvckZsb2F0ID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIHN1bUZ1bmN0aW9uRm9yRmxvYXQgPQogICAgICAgICAgICAgbmV3IE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKCJzdW0iLCBGbG9hdFR5cGUuaW5zdGFuY2UsIEZsb2F0VHlwZS5pbnN0YW5jZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgQWdncmVnYXRlIG5ld0FnZ3JlZ2F0ZSgpCkBAIC00OTcsOCArNTM3LDEwIEBACiAKICAgICAvKioKICAgICAgKiBBVkcgZnVuY3Rpb24gZm9yIGZsb2F0IHZhbHVlcy4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIGF2ZXJhZ2Ugb2YgYW4gZW1wdHkgdmFsdWUgc2V0IHJldHVybnMgemVyby4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFnZ3JlZ2F0ZUZ1bmN0aW9uIGF2Z0Z1bmN0aW9uRm9yRmxvYXQgPQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gYXZnRnVuY3Rpb25Gb3JGbG9hdCA9CiAgICAgICAgICAgICBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oImF2ZyIsIEZsb2F0VHlwZS5pbnN0YW5jZSwgRmxvYXRUeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHB1YmxpYyBBZ2dyZWdhdGUgbmV3QWdncmVnYXRlKCkKQEAgLTUxNSw4ICs1NTcsMTEgQEAKIAogICAgIC8qKgogICAgICAqIFRoZSBTVU0gZnVuY3Rpb24gZm9yIGRvdWJsZSB2YWx1ZXMuCisgICAgICogPC9wPgorICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZSBpbnB1dCB2YWx1ZXMsIHNvIHRoZXJlIGlzIGEgcmlzayBvZiBvdmVyZmxvdyBpZiB0aGUgc3VtIG9mIHRoZQorICAgICAqIHZhbHVlcyBleGNlZWRzIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIHR5cGUgY2FuIHJlcHJlc2VudC4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFnZ3JlZ2F0ZUZ1bmN0aW9uIHN1bUZ1bmN0aW9uRm9yRG91YmxlID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIHN1bUZ1bmN0aW9uRm9yRG91YmxlID0KICAgICAgICAgICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigic3VtIiwgRG91YmxlVHlwZS5pbnN0YW5jZSwgRG91YmxlVHlwZS5pbnN0YW5jZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBwdWJsaWMgQWdncmVnYXRlIG5ld0FnZ3JlZ2F0ZSgpCkBAIC01NDEsOSArNTg2LDkgQEAKICAgICAgICAgcHJpdmF0ZSBkb3VibGUgY29tcGVuc2F0aW9uOwogICAgICAgICBwcml2YXRlIGRvdWJsZSBzaW1wbGVTdW07CiAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFR5cGUgbnVtYmVyVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFR5cGU8Pz4gbnVtYmVyVHlwZTsKIAotICAgICAgICBwdWJsaWMgRmxvYXRTdW1BZ2dyZWdhdGUoQWJzdHJhY3RUeXBlIG51bWJlclR5cGUpCisgICAgICAgIHB1YmxpYyBGbG9hdFN1bUFnZ3JlZ2F0ZShBYnN0cmFjdFR5cGU8Pz4gbnVtYmVyVHlwZSkKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5udW1iZXJUeXBlID0gbnVtYmVyVHlwZTsKICAgICAgICAgfQpAQCAtNTk5LDkgKzY0NCw5IEBACiAgICAgICAgIHByaXZhdGUgQmlnRGVjaW1hbCBiaWdTdW0gPSBudWxsOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gb3ZlcmZsb3cgPSBmYWxzZTsKIAotICAgICAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0VHlwZSBudW1iZXJUeXBlOworICAgICAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0VHlwZTw/PiBudW1iZXJUeXBlOwogCi0gICAgICAgIHB1YmxpYyBGbG9hdEF2Z0FnZ3JlZ2F0ZShBYnN0cmFjdFR5cGUgbnVtYmVyVHlwZSkKKyAgICAgICAgcHVibGljIEZsb2F0QXZnQWdncmVnYXRlKEFic3RyYWN0VHlwZTw/PiBudW1iZXJUeXBlKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLm51bWJlclR5cGUgPSBudW1iZXJUeXBlOwogICAgICAgICB9CkBAIC02NzUsOCArNzIwLDEwIEBACiAKICAgICAvKioKICAgICAgKiBBVkcgZnVuY3Rpb24gZm9yIGRvdWJsZSB2YWx1ZXMuCisgICAgICogPC9wPgorICAgICAqIFRoZSBhdmVyYWdlIG9mIGFuIGVtcHR5IHZhbHVlIHNldCByZXR1cm5zIHplcm8uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBBZ2dyZWdhdGVGdW5jdGlvbiBhdmdGdW5jdGlvbkZvckRvdWJsZSA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBhdmdGdW5jdGlvbkZvckRvdWJsZSA9CiAgICAgICAgICAgICBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oImF2ZyIsIERvdWJsZVR5cGUuaW5zdGFuY2UsIERvdWJsZVR5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtNjk0LDcgKzc0MSw3IEBACiAgICAgLyoqCiAgICAgICogVGhlIFNVTSBmdW5jdGlvbiBmb3IgY291bnRlciBjb2x1bW4gdmFsdWVzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWdncmVnYXRlRnVuY3Rpb24gc3VtRnVuY3Rpb25Gb3JDb3VudGVyID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIHN1bUZ1bmN0aW9uRm9yQ291bnRlciA9CiAgICAgbmV3IE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKCJzdW0iLCBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UpCiAgICAgewogICAgICAgICBwdWJsaWMgQWdncmVnYXRlIG5ld0FnZ3JlZ2F0ZSgpCkBAIC03MDYsNyArNzUzLDcgQEAKICAgICAvKioKICAgICAgKiBBVkcgZnVuY3Rpb24gZm9yIGNvdW50ZXIgY29sdW1uIHZhbHVlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFnZ3JlZ2F0ZUZ1bmN0aW9uIGF2Z0Z1bmN0aW9uRm9yQ291bnRlciA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBhdmdGdW5jdGlvbkZvckNvdW50ZXIgPQogICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigiYXZnIiwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlKQogICAgIHsKICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtNzI0LDcgKzc3MSw3IEBACiAgICAgLyoqCiAgICAgICogVGhlIE1JTiBmdW5jdGlvbiBmb3IgY291bnRlciBjb2x1bW4gdmFsdWVzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWdncmVnYXRlRnVuY3Rpb24gbWluRnVuY3Rpb25Gb3JDb3VudGVyID0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIG1pbkZ1bmN0aW9uRm9yQ291bnRlciA9CiAgICAgbmV3IE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uKCJtaW4iLCBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UpCiAgICAgewogICAgICAgICBwdWJsaWMgQWdncmVnYXRlIG5ld0FnZ3JlZ2F0ZSgpCkBAIC03NjIsNyArODA5LDcgQEAKICAgICAvKioKICAgICAgKiBNQVggZnVuY3Rpb24gZm9yIGNvdW50ZXIgY29sdW1uIHZhbHVlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFnZ3JlZ2F0ZUZ1bmN0aW9uIG1heEZ1bmN0aW9uRm9yQ291bnRlciA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBtYXhGdW5jdGlvbkZvckNvdW50ZXIgPQogICAgIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigibWF4IiwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlKQogICAgIHsKICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZSBuZXdBZ2dyZWdhdGUoKQpAQCAtODAzLDcgKzg1MCw3IEBACiAgICAgICogQHBhcmFtIGlucHV0VHlwZSB0aGUgZnVuY3Rpb24gaW5wdXQgYW5kIG91dHB1dCB0eXBlCiAgICAgICogQHJldHVybiBhIE1BWCBmdW5jdGlvbiBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRlRnVuY3Rpb24gbWFrZU1heEZ1bmN0aW9uKGZpbmFsIEFic3RyYWN0VHlwZTw/PiBpbnB1dFR5cGUpCisgICAgcHVibGljIHN0YXRpYyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBtYWtlTWF4RnVuY3Rpb24oZmluYWwgQWJzdHJhY3RUeXBlPD8+IGlucHV0VHlwZSkKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24oIm1heCIsIGlucHV0VHlwZSwgaW5wdXRUeXBlKQogICAgICAgICB7CkBAIC04NDQsNyArODkxLDcgQEAKICAgICAgKiBAcGFyYW0gaW5wdXRUeXBlIHRoZSBmdW5jdGlvbiBpbnB1dCBhbmQgb3V0cHV0IHR5cGUKICAgICAgKiBAcmV0dXJuIGEgTUlOIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVGdW5jdGlvbiBtYWtlTWluRnVuY3Rpb24oZmluYWwgQWJzdHJhY3RUeXBlPD8+IGlucHV0VHlwZSkKKyAgICBwdWJsaWMgc3RhdGljIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIG1ha2VNaW5GdW5jdGlvbihmaW5hbCBBYnN0cmFjdFR5cGU8Pz4gaW5wdXRUeXBlKQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigibWluIiwgaW5wdXRUeXBlLCBpbnB1dFR5cGUpCiAgICAgICAgIHsKQEAgLTg4NSw3ICs5MzIsNyBAQAogICAgICAqIEBwYXJhbSBpbnB1dFR5cGUgdGhlIGZ1bmN0aW9uIGlucHV0IHR5cGUKICAgICAgKiBAcmV0dXJuIGEgQ09VTlQgZnVuY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEFnZ3JlZ2F0ZUZ1bmN0aW9uIG1ha2VDb3VudEZ1bmN0aW9uKEFic3RyYWN0VHlwZTw/PiBpbnB1dFR5cGUpCisgICAgcHVibGljIHN0YXRpYyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBtYWtlQ291bnRGdW5jdGlvbihBYnN0cmFjdFR5cGU8Pz4gaW5wdXRUeXBlKQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbigiY291bnQiLCBMb25nVHlwZS5pbnN0YW5jZSwgaW5wdXRUeXBlKQogICAgICAgICB7CkBAIC05NTcsOSArMTAwNCw5IEBACiAgICAgICAgIHByaXZhdGUgQmlnSW50ZWdlciBiaWdTdW0gPSBudWxsOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gb3ZlcmZsb3cgPSBmYWxzZTsKIAotICAgICAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0VHlwZSBudW1iZXJUeXBlOworICAgICAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0VHlwZTw/PiBudW1iZXJUeXBlOwogCi0gICAgICAgIHB1YmxpYyBBdmdBZ2dyZWdhdGUoQWJzdHJhY3RUeXBlIHR5cGUpCisgICAgICAgIHB1YmxpYyBBdmdBZ2dyZWdhdGUoQWJzdHJhY3RUeXBlPD8+IHR5cGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMubnVtYmVyVHlwZSA9IHR5cGU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0J5dGVzQ29udmVyc2lvbkZjdHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0J5dGVzQ29udmVyc2lvbkZjdHMuamF2YQppbmRleCA3ZTk3MDhhLi44YThlYjljIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9CeXRlc0NvbnZlcnNpb25GY3RzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQnl0ZXNDb252ZXJzaW9uRmN0cy5qYXZhCkBAIC0xOCw5OCArMTgsMTA0IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZXNUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEJ5dGVzQ29udmVyc2lvbkZjdHMKIHsKLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RnVuY3Rpb24+IGFsbCgpCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZ1bmN0aW9uc1RvKE5hdGl2ZUZ1bmN0aW9ucyBmdW5jdGlvbnMpCiAgICAgewotICAgICAgICBDb2xsZWN0aW9uPEZ1bmN0aW9uPiBmdW5jdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICAvLyBiZWNhdXNlIHRleHQgYW5kIHZhcmNoYXIgZW5kcyB1cCBiZWluZyBzeW5vbnltb3VzLCBvdXIgYXV0b21hdGljIG1ha2VUb0Jsb2JGdW5jdGlvbiBkb2Vzbid0IHdvcmsKLSAgICAgICAgLy8gZm9yIHZhcmNoYXIsIHNvIHdlIHNwZWNpYWwgY2FzZSBpdCBiZWxvdy4gV2UgYWxzbyBza2lwIGJsb2IgZm9yIG9idmlvdXMgcmVhc29ucy4KLSAgICAgICAgU2V0PEFic3RyYWN0VHlwZTw/Pj4gdHlwZXMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgIGZvciAoQ1FMM1R5cGUgdHlwZSA6IENRTDNUeXBlLk5hdGl2ZS52YWx1ZXMoKSkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHR5cGUgPT0gQ1FMM1R5cGUuTmF0aXZlLkJMT0IpCiAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdWRmVHlwZSA9IHR5cGUuZ2V0VHlwZSgpLnVkZlR5cGUoKTsKLSAgICAgICAgICAgIGlmICghdHlwZXMuYWRkKHVkZlR5cGUpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgICBmdW5jdGlvbnMuYWRkKG1ha2VUb0Jsb2JGdW5jdGlvbih0eXBlLmdldFR5cGUoKS51ZGZUeXBlKCkpKTsKLSAgICAgICAgICAgIGZ1bmN0aW9ucy5hZGQobWFrZUZyb21CbG9iRnVuY3Rpb24odHlwZS5nZXRUeXBlKCkudWRmVHlwZSgpKSk7CisgICAgICAgICAgICBmdW5jdGlvbnMuYWRkKG5ldyBUb0Jsb2JGdW5jdGlvbih0eXBlKSk7CisgICAgICAgICAgICBmdW5jdGlvbnMuYWRkKG5ldyBGcm9tQmxvYkZ1bmN0aW9uKHR5cGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE1vc3Qgb2YgdGhlIFhfYXNfYmxvYiBhbmQgYmxvYl9hc19YIGZ1bmN0aW9ucyBhcmUgYmFzaWNhbGx5IG5vLW9wIHNpbmNlIGV2ZXJ5dGhpbmcgaXMKKyAgICAvLyBieXRlcyBpbnRlcm5hbGx5LiBUaGV5IG9ubHkgInRyaWNrIiB0aGUgdHlwZSBzeXN0ZW0uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUb0Jsb2JGdW5jdGlvbiBleHRlbmRzIE5hdGl2ZVNjYWxhckZ1bmN0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIENRTDNUeXBlIGZyb21UeXBlOworCisgICAgICAgIHB1YmxpYyBUb0Jsb2JGdW5jdGlvbihDUUwzVHlwZSBmcm9tVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcyhmcm9tVHlwZSwgZmFsc2UpOwogICAgICAgICB9CiAKLSAgICAgICAgZnVuY3Rpb25zLmFkZChWYXJjaGFyQXNCbG9iRmN0KTsKLSAgICAgICAgZnVuY3Rpb25zLmFkZChCbG9iQXNWYXJjaGFyRmN0KTsKKyAgICAgICAgcHJpdmF0ZSBUb0Jsb2JGdW5jdGlvbihDUUwzVHlwZSBmcm9tVHlwZSwgYm9vbGVhbiB1c2VMZWdhY3lOYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihmcm9tVHlwZSArICh1c2VMZWdhY3lOYW1lID8gImFzYmxvYiIgOiAiX2FzX2Jsb2IiKSwKKyAgICAgICAgICAgICAgICAgIEJ5dGVzVHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgIGZyb21UeXBlLmdldFR5cGUoKS51ZGZUeXBlKCkpOworICAgICAgICAgICAgdGhpcy5mcm9tVHlwZSA9IGZyb21UeXBlOworICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9uczsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5nZXQoMCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdGl2ZUZ1bmN0aW9uIHdpdGhMZWdhY3lOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUb0Jsb2JGdW5jdGlvbihmcm9tVHlwZSwgdHJ1ZSk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBNb3N0IG9mIHRoZSBYQXNCbG9iIGFuZCBibG9iQXNYIGZ1bmN0aW9ucyBhcmUgYmFzaWNhbGx5IG5vLW9wIHNpbmNlIGV2ZXJ5dGhpbmcgaXMKLSAgICAvLyBieXRlcyBpbnRlcm5hbGx5LiBUaGV5IG9ubHkgInRyaWNrIiB0aGUgdHlwZSBzeXN0ZW0uCi0gICAgcHVibGljIHN0YXRpYyBGdW5jdGlvbiBtYWtlVG9CbG9iRnVuY3Rpb24oQWJzdHJhY3RUeXBlPD8+IGZyb21UeXBlKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRnJvbUJsb2JGdW5jdGlvbiBleHRlbmRzIE5hdGl2ZVNjYWxhckZ1bmN0aW9uCiAgICAgewotICAgICAgICBTdHJpbmcgbmFtZSA9IGZyb21UeXBlLmFzQ1FMM1R5cGUoKSArICJhc2Jsb2IiOwotICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKG5hbWUsIEJ5dGVzVHlwZS5pbnN0YW5jZSwgZnJvbVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzLmdldCgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9CisgICAgICAgIHByaXZhdGUgZmluYWwgQ1FMM1R5cGUgdG9UeXBlOwogCi0gICAgcHVibGljIHN0YXRpYyBGdW5jdGlvbiBtYWtlRnJvbUJsb2JGdW5jdGlvbihmaW5hbCBBYnN0cmFjdFR5cGU8Pz4gdG9UeXBlKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSAiYmxvYmFzIiArIHRvVHlwZS5hc0NRTDNUeXBlKCk7Ci0gICAgICAgIHJldHVybiBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24obmFtZSwgdG9UeXBlLCBCeXRlc1R5cGUuaW5zdGFuY2UpCisgICAgICAgIHB1YmxpYyBGcm9tQmxvYkZ1bmN0aW9uKENRTDNUeXBlIHRvVHlwZSkKICAgICAgICAgewotICAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgorICAgICAgICAgICAgdGhpcyh0b1R5cGUsIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgRnJvbUJsb2JGdW5jdGlvbihDUUwzVHlwZSB0b1R5cGUsIGJvb2xlYW4gdXNlTGVnYWN5TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoKHVzZUxlZ2FjeU5hbWUgPyAiYmxvYmFzIiA6ICJibG9iX2FzXyIpICsgdG9UeXBlLAorICAgICAgICAgICAgICAgICAgdG9UeXBlLmdldFR5cGUoKS51ZGZUeXBlKCksCisgICAgICAgICAgICAgICAgICBCeXRlc1R5cGUuaW5zdGFuY2UpOworICAgICAgICAgICAgdGhpcy50b1R5cGUgPSB0b1R5cGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgdmFsID0gcGFyYW1ldGVycy5nZXQoMCk7CisKKyAgICAgICAgICAgIGlmICh2YWwgIT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbCA9IHBhcmFtZXRlcnMuZ2V0KDApOwogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdG9UeXBlLnZhbGlkYXRlKHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgICAgICAgICAgICAgIHRvVHlwZS5nZXRUeXBlKCkudmFsaWRhdGUodmFsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2F0Y2ggKE1hcnNoYWxFeGNlcHRpb24gZSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbiBjYWxsIHRvIGZ1bmN0aW9uICVzLCB2YWx1ZSAweCVzIGlzIG5vdCBhIHZhbGlkIGJpbmFyeSByZXByZXNlbnRhdGlvbiBmb3IgdHlwZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgodmFsKSwgdG9UeXBlLmFzQ1FMM1R5cGUoKSkpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW4gY2FsbCB0byBmdW5jdGlvbiAlcywgdmFsdWUgMHglcyBpcyBub3QgYSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkIGJpbmFyeSByZXByZXNlbnRhdGlvbiBmb3IgdHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgodmFsKSwgdG9UeXBlKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9OworCisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOYXRpdmVGdW5jdGlvbiB3aXRoTGVnYWN5TmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnJvbUJsb2JGdW5jdGlvbih0b1R5cGUsIHRydWUpOworICAgICAgICB9CiAgICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBGdW5jdGlvbiBWYXJjaGFyQXNCbG9iRmN0ID0gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKCJ2YXJjaGFyYXNibG9iIiwgQnl0ZXNUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSkKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBGdW5jdGlvbiBCbG9iQXNWYXJjaGFyRmN0ID0gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKCJibG9iYXN2YXJjaGFyIiwgVVRGOFR5cGUuaW5zdGFuY2UsIEJ5dGVzVHlwZS5pbnN0YW5jZSkKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5nZXQoMCk7Ci0gICAgICAgIH0KLSAgICB9OwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQ2FzdEZjdHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Nhc3RGY3RzLmphdmEKaW5kZXggODE5ODZjOC4uMTc2MTc3OCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQ2FzdEZjdHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9DYXN0RmN0cy5qYXZhCkBAIC0yMCw4ICsyMCw2IEBACiBpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKQEAgLTQ4LDcgKzQ2LDcgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5UaW1lRmN0cy4qOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnRleHQuV29yZFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKIAogLyoqCiAgKiBDYXN0aW5nIGZ1bmN0aW9ucwpAQCAtNTYsMTIgKzU0LDE0IEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBDYXN0RmN0cwogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGVU5DVElPTl9OQU1FX1BSRUZJWCA9ICJjYXN0QXMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGVU5DVElPTl9OQU1FX1BSRUZJWCA9ICJjYXN0X2FzXyI7CiAKLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RnVuY3Rpb24+IGFsbCgpCisgICAgLy8gVW50aWwgNS4wIHdlIGhhdmUgdXNlZCBjYW1lbCBjYXNlZCBuYW1lcyBmb3IgY2FzdCBmdW5jdGlvbnMuIFRoYXQgY2hhbmdlZCB3aXRoIENBU1NBTkRSQS0xODAzNywgd2hlcmUgd2UgZGVjaWRlZAorICAgIC8vIHRvIGFkb3B0IHNuYWtlIGNhc2UgZm9yIGFsbCBuYXRpdmUgZnVuY3Rpb24gbmFtZXMuIEhvd2V2ZXIsIHdlIHNob3VsZCBzdGlsbCBzdXBwb3J0IHRoZSBvbGQgY2FtZSBjYXNlIG5hbWVzLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfRlVOQ1RJT05fTkFNRV9QUkVGSVggPSAiY2FzdEFzIjsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGdW5jdGlvbnNUbyhOYXRpdmVGdW5jdGlvbnMgZnVuY3Rpb25zKQogICAgIHsKLSAgICAgICAgTGlzdDxGdW5jdGlvbj4gZnVuY3Rpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgICAgIGZpbmFsIEFic3RyYWN0VHlwZTw/IGV4dGVuZHMgTnVtYmVyPltdIG51bWVyaWNUeXBlcyA9IG5ldyBBYnN0cmFjdFR5cGVbXSB7Qnl0ZVR5cGUuaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvcnRUeXBlLmluc3RhbmNlLApAQCAtMTEwLDggKzExMCw2IEBACiAKICAgICAgICAgZnVuY3Rpb25zLmFkZChDYXN0QXNUZXh0RnVuY3Rpb24uY3JlYXRlKFVVSURUeXBlLmluc3RhbmNlLCBBc2NpaVR5cGUuaW5zdGFuY2UpKTsKICAgICAgICAgZnVuY3Rpb25zLmFkZChDYXN0QXNUZXh0RnVuY3Rpb24uY3JlYXRlKFVVSURUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSkpOwotCi0gICAgICAgIHJldHVybiBmdW5jdGlvbnM7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMzIsMjUgKzEzMCwzOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIG5hbWUgb2YgdGhlIGNhc3QgZnVuY3Rpb24gdXNlIHRvIGNhc3QgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAqIENyZWF0ZXMgdGhlIHNuYWtlLWNhc2VkIG5hbWUgb2YgdGhlIGNhc3QgZnVuY3Rpb24gdXNlZCB0byBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBvdXRwdXRUeXBlIHRoZSBvdXRwdXQgdHlwZQotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNhc3QgZnVuY3Rpb24gdXNlIHRvIGNhc3QgdG8gdGhlIHNwZWNpZmllZCB0eXBlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RnVuY3Rpb25OYW1lKEFic3RyYWN0VHlwZTw/PiBvdXRwdXRUeXBlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEZ1bmN0aW9uTmFtZShvdXRwdXRUeXBlLmFzQ1FMM1R5cGUoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbmFtZSBvZiB0aGUgY2FzdCBmdW5jdGlvbiB1c2UgdG8gY2FzdCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0cHV0VHlwZSB0aGUgb3V0cHV0IHR5cGUKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjYXN0IGZ1bmN0aW9uIHVzZSB0byBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZQorICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNhc3QgZnVuY3Rpb24gdXNlZCB0byBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZQogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZ1bmN0aW9uTmFtZShDUUwzVHlwZSBvdXRwdXRUeXBlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEZVTkNUSU9OX05BTUVfUFJFRklYICsgV29yZFV0aWxzLmNhcGl0YWxpemUodG9Mb3dlckNhc2VTdHJpbmcob3V0cHV0VHlwZSkpOworICAgICAgICByZXR1cm4gRlVOQ1RJT05fTkFNRV9QUkVGSVggKyB0b0xvd2VyQ2FzZVN0cmluZyhvdXRwdXRUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBsZWdhY3kgY2FtZWwtY2FzZWQgbmFtZSBvZiB0aGUgY2FzdCBmdW5jdGlvbiB1c2VkIHRvIGNhc3QgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dFR5cGUgdGhlIG91dHB1dCB0eXBlCisgICAgICogQHJldHVybiB0aGUgbGVnYWN5IGNhbWVsLWNhc2VkIG5hbWUgb2YgdGhlIGNhc3QgZnVuY3Rpb24gdXNlZCB0byBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMZWdhY3lGdW5jdGlvbk5hbWUoQ1FMM1R5cGUgb3V0cHV0VHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBMRUdBQ1lfRlVOQ1RJT05fTkFNRV9QUkVGSVggKyBTdHJpbmdVdGlscy5jYXBpdGFsaXplKHRvTG93ZXJDYXNlU3RyaW5nKG91dHB1dFR5cGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBuYW1lIG9mIHRoZSBjYXN0IGZ1bmN0aW9uIHVzZWQgdG8gY2FzdCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0VHlwZSB0aGUgb3V0cHV0IHR5cGUKKyAgICAgKiBAcGFyYW0gbGVnYWN5IHdoZXRoZXIgdG8gdXNlIHRoZSBvbGQgY2FtZUNhc2UgbmFtZXMsIGluc3RlYWQgb2YgdGhlIG5ldyBzbmFrZV9jYXNlIG5hbWVzCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgY2FzdCBmdW5jdGlvbiB1c2VkIHRvIGNhc3QgdG8gdGhlIHNwZWNpZmllZCB0eXBlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEZ1bmN0aW9uTmFtZShBYnN0cmFjdFR5cGU8Pz4gb3V0cHV0VHlwZSwgYm9vbGVhbiBsZWdhY3kpCisgICAgeworICAgICAgICBDUUwzVHlwZSB0eXBlID0gb3V0cHV0VHlwZS5hc0NRTDNUeXBlKCk7CisgICAgICAgIHJldHVybiBsZWdhY3kgPyBnZXRMZWdhY3lGdW5jdGlvbk5hbWUodHlwZSkgOiBnZXRGdW5jdGlvbk5hbWUodHlwZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjEsNyArMTcyLDcgQEAKICAgICAgKiBAcGFyYW0gb3V0cHV0VHlwZSB0aGUgb3V0cHV0IHR5cGUKICAgICAgKiBAcGFyYW0gY29udmVydGVyIHRoZSBmdW5jdGlvbiB1c2UgdG8gY29udmVydCB0aGUgaW5wdXQgdHlwZSBpbnRvIHRoZSBvdXRwdXQgdHlwZQogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIDxJLCBPPiB2b2lkIGFkZEZ1bmN0aW9uSWZOZWVkZWQoTGlzdDxGdW5jdGlvbj4gZnVuY3Rpb25zLAorICAgIHByaXZhdGUgc3RhdGljIDxJLCBPPiB2b2lkIGFkZEZ1bmN0aW9uSWZOZWVkZWQoTmF0aXZlRnVuY3Rpb25zIGZ1bmN0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTxJPiBpbnB1dFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Tz4gb3V0cHV0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxJLCBPPiBjb252ZXJ0ZXIpCkBAIC0xNzEsOSArMTgyLDkgQEAKICAgICB9CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwcml2YXRlIHN0YXRpYyA8TywgST4gRnVuY3Rpb24gd3JhcEphdmFGdW5jdGlvbihBYnN0cmFjdFR5cGU8ST4gaW5wdXRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTxPPiBvdXRwdXRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxJLCBPPiBjb252ZXJ0ZXIpCisgICAgcHJpdmF0ZSBzdGF0aWMgPE8sIEk+IENhc3RGdW5jdGlvbjw/LCBPPiB3cmFwSmF2YUZ1bmN0aW9uKEFic3RyYWN0VHlwZTxJPiBpbnB1dFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTxPPiBvdXRwdXRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248SSwgTz4gY29udmVydGVyKQogICAgIHsKICAgICAgICAgcmV0dXJuIGlucHV0VHlwZS5lcXVhbHMoQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICAgICAgPyBKYXZhQ291bnRlckZ1bmN0aW9uV3JhcHBlci5jcmVhdGUob3V0cHV0VHlwZSwgKGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxMb25nLCBPPikgY29udmVydGVyKQpAQCAtMTkzLDkgKzIwNCw5IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FzdEZ1bmN0aW9uPEksIE8+IGV4dGVuZHMgTmF0aXZlU2NhbGFyRnVuY3Rpb24KICAgICB7Ci0gICAgICAgIHB1YmxpYyBDYXN0RnVuY3Rpb24oQWJzdHJhY3RUeXBlPEk+IGlucHV0VHlwZSwgQWJzdHJhY3RUeXBlPE8+IG91dHB1dFR5cGUpCisgICAgICAgIHB1YmxpYyBDYXN0RnVuY3Rpb24oQWJzdHJhY3RUeXBlPEk+IGlucHV0VHlwZSwgQWJzdHJhY3RUeXBlPE8+IG91dHB1dFR5cGUsIGJvb2xlYW4gdXNlTGVnYWN5TmFtZSkKICAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoZ2V0RnVuY3Rpb25OYW1lKG91dHB1dFR5cGUpLCBvdXRwdXRUeXBlLCBpbnB1dFR5cGUpOworICAgICAgICAgICAgc3VwZXIoZ2V0RnVuY3Rpb25OYW1lKG91dHB1dFR5cGUsIHVzZUxlZ2FjeU5hbWUpLCBvdXRwdXRUeXBlLCBpbnB1dFR5cGUpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC0yMjgsMjMgKzIzOSwzMCBAQAogICAgICAgICAvKioKICAgICAgICAgICogVGhlIGphdmEgZnVuY3Rpb24gdXNlZCB0byBjb252ZXJ0IHRoZSBpbnB1dCB0eXBlIGludG8gdGhlIG91dHB1dCBvbmUuCiAgICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGZpbmFsIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxJLCBPPiBjb252ZXJ0ZXI7CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248SSwgTz4gY29udmVydGVyOwogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgPEksIE8+IEphdmFGdW5jdGlvbldyYXBwZXI8SSwgTz4gY3JlYXRlKEFic3RyYWN0VHlwZTxJPiBpbnB1dFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTxPPiBvdXRwdXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248SSwgTz4gY29udmVydGVyKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEphdmFGdW5jdGlvbldyYXBwZXI8SSwgTz4oaW5wdXRUeXBlLCBvdXRwdXRUeXBlLCBjb252ZXJ0ZXIpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXZhRnVuY3Rpb25XcmFwcGVyPD4oaW5wdXRUeXBlLCBvdXRwdXRUeXBlLCBjb252ZXJ0ZXIsIGZhbHNlKTsKICAgICAgICAgfQogCiAgICAgICAgIHByb3RlY3RlZCBKYXZhRnVuY3Rpb25XcmFwcGVyKEFic3RyYWN0VHlwZTxJPiBpbnB1dFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTxPPiBvdXRwdXRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248SSwgTz4gY29udmVydGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248SSwgTz4gY29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZUxlZ2FjeU5hbWUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGlucHV0VHlwZSwgb3V0cHV0VHlwZSk7CisgICAgICAgICAgICBzdXBlcihpbnB1dFR5cGUsIG91dHB1dFR5cGUsIHVzZUxlZ2FjeU5hbWUpOwogICAgICAgICAgICAgdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEphdmFGdW5jdGlvbldyYXBwZXI8SSwgTz4gd2l0aExlZ2FjeU5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFGdW5jdGlvbldyYXBwZXI8PihpbnB1dFR5cGUoKSwgb3V0cHV0VHlwZSgpLCBjb252ZXJ0ZXIsIHRydWUpOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIGZpbmFsIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBwYXJhbWV0ZXJzLmdldCgwKTsKQEAgLTI3MywxMyArMjkxLDIwIEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgPE8+IEphdmFGdW5jdGlvbldyYXBwZXI8TG9uZywgTz4gY3JlYXRlKEFic3RyYWN0VHlwZTxPPiBvdXRwdXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248TG9uZywgTz4gY29udmVydGVyKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEphdmFDb3VudGVyRnVuY3Rpb25XcmFwcGVyPE8+KG91dHB1dFR5cGUsIGNvbnZlcnRlcik7CisgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFDb3VudGVyRnVuY3Rpb25XcmFwcGVyPD4ob3V0cHV0VHlwZSwgY29udmVydGVyLCBmYWxzZSk7CiAgICAgICAgIH0KIAogICAgICAgICBwcm90ZWN0ZWQgSmF2YUNvdW50ZXJGdW5jdGlvbldyYXBwZXIoQWJzdHJhY3RUeXBlPE8+IG91dHB1dFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjxMb25nLCBPPiBjb252ZXJ0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb248TG9uZywgTz4gY29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VMZWdhY3lOYW1lKQogICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSwgb3V0cHV0VHlwZSwgY29udmVydGVyKTsKKyAgICAgICAgICAgIHN1cGVyKENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCBvdXRwdXRUeXBlLCBjb252ZXJ0ZXIsIHVzZUxlZ2FjeU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBKYXZhQ291bnRlckZ1bmN0aW9uV3JhcHBlcjxPPiB3aXRoTGVnYWN5TmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmF2YUNvdW50ZXJGdW5jdGlvbldyYXBwZXI8PihvdXRwdXRUeXBlKCksIGNvbnZlcnRlciwgdHJ1ZSk7CiAgICAgICAgIH0KIAogICAgICAgICBwcm90ZWN0ZWQgTG9uZyBjb21wb3NlKEJ5dGVCdWZmZXIgYmIpCkBAIC0zMDUsMTkgKzMzMCwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTxPPiBvdXRwdXRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZVNjYWxhckZ1bmN0aW9uIGRlbGVnYXRlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENhc3NhbmRyYUZ1bmN0aW9uV3JhcHBlcjxJLCBPPihpbnB1dFR5cGUsIG91dHB1dFR5cGUsIGRlbGVnYXRlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2Fzc2FuZHJhRnVuY3Rpb25XcmFwcGVyPD4oaW5wdXRUeXBlLCBvdXRwdXRUeXBlLCBkZWxlZ2F0ZSwgZmFsc2UpOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSBDYXNzYW5kcmFGdW5jdGlvbldyYXBwZXIoQWJzdHJhY3RUeXBlPEk+IGlucHV0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPE8+IG91dHB1dFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hdGl2ZVNjYWxhckZ1bmN0aW9uIGRlbGVnYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVTY2FsYXJGdW5jdGlvbiBkZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VMZWdhY3lOYW1lKQogICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihpbnB1dFR5cGUsIG91dHB1dFR5cGUpOworICAgICAgICAgICAgc3VwZXIoaW5wdXRUeXBlLCBvdXRwdXRUeXBlLCB1c2VMZWdhY3lOYW1lKTsKICAgICAgICAgICAgIGFzc2VydCBkZWxlZ2F0ZS5hcmdUeXBlcygpLnNpemUoKSA9PSAxICYmIGlucHV0VHlwZS5lcXVhbHMoZGVsZWdhdGUuYXJnVHlwZXMoKS5nZXQoMCkpOwogICAgICAgICAgICAgYXNzZXJ0IG91dHB1dFR5cGUuZXF1YWxzKGRlbGVnYXRlLnJldHVyblR5cGUoKSk7CiAgICAgICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENhc3NhbmRyYUZ1bmN0aW9uV3JhcHBlcjxJLCBPPiB3aXRoTGVnYWN5TmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2Fzc2FuZHJhRnVuY3Rpb25XcmFwcGVyPD4oaW5wdXRUeXBlKCksIG91dHB1dFR5cGUoKSwgZGVsZWdhdGUsIHRydWUpOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5leGVjdXRlKHByb3RvY29sVmVyc2lvbiwgcGFyYW1ldGVycyk7CkBAIC0zMzUsMTMgKzM2NywxOCBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIDxJPiBDYXN0QXNUZXh0RnVuY3Rpb248ST4gY3JlYXRlKEFic3RyYWN0VHlwZTxJPiBpbnB1dFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPFN0cmluZz4gb3V0cHV0VHlwZSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXN0QXNUZXh0RnVuY3Rpb248ST4oaW5wdXRUeXBlLCBvdXRwdXRUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2FzdEFzVGV4dEZ1bmN0aW9uPD4oaW5wdXRUeXBlLCBvdXRwdXRUeXBlLCBmYWxzZSk7CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIENhc3RBc1RleHRGdW5jdGlvbihBYnN0cmFjdFR5cGU8ST4gaW5wdXRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPFN0cmluZz4gb3V0cHV0VHlwZSkKKyAgICAgICAgcHJpdmF0ZSBDYXN0QXNUZXh0RnVuY3Rpb24oQWJzdHJhY3RUeXBlPEk+IGlucHV0VHlwZSwgQWJzdHJhY3RUeXBlPFN0cmluZz4gb3V0cHV0VHlwZSwgYm9vbGVhbiB1c2VMZWdhY3lOYW1lKQogICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihpbnB1dFR5cGUsIG91dHB1dFR5cGUpOworICAgICAgICAgICAgc3VwZXIoaW5wdXRUeXBlLCBvdXRwdXRUeXBlLCB1c2VMZWdhY3lOYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2FzdEFzVGV4dEZ1bmN0aW9uPEk+IHdpdGhMZWdhY3lOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXN0QXNUZXh0RnVuY3Rpb248PihpbnB1dFR5cGUoKSwgb3V0cHV0VHlwZSgpLCB0cnVlKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQ29sbGVjdGlvbkZjdHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0NvbGxlY3Rpb25GY3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjOTZiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0NvbGxlY3Rpb25GY3RzLmphdmEKQEAgLTAsMCArMSwzNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnM7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQ29sbGVjdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5MaXN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLk1hcFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5TZXRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CisKKy8qKgorICogTmF0aXZlIENRTCBmdW5jdGlvbnMgZm9yIGNvbGxlY3Rpb25zIChzZXRzLCBsaXN0IGFuZCBtYXBzKS4KKyAqIDxwPgorICogQWxsIHRoZSBmdW5jdGlvbnMgcHJvdmlkZWQgaGVyZSBhcmUge0BsaW5rIE5hdGl2ZVNjYWxhckZ1bmN0aW9ufSwgYW5kIHRoZXkgYXJlIG1lYW50IHRvIGJlIGFwcGxpZWQgdG8gc2luZ2xlCisgKiBjb2xsZWN0aW9uIHZhbHVlcyB0byBwZXJmb3JtIHNvbWUga2luZCBvZiBhZ2dyZWdhdGlvbiB3aXRoIHRoZSBlbGVtZW50cyBvZiB0aGUgY29sbGVjdGlvbiBhcmd1bWVudC4gV2hlbiBwb3NzaWJsZSwKKyAqIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGVzZSBhZ2dyZWdhdGlvbiBmdW5jdGlvbnMgaXMgYmFzZWQgb24gdGhlIGFjY3Jvc3Mtcm93cyBhZ2dyZWdhdGlvbiBmdW5jdGlvbnMgYXZhaWxhYmxlIG9uCisgKiB7QGxpbmsgQWdncmVnYXRlRmN0c30sIHNvIGJvdGggYWNyb3NzLXJvd3MgYW5kIHdpdGhpbi1jb2xsZWN0aW9uIGFnZ3JlZ2F0aW9ucyBoYXZlIHRoZSBzYW1lIGJlaGF2aW91ci4KKyAqLworcHVibGljIGNsYXNzIENvbGxlY3Rpb25GY3RzCit7CisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZ1bmN0aW9uc1RvKE5hdGl2ZUZ1bmN0aW9ucyBmdW5jdGlvbnMpCisgICAgeworICAgICAgICBmdW5jdGlvbnMuYWRkKG5ldyBGdW5jdGlvbkZhY3RvcnkoIm1hcF9rZXlzIiwgRnVuY3Rpb25QYXJhbWV0ZXIuYW55TWFwKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VNYXBLZXlzRnVuY3Rpb24obmFtZS5uYW1lLCAoTWFwVHlwZTw/LCA/PikgYXJnVHlwZXMuZ2V0KDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZnVuY3Rpb25zLmFkZChuZXcgRnVuY3Rpb25GYWN0b3J5KCJtYXBfdmFsdWVzIiwgRnVuY3Rpb25QYXJhbWV0ZXIuYW55TWFwKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VNYXBWYWx1ZXNGdW5jdGlvbihuYW1lLm5hbWUsIChNYXBUeXBlPD8sID8+KSBhcmdUeXBlcy5nZXQoMCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBmdW5jdGlvbnMuYWRkKG5ldyBGdW5jdGlvbkZhY3RvcnkoImNvbGxlY3Rpb25fY291bnQiLCBGdW5jdGlvblBhcmFtZXRlci5hbnlDb2xsZWN0aW9uKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VDb2xsZWN0aW9uQ291bnRGdW5jdGlvbihuYW1lLm5hbWUsIChDb2xsZWN0aW9uVHlwZTw/PikgYXJnVHlwZXMuZ2V0KDApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZnVuY3Rpb25zLmFkZChuZXcgRnVuY3Rpb25GYWN0b3J5KCJjb2xsZWN0aW9uX21pbiIsIEZ1bmN0aW9uUGFyYW1ldGVyLnNldE9yTGlzdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtYWtlQ29sbGVjdGlvbk1pbkZ1bmN0aW9uKG5hbWUubmFtZSwgKENvbGxlY3Rpb25UeXBlPD8+KSBhcmdUeXBlcy5nZXQoMCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBmdW5jdGlvbnMuYWRkKG5ldyBGdW5jdGlvbkZhY3RvcnkoImNvbGxlY3Rpb25fbWF4IiwgRnVuY3Rpb25QYXJhbWV0ZXIuc2V0T3JMaXN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VDb2xsZWN0aW9uTWF4RnVuY3Rpb24obmFtZS5uYW1lLCAoQ29sbGVjdGlvblR5cGU8Pz4pIGFyZ1R5cGVzLmdldCgwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGZ1bmN0aW9ucy5hZGQobmV3IEZ1bmN0aW9uRmFjdG9yeSgiY29sbGVjdGlvbl9zdW0iLCBGdW5jdGlvblBhcmFtZXRlci5udW1lcmljU2V0T3JMaXN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VDb2xsZWN0aW9uU3VtRnVuY3Rpb24obmFtZS5uYW1lLCAoQ29sbGVjdGlvblR5cGU8Pz4pIGFyZ1R5cGVzLmdldCgwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGZ1bmN0aW9ucy5hZGQobmV3IEZ1bmN0aW9uRmFjdG9yeSgiY29sbGVjdGlvbl9hdmciLCBGdW5jdGlvblBhcmFtZXRlci5udW1lcmljU2V0T3JMaXN0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VDb2xsZWN0aW9uQXZnRnVuY3Rpb24obmFtZS5uYW1lLCAoQ29sbGVjdGlvblR5cGU8Pz4pIGFyZ1R5cGVzLmdldCgwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuYXRpdmUgc2NhbGFyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSBrZXlzIG9mIGEgbWFwIGNvbHVtbiwgYXMgYSBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSAgICAgIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBpbnB1dFR5cGUgdGhlIHR5cGUgb2YgdGhlIG1hcCBhcmd1bWVudCBieSB0aGUgcmV0dXJuZWQgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gPEs+ICAgICAgIHRoZSBjbGFzcyBvZiB0aGUgbWFwIGFyZ3VtZW50IGtleXMKKyAgICAgKiBAcGFyYW0gPFY+ICAgICAgIHRoZSBjbGFzcyBvZiB0aGUgbWFwIGFyZ3VtZW50IHZhbHVlcworICAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBzZXJpYWxpemVkIHNldCBjb250YWluaW5nIHRoZSBrZXlzIG9mIHRoZSBtYXAgcGFzc2VkIGFzIGFyZ3VtZW50CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgPEssIFY+IE5hdGl2ZVNjYWxhckZ1bmN0aW9uIG1ha2VNYXBLZXlzRnVuY3Rpb24oU3RyaW5nIG5hbWUsIE1hcFR5cGU8SywgVj4gaW5wdXRUeXBlKQorICAgIHsKKyAgICAgICAgU2V0VHlwZTxLPiBvdXRwdXRUeXBlID0gU2V0VHlwZS5nZXRJbnN0YW5jZShpbnB1dFR5cGUuZ2V0S2V5c1R5cGUoKSwgZmFsc2UpOworCisgICAgICAgIHJldHVybiBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24obmFtZSwgb3V0cHV0VHlwZSwgaW5wdXRUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBwYXJhbWV0ZXJzLmdldCgwKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICBNYXA8SywgVj4gbWFwID0gaW5wdXRUeXBlLmNvbXBvc2UodmFsdWUpOworICAgICAgICAgICAgICAgIFNldDxLPiBrZXlzID0gbWFwLmtleVNldCgpOworICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXRUeXBlLmRlY29tcG9zZShrZXlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmF0aXZlIHNjYWxhciBmdW5jdGlvbiBmb3IgZ2V0dGluZyB0aGUgdmFsdWVzIG9mIGEgbWFwIGNvbHVtbiwgYXMgYSBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgICAgICB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gaW5wdXRUeXBlIHRoZSB0eXBlIG9mIHRoZSBtYXAgYXJndW1lbnQgYWNjZXB0ZWQgYnkgdGhlIHJldHVybmVkIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIDxLPiAgICAgICB0aGUgY2xhc3Mgb2YgdGhlIG1hcCBhcmd1bWVudCBrZXlzCisgICAgICogQHBhcmFtIDxWPiAgICAgICB0aGUgY2xhc3Mgb2YgdGhlIG1hcCBhcmd1bWVudCB2YWx1ZXMKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgc2VyaWFsaXplZCBsaXN0IGNvbnRhaW5pbmcgdGhlIHZhbHVlcyBvZiB0aGUgbWFwIHBhc3NlZCBhcyBhcmd1bWVudAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxLLCBWPiBOYXRpdmVTY2FsYXJGdW5jdGlvbiBtYWtlTWFwVmFsdWVzRnVuY3Rpb24oU3RyaW5nIG5hbWUsIE1hcFR5cGU8SywgVj4gaW5wdXRUeXBlKQorICAgIHsKKyAgICAgICAgTGlzdFR5cGU8Vj4gb3V0cHV0VHlwZSA9IExpc3RUeXBlLmdldEluc3RhbmNlKGlucHV0VHlwZS5nZXRWYWx1ZXNUeXBlKCksIGZhbHNlKTsKKworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKG5hbWUsIG91dHB1dFR5cGUsIGlucHV0VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gcGFyYW1ldGVycy5nZXQoMCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgTWFwPEssIFY+IG1hcCA9IGlucHV0VHlwZS5jb21wb3NlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBMaXN0PFY+IHZhbHVlcyA9IEltbXV0YWJsZUxpc3QuY29weU9mKG1hcC52YWx1ZXMoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dFR5cGUuZGVjb21wb3NlKHZhbHVlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5hdGl2ZSBzY2FsYXIgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSAgICAgIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBpbnB1dFR5cGUgdGhlIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gYXJndW1lbnQgYWNjZXB0ZWQgYnkgdGhlIHJldHVybmVkIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIDxUPiAgICAgICB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGNvbGxlY3Rpb24gYXJndW1lbnQKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24gcGFzc2VkIGFzIGFyZ3VtZW50LCBhcyBhIDMyLWJpdCBpbnRlZ2VyCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IE5hdGl2ZVNjYWxhckZ1bmN0aW9uIG1ha2VDb2xsZWN0aW9uQ291bnRGdW5jdGlvbihTdHJpbmcgbmFtZSwgQ29sbGVjdGlvblR5cGU8VD4gaW5wdXRUeXBlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVTY2FsYXJGdW5jdGlvbihuYW1lLCBJbnQzMlR5cGUuaW5zdGFuY2UsIGlucHV0VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gcGFyYW1ldGVycy5nZXQoMCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgaW50IHNpemUgPSBpbnB1dFR5cGUuc2l6ZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2Uoc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5hdGl2ZSBzY2FsYXIgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIG1pbiBlbGVtZW50IGluIGEgY29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lICAgICAgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIGlucHV0VHlwZSB0aGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiBhcmd1bWVudCBhY2NlcHRlZCBieSB0aGUgcmV0dXJuZWQgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgY29sbGVjdGlvbiBhcmd1bWVudAorICAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIG1pbiBlbGVtZW50IGluIHRoZSBjb2xsZWN0aW9uIHBhc3NlZCBhcyBhcmd1bWVudAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxUPiBOYXRpdmVTY2FsYXJGdW5jdGlvbiBtYWtlQ29sbGVjdGlvbk1pbkZ1bmN0aW9uKFN0cmluZyBuYW1lLCBDb2xsZWN0aW9uVHlwZTxUPiBpbnB1dFR5cGUpCisgICAgeworICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gZWxlbWVudHNUeXBlID0gZWxlbWVudHNUeXBlKGlucHV0VHlwZSk7CisgICAgICAgIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIGZ1bmN0aW9uID0gZWxlbWVudHNUeXBlLmlzQ291bnRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBZ2dyZWdhdGVGY3RzLm1pbkZ1bmN0aW9uRm9yQ291bnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQWdncmVnYXRlRmN0cy5tYWtlTWluRnVuY3Rpb24oZWxlbWVudHNUeXBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uQWdncmVnYXRpb25GdW5jdGlvbihuYW1lLCBpbnB1dFR5cGUsIGZ1bmN0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmF0aXZlIHNjYWxhciBmdW5jdGlvbiBmb3IgZ2V0dGluZyB0aGUgbWF4IGVsZW1lbnQgaW4gYSBjb2xsZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgICAgICB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gaW5wdXRUeXBlIHRoZSB0eXBlIG9mIHRoZSBjb2xsZWN0aW9uIGFyZ3VtZW50IGFjY2VwdGVkIGJ5IHRoZSByZXR1cm5lZCBmdW5jdGlvbgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBjb2xsZWN0aW9uIGFyZ3VtZW50CisgICAgICogQHJldHVybiBhIGZ1bmN0aW9uIHJldHVybmluZyB0aGUgbWF4IGVsZW1lbnQgaW4gdGhlIGNvbGxlY3Rpb24gcGFzc2VkIGFzIGFyZ3VtZW50CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IE5hdGl2ZVNjYWxhckZ1bmN0aW9uIG1ha2VDb2xsZWN0aW9uTWF4RnVuY3Rpb24oU3RyaW5nIG5hbWUsIENvbGxlY3Rpb25UeXBlPFQ+IGlucHV0VHlwZSkKKyAgICB7CisgICAgICAgIEFic3RyYWN0VHlwZTw/PiBlbGVtZW50c1R5cGUgPSBlbGVtZW50c1R5cGUoaW5wdXRUeXBlKTsKKyAgICAgICAgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gZnVuY3Rpb24gPSBlbGVtZW50c1R5cGUuaXNDb3VudGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFnZ3JlZ2F0ZUZjdHMubWF4RnVuY3Rpb25Gb3JDb3VudGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBZ2dyZWdhdGVGY3RzLm1ha2VNYXhGdW5jdGlvbihlbGVtZW50c1R5cGUpOworICAgICAgICByZXR1cm4gbmV3IENvbGxlY3Rpb25BZ2dyZWdhdGlvbkZ1bmN0aW9uKG5hbWUsIGlucHV0VHlwZSwgZnVuY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuYXRpdmUgc2NhbGFyIGZ1bmN0aW9uIGZvciBnZXR0aW5nIHRoZSBzdW0gb2YgdGhlIGVsZW1lbnRzIGluIGEgbnVtZXJpYyBjb2xsZWN0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uIGlzIG9mIHRoZSBzYW1lIHR5cGUgYXMgZWxlbWVudHMgb2YgaXRzIGlucHV0IGNvbGxlY3Rpb24sIHNvIHRoZXJlIGlzIGEgcmlzaworICAgICAqIG9mIG92ZXJmbG93IGlmIHRoZSBzdW0gb2YgdGhlIHZhbHVlcyBleGNlZWRzIHRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIHR5cGUgY2FuIHJlcHJlc2VudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lICAgICAgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIGlucHV0VHlwZSB0aGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiBhcmd1bWVudCBhY2NlcHRlZCBieSB0aGUgcmV0dXJuZWQgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgY29sbGVjdGlvbiBhcmd1bWVudAorICAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIHN1bSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24gcGFzc2VkIGFzIGFyZ3VtZW50CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IE5hdGl2ZVNjYWxhckZ1bmN0aW9uIG1ha2VDb2xsZWN0aW9uU3VtRnVuY3Rpb24oU3RyaW5nIG5hbWUsIENvbGxlY3Rpb25UeXBlPFQ+IGlucHV0VHlwZSkKKyAgICB7CisgICAgICAgIENRTDNUeXBlIGVsZW1lbnRzVHlwZSA9IGVsZW1lbnRzVHlwZShpbnB1dFR5cGUpLmFzQ1FMM1R5cGUoKTsKKyAgICAgICAgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb24gZnVuY3Rpb24gPSBnZXRTdW1GdW5jdGlvbigoQ1FMM1R5cGUuTmF0aXZlKSBlbGVtZW50c1R5cGUpOworICAgICAgICByZXR1cm4gbmV3IENvbGxlY3Rpb25BZ2dyZWdhdGlvbkZ1bmN0aW9uKG5hbWUsIGlucHV0VHlwZSwgZnVuY3Rpb24pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIGdldFN1bUZ1bmN0aW9uKENRTDNUeXBlLk5hdGl2ZSB0eXBlKQorICAgIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFRJTllJTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZUZjdHMuc3VtRnVuY3Rpb25Gb3JCeXRlOworICAgICAgICAgICAgY2FzZSBTTUFMTElOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQWdncmVnYXRlRmN0cy5zdW1GdW5jdGlvbkZvclNob3J0OworICAgICAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZUZjdHMuc3VtRnVuY3Rpb25Gb3JJbnQzMjsKKyAgICAgICAgICAgIGNhc2UgQklHSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBBZ2dyZWdhdGVGY3RzLnN1bUZ1bmN0aW9uRm9yTG9uZzsKKyAgICAgICAgICAgIGNhc2UgRkxPQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZUZjdHMuc3VtRnVuY3Rpb25Gb3JGbG9hdDsKKyAgICAgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBBZ2dyZWdhdGVGY3RzLnN1bUZ1bmN0aW9uRm9yRG91YmxlOworICAgICAgICAgICAgY2FzZSBWQVJJTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZUZjdHMuc3VtRnVuY3Rpb25Gb3JWYXJpbnQ7CisgICAgICAgICAgICBjYXNlIERFQ0lNQUw6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZUZjdHMuc3VtRnVuY3Rpb25Gb3JEZWNpbWFsOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkV4cGVjdGVkIG51bWVyaWMgY29sbGVjdGlvbiBidXQgZm91bmQgIiArIHR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5hdGl2ZSBzY2FsYXIgZnVuY3Rpb24gZm9yIGdldHRpbmcgdGhlIGF2ZXJhZ2Ugb2YgdGhlIGVsZW1lbnRzIGluIGEgbnVtZXJpYyBjb2xsZWN0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgYXZlcmFnZSBvZiBhbiBlbXB0eSBjb2xsZWN0aW9uIHJldHVybnMgemVyby4gVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbiBpcyBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoZQorICAgICAqIGVsZW1lbnRzIG9mIGl0cyBpbnB1dCBjb2xsZWN0aW9uLCBzbyBpZiB0aG9zZSBkb24ndCBoYXZlIGEgZGVjaW1hbCBwYXJ0IHRoZW4gdGhlIHJldHVybmVkIGF2ZXJhZ2Ugd29uJ3QgaGF2ZSBhCisgICAgICogZGVjaW1hbCBwYXJ0IGVpdGhlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lICAgICAgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIGlucHV0VHlwZSB0aGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiBhcmd1bWVudCBhY2NlcHRlZCBieSB0aGUgcmV0dXJuZWQgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgY29sbGVjdGlvbiBhcmd1bWVudAorICAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiByZXR1cm5pbmcgdGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xsZWN0aW9uIHBhc3NlZCBhcyBhcmd1bWVudAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxUPiBOYXRpdmVTY2FsYXJGdW5jdGlvbiBtYWtlQ29sbGVjdGlvbkF2Z0Z1bmN0aW9uKFN0cmluZyBuYW1lLCBDb2xsZWN0aW9uVHlwZTxUPiBpbnB1dFR5cGUpCisgICAgeworICAgICAgICBDUUwzVHlwZSBlbGVtZW50c1R5cGUgPSBlbGVtZW50c1R5cGUoaW5wdXRUeXBlKS5hc0NRTDNUeXBlKCk7CisgICAgICAgIE5hdGl2ZUFnZ3JlZ2F0ZUZ1bmN0aW9uIGZ1bmN0aW9uID0gZ2V0QXZnRnVuY3Rpb24oKENRTDNUeXBlLk5hdGl2ZSkgZWxlbWVudHNUeXBlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uQWdncmVnYXRpb25GdW5jdGlvbihuYW1lLCBpbnB1dFR5cGUsIGZ1bmN0aW9uKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBnZXRBdmdGdW5jdGlvbihDUUwzVHlwZS5OYXRpdmUgdHlwZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUSU5ZSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBBZ2dyZWdhdGVGY3RzLmF2Z0Z1bmN0aW9uRm9yQnl0ZTsKKyAgICAgICAgICAgIGNhc2UgU01BTExJTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEFnZ3JlZ2F0ZUZjdHMuYXZnRnVuY3Rpb25Gb3JTaG9ydDsKKyAgICAgICAgICAgIGNhc2UgSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBBZ2dyZWdhdGVGY3RzLmF2Z0Z1bmN0aW9uRm9ySW50MzI7CisgICAgICAgICAgICBjYXNlIEJJR0lOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gQWdncmVnYXRlRmN0cy5hdmdGdW5jdGlvbkZvckxvbmc7CisgICAgICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgICAgICAgIHJldHVybiBBZ2dyZWdhdGVGY3RzLmF2Z0Z1bmN0aW9uRm9yRmxvYXQ7CisgICAgICAgICAgICBjYXNlIERPVUJMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gQWdncmVnYXRlRmN0cy5hdmdGdW5jdGlvbkZvckRvdWJsZTsKKyAgICAgICAgICAgIGNhc2UgVkFSSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBBZ2dyZWdhdGVGY3RzLmF2Z0Z1bmN0aW9uRm9yVmFyaW50OworICAgICAgICAgICAgY2FzZSBERUNJTUFMOgorICAgICAgICAgICAgICAgIHJldHVybiBBZ2dyZWdhdGVGY3RzLmF2Z0Z1bmN0aW9uRm9yRGVjaW1hbDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJFeHBlY3RlZCBudW1lcmljIGNvbGxlY3Rpb24gYnV0IGZvdW5kICIgKyB0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEFic3RyYWN0VHlwZTw/PiBlbGVtZW50c1R5cGUoQ29sbGVjdGlvblR5cGU8Pz4gdHlwZSkKKyAgICB7CisgICAgICAgIGlmICh0eXBlLmtpbmQgPT0gQ29sbGVjdGlvblR5cGUuS2luZC5MSVNUKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKChMaXN0VHlwZTw/PikgdHlwZSkuZ2V0RWxlbWVudHNUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZS5raW5kID09IENvbGxlY3Rpb25UeXBlLktpbmQuU0VUKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKChTZXRUeXBlPD8+KSB0eXBlKS5nZXRFbGVtZW50c1R5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiQ2Fubm90IGdldCB0aGUgZWxlbWVudCB0eXBlIG9mOiAiICsgdHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB7QGxpbmsgTmF0aXZlU2NhbGFyRnVuY3Rpb259IGZvciBhZ2dyZWdhdGluZyB0aGUgZWxlbWVudHMgb2YgYSBjb2xsZWN0aW9uIGFjY29yZGluZyB0byB0aGUgYWdncmVnYXRvciBvZgorICAgICAqIGEgY2VydGFpbiB7QGxpbmsgTmF0aXZlQWdncmVnYXRlRnVuY3Rpb259LgorICAgICAqIDxwPgorICAgICAqIHtAbGluayBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbn0gaXMgbWVhbnQgdG8gYmUgdXNlZCBmb3IgYWdncmVnYXRpbmcgdmFsdWVzIGFjY3Jvc3Mgcm93cywgYnV0IGhlcmUgd2UgdXNlIHRoYXQKKyAgICAgKiBmdW5jdGlvbiB0byBhZ2dyZWdhdGUgdGhlIGVsZW1lbnRzIG9mIGEgc2luZ2xlIGNvbGxlY3Rpb24gdmFsdWUuIFRoYXQgd2F5LCBmdW5jdGlvbnMgc3VjaCBhcyB7QGNvZGUgYXZnfSBhbmQKKyAgICAgKiB7QGNvZGUgY29sbGVjdGlvbl9hdmd9IHNob3VsZCBoYXZlIHRoZSBzYW1lIGJlaGF2aW91ciB3aGVuIGFwcGxpZWQgdG8gcm93IGNvbHVtbnMgb3IgY29sbGVjdGlvbiBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb2xsZWN0aW9uQWdncmVnYXRpb25GdW5jdGlvbiBleHRlbmRzIE5hdGl2ZVNjYWxhckZ1bmN0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25UeXBlPD8+IGlucHV0VHlwZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBhZ2dyZWdhdGVGdW5jdGlvbjsKKworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbkFnZ3JlZ2F0aW9uRnVuY3Rpb24oU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uVHlwZTw/PiBpbnB1dFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVBZ2dyZWdhdGVGdW5jdGlvbiBhZ2dyZWdhdGVGdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIobmFtZSwgYWdncmVnYXRlRnVuY3Rpb24ucmV0dXJuVHlwZSwgaW5wdXRUeXBlKTsKKyAgICAgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gaW5wdXRUeXBlOworICAgICAgICAgICAgdGhpcy5hZ2dyZWdhdGVGdW5jdGlvbiA9IGFnZ3JlZ2F0ZUZ1bmN0aW9uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IHBhcmFtZXRlcnMuZ2V0KDApOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIEFnZ3JlZ2F0ZUZ1bmN0aW9uLkFnZ3JlZ2F0ZSBhZ2dyZWdhdGUgPSBhZ2dyZWdhdGVGdW5jdGlvbi5uZXdBZ2dyZWdhdGUoKTsKKyAgICAgICAgICAgIGlucHV0VHlwZS5mb3JFYWNoKHZhbHVlLCBlbGVtZW50IC0+IGFnZ3JlZ2F0ZS5hZGRJbnB1dCh2ZXJzaW9uLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGVsZW1lbnQpKSk7CisgICAgICAgICAgICByZXR1cm4gYWdncmVnYXRlLmNvbXB1dGUodmVyc2lvbik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9Gcm9tSnNvbkZjdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvRnJvbUpzb25GY3QuamF2YQppbmRleCAwMWE2ZTIwLi4zNGE3Nzk5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9Gcm9tSnNvbkZjdC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Zyb21Kc29uRmN0LmphdmEKQEAgLTIyLDM5ICsyMiw0MSBAQAogaW1wb3J0IGphdmEudXRpbC4qOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Kc29uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5T3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5GdW5jdGlvbkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CiAKIHB1YmxpYyBjbGFzcyBGcm9tSnNvbkZjdCBleHRlbmRzIE5hdGl2ZVNjYWxhckZ1bmN0aW9uCiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBGdW5jdGlvbk5hbWUgTkFNRSA9IEZ1bmN0aW9uTmFtZS5uYXRpdmVGdW5jdGlvbigiZnJvbWpzb24iKTsKLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxBYnN0cmFjdFR5cGU8Pz4sIEZyb21Kc29uRmN0PiBpbnN0YW5jZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwogCi0gICAgcHVibGljIHN0YXRpYyBGcm9tSnNvbkZjdCBnZXRJbnN0YW5jZShBYnN0cmFjdFR5cGU8Pz4gcmV0dXJuVHlwZSkKKyAgICBwdWJsaWMgc3RhdGljIEZyb21Kc29uRmN0IGdldEluc3RhbmNlKEZ1bmN0aW9uTmFtZSBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gcmV0dXJuVHlwZSkKICAgICB7CiAgICAgICAgIEZyb21Kc29uRmN0IGZ1bmMgPSBpbnN0YW5jZXMuZ2V0KHJldHVyblR5cGUpOwogICAgICAgICBpZiAoZnVuYyA9PSBudWxsKQogICAgICAgICB7Ci0gICAgICAgICAgICBmdW5jID0gbmV3IEZyb21Kc29uRmN0KHJldHVyblR5cGUpOworICAgICAgICAgICAgZnVuYyA9IG5ldyBGcm9tSnNvbkZjdChuYW1lLCByZXR1cm5UeXBlKTsKICAgICAgICAgICAgIGluc3RhbmNlcy5wdXQocmV0dXJuVHlwZSwgZnVuYyk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZ1bmM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBGcm9tSnNvbkZjdChBYnN0cmFjdFR5cGU8Pz4gcmV0dXJuVHlwZSkKKyAgICBwcml2YXRlIEZyb21Kc29uRmN0KEZ1bmN0aW9uTmFtZSBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gcmV0dXJuVHlwZSkKICAgICB7Ci0gICAgICAgIHN1cGVyKCJmcm9tanNvbiIsIHJldHVyblR5cGUsIFVURjhUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgc3VwZXIobmFtZS5uYW1lLCByZXR1cm5UeXBlLCBVVEY4VHlwZS5pbnN0YW5jZSk7CiAgICAgfQogCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCiAgICAgewotICAgICAgICBhc3NlcnQgcGFyYW1ldGVycy5zaXplKCkgPT0gMSA6ICJVbmV4cGVjdGVkbHkgZ290ICIgKyBwYXJhbWV0ZXJzLnNpemUoKSArICIgYXJndW1lbnRzIGZvciBmcm9tSnNvbigpIjsKKyAgICAgICAgYXNzZXJ0IHBhcmFtZXRlcnMuc2l6ZSgpID09IDEgOiBmb3JtYXQoIlVuZXhwZWN0ZWRseSBnb3QgJWQgYXJndW1lbnRzIGZvciAlcygpIiwgcGFyYW1ldGVycy5zaXplKCksIG5hbWUubmFtZSk7CiAgICAgICAgIEJ5dGVCdWZmZXIgYXJndW1lbnQgPSBwYXJhbWV0ZXJzLmdldCgwKTsKICAgICAgICAgaWYgKGFyZ3VtZW50ID09IG51bGwpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTYyLDE4ICs2NCw0MyBAQAogICAgICAgICBTdHJpbmcganNvbkFyZyA9IFVURjhUeXBlLmluc3RhbmNlLmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZShhcmd1bWVudCk7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gSnNvbi5KU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKGpzb25BcmcsIE9iamVjdC5jbGFzcyk7CisgICAgICAgICAgICBPYmplY3Qgb2JqZWN0ID0gSnNvblV0aWxzLkpTT05fT0JKRUNUX01BUFBFUi5yZWFkVmFsdWUoanNvbkFyZywgT2JqZWN0LmNsYXNzKTsKICAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIHJldHVybiByZXR1cm5UeXBlLmZyb21KU09OT2JqZWN0KG9iamVjdCkuYmluZEFuZEdldChRdWVyeU9wdGlvbnMuZm9yUHJvdG9jb2xWZXJzaW9uKHByb3RvY29sVmVyc2lvbikpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleGMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IEZ1bmN0aW9uRXhlY3V0aW9uRXhjZXB0aW9uLmNyZWF0ZShOQU1FLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJ0ZXh0IiksIFN0cmluZy5mb3JtYXQoIkNvdWxkIG5vdCBkZWNvZGUgSlNPTiBzdHJpbmcgJyVzJzogJXMiLCBqc29uQXJnLCBleGMudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgdGhyb3cgRnVuY3Rpb25FeGVjdXRpb25FeGNlcHRpb24uY3JlYXRlKG5hbWUoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgidGV4dCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiQ291bGQgbm90IGRlY29kZSBKU09OIHN0cmluZyAnJXMnOiAlcyIsIGpzb25BcmcsIGV4YykpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChNYXJzaGFsRXhjZXB0aW9uIGV4YykKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgRnVuY3Rpb25FeGVjdXRpb25FeGNlcHRpb24uY3JlYXRlKHRoaXMsIGV4Yyk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRnVuY3Rpb25zVG8oTmF0aXZlRnVuY3Rpb25zIGZ1bmN0aW9ucykKKyAgICB7CisgICAgICAgIGZ1bmN0aW9ucy5hZGQobmV3IEZhY3RvcnkoImZyb21fanNvbiIpKTsKKyAgICAgICAgZnVuY3Rpb25zLmFkZChuZXcgRmFjdG9yeSgiZnJvbWpzb24iKSk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBGdW5jdGlvbkZhY3RvcnkKKyAgICB7CisgICAgICAgIHByaXZhdGUgRmFjdG9yeShTdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIobmFtZSwgRnVuY3Rpb25QYXJhbWV0ZXIuZml4ZWQoQ1FMM1R5cGUuTmF0aXZlLlRFWFQpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgTmF0aXZlRnVuY3Rpb24gZG9HZXRPckNyZWF0ZUZ1bmN0aW9uKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcywgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJlY2VpdmVyVHlwZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihmb3JtYXQoIiVzKCkgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2Ugb2YgYSBTRUxFQ1Qgc3RhdGVtZW50IiwgbmFtZS5uYW1lKSk7CisKKyAgICAgICAgICAgIHJldHVybiBGcm9tSnNvbkZjdC5nZXRJbnN0YW5jZShuYW1lLCByZWNlaXZlclR5cGUpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvRnVuY3Rpb25DYWxsLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9GdW5jdGlvbkNhbGwuamF2YQppbmRleCA0ZmIxYmEzLi4zMzY5NjU3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9GdW5jdGlvbkNhbGwuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9GdW5jdGlvbkNhbGwuamF2YQpAQCAtMTA3LDE0ICsxMDcsMTQgQEAKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICBpZiAoZnVuLnJldHVyblR5cGUoKS5pc0NvbGxlY3Rpb24oKSkKICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICgoKENvbGxlY3Rpb25UeXBlKSBmdW4ucmV0dXJuVHlwZSgpKS5raW5kKQorICAgICAgICAgICAgc3dpdGNoICgoKENvbGxlY3Rpb25UeXBlPD8+KSBmdW4ucmV0dXJuVHlwZSgpKS5raW5kKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNhc2UgTElTVDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExpc3RzLlZhbHVlLmZyb21TZXJpYWxpemVkKHJlc3VsdCwgKExpc3RUeXBlKSBmdW4ucmV0dXJuVHlwZSgpLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExpc3RzLlZhbHVlLmZyb21TZXJpYWxpemVkKHJlc3VsdCwgKExpc3RUeXBlPD8+KSBmdW4ucmV0dXJuVHlwZSgpKTsKICAgICAgICAgICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNldHMuVmFsdWUuZnJvbVNlcmlhbGl6ZWQocmVzdWx0LCAoU2V0VHlwZSkgZnVuLnJldHVyblR5cGUoKSwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTZXRzLlZhbHVlLmZyb21TZXJpYWxpemVkKHJlc3VsdCwgKFNldFR5cGU8Pz4pIGZ1bi5yZXR1cm5UeXBlKCkpOwogICAgICAgICAgICAgICAgIGNhc2UgTUFQOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWFwcy5WYWx1ZS5mcm9tU2VyaWFsaXplZChyZXN1bHQsIChNYXBUeXBlKSBmdW4ucmV0dXJuVHlwZSgpLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hcHMuVmFsdWUuZnJvbVNlcmlhbGl6ZWQocmVzdWx0LCAoTWFwVHlwZTw/LCA/PikgZnVuLnJldHVyblR5cGUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoZnVuLnJldHVyblR5cGUoKS5pc1VEVCgpKQpAQCAtMTI3LDcgKzEyNyw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJhdyBleHRlbmRzIFRlcm0uUmF3CiAgICAgewotICAgICAgICBwcml2YXRlIEZ1bmN0aW9uTmFtZSBuYW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIEZ1bmN0aW9uTmFtZSBuYW1lOwogICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8VGVybS5SYXc+IHRlcm1zOwogCiAgICAgICAgIHB1YmxpYyBSYXcoRnVuY3Rpb25OYW1lIG5hbWUsIExpc3Q8VGVybS5SYXc+IHRlcm1zKQpAQCAtMjAyLDEwICsyMDIsMTEgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBGdW5jdGlvbiBmdW4gPSBGdW5jdGlvblJlc29sdmVyLmdldChrZXlzcGFjZSwgbmFtZSwgdGVybXMsIHJlY2VpdmVyLmtzTmFtZSwgcmVjZWl2ZXIuY2ZOYW1lLCByZWNlaXZlci50eXBlKTsKIAotICAgICAgICAgICAgICAgIC8vIEJlY2F1c2UgZnJvbUpzb24oKSBjYW4gcmV0dXJuIHdoYXRldmVyIHR5cGUgdGhlIHJlY2VpdmVyIGlzLCB3ZSdsbCBhbHdheXMgZ2V0IEVYQUNUX01BVENILiAgVG8KLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgcG90ZW50aWFsbHkgYW1iaWd1b3VzIGZ1bmN0aW9uIGNhbGxzIHdpdGggZnJvbUpzb24oKSBhcyBhbiBhcmd1bWVudCwgYWx3YXlzIHJldHVybgotICAgICAgICAgICAgICAgIC8vIFdFQUtMWV9BU1NJR05BQkxFIHRvIGZvcmNlIHRoZSB1c2VyIHRvIHR5cGVjYXN0IGlmIG5lY2Vzc2FyeQotICAgICAgICAgICAgICAgIGlmIChmdW4gIT0gbnVsbCAmJiBmdW4ubmFtZSgpLmVxdWFscyhGcm9tSnNvbkZjdC5OQU1FKSkKKyAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIHRoZSByZXR1cm4gdHlwZSBvZiBmdW5jdGlvbnMgYnVpbHQgYnkgZmFjdG9yaWVzIGlzIG5vdCBmaXhlZCBidXQgZGVwZW5kaW5nIG9uIHRoZSB0eXBlcyBvZgorICAgICAgICAgICAgICAgIC8vIHRoZWlyIGFyZ3VtZW50cywgd2UnbGwgYWx3YXlzIGdldCBFWEFDVF9NQVRDSC4gIFRvIGhhbmRsZSBwb3RlbnRpYWxseSBhbWJpZ3VvdXMgZnVuY3Rpb24gY2FsbHMgd2l0aAorICAgICAgICAgICAgICAgIC8vIGR5bmFtaWNhbGx5IGJ1aWx0IGZ1bmN0aW9ucyBhcyBhbiBhcmd1bWVudCwgYWx3YXlzIHJldHVybiBXRUFLTFlfQVNTSUdOQUJMRSB0byBmb3JjZSB0aGUgdXNlciB0bworICAgICAgICAgICAgICAgIC8vIHR5cGVjYXN0IGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIGlmIChmdW4gIT0gbnVsbCAmJiBOYXRpdmVGdW5jdGlvbnMuaW5zdGFuY2UuaGFzRmFjdG9yeShmdW4ubmFtZSgpKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRlc3RSZXN1bHQuV0VBS0xZX0FTU0lHTkFCTEU7CiAKICAgICAgICAgICAgICAgICBpZiAoZnVuICE9IG51bGwgJiYgcmVjZWl2ZXIudHlwZS51ZGZUeXBlKCkuZXF1YWxzKGZ1bi5yZXR1cm5UeXBlKCkpKQpAQCAtMjIxLDE0ICsyMjIsMTggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldEV4YWN0VHlwZUlmS25vd24oU3RyaW5nIGtleXNwYWNlKQogICAgICAgICB7Ci0gICAgICAgICAgICAvLyBXZSBjb3VsZCBpbXBsZW1lbnQgdGhpcywgYnV0IHRoZSBtZXRob2QgaXMgb25seSB1c2VkIGluIHNlbGVjdGlvbiBjbGF1c2UsIHdoZXJlIEZ1bmN0aW9uQ2FsbCBpcyBub3QgdXNlZCAKLSAgICAgICAgICAgIC8vIHdlIHVzZSBhIFNlbGVjdGFibGUuV2l0aEZ1bmN0aW9uIGluc3RlYWQpLiBBbmQgaWYgdGhhdCBtZXRob2QgaXMgbGF0ZXIgdXNlZCBpbiBvdGhlciBwbGFjZXMsIGJldHRlciB0bwotICAgICAgICAgICAgLy8gbGV0IHRoYXQgZnV0dXJlIHBhdGNoIG1ha2Ugc3VyZSB0aGlzIGNhbiBiZSBpbXBsZW1lbnRlZCBwcm9wZXJseSAobm90ZSBpbiBwYXJ0aWN1bGFyIHdlIGRvbid0IGhhdmUgYWNjZXNzCi0gICAgICAgICAgICAvLyB0byB0aGUgcmVjZWl2ZXIgdHlwZSwgd2hpY2ggRnVuY3Rpb25SZXNvbHZlci5nZXQoKSB0YWtlcykgcmF0aGVyIHRoYW4gcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IG1heQotICAgICAgICAgICAgLy8gbm90IHdvcmsgaW4gYWxsIGNhc2VzLgotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGdW5jdGlvbiBmdW4gPSBGdW5jdGlvblJlc29sdmVyLmdldChrZXlzcGFjZSwgbmFtZSwgdGVybXMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgIHJldHVybiBmdW4gPT0gbnVsbCA/IG51bGwgOiBmdW4ucmV0dXJuVHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvRnVuY3Rpb25GYWN0b3J5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9GdW5jdGlvbkZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmRiOWZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvRnVuY3Rpb25GYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQXNzaWdubWVudFRlc3RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKKworLyoqCisgKiBDbGFzcyBmb3IgZHluYW1pY2FsbHkgYnVpbGRpbmcgZGlmZmVyZW50IG92ZXJsb2FkcyBvZiBhIENRTCB7QGxpbmsgRnVuY3Rpb259IGFjY29yZGluZyB0byBzcGVjaWZpYyBmdW5jdGlvbiBjYWxscy4KKyAqIDxwPgorICogRm9yIGV4YW1wbGUsIHRoZSBmYWN0b3J5IGZvciB0aGUge0Bjb2RlIG1heH0gZnVuY3Rpb24gd2lsbCByZXR1cm4gYSB7QGNvZGUgKHRleHQpIC0+IHRleHR9IGZ1bmN0aW9uIGlmIGl0J3MgY2FsbGVkCisgKiB3aXRoIGFuIHtAY29kZSB0ZXh0fSBhcmd1bWVudCwgbGlrZSBpbiB7QGNvZGUgbWF4KCdhYmMnKX0uIEl0IGhvd2V2ZXIgd2lsbCByZXR1cm4gYSB7QGNvZGUgKGxpc3Q8aW50PikgLT4gbGlzdDxpbnQ+fQorICogZnVuY3Rpb24gaWYgaXQncyBjYWxsZWQgd2l0aCB7QGNvZGUgbWF4KFsxLDIsM10pfSwgZXRjLgorICogPHA+CisgKiBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgdG8gY3JlYXRlIGZ1bmN0aW9ucyB0aGF0IHJlcXVpcmUgdG9vIG1hbnkgb3ZlcmxvYWRzIHRvIGhhdmUgdGhlbSBwcmUtY3JlYXRlZCBpbiBtZW1vcnkuIE5vdGUKKyAqIHRoYXQgaW4gdGhlIGNhc2Ugb2YgZnVuY3Rpb25zIGFjY2VwdGluZyBjb2xsZWN0aW9ucywgdHVwbGVzIG9yIFVEVHMgdGhlIG51bWJlciBvZiBvdmVybG9hZHMgaXMgcG90ZW50aWFsbHkgaW5maW5pdGUuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBGdW5jdGlvbkZhY3RvcnkKK3sKKyAgICAvKiogVGhlIG5hbWUgb2YgdGhlIGJ1aWx0IGZ1bmN0aW9ucy4gKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgRnVuY3Rpb25OYW1lIG5hbWU7CisKKyAgICAvKiogVGhlIGFjY2VwdGVkIHBhcmFtZXRlcnMuICovCisgICAgcHJvdGVjdGVkIGZpbmFsIExpc3Q8RnVuY3Rpb25QYXJhbWV0ZXI+IHBhcmFtZXRlcnM7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBudW1QYXJhbWV0ZXJzOworICAgIHByaXZhdGUgZmluYWwgaW50IG51bU1hbmRhdG9yeVBhcmFtZXRlcnM7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgYnVpbHQgZnVuY3Rpb25zCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgdGhlIGFjY2VwdGVkIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgRnVuY3Rpb25GYWN0b3J5KFN0cmluZyBuYW1lLCBGdW5jdGlvblBhcmFtZXRlci4uLiBwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5uYW1lID0gRnVuY3Rpb25OYW1lLm5hdGl2ZUZ1bmN0aW9uKG5hbWUpOworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBBcnJheXMuYXNMaXN0KHBhcmFtZXRlcnMpOworICAgICAgICB0aGlzLm51bVBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzLmxlbmd0aDsKKyAgICAgICAgdGhpcy5udW1NYW5kYXRvcnlQYXJhbWV0ZXJzID0gKGludCkgdGhpcy5wYXJhbWV0ZXJzLnN0cmVhbSgpLmZpbHRlcihwIC0+ICFwLmlzT3B0aW9uYWwoKSkuY291bnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRnVuY3Rpb25OYW1lIG5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHdpdGggYSBzaWduYXR1cmUgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzIHRoZSBhcmd1bWVudHMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwgZm9yIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBnb2luZyB0byBiZSBidWlsdAorICAgICAqIEBwYXJhbSByZWNlaXZlclR5cGUgdGhlIGV4cGVjdGVkIHJldHVybiB0eXBlIG9mIHRoZSBmdW5jdGlvbiBjYWxsIGZvciB3aGljaCB0aGUgZnVuY3Rpb24gaXMgZ29pbmcgdG8gYmUgYnVpbHQKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJLZXlzcGFjZSB0aGUgbmFtZSBvZiB0aGUgcmVjZXZpZXIga2V5c3BhY2UKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJUYWJsZSB0aGUgbmFtZSBvZiB0aGUgcmVjZXZpZXIgdGFibGUKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gd2l0aCBhIHNpZ25hdHVyZSBjb21wYXRpYmxlIHdpdGggdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBjYWxsLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGZhY3RvcnkKKyAgICAgKiBjYW5ub3QgY3JlYXRlIGEgZnVuY3Rpb24gZm9yIHRoZSBzdXBwbGllZCBhcmd1bWVudHMgYnV0IHRoZXJlIG1pZ2h0IGJlIGFub3RoZXIgZmFjdG9yeSB3aXRoIHRoZSBzYW1lCisgICAgICoge0BsaW5rICNuYW1lKCl9IGFibGUgdG8gZG8gaXQuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIE5hdGl2ZUZ1bmN0aW9uIGdldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDw/IGV4dGVuZHMgQXNzaWdubWVudFRlc3RhYmxlPiBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyS2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyVGFibGUpCisgICAgeworICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cworICAgICAgICBpbnQgbnVtQXJncyA9IGFyZ3Muc2l6ZSgpOworICAgICAgICBpZiAobnVtQXJncyA8IG51bU1hbmRhdG9yeVBhcmFtZXRlcnMgfHwgbnVtQXJncyA+IG51bVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0aHJvdyBpbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHNFeGNlcHRpb24oKTsKKworICAgICAgICAvLyB0cnkgdG8gaW5mZXIgdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMKKyAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzID0gbmV3IEFycmF5TGlzdDw+KGFyZ3Muc2l6ZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NpZ25tZW50VGVzdGFibGUgYXJnID0gYXJncy5nZXQoaSk7CisgICAgICAgICAgICBGdW5jdGlvblBhcmFtZXRlciBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJzLmdldChpKTsKKyAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gcGFyYW1ldGVyLmluZmVyVHlwZShTY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUUsIGFyZywgcmVjZWl2ZXJUeXBlLCB0eXBlcyk7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJDYW5ub3QgaW5mZXIgdHlwZSBvZiBhcmd1bWVudCAlcyBpbiBjYWxsIHRvICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiAlczogdXNlIHR5cGUgY2FzdHMgdG8gZGlzYW1iaWd1YXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsIHRoaXMpKTsKKyAgICAgICAgICAgIHBhcmFtZXRlci52YWxpZGF0ZVR5cGUobmFtZSwgYXJnLCB0eXBlKTsKKyAgICAgICAgICAgIHR5cGUgPSB0eXBlLnVkZlR5cGUoKTsKKyAgICAgICAgICAgIHR5cGVzLmFkZCh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24odHlwZXMsIHJlY2VpdmVyVHlwZSk7CisgICAgfQorCisgICAgcHVibGljIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGludmFsaWROdW1iZXJPZkFyZ3VtZW50c0V4Y2VwdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKCJJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uICIgKyB0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgc2lnbmF0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ1R5cGVzIHRoZSB0eXBlcyBvZiB0aGUgZnVuY3Rpb24gYXJndW1lbnRzCisgICAgICogQHBhcmFtIHJlY2VpdmVyVHlwZSB0aGUgZXhwZWN0ZWQgcmV0dXJuIHR5cGUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICogQHJldHVybiBhIGZ1bmN0aW9uIGNvbXBhdGlibGUgd2l0aCB0aGUgc3BlY2lmaWVkIHNpZ25hdHVyZSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoaXMgY2Fubm90IGNyZWF0ZSBhIGZ1bmN0aW9uIGZvcgorICAgICAqIHRoZSBzdXBwbGllZCBhcmd1bWVudHMgYnV0IHRoZXJlIG1pZ2h0IGJlIGFub3RoZXIgZmFjdG9yeSB3aXRoIHRoZSBzYW1lIHtAbGluayAjbmFtZSgpfSBhYmxlIHRvIGRvIGl0LgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHByb3RlY3RlZCBhYnN0cmFjdCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzKCVzKSIsIG5hbWUsIHBhcmFtZXRlcnMuc3RyZWFtKCkubWFwKE9iamVjdDo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvRnVuY3Rpb25QYXJhbWV0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Z1bmN0aW9uUGFyYW1ldGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzYjBmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Z1bmN0aW9uUGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSwzMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Bc3NpZ25tZW50VGVzdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkNvbGxlY3Rpb25UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTGlzdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5NYXBUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTnVtYmVyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlNldFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Bc3NpZ25tZW50VGVzdGFibGUuVGVzdFJlc3VsdC5OT1RfQVNTSUdOQUJMRTsKKworLyoqCisgKiBHZW5lcmljLCBsb29zZSBkZWZpbml0aW9uIG9mIGEgZnVuY3Rpb24gcGFyYW1ldGVyLCBhYmxlIHRvIGluZmVyIHRoZSBzcGVjaWZpYyBkYXRhIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUKKyAqIGZ1bmN0aW9uIHNwZWNpZmljYWxseSBidWlsdCBieSBhIHtAbGluayBGdW5jdGlvbkZhY3Rvcnl9IGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gY2FsbC4KKyAqLworcHVibGljIGludGVyZmFjZSBGdW5jdGlvblBhcmFtZXRlcgoreworICAgIC8qKgorICAgICAqIFRyaWVzIHRvIGluZmVyIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBmb3IgYW4gYXJndW1lbnQgaW4gYSBjYWxsIHRvIHRoZSBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlzcGFjZSB0aGUgY3VycmVudCBrZXlzcGFjZQorICAgICAqIEBwYXJhbSBhcmcgYSBwYXJhbWV0ZXIgdmFsdWUgaW4gYSBzcGVjaWZpYyBmdW5jdGlvbiBjYWxsCisgICAgICogQHBhcmFtIHJlY2VpdmVyVHlwZSB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRoYXQgd2lsbCByZWNlaXZlIHRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmZlcnJlZCBkYXRhIHR5cGUgb2YgdGhlIHBhcmFtZXRlciwgb3Ige0BsaW5rIG51bGx9IGl0IGlzbid0IHBvc3NpYmxlIHRvIGluZmVyIGl0CisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgZGVmYXVsdCBBYnN0cmFjdFR5cGU8Pz4gaW5mZXJUeXBlKFN0cmluZyBrZXlzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzaWdubWVudFRlc3RhYmxlIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBwcmV2aW91c1R5cGVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFyZy5nZXRDb21wYXRpYmxlVHlwZUlmS25vd24oa2V5c3BhY2UpOworICAgIH0KKworICAgIHZvaWQgdmFsaWRhdGVUeXBlKEZ1bmN0aW9uTmFtZSBuYW1lLCBBc3NpZ25tZW50VGVzdGFibGUgYXJnLCBBYnN0cmFjdFR5cGU8Pz4gYXJnVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwKKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNPcHRpb25hbCgpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHdyYXBwZWQgdGhlIHdyYXBwZWQgcGFyYW1ldGVyCisgICAgICogQHJldHVybiBhIGZ1bmN0aW9uIHBhcmFtZXRlciBkZWZpbml0aW9uIHRoYXQgYWNjZXB0cyB0aGUgc3BlY2lmaWVkIHdyYXBwZWQgcGFyYW1ldGVyLCBjb25zaWRlcmluZyBpdCBvcHRpb25hbCBhcworICAgICAqIGRlZmluZWQgYnkge0BsaW5rICNpc09wdGlvbmFsKCl9LgorICAgICAqLworICAgIHN0YXRpYyBGdW5jdGlvblBhcmFtZXRlciBvcHRpb25hbChGdW5jdGlvblBhcmFtZXRlciB3cmFwcGVkKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvblBhcmFtZXRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBOdWxsYWJsZQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGluZmVyVHlwZShTdHJpbmcga2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NpZ25tZW50VGVzdGFibGUgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gcHJldmlvdXNUeXBlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5pbmZlclR5cGUoa2V5c3BhY2UsIGFyZywgcmVjZWl2ZXJUeXBlLCBwcmV2aW91c1R5cGVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVR5cGUoRnVuY3Rpb25OYW1lIG5hbWUsIEFzc2lnbm1lbnRUZXN0YWJsZSBhcmcsIEFic3RyYWN0VHlwZTw/PiBhcmdUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyYXBwZWQudmFsaWRhdGVUeXBlKG5hbWUsIGFyZywgYXJnVHlwZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICdbJyArIHdyYXBwZWQudG9TdHJpbmcoKSArICddJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gcGFyYW1ldGVyIGRlZmluaXRpb24gdGhhdCBhY2NlcHRzIHZhbHVlcyBvZiBzdHJpbmctYmFzZWQgZGF0YSB0eXBlcyAodGV4dCwgdmFyY2hhciBhbmQgYXNjaWkpCisgICAgICovCisgICAgc3RhdGljIEZ1bmN0aW9uUGFyYW1ldGVyIHN0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gZml4ZWQoQ1FMM1R5cGUuTmF0aXZlLlRFWFQsIENRTDNUeXBlLk5hdGl2ZS5WQVJDSEFSLCBDUUwzVHlwZS5OYXRpdmUuQVNDSUkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB0eXBlcyB0aGUgYWNjZXB0ZWQgZGF0YSB0eXBlcworICAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiBwYXJhbWV0ZXIgZGVmaW5pdGlvbiB0aGF0IGFjY2VwdHMgdmFsdWVzIG9mIGEgc3BlY2lmaWMgZGF0YSB0eXBlCisgICAgICovCisgICAgc3RhdGljIEZ1bmN0aW9uUGFyYW1ldGVyIGZpeGVkKENRTDNUeXBlLi4uIHR5cGVzKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHR5cGVzLmxlbmd0aCA+IDA7CisKKyAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvblBhcmFtZXRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBpbmZlclR5cGUoU3RyaW5nIGtleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzaWdubWVudFRlc3RhYmxlIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHByZXZpb3VzVHlwZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGluZmVycmVkID0gYXJnLmdldENvbXBhdGlibGVUeXBlSWZLbm93bihrZXlzcGFjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZmVycmVkICE9IG51bGwgPyBpbmZlcnJlZCA6IHR5cGVzWzBdLmdldFR5cGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVR5cGUoRnVuY3Rpb25OYW1lIG5hbWUsIEFzc2lnbm1lbnRUZXN0YWJsZSBhcmcsIEFic3RyYWN0VHlwZTw/PiBhcmdUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChBcnJheXMuc3RyZWFtKHR5cGVzKS5hbGxNYXRjaCh0IC0+IGFyZ1R5cGUudGVzdEFzc2lnbm1lbnQodC5nZXRUeXBlKCkpID09IE5PVF9BU1NJR05BQkxFKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKGZvcm1hdCgiRnVuY3Rpb24gJXMgcmVxdWlyZXMgYW4gYXJndW1lbnQgb2YgdHlwZSAlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBmb3VuZCBhcmd1bWVudCAlcyBvZiB0eXBlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCB0aGlzLCBhcmcsIGFyZ1R5cGUuYXNDUUwzVHlwZSgpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVzLmxlbmd0aCA9PSAxKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZXNbMF0udG9TdHJpbmcoKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAnWycgKyBBcnJheXMuc3RyZWFtKHR5cGVzKS5tYXAoT2JqZWN0Ojp0b1N0cmluZykuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoInwiKSkgKyAnXSc7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGluZmVyRnJvbVJlY2VpdmVyIHdoZXRoZXIgdGhlIHBhcmFtZXRlciBzaG91bGQgdHJ5IHRvIHVzZSB0aGUgZnVuY3Rpb24gcmVjZWl2ZXIgdG8gaW5mZXIgaXRzIGRhdGEgdHlwZQorICAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiBwYXJhbWV0ZXIgZGVmaW5pdGlvbiB0aGF0IGFjY2VwdHMgY29sdW1ucyBvZiBhbnkgZGF0YSB0eXBlCisgICAgICovCisgICAgc3RhdGljIEZ1bmN0aW9uUGFyYW1ldGVyIGFueVR5cGUoYm9vbGVhbiBpbmZlckZyb21SZWNlaXZlcikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25QYXJhbWV0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gaW5mZXJUeXBlKFN0cmluZyBrZXlzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2lnbm1lbnRUZXN0YWJsZSBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBwcmV2aW91c1R5cGVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gYXJnLmdldENvbXBhdGlibGVUeXBlSWZLbm93bihrZXlzcGFjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gbnVsbCAmJiBpbmZlckZyb21SZWNlaXZlciA/IHJlY2VpdmVyVHlwZSA6IHR5cGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVUeXBlKEZ1bmN0aW9uTmFtZSBuYW1lLCBBc3NpZ25tZW50VGVzdGFibGUgYXJnLCBBYnN0cmFjdFR5cGU8Pz4gYXJnVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvIGhlcmUsIGFsbCB0eXBlcyBhcmUgYWNjZXB0ZWQKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImFueSI7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIGZ1bmN0aW9uIHBhcmFtZXRlciBkZWZpbml0aW9uIHRoYXQgYWNjZXB0cyB2YWx1ZXMgd2l0aCB0aGUgc2FtZSB0eXBlIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBzdGF0aWMgRnVuY3Rpb25QYXJhbWV0ZXIgc2FtZUFzRmlyc3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvblBhcmFtZXRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBpbmZlclR5cGUoU3RyaW5nIGtleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzaWdubWVudFRlc3RhYmxlIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHByZXZpb3VzVHlwZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzVHlwZXMuZ2V0KDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlVHlwZShGdW5jdGlvbk5hbWUgbmFtZSwgQXNzaWdubWVudFRlc3RhYmxlIGFyZywgQWJzdHJhY3RUeXBlPD8+IGFyZ1R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbyBoZXJlLCBhbGwgdHlwZXMgYXJlIGFjY2VwdGVkCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJzYW1lIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gcGFyYW1ldGVyIGRlZmluaXRpb24gdGhhdCBhY2NlcHRzIHZhbHVlcyBvZiB0eXBlIHtAbGluayBDb2xsZWN0aW9uVHlwZX0sIGluZGVwZW5kZW50bHkgb2YgdGhlCisgICAgICogdHlwZXMgb2YgaXRzIGVsZW1lbnRzLgorICAgICAqLworICAgIHN0YXRpYyBGdW5jdGlvblBhcmFtZXRlciBhbnlDb2xsZWN0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25QYXJhbWV0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlVHlwZShGdW5jdGlvbk5hbWUgbmFtZSwgQXNzaWdubWVudFRlc3RhYmxlIGFyZywgQWJzdHJhY3RUeXBlPD8+IGFyZ1R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFhcmdUeXBlLmlzQ29sbGVjdGlvbigpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oZm9ybWF0KCJGdW5jdGlvbiAlcyByZXF1aXJlcyBhIGNvbGxlY3Rpb24gYXJndW1lbnQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZm91bmQgYXJndW1lbnQgJXMgb2YgdHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgYXJnLCBhcmdUeXBlLmFzQ1FMM1R5cGUoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiY29sbGVjdGlvbiI7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIGZ1bmN0aW9uIHBhcmFtZXRlciBkZWZpbml0aW9uIHRoYXQgYWNjZXB0cyB2YWx1ZXMgb2YgdHlwZSB7QGxpbmsgU2V0VHlwZX0gb3Ige0BsaW5rIExpc3RUeXBlfS4KKyAgICAgKi8KKyAgICBzdGF0aWMgRnVuY3Rpb25QYXJhbWV0ZXIgc2V0T3JMaXN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25QYXJhbWV0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlVHlwZShGdW5jdGlvbk5hbWUgbmFtZSwgQXNzaWdubWVudFRlc3RhYmxlIGFyZywgQWJzdHJhY3RUeXBlPD8+IGFyZ1R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ1R5cGUuaXNDb2xsZWN0aW9uKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uVHlwZS5LaW5kIGtpbmQgPSAoKENvbGxlY3Rpb25UeXBlPD8+KSBhcmdUeXBlKS5raW5kOworICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBDb2xsZWN0aW9uVHlwZS5LaW5kLlNFVCB8fCBraW5kID09IENvbGxlY3Rpb25UeXBlLktpbmQuTElTVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oZm9ybWF0KCJGdW5jdGlvbiAlcyByZXF1aXJlcyBhIHNldCBvciBsaXN0IGFyZ3VtZW50LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZm91bmQgYXJndW1lbnQgJXMgb2YgdHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBhcmcsIGFyZ1R5cGUuYXNDUUwzVHlwZSgpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJudW1lcmljX3NldF9vcl9saXN0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gcGFyYW1ldGVyIGRlZmluaXRpb24gdGhhdCBhY2NlcHRzIHZhbHVlcyBvZiB0eXBlIHtAbGluayBTZXRUeXBlfSBvciB7QGxpbmsgTGlzdFR5cGV9LAorICAgICAqIHByb3ZpZGVkIHRoYXQgaXRzIGVsZW1lbnRzIGFyZSBudW1lcmljLgorICAgICAqLworICAgIHN0YXRpYyBGdW5jdGlvblBhcmFtZXRlciBudW1lcmljU2V0T3JMaXN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25QYXJhbWV0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlVHlwZShGdW5jdGlvbk5hbWUgbmFtZSwgQXNzaWdubWVudFRlc3RhYmxlIGFyZywgQWJzdHJhY3RUeXBlPD8+IGFyZ1R5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGVsZW1lbnRUeXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZS5pc0NvbGxlY3Rpb24oKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25UeXBlPD8+IGNvbGxlY3Rpb25UeXBlID0gKENvbGxlY3Rpb25UeXBlPD8+KSBhcmdUeXBlOworICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvblR5cGUua2luZCA9PSBDb2xsZWN0aW9uVHlwZS5LaW5kLlNFVCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFR5cGUgPSAoKFNldFR5cGU8Pz4pIGFyZ1R5cGUpLmdldEVsZW1lbnRzVHlwZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbGxlY3Rpb25UeXBlLmtpbmQgPT0gQ29sbGVjdGlvblR5cGUuS2luZC5MSVNUKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VHlwZSA9ICgoTGlzdFR5cGU8Pz4pIGFyZ1R5cGUpLmdldEVsZW1lbnRzVHlwZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCEoZWxlbWVudFR5cGUgaW5zdGFuY2VvZiBOdW1iZXJUeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKGZvcm1hdCgiRnVuY3Rpb24gJXMgcmVxdWlyZXMgYSBudW1lcmljIHNldC9saXN0IGFyZ3VtZW50LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGZvdW5kIGFyZ3VtZW50ICVzIG9mIHR5cGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGFyZywgYXJnVHlwZS5hc0NRTDNUeXBlKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm51bWVyaWNfc2V0X29yX2xpc3QiOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiBwYXJhbWV0ZXIgZGVmaW5pdGlvbiB0aGF0IGFjY2VwdHMgdmFsdWVzIG9mIHR5cGUge0BsaW5rIE1hcFR5cGV9LCBpbmRlcGVuZGVudGx5IG9mIHRoZSB0eXBlcworICAgICAqIG9mIHRoZSBtYXAga2V5cyBhbmQgdmFsdWVzLgorICAgICAqLworICAgIHN0YXRpYyBGdW5jdGlvblBhcmFtZXRlciBhbnlNYXAoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvblBhcmFtZXRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVUeXBlKEZ1bmN0aW9uTmFtZSBuYW1lLCBBc3NpZ25tZW50VGVzdGFibGUgYXJnLCBBYnN0cmFjdFR5cGU8Pz4gYXJnVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWFyZ1R5cGUuaXNVRFQoKSAmJiAhKGFyZ1R5cGUgaW5zdGFuY2VvZiBNYXBUeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKGZvcm1hdCgiRnVuY3Rpb24gJXMgcmVxdWlyZXMgYSBtYXAgYXJndW1lbnQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZm91bmQgYXJndW1lbnQgJXMgb2YgdHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgYXJnLCBhcmdUeXBlLmFzQ1FMM1R5cGUoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAibWFwIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9GdW5jdGlvblJlc29sdmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9GdW5jdGlvblJlc29sdmVyLmphdmEKaW5kZXggNzcxN2JkYi4uODFlOTdhNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvRnVuY3Rpb25SZXNvbHZlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Z1bmN0aW9uUmVzb2x2ZXIuamF2YQpAQCAtMjAsNiArMjAsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkFic3RyYWN0TWFya2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQXNzaWdubWVudFRlc3RhYmxlOwpAQCAtMjgsNiArMzIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVXNlckZ1bmN0aW9uczsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMuam9pbmluZzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLlJlcXVlc3RWYWxpZGF0aW9ucy5pbnZhbGlkUmVxdWVzdDsKQEAgLTM4LDE1ICs0MywxMCBAQAogICAgIHsKICAgICB9CiAKLSAgICAvLyBXZSBzcGVjaWFsIGNhc2UgdGhlIHRva2VuIGZ1bmN0aW9uIGJlY2F1c2UgdGhhdCdzIHRoZSBvbmx5IGZ1bmN0aW9uIHdob3NlIGFyZ3VtZW50IHR5cGVzIGFjdHVhbGx5Ci0gICAgLy8gZGVwZW5kIG9uIHRoZSB0YWJsZSBvbiB3aGljaCB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLiBCZWNhdXNlIGl0J3MgdGhlIHNvbGUgZXhjZXB0aW9uLCBpdCdzIGVhc2llcgotICAgIC8vIHRvIGhhbmRsZSBpdCBhcyBhIHNwZWNpYWwgY2FzZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGdW5jdGlvbk5hbWUgVE9LRU5fRlVOQ1RJT05fTkFNRSA9IEZ1bmN0aW9uTmFtZS5uYXRpdmVGdW5jdGlvbigidG9rZW4iKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uU3BlY2lmaWNhdGlvbiBtYWtlQXJnU3BlYyhTdHJpbmcgcmVjZWl2ZXJLcywgU3RyaW5nIHJlY2VpdmVyQ2YsIEZ1bmN0aW9uIGZ1biwgaW50IGkpCisgICAgcHVibGljIHN0YXRpYyBDb2x1bW5TcGVjaWZpY2F0aW9uIG1ha2VBcmdTcGVjKFN0cmluZyByZWNlaXZlcktleXNwYWNlLCBTdHJpbmcgcmVjZWl2ZXJUYWJsZSwgRnVuY3Rpb24gZnVuLCBpbnQgaSkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sdW1uU3BlY2lmaWNhdGlvbihyZWNlaXZlcktzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXJDZiwKKyAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5TcGVjaWZpY2F0aW9uKHJlY2VpdmVyS2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlclRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbHVtbklkZW50aWZpZXIoImFyZyIgKyBpICsgJygnICsgZnVuLm5hbWUoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkgKyAnKScsIHRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuLmFyZ1R5cGVzKCkuZ2V0KGkpKTsKICAgICB9CkBAIC01NSwyMSArNTUsNDUgQEAKICAgICAgKiBAcGFyYW0ga2V5c3BhY2UgdGhlIGN1cnJlbnQga2V5c3BhY2UKICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KICAgICAgKiBAcGFyYW0gcHJvdmlkZWRBcmdzIHRoZSBhcmd1bWVudHMgcHJvdmlkZWQgZm9yIHRoZSBmdW5jdGlvbiBjYWxsCi0gICAgICogQHBhcmFtIHJlY2VpdmVyS3MgdGhlIHJlY2VpdmVyJ3Mga2V5c3BhY2UKLSAgICAgKiBAcGFyYW0gcmVjZWl2ZXJDZiB0aGUgcmVjZWl2ZXIncyB0YWJsZQorICAgICAqIEBwYXJhbSByZWNlaXZlcktleXNwYWNlIHRoZSByZWNlaXZlcidzIGtleXNwYWNlCisgICAgICogQHBhcmFtIHJlY2VpdmVyVGFibGUgdGhlIHJlY2VpdmVyJ3MgdGFibGUKICAgICAgKiBAcGFyYW0gcmVjZWl2ZXJUeXBlIGlmIHRoZSByZWNlaXZlciB0eXBlIGlzIGtub3duIChkdXJpbmcgaW5zZXJ0cywgZm9yIGV4YW1wbGUpLCB0aGlzIHNob3VsZCBiZSB0aGUgdHlwZSBvZgogICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIHJlY2VpdmVyCi0gICAgICogQHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgICAqLworICAgIEBOdWxsYWJsZQogICAgIHB1YmxpYyBzdGF0aWMgRnVuY3Rpb24gZ2V0KFN0cmluZyBrZXlzcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbk5hbWUgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PD8gZXh0ZW5kcyBBc3NpZ25tZW50VGVzdGFibGU+IHByb3ZpZGVkQXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJLcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJDZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJLZXlzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQogICAgIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbjxGdW5jdGlvbj4gY2FuZGlkYXRlcyA9IGNvbGxlY3RDYW5kaWRhdGVzKGtleXNwYWNlLCBuYW1lLCByZWNlaXZlcktzLCByZWNlaXZlckNmLCByZWNlaXZlclR5cGUpOworICAgICAgICByZXR1cm4gZ2V0KGtleXNwYWNlLCBuYW1lLCBwcm92aWRlZEFyZ3MsIHJlY2VpdmVyS2V5c3BhY2UsIHJlY2VpdmVyVGFibGUsIHJlY2VpdmVyVHlwZSwgVXNlckZ1bmN0aW9ucy5ub25lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBrZXlzcGFjZSB0aGUgY3VycmVudCBrZXlzcGFjZQorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBwcm92aWRlZEFyZ3MgdGhlIGFyZ3VtZW50cyBwcm92aWRlZCBmb3IgdGhlIGZ1bmN0aW9uIGNhbGwKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJLZXlzcGFjZSB0aGUgcmVjZWl2ZXIncyBrZXlzcGFjZQorICAgICAqIEBwYXJhbSByZWNlaXZlclRhYmxlIHRoZSByZWNlaXZlcidzIHRhYmxlCisgICAgICogQHBhcmFtIHJlY2VpdmVyVHlwZSBpZiB0aGUgcmVjZWl2ZXIgdHlwZSBpcyBrbm93biAoZHVyaW5nIGluc2VydHMsIGZvciBleGFtcGxlKSwgdGhpcyBzaG91bGQgYmUgdGhlIHR5cGUgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSByZWNlaXZlcgorICAgICAqIEBwYXJhbSBmdW5jdGlvbnMgYSBzZXQgb2YgdXNlciBmdW5jdGlvbnMgdGhhdCBpcyBub3QgeWV0IGF2YWlsYWJsZSBpbiB0aGUgc2NoZW1hLCB1c2VkIGR1cmluZyBzdGFydHVwIHdoZW4gdGhvc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucyBtaWdodCBub3QgYmUgeWV0IGF2YWlsYWJsZQorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBzdGF0aWMgRnVuY3Rpb24gZ2V0KFN0cmluZyBrZXlzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbk5hbWUgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PD8gZXh0ZW5kcyBBc3NpZ25tZW50VGVzdGFibGU+IHByb3ZpZGVkQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJLZXlzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJGdW5jdGlvbnMgZnVuY3Rpb25zKQorICAgIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ29sbGVjdGlvbjxGdW5jdGlvbj4gY2FuZGlkYXRlcyA9IGNvbGxlY3RDYW5kaWRhdGVzKGtleXNwYWNlLCBuYW1lLCByZWNlaXZlcktleXNwYWNlLCByZWNlaXZlclRhYmxlLCBwcm92aWRlZEFyZ3MsIHJlY2VpdmVyVHlwZSwgZnVuY3Rpb25zKTsKIAogICAgICAgICBpZiAoY2FuZGlkYXRlcy5pc0VtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTc4LDUwICsxMDIsNDggQEAKICAgICAgICAgaWYgKGNhbmRpZGF0ZXMuc2l6ZSgpID09IDEpCiAgICAgICAgIHsKICAgICAgICAgICAgIEZ1bmN0aW9uIGZ1biA9IGNhbmRpZGF0ZXMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgICAgICB2YWxpZGF0ZVR5cGVzKGtleXNwYWNlLCBmdW4sIHByb3ZpZGVkQXJncywgcmVjZWl2ZXJLcywgcmVjZWl2ZXJDZik7CisgICAgICAgICAgICB2YWxpZGF0ZVR5cGVzKGtleXNwYWNlLCBmdW4sIHByb3ZpZGVkQXJncywgcmVjZWl2ZXJLZXlzcGFjZSwgcmVjZWl2ZXJUYWJsZSk7CiAgICAgICAgICAgICByZXR1cm4gZnVuOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIHBpY2tCZXN0TWF0Y2goa2V5c3BhY2UsIG5hbWUsIHByb3ZpZGVkQXJncywgcmVjZWl2ZXJLcywgcmVjZWl2ZXJDZiwgcmVjZWl2ZXJUeXBlLCBjYW5kaWRhdGVzKTsKKyAgICAgICAgcmV0dXJuIHBpY2tCZXN0TWF0Y2goa2V5c3BhY2UsIG5hbWUsIHByb3ZpZGVkQXJncywgcmVjZWl2ZXJLZXlzcGFjZSwgcmVjZWl2ZXJUYWJsZSwgcmVjZWl2ZXJUeXBlLCBjYW5kaWRhdGVzKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPEZ1bmN0aW9uPiBjb2xsZWN0Q2FuZGlkYXRlcyhTdHJpbmcga2V5c3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyS3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyQ2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJLZXlzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PD8gZXh0ZW5kcyBBc3NpZ25tZW50VGVzdGFibGU+IHByb3ZpZGVkQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJGdW5jdGlvbnMgZnVuY3Rpb25zKQogICAgIHsKICAgICAgICAgQ29sbGVjdGlvbjxGdW5jdGlvbj4gY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCi0gICAgICAgIGlmIChuYW1lLmVxdWFsc05hdGl2ZUZ1bmN0aW9uKFRPS0VOX0ZVTkNUSU9OX05BTUUpKQotICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGQobmV3IFRva2VuRmN0KFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZU1ldGFkYXRhKHJlY2VpdmVyS3MsIHJlY2VpdmVyQ2YpKSk7Ci0KLSAgICAgICAgLy8gVGhlIHRvSnNvbigpIGZ1bmN0aW9uIGNhbiBhY2NlcHQgYW55IHR5cGUgb2YgYXJndW1lbnQsIHNvIGluc3RhbmNlcyBvZiBpdCBhcmUgbm90IHByZS1kZWNsYXJlZC4gIEluc3RlYWQsCi0gICAgICAgIC8vIHdlIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIGFzIG5lZWRlZCB3aGlsZSBoYW5kbGluZyBzZWxlY3RvcnMgKHdoaWNoIGlzIHRoZSBvbmx5IHBsYWNlIHRoYXQgdG9Kc29uKCkgaXMgc3VwcG9ydGVkLAotICAgICAgICAvLyBkdWUgdG8gbmVlZGluZyB0byBrbm93IHRoZSBhcmd1bWVudCB0eXBlcyBpbiBhZHZhbmNlKS4KLSAgICAgICAgaWYgKG5hbWUuZXF1YWxzTmF0aXZlRnVuY3Rpb24oVG9Kc29uRmN0Lk5BTUUpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKCJ0b0pzb24oKSBtYXkgb25seSBiZSB1c2VkIHdpdGhpbiB0aGUgc2VsZWN0aW9uIGNsYXVzZSBvZiBTRUxFQ1Qgc3RhdGVtZW50cyIpOwotCi0gICAgICAgIC8vIFNpbWlsYXJseSwgd2UgY2FuIG9ubHkgdXNlIGZyb21Kc29uIHdoZW4gd2Uga25vdyB0aGUgcmVjZWl2ZXIgdHlwZSAoc3VjaCBhcyBpbnNlcnRzKQotICAgICAgICBpZiAobmFtZS5lcXVhbHNOYXRpdmVGdW5jdGlvbihGcm9tSnNvbkZjdC5OQU1FKSkKKyAgICAgICAgaWYgKG5hbWUuaGFzS2V5c3BhY2UoKSkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlY2VpdmVyVHlwZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigiZnJvbUpzb24oKSBjYW5ub3QgYmUgdXNlZCBpbiB0aGUgc2VsZWN0aW9uIGNsYXVzZSBvZiBhIFNFTEVDVCBzdGF0ZW1lbnQiKTsKLSAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKEZyb21Kc29uRmN0LmdldEluc3RhbmNlKHJlY2VpdmVyVHlwZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFuYW1lLmhhc0tleXNwYWNlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGZ1bmN0aW9uIG5hbWUgbm90IGZ1bGx5IHF1YWxpZmllZAotICAgICAgICAgICAgLy8gYWRkICdTWVNURU0nIChuYXRpdmUpIGNhbmRpZGF0ZXMKLSAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkQWxsKFNjaGVtYS5pbnN0YW5jZS5nZXRGdW5jdGlvbnMobmFtZS5hc05hdGl2ZUZ1bmN0aW9uKCkpKTsKLSAgICAgICAgICAgIC8vIGFkZCAnY3VycmVudCBrZXlzcGFjZScgY2FuZGlkYXRlcwotICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGRBbGwoU2NoZW1hLmluc3RhbmNlLmdldEZ1bmN0aW9ucyhuZXcgRnVuY3Rpb25OYW1lKGtleXNwYWNlLCBuYW1lLm5hbWUpKSk7CisgICAgICAgICAgICAvLyBmdW5jdGlvbiBuYW1lIGlzIGZ1bGx5IHF1YWxpZmllZCAoa2V5c3BhY2UgKyBuYW1lKQorICAgICAgICAgICAgY2FuZGlkYXRlcy5hZGRBbGwoZnVuY3Rpb25zLmdldChuYW1lKSk7CisgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZEFsbChTY2hlbWEuaW5zdGFuY2UuZ2V0VXNlckZ1bmN0aW9ucyhuYW1lKSk7CisgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZEFsbChOYXRpdmVGdW5jdGlvbnMuaW5zdGFuY2UuZ2V0RnVuY3Rpb25zKG5hbWUpKTsKKyAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkQWxsKE5hdGl2ZUZ1bmN0aW9ucy5pbnN0YW5jZS5nZXRGYWN0b3JpZXMobmFtZSkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmIC0+IGYuZ2V0T3JDcmVhdGVGdW5jdGlvbihwcm92aWRlZEFyZ3MsIHJlY2VpdmVyVHlwZSwgcmVjZWl2ZXJLZXlzcGFjZSwgcmVjZWl2ZXJUYWJsZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewotICAgICAgICAgICAgLy8gZnVuY3Rpb24gbmFtZSBpcyBmdWxseSBxdWFsaWZpZWQgKGtleXNwYWNlICsgbmFtZSkKLSAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkQWxsKFNjaGVtYS5pbnN0YW5jZS5nZXRGdW5jdGlvbnMobmFtZSkpOworICAgICAgICAgICAgLy8gZnVuY3Rpb24gbmFtZSBpcyBub3QgZnVsbHkgcXVhbGlmaWVkCisgICAgICAgICAgICAvLyBhZGQgJ2N1cnJlbnQga2V5c3BhY2UnIGNhbmRpZGF0ZXMKKyAgICAgICAgICAgIEZ1bmN0aW9uTmFtZSB1c2VyTmFtZSA9IG5ldyBGdW5jdGlvbk5hbWUoa2V5c3BhY2UsIG5hbWUubmFtZSk7CisgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZEFsbChmdW5jdGlvbnMuZ2V0KHVzZXJOYW1lKSk7CisgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZEFsbChTY2hlbWEuaW5zdGFuY2UuZ2V0VXNlckZ1bmN0aW9ucyh1c2VyTmFtZSkpOworICAgICAgICAgICAgLy8gYWRkICdTWVNURU0nIChuYXRpdmUpIGNhbmRpZGF0ZXMKKyAgICAgICAgICAgIEZ1bmN0aW9uTmFtZSBuYXRpdmVOYW1lID0gbmFtZS5hc05hdGl2ZUZ1bmN0aW9uKCk7CisgICAgICAgICAgICBjYW5kaWRhdGVzLmFkZEFsbChOYXRpdmVGdW5jdGlvbnMuaW5zdGFuY2UuZ2V0RnVuY3Rpb25zKG5hdGl2ZU5hbWUpKTsKKyAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkQWxsKE5hdGl2ZUZ1bmN0aW9ucy5pbnN0YW5jZS5nZXRGYWN0b3JpZXMobmF0aXZlTmFtZSkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmIC0+IGYuZ2V0T3JDcmVhdGVGdW5jdGlvbihwcm92aWRlZEFyZ3MsIHJlY2VpdmVyVHlwZSwgcmVjZWl2ZXJLZXlzcGFjZSwgcmVjZWl2ZXJUYWJsZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZXM7CkBAIC0xMzAsOCArMTUyLDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBGdW5jdGlvbiBwaWNrQmVzdE1hdGNoKFN0cmluZyBrZXlzcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uTmFtZSBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDw/IGV4dGVuZHMgQXNzaWdubWVudFRlc3RhYmxlPiBwcm92aWRlZEFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJLcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlckNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyS2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEZ1bmN0aW9uPiBjYW5kaWRhdGVzKQogICAgIHsKQEAgLTE0MCw3ICsxNjIsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobWF0Y2hSZXR1cm5UeXBlKHRvVGVzdCwgcmVjZWl2ZXJUeXBlKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NpZ25tZW50VGVzdGFibGUuVGVzdFJlc3VsdCByID0gbWF0Y2hBZ3VtZW50cyhrZXlzcGFjZSwgdG9UZXN0LCBwcm92aWRlZEFyZ3MsIHJlY2VpdmVyS3MsIHJlY2VpdmVyQ2YpOworICAgICAgICAgICAgICAgIEFzc2lnbm1lbnRUZXN0YWJsZS5UZXN0UmVzdWx0IHIgPSBtYXRjaEFndW1lbnRzKGtleXNwYWNlLCB0b1Rlc3QsIHByb3ZpZGVkQXJncywgcmVjZWl2ZXJLZXlzcGFjZSwgcmVjZWl2ZXJUYWJsZSk7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChyKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBFWEFDVF9NQVRDSDoKQEAgLTIyMSw4ICsyNDMsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVUeXBlcyhTdHJpbmcga2V5c3BhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIGZ1biwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDw/IGV4dGVuZHMgQXNzaWdubWVudFRlc3RhYmxlPiBwcm92aWRlZEFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlcktzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJDZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyS2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlclRhYmxlKQogICAgIHsKICAgICAgICAgaWYgKHByb3ZpZGVkQXJncy5zaXplKCkgIT0gZnVuLmFyZ1R5cGVzKCkuc2l6ZSgpKQogICAgICAgICAgICAgdGhyb3cgaW52YWxpZFJlcXVlc3QoIkludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBjYWxsIHRvIGZ1bmN0aW9uICVzOiAlZCByZXF1aXJlZCBidXQgJWQgcHJvdmlkZWQiLApAQCAtMjM3LDcgKzI1OSw3IEBACiAgICAgICAgICAgICBpZiAocHJvdmlkZWQgPT0gbnVsbCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgQ29sdW1uU3BlY2lmaWNhdGlvbiBleHBlY3RlZCA9IG1ha2VBcmdTcGVjKHJlY2VpdmVyS3MsIHJlY2VpdmVyQ2YsIGZ1biwgaSk7CisgICAgICAgICAgICBDb2x1bW5TcGVjaWZpY2F0aW9uIGV4cGVjdGVkID0gbWFrZUFyZ1NwZWMocmVjZWl2ZXJLZXlzcGFjZSwgcmVjZWl2ZXJUYWJsZSwgZnVuLCBpKTsKICAgICAgICAgICAgIGlmICghcHJvdmlkZWQudGVzdEFzc2lnbm1lbnQoa2V5c3BhY2UsIGV4cGVjdGVkKS5pc0Fzc2lnbmFibGUoKSkKICAgICAgICAgICAgICAgICB0aHJvdyBpbnZhbGlkUmVxdWVzdCgiVHlwZSBlcnJvcjogJXMgY2Fubm90IGJlIHBhc3NlZCBhcyBhcmd1bWVudCAlZCBvZiBmdW5jdGlvbiAlcyBvZiB0eXBlICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCwgaSwgZnVuLm5hbWUoKSwgZXhwZWN0ZWQudHlwZS5hc0NRTDNUeXBlKCkpOwpAQCAtMjQ3LDEzICsyNjksMTMgQEAKICAgICBwcml2YXRlIHN0YXRpYyBBc3NpZ25tZW50VGVzdGFibGUuVGVzdFJlc3VsdCBtYXRjaEFndW1lbnRzKFN0cmluZyBrZXlzcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIGZ1biwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8PyBleHRlbmRzIEFzc2lnbm1lbnRUZXN0YWJsZT4gcHJvdmlkZWRBcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyS3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZXJDZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlcktleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyVGFibGUpCiAgICAgewogICAgICAgICBpZiAocHJvdmlkZWRBcmdzLnNpemUoKSAhPSBmdW4uYXJnVHlwZXMoKS5zaXplKCkpCiAgICAgICAgICAgICByZXR1cm4gQXNzaWdubWVudFRlc3RhYmxlLlRlc3RSZXN1bHQuTk9UX0FTU0lHTkFCTEU7CiAKLSAgICAgICAgLy8gSXQncyBhbiBleGFjdCBtYXRjaCBpZiBhbGwgYXJlIGV4YWN0IG1hdGNoLCBidXQgaXMgbm90IGFzc2lnbmFibGUgYXMgc29vbiBhcyBhbnkgaXMgbm9uIGFzc2lnbmFibGUuCisgICAgICAgIC8vIEl0J3MgYW4gZXhhY3QgbWF0Y2ggaWYgYWxsIGFyZSBleGFjdCBtYXRjaCwgYnV0IGlzIG5vdCBhc3NpZ25hYmxlIGFzIHNvb24gYXMgYW55IGlzIG5vdCBhc3NpZ25hYmxlLgogICAgICAgICBBc3NpZ25tZW50VGVzdGFibGUuVGVzdFJlc3VsdCByZXMgPSBBc3NpZ25tZW50VGVzdGFibGUuVGVzdFJlc3VsdC5FWEFDVF9NQVRDSDsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlZEFyZ3Muc2l6ZSgpOyBpKyspCiAgICAgICAgIHsKQEAgLTI2NCw3ICsyODYsNyBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDb2x1bW5TcGVjaWZpY2F0aW9uIGV4cGVjdGVkID0gbWFrZUFyZ1NwZWMocmVjZWl2ZXJLcywgcmVjZWl2ZXJDZiwgZnVuLCBpKTsKKyAgICAgICAgICAgIENvbHVtblNwZWNpZmljYXRpb24gZXhwZWN0ZWQgPSBtYWtlQXJnU3BlYyhyZWNlaXZlcktleXNwYWNlLCByZWNlaXZlclRhYmxlLCBmdW4sIGkpOwogICAgICAgICAgICAgQXNzaWdubWVudFRlc3RhYmxlLlRlc3RSZXN1bHQgYXJnUmVzID0gcHJvdmlkZWQudGVzdEFzc2lnbm1lbnQoa2V5c3BhY2UsIGV4cGVjdGVkKTsKICAgICAgICAgICAgIGlmIChhcmdSZXMgPT0gQXNzaWdubWVudFRlc3RhYmxlLlRlc3RSZXN1bHQuTk9UX0FTU0lHTkFCTEUpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFzc2lnbm1lbnRUZXN0YWJsZS5UZXN0UmVzdWx0Lk5PVF9BU1NJR05BQkxFOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvTWF0aEZjdHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL01hdGhGY3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzYWM0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL01hdGhGY3RzLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnM7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOworCitwdWJsaWMgZmluYWwgY2xhc3MgTWF0aEZjdHMKK3sKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRnVuY3Rpb25zVG8oTmF0aXZlRnVuY3Rpb25zIGZ1bmN0aW9ucykKKyAgICB7CisgICAgICAgIGZpbmFsIExpc3Q8TnVtYmVyVHlwZTw/Pj4gbnVtZXJpY1R5cGVzID0gSW1tdXRhYmxlTGlzdC5vZihCeXRlVHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3J0VHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludDMyVHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0VHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmdUeXBlLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlVHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXJUeXBlLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbFR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSk7CisKKyAgICAgICAgbnVtZXJpY1R5cGVzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgIC5tYXAodCAtPiBJbW11dGFibGVMaXN0Lm9mKGFic0ZjdCh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwRmN0KHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dGY3QodCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzEwRmN0KHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZEZjdCh0KSkpCisgICAgICAgICAgICAgICAgICAgICAuZmxhdE1hcChDb2xsZWN0aW9uOjpzdHJlYW0pCisgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChmIC0+IGZ1bmN0aW9ucy5hZGQoZikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTmF0aXZlRnVuY3Rpb24gYWJzRmN0KGZpbmFsIE51bWJlclR5cGU8Pz4gdHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24oImFicyIsIHR5cGUsIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IHBhcmFtZXRlcnMuZ2V0KDApOworICAgICAgICAgICAgICAgIGlmIChiYiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5hYnMoYmIpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTmF0aXZlRnVuY3Rpb24gZXhwRmN0KGZpbmFsIE51bWJlclR5cGU8Pz4gdHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24oImV4cCIsIHR5cGUsIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IHBhcmFtZXRlcnMuZ2V0KDApOworICAgICAgICAgICAgICAgIGlmIChiYiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5leHAoYmIpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTmF0aXZlRnVuY3Rpb24gbG9nRmN0KGZpbmFsIE51bWJlclR5cGU8Pz4gdHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24oImxvZyIsIHR5cGUsIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IHBhcmFtZXRlcnMuZ2V0KDApOworICAgICAgICAgICAgICAgIGlmIChiYiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5sb2coYmIpOworCisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBOYXRpdmVGdW5jdGlvbiBsb2cxMEZjdChmaW5hbCBOdW1iZXJUeXBlPD8+IHR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKCJsb2cxMCIsIHR5cGUsIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IHBhcmFtZXRlcnMuZ2V0KDApOworICAgICAgICAgICAgICAgIGlmIChiYiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5sb2cxMChiYik7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE5hdGl2ZUZ1bmN0aW9uIHJvdW5kRmN0KGZpbmFsIE51bWJlclR5cGU8Pz4gdHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24oInJvdW5kIiwgdHlwZSwgdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGJiID0gcGFyYW1ldGVycy5nZXQoMCk7CisgICAgICAgICAgICAgICAgaWYgKGJiID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLnJvdW5kKGJiKTsKKworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHByaXZhdGUgTWF0aEZjdHMoKQorICAgIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9OYXRpdmVGdW5jdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvTmF0aXZlRnVuY3Rpb24uamF2YQppbmRleCBjYWZlY2ExLi4yODVjZjYzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9OYXRpdmVGdW5jdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL05hdGl2ZUZ1bmN0aW9uLmphdmEKQEAgLTE5LDYgKzE5LDggQEAKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiAKIC8qKgpAQCAtMzIsNyArMzQsNyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzTmF0aXZlKCkKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc05hdGl2ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC00Myw0ICs0NSwxOCBAQAogICAgICAgICAvLyBNb3N0IG9mIG91ciBmdW5jdGlvbnMgYXJlIHB1cmUsIHRoZSBvdGhlciBvbmVzIHNob3VsZCBvdmVycmlkZSB0aGlzCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgZnVuY3Rpb24gdXNpbmcgaXRzIG9sZCBwcmUtNS4wIG5hbWUgYmVmb3JlIHRoZSBhZG9wdGlvbiBvZiBzbmFrZS1jYXNlZCBmdW5jdGlvbiBuYW1lcy4KKyAgICAgKiBUaG9zZSBuYW1pbmcgY29udmVudGlvbnMgd2VyZSBhZG9wdGVkIGluIDUuMCwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gc3VwcG9ydCB0aGUgb2xkIG5hbWVzIGZvcgorICAgICAqIGNvbXBhdGliaWxpdHkuIFNlZSBDQVNTQU5EUkEtMTgwMzcgZm9yIGZ1cnRoZXIgZGV0YWlscy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBjb3B5IG9mIHRoaXMgZnVuY3Rpb24gdXNpbmcgaXRzIG9sZCBwcmUtNS4wIGRlcHJlY2F0ZWQgbmFtZSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBwcmUtNS4wIGZ1bmN0aW9uCisgICAgICogbmFtZSBhbHJlYWR5IHNhdGlzZmllZCB0aGUgbmFtaW5nIGNvbnZlbnRpb25zLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBOYXRpdmVGdW5jdGlvbiB3aXRoTGVnYWN5TmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9OYXRpdmVGdW5jdGlvbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL05hdGl2ZUZ1bmN0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOTM5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9OYXRpdmVGdW5jdGlvbnMuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5IYXNoTXVsdGltYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmcuTWFza2luZ0ZjdHM7CisKKy8qKgorICogQSBjb250YWluZXIgb2YgbmF0aXZlIGZ1bmN0aW9ucy4gSXQgc3RvcmVzIGJvdGggcHJlLWJ1aWx0IGZ1bmN0aW9uIG92ZXJsb2FkcyAoe0BsaW5rIE5hdGl2ZUZ1bmN0aW9ufSkgYW5kCisgKiBkeW5hbWljIGdlbmVyYXRvcnMgb2YgZnVuY3Rpb25zICh7QGxpbmsgRnVuY3Rpb25GYWN0b3J5fSkuCisgKi8KK3B1YmxpYyBjbGFzcyBOYXRpdmVGdW5jdGlvbnMKK3sKKyAgICBwdWJsaWMgc3RhdGljIE5hdGl2ZUZ1bmN0aW9ucyBpbnN0YW5jZSA9IG5ldyBOYXRpdmVGdW5jdGlvbnMoKQorICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgVG9rZW5GY3QuYWRkRnVuY3Rpb25zVG8odGhpcyk7CisgICAgICAgICAgICBDYXN0RmN0cy5hZGRGdW5jdGlvbnNUbyh0aGlzKTsKKyAgICAgICAgICAgIFV1aWRGY3RzLmFkZEZ1bmN0aW9uc1RvKHRoaXMpOworICAgICAgICAgICAgVGltZUZjdHMuYWRkRnVuY3Rpb25zVG8odGhpcyk7CisgICAgICAgICAgICBUb0pzb25GY3QuYWRkRnVuY3Rpb25zVG8odGhpcyk7CisgICAgICAgICAgICBGcm9tSnNvbkZjdC5hZGRGdW5jdGlvbnNUbyh0aGlzKTsKKyAgICAgICAgICAgIE9wZXJhdGlvbkZjdHMuYWRkRnVuY3Rpb25zVG8odGhpcyk7CisgICAgICAgICAgICBBZ2dyZWdhdGVGY3RzLmFkZEZ1bmN0aW9uc1RvKHRoaXMpOworICAgICAgICAgICAgQ29sbGVjdGlvbkZjdHMuYWRkRnVuY3Rpb25zVG8odGhpcyk7CisgICAgICAgICAgICBCeXRlc0NvbnZlcnNpb25GY3RzLmFkZEZ1bmN0aW9uc1RvKHRoaXMpOworICAgICAgICAgICAgTWF0aEZjdHMuYWRkRnVuY3Rpb25zVG8odGhpcyk7CisgICAgICAgICAgICBNYXNraW5nRmN0cy5hZGRGdW5jdGlvbnNUbyh0aGlzKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKiogUHJlLWJ1aWx0IGZ1bmN0aW9uIG92ZXJsb2Fkcy4gKi8KKyAgICBwcml2YXRlIGZpbmFsIE11bHRpbWFwPEZ1bmN0aW9uTmFtZSwgTmF0aXZlRnVuY3Rpb24+IGZ1bmN0aW9ucyA9IEhhc2hNdWx0aW1hcC5jcmVhdGUoKTsKKworICAgIC8qKiBEeW5hbWljIGZ1bmN0aW9uIGZhY3Rvcmllcy4gKi8KKyAgICBwcml2YXRlIGZpbmFsIE11bHRpbWFwPEZ1bmN0aW9uTmFtZSwgRnVuY3Rpb25GYWN0b3J5PiBmYWN0b3JpZXMgPSBIYXNoTXVsdGltYXAuY3JlYXRlKCk7CisKKyAgICBwdWJsaWMgdm9pZCBhZGQoTmF0aXZlRnVuY3Rpb24gZnVuY3Rpb24pCisgICAgeworICAgICAgICBmdW5jdGlvbnMucHV0KGZ1bmN0aW9uLm5hbWUoKSwgZnVuY3Rpb24pOworICAgICAgICBOYXRpdmVGdW5jdGlvbiBsZWdhY3lGdW5jdGlvbiA9IGZ1bmN0aW9uLndpdGhMZWdhY3lOYW1lKCk7CisgICAgICAgIGlmIChsZWdhY3lGdW5jdGlvbiAhPSBudWxsKQorICAgICAgICAgICAgZnVuY3Rpb25zLnB1dChsZWdhY3lGdW5jdGlvbi5uYW1lKCksIGxlZ2FjeUZ1bmN0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRBbGwoTmF0aXZlRnVuY3Rpb24uLi4gZnVuY3Rpb25zKQorICAgIHsKKyAgICAgICAgZm9yIChOYXRpdmVGdW5jdGlvbiBmdW5jdGlvbiA6IGZ1bmN0aW9ucykKKyAgICAgICAgICAgIGFkZChmdW5jdGlvbik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkKEZ1bmN0aW9uRmFjdG9yeSBmYWN0b3J5KQorICAgIHsKKyAgICAgICAgZmFjdG9yaWVzLnB1dChmYWN0b3J5Lm5hbWUoKSwgZmFjdG9yeSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgdGhlIHJlZ2lzdGVyZWQgcHJlLWJ1aWx0IGZ1bmN0aW9ucyBvdmVybG9hZHMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBhIGZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmUtYnVpbHQgZnVuY3Rpb25zIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb248TmF0aXZlRnVuY3Rpb24+IGdldEZ1bmN0aW9ucyhGdW5jdGlvbk5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbnMuZ2V0KG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYWxsIHRoZSByZWdpc3RlcmVkIHByZS1idWlsdCBmdW5jdGlvbnMuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb248TmF0aXZlRnVuY3Rpb24+IGdldEZ1bmN0aW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gZnVuY3Rpb25zLnZhbHVlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIHRoZSByZWdpc3RlcmVkIGZ1bmN0aW9ucyBmYWN0b3JpZXMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBhIGZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSBmdW5jdGlvbiBmYWN0b3JpZXMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxGdW5jdGlvbkZhY3Rvcnk+IGdldEZhY3RvcmllcyhGdW5jdGlvbk5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWN0b3JpZXMuZ2V0KG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYWxsIHRoZSByZWdpc3RlcmVkIGZ1bmN0aW9ucyBmYWN0b3JpZXMuCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb248RnVuY3Rpb25GYWN0b3J5PiBnZXRGYWN0b3JpZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcmllcy52YWx1ZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgaXMgYSBmdW5jdGlvbiBmYWN0b3J5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgYSBmdW5jdGlvbiBuYW1lCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlcmUgaXMgYSBmYWN0b3J5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0ZhY3RvcnkoRnVuY3Rpb25OYW1lIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gZmFjdG9yaWVzLmNvbnRhaW5zS2V5KG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL09wZXJhdGlvbkZjdHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL09wZXJhdGlvbkZjdHMuamF2YQppbmRleCBiMDBjZWQ3Li45ZTBmZWYxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9PcGVyYXRpb25GY3RzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvT3BlcmF0aW9uRmN0cy5qYXZhCkBAIC0xOCw4ICsxOCw2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKQEAgLTIxOSwxMCArMjE3LDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORUdBVElPTl9GVU5DVElPTl9OQU1FID0gIl9uZWdhdGUiOwogCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEZ1bmN0aW9uPiBhbGwoKQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGdW5jdGlvbnNUbyhOYXRpdmVGdW5jdGlvbnMgZnVuY3Rpb25zKQogICAgIHsKLSAgICAgICAgTGlzdDxGdW5jdGlvbj4gZnVuY3Rpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KICAgICAgICAgZmluYWwgTnVtYmVyVHlwZTw/PltdIG51bWVyaWNUeXBlcyA9IG5ldyBOdW1iZXJUeXBlW10geyBCeXRlVHlwZS5pbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG9ydFR5cGUuaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50MzJUeXBlLmluc3RhbmNlLApAQCAtMjUxLDExICsyNDcsOSBAQAogICAgICAgICB9CiAKICAgICAgICAgYWRkU3RyaW5nQ29uY2F0ZW5hdGlvbnMoZnVuY3Rpb25zKTsKLQotICAgICAgICByZXR1cm4gZnVuY3Rpb25zOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkU3RyaW5nQ29uY2F0ZW5hdGlvbnMoTGlzdDxGdW5jdGlvbj4gZnVuY3Rpb25zKQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkU3RyaW5nQ29uY2F0ZW5hdGlvbnMoTmF0aXZlRnVuY3Rpb25zIGZ1bmN0aW9ucykKICAgICB7CiAgICAgICAgIGZ1bmN0aW9ucy5hZGQobmV3IFN0cmluZ09wZXJhdGlvbkZ1bmN0aW9uKFVURjhUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSwgT1BFUkFUSU9OLkFERElUSU9OLCBVVEY4VHlwZS5pbnN0YW5jZSkpOwogICAgICAgICBmdW5jdGlvbnMuYWRkKG5ldyBTdHJpbmdPcGVyYXRpb25GdW5jdGlvbihBc2NpaVR5cGUuaW5zdGFuY2UsIEFzY2lpVHlwZS5pbnN0YW5jZSwgT1BFUkFUSU9OLkFERElUSU9OLCBBc2NpaVR5cGUuaW5zdGFuY2UpKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1NjcmlwdEJhc2VkVURGdW5jdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvU2NyaXB0QmFzZWRVREZ1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MmZiZTkuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvU2NyaXB0QmFzZWRVREZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS4qOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7Ci1pbXBvcnQgamF2YXguc2NyaXB0Lio7Ci0KLWltcG9ydCBqZGsubmFzaG9ybi5hcGkuc2NyaXB0aW5nLkFic3RyYWN0SlNPYmplY3Q7Ci1pbXBvcnQgamRrLm5hc2hvcm4uYXBpLnNjcmlwdGluZy5DbGFzc0ZpbHRlcjsKLWltcG9ydCBqZGsubmFzaG9ybi5hcGkuc2NyaXB0aW5nLk5hc2hvcm5TY3JpcHRFbmdpbmU7Ci1pbXBvcnQgamRrLm5hc2hvcm4uYXBpLnNjcmlwdGluZy5OYXNob3JuU2NyaXB0RW5naW5lRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50Lk5hbWVkVGhyZWFkRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtbklkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5TZWN1cml0eVRocmVhZEdyb3VwOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LlRocmVhZEF3YXJlU2VjdXJpdHlNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247Ci0KLWZpbmFsIGNsYXNzIFNjcmlwdEJhc2VkVURGdW5jdGlvbiBleHRlbmRzIFVERnVuY3Rpb24KLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm90ZWN0aW9uRG9tYWluIHByb3RlY3Rpb25Eb21haW47Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWNjZXNzQ29udHJvbENvbnRleHQgYWNjZXNzQ29udHJvbENvbnRleHQ7Ci0KLSAgICAvLwotICAgIC8vIEZvciBzY3JpcHRlZCBVREZzIHdlIGhhdmUgdG8gcmVseSBvbiB0aGUgc2VjdXJpdHkgbWVjaGFuaXNtcyBvZiB0aGUgc2NyaXB0aW5nIGVuZ2luZSBhbmQKLSAgICAvLyBTZWN1cml0eU1hbmFnZXIgLSBlc3BlY2lhbGx5IFNlY3VyaXR5TWFuYWdlci5jaGVja1BhY2thZ2VBY2Nlc3MoKS4gVW5saWtlIEphdmEtVURGcywgc3RyaWN0IGNoZWNraW5nCi0gICAgLy8gb2YgY2xhc3MgYWNjZXNzIHZpYSB0aGUgVURGIGNsYXNzIGxvYWRlciBpcyBub3QgcG9zc2libGUsIHNpbmNlIGUuZy4gTmFzaG9ybiBidWlsZHMgaXRzIG93biBjbGFzcyBsb2FkZXIKLSAgICAvLyAoamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZS5TY3JpcHRMb2FkZXIgLyBqZGsubmFzaG9ybi5pbnRlcm5hbC5ydW50aW1lLk5hc2hvcm5Mb2FkZXIpIGNvbmZpZ3VyZWQgd2l0aAotICAgIC8vIGEgc3lzdGVtIGNsYXNzIGxvYWRlci4KLSAgICAvLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGFsbG93ZWRQYWNrYWdlc0FycmF5ID0KLSAgICB7Ci0gICAgLy8gZm9sbG93aW5nIHJlcXVpcmVkIGJ5IGpkay5uYXNob3JuLmludGVybmFsLm9iamVjdHMuR2xvYmFsLmluaXRKYXZhQWNjZXNzKCkKLSAgICAiIiwKLSAgICAiY29tIiwKLSAgICAiZWR1IiwKLSAgICAiamF2YSIsCi0gICAgImphdmF4IiwKLSAgICAiamF2YWZ4IiwKLSAgICAib3JnIiwKLSAgICAvLyBmb2xsb3dpbmcgcmVxdWlyZWQgYnkgTmFzaG9ybiBydW50aW1lCi0gICAgImphdmEubGFuZyIsCi0gICAgImphdmEubGFuZy5pbnZva2UiLAotICAgICJqYXZhLmxhbmcucmVmbGVjdCIsCi0gICAgImphdmEubmlvLmNoYXJzZXQiLAotICAgICJqYXZhLnV0aWwiLAotICAgICJqYXZhLnV0aWwuY29uY3VycmVudCIsCi0gICAgImphdmF4LnNjcmlwdCIsCi0gICAgInN1bi5yZWZsZWN0IiwKLSAgICAiamRrLmludGVybmFsLm9yZy5vYmplY3R3ZWIuYXNtLmNvbW1vbnMiLAotICAgICJqZGsubmFzaG9ybi5pbnRlcm5hbC5ydW50aW1lIiwKLSAgICAiamRrLm5hc2hvcm4uaW50ZXJuYWwucnVudGltZS5saW5rZXIiLAotICAgIC8vIE5hc2hvcm4gLyBKYXZhIDExCi0gICAgImphdmEubGFuZy5yZWYiLAotICAgICJqYXZhLmlvIiwKLSAgICAiamF2YS51dGlsLmZ1bmN0aW9uIiwKLSAgICAiamRrLmR5bmFsaW5rLmxpbmtlciIsCi0gICAgImpkay5pbnRlcm5hbC5vcmcub2JqZWN0d2ViLmFzbSIsCi0gICAgImpkay5pbnRlcm5hbC5yZWZsZWN0IiwKLSAgICAiamRrLm5hc2hvcm4uaW50ZXJuYWwuc2NyaXB0cyIsCi0gICAgLy8gZm9sbG93aW5nIHJlcXVpcmVkIGJ5IEphdmEgRHJpdmVyCi0gICAgImphdmEubWF0aCIsCi0gICAgImphdmEubmlvIiwKLSAgICAiamF2YS50ZXh0IiwKLSAgICAiY29tLmdvb2dsZS5jb21tb24uYmFzZSIsCi0gICAgImNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QiLAotICAgICJjb20uZ29vZ2xlLmNvbW1vbi5yZWZsZWN0IiwKLSAgICAvLyBmb2xsb3dpbmcgcmVxdWlyZWQgYnkgVURGCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLnR5cGVzIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMudHlwZXMuZXhjZXB0aW9ucyIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLnR5cGVzLnV0aWxzIgotICAgIH07Ci0KLSAgICAvLyB1c2UgYSBKVk0gc3RhbmRhcmQgRXhlY3V0b3JTZXJ2aWNlIGFzIEV4ZWN1dG9yUGx1cyByZWZlcmVuY2VzIGludGVybmFsCi0gICAgLy8gY2xhc3Nlcywgd2hpY2ggdHJpZ2dlcnMgQWNjZXNzQ29udHJvbEV4Y2VwdGlvbiBmcm9tIHRoZSBVREYgc2FuZGJveAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVERkV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9Ci0gICAgICAgIG5ldyBVREZFeGVjdXRvclNlcnZpY2UobmV3IE5hbWVkVGhyZWFkRmFjdG9yeSgiVXNlckRlZmluZWRTY3JpcHRGdW5jdGlvbnMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLk1JTl9QUklPUklUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVkZkNsYXNzTG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlY3VyaXR5VGhyZWFkR3JvdXAoIlVzZXJEZWZpbmVkU2NyaXB0RnVuY3Rpb25zIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoYWxsb3dlZFBhY2thZ2VzQXJyYXkpKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVREZ1bmN0aW9uOjppbml0aWFsaXplVGhyZWFkKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJzY3JpcHRzIik7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzc0ZpbHRlciBjbGFzc0ZpbHRlciA9IGNsc05hbWUgLT4gc2VjdXJlUmVzb3VyY2UoY2xzTmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE5hc2hvcm5TY3JpcHRFbmdpbmUgc2NyaXB0RW5naW5lOwotCi0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIFNjcmlwdEVuZ2luZU1hbmFnZXIgc2NyaXB0RW5naW5lTWFuYWdlciA9IG5ldyBTY3JpcHRFbmdpbmVNYW5hZ2VyKCk7Ci0gICAgICAgIFNjcmlwdEVuZ2luZSBlbmdpbmUgPSBzY3JpcHRFbmdpbmVNYW5hZ2VyLmdldEVuZ2luZUJ5TmFtZSgibmFzaG9ybiIpOwotICAgICAgICBOYXNob3JuU2NyaXB0RW5naW5lRmFjdG9yeSBmYWN0b3J5ID0gZW5naW5lICE9IG51bGwgPyAoTmFzaG9yblNjcmlwdEVuZ2luZUZhY3RvcnkpIGVuZ2luZS5nZXRGYWN0b3J5KCkgOiBudWxsOwotICAgICAgICBzY3JpcHRFbmdpbmUgPSBmYWN0b3J5ICE9IG51bGwgPyAoTmFzaG9yblNjcmlwdEVuZ2luZSkgZmFjdG9yeS5nZXRTY3JpcHRFbmdpbmUobmV3IFN0cmluZ1tde30sIHVkZkNsYXNzTG9hZGVyLCBjbGFzc0ZpbHRlcikgOiBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm90ZWN0aW9uRG9tYWluID0gbmV3IFByb3RlY3Rpb25Eb21haW4obmV3IENvZGVTb3VyY2UobmV3IFVSTCgidWRmIiwgImxvY2FsaG9zdCIsIDAsICIvc2NyaXB0IiwgbmV3IFVSTFN0cmVhbUhhbmRsZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3RlY3RlZCBVUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKFVSTCB1KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSksIChDZXJ0aWZpY2F0ZVtdKSBudWxsKSwgVGhyZWFkQXdhcmVTZWN1cml0eU1hbmFnZXIubm9QZXJtaXNzaW9ucyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBhY2Nlc3NDb250cm9sQ29udGV4dCA9IG5ldyBBY2Nlc3NDb250cm9sQ29udGV4dChuZXcgUHJvdGVjdGlvbkRvbWFpbltdeyBwcm90ZWN0aW9uRG9tYWluIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQ29tcGlsZWRTY3JpcHQgc2NyaXB0OwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IHVkZkNvbnRleHRCaW5kaW5nOwotCi0gICAgU2NyaXB0QmFzZWRVREZ1bmN0aW9uKEZ1bmN0aW9uTmFtZSBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENvbHVtbklkZW50aWZpZXI+IGFyZ05hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiByZXR1cm5UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNhbGxlZE9uTnVsbElucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBib2R5KQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSwgYXJnTmFtZXMsIGFyZ1R5cGVzLCByZXR1cm5UeXBlLCBjYWxsZWRPbk51bGxJbnB1dCwgbGFuZ3VhZ2UsIGJvZHkpOwotCi0gICAgICAgIGlmICghIkphdmFTY3JpcHQiLmVxdWFsc0lnbm9yZUNhc2UobGFuZ3VhZ2UpIHx8IHNjcmlwdEVuZ2luZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgbGFuZ3VhZ2UgJyVzJyBmb3IgZnVuY3Rpb24gJyVzJyIsIGxhbmd1YWdlLCBuYW1lKSk7Ci0KLSAgICAgICAgLy8gZXhlY3V0ZSBjb21waWxhdGlvbiB3aXRoIG5vLXBlcm1pc3Npb25zIHRvIHByZXZlbnQgZXZpbCBjb2RlIGUuZy4gdmlhICJzdGF0aWMgY29kZSBibG9ja3MiIC8gImNsYXNzIGluaXRpYWxpemF0aW9uIgotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5zY3JpcHQgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgoUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxDb21waWxlZFNjcmlwdD4pICgpIC0+IHNjcmlwdEVuZ2luZS5jb21waWxlKGJvZHkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NDb250cm9sQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24geCkKLSAgICAgICAgewotICAgICAgICAgICAgVGhyb3dhYmxlIGUgPSB4LmdldENhdXNlKCk7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygiRmFpbGVkIHRvIGNvbXBpbGUgZnVuY3Rpb24gJ3t9JyBmb3IgbGFuZ3VhZ2Uge306ICIsIG5hbWUsIGxhbmd1YWdlLCBlKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkZhaWxlZCB0byBjb21waWxlIGZ1bmN0aW9uICclcycgZm9yIGxhbmd1YWdlICVzOiAlcyIsIG5hbWUsIGxhbmd1YWdlLCBlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJdCdzIG5vdCBhbHdheXMgcG9zc2libGUgdG8gc2ltcGx5IHBhc3MgYSBwbGFpbiBKYXZhIG9iamVjdCBhcyBhIGJpbmRpbmcgdG8gTmFzaG9ybiBhbmQKLSAgICAgICAgLy8gbGV0IHRoZSBzY3JpcHQgZXhlY3V0ZSBtZXRob2RzIG9uIGl0LgotICAgICAgICB1ZGZDb250ZXh0QmluZGluZyA9IG5ldyBVREZDb250ZXh0V3JhcHBlcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGV4ZWN1dG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGVVc2VyRGVmaW5lZChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCi0gICAgewotICAgICAgICBPYmplY3RbXSBwYXJhbXMgPSBuZXcgT2JqZWN0W2FyZ1R5cGVzLnNpemUoKV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgcGFyYW1zW2ldID0gY29tcG9zZShwcm90b2NvbFZlcnNpb24sIGksIHBhcmFtZXRlcnMuZ2V0KGkpKTsKLQotICAgICAgICBPYmplY3QgcmVzdWx0ID0gZXhlY3V0ZVNjcmlwdEludGVybmFsKHBhcmFtcyk7Ci0KLSAgICAgICAgcmV0dXJuIGRlY29tcG9zZShwcm90b2NvbFZlcnNpb24sIHJlc3VsdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgVURGdW5jdGlvbiNleGVjdXRlVXNlckRlZmluZWQoUHJvdG9jb2xWZXJzaW9uLCBMaXN0KX0gYnV0IHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYWxyZWFkeSBpbiBub24tc2VyaWFsaXplZCBmb3JtLgotICAgICAqIFJlbWFpbmluZyBwYXJhbWV0ZXJzICgybmQgcGFyYW10ZXJzIGFuZCBhbGwgb3RoZXJzKSBhcmUgaW4ge0Bjb2RlIHBhcmFtZXRlcnN9LgotICAgICAqIFRoaXMgaXMgdXNlZCB0byBwcmV2ZW50IHN1cGVyZmx1b3VzIChkZSlzZXJpYWxpemF0aW9uIG9mIHRoZSBzdGF0ZSBvZiBhZ2dyZWdhdGVzLgotICAgICAqIE1lYW5zOiBzY2FsYXIgZnVuY3Rpb25zIG9mIGFnZ3JlZ2F0ZXMgYXJlIGNhbGxlZCB1c2luZyB0aGlzIHZhcmlhbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIE9iamVjdCBleGVjdXRlQWdncmVnYXRlVXNlckRlZmluZWQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgT2JqZWN0IGZpcnN0UGFyYW0sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKLSAgICB7Ci0gICAgICAgIE9iamVjdFtdIHBhcmFtcyA9IG5ldyBPYmplY3RbYXJnVHlwZXMuc2l6ZSgpXTsKLSAgICAgICAgcGFyYW1zWzBdID0gZmlyc3RQYXJhbTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwYXJhbXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBwYXJhbXNbaV0gPSBjb21wb3NlKHByb3RvY29sVmVyc2lvbiwgaSwgcGFyYW1ldGVycy5nZXQoaSAtIDEpKTsKLQotICAgICAgICByZXR1cm4gZXhlY3V0ZVNjcmlwdEludGVybmFsKHBhcmFtcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3QgZXhlY3V0ZVNjcmlwdEludGVybmFsKE9iamVjdFtdIHBhcmFtcykKLSAgICB7Ci0gICAgICAgIFNjcmlwdENvbnRleHQgc2NyaXB0Q29udGV4dCA9IG5ldyBTaW1wbGVTY3JpcHRDb250ZXh0KCk7Ci0gICAgICAgIHNjcmlwdENvbnRleHQuc2V0QXR0cmlidXRlKCJqYXZheC5zY3JpcHQuZmlsZW5hbWUiLCB0aGlzLm5hbWUudG9TdHJpbmcoKSwgU2NyaXB0Q29udGV4dC5FTkdJTkVfU0NPUEUpOwotICAgICAgICBCaW5kaW5ncyBiaW5kaW5ncyA9IHNjcmlwdENvbnRleHQuZ2V0QmluZGluZ3MoU2NyaXB0Q29udGV4dC5FTkdJTkVfU0NPUEUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIGJpbmRpbmdzLnB1dChhcmdOYW1lcy5nZXQoaSkudG9TdHJpbmcoKSwgcGFyYW1zW2ldKTsKLSAgICAgICAgYmluZGluZ3MucHV0KCJ1ZGZDb250ZXh0IiwgdWRmQ29udGV4dEJpbmRpbmcpOwotCi0gICAgICAgIE9iamVjdCByZXN1bHQ7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBIb3cgdG8gcHJldmVudCBDbGFzcy5mb3JOYW1lKCkgX3dpdGhvdXRfICJoZWxwIiBmcm9tIHRoZSBzY3JpcHQgZW5naW5lID8KLSAgICAgICAgICAgIC8vIE5PVEU6IE5hc2hvcm4gZW5mb3JjZXMgYSBzcGVjaWFsIHBlcm1pc3Npb24gdG8gYWxsb3cgY2xhc3MtbG9hZGluZywgd2hpY2ggaXMgbm90IGdyYW50ZWQgLSBzbyBpdCdzIGZpbmUuCi0KLSAgICAgICAgICAgIHJlc3VsdCA9IHNjcmlwdC5ldmFsKHNjcmlwdENvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTY3JpcHRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgQ2xhc3M8Pz4gamF2YVJldHVyblR5cGUgPSBVREhlbHBlci5hc0phdmFDbGFzcyhyZXR1cm5Db2RlYyk7Ci0gICAgICAgIENsYXNzPD8+IHJlc3VsdFR5cGUgPSByZXN1bHQuZ2V0Q2xhc3MoKTsKLSAgICAgICAgaWYgKCFqYXZhUmV0dXJuVHlwZS5pc0Fzc2lnbmFibGVGcm9tKHJlc3VsdFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgTnVtYmVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE51bWJlciByTnVtYmVyID0gKE51bWJlcikgcmVzdWx0OwotICAgICAgICAgICAgICAgIGlmIChqYXZhUmV0dXJuVHlwZSA9PSBJbnRlZ2VyLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByTnVtYmVyLmludFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoamF2YVJldHVyblR5cGUgPT0gTG9uZy5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gck51bWJlci5sb25nVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChqYXZhUmV0dXJuVHlwZSA9PSBTaG9ydC5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gck51bWJlci5zaG9ydFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoamF2YVJldHVyblR5cGUgPT0gQnl0ZS5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gck51bWJlci5ieXRlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChqYXZhUmV0dXJuVHlwZSA9PSBGbG9hdC5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gck51bWJlci5mbG9hdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoamF2YVJldHVyblR5cGUgPT0gRG91YmxlLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByTnVtYmVyLmRvdWJsZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoamF2YVJldHVyblR5cGUgPT0gQmlnSW50ZWdlci5jbGFzcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqYXZhUmV0dXJuVHlwZSA9PSBJbnRlZ2VyLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gck51bWJlci5pbnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqYXZhUmV0dXJuVHlwZSA9PSBTaG9ydC5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJOdW1iZXIuc2hvcnRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqYXZhUmV0dXJuVHlwZSA9PSBCeXRlLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gck51bWJlci5ieXRlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoamF2YVJldHVyblR5cGUgPT0gTG9uZy5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJOdW1iZXIubG9uZ1ZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGphdmFSZXR1cm5UeXBlID09IEZsb2F0LmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gck51bWJlci5mbG9hdFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGphdmFSZXR1cm5UeXBlID09IERvdWJsZS5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJOdW1iZXIuZG91YmxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoamF2YVJldHVyblR5cGUgPT0gQmlnSW50ZWdlci5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJOdW1iZXIgaW5zdGFuY2VvZiBCaWdEZWNpbWFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICgoQmlnRGVjaW1hbCkgck51bWJlcikudG9CaWdJbnRlZ2VyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyTnVtYmVyIGluc3RhbmNlb2YgRG91YmxlIHx8IHJOdW1iZXIgaW5zdGFuY2VvZiBGbG9hdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQmlnRGVjaW1hbChyTnVtYmVyLnRvU3RyaW5nKCkpLnRvQmlnSW50ZWdlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEJpZ0ludGVnZXIudmFsdWVPZihyTnVtYmVyLmxvbmdWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqYXZhUmV0dXJuVHlwZSA9PSBCaWdEZWNpbWFsLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RyaW5nIGMndG9yIG9mIEJpZ0RlY2ltYWwgaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIHZhbHVlT2YoZG91YmxlKQotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEJpZ0RlY2ltYWwock51bWJlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoamF2YVJldHVyblR5cGUgPT0gQmlnRGVjaW1hbC5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgLy8gU3RyaW5nIGMndG9yIG9mIEJpZ0RlY2ltYWwgaXMgbW9yZSBhY2N1cmF0ZSB0aGFuIHZhbHVlT2YoZG91YmxlKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQmlnRGVjaW1hbChyTnVtYmVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFVERkNvbnRleHRXcmFwcGVyIGV4dGVuZHMgQWJzdHJhY3RKU09iamVjdAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdEpTT2JqZWN0IGZSZXRVRFQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RKU09iamVjdCBmQXJnVURUOwotICAgICAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0SlNPYmplY3QgZlJldFR1cDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdEpTT2JqZWN0IGZBcmdUdXA7Ci0KLSAgICAgICAgVURGQ29udGV4dFdyYXBwZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmUmV0VURUID0gbmV3IEFic3RyYWN0SlNPYmplY3QoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbChPYmplY3QgdGhpeiwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWRmQ29udGV4dC5uZXdSZXR1cm5VRFRWYWx1ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBmQXJnVURUID0gbmV3IEFic3RyYWN0SlNPYmplY3QoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbChPYmplY3QgdGhpeiwgT2JqZWN0Li4uIGFyZ3MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSBpbnN0YW5jZW9mIFN0cmluZykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1ZGZDb250ZXh0Lm5ld0FyZ1VEVFZhbHVlKChTdHJpbmcpIGFyZ3NbMF0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSBpbnN0YW5jZW9mIE51bWJlcikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1ZGZDb250ZXh0Lm5ld0FyZ1VEVFZhbHVlKCgoTnVtYmVyKSBhcmdzWzBdKS5pbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNhbGwodGhpeiwgYXJncyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGZSZXRUdXAgPSBuZXcgQWJzdHJhY3RKU09iamVjdCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBjYWxsKE9iamVjdCB0aGl6LCBPYmplY3QuLi4gYXJncykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB1ZGZDb250ZXh0Lm5ld1JldHVyblR1cGxlVmFsdWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgZkFyZ1R1cCA9IG5ldyBBYnN0cmFjdEpTT2JqZWN0KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNhbGwoT2JqZWN0IHRoaXosIE9iamVjdC4uLiBhcmdzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWRmQ29udGV4dC5uZXdBcmdUdXBsZVZhbHVlKChTdHJpbmcpIGFyZ3NbMF0pOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSBpbnN0YW5jZW9mIE51bWJlcikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1ZGZDb250ZXh0Lm5ld0FyZ1R1cGxlVmFsdWUoKChOdW1iZXIpIGFyZ3NbMF0pLmludFZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuY2FsbCh0aGl6LCBhcmdzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRNZW1iZXIoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChuYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgIm5ld1JldHVyblVEVFZhbHVlIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZSZXRVRFQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAibmV3QXJnVURUVmFsdWUiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZkFyZ1VEVDsKLSAgICAgICAgICAgICAgICBjYXNlICJuZXdSZXR1cm5UdXBsZVZhbHVlIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZSZXRUdXA7Ci0gICAgICAgICAgICAgICAgY2FzZSAibmV3QXJnVHVwbGVWYWx1ZSI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmQXJnVHVwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldE1lbWJlcihuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1RpbWVGY3RzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9UaW1lRmN0cy5qYXZhCmluZGV4IDI3NTkyMTAuLmUxNTU3ZTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1RpbWVGY3RzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVGltZUZjdHMuamF2YQpAQCAtMTgsMTAgKzE4LDkgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnM7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC0zMiw2MSArMzEsNzcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5VVUlER2VuOwogCi1pbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKLQogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuUmVxdWVzdFZhbGlkYXRpb25zLmludmFsaWRSZXF1ZXN0OwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGltZUZjdHMKIHsKICAgICBwdWJsaWMgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUaW1lRmN0cy5jbGFzcyk7CiAKLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RnVuY3Rpb24+IGFsbCgpCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZ1bmN0aW9uc1RvKE5hdGl2ZUZ1bmN0aW9ucyBmdW5jdGlvbnMpCiAgICAgewotICAgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZihub3coIm5vdyIsIFRpbWVVVUlEVHlwZS5pbnN0YW5jZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdygiY3VycmVudHRpbWV1dWlkIiwgVGltZVVVSURUeXBlLmluc3RhbmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93KCJjdXJyZW50dGltZXN0YW1wIiwgVGltZXN0YW1wVHlwZS5pbnN0YW5jZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdygiY3VycmVudGRhdGUiLCBTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdygiY3VycmVudHRpbWUiLCBUaW1lVHlwZS5pbnN0YW5jZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblRpbWV1dWlkRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhUaW1ldXVpZEZjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZU9mRmN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml4VGltZXN0YW1wT2ZGY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvRGF0ZShUaW1lVVVJRFR5cGUuaW5zdGFuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1RpbWVzdGFtcChUaW1lVVVJRFR5cGUuaW5zdGFuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1VuaXhUaW1lc3RhbXAoVGltZVVVSURUeXBlLmluc3RhbmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Vbml4VGltZXN0YW1wKFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b0RhdGUoVGltZXN0YW1wVHlwZS5pbnN0YW5jZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvVW5peFRpbWVzdGFtcChTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvVGltZXN0YW1wKFNpbXBsZURhdGVUeXBlLmluc3RhbmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvb3JUaW1lc3RhbXBGdW5jdGlvbi5uZXdJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9vclRpbWVzdGFtcEZ1bmN0aW9uLm5ld0luc3RhbmNlV2l0aFN0YXJ0VGltZUFyZ3VtZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb29yVGltZVV1aWRGdW5jdGlvbi5uZXdJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9vclRpbWVVdWlkRnVuY3Rpb24ubmV3SW5zdGFuY2VXaXRoU3RhcnRUaW1lQXJndW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvb3JEYXRlRnVuY3Rpb24ubmV3SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvb3JEYXRlRnVuY3Rpb24ubmV3SW5zdGFuY2VXaXRoU3RhcnRUaW1lQXJndW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvb3JUaW1lKTsKKyAgICAgICAgZnVuY3Rpb25zLmFkZEFsbChuZXcgTm93RnVuY3Rpb24oIm5vdyIsIFRpbWVVVUlEVHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vd0Z1bmN0aW9uKCJjdXJyZW50X3RpbWV1dWlkIiwgVGltZVVVSURUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm93RnVuY3Rpb24oImN1cnJlbnRfdGltZXN0YW1wIiwgVGltZXN0YW1wVHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vd0Z1bmN0aW9uKCJjdXJyZW50X2RhdGUiLCBTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vd0Z1bmN0aW9uKCJjdXJyZW50X3RpbWUiLCBUaW1lVHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbWluVGltZXV1aWRGY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGltZXV1aWRGY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9EYXRlKFRpbWVVVUlEVHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9UaW1lc3RhbXAoVGltZVVVSURUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b1VuaXhUaW1lc3RhbXAoVGltZVVVSURUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b1VuaXhUaW1lc3RhbXAoVGltZXN0YW1wVHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9EYXRlKFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvVW5peFRpbWVzdGFtcChTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9UaW1lc3RhbXAoU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZsb29yVGltZXN0YW1wRnVuY3Rpb24ubmV3SW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGbG9vclRpbWVzdGFtcEZ1bmN0aW9uLm5ld0luc3RhbmNlV2l0aFN0YXJ0VGltZUFyZ3VtZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgRmxvb3JUaW1lVXVpZEZ1bmN0aW9uLm5ld0luc3RhbmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgRmxvb3JUaW1lVXVpZEZ1bmN0aW9uLm5ld0luc3RhbmNlV2l0aFN0YXJ0VGltZUFyZ3VtZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgRmxvb3JEYXRlRnVuY3Rpb24ubmV3SW5zdGFuY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGbG9vckRhdGVGdW5jdGlvbi5uZXdJbnN0YW5jZVdpdGhTdGFydFRpbWVBcmd1bWVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb29yVGltZSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBGdW5jdGlvbiBub3coZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFRlbXBvcmFsVHlwZTw/PiB0eXBlKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE5vd0Z1bmN0aW9uIGV4dGVuZHMgTmF0aXZlU2NhbGFyRnVuY3Rpb24KICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24obmFtZSwgdHlwZSkKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUZW1wb3JhbFR5cGU8Pz4gdHlwZTsKKworICAgICAgICBwdWJsaWMgTm93RnVuY3Rpb24oU3RyaW5nIG5hbWUsIFRlbXBvcmFsVHlwZTw/PiB0eXBlKQogICAgICAgICB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLm5vdygpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VwZXIobmFtZSwgdHlwZSk7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CiAKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQdXJlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGFzIGl0IHJldHVybnMgbm9uLWlkZW50aWNhbCByZXN1bHRzIGZvciBpZGVudGljYWwgYXJndW1lbnRzCi0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfTsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHlwZS5ub3coKTsKKyAgICAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBGdW5jdGlvbiBtaW5UaW1ldXVpZEZjdCA9IG5ldyBOYXRpdmVTY2FsYXJGdW5jdGlvbigibWludGltZXV1aWQiLCBUaW1lVVVJRFR5cGUuaW5zdGFuY2UsIFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UpCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1B1cmUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGFzIGl0IHJldHVybnMgbm9uLWlkZW50aWNhbCByZXN1bHRzIGZvciBpZGVudGljYWwgYXJndW1lbnRzCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdGl2ZUZ1bmN0aW9uIHdpdGhMZWdhY3lOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lKCkubmFtZTsKKyAgICAgICAgICAgIHJldHVybiBuYW1lLmNvbnRhaW5zKCJjdXJyZW50IikgPyBuZXcgTm93RnVuY3Rpb24oU3RyaW5nVXRpbHMucmVtb3ZlKG5hbWUsICdfJyksIHR5cGUpIDogbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlRnVuY3Rpb24gbWluVGltZXV1aWRGY3QgPSBuZXcgTWluVGltZXV1aWRGdW5jdGlvbihmYWxzZSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNaW5UaW1ldXVpZEZ1bmN0aW9uIGV4dGVuZHMgTmF0aXZlU2NhbGFyRnVuY3Rpb24KICAgICB7CisgICAgICAgIHB1YmxpYyBNaW5UaW1ldXVpZEZ1bmN0aW9uKGJvb2xlYW4gbGVnYWN5KQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihsZWdhY3kgPyAibWludGltZXV1aWQiIDogIm1pbl90aW1ldXVpZCIsIFRpbWVVVUlEVHlwZS5pbnN0YW5jZSwgVGltZXN0YW1wVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBwYXJhbWV0ZXJzLmdldCgwKTsKQEAgLTk1LDEwICsxMTAsMjQgQEAKIAogICAgICAgICAgICAgcmV0dXJuIFRpbWVVVUlELm1pbkF0VW5peE1pbGxpcyhUaW1lc3RhbXBUeXBlLmluc3RhbmNlLmNvbXBvc2UoYmIpLmdldFRpbWUoKSkudG9CeXRlcygpOwogICAgICAgICB9Ci0gICAgfTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRnVuY3Rpb24gbWF4VGltZXV1aWRGY3QgPSBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24oIm1heHRpbWV1dWlkIiwgVGltZVVVSURUeXBlLmluc3RhbmNlLCBUaW1lc3RhbXBUeXBlLmluc3RhbmNlKQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdGl2ZUZ1bmN0aW9uIHdpdGhMZWdhY3lOYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNaW5UaW1ldXVpZEZ1bmN0aW9uKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVGdW5jdGlvbiBtYXhUaW1ldXVpZEZjdCA9IG5ldyBNYXhUaW1ldXVpZEZ1bmN0aW9uKGZhbHNlKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE1heFRpbWV1dWlkRnVuY3Rpb24gZXh0ZW5kcyBOYXRpdmVTY2FsYXJGdW5jdGlvbgogICAgIHsKKyAgICAgICAgcHVibGljIE1heFRpbWV1dWlkRnVuY3Rpb24oYm9vbGVhbiBsZWdhY3kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGxlZ2FjeSA/ICJtYXh0aW1ldXVpZCIgOiAibWF4X3RpbWV1dWlkIiwgVGltZVVVSURUeXBlLmluc3RhbmNlLCBUaW1lc3RhbXBUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKICAgICAgICAgewogICAgICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IHBhcmFtZXRlcnMuZ2V0KDApOwpAQCAtMTA3LDEzNyArMTM2LDE0NiBAQAogCiAgICAgICAgICAgICByZXR1cm4gVGltZVVVSUQubWF4QXRVbml4TWlsbGlzKFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UuY29tcG9zZShiYikuZ2V0VGltZSgpKS50b0J5dGVzKCk7CiAgICAgICAgIH0KLSAgICB9OwogCi0gICAgLyoqCi0gICAgICogRnVuY3Rpb24gdGhhdCBjb252ZXJ0IGEgdmFsdWUgb2YgPGNvZGU+VElNRVVVSUQ8L2NvZGU+IGludG8gYSB2YWx1ZSBvZiB0eXBlIDxjb2RlPlRJTUVTVEFNUDwvY29kZT4uCi0gICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgdGhlIHtAbGluayAjdG9UaW1lc3RhbXB9IGZ1bmN0aW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVTY2FsYXJGdW5jdGlvbiBkYXRlT2ZGY3QgPSBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24oImRhdGVvZiIsIFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UsIFRpbWVVVUlEVHlwZS5pbnN0YW5jZSkKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBoYXNMb2dnZWREZXByZWNhdGlvbldhcm5pbmc7Ci0KLSAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTmF0aXZlRnVuY3Rpb24gd2l0aExlZ2FjeU5hbWUoKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWhhc0xvZ2dlZERlcHJlY2F0aW9uV2FybmluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoYXNMb2dnZWREZXByZWNhdGlvbldhcm5pbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJUaGUgZnVuY3Rpb24gJ2RhdGVvZicgaXMgZGVwcmVjYXRlZC4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFVzZSB0aGUgZnVuY3Rpb24gJ3RvVGltZXN0YW1wJyBpbnN0ZWFkLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBCeXRlQnVmZmVyIGJiID0gcGFyYW1ldGVycy5nZXQoMCk7Ci0gICAgICAgICAgICBpZiAoYmIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgbG9uZyB0aW1lSW5NaWxsaXMgPSBUaW1lVVVJRC5kZXNlcmlhbGl6ZShiYikudW5peChNSUxMSVNFQ09ORFMpOwotICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHRpbWVJbk1pbGxpcyk7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1heFRpbWV1dWlkRnVuY3Rpb24odHJ1ZSk7CiAgICAgICAgIH0KLSAgICB9OworICAgIH0KIAogICAgIC8qKgotICAgICAqIEZ1bmN0aW9uIHRoYXQgY29udmVydCBhIHZhbHVlIG9mIHR5cGUgPGNvZGU+VElNRVVVSUQ8L2NvZGU+IGludG8gYW4gVU5JWCB0aW1lc3RhbXAuCi0gICAgICogQGRlcHJlY2F0ZWQgUmVwbGFjZWQgYnkgdGhlIHtAbGluayAjdG9Vbml4VGltZXN0YW1wfSBmdW5jdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlU2NhbGFyRnVuY3Rpb24gdW5peFRpbWVzdGFtcE9mRmN0ID0gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKCJ1bml4dGltZXN0YW1wb2YiLCBMb25nVHlwZS5pbnN0YW5jZSwgVGltZVVVSURUeXBlLmluc3RhbmNlKQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGhhc0xvZ2dlZERlcHJlY2F0aW9uV2FybmluZzsKLQotICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNMb2dnZWREZXByZWNhdGlvbldhcm5pbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaGFzTG9nZ2VkRGVwcmVjYXRpb25XYXJuaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiVGhlIGZ1bmN0aW9uICd1bml4dGltZXN0YW1wb2YnIGlzIGRlcHJlY2F0ZWQuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBVc2UgdGhlIGZ1bmN0aW9uICd0b1VuaXhUaW1lc3RhbXAnIGluc3RlYWQuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBwYXJhbWV0ZXJzLmdldCgwKTsKLSAgICAgICAgICAgIGlmIChiYiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoVGltZVVVSUQuZGVzZXJpYWxpemUoYmIpLnVuaXgoTUlMTElTRUNPTkRTKSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAvKioKLSAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNvbnZlcnQgYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW50byBhIDxjb2RlPkRBVEU8L2NvZGU+LgotICAgICogQHBhcmFtIHR5cGUgdGhlIHRlbXBvcmFsIHR5cGUKLSAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNvbnZlcnQgYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW50byBhIDxjb2RlPkRBVEU8L2NvZGU+LgotICAgICovCi0gICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZVNjYWxhckZ1bmN0aW9uIHRvRGF0ZShmaW5hbCBUZW1wb3JhbFR5cGU8Pz4gdHlwZSkKLSAgIHsKLSAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKCJ0b2RhdGUiLCBTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZSwgdHlwZSkKLSAgICAgICB7Ci0gICAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBCeXRlQnVmZmVyIGJiID0gcGFyYW1ldGVycy5nZXQoMCk7Ci0gICAgICAgICAgICAgICBpZiAoYmIgPT0gbnVsbCB8fCAhYmIuaGFzUmVtYWluaW5nKCkpCi0gICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgICAgIGxvbmcgbWlsbGlzID0gdHlwZS50b1RpbWVJbk1pbGxpcyhiYik7Ci0gICAgICAgICAgICAgICByZXR1cm4gU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UuZnJvbVRpbWVJbk1pbGxpcyhtaWxsaXMpOwotICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTW9ub3RvbmljKCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgIH0KLSAgICAgICB9OwotICAgfQotCi0gICAvKioKLSAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNvbnZlcnQgYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW50byBhIDxjb2RlPlRJTUVTVEFNUDwvY29kZT4uCi0gICAgKiBAcGFyYW0gdHlwZSB0aGUgdGVtcG9yYWwgdHlwZQotICAgICogQHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgY29udmVydCBhIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpbnRvIGEgPGNvZGU+VElNRVNUQU1QPC9jb2RlPi4KLSAgICAqLwotICAgcHVibGljIHN0YXRpYyBmaW5hbCBOYXRpdmVTY2FsYXJGdW5jdGlvbiB0b1RpbWVzdGFtcChmaW5hbCBUZW1wb3JhbFR5cGU8Pz4gdHlwZSkKLSAgIHsKLSAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVNjYWxhckZ1bmN0aW9uKCJ0b3RpbWVzdGFtcCIsIFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UsIHR5cGUpCi0gICAgICAgewotICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IHBhcmFtZXRlcnMuZ2V0KDApOwotICAgICAgICAgICAgICAgaWYgKGJiID09IG51bGwgfHwgIWJiLmhhc1JlbWFpbmluZygpKQotICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgICAgICAgICBsb25nIG1pbGxpcyA9IHR5cGUudG9UaW1lSW5NaWxsaXMoYmIpOwotICAgICAgICAgICAgICAgcmV0dXJuIFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UuZnJvbVRpbWVJbk1pbGxpcyhtaWxsaXMpOwotICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTW9ub3RvbmljKCkKLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgIH0KLSAgICAgICB9OwotICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY29udmVydCBhIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpbnRvIGFuIFVOSVggdGltZXN0YW1wLgorICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIGEgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGludG8gYSB7QGNvZGUgREFURX0uCisgICAgICoKICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdGVtcG9yYWwgdHlwZQotICAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNvbnZlcnQgYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW50byBhbiBVTklYIHRpbWVzdGFtcC4KKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0IGEgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGludG8gYSA8Y29kZT5EQVRFPC9jb2RlPi4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5hdGl2ZVNjYWxhckZ1bmN0aW9uIHRvVW5peFRpbWVzdGFtcChmaW5hbCBUZW1wb3JhbFR5cGU8Pz4gdHlwZSkKKyAgICBwdWJsaWMgc3RhdGljIE5hdGl2ZVNjYWxhckZ1bmN0aW9uIHRvRGF0ZShUZW1wb3JhbFR5cGU8Pz4gdHlwZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24oInRvdW5peHRpbWVzdGFtcCIsIExvbmdUeXBlLmluc3RhbmNlLCB0eXBlKQorICAgICAgICByZXR1cm4gbmV3IFRvRGF0ZUZ1bmN0aW9uKHR5cGUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUb0RhdGVGdW5jdGlvbiBleHRlbmRzIE5hdGl2ZVNjYWxhckZ1bmN0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIFRlbXBvcmFsVHlwZTw/PiB0eXBlOworCisgICAgICAgIHB1YmxpYyBUb0RhdGVGdW5jdGlvbihUZW1wb3JhbFR5cGU8Pz4gdHlwZSwgYm9vbGVhbiB1c2VMZWdhY3lOYW1lKQogICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1ldGVycykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGJiID0gcGFyYW1ldGVycy5nZXQoMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJiID09IG51bGwgfHwgIWJiLmhhc1JlbWFpbmluZygpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIHN1cGVyKHVzZUxlZ2FjeU5hbWUgPyAidG9kYXRlIiA6ICJ0b19kYXRlIiwgU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UsIHR5cGUpOworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHR5cGUudG9UaW1lSW5NaWxsaXMoYmIpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGJiID0gcGFyYW1ldGVycy5nZXQoMCk7CisgICAgICAgICAgICBpZiAoYmIgPT0gbnVsbCB8fCAhYmIuaGFzUmVtYWluaW5nKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNb25vdG9uaWMoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9OworICAgICAgICAgICAgbG9uZyBtaWxsaXMgPSB0eXBlLnRvVGltZUluTWlsbGlzKGJiKTsKKyAgICAgICAgICAgIHJldHVybiBTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZS5mcm9tVGltZUluTWlsbGlzKG1pbGxpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNb25vdG9uaWMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTmF0aXZlRnVuY3Rpb24gd2l0aExlZ2FjeU5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRvRGF0ZUZ1bmN0aW9uKHR5cGUsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW50byBhIHtAY29kZSBUSU1FU1RBTVB9LgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIHRlbXBvcmFsIHR5cGUKKyAgICAgKiBAcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0IGEgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGludG8gYSB7QGNvZGUgVElNRVNUQU1QfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE5hdGl2ZVNjYWxhckZ1bmN0aW9uIHRvVGltZXN0YW1wKFRlbXBvcmFsVHlwZTw/PiB0eXBlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb1RpbWVzdGFtcEZ1bmN0aW9uKHR5cGUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUb1RpbWVzdGFtcEZ1bmN0aW9uIGV4dGVuZHMgTmF0aXZlU2NhbGFyRnVuY3Rpb24KKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgVGVtcG9yYWxUeXBlPD8+IHR5cGU7CisKKyAgICAgICAgcHVibGljIFRvVGltZXN0YW1wRnVuY3Rpb24oVGVtcG9yYWxUeXBlPD8+IHR5cGUsIGJvb2xlYW4gdXNlTGVnYWN5TmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIodXNlTGVnYWN5TmFtZSA/ICJ0b3RpbWVzdGFtcCIgOiAidG9fdGltZXN0YW1wIiwgVGltZXN0YW1wVHlwZS5pbnN0YW5jZSwgdHlwZSk7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGJiID0gcGFyYW1ldGVycy5nZXQoMCk7CisgICAgICAgICAgICBpZiAoYmIgPT0gbnVsbCB8fCAhYmIuaGFzUmVtYWluaW5nKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIGxvbmcgbWlsbGlzID0gdHlwZS50b1RpbWVJbk1pbGxpcyhiYik7CisgICAgICAgICAgICByZXR1cm4gVGltZXN0YW1wVHlwZS5pbnN0YW5jZS5mcm9tVGltZUluTWlsbGlzKG1pbGxpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNb25vdG9uaWMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTmF0aXZlRnVuY3Rpb24gd2l0aExlZ2FjeU5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRvVGltZXN0YW1wRnVuY3Rpb24odHlwZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyBhIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpbnRvIGEgVU5JWCB0aW1lc3RhbXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdGVtcG9yYWwgdHlwZQorICAgICAqIEByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGNvbnZlcnQgYSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW50byBhIFVOSVggdGltZXN0YW1wLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTmF0aXZlU2NhbGFyRnVuY3Rpb24gdG9Vbml4VGltZXN0YW1wKFRlbXBvcmFsVHlwZTw/PiB0eXBlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUb1VuaXhUaW1lc3RhbXBGdW5jdGlvbih0eXBlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVG9Vbml4VGltZXN0YW1wRnVuY3Rpb24gZXh0ZW5kcyBOYXRpdmVTY2FsYXJGdW5jdGlvbgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUZW1wb3JhbFR5cGU8Pz4gdHlwZTsKKworICAgICAgICBwcml2YXRlIFRvVW5peFRpbWVzdGFtcEZ1bmN0aW9uKFRlbXBvcmFsVHlwZTw/PiB0eXBlLCBib29sZWFuIHVzZUxlZ2FjeU5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHVzZUxlZ2FjeU5hbWUgPyAidG91bml4dGltZXN0YW1wIiA6ICJ0b191bml4X3RpbWVzdGFtcCIsIExvbmdUeXBlLmluc3RhbmNlLCB0eXBlKTsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBwYXJhbWV0ZXJzLmdldCgwKTsKKyAgICAgICAgICAgIGlmIChiYiA9PSBudWxsIHx8ICFiYi5oYXNSZW1haW5pbmcoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHR5cGUudG9UaW1lSW5NaWxsaXMoYmIpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc01vbm90b25pYygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOYXRpdmVGdW5jdGlvbiB3aXRoTGVnYWN5TmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVG9Vbml4VGltZXN0YW1wRnVuY3Rpb24odHlwZSwgdHJ1ZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTI0NSwxNCArMjgzLDE0IEBACiAgICAgICovCiAgICAgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIEZsb29yRnVuY3Rpb24gZXh0ZW5kcyBOYXRpdmVTY2FsYXJGdW5jdGlvbgogICAgICB7Ci0gICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb25nIFpFUk8gPSBMb25nLnZhbHVlT2YoMCk7CisgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb25nIFpFUk8gPSAwTDsKIAogICAgICAgICAgcHJvdGVjdGVkIEZsb29yRnVuY3Rpb24oQWJzdHJhY3RUeXBlPD8+IHJldHVyblR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4uLi4gYXJnc1R5cGUpCiAgICAgICAgICB7CiAgICAgICAgICAgICAgc3VwZXIoImZsb29yIiwgcmV0dXJuVHlwZSwgYXJnc1R5cGUpOwogICAgICAgICAgICAgIC8vIFRoZSBmdW5jdGlvbiBjYW4gYWNjZXB0IGVpdGhlciAyIHBhcmFtZXRlcnMgKHRpbWUgYW5kIGR1cmF0aW9uKSBvciAzIHBhcmFtZXRlcnMgKHRpbWUsIGR1cmF0aW9uIGFuZCBzdGFydFRpbWUpcgotICAgICAgICAgICAgIGFzc2VydCBhcmdzVHlwZS5sZW5ndGggPT0gMiB8fCBhcmdzVHlwZS5sZW5ndGggPT0gMzsgCisgICAgICAgICAgICAgYXNzZXJ0IGFyZ3NUeXBlLmxlbmd0aCA9PSAyIHx8IGFyZ3NUeXBlLmxlbmd0aCA9PSAzOwogICAgICAgICAgfQogCiAgICAgICAgICBAT3ZlcnJpZGUKQEAgLTUwOSw0ICs1NDcsMyBAQAogICAgICAgICAgfQogICAgICB9OwogIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVG9Kc29uRmN0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9Ub0pzb25GY3QuamF2YQppbmRleCBkMGYyYjBiLi44ZGQ3ZmQ3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9Ub0pzb25GY3QuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9Ub0pzb25GY3QuamF2YQpAQCAtMjgsMzkgKzI4LDU5IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIAoraW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKKwogcHVibGljIGNsYXNzIFRvSnNvbkZjdCBleHRlbmRzIE5hdGl2ZVNjYWxhckZ1bmN0aW9uCiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBGdW5jdGlvbk5hbWUgTkFNRSA9IEZ1bmN0aW9uTmFtZS5uYXRpdmVGdW5jdGlvbigidG9qc29uIik7Ci0KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8QWJzdHJhY3RUeXBlPD8+LCBUb0pzb25GY3Q+IGluc3RhbmNlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CiAKLSAgICBwdWJsaWMgc3RhdGljIFRvSnNvbkZjdCBnZXRJbnN0YW5jZShMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMpIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgVG9Kc29uRmN0IGdldEluc3RhbmNlKFN0cmluZyBuYW1lLCBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMpIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgaWYgKGFyZ1R5cGVzLnNpemUoKSAhPSAxKQotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoInRvSnNvbigpIG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQgKGdvdCAlZCkiLCBhcmdUeXBlcy5zaXplKCkpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihmb3JtYXQoIiVzKCkgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudCAoZ290ICVkKSIsIG5hbWUsIGFyZ1R5cGVzLnNpemUoKSkpOwogCiAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBmcm9tVHlwZSA9IGFyZ1R5cGVzLmdldCgwKTsKICAgICAgICAgVG9Kc29uRmN0IGZ1bmMgPSBpbnN0YW5jZXMuZ2V0KGZyb21UeXBlKTsKICAgICAgICAgaWYgKGZ1bmMgPT0gbnVsbCkKICAgICAgICAgewotICAgICAgICAgICAgZnVuYyA9IG5ldyBUb0pzb25GY3QoZnJvbVR5cGUpOworICAgICAgICAgICAgZnVuYyA9IG5ldyBUb0pzb25GY3QobmFtZSwgZnJvbVR5cGUpOwogICAgICAgICAgICAgaW5zdGFuY2VzLnB1dChmcm9tVHlwZSwgZnVuYyk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZ1bmM7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBUb0pzb25GY3QoQWJzdHJhY3RUeXBlPD8+IGFyZ1R5cGUpCisgICAgcHJpdmF0ZSBUb0pzb25GY3QoU3RyaW5nIG5hbWUsIEFic3RyYWN0VHlwZTw/PiBhcmdUeXBlKQogICAgIHsKLSAgICAgICAgc3VwZXIoInRvanNvbiIsIFVURjhUeXBlLmluc3RhbmNlLCBhcmdUeXBlKTsKKyAgICAgICAgc3VwZXIobmFtZSwgVVRGOFR5cGUuaW5zdGFuY2UsIGFyZ1R5cGUpOwogICAgIH0KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIGFzc2VydCBwYXJhbWV0ZXJzLnNpemUoKSA9PSAxIDogIkV4cGVjdGVkIDEgYXJndW1lbnQgZm9yIHRvSnNvbigpLCBidXQgZ290ICIgKyBwYXJhbWV0ZXJzLnNpemUoKTsKKyAgICAgICAgYXNzZXJ0IHBhcmFtZXRlcnMuc2l6ZSgpID09IDEgOiBmb3JtYXQoIkV4cGVjdGVkIDEgYXJndW1lbnQgZm9yICVzKCksIGJ1dCBnb3QgJWQiLCBuYW1lLm5hbWUsIHBhcmFtZXRlcnMuc2l6ZSgpKTsKICAgICAgICAgQnl0ZUJ1ZmZlciBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJzLmdldCgwKTsKICAgICAgICAgaWYgKHBhcmFtZXRlciA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJudWxsIik7CiAKICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKGFyZ1R5cGVzLmdldCgwKS50b0pTT05TdHJpbmcocGFyYW1ldGVyLCBwcm90b2NvbFZlcnNpb24pKTsKICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRnVuY3Rpb25zVG8oTmF0aXZlRnVuY3Rpb25zIGZ1bmN0aW9ucykKKyAgICB7CisgICAgICAgIGZ1bmN0aW9ucy5hZGQobmV3IEZhY3RvcnkoInRvX2pzb24iKSk7CisgICAgICAgIGZ1bmN0aW9ucy5hZGQobmV3IEZhY3RvcnkoInRvanNvbiIpKTsgLy8gZGVwcmVjYXRlZCBwcmUtNS4wIG5hbWUKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGV4dGVuZHMgRnVuY3Rpb25GYWN0b3J5CisgICAgeworICAgICAgICBwdWJsaWMgRmFjdG9yeShTdHJpbmcgbmFtZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIobmFtZSwgRnVuY3Rpb25QYXJhbWV0ZXIuYW55VHlwZShmYWxzZSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVG9Kc29uRmN0LmdldEluc3RhbmNlKG5hbWUubmFtZSwgYXJnVHlwZXMpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVG9rZW5GY3QuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1Rva2VuRmN0LmphdmEKaW5kZXggZTkzMDg0Zi4uZmI2MTg1YiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVG9rZW5GY3QuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9Ub2tlbkZjdC5qYXZhCkBAIC0yMCw3ICsyMCw5IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQXNzaWdubWVudFRlc3RhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNCdWlsZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwpAQCAtMzcsOSArMzksOSBAQAogICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgQWJzdHJhY3RUeXBlW10gZ2V0S2V5VHlwZXMoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICBwcml2YXRlIHN0YXRpYyBBYnN0cmFjdFR5cGU8Pz5bXSBnZXRLZXlUeXBlcyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKQogICAgIHsKLSAgICAgICAgQWJzdHJhY3RUeXBlW10gdHlwZXMgPSBuZXcgQWJzdHJhY3RUeXBlW21ldGFkYXRhLnBhcnRpdGlvbktleUNvbHVtbnMoKS5zaXplKCldOworICAgICAgICBBYnN0cmFjdFR5cGU8Pz5bXSB0eXBlcyA9IG5ldyBBYnN0cmFjdFR5cGVbbWV0YWRhdGEucGFydGl0aW9uS2V5Q29sdW1ucygpLnNpemUoKV07CiAgICAgICAgIGludCBpID0gMDsKICAgICAgICAgZm9yIChDb2x1bW5NZXRhZGF0YSBkZWYgOiBtZXRhZGF0YS5wYXJ0aXRpb25LZXlDb2x1bW5zKCkpCiAgICAgICAgICAgICB0eXBlc1tpKytdID0gZGVmLnR5cGU7CkBAIC01OCw0ICs2MCwzNyBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtZXRhZGF0YS5wYXJ0aXRpb25lci5nZXRUb2tlbkZhY3RvcnkoKS50b0J5dGVBcnJheShtZXRhZGF0YS5wYXJ0aXRpb25lci5nZXRUb2tlbihidWlsZGVyLmJ1aWxkKCkuc2VyaWFsaXplQXNQYXJ0aXRpb25LZXkoKSkpOwogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGdW5jdGlvbnNUbyhOYXRpdmVGdW5jdGlvbnMgZnVuY3Rpb25zKQorICAgIHsKKyAgICAgICAgZnVuY3Rpb25zLmFkZChuZXcgRnVuY3Rpb25GYWN0b3J5KCJ0b2tlbiIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE5hdGl2ZUZ1bmN0aW9uIGdldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDw/IGV4dGVuZHMgQXNzaWdubWVudFRlc3RhYmxlPiBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWNlaXZlcktleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlY2VpdmVyVGFibGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVyS2V5c3BhY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKCJObyByZWNlaXZlciBrZXlzcGFjZSBoYXMgYmVlbiBzcGVjaWZpZWQgZm9yIGZ1bmN0aW9uICIgKyBuYW1lKTsKKworICAgICAgICAgICAgICAgIGlmIChyZWNlaXZlclRhYmxlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigiTm8gcmVjZWl2ZXIgdGFibGUgaGFzIGJlZW4gc3BlY2lmaWVkIGZvciBmdW5jdGlvbiAiICsgbmFtZSk7CisKKyAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhID0gU2NoZW1hLmluc3RhbmNlLmdldFRhYmxlTWV0YWRhdGEocmVjZWl2ZXJLZXlzcGFjZSwgcmVjZWl2ZXJUYWJsZSk7CisgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJUaGUgcmVjZWl2ZXIgdGFibGUgJXMuJXMgc3BlY2lmaWVkIGJ5IGNhbGwgdG8gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiAlcyBoYXNuJ3QgYmVlbiBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyS2V5c3BhY2UsIHJlY2VpdmVyVGFibGUsIG5hbWUpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW5GY3QobWV0YWRhdGEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiU2hvdWxkIGJlIHVucmVhY2hhYmxlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1VEQWdncmVnYXRlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9VREFnZ3JlZ2F0ZS5qYXZhCmluZGV4IGI2ODYzMjguLjY3ZTk2Y2QgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1VEQWdncmVnYXRlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVURBZ2dyZWdhdGUuamF2YQpAQCAtMjYsMTQgKzI2LDEzIEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNxbEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5TY2hlbWFFbGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLnR5cGVzLlR5cGVDb2RlYzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVzZXJUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5EaWZmZXJlbmNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5GdW5jdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlVzZXJGdW5jdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhY2luZy5UcmFjaW5nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiAKQEAgLTQ0LDcgKzQzLDcgQEAKIC8qKgogICogQmFzZSBjbGFzcyBmb3IgdXNlci1kZWZpbmVkLWFnZ3JlZ2F0ZXMuCiAgKi8KLXB1YmxpYyBjbGFzcyBVREFnZ3JlZ2F0ZSBleHRlbmRzIEFic3RyYWN0RnVuY3Rpb24gaW1wbGVtZW50cyBBZ2dyZWdhdGVGdW5jdGlvbiwgU2NoZW1hRWxlbWVudAorcHVibGljIGNsYXNzIFVEQWdncmVnYXRlIGV4dGVuZHMgVXNlckZ1bmN0aW9uIGltcGxlbWVudHMgQWdncmVnYXRlRnVuY3Rpb24KIHsKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihVREFnZ3JlZ2F0ZS5jbGFzcyk7CiAKQEAgLTk1LDcgKzk0LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBVREZ1bmN0aW9uIGZpbmRGdW5jdGlvbihGdW5jdGlvbk5hbWUgdWRhTmFtZSwgQ29sbGVjdGlvbjxVREZ1bmN0aW9uPiBmdW5jdGlvbnMsIEZ1bmN0aW9uTmFtZSBuYW1lLCBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJndW1lbnRzKQogICAgIHsKICAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmIC0+IGYubmFtZSgpLmVxdWFscyhuYW1lKSAmJiBGdW5jdGlvbnMudHlwZXNNYXRjaChmLmFyZ1R5cGVzKCksIGFyZ3VtZW50cykpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGYgLT4gZi5uYW1lKCkuZXF1YWxzKG5hbWUpICYmIGYudHlwZXNNYXRjaChhcmd1bWVudHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRGaXJzdCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAub3JFbHNlVGhyb3coKCkgLT4gbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVW5hYmxlIHRvIGZpbmQgZnVuY3Rpb24gJXMgcmVmZXJlbmNlZCBieSBVREEgJXMiLCBuYW1lLCB1ZGFOYW1lKSkpOwogICAgIH0KQEAgLTE1MCwxMSArMTQ5LDYgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaXNOYXRpdmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQogICAgIHB1YmxpYyBTY2FsYXJGdW5jdGlvbiBzdGF0ZUZ1bmN0aW9uKCkKICAgICB7CiAgICAgICAgIHJldHVybiBzdGF0ZUZ1bmN0aW9uOwpAQCAtMzI5LDcgKzMyMyw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpCiAgICAgewotICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoQ29kZShuYW1lLCBGdW5jdGlvbnMudHlwZUhhc2hDb2RlKGFyZ1R5cGVzKSwgRnVuY3Rpb25zLnR5cGVIYXNoQ29kZShyZXR1cm5UeXBlKSwgc3RhdGVGdW5jdGlvbiwgZmluYWxGdW5jdGlvbiwgc3RhdGVUeXBlLCBpbml0Y29uZCk7CisgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKG5hbWUsIFVzZXJGdW5jdGlvbnMudHlwZUhhc2hDb2RlKGFyZ1R5cGVzKSwgVXNlckZ1bmN0aW9ucy50eXBlSGFzaENvZGUocmV0dXJuVHlwZSksIHN0YXRlRnVuY3Rpb24sIGZpbmFsRnVuY3Rpb24sIHN0YXRlVHlwZSwgaW5pdGNvbmQpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVURGQnl0ZUNvZGVWZXJpZmllci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVURGQnl0ZUNvZGVWZXJpZmllci5qYXZhCmluZGV4IGFiOTEzYjQuLmUwYjE4MDYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1VERkJ5dGVDb2RlVmVyaWZpZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9VREZCeXRlQ29kZVZlcmlmaWVyLmphdmEKQEAgLTM1LDYgKzM1LDggQEAKIGltcG9ydCBvcmcub2JqZWN0d2ViLmFzbS5NZXRob2RWaXNpdG9yOwogaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXMuQVNNX0JZVEVDT0RFX1ZFUlNJT047CisKIC8qKgogICogVmVyaWZpZXMgSmF2YSBVREYgYnl0ZSBjb2RlLgogICogQ2hlY2tzIGZvciBkaXNhbGxvd2VkIG1ldGhvZCBjYWxscyAoZS5nLiB7QGNvZGUgT2JqZWN0LmZpbmFsaXplKCl9KSwKQEAgLTg0LDcgKzg2LDcgQEAKICAgICB7CiAgICAgICAgIFN0cmluZyBjbHNOYW1lU2wgPSBjbHNOYW1lLnJlcGxhY2UoJy4nLCAnLycpOwogICAgICAgICBTZXQ8U3RyaW5nPiBlcnJvcnMgPSBuZXcgVHJlZVNldDw+KCk7IC8vIGl0J3MgYSBUcmVlU2V0IGZvciB1bml0IHRlc3RzCi0gICAgICAgIENsYXNzVmlzaXRvciBjbGFzc1Zpc2l0b3IgPSBuZXcgQ2xhc3NWaXNpdG9yKE9wY29kZXMuQVNNNykKKyAgICAgICAgQ2xhc3NWaXNpdG9yIGNsYXNzVmlzaXRvciA9IG5ldyBDbGFzc1Zpc2l0b3IoQVNNX0JZVEVDT0RFX1ZFUlNJT04pCiAgICAgICAgIHsKICAgICAgICAgICAgIHB1YmxpYyBGaWVsZFZpc2l0b3IgdmlzaXRGaWVsZChpbnQgYWNjZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIFN0cmluZyBzaWduYXR1cmUsIE9iamVjdCB2YWx1ZSkKICAgICAgICAgICAgIHsKQEAgLTE2MCw3ICsxNjIsNyBAQAogCiAgICAgICAgIEV4ZWN1dGVJbXBsVmlzaXRvcihTZXQ8U3RyaW5nPiBlcnJvcnMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKE9wY29kZXMuQVNNNyk7CisgICAgICAgICAgICBzdXBlcihBU01fQllURUNPREVfVkVSU0lPTik7CiAgICAgICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9yczsKICAgICAgICAgfQogCkBAIC0yMTAsNyArMjEyLDcgQEAKIAogICAgICAgICBDb25zdHJ1Y3RvclZpc2l0b3IoU2V0PFN0cmluZz4gZXJyb3JzKQogICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihPcGNvZGVzLkFTTTcpOworICAgICAgICAgICAgc3VwZXIoQVNNX0JZVEVDT0RFX1ZFUlNJT04pOwogICAgICAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVURGRXhlY3V0b3JTZXJ2aWNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9VREZFeGVjdXRvclNlcnZpY2UuamF2YQppbmRleCAzYjc2MzFmLi4xOTcwNTQ1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9VREZFeGVjdXRvclNlcnZpY2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9VREZFeGVjdXRvclNlcnZpY2UuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yQmFzZTsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVURGX0VYRUNVVE9SX1RIUkVBRF9LRUVQQUxJVkVfTVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzLmdldEF2YWlsYWJsZVByb2Nlc3NvcnM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZXMubmV3QmxvY2tpbmdRdWV1ZTsKIApAQCAtMzMsNyArMzQsNyBAQAogICovCiBmaW5hbCBjbGFzcyBVREZFeGVjdXRvclNlcnZpY2UgZXh0ZW5kcyBUaHJlYWRQb29sRXhlY3V0b3JCYXNlCiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtFRVBBTElWRSA9IEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLnVkZl9leGVjdXRvcl90aHJlYWRfa2VlcGFsaXZlX21zIiwgMzAwMDApOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBLRUVQQUxJVkUgPSBVREZfRVhFQ1VUT1JfVEhSRUFEX0tFRVBBTElWRV9NUy5nZXRJbnQoKTsKIAogICAgIHB1YmxpYyBVREZFeGVjdXRvclNlcnZpY2UoTmFtZWRUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnksIFN0cmluZyBqbXhQYXRoKQogICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1VERnVuY3Rpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1VERnVuY3Rpb24uamF2YQppbmRleCA1ZWYwNjViLi41ODQ1NGE0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9VREZ1bmN0aW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVURGdW5jdGlvbi5qYXZhCkBAIC00Niw3ICs0Niw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtbklkZW50aWZpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DcWxCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuU2NoZW1hRWxlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy50eXBlcy5EYXRhVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy50eXBlcy5UeXBlQ29kZWM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CkBAIC02Nyw3ICs2Niw3IEBACiAvKioKICAqIEJhc2UgY2xhc3MgZm9yIFVzZXIgRGVmaW5lZCBGdW5jdGlvbnMuCiAgKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVREZ1bmN0aW9uIGV4dGVuZHMgQWJzdHJhY3RGdW5jdGlvbiBpbXBsZW1lbnRzIFNjYWxhckZ1bmN0aW9uLCBTY2hlbWFFbGVtZW50CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVURGdW5jdGlvbiBleHRlbmRzIFVzZXJGdW5jdGlvbiBpbXBsZW1lbnRzIFNjYWxhckZ1bmN0aW9uCiB7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVURGdW5jdGlvbi5jbGFzcyk7CiAKQEAgLTI2NywxMyArMjY2LDcgQEAKICAgICB7CiAgICAgICAgIGFzc2VydFVkZnNFbmFibGVkKGxhbmd1YWdlKTsKIAotICAgICAgICBzd2l0Y2ggKGxhbmd1YWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlICJqYXZhIjoKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEphdmFCYXNlZFVERnVuY3Rpb24obmFtZSwgYXJnTmFtZXMsIGFyZ1R5cGVzLCByZXR1cm5UeXBlLCBjYWxsZWRPbk51bGxJbnB1dCwgYm9keSk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2NyaXB0QmFzZWRVREZ1bmN0aW9uKG5hbWUsIGFyZ05hbWVzLCBhcmdUeXBlcywgcmV0dXJuVHlwZSwgY2FsbGVkT25OdWxsSW5wdXQsIGxhbmd1YWdlLCBib2R5KTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEphdmFCYXNlZFVERnVuY3Rpb24obmFtZSwgYXJnTmFtZXMsIGFyZ1R5cGVzLCByZXR1cm5UeXBlLCBjYWxsZWRPbk51bGxJbnB1dCwgYm9keSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC00NDksOCArNDQyLDggQEAKICAgICB7CiAgICAgICAgIGlmICghRGF0YWJhc2VEZXNjcmlwdG9yLmVuYWJsZVVzZXJEZWZpbmVkRnVuY3Rpb25zKCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oIlVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYXJlIGRpc2FibGVkIGluIGNhc3NhbmRyYS55YW1sIC0gc2V0IHVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZD10cnVlIHRvIGVuYWJsZSIpOwotICAgICAgICBpZiAoISJqYXZhIi5lcXVhbHNJZ25vcmVDYXNlKGxhbmd1YWdlKSAmJiAhRGF0YWJhc2VEZXNjcmlwdG9yLmVuYWJsZVNjcmlwdGVkVXNlckRlZmluZWRGdW5jdGlvbnMoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigiU2NyaXB0ZWQgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBhcmUgZGlzYWJsZWQgaW4gY2Fzc2FuZHJhLnlhbWwgLSBzZXQgc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkPXRydWUgdG8gZW5hYmxlIGlmIHlvdSBhcmUgYXdhcmUgb2YgdGhlIHNlY3VyaXR5IHJpc2tzIik7CisgICAgICAgIGlmICghImphdmEiLmVxdWFsc0lnbm9yZUNhc2UobGFuZ3VhZ2UpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKCJDdXJyZW50bHkgb25seSBKYXZhIFVERnMgYXJlIGF2YWlsYWJsZSBpbiBDYXNzYW5kcmEuIEZvciBtb3JlIGluZm9ybWF0aW9uIC0gQ0FTU0FORFJBLTE4MjUyIGFuZCBDQVNTQU5EUkEtMTcyODEiKTsKICAgICB9CiAKICAgICBzdGF0aWMgdm9pZCBpbml0aWFsaXplVGhyZWFkKCkKQEAgLTYxNywxMSArNjEwLDYgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGlzTmF0aXZlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbGxlZE9uTnVsbElucHV0KCkKICAgICB7CiAgICAgICAgIHJldHVybiBjYWxsZWRPbk51bGxJbnB1dDsKQEAgLTY0Myw4ICs2MzEsNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFVzZWQgYnkgVURGIGltcGxlbWVudGF0aW9ucyAoYm90aCBKYXZhIGNvZGUgZ2VuZXJhdGVkIGJ5IHtAbGluayBKYXZhQmFzZWRVREZ1bmN0aW9ufQotICAgICAqIGFuZCBzY3JpcHQgZXhlY3V0b3Ige0BsaW5rIFNjcmlwdEJhc2VkVURGdW5jdGlvbn0pIHRvIGNvbnZlcnQgdGhlIEMqCisgICAgICogVXNlZCBieSBVREYgaW1wbGVtZW50YXRpb25zIChib3RoIEphdmEgY29kZSBnZW5lcmF0ZWQgYnkge0BsaW5rIEphdmFCYXNlZFVERnVuY3Rpb259KSB0byBjb252ZXJ0IHRoZSBDKgogICAgICAqIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gdG8gdGhlIEphdmEgb2JqZWN0IHJlcHJlc2VudGF0aW9uLgogICAgICAqCiAgICAgICogQHBhcmFtIHByb3RvY29sVmVyc2lvbiB0aGUgbmF0aXZlIHByb3RvY29sIHZlcnNpb24gdXNlZCBmb3Igc2VyaWFsaXphdGlvbgpAQCAtNjYxLDggKzY0OCw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogVXNlZCBieSBVREYgaW1wbGVtZW50YXRpb25zIChib3RoIEphdmEgY29kZSBnZW5lcmF0ZWQgYnkge0BsaW5rIEphdmFCYXNlZFVERnVuY3Rpb259Ci0gICAgICogYW5kIHNjcmlwdCBleGVjdXRvciB7QGxpbmsgU2NyaXB0QmFzZWRVREZ1bmN0aW9ufSkgdG8gY29udmVydCB0aGUgSmF2YQorICAgICAqIFVzZWQgYnkgVURGIGltcGxlbWVudGF0aW9ucyAoYm90aCBKYXZhIGNvZGUgZ2VuZXJhdGVkIGJ5IHtAbGluayBKYXZhQmFzZWRVREZ1bmN0aW9ufSkgdG8gY29udmVydCB0aGUgSmF2YQogICAgICAqIG9iamVjdCByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHJldHVybiB2YWx1ZSB0byB0aGUgQyogc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbi4KICAgICAgKgogICAgICAqIEBwYXJhbSBwcm90b2NvbFZlcnNpb24gdGhlIG5hdGl2ZSBwcm90b2NvbCB2ZXJzaW9uIHVzZWQgZm9yIHNlcmlhbGl6YXRpb24KQEAgLTc2MCw3ICs3NDYsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUobmFtZSwgRnVuY3Rpb25zLnR5cGVIYXNoQ29kZShhcmdUeXBlcyksIEZ1bmN0aW9ucy50eXBlSGFzaENvZGUocmV0dXJuVHlwZSksIHJldHVyblR5cGUsIGxhbmd1YWdlLCBib2R5KTsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUobmFtZSwgVXNlckZ1bmN0aW9ucy50eXBlSGFzaENvZGUoYXJnVHlwZXMpLCBVc2VyRnVuY3Rpb25zLnR5cGVIYXNoQ29kZShyZXR1cm5UeXBlKSwgcmV0dXJuVHlwZSwgbGFuZ3VhZ2UsIGJvZHkpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFVERkNsYXNzTG9hZGVyIGV4dGVuZHMgQ2xhc3NMb2FkZXIKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1VzZXJGdW5jdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVXNlckZ1bmN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZhMTBhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1VzZXJGdW5jdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuU2NoZW1hRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKKworLyoqCisgKiBBIG5vbi1uYXRpdmUsIHVzZXItZGVmaW5lZCBmdW5jdGlvbiwgbGlrZSBVREZzIGFuZCBVREFzLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVXNlckZ1bmN0aW9uIGV4dGVuZHMgQWJzdHJhY3RGdW5jdGlvbiBpbXBsZW1lbnRzIFNjaGVtYUVsZW1lbnQKK3sKKyAgICBwdWJsaWMgVXNlckZ1bmN0aW9uKEZ1bmN0aW9uTmFtZSBuYW1lLCBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZXR1cm5UeXBlKQorICAgIHsKKyAgICAgICAgc3VwZXIobmFtZSwgYXJnVHlwZXMsIHJldHVyblR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzTmF0aXZlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9VdWlkRmN0cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVXVpZEZjdHMuamF2YQppbmRleCAzZDgyZWNlLi4wMDgzODgzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9VdWlkRmN0cy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1V1aWRGY3RzLmphdmEKQEAgLTI2LDEyICsyNiwxMiBAQAogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVXVpZEZjdHMKIHsKLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248RnVuY3Rpb24+IGFsbCgpCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEZ1bmN0aW9uc1RvKE5hdGl2ZUZ1bmN0aW9ucyBmdW5jdGlvbnMpCiAgICAgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKHV1aWRGY3QpOworICAgICAgICBmdW5jdGlvbnMuYWRkKHV1aWRGY3QpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRnVuY3Rpb24gdXVpZEZjdCA9IG5ldyBOYXRpdmVTY2FsYXJGdW5jdGlvbigidXVpZCIsIFVVSURUeXBlLmluc3RhbmNlKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTmF0aXZlRnVuY3Rpb24gdXVpZEZjdCA9IG5ldyBOYXRpdmVTY2FsYXJGdW5jdGlvbigidXVpZCIsIFVVSURUeXBlLmluc3RhbmNlKQogICAgIHsKICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhlY3V0ZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFzay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRkMjIyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFzay5qYXZhCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkFzc2lnbm1lbnRUZXN0YWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29sdW1uSWRlbnRpZmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNxbEJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5UZXJtOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVGVybXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25OYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuU2NhbGFyRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5SZXZlcnNlZFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuUmVxdWVzdFZhbGlkYXRpb25zLmludmFsaWRSZXF1ZXN0OworCisvKioKKyAqIER5bmFtaWMgZGF0YSBtYXNrIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBzY2hlbWEgY29sdW1uLgorICogPHA+CisgKiBJdCBjb25zaXN0cyBvbiBhIHBhcnRpYWwgYXBwbGljYXRpb24gb2YgYSBjZXJ0YWluIHtAbGluayBNYXNraW5nRnVuY3Rpb259IHRvIHRoZSB2YWx1ZXMgb2YgYSBjb2x1bW4sIHdpdGggdGhlCisgKiBwcmVjb25kaXRpb24gdGhhdCB0aGUgdHlwZSBvZiBhbnkgbWFza2VkIGNvbHVtbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHR5cGUgb2YgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBmdW5jdGlvbi4KKyAqIDxwPgorICogVGhpcyBwYXJ0aWFsIGFwcGxpY2F0aW9uIGlzIG1lYW50IHRvIGJlIGFzc29jaWF0ZWQgdG8gc3BlY2lmaWMgY29sdW1ucyBpbiB0aGUgc2NoZW1hLCBhY3RpbmcgYXMgYSBtYXNrIGZvciB0aGUgdmFsdWVzCisgKiBvZiB0aG9zZSBjb2x1bW5zLiBJdCdzIGFzc29jaWF0ZWQgdG8gcXVlcmllcyBzdWNoIGFzOgorICogPHByZT4KKyAqICAgIENSRUFURSBUQUJMRSB0IChrIGludCBQUklNQVJZIEtFWSwgdiBpbnQgTUFTS0VEIFdJVEggbWFza19pbm5lcigxLCAxKSk7CisgKiAgICBBTFRFUiBUQUJMRSB0IEFMVEVSIHYgTUFTS0VEIFdJVEggbWFza19pbm5lcigyLCAxKTsKKyAqICAgIEFMVEVSIFRBQkxFIHQgQUxURVIgdiBEUk9QIE1BU0tFRDsKKyAqIDwvcHJlPgorICogTm90ZSB0aGF0IGluIHRoZSBleGFtcGxlIGFib3ZlIHdlIGFyZSByZWZlcmVuY2luZyB0aGUge0Bjb2RlIG1hc2tfaW5uZXJ9IGZ1bmN0aW9uIHdpdGggdHdvIGFyZ3VtZW50cy4gSG93ZXZlciwgdGhhdAorICogQ1FMIGZ1bmN0aW9uIGFjdHVhbGx5IGhhcyB0aHJlZSBhcmd1bWVudHMuIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhbHdheXMgb21taXR0ZWQgd2hlbiBhdHRhY2hpbmcgdGhlIGZ1bmN0aW9uIHRvIGEKKyAqIHNjaGVtYSBjb2x1bW4uIFRoZSB2YWx1ZSBvZiB0aGF0IGZpcnN0IGFyZ3VtZW50IGlzIGFsd2F5cyB0aGUgdmFsdWUgb2YgdGhlIG1hc2tlZCBjb2x1bW4sIGluIHRoaXMgY2FzZSBhbiBpbnQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb2x1bW5NYXNrCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRURfRVJST1JfTUVTU0FHRSA9ICJDYW5ub3QgbWFzayBjb2x1bW5zIGJlY2F1c2UgZHluYW1pYyBkYXRhIG1hc2tpbmcgaXMgbm90ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZC4gWW91IGNhbiBlbmFibGUgaXQgd2l0aCB0aGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkeW5hbWljX2RhdGFfbWFza2luZ19lbmFibGVkIHByb3BlcnR5IG9uIGNhc3NhbmRyYS55YW1sIjsKKworICAgIC8qKiBUaGUgQ1FMIGZ1bmN0aW9uIHVzZWQgZm9yIG1hc2tpbmcuICovCisgICAgcHVibGljIGZpbmFsIFNjYWxhckZ1bmN0aW9uIGZ1bmN0aW9uOworCisgICAgLyoqIFRoZSB2YWx1ZXMgb2YgdGhlIGFyZ3VtZW50cyBvZiB0aGUgcGFydGlhbGx5IGFwcGxpZWQgbWFza2luZyBmdW5jdGlvbi4gKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgQnl0ZUJ1ZmZlcltdIHBhcnRpYWxBcmd1bWVudFZhbHVlczsKKworICAgIHByaXZhdGUgQ29sdW1uTWFzayhTY2FsYXJGdW5jdGlvbiBmdW5jdGlvbiwgQnl0ZUJ1ZmZlci4uLiBwYXJ0aWFsQXJndW1lbnRWYWx1ZXMpCisgICAgeworICAgICAgICBhc3NlcnQgZnVuY3Rpb24uYXJnVHlwZXMoKS5zaXplKCkgPT0gcGFydGlhbEFyZ3VtZW50VmFsdWVzLmxlbmd0aCArIDE7CisgICAgICAgIHRoaXMuZnVuY3Rpb24gPSBmdW5jdGlvbjsKKyAgICAgICAgdGhpcy5wYXJ0aWFsQXJndW1lbnRWYWx1ZXMgPSBwYXJ0aWFsQXJndW1lbnRWYWx1ZXM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDb2x1bW5NYXNrIGJ1aWxkKFNjYWxhckZ1bmN0aW9uIGZ1bmN0aW9uLCBCeXRlQnVmZmVyLi4uIHBhcnRpYWxBcmd1bWVudFZhbHVlcykKKyAgICB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbi5pc05hdGl2ZSgpCisgICAgICAgICAgICAgICA/IG5ldyBOYXRpdmUoKE1hc2tpbmdGdW5jdGlvbikgZnVuY3Rpb24sIHBhcnRpYWxBcmd1bWVudFZhbHVlcykKKyAgICAgICAgICAgICAgIDogbmV3IEN1c3RvbShmdW5jdGlvbiwgcGFydGlhbEFyZ3VtZW50VmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIG9mIHRoZSBwYXJ0aWFsbHkgYXBwbGllZCBtYXNraW5nIGZ1bmN0aW9uLCBhcyBhbiB1bm1vZGlmaWFibGUgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHBhcnRpYWxBcmd1bWVudFR5cGVzKCkKKyAgICB7CisgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcyA9IGZ1bmN0aW9uLmFyZ1R5cGVzKCk7CisgICAgICAgIHJldHVybiBhcmdUeXBlcy5zaXplKCkgPT0gMQorICAgICAgICAgICAgICAgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKQorICAgICAgICAgICAgICAgOiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGFyZ1R5cGVzLnN1Ykxpc3QoMSwgYXJnVHlwZXMuc2l6ZSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdmFsdWVzIG9mIHRoZSBhcmd1bWVudHMgb2YgdGhlIHBhcnRpYWxseSBhcHBsaWVkIG1hc2tpbmcgZnVuY3Rpb24sIGFzIGFuIHVubW9kaWZpYWJsZSBsaXN0IHRoYXQgY2FuCisgICAgICogY29udGFpbiBudWxscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxCeXRlQnVmZmVyPiBwYXJ0aWFsQXJndW1lbnRWYWx1ZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChwYXJ0aWFsQXJndW1lbnRWYWx1ZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEEgY29weSBvZiB0aGlzIG1hc2sgZm9yIGEgdmVyc2lvbiBvZiBpdHMgbWFza2VkIGNvbHVtbiB0aGF0IGhhcyBpdHMgdHlwZSByZXZlcnNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sdW1uTWFzayB3aXRoUmV2ZXJzZWRUeXBlKCkKKyAgICB7CisgICAgICAgIEFic3RyYWN0VHlwZTw/PiByZXZlcnNlZCA9IFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShmdW5jdGlvbi5hcmdUeXBlcygpLmdldCgwKSk7CisgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdzID0gSW1tdXRhYmxlTGlzdC48QWJzdHJhY3RUeXBlPD8+PmJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHJldmVyc2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQWxsKHBhcnRpYWxBcmd1bWVudFR5cGVzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBGdW5jdGlvbiBuZXdGdW5jdGlvbiA9IEZ1bmN0aW9uUmVzb2x2ZXIuZ2V0KGZ1bmN0aW9uLm5hbWUoKS5rZXlzcGFjZSwgZnVuY3Rpb24ubmFtZSgpLCBhcmdzLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0IG5ld0Z1bmN0aW9uICE9IG51bGw7CisgICAgICAgIHJldHVybiBidWlsZCgoU2NhbGFyRnVuY3Rpb24pIG5ld0Z1bmN0aW9uLCBwYXJ0aWFsQXJndW1lbnRWYWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwcm90b2NvbFZlcnNpb24gdGhlIHVzZWQgdmVyc2lvbiBvZiB0aGUgdHJhbnNwb3J0IHByb3RvY29sCisgICAgICogQHBhcmFtIHZhbHVlIGEgY29sdW1uIHZhbHVlIHRvIGJlIG1hc2tlZAorICAgICAqIEByZXR1cm4gdGhlIHNwZWNpZmllZCB2YWx1ZSBhZnRlciBoYXZpbmcgYmVlbiBtYXNrZWQgYnkgdGhlIG1hc2tlZCBmdW5jdGlvbgorICAgICAqLworICAgIHB1YmxpYyBCeXRlQnVmZmVyIG1hc2soUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgQnl0ZUJ1ZmZlciB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICghRGF0YWJhc2VEZXNjcmlwdG9yLmdldER5bmFtaWNEYXRhTWFza2luZ0VuYWJsZWQoKSkKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgICAgICByZXR1cm4gbWFza0ludGVybmFsKHByb3RvY29sVmVyc2lvbiwgdmFsdWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBCeXRlQnVmZmVyIG1hc2tJbnRlcm5hbChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBCeXRlQnVmZmVyIHZhbHVlKTsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVFbmFibGVkKCkKKyAgICB7CisgICAgICAgIGlmICghRGF0YWJhc2VEZXNjcmlwdG9yLmdldER5bmFtaWNEYXRhTWFza2luZ0VuYWJsZWQoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihESVNBQkxFRF9FUlJPUl9NRVNTQUdFKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCisgICAgeworICAgICAgICBpZiAodGhpcyA9PSBvKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIENvbHVtbk1hc2sgbWFzayA9IChDb2x1bW5NYXNrKSBvOworICAgICAgICByZXR1cm4gZnVuY3Rpb24ubmFtZSgpLmVxdWFscyhtYXNrLmZ1bmN0aW9uLm5hbWUoKSkKKyAgICAgICAgICAgICAgICYmIEFycmF5cy5lcXVhbHMocGFydGlhbEFyZ3VtZW50VmFsdWVzLCBtYXNrLnBhcnRpYWxBcmd1bWVudFZhbHVlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKGZ1bmN0aW9uLm5hbWUoKSwgQXJyYXlzLmhhc2hDb2RlKHBhcnRpYWxBcmd1bWVudFZhbHVlcykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzID0gcGFydGlhbEFyZ3VtZW50VHlwZXMoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGFyZ3VtZW50cyA9IG5ldyBBcnJheUxpc3Q8Pih0eXBlcy5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBDUUwzVHlwZSB0eXBlID0gdHlwZXMuZ2V0KGkpLmFzQ1FMM1R5cGUoKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBwYXJ0aWFsQXJndW1lbnRWYWx1ZXNbaV07CisgICAgICAgICAgICBhcmd1bWVudHMuYWRkKHR5cGUudG9DUUxMaXRlcmFsKHZhbHVlLCBQcm90b2NvbFZlcnNpb24uQ1VSUkVOVCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmb3JtYXQoIiVzKCVzKSIsIGZ1bmN0aW9uLm5hbWUoKSwgU3RyaW5nVXRpbHMuam9pbihhcmd1bWVudHMsICIsICIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhcHBlbmRDcWxUbyhDcWxCdWlsZGVyIGJ1aWxkZXIpCisgICAgeworICAgICAgICBidWlsZGVyLmFwcGVuZCgiIE1BU0tFRCBXSVRIICIpLmFwcGVuZCh0b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgQ29sdW1uTWFza30gZm9yIG5hdGl2ZSBtYXNraW5nIGZ1bmN0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOYXRpdmUgZXh0ZW5kcyBDb2x1bW5NYXNrCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIE1hc2tpbmdGdW5jdGlvbi5NYXNrZXIgbWFza2VyOworCisgICAgICAgIHB1YmxpYyBOYXRpdmUoTWFza2luZ0Z1bmN0aW9uIGZ1bmN0aW9uLCBCeXRlQnVmZmVyLi4uIHBhcnRpYWxBcmd1bWVudFZhbHVlcykKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZnVuY3Rpb24sIHBhcnRpYWxBcmd1bWVudFZhbHVlcyk7CisgICAgICAgICAgICBtYXNrZXIgPSBmdW5jdGlvbi5tYXNrZXIocGFydGlhbEFyZ3VtZW50VmFsdWVzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBtYXNrSW50ZXJuYWwoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgQnl0ZUJ1ZmZlciB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1hc2tlci5tYXNrKHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHtAbGluayBDb2x1bW5NYXNrfSBmb3IgdXNlci1kZWZpbmVkIG1hc2tpbmcgZnVuY3Rpb25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbSBleHRlbmRzIENvbHVtbk1hc2sKKyAgICB7CisgICAgICAgIHB1YmxpYyBDdXN0b20oU2NhbGFyRnVuY3Rpb24gZnVuY3Rpb24sIEJ5dGVCdWZmZXIuLi4gcGFydGlhbEFyZ3VtZW50VmFsdWVzKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihmdW5jdGlvbiwgcGFydGlhbEFyZ3VtZW50VmFsdWVzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBtYXNrSW50ZXJuYWwoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgQnl0ZUJ1ZmZlciB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBhcmd1bWVudFZhbHVlczsKKyAgICAgICAgICAgIGludCBudW1QYXJ0aWFsQXJncyA9IHBhcnRpYWxBcmd1bWVudFZhbHVlcy5sZW5ndGg7CisgICAgICAgICAgICBpZiAobnVtUGFydGlhbEFyZ3MgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcmd1bWVudFZhbHVlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSBhcmdzID0gbmV3IEJ5dGVCdWZmZXJbbnVtUGFydGlhbEFyZ3MgKyAxXTsKKyAgICAgICAgICAgICAgICBhcmdzWzBdID0gdmFsdWU7CisgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShwYXJ0aWFsQXJndW1lbnRWYWx1ZXMsIDAsIGFyZ3MsIDEsIG51bVBhcnRpYWxBcmdzKTsKKyAgICAgICAgICAgICAgICBhcmd1bWVudFZhbHVlcyA9IEFycmF5cy5hc0xpc3QoYXJncyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbi5leGVjdXRlKHByb3RvY29sVmVyc2lvbiwgYXJndW1lbnRWYWx1ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBwYXJzZWQgYnV0IG5vdCBwcmVwYXJlZCBjb2x1bW4gbWFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGNsYXNzIFJhdworICAgIHsKKyAgICAgICAgcHVibGljIGZpbmFsIEZ1bmN0aW9uTmFtZSBuYW1lOworICAgICAgICBwdWJsaWMgZmluYWwgTGlzdDxUZXJtLlJhdz4gcmF3UGFydGlhbEFyZ3VtZW50czsKKworICAgICAgICBwdWJsaWMgUmF3KEZ1bmN0aW9uTmFtZSBuYW1lLCBMaXN0PFRlcm0uUmF3PiByYXdQYXJ0aWFsQXJndW1lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy5yYXdQYXJ0aWFsQXJndW1lbnRzID0gcmF3UGFydGlhbEFyZ3VtZW50czsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb2x1bW5NYXNrIHByZXBhcmUoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUsIENvbHVtbklkZW50aWZpZXIgY29sdW1uLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2NhbGFyRnVuY3Rpb24gZnVuY3Rpb24gPSBmaW5kTWFza2luZ0Z1bmN0aW9uKGtleXNwYWNlLCB0YWJsZSwgY29sdW1uLCB0eXBlKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSBwYXJ0aWFsQXJndW1lbnRzID0gcHJlcGFyZVBhcnRpYWxBcmd1bWVudHMoa2V5c3BhY2UsIGZ1bmN0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBDb2x1bW5NYXNrLmJ1aWxkKGZ1bmN0aW9uLCBwYXJ0aWFsQXJndW1lbnRzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2NhbGFyRnVuY3Rpb24gZmluZE1hc2tpbmdGdW5jdGlvbihTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSwgQ29sdW1uSWRlbnRpZmllciBjb2x1bW4sIEFic3RyYWN0VHlwZTw/PiB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0PEFzc2lnbm1lbnRUZXN0YWJsZT4gYXJncyA9IG5ldyBBcnJheUxpc3Q8PihyYXdQYXJ0aWFsQXJndW1lbnRzLnNpemUoKSArIDEpOworICAgICAgICAgICAgYXJncy5hZGQodHlwZSk7CisgICAgICAgICAgICBhcmdzLmFkZEFsbChyYXdQYXJ0aWFsQXJndW1lbnRzKTsKKworICAgICAgICAgICAgRnVuY3Rpb24gZnVuY3Rpb24gPSBGdW5jdGlvblJlc29sdmVyLmdldChrZXlzcGFjZSwgbmFtZSwgYXJncywga2V5c3BhY2UsIHRhYmxlLCB0eXBlKTsKKworICAgICAgICAgICAgaWYgKGZ1bmN0aW9uID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgaW52YWxpZFJlcXVlc3QoIlVuYWJsZSB0byBmaW5kIG1hc2tpbmcgZnVuY3Rpb24gZm9yICVzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gZGVjbGFyZWQgZnVuY3Rpb24gbWF0Y2hlcyB0aGUgc2lnbmF0dXJlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4sIHRoaXMpOworCisgICAgICAgICAgICBpZiAoZnVuY3Rpb24uaXNBZ2dyZWdhdGUoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBpbnZhbGlkUmVxdWVzdCgiQWdncmVnYXRlIGZ1bmN0aW9uICVzIGNhbm5vdCBiZSB1c2VkIGZvciBtYXNraW5nIHRhYmxlIGNvbHVtbnMiLCB0aGlzKTsKKworICAgICAgICAgICAgaWYgKGZ1bmN0aW9uLmlzTmF0aXZlKCkgJiYgIShmdW5jdGlvbiBpbnN0YW5jZW9mIE1hc2tpbmdGdW5jdGlvbikpCisgICAgICAgICAgICAgICAgdGhyb3cgaW52YWxpZFJlcXVlc3QoIk5vdC1tYXNraW5nIGZ1bmN0aW9uICVzIGNhbm5vdCBiZSB1c2VkIGZvciBtYXNraW5nIHRhYmxlIGNvbHVtbnMiLCB0aGlzKTsKKworICAgICAgICAgICAgaWYgKCFmdW5jdGlvbi5pc05hdGl2ZSgpICYmICFmdW5jdGlvbi5uYW1lKCkua2V5c3BhY2UuZXF1YWxzKGtleXNwYWNlKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBpbnZhbGlkUmVxdWVzdCgiTWFza2luZyBmdW5jdGlvbiAlcyBkb2Vzbid0IGJlbG9uZyB0byB0aGUgc2FtZSBrZXlzcGFjZSBhcyB0aGUgdGFibGUgJXMuJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIGtleXNwYWNlLCB0YWJsZSk7CisKKyAgICAgICAgICAgIENRTDNUeXBlIHJldHVyblR5cGUgPSBmdW5jdGlvbi5yZXR1cm5UeXBlKCkuYXNDUUwzVHlwZSgpOworICAgICAgICAgICAgQ1FMM1R5cGUgZXhwZWN0ZWRUeXBlID0gdHlwZS5hc0NRTDNUeXBlKCk7CisgICAgICAgICAgICBpZiAoIXJldHVyblR5cGUuZXF1YWxzKGV4cGVjdGVkVHlwZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgaW52YWxpZFJlcXVlc3QoIk1hc2tpbmcgZnVuY3Rpb24gJXMgcmV0dXJuIHR5cGUgaXMgJXMuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGRpZmZlcmVudCB0byB0aGUgdHlwZSBvZiB0aGUgbWFza2VkIGNvbHVtbiAlcyBvZiB0eXBlICVzLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFza2luZyBmdW5jdGlvbnMgY2FuIG9ubHkgYmUgYXR0YWNoZWQgdG8gdGFibGUgY29sdW1ucyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWYgdGhleSByZXR1cm4gdGhlIHNhbWUgZGF0YSB0eXBlIGFzIHRoZSBtYXNrZWQgY29sdW1uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgcmV0dXJuVHlwZSwgY29sdW1uLCBleHBlY3RlZFR5cGUpOworCisgICAgICAgICAgICByZXR1cm4gKFNjYWxhckZ1bmN0aW9uKSBmdW5jdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQnl0ZUJ1ZmZlcltdIHByZXBhcmVQYXJ0aWFsQXJndW1lbnRzKFN0cmluZyBrZXlzcGFjZSwgU2NhbGFyRnVuY3Rpb24gZnVuY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGVyZSBjb3VsZCBiZSBudWxsIGFyZ3VtZW50cworICAgICAgICAgICAgQnl0ZUJ1ZmZlcltdIGFyZ3VtZW50cyA9IG5ldyBCeXRlQnVmZmVyW3Jhd1BhcnRpYWxBcmd1bWVudHMuc2l6ZSgpXTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYXdQYXJ0aWFsQXJndW1lbnRzLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyB0ZXJtID0gcmF3UGFydGlhbEFyZ3VtZW50cy5nZXQoaSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IGZ1bmN0aW9uLmFyZ1R5cGVzKCkuZ2V0KGkgKyAxKTsKKyAgICAgICAgICAgICAgICBhcmd1bWVudHNbaV0gPSBUZXJtcy5hc0J5dGVzKGtleXNwYWNlLCB0ZXJtLCB0eXBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50czsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZvcm1hdCgiJXMoJXMpIiwgbmFtZSwgU3RyaW5nVXRpbHMuam9pbihyYXdQYXJ0aWFsQXJndW1lbnRzLCAiLCAiKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0RlZmF1bHRNYXNraW5nRnVuY3Rpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvRGVmYXVsdE1hc2tpbmdGdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTE2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0RlZmF1bHRNYXNraW5nRnVuY3Rpb24uamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvblBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5OYXRpdmVGdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKKworLyoqCisgKiBBIHtAbGluayBNYXNraW5nRnVuY3Rpb259IHRoYXQgcmV0dXJucyBhIGZpeGVkIHJlcGxhY2VtZW50IHZhbHVlIGZvciB0aGUgZGF0YSB0eXBlIG9mIGl0cyBzaW5nbGUgYXJndW1lbnQuCisgKiA8cD4KKyAqIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgZGVmaW5lZCBieSB7QGxpbmsgQWJzdHJhY3RUeXBlI2dldE1hc2tlZFZhbHVlKCl9LCBiZWluZyB7QGNvZGUgKioqKn0gZm9yIHRleHQgZmllbGRzLAorICoge0Bjb2RlIGZhbHNlfSBmb3IgYm9vbGVhbnMsIHplcm8gZm9yIG51bWVyaWMgdHlwZXMsIHtAY29kZSAxOTcwLTAxLTAxfSBmb3IgZGF0ZXMsIGV0Yy4KKyAqIDxwPgorICogRm9yIGV4YW1wbGUsIGdpdmVuIGEgdGV4dCBjb2x1bW4gbmFtZWQgInVzZXJuYW1lIiwge0Bjb2RlIG1hc2tfZGVmYXVsdCh1c2VybmFtZSl9IHdpbGwgYWx3YXlzIHJldHVybiB7QGNvZGUgKioqKn0sCisgKiBpbmRlcGVuZGVudGx5IG9mIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhhdCBjb2x1bW4uCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0TWFza2luZ0Z1bmN0aW9uIGV4dGVuZHMgTWFza2luZ0Z1bmN0aW9uCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJkZWZhdWx0IjsKKworICAgIHByaXZhdGUgZmluYWwgTWFza2VyIG1hc2tlcjsKKworICAgIHByaXZhdGUgPFQ+IERlZmF1bHRNYXNraW5nRnVuY3Rpb24oRnVuY3Rpb25OYW1lIG5hbWUsIEFic3RyYWN0VHlwZTxUPiBpbnB1dFR5cGUpCisgICAgeworICAgICAgICBzdXBlcihuYW1lLCBpbnB1dFR5cGUsIGlucHV0VHlwZSk7CisgICAgICAgIG1hc2tlciA9IG5ldyBNYXNrZXIoaW5wdXRUeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFza2VyIG1hc2tlcihCeXRlQnVmZmVyLi4uIHBhcmFtZXRlcnMpCisgICAgeworICAgICAgICByZXR1cm4gbWFza2VyOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hc2tlciBpbXBsZW1lbnRzIE1hc2tpbmdGdW5jdGlvbi5NYXNrZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBkZWZhdWx0VmFsdWU7CisKKyAgICAgICAgcHJpdmF0ZSBNYXNrZXIoQWJzdHJhY3RUeXBlPD8+IGlucHV0VHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gaW5wdXRUeXBlLmdldE1hc2tlZFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgbWFzayhCeXRlQnVmZmVyIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEByZXR1cm4gYSB7QGxpbmsgRnVuY3Rpb25GYWN0b3J5fSB0byBidWlsZCBuZXcge0BsaW5rIERlZmF1bHRNYXNraW5nRnVuY3Rpb259cy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIEZ1bmN0aW9uRmFjdG9yeSBmYWN0b3J5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTWFza2luZ0Z1bmN0aW9uLkZhY3RvcnkoTkFNRSwgRnVuY3Rpb25QYXJhbWV0ZXIuYW55VHlwZShmYWxzZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0TWFza2luZ0Z1bmN0aW9uKG5hbWUsIGFyZ1R5cGVzLmdldCgwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9IYXNoTWFza2luZ0Z1bmN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0hhc2hNYXNraW5nRnVuY3Rpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTUxNWRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9IYXNoTWFza2luZ0Z1bmN0aW9uLmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdXBwbGllcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbk5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuTmF0aXZlRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlc1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5TdHJpbmdUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKKworLyoqCisgKiBBIHtAbGluayBNYXNraW5nRnVuY3Rpb259IHRoYXQgcmVwbGFjZXMgdGhlIHNwZWNpZmllZCBjb2x1bW4gdmFsdWUgYnkgaXRzIGhhc2ggYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAqIGFsZ29yaXRobS4gVGhlIGF2YWlsYWJsZSBhbGdvcml0aG1zIGFyZSB0aG9zZSBkZWZpbmVkIGJ5IHRoZSByZWdpc3RlcmVkIHNlY3VyaXR5IHtAbGluayBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyfXMuCisgKiBJZiBubyBhbGdvcml0aG0gaXMgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiwgdGhlIHtAbGluayAjREVGQVVMVF9BTEdPUklUSE19IHdpbGwgYmUgdXNlZC4KKyAqLworcHVibGljIGNsYXNzIEhhc2hNYXNraW5nRnVuY3Rpb24gZXh0ZW5kcyBNYXNraW5nRnVuY3Rpb24KK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gImhhc2giOworCisgICAgLyoqIFRoZSBkZWZhdWx0IGhhc2hpbmcgYWxnb3JpdGhtIHRvIGJlIHVzZWQgaWYgbm8gb3RoZXIgYWxnb3JpdGhtIGlzIHNwZWNpZmllZCBpbiB0aGUgY2FsbCB0byB0aGUgZnVuY3Rpb24uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9BTEdPUklUSE0gPSAiU0hBLTI1NiI7CisKKyAgICAvLyBUaGUgZGVmYXVsdCBtZXNzYWdlIGRpZ2VzdCBpcyBsYXppbHkgYnVpbHQgdG8gcHJldmVudCBhIGZhaWx1cmUgZHVyaW5nIHNlcnZlciBzdGFydHVwIGlmIHRoZSBhbGdvcml0aG0gaXMgbm90CisgICAgLy8gYXZhaWxhYmxlLiBUaGF0IHdheSwgaWYgdGhlIGFsZ29yaXRobSBpcyBub3QgZm91bmQgb25seSB0aGUgY2FsbHMgdG8gdGhlIGZ1bmN0aW9uIHdpbGwgZmFpbC4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdXBwbGllcjxNZXNzYWdlRGlnZXN0PiBERUZBVUxUX0RJR0VTVCA9IFN1cHBsaWVycy5tZW1vaXplKCgpIC0+IG1lc3NhZ2VEaWdlc3QoREVGQVVMVF9BTEdPUklUSE0pKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBYnN0cmFjdFR5cGU8Pz5bXSBERUZBVUxUX0FSR1VNRU5UUyA9IHt9OworCisgICAgLyoqIFRoZSB0eXBlIG9mIHRoZSBzdXBwbGllZCBhbGdvcml0aG0gYXJndW1lbnQsIHtAY29kZSBudWxsfSBpZiB0aGF0IGFyZ3VtZW50IGlzbid0IHN1cHBsaWVkLiAqLworICAgIEBOdWxsYWJsZQorICAgIHByaXZhdGUgZmluYWwgU3RyaW5nVHlwZSBhbGdvcml0aG1Bcmd1bWVudFR5cGU7CisKKyAgICBwcml2YXRlIEhhc2hNYXNraW5nRnVuY3Rpb24oRnVuY3Rpb25OYW1lIG5hbWUsIEFic3RyYWN0VHlwZTw/PiBpbnB1dFR5cGUsIEBOdWxsYWJsZSBTdHJpbmdUeXBlIGFsZ29yaXRobUFyZ3VtZW50VHlwZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG5hbWUsIEJ5dGVzVHlwZS5pbnN0YW5jZSwgaW5wdXRUeXBlLCBhcmd1bWVudHNUeXBlKGFsZ29yaXRobUFyZ3VtZW50VHlwZSkpOworICAgICAgICB0aGlzLmFsZ29yaXRobUFyZ3VtZW50VHlwZSA9IGFsZ29yaXRobUFyZ3VtZW50VHlwZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBYnN0cmFjdFR5cGU8Pz5bXSBhcmd1bWVudHNUeXBlKEBOdWxsYWJsZSBTdHJpbmdUeXBlIGFsZ29yaXRobUFyZ3VtZW50VHlwZSkKKyAgICB7CisgICAgICAgIC8vIHRoZSBhbGdvcml0aG0gYXJndW1lbnQgaXMgb3B0aW9uYWwsIHNvIHdlIHdpbGwgaGF2ZSBkaWZmZXJlbnQgc2lnbmF0dXJlcyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGF0IGFyZ3VtZW50CisgICAgICAgIC8vIGlzIHN1cHBsaWVkIG9yIG5vdAorICAgICAgICByZXR1cm4gYWxnb3JpdGhtQXJndW1lbnRUeXBlID09IG51bGwKKyAgICAgICAgICAgICAgID8gREVGQVVMVF9BUkdVTUVOVFMKKyAgICAgICAgICAgICAgIDogbmV3IEFic3RyYWN0VHlwZTw/PltdeyBhbGdvcml0aG1Bcmd1bWVudFR5cGUgfTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFza2VyIG1hc2tlcihCeXRlQnVmZmVyLi4uIHBhcmFtZXRlcnMpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE1hc2tlcihhbGdvcml0aG1Bcmd1bWVudFR5cGUsIHBhcmFtZXRlcnMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hc2tlciBpbXBsZW1lbnRzIE1hc2tpbmdGdW5jdGlvbi5NYXNrZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZURpZ2VzdCBkaWdlc3Q7CisKKyAgICAgICAgcHJpdmF0ZSBNYXNrZXIoU3RyaW5nVHlwZSBhbGdvcml0aG1Bcmd1bWVudFR5cGUsIEJ5dGVCdWZmZXIuLi4gcGFyYW1ldGVycykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFsZ29yaXRobUFyZ3VtZW50VHlwZSA9PSBudWxsIHx8IHBhcmFtZXRlcnNbMF0gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaWdlc3QgPSBERUZBVUxUX0RJR0VTVC5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYWxnb3JpdGhtID0gYWxnb3JpdGhtQXJndW1lbnRUeXBlLmNvbXBvc2UocGFyYW1ldGVyc1swXSk7CisgICAgICAgICAgICAgICAgZGlnZXN0ID0gbWVzc2FnZURpZ2VzdChhbGdvcml0aG0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIG1hc2soQnl0ZUJ1ZmZlciB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEhhc2hNYXNraW5nRnVuY3Rpb24uaGFzaChkaWdlc3QsIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgQE51bGxhYmxlCisgICAgc3RhdGljIEJ5dGVCdWZmZXIgaGFzaChNZXNzYWdlRGlnZXN0IGRpZ2VzdCwgQnl0ZUJ1ZmZlciB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgYnl0ZVtdIGhhc2ggPSBkaWdlc3QuZGlnZXN0KEJ5dGVCdWZmZXJVdGlsLmdldEFycmF5KHZhbHVlKSk7CisgICAgICAgIHJldHVybiBCeXRlc1R5cGUuaW5zdGFuY2UuY29tcG9zZShCeXRlQnVmZmVyLndyYXAoaGFzaCkpOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyBNZXNzYWdlRGlnZXN0IG1lc3NhZ2VEaWdlc3QoU3RyaW5nIGFsZ29yaXRobSkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZShhbGdvcml0aG0pOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKCJIYXNoIGFsZ29yaXRobSBub3QgZm91bmQ6ICIgKyBhbGdvcml0aG0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEByZXR1cm4gYSB7QGxpbmsgRnVuY3Rpb25GYWN0b3J5fSB0byBidWlsZCBuZXcge0BsaW5rIEhhc2hNYXNraW5nRnVuY3Rpb259cy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIEZ1bmN0aW9uRmFjdG9yeSBmYWN0b3J5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTWFza2luZ0Z1bmN0aW9uLkZhY3RvcnkoTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblBhcmFtZXRlci5hbnlUeXBlKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblBhcmFtZXRlci5vcHRpb25hbChGdW5jdGlvblBhcmFtZXRlci5maXhlZChDUUwzVHlwZS5OYXRpdmUuVEVYVCkpKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYXJnVHlwZXMuc2l6ZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFza2luZ0Z1bmN0aW9uKG5hbWUsIGFyZ1R5cGVzLmdldCgwKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaE1hc2tpbmdGdW5jdGlvbihuYW1lLCBhcmdUeXBlcy5nZXQoMCksIFVURjhUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGludmFsaWROdW1iZXJPZkFyZ3VtZW50c0V4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL01hc2tpbmdGY3RzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL01hc2tpbmdGY3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhM2JhZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvTWFza2luZ0ZjdHMuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5OYXRpdmVGdW5jdGlvbnM7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIHtAbGluayBNYXNraW5nRnVuY3Rpb259cyBmb3IgZHluYW1pYyBkYXRhIG1hc2tpbmcsIG1lYW50IHRvIG9ic2N1cmUgdGhlIHJlYWwgdmFsdWUgb2YgYSBjb2x1bW4uCisgKi8KK3B1YmxpYyBjbGFzcyBNYXNraW5nRmN0cworeworICAgIC8qKiBBZGRzIGFsbCB0aGUgYXZhaWxhYmxlIG5hdGl2ZSBkYXRhIG1hc2tpbmcgZnVuY3Rpb25zIHRvIHRoZSBzcGVjaWZpZWQgbmF0aXZlIGZ1bmN0aW9ucy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkRnVuY3Rpb25zVG8oTmF0aXZlRnVuY3Rpb25zIGZ1bmN0aW9ucykKKyAgICB7CisgICAgICAgIGZ1bmN0aW9ucy5hZGQoTnVsbE1hc2tpbmdGdW5jdGlvbi5mYWN0b3J5KCkpOworICAgICAgICBmdW5jdGlvbnMuYWRkKFJlcGxhY2VNYXNraW5nRnVuY3Rpb24uZmFjdG9yeSgpKTsKKyAgICAgICAgZnVuY3Rpb25zLmFkZChEZWZhdWx0TWFza2luZ0Z1bmN0aW9uLmZhY3RvcnkoKSk7CisgICAgICAgIGZ1bmN0aW9ucy5hZGQoSGFzaE1hc2tpbmdGdW5jdGlvbi5mYWN0b3J5KCkpOworICAgICAgICBQYXJ0aWFsTWFza2luZ0Z1bmN0aW9uLmZhY3RvcmllcygpLmZvckVhY2goZnVuY3Rpb25zOjphZGQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvTWFza2luZ0Z1bmN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL01hc2tpbmdGdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDAzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL01hc2tpbmdGdW5jdGlvbi5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk9iamVjdEFycmF5czsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbk5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuTmF0aXZlU2NhbGFyRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKKworLyoqCisgKiBBIHtAbGluayBOYXRpdmVTY2FsYXJGdW5jdGlvbn0gdGhhdCB0b3RhbGx5IG9yIHBhcnRpYWxseSByZXBsYWNlcyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgYSBjb2x1bW4gdmFsdWUsCisgKiBtZWFudCB0byBvYnNjdXJlIHRoZSByZWFsIHZhbHVlIG9mIHRoZSBjb2x1bW4uCisgKiA8cD4KKyAqIFRoZSBuYW1lcyBvZiBhbGwgbWFza2luZyBmdW5jdGlvbnMgc2hhcmUgYSBjb21tb24gcHJlZml4LCB7QGxpbmsgTWFza2luZ0Z1bmN0aW9uI05BTUVfUFJFRklYfSwgdG8gZWFzaWx5IGlkZW50aWZ5CisgKiB0aGVpciBwdXJwb3NlLgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFza2luZ0Z1bmN0aW9uIGV4dGVuZHMgTmF0aXZlU2NhbGFyRnVuY3Rpb24KK3sKKyAgICAvKiogVGhlIGNvbW1vbiBwcmVmaXggZm9yIHRoZSBuYW1lcyBvZiBhbGwgdGhlIG5hdGl2ZSBkYXRhIG1hc2tpbmcgZnVuY3Rpb25zLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJFRklYID0gIm1hc2tfIjsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBvdXRwdXRUeXBlIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIGZ1bmN0aW9uCisgICAgICogQHBhcmFtIGlucHV0VHlwZSB0aGUgdHlwZSBvZiB0aGUgdmFsdWVzIGFjY2VwdGVkIGJ5IHRoZSBmdW5jdGlvbiwgYWx3YXlzIGJlIHRoZSBmaXJzdCBhcmd1bWVudCBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcGFyYW0gYXJnc1R5cGUgdGhlIHR5cGUgb2YgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzIG9mIHRoZSBmdW5jdGlvbgorICAgICAqLworICAgIHByb3RlY3RlZCBNYXNraW5nRnVuY3Rpb24oRnVuY3Rpb25OYW1lIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gb3V0cHV0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBpbnB1dFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4uLi4gYXJnc1R5cGUpCisgICAgeworICAgICAgICBzdXBlcihuYW1lLm5hbWUsIG91dHB1dFR5cGUsIE9iamVjdEFycmF5cy5jb25jYXQoaW5wdXRUeXBlLCBhcmdzVHlwZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlcltdIHBhcnRpYWxQYXJhbWV0ZXJzID0gbmV3IEJ5dGVCdWZmZXJbcGFyYW1ldGVycy5zaXplKCkgLSAxXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aWFsUGFyYW1ldGVycy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHBhcnRpYWxQYXJhbWV0ZXJzW2ldID0gcGFyYW1ldGVycy5nZXQoaSArIDEpOworCisgICAgICAgIHJldHVybiBtYXNrZXIocGFydGlhbFBhcmFtZXRlcnMpLm1hc2socGFyYW1ldGVycy5nZXQoMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcge0BsaW5rIE1hc2tlcn0gZm9yIHRoZSBzcGVjaWZpZWQgbWFza2luZyBwYXJhbWV0ZXJzLgorICAgICAqIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCBieSB7QGxpbmsgQ29sdW1uTWFza30sIHNvIGl0IGRvZXNuJ3QgbmVlZCB0byBldmFsdWF0ZSB0aGUgYXJndW1lbnRzIG9uIGV2ZXJ5IGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyB0aGUgbWFza2luZyBwYXJhbWV0ZXJzIGluIHRoZSBmdW5jdGlvbiBjYWxsLgorICAgICAqIEByZXR1cm4gYSBuZXcge0BsaW5rIE1hc2tlcn0gdXNpbmcgdGhlIHNwZWNpZmllZCBtYXNraW5nIGFyZ3VtZW50cworICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBNYXNrZXIgbWFza2VyKEJ5dGVCdWZmZXIuLi4gcGFyYW1ldGVycyk7CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyB0aGF0IGFjdHVhbGx5IG1ha2VzIHRoZSBtYXNraW5nIG9mIHRoZSBmaXJzdCBmdW5jdGlvbiBwYXJhbWV0ZXIgYWNjb3JkaW5nIHRvIHRoZSBtYXNraW5nIGFyZ3VtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE1hc2tlcgorICAgIHsKKyAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgbWFzayhCeXRlQnVmZmVyIHZhbHVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGFic3RyYWN0IGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBGdW5jdGlvbkZhY3RvcnkKKyAgICB7CisgICAgICAgIHB1YmxpYyBGYWN0b3J5KFN0cmluZyBuYW1lLCBGdW5jdGlvblBhcmFtZXRlci4uLiBwYXJhbWV0ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihOQU1FX1BSRUZJWCArIG5hbWUudG9Mb3dlckNhc2UoKSwgcGFyYW1ldGVycyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL051bGxNYXNraW5nRnVuY3Rpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvTnVsbE1hc2tpbmdGdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkODJhNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL051bGxNYXNraW5nRnVuY3Rpb24uamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvblBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5OYXRpdmVGdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKKworLyoqCisgKiBBIHtAbGluayBNYXNraW5nRnVuY3Rpb259IHRoYXQgYWx3YXlzIHJldHVybnMgYSB7QGNvZGUgbnVsbH0gY29sdW1uLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYWx3YXlzIGFuIGFic2VudCBjb2x1bW4sCisgKiBhcyBpdCBkaWRuJ3QgZXhpc3QsIGFuZCBub3QgYSBub3QtbnVsbCBjb2x1bW4gcmVwcmVzZW50aW5nIGEge0Bjb2RlIG51bGx9IHZhbHVlLgorICogPHA+CisgKiBGb3IgZXhhbXBsZSwgZ2l2ZW4gYSB0ZXh0IGNvbHVtbiBuYW1lZCAidXNlcm5hbWUiLCB7QGNvZGUgbWFza19udWxsKHVzZXJuYW1lKX0gd2lsbCBhbHdheXMgcmV0dXJuIHtAY29kZSBudWxsfSwKKyAqIGluZGVwZW5kZW50bHkgb2YgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGF0IGNvbHVtbi4KKyAqLworcHVibGljIGNsYXNzIE51bGxNYXNraW5nRnVuY3Rpb24gZXh0ZW5kcyBNYXNraW5nRnVuY3Rpb24KK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIm51bGwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hc2tlciBNQVNLRVIgPSBuZXcgTWFza2VyKCk7CisKKyAgICBwcml2YXRlIE51bGxNYXNraW5nRnVuY3Rpb24oRnVuY3Rpb25OYW1lIG5hbWUsIEFic3RyYWN0VHlwZTw/PiBpbnB1dFR5cGUpCisgICAgeworICAgICAgICBzdXBlcihuYW1lLCBpbnB1dFR5cGUsIGlucHV0VHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hc2tlciBtYXNrZXIoQnl0ZUJ1ZmZlci4uLiBwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFUjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNYXNrZXIgaW1wbGVtZW50cyBNYXNraW5nRnVuY3Rpb24uTWFza2VyCisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgbWFzayhCeXRlQnVmZmVyIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBAcmV0dXJuIGEge0BsaW5rIEZ1bmN0aW9uRmFjdG9yeX0gdG8gYnVpbGQgbmV3IHtAbGluayBOdWxsTWFza2luZ0Z1bmN0aW9ufXMuICovCisgICAgcHVibGljIHN0YXRpYyBGdW5jdGlvbkZhY3RvcnkgZmFjdG9yeSgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE1hc2tpbmdGdW5jdGlvbi5GYWN0b3J5KE5BTUUsIEZ1bmN0aW9uUGFyYW1ldGVyLmFueVR5cGUoZmFsc2UpKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTnVsbE1hc2tpbmdGdW5jdGlvbihuYW1lLCBhcmdUeXBlcy5nZXQoMCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvUGFydGlhbE1hc2tpbmdGdW5jdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9QYXJ0aWFsTWFza2luZ0Z1bmN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4MjZhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvUGFydGlhbE1hc2tpbmdGdW5jdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25OYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uUGFyYW1ldGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLk5hdGl2ZUZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHtAbGluayBNYXNraW5nRnVuY3Rpb259IGFwcGxpZWQgdG8gYSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5TdHJpbmdUeXBlfSB2YWx1ZSB0aGF0LAorICogZGVwZW5kaW5nIG9uIHtAbGluayBUeXBlfToKKyAqIDx1bD4KKyAqIDxsaT5SZXBsYWNlcyBlYWNoIGNoYXJhY3RlciBiZXR3ZWVuIHRoZSBzdXBwbGllZCBwb3NpdGlvbnMgYnkgdGhlIHN1cHBsaWVkIHBhZGRpbmcgY2hhcmFjdGVyLiBJbiBvdGhlciB3b3JkcywKKyAqIGl0IHdpbGwgbWFzayBhbGwgdGhlIGNoYXJhY3RlcnMgZXhjZXB0IHRoZSBmaXJzdCBtIGFuZCBsYXN0IG4uPC9saT4KKyAqIDxsaT5SZXBsYWNlcyBlYWNoIGNoYXJhY3RlciBiZWZvcmUgYW5kIGFmdGVyIHRoZSBzdXBwbGllZCBwb3NpdGlvbnMgYnkgdGhlIHN1cHBsaWVkIHBhZGRpbmcgY2hhcmFjdGVyLiBJbiBvdGhlcgorICogd29yZHMsIGl0IHdpbGwgb25seSBtYXNrIGFsbCB0aGUgZmlyc3QgbSBhbmQgbGFzdCBuIGNoYXJhY3RlcnMuPC9saT4KKyAqIDwvdWw+CisgKiBUaGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBhbGx3YXlzIGJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGZpcnN0IHN0cmluZy1iYXNlZCBhcmd1bWVudC4KKyAqLworcHVibGljIGNsYXNzIFBhcnRpYWxNYXNraW5nRnVuY3Rpb24gZXh0ZW5kcyBNYXNraW5nRnVuY3Rpb24KK3sKKyAgICAvKiogVGhlIGNoYXJhY3RlciB0byBiZSB1c2VkIGFzIHBhZGRpbmcgaWYgbm8gb3RoZXIgY2hhcmFjdGVyIGlzIHN1cHBsaWVkIHdoZW4gY2FsbGluZyB0aGUgZnVuY3Rpb24uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERFRkFVTFRfUEFERElOR19DSEFSID0gJyonOworCisgICAgLyoqIFRoZSB0eXBlIG9mIHBhcnRpYWwgbWFza2luZyB0byBwZXJmb3JtLCBpbm5lciBvciBvdXRlci4gKi8KKyAgICBwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKKworICAgIC8qKiBUaGUgb3JpZ2luYWwgdHlwZSBvZiB0aGUgbWFza2VkIHZhbHVlLiAqLworICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RUeXBlPFN0cmluZz4gaW5wdXRUeXBlOworCisgICAgLyoqIFdoZXRoZXIgYSBwYWRkaW5nIGFyZ3VtZW50IGhhYiBiZWVuIHN1cHBsaWVkLiAqLworICAgIEBOdWxsYWJsZQorICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNQYWRkaW5nQXJndW1lbnQ7CisKKyAgICBwcml2YXRlIFBhcnRpYWxNYXNraW5nRnVuY3Rpb24oRnVuY3Rpb25OYW1lIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPFN0cmluZz4gaW5wdXRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1BhZGRpbmdBcmd1bWVudCkKKyAgICB7CisgICAgICAgIHN1cGVyKG5hbWUsIGlucHV0VHlwZSwgaW5wdXRUeXBlLCBhcmd1bWVudHNUeXBlKGhhc1BhZGRpbmdBcmd1bWVudCkpOworCisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuaW5wdXRUeXBlID0gaW5wdXRUeXBlOworICAgICAgICB0aGlzLmhhc1BhZGRpbmdBcmd1bWVudCA9IGhhc1BhZGRpbmdBcmd1bWVudDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBYnN0cmFjdFR5cGU8Pz5bXSBhcmd1bWVudHNUeXBlKGJvb2xlYW4gaGFzUGFkZGluZ0FyZ3VtZW50KQorICAgIHsKKyAgICAgICAgLy8gVGhlIHBhZGRpbmcgYXJndW1lbnQgaXMgb3B0aW9uYWwsIHNvIHdlIHByb3ZpZGUgZGlmZmVyZW50IHNpZ25hdHVyZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQncyBwcmVzZW50IG9yIG5vdC4KKyAgICAgICAgLy8gQWxzbywgdGhlIHBhZGRpbmcgYXJndW1lbnQgc2hvdWxkIGJlIGEgc2luZ2xlIGNoYXJhY3RlciwgYnV0IHdlIGRvbid0IGhhdmUgYSBkYXRhIHR5cGUgZm9yIHRoYXQsIHNvIHdlIHVzZQorICAgICAgICAvLyBhIHN0cmluZy1iYXNlZCBhcmd1bWVudC4gV2Ugd2lsbCBsYXRlciB2YWxpZGF0ZSBvbiBleGVjdXRpb24gdGhhdCB0aGUgc3RyaW5nIGFyZ3VtZW50IGlzIHNpbmdsZS1jaGFyYWN0ZXIuCisgICAgICAgIHJldHVybiBoYXNQYWRkaW5nQXJndW1lbnQKKyAgICAgICAgICAgICAgID8gbmV3IEFic3RyYWN0VHlwZTw/PltdeyBJbnQzMlR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSwgVVRGOFR5cGUuaW5zdGFuY2UgfQorICAgICAgICAgICAgICAgOiBuZXcgQWJzdHJhY3RUeXBlPD8+W117IEludDMyVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hc2tlciBtYXNrZXIoQnl0ZUJ1ZmZlci4uLiBwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNYXNrZXIocGFyYW1ldGVycyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBNYXNrZXIgaW1wbGVtZW50cyBNYXNraW5nRnVuY3Rpb24uTWFza2VyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBiZWdpbiwgZW5kOworICAgICAgICBwcml2YXRlIGZpbmFsIGNoYXIgcGFkZGluZzsKKworICAgICAgICBwcml2YXRlIE1hc2tlcihCeXRlQnVmZmVyLi4uIHBhcmFtZXRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBwb3NpdGlvbnMuIE5vIHZhbGlkYXRpb24gaXMgbmVlZGVkIHNpbmNlIHRoZSBtYXNrZXIgYWNjZXB0cyBuZWdhdGl2ZXMsCisgICAgICAgICAgICAvLyBidXQgd2Ugc2hvdWxkIGNvbnNpZGVyIHRoYXQgdGhlIGFyZ3VtZW50cyBtaWdoIGJlIG51bGwuCisgICAgICAgICAgICBiZWdpbiA9IHBhcmFtZXRlcnNbMF0gPT0gbnVsbCA/IDAgOiBJbnQzMlR5cGUuaW5zdGFuY2UuY29tcG9zZShwYXJhbWV0ZXJzWzBdKTsKKyAgICAgICAgICAgIGVuZCA9IHBhcmFtZXRlcnNbMV0gPT0gbnVsbCA/IDAgOiBJbnQzMlR5cGUuaW5zdGFuY2UuY29tcG9zZShwYXJhbWV0ZXJzWzFdKTsKKworICAgICAgICAgICAgLy8gUGFyc2UgdGhlIHBhZGRpbmcgY2hhcmFjdGVyLiBUaGUgdHlwZSBvZiB0aGUgYXJndW1lbnQgaXMgYSBzdHJpbmcgb2YgYW55IGxlbmd0aCBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYQorICAgICAgICAgICAgLy8gY2hhcmFjdGVyIHR5cGUgaW4gQ1FMLCBzbyB3ZSBzaG91bGQgdmVyaWZ5IHRoYXQgdGhlIHBhc3NlZCBzdHJpbmcgYXJndW1lbnQgaXMgc2luZ2xlLWNoYXJhY3Rlci4KKyAgICAgICAgICAgIGlmIChoYXNQYWRkaW5nQXJndW1lbnQgJiYgcGFyYW1ldGVyc1syXSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYXJhbWV0ZXIgPSBVVEY4VHlwZS5pbnN0YW5jZS5jb21wb3NlKHBhcmFtZXRlcnNbMl0pOworICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXIubGVuZ3RoKCkgIT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJUaGUgcGFkZGluZyBhcmd1bWVudCBmb3IgZnVuY3Rpb24gJXMgc2hvdWxkICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmUgc2luZ2xlLWNoYXJhY3RlciwgYnV0ICclcycgaGFzICVkIGNoYXJhY3RlcnMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSgpLCBwYXJhbWV0ZXIsIHBhcmFtZXRlci5sZW5ndGgoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYWRkaW5nID0gcGFyYW1ldGVyLmNoYXJBdCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYWRkaW5nID0gREVGQVVMVF9QQURESU5HX0NIQVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgbWFzayhCeXRlQnVmZmVyIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOdWxsIGNvbHVtbiB2YWx1ZXMgYXJlbid0IG1hc2tlZAorICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9IGlucHV0VHlwZS5jb21wb3NlKHZhbHVlKTsKKyAgICAgICAgICAgIFN0cmluZyBtYXNrZWRWYWx1ZSA9IHR5cGUubWFzayhzdHJpbmdWYWx1ZSwgYmVnaW4sIGVuZCwgcGFkZGluZyk7CisgICAgICAgICAgICByZXR1cm4gaW5wdXRUeXBlLmRlY29tcG9zZShtYXNrZWRWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZW51bSBUeXBlCisgICAgeworICAgICAgICAvKiogTWFza3MgZXZlcnl0aGluZyBleGNlcHQgdGhlIGZpcnN0IHtAY29kZSBiZWdpbn0gYW5kIGxhc3Qge0Bjb2RlIGVuZH0gY2hhcmFjdGVycy4gKi8KKyAgICAgICAgSU5ORVIKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRNYXNrKGludCBwb3MsIGludCBiZWdpbiwgaW50IGVuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9zID49IGJlZ2luICYmIHBvcyA8PSBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIC8qKiBNYXNrcyBvbmx5IHRoZSBmaXJzdCB7QGNvZGUgYmVnaW59IGFuZCBsYXN0IHtAY29kZSBlbmR9IGNoYXJhY3RlcnMuICovCisgICAgICAgIE9VVEVSCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2hvdWxkTWFzayhpbnQgcG9zLCBpbnQgYmVnaW4sIGludCBlbmQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvcyA8IGJlZ2luIHx8IHBvcyA+IGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBzaG91bGRNYXNrKGludCBwb3MsIGludCBiZWdpbiwgaW50IGVuZCk7CisKKyAgICAgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWFzayhTdHJpbmcgdmFsdWUsIGludCBiZWdpbiwgaW50IGVuZCwgY2hhciBwYWRkaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eSh2YWx1ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworCisgICAgICAgICAgICBpbnQgc2l6ZSA9IHZhbHVlLmxlbmd0aCgpOworICAgICAgICAgICAgaW50IGVuZEluZGV4ID0gc2l6ZSAtIDEgLSBlbmQ7CisgICAgICAgICAgICBjaGFyW10gY2hhcnMgPSBuZXcgY2hhcltzaXplXTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhcnNbaV0gPSBzaG91bGRNYXNrKGksIGJlZ2luLCBlbmRJbmRleCkgPyBwYWRkaW5nIDogdmFsdWUuY2hhckF0KGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaGFycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgZnVuY3Rpb24gZmFjdG9yaWVzIHRvIGJ1aWxkIG5ldyB7QGNvZGUgUGFydGlhbE1hc2tpbmdGdW5jdGlvbn0gZnVuY3Rpb25zLiAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxGdW5jdGlvbkZhY3Rvcnk+IGZhY3RvcmllcygpCisgICAgeworICAgICAgICByZXR1cm4gU3RyZWFtLm9mKFR5cGUudmFsdWVzKCkpCisgICAgICAgICAgICAgICAgICAgICAubWFwKFBhcnRpYWxNYXNraW5nRnVuY3Rpb246OmZhY3RvcnkpCisgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEZ1bmN0aW9uRmFjdG9yeSBmYWN0b3J5KFR5cGUgdHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTWFza2luZ0Z1bmN0aW9uLkZhY3RvcnkodHlwZS5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25QYXJhbWV0ZXIuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25QYXJhbWV0ZXIuZml4ZWQoQ1FMM1R5cGUuTmF0aXZlLklOVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25QYXJhbWV0ZXIuZml4ZWQoQ1FMM1R5cGUuTmF0aXZlLklOVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25QYXJhbWV0ZXIub3B0aW9uYWwoRnVuY3Rpb25QYXJhbWV0ZXIuZml4ZWQoQ1FMM1R5cGUuTmF0aXZlLlRFWFQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgICAgIHByb3RlY3RlZCBOYXRpdmVGdW5jdGlvbiBkb0dldE9yQ3JlYXRlRnVuY3Rpb24oTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzLCBBYnN0cmFjdFR5cGU8Pz4gcmVjZWl2ZXJUeXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTxTdHJpbmc+IGlucHV0VHlwZSA9IChBYnN0cmFjdFR5cGU8U3RyaW5nPikgYXJnVHlwZXMuZ2V0KDApOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGFydGlhbE1hc2tpbmdGdW5jdGlvbihuYW1lLCB0eXBlLCBpbnB1dFR5cGUsIGFyZ1R5cGVzLnNpemUoKSA9PSA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL1JlcGxhY2VNYXNraW5nRnVuY3Rpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvUmVwbGFjZU1hc2tpbmdGdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MTA1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL1JlcGxhY2VNYXNraW5nRnVuY3Rpb24uamF2YQpAQCAtMCwwICsxLDg3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvblBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5OYXRpdmVGdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKKworLyoqCisgKiBBIHtAbGluayBNYXNraW5nRnVuY3Rpb259IHRoYXQgcmVwbGFjZXMgdGhlIHNwZWNpZmllZCBjb2x1bW4gdmFsdWUgYnkgYSBjZXJ0YWluIHJlcGxhY2VtZW50IHZhbHVlLgorICogPHA+CisgKiBUaGUgcmV0dXJuZWQgcmVwbGFjZW1lbnQgdmFsdWUgbmVlZHMgdG8gaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIHRoZSByZXBsYWNlZCB2YWx1ZS4KKyAqIDxwPgorICogRm9yIGV4YW1wbGUsIGdpdmVuIGEgdGV4dCBjb2x1bW4gbmFtZWQgInVzZXJuYW1lIiwge0Bjb2RlIG1hc2tfcmVwbGFjZSh1c2VybmFtZSwgJyoqKionKX0gd2lsbCByZXR1cm4ge0Bjb2RlICoqKip9LgorICovCitwdWJsaWMgY2xhc3MgUmVwbGFjZU1hc2tpbmdGdW5jdGlvbiBleHRlbmRzIE1hc2tpbmdGdW5jdGlvbgoreworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAicmVwbGFjZSI7CisKKyAgICBwcml2YXRlIFJlcGxhY2VNYXNraW5nRnVuY3Rpb24oRnVuY3Rpb25OYW1lIG5hbWUsIEFic3RyYWN0VHlwZTw/PiByZXBsYWNlZFR5cGUsIEFic3RyYWN0VHlwZTw/PiByZXBsYWNlbWVudFR5cGUpCisgICAgeworICAgICAgICBzdXBlcihuYW1lLCByZXBsYWNlbWVudFR5cGUsIHJlcGxhY2VkVHlwZSwgcmVwbGFjZW1lbnRUeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFza2VyIG1hc2tlcihCeXRlQnVmZmVyLi4uIHBhcmFtZXRlcnMpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE1hc2tlcihwYXJhbWV0ZXJzWzBdKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNYXNrZXIgaW1wbGVtZW50cyBNYXNraW5nRnVuY3Rpb24uTWFza2VyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXIgcmVwbGFjZW1lbnQ7CisKKyAgICAgICAgcHJpdmF0ZSBNYXNrZXIoQnl0ZUJ1ZmZlciByZXBsYWNlbWVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5yZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIG1hc2soQnl0ZUJ1ZmZlciB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEByZXR1cm4gYSB7QGxpbmsgRnVuY3Rpb25GYWN0b3J5fSB0byBidWlsZCBuZXcge0BsaW5rIFJlcGxhY2VNYXNraW5nRnVuY3Rpb259cy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIEZ1bmN0aW9uRmFjdG9yeSBmYWN0b3J5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTWFza2luZ0Z1bmN0aW9uLkZhY3RvcnkoTkFNRSwgRnVuY3Rpb25QYXJhbWV0ZXIuYW55VHlwZSh0cnVlKSwgRnVuY3Rpb25QYXJhbWV0ZXIuc2FtZUFzRmlyc3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgTmF0aXZlRnVuY3Rpb24gZG9HZXRPckNyZWF0ZUZ1bmN0aW9uKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcywgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gcmVwbGFjZWRUeXBlID0gYXJnVHlwZXMuZ2V0KDApOworICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiByZXBsYWNlbWVudFR5cGUgPSBhcmdUeXBlcy5nZXQoMSk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQgcmVwbGFjZWRUeXBlID09IHJlcGxhY2VtZW50VHlwZQorICAgICAgICAgICAgICAgIDogU3RyaW5nLmZvcm1hdCgiQm90aCBhcmd1bWVudHMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgdHlwZSwgYnV0IGZvdW5kICVzKCVzLCAlcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCByZXBsYWNlZFR5cGUuYXNDUUwzVHlwZSgpLCByZXBsYWNlbWVudFR5cGUuYXNDUUwzVHlwZSgpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVwbGFjZU1hc2tpbmdGdW5jdGlvbihuYW1lLCByZXBsYWNlZFR5cGUsIHJlcGxhY2VtZW50VHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvdHlwZXMvVHlwZUNvZGVjLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy90eXBlcy9UeXBlQ29kZWMuamF2YQppbmRleCBkYzM0YmNhLi41NGZmNTQwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy90eXBlcy9UeXBlQ29kZWMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy90eXBlcy9UeXBlQ29kZWMuamF2YQpAQCAtMzQsOSArMzQsOSBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkJ5dGVTdHJlYW1zOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnJlZmxlY3QuVHlwZVRva2VuOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy50eXBlcy5leGNlcHRpb25zLkludmFsaWRUeXBlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLnR5cGVzLnV0aWxzLkJ5dGVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nOwogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OwpAQCAtMzA0MywxNyArMzA0Myw5IEBACiAgICAgICAgICAgICArIFZJbnRDb2RpbmcuY29tcHV0ZVZJbnRTaXplKGRheXMpCiAgICAgICAgICAgICArIFZJbnRDb2RpbmcuY29tcHV0ZVZJbnRTaXplKG5hbm9zZWNvbmRzKTsKICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHNpemUpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVkludENvZGluZy53cml0ZVZJbnQobW9udGhzLCBiYik7Ci0gICAgICAgICAgICAgICAgVkludENvZGluZy53cml0ZVZJbnQoZGF5cywgYmIpOwotICAgICAgICAgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVWSW50KG5hbm9zZWNvbmRzLCBiYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBjYW5ub3QgaGFwcGVuCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBWSW50Q29kaW5nLndyaXRlVkludChtb250aHMsIGJiKTsKKyAgICAgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVWSW50KGRheXMsIGJiKTsKKyAgICAgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVWSW50KG5hbm9zZWNvbmRzLCBiYik7CiAgICAgICAgICAgICBiYi5mbGlwKCk7CiAgICAgICAgICAgICByZXR1cm4gYmI7CiAgICAgICAgIH0KQEAgLTMwNzEsOCArMzA2Myw4IEBACiAgICAgICAgICAgICAgICAgRGF0YUlucHV0IGluID0gQnl0ZVN0cmVhbXMubmV3RGF0YUlucHV0KEJ5dGVzLmdldEFycmF5KGJ5dGVzKSk7CiAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgbW9udGhzID0gKGludCkgVkludENvZGluZy5yZWFkVkludChpbik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBkYXlzID0gKGludCkgVkludENvZGluZy5yZWFkVkludChpbik7CisgICAgICAgICAgICAgICAgICAgIGludCBtb250aHMgPSBWSW50Q29kaW5nLnJlYWRWSW50MzIoaW4pOworICAgICAgICAgICAgICAgICAgICBpbnQgZGF5cyA9IFZJbnRDb2RpbmcucmVhZFZJbnQzMihpbik7CiAgICAgICAgICAgICAgICAgICAgIGxvbmcgbmFub3NlY29uZHMgPSBWSW50Q29kaW5nLnJlYWRWSW50KGluKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIER1cmF0aW9uLm5ld0luc3RhbmNlKG1vbnRocywgZGF5cywgbmFub3NlY29uZHMpOwogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL0NsdXN0ZXJpbmdDb2x1bW5SZXN0cmljdGlvbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL0NsdXN0ZXJpbmdDb2x1bW5SZXN0cmljdGlvbnMuamF2YQppbmRleCBjMWQwYzUyLi4xNDZlYzIwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9DbHVzdGVyaW5nQ29sdW1uUmVzdHJpY3Rpb25zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvQ2x1c3RlcmluZ0NvbHVtblJlc3RyaWN0aW9ucy5qYXZhCkBAIC0yMjgsNSArMjI4LDQgQEAKICAgICB7CiAgICAgICAgIHJldHVybiByZXN0cmljdGlvbi5pc0NvbnRhaW5zKCkgfHwgcmVzdHJpY3Rpb24uaXNMSUtFKCkgfHwgaW5kZXggIT0gcmVzdHJpY3Rpb24uZ2V0Rmlyc3RDb2x1bW4oKS5wb3NpdGlvbigpOwogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvTXVsdGlDb2x1bW5SZXN0cmljdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvTXVsdGlDb2x1bW5SZXN0cmljdGlvbi5qYXZhCmluZGV4IGFjYmI0OGUuLjIyYzAwMGUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL011bHRpQ29sdW1uUmVzdHJpY3Rpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9NdWx0aUNvbHVtblJlc3RyaWN0aW9uLmphdmEKQEAgLTE4LDEyICsxOCwyMiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnJlc3RyaWN0aW9uczsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5MaXN0U2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdTdHlsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQWJzdHJhY3RNYXJrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5PcGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5T3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlRlcm07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5UZXJtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlR1cGxlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlRlcm0uVGVybWluYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLkJvdW5kOwpAQCAtMzEsOCArNDEsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Sb3dGaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXg7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXhSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdTdHlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTGlzdFNlcmlhbGl6ZXI7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLlJlcXVlc3RWYWxpZGF0aW9ucy5jaGVja0ZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuUmVxdWVzdFZhbGlkYXRpb25zLmNoZWNrTm90TnVsbDsKQEAgLTI1OCw3ICsyNjgsNyBAQAogICAgICAgICAgICAgICAgIGZvciAoTGlzdDxCeXRlQnVmZmVyPiBzcGxpdFZhbHVlIDogc3BsaXRWYWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQoc3BsaXRWYWx1ZS5nZXQoMCkpOwogCi0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBMaXN0U2VyaWFsaXplci5wYWNrKHZhbHVlcywgdmFsdWVzLnNpemUoKSwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IExpc3RTZXJpYWxpemVyLnBhY2sodmFsdWVzLCB2YWx1ZXMuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICBmaWx0ZXIuYWRkKGdldEZpcnN0Q29sdW1uKCksIE9wZXJhdG9yLklOLCBidWZmZXIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQpAQCAtMzc2LDcgKzM4Niw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGJvb2xlYW4gcmV2ZXJzZWQgPSBnZXRGaXJzdENvbHVtbigpLmlzUmV2ZXJzZWRUeXBlKCk7CiAKLSAgICAgICAgICAgIEVudW1NYXA8Qm91bmQsIExpc3Q8Qnl0ZUJ1ZmZlcj4+IGNvbXBvbmVudEJvdW5kcyA9IG5ldyBFbnVtTWFwPEJvdW5kLCBMaXN0PEJ5dGVCdWZmZXI+PihCb3VuZC5jbGFzcyk7CisgICAgICAgICAgICBFbnVtTWFwPEJvdW5kLCBMaXN0PEJ5dGVCdWZmZXI+PiBjb21wb25lbnRCb3VuZHMgPSBuZXcgRW51bU1hcDw+KEJvdW5kLmNsYXNzKTsKICAgICAgICAgICAgIGNvbXBvbmVudEJvdW5kcy5wdXQoQm91bmQuU1RBUlQsIGNvbXBvbmVudEJvdW5kcyhCb3VuZC5TVEFSVCwgb3B0aW9ucykpOwogICAgICAgICAgICAgY29tcG9uZW50Qm91bmRzLnB1dChCb3VuZC5FTkQsIGNvbXBvbmVudEJvdW5kcyhCb3VuZC5FTkQsIG9wdGlvbnMpKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvUmVzdHJpY3Rpb25TZXQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1Jlc3RyaWN0aW9uU2V0LmphdmEKaW5kZXggN2E1ZDViOS4uMzQ0NDk4YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvUmVzdHJpY3Rpb25TZXQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9SZXN0cmljdGlvblNldC5qYXZhCkBAIC0xMDUsNiArMTA1LDE1IEBACiAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4ocmVzdHJpY3Rpb25zLmtleVNldCgpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgZGlyZWN0IHJlZmVyZW5jZSB0byB0aGUga2V5IHNldCBmcm9tIHtAbGluayAjcmVzdHJpY3Rpb25zfSB3aXRoIG5vIGRlZmVuc2VpdmUgY29weWluZworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPENvbHVtbk1ldGFkYXRhPiBnZXRDb2x1bW5EZWZpbml0aW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gcmVzdHJpY3Rpb25zLmtleVNldCgpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZEZ1bmN0aW9uc1RvKExpc3Q8RnVuY3Rpb24+IGZ1bmN0aW9ucykKICAgICB7CkBAIC0zMzIsNyArMzQxLDYgQEAKICAgICAvKioKICAgICAgKiB7QGNvZGUgSXRlcmF0b3J9IGRlY29yYXRvciB0aGF0IHJlbW92ZXMgZHVwbGljYXRlcyBpbiBhbiBvcmRlcmVkIG9uZS4KICAgICAgKgotICAgICAqIEBwYXJhbSBpdGVyYXRvciB0aGUgZGVjb3JhdGVkIGl0ZXJhdG9yCiAgICAgICogQHBhcmFtIDxFPiB0aGUgaXRlcmF0b3IgZWxlbWVudCB0eXBlLgogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIERpc3RpbmN0SXRlcmF0b3I8RT4gZXh0ZW5kcyBBYnN0cmFjdEl0ZXJhdG9yPEU+CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9SZXN0cmljdGlvblNldFdyYXBwZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1Jlc3RyaWN0aW9uU2V0V3JhcHBlci5qYXZhCmluZGV4IDk4MDNhZGMuLjhjODliY2EgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1Jlc3RyaWN0aW9uU2V0V3JhcHBlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1Jlc3RyaWN0aW9uU2V0V3JhcHBlci5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5yZXN0cmljdGlvbnM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCkBAIC01Nyw2ICs1OCwxNyBAQAogICAgICAgICByZXR1cm4gcmVzdHJpY3Rpb25zLmdldENvbHVtbkRlZnMoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxDb2x1bW5NZXRhZGF0YT4gZ2V0Q29sdW1uRGVmaW5pdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlc3RyaWN0aW9ucy5nZXRDb2x1bW5EZWZpbml0aW9ucygpOworICAgIH0KKworICAgIHB1YmxpYyBSZXN0cmljdGlvblNldCBnZXRSZXN0cmljdGlvblNldCgpCisgICAgeworICAgICAgICByZXR1cm4gcmVzdHJpY3Rpb25zOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGFkZEZ1bmN0aW9uc1RvKExpc3Q8RnVuY3Rpb24+IGZ1bmN0aW9ucykKICAgICB7CiAgICAgICAgIHJlc3RyaWN0aW9ucy5hZGRGdW5jdGlvbnNUbyhmdW5jdGlvbnMpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvUmVzdHJpY3Rpb25zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9SZXN0cmljdGlvbnMuamF2YQppbmRleCA3N2UwZGQ5Li4wYWQ3NTMwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9SZXN0cmljdGlvbnMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9SZXN0cmljdGlvbnMuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMucmVzdHJpY3Rpb25zOwogCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKQEAgLTM1LDYgKzM2LDE1IEBACiAgICAgU2V0PFJlc3RyaWN0aW9uPiBnZXRSZXN0cmljdGlvbnMoQ29sdW1uTWV0YWRhdGEgY29sdW1uRGVmKTsKIAogICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGV4aXN0cyBpbiBhZGRpdGlvbiB0byB7QGxpbmsgI2dldENvbHVtbkRlZnMoKX0gaW4gY2FzZSBpbXBsZW1lbnRhdGlvbnMgd2FudCB0bworICAgICAqIHByb3ZpZGUgY29sdW1ucyBkZWZpbml0aW9ucyB0aGF0IGFyZSBub3Qgc3RyaWN0bHkgaW4gcG9zaXRpb24gb3JkZXIuCisgICAgICovCisgICAgZGVmYXVsdCBDb2xsZWN0aW9uPENvbHVtbk1ldGFkYXRhPiBnZXRDb2x1bW5EZWZpbml0aW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Q29sdW1uRGVmcygpOworICAgIH0KKworICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGlzIDxjb2RlPlJlc3RyaWN0aW9uczwvY29kZT4gaXMgZW1wdHkgb3Igbm90LgogICAgICAqCiAgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIDxjb2RlPlJlc3RyaWN0aW9uczwvY29kZT4gaXMgZW1wdHksIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9TaW5nbGVDb2x1bW5SZXN0cmljdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvU2luZ2xlQ29sdW1uUmVzdHJpY3Rpb24uamF2YQppbmRleCBlNWIyNDY1Li41Y2U3OGFlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9TaW5nbGVDb2x1bW5SZXN0cmljdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1NpbmdsZUNvbHVtblJlc3RyaWN0aW9uLmphdmEKQEAgLTI0LDcgKzI0LDYgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5MaXN0U2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlRlcm0uVGVybWluYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb247CkBAIC0yMjEsNyArMjIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlPcHRpb25zIG9wdGlvbnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gdmFsdWVzID0gZ2V0VmFsdWVzKG9wdGlvbnMpOwotICAgICAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBMaXN0U2VyaWFsaXplci5wYWNrKHZhbHVlcywgdmFsdWVzLnNpemUoKSwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gTGlzdFNlcmlhbGl6ZXIucGFjayh2YWx1ZXMsIHZhbHVlcy5zaXplKCkpOwogICAgICAgICAgICAgZmlsdGVyLmFkZChjb2x1bW5EZWYsIE9wZXJhdG9yLklOLCBidWZmZXIpOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1NpbmdsZVJlc3RyaWN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9TaW5nbGVSZXN0cmljdGlvbi5qYXZhCmluZGV4IDQyYjBiNGUuLjk4OWQ1ZGEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1NpbmdsZVJlc3RyaWN0aW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9yZXN0cmljdGlvbnMvU2luZ2xlUmVzdHJpY3Rpb24uamF2YQpAQCAtNTEsNiArNTEsMTQgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyByZXN0cmljdGlvbiBpcyBiYXNlZCBvbiBlcXVhbGl0eSBjb21wYXJpc29uIHJhdGhlciB0aGFuIGEgcmFuZ2Ugb3IgbmVnYXRpb24KKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNFcXVhbGl0eUJhc2VkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0VRKCkgfHwgaXNJTigpIHx8IGlzQ29udGFpbnMoKTsKKyAgICB9CisKICAgICBwdWJsaWMgZGVmYXVsdCBib29sZWFuIGlzTm90TnVsbCgpCiAgICAgewogICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3Jlc3RyaWN0aW9ucy9TdGF0ZW1lbnRSZXN0cmljdGlvbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1N0YXRlbWVudFJlc3RyaWN0aW9ucy5qYXZhCmluZGV4IDhmOGJlOTQuLmQ1MjJmNDYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1N0YXRlbWVudFJlc3RyaWN0aW9ucy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvcmVzdHJpY3Rpb25zL1N0YXRlbWVudFJlc3RyaWN0aW9ucy5qYXZhCkBAIC0yOCw3ICsyOCwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5TdGF0ZW1lbnRUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLlJvd0ZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5WaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLlZpcnR1YWxUYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LkluZGV4OwpAQCAtNTAsMTAgKzUzLDE1IEBACiAgKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBTdGF0ZW1lbnRSZXN0cmljdGlvbnMKIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFU19BTExPV19GSUxURVJJTkdfTUVTU0FHRSA9Ci0gICAgICAgICAgICAiQ2Fubm90IGV4ZWN1dGUgdGhpcyBxdWVyeSBhcyBpdCBtaWdodCBpbnZvbHZlIGRhdGEgZmlsdGVyaW5nIGFuZCAiICsKLSAgICAgICAgICAgICJ0aHVzIG1heSBoYXZlIHVucHJlZGljdGFibGUgcGVyZm9ybWFuY2UuIElmIHlvdSB3YW50IHRvIGV4ZWN1dGUgIiArCi0gICAgICAgICAgICAidGhpcyBxdWVyeSBkZXNwaXRlIHRoZSBwZXJmb3JtYW5jZSB1bnByZWRpY3RhYmlsaXR5LCB1c2UgQUxMT1cgRklMVEVSSU5HIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT1dfRklMVEVSSU5HX01FU1NBR0UgPQorICAgICAgICAgICAgIkNhbm5vdCBleGVjdXRlIHRoaXMgcXVlcnkgYXMgaXQgbWlnaHQgaW52b2x2ZSBkYXRhIGZpbHRlcmluZyBhbmQgdGh1cyBtYXkgaGF2ZSB1bnByZWRpY3RhYmxlIHBlcmZvcm1hbmNlLiAiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRVNfQUxMT1dfRklMVEVSSU5HX01FU1NBR0UgPSBBTExPV19GSUxURVJJTkdfTUVTU0FHRSArCisgICAgICAgICAgICAiSWYgeW91IHdhbnQgdG8gZXhlY3V0ZSB0aGlzIHF1ZXJ5IGRlc3BpdGUgdGhlIHBlcmZvcm1hbmNlIHVucHJlZGljdGFiaWxpdHksIHVzZSBBTExPVyBGSUxURVJJTkciOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FOTk9UX1VTRV9BTExPV19GSUxURVJJTkdfTUVTU0FHRSA9IEFMTE9XX0ZJTFRFUklOR19NRVNTQUdFICsKKyAgICAgICAgICAgICJFeGVjdXRpbmcgdGhpcyBxdWVyeSBkZXNwaXRlIHRoZSBwZXJmb3JtYW5jZSB1bnByZWRpY3RhYmlsaXR5IHdpdGggQUxMT1cgRklMVEVSSU5HIGhhcyBiZWVuIGRpc2FibGVkICIgKworICAgICAgICAgICAgImJ5IHRoZSBhbGxvd19maWx0ZXJpbmdfZW5hYmxlZCBwcm9wZXJ0eSBpbiBjYXNzYW5kcmEueWFtbCI7CiAKICAgICAvKioKICAgICAgKiBUaGUgdHlwZSBvZiBzdGF0ZW1lbnQKQEAgLTEyNSw3ICsxMzMsOCBAQAogICAgICAgICB0aGlzLm5vdE51bGxDb2x1bW5zID0gbmV3IEhhc2hTZXQ8PigpOwogICAgIH0KIAotICAgIHB1YmxpYyBTdGF0ZW1lbnRSZXN0cmljdGlvbnMoU3RhdGVtZW50VHlwZSB0eXBlLAorICAgIHB1YmxpYyBTdGF0ZW1lbnRSZXN0cmljdGlvbnMoQ2xpZW50U3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZW1lbnRUeXBlIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhIHRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hlcmVDbGF1c2Ugd2hlcmVDbGF1c2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZVNwZWNpZmljYXRpb25zIGJvdW5kTmFtZXMsCkBAIC0xMzMsMTQgKzE0MiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhbGxvd0ZpbHRlcmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZm9yVmlldykKICAgICB7Ci0gICAgICAgIHRoaXModHlwZSwgdGFibGUsIHdoZXJlQ2xhdXNlLCBib3VuZE5hbWVzLCBzZWxlY3RzT25seVN0YXRpY0NvbHVtbnMsIHR5cGUuYWxsb3dVc2VPZlNlY29uZGFyeUluZGljZXMoKSwgYWxsb3dGaWx0ZXJpbmcsIGZvclZpZXcpOworICAgICAgICB0aGlzKHN0YXRlLCB0eXBlLCB0YWJsZSwgd2hlcmVDbGF1c2UsIGJvdW5kTmFtZXMsIHNlbGVjdHNPbmx5U3RhdGljQ29sdW1ucywgdHlwZS5hbGxvd1VzZU9mU2Vjb25kYXJ5SW5kaWNlcygpLCBhbGxvd0ZpbHRlcmluZywgZm9yVmlldyk7CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBXZSB3YW50IHRvIG92ZXJyaWRlIGFsbG93VXNlT2ZTZWNvbmRhcnlJbmRpY2VzIGZsYWcgZnJvbSB0aGUgU3RhdGVtZW50VHlwZSBmb3IgTVYgc3RhdGVtZW50cwogICAgICAqIHRvIGF2b2lkIGluaXRpbmcgdGhlIEtleXNwYWNlIGFuZCBTZWNvbmRhcnlJbmRleE1hbmFnZXIuCiAgICAgICovCi0gICAgcHVibGljIFN0YXRlbWVudFJlc3RyaWN0aW9ucyhTdGF0ZW1lbnRUeXBlIHR5cGUsCisgICAgcHVibGljIFN0YXRlbWVudFJlc3RyaWN0aW9ucyhDbGllbnRTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlbWVudFR5cGUgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVyZUNsYXVzZSB3aGVyZUNsYXVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlU3BlY2lmaWNhdGlvbnMgYm91bmROYW1lcywKQEAgLTIxNCw3ICsyMjQsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgdGhlIHNlbGVjdCBzdGF0ZW1lbnQgaWYgZnVsbHkgY29uc3RydWN0ZWQsIGJ1dCB3ZSBzdGlsbCBoYXZlIGEgZmV3IHRoaW5ncyB0byB2YWxpZGF0ZQotICAgICAgICBwcm9jZXNzUGFydGl0aW9uS2V5UmVzdHJpY3Rpb25zKGhhc1F1ZXJpYWJsZUluZGV4LCBhbGxvd0ZpbHRlcmluZywgZm9yVmlldyk7CisgICAgICAgIHByb2Nlc3NQYXJ0aXRpb25LZXlSZXN0cmljdGlvbnMoc3RhdGUsIGhhc1F1ZXJpYWJsZUluZGV4LCBhbGxvd0ZpbHRlcmluZywgZm9yVmlldyk7CiAKICAgICAgICAgLy8gU29tZSBidXQgbm90IGFsbCBvZiB0aGUgcGFydGl0aW9uIGtleSBjb2x1bW5zIGhhdmUgYmVlbiBzcGVjaWZpZWQ7CiAgICAgICAgIC8vIGhlbmNlIHdlIG5lZWQgdHVybiB0aGVzZSByZXN0cmljdGlvbnMgaW50byBhIHJvdyBmaWx0ZXIuCkBAIC0yNjYsOCArMjc2LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChoYXNRdWVyaWFibGVJbmRleCkKICAgICAgICAgICAgICAgICB1c2VzU2Vjb25kYXJ5SW5kZXhpbmcgPSB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZiAoIWFsbG93RmlsdGVyaW5nKQotICAgICAgICAgICAgICAgIHRocm93IGludmFsaWRSZXF1ZXN0KFN0YXRlbWVudFJlc3RyaWN0aW9ucy5SRVFVSVJFU19BTExPV19GSUxURVJJTkdfTUVTU0FHRSk7CisgICAgICAgICAgICBlbHNlIGlmICghYWxsb3dGaWx0ZXJpbmcgJiYgcmVxdWlyZXNBbGxvd0ZpbHRlcmluZ0lmTm90U3BlY2lmaWVkKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgaW52YWxpZFJlcXVlc3QoYWxsb3dGaWx0ZXJpbmdNZXNzYWdlKHN0YXRlKSk7CiAKICAgICAgICAgICAgIGZpbHRlclJlc3RyaWN0aW9ucy5hZGQobm9uUHJpbWFyeUtleVJlc3RyaWN0aW9ucyk7CiAgICAgICAgIH0KQEAgLTI3Niw2ICsyODYsMTYgQEAKICAgICAgICAgICAgIHZhbGlkYXRlU2Vjb25kYXJ5SW5kZXhTZWxlY3Rpb25zKCk7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNBbGxvd0ZpbHRlcmluZ0lmTm90U3BlY2lmaWVkKCkKKyAgICB7CisgICAgICAgIGlmICghdGFibGUuaXNWaXJ0dWFsKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBWaXJ0dWFsVGFibGUgdGFibGVOdWxsYWJsZSA9IFZpcnR1YWxLZXlzcGFjZVJlZ2lzdHJ5Lmluc3RhbmNlLmdldFRhYmxlTnVsbGFibGUodGFibGUuaWQpOworICAgICAgICBhc3NlcnQgdGFibGVOdWxsYWJsZSAhPSBudWxsOworICAgICAgICByZXR1cm4gIXRhYmxlTnVsbGFibGUuYWxsb3dGaWx0ZXJpbmdJbXBsaWNpdGx5KCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGFkZFJlc3RyaWN0aW9uKFJlc3RyaWN0aW9uIHJlc3RyaWN0aW9uKQogICAgIHsKICAgICAgICAgQ29sdW1uTWV0YWRhdGEgZGVmID0gcmVzdHJpY3Rpb24uZ2V0Rmlyc3RDb2x1bW4oKTsKQEAgLTM4Myw2ICs0MDMsNTQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIHdoZXRoZXIgYSBzcGVjaWZpZWQgY29sdW1uIGlzIHJlc3RyaWN0ZWQgb24gZXF1YWxpdHkgb3Igc29tZXRoaW5nIGVxdWl2YWxlbnQsIGxpa2UgSU4uCisgICAgICogSXQgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgY29sdW1ucyBzZWxlY3RlZCBieSBhIHF1ZXJ5IHRvIGRldGVybWluZSB3aGljaCBvZiB0aG9zZSBjb2x1bW5zIGlzIAorICAgICAqIGFscmVhZHkgYm91bmQgYnkgdGhlIGNsaWVudCAoYW5kIGZyb20gaXRzIHBlcnNwZWN0aXZlLCBub3QgcmV0cmlldmVkIGJ5IHRoZSBkYXRhYmFzZSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sdW1uIGEgY29sdW1uIGZyb20gdGhlIHNhbWUgdGFibGUgdGhlc2UgcmVzdHJpY3Rpb25zIGFyZSBhZ2FpbnN0CisgICAgICoKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBjb2x1bW4gaXMgcmVzdHJpY3RlZCBvbiBlcXVhbGl0eQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXF1YWxpdHlSZXN0cmljdGVkKENvbHVtbk1ldGFkYXRhIGNvbHVtbikKKyAgICB7CisgICAgICAgIGlmIChjb2x1bW4ua2luZCA9PSBDb2x1bW5NZXRhZGF0YS5LaW5kLlBBUlRJVElPTl9LRVkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwYXJ0aXRpb25LZXlSZXN0cmljdGlvbnMuaGFzT25seUVxdWFsaXR5UmVzdHJpY3Rpb25zKCkpCisgICAgICAgICAgICAgICAgZm9yIChDb2x1bW5NZXRhZGF0YSByZXN0cmljdGVkIDogcGFydGl0aW9uS2V5UmVzdHJpY3Rpb25zLmdldENvbHVtbkRlZmluaXRpb25zKCkpCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0cmljdGVkLm5hbWUuZXF1YWxzKGNvbHVtbi5uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGNvbHVtbi5raW5kID09IENvbHVtbk1ldGFkYXRhLktpbmQuQ0xVU1RFUklORykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGhhc0NsdXN0ZXJpbmdDb2x1bW5zUmVzdHJpY3Rpb25zKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChTaW5nbGVSZXN0cmljdGlvbiByZXN0cmljdGlvbiA6IGNsdXN0ZXJpbmdDb2x1bW5zUmVzdHJpY3Rpb25zLmdldFJlc3RyaWN0aW9uU2V0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdHJpY3Rpb24uaXNFcXVhbGl0eUJhc2VkKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN0cmljdGlvbi5pc011bHRpQ29sdW1uKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChDb2x1bW5NZXRhZGF0YSByZXN0cmljdGVkIDogcmVzdHJpY3Rpb24uZ2V0Q29sdW1uRGVmcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdHJpY3RlZC5uYW1lLmVxdWFscyhjb2x1bW4ubmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3RyaWN0aW9uLmdldEZpcnN0Q29sdW1uKCkubmFtZS5lcXVhbHMoY29sdW1uLm5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGhhc05vblByaW1hcnlLZXlSZXN0cmljdGlvbnMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChTaW5nbGVSZXN0cmljdGlvbiByZXN0cmljdGlvbiA6IG5vblByaW1hcnlLZXlSZXN0cmljdGlvbnMpCisgICAgICAgICAgICAgICAgaWYgKHJlc3RyaWN0aW9uLmdldEZpcnN0Q29sdW1uKCkubmFtZS5lcXVhbHMoY29sdW1uLm5hbWUpICYmIHJlc3RyaWN0aW9uLmlzRXF1YWxpdHlCYXNlZCgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSA8Y29kZT5SZXN0cmljdGlvbnM8L2NvZGU+IGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgb2YgY29sdW1ucy4KICAgICAgKgogICAgICAqIEBwYXJhbSBraW5kIHRoZSBjb2x1bW4gdHlwZQpAQCAtNDA4LDcgKzQ3Niw3IEBACiAgICAgICAgIHJldHVybiB0aGlzLnVzZXNTZWNvbmRhcnlJbmRleGluZzsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BhcnRpdGlvbktleVJlc3RyaWN0aW9ucyhib29sZWFuIGhhc1F1ZXJpYWJsZUluZGV4LCBib29sZWFuIGFsbG93RmlsdGVyaW5nLCBib29sZWFuIGZvclZpZXcpCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NQYXJ0aXRpb25LZXlSZXN0cmljdGlvbnMoQ2xpZW50U3RhdGUgc3RhdGUsIGJvb2xlYW4gaGFzUXVlcmlhYmxlSW5kZXgsIGJvb2xlYW4gYWxsb3dGaWx0ZXJpbmcsIGJvb2xlYW4gZm9yVmlldykKICAgICB7CiAgICAgICAgIGlmICghdHlwZS5hbGxvd1BhcnRpdGlvbktleVJhbmdlcygpKQogICAgICAgICB7CkBAIC00NDQsOCArNTEyLDggQEAKICAgICAgICAgICAgIC8vIGNvbXBvbmVudHMgbXVzdCBoYXZlIGEgRVEuIE9ubHkgdGhlIGxhc3QgcGFydGl0aW9uIGtleSBjb21wb25lbnQgY2FuIGJlIGluIElOIHJlbGF0aW9uLgogICAgICAgICAgICAgaWYgKHBhcnRpdGlvbktleVJlc3RyaWN0aW9ucy5uZWVkRmlsdGVyaW5nKHRhYmxlKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWFsbG93RmlsdGVyaW5nICYmICFmb3JWaWV3ICYmICFoYXNRdWVyaWFibGVJbmRleCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKFJFUVVJUkVTX0FMTE9XX0ZJTFRFUklOR19NRVNTQUdFKTsKKyAgICAgICAgICAgICAgICBpZiAoIWFsbG93RmlsdGVyaW5nICYmICFmb3JWaWV3ICYmICFoYXNRdWVyaWFibGVJbmRleCAmJiByZXF1aXJlc0FsbG93RmlsdGVyaW5nSWZOb3RTcGVjaWZpZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKGFsbG93RmlsdGVyaW5nTWVzc2FnZShzdGF0ZSkpOwogCiAgICAgICAgICAgICAgICAgaXNLZXlSYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgdXNlc1NlY29uZGFyeUluZGV4aW5nID0gaGFzUXVlcmlhYmxlSW5kZXg7CkBAIC04NzQsNCArOTQyLDExIEBACiAgICAgewogICAgICAgICByZXR1cm4gVG9TdHJpbmdCdWlsZGVyLnJlZmxlY3Rpb25Ub1N0cmluZyh0aGlzLCBUb1N0cmluZ1N0eWxlLlNIT1JUX1BSRUZJWF9TVFlMRSk7CiAgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFsbG93RmlsdGVyaW5nTWVzc2FnZShDbGllbnRTdGF0ZSBzdGF0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBHdWFyZHJhaWxzLmFsbG93RmlsdGVyaW5nRW5hYmxlZC5pc0VuYWJsZWQoc3RhdGUpCisgICAgICAgICAgICAgICA/IFJFUVVJUkVTX0FMTE9XX0ZJTFRFUklOR19NRVNTQUdFCisgICAgICAgICAgICAgICA6IENBTk5PVF9VU0VfQUxMT1dfRklMVEVSSU5HX01FU1NBR0U7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vQWJzdHJhY3RGdW5jdGlvblNlbGVjdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9BYnN0cmFjdEZ1bmN0aW9uU2VsZWN0b3IuamF2YQppbmRleCBiZjI1NjRlLi5iMjFiNWY4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9BYnN0cmFjdEZ1bmN0aW9uU2VsZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9BYnN0cmFjdEZ1bmN0aW9uU2VsZWN0b3IuamF2YQpAQCAtMjIsMTQgKzIyLDE0IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy50ZXh0LlN0ckJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvblJlc29sdmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CkBAIC01NywyOCArNTcsMjYgQEAKICAgICAgICAgewogICAgICAgICAgICAgRnVuY3Rpb25OYW1lIG5hbWUgPSBuZXcgRnVuY3Rpb25OYW1lKGluLnJlYWRVVEYoKSwgaW4ucmVhZFVURigpKTsKIAotICAgICAgICAgICAgaW50IG51bWJlck9mQXJndW1lbnRzID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgaW50IG51bWJlck9mQXJndW1lbnRzID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMgPSBuZXcgQXJyYXlMaXN0PD4obnVtYmVyT2ZBcmd1bWVudHMpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZkFyZ3VtZW50czsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFyZ1R5cGVzLmFkZChyZWFkVHlwZShtZXRhZGF0YSwgaW4pKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgT3B0aW9uYWw8RnVuY3Rpb24+IG9wdGlvbmFsID0gU2NoZW1hLmluc3RhbmNlLmZpbmRGdW5jdGlvbihuYW1lLCBhcmdUeXBlcyk7CisgICAgICAgICAgICBGdW5jdGlvbiBmdW5jdGlvbiA9IEZ1bmN0aW9uUmVzb2x2ZXIuZ2V0KG1ldGFkYXRhLmtleXNwYWNlLCBuYW1lLCBhcmdUeXBlcywgbWV0YWRhdGEua2V5c3BhY2UsIG1ldGFkYXRhLm5hbWUsIG51bGwpOwogCi0gICAgICAgICAgICBpZiAoIW9wdGlvbmFsLmlzUHJlc2VudCgpKQorICAgICAgICAgICAgaWYgKGZ1bmN0aW9uID09IG51bGwpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlVua25vd24gc2VyaWFsaXplZCBmdW5jdGlvbiAlcyglcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnVHlwZXMuc3RyZWFtKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocCAtPiBwLmFzQ1FMM1R5cGUoKS50b1N0cmluZygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3Qoam9pbmluZygiLCAiKSkpKTsKIAotICAgICAgICAgICAgRnVuY3Rpb24gZnVuY3Rpb24gPSBvcHRpb25hbC5nZXQoKTsKLQogICAgICAgICAgICAgYm9vbGVhbiBpc1BhcnRpYWwgPSBpbi5yZWFkQm9vbGVhbigpOwogICAgICAgICAgICAgaWYgKGlzUGFydGlhbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgYml0c2V0ID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgICAgIGludCBiaXRzZXQgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHBhcnRpYWxQYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDw+KG51bWJlck9mQXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mQXJndW1lbnRzOyBpKyspCiAgICAgICAgICAgICAgICAgewpAQCAtOTEsNyArODksNyBAQAogICAgICAgICAgICAgICAgIGZ1bmN0aW9uID0gKChTY2FsYXJGdW5jdGlvbikgZnVuY3Rpb24pLnBhcnRpYWxBcHBsaWNhdGlvbihQcm90b2NvbFZlcnNpb24uQ1VSUkVOVCwgcGFydGlhbFBhcmFtZXRlcnMpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQgbnVtYmVyT2ZSZW1haW5pbmdBcmd1bWVudHMgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBpbnQgbnVtYmVyT2ZSZW1haW5pbmdBcmd1bWVudHMgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgICAgIExpc3Q8U2VsZWN0b3I+IGFyZ1NlbGVjdG9ycyA9IG5ldyBBcnJheUxpc3Q8PihudW1iZXJPZlJlbWFpbmluZ0FyZ3VtZW50cyk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mUmVtYWluaW5nQXJndW1lbnRzOyBpKyspCiAgICAgICAgICAgICB7CkBAIC0xMDIsOCArMTAwLDggQEAKICAgICAgICAgfQogCiAgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTZWxlY3RvciBuZXdGdW5jdGlvblNlbGVjdG9yKEZ1bmN0aW9uIGZ1bmN0aW9uLCBMaXN0PFNlbGVjdG9yPiBhcmdTZWxlY3RvcnMpOwotICAgIH07Ci0gICAgCisgICAgfQorCiAgICAgcHJvdGVjdGVkIGZpbmFsIFQgZnVuOwogCiAgICAgLyoqCkBAIC0zNDYsNyArMzQ0LDcgQEAKIAogICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMgPSBmdW5jdGlvbi5hcmdUeXBlcygpOwogICAgICAgICBpbnQgbnVtYmVyT2ZBcmd1bWVudHMgPSBhcmdUeXBlcy5zaXplKCk7Ci0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChudW1iZXJPZkFyZ3VtZW50cyk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKG51bWJlck9mQXJndW1lbnRzKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mQXJndW1lbnRzOyBpKyspCiAgICAgICAgICAgICB3cml0ZVR5cGUob3V0LCBhcmdUeXBlcy5nZXQoaSkpOwpAQCAtMzU4LDcgKzM1Niw3IEBACiAgICAgICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHBhcnRpYWxQYXJhbWV0ZXJzID0gKChQYXJ0aWFsU2NhbGFyRnVuY3Rpb24pIGZ1bikuZ2V0UGFydGlhbFBhcmFtZXRlcnMoKTsKIAogICAgICAgICAgICAgLy8gV2UgdXNlIGEgYml0c2V0IHRvIHRyYWNrIHRoZSBwb3NpdGlvbiBvZiB0aGUgdW5yZXNvbHZlZCBhcmd1bWVudHMKLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChjb21wdXRlQml0U2V0KHBhcnRpYWxQYXJhbWV0ZXJzKSk7CisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihjb21wdXRlQml0U2V0KHBhcnRpYWxQYXJhbWV0ZXJzKSk7CiAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBtID0gcGFydGlhbFBhcmFtZXRlcnMuc2l6ZSgpOyBpIDwgbTsgaSsrKQogICAgICAgICAgICAgewpAQCAtMzY5LDcgKzM2Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpbnQgbnVtYmVyT2ZSZW1haW5pbmdBcmd1bWVudHMgPSBhcmdTZWxlY3RvcnMuc2l6ZSgpOwotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQobnVtYmVyT2ZSZW1haW5pbmdBcmd1bWVudHMpOworICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihudW1iZXJPZlJlbWFpbmluZ0FyZ3VtZW50cyk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZSZW1haW5pbmdBcmd1bWVudHM7IGkrKykKICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGFyZ1NlbGVjdG9ycy5nZXQoaSksIG91dCwgdmVyc2lvbik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vQWdncmVnYXRlRnVuY3Rpb25TZWxlY3Rvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vQWdncmVnYXRlRnVuY3Rpb25TZWxlY3Rvci5qYXZhCmluZGV4IDhjNGY3NDUuLjhkMjFjMWUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0FnZ3JlZ2F0ZUZ1bmN0aW9uU2VsZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9BZ2dyZWdhdGVGdW5jdGlvblNlbGVjdG9yLmphdmEKQEAgLTQzLDEzICs0MywxNSBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBJbnB1dFJvdyBpbnB1dCkKKyAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChJbnB1dFJvdyBpbnB1dCkKICAgICB7CisgICAgICAgIFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24gPSBpbnB1dC5nZXRQcm90b2NvbFZlcnNpb24oKTsKKwogICAgICAgICAvLyBBZ2dyZWdhdGlvbiBvZiBhZ2dyZWdhdGlvbiBpcyBub3Qgc3VwcG9ydGVkCiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBtID0gYXJnU2VsZWN0b3JzLnNpemUoKTsgaSA8IG07IGkrKykKICAgICAgICAgewogICAgICAgICAgICAgU2VsZWN0b3IgcyA9IGFyZ1NlbGVjdG9ycy5nZXQoaSk7Ci0gICAgICAgICAgICBzLmFkZElucHV0KHByb3RvY29sVmVyc2lvbiwgaW5wdXQpOworICAgICAgICAgICAgcy5hZGRJbnB1dChpbnB1dCk7CiAgICAgICAgICAgICBzZXRBcmcoaSwgcy5nZXRPdXRwdXQocHJvdG9jb2xWZXJzaW9uKSk7CiAgICAgICAgICAgICBzLnJlc2V0KCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0NvbHVtblRpbWVzdGFtcHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0NvbHVtblRpbWVzdGFtcHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2FjOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vQ29sdW1uVGltZXN0YW1wcy5qYXZhCkBAIC0wLDAgKzEsMzk0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc2VsZWN0aW9uOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQm91bmRUeXBlOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuUmFuZ2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVzZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5Db2xsZWN0aW9uU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBsaXN0IG9mIHRpbWVzdGFtcHMgYXNzb2NpYXRlZCB0byBhIENRTCBjb2x1bW4uIFRob3NlIHRpbWVzdGFtcHMgY2FuIGVpdGhlciBiZSB3cml0ZXRpbWVzIG9yIFRUTHMsCisgKiBhY2NvcmRpbmcgdG8ge0BsaW5rIFRpbWVzdGFtcHNUeXBlfS4KKyAqLworYWJzdHJhY3QgY2xhc3MgQ29sdW1uVGltZXN0YW1wcworeworICAgIC8qKgorICAgICAqIFRoZSB0aW1lc3RhbXBzIHR5cGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIFRpbWVzdGFtcHNUeXBlIHR5cGU7CisKKyAgICBwcm90ZWN0ZWQgQ29sdW1uVGltZXN0YW1wcyhUaW1lc3RhbXBzVHlwZSB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB0aW1lc3RhbXBzIHR5cGUKKyAgICAgKi8KKyAgICBwdWJsaWMgVGltZXN0YW1wc1R5cGUgdHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gdHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIHRpbWVzdGFtcHMgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgdGltZXN0YW1wcyBwb3NpdGlvbgorICAgICAqIEByZXR1cm4gdGhlIHRpbWVzdGFtcHMgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBvciBhIHtAbGluayAjTk9fVElNRVNUQU1QfQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBDb2x1bW5UaW1lc3RhbXBzIGdldChpbnQgaW5kZXgpOworCisgICAgcHVibGljIGFic3RyYWN0IENvbHVtblRpbWVzdGFtcHMgbWF4KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdmlldyBvZiB0aGUgcG9ydGlvbiBvZiB0aGUgdGltZXN0YW1wcyB3aXRoaW4gdGhlIHNwZWNpZmllZCByYW5nZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByYW5nZSB0aGUgaW5kZXhlcyByYW5nZQorICAgICAqIEByZXR1cm4gYSB2aWV3IG9mIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugd2l0aGluIHRoaXMge0BsaW5rIENvbHVtblRpbWVzdGFtcHN9CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENvbHVtblRpbWVzdGFtcHMgc2xpY2UoUmFuZ2U8SW50ZWdlcj4gcmFuZ2UpOworCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhlIHRpbWVzdGFtcHMgaW50byB0aGVpciBzZXJpYWxpemVkIGZvcm0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdG9jb2xWZXJzaW9uIHRoZSBwcm90b2NvbCB2ZXJzaW9uIHRvIHVzZSBmb3IgdGhlIHNlcmlhbGl6YXRpb24KKyAgICAgKiBAcmV0dXJuIHRoZSBzZXJpYWxpemVkIHRpbWVzdGFtcHMKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZUJ1ZmZlciB0b0J5dGVCdWZmZXIoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbik7CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIGFuIGVtcHR5IHRpbWVzdGFtcCBhdCB0aGUgZW5kIG9mIHRoaXMgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGROb1RpbWVzdGFtcCgpOworCisgICAgLyoqCisgICAgICogQXBwZW5kcyB0aGUgdGltZXN0YW1wIG9mIHRoZSBzcGVjaWZpZWQgY2VsbCBhdCB0aGUgZW5kIG9mIHRoaXMgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRUaW1lc3RhbXBGcm9tKENlbGw8Pz4gY2VsbCwgaW50IG5vd0luU2Vjb25kKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENvbHVtblRpbWVzdGFtcHN9IGluc3RhbmNlIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFR5cGUgdGhlIHRpbWVzdGFtcHMgdHlwZQorICAgICAqIEBwYXJhbSBjb2x1bW5UeXBlICAgIHRoZSBjb2x1bW4gdHlwZQorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgQ29sdW1uVGltZXN0YW1wc30gaW5zdGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uIHR5cGUKKyAgICAgKi8KKyAgICBzdGF0aWMgQ29sdW1uVGltZXN0YW1wcyBuZXdUaW1lc3RhbXBzKFRpbWVzdGFtcHNUeXBlIHRpbWVzdGFtcFR5cGUsIEFic3RyYWN0VHlwZTw/PiBjb2x1bW5UeXBlKQorICAgIHsKKyAgICAgICAgaWYgKCFjb2x1bW5UeXBlLmlzTXVsdGlDZWxsKCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IFNpbmdsZVRpbWVzdGFtcHModGltZXN0YW1wVHlwZSk7CisKKyAgICAgICAgLy8gRm9yIFVzZXJUeXBlIHdlIGtub3cgdGhhdCB0aGUgc2l6ZSB3aWxsIG5vdCBjaGFuZ2UsIHNvIHdlIGNhbiBpbml0aWFsaXplIHRoZSBhcnJheSB3aXRoIHRoZSBwcm9wZXIgY2FwYWNpdHkuCisgICAgICAgIGlmIChjb2x1bW5UeXBlIGluc3RhbmNlb2YgVXNlclR5cGUpCisgICAgICAgICAgICByZXR1cm4gbmV3IE11bHRpcGxlVGltZXN0YW1wcyh0aW1lc3RhbXBUeXBlLCAoKFVzZXJUeXBlKSBjb2x1bW5UeXBlKS5zaXplKCkpOworCisgICAgICAgIHJldHVybiBuZXcgTXVsdGlwbGVUaW1lc3RhbXBzKHRpbWVzdGFtcFR5cGUsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHJlcHJlc2VudGVkIHRpbWVzdGFtcHMuCisgICAgICovCisgICAgcHVibGljIGVudW0gVGltZXN0YW1wc1R5cGUKKyAgICB7CisgICAgICAgIFdSSVRFVElNRVMKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBsb25nIGdldFRpbWVzdGFtcChDZWxsPD8+IGNlbGwsIGludCBub3dJblNlY29uZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2VsbC50aW1lc3RhbXAoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBsb25nIGRlZmF1bHRWYWx1ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIExvbmcuTUlOX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgdG9CeXRlQnVmZmVyKGxvbmcgdGltZXN0YW1wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0aW1lc3RhbXAgPT0gZGVmYXVsdFZhbHVlKCkgPyBudWxsIDogQnl0ZUJ1ZmZlclV0aWwuYnl0ZXModGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgVFRMUworICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIGxvbmcgZ2V0VGltZXN0YW1wKENlbGw8Pz4gY2VsbCwgaW50IG5vd0luU2Vjb25kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghY2VsbC5pc0V4cGlyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUoKTsKKworICAgICAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBjZWxsLmxvY2FsRGVsZXRpb25UaW1lKCkgLSBub3dJblNlY29uZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVtYWluaW5nID49IDAgPyByZW1haW5pbmcgOiBkZWZhdWx0VmFsdWUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBsb25nIGRlZmF1bHRWYWx1ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgdG9CeXRlQnVmZmVyKGxvbmcgdGltZXN0YW1wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0aW1lc3RhbXAgPT0gZGVmYXVsdFZhbHVlKCkgPyBudWxsIDogQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGludCkgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRXh0cmFjdHMgdGhlIHRpbWVzdGFtcCBmcm9tIHRoZSBzcGVjaWZpZWQgY2VsbC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNlbGwgICAgICAgIHRoZSBjZWxsCisgICAgICAgICAqIEBwYXJhbSBub3dJblNlY29uZCB0aGUgcXVlcnkgdGltZXN0YW1wIGluc2Vjb25kCisgICAgICAgICAqIEByZXR1cm4gdGhlIHRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgdHlwZQorICAgICAgICAgKi8KKyAgICAgICAgYWJzdHJhY3QgbG9uZyBnZXRUaW1lc3RhbXAoQ2VsbDw/PiBjZWxsLCBpbnQgbm93SW5TZWNvbmQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGVyZSBpcyBubyB0aW1lc3RhbXAuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZXJlIGlzIG5vIHRpbWVzdGFtcAorICAgICAgICAgKi8KKyAgICAgICAgYWJzdHJhY3QgbG9uZyBkZWZhdWx0VmFsdWUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2VyaWFsaXplcyB0aGUgc3BlY2lmaWVkIHRpbWVzdGFtcC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRpbWVzdGFtcCB0aGUgdGltZXN0YW1wIHRvIHNlcmlhbGl6ZQorICAgICAgICAgKiBAcmV0dXJuIHRoZSBieXRlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgdGltZXN0YW1wCisgICAgICAgICAqLworICAgICAgICBhYnN0cmFjdCBCeXRlQnVmZmVyIHRvQnl0ZUJ1ZmZlcihsb25nIHRpbWVzdGFtcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB7QGxpbmsgQ29sdW1uVGltZXN0YW1wc30gdGhhdCBkb2Vzbid0IGNvbnRhaW4gYW55IHRpbWVzdGFtcHMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIENvbHVtblRpbWVzdGFtcHMgTk9fVElNRVNUQU1QID0gbmV3IENvbHVtblRpbWVzdGFtcHMobnVsbCkKKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29sdW1uVGltZXN0YW1wcyBnZXQoaW50IGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29sdW1uVGltZXN0YW1wcyBtYXgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29sdW1uVGltZXN0YW1wcyBzbGljZShSYW5nZTxJbnRlZ2VyPiByYW5nZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgdG9CeXRlQnVmZmVyKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZE5vVGltZXN0YW1wKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYWRkVGltZXN0YW1wRnJvbShDZWxsPD8+IGNlbGwsIGludCBub3dJblNlY29uZCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAibm8gdGltZXN0YW1wIjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBIHtAbGluayBDb2x1bW5UaW1lc3RhbXBzfSB0aGF0IGNhbiBjb250YWlucyBhIHNpbmdsZSB0aW1lc3RhbXAgKGZvciBjb2x1bW5zIHRoYXQgYXJlbid0IG11bHRpY2VsbCkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2luZ2xlVGltZXN0YW1wcyBleHRlbmRzIENvbHVtblRpbWVzdGFtcHMKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBsb25nIHRpbWVzdGFtcDsKKworICAgICAgICBwdWJsaWMgU2luZ2xlVGltZXN0YW1wcyhUaW1lc3RhbXBzVHlwZSB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzKHR5cGUsIHR5cGUuZGVmYXVsdFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNpbmdsZVRpbWVzdGFtcHMoVGltZXN0YW1wc1R5cGUgdHlwZSwgbG9uZyB0aW1lc3RhbXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHR5cGUpOworICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYWRkTm9UaW1lc3RhbXAoKQorICAgICAgICB7CisgICAgICAgICAgICB0aW1lc3RhbXAgPSB0eXBlLmRlZmF1bHRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZFRpbWVzdGFtcEZyb20oQ2VsbDw/PiBjZWxsLCBpbnQgbm93SW5TZWNvbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpbWVzdGFtcCA9IHR5cGUuZ2V0VGltZXN0YW1wKGNlbGwsIG5vd0luU2Vjb25kKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29sdW1uVGltZXN0YW1wcyBnZXQoaW50IGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgaXQgbWVhbnMgdGhhdCBpdCBpcyBhbiBlbGVtZW50IHNlbGVjdGlvbiBvbiBhIGZyb3plbiBjb2xsZWN0aW9uL1VEVCwKKyAgICAgICAgICAgIC8vIHNvIHdlIGNhbiBzYWZlbHkgcmV0dXJuIHRoaXMgVGltZXN0YW1wcyBhcyBhbGwgdGhlIGVsZW1lbnRzIGFsc28gc2hhcmUgdGhhdCB0aW1lc3RhbXAKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb2x1bW5UaW1lc3RhbXBzIG1heCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb2x1bW5UaW1lc3RhbXBzIHNsaWNlKFJhbmdlPEludGVnZXI+IHJhbmdlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmFuZ2UuaXNFbXB0eSgpID8gTk9fVElNRVNUQU1QIDogdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciB0b0J5dGVCdWZmZXIoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcCA9PSB0eXBlLmRlZmF1bHRWYWx1ZSgpID8gbnVsbCA6IHR5cGUudG9CeXRlQnVmZmVyKHRpbWVzdGFtcCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlICsgIjogIiArIHRpbWVzdGFtcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEge0BsaW5rIENvbHVtblRpbWVzdGFtcHN9IHRoYXQgY2FuIGNvbnRhaW4gbXVsdGlwbGUgdGltZXN0YW1wcyAoZm9yIHVuZnJvemVuIGNvbGxlY3Rpb25zIG9yIFVEVHMpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE11bHRpcGxlVGltZXN0YW1wcyBleHRlbmRzIENvbHVtblRpbWVzdGFtcHMKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxMb25nPiB0aW1lc3RhbXBzOworCisgICAgICAgIHB1YmxpYyBNdWx0aXBsZVRpbWVzdGFtcHMoVGltZXN0YW1wc1R5cGUgdHlwZSwgaW50IGluaXRpYWxDYXBhY2l0eSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcyh0eXBlLCBuZXcgQXJyYXlMaXN0PD4oaW5pdGlhbENhcGFjaXR5KSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTXVsdGlwbGVUaW1lc3RhbXBzKFRpbWVzdGFtcHNUeXBlIHR5cGUsIExpc3Q8TG9uZz4gdGltZXN0YW1wcykKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIodHlwZSk7CisgICAgICAgICAgICB0aGlzLnRpbWVzdGFtcHMgPSB0aW1lc3RhbXBzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZE5vVGltZXN0YW1wKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGltZXN0YW1wcy5hZGQodHlwZS5kZWZhdWx0VmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYWRkVGltZXN0YW1wRnJvbShDZWxsPD8+IGNlbGwsIGludCBub3dJblNlY29uZCkKKyAgICAgICAgeworICAgICAgICAgICAgdGltZXN0YW1wcy5hZGQodHlwZS5nZXRUaW1lc3RhbXAoY2VsbCwgbm93SW5TZWNvbmQpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29sdW1uVGltZXN0YW1wcyBnZXQoaW50IGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wcy5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAgICA/IE5PX1RJTUVTVEFNUAorICAgICAgICAgICAgICAgICAgIDogbmV3IFNpbmdsZVRpbWVzdGFtcHModHlwZSwgdGltZXN0YW1wcy5nZXQoaW5kZXgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29sdW1uVGltZXN0YW1wcyBtYXgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wcy5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAgICA/IE5PX1RJTUVTVEFNUAorICAgICAgICAgICAgICAgICAgIDogbmV3IFNpbmdsZVRpbWVzdGFtcHModHlwZSwgQ29sbGVjdGlvbnMubWF4KHRpbWVzdGFtcHMpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29sdW1uVGltZXN0YW1wcyBzbGljZShSYW5nZTxJbnRlZ2VyPiByYW5nZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJhbmdlLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fVElNRVNUQU1QOworCisgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSAiZnJvbSIgYXJndW1lbnQgZm9yIHRoZSBjYWxsIHRvIExpc3Qjc3VibGlzdCBiZWxvdy4gVGhhdCBhcmd1bWVudCBpcyBhbHdheXMgc3BlY2lmaWVkIGFuZAorICAgICAgICAgICAgLy8gaW5jbHVzaXZlLCB3aGVyZWFzIHRoZSByYW5nZSBsb3dlciBib3VuZCBjYW4gYmUgb3BlbiwgY2xvc2VkIG9yIG5vdCBzcGVjaWZpZWQuCisgICAgICAgICAgICBpbnQgZnJvbSA9IDA7CisgICAgICAgICAgICBpZiAocmFuZ2UuaGFzTG93ZXJCb3VuZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZyb20gPSByYW5nZS5sb3dlckJvdW5kVHlwZSgpID09IEJvdW5kVHlwZS5DTE9TRUQKKyAgICAgICAgICAgICAgICAgICAgICAgPyByYW5nZS5sb3dlckVuZHBvaW50KCkgLy8gaW5jbHVzaXZlIHJhbmdlIGxvd2VyIGJvdW5kLCBpbmNsdXNpdmUgImZyb20iIGlzIHRoZSBzYW1lIGxpc3QgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgOiByYW5nZS5sb3dlckVuZHBvaW50KCkgKyAxOyAvLyBleGNsdXNpdmUgcmFuZ2UgbG93ZXIgYm91bmQsIGluY2x1c2l2ZSAiZnJvbSIgaXMgdGhlIG5leHQgbGlzdCBwb3NpdGlvbgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSAidG8iIGFyZ3VtZW50IGZvciB0aGUgY2FsbCB0byBMaXN0I3N1Ymxpc3QgYmVsb3cuIFRoYXQgYXJndW1lbnQgaXMgYWx3YXlzIHNwZWNpZmllZCBhbmQKKyAgICAgICAgICAgIC8vIGV4Y2x1c2l2ZSwgd2hlcmVhcyB0aGUgcmFuZ2UgdXBwZXIgYm91bmQgY2FuIGJlIG9wZW4sIGNsb3NlZCBvciBub3Qgc3BlY2lmaWVkLgorICAgICAgICAgICAgaW50IHRvID0gdGltZXN0YW1wcy5zaXplKCk7CisgICAgICAgICAgICBpZiAocmFuZ2UuaGFzVXBwZXJCb3VuZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRvID0gcmFuZ2UudXBwZXJCb3VuZFR5cGUoKSA9PSBCb3VuZFR5cGUuQ0xPU0VECisgICAgICAgICAgICAgICAgICAgICA/IHJhbmdlLnVwcGVyRW5kcG9pbnQoKSArIDEgLy8gaW5jbHVzaXZlIHJhbmdlIHVwcGVyIGJvdW5kLCBleGNsdXNpdmUgInRvIiBpcyB0aGUgbmV4dCBsaXN0IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICA6IHJhbmdlLnVwcGVyRW5kcG9pbnQoKTsgLy8gZXhjbHVzaXZlIHJhbmdlIHVwcGVyIGJvdW5kLCBleGNsdXNpdmUgInRvIiBpcyB0aGUgc2FtZSBsaXN0IHBvc2l0aW9uCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgTXVsdGlwbGVUaW1lc3RhbXBzKHR5cGUsIHRpbWVzdGFtcHMuc3ViTGlzdChmcm9tLCB0bykpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIHRvQnl0ZUJ1ZmZlcihQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGltZXN0YW1wcy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gYnVmZmVycyA9IG5ldyBBcnJheUxpc3Q8Pih0aW1lc3RhbXBzLnNpemUoKSk7CisgICAgICAgICAgICB0aW1lc3RhbXBzLmZvckVhY2godGltZXN0YW1wIC0+IGJ1ZmZlcnMuYWRkKHR5cGUudG9CeXRlQnVmZmVyKHRpbWVzdGFtcCkpKTsKKworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2soYnVmZmVycywgdGltZXN0YW1wcy5zaXplKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSArICI6ICIgKyB0aW1lc3RhbXBzOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vRWxlbWVudHNTZWxlY3Rvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vRWxlbWVudHNTZWxlY3Rvci5qYXZhCmluZGV4IGU1MjBkMGYuLjQ2NDRiYTIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0VsZW1lbnRzU2VsZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9FbGVtZW50c1NlbGVjdG9yLmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuUmFuZ2U7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtblNwZWNpZmljYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeU9wdGlvbnM7CkBAIC00MywxMiArNDQsMTkgQEAKICAqLwogYWJzdHJhY3QgY2xhc3MgRWxlbWVudHNTZWxlY3RvciBleHRlbmRzIFNlbGVjdG9yCiB7CisgICAgLyoqCisgICAgICogQW4gZW1wdHkgY29sbGVjdGlvbiBpcyBjb21wb3NlZCBvZiBhbiBpbnQgc2l6ZSBvZiB6ZXJvLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgRU1QVFlfRlJPWkVOX0NPTExFQ1RJT04gPSBCeXRlQnVmZmVyVXRpbC5ieXRlcygwKTsKKwogICAgIHByb3RlY3RlZCBmaW5hbCBTZWxlY3RvciBzZWxlY3RlZDsKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvblR5cGU8Pz4gdHlwZTsKIAogICAgIHByb3RlY3RlZCBFbGVtZW50c1NlbGVjdG9yKEtpbmQga2luZCxTZWxlY3RvciBzZWxlY3RlZCkKICAgICB7CiAgICAgICAgIHN1cGVyKGtpbmQpOwogICAgICAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7CisgICAgICAgIHRoaXMudHlwZSA9IGdldENvbGxlY3Rpb25UeXBlKHNlbGVjdGVkKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVW5zZXQoQnl0ZUJ1ZmZlciBiYikKQEAgLTIzNyw5ICsyNDUsMTQgQEAKIAogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBCeXRlQnVmZmVyIGV4dHJhY3RTZWxlY3Rpb24oQnl0ZUJ1ZmZlciBjb2xsZWN0aW9uKTsKIAotICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIElucHV0Um93IGlucHV0KQorICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KElucHV0Um93IGlucHV0KQogICAgIHsKLSAgICAgICAgc2VsZWN0ZWQuYWRkSW5wdXQocHJvdG9jb2xWZXJzaW9uLCBpbnB1dCk7CisgICAgICAgIHNlbGVjdGVkLmFkZElucHV0KGlucHV0KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmFuZ2U8SW50ZWdlcj4gZ2V0SW5kZXhSYW5nZShCeXRlQnVmZmVyIG91dHB1dCwgQnl0ZUJ1ZmZlciBmcm9tS2V5LCBCeXRlQnVmZmVyIHRvS2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHR5cGUuZ2V0U2VyaWFsaXplcigpLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKG91dHB1dCwgZnJvbUtleSwgdG9LZXksIGtleVR5cGUodHlwZSkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKQEAgLTI2NiwxMyArMjc5LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uVHlwZTw/PiB0eXBlOwogICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXIga2V5OwogCiAgICAgICAgIHByaXZhdGUgRWxlbWVudFNlbGVjdG9yKFNlbGVjdG9yIHNlbGVjdGVkLCBCeXRlQnVmZmVyIGtleSkKICAgICAgICAgewogICAgICAgICAgICAgc3VwZXIoS2luZC5FTEVNRU5UX1NFTEVDVE9SLCBzZWxlY3RlZCk7Ci0gICAgICAgICAgICB0aGlzLnR5cGUgPSBnZXRDb2xsZWN0aW9uVHlwZShzZWxlY3RlZCk7CiAgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKICAgICAgICAgfQogCkBAIC0yOTQsNiArMzA1LDMxIEBACiAgICAgICAgICAgICByZXR1cm4gdHlwZS5nZXRTZXJpYWxpemVyKCkuZ2V0U2VyaWFsaXplZFZhbHVlKGNvbGxlY3Rpb24sIGtleSwga2V5VHlwZSh0eXBlKSk7CiAgICAgICAgIH0KIAorICAgICAgICBwcm90ZWN0ZWQgaW50IGdldEVsZW1lbnRJbmRleChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBCeXRlQnVmZmVyIGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBvdXRwdXQgPSBzZWxlY3RlZC5nZXRPdXRwdXQocHJvdG9jb2xWZXJzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXQgPT0gbnVsbCA/IC0xIDogdHlwZS5nZXRTZXJpYWxpemVyKCkuZ2V0SW5kZXhGcm9tU2VyaWFsaXplZChvdXRwdXQsIGtleSwga2V5VHlwZSh0eXBlKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvbHVtblRpbWVzdGFtcHMgZ2V0V3JpdGV0aW1lcyhQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFRpbWVzdGFtcHMocHJvdG9jb2xWZXJzaW9uLCBzZWxlY3RlZC5nZXRXcml0ZXRpbWVzKHByb3RvY29sVmVyc2lvbikpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb2x1bW5UaW1lc3RhbXBzIGdldFRUTHMoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGdldEVsZW1lbnRUaW1lc3RhbXBzKHByb3RvY29sVmVyc2lvbiwgc2VsZWN0ZWQuZ2V0VFRMcyhwcm90b2NvbFZlcnNpb24pKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ29sdW1uVGltZXN0YW1wcyBnZXRFbGVtZW50VGltZXN0YW1wcyhQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uVGltZXN0YW1wcyB0aW1lc3RhbXBzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBnZXRFbGVtZW50SW5kZXgocHJvdG9jb2xWZXJzaW9uLCBrZXkpOworICAgICAgICAgICAgcmV0dXJuIGluZGV4ID09IC0xID8gQ29sdW1uVGltZXN0YW1wcy5OT19USU1FU1RBTVAgOiB0aW1lc3RhbXBzLmdldChpbmRleCk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldFR5cGUoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gdmFsdWVUeXBlKHR5cGUpOwpAQCAtMzU4LDggKzM5NCw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uVHlwZTw/PiB0eXBlOwotCiAgICAgICAgIC8vIE5vdGUgdGhhdCBuZWl0aGVyIGZyb20gbm9yIHRvIGNhbiBiZSBudWxsLCBidXQgdGhleSBjYW4gYm90aCBiZSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUiB0byByZXByZXNlbnQgbm8gcGFydGljdWxhciBib3VuZAogICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXIgZnJvbTsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIHRvOwpAQCAtMzY4LDcgKzQwMiw2IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHN1cGVyKEtpbmQuU0xJQ0VfU0VMRUNUT1IsIHNlbGVjdGVkKTsKICAgICAgICAgICAgIGFzc2VydCBmcm9tICE9IG51bGwgJiYgdG8gIT0gbnVsbCA6ICJXZSBjYW4gaGF2ZSB1bnNldCBidWZmZXJzLCBidXQgbm90IG51bGxzIjsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IGdldENvbGxlY3Rpb25UeXBlKHNlbGVjdGVkKTsKICAgICAgICAgICAgIHRoaXMuZnJvbSA9IGZyb207CiAgICAgICAgICAgICB0aGlzLnRvID0gdG87CiAgICAgICAgIH0KQEAgLTM5MSw2ICs0MjQsMzYgQEAKICAgICAgICAgICAgIHJldHVybiB0eXBlLmdldFNlcmlhbGl6ZXIoKS5nZXRTbGljZUZyb21TZXJpYWxpemVkKGNvbGxlY3Rpb24sIGZyb20sIHRvLCB0eXBlLm5hbWVDb21wYXJhdG9yKCksIHR5cGUuaXNGcm96ZW5Db2xsZWN0aW9uKCkpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDb2x1bW5UaW1lc3RhbXBzIGdldFdyaXRldGltZXMoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGdldFRpbWVzdGFtcHNTbGljZShwcm90b2NvbFZlcnNpb24sIHNlbGVjdGVkLmdldFdyaXRldGltZXMocHJvdG9jb2xWZXJzaW9uKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENvbHVtblRpbWVzdGFtcHMgZ2V0VFRMcyhQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VGltZXN0YW1wc1NsaWNlKHByb3RvY29sVmVyc2lvbiwgc2VsZWN0ZWQuZ2V0VFRMcyhwcm90b2NvbFZlcnNpb24pKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBDb2x1bW5UaW1lc3RhbXBzIGdldFRpbWVzdGFtcHNTbGljZShQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBDb2x1bW5UaW1lc3RhbXBzIHRpbWVzdGFtcHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgb3V0cHV0ID0gc2VsZWN0ZWQuZ2V0T3V0cHV0KHByb3RvY29sVmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gKG91dHB1dCA9PSBudWxsIHx8IGlzQ29sbGVjdGlvbkVtcHR5KG91dHB1dCkpCisgICAgICAgICAgICAgICAgICAgPyBDb2x1bW5UaW1lc3RhbXBzLk5PX1RJTUVTVEFNUAorICAgICAgICAgICAgICAgICAgIDogdGltZXN0YW1wcy5zbGljZShnZXRJbmRleFJhbmdlKG91dHB1dCwgZnJvbSwgdG8pICk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5LiBPbmx5IGZyb3plbiBjb2xsZWN0aW9uIGNhbiBiZSBlbXB0eS4KKyAgICAgICAgICogQHBhcmFtIG91dHB1dCB0aGUgc2VyaWFsaXplZCBjb2xsZWN0aW9uCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5IHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQ29sbGVjdGlvbkVtcHR5KEJ5dGVCdWZmZXIgb3V0cHV0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRU1QVFlfRlJPWkVOX0NPTExFQ1RJT04uZXF1YWxzKG91dHB1dCk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldFR5cGUoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gdHlwZTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0ZpZWxkU2VsZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0ZpZWxkU2VsZWN0b3IuamF2YQppbmRleCAwYzYyMzk3Li4yMGMxMDI5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9GaWVsZFNlbGVjdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vRmllbGRTZWxlY3Rvci5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Vc2VyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKQEAgLTQxLDcgKzQyLDcgQEAKICAgICAgICAgcHJvdGVjdGVkIFNlbGVjdG9yIGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uLCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgVXNlclR5cGUgdHlwZSA9IChVc2VyVHlwZSkgcmVhZFR5cGUobWV0YWRhdGEsIGluKTsKLSAgICAgICAgICAgIGludCBmaWVsZCA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBmaWVsZCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgU2VsZWN0b3Igc2VsZWN0ZWQgPSBTZWxlY3Rvci5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCB2ZXJzaW9uLCBtZXRhZGF0YSk7CiAKICAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRTZWxlY3Rvcih0eXBlLCBmaWVsZCwgc2VsZWN0ZWQpOwpAQCAtOTgsOSArOTksOSBAQAogICAgICAgICBzZWxlY3RlZC5hZGRGZXRjaGVkQ29sdW1ucyhidWlsZGVyKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBJbnB1dFJvdyBpbnB1dCkKKyAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChJbnB1dFJvdyBpbnB1dCkKICAgICB7Ci0gICAgICAgIHNlbGVjdGVkLmFkZElucHV0KHByb3RvY29sVmVyc2lvbiwgaW5wdXQpOworICAgICAgICBzZWxlY3RlZC5hZGRJbnB1dChpbnB1dCk7CiAgICAgfQogCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0T3V0cHV0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCkBAIC0xMDgsMTAgKzEwOSwyNiBAQAogICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gc2VsZWN0ZWQuZ2V0T3V0cHV0KHByb3RvY29sVmVyc2lvbik7CiAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIEJ5dGVCdWZmZXJbXSBidWZmZXJzID0gdHlwZS5zcGxpdCh2YWx1ZSk7CisgICAgICAgIEJ5dGVCdWZmZXJbXSBidWZmZXJzID0gdHlwZS5zcGxpdChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHZhbHVlKTsKICAgICAgICAgcmV0dXJuIGZpZWxkIDwgYnVmZmVycy5sZW5ndGggPyBidWZmZXJzW2ZpZWxkXSA6IG51bGw7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENvbHVtblRpbWVzdGFtcHMgZ2V0V3JpdGV0aW1lcyhQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldE91dHB1dChwcm90b2NvbFZlcnNpb24pID09IG51bGwKKyAgICAgICAgICAgICAgID8gQ29sdW1uVGltZXN0YW1wcy5OT19USU1FU1RBTVAKKyAgICAgICAgICAgICAgIDogc2VsZWN0ZWQuZ2V0V3JpdGV0aW1lcyhwcm90b2NvbFZlcnNpb24pLmdldChmaWVsZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENvbHVtblRpbWVzdGFtcHMgZ2V0VFRMcyhQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldE91dHB1dChwcm90b2NvbFZlcnNpb24pID09IG51bGwKKyAgICAgICAgICAgICAgID8gQ29sdW1uVGltZXN0YW1wcy5OT19USU1FU1RBTVAKKyAgICAgICAgICAgICAgIDogc2VsZWN0ZWQuZ2V0VFRMcyhwcm90b2NvbFZlcnNpb24pLmdldChmaWVsZCk7CisgICAgfQorCiAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRUeXBlKCkKICAgICB7CiAgICAgICAgIHJldHVybiB0eXBlLmZpZWxkVHlwZShmaWVsZCk7CkBAIC0xNzQsNyArMTkxLDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICB3cml0ZVR5cGUob3V0LCB0eXBlKTsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGZpZWxkKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoZmllbGQpOwogICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShzZWxlY3RlZCwgb3V0LCB2ZXJzaW9uKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9MaXN0U2VsZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0xpc3RTZWxlY3Rvci5qYXZhCmluZGV4IDkxMzZhYjIuLjVkMDk1ZDUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0xpc3RTZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL0xpc3RTZWxlY3Rvci5qYXZhCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgICAgIHByb3RlY3RlZCBTZWxlY3RvciBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbiwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIExpc3RUeXBlPD8+IHR5cGUgPSAoTGlzdFR5cGU8Pz4pIHJlYWRUeXBlKG1ldGFkYXRhLCBpbik7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBzaXplID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICBMaXN0PFNlbGVjdG9yPiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8PihzaXplKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgICAgICAgICAgICAgIGVsZW1lbnRzLmFkZChzZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCB2ZXJzaW9uLCBtZXRhZGF0YSkpOwpAQCAtODksMTAgKzg5LDEwIEBACiAgICAgICAgICAgICBlbGVtZW50cy5nZXQoaSkuYWRkRmV0Y2hlZENvbHVtbnMoYnVpbGRlcik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkSW5wdXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgSW5wdXRSb3cgaW5wdXQpCisgICAgcHVibGljIHZvaWQgYWRkSW5wdXQoSW5wdXRSb3cgaW5wdXQpCiAgICAgewogICAgICAgICBmb3IgKGludCBpID0gMCwgbSA9IGVsZW1lbnRzLnNpemUoKTsgaSA8IG07IGkrKykKLSAgICAgICAgICAgIGVsZW1lbnRzLmdldChpKS5hZGRJbnB1dChwcm90b2NvbFZlcnNpb24sIGlucHV0KTsKKyAgICAgICAgICAgIGVsZW1lbnRzLmdldChpKS5hZGRJbnB1dChpbnB1dCk7CiAgICAgfQogCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0T3V0cHV0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgYnVmZmVycy5hZGQoZWxlbWVudHMuZ2V0KGkpLmdldE91dHB1dChwcm90b2NvbFZlcnNpb24pKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhidWZmZXJzLCBidWZmZXJzLnNpemUoKSwgcHJvdG9jb2xWZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2soYnVmZmVycywgYnVmZmVycy5zaXplKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKQEAgLTE3NSw3ICsxNzUsNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIHdyaXRlVHlwZShvdXQsIHR5cGUpOwotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoZWxlbWVudHMuc2l6ZSgpKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoZWxlbWVudHMuc2l6ZSgpKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG0gPSBlbGVtZW50cy5zaXplKCk7IGkgPCBtOyBpKyspCiAgICAgICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShlbGVtZW50cy5nZXQoaSksIG91dCwgdmVyc2lvbik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vTWFwU2VsZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL01hcFNlbGVjdG9yLmphdmEKaW5kZXggZGM4MTFjMC4uMjY1ODBlNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vTWFwU2VsZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9NYXBTZWxlY3Rvci5qYXZhCkBAIC01NCw3ICs1NCw3IEBACiAgICAgICAgIHByb3RlY3RlZCBTZWxlY3RvciBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbiwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIE1hcFR5cGU8PywgPz4gdHlwZSA9IChNYXBUeXBlPD8sID8+KSByZWFkVHlwZShtZXRhZGF0YSwgaW4pOwotICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgTGlzdDxQYWlyPFNlbGVjdG9yLCBTZWxlY3Rvcj4+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PD4oc2l6ZSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKICAgICAgICAgICAgIHsKQEAgLTE5MywxMyArMTkzLDEzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBJbnB1dFJvdyBpbnB1dCkKKyAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChJbnB1dFJvdyBpbnB1dCkKICAgICB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBtID0gZWxlbWVudHMuc2l6ZSgpOyBpIDwgbTsgaSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBQYWlyPFNlbGVjdG9yLCBTZWxlY3Rvcj4gcGFpciA9IGVsZW1lbnRzLmdldChpKTsKLSAgICAgICAgICAgIHBhaXIubGVmdC5hZGRJbnB1dChwcm90b2NvbFZlcnNpb24sIGlucHV0KTsKLSAgICAgICAgICAgIHBhaXIucmlnaHQuYWRkSW5wdXQocHJvdG9jb2xWZXJzaW9uLCBpbnB1dCk7CisgICAgICAgICAgICBwYWlyLmxlZnQuYWRkSW5wdXQoaW5wdXQpOworICAgICAgICAgICAgcGFpci5yaWdodC5hZGRJbnB1dChpbnB1dCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIxOCw3ICsyMTgsNyBAQAogICAgICAgICAgICAgYnVmZmVycy5hZGQoZW50cnkuZ2V0S2V5KCkpOwogICAgICAgICAgICAgYnVmZmVycy5hZGQoZW50cnkuZ2V0VmFsdWUoKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2soYnVmZmVycywgZWxlbWVudHMuc2l6ZSgpLCBwcm90b2NvbFZlcnNpb24pOworICAgICAgICByZXR1cm4gQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhidWZmZXJzLCBlbGVtZW50cy5zaXplKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKQEAgLTMwMSw3ICszMDEsNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIHdyaXRlVHlwZShvdXQsIHR5cGUpOwotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoZWxlbWVudHMuc2l6ZSgpKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoZWxlbWVudHMuc2l6ZSgpKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMCwgbSA9IGVsZW1lbnRzLnNpemUoKTsgaSA8IG07IGkrKykKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vUmVzdWx0U2V0QnVpbGRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vUmVzdWx0U2V0QnVpbGRlci5qYXZhCmluZGV4IDIyNTY2YjIuLjNhZGNmMGQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1Jlc3VsdFNldEJ1aWxkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9SZXN1bHRTZXRCdWlsZGVyLmphdmEKQEAgLTI4LDYgKzI4LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuYWdncmVnYXRpb24uR3JvdXBNYWtlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Db2x1bW5EYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgUmVzdWx0U2V0QnVpbGRlcgogewpAQCAtNDQsNiArNDcsMTEgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIEdyb3VwTWFrZXIgZ3JvdXBNYWtlcjsKIAorICAgIC8qKgorICAgICAqIFdoZXRoZXIgbWFza2VkIGNvbHVtbnMgc2hvdWxkIGJlIHVubWFza2VkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB1bm1hc2s7CisKICAgICAvKgogICAgICAqIFdlJ2xsIGJ1aWxkIENRTDMgcm93IG9uZSBieSBvbmUuCiAgICAgICovCkBAIC01MiwxNiArNjAsMTcgQEAKICAgICBwcml2YXRlIGxvbmcgc2l6ZSA9IDA7CiAgICAgcHJpdmF0ZSBib29sZWFuIHNpemVXYXJuaW5nRW1pdHRlZCA9IGZhbHNlOwogCi0gICAgcHVibGljIFJlc3VsdFNldEJ1aWxkZXIoUmVzdWx0TWV0YWRhdGEgbWV0YWRhdGEsIFNlbGVjdG9ycyBzZWxlY3RvcnMpCisgICAgcHVibGljIFJlc3VsdFNldEJ1aWxkZXIoUmVzdWx0TWV0YWRhdGEgbWV0YWRhdGEsIFNlbGVjdG9ycyBzZWxlY3RvcnMsIGJvb2xlYW4gdW5tYXNrKQogICAgIHsKLSAgICAgICAgdGhpcyhtZXRhZGF0YSwgc2VsZWN0b3JzLCBudWxsKTsKKyAgICAgICAgdGhpcyhtZXRhZGF0YSwgc2VsZWN0b3JzLCB1bm1hc2ssIG51bGwpOwogICAgIH0KIAotICAgIHB1YmxpYyBSZXN1bHRTZXRCdWlsZGVyKFJlc3VsdE1ldGFkYXRhIG1ldGFkYXRhLCBTZWxlY3RvcnMgc2VsZWN0b3JzLCBHcm91cE1ha2VyIGdyb3VwTWFrZXIpCisgICAgcHVibGljIFJlc3VsdFNldEJ1aWxkZXIoUmVzdWx0TWV0YWRhdGEgbWV0YWRhdGEsIFNlbGVjdG9ycyBzZWxlY3RvcnMsIGJvb2xlYW4gdW5tYXNrLCBHcm91cE1ha2VyIGdyb3VwTWFrZXIpCiAgICAgewotICAgICAgICB0aGlzLnJlc3VsdFNldCA9IG5ldyBSZXN1bHRTZXQobWV0YWRhdGEuY29weSgpLCBuZXcgQXJyYXlMaXN0PExpc3Q8Qnl0ZUJ1ZmZlcj4+KCkpOworICAgICAgICB0aGlzLnJlc3VsdFNldCA9IG5ldyBSZXN1bHRTZXQobWV0YWRhdGEuY29weSgpLCBuZXcgQXJyYXlMaXN0PD4oKSk7CiAgICAgICAgIHRoaXMuc2VsZWN0b3JzID0gc2VsZWN0b3JzOwogICAgICAgICB0aGlzLmdyb3VwTWFrZXIgPSBncm91cE1ha2VyOworICAgICAgICB0aGlzLnVubWFzayA9IHVubWFzazsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYWRkU2l6ZShMaXN0PEJ5dGVCdWZmZXI+IHJvdykKQEAgLTEwMywxMyArMTEyLDE4IEBACiAgICAgICAgIGlucHV0Um93LmFkZChjLCBub3dJblNlYyk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgYWRkKENvbHVtbkRhdGEgY29sdW1uRGF0YSwgaW50IG5vd0luU2VjKQorICAgIHsKKyAgICAgICAgaW5wdXRSb3cuYWRkKGNvbHVtbkRhdGEsIG5vd0luU2VjKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBOb3RpZmllcyB0aGlzIDxjb2RlPkJ1aWxkZXI8L2NvZGU+IHRoYXQgYSBuZXcgcm93IGlzIGJlaW5nIHByb2Nlc3NlZC4KICAgICAgKgogICAgICAqIEBwYXJhbSBwYXJ0aXRpb25LZXkgdGhlIHBhcnRpdGlvbiBrZXkgb2YgdGhlIG5ldyByb3cKICAgICAgKiBAcGFyYW0gY2x1c3RlcmluZyB0aGUgY2x1c3RlcmluZyBvZiB0aGUgbmV3IHJvdwogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5ld1JvdyhEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5LCBDbHVzdGVyaW5nPD8+IGNsdXN0ZXJpbmcpCisgICAgcHVibGljIHZvaWQgbmV3Um93KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksIENsdXN0ZXJpbmc8Pz4gY2x1c3RlcmluZywgTGlzdDxDb2x1bW5NZXRhZGF0YT4gY29sdW1ucykKICAgICB7CiAgICAgICAgIC8vIFRoZSBncm91cE1ha2VyIG5lZWRzIHRvIGJlIGNhbGxlZCBmb3IgZWFjaCByb3cKICAgICAgICAgYm9vbGVhbiBpc05ld0FnZ3JlZ2F0ZSA9IGdyb3VwTWFrZXIgPT0gbnVsbCB8fCBncm91cE1ha2VyLmlzTmV3R3JvdXAocGFydGl0aW9uS2V5LCBjbHVzdGVyaW5nKTsKQEAgLTEyOSw3ICsxNDMsMTEgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlucHV0Um93ID0gbmV3IFNlbGVjdG9yLklucHV0Um93KHNlbGVjdG9ycy5udW1iZXJPZkZldGNoZWRDb2x1bW5zKCksIHNlbGVjdG9ycy5jb2xsZWN0VGltZXN0YW1wcygpLCBzZWxlY3RvcnMuY29sbGVjdFRUTHMoKSk7CisgICAgICAgICAgICBpbnB1dFJvdyA9IG5ldyBTZWxlY3Rvci5JbnB1dFJvdyhwcm90b2NvbFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzLmNvbGxlY3RXcml0ZXRpbWVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnMuY29sbGVjdFRUTHMoKSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1Jvd1RpbWVzdGFtcHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1Jvd1RpbWVzdGFtcHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGQyM2VlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vUm93VGltZXN0YW1wcy5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc2VsZWN0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOworCisvKioKKyAqIFRoZSB7QGxpbmsgQ29sdW1uVGltZXN0YW1wc30gYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gc2V0IG9mIGNvbHVtbnMgb2YgYSByb3cuCisgKi8KK2ludGVyZmFjZSBSb3dUaW1lc3RhbXBzCit7CisgICAgLyoqCisgICAgICogQWRkcyBhbiBlbXB0eSB0aW1lc3RhbXAgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IHRoZSBjb2x1bW4gaW5kZXgKKyAgICAgKi8KKyAgICB2b2lkIGFkZE5vVGltZXN0YW1wKGludCBpbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIHNwZWNpZmllZCBjZWxsLgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IHRoZSBjb2x1bW4gaW5kZXgKKyAgICAgKiBAcGFyYW0gY2VsbCB0aGUgY2VsbCB0byBnZXQgdGhlIHRpbWVzdGFtcCBmcm9tCisgICAgICogQHBhcmFtIG5vd0luU2VjIHRoZSBxdWVyeSB0aW1lc3RhbXAgaW4gc2Vjb25kCisgICAgICovCisgICAgdm9pZCBhZGRUaW1lc3RhbXAoaW50IGluZGV4LCBDZWxsPD8+IGNlbGwsIGludCBub3dJblNlYyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0aW1lc3RhbXAgb2YgdGhlIHNwZWNpZmllZCBjb2x1bW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGNvbHVtbiBpbmRleAorICAgICAqIEByZXR1cm4gdGhlIHRpbWVzdGFtcCBvZiB0aGUgc3BlY2lmaWVkIGNvbHVtbgorICAgICAqLworICAgIENvbHVtblRpbWVzdGFtcHMgZ2V0KGludCBpbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBBIHtAY29kZSBSb3dUaW1lc3RhbXBzfSB0aGF0IGRvZXMgbm90aGluZy4KKyAgICAgKi8KKyAgICBSb3dUaW1lc3RhbXBzIE5PT1BfUk9XX1RJTUVTVEFNUFMgPSBuZXcgUm93VGltZXN0YW1wcygpCisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYWRkTm9UaW1lc3RhbXAoaW50IGluZGV4KQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYWRkVGltZXN0YW1wKGludCBpbmRleCwgQ2VsbDw/PiBjZWxsLCBpbnQgbm93SW5TZWMpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29sdW1uVGltZXN0YW1wcyBnZXQoaW50IGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ29sdW1uVGltZXN0YW1wcy5OT19USU1FU1RBTVA7CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3RhdGljIFJvd1RpbWVzdGFtcHMgbmV3SW5zdGFuY2UoQ29sdW1uVGltZXN0YW1wcy5UaW1lc3RhbXBzVHlwZSB0eXBlLCBMaXN0PENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zKQorICAgIHsKKyAgICAgICAgZmluYWwgQ29sdW1uVGltZXN0YW1wc1tdIGFycmF5ID0gbmV3IENvbHVtblRpbWVzdGFtcHNbY29sdW1ucy5zaXplKCldOworCisgICAgICAgIGZvciAoaW50IGkgPSAwLCBtID0gY29sdW1ucy5zaXplKCk7IGkgPCBtOyBpKyspCisgICAgICAgICAgICBhcnJheVtpXSA9IENvbHVtblRpbWVzdGFtcHMubmV3VGltZXN0YW1wcyh0eXBlLCBjb2x1bW5zLmdldChpKS50eXBlKTsKKworICAgICAgICByZXR1cm4gbmV3IFJvd1RpbWVzdGFtcHMoKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZE5vVGltZXN0YW1wKGludCBpbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcnJheVtpbmRleF0uYWRkTm9UaW1lc3RhbXAoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGRUaW1lc3RhbXAoaW50IGluZGV4LCBDZWxsPD8+IGNlbGwsIGludCBub3dJblNlYykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhcnJheVtpbmRleF0uYWRkVGltZXN0YW1wRnJvbShjZWxsLCBub3dJblNlYyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENvbHVtblRpbWVzdGFtcHMgZ2V0KGludCBpbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlbaW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NjYWxhckZ1bmN0aW9uU2VsZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NjYWxhckZ1bmN0aW9uU2VsZWN0b3IuamF2YQppbmRleCBlZDJhMTQwLi41ZTk3MTFhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TY2FsYXJGdW5jdGlvblNlbGVjdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2NhbGFyRnVuY3Rpb25TZWxlY3Rvci5qYXZhCkBAIC0zNywxMiArMzcsMTIgQEAKICAgICAgICAgfQogICAgIH07CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBJbnB1dFJvdyBpbnB1dCkKKyAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChJbnB1dFJvdyBpbnB1dCkKICAgICB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBtID0gYXJnU2VsZWN0b3JzLnNpemUoKTsgaSA8IG07IGkrKykKICAgICAgICAgewogICAgICAgICAgICAgU2VsZWN0b3IgcyA9IGFyZ1NlbGVjdG9ycy5nZXQoaSk7Ci0gICAgICAgICAgICBzLmFkZElucHV0KHByb3RvY29sVmVyc2lvbiwgaW5wdXQpOworICAgICAgICAgICAgcy5hZGRJbnB1dChpbnB1dCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NlbGVjdGFibGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NlbGVjdGFibGUuamF2YQppbmRleCA2ZTY1M2JhLi45NDc2ZGVhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3RhYmxlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0YWJsZS5qYXZhCkBAIC0yMiw4ICsyMiw2IEBACiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudGV4dC5TdHJCdWlsZGVyOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zZWxlY3Rpb24uU2VsZWN0b3IuRmFjdG9yeTsKQEAgLTgxLDcgKzc5LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgZGVmYXVsdCBib29sZWFuIHByb2Nlc3Nlc1NlbGVjdGlvbigpCiAgICAgewotICAgICAgICAvLyBDb2x1bW5NZXRhZGF0YSBpcyB0aGUgb25seSBjYXNlIHRoYXQgcmV0dXJucyBmYWxzZSBhbmQgb3ZlcnJpZGUgdGhpcworICAgICAgICAvLyBDb2x1bW5NZXRhZGF0YSBpcyB0aGUgb25seSBjYXNlIHRoYXQgcmV0dXJucyBmYWxzZSAoaWYgdGhlIGNvbHVtbiBpcyBub3QgbWFza2VkKSBhbmQgb3ZlcnJpZGVzIHRoaXMKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC05Miw2ICs5MCwxMiBAQAogICAgICAgICByZXR1cm4gdHlwZSA9PSBudWxsID8gVGVzdFJlc3VsdC5OT1RfQVNTSUdOQUJMRSA6IHR5cGUudGVzdEFzc2lnbm1lbnQoa2V5c3BhY2UsIHJlY2VpdmVyKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZGVmYXVsdCBBYnN0cmFjdFR5cGU8Pz4gZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKFN0cmluZyBrZXlzcGFjZSkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRFeGFjdFR5cGVJZktub3duKGtleXNwYWNlKTsKKyAgICB9CisKICAgICBkZWZhdWx0IGludCBhZGRBbmRHZXRJbmRleChDb2x1bW5NZXRhZGF0YSBkZWYsIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGwpCiAgICAgewogICAgICAgICBpbnQgaWR4ID0gbC5pbmRleE9mKGRlZik7CkBAIC0xNTIsNyArMTU2LDcgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBleHBlY3RlZFR5cGUgd2lsbCBiZSBudWxsIGlmIHdlIGhhdmUgbm8gY29uc3RyYWludCBvbiB3aGF0IHRoZSB0eXBlIHNob3VsZCBiZS4gRm9yIGluc3RhbmNlLCBpZiB0aGlzIHRlcm0gaXMgYSBiaW5kIG1hcmtlcjoKICAgICAgICAgICAgICAqICAgLSBpdCB3aWxsIGJlIG51bGwgaWYgd2UgZG8gIlNFTEVDVCA/IEZST00gZm9vIgotICAgICAgICAgICAgICogICAtIGl0IHdvbid0IGJlIG51bGwgKGFuZCBiZSBMb25nVHlwZSkgaWYgd2UgZG8gIlNFTEVDVCBiaWdpbnRBc0Jsb2IoPykgRlJPTSBmb28iIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNvbnN0cmFpbiBpdC4KKyAgICAgICAgICAgICAqICAgLSBpdCB3b24ndCBiZSBudWxsIChhbmQgYmUgTG9uZ1R5cGUpIGlmIHdlIGRvICJTRUxFQ1QgYmlnaW50X2FzX2Jsb2IoPykgRlJPTSBmb28iIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIGNvbnN0cmFpbiBpdC4KICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgKiBJbiB0aGUgZmlyc3QgY2FzZSwgd2UgaGF2ZSB0byBlcnJvciBvdXQ6IHdlIG5lZWQgdG8gaW5mZXIgdGhlIHR5cGUgb2YgdGhlIG1ldGFkYXRhIG9mIGEgU0VMRUNUIGF0IHByZXBhcmF0aW9uIHRpbWUsIHdoaWNoIHdlIGNhbid0CiAgICAgICAgICAgICAgKiBoZXJlICh1c2VycyB3aWxsIGhhdmUgdG8gZG8gIlNFTEVDVCAodmFyaW50KT8gRlJPTSBmb28iIGZvciBpbnN0YW5jZSkuCkBAIC0xOTMsNiArMTk3LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRDb21wYXRpYmxlVHlwZUlmS25vd24oU3RyaW5nIGtleXNwYWNlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmF3VGVybS5nZXRDb21wYXRpYmxlVHlwZUlmS25vd24oa2V5c3BhY2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdENvbHVtbnMoUHJlZGljYXRlPENvbHVtbk1ldGFkYXRhPiBwcmVkaWNhdGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTIyMiwxOSArMjMyLDQ4IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdyaXRldGltZU9yVFRMIGltcGxlbWVudHMgU2VsZWN0YWJsZQogICAgIHsKLSAgICAgICAgcHVibGljIGZpbmFsIENvbHVtbk1ldGFkYXRhIGNvbHVtbjsKLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNXcml0ZXRpbWU7CisgICAgICAgIC8vIFRoZSBvcmRlciBvZiB0aGUgdmFyaWFudHMgaW4gdGhlIEtpbmQgZW51bSBtYXR0ZXJzIGFzIHRoZXkgYXJlIHVzZWQgaW4gc2VyL2Rlc2VyCisgICAgICAgIHB1YmxpYyBlbnVtIEtpbmQKKyAgICAgICAgeworICAgICAgICAgICAgVFRMKCJ0dGwiLCBJbnQzMlR5cGUuaW5zdGFuY2UpLAorICAgICAgICAgICAgV1JJVEVfVElNRSgid3JpdGV0aW1lIiwgTG9uZ1R5cGUuaW5zdGFuY2UpLAorICAgICAgICAgICAgTUFYX1dSSVRFX1RJTUUoIm1heHdyaXRldGltZSIsIExvbmdUeXBlLmluc3RhbmNlKTsgLy8gbWF4d3JpdGV0aW1lIGlzIGF2YWlsYWJsZSBhZnRlciBDYXNzYW5kcmEgNC4xIChleGNsdXNpdmUpCiAKLSAgICAgICAgcHVibGljIFdyaXRldGltZU9yVFRMKENvbHVtbk1ldGFkYXRhIGNvbHVtbiwgYm9vbGVhbiBpc1dyaXRldGltZSkKKyAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBBYnN0cmFjdFR5cGU8Pz4gcmV0dXJuVHlwZTsKKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBLaW5kIGZyb21PcmRpbmFsKGludCBvcmRpbmFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMoKVtvcmRpbmFsXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgS2luZChTdHJpbmcgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHJldHVyblR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgICAgICB0aGlzLnJldHVyblR5cGUgPSByZXR1cm5UeXBlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZ2dyZWdhdGVzTXVsdGlDZWxsKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBNQVhfV1JJVEVfVElNRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBDb2x1bW5NZXRhZGF0YSBjb2x1bW47CisgICAgICAgIHB1YmxpYyBmaW5hbCBTZWxlY3RhYmxlIHNlbGVjdGFibGU7CisgICAgICAgIHB1YmxpYyBmaW5hbCBLaW5kIGtpbmQ7CisKKyAgICAgICAgcHVibGljIFdyaXRldGltZU9yVFRMKENvbHVtbk1ldGFkYXRhIGNvbHVtbiwgU2VsZWN0YWJsZSBzZWxlY3RhYmxlLCBLaW5kIGtpbmQpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwotICAgICAgICAgICAgdGhpcy5pc1dyaXRldGltZSA9IGlzV3JpdGV0aW1lOworICAgICAgICAgICAgdGhpcy5zZWxlY3RhYmxlID0gc2VsZWN0YWJsZTsKKyAgICAgICAgICAgIHRoaXMua2luZCA9IGtpbmQ7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoaXNXcml0ZXRpbWUgPyAid3JpdGV0aW1lIiA6ICJ0dGwiKSArICIoIiArIGNvbHVtbi5uYW1lICsgIikiOworICAgICAgICAgICAgcmV0dXJuIGtpbmQubmFtZSArICIoIiArIHNlbGVjdGFibGUgKyAiKSI7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgU2VsZWN0b3IuRmFjdG9yeSBuZXdTZWxlY3RvckZhY3RvcnkoVGFibGVNZXRhZGF0YSB0YWJsZSwKQEAgLTI0NSw0MyArMjg0LDQ1IEBACiAgICAgICAgICAgICBpZiAoY29sdW1uLmlzUHJpbWFyeUtleUNvbHVtbigpKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkNhbm5vdCB1c2Ugc2VsZWN0aW9uIGZ1bmN0aW9uICVzIG9uIFBSSU1BUlkgS0VZIHBhcnQgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dyaXRldGltZSA/ICJ3cml0ZVRpbWUiIDogInR0bCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLm5hbWUpKTsKLSAgICAgICAgICAgIGlmIChjb2x1bW4udHlwZS5pc011bHRpQ2VsbCgpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJDYW5ub3QgdXNlIHNlbGVjdGlvbiBmdW5jdGlvbiAlcyBvbiBub24tZnJvemVuICVzICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dyaXRldGltZSA/ICJ3cml0ZVRpbWUiIDogInR0bCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnR5cGUuaXNDb2xsZWN0aW9uKCkgPyAiY29sbGVjdGlvbiIgOiAiVURUIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ubmFtZSkpOwogCi0gICAgICAgICAgICByZXR1cm4gV3JpdGV0aW1lT3JUVExTZWxlY3Rvci5uZXdGYWN0b3J5KGNvbHVtbiwgYWRkQW5kR2V0SW5kZXgoY29sdW1uLCBkZWZzKSwgaXNXcml0ZXRpbWUpOworICAgICAgICAgICAgU2VsZWN0b3IuRmFjdG9yeSBmYWN0b3J5ID0gc2VsZWN0YWJsZS5uZXdTZWxlY3RvckZhY3RvcnkodGFibGUsIGV4cGVjdGVkVHlwZSwgZGVmcywgYm91bmROYW1lcyk7CisgICAgICAgICAgICBib29sZWFuIGlzTXVsdGlDZWxsID0gZmFjdG9yeS5nZXRDb2x1bW5TcGVjaWZpY2F0aW9uKHRhYmxlKS50eXBlLmlzTXVsdGlDZWxsKCk7CisKKyAgICAgICAgICAgIHJldHVybiBXcml0ZXRpbWVPclRUTFNlbGVjdG9yLm5ld0ZhY3RvcnkoZmFjdG9yeSwgYWRkQW5kR2V0SW5kZXgoY29sdW1uLCBkZWZzKSwga2luZCwgaXNNdWx0aUNlbGwpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0RXhhY3RUeXBlSWZLbm93bihTdHJpbmcga2V5c3BhY2UpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpc1dyaXRldGltZSA/IExvbmdUeXBlLmluc3RhbmNlIDogSW50MzJUeXBlLmluc3RhbmNlOworICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSBraW5kLnJldHVyblR5cGU7CisgICAgICAgICAgICByZXR1cm4gY29sdW1uLnR5cGUuaXNNdWx0aUNlbGwoKSAmJiAha2luZC5hZ2dyZWdhdGVzTXVsdGlDZWxsKCkgPyBMaXN0VHlwZS5nZXRJbnN0YW5jZSh0eXBlLCBmYWxzZSkgOiB0eXBlOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdENvbHVtbnMoUHJlZGljYXRlPENvbHVtbk1ldGFkYXRhPiBwcmVkaWNhdGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcmVkaWNhdGUudGVzdChjb2x1bW4pOworICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGFibGUuc2VsZWN0Q29sdW1ucyhwcmVkaWNhdGUpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSYXcgaW1wbGVtZW50cyBTZWxlY3RhYmxlLlJhdwogICAgICAgICB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFNlbGVjdGFibGUuUmF3SWRlbnRpZmllciBpZDsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1dyaXRldGltZTsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU2VsZWN0YWJsZS5SYXdJZGVudGlmaWVyIGNvbHVtbjsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU2VsZWN0YWJsZS5SYXcgc2VsZWN0ZWQ7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIEtpbmQga2luZDsKIAotICAgICAgICAgICAgcHVibGljIFJhdyhTZWxlY3RhYmxlLlJhd0lkZW50aWZpZXIgaWQsIGJvb2xlYW4gaXNXcml0ZXRpbWUpCisgICAgICAgICAgICBwdWJsaWMgUmF3KFNlbGVjdGFibGUuUmF3SWRlbnRpZmllciBjb2x1bW4sIFNlbGVjdGFibGUuUmF3IHNlbGVjdGVkLCBLaW5kIGtpbmQpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgICAgICAgICAgICAgIHRoaXMuaXNXcml0ZXRpbWUgPSBpc1dyaXRldGltZTsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKKyAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7CisgICAgICAgICAgICAgICAgdGhpcy5raW5kID0ga2luZDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgV3JpdGV0aW1lT3JUVEwgcHJlcGFyZShUYWJsZU1ldGFkYXRhIHRhYmxlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV3JpdGV0aW1lT3JUVEwoaWQucHJlcGFyZSh0YWJsZSksIGlzV3JpdGV0aW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdyaXRldGltZU9yVFRMKChDb2x1bW5NZXRhZGF0YSkgY29sdW1uLnByZXBhcmUodGFibGUpLCBzZWxlY3RlZC5wcmVwYXJlKHRhYmxlKSwga2luZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zNTcsMTcgKzM5OCwxMSBAQAogICAgICAgICAgICAgICAgICAgICBwcmVwYXJlZEFyZ3MuYWRkKGFyZy5wcmVwYXJlKHRhYmxlKSk7CiAKICAgICAgICAgICAgICAgICBGdW5jdGlvbk5hbWUgbmFtZSA9IGZ1bmN0aW9uTmFtZTsKLSAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNpcmN1bXZlbnQgdGhlIG5vcm1hbCBmdW5jdGlvbiBsb29rdXAgcHJvY2VzcyBmb3IgdG9Kc29uKCkgYmVjYXVzZSBpbnN0YW5jZXMgb2YgdGhlIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgLy8gYXJlIG5vdCBwcmUtZGVjbGFyZWQgKGJlY2F1c2UgaXQgY2FuIGFjY2VwdCBhbnkgdHlwZSBvZiBhcmd1bWVudCkuIFdlIGFsc28gaGF2ZSB0byB3YWl0IHVudGlsIHdlIGhhdmUgdGhlCi0gICAgICAgICAgICAgICAgLy8gc2VsZWN0b3IgZmFjdG9yaWVzIG9mIHRoZSBhcmd1bWVudCBzbyB3ZSBjYW4gYWNjZXNzIHRoZWlyIGZpbmFsIHR5cGUuCi0gICAgICAgICAgICAgICAgaWYgKGZ1bmN0aW9uTmFtZS5lcXVhbHNOYXRpdmVGdW5jdGlvbihUb0pzb25GY3QuTkFNRSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdpdGhUb0pTb25GdW5jdGlvbihwcmVwYXJlZEFyZ3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBBbHNvLCBDT1VOVCh4KSBpcyBlcXVpdmFsZW50IHRvIENPVU5UKCopIGZvciBhbnkgbm9uLW51bGwgdGVybSB4IChzaW5jZSBjb3VudCh4KSBkb24ndCBjYXJlIGFib3V0IGl0J3MgYXJndW1lbnQgb3V0c2lkZSBvZiBjaGVjayBmb3IgbnVsbG5lc3MpIGFuZAotICAgICAgICAgICAgICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsdHkgd2Ugd2FudCB0byBzdXBwb3J0IENPVU5UKDEpLCBidXQgd2UgYWN0dWFsbHkgaGF2ZSBDT1VOVCh4KSBtZXRob2QgZm9yIGV2ZXJ5IGV4aXN0aW5nIChzaW1wbGUpIGlucHV0IHR5cGVzIHNvIGN1cnJlbnRseSBDT1VOVCgxKQotICAgICAgICAgICAgICAgIC8vIHdpbGwgdGhyb3cgYXMgYW1iaWd1b3VzIChzaW5jZSAxIHdvcmtzIGZvciBhbnkgdHlwZSkuIFNvIHdlIGhhdmUgaGF2ZSB0byBzcGVjaWFsIGNhc2UgQ09VTlQuCi0gICAgICAgICAgICAgICAgZWxzZSBpZiAoZnVuY3Rpb25OYW1lLmVxdWFsc05hdGl2ZUZ1bmN0aW9uKEZ1bmN0aW9uTmFtZS5uYXRpdmVGdW5jdGlvbigiY291bnQiKSkKKyAgICAgICAgICAgICAgICAvLyBDT1VOVCh4KSBpcyBlcXVpdmFsZW50IHRvIENPVU5UKCopIGZvciBhbnkgbm9uLW51bGwgdGVybSB4IChzaW5jZSBjb3VudCh4KSBkb24ndCBjYXJlIGFib3V0IGl0cworICAgICAgICAgICAgICAgIC8vIGFyZ3VtZW50IG91dHNpZGUgb2YgY2hlY2sgZm9yIG51bGxuZXNzKSBhbmQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWx0eSB3ZSB3YW50IHRvIHN1cHBvcnQgQ09VTlQoMSksCisgICAgICAgICAgICAgICAgLy8gYnV0IHdlIGFjdHVhbGx5IGhhdmUgQ09VTlQoeCkgbWV0aG9kIGZvciBldmVyeSBleGlzdGluZyAoc2ltcGxlKSBpbnB1dCB0eXBlcyBzbyBjdXJyZW50bHkgQ09VTlQoMSkKKyAgICAgICAgICAgICAgICAvLyB3aWxsIHRocm93IGFzIGFtYmlndW91cyAoc2luY2UgMSB3b3JrcyBmb3IgYW55IHR5cGUpLiBTbyB3ZSBoYXZlIHRvIHNwZWNpYWwgY2FzZSBDT1VOVC4KKyAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25OYW1lLmVxdWFsc05hdGl2ZUZ1bmN0aW9uKEZ1bmN0aW9uTmFtZS5uYXRpdmVGdW5jdGlvbigiY291bnQiKSkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIHByZXBhcmVkQXJncy5zaXplKCkgPT0gMQogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHByZXBhcmVkQXJncy5nZXQoMCkgaW5zdGFuY2VvZiBXaXRoVGVybSkKICAgICAgICAgICAgICAgICAgICAgICAgICYmICgoKFdpdGhUZXJtKXByZXBhcmVkQXJncy5nZXQoMCkpLnJhd1Rlcm0gaW5zdGFuY2VvZiBDb25zdGFudHMuTGl0ZXJhbCkpCkBAIC0zOTAsNDQgKzQyNSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdpdGhUb0pTb25GdW5jdGlvbiBpbXBsZW1lbnRzIFNlbGVjdGFibGUKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBMaXN0PFNlbGVjdGFibGU+IGFyZ3M7Ci0KLSAgICAgICAgcHJpdmF0ZSBXaXRoVG9KU29uRnVuY3Rpb24oTGlzdDxTZWxlY3RhYmxlPiBhcmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0ckJ1aWxkZXIoKS5hcHBlbmQoVG9Kc29uRmN0Lk5BTUUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIigiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kV2l0aFNlcGFyYXRvcnMoYXJncywgIiwgIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiKSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNlbGVjdG9yLkZhY3RvcnkgbmV3U2VsZWN0b3JGYWN0b3J5KFRhYmxlTWV0YWRhdGEgdGFibGUsIEFic3RyYWN0VHlwZTw/PiBleHBlY3RlZFR5cGUsIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGRlZnMsIFZhcmlhYmxlU3BlY2lmaWNhdGlvbnMgYm91bmROYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgU2VsZWN0b3JGYWN0b3JpZXMgZmFjdG9yaWVzID0gU2VsZWN0b3JGYWN0b3JpZXMuY3JlYXRlRmFjdG9yaWVzQW5kQ29sbGVjdENvbHVtbkRlZmluaXRpb25zKGFyZ3MsIG51bGwsIHRhYmxlLCBkZWZzLCBib3VuZE5hbWVzKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uIGZ1biA9IFRvSnNvbkZjdC5nZXRJbnN0YW5jZShmYWN0b3JpZXMuZ2V0UmV0dXJuVHlwZXMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gQWJzdHJhY3RGdW5jdGlvblNlbGVjdG9yLm5ld0ZhY3RvcnkoZnVuLCBmYWN0b3JpZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRFeGFjdFR5cGVJZktub3duKFN0cmluZyBrZXlzcGFjZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFVURjhUeXBlLmluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdENvbHVtbnMoUHJlZGljYXRlPENvbHVtbk1ldGFkYXRhPiBwcmVkaWNhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBTZWxlY3RhYmxlLnNlbGVjdENvbHVtbnMoYXJncywgcHJlZGljYXRlKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2l0aENhc3QgaW1wbGVtZW50cyBTZWxlY3RhYmxlCiAgICAgewogICAgICAgICBwcml2YXRlIGZpbmFsIENRTDNUeXBlIHR5cGU7CkBAIC02ODIsNiArNjc5LDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRDb21wYXRpYmxlVHlwZUlmS25vd24oU3RyaW5nIGtleXNwYWNlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBlbGVtZW50IHdlIGNhbm5vdCBrbm93IGlmIGl0IGlzIGFuIGVsZW1lbnQgYmV0d2VlbiBwYXJlbnRoZXNlcyBvciBhIHR1cGxlCisgICAgICAgICAgICAvLyB3aXRoIG9ubHkgb25lIGVsZW1lbnQuIEJ5IGNvbnNlcXVlbmNlLCB3ZSBuZWVkIHRvIGZvcmNlIHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlIHR5cGUuCisgICAgICAgICAgICBpZiAoc2VsZWN0YWJsZXMuc2l6ZSgpID09IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiBUdXBsZXMuZ2V0RXhhY3RUdXBsZVR5cGVJZktub3duKHNlbGVjdGFibGVzLCBwIC0+IHAuZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKGtleXNwYWNlKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gc2VsZWN0Q29sdW1ucyhQcmVkaWNhdGU8Q29sdW1uTWV0YWRhdGE+IHByZWRpY2F0ZSkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIFNlbGVjdGFibGUuc2VsZWN0Q29sdW1ucyhzZWxlY3RhYmxlcywgcHJlZGljYXRlKTsKQEAgLTc2Nyw2ICs3NzUsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldENvbXBhdGlibGVUeXBlSWZLbm93bihTdHJpbmcga2V5c3BhY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMaXN0cy5nZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShzZWxlY3RhYmxlcywgcCAtPiBwLmdldENvbXBhdGlibGVUeXBlSWZLbm93bihrZXlzcGFjZSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdENvbHVtbnMoUHJlZGljYXRlPENvbHVtbk1ldGFkYXRhPiBwcmVkaWNhdGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBTZWxlY3RhYmxlLnNlbGVjdENvbHVtbnMoc2VsZWN0YWJsZXMsIHByZWRpY2F0ZSk7CkBAIC04NjAsNiArODc0LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRDb21wYXRpYmxlVHlwZUlmS25vd24oU3RyaW5nIGtleXNwYWNlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU2V0cy5nZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShzZWxlY3RhYmxlcywgcCAtPiBwLmdldENvbXBhdGlibGVUeXBlSWZLbm93bihrZXlzcGFjZSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIHNlbGVjdENvbHVtbnMoUHJlZGljYXRlPENvbHVtbk1ldGFkYXRhPiBwcmVkaWNhdGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBTZWxlY3RhYmxlLnNlbGVjdENvbHVtbnMoc2VsZWN0YWJsZXMsIHByZWRpY2F0ZSk7CkBAIC05OTEsNyArMTAxMSwxNCBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRFeGFjdFR5cGVJZktub3duKFN0cmluZyBrZXlzcGFjZSkKICAgICAgICAgewotICAgICAgICAgICAgLy8gTGV0cyBmb3JjZSB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSB0eXBlLgorICAgICAgICAgICAgLy8gTGV0J3MgZm9yY2UgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgdHlwZS4KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKFN0cmluZyBrZXlzcGFjZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTGV0J3MgZm9yY2UgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgdHlwZS4KICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKQEAgLTEyMTMsMTIgKzEyNDAsMTcgQEAKICAgICAgICAgICAgIHRoaXMucXVvdGVkID0gcXVvdGVkOwogICAgICAgICB9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBDb2x1bW5NZXRhZGF0YSBwcmVwYXJlKFRhYmxlTWV0YWRhdGEgY2ZtKQorICAgICAgICBwdWJsaWMgQ29sdW1uTWV0YWRhdGEgY29sdW1uTWV0YWRhdGEoVGFibGVNZXRhZGF0YSBjZm0pCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBjZm0uZ2V0RXhpc3RpbmdDb2x1bW4oQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZCh0ZXh0LCBxdW90ZWQpKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2VsZWN0YWJsZSBwcmVwYXJlKFRhYmxlTWV0YWRhdGEgY2ZtKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY29sdW1uTWV0YWRhdGEoY2ZtKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBGaWVsZElkZW50aWZpZXIgdG9GaWVsZElkZW50aWZpZXIoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gcXVvdGVkID8gRmllbGRJZGVudGlmaWVyLmZvclF1b3RlZCh0ZXh0KQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3Rpb24uamF2YQppbmRleCBmMDcxODRhLi5kYTg3ZjI2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3Rpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3Rpb24uamF2YQpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIFNlbGVjdGlvbgogewpAQCAtMTAzLDE1ICsxMDQsMjAgQEAKICAgICAgKi8KICAgICBwdWJsaWMgSW50ZWdlciBnZXRPcmRlcmluZ0luZGV4KENvbHVtbk1ldGFkYXRhIGMpCiAgICAgewotICAgICAgICBpZiAoIWlzSnNvbikKLSAgICAgICAgICAgIHJldHVybiBnZXRSZXN1bHRTZXRJbmRleChjKTsKLQogICAgICAgICAvLyBJZiB3ZSBvcmRlciBwb3N0LXF1ZXJ5IGluIGpzb24sIHRoZSBmaXJzdCBhbmQgb25seSBjb2x1bW4gdGhhdCB3ZSBzaGlwIHRvIHRoZSBjbGllbnQgaXMgdGhlIGpzb24gY29sdW1uLgogICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHNob3VsZCBrZWVwIG9yZGVyaW5nIGNvbHVtbnMgYXJvdW5kIHRvIHBlcmZvcm0gdGhlIG9yZGVyaW5nLCB0aGVuIHRoZXNlIGNvbHVtbnMgd2lsbAogICAgICAgICAvLyBiZSBwbGFjZWQgYWZ0ZXIgdGhlIGpzb24gY29sdW1uLiBBcyBhIGNvbnNlcXVlbmNlIG9mIHdoZXJlIHRoZSBjb2x1bXMgYXJlIHBsYWNlZCwgd2Ugc2hvdWxkIGdpdmUgdGhlCiAgICAgICAgIC8vIG9yZGVyaW5nIGluZGV4IGEgdmFsdWUgYmFzZWQgb24gdGhlaXIgcG9zaXRpb24gaW4gdGhlIGpzb24gZW5jb2RpbmcgYW5kIGRpc2NhcmQgdGhlIG9yaWdpbmFsIGluZGV4LgogICAgICAgICAvLyAoQ0FTU0FORFJBLTE0Mjg2KQotICAgICAgICByZXR1cm4gb3JkZXJpbmdDb2x1bW5zLmluZGV4T2YoYykgKyAxOworICAgICAgICBpZiAoaXNKc29uKQorICAgICAgICAgICAgcmV0dXJuIG9yZGVyaW5nQ29sdW1ucy5pbmRleE9mKGMpICsgMTsKKworICAgICAgICAvLyBJZiB0aGUgY29sdW1uIGlzIG1hc2tlZCBpdCBtaWdodCBhcHBlYXIgdHdpY2UsIG9uY2UgbWFza2VkIGluIHRoZSBzZWxlY3RlZCBjb2x1bW4gYW5kIG9uY2UgdW5tYXNrZWQgaW4KKyAgICAgICAgLy8gdGhlIG9yZGVyaW5nIGNvbHVtbnMuIEZvciBvcmRlcmluZyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiB0aGF0IHNlY29uZCB1bm1hc2tlZCB2YWx1ZS4KKyAgICAgICAgaWYgKGMuaXNNYXNrZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBjb2x1bW5zLmxhc3RJbmRleE9mKGMpOworCisgICAgICAgIHJldHVybiBnZXRSZXN1bHRTZXRJbmRleChjKTsKICAgICB9CiAKICAgICBwdWJsaWMgUmVzdWx0U2V0LlJlc3VsdE1ldGFkYXRhIGdldFJlc3VsdE1ldGFkYXRhKCkKQEAgLTEzMywxNSArMTM5LDE2IEBACiAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlU2VsZWN0aW9uKHRhYmxlLCBhbGwsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCksIHRydWUsIGlzSnNvbiwgcmV0dXJuU3RhdGljQ29udGVudE9uUGFydGl0aW9uV2l0aE5vUm93cyk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBTZWxlY3Rpb24gd2lsZGNhcmRXaXRoR3JvdXBCeShUYWJsZU1ldGFkYXRhIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVTcGVjaWZpY2F0aW9ucyBib3VuZE5hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0pzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJldHVyblN0YXRpY0NvbnRlbnRPblBhcnRpdGlvbldpdGhOb1Jvd3MpCisgICAgcHVibGljIHN0YXRpYyBTZWxlY3Rpb24gd2lsZGNhcmRXaXRoR3JvdXBCeU9yTWFza2VkQ29sdW1ucyhUYWJsZU1ldGFkYXRhIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVTcGVjaWZpY2F0aW9ucyBib3VuZE5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbHVtbk1ldGFkYXRhPiBvcmRlcmluZ0NvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzSnNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV0dXJuU3RhdGljQ29udGVudE9uUGFydGl0aW9uV2l0aE5vUm93cykKICAgICB7CiAgICAgICAgIHJldHVybiBmcm9tU2VsZWN0b3JzKHRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0cy5uZXdBcnJheUxpc3QodGFibGUuYWxsQ29sdW1uc0luU2VsZWN0T3JkZXIoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kTmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmVtcHR5U2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyaW5nQ29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNKc29uLApAQCAtMjI1LDcgKzIzMiw3IEBACiAgICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgb3JkZXJpbmdDb2x1bW4gOiBvcmRlcmluZ0NvbHVtbnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIGludCBpbmRleCA9IHNlbGVjdGVkQ29sdW1ucy5pbmRleE9mKG9yZGVyaW5nQ29sdW1uKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwICYmIGZhY3Rvcmllcy5pbmRleE9mU2ltcGxlU2VsZWN0b3JGYWN0b3J5KGluZGV4KSA+PSAwKQorICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgZmFjdG9yaWVzLmluZGV4T2ZTaW1wbGVTZWxlY3RvckZhY3RvcnkoaW5kZXgpID49IDAgJiYgIW9yZGVyaW5nQ29sdW1uLmlzTWFza2VkKCkpCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgICAgIGZpbHRlcmVkT3JkZXJpbmdDb2x1bW5zLmFkZChvcmRlcmluZ0NvbHVtbik7CkBAIC0zMjQsNyArMzMxLDcgQEAKICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lID0gIlwiIiArIGNvbHVtbk5hbWUgKyAiXCIiOwogCiAgICAgICAgICAgICBzYi5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZChKc29uLnF1b3RlQXNKc29uU3RyaW5nKGNvbHVtbk5hbWUpKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChKc29uVXRpbHMucXVvdGVBc0pzb25TdHJpbmcoY29sdW1uTmFtZSkpOwogICAgICAgICAgICAgc2IuYXBwZW5kKCJcIjogIik7CiAgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpCiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CkBAIC0zNzEsMTAgKzM3OCwxMCBAQAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb2xsZWN0VFRMcygpOwogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBDaGVja3MgaWYgb25lIG9mIHRoZSBzZWxlY3RvcnMgY29sbGVjdCB0aW1lc3RhbXBzLgotICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBvbmUgb2YgdGhlIHNlbGVjdG9ycyBjb2xsZWN0IHRpbWVzdGFtcHMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKiBDaGVja3MgaWYgb25lIG9mIHRoZSBzZWxlY3RvcnMgY29sbGVjdHMgd3JpdGUgdGltZXN0YW1wcy4KKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgb25lIG9mIHRoZSBzZWxlY3RvcnMgY29sbGVjdHMgd3JpdGUgdGltZXN0YW1wcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb2xsZWN0VGltZXN0YW1wcygpOworICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb2xsZWN0V3JpdGV0aW1lcygpOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBBZGRzIHRoZSBjdXJyZW50IHJvdyBvZiB0aGUgc3BlY2lmaWVkIDxjb2RlPlJlc3VsdFNldEJ1aWxkZXI8L2NvZGU+LgpAQCAtNTAxLDcgKzUwOCw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY29sbGVjdFRpbWVzdGFtcHMoKQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbGxlY3RXcml0ZXRpbWVzKCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICB9CkBAIC01MjAsNyArNTI3LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZWxlY3Rpb25XaXRoUHJvY2Vzc2luZyBleHRlbmRzIFNlbGVjdGlvbgogICAgIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3RvckZhY3RvcmllcyBmYWN0b3JpZXM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb2xsZWN0VGltZXN0YW1wczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbGxlY3RXcml0ZXRpbWVzOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29sbGVjdE1heFdyaXRldGltZXM7CiAgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb2xsZWN0VFRMczsKIAogICAgICAgICBwdWJsaWMgU2VsZWN0aW9uV2l0aFByb2Nlc3NpbmcoVGFibGVNZXRhZGF0YSB0YWJsZSwKQEAgLTU0MCw4ICs1NDgsOSBAQAogICAgICAgICAgICAgICAgICAgaXNKc29uKTsKIAogICAgICAgICAgICAgdGhpcy5mYWN0b3JpZXMgPSBmYWN0b3JpZXM7Ci0gICAgICAgICAgICB0aGlzLmNvbGxlY3RUaW1lc3RhbXBzID0gZmFjdG9yaWVzLmNvbnRhaW5zV3JpdGV0aW1lU2VsZWN0b3JGYWN0b3J5KCk7Ci0gICAgICAgICAgICB0aGlzLmNvbGxlY3RUVExzID0gZmFjdG9yaWVzLmNvbnRhaW5zVFRMU2VsZWN0b3JGYWN0b3J5KCk7OworICAgICAgICAgICAgdGhpcy5jb2xsZWN0V3JpdGV0aW1lcyA9IGZhY3Rvcmllcy5jb250YWluc1dyaXRldGltZVNlbGVjdG9yRmFjdG9yeSgpOworICAgICAgICAgICAgdGhpcy5jb2xsZWN0TWF4V3JpdGV0aW1lcyA9IGZhY3Rvcmllcy5jb250YWluc01heFdyaXRldGltZVNlbGVjdG9yRmFjdG9yeSgpOworICAgICAgICAgICAgdGhpcy5jb2xsZWN0VFRMcyA9IGZhY3Rvcmllcy5jb250YWluc1RUTFNlbGVjdG9yRmFjdG9yeSgpOwogCiAgICAgICAgICAgICBmb3IgKENvbHVtbk1ldGFkYXRhIG9yZGVyaW5nQ29sdW1uIDogb3JkZXJpbmdDb2x1bW5zKQogICAgICAgICAgICAgewpAQCAtNjAxLDcgKzYxMCw3IEBACiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkSW5wdXRSb3coSW5wdXRSb3cgaW5wdXQpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBmb3IgKFNlbGVjdG9yIHNlbGVjdG9yIDogc2VsZWN0b3JzKQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IuYWRkSW5wdXQob3B0aW9ucy5nZXRQcm90b2NvbFZlcnNpb24oKSwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IuYWRkSW5wdXQoaW5wdXQpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtNjE3LDkgKzYyNiw5IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY29sbGVjdFRpbWVzdGFtcHMoKQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbGxlY3RXcml0ZXRpbWVzKCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xsZWN0VGltZXN0YW1wczsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3RXcml0ZXRpbWVzIHx8IGNvbGxlY3RNYXhXcml0ZXRpbWVzOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NlbGVjdG9yLmphdmEKaW5kZXggNDYzMzgyZC4uYjU4NTdkNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3Rvci5qYXZhCkBAIC0yMiwyMiArMjIsMjggQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNRTFR5cGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtbklkZW50aWZpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5TcGVjaWZpY2F0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlPcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc2VsZWN0aW9uLkNvbHVtblRpbWVzdGFtcHMuVGltZXN0YW1wc1R5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbnRleHQuQ291bnRlckNvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkNvbGxlY3Rpb25UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVXNlclR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ29sdW1uRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNvbXBsZXhDb2x1bW5EYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNRTFR5cGVQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIApAQCAtNzEsNyArNzcsNyBAQAogICAgIC8qKgogICAgICAqIFRoZSA8Y29kZT5TZWxlY3RvcjwvY29kZT4ga2luZHMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBlbnVtIEtpbmQKKyAgICBwdWJsaWMgZW51bSBLaW5kCiAgICAgewogICAgICAgICBTSU1QTEVfU0VMRUNUT1IoU2ltcGxlU2VsZWN0b3IuZGVzZXJpYWxpemVyKSwKICAgICAgICAgVEVSTV9TRUxFQ1RPUihUZXJtU2VsZWN0b3IuZGVzZXJpYWxpemVyKSwKQEAgLTE1Miw2ICsxNTgsMTcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyBmYWN0b3J5IGNyZWF0ZXMgPGNvZGU+bWF4d3JpdGV0aW1lPC9jb2RlPiBzZWxlY3RvciBpbnN0YW5jZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBmYWN0b3J5IGNyZWF0ZXMgPGNvZGU+bWF4d3JpdGV0aW1lPC9jb2RlPiBzZWxlY3RvcnMgaW5zdGFuY2VzLAorICAgICAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc01heFdyaXRldGltZVNlbGVjdG9yRmFjdG9yeSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgogICAgICAgICAgKiBDaGVja3MgaWYgdGhpcyBmYWN0b3J5IGNyZWF0ZXMgPGNvZGU+VFRMPC9jb2RlPiBzZWxlY3RvcnMgaW5zdGFuY2VzLgogICAgICAgICAgKgogICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZmFjdG9yeSBjcmVhdGVzIDxjb2RlPlRUTDwvY29kZT4gc2VsZWN0b3JzIGluc3RhbmNlcywKQEAgLTE2NSw3ICsxODIsNiBAQAogICAgICAgICAvKioKICAgICAgICAgICogQ2hlY2tzIGlmIHRoaXMgZmFjdG9yeSBjcmVhdGVzIDxjb2RlPlNlbGVjdG9yPC9jb2RlPnMgdGhhdCBzaW1wbHkgcmV0dXJuIGEgY29sdW1uIHZhbHVlLgogICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGNvbHVtbiBpbmRleAogICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZmFjdG9yeSBjcmVhdGVzIDxjb2RlPlNlbGVjdG9yPC9jb2RlPnMgdGhhdCBzaW1wbHkgcmV0dXJuIGEgY29sdW1uIHZhbHVlLAogICAgICAgICAgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgogICAgICAgICAgKi8KQEAgLTI4OCw3NyArMzA0LDE0MyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSW5wdXRSb3cKICAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdW5tYXNrOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29sbGVjdFdyaXRldGltZXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb2xsZWN0VFRMczsKKwogICAgICAgICBwcml2YXRlIEJ5dGVCdWZmZXJbXSB2YWx1ZXM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgbG9uZ1tdIHRpbWVzdGFtcHM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50W10gdHRsczsKKyAgICAgICAgcHJpdmF0ZSBSb3dUaW1lc3RhbXBzIHdyaXRldGltZXM7CisgICAgICAgIHByaXZhdGUgUm93VGltZXN0YW1wcyB0dGxzOwogICAgICAgICBwcml2YXRlIGludCBpbmRleDsKIAotICAgICAgICBwdWJsaWMgSW5wdXRSb3coaW50IHNpemUsIGJvb2xlYW4gY29sbGVjdFRpbWVzdGFtcHMsIGJvb2xlYW4gY29sbGVjdFRUTHMpCisgICAgICAgIHB1YmxpYyBJbnB1dFJvdyhQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBMaXN0PENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zLCBib29sZWFuIHVubWFzaykKICAgICAgICAgewotICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBuZXcgQnl0ZUJ1ZmZlcltzaXplXTsKKyAgICAgICAgICAgIHRoaXMocHJvdG9jb2xWZXJzaW9uLCBjb2x1bW5zLCB1bm1hc2ssIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGNvbGxlY3RUaW1lc3RhbXBzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMudGltZXN0YW1wcyA9IG5ldyBsb25nW3NpemVdOwotICAgICAgICAgICAgICAgIC8vIFdlIHVzZSBNSU5fVkFMVUUgdG8gaW5kaWNhdGUgbm8gdGltZXN0YW1wCi0gICAgICAgICAgICAgICAgQXJyYXlzLmZpbGwodGltZXN0YW1wcywgTG9uZy5NSU5fVkFMVUUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRpbWVzdGFtcHMgPSBudWxsOwotICAgICAgICAgICAgfQorICAgICAgICBwdWJsaWMgSW5wdXRSb3coUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVubWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY29sbGVjdFdyaXRldGltZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNvbGxlY3RUVExzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnByb3RvY29sVmVyc2lvbiA9IHByb3RvY29sVmVyc2lvbjsKKyAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7CisgICAgICAgICAgICB0aGlzLnVubWFzayA9IHVubWFzazsKKyAgICAgICAgICAgIHRoaXMuY29sbGVjdFdyaXRldGltZXMgPSBjb2xsZWN0V3JpdGV0aW1lczsKKyAgICAgICAgICAgIHRoaXMuY29sbGVjdFRUTHMgPSBjb2xsZWN0VFRMczsKIAotICAgICAgICAgICAgaWYgKGNvbGxlY3RUVExzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMudHRscyA9IG5ldyBpbnRbc2l6ZV07Ci0gICAgICAgICAgICAgICAgLy8gV2UgdXNlIC0xIHRvIGluZGljYXRlIG5vIHR0bAotICAgICAgICAgICAgICAgIEFycmF5cy5maWxsKHR0bHMsIC0xKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0dGxzID0gbnVsbDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBCeXRlQnVmZmVyW2NvbHVtbnMuc2l6ZSgpXTsKKyAgICAgICAgICAgIHdyaXRldGltZXMgPSBpbml0VGltZXN0YW1wcyhUaW1lc3RhbXBzVHlwZS5XUklURVRJTUVTLCBjb2xsZWN0V3JpdGV0aW1lcywgY29sdW1ucyk7CisgICAgICAgICAgICB0dGxzID0gaW5pdFRpbWVzdGFtcHMoVGltZXN0YW1wc1R5cGUuVFRMUywgY29sbGVjdFRUTHMsIGNvbHVtbnMpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSb3dUaW1lc3RhbXBzIGluaXRUaW1lc3RhbXBzKFRpbWVzdGFtcHNUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNvbGxlY3RXcml0ZXRpbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDb2x1bW5NZXRhZGF0YT4gY29sdW1ucykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3RXcml0ZXRpbWVzID8gUm93VGltZXN0YW1wcy5uZXdJbnN0YW5jZSh0eXBlLCBjb2x1bW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUm93VGltZXN0YW1wcy5OT09QX1JPV19USU1FU1RBTVBTOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFByb3RvY29sVmVyc2lvbiBnZXRQcm90b2NvbFZlcnNpb24oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcHJvdG9jb2xWZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gdW5tYXNrKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHVubWFzazsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIGFkZChCeXRlQnVmZmVyIHYpCiAgICAgICAgIHsKICAgICAgICAgICAgIHZhbHVlc1tpbmRleF0gPSB2OwogCi0gICAgICAgICAgICBpZiAodGltZXN0YW1wcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRpbWVzdGFtcHNbaW5kZXhdID0gTG9uZy5NSU5fVkFMVUU7Ci0KLSAgICAgICAgICAgIGlmICh0dGxzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdHRsc1tpbmRleF0gPSAtMTsKLQorICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZXRpbWVzLmFkZE5vVGltZXN0YW1wKGluZGV4KTsKKyAgICAgICAgICAgICAgICB0dGxzLmFkZE5vVGltZXN0YW1wKGluZGV4KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBhZGQoQ2VsbDw/PiBjLCBpbnQgbm93SW5TZWMpCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChDb2x1bW5EYXRhIGNvbHVtbkRhdGEsIGludCBub3dJblNlYykKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkKKyAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhIGNvbHVtbiA9IGNvbHVtbnMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgIGlmIChjb2x1bW5EYXRhID09IG51bGwpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWRkKG51bGwpOwotICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmlzQ29tcGxleCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkKChDb21wbGV4Q29sdW1uRGF0YSkgY29sdW1uRGF0YSwgbm93SW5TZWMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhZGQoKENlbGw8Pz4pIGNvbHVtbkRhdGEsIG5vd0luU2VjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIHZvaWQgYWRkKENlbGw8Pz4gYywgaW50IG5vd0luU2VjKQorICAgICAgICB7CiAgICAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdmFsdWUoYyk7Ci0KLSAgICAgICAgICAgIGlmICh0aW1lc3RhbXBzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdGltZXN0YW1wc1tpbmRleF0gPSBjLnRpbWVzdGFtcCgpOwotCi0gICAgICAgICAgICBpZiAodHRscyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHR0bHNbaW5kZXhdID0gcmVtYWluaW5nVFRMKGMsIG5vd0luU2VjKTsKLQorICAgICAgICAgICAgd3JpdGV0aW1lcy5hZGRUaW1lc3RhbXAoaW5kZXgsIGMsIG5vd0luU2VjKTsKKyAgICAgICAgICAgIHR0bHMuYWRkVGltZXN0YW1wKGluZGV4LCBjLCBub3dJblNlYyk7CiAgICAgICAgICAgICBpbmRleCsrOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBpbnQgcmVtYWluaW5nVFRMKENlbGw8Pz4gYywgaW50IG5vd0luU2VjKQorICAgICAgICBwcml2YXRlIHZvaWQgYWRkKENvbXBsZXhDb2x1bW5EYXRhIGNjZCwgaW50IG5vd0luU2VjKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWMuaXNFeHBpcmluZygpKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gY29sdW1ucy5nZXQoaW5kZXgpLnR5cGU7CisgICAgICAgICAgICBpZiAodHlwZS5pc0NvbGxlY3Rpb24oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gKChDb2xsZWN0aW9uVHlwZTw/PikgdHlwZSkuc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woY2NkLml0ZXJhdG9yKCkpOwogCi0gICAgICAgICAgICBpbnQgcmVtYWluaW5nID0gYy5sb2NhbERlbGV0aW9uVGltZSgpIC0gbm93SW5TZWM7Ci0gICAgICAgICAgICByZXR1cm4gcmVtYWluaW5nID49IDAgPyByZW1haW5pbmcgOiAtMTsKKyAgICAgICAgICAgICAgICBmb3IgKENlbGw8Pz4gY2VsbCA6IGNjZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRldGltZXMuYWRkVGltZXN0YW1wKGluZGV4LCBjZWxsLCBub3dJblNlYyk7CisgICAgICAgICAgICAgICAgICAgIHR0bHMuYWRkVGltZXN0YW1wKGluZGV4LCBjZWxsLCBub3dJblNlYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVzZXJUeXBlIHVkdCA9IChVc2VyVHlwZSkgdHlwZTsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHVkdC5zaXplKCk7CisKKyAgICAgICAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdWR0LnNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKGNjZC5pdGVyYXRvcigpLCBwcm90b2NvbFZlcnNpb24pOworCisgICAgICAgICAgICAgICAgc2hvcnQgZmllbGRQb3NpdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChDZWxsPD8+IGNlbGwgOiBjY2QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgbnVsbCBmaWVsZHMgdGhhdCBhcmVuJ3QgYXQgdGhlIGVuZAorICAgICAgICAgICAgICAgICAgICBzaG9ydCBmaWVsZFBvc2l0aW9uT2ZDZWxsID0gQnl0ZUJ1ZmZlclV0aWwudG9TaG9ydChjZWxsLnBhdGgoKS5nZXQoMCkpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZmllbGRQb3NpdGlvbiA8IGZpZWxkUG9zaXRpb25PZkNlbGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkUG9zaXRpb24rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRldGltZXMuYWRkTm9UaW1lc3RhbXAoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgdHRscy5hZGROb1RpbWVzdGFtcChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmaWVsZFBvc2l0aW9uKys7CisgICAgICAgICAgICAgICAgICAgIHdyaXRldGltZXMuYWRkVGltZXN0YW1wKGluZGV4LCBjZWxsLCBub3dJblNlYyk7CisgICAgICAgICAgICAgICAgICAgIHR0bHMuYWRkVGltZXN0YW1wKGluZGV4LCBjZWxsLCBub3dJblNlYyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gYXBwZW5kIG51bGxzIGZvciBtaXNzaW5nIGNlbGxzCisgICAgICAgICAgICAgICAgd2hpbGUgKGZpZWxkUG9zaXRpb24gPCBzaXplKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmllbGRQb3NpdGlvbisrOworICAgICAgICAgICAgICAgICAgICB3cml0ZXRpbWVzLmFkZE5vVGltZXN0YW1wKGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgdHRscy5hZGROb1RpbWVzdGFtcChpbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgPFY+IEJ5dGVCdWZmZXIgdmFsdWUoQ2VsbDxWPiBjKQpAQCAtMzkwLDM1ICs0NzIsMzggQEAKICAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoYm9vbGVhbiBkZWVwKQogICAgICAgICB7CiAgICAgICAgICAgICBpbmRleCA9IDA7CisgICAgICAgICAgICB0aGlzLndyaXRldGltZXMgPSBpbml0VGltZXN0YW1wcyhUaW1lc3RhbXBzVHlwZS5XUklURVRJTUVTLCBjb2xsZWN0V3JpdGV0aW1lcywgY29sdW1ucyk7CisgICAgICAgICAgICB0aGlzLnR0bHMgPSBpbml0VGltZXN0YW1wcyhUaW1lc3RhbXBzVHlwZS5UVExTLCBjb2xsZWN0VFRMcywgY29sdW1ucyk7CisKICAgICAgICAgICAgIGlmIChkZWVwKQogICAgICAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBCeXRlQnVmZmVyW3ZhbHVlcy5sZW5ndGhdOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybiB0aGUgdGltZXN0YW1wIG9mIHRoZSBjb2x1bW4gd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICAgICAgICAgKiBSZXR1cm4gdGhlIHRpbWVzdGFtcCBvZiB0aGUgY29sdW1uIGNvbXBvbmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXhlcy4KICAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGluZGV4IHRoZSBjb2x1bW4gaW5kZXgKLSAgICAgICAgICogQHJldHVybiB0aGUgdGltZXN0YW1wIG9mIHRoZSBjb2x1bW4gd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4CisgICAgICAgICAqIEByZXR1cm4gdGhlIHRpbWVzdGFtcCBvZiB0aGUgY2VsbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXhlcwogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKGludCBpbmRleCkKKyAgICAgICAgQ29sdW1uVGltZXN0YW1wcyBnZXRXcml0ZXRpbWVzKGludCBjb2x1bW5JbmRleCkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcHNbaW5kZXhdOworICAgICAgICAgICAgcmV0dXJuIHdyaXRldGltZXMuZ2V0KGNvbHVtbkluZGV4KTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm4gdGhlIHR0bCBvZiB0aGUgY29sdW1uIHdpdGggdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgICAgICAgICogUmV0dXJuIHRoZSB0dGwgb2YgdGhlIGNvbHVtbiBjb21wb25lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBhbmQgY2VsbCBpbmRleGVzLgogICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGNvbHVtbiBpbmRleAotICAgICAgICAgKiBAcmV0dXJuIHRoZSB0dGwgb2YgdGhlIGNvbHVtbiB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXgKKyAgICAgICAgICogQHBhcmFtIGNvbHVtbkluZGV4IHRoZSBjb2x1bW4gaW5kZXgKKyAgICAgICAgICogQHJldHVybiB0aGUgdHRsIG9mIHRoZSBjb2x1bW4gd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4ZXMKICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0VHRsKGludCBpbmRleCkKKyAgICAgICAgQ29sdW1uVGltZXN0YW1wcyBnZXRUdGxzKGludCBjb2x1bW5JbmRleCkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHR0bHNbaW5kZXhdOworICAgICAgICAgICAgcmV0dXJuIHR0bHMuZ2V0KGNvbHVtbkluZGV4KTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2x1bW4gdmFsdWVzIGFzIGxpc3QuCiAgICAgICAgICAqIDxwPlRoaXMgY29udGVudCBvZiB0aGUgbGlzdCB3aWxsIGJlIHNoYXJlZCB3aXRoIHRoZSB7QGNvZGUgSW5wdXRSb3d9IHVubGVzcyBhIGRlZXAgcmVzZXQgaGFzIGJlZW4gZG9uZS48L3A+CisgICAgICAgICAqCiAgICAgICAgICAqIEByZXR1cm4gdGhlIGNvbHVtbiB2YWx1ZXMgYXMgbGlzdC4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBMaXN0PEJ5dGVCdWZmZXI+IGdldFZhbHVlcygpCkBAIC00MzAsMTEgKzUxNSwxMCBAQAogICAgIC8qKgogICAgICAqIEFkZCB0aGUgY3VycmVudCB2YWx1ZSBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+UmVzdWx0U2V0QnVpbGRlcjwvY29kZT4uCiAgICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdG9jb2xWZXJzaW9uIHByb3RvY29sIHZlcnNpb24gdXNlZCBmb3Igc2VyaWFsaXphdGlvbgogICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgcm93CiAgICAgICogQHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzIHdoaWxlIGFkZGluZyB0aGUgaW5wdXQgcm93CiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgYWRkSW5wdXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgSW5wdXRSb3cgaW5wdXQpOworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGFkZElucHV0KElucHV0Um93IGlucHV0KTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHNlbGVjdG9yIG91dHB1dC4KQEAgLTQ0NSw2ICs1MjksMTYgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZUJ1ZmZlciBnZXRPdXRwdXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogCisgICAgcHJvdGVjdGVkIENvbHVtblRpbWVzdGFtcHMgZ2V0V3JpdGV0aW1lcyhQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENvbHVtblRpbWVzdGFtcHMgZ2V0VFRMcyhQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgPGNvZGU+U2VsZWN0b3I8L2NvZGU+IG91dHB1dCB0eXBlLgogICAgICAqCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3RvckZhY3Rvcmllcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0b3JGYWN0b3JpZXMuamF2YQppbmRleCA3ZjRiY2IzLi5jNWZiZjQ0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3RvckZhY3Rvcmllcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NlbGVjdG9yRmFjdG9yaWVzLmphdmEKQEAgLTMyLDIyICszMiwyNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CiAKIC8qKgotICogQSBzZXQgb2YgPGNvZGU+U2VsZWN0b3I8L2NvZGU+IGZhY3Rvcmllcy4KKyAqIEEgc2V0IG9mIHtAY29kZSBTZWxlY3Rvcn0gZmFjdG9yaWVzLgogICovCiBmaW5hbCBjbGFzcyBTZWxlY3RvckZhY3RvcmllcyBpbXBsZW1lbnRzIEl0ZXJhYmxlPFNlbGVjdG9yLkZhY3Rvcnk+CiB7CiAgICAgLyoqCi0gICAgICogVGhlIDxjb2RlPlNlbGVjdG9yPC9jb2RlPiBmYWN0b3JpZXMuCisgICAgICogVGhlIHtAY29kZSBTZWxlY3Rvcn0gZmFjdG9yaWVzLgogICAgICAqLwogICAgIHByaXZhdGUgZmluYWwgTGlzdDxTZWxlY3Rvci5GYWN0b3J5PiBmYWN0b3JpZXM7CiAKICAgICAvKioKLSAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiBvbmUgb2YgdGhlIGZhY3RvcnkgY3JlYXRlcyB3cml0ZXRpbWUgc2VsZWN0b3JzLgorICAgICAqIHtAY29kZSB0cnVlfSBpZiBvbmUgb2YgdGhlIGZhY3RvcmllcyBjcmVhdGVzIHdyaXRldGltZSBzZWxlY3RvcnMuCiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zV3JpdGV0aW1lRmFjdG9yeTsKIAogICAgIC8qKgotICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIG9uZSBvZiB0aGUgZmFjdG9yeSBjcmVhdGVzIFRUTCBzZWxlY3RvcnMuCisgICAgICoge0Bjb2RlIHRydWV9IGlmIG9uZSBvZiB0aGUgZmFjdG9yaWVzIGNyZWF0ZXMgbWF4V3JpdGV0aW1lIHNlbGVjdG9ycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNNYXhXcml0ZXRpbWVGYWN0b3J5OworCisgICAgLyoqCisgICAgICoge0Bjb2RlIHRydWV9IGlmIG9uZSBvZiB0aGUgZmFjdG9yaWVzIGNyZWF0ZXMgVFRMIHNlbGVjdG9ycy4KICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNUVExGYWN0b3J5OwogCkBAIC05Niw2ICsxMDEsNyBAQAogICAgICAgICAgICAgRmFjdG9yeSBmYWN0b3J5ID0gc2VsZWN0YWJsZS5uZXdTZWxlY3RvckZhY3RvcnkodGFibGUsIGV4cGVjdGVkVHlwZSwgZGVmcywgYm91bmROYW1lcyk7CiAgICAgICAgICAgICBjb250YWluc1dyaXRldGltZUZhY3RvcnkgfD0gZmFjdG9yeS5pc1dyaXRldGltZVNlbGVjdG9yRmFjdG9yeSgpOwogICAgICAgICAgICAgY29udGFpbnNUVExGYWN0b3J5IHw9IGZhY3RvcnkuaXNUVExTZWxlY3RvckZhY3RvcnkoKTsKKyAgICAgICAgICAgIGNvbnRhaW5zTWF4V3JpdGV0aW1lRmFjdG9yeSB8PSBmYWN0b3J5LmlzTWF4V3JpdGV0aW1lU2VsZWN0b3JGYWN0b3J5KCk7CiAgICAgICAgICAgICBpZiAoZmFjdG9yeS5pc0FnZ3JlZ2F0ZVNlbGVjdG9yRmFjdG9yeSgpKQogICAgICAgICAgICAgICAgICsrbnVtYmVyT2ZBZ2dyZWdhdGVGYWN0b3JpZXM7CiAgICAgICAgICAgICBmYWN0b3JpZXMuYWRkKGZhY3RvcnkpOwpAQCAtMTQxLDcgKzE0Nyw3IEBACiAgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkU2VsZWN0b3JGb3JPcmRlcmluZyhDb2x1bW5NZXRhZGF0YSBkZWYsIGludCBpbmRleCkKICAgICB7Ci0gICAgICAgIGZhY3Rvcmllcy5hZGQoU2ltcGxlU2VsZWN0b3IubmV3RmFjdG9yeShkZWYsIGluZGV4KSk7CisgICAgICAgIGZhY3Rvcmllcy5hZGQoU2ltcGxlU2VsZWN0b3IubmV3RmFjdG9yeShkZWYsIGluZGV4LCB0cnVlKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjYsNiArMTcyLDE3IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoaXMge0Bjb2RlIFNlbGVjdG9yRmFjdG9yaWVzfSBjb250YWlucyBhdCBsZWFzdCBvbmUgZmFjdG9yeSBmb3IgbWF4V3JpdGV0aW1lIHNlbGVjdG9ycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0BsaW5rIHRydWV9IGlmIHRoaXMge0BsaW5rIFNlbGVjdG9yRmFjdG9yaWVzfSBjb250YWlucyBhdCBsZWFzdCBvbmUgZmFjdG9yeSBmb3IgbWF4V3JpdGV0aW1lCisgICAgICogc2VsZWN0b3JzLCB7QGxpbmsgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc01heFdyaXRldGltZVNlbGVjdG9yRmFjdG9yeSgpCisgICAgeworICAgICAgICByZXR1cm4gY29udGFpbnNNYXhXcml0ZXRpbWVGYWN0b3J5OworICAgIH0KKworICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGlzIDxjb2RlPlNlbGVjdG9yRmFjdG9yaWVzPC9jb2RlPiBjb250YWlucyBhdCBsZWFzdCBvbmUgZmFjdG9yeSBmb3IgVFRMIHNlbGVjdG9ycy4KICAgICAgKgogICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyA8Y29kZT5TZWxlY3RvckZhY3RvcmllczwvY29kZT4gY29udGFpbnMgYXQgbGVhc3Qgb25lIGZhY3RvcnkgZm9yIFRUTApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2V0U2VsZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NldFNlbGVjdG9yLmphdmEKaW5kZXggYjU0YjJkNC4uYzZhYTIyNSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2V0U2VsZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZXRTZWxlY3Rvci5qYXZhCkBAIC00OSw3ICs0OSw3IEBACiAgICAgICAgIHByb3RlY3RlZCBTZWxlY3RvciBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbiwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIFNldFR5cGU8Pz4gdHlwZSA9IChTZXRUeXBlPD8+KSByZWFkVHlwZShtZXRhZGF0YSwgaW4pOwotICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgTGlzdDxTZWxlY3Rvcj4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PD4oc2l6ZSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQoc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgdmVyc2lvbiwgbWV0YWRhdGEpKTsKQEAgLTkxLDEwICs5MSwxMCBAQAogICAgICAgICAgICAgZWxlbWVudHMuZ2V0KGkpLmFkZEZldGNoZWRDb2x1bW5zKGJ1aWxkZXIpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIElucHV0Um93IGlucHV0KQorICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KElucHV0Um93IGlucHV0KQogICAgIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG0gPSBlbGVtZW50cy5zaXplKCk7IGkgPCBtOyBpKyspCi0gICAgICAgICAgICBlbGVtZW50cy5nZXQoaSkuYWRkSW5wdXQocHJvdG9jb2xWZXJzaW9uLCBpbnB1dCk7CisgICAgICAgICAgICBlbGVtZW50cy5nZXQoaSkuYWRkSW5wdXQoaW5wdXQpOwogICAgIH0KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE91dHB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQpAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGJ1ZmZlcnMuYWRkKGVsZW1lbnRzLmdldChpKS5nZXRPdXRwdXQocHJvdG9jb2xWZXJzaW9uKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2soYnVmZmVycywgYnVmZmVycy5zaXplKCksIHByb3RvY29sVmVyc2lvbik7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGJ1ZmZlcnMsIGJ1ZmZlcnMuc2l6ZSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZXNldCgpCkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICB3cml0ZVR5cGUob3V0LCB0eXBlKTsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGVsZW1lbnRzLnNpemUoKSk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGVsZW1lbnRzLnNpemUoKSk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBtID0gZWxlbWVudHMuc2l6ZSgpOyBpIDwgbTsgaSsrKQogICAgICAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUoZWxlbWVudHMuZ2V0KGkpLCBvdXQsIHZlcnNpb24pOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NpbXBsZVNlbGVjdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TaW1wbGVTZWxlY3Rvci5qYXZhCmluZGV4IGE2YWU0NDYuLjIyMDQ1ZWIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NpbXBsZVNlbGVjdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2ltcGxlU2VsZWN0b3IuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZy5Db2x1bW5NYXNrOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtblNwZWNpZmljYXRpb247CkBAIC00NSw3ICs0Niw3IEBACiAgICAgICAgICAgICBCeXRlQnVmZmVyIGNvbHVtbk5hbWUgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFZJbnRMZW5ndGgoaW4pOwogICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEgY29sdW1uID0gbWV0YWRhdGEuZ2V0Q29sdW1uKGNvbHVtbk5hbWUpOwogICAgICAgICAgICAgaW50IGlkeCA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlU2VsZWN0b3IoY29sdW1uLCBpZHgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTZWxlY3Rvcihjb2x1bW4sIGlkeCwgZmFsc2UpOwogICAgICAgICB9CiAgICAgfTsKIApAQCAtNTUsMTMgKzU2LDE0IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTaW1wbGVTZWxlY3RvckZhY3RvcnkgZXh0ZW5kcyBGYWN0b3J5CiAgICAgewogICAgICAgICBwcml2YXRlIGZpbmFsIGludCBpZHg7Ci0KICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2x1bW5NZXRhZGF0YSBjb2x1bW47CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB1c2VGb3JQb3N0T3JkZXJpbmc7CiAKLSAgICAgICAgcHJpdmF0ZSBTaW1wbGVTZWxlY3RvckZhY3RvcnkoaW50IGlkeCwgQ29sdW1uTWV0YWRhdGEgZGVmKQorICAgICAgICBwcml2YXRlIFNpbXBsZVNlbGVjdG9yRmFjdG9yeShpbnQgaWR4LCBDb2x1bW5NZXRhZGF0YSBkZWYsIGJvb2xlYW4gdXNlRm9yUG9zdE9yZGVyaW5nKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLmlkeCA9IGlkeDsKICAgICAgICAgICAgIHRoaXMuY29sdW1uID0gZGVmOworICAgICAgICAgICAgdGhpcy51c2VGb3JQb3N0T3JkZXJpbmcgPSB1c2VGb3JQb3N0T3JkZXJpbmc7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTg0LDcgKzg2LDcgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTZWxlY3RvciBuZXdJbnN0YW5jZShRdWVyeU9wdGlvbnMgb3B0aW9ucykKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTZWxlY3Rvcihjb2x1bW4sIGlkeCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVNlbGVjdG9yKGNvbHVtbiwgaWR4LCB1c2VGb3JQb3N0T3JkZXJpbmcpOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC0xMTcsMTIgKzExOSwxNSBAQAogCiAgICAgcHVibGljIGZpbmFsIENvbHVtbk1ldGFkYXRhIGNvbHVtbjsKICAgICBwcml2YXRlIGZpbmFsIGludCBpZHg7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHVzZUZvclBvc3RPcmRlcmluZzsKICAgICBwcml2YXRlIEJ5dGVCdWZmZXIgY3VycmVudDsKKyAgICBwcml2YXRlIENvbHVtblRpbWVzdGFtcHMgd3JpdGV0aW1lczsKKyAgICBwcml2YXRlIENvbHVtblRpbWVzdGFtcHMgdHRsczsKICAgICBwcml2YXRlIGJvb2xlYW4gaXNTZXQ7CiAKLSAgICBwdWJsaWMgc3RhdGljIEZhY3RvcnkgbmV3RmFjdG9yeShmaW5hbCBDb2x1bW5NZXRhZGF0YSBkZWYsIGZpbmFsIGludCBpZHgpCisgICAgcHVibGljIHN0YXRpYyBGYWN0b3J5IG5ld0ZhY3RvcnkoZmluYWwgQ29sdW1uTWV0YWRhdGEgZGVmLCBmaW5hbCBpbnQgaWR4LCBib29sZWFuIHVzZUZvclBvc3RPcmRlcmluZykKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlU2VsZWN0b3JGYWN0b3J5KGlkeCwgZGVmKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTZWxlY3RvckZhY3RvcnkoaWR4LCBkZWYsIHVzZUZvclBvc3RPcmRlcmluZyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMzIsMTIgKzEzNywyMyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIElucHV0Um93IGlucHV0KSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KKyAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChJbnB1dFJvdyBpbnB1dCkgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCiAgICAgewogICAgICAgICBpZiAoIWlzU2V0KQogICAgICAgICB7CiAgICAgICAgICAgICBpc1NldCA9IHRydWU7Ci0gICAgICAgICAgICBjdXJyZW50ID0gaW5wdXQuZ2V0VmFsdWUoaWR4KTsKKyAgICAgICAgICAgIHdyaXRldGltZXMgPSBpbnB1dC5nZXRXcml0ZXRpbWVzKGlkeCk7CisgICAgICAgICAgICB0dGxzID0gaW5wdXQuZ2V0VHRscyhpZHgpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgV2UgYXBwbHkgdGhlIGNvbHVtbiBtYXNrIG9mIHRoZSBjb2x1bW4gdW5sZXNzOgorICAgICAgICAgICAgLSBUaGUgY29sdW1uIGRvZXNuJ3QgaGF2ZSBhIG1hc2sKKyAgICAgICAgICAgIC0gVGhpcyBzZWxlY3RvciBpcyBmb3IgYSBxdWVyeSB3aXRoIE9SREVSIEJZIHBvc3Qtb3JkZXJpbmcsIGluZGljYXRlZCBieSB0aGlzLnVzZUZvclBvc3RPcmRlcmluZworICAgICAgICAgICAgLSBUaGUgaW5wdXQgcm93IGlzIGZvciBhIHVzZXIgd2l0aCBVTk1BU0sgcGVybWlzc2lvbiwgaW5kaWNhdGVkIGJ5IGlucHV0LnVubWFzaygpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvbHVtbk1hc2sgbWFzayA9IHVzZUZvclBvc3RPcmRlcmluZyB8fCBpbnB1dC51bm1hc2soKSA/IG51bGwgOiBjb2x1bW4uZ2V0TWFzaygpOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IGlucHV0LmdldFZhbHVlKGlkeCk7CisgICAgICAgICAgICBjdXJyZW50ID0gbWFzayA9PSBudWxsID8gdmFsdWUgOiBtYXNrLm1hc2soaW5wdXQuZ2V0UHJvdG9jb2xWZXJzaW9uKCksIHZhbHVlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTQ4LDEwICsxNjQsMjQgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQ29sdW1uVGltZXN0YW1wcyBnZXRXcml0ZXRpbWVzKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gd3JpdGV0aW1lczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQ29sdW1uVGltZXN0YW1wcyBnZXRUVExzKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gdHRsczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZXNldCgpCiAgICAgewogICAgICAgICBpc1NldCA9IGZhbHNlOwogICAgICAgICBjdXJyZW50ID0gbnVsbDsKKyAgICAgICAgd3JpdGV0aW1lcyA9IG51bGw7CisgICAgICAgIHR0bHMgPSBudWxsOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTY2LDExICsxOTYsMTIgQEAKICAgICAgICAgcmV0dXJuIGNvbHVtbi5uYW1lLnRvU3RyaW5nKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBTaW1wbGVTZWxlY3RvcihDb2x1bW5NZXRhZGF0YSBjb2x1bW4sIGludCBpZHgpCisgICAgcHJpdmF0ZSBTaW1wbGVTZWxlY3RvcihDb2x1bW5NZXRhZGF0YSBjb2x1bW4sIGludCBpZHgsIGJvb2xlYW4gdXNlRm9yUG9zdE9yZGVyaW5nKQogICAgIHsKICAgICAgICAgc3VwZXIoS2luZC5TSU1QTEVfU0VMRUNUT1IpOwogICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKICAgICAgICAgdGhpcy5pZHggPSBpZHg7CisgICAgICAgIHRoaXMudXNlRm9yUG9zdE9yZGVyaW5nID0gdXNlRm9yUG9zdE9yZGVyaW5nOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMjEwLDYgKzI0MSw2IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIG91dCwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoVkludExlbmd0aChjb2x1bW4ubmFtZS5ieXRlcywgb3V0KTsKLSAgICAgICAgb3V0LndyaXRlSW50KGlkeCk7OworICAgICAgICBvdXQud3JpdGVJbnQoaWR4KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9UZXJtU2VsZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1Rlcm1TZWxlY3Rvci5qYXZhCmluZGV4IDZmMGM4NDQuLjE5YTYwYWMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1Rlcm1TZWxlY3Rvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1Rlcm1TZWxlY3Rvci5qYXZhCkBAIC0xMDEsNyArMTAxLDcgQEAKICAgICB7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgYWRkSW5wdXQoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbiwgSW5wdXRSb3cgaW5wdXQpCisgICAgcHVibGljIHZvaWQgYWRkSW5wdXQoSW5wdXRSb3cgaW5wdXQpCiAgICAgewogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vVHVwbGVTZWxlY3Rvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vVHVwbGVTZWxlY3Rvci5qYXZhCmluZGV4IDBjMDZiYzIuLjExMWQ2M2MgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1R1cGxlU2VsZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9UdXBsZVNlbGVjdG9yLmphdmEKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICAgICAgcHJvdGVjdGVkIFNlbGVjdG9yIGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uLCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSByZWFkVHlwZShtZXRhZGF0YSwgaW4pOwotICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgTGlzdDxTZWxlY3Rvcj4gZWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0PD4oc2l6ZSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKICAgICAgICAgICAgICAgICBlbGVtZW50cy5hZGQoc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgdmVyc2lvbiwgbWV0YWRhdGEpKTsKQEAgLTg5LDEwICs4OSwxMCBAQAogICAgICAgICAgICAgZWxlbWVudHMuZ2V0KGkpLmFkZEZldGNoZWRDb2x1bW5zKGJ1aWxkZXIpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIElucHV0Um93IGlucHV0KQorICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KElucHV0Um93IGlucHV0KQogICAgIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG0gPSBlbGVtZW50cy5zaXplKCk7IGkgPCBtOyBpKyspCi0gICAgICAgICAgICBlbGVtZW50cy5nZXQoaSkuYWRkSW5wdXQocHJvdG9jb2xWZXJzaW9uLCBpbnB1dCk7CisgICAgICAgICAgICBlbGVtZW50cy5nZXQoaSkuYWRkSW5wdXQoaW5wdXQpOwogICAgIH0KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE91dHB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KQEAgLTE3Niw3ICsxNzYsNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIHdyaXRlVHlwZShvdXQsIHR5cGUpOwotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoZWxlbWVudHMuc2l6ZSgpKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoZWxlbWVudHMuc2l6ZSgpKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMCwgbSA9IGVsZW1lbnRzLnNpemUoKTsgaSA8IG07IGkrKykKICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGVsZW1lbnRzLmdldChpKSwgb3V0LCB2ZXJzaW9uKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1VzZXJUeXBlU2VsZWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1VzZXJUeXBlU2VsZWN0b3IuamF2YQppbmRleCA4MDA3NDY3Li5iZjcxYzczIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9Vc2VyVHlwZVNlbGVjdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vVXNlclR5cGVTZWxlY3Rvci5qYXZhCkBAIC01NSw3ICs1NSw3IEBACiAgICAgICAgIHByb3RlY3RlZCBTZWxlY3RvciBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbiwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIFVzZXJUeXBlIHR5cGUgPSAoVXNlclR5cGUpIHJlYWRUeXBlKG1ldGFkYXRhLCBpbik7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBzaXplID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICBNYXA8RmllbGRJZGVudGlmaWVyLCBTZWxlY3Rvcj4gZmllbGRzID0gbmV3IEhhc2hNYXA8PihzaXplKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgICAgICAgICAgewpAQCAtMTgyLDEwICsxODIsMTAgQEAKICAgICAgICAgICAgIGZpZWxkLmFkZEZldGNoZWRDb2x1bW5zKGJ1aWxkZXIpOwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24sIElucHV0Um93IGlucHV0KQorICAgIHB1YmxpYyB2b2lkIGFkZElucHV0KElucHV0Um93IGlucHV0KQogICAgIHsKICAgICAgICAgZm9yIChTZWxlY3RvciBmaWVsZCA6IGZpZWxkcy52YWx1ZXMoKSkKLSAgICAgICAgICAgIGZpZWxkLmFkZElucHV0KHByb3RvY29sVmVyc2lvbiwgaW5wdXQpOworICAgICAgICAgICAgZmllbGQuYWRkSW5wdXQoaW5wdXQpOwogICAgIH0KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE91dHB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQpAQCAtMjcyLDcgKzI3Miw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIG91dCwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgd3JpdGVUeXBlKG91dCwgdHlwZSk7Ci0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoZmllbGRzLnNpemUoKSk7CiAKICAgICAgICAgZm9yIChNYXAuRW50cnk8RmllbGRJZGVudGlmaWVyLCBTZWxlY3Rvcj4gZmllbGQgOiBmaWVsZHMuZW50cnlTZXQoKSkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vV3JpdGV0aW1lT3JUVExTZWxlY3Rvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vV3JpdGV0aW1lT3JUVExTZWxlY3Rvci5qYXZhCmluZGV4IDJjNTZmNWMuLjliZTBiNDUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1dyaXRldGltZU9yVFRMU2VsZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9Xcml0ZXRpbWVPclRUTFNlbGVjdG9yLmphdmEKQEAgLTIyLDEwNyArMjIsMTI3IEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5MaXN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5T3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtblNwZWNpZmljYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Mb25nVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogCiBmaW5hbCBjbGFzcyBXcml0ZXRpbWVPclRUTFNlbGVjdG9yIGV4dGVuZHMgU2VsZWN0b3IKIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNlbGVjdG9yRGVzZXJpYWxpemVyIGRlc2VyaWFsaXplciA9IG5ldyBTZWxlY3RvckRlc2VyaWFsaXplcigpCisgICAgc3RhdGljIGZpbmFsIFNlbGVjdG9yRGVzZXJpYWxpemVyIGRlc2VyaWFsaXplciA9IG5ldyBTZWxlY3RvckRlc2VyaWFsaXplcigpCiAgICAgeworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIFNlbGVjdG9yIGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uLCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgQnl0ZUJ1ZmZlciBjb2x1bW5OYW1lID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhWSW50TGVuZ3RoKGluKTsKLSAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhIGNvbHVtbiA9IG1ldGFkYXRhLmdldENvbHVtbihjb2x1bW5OYW1lKTsKKyAgICAgICAgICAgIFNlbGVjdG9yIHNlbGVjdGVkID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgdmVyc2lvbiwgbWV0YWRhdGEpOwogICAgICAgICAgICAgaW50IGlkeCA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNXcml0ZXRpbWUgPSBpbi5yZWFkQm9vbGVhbigpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBXcml0ZXRpbWVPclRUTFNlbGVjdG9yKGNvbHVtbiwgaWR4LCBpc1dyaXRldGltZSk7CisgICAgICAgICAgICBpbnQgb3JkaW5hbCA9IGluLnJlYWRCeXRlKCk7CisgICAgICAgICAgICBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLktpbmQga2luZCA9IFNlbGVjdGFibGUuV3JpdGV0aW1lT3JUVEwuS2luZC5mcm9tT3JkaW5hbChvcmRpbmFsKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaXNNdWx0aUNlbGwgPSBpbi5yZWFkQm9vbGVhbigpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBXcml0ZXRpbWVPclRUTFNlbGVjdG9yKHNlbGVjdGVkLCBpZHgsIGtpbmQsIGlzTXVsdGlDZWxsKTsKICAgICAgICAgfQogICAgIH07CiAKLSAgICBwcml2YXRlIGZpbmFsIENvbHVtbk1ldGFkYXRhIGNvbHVtbjsKLSAgICBwcml2YXRlIGZpbmFsIGludCBpZHg7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzV3JpdGV0aW1lOworICAgIHByaXZhdGUgZmluYWwgU2VsZWN0b3Igc2VsZWN0ZWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY29sdW1uSW5kZXg7CisgICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLktpbmQga2luZDsKICAgICBwcml2YXRlIEJ5dGVCdWZmZXIgY3VycmVudDsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNNdWx0aUNlbGw7CiAgICAgcHJpdmF0ZSBib29sZWFuIGlzU2V0OwogCi0gICAgcHVibGljIHN0YXRpYyBGYWN0b3J5IG5ld0ZhY3RvcnkoZmluYWwgQ29sdW1uTWV0YWRhdGEgZGVmLCBmaW5hbCBpbnQgaWR4LCBmaW5hbCBib29sZWFuIGlzV3JpdGV0aW1lKQorICAgIHB1YmxpYyBzdGF0aWMgRmFjdG9yeSBuZXdGYWN0b3J5KGZpbmFsIFNlbGVjdG9yLkZhY3RvcnkgZmFjdG9yeSwgZmluYWwgaW50IGNvbHVtbkluZGV4LCBmaW5hbCBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLktpbmQga2luZCwgYm9vbGVhbiBpc011bHRpQ2VsbCkKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgRmFjdG9yeSgpCiAgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5OYW1lKCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMoJXMpIiwgaXNXcml0ZXRpbWUgPyAid3JpdGV0aW1lIiA6ICJ0dGwiLCBkZWYubmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMoJXMpIiwga2luZC5uYW1lLCBmYWN0b3J5LmdldENvbHVtbk5hbWUoKSk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHJvdGVjdGVkIEFic3RyYWN0VHlwZTw/PiBnZXRSZXR1cm5UeXBlKCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNXcml0ZXRpbWUgPyBMb25nVHlwZS5pbnN0YW5jZSA6IEludDMyVHlwZS5pbnN0YW5jZTsKKyAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IGtpbmQucmV0dXJuVHlwZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXNNdWx0aUNlbGwgJiYgIWtpbmQuYWdncmVnYXRlc011bHRpQ2VsbCgpID8gTGlzdFR5cGUuZ2V0SW5zdGFuY2UodHlwZSwgZmFsc2UpIDogdHlwZTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhZGRDb2x1bW5NYXBwaW5nKFNlbGVjdGlvbkNvbHVtbk1hcHBpbmcgbWFwcGluZywgQ29sdW1uU3BlY2lmaWNhdGlvbiByZXN1bHRzQ29sdW1uKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgbWFwcGluZy5hZGRNYXBwaW5nKHJlc3VsdHNDb2x1bW4sIGRlZik7CisgICAgICAgICAgICAgICAgZmFjdG9yeS5hZGRDb2x1bW5NYXBwaW5nKG1hcHBpbmcsIHJlc3VsdHNDb2x1bW4pOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBTZWxlY3RvciBuZXdJbnN0YW5jZShRdWVyeU9wdGlvbnMgb3B0aW9ucykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdyaXRldGltZU9yVFRMU2VsZWN0b3IoZGVmLCBpZHgsIGlzV3JpdGV0aW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdyaXRldGltZU9yVFRMU2VsZWN0b3IoZmFjdG9yeS5uZXdJbnN0YW5jZShvcHRpb25zKSwgY29sdW1uSW5kZXgsIGtpbmQsIGlzTXVsdGlDZWxsKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRldGltZVNlbGVjdG9yRmFjdG9yeSgpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlzV3JpdGV0aW1lOworICAgICAgICAgICAgICAgIHJldHVybiBraW5kICE9IFNlbGVjdGFibGUuV3JpdGV0aW1lT3JUVEwuS2luZC5UVEw7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNUVExTZWxlY3RvckZhY3RvcnkoKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAhaXNXcml0ZXRpbWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGtpbmQgPT0gU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTC5LaW5kLlRUTDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc01heFdyaXRldGltZVNlbGVjdG9yRmFjdG9yeSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGtpbmQgPT0gU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTC5LaW5kLk1BWF9XUklURV9USU1FOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFyZUFsbEZldGNoZWRDb2x1bW5zS25vd24oKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEZldGNoZWRDb2x1bW5zKENvbHVtbkZpbHRlci5CdWlsZGVyIGJ1aWxkZXIpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGQoZGVmKTsKKyAgICAgICAgICAgICAgICBmYWN0b3J5LmFkZEZldGNoZWRDb2x1bW5zKGJ1aWxkZXIpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZEZldGNoZWRDb2x1bW5zKENvbHVtbkZpbHRlci5CdWlsZGVyIGJ1aWxkZXIpCiAgICAgewotICAgICAgICBidWlsZGVyLmFkZChjb2x1bW4pOworICAgICAgICBzZWxlY3RlZC5hZGRGZXRjaGVkQ29sdW1ucyhidWlsZGVyKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uLCBJbnB1dFJvdyBpbnB1dCkKKyAgICBwdWJsaWMgdm9pZCBhZGRJbnB1dChJbnB1dFJvdyBpbnB1dCkKICAgICB7CiAgICAgICAgIGlmIChpc1NldCkKICAgICAgICAgICAgIHJldHVybjsKIAogICAgICAgICBpc1NldCA9IHRydWU7CiAKLSAgICAgICAgaWYgKGlzV3JpdGV0aW1lKQorICAgICAgICBzZWxlY3RlZC5hZGRJbnB1dChpbnB1dCk7CisgICAgICAgIFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24gPSBpbnB1dC5nZXRQcm90b2NvbFZlcnNpb24oKTsKKworICAgICAgICBzd2l0Y2ggKGtpbmQpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgdHMgPSBpbnB1dC5nZXRUaW1lc3RhbXAoaWR4KTsKLSAgICAgICAgICAgIGN1cnJlbnQgPSB0cyAhPSBMb25nLk1JTl9WQUxVRSA/IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHRzKSA6IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdHRsID0gaW5wdXQuZ2V0VHRsKGlkeCk7Ci0gICAgICAgICAgICBjdXJyZW50ID0gdHRsID4gMCA/IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHR0bCkgOiBudWxsOworICAgICAgICAgICAgY2FzZSBXUklURV9USU1FOgorICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBzZWxlY3RlZC5nZXRXcml0ZXRpbWVzKHByb3RvY29sVmVyc2lvbikudG9CeXRlQnVmZmVyKHByb3RvY29sVmVyc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1BWF9XUklURV9USU1FOgorICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBzZWxlY3RlZC5nZXRXcml0ZXRpbWVzKHByb3RvY29sVmVyc2lvbikubWF4KCkudG9CeXRlQnVmZmVyKHByb3RvY29sVmVyc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRUTDoKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gc2VsZWN0ZWQuZ2V0VFRMcyhwcm90b2NvbFZlcnNpb24pLnRvQnl0ZUJ1ZmZlcihwcm90b2NvbFZlcnNpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzMsMjcgKzE1MywzMCBAQAogCiAgICAgcHVibGljIHZvaWQgcmVzZXQoKQogICAgIHsKKyAgICAgICAgc2VsZWN0ZWQucmVzZXQoKTsKICAgICAgICAgaXNTZXQgPSBmYWxzZTsKICAgICAgICAgY3VycmVudCA9IG51bGw7CiAgICAgfQogCiAgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBnZXRUeXBlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBpc1dyaXRldGltZSA/IExvbmdUeXBlLmluc3RhbmNlIDogSW50MzJUeXBlLmluc3RhbmNlOworICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IGtpbmQucmV0dXJuVHlwZTsKKyAgICAgICAgcmV0dXJuIGlzTXVsdGlDZWxsID8gTGlzdFR5cGUuZ2V0SW5zdGFuY2UodHlwZSwgZmFsc2UpIDogdHlwZTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBjb2x1bW4ubmFtZS50b1N0cmluZygpOworICAgICAgICByZXR1cm4gc2VsZWN0ZWQudG9TdHJpbmcoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFdyaXRldGltZU9yVFRMU2VsZWN0b3IoQ29sdW1uTWV0YWRhdGEgY29sdW1uLCBpbnQgaWR4LCBib29sZWFuIGlzV3JpdGV0aW1lKQorICAgIHByaXZhdGUgV3JpdGV0aW1lT3JUVExTZWxlY3RvcihTZWxlY3RvciBzZWxlY3RlZCwgaW50IGlkeCwgU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTC5LaW5kIGtpbmQsIGJvb2xlYW4gaXNNdWx0aUNlbGwpCiAgICAgewogICAgICAgICBzdXBlcihLaW5kLldSSVRFVElNRV9PUl9UVExfU0VMRUNUT1IpOwotICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKLSAgICAgICAgdGhpcy5pZHggPSBpZHg7Ci0gICAgICAgIHRoaXMuaXNXcml0ZXRpbWUgPSBpc1dyaXRldGltZTsKKyAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkOworICAgICAgICB0aGlzLmNvbHVtbkluZGV4ID0gaWR4OworICAgICAgICB0aGlzLmtpbmQgPSBraW5kOworICAgICAgICB0aGlzLmlzTXVsdGlDZWxsID0gaXNNdWx0aUNlbGw7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNjcsMzAgKzE5MCwzMCBAQAogCiAgICAgICAgIFdyaXRldGltZU9yVFRMU2VsZWN0b3IgcyA9IChXcml0ZXRpbWVPclRUTFNlbGVjdG9yKSBvOwogCi0gICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFsKGNvbHVtbiwgcy5jb2x1bW4pCi0gICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFsKGlkeCwgcy5pZHgpCi0gICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFsKGlzV3JpdGV0aW1lLCBzLmlzV3JpdGV0aW1lKTsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWwoc2VsZWN0ZWQsIHMuc2VsZWN0ZWQpICYmIGtpbmQgPT0gcy5raW5kOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUoY29sdW1uLCBpZHgsIGlzV3JpdGV0aW1lKTsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUoc2VsZWN0ZWQsIGtpbmQpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBpbnQgc2VyaWFsaXplZFNpemUoaW50IHZlcnNpb24pCiAgICAgewotICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuc2VyaWFsaXplZFNpemVXaXRoVkludExlbmd0aChjb2x1bW4ubmFtZS5ieXRlcykKLSAgICAgICAgICAgICAgICArIFR5cGVTaXplcy5zaXplb2YoaWR4KQotICAgICAgICAgICAgICAgICsgVHlwZVNpemVzLnNpemVvZihpc1dyaXRldGltZSk7CisgICAgICAgIHJldHVybiBzZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKHNlbGVjdGVkLCB2ZXJzaW9uKQorICAgICAgICAgICAgICAgICsgVHlwZVNpemVzLnNpemVvZihjb2x1bW5JbmRleCkKKyAgICAgICAgICAgICAgICArIFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQoa2luZC5vcmRpbmFsKCkpCisgICAgICAgICAgICAgICAgKyBUeXBlU2l6ZXMuc2l6ZW9mKGlzTXVsdGlDZWxsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhWSW50TGVuZ3RoKGNvbHVtbi5uYW1lLmJ5dGVzLCBvdXQpOwotICAgICAgICBvdXQud3JpdGVJbnQoaWR4KTsKLSAgICAgICAgb3V0LndyaXRlQm9vbGVhbihpc1dyaXRldGltZSk7CisgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKHNlbGVjdGVkLCBvdXQsIHZlcnNpb24pOworICAgICAgICBvdXQud3JpdGVJbnQoY29sdW1uSW5kZXgpOworICAgICAgICBvdXQud3JpdGVCeXRlKGtpbmQub3JkaW5hbCgpKTsKKyAgICAgICAgb3V0LndyaXRlQm9vbGVhbihpc011bHRpQ2VsbCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL0JhdGNoU3RhdGVtZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvQmF0Y2hTdGF0ZW1lbnQuamF2YQppbmRleCA2MWU0OTM0Li5iMDM0ZGI0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvQmF0Y2hTdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvQmF0Y2hTdGF0ZW1lbnQuamF2YQpAQCAtNDIsNiArNDIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQmF0Y2hNZXRyaWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFjaW5nLlRyYWNpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0Lm1lc3NhZ2VzLlJlc3VsdE1lc3NhZ2U7CkBAIC00NDIsNiArNDQzLDcgQEAKIAogICAgICAgICBib29sZWFuIG11dGF0ZUF0b21pYyA9IChpc0xvZ2dlZCgpICYmIG11dGF0aW9ucy5zaXplKCkgPiAxKTsKICAgICAgICAgU3RvcmFnZVByb3h5Lm11dGF0ZVdpdGhUcmlnZ2VycyhtdXRhdGlvbnMsIGNsLCBtdXRhdGVBdG9taWMsIHF1ZXJ5U3RhcnROYW5vVGltZSk7CisgICAgICAgIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy5yZWNvcmRSb3dBbmRDb2x1bW5Db3VudE1ldHJpY3MobXV0YXRpb25zKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGFydGl0aW9uc1BlckJhdGNoTWV0cmljcyhpbnQgdXBkYXRlZFBhcnRpdGlvbnMpCkBAIC02NDcsNyArNjQ5LDcgQEAKICAgICAgICAgcHVibGljIEJhdGNoU3RhdGVtZW50IHByZXBhcmUoQ2xpZW50U3RhdGUgc3RhdGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIExpc3Q8TW9kaWZpY2F0aW9uU3RhdGVtZW50PiBzdGF0ZW1lbnRzID0gbmV3IEFycmF5TGlzdDw+KHBhcnNlZFN0YXRlbWVudHMuc2l6ZSgpKTsKLSAgICAgICAgICAgIHBhcnNlZFN0YXRlbWVudHMuZm9yRWFjaChzIC0+IHN0YXRlbWVudHMuYWRkKHMucHJlcGFyZShiaW5kVmFyaWFibGVzKSkpOworICAgICAgICAgICAgcGFyc2VkU3RhdGVtZW50cy5mb3JFYWNoKHMgLT4gc3RhdGVtZW50cy5hZGQocy5wcmVwYXJlKHN0YXRlLCBiaW5kVmFyaWFibGVzKSkpOwogCiAgICAgICAgICAgICBBdHRyaWJ1dGVzIHByZXBBdHRycyA9IGF0dHJzLnByZXBhcmUoIltiYXRjaF0iLCAiW2JhdGNoXSIpOwogICAgICAgICAgICAgcHJlcEF0dHJzLmNvbGxlY3RNYXJrZXJTcGVjaWZpY2F0aW9uKGJpbmRWYXJpYWJsZXMpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL0RlbGV0ZVN0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL0RlbGV0ZVN0YXRlbWVudC5qYXZhCmluZGV4IGJlMDE0ODEuLmZmZjZkZDMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9EZWxldGVTdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvRGVsZXRlU3RhdGVtZW50LmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdCdWlsZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nU3R5bGU7CkBAIC0xNDAsNyArMTQxLDggQEAKIAogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgTW9kaWZpY2F0aW9uU3RhdGVtZW50IHByZXBhcmVJbnRlcm5hbChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICBwcm90ZWN0ZWQgTW9kaWZpY2F0aW9uU3RhdGVtZW50IHByZXBhcmVJbnRlcm5hbChDbGllbnRTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVTcGVjaWZpY2F0aW9ucyBiaW5kVmFyaWFibGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25zIGNvbmRpdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMpCkBAIC0xNjAsNyArMTYyLDggQEAKICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLmFkZChvcCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFN0YXRlbWVudFJlc3RyaWN0aW9ucyByZXN0cmljdGlvbnMgPSBuZXdSZXN0cmljdGlvbnMobWV0YWRhdGEsCisgICAgICAgICAgICBTdGF0ZW1lbnRSZXN0cmljdGlvbnMgcmVzdHJpY3Rpb25zID0gbmV3UmVzdHJpY3Rpb25zKHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZFZhcmlhYmxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVDbGF1c2UsCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvRGVzY3JpYmVTdGF0ZW1lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9EZXNjcmliZVN0YXRlbWVudC5qYXZhCmluZGV4IGIxZjU3NmUuLjk2YTAyNDcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9EZXNjcmliZVN0YXRlbWVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9EZXNjcmliZVN0YXRlbWVudC5qYXZhCkBAIC02NywxNyArNjcsMTcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0YgPSAiZGVzY3JpYmUiOwogCiAgICAgLyoqCi0gICAgICogVGhlIGNvbHVtbnMgcmV0dXJuZWQgYnkgdGhlIGRlc2NyaWJlIHF1ZXJpZXMgdGhhdCBvbmx5IGxpc3QgZWxlbWVudHMgbmFtZXMgKGUuZy4gREVTQ1JJQkUgS0VZU1BBQ0VTLCBERVNDUklCRSBUQUJMRVMuLi4pIAorICAgICAqIFRoZSBjb2x1bW5zIHJldHVybmVkIGJ5IHRoZSBkZXNjcmliZSBxdWVyaWVzIHRoYXQgb25seSBsaXN0IGVsZW1lbnRzIG5hbWVzIChlLmcuIERFU0NSSUJFIEtFWVNQQUNFUywgREVTQ1JJQkUgVEFCTEVTLi4uKQogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8Q29sdW1uU3BlY2lmaWNhdGlvbj4gTElTVF9NRVRBREFUQSA9IAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8Q29sdW1uU3BlY2lmaWNhdGlvbj4gTElTVF9NRVRBREFUQSA9CiAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKG5ldyBDb2x1bW5TcGVjaWZpY2F0aW9uKEtTLCBDRiwgbmV3IENvbHVtbklkZW50aWZpZXIoImtleXNwYWNlX25hbWUiLCB0cnVlKSwgVVRGOFR5cGUuaW5zdGFuY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29sdW1uU3BlY2lmaWNhdGlvbihLUywgQ0YsIG5ldyBDb2x1bW5JZGVudGlmaWVyKCJ0eXBlIiwgdHJ1ZSksIFVURjhUeXBlLmluc3RhbmNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbHVtblNwZWNpZmljYXRpb24oS1MsIENGLCBuZXcgQ29sdW1uSWRlbnRpZmllcigibmFtZSIsIHRydWUpLCBVVEY4VHlwZS5pbnN0YW5jZSkpOwogCiAgICAgLyoqCi0gICAgICogVGhlIGNvbHVtbnMgcmV0dXJuZWQgYnkgdGhlIGRlc2NyaWJlIHF1ZXJpZXMgdGhhdCByZXR1cm5zIHRoZSBDUkVBVEUgU1RBVEVNRU5UIGZvciB0aGUgZGlmZmVyZW50IGVsZW1lbnRzIChlLmcuIERFU0NSSUJFIEtFWVNQQUNFLCBERVNDUklCRSBUQUJMRSAuLi4pIAorICAgICAqIFRoZSBjb2x1bW5zIHJldHVybmVkIGJ5IHRoZSBkZXNjcmliZSBxdWVyaWVzIHRoYXQgcmV0dXJucyB0aGUgQ1JFQVRFIFNUQVRFTUVOVCBmb3IgdGhlIGRpZmZlcmVudCBlbGVtZW50cyAoZS5nLiBERVNDUklCRSBLRVlTUEFDRSwgREVTQ1JJQkUgVEFCTEUgLi4uKQogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8Q29sdW1uU3BlY2lmaWNhdGlvbj4gRUxFTUVOVF9NRVRBREFUQSA9IAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8Q29sdW1uU3BlY2lmaWNhdGlvbj4gRUxFTUVOVF9NRVRBREFUQSA9CiAgICAgICAgICAgICBJbW11dGFibGVMaXN0LjxDb2x1bW5TcGVjaWZpY2F0aW9uPmJ1aWxkZXIoKS5hZGRBbGwoTElTVF9NRVRBREFUQSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgQ29sdW1uU3BlY2lmaWNhdGlvbihLUywgQ0YsIG5ldyBDb2x1bW5JZGVudGlmaWVyKCJjcmVhdGVfc3RhdGVtZW50IiwgdHJ1ZSksIFVURjhUeXBlLmluc3RhbmNlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CkBAIC0zMDgsNyArMzA4LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIERlc2NyaWJlU3RhdGVtZW50PFNjaGVtYUVsZW1lbnQ+IGZ1bmN0aW9ucygpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IExpc3Rpbmcoa3MgLT4ga3MuZnVuY3Rpb25zLnVkZnMoKSk7CisgICAgICAgIHJldHVybiBuZXcgTGlzdGluZyhrcyAtPiBrcy51c2VyRnVuY3Rpb25zLnVkZnMoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zMTYsNyArMzE2LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIERlc2NyaWJlU3RhdGVtZW50PFNjaGVtYUVsZW1lbnQ+IGFnZ3JlZ2F0ZXMoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMaXN0aW5nKGtzIC0+IGtzLmZ1bmN0aW9ucy51ZGFzKCkpOworICAgICAgICByZXR1cm4gbmV3IExpc3Rpbmcoa3MgLT4ga3MudXNlckZ1bmN0aW9ucy51ZGFzKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMzg3LDcgKzM4Nyw3IEBACiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbGVtZW50IGV4dGVuZHMgRGVzY3JpYmVTdGF0ZW1lbnQ8U2NoZW1hRWxlbWVudD4KICAgICB7CiAgICAgICAgIC8qKgotICAgICAgICAgKiBUaGUga2V5c3BhY2UgbmFtZSAKKyAgICAgICAgICogVGhlIGtleXNwYWNlIG5hbWUKICAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGtleXNwYWNlOwogCkBAIC00NDUsOCArNDQ1LDggQEAKICAgICAgICAgaWYgKCFvbmx5S2V5c3BhY2UpCiAgICAgICAgIHsKICAgICAgICAgICAgIHMgPSBTdHJlYW0uY29uY2F0KHMsIGtzLnR5cGVzLnNvcnRlZFN0cmVhbSgpKTsKLSAgICAgICAgICAgIHMgPSBTdHJlYW0uY29uY2F0KHMsIGtzLmZ1bmN0aW9ucy51ZGZzKCkuc29ydGVkKFNjaGVtYUVsZW1lbnQuTkFNRV9DT01QQVJBVE9SKSk7Ci0gICAgICAgICAgICBzID0gU3RyZWFtLmNvbmNhdChzLCBrcy5mdW5jdGlvbnMudWRhcygpLnNvcnRlZChTY2hlbWFFbGVtZW50Lk5BTUVfQ09NUEFSQVRPUikpOworICAgICAgICAgICAgcyA9IFN0cmVhbS5jb25jYXQocywga3MudXNlckZ1bmN0aW9ucy51ZGZzKCkuc29ydGVkKFNjaGVtYUVsZW1lbnQuTkFNRV9DT01QQVJBVE9SKSk7CisgICAgICAgICAgICBzID0gU3RyZWFtLmNvbmNhdChzLCBrcy51c2VyRnVuY3Rpb25zLnVkYXMoKS5zb3J0ZWQoU2NoZW1hRWxlbWVudC5OQU1FX0NPTVBBUkFUT1IpKTsKICAgICAgICAgICAgIHMgPSBTdHJlYW0uY29uY2F0KHMsIGtzLnRhYmxlcy5zdHJlYW0oKS5zb3J0ZWQoU2NoZW1hRWxlbWVudC5OQU1FX0NPTVBBUkFUT1IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmxhdE1hcCh0bSAtPiBnZXRUYWJsZUVsZW1lbnRzKGtzLCB0bSkpKTsKICAgICAgICAgfQpAQCAtNTM0LDcgKzUzNCw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gbmV3IEVsZW1lbnQoa2V5c3BhY2UsIG5hbWUsIChrcywgbikgLT4gewogCi0gICAgICAgICAgICByZXR1cm4gY2hlY2tOb3RFbXB0eShrcy5mdW5jdGlvbnMuZ2V0VWRmcyhuZXcgRnVuY3Rpb25OYW1lKGtzLm5hbWUsIG4pKSwKKyAgICAgICAgICAgIHJldHVybiBjaGVja05vdEVtcHR5KGtzLnVzZXJGdW5jdGlvbnMuZ2V0VWRmcyhuZXcgRnVuY3Rpb25OYW1lKGtzLm5hbWUsIG4pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2VyIGRlZmluZWQgZnVuY3Rpb24gJyVzJyBub3QgZm91bmQgaW4gJyVzJyIsIG4sIGtzLm5hbWUpLnN0cmVhbSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydGVkKFNjaGVtYUVsZW1lbnQuTkFNRV9DT01QQVJBVE9SKTsKICAgICAgICAgfSk7CkBAIC01NDcsNyArNTQ3LDcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgRWxlbWVudChrZXlzcGFjZSwgbmFtZSwgKGtzLCBuKSAtPiB7CiAKLSAgICAgICAgICAgIHJldHVybiBjaGVja05vdEVtcHR5KGtzLmZ1bmN0aW9ucy5nZXRVZGFzKG5ldyBGdW5jdGlvbk5hbWUoa3MubmFtZSwgbikpLAorICAgICAgICAgICAgcmV0dXJuIGNoZWNrTm90RW1wdHkoa3MudXNlckZ1bmN0aW9ucy5nZXRVZGFzKG5ldyBGdW5jdGlvbk5hbWUoa3MubmFtZSwgbikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZXIgZGVmaW5lZCBhZ2dyZWdhdGUgJyVzJyBub3QgZm91bmQgaW4gJyVzJyIsIG4sIGtzLm5hbWUpLnN0cmVhbSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnRlZChTY2hlbWFFbGVtZW50Lk5BTUVfQ09NUEFSQVRPUik7CiAgICAgICAgIH0pOwpAQCAtNjgxLDcgKzY4MSw3IEBACiAgICAgICAgICAgICAgICAgbGlzdC5hZGQodHJpbUlmUHJlc2VudChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UGFydGl0aW9uZXJOYW1lKCksICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuIikpOwogICAgICAgICAgICAgICAgIGxpc3QuYWRkKHRyaW1JZlByZXNlbnQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldEVuZHBvaW50U25pdGNoKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLiIpKTsKLSAKKwogICAgICAgICAgICAgICAgIFN0cmluZyB1c2VLcyA9IHN0YXRlLmdldFJhd0tleXNwYWNlKCk7CiAgICAgICAgICAgICAgICAgaWYgKG11c3RSZXR1cm5zUmFuZ2VPd25lcnNoaXBzKHVzZUtzKSkKICAgICAgICAgICAgICAgICB7CkBAIC03MjEsNyArNzIxLDcgQEAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHJvdGVjdGVkIExpc3Q8Qnl0ZUJ1ZmZlcj4gdG9Sb3coTGlzdDxPYmplY3Q+IGVsZW1lbnRzLCBib29sZWFuIHdpdGhJbnRlcm5hbHMpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5CdWlsZGVyPEJ5dGVCdWZmZXI+IGJ1aWxkZXIgPSBJbW11dGFibGVMaXN0LmJ1aWxkZXIoKTsgCisgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5CdWlsZGVyPEJ5dGVCdWZmZXI+IGJ1aWxkZXIgPSBJbW11dGFibGVMaXN0LmJ1aWxkZXIoKTsKIAogICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgoU3RyaW5nKSBlbGVtZW50cy5nZXQoQ0xVU1RFUl9OQU1FX0lOREVYKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGOFR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKChTdHJpbmcpIGVsZW1lbnRzLmdldChQQVJUSVRJT05FUl9OQU1FX0lOREVYKSksCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvTW9kaWZpY2F0aW9uU3RhdGVtZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvTW9kaWZpY2F0aW9uU3RhdGVtZW50LmphdmEKaW5kZXggYWIzNmVjOS4uMGNmNjc3MSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL01vZGlmaWNhdGlvblN0YXRlbWVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9Nb2RpZmljYXRpb25TdGF0ZW1lbnQuamF2YQpAQCAtMzMsNiArMzMsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYUxheW91dDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5WaWV3TWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy4qOwpAQCAtNTEsNiArNTIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlldy5WaWV3OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudFJlcXVlc3RTaXplTWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuUXVlcnlTdGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VQcm94eTsKQEAgLTMwMCw2ICszMDIsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlVGltZXN0YW1wKFF1ZXJ5U3RhdGUgcXVlcnlTdGF0ZSwgUXVlcnlPcHRpb25zIG9wdGlvbnMpCisgICAgeworICAgICAgICBpZiAoIWlzVGltZXN0YW1wU2V0KCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgbG9uZyB0cyA9IGF0dHJzLmdldFRpbWVzdGFtcChvcHRpb25zLmdldFRpbWVzdGFtcChxdWVyeVN0YXRlKSwgb3B0aW9ucyk7CisgICAgICAgIEd1YXJkcmFpbHMubWF4aW11bUFsbG93YWJsZVRpbWVzdGFtcC5ndWFyZCh0cywgdGFibGUoKSwgZmFsc2UsIHF1ZXJ5U3RhdGUuZ2V0Q2xpZW50U3RhdGUoKSk7CisgICAgICAgIEd1YXJkcmFpbHMubWluaW11bUFsbG93YWJsZVRpbWVzdGFtcC5ndWFyZCh0cywgdGFibGUoKSwgZmFsc2UsIHF1ZXJ5U3RhdGUuZ2V0Q2xpZW50U3RhdGUoKSk7CisgICAgfQorCiAgICAgcHVibGljIFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIHVwZGF0ZWRDb2x1bW5zKCkKICAgICB7CiAgICAgICAgIHJldHVybiB1cGRhdGVkQ29sdW1uczsKQEAgLTUwNCw2ICs1MTYsNyBAQAogICAgICAgICAgICAgY2wudmFsaWRhdGVGb3JXcml0ZSgpOwogCiAgICAgICAgIHZhbGlkYXRlRGlza1VzYWdlKG9wdGlvbnMsIHF1ZXJ5U3RhdGUuZ2V0Q2xpZW50U3RhdGUoKSk7CisgICAgICAgIHZhbGlkYXRlVGltZXN0YW1wKHF1ZXJ5U3RhdGUsIG9wdGlvbnMpOwogCiAgICAgICAgIExpc3Q8PyBleHRlbmRzIElNdXRhdGlvbj4gbXV0YXRpb25zID0KICAgICAgICAgICAgIGdldE11dGF0aW9ucyhxdWVyeVN0YXRlLmdldENsaWVudFN0YXRlKCksCkBAIC01MTMsOCArNTI2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXROb3dJblNlY29uZHMocXVlcnlTdGF0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlTdGFydE5hbm9UaW1lKTsKICAgICAgICAgaWYgKCFtdXRhdGlvbnMuaXNFbXB0eSgpKQorICAgICAgICB7CiAgICAgICAgICAgICBTdG9yYWdlUHJveHkubXV0YXRlV2l0aFRyaWdnZXJzKG11dGF0aW9ucywgY2wsIGZhbHNlLCBxdWVyeVN0YXJ0TmFub1RpbWUpOwogCisgICAgICAgICAgICBpZiAoIVNjaGVtYUNvbnN0YW50cy5pc1N5c3RlbUtleXNwYWNlKG1ldGFkYXRhLmtleXNwYWNlKSkKKyAgICAgICAgICAgICAgICBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MucmVjb3JkUm93QW5kQ29sdW1uQ291bnRNZXRyaWNzKG11dGF0aW9ucyk7CisgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKQEAgLTY1Miw3ICs2NzAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgU2VsZWN0b3JzIHNlbGVjdG9ycyA9IHNlbGVjdGlvbi5uZXdTZWxlY3RvcnMob3B0aW9ucyk7Ci0gICAgICAgIFJlc3VsdFNldEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBSZXN1bHRTZXRCdWlsZGVyKHNlbGVjdGlvbi5nZXRSZXN1bHRNZXRhZGF0YSgpLCBzZWxlY3RvcnMpOworICAgICAgICBSZXN1bHRTZXRCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUmVzdWx0U2V0QnVpbGRlcihzZWxlY3Rpb24uZ2V0UmVzdWx0TWV0YWRhdGEoKSwgc2VsZWN0b3JzLCBmYWxzZSk7CiAgICAgICAgIFNlbGVjdFN0YXRlbWVudC5mb3JTZWxlY3Rpb24obWV0YWRhdGEsIHNlbGVjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgLnByb2Nlc3NQYXJ0aXRpb24ocGFydGl0aW9uLCBvcHRpb25zLCBidWlsZGVyLCBub3dJblNlY29uZHMpOwogCkBAIC05NDAsMTAgKzk1OCwxMCBAQAogCiAgICAgICAgIHB1YmxpYyBNb2RpZmljYXRpb25TdGF0ZW1lbnQgcHJlcGFyZShDbGllbnRTdGF0ZSBzdGF0ZSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHByZXBhcmUoYmluZFZhcmlhYmxlcyk7CisgICAgICAgICAgICByZXR1cm4gcHJlcGFyZShzdGF0ZSwgYmluZFZhcmlhYmxlcyk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgTW9kaWZpY2F0aW9uU3RhdGVtZW50IHByZXBhcmUoVmFyaWFibGVTcGVjaWZpY2F0aW9ucyBiaW5kVmFyaWFibGVzKQorICAgICAgICBwdWJsaWMgTW9kaWZpY2F0aW9uU3RhdGVtZW50IHByZXBhcmUoQ2xpZW50U3RhdGUgc3RhdGUsIFZhcmlhYmxlU3BlY2lmaWNhdGlvbnMgYmluZFZhcmlhYmxlcykKICAgICAgICAgewogICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9IFNjaGVtYS5pbnN0YW5jZS52YWxpZGF0ZVRhYmxlKGtleXNwYWNlKCksIG5hbWUoKSk7CiAKQEAgLTk1Miw3ICs5NzAsNyBAQAogCiAgICAgICAgICAgICBDb25kaXRpb25zIHByZXBhcmVkQ29uZGl0aW9ucyA9IHByZXBhcmVDb25kaXRpb25zKG1ldGFkYXRhLCBiaW5kVmFyaWFibGVzKTsKIAotICAgICAgICAgICAgcmV0dXJuIHByZXBhcmVJbnRlcm5hbChtZXRhZGF0YSwgYmluZFZhcmlhYmxlcywgcHJlcGFyZWRDb25kaXRpb25zLCBwcmVwYXJlZEF0dHJpYnV0ZXMpOworICAgICAgICAgICAgcmV0dXJuIHByZXBhcmVJbnRlcm5hbChzdGF0ZSwgbWV0YWRhdGEsIGJpbmRWYXJpYWJsZXMsIHByZXBhcmVkQ29uZGl0aW9ucywgcHJlcGFyZWRBdHRyaWJ1dGVzKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMTAxMSw3ICsxMDI5LDggQEAKICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CiAgICAgICAgIH0KIAotICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTW9kaWZpY2F0aW9uU3RhdGVtZW50IHByZXBhcmVJbnRlcm5hbChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTW9kaWZpY2F0aW9uU3RhdGVtZW50IHByZXBhcmVJbnRlcm5hbChDbGllbnRTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVTcGVjaWZpY2F0aW9ucyBiaW5kVmFyaWFibGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25zIGNvbmRpdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMpOwpAQCAtMTAyNiw3ICsxMDQ1LDggQEAKICAgICAgICAgICogQHBhcmFtIGNvbmRpdGlvbnMgdGhlIGNvbmRpdGlvbnMKICAgICAgICAgICogQHJldHVybiB0aGUgcmVzdHJpY3Rpb25zCiAgICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgU3RhdGVtZW50UmVzdHJpY3Rpb25zIG5ld1Jlc3RyaWN0aW9ucyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICBwcm90ZWN0ZWQgU3RhdGVtZW50UmVzdHJpY3Rpb25zIG5ld1Jlc3RyaWN0aW9ucyhDbGllbnRTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVTcGVjaWZpY2F0aW9ucyBib3VuZE5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25zIG9wZXJhdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoZXJlQ2xhdXNlIHdoZXJlLApAQCAtMTAzNiw3ICsxMDU2LDcgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24oQ1VTVE9NX0VYUFJFU1NJT05TX05PVF9BTExPV0VEKTsKIAogICAgICAgICAgICAgYm9vbGVhbiBhcHBseU9ubHlUb1N0YXRpY0NvbHVtbnMgPSBhcHBsaWVzT25seVRvU3RhdGljQ29sdW1ucyhvcGVyYXRpb25zLCBjb25kaXRpb25zKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdGVtZW50UmVzdHJpY3Rpb25zKHR5cGUsIG1ldGFkYXRhLCB3aGVyZSwgYm91bmROYW1lcywgYXBwbHlPbmx5VG9TdGF0aWNDb2x1bW5zLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdGF0ZW1lbnRSZXN0cmljdGlvbnMoc3RhdGUsIHR5cGUsIG1ldGFkYXRhLCB3aGVyZSwgYm91bmROYW1lcywgYXBwbHlPbmx5VG9TdGF0aWNDb2x1bW5zLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIExpc3Q8UGFpcjxDb2x1bW5JZGVudGlmaWVyLCBDb2x1bW5Db25kaXRpb24uUmF3Pj4gZ2V0Q29uZGl0aW9ucygpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvUGVybWlzc2lvbnNNYW5hZ2VtZW50U3RhdGVtZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvUGVybWlzc2lvbnNNYW5hZ2VtZW50U3RhdGVtZW50LmphdmEKaW5kZXggYWE3ZTg1Yi4uZTgwOWEyNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL1Blcm1pc3Npb25zTWFuYWdlbWVudFN0YXRlbWVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9QZXJtaXNzaW9uc01hbmFnZW1lbnRTdGF0ZW1lbnQuamF2YQpAQCAtMjEsNyArMjEsNiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlJvbGVOYW1lOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5SZXF1ZXN0VmFsaWRhdGlvbkV4Y2VwdGlvbjsKQEAgLTU1LDEzICs1NCw2IEBACiAgICAgICAgIC8vIGNhbGxlZCBib3RoIGhlcmUgYW5kIGluIGF1dGhvcml6ZSgpLCBhcyBpbiBzb21lIGNhc2VzIHdlIGRvIG5vdCBjYWxsIHRoZSBsYXR0ZXIuCiAgICAgICAgIHJlc291cmNlID0gbWF5YmVDb3JyZWN0UmVzb3VyY2UocmVzb3VyY2UsIHN0YXRlKTsKIAotICAgICAgICAvLyBhbHRlcmluZyBwZXJtaXNzaW9ucyBvbiBidWlsdGluIGZ1bmN0aW9ucyBpcyBub3Qgc3VwcG9ydGVkCi0gICAgICAgIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIEZ1bmN0aW9uUmVzb3VyY2UKLSAgICAgICAgICAgICYmIFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRS5lcXVhbHMoKChGdW5jdGlvblJlc291cmNlKXJlc291cmNlKS5nZXRLZXlzcGFjZSgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKCJBbHRlcmluZyBwZXJtaXNzaW9ucyBvbiBidWlsdGluIGZ1bmN0aW9ucyBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIH0KLQogICAgICAgICBpZiAoIXJlc291cmNlLmV4aXN0cygpKQogICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlJlc291cmNlICVzIGRvZXNuJ3QgZXhpc3QiLCByZXNvdXJjZSkpOwogICAgIH0KQEAgLTc4LDcgKzcwLDcgQEAKICAgICAgICAgZm9yIChQZXJtaXNzaW9uIHAgOiBwZXJtaXNzaW9ucykKICAgICAgICAgICAgIHN0YXRlLmVuc3VyZVBlcm1pc3Npb24ocCwgcmVzb3VyY2UpOwogICAgIH0KLSAgICAKKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9Qcm9wZXJ0eURlZmluaXRpb25zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvUHJvcGVydHlEZWZpbml0aW9ucy5qYXZhCmluZGV4IGI2MTEyZmEuLjY1ZWM4ZmMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9Qcm9wZXJ0eURlZmluaXRpb25zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL1Byb3BlcnR5RGVmaW5pdGlvbnMuamF2YQpAQCAtMTcsNyArMTcsOSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50czsKIAotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CkBAIC0yNSw2ICsyNyw4IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlN5bnRheEV4Y2VwdGlvbjsKIAoraW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKKwogcHVibGljIGNsYXNzIFByb3BlcnR5RGVmaW5pdGlvbnMKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFBPU0lUSVZFX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIigxfHRydWV8eWVzKSIpOwpAQCAtMzIsMTggKzM2LDE4IEBACiAgICAgCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUHJvcGVydHlEZWZpbml0aW9ucy5jbGFzcyk7CiAKLSAgICBwcm90ZWN0ZWQgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgcHJvdGVjdGVkIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgIHB1YmxpYyB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBTeW50YXhFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGlmIChwcm9wZXJ0aWVzLnB1dChuYW1lLCB2YWx1ZSkgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiTXVsdGlwbGUgZGVmaW5pdGlvbiBmb3IgcHJvcGVydHkgJyVzJyIsIG5hbWUpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oZm9ybWF0KCJNdWx0aXBsZSBkZWZpbml0aW9ucyBmb3IgcHJvcGVydHkgJyVzJyIsIG5hbWUpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZSkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgaWYgKHByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKSAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJNdWx0aXBsZSBkZWZpbml0aW9uIGZvciBwcm9wZXJ0eSAnJXMnIiwgbmFtZSkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEV4Y2VwdGlvbihmb3JtYXQoIk11bHRpcGxlIGRlZmluaXRpb25zIGZvciBwcm9wZXJ0eSAnJXMnIiwgbmFtZSkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKFNldDxTdHJpbmc+IGtleXdvcmRzLCBTZXQ8U3RyaW5nPiBvYnNvbGV0ZSkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbgpAQCAtNTYsNyArNjAsNyBAQAogICAgICAgICAgICAgaWYgKG9ic29sZXRlLmNvbnRhaW5zKG5hbWUpKQogICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJJZ25vcmluZyBvYnNvbGV0ZSBwcm9wZXJ0eSB7fSIsIG5hbWUpOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVW5rbm93biBwcm9wZXJ0eSAnJXMnIiwgbmFtZSkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oZm9ybWF0KCJVbmtub3duIHByb3BlcnR5ICclcyciLCBuYW1lKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTczLDEzICs3NywxOCBAQAogICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShuYW1lKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFNpbXBsZShTdHJpbmcgbmFtZSkgdGhyb3dzIFN5bnRheEV4Y2VwdGlvbgorICAgIHB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnR5KFN0cmluZyBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuY29udGFpbnNLZXkobmFtZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUpIHRocm93cyBTeW50YXhFeGNlcHRpb24KICAgICB7CiAgICAgICAgIE9iamVjdCB2YWwgPSBwcm9wZXJ0aWVzLmdldChuYW1lKTsKICAgICAgICAgaWYgKHZhbCA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIGlmICghKHZhbCBpbnN0YW5jZW9mIFN0cmluZykpCi0gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgdmFsdWUgZm9yIHByb3BlcnR5ICclcycuIEl0IHNob3VsZCBiZSBhIHN0cmluZyIsIG5hbWUpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oZm9ybWF0KCJJbnZhbGlkIHZhbHVlIGZvciBwcm9wZXJ0eSAnJXMnLiBJdCBzaG91bGQgYmUgYSBzdHJpbmciLCBuYW1lKSk7CiAgICAgICAgIHJldHVybiAoU3RyaW5nKXZhbDsKICAgICB9CiAKQEAgLTg5LDEzICs5OCwxNCBAQAogICAgICAgICBpZiAodmFsID09IG51bGwpCiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgaWYgKCEodmFsIGluc3RhbmNlb2YgTWFwKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCB2YWx1ZSBmb3IgcHJvcGVydHkgJyVzJy4gSXQgc2hvdWxkIGJlIGEgbWFwLiIsIG5hbWUpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oZm9ybWF0KCJJbnZhbGlkIHZhbHVlIGZvciBwcm9wZXJ0eSAnJXMnLiBJdCBzaG91bGQgYmUgYSBtYXAuIiwgbmFtZSkpOwogICAgICAgICByZXR1cm4gKE1hcDxTdHJpbmcsIFN0cmluZz4pdmFsOwogICAgIH0KIAotICAgIHB1YmxpYyBCb29sZWFuIGhhc1Byb3BlcnR5KFN0cmluZyBuYW1lKQorICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGtleSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHRocm93cyBTeW50YXhFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KG5hbWUpOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRTdHJpbmcoa2V5KTsKKyAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyBwYXJzZUJvb2xlYW4oa2V5LCB2YWx1ZSkgOiBkZWZhdWx0VmFsdWU7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHBhcnNlQm9vbGVhbihTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHRocm93cyBTeW50YXhFeGNlcHRpb24KQEAgLTExMCw2MyArMTIwLDUxIEBACiAgICAgICAgIGVsc2UgaWYgKE5FR0FUSVZFX1BBVFRFUk4ubWF0Y2hlcihsb3dlckNhc2VkVmFsdWUpLm1hdGNoZXMoKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgYm9vbGVhbiB2YWx1ZSAlcyBmb3IgJyVzJy4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9zaXRpdmUgdmFsdWVzIGNhbiBiZSAnMScsICd0cnVlJyBvciAneWVzJy4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVnYXRpdmUgdmFsdWVzIGNhbiBiZSAnMCcsICdmYWxzZScgb3IgJ25vJy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGtleSkpOworICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKGZvcm1hdCgiSW52YWxpZCBib29sZWFuIHZhbHVlICVzIGZvciAnJXMnLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvc2l0aXZlIHZhbHVlcyBjYW4gYmUgJzEnLCAndHJ1ZScgb3IgJ3llcycuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVnYXRpdmUgdmFsdWVzIGNhbiBiZSAnMCcsICdmYWxzZScgb3IgJ25vJy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwga2V5KSk7CiAgICAgfQogCi0gICAgLy8gUmV0dXJuIGEgcHJvcGVydHkgdmFsdWUsIHR5cGVkIGFzIGEgQm9vbGVhbgotICAgIHB1YmxpYyBCb29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIGtleSwgQm9vbGVhbiBkZWZhdWx0VmFsdWUpIHRocm93cyBTeW50YXhFeGNlcHRpb24KKyAgICBwdWJsaWMgaW50IGdldEludChTdHJpbmcga2V5LCBpbnQgZGVmYXVsdFZhbHVlKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uCiAgICAgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRTaW1wbGUoa2V5KTsKLSAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IGRlZmF1bHRWYWx1ZSA6IHBhcnNlQm9vbGVhbihrZXksIHZhbHVlKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nKGtleSk7CisgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gcGFyc2VJbnQoa2V5LCB2YWx1ZSkgOiBkZWZhdWx0VmFsdWU7CiAgICAgfQogCi0gICAgLy8gUmV0dXJuIGEgcHJvcGVydHkgdmFsdWUsIHR5cGVkIGFzIGEgZG91YmxlCisgICAgcHVibGljIHN0YXRpYyBpbnQgcGFyc2VJbnQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU3ludGF4RXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAobnVsbCA9PSB2YWx1ZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZhbHVlIGFyZ3VtZW50IGNhbid0IGJlIG51bGwiKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEV4Y2VwdGlvbihmb3JtYXQoIkludmFsaWQgaW50ZWdlciB2YWx1ZSAlcyBmb3IgJyVzJyIsIHZhbHVlLCBrZXkpKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBrZXksIGRvdWJsZSBkZWZhdWx0VmFsdWUpIHRocm93cyBTeW50YXhFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldFNpbXBsZShrZXkpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBEb3VibGUucGFyc2VEb3VibGUodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBkb3VibGUgdmFsdWUgJXMgZm9yICclcyciLCB2YWx1ZSwga2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nKGtleSk7CisgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gcGFyc2VEb3VibGUoa2V5LCB2YWx1ZSkgOiBkZWZhdWx0VmFsdWU7CiAgICAgfQogCi0gICAgLy8gUmV0dXJuIGEgcHJvcGVydHkgdmFsdWUsIHR5cGVkIGFzIGFuIEludGVnZXIKLSAgICBwdWJsaWMgSW50ZWdlciBnZXRJbnQoU3RyaW5nIGtleSwgSW50ZWdlciBkZWZhdWx0VmFsdWUpIHRocm93cyBTeW50YXhFeGNlcHRpb24KKyAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBwYXJzZURvdWJsZShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHRocm93cyBTeW50YXhFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldFNpbXBsZShrZXkpOwotICAgICAgICByZXR1cm4gdG9JbnQoa2V5LCB2YWx1ZSwgZGVmYXVsdFZhbHVlKTsKLSAgICB9CisgICAgICAgIGlmIChudWxsID09IHZhbHVlKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidmFsdWUgYXJndW1lbnQgY2FuJ3QgYmUgbnVsbCIpOwogCi0gICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIHRvSW50KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSwgSW50ZWdlciBkZWZhdWx0VmFsdWUpIHRocm93cyBTeW50YXhFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgIHJldHVybiBEb3VibGUucGFyc2VEb3VibGUodmFsdWUpOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UKKyAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgaW50ZWdlciB2YWx1ZSAlcyBmb3IgJyVzJyIsIHZhbHVlLCBrZXkpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oZm9ybWF0KCJJbnZhbGlkIGRvdWJsZSB2YWx1ZSAlcyBmb3IgJyVzJyIsIHZhbHVlLCBrZXkpKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9TZWxlY3RTdGF0ZW1lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9TZWxlY3RTdGF0ZW1lbnQuamF2YQppbmRleCA4YTQ4OTM1Li40YzQzY2Y4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvU2VsZWN0U3RhdGVtZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL1NlbGVjdFN0YXRlbWVudC5qYXZhCkBAIC0yMiw2ICsyMiw4IEBACiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50LlRocmVhZFNhZmU7CisKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk1vcmVPYmplY3RzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOwpAQCAtNTMsMTcgKzU1LDE1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuYWdncmVnYXRpb24uQWdncmVnYXRpb25TcGVjaWZpY2F0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmFnZ3JlZ2F0aW9uLkdyb3VwTWFrZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Db2xsZWN0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkNvbXBvc2l0ZVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Vc2VyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ29tcGxleENvbHVtbkRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aWV3LlZpZXc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudFJlcXVlc3RTaXplTWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5JbmRleFJlZ2lzdHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKQEAgLTgyLDYgKzgyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5Ub1N0cmluZ0J1aWxkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuVG9TdHJpbmdTdHlsZTsKIAoraW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLlJlcXVlc3RWYWxpZGF0aW9ucy5jaGVja0ZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuUmVxdWVzdFZhbGlkYXRpb25zLmNoZWNrTm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLlJlcXVlc3RWYWxpZGF0aW9ucy5jaGVja051bGw7CkBAIC05OCw3ICs5OSwxMCBAQAogICogbWFueSBvZiB0aGVzZSBhcmUgbWFkZSBhY2Nlc3NpYmxlIGZvciB0aGUgYmVuZWZpdCBvZiBjdXN0b20KICAqIFF1ZXJ5SGFuZGxlciBpbXBsZW1lbnRhdGlvbnMsIHNvIGJlZm9yZSByZWR1Y2luZyB0aGVpciBhY2Nlc3NpYmlsaXR5CiAgKiBkdWUgY29uc2lkZXJhdGlvbiBzaG91bGQgYmUgZ2l2ZW4uCisgKgorICogTm90ZSB0aGF0IHNlbGVjdCBzdGF0ZW1lbnRzIGNhbiBiZSBhY2Nlc3NlZCBieSBtdWx0aXBsZSB0aHJlYWRzLCBzbyB3ZSBjYW5ub3QgcmVseSBvbiBtdXRhYmxlIGF0dHJpYnV0ZXMuCiAgKi8KK0BUaHJlYWRTYWZlCiBwdWJsaWMgY2xhc3MgU2VsZWN0U3RhdGVtZW50IGltcGxlbWVudHMgQ1FMU3RhdGVtZW50LlNpbmdsZUtleXNwYWNlQ3FsU3RhdGVtZW50CiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNlbGVjdFN0YXRlbWVudC5jbGFzcyk7CkBAIC0yMzgsNiArMjQyLDIxIEBACiAKICAgICAgICAgZm9yIChGdW5jdGlvbiBmdW5jdGlvbiA6IGdldEZ1bmN0aW9ucygpKQogICAgICAgICAgICAgc3RhdGUuZW5zdXJlUGVybWlzc2lvbihQZXJtaXNzaW9uLkVYRUNVVEUsIGZ1bmN0aW9uKTsKKworICAgICAgICBpZiAoIXN0YXRlLmhhc1RhYmxlUGVybWlzc2lvbih0YWJsZSwgUGVybWlzc2lvbi5VTk1BU0spICYmCisgICAgICAgICAgICAhc3RhdGUuaGFzVGFibGVQZXJtaXNzaW9uKHRhYmxlLCBQZXJtaXNzaW9uLlNFTEVDVF9NQVNLRUQpKQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0PENvbHVtbk1ldGFkYXRhPiBxdWVyaWVkTWFza2VkQ29sdW1ucyA9IHRhYmxlLmNvbHVtbnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQ29sdW1uTWV0YWRhdGE6OmlzTWFza2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIocmVzdHJpY3Rpb25zOjppc1Jlc3RyaWN0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKyAgICAgICAgICAgIGlmICghcXVlcmllZE1hc2tlZENvbHVtbnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmF1dGhvcml6ZWRFeGNlcHRpb24oZm9ybWF0KCJVc2VyICVzIGhhcyBubyBVTk1BU0sgbm9yIFNFTEVDVF9NQVNLRUQgcGVybWlzc2lvbiBvbiB0YWJsZSAlcy4lcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBxdWVyeSBtYXNrZWQgY29sdW1ucyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZ2V0VXNlcigpLmdldE5hbWUoKSwga2V5c3BhY2UoKSwgdGFibGUoKSwgcXVlcmllZE1hc2tlZENvbHVtbnMpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKENsaWVudFN0YXRlIHN0YXRlKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KQEAgLTI1OCw2ICsyNzcsNyBAQAogICAgICAgICBpbnQgdXNlckxpbWl0ID0gZ2V0TGltaXQob3B0aW9ucyk7CiAgICAgICAgIGludCB1c2VyUGVyUGFydGl0aW9uTGltaXQgPSBnZXRQZXJQYXJ0aXRpb25MaW1pdChvcHRpb25zKTsKICAgICAgICAgaW50IHBhZ2VTaXplID0gb3B0aW9ucy5nZXRQYWdlU2l6ZSgpOworICAgICAgICBib29sZWFuIHVubWFzayA9ICF0YWJsZS5oYXNNYXNrZWRDb2x1bW5zKCkgfHwgc3RhdGUuZ2V0Q2xpZW50U3RhdGUoKS5oYXNUYWJsZVBlcm1pc3Npb24odGFibGUsIFBlcm1pc3Npb24uVU5NQVNLKTsKIAogICAgICAgICBTZWxlY3RvcnMgc2VsZWN0b3JzID0gc2VsZWN0aW9uLm5ld1NlbGVjdG9ycyhvcHRpb25zKTsKICAgICAgICAgQWdncmVnYXRpb25TcGVjaWZpY2F0aW9uIGFnZ3JlZ2F0aW9uU3BlYyA9IGdldEFnZ3JlZ2F0aW9uU3BlYyhvcHRpb25zKTsKQEAgLTI2NiwyMSArMjg2LDMxIEBACiAKICAgICAgICAgaWYgKG9wdGlvbnMuaXNSZWFkVGhyZXNob2xkc0VuYWJsZWQoKSkKICAgICAgICAgICAgIHF1ZXJ5LnRyYWNrV2FybmluZ3MoKTsKKyAgICAgICAgUmVzdWx0TWVzc2FnZS5Sb3dzIHJvd3M7CiAKICAgICAgICAgaWYgKGFnZ3JlZ2F0aW9uU3BlYyA9PSBudWxsICYmIChwYWdlU2l6ZSA8PSAwIHx8IChxdWVyeS5saW1pdHMoKS5jb3VudCgpIDw9IHBhZ2VTaXplKSkpCi0gICAgICAgICAgICByZXR1cm4gZXhlY3V0ZShxdWVyeSwgb3B0aW9ucywgc3RhdGUuZ2V0Q2xpZW50U3RhdGUoKSwgc2VsZWN0b3JzLCBub3dJblNlYywgdXNlckxpbWl0LCBudWxsLCBxdWVyeVN0YXJ0TmFub1RpbWUpOworICAgICAgICB7CisgICAgICAgICAgICByb3dzID0gZXhlY3V0ZShxdWVyeSwgb3B0aW9ucywgc3RhdGUuZ2V0Q2xpZW50U3RhdGUoKSwgc2VsZWN0b3JzLCBub3dJblNlYywgdXNlckxpbWl0LCBudWxsLCBxdWVyeVN0YXJ0TmFub1RpbWUsIHVubWFzayk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBRdWVyeVBhZ2VyIHBhZ2VyID0gZ2V0UGFnZXIocXVlcnksIG9wdGlvbnMpOwogCi0gICAgICAgIFF1ZXJ5UGFnZXIgcGFnZXIgPSBnZXRQYWdlcihxdWVyeSwgb3B0aW9ucyk7CisgICAgICAgICAgICByb3dzID0gZXhlY3V0ZShzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VyLmZvckRpc3RyaWJ1dGVkUXVlcnkocGFnZXIsIGNsLCBzdGF0ZS5nZXRDbGllbnRTdGF0ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd0luU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRpb25TcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlTdGFydE5hbm9UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5tYXNrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVNjaGVtYUNvbnN0YW50cy5pc1N5c3RlbUtleXNwYWNlKHRhYmxlLmtleXNwYWNlKSkKKyAgICAgICAgICAgIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy5yZWNvcmRSZWFkUmVzcG9uc2VNZXRyaWNzKHJvd3MsIHJlc3RyaWN0aW9ucywgc2VsZWN0aW9uKTsKIAotICAgICAgICByZXR1cm4gZXhlY3V0ZShzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgUGFnZXIuZm9yRGlzdHJpYnV0ZWRRdWVyeShwYWdlciwgY2wsIHN0YXRlLmdldENsaWVudFN0YXRlKCkpLAotICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplLAotICAgICAgICAgICAgICAgICAgICAgICBub3dJblNlYywKLSAgICAgICAgICAgICAgICAgICAgICAgdXNlckxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGlvblNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnROYW5vVGltZSk7CisgICAgICAgIHJldHVybiByb3dzOwogICAgIH0KIAogCkBAIC0zMjgsMTEgKzM1OCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vd0luU2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZXJMaW1pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbiBhZ2dyZWdhdGlvblNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHF1ZXJ5U3RhcnROYW5vVGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcXVlcnlTdGFydE5hbm9UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1bm1hc2spCiAgICAgewogICAgICAgICB0cnkgKFBhcnRpdGlvbkl0ZXJhdG9yIGRhdGEgPSBxdWVyeS5leGVjdXRlKG9wdGlvbnMuZ2V0Q29uc2lzdGVuY3koKSwgc3RhdGUsIHF1ZXJ5U3RhcnROYW5vVGltZSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBwcm9jZXNzUmVzdWx0cyhkYXRhLCBvcHRpb25zLCBzZWxlY3RvcnMsIG5vd0luU2VjLCB1c2VyTGltaXQsIGFnZ3JlZ2F0aW9uU3BlYyk7CisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1Jlc3VsdHMoZGF0YSwgb3B0aW9ucywgc2VsZWN0b3JzLCBub3dJblNlYywgdXNlckxpbWl0LCBhZ2dyZWdhdGlvblNwZWMsIHVubWFzayk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQxNyw3ICs0NDgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vd0luU2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZXJMaW1pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbiBhZ2dyZWdhdGlvblNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHF1ZXJ5U3RhcnROYW5vVGltZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcXVlcnlTdGFydE5hbm9UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1bm1hc2spCiAgICAgewogICAgICAgICBHdWFyZHJhaWxzLnBhZ2VTaXplLmd1YXJkKHBhZ2VTaXplLCB0YWJsZSgpLCBmYWxzZSwgc3RhdGUuZ2V0Q2xpZW50U3RhdGUoKSk7CiAKQEAgLTQ0Niw3ICs0NzgsNyBAQAogICAgICAgICBSZXN1bHRNZXNzYWdlLlJvd3MgbXNnOwogICAgICAgICB0cnkgKFBhcnRpdGlvbkl0ZXJhdG9yIHBhZ2UgPSBwYWdlci5mZXRjaFBhZ2UocGFnZVNpemUsIHF1ZXJ5U3RhcnROYW5vVGltZSkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG1zZyA9IHByb2Nlc3NSZXN1bHRzKHBhZ2UsIG9wdGlvbnMsIHNlbGVjdG9ycywgbm93SW5TZWMsIHVzZXJMaW1pdCwgYWdncmVnYXRpb25TcGVjKTsKKyAgICAgICAgICAgIG1zZyA9IHByb2Nlc3NSZXN1bHRzKHBhZ2UsIG9wdGlvbnMsIHNlbGVjdG9ycywgbm93SW5TZWMsIHVzZXJMaW1pdCwgYWdncmVnYXRpb25TcGVjLCB1bm1hc2spOwogICAgICAgICB9CiAKICAgICAgICAgLy8gUGxlYXNlIG5vdGUgdGhhdCB0aGUgaXNFeGhhdXN0ZWQgc3RhdGUgb2YgdGhlIHBhZ2VyIG9ubHkgZ2V0cyB1cGRhdGVkIHdoZW4gd2UndmUgY2xvc2VkIHRoZSBwYWdlLCBzbyB0aGlzCkBAIC00NjgsOSArNTAwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3JzIHNlbGVjdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm93SW5TZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZXJMaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2dyZWdhdGlvblNwZWNpZmljYXRpb24gYWdncmVnYXRpb25TcGVjKSB0aHJvd3MgUmVxdWVzdFZhbGlkYXRpb25FeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2dyZWdhdGlvblNwZWNpZmljYXRpb24gYWdncmVnYXRpb25TcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5tYXNrKSB0aHJvd3MgUmVxdWVzdFZhbGlkYXRpb25FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFJlc3VsdFNldCByc2V0ID0gcHJvY2VzcyhwYXJ0aXRpb25zLCBvcHRpb25zLCBzZWxlY3RvcnMsIG5vd0luU2VjLCB1c2VyTGltaXQsIGFnZ3JlZ2F0aW9uU3BlYyk7CisgICAgICAgIFJlc3VsdFNldCByc2V0ID0gcHJvY2VzcyhwYXJ0aXRpb25zLCBvcHRpb25zLCBzZWxlY3RvcnMsIG5vd0luU2VjLCB1c2VyTGltaXQsIGFnZ3JlZ2F0aW9uU3BlYywgdW5tYXNrKTsKICAgICAgICAgcmV0dXJuIG5ldyBSZXN1bHRNZXNzYWdlLlJvd3MocnNldCk7CiAgICAgfQogCkBAIC00ODcsNiArNTIwLDcgQEAKICAgICAgICAgaW50IHVzZXJMaW1pdCA9IGdldExpbWl0KG9wdGlvbnMpOwogICAgICAgICBpbnQgdXNlclBlclBhcnRpdGlvbkxpbWl0ID0gZ2V0UGVyUGFydGl0aW9uTGltaXQob3B0aW9ucyk7CiAgICAgICAgIGludCBwYWdlU2l6ZSA9IG9wdGlvbnMuZ2V0UGFnZVNpemUoKTsKKyAgICAgICAgYm9vbGVhbiB1bm1hc2sgPSBzdGF0ZS5nZXRDbGllbnRTdGF0ZSgpLmhhc1RhYmxlUGVybWlzc2lvbih0YWJsZSwgUGVybWlzc2lvbi5VTk1BU0spOwogCiAgICAgICAgIFNlbGVjdG9ycyBzZWxlY3RvcnMgPSBzZWxlY3Rpb24ubmV3U2VsZWN0b3JzKG9wdGlvbnMpOwogICAgICAgICBBZ2dyZWdhdGlvblNwZWNpZmljYXRpb24gYWdncmVnYXRpb25TcGVjID0gZ2V0QWdncmVnYXRpb25TcGVjKG9wdGlvbnMpOwpAQCAtNTA1LDcgKzUzOSw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdHJ5IChQYXJ0aXRpb25JdGVyYXRvciBkYXRhID0gcXVlcnkuZXhlY3V0ZUludGVybmFsKGV4ZWN1dGlvbkNvbnRyb2xsZXIpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXN1bHRzKGRhdGEsIG9wdGlvbnMsIHNlbGVjdG9ycywgbm93SW5TZWMsIHVzZXJMaW1pdCwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9jZXNzUmVzdWx0cyhkYXRhLCBvcHRpb25zLCBzZWxlY3RvcnMsIG5vd0luU2VjLCB1c2VyTGltaXQsIG51bGwsIHVubWFzayk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC01MTksNyArNTUzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vd0luU2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlckxpbWl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRpb25TcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlTdGFydE5hbm9UaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5U3RhcnROYW5vVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubWFzayk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTU3NywxMSArNjEyLDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgUmVzdWx0U2V0IHByb2Nlc3MoUGFydGl0aW9uSXRlcmF0b3IgcGFydGl0aW9ucywgaW50IG5vd0luU2VjKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KKyAgICBwdWJsaWMgUmVzdWx0U2V0IHByb2Nlc3MoUGFydGl0aW9uSXRlcmF0b3IgcGFydGl0aW9ucywgaW50IG5vd0luU2VjLCBib29sZWFuIHVubWFzaykgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCiAgICAgewogICAgICAgICBRdWVyeU9wdGlvbnMgb3B0aW9ucyA9IFF1ZXJ5T3B0aW9ucy5ERUZBVUxUOwogICAgICAgICBTZWxlY3RvcnMgc2VsZWN0b3JzID0gc2VsZWN0aW9uLm5ld1NlbGVjdG9ycyhvcHRpb25zKTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3MocGFydGl0aW9ucywgb3B0aW9ucywgc2VsZWN0b3JzLCBub3dJblNlYywgZ2V0TGltaXQob3B0aW9ucyksIGdldEFnZ3JlZ2F0aW9uU3BlYyhvcHRpb25zKSk7CisgICAgICAgIHJldHVybiBwcm9jZXNzKHBhcnRpdGlvbnMsIG9wdGlvbnMsIHNlbGVjdG9ycywgbm93SW5TZWMsIGdldExpbWl0KG9wdGlvbnMpLCBnZXRBZ2dyZWdhdGlvblNwZWMob3B0aW9ucyksIHVubWFzayk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC04ODcsMTAgKzkyMiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3JzIHNlbGVjdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub3dJblNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VyTGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZ2dyZWdhdGlvblNwZWNpZmljYXRpb24gYWdncmVnYXRpb25TcGVjKSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbiBhZ2dyZWdhdGlvblNwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVubWFzaykgdGhyb3dzIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uCiAgICAgewogICAgICAgICBHcm91cE1ha2VyIGdyb3VwTWFrZXIgPSBhZ2dyZWdhdGlvblNwZWMgPT0gbnVsbCA/IG51bGwgOiBhZ2dyZWdhdGlvblNwZWMubmV3R3JvdXBNYWtlcigpOwotICAgICAgICBSZXN1bHRTZXRCdWlsZGVyIHJlc3VsdCA9IG5ldyBSZXN1bHRTZXRCdWlsZGVyKGdldFJlc3VsdE1ldGFkYXRhKCksIHNlbGVjdG9ycywgZ3JvdXBNYWtlcik7CisgICAgICAgIFJlc3VsdFNldEJ1aWxkZXIgcmVzdWx0ID0gbmV3IFJlc3VsdFNldEJ1aWxkZXIoZ2V0UmVzdWx0TWV0YWRhdGEoKSwgc2VsZWN0b3JzLCB1bm1hc2ssIGdyb3VwTWFrZXIpOwogCiAgICAgICAgIHdoaWxlIChwYXJ0aXRpb25zLmhhc05leHQoKSkKICAgICAgICAgewpAQCAtOTg3LDcgKzEwMjMsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIXN0YXRpY1Jvdy5pc0VtcHR5KCkgJiYgcmVzdHJpY3Rpb25zLnJldHVyblN0YXRpY0NvbnRlbnRPblBhcnRpdGlvbldpdGhOb1Jvd3MoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQubmV3Um93KHBhcnRpdGlvbi5wYXJ0aXRpb25LZXkoKSwgc3RhdGljUm93LmNsdXN0ZXJpbmcoKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0Lm5ld1Jvdyhwcm90b2NvbFZlcnNpb24sIHBhcnRpdGlvbi5wYXJ0aXRpb25LZXkoKSwgc3RhdGljUm93LmNsdXN0ZXJpbmcoKSwgc2VsZWN0aW9uLmdldENvbHVtbnMoKSk7CiAgICAgICAgICAgICAgICAgbWF5YmVGYWlsKHJlc3VsdCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgZm9yIChDb2x1bW5NZXRhZGF0YSBkZWYgOiBzZWxlY3Rpb24uZ2V0Q29sdW1ucygpKQogICAgICAgICAgICAgICAgIHsKQEAgLTk5Nyw3ICsxMDMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGtleUNvbXBvbmVudHNbZGVmLnBvc2l0aW9uKCldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBVElDOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFZhbHVlKHJlc3VsdCwgZGVmLCBzdGF0aWNSb3csIG5vd0luU2VjLCBwcm90b2NvbFZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQocGFydGl0aW9uLnN0YXRpY1JvdygpLmdldENvbHVtbkRhdGEoZGVmKSwgbm93SW5TZWMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKChCeXRlQnVmZmVyKW51bGwpOwpAQCAtMTAxMCw3ICsxMDQ2LDcgQEAKICAgICAgICAgd2hpbGUgKHBhcnRpdGlvbi5oYXNOZXh0KCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIFJvdyByb3cgPSBwYXJ0aXRpb24ubmV4dCgpOwotICAgICAgICAgICAgcmVzdWx0Lm5ld1JvdyggcGFydGl0aW9uLnBhcnRpdGlvbktleSgpLCByb3cuY2x1c3RlcmluZygpKTsKKyAgICAgICAgICAgIHJlc3VsdC5uZXdSb3cocHJvdG9jb2xWZXJzaW9uLCBwYXJ0aXRpb24ucGFydGl0aW9uS2V5KCksIHJvdy5jbHVzdGVyaW5nKCksIHNlbGVjdGlvbi5nZXRDb2x1bW5zKCkpOwogCiAgICAgICAgICAgICAvLyByZWFkcyBhcmVuJ3QgZmFpbGVkIGFzIHNvb24gdGhlIHNpemUgZXhjZWVkcyB0aGUgZmFpbHVyZSB0aHJlc2hvbGQsIHRoZXkncmUgZmFpbGVkIG9uY2UgdGhlIGZhaWx1cmUKICAgICAgICAgICAgIC8vIHRocmVzaG9sZCBoYXMgYmVlbiBleGNlZWRlZCBhbmQgd2Ugc3RhcnQgYWRkaW5nIG1vcmUgZGF0YS4gV2UncmUgc2xpZ2h0bHkgbW9yZSBwZXJtaXNzaXZlIHRvIGF2b2lkCkBAIC0xMDMwLDM1ICsxMDY2LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHJvdy5jbHVzdGVyaW5nKCkuYnVmZmVyQXQoZGVmLnBvc2l0aW9uKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFJFR1VMQVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRWYWx1ZShyZXN1bHQsIGRlZiwgcm93LCBub3dJblNlYywgcHJvdG9jb2xWZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQocm93LmdldENvbHVtbkRhdGEoZGVmKSwgbm93SW5TZWMpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBVElDOgotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmFsdWUocmVzdWx0LCBkZWYsIHN0YXRpY1Jvdywgbm93SW5TZWMsIHByb3RvY29sVmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHN0YXRpY1Jvdy5nZXRDb2x1bW5EYXRhKGRlZiksIG5vd0luU2VjKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkVmFsdWUoUmVzdWx0U2V0QnVpbGRlciByZXN1bHQsIENvbHVtbk1ldGFkYXRhIGRlZiwgUm93IHJvdywgaW50IG5vd0luU2VjLCBQcm90b2NvbFZlcnNpb24gcHJvdG9jb2xWZXJzaW9uKQotICAgIHsKLSAgICAgICAgaWYgKGRlZi5pc0NvbXBsZXgoKSkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGRlZi50eXBlLmlzTXVsdGlDZWxsKCk7Ci0gICAgICAgICAgICBDb21wbGV4Q29sdW1uRGF0YSBjb21wbGV4RGF0YSA9IHJvdy5nZXRDb21wbGV4Q29sdW1uRGF0YShkZWYpOwotICAgICAgICAgICAgaWYgKGNvbXBsZXhEYXRhID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChudWxsKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGRlZi50eXBlLmlzQ29sbGVjdGlvbigpKQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoKChDb2xsZWN0aW9uVHlwZSkgZGVmLnR5cGUpLnNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKGNvbXBsZXhEYXRhLml0ZXJhdG9yKCksIHByb3RvY29sVmVyc2lvbikpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoKChVc2VyVHlwZSkgZGVmLnR5cGUpLnNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKGNvbXBsZXhEYXRhLml0ZXJhdG9yKCksIHByb3RvY29sVmVyc2lvbikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0LmFkZChyb3cuZ2V0Q2VsbChkZWYpLCBub3dJblNlYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIGJvb2xlYW4gbmVlZHNQb3N0UXVlcnlPcmRlcmluZygpCiAgICAgewogICAgICAgICAvLyBXZSBuZWVkIHBvc3QtcXVlcnkgb3JkZXJpbmcgb25seSBmb3IgcXVlcmllcyB3aXRoIElOIG9uIHRoZSBwYXJ0aXRpb24ga2V5IGFuZCBhbiBPUkRFUiBCWS4KQEAgLTExMDQsMTcgKzExMjEsMTcgQEAKICAgICAgICAgewogICAgICAgICAgICAgLy8gQ2FjaGUgbG9jYWxseSBmb3IgdXNlIGJ5IEd1YXJkcmFpbHMKICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgIHJldHVybiBwcmVwYXJlKGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiBwcmVwYXJlKHN0YXRlLCBmYWxzZSk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgU2VsZWN0U3RhdGVtZW50IHByZXBhcmUoYm9vbGVhbiBmb3JWaWV3KSB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KKyAgICAgICAgcHVibGljIFNlbGVjdFN0YXRlbWVudCBwcmVwYXJlKENsaWVudFN0YXRlIHN0YXRlLCBib29sZWFuIGZvclZpZXcpIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhIHRhYmxlID0gU2NoZW1hLmluc3RhbmNlLnZhbGlkYXRlVGFibGUoa2V5c3BhY2UoKSwgbmFtZSgpKTsKIAogICAgICAgICAgICAgTGlzdDxTZWxlY3RhYmxlPiBzZWxlY3RhYmxlcyA9IFJhd1NlbGVjdG9yLnRvU2VsZWN0YWJsZXMoc2VsZWN0Q2xhdXNlLCB0YWJsZSk7CiAgICAgICAgICAgICBib29sZWFuIGNvbnRhaW5zT25seVN0YXRpY0NvbHVtbnMgPSBzZWxlY3RPbmx5U3RhdGljQ29sdW1ucyh0YWJsZSwgc2VsZWN0YWJsZXMpOwogCi0gICAgICAgICAgICBTdGF0ZW1lbnRSZXN0cmljdGlvbnMgcmVzdHJpY3Rpb25zID0gcHJlcGFyZVJlc3RyaWN0aW9ucyh0YWJsZSwgYmluZFZhcmlhYmxlcywgY29udGFpbnNPbmx5U3RhdGljQ29sdW1ucywgZm9yVmlldyk7CisgICAgICAgICAgICBTdGF0ZW1lbnRSZXN0cmljdGlvbnMgcmVzdHJpY3Rpb25zID0gcHJlcGFyZVJlc3RyaWN0aW9ucyhzdGF0ZSwgdGFibGUsIGJpbmRWYXJpYWJsZXMsIGNvbnRhaW5zT25seVN0YXRpY0NvbHVtbnMsIGZvclZpZXcpOwogCiAgICAgICAgICAgICAvLyBJZiB3ZSBvcmRlciBwb3N0LXF1ZXJ5LCB0aGUgc29ydGVkIGNvbHVtbiBuZWVkcyB0byBiZSBpbiB0aGUgUmVzdWx0U2V0IGZvciBzb3J0aW5nLAogICAgICAgICAgICAgLy8gZXZlbiBpZiB3ZSBkb24ndCB1bHRpbWF0ZWx5IHNoaXAgdGhlbSB0byB0aGUgY2xpZW50IChDQVNTQU5EUkEtNDkxMSkuCkBAIC0xMTgyLDEwICsxMTk5LDE0IEBACiAgICAgICAgICAgICBpZiAoaGFzR3JvdXBCeSkKICAgICAgICAgICAgICAgICBHdWFyZHJhaWxzLmdyb3VwQnlFbmFibGVkLmVuc3VyZUVuYWJsZWQoc3RhdGUpOwogCisgICAgICAgICAgICBib29sZWFuIGlzSnNvbiA9IHBhcmFtZXRlcnMuaXNKc29uOworICAgICAgICAgICAgYm9vbGVhbiByZXR1cm5TdGF0aWNDb250ZW50T25QYXJ0aXRpb25XaXRoTm9Sb3dzID0gcmVzdHJpY3Rpb25zLnJldHVyblN0YXRpY0NvbnRlbnRPblBhcnRpdGlvbldpdGhOb1Jvd3MoKTsKKwogICAgICAgICAgICAgaWYgKHNlbGVjdGFibGVzLmlzRW1wdHkoKSkgLy8gd2lsZGNhcmQgcXVlcnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzR3JvdXBCeSA/IFNlbGVjdGlvbi53aWxkY2FyZFdpdGhHcm91cEJ5KHRhYmxlLCBib3VuZE5hbWVzLCBwYXJhbWV0ZXJzLmlzSnNvbiwgcmVzdHJpY3Rpb25zLnJldHVyblN0YXRpY0NvbnRlbnRPblBhcnRpdGlvbldpdGhOb1Jvd3MoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNlbGVjdGlvbi53aWxkY2FyZCh0YWJsZSwgcGFyYW1ldGVycy5pc0pzb24sIHJlc3RyaWN0aW9ucy5yZXR1cm5TdGF0aWNDb250ZW50T25QYXJ0aXRpb25XaXRoTm9Sb3dzKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBoYXNHcm91cEJ5IHx8IHRhYmxlLmhhc01hc2tlZENvbHVtbnMoKQorICAgICAgICAgICAgICAgICAgICAgICA/IFNlbGVjdGlvbi53aWxkY2FyZFdpdGhHcm91cEJ5T3JNYXNrZWRDb2x1bW5zKHRhYmxlLCBib3VuZE5hbWVzLCByZXN1bHRTZXRPcmRlcmluZ0NvbHVtbnMsIGlzSnNvbiwgcmV0dXJuU3RhdGljQ29udGVudE9uUGFydGl0aW9uV2l0aE5vUm93cykKKyAgICAgICAgICAgICAgICAgICAgICAgOiBTZWxlY3Rpb24ud2lsZGNhcmQodGFibGUsIGlzSnNvbiwgcmV0dXJuU3RhdGljQ29udGVudE9uUGFydGl0aW9uV2l0aE5vUm93cyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBTZWxlY3Rpb24uZnJvbVNlbGVjdG9ycyh0YWJsZSwKQEAgLTExOTQsOCArMTIxNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0U2V0T3JkZXJpbmdDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9ucy5ub25QS1Jlc3RyaWN0ZWRDb2x1bW5zKGZhbHNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNHcm91cEJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuaXNKc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9ucy5yZXR1cm5TdGF0aWNDb250ZW50T25QYXJ0aXRpb25XaXRoTm9Sb3dzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSnNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5TdGF0aWNDb250ZW50T25QYXJ0aXRpb25XaXRoTm9Sb3dzKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMTI0NCwxMiArMTI2NSwxNCBAQAogICAgICAgICAgKiBAcmV0dXJuIHRoZSByZXN0cmljdGlvbnMKICAgICAgICAgICogQHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJzIHdoaWxlIGJ1aWxkaW5nIHRoZSByZXN0cmljdGlvbnMKICAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgU3RhdGVtZW50UmVzdHJpY3Rpb25zIHByZXBhcmVSZXN0cmljdGlvbnMoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKKyAgICAgICAgcHJpdmF0ZSBTdGF0ZW1lbnRSZXN0cmljdGlvbnMgcHJlcGFyZVJlc3RyaWN0aW9ucyhDbGllbnRTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlU3BlY2lmaWNhdGlvbnMgYm91bmROYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdHNPbmx5U3RhdGljQ29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZvclZpZXcpIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRlbWVudFJlc3RyaWN0aW9ucyhTdGF0ZW1lbnRUeXBlLlNFTEVDVCwKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdGVtZW50UmVzdHJpY3Rpb25zKHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVtZW50VHlwZS5TRUxFQ1QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlQ2xhdXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmROYW1lcywKQEAgLTEzMjMsNiArMTM0Niw3IEBACiAgICAgICAgICAgICBpbnQgY2x1c3RlcmluZ1ByZWZpeFNpemUgPSAwOwogCiAgICAgICAgICAgICBJdGVyYXRvcjxDb2x1bW5NZXRhZGF0YT4gcGtDb2x1bW5zID0gbWV0YWRhdGEucHJpbWFyeUtleUNvbHVtbnMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgTGlzdDxDb2x1bW5NZXRhZGF0YT4gY29sdW1ucyA9IG51bGw7CiAgICAgICAgICAgICBTZWxlY3Rvci5GYWN0b3J5IHNlbGVjdG9yRmFjdG9yeSA9IG51bGw7CiAgICAgICAgICAgICBmb3IgKFNlbGVjdGFibGUuUmF3IHJhdyA6IHBhcmFtZXRlcnMuZ3JvdXBzKQogICAgICAgICAgICAgewpAQCAtMTMzNCw3ICsxMzU4LDcgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIFdpdGhGdW5jdGlvbiB3aXRoRnVuY3Rpb24gPSAoV2l0aEZ1bmN0aW9uKSBzZWxlY3RhYmxlOwogICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUdyb3VwQnlGdW5jdGlvbih3aXRoRnVuY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICBMaXN0PENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zID0gbmV3IEFycmF5TGlzdDxDb2x1bW5NZXRhZGF0YT4oKTsKKyAgICAgICAgICAgICAgICAgICAgY29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8Q29sdW1uTWV0YWRhdGE+KCk7CiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yRmFjdG9yeSA9IHNlbGVjdGFibGUubmV3U2VsZWN0b3JGYWN0b3J5KG1ldGFkYXRhLCBudWxsLCBjb2x1bW5zLCBib3VuZE5hbWVzKTsKICAgICAgICAgICAgICAgICAgICAgY2hlY2tGYWxzZShjb2x1bW5zLmlzRW1wdHkoKSwgIkdST1VQIEJZIGZ1bmN0aW9ucyBtdXN0IGhhdmUgb25lIGNsdXN0ZXJpbmcgY29sdW1uIG5hbWUgYXMgcGFyYW1ldGVyIik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5zLnNpemUoKSA+IDEpCkBAIC0xMzgyLDcgKzE0MDYsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yRmFjdG9yeSA9PSBudWxsID8gQWdncmVnYXRpb25TcGVjaWZpY2F0aW9uLmFnZ3JlZ2F0ZVBrUHJlZml4RmFjdG9yeShtZXRhZGF0YS5jb21wYXJhdG9yLCBjbHVzdGVyaW5nUHJlZml4U2l6ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbi5hZ2dyZWdhdGVQa1ByZWZpeEZhY3RvcnlXaXRoU2VsZWN0b3IobWV0YWRhdGEuY29tcGFyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcmluZ1ByZWZpeFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yRmFjdG9yeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1ucyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTE0MDUsOCArMTQzMCw4IEBACiAgICAgICAgICAgICBpZiAoIXJlc3RyaWN0aW9ucy5rZXlJc0luUmVsYXRpb24oKSkKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKIAotICAgICAgICAgICAgTGlzdDxJbnRlZ2VyPiBpZFRvU29ydCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4ob3JkZXJpbmdDb2x1bW5zLnNpemUoKSk7Ci0gICAgICAgICAgICBMaXN0PENvbXBhcmF0b3I8Qnl0ZUJ1ZmZlcj4+IHNvcnRlcnMgPSBuZXcgQXJyYXlMaXN0PENvbXBhcmF0b3I8Qnl0ZUJ1ZmZlcj4+KG9yZGVyaW5nQ29sdW1ucy5zaXplKCkpOworICAgICAgICAgICAgTGlzdDxJbnRlZ2VyPiBpZFRvU29ydCA9IG5ldyBBcnJheUxpc3Q8PihvcmRlcmluZ0NvbHVtbnMuc2l6ZSgpKTsKKyAgICAgICAgICAgIExpc3Q8Q29tcGFyYXRvcjxCeXRlQnVmZmVyPj4gc29ydGVycyA9IG5ldyBBcnJheUxpc3Q8PihvcmRlcmluZ0NvbHVtbnMuc2l6ZSgpKTsKIAogICAgICAgICAgICAgZm9yIChDb2x1bW5NZXRhZGF0YSBvcmRlcmluZ0NvbHVtbiA6IG9yZGVyaW5nQ29sdW1ucy5rZXlTZXQoKSkKICAgICAgICAgICAgIHsKQEAgLTE0NjYsNyArMTQ5MSw4IEBACiAgICAgICAgICAgICAgICAgLy8gV2Ugd2lsbCBwb3RlbnRpYWxseSBmaWx0ZXIgZGF0YSBpZiBlaXRoZXI6CiAgICAgICAgICAgICAgICAgLy8gIC0gSGF2ZSBtb3JlIHRoYW4gb25lIEluZGV4RXhwcmVzc2lvbgogICAgICAgICAgICAgICAgIC8vICAtIEhhdmUgbm8gaW5kZXggZXhwcmVzc2lvbiBhbmQgdGhlIHJvdyBmaWx0ZXIgaXMgbm90IHRoZSBpZGVudGl0eQotICAgICAgICAgICAgICAgIGNoZWNrRmFsc2UocmVzdHJpY3Rpb25zLm5lZWRGaWx0ZXJpbmcoKSwgU3RhdGVtZW50UmVzdHJpY3Rpb25zLlJFUVVJUkVTX0FMTE9XX0ZJTFRFUklOR19NRVNTQUdFKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdHJpY3Rpb25zLnJlcXVpcmVzQWxsb3dGaWx0ZXJpbmdJZk5vdFNwZWNpZmllZCgpKQorICAgICAgICAgICAgICAgICAgICBjaGVja0ZhbHNlKHJlc3RyaWN0aW9ucy5uZWVkRmlsdGVyaW5nKCksIFN0YXRlbWVudFJlc3RyaWN0aW9ucy5SRVFVSVJFU19BTExPV19GSUxURVJJTkdfTUVTU0FHRSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL1VwZGF0ZVN0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL1VwZGF0ZVN0YXRlbWVudC5qYXZhCmluZGV4IDIwZGYxNTEuLjI1OGZiZjMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9VcGRhdGVTdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvVXBkYXRlU3RhdGVtZW50LmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvblVwZGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKQEAgLTEzNSw3ICsxMzYsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBNb2RpZmljYXRpb25TdGF0ZW1lbnQgcHJlcGFyZUludGVybmFsKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCisgICAgICAgIHByb3RlY3RlZCBNb2RpZmljYXRpb25TdGF0ZW1lbnQgcHJlcGFyZUludGVybmFsKENsaWVudFN0YXRlIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWJsZVNwZWNpZmljYXRpb25zIGJpbmRWYXJpYWJsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbnMgY29uZGl0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcyBhdHRycykKQEAgLTE3Niw3ICsxNzgsOCBAQAogCiAgICAgICAgICAgICBib29sZWFuIGFwcGx5T25seVRvU3RhdGljQ29sdW1ucyA9ICFoYXNDbHVzdGVyaW5nQ29sdW1uc1NldCAmJiBhcHBsaWVzT25seVRvU3RhdGljQ29sdW1ucyhvcGVyYXRpb25zLCBjb25kaXRpb25zKTsKIAotICAgICAgICAgICAgU3RhdGVtZW50UmVzdHJpY3Rpb25zIHJlc3RyaWN0aW9ucyA9IG5ldyBTdGF0ZW1lbnRSZXN0cmljdGlvbnModHlwZSwKKyAgICAgICAgICAgIFN0YXRlbWVudFJlc3RyaWN0aW9ucyByZXN0cmljdGlvbnMgPSBuZXcgU3RhdGVtZW50UmVzdHJpY3Rpb25zKHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVDbGF1c2UuYnVpbGQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRWYXJpYWJsZXMsCkBAIC0yMTAsNyArMjEzLDggQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgTW9kaWZpY2F0aW9uU3RhdGVtZW50IHByZXBhcmVJbnRlcm5hbChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICBwcm90ZWN0ZWQgTW9kaWZpY2F0aW9uU3RhdGVtZW50IHByZXBhcmVJbnRlcm5hbChDbGllbnRTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVTcGVjaWZpY2F0aW9ucyBiaW5kVmFyaWFibGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25zIGNvbmRpdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgYXR0cnMpCkBAIC0yNDQsNyArMjQ4LDggQEAKIAogICAgICAgICAgICAgYm9vbGVhbiBhcHBseU9ubHlUb1N0YXRpY0NvbHVtbnMgPSAhaGFzQ2x1c3RlcmluZ0NvbHVtbnNTZXQgJiYgYXBwbGllc09ubHlUb1N0YXRpY0NvbHVtbnMob3BlcmF0aW9ucywgY29uZGl0aW9ucyk7CiAKLSAgICAgICAgICAgIFN0YXRlbWVudFJlc3RyaWN0aW9ucyByZXN0cmljdGlvbnMgPSBuZXcgU3RhdGVtZW50UmVzdHJpY3Rpb25zKHR5cGUsCisgICAgICAgICAgICBTdGF0ZW1lbnRSZXN0cmljdGlvbnMgcmVzdHJpY3Rpb25zID0gbmV3IFN0YXRlbWVudFJlc3RyaWN0aW9ucyhzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlQ2xhdXNlLmJ1aWxkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFyaWFibGVzLApAQCAtMjkxLDcgKzI5Niw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE1vZGlmaWNhdGlvblN0YXRlbWVudCBwcmVwYXJlSW50ZXJuYWwoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKKyAgICAgICAgcHJvdGVjdGVkIE1vZGlmaWNhdGlvblN0YXRlbWVudCBwcmVwYXJlSW50ZXJuYWwoQ2xpZW50U3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlU3BlY2lmaWNhdGlvbnMgYmluZFZhcmlhYmxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZGl0aW9ucyBjb25kaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGF0dHJzKQpAQCAtMzA5LDcgKzMxNSw4IEBACiAgICAgICAgICAgICAgICAgb3BlcmF0aW9ucy5hZGQob3BlcmF0aW9uKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgU3RhdGVtZW50UmVzdHJpY3Rpb25zIHJlc3RyaWN0aW9ucyA9IG5ld1Jlc3RyaWN0aW9ucyhtZXRhZGF0YSwKKyAgICAgICAgICAgIFN0YXRlbWVudFJlc3RyaWN0aW9ucyByZXN0cmljdGlvbnMgPSBuZXdSZXN0cmljdGlvbnMoc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFyaWFibGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUNsYXVzZSwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQWx0ZXJLZXlzcGFjZVN0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9BbHRlcktleXNwYWNlU3RhdGVtZW50LmphdmEKaW5kZXggODczNzdkNy4uYjhhMjdhZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9BbHRlcktleXNwYWNlU3RhdGVtZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9BbHRlcktleXNwYWNlU3RhdGVtZW50LmphdmEKQEAgLTI2LDE3ICsyNiwxOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1ZGl0LkF1ZGl0TG9nQ29udGV4dDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdWRpdC5BdWRpdExvZ0VudHJ5VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLlBlcm1pc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMU3RhdGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHMuR3VhcmRyYWlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLkdvc3NpcGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuQWJzdHJhY3RSZXBsaWNhdGlvblN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuTG9jYWxTdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlJlcGxpY2F0aW9uRmFjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU2ltcGxlU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlTWV0YWRhdGEuS2V5c3BhY2VEaWZmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZXM7CkBAIC00NiwxMCArNDcsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuRXZlbnQuU2NoZW1hQ2hhbmdlLkNoYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFMTE9XX0FMVEVSX1JGX0RVUklOR19SQU5HRV9NT1ZFTUVOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BTExPV19VTlNBRkVfVFJBTlNJRU5UX0NIQU5HRVM7CisKIHB1YmxpYyBmaW5hbCBjbGFzcyBBbHRlcktleXNwYWNlU3RhdGVtZW50IGV4dGVuZHMgQWx0ZXJTY2hlbWFTdGF0ZW1lbnQKIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGFsbG93X2FsdGVyX3JmX2R1cmluZ19yYW5nZV9tb3ZlbWVudCA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImFsbG93X2FsdGVyX3JmX2R1cmluZ19yYW5nZV9tb3ZlbWVudCIpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gYWxsb3dfdW5zYWZlX3RyYW5zaWVudF9jaGFuZ2VzID0gQm9vbGVhbi5nZXRCb29sZWFuKENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiYWxsb3dfdW5zYWZlX3RyYW5zaWVudF9jaGFuZ2VzIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBhbGxvd19hbHRlcl9yZl9kdXJpbmdfcmFuZ2VfbW92ZW1lbnQgPSBBTExPV19BTFRFUl9SRl9EVVJJTkdfUkFOR0VfTU9WRU1FTlQuZ2V0Qm9vbGVhbigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gYWxsb3dfdW5zYWZlX3RyYW5zaWVudF9jaGFuZ2VzID0gQUxMT1dfVU5TQUZFX1RSQU5TSUVOVF9DSEFOR0VTLmdldEJvb2xlYW4oKTsKICAgICBwcml2YXRlIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBjbGllbnRXYXJuaW5ncyA9IG5ldyBIYXNoU2V0PD4oKTsKIAogICAgIHByaXZhdGUgZmluYWwgS2V5c3BhY2VBdHRyaWJ1dGVzIGF0dHJzOwpAQCAtNzYsNiArODAsOSBAQAogCiAgICAgICAgIEtleXNwYWNlTWV0YWRhdGEgbmV3S2V5c3BhY2UgPSBrZXlzcGFjZS53aXRoU3dhcHBlZChhdHRycy5hc0FsdGVyZWRLZXlzcGFjZVBhcmFtcyhrZXlzcGFjZS5wYXJhbXMpKTsKIAorICAgICAgICBpZiAoYXR0cnMuZ2V0UmVwbGljYXRpb25TdHJhdGVneUNsYXNzKCkgIT0gbnVsbCAmJiBhdHRycy5nZXRSZXBsaWNhdGlvblN0cmF0ZWd5Q2xhc3MoKS5lcXVhbHMoU2ltcGxlU3RyYXRlZ3kuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSkKKyAgICAgICAgICAgIEd1YXJkcmFpbHMuc2ltcGxlU3RyYXRlZ3lFbmFibGVkLmVuc3VyZUVuYWJsZWQoc3RhdGUpOworCiAgICAgICAgIGlmIChuZXdLZXlzcGFjZS5wYXJhbXMucmVwbGljYXRpb24ua2xhc3MuZXF1YWxzKExvY2FsU3RyYXRlZ3kuY2xhc3MpKQogICAgICAgICAgICAgdGhyb3cgaXJlKCJVbmFibGUgdG8gdXNlIGdpdmVuIHN0cmF0ZWd5IGNsYXNzOiBMb2NhbFN0cmF0ZWd5IGlzIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuIik7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQWx0ZXJTY2hlbWFTdGF0ZW1lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQWx0ZXJTY2hlbWFTdGF0ZW1lbnQuamF2YQppbmRleCBmZGM0OTIxLi5hNTM5ZWE3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0FsdGVyU2NoZW1hU3RhdGVtZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9BbHRlclNjaGVtYVN0YXRlbWVudC5qYXZhCkBAIC0yNiw2ICsyNiw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFN0YXRlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5T3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlcy5LZXlzcGFjZXNEaWZmOwpAQCAtMTQwLDYgKzE0MiwxNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVEZWZhdWx0VGltZVRvTGl2ZShUYWJsZVBhcmFtcyBwYXJhbXMpCisgICAgeworICAgICAgICBpZiAocGFyYW1zLmRlZmF1bHRUaW1lVG9MaXZlID09IDAKKyAgICAgICAgICAgICYmICFTY2hlbWFDb25zdGFudHMuaXNTeXN0ZW1LZXlzcGFjZShrZXlzcGFjZU5hbWUpCisgICAgICAgICAgICAmJiBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocGFyYW1zLmNvbXBhY3Rpb24ua2xhc3MoKSkpCisgICAgICAgICAgICBHdWFyZHJhaWxzLnplcm9UVExPblRXQ1NFbmFibGVkLmVuc3VyZUVuYWJsZWQoc3RhdGUpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBncmFudFBlcm1pc3Npb25zT25SZXNvdXJjZShJUmVzb3VyY2UgcmVzb3VyY2UsIEF1dGhlbnRpY2F0ZWRVc2VyIHVzZXIpCiAgICAgewogICAgICAgICB0cnkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQWx0ZXJUYWJsZVN0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9BbHRlclRhYmxlU3RhdGVtZW50LmphdmEKaW5kZXggMDhjNWYwNC4uODFmMDk2YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9BbHRlclRhYmxlU3RhdGVtZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9BbHRlclRhYmxlU3RhdGVtZW50LmphdmEKQEAgLTIzLDkgKzIzLDEyIEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CiAKQEAgLTQwLDYgKzQzLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFN0YXRlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtbklkZW50aWZpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWFsaWZpZWROYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmcuQ29sdW1uTWFzazsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CkBAIC03OCw2ICs4Miw3IEBACiB7CiAgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB0YWJsZU5hbWU7CiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlmRXhpc3RzOworICAgIHByb3RlY3RlZCBDbGllbnRTdGF0ZSBzdGF0ZTsKIAogICAgIHB1YmxpYyBBbHRlclRhYmxlU3RhdGVtZW50KFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyB0YWJsZU5hbWUsIGJvb2xlYW4gaWZFeGlzdHMpCiAgICAgewpAQCAtODYsNiArOTEsMTUgQEAKICAgICAgICAgdGhpcy5pZkV4aXN0cyA9IGlmRXhpc3RzOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKENsaWVudFN0YXRlIHN0YXRlKQorICAgIHsKKyAgICAgICAgc3VwZXIudmFsaWRhdGUoc3RhdGUpOworCisgICAgICAgIC8vIHNhdmUgdGhlIHF1ZXJ5IHN0YXRlIHRvIHVzZSBpdCBmb3IgZ3VhcmRyYWlscyB2YWxpZGF0aW9uIGluICNhcHBseQorICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgfQorCiAgICAgcHVibGljIEtleXNwYWNlcyBhcHBseShLZXlzcGFjZXMgc2NoZW1hKQogICAgIHsKICAgICAgICAgS2V5c3BhY2VNZXRhZGF0YSBrZXlzcGFjZSA9IHNjaGVtYS5nZXROdWxsYWJsZShrZXlzcGFjZU5hbWUpOwpAQCAtMTQ5LDYgKzE2Myw3OCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEFMVEVSIFRBQkxFIFtJRiBFWElTVFNdIDx0YWJsZT4gQUxURVIgW0lGIEVYSVNUU10gPGNvbHVtbj4gKCBNQVNLRUQgV0lUSCA8bmV3TWFzaz4gfCBEUk9QIE1BU0tFRCApCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXNrQ29sdW1uIGV4dGVuZHMgQWx0ZXJUYWJsZVN0YXRlbWVudAorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2x1bW5JZGVudGlmaWVyIGNvbHVtbk5hbWU7CisgICAgICAgIEBOdWxsYWJsZQorICAgICAgICBwcml2YXRlIGZpbmFsIENvbHVtbk1hc2suUmF3IHJhd01hc2s7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpZkNvbHVtbkV4aXN0czsKKworICAgICAgICBNYXNrQ29sdW1uKFN0cmluZyBrZXlzcGFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICBDb2x1bW5JZGVudGlmaWVyIGNvbHVtbk5hbWUsCisgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIENvbHVtbk1hc2suUmF3IHJhd01hc2ssCisgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpZlRhYmxlRXhpc3RzLAorICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaWZDb2x1bW5FeGlzdHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCBpZlRhYmxlRXhpc3RzKTsKKyAgICAgICAgICAgIHRoaXMuY29sdW1uTmFtZSA9IGNvbHVtbk5hbWU7CisgICAgICAgICAgICB0aGlzLnJhd01hc2sgPSByYXdNYXNrOworICAgICAgICAgICAgdGhpcy5pZkNvbHVtbkV4aXN0cyA9IGlmQ29sdW1uRXhpc3RzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKENsaWVudFN0YXRlIHN0YXRlKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci52YWxpZGF0ZShzdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIHdlIGRvbid0IGFsbG93IGNyZWF0aW5nIG1hc2tzIGlmIHRoZXkgYXJlIGRpc2FibGVkLCBidXQgd2Ugc3RpbGwgYWxsb3cgZHJvcHBpbmcgdGhlbQorICAgICAgICAgICAgaWYgKHJhd01hc2sgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBDb2x1bW5NYXNrLmVuc3VyZUVuYWJsZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgS2V5c3BhY2VNZXRhZGF0YSBhcHBseShLZXlzcGFjZU1ldGFkYXRhIGtleXNwYWNlLCBUYWJsZU1ldGFkYXRhIHRhYmxlKQorICAgICAgICB7CisgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW4oY29sdW1uTmFtZSk7CisKKyAgICAgICAgICAgIGlmIChjb2x1bW4gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlmQ29sdW1uRXhpc3RzKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBpcmUoIkNvbHVtbiB3aXRoIG5hbWUgJyVzJyBkb2Vzbid0IGV4aXN0IG9uIHRhYmxlICclcyciLCBjb2x1bW5OYW1lLCB0YWJsZU5hbWUpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGtleXNwYWNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb2x1bW5NYXNrIG9sZE1hc2sgPSB0YWJsZS5nZXRDb2x1bW4oY29sdW1uTmFtZSkuZ2V0TWFzaygpOworICAgICAgICAgICAgQ29sdW1uTWFzayBuZXdNYXNrID0gcmF3TWFzayA9PSBudWxsID8gbnVsbCA6IHJhd01hc2sucHJlcGFyZShrZXlzcGFjZS5uYW1lLCB0YWJsZS5uYW1lLCBjb2x1bW5OYW1lLCBjb2x1bW4udHlwZSk7CisKKyAgICAgICAgICAgIGlmIChPYmplY3RzLmVxdWFscyhvbGRNYXNrLCBuZXdNYXNrKSkKKyAgICAgICAgICAgICAgICByZXR1cm4ga2V5c3BhY2U7CisKKyAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEuQnVpbGRlciB0YWJsZUJ1aWxkZXIgPSB0YWJsZS51bmJ1aWxkKCk7CisgICAgICAgICAgICB0YWJsZUJ1aWxkZXIuYWx0ZXJDb2x1bW5NYXNrKGNvbHVtbk5hbWUsIG5ld01hc2spOworICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBuZXdUYWJsZSA9IHRhYmxlQnVpbGRlci5idWlsZCgpOworICAgICAgICAgICAgbmV3VGFibGUudmFsaWRhdGUoKTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIGFueSByZWZlcmVuY2Ugb24gbWF0ZXJpYWxpemVkIHZpZXdzLCBzbyB0aGUgbWFzayBpcyBjb25zaXN0ZW50IGFtb25nIHRoZSBiYXNlIHRhYmxlIGFuZCBpdHMgdmlld3MuCisgICAgICAgICAgICBWaWV3cy5CdWlsZGVyIHZpZXdzQnVpbGRlciA9IGtleXNwYWNlLnZpZXdzLnVuYnVpbGQoKTsKKyAgICAgICAgICAgIGZvciAoVmlld01ldGFkYXRhIHZpZXcgOiBrZXlzcGFjZS52aWV3cy5mb3JUYWJsZSh0YWJsZS5pZCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZpZXcuaW5jbHVkZXMoY29sdW1uTmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2aWV3c0J1aWxkZXIucHV0KHZpZXdzQnVpbGRlci5nZXQodmlldy5uYW1lKCkpLndpdGhOZXdDb2x1bW5NYXNrKGNvbHVtbk5hbWUsIG5ld01hc2spKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBrZXlzcGFjZS53aXRoU3dhcHBlZChrZXlzcGFjZS50YWJsZXMud2l0aFN3YXBwZWQobmV3VGFibGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTd2FwcGVkKHZpZXdzQnVpbGRlci5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEFMVEVSIFRBQkxFIFtJRiBFWElTVFNdIDx0YWJsZT4gQUREIFtJRiBOT1QgRVhJU1RTXSA8Y29sdW1uPiA8bmV3dHlwZT4KICAgICAgKiBBTFRFUiBUQUJMRSBbSUYgRVhJU1RTXSA8dGFibGU+IEFERCBbSUYgTk9UIEVYSVNUU10gKDxjb2x1bW4+IDxuZXd0eXBlPiwgPGNvbHVtbjE+IDxuZXd0eXBlMT4sIC4uLiA8Y29sdW1ubj4gPG5ld3R5cGVuPikKICAgICAgKi8KQEAgLTE1OSwxMiArMjQ1LDE1IEBACiAgICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbHVtbklkZW50aWZpZXIgbmFtZTsKICAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQ1FMM1R5cGUuUmF3IHR5cGU7CiAgICAgICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNTdGF0aWM7CisgICAgICAgICAgICBATnVsbGFibGUKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQ29sdW1uTWFzay5SYXcgbWFzazsKIAotICAgICAgICAgICAgQ29sdW1uKENvbHVtbklkZW50aWZpZXIgbmFtZSwgQ1FMM1R5cGUuUmF3IHR5cGUsIGJvb2xlYW4gaXNTdGF0aWMpCisgICAgICAgICAgICBDb2x1bW4oQ29sdW1uSWRlbnRpZmllciBuYW1lLCBDUUwzVHlwZS5SYXcgdHlwZSwgYm9vbGVhbiBpc1N0YXRpYywgQE51bGxhYmxlIENvbHVtbk1hc2suUmF3IG1hc2spCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICAgICAgICAgIHRoaXMuaXNTdGF0aWMgPSBpc1N0YXRpYzsKKyAgICAgICAgICAgICAgICB0aGlzLm1hc2sgPSBtYXNrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE3OCwxNCArMjY3LDkgQEAKICAgICAgICAgICAgIHRoaXMuaWZDb2x1bW5Ob3RFeGlzdHMgPSBpZkNvbHVtbk5vdEV4aXN0czsKICAgICAgICAgfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShDbGllbnRTdGF0ZSBzdGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIudmFsaWRhdGUoc3RhdGUpOwotICAgICAgICB9Ci0KICAgICAgICAgcHVibGljIEtleXNwYWNlTWV0YWRhdGEgYXBwbHkoS2V5c3BhY2VNZXRhZGF0YSBrZXlzcGFjZSwgVGFibGVNZXRhZGF0YSB0YWJsZSkKICAgICAgICAgeworICAgICAgICAgICAgR3VhcmRyYWlscy5hbHRlclRhYmxlRW5hYmxlZC5lbnN1cmVFbmFibGVkKCJBTFRFUiBUQUJMRSBjaGFuZ2luZyBjb2x1bW5zIiwgc3RhdGUpOwogICAgICAgICAgICAgVGFibGVNZXRhZGF0YS5CdWlsZGVyIHRhYmxlQnVpbGRlciA9IHRhYmxlLnVuYnVpbGQoKTsKICAgICAgICAgICAgIFZpZXdzLkJ1aWxkZXIgdmlld3NCdWlsZGVyID0ga2V5c3BhY2Uudmlld3MudW5idWlsZCgpOwogICAgICAgICAgICAgbmV3Q29sdW1ucy5mb3JFYWNoKGMgLT4gYWRkQ29sdW1uKGtleXNwYWNlLCB0YWJsZSwgYywgaWZDb2x1bW5Ob3RFeGlzdHMsIHRhYmxlQnVpbGRlciwgdmlld3NCdWlsZGVyKSk7CkBAIC0yMDksNiArMjkzLDcgQEAKICAgICAgICAgICAgIENvbHVtbklkZW50aWZpZXIgbmFtZSA9IGNvbHVtbi5uYW1lOwogICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSBjb2x1bW4udHlwZS5wcmVwYXJlKGtleXNwYWNlTmFtZSwga2V5c3BhY2UudHlwZXMpLmdldFR5cGUoKTsKICAgICAgICAgICAgIGJvb2xlYW4gaXNTdGF0aWMgPSBjb2x1bW4uaXNTdGF0aWM7CisgICAgICAgICAgICBDb2x1bW5NYXNrIG1hc2sgPSBjb2x1bW4ubWFzayA9PSBudWxsID8gbnVsbCA6IGNvbHVtbi5tYXNrLnByZXBhcmUoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsIG5hbWUsIHR5cGUpOwogCiAgICAgICAgICAgICBpZiAobnVsbCAhPSB0YWJsZUJ1aWxkZXIuZ2V0Q29sdW1uKG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFpZkNvbHVtbk5vdEV4aXN0cykKQEAgLTI0OSw5ICszMzQsOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaXNTdGF0aWMpCi0gICAgICAgICAgICAgICAgdGFibGVCdWlsZGVyLmFkZFN0YXRpY0NvbHVtbihuYW1lLCB0eXBlKTsKKyAgICAgICAgICAgICAgICB0YWJsZUJ1aWxkZXIuYWRkU3RhdGljQ29sdW1uKG5hbWUsIHR5cGUsIG1hc2spOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRhYmxlQnVpbGRlci5hZGRSZWd1bGFyQ29sdW1uKG5hbWUsIHR5cGUpOworICAgICAgICAgICAgICAgIHRhYmxlQnVpbGRlci5hZGRSZWd1bGFyQ29sdW1uKG5hbWUsIHR5cGUsIG1hc2spOwogCiAgICAgICAgICAgICBpZiAoIWlzU3RhdGljKQogICAgICAgICAgICAgewpAQCAtMjU5LDcgKzM0NCw4IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAodmlldy5pbmNsdWRlQWxsQ29sdW1ucykKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEgdmlld0NvbHVtbiA9IENvbHVtbk1ldGFkYXRhLnJlZ3VsYXJDb2x1bW4odmlldy5tZXRhZGF0YSwgbmFtZS5ieXRlcywgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YSB2aWV3Q29sdW1uID0gQ29sdW1uTWV0YWRhdGEucmVndWxhckNvbHVtbih2aWV3Lm1ldGFkYXRhLCBuYW1lLmJ5dGVzLCB0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhOZXdNYXNrKG1hc2spOwogICAgICAgICAgICAgICAgICAgICAgICAgdmlld3NCdWlsZGVyLnB1dCh2aWV3c0J1aWxkZXIuZ2V0KHZpZXcubmFtZSgpKS53aXRoQWRkZWRSZWd1bGFyQ29sdW1uKHZpZXdDb2x1bW4pKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTI4OCw2ICszNzQsNyBAQAogCiAgICAgICAgIHB1YmxpYyBLZXlzcGFjZU1ldGFkYXRhIGFwcGx5KEtleXNwYWNlTWV0YWRhdGEga2V5c3BhY2UsIFRhYmxlTWV0YWRhdGEgdGFibGUpCiAgICAgICAgIHsKKyAgICAgICAgICAgIEd1YXJkcmFpbHMuYWx0ZXJUYWJsZUVuYWJsZWQuZW5zdXJlRW5hYmxlZCgiQUxURVIgVEFCTEUgY2hhbmdpbmcgY29sdW1ucyIsIHN0YXRlKTsKICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEuQnVpbGRlciBidWlsZGVyID0gdGFibGUudW5idWlsZCgpOwogICAgICAgICAgICAgcmVtb3ZlZENvbHVtbnMuZm9yRWFjaChjIC0+IGRyb3BDb2x1bW4oa2V5c3BhY2UsIHRhYmxlLCBjLCBpZkNvbHVtbkV4aXN0cywgYnVpbGRlcikpOwogICAgICAgICAgICAgcmV0dXJuIGtleXNwYWNlLndpdGhTd2FwcGVkKGtleXNwYWNlLnRhYmxlcy53aXRoU3dhcHBlZChidWlsZGVyLmJ1aWxkKCkpKTsKQEAgLTM1NSw2ICs0NDIsNyBAQAogCiAgICAgICAgIHB1YmxpYyBLZXlzcGFjZU1ldGFkYXRhIGFwcGx5KEtleXNwYWNlTWV0YWRhdGEga2V5c3BhY2UsIFRhYmxlTWV0YWRhdGEgdGFibGUpCiAgICAgICAgIHsKKyAgICAgICAgICAgIEd1YXJkcmFpbHMuYWx0ZXJUYWJsZUVuYWJsZWQuZW5zdXJlRW5hYmxlZCgiQUxURVIgVEFCTEUgY2hhbmdpbmcgY29sdW1ucyIsIHN0YXRlKTsKICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEuQnVpbGRlciB0YWJsZUJ1aWxkZXIgPSB0YWJsZS51bmJ1aWxkKCk7CiAgICAgICAgICAgICBWaWV3cy5CdWlsZGVyIHZpZXdzQnVpbGRlciA9IGtleXNwYWNlLnZpZXdzLnVuYnVpbGQoKTsKICAgICAgICAgICAgIHJlbmFtZWRDb2x1bW5zLmZvckVhY2goKG8sIG4pIC0+IHJlbmFtZUNvbHVtbihrZXlzcGFjZSwgdGFibGUsIG8sIG4sIGlmQ29sdW1uc0V4aXN0cywgdGFibGVCdWlsZGVyLCB2aWV3c0J1aWxkZXIpKTsKQEAgLTQzMCw2ICs1MTgsOCBAQAogICAgICAgICAgICAgc3VwZXIudmFsaWRhdGUoc3RhdGUpOwogCiAgICAgICAgICAgICBHdWFyZHJhaWxzLnRhYmxlUHJvcGVydGllcy5ndWFyZChhdHRycy51cGRhdGVkUHJvcGVydGllcygpLCBhdHRyczo6cmVtb3ZlUHJvcGVydHksIHN0YXRlKTsKKworICAgICAgICAgICAgdmFsaWRhdGVEZWZhdWx0VGltZVRvTGl2ZShhdHRycy5hc05ld1RhYmxlUGFyYW1zKCkpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIEtleXNwYWNlTWV0YWRhdGEgYXBwbHkoS2V5c3BhY2VNZXRhZGF0YSBrZXlzcGFjZSwgVGFibGVNZXRhZGF0YSB0YWJsZSkKQEAgLTU2Nyw3ICs2NTcsMTMgQEAKICAgICB7CiAgICAgICAgIHByaXZhdGUgZW51bSBLaW5kCiAgICAgICAgIHsKLSAgICAgICAgICAgIEFMVEVSX0NPTFVNTiwgQUREX0NPTFVNTlMsIERST1BfQ09MVU1OUywgUkVOQU1FX0NPTFVNTlMsIEFMVEVSX09QVElPTlMsIERST1BfQ09NUEFDVF9TVE9SQUdFCisgICAgICAgICAgICBBTFRFUl9DT0xVTU4sCisgICAgICAgICAgICBNQVNLX0NPTFVNTiwKKyAgICAgICAgICAgIEFERF9DT0xVTU5TLAorICAgICAgICAgICAgRFJPUF9DT0xVTU5TLAorICAgICAgICAgICAgUkVOQU1FX0NPTFVNTlMsCisgICAgICAgICAgICBBTFRFUl9PUFRJT05TLAorICAgICAgICAgICAgRFJPUF9DT01QQUNUX1NUT1JBR0UKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgZmluYWwgUXVhbGlmaWVkTmFtZSBuYW1lOwpAQCAtNTgwLDYgKzY3NiwxMCBAQAogICAgICAgICAvLyBBREQKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEFkZENvbHVtbnMuQ29sdW1uPiBhZGRlZENvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAorICAgICAgICAvLyBBTFRFUiBNQVNLCisgICAgICAgIHByaXZhdGUgQ29sdW1uSWRlbnRpZmllciBtYXNrZWRDb2x1bW4gPSBudWxsOworICAgICAgICBwcml2YXRlIENvbHVtbk1hc2suUmF3IHJhd01hc2sgPSBudWxsOworCiAgICAgICAgIC8vIERST1AKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Q29sdW1uSWRlbnRpZmllcj4gZHJvcHBlZENvbHVtbnMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgIHByaXZhdGUgTG9uZyB0aW1lc3RhbXAgPSBudWxsOyAvLyB3aWxsIHVzZSBleGVjdXRpb24gdGltZXN0YW1wIGlmIG5vdCBwcm92aWRlZCBieSBxdWVyeQpAQCAtNjA0LDYgKzcwNCw3IEBACiAgICAgICAgICAgICBzd2l0Y2ggKGtpbmQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgY2FzZSAgICAgICAgICBBTFRFUl9DT0xVTU46IHJldHVybiBuZXcgQWx0ZXJDb2x1bW4oa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsIGlmVGFibGVFeGlzdHMpOworICAgICAgICAgICAgICAgIGNhc2UgICAgICAgICAgIE1BU0tfQ09MVU1OOiByZXR1cm4gbmV3IE1hc2tDb2x1bW4oa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsIG1hc2tlZENvbHVtbiwgcmF3TWFzaywgaWZUYWJsZUV4aXN0cywgaWZDb2x1bW5FeGlzdHMpOwogICAgICAgICAgICAgICAgIGNhc2UgICAgICAgICAgIEFERF9DT0xVTU5TOiByZXR1cm4gbmV3IEFkZENvbHVtbnMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsIGFkZGVkQ29sdW1ucywgaWZUYWJsZUV4aXN0cywgaWZDb2x1bW5Ob3RFeGlzdHMpOwogICAgICAgICAgICAgICAgIGNhc2UgICAgICAgICAgRFJPUF9DT0xVTU5TOiByZXR1cm4gbmV3IERyb3BDb2x1bW5zKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCBkcm9wcGVkQ29sdW1ucywgaWZUYWJsZUV4aXN0cywgaWZDb2x1bW5FeGlzdHMsIHRpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICAgY2FzZSAgICAgICAgUkVOQU1FX0NPTFVNTlM6IHJldHVybiBuZXcgUmVuYW1lQ29sdW1ucyhrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgcmVuYW1lZENvbHVtbnMsIGlmVGFibGVFeGlzdHMsIGlmQ29sdW1uRXhpc3RzKTsKQEAgLTYxOSwxMCArNzIwLDE3IEBACiAgICAgICAgICAgICBraW5kID0gS2luZC5BTFRFUl9DT0xVTU47CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBhZGQoQ29sdW1uSWRlbnRpZmllciBuYW1lLCBDUUwzVHlwZS5SYXcgdHlwZSwgYm9vbGVhbiBpc1N0YXRpYykKKyAgICAgICAgcHVibGljIHZvaWQgbWFzayhDb2x1bW5JZGVudGlmaWVyIG5hbWUsIENvbHVtbk1hc2suUmF3IG1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIGtpbmQgPSBLaW5kLk1BU0tfQ09MVU1OOworICAgICAgICAgICAgbWFza2VkQ29sdW1uID0gbmFtZTsKKyAgICAgICAgICAgIHJhd01hc2sgPSBtYXNrOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkKENvbHVtbklkZW50aWZpZXIgbmFtZSwgQ1FMM1R5cGUuUmF3IHR5cGUsIGJvb2xlYW4gaXNTdGF0aWMsIEBOdWxsYWJsZSBDb2x1bW5NYXNrLlJhdyBtYXNrKQogICAgICAgICB7CiAgICAgICAgICAgICBraW5kID0gS2luZC5BRERfQ09MVU1OUzsKLSAgICAgICAgICAgIGFkZGVkQ29sdW1ucy5hZGQobmV3IEFkZENvbHVtbnMuQ29sdW1uKG5hbWUsIHR5cGUsIGlzU3RhdGljKSk7CisgICAgICAgICAgICBhZGRlZENvbHVtbnMuYWRkKG5ldyBBZGRDb2x1bW5zLkNvbHVtbihuYW1lLCB0eXBlLCBpc1N0YXRpYywgbWFzaykpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgZHJvcChDb2x1bW5JZGVudGlmaWVyIG5hbWUpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0FsdGVyVHlwZVN0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9BbHRlclR5cGVTdGF0ZW1lbnQuamF2YQppbmRleCA5YzNiZTExLi44OWNiOTkwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0FsdGVyVHlwZVN0YXRlbWVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQWx0ZXJUeXBlU3RhdGVtZW50LmphdmEKQEAgLTE3OSw3ICsxNzksNyBAQAogICAgICAgICBVc2VyVHlwZSBhcHBseShLZXlzcGFjZU1ldGFkYXRhIGtleXNwYWNlLCBVc2VyVHlwZSB1c2VyVHlwZSkKICAgICAgICAgewogICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGRlcGVuZGVudEFnZ3JlZ2F0ZXMgPQotICAgICAgICAgICAgICAgIGtleXNwYWNlLmZ1bmN0aW9ucworICAgICAgICAgICAgICAgIGtleXNwYWNlLnVzZXJGdW5jdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgIC51ZGFzKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodWRhIC0+IG51bGwgIT0gdWRhLmluaXRpYWxDb25kaXRpb24oKSAmJiB1ZGEuc3RhdGVUeXBlKCkucmVmZXJlbmNlc1VzZXJUeXBlKHVzZXJUeXBlLm5hbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh1ZGEgLT4gdWRhLm5hbWUoKS50b1N0cmluZygpKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVBZ2dyZWdhdGVTdGF0ZW1lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQ3JlYXRlQWdncmVnYXRlU3RhdGVtZW50LmphdmEKaW5kZXggMDU1MDUxNS4uMDEwZjQ2NCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVBZ2dyZWdhdGVTdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0NyZWF0ZUFnZ3JlZ2F0ZVN0YXRlbWVudC5qYXZhCkBAIC0zMSw5ICszMSwxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSVJlc291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguUGVybWlzc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbk5hbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuU2NhbGFyRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVURBZ2dyZWdhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVURGdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5VREhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5Vc2VyRnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkZ1bmN0aW9ucy5GdW5jdGlvbnNEaWZmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Vc2VyRnVuY3Rpb25zLkZ1bmN0aW9uc0RpZmY7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VzLktleXNwYWNlc0RpZmY7CkBAIC0xMTcsOCArMTIyLDggQEAKICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHN0YXRlVHlwZSA9IHJhd1N0YXRlVHlwZS5wcmVwYXJlKGtleXNwYWNlTmFtZSwga2V5c3BhY2UudHlwZXMpLmdldFR5cGUoKS51ZGZUeXBlKCk7CiAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBzdGF0ZUZ1bmN0aW9uQXJndW1lbnRzID0gTGlzdHMubmV3QXJyYXlMaXN0KGNvbmNhdChzaW5nbGV0b24oc3RhdGVUeXBlKSwgYXJndW1lbnRUeXBlcykpOwogCi0gICAgICAgIEZ1bmN0aW9uIHN0YXRlRnVuY3Rpb24gPQotICAgICAgICAgICAga2V5c3BhY2UuZnVuY3Rpb25zCisgICAgICAgIFVzZXJGdW5jdGlvbiBzdGF0ZUZ1bmN0aW9uID0KKyAgICAgICAgICAgIGtleXNwYWNlLnVzZXJGdW5jdGlvbnMKICAgICAgICAgICAgICAgICAgICAgLmZpbmQoc3RhdGVGdW5jdGlvbk5hbWUsIHN0YXRlRnVuY3Rpb25Bcmd1bWVudHMpCiAgICAgICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBpcmUoIlN0YXRlIGZ1bmN0aW9uICVzIGRvZXNuJ3QgZXhpc3QiLCBzdGF0ZUZ1bmN0aW9uU3RyaW5nKCkpKTsKIApAQCAtMTM1LDEyICsxNDAsMTIgQEAKICAgICAgICAgICogUmVzb2x2ZSB0aGUgZmluYWwgZnVuY3Rpb24gYW5kIHJldHVybiB0eXBlCiAgICAgICAgICAqLwogCi0gICAgICAgIEZ1bmN0aW9uIGZpbmFsRnVuY3Rpb24gPSBudWxsOworICAgICAgICBVc2VyRnVuY3Rpb24gZmluYWxGdW5jdGlvbiA9IG51bGw7CiAgICAgICAgIEFic3RyYWN0VHlwZTw/PiByZXR1cm5UeXBlID0gc3RhdGVGdW5jdGlvbi5yZXR1cm5UeXBlKCk7CiAKICAgICAgICAgaWYgKG51bGwgIT0gZmluYWxGdW5jdGlvbk5hbWUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsRnVuY3Rpb24gPSBrZXlzcGFjZS5mdW5jdGlvbnMuZmluZChmaW5hbEZ1bmN0aW9uTmFtZSwgc2luZ2xldG9uTGlzdChzdGF0ZVR5cGUpKS5vckVsc2UobnVsbCk7CisgICAgICAgICAgICBmaW5hbEZ1bmN0aW9uID0ga2V5c3BhY2UudXNlckZ1bmN0aW9ucy5maW5kKGZpbmFsRnVuY3Rpb25OYW1lLCBzaW5nbGV0b25MaXN0KHN0YXRlVHlwZSkpLm9yRWxzZShudWxsKTsKICAgICAgICAgICAgIGlmIChudWxsID09IGZpbmFsRnVuY3Rpb24pCiAgICAgICAgICAgICAgICAgdGhyb3cgaXJlKCJGaW5hbCBmdW5jdGlvbiAlcyBkb2Vzbid0IGV4aXN0IiwgZmluYWxGdW5jdGlvblN0cmluZygpKTsKIApAQCAtMTk5LDcgKzIwNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNjYWxhckZ1bmN0aW9uKSBmaW5hbEZ1bmN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxWYWx1ZSk7CiAKLSAgICAgICAgRnVuY3Rpb24gZXhpc3RpbmdBZ2dyZWdhdGUgPSBrZXlzcGFjZS5mdW5jdGlvbnMuZmluZChhZ2dyZWdhdGUubmFtZSgpLCBhcmd1bWVudFR5cGVzKS5vckVsc2UobnVsbCk7CisgICAgICAgIFVzZXJGdW5jdGlvbiBleGlzdGluZ0FnZ3JlZ2F0ZSA9IGtleXNwYWNlLnVzZXJGdW5jdGlvbnMuZmluZChhZ2dyZWdhdGUubmFtZSgpLCBhcmd1bWVudFR5cGVzKS5vckVsc2UobnVsbCk7CiAgICAgICAgIGlmIChudWxsICE9IGV4aXN0aW5nQWdncmVnYXRlKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nQWdncmVnYXRlLmlzQWdncmVnYXRlKCkpCkBAIC0yMjAsNyArMjI1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBzY2hlbWEud2l0aEFkZGVkT3JVcGRhdGVkKGtleXNwYWNlLndpdGhTd2FwcGVkKGtleXNwYWNlLmZ1bmN0aW9ucy53aXRoQWRkZWRPclVwZGF0ZWQoYWdncmVnYXRlKSkpOworICAgICAgICByZXR1cm4gc2NoZW1hLndpdGhBZGRlZE9yVXBkYXRlZChrZXlzcGFjZS53aXRoU3dhcHBlZChrZXlzcGFjZS51c2VyRnVuY3Rpb25zLndpdGhBZGRlZE9yVXBkYXRlZChhZ2dyZWdhdGUpKSk7CiAgICAgfQogCiAgICAgU2NoZW1hQ2hhbmdlIHNjaGVtYUNoYW5nZUV2ZW50KEtleXNwYWNlc0RpZmYgZGlmZikKQEAgLTI0Miw3ICsyNDcsNyBAQAogICAgIHsKICAgICAgICAgRnVuY3Rpb25OYW1lIG5hbWUgPSBuZXcgRnVuY3Rpb25OYW1lKGtleXNwYWNlTmFtZSwgYWdncmVnYXRlTmFtZSk7CiAKLSAgICAgICAgaWYgKFNjaGVtYS5pbnN0YW5jZS5maW5kRnVuY3Rpb24obmFtZSwgTGlzdHMudHJhbnNmb3JtKHJhd0FyZ3VtZW50VHlwZXMsIHQgLT4gdC5wcmVwYXJlKGtleXNwYWNlTmFtZSkuZ2V0VHlwZSgpKSkuaXNQcmVzZW50KCkgJiYgb3JSZXBsYWNlKQorICAgICAgICBpZiAoU2NoZW1hLmluc3RhbmNlLmZpbmRVc2VyRnVuY3Rpb24obmFtZSwgTGlzdHMudHJhbnNmb3JtKHJhd0FyZ3VtZW50VHlwZXMsIHQgLT4gdC5wcmVwYXJlKGtleXNwYWNlTmFtZSkuZ2V0VHlwZSgpKSkuaXNQcmVzZW50KCkgJiYgb3JSZXBsYWNlKQogICAgICAgICAgICAgY2xpZW50LmVuc3VyZVBlcm1pc3Npb24oUGVybWlzc2lvbi5BTFRFUiwgRnVuY3Rpb25SZXNvdXJjZS5mdW5jdGlvbkZyb21DcWwoa2V5c3BhY2VOYW1lLCBhZ2dyZWdhdGVOYW1lLCByYXdBcmd1bWVudFR5cGVzKSk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGNsaWVudC5lbnN1cmVQZXJtaXNzaW9uKFBlcm1pc3Npb24uQ1JFQVRFLCBGdW5jdGlvblJlc291cmNlLmtleXNwYWNlKGtleXNwYWNlTmFtZSkpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVGdW5jdGlvblN0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVGdW5jdGlvblN0YXRlbWVudC5qYXZhCmluZGV4IGFkYjhmNDAuLjhlM2M3OWMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQ3JlYXRlRnVuY3Rpb25TdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0NyZWF0ZUZ1bmN0aW9uU3RhdGVtZW50LmphdmEKQEAgLTMwLDExICszMCwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5JZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5VREZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlVzZXJGdW5jdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuRnVuY3Rpb25zLkZ1bmN0aW9uc0RpZmY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlVzZXJGdW5jdGlvbnMuRnVuY3Rpb25zRGlmZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZXMuS2V5c3BhY2VzRGlmZjsKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5KTsKIAotICAgICAgICBGdW5jdGlvbiBleGlzdGluZ0Z1bmN0aW9uID0ga2V5c3BhY2UuZnVuY3Rpb25zLmZpbmQoZnVuY3Rpb24ubmFtZSgpLCBhcmd1bWVudFR5cGVzKS5vckVsc2UobnVsbCk7CisgICAgICAgIFVzZXJGdW5jdGlvbiBleGlzdGluZ0Z1bmN0aW9uID0ga2V5c3BhY2UudXNlckZ1bmN0aW9ucy5maW5kKGZ1bmN0aW9uLm5hbWUoKSwgYXJndW1lbnRUeXBlcykub3JFbHNlKG51bGwpOwogICAgICAgICBpZiAobnVsbCAhPSBleGlzdGluZ0Z1bmN0aW9uKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoZXhpc3RpbmdGdW5jdGlvbi5pc0FnZ3JlZ2F0ZSgpKQpAQCAtMTUyLDcgKzE1Miw3IEBACiAgICAgICAgICAgICAvLyBUT0RPOiB1cGRhdGUgZGVwZW5kZW50IGFnZ3JlZ2F0ZXMKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBzY2hlbWEud2l0aEFkZGVkT3JVcGRhdGVkKGtleXNwYWNlLndpdGhTd2FwcGVkKGtleXNwYWNlLmZ1bmN0aW9ucy53aXRoQWRkZWRPclVwZGF0ZWQoZnVuY3Rpb24pKSk7CisgICAgICAgIHJldHVybiBzY2hlbWEud2l0aEFkZGVkT3JVcGRhdGVkKGtleXNwYWNlLndpdGhTd2FwcGVkKGtleXNwYWNlLnVzZXJGdW5jdGlvbnMud2l0aEFkZGVkT3JVcGRhdGVkKGZ1bmN0aW9uKSkpOwogICAgIH0KIAogICAgIFNjaGVtYUNoYW5nZSBzY2hlbWFDaGFuZ2VFdmVudChLZXlzcGFjZXNEaWZmIGRpZmYpCkBAIC0xNzQsNyArMTc0LDcgQEAKICAgICB7CiAgICAgICAgIEZ1bmN0aW9uTmFtZSBuYW1lID0gbmV3IEZ1bmN0aW9uTmFtZShrZXlzcGFjZU5hbWUsIGZ1bmN0aW9uTmFtZSk7CiAKLSAgICAgICAgaWYgKFNjaGVtYS5pbnN0YW5jZS5maW5kRnVuY3Rpb24obmFtZSwgTGlzdHMudHJhbnNmb3JtKHJhd0FyZ3VtZW50VHlwZXMsIHQgLT4gdC5wcmVwYXJlKGtleXNwYWNlTmFtZSkuZ2V0VHlwZSgpLnVkZlR5cGUoKSkpLmlzUHJlc2VudCgpICYmIG9yUmVwbGFjZSkKKyAgICAgICAgaWYgKFNjaGVtYS5pbnN0YW5jZS5maW5kVXNlckZ1bmN0aW9uKG5hbWUsIExpc3RzLnRyYW5zZm9ybShyYXdBcmd1bWVudFR5cGVzLCB0IC0+IHQucHJlcGFyZShrZXlzcGFjZU5hbWUpLmdldFR5cGUoKS51ZGZUeXBlKCkpKS5pc1ByZXNlbnQoKSAmJiBvclJlcGxhY2UpCiAgICAgICAgICAgICBjbGllbnQuZW5zdXJlUGVybWlzc2lvbihQZXJtaXNzaW9uLkFMVEVSLCBGdW5jdGlvblJlc291cmNlLmZ1bmN0aW9uRnJvbUNxbChrZXlzcGFjZU5hbWUsIGZ1bmN0aW9uTmFtZSwgcmF3QXJndW1lbnRUeXBlcykpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBjbGllbnQuZW5zdXJlUGVybWlzc2lvbihQZXJtaXNzaW9uLkNSRUFURSwgRnVuY3Rpb25SZXNvdXJjZS5rZXlzcGFjZShrZXlzcGFjZU5hbWUpKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQ3JlYXRlS2V5c3BhY2VTdGF0ZW1lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQ3JlYXRlS2V5c3BhY2VTdGF0ZW1lbnQuamF2YQppbmRleCBkYzgyZjkzLi5hZDZiY2M0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0NyZWF0ZUtleXNwYWNlU3RhdGVtZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVLZXlzcGFjZVN0YXRlbWVudC5qYXZhCkBAIC0zNiw2ICszNiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkxvY2FsU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5TaW1wbGVTdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXMuT3B0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZXM7CkBAIC02Nyw2ICs2OCw5IEBACiAgICAgICAgIGlmICghYXR0cnMuaGFzT3B0aW9uKE9wdGlvbi5SRVBMSUNBVElPTikpCiAgICAgICAgICAgICB0aHJvdyBpcmUoIk1pc3NpbmcgbWFuZGF0b3J5IG9wdGlvbiAnJXMnIiwgT3B0aW9uLlJFUExJQ0FUSU9OKTsKIAorICAgICAgICBpZiAoYXR0cnMuZ2V0UmVwbGljYXRpb25TdHJhdGVneUNsYXNzKCkgIT0gbnVsbCAmJiBhdHRycy5nZXRSZXBsaWNhdGlvblN0cmF0ZWd5Q2xhc3MoKS5lcXVhbHMoU2ltcGxlU3RyYXRlZ3kuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSkKKyAgICAgICAgICAgIEd1YXJkcmFpbHMuc2ltcGxlU3RyYXRlZ3lFbmFibGVkLmVuc3VyZUVuYWJsZWQoIlNpbXBsZVN0cmF0ZWd5Iiwgc3RhdGUpOworCiAgICAgICAgIGlmIChzY2hlbWEuY29udGFpbnNLZXlzcGFjZShrZXlzcGFjZU5hbWUpKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoaWZOb3RFeGlzdHMpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0NyZWF0ZVRhYmxlU3RhdGVtZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0NyZWF0ZVRhYmxlU3RhdGVtZW50LmphdmEKaW5kZXggMWE2MjUzOC4uNDVmMjNlOSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVUYWJsZVN0YXRlbWVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvQ3JlYXRlVGFibGVTdGF0ZW1lbnQuamF2YQpAQCAtMTksNiArMTksOCBAQAogCiBpbXBvcnQgamF2YS51dGlsLio7CiAKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CkBAIC0zMyw2ICszNSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5QZXJtaXNzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmcuQ29sdW1uTWFzazsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC4qOwpAQCAtNTQsNyArNTcsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDcmVhdGVUYWJsZVN0YXRlbWVudC5jbGFzcyk7CiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFibGVOYW1lOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8Q29sdW1uSWRlbnRpZmllciwgQ1FMM1R5cGUuUmF3PiByYXdDb2x1bW5zOworICAgIHByaXZhdGUgZmluYWwgTWFwPENvbHVtbklkZW50aWZpZXIsIENvbHVtblByb3BlcnRpZXMuUmF3PiByYXdDb2x1bW5zOwogICAgIHByaXZhdGUgZmluYWwgU2V0PENvbHVtbklkZW50aWZpZXI+IHN0YXRpY0NvbHVtbnM7CiAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvbHVtbklkZW50aWZpZXI+IHBhcnRpdGlvbktleUNvbHVtbnM7CiAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvbHVtbklkZW50aWZpZXI+IGNsdXN0ZXJpbmdDb2x1bW5zOwpAQCAtNjcsMTUgKzcwLDEyIEBACiAKICAgICBwdWJsaWMgQ3JlYXRlVGFibGVTdGF0ZW1lbnQoU3RyaW5nIGtleXNwYWNlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSwKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Q29sdW1uSWRlbnRpZmllciwgQ1FMM1R5cGUuUmF3PiByYXdDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Q29sdW1uSWRlbnRpZmllciwgQ29sdW1uUHJvcGVydGllcy5SYXc+IHJhd0NvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb2x1bW5JZGVudGlmaWVyPiBzdGF0aWNDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PENvbHVtbklkZW50aWZpZXI+IHBhcnRpdGlvbktleUNvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q29sdW1uSWRlbnRpZmllcj4gY2x1c3RlcmluZ0NvbHVtbnMsCi0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua2VkSGFzaE1hcDxDb2x1bW5JZGVudGlmaWVyLCBCb29sZWFuPiBjbHVzdGVyaW5nT3JkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlQXR0cmlidXRlcyBhdHRycywKLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlmTm90RXhpc3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVzZUNvbXBhY3RTdG9yYWdlKQogICAgIHsKQEAgLTE0OSw2ICsxNDksMTUgQEAKICAgICAgICAgLy8gR3VhcmRyYWlsIHRvIGNoZWNrIHdoZXRoZXIgY3JlYXRpb24gb2YgbmV3IENPTVBBQ1QgU1RPUkFHRSB0YWJsZXMgaXMgYWxsb3dlZAogICAgICAgICBpZiAodXNlQ29tcGFjdFN0b3JhZ2UpCiAgICAgICAgICAgICBHdWFyZHJhaWxzLmNvbXBhY3RUYWJsZXNFbmFibGVkLmVuc3VyZUVuYWJsZWQoc3RhdGUpOworCisgICAgICAgIHZhbGlkYXRlRGVmYXVsdFRpbWVUb0xpdmUoYXR0cnMuYXNOZXdUYWJsZVBhcmFtcygpKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCBkeW5hbWljIGRhdGEgbWFza2luZyBpcyBlbmFibGVkIGlmIHRoZXJlIGFyZSBtYXNrZWQgY29sdW1ucworICAgICAgICBmb3IgKENvbHVtblByb3BlcnRpZXMuUmF3IHJhdyA6IHJhd0NvbHVtbnMudmFsdWVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyYXcucmF3TWFzayAhPSBudWxsKQorICAgICAgICAgICAgICAgIENvbHVtbk1hc2suZW5zdXJlRW5hYmxlZCgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgU2NoZW1hQ2hhbmdlIHNjaGVtYUNoYW5nZUV2ZW50KEtleXNwYWNlc0RpZmYgZGlmZikKQEAgLTE4NCwxNSArMTkzLDE2IEBACiAgICAgICAgIFRhYmxlUGFyYW1zIHBhcmFtcyA9IGF0dHJzLmFzTmV3VGFibGVQYXJhbXMoKTsKIAogICAgICAgICAvLyB1c2UgYSBUcmVlTWFwIHRvIHByZXNlcnZlIG9yZGVyaW5nIGFjcm9zcyBKREsgdmVyc2lvbnMgKHNlZSBDQVNTQU5EUkEtOTQ5MikgLSBpbXBvcnRhbnQgZm9yIHN0YWJsZSB1bml0IHRlc3RzCi0gICAgICAgIE1hcDxDb2x1bW5JZGVudGlmaWVyLCBDUUwzVHlwZT4gY29sdW1ucyA9IG5ldyBUcmVlTWFwPD4oY29tcGFyaW5nKG8gLT4gby5ieXRlcykpOwotICAgICAgICByYXdDb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgdHlwZSkgLT4gY29sdW1ucy5wdXQoY29sdW1uLCB0eXBlLnByZXBhcmUoa2V5c3BhY2VOYW1lLCB0eXBlcykpKTsKKyAgICAgICAgTWFwPENvbHVtbklkZW50aWZpZXIsIENvbHVtblByb3BlcnRpZXM+IGNvbHVtbnMgPSBuZXcgVHJlZU1hcDw+KGNvbXBhcmluZyhvIC0+IG8uYnl0ZXMpKTsKKyAgICAgICAgcmF3Q29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIHByb3BlcnRpZXMpIC0+IGNvbHVtbnMucHV0KGNvbHVtbiwgcHJvcGVydGllcy5wcmVwYXJlKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCBjb2x1bW4sIHR5cGVzKSkpOwogCiAgICAgICAgIC8vIGNoZWNrIGZvciBuZXN0ZWQgbm9uLWZyb3plbiBVRFRzIG9yIGNvbGxlY3Rpb25zIGluIGEgbm9uLWZyb3plbiBVRFQKLSAgICAgICAgY29sdW1ucy5mb3JFYWNoKChjb2x1bW4sIHR5cGUpIC0+CisgICAgICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCBwcm9wZXJ0aWVzKSAtPgogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodHlwZS5pc1VEVCgpICYmIHR5cGUuZ2V0VHlwZSgpLmlzTXVsdGlDZWxsKCkpCisgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IHByb3BlcnRpZXMudHlwZTsKKyAgICAgICAgICAgIGlmICh0eXBlLmlzVURUKCkgJiYgdHlwZS5pc011bHRpQ2VsbCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoVXNlclR5cGUpIHR5cGUuZ2V0VHlwZSgpKS5maWVsZFR5cGVzKCkuZm9yRWFjaChmaWVsZCAtPgorICAgICAgICAgICAgICAgICgoVXNlclR5cGUpIHR5cGUpLmZpZWxkVHlwZXMoKS5mb3JFYWNoKGZpZWxkIC0+CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuaXNNdWx0aUNlbGwoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlyZSgiTm9uLWZyb3plbiBVRFRzIHdpdGggbmVzdGVkIG5vbi1mcm96ZW4gY29sbGVjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKQEAgLTIwNyw0NSArMjE3LDQ3IEBACiAgICAgICAgIEhhc2hTZXQ8Q29sdW1uSWRlbnRpZmllcj4gcHJpbWFyeUtleUNvbHVtbnMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgIGNvbmNhdChwYXJ0aXRpb25LZXlDb2x1bW5zLCBjbHVzdGVyaW5nQ29sdW1ucykuZm9yRWFjaChjb2x1bW4gLT4KICAgICAgICAgewotICAgICAgICAgICAgQ1FMM1R5cGUgdHlwZSA9IGNvbHVtbnMuZ2V0KGNvbHVtbik7Ci0gICAgICAgICAgICBpZiAobnVsbCA9PSB0eXBlKQorICAgICAgICAgICAgQ29sdW1uUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gY29sdW1ucy5nZXQoY29sdW1uKTsKKyAgICAgICAgICAgIGlmIChudWxsID09IHByb3BlcnRpZXMpCiAgICAgICAgICAgICAgICAgdGhyb3cgaXJlKCJVbmtub3duIGNvbHVtbiAnJXMnIHJlZmVyZW5jZWQgaW4gUFJJTUFSWSBLRVkgZm9yIHRhYmxlICclcyciLCBjb2x1bW4sIHRhYmxlTmFtZSk7CiAKICAgICAgICAgICAgIGlmICghcHJpbWFyeUtleUNvbHVtbnMuYWRkKGNvbHVtbikpCiAgICAgICAgICAgICAgICAgdGhyb3cgaXJlKCJEdXBsaWNhdGUgY29sdW1uICclcycgaW4gUFJJTUFSWSBLRVkgY2xhdXNlIGZvciB0YWJsZSAnJXMnIiwgY29sdW1uLCB0YWJsZU5hbWUpOwogCi0gICAgICAgICAgICBpZiAodHlwZS5nZXRUeXBlKCkuaXNNdWx0aUNlbGwoKSkKKyAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gcHJvcGVydGllcy50eXBlOworICAgICAgICAgICAgaWYgKHR5cGUuaXNNdWx0aUNlbGwoKSkKICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDUUwzVHlwZSBjcWxUeXBlID0gcHJvcGVydGllcy5jcWxUeXBlOwogICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzQ29sbGVjdGlvbigpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBpcmUoIkludmFsaWQgbm9uLWZyb3plbiBjb2xsZWN0aW9uIHR5cGUgJXMgZm9yIFBSSU1BUlkgS0VZIGNvbHVtbiAnJXMnIiwgdHlwZSwgY29sdW1uKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgaXJlKCJJbnZhbGlkIG5vbi1mcm96ZW4gY29sbGVjdGlvbiB0eXBlICVzIGZvciBQUklNQVJZIEtFWSBjb2x1bW4gJyVzJyIsIGNxbFR5cGUsIGNvbHVtbik7CiAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBpcmUoIkludmFsaWQgbm9uLWZyb3plbiB1c2VyLWRlZmluZWQgdHlwZSAlcyBmb3IgUFJJTUFSWSBLRVkgY29sdW1uICclcyciLCB0eXBlLCBjb2x1bW4pOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBpcmUoIkludmFsaWQgbm9uLWZyb3plbiB1c2VyLWRlZmluZWQgdHlwZSAlcyBmb3IgUFJJTUFSWSBLRVkgY29sdW1uICclcyciLCBjcWxUeXBlLCBjb2x1bW4pOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAodHlwZS5nZXRUeXBlKCkuaXNDb3VudGVyKCkpCisgICAgICAgICAgICBpZiAodHlwZS5pc0NvdW50ZXIoKSkKICAgICAgICAgICAgICAgICB0aHJvdyBpcmUoImNvdW50ZXIgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBQUklNQVJZIEtFWSBjb2x1bW4gJyVzJyIsIGNvbHVtbik7CiAKLSAgICAgICAgICAgIGlmICh0eXBlLmdldFR5cGUoKS5yZWZlcmVuY2VzRHVyYXRpb24oKSkKKyAgICAgICAgICAgIGlmICh0eXBlLnJlZmVyZW5jZXNEdXJhdGlvbigpKQogICAgICAgICAgICAgICAgIHRocm93IGlyZSgiZHVyYXRpb24gdHlwZSBpcyBub3Qgc3VwcG9ydGVkIGZvciBQUklNQVJZIEtFWSBjb2x1bW4gJyVzJyIsIGNvbHVtbik7CiAKICAgICAgICAgICAgIGlmIChzdGF0aWNDb2x1bW5zLmNvbnRhaW5zKGNvbHVtbikpCiAgICAgICAgICAgICAgICAgdGhyb3cgaXJlKCJTdGF0aWMgY29sdW1uICclcycgY2Fubm90IGJlIHBhcnQgb2YgdGhlIFBSSU1BUlkgS0VZIiwgY29sdW1uKTsKICAgICAgICAgfSk7CiAKLSAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHBhcnRpdGlvbktleVR5cGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBjbHVzdGVyaW5nVHlwZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxDb2x1bW5Qcm9wZXJ0aWVzPiBwYXJ0aXRpb25LZXlDb2x1bW5Qcm9wZXJ0aWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Q29sdW1uUHJvcGVydGllcz4gY2x1c3RlcmluZ0NvbHVtblByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgICAgICBwYXJ0aXRpb25LZXlDb2x1bW5zLmZvckVhY2goY29sdW1uIC0+CiAgICAgICAgIHsKLSAgICAgICAgICAgIENRTDNUeXBlIHR5cGUgPSBjb2x1bW5zLnJlbW92ZShjb2x1bW4pOwotICAgICAgICAgICAgcGFydGl0aW9uS2V5VHlwZXMuYWRkKHR5cGUuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIENvbHVtblByb3BlcnRpZXMgY29sdW1uUHJvcGVydGllcyA9IGNvbHVtbnMucmVtb3ZlKGNvbHVtbik7CisgICAgICAgICAgICBwYXJ0aXRpb25LZXlDb2x1bW5Qcm9wZXJ0aWVzLmFkZChjb2x1bW5Qcm9wZXJ0aWVzKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgY2x1c3RlcmluZ0NvbHVtbnMuZm9yRWFjaChjb2x1bW4gLT4KICAgICAgICAgewotICAgICAgICAgICAgQ1FMM1R5cGUgdHlwZSA9IGNvbHVtbnMucmVtb3ZlKGNvbHVtbik7CisgICAgICAgICAgICBDb2x1bW5Qcm9wZXJ0aWVzIGNvbHVtblByb3BlcnRpZXMgPSBjb2x1bW5zLnJlbW92ZShjb2x1bW4pOwogICAgICAgICAgICAgYm9vbGVhbiByZXZlcnNlID0gIWNsdXN0ZXJpbmdPcmRlci5nZXRPckRlZmF1bHQoY29sdW1uLCB0cnVlKTsKLSAgICAgICAgICAgIGNsdXN0ZXJpbmdUeXBlcy5hZGQocmV2ZXJzZSA/IFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZSh0eXBlLmdldFR5cGUoKSkgOiB0eXBlLmdldFR5cGUoKSk7CisgICAgICAgICAgICBjbHVzdGVyaW5nQ29sdW1uUHJvcGVydGllcy5hZGQocmV2ZXJzZSA/IGNvbHVtblByb3BlcnRpZXMud2l0aFJldmVyc2VkVHlwZSgpIDogY29sdW1uUHJvcGVydGllcyk7CiAgICAgICAgIH0pOwogCiAgICAgICAgIGlmIChjbHVzdGVyaW5nT3JkZXIuc2l6ZSgpID4gY2x1c3RlcmluZ0NvbHVtbnMuc2l6ZSgpKQpAQCAtMjY4LDcgKzI4MCw3IEBACiAgICAgICAgIC8vIEZvciBDT01QQUNUIFNUT1JBR0UsIHdlIHJlamVjdCBhbnkgImZlYXR1cmUiIHRoYXQgd2Ugd291bGRuJ3QgYmUgYWJsZSB0byB0cmFuc2xhdGUgYmFjayB0byB0aHJpZnQuCiAgICAgICAgIGlmICh1c2VDb21wYWN0U3RvcmFnZSkKICAgICAgICAgewotICAgICAgICAgICAgdmFsaWRhdGVDb21wYWN0VGFibGUoY2x1c3RlcmluZ1R5cGVzLCBjb2x1bW5zKTsKKyAgICAgICAgICAgIHZhbGlkYXRlQ29tcGFjdFRhYmxlKGNsdXN0ZXJpbmdDb2x1bW5Qcm9wZXJ0aWVzLCBjb2x1bW5zKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKQEAgLTI4MSwxMiArMjkzLDEyIEBACiAgICAgICAgICAqIENvdW50ZXIgdGFibGUgdmFsaWRhdGlvbgogICAgICAgICAgKi8KIAotICAgICAgICBib29sZWFuIGhhc0NvdW50ZXJzID0gcmF3Q29sdW1ucy52YWx1ZXMoKS5zdHJlYW0oKS5hbnlNYXRjaChDUUwzVHlwZS5SYXc6OmlzQ291bnRlcik7CisgICAgICAgIGJvb2xlYW4gaGFzQ291bnRlcnMgPSByYXdDb2x1bW5zLnZhbHVlcygpLnN0cmVhbSgpLmFueU1hdGNoKGMgLT4gYy5yYXdUeXBlLmlzQ291bnRlcigpKTsKICAgICAgICAgaWYgKGhhc0NvdW50ZXJzKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyBXZSd2ZSBoYW5kbGVkIGFueXRoaW5nIHRoYXQgaXMgbm90IGEgUFJJTUFSWSBLRVkgc28gY29sdW1ucyBvbmx5IGNvbnRhaW5zIE5PTi1QSyBjb2x1bW5zLiBTbwogICAgICAgICAgICAgLy8gaWYgaXQncyBhIGNvdW50ZXIgdGFibGUsIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIG5vbi1jb3VudGVyIHR5cGVzCi0gICAgICAgICAgICBpZiAoY29sdW1ucy52YWx1ZXMoKS5zdHJlYW0oKS5hbnlNYXRjaCh0IC0+ICF0LmdldFR5cGUoKS5pc0NvdW50ZXIoKSkpCisgICAgICAgICAgICBpZiAoY29sdW1ucy52YWx1ZXMoKS5zdHJlYW0oKS5hbnlNYXRjaCh0IC0+ICF0LnR5cGUuaXNDb3VudGVyKCkpKQogICAgICAgICAgICAgICAgIHRocm93IGlyZSgiQ2Fubm90IG1peCBjb3VudGVyIGFuZCBub24gY291bnRlciBjb2x1bW5zIGluIHRoZSBzYW1lIHRhYmxlIik7CiAKICAgICAgICAgICAgIGlmIChwYXJhbXMuZGVmYXVsdFRpbWVUb0xpdmUgPiAwKQpAQCAtMzA2LDM4ICszMTgsNDQgQEAKICAgICAgICAgICAgICAgIC5wYXJhbXMocGFyYW1zKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpdGlvbktleUNvbHVtbnMuc2l6ZSgpOyBpKyspCi0gICAgICAgICAgICBidWlsZGVyLmFkZFBhcnRpdGlvbktleUNvbHVtbihwYXJ0aXRpb25LZXlDb2x1bW5zLmdldChpKSwgcGFydGl0aW9uS2V5VHlwZXMuZ2V0KGkpKTsKKyAgICAgICAgeworICAgICAgICAgICAgQ29sdW1uUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gcGFydGl0aW9uS2V5Q29sdW1uUHJvcGVydGllcy5nZXQoaSk7CisgICAgICAgICAgICBidWlsZGVyLmFkZFBhcnRpdGlvbktleUNvbHVtbihwYXJ0aXRpb25LZXlDb2x1bW5zLmdldChpKSwgcHJvcGVydGllcy50eXBlLCBwcm9wZXJ0aWVzLm1hc2spOworICAgICAgICB9CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbHVzdGVyaW5nQ29sdW1ucy5zaXplKCk7IGkrKykKLSAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ2x1c3RlcmluZ0NvbHVtbihjbHVzdGVyaW5nQ29sdW1ucy5nZXQoaSksIGNsdXN0ZXJpbmdUeXBlcy5nZXQoaSkpOworICAgICAgICB7CisgICAgICAgICAgICBDb2x1bW5Qcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBjbHVzdGVyaW5nQ29sdW1uUHJvcGVydGllcy5nZXQoaSk7CisgICAgICAgICAgICBidWlsZGVyLmFkZENsdXN0ZXJpbmdDb2x1bW4oY2x1c3RlcmluZ0NvbHVtbnMuZ2V0KGkpLCBwcm9wZXJ0aWVzLnR5cGUsIHByb3BlcnRpZXMubWFzayk7CisgICAgICAgIH0KIAogICAgICAgICBpZiAodXNlQ29tcGFjdFN0b3JhZ2UpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpeHVwQ29tcGFjdFRhYmxlKGNsdXN0ZXJpbmdUeXBlcywgY29sdW1ucywgaGFzQ291bnRlcnMsIGJ1aWxkZXIpOworICAgICAgICAgICAgZml4dXBDb21wYWN0VGFibGUoY2x1c3RlcmluZ0NvbHVtblByb3BlcnRpZXMsIGNvbHVtbnMsIGhhc0NvdW50ZXJzLCBidWlsZGVyKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uLCB0eXBlKSAtPiB7CisgICAgICAgICAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbiwgcHJvcGVydGllcykgLT4gewogICAgICAgICAgICAgICAgIGlmIChzdGF0aWNDb2x1bW5zLmNvbnRhaW5zKGNvbHVtbikpCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkU3RhdGljQ29sdW1uKGNvbHVtbiwgdHlwZS5nZXRUeXBlKCkpOworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFN0YXRpY0NvbHVtbihjb2x1bW4sIHByb3BlcnRpZXMudHlwZSwgcHJvcGVydGllcy5tYXNrKTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkUmVndWxhckNvbHVtbihjb2x1bW4sIHR5cGUuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRSZWd1bGFyQ29sdW1uKGNvbHVtbiwgcHJvcGVydGllcy50eXBlLCBwcm9wZXJ0aWVzLm1hc2spOwogICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29tcGFjdFRhYmxlKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBjbHVzdGVyaW5nVHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxDb2x1bW5JZGVudGlmaWVyLCBDUUwzVHlwZT4gY29sdW1ucykKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVDb21wYWN0VGFibGUoTGlzdDxDb2x1bW5Qcm9wZXJ0aWVzPiBjbHVzdGVyaW5nQ29sdW1uUHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPENvbHVtbklkZW50aWZpZXIsIENvbHVtblByb3BlcnRpZXM+IGNvbHVtbnMpCiAgICAgewotICAgICAgICBib29sZWFuIGlzRGVuc2UgPSAhY2x1c3RlcmluZ1R5cGVzLmlzRW1wdHkoKTsKKyAgICAgICAgYm9vbGVhbiBpc0RlbnNlID0gIWNsdXN0ZXJpbmdDb2x1bW5Qcm9wZXJ0aWVzLmlzRW1wdHkoKTsKIAotICAgICAgICBpZiAoY29sdW1ucy52YWx1ZXMoKS5zdHJlYW0oKS5hbnlNYXRjaChjIC0+IGMuZ2V0VHlwZSgpLmlzTXVsdGlDZWxsKCkpKQorICAgICAgICBpZiAoY29sdW1ucy52YWx1ZXMoKS5zdHJlYW0oKS5hbnlNYXRjaChjIC0+IGMudHlwZS5pc011bHRpQ2VsbCgpKSkKICAgICAgICAgICAgIHRocm93IGlyZSgiTm9uLWZyb3plbiBjb2xsZWN0aW9ucyBhbmQgVURUcyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIENPTVBBQ1QgU1RPUkFHRSIpOwogICAgICAgICBpZiAoIXN0YXRpY0NvbHVtbnMuaXNFbXB0eSgpKQogICAgICAgICAgICAgdGhyb3cgaXJlKCJTdGF0aWMgY29sdW1ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiBDT01QQUNUIFNUT1JBR0UgdGFibGVzIik7CiAKLSAgICAgICAgaWYgKGNsdXN0ZXJpbmdUeXBlcy5pc0VtcHR5KCkpCisgICAgICAgIGlmIChjbHVzdGVyaW5nQ29sdW1uUHJvcGVydGllcy5pc0VtcHR5KCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIEl0J3MgYSB0aHJpZnQgInN0YXRpYyBDRiIgc28gdGhlcmUgc2hvdWxkIGJlIHNvbWUgY29sdW1ucyBkZWZpbml0aW9uCiAgICAgICAgICAgICBpZiAoY29sdW1ucy5pc0VtcHR5KCkpCkBAIC0zNTksOCArMzc3LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBmaXh1cENvbXBhY3RUYWJsZShMaXN0PEFic3RyYWN0VHlwZTw/Pj4gY2x1c3RlcmluZ1R5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Q29sdW1uSWRlbnRpZmllciwgQ1FMM1R5cGU+IGNvbHVtbnMsCisgICAgcHJpdmF0ZSB2b2lkIGZpeHVwQ29tcGFjdFRhYmxlKExpc3Q8Q29sdW1uUHJvcGVydGllcz4gY2x1c3RlcmluZ1R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Q29sdW1uSWRlbnRpZmllciwgQ29sdW1uUHJvcGVydGllcz4gY29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNDb3VudGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YS5CdWlsZGVyIGJ1aWxkZXIpCiAgICAgewpAQCAtMzc5LDEyICszOTcsMTIgQEAKIAogICAgICAgICBidWlsZGVyLmZsYWdzKGZsYWdzKTsKIAotICAgICAgICBjb2x1bW5zLmZvckVhY2goKG5hbWUsIHR5cGUpIC0+IHsKKyAgICAgICAgY29sdW1ucy5mb3JFYWNoKChuYW1lLCBwcm9wZXJ0aWVzKSAtPiB7CiAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgZm9yICJzdGF0aWMiIG5vLWNsdXN0ZXJpbmcgY29tcGFjdCBzdG9yYWdlIHdlIHVzZSBzdGF0aWMgZm9yIHRoZSBkZWZpbmVkIGNvbHVtbnMKICAgICAgICAgICAgIGlmIChzdGF0aWNDb2x1bW5zLmNvbnRhaW5zKG5hbWUpIHx8IGlzU3RhdGljQ29tcGFjdCkKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFN0YXRpY0NvbHVtbihuYW1lLCB0eXBlLmdldFR5cGUoKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRTdGF0aWNDb2x1bW4obmFtZSwgcHJvcGVydGllcy50eXBlLCBwcm9wZXJ0aWVzLm1hc2spOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkUmVndWxhckNvbHVtbihuYW1lLCB0eXBlLmdldFR5cGUoKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRSZWd1bGFyQ29sdW1uKG5hbWUsIHByb3BlcnRpZXMudHlwZSwgcHJvcGVydGllcy5tYXNrKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgRGVmYXVsdE5hbWVzIG5hbWVzID0gbmV3IERlZmF1bHROYW1lcyhidWlsZGVyLmNvbHVtbk5hbWVzKCkpOwpAQCAtNDY5LDcgKzQ4Nyw3IEBACiAgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpZk5vdEV4aXN0czsKIAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gdXNlQ29tcGFjdFN0b3JhZ2UgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8Q29sdW1uSWRlbnRpZmllciwgQ1FMM1R5cGUuUmF3PiByYXdDb2x1bW5zID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxDb2x1bW5JZGVudGlmaWVyLCBDb2x1bW5Qcm9wZXJ0aWVzLlJhdz4gcmF3Q29sdW1ucyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Q29sdW1uSWRlbnRpZmllcj4gc3RhdGljQ29sdW1ucyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENvbHVtbklkZW50aWZpZXI+IGNsdXN0ZXJpbmdDb2x1bW5zID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKQEAgLTQ5MywxNSArNTExLDEyIEBACiAKICAgICAgICAgICAgIHJldHVybiBuZXcgQ3JlYXRlVGFibGVTdGF0ZW1lbnQoa2V5c3BhY2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmdldE5hbWUoKSwKLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25LZXlDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nQ29sdW1ucywKLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nT3JkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLAotCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmTm90RXhpc3RzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VDb21wYWN0U3RvcmFnZSk7CiAgICAgICAgIH0KQEAgLTUyMiw5ICs1MzcsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBuYW1lLmdldE5hbWUoKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZENvbHVtbihDb2x1bW5JZGVudGlmaWVyIGNvbHVtbiwgQ1FMM1R5cGUuUmF3IHR5cGUsIGJvb2xlYW4gaXNTdGF0aWMpCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZENvbHVtbihDb2x1bW5JZGVudGlmaWVyIGNvbHVtbiwgQ1FMM1R5cGUuUmF3IHR5cGUsIGJvb2xlYW4gaXNTdGF0aWMsIENvbHVtbk1hc2suUmF3IG1hc2spCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChudWxsICE9IHJhd0NvbHVtbnMucHV0KGNvbHVtbiwgdHlwZSkpCisKKyAgICAgICAgICAgIGlmIChudWxsICE9IHJhd0NvbHVtbnMucHV0KGNvbHVtbiwgbmV3IENvbHVtblByb3BlcnRpZXMuUmF3KHR5cGUsIG1hc2spKSkKICAgICAgICAgICAgICAgICB0aHJvdyBpcmUoIkR1cGxpY2F0ZSBjb2x1bW4gJyVzJyBkZWNsYXJhdGlvbiBmb3IgdGFibGUgJyVzJyIsIGNvbHVtbiwgbmFtZSk7CiAKICAgICAgICAgICAgIGlmIChpc1N0YXRpYykKQEAgLTU2MCw0ICs1NzYsNTIgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBpcmUoIkR1cGxpY2F0ZSBjb2x1bW4gJyVzJyBpbiBDTFVTVEVSSU5HIE9SREVSIEJZIGNsYXVzZSBmb3IgdGFibGUgJyVzJyIsIGNvbHVtbiwgbmFtZSk7CiAgICAgICAgIH0KICAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyBlbmNhcHN1bGF0aW5nIHRoZSBwcm9wZXJ0aWVzIG9mIGEgY29sdW1uLCB3aGljaCBhcmUgaXRzIHR5cGUgYW5kIG1hc2suCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgQ29sdW1uUHJvcGVydGllcworICAgIHsKKyAgICAgICAgcHVibGljIGZpbmFsIEFic3RyYWN0VHlwZTw/PiB0eXBlOworICAgICAgICBwdWJsaWMgZmluYWwgQ1FMM1R5cGUgY3FsVHlwZTsgLy8gd2Uga2VlcCB0aGUgb3JpZ2luYWwgQ1FMIHR5cGUgZm9yIHByaW50aW5nIGZ1bGx5IHF1YWxpZmllZCB1c2VyIHR5cGUgbmFtZXMKKworICAgICAgICBATnVsbGFibGUKKyAgICAgICAgcHVibGljIGZpbmFsIENvbHVtbk1hc2sgbWFzazsKKworICAgICAgICBwdWJsaWMgQ29sdW1uUHJvcGVydGllcyhBYnN0cmFjdFR5cGU8Pz4gdHlwZSwgQ1FMM1R5cGUgY3FsVHlwZSwgQE51bGxhYmxlIENvbHVtbk1hc2sgbWFzaykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRoaXMuY3FsVHlwZSA9IGNxbFR5cGU7CisgICAgICAgICAgICB0aGlzLm1hc2sgPSBtYXNrOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbHVtblByb3BlcnRpZXMgd2l0aFJldmVyc2VkVHlwZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29sdW1uUHJvcGVydGllcyhSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UodHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3FsVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrID09IG51bGwgPyBudWxsIDogbWFzay53aXRoUmV2ZXJzZWRUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBSYXcKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIGZpbmFsIENRTDNUeXBlLlJhdyByYXdUeXBlOworCisgICAgICAgICAgICBATnVsbGFibGUKKyAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBDb2x1bW5NYXNrLlJhdyByYXdNYXNrOworCisgICAgICAgICAgICBwdWJsaWMgUmF3KENRTDNUeXBlLlJhdyByYXdUeXBlLCBATnVsbGFibGUgQ29sdW1uTWFzay5SYXcgcmF3TWFzaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLnJhd1R5cGUgPSByYXdUeXBlOworICAgICAgICAgICAgICAgIHRoaXMucmF3TWFzayA9IHJhd01hc2s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBDb2x1bW5Qcm9wZXJ0aWVzIHByZXBhcmUoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUsIENvbHVtbklkZW50aWZpZXIgY29sdW1uLCBUeXBlcyB1ZHRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENRTDNUeXBlIGNxbFR5cGUgPSByYXdUeXBlLnByZXBhcmUoa2V5c3BhY2UsIHVkdHMpOworICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gY3FsVHlwZS5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgQ29sdW1uTWFzayBtYXNrID0gcmF3TWFzayA9PSBudWxsID8gbnVsbCA6IHJhd01hc2sucHJlcGFyZShrZXlzcGFjZSwgdGFibGUsIGNvbHVtbiwgdHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5Qcm9wZXJ0aWVzKHR5cGUsIGNxbFR5cGUsIG1hc2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9DcmVhdGVWaWV3U3RhdGVtZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0NyZWF0ZVZpZXdTdGF0ZW1lbnQuamF2YQppbmRleCAxNDVjOGZjLi5lZDdhOWExIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0NyZWF0ZVZpZXdTdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0NyZWF0ZVZpZXdTdGF0ZW1lbnQuamF2YQpAQCAtNTAsNiArNTAsNyBAQAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5jb25jYXQ7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmZpbHRlcjsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMudHJhbnNmb3JtOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk1WX0FMTE9XX0ZJTFRFUklOR19OT05LRVlfQ09MVU1OU19VTlNBRkU7CiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBDcmVhdGVWaWV3U3RhdGVtZW50IGV4dGVuZHMgQWx0ZXJTY2hlbWFTdGF0ZW1lbnQKIHsKQEAgLTE4OCw3ICsxODksOCBAQAogICAgICAgICAgICAgICAgIHRocm93IGlyZSgiQ2FuIG9ubHkgc2VsZWN0IGNvbHVtbnMgYnkgbmFtZSB3aGVuIGRlZmluaW5nIGEgbWF0ZXJpYWxpemVkIHZpZXcgKGdvdCAlcykiLCBzZWxlY3Rvci5zZWxlY3RhYmxlKTsKIAogICAgICAgICAgICAgLy8gd2lsbCB0aHJvdyBJUkUgaWYgdGhlIGNvbHVtbiBkb2Vzbid0IGV4aXN0IGluIHRoZSBiYXNlIHRhYmxlCi0gICAgICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW4gPSAoQ29sdW1uTWV0YWRhdGEpIHNlbGVjdG9yLnNlbGVjdGFibGUucHJlcGFyZSh0YWJsZSk7CisgICAgICAgICAgICBTZWxlY3RhYmxlLlJhd0lkZW50aWZpZXIgcmF3SWRlbnRpZmllciA9IChTZWxlY3RhYmxlLlJhd0lkZW50aWZpZXIpIHNlbGVjdG9yLnNlbGVjdGFibGU7CisgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW4gPSByYXdJZGVudGlmaWVyLmNvbHVtbk1ldGFkYXRhKHRhYmxlKTsKIAogICAgICAgICAgICAgc2VsZWN0ZWRDb2x1bW5zLmFkZChjb2x1bW4ubmFtZSk7CiAgICAgICAgIH0pOwpAQCAtMjcyLDcgKzI3NCw4IEBACiAgICAgICAgICAgICB0aHJvdyBpcmUoIldIRVJFIGNsYXVzZSBmb3IgbWF0ZXJpYWxpemVkIHZpZXcgJyVzJyBjYW5ub3QgY29udGFpbiBjdXN0b20gaW5kZXggZXhwcmVzc2lvbnMiLCB2aWV3TmFtZSk7CiAKICAgICAgICAgU3RhdGVtZW50UmVzdHJpY3Rpb25zIHJlc3RyaWN0aW9ucyA9Ci0gICAgICAgICAgICBuZXcgU3RhdGVtZW50UmVzdHJpY3Rpb25zKFN0YXRlbWVudFR5cGUuU0VMRUNULAorICAgICAgICAgICAgbmV3IFN0YXRlbWVudFJlc3RyaWN0aW9ucyhzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGVtZW50VHlwZS5TRUxFQ1QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUNsYXVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFibGVTcGVjaWZpY2F0aW9ucy5lbXB0eSgpLApAQCAtMjkyLDcgKzI5NSw3IEBACiAKICAgICAgICAgLy8gU2VlIENBU1NBTkRSQS0xMzc5OAogICAgICAgICBTZXQ8Q29sdW1uTWV0YWRhdGE+IHJlc3RyaWN0ZWROb25QcmltYXJ5S2V5Q29sdW1ucyA9IHJlc3RyaWN0aW9ucy5ub25QS1Jlc3RyaWN0ZWRDb2x1bW5zKGZhbHNlKTsKLSAgICAgICAgaWYgKCFyZXN0cmljdGVkTm9uUHJpbWFyeUtleUNvbHVtbnMuaXNFbXB0eSgpICYmICFCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5tdi5hbGxvd19maWx0ZXJpbmdfbm9ua2V5X2NvbHVtbnNfdW5zYWZlIikpCisgICAgICAgIGlmICghcmVzdHJpY3RlZE5vblByaW1hcnlLZXlDb2x1bW5zLmlzRW1wdHkoKSAmJiAhTVZfQUxMT1dfRklMVEVSSU5HX05PTktFWV9DT0xVTU5TX1VOU0FGRS5nZXRCb29sZWFuKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IGlyZSgiTm9uLXByaW1hcnkga2V5IGNvbHVtbnMgY2FuIG9ubHkgYmUgcmVzdHJpY3RlZCB3aXRoICdJUyBOT1QgTlVMTCcgKGdvdDogJXMgcmVzdHJpY3RlZCBpbGxlZ2FsbHkpIiwKICAgICAgICAgICAgICAgICAgICAgICBqb2luKCIsIiwgdHJhbnNmb3JtKHJlc3RyaWN0ZWROb25QcmltYXJ5S2V5Q29sdW1ucywgQ29sdW1uTWV0YWRhdGE6OnRvU3RyaW5nKSkpOwpAQCAtMzI0LDEyICszMjcsMTggQEAKICAgICAgICAgYnVpbGRlci5wYXJhbXMoYXR0cnMuYXNOZXdUYWJsZVBhcmFtcygpKQogICAgICAgICAgICAgICAgLmtpbmQoVGFibGVNZXRhZGF0YS5LaW5kLlZJRVcpOwogCi0gICAgICAgIHBhcnRpdGlvbktleUNvbHVtbnMuZm9yRWFjaChuYW1lIC0+IGJ1aWxkZXIuYWRkUGFydGl0aW9uS2V5Q29sdW1uKG5hbWUsIGdldFR5cGUodGFibGUsIG5hbWUpKSk7Ci0gICAgICAgIGNsdXN0ZXJpbmdDb2x1bW5zLmZvckVhY2gobmFtZSAtPiBidWlsZGVyLmFkZENsdXN0ZXJpbmdDb2x1bW4obmFtZSwgZ2V0VHlwZSh0YWJsZSwgbmFtZSkpKTsKKyAgICAgICAgcGFydGl0aW9uS2V5Q29sdW1ucy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh0YWJsZTo6Z2V0Q29sdW1uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goY29sdW1uIC0+IGJ1aWxkZXIuYWRkUGFydGl0aW9uS2V5Q29sdW1uKGNvbHVtbi5uYW1lLCBnZXRUeXBlKGNvbHVtbiksIGNvbHVtbi5nZXRNYXNrKCkpKTsKKworICAgICAgICBjbHVzdGVyaW5nQ29sdW1ucy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodGFibGU6OmdldENvbHVtbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChjb2x1bW4gLT4gYnVpbGRlci5hZGRDbHVzdGVyaW5nQ29sdW1uKGNvbHVtbi5uYW1lLCBnZXRUeXBlKGNvbHVtbiksIGNvbHVtbi5nZXRNYXNrKCkpKTsKIAogICAgICAgICBzZWxlY3RlZENvbHVtbnMuc3RyZWFtKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihuYW1lIC0+ICFwcmltYXJ5S2V5Q29sdW1ucy5jb250YWlucyhuYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgLmZvckVhY2gobmFtZSAtPiBidWlsZGVyLmFkZFJlZ3VsYXJDb2x1bW4obmFtZSwgZ2V0VHlwZSh0YWJsZSwgbmFtZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh0YWJsZTo6Z2V0Q29sdW1uKQorICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChjb2x1bW4gLT4gYnVpbGRlci5hZGRSZWd1bGFyQ29sdW1uKGNvbHVtbi5uYW1lLCBnZXRUeXBlKGNvbHVtbiksIGNvbHVtbi5nZXRNYXNrKCkpKTsKIAogICAgICAgICBWaWV3TWV0YWRhdGEgdmlldyA9IG5ldyBWaWV3TWV0YWRhdGEodGFibGUuaWQsIHRhYmxlLm5hbWUsIHJhd0NvbHVtbnMuaXNFbXB0eSgpLCB3aGVyZUNsYXVzZSwgYnVpbGRlci5idWlsZCgpKTsKICAgICAgICAgdmlldy5tZXRhZGF0YS52YWxpZGF0ZSgpOwpAQCAtMzQ3LDE1ICszNTYsMTUgQEAKICAgICAgICAgY2xpZW50LmVuc3VyZVRhYmxlUGVybWlzc2lvbihrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgUGVybWlzc2lvbi5BTFRFUik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBBYnN0cmFjdFR5cGU8Pz4gZ2V0VHlwZShUYWJsZU1ldGFkYXRhIHRhYmxlLCBDb2x1bW5JZGVudGlmaWVyIG5hbWUpCisgICAgcHJpdmF0ZSBBYnN0cmFjdFR5cGU8Pz4gZ2V0VHlwZShDb2x1bW5NZXRhZGF0YSBjb2x1bW4pCiAgICAgewotICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IHRhYmxlLmdldENvbHVtbihuYW1lKS50eXBlOwotICAgICAgICBpZiAoY2x1c3RlcmluZ09yZGVyLmNvbnRhaW5zS2V5KG5hbWUpKQorICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IGNvbHVtbi50eXBlOworICAgICAgICBpZiAoY2x1c3RlcmluZ09yZGVyLmNvbnRhaW5zS2V5KGNvbHVtbi5uYW1lKSkKICAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiByZXZlcnNlID0gIWNsdXN0ZXJpbmdPcmRlci5nZXQobmFtZSk7CisgICAgICAgICAgICBib29sZWFuIHJldmVyc2UgPSAhY2x1c3RlcmluZ09yZGVyLmdldChjb2x1bW4ubmFtZSk7CiAKICAgICAgICAgICAgIGlmICh0eXBlLmlzUmV2ZXJzZWQoKSAmJiAhcmV2ZXJzZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKChSZXZlcnNlZFR5cGUpIHR5cGUpLmJhc2VUeXBlOworICAgICAgICAgICAgICAgIHJldHVybiAoKFJldmVyc2VkVHlwZTw/PikgdHlwZSkuYmFzZVR5cGU7CiAKICAgICAgICAgICAgIGlmICghdHlwZS5pc1JldmVyc2VkKCkgJiYgcmV2ZXJzZSkKICAgICAgICAgICAgICAgICByZXR1cm4gUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKHR5cGUpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9Ecm9wQWdncmVnYXRlU3RhdGVtZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0Ryb3BBZ2dyZWdhdGVTdGF0ZW1lbnQuamF2YQppbmRleCAwY2IxY2JlLi4xODY4OTFlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0Ryb3BBZ2dyZWdhdGVTdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0Ryb3BBZ2dyZWdhdGVTdGF0ZW1lbnQuamF2YQpAQCAtMjgsOSArMjgsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguUGVybWlzc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMU3RhdGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5VREFnZ3JlZ2F0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5Vc2VyRnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlcy5LZXlzcGFjZXNEaWZmOwpAQCAtODAsNyArODAsNyBAQAogICAgICAgICAgICAgdGhyb3cgaXJlKCJBZ2dyZWdhdGUgJyVzJyBkb2Vzbid0IGV4aXN0IiwgbmFtZSk7CiAgICAgICAgIH0KIAotICAgICAgICBDb2xsZWN0aW9uPEZ1bmN0aW9uPiBhZ2dyZWdhdGVzID0ga2V5c3BhY2UuZnVuY3Rpb25zLmdldChuZXcgRnVuY3Rpb25OYW1lKGtleXNwYWNlTmFtZSwgYWdncmVnYXRlTmFtZSkpOworICAgICAgICBDb2xsZWN0aW9uPFVzZXJGdW5jdGlvbj4gYWdncmVnYXRlcyA9IGtleXNwYWNlLnVzZXJGdW5jdGlvbnMuZ2V0KG5ldyBGdW5jdGlvbk5hbWUoa2V5c3BhY2VOYW1lLCBhZ2dyZWdhdGVOYW1lKSk7CiAgICAgICAgIGlmIChhZ2dyZWdhdGVzLnNpemUoKSA+IDEgJiYgIWFyZ3VtZW50c1NwZWZpY2llZCkKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgaXJlKCInRFJPUCBBR0dSRUdBVEUgJXMnIG1hdGNoZXMgbXVsdGlwbGUgZnVuY3Rpb24gZGVmaW5pdGlvbnM7ICIgKwpAQCAtOTcsMTEgKzk3LDExIEBACiAKICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ3VtZW50VHlwZXMgPSBwcmVwYXJlQXJndW1lbnRUeXBlcyhrZXlzcGFjZS50eXBlcyk7CiAKLSAgICAgICAgUHJlZGljYXRlPEZ1bmN0aW9uPiBmaWx0ZXIgPSBGdW5jdGlvbnMuRmlsdGVyLlVEQTsKKyAgICAgICAgUHJlZGljYXRlPFVzZXJGdW5jdGlvbj4gZmlsdGVyID0gVXNlckZ1bmN0aW9ucy5GaWx0ZXIuVURBOwogICAgICAgICBpZiAoYXJndW1lbnRzU3BlZmljaWVkKQotICAgICAgICAgICAgZmlsdGVyID0gZmlsdGVyLmFuZChmIC0+IEZ1bmN0aW9ucy50eXBlc01hdGNoKGYuYXJnVHlwZXMoKSwgYXJndW1lbnRUeXBlcykpOworICAgICAgICAgICAgZmlsdGVyID0gZmlsdGVyLmFuZChmIC0+IGYudHlwZXNNYXRjaChhcmd1bWVudFR5cGVzKSk7CiAKLSAgICAgICAgRnVuY3Rpb24gYWdncmVnYXRlID0gYWdncmVnYXRlcy5zdHJlYW0oKS5maWx0ZXIoZmlsdGVyKS5maW5kQW55KCkub3JFbHNlKG51bGwpOworICAgICAgICBVc2VyRnVuY3Rpb24gYWdncmVnYXRlID0gYWdncmVnYXRlcy5zdHJlYW0oKS5maWx0ZXIoZmlsdGVyKS5maW5kQW55KCkub3JFbHNlKG51bGwpOwogICAgICAgICBpZiAobnVsbCA9PSBhZ2dyZWdhdGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChpZkV4aXN0cykKQEAgLTExMCwxMiArMTEwLDEyIEBACiAgICAgICAgICAgICB0aHJvdyBpcmUoIkFnZ3JlZ2F0ZSAnJXMnIGRvZXNuJ3QgZXhpc3QiLCBuYW1lKTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBzY2hlbWEud2l0aEFkZGVkT3JVcGRhdGVkKGtleXNwYWNlLndpdGhTd2FwcGVkKGtleXNwYWNlLmZ1bmN0aW9ucy53aXRob3V0KGFnZ3JlZ2F0ZSkpKTsKKyAgICAgICAgcmV0dXJuIHNjaGVtYS53aXRoQWRkZWRPclVwZGF0ZWQoa2V5c3BhY2Uud2l0aFN3YXBwZWQoa2V5c3BhY2UudXNlckZ1bmN0aW9ucy53aXRob3V0KGFnZ3JlZ2F0ZSkpKTsKICAgICB9CiAKICAgICBTY2hlbWFDaGFuZ2Ugc2NoZW1hQ2hhbmdlRXZlbnQoS2V5c3BhY2VzRGlmZiBkaWZmKQogICAgIHsKLSAgICAgICAgRnVuY3Rpb25zIGRyb3BwZWQgPSBkaWZmLmFsdGVyZWQuZ2V0KDApLnVkYXMuZHJvcHBlZDsKKyAgICAgICAgVXNlckZ1bmN0aW9ucyBkcm9wcGVkID0gZGlmZi5hbHRlcmVkLmdldCgwKS51ZGFzLmRyb3BwZWQ7CiAgICAgICAgIGFzc2VydCBkcm9wcGVkLnNpemUoKSA9PSAxOwogICAgICAgICByZXR1cm4gU2NoZW1hQ2hhbmdlLmZvckFnZ3JlZ2F0ZShDaGFuZ2UuRFJPUFBFRCwgKFVEQWdncmVnYXRlKSBkcm9wcGVkLml0ZXJhdG9yKCkubmV4dCgpKTsKICAgICB9CkBAIC0xMjYsOSArMTI2LDkgQEAKICAgICAgICAgaWYgKG51bGwgPT0ga2V5c3BhY2UpCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgU3RyZWFtPEZ1bmN0aW9uPiBmdW5jdGlvbnMgPSBrZXlzcGFjZS5mdW5jdGlvbnMuZ2V0KG5ldyBGdW5jdGlvbk5hbWUoa2V5c3BhY2VOYW1lLCBhZ2dyZWdhdGVOYW1lKSkuc3RyZWFtKCk7CisgICAgICAgIFN0cmVhbTxVc2VyRnVuY3Rpb24+IGZ1bmN0aW9ucyA9IGtleXNwYWNlLnVzZXJGdW5jdGlvbnMuZ2V0KG5ldyBGdW5jdGlvbk5hbWUoa2V5c3BhY2VOYW1lLCBhZ2dyZWdhdGVOYW1lKSkuc3RyZWFtKCk7CiAgICAgICAgIGlmIChhcmd1bWVudHNTcGVmaWNpZWQpCi0gICAgICAgICAgICBmdW5jdGlvbnMgPSBmdW5jdGlvbnMuZmlsdGVyKGYgLT4gRnVuY3Rpb25zLnR5cGVzTWF0Y2goZi5hcmdUeXBlcygpLCBwcmVwYXJlQXJndW1lbnRUeXBlcyhrZXlzcGFjZS50eXBlcykpKTsKKyAgICAgICAgICAgIGZ1bmN0aW9ucyA9IGZ1bmN0aW9ucy5maWx0ZXIoZiAtPiBmLnR5cGVzTWF0Y2gocHJlcGFyZUFyZ3VtZW50VHlwZXMoa2V5c3BhY2UudHlwZXMpKSk7CiAKICAgICAgICAgZnVuY3Rpb25zLmZvckVhY2goZiAtPiBjbGllbnQuZW5zdXJlUGVybWlzc2lvbihQZXJtaXNzaW9uLkRST1AsIEZ1bmN0aW9uUmVzb3VyY2UuZnVuY3Rpb24oZikpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0Ryb3BGdW5jdGlvblN0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9Ecm9wRnVuY3Rpb25TdGF0ZW1lbnQuamF2YQppbmRleCBkOWQ2MzdkLi5lNzQzYTFhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0Ryb3BGdW5jdGlvblN0YXRlbWVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvRHJvcEZ1bmN0aW9uU3RhdGVtZW50LmphdmEKQEAgLTI4LDcgKzI4LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLlBlcm1pc3Npb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFN0YXRlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5VREZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlVzZXJGdW5jdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VzLktleXNwYWNlc0RpZmY7CkBAIC03OSw3ICs4MSw3IEBACiAgICAgICAgICAgICB0aHJvdyBpcmUoIkZ1bmN0aW9uICclcycgZG9lc24ndCBleGlzdCIsIG5hbWUpOwogICAgICAgICB9CiAKLSAgICAgICAgQ29sbGVjdGlvbjxGdW5jdGlvbj4gZnVuY3Rpb25zID0ga2V5c3BhY2UuZnVuY3Rpb25zLmdldChuZXcgRnVuY3Rpb25OYW1lKGtleXNwYWNlTmFtZSwgZnVuY3Rpb25OYW1lKSk7CisgICAgICAgIENvbGxlY3Rpb248VXNlckZ1bmN0aW9uPiBmdW5jdGlvbnMgPSBrZXlzcGFjZS51c2VyRnVuY3Rpb25zLmdldChuZXcgRnVuY3Rpb25OYW1lKGtleXNwYWNlTmFtZSwgZnVuY3Rpb25OYW1lKSk7CiAgICAgICAgIGlmIChmdW5jdGlvbnMuc2l6ZSgpID4gMSAmJiAhYXJndW1lbnRzU3BlZmljaWVkKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBpcmUoIidEUk9QIEZVTkNUSU9OICVzJyBtYXRjaGVzIG11bHRpcGxlIGZ1bmN0aW9uIGRlZmluaXRpb25zOyAiICsKQEAgLTk2LDExICs5OCwxMSBAQAogCiAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmd1bWVudFR5cGVzID0gcHJlcGFyZUFyZ3VtZW50VHlwZXMoa2V5c3BhY2UudHlwZXMpOwogCi0gICAgICAgIFByZWRpY2F0ZTxGdW5jdGlvbj4gZmlsdGVyID0gRnVuY3Rpb25zLkZpbHRlci5VREY7CisgICAgICAgIFByZWRpY2F0ZTxVc2VyRnVuY3Rpb24+IGZpbHRlciA9IFVzZXJGdW5jdGlvbnMuRmlsdGVyLlVERjsKICAgICAgICAgaWYgKGFyZ3VtZW50c1NwZWZpY2llZCkKLSAgICAgICAgICAgIGZpbHRlciA9IGZpbHRlci5hbmQoZiAtPiBGdW5jdGlvbnMudHlwZXNNYXRjaChmLmFyZ1R5cGVzKCksIGFyZ3VtZW50VHlwZXMpKTsKKyAgICAgICAgICAgIGZpbHRlciA9IGZpbHRlci5hbmQoZiAtPiBmLnR5cGVzTWF0Y2goYXJndW1lbnRUeXBlcykpOwogCi0gICAgICAgIEZ1bmN0aW9uIGZ1bmN0aW9uID0gZnVuY3Rpb25zLnN0cmVhbSgpLmZpbHRlcihmaWx0ZXIpLmZpbmRBbnkoKS5vckVsc2UobnVsbCk7CisgICAgICAgIFVzZXJGdW5jdGlvbiBmdW5jdGlvbiA9IGZ1bmN0aW9ucy5zdHJlYW0oKS5maWx0ZXIoZmlsdGVyKS5maW5kQW55KCkub3JFbHNlKG51bGwpOwogICAgICAgICBpZiAobnVsbCA9PSBmdW5jdGlvbikKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGlmRXhpc3RzKQpAQCAtMTEwLDcgKzExMiw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBTdHJpbmcgZGVwZW5kZW50QWdncmVnYXRlcyA9Ci0gICAgICAgICAgICBrZXlzcGFjZS5mdW5jdGlvbnMKKyAgICAgICAgICAgIGtleXNwYWNlLnVzZXJGdW5jdGlvbnMKICAgICAgICAgICAgICAgICAgICAgLmFnZ3JlZ2F0ZXNVc2luZ0Z1bmN0aW9uKGZ1bmN0aW9uKQogICAgICAgICAgICAgICAgICAgICAubWFwKGEgLT4gYS5uYW1lKCkudG9TdHJpbmcoKSkKICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3Qoam9pbmluZygiLCAiKSk7CkBAIC0xMTgsMTIgKzEyMCwxOSBAQAogICAgICAgICBpZiAoIWRlcGVuZGVudEFnZ3JlZ2F0ZXMuaXNFbXB0eSgpKQogICAgICAgICAgICAgdGhyb3cgaXJlKCJGdW5jdGlvbiAnJXMnIGlzIHN0aWxsIHJlZmVyZW5jZWQgYnkgYWdncmVnYXRlcyAlcyIsIG5hbWUsIGRlcGVuZGVudEFnZ3JlZ2F0ZXMpOwogCi0gICAgICAgIHJldHVybiBzY2hlbWEud2l0aEFkZGVkT3JVcGRhdGVkKGtleXNwYWNlLndpdGhTd2FwcGVkKGtleXNwYWNlLmZ1bmN0aW9ucy53aXRob3V0KGZ1bmN0aW9uKSkpOworICAgICAgICBTdHJpbmcgZGVwZW5kZW50VGFibGVzID0ga2V5c3BhY2UudGFibGVzVXNpbmdGdW5jdGlvbihmdW5jdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh0YWJsZSAtPiB0YWJsZS5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChqb2luaW5nKCIsICIpKTsKKworICAgICAgICBpZiAoIWRlcGVuZGVudFRhYmxlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICB0aHJvdyBpcmUoIkZ1bmN0aW9uICclcycgaXMgc3RpbGwgcmVmZXJlbmNlZCBieSBjb2x1bW4gbWFza3MgaW4gdGFibGVzICVzIiwgbmFtZSwgZGVwZW5kZW50VGFibGVzKTsKKworICAgICAgICByZXR1cm4gc2NoZW1hLndpdGhBZGRlZE9yVXBkYXRlZChrZXlzcGFjZS53aXRoU3dhcHBlZChrZXlzcGFjZS51c2VyRnVuY3Rpb25zLndpdGhvdXQoZnVuY3Rpb24pKSk7CiAgICAgfQogCiAgICAgU2NoZW1hQ2hhbmdlIHNjaGVtYUNoYW5nZUV2ZW50KEtleXNwYWNlc0RpZmYgZGlmZikKICAgICB7Ci0gICAgICAgIEZ1bmN0aW9ucyBkcm9wcGVkID0gZGlmZi5hbHRlcmVkLmdldCgwKS51ZGZzLmRyb3BwZWQ7CisgICAgICAgIFVzZXJGdW5jdGlvbnMgZHJvcHBlZCA9IGRpZmYuYWx0ZXJlZC5nZXQoMCkudWRmcy5kcm9wcGVkOwogICAgICAgICBhc3NlcnQgZHJvcHBlZC5zaXplKCkgPT0gMTsKICAgICAgICAgcmV0dXJuIFNjaGVtYUNoYW5nZS5mb3JGdW5jdGlvbihDaGFuZ2UuRFJPUFBFRCwgKFVERnVuY3Rpb24pIGRyb3BwZWQuaXRlcmF0b3IoKS5uZXh0KCkpOwogICAgIH0KQEAgLTEzNCw5ICsxNDMsOSBAQAogICAgICAgICBpZiAobnVsbCA9PSBrZXlzcGFjZSkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBTdHJlYW08RnVuY3Rpb24+IGZ1bmN0aW9ucyA9IGtleXNwYWNlLmZ1bmN0aW9ucy5nZXQobmV3IEZ1bmN0aW9uTmFtZShrZXlzcGFjZU5hbWUsIGZ1bmN0aW9uTmFtZSkpLnN0cmVhbSgpOworICAgICAgICBTdHJlYW08VXNlckZ1bmN0aW9uPiBmdW5jdGlvbnMgPSBrZXlzcGFjZS51c2VyRnVuY3Rpb25zLmdldChuZXcgRnVuY3Rpb25OYW1lKGtleXNwYWNlTmFtZSwgZnVuY3Rpb25OYW1lKSkuc3RyZWFtKCk7CiAgICAgICAgIGlmIChhcmd1bWVudHNTcGVmaWNpZWQpCi0gICAgICAgICAgICBmdW5jdGlvbnMgPSBmdW5jdGlvbnMuZmlsdGVyKGYgLT4gRnVuY3Rpb25zLnR5cGVzTWF0Y2goZi5hcmdUeXBlcygpLCBwcmVwYXJlQXJndW1lbnRUeXBlcyhrZXlzcGFjZS50eXBlcykpKTsKKyAgICAgICAgICAgIGZ1bmN0aW9ucyA9IGZ1bmN0aW9ucy5maWx0ZXIoZiAtPiBmLnR5cGVzTWF0Y2gocHJlcGFyZUFyZ3VtZW50VHlwZXMoa2V5c3BhY2UudHlwZXMpKSk7CiAKICAgICAgICAgZnVuY3Rpb25zLmZvckVhY2goZiAtPiBjbGllbnQuZW5zdXJlUGVybWlzc2lvbihQZXJtaXNzaW9uLkRST1AsIEZ1bmN0aW9uUmVzb3VyY2UuZnVuY3Rpb24oZikpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0Ryb3BLZXlzcGFjZVN0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9Ecm9wS2V5c3BhY2VTdGF0ZW1lbnQuamF2YQppbmRleCBmMmJkMzBiLi40N2U1MTRhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0Ryb3BLZXlzcGFjZVN0YXRlbWVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvRHJvcEtleXNwYWNlU3RhdGVtZW50LmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdWRpdC5BdWRpdExvZ0VudHJ5VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLlBlcm1pc3Npb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlcy5LZXlzcGFjZXNEaWZmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CkBAIC0zOSw2ICs0MCw4IEBACiAKICAgICBwdWJsaWMgS2V5c3BhY2VzIGFwcGx5KEtleXNwYWNlcyBzY2hlbWEpCiAgICAgeworICAgICAgICBHdWFyZHJhaWxzLmRyb3BLZXlzcGFjZUVuYWJsZWQuZW5zdXJlRW5hYmxlZChzdGF0ZSk7CisKICAgICAgICAgaWYgKHNjaGVtYS5jb250YWluc0tleXNwYWNlKGtleXNwYWNlTmFtZSkpCiAgICAgICAgICAgICByZXR1cm4gc2NoZW1hLndpdGhvdXQoa2V5c3BhY2VOYW1lKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9Ecm9wVHlwZVN0YXRlbWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9Ecm9wVHlwZVN0YXRlbWVudC5qYXZhCmluZGV4IGQxODhiZGIuLjk3ODMwYzggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvRHJvcFR5cGVTdGF0ZW1lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0Ryb3BUeXBlU3RhdGVtZW50LmphdmEKQEAgLTI0LDcgKzI0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLlBlcm1pc3Npb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5VVE5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVXNlckZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVXNlclR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlcy5LZXlzcGFjZXNEaWZmOwpAQCAtODIsNyArODIsNyBAQAogICAgICAgICAgKiAyKSBvdGhlciB1c2VyIHR5cGUgdGhhdCBjYW4gbmVzdCB0aGUgb25lIHdlIGRyb3AgYW5kCiAgICAgICAgICAqIDMpIGV4aXN0aW5nIHRhYmxlcyByZWZlcmVuY2luZyB0aGUgdHlwZSAobWF5YmUgaW4gYSBuZXN0ZWQgd2F5KS4KICAgICAgICAgICovCi0gICAgICAgIEl0ZXJhYmxlPEZ1bmN0aW9uPiBmdW5jdGlvbnMgPSBrZXlzcGFjZS5mdW5jdGlvbnMucmVmZXJlbmNpbmdVc2VyVHlwZShuYW1lKTsKKyAgICAgICAgSXRlcmFibGU8VXNlckZ1bmN0aW9uPiBmdW5jdGlvbnMgPSBrZXlzcGFjZS51c2VyRnVuY3Rpb25zLnJlZmVyZW5jaW5nVXNlclR5cGUobmFtZSk7CiAgICAgICAgIGlmICghaXNFbXB0eShmdW5jdGlvbnMpKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBpcmUoIkNhbm5vdCBkcm9wIHVzZXIgdHlwZSAnJXMuJXMnIGFzIGl0IGlzIHN0aWxsIHVzZWQgYnkgZnVuY3Rpb25zICVzIiwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvS2V5c3BhY2VBdHRyaWJ1dGVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL0tleXNwYWNlQXR0cmlidXRlcy5qYXZhCmluZGV4IDQyZmNhZjQuLmQ0ZDViOTggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvS2V5c3BhY2VBdHRyaWJ1dGVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9LZXlzcGFjZUF0dHJpYnV0ZXMuamF2YQpAQCAtNTAsNyArNTAsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIk1pc3NpbmcgcmVwbGljYXRpb24gc3RyYXRlZ3kgY2xhc3MiKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFN0cmluZyBnZXRSZXBsaWNhdGlvblN0cmF0ZWd5Q2xhc3MoKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVwbGljYXRpb25TdHJhdGVneUNsYXNzKCkKICAgICB7CiAgICAgICAgIHJldHVybiBnZXRBbGxSZXBsaWNhdGlvbk9wdGlvbnMoKS5nZXQoUmVwbGljYXRpb25QYXJhbXMuQ0xBU1MpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvVGFibGVBdHRyaWJ1dGVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvc2NoZW1hL1RhYmxlQXR0cmlidXRlcy5qYXZhCmluZGV4IDgyOWE1M2EuLmM1NWQ3OWUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9zY2hlbWEvVGFibGVBdHRyaWJ1dGVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL3NjaGVtYS9UYWJsZUF0dHJpYnV0ZXMuamF2YQpAQCAtMjUsNyArMjUsNiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLlByb3BlcnR5RGVmaW5pdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuU3ludGF4RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5DYWNoaW5nUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wYWN0aW9uUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtczsKQEAgLTM3LDYgKzM2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnJlYWRzLnJlcGFpci5SZWFkUmVwYWlyU3RyYXRlZ3k7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZVBhcmFtcy5PcHRpb24uKjsKIAogcHVibGljIGZpbmFsIGNsYXNzIFRhYmxlQXR0cmlidXRlcyBleHRlbmRzIFByb3BlcnR5RGVmaW5pdGlvbnMKIHsKQEAgLTc0LDcgKzc0LDcgQEAKIAogICAgIHB1YmxpYyBUYWJsZUlkIGdldElkKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFN0cmluZyBpZCA9IGdldFNpbXBsZShJRCk7CisgICAgICAgIFN0cmluZyBpZCA9IGdldFN0cmluZyhJRCk7CiAgICAgICAgIHRyeQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gaWQgIT0gbnVsbCA/IFRhYmxlSWQuZnJvbVN0cmluZyhpZCkgOiBudWxsOwpAQCAtOTcsMTExICs5Nyw4MSBAQAogCiAgICAgcHJpdmF0ZSBUYWJsZVBhcmFtcyBidWlsZChUYWJsZVBhcmFtcy5CdWlsZGVyIGJ1aWxkZXIpCiAgICAgewotICAgICAgICBpZiAoaGFzT3B0aW9uKE9wdGlvbi5CTE9PTV9GSUxURVJfRlBfQ0hBTkNFKSkKLSAgICAgICAgICAgIGJ1aWxkZXIuYmxvb21GaWx0ZXJGcENoYW5jZShnZXREb3VibGUoT3B0aW9uLkJMT09NX0ZJTFRFUl9GUF9DSEFOQ0UpKTsKKyAgICAgICAgaWYgKGhhc09wdGlvbihPcHRpb24uQUxMT1dfQVVUT19TTkFQU0hPVCkpCisgICAgICAgICAgICBidWlsZGVyLmFsbG93QXV0b1NuYXBzaG90KGdldEJvb2xlYW4oT3B0aW9uLkFMTE9XX0FVVE9fU05BUFNIT1QudG9TdHJpbmcoKSwgdHJ1ZSkpOwogCi0gICAgICAgIGlmIChoYXNPcHRpb24oT3B0aW9uLkNBQ0hJTkcpKQotICAgICAgICAgICAgYnVpbGRlci5jYWNoaW5nKENhY2hpbmdQYXJhbXMuZnJvbU1hcChnZXRNYXAoT3B0aW9uLkNBQ0hJTkcpKSk7CisgICAgICAgIGlmIChoYXNPcHRpb24oQkxPT01fRklMVEVSX0ZQX0NIQU5DRSkpCisgICAgICAgICAgICBidWlsZGVyLmJsb29tRmlsdGVyRnBDaGFuY2UoZ2V0RG91YmxlKEJMT09NX0ZJTFRFUl9GUF9DSEFOQ0UpKTsKIAotICAgICAgICBpZiAoaGFzT3B0aW9uKE9wdGlvbi5DT01NRU5UKSkKLSAgICAgICAgICAgIGJ1aWxkZXIuY29tbWVudChnZXRTdHJpbmcoT3B0aW9uLkNPTU1FTlQpKTsKKyAgICAgICAgaWYgKGhhc09wdGlvbihDQUNISU5HKSkKKyAgICAgICAgICAgIGJ1aWxkZXIuY2FjaGluZyhDYWNoaW5nUGFyYW1zLmZyb21NYXAoZ2V0TWFwKENBQ0hJTkcpKSk7CiAKLSAgICAgICAgaWYgKGhhc09wdGlvbihPcHRpb24uQ09NUEFDVElPTikpCi0gICAgICAgICAgICBidWlsZGVyLmNvbXBhY3Rpb24oQ29tcGFjdGlvblBhcmFtcy5mcm9tTWFwKGdldE1hcChPcHRpb24uQ09NUEFDVElPTikpKTsKKyAgICAgICAgaWYgKGhhc09wdGlvbihDT01NRU5UKSkKKyAgICAgICAgICAgIGJ1aWxkZXIuY29tbWVudChnZXRTdHJpbmcoQ09NTUVOVCkpOwogCi0gICAgICAgIGlmIChoYXNPcHRpb24oT3B0aW9uLkNPTVBSRVNTSU9OKSkKKyAgICAgICAgaWYgKGhhc09wdGlvbihDT01QQUNUSU9OKSkKKyAgICAgICAgICAgIGJ1aWxkZXIuY29tcGFjdGlvbihDb21wYWN0aW9uUGFyYW1zLmZyb21NYXAoZ2V0TWFwKENPTVBBQ1RJT04pKSk7CisKKyAgICAgICAgaWYgKGhhc09wdGlvbihDT01QUkVTU0lPTikpCiAgICAgICAgIHsKLSAgICAgICAgICAgIC8vY3JjX2NoZWNrX2NoYW5jZSB3YXMgInByb21vdGVkIiBmcm9tIGEgY29tcHJlc3Npb24gcHJvcGVydHkgdG8gYSB0b3AtbGV2ZWwtcHJvcGVydHkgYWZ0ZXIgIzk4MzkKKyAgICAgICAgICAgIC8vY3JjX2NoZWNrX2NoYW5jZSB3YXMgInByb21vdGVkIiBmcm9tIGEgY29tcHJlc3Npb24gcHJvcGVydHkgdG8gYSB0b3AtbGV2ZWwtcHJvcGVydHkgYWZ0ZXIgIzk4MzksCiAgICAgICAgICAgICAvL3NvIHdlIHRlbXBvcmFyaWx5IGFjY2VwdCBpdCB0byBiZSBkZWZpbmVkIGFzIGEgY29tcHJlc3Npb24gb3B0aW9uLCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBjb21wcmVzc2lvbk9wdHMgPSBnZXRNYXAoT3B0aW9uLkNPTVBSRVNTSU9OKTsKLSAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbk9wdHMuY29udGFpbnNLZXkoT3B0aW9uLkNSQ19DSEVDS19DSEFOQ0UudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSkKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gY29tcHJlc3Npb25PcHRzID0gZ2V0TWFwKENPTVBSRVNTSU9OKTsKKyAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbk9wdHMuY29udGFpbnNLZXkoQ1JDX0NIRUNLX0NIQU5DRS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERvdWJsZSBjcmNDaGVja0NoYW5jZSA9IGdldERlcHJlY2F0ZWRDcmNDaGVja0NoYW5jZShjb21wcmVzc2lvbk9wdHMpOworICAgICAgICAgICAgICAgIGRvdWJsZSBjcmNDaGVja0NoYW5jZSA9IGdldERlcHJlY2F0ZWRDcmNDaGVja0NoYW5jZShjb21wcmVzc2lvbk9wdHMpOwogICAgICAgICAgICAgICAgIGJ1aWxkZXIuY3JjQ2hlY2tDaGFuY2UoY3JjQ2hlY2tDaGFuY2UpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVpbGRlci5jb21wcmVzc2lvbihDb21wcmVzc2lvblBhcmFtcy5mcm9tTWFwKGdldE1hcChPcHRpb24uQ09NUFJFU1NJT04pKSk7CisgICAgICAgICAgICBidWlsZGVyLmNvbXByZXNzaW9uKENvbXByZXNzaW9uUGFyYW1zLmZyb21NYXAoZ2V0TWFwKENPTVBSRVNTSU9OKSkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGhhc09wdGlvbihPcHRpb24uTUVNVEFCTEUpKQogICAgICAgICAgICAgYnVpbGRlci5tZW10YWJsZShNZW10YWJsZVBhcmFtcy5nZXQoZ2V0U3RyaW5nKE9wdGlvbi5NRU1UQUJMRSkpKTsKIAotICAgICAgICBpZiAoaGFzT3B0aW9uKE9wdGlvbi5ERUZBVUxUX1RJTUVfVE9fTElWRSkpCi0gICAgICAgICAgICBidWlsZGVyLmRlZmF1bHRUaW1lVG9MaXZlKGdldEludChPcHRpb24uREVGQVVMVF9USU1FX1RPX0xJVkUpKTsKKyAgICAgICAgaWYgKGhhc09wdGlvbihERUZBVUxUX1RJTUVfVE9fTElWRSkpCisgICAgICAgICAgICBidWlsZGVyLmRlZmF1bHRUaW1lVG9MaXZlKGdldEludChERUZBVUxUX1RJTUVfVE9fTElWRSkpOwogCi0gICAgICAgIGlmIChoYXNPcHRpb24oT3B0aW9uLkdDX0dSQUNFX1NFQ09ORFMpKQotICAgICAgICAgICAgYnVpbGRlci5nY0dyYWNlU2Vjb25kcyhnZXRJbnQoT3B0aW9uLkdDX0dSQUNFX1NFQ09ORFMpKTsKKyAgICAgICAgaWYgKGhhc09wdGlvbihHQ19HUkFDRV9TRUNPTkRTKSkKKyAgICAgICAgICAgIGJ1aWxkZXIuZ2NHcmFjZVNlY29uZHMoZ2V0SW50KEdDX0dSQUNFX1NFQ09ORFMpKTsKKyAgICAgICAgCisgICAgICAgIGlmIChoYXNPcHRpb24oSU5DUkVNRU5UQUxfQkFDS1VQUykpCisgICAgICAgICAgICBidWlsZGVyLmluY3JlbWVudGFsQmFja3VwcyhnZXRCb29sZWFuKElOQ1JFTUVOVEFMX0JBQ0tVUFMudG9TdHJpbmcoKSwgdHJ1ZSkpOwogCi0gICAgICAgIGlmIChoYXNPcHRpb24oT3B0aW9uLk1BWF9JTkRFWF9JTlRFUlZBTCkpCi0gICAgICAgICAgICBidWlsZGVyLm1heEluZGV4SW50ZXJ2YWwoZ2V0SW50KE9wdGlvbi5NQVhfSU5ERVhfSU5URVJWQUwpKTsKKyAgICAgICAgaWYgKGhhc09wdGlvbihNQVhfSU5ERVhfSU5URVJWQUwpKQorICAgICAgICAgICAgYnVpbGRlci5tYXhJbmRleEludGVydmFsKGdldEludChNQVhfSU5ERVhfSU5URVJWQUwpKTsKIAotICAgICAgICBpZiAoaGFzT3B0aW9uKE9wdGlvbi5NRU1UQUJMRV9GTFVTSF9QRVJJT0RfSU5fTVMpKQotICAgICAgICAgICAgYnVpbGRlci5tZW10YWJsZUZsdXNoUGVyaW9kSW5NcyhnZXRJbnQoT3B0aW9uLk1FTVRBQkxFX0ZMVVNIX1BFUklPRF9JTl9NUykpOworICAgICAgICBpZiAoaGFzT3B0aW9uKE1FTVRBQkxFX0ZMVVNIX1BFUklPRF9JTl9NUykpCisgICAgICAgICAgICBidWlsZGVyLm1lbXRhYmxlRmx1c2hQZXJpb2RJbk1zKGdldEludChNRU1UQUJMRV9GTFVTSF9QRVJJT0RfSU5fTVMpKTsKIAotICAgICAgICBpZiAoaGFzT3B0aW9uKE9wdGlvbi5NSU5fSU5ERVhfSU5URVJWQUwpKQotICAgICAgICAgICAgYnVpbGRlci5taW5JbmRleEludGVydmFsKGdldEludChPcHRpb24uTUlOX0lOREVYX0lOVEVSVkFMKSk7CisgICAgICAgIGlmIChoYXNPcHRpb24oTUlOX0lOREVYX0lOVEVSVkFMKSkKKyAgICAgICAgICAgIGJ1aWxkZXIubWluSW5kZXhJbnRlcnZhbChnZXRJbnQoTUlOX0lOREVYX0lOVEVSVkFMKSk7CiAKLSAgICAgICAgaWYgKGhhc09wdGlvbihPcHRpb24uU1BFQ1VMQVRJVkVfUkVUUlkpKQotICAgICAgICAgICAgYnVpbGRlci5zcGVjdWxhdGl2ZVJldHJ5KFNwZWN1bGF0aXZlUmV0cnlQb2xpY3kuZnJvbVN0cmluZyhnZXRTdHJpbmcoT3B0aW9uLlNQRUNVTEFUSVZFX1JFVFJZKSkpOworICAgICAgICBpZiAoaGFzT3B0aW9uKFNQRUNVTEFUSVZFX1JFVFJZKSkKKyAgICAgICAgICAgIGJ1aWxkZXIuc3BlY3VsYXRpdmVSZXRyeShTcGVjdWxhdGl2ZVJldHJ5UG9saWN5LmZyb21TdHJpbmcoZ2V0U3RyaW5nKFNQRUNVTEFUSVZFX1JFVFJZKSkpOwogCi0gICAgICAgIGlmIChoYXNPcHRpb24oT3B0aW9uLkFERElUSU9OQUxfV1JJVEVfUE9MSUNZKSkKLSAgICAgICAgICAgIGJ1aWxkZXIuYWRkaXRpb25hbFdyaXRlUG9saWN5KFNwZWN1bGF0aXZlUmV0cnlQb2xpY3kuZnJvbVN0cmluZyhnZXRTdHJpbmcoT3B0aW9uLkFERElUSU9OQUxfV1JJVEVfUE9MSUNZKSkpOworICAgICAgICBpZiAoaGFzT3B0aW9uKEFERElUSU9OQUxfV1JJVEVfUE9MSUNZKSkKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkaXRpb25hbFdyaXRlUG9saWN5KFNwZWN1bGF0aXZlUmV0cnlQb2xpY3kuZnJvbVN0cmluZyhnZXRTdHJpbmcoQURESVRJT05BTF9XUklURV9QT0xJQ1kpKSk7CiAKLSAgICAgICAgaWYgKGhhc09wdGlvbihPcHRpb24uQ1JDX0NIRUNLX0NIQU5DRSkpCi0gICAgICAgICAgICBidWlsZGVyLmNyY0NoZWNrQ2hhbmNlKGdldERvdWJsZShPcHRpb24uQ1JDX0NIRUNLX0NIQU5DRSkpOworICAgICAgICBpZiAoaGFzT3B0aW9uKENSQ19DSEVDS19DSEFOQ0UpKQorICAgICAgICAgICAgYnVpbGRlci5jcmNDaGVja0NoYW5jZShnZXREb3VibGUoQ1JDX0NIRUNLX0NIQU5DRSkpOwogCi0gICAgICAgIGlmIChoYXNPcHRpb24oT3B0aW9uLkNEQykpCi0gICAgICAgICAgICBidWlsZGVyLmNkYyhnZXRCb29sZWFuKE9wdGlvbi5DREMudG9TdHJpbmcoKSwgZmFsc2UpKTsKKyAgICAgICAgaWYgKGhhc09wdGlvbihDREMpKQorICAgICAgICAgICAgYnVpbGRlci5jZGMoZ2V0Qm9vbGVhbihDREMpKTsKIAotICAgICAgICBpZiAoaGFzT3B0aW9uKE9wdGlvbi5SRUFEX1JFUEFJUikpCi0gICAgICAgICAgICBidWlsZGVyLnJlYWRSZXBhaXIoUmVhZFJlcGFpclN0cmF0ZWd5LmZyb21TdHJpbmcoZ2V0U3RyaW5nKE9wdGlvbi5SRUFEX1JFUEFJUikpKTsKKyAgICAgICAgaWYgKGhhc09wdGlvbihSRUFEX1JFUEFJUikpCisgICAgICAgICAgICBidWlsZGVyLnJlYWRSZXBhaXIoUmVhZFJlcGFpclN0cmF0ZWd5LmZyb21TdHJpbmcoZ2V0U3RyaW5nKFJFQURfUkVQQUlSKSkpOwogCiAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBEb3VibGUgZ2V0RGVwcmVjYXRlZENyY0NoZWNrQ2hhbmNlKE1hcDxTdHJpbmcsIFN0cmluZz4gY29tcHJlc3Npb25PcHRzKQorICAgIHB1YmxpYyBib29sZWFuIGhhc09wdGlvbihPcHRpb24gb3B0aW9uKQogICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gY29tcHJlc3Npb25PcHRzLmdldChPcHRpb24uQ1JDX0NIRUNLX0NIQU5DRS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIERvdWJsZS52YWx1ZU9mKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBkb3VibGUgdmFsdWUgJXMgZm9yIGNyY19jaGVja19jaGFuY2UuJyIsIHZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGRvdWJsZSBnZXREb3VibGUoT3B0aW9uIG9wdGlvbikKLSAgICB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldFN0cmluZyhvcHRpb24pOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRG91YmxlLnBhcnNlRG91YmxlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oZm9ybWF0KCJJbnZhbGlkIGRvdWJsZSB2YWx1ZSAlcyBmb3IgJyVzJyIsIHZhbHVlLCBvcHRpb24pKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEludChPcHRpb24gb3B0aW9uKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0U3RyaW5nKG9wdGlvbik7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBpbnRlZ2VyIHZhbHVlICVzIGZvciAnJXMnIiwgdmFsdWUsIG9wdGlvbikpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNQcm9wZXJ0eShvcHRpb24udG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3RyaW5nKE9wdGlvbiBvcHRpb24pCiAgICAgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRTaW1wbGUob3B0aW9uLnRvU3RyaW5nKCkpOworICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRTdHJpbmcob3B0aW9uLnRvU3RyaW5nKCkpOwogICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZm9ybWF0KCJPcHRpb24gJyVzJyBpcyBhYnNlbnQiLCBvcHRpb24pKTsKICAgICAgICAgcmV0dXJuIHZhbHVlOwpAQCAtMjE1LDggKzE4NSwyNCBAQAogICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uKE9wdGlvbiBvcHRpb24pCisgICAgcHJpdmF0ZSBib29sZWFuIGdldEJvb2xlYW4oT3B0aW9uIG9wdGlvbikKICAgICB7Ci0gICAgICAgIHJldHVybiBoYXNQcm9wZXJ0eShvcHRpb24udG9TdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBwYXJzZUJvb2xlYW4ob3B0aW9uLnRvU3RyaW5nKCksIGdldFN0cmluZyhvcHRpb24pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRJbnQoT3B0aW9uIG9wdGlvbikKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUludChvcHRpb24udG9TdHJpbmcoKSwgZ2V0U3RyaW5nKG9wdGlvbikpOworICAgIH0KKworICAgIHByaXZhdGUgZG91YmxlIGdldERvdWJsZShPcHRpb24gb3B0aW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlRG91YmxlKG9wdGlvbi50b1N0cmluZygpLCBnZXRTdHJpbmcob3B0aW9uKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBkb3VibGUgZ2V0RGVwcmVjYXRlZENyY0NoZWNrQ2hhbmNlKE1hcDxTdHJpbmcsIFN0cmluZz4gY29tcHJlc3Npb25PcHRzKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gY29tcHJlc3Npb25PcHRzLmdldChDUkNfQ0hFQ0tfQ0hBTkNFLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7CisgICAgICAgIHJldHVybiBwYXJzZURvdWJsZShDUkNfQ0hFQ0tfQ0hBTkNFLnRvU3RyaW5nKCksIHZhbHVlKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9BYnN0cmFjdEFycmF5Q2x1c3RlcmluZ1ByZWZpeC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQWJzdHJhY3RBcnJheUNsdXN0ZXJpbmdQcmVmaXguamF2YQppbmRleCAyMTFlZWIwLi4xNmZiMDgwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9BYnN0cmFjdEFycmF5Q2x1c3RlcmluZ1ByZWZpeC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0Fic3RyYWN0QXJyYXlDbHVzdGVyaW5nUHJlZml4LmphdmEKQEAgLTQ5LDcgKzQ5LDggQEAKICAgICAgICAgcmV0dXJuIG91dDsKICAgICB9CiAKLSAgICBwdWJsaWMgQ2x1c3RlcmluZ1ByZWZpeDxieXRlW10+IG1pbmltaXplKCkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2x1c3RlcmluZ1ByZWZpeDxieXRlW10+IHJldGFpbmFibGUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQWJzdHJhY3RCdWZmZXJDbHVzdGVyaW5nUHJlZml4LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9BYnN0cmFjdEJ1ZmZlckNsdXN0ZXJpbmdQcmVmaXguamF2YQppbmRleCA0NTdkMGM0Li5iNDdhM2EzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9BYnN0cmFjdEJ1ZmZlckNsdXN0ZXJpbmdQcmVmaXguamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9BYnN0cmFjdEJ1ZmZlckNsdXN0ZXJpbmdQcmVmaXguamF2YQpAQCAtNDIsMTAgKzQyLDE5IEBACiAgICAgICAgIHJldHVybiBnZXRSYXdWYWx1ZXMoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQ2x1c3RlcmluZ1ByZWZpeDxCeXRlQnVmZmVyPiBtaW5pbWl6ZSgpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsdXN0ZXJpbmdQcmVmaXg8Qnl0ZUJ1ZmZlcj4gcmV0YWluYWJsZSgpCiAgICAgewogICAgICAgICBpZiAoIUJ5dGVCdWZmZXJVdGlsLmNhbk1pbmltaXplKHZhbHVlcykpCiAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJDbHVzdGVyaW5nKEJ5dGVCdWZmZXJVdGlsLm1pbmltaXplQnVmZmVycyh2YWx1ZXMpKTsKKworICAgICAgICBCeXRlQnVmZmVyW10gbWluaW1pemVkVmFsdWVzID0gQnl0ZUJ1ZmZlclV0aWwubWluaW1pemVCdWZmZXJzKHRoaXMudmFsdWVzKTsKKyAgICAgICAgaWYgKGtpbmQuaXNCb3VuZGFyeSgpKQorICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yKCkuZmFjdG9yeSgpLmJvdW5kYXJ5KGtpbmQsIG1pbmltaXplZFZhbHVlcyk7CisgICAgICAgIGlmIChraW5kLmlzQm91bmQoKSkKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3NvcigpLmZhY3RvcnkoKS5ib3VuZChraW5kLCBtaW5pbWl6ZWRWYWx1ZXMpOworCisgICAgICAgIGFzc2VydCBraW5kKCkgIT0gS2luZC5TVEFUSUNfQ0xVU1RFUklORzsgICAgLy8gbm90IG1pbmltaXphYmxlCisgICAgICAgIHJldHVybiBhY2Nlc3NvcigpLmZhY3RvcnkoKS5jbHVzdGVyaW5nKG1pbmltaXplZFZhbHVlcyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQWJzdHJhY3RSZWFkUXVlcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0Fic3RyYWN0UmVhZFF1ZXJ5LmphdmEKaW5kZXggMzc0ZDJiMi4uYzJlNDI1OCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQWJzdHJhY3RSZWFkUXVlcnkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9BYnN0cmFjdFJlYWRRdWVyeS5qYXZhCkBAIC0xMTgsNCArMTE4LDQgQEAKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhcHBlbmRDUUxXaGVyZUNsYXVzZShTdHJpbmdCdWlsZGVyIHNiKTsKLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9BcnJheUNsdXN0ZXJpbmcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0FycmF5Q2x1c3RlcmluZy5qYXZhCmluZGV4IDUzZDQ1ZTcuLmIwNDkxMGMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0FycmF5Q2x1c3RlcmluZy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0FycmF5Q2x1c3RlcmluZy5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVBcnJheUFjY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk9iamVjdFNpemVzOwogCiBwdWJsaWMgY2xhc3MgQXJyYXlDbHVzdGVyaW5nIGV4dGVuZHMgQWJzdHJhY3RBcnJheUNsdXN0ZXJpbmdQcmVmaXggaW1wbGVtZW50cyBDbHVzdGVyaW5nPGJ5dGVbXT4KQEAgLTMxLDYgKzMyLDggQEAKIAogICAgIHB1YmxpYyBsb25nIHVuc2hhcmVkSGVhcFNpemUoKQogICAgIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gQnl0ZUFycmF5QWNjZXNzb3IuZmFjdG9yeS5jbHVzdGVyaW5nKCkgfHwgdGhpcyA9PSBCeXRlQXJyYXlBY2Nlc3Nvci5mYWN0b3J5LnN0YXRpY0NsdXN0ZXJpbmcoKSkKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBsb25nIGFycmF5UmVmU2l6ZSA9IE9iamVjdFNpemVzLnNpemVPZkFycmF5KHZhbHVlcyk7CiAgICAgICAgIGxvbmcgZWxlbWVudHNTaXplID0gMDsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCkBAIC00MCw2ICs0Myw4IEBACiAKICAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplRXhjbHVkaW5nRGF0YSgpCiAgICAgeworICAgICAgICBpZiAodGhpcyA9PSBCeXRlQXJyYXlBY2Nlc3Nvci5mYWN0b3J5LmNsdXN0ZXJpbmcoKSB8fCB0aGlzID09IEJ5dGVBcnJheUFjY2Vzc29yLmZhY3Rvcnkuc3RhdGljQ2x1c3RlcmluZygpKQorICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIHJldHVybiBFTVBUWV9TSVpFICsgT2JqZWN0U2l6ZXMuc2l6ZU9mQXJyYXkodmFsdWVzKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0J1ZmZlckNsdXN0ZXJpbmcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0J1ZmZlckNsdXN0ZXJpbmcuamF2YQppbmRleCBlMzU5MmUxLi5lZDZkNjFjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9CdWZmZXJDbHVzdGVyaW5nLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQnVmZmVyQ2x1c3RlcmluZy5qYXZhCkBAIC00MywxMSArNDMsMTUgQEAKIAogICAgIHB1YmxpYyBsb25nIHVuc2hhcmVkSGVhcFNpemUoKQogICAgIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gQ2x1c3RlcmluZy5FTVBUWSB8fCB0aGlzID09IENsdXN0ZXJpbmcuU1RBVElDX0NMVVNURVJJTkcpCisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgcmV0dXJuIEVNUFRZX1NJWkUgKyBPYmplY3RTaXplcy5zaXplT25IZWFwT2YodmFsdWVzKTsKICAgICB9CiAKICAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplRXhjbHVkaW5nRGF0YSgpCiAgICAgeworICAgICAgICBpZiAodGhpcyA9PSBDbHVzdGVyaW5nLkVNUFRZIHx8IHRoaXMgPT0gQ2x1c3RlcmluZy5TVEFUSUNfQ0xVU1RFUklORykKKyAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICByZXR1cm4gRU1QVFlfU0laRSArIE9iamVjdFNpemVzLnNpemVPbkhlYXBFeGNsdWRpbmdEYXRhKHZhbHVlcyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9CdWZmZXJEZWNvcmF0ZWRLZXkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0J1ZmZlckRlY29yYXRlZEtleS5qYXZhCmluZGV4IGQzNzUxNjIuLjA3ZjYxMGYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0J1ZmZlckRlY29yYXRlZEtleS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0J1ZmZlckRlY29yYXRlZEtleS5qYXZhCkBAIC0xOSw3ICsxOSw5IEBACiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CiAKIHB1YmxpYyBjbGFzcyBCdWZmZXJEZWNvcmF0ZWRLZXkgZXh0ZW5kcyBEZWNvcmF0ZWRLZXkKIHsKQEAgLTM2LDQgKzM4LDM0IEBACiAgICAgewogICAgICAgICByZXR1cm4ga2V5OwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0S2V5TGVuZ3RoKCkKKyAgICB7CisgICAgICAgIHJldHVybiBrZXkucmVtYWluaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBmYWN0b3J5IG1ldGhvZCB0aGF0IHRyYW5zbGF0ZXMgdGhlIGdpdmVuIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiB0byBhIHtAbGluayBCdWZmZXJEZWNvcmF0ZWRLZXl9CisgICAgICogaW5zdGFuY2UuIElmIHRoZSBnaXZlbiBieXRlIGNvbXBhcmFibGUgZG9lc24ndCByZXByZXNlbnQgdGhlIGVuY29kaW5nIG9mIGEgYnVmZmVyIGRlY29yYXRlZCBrZXksIGFueXRoaW5nIGZyb20gYQorICAgICAqIHdpZGUgdmFyaWV0eSBvZiB0aHJvd2FibGVzIG1heSBiZSB0aHJvd24gKGUuZy4ge0BsaW5rIEFzc2VydGlvbkVycm9yfSwge0BsaW5rIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb259LAorICAgICAqIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259LCBldGMuKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlQ29tcGFyYWJsZSBBIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiAocHJlc3VtYWJseSBvZiBhIHtAbGluayBCdWZmZXJEZWNvcmF0ZWRLZXl9IGluc3RhbmNlKS4KKyAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZW5jb2RpbmcgdmVyc2lvbiB1c2VkIGZvciB0aGUgZ2l2ZW4gYnl0ZSBjb21wYXJhYmxlLgorICAgICAqIEBwYXJhbSBwYXJ0aXRpb25lciBUaGUgcGFydGl0aW9uZXIgb2YgdGhlIGVuY29kZWQgZGVjb3JhdGVkIGtleS4gTmVlZGVkIGluIG9yZGVyIHRvIGNvcnJlY3RseSBkZWNvZGUgdGhlIHRva2VuCisgICAgICogICAgICAgICAgICAgICAgICAgIGJ5dGVzIG9mIHRoZSBrZXkuCisgICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgQnVmZmVyRGVjb3JhdGVkS2V5fSBpbnN0YW5jZSwgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uLiBJZgorICAgICAqIHdlIHdlcmUgdG8gY2FsbCB7QGxpbmsgI2FzQ29tcGFyYWJsZUJ5dGVzKFZlcnNpb24pfSBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0LCB3ZSBzaG91bGQgZ2V0IGEge0BsaW5rIEJ5dGVTb3VyY2V9CisgICAgICogZXF1YWwgdG8gdGhlIG9uZSBvZiB0aGUgaW5wdXQgYnl0ZSBjb21wYXJhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnVmZmVyRGVjb3JhdGVkS2V5IGZyb21CeXRlQ29tcGFyYWJsZShCeXRlQ29tcGFyYWJsZSBieXRlQ29tcGFyYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIpCisgICAgeworICAgICAgICByZXR1cm4gRGVjb3JhdGVkS2V5LmZyb21CeXRlQ29tcGFyYWJsZShieXRlQ29tcGFyYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0b2tlbiwga2V5Qnl0ZXMpIC0+IG5ldyBCdWZmZXJEZWNvcmF0ZWRLZXkodG9rZW4sIEJ5dGVCdWZmZXIud3JhcChrZXlCeXRlcykpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nLmphdmEKaW5kZXggZGQ5MWZlYS4uNDI2ZDMyNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmcuamF2YQpAQCAtNTYsNiArNTYsMTggQEAKICAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJDbHVzdGVyaW5nKG5ld1ZhbHVlcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgZGVmYXVsdCBDbHVzdGVyaW5nQm91bmQ8Vj4gYXNTdGFydEJvdW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDbHVzdGVyaW5nQm91bmQuaW5jbHVzaXZlU3RhcnRPZih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBkZWZhdWx0IENsdXN0ZXJpbmdCb3VuZDxWPiBhc0VuZEJvdW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDbHVzdGVyaW5nQm91bmQuaW5jbHVzaXZlRW5kT2YodGhpcyk7CisgICAgfQorCiAgICAgcHVibGljIGRlZmF1bHQgU3RyaW5nIHRvU3RyaW5nKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpCiAgICAgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKQEAgLTE3OCw0ICsxOTAsNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdCb3VuZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ0JvdW5kLmphdmEKaW5kZXggNjBhMWM2Yy4uNGFmZGZlNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ0JvdW5kLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ0JvdW5kLmphdmEKQEAgLTIxLDIyICsyMSwyNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVCdWZmZXJBY2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuQnl0ZUJ1ZmZlckNsb25lcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5BYnN0cmFjdEJ1ZmZlckNsdXN0ZXJpbmdQcmVmaXguRU1QVFlfVkFMVUVTX0FSUkFZOworCiAvKioKICAqIFRoZSBzdGFydCBvciBlbmQgb2YgYSByYW5nZSBvZiBjbHVzdGVyaW5ncywgZWl0aGVyIGluY2x1c2l2ZSBvciBleGNsdXNpdmUuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgQ2x1c3RlcmluZ0JvdW5kPFY+IGV4dGVuZHMgQ2x1c3RlcmluZ0JvdW5kT3JCb3VuZGFyeTxWPgogewogICAgIC8qKiBUaGUgc21hbGxlc3Qgc3RhcnQgYm91bmQsIGkuZS4gdGhlIG9uZSB0aGF0IHN0YXJ0cyBiZWZvcmUgYW55IHJvdy4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmdCb3VuZDw/PiBCT1RUT00gPSBuZXcgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX1NUQVJUX0JPVU5ELCBCdWZmZXJDbHVzdGVyaW5nQm91bmQuRU1QVFlfVkFMVUVTX0FSUkFZKTsKKyAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gQk9UVE9NID0gbmV3IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9TVEFSVF9CT1VORCwgRU1QVFlfVkFMVUVTX0FSUkFZKTsKICAgICAvKiogVGhlIGJpZ2dlc3QgZW5kIGJvdW5kLCBpLmUuIHRoZSBvbmUgdGhhdCBlbmRzIGFmdGVyIGFueSByb3cuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDbHVzdGVyaW5nQm91bmQ8Pz4gVE9QID0gbmV3IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9FTkRfQk9VTkQsIEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5FTVBUWV9WQUxVRVNfQVJSQVkpOworICAgIENsdXN0ZXJpbmdCb3VuZDw/PiBUT1AgPSBuZXcgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX0VORF9CT1VORCwgRU1QVFlfVkFMVUVTX0FSUkFZKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGJvdW5kS2luZChib29sZWFuIGlzU3RhcnQsIGJvb2xlYW4gaXNJbmNsdXNpdmUpCisgICAgLyoqIFRoZSBiaWdnZXN0IHN0YXJ0IGJvdW5kLCBpLmUuIHRoZSBvbmUgdGhhdCBzdGFydHMgYWZ0ZXIgYW55IHJvdy4gKi8KKyAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gTUFYX1NUQVJUID0gbmV3IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZChLaW5kLkVYQ0xfU1RBUlRfQk9VTkQsIEVNUFRZX1ZBTFVFU19BUlJBWSk7CisgICAgLyoqIFRoZSBzbWFsbGVzdCBlbmQgYm91bmQsIGkuZS4gdGhlIG9uZSB0aGF0IGVuZCBiZWZvcmUgYW55IHJvdy4gKi8KKyAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gTUlOX0VORCA9IG5ldyBCdWZmZXJDbHVzdGVyaW5nQm91bmQoS2luZC5FWENMX0VORF9CT1VORCwgRU1QVFlfVkFMVUVTX0FSUkFZKTsKKworICAgIHN0YXRpYyBDbHVzdGVyaW5nUHJlZml4LktpbmQgYm91bmRLaW5kKGJvb2xlYW4gaXNTdGFydCwgYm9vbGVhbiBpc0luY2x1c2l2ZSkKICAgICB7CiAgICAgICAgIHJldHVybiBpc1N0YXJ0CiAgICAgICAgICAgICAgICA/IChpc0luY2x1c2l2ZSA/IENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX1NUQVJUX0JPVU5EIDogQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkVYQ0xfU1RBUlRfQk9VTkQpCkBAIC02OSwzMiArNzQsMTQgQEAKICAgICAgICAgcmV0dXJuIGtpbmQoKSA9PSBLaW5kLkVYQ0xfU1RBUlRfQk9VTkQgfHwga2luZCgpID09IEtpbmQuRVhDTF9FTkRfQk9VTkQ7CiAgICAgfQogCi0gICAgLy8gRm9yIHVzZSBieSBpbnRlcnNlY3RzLCBpdCdzIGNhbGxlZCB3aXRoIHRoZSBzc3RhYmxlIGJvdW5kIG9wcG9zaXRlIHRvIHRoZSBzbGljZSBib3VuZAotICAgIC8vIChzbyBpZiB0aGUgc2xpY2UgYm91bmQgaXMgYSBzdGFydCwgaXQncyBjYWxsIHdpdGggdGhlIG1heCBzc3RhYmxlIGJvdW5kKQotICAgIGRlZmF1bHQgaW50IGNvbXBhcmVUbyhDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLCBMaXN0PEJ5dGVCdWZmZXI+IHNzdGFibGVCb3VuZCkKKyAgICBkZWZhdWx0IGJvb2xlYW4gaXNBcnRpZmljaWFsKCkKICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3N0YWJsZUJvdW5kLnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTYXkgdGhlIHNsaWNlIGJvdW5kIGlzIGEgc3RhcnQuIEl0IG1lYW5zIHdlJ3JlIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBtYXgKLSAgICAgICAgICAgIC8vIHNzdGFibGUgYm91bmQgaXMgc2F5ICgxOjUpIHdoaWxlIHRoZSBzbGljZSBzdGFydCBpcyAoMSkuIFNvIHRoZSBzdGFydAotICAgICAgICAgICAgLy8gZG9lcyBzdGFydCBiZWZvcmUgdGhlIHNzdGFibGUgZW5kIGJvdW5kIChhbmQgaW50ZXJzZWN0IGl0KS4gSXQncyB0aGUgZXhhY3QKLSAgICAgICAgICAgIC8vIGludmVyc2Ugd2l0aCBhIGVuZCBzbGljZSBib3VuZC4KLSAgICAgICAgICAgIGlmIChpID49IHNpemUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNTdGFydCgpID8gLTEgOiAxOworICAgICAgICByZXR1cm4ga2luZCgpID09IEtpbmQuU1NUQUJMRV9MT1dFUl9CT1VORCB8fCBraW5kKCkgPT0gS2luZC5TU1RBQkxFX1VQUEVSX0JPVU5EOworICAgIH0KIAotICAgICAgICAgICAgaW50IGNtcCA9IGNvbXBhcmF0b3IuY29tcGFyZUNvbXBvbmVudChpLCBnZXQoaSksIGFjY2Vzc29yKCksIHNzdGFibGVCb3VuZC5nZXQoaSksIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoY21wICE9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNtcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNheSB0aGUgc2xpY2UgYm91bmQgaXMgYSBzdGFydC4gSSBtZWFucyB3ZSdyZSBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgbWF4Ci0gICAgICAgIC8vIHNzdGFibGUgYm91bmQgaXMgc2F5ICgxKSwgd2hpbGUgdGhlIHNsaWNlIHN0YXJ0IGlzICgxOjUpLiBUaGlzIGFnYWluIG1lYW5zCi0gICAgICAgIC8vIHRoYXQgdGhlIHNsaWNlIHN0YXJ0IGJlZm9yZSB0aGUgZW5kIGJvdW5kLgotICAgICAgICBpZiAoc2l6ZSgpID4gc3N0YWJsZUJvdW5kLnNpemUoKSkKLSAgICAgICAgICAgIHJldHVybiBpc1N0YXJ0KCkgPyAtMSA6IDE7Ci0KLSAgICAgICAgLy8gVGhlIHNsaWNlIGJvdW5kIGlzIGVxdWFsIHRvIHRoZSBzc3RhYmxlIGJvdW5kLiBSZXN1bHRzIGRlcGVuZHMgb24gd2hldGhlciB0aGUgc2xpY2UgaXMgaW5jbHVzaXZlIG9yIG5vdAotICAgICAgICByZXR1cm4gaXNJbmNsdXNpdmUoKSA/IDAgOiAoaXNTdGFydCgpID8gMSA6IC0xKTsKKyAgICBkZWZhdWx0IENsdXN0ZXJpbmdCb3VuZDxWPiBhcnRpZmljaWFsTG93ZXJCb3VuZChib29sZWFuIGlzUmV2ZXJzZWQpCisgICAgeworICAgICAgICByZXR1cm4gY3JlYXRlKCFpc1JldmVyc2VkID8gS2luZC5TU1RBQkxFX0xPV0VSX0JPVU5EIDogS2luZC5TU1RBQkxFX1VQUEVSX0JPVU5ELCB0aGlzKTsKICAgICB9CiAKICAgICBzdGF0aWMgPFY+IENsdXN0ZXJpbmdCb3VuZDxWPiBjcmVhdGUoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGtpbmQsIENsdXN0ZXJpbmdQcmVmaXg8Vj4gZnJvbSkKQEAgLTEwMiwyNyArODksMjcgQEAKICAgICAgICAgcmV0dXJuIGZyb20uYWNjZXNzb3IoKS5mYWN0b3J5KCkuYm91bmQoa2luZCwgZnJvbS5nZXRSYXdWYWx1ZXMoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBDbHVzdGVyaW5nQm91bmQ8Pz4gaW5jbHVzaXZlU3RhcnRPZihDbHVzdGVyaW5nUHJlZml4PD8+IGZyb20pCisgICAgc3RhdGljIDxWPiBDbHVzdGVyaW5nQm91bmQ8Vj4gaW5jbHVzaXZlU3RhcnRPZihDbHVzdGVyaW5nUHJlZml4PFY+IGZyb20pCiAgICAgewogICAgICAgICByZXR1cm4gY3JlYXRlKENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX1NUQVJUX0JPVU5ELCBmcm9tKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIENsdXN0ZXJpbmdCb3VuZDw/PiBpbmNsdXNpdmVFbmRPZihDbHVzdGVyaW5nUHJlZml4PD8+IGZyb20pCisgICAgc3RhdGljIDxWPiBDbHVzdGVyaW5nQm91bmQ8Vj4gaW5jbHVzaXZlRW5kT2YoQ2x1c3RlcmluZ1ByZWZpeDxWPiBmcm9tKQogICAgIHsKICAgICAgICAgcmV0dXJuIGNyZWF0ZShDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9FTkRfQk9VTkQsIGZyb20pOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgQ2x1c3RlcmluZ0JvdW5kPD8+IGV4Y2x1c2l2ZVN0YXJ0T2YoQ2x1c3RlcmluZ1ByZWZpeDw/PiBmcm9tKQorICAgIHN0YXRpYyA8Vj4gQ2x1c3RlcmluZ0JvdW5kPFY+IGV4Y2x1c2l2ZVN0YXJ0T2YoQ2x1c3RlcmluZ1ByZWZpeDxWPiBmcm9tKQogICAgIHsKICAgICAgICAgcmV0dXJuIGNyZWF0ZShDbHVzdGVyaW5nUHJlZml4LktpbmQuRVhDTF9TVEFSVF9CT1VORCwgZnJvbSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBDbHVzdGVyaW5nQm91bmQ8Pz4gZXhjbHVzaXZlRW5kT2YoQ2x1c3RlcmluZ1ByZWZpeDw/PiBmcm9tKQorICAgIHN0YXRpYyA8Vj4gQ2x1c3RlcmluZ0JvdW5kPFY+IGV4Y2x1c2l2ZUVuZE9mKENsdXN0ZXJpbmdQcmVmaXg8Vj4gZnJvbSkKICAgICB7CiAgICAgICAgIHJldHVybiBjcmVhdGUoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkVYQ0xfRU5EX0JPVU5ELCBmcm9tKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIENsdXN0ZXJpbmdCb3VuZDw/PiBjcmVhdGUoQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwgYm9vbGVhbiBpc1N0YXJ0LCBib29sZWFuIGlzSW5jbHVzaXZlLCBPYmplY3QuLi4gdmFsdWVzKQorICAgIHN0YXRpYyBDbHVzdGVyaW5nQm91bmQ8Pz4gY3JlYXRlKENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsIGJvb2xlYW4gaXNTdGFydCwgYm9vbGVhbiBpc0luY2x1c2l2ZSwgT2JqZWN0Li4uIHZhbHVlcykKICAgICB7CiAgICAgICAgIENCdWlsZGVyIGJ1aWxkZXIgPSBDQnVpbGRlci5jcmVhdGUoY29tcGFyYXRvcik7CiAgICAgICAgIGZvciAoT2JqZWN0IHZhbCA6IHZhbHVlcykKQEAgLTEzNCw0ICsxMjEsMTggQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZEJvdW5kKGlzU3RhcnQsIGlzSW5jbHVzaXZlKTsKICAgICB9Ci19CisKKyAgICBAT3ZlcnJpZGUKKyAgICBkZWZhdWx0IENsdXN0ZXJpbmdCb3VuZDxWPiBhc1N0YXJ0Qm91bmQoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGlzU3RhcnQoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgZGVmYXVsdCBDbHVzdGVyaW5nQm91bmQ8Vj4gYXNFbmRCb3VuZCgpCisgICAgeworICAgICAgICBhc3NlcnQgaXNFbmQoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdCb3VuZGFyeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ0JvdW5kYXJ5LmphdmEKaW5kZXggM2U1MGY1Mi4uOWUwYTg3YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ0JvdW5kYXJ5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ0JvdW5kYXJ5LmphdmEKQEAgLTM3LDQgKzM3LDE2IEBACiAgICAgewogICAgICAgICByZXR1cm4gZnJvbS5hY2Nlc3NvcigpLmZhY3RvcnkoKS5ib3VuZGFyeShraW5kLCBmcm9tLmdldFJhd1ZhbHVlcygpKTsKICAgICB9Ci19CisKKyAgICBAT3ZlcnJpZGUKKyAgICBkZWZhdWx0IENsdXN0ZXJpbmdCb3VuZDxWPiBhc1N0YXJ0Qm91bmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9wZW5Cb3VuZChmYWxzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgZGVmYXVsdCBDbHVzdGVyaW5nQm91bmQ8Vj4gYXNFbmRCb3VuZCgpCisgICAgeworICAgICAgICByZXR1cm4gY2xvc2VCb3VuZChmYWxzZSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdDb21wYXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nQ29tcGFyYXRvci5qYXZhCmluZGV4IGZkYzQ1MDguLmQwMDdjNWQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdDb21wYXJhdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ0NvbXBhcmF0b3IuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKQEAgLTMxLDYgKzMyLDE1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZS5FWENMVURFRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVF9FTVBUWTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVF9FTVBUWV9SRVZFUlNFRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVF9OVUxMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlLlRFUk1JTkFUT1I7CiAKIC8qKgogICogQSBjb21wYXJhdG9yIG9mIGNsdXN0ZXJpbmcgcHJlZml4ZXMgKG9yIG1vcmUgZ2VuZXJhbGx5IG9mIHtAbGluayBDbHVzdGVyYWJsZX19LgpAQCAtMjMzLDYgKzI0MywyNzIgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBQcm9kdWNlIGEgcHJlZml4LWZyZWUgYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiB2YWx1ZSwgaS5lLiBzdWNoIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgdGhhdCBhbnkKKyAgICAgKiBwYWlyIHgsIHkgb2YgdmFsaWQgdmFsdWVzIG9mIHRoaXMgdHlwZQorICAgICAqICAgY29tcGFyZSh4LCB5KSA9PSBjb21wYXJlTGV4aWNvZ3JhcGhpY2FsbHlVbnNpZ25lZChhc0J5dGVDb21wYXJhYmxlKHgpLCBhc0J5dGVDb21wYXJhYmxlKHkpKQorICAgICAqIGFuZAorICAgICAqICAgYXNCeXRlQ29tcGFyYWJsZSh4KSBpcyBub3QgYSBwcmVmaXggb2YgYXNCeXRlQ29tcGFyYWJsZSh5KQorICAgICAqLworICAgIHB1YmxpYyA8Vj4gQnl0ZUNvbXBhcmFibGUgYXNCeXRlQ29tcGFyYWJsZShDbHVzdGVyaW5nUHJlZml4PFY+IGNsdXN0ZXJpbmcpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEJ5dGVDb21wYXJhYmxlQ2x1c3RlcmluZzw+KGNsdXN0ZXJpbmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgcHJlZml4LWZyZWUgYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uIGZvciBhIGNsdXN0ZXJpbmcgb3IgcHJlZml4LgorICAgICAqCisgICAgICogQWRkcyBhIE5FWFRfQ09NUE9ORU5UIGJ5dGUgYmVmb3JlIGVhY2ggY29tcG9uZW50IChhbGxvd2luZyBpbmNsdXNpdmUvZXhjbHVzaXZlIGJvdW5kcyBvdmVyIGluY29tcGxldGUgcHJlZml4ZXMKKyAgICAgKiBvZiB0aGF0IGxlbmd0aCkgYW5kIGZpbmlzaGVzIHdpdGggYSBzdWl0YWJsZSBieXRlIGZvciB0aGUgY2x1c3RlcmluZyBraW5kLiBBbHNvIGRlYWxzIHdpdGggbnVsbCBlbnRyaWVzLgorICAgICAqCisgICAgICogU2luY2UgYWxsIHR5cGVzJyBlbmNvZGluZ3MgYXJlIHdlYWtseSBwcmVmaXgtZnJlZSwgdGhpcyBpcyBndWFyYW50ZWVkIHRvIGJlIHByZWZpeC1mcmVlIGFzIGxvbmcgYXMgdGhlCisgICAgICogYm91bmQvQ2x1c3RlcmluZ1ByZWZpeCB0ZXJtaW5hdG9ycyBhcmUgZGlmZmVyZW50IGZyb20gdGhlIHNlcGFyYXRvciBieXRlLiBJdCBpcyBva2F5IGZvciB0aGUgdGVybWluYXRvciBmb3IKKyAgICAgKiBDbHVzdGVyaW5nIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBzZXBhcmF0b3IsIGFzIGFsbCBDbHVzdGVyaW5ncyBtdXN0IGJlIGNvbXBsZXRlbHkgc3BlY2lmaWVkLgorICAgICAqCisgICAgICogU2VlIGFsc28ge0BsaW5rIEFic3RyYWN0VHlwZSNhc0NvbXBhcmFibGVCeXRlc30uCisgICAgICoKKyAgICAgKiBTb21lIGV4YW1wbGVzOgorICAgICAqICAgICJBIiwgMDAwNSwgQ2x1c3RlcmluZyAgICAgLT4gNDAgNDEwMCA0MCAwMDA1IDQwCisgICAgICogICAgIkIiLCAwMDA2LCBJbmNsdXNpdmVFbmQgICAtPiA0MCA0MjAwIDQwIDAwMDYgNjAKKyAgICAgKiAgICAiQSIsIEV4Y2x1c2l2ZVN0YXJ0ICAgICAgIC0+IDQwIDQxMDAgNjAKKyAgICAgKiAgICAiIiwgbnVsbCwgQ2x1c3RlcmluZyAgICAgIC0+IDQwIDAwIDNGIDQwCisgICAgICogICAgIiIsIDAwMDAsIENsdXN0ZXJpbmcgICAgICAtPiA0MCAwMCA0MCAwMDAwIDQwCisgICAgICogICAgQk9UVE9NICAgICAgICAgICAgICAgICAgICAtPiAyMAorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgQnl0ZUNvbXBhcmFibGVDbHVzdGVyaW5nPFY+IGltcGxlbWVudHMgQnl0ZUNvbXBhcmFibGUKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ2x1c3RlcmluZ1ByZWZpeDxWPiBzcmM7CisKKyAgICAgICAgQnl0ZUNvbXBhcmFibGVDbHVzdGVyaW5nKENsdXN0ZXJpbmdQcmVmaXg8Vj4gc3JjKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnNyYyA9IHNyYzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZVNvdXJjZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBCeXRlU291cmNlIGN1cnJlbnQgPSBudWxsOworICAgICAgICAgICAgICAgIHByaXZhdGUgaW50IHNyY251bSA9IC0xOworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBuZXh0KCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBiID0gY3VycmVudC5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiA+IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludCBzeiA9IHNyYy5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzcmNudW0gPT0gc3opCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5EX09GX1NUUkVBTTsKKworICAgICAgICAgICAgICAgICAgICArK3NyY251bTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyY251bSA9PSBzeikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzcmMua2luZCgpLmFzQnl0ZUNvbXBhcmFibGVWYWx1ZSh2ZXJzaW9uKTsKKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBWIG5leHRDb21wb25lbnQgPSBzcmMuZ2V0KHNyY251bSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBoYXZlIGEgbnVsbCBhcyB0aGUgY2x1c3RlcmluZyBjb21wb25lbnQgKHRoaXMgaXMgYSByZWxpYyBvZiBDT01QQUNUIFNUT1JBR0UsIGJ1dCBhbHNvCisgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBhcHBlYXIgaW4gaW5kZXhlZCBwYXJ0aXRpb25zIHdpdGggbm8gcm93cyBidXQgc3RhdGljIGNvbnRlbnQpLAorICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENvbXBvbmVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiAhPSBWZXJzaW9uLkxFR0FDWSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTkVYVF9DT01QT05FTlRfTlVMTDsgLy8gYWx3YXlzIHNvcnRzIGJlZm9yZSBub24tbnVsbHMsIGluY2x1ZGluZyBmb3IgcmV2ZXJzZWQgdHlwZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZWdhY3kgdmVyc2lvbiBkaWQgbm90IHBlcm1pdCBudWxscyBpbiBjbHVzdGVyaW5nIGtleXMgYW5kIHRyZWF0ZWQgdGhlc2UgYXMgbnVsbCB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VidHlwZShzcmNudW0pLmlzUmV2ZXJzZWQoKSA/IE5FWFRfQ09NUE9ORU5UX0VNUFRZX1JFVkVSU0VEIDogTkVYVF9DT01QT05FTlRfRU1QVFk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gc3VidHlwZShzcmNudW0pLmFzQ29tcGFyYWJsZUJ5dGVzKHNyYy5hY2Nlc3NvcigpLCBuZXh0Q29tcG9uZW50LCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGFsc28gbnVsbCB2YWx1ZXMgZm9yIHNvbWUgdHlwZXMgKGUuZy4gaW50LCB2YXJpbnQgYnV0IG5vdCB0ZXh0KSB0aGF0IGFyZSBlbmNvZGVkIGFzIGVtcHR5CisgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcnMuCisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VidHlwZShzcmNudW0pLmlzUmV2ZXJzZWQoKSA/IE5FWFRfQ09NUE9ORU5UX0VNUFRZX1JFVkVSU0VEIDogTkVYVF9DT01QT05FTlRfRU1QVFk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5FWFRfQ09NUE9ORU5UOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNyYy5jbHVzdGVyaW5nU3RyaW5nKHN1YnR5cGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvZHVjZXMgYSBjbHVzdGVyaW5nIGZyb20gdGhlIGdpdmVuIGJ5dGUtY29tcGFyYWJsZSB2YWx1ZS4gVGhlIG1ldGhvZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUKKyAgICAgKiBkb2VzIG5vdCBjb3JyZWN0bHkgZW5jb2RlIGEgY2x1c3RlcmluZyBvZiB0aGlzIHR5cGUsIGluY2x1ZGluZyBpZiBpdCBlbmNvZGVzIGEgcG9zaXRpb24gYmVmb3JlIG9yIGFmdGVyIGEKKyAgICAgKiBjbHVzdGVyaW5nIChpLmUuIGEgYm91bmQvYm91bmRhcnkpLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2Vzc29yIEFjY2Vzc29yIHRvIHVzZSB0byBjb25zdHJ1Y3QgY29tcG9uZW50cy4KKyAgICAgKiBAcGFyYW0gY29tcGFyYWJsZSBUaGUgY2x1c3RlcmluZyBlbmNvZGVkIGFzIGEgYnl0ZS1jb21wYXJhYmxlIHNlcXVlbmNlLgorICAgICAqLworICAgIHB1YmxpYyA8Vj4gQ2x1c3RlcmluZzxWPiBjbHVzdGVyaW5nRnJvbUJ5dGVDb21wYXJhYmxlKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVDb21wYXJhYmxlIGNvbXBhcmFibGUpCisgICAgeworICAgICAgICBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24gPSBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwOworICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIG9yZGVyZWRCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoY29tcGFyYWJsZS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSk7CisKKyAgICAgICAgLy8gRmlyc3QgY2hlY2sgZm9yIHNwZWNpYWwgY2FzZXMgKHBhcnRpdGlvbiBrZXkgb25seSwgc3RhdGljIGNsdXN0ZXJpbmcpIHRoYXQgY2FuIGRvIHdpdGhvdXQgYnVmZmVycy4KKyAgICAgICAgaW50IHNlcCA9IG9yZGVyZWRCeXRlcy5uZXh0KCk7CisgICAgICAgIHN3aXRjaCAoc2VwKQorICAgICAgICB7CisgICAgICAgIGNhc2UgVEVSTUlOQVRPUjoKKyAgICAgICAgICAgIGFzc2VydCBzaXplKCkgPT0gMCA6ICJUZXJtaW5hdG9yIHNob3VsZCBiZSBhZnRlciAiICsgc2l6ZSgpICsgIiBjb21wb25lbnRzLCBnb3QgMCI7CisgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IuZmFjdG9yeSgpLmNsdXN0ZXJpbmcoKTsKKyAgICAgICAgY2FzZSBFWENMVURFRDoKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5mYWN0b3J5KCkuc3RhdGljQ2x1c3RlcmluZygpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gY29udGludWUgd2l0aCBwcm9jZXNzaW5nCisgICAgICAgIH0KKworICAgICAgICBpbnQgY2MgPSAwOworICAgICAgICBWW10gY29tcG9uZW50cyA9IGFjY2Vzc29yLmNyZWF0ZUFycmF5KHNpemUoKSk7CisKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc2VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBORVhUX0NPTVBPTkVOVF9OVUxMOgorICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbY2NdID0gbnVsbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTkVYVF9DT01QT05FTlRfRU1QVFk6CisgICAgICAgICAgICBjYXNlIE5FWFRfQ09NUE9ORU5UX0VNUFRZX1JFVkVSU0VEOgorICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbY2NdID0gc3VidHlwZShjYykuZnJvbUNvbXBhcmFibGVCeXRlcyhhY2Nlc3NvciwgbnVsbCwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5FWFRfQ09NUE9ORU5UOgorICAgICAgICAgICAgICAgIC8vIERlY29kZSB0aGUgbmV4dCBjb21wb25lbnQsIGNvbnN1bWluZyBieXRlcyBmcm9tIG9yZGVyZWRCeXRlcy4KKyAgICAgICAgICAgICAgICBjb21wb25lbnRzW2NjXSA9IHN1YnR5cGUoY2MpLmZyb21Db21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIG9yZGVyZWRCeXRlcywgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFRFUk1JTkFUT1I6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGNjID09IHNpemUoKSA6ICJUZXJtaW5hdG9yIHNob3VsZCBiZSBhZnRlciAiICsgc2l6ZSgpICsgIiBjb21wb25lbnRzLCBnb3QgIiArIGNjOworICAgICAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5mYWN0b3J5KCkuY2x1c3RlcmluZyhjb21wb25lbnRzKTsKKyAgICAgICAgICAgIGNhc2UgRVhDTFVERUQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVbmV4cGVjdGVkIHN0YXRpYyB0ZXJtaW5hdG9yIGFmdGVyIHRoZSBmaXJzdCBjb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVbmV4cGVjdGVkIHNlcGFyYXRvciAiICsgSW50ZWdlci50b0hleFN0cmluZyhzZXApICsgIiBpbiBDbHVzdGVyaW5nIGVuY29kaW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2NjOworICAgICAgICAgICAgc2VwID0gb3JkZXJlZEJ5dGVzLm5leHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2VzIGEgY2x1c3RlcmluZyBib3VuZCBmcm9tIHRoZSBnaXZlbiBieXRlLWNvbXBhcmFibGUgdmFsdWUuIFRoZSBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHZhbHVlCisgICAgICogZG9lcyBub3QgY29ycmVjdGx5IGVuY29kZSBhIGJvdW5kIHBvc2l0aW9uIG9mIHRoaXMgdHlwZSwgaW5jbHVkaW5nIGlmIGl0IGVuY29kZXMgYW4gZXhhY3QgY2x1c3RlcmluZy4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB0aGUgZW5jb2RlZCBjbHVzdGVyaW5nIHBvc2l0aW9uIGNhbm5vdCBzcGVjaWZ5IHRoZSB0eXBlIG9mIGJvdW5kIChpLmUuIHN0YXJ0L2VuZC9ib3VuZGFyeSkgYmVjYXVzZSB0bworICAgICAqIGNvcnJlY3RseSBjb21wYXJlIGNsdXN0ZXJpbmcgcG9zaXRpb25zIHRoZSBlbmNvZGluZyBtdXN0IGJlIHRoZSBzYW1lIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIChlLmcuIHRoZSBwb3NpdGlvbgorICAgICAqIGZvciBhIGV4Y2x1c2l2ZSBlbmQgYW5kIGFuIGluY2x1c2l2ZSBzdGFydCBpcyB0aGUgc2FtZSwgYmVmb3JlIHRoZSBleGFjdCBjbHVzdGVyaW5nKS4gVGhlIHR5cGUgbXVzdCBiZSBzdXBwbGllZAorICAgICAqIHNlcGFyYXRlbHkgKGluIHRoZSBib3VuZC4uLiB2cyBib3VuZGFyeS4uLiBjYWxsIGFuZCBpc0VuZCBhcmd1bWVudCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzb3IgQWNjZXNzb3IgdG8gdXNlIHRvIGNvbnN0cnVjdCBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSBjb21wYXJhYmxlIFRoZSBjbHVzdGVyaW5nIHBvc2l0aW9uIGVuY29kZWQgYXMgYSBieXRlLWNvbXBhcmFibGUgc2VxdWVuY2UuCisgICAgICogQHBhcmFtIGlzRW5kIHRydWUgaWYgdGhlIGJvdW5kIG1hcmtzIHRoZSBlbmQgb2YgYSByYW5nZSwgZmFsc2UgaXMgaXQgbWFya3MgdGhlIHN0YXJ0LgorICAgICAqLworICAgIHB1YmxpYyA8Vj4gQ2x1c3RlcmluZ0JvdW5kPFY+IGJvdW5kRnJvbUJ5dGVDb21wYXJhYmxlKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgY29tcGFyYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzRW5kKQorICAgIHsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uID0gQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MDsKKyAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBvcmRlcmVkQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKGNvbXBhcmFibGUuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpOworCisgICAgICAgIGludCBzZXAgPSBvcmRlcmVkQnl0ZXMubmV4dCgpOworICAgICAgICBpbnQgY2MgPSAwOworICAgICAgICBWW10gY29tcG9uZW50cyA9IGFjY2Vzc29yLmNyZWF0ZUFycmF5KHNpemUoKSk7CisKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc2VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBORVhUX0NPTVBPTkVOVF9OVUxMOgorICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbY2NdID0gbnVsbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTkVYVF9DT01QT05FTlRfRU1QVFk6CisgICAgICAgICAgICBjYXNlIE5FWFRfQ09NUE9ORU5UX0VNUFRZX1JFVkVSU0VEOgorICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbY2NdID0gc3VidHlwZShjYykuZnJvbUNvbXBhcmFibGVCeXRlcyhhY2Nlc3NvciwgbnVsbCwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5FWFRfQ09NUE9ORU5UOgorICAgICAgICAgICAgICAgIC8vIERlY29kZSB0aGUgbmV4dCBjb21wb25lbnQsIGNvbnN1bWluZyBieXRlcyBmcm9tIG9yZGVyZWRCeXRlcy4KKyAgICAgICAgICAgICAgICBjb21wb25lbnRzW2NjXSA9IHN1YnR5cGUoY2MpLmZyb21Db21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIG9yZGVyZWRCeXRlcywgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ5dGVTb3VyY2UuTFRfTkVYVF9DT01QT05FTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmZhY3RvcnkoKS5ib3VuZChpc0VuZCA/IENsdXN0ZXJpbmdQcmVmaXguS2luZC5FWENMX0VORF9CT1VORAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9TVEFSVF9CT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5jb3B5T2YoY29tcG9uZW50cywgY2MpKTsKKyAgICAgICAgICAgIGNhc2UgQnl0ZVNvdXJjZS5HVF9ORVhUX0NPTVBPTkVOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IuZmFjdG9yeSgpLmJvdW5kKGlzRW5kID8gQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfRU5EX0JPVU5ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENsdXN0ZXJpbmdQcmVmaXguS2luZC5FWENMX1NUQVJUX0JPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmNvcHlPZihjb21wb25lbnRzLCBjYykpOworCisgICAgICAgICAgICBjYXNlIEJ5dGVTb3VyY2UuTFRMVF9ORVhUX0NPTVBPTkVOVDoKKyAgICAgICAgICAgIGNhc2UgQnl0ZVNvdXJjZS5HVEdUX05FWFRfQ09NUE9ORU5UOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5leHBlY3RlZCBzc3RhYmxlIGxvd2VyL3VwcGVyIGJvdW5kIC0gYnl0ZSBjb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGFydGlmaWNpYWwgc3N0YWJsZSBib3VuZHMgaXMgbm90IHN1cHBvcnRlZCIpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5leHBlY3RlZCBzZXBhcmF0b3IgIiArIEludGVnZXIudG9IZXhTdHJpbmcoc2VwKSArICIgaW4gQ2x1c3RlcmluZ0JvdW5kIGVuY29kaW5nIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2NjOworICAgICAgICAgICAgc2VwID0gb3JkZXJlZEJ5dGVzLm5leHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2VzIGEgY2x1c3RlcmluZyBib3VuZGFyeSBmcm9tIHRoZSBnaXZlbiBieXRlLWNvbXBhcmFibGUgdmFsdWUuIFRoZSBtZXRob2Qgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlCisgICAgICogdmFsdWUgZG9lcyBub3QgY29ycmVjdGx5IGVuY29kZSBhIGJvdW5kIHBvc2l0aW9uIG9mIHRoaXMgdHlwZSwgaW5jbHVkaW5nIGlmIGl0IGVuY29kZXMgYW4gZXhhY3QgY2x1c3RlcmluZy4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB0aGUgZW5jb2RlZCBjbHVzdGVyaW5nIHBvc2l0aW9uIGNhbm5vdCBzcGVjaWZ5IHRoZSB0eXBlIG9mIGJvdW5kIChpLmUuIHN0YXJ0L2VuZC9ib3VuZGFyeSkgYmVjYXVzZSB0bworICAgICAqIGNvcnJlY3RseSBjb21wYXJlIGNsdXN0ZXJpbmcgcG9zaXRpb25zIHRoZSBlbmNvZGluZyBtdXN0IGJlIHRoZSBzYW1lIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIChlLmcuIHRoZSBwb3NpdGlvbgorICAgICAqIGZvciBhIGV4Y2x1c2l2ZSBlbmQgYW5kIGFuIGluY2x1c2l2ZSBzdGFydCBpcyB0aGUgc2FtZSwgYmVmb3JlIHRoZSBleGFjdCBjbHVzdGVyaW5nKS4gVGhlIHR5cGUgbXVzdCBiZSBzdXBwbGllZAorICAgICAqIHNlcGFyYXRlbHkgKGluIHRoZSBib3VuZC4uLiB2cyBib3VuZGFyeS4uLiBjYWxsIGFuZCBpc0VuZCBhcmd1bWVudCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzb3IgQWNjZXNzb3IgdG8gdXNlIHRvIGNvbnN0cnVjdCBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSBjb21wYXJhYmxlIFRoZSBjbHVzdGVyaW5nIHBvc2l0aW9uIGVuY29kZWQgYXMgYSBieXRlLWNvbXBhcmFibGUgc2VxdWVuY2UuCisgICAgICovCisgICAgcHVibGljIDxWPiBDbHVzdGVyaW5nQm91bmRhcnk8Vj4gYm91bmRhcnlGcm9tQnl0ZUNvbXBhcmFibGUoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZUNvbXBhcmFibGUgY29tcGFyYWJsZSkKKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbiA9IEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uT1NTNTA7CisgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgb3JkZXJlZEJ5dGVzID0gQnl0ZVNvdXJjZS5wZWVrYWJsZShjb21wYXJhYmxlLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKworICAgICAgICBpbnQgc2VwID0gb3JkZXJlZEJ5dGVzLm5leHQoKTsKKyAgICAgICAgaW50IGNjID0gMDsKKyAgICAgICAgVltdIGNvbXBvbmVudHMgPSBhY2Nlc3Nvci5jcmVhdGVBcnJheShzaXplKCkpOworCisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2ggKHNlcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgTkVYVF9DT01QT05FTlRfTlVMTDoKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzW2NjXSA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE5FWFRfQ09NUE9ORU5UX0VNUFRZOgorICAgICAgICAgICAgY2FzZSBORVhUX0NPTVBPTkVOVF9FTVBUWV9SRVZFUlNFRDoKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzW2NjXSA9IHN1YnR5cGUoY2MpLmZyb21Db21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIG51bGwsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBORVhUX0NPTVBPTkVOVDoKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGUgdGhlIG5leHQgY29tcG9uZW50LCBjb25zdW1pbmcgYnl0ZXMgZnJvbSBvcmRlcmVkQnl0ZXMuCisgICAgICAgICAgICAgICAgY29tcG9uZW50c1tjY10gPSBzdWJ0eXBlKGNjKS5mcm9tQ29tcGFyYWJsZUJ5dGVzKGFjY2Vzc29yLCBvcmRlcmVkQnl0ZXMsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCeXRlU291cmNlLkxUX05FWFRfQ09NUE9ORU5UOgorICAgICAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5mYWN0b3J5KCkuYm91bmRhcnkoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkVYQ0xfRU5EX0lOQ0xfU1RBUlRfQk9VTkRBUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuY29weU9mKGNvbXBvbmVudHMsIGNjKSk7CisgICAgICAgICAgICBjYXNlIEJ5dGVTb3VyY2UuR1RfTkVYVF9DT01QT05FTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmZhY3RvcnkoKS5ib3VuZGFyeShDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9FTkRfRVhDTF9TVEFSVF9CT1VOREFSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5jb3B5T2YoY29tcG9uZW50cywgY2MpKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVbmV4cGVjdGVkIHNlcGFyYXRvciAiICsgSW50ZWdlci50b0hleFN0cmluZyhzZXApICsgIiBpbiBDbHVzdGVyaW5nQm91bmRhcnkgZW5jb2RpbmciKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrY2M7CisgICAgICAgICAgICBzZXAgPSBvcmRlcmVkQnl0ZXMubmV4dCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCiAgICAgICogQSBjb21wYXJhdG9yIGZvciByb3dzLgogICAgICAqCiAgICAgICogQSB7QGNvZGUgUm93fSBpcyBhIHtAY29kZSBDbHVzdGVyYWJsZX0gc28ge0Bjb2RlIENsdXN0ZXJpbmdDb21wYXJhdG9yfSBjYW4gYmUgdXNlZApAQCAtMjc5LDQgKzU1NSw0IEBACiAgICAgewogICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoQ29kZShjbHVzdGVyaW5nVHlwZXMpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nUHJlZml4LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nUHJlZml4LmphdmEKaW5kZXggYTEyOTFjOC4uYmU4MWU1ZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ1ByZWZpeC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdQcmVmaXguamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uVG9JbnRGdW5jdGlvbjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLklNZWFzdXJhYmxlTWVtb3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy4qOwpAQCAtMzMsNyArMzQsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUFycmF5VXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZS5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CiAKIC8qKgogICogQSBjbHVzdGVyaW5nIHByZWZpeCBpcyB0aGUgdW5pdCBvZiB3aGF0IGEge0BsaW5rIENsdXN0ZXJpbmdDb21wYXJhdG9yfSBjYW4gY29tcGFyZS4KQEAgLTYyLDE0ICs2NCwyMCBAQAogICAgIHsKICAgICAgICAgLy8gV0FSTklORzogdGhlIG9yZGVyaW5nIG9mIHRoYXQgZW51bSBtYXR0ZXJzIGJlY2F1c2Ugd2UgdXNlIG9yZGluYWwoKSBpbiB0aGUgc2VyaWFsaXphdGlvbgogCi0gICAgICAgIEVYQ0xfRU5EX0JPVU5EICAgICAgICAgICAgICAoMCwgLTEpLAotICAgICAgICBJTkNMX1NUQVJUX0JPVU5EICAgICAgICAgICAgKDAsIC0xKSwKLSAgICAgICAgRVhDTF9FTkRfSU5DTF9TVEFSVF9CT1VOREFSWSgwLCAtMSksCi0gICAgICAgIFNUQVRJQ19DTFVTVEVSSU5HICAgICAgICAgICAoMSwgLTEpLAotICAgICAgICBDTFVTVEVSSU5HICAgICAgICAgICAgICAgICAgKDIsICAwKSwKLSAgICAgICAgSU5DTF9FTkRfRVhDTF9TVEFSVF9CT1VOREFSWSgzLCAgMSksCi0gICAgICAgIElOQ0xfRU5EX0JPVU5EICAgICAgICAgICAgICAoMywgIDEpLAotICAgICAgICBFWENMX1NUQVJUX0JPVU5EICAgICAgICAgICAgKDMsICAxKTsKKyAgICAgICAgLy8gQGZvcm1hdHRlcjpvZmYKKyAgICAgICAgRVhDTF9FTkRfQk9VTkQgICAgICAgICAgICAgICAoIDAsIC0xLCB2IC0+IEJ5dGVTb3VyY2UuTFRfTkVYVF9DT01QT05FTlQpLAorICAgICAgICBJTkNMX1NUQVJUX0JPVU5EICAgICAgICAgICAgICggMCwgLTEsIHYgLT4gQnl0ZVNvdXJjZS5MVF9ORVhUX0NPTVBPTkVOVCksCisgICAgICAgIEVYQ0xfRU5EX0lOQ0xfU1RBUlRfQk9VTkRBUlkgKCAwLCAtMSwgdiAtPiBCeXRlU291cmNlLkxUX05FWFRfQ09NUE9ORU5UKSwKKyAgICAgICAgU1RBVElDX0NMVVNURVJJTkcgICAgICAgICAgICAoIDEsIC0xLCB2IC0+IHYgPT0gVmVyc2lvbi5MRUdBQ1kgPyBCeXRlU291cmNlLkxUX05FWFRfQ09NUE9ORU5UICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEJ5dGVTb3VyY2UuRVhDTFVERUQpLAorICAgICAgICBDTFVTVEVSSU5HICAgICAgICAgICAgICAgICAgICggMiwgIDAsIHYgLT4gdiA9PSBWZXJzaW9uLkxFR0FDWSA/IEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCeXRlU291cmNlLlRFUk1JTkFUT1IpLAorICAgICAgICBJTkNMX0VORF9FWENMX1NUQVJUX0JPVU5EQVJZICggMywgIDEsIHYgLT4gQnl0ZVNvdXJjZS5HVF9ORVhUX0NPTVBPTkVOVCksCisgICAgICAgIElOQ0xfRU5EX0JPVU5EICAgICAgICAgICAgICAgKCAzLCAgMSwgdiAtPiBCeXRlU291cmNlLkdUX05FWFRfQ09NUE9ORU5UKSwKKyAgICAgICAgRVhDTF9TVEFSVF9CT1VORCAgICAgICAgICAgICAoIDMsICAxLCB2IC0+IEJ5dGVTb3VyY2UuR1RfTkVYVF9DT01QT05FTlQpLAorICAgICAgICBTU1RBQkxFX0xPV0VSX0JPVU5EICAgICAgICAgICgtMSwgLTEsIHYgLT4gQnl0ZVNvdXJjZS5MVExUX05FWFRfQ09NUE9ORU5UKSwKKyAgICAgICAgU1NUQUJMRV9VUFBFUl9CT1VORCAgICAgICAgICAoIDQsICAxLCB2IC0+IEJ5dGVTb3VyY2UuR1RHVF9ORVhUX0NPTVBPTkVOVCk7CisgICAgICAgIC8vIEBmb3JtYXR0ZXI6b24KIAogICAgICAgICBwcml2YXRlIGZpbmFsIGludCBjb21wYXJpc29uOwogCkBAIC03OSwxMCArODcsMTMgQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZWRUb0NsdXN0ZXJpbmc7CiAKLSAgICAgICAgS2luZChpbnQgY29tcGFyaXNvbiwgaW50IGNvbXBhcmVkVG9DbHVzdGVyaW5nKQorICAgICAgICBwdWJsaWMgZmluYWwgVG9JbnRGdW5jdGlvbjxWZXJzaW9uPiBhc0J5dGVDb21wYXJhYmxlOworCisgICAgICAgIEtpbmQoaW50IGNvbXBhcmlzb24sIGludCBjb21wYXJlZFRvQ2x1c3RlcmluZywgVG9JbnRGdW5jdGlvbjxWZXJzaW9uPiBhc0J5dGVDb21wYXJhYmxlKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLmNvbXBhcmlzb24gPSBjb21wYXJpc29uOwogICAgICAgICAgICAgdGhpcy5jb21wYXJlZFRvQ2x1c3RlcmluZyA9IGNvbXBhcmVkVG9DbHVzdGVyaW5nOworICAgICAgICAgICAgdGhpcy5hc0J5dGVDb21wYXJhYmxlID0gYXNCeXRlQ29tcGFyYWJsZTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtMTk3LDYgKzIwOCwxNiBAQAogICAgICAgICAgICAgICAgICA/ICh0aGlzID09IElOQ0xfRU5EX0VYQ0xfU1RBUlRfQk9VTkRBUlkgPyBJTkNMX0VORF9CT1VORCA6IEVYQ0xfRU5EX0JPVU5EKQogICAgICAgICAgICAgICAgICA6ICh0aGlzID09IElOQ0xfRU5EX0VYQ0xfU1RBUlRfQk9VTkRBUlkgPyBFWENMX1NUQVJUX0JPVU5EIDogSU5DTF9TVEFSVF9CT1VORCk7CiAgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBSZXR1cm5zIGEgdGVybWluYXRvciB2YWx1ZSBmb3IgdGhpcyBjbHVzdGVyaW5nIHR5cGUgdGhhdCBpcyBzdWl0YWJsZSBmb3IgYnl0ZSBjb21wYXJpc29uLgorICAgICAgICAgKiBJbmNsdXNpdmUgc3RhcnRzIC8gZXhjbHVzaXZlIGVuZHMgbmVlZCBhIGxvd2VyIHZhbHVlIHRoYW4gQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCBhbmQgdGhlIGNsdXN0ZXJpbmcgYnl0ZSwKKyAgICAgICAgICogZXhjbHVzaXZlIHN0YXJ0cyAvIGluY2x1c2l2ZSBlbmRzIC0tIGEgaGlnaGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBhc0J5dGVDb21wYXJhYmxlVmFsdWUoVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXNCeXRlQ29tcGFyYWJsZS5hcHBseUFzSW50KHZlcnNpb24pOworICAgICAgICB9CiAgICAgfQogCiAgICAgZGVmYXVsdCBib29sZWFuIGlzQm90dG9tKCkKQEAgLTI5Miw2ICszMTMsMjIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpOwogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGlzIHByZWZpeCBhcyBhIHN0YXJ0IGJvdW5kLgorICAgICAqIElmIHRoaXMgcHJlZml4IGlzIGEgYm91bmQsIGp1c3QgcmV0dXJucyBpdCBhc3NlcnRpbmcgdGhhdCBpdCBpcyBhIHN0YXJ0IGJvdW5kLgorICAgICAqIElmIHRoaXMgcHJlZml4IGlzIGEgY2x1c3RlcmluZywgcmV0dXJucyBhbiBpbmNsdWRlZCBzdGFydCBib3VuZC4KKyAgICAgKiBJZiB0aGlzIHByZWZpeCBpcyBhIGJvdW5kYXJ5LCByZXR1cm5zIGFuIG9wZW4gYm91bmQgb2YgaXQKKyAgICAgKi8KKyAgICBDbHVzdGVyaW5nQm91bmQ8Vj4gYXNTdGFydEJvdW5kKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoaXMgcHJlZml4IGFzIGFuIGVuZCBib3VuZC4KKyAgICAgKiBJZiB0aGlzIHByZWZpeCBpcyBhIGJvdW5kLCBqdXN0IHJldHVybnMgaXQgYXNzZXJ0aW5nIHRoYXQgaXQgaXMgYW4gZW5kIGJvdW5kLgorICAgICAqIElmIHRoaXMgcHJlZml4IGlzIGEgY2x1c3RlcmluZywgcmV0dXJucyBhbiBpbmNsdWRlZCBlbmQgYm91bmQuCisgICAgICogSW4gdGhpcyBwcmVmaXggaXMgYSBib3VuZGFyeSwgcmV0dXJucyBhIGNsb3NlIGJvdW5kIG9mIGl0LgorICAgICAqLworICAgIENsdXN0ZXJpbmdCb3VuZDxWPiBhc0VuZEJvdW5kKCk7CisKICAgICAvKgogICAgICAqIFRPRE86IHdlIHNob3VsZCBzdG9wIHVzaW5nIENsdXN0ZXJpbmcgZm9yIHBhcnRpdGlvbiBrZXlzLiBNYXliZSB3ZSBjYW4gYWRkCiAgICAgICogYSBmZXcgbWV0aG9kcyB0byBEZWNvcmF0ZWRLZXkgc28gd2UgZG9uJ3QgaGF2ZSB0byAobm90ZSB0aGF0IHdoaWxlIHVzaW5nIGEgQ2x1c3RlcmluZwpAQCAtMzA4LDYgKzM0NSwyNCBAQAogICAgICAgICAgICAgdmFsdWVzW2ldID0gYWNjZXNzb3IoKS50b0J1ZmZlcihnZXQoaSkpOwogICAgICAgICByZXR1cm4gQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHZhbHVlcyk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogUHJvZHVjZSBhIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbHVzdGVyaW5nIGdpdmVuIHRoZSBsaXN0IG9mIHR5cGVzLgorICAgICAqIEVhc2llciB0byBhY2Nlc3MgdGhhbiBtZXRhZGF0YSBmb3IgZGVidWdnaW5nLgorICAgICAqLworICAgIHB1YmxpYyBkZWZhdWx0IFN0cmluZyBjbHVzdGVyaW5nU3RyaW5nKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiB0eXBlcykKKyAgICB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzYi5hcHBlbmQoa2luZCgpKS5hcHBlbmQoJygnKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh0eXBlcy5nZXQoaSkuZ2V0U3RyaW5nKGdldChpKSwgYWNjZXNzb3IoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi5hcHBlbmQoJyknKS50b1N0cmluZygpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFRoZSB2YWx1ZXMgb2YgdGhpcyBwcmVmaXggYXMgYW4gYXJyYXkuCiAgICAgICogPHA+CkBAIC0zMjIsMTAgKzM3NywxMSBAQAogICAgIHB1YmxpYyBCeXRlQnVmZmVyW10gZ2V0QnVmZmVyQXJyYXkoKTsKIAogICAgIC8qKgotICAgICAqIElmIHRoZSBwcmVmaXggY29udGFpbnMgYnl0ZSBidWZmZXJzIHRoYXQgY2FuIGJlIG1pbmltaXplZCAoc2VlIHtAbGluayBCeXRlQnVmZmVyVXRpbCNtaW5pbWFsQnVmZmVyRm9yKEJ5dGVCdWZmZXIpfSksCi0gICAgICogdGhpcyB3aWxsIHJldHVybiBhIGNvcHkgb2YgdGhlIHByZWZpeCB3aXRoIG1pbmltaXplZCB2YWx1ZXMsIG90aGVyd2lzZSBpdCByZXR1cm5zIGl0c2VsZi4KKyAgICAgKiBSZXR1cm4gdGhlIGtleSBpbiBhIGZvcm0gdGhhdCBjYW4gYmUgcmV0YWluZWQgZm9yIGxvbmdlci10ZXJtIHVzZS4gVGhpcyBtZWFucyBleHRyYWN0aW5nIGtleXMgc3RvcmVkIGluIHNoYXJlZAorICAgICAqIG1lbW9yeSAoaS5lLiBpbiBtZW10YWJsZXMpIHRvIG1pbmltaXplZCBvbi1oZWFwIHZlcnNpb25zLgorICAgICAqIElmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBpbiBtaW5pbWFsIGZvcm0sIG5vIGFjdGlvbiB3aWxsIGJlIHRha2VuLgogICAgICAqLwotICAgIHB1YmxpYyBDbHVzdGVyaW5nUHJlZml4PFY+IG1pbmltaXplKCk7CisgICAgcHVibGljIENsdXN0ZXJpbmdQcmVmaXg8Vj4gcmV0YWluYWJsZSgpOwogCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZXJpYWxpemVyCiAgICAgewpAQCAtNjc2LDQgKzczMiw0IEBACiAgICAgICAgIHJldHVybiBlcXVhbHMocHJlZml4LCAoQ2x1c3RlcmluZ1ByZWZpeDw/Pikgbyk7CiAgICAgfQogCi19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ29sdW1uRmFtaWx5U3RvcmUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvbHVtbkZhbWlseVN0b3JlLmphdmEKaW5kZXggMzYxOTUyMC4uMWJlMjA4NSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ29sdW1uRmFtaWx5U3RvcmUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5GYW1pbHlTdG9yZS5qYXZhCkBAIC0yMiw3ICsyMiw2IEBACiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwpAQCAtMzksNiArMzgsNyBAQAogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKQEAgLTg0LDIwICs4NCwyMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2c7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1Bvc2l0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW5mbzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5WZXJpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ2x1c3RlcmluZ0luZGV4RmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5EYXRhTGltaXRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLkZsdXNoaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLlNoYXJkQm91bmRhcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlTmV3VHJhY2tlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlNTVGFibGVTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlRyYWNrZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuRmx1c2hpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuTWVtdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuU2hhcmRCb3VuZGFyaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQ2FjaGVkUGFydGl0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uVXBkYXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJlcGFpci5DYXNzYW5kcmFUYWJsZVJlcGFpck1hbmFnZXI7CkBAIC0xMTksMTcgKzExOSwxOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU2NydWJiZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JVmVyaWZpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUlkRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVNdWx0aVdyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlNhbXBsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TYW1wbGVyLlNhbXBsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlNhbXBsZXIuU2FtcGxlclR5cGU7CkBAIC0xNTUsNiArMTU3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLkJhbGxvdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLlBheG9zUmVwYWlySGlzdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLlRhYmxlUGF4b3NSZXBhaXJIaXN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2Uuc25hcHNob3QuU25hcHNob3RMb2FkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5zbmFwc2hvdC5TbmFwc2hvdE1hbmlmZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2Uuc25hcHNob3QuVGFibGVTbmFwc2hvdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuVGFibGVTdHJlYW1NYW5hZ2VyOwpAQCAtMTYzLDggKzE2NiwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkV4ZWN1dG9yVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NQmVhbldyYXBwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTm9TcGFtTG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuV3JhcHBlZFJ1bm5hYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CkBAIC0xNzMsNyArMTc4LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5VbmNoZWNrZWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKIAotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXMucHJvcGFnYXRlOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yRmFjdG9yeS5HbG9iYWwuZXhlY3V0b3JGYWN0b3J5OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yLmdldEZsdXNoV3JpdGVyczsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1Bvc2l0aW9uLk5PTkU7CkBAIC0xODQsNyArMTg4LDcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlcy5tZXJnZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Db3VudERvd25MYXRjaC5uZXdDb3VudERvd25MYXRjaDsKIAotcHVibGljIGNsYXNzIENvbHVtbkZhbWlseVN0b3JlIGltcGxlbWVudHMgQ29sdW1uRmFtaWx5U3RvcmVNQmVhbiwgTWVtdGFibGUuT3duZXIKK3B1YmxpYyBjbGFzcyBDb2x1bW5GYW1pbHlTdG9yZSBpbXBsZW1lbnRzIENvbHVtbkZhbWlseVN0b3JlTUJlYW4sIE1lbXRhYmxlLk93bmVyLCBTU1RhYmxlLk93bmVyCiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbHVtbkZhbWlseVN0b3JlLmNsYXNzKTsKIApAQCAtMzIwLDYgKzMyNCw5IEBACiAKICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gY29tcGFjdGlvblNwYWNlQ2hlY2sgPSB0cnVlOwogCisgICAgLy8gVG9tYnRvbmUgcGFydGl0aW9ucyB0aGF0IGlnbm9yZSB0aGUgZ2NfZ3JhY2Vfc2Vjb25kcyBkdXJpbmcgY29tcGFjdGlvbgorICAgIHByaXZhdGUgZmluYWwgU2V0PERlY29yYXRlZEtleT4gcGFydGl0aW9uS2V5U2V0SWdub3JlR2NHcmFjZSA9IENvbmN1cnJlbnRIYXNoTWFwLm5ld0tleVNldCgpOworCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgZmluYWwgRGlza0JvdW5kYXJ5TWFuYWdlciBkaXNrQm91bmRhcnlNYW5hZ2VyID0gbmV3IERpc2tCb3VuZGFyeU1hbmFnZXIoKTsKICAgICBwcml2YXRlIHZvbGF0aWxlIFNoYXJkQm91bmRhcmllcyBjYWNoZWRTaGFyZEJvdW5kYXJpZXMgPSBudWxsOwpAQCAtMzc4LDcgKzM4NSw3IEBACiAgICAgICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmcyA6IGNvbmNhdFdpdGhJbmRleGVzKCkpCiAgICAgICAgICAgICAgICAgY2ZzLmNyY0NoZWNrQ2hhbmNlID0gbmV3IERlZmF1bHRWYWx1ZShtZXRhZGF0YSgpLnBhcmFtcy5jcmNDaGVja0NoYW5jZSk7CiAKLSAgICAgICAgY29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5tYXliZVJlbG9hZChtZXRhZGF0YSgpKTsKKyAgICAgICAgY29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5tYXliZVJlbG9hZFBhcmFtc0Zyb21TY2hlbWEobWV0YWRhdGEoKS5wYXJhbXMuY29tcGFjdGlvbik7CiAKICAgICAgICAgaW5kZXhNYW5hZ2VyLnJlbG9hZCgpOwogCkBAIC00MDIsNyArNDA5LDcgQEAKIAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFjdGlvblBhcmFtZXRlcnNKc29uKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBGQlV0aWxpdGllcy5qc29uKGdldENvbXBhY3Rpb25QYXJhbWV0ZXJzKCkpOworICAgICAgICByZXR1cm4gSnNvblV0aWxzLndyaXRlQXNKc29uU3RyaW5nKGdldENvbXBhY3Rpb25QYXJhbWV0ZXJzKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldENvbXBhY3Rpb25QYXJhbWV0ZXJzKE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucykKQEAgLTQxMSw3ICs0MTgsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBDb21wYWN0aW9uUGFyYW1zIGNvbXBhY3Rpb25QYXJhbXMgPSBDb21wYWN0aW9uUGFyYW1zLmZyb21NYXAob3B0aW9ucyk7CiAgICAgICAgICAgICBjb21wYWN0aW9uUGFyYW1zLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBjb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLnNldE5ld0xvY2FsQ29tcGFjdGlvblN0cmF0ZWd5KGNvbXBhY3Rpb25QYXJhbXMpOworICAgICAgICAgICAgY29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5vdmVycmlkZUxvY2FsUGFyYW1zKGNvbXBhY3Rpb25QYXJhbXMpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKICAgICAgICAgewpAQCAtNDIzLDcgKzQzMCw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBzZXRDb21wYWN0aW9uUGFyYW1ldGVyc0pzb24oU3RyaW5nIG9wdGlvbnMpCiAgICAgewotICAgICAgICBzZXRDb21wYWN0aW9uUGFyYW1ldGVycyhGQlV0aWxpdGllcy5mcm9tSnNvbk1hcChvcHRpb25zKSk7CisgICAgICAgIHNldENvbXBhY3Rpb25QYXJhbWV0ZXJzKEpzb25VdGlscy5mcm9tSnNvbk1hcChvcHRpb25zKSk7CiAgICAgfQogCiAgICAgcHVibGljIE1hcDxTdHJpbmcsU3RyaW5nPiBnZXRDb21wcmVzc2lvblBhcmFtZXRlcnMoKQpAQCAtNDMzLDcgKzQ0MCw3IEBACiAKICAgICBwdWJsaWMgU3RyaW5nIGdldENvbXByZXNzaW9uUGFyYW1ldGVyc0pzb24oKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEZCVXRpbGl0aWVzLmpzb24oZ2V0Q29tcHJlc3Npb25QYXJhbWV0ZXJzKCkpOworICAgICAgICByZXR1cm4gSnNvblV0aWxzLndyaXRlQXNKc29uU3RyaW5nKGdldENvbXByZXNzaW9uUGFyYW1ldGVycygpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBzZXRDb21wcmVzc2lvblBhcmFtZXRlcnMoTWFwPFN0cmluZyxTdHJpbmc+IG9wdHMpCkBAIC00NTIsNyArNDU5LDcgQEAKIAogICAgIHB1YmxpYyB2b2lkIHNldENvbXByZXNzaW9uUGFyYW1ldGVyc0pzb24oU3RyaW5nIG9wdGlvbnMpCiAgICAgewotICAgICAgICBzZXRDb21wcmVzc2lvblBhcmFtZXRlcnMoRkJVdGlsaXRpZXMuZnJvbUpzb25NYXAob3B0aW9ucykpOworICAgICAgICBzZXRDb21wcmVzc2lvblBhcmFtZXRlcnMoSnNvblV0aWxzLmZyb21Kc29uTWFwKG9wdGlvbnMpKTsKICAgICB9CiAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKQEAgLTUwMiw3ICs1MDksNyBAQAogICAgICAgICBpZiAoZGF0YS5sb2Fkc3N0YWJsZXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIERpcmVjdG9yaWVzLlNTVGFibGVMaXN0ZXIgc3N0YWJsZUZpbGVzID0gZGlyZWN0b3JpZXMuc3N0YWJsZUxpc3RlcihEaXJlY3Rvcmllcy5PblR4bkVyci5JR05PUkUpLnNraXBUZW1wb3JhcnkodHJ1ZSk7Ci0gICAgICAgICAgICBzc3RhYmxlcyA9IFNTVGFibGVSZWFkZXIub3BlbkFsbChzc3RhYmxlRmlsZXMubGlzdCgpLmVudHJ5U2V0KCksIG1ldGFkYXRhKTsKKyAgICAgICAgICAgIHNzdGFibGVzID0gU1NUYWJsZVJlYWRlci5vcGVuQWxsKHRoaXMsIHNzdGFibGVGaWxlcy5saXN0KCkuZW50cnlTZXQoKSwgbWV0YWRhdGEpOwogICAgICAgICAgICAgZGF0YS5hZGRJbml0aWFsU1NUYWJsZXNXaXRob3V0VXBkYXRpbmdTaXplKHNzdGFibGVzKTsKICAgICAgICAgfQogCkBAIC02MDcsNiArNjE0LDcgQEAKICAgICAgICAgcmV0dXJuIGRpcmVjdG9yaWVzOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RGF0YVBhdGhzKCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBMaXN0PFN0cmluZz4gZGF0YVBhdGhzID0gbmV3IEFycmF5TGlzdDw+KCk7CkBAIC03OTIsMTkgKzgwMCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBGaWxlIGRhdGFGaWxlID0gbmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOwotICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LkRBVEEpICYmIGRhdGFGaWxlLmxlbmd0aCgpID4gMCkKLSAgICAgICAgICAgICAgICAvLyBldmVyeXRoaW5nIGFwcGVhcnMgdG8gYmUgaW4gb3JkZXIuLi4gbW92aW5nIG9uLgotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAvLyBtaXNzaW5nIHRoZSBEQVRBIGZpbGUhIGFsbCBjb21wb25lbnRzIGFyZSBvcnBoYW5lZAotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlJlbW92aW5nIG9ycGhhbnMgZm9yIHt9OiB7fSIsIGRlc2MsIGNvbXBvbmVudHMpOwotICAgICAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpOwotICAgICAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlV2l0aENvbmZpcm0oZGVzYy5maWxlbmFtZUZvcihjb21wb25lbnQpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc2MuZ2V0Rm9ybWF0KCkuZGVsZXRlT3JwaGFuZWRDb21wb25lbnRzKGRlc2MsIGNvbXBvbmVudHMpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gY2xlYW51cCBpbmNvbXBsZXRlIHNhdmVkIGNhY2hlcwpAQCAtODgzLDEwICs4NzksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuY2ZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCB0aGUgZ2VuZXJhdGlvbiB1bnRpbCB3ZSBmaW5kIGEgZmlsZW5hbWUgdGhhdCBkb2Vzbid0IGV4aXN0LiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBuZXcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTU1RhYmxlcyB0aGF0IGFyZSBiZWluZyBsb2FkZWQgbWlnaHQgYWxyZWFkeSB1c2UgdGhlc2UgZ2VuZXJhdGlvbiBudW1iZXJzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVJZEdlbmVyYXRvci5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmZvcm1hdFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVJZEdlbmVyYXRvci5nZXQoKSk7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKG5ld0Rlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnQuREFUQSkuZXhpc3RzKCkpOworICAgICAgICB3aGlsZSAobmV3RGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkuZXhpc3RzKCkpOwogICAgICAgICByZXR1cm4gbmV3RGVzY3JpcHRvcjsKICAgICB9CiAKQEAgLTkzMCwyMyArOTI1LDIyIEBACiAKICAgICBwdWJsaWMgRGVzY3JpcHRvciBuZXdTU1RhYmxlRGVzY3JpcHRvcihGaWxlIGRpcmVjdG9yeSkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXdTU1RhYmxlRGVzY3JpcHRvcihkaXJlY3RvcnksIFNTVGFibGVGb3JtYXQuVHlwZS5jdXJyZW50KCkuaW5mby5nZXRMYXRlc3RWZXJzaW9uKCksIFNTVGFibGVGb3JtYXQuVHlwZS5jdXJyZW50KCkpOworICAgICAgICByZXR1cm4gbmV3U1NUYWJsZURlc2NyaXB0b3IoZGlyZWN0b3J5LCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkuZ2V0TGF0ZXN0VmVyc2lvbigpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgRGVzY3JpcHRvciBuZXdTU1RhYmxlRGVzY3JpcHRvcihGaWxlIGRpcmVjdG9yeSwgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdCkKKyAgICBwdWJsaWMgRGVzY3JpcHRvciBuZXdTU1RhYmxlRGVzY3JpcHRvcihGaWxlIGRpcmVjdG9yeSwgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3U1NUYWJsZURlc2NyaXB0b3IoZGlyZWN0b3J5LCBmb3JtYXQuaW5mby5nZXRMYXRlc3RWZXJzaW9uKCksIGZvcm1hdCk7CisgICAgICAgIHJldHVybiBuZXdTU1RhYmxlRGVzY3JpcHRvcihkaXJlY3RvcnksIGZvcm1hdC5nZXRMYXRlc3RWZXJzaW9uKCkpOwogICAgIH0KIAotICAgIHB1YmxpYyBEZXNjcmlwdG9yIG5ld1NTVGFibGVEZXNjcmlwdG9yKEZpbGUgZGlyZWN0b3J5LCBWZXJzaW9uIHZlcnNpb24sIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXQpCisgICAgcHVibGljIERlc2NyaXB0b3IgbmV3U1NUYWJsZURlc2NyaXB0b3IoRmlsZSBkaXJlY3RvcnksIFZlcnNpb24gdmVyc2lvbikKICAgICB7CiAgICAgICAgIERlc2NyaXB0b3IgbmV3RGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKHZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c3BhY2UuZ2V0TmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlSWRHZW5lcmF0b3IuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCk7Ci0gICAgICAgIGFzc2VydCAhbmV3RGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudC5EQVRBKS5leGlzdHMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZUlkR2VuZXJhdG9yLmdldCgpKTsKKyAgICAgICAgYXNzZXJ0ICFuZXdEZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKS5leGlzdHMoKTsKICAgICAgICAgcmV0dXJuIG5ld0Rlc2NyaXB0b3I7CiAgICAgfQogCkBAIC0xMTEyLDcgKzExMDYsMTAgQEAKICAgICAgICAgICAgIG1ldHJpYy5wZW5kaW5nRmx1c2hlcy5kZWMoKTsKIAogICAgICAgICAgICAgaWYgKGZsdXNoRmFpbHVyZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IHByb3BhZ2F0ZShmbHVzaEZhaWx1cmUpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZlVuY2hlY2tlZChmbHVzaEZhaWx1cmUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGZsdXNoRmFpbHVyZSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBjb21taXRMb2dVcHBlckJvdW5kOwogICAgICAgICB9CkBAIC0xMjczLDcgKzEyNzAsOCBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgdCA9IEZsdXNoaW5nLmFib3J0UnVubmFibGVzKGZsdXNoUnVubmFibGVzLCB0KTsKICAgICAgICAgICAgICAgICAgICAgdCA9IHR4bi5hYm9ydCh0KTsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUodCk7CisgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZlVuY2hlY2tlZCh0KTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgdHJ5CkBAIC0xMjk5LDcgKzEyOTcsOCBAQAogICAgICAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVNdWx0aVdyaXRlciB3cml0ZXIgOiBmbHVzaFJlc3VsdHMpCiAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gd3JpdGVyLmFib3J0KHQpOwogICAgICAgICAgICAgICAgICAgICB0ID0gdHhuLmFib3J0KHQpOwotICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnByb3BhZ2F0ZSh0KTsKKyAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlcy50aHJvd0lmVW5jaGVja2VkKHQpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0KTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICB0eG4ucHJlcGFyZVRvQ29tbWl0KCk7CkBAIC0xNDQ4LDQxICsxNDQ3LDYzIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNoYXJkQm91bmRhcmllcyBsb2NhbFJhbmdlU3BsaXRzKGludCBzaGFyZENvdW50KQogICAgIHsKLSAgICAgICAgaWYgKHNoYXJkQ291bnQgPT0gMSB8fCAhZ2V0UGFydGl0aW9uZXIoKS5zcGxpdHRlcigpLmlzUHJlc2VudCgpIHx8IFNjaGVtYUNvbnN0YW50cy5pc0xvY2FsU3lzdGVtS2V5c3BhY2Uoa2V5c3BhY2UuZ2V0TmFtZSgpKSkKKyAgICAgICAgaWYgKHNoYXJkQ291bnQgPT0gMSB8fCAhZ2V0UGFydGl0aW9uZXIoKS5zcGxpdHRlcigpLmlzUHJlc2VudCgpKQogICAgICAgICAgICAgcmV0dXJuIFNoYXJkQm91bmRhcmllcy5OT05FOwogCiAgICAgICAgIFNoYXJkQm91bmRhcmllcyBzaGFyZEJvdW5kYXJpZXMgPSBjYWNoZWRTaGFyZEJvdW5kYXJpZXM7CisKICAgICAgICAgaWYgKHNoYXJkQm91bmRhcmllcyA9PSBudWxsIHx8CiAgICAgICAgICAgICBzaGFyZEJvdW5kYXJpZXMuc2hhcmRDb3VudCgpICE9IHNoYXJkQ291bnQgfHwKLSAgICAgICAgICAgIHNoYXJkQm91bmRhcmllcy5yaW5nVmVyc2lvbiAhPSBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5nZXRUb2tlbk1ldGFkYXRhKCkuZ2V0UmluZ1ZlcnNpb24oKSkKKyAgICAgICAgICAgIHNoYXJkQm91bmRhcmllcy5yaW5nVmVyc2lvbiAhPSAtMSAmJiBzaGFyZEJvdW5kYXJpZXMucmluZ1ZlcnNpb24gIT0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuZ2V0VG9rZW5NZXRhZGF0YSgpLmdldFJpbmdWZXJzaW9uKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIERpc2tCb3VuZGFyeU1hbmFnZXIuVmVyc2lvbmVkUmFuZ2VzQXRFbmRwb2ludCB2ZXJzaW9uZWRMb2NhbFJhbmdlcyA9IERpc2tCb3VuZGFyeU1hbmFnZXIuZ2V0VmVyc2lvbmVkTG9jYWxSYW5nZXModGhpcyk7Ci0gICAgICAgICAgICBTZXQ8UmFuZ2U8VG9rZW4+PiBsb2NhbFJhbmdlcyA9IHZlcnNpb25lZExvY2FsUmFuZ2VzLnJhbmdlc0F0RW5kcG9pbnQucmFuZ2VzKCk7CiAgICAgICAgICAgICBMaXN0PFNwbGl0dGVyLldlaWdodGVkUmFuZ2U+IHdlaWdodGVkUmFuZ2VzOwotICAgICAgICAgICAgaWYgKGxvY2FsUmFuZ2VzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICB3ZWlnaHRlZFJhbmdlcyA9IEltbXV0YWJsZUxpc3Qub2YobmV3IFNwbGl0dGVyLldlaWdodGVkUmFuZ2UoMS4wLCBuZXcgUmFuZ2U8PihnZXRQYXJ0aXRpb25lcigpLmdldE1pbmltdW1Ub2tlbigpLCBnZXRQYXJ0aXRpb25lcigpLmdldE1heGltdW1Ub2tlbigpKSkpOworICAgICAgICAgICAgbG9uZyByaW5nVmVyc2lvbjsKKyAgICAgICAgICAgIGlmICghU2NoZW1hQ29uc3RhbnRzLmlzTG9jYWxTeXN0ZW1LZXlzcGFjZShrZXlzcGFjZS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgJiYgZ2V0UGFydGl0aW9uZXIoKSA9PSBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5nZXRUb2tlbk1ldGFkYXRhKCkucGFydGl0aW9uZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRGlza0JvdW5kYXJ5TWFuYWdlci5WZXJzaW9uZWRSYW5nZXNBdEVuZHBvaW50IHZlcnNpb25lZExvY2FsUmFuZ2VzID0gRGlza0JvdW5kYXJ5TWFuYWdlci5nZXRWZXJzaW9uZWRMb2NhbFJhbmdlcyh0aGlzKTsKKyAgICAgICAgICAgICAgICBTZXQ8UmFuZ2U8VG9rZW4+PiBsb2NhbFJhbmdlcyA9IHZlcnNpb25lZExvY2FsUmFuZ2VzLnJhbmdlc0F0RW5kcG9pbnQucmFuZ2VzKCk7CisgICAgICAgICAgICAgICAgcmluZ1ZlcnNpb24gPSB2ZXJzaW9uZWRMb2NhbFJhbmdlcy5yaW5nVmVyc2lvbjsKKworICAgICAgICAgICAgICAgIGlmICghbG9jYWxSYW5nZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ZWRSYW5nZXMgPSBuZXcgQXJyYXlMaXN0PD4obG9jYWxSYW5nZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChSYW5nZTxUb2tlbj4gciA6IGxvY2FsUmFuZ2VzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZWlnaHRlZFJhbmdlIHN1cHBvcnRzIG9ubHkgdW53cmFwcGVkIHJhbmdlcyBhcyBpdCByZWxpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIHJpZ2h0IC0gbGVmdCA9PSBudW0gdG9rZW5zIGVxdWFsaXR5CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJhbmdlPFRva2VuPiB1OiByLnVud3JhcCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodGVkUmFuZ2VzLmFkZChuZXcgU3BsaXR0ZXIuV2VpZ2h0ZWRSYW5nZSgxLjAsIHUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3ZWlnaHRlZFJhbmdlcy5zb3J0KENvbXBhcmF0b3IuY29tcGFyaW5nKFNwbGl0dGVyLldlaWdodGVkUmFuZ2U6OmxlZnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ZWRSYW5nZXMgPSBmdWxsV2VpZ2h0ZWRSYW5nZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3ZWlnaHRlZFJhbmdlcyA9IG5ldyBBcnJheUxpc3Q8Pihsb2NhbFJhbmdlcy5zaXplKCkpOwotICAgICAgICAgICAgICAgIGZvciAoUmFuZ2U8VG9rZW4+IHIgOiBsb2NhbFJhbmdlcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlaWdodGVkUmFuZ2Ugc3VwcG9ydHMgb25seSB1bndyYXBwZWQgcmFuZ2VzIGFzIGl0IHJlbGllcwotICAgICAgICAgICAgICAgICAgICAvLyBvbiByaWdodCAtIGxlZnQgPT0gbnVtIHRva2VucyBlcXVhbGl0eQotICAgICAgICAgICAgICAgICAgICBmb3IgKFJhbmdlPFRva2VuPiB1OiByLnVud3JhcCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ZWRSYW5nZXMuYWRkKG5ldyBTcGxpdHRlci5XZWlnaHRlZFJhbmdlKDEuMCwgdSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3ZWlnaHRlZFJhbmdlcy5zb3J0KENvbXBhcmF0b3IuY29tcGFyaW5nKFNwbGl0dGVyLldlaWdodGVkUmFuZ2U6OmxlZnQpKTsKKyAgICAgICAgICAgICAgICAvLyBMb2NhbCB0YWJsZXMgbmVlZCB0byBjb3ZlciB0aGUgZnVsbCB0b2tlbiByYW5nZSBhbmQgZG9uJ3QgY2FyZSBhYm91dCByaW5nIGNoYW5nZXMuCisgICAgICAgICAgICAgICAgLy8gV2UgYWxzbyBlbmQgdXAgaGVyZSBpZiB0aGUgdGFibGUncyBwYXJ0aXRpb25lciBpcyBub3QgdGhlIGRhdGFiYXNlJ3MsIHdoaWNoIGNhbiBoYXBwZW4gaW4gdGVzdHMuCisgICAgICAgICAgICAgICAgd2VpZ2h0ZWRSYW5nZXMgPSBmdWxsV2VpZ2h0ZWRSYW5nZSgpOworICAgICAgICAgICAgICAgIHJpbmdWZXJzaW9uID0gLTE7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIExpc3Q8VG9rZW4+IGJvdW5kYXJpZXMgPSBnZXRQYXJ0aXRpb25lcigpLnNwbGl0dGVyKCkuZ2V0KCkuc3BsaXRPd25lZFJhbmdlcyhzaGFyZENvdW50LCB3ZWlnaHRlZFJhbmdlcywgZmFsc2UpOwogICAgICAgICAgICAgc2hhcmRCb3VuZGFyaWVzID0gbmV3IFNoYXJkQm91bmRhcmllcyhib3VuZGFyaWVzLnN1Ykxpc3QoMCwgYm91bmRhcmllcy5zaXplKCkgLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbmVkTG9jYWxSYW5nZXMucmluZ1ZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaW5nVmVyc2lvbik7CiAgICAgICAgICAgICBjYWNoZWRTaGFyZEJvdW5kYXJpZXMgPSBzaGFyZEJvdW5kYXJpZXM7CiAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIk1lbXRhYmxlIHNoYXJkIGJvdW5kYXJpZXMgZm9yIHt9Lnt9OiB7fSIsIGtleXNwYWNlLmdldE5hbWUoKSwgZ2V0VGFibGVOYW1lKCksIGJvdW5kYXJpZXMpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBzaGFyZEJvdW5kYXJpZXM7CiAgICAgfQogCisgICAgcHJpdmF0ZSBJbW11dGFibGVMaXN0PFNwbGl0dGVyLldlaWdodGVkUmFuZ2U+IGZ1bGxXZWlnaHRlZFJhbmdlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKG5ldyBTcGxpdHRlci5XZWlnaHRlZFJhbmdlKDEuMCwgbmV3IFJhbmdlPD4oZ2V0UGFydGl0aW9uZXIoKS5nZXRNaW5pbXVtVG9rZW4oKSwgZ2V0UGFydGl0aW9uZXIoKS5nZXRNYXhpbXVtVG9rZW4oKSkpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBAcGFyYW0gc3N0YWJsZXMKICAgICAgKiBAcmV0dXJuIHNzdGFibGVzIHdob3NlIGtleSByYW5nZSBvdmVybGFwcyB3aXRoIHRoYXQgb2YgdGhlIGdpdmVuIHNzdGFibGVzLCBub3QgaW5jbHVkaW5nIGl0c2VsZi4KQEAgLTE1MDAsNyArMTUyMSw3IEBACiAgICAgICAgIFZpZXcgdmlldyA9IGRhdGEuZ2V0VmlldygpOwogCiAgICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gc29ydGVkQnlGaXJzdCA9IExpc3RzLm5ld0FycmF5TGlzdChzc3RhYmxlcyk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc29ydGVkQnlGaXJzdCwgKG8xLCBvMikgLT4gbzEuZmlyc3QuY29tcGFyZVRvKG8yLmZpcnN0KSk7CisgICAgICAgIHNvcnRlZEJ5Rmlyc3Quc29ydChTU1RhYmxlUmVhZGVyLnNzdGFibGVDb21wYXJhdG9yKTsKIAogICAgICAgICBMaXN0PEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPj4gYm91bmRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIERlY29yYXRlZEtleSBmaXJzdCA9IG51bGwsIGxhc3QgPSBudWxsOwpAQCAtMTUxNywyMSArMTUzOCwyMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaXJzdCA9IHNzdGFibGUuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IHNzdGFibGUubGFzdDsKKyAgICAgICAgICAgICAgICBmaXJzdCA9IHNzdGFibGUuZ2V0Rmlyc3QoKTsKKyAgICAgICAgICAgICAgICBsYXN0ID0gc3N0YWJsZS5nZXRMYXN0KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNzdGFibGUuZmlyc3QuY29tcGFyZVRvKGxhc3QpIDw9IDApIC8vIHdlIGRvIG92ZXJsYXAKKyAgICAgICAgICAgICAgICBpZiAoc3N0YWJsZS5nZXRGaXJzdCgpLmNvbXBhcmVUbyhsYXN0KSA8PSAwKSAvLyB3ZSBkbyBvdmVybGFwCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3N0YWJsZS5sYXN0LmNvbXBhcmVUbyhsYXN0KSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gc3N0YWJsZS5sYXN0OworICAgICAgICAgICAgICAgICAgICBpZiAoc3N0YWJsZS5nZXRMYXN0KCkuY29tcGFyZVRvKGxhc3QpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBzc3RhYmxlLmdldExhc3QoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgYm91bmRzLmFkZChBYnN0cmFjdEJvdW5kcy5ib3VuZHMoZmlyc3QsIHRydWUsIGxhc3QsIHRydWUpKTsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBzc3RhYmxlLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICBsYXN0ID0gc3N0YWJsZS5sYXN0OworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IHNzdGFibGUuZ2V0Rmlyc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHNzdGFibGUuZ2V0TGFzdCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTYzOSwxMyArMTY2MCwxMyBAQAogICAgICAgICByZXR1cm4gQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGVyZm9ybUNsZWFudXAoQ29sdW1uRmFtaWx5U3RvcmUudGhpcywgam9icyk7CiAgICAgfQogCi0gICAgcHVibGljIENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cyBzY3J1Yihib29sZWFuIGRpc2FibGVTbmFwc2hvdCwgYm9vbGVhbiBza2lwQ29ycnVwdGVkLCBib29sZWFuIGNoZWNrRGF0YSwgYm9vbGVhbiByZWluc2VydE92ZXJmbG93ZWRUVEwsIGludCBqb2JzKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgc2NydWIoYm9vbGVhbiBkaXNhYmxlU25hcHNob3QsIElTY3J1YmJlci5PcHRpb25zIG9wdGlvbnMsIGludCBqb2JzKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgcmV0dXJuIHNjcnViKGRpc2FibGVTbmFwc2hvdCwgc2tpcENvcnJ1cHRlZCwgcmVpbnNlcnRPdmVyZmxvd2VkVFRMLCBmYWxzZSwgY2hlY2tEYXRhLCBqb2JzKTsKKyAgICAgICAgcmV0dXJuIHNjcnViKGRpc2FibGVTbmFwc2hvdCwgZmFsc2UsIG9wdGlvbnMsIGpvYnMpOwogICAgIH0KIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgc2NydWIoYm9vbGVhbiBkaXNhYmxlU25hcHNob3QsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgYm9vbGVhbiByZWluc2VydE92ZXJmbG93ZWRUVEwsIGJvb2xlYW4gYWx3YXlzRmFpbCwgYm9vbGVhbiBjaGVja0RhdGEsIGludCBqb2JzKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgc2NydWIoYm9vbGVhbiBkaXNhYmxlU25hcHNob3QsIGJvb2xlYW4gYWx3YXlzRmFpbCwgSVNjcnViYmVyLk9wdGlvbnMgb3B0aW9ucywgaW50IGpvYnMpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgewogICAgICAgICAvLyBza2lwIHNuYXBzaG90IGNyZWF0aW9uIGR1cmluZyBzY3J1YiwgU0VFIEpJUkEgNTg5MQogICAgICAgICBpZighZGlzYWJsZVNuYXBzaG90KQpAQCAtMTY1Nyw3ICsxNjc4LDcgQEAKIAogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnBlcmZvcm1TY3J1YihDb2x1bW5GYW1pbHlTdG9yZS50aGlzLCBza2lwQ29ycnVwdGVkLCBjaGVja0RhdGEsIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTCwgam9icyk7CisgICAgICAgICAgICByZXR1cm4gQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGVyZm9ybVNjcnViKENvbHVtbkZhbWlseVN0b3JlLnRoaXMsIG9wdGlvbnMsIGpvYnMpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoKFRocm93YWJsZSB0KQogICAgICAgICB7CkBAIC0xNjkyLDcgKzE3MTMsNyBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwdWJsaWMgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIHZlcmlmeShWZXJpZmllci5PcHRpb25zIG9wdGlvbnMpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgcHVibGljIENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cyB2ZXJpZnkoSVZlcmlmaWVyLk9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KICAgICB7CiAgICAgICAgIHJldHVybiBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wZXJmb3JtVmVyaWZ5KENvbHVtbkZhbWlseVN0b3JlLnRoaXMsIG9wdGlvbnMpOwogICAgIH0KQEAgLTE3MDAsOSArMTcyMSw5IEBACiAgICAgLyoqCiAgICAgICogUmV3cml0ZXMgYWxsIFNTVGFibGVzIGFjY29yZGluZyB0byBzcGVjaWZpZWQgcGFyYW1ldGVycwogICAgICAqCi0gICAgICogQHBhcmFtIHNraXBJZkN1cnJlbnRWZXJzaW9uIC0gaWYge0BsaW5rIHRydWV9LCB3aWxsIHJld3JpdGUgb25seSBTU1RhYmxlcyB0aGF0IGhhdmUgdmVyc2lvbiBvbGRlciB0aGFuIHRoZSBjdXJyZW50IG9uZSAoe0BsaW5rIEJpZ0Zvcm1hdCNsYXRlc3RWZXJzaW9ufSkKKyAgICAgKiBAcGFyYW0gc2tpcElmQ3VycmVudFZlcnNpb24gLSBpZiB7QGxpbmsgdHJ1ZX0sIHdpbGwgcmV3cml0ZSBvbmx5IFNTVGFibGVzIHRoYXQgaGF2ZSB2ZXJzaW9uIG9sZGVyIHRoYW4gdGhlIGN1cnJlbnQgb25lICh7QGxpbmsgU1NUYWJsZUZvcm1hdCNnZXRMYXRlc3RWZXJzaW9uKCl9KQogICAgICAqIEBwYXJhbSBza2lwSWZOZXdlclRoYW5UaW1lc3RhbXAgLSBtYXggdGltZXN0YW1wIChsb2NhbCBjcmVhdGlvbiB0aW1lKSBmb3IgU1NUYWJsZTsgU1NUYWJsZXMgY3JlYXRlZCBfYWZ0ZXJfIHRoaXMgdGltZXN0YW1wIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSBjb21wYWN0aW9uCi0gICAgICogQHBhcmFtIHNraXBJZkNvbXByZXNzaW9uTWF0Y2hlcyAtIGlmIHtAbGluayB0cnVlfSwgd2lsbCByZXdyaXRlIG9ubHkgU1NUYWJsZXMgd2hvc2UgY29tcHJlc3Npb24gcGFyYW1ldGVycyBhcmUgZGlmZmVyZW50IGZyb20ge0BsaW5rIENGTWV0YURhdGEjY29tcHJlc3Npb25QYXJhbXMoKX0KKyAgICAgKiBAcGFyYW0gc2tpcElmQ29tcHJlc3Npb25NYXRjaGVzIC0gaWYge0BsaW5rIHRydWV9LCB3aWxsIHJld3JpdGUgb25seSBTU1RhYmxlcyB3aG9zZSBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFyZSBkaWZmZXJlbnQgZnJvbSB7QGxpbmsgVGFibGVNZXRhZGF0YSNwYXJhbXMjZ2V0Q29tcHJlc3Npb25QYXJhbWV0ZXJzKCl9ICgpfQogICAgICAqIEBwYXJhbSBqb2JzIG51bWJlciBvZiBqb2JzIGZvciBwYXJhbGxlbCBleGVjdXRpb24KICAgICAgKi8KICAgICBwdWJsaWMgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIHNzdGFibGVzUmV3cml0ZShmaW5hbCBib29sZWFuIHNraXBJZkN1cnJlbnRWZXJzaW9uLApAQCAtMTgwMiw3ICsxODIzLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbiAhPSBudWxsICYmIHNlc3Npb25zLmNvbnRhaW5zKHNlc3Npb24pOwogICAgICAgICAgICAgfTsKICAgICAgICAgICAgIHJldHVybiBydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZCgoKSAtPiBjb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLnJlbGVhc2VSZXBhaXJEYXRhKHNlc3Npb25zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWNhdGUsIGZhbHNlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWNhdGUsIE9wZXJhdGlvblR5cGUuU1RSRUFNLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0xOTExLDI3ICsxOTMyLDUzIEBACiAKICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFNTVGFibGVzRm9yS2V5KFN0cmluZyBrZXksIGJvb2xlYW4gaGV4Rm9ybWF0KQogICAgIHsKKyAgICAgICAgcmV0dXJuIHdpdGhTU1RhYmxlc0ZvcktleShrZXksIGhleEZvcm1hdCwgU1NUYWJsZVJlYWRlcjo6Z2V0RmlsZW5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgU2V0PFN0cmluZz4+IGdldFNTVGFibGVzRm9yS2V5V2l0aExldmVsKFN0cmluZyBrZXksIGJvb2xlYW4gaGV4Rm9ybWF0KQorICAgIHsKKyAgICAgICAgTGlzdDxQYWlyPEludGVnZXIsIFN0cmluZz4+IHNzdHMgPSB3aXRoU1NUYWJsZXNGb3JLZXkoa2V5LCBoZXhGb3JtYXQsIHNzdHIgLT4gUGFpci5jcmVhdGUoc3N0ci5nZXRTU1RhYmxlTGV2ZWwoKSwgc3N0ci5nZXRGaWxlbmFtZSgpKSk7CisgICAgICAgIEhhc2hNYXA8SW50ZWdlciwgU2V0PFN0cmluZz4+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChQYWlyPEludGVnZXIsIFN0cmluZz4gc3N0IDogc3N0cykKKyAgICAgICAgeworICAgICAgICAgICAgU2V0PFN0cmluZz4gcGVyTGV2ZWwgPSByZXN1bHQuZ2V0KHNzdC5sZWZ0KTsKKyAgICAgICAgICAgIGlmIChwZXJMZXZlbCA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBlckxldmVsID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoc3N0LmxlZnQsIHBlckxldmVsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGVyTGV2ZWwuYWRkKHNzdC5yaWdodCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyA8VD4gTGlzdDxUPiB3aXRoU1NUYWJsZXNGb3JLZXkoU3RyaW5nIGtleSwgYm9vbGVhbiBoZXhGb3JtYXQsIEZ1bmN0aW9uPFNTVGFibGVSZWFkZXIsIFQ+IG1hcHBlcikKKyAgICB7CiAgICAgICAgIEJ5dGVCdWZmZXIga2V5QnVmZmVyID0gaGV4Rm9ybWF0ID8gQnl0ZUJ1ZmZlclV0aWwuaGV4VG9CeXRlcyhrZXkpIDogbWV0YWRhdGEoKS5wYXJ0aXRpb25LZXlUeXBlLmZyb21TdHJpbmcoa2V5KTsKICAgICAgICAgRGVjb3JhdGVkS2V5IGRrID0gZGVjb3JhdGVLZXkoa2V5QnVmZmVyKTsKICAgICAgICAgdHJ5IChPcE9yZGVyLkdyb3VwIG9wID0gcmVhZE9yZGVyaW5nLnN0YXJ0KCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgTGlzdDxUPiBtYXBwZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RyIDogc2VsZWN0KFZpZXcuc2VsZWN0KFNTVGFibGVTZXQuTElWRSwgZGspKS5zc3RhYmxlcykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUga2V5IGFjdHVhbGx5IGV4aXN0cyBpbiB0aGlzIHNzdGFibGUsIHdpdGhvdXQgdXBkYXRpbmcgY2FjaGUgYW5kIHN0YXRzCi0gICAgICAgICAgICAgICAgaWYgKHNzdHIuZ2V0UG9zaXRpb24oZGssIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEsIGZhbHNlKSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBmaWxlcy5hZGQoc3N0ci5nZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoc3N0ci5nZXRQb3NpdGlvbihkaywgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSwgZmFsc2UpID49IDApCisgICAgICAgICAgICAgICAgICAgIG1hcHBlZC5hZGQobWFwcGVyLmFwcGx5KHNzdHIpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmaWxlczsKKyAgICAgICAgICAgIHJldHVybiBtYXBwZWQ7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBiZWdpbkxvY2FsU2FtcGxpbmcoU3RyaW5nIHNhbXBsZXIsIGludCBjYXBhY2l0eSwgaW50IGR1cmF0aW9uTWlsbGlzKQogICAgIHsKICAgICAgICAgbWV0cmljLnNhbXBsZXJzLmdldChTYW1wbGVyVHlwZS52YWx1ZU9mKHNhbXBsZXIpKS5iZWdpblNhbXBsaW5nKGNhcGFjaXR5LCBkdXJhdGlvbk1pbGxpcyk7CiAgICAgfQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaXN0PENvbXBvc2l0ZURhdGE+IGZpbmlzaExvY2FsU2FtcGxpbmcoU3RyaW5nIHNhbXBsZXIsIGludCBjb3VudCkgdGhyb3dzIE9wZW5EYXRhRXhjZXB0aW9uCiAgICAgewogICAgICAgICBTYW1wbGVyIHNhbXBsZXJJbXBsID0gbWV0cmljLnNhbXBsZXJzLmdldChTYW1wbGVyVHlwZS52YWx1ZU9mKHNhbXBsZXIpKTsKQEAgLTE5NTAsMTEgKzE5OTcsMTMgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhY3Rpb25EaXNrU3BhY2VDaGVja0VuYWJsZWQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGNvbXBhY3Rpb25TcGFjZUNoZWNrOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNvbXBhY3Rpb25EaXNrU3BhY2VDaGVjayhib29sZWFuIGVuYWJsZSkKICAgICB7CiAgICAgICAgIGNvbXBhY3Rpb25TcGFjZUNoZWNrID0gZW5hYmxlOwpAQCAtMjAyMyw3ICsyMDcyLDYgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEZpbGUgc25hcHNob3REaXJlY3RvcnkgPSBEaXJlY3Rvcmllcy5nZXRTbmFwc2hvdERpcmVjdG9yeShzc1RhYmxlLmRlc2NyaXB0b3IsIHNuYXBzaG90TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIHNzVGFibGUuY3JlYXRlTGlua3Moc25hcHNob3REaXJlY3RvcnkucGF0aCgpLCByYXRlTGltaXRlcik7IC8vIGhhcmQgbGlua3MKLQogICAgICAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIlNuYXBzaG90IGZvciB7fSBrZXlzcGFjZSBkYXRhIGZpbGUge30gY3JlYXRlZCBpbiB7fSIsIGtleXNwYWNlLCBzc1RhYmxlLmdldEZpbGVuYW1lKCksIHNuYXBzaG90RGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgICAgICAgc25hcHNob3R0ZWRTU1RhYmxlcy5hZGQoc3NUYWJsZSk7CkBAIC0yMDQxLDcgKzIwODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbihIYXNoU2V0OjpuZXcpKTsKIAogICAgICAgICAvLyBDcmVhdGUgYW5kIHdyaXRlIHNuYXBzaG90IG1hbmlmZXN0Ci0gICAgICAgIFNuYXBzaG90TWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgU25hcHNob3RNYW5pZmVzdChtYXBUb0RhdGFGaWxlbmFtZXMoc3N0YWJsZXMpLCB0dGwsIGNyZWF0aW9uVGltZSk7CisgICAgICAgIFNuYXBzaG90TWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgU25hcHNob3RNYW5pZmVzdChtYXBUb0RhdGFGaWxlbmFtZXMoc3N0YWJsZXMpLCB0dGwsIGNyZWF0aW9uVGltZSwgZXBoZW1lcmFsKTsKICAgICAgICAgRmlsZSBtYW5pZmVzdEZpbGUgPSBnZXREaXJlY3RvcmllcygpLmdldFNuYXBzaG90TWFuaWZlc3RGaWxlKHRhZyk7CiAgICAgICAgIHdyaXRlU25hcHNob3RNYW5pZmVzdChtYW5pZmVzdCwgbWFuaWZlc3RGaWxlKTsKICAgICAgICAgc25hcHNob3REaXJzLmFkZChtYW5pZmVzdEZpbGUucGFyZW50KCkudG9BYnNvbHV0ZSgpKTsgLy8gbWFuaWZlc3QgbWF5IGNyZWF0ZSBlbXB0eSBzbmFwc2hvdCBkaXIKQEAgLTIwNTQsMTYgKzIxMDIsOSBAQAogICAgICAgICAgICAgc25hcHNob3REaXJzLmFkZChzY2hlbWFGaWxlLnBhcmVudCgpLnRvQWJzb2x1dGUoKSk7IC8vIHNjaGVtYSBtYXkgY3JlYXRlIGVtcHR5IHNuYXBzaG90IGRpcgogICAgICAgICB9CiAKLSAgICAgICAgLy8gTWF5YmUgY3JlYXRlIGVwaGVtZXJhbCBtYXJrZXIKLSAgICAgICAgaWYgKGVwaGVtZXJhbCkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBlcGhlbWVyYWxTbmFwc2hvdE1hcmtlciA9IGdldERpcmVjdG9yaWVzKCkuZ2V0TmV3RXBoZW1lcmFsU25hcHNob3RNYXJrZXJGaWxlKHRhZyk7Ci0gICAgICAgICAgICBjcmVhdGVFcGhlbWVyYWxTbmFwc2hvdE1hcmtlckZpbGUodGFnLCBlcGhlbWVyYWxTbmFwc2hvdE1hcmtlcik7Ci0gICAgICAgICAgICBzbmFwc2hvdERpcnMuYWRkKGVwaGVtZXJhbFNuYXBzaG90TWFya2VyLnBhcmVudCgpLnRvQWJzb2x1dGUoKSk7IC8vIG1hcmtlciBtYXkgY3JlYXRlIGVtcHR5IHNuYXBzaG90IGRpcgotICAgICAgICB9Ci0KLSAgICAgICAgVGFibGVTbmFwc2hvdCBzbmFwc2hvdCA9IG5ldyBUYWJsZVNuYXBzaG90KG1ldGFkYXRhLmtleXNwYWNlLCBtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS5pZC5hc1VVSUQoKSwgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3QuY3JlYXRlZEF0LCBtYW5pZmVzdC5leHBpcmVzQXQsIHNuYXBzaG90RGlycyk7CisgICAgICAgIFRhYmxlU25hcHNob3Qgc25hcHNob3QgPSBuZXcgVGFibGVTbmFwc2hvdChtZXRhZGF0YS5rZXlzcGFjZSwgbWV0YWRhdGEubmFtZSwgbWV0YWRhdGEuaWQuYXNVVUlEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcsIG1hbmlmZXN0LmNyZWF0ZWRBdCwgbWFuaWZlc3QuZXhwaXJlc0F0LCBzbmFwc2hvdERpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdC5lcGhlbWVyYWwpOwogCiAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmFkZFNuYXBzaG90KHNuYXBzaG90KTsKICAgICAgICAgcmV0dXJuIHNuYXBzaG90OwpAQCAtMjA4NSw3ICsyMTI2LDcgQEAKIAogICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1hcFRvRGF0YUZpbGVuYW1lcyhDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IHNzdGFibGVzKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHNzdGFibGVzLnN0cmVhbSgpLm1hcChzIC0+IHMuZGVzY3JpcHRvci5yZWxhdGl2ZUZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgcmV0dXJuIHNzdGFibGVzLnN0cmVhbSgpLm1hcChzIC0+IHMuZGVzY3JpcHRvci5yZWxhdGl2ZUZpbGVuYW1lRm9yKENvbXBvbmVudHMuREFUQSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlU25hcHNob3RTY2hlbWEoRmlsZSBzY2hlbWFGaWxlKQpAQCAtMjEwOCwzNCArMjE0OSwxOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUVwaGVtZXJhbFNuYXBzaG90TWFya2VyRmlsZShmaW5hbCBTdHJpbmcgc25hcHNob3QsIEZpbGUgZXBoZW1lcmFsU25hcHNob3RNYXJrZXIpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFlcGhlbWVyYWxTbmFwc2hvdE1hcmtlci5wYXJlbnQoKS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICBlcGhlbWVyYWxTbmFwc2hvdE1hcmtlci5wYXJlbnQoKS50cnlDcmVhdGVEaXJlY3RvcmllcygpOwotCi0gICAgICAgICAgICBGaWxlcy5jcmVhdGVGaWxlKGVwaGVtZXJhbFNuYXBzaG90TWFya2VyLnRvUGF0aCgpKTsKLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkNyZWF0ZWQgZXBoZW1lcmFsIHNuYXBzaG90IG1hcmtlciBmaWxlIG9uIHt9LiIsIGVwaGVtZXJhbFNuYXBzaG90TWFya2VyLmFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLndhcm4oU3RyaW5nLmZvcm1hdCgiQ291bGQgbm90IGNyZWF0ZSBtYXJrZXIgZmlsZSAlcyBmb3IgZXBoZW1lcmFsIHNuYXBzaG90ICVzLiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluIGNhc2UgdGhlcmUgaXMgYSBmYWlsdXJlIGluIHRoZSBvcGVyYXRpb24gdGhhdCBjcmVhdGVkICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhpcyBzbmFwc2hvdCwgeW91IG1heSBuZWVkIHRvIGNsZWFuIGl0IG1hbnVhbGx5IGFmdGVyd2FyZHMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBoZW1lcmFsU25hcHNob3RNYXJrZXIuYWJzb2x1dGVQYXRoKCksIHNuYXBzaG90KSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2xlYXJFcGhlbWVyYWxTbmFwc2hvdHMoRGlyZWN0b3JpZXMgZGlyZWN0b3JpZXMpCiAgICAgewogICAgICAgICBSYXRlTGltaXRlciBjbGVhclNuYXBzaG90UmF0ZUxpbWl0ZXIgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U25hcHNob3RSYXRlTGltaXRlcigpOwogCi0gICAgICAgIGZvciAoU3RyaW5nIGVwaGVtZXJhbFNuYXBzaG90IDogZGlyZWN0b3JpZXMubGlzdEVwaGVtZXJhbFNuYXBzaG90cygpKQorICAgICAgICBMaXN0PFRhYmxlU25hcHNob3Q+IGVwaGVtZXJhbFNuYXBzaG90cyA9IG5ldyBTbmFwc2hvdExvYWRlcihkaXJlY3RvcmllcykubG9hZFNuYXBzaG90cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFRhYmxlU25hcHNob3Q6OmlzRXBoZW1lcmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgICAgICBmb3IgKFRhYmxlU25hcHNob3QgZXBoZW1lcmFsU25hcHNob3QgOiBlcGhlbWVyYWxTbmFwc2hvdHMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiQ2xlYXJpbmcgZXBoZW1lcmFsIHNuYXBzaG90IHt9IGxlZnRvdmVyIGZyb20gcHJldmlvdXMgc2Vzc2lvbi4iLCBlcGhlbWVyYWxTbmFwc2hvdCk7Ci0gICAgICAgICAgICBEaXJlY3Rvcmllcy5jbGVhclNuYXBzaG90KGVwaGVtZXJhbFNuYXBzaG90LCBkaXJlY3Rvcmllcy5nZXRDRkRpcmVjdG9yaWVzKCksIGNsZWFyU25hcHNob3RSYXRlTGltaXRlcik7CisgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkNsZWFyaW5nIGVwaGVtZXJhbCBzbmFwc2hvdCB7fSBsZWZ0b3ZlciBmcm9tIHByZXZpb3VzIHNlc3Npb24uIiwgZXBoZW1lcmFsU25hcHNob3QuZ2V0SWQoKSk7CisgICAgICAgICAgICBEaXJlY3Rvcmllcy5jbGVhclNuYXBzaG90KGVwaGVtZXJhbFNuYXBzaG90LmdldFRhZygpLCBkaXJlY3Rvcmllcy5nZXRDRkRpcmVjdG9yaWVzKCksIGNsZWFyU25hcHNob3RSYXRlTGltaXRlcik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIxNTgsNyArMjE4NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgidXNpbmcgc25hcHNob3Qgc3N0YWJsZSB7fSIsIGVudHJpZXMuZ2V0S2V5KCkpOwogICAgICAgICAgICAgICAgICAgICAvLyBvcGVuIG9mZmxpbmUgc28gd2UgZG9uJ3QgbW9kaWZ5IGNvbXBvbmVudHMgb3IgdHJhY2sgaG90bmVzcy4KLSAgICAgICAgICAgICAgICAgICAgc3N0YWJsZSA9IFNTVGFibGVSZWFkZXIub3BlbihlbnRyaWVzLmdldEtleSgpLCBlbnRyaWVzLmdldFZhbHVlKCksIG1ldGFkYXRhLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgc3N0YWJsZSA9IFNTVGFibGVSZWFkZXIub3Blbih0aGlzLCBlbnRyaWVzLmdldEtleSgpLCBlbnRyaWVzLmdldFZhbHVlKCksIG1ldGFkYXRhLCB0cnVlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgcmVmcy50cnlSZWYoc3N0YWJsZSk7CiAgICAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2UgdGhlIHNlbGYgcmVmIGFzIHdlIG5ldmVyIGFkZCB0aGUgc25hcHNob3Qgc3N0YWJsZSB0byBEYXRhVHJhY2tlciB3aGVyZSBpdCBpcyBvdGhlcndpc2UgcmVsZWFzZWQKICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5zZWxmUmVmKCkucmVsZWFzZSgpOwpAQCAtMjQwOSw2ICsyNDM1LDMxIEBACiAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmZvcmNlQ29tcGFjdGlvbkZvcktleSh0aGlzLCBrZXkpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGZvcmNlQ29tcGFjdGlvbktleXNJZ25vcmluZ0djR3JhY2UoU3RyaW5nLi4uIHBhcnRpdGlvbktleXNJZ25vcmVHY0dyYWNlKQorICAgIHsKKyAgICAgICAgTGlzdDxEZWNvcmF0ZWRLZXk+IGRlY29yYXRlZEtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcnRpdGlvbktleVNldElnbm9yZUdjR3JhY2UuY2xlYXIoKTsKKworICAgICAgICAgICAgZm9yIChTdHJpbmcga2V5IDogcGFydGl0aW9uS2V5c0lnbm9yZUdjR3JhY2UpIHsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZGsgPSBkZWNvcmF0ZUtleShtZXRhZGF0YSgpLnBhcnRpdGlvbktleVR5cGUuZnJvbVN0cmluZyhrZXkpKTsKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb25LZXlTZXRJZ25vcmVHY0dyYWNlLmFkZChkayk7CisgICAgICAgICAgICAgICAgZGVjb3JhdGVkS2V5cy5hZGQoZGspOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5mb3JjZUNvbXBhY3Rpb25Gb3JLZXlzKHRoaXMsIGRlY29yYXRlZEtleXMpOworICAgICAgICB9IGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgcGFydGl0aW9uS2V5U2V0SWdub3JlR2NHcmFjZS5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gc2hvdWxkSWdub3JlR2NHcmFjZUZvcktleShEZWNvcmF0ZWRLZXkgZGspCisgICAgeworICAgICAgICByZXR1cm4gcGFydGl0aW9uS2V5U2V0SWdub3JlR2NHcmFjZS5jb250YWlucyhkayk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDb2x1bW5GYW1pbHlTdG9yZT4gYWxsKCkKICAgICB7CiAgICAgICAgIExpc3Q8SXRlcmFibGU8Q29sdW1uRmFtaWx5U3RvcmU+PiBzdG9yZXMgPSBuZXcgQXJyYXlMaXN0PD4oU2NoZW1hLmluc3RhbmNlLmdldEtleXNwYWNlcygpLnNpemUoKSk7CkBAIC0yNDc0LDcgKzI1MjUsOCBAQAogICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1lbXRhYmxlQ29udGVudC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIFRocm93YWJsZXMucHJvcGFnYXRlKHQpOworICAgICAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZlVuY2hlY2tlZCh0KTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI1NTksNyArMjYxMSw3IEBACiAgICAgICAgICAgICBjZnMucnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQoKENhbGxhYmxlPFZvaWQ+KSAoKSAtPiB7CiAgICAgICAgICAgICAgICAgY2ZzLmRhdGEucmVzZXQobWVtdGFibGVGYWN0b3J5LmNyZWF0ZShuZXcgQXRvbWljUmVmZXJlbmNlPD4oQ29tbWl0TG9nUG9zaXRpb24uTk9ORSksIGNmcy5tZXRhZGF0YSwgY2ZzKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9LCB0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICB9LCBPcGVyYXRpb25UeXBlLlAwLCB0cnVlLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI2MDAsNyArMjY1Miw3IEBACiAKICAgICAgICAgaWYgKCFub1NuYXBzaG90ICYmCiAgICAgICAgICAgICAgICAoKGtleXNwYWNlLmdldE1ldGFkYXRhKCkucGFyYW1zLmR1cmFibGVXcml0ZXMgJiYgIW1lbXRhYmxlV3JpdGVzQXJlRHVyYWJsZSgpKSAgLy8gbmVlZCB0byBjbGVhciBkaXJ0eSByZWdpb25zCi0gICAgICAgICAgICAgICB8fCBEYXRhYmFzZURlc2NyaXB0b3IuaXNBdXRvU25hcHNob3QoKSkpIC8vIG5lZWQgc3N0YWJsZSBmb3Igc25hcHNob3QKKyAgICAgICAgICAgICAgIHx8IGlzQXV0b1NuYXBzaG90RW5hYmxlZCgpKSkKICAgICAgICAgewogICAgICAgICAgICAgcmVwbGF5QWZ0ZXIgPSBmb3JjZUJsb2NraW5nRmx1c2goRmx1c2hSZWFzb24uVFJVTkNBVEUpOwogICAgICAgICAgICAgdmlld01hbmFnZXIuZm9yY2VCbG9ja2luZ0ZsdXNoKEZsdXNoUmVhc29uLlRSVU5DQVRFKTsKQEAgLTI2MzMsNyArMjY4NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RvcHBpbmcgcGFyZW50IHNlc3Npb25zIHt9IGR1ZSB0byB0cnVuY2F0aW9uIG9mIHRhYmxlSWQ9IittZXRhZGF0YS5pZCk7CiAgICAgICAgICAgICAgICAgZGF0YS5ub3RpZnlUcnVuY2F0ZWQodHJ1bmNhdGVkQXQpOwogCi0gICAgICAgICAgICBpZiAoIW5vU25hcHNob3QgJiYgRGF0YWJhc2VEZXNjcmlwdG9yLmlzQXV0b1NuYXBzaG90KCkpCisgICAgICAgICAgICBpZiAoIW5vU25hcHNob3QgJiYgaXNBdXRvU25hcHNob3RFbmFibGVkKCkpCiAgICAgICAgICAgICAgICAgc25hcHNob3QoS2V5c3BhY2UuZ2V0VGltZXN0YW1wZWRTbmFwc2hvdE5hbWVXaXRoUHJlZml4KG5hbWUsIFNOQVBTSE9UX1RSVU5DQVRFX1BSRUZJWCksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRBdXRvU25hcHNob3RUdGwoKSk7CiAKICAgICAgICAgICAgIGRpc2NhcmRTU1RhYmxlcyh0cnVuY2F0ZWRBdCk7CkBAIC0yNjQ4LDcgKzI3MDAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9OwogCi0gICAgICAgIHJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKEZ1dHVyZVRhc2suY2FsbGFibGUodHJ1bmNhdGVSdW5uYWJsZSksIHRydWUsIHRydWUpOworICAgICAgICBydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZChGdXR1cmVUYXNrLmNhbGxhYmxlKHRydW5jYXRlUnVubmFibGUpLCBPcGVyYXRpb25UeXBlLlAwLCB0cnVlLCB0cnVlKTsKIAogICAgICAgICB2aWV3TWFuYWdlci5idWlsZCgpOwogCkBAIC0yNjc5LDkgKzI3MzEsOSBAQAogICAgICAgICAgICAgRkJVdGlsaXRpZXMud2FpdE9uRnV0dXJlKGR1bXBNZW10YWJsZSgpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgPFY+IFYgcnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQoQ2FsbGFibGU8Vj4gY2FsbGFibGUsIGJvb2xlYW4gaW50ZXJydXB0VmFsaWRhdGlvbiwgYm9vbGVhbiBpbnRlcnJ1cHRWaWV3cykKKyAgICBwdWJsaWMgPFY+IFYgcnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQoQ2FsbGFibGU8Vj4gY2FsbGFibGUsIE9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSwgYm9vbGVhbiBpbnRlcnJ1cHRWYWxpZGF0aW9uLCBib29sZWFuIGludGVycnVwdFZpZXdzKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKGNhbGxhYmxlLCAoc3N0YWJsZSkgLT4gdHJ1ZSwgaW50ZXJydXB0VmFsaWRhdGlvbiwgaW50ZXJydXB0Vmlld3MsIHRydWUpOworICAgICAgICByZXR1cm4gcnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQoY2FsbGFibGUsIChzc3RhYmxlKSAtPiB0cnVlLCBvcGVyYXRpb25UeXBlLCBpbnRlcnJ1cHRWYWxpZGF0aW9uLCBpbnRlcnJ1cHRWaWV3cywgdHJ1ZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNjk0LDEzICsyNzQ2LDEzIEBACiAgICAgICogQHBhcmFtIGludGVycnVwdEluZGV4ZXMgaWYgd2Ugc2hvdWxkIGludGVycnVwdCBjb21wYWN0aW9ucyBvbiBpbmRleGVzLiBOT1RFOiBpZiB5b3Ugc2V0IHRoaXMgdG8gdHJ1ZSB5b3VyIHNzdGFibGVQcmVkaWNhdGUKICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGFibGUgdG8gaGFuZGxlIExvY2FsUGFydGl0aW9uZXIgc3N0YWJsZXMhCiAgICAgICovCi0gICAgcHVibGljIDxWPiBWIHJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKENhbGxhYmxlPFY+IGNhbGxhYmxlLCBQcmVkaWNhdGU8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXNQcmVkaWNhdGUsIGJvb2xlYW4gaW50ZXJydXB0VmFsaWRhdGlvbiwgYm9vbGVhbiBpbnRlcnJ1cHRWaWV3cywgYm9vbGVhbiBpbnRlcnJ1cHRJbmRleGVzKQorICAgIHB1YmxpYyA8Vj4gViBydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZChDYWxsYWJsZTxWPiBjYWxsYWJsZSwgUHJlZGljYXRlPFNTVGFibGVSZWFkZXI+IHNzdGFibGVzUHJlZGljYXRlLCBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUsIGJvb2xlYW4gaW50ZXJydXB0VmFsaWRhdGlvbiwgYm9vbGVhbiBpbnRlcnJ1cHRWaWV3cywgYm9vbGVhbiBpbnRlcnJ1cHRJbmRleGVzKQogICAgIHsKICAgICAgICAgLy8gc3luY2hyb25pemUgc28gdGhhdCBjb25jdXJyZW50IGludm9jYXRpb25zIGRvbid0IHJlLWVuYWJsZSBjb21wYWN0aW9ucyBwYXJ0d2F5IHRocm91Z2ggdW5leHBlY3RlZGx5LAogICAgICAgICAvLyBhbmQgc28gd2Ugb25seSBydW4gb25lIG1ham9yIGNvbXBhY3Rpb24gYXQgYSB0aW1lCiAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKICAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJDYW5jZWxsaW5nIGluLXByb2dyZXNzIGNvbXBhY3Rpb25zIGZvciB7fSIsIG1ldGFkYXRhLm5hbWUpOworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJDYW5jZWxsaW5nIGluLXByb2dyZXNzIGNvbXBhY3Rpb25zIGZvciB7fSIsIG1ldGFkYXRhLm5hbWUpOwogICAgICAgICAgICAgSXRlcmFibGU8Q29sdW1uRmFtaWx5U3RvcmU+IHRvSW50ZXJydXB0Rm9yID0gaW50ZXJydXB0SW5kZXhlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb25jYXRXaXRoSW5kZXhlcygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbih0aGlzKTsKQEAgLTI3MDksOSArMjc2MSwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEl0ZXJhYmxlcy5jb25jYXQodG9JbnRlcnJ1cHRGb3IsIHZpZXdNYW5hZ2VyLmFsbFZpZXdzQ2ZzKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdG9JbnRlcnJ1cHRGb3I7CiAKKyAgICAgICAgICAgIEl0ZXJhYmxlPFRhYmxlTWV0YWRhdGE+IHRvSW50ZXJydXB0Rm9yTWV0YWRhdGEgPSBJdGVyYWJsZXMudHJhbnNmb3JtKHRvSW50ZXJydXB0Rm9yLCBDb2x1bW5GYW1pbHlTdG9yZTo6bWV0YWRhdGEpOworCiAgICAgICAgICAgICB0cnkgKENvbXBhY3Rpb25NYW5hZ2VyLkNvbXBhY3Rpb25QYXVzZXIgcGF1c2UgPSBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wYXVzZUdsb2JhbENvbXBhY3Rpb24oKTsKICAgICAgICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuQ29tcGFjdGlvblBhdXNlciBwYXVzZWRTdHJhdGVnaWVzID0gcGF1c2VDb21wYWN0aW9uU3RyYXRlZ2llcyh0b0ludGVycnVwdEZvcikpCiAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTGlzdDxDb21wYWN0aW9uSW5mby5Ib2xkZXI+IHVuaW50ZXJydXB0aWJsZVRhc2tzID0gQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZ2V0Q29tcGFjdGlvbnNNYXRjaGluZyh0b0ludGVycnVwdEZvck1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZm8pIC0+IGluZm8uZ2V0VGFza1R5cGUoKS5wcmlvcml0eSA8PSBvcGVyYXRpb25UeXBlLnByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICBpZiAoIXVuaW50ZXJydXB0aWJsZVRhc2tzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJVbmFibGUgdG8gY2FuY2VsIGluLXByb2dyZXNzIGNvbXBhY3Rpb25zLCBzaW5jZSB0aGV5J3JlIHJ1bm5pbmcgd2l0aCBoaWdoZXIgb3Igc2FtZSBwcmlvcml0eToge30uIFlvdSBjYW4gYWJvcnQgdGhlc2Ugb3BlcmF0aW9ucyB1c2luZyBgbm9kZXRvb2wgc3RvcGAuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pbnRlcnJ1cHRpYmxlVGFza3Muc3RyZWFtKCkubWFwKChjb21wYWN0aW9uKSAtPiBTdHJpbmcuZm9ybWF0KCIlc0AlcyAoJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3Rpb24uZ2V0Q29tcGFjdGlvbkluZm8oKS5nZXRUYXNrVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFjdGlvbi5nZXRDb21wYWN0aW9uSW5mbygpLmdldFRhYmxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0aW9uLmdldENvbXBhY3Rpb25JbmZvKCkuZ2V0VGFza0lkKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCIpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIGludGVycnVwdCBpbi1wcm9ncmVzcyBjb21wYWN0aW9ucwogICAgICAgICAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmludGVycnVwdENvbXBhY3Rpb25Gb3JDRnModG9JbnRlcnJ1cHRGb3IsIHNzdGFibGVzUHJlZGljYXRlLCBpbnRlcnJ1cHRWYWxpZGF0aW9uKTsKICAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS53YWl0Rm9yQ2Vzc2F0aW9uKHRvSW50ZXJydXB0Rm9yLCBzc3RhYmxlc1ByZWRpY2F0ZSk7CkBAIC0yNzIxLDcgKzI3ODgsOSBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNmcy5nZXRUcmFja2VyKCkuZ2V0Q29tcGFjdGluZygpLnN0cmVhbSgpLmFueU1hdGNoKHNzdGFibGVzUHJlZGljYXRlKSkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlVuYWJsZSB0byBjYW5jZWwgaW4tcHJvZ3Jlc3MgY29tcGFjdGlvbnMgZm9yIHt9LiAgUGVyaGFwcyB0aGVyZSBpcyBhbiB1bnVzdWFsbHkgbGFyZ2Ugcm93IGluIHByb2dyZXNzIHNvbWV3aGVyZSwgb3IgdGhlIHN5c3RlbSBpcyBzaW1wbHkgb3ZlcmxvYWRlZC4iLCBtZXRhZGF0YS5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJVbmFibGUgdG8gY2FuY2VsIGluLXByb2dyZXNzIGNvbXBhY3Rpb25zIGZvciB7fS4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGVyaGFwcyB0aGVyZSBpcyBhbiB1bnVzdWFsbHkgbGFyZ2Ugcm93IGluIHByb2dyZXNzIHNvbWV3aGVyZSwgb3IgdGhlIHN5c3RlbSBpcyBzaW1wbHkgb3ZlcmxvYWRlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTI3NzYsNyArMjg0NSw3IEBACiAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwogICAgIH0KIAotICAgIHB1YmxpYyBMaWZlY3ljbGVUcmFuc2FjdGlvbiBtYXJrQWxsQ29tcGFjdGluZyhmaW5hbCBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUpCisgICAgcHVibGljIDxUPiBUIHdpdGhBbGxTU1RhYmxlcyhmaW5hbCBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUsIEZ1bmN0aW9uPExpZmVjeWNsZVRyYW5zYWN0aW9uLCBUPiBvcCkKICAgICB7CiAgICAgICAgIENhbGxhYmxlPExpZmVjeWNsZVRyYW5zYWN0aW9uPiBjYWxsYWJsZSA9ICgpIC0+IHsKICAgICAgICAgICAgIGFzc2VydCBkYXRhLmdldENvbXBhY3RpbmcoKS5pc0VtcHR5KCkgOiBkYXRhLmdldENvbXBhY3RpbmcoKTsKQEAgLTI3ODcsMTAgKzI4NTYsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBtb2RpZmllcjsKICAgICAgICAgfTsKIAotICAgICAgICByZXR1cm4gcnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQoY2FsbGFibGUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gY29tcGFjdGluZyA9IHJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKGNhbGxhYmxlLCBvcGVyYXRpb25UeXBlLCBmYWxzZSwgZmFsc2UpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gb3AuYXBwbHkoY29tcGFjdGluZyk7CisgICAgICAgIH0KICAgICB9CiAKLQogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgIHsKQEAgLTI4NjMsNiArMjkzNCw3IEBACiAgICAgfQogCiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRG91YmxlIGdldENyY0NoZWNrQ2hhbmNlKCkKICAgICB7CiAgICAgICAgIHJldHVybiBjcmNDaGVja0NoYW5jZS52YWx1ZSgpOwpAQCAtMjk4NywyMSArMzA1OSwzNyBAQAogICAgICAgICByZXR1cm4gaW5kZXhNYW5hZ2VyLmdldEJ1aWx0SW5kZXhOYW1lcygpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0VW5sZXZlbGVkU1NUYWJsZXMoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGNvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIuZ2V0VW5sZXZlbGVkU1NUYWJsZXMoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50W10gZ2V0U1NUYWJsZUNvdW50UGVyTGV2ZWwoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGNvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIuZ2V0U1NUYWJsZUNvdW50UGVyTGV2ZWwoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZ1tdIGdldFBlckxldmVsU2l6ZUJ5dGVzKCkKICAgICB7CiAgICAgICAgIHJldHVybiBjb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLmdldFBlckxldmVsU2l6ZUJ5dGVzKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNMZXZlbGVkQ29tcGFjdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gY29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5pc0xldmVsZWRDb21wYWN0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludFtdIGdldFNTVGFibGVDb3VudFBlclRXQ1NCdWNrZXQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIuZ2V0U1NUYWJsZUNvdW50UGVyVFdDU0J1Y2tldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0TGV2ZWxGYW5vdXRTaXplKCkKICAgICB7CiAgICAgICAgIHJldHVybiBjb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLmdldExldmVsRmFub3V0U2l6ZSgpOwpAQCAtMzA2Myw2ICszMTUxLDE2IEBACiAgICAgICAgIHJldHVybiBtZXRhZGF0YSgpLnBhcmFtcy5jYWNoaW5nLmNhY2hlS2V5cygpICYmIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5nZXRDYXBhY2l0eSgpID4gMDsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0F1dG9TbmFwc2hvdEVuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1ldGFkYXRhKCkucGFyYW1zLmFsbG93QXV0b1NuYXBzaG90ICYmIERhdGFiYXNlRGVzY3JpcHRvci5pc0F1dG9TbmFwc2hvdCgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVGFibGVJbmNyZW1lbnRhbEJhY2t1cHNFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBEYXRhYmFzZURlc2NyaXB0b3IuaXNJbmNyZW1lbnRhbEJhY2t1cHNFbmFibGVkKCkgJiYgbWV0YWRhdGEoKS5wYXJhbXMuaW5jcmVtZW50YWxCYWNrdXBzOworICAgIH0KKwogICAgIC8qKgogICAgICAqIERpc2NhcmQgYWxsIFNTVGFibGVzIHRoYXQgd2VyZSBjcmVhdGVkIGJlZm9yZSBnaXZlbiB0aW1lc3RhbXAuCiAgICAgICoKQEAgLTMwOTcsNiArMzE5NSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZG91YmxlIGdldERyb3BwYWJsZVRvbWJzdG9uZVJhdGlvKCkKICAgICB7CiAgICAgICAgIGRvdWJsZSBhbGxEcm9wcGFibGUgPSAwOwpAQCAtMzExMSw2ICszMjEwLDcgQEAKICAgICAgICAgcmV0dXJuIGFsbENvbHVtbnMgPiAwID8gYWxsRHJvcHBhYmxlIC8gYWxsQ29sdW1ucyA6IDA7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgdHJ1ZVNuYXBzaG90c1NpemUoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGdldERpcmVjdG9yaWVzKCkudHJ1ZVNuYXBzaG90c1NpemUoKTsKQEAgLTMxNjAsNiArMzI2MCwzNiBAQAogICAgICAgICByZXR1cm4gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChnZXRJZkV4aXN0cyh0YWJsZUlkKSkubWV0cmljOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdyYWJzIHRoZSBnbG9iYWwgZmlyc3QvbGFzdCB0b2tlbnMgYW1vbmcgc3N0YWJsZXMgYW5kIHJldHVybnMgdGhlIHJhbmdlIG9mIGRhdGEgZGlyZWN0b3JpZXMgdGhhdCBzdGFydC9lbmQgd2l0aCB0aG9zZSB0b2tlbnMuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGRvbmUgdG8gYXZvaWQgZ3JhYmJpbmcgdGhlIGRpc2sgYm91bmRhcmllcyBmb3IgZXZlcnkgc3N0YWJsZSBpbiBjYXNlIG9mIGh1Z2UgY29tcGFjdGlvbnMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8RmlsZT4gZ2V0RGlyZWN0b3JpZXNGb3JGaWxlcyhTZXQ8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMpCisgICAgeworICAgICAgICBEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5W10gd3JpdGVhYmxlTG9jYXRpb25zID0gZGlyZWN0b3JpZXMuZ2V0V3JpdGVhYmxlTG9jYXRpb25zKCk7CisgICAgICAgIGlmICh3cml0ZWFibGVMb2NhdGlvbnMubGVuZ3RoID09IDEgfHwgc3N0YWJsZXMuaXNFbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0PEZpbGU+IHJldCA9IG5ldyBBcnJheUxpc3Q8Pih3cml0ZWFibGVMb2NhdGlvbnMubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeSBkZGlyIDogd3JpdGVhYmxlTG9jYXRpb25zKQorICAgICAgICAgICAgICAgIHJldC5hZGQoZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2soZGRpcikpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIERlY29yYXRlZEtleSBmaXJzdCA9IG51bGw7CisgICAgICAgIERlY29yYXRlZEtleSBsYXN0ID0gbnVsbDsKKyAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwgfHwgZmlyc3QuY29tcGFyZVRvKHNzdGFibGUuZ2V0Rmlyc3QoKSkgPiAwKQorICAgICAgICAgICAgICAgIGZpcnN0ID0gc3N0YWJsZS5nZXRGaXJzdCgpOworICAgICAgICAgICAgaWYgKGxhc3QgPT0gbnVsbCB8fCBsYXN0LmNvbXBhcmVUbyhzc3RhYmxlLmdldExhc3QoKSkgPCAwKQorICAgICAgICAgICAgICAgIGxhc3QgPSBzc3RhYmxlLmdldExhc3QoKTsKKyAgICAgICAgfQorCisgICAgICAgIERpc2tCb3VuZGFyaWVzIGRpc2tCb3VuZGFyaWVzID0gZ2V0RGlza0JvdW5kYXJpZXMoKTsKKyAgICAgICAgcmV0dXJuIGRpc2tCb3VuZGFyaWVzLmdldERpc2tzSW5Cb3VuZHMoZmlyc3QsIGxhc3QpLnN0cmVhbSgpLm1hcChkaXJlY3Rvcmllczo6Z2V0TG9jYXRpb25Gb3JEaXNrKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKwogICAgIHB1YmxpYyBEaXNrQm91bmRhcmllcyBnZXREaXNrQm91bmRhcmllcygpCiAgICAgewogICAgICAgICByZXR1cm4gZGlza0JvdW5kYXJ5TWFuYWdlci5nZXREaXNrQm91bmRhcmllcyh0aGlzKTsKQEAgLTMxOTUsNyArMzMyNSw3IEBACiAKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuaW50ZXJydXB0Q29tcGFjdGlvbkZvckNGcyhjb25jYXRXaXRoSW5kZXhlcygpLCAoc3N0YWJsZSkgLT4gdHJ1ZSwgdHJ1ZSk7CiAKLSAgICAgICAgaWYgKERhdGFiYXNlRGVzY3JpcHRvci5pc0F1dG9TbmFwc2hvdCgpKQorICAgICAgICBpZiAoaXNBdXRvU25hcHNob3RFbmFibGVkKCkpCiAgICAgICAgICAgICBzbmFwc2hvdChLZXlzcGFjZS5nZXRUaW1lc3RhbXBlZFNuYXBzaG90TmFtZVdpdGhQcmVmaXgobmFtZSwgQ29sdW1uRmFtaWx5U3RvcmUuU05BUFNIT1RfRFJPUF9QUkVGSVgpLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0QXV0b1NuYXBzaG90VHRsKCkpOwogCiAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5mb3JjZVJlY3ljbGVBbGxTZWdtZW50cyhDb2xsZWN0aW9ucy5zaW5nbGV0b24obWV0YWRhdGEuaWQpKTsKQEAgLTMzMDcsNiArMzQzNywxOCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldE1heFNTVGFibGVTaXplKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtZXRyaWMubWF4U1NUYWJsZVNpemUuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRNYXhTU1RhYmxlRHVyYXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1ldHJpYy5tYXhTU1RhYmxlRHVyYXRpb24uZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTWFwPFN0cmluZywgTG9uZz4gZ2V0VG9wU2l6ZVBhcnRpdGlvbnMoKQogICAgIHsKICAgICAgICAgaWYgKHRvcFBhcnRpdGlvbnMgPT0gbnVsbCkKQEAgLTMzMzcsNCArMzQ3OSwxNiBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIHJldHVybiB0b3BQYXJ0aXRpb25zLnRvcFRvbWJzdG9uZXMoKS5sYXN0VXBkYXRlOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPcE9yZGVyLkJhcnJpZXIgbmV3UmVhZE9yZGVyaW5nQmFycmllcigpCisgICAgeworICAgICAgICByZXR1cm4gcmVhZE9yZGVyaW5nLm5ld0JhcnJpZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGFibGVNZXRyaWNzIGdldE1ldHJpY3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1ldHJpYzsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5GYW1pbHlTdG9yZU1CZWFuLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5GYW1pbHlTdG9yZU1CZWFuLmphdmEKaW5kZXggZGU3YzkzMy4uMmFlNzdiNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ29sdW1uRmFtaWx5U3RvcmVNQmVhbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvbHVtbkZhbWlseVN0b3JlTUJlYW4uamF2YQpAQCAtMTYyLDYgKzE2MiwxNSBAQAogICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0U1NUYWJsZXNGb3JLZXkoU3RyaW5nIGtleSwgYm9vbGVhbiBoZXhGb3JtYXQpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZmlsZW5hbWVzIHRoYXQgY29udGFpbiB0aGUgZ2l2ZW4ga2V5IGFuZCB3aGljaCBsZXZlbCB0aGV5IGJlbG9uZyB0by4KKyAgICAgKiBSZXF1aXJlcyB0YWJsZSB0byBiZSBjb21wYWN0ZWQgd2l0aCB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5MZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5fQorICAgICAqIEBwYXJhbSBrZXkKKyAgICAgKiBAcGFyYW0gaGV4Rm9ybWF0CisgICAgICogQHJldHVybiBsaXN0IG9mIGZpbGVuYW1lcyBhbmQgbGV2ZWxzIGNvbnRhaW5pbmcgdGhlIGtleQorICAgICAqLworICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgU2V0PFN0cmluZz4+IGdldFNTVGFibGVzRm9yS2V5V2l0aExldmVsKFN0cmluZyBrZXksIGJvb2xlYW4gaGV4Rm9ybWF0KTsKKworICAgIC8qKgogICAgICAqIExvYWQgbmV3IHNzdGFibGVzIGZyb20gdGhlIGdpdmVuIGRpcmVjdG9yeQogICAgICAqCiAgICAgICogQHBhcmFtIHNyY1BhdGhzIHRoZSBwYXRoIHRvIHRoZSBuZXcgc3N0YWJsZXMgLSBpZiBpdCBpcyBhbiBlbXB0eSBzZXQsIHRoZSBkYXRhIGRpcmVjdG9yaWVzIHdpbGwgYmUgc2Nhbm5lZApAQCAtMjI2LDYgKzIzNSwxNyBAQAogICAgIHB1YmxpYyBsb25nW10gZ2V0UGVyTGV2ZWxTaXplQnl0ZXMoKTsKIAogICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFibGUgaXMgdXNpbmcgTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneS4gZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTGV2ZWxlZENvbXBhY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gc3N0YWJsZSBjb3VudCBmb3IgZWFjaCBidWNrZXQgaW4gVFdDUy4gbnVsbCB1bmxlc3MgdGltZSB3aW5kb3cgY29tcGFjdGlvbiBpcyB1c2VkLgorICAgICAqICAgICAgICAgYXJyYXkgaW5kZXggY29ycmVzcG9uZHMgdG8gYnVja2V0KGludFswXSBpcyBmb3IgbW9zdCByZWNlbnQsIC4uLikuCisgICAgICovCisgICAgcHVibGljIGludFtdIGdldFNTVGFibGVDb3VudFBlclRXQ1NCdWNrZXQoKTsKKworICAgIC8qKgogICAgICAqIEByZXR1cm4gc3N0YWJsZSBmYW5vdXQgc2l6ZSBmb3IgbGV2ZWwgY29tcGFjdGlvbiBzdHJhdGVneS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldExldmVsRmFub3V0U2l6ZSgpOwpAQCAtMjc5LDQgKzI5OSwyMyBAQAogICAgIHB1YmxpYyBMb25nIGdldFRvcFNpemVQYXJ0aXRpb25zTGFzdFVwZGF0ZSgpOwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMb25nPiBnZXRUb3BUb21ic3RvbmVQYXJ0aXRpb25zKCk7CiAgICAgcHVibGljIExvbmcgZ2V0VG9wVG9tYnN0b25lUGFydGl0aW9uc0xhc3RVcGRhdGUoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJpZ2dlc3QgU1NUYWJsZSBvZiB0aGlzIHRhYmxlLgorICAgICAqCisgICAgICogQHJldHVybiAocGh5c2ljYWwpIHNpemUgb2YgdGhlIGJpZ2dlc3QgU1NUYWJsZSBvZiB0aGlzIHRhYmxlIG9uIGRpc2sgb3IgMCBpZiBubyBTU1RhYmxlIGlzIHByZXNlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNYXhTU1RhYmxlU2l6ZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbG9uZ2VzdCBkdXJhdGlvbiBvZiBhbiBTU1RhYmxlLCBpbiBtaWxsaXNlY29uZHMsIG9mIHRoaXMgdGFibGUsCisgICAgICogY29tcHV0ZWQgYXMge0Bjb2RlIG1heFRpbWVzdGFtcCAtIG1pblRpbWVzdGFtcH0uCisgICAgICoKKyAgICAgKiBJdCByZXR1cm5zIDAgaWYgdGhlcmUgYXJlIG5vIFNTVGFibGVzIG9yIGlmIHtAY29kZSBtYXhUaW1lc3RhbXB9IG9yIHtAY29kZSBtaW5UaW1lc3RhbXB9IGlzCisgICAgICogZXF1YWwgdG8ge0Bjb2RlIExvbmcuTUFYX1ZBTFVFfS4gRWZmZWN0aXZlbHkgbm9uLXplcm8gZm9yIHRhYmxlcyBvbiB7QGNvZGUgVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBiaWdnZXN0IHtAY29kZSBtYXhUaW1lc3RhbXAgLSBtaW5UaW1lc3RhbXB9IGFtb25nIGFsbCBTU1RhYmxlcyBvZiB0aGlzIHRhYmxlCisgICAgICogb3IgMCBpZiBubyBTU1RhYmxlIGlzIHByZXNlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNYXhTU1RhYmxlRHVyYXRpb24oKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvbHVtbkluZGV4LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5JbmRleC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzg2MGRmLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvbHVtbkluZGV4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuSW50czsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGbHVzaE9ic2VydmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwotCi0vKioKLSAqIENvbHVtbiBpbmRleCBidWlsZGVyIHVzZWQgYnkge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdUYWJsZVdyaXRlcn0uCi0gKiBGb3IgaW5kZXggZW50cmllcyB0aGF0IGV4Y2VlZCB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZyNjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZX0sCi0gKiB0aGlzIHVzZXMgdGhlIHNlcmlhbGl6YXRpb24gbG9naWMgYXMgaW4ge0BsaW5rIFJvd0luZGV4RW50cnl9LgotICovCi1wdWJsaWMgY2xhc3MgQ29sdW1uSW5kZXgKLXsKLSAgICAvLyB1c2VkLCBpZiB0aGUgcm93LWluZGV4LWVudHJ5IHJlYWNoZXMgY29uZmlnIGNvbHVtbl9pbmRleF9jYWNoZV9zaXplCi0gICAgcHJpdmF0ZSBEYXRhT3V0cHV0QnVmZmVyIGJ1ZmZlcjsKLSAgICAvLyB1c2VkIHRvIHRyYWNrIHRoZSBzaXplIG9mIHRoZSBzZXJpYWxpemVkIHNpemUgb2Ygcm93LWluZGV4LWVudHJ5ICh1bnVzZWQgZm9yIGJ1ZmZlcikKLSAgICBwcml2YXRlIGludCBpbmRleFNhbXBsZXNTZXJpYWxpemVkU2l6ZTsKLSAgICAvLyB1c2VkLCB1bnRpbCB0aGUgcm93LWluZGV4LWVudHJ5IHJlYWNoZXMgY29uZmlnIGNvbHVtbl9pbmRleF9jYWNoZV9zaXplCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEluZGV4SW5mbz4gaW5kZXhTYW1wbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICBwcml2YXRlIERhdGFPdXRwdXRCdWZmZXIgcmV1c2FibGVCdWZmZXI7Ci0KLSAgICBwdWJsaWMgaW50IGNvbHVtbkluZGV4Q291bnQ7Ci0gICAgcHJpdmF0ZSBpbnRbXSBpbmRleE9mZnNldHM7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNlcmlhbGl6YXRpb25IZWxwZXIgaGVscGVyOwotICAgIHByaXZhdGUgZmluYWwgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgdmVyc2lvbjsKLSAgICBwcml2YXRlIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyOwotICAgIHByaXZhdGUgbG9uZyBpbml0aWFsUG9zaXRpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCAgSVNlcmlhbGl6ZXI8SW5kZXhJbmZvPiBpZHhTZXJpYWxpemVyOwotICAgIHB1YmxpYyBsb25nIGhlYWRlckxlbmd0aDsKLSAgICBwcml2YXRlIGxvbmcgc3RhcnRQb3NpdGlvbjsKLQotICAgIHByaXZhdGUgaW50IHdyaXR0ZW47Ci0gICAgcHJpdmF0ZSBsb25nIHByZXZpb3VzUm93U3RhcnQ7Ci0KLSAgICBwcml2YXRlIENsdXN0ZXJpbmdQcmVmaXg8Pz4gZmlyc3RDbHVzdGVyaW5nOwotICAgIHByaXZhdGUgQ2x1c3RlcmluZ1ByZWZpeDw/PiBsYXN0Q2x1c3RlcmluZzsKLQotICAgIHByaXZhdGUgRGVsZXRpb25UaW1lIG9wZW5NYXJrZXI7Ci0KLSAgICBwcml2YXRlIGludCBjYWNoZVNpemVUaHJlc2hvbGQ7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IG9ic2VydmVyczsKLQotICAgIHB1YmxpYyBDb2x1bW5JbmRleChTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlRmx1c2hPYnNlcnZlcj4gb2JzZXJ2ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgSVNlcmlhbGl6ZXI8SW5kZXhJbmZvPiBpbmRleEluZm9TZXJpYWxpemVyKQotICAgIHsKLSAgICAgICAgdGhpcy5oZWxwZXIgPSBuZXcgU2VyaWFsaXphdGlvbkhlbHBlcihoZWFkZXIpOwotICAgICAgICB0aGlzLmhlYWRlciA9IGhlYWRlcjsKLSAgICAgICAgdGhpcy53cml0ZXIgPSB3cml0ZXI7Ci0gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb24uY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb24oKTsKLSAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBvYnNlcnZlcnM7Ci0gICAgICAgIHRoaXMuaWR4U2VyaWFsaXplciA9IGluZGV4SW5mb1NlcmlhbGl6ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKQotICAgIHsKLSAgICAgICAgdGhpcy5pbml0aWFsUG9zaXRpb24gPSB3cml0ZXIucG9zaXRpb24oKTsKLSAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSAtMTsKLSAgICAgICAgdGhpcy5zdGFydFBvc2l0aW9uID0gLTE7Ci0gICAgICAgIHRoaXMucHJldmlvdXNSb3dTdGFydCA9IDA7Ci0gICAgICAgIHRoaXMuY29sdW1uSW5kZXhDb3VudCA9IDA7Ci0gICAgICAgIHRoaXMud3JpdHRlbiA9IDA7Ci0gICAgICAgIHRoaXMuaW5kZXhTYW1wbGVzU2VyaWFsaXplZFNpemUgPSAwOwotICAgICAgICB0aGlzLmluZGV4U2FtcGxlcy5jbGVhcigpOwotICAgICAgICB0aGlzLmZpcnN0Q2x1c3RlcmluZyA9IG51bGw7Ci0gICAgICAgIHRoaXMubGFzdENsdXN0ZXJpbmcgPSBudWxsOwotICAgICAgICB0aGlzLm9wZW5NYXJrZXIgPSBudWxsOwotCi0gICAgICAgIGludCBuZXdDYWNoZVNpemVUaHJlc2hvbGQgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemUoKTsKLSAgICAgICAgaWYgKHRoaXMuYnVmZmVyICE9IG51bGwgJiYgdGhpcy5jYWNoZVNpemVUaHJlc2hvbGQgPT0gbmV3Q2FjaGVTaXplVGhyZXNob2xkKQotICAgICAgICAgICAgdGhpcy5yZXVzYWJsZUJ1ZmZlciA9IHRoaXMuYnVmZmVyOwotICAgICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7Ci0gICAgICAgIHRoaXMuY2FjaGVTaXplVGhyZXNob2xkID0gbmV3Q2FjaGVTaXplVGhyZXNob2xkOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkUm93SW5kZXgoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHdyaXRlUGFydGl0aW9uSGVhZGVyKGl0ZXJhdG9yKTsKLSAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSB3cml0ZXIucG9zaXRpb24oKSAtIGluaXRpYWxQb3NpdGlvbjsKLQotICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBVbmZpbHRlcmVkIHVuZmlsdGVyZWQgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICBTU1RhYmxlV3JpdGVyLmd1YXJkQ29sbGVjdGlvblNpemUoaXRlcmF0b3IubWV0YWRhdGEoKSwgaXRlcmF0b3IucGFydGl0aW9uS2V5KCksIHVuZmlsdGVyZWQpOwotICAgICAgICAgICAgYWRkKHVuZmlsdGVyZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluaXNoKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlUGFydGl0aW9uSGVhZGVyKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhTaG9ydExlbmd0aChpdGVyYXRvci5wYXJ0aXRpb25LZXkoKS5nZXRLZXkoKSwgd3JpdGVyKTsKLSAgICAgICAgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGl0ZXJhdG9yLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKSwgd3JpdGVyKTsKLSAgICAgICAgaWYgKGhlYWRlci5oYXNTdGF0aWMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgUm93IHN0YXRpY1JvdyA9IGl0ZXJhdG9yLnN0YXRpY1JvdygpOwotCi0gICAgICAgICAgICBVbmZpbHRlcmVkU2VyaWFsaXplci5zZXJpYWxpemVyLnNlcmlhbGl6ZVN0YXRpY1JvdyhzdGF0aWNSb3csIGhlbHBlciwgd3JpdGVyLCB2ZXJzaW9uKTsKLSAgICAgICAgICAgIGlmICghb2JzZXJ2ZXJzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBvYnNlcnZlcnMuZm9yRWFjaCgobykgLT4gby5uZXh0VW5maWx0ZXJlZENsdXN0ZXIoc3RhdGljUm93KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGxvbmcgY3VycmVudFBvc2l0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB3cml0ZXIucG9zaXRpb24oKSAtIGluaXRpYWxQb3NpdGlvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBidWZmZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlciAhPSBudWxsID8gYnVmZmVyLmJ1ZmZlcigpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxJbmRleEluZm8+IGluZGV4U2FtcGxlcygpCi0gICAgewotICAgICAgICBpZiAoaW5kZXhTYW1wbGVzU2VyaWFsaXplZFNpemUgKyBjb2x1bW5JbmRleENvdW50ICogVHlwZVNpemVzLnNpemVvZigwKSA8PSBjYWNoZVNpemVUaHJlc2hvbGQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbmRleFNhbXBsZXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50W10gb2Zmc2V0cygpCi0gICAgewotICAgICAgICByZXR1cm4gaW5kZXhPZmZzZXRzICE9IG51bGwKLSAgICAgICAgICAgICAgID8gQXJyYXlzLmNvcHlPZihpbmRleE9mZnNldHMsIGNvbHVtbkluZGV4Q291bnQpCi0gICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZEluZGV4QmxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEluZGV4SW5mbyBjSW5kZXhJbmZvID0gbmV3IEluZGV4SW5mbyhmaXJzdENsdXN0ZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q2x1c3RlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb24oKSAtIHN0YXJ0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuTWFya2VyKTsKLQotICAgICAgICAvLyBpbmRleE9mZnNldHMgaXMgdXNlZCBmb3IgYm90aCBzaGFsbG93IChTaGFsbG93SW5kZXhlZEVudHJ5KSBhbmQgbm9uLXNoYWxsb3cgSW5kZXhlZEVudHJ5LgotICAgICAgICAvLyBGb3Igc2hhbGxvdyBvbmVzLCB3ZSBuZWVkIGl0IHRvIHNlcmlhbGl6ZSB0aGUgb2Zmc3RzIGluIGZpbmlzaCgpLgotICAgICAgICAvLyBGb3Igbm9uLXNoYWxsb3cgb25lcywgdGhlIG9mZnN0cyBhcmUgcGFzc2VkIGludG8gSW5kZXhlZEVudHJ5LCBzbyB3ZSBkb24ndCBoYXZlIHRvCi0gICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0cyBhZ2Fpbi4KLQotICAgICAgICAvLyBpbmRleE9mZnNldHMgY29udGFpbnMgdGhlIG9mZnNldHMgb2YgdGhlIHNlcmlhbGl6ZWQgSW5kZXhJbmZvIG9iamVjdHMuCi0gICAgICAgIC8vIEkuZS4gaW5kZXhPZmZzZXRzWzBdIGlzIGFsd2F5cyAwIHNvIHdlIGRvbid0IGhhdmUgdG8gZGVhbCB3aXRoIGEgc3BlY2lhbCBoYW5kbGluZwotICAgICAgICAvLyBmb3IgaW5kZXggIzAgYW5kIGFsd2F5cyBzdWJ0cmFjdGluZyAxIGZvciB0aGUgaW5kZXggKHdoaWNoIGNvdWxkIGJlIGVycm9yLXByb25lKS4KLSAgICAgICAgaWYgKGluZGV4T2Zmc2V0cyA9PSBudWxsKQotICAgICAgICAgICAgaW5kZXhPZmZzZXRzID0gbmV3IGludFsxMF07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4Q291bnQgPj0gaW5kZXhPZmZzZXRzLmxlbmd0aCkKLSAgICAgICAgICAgICAgICBpbmRleE9mZnNldHMgPSBBcnJheXMuY29weU9mKGluZGV4T2Zmc2V0cywgaW5kZXhPZmZzZXRzLmxlbmd0aCArIDEwKTsKLQotICAgICAgICAgICAgLy90aGUgMHRoIGVsZW1lbnQgaXMgYWx3YXlzIDAKLSAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleENvdW50ID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5kZXhPZmZzZXRzW2NvbHVtbkluZGV4Q291bnRdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbmRleE9mZnNldHNbY29sdW1uSW5kZXhDb3VudF0gPQotICAgICAgICAgICAgICAgIGJ1ZmZlciAhPSBudWxsCi0gICAgICAgICAgICAgICAgPyBJbnRzLmNoZWNrZWRDYXN0KGJ1ZmZlci5wb3NpdGlvbigpKQotICAgICAgICAgICAgICAgIDogaW5kZXhTYW1wbGVzU2VyaWFsaXplZFNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29sdW1uSW5kZXhDb3VudCsrOwotCi0gICAgICAgIC8vIEZpcnN0LCB3ZSBjb2xsZWN0IHRoZSBJbmRleEluZm8gb2JqZWN0cyB1bnRpbCB3ZSByZWFjaCBDb25maWcuY29sdW1uX2luZGV4X2NhY2hlX3NpemUgaW4gYW4gQXJyYXlMaXN0LgotICAgICAgICAvLyBXaGVuIGNvbHVtbl9pbmRleF9jYWNoZV9zaXplIGlzIHJlYWNoZWQsIHdlIHN3aXRjaCB0byBieXRlLWJ1ZmZlciBtb2RlLgotICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluZGV4U2FtcGxlc1NlcmlhbGl6ZWRTaXplICs9IGlkeFNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoY0luZGV4SW5mbyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXhTYW1wbGVzU2VyaWFsaXplZFNpemUgKyBjb2x1bW5JbmRleENvdW50ICogVHlwZVNpemVzLnNpemVvZigwKSA+IGNhY2hlU2l6ZVRocmVzaG9sZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWZmZXIgPSByZXVzZU9yQWxsb2NhdGVCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKEluZGV4SW5mbyBpbmRleFNhbXBsZSA6IGluZGV4U2FtcGxlcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlkeFNlcmlhbGl6ZXIuc2VyaWFsaXplKGluZGV4U2FtcGxlLCBidWZmZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbmRleFNhbXBsZXMuYWRkKGNJbmRleEluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIGRvbid0IHB1dCBhbiBlbHNlIGhlcmUgc2luY2UgYnVmZmVyIG1heSBiZSBhbGxvY2F0ZWQgaW4gcHJlY2VkaW5nIGlmIGJsb2NrCi0gICAgICAgIGlmIChidWZmZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWR4U2VyaWFsaXplci5zZXJpYWxpemUoY0luZGV4SW5mbywgYnVmZmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpcnN0Q2x1c3RlcmluZyA9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEYXRhT3V0cHV0QnVmZmVyIHJldXNlT3JBbGxvY2F0ZUJ1ZmZlcigpCi0gICAgewotICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGEgcmV1c2FibGUgRGF0YU91dHB1dEJ1ZmZlciBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcwotICAgICAgICAvLyBDb2x1bW5JbmRleCBpbnN0YW5jZSBhbmQgcmV0dXJuIGl0LgotICAgICAgICBpZiAocmV1c2FibGVCdWZmZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgRGF0YU91dHB1dEJ1ZmZlciBidWZmZXIgPSByZXVzYWJsZUJ1ZmZlcjsKLSAgICAgICAgICAgIGJ1ZmZlci5jbGVhcigpOwotICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKLSAgICAgICAgfQotICAgICAgICAvLyBkb24ndCB1c2UgdGhlIHN0YW5kYXJkIFJFQ1lDTEVSIGFzIHRoYXQgb25seSByZWN5Y2xlcyB1cCB0byAxTUIgYW5kIHJlcXVpcmVzIHByb3BlciBjbGVhbnVwCi0gICAgICAgIHJldHVybiBuZXcgRGF0YU91dHB1dEJ1ZmZlcihjYWNoZVNpemVUaHJlc2hvbGQgKiAyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkKFVuZmlsdGVyZWQgdW5maWx0ZXJlZCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBsb25nIHBvcyA9IGN1cnJlbnRQb3NpdGlvbigpOwotCi0gICAgICAgIGlmIChmaXJzdENsdXN0ZXJpbmcgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQmVnaW5uaW5nIG9mIGFuIGluZGV4IGJsb2NrLiBSZW1lbWJlciB0aGUgc3RhcnQgYW5kIHBvc2l0aW9uCi0gICAgICAgICAgICBmaXJzdENsdXN0ZXJpbmcgPSB1bmZpbHRlcmVkLmNsdXN0ZXJpbmcoKTsKLSAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24gPSBwb3M7Ci0gICAgICAgIH0KLQotICAgICAgICBVbmZpbHRlcmVkU2VyaWFsaXplci5zZXJpYWxpemVyLnNlcmlhbGl6ZSh1bmZpbHRlcmVkLCBoZWxwZXIsIHdyaXRlciwgcG9zIC0gcHJldmlvdXNSb3dTdGFydCwgdmVyc2lvbik7Ci0KLSAgICAgICAgLy8gbm90aWZ5IG9ic2VydmVycyBhYm91dCBlYWNoIG5ldyByb3cKLSAgICAgICAgaWYgKCFvYnNlcnZlcnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgb2JzZXJ2ZXJzLmZvckVhY2goKG8pIC0+IG8ubmV4dFVuZmlsdGVyZWRDbHVzdGVyKHVuZmlsdGVyZWQpKTsKLQotICAgICAgICBsYXN0Q2x1c3RlcmluZyA9IHVuZmlsdGVyZWQuY2x1c3RlcmluZygpOwotICAgICAgICBwcmV2aW91c1Jvd1N0YXJ0ID0gcG9zOwotICAgICAgICArK3dyaXR0ZW47Ci0KLSAgICAgICAgaWYgKHVuZmlsdGVyZWQua2luZCgpID09IFVuZmlsdGVyZWQuS2luZC5SQU5HRV9UT01CU1RPTkVfTUFSS0VSKQotICAgICAgICB7Ci0gICAgICAgICAgICBSYW5nZVRvbWJzdG9uZU1hcmtlciBtYXJrZXIgPSAoUmFuZ2VUb21ic3RvbmVNYXJrZXIpIHVuZmlsdGVyZWQ7Ci0gICAgICAgICAgICBvcGVuTWFya2VyID0gbWFya2VyLmlzT3BlbihmYWxzZSkgPyBtYXJrZXIub3BlbkRlbGV0aW9uVGltZShmYWxzZSkgOiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gaWYgd2UgaGl0IHRoZSBjb2x1bW4gaW5kZXggc2l6ZSB0aGF0IHdlIGhhdmUgdG8gaW5kZXggYWZ0ZXIsIGdvIGFoZWFkIGFuZCBpbmRleCBpdC4KLSAgICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbigpIC0gc3RhcnRQb3NpdGlvbiA+PSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplKCkpCi0gICAgICAgICAgICBhZGRJbmRleEJsb2NrKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgVW5maWx0ZXJlZFNlcmlhbGl6ZXIuc2VyaWFsaXplci53cml0ZUVuZE9mUGFydGl0aW9uKHdyaXRlcik7Ci0KLSAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB3ZSBhZGQgbm8gcm93cywganVzdCBhIHRvcCBsZXZlbCBkZWxldGlvbgotICAgICAgICBpZiAod3JpdHRlbiA9PSAwKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIC8vIHRoZSBsYXN0IGNvbHVtbiBtYXkgaGF2ZSBmYWxsZW4gb24gYW4gaW5kZXggYm91bmRhcnkgYWxyZWFkeS4gIGlmIG5vdCwgaW5kZXggaXQgZXhwbGljaXRseS4KLSAgICAgICAgaWYgKGZpcnN0Q2x1c3RlcmluZyAhPSBudWxsKQotICAgICAgICAgICAgYWRkSW5kZXhCbG9jaygpOwotCi0gICAgICAgIC8vIElmIHdlIHNlcmlhbGl6ZSB0aGUgSW5kZXhJbmZvIG9iamVjdHMgZGlyZWN0bHkgaW4gdGhlIGNvZGUgYWJvdmUgaW50byAnYnVmZmVyJywKLSAgICAgICAgLy8gd2UgaGF2ZSB0byB3cml0ZSB0aGUgb2Zmc3RzIHRvIHRoZXNlIGhlcmUuIFRoZSBvZmZzZXRzIGhhdmUgYWxyZWFkeSBiZWVuIGFyZSBjb2xsZWN0ZWQKLSAgICAgICAgLy8gaW4gaW5kZXhPZmZzZXRzW10uIGJ1ZmZlciBpcyAhPSBudWxsLCBpZiBpdCBleGNlZWRzIENvbmZpZy5jb2x1bW5faW5kZXhfY2FjaGVfc2l6ZS4KLSAgICAgICAgLy8gSW4gdGhlIG90aGVyIGNhc2UsIHdoZW4gYnVmZmVyPT1udWxsLCB0aGUgb2Zmc2V0cyBhcmUgc2VyaWFsaXplZCBpbiBSb3dJbmRleEVudHJ5LkluZGV4ZWRFbnRyeS5zZXJpYWxpemUoKS4KLSAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKQotICAgICAgICAgICAgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyLnNlcmlhbGl6ZU9mZnNldHMoYnVmZmVyLCBpbmRleE9mZnNldHMsIGNvbHVtbkluZGV4Q291bnQpOwotCi0gICAgICAgIC8vIHdlIHNob3VsZCBhbHdheXMgaGF2ZSBhdCBsZWFzdCBvbmUgY29tcHV0ZWQgaW5kZXggYmxvY2ssIGJ1dCB3ZSBvbmx5IHdyaXRlIGl0IG91dCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gdGhhdC4KLSAgICAgICAgYXNzZXJ0IGNvbHVtbkluZGV4Q291bnQgPiAwICYmIGhlYWRlckxlbmd0aCA+PSAwOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgaW5kZXhJbmZvU2VyaWFsaXplZFNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJ1ZmZlciAhPSBudWxsCi0gICAgICAgICAgICAgICA/IGJ1ZmZlci5idWZmZXIoKS5saW1pdCgpCi0gICAgICAgICAgICAgICA6IGluZGV4U2FtcGxlc1NlcmlhbGl6ZWRTaXplICsgY29sdW1uSW5kZXhDb3VudCAqIFR5cGVTaXplcy5zaXplb2YoMCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ29sdW1ucy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ29sdW1ucy5qYXZhCmluZGV4IDg4MTg1YWIuLjI3NWQwMDAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvbHVtbnMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5zLmphdmEKQEAgLTE4LDE3ICsxOCwxNSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmF0b3JzOwogCiBpbXBvcnQgbmV0Lm5pY291bGFqLmNvbXBpbGVjb21tYW5kLmFubm90YXRpb25zLkRvbnRJbmxpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29sdW1uSWRlbnRpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlNldFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKQEAgLTM2LDEyICszNCwxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PYmplY3RTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TZWFyY2hJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5idHJlZS5CVHJlZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5idHJlZS5CVHJlZVNlYXJjaEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ0cmVlLkJUcmVlUmVtb3ZhbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5idHJlZS5CVHJlZVNlYXJjaEl0ZXJhdG9yOwogCiAvKioKICAqIEFuIGltbXV0YWJsZSBhbmQgc29ydGVkIGxpc3Qgb2YgKG5vbi1QSykgY29sdW1ucyBmb3IgYSBnaXZlbiB0YWJsZS4KQEAgLTYxLDcgKzYxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQoQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIsIFVURjhUeXBlLmluc3RhbmNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIHRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEuTk9fUE9TSVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YS5LaW5kLlNUQVRJQyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YS5LaW5kLlNUQVRJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb2x1bW5NZXRhZGF0YSBGSVJTVF9DT01QTEVYX1JFR1VMQVIgPQogICAgICAgICBuZXcgQ29sdW1uTWV0YWRhdGEoIiIsCkBAIC02OSw3ICs3MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKEJ5dGVCdWZmZXJVdGlsLkVNUFRZX0JZVEVfQlVGRkVSLCBVVEY4VHlwZS5pbnN0YW5jZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRUeXBlLmdldEluc3RhbmNlKFVURjhUeXBlLmluc3RhbmNlLCB0cnVlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEuS2luZC5SRUdVTEFSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhLktpbmQuUkVHVUxBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBjb2x1bW5zOwogICAgIHByaXZhdGUgZmluYWwgaW50IGNvbXBsZXhJZHg7IC8vIEluZGV4IG9mIHRoZSBmaXJzdCBjb21wbGV4IGNvbHVtbgpAQCAtNDM2LDcgKzQzOCw3IEBACiAgICAgICAgIGlmKHRoaXMgPT0gTk9ORSkKICAgICAgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgIHJldHVybiBFTVBUWV9TSVpFOworICAgICAgICByZXR1cm4gRU1QVFlfU0laRSArIEJUcmVlLnNpemVPZlN0cnVjdHVyZU9uSGVhcChjb2x1bW5zKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTQ1Niw3ICs0NTgsNyBAQAogICAgIHsKICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKENvbHVtbnMgY29sdW1ucywgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGNvbHVtbnMuc2l6ZSgpKTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGNvbHVtbnMuc2l6ZSgpKTsKICAgICAgICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgY29sdW1uIDogY29sdW1ucykKICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhWSW50TGVuZ3RoKGNvbHVtbi5uYW1lLmJ5dGVzLCBvdXQpOwogICAgICAgICB9CkBAIC00NzEsNyArNDczLDcgQEAKIAogICAgICAgICBwdWJsaWMgQ29sdW1ucyBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgdHJ5IChCVHJlZS5GYXN0QnVpbGRlcjxDb2x1bW5NZXRhZGF0YT4gYnVpbGRlciA9IEJUcmVlLmZhc3RCdWlsZGVyKCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKQEAgLTUxNiw3ICs1MTgsNyBAQAogICAgICAgICAgICAgaW50IHN1cGVyc2V0Q291bnQgPSBzdXBlcnNldC5zaXplKCk7CiAgICAgICAgICAgICBpZiAoY29sdW1uQ291bnQgPT0gc3VwZXJzZXRDb3VudCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoMCk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIGlmIChzdXBlcnNldENvdW50IDwgNjQpCiAgICAgICAgICAgICB7CkBAIC02MDksNyArNjExLDcgQEAKICAgICAgICAgcHJpdmF0ZSB2b2lkIHNlcmlhbGl6ZUxhcmdlU3Vic2V0KENvbGxlY3Rpb248Q29sdW1uTWV0YWRhdGE+IGNvbHVtbnMsIGludCBjb2x1bW5Db3VudCwgQ29sdW1ucyBzdXBlcnNldCwgaW50IHN1cGVyc2V0Q291bnQsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIHdyaXRlIGZsYWcgaW5kaWNhdGluZyB3ZSdyZSBpbiBsZW5ndGh5IG1vZGUKLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChzdXBlcnNldENvdW50IC0gY29sdW1uQ291bnQpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoc3VwZXJzZXRDb3VudCAtIGNvbHVtbkNvdW50KTsKICAgICAgICAgICAgIEJUcmVlU2VhcmNoSXRlcmF0b3I8Q29sdW1uTWV0YWRhdGEsIENvbHVtbk1ldGFkYXRhPiBpdGVyID0gc3VwZXJzZXQuaXRlcmF0b3IoKTsKICAgICAgICAgICAgIGlmIChjb2x1bW5Db3VudCA8IHN1cGVyc2V0Q291bnQgLyAyKQogICAgICAgICAgICAgewpAQCAtNjE4LDcgKzYyMCw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoaXRlci5uZXh0KGNvbHVtbikgPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGl0ZXIuaW5kZXhPZkN1cnJlbnQoKSk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGl0ZXIuaW5kZXhPZkN1cnJlbnQoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQpAQCAtNjMxLDEwICs2MzMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgaW50IGN1ciA9IGl0ZXIuaW5kZXhPZkN1cnJlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCsrcHJldiAhPSBjdXIpCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocHJldik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihwcmV2KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgd2hpbGUgKCsrcHJldiAhPSBzdXBlcnNldENvdW50KQotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocHJldik7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHByZXYpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTY1MCw3ICs2NTIsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgY29sdW1uQ291bnQgOyBpKyspCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChCVHJlZS5maW5kQnlJbmRleChzdXBlcnNldC5jb2x1bW5zLCBpZHgpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTY2MSw3ICs2NjMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpbnQgc2tpcHBlZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dE1pc3NpbmdJbmRleCA9IHNraXBwZWQgPCBkZWx0YSA/IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpIDogc3VwZXJzZXRDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXh0TWlzc2luZ0luZGV4ID0gc2tpcHBlZCA8IGRlbHRhID8gaW4ucmVhZFVuc2lnbmVkVkludDMyKCkgOiBzdXBlcnNldENvdW50OwogICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlkeCA8IG5leHRNaXNzaW5nSW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEgZGVmID0gaXRlci5uZXh0KCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9EYXRhUmFuZ2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RhdGFSYW5nZS5qYXZhCmluZGV4IDUyMTYyYmUuLjk5MTJhYzUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RhdGFSYW5nZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RhdGFSYW5nZS5qYXZhCkBAIC0yNyw2ICsyNyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CiAKIC8qKgogICogR3JvdXBzIGJvdGggdGhlIHJhbmdlIG9mIHBhcnRpdGlvbnMgdG8gcXVlcnksIGFuZCB0aGUgY2x1c3RlcmluZyBpbmRleCBmaWx0ZXIgdG8KQEAgLTEzOSw2ICsxNDAsMzQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGUgc3RhcnQgb2YgdGhlIHBhcnRpdGlvbiBrZXkgcmFuZ2UgcXVlcmllZCBieSB0aGlzIHtAY29kZSBEYXRhUmFuZ2V9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc3RhcnQgb2YgdGhlIHBhcnRpdGlvbiBrZXkgcmFuZ2UgZXhwcmVzc2VkIGFzIGEgQnl0ZUNvbXBhcmFibGUuCisgICAgICovCisgICAgcHVibGljIEJ5dGVDb21wYXJhYmxlIHN0YXJ0QXNCeXRlQ29tcGFyYWJsZSgpCisgICAgeworICAgICAgICBQYXJ0aXRpb25Qb3NpdGlvbiBib3VuZCA9IGtleVJhbmdlLmxlZnQ7CisgICAgICAgIGlmIChib3VuZC5pc01pbmltdW0oKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHJldHVybiBib3VuZC5hc0NvbXBhcmFibGVCb3VuZChrZXlSYW5nZS5pbmNsdXNpdmVMZWZ0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBlbmQgb2YgdGhlIHBhcnRpdGlvbiBrZXkgcmFuZ2UgcXVlcmllZCBieSB0aGlzIHtAY29kZSBEYXRhUmFuZ2V9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZW5kIG9mIHRoZSBwYXJ0aXRpb24ga2V5IHJhbmdlIGV4cHJlc3NlZCBhcyBhIEJ5dGVDb21wYXJhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBCeXRlQ29tcGFyYWJsZSBzdG9wQXNCeXRlQ29tcGFyYWJsZSgpCisgICAgeworICAgICAgICBQYXJ0aXRpb25Qb3NpdGlvbiBib3VuZCA9IGtleVJhbmdlLnJpZ2h0OworICAgICAgICBpZiAoYm91bmQuaXNNaW5pbXVtKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gYm91bmQuYXNDb21wYXJhYmxlQm91bmQoIWtleVJhbmdlLmluY2x1c2l2ZVJpZ2h0KCkpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFdoZXRoZXIgdGhlIHVuZGVybHlpbmcgY2x1c3RlcmluZyBpbmRleCBmaWx0ZXIgaXMgYSBuYW1lcyBmaWx0ZXIgb3Igbm90LgogICAgICAqCiAgICAgICogQHJldHVybiBXaGV0aGVyIHRoZSB1bmRlcmx5aW5nIGNsdXN0ZXJpbmcgaW5kZXggZmlsdGVyIGlzIGEgbmFtZXMgZmlsdGVyIG9yIG5vdC4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RlY29yYXRlZEtleS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGVjb3JhdGVkS2V5LmphdmEKaW5kZXggNGRkODdkMC4uMDNkNjM3NCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGVjb3JhdGVkS2V5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGVjb3JhdGVkS2V5LmphdmEKQEAgLTIxLDYgKzIxLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU3RyaW5nSm9pbmVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUZ1bmN0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Db21wb3NpdGVUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CkBAIC0yOSw4ICszMCwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NdXJtdXJIYXNoOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLklGaWx0ZXIuRmlsdGVyS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk11cm11ckhhc2g7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuSGVhcENsb25lcjsKIAogLyoqCiAgKiBSZXByZXNlbnRzIGEgZGVjb3JhdGVkIGtleSwgaGFuZHkgZm9yIGNlcnRhaW4gb3BlcmF0aW9ucwpAQCAtNDMsMTMgKzQ4LDcgQEAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIERlY29yYXRlZEtleSBpbXBsZW1lbnRzIFBhcnRpdGlvblBvc2l0aW9uLCBGaWx0ZXJLZXkKIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8RGVjb3JhdGVkS2V5PiBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3I8RGVjb3JhdGVkS2V5PigpCi0gICAgewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoRGVjb3JhdGVkS2V5IG8xLCBEZWNvcmF0ZWRLZXkgbzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBvMS5jb21wYXJlVG8obzIpOwotICAgICAgICB9Ci0gICAgfTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8RGVjb3JhdGVkS2V5PiBjb21wYXJhdG9yID0gRGVjb3JhdGVkS2V5Ojpjb21wYXJlVG87CiAKICAgICBwcml2YXRlIGZpbmFsIFRva2VuIHRva2VuOwogCkBAIC0xMDIsNiArMTAxLDM3IEBACiAgICAgICAgIHJldHVybiBjbXAgPT0gMCA/IEJ5dGVCdWZmZXJVdGlsLmNvbXBhcmVVbnNpZ25lZChrZXksIG90aGVyS2V5LmdldEtleSgpKSA6IGNtcDsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICAvLyBOb3RlOiBJbiB0aGUgbGVnYWN5IHZlcnNpb24gb25lIGVuY29kaW5nIGNvdWxkIGJlIGEgcHJlZml4IG9mIGFub3RoZXIgYXMgdGhlIGVzY2FwaW5nIGlzIG9ubHkgd2Vha2x5CisgICAgICAgIC8vIHByZWZpeC1mcmVlIChzZWUgQnl0ZVNvdXJjZVRlc3QudGVzdERlY29yYXRlZEtleVByZWZpeGVzKCkpLgorICAgICAgICAvLyBUaGUgT1NTNTAgdmVyc2lvbiBhdm9pZHMgdGhpcyBieSBhZGRpbmcgYSB0ZXJtaW5hdG9yLgorICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvck1heWJlTGVnYWN5KHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleUNvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVDb21wYXJhYmxlIGFzQ29tcGFyYWJsZUJvdW5kKGJvb2xlYW4gYmVmb3JlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZlcnNpb24gLT4KKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0ICh2ZXJzaW9uICE9IFZlcnNpb24uTEVHQUNZKSA6ICJEZWNvcmF0ZWQga2V5IGJvdW5kcyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgbGVnYWN5IGVuY29kaW5nLiI7CisKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yKAorICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPyBCeXRlU291cmNlLkxUX05FWFRfQ09NUE9ORU5UIDogQnl0ZVNvdXJjZS5HVF9ORVhUX0NPTVBPTkVOVCwKKyAgICAgICAgICAgICAgICAgICAgdG9rZW4uYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgIGtleUNvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSk7CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJ5dGVTb3VyY2Uga2V5Q29tcGFyYWJsZUJ5dGVzKFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9mKGdldEtleSgpLCB2ZXJzaW9uKTsKKyAgICB9CisKICAgICBwdWJsaWMgSVBhcnRpdGlvbmVyIGdldFBhcnRpdGlvbmVyKCkKICAgICB7CiAgICAgICAgIHJldHVybiBnZXRUb2tlbigpLmdldFBhcnRpdGlvbmVyKCk7CkBAIC0xNjMsMTAgKzE5Myw1NyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIGdldEtleSgpOworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0S2V5TGVuZ3RoKCk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIGtleSBvY2N1cGllcyBvbmx5IHBhcnQgb2YgYSBsYXJnZXIgYnVmZmVyLCBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgdGhhdCBpcyBvbmx5IGFzIGxhcmdlIGFzIG5lY2Vzc2FyeS4KKyAgICAgKiBPdGhlcndpc2UsIGl0IHJldHVybnMgdGhpcyBrZXkuCisgICAgICovCisgICAgcHVibGljIERlY29yYXRlZEtleSByZXRhaW5hYmxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5jYW5NaW5pbWl6ZShnZXRLZXkoKSkKKyAgICAgICAgICAgICAgID8gbmV3IEJ1ZmZlckRlY29yYXRlZEtleShnZXRUb2tlbigpLCBIZWFwQ2xvbmVyLmluc3RhbmNlLmNsb25lKGdldEtleSgpKSkKKyAgICAgICAgICAgICAgIDogdGhpczsKKyAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBmaWx0ZXJIYXNoKGxvbmdbXSBkZXN0KQogICAgIHsKICAgICAgICAgQnl0ZUJ1ZmZlciBrZXkgPSBnZXRLZXkoKTsKICAgICAgICAgTXVybXVySGFzaC5oYXNoM194NjRfMTI4KGtleSwga2V5LnBvc2l0aW9uKCksIGtleS5yZW1haW5pbmcoKSwgMCwgZGVzdCk7CiAgICAgfQotfQorCisgICAgLyoqCisgICAgICogQSB0ZW1wbGF0ZSBmYWN0b3J5IG1ldGhvZCBmb3IgY3JlYXRpbmcgZGVjb3JhdGVkIGtleXMgZnJvbSB0aGVpciBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb24uCisgICAgICovCisgICAgc3RhdGljIDxUIGV4dGVuZHMgRGVjb3JhdGVkS2V5PiBUIGZyb21CeXRlQ29tcGFyYWJsZShCeXRlQ29tcGFyYWJsZSBieXRlQ29tcGFyYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpRnVuY3Rpb248VG9rZW4sIGJ5dGVbXSwgVD4gZGVjb3JhdGVkS2V5RmFjdG9yeSkKKyAgICB7CisgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgcGVla2FibGUgPSBCeXRlU291cmNlLnBlZWthYmxlKGJ5dGVDb21wYXJhYmxlLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgLy8gRGVjb2RlIHRoZSB0b2tlbiBmcm9tIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIG11bHRpLWNvbXBvbmVudCBzZXF1ZW5jZSByZXByZXNlbnRpbmcgdGhlIHdob2xlIGRlY29yYXRlZCBrZXkuCisgICAgICAgIFRva2VuIHRva2VuID0gcGFydGl0aW9uZXIuZ2V0VG9rZW5GYWN0b3J5KCkuZnJvbUNvbXBhcmFibGVCeXRlcyhCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50U291cmNlKHBlZWthYmxlKSwgdmVyc2lvbik7CisgICAgICAgIC8vIERlY29kZSB0aGUga2V5IGJ5dGVzIGZyb20gdGhlIHNlY29uZCBjb21wb25lbnQuCisgICAgICAgIGJ5dGVbXSBrZXlCeXRlcyA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFVuZXNjYXBlZEJ5dGVzKEJ5dGVTb3VyY2VJbnZlcnNlLm5leHRDb21wb25lbnRTb3VyY2UocGVla2FibGUpKTsKKyAgICAgICAgLy8gQ29uc3VtZSB0aGUgdGVybWluYXRvciBieXRlLgorICAgICAgICBpbnQgdGVybWluYXRvciA9IHBlZWthYmxlLm5leHQoKTsKKyAgICAgICAgYXNzZXJ0IHRlcm1pbmF0b3IgPT0gQnl0ZVNvdXJjZS5URVJNSU5BVE9SIDogIkRlY29yYXRlZCBrZXkgZW5jb2RpbmcgbXVzdCBlbmQgaW4gdGVybWluYXRvci4iOworICAgICAgICAvLyBJbnN0YW50aWF0ZSBhIGRlY29yYXRlZCBrZXkgZnJvbSB0aGUgZGVjb2RlZCB0b2tlbiBhbmQga2V5IGJ5dGVzLCB1c2luZyB0aGUgcHJvdmlkZWQgZmFjdG9yeSBtZXRob2QuCisgICAgICAgIHJldHVybiBkZWNvcmF0ZWRLZXlGYWN0b3J5LmFwcGx5KHRva2VuLCBrZXlCeXRlcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBieXRlW10ga2V5RnJvbUJ5dGVTb3VyY2UoQnl0ZVNvdXJjZS5QZWVrYWJsZSBwZWVrYWJsZUJ5dGVTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikKKyAgICB7CisgICAgICAgIGFzc2VydCB2ZXJzaW9uICE9IFZlcnNpb24uTEVHQUNZOyAgIC8vIHJldmVyc2UgdHJhbnNsYXRpb24gaXMgbm90IHN1cHBvcnRlZCBmb3IgTEVHQUNZIHZlcnNpb24uCisgICAgICAgIC8vIERlY29kZSB0aGUgdG9rZW4gZnJvbSB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSBtdWx0aS1jb21wb25lbnQgc2VxdWVuY2UgcmVwcmVzZW50aW5nIHRoZSB3aG9sZSBkZWNvcmF0ZWQga2V5LgorICAgICAgICAvLyBXZSB3b24ndCB1c2UgaXQsIGJ1dCB0aGUgZGVjb2RpbmcgYWxzbyBwb3NpdGlvbnMgdGhlIGJ5dGUgc291cmNlIGFmdGVyIGl0LgorICAgICAgICBwYXJ0aXRpb25lci5nZXRUb2tlbkZhY3RvcnkoKS5mcm9tQ29tcGFyYWJsZUJ5dGVzKEJ5dGVTb3VyY2VJbnZlcnNlLm5leHRDb21wb25lbnRTb3VyY2UocGVla2FibGVCeXRlU291cmNlKSwgdmVyc2lvbik7CisgICAgICAgIC8vIERlY29kZSB0aGUga2V5IGJ5dGVzIGZyb20gdGhlIHNlY29uZCBjb21wb25lbnQuCisgICAgICAgIGJ5dGVbXSBrZXlCeXRlcyA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFVuZXNjYXBlZEJ5dGVzKEJ5dGVTb3VyY2VJbnZlcnNlLm5leHRDb21wb25lbnRTb3VyY2UocGVla2FibGVCeXRlU291cmNlKSk7CisgICAgICAgIGludCB0ZXJtaW5hdG9yID0gcGVla2FibGVCeXRlU291cmNlLm5leHQoKTsKKyAgICAgICAgYXNzZXJ0IHRlcm1pbmF0b3IgPT0gQnl0ZVNvdXJjZS5URVJNSU5BVE9SIDogIkRlY29yYXRlZCBrZXkgZW5jb2RpbmcgbXVzdCBlbmQgaW4gdGVybWluYXRvci4iOworICAgICAgICByZXR1cm4ga2V5Qnl0ZXM7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RlbGV0aW9uVGltZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGVsZXRpb25UaW1lLmphdmEKaW5kZXggMTA1ZTEwZC4uZTYwODBmNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGVsZXRpb25UaW1lLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGVsZXRpb25UaW1lLmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CiAKQEAgLTE4MCw2ICsxODEsMTUgQEAKICAgICAgICAgICAgICAgICAgOiBuZXcgRGVsZXRpb25UaW1lKG1mZGEsIGxkdCk7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgRGVsZXRpb25UaW1lIGRlc2VyaWFsaXplKEJ5dGVCdWZmZXIgYnVmLCBpbnQgb2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGR0ID0gYnVmLmdldEludChvZmZzZXQpOworICAgICAgICAgICAgbG9uZyBtZmRhID0gYnVmLmdldExvbmcob2Zmc2V0ICsgNCk7CisgICAgICAgICAgICByZXR1cm4gbWZkYSA9PSBMb25nLk1JTl9WQUxVRSAmJiBsZHQgPT0gSW50ZWdlci5NQVhfVkFMVUUKKyAgICAgICAgICAgICAgICAgICA/IExJVkUKKyAgICAgICAgICAgICAgICAgICA6IG5ldyBEZWxldGlvblRpbWUobWZkYSwgbGR0KTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyB2b2lkIHNraXAoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIGluLnNraXBCeXRlc0Z1bGx5KDQgKyA4KTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RpcmVjdG9yaWVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9EaXJlY3Rvcmllcy5qYXZhCmluZGV4IGIxNmRkOTcuLjRlNzM0N2EgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RpcmVjdG9yaWVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGlyZWN0b3JpZXMuamF2YQpAQCAtMTcsNDMgKzE3LDYwIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI7CiAKLWltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlQcmVkaWNhdGU7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOwotaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotCiBpbXBvcnQgamF2YS5pby5JT0Vycm9yOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3RvcmU7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TcGxpdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlQcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5SYXRlTGltaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTRGlza0Z1bGxXcml0ZUVycm9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNOb0Rpc2tBdmFpbGFibGVGb3JXcml0ZUVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTUmVhZEVycm9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUlkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUlkRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlU3RvcmVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlBhdGhVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2Uuc25hcHNob3QuU25hcHNob3RNYW5pZmVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnNuYXBzaG90LlRhYmxlU25hcHNob3Q7CkBAIC0yNzIsNyArMjg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBTU1RhYmxlLnRyeURlc2NyaXB0b3JGcm9tRmlsZW5hbWUoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IFNTVGFibGUudHJ5RGVzY3JpcHRvckZyb21GaWxlKGZpbGUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYyAhPSBudWxsICYmIGRlc2Mua3NuYW1lLmVxdWFscyhtZXRhZGF0YS5rZXlzcGFjZSkgJiYgZGVzYy5jZm5hbWUuZXF1YWxzKG1ldGFkYXRhLm5hbWUpOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgIGZvciAoRmlsZSBpbmRleEZpbGUgOiBpbmRleEZpbGVzKQpAQCAtMzE5LDcgKzMzNiw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgZmlsZW5hbWUpOwogICAgICAgICAgICAgaWYgKGZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0b3IuZnJvbUZpbGVuYW1lKGZpbGUpOworICAgICAgICAgICAgICAgIHJldHVybiBEZXNjcmlwdG9yLmZyb21GaWxlV2l0aENvbXBvbmVudChmaWxlLCBmYWxzZSkubGVmdDsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CkBAIC00ODgsNDggKzUwNSwxMDYgQEAKICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChjYW5kaWRhdGVzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdmFpbGFibGVEaXNrU3BhY2UobG9uZyBlc3RpbWF0ZWRTU1RhYmxlcywgbG9uZyBleHBlY3RlZFRvdGFsV3JpdGVTaXplKQorICAgIC8qKgorICAgICAqIFN1bXMgdXAgdGhlIHNwYWNlIHJlcXVpcmVkIGZvciBvbmdvaW5nIHN0cmVhbXMgKyBjb21wYWN0aW9ucyArIGV4cGVjdGVkIG5ldyB3cml0ZSBzaXplIHBlciBGaWxlU3RvcmUgYW5kIGNoZWNrcworICAgICAqIGlmIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWROZXdXcml0ZVNpemVzIHdoZXJlIHdlIGV4cGVjdCB0byB3cml0ZSB0aGUgbmV3IGNvbXBhY3Rpb25zCisgICAgICogQHBhcmFtIHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nIGFwcHJveGltYXRlIGFtb3VudCBvZiBkYXRhIGN1cnJlbnQgY29tcGFjdGlvbnMgYXJlIHdyaXRpbmcgLSBrZXllZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSBzdG9yZSB0aGV5IGFyZSB3cml0aW5nIHRvIChvciwgcmVhZGluZyBmcm9tIGFjdHVhbGx5LCBidXQgc2luY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FTU0FORFJBLTY2OTYgd2UgZXhwZWN0IGNvbXBhY3Rpb25zIHRvIHJlYWQgYW5kIHdyaXR0ZW4gZnJvbSB0aGUgc2FtZSBkaXIpCisgICAgICogQHJldHVybiB0cnVlIGlmIHdlIGV4cGVjdCB0byBiZSBhYmxlIHRvIHdyaXRlIGV4cGVjdGVkTmV3V3JpdGVTaXplcyB0byB0aGUgYXZhaWxhYmxlIGZpbGUgc3RvcmVzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKE1hcDxGaWxlLCBMb25nPiBleHBlY3RlZE5ld1dyaXRlU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxGaWxlLCBMb25nPiB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZykKICAgICB7Ci0gICAgICAgIGxvbmcgd3JpdGVTaXplID0gZXhwZWN0ZWRUb3RhbFdyaXRlU2l6ZSAvIGVzdGltYXRlZFNTVGFibGVzOwotICAgICAgICBsb25nIHRvdGFsQXZhaWxhYmxlID0gMEw7CisgICAgICAgIHJldHVybiBoYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMoZXhwZWN0ZWROZXdXcml0ZVNpemVzLCB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZywgRGlyZWN0b3JpZXM6OmdldEZpbGVTdG9yZSk7CisgICAgfQogCi0gICAgICAgIGZvciAoRGF0YURpcmVjdG9yeSBkYXRhRGlyIDogcGF0aHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChEaXNhbGxvd2VkRGlyZWN0b3JpZXMuaXNVbndyaXRhYmxlKGdldExvY2F0aW9uRm9yRGlzayhkYXRhRGlyKSkpCi0gICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIERhdGFEaXJlY3RvcnlDYW5kaWRhdGUgY2FuZGlkYXRlID0gbmV3IERhdGFEaXJlY3RvcnlDYW5kaWRhdGUoZGF0YURpcik7Ci0gICAgICAgICAgICAvLyBleGNsdWRlIGRpcmVjdG9yeSBpZiBpdHMgdG90YWwgd3JpdGVTaXplIGRvZXMgbm90IGZpdCB0byBkYXRhIGRpcmVjdG9yeQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJEYXRhRGlyZWN0b3J5IHt9IGhhcyB7fSBieXRlcyBhdmFpbGFibGUsIGNoZWNraW5nIGlmIHdlIGNhbiB3cml0ZSB7fSBieXRlcyIsIGRhdGFEaXIubG9jYXRpb24sIGNhbmRpZGF0ZS5hdmFpbGFibGVTcGFjZSwgd3JpdGVTaXplKTsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuYXZhaWxhYmxlU3BhY2UgPCB3cml0ZVNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkRhdGFEaXJlY3Rvcnkge30gY2FuJ3QgYmUgdXNlZCBmb3IgY29tcGFjdGlvbi4gT25seSB7fSBpcyBhdmFpbGFibGUsIGJ1dCB7fSBpcyB0aGUgbWluaW11bSB3cml0ZSBzaXplLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlLmRhdGFEaXJlY3RvcnkubG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLnN0cmluZ2lmeUZpbGVTaXplKGNhbmRpZGF0ZS5hdmFpbGFibGVTcGFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLnN0cmluZ2lmeUZpbGVTaXplKHdyaXRlU2l6ZSkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG90YWxBdmFpbGFibGUgKz0gY2FuZGlkYXRlLmF2YWlsYWJsZVNwYWNlOwotICAgICAgICB9CisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0Rpc2tTcGFjZUZvckNvbXBhY3Rpb25zQW5kU3RyZWFtcyhNYXA8RmlsZSwgTG9uZz4gZXhwZWN0ZWROZXdXcml0ZVNpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPEZpbGUsIExvbmc+IHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248RmlsZSwgRmlsZVN0b3JlPiBmaWxlc3RvcmVNYXBwZXIpCisgICAgeworICAgICAgICBNYXA8RmlsZVN0b3JlLCBMb25nPiBuZXdXcml0ZVNpemVzUGVyRmlsZVN0b3JlID0gcGVyRmlsZVN0b3JlKGV4cGVjdGVkTmV3V3JpdGVTaXplcywgZmlsZXN0b3JlTWFwcGVyKTsKKyAgICAgICAgTWFwPEZpbGVTdG9yZSwgTG9uZz4gY29tcGFjdGlvbnNSZW1haW5pbmdQZXJGaWxlU3RvcmUgPSBwZXJGaWxlU3RvcmUodG90YWxDb21wYWN0aW9uV3JpdGVSZW1haW5pbmcsIGZpbGVzdG9yZU1hcHBlcik7CiAKLSAgICAgICAgaWYgKHRvdGFsQXZhaWxhYmxlIDw9IGV4cGVjdGVkVG90YWxXcml0ZVNpemUpCisgICAgICAgIE1hcDxGaWxlU3RvcmUsIExvbmc+IHRvdGFsUGVyRmlsZVN0b3JlID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxGaWxlU3RvcmUsIExvbmc+IGVudHJ5IDogbmV3V3JpdGVTaXplc1BlckZpbGVTdG9yZS5lbnRyeVNldCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmdKb2luZXIgcGF0aFN0cmluZyA9IG5ldyBTdHJpbmdKb2luZXIoIiwiLCAiWyIsICJdIik7Ci0gICAgICAgICAgICBmb3IgKERhdGFEaXJlY3RvcnkgcDogcGF0aHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGF0aFN0cmluZy5hZGQocC5sb2NhdGlvbi50b0phdmFJT0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2dnZXIud2FybigiSW5zdWZmaWNpZW50IGRpc2sgc3BhY2UgZm9yIGNvbXBhY3Rpb24uIEFjcm9zcyB7fSB0aGVyZSdzIG9ubHkge30gYXZhaWxhYmxlLCBidXQge30gaXMgbmVlZGVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXRoU3RyaW5nLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuc3RyaW5naWZ5RmlsZVNpemUodG90YWxBdmFpbGFibGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLnN0cmluZ2lmeUZpbGVTaXplKGV4cGVjdGVkVG90YWxXcml0ZVNpemUpKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGxvbmcgYWRkZWRGb3JGaWxlc3RvcmUgPSBlbnRyeS5nZXRWYWx1ZSgpICsgY29tcGFjdGlvbnNSZW1haW5pbmdQZXJGaWxlU3RvcmUuZ2V0T3JEZWZhdWx0KGVudHJ5LmdldEtleSgpLCAwTCk7CisgICAgICAgICAgICB0b3RhbFBlckZpbGVTdG9yZS5tZXJnZShlbnRyeS5nZXRLZXkoKSwgYWRkZWRGb3JGaWxlc3RvcmUsIExvbmc6OnN1bSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiBoYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXModG90YWxQZXJGaWxlU3RvcmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2Ugb24gYWxsIGZpbGUgc3RvcmVzIHRvIHdyaXRlIHRoZSBnaXZlbiBhbW91bnQgb2YgZGF0YS4KKyAgICAgKiBUaGUgZGF0YSB0byB3cml0ZSBzaG91bGQgYmUgdGhlIHRvdGFsIGFtb3VudCwgb25nb2luZyB3cml0ZXMgKyBuZXcgd3JpdGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMoTWFwPEZpbGVTdG9yZSwgTG9uZz4gdG90YWxUb1dyaXRlKQorICAgIHsKKyAgICAgICAgYm9vbGVhbiBoYXNTcGFjZSA9IHRydWU7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PEZpbGVTdG9yZSwgTG9uZz4gdG9Xcml0ZSA6IHRvdGFsVG9Xcml0ZS5lbnRyeVNldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGF2YWlsYWJsZUZvckNvbXBhY3Rpb24gPSBnZXRBdmFpbGFibGVTcGFjZUZvckNvbXBhY3Rpb25zKHRvV3JpdGUuZ2V0S2V5KCkpOworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJGaWxlU3RvcmUge30gaGFzIHt9IGJ5dGVzIGF2YWlsYWJsZSwgY2hlY2tpbmcgaWYgd2UgY2FuIHdyaXRlIHt9IGJ5dGVzIiwgdG9Xcml0ZS5nZXRLZXkoKSwgYXZhaWxhYmxlRm9yQ29tcGFjdGlvbiwgdG9Xcml0ZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGlmIChhdmFpbGFibGVGb3JDb21wYWN0aW9uIDwgdG9Xcml0ZS5nZXRWYWx1ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJGaWxlU3RvcmUge30gaGFzIG9ubHkge30gYXZhaWxhYmxlLCBidXQge30gaXMgbmVlZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1dyaXRlLmdldEtleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5zdHJpbmdpZnlGaWxlU2l6ZShhdmFpbGFibGVGb3JDb21wYWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuc3RyaW5naWZ5RmlsZVNpemUoKGxvbmcpIHRvV3JpdGUuZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgICAgIGhhc1NwYWNlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc1NwYWNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRBdmFpbGFibGVTcGFjZUZvckNvbXBhY3Rpb25zKEZpbGVTdG9yZSBmaWxlU3RvcmUpCisgICAgeworICAgICAgICBsb25nIGF2YWlsYWJsZVNwYWNlID0gMDsKKyAgICAgICAgYXZhaWxhYmxlU3BhY2UgPSBGaWxlU3RvcmVVdGlscy50cnlHZXRTcGFjZShmaWxlU3RvcmUsIEZpbGVTdG9yZTo6Z2V0VXNhYmxlU3BhY2UsIGUgLT4geyB0aHJvdyBuZXcgRlNSZWFkRXJyb3IoZSwgZmlsZVN0b3JlLm5hbWUoKSk7IH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgLSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TWluRnJlZVNwYWNlUGVyRHJpdmVJbkJ5dGVzKCk7CisgICAgICAgIHJldHVybiBNYXRoLm1heCgwTCwgTWF0aC5yb3VuZChhdmFpbGFibGVTcGFjZSAqIERhdGFiYXNlRGVzY3JpcHRvci5nZXRNYXhTcGFjZUZvckNvbXBhY3Rpb25zUGVyRHJpdmUoKSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTWFwPEZpbGVTdG9yZSwgTG9uZz4gcGVyRmlsZVN0b3JlKE1hcDxGaWxlLCBMb25nPiBwZXJEaXJlY3RvcnksIEZ1bmN0aW9uPEZpbGUsIEZpbGVTdG9yZT4gZmlsZXN0b3JlTWFwcGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBlckRpcmVjdG9yeS5lbnRyeVNldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoZW50cnkgLT4gZmlsZXN0b3JlTWFwcGVyLmFwcGx5KGVudHJ5LmdldEtleSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5OjpnZXRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZzo6c3VtKSk7CisgICAgfQorCisgICAgcHVibGljIFNldDxGaWxlU3RvcmU+IGFsbEZpbGVTdG9yZXMoRnVuY3Rpb248RmlsZSwgRmlsZVN0b3JlPiBmaWxlc3RvcmVNYXBwZXIpCisgICAgeworICAgICAgICByZXR1cm4gQXJyYXlzLnN0cmVhbShnZXRXcml0ZWFibGVMb2NhdGlvbnMoKSkKKyAgICAgICAgICAgICAgICAgICAgIC5tYXAodGhpczo6Z2V0TG9jYXRpb25Gb3JEaXNrKQorICAgICAgICAgICAgICAgICAgICAgLm1hcChmaWxlc3RvcmVNYXBwZXIpCisgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGZpbGVzdG9yZSBmb3IgdGhlIGFjdHVhbCBkaXJlY3Rvcnkgd2hlcmUgdGhlIHNzdGFibGVzIGFyZSBzdG9yZWQuCisgICAgICogSGFuZGxlcyB0aGUgZmFjdCB0aGF0IGFuIG9wZXJhdG9yIGNhbiBzeW1saW5rIGEgdGFibGUgZGlyZWN0b3J5IHRvIGEgZGlmZmVyZW50IGZpbGVzdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpbGVTdG9yZSBnZXRGaWxlU3RvcmUoRmlsZSBkaXJlY3RvcnkpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEZpbGVzLmdldEZpbGVTdG9yZShkaXJlY3RvcnkudG9QYXRoKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRlNSZWFkRXJyb3IoZSwgZGlyZWN0b3J5KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBEYXRhRGlyZWN0b3J5W10gZ2V0V3JpdGVhYmxlTG9jYXRpb25zKCkKICAgICB7Ci0gICAgICAgIExpc3Q8RGF0YURpcmVjdG9yeT4gYWxsb3dlZERpcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxEYXRhRGlyZWN0b3J5PiBhbGxvd2VkRGlycyA9IG5ldyBBcnJheUxpc3Q8PihwYXRocy5sZW5ndGgpOwogICAgICAgICBmb3IgKERhdGFEaXJlY3RvcnkgZGlyIDogcGF0aHMpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghRGlzYWxsb3dlZERpcmVjdG9yaWVzLmlzVW53cml0YWJsZShkaXIubG9jYXRpb24pKQpAQCAtNTkzLDE3ICs2NjgsNiBAQAogICAgICAgICByZXR1cm4gbmV3IEZpbGUoc25hcHNob3REaXIsICJzY2hlbWEuY3FsIik7CiAgICAgfQogCi0gICAgcHVibGljIEZpbGUgZ2V0TmV3RXBoZW1lcmFsU25hcHNob3RNYXJrZXJGaWxlKFN0cmluZyBzbmFwc2hvdE5hbWUpCi0gICAgewotICAgICAgICBGaWxlIHNuYXBzaG90RGlyID0gbmV3IEZpbGUoZ2V0V3JpdGVhYmxlTG9jYXRpb25Bc0ZpbGUoMUwpLCBqb2luKFNOQVBTSE9UX1NVQkRJUiwgc25hcHNob3ROYW1lKSk7Ci0gICAgICAgIHJldHVybiBnZXRFcGhlbWVyYWxTbmFwc2hvdE1hcmtlckZpbGUoc25hcHNob3REaXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEZpbGUgZ2V0RXBoZW1lcmFsU25hcHNob3RNYXJrZXJGaWxlKEZpbGUgc25hcHNob3REaXJlY3RvcnkpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEZpbGUoc25hcHNob3REaXJlY3RvcnksICJlcGhlbWVyYWwuc25hcHNob3QiKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgc3RhdGljIEZpbGUgZ2V0QmFja3Vwc0RpcmVjdG9yeShEZXNjcmlwdG9yIGRlc2MpCiAgICAgewogICAgICAgICByZXR1cm4gZ2V0QmFja3Vwc0RpcmVjdG9yeShkZXNjLmRpcmVjdG9yeSk7CkBAIC04MTAsNiArODc0LDE2IEBACiAgICAgICAgICAgICAvLyBsYXN0IHJlc29ydAogICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpIC0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobyk7CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiRGF0YURpcmVjdG9yeUNhbmRpZGF0ZXsiICsKKyAgICAgICAgICAgICAgICAgICAiZGF0YURpcmVjdG9yeT0iICsgZGF0YURpcmVjdG9yeSArCisgICAgICAgICAgICAgICAgICAgIiwgYXZhaWxhYmxlU3BhY2U9IiArIGF2YWlsYWJsZVNwYWNlICsKKyAgICAgICAgICAgICAgICAgICAiLCBwZXJjPSIgKyBwZXJjICsKKyAgICAgICAgICAgICAgICAgICAnfSc7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiogVGhlIHR5cGUgb2YgZmlsZXMgdGhhdCBjYW4gYmUgbGlzdGVkIGJ5IFNTVGFibGVMaXN0ZXIsIHdlIG5ldmVyIHJldHVybiB0eG4gbG9ncywKQEAgLTkyOCw3ICsxMDAyLDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjIDogZW50cnkuZ2V0VmFsdWUoKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGwuYWRkKG5ldyBGaWxlKGVudHJ5LmdldEtleSgpLmZpbGVuYW1lRm9yKGMpKSk7CisgICAgICAgICAgICAgICAgICAgIGwuYWRkKGVudHJ5LmdldEtleSgpLmZpbGVGb3IoYykpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBsOwpAQCAtMTAxNiwxOCArMTA5MCwyNSBAQAogICAgICAgICByZXR1cm4gc25hcHNob3RzOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBUYWJsZVNuYXBzaG90IGJ1aWxkU25hcHNob3QoU3RyaW5nIHRhZywgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCwgU2V0PEZpbGU+IHNuYXBzaG90RGlycykgeworICAgIHByaXZhdGUgVGFibGVTbmFwc2hvdCBidWlsZFNuYXBzaG90KFN0cmluZyB0YWcsIFNuYXBzaG90TWFuaWZlc3QgbWFuaWZlc3QsIFNldDxGaWxlPiBzbmFwc2hvdERpcnMpCisgICAgeworICAgICAgICBib29sZWFuIGVwaGVtZXJhbCA9IG1hbmlmZXN0ICE9IG51bGwgPyBtYW5pZmVzdC5pc0VwaGVtZXJhbCgpIDogaXNMZWdhY3lFcGhlbWVyYWxTbmFwc2hvdChzbmFwc2hvdERpcnMpOwogICAgICAgICBJbnN0YW50IGNyZWF0ZWRBdCA9IG1hbmlmZXN0ID09IG51bGwgPyBudWxsIDogbWFuaWZlc3QuY3JlYXRlZEF0OwogICAgICAgICBJbnN0YW50IGV4cGlyZXNBdCA9IG1hbmlmZXN0ID09IG51bGwgPyBudWxsIDogbWFuaWZlc3QuZXhwaXJlc0F0OwogICAgICAgICByZXR1cm4gbmV3IFRhYmxlU25hcHNob3QobWV0YWRhdGEua2V5c3BhY2UsIG1ldGFkYXRhLm5hbWUsIG1ldGFkYXRhLmlkLmFzVVVJRCgpLCB0YWcsIGNyZWF0ZWRBdCwgZXhwaXJlc0F0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHNob3REaXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90RGlycywgZXBoZW1lcmFsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTGVnYWN5RXBoZW1lcmFsU25hcHNob3QoU2V0PEZpbGU+IHNuYXBzaG90RGlycykKKyAgICB7CisgICAgICAgIHJldHVybiBzbmFwc2hvdERpcnMuc3RyZWFtKCkubWFwKGQgLT4gbmV3IEZpbGUoZCwgImVwaGVtZXJhbC5zbmFwc2hvdCIpKS5hbnlNYXRjaChGaWxlOjpleGlzdHMpOwogICAgIH0KIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIHByb3RlY3RlZCBzdGF0aWMgU25hcHNob3RNYW5pZmVzdCBtYXliZUxvYWRNYW5pZmVzdChTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSwgU3RyaW5nIHRhZywgU2V0PEZpbGU+IHNuYXBzaG90RGlycykKICAgICB7CiAgICAgICAgIExpc3Q8RmlsZT4gbWFuaWZlc3RzID0gc25hcHNob3REaXJzLnN0cmVhbSgpLm1hcChkIC0+IG5ldyBGaWxlKGQsICJtYW5pZmVzdC5qc29uIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihkIC0+IGQuZXhpc3RzKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihGaWxlOjpleGlzdHMpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CiAKICAgICAgICAgaWYgKG1hbmlmZXN0cy5pc0VtcHR5KCkpCiAgICAgICAgIHsKQEAgLTEwNTEsNDIgKzExMzIsNiBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGxpc3RFcGhlbWVyYWxTbmFwc2hvdHMoKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGVwaGVtZXJhbFNuYXBzaG90cyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKLSAgICAgICAgZm9yIChGaWxlIHNuYXBzaG90IDogbGlzdEFsbFNuYXBzaG90cygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZ2V0RXBoZW1lcmFsU25hcHNob3RNYXJrZXJGaWxlKHNuYXBzaG90KS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICBlcGhlbWVyYWxTbmFwc2hvdHMuYWRkKHNuYXBzaG90Lm5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVwaGVtZXJhbFNuYXBzaG90czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8RmlsZT4gbGlzdEFsbFNuYXBzaG90cygpCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PEZpbGU+IHNuYXBzaG90cyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKLSAgICAgICAgZm9yIChmaW5hbCBGaWxlIGRpciA6IGRhdGFQYXRocykKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZSBzbmFwc2hvdERpciA9IGlzU2Vjb25kYXJ5SW5kZXhGb2xkZXIoZGlyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IEZpbGUoZGlyLnBhcmVudFBhdGgoKSwgU05BUFNIT1RfU1VCRElSKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IEZpbGUoZGlyLCBTTkFQU0hPVF9TVUJESVIpOwotICAgICAgICAgICAgaWYgKHNuYXBzaG90RGlyLmV4aXN0cygpICYmIHNuYXBzaG90RGlyLmlzRGlyZWN0b3J5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgRmlsZVtdIHNuYXBzaG90RGlycyAgPSBzbmFwc2hvdERpci50cnlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNuYXBzaG90RGlycyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBGaWxlIHNuYXBzaG90IDogc25hcHNob3REaXJzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc25hcHNob3QuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFwc2hvdHMuYWRkKHNuYXBzaG90KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzbmFwc2hvdHM7Ci0gICAgfQotCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFNldDxGaWxlPj4gbGlzdFNuYXBzaG90RGlyc0J5VGFnKCkKICAgICB7CkBAIC0xMjk4LDcgKzEzNDMsNyBAQAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FjY2VwdGFibGUoUGF0aCBwYXRoKQogICAgICAgICB7CiAgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLSAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IFNTVGFibGUudHJ5RGVzY3JpcHRvckZyb21GaWxlbmFtZShmaWxlKTsKKyAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IFNTVGFibGUudHJ5RGVzY3JpcHRvckZyb21GaWxlKGZpbGUpOwogICAgICAgICAgICAgcmV0dXJuIGRlc2MgIT0gbnVsbAogICAgICAgICAgICAgICAgICYmIGRlc2Mua3NuYW1lLmVxdWFscyhtZXRhZGF0YS5rZXlzcGFjZSkKICAgICAgICAgICAgICAgICAmJiBkZXNjLmNmbmFtZS5lcXVhbHMobWV0YWRhdGEubmFtZSkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0Rpc2tCb3VuZGFyaWVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9EaXNrQm91bmRhcmllcy5qYXZhCmluZGV4IGYzM2I0M2UuLjMyZWRjYWMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0Rpc2tCb3VuZGFyaWVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGlza0JvdW5kYXJpZXMuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OwpAQCAtMTU0LDQgKzE1NSwyMCBAQAogICAgICAgICBhc3NlcnQgcG9zIDwgMDsKICAgICAgICAgcmV0dXJuIC1wb3MgLSAxOwogICAgIH0KKworICAgIHB1YmxpYyBMaXN0PERpcmVjdG9yaWVzLkRhdGFEaXJlY3Rvcnk+IGdldERpc2tzSW5Cb3VuZHMoRGVjb3JhdGVkS2V5IGZpcnN0LCBEZWNvcmF0ZWRLZXkgbGFzdCkKKyAgICB7CisgICAgICAgIGlmIChwb3NpdGlvbnMgPT0gbnVsbCB8fCBmaXJzdCA9PSBudWxsIHx8IGxhc3QgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBkaXJlY3RvcmllczsKKyAgICAgICAgaW50IGZpcnN0SW5kZXggPSBnZXREaXNrSW5kZXgoZmlyc3QpOworICAgICAgICBpbnQgbGFzdEluZGV4ID0gZ2V0RGlza0luZGV4KGxhc3QpOworICAgICAgICByZXR1cm4gZGlyZWN0b3JpZXMuc3ViTGlzdChmaXJzdEluZGV4LCBsYXN0SW5kZXggKyAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnRUbyhEaXNrQm91bmRhcmllcyBvbGRCb3VuZGFyaWVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9sZEJvdW5kYXJpZXMgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgT2JqZWN0cy5lcXVhbHMocG9zaXRpb25zLCBvbGRCb3VuZGFyaWVzLnBvc2l0aW9ucykgJiYKKyAgICAgICAgICAgICAgIE9iamVjdHMuZXF1YWxzKGRpcmVjdG9yaWVzLCBvbGRCb3VuZGFyaWVzLmRpcmVjdG9yaWVzKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9FeHBpcmF0aW9uRGF0ZU92ZXJmbG93SGFuZGxpbmcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0V4cGlyYXRpb25EYXRlT3ZlcmZsb3dIYW5kbGluZy5qYXZhCmluZGV4IDdmODFiNWMuLmY5MjA3Y2UgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0V4cGlyYXRpb25EYXRlT3ZlcmZsb3dIYW5kbGluZy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0V4cGlyYXRpb25EYXRlT3ZlcmZsb3dIYW5kbGluZy5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiBpbXBvcnQgb3JnLnNsZjRqLmhlbHBlcnMuTWVzc2FnZUZvcm1hdHRlcjsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5CdWZmZXJDZWxsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwpAQCAtMzIsMTMgKzMzLDE0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRXYXJuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk5vU3BhbUxvZ2dlcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkVYUElSQVRJT05fREFURV9PVkVSRkxPV19QT0xJQ1k7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKIAogcHVibGljIGNsYXNzIEV4cGlyYXRpb25EYXRlT3ZlcmZsb3dIYW5kbGluZwogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihFeHBpcmF0aW9uRGF0ZU92ZXJmbG93SGFuZGxpbmcuY2xhc3MpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVYUElSQVRJT05fT1ZFUkZMT1dfV0FSTklOR19JTlRFUlZBTF9NSU5VVEVTID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEuZXhwaXJhdGlvbl9vdmVyZmxvd193YXJuaW5nX2ludGVydmFsX21pbnV0ZXMiLCA1KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVhQSVJBVElPTl9PVkVSRkxPV19XQVJOSU5HX0lOVEVSVkFMX01JTlVURVMgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRVhQSVJBVElPTl9PVkVSRkxPV19XQVJOSU5HX0lOVEVSVkFMX01JTlVURVMuZ2V0SW50KCk7CiAKICAgICBwdWJsaWMgZW51bSBFeHBpcmF0aW9uRGF0ZU92ZXJmbG93UG9saWN5CiAgICAgewpAQCAtNDksMTQgKzUxLDEzIEBACiAgICAgcHVibGljIHN0YXRpYyBFeHBpcmF0aW9uRGF0ZU92ZXJmbG93UG9saWN5IHBvbGljeTsKIAogICAgIHN0YXRpYyB7Ci0gICAgICAgIFN0cmluZyBwb2xpY3lBc1N0cmluZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmV4cGlyYXRpb25fZGF0ZV9vdmVyZmxvd19wb2xpY3kiLCBFeHBpcmF0aW9uRGF0ZU92ZXJmbG93UG9saWN5LlJFSkVDVC5uYW1lKCkpOwogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgcG9saWN5ID0gRXhwaXJhdGlvbkRhdGVPdmVyZmxvd1BvbGljeS52YWx1ZU9mKHBvbGljeUFzU3RyaW5nLnRvVXBwZXJDYXNlKCkpOworICAgICAgICAgICAgcG9saWN5ID0gRVhQSVJBVElPTl9EQVRFX09WRVJGTE9XX1BPTElDWS5nZXRFbnVtKEV4cGlyYXRpb25EYXRlT3ZlcmZsb3dQb2xpY3kuUkVKRUNUKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIud2FybigiSW52YWxpZCBleHBpcmF0aW9uIGRhdGUgb3ZlcmZsb3cgcG9saWN5OiB7fS4gVXNpbmcgZGVmYXVsdDoge30iLCBwb2xpY3lBc1N0cmluZywgRXhwaXJhdGlvbkRhdGVPdmVyZmxvd1BvbGljeS5SRUpFQ1QubmFtZSgpKTsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJJbnZhbGlkIGV4cGlyYXRpb24gZGF0ZSBvdmVyZmxvdyBwb2xpY3kuIFVzaW5nIGRlZmF1bHQ6IHt9IiwgRXhwaXJhdGlvbkRhdGVPdmVyZmxvd1BvbGljeS5SRUpFQ1QubmFtZSgpKTsKICAgICAgICAgICAgIHBvbGljeSA9IEV4cGlyYXRpb25EYXRlT3ZlcmZsb3dQb2xpY3kuUkVKRUNUOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvS2V5c3BhY2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0tleXNwYWNlLmphdmEKaW5kZXggZDZkYjcwMC4uMjI3MjFiZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvS2V5c3BhY2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9LZXlzcGFjZS5qYXZhCkBAIC00MCw2ICs0MCw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlN0YWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRHVyYXRpb25TcGVjOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5TU1RhYmxlU2V0OwpAQCAtODcsOSArODgsOSBAQAogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihLZXlzcGFjZS5jbGFzcyk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GQUlMX1dSSVRFU19LUyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRlc3QuZmFpbF93cml0ZXNfa3MiLCAiIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRkFJTF9XUklURVNfS1MgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9GQUlMX1dSSVRFU19LUy5nZXRTdHJpbmcoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFRFU1RfRkFJTF9XUklURVMgPSAhVEVTVF9GQUlMX1dSSVRFU19LUy5pc0VtcHR5KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IFRFU1RfRkFJTF9NVl9MT0NLU19DT1VOVCA9IEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLnRlc3QuZmFpbF9tdl9sb2Nrc19jb3VudCIsIDApOworICAgIHByaXZhdGUgc3RhdGljIGludCBURVNUX0ZBSUxfTVZfTE9DS1NfQ09VTlQgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9GQUlMX01WX0xPQ0tTX0NPVU5ULmdldEludCgpOwogCiAgICAgcHVibGljIGZpbmFsIEtleXNwYWNlTWV0cmljcyBtZXRyaWM7CiAKQEAgLTMwMywyMCArMzA0LDYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDbGVhciBhbGwgdGhlIHNuYXBzaG90cyBmb3IgYSBnaXZlbiBrZXlzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzbmFwc2hvdE5hbWUgdGhlIHVzZXIgc3VwcGxpZWQgc25hcHNob3QgbmFtZS4gSXQgZW1wdHkgb3IgbnVsbCwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFsbCB0aGUgc25hcHNob3RzIHdpbGwgYmUgY2xlYW5lZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhclNuYXBzaG90KFN0cmluZyBzbmFwc2hvdE5hbWUsIFN0cmluZyBrZXlzcGFjZSkKLSAgICB7Ci0gICAgICAgIFJhdGVMaW1pdGVyIGNsZWFyU25hcHNob3RSYXRlTGltaXRlciA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTbmFwc2hvdFJhdGVMaW1pdGVyKCk7Ci0KLSAgICAgICAgTGlzdDxGaWxlPiB0YWJsZURpcmVjdG9yaWVzID0gRGlyZWN0b3JpZXMuZ2V0S1NDaGlsZERpcmVjdG9yaWVzKGtleXNwYWNlKTsKLSAgICAgICAgRGlyZWN0b3JpZXMuY2xlYXJTbmFwc2hvdChzbmFwc2hvdE5hbWUsIHRhYmxlRGlyZWN0b3JpZXMsIGNsZWFyU25hcHNob3RSYXRlTGltaXRlcik7Ci0gICAgfQotCi0gICAgLyoqCiAgICAgICogQHJldHVybiBBIGxpc3Qgb2Ygb3BlbiBTU1RhYmxlUmVhZGVycwogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PFNTVGFibGVSZWFkZXI+IGdldEFsbFNTVGFibGVzKFNTVGFibGVTZXQgc3N0YWJsZVNldCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL011dGF0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9NdXRhdGlvbi5qYXZhCmluZGV4IDdiNmE2ODYuLmFkNDNiMTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL011dGF0aW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvTXV0YXRpb24uamF2YQpAQCAtMjMsMjYgKzIzLDMyIEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlQ29sbGVjdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlN0YWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uVXBkYXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRGVzZXJpYWxpemF0aW9uSGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklWZXJzaW9uZWRTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlRlZURhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhUGxhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWJzdHJhY3RXcml0ZVJlc3BvbnNlSGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkZ1dHVyZTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzMwOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzMwMTQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlLlZFUlNJT05fNDA7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlLio7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1vbm90b25pY0Nsb2NrLkdsb2JhbC5hcHByb3hUaW1lOwogCiBwdWJsaWMgY2xhc3MgTXV0YXRpb24gaW1wbGVtZW50cyBJTXV0YXRpb24sIFN1cHBsaWVyPE11dGF0aW9uPgpAQCAtNjQsNiArNzAsMTUgQEAKIAogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjZGNFbmFibGVkOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFUklBTElaQVRJT05fVkVSU0lPTl9DT1VOVCA9IE1lc3NhZ2luZ1NlcnZpY2UuVmVyc2lvbi52YWx1ZXMoKS5sZW5ndGg7CisgICAgLy8gQ29udGFpbnMgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbnMgb2YgdGhpcyBtdXRhdGlvbi4KKyAgICAvLyBOb3RlOiB0aGVyZSBpcyBubyBmdW5jdGlvbmFsaXR5IHRvIGNsZWFyL3JlbW92ZSBzZXJpYWxpemVkIGluc3RhbmNlcywgYmVjYXVzZSBhIG11dGF0aW9uIG11c3QgbmV2ZXIKKyAgICAvLyBiZSBtb2RpZmllZCAoZS5nLiBjYWxsaW5nIGFkZChQYXJ0aXRpb25VcGRhdGUpKSB3aGVuIGl0J3MgYmVpbmcgc2VyaWFsaXplZC4KKyAgICBwcml2YXRlIGZpbmFsIFNlcmlhbGl6YXRpb25bXSBjYWNoZWRTZXJpYWxpemF0aW9ucyA9IG5ldyBTZXJpYWxpemF0aW9uW1NFUklBTElaQVRJT05fVkVSU0lPTl9DT1VOVF07CisKKyAgICAvKiogQHNlZSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMjQ0FDSEVBQkxFX01VVEFUSU9OX1NJWkVfTElNSVQgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIENBQ0hFQUJMRV9NVVRBVElPTl9TSVpFX0xJTUlUID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBQ0hFQUJMRV9NVVRBVElPTl9TSVpFX0xJTUlULmdldExvbmcoKTsKKwogICAgIHB1YmxpYyBNdXRhdGlvbihQYXJ0aXRpb25VcGRhdGUgdXBkYXRlKQogICAgIHsKICAgICAgICAgdGhpcyh1cGRhdGUubWV0YWRhdGEoKS5rZXlzcGFjZSwgdXBkYXRlLnBhcnRpdGlvbktleSgpLCBJbW11dGFibGVNYXAub2YodXBkYXRlLm1ldGFkYXRhKCkuaWQsIHVwZGF0ZSksIGFwcHJveFRpbWUubm93KCksIHVwZGF0ZS5tZXRhZGF0YSgpLnBhcmFtcy5jZGMpOwpAQCAtMjk4LDYgKzMxMyw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGJ1ZmYuYXBwZW5kKCJdKSIpLnRvU3RyaW5nKCk7CiAgICAgfQorCiAgICAgcHJpdmF0ZSBpbnQgc2VyaWFsaXplZFNpemUzMDsKICAgICBwcml2YXRlIGludCBzZXJpYWxpemVkU2l6ZTMwMTQ7CiAgICAgcHJpdmF0ZSBpbnQgc2VyaWFsaXplZFNpemU0MDsKQEAgLTM5MywzNCArNDA5LDExNSBAQAogICAgIHsKICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKE11dGF0aW9uIG11dGF0aW9uLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgeworICAgICAgICAgICAgc2VyaWFsaXphdGlvbihtdXRhdGlvbiwgdmVyc2lvbikuc2VyaWFsaXplKFBhcnRpdGlvblVwZGF0ZS5zZXJpYWxpemVyLCBtdXRhdGlvbiwgb3V0LCB2ZXJzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYWxsZWQgZWFybHkgZHVyaW5nIHJlcXVlc3QgcHJvY2Vzc2luZyB0byBwcmV2ZW50IHRoYXQge0BsaW5rICNzZXJpYWxpemF0aW9uKE11dGF0aW9uLCBpbnQpfSBpcworICAgICAgICAgKiBjYWxsZWQgY29uY3VycmVudGx5LgorICAgICAgICAgKiBTZWUge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVByb3h5I3NlbmRUb0hpbnRlZFJlcGxpY2FzKE11dGF0aW9uLCBSZXBsaWNhUGxhbi5Gb3JXcml0ZSwgQWJzdHJhY3RXcml0ZVJlc3BvbnNlSGFuZGxlciwgU3RyaW5nLCBTdGFnZSl9CisgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiSmF2YWRvY1JlZmVyZW5jZSIpCisgICAgICAgIHB1YmxpYyB2b2lkIHByZXBhcmVTZXJpYWxpemVkQnVmZmVyKE11dGF0aW9uIG11dGF0aW9uLCBpbnQgdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgc2VyaWFsaXphdGlvbihtdXRhdGlvbiwgdmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0cmlldmUgdGhlIGNhY2hlZCBzZXJpYWxpemF0aW9uIG9mIHRoaXMgbXV0YXRpb24sIG9yIGNvbXB1dGUgYW5kIGNhY2hlIHNhaWQgc2VyaWFsaXphdGlvbiBpZiBpdCBkb2Vzbid0CisgICAgICAgICAqIGV4aXN0IHlldC4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIF9ub3RfIHN5bmNocm9uaXplZCBldmVuIHRob3VnaCBpdCBtYXkgKGFuZCB3aWxsIG9mdGVuKSBiZSBjYWxsZWQKKyAgICAgICAgICogY29uY3VycmVudGx5LiBDb25jdXJyZW50IGNhbGxzIGFyZSBzdGlsbCBzYWZlIGhvd2V2ZXIsIHRoZSBvbmx5IHJpc2sgaXMgdGhhdCB0aGUgdmFsdWUgaXMgbm90IGNhY2hlZCB5ZXQsCisgICAgICAgICAqIG11bHRpcGxlIGNvbmN1cnJlbnQgY2FsbHMgbWF5IGNvbXB1dGUgaXQgbXVsdGlwbGUgdGltZXMgaW5zdGVhZCBvZiBqdXN0IG9uY2UuIFRoaXMgaXMgb2sgYXMgaW4gcHJhY3RpY2UKKyAgICAgICAgICogYXMgd2UgbWFrZSBzdXJlIHRoaXMgZG9lc24ndCBoYXBwZW4gaW4gdGhlIGhvdCBwYXRoIGJ5IGZvcmNpbmcgdGhlIGluaXRpYWwgY2FjaGluZyBpbgorICAgICAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlUHJveHkjc2VuZFRvSGludGVkUmVwbGljYXMoTXV0YXRpb24sIFJlcGxpY2FQbGFuLkZvcldyaXRlLCBBYnN0cmFjdFdyaXRlUmVzcG9uc2VIYW5kbGVyLCBTdHJpbmcsIFN0YWdlKX0KKyAgICAgICAgICogdmlhIHtAbGluayAjcHJlcGFyZVNlcmlhbGl6ZWRCdWZmZXIoTXV0YXRpb24pfSwgd2hpY2ggaXMgdGhlIG9ubHkgY2FsbGVyIHRoYXQgcGFzc2VzCisgICAgICAgICAqIHtAY29kZSBpc1ByZXBhcmU9PXRydWV9LgorICAgICAgICAgKi8KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFkb2NSZWZlcmVuY2UiKQorICAgICAgICBwcml2YXRlIFNlcmlhbGl6YXRpb24gc2VyaWFsaXphdGlvbihNdXRhdGlvbiBtdXRhdGlvbiwgaW50IHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB2ZXJzaW9uT3JkaW5hbCA9IE1lc3NhZ2luZ1NlcnZpY2UuZ2V0VmVyc2lvbk9yZGluYWwodmVyc2lvbik7CisgICAgICAgICAgICAvLyBSZXRyaWV2ZXMgdGhlIGNhY2hlZCB2ZXJzaW9uLCBvciBidWlsZCtjYWNoZSBpdCBpZiBpdCdzIG5vdCBjYWNoZWQgYWxyZWFkeS4KKyAgICAgICAgICAgIFNlcmlhbGl6YXRpb24gc2VyaWFsaXphdGlvbiA9IG11dGF0aW9uLmNhY2hlZFNlcmlhbGl6YXRpb25zW3ZlcnNpb25PcmRpbmFsXTsKKyAgICAgICAgICAgIGlmIChzZXJpYWxpemF0aW9uID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbiA9IG5ldyBTaXplT25seUNhY2hlYWJsZVNlcmlhbGl6YXRpb24oKTsKKyAgICAgICAgICAgICAgICBsb25nIHNlcmlhbGl6ZWRTaXplID0gc2VyaWFsaXphdGlvbi5zZXJpYWxpemVkU2l6ZShQYXJ0aXRpb25VcGRhdGUuc2VyaWFsaXplciwgbXV0YXRpb24sIHZlcnNpb24pOworCisgICAgICAgICAgICAgICAgLy8gRXhjZXNzaXZlbHkgbGFyZ2UgbXV0YXRpb24gb2JqZWN0cyBjYXVzZSBHQyBwcmVzc3VyZSBhbmQgaHVnZSBhbGxvY2F0aW9ucyB3aGVuIHNlcmlhbGl6ZWQuCisgICAgICAgICAgICAgICAgLy8gc28gd2Ugb25seSBjYWNoZSBzZXJpYWxpemVkIG11dGF0aW9ucyB3aGVuIHRoZXkgYXJlIGJlbG93IHRoZSBkZWZpbmVkIGxpbWl0LgorICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVkU2l6ZSA8IENBQ0hFQUJMRV9NVVRBVElPTl9TSVpFX0xJTUlUKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IChEYXRhT3V0cHV0QnVmZmVyIGRvYiA9IERhdGFPdXRwdXRCdWZmZXIuc2NyYXRjaEJ1ZmZlci5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplSW50ZXJuYWwoUGFydGl0aW9uVXBkYXRlLnNlcmlhbGl6ZXIsIG11dGF0aW9uLCBkb2IsIHZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbiA9IG5ldyBDYWNoZWRTZXJpYWxpemF0aW9uKGRvYi50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbXV0YXRpb24uY2FjaGVkU2VyaWFsaXphdGlvbnNbdmVyc2lvbk9yZGluYWxdID0gc2VyaWFsaXphdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb247CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgdm9pZCBzZXJpYWxpemVJbnRlcm5hbChQYXJ0aXRpb25VcGRhdGUuUGFydGl0aW9uVXBkYXRlU2VyaWFsaXplciBzZXJpYWxpemVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRhdGlvbiBtdXRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YU91dHB1dFBsdXMgb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIE1hcDxUYWJsZUlkLCBQYXJ0aXRpb25VcGRhdGU+IG1vZGlmaWNhdGlvbnMgPSBtdXRhdGlvbi5tb2RpZmljYXRpb25zOworCiAgICAgICAgICAgICAvKiBzZXJpYWxpemUgdGhlIG1vZGlmaWNhdGlvbnMgaW4gdGhlIG11dGF0aW9uICovCi0gICAgICAgICAgICBpbnQgc2l6ZSA9IG11dGF0aW9uLm1vZGlmaWNhdGlvbnMuc2l6ZSgpOwotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHNpemUpOworICAgICAgICAgICAgaW50IHNpemUgPSBtb2RpZmljYXRpb25zLnNpemUoKTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHNpemUpOwogCiAgICAgICAgICAgICBhc3NlcnQgc2l6ZSA+IDA7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxUYWJsZUlkLCBQYXJ0aXRpb25VcGRhdGU+IGVudHJ5IDogbXV0YXRpb24ubW9kaWZpY2F0aW9ucy5lbnRyeVNldCgpKQotICAgICAgICAgICAgICAgIFBhcnRpdGlvblVwZGF0ZS5zZXJpYWxpemVyLnNlcmlhbGl6ZShlbnRyeS5nZXRWYWx1ZSgpLCBvdXQsIHZlcnNpb24pOworICAgICAgICAgICAgZm9yIChQYXJ0aXRpb25VcGRhdGUgcGFydGl0aW9uVXBkYXRlIDogbW9kaWZpY2F0aW9ucy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShwYXJ0aXRpb25VcGRhdGUsIG91dCwgdmVyc2lvbik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgTXV0YXRpb24gZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24sIERlc2VyaWFsaXphdGlvbkhlbHBlci5GbGFnIGZsYWcpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpOwotICAgICAgICAgICAgYXNzZXJ0IHNpemUgPiAwOwotCi0gICAgICAgICAgICBQYXJ0aXRpb25VcGRhdGUgdXBkYXRlID0gUGFydGl0aW9uVXBkYXRlLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24sIGZsYWcpOwotICAgICAgICAgICAgaWYgKHNpemUgPT0gMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE11dGF0aW9uKHVwZGF0ZSk7Ci0KLSAgICAgICAgICAgIEltbXV0YWJsZU1hcC5CdWlsZGVyPFRhYmxlSWQsIFBhcnRpdGlvblVwZGF0ZT4gbW9kaWZpY2F0aW9ucyA9IG5ldyBJbW11dGFibGVNYXAuQnVpbGRlcjw+KCk7Ci0gICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZGsgPSB1cGRhdGUucGFydGl0aW9uS2V5KCk7Ci0KLSAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMucHV0KHVwZGF0ZS5tZXRhZGF0YSgpLmlkLCB1cGRhdGUpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyArK2kpCisgICAgICAgICAgICBNdXRhdGlvbiBtOworICAgICAgICAgICAgVGVlRGF0YUlucHV0UGx1cyB0ZWVJbjsKKyAgICAgICAgICAgIHRyeSAoRGF0YU91dHB1dEJ1ZmZlciBkb2IgPSBEYXRhT3V0cHV0QnVmZmVyLnNjcmF0Y2hCdWZmZXIuZ2V0KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlID0gUGFydGl0aW9uVXBkYXRlLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24sIGZsYWcpOwotICAgICAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMucHV0KHVwZGF0ZS5tZXRhZGF0YSgpLmlkLCB1cGRhdGUpOworICAgICAgICAgICAgICAgIHRlZUluID0gbmV3IFRlZURhdGFJbnB1dFBsdXMoaW4sIGRvYiwgQ0FDSEVBQkxFX01VVEFUSU9OX1NJWkVfTElNSVQpOworCisgICAgICAgICAgICAgICAgaW50IHNpemUgPSB0ZWVJbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgc2l6ZSA+IDA7CisKKyAgICAgICAgICAgICAgICBQYXJ0aXRpb25VcGRhdGUgdXBkYXRlID0gUGFydGl0aW9uVXBkYXRlLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUodGVlSW4sIHZlcnNpb24sIGZsYWcpOworICAgICAgICAgICAgICAgIGlmIChzaXplID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtID0gbmV3IE11dGF0aW9uKHVwZGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZU1hcC5CdWlsZGVyPFRhYmxlSWQsIFBhcnRpdGlvblVwZGF0ZT4gbW9kaWZpY2F0aW9ucyA9IG5ldyBJbW11dGFibGVNYXAuQnVpbGRlcjw+KCk7CisgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBkayA9IHVwZGF0ZS5wYXJ0aXRpb25LZXkoKTsKKworICAgICAgICAgICAgICAgICAgICBtb2RpZmljYXRpb25zLnB1dCh1cGRhdGUubWV0YWRhdGEoKS5pZCwgdXBkYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzaXplOyArK2kpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSA9IFBhcnRpdGlvblVwZGF0ZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKHRlZUluLCB2ZXJzaW9uLCBmbGFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWNhdGlvbnMucHV0KHVwZGF0ZS5tZXRhZGF0YSgpLmlkLCB1cGRhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG0gPSBuZXcgTXV0YXRpb24odXBkYXRlLm1ldGFkYXRhKCkua2V5c3BhY2UsIGRrLCBtb2RpZmljYXRpb25zLmJ1aWxkKCksIGFwcHJveFRpbWUubm93KCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vT25seSBjYWNoZSBzZXJpYWxpemF0aW9ucyB0aGF0IGRvbid0IGhpdCB0aGUgbGltaXQKKyAgICAgICAgICAgICAgICBpZiAoIXRlZUluLmlzTGltaXRSZWFjaGVkKCkpCisgICAgICAgICAgICAgICAgICAgIG0uY2FjaGVkU2VyaWFsaXphdGlvbnNbTWVzc2FnaW5nU2VydmljZS5nZXRWZXJzaW9uT3JkaW5hbCh2ZXJzaW9uKV0gPSBuZXcgQ2FjaGVkU2VyaWFsaXphdGlvbihkb2IudG9CeXRlQXJyYXkoKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTXV0YXRpb24odXBkYXRlLm1ldGFkYXRhKCkua2V5c3BhY2UsIGRrLCBtb2RpZmljYXRpb25zLmJ1aWxkKCksIGFwcHJveFRpbWUubm93KCkpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIE11dGF0aW9uIGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KQEAgLTQzMCwxMCArNTI3LDcxIEBACiAKICAgICAgICAgcHVibGljIGxvbmcgc2VyaWFsaXplZFNpemUoTXV0YXRpb24gbXV0YXRpb24sIGludCB2ZXJzaW9uKQogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQobXV0YXRpb24ubW9kaWZpY2F0aW9ucy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8VGFibGVJZCwgUGFydGl0aW9uVXBkYXRlPiBlbnRyeSA6IG11dGF0aW9uLm1vZGlmaWNhdGlvbnMuZW50cnlTZXQoKSkKLSAgICAgICAgICAgICAgICBzaXplICs9IFBhcnRpdGlvblVwZGF0ZS5zZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKGVudHJ5LmdldFZhbHVlKCksIHZlcnNpb24pOworICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb24obXV0YXRpb24sIHZlcnNpb24pLnNlcmlhbGl6ZWRTaXplKFBhcnRpdGlvblVwZGF0ZS5zZXJpYWxpemVyLCBtdXRhdGlvbiwgdmVyc2lvbik7CisgICAgICAgIH0KKyAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGVyZSBhcmUgdHdvIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzLiBPbmUgdGhhdCBrZWVwcyB0aGUgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvbi1oZWFwIGZvciBsYXRlcgorICAgICAqIHJldXNlIGFuZCBvbmUgdGhhdCBkb2Vzbid0LiBLZWVwaW5nIGFsbCBzaXplZCBtdXRhdGlvbnMgYXJvdW5kIG1heSBsZWFkIHRvICJiYWQiIEdDIHByZXNzdXJlIChHMSBHQykgZHVlIHRvIGh1bW9uZ291cyBvYmplY3RzLgorICAgICAqIEJ5IGRlZmF1bHQgc2VyaWFsaXplZCBtdXRhdGlvbnMgdXAgdG8gMk1CIGFyZSBrZXB0IG9uLWhlYXAgLSBzZWUge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMjQ0FDSEVBQkxFX01VVEFUSU9OX1NJWkVfTElNSVR9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFNlcmlhbGl6YXRpb24KKyAgICB7CisgICAgICAgIGFic3RyYWN0IHZvaWQgc2VyaWFsaXplKFBhcnRpdGlvblVwZGF0ZS5QYXJ0aXRpb25VcGRhdGVTZXJpYWxpemVyIHNlcmlhbGl6ZXIsIE11dGF0aW9uIG11dGF0aW9uLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgYWJzdHJhY3QgbG9uZyBzZXJpYWxpemVkU2l6ZShQYXJ0aXRpb25VcGRhdGUuUGFydGl0aW9uVXBkYXRlU2VyaWFsaXplciBzZXJpYWxpemVyLCBNdXRhdGlvbiBtdXRhdGlvbiwgaW50IHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIGNhY2hlZCBzZXJpYWxpemF0aW9uIG9mIGEge0BsaW5rIE11dGF0aW9ufSBhcyBhIHtAY29kZSBieXRlW119LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENhY2hlZFNlcmlhbGl6YXRpb24gZXh0ZW5kcyBTZXJpYWxpemF0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBzZXJpYWxpemVkOworCisgICAgICAgIENhY2hlZFNlcmlhbGl6YXRpb24oYnl0ZVtdIHNlcmlhbGl6ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc2VyaWFsaXplZCA9IFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHNlcmlhbGl6ZWQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgc2VyaWFsaXplKFBhcnRpdGlvblVwZGF0ZS5QYXJ0aXRpb25VcGRhdGVTZXJpYWxpemVyIHNlcmlhbGl6ZXIsIE11dGF0aW9uIG11dGF0aW9uLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgb3V0LndyaXRlKHNlcmlhbGl6ZWQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGxvbmcgc2VyaWFsaXplZFNpemUoUGFydGl0aW9uVXBkYXRlLlBhcnRpdGlvblVwZGF0ZVNlcmlhbGl6ZXIgc2VyaWFsaXplciwgTXV0YXRpb24gbXV0YXRpb24sIGludCB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplZC5sZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgbm9uLWNhY2hlYWJsZSBzZXJpYWxpemF0aW9uIG9mIGEge0BsaW5rIE11dGF0aW9ufSwgb25seSB0aGUgc2l6ZSBvZiB0aGUgbXV0YXRpb24gaXMgbGF6aWx5IGNhY2hlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTaXplT25seUNhY2hlYWJsZVNlcmlhbGl6YXRpb24gZXh0ZW5kcyBTZXJpYWxpemF0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGxvbmcgc2l6ZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBzZXJpYWxpemUoUGFydGl0aW9uVXBkYXRlLlBhcnRpdGlvblVwZGF0ZVNlcmlhbGl6ZXIgc2VyaWFsaXplciwgTXV0YXRpb24gbXV0YXRpb24sIERhdGFPdXRwdXRQbHVzIG91dCwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBNdXRhdGlvblNlcmlhbGl6ZXIuc2VyaWFsaXplSW50ZXJuYWwoc2VyaWFsaXplciwgbXV0YXRpb24sIG91dCwgdmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgbG9uZyBzZXJpYWxpemVkU2l6ZShQYXJ0aXRpb25VcGRhdGUuUGFydGl0aW9uVXBkYXRlU2VyaWFsaXplciBzZXJpYWxpemVyLCBNdXRhdGlvbiBtdXRhdGlvbiwgaW50IHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgc2l6ZSA9IHRoaXMuc2l6ZTsKKyAgICAgICAgICAgIGlmIChzaXplID09IDBMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNpemUgPSBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KG11dGF0aW9uLm1vZGlmaWNhdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKFBhcnRpdGlvblVwZGF0ZSBwYXJ0aXRpb25VcGRhdGUgOiBtdXRhdGlvbi5tb2RpZmljYXRpb25zLnZhbHVlcygpKQorICAgICAgICAgICAgICAgICAgICBzaXplICs9IHNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUocGFydGl0aW9uVXBkYXRlLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICB0aGlzLnNpemUgPSBzaXplOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHNpemU7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9OYXRpdmVDbHVzdGVyaW5nLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9OYXRpdmVDbHVzdGVyaW5nLmphdmEKaW5kZXggMGU0YzE5ZC4uMWI2NzYxZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvTmF0aXZlQ2x1c3RlcmluZy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL05hdGl2ZUNsdXN0ZXJpbmcuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVmFsdWVBY2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PYmplY3RTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50Lk9wT3JkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5LkhlYXBDbG9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk1lbW9yeVV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk5hdGl2ZUFsbG9jYXRvcjsKIApAQCAtMzYsMTEgKzM3LDYgQEAKIAogICAgIHByaXZhdGUgTmF0aXZlQ2x1c3RlcmluZygpIHsgcGVlciA9IDA7IH0KIAotICAgIHB1YmxpYyBDbHVzdGVyaW5nUHJlZml4PEJ5dGVCdWZmZXI+IG1pbmltaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQogICAgIHB1YmxpYyBOYXRpdmVDbHVzdGVyaW5nKE5hdGl2ZUFsbG9jYXRvciBhbGxvY2F0b3IsIE9wT3JkZXIuR3JvdXAgd3JpdGVPcCwgQ2x1c3RlcmluZzw/PiBjbHVzdGVyaW5nKQogICAgIHsKICAgICAgICAgaW50IGNvdW50ID0gY2x1c3RlcmluZy5zaXplKCk7CkBAIC0xNTcsNCArMTUzLDIwIEBACiAgICAgewogICAgICAgICByZXR1cm4gQ2x1c3RlcmluZ1ByZWZpeC5lcXVhbHModGhpcywgbyk7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsdXN0ZXJpbmdQcmVmaXg8Qnl0ZUJ1ZmZlcj4gcmV0YWluYWJsZSgpCisgICAgeworICAgICAgICBhc3NlcnQga2luZCgpID09IEtpbmQuQ0xVU1RFUklORzsgLy8gdG9tYnN0b25lcyBhcmUgbmV2ZXIgc3RvcmVkIG5hdGl2ZWx5CisKKyAgICAgICAgLy8gYWx3YXlzIGV4dHJhY3QKKyAgICAgICAgQnl0ZUJ1ZmZlcltdIHZhbHVlcyA9IG5ldyBCeXRlQnVmZmVyW3NpemUoKV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gZ2V0KGkpOworICAgICAgICAgICAgdmFsdWVzW2ldID0gdmFsdWUgIT0gbnVsbCA/IEhlYXBDbG9uZXIuaW5zdGFuY2UuY2xvbmUodmFsdWUpIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhY2Nlc3NvcigpLmZhY3RvcnkoKS5jbHVzdGVyaW5nKHZhbHVlcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvTmF0aXZlRGVjb3JhdGVkS2V5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9OYXRpdmVEZWNvcmF0ZWRLZXkuamF2YQppbmRleCBhZGQ1MjE4Li5iYzE0OTA4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9OYXRpdmVEZWNvcmF0ZWRLZXkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9OYXRpdmVEZWNvcmF0ZWRLZXkuamF2YQpAQCAtMjAsNyArMjAsOSBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwogCitpbXBvcnQgbmV0Lm5pY291bGFqLmNvbXBpbGVjb21tYW5kLmFubm90YXRpb25zLklubGluZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50Lk9wT3JkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk1lbW9yeVV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk5hdGl2ZUFsbG9jYXRvcjsKQEAgLTQxLDggKzQzLDQ0IEBACiAgICAgICAgIE1lbW9yeVV0aWwuc2V0Qnl0ZXMocGVlciArIDQsIGtleSk7CiAgICAgfQogCisgICAgcHVibGljIE5hdGl2ZURlY29yYXRlZEtleShUb2tlbiB0b2tlbiwgTmF0aXZlQWxsb2NhdG9yIGFsbG9jYXRvciwgT3BPcmRlci5Hcm91cCB3cml0ZU9wLCBieXRlW10ga2V5Qnl0ZXMpCisgICAgeworICAgICAgICBzdXBlcih0b2tlbik7CisgICAgICAgIGFzc2VydCBrZXlCeXRlcyAhPSBudWxsOworCisgICAgICAgIGludCBzaXplID0ga2V5Qnl0ZXMubGVuZ3RoOworICAgICAgICB0aGlzLnBlZXIgPSBhbGxvY2F0b3IuYWxsb2NhdGUoNCArIHNpemUsIHdyaXRlT3ApOworICAgICAgICBNZW1vcnlVdGlsLnNldEludChwZWVyLCBzaXplKTsKKyAgICAgICAgTWVtb3J5VXRpbC5zZXRCeXRlcyhwZWVyICsgNCwga2V5Qnl0ZXMsIDAsIHNpemUpOworICAgIH0KKworICAgIEBJbmxpbmUKKyAgICBpbnQgbGVuZ3RoKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNZW1vcnlVdGlsLmdldEludChwZWVyKTsKKyAgICB9CisKKyAgICBASW5saW5lCisgICAgbG9uZyBhZGRyZXNzKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnBlZXIgKyA0OworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldEtleSgpCiAgICAgewotICAgICAgICByZXR1cm4gTWVtb3J5VXRpbC5nZXRCeXRlQnVmZmVyKHBlZXIgKyA0LCBNZW1vcnlVdGlsLmdldEludChwZWVyKSwgQnl0ZU9yZGVyLkJJR19FTkRJQU4pOworICAgICAgICByZXR1cm4gTWVtb3J5VXRpbC5nZXRCeXRlQnVmZmVyKGFkZHJlc3MoKSwgbGVuZ3RoKCksIEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEtleUxlbmd0aCgpCisgICAgeworICAgICAgICByZXR1cm4gTWVtb3J5VXRpbC5nZXRJbnQocGVlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEJ5dGVTb3VyY2Uga2V5Q29tcGFyYWJsZUJ5dGVzKFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9mTWVtb3J5KGFkZHJlc3MoKSwgbGVuZ3RoKCksIHZlcnNpb24pOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1BhcnRpdGlvblBvc2l0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9QYXJ0aXRpb25Qb3NpdGlvbi5qYXZhCmluZGV4IDNiNDVjNmMuLjVlMWQ2MTggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1BhcnRpdGlvblBvc2l0aW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUGFydGl0aW9uUG9zaXRpb24uamF2YQpAQCAtMjQsOCArMjQsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CiAKLXB1YmxpYyBpbnRlcmZhY2UgUGFydGl0aW9uUG9zaXRpb24gZXh0ZW5kcyBSaW5nUG9zaXRpb248UGFydGl0aW9uUG9zaXRpb24+CitwdWJsaWMgaW50ZXJmYWNlIFBhcnRpdGlvblBvc2l0aW9uIGV4dGVuZHMgUmluZ1Bvc2l0aW9uPFBhcnRpdGlvblBvc2l0aW9uPiwgQnl0ZUNvbXBhcmFibGUKIHsKICAgICBwdWJsaWMgc3RhdGljIGVudW0gS2luZAogICAgIHsKQEAgLTU0LDYgKzU2LDI3IEBACiAgICAgcHVibGljIEtpbmQga2luZCgpOwogICAgIHB1YmxpYyBib29sZWFuIGlzTWluaW11bSgpOwogCisgICAgLyoqCisgICAgICogUHJvZHVjZSBhIHByZWZpeC1mcmVlIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUga2V5LCBpLmUuIHN1Y2ggYSBzZXF1ZW5jZSBvZiBieXRlcyB0aGF0IGFueSBwYWlyIHgsIHkKKyAgICAgKiBvZiB2YWxpZCBwb3NpdGlvbnMgKHdpdGggdGhlIHNhbWUga2V5IGNvbHVtbiB0eXBlcyBhbmQgcGFydGl0aW9uZXIpLAorICAgICAqICAgeC5jb21wYXJlVG8oeSkgPT0gY29tcGFyZUxleGljb2dyYXBoaWNhbGx5VW5zaWduZWQoeC5hc0NvbXBhcmFibGVCeXRlcygpLCB5LmFzQ29tcGFyYWJsZUJ5dGVzKCkpCisgICAgICogYW5kCisgICAgICogICB4LmFzQ29tcGFyYWJsZUJ5dGVzKCkgaXMgbm90IGEgcHJlZml4IG9mIHkuYXNDb21wYXJhYmxlQnl0ZXMoKQorICAgICAqCisgICAgICogV2UgdXNlIGEgdHdvLWNvbXBvbmVudCB0dXBsZSBmb3IgZGVjb3JhdGVkIGtleXMsIGFuZCBhIG9uZS1jb21wb25lbnQgdHVwbGUgZm9yIGtleSBib3VuZHMsIHdoZXJlIHRoZSB0ZXJtaW5hdG9yCisgICAgICogYnl0ZSBpcyBjaG9zZW4gdG8geWllbGQgdGhlIGNvcnJlY3QgY29tcGFyaXNvbiByZXN1bHQuIE5vIGRlY29yYXRlZCBrZXkgY2FuIGJlIGEgcHJlZml4IG9mIGFub3RoZXIgKHBlciB0aGUgdHVwbGUKKyAgICAgKiBlbmNvZGluZyksIGFuZCBubyBrZXkgYm91bmQgY2FuIGJlIGEgcHJlZml4IG9mIG9uZSBiZWNhdXNlIGl0IHVzZXMgYSB0ZXJtaW5hdG9yIGJ5dGUgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUKKyAgICAgKiB0dXBsZSBzZXBhcmF0b3IuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmVyc2lvbiB2ZXJzaW9uKTsKKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgYSBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBwb3NpdGlvbiBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGtleS4KKyAgICAgKiBUaGlzIGRvZXMgbm90aGluZyBmb3IgdG9rZW4gYm91bmRhcmllcyAod2hpY2ggYXJlIGFscmVhZHkgYXQgYSBwb3NpdGlvbiBiZXR3ZWVuIHZhbGlkIGtleXMpLCBhbmQgY2hhbmdlcworICAgICAqIHRoZSB0ZXJtaW5hdG9yIGJ5dGUgZm9yIGtleXMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEJ5dGVDb21wYXJhYmxlIGFzQ29tcGFyYWJsZUJvdW5kKGJvb2xlYW4gYmVmb3JlKTsKKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm93UG9zaXRpb25TZXJpYWxpemVyIGltcGxlbWVudHMgSVBhcnRpdGlvbmVyRGVwZW5kZW50U2VyaWFsaXplcjxQYXJ0aXRpb25Qb3NpdGlvbj4KICAgICB7CiAgICAgICAgIC8qCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9QYXJ0aXRpb25SYW5nZVJlYWRDb21tYW5kLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9QYXJ0aXRpb25SYW5nZVJlYWRDb21tYW5kLmphdmEKaW5kZXggZjAwMGQ2My4uMTY0ZTAzYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUGFydGl0aW9uUmFuZ2VSZWFkQ29tbWFuZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1BhcnRpdGlvblJhbmdlUmVhZENvbW1hbmQuamF2YQpAQCAtMTgsMTIgKzE4LDExIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5WaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLlZpcnR1YWxUYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5DbHVzdGVyaW5nSW5kZXhGaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKQEAgLTM2LDE0ICszNSwxNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJhc2VSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uUlRCb3VuZFZhbGlkYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uVHJhbnNmb3JtYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5WaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLlZpcnR1YWxUYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJvdW5kczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlcXVlc3RFeGVjdXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuVGFibGVNZXRyaWNzOwpAQCAtNjIsNiArNjQsNyBAQAogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU2VsZWN0aW9uRGVzZXJpYWxpemVyIHNlbGVjdGlvbkRlc2VyaWFsaXplciA9IG5ldyBEZXNlcmlhbGl6ZXIoKTsKIAogICAgIHByb3RlY3RlZCBmaW5hbCBEYXRhUmFuZ2UgZGF0YVJhbmdlOworICAgIHByb3RlY3RlZCBmaW5hbCBTbGljZXMgcmVxdWVzdGVkU2xpY2VzOwogCiAgICAgcHJpdmF0ZSBQYXJ0aXRpb25SYW5nZVJlYWRDb21tYW5kKGJvb2xlYW4gaXNEaWdlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaWdlc3RWZXJzaW9uLApAQCAtNzcsNiArODAsOCBAQAogICAgIHsKICAgICAgICAgc3VwZXIoS2luZC5QQVJUSVRJT05fUkFOR0UsIGlzRGlnZXN0LCBkaWdlc3RWZXJzaW9uLCBhY2NlcHRzVHJhbnNpZW50LCBtZXRhZGF0YSwgbm93SW5TZWMsIGNvbHVtbkZpbHRlciwgcm93RmlsdGVyLCBsaW1pdHMsIGluZGV4LCB0cmFja1dhcm5pbmdzKTsKICAgICAgICAgdGhpcy5kYXRhUmFuZ2UgPSBkYXRhUmFuZ2U7CisgICAgICAgIHRoaXMucmVxdWVzdGVkU2xpY2VzID0gZGF0YVJhbmdlLmNsdXN0ZXJpbmdJbmRleEZpbHRlci5nZXRTbGljZXMobWV0YWRhdGEoKSk7CisKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBQYXJ0aXRpb25SYW5nZVJlYWRDb21tYW5kIGNyZWF0ZShib29sZWFuIGlzRGlnZXN0LApAQCAtMzExLDYgKzMxNiw3IEBACiAgICAgfQogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKICAgICBwdWJsaWMgVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yIHF1ZXJ5U3RvcmFnZShmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIFJlYWRFeGVjdXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIpCiAgICAgewogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZS5WaWV3RnJhZ21lbnQgdmlldyA9IGNmcy5zZWxlY3QoVmlldy5zZWxlY3RMaXZlKGRhdGFSYW5nZSgpLmtleVJhbmdlKCkpKTsKQEAgLTMyOSwyMCArMzM1LDQzIEBACiAgICAgICAgICAgICAgICAgaW5wdXRDb2xsZWN0b3IuYWRkTWVtdGFibGVJdGVyYXRvcihSVEJvdW5kVmFsaWRhdG9yLnZhbGlkYXRlKGl0ZXIsIFJUQm91bmRWYWxpZGF0b3IuU3RhZ2UuTUVNVEFCTEUsIGZhbHNlKSk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGludCBzZWxlY3RlZFNTVGFibGVzQ250ID0gMDsKICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogdmlldy5zc3RhYmxlcykKICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGludGVyc2VjdHMgPSBpbnRlcnNlY3RzKHNzdGFibGUpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMgPSBoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9ucyhzc3RhYmxlKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGhhc1JlcXVpcmVkU3RhdGljcyA9IGhhc1JlcXVpcmVkU3RhdGljcyhzc3RhYmxlKTsKKworICAgICAgICAgICAgICAgIGlmICghaW50ZXJzZWN0cyAmJiAhaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMgJiYgIWhhc1JlcXVpcmVkU3RhdGljcykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBjbG9zZSBvbiBleGNlcHRpb24gYW5kIG9uIGNsb3NpbmcgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGlzIG1ldGhvZAogICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvciBpdGVyID0gc3N0YWJsZS5wYXJ0aXRpb25JdGVyYXRvcihjb2x1bW5GaWx0ZXIoKSwgZGF0YVJhbmdlKCksIHJlYWRDb3VudFVwZGF0ZXIpOwogICAgICAgICAgICAgICAgIGlucHV0Q29sbGVjdG9yLmFkZFNTVGFibGVJdGVyYXRvcihzc3RhYmxlLCBSVEJvdW5kVmFsaWRhdG9yLnZhbGlkYXRlKGl0ZXIsIFJUQm91bmRWYWxpZGF0b3IuU3RhZ2UuU1NUQUJMRSwgZmFsc2UpKTsKIAogICAgICAgICAgICAgICAgIGlmICghc3N0YWJsZS5pc1JlcGFpcmVkKCkpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIudXBkYXRlTWluT2xkZXN0VW5yZXBhaXJlZFRvbWJzdG9uZShzc3RhYmxlLmdldE1pbkxvY2FsRGVsZXRpb25UaW1lKCkpOworCisgICAgICAgICAgICAgICAgc2VsZWN0ZWRTU1RhYmxlc0NudCsrOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBpbnQgZmluYWxTZWxlY3RlZFNTVGFibGVzID0gc2VsZWN0ZWRTU1RhYmxlc0NudDsKKwogICAgICAgICAgICAgLy8gaXRlcmF0b3JzIGNhbiBiZSBlbXB0eSBmb3Igb2ZmbGluZSB0b29scwogICAgICAgICAgICAgaWYgKGlucHV0Q29sbGVjdG9yLmlzRW1wdHkoKSkKICAgICAgICAgICAgICAgICByZXR1cm4gRW1wdHlJdGVyYXRvcnMudW5maWx0ZXJlZFBhcnRpdGlvbihtZXRhZGF0YSgpKTsKIAotICAgICAgICAgICAgcmV0dXJuIGNoZWNrQ2FjaGVGaWx0ZXIoVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9ycy5tZXJnZUxhemlseShpbnB1dENvbGxlY3Rvci5maW5hbGl6ZUl0ZXJhdG9ycyhjZnMsIG5vd0luU2VjKCksIGNvbnRyb2xsZXIub2xkZXN0VW5yZXBhaXJlZFRvbWJzdG9uZSgpKSksIGNmcyk7CisgICAgICAgICAgICBMaXN0PFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcj4gZmluYWxpemVkSXRlcmF0b3JzID0gaW5wdXRDb2xsZWN0b3IuZmluYWxpemVJdGVyYXRvcnMoY2ZzLCBub3dJblNlYygpLCBjb250cm9sbGVyLm9sZGVzdFVucmVwYWlyZWRUb21ic3RvbmUoKSk7CisgICAgICAgICAgICBVbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3IgbWVyZ2VkID0gVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9ycy5tZXJnZUxhemlseShmaW5hbGl6ZWRJdGVyYXRvcnMpOworICAgICAgICAgICAgcmV0dXJuIGNoZWNrQ2FjaGVGaWx0ZXIoVHJhbnNmb3JtYXRpb24uYXBwbHkobWVyZ2VkLCBuZXcgVHJhbnNmb3JtYXRpb248VW5maWx0ZXJlZFJvd0l0ZXJhdG9yPigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25DbG9zZSgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdXBlci5vbkNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGNmcy5tZXRyaWMudXBkYXRlU1NUYWJsZUl0ZXJhdGVkSW5SYW5nZVJlYWQoZmluYWxTZWxlY3RlZFNTVGFibGVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSwgY2ZzKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB8IEVycm9yIGUpCiAgICAgICAgIHsKQEAgLTM1OCw2ICszODcsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGludGVyc2VjdHMoU1NUYWJsZVJlYWRlciBzc3RhYmxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RlZFNsaWNlcy5pbnRlcnNlY3RzKHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFNTVGFibGVSZWFkc0xpc3RlbmVyfSB0byB1cGRhdGUgdGhlIFNTVGFibGVzIHJlYWQgY291bnRzLgogICAgICAqIEByZXR1cm4gYSBuZXcge0Bjb2RlIFNTVGFibGVSZWFkc0xpc3RlbmVyfSB0byB1cGRhdGUgdGhlIFNTVGFibGVzIHJlYWQgY291bnRzLgpAQCAtNTQ1LDQgKzU4MCw0IEBACiAgICAgICAgICAgICByZXR1cm4gZXhlY3V0aW9uQ29udHJvbGxlcigpOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1JlYWRDb21tYW5kLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9SZWFkQ29tbWFuZC5qYXZhCmluZGV4IDM1OGQ0MDguLjljZmNiM2EgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1JlYWRDb21tYW5kLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUmVhZENvbW1hbmQuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IGlvLm5ldHR5LnV0aWwuY29uY3VycmVudC5GYXN0VGhyZWFkTG9jYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5RdWVyeUNhbmNlbGxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnZUZsYWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlBhcmFtVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYjsKQEAgLTg0LDcgKzg1LDcgQEAKICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFJlYWRDb21tYW5kIGV4dGVuZHMgQWJzdHJhY3RSZWFkUXVlcnkKIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVEVTVF9JVEVSQVRJT05fREVMQVlfTUlMTElTID0gSW50ZWdlci5wYXJzZUludChTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS50ZXN0LnJlYWRfaXRlcmF0aW9uX2RlbGF5X21zIiwgIjAiKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRFU1RfSVRFUkFUSU9OX0RFTEFZX01JTExJUyA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1JFQURfSVRFUkFUSU9OX0RFTEFZX01TLmdldEludCgpOwogCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUmVhZENvbW1hbmQuY2xhc3MpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSVZlcnNpb25lZFNlcmlhbGl6ZXI8UmVhZENvbW1hbmQ+IHNlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplcigpOwpAQCAtNDIyLDcgKzQyMyw4IEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpdGVyYXRvciA9IHdpdGhRdWVyeVNpemVUcmFja2luZyhpdGVyYXRvcik7Ci0gICAgICAgICAgICAgICAgaXRlcmF0b3IgPSB3aXRoU3RhdGVUcmFja2luZyhpdGVyYXRvcik7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IgPSBtYXliZVNsb3dEb3duRm9yVGVzdGluZyhpdGVyYXRvcik7CisgICAgICAgICAgICAgICAgaXRlcmF0b3IgPSB3aXRoUXVlcnlDYW5jZWxsYXRpb24oaXRlcmF0b3IpOwogICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gUlRCb3VuZFZhbGlkYXRvci52YWxpZGF0ZSh3aXRob3V0UHVyZ2VhYmxlVG9tYnN0b25lcyhpdGVyYXRvciwgY2ZzLCBleGVjdXRpb25Db250cm9sbGVyKSwgU3RhZ2UuUFVSR0VELCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgaXRlcmF0b3IgPSB3aXRoTWV0cmljc1JlY29yZGluZyhpdGVyYXRvciwgY2ZzLm1ldHJpYywgc3RhcnRUaW1lTmFub3MpOwogCkBAIC00OTksNyArNTAxLDkgQEAKICAgICAgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBlbmZvcmNlU3RyaWN0TGl2ZW5lc3MgPSBtZXRhZGF0YSgpLmVuZm9yY2VTdHJpY3RMaXZlbmVzcygpOwogCiAgICAgICAgICAgICBwcml2YXRlIGludCBsaXZlUm93cyA9IDA7CisgICAgICAgICAgICBwcml2YXRlIGludCBsYXN0UmVwb3J0ZWRMaXZlUm93cyA9IDA7CiAgICAgICAgICAgICBwcml2YXRlIGludCB0b21ic3RvbmVzID0gMDsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IGxhc3RSZXBvcnRlZFRvbWJzdG9uZXMgPSAwOwogCiAgICAgICAgICAgICBwcml2YXRlIERlY29yYXRlZEtleSBjdXJyZW50S2V5OwogCkBAIC01NjcsNiArNTcxLDIyIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25QYXJ0aXRpb25DbG9zZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGxyID0gbGl2ZVJvd3MgLSBsYXN0UmVwb3J0ZWRMaXZlUm93czsKKyAgICAgICAgICAgICAgICBpbnQgdHMgPSB0b21ic3RvbmVzIC0gbGFzdFJlcG9ydGVkVG9tYnN0b25lczsKKworICAgICAgICAgICAgICAgIGlmIChsciA+IDApCisgICAgICAgICAgICAgICAgICAgIG1ldHJpYy50b3BSZWFkUGFydGl0aW9uUm93Q291bnQuYWRkU2FtcGxlKGN1cnJlbnRLZXkuZ2V0S2V5KCksIGxyKTsKKworICAgICAgICAgICAgICAgIGlmICh0cyA+IDApCisgICAgICAgICAgICAgICAgICAgIG1ldHJpYy50b3BSZWFkUGFydGl0aW9uVG9tYnN0b25lQ291bnQuYWRkU2FtcGxlKGN1cnJlbnRLZXkuZ2V0S2V5KCksIHRzKTsKKworICAgICAgICAgICAgICAgIGxhc3RSZXBvcnRlZExpdmVSb3dzID0gbGl2ZVJvd3M7CisgICAgICAgICAgICAgICAgbGFzdFJlcG9ydGVkVG9tYnN0b25lcyA9IHRvbWJzdG9uZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbG9zZSgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmVjb3JkTGF0ZW5jeShtZXRyaWMsIG5hbm9UaW1lKCkgLSBzdGFydFRpbWVOYW5vcyk7CkBAIC02MDEsNTggKzYyMSw2IEBACiAgICAgICAgIHJldHVybiBUcmFuc2Zvcm1hdGlvbi5hcHBseShpdGVyLCBuZXcgTWV0cmljUmVjb3JkaW5nKCkpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBjbGFzcyBDaGVja0ZvckFib3J0IGV4dGVuZHMgU3RvcHBpbmdUcmFuc2Zvcm1hdGlvbjxVbmZpbHRlcmVkUm93SXRlcmF0b3I+Ci0gICAgewotICAgICAgICBsb25nIGxhc3RDaGVja2VkID0gMDsKLQotICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGFwcGx5VG9QYXJ0aXRpb24oVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1heWJlQWJvcnQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXJ0aXRpb24uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWF0aW9uLmFwcGx5KHBhcnRpdGlvbiwgdGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgUm93IGFwcGx5VG9Sb3coUm93IHJvdykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFRFU1RfSVRFUkFUSU9OX0RFTEFZX01JTExJUyA+IDApCi0gICAgICAgICAgICAgICAgbWF5YmVEZWxheUZvclRlc3RpbmcoKTsKLQotICAgICAgICAgICAgcmV0dXJuIG1heWJlQWJvcnQoKSA/IG51bGwgOiByb3c7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbWF5YmVBYm9ydCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVE9ETzogdGhpcyBpcyBub3QgYSBncmVhdCB3YXkgdG8gYWJvcnQgZWFybHk7IHdoeSBub3QgZXhwcmVzc2x5IGxpbWl0IGNoZWNrcyB0byAxMG1zIGludGVydmFscz8KLSAgICAgICAgICAgICAqIFRoZSB2YWx1ZSByZXR1cm5lZCBieSBhcHByb3hUaW1lLm5vdygpIGlzIHVwZGF0ZWQgb25seSBldmVyeQotICAgICAgICAgICAgICoge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1vbm90b25pY0Nsb2NrLlNhbXBsZWRDbG9jay5DSEVDS19JTlRFUlZBTF9NU30sIGJ5IGRlZmF1bHQgMiBtaWxsaXMuIFNpbmNlIE1vbml0b3JhYmxlSW1wbAotICAgICAgICAgICAgICogcmVsaWVzIG9uIGFwcHJveFRpbWUsIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdW5sZXNzIHRoZSBhcHByb3hpbWF0ZSB0aW1lIGhhcyBlbGFwc2VkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAobGFzdENoZWNrZWQgPT0gYXBwcm94VGltZS5ub3coKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGxhc3RDaGVja2VkID0gYXBwcm94VGltZS5ub3coKTsKLQotICAgICAgICAgICAgaWYgKGlzQWJvcnRlZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0b3AoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1heWJlRGVsYXlGb3JUZXN0aW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFtZXRhZGF0YSgpLmtleXNwYWNlLnN0YXJ0c1dpdGgoInN5c3RlbSIpKQotICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLnNsZWVwUXVpZXRseShURVNUX0lURVJBVElPTl9ERUxBWV9NSUxMSVMpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFRyYWNrU2l6ZShEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgd2FyblRocmVzaG9sZEJ5dGVzLCBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgYWJvcnRUaHJlc2hvbGRCeXRlcykKICAgICB7CiAgICAgICAgIHJldHVybiB0cmFja1dhcm5pbmdzCkBAIC03MzcsOSArNzA1LDc0IEBACiAgICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yIHdpdGhTdGF0ZVRyYWNraW5nKFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvciBpdGVyKQorICAgIHByaXZhdGUgY2xhc3MgUXVlcnlDYW5jZWxsYXRpb25DaGVja2VyIGV4dGVuZHMgU3RvcHBpbmdUcmFuc2Zvcm1hdGlvbjxVbmZpbHRlcmVkUm93SXRlcmF0b3I+CiAgICAgewotICAgICAgICByZXR1cm4gVHJhbnNmb3JtYXRpb24uYXBwbHkoaXRlciwgbmV3IENoZWNrRm9yQWJvcnQoKSk7CisgICAgICAgIGxvbmcgbGFzdENoZWNrZWRBdCA9IDA7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgYXBwbHlUb1BhcnRpdGlvbihVbmZpbHRlcmVkUm93SXRlcmF0b3IgcGFydGl0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBtYXliZUNhbmNlbCgpOworICAgICAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWF0aW9uLmFwcGx5KHBhcnRpdGlvbiwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFJvdyBhcHBseVRvUm93KFJvdyByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heWJlQ2FuY2VsKCk7CisgICAgICAgICAgICByZXR1cm4gcm93OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIG1heWJlQ2FuY2VsKCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSB2YWx1ZSByZXR1cm5lZCBieSBhcHByb3hUaW1lLm5vdygpIGlzIHVwZGF0ZWQgb25seSBldmVyeQorICAgICAgICAgICAgICoge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1vbm90b25pY0Nsb2NrLlNhbXBsZWRDbG9jay5DSEVDS19JTlRFUlZBTF9NU30sIGJ5IGRlZmF1bHQgMiBtaWxsaXMuCisgICAgICAgICAgICAgKiBTaW5jZSBNb25pdG9yYWJsZUltcGwgcmVsaWVzIG9uIGFwcHJveFRpbWUsIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdW5sZXNzIHRoZSBhcHByb3hpbWF0ZSB0aW1lIGhhcyBlbGFwc2VkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAobGFzdENoZWNrZWRBdCA9PSBhcHByb3hUaW1lLm5vdygpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGxhc3RDaGVja2VkQXQgPSBhcHByb3hUaW1lLm5vdygpOworCisgICAgICAgICAgICBpZiAoaXNBYm9ydGVkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RvcCgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBRdWVyeUNhbmNlbGxlZEV4Y2VwdGlvbihSZWFkQ29tbWFuZC50aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yIHdpdGhRdWVyeUNhbmNlbGxhdGlvbihVbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3IgaXRlcikKKyAgICB7CisgICAgICAgIHJldHVybiBUcmFuc2Zvcm1hdGlvbi5hcHBseShpdGVyLCBuZXcgUXVlcnlDYW5jZWxsYXRpb25DaGVja2VyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqICBBIHRyYW5zZm9ybWF0aW9uIHVzZWQgZm9yIHNpbXVsYXRpbmcgc2xvdyBxdWVyaWVzIGJ5IHRlc3RzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlbGF5SW5qZWN0b3IgZXh0ZW5kcyBUcmFuc2Zvcm1hdGlvbjxVbmZpbHRlcmVkUm93SXRlcmF0b3I+CisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBhcHBseVRvUGFydGl0aW9uKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIEZCVXRpbGl0aWVzLnNsZWVwUXVpZXRseShURVNUX0lURVJBVElPTl9ERUxBWV9NSUxMSVMpOworICAgICAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWF0aW9uLmFwcGx5KHBhcnRpdGlvbiwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFJvdyBhcHBseVRvUm93KFJvdyByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZCVXRpbGl0aWVzLnNsZWVwUXVpZXRseShURVNUX0lURVJBVElPTl9ERUxBWV9NSUxMSVMpOworICAgICAgICAgICAgcmV0dXJuIHJvdzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yIG1heWJlU2xvd0Rvd25Gb3JUZXN0aW5nKFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvciBpdGVyKQorICAgIHsKKyAgICAgICAgaWYgKFRFU1RfSVRFUkFUSU9OX0RFTEFZX01JTExJUyA+IDAgJiYgIVNjaGVtYUNvbnN0YW50cy5pc1N5c3RlbUtleXNwYWNlKG1ldGFkYXRhKCkua2V5c3BhY2UpKQorICAgICAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWF0aW9uLmFwcGx5KGl0ZXIsIG5ldyBEZWxheUluamVjdG9yKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gaXRlcjsKICAgICB9CiAKICAgICAvKioKQEAgLTc1NSw2ICs3ODgsMTkgQEAKICAgICAgICAgcmV0dXJuIG1zZzsKICAgICB9CiAKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpbnRlcnNlY3RzKFNTVGFibGVSZWFkZXIgc3N0YWJsZSk7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNSZXF1aXJlZFN0YXRpY3MoU1NUYWJsZVJlYWRlciBzc3RhYmxlKSB7CisgICAgICAgIC8vIElmIHNvbWUgc3RhdGljIGNvbHVtbnMgYXJlIHF1ZXJpZWQsIHdlIHNob3VsZCBhbHdheXMgaW5jbHVkZSB0aGUgc3N0YWJsZTogdGhlIGNsdXN0ZXJpbmcgdmFsdWVzIHN0YXRzIG9mIHRoZSBzc3RhYmxlCisgICAgICAgIC8vIGRvbid0IHRlbGwgdXMgaWYgdGhlIHNzdGFibGUgY29udGFpbnMgc3RhdGljIHZhbHVlcyBpbiBwYXJ0aWN1bGFyLgorICAgICAgICByZXR1cm4gIWNvbHVtbkZpbHRlcigpLmZldGNoZWRDb2x1bW5zKCkuc3RhdGljcy5pc0VtcHR5KCkgJiYgc3N0YWJsZS5oZWFkZXIuaGFzU3RhdGljKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMoU1NUYWJsZVJlYWRlciBzc3RhYmxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnM7CisgICAgfQorCiAgICAgcHVibGljIGFic3RyYWN0IFZlcmIgdmVyYigpOwogCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYXBwZW5kQ1FMV2hlcmVDbGF1c2UoU3RyaW5nQnVpbGRlciBzYik7CkBAIC0xMDIyLDcgKzEwNjgsNyBAQAogICAgICAgICAgICAgICAgICAgICB8IGFjY2VwdHNUcmFuc2llbnRGbGFnKGNvbW1hbmQuYWNjZXB0c1RyYW5zaWVudCgpKQogICAgICAgICAgICAgKTsKICAgICAgICAgICAgIGlmIChjb21tYW5kLmlzRGlnZXN0UXVlcnkoKSkKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoY29tbWFuZC5kaWdlc3RWZXJzaW9uKCkpOworICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGNvbW1hbmQuZGlnZXN0VmVyc2lvbigpKTsKICAgICAgICAgICAgIGNvbW1hbmQubWV0YWRhdGEoKS5pZC5zZXJpYWxpemUob3V0KTsKICAgICAgICAgICAgIG91dC53cml0ZUludChjb21tYW5kLm5vd0luU2VjKCkpOwogICAgICAgICAgICAgQ29sdW1uRmlsdGVyLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGNvbW1hbmQuY29sdW1uRmlsdGVyKCksIG91dCwgdmVyc2lvbik7CkBAIC0xMDQ5LDcgKzEwOTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInVwZ3JhZGluZyB0byA0LjAiKTsKIAogICAgICAgICAgICAgYm9vbGVhbiBoYXNJbmRleCA9IGhhc0luZGV4KGZsYWdzKTsKLSAgICAgICAgICAgIGludCBkaWdlc3RWZXJzaW9uID0gaXNEaWdlc3QgPyAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKSA6IDA7CisgICAgICAgICAgICBpbnQgZGlnZXN0VmVyc2lvbiA9IGlzRGlnZXN0ID8gaW4ucmVhZFVuc2lnbmVkVkludDMyKCkgOiAwOwogICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9IHNjaGVtYS5nZXRFeGlzdGluZ1RhYmxlTWV0YWRhdGEoVGFibGVJZC5kZXNlcmlhbGl6ZShpbikpOwogICAgICAgICAgICAgaW50IG5vd0luU2VjID0gaW4ucmVhZEludCgpOwogICAgICAgICAgICAgQ29sdW1uRmlsdGVyIGNvbHVtbkZpbHRlciA9IENvbHVtbkZpbHRlci5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCB2ZXJzaW9uLCBtZXRhZGF0YSk7CkBAIC0xMDkwLDQgKzExMzYsNCBAQAogICAgICAgICAgICAgICAgICAgICsgY29tbWFuZC5pbmRleFNlcmlhbGl6ZWRTaXplKHZlcnNpb24pOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1JlYWRDb21tYW5kVmVyYkhhbmRsZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1JlYWRDb21tYW5kVmVyYkhhbmRsZXIuamF2YQppbmRleCA5MjI2NTY4Li5mNjkzYmJjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9SZWFkQ29tbWFuZFZlcmJIYW5kbGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUmVhZENvbW1hbmRWZXJiSGFuZGxlci5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5RdWVyeUNhbmNlbGxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlJlcGxpY2E7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LklWZXJiSGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnZTsKQEAgLTc3LDE4ICs3OCwyOSBAQAogICAgICAgICAgICAgTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLnNlbmQocmVwbHksIG1lc3NhZ2UuZnJvbSgpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgdCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFN0cmluZy5mb3JtYXQoIkNhdWdodCBhbiBlcnJvciB3aGlsZSB0cnlpbmcgdG8gcHJvY2VzcyB0aGUgY29tbWFuZDogJXMiLCBjb21tYW5kLnRvQ1FMU3RyaW5nKCkpLCB0KTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUXVlcnlDYW5jZWxsZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJRdWVyeSBjYW5jZWxsZWQgKHRpbWVvdXQpIiwgZSk7CisgICAgICAgICAgICByZXNwb25zZSA9IG51bGw7CisgICAgICAgICAgICBhc3NlcnQgIWNvbW1hbmQuaXNDb21wbGV0ZWQoKSA6ICJSZWFkIG1hcmtlZCBhcyBjb21wbGV0ZWQgZGVzcGl0ZSBiZWluZyBhYm9ydGVkIGJ5IHRpbWVvdXQgdG8gdGFibGUgIiArIGNvbW1hbmQubWV0YWRhdGEoKTsKKyAgICAgICAgfQogCi0gICAgICAgIGlmICghY29tbWFuZC5jb21wbGV0ZSgpKQorICAgICAgICBpZiAoY29tbWFuZC5jb21wbGV0ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBUcmFjaW5nLnRyYWNlKCJFbnF1ZXVpbmcgcmVzcG9uc2UgdG8ge30iLCBtZXNzYWdlLmZyb20oKSk7CisgICAgICAgICAgICBNZXNzYWdlPFJlYWRSZXNwb25zZT4gcmVwbHkgPSBtZXNzYWdlLnJlc3BvbnNlV2l0aChyZXNwb25zZSk7CisgICAgICAgICAgICByZXBseSA9IE1lc3NhZ2VQYXJhbXMuYWRkVG9NZXNzYWdlKHJlcGx5KTsKKyAgICAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5zZW5kKHJlcGx5LCBtZXNzYWdlLmZyb20oKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICBUcmFjaW5nLnRyYWNlKCJEaXNjYXJkaW5nIHBhcnRpYWwgcmVzcG9uc2UgdG8ge30gKHRpbWVkIG91dCkiLCBtZXNzYWdlLmZyb20oKSk7CiAgICAgICAgICAgICBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCkubWV0cmljcy5yZWNvcmREcm9wcGVkTWVzc2FnZShtZXNzYWdlLCBtZXNzYWdlLmVsYXBzZWRTaW5jZUNyZWF0ZWQoTkFOT1NFQ09ORFMpLCBOQU5PU0VDT05EUyk7Ci0gICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLQotICAgICAgICBUcmFjaW5nLnRyYWNlKCJFbnF1ZXVpbmcgcmVzcG9uc2UgdG8ge30iLCBtZXNzYWdlLmZyb20oKSk7Ci0gICAgICAgIE1lc3NhZ2U8UmVhZFJlc3BvbnNlPiByZXBseSA9IG1lc3NhZ2UucmVzcG9uc2VXaXRoKHJlc3BvbnNlKTsKLSAgICAgICAgcmVwbHkgPSBNZXNzYWdlUGFyYW1zLmFkZFRvTWVzc2FnZShyZXBseSk7Ci0gICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5zZW5kKHJlcGx5LCBtZXNzYWdlLmZyb20oKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVHJhbnNpZW50U3RhdHVzKE1lc3NhZ2U8UmVhZENvbW1hbmQ+IG1lc3NhZ2UpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Sb3dJbmRleEVudHJ5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Sb3dJbmRleEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZjUzYTkuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUm93SW5kZXhFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuSGlzdG9ncmFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLklNZWFzdXJhYmxlTWVtb3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuUm93SW5kZXhFbnRyeVJlYWRTaXplVG9vTGFyZ2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uSVNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleEluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlRyYWNrZWREYXRhSW5wdXRQbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuRGVmYXVsdE5hbWVGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuTWV0cmljTmFtZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlBhcmFtVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nOwotaW1wb3J0IG9yZy5naXRodWIuamFtbS5Vbm1ldGVyZWQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DYXNzYW5kcmFNZXRyaWNzUmVnaXN0cnkuTWV0cmljczsKLQotLyoqCi0gKiBCaW5hcnkgZm9ybWF0IG9mIHtAY29kZSBSb3dJbmRleEVudHJ5fSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0gKiB7QGNvZGUKLSAqIChsb25nKSBwb3NpdGlvbiAoNjQgYml0IGxvbmcsIHZpbnQgZW5jb2RlZCkKLSAqICAoaW50KSBzZXJpYWxpemVkIHNpemUgb2YgZGF0YSB0aGF0IGZvbGxvd3MgKDMyIGJpdCBpbnQsIHZpbnQgZW5jb2RlZCkKLSAqIC0tIGZvbGxvd2luZyBmb3IgaW5kZXhlZCBlbnRyaWVzIG9ubHkgKHNvIHNlcmlhbGl6ZWQgc2l6ZSA+IDApCi0gKiAgKGludCkgRGVsZXRpb25UaW1lLmxvY2FsRGVsZXRpb25UaW1lCi0gKiAobG9uZykgRGVsZXRpb25UaW1lLm1hcmtlZEZvckRlbGV0aW9uQXQKLSAqICAoaW50KSBudW1iZXIgb2YgSW5kZXhJbmZvIG9iamVjdHMgKDMyIGJpdCBpbnQsIHZpbnQgZW5jb2RlZCkKLSAqICAgICgqKSBzZXJpYWxpemVkIEluZGV4SW5mbyBvYmplY3RzLCBzZWUgYmVsb3cKLSAqICAgICgqKSBvZmZzZXRzIG9mIHNlcmlhbGl6ZWQgSW5kZXhJbmZvIG9iamVjdHMsIHNpbmNlIHZlcnNpb24gIm1hIiAoMy4wKQotICogICAgICAgIEVhY2ggSW5kZXhJbmZvIG9iamVjdCdzIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgZmlyc3QgSW5kZXhJbmZvIG9iamVjdC4KLSAqIH0KLSAqIDxwPgotICogU2VlIHtAbGluayBJbmRleEluZm99IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzZXJpYWxpemVkIGZvcm1hdC4KLSAqIDwvcD4KLSAqCi0gKiA8cD4KLSAqIEZvciBlYWNoIHBhcnRpdGlvbiwgdGhlIGxheW91dCBvZiB0aGUgaW5kZXggZmlsZSBsb29rcyBsaWtlIHRoaXM6Ci0gKiA8L3A+Ci0gKiA8b2w+Ci0gKiAgICAgPGxpPnBhcnRpdGlvbiBrZXkgLSBwcmVmaXhlZCB3aXRoIHtAY29kZSBzaG9ydH0gbGVuZ3RoPC9saT4KLSAqICAgICA8bGk+c2VyaWFsaXplZCB7QGNvZGUgUm93SW5kZXhFbnRyeX0gb2JqZWN0czwvbGk+Ci0gKiA8L29sPgotICoKLSAqIDxwPgotICogICAgIEdlbmVyYWxseSwgd2UgZGlzdGluZ3Vpc2ggYmV0d2VlbiBpbmRleCBlbnRyaWVzIHRoYXQgaGF2ZSA8aT5pbmRleAotICogICAgIHNhbXBsZXM8L2k+IChsaXN0IG9mIHtAbGluayBJbmRleEluZm99IG9iamVjdHMpIGFuZCB0aG9zZSB3aG8gZG9uJ3QuCi0gKiAgICAgRm9yIGVhY2ggPGk+cG9ydGlvbjwvaT4gb2YgZGF0YSBmb3IgYSBzaW5nbGUgcGFydGl0aW9uIGluIHRoZSBkYXRhIGZpbGUsCi0gKiAgICAgYW4gaW5kZXggc2FtcGxlIGlzIGNyZWF0ZWQuIFRoZSBzaXplIG9mIHRoYXQgPGk+cG9ydGlvbjwvaT4gaXMgZGVmaW5lZAotICogICAgIGJ5IHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnI2NvbHVtbl9pbmRleF9zaXplfS4KLSAqIDwvcD4KLSAqIDxwPgotICogICAgIEluZGV4IGVudHJpZXMgd2l0aCBsZXNzIHRoYW4gMiBpbmRleCBzYW1wbGVzLCB3aWxsIGp1c3Qgc3RvcmUgdGhlCi0gKiAgICAgcG9zaXRpb24gaW4gdGhlIGRhdGEgZmlsZS4KLSAqIDwvcD4KLSAqIDxwPgotICogICAgIE5vdGU6IGxlZ2FjeSBzc3RhYmxlcyBmb3IgaW5kZXggZW50cmllcyBhcmUgdGhvc2Ugc3N0YWJsZSBmb3JtYXRzIHRoYXQKLSAqICAgICBkbyA8aT5ub3Q8L2k+IGhhdmUgYW4gb2Zmc2V0cyB0YWJsZSB0byBpbmRleCBzYW1wbGVzICh7QGxpbmsgSW5kZXhJbmZvfQotICogICAgIG9iamVjdHMpLiBUaGVzZSBhcmUgdGhvc2Ugc3N0YWJsZXMgY3JlYXRlZCBvbiBDYXNzYW5kcmEgdmVyc2lvbnMKLSAqICAgICBlYXJsaWVyIHRoYW4gMy4wLgotICogPC9wPgotICogPHA+Ci0gKiAgICAgRm9yIGluZGV4IGVudHJpZXMgd2l0aCBpbmRleCBzYW1wbGVzIHdlIHN0b3JlIHRoZSBpbmRleCBzYW1wbGVzCi0gKiAgICAgKHtAbGluayBJbmRleEluZm99IG9iamVjdHMpLiBUaGUgYmlnZ2VyIHRoZSBwYXJ0aXRpb24sIHRoZSBtb3JlCi0gKiAgICAgaW5kZXggc2FtcGxlcyBhcmUgY3JlYXRlZC4gU2luY2UgYSBodWdlIGFtb3VudCBvZiBpbmRleCBzYW1wbGVzCi0gKiAgICAgd2lsbCAicG9sbHV0ZSIgdGhlIGhlYXAgYW5kIGNhdXNlIGh1Z2UgR0MgcHJlc3N1cmUsIENhc3NhbmRyYSAzLjYKLSAqICAgICAoQ0FTU0FORFJBLTExMjA2KSBkaXN0aW5ndWlzaGVzIGJldHdlZW4gaW5kZXggZW50cmllcyB3aXRoIGFuCi0gKiAgICAgImFjY2VwdGFibGUiIGFtb3VudCBvZiBpbmRleCBzYW1wbGVzIHBlciBwYXJ0aXRpb24gYW5kIHRob3NlCi0gKiAgICAgd2l0aCBhbiAiZW5vcm1vdXMiIGFtb3VudCBvZiBpbmRleCBzYW1wbGVzLiBUaGUgYmFycmllcgotICogICAgIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCi0gKiAgICAge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcjY29sdW1uX2luZGV4X2NhY2hlX3NpemV9LgotICogICAgIEluZGV4IGVudHJpZXMgd2l0aCBhIHRvdGFsIHNlcmlhbGl6ZWQgc2l6ZSBvZiBpbmRleCBzYW1wbGVzIHVwIHRvCi0gKiAgICAge0Bjb2RlIGNvbHVtbl9pbmRleF9jYWNoZV9zaXplfSB3aWxsIGJlIGhlbGQgaW4gYW4gYXJyYXkuCi0gKiAgICAgSW5kZXggZW50cmllcyBleGNlZWRpbmcgdGhhdCB2YWx1ZSB3aWxsIGFsd2F5cyBiZSBhY2Nlc3NlZCBmcm9tCi0gKiAgICAgZGlzay4KLSAqIDwvcD4KLSAqIDxwPgotICogICAgIFRoaXMgcmVzdWx0cyBpbiB0aGVzZSBjbGFzc2VzOgotICogPC9wPgotICogPHVsPgotICogICAgIDxsaT57QGxpbmsgUm93SW5kZXhFbnRyeX0ganVzdCBzdG9yZXMgdGhlIG9mZnNldCBpbiB0aGUgZGF0YSBmaWxlLjwvbGk+Ci0gKiAgICAgPGxpPntAbGluayBJbmRleGVkRW50cnl9IGlzIGZvciBpbmRleCBlbnRyaWVzIHdpdGggaW5kZXggc2FtcGxlcwotICogICAgIGFuZCB1c2VkIGZvciBib3RoIGN1cnJlbnQgYW5kIGxlZ2FjeSBzc3RhYmxlcywgd2hpY2ggZG8gbm90IGV4Y2VlZAotICogICAgIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnI2NvbHVtbl9pbmRleF9jYWNoZV9zaXplfS48L2xpPgotICogICAgIDxsaT57QGxpbmsgU2hhbGxvd0luZGV4ZWRFbnRyeX0gaXMgZm9yIGluZGV4IGVudHJpZXMgd2l0aCBpbmRleCBzYW1wbGVzCi0gKiAgICAgdGhhdCBleGNlZWQge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcjY29sdW1uX2luZGV4X2NhY2hlX3NpemV9Ci0gKiAgICAgZm9yIHNzdGFibGVzIHdpdGggYW4gb2Zmc2V0IHRhYmxlIHRvIHRoZSBpbmRleCBzYW1wbGVzLjwvbGk+Ci0gKiA8L3VsPgotICogPHA+Ci0gKiAgICAgU2luY2UgYWNjZXNzIHRvIGluZGV4IHNhbXBsZXMgb24gZGlzayAob2J2aW91c2x5KSByZXF1aXJlcyBzb21lIGZpbGUKLSAqICAgICByZWFkZXIsIHRoYXQgZnVuY3Rpb25hbGl0eSBpcyBlbmNhcHN1bGF0ZWQgaW4gaW1wbGVtZW50YXRpb25zIG9mCi0gKiAgICAge0BsaW5rIEluZGV4SW5mb1JldHJpZXZlcn0uIFRoZXJlIGlzIGFuIGltcGxlbWVudGF0aW9uIHRvIGFjY2VzcwotICogICAgIGluZGV4IHNhbXBsZXMgb2YgbGVnYWN5IHNzdGFibGVzICh3aXRob3V0IHRoZSBvZmZzZXRzIHRhYmxlKSwKLSAqICAgICBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhY2Nlc3Mgc3N0YWJsZXMgd2l0aCBhbiBvZmZzZXRzIHRhYmxlLgotICogPC9wPgotICogPHA+Ci0gKiAgICAgVW50aWwgbm93IChDYXNzYW5kcmEgMy54KSwgd2Ugc3RpbGwgc3VwcG9ydCByZWFkaW5nIGZyb20gPGk+bGVnYWN5PC9pPiBzc3RhYmxlcyAtCi0gKiAgICAgaS5lLiBzc3RhYmxlcyBjcmVhdGVkIGJ5IENhc3NhbmRyYSAmbHQ7IDMuMCAoc2VlIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0fS4KLSAqIDwvcD4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBSb3dJbmRleEVudHJ5PFQ+IGltcGxlbWVudHMgSU1lYXN1cmFibGVNZW1vcnkKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVNUFRZX1NJWkUgPSBPYmplY3RTaXplcy5tZWFzdXJlKG5ldyBSb3dJbmRleEVudHJ5KDApKTsKLQotICAgIC8vIGNvbnN0YW50cyBmb3IgdHlwZSBvZiByb3ctaW5kZXgtZW50cnkgYXMgc2VyaWFsaXplZCBmb3Igc2F2ZWQtY2FjaGUKLSAgICBzdGF0aWMgZmluYWwgaW50IENBQ0hFX05PVF9JTkRFWEVEID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IENBQ0hFX0lOREVYRUQgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0FDSEVfSU5ERVhFRF9TSEFMTE9XID0gMjsKLQotICAgIHN0YXRpYyBmaW5hbCBIaXN0b2dyYW0gaW5kZXhFbnRyeVNpemVIaXN0b2dyYW07Ci0gICAgc3RhdGljIGZpbmFsIEhpc3RvZ3JhbSBpbmRleEluZm9Db3VudEhpc3RvZ3JhbTsKLSAgICBzdGF0aWMgZmluYWwgSGlzdG9ncmFtIGluZGV4SW5mb0dldHNIaXN0b2dyYW07Ci0gICAgc3RhdGljIGZpbmFsIEhpc3RvZ3JhbSBpbmRleEluZm9SZWFkc0hpc3RvZ3JhbTsKLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIE1ldHJpY05hbWVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRGVmYXVsdE5hbWVGYWN0b3J5KCJJbmRleCIsICJSb3dJbmRleEVudHJ5Iik7Ci0gICAgICAgIGluZGV4RW50cnlTaXplSGlzdG9ncmFtID0gTWV0cmljcy5oaXN0b2dyYW0oZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKCJJbmRleGVkRW50cnlTaXplIiksIGZhbHNlKTsKLSAgICAgICAgaW5kZXhJbmZvQ291bnRIaXN0b2dyYW0gPSBNZXRyaWNzLmhpc3RvZ3JhbShmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoIkluZGV4SW5mb0NvdW50IiksIGZhbHNlKTsKLSAgICAgICAgaW5kZXhJbmZvR2V0c0hpc3RvZ3JhbSA9IE1ldHJpY3MuaGlzdG9ncmFtKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZSgiSW5kZXhJbmZvR2V0cyIpLCBmYWxzZSk7Ci0gICAgICAgIGluZGV4SW5mb1JlYWRzSGlzdG9ncmFtID0gTWV0cmljcy5oaXN0b2dyYW0oZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKCJJbmRleEluZm9SZWFkcyIpLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIGxvbmcgcG9zaXRpb247Ci0KLSAgICBwdWJsaWMgUm93SW5kZXhFbnRyeShsb25nIHBvc2l0aW9uKQotICAgIHsKLSAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGluZGV4IGVudHJ5IGNvbnRhaW5zIHRoZSByb3ctbGV2ZWwgdG9tYnN0b25lIGFuZCBjb2x1bW4gc3VtbWFyeS4gIE90aGVyd2lzZSwKLSAgICAgKiBjYWxsZXIgc2hvdWxkIGZldGNoIHRoZXNlIGZyb20gdGhlIHJvdyBoZWFkZXIuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbmRleGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb2x1bW5zSW5kZXhDb3VudCgpID4gMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpbmRleE9uSGVhcCgpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUoKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjb2x1bW5zSW5kZXhDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBFTVBUWV9TSVpFOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBkYXRhRmlsZVBvc2l0aW9uICBwb3NpdGlvbiBvZiB0aGUgcGFydGl0aW9uIGluIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQuVHlwZSNEQVRBfSBmaWxlCi0gICAgICogQHBhcmFtIGluZGV4RmlsZVBvc2l0aW9uIHBvc2l0aW9uIGluIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQuVHlwZSNQUklNQVJZX0lOREVYfSBvZiB0aGUge0BsaW5rIFJvd0luZGV4RW50cnl9Ci0gICAgICogQHBhcmFtIGRlbGV0aW9uVGltZSAgICAgIGRlbGV0aW9uIHRpbWUgb2Yge0BsaW5rIFJvd0luZGV4RW50cnl9Ci0gICAgICogQHBhcmFtIGhlYWRlckxlbmd0aCAgICAgIGRlbGV0aW9uIHRpbWUgb2Yge0BsaW5rIFJvd0luZGV4RW50cnl9Ci0gICAgICogQHBhcmFtIGNvbHVtbkluZGV4Q291bnQgIG51bWJlciBvZiB7QGxpbmsgSW5kZXhJbmZvfSBlbnRyaWVzIGluIHRoZSB7QGxpbmsgUm93SW5kZXhFbnRyeX0KLSAgICAgKiBAcGFyYW0gaW5kZXhlZFBhcnRTaXplICAgc2VyaWFsaXplZCBzaXplIG9mIGFsbCBzZXJpYWxpemVkIHtAbGluayBJbmRleEluZm99IG9iamVjdHMgYW5kIHRoZWlyIG9mZnNldHMKLSAgICAgKiBAcGFyYW0gaW5kZXhTYW1wbGVzICAgICAgbGlzdCB3aXRoIEluZGV4SW5mbyBvZmZzZXRzIChpZiB0b3RhbCBzZXJpYWxpemVkIHNpemUgaXMgbGVzcyB0aGFuIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnI2NvbHVtbl9pbmRleF9jYWNoZV9zaXplfQotICAgICAqIEBwYXJhbSBvZmZzZXRzICAgICAgICAgICBvZmZzZXRzIG9mIEluZGV4SW5mbyBvZmZzZXRzCi0gICAgICogQHBhcmFtIGlkeEluZm9TZXJpYWxpemVyIHRoZSB7QGxpbmsgSW5kZXhJbmZvfSBzZXJpYWxpemVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBSb3dJbmRleEVudHJ5PEluZGV4SW5mbz4gY3JlYXRlKGxvbmcgZGF0YUZpbGVQb3NpdGlvbiwgbG9uZyBpbmRleEZpbGVQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSwgbG9uZyBoZWFkZXJMZW5ndGgsIGludCBjb2x1bW5JbmRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhlZFBhcnRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEluZGV4SW5mbz4gaW5kZXhTYW1wbGVzLCBpbnRbXSBvZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeEluZm9TZXJpYWxpemVyKQotICAgIHsKLSAgICAgICAgLy8gSWYgdGhlICJwYXJ0aXRpb24gYnVpbGRpbmcgY29kZSIgaW4gQmlnVGFibGVXcml0ZXIuYXBwZW5kKCkgdmlhIENvbHVtbkluZGV4IHJldHVybnMgYSBsaXN0Ci0gICAgICAgIC8vIG9mIEluZGV4SW5mbyBvYmplY3RzLCB3aGljaCBpcyB0aGUgY2FzZSBpZiB0aGUgc2VyaWFsaXplZCBzaXplIGlzIGxlc3MgdGhhbgotICAgICAgICAvLyBDb25maWcuY29sdW1uX2luZGV4X2NhY2hlX3NpemUsIEFORCB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgSW5kZXhJbmZvIG9iamVjdCwgd2UKLSAgICAgICAgLy8gY29uc3RydWN0IGFuIEluZGV4ZWRFbnRyeSBvYmplY3QuIChub3RlOiBpbmRleFNhbXBsZXMuc2l6ZSgpIGFuZCBjb2x1bW5JbmRleENvdW50IGhhdmUgdGhlIHNhbWUgbWVhbmluZykKLSAgICAgICAgaWYgKGluZGV4U2FtcGxlcyAhPSBudWxsICYmIGluZGV4U2FtcGxlcy5zaXplKCkgPiAxKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmRleGVkRW50cnkoZGF0YUZpbGVQb3NpdGlvbiwgZGVsZXRpb25UaW1lLCBoZWFkZXJMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFNhbXBsZXMudG9BcnJheShuZXcgSW5kZXhJbmZvW2luZGV4U2FtcGxlcy5zaXplKCldKSwgb2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZWRQYXJ0U2l6ZSwgaWR4SW5mb1NlcmlhbGl6ZXIpOwotICAgICAgICAvLyBIZXJlIHdlIGhhdmUgdG8gZGVjaWRlIHdoZXRoZXIgd2UgaGF2ZSBzZXJpYWxpemVkIEluZGV4SW5mbyBvYmplY3RzIHRoYXQgZXhjZWVkcwotICAgICAgICAvLyBDb25maWcuY29sdW1uX2luZGV4X2NhY2hlX3NpemUgKG5vdCBleGNlZWRpbmcgY2FzZSBjb3ZlcmVkIGFib3ZlKS4KLSAgICAgICAgLy8gU3VjaCBhICJiaWciIGluZGV4ZWQtZW50cnkgaXMgcmVwcmVzZW50ZWQgYXMgYSBzaGFsbG93IG9uZS4KLSAgICAgICAgaWYgKGNvbHVtbkluZGV4Q291bnQgPiAxKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTaGFsbG93SW5kZXhlZEVudHJ5KGRhdGFGaWxlUG9zaXRpb24sIGluZGV4RmlsZVBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0aW9uVGltZSwgaGVhZGVyTGVuZ3RoLCBjb2x1bW5JbmRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZWRQYXJ0U2l6ZSwgaWR4SW5mb1NlcmlhbGl6ZXIpOwotICAgICAgICAvLyBMYXN0IGNhc2UgaXMgdGhhdCB0aGVyZSBhcmUgbm8gaW5kZXggc2FtcGxlcy4KLSAgICAgICAgcmV0dXJuIG5ldyBSb3dJbmRleEVudHJ5PD4oZGF0YUZpbGVQb3NpdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIEluZGV4SW5mb1JldHJpZXZlciBvcGVuV2l0aEluZGV4KEZpbGVIYW5kbGUgaW5kZXhGaWxlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIGludGVyZmFjZSBJbmRleFNlcmlhbGl6ZXI8VD4KLSAgICB7Ci0gICAgICAgIHZvaWQgc2VyaWFsaXplKFJvd0luZGV4RW50cnk8VD4gcmllLCBEYXRhT3V0cHV0UGx1cyBvdXQsIEJ5dGVCdWZmZXIgaW5kZXhJbmZvKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAgICAgUm93SW5kZXhFbnRyeTxUPiBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBsb25nIGluZGV4RmlsZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgICAgIGRlZmF1bHQgUm93SW5kZXhFbnRyeTxUPiBkZXNlcmlhbGl6ZShSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplKHJlYWRlciwgcmVhZGVyLmdldEZpbGVQb2ludGVyKCkpOwotCi0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0IFJvd0luZGV4RW50cnk8VD4gZGVzZXJpYWxpemUoRmlsZURhdGFJbnB1dCBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZShpbnB1dCwgaW5wdXQuZ2V0RmlsZVBvaW50ZXIoKSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2VyaWFsaXplRm9yQ2FjaGUoUm93SW5kZXhFbnRyeTxUPiByaWUsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgICAgICBSb3dJbmRleEVudHJ5PFQ+IGRlc2VyaWFsaXplRm9yQ2FjaGUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgICAgIGxvbmcgZGVzZXJpYWxpemVQb3NpdGlvbkFuZFNraXAoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgICAgIElTZXJpYWxpemVyPFQ+IGluZGV4SW5mb1NlcmlhbGl6ZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNlcmlhbGl6ZXIgaW1wbGVtZW50cyBJbmRleFNlcmlhbGl6ZXI8SW5kZXhJbmZvPgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbmRleEluZm8uU2VyaWFsaXplciBpZHhJbmZvU2VyaWFsaXplcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uIHZlcnNpb247Ci0KLSAgICAgICAgcHVibGljIFNlcmlhbGl6ZXIoVmVyc2lvbiB2ZXJzaW9uLCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pZHhJbmZvU2VyaWFsaXplciA9IEluZGV4SW5mby5zZXJpYWxpemVyKHZlcnNpb24sIGhlYWRlcik7Ci0gICAgICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEluZGV4SW5mby5TZXJpYWxpemVyIGluZGV4SW5mb1NlcmlhbGl6ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaWR4SW5mb1NlcmlhbGl6ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoUm93SW5kZXhFbnRyeTxJbmRleEluZm8+IHJpZSwgRGF0YU91dHB1dFBsdXMgb3V0LCBCeXRlQnVmZmVyIGluZGV4SW5mbykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJpZS5zZXJpYWxpemUob3V0LCBpbmRleEluZm8pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplRm9yQ2FjaGUoUm93SW5kZXhFbnRyeTxJbmRleEluZm8+IHJpZSwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmllLnNlcmlhbGl6ZUZvckNhY2hlKG91dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUm93SW5kZXhFbnRyeTxJbmRleEluZm8+IGRlc2VyaWFsaXplRm9yQ2FjaGUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoaW4ucmVhZEJ5dGUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIENBQ0hFX05PVF9JTkRFWEVEOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJvd0luZGV4RW50cnk8Pihwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgY2FzZSBDQUNIRV9JTkRFWEVEOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4ZWRFbnRyeShwb3NpdGlvbiwgaW4sIGlkeEluZm9TZXJpYWxpemVyKTsKLSAgICAgICAgICAgICAgICBjYXNlIENBQ0hFX0lOREVYRURfU0hBTExPVzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaGFsbG93SW5kZXhlZEVudHJ5KHBvc2l0aW9uLCBpbiwgaWR4SW5mb1NlcmlhbGl6ZXIpOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNraXBGb3JDYWNoZShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaW4ucmVhZFVuc2lnbmVkVkludCgpOwotICAgICAgICAgICAgc3dpdGNoIChpbi5yZWFkQnl0ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgQ0FDSEVfTk9UX0lOREVYRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ0FDSEVfSU5ERVhFRDoKLSAgICAgICAgICAgICAgICAgICAgSW5kZXhlZEVudHJ5LnNraXBGb3JDYWNoZShpbik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ0FDSEVfSU5ERVhFRF9TSEFMTE9XOgotICAgICAgICAgICAgICAgICAgICBTaGFsbG93SW5kZXhlZEVudHJ5LnNraXBGb3JDYWNoZShpbik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBSb3dJbmRleEVudHJ5PEluZGV4SW5mbz4gZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgbG9uZyBpbmRleEZpbGVQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0KLSAgICAgICAgICAgIGludCBzaXplID0gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUm93SW5kZXhFbnRyeTw+KHBvc2l0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIGhlYWRlckxlbmd0aCA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLSAgICAgICAgICAgICAgICBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lID0gRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4pOwotICAgICAgICAgICAgICAgIGludCBjb2x1bW5zSW5kZXhDb3VudCA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLQotICAgICAgICAgICAgICAgIGNoZWNrU2l6ZShjb2x1bW5zSW5kZXhDb3VudCwgc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgaW5kZXhlZFBhcnRTaXplID0gc2l6ZSAtIHNlcmlhbGl6ZWRTaXplKGRlbGV0aW9uVGltZSwgaGVhZGVyTGVuZ3RoLCBjb2x1bW5zSW5kZXhDb3VudCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8PSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhlZEVudHJ5KHBvc2l0aW9uLCBpbiwgZGVsZXRpb25UaW1lLCBoZWFkZXJMZW5ndGgsIGNvbHVtbnNJbmRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHhJbmZvU2VyaWFsaXplciwgaW5kZXhlZFBhcnRTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW4uc2tpcEJ5dGVzKGluZGV4ZWRQYXJ0U2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTaGFsbG93SW5kZXhlZEVudHJ5KHBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhGaWxlUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwgY29sdW1uc0luZGV4Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVkUGFydFNpemUsIGlkeEluZm9TZXJpYWxpemVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgY2hlY2tTaXplKGludCBlbnRyaWVzLCBpbnQgYnl0ZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlYWRDb21tYW5kIGNvbW1hbmQgPSBSZWFkQ29tbWFuZC5nZXRDb21tYW5kKCk7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsIHx8IFNjaGVtYUNvbnN0YW50cy5pc1N5c3RlbUtleXNwYWNlKGNvbW1hbmQubWV0YWRhdGEoKS5rZXlzcGFjZSkgfHwgIURhdGFiYXNlRGVzY3JpcHRvci5nZXRSZWFkVGhyZXNob2xkc0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCB3YXJuVGhyZXNob2xkID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJvd0luZGV4UmVhZFNpemVXYXJuVGhyZXNob2xkKCk7Ci0gICAgICAgICAgICBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgZmFpbFRocmVzaG9sZCA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRSb3dJbmRleFJlYWRTaXplRmFpbFRocmVzaG9sZCgpOwotICAgICAgICAgICAgaWYgKHdhcm5UaHJlc2hvbGQgPT0gbnVsbCAmJiBmYWlsVGhyZXNob2xkID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBsb25nIGVzdGltYXRlZE1lbW9yeSA9IGVzdGltYXRlTWF0ZXJpYWxpemVkSW5kZXhTaXplKGVudHJpZXMsIGJ5dGVzKTsKLSAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IFNjaGVtYS5pbnN0YW5jZS5nZXRDb2x1bW5GYW1pbHlTdG9yZUluc3RhbmNlKGNvbW1hbmQubWV0YWRhdGEoKS5pZCk7Ci0gICAgICAgICAgICBpZiAoY2ZzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgY2ZzLm1ldHJpYy5yb3dJbmRleFNpemUudXBkYXRlKGVzdGltYXRlZE1lbW9yeSk7Ci0KLSAgICAgICAgICAgIGlmIChmYWlsVGhyZXNob2xkICE9IG51bGwgJiYgZXN0aW1hdGVkTWVtb3J5ID4gZmFpbFRocmVzaG9sZC50b0J5dGVzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIlF1ZXJ5ICVzIGF0dGVtcHRlZCB0byBhY2Nlc3MgYSBsYXJnZSBSb3dJbmRleEVudHJ5IGVzdGltYXRlZCB0byBiZSAlZCBieXRlcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4tbWVtb3J5ICh0b3RhbCBlbnRyaWVzOiAlZCwgdG90YWwgYnl0ZXM6ICVkKSBidXQgdGhlIG1heCBhbGxvd2VkIGlzICVzOyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcXVlcnkgYWJvcnRlZCAgKHNlZSByb3dfaW5kZXhfcmVhZF9zaXplX2ZhaWxfdGhyZXNob2xkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC50b0NRTFN0cmluZygpLCBlc3RpbWF0ZWRNZW1vcnksIGVudHJpZXMsIGJ5dGVzLCBmYWlsVGhyZXNob2xkKTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlUGFyYW1zLnJlbW92ZShQYXJhbVR5cGUuUk9XX0lOREVYX1JFQURfU0laRV9XQVJOKTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlUGFyYW1zLmFkZChQYXJhbVR5cGUuUk9XX0lOREVYX1JFQURfU0laRV9GQUlMLCBlc3RpbWF0ZWRNZW1vcnkpOwotCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJvd0luZGV4RW50cnlSZWFkU2l6ZVRvb0xhcmdlRXhjZXB0aW9uKG1zZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh3YXJuVGhyZXNob2xkICE9IG51bGwgJiYgZXN0aW1hdGVkTWVtb3J5ID4gd2FyblRocmVzaG9sZC50b0J5dGVzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gdXNlIGFkZElmTGFyZ2VyIHJhdGhlciB0aGFuIGFkZCBhcyBhIHByZXZpb3VzIHBhcnRpdGlvbiBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhpcyBvbmUKLSAgICAgICAgICAgICAgICBMb25nIGN1cnJlbnQgPSBNZXNzYWdlUGFyYW1zLmdldChQYXJhbVR5cGUuUk9XX0lOREVYX1JFQURfU0laRV9XQVJOKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsIHx8IGN1cnJlbnQuY29tcGFyZVRvKGVzdGltYXRlZE1lbW9yeSkgPCAwKQotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlUGFyYW1zLmFkZChQYXJhbVR5cGUuUk9XX0lOREVYX1JFQURfU0laRV9XQVJOLCBlc3RpbWF0ZWRNZW1vcnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBlc3RpbWF0ZU1hdGVyaWFsaXplZEluZGV4U2l6ZShpbnQgZW50cmllcywgaW50IGJ5dGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIG92ZXJoZWFkID0gSW5kZXhJbmZvLkVNUFRZX1NJWkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFycmF5Q2x1c3RlcmluZy5FTVBUWV9TSVpFCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBEZWxldGlvblRpbWUuRU1QVFlfU0laRTsKLQotICAgICAgICAgICAgcmV0dXJuIChvdmVyaGVhZCAqIGVudHJpZXMpICsgYnl0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBkZXNlcmlhbGl6ZVBvc2l0aW9uQW5kU2tpcChEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLQotICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApCi0gICAgICAgICAgICAgICAgaW4uc2tpcEJ5dGVzRnVsbHkoc2l6ZSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWFkcyBvbmx5IHRoZSBkYXRhICdwb3NpdGlvbicgb2YgdGhlIGluZGV4IGVudHJ5IGFuZCByZXR1cm5zIGl0LiBOb3RlIHRoYXQgdGhpcyBsZWZ0ICdpbicgaW4gdGhlIG1pZGRsZQotICAgICAgICAgKiBvZiByZWFkaW5nIGFuIGVudHJ5LCBzbyB0aGlzIGlzIG9ubHkgdXNlZnVsIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBhbmQgaW4gbW9zdCBjYXNlICdkZXNlcmlhbGl6ZScKLSAgICAgICAgICogc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgbG9uZyByZWFkUG9zaXRpb24oRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2tpcChEYXRhSW5wdXRQbHVzIGluLCBWZXJzaW9uIHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZWFkUG9zaXRpb24oaW4pOwotICAgICAgICAgICAgc2tpcFByb21vdGVkSW5kZXgoaW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBza2lwUHJvbW90ZWRJbmRleChEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLSAgICAgICAgICAgIGlmIChzaXplIDw9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpbi5za2lwQnl0ZXNGdWxseShzaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXJpYWxpemVPZmZzZXRzKERhdGFPdXRwdXRCdWZmZXIgb3V0LCBpbnRbXSBpbmRleE9mZnNldHMsIGludCBjb2x1bW5JbmRleENvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5JbmRleENvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KGluZGV4T2Zmc2V0c1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgc2VyaWFsaXplZFNpemUoRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSwgbG9uZyBoZWFkZXJMZW5ndGgsIGludCBjb2x1bW5JbmRleENvdW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQoaGVhZGVyTGVuZ3RoKQotICAgICAgICAgICAgICAgKyAoaW50KSBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShkZWxldGlvblRpbWUpCi0gICAgICAgICAgICAgICArIFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQoY29sdW1uSW5kZXhDb3VudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIG91dCwgQnl0ZUJ1ZmZlciBpbmRleEluZm8pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHBvc2l0aW9uKTsKLQotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VyaWFsaXplRm9yQ2FjaGUoRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChwb3NpdGlvbik7Ci0KLSAgICAgICAgb3V0LndyaXRlQnl0ZShDQUNIRV9OT1RfSU5ERVhFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW4gZW50cnkgaW4gdGhlIHJvdyBpbmRleCBmb3IgYSByb3cgd2hvc2UgY29sdW1ucyBhcmUgaW5kZXhlZCAtIHVzZWQgZm9yIGJvdGggbGVnYWN5IGFuZCBjdXJyZW50IGZvcm1hdHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSW5kZXhlZEVudHJ5IGV4dGVuZHMgUm93SW5kZXhFbnRyeTxJbmRleEluZm8+Ci0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEJBU0VfU0laRTsKLQotICAgICAgICBzdGF0aWMKLSAgICAgICAgewotICAgICAgICAgICAgQkFTRV9TSVpFID0gT2JqZWN0U2l6ZXMubWVhc3VyZShuZXcgSW5kZXhlZEVudHJ5KDAsIERlbGV0aW9uVGltZS5MSVZFLCAwLCBudWxsLCBudWxsLCAwLCBudWxsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBoZWFkZXJMZW5ndGg7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbmRleEluZm9bXSBjb2x1bW5zSW5kZXg7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50W10gb2Zmc2V0czsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXhlZFBhcnRTaXplOwotICAgICAgICBAVW5tZXRlcmVkCi0gICAgICAgIHByaXZhdGUgZmluYWwgSVNlcmlhbGl6ZXI8SW5kZXhJbmZvPiBpZHhJbmZvU2VyaWFsaXplcjsKLQotICAgICAgICBwcml2YXRlIEluZGV4ZWRFbnRyeShsb25nIGRhdGFGaWxlUG9zaXRpb24sIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUsIGxvbmcgaGVhZGVyTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleEluZm9bXSBjb2x1bW5zSW5kZXgsIGludFtdIG9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleGVkUGFydFNpemUsIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4SW5mb1NlcmlhbGl6ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGRhdGFGaWxlUG9zaXRpb24pOwotCi0gICAgICAgICAgICB0aGlzLmhlYWRlckxlbmd0aCA9IGhlYWRlckxlbmd0aDsKLSAgICAgICAgICAgIHRoaXMuZGVsZXRpb25UaW1lID0gZGVsZXRpb25UaW1lOwotCi0gICAgICAgICAgICB0aGlzLmNvbHVtbnNJbmRleCA9IGNvbHVtbnNJbmRleDsKLSAgICAgICAgICAgIHRoaXMub2Zmc2V0cyA9IG9mZnNldHM7Ci0gICAgICAgICAgICB0aGlzLmluZGV4ZWRQYXJ0U2l6ZSA9IGluZGV4ZWRQYXJ0U2l6ZTsKLSAgICAgICAgICAgIHRoaXMuaWR4SW5mb1NlcmlhbGl6ZXIgPSBpZHhJbmZvU2VyaWFsaXplcjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgSW5kZXhlZEVudHJ5KGxvbmcgZGF0YUZpbGVQb3NpdGlvbiwgRGF0YUlucHV0UGx1cyBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSwgbG9uZyBoZWFkZXJMZW5ndGgsIGludCBjb2x1bW5JbmRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleEluZm8uU2VyaWFsaXplciBpZHhJbmZvU2VyaWFsaXplciwgaW50IGluZGV4ZWRQYXJ0U2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGRhdGFGaWxlUG9zaXRpb24pOwotCi0gICAgICAgICAgICB0aGlzLmhlYWRlckxlbmd0aCA9IGhlYWRlckxlbmd0aDsKLSAgICAgICAgICAgIHRoaXMuZGVsZXRpb25UaW1lID0gZGVsZXRpb25UaW1lOwotICAgICAgICAgICAgaW50IGNvbHVtbnNJbmRleENvdW50ID0gY29sdW1uSW5kZXhDb3VudDsKLQotICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXggPSBuZXcgSW5kZXhJbmZvW2NvbHVtbnNJbmRleENvdW50XTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uc0luZGV4Q291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbnNJbmRleFtpXSA9IGlkeEluZm9TZXJpYWxpemVyLmRlc2VyaWFsaXplKGluKTsKLQotICAgICAgICAgICAgdGhpcy5vZmZzZXRzID0gbmV3IGludFt0aGlzLmNvbHVtbnNJbmRleC5sZW5ndGhdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIG9mZnNldHNbaV0gPSBpbi5yZWFkSW50KCk7Ci0KLSAgICAgICAgICAgIHRoaXMuaW5kZXhlZFBhcnRTaXplID0gaW5kZXhlZFBhcnRTaXplOwotCi0gICAgICAgICAgICB0aGlzLmlkeEluZm9TZXJpYWxpemVyID0gaWR4SW5mb1NlcmlhbGl6ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0b3IgY2FsbGVkIGZyb20ge0BsaW5rIFNlcmlhbGl6ZXIjZGVzZXJpYWxpemVGb3JDYWNoZShvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXMpfS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgSW5kZXhlZEVudHJ5KGxvbmcgZGF0YUZpbGVQb3NpdGlvbiwgRGF0YUlucHV0UGx1cyBpbiwgSVNlcmlhbGl6ZXI8SW5kZXhJbmZvPiBpZHhJbmZvU2VyaWFsaXplcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGRhdGFGaWxlUG9zaXRpb24pOwotCi0gICAgICAgICAgICB0aGlzLmhlYWRlckxlbmd0aCA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLSAgICAgICAgICAgIHRoaXMuZGVsZXRpb25UaW1lID0gRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4pOwotICAgICAgICAgICAgaW50IGNvbHVtbnNJbmRleENvdW50ID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOwotCi0gICAgICAgICAgICBUcmFja2VkRGF0YUlucHV0UGx1cyB0cmFja2VkSW4gPSBuZXcgVHJhY2tlZERhdGFJbnB1dFBsdXMoaW4pOwotCi0gICAgICAgICAgICB0aGlzLmNvbHVtbnNJbmRleCA9IG5ldyBJbmRleEluZm9bY29sdW1uc0luZGV4Q291bnRdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zSW5kZXhDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uc0luZGV4W2ldID0gaWR4SW5mb1NlcmlhbGl6ZXIuZGVzZXJpYWxpemUodHJhY2tlZEluKTsKLQotICAgICAgICAgICAgdGhpcy5vZmZzZXRzID0gbnVsbDsKLQotICAgICAgICAgICAgdGhpcy5pbmRleGVkUGFydFNpemUgPSAoaW50KSB0cmFja2VkSW4uZ2V0Qnl0ZXNSZWFkKCk7Ci0KLSAgICAgICAgICAgIHRoaXMuaWR4SW5mb1NlcmlhbGl6ZXIgPSBpZHhJbmZvU2VyaWFsaXplcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbmRleE9uSGVhcCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgY29sdW1uc0luZGV4Q291bnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29sdW1uc0luZGV4Lmxlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZWxldGlvblRpbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEluZGV4SW5mb1JldHJpZXZlciBvcGVuV2l0aEluZGV4KEZpbGVIYW5kbGUgaW5kZXhGaWxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmRleEVudHJ5U2l6ZUhpc3RvZ3JhbS51cGRhdGUoc2VyaWFsaXplZFNpemUoZGVsZXRpb25UaW1lLCBoZWFkZXJMZW5ndGgsIGNvbHVtbnNJbmRleC5sZW5ndGgpICsgaW5kZXhlZFBhcnRTaXplKTsKLSAgICAgICAgICAgIGluZGV4SW5mb0NvdW50SGlzdG9ncmFtLnVwZGF0ZShjb2x1bW5zSW5kZXgubGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhJbmZvUmV0cmlldmVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcml2YXRlIGludCByZXRyaWV2YWxzOwotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIEluZGV4SW5mbyBjb2x1bW5zSW5kZXgoaW50IGluZGV4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0cmlldmFscysrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uc0luZGV4W2luZGV4XTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbmRleEluZm9HZXRzSGlzdG9ncmFtLnVwZGF0ZShyZXRyaWV2YWxzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIHVuc2hhcmVkSGVhcFNpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIGVudHJ5U2l6ZSA9IDA7Ci0gICAgICAgICAgICBmb3IgKEluZGV4SW5mbyBpZHggOiBjb2x1bW5zSW5kZXgpCi0gICAgICAgICAgICAgICAgZW50cnlTaXplICs9IGlkeC51bnNoYXJlZEhlYXBTaXplKCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFTRV9TSVpFCi0gICAgICAgICAgICAgICAgKyBlbnRyeVNpemUKLSAgICAgICAgICAgICAgICArIE9iamVjdFNpemVzLnNpemVPZlJlZmVyZW5jZUFycmF5KGNvbHVtbnNJbmRleC5sZW5ndGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIG91dCwgQnl0ZUJ1ZmZlciBpbmRleEluZm8pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgaW5kZXhlZFBhcnRTaXplICE9IEludGVnZXIuTUlOX1ZBTFVFOwotCi0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocG9zaXRpb24pOwotCi0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoc2VyaWFsaXplZFNpemUoZGVsZXRpb25UaW1lLCBoZWFkZXJMZW5ndGgsIGNvbHVtbnNJbmRleC5sZW5ndGgpICsgaW5kZXhlZFBhcnRTaXplKTsKLQotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGhlYWRlckxlbmd0aCk7Ci0gICAgICAgICAgICBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemUoZGVsZXRpb25UaW1lLCBvdXQpOwotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGNvbHVtbnNJbmRleC5sZW5ndGgpOwotICAgICAgICAgICAgZm9yIChJbmRleEluZm8gaW5mbyA6IGNvbHVtbnNJbmRleCkKLSAgICAgICAgICAgICAgICBpZHhJbmZvU2VyaWFsaXplci5zZXJpYWxpemUoaW5mbywgb3V0KTsKLSAgICAgICAgICAgIGZvciAoaW50IG9mZnNldCA6IG9mZnNldHMpCi0gICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KG9mZnNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplRm9yQ2FjaGUoRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHBvc2l0aW9uKTsKLSAgICAgICAgICAgIG91dC53cml0ZUJ5dGUoQ0FDSEVfSU5ERVhFRCk7Ci0KLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChoZWFkZXJMZW5ndGgpOwotICAgICAgICAgICAgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGRlbGV0aW9uVGltZSwgb3V0KTsKLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChjb2x1bW5zSW5kZXhDb3VudCgpKTsKLQotICAgICAgICAgICAgZm9yIChJbmRleEluZm8gaW5kZXhJbmZvIDogY29sdW1uc0luZGV4KQotICAgICAgICAgICAgICAgIGlkeEluZm9TZXJpYWxpemVyLnNlcmlhbGl6ZShpbmRleEluZm8sIG91dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgdm9pZCBza2lwRm9yQ2FjaGUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLSAgICAgICAgICAgIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNraXAoaW4pOwotICAgICAgICAgICAgaW4ucmVhZFVuc2lnbmVkVkludCgpOwotCi0gICAgICAgICAgICBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlbnRyeSBpbiB0aGUgcm93IGluZGV4IGZvciBhIHJvdyB3aG9zZSBjb2x1bW5zIGFyZSBpbmRleGVkIGFuZCB0aGUge0BsaW5rIEluZGV4SW5mb30gb2JqZWN0cwotICAgICAqIGFyZSBub3QgcmVhZCBpbnRvIHRoZSBrZXkgY2FjaGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2hhbGxvd0luZGV4ZWRFbnRyeSBleHRlbmRzIFJvd0luZGV4RW50cnk8SW5kZXhJbmZvPgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCQVNFX1NJWkU7Ci0KLSAgICAgICAgc3RhdGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJBU0VfU0laRSA9IE9iamVjdFNpemVzLm1lYXN1cmUobmV3IFNoYWxsb3dJbmRleGVkRW50cnkoMCwgMCwgRGVsZXRpb25UaW1lLkxJVkUsIDAsIDEwLCAwLCBudWxsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgaW5kZXhGaWxlUG9zaXRpb247Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgaGVhZGVyTGVuZ3RoOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBjb2x1bW5zSW5kZXhDb3VudDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBpbmRleGVkUGFydFNpemU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG9mZnNldHNPZmZzZXQ7Ci0gICAgICAgIEBVbm1ldGVyZWQKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeEluZm9TZXJpYWxpemVyOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBmaWVsZHNTZXJpYWxpemVkU2l6ZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VlIHtAbGluayAjY3JlYXRlKGxvbmcsIGxvbmcsIERlbGV0aW9uVGltZSwgbG9uZywgaW50LCBpbnQsIExpc3QsIGludFtdLCBJU2VyaWFsaXplcil9IGZvciBhIGRlc2NyaXB0aW9uCi0gICAgICAgICAqIG9mIHRoZSBwYXJhbWV0ZXJzLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTaGFsbG93SW5kZXhlZEVudHJ5KGxvbmcgZGF0YUZpbGVQb3NpdGlvbiwgbG9uZyBpbmRleEZpbGVQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUsIGxvbmcgaGVhZGVyTGVuZ3RoLCBpbnQgY29sdW1uSW5kZXhDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleGVkUGFydFNpemUsIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4SW5mb1NlcmlhbGl6ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGRhdGFGaWxlUG9zaXRpb24pOwotCi0gICAgICAgICAgICBhc3NlcnQgY29sdW1uSW5kZXhDb3VudCA+IDE7Ci0KLSAgICAgICAgICAgIHRoaXMuaW5kZXhGaWxlUG9zaXRpb24gPSBpbmRleEZpbGVQb3NpdGlvbjsKLSAgICAgICAgICAgIHRoaXMuaGVhZGVyTGVuZ3RoID0gaGVhZGVyTGVuZ3RoOwotICAgICAgICAgICAgdGhpcy5kZWxldGlvblRpbWUgPSBkZWxldGlvblRpbWU7Ci0gICAgICAgICAgICB0aGlzLmNvbHVtbnNJbmRleENvdW50ID0gY29sdW1uSW5kZXhDb3VudDsKLQotICAgICAgICAgICAgdGhpcy5pbmRleGVkUGFydFNpemUgPSBpbmRleGVkUGFydFNpemU7Ci0gICAgICAgICAgICB0aGlzLmlkeEluZm9TZXJpYWxpemVyID0gaWR4SW5mb1NlcmlhbGl6ZXI7Ci0KLSAgICAgICAgICAgIHRoaXMuZmllbGRzU2VyaWFsaXplZFNpemUgPSBzZXJpYWxpemVkU2l6ZShkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwgY29sdW1uSW5kZXhDb3VudCk7Ci0gICAgICAgICAgICB0aGlzLm9mZnNldHNPZmZzZXQgPSBpbmRleGVkUGFydFNpemUgKyBmaWVsZHNTZXJpYWxpemVkU2l6ZSAtIGNvbHVtbnNJbmRleENvdW50ICogVHlwZVNpemVzLklOVF9TSVpFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBrZXktY2FjaGUgZGVzZXJpYWxpemF0aW9uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFNoYWxsb3dJbmRleGVkRW50cnkobG9uZyBkYXRhRmlsZVBvc2l0aW9uLCBEYXRhSW5wdXRQbHVzIGluLCBJbmRleEluZm8uU2VyaWFsaXplciBpZHhJbmZvU2VyaWFsaXplcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGRhdGFGaWxlUG9zaXRpb24pOwotCi0gICAgICAgICAgICB0aGlzLmluZGV4RmlsZVBvc2l0aW9uID0gaW4ucmVhZFVuc2lnbmVkVkludCgpOwotCi0gICAgICAgICAgICB0aGlzLmhlYWRlckxlbmd0aCA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLSAgICAgICAgICAgIHRoaXMuZGVsZXRpb25UaW1lID0gRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4pOwotICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXhDb3VudCA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLQotICAgICAgICAgICAgdGhpcy5pbmRleGVkUGFydFNpemUgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0KLSAgICAgICAgICAgIHRoaXMuaWR4SW5mb1NlcmlhbGl6ZXIgPSBpZHhJbmZvU2VyaWFsaXplcjsKLQotICAgICAgICAgICAgdGhpcy5maWVsZHNTZXJpYWxpemVkU2l6ZSA9IHNlcmlhbGl6ZWRTaXplKGRlbGV0aW9uVGltZSwgaGVhZGVyTGVuZ3RoLCBjb2x1bW5zSW5kZXhDb3VudCk7Ci0gICAgICAgICAgICB0aGlzLm9mZnNldHNPZmZzZXQgPSBpbmRleGVkUGFydFNpemUgKyBmaWVsZHNTZXJpYWxpemVkU2l6ZSAtIGNvbHVtbnNJbmRleENvdW50ICogVHlwZVNpemVzLklOVF9TSVpFOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgY29sdW1uc0luZGV4Q291bnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29sdW1uc0luZGV4Q291bnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZGVsZXRpb25UaW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBJbmRleEluZm9SZXRyaWV2ZXIgb3BlbldpdGhJbmRleChGaWxlSGFuZGxlIGluZGV4RmlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgaW5kZXhFbnRyeVNpemVIaXN0b2dyYW0udXBkYXRlKGluZGV4ZWRQYXJ0U2l6ZSArIGZpZWxkc1NlcmlhbGl6ZWRTaXplKTsKLSAgICAgICAgICAgIGluZGV4SW5mb0NvdW50SGlzdG9ncmFtLnVwZGF0ZShjb2x1bW5zSW5kZXhDb3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNoYWxsb3dJbmZvUmV0cmlldmVyKGluZGV4RmlsZVBvc2l0aW9uICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZShwb3NpdGlvbikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSW50Q29kaW5nLmNvbXB1dGVVbnNpZ25lZFZJbnRTaXplKGluZGV4ZWRQYXJ0U2l6ZSArIGZpZWxkc1NlcmlhbGl6ZWRTaXplKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc1NlcmlhbGl6ZWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzT2Zmc2V0IC0gZmllbGRzU2VyaWFsaXplZFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4RmlsZS5jcmVhdGVSZWFkZXIoKSwgaWR4SW5mb1NlcmlhbGl6ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIHVuc2hhcmVkSGVhcFNpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQkFTRV9TSVpFOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBvdXQsIEJ5dGVCdWZmZXIgaW5kZXhJbmZvKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHBvc2l0aW9uKTsKLQotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGZpZWxkc1NlcmlhbGl6ZWRTaXplICsgaW5kZXhJbmZvLmxpbWl0KCkpOwotCi0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoaGVhZGVyTGVuZ3RoKTsKLSAgICAgICAgICAgIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNlcmlhbGl6ZShkZWxldGlvblRpbWUsIG91dCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoY29sdW1uc0luZGV4Q291bnQpOwotCi0gICAgICAgICAgICBvdXQud3JpdGUoaW5kZXhJbmZvKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemVGb3JDYWNoZShEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocG9zaXRpb24pOwotICAgICAgICAgICAgb3V0LndyaXRlQnl0ZShDQUNIRV9JTkRFWEVEX1NIQUxMT1cpOwotCi0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoaW5kZXhGaWxlUG9zaXRpb24pOwotCi0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoaGVhZGVyTGVuZ3RoKTsKLSAgICAgICAgICAgIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNlcmlhbGl6ZShkZWxldGlvblRpbWUsIG91dCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoY29sdW1uc0luZGV4Q291bnQpOwotCi0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoaW5kZXhlZFBhcnRTaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyB2b2lkIHNraXBGb3JDYWNoZShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaW4ucmVhZFVuc2lnbmVkVkludCgpOwotCi0gICAgICAgICAgICBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICBEZWxldGlvblRpbWUuc2VyaWFsaXplci5za2lwKGluKTsKLSAgICAgICAgICAgIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLQotICAgICAgICAgICAgaW4ucmVhZFVuc2lnbmVkVkludCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2hhbGxvd0luZm9SZXRyaWV2ZXIgZXh0ZW5kcyBGaWxlSW5kZXhJbmZvUmV0cmlldmVyCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBvZmZzZXRzT2Zmc2V0OwotCi0gICAgICAgIHByaXZhdGUgU2hhbGxvd0luZm9SZXRyaWV2ZXIobG9uZyBpbmRleEluZm9GaWxlUG9zaXRpb24sIGludCBvZmZzZXRzT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEYXRhSW5wdXQgaW5kZXhSZWFkZXIsIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4SW5mb1NlcmlhbGl6ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGluZGV4SW5mb0ZpbGVQb3NpdGlvbiwgaW5kZXhSZWFkZXIsIGlkeEluZm9TZXJpYWxpemVyKTsKLSAgICAgICAgICAgIHRoaXMub2Zmc2V0c09mZnNldCA9IG9mZnNldHNPZmZzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBJbmRleEluZm8gZmV0Y2hJbmRleChpbnQgaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBzZWVrIHRvIHBvc2l0aW9uIGluICJvZmZzZXRzIHRvIEluZGV4SW5mbyIgdGFibGUKLSAgICAgICAgICAgIGluZGV4UmVhZGVyLnNlZWsoaW5kZXhJbmZvRmlsZVBvc2l0aW9uICsgb2Zmc2V0c09mZnNldCArIGluZGV4ICogVHlwZVNpemVzLklOVF9TSVpFKTsKLQotICAgICAgICAgICAgLy8gcmVhZCBvZmZzZXQgb2YgSW5kZXhJbmZvCi0gICAgICAgICAgICBpbnQgaW5kZXhJbmZvUG9zID0gaW5kZXhSZWFkZXIucmVhZEludCgpOwotCi0gICAgICAgICAgICAvLyBzZWVrIHRvIHBvc2lzaW9uIG9mIEluZGV4SW5mbwotICAgICAgICAgICAgaW5kZXhSZWFkZXIuc2VlayhpbmRleEluZm9GaWxlUG9zaXRpb24gKyBpbmRleEluZm9Qb3MpOwotCi0gICAgICAgICAgICAvLyBmaW5hbGx5LCBkZXNlcmlhbGl6ZSBJbmRleEluZm8KLSAgICAgICAgICAgIHJldHVybiBpZHhJbmZvU2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbmRleFJlYWRlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYXNlIGNsYXNzIHRvIGFjY2VzcyB7QGxpbmsgSW5kZXhJbmZvfSBvYmplY3RzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgSW5kZXhJbmZvUmV0cmlldmVyIGV4dGVuZHMgQXV0b0Nsb3NlYWJsZQotICAgIHsKLSAgICAgICAgSW5kZXhJbmZvIGNvbHVtbnNJbmRleChpbnQgaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgICAgICB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJhc2UgY2xhc3MgdG8gYWNjZXNzIHtAbGluayBJbmRleEluZm99IG9iamVjdHMgb24gZGlzayB0aGF0IGtlZXBzIGFscmVhZHkKLSAgICAgKiByZWFkIHtAbGluayBJbmRleEluZm99IG9uIGhlYXAuCi0gICAgICovCi0gICAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRmlsZUluZGV4SW5mb1JldHJpZXZlciBpbXBsZW1lbnRzIEluZGV4SW5mb1JldHJpZXZlcgotICAgIHsKLSAgICAgICAgZmluYWwgbG9uZyBpbmRleEluZm9GaWxlUG9zaXRpb247Ci0gICAgICAgIGZpbmFsIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4SW5mb1NlcmlhbGl6ZXI7Ci0gICAgICAgIGZpbmFsIEZpbGVEYXRhSW5wdXQgaW5kZXhSZWFkZXI7Ci0gICAgICAgIGludCByZXRyaWV2YWxzOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW5kZXhJbmZvRmlsZVBvc2l0aW9uIG9mZnNldCBvZiBmaXJzdCBzZXJpYWxpemVkIHtAbGluayBJbmRleEluZm99IG9iamVjdAotICAgICAgICAgKiBAcGFyYW0gaW5kZXhSZWFkZXIgZmlsZSBkYXRhIGlucHV0IHRvIGFjY2VzcyB0aGUgaW5kZXggZmlsZSwgY2xvc2VkIGJ5IHRoaXMgaW5zdGFuY2UKLSAgICAgICAgICogQHBhcmFtIGlkeEluZm9TZXJpYWxpemVyIHRoZSBpbmRleCBzZXJpYWxpemVyIHRvIGRlc2VyaWFsaXplIHtAbGluayBJbmRleEluZm99IG9iamVjdHMKLSAgICAgICAgICovCi0gICAgICAgIEZpbGVJbmRleEluZm9SZXRyaWV2ZXIobG9uZyBpbmRleEluZm9GaWxlUG9zaXRpb24sIEZpbGVEYXRhSW5wdXQgaW5kZXhSZWFkZXIsIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4SW5mb1NlcmlhbGl6ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuaW5kZXhJbmZvRmlsZVBvc2l0aW9uID0gaW5kZXhJbmZvRmlsZVBvc2l0aW9uOwotICAgICAgICAgICAgdGhpcy5pZHhJbmZvU2VyaWFsaXplciA9IGlkeEluZm9TZXJpYWxpemVyOwotICAgICAgICAgICAgdGhpcy5pbmRleFJlYWRlciA9IGluZGV4UmVhZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIEluZGV4SW5mbyBjb2x1bW5zSW5kZXgoaW50IGluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0cmlldmFscysrOwotICAgICAgICAgICAgcmV0dXJuIGZldGNoSW5kZXgoaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYWJzdHJhY3QgSW5kZXhJbmZvIGZldGNoSW5kZXgoaW50IGluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaW5kZXhSZWFkZXIuY2xvc2UoKTsKLQotICAgICAgICAgICAgaW5kZXhJbmZvR2V0c0hpc3RvZ3JhbS51cGRhdGUocmV0cmlldmFscyk7Ci0gICAgICAgICAgICBpbmRleEluZm9SZWFkc0hpc3RvZ3JhbS51cGRhdGUocmV0cmlldmFscyk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TU1RhYmxlSW1wb3J0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NTVGFibGVJbXBvcnRlci5qYXZhCmluZGV4IDU5NDk1NTkuLjY2YTU2ZGMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NTVGFibGVJbXBvcnRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NTVGFibGVJbXBvcnRlci5qYXZhCkBAIC0yNSwyMSArMjUsMjQgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5WZXJpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuU1NUYWJsZVNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JVmVyaWZpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5LZXlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmczsKIApAQCAtNjksOCArNzIsOCBAQAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIHN5bmNocm9uaXplZCBMaXN0PFN0cmluZz4gaW1wb3J0TmV3U1NUYWJsZXMoT3B0aW9ucyBvcHRpb25zKQogICAgIHsKLSAgICAgICAgbG9nZ2VyLmluZm8oIkxvYWRpbmcgbmV3IFNTVGFibGVzIGZvciB7fS97fToge30iLAotICAgICAgICAgICAgICAgICAgICBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCksIG9wdGlvbnMpOworICAgICAgICBVVUlEIGltcG9ydElEID0gVVVJRC5yYW5kb21VVUlEKCk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJbe31dIExvYWRpbmcgbmV3IFNTVGFibGVzIGZvciB7fS97fToge30iLCBpbXBvcnRJRCwgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpLCBvcHRpb25zKTsKIAogICAgICAgICBMaXN0PFBhaXI8RGlyZWN0b3JpZXMuU1NUYWJsZUxpc3RlciwgU3RyaW5nPj4gbGlzdGVycyA9IGdldFNTVGFibGVMaXN0ZXJzKG9wdGlvbnMuc3JjUGF0aHMpOwogCkBAIC05MywxOSArOTYsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRJZkRyYWluaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5U1NUYWJsZUZvckltcG9ydChkZXNjcmlwdG9yLCBlbnRyeS5nZXRWYWx1ZSgpLCBvcHRpb25zLnZlcmlmeVRva2Vucywgb3B0aW9ucy52ZXJpZnlTU1RhYmxlcywgb3B0aW9ucy5leHRlbmRlZFZlcmlmeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCiAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJGYWlsZWQgdmVyaWZ5aW5nIHNzdGFibGUge30gaW4gZGlyZWN0b3J5IHt9IiwgZGVzY3JpcHRvciwgZGlyLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJbe31dIEZhaWxlZCB2ZXJpZnlpbmcgU1NUYWJsZSB7fSBpbiBkaXJlY3Rvcnkge30iLCBpbXBvcnRJRCwgZGVzY3JpcHRvciwgZGlyLCB0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkRGlyZWN0b3JpZXMuYWRkKGRpcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRmFpbGVkIHZlcmlmeWluZyBzc3RhYmxlIHt9IiwgZGVzY3JpcHRvciwgdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdmVyaWZ5aW5nIHNzdGFibGUgIitkZXNjcmlwdG9yLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJbe31dIEZhaWxlZCB2ZXJpZnlpbmcgU1NUYWJsZSB7fSIsIGltcG9ydElELCBkZXNjcmlwdG9yLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB2ZXJpZnlpbmcgU1NUYWJsZSAiICsgZGVzY3JpcHRvciwgdCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTI4LDYgKzEzMiw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhYm9ydElmRHJhaW5pbmcoKTsKICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBvbGREZXNjcmlwdG9yID0gZW50cnkuZ2V0S2V5KCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RGVzY3JpcHRvcnMuY29udGFpbnMob2xkRGVzY3JpcHRvcikpCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTE0NCw3ICsxNDksNyBAQAogICAgICAgICAgICAgICAgICAgICBuZXdTU1RhYmxlc1BlckRpcmVjdG9yeS5mb3JFYWNoKHMgLT4gcy5zZWxmUmVmKCkucmVsZWFzZSgpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGRpciAhPSBudWxsKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkZhaWxlZCBpbXBvcnRpbmcgc3N0YWJsZXMgaW4gZGlyZWN0b3J5IHt9IiwgZGlyLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiW3t9XSBGYWlsZWQgaW1wb3J0aW5nIHNzdGFibGVzIGluIGRpcmVjdG9yeSB7fSIsIGltcG9ydElELCBkaXIsIHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkRGlyZWN0b3JpZXMuYWRkKGRpcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jb3B5RGF0YSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKQEAgLTE2MCw4ICsxNjUsOCBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJGYWlsZWQgaW1wb3J0aW5nIHNzdGFibGVzIGZyb20gZGF0YSBkaXJlY3RvcnkgLSByZW5hbWVkIHNzdGFibGVzIGFyZToge30iLCBtb3ZlZFNTVGFibGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgaW1wb3J0aW5nIHNzdGFibGVzIiwgdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlt7fV0gRmFpbGVkIGltcG9ydGluZyBzc3RhYmxlcyBmcm9tIGRhdGEgZGlyZWN0b3J5IC0gcmVuYW1lZCBTU1RhYmxlcyBhcmU6IHt9IiwgaW1wb3J0SUQsIG1vdmVkU1NUYWJsZXMsIHQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCBpbXBvcnRpbmcgU1NUYWJsZXMiLCB0KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE3MCwyOCArMTc1LDY4IEBACiAKICAgICAgICAgaWYgKG5ld1NTVGFibGVzLmlzRW1wdHkoKSkKICAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk5vIG5ldyBTU1RhYmxlcyB3ZXJlIGZvdW5kIGZvciB7fS97fSIsIGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5nZXRUYWJsZU5hbWUoKSk7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiW3t9XSBObyBuZXcgU1NUYWJsZXMgd2VyZSBmb3VuZCBmb3Ige30ve30iLCBpbXBvcnRJRCwgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpKTsKICAgICAgICAgICAgIHJldHVybiBmYWlsZWREaXJlY3RvcmllczsKICAgICAgICAgfQogCi0gICAgICAgIGxvZ2dlci5pbmZvKCJMb2FkaW5nIG5ldyBTU1RhYmxlcyBhbmQgYnVpbGRpbmcgc2Vjb25kYXJ5IGluZGV4ZXMgZm9yIHt9L3t9OiB7fSIsIGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5nZXRUYWJsZU5hbWUoKSwgbmV3U1NUYWJsZXMpOworICAgICAgICBsb2dnZXIuaW5mbygiW3t9XSBMb2FkaW5nIG5ldyBTU1RhYmxlcyBhbmQgYnVpbGRpbmcgc2Vjb25kYXJ5IGluZGV4ZXMgZm9yIHt9L3t9OiB7fSIsIGltcG9ydElELCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCksIG5ld1NTVGFibGVzKTsKKyAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgbG9nTGV2ZWxpbmcoaW1wb3J0SUQsIG5ld1NTVGFibGVzKTsKIAogICAgICAgICB0cnkgKFJlZnM8U1NUYWJsZVJlYWRlcj4gcmVmcyA9IFJlZnMucmVmKG5ld1NTVGFibGVzKSkKICAgICAgICAgeworICAgICAgICAgICAgYWJvcnRJZkRyYWluaW5nKCk7CiAgICAgICAgICAgICBjZnMuZ2V0VHJhY2tlcigpLmFkZFNTVGFibGVzKG5ld1NTVGFibGVzKTsKICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciByZWFkZXIgOiBuZXdTU1RhYmxlcykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5pbnZhbGlkYXRlQ2FjaGVzICYmIGNmcy5pc1Jvd0NhY2hlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlQ2FjaGVzRm9yU1NUYWJsZShyZWFkZXIuZGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVDYWNoZXNGb3JTU1RhYmxlKHJlYWRlcik7CiAgICAgICAgICAgICB9Ci0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiW3t9XSBGYWlsZWQgYWRkaW5nIFNTVGFibGVzIiwgaW1wb3J0SUQsIHQpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCBhZGRpbmcgU1NUYWJsZXMiLCB0KTsKICAgICAgICAgfQogCi0gICAgICAgIGxvZ2dlci5pbmZvKCJEb25lIGxvYWRpbmcgbG9hZCBuZXcgU1NUYWJsZXMgZm9yIHt9L3t9IiwgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlt7fV0gRG9uZSBsb2FkaW5nIGxvYWQgbmV3IFNTVGFibGVzIGZvciB7fS97fSIsIGltcG9ydElELCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOwogICAgICAgICByZXR1cm4gZmFpbGVkRGlyZWN0b3JpZXM7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIHN0YXRlIG9mIHRoaXMgbm9kZSBhbmQgdGhyb3dzIGFuIHtAbGluayBJbnRlcnJ1cHRlZEV4Y2VwdGlvbn0gaWYgaXQgaXMgY3VycmVudGx5IGRyYWluaW5nCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSBub2RlIGlzIGRyYWluaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhYm9ydElmRHJhaW5pbmcoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5pc0RyYWluaW5nKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oIlNTVGFibGVzIGltcG9ydCBoYXMgYmVlbiBhYm9ydGVkIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGxvZ0xldmVsaW5nKFVVSUQgaW1wb3J0SUQsIFNldDxTU1RhYmxlUmVhZGVyPiBuZXdTU1RhYmxlcykKKyAgICB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRTU1RhYmxlcyhTU1RhYmxlU2V0LkNBTk9OSUNBTCkpCisgICAgICAgICAgICBzYi5hcHBlbmQoZm9ybWF0TWV0YWRhdGEoc3N0YWJsZSkpOworICAgICAgICBsb2dnZXIuZGVidWcoIlt7fV0gQ3VycmVudCBzc3RhYmxlczoge30iLCBpbXBvcnRJRCwgc2IpOworICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogbmV3U1NUYWJsZXMpCisgICAgICAgICAgICBzYi5hcHBlbmQoZm9ybWF0TWV0YWRhdGEoc3N0YWJsZSkpOworICAgICAgICBsb2dnZXIuZGVidWcoIlt7fV0gTmV3IHNzdGFibGVzOiB7fSIsIGltcG9ydElELCBzYik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdE1ldGFkYXRhKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7WyVzLCAlc10sICVkLCAlcywgJWR9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRGaXJzdCgpLmdldFRva2VuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0TGFzdCgpLmdldFRva2VuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0U1NUYWJsZUxldmVsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuaXNSZXBhaXJlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLm9uRGlza0xlbmd0aCgpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBPcGVucyB0aGUgc3N0YWJsZXJlYWRlciBkZXNjcmliZWQgYnkgZGVzY3JpcHRvciBhbmQgZmlndXJlcyBvdXQgdGhlIGNvcnJlY3QgZGlyZWN0b3J5IGZvciBpdCBiYXNlZAogICAgICAqIG9uIHRoZSBmaXJzdCB0b2tlbgogICAgICAqCkBAIC0yMDgsNyArMjUzLDcgQEAKICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gbnVsbDsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGUgPSBTU1RhYmxlUmVhZGVyLm9wZW4oZGVzY3JpcHRvciwgY29tcG9uZW50cywgY2ZzLm1ldGFkYXRhKTsKKyAgICAgICAgICAgIHNzdGFibGUgPSBTU1RhYmxlUmVhZGVyLm9wZW4oY2ZzLCBkZXNjcmlwdG9yLCBjb21wb25lbnRzLCBjZnMubWV0YWRhdGEpOwogICAgICAgICAgICAgdGFyZ2V0RGlyZWN0b3J5ID0gY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKGNmcy5kaXNrQm91bmRhcnlNYW5hZ2VyLmdldERpc2tCb3VuZGFyaWVzKGNmcykuZ2V0Q29ycmVjdERpc2tGb3JTU1RhYmxlKHNzdGFibGUpKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbGx5CkBAIC0yMTYsNyArMjYxLDcgQEAKICAgICAgICAgICAgIGlmIChzc3RhYmxlICE9IG51bGwpCiAgICAgICAgICAgICAgICAgc3N0YWJsZS5zZWxmUmVmKCkucmVsZWFzZSgpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0YXJnZXREaXJlY3RvcnkgPT0gbnVsbCA/IGNmcy5nZXREaXJlY3RvcmllcygpLmdldFdyaXRlYWJsZUxvY2F0aW9uVG9Mb2FkRmlsZShuZXcgRmlsZShkZXNjcmlwdG9yLmJhc2VGaWxlbmFtZSgpKSkgOiB0YXJnZXREaXJlY3Rvcnk7CisgICAgICAgIHJldHVybiB0YXJnZXREaXJlY3RvcnkgPT0gbnVsbCA/IGNmcy5nZXREaXJlY3RvcmllcygpLmdldFdyaXRlYWJsZUxvY2F0aW9uVG9Mb2FkRmlsZShkZXNjcmlwdG9yLmJhc2VGaWxlKCkpIDogdGFyZ2V0RGlyZWN0b3J5OwogICAgIH0KIAogICAgIC8qKgpAQCAtMjc5LDExICszMjQsMTEgQEAKICAgICB7CiAgICAgICAgIGZvciAoTW92ZWRTU1RhYmxlIG1vdmVkU1NUYWJsZSA6IG1vdmVkU1NUYWJsZXMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuZXcgRmlsZShtb3ZlZFNTVGFibGUubmV3RGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpLmV4aXN0cygpKQorICAgICAgICAgICAgaWYgKG1vdmVkU1NUYWJsZS5uZXdEZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKS5leGlzdHMoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIk1vdmluZyBzc3RhYmxlIHt9IGJhY2sgdG8ge30iLCBtb3ZlZFNTVGFibGUubmV3RGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG1vdmVkU1NUYWJsZS5vbGREZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7Ci0gICAgICAgICAgICAgICAgU1NUYWJsZVdyaXRlci5yZW5hbWUobW92ZWRTU1RhYmxlLm5ld0Rlc2NyaXB0b3IsIG1vdmVkU1NUYWJsZS5vbGREZXNjcmlwdG9yLCBtb3ZlZFNTVGFibGUuY29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJNb3Zpbmcgc3N0YWJsZSB7fSBiYWNrIHRvIHt9IiwgbW92ZWRTU1RhYmxlLm5ld0Rlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBtb3ZlZFNTVGFibGUub2xkRGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkpOworICAgICAgICAgICAgICAgIFNTVGFibGUucmVuYW1lKG1vdmVkU1NUYWJsZS5uZXdEZXNjcmlwdG9yLCBtb3ZlZFNTVGFibGUub2xkRGVzY3JpcHRvciwgbW92ZWRTU1RhYmxlLmNvbXBvbmVudHMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjk5LDExICszNDQsOCBAQAogICAgICAgICBsb2dnZXIuZGVidWcoIlJlbW92aW5nIGNvcGllZCBTU1RhYmxlcyB3aGljaCB3ZXJlIGxlZnQgaW4gZGF0YSBkaXJlY3RvcmllcyBhZnRlciBmYWlsZWQgU1NUYWJsZSBpbXBvcnQuIik7CiAgICAgICAgIGZvciAoTW92ZWRTU1RhYmxlIG1vdmVkU1NUYWJsZSA6IG1vdmVkU1NUYWJsZXMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuZXcgRmlsZShtb3ZlZFNTVGFibGUubmV3RGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpLmV4aXN0cygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG5vIGxvZ2dpbmcgaGVyZSBhcyBmb3IgbW92ZVNTVGFibGVzQmFjayBjYXNlIGFib3ZlIGFzIGxvZ2dpbmcgaXMgZG9uZSBpbiBkZWxldGUgbWV0aG9kCi0gICAgICAgICAgICAgICAgU1NUYWJsZVdyaXRlci5kZWxldGUobW92ZWRTU1RhYmxlLm5ld0Rlc2NyaXB0b3IsIG1vdmVkU1NUYWJsZS5jb21wb25lbnRzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5vIGxvZ2dpbmcgaGVyZSBhcyBmb3IgbW92ZVNTVGFibGVzQmFjayBjYXNlIGFib3ZlIGFzIGxvZ2dpbmcgaXMgZG9uZSBpbiBkZWxldGUgbWV0aG9kCisgICAgICAgICAgICBtb3ZlZFNTVGFibGUubmV3RGVzY3JpcHRvci5nZXRGb3JtYXQoKS5kZWxldGUobW92ZWRTU1RhYmxlLm5ld0Rlc2NyaXB0b3IpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMTEsOSArMzUzLDkgQEAKICAgICAgKiBJdGVyYXRlcyBvdmVyIGFsbCBrZXlzIGluIHRoZSBzc3RhYmxlIGluZGV4IGFuZCBpbnZhbGlkYXRlcyB0aGUgcm93IGNhY2hlCiAgICAgICovCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgdm9pZCBpbnZhbGlkYXRlQ2FjaGVzRm9yU1NUYWJsZShEZXNjcmlwdG9yIGRlc2MpCisgICAgdm9pZCBpbnZhbGlkYXRlQ2FjaGVzRm9yU1NUYWJsZShTU1RhYmxlUmVhZGVyIHJlYWRlcikKICAgICB7Ci0gICAgICAgIHRyeSAoS2V5SXRlcmF0b3IgaXRlciA9IG5ldyBLZXlJdGVyYXRvcihkZXNjLCBjZnMubWV0YWRhdGEoKSkpCisgICAgICAgIHRyeSAoS2V5SXRlcmF0b3IgaXRlciA9IHJlYWRlci5rZXlJdGVyYXRvcigpKQogICAgICAgICB7CiAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCiAgICAgICAgICAgICB7CkBAIC0zMjEsNiArMzYzLDEwIEBACiAgICAgICAgICAgICAgICAgY2ZzLmludmFsaWRhdGVDYWNoZWRQYXJ0aXRpb24oZGVjb3JhdGVkS2V5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gaW1wb3J0IHNzdGFibGUgIiArIHJlYWRlci5nZXRGaWxlbmFtZSgpLCBleCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTMzNSwxNCArMzgxLDE1IEBACiAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gbnVsbDsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJlYWRlciA9IFNTVGFibGVSZWFkZXIub3BlbihkZXNjcmlwdG9yLCBjb21wb25lbnRzLCBjZnMubWV0YWRhdGEpOwotICAgICAgICAgICAgVmVyaWZpZXIuT3B0aW9ucyB2ZXJpZmllck9wdGlvbnMgPSBWZXJpZmllci5vcHRpb25zKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0ZW5kZWRWZXJpZmljYXRpb24oZXh0ZW5kZWRWZXJpZnkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNoZWNrT3duc1Rva2Vucyh2ZXJpZnlUb2tlbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1aWNrKCF2ZXJpZnlTU1RhYmxlcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3koZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm11dGF0ZVJlcGFpclN0YXR1cyhmYWxzZSkuYnVpbGQoKTsKLSAgICAgICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCByZWFkZXIsIGZhbHNlLCB2ZXJpZmllck9wdGlvbnMpKQorICAgICAgICAgICAgcmVhZGVyID0gU1NUYWJsZVJlYWRlci5vcGVuKGNmcywgZGVzY3JpcHRvciwgY29tcG9uZW50cywgY2ZzLm1ldGFkYXRhKTsKKyAgICAgICAgICAgIElWZXJpZmllci5PcHRpb25zIHZlcmlmaWVyT3B0aW9ucyA9IElWZXJpZmllci5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leHRlbmRlZFZlcmlmaWNhdGlvbihleHRlbmRlZFZlcmlmeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGVja093bnNUb2tlbnModmVyaWZ5VG9rZW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1aWNrKCF2ZXJpZnlTU1RhYmxlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnZva2VEaXNrRmFpbHVyZVBvbGljeShmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tdXRhdGVSZXBhaXJTdGF0dXMoZmFsc2UpLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gcmVhZGVyLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCB2ZXJpZmllck9wdGlvbnMpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwogICAgICAgICAgICAgfQpAQCAtMzY0LDcgKzQxMSw3IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIG1heWJlTXV0YXRlTWV0YWRhdGEoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBPcHRpb25zIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgaWYgKG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKSkuZXhpc3RzKCkpCisgICAgICAgIGlmIChkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUykuZXhpc3RzKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChvcHRpb25zLnJlc2V0TGV2ZWwpCiAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TZXJpYWxpemF0aW9uSGVhZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TZXJpYWxpemF0aW9uSGVhZGVyLmphdmEKaW5kZXggMTEyMzlkOC4uZDc1YWRmZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU2VyaWFsaXphdGlvbkhlYWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NlcmlhbGl6YXRpb25IZWFkZXIuamF2YQpAQCAtMjUsOSArMjUsOCBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlR5cGVQYXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuVW5rbm93bkNvbHVtbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CkBAIC0zOCw2ICszNyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuQWJzdHJhY3RUeXBlU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIAogcHVibGljIGNsYXNzIFNlcmlhbGl6YXRpb25IZWFkZXIKQEAgLTE2OSwxMiArMTY5LDEyIEBACiAKICAgICBwdWJsaWMgdm9pZCB3cml0ZUxvY2FsRGVsZXRpb25UaW1lKGludCBsb2NhbERlbGV0aW9uVGltZSwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChsb2NhbERlbGV0aW9uVGltZSAtIHN0YXRzLm1pbkxvY2FsRGVsZXRpb25UaW1lKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIobG9jYWxEZWxldGlvblRpbWUgLSBzdGF0cy5taW5Mb2NhbERlbGV0aW9uVGltZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgd3JpdGVUVEwoaW50IHR0bCwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludCh0dGwgLSBzdGF0cy5taW5UVEwpOworICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMih0dGwgLSBzdGF0cy5taW5UVEwpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHdyaXRlRGVsZXRpb25UaW1lKERlbGV0aW9uVGltZSBkdCwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KQEAgLTE5MCwxMiArMTkwLDEyIEBACiAKICAgICBwdWJsaWMgaW50IHJlYWRMb2NhbERlbGV0aW9uVGltZShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHJldHVybiAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKSArIHN0YXRzLm1pbkxvY2FsRGVsZXRpb25UaW1lOworICAgICAgICByZXR1cm4gaW4ucmVhZFVuc2lnbmVkVkludDMyKCkgKyBzdGF0cy5taW5Mb2NhbERlbGV0aW9uVGltZTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IHJlYWRUVEwoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICByZXR1cm4gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCkgKyBzdGF0cy5taW5UVEw7CisgICAgICAgIHJldHVybiBpbi5yZWFkVW5zaWduZWRWSW50MzIoKSArIHN0YXRzLm1pblRUTDsKICAgICB9CiAKICAgICBwdWJsaWMgRGVsZXRpb25UaW1lIHJlYWREZWxldGlvblRpbWUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCkBAIC0zOTgsNiArMzk4LDggQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VyaWFsaXplciBpbXBsZW1lbnRzIElNZXRhZGF0YUNvbXBvbmVudFNlcmlhbGl6ZXI8Q29tcG9uZW50PgogICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFR5cGVTZXJpYWxpemVyIHR5cGVTZXJpYWxpemVyID0gbmV3IEFic3RyYWN0VHlwZVNlcmlhbGl6ZXIoKTsKKwogICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemVGb3JNZXNzYWdpbmcoU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIsIENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIERhdGFPdXRwdXRQbHVzIG91dCwgYm9vbGVhbiBoYXNTdGF0aWMpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBFbmNvZGluZ1N0YXRzLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGhlYWRlci5zdGF0cywgb3V0KTsKQEAgLTQ2MiwxMCArNDY0LDggQEAKICAgICAgICAgewogICAgICAgICAgICAgRW5jb2RpbmdTdGF0cy5zZXJpYWxpemVyLnNlcmlhbGl6ZShoZWFkZXIuc3RhdHMsIG91dCk7CiAKLSAgICAgICAgICAgIHdyaXRlVHlwZShoZWFkZXIua2V5VHlwZSwgb3V0KTsKLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChoZWFkZXIuY2x1c3RlcmluZ1R5cGVzLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKEFic3RyYWN0VHlwZTw/PiB0eXBlIDogaGVhZGVyLmNsdXN0ZXJpbmdUeXBlcykKLSAgICAgICAgICAgICAgICB3cml0ZVR5cGUodHlwZSwgb3V0KTsKKyAgICAgICAgICAgIHR5cGVTZXJpYWxpemVyLnNlcmlhbGl6ZShoZWFkZXIua2V5VHlwZSwgb3V0KTsKKyAgICAgICAgICAgIHR5cGVTZXJpYWxpemVyLnNlcmlhbGl6ZUxpc3QoaGVhZGVyLmNsdXN0ZXJpbmdUeXBlcywgb3V0KTsKIAogICAgICAgICAgICAgd3JpdGVDb2x1bW5zV2l0aFR5cGVzKGhlYWRlci5zdGF0aWNDb2x1bW5zLCBvdXQpOwogICAgICAgICAgICAgd3JpdGVDb2x1bW5zV2l0aFR5cGVzKGhlYWRlci5yZWd1bGFyQ29sdW1ucywgb3V0KTsKQEAgLTQ3NiwxNyArNDc2LDExIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEVuY29kaW5nU3RhdHMgc3RhdHMgPSBFbmNvZGluZ1N0YXRzLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4pOwogCi0gICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4ga2V5VHlwZSA9IHJlYWRUeXBlKGluKTsKLSAgICAgICAgICAgIGludCBzaXplID0gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gY2x1c3RlcmluZ1R5cGVzID0gbmV3IEFycmF5TGlzdDw+KHNpemUpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgICAgICAgY2x1c3RlcmluZ1R5cGVzLmFkZChyZWFkVHlwZShpbikpOworICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGtleVR5cGUgPSB0eXBlU2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbik7CisgICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gY2x1c3RlcmluZ1R5cGVzID0gdHlwZVNlcmlhbGl6ZXIuZGVzZXJpYWxpemVMaXN0KGluKTsKIAotICAgICAgICAgICAgTWFwPEJ5dGVCdWZmZXIsIEFic3RyYWN0VHlwZTw/Pj4gc3RhdGljQ29sdW1ucyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKLSAgICAgICAgICAgIE1hcDxCeXRlQnVmZmVyLCBBYnN0cmFjdFR5cGU8Pz4+IHJlZ3VsYXJDb2x1bW5zID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwotCi0gICAgICAgICAgICByZWFkQ29sdW1uc1dpdGhUeXBlKGluLCBzdGF0aWNDb2x1bW5zKTsKLSAgICAgICAgICAgIHJlYWRDb2x1bW5zV2l0aFR5cGUoaW4sIHJlZ3VsYXJDb2x1bW5zKTsKKyAgICAgICAgICAgIE1hcDxCeXRlQnVmZmVyLCBBYnN0cmFjdFR5cGU8Pz4+IHN0YXRpY0NvbHVtbnMgPSByZWFkQ29sdW1uc1dpdGhUeXBlKGluKTsKKyAgICAgICAgICAgIE1hcDxCeXRlQnVmZmVyLCBBYnN0cmFjdFR5cGU8Pz4+IHJlZ3VsYXJDb2x1bW5zID0gcmVhZENvbHVtbnNXaXRoVHlwZShpbik7CiAKICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50KGtleVR5cGUsIGNsdXN0ZXJpbmdUeXBlcywgc3RhdGljQ29sdW1ucywgcmVndWxhckNvbHVtbnMsIHN0YXRzKTsKICAgICAgICAgfQpAQCAtNDk2LDEwICs0OTAsOCBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpbnQgc2l6ZSA9IEVuY29kaW5nU3RhdHMuc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShoZWFkZXIuc3RhdHMpOwogCi0gICAgICAgICAgICBzaXplICs9IHNpemVvZlR5cGUoaGVhZGVyLmtleVR5cGUpOwotICAgICAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KGhlYWRlci5jbHVzdGVyaW5nVHlwZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoQWJzdHJhY3RUeXBlPD8+IHR5cGUgOiBoZWFkZXIuY2x1c3RlcmluZ1R5cGVzKQotICAgICAgICAgICAgICAgIHNpemUgKz0gc2l6ZW9mVHlwZSh0eXBlKTsKKyAgICAgICAgICAgIHNpemUgKz0gdHlwZVNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoaGVhZGVyLmtleVR5cGUpOworICAgICAgICAgICAgc2l6ZSArPSB0eXBlU2VyaWFsaXplci5zZXJpYWxpemVkTGlzdFNpemUoaGVhZGVyLmNsdXN0ZXJpbmdUeXBlcyk7CiAKICAgICAgICAgICAgIHNpemUgKz0gc2l6ZW9mQ29sdW1uc1dpdGhUeXBlcyhoZWFkZXIuc3RhdGljQ29sdW1ucyk7CiAgICAgICAgICAgICBzaXplICs9IHNpemVvZkNvbHVtbnNXaXRoVHlwZXMoaGVhZGVyLnJlZ3VsYXJDb2x1bW5zKTsKQEAgLTUwOCwxMSArNTAwLDExIEBACiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQ29sdW1uc1dpdGhUeXBlcyhNYXA8Qnl0ZUJ1ZmZlciwgQWJzdHJhY3RUeXBlPD8+PiBjb2x1bW5zLCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoY29sdW1ucy5zaXplKCkpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoY29sdW1ucy5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8Qnl0ZUJ1ZmZlciwgQWJzdHJhY3RUeXBlPD8+PiBlbnRyeSA6IGNvbHVtbnMuZW50cnlTZXQoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhWSW50TGVuZ3RoKGVudHJ5LmdldEtleSgpLCBvdXQpOwotICAgICAgICAgICAgICAgIHdyaXRlVHlwZShlbnRyeS5nZXRWYWx1ZSgpLCBvdXQpOworICAgICAgICAgICAgICAgIHR5cGVTZXJpYWxpemVyLnNlcmlhbGl6ZShlbnRyeS5nZXRWYWx1ZSgpLCBvdXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTUyMiwzNiArNTE0LDIxIEBACiAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxCeXRlQnVmZmVyLCBBYnN0cmFjdFR5cGU8Pz4+IGVudHJ5IDogY29sdW1ucy5lbnRyeVNldCgpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHNpemUgKz0gQnl0ZUJ1ZmZlclV0aWwuc2VyaWFsaXplZFNpemVXaXRoVkludExlbmd0aChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgc2l6ZSArPSBzaXplb2ZUeXBlKGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIHNpemUgKz0gdHlwZVNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoZW50cnkuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCByZWFkQ29sdW1uc1dpdGhUeXBlKERhdGFJbnB1dFBsdXMgaW4sIE1hcDxCeXRlQnVmZmVyLCBBYnN0cmFjdFR5cGU8Pz4+IHR5cGVNYXApIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICBwcml2YXRlIE1hcDxCeXRlQnVmZmVyLCBBYnN0cmFjdFR5cGU8Pz4+IHJlYWRDb2x1bW5zV2l0aFR5cGUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAgaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CisgICAgICAgICAgICBNYXA8Qnl0ZUJ1ZmZlciwgQWJzdHJhY3RUeXBlPD8+PiB0eXBlTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8PihsZW5ndGgpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIG5hbWUgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFZJbnRMZW5ndGgoaW4pOwotICAgICAgICAgICAgICAgIHR5cGVNYXAucHV0KG5hbWUsIHJlYWRUeXBlKGluKSk7CisgICAgICAgICAgICAgICAgdHlwZU1hcC5wdXQobmFtZSwgdHlwZVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4pKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB3cml0ZVR5cGUoQWJzdHJhY3RUeXBlPD8+IHR5cGUsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHdlIHNob3VsZCBoYXZlIGEgdGVyc2VyIHNlcmlhbGl6YWlvbiBmb3JtYXQuIE5vdCBhIGJpZyBkZWFsIHRob3VnaAotICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoVkludExlbmd0aChVVEY4VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UodHlwZS50b1N0cmluZygpKSwgb3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQWJzdHJhY3RUeXBlPD8+IHJlYWRUeXBlKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBCeXRlQnVmZmVyIHJhdyA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoVkludExlbmd0aChpbik7Ci0gICAgICAgICAgICByZXR1cm4gVHlwZVBhcnNlci5wYXJzZShVVEY4VHlwZS5pbnN0YW5jZS5jb21wb3NlKHJhdykpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgc2l6ZW9mVHlwZShBYnN0cmFjdFR5cGU8Pz4gdHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLnNlcmlhbGl6ZWRTaXplV2l0aFZJbnRMZW5ndGgoVVRGOFR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKHR5cGUudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgcmV0dXJuIHR5cGVNYXA7CiAgICAgICAgIH0KICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU2luZ2xlUGFydGl0aW9uUmVhZENvbW1hbmQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NpbmdsZVBhcnRpdGlvblJlYWRDb21tYW5kLmphdmEKaW5kZXggOTYzYjlmZS4uZDg1ZTJmZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU2luZ2xlUGFydGl0aW9uUmVhZENvbW1hbmQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZC5qYXZhCkBAIC0xOSw3ICsxOSwxMiBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk5hdmlnYWJsZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKQEAgLTMwLDE4ICszNSwzNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLlJvd0NhY2hlS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLlJvd0NhY2hlU2VudGluZWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ2x1c3RlcmluZ0luZGV4RmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5DbHVzdGVyaW5nSW5kZXhOYW1lc0ZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ2x1c3RlcmluZ0luZGV4U2xpY2VGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuRGF0YUxpbWl0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuUm93RmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5TU1RhYmxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5WaWV3OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5DYWNoZWRCVHJlZVBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkNhY2hlZFBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkltbXV0YWJsZUJUcmVlUGFydGl0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25JdGVyYXRvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5TaW5nbGV0b25VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5XcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uUlRCb3VuZFZhbGlkYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uVHJhbnNmb3JtYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5WaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLlZpcnR1YWxUYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlcXVlc3RFeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuVGFibGVNZXRyaWNzOwpAQCAtNDksNyArNzMsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuSW5kZXhNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DYWNoZVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VQcm94eTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFjaW5nLlRyYWNpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuQlRyZWVTZXQ7CkBAIC01MzgsMjAgKzU2NCwyNiBAQAogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGEgY3VzdG9tIGl0ZXJhdG9yIGluc3RlYWQgb2YgRGF0YUxpbWl0cyB0byBhdm9pZCBzdG9wcGluZyB0aGUgb3JpZ2luYWwgaXRlcmF0b3IKLSAgICAgICAgICAgICAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHRvQ2FjaGVJdGVyYXRvciA9IG5ldyBXcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvcihpdGVyKQorICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdG9DYWNoZUl0ZXJhdG9yID0gbmV3IFdyYXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yKCkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBpbnQgcm93c0NvdW50ZWQgPSAwOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3Igd3JhcHBlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvd3NDb3VudGVkIDwgcm93c1RvQ2FjaGUgJiYgc3VwZXIuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb3dzQ291bnRlZCA8IHJvd3NUb0NhY2hlICYmIGl0ZXIuaGFzTmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkIG5leHQoKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWQgdW5maWx0ZXJlZCA9IHN1cGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkIHVuZmlsdGVyZWQgPSBpdGVyLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodW5maWx0ZXJlZC5pc1JvdygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93IHJvdyA9IChSb3cpIHVuZmlsdGVyZWQ7CkBAIC03MTMsMTQgKzc0NSwyNiBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoc2hvdWxkSW5jbHVkZShzc3RhYmxlKSkKKyAgICAgICAgICAgICAgICBib29sZWFuIGludGVyc2VjdHMgPSBpbnRlcnNlY3RzKHNzdGFibGUpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzUmVxdWlyZWRTdGF0aWNzID0gaGFzUmVxdWlyZWRTdGF0aWNzKHNzdGFibGUpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMgPSBoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9ucyhzc3RhYmxlKTsKKworICAgICAgICAgICAgICAgIGlmICghaW50ZXJzZWN0cyAmJiAhaGFzUmVxdWlyZWRTdGF0aWNzICYmICFoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9ucykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5vbkludGVyc2VjdGluZ1NTVGFibGVzKys7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbnRlcnNlY3RzIHx8IGhhc1JlcXVpcmVkU3RhdGljcykKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghc3N0YWJsZS5pc1JlcGFpcmVkKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLnVwZGF0ZU1pbk9sZGVzdFVucmVwYWlyZWRUb21ic3RvbmUoc3N0YWJsZS5nZXRNaW5Mb2NhbERlbGV0aW9uVGltZSgpKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyAnaXRlcicgaXMgYWRkZWQgdG8gaXRlcmF0b3JzIHdoaWNoIGlzIGNsb3NlZCBvbiBleGNlcHRpb24sIG9yIHRocm91Z2ggdGhlIGNsb3Npbmcgb2YgdGhlIGZpbmFsIG1lcmdlZCBpdGVyYXRvcgogICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZCBpdGVyID0gbWFrZUl0ZXJhdG9yKGNmcywgc3N0YWJsZSwgbWV0cmljc0NvbGxlY3Rvcik7CisgICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyID0gaW50ZXJzZWN0cyA/IG1ha2VSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kKGNmcywgc3N0YWJsZSwgbWV0cmljc0NvbGxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWFrZVJvd0l0ZXJhdG9yV2l0aFNraXBwZWROb25TdGF0aWNDb250ZW50KGNmcywgc3N0YWJsZSwgbWV0cmljc0NvbGxlY3Rvcik7CisKICAgICAgICAgICAgICAgICAgICAgaW5wdXRDb2xsZWN0b3IuYWRkU1NUYWJsZUl0ZXJhdG9yKHNzdGFibGUsIGl0ZXIpOwogICAgICAgICAgICAgICAgICAgICBtb3N0UmVjZW50UGFydGl0aW9uVG9tYnN0b25lID0gTWF0aC5tYXgobW9zdFJlY2VudFBhcnRpdGlvblRvbWJzdG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLm1hcmtlZEZvckRlbGV0ZUF0KCkpOwpAQCAtNzI4LDI3ICs3NzIsMzAgQEAKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBub25JbnRlcnNlY3RpbmdTU1RhYmxlcysrOwotICAgICAgICAgICAgICAgICAgICAvLyBzc3RhYmxlIGNvbnRhaW5zIG5vIHRvbWJzdG9uZSBpZiBtYXhMb2NhbERlbGV0aW9uVGltZSA9PSBJbnRlZ2VyLk1BWF9WQUxVRSwgc28gd2UgY2FuIHNhZmVseSBza2lwIHRob3NlIGVudGlyZWx5Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzc3RhYmxlLm1heUhhdmVUb21ic3RvbmVzKCkpCisKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNzdGFibGUgY29udGFpbmVkIHJhbmdlIG9yIGNlbGwgdG9tYnN0b25lcywgaXQgd291bGQgaW50ZXJzZWN0OyBzaW5jZSB3ZSBhcmUgaGVyZSwgaXQgbWVhbnMKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGVyZSBhcmUgbm8gY2VsbCBvciByYW5nZSB0b21ic3RvbmVzIHdlIGFyZSBpbnRlcmVzdGVkIGluIChkdWUgdG8gdGhlIGZpbHRlcikKKyAgICAgICAgICAgICAgICAgICAgLy8gaG93ZXZlciwgd2Uga25vdyB0aGF0IHRoZXJlIGFyZSBwYXJ0aXRpb24gbGV2ZWwgZGVsZXRpb25zIGluIHRoaXMgc3N0YWJsZSBhbmQgd2UgbmVlZCB0byBtYWtlCisgICAgICAgICAgICAgICAgICAgIC8vIGFuIGl0ZXJhdG9yIGZpZ3VyZSBvdXQgdGhhdCAoc2VlIGBTdGF0c01ldGFkYXRhLmhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zYCkKKworICAgICAgICAgICAgICAgICAgICAvLyAnaXRlcicgaXMgYWRkZWQgdG8gaXRlcmF0b3JzIHdoaWNoIGlzIGNsb3NlZCBvbiBleGNlcHRpb24sIG9yIHRocm91Z2ggdGhlIGNsb3Npbmcgb2YgdGhlIGZpbmFsIG1lcmdlZCBpdGVyYXRvcgorICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlciA9IG1ha2VSb3dJdGVyYXRvcldpdGhTa2lwcGVkTm9uU3RhdGljQ29udGVudChjZnMsIHNzdGFibGUsIG1ldHJpY3NDb2xsZWN0b3IpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzc3RhYmxlIGNvbnRhaW5zIGEgcGFydGl0aW9uIGRlbGV0ZSwgdGhlbiB3ZSBtdXN0IGluY2x1ZGUgaXQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0CisgICAgICAgICAgICAgICAgICAgIC8vIHNoYWRvd3MgYW55IG90aGVyIGRhdGEgc2VlbiBsb2NhbGx5IGFzIHdlIGNhbid0IGd1YXJhbnRlZSB0aGF0IG90aGVyIHJlcGxpY2FzIGhhdmUgc2VlbiBpdAorICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZXIucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLmlzTGl2ZSgpKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAnaXRlcicgaXMgYWRkZWQgdG8gaXRlcmF0b3JzIHdoaWNoIGlzIGNsb3NlZCBvbiBleGNlcHRpb24sIG9yIHRocm91Z2ggdGhlIGNsb3Npbmcgb2YgdGhlIGZpbmFsIG1lcmdlZCBpdGVyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKLSAgICAgICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kIGl0ZXIgPSBtYWtlSXRlcmF0b3IoY2ZzLCBzc3RhYmxlLCBtZXRyaWNzQ29sbGVjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzc3RhYmxlIGNvbnRhaW5zIGEgcGFydGl0aW9uIGRlbGV0ZSwgdGhlbiB3ZSBtdXN0IGluY2x1ZGUgaXQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaGFkb3dzIGFueSBvdGhlciBkYXRhIHNlZW4gbG9jYWxseSBhcyB3ZSBjYW4ndCBndWFyYW50ZWUgdGhhdCBvdGhlciByZXBsaWNhcyBoYXZlIHNlZW4gaXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXRlci5wYXJ0aXRpb25MZXZlbERlbGV0aW9uKCkuaXNMaXZlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzc3RhYmxlLmlzUmVwYWlyZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci51cGRhdGVNaW5PbGRlc3RVbnJlcGFpcmVkVG9tYnN0b25lKHNzdGFibGUuZ2V0TWluTG9jYWxEZWxldGlvblRpbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDb2xsZWN0b3IuYWRkU1NUYWJsZUl0ZXJhdG9yKHNzdGFibGUsIGl0ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkRHVlVG9Ub21ic3RvbmVzKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9zdFJlY2VudFBhcnRpdGlvblRvbWJzdG9uZSA9IE1hdGgubWF4KG1vc3RSZWNlbnRQYXJ0aXRpb25Ub21ic3RvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLm1hcmtlZEZvckRlbGV0ZUF0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3N0YWJsZS5pc1JlcGFpcmVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci51cGRhdGVNaW5PbGRlc3RVbnJlcGFpcmVkVG9tYnN0b25lKHNzdGFibGUuZ2V0TWluTG9jYWxEZWxldGlvblRpbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dENvbGxlY3Rvci5hZGRTU1RhYmxlSXRlcmF0b3Ioc3N0YWJsZSwgaXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZER1ZVRvVG9tYnN0b25lcysrOworICAgICAgICAgICAgICAgICAgICAgICAgbW9zdFJlY2VudFBhcnRpdGlvblRvbWJzdG9uZSA9IE1hdGgubWF4KG1vc3RSZWNlbnRQYXJ0aXRpb25Ub21ic3RvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5wYXJ0aXRpb25MZXZlbERlbGV0aW9uKCkubWFya2VkRm9yRGVsZXRlQXQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC03NzksMzAgKzgyNiw1MiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEluY2x1ZGUoU1NUYWJsZVJlYWRlciBzc3RhYmxlKQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBib29sZWFuIGludGVyc2VjdHMoU1NUYWJsZVJlYWRlciBzc3RhYmxlKQogICAgIHsKLSAgICAgICAgLy8gSWYgc29tZSBzdGF0aWMgY29sdW1ucyBhcmUgcXVlcmllZCwgd2Ugc2hvdWxkIGFsd2F5cyBpbmNsdWRlIHRoZSBzc3RhYmxlOiB0aGUgY2x1c3RlcmluZyB2YWx1ZXMgc3RhdHMgb2YgdGhlIHNzdGFibGUKLSAgICAgICAgLy8gZG9uJ3QgdGVsbCB1cyBpZiB0aGUgc3N0YWJsZSBjb250YWlucyBzdGF0aWMgdmFsdWVzIGluIHBhcnRpY3VsYXIuCi0gICAgICAgIC8vIFRPRE86IHdlIGNvdWxkIHJlY29yZCBpZiBhIHNzdGFibGUgY29udGFpbnMgYW55IHN0YXRpYyB2YWx1ZSBhdCBhbGwuCi0gICAgICAgIGlmICghY29sdW1uRmlsdGVyKCkuZmV0Y2hlZENvbHVtbnMoKS5zdGF0aWNzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIHJldHVybiBjbHVzdGVyaW5nSW5kZXhGaWx0ZXIoKS5zaG91bGRJbmNsdWRlKHNzdGFibGUpOworICAgICAgICByZXR1cm4gY2x1c3RlcmluZ0luZGV4RmlsdGVyKCkuaW50ZXJzZWN0cyhzc3RhYmxlLm1ldGFkYXRhKCkuY29tcGFyYXRvciwgc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5jb3ZlcmVkQ2x1c3RlcmluZyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBVbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZCBtYWtlSXRlcmF0b3IoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICBwcml2YXRlIFVuZmlsdGVyZWRSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kIG1ha2VSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kKENvbHVtbkZhbWlseVN0b3JlIGNmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQogICAgIHsKICAgICAgICAgcmV0dXJuIFN0b3JhZ2VIb29rLmluc3RhbmNlLm1ha2VSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kKGNmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbktleSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbktleSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcmluZ0luZGV4RmlsdGVyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5GaWx0ZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKIAogICAgIH0KIAorICAgIHByaXZhdGUgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIG1ha2VSb3dJdGVyYXRvcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0luZGV4TmFtZXNGaWx0ZXIgY2x1c3RlcmluZ0luZGV4RmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICB7CisgICAgICAgIHJldHVybiBTdG9yYWdlSG9vay5pbnN0YW5jZS5tYWtlUm93SXRlcmF0b3IoY2ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uS2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcmluZ0luZGV4RmlsdGVyLmdldFNsaWNlcyhjZnMubWV0YWRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRmlsdGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcmluZ0luZGV4RmlsdGVyLmlzUmV2ZXJzZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBVbmZpbHRlcmVkUm93SXRlcmF0b3IgbWFrZVJvd0l0ZXJhdG9yV2l0aFNraXBwZWROb25TdGF0aWNDb250ZW50KENvbHVtbkZhbWlseVN0b3JlIGNmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICB7CisgICAgICAgIHJldHVybiBTdG9yYWdlSG9vay5pbnN0YW5jZS5tYWtlUm93SXRlcmF0b3IoY2ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uS2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2VzLk5PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRmlsdGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcmluZ0luZGV4RmlsdGVyKCkuaXNSZXZlcnNlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSB3cmFwcGVkIGl0ZXJhdG9yIHRoYXQgd2hlbiBjbG9zZWQgd2lsbCB1cGRhdGUgdGhlIHNzdGFibGVzIGl0ZXJhdGVkIGFuZCBSRUFEIHNhbXBsZSBtZXRyaWNzLgogICAgICAqIE5vdGUgdGhhdCB3ZSBjYW5ub3QgdXNlIHRoZSBUcmFuc2Zvcm1hdGlvbnMgZnJhbWV3b3JrIGJlY2F1c2UgdGhleSBncmVlZGlseSBnZXQgdGhlIHN0YXRpYyByb3csIHdoaWNoCkBAIC04MjAsNiArODg5LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IG1lcmdlZC5wYXJ0aXRpb25LZXkoKTsKICAgICAgICAgICAgIG1ldHJpY3MudG9wUmVhZFBhcnRpdGlvbkZyZXF1ZW5jeS5hZGRTYW1wbGUoa2V5LmdldEtleSgpLCAxKTsKKyAgICAgICAgICAgIG1ldHJpY3MudG9wUmVhZFBhcnRpdGlvblNTVGFibGVDb3VudC5hZGRTYW1wbGUoa2V5LmdldEtleSgpLCBtZXRyaWNzQ29sbGVjdG9yLmdldE1lcmdlZFNTVGFibGVzKCkpOwogICAgICAgICB9CiAKICAgICAgICAgY2xhc3MgVXBkYXRlU3N0YWJsZXNJdGVyYXRlZCBleHRlbmRzIFRyYW5zZm9ybWF0aW9uPFVuZmlsdGVyZWRSb3dJdGVyYXRvcj4KQEAgLTg5NCwyMyArOTY0LDIxIEBACiAgICAgICAgICAgICBpZiAoZmlsdGVyID09IG51bGwpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgIGlmICghc2hvdWxkSW5jbHVkZShzc3RhYmxlKSkKKyAgICAgICAgICAgIGJvb2xlYW4gaW50ZXJzZWN0cyA9IGludGVyc2VjdHMoc3N0YWJsZSk7CisgICAgICAgICAgICBib29sZWFuIGhhc1JlcXVpcmVkU3RhdGljcyA9IGhhc1JlcXVpcmVkU3RhdGljcyhzc3RhYmxlKTsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMgPSBoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9ucyhzc3RhYmxlKTsKKworICAgICAgICAgICAgaWYgKCFpbnRlcnNlY3RzICYmICFoYXNSZXF1aXJlZFN0YXRpY3MpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFuIHRoYXQgbm90aGluZyBxdWVyaWVkIGJ5IHRoZSBmaWx0ZXIgY2FuIGJlIGluIHRoZSBzc3RhYmxlLiBPbmUgZXhjZXB0aW9uIGlzIHRoZSB0b3AtbGV2ZWwgcGFydGl0aW9uIGRlbGV0aW9uCiAgICAgICAgICAgICAgICAgLy8gaG93ZXZlcjogaWYgaXQgaXMgc2V0LCBpdCBpbXBhY3RzIGV2ZXJ5dGhpbmcgYW5kIG11c3QgYmUgaW5jbHVkZWQuIEdldHRpbmcgdGhhdCB0b3AtbGV2ZWwgcGFydGl0aW9uIGRlbGV0aW9uIGNvc3RzIHVzCiAgICAgICAgICAgICAgICAgLy8gc29tZSBzZWVrIGluIGdlbmVyYWwgaG93ZXZlciAodW5sZXNzIHRoZSBwYXJ0aXRpb24gaXMgaW5kZXhlZCBhbmQgaXMgaW4gdGhlIGtleSBjYWNoZSksIHNvIHdlIGZpcnN0IGNoZWNrIGlmIHRoZSBzc3RhYmxlCiAgICAgICAgICAgICAgICAgLy8gaGFzIGFueSB0b21ic3RvbmUgYXQgYWxsIGFzIGEgc2hvcnRjdXQuCi0gICAgICAgICAgICAgICAgaWYgKCFzc3RhYmxlLm1heUhhdmVUb21ic3RvbmVzKCkpCisgICAgICAgICAgICAgICAgaWYgKCFoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9ucykKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIG5vIHRvbWJzdG9uZSBhdCBhbGwsIHdlIGNhbiBza2lwIHRoYXQgc3N0YWJsZQogCiAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBnZXQgdGhlIHBhcnRpdGlvbiBkZWxldGlvbiBhbmQgaW5jbHVkZSBpdCBpZiBpdCdzIGxpdmUuIEluIGFueSBjYXNlIHRob3VnaCwgd2UncmUgZG9uZSB3aXRoIHRoYXQgc3N0YWJsZS4KLSAgICAgICAgICAgICAgICB0cnkgKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyID0gU3RvcmFnZUhvb2suaW5zdGFuY2UubWFrZVJvd0l0ZXJhdG9yKGNmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25LZXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5nZXRTbGljZXMobWV0YWRhdGEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5GaWx0ZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5pc1JldmVyc2VkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzQ29sbGVjdG9yKSkKKyAgICAgICAgICAgICAgICB0cnkgKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyID0gbWFrZVJvd0l0ZXJhdG9yV2l0aFNraXBwZWROb25TdGF0aWNDb250ZW50KGNmcywgc3N0YWJsZSwgbWV0cmljc0NvbGxlY3RvcikpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZXIucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLmlzTGl2ZSgpKQogICAgICAgICAgICAgICAgICAgICB7CkBAIC05MzcsMTMgKzEwMDUsNyBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB0cnkgKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyID0gU3RvcmFnZUhvb2suaW5zdGFuY2UubWFrZVJvd0l0ZXJhdG9yKGNmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uS2V5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5nZXRTbGljZXMobWV0YWRhdGEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkZpbHRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuaXNSZXZlcnNlZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzQ29sbGVjdG9yKSkKKyAgICAgICAgICAgIHRyeSAoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXIgPSBtYWtlUm93SXRlcmF0b3IoY2ZzLCBzc3RhYmxlLCBmaWx0ZXIsIG1ldHJpY3NDb2xsZWN0b3IpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChpdGVyLmlzRW1wdHkoKSkKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC05NjMsNiArMTAyNSw3IEBACiAKICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IHJlc3VsdC5wYXJ0aXRpb25LZXkoKTsKICAgICAgICAgY2ZzLm1ldHJpYy50b3BSZWFkUGFydGl0aW9uRnJlcXVlbmN5LmFkZFNhbXBsZShrZXkuZ2V0S2V5KCksIDEpOworICAgICAgICBjZnMubWV0cmljLnRvcFJlYWRQYXJ0aXRpb25TU1RhYmxlQ291bnQuYWRkU2FtcGxlKGtleS5nZXRLZXkoKSwgbWV0cmljc0NvbGxlY3Rvci5nZXRNZXJnZWRTU1RhYmxlcygpKTsKICAgICAgICAgU3RvcmFnZUhvb2suaW5zdGFuY2UucmVwb3J0UmVhZChjZnMubWV0YWRhdGEuaWQsIHBhcnRpdGlvbktleSgpKTsKIAogICAgICAgICByZXR1cm4gcmVzdWx0LnVuZmlsdGVyZWRJdGVyYXRvcihjb2x1bW5GaWx0ZXIoKSwgU2xpY2VzLkFMTCwgY2x1c3RlcmluZ0luZGV4RmlsdGVyKCkuaXNSZXZlcnNlZCgpKTsKQEAgLTEwMjMsNyArMTA4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0b1JlbW92ZSA9IG5ldyBUcmVlU2V0PD4ocmVzdWx0Lm1ldGFkYXRhKCkuY29tcGFyYXRvcik7CiAgICAgICAgICAgICAgICAgICAgIHRvUmVtb3ZlLmFkZChjbHVzdGVyaW5nKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IAorICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdHJ5IChVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IgPSByZXN1bHQudW5maWx0ZXJlZEl0ZXJhdG9yKGNvbHVtbkZpbHRlcigpLCBjbHVzdGVyaW5ncywgZmFsc2UpKQpAQCAtMTI3Niw3ICsxMzM5LDcgQEAKICAgICAgICAgcHJpdmF0ZSBpbnQgbWVyZ2VkU1NUYWJsZXM7CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU1NUYWJsZVNlbGVjdGVkKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgUm93SW5kZXhFbnRyeTw/PiBpbmRleEVudHJ5LCBTZWxlY3Rpb25SZWFzb24gcmVhc29uKQorICAgICAgICBwdWJsaWMgdm9pZCBvblNTVGFibGVTZWxlY3RlZChTU1RhYmxlUmVhZGVyIHNzdGFibGUsIFNlbGVjdGlvblJlYXNvbiByZWFzb24pCiAgICAgICAgIHsKICAgICAgICAgICAgIHNzdGFibGUuaW5jcmVtZW50UmVhZENvdW50KCk7CiAgICAgICAgICAgICBtZXJnZWRTU1RhYmxlcysrOwpAQCAtMTMzNyw0ICsxNDAwLDQgQEAKICAgICAgICAgICAgIHJldHVybiBleGVjdXRpb25Db250cm9sbGVyKCk7CiAgICAgICAgIH0KICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU2xpY2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NsaWNlLmphdmEKaW5kZXggZTJjNzg3ZC4uMWZjNjBiYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU2xpY2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TbGljZS5qYXZhCkBAIC0xOSwyNCArMTksMjggQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNvbXBhcmFibGVzOwogCiAvKioKICAqIEEgc2xpY2UgcmVwcmVzZW50cyB0aGUgc2VsZWN0aW9uIG9mIGEgcmFuZ2Ugb2Ygcm93cy4KICAqIDxwPgogICogQSBzbGljZSBoYXMgYSBzdGFydCBhbmQgYW4gZW5kIGJvdW5kIHRoYXQgYXJlIGJvdGggKHBvdGVudGlhbGx5IGZ1bGwpIGNsdXN0ZXJpbmcgcHJlZml4ZXMuCi0gKiBBIHNsaWNlIHNlbGVjdHMgZXZlcnkgcm93cyB3aG9zZSBjbHVzdGVyaW5nIGlzIGJpZ2dlciB0aGFuIHRoZSBzbGljZSBzdGFydCBwcmVmaXggYnV0IHNtYWxsZXIKLSAqIHRoYW4gdGhlIGVuZCBwcmVmaXguIEJvdGggc3RhcnQgYW5kIGVuZCBjYW4gYmUgZWl0aGVyIGluY2x1c2l2ZSBvciBleGNsdXNpdmUuCisgKiBBIHNsaWNlIHNlbGVjdHMgZXZlcnkgcm93IHdob3NlIGNsdXN0ZXJpbmcgaXMgaW5jbHVkZWQgd2l0aGluIGl0cyBzdGFydCBhbmQgZW5kIGJvdW5kcy4KKyAqIEJvdGggc3RhcnQgYW5kIGVuZCBjYW4gYmUgZWl0aGVyIGluY2x1c2l2ZSBvciBleGNsdXNpdmUuCiAgKi8KIHB1YmxpYyBjbGFzcyBTbGljZQogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFNlcmlhbGl6ZXIoKTsKIAotICAgIC8qKiBUaGUgc2xpY2Ugc2VsZWN0aW5nIGFsbCByb3dzIChvZiBhIGdpdmVuIHBhcnRpdGlvbikgKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc2xpY2Ugc2VsZWN0aW5nIGFsbCByb3dzIChvZiBhIGdpdmVuIHBhcnRpdGlvbikKKyAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNsaWNlIEFMTCA9IG5ldyBTbGljZShCdWZmZXJDbHVzdGVyaW5nQm91bmQuQk9UVE9NLCBCdWZmZXJDbHVzdGVyaW5nQm91bmQuVE9QKQogICAgIHsKICAgICAgICAgQE92ZXJyaWRlCkBAIC00Niw5ICs1MCw5IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLCBMaXN0PEJ5dGVCdWZmZXI+IG1pbkNsdXN0ZXJpbmdWYWx1ZXMsIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWF4Q2x1c3RlcmluZ1ZhbHVlcykKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLCBTbGljZSBvdGhlcikKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm4gIW90aGVyLmlzRW1wdHkoY29tcGFyYXRvcik7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTkxLDYgKzk1LDkgQEAKICAgICAgICAgcmV0dXJuIG5ldyBTbGljZShidWlsZGVyLmJ1aWxkQm91bmQodHJ1ZSwgdHJ1ZSksIGJ1aWxkZXIuYnVpbGRCb3VuZChmYWxzZSwgdHJ1ZSkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE1ha2VzIGEgc2xpY2UgY292ZXJpbmcgYSBzaW5nbGUgY2x1c3RlcmluZworICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgU2xpY2UgbWFrZShDbHVzdGVyaW5nPD8+IGNsdXN0ZXJpbmcpCiAgICAgewogICAgICAgICAvLyBUaGlzIGRvZXNuJ3QgZ2l2ZSB1cyB3aGF0IHdlIHdhbnQgd2l0aCB0aGUgY2x1c3RlcmluZyBwcmVmaXgKQEAgLTk4LDE0ICsxMDUsMjUgQEAKICAgICAgICAgcmV0dXJuIG5ldyBTbGljZShDbHVzdGVyaW5nQm91bmQuaW5jbHVzaXZlU3RhcnRPZihjbHVzdGVyaW5nKSwgQ2x1c3RlcmluZ0JvdW5kLmluY2x1c2l2ZUVuZE9mKGNsdXN0ZXJpbmcpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBNYWtlcyBhIHNsaWNlIGNvdmVyaW5nIGEgcmFuZ2UgZnJvbSBzdGFydCB0byBlbmQgY2x1c3RlcmluZ3MsIHdpdGggYm90aCBzdGFydCBhbmQgZW5kIGluY2x1ZGVkCisgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTbGljZSBtYWtlKENsdXN0ZXJpbmc8Pz4gc3RhcnQsIENsdXN0ZXJpbmc8Pz4gZW5kKQogICAgIHsKICAgICAgICAgLy8gVGhpcyBkb2Vzbid0IGdpdmUgdXMgd2hhdCB3ZSB3YW50IHdpdGggdGhlIGNsdXN0ZXJpbmcgcHJlZml4CiAgICAgICAgIGFzc2VydCBzdGFydCAhPSBDbHVzdGVyaW5nLlNUQVRJQ19DTFVTVEVSSU5HICYmIGVuZCAhPSBDbHVzdGVyaW5nLlNUQVRJQ19DTFVTVEVSSU5HOwotCiAgICAgICAgIHJldHVybiBuZXcgU2xpY2UoQ2x1c3RlcmluZ0JvdW5kLmluY2x1c2l2ZVN0YXJ0T2Yoc3RhcnQpLCBDbHVzdGVyaW5nQm91bmQuaW5jbHVzaXZlRW5kT2YoZW5kKSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogTWFrZXMgYSBzbGljZSBmb3IgdGhlIGdpdmVuIGJvdW5kcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2xpY2UgbWFrZShDbHVzdGVyaW5nQm91bmRPckJvdW5kYXJ5PD8+IHN0YXJ0LCBDbHVzdGVyaW5nQm91bmRPckJvdW5kYXJ5PD8+IGVuZCkKKyAgICB7CisgICAgICAgIC8vIFRoaXMgZG9lc24ndCBnaXZlIHVzIHdoYXQgd2Ugd2FudCB3aXRoIHRoZSBjbHVzdGVyaW5nIHByZWZpeAorICAgICAgICByZXR1cm4gbWFrZShzdGFydC5hc1N0YXJ0Qm91bmQoKSwgZW5kLmFzRW5kQm91bmQoKSk7CisgICAgfQorCiAgICAgcHVibGljIENsdXN0ZXJpbmdCb3VuZDw/PiBzdGFydCgpCiAgICAgewogICAgICAgICByZXR1cm4gc3RhcnQ7CkBAIC0xNDEsMzEgKzE1OSwyMyBAQAogICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBzbGljZSBmb3JtZWQgYnkgdGhlIHR3byBwcm92aWRlZCBib3VuZCBpcyBlbXB0eSBvciBub3QuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29tcGFyYXRvciB0aGUgY29tcGFyYXRvciB0byBjb21wYXJlIHRoZSBib3VuZHMuCi0gICAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBmb3IgdGhlIHNsaWNlIHRvIGNvbnNpZGVyLiBUaGlzIG11c3QgYmUgYSBzdGFydCBib3VuZC4KLSAgICAgKiBAcGFyYW0gZW5kIHRoZSBlbmQgZm9yIHRoZSBzbGljZSB0byBjb25zaWRlci4gVGhpcyBtdXN0IGJlIGFuIGVuZCBib3VuZC4KKyAgICAgKiBAcGFyYW0gc3RhcnQgICAgICB0aGUgc3RhcnQgZm9yIHRoZSBzbGljZSB0byBjb25zaWRlci4gVGhpcyBtdXN0IGJlIGEgc3RhcnQgYm91bmQuCisgICAgICogQHBhcmFtIGVuZCAgICAgICAgdGhlIGVuZCBmb3IgdGhlIHNsaWNlIHRvIGNvbnNpZGVyLiBUaGlzIG11c3QgYmUgYW4gZW5kIGJvdW5kLgogICAgICAqIEByZXR1cm4gd2hldGhlciB0aGUgc2xpY2UgZm9ybWVkIGJ5IHtAY29kZSBzdGFydH0gYW5kIHtAY29kZSBlbmR9IGlzCiAgICAgICogZW1wdHkgb3Igbm90LgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VtcHR5KENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsIENsdXN0ZXJpbmdCb3VuZDw/PiBzdGFydCwgQ2x1c3RlcmluZ0JvdW5kPD8+IGVuZCkKICAgICB7CiAgICAgICAgIGFzc2VydCBzdGFydC5pc1N0YXJ0KCkgJiYgZW5kLmlzRW5kKCk7Ci0KLSAgICAgICAgaW50IGNtcCA9IGNvbXBhcmF0b3IuY29tcGFyZShzdGFydCwgZW5kKTsKLQotICAgICAgICBpZiAoY21wIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgZWxzZSBpZiAoY21wID4gMCkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gc3RhcnQuaXNFeGNsdXNpdmUoKSB8fCBlbmQuaXNFeGNsdXNpdmUoKTsKKyAgICAgICAgLy8gTm90ZTogdGhlIGNvbXBhcmF0b3Igb3JkZXJzIGluY2x1c2l2ZSBzdGFydHMgYW5kIGV4Y2x1c2l2ZSBlbmRzIGFzIGVxdWFsLCBhbmQgaW5jbHVzaXZlIGVuZHMgYXMgYmVpbmcgZ3JlYXRlciB0aGFuIHN0YXJ0cy4KKyAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IuY29tcGFyZShzdGFydCwgZW5kKSA+PSAwOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFJldHVybnMgd2hldGhlciBhIGdpdmVuIGNsdXN0ZXJpbmcgb3IgYm91bmQgaXMgaW5jbHVkZWQgaW4gdGhpcyBzbGljZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIHRoZSBjb21wYXJhdG9yIGZvciB0aGUgdGFibGUgdGhpcyBpcyBhIHNsaWNlIG9mLgotICAgICAqIEBwYXJhbSBib3VuZCB0aGUgYm91bmQgdG8gdGVzdCBpbmNsdXNpb24gb2YuCi0gICAgICoKKyAgICAgKiBAcGFyYW0gYm91bmQgICAgICB0aGUgYm91bmQgdG8gdGVzdCBpbmNsdXNpb24gb2YuCiAgICAgICogQHJldHVybiB3aGV0aGVyIHtAY29kZSBib3VuZH0gaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhpcyBzbGljZS4KICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLCBDbHVzdGVyaW5nUHJlZml4PD8+IGJvdW5kKQpAQCAtMTc2LDEzICsxODYsMTIgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgc2xpY2UgZm9yIGNvbnRpbnVpbmcgcGFnaW5nIGZyb20gdGhlIGxhc3QgcmV0dXJuZWQgY2x1c3RlcmluZyBwcmVmaXguCiAgICAgICoKLSAgICAgKiBAcGFyYW0gY29tcGFyYXRvciB0aGUgY29tcGFyYXRvciBmb3IgdGhlIHRhYmxlIHRoaXMgaXMgYSBmaWx0ZXIgZm9yLgorICAgICAqIEBwYXJhbSBjb21wYXJhdG9yICAgdGhlIGNvbXBhcmF0b3IgZm9yIHRoZSB0YWJsZSB0aGlzIGlzIGEgZmlsdGVyIGZvci4KICAgICAgKiBAcGFyYW0gbGFzdFJldHVybmVkIHRoZSBsYXN0IGNsdXN0ZXJpbmcgdGhhdCB3YXMgcmV0dXJuZWQgZm9yIHRoZSBxdWVyeSB3ZSBhcmUgcGFnaW5nIGZvci4gVGhlCi0gICAgICogcmVzdWx0aW5nIHNsaWNlcyB3aWxsIGJlIHN1Y2ggdGhhdCBvbmx5IHJlc3VsdHMgY29taW5nIHN0cmljbHkgYWZ0ZXIge0Bjb2RlIGxhc3RSZXR1cm5lZH0gYXJlIHJldHVybmVkCi0gICAgICogKHdoZXJlIGNvbWluZyBhZnRlciBtZWFucyAiZ3JlYXRlciB0aGFuIiBpZiB7QGNvZGUgIXJldmVyc2VkfSBhbmQgImxlc3NlciB0aGFuIiBvdGhlcndpc2UpLgotICAgICAqIEBwYXJhbSBpbmNsdXNpdmUgd2hldGhlciBvciBub3Qgd2Ugd2FudCB0byBpbmNsdWRlIHRoZSB7QGNvZGUgbGFzdFJldHVybmVkfSBpbiB0aGUgbmV3bHkgcmV0dXJuZWQgcGFnZSBvZiByZXN1bHRzLgotICAgICAqIEBwYXJhbSByZXZlcnNlZCB3aGV0aGVyIHRoZSBxdWVyeSB3ZSdyZSBwYWdpbmcgZm9yIGlzIHJldmVyc2VkIG9yIG5vdC4KLSAgICAgKgorICAgICAqICAgICAgICAgICAgICAgICAgICAgcmVzdWx0aW5nIHNsaWNlcyB3aWxsIGJlIHN1Y2ggdGhhdCBvbmx5IHJlc3VsdHMgY29taW5nIHN0cmljbHkgYWZ0ZXIge0Bjb2RlIGxhc3RSZXR1cm5lZH0gYXJlIHJldHVybmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAod2hlcmUgY29taW5nIGFmdGVyIG1lYW5zICJncmVhdGVyIHRoYW4iIGlmIHtAY29kZSAhcmV2ZXJzZWR9IGFuZCAibGVzc2VyIHRoYW4iIG90aGVyd2lzZSkuCisgICAgICogQHBhcmFtIGluY2x1c2l2ZSAgICB3aGV0aGVyIHdlIHdhbnQgdG8gaW5jbHVkZSB0aGUge0Bjb2RlIGxhc3RSZXR1cm5lZH0gaW4gdGhlIG5ld2x5IHJldHVybmVkIHBhZ2Ugb2YgcmVzdWx0cy4KKyAgICAgKiBAcGFyYW0gcmV2ZXJzZWQgICAgIHdoZXRoZXIgdGhlIHF1ZXJ5IHdlJ3JlIHBhZ2luZyBmb3IgaXMgcmV2ZXJzZWQgb3Igbm90LgogICAgICAqIEByZXR1cm4gYSBuZXcgc2xpY2UgdGhhdCBzZWxlY3RzIHJlc3VsdHMgY29taW5nIGFmdGVyIHtAY29kZSBsYXN0UmV0dXJuZWR9LCBvciB7QGNvZGUgbnVsbH0gaWYgcGFnaW5nCiAgICAgICogdGhlIHJlc3VsdGluZyBzbGljZSBzZWxlY3RzIG5vdGhpbmcgKGkuZS4gaWYgaXQgb3JpZ2luYWxseSBzZWxlY3RzIG5vdGhpbmcgY29taW5nIGFmdGVyIHtAY29kZSBsYXN0UmV0dXJuZWR9KS4KICAgICAgKi8KQEAgLTIyOSwyMCArMjM4LDE4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2l2ZW4gdGhlIHBlci1jbHVzdGVyaW5nIGNvbHVtbiBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlIGEgc3N0YWJsZSBjb250YWlucywgd2hldGhlciBvciBub3QgdGhpcyBzbGljZSBwb3RlbnRpYWxseQotICAgICAqIGludGVyc2VjdHMgdGhhdCBzc3RhYmxlIG9yIG5vdC4KKyAgICAgKiBXaGV0aGVyIHRoaXMgc2xpY2UgYW5kIHRoZSBwcm92aWRlZCBzbGljZSBpbnRlcnNlY3RzLgogICAgICAqCiAgICAgICogQHBhcmFtIGNvbXBhcmF0b3IgdGhlIGNvbXBhcmF0b3IgZm9yIHRoZSB0YWJsZSB0aGlzIGlzIGEgc2xpY2Ugb2YuCi0gICAgICogQHBhcmFtIG1pbkNsdXN0ZXJpbmdWYWx1ZXMgdGhlIHNtYWxsZXN0IHZhbHVlcyBmb3IgZWFjaCBjbHVzdGVyaW5nIGNvbHVtbiB0aGF0IGEgc3N0YWJsZSBjb250YWlucy4KLSAgICAgKiBAcGFyYW0gbWF4Q2x1c3RlcmluZ1ZhbHVlcyB0aGUgYmlnZ2VzdCB2YWx1ZXMgZm9yIGVhY2ggY2x1c3RlcmluZyBjb2x1bW4gdGhhdCBhIHNzdGFibGUgY29udGFpbnMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHNsaWNlIG1pZ2h0IGludGVyc2VjdHMgd2l0aCB0aGUgc3N0YWJsZSBoYXZpbmcge0Bjb2RlIG1pbkNsdXN0ZXJpbmdWYWx1ZXN9IGFuZAotICAgICAqIHtAY29kZSBtYXhDbHVzdGVyaW5nVmFsdWVzfS4KKyAgICAgKiBAcGFyYW0gb3RoZXIgICAgICB0aGUgb3RoZXIgc2xpY2UgdG8gY2hlY2sgaW50ZXJzZWN0aW9uIHdpdGguCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgc2xpY2UgaW50ZXJzZWN0cyB7QGNvZGUgb3RoZXJ9LgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwgTGlzdDxCeXRlQnVmZmVyPiBtaW5DbHVzdGVyaW5nVmFsdWVzLCBMaXN0PEJ5dGVCdWZmZXI+IG1heENsdXN0ZXJpbmdWYWx1ZXMpCisgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLCBTbGljZSBvdGhlcikKICAgICB7Ci0gICAgICAgIC8vIElmIHRoaXMgc2xpY2Ugc3RhcnRzIGFmdGVyIG1heCBjbHVzdGVyaW5nIG9yIGVuZHMgYmVmb3JlIG1pbiBjbHVzdGVyaW5nLCBpdCBjYW4ndCBpbnRlcnNlY3QKLSAgICAgICAgcmV0dXJuIHN0YXJ0LmNvbXBhcmVUbyhjb21wYXJhdG9yLCBtYXhDbHVzdGVyaW5nVmFsdWVzKSA8PSAwICYmIGVuZC5jb21wYXJlVG8oY29tcGFyYXRvciwgbWluQ2x1c3RlcmluZ1ZhbHVlcykgPj0gMDsKKyAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBzbGljZXMgYW5kIGNoZWNrIGlmIGl0IGlzIG5vbi1lbXB0eS4KKyAgICAgICAgLy8gVGhpcyBhbHNvIHdvcmtzIGNvcnJlY3RseSB3aGVuIG9uZSBvciBtb3JlIG9mIHRoZSBpbnB1dHMgYXJlIGJlIGVtcHR5IChpLmUuIHdpdGggZW5kIDw9IHN0YXJ0KS4KKyAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IuY29tcGFyZShDb21wYXJhYmxlcy5tYXgoc3RhcnQsIG90aGVyLnN0YXJ0LCBjb21wYXJhdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJhYmxlcy5taW4oZW5kLCBvdGhlci5lbmQsIGNvbXBhcmF0b3IpKSA8IDA7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yKQpAQCAtMjY5LDEyICsyNzYsMTIgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKQogICAgIHsKLSAgICAgICAgaWYoIShvdGhlciBpbnN0YW5jZW9mIFNsaWNlKSkKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBTbGljZSkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgU2xpY2UgdGhhdCA9IChTbGljZSlvdGhlcjsKKyAgICAgICAgU2xpY2UgdGhhdCA9IChTbGljZSkgb3RoZXI7CiAgICAgICAgIHJldHVybiB0aGlzLnN0YXJ0KCkuZXF1YWxzKHRoYXQuc3RhcnQoKSkKLSAgICAgICAgICAgICYmIHRoaXMuZW5kKCkuZXF1YWxzKHRoYXQuZW5kKCkpOworICAgICAgICAgICAgICAgJiYgdGhpcy5lbmQoKS5lcXVhbHModGhhdC5lbmQoKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yOTQsNyArMzAxLDcgQEAKICAgICAgICAgcHVibGljIGxvbmcgc2VyaWFsaXplZFNpemUoU2xpY2Ugc2xpY2UsIGludCB2ZXJzaW9uLCBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gdHlwZXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBDbHVzdGVyaW5nQm91bmQuc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShzbGljZS5zdGFydCwgdmVyc2lvbiwgdHlwZXMpCi0gICAgICAgICAgICAgICAgICsgQ2x1c3RlcmluZ0JvdW5kLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoc2xpY2UuZW5kLCB2ZXJzaW9uLCB0eXBlcyk7CisgICAgICAgICAgICAgICAgICAgKyBDbHVzdGVyaW5nQm91bmQuc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShzbGljZS5lbmQsIHZlcnNpb24sIHR5cGVzKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBTbGljZSBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbiwgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzKSB0aHJvd3MgSU9FeGNlcHRpb24KQEAgLTMwNCw0ICszMTEsNCBAQAogICAgICAgICAgICAgcmV0dXJuIG5ldyBTbGljZShzdGFydCwgZW5kKTsKICAgICAgICAgfQogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TbGljZXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NsaWNlcy5qYXZhCmluZGV4IGIzZjU2ODEuLmJhZTgzZDUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NsaWNlcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NsaWNlcy5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhdG9yczsKQEAgLTU1LDcgKzU2LDcgQEAKICAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIFNsaWNlc30gb2JqZWN0IHRoYXQgY29udGFpbnMgYSBzaW5nbGUgc2xpY2UuCiAgICAgICoKICAgICAgKiBAcGFyYW0gY29tcGFyYXRvciB0aGUgY29tcGFyYXRvciBmb3IgdGhlIHRhYmxlIHtAY29kZSBzbGljZX0gaXMgYSBzbGljZSBvZi4KLSAgICAgKiBAcGFyYW0gc2xpY2UgdGhlIHNpbmdsZSBzbGljZSB0aGF0IHRoZSByZXR1cm4gb2JqZWN0IHNob3VsZCBjb250YWlucy4KKyAgICAgKiBAcGFyYW0gc2xpY2UgdGhlIHNpbmdsZSBzbGljZSB0aGF0IHRoZSByZXR1cm4gb2JqZWN0IHNob3VsZCBjb250YWluLgogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCB7QGNvZGUgU2xpY2VzfSBvYmplY3QuCiAgICAgICovCkBAIC02OSwxNiArNzAsMTYgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXaGV0aGVyIHRoZSBzbGljZXMgaGFzIGEgbG93ZXIgYm91bmQsIHRoYXQgaXMgd2hldGhlciBpdCdzIGZpcnN0IHNsaWNlIHN0YXJ0IGlzIHtAY29kZSBTbGljZS5CT1RUT019LgorICAgICAqIFdoZXRoZXIgdGhlIHNsaWNlcyBpbnN0YW5jZSBoYXMgYSBsb3dlciBib3VuZCwgdGhhdCBpcyB3aGV0aGVyIGl0J3MgZmlyc3Qgc2xpY2Ugc3RhcnQgaXMge0Bjb2RlIFNsaWNlLkJPVFRPTX0uCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHNsaWNlcyBoYXMgYSBsb3dlciBib3VuZC4KKyAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBzbGljZXMgaW5zdGFuY2UgaGFzIGEgbG93ZXIgYm91bmQuCiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzTG93ZXJCb3VuZCgpOwogCiAgICAgLyoqCi0gICAgICogV2hldGhlciB0aGUgc2xpY2VzIGhhcyBhbiB1cHBlciBib3VuZCwgdGhhdCBpcyB3aGV0aGVyIGl0J3MgbGFzdCBzbGljZSBlbmQgaXMge0Bjb2RlIFNsaWNlLlRPUH0uCisgICAgICogV2hldGhlciB0aGUgc2xpY2VzIGluc3RhbmNlIGhhcyBhbiB1cHBlciBib3VuZCwgdGhhdCBpcyB3aGV0aGVyIGl0J3MgbGFzdCBzbGljZSBlbmQgaXMge0Bjb2RlIFNsaWNlLlRPUH0uCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHNsaWNlcyBoYXMgYW4gdXBwZXIgYm91bmQuCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgc2xpY2VzIGluc3RhbmNlIGhhcyBhbiB1cHBlciBib3VuZC4KICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNVcHBlckJvdW5kKCk7CiAKQEAgLTk2LDYgKzk3LDE2IEBACiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IFNsaWNlIGdldChpbnQgaSk7CiAKKyAgICBwdWJsaWMgQ2x1c3RlcmluZ0JvdW5kPD8+IHN0YXJ0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXQoMCkuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2x1c3RlcmluZ0JvdW5kPD8+IGVuZCgpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0KHNpemUoKSAtIDEpLmVuZCgpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJldHVybnMgc2xpY2VzIGZvciBjb250aW51aW5nIHRoZSBwYWdpbmcgb2YgdGhvc2Ugc2xpY2VzIGdpdmVuIHRoZSBsYXN0IHJldHVybmVkIGNsdXN0ZXJpbmcgcHJlZml4LgogICAgICAqCkBAIC0xMDMsNyArMTE0LDcgQEAKICAgICAgKiBAcGFyYW0gbGFzdFJldHVybmVkIHRoZSBsYXN0IGNsdXN0ZXJpbmcgdGhhdCB3YXMgcmV0dXJuZWQgZm9yIHRoZSBxdWVyeSB3ZSBhcmUgcGFnaW5nIGZvci4gVGhlCiAgICAgICogcmVzdWx0aW5nIHNsaWNlcyB3aWxsIGJlIHN1Y2ggdGhhdCBvbmx5IHJlc3VsdHMgY29taW5nIHN0cmljbHkgYWZ0ZXIge0Bjb2RlIGxhc3RSZXR1cm5lZH0gYXJlIHJldHVybmVkCiAgICAgICogKHdoZXJlIGNvbWluZyBhZnRlciBtZWFucyAiZ3JlYXRlciB0aGFuIiBpZiB7QGNvZGUgIXJldmVyc2VkfSBhbmQgImxlc3NlciB0aGFuIiBvdGhlcndpc2UpLgotICAgICAqIEBwYXJhbSBpbmNsdXNpdmUgd2hldGhlciBvciBub3Qgd2Ugd2FudCB0byBpbmNsdWRlIHRoZSB7QGNvZGUgbGFzdFJldHVybmVkfSBpbiB0aGUgbmV3bHkgcmV0dXJuZWQgcGFnZSBvZiByZXN1bHRzLgorICAgICAqIEBwYXJhbSBpbmNsdXNpdmUgd2hldGhlciB3ZSB3YW50IHRvIGluY2x1ZGUgdGhlIHtAY29kZSBsYXN0UmV0dXJuZWR9IGluIHRoZSBuZXdseSByZXR1cm5lZCBwYWdlIG9mIHJlc3VsdHMuCiAgICAgICogQHBhcmFtIHJldmVyc2VkIHdoZXRoZXIgdGhlIHF1ZXJ5IHdlJ3JlIHBhZ2luZyBmb3IgaXMgcmV2ZXJzZWQgb3Igbm90LgogICAgICAqCiAgICAgICogQHJldHVybiBuZXcgc2xpY2VzIHRoYXQgc2VsZWN0IHJlc3VsdHMgY29taW5nIGFmdGVyIHtAY29kZSBsYXN0UmV0dXJuZWR9LgpAQCAtMTMwLDE4ICsxNDEsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzZWxlY3RzKENsdXN0ZXJpbmc8Pz4gY2x1c3RlcmluZyk7CiAKLQogICAgIC8qKgotICAgICAqIEdpdmVuIHRoZSBwZXItY2x1c3RlcmluZyBjb2x1bW4gbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSBhIHNzdGFibGUgY29udGFpbnMsIHdoZXRoZXIgb3Igbm90IHRoaXMgc2xpY2VzIHBvdGVudGlhbGx5Ci0gICAgICogaW50ZXJzZWN0cyB0aGF0IHNzdGFibGUgb3Igbm90LgorICAgICAqIENoZWNrcyB3aGV0aGVyIGFueSBvZiB0aGUgc2xpY2VzIGludGVyc2VjdHMgd2l0aHQgdGhlIGdpdmVuIG9uZS4KICAgICAgKgotICAgICAqIEBwYXJhbSBtaW5DbHVzdGVyaW5nVmFsdWVzIHRoZSBzbWFsbGVzdCB2YWx1ZXMgZm9yIGVhY2ggY2x1c3RlcmluZyBjb2x1bW4gdGhhdCBhIHNzdGFibGUgY29udGFpbnMuCi0gICAgICogQHBhcmFtIG1heENsdXN0ZXJpbmdWYWx1ZXMgdGhlIGJpZ2dlc3QgdmFsdWVzIGZvciBlYWNoIGNsdXN0ZXJpbmcgY29sdW1uIHRoYXQgYSBzc3RhYmxlIGNvbnRhaW5zLgotICAgICAqCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBzbGljZXMgbWlnaHQgaW50ZXJzZWN0cyB3aXRoIHRoZSBzc3RhYmxlIGhhdmluZyB7QGNvZGUgbWluQ2x1c3RlcmluZ1ZhbHVlc30gYW5kCi0gICAgICoge0Bjb2RlIG1heENsdXN0ZXJpbmdWYWx1ZXN9LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZXJlIGV4aXN0cyBhIHNsaWNlIHdoaWNoICh7QGxpbmsgU2xpY2UjaW50ZXJzZWN0cyhDbHVzdGVyaW5nQ29tcGFyYXRvciwgU2xpY2UpfSkgd2l0aAorICAgICAqIHRoZSBwcm92aWRlZCBzbGljZQogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGludGVyc2VjdHMoTGlzdDxCeXRlQnVmZmVyPiBtaW5DbHVzdGVyaW5nVmFsdWVzLCBMaXN0PEJ5dGVCdWZmZXI+IG1heENsdXN0ZXJpbmdWYWx1ZXMpOworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGludGVyc2VjdHMoU2xpY2Ugc2xpY2UpOwogCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyB0b0NRTFN0cmluZyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBSb3dGaWx0ZXIgcm93RmlsdGVyKTsKIApAQCAtMTU3LDEyICsxNjMsMTIgQEAKICAgICAvKioKICAgICAgKiBJbiBzaW1wbGUgb2JqZWN0IHRoYXQgYWxsb3dzIHRvIHRlc3QgdGhlIGluY2x1c2lvbiBvZiByb3dzIGluIHRob3NlIHNsaWNlcyBhc3N1bWluZyB0aG9zZSByb3dzCiAgICAgICogYXJlIHBhc3NlZCAodG8ge0BsaW5rICNpbmNsdWRlc30pIGluIGNsdXN0ZXJpbmcgb3JkZXIgKG9yIHJldmVyc2UgY2x1c3RlcmluZyBvcmRlcmVkLCBkZXBlbmRpbmcKLSAgICAgKiBvZiB0aGUgYXJndW1lbnQgcGFzc2VkIHRvIHtAbGluayAjaW5PcmRlclRlc3Rlcn0pLgorICAgICAqIG9uIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8ge0BsaW5rICNpbk9yZGVyVGVzdGVyfSkuCiAgICAgICovCiAgICAgcHVibGljIGludGVyZmFjZSBJbk9yZGVyVGVzdGVyCiAgICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhDbHVzdGVyaW5nPD8+IHZhbHVlKTsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEb25lKCk7CisgICAgICAgIGJvb2xlYW4gaW5jbHVkZXMoQ2x1c3RlcmluZzw/PiB2YWx1ZSk7CisgICAgICAgIGJvb2xlYW4gaXNEb25lKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDMsMTcgKzI0OSwxMiBAQAogICAgICAgICAgICAgaWYgKHNsaWNlcy5zaXplKCkgPD0gMSkKICAgICAgICAgICAgICAgICByZXR1cm4gc2xpY2VzOwogCi0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNsaWNlcywgbmV3IENvbXBhcmF0b3I8U2xpY2U+KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoU2xpY2UgczEsIFNsaWNlIHMyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGMgPSBjb21wYXJhdG9yLmNvbXBhcmUoczEuc3RhcnQoKSwgczIuc3RhcnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgIHNsaWNlcy5zb3J0KChzMSwgczIpIC0+IHsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IGNvbXBhcmF0b3IuY29tcGFyZShzMS5zdGFydCgpLCBzMi5zdGFydCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYzsKIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyYXRvci5jb21wYXJlKHMxLmVuZCgpLCBzMi5lbmQoKSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJhdG9yLmNvbXBhcmUoczIuZW5kKCksIHMxLmVuZCgpKTsKICAgICAgICAgICAgIH0pOwogCiAgICAgICAgICAgICBMaXN0PFNsaWNlPiBzbGljZXNDb3B5ID0gbmV3IEFycmF5TGlzdDw+KHNsaWNlcy5zaXplKCkpOwpAQCAtMjc4LDEyICsyNzksNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlc1N0YXJ0KQotICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IFNsaWNlLm1ha2UobGFzdC5zdGFydCgpLCBzMi5lbmQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGFzc2VydCAhaW5jbHVkZXNGaW5pc2g7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNsaWNlc0NvcHkuYWRkKGxhc3QpOwpAQCAtMjk2LDEzICsyOTIsMTMgQEAKICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFNsaWNlcyBzbGljZXMsIERhdGFPdXRwdXRQbHVzIG91dCwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBpbnQgc2l6ZSA9IHNsaWNlcy5zaXplKCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoc2l6ZSk7CisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihzaXplKTsKIAogICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkKICAgICAgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiB0eXBlcyA9IHNsaWNlcyA9PSBBTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IENvbGxlY3Rpb25zLjxBYnN0cmFjdFR5cGU8Pz4+ZW1wdHlMaXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKEFycmF5QmFja2VkU2xpY2VzKXNsaWNlcykuY29tcGFyYXRvci5zdWJ0eXBlcygpOwogCiAgICAgICAgICAgICBmb3IgKFNsaWNlIHNsaWNlIDogc2xpY2VzKQpAQCAtMzE3LDcgKzMxMyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHNpemU7CiAKICAgICAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiB0eXBlcyA9IHNsaWNlcyBpbnN0YW5jZW9mIFNlbGVjdEFsbFNsaWNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuPEFic3RyYWN0VHlwZTw/Pj5lbXB0eUxpc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoQXJyYXlCYWNrZWRTbGljZXMpc2xpY2VzKS5jb21wYXJhdG9yLnN1YnR5cGVzKCk7CiAKICAgICAgICAgICAgIGZvciAoU2xpY2Ugc2xpY2UgOiBzbGljZXMpCkBAIC0zMjgsNyArMzI0LDcgQEAKIAogICAgICAgICBwdWJsaWMgU2xpY2VzIGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uLCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBzaXplID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAKICAgICAgICAgICAgIGlmIChzaXplID09IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PTkU7CkBAIC00NDEsMTEgKzQzNywxMiBAQAogICAgICAgICAgICAgcmV0dXJuIFNsaWNlcy5OT05FOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhMaXN0PEJ5dGVCdWZmZXI+IG1pbkNsdXN0ZXJpbmdWYWx1ZXMsIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWF4Q2x1c3RlcmluZ1ZhbHVlcykKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoU2xpY2Ugc2xpY2UpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoU2xpY2Ugc2xpY2UgOiB0aGlzKQorICAgICAgICAgICAgZm9yIChTbGljZSBzIDogdGhpcykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc2xpY2UuaW50ZXJzZWN0cyhjb21wYXJhdG9yLCBtaW5DbHVzdGVyaW5nVmFsdWVzLCBtYXhDbHVzdGVyaW5nVmFsdWVzKSkKKyAgICAgICAgICAgICAgICBpZiAocy5pbnRlcnNlY3RzKGNvbXBhcmF0b3IsIHNsaWNlKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC01NDAsMTUgKzUzNyw3IEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoInsiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2xpY2VzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzbGljZXNbaV0udG9TdHJpbmcoY29tcGFyYXRvcikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNiLmFwcGVuZCgifSIpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLnN0cmVhbShzbGljZXMpLm1hcChzIC0+IHMudG9TdHJpbmcoY29tcGFyYXRvcikpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIsICJ7IiwgIn0iKSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTYzNiw3ICs2MjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yID0gZmlyc3Quc3RhcnRJbmNsdXNpdmUgPyBPcGVyYXRvci5MVEUgOiBPcGVyYXRvci5MVDsKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9IGZpcnN0LnN0YXJ0SW5jbHVzaXZlID8gT3BlcmF0b3IuR1RFIDogT3BlcmF0b3IuR1Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKS5hcHBlbmQob3BlcmF0b3IudG9TdHJpbmcoKSkuYXBwZW5kKCcgJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpLmFwcGVuZChvcGVyYXRvcikuYXBwZW5kKCcgJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjb2x1bW4udHlwZS50b0NRTFN0cmluZyhmaXJzdC5zdGFydFZhbHVlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByb3dGaWx0ZXIgPSByb3dGaWx0ZXIud2l0aG91dChjb2x1bW4sIG9wZXJhdG9yLCBmaXJzdC5zdGFydFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjUwLDcgKzYzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgPSBmaXJzdC5lbmRJbmNsdXNpdmUgPyBPcGVyYXRvci5HVEUgOiBPcGVyYXRvci5HVDsKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciA9IGZpcnN0LmVuZEluY2x1c2l2ZSA/IE9wZXJhdG9yLkxURSA6IE9wZXJhdG9yLkxUOwotICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJykuYXBwZW5kKG9wZXJhdG9yLnRvU3RyaW5nKCkpLmFwcGVuZCgnICcpCisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKS5hcHBlbmQob3BlcmF0b3IpLmFwcGVuZCgnICcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY29sdW1uLnR5cGUudG9DUUxTdHJpbmcoZmlyc3QuZW5kVmFsdWUpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0ZpbHRlciA9IHJvd0ZpbHRlci53aXRob3V0KGNvbHVtbiwgb3BlcmF0b3IsIGZpcnN0LmVuZFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNjY3LDcgKzY1Niw3IEBACiAgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEFuIHNvbWV3aGF0IGFkaG9jIHV0aWxpdHkgY2xhc3Mgb25seSB1c2VkIGJ5IG5hbWVBc0NRTFN0cmluZworICAgICAgICAvLyBTb21ld2hhdCBhZGhvYyB1dGlsaXR5IGNsYXNzIG9ubHkgdXNlZCBieSBuYW1lQXNDUUxTdHJpbmcKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcG9uZW50T2ZTbGljZQogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzdGFydEluY2x1c2l2ZTsKQEAgLTc2OCw3ICs3NTcsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHRyaXZpYWxUZXN0ZXI7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKExpc3Q8Qnl0ZUJ1ZmZlcj4gbWluQ2x1c3RlcmluZ1ZhbHVlcywgTGlzdDxCeXRlQnVmZmVyPiBtYXhDbHVzdGVyaW5nVmFsdWVzKQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhTbGljZSBzbGljZSkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTg0NCw3ICs4MzQsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHRyaXZpYWxUZXN0ZXI7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKExpc3Q8Qnl0ZUJ1ZmZlcj4gbWluQ2x1c3RlcmluZ1ZhbHVlcywgTGlzdDxCeXRlQnVmZmVyPiBtYXhDbHVzdGVyaW5nVmFsdWVzKQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaW50ZXJzZWN0cyhTbGljZSBzbGljZSkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CkBAIC04NjYsNCArODU3LDQgQEAKICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgfQogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TbmFwc2hvdERldGFpbHNUYWJ1bGFyRGF0YS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU25hcHNob3REZXRhaWxzVGFidWxhckRhdGEuamF2YQppbmRleCA0ZTZhYjExLi5jNWRlYmU0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TbmFwc2hvdERldGFpbHNUYWJ1bGFyRGF0YS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NuYXBzaG90RGV0YWlsc1RhYnVsYXJEYXRhLmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIAogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLio7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5zbmFwc2hvdC5UYWJsZVNuYXBzaG90OwogCkBAIC0zMiw3ICszMSw4IEBACiAgICAgICAgICAgICAiVHJ1ZSBzaXplIiwKICAgICAgICAgICAgICJTaXplIG9uIGRpc2siLAogICAgICAgICAgICAgIkNyZWF0aW9uIHRpbWUiLAotICAgICAgICAgICAgIkV4cGlyYXRpb24gdGltZSIsfTsKKyAgICAgICAgICAgICJFeHBpcmF0aW9uIHRpbWUiLAorICAgICAgICAgICAgIkVwaGVtZXJhbCJ9OwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSVRFTV9ERVNDUyA9IG5ldyBTdHJpbmdbXXsic25hcHNob3RfbmFtZSIsCiAgICAgICAgICAgICAia2V5c3BhY2VfbmFtZSIsCkBAIC00MCw3ICs0MCw4IEBACiAgICAgICAgICAgICAiVHJ1ZURpc2tTcGFjZVVzZWQiLAogICAgICAgICAgICAgIlRvdGFsRGlza1NwYWNlVXNlZCIsCiAgICAgICAgICAgICAiY3JlYXRlZF9hdCIsCi0gICAgICAgICAgICAiZXhwaXJlc19hdCIsfTsKKyAgICAgICAgICAgICJleHBpcmVzX2F0IiwKKyAgICAgICAgICAgICJlcGhlbWVyYWwifTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05BTUUgPSAiU25hcHNob3REZXRhaWxzIjsKIApAQCAtNTYsNyArNTcsNyBAQAogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIElURU1fVFlQRVMgPSBuZXcgT3BlblR5cGVbXXsgU2ltcGxlVHlwZS5TVFJJTkcsIFNpbXBsZVR5cGUuU1RSSU5HLCBTaW1wbGVUeXBlLlNUUklORywgU2ltcGxlVHlwZS5TVFJJTkcsIFNpbXBsZVR5cGUuU1RSSU5HLCBTaW1wbGVUeXBlLlNUUklORywgU2ltcGxlVHlwZS5TVFJJTkcgfTsKKyAgICAgICAgICAgIElURU1fVFlQRVMgPSBuZXcgT3BlblR5cGVbXXsgU2ltcGxlVHlwZS5TVFJJTkcsIFNpbXBsZVR5cGUuU1RSSU5HLCBTaW1wbGVUeXBlLlNUUklORywgU2ltcGxlVHlwZS5TVFJJTkcsIFNpbXBsZVR5cGUuU1RSSU5HLCBTaW1wbGVUeXBlLlNUUklORywgU2ltcGxlVHlwZS5TVFJJTkcsIFNpbXBsZVR5cGUuU1RSSU5HIH07CiAKICAgICAgICAgICAgIENPTVBPU0lURV9UWVBFID0gbmV3IENvbXBvc2l0ZVR5cGUoVFlQRV9OQU1FLCBST1dfREVTQywgSVRFTV9OQU1FUywgSVRFTV9ERVNDUywgSVRFTV9UWVBFUyk7CiAKQEAgLTY0LDcgKzY1LDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNzcsOCArNzgsOSBAQAogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxpdmVTaXplID0gIEZpbGVVdGlscy5zdHJpbmdpZnlGaWxlU2l6ZShkZXRhaWxzLmNvbXB1dGVUcnVlU2l6ZUJ5dGVzKCkpOwogICAgICAgICAgICAgU3RyaW5nIGNyZWF0ZWRBdCA9IHNhZmVUb1N0cmluZyhkZXRhaWxzLmdldENyZWF0ZWRBdCgpKTsKICAgICAgICAgICAgIFN0cmluZyBleHBpcmVzQXQgPSBzYWZlVG9TdHJpbmcoZGV0YWlscy5nZXRFeHBpcmVzQXQoKSk7CisgICAgICAgICAgICBTdHJpbmcgZXBoZW1lcmFsID0gQm9vbGVhbi50b1N0cmluZyhkZXRhaWxzLmlzRXBoZW1lcmFsKCkpOwogICAgICAgICAgICAgcmVzdWx0LnB1dChuZXcgQ29tcG9zaXRlRGF0YVN1cHBvcnQoQ09NUE9TSVRFX1RZUEUsIElURU1fTkFNRVMsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgZGV0YWlscy5nZXRUYWcoKSwgZGV0YWlscy5nZXRLZXlzcGFjZU5hbWUoKSwgZGV0YWlscy5nZXRUYWJsZU5hbWUoKSwgbGl2ZVNpemUsIHRvdGFsU2l6ZSwgY3JlYXRlZEF0LCBleHBpcmVzQXQgfSkpOworICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IGRldGFpbHMuZ2V0VGFnKCksIGRldGFpbHMuZ2V0S2V5c3BhY2VOYW1lKCksIGRldGFpbHMuZ2V0VGFibGVOYW1lKCksIGxpdmVTaXplLCB0b3RhbFNpemUsIGNyZWF0ZWRBdCwgZXhwaXJlc0F0LCBlcGhlbWVyYWwgfSkpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TdG9yYWdlSG9vay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3RvcmFnZUhvb2suamF2YQppbmRleCBjOTk4MzM4Li5mNWZkZWM2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TdG9yYWdlSG9vay5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1N0b3JhZ2VIb29rLmphdmEKQEAgLTIzLDExICsyMywxMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uVXBkYXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1RPUkFHRV9IT09LOworCiBwdWJsaWMgaW50ZXJmYWNlIFN0b3JhZ2VIb29rCiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdG9yYWdlSG9vayBpbnN0YW5jZSA9IGNyZWF0ZUhvb2soKTsKQEAgLTM1LDExICszNywxMSBAQAogICAgIHB1YmxpYyB2b2lkIHJlcG9ydFdyaXRlKFRhYmxlSWQgdGFibGVJZCwgUGFydGl0aW9uVXBkYXRlIHBhcnRpdGlvblVwZGF0ZSk7CiAgICAgcHVibGljIHZvaWQgcmVwb3J0UmVhZChUYWJsZUlkIHRhYmxlSWQsIERlY29yYXRlZEtleSBrZXkpOwogICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZCBtYWtlUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZChDb2x1bW5GYW1pbHlTdG9yZSBjZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0luZGV4RmlsdGVyIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgc2VsZWN0ZWRDb2x1bW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nSW5kZXhGaWx0ZXIgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgc2VsZWN0ZWRDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcik7CiAgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBtYWtlUm93SXRlcmF0b3IoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5LApAQCAtNTAsNyArNTIsNyBAQAogCiAgICAgc3RhdGljIFN0b3JhZ2VIb29rIGNyZWF0ZUhvb2soKQogICAgIHsKLSAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9ICBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5zdG9yYWdlX2hvb2siKTsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IFNUT1JBR0VfSE9PSy5nZXRTdHJpbmcoKTsKICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gRkJVdGlsaXRpZXMuY29uc3RydWN0KGNsYXNzTmFtZSwgU3RvcmFnZUhvb2suY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKQEAgLTYzLDggKzY1LDcgQEAKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlcG9ydFJlYWQoVGFibGVJZCB0YWJsZUlkLCBEZWNvcmF0ZWRLZXkga2V5KSB7fQogCiAgICAgICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQgbWFrZVJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nSW5kZXhGaWx0ZXIgZmlsdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlciBzZWxlY3RlZENvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCkBAIC04OCw0ICs4OSw0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1N5c3RlbUtleXNwYWNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TeXN0ZW1LZXlzcGFjZS5qYXZhCmluZGV4IGZkMjE0NWIuLmViMGU1MDggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1N5c3RlbUtleXNwYWNlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3lzdGVtS2V5c3BhY2UuamF2YQpAQCAtNTgsMTYgKzU4LDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5BZ2dyZWdhdGVGY3RzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkJ5dGVzQ29udmVyc2lvbkZjdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuQ2FzdEZjdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuT3BlcmF0aW9uRmN0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5UaW1lRmN0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5VdWlkRmN0czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVRhYmxlU3RhdGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2c7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1Bvc2l0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkhpc3RvcnlUYWJ1bGFyRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVCdWZmZXJBY2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxvbmdUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVGltZVVVSURUeXBlOwpAQCAtOTQsNyArODksNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuVG9wUGFydGl0aW9uVHJhY2tlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcGFjdGlvblBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuRnVuY3Rpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwpAQCAtMTAzLDYgKzk3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UeXBlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVXNlckZ1bmN0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVmlld3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLkJhbGxvdDsKQEAgLTE1Miw2ICsxNDcsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBVENIRVMgPSAiYmF0Y2hlcyI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFYT1MgPSAicGF4b3MiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBWE9TX1JFUEFJUl9ISVNUT1JZID0gInBheG9zX3JlcGFpcl9oaXN0b3J5IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVhPU19SRVBBSVJfU1RBVEUgPSAiX3BheG9zX3JlcGFpcl9zdGF0ZSI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTFRfSU5ERVhFUyA9ICJJbmRleEluZm8iOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMID0gImxvY2FsIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRUVSU19WMiA9ICJwZWVyc192MiI7CkBAIC0xODcsNiArMTgzLDE0IEBACiAgICAgQERlcHJlY2F0ZWQgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1NJWkVfRVNUSU1BVEVTID0gInNpemVfZXN0aW1hdGVzIjsKICAgICBARGVwcmVjYXRlZCBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfU1NUQUJMRV9BQ1RJVklUWSA9ICJzc3RhYmxlX2FjdGl2aXR5IjsKIAorICAgIC8vIE5hbWVzIG9mIGFsbCB0YWJsZXMgdGhhdCBjb3VsZCBoYXZlIGJlZW4gYSBwYXJ0IG9mIGEgc3lzdGVtIGtleXNwYWNlLiBVc2VmdWwgZm9yIHByZS1mbGlnaHQgY2hlY2tzLgorICAgIC8vIEZvciBkZXRhaWxzLCBzZWUgQ0FTU0FORFJBLTE3Nzc3CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBBTExfVEFCTEVfTkFNRVMgPSBJbW11dGFibGVTZXQub2YoCisgICAgICAgIEJBVENIRVMsIFBBWE9TLCBQQVhPU19SRVBBSVJfSElTVE9SWSwgUEFYT1NfUkVQQUlSX1NUQVRFLCBCVUlMVF9JTkRFWEVTLCBMT0NBTCwgUEVFUlNfVjIsIFBFRVJfRVZFTlRTX1YyLAorICAgICAgICBDT01QQUNUSU9OX0hJU1RPUlksIFNTVEFCTEVfQUNUSVZJVFlfVjIsIFRBQkxFX0VTVElNQVRFUywgVEFCTEVfRVNUSU1BVEVTX1RZUEVfUFJJTUFSWSwKKyAgICAgICAgVEFCTEVfRVNUSU1BVEVTX1RZUEVfTE9DQUxfUFJJTUFSWSwgQVZBSUxBQkxFX1JBTkdFU19WMiwgVFJBTlNGRVJSRURfUkFOR0VTX1YyLCBWSUVXX0JVSUxEU19JTl9QUk9HUkVTUywKKyAgICAgICAgQlVJTFRfVklFV1MsIFBSRVBBUkVEX1NUQVRFTUVOVFMsIFJFUEFJUlMsIFRPUF9QQVJUSVRJT05TLCBMRUdBQ1lfUEVFUlMsIExFR0FDWV9QRUVSX0VWRU5UUywKKyAgICAgICAgTEVHQUNZX1RSQU5TRkVSUkVEX1JBTkdFUywgTEVHQUNZX0FWQUlMQUJMRV9SQU5HRVMsIExFR0FDWV9TSVpFX0VTVElNQVRFUywgTEVHQUNZX1NTVEFCTEVfQUNUSVZJVFkpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUYWJsZU1ldGFkYXRhIEJhdGNoZXMgPQogICAgICAgICBwYXJzZShCQVRDSEVTLApAQCAtMzA4LDYgKzMxMiw3IEBACiAgICAgICAgICAgICAgICAgKyAiY29tcGFjdGVkX2F0IHRpbWVzdGFtcCwiCiAgICAgICAgICAgICAgICAgKyAia2V5c3BhY2VfbmFtZSB0ZXh0LCIKICAgICAgICAgICAgICAgICArICJyb3dzX21lcmdlZCBtYXA8aW50LCBiaWdpbnQ+LCIKKyAgICAgICAgICAgICAgICArICJjb21wYWN0aW9uX3Byb3BlcnRpZXMgZnJvemVuPG1hcDx0ZXh0LCB0ZXh0Pj4sIgogICAgICAgICAgICAgICAgICsgIlBSSU1BUlkgS0VZICgoaWQpKSkiKQogICAgICAgICAgICAgICAgIC5kZWZhdWx0VGltZVRvTGl2ZSgoaW50KSBUaW1lVW5pdC5EQVlTLnRvU2Vjb25kcyg3KSkKICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKQEAgLTUwOSw3ICs1MTQsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBLZXlzcGFjZU1ldGFkYXRhIG1ldGFkYXRhKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBLZXlzcGFjZU1ldGFkYXRhLmNyZWF0ZShTY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUUsIEtleXNwYWNlUGFyYW1zLmxvY2FsKCksIHRhYmxlcygpLCBWaWV3cy5ub25lKCksIFR5cGVzLm5vbmUoKSwgZnVuY3Rpb25zKCkpOworICAgICAgICByZXR1cm4gS2V5c3BhY2VNZXRhZGF0YS5jcmVhdGUoU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FLCBLZXlzcGFjZVBhcmFtcy5sb2NhbCgpLCB0YWJsZXMoKSwgVmlld3Mubm9uZSgpLCBUeXBlcy5ub25lKCksIFVzZXJGdW5jdGlvbnMubm9uZSgpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBUYWJsZXMgdGFibGVzKCkKQEAgLTUzOSwxOCArNTQ0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBUb3BQYXJ0aXRpb25zKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBGdW5jdGlvbnMgZnVuY3Rpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGdW5jdGlvbnMuYnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKFV1aWRGY3RzLmFsbCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChUaW1lRmN0cy5hbGwoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoQnl0ZXNDb252ZXJzaW9uRmN0cy5hbGwoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoQWdncmVnYXRlRmN0cy5hbGwoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoQ2FzdEZjdHMuYWxsKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE9wZXJhdGlvbkZjdHMuYWxsKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICB9Ci0KICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBNYXA8VGFibGVJZCwgUGFpcjxDb21taXRMb2dQb3NpdGlvbiwgTG9uZz4+IHRydW5jYXRpb25SZWNvcmRzOwogCiAgICAgcHVibGljIGVudW0gQm9vdHN0cmFwU3RhdGUKQEAgLTYxNSwxMiArNjA4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY29tcGFjdGVkQXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYnl0ZXNJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBieXRlc091dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPEludGVnZXIsIExvbmc+IHJvd3NNZXJnZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBMb25nPiByb3dzTWVyZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbXBhY3Rpb25Qcm9wZXJ0aWVzKQogICAgIHsKICAgICAgICAgLy8gZG9uJ3Qgd3JpdGUgYW55dGhpbmcgd2hlbiB0aGUgaGlzdG9yeSB0YWJsZSBpdHNlbGYgaXMgY29tcGFjdGVkLCBzaW5jZSB0aGF0IHdvdWxkIGluIHR1cm4gY2F1c2UgbmV3IGNvbXBhY3Rpb25zCiAgICAgICAgIGlmIChrc25hbWUuZXF1YWxzKCJzeXN0ZW0iKSAmJiBjZm5hbWUuZXF1YWxzKENPTVBBQ1RJT05fSElTVE9SWSkpCiAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIFN0cmluZyByZXEgPSAiSU5TRVJUIElOVE8gc3lzdGVtLiVzIChpZCwga2V5c3BhY2VfbmFtZSwgY29sdW1uZmFtaWx5X25hbWUsIGNvbXBhY3RlZF9hdCwgYnl0ZXNfaW4sIGJ5dGVzX291dCwgcm93c19tZXJnZWQpIFZBTFVFUyAoPywgPywgPywgPywgPywgPywgPykiOworICAgICAgICBTdHJpbmcgcmVxID0gIklOU0VSVCBJTlRPIHN5c3RlbS4lcyAoaWQsIGtleXNwYWNlX25hbWUsIGNvbHVtbmZhbWlseV9uYW1lLCBjb21wYWN0ZWRfYXQsIGJ5dGVzX2luLCBieXRlc19vdXQsIHJvd3NfbWVyZ2VkLCBjb21wYWN0aW9uX3Byb3BlcnRpZXMpIFZBTFVFUyAoPywgPywgPywgPywgPywgPywgPywgPykiOwogICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KHJlcSwgQ09NUEFDVElPTl9ISVNUT1JZKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRUaW1lVVVJRCgpLAogICAgICAgICAgICAgICAgICAgICAgICAga3NuYW1lLApAQCAtNjI4LDcgKzYyMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlcyhjb21wYWN0ZWRBdCksCiAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0luLAogICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICByb3dzTWVyZ2VkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd3NNZXJnZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0aW9uUHJvcGVydGllcyk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBUYWJ1bGFyRGF0YSBnZXRDb21wYWN0aW9uSGlzdG9yeSgpIHRocm93cyBPcGVuRGF0YUV4Y2VwdGlvbgpAQCAtMTQ4Nyw4ICsxNDgyLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFJlc3RvcmFibGVNZXRlciBnZXRTU1RhYmxlUmVhZE1ldGVyKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBTU1RhYmxlSWQgaWQpCiAgICAgewotICAgICAgICBTdHJpbmcgY3FsID0gIlNFTEVDVCAqIEZST00gc3lzdGVtLiVzIFdIRVJFIGtleXNwYWNlX25hbWU9PyBhbmQgdGFibGVfbmFtZT0/IGFuZCBpZD0/IjsKLSAgICAgICAgVW50eXBlZFJlc3VsdFNldCByZXN1bHRzID0gZXhlY3V0ZUludGVybmFsKGZvcm1hdChjcWwsIFNTVEFCTEVfQUNUSVZJVFlfVjIpLCBrZXlzcGFjZSwgdGFibGUsIGlkLnRvU3RyaW5nKCkpOworICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJlc3VsdHMgPSByZWFkU1NUYWJsZUFjdGl2aXR5KGtleXNwYWNlLCB0YWJsZSwgaWQpOwogCiAgICAgICAgIGlmIChyZXN1bHRzLmlzRW1wdHkoKSkKICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzdG9yYWJsZU1ldGVyKCk7CkBAIC0xNDk5LDYgKzE0OTMsMTMgQEAKICAgICAgICAgcmV0dXJuIG5ldyBSZXN0b3JhYmxlTWV0ZXIobTE1cmF0ZSwgbTEyMHJhdGUpOwogICAgIH0KIAorICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgVW50eXBlZFJlc3VsdFNldCByZWFkU1NUYWJsZUFjdGl2aXR5KFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBTU1RhYmxlSWQgaWQpCisgICAgeworICAgICAgICBTdHJpbmcgY3FsID0gIlNFTEVDVCAqIEZST00gc3lzdGVtLiVzIFdIRVJFIGtleXNwYWNlX25hbWU9PyBhbmQgdGFibGVfbmFtZT0/IGFuZCBpZD0/IjsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGVJbnRlcm5hbChmb3JtYXQoY3FsLCBTU1RBQkxFX0FDVElWSVRZX1YyKSwga2V5c3BhY2UsIHRhYmxlLCBpZC50b1N0cmluZygpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBXcml0ZXMgdGhlIGN1cnJlbnQgcmVhZCByYXRlcyBmb3IgYSBnaXZlbiBTU1RhYmxlIHRvIHN5c3RlbS5zc3RhYmxlX2FjdGl2aXR5CiAgICAgICovCkBAIC0xNjY1LDEyICsxNjY2LDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRBdmFpbGFibGVSYW5nZXMoKQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldEF2YWlsYWJsZVN0cmVhbWVkUmFuZ2VzKCkKICAgICB7CiAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGF2YWlsYWJsZVJhbmdlcyA9IEtleXNwYWNlLm9wZW4oU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShBVkFJTEFCTEVfUkFOR0VTX1YyKTsKICAgICAgICAgYXZhaWxhYmxlUmFuZ2VzLnRydW5jYXRlQmxvY2tpbmdXaXRob3V0U25hcHNob3QoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXRBdmFpbGFibGVTdHJlYW1lZFJhbmdlc0ZvcktleXNwYWNlKFN0cmluZyBrZXlzcGFjZSkKKyAgICB7CisgICAgICAgIFN0cmluZyBjcWwgPSAiREVMRVRFIEZST00gJXMuJXMgV0hFUkUga2V5c3BhY2VfbmFtZSA9ID8iOworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KGNxbCwgU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FLCBBVkFJTEFCTEVfUkFOR0VTX1YyKSwga2V5c3BhY2UpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgdXBkYXRlVHJhbnNmZXJyZWRSYW5nZXMoU3RyZWFtT3BlcmF0aW9uIHN0cmVhbU9wZXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBwZWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleXNwYWNlLApAQCAtMTc4MCw3ICsxNzg3LDggQEAKICAgICAgICAgcmV0dXJuIHJhd1Jhbmdlcy5zdHJlYW0oKS5tYXAoYnVmIC0+IGJ5dGVCdWZmZXJUb1JhbmdlKGJ1ZiwgcGFydGl0aW9uZXIpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CiAgICAgfQogCi0gICAgc3RhdGljIEJ5dGVCdWZmZXIgcmFuZ2VUb0J5dGVzKFJhbmdlPFRva2VuPiByYW5nZSkKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgcmFuZ2VUb0J5dGVzKFJhbmdlPFRva2VuPiByYW5nZSkKICAgICB7CiAgICAgICAgIHRyeSAoRGF0YU91dHB1dEJ1ZmZlciBvdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigpKQogICAgICAgICB7CkBAIC0xODk5LDcgKzE5MDcsNyBAQAogICAgICAgICAgICAgVHVwbGVUeXBlIHR1cGxlVHlwZSA9IG5ldyBUdXBsZVR5cGUoTGlzdHMubmV3QXJyYXlMaXN0KFVURjhUeXBlLmluc3RhbmNlLCBMb25nVHlwZS5pbnN0YW5jZSkpOwogICAgICAgICAgICAgZm9yIChCeXRlQnVmZmVyIGJiIDogdG9wKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSBjb21wb25lbnRzID0gdHVwbGVUeXBlLnNwbGl0KGJiKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyW10gY29tcG9uZW50cyA9IHR1cGxlVHlwZS5zcGxpdChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGJiKTsKICAgICAgICAgICAgICAgICBTdHJpbmcga2V5U3RyID0gVVRGOFR5cGUuaW5zdGFuY2UuY29tcG9zZShjb21wb25lbnRzWzBdKTsKICAgICAgICAgICAgICAgICBsb25nIHZhbHVlID0gTG9uZ1R5cGUuaW5zdGFuY2UuY29tcG9zZShjb21wb25lbnRzWzFdKTsKICAgICAgICAgICAgICAgICB0b3BQYXJ0aXRpb25zLmFkZChuZXcgVG9wUGFydGl0aW9uVHJhY2tlci5Ub3BQYXJ0aXRpb24obWV0YWRhdGEucGFydGl0aW9uZXIuZGVjb3JhdGVLZXkobWV0YWRhdGEucGFydGl0aW9uS2V5VHlwZS5mcm9tU3RyaW5nKGtleVN0cikpLCB2YWx1ZSkpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3lzdGVtS2V5c3BhY2VNaWdyYXRvcjQxLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TeXN0ZW1LZXlzcGFjZU1pZ3JhdG9yNDEuamF2YQppbmRleCBiZmNlNzgwLi5hYjlmMDFmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TeXN0ZW1LZXlzcGFjZU1pZ3JhdG9yNDEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TeXN0ZW1LZXlzcGFjZU1pZ3JhdG9yNDEuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwpAQCAtMzMsNiArMzQsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxvbmdUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVGltZVVVSURUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TZXF1ZW5jZUJhc2VkU1NUYWJsZUlkOwpAQCAtNjIsNiArNjQsNyBAQAogICAgICAgICBtaWdyYXRlVHJhbnNmZXJyZWRSYW5nZXMoKTsKICAgICAgICAgbWlncmF0ZUF2YWlsYWJsZVJhbmdlcygpOwogICAgICAgICBtaWdyYXRlU1NUYWJsZUFjdGl2aXR5KCk7CisgICAgICAgIG1pZ3JhdGVDb21wYWN0aW9uSGlzdG9yeSgpOwogICAgIH0KIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwpAQCAtMTU5LDEyICsxNjIsMzggQEAKICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICk7CiAgICAgfQorICAgIAorICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyB2b2lkIG1pZ3JhdGVDb21wYWN0aW9uSGlzdG9yeSgpCisgICAgeworICAgICAgICBtaWdyYXRlVGFibGUoZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5DT01QQUNUSU9OX0hJU1RPUlksCisgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5DT01QQUNUSU9OX0hJU1RPUlksCisgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW117ICJpZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlc19pbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlc19vdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sdW1uZmFtaWx5X25hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGFjdGVkX2F0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleXNwYWNlX25hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm93c19tZXJnZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGFjdGlvbl9wcm9wZXJ0aWVzIiB9LAorICAgICAgICAgICAgICAgICAgICAgcm93IC0+IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IE9iamVjdFtdeyByb3cuZ2V0VGltZVVVSUQoImlkIikgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cuaGFzKCJieXRlc19pbiIpID8gcm93LmdldExvbmcoImJ5dGVzX2luIikgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cuaGFzKCJieXRlc19vdXQiKSA/IHJvdy5nZXRMb25nKCJieXRlc19vdXQiKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5oYXMoImNvbHVtbmZhbWlseV9uYW1lIikgPyByb3cuZ2V0U3RyaW5nKCJjb2x1bW5mYW1pbHlfbmFtZSIpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LmhhcygiY29tcGFjdGVkX2F0IikgPyByb3cuZ2V0VGltZXN0YW1wKCJjb21wYWN0ZWRfYXQiKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5oYXMoImtleXNwYWNlX25hbWUiKSA/IHJvdy5nZXRTdHJpbmcoImtleXNwYWNlX25hbWUiKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5oYXMoInJvd3NfbWVyZ2VkIikgPyByb3cuZ2V0TWFwKCJyb3dzX21lcmdlZCIsIEludDMyVHlwZS5pbnN0YW5jZSwgTG9uZ1R5cGUuaW5zdGFuY2UpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LmhhcygiY29tcGFjdGlvbl9wcm9wZXJ0aWVzIikgPyByb3cuZ2V0TWFwKCJjb21wYWN0aW9uX3Byb3BlcnRpZXMiLCBVVEY4VHlwZS5pbnN0YW5jZSwgVVRGOFR5cGUuaW5zdGFuY2UpIDogSW1tdXRhYmxlTWFwLm9mKCkgfSkKKyAgICAgICAgKTsKKyAgICB9CiAKICAgICAvKioKICAgICAgKiBQZXJmb3JtIHRhYmxlIG1pZ3JhdGlvbiBieSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgb2xkIHRhYmxlLCBjb252ZXJ0aW5nIGl0LCBhbmQgYWRkaW5nIHRvIHRoZSBuZXcgdGFibGUuCi0gICAgICoKKyAgICAgKiBJZiBvbGROYW1lIGFuZCBuZXdOYW1lIGFyZSBzYW1lLCBpdCBtZWFucyBkYXRhIGluIHRoZSB0YWJsZSB3aWxsIGJlIHJlZnJlc2hlZC4KKyAgICAgKiAKICAgICAgKiBAcGFyYW0gdHJ1bmNhdGVJZkV4aXN0cyB0cnVuY2F0ZSB0aGUgZXhpc3RpbmcgdGFibGUgaWYgaXQgZXhpc3RzIGJlZm9yZSBtaWdyYXRpb247IGlmIGl0IGlzIGRpc2FibGVkCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBuZXcgdGFibGUgaXMgbm90IGVtcHR5LCBubyBtaWdyYXRpb24gaXMgcGVyZm9ybWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBuZXcgdGFibGUgaXMgbm90IGVtcHR5IGFuZCBvbGROYW1lIGlzIG5vdCBlcXVhbCB0byBuZXdOYW1lLCBubyBtaWdyYXRpb24gaXMgcGVyZm9ybWVkCiAgICAgICogQHBhcmFtIG9sZE5hbWUgICAgICAgICAgb2xkIHRhYmxlIG5hbWUKICAgICAgKiBAcGFyYW0gbmV3TmFtZSAgICAgICAgICBuZXcgdGFibGUgbmFtZQogICAgICAqIEBwYXJhbSBjb2x1bW5zICAgICAgICAgIGNvbHVtbnMgdG8gZmlsbCBpbiB0aGUgbmV3IHRhYmxlIGluIHRoZSBzYW1lIG9yZGVyIGFzIHJldHVybmVkIGJ5IHRoZSB0cmFuc2Zvcm1hdGlvbgpAQCAtMTc1LDcgKzIwNCw3IEBACiAgICAgewogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBuZXdUYWJsZSA9IEtleXNwYWNlLm9wZW4oU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShuZXdOYW1lKTsKIAotICAgICAgICBpZiAoIW5ld1RhYmxlLmlzRW1wdHkoKSAmJiAhdHJ1bmNhdGVJZkV4aXN0cykKKyAgICAgICAgaWYgKCFuZXdUYWJsZS5pc0VtcHR5KCkgJiYgIXRydW5jYXRlSWZFeGlzdHMgJiYgIW9sZE5hbWUuZXF1YWxzKG5ld05hbWUpKQogICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIGlmICh0cnVuY2F0ZUlmRXhpc3RzKQpAQCAtMTg5LDYgKzIxOCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1V0aWxzLmpvaW4oY29sdW1ucywgIiwgIiksIFN0cmluZ1V0aWxzLnJlcGVhdCgiPyIsICIsICIsIGNvbHVtbnMubGVuZ3RoKSk7CiAKICAgICAgICAgVW50eXBlZFJlc3VsdFNldCByb3dzID0gUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKHF1ZXJ5KTsKKworICAgICAgICBhc3NlcnQgcm93cyAhPSBudWxsIDogU3RyaW5nLmZvcm1hdCgiTWlncmF0aW5nIHJvd3MgZnJvbSBsZWdhY3kgJXMgdG8gJXMgd2FzIG5vdCBkb25lIGFzIHJldHVybmVkIHJvd3MgZnJvbSAlcyBhcmUgbnVsbCEiLCBvbGROYW1lLCBuZXdOYW1lLCBvbGROYW1lKTsKKyAgICAgICAgCiAgICAgICAgIGludCB0cmFuc2ZlcnJlZCA9IDA7CiAgICAgICAgIGxvZ2dlci5pbmZvKCJNaWdyYXRpbmcgcm93cyBmcm9tIGxlZ2FjeSB7fSB0byB7fSIsIG9sZE5hbWUsIG5ld05hbWUpOwogICAgICAgICBmb3IgKFVudHlwZWRSZXN1bHRTZXQuUm93IHJvdyA6IHJvd3MpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9hZ2dyZWdhdGlvbi9BZ2dyZWdhdGlvblNwZWNpZmljYXRpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2FnZ3JlZ2F0aW9uL0FnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbi5qYXZhCmluZGV4IDBkNmMwZWUuLmE0YTFjNTcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2FnZ3JlZ2F0aW9uL0FnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2FnZ3JlZ2F0aW9uL0FnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbi5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmFnZ3JlZ2F0aW9uOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5T3B0aW9uczsKQEAgLTI3LDYgKzI4LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogCiAvKioKQEAgLTYxLDcgKzYzLDcgQEAKICAgICAvKioKICAgICAgKiBUaGUgPGNvZGU+QWdncmVnYXRpb25TcGVjaWZpY2F0aW9uPC9jb2RlPiBraW5kcy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGVudW0gS2luZAorICAgIHB1YmxpYyBlbnVtIEtpbmQKICAgICB7CiAgICAgICAgIEFHR1JFR0FURV9FVkVSWVRISU5HLCBBR0dSRUdBVEVfQllfUEtfUFJFRklYLCBBR0dSRUdBVEVfQllfUEtfUFJFRklYX1dJVEhfU0VMRUNUT1IKICAgICB9CkBAIC0xMTUsNyArMTE3LDggQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgQWdncmVnYXRpb25TcGVjaWZpY2F0aW9uLkZhY3RvcnkgYWdncmVnYXRlUGtQcmVmaXhGYWN0b3J5V2l0aFNlbGVjdG9yKGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNsdXN0ZXJpbmdQcmVmaXhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlbGVjdG9yLkZhY3RvcnkgZmFjdG9yeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZWxlY3Rvci5GYWN0b3J5IGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxDb2x1bW5NZXRhZGF0YT4gY29sdW1ucykKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgRmFjdG9yeSgpCiAgICAgICAgIHsKQEAgLTEzMSw4ICsxMzQsOSBAQAogICAgICAgICAgICAgICAgIFNlbGVjdG9yIHNlbGVjdG9yID0gZmFjdG9yeS5uZXdJbnN0YW5jZShvcHRpb25zKTsKICAgICAgICAgICAgICAgICBzZWxlY3Rvci52YWxpZGF0ZUZvckdyb3VwQnkoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICBBZ2dyZWdhdGVCeVBrUHJlZml4V2l0aFNlbGVjdG9yKGNvbXBhcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nUHJlZml4U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdQcmVmaXhTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICB9CkBAIC0yMDAsMTggKzIwNCwyNSBAQAogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3RvciBzZWxlY3RvcjsKIAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbHVtbnMgdXNlZCBieSB0aGUgc2VsZWN0b3IuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGNvbHVtbnM7CisKICAgICAgICAgcHVibGljIEFnZ3JlZ2F0ZUJ5UGtQcmVmaXhXaXRoU2VsZWN0b3IoQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsdXN0ZXJpbmdQcmVmaXhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBzZWxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3Igc2VsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGNvbHVtbnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN1cGVyKEtpbmQuQUdHUkVHQVRFX0JZX1BLX1BSRUZJWF9XSVRIX1NFTEVDVE9SLCBjb21wYXJhdG9yLCBjbHVzdGVyaW5nUHJlZml4U2l6ZSk7CiAgICAgICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CisgICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zOwogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBHcm91cE1ha2VyIG5ld0dyb3VwTWFrZXIoR3JvdXBpbmdTdGF0ZSBzdGF0ZSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEdyb3VwTWFrZXIubmV3U2VsZWN0b3JHcm91cE1ha2VyKGNvbXBhcmF0b3IsIGNsdXN0ZXJpbmdQcmVmaXhTaXplLCBzZWxlY3Rvciwgc3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIEdyb3VwTWFrZXIubmV3U2VsZWN0b3JHcm91cE1ha2VyKGNvbXBhcmF0b3IsIGNsdXN0ZXJpbmdQcmVmaXhTaXplLCBzZWxlY3RvciwgY29sdW1ucywgc3RhdGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMjUsMTIgKzIzNiwxNSBAQAogICAgICAgICAgICAgICAgIGNhc2UgQUdHUkVHQVRFX0VWRVJZVEhJTkc6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgQUdHUkVHQVRFX0JZX1BLX1BSRUZJWDoKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KCgoQWdncmVnYXRlQnlQa1ByZWZpeCkgYWdncmVnYXRpb25TcGVjKS5jbHVzdGVyaW5nUHJlZml4U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKCgoQWdncmVnYXRlQnlQa1ByZWZpeCkgYWdncmVnYXRpb25TcGVjKS5jbHVzdGVyaW5nUHJlZml4U2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgQUdHUkVHQVRFX0JZX1BLX1BSRUZJWF9XSVRIX1NFTEVDVE9SOgogICAgICAgICAgICAgICAgICAgICBBZ2dyZWdhdGVCeVBrUHJlZml4V2l0aFNlbGVjdG9yIHNwZWMgPSAoQWdncmVnYXRlQnlQa1ByZWZpeFdpdGhTZWxlY3RvcikgYWdncmVnYXRpb25TcGVjOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoc3BlYy5jbHVzdGVyaW5nUHJlZml4U2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHNwZWMuY2x1c3RlcmluZ1ByZWZpeFNpemUpOwogICAgICAgICAgICAgICAgICAgICBTZWxlY3Rvci5zZXJpYWxpemVyLnNlcmlhbGl6ZShzcGVjLnNlbGVjdG9yLCBvdXQsIHZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAvLyBJZGVhbGx5IHdlIHNob3VsZCBzZXJpYWxpemUgdGhlIGNvbHVtbnMgYnV0IHRoYXQgd2lsbCBicmVhayBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICAgICAgICAgICAgICAgICAgICAvLyBTbyBmb3IgdGhlIG1vbWVudCB3ZSBjYW4gcmVidWlsZCB0aGUgbGlzdCBmcm9tIHRoZSBwcmVmaXggc2l6ZSBhcyB3ZSBrbm93IHRoYXQgdGhlcmUgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IG9uZSBjb2x1bW4gYW5kIHRoYXQgaXRzIGluZGljZSB3aWxsIGJlOiBjbHVzdGVyaW5nUHJlZml4U2l6ZSAtIDEuCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5rbm93IGFnZ3JlZ2F0aW9uIGtpbmQ6ICIgKyBhZ2dyZWdhdGlvblNwZWMua2luZCgpKTsKQEAgLTI0NSwxMyArMjU5LDE1IEBACiAgICAgICAgICAgICAgICAgY2FzZSBBR0dSRUdBVEVfRVZFUllUSElORzoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFnZ3JlZ2F0aW9uU3BlY2lmaWNhdGlvbi5BR0dSRUdBVEVfRVZFUllUSElORzsKICAgICAgICAgICAgICAgICBjYXNlIEFHR1JFR0FURV9CWV9QS19QUkVGSVg6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlQnlQa1ByZWZpeChtZXRhZGF0YS5jb21wYXJhdG9yLCAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFnZ3JlZ2F0ZUJ5UGtQcmVmaXgobWV0YWRhdGEuY29tcGFyYXRvciwgaW4ucmVhZFVuc2lnbmVkVkludDMyKCkpOwogICAgICAgICAgICAgICAgIGNhc2UgQUdHUkVHQVRFX0JZX1BLX1BSRUZJWF9XSVRIX1NFTEVDVE9SOgotICAgICAgICAgICAgICAgICAgICBpbnQgY2x1c3RlcmluZ1ByZWZpeFNpemUgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICAgICAgICAgIGludCBjbHVzdGVyaW5nUHJlZml4U2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBzZWxlY3RvciA9IFNlbGVjdG9yLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24sIG1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEgZnVuY3Rpb25Bcmd1bWVudCA9IG1ldGFkYXRhLmNsdXN0ZXJpbmdDb2x1bW5zKCkuZ2V0KGNsdXN0ZXJpbmdQcmVmaXhTaXplIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWdncmVnYXRlQnlQa1ByZWZpeFdpdGhTZWxlY3RvcihtZXRhZGF0YS5jb21wYXJhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcmluZ1ByZWZpeFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZnVuY3Rpb25Bcmd1bWVudCkpOwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5rbm93IGFnZ3JlZ2F0aW9uIGtpbmQ6ICIgKyBraW5kKTsKICAgICAgICAgICAgIH0KQEAgLTI3MCw5ICsyODYsNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgQUdHUkVHQVRFX0JZX1BLX1BSRUZJWF9XSVRIX1NFTEVDVE9SOgogICAgICAgICAgICAgICAgICAgICBBZ2dyZWdhdGVCeVBrUHJlZml4V2l0aFNlbGVjdG9yIHNwZWMgPSAoQWdncmVnYXRlQnlQa1ByZWZpeFdpdGhTZWxlY3RvcikgYWdncmVnYXRpb25TcGVjOwogICAgICAgICAgICAgICAgICAgICBzaXplICs9IFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQoc3BlYy5jbHVzdGVyaW5nUHJlZml4U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgKz0gU2VsZWN0b3Iuc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShzcGVjLnNlbGVjdG9yLCB2ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSBTZWxlY3Rvci5zZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKHNwZWMuc2VsZWN0b3IsIHZlcnNpb24pOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIlVua25vdyBhZ2dyZWdhdGlvbiBraW5kOiAiICsgYWdncmVnYXRpb25TcGVjLmtpbmQoKSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9hZ2dyZWdhdGlvbi9Hcm91cE1ha2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9hZ2dyZWdhdGlvbi9Hcm91cE1ha2VyLmphdmEKaW5kZXggOTY4MjE5Zi4uMjFiYjQzOCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvYWdncmVnYXRpb24vR3JvdXBNYWtlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2FnZ3JlZ2F0aW9uL0dyb3VwTWFrZXIuamF2YQpAQCAtMTgsMTEgKzE4LDEzIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmFnZ3JlZ2F0aW9uOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc2VsZWN0aW9uLlNlbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0NvbXBhcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogCiAvKioKQEAgLTYxLDE2ICs2MywxOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgR3JvdXBNYWtlciBuZXdTZWxlY3Rvckdyb3VwTWFrZXIoQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbHVzdGVyaW5nUHJlZml4U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxDb2x1bW5NZXRhZGF0YT4gY29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwaW5nU3RhdGUgc3RhdGUpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IFNlbGVjdG9yR3JvdXBNYWtlcihjb21wYXJhdG9yLCBjbHVzdGVyaW5nUHJlZml4U2l6ZSwgc2VsZWN0b3IsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rvckdyb3VwTWFrZXIoY29tcGFyYXRvciwgY2x1c3RlcmluZ1ByZWZpeFNpemUsIHNlbGVjdG9yLCBjb2x1bW5zLCBzdGF0ZSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBHcm91cE1ha2VyIG5ld1NlbGVjdG9yR3JvdXBNYWtlcihDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsdXN0ZXJpbmdQcmVmaXhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0b3Igc2VsZWN0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RvciBzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGNvbHVtbnMpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IFNlbGVjdG9yR3JvdXBNYWtlcihjb21wYXJhdG9yLCBjbHVzdGVyaW5nUHJlZml4U2l6ZSwgc2VsZWN0b3IpOworICAgICAgICByZXR1cm4gbmV3IFNlbGVjdG9yR3JvdXBNYWtlcihjb21wYXJhdG9yLCBjbHVzdGVyaW5nUHJlZml4U2l6ZSwgc2VsZWN0b3IsIGNvbHVtbnMpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTU4LDI1ICsxNjIsMjkgQEAKICAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBsYXN0T3V0cHV0OwogCi0gICAgICAgIHByaXZhdGUgZmluYWwgU2VsZWN0b3IuSW5wdXRSb3cgaW5wdXQgPSBuZXcgU2VsZWN0b3IuSW5wdXRSb3coMSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3Rvci5JbnB1dFJvdyBpbnB1dDsKIAogICAgICAgICBwdWJsaWMgU2VsZWN0b3JHcm91cE1ha2VyKENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsdXN0ZXJpbmdQcmVmaXhTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGNvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBpbmdTdGF0ZSBzdGF0ZSkKICAgICAgICAgewogICAgICAgICAgICAgc3VwZXIoY29tcGFyYXRvciwgY2x1c3RlcmluZ1ByZWZpeFNpemUsIHN0YXRlKTsKICAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBuZXcgU2VsZWN0b3IuSW5wdXRSb3coUHJvdG9jb2xWZXJzaW9uLkNVUlJFTlQsIGNvbHVtbnMsIGZhbHNlKTsKICAgICAgICAgICAgIHRoaXMubGFzdE91dHB1dCA9IGxhc3RDbHVzdGVyaW5nID09IG51bGwgPyBudWxsIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlU2VsZWN0b3IobGFzdENsdXN0ZXJpbmcuYnVmZmVyQXQoY2x1c3RlcmluZ1ByZWZpeFNpemUgLSAxKSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgU2VsZWN0b3JHcm91cE1ha2VyKENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsdXN0ZXJpbmdQcmVmaXhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIHNlbGVjdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdG9yIHNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGNvbHVtbnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN1cGVyKGNvbXBhcmF0b3IsIGNsdXN0ZXJpbmdQcmVmaXhTaXplKTsKICAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBuZXcgU2VsZWN0b3IuSW5wdXRSb3coUHJvdG9jb2xWZXJzaW9uLkNVUlJFTlQsIGNvbHVtbnMsIGZhbHNlKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtMjE3LDcgKzIyNSw3IEBACiAgICAgICAgICAgICBpbnB1dC5hZGQoYXJndW1lbnQpOwogCiAgICAgICAgICAgICAvLyBGb3IgY29tcHV0aW5nIGdyb3VwcyB3ZSBkbyBub3QgbmVlZCB0byB1c2UgdGhlIGNsaWVudCBwcm90b2NvbCB2ZXJzaW9uLgotICAgICAgICAgICAgc2VsZWN0b3IuYWRkSW5wdXQoUHJvdG9jb2xWZXJzaW9uLkNVUlJFTlQsIGlucHV0KTsKKyAgICAgICAgICAgIHNlbGVjdG9yLmFkZElucHV0KGlucHV0KTsKICAgICAgICAgICAgIEJ5dGVCdWZmZXIgb3V0cHV0ID0gc2VsZWN0b3IuZ2V0T3V0cHV0KFByb3RvY29sVmVyc2lvbi5DVVJSRU5UKTsKICAgICAgICAgICAgIHNlbGVjdG9yLnJlc2V0KCk7CiAgICAgICAgICAgICBpbnB1dC5yZXNldChmYWxzZSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb2x1bW5pdGVyYXRvci9BYnN0cmFjdFNTVGFibGVJdGVyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29sdW1uaXRlcmF0b3IvQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVlNDVjMi4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb2x1bW5pdGVyYXRvci9BYnN0cmFjdFNTVGFibGVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjExICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbHVtbml0ZXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhJbmZvOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhUG9zaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3IgaW1wbGVtZW50cyBVbmZpbHRlcmVkUm93SXRlcmF0b3IKLXsKLSAgICBwcm90ZWN0ZWQgZmluYWwgU1NUYWJsZVJlYWRlciBzc3RhYmxlOwotICAgIC8vIFdlIGNvdWxkIHVzZSBzc3RhYmxlLm1ldGFkYXRhKCksIGJ1dCB0aGF0IGNhbiBjaGFuZ2UgZHVyaW5nIGV4ZWN1dGlvbiBzbyBpdCdzIGdvb2QgaHlnaWVuZSB0byBncmFiIGFuIGltbXV0YWJsZSBpbnN0YW5jZQotICAgIHByb3RlY3RlZCBmaW5hbCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIERlY29yYXRlZEtleSBrZXk7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uOwotICAgIHByb3RlY3RlZCBmaW5hbCBDb2x1bW5GaWx0ZXIgY29sdW1uczsKLSAgICBwcm90ZWN0ZWQgZmluYWwgRGVzZXJpYWxpemF0aW9uSGVscGVyIGhlbHBlcjsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBSb3cgc3RhdGljUm93OwotICAgIHByb3RlY3RlZCBmaW5hbCBSZWFkZXIgcmVhZGVyOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIEZpbGVIYW5kbGUgaWZpbGU7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNDbG9zZWQ7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgU2xpY2VzIHNsaWNlczsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIG5lZWQgdGhpcyBiZWNhdXNlIHRoZSBhbmFseXNpcyBpcyBub3QgYWJsZSB0byBkZXRlcm1pbmUgdGhhdCB3ZSBkbyBjbG9zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbGUgb24gZXZlcnkgcGF0aCB3aGVyZSB3ZSBjcmVhdGVkIGl0LgotICAgIHByb3RlY3RlZCBBYnN0cmFjdFNTVGFibGVJdGVyYXRvcihTU1RhYmxlUmVhZGVyIHNzdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEYXRhSW5wdXQgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZXMgc2xpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgY29sdW1uRmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGlmaWxlKQotICAgIHsKLSAgICAgICAgdGhpcy5zc3RhYmxlID0gc3N0YWJsZTsKLSAgICAgICAgdGhpcy5tZXRhZGF0YSA9IHNzdGFibGUubWV0YWRhdGEoKTsKLSAgICAgICAgdGhpcy5pZmlsZSA9IGlmaWxlOwotICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1uRmlsdGVyOwotICAgICAgICB0aGlzLnNsaWNlcyA9IHNsaWNlczsKLSAgICAgICAgdGhpcy5oZWxwZXIgPSBuZXcgRGVzZXJpYWxpemF0aW9uSGVscGVyKG1ldGFkYXRhLCBzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbi5jb3JyZXNwb25kaW5nTWVzc2FnaW5nVmVyc2lvbigpLCBEZXNlcmlhbGl6YXRpb25IZWxwZXIuRmxhZy5MT0NBTCwgY29sdW1uRmlsdGVyKTsKLQotICAgICAgICBpZiAoaW5kZXhFbnRyeSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnBhcnRpdGlvbkxldmVsRGVsZXRpb24gPSBEZWxldGlvblRpbWUuTElWRTsKLSAgICAgICAgICAgIHRoaXMucmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRoaXMuc3RhdGljUm93ID0gUm93cy5FTVBUWV9TVEFUSUNfUk9XOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUgPSBmaWxlID09IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBzZWVrIHRvIHRoZSBiZWdpbm5pbmcgdG8gdGhlIHBhcnRpdGlvbiBpZiBlaXRoZXI6Ci0gICAgICAgICAgICAgICAgLy8gICAtIHRoZSBwYXJ0aXRpb24gaXMgbm90IGluZGV4ZWQ7IHdlIHRoZW4gaGF2ZSBhIHNpbmdsZSBibG9jayB0byByZWFkIGFueXdheQotICAgICAgICAgICAgICAgIC8vICAgICAoYW5kIHdlIG5lZWQgdG8gcmVhZCB0aGUgcGFydGl0aW9uIGRlbGV0aW9uIHRpbWUpLgotICAgICAgICAgICAgICAgIC8vICAgLSB3ZSdyZSBxdWVyeWluZyBzdGF0aWMgY29sdW1ucy4KLSAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRTZWVrQXRQYXJ0aXRpb25TdGFydCA9ICFpbmRleEVudHJ5LmlzSW5kZXhlZCgpIHx8ICFjb2x1bW5zLmZldGNoZWRDb2x1bW5zKCkuc3RhdGljcy5pc0VtcHR5KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAobmVlZFNlZWtBdFBhcnRpdGlvblN0YXJ0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm90IGluZGV4ZWQgKG9yIGlzIHJlYWRpbmcgc3RhdGljKSwgc2V0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnRpdGlvbiBhbmQgcmVhZCBwYXJ0aXRpb24gbGV2ZWwgZGVsZXRpb24gdGhlcmUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBzc3RhYmxlLmdldEZpbGVEYXRhSW5wdXQoaW5kZXhFbnRyeS5wb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUuc2VlayhpbmRleEVudHJ5LnBvc2l0aW9uKTsKLQotICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5za2lwU2hvcnRMZW5ndGgoZmlsZSk7IC8vIFNraXAgcGFydGl0aW9uIGtleQotICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRpdGlvbkxldmVsRGVsZXRpb24gPSBEZWxldGlvblRpbWUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShmaWxlKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBuZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXIgZmlsZSAhPSBudWxsIGFuZCBhZnRlciB0aGUgcGFydGl0aW9uRGVsZXRpb24gaGFzIGJlZW4gc2V0LCBidXQgYmVmb3JlIHJlYWRTdGF0aWNSb3cKLSAgICAgICAgICAgICAgICAgICAgLy8gKHNpbmNlIGl0IHVzZXMgaXQpIHNvIHdlIGNhbid0IG1vdmUgdGhhdCB1cCAoYnV0IHdlJ2xsIGJlIGFibGUgdG8gc2ltcGxpZnkgYXMgc29vbiBhcyB3ZSBkcm9wIHN1cHBvcnQgZm9yIHRoZSBvbGQgZmlsZSBmb3JtYXQpLgotICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWRlciA9IGNyZWF0ZVJlYWRlcihpbmRleEVudHJ5LCBmaWxlLCBzaG91bGRDbG9zZUZpbGUpOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRpY1JvdyA9IHJlYWRTdGF0aWNSb3coc3N0YWJsZSwgZmlsZSwgaGVscGVyLCBjb2x1bW5zLmZldGNoZWRDb2x1bW5zKCkuc3RhdGljcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucGFydGl0aW9uTGV2ZWxEZWxldGlvbiA9IGluZGV4RW50cnkuZGVsZXRpb25UaW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGljUm93ID0gUm93cy5FTVBUWV9TVEFUSUNfUk9XOwotICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWRlciA9IGNyZWF0ZVJlYWRlcihpbmRleEVudHJ5LCBmaWxlLCBzaG91bGRDbG9zZUZpbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIXBhcnRpdGlvbkxldmVsRGVsZXRpb24udmFsaWRhdGUoKSkKLSAgICAgICAgICAgICAgICAgICAgVW5maWx0ZXJlZFZhbGlkYXRpb24uaGFuZGxlSW52YWxpZChtZXRhZGF0YSgpLCBrZXksIHNzdGFibGUsICJwYXJ0aXRpb25MZXZlbERlbGV0aW9uPSIrcGFydGl0aW9uTGV2ZWxEZWxldGlvbi50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCAmJiAhc2xpY2VzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNldEZvclNsaWNlKG5leHRTbGljZSgpKTsKLQotICAgICAgICAgICAgICAgIGlmIChyZWFkZXIgPT0gbnVsbCAmJiBmaWxlICE9IG51bGwgJiYgc2hvdWxkQ2xvc2VGaWxlKQotICAgICAgICAgICAgICAgICAgICBmaWxlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzc3RhYmxlLm1hcmtTdXNwZWN0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gZmlsZS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZENsb3NlRmlsZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIHN1cHByZXNzZWQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGUuYWRkU3VwcHJlc3NlZChzdXBwcmVzc2VkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgZmlsZVBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTbGljZSBuZXh0U2xpY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNsaWNlcy5nZXQobmV4dFNsaWNlSW5kZXgoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5leHQgc2xpY2UgdG8gcHJvY2Vzcy4KLSAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBzbGljZSB0byBwcm9jZXNzCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBuZXh0U2xpY2VJbmRleCgpOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2tzIGlmIHRoZXJlIGFyZSBtb3JlIHNsaWNlIHRvIHByb2Nlc3MuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlcmUgYXJlIG1vcmUgc2xpY2UgdG8gcHJvY2Vzcywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFzTW9yZVNsaWNlcygpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUm93IHJlYWRTdGF0aWNSb3coU1NUYWJsZVJlYWRlciBzc3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEYXRhSW5wdXQgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNlcmlhbGl6YXRpb25IZWxwZXIgaGVscGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbnMgc3RhdGljcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoIXNzdGFibGUuaGVhZGVyLmhhc1N0YXRpYygpKQotICAgICAgICAgICAgcmV0dXJuIFJvd3MuRU1QVFlfU1RBVElDX1JPVzsKLQotICAgICAgICBpZiAoc3RhdGljcy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZXIuc2tpcFN0YXRpY1JvdyhmaWxlLCBzc3RhYmxlLmhlYWRlciwgaGVscGVyKTsKLSAgICAgICAgICAgIHJldHVybiBSb3dzLkVNUFRZX1NUQVRJQ19ST1c7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gVW5maWx0ZXJlZFNlcmlhbGl6ZXIuc2VyaWFsaXplci5kZXNlcmlhbGl6ZVN0YXRpY1JvdyhmaWxlLCBzc3RhYmxlLmhlYWRlciwgaGVscGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBSZWFkZXIgY3JlYXRlUmVhZGVySW50ZXJuYWwoUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKTsKLQotICAgIHByaXZhdGUgUmVhZGVyIGNyZWF0ZVJlYWRlcihSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIEZpbGVEYXRhSW5wdXQgZmlsZSwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUpCi0gICAgewotICAgICAgICByZXR1cm4gc2xpY2VzLmlzRW1wdHkoKSA/IG5ldyBOb1Jvd3NSZWFkZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNyZWF0ZVJlYWRlckludGVybmFsKGluZGV4RW50cnksIGZpbGUsIHNob3VsZENsb3NlRmlsZSk7Ci0gICAgfTsKLQotICAgIHB1YmxpYyBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1ucygpCi0gICAgewotICAgICAgICByZXR1cm4gY29sdW1ucy5mZXRjaGVkQ29sdW1ucygpOwotICAgIH0KLQotICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwYXJ0aXRpb25MZXZlbERlbGV0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBSb3cgc3RhdGljUm93KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNSb3c7Ci0gICAgfQotCi0gICAgcHVibGljIEVuY29kaW5nU3RhdHMgc3RhdHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNzdGFibGUuc3RhdHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLSAgICB7Ci0gICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVhZGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBpZiAocmVhZGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgaWYgKCFoYXNNb3JlU2xpY2VzKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBzbGljZShuZXh0U2xpY2UoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVW5maWx0ZXJlZCBuZXh0KCkKLSAgICB7Ci0gICAgICAgIGFzc2VydCByZWFkZXIgIT0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHJlYWRlci5uZXh0KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNsaWNlKFNsaWNlIHNsaWNlKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZWFkZXIuc2V0Rm9yU2xpY2Uoc2xpY2UpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbG9zZUludGVybmFsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gc3VwcHJlc3NlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlLmFkZFN1cHByZXNzZWQoc3VwcHJlc3NlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzc3RhYmxlLm1hcmtTdXNwZWN0KCk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgcmVhZGVyLmZpbGUuZ2V0UGF0aCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2xvc2VJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gSXQncyBpbXBvcnRhbnQgdG8gbWFrZSBjbG9zaW5nIGlkZW1wb3RlbnQgc2luY2UgaXQgd291bGQgYmFkIHRvIGRvdWJsZS1jbG9zZSAnZmlsZScgYXMgaXRzIGEgUmFuZG9tQWNjZXNzUmVhZGVyCi0gICAgICAgIC8vIGFuZCBpdHMgY2xvc2UgaXMgbm90IGlkZW1wdG90ZW50IGluIHRoZSBjYXNlIHdoZXJlIHdlIHJlY3ljbGUgaXQuCi0gICAgICAgIGlmIChpc0Nsb3NlZCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpCi0gICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKLQotICAgICAgICBpc0Nsb3NlZCA9IHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNsb3NlSW50ZXJuYWwoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3N0YWJsZS5tYXJrU3VzcGVjdCgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIHJlYWRlci5maWxlLmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgUmVhZGVyIGltcGxlbWVudHMgSXRlcmF0b3I8VW5maWx0ZXJlZD4KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGU7Ci0gICAgICAgIHB1YmxpYyBGaWxlRGF0YUlucHV0IGZpbGU7Ci0KLSAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWREZXNlcmlhbGl6ZXIgZGVzZXJpYWxpemVyOwotCi0gICAgICAgIC8vIFJlY29yZHMgdGhlIGN1cnJlbnRseSBvcGVuIHJhbmdlIHRvbWJzdG9uZSAoaWYgYW55KQotICAgICAgICBwcm90ZWN0ZWQgRGVsZXRpb25UaW1lIG9wZW5NYXJrZXIgPSBudWxsOwotCi0gICAgICAgIHByb3RlY3RlZCBSZWFkZXIoRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgICAgICAgIHRoaXMuc2hvdWxkQ2xvc2VGaWxlID0gc2hvdWxkQ2xvc2VGaWxlOwotCi0gICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNyZWF0ZURlc2VyaWFsaXplcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURlc2VyaWFsaXplcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBmaWxlICE9IG51bGwgJiYgZGVzZXJpYWxpemVyID09IG51bGw7Ci0gICAgICAgICAgICBkZXNlcmlhbGl6ZXIgPSBVbmZpbHRlcmVkRGVzZXJpYWxpemVyLmNyZWF0ZShtZXRhZGF0YSwgZmlsZSwgc3N0YWJsZS5oZWFkZXIsIGhlbHBlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZWVrVG9Qb3NpdGlvbihsb25nIHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhpcyBtYXkgYmUgdGhlIGZpcnN0IHRpbWUgd2UncmUgYWN0dWFsbHkgbG9va2luZyBpbnRvIHRoZSBmaWxlCi0gICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGUgPSBzc3RhYmxlLmdldEZpbGVEYXRhSW5wdXQocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIGNyZWF0ZURlc2VyaWFsaXplcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGUuc2Vlayhwb3NpdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPcGVuTWFya2VyKFJhbmdlVG9tYnN0b25lTWFya2VyIG1hcmtlcikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGFsd2F5cyByZWFkIGluZGV4IGJsb2NrcyBpbiBmb3J3YXJkIG9yZGVyIHNvIHRoaXMgbWV0aG9kIGlzIGFsd2F5cyBjYWxsZWQgaW4gZm9yd2FyZCBvcmRlcgotICAgICAgICAgICAgb3Blbk1hcmtlciA9IG1hcmtlci5pc09wZW4oZmFsc2UpID8gbWFya2VyLm9wZW5EZWxldGlvblRpbWUoZmFsc2UpIDogbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzTmV4dEludGVybmFsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjbG9zZUludGVybmFsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBzdXBwcmVzc2VkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZS5hZGRTdXBwcmVzc2VkKHN1cHByZXNzZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzc3RhYmxlLm1hcmtTdXNwZWN0KCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIHJlYWRlci5maWxlLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZCBuZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5leHRJbnRlcm5hbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjbG9zZUludGVybmFsKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBzdXBwcmVzc2VkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZS5hZGRTdXBwcmVzc2VkKHN1cHByZXNzZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzc3RhYmxlLm1hcmtTdXNwZWN0KCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIHJlYWRlci5maWxlLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgdGhlIHJlYWRlciBzbyBpdHMgaGFzTmV4dC9uZXh0IG1ldGhvZHMgcmV0dXJuIHZhbHVlcyB3aXRoaW4gdGhlIHByb3ZpZGVkIHNsaWNlCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldEZvclNsaWNlKFNsaWNlIHNsaWNlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFzTmV4dEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVW5maWx0ZXJlZCBuZXh0SW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNob3VsZENsb3NlRmlsZSAmJiBmaWxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmVhZGVyIGZvciB3aGVuIHdlIGhhdmUgU2xpY2VzLk5PTkUgYnV0IG5lZWQgdG8gcmVhZCBzdGF0aWMgcm93IG9yIHBhcnRpdGlvbiBsZXZlbCBkZWxldGlvbgotICAgIHByaXZhdGUgY2xhc3MgTm9Sb3dzUmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3IuUmVhZGVyCi0gICAgewotICAgICAgICBwcml2YXRlIE5vUm93c1JlYWRlcihGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihmaWxlLCBzaG91bGRDbG9zZUZpbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9yU2xpY2UoU2xpY2Ugc2xpY2UpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXh0SW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWQgbmV4dEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBVc2VkIGJ5IGluZGV4ZWQgcmVhZGVycyB0byBzdG9yZSB3aGVyZSB0aGV5IGFyZSBvZiB0aGUgaW5kZXguCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmRleFN0YXRlIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWFkZXIgcmVhZGVyOwotICAgICAgICBwcml2YXRlIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3I7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSb3dJbmRleEVudHJ5IGluZGV4RW50cnk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUm93SW5kZXhFbnRyeS5JbmRleEluZm9SZXRyaWV2ZXIgaW5kZXhJbmZvUmV0cmlldmVyOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmV2ZXJzZWQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgY3VycmVudEluZGV4SWR4OwotCi0gICAgICAgIC8vIE1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudEluZGV4SWR4LgotICAgICAgICBwcml2YXRlIERhdGFQb3NpdGlvbiBtYXJrOwotCi0gICAgICAgIHB1YmxpYyBJbmRleFN0YXRlKFJlYWRlciByZWFkZXIsIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsIFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwgYm9vbGVhbiByZXZlcnNlZCwgRmlsZUhhbmRsZSBpbmRleEZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyOwotICAgICAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLSAgICAgICAgICAgIHRoaXMuaW5kZXhFbnRyeSA9IGluZGV4RW50cnk7Ci0gICAgICAgICAgICB0aGlzLmluZGV4SW5mb1JldHJpZXZlciA9IGluZGV4RW50cnkub3BlbldpdGhJbmRleChpbmRleEZpbGUpOwotICAgICAgICAgICAgdGhpcy5yZXZlcnNlZCA9IHJldmVyc2VkOwotICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXhJZHggPSByZXZlcnNlZCA/IGluZGV4RW50cnkuY29sdW1uc0luZGV4Q291bnQoKSA6IC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEb25lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJldmVyc2VkID8gY3VycmVudEluZGV4SWR4IDwgMCA6IGN1cnJlbnRJbmRleElkeCA+PSBpbmRleEVudHJ5LmNvbHVtbnNJbmRleENvdW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXRzIHRoZSByZWFkZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBibG9ja0lkeC4KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VG9CbG9jayhpbnQgYmxvY2tJZHgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYmxvY2tJZHggPj0gMCAmJiBibG9ja0lkeCA8IGluZGV4RW50cnkuY29sdW1uc0luZGV4Q291bnQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkZXIuc2Vla1RvUG9zaXRpb24oY29sdW1uT2Zmc2V0KGJsb2NrSWR4KSk7Ci0gICAgICAgICAgICAgICAgbWFyayA9IHJlYWRlci5maWxlLm1hcmsoKTsKLSAgICAgICAgICAgICAgICByZWFkZXIuZGVzZXJpYWxpemVyLmNsZWFyU3RhdGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3VycmVudEluZGV4SWR4ID0gYmxvY2tJZHg7Ci0gICAgICAgICAgICByZWFkZXIub3Blbk1hcmtlciA9IGJsb2NrSWR4ID4gMCA/IGluZGV4KGJsb2NrSWR4IC0gMSkuZW5kT3Blbk1hcmtlciA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGxvbmcgY29sdW1uT2Zmc2V0KGludCBpKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGluZGV4RW50cnkucG9zaXRpb24gKyBpbmRleChpKS5vZmZzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGJsb2Nrc0NvdW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGluZGV4RW50cnkuY29sdW1uc0luZGV4Q291bnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgYmxvY2sgaWR4IGJhc2VkIG9uIHRoZSBjdXJyZW50IHJlYWRlciBwb3NpdGlvbiBpZiB3ZSdyZSBwYXN0IHRoZSBjdXJyZW50IGJsb2NrLgotICAgICAgICAvLyBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIGZvcndhcmQgaXRlcmF0aW9uIChmb3IgcmV2ZXJzZSBvbmVzLCB3aGVuIHdlIHJlYWNoIHRoZSBlbmQgb2YgYSBibG9jayB3ZQotICAgICAgICAvLyBzaG91bGQgc2VlayB0byB0aGUgcHJldmlvdXMgb25lLCBub3QgdXBkYXRlIHRoZSBpbmRleCBzdGF0ZSBhbmQgY29udGludWUpLgotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgIXJldmVyc2VkOwotCi0gICAgICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGN1cnJlbnRCbG9ja0lkeCA8IDAsIGl0IG1lYW5zIHNldFRvQmxvY2soKSBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQsIHNvIGl0IG1lYW5zCi0gICAgICAgICAgICAvLyB3ZSdyZSBhYm91dCB0byByZWFkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFydGl0aW9uLCBidXQgaGF2ZW4ndCAicHJlcGFyZWQiIHRoZSBJbmRleFN0YXRlIHlldC4KLSAgICAgICAgICAgIC8vIERvIHNvIGJ5IHNldHRpbmcgdXMgb24gdGhlIGZpcnN0IGJsb2NrLgotICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleElkeCA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2V0VG9CbG9jaygwKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdoaWxlIChjdXJyZW50SW5kZXhJZHggKyAxIDwgaW5kZXhFbnRyeS5jb2x1bW5zSW5kZXhDb3VudCgpICYmIGlzUGFzdEN1cnJlbnRCbG9jaygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRlci5vcGVuTWFya2VyID0gY3VycmVudEluZGV4KCkuZW5kT3Blbk1hcmtlcjsKLSAgICAgICAgICAgICAgICArK2N1cnJlbnRJbmRleElkeDsKLQotICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gc2V0IHRoZSBtYXJrLCBhbmQgd2UgaGF2ZSB0byBzZXQgaXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2suIFNvIGlmIHdlJ3JlIG5vdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBibG9jaywgdGhpcyBmb3JjZXMgdXMgdG8gYSB3ZWlyZCBzZWVrIGRhbmNlLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gcmVhZGluZyBvbGQgZmlsZSBob3dldmVyLgotICAgICAgICAgICAgICAgIGxvbmcgc3RhcnRPZkJsb2NrID0gY29sdW1uT2Zmc2V0KGN1cnJlbnRJbmRleElkeCk7Ci0gICAgICAgICAgICAgICAgbG9uZyBjdXJyZW50RmlsZVBvaW50ZXIgPSByZWFkZXIuZmlsZS5nZXRGaWxlUG9pbnRlcigpOwotICAgICAgICAgICAgICAgIGlmIChzdGFydE9mQmxvY2sgPT0gY3VycmVudEZpbGVQb2ludGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWFyayA9IHJlYWRlci5maWxlLm1hcmsoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnNlZWtUb1Bvc2l0aW9uKHN0YXJ0T2ZCbG9jayk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmsgPSByZWFkZXIuZmlsZS5tYXJrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5zZWVrVG9Qb3NpdGlvbihjdXJyZW50RmlsZVBvaW50ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENoZWNrIGlmIHdlJ3ZlIGNyb3NzZWQgYW4gaW5kZXggYm91bmRhcnkgKGJhc2VkIG9uIHRoZSBtYXJrIG9uIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGluZGV4IGJsb2NrKS4KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQYXN0Q3VycmVudEJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCByZWFkZXIuZGVzZXJpYWxpemVyICE9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZGVyLmZpbGUuYnl0ZXNQYXN0TWFyayhtYXJrKSA+PSBjdXJyZW50SW5kZXgoKS53aWR0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgY3VycmVudEJsb2NrSWR4KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleElkeDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJbmRleEluZm8gY3VycmVudEluZGV4KCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbmRleChjdXJyZW50SW5kZXhJZHgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEluZGV4SW5mbyBpbmRleChpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbmRleEluZm9SZXRyaWV2ZXIuY29sdW1uc0luZGV4KGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRmluZHMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBibG9jayBjb250YWluaW5nIHRoZSBwcm92aWRlZCBib3VuZCwgc3RhcnRpbmcgYXQgdGhlIHByb3ZpZGVkIGluZGV4LgotICAgICAgICAvLyBXaWxsIGJlIC0xIGlmIHRoZSBib3VuZCBpcyBiZWZvcmUgYW55IGJsb2NrLCBhbmQgYmxvY2tzQ291bnQoKSBpZiBpdCBpcyBhZnRlciBldmVyeSBibG9jay4KLSAgICAgICAgcHVibGljIGludCBmaW5kQmxvY2tJbmRleChDbHVzdGVyaW5nQm91bmQ8Pz4gYm91bmQsIGludCBmcm9tSWR4KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJvdW5kLmlzQm90dG9tKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgaWYgKGJvdW5kLmlzVG9wKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGJsb2Nrc0NvdW50KCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBpbmRleEZvcihib3VuZCwgZnJvbUlkeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGluZGV4Rm9yKENsdXN0ZXJpbmdQcmVmaXg8Pz4gbmFtZSwgaW50IGxhc3RJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluZGV4SW5mbyB0YXJnZXQgPSBuZXcgSW5kZXhJbmZvKG5hbWUsIG5hbWUsIDAsIDAsIG51bGwpOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIFRha2UgdGhlIGV4YW1wbGUgZnJvbSB0aGUgdW5pdCB0ZXN0LCBhbmQgc2F5IHlvdXIgaW5kZXggbG9va3MgbGlrZSB0aGlzOgotICAgICAgICAgICAgWzAuLjVdWzEwLi4xNV1bMjAuLjI1XQotICAgICAgICAgICAgYW5kIHlvdSBsb29rIGZvciB0aGUgc2xpY2UgWzEzLi4xN10uCi0KLSAgICAgICAgICAgIFdoZW4gZG9pbmcgZm9yd2FyZCBzbGljZSwgd2UgYXJlIGRvaW5nIGEgYmluYXJ5IHNlYXJjaCBjb21wYXJpbmcgMTMgKHRoZSBzdGFydCBvZiB0aGUgcXVlcnkpCi0gICAgICAgICAgICB0byB0aGUgbGFzdE5hbWUgcGFydCBvZiB0aGUgaW5kZXggc2xvdC4gWW91J2xsIGVuZCB1cCB3aXRoIHRoZSAiZmlyc3QiIHNsb3QsIGdvaW5nIGZyb20gbGVmdCB0byByaWdodCwKLSAgICAgICAgICAgIHRoYXQgbWF5IGNvbnRhaW4gdGhlIHN0YXJ0LgotCi0gICAgICAgICAgICBXaGVuIGRvaW5nIGEgcmV2ZXJzZSBzbGljZSwgd2UgZG8gdGhlIHNhbWUgdGhpbmcsIG9ubHkgdXNpbmcgYXMgYSBzdGFydCBjb2x1bW4gdGhlIGVuZCBvZiB0aGUgcXVlcnksCi0gICAgICAgICAgICBpLmUuIDE3IGluIHRoaXMgZXhhbXBsZSwgY29tcGFyZWQgdG8gdGhlIGZpcnN0TmFtZSBwYXJ0IG9mIHRoZSBpbmRleCBzbG90cy4gIGJzZWFyY2ggd2lsbCBnaXZlIHVzIHRoZQotICAgICAgICAgICAgZmlyc3Qgc2xvdCB3aGVyZSBmaXJzdE5hbWUgPiBzdGFydCAoWzIwLi4yNV0gaGVyZSksIHNvIHdlIHN1YnRyYWN0IGFuIGV4dHJhIG9uZSB0byBnZXQgdGhlIHNsb3QganVzdCBiZWZvcmUuCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgaW50IHN0YXJ0SWR4ID0gMDsKLSAgICAgICAgICAgIGludCBlbmRJZHggPSBpbmRleEVudHJ5LmNvbHVtbnNJbmRleENvdW50KCkgLSAxOwotCi0gICAgICAgICAgICBpZiAocmV2ZXJzZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RJbmRleCA8IGVuZElkeCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZElkeCA9IGxhc3RJbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxhc3RJbmRleCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdGFydElkeCA9IGxhc3RJbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBpbmRleCA9IGJpbmFyeVNlYXJjaCh0YXJnZXQsIGNvbXBhcmF0b3IuaW5kZXhDb21wYXJhdG9yKHJldmVyc2VkKSwgc3RhcnRJZHgsIGVuZElkeCk7Ci0gICAgICAgICAgICByZXR1cm4gKGluZGV4IDwgMCA/IC1pbmRleCAtIChyZXZlcnNlZCA/IDIgOiAxKSA6IGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGJpbmFyeVNlYXJjaChJbmRleEluZm8ga2V5LCBDb21wYXJhdG9yPEluZGV4SW5mbz4gYywgaW50IGxvdywgaW50IGhpZ2gpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAobG93IDw9IGhpZ2gpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IG1pZCA9IChsb3cgKyBoaWdoKSA+Pj4gMTsKLSAgICAgICAgICAgICAgICBJbmRleEluZm8gbWlkVmFsID0gaW5kZXgobWlkKTsKLSAgICAgICAgICAgICAgICBpbnQgY21wID0gYy5jb21wYXJlKG1pZFZhbCwga2V5KTsKLQotICAgICAgICAgICAgICAgIGlmIChjbXAgPCAwKQotICAgICAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0gICAgICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQgLSAxOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtKGxvdyArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiSW5kZXhTdGF0ZShpbmRleFNpemU9JWQsIGN1cnJlbnRCbG9jaz0lZCwgcmV2ZXJzZWQ9JWIpIiwgaW5kZXhFbnRyeS5jb2x1bW5zSW5kZXhDb3VudCgpLCBjdXJyZW50SW5kZXhJZHgsIHJldmVyc2VkKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpbmRleEluZm9SZXRyaWV2ZXIuY2xvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbHVtbml0ZXJhdG9yL1NTVGFibGVJdGVyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29sdW1uaXRlcmF0b3IvU1NUYWJsZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MzYyZjcuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29sdW1uaXRlcmF0b3IvU1NUYWJsZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29sdW1uaXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7Ci0KLS8qKgotICogIEEgQ2VsbCBJdGVyYXRvciBvdmVyIFNTVGFibGUKLSAqLwotcHVibGljIGNsYXNzIFNTVGFibGVJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0U1NUYWJsZUl0ZXJhdG9yCi17Ci0gICAgLyoqCi0gICAgICogVGhlIGluZGV4IG9mIHRoZSBzbGljZSBiZWluZyBwcm9jZXNzZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgc2xpY2U7Ci0KLSAgICBwdWJsaWMgU1NUYWJsZUl0ZXJhdG9yKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEYXRhSW5wdXQgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5IGluZGV4RW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZXMgc2xpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIGNvbHVtbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGlmaWxlKQotICAgIHsKLSAgICAgICAgc3VwZXIoc3N0YWJsZSwgZmlsZSwga2V5LCBpbmRleEVudHJ5LCBzbGljZXMsIGNvbHVtbnMsIGlmaWxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUmVhZGVyIGNyZWF0ZVJlYWRlckludGVybmFsKFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwgRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmRleEVudHJ5LmlzSW5kZXhlZCgpCi0gICAgICAgICAgICAgPyBuZXcgRm9yd2FyZEluZGV4ZWRSZWFkZXIoaW5kZXhFbnRyeSwgZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKQotICAgICAgICAgICAgIDogbmV3IEZvcndhcmRSZWFkZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgaW50IG5leHRTbGljZUluZGV4KCkKLSAgICB7Ci0gICAgICAgIGludCBuZXh0ID0gc2xpY2U7Ci0gICAgICAgIHNsaWNlKys7Ci0gICAgICAgIHJldHVybiBuZXh0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc01vcmVTbGljZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNsaWNlIDwgc2xpY2VzLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JldmVyc2VPcmRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBGb3J3YXJkUmVhZGVyIGV4dGVuZHMgUmVhZGVyCi0gICAgewotICAgICAgICAvLyBUaGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgc2xpY2UuIFRoaXMgd2lsbCBiZSBudWxsIGFzIHNvb24gYXMgd2Uga25vdyB3ZSd2ZSBwYXNzZWQgdGhhdCBib3VuZC4KLSAgICAgICAgcHJvdGVjdGVkIENsdXN0ZXJpbmdCb3VuZDw/PiBzdGFydDsKLSAgICAgICAgLy8gVGhlIGVuZCBvZiB0aGUgY3VycmVudCBzbGljZS4gV2lsbCBuZXZlciBiZSBudWxsLgotICAgICAgICBwcm90ZWN0ZWQgQ2x1c3RlcmluZ0JvdW5kPD8+IGVuZCA9IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5UT1A7Ci0KLSAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWQgbmV4dDsgLy8gdGhlIG5leHQgZWxlbWVudCB0byByZXR1cm46IHRoaXMgaXMgY29tcHV0ZWQgYnkgaGFzTmV4dEludGVybmFsKCkuCi0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2xpY2VEb25lOyAvLyBzZXQgdG8gdHJ1ZSBvbmNlIHdlIGtub3cgd2UgaGF2ZSBubyBtb3JlIHJlc3VsdCBmb3IgdGhlIHNsaWNlLiBUaGlzIGlzIGluIHBhcnRpY3VsYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VkIGJ5IHRoZSBpbmRleGVkIHJlYWRlciB3aGVuIHdlIGtub3cgd2UgY2FuJ3QgaGF2ZSByZXN1bHRzIGJhc2VkIG9uIHRoZSBpbmRleC4KLQotICAgICAgICBwcml2YXRlIEZvcndhcmRSZWFkZXIoRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZvclNsaWNlKFNsaWNlIHNsaWNlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgc3RhcnQgPSBzbGljZS5zdGFydCgpLmlzQm90dG9tKCkgPyBudWxsIDogc2xpY2Uuc3RhcnQoKTsKLSAgICAgICAgICAgIGVuZCA9IHNsaWNlLmVuZCgpOwotCi0gICAgICAgICAgICBzbGljZURvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgIG5leHQgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2tpcCBhbGwgZGF0YSB0aGF0IGNvbWVzIGJlZm9yZSB0aGUgY3VycmVudGx5IHNldCBzbGljZS4KLSAgICAgICAgLy8gUmV0dXJuIHdoYXQgc2hvdWxkIGJlIHJldHVybmVkIGF0IHRoZSBlbmQgb2YgdGhpcywgb3IgbnVsbCBpZiBub3RoaW5nIHNob3VsZC4KLSAgICAgICAgcHJpdmF0ZSBVbmZpbHRlcmVkIGhhbmRsZVByZVNsaWNlRGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgZGVzZXJpYWxpemVyICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIGNvbXBhcmlzb24gaXMgbm90IHN0cmljdC4gVGhlIHJlYXNvbiBpcyB0aGF0IHRoZSBvbmx5IGNhc2VzCi0gICAgICAgICAgICAvLyB3aGVyZSBpdCBjYW4gYmUgPT0gaXMgaWYgdGhlICJuZXh0IiBpcyBhIFJUIHN0YXJ0IG1hcmtlciAoZWl0aGVyIGEgJ1snIG9mIGEgJylbJyBib3VuZGFyeSksCi0gICAgICAgICAgICAvLyBhbmQgaWYgd2UgaGFkIGEgc3RyaWN0IGluZXF1YWxpdHkgYW5kIGFuIG9wZW4gUlQgbWFya2VyIGJlZm9yZSB0aGlzLCB3ZSB3b3VsZCBpc3N1ZQotICAgICAgICAgICAgLy8gdGhlIG9wZW4gbWFya2VyIGZpcnN0LCBhbmQgdGhlbiByZXR1cm4gdGhlbiBuZXh0IGxhdGVyLCB3aGljaCB3b3VsZCBzZW5kIGluIHRoZQotICAgICAgICAgICAgLy8gc3RyZWFtIGJvdGggJ1snIChvciAnKCcpIGFuZCB0aGVuICcpWycgZm9yIHRoZSBzYW1lIGNsdXN0ZXJpbmcgdmFsdWUsIHdoaWNoIGlzIHdyb25nLgotICAgICAgICAgICAgLy8gQnkgdXNpbmcgYSBub24tc3RyaWN0IGluZXF1YWxpdHksIHdlIGF2b2lkIHRoYXQgcHJvYmxlbSAoaWYgd2UgZG8gZ2V0ICcpWycgZm9yIHRoZSBzYW1lCi0gICAgICAgICAgICAvLyBjbHVzdGVyaW5nIHZhbHVlIHRoYW4gdGhlIHNsaWNlLCB3ZSdsbCBzaW1wbHkgcmVjb3JkIGl0IGluICdvcGVuTWFya2VyJykuCi0gICAgICAgICAgICB3aGlsZSAoZGVzZXJpYWxpemVyLmhhc05leHQoKSAmJiBkZXNlcmlhbGl6ZXIuY29tcGFyZU5leHRUbyhzdGFydCkgPD0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZGVzZXJpYWxpemVyLm5leHRJc1JvdygpKQotICAgICAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZXIuc2tpcE5leHQoKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9wZW5NYXJrZXIoKFJhbmdlVG9tYnN0b25lTWFya2VyKWRlc2VyaWFsaXplci5yZWFkTmV4dCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IHNsaWNlU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICAgIHN0YXJ0ID0gbnVsbDsKLQotICAgICAgICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgYmVnaW5uaW5nIG9mIG91ciBxdWVyaWVkIHNsaWNlLiBJZiB3ZSBoYXZlIGFuIG9wZW4gbWFya2VyCi0gICAgICAgICAgICAvLyB3ZSBzaG91bGQgcmV0dXJuIHRoYXQgZmlyc3QuCi0gICAgICAgICAgICBpZiAob3Blbk1hcmtlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2VUb21ic3RvbmVCb3VuZE1hcmtlcihzbGljZVN0YXJ0LCBvcGVuTWFya2VyKTsKLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb21wdXRlIHRoZSBuZXh0IGVsZW1lbnQgdG8gcmV0dXJuLCBhc3N1bWluZyB3ZSdyZSBpbiB0aGUgbWlkZGxlIHRvIHRoZSBzbGljZQotICAgICAgICAvLyBhbmQgdGhlIG5leHQgZWxlbWVudCBpcyBlaXRoZXIgaW4gdGhlIHNsaWNlLCBvciBqdXN0IGFmdGVyIGl0LiBSZXR1cm5zIG51bGwKLSAgICAgICAgLy8gaWYgd2UncmUgZG9uZSB3aXRoIHRoZSBzbGljZS4KLSAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWQgY29tcHV0ZU5leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGRlc2VyaWFsaXplciAhPSBudWxsOwotCi0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBXZSB1c2UgYSBzYW1lIHJlYXNvbmluZyBhcyBpbiBoYW5kbGVQcmVTbGljZURhdGEgcmVnYXJkaW5nIHRoZSBzdHJpY3RuZXNzIG9mIHRoZSBpbmVxdWFsaXR5IGJlbG93LgotICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gZXhjbHVkZSBkZXNlcmlhbGl6ZWQgdW5maWx0ZXJlZCBlcXVhbCB0byBlbmQsIGJlY2F1c2UgMSkgd2Ugd29uJ3QgbWlzcyBhbnkgcm93cyBzaW5jZSB0aG9zZQotICAgICAgICAgICAgICAgIC8vIHdvdWRuJ3QgYmUgZXF1YWwgdG8gYSBzbGljZSBib3VuZCBhbmQgMikgYSBlbmQgYm91bmQgY2FuIGJlIGVxdWFsIHRvIGEgc3RhcnQgYm91bmQKLSAgICAgICAgICAgICAgICAvLyAoRVhDTF9FTkQoeCkgPT0gSU5DTF9TVEFSVCh4KSBmb3IgaW5zdGFuY2UpIGFuZCBpbiB0aGF0IGNhc2Ugd2UgZG9uJ3Qgd2FudCB0byByZXR1cm4gc3RhcnQgYm91bmQgYmVjYXVzZQotICAgICAgICAgICAgICAgIC8vIGl0J3MgZnVuZGFtZW50YWxseSBleGNsdWRlZC4gQW5kIGlmIHRoZSBib3VuZCBpcyBhICBlbmQgKGZvciBhIHJhbmdlIHRvbWJzdG9uZSksIGl0IG1lYW5zIGl0J3MgZXhhY3RseQotICAgICAgICAgICAgICAgIC8vIG91ciBzbGljZSBlbmQsIGJ1dCBpbiB0aGF0ICBjYXNlIHdlIHdpbGwgcHJvcGVybHkgY2xvc2UgdGhlIHJhbmdlIHRvbWJzdG9uZSBhbnl3YXkgYXMgcGFydCBvZiBvdXIgImNsb3NlCi0gICAgICAgICAgICAgICAgLy8gYW4gb3BlbiBtYXJrZXIiIGNvZGUgaW4gaGFzTmV4dEludGVybmEKLSAgICAgICAgICAgICAgICBpZiAoIWRlc2VyaWFsaXplci5oYXNOZXh0KCkgfHwgZGVzZXJpYWxpemVyLmNvbXBhcmVOZXh0VG8oZW5kKSA+PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICAgICAgICAgIFVuZmlsdGVyZWQgbmV4dCA9IGRlc2VyaWFsaXplci5yZWFkTmV4dCgpOwotICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRWYWxpZGF0aW9uLm1heWJlVmFsaWRhdGVVbmZpbHRlcmVkKG5leHQsIG1ldGFkYXRhKCksIGtleSwgc3N0YWJsZSk7Ci0gICAgICAgICAgICAgICAgLy8gV2UgbWF5IGdldCBlbXB0eSByb3cgZm9yIHRoZSBzYW1lIHJlYXNvbiBleHByZXNzZWQgb24gVW5maWx0ZXJlZFNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPbmUuCi0gICAgICAgICAgICAgICAgaWYgKG5leHQuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgIGlmIChuZXh0LmtpbmQoKSA9PSBVbmZpbHRlcmVkLktpbmQuUkFOR0VfVE9NQlNUT05FX01BUktFUikKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlT3Blbk1hcmtlcigoUmFuZ2VUb21ic3RvbmVNYXJrZXIpIG5leHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzTmV4dEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgIGlmIChzbGljZURvbmUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgICAgICBpZiAoc3RhcnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVbmZpbHRlcmVkIHVuZmlsdGVyZWQgPSBoYW5kbGVQcmVTbGljZURhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAodW5maWx0ZXJlZCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHVuZmlsdGVyZWQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbmV4dCA9IGNvbXB1dGVOZXh0KCk7Ci0gICAgICAgICAgICBpZiAobmV4dCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAvLyBmb3IgY3VycmVudCBzbGljZSwgbm8gZGF0YSByZWFkIGZyb20gZGVzZXJpYWxpemF0aW9uCi0gICAgICAgICAgICBzbGljZURvbmUgPSB0cnVlOwotICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBvcGVuIG1hcmtlciwgd2Ugc2hvdWxkIG5vdCBjbG9zZSBpdCwgdGhlcmUgY291bGQgYmUgbW9yZSBzbGljZXMKLSAgICAgICAgICAgIGlmIChvcGVuTWFya2VyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV4dCA9IG5ldyBSYW5nZVRvbWJzdG9uZUJvdW5kTWFya2VyKGVuZCwgb3Blbk1hcmtlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBuZXh0SW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFoYXNOZXh0SW50ZXJuYWwoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCi0gICAgICAgICAgICBVbmZpbHRlcmVkIHRvUmV0dXJuID0gbmV4dDsKLSAgICAgICAgICAgIG5leHQgPSBudWxsOwotICAgICAgICAgICAgcmV0dXJuIHRvUmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBGb3J3YXJkSW5kZXhlZFJlYWRlciBleHRlbmRzIEZvcndhcmRSZWFkZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSW5kZXhTdGF0ZSBpbmRleFN0YXRlOwotCi0gICAgICAgIHByaXZhdGUgaW50IGxhc3RCbG9ja0lkeDsgLy8gdGhlIGxhc3QgaW5kZXggYmxvY2sgdGhhdCBoYXMgZGF0YSBmb3IgdGhlIGN1cnJlbnQgcXVlcnkKLQotICAgICAgICBwcml2YXRlIEZvcndhcmRJbmRleGVkUmVhZGVyKFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwgRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKLSAgICAgICAgICAgIHRoaXMuaW5kZXhTdGF0ZSA9IG5ldyBJbmRleFN0YXRlKHRoaXMsIG1ldGFkYXRhLmNvbXBhcmF0b3IsIGluZGV4RW50cnksIGZhbHNlLCBpZmlsZSk7Ci0gICAgICAgICAgICB0aGlzLmxhc3RCbG9ja0lkeCA9IGluZGV4U3RhdGUuYmxvY2tzQ291bnQoKTsgLy8gaWYgd2UgbmV2ZXIgY2FsbCBzZXRGb3JTbGljZSwgdGhhdCdzIHdoZXJlIHdlIHdhbnQgdG8gc3RvcAotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICB0aGlzLmluZGV4U3RhdGUuY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb3JTbGljZShTbGljZSBzbGljZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyLnNldEZvclNsaWNlKHNsaWNlKTsKLQotICAgICAgICAgICAgLy8gaWYgb3VyIHByZXZpb3VzIHNsaWNpbmcgYWxyZWFkeSBnb3QgdXMgdGhlIGJpZ2dlc3Qgcm93IGluIHRoZSBzc3RhYmxlLCB3ZSdyZSBkb25lCi0gICAgICAgICAgICBpZiAoaW5kZXhTdGF0ZS5pc0RvbmUoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzbGljZURvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgaW5kZXggYmxvY2sgd2UnbGwgbmVlZCB0byByZWFkIGZvciB0aGUgc2xpY2UuCi0gICAgICAgICAgICBpbnQgc3RhcnRJZHggPSBpbmRleFN0YXRlLmZpbmRCbG9ja0luZGV4KHNsaWNlLnN0YXJ0KCksIGluZGV4U3RhdGUuY3VycmVudEJsb2NrSWR4KCkpOwotICAgICAgICAgICAgaWYgKHN0YXJ0SWR4ID49IGluZGV4U3RhdGUuYmxvY2tzQ291bnQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzbGljZURvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRmluZCB0aGUgbGFzdCBpbmRleCBibG9jayB3ZSdsbCBuZWVkIHRvIHJlYWQgZm9yIHRoZSBzbGljZS4KLSAgICAgICAgICAgIGxhc3RCbG9ja0lkeCA9IGluZGV4U3RhdGUuZmluZEJsb2NrSW5kZXgoc2xpY2UuZW5kKCksIHN0YXJ0SWR4KTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIHNsaWNlIGVuZCBpcyBiZWZvcmUgdGhlIHZlcnkgZmlyc3QgYmxvY2ssIHdlIGhhdmUgbm90aGluZyBmb3IgdGhhdCBzbGljZQotICAgICAgICAgICAgaWYgKGxhc3RCbG9ja0lkeCA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHN0YXJ0SWR4IDwgMDsKLSAgICAgICAgICAgICAgICBzbGljZURvbmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgd2Ugc3RhcnQgYmVmb3JlIHRoZSB2ZXJ5IGZpcnN0IGJsb2NrLCBqdXN0IHJlYWQgZnJvbSB0aGUgZmlyc3Qgb25lLgotICAgICAgICAgICAgaWYgKHN0YXJ0SWR4IDwgMCkKLSAgICAgICAgICAgICAgICBzdGFydElkeCA9IDA7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoYXQncyB0aGUgbGFzdCBibG9jayB3ZSB3ZXJlIHJlYWRpbmcsIHdlJ3JlIGFscmVhZHkgd2hlcmUgd2Ugd2FudCB0byBiZS4gT3RoZXJ3aXNlLAotICAgICAgICAgICAgLy8gc2VlayB0byB0aGF0IGZpcnN0IGJsb2NrCi0gICAgICAgICAgICBpZiAoc3RhcnRJZHggIT0gaW5kZXhTdGF0ZS5jdXJyZW50QmxvY2tJZHgoKSkKLSAgICAgICAgICAgICAgICBpbmRleFN0YXRlLnNldFRvQmxvY2soc3RhcnRJZHgpOwotCi0gICAgICAgICAgICAvLyBUaGUgaW5kZXggc2VhcmNoIGlzIGJhc2VkIG9uIHRoZSBsYXN0IG5hbWUgb2YgdGhlIGluZGV4IGJsb2Nrcywgc28gYXQgdGhhdCBwb2ludCB3ZSBoYXZlIHRoYXQ6Ci0gICAgICAgICAgICAvLyAgIDEpIGluZGV4ZXNbY3VycmVudElkeCAtIDFdLmxhc3ROYW1lIDwgc2xpY2Uuc3RhcnQgPD0gaW5kZXhlc1tjdXJyZW50SWR4XS5sYXN0TmFtZQotICAgICAgICAgICAgLy8gICAyKSBpbmRleGVzW2xhc3RCbG9ja0lkeCAtIDFdLmxhc3ROYW1lIDwgc2xpY2UuZW5kIDw9IGluZGV4ZXNbbGFzdEJsb2NrSWR4XS5sYXN0TmFtZQotICAgICAgICAgICAgLy8gc28gaWYgY3VycmVudElkeCA9PSBsYXN0QmxvY2tJZHggYW5kIHNsaWNlLmVuZCA8IGluZGV4ZXNbY3VycmVudElkeF0uZmlyc3ROYW1lLCB3ZSdyZSBndWFyYW50ZWVkIHRoYXQgdGhlCi0gICAgICAgICAgICAvLyB3aG9sZSBzbGljZSBpcyBiZXR3ZWVuIHRoZSBwcmV2aW91cyBibG9jayBlbmQgYW5kIHRoaXMgYmxvY2sgc3RhcnQsIGFuZCB0aHVzIGhhcyBubyBjb3JyZXNwb25kaW5nCi0gICAgICAgICAgICAvLyBkYXRhLiBPbmUgZXhjZXB0aW9uIGlzIGlmIHRoZSBwcmV2aW91cyBibG9jayBlbmRzIHdpdGggYW4gb3Blbk1hcmtlciBhcyBpdCB3aWxsIGNvdmVyIG91ciBzbGljZQotICAgICAgICAgICAgLy8gYW5kIHdlIG5lZWQgdG8gcmV0dXJuIGl0LgotICAgICAgICAgICAgaWYgKGluZGV4U3RhdGUuY3VycmVudEJsb2NrSWR4KCkgPT0gbGFzdEJsb2NrSWR4Ci0gICAgICAgICAgICAgICAgJiYgbWV0YWRhdGEoKS5jb21wYXJhdG9yLmNvbXBhcmUoc2xpY2UuZW5kKCksIGluZGV4U3RhdGUuY3VycmVudEluZGV4KCkuZmlyc3ROYW1lKSA8IDAKLSAgICAgICAgICAgICAgICAmJiBvcGVuTWFya2VyID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2xpY2VEb25lID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBjb21wdXRlTmV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBPdXIgcHJldmlvdXMgcmVhZCBtaWdodCBoYXZlIG1hZGUgdXMgY3Jvc3MgYW4gaW5kZXggYmxvY2sgYm91bmRhcnkuIElmIHNvLCB1cGRhdGUgb3VyIGluZm9ybWF0aW9ucy4KLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFydGl0aW9uLCB0aGlzIGlzIGFsc28gd2hhdCB3aWxsIGluaXRpYWxpemUgdGhlIGluZGV4IHN0YXRlLgotICAgICAgICAgICAgICAgIGluZGV4U3RhdGUudXBkYXRlQmxvY2soKTsKLQotICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgbmV4dCB1bmZpbHRlcmVkIHVubGVzcyB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQsIG9yIHdlJ3JlIGJleW9uZCBvdXIgc2xpY2UKLSAgICAgICAgICAgICAgICAvLyBlbmQgKG5vdGUgdGhhdCB1bmxlc3Mgd2UncmUgb24gdGhlIGxhc3QgYmxvY2sgZm9yIHRoZSBzbGljZSwgdGhlcmUgaXMgbm8gcG9pbnQKLSAgICAgICAgICAgICAgICAvLyBpbiBjaGVja2luZyB0aGUgc2xpY2UgZW5kKS4KLSAgICAgICAgICAgICAgICBpZiAoaW5kZXhTdGF0ZS5pc0RvbmUoKQotICAgICAgICAgICAgICAgICAgICB8fCBpbmRleFN0YXRlLmN1cnJlbnRCbG9ja0lkeCgpID4gbGFzdEJsb2NrSWR4Ci0gICAgICAgICAgICAgICAgICAgIHx8ICFkZXNlcmlhbGl6ZXIuaGFzTmV4dCgpCi0gICAgICAgICAgICAgICAgICAgIHx8IChpbmRleFN0YXRlLmN1cnJlbnRCbG9ja0lkeCgpID09IGxhc3RCbG9ja0lkeCAmJiBkZXNlcmlhbGl6ZXIuY29tcGFyZU5leHRUbyhlbmQpID49IDApKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotCi0gICAgICAgICAgICAgICAgVW5maWx0ZXJlZCBuZXh0ID0gZGVzZXJpYWxpemVyLnJlYWROZXh0KCk7Ci0gICAgICAgICAgICAgICAgVW5maWx0ZXJlZFZhbGlkYXRpb24ubWF5YmVWYWxpZGF0ZVVuZmlsdGVyZWQobmV4dCwgbWV0YWRhdGEoKSwga2V5LCBzc3RhYmxlKTsKLSAgICAgICAgICAgICAgICAvLyBXZSBtYXkgZ2V0IGVtcHR5IHJvdyBmb3IgdGhlIHNhbWUgcmVhc29uIGV4cHJlc3NlZCBvbiBVbmZpbHRlcmVkU2VyaWFsaXplci5kZXNlcmlhbGl6ZU9uZS4KLSAgICAgICAgICAgICAgICBpZiAobmV4dC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgaWYgKG5leHQua2luZCgpID09IFVuZmlsdGVyZWQuS2luZC5SQU5HRV9UT01CU1RPTkVfTUFSS0VSKQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcGVuTWFya2VyKChSYW5nZVRvbWJzdG9uZU1hcmtlcikgbmV4dCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb2x1bW5pdGVyYXRvci9TU1RhYmxlUmV2ZXJzZWRJdGVyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29sdW1uaXRlcmF0b3IvU1NUYWJsZVJldmVyc2VkSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwYWFmYS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb2x1bW5pdGVyYXRvci9TU1RhYmxlUmV2ZXJzZWRJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbHVtbml0ZXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkltbXV0YWJsZUJUcmVlUGFydGl0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQWJzdHJhY3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5idHJlZS5CVHJlZTsKLQotLyoqCi0gKiAgQSBDZWxsIEl0ZXJhdG9yIGluIHJldmVyc2VkIGNsdXN0ZXJpbmcgb3JkZXIgb3ZlciBTU1RhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTU1RhYmxlUmV2ZXJzZWRJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0U1NUYWJsZUl0ZXJhdG9yCi17Ci0gICAgLyoqCi0gICAgICogVGhlIGluZGV4IG9mIHRoZSBzbGljZSBiZWluZyBwcm9jZXNzZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgc2xpY2U7Ci0KLSAgICBwdWJsaWMgU1NUYWJsZVJldmVyc2VkSXRlcmF0b3IoU1NUYWJsZVJlYWRlciBzc3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGF0YUlucHV0IGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2VzIHNsaWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIGNvbHVtbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUgaWZpbGUpCi0gICAgewotICAgICAgICBzdXBlcihzc3RhYmxlLCBmaWxlLCBrZXksIGluZGV4RW50cnksIHNsaWNlcywgY29sdW1ucywgaWZpbGUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBSZWFkZXIgY3JlYXRlUmVhZGVySW50ZXJuYWwoUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZGV4RW50cnkuaXNJbmRleGVkKCkKLSAgICAgICAgICAgICA/IG5ldyBSZXZlcnNlSW5kZXhlZFJlYWRlcihpbmRleEVudHJ5LCBmaWxlLCBzaG91bGRDbG9zZUZpbGUpCi0gICAgICAgICAgICAgOiBuZXcgUmV2ZXJzZVJlYWRlcihmaWxlLCBzaG91bGRDbG9zZUZpbGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmV2ZXJzZU9yZGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgbmV4dFNsaWNlSW5kZXgoKQotICAgIHsKLSAgICAgICAgaW50IG5leHQgPSBzbGljZTsKLSAgICAgICAgc2xpY2UrKzsKLSAgICAgICAgcmV0dXJuIHNsaWNlcy5zaXplKCkgLSAobmV4dCArIDEpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGhhc01vcmVTbGljZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNsaWNlIDwgc2xpY2VzLnNpemUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFJldmVyc2VSZWFkZXIgZXh0ZW5kcyBSZWFkZXIKLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBSZXVzYWJsZVBhcnRpdGlvbkRhdGEgYnVmZmVyOwotICAgICAgICBwcm90ZWN0ZWQgSXRlcmF0b3I8VW5maWx0ZXJlZD4gaXRlcmF0b3I7Ci0KLSAgICAgICAgLy8gU2V0IGluIGxvYWRGcm9tRGlzayAoKSBhbmQgdXNlZCBpbiBzZXRJdGVyYXRvciB0byBoYW5kbGUgcmFuZ2UgdG9tYnN0b25lIGV4dGVuZGluZyBvbiBtdWx0aXBsZSBpbmRleCBibG9jay4gU2VlCi0gICAgICAgIC8vIGxvYWRGcm9tRGlzayBmb3IgZGV0YWlscy4gTm90ZSB0aGF0IHRob3NlIGFyZSBhbHdheXMgZmFsc2UgZm9yIG5vbi1pbmRleGVkIHJlYWRlcnMuCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHNraXBGaXJzdEl0ZXJhdGVkSXRlbTsKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcExhc3RJdGVyYXRlZEl0ZW07Ci0KLSAgICAgICAgcHJpdmF0ZSBSZXZlcnNlUmVhZGVyKEZpbGVEYXRhSW5wdXQgZmlsZSwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGZpbGUsIHNob3VsZENsb3NlRmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgUmV1c2FibGVQYXJ0aXRpb25EYXRhIGNyZWF0ZUJ1ZmZlcihpbnQgYmxvY2tzQ291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBlc3RpbWF0ZWRSb3dDb3VudCA9IDE2OwotICAgICAgICAgICAgaW50IGNvbHVtbkNvdW50ID0gbWV0YWRhdGEoKS5yZWd1bGFyQ29sdW1ucygpLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChjb2x1bW5Db3VudCA9PSAwIHx8IG1ldGFkYXRhKCkuY2x1c3RlcmluZ0NvbHVtbnMoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXN0aW1hdGVkUm93Q291bnQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVG8gYXZvaWQgd2FzdGVkIHJlc2l6aW5nIHdlIGd1ZXNzLWVzdGltYXRlIHRoZSBudW1iZXIgb2Ygcm93cyB3ZSdyZSBsaWtlbHkgdG8gcmVhZC4gRm9yIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgLy8gd2UgdXNlIHRoZSBzdGF0cyBvbiB0aGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhcnRpdGlvbiBmb3IgdGhhdCBzc3RhYmxlLgotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRTogc28gZmFyIHdlIG9ubHkga2VlcCBzdGF0cyBvbiBjZWxscywgc28gdG8gZ2V0IGEgcm91Z2ggZXN0aW1hdGUgb24gdGhlIG51bWJlciBvZiByb3dzLAotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkaXZpZGUgYnkgdGhlIG51bWJlciBvZiByZWd1bGFyIGNvbHVtbnMgdGhlIHRhYmxlIGhhcy4gV2Ugc2hvdWxkIGZpeCBvbmNlIHdlIGNvbGxlY3QgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIHN0YXRzIG9uIHJvd3MKLSAgICAgICAgICAgICAgICAgICAgaW50IGVzdGltYXRlZFJvd3NQZXJQYXJ0aXRpb24gPSAoaW50KShzc3RhYmxlLmdldEVzdGltYXRlZENlbGxQZXJQYXJ0aXRpb25Db3VudCgpLnBlcmNlbnRpbGUoMC43NSkgLyBjb2x1bW5Db3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZFJvd0NvdW50ID0gTWF0aC5tYXgoZXN0aW1hdGVkUm93c1BlclBhcnRpdGlvbiAvIGJsb2Nrc0NvdW50LCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIEVzdGltYXRlZEhpc3RvZ3JhbSBtZWFuKCkgbWV0aG9kIGNhbiB0aHJvdyB0aGlzIChpZiBpdCBvdmVyZmxvd3MpLiBXaGlsZSBzdWNoIG92ZXJmbG93Ci0gICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4sIGl0J3Mgbm90IHdvcnRoIHRha2luZyB0aGUgcmlzayBvZiBsZXR0aW5nIHRoZSBleGNlcHRpb24gYnViYmxlIHVwLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUmV1c2FibGVQYXJ0aXRpb25EYXRhKG1ldGFkYXRhKCksIHBhcnRpdGlvbktleSgpLCBjb2x1bW5zKCksIGVzdGltYXRlZFJvd0NvdW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZvclNsaWNlKFNsaWNlIHNsaWNlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSByZWFkIHRoZSBkYXRhLCBqdXN0IGNyZWF0ZSB0aGUgaXRlcmF0b3IgZm9yIHRoZSBzbGljZS4gT3RoZXJ3aXNlLCByZWFkIHRoZSBkYXRhLgotICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGNyZWF0ZUJ1ZmZlcigxKTsKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2FuIHJldXNlIHRoYXQgYnVmZmVyIGJldHdlZW4gc2xpY2VzICh3ZSBjb3VsZCBhbHRlcm5hdGl2ZWx5IHJlLXJlYWQgZnJvbSBkaXNrCi0gICAgICAgICAgICAgICAgLy8gZXZlcnkgdGltZSwgYnV0IHRoYXQgZmVlbHMgbW9yZSB3YXN0ZWZ1bCkgc28gd2Ugd2FudCB0byBpbmNsdWRlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgYmVnaW5uaW5nLgotICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBzdG9wIGF0IHRoZSBzbGljZSBlbmQgaG93ZXZlciBzaW5jZSBhbnkgZm9sbG93aW5nIHNsaWNlIHdpbGwgYmUgYmVmb3JlIHRoYXQuCi0gICAgICAgICAgICAgICAgbG9hZEZyb21EaXNrKG51bGwsIHNsaWNlLmVuZCgpLCBmYWxzZSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0SXRlcmF0b3Ioc2xpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2V0SXRlcmF0b3IoU2xpY2Ugc2xpY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBidWZmZXIgIT0gbnVsbDsKLSAgICAgICAgICAgIGl0ZXJhdG9yID0gYnVmZmVyLmJ1aWx0LnVuZmlsdGVyZWRJdGVyYXRvcihjb2x1bW5zLCBTbGljZXMud2l0aChtZXRhZGF0YSgpLmNvbXBhcmF0b3IsIHNsaWNlKSwgdHJ1ZSk7Ci0KLSAgICAgICAgICAgIGlmICghaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKHNraXBGaXJzdEl0ZXJhdGVkSXRlbSkKLSAgICAgICAgICAgICAgICBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmIChza2lwTGFzdEl0ZXJhdGVkSXRlbSkKLSAgICAgICAgICAgICAgICBpdGVyYXRvciA9IG5ldyBTa2lwTGFzdEl0ZXJhdG9yKGl0ZXJhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGhhc05leHRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSd2ZSBuZXZlciBjYWxsZWQgc2V0Rm9yU2xpY2UsIHdlJ3JlIHJlYWRpbmcgZXZlcnl0aGluZwotICAgICAgICAgICAgaWYgKGl0ZXJhdG9yID09IG51bGwpCi0gICAgICAgICAgICAgICAgc2V0Rm9yU2xpY2UoU2xpY2UuQUxMKTsKLQotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIG5leHRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWhhc05leHQoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHN0b3BSZWFkaW5nRGlzaygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSZWFkcyB0aGUgdW5maWx0ZXJlZCBmcm9tIGRpc2sgYW5kIGxvYWQgdGhlbSBpbnRvIHRoZSByZWFkZXIgYnVmZmVyLiBJdCBzdG9wcyByZWFkaW5nIHdoZW4gZWl0aGVyIHRoZSBwYXJ0aXRpb24KLSAgICAgICAgLy8gaXMgZnVsbHkgcmVhZCwgb3Igd2hlbiBzdG9wUmVhZGluZ0Rpc2soKSByZXR1cm5zIHRydWUuCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIGxvYWRGcm9tRGlzayhDbHVzdGVyaW5nQm91bmQ8Pz4gc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNQcmV2aW91c0Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNOZXh0QmxvY2spIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBzdGFydCAhPSBudWxsIG1lYW5zIGl0J3MgdGhlIGJsb2NrIGNvdmVyaW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNsaWNlLCBzbyBpdCBoYXMgdG8gYmUgdGhlIGxhc3QgYmxvY2sgZm9yIHRoaXMgc2xpY2UuCi0gICAgICAgICAgICBhc3NlcnQgc3RhcnQgPT0gbnVsbCB8fCAhaGFzTmV4dEJsb2NrOwotCi0gICAgICAgICAgICBidWZmZXIucmVzZXQoKTsKLSAgICAgICAgICAgIHNraXBGaXJzdEl0ZXJhdGVkSXRlbSA9IGZhbHNlOwotICAgICAgICAgICAgc2tpcExhc3RJdGVyYXRlZEl0ZW0gPSBmYWxzZTsKLQotICAgICAgICAgICAgLy8gSWYgdGhlIHN0YXJ0IG1pZ2h0IGJlIGluIHRoaXMgYmxvY2ssIHNraXAgZXZlcnl0aGluZyB0aGF0IGNvbWVzIGJlZm9yZSBpdC4KLSAgICAgICAgICAgIGlmIChzdGFydCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlIChkZXNlcmlhbGl6ZXIuaGFzTmV4dCgpICYmIGRlc2VyaWFsaXplci5jb21wYXJlTmV4dFRvKHN0YXJ0KSA8PSAwICYmICFzdG9wUmVhZGluZ0Rpc2soKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXNlcmlhbGl6ZXIubmV4dElzUm93KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZXIuc2tpcE5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlT3Blbk1hcmtlcigoUmFuZ2VUb21ic3RvbmVNYXJrZXIpZGVzZXJpYWxpemVyLnJlYWROZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBvcGVuIG1hcmtlciwgaXQncyBlaXRoZXIgb25lIGZyb20gd2hhdCB3ZSBqdXN0IHNraXBwZWQgb3IgaXQncyBvbmUgdGhhdCBvcGVuIGluIHRoZSBuZXh0IChvcgotICAgICAgICAgICAgLy8gb25lIG9mIHRoZSBuZXh0KSBpbmRleCBibG9jayAoaWYgb3Blbk1hcmtlciA9PSBvcGVuTWFya2VyQXRTdGFydE9mQmxvY2spLgotICAgICAgICAgICAgaWYgKG9wZW5NYXJrZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGZlZWQgYSBtYXJrZXIgdG8gdGhlIGJ1ZmZlciwgYmVjYXVzZSB0aGF0IG1hcmtlciBpcyBsaWtlbHkgdG8gYmUgY2xvc2UgbGF0ZXIgYW5kIEltbXRhYmxlQlRyZWVQYXJ0aXRpb24KLSAgICAgICAgICAgICAgICAvLyBkb2Vzbid0IHRha2Uga2luZGx5IHRvIG1hcmtlciB0aGF0IGNvbWVzIHdpdGhvdXQgdGhlaXIgY291bnRlcnBhcnQuIElmIHRoYXQncyB0aGUgbGFzdCBibG9jayB3ZSdyZSBnb25uYSByZWFkIChmb3IKLSAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBzbGljZSBhdCBsZWFzdCkgaXQncyBlYXN5IGJlY2F1c2Ugd2UnbGwgd2FudCB0byByZXR1cm4gdGhhdCBvcGVuIG1hcmtlciBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhIGluIHRoaXMKLSAgICAgICAgICAgICAgICAvLyBibG9jayBhbnl3YXksIHNvIHdlIGhhdmUgbm90aGluZyBtb3JlIHRvIGRvIHRoYW4gYWRkaW5nIGl0IHRvIHRoZSBidWZmZXIuCi0gICAgICAgICAgICAgICAgLy8gSWYgaXQncyBub3QgdGhlIGxhc3QgYmxvY2sgaG93ZXZlciwgaW4gd2hpY2ggY2FzZSB3ZSBrbm93IHdlJ2xsIGhhdmUgc3RhcnQgPT0gbnVsbCwgaXQgbWVhbnMgdGhpcyBtYXJrZXIgaXMgcmVhbGx5Ci0gICAgICAgICAgICAgICAgLy8gb3BlbiBpbiBhIG5leHQgYmxvY2sgYW5kIHNvIHdoaWxlIHdlIGRvIG5lZWQgdG8gYWRkIGl0IHRoZSBidWZmZXIgZm9yIHRoZSByZWFzb24gbWVudGlvbmVkIGFib3ZlLCB3ZSBkb24ndAotICAgICAgICAgICAgICAgIC8vIHdhbnQgdG8gInJldHVybiIgaXQganVzdCB5ZXQsIHdlJ2xsIHdhaXQgdW50aWwgd2UgcmVhY2ggaXQgaW4gdGhlIG5leHQgYmxvY2tzLiBUaGF0J3Mgd2h5IHdlIHRyaWdnZXIKLSAgICAgICAgICAgICAgICAvLyBza2lwTGFzdEl0ZXJhdGVkSXRlbSBpbiB0aGF0IGNhc2UgKHRoaXMgaXMgZmlyc3QgaXRlbSBvZiB0aGUgYmxvY2ssIGJ1dCB3ZSdyZSBpdGVyYXRpbmcgaW4gcmV2ZXJzZSBvcmRlcgotICAgICAgICAgICAgICAgIC8vIHNvIGl0IHdpbGwgYmUgbGFzdCByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IpLgotICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdCb3VuZDw/PiBtYXJrZXJTdGFydCA9IHN0YXJ0ID09IG51bGwgPyBCdWZmZXJDbHVzdGVyaW5nQm91bmQuQk9UVE9NIDogc3RhcnQ7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFkZChuZXcgUmFuZ2VUb21ic3RvbmVCb3VuZE1hcmtlcihtYXJrZXJTdGFydCwgb3Blbk1hcmtlcikpOwotICAgICAgICAgICAgICAgIGlmIChoYXNOZXh0QmxvY2spCi0gICAgICAgICAgICAgICAgICAgIHNraXBMYXN0SXRlcmF0ZWRJdGVtID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTm93IGRlc2VyaWFsaXplIGV2ZXJ5dGhpbmcgdW50aWwgd2UgcmVhY2ggb3VyIHJlcXVlc3RlZCBlbmQgKGlmIHdlIGhhdmUgb25lKQotICAgICAgICAgICAgLy8gU2VlIFNTVGFibGVJdGVyYXRvci5Gb3J3YXJkUmVhZC5jb21wdXRlTmV4dCgpIGZvciB3aHkgdGhpcyBpcyBhIHN0cmljdCBpbmVxdWFsaXR5IGJlbG93OiB0aGlzIGlzIHRoZSBzYW1lCi0gICAgICAgICAgICAvLyByZWFzb25pbmcgaGVyZS4KLSAgICAgICAgICAgIHdoaWxlIChkZXNlcmlhbGl6ZXIuaGFzTmV4dCgpCi0gICAgICAgICAgICAgICAgICAgJiYgKGVuZCA9PSBudWxsIHx8IGRlc2VyaWFsaXplci5jb21wYXJlTmV4dFRvKGVuZCkgPCAwKQotICAgICAgICAgICAgICAgICAgICYmICFzdG9wUmVhZGluZ0Rpc2soKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVbmZpbHRlcmVkIHVuZmlsdGVyZWQgPSBkZXNlcmlhbGl6ZXIucmVhZE5leHQoKTsKLSAgICAgICAgICAgICAgICBVbmZpbHRlcmVkVmFsaWRhdGlvbi5tYXliZVZhbGlkYXRlVW5maWx0ZXJlZCh1bmZpbHRlcmVkLCBtZXRhZGF0YSgpLCBrZXksIHNzdGFibGUpOwotICAgICAgICAgICAgICAgIC8vIFdlIG1heSBnZXQgZW1wdHkgcm93IGZvciB0aGUgc2FtZSByZWFzb24gZXhwcmVzc2VkIG9uIFVuZmlsdGVyZWRTZXJpYWxpemVyLmRlc2VyaWFsaXplT25lLgotICAgICAgICAgICAgICAgIGlmICghdW5maWx0ZXJlZC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5hZGQodW5maWx0ZXJlZCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodW5maWx0ZXJlZC5pc1JhbmdlVG9tYnN0b25lTWFya2VyKCkpCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9wZW5NYXJrZXIoKFJhbmdlVG9tYnN0b25lTWFya2VyKXVuZmlsdGVyZWQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIG9wZW4gbWFya2VyLCB3ZSBzaG91bGQgY2xvc2UgaXQgYmVmb3JlIGZpbmlzaGluZwotICAgICAgICAgICAgaWYgKG9wZW5NYXJrZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByZXZlcnNlIHByb2JsZW0gdGhhbiB0aGUgb25lIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2suIE5hbWVseSwgaWYgaXQncyB0aGUgZmlyc3QgYmxvY2sKLSAgICAgICAgICAgICAgICAvLyB3ZSBkZXNlcmlhbGl6ZSBmb3IgdGhlIHNsaWNlICh0aGUgb25lIGNvdmVyaW5nIHRoZSBzbGljZSBlbmQgYmFzaWNhbGx5KSwgdGhlbiBpdCdzIGVhc3ksIHdlIGp1c3Qgd2FudAotICAgICAgICAgICAgICAgIC8vIHRvIGFkZCB0aGUgY2xvc2UgbWFya2VyIHRvIHRoZSBidWZmZXIgYW5kIHJldHVybiBpdCBub3JtYWxseS4KLSAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdGUgb3VyIGZpcnN0IGJsb2NrIChmb3IgdGhlIHNsaWNlKSBob3dldmVyLCBpdCBtZWFucyB0aGF0IG1hcmtlciBjbG9zZWQgaW4gYSBwcmV2aW91c2x5IHJlYWQKLSAgICAgICAgICAgICAgICAvLyBibG9jayBhbmQgd2UgaGF2ZSBhbHJlYWR5IHJldHVybmVkIGl0LiBTbyB3aGlsZSB3ZSBzaG91bGQgc3RpbGwgYWRkIGl0IHRvIHRoZSBidWZmZXIgZm9yIHRoZSBzYWtlIG9mCi0gICAgICAgICAgICAgICAgLy8gbm90IGJyZWFraW5nIEltbXV0YWJsZUJUcmVlUGFydGl0aW9uLCB3ZSBzaG91bGQgc2tpcCBpdCB3aGVuIHJldHVybmluZyBmcm9tIHRoZSBpdGVyYXRvciwgaGVuY2UgdGhlCi0gICAgICAgICAgICAgICAgLy8gc2tpcEZpcnN0SXRlcmF0ZWRJdGVtICh0aGlzIGlzIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIGJsb2NrLCBidXQgd2UncmUgaXRlcmF0aW5nIGluIHJldmVyc2Ugb3JkZXIgc28gaXQgd2lsbAotICAgICAgICAgICAgICAgIC8vIGJlIHRoZSBmaXJzdCByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IpLgotICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdCb3VuZDw/PiBtYXJrZXJFbmQgPSBlbmQgPT0gbnVsbCA/IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5UT1AgOiBlbmQ7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLmFkZChuZXcgUmFuZ2VUb21ic3RvbmVCb3VuZE1hcmtlcihtYXJrZXJFbmQsIG9wZW5NYXJrZXIpKTsKLSAgICAgICAgICAgICAgICBpZiAoaGFzUHJldmlvdXNCbG9jaykKLSAgICAgICAgICAgICAgICAgICAgc2tpcEZpcnN0SXRlcmF0ZWRJdGVtID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnVmZmVyLmJ1aWxkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFJldmVyc2VJbmRleGVkUmVhZGVyIGV4dGVuZHMgUmV2ZXJzZVJlYWRlcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbmRleFN0YXRlIGluZGV4U3RhdGU7Ci0KLSAgICAgICAgLy8gVGhlIHNsaWNlIHdlJ3JlIGN1cnJlbnRseSBpdGVyYXRpbmcgb3ZlcgotICAgICAgICBwcml2YXRlIFNsaWNlIHNsaWNlOwotICAgICAgICAvLyBUaGUgbGFzdCBpbmRleCBibG9jayB0byBjb25zaWRlciBmb3IgdGhlIHNsaWNlCi0gICAgICAgIHByaXZhdGUgaW50IGxhc3RCbG9ja0lkeDsKLQotICAgICAgICBwcml2YXRlIFJldmVyc2VJbmRleGVkUmVhZGVyKFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwgRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKLSAgICAgICAgICAgIHRoaXMuaW5kZXhTdGF0ZSA9IG5ldyBJbmRleFN0YXRlKHRoaXMsIG1ldGFkYXRhLmNvbXBhcmF0b3IsIGluZGV4RW50cnksIHRydWUsIGlmaWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlci5jbG9zZSgpOwotICAgICAgICAgICAgdGhpcy5pbmRleFN0YXRlLmNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9yU2xpY2UoU2xpY2Ugc2xpY2UpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNsaWNlID0gc2xpY2U7Ci0KLSAgICAgICAgICAgIC8vIGlmIG91ciBwcmV2aW91cyBzbGljaW5nIGFscmVhZHkgZ290IHVzIHBhc3QgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3N0YWJsZSwgd2UncmUgZG9uZQotICAgICAgICAgICAgaWYgKGluZGV4U3RhdGUuaXNEb25lKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXRlcmF0b3IgPSBDb2xsZWN0aW9ucy5lbXB0eUl0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBpbmRleCBibG9jayB3ZSdsbCBuZWVkIHRvIHJlYWQgZm9yIHRoZSBzbGljZS4KLSAgICAgICAgICAgIGludCBzdGFydElkeCA9IGluZGV4U3RhdGUuZmluZEJsb2NrSW5kZXgoc2xpY2UuZW5kKCksIGluZGV4U3RhdGUuY3VycmVudEJsb2NrSWR4KCkpOwotICAgICAgICAgICAgaWYgKHN0YXJ0SWR4IDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpdGVyYXRvciA9IENvbGxlY3Rpb25zLmVtcHR5SXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICBpbmRleFN0YXRlLnNldFRvQmxvY2soc3RhcnRJZHgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbGFzdEJsb2NrSWR4ID0gaW5kZXhTdGF0ZS5maW5kQmxvY2tJbmRleChzbGljZS5zdGFydCgpLCBzdGFydElkeCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBsYXN0IGJsb2NrIHRvIGxvb2sgKGluIHJldmVyc2Ugb3JkZXIpIGlzIGFmdGVyIHRoZSB2ZXJ5IGxhc3QgYmxvY2ssIHdlIGhhdmUgbm90aGluZyBmb3IgdGhhdCBzbGljZQotICAgICAgICAgICAgaWYgKGxhc3RCbG9ja0lkeCA+PSBpbmRleFN0YXRlLmJsb2Nrc0NvdW50KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IHN0YXJ0SWR4ID49IGluZGV4U3RhdGUuYmxvY2tzQ291bnQoKTsKLSAgICAgICAgICAgICAgICBpdGVyYXRvciA9IENvbGxlY3Rpb25zLmVtcHR5SXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIHdlIHN0YXJ0IChpbiByZXZlcnNlIG9yZGVyKSBhZnRlciB0aGUgdmVyeSBsYXN0IGJsb2NrLCBqdXN0IHJlYWQgZnJvbSB0aGUgbGFzdCBvbmUuCi0gICAgICAgICAgICBpZiAoc3RhcnRJZHggPj0gaW5kZXhTdGF0ZS5ibG9ja3NDb3VudCgpKQotICAgICAgICAgICAgICAgIHN0YXJ0SWR4ID0gaW5kZXhTdGF0ZS5ibG9ja3NDb3VudCgpIC0gMTsKLQotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGV2ZW4gaWYgd2Ugd2VyZSBhbHJlYWR5IHNldCBvbiB0aGUgcHJvcGVyIGJsb2NrICh3aGljaCB3b3VsZCBoYXBwZW4gaWYgdGhlIHByZXZpb3VzIHNsaWNlCi0gICAgICAgICAgICAvLyByZXF1ZXN0ZWQgZW5kZWQgb24gdGhlIHNhbWUgYmxvY2sgdGhpcyBvbmUgc3RhcnQpLCB3ZSBjYW4ndCByZXVzZSBpdCBiZWNhdXNlIHdoZW4gcmVhZGluZyB0aGUgcHJldmlvdXMKLSAgICAgICAgICAgIC8vIHNsaWNlIHdlJ3ZlIG9ubHkgcmVhZCB0aGF0IGJsb2NrIGZyb20gdGhlIHByZXZpb3VzIHNsaWNlIHN0YXJ0LiBSZS1yZWFkaW5nIGFsc28gaGFuZGxlcwotICAgICAgICAgICAgLy8gc2tpcEZpcnN0SXRlcmF0ZWRJdGVtL3NraXBMYXN0SXRlcmF0ZWRJdGVtIHRoYXQgd2Ugd291bGQgbmVlZCB0byBoYW5kbGUgb3RoZXJ3aXNlLgotICAgICAgICAgICAgaW5kZXhTdGF0ZS5zZXRUb0Jsb2NrKHN0YXJ0SWR4KTsKLQotICAgICAgICAgICAgcmVhZEN1cnJlbnRCbG9jayhmYWxzZSwgc3RhcnRJZHggIT0gbGFzdEJsb2NrSWR4KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOZXh0SW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN1cGVyLmhhc05leHRJbnRlcm5hbCgpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIG5vdGhpbmcgbW9yZSBmb3Igb3VyIGN1cnJlbnQgYmxvY2ssIG1vdmUgdGhlIG5leHQgb25lIChzbyB0aGUgb25lIGJlZm9yZSBvbiBkaXNrKS4KLSAgICAgICAgICAgICAgICBpbnQgbmV4dEJsb2NrSWR4ID0gaW5kZXhTdGF0ZS5jdXJyZW50QmxvY2tJZHgoKSAtIDE7Ci0gICAgICAgICAgICAgICAgaWYgKG5leHRCbG9ja0lkeCA8IDAgfHwgbmV4dEJsb2NrSWR4IDwgbGFzdEJsb2NrSWR4KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGUgc2xpY2Ugc3RhcnQgY2FuIGJlIGluCi0gICAgICAgICAgICAgICAgaW5kZXhTdGF0ZS5zZXRUb0Jsb2NrKG5leHRCbG9ja0lkeCk7Ci0gICAgICAgICAgICAgICAgcmVhZEN1cnJlbnRCbG9jayh0cnVlLCBuZXh0QmxvY2tJZHggIT0gbGFzdEJsb2NrSWR4KTsKLQotICAgICAgICAgICAgICAgIC8vIElmIGFuIGluZGV4ZWQgYmxvY2sgb25seSBjb250YWlucyBkYXRhIGZvciBhIGRyb3BwZWQgY29sdW1uLCB0aGUgaXRlcmF0b3Igd2lsbCBiZSBlbXB0eSwgZXZlbgotICAgICAgICAgICAgICAgIC8vIHRob3VnaCB3ZSBtYXkgc3RpbGwgaGF2ZSBkYXRhIHRvIHJlYWQgaW4gc3Vic2VxdWVudCBibG9ja3MKLQotICAgICAgICAgICAgICAgIC8vIGFsc28sIGZvciBwcmUtMy4wIHN0b3JhZ2UgZm9ybWF0cywgaW5kZXggYmxvY2tzIHRoYXQgb25seSBjb250YWluIGEgc2luZ2xlIHJvdyBhbmQgdGhhdCByb3cgY3Jvc3NlcwotICAgICAgICAgICAgICAgIC8vIGluZGV4IGJvdW5kYXJpZXMsIHRoZSBpdGVyYXRvciB3aWxsIGJlIGVtcHR5IGV2ZW4gdGhvdWdoIHdlIGhhdmVuJ3QgcmVhZCBldmVyeXRoaW5nIHdlJ3JlIGludGVuZGluZwotICAgICAgICAgICAgICAgIC8vIHRvIHJlYWQuIEluIHRoYXQgY2FzZSwgd2Ugd2FudCB0byByZWFkIHRoZSBuZXh0IGluZGV4IGJsb2NrLiBUaGlzIHNob3VsZG4ndCBiZSBwb3NzaWJsZSBpbiAzLjArCi0gICAgICAgICAgICAgICAgLy8gZm9ybWF0cyAoc2VlIG5leHQgY29tbWVudCkKLSAgICAgICAgICAgICAgICBpZiAoIWl0ZXJhdG9yLmhhc05leHQoKSAmJiBuZXh0QmxvY2tJZHggPiBsYXN0QmxvY2tJZHgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlYWRzIHRoZSBjdXJyZW50IGJsb2NrLCB0aGUgbGFzdCBvbmUgd2UndmUgc2V0LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaGFzUHJldmlvdXNCbG9jayBpcyB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeSByZWFkIGEgcHJldmlvdXMgYmxvY2sgZm9yIHRoZSBjdXJyZW50IHNsaWNlLgotICAgICAgICAgKiBAcGFyYW0gaGFzTmV4dEJsb2NrIGlzIHdoZXRoZXIgd2UgaGF2ZSBtb3JlIGJsb2NrcyB0byByZWFkIGZvciB0aGUgY3VycmVudCBzbGljZS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgdm9pZCByZWFkQ3VycmVudEJsb2NrKGJvb2xlYW4gaGFzUHJldmlvdXNCbG9jaywgYm9vbGVhbiBoYXNOZXh0QmxvY2spIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgYnVmZmVyID0gY3JlYXRlQnVmZmVyKGluZGV4U3RhdGUuYmxvY2tzQ291bnQoKSk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBzbGljZSBzdGFydCAocmVzcC4gc2xpY2UgZW5kKSBpcyBvbmx5IG1lYW5pbmdmdWwgb24gdGhlIGxhc3QgKHJlc3AuIGZpcnN0KSBibG9jayByZWFkIChzaW5jZSBhZ2FpbiwKLSAgICAgICAgICAgIC8vIHdlIHJlYWQgYmxvY2tzIGluIHJldmVyc2Ugb3JkZXIpLgotICAgICAgICAgICAgYm9vbGVhbiBjYW5JbmNsdWRlU2xpY2VTdGFydCA9ICFoYXNOZXh0QmxvY2s7Ci0gICAgICAgICAgICBib29sZWFuIGNhbkluY2x1ZGVTbGljZUVuZCA9ICFoYXNQcmV2aW91c0Jsb2NrOwotCi0gICAgICAgICAgICBsb2FkRnJvbURpc2soY2FuSW5jbHVkZVNsaWNlU3RhcnQgPyBzbGljZS5zdGFydCgpIDogbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjYW5JbmNsdWRlU2xpY2VFbmQgPyBzbGljZS5lbmQoKSA6IG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaGFzUHJldmlvdXNCbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICBoYXNOZXh0QmxvY2spOwotICAgICAgICAgICAgc2V0SXRlcmF0b3Ioc2xpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIHN0b3BSZWFkaW5nRGlzaygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXhTdGF0ZS5pc1Bhc3RDdXJyZW50QmxvY2soKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUmV1c2FibGVQYXJ0aXRpb25EYXRhCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGE7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zOwotCi0gICAgICAgIHByaXZhdGUgTXV0YWJsZURlbGV0aW9uSW5mby5CdWlsZGVyIGRlbGV0aW9uQnVpbGRlcjsKLSAgICAgICAgcHJpdmF0ZSBNdXRhYmxlRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbzsKLSAgICAgICAgcHJpdmF0ZSBCVHJlZS5CdWlsZGVyPFJvdz4gcm93QnVpbGRlcjsKLSAgICAgICAgcHJpdmF0ZSBJbW11dGFibGVCVHJlZVBhcnRpdGlvbiBidWlsdDsKLQotICAgICAgICBwcml2YXRlIFJldXNhYmxlUGFydGl0aW9uRGF0YShUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdGlhbFJvd0NhcGFjaXR5KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgICAgICB0aGlzLnBhcnRpdGlvbktleSA9IHBhcnRpdGlvbktleTsKLSAgICAgICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7Ci0gICAgICAgICAgICB0aGlzLnJvd0J1aWxkZXIgPSBCVHJlZS5idWlsZGVyKG1ldGFkYXRhLmNvbXBhcmF0b3IsIGluaXRpYWxSb3dDYXBhY2l0eSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChVbmZpbHRlcmVkIHVuZmlsdGVyZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh1bmZpbHRlcmVkLmlzUm93KCkpCi0gICAgICAgICAgICAgICAgcm93QnVpbGRlci5hZGQoKFJvdyl1bmZpbHRlcmVkKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkZWxldGlvbkJ1aWxkZXIuYWRkKChSYW5nZVRvbWJzdG9uZU1hcmtlcil1bmZpbHRlcmVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgYnVpbHQgPSBudWxsOwotICAgICAgICAgICAgcm93QnVpbGRlci5yZXVzZSgpOwotICAgICAgICAgICAgZGVsZXRpb25CdWlsZGVyID0gTXV0YWJsZURlbGV0aW9uSW5mby5idWlsZGVyKHBhcnRpdGlvbkxldmVsRGVsZXRpb24sIG1ldGFkYXRhKCkuY29tcGFyYXRvciwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYnVpbGQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxldGlvbkluZm8gPSBkZWxldGlvbkJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAgIGJ1aWx0ID0gbmV3IEltbXV0YWJsZUJUcmVlUGFydGl0aW9uKG1ldGFkYXRhLCBwYXJ0aXRpb25LZXksIGNvbHVtbnMsIFJvd3MuRU1QVFlfU1RBVElDX1JPVywgcm93QnVpbGRlci5idWlsZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpb25JbmZvLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKLSAgICAgICAgICAgIGRlbGV0aW9uQnVpbGRlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTa2lwTGFzdEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvcjxVbmZpbHRlcmVkPgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxVbmZpbHRlcmVkPiBpdGVyYXRvcjsKLQotICAgICAgICBwcml2YXRlIFNraXBMYXN0SXRlcmF0b3IoSXRlcmF0b3I8VW5maWx0ZXJlZD4gaXRlcmF0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIGNvbXB1dGVOZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOwotCi0gICAgICAgICAgICBVbmZpbHRlcmVkIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gbmV4dCA6IGVuZE9mRGF0YSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0Fic3RyYWN0Q29tbWl0TG9nU2VnbWVudE1hbmFnZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9BYnN0cmFjdENvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyLmphdmEKaW5kZXggZDhlYjBlNy4uZTZjYzJmYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0Fic3RyYWN0Q29tbWl0TG9nU2VnbWVudE1hbmFnZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQWJzdHJhY3RDb21taXRMb2dTZWdtZW50TWFuYWdlci5qYXZhCkBAIC0xOTUsNyArMTk1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICBpZiAoaW50ZXJydXB0ZWQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZGlzY2FyZEF2YWlsYWJsZVNlZ21lbnQoKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2cuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2cuamF2YQppbmRleCA2MTk1YjFiLi5jYTUwNzdlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZy5qYXZhCkBAIC0zMTQsNyArMzE0LDcgQEAKICAgICAgICAgICAgICAgICBidWZmZXIucHV0SW50KChpbnQpIGNoZWNrc3VtLmdldFZhbHVlKCkpOwogCiAgICAgICAgICAgICAgICAgLy8gY2hlY2tzdW1tZWQgbXV0YXRpb24KLSAgICAgICAgICAgICAgICBkb3Mud3JpdGUoZG9iLmdldERhdGEoKSwgMCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgZG9zLndyaXRlKGRvYi51bnNhZmVHZXRCdWZmZXJBbmRGbGlwKCkpOwogICAgICAgICAgICAgICAgIHVwZGF0ZUNoZWNrc3VtKGNoZWNrc3VtLCBidWZmZXIsIGJ1ZmZlci5wb3NpdGlvbigpIC0gc2l6ZSwgc2l6ZSk7CiAgICAgICAgICAgICAgICAgYnVmZmVyLnB1dEludCgoaW50KSBjaGVja3N1bS5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgIH0KQEAgLTQ1MywxMSArNDUzLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRDRENCbG9ja1dyaXRlcyhib29sZWFuIHZhbCkKICAgICB7Ci0gICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZShEYXRhYmFzZURlc2NyaXB0b3IuaXNDRENFbmFibGVkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNldCBibG9ja193cml0ZXMgKCVzKTogQ0RDIGlzIG5vdCBlbmFibGVkLiIsIHZhbCk7Ci0gICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZShzZWdtZW50TWFuYWdlciBpbnN0YW5jZW9mIENvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyQ0RDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEQyBpcyBlbmFibGVkIGJ1dCB3ZSBoYXZlIHRoZSB3cm9uZyBDb21taXRMb2dTZWdtZW50TWFuYWdlciB0eXBlOiAlcy4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHJlcG9ydCB0aGlzIGFzIGJ1Zy4iLCBzZWdtZW50TWFuYWdlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIGVuc3VyZUNEQ0VuYWJsZWQoIlVuYWJsZSB0byBzZXQgYmxvY2tfd3JpdGVzLiIpOwogICAgICAgICBib29sZWFuIG9sZFZhbCA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRDRENCbG9ja1dyaXRlcygpOwogICAgICAgICBDb21taXRMb2dTZWdtZW50IGN1cnJlbnRTZWdtZW50ID0gc2VnbWVudE1hbmFnZXIuYWxsb2NhdGluZ0Zyb20oKTsKICAgICAgICAgLy8gVXBkYXRlIHRoZSBjdXJyZW50IHNlZ21lbnQgQ0RDIHN0YXRlIHRvIFBFUk1JVFRFRCBpZiBibG9ja193cml0ZXMgaXMgZGlzYWJsZWQgbm93LCBhbmQgaXQgd2FzIGluIEZPUkJJRERFTiBzdGF0ZQpAQCAtNDY3LDYgKzQ2MywyOSBAQAogICAgICAgICBsb2dnZXIuaW5mbygiVXBkYXRlZCBDREMgYmxvY2tfd3JpdGVzIGZyb20ge30gdG8ge30iLCBvbGRWYWwsIHZhbCk7CiAgICAgfQogCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NEQ09uUmVwYWlyRW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmlzQ0RDT25SZXBhaXJFbmFibGVkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q0RDT25SZXBhaXJFbmFibGVkKGJvb2xlYW4gdmFsdWUpCisgICAgeworICAgICAgICBlbnN1cmVDRENFbmFibGVkKCJVbmFibGUgdG8gc2V0IGNkY19vbl9yZXBhaXJfZW5hYmxlZC4iKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENEQ09uUmVwYWlyRW5hYmxlZCh2YWx1ZSk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJTZXQgY2RjX29uX3JlcGFpcl9lbmFibGVkIHRvIHt9IiwgdmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVDRENFbmFibGVkKFN0cmluZyBoaW50KQorICAgIHsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlKERhdGFiYXNlRGVzY3JpcHRvci5pc0NEQ0VuYWJsZWQoKSwgIkNEQyBpcyBub3QgZW5hYmxlZC4gJXMiLCBoaW50KTsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlKHNlZ21lbnRNYW5hZ2VyIGluc3RhbmNlb2YgQ29tbWl0TG9nU2VnbWVudE1hbmFnZXJDREMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0RDIGlzIGVuYWJsZWQgYnV0IHdlIGhhdmUgdGhlIHdyb25nIENvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyIHR5cGU6ICVzLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgcmVwb3J0IHRoaXMgYXMgYnVnLiIsIHNlZ21lbnRNYW5hZ2VyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBTaHV0cyBkb3duIHRoZSB0aHJlYWRzIHVzZWQgYnkgdGhlIGNvbW1pdCBsb2csIGJsb2NraW5nIHVudGlsIGNvbXBsZXRpb24uCiAgICAgICogVE9ETyB0aGlzIHNob3VsZCBhY2NlcHQgYSB0aW1lb3V0LCBhbmQgdGhyb3cgVGltZW91dEV4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ0Rlc2NyaXB0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dEZXNjcmlwdG9yLmphdmEKaW5kZXggZWQyYWYxYi4uNGQ5MWY1MSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ0Rlc2NyaXB0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nRGVzY3JpcHRvci5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSW5wdXRTdHJlYW1QbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LkVuY3J5cHRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OVmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzLnVwZGF0ZUNoZWNrc3VtSW50OwogCkBAIC0xMjgsNyArMTI4LDcgQEAKICAgICAgICAgaWYgKGVuY3J5cHRpb25Db250ZXh0ICE9IG51bGwpCiAgICAgICAgICAgICBwYXJhbXMucHV0QWxsKGVuY3J5cHRpb25Db250ZXh0LnRvSGVhZGVyUGFyYW1ldGVycygpKTsKICAgICAgICAgcGFyYW1zLnB1dEFsbChhZGRpdGlvbmFsSGVhZGVycyk7Ci0gICAgICAgIHJldHVybiBKU09OVmFsdWUudG9KU09OU3RyaW5nKHBhcmFtcyk7CisgICAgICAgIHJldHVybiBKc29uVXRpbHMud3JpdGVBc0pzb25TdHJpbmcocGFyYW1zKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIENvbW1pdExvZ0Rlc2NyaXB0b3IgZnJvbUhlYWRlcihGaWxlIGZpbGUsIEVuY3J5cHRpb25Db250ZXh0IGVuY3J5cHRpb25Db250ZXh0KQpAQCAtMTY5LDcgKzE2OSw3IEBACiAKICAgICAgICAgaWYgKGNyYyA9PSAoaW50KSBjaGVja2NyYy5nZXRWYWx1ZSgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBNYXA8PywgPz4gbWFwID0gKE1hcDw/LCA/PikgSlNPTlZhbHVlLnBhcnNlKG5ldyBTdHJpbmcocGFyYW1ldGVyc0J5dGVzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisgICAgICAgICAgICBNYXA8PywgPz4gbWFwID0gKE1hcDw/LCA/PikgSnNvblV0aWxzLmRlY29kZUpzb24ocGFyYW1ldGVyc0J5dGVzKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tbWl0TG9nRGVzY3JpcHRvcih2ZXJzaW9uLCBpZCwgcGFyc2VDb21wcmVzc2lvbihtYXApLCBFbmNyeXB0aW9uQ29udGV4dC5jcmVhdGVGcm9tTWFwKG1hcCwgZW5jcnlwdGlvbkNvbnRleHQpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dNQmVhbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ01CZWFuLmphdmEKaW5kZXggN2U4ZGVjYS4uMTg5OTE2YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ01CZWFuLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ01CZWFuLmphdmEKQEAgLTg4LDQgKzg4LDEwIEBACiAgICAgcHVibGljIGJvb2xlYW4gZ2V0Q0RDQmxvY2tXcml0ZXMoKTsKIAogICAgIHB1YmxpYyB2b2lkIHNldENEQ0Jsb2NrV3JpdGVzKGJvb2xlYW4gdmFsKTsKKworICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgaW50ZXJub2RlcyBzdHJlYW1pbmcgb2YgQ0RDIGRhdGEgc2hvdWxkIGdvIHRocm91Z2ggd3JpdGUgcGF0aCAqLworICAgIGJvb2xlYW4gaXNDRENPblJlcGFpckVuYWJsZWQoKTsKKworICAgIC8qKiBTZXQgd2hldGhlciBlbmFibGUgd3JpdGUgcGF0aCBmb3IgQ0RDIGRhdGEgZHVyaW5nIGludGVybm9kZXMgc3RyZWFtaW5nLCBlLmcuIHJlcGFpciAqLworICAgIHZvaWQgc2V0Q0RDT25SZXBhaXJFbmFibGVkKGJvb2xlYW4gdmFsdWUpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ1JlcGxheWVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nUmVwbGF5ZXIuamF2YQppbmRleCA3NGFhNjdkLi5hNTAyNzNjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nUmVwbGF5ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nUmVwbGF5ZXIuamF2YQpAQCAtMzgsNyArMzgsNiBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TdGFnZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CkBAIC01NSwxNSArNTQsMjAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5XcmFwcGVkUnVubmFibGU7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09NTUlUTE9HX0lHTk9SRV9SRVBMQVlfRVJST1JTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNPTU1JVExPR19NQVhfT1VUU1RBTkRJTkdfUkVQTEFZX0JZVEVTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNPTU1JVExPR19NQVhfT1VUU1RBTkRJTkdfUkVQTEFZX0NPVU5UOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNPTU1JVF9MT0dfUkVQTEFZX0xJU1Q7CisKIHB1YmxpYyBjbGFzcyBDb21taXRMb2dSZXBsYXllciBpbXBsZW1lbnRzIENvbW1pdExvZ1JlYWRIYW5kbGVyCiB7CiAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIHN0YXRpYyBsb25nIE1BWF9PVVRTVEFORElOR19SRVBMQVlfQllURVMgPSBMb25nLmdldExvbmcoImNhc3NhbmRyYS5jb21taXRsb2dfbWF4X291dHN0YW5kaW5nX3JlcGxheV9ieXRlcyIsIDEwMjQgKiAxMDI0ICogNjQpOworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBNQVhfT1VUU1RBTkRJTkdfUkVQTEFZX0JZVEVTID0gQ09NTUlUTE9HX01BWF9PVVRTVEFORElOR19SRVBMQVlfQllURVMuZ2V0TG9uZygpOwogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIHB1YmxpYyBzdGF0aWMgTXV0YXRpb25Jbml0aWF0b3IgbXV0YXRpb25Jbml0aWF0b3IgPSBuZXcgTXV0YXRpb25Jbml0aWF0b3IoKTsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRV9SRVBMQVlfRVJST1JTX1BST1BFUlRZID0gQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJjb21taXRsb2cuaWdub3JlcmVwbGF5ZXJyb3JzIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29tbWl0TG9nUmVwbGF5ZXIuY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfT1VUU1RBTkRJTkdfUkVQTEFZX0NPVU5UID0gSW50ZWdlci5nZXRJbnRlZ2VyKENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiY29tbWl0bG9nX21heF9vdXRzdGFuZGluZ19yZXBsYXlfY291bnQiLCAxMDI0KTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX09VVFNUQU5ESU5HX1JFUExBWV9DT1VOVCA9IENPTU1JVExPR19NQVhfT1VUU1RBTkRJTkdfUkVQTEFZX0NPVU5ULmdldEludCgpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8S2V5c3BhY2U+IGtleXNwYWNlc1JlcGxheWVkOwogICAgIHByaXZhdGUgZmluYWwgUXVldWU8RnV0dXJlPEludGVnZXI+PiBmdXR1cmVzOwpAQCAtMzczLDI4ICszNzcsNjAgQEAKIAogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpbmNsdWRlcyhUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhKTsKIAorICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBmaWx0ZXIgZm9yIGVudGl0aWVzIHRvIHJlcGxheSBtdXRhdGlvbnMgZm9yIHVwb24gY29tbWl0IGxvZyByZXBsYXkuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyNDT01NSVRfTE9HX1JFUExBWV9MSVNUCisgICAgICAgICAqICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgUmVwbGF5RmlsdGVyIGNyZWF0ZSgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIG5vIHJlcGxheWxpc3QgaXMgc3VwcGxpZWQgYW4gZW1wdHkgYXJyYXkgb2Ygc3RyaW5ncyBpcyB1c2VkIHRvIHJlcGxheSBldmVyeXRoaW5nLgotICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnJlcGxheUxpc3QiKSA9PSBudWxsKQorICAgICAgICAgICAgU3RyaW5nIHJlcGxheUxpc3QgPSBDT01NSVRfTE9HX1JFUExBWV9MSVNULmdldFN0cmluZygpOworCisgICAgICAgICAgICBpZiAocmVwbGF5TGlzdCA9PSBudWxsKQogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWx3YXlzUmVwbGF5RmlsdGVyKCk7CiAKICAgICAgICAgICAgIE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiB0b1JlcGxheSA9IEhhc2hNdWx0aW1hcC5jcmVhdGUoKTsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIHJhd1BhaXIgOiBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5yZXBsYXlMaXN0Iikuc3BsaXQoIiwiKSkKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHJhd1BhaXIgOiByZXBsYXlMaXN0LnNwbGl0KCIsIikpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gcGFpciA9IFN0cmluZ1V0aWxzLnNwbGl0KHJhd1BhaXIudHJpbSgpLCAnLicpOwotICAgICAgICAgICAgICAgIGlmIChwYWlyLmxlbmd0aCAhPSAyKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFYWNoIHRhYmxlIHRvIGJlIHJlcGxheWVkIG11c3QgYmUgZnVsbHkgcXVhbGlmaWVkIHdpdGgga2V5c3BhY2UgbmFtZSwgZS5nLiwgJ3N5c3RlbS5wZWVycyciKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHJpbW1lZFJhd1BhaXIgPSByYXdQYWlyLnRyaW0oKTsKKyAgICAgICAgICAgICAgICBpZiAodHJpbW1lZFJhd1BhaXIuaXNFbXB0eSgpIHx8IHRyaW1tZWRSYXdQYWlyLmVuZHNXaXRoKCIuIikpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZm9ybWF0KCJJbnZhbGlkIHBhaXI6ICclcyciLCB0cmltbWVkUmF3UGFpcikpOwogCi0gICAgICAgICAgICAgICAgS2V5c3BhY2Uga3MgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0S2V5c3BhY2VJbnN0YW5jZShwYWlyWzBdKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYWlyID0gU3RyaW5nVXRpbHMuc3BsaXQodHJpbW1lZFJhd1BhaXIsICcuJyk7CisKKyAgICAgICAgICAgICAgICBpZiAocGFpci5sZW5ndGggPiAyKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZvcm1hdCgiJXMgcHJvcGVydHkgY29udGFpbnMgYW4gaXRlbSB3aGljaCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBpbiBmb3JtYXQgJ2tleXNwYWNlJyBvciAna2V5c3BhY2UudGFibGUnICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGl0IGlzICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01NSVRfTE9HX1JFUExBWV9MSVNULmdldEtleSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuam9pbigiLiIsIHBhaXIpKSk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5c3BhY2VOYW1lID0gcGFpclswXTsKKworICAgICAgICAgICAgICAgIEtleXNwYWNlIGtzID0gU2NoZW1hLmluc3RhbmNlLmdldEtleXNwYWNlSW5zdGFuY2Uoa2V5c3BhY2VOYW1lKTsKICAgICAgICAgICAgICAgICBpZiAoa3MgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBrZXlzcGFjZSAiICsgcGFpclswXSk7Ci0gICAgICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga3MuZ2V0Q29sdW1uRmFtaWx5U3RvcmUocGFpclsxXSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNmcyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlVua25vd24gdGFibGUgJXMuJXMiLCBwYWlyWzBdLCBwYWlyWzFdKSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24ga2V5c3BhY2UgIiArIGtleXNwYWNlTmFtZSk7CiAKLSAgICAgICAgICAgICAgICB0b1JlcGxheS5wdXQocGFpclswXSwgcGFpclsxXSk7CisgICAgICAgICAgICAgICAgaWYgKHBhaXIubGVuZ3RoID09IDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmcyA6IGtzLmdldENvbHVtbkZhbWlseVN0b3JlcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXBsYXkucHV0KGtleXNwYWNlTmFtZSwgY2ZzLm5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrcy5nZXRDb2x1bW5GYW1pbHlTdG9yZShwYWlyWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNmcyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihmb3JtYXQoIlVua25vd24gdGFibGUgJXMuJXMiLCBrZXlzcGFjZU5hbWUsIHBhaXJbMV0pKTsKKworICAgICAgICAgICAgICAgICAgICB0b1JlcGxheS5wdXQoa2V5c3BhY2VOYW1lLCBwYWlyWzFdKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0b1JlcGxheS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkFsbCB0YWJsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiBjb21taXQgbG9nIHJlcGxheS4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiVGFibGVzIHRvIGJlIHJlcGxheWVkOiB7fSIsIHRvUmVwbGF5LmFzTWFwKCkudG9TdHJpbmcoKSk7CisKICAgICAgICAgICAgIHJldHVybiBuZXcgQ3VzdG9tUmVwbGF5RmlsdGVyKHRvUmVwbGF5KTsKICAgICAgICAgfQogICAgIH0KQEAgLTQ5MCwxMyArNTI2LDEzIEBACiAgICAgewogICAgICAgICBpZiAoZXhjZXB0aW9uLnBlcm1pc3NpYmxlKQogICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJJZ25vcmluZyBjb21taXQgbG9nIHJlcGxheSBlcnJvciBsaWtlbHkgZHVlIHRvIGluY29tcGxldGUgZmx1c2ggdG8gZGlzayIsIGV4Y2VwdGlvbik7Ci0gICAgICAgIGVsc2UgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbihJR05PUkVfUkVQTEFZX0VSUk9SU19QUk9QRVJUWSkpCisgICAgICAgIGVsc2UgaWYgKENPTU1JVExPR19JR05PUkVfUkVQTEFZX0VSUk9SUy5nZXRCb29sZWFuKCkpCiAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIklnbm9yaW5nIGNvbW1pdCBsb2cgcmVwbGF5IGVycm9yIiwgZXhjZXB0aW9uKTsKICAgICAgICAgZWxzZSBpZiAoIUNvbW1pdExvZy5oYW5kbGVDb21taXRFcnJvcigiRmFpbGVkIGNvbW1pdCBsb2cgcmVwbGF5IiwgZXhjZXB0aW9uKSkKICAgICAgICAgewogICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJSZXBsYXkgc3RvcHBlZC4gSWYgeW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcyBlcnJvciBhbmQgY29udGludWUgc3RhcnRpbmcgdGhlIG5vZGUgaWdub3JpbmcgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1pdCBsb2cgcmVwbGF5IHByb2JsZW1zLCBzcGVjaWZ5IC1EIiArIElHTk9SRV9SRVBMQVlfRVJST1JTX1BST1BFUlRZICsgIj10cnVlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICJvbiB0aGUgY29tbWFuZCBsaW5lIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1pdCBsb2cgcmVwbGF5IHByb2JsZW1zLCBzcGVjaWZ5IC1Ee309dHJ1ZSBvbiB0aGUgY29tbWFuZCBsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDT01NSVRMT0dfSUdOT1JFX1JFUExBWV9FUlJPUlMuZ2V0S2V5KCkpOwogICAgICAgICAgICAgdGhyb3cgbmV3IENvbW1pdExvZ1JlcGxheUV4Y2VwdGlvbihleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dTZWdtZW50UmVhZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nU2VnbWVudFJlYWRlci5qYXZhCmluZGV4IDMzZTcwYzEuLjk2NGZlNDkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dTZWdtZW50UmVhZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ1NlZ21lbnRSZWFkZXIuamF2YQpAQCAtMjksNyArMjksNiBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5FbmNyeXB0ZWRGaWxlU2VnbWVudElucHV0U3RyZWFtLkNodW5rUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1JlYWRIYW5kbGVyLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNSZWFkRXJyb3I7CkBAIC00Miw2ICs0MSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuRW5jcnlwdGlvbkNvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT01NSVRMT0dfQUxMT1dfSUdOT1JFX1NZTkNfQ1JDOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nU2VnbWVudC5TWU5DX01BUktFUl9TSVpFOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy51cGRhdGVDaGVja3N1bUludDsKIApAQCAtNTAsOCArNTAsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgQ29tbWl0TG9nU2VnbWVudFJlYWRlciBpbXBsZW1lbnRzIEl0ZXJhYmxlPENvbW1pdExvZ1NlZ21lbnRSZWFkZXIuU3luY1NlZ21lbnQ+CiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT1dfSUdOT1JFX1NZTkNfQ1JDID0gQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJjb21taXRsb2cuYWxsb3dfaWdub3JlX3N5bmNfY3JjIjsKLSAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGFsbG93U2tpcFN5bmNNYXJrZXJDcmMgPSBCb29sZWFuLmdldEJvb2xlYW4oQUxMT1dfSUdOT1JFX1NZTkNfQ1JDKTsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGFsbG93U2tpcFN5bmNNYXJrZXJDcmMgPSBDT01NSVRMT0dfQUxMT1dfSUdOT1JFX1NZTkNfQ1JDLmdldEJvb2xlYW4oKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb21taXRMb2dTZWdtZW50UmVhZGVyLmNsYXNzKTsKICAgICAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3kuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3kuamF2YQppbmRleCA1ZmUxZGY3Li4yZWIxMTlkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0Fic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9BYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneS5qYXZhCkBAIC0xNywzNCArMTcsMzkgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LkluZGV4OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVOZXdUcmFja2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVNdWx0aVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNpbXBsZVNTVGFibGVNdWx0aVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVOZXdUcmFja2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlTXVsdGlXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TaW1wbGVTU1RhYmxlTXVsdGlXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcGFjdGlvblBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudC5EQVRBOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CiAKIC8qKgpAQCAtMjA3LDYgKzIxMiwxNCBAQAogICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoKTsKIAogICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGVzdGltYXRlZCBudW1iZXIgb2YgYmFja2dyb3VuZCB0YXNrcyBuZWVkZWQsIGFzc3VtaW5nIGFuIGFkZGl0aW9uYWwgbnVtYmVyIG9mIFNTVGFibGVzCisgICAgICovCisgICAgaW50IGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKGludCBhZGRpdGlvbmFsU1NUYWJsZXMsIGxvbmcgYWRkaXRpb25hbEJ5dGVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKCkgKyAoaW50KU1hdGguY2VpbCgoZG91YmxlKWFkZGl0aW9uYWxTU1RhYmxlcyAvIGNmcy5nZXRNYXhpbXVtQ29tcGFjdGlvblRocmVzaG9sZCgpKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBAcmV0dXJuIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGxhcmdlc3Qgc3N0YWJsZXMgZm9yIHRoaXMgc3RyYXRlZ3kKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRNYXhTU1RhYmxlQnl0ZXMoKTsKQEAgLTM4NiwxMiArMzk5LDEyIEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gd29ydGhEcm9wcGluZ1RvbWJzdG9uZXMoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBpbnQgZ2NCZWZvcmUpCiAgICAgewotICAgICAgICBpZiAoZGlzYWJsZVRvbWJzdG9uZUNvbXBhY3Rpb25zIHx8IENvbXBhY3Rpb25Db250cm9sbGVyLk5FVkVSX1BVUkdFX1RPTUJTVE9ORVMgfHwgY2ZzLmdldE5ldmVyUHVyZ2VUb21ic3RvbmVzKCkpCisgICAgICAgIGlmIChkaXNhYmxlVG9tYnN0b25lQ29tcGFjdGlvbnMgfHwgQ29tcGFjdGlvbkNvbnRyb2xsZXIuTkVWRVJfUFVSR0VfVE9NQlNUT05FU19QUk9QRVJUWV9WQUxVRSB8fCBjZnMuZ2V0TmV2ZXJQdXJnZVRvbWJzdG9uZXMoKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgLy8gc2luY2Ugd2UgdXNlIGVzdGltYXRpb25zIHRvIGNhbGN1bGF0ZSwgdGhlcmUgaXMgYSBjaGFuY2UgdGhhdCBjb21wYWN0aW9uIHdpbGwgbm90IGRyb3AgdG9tYnN0b25lcyBhY3R1YWxseS4KICAgICAgICAgLy8gaWYgdGhhdCBoYXBwZW5zIHdlIHdpbGwgZW5kIHVwIGluIGluZmluaXRlIGNvbXBhY3Rpb24gbG9vcCwgc28gZmlyc3Qgd2UgY2hlY2sgZW5vdWdoIGlmIGVub3VnaCB0aW1lIGhhcwogICAgICAgICAvLyBlbGFwc2VkIHNpbmNlIFNTVGFibGUgY3JlYXRlZC4KLSAgICAgICAgaWYgKGN1cnJlbnRUaW1lTWlsbGlzKCkgPCBzc3RhYmxlLmdldENyZWF0aW9uVGltZUZvcihEQVRBKSArIHRvbWJzdG9uZUNvbXBhY3Rpb25JbnRlcnZhbCAqIDEwMDApCisgICAgICAgIGlmIChjdXJyZW50VGltZU1pbGxpcygpIDwgc3N0YWJsZS5nZXREYXRhQ3JlYXRpb25UaW1lKCkgKyB0b21ic3RvbmVDb21wYWN0aW9uSW50ZXJ2YWwgKiAxMDAwKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgZG91YmxlIGRyb3BwYWJsZVJhdGlvID0gc3N0YWJsZS5nZXRFc3RpbWF0ZWREcm9wcGFibGVUb21ic3RvbmVSYXRpbyhnY0JlZm9yZSk7CkBAIC00MTUsMTYgKzQyOCwxNiBAQAogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIHdoYXQgcGVyY2VudGFnZSBvZiBjb2x1bW5zIGRvIHdlIGV4cGVjdCB0byBjb21wYWN0IG91dHNpZGUgb2Ygb3ZlcmxhcD8KLSAgICAgICAgICAgIGlmIChzc3RhYmxlLmdldEluZGV4U3VtbWFyeVNpemUoKSA8IDIpCisgICAgICAgICAgICBpZiAoIXNzdGFibGUuaXNFc3RpbWF0aW9uSW5mb3JtYXRpdmUoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvbyBmZXcgc2FtcGxlcyB0byBlc3RpbWF0ZSBjb3JyZWN0IHBlcmNlbnRhZ2UKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBmaXJzdCwgY2FsY3VsYXRlIGVzdGltYXRlZCBrZXlzIHRoYXQgZG8gbm90IG92ZXJsYXAKICAgICAgICAgICAgIGxvbmcga2V5cyA9IHNzdGFibGUuZXN0aW1hdGVkS2V5cygpOwotICAgICAgICAgICAgU2V0PFJhbmdlPFRva2VuPj4gcmFuZ2VzID0gbmV3IEhhc2hTZXQ8UmFuZ2U8VG9rZW4+PihvdmVybGFwcy5zaXplKCkpOworICAgICAgICAgICAgU2V0PFJhbmdlPFRva2VuPj4gcmFuZ2VzID0gbmV3IEhhc2hTZXQ8PihvdmVybGFwcy5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIG92ZXJsYXAgOiBvdmVybGFwcykKLSAgICAgICAgICAgICAgICByYW5nZXMuYWRkKG5ldyBSYW5nZTw+KG92ZXJsYXAuZmlyc3QuZ2V0VG9rZW4oKSwgb3ZlcmxhcC5sYXN0LmdldFRva2VuKCkpKTsKKyAgICAgICAgICAgICAgICByYW5nZXMuYWRkKG5ldyBSYW5nZTw+KG92ZXJsYXAuZ2V0Rmlyc3QoKS5nZXRUb2tlbigpLCBvdmVybGFwLmdldExhc3QoKS5nZXRUb2tlbigpKSk7CiAgICAgICAgICAgICBsb25nIHJlbWFpbmluZ0tleXMgPSBrZXlzIC0gc3N0YWJsZS5lc3RpbWF0ZWRLZXlzRm9yUmFuZ2VzKHJhbmdlcyk7CiAgICAgICAgICAgICAvLyBuZXh0LCBjYWxjdWxhdGUgd2hhdCBwZXJjZW50YWdlIG9mIGNvbHVtbnMgd2UgaGF2ZSB3aXRoaW4gdGhvc2Uga2V5cwogICAgICAgICAgICAgbG9uZyBjb2x1bW5zID0gc3N0YWJsZS5nZXRFc3RpbWF0ZWRDZWxsUGVyUGFydGl0aW9uQ291bnQoKS5tZWFuKCkgKiByZW1haW5pbmdLZXlzOwpAQCAtNTUyLDcgKzU2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJbmRleD4gaW5kZXhlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIpCiAgICAgewotICAgICAgICByZXR1cm4gU2ltcGxlU1NUYWJsZU11bHRpV3JpdGVyLmNyZWF0ZShkZXNjcmlwdG9yLCBrZXlDb3VudCwgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgaXNUcmFuc2llbnQsIGNmcy5tZXRhZGF0YSwgbWV0YSwgaGVhZGVyLCBpbmRleGVzLCBsaWZlY3ljbGVOZXdUcmFja2VyKTsKKyAgICAgICAgcmV0dXJuIFNpbXBsZVNTVGFibGVNdWx0aVdyaXRlci5jcmVhdGUoZGVzY3JpcHRvciwga2V5Q291bnQsIHJlcGFpcmVkQXQsIHBlbmRpbmdSZXBhaXIsIGlzVHJhbnNpZW50LCBjZnMubWV0YWRhdGEsIG1ldGEsIGhlYWRlciwgaW5kZXhlcywgbGlmZWN5Y2xlTmV3VHJhY2tlciwgY2ZzKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0Vhcmx5T3BlbigpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0Fic3RyYWN0U3RyYXRlZ3lIb2xkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQWJzdHJhY3RTdHJhdGVneUhvbGRlci5qYXZhCmluZGV4IGRlNmZmNzEuLjM0MjExMjMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQWJzdHJhY3RTdHJhdGVneUhvbGRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQWJzdHJhY3RTdHJhdGVneUhvbGRlci5qYXZhCkBAIC0yMDYsNCArMjA2LDYgQEAKICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldFN0cmF0ZWd5SW5kZXgoQWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3kgc3RyYXRlZ3kpOwogCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY29udGFpbnNTU1RhYmxlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0FjdGl2ZUNvbXBhY3Rpb25zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0FjdGl2ZUNvbXBhY3Rpb25zLmphdmEKaW5kZXggN2I2YjViZi4uNGUyMzhhZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9BY3RpdmVDb21wYWN0aW9ucy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQWN0aXZlQ29tcGFjdGlvbnMuamF2YQpAQCAtMjEsMTEgKzIxLDE0IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIAogcHVibGljIGNsYXNzIEFjdGl2ZUNvbXBhY3Rpb25zIGltcGxlbWVudHMgQWN0aXZlQ29tcGFjdGlvbnNUcmFja2VyCiB7CkBAIC01MCw2ICs1MywyOCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEdldCB0aGUgZXN0aW1hdGVkIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgdG8gd3JpdGUgcGVyIHNzdGFibGUgZGlyZWN0b3J5CisgICAgICovCisgICAgcHVibGljIE1hcDxGaWxlLCBMb25nPiBlc3RpbWF0ZWRSZW1haW5pbmdXcml0ZUJ5dGVzKCkKKyAgICB7CisgICAgICAgIHN5bmNocm9uaXplZCAoY29tcGFjdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1hcDxGaWxlLCBMb25nPiB3cml0ZUJ5dGVzUGVyU1NUYWJsZURpciA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIGZvciAoQ29tcGFjdGlvbkluZm8uSG9sZGVyIGhvbGRlciA6IGNvbXBhY3Rpb25zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbXBhY3Rpb25JbmZvIGNvbXBhY3Rpb25JbmZvID0gaG9sZGVyLmdldENvbXBhY3Rpb25JbmZvKCk7CisgICAgICAgICAgICAgICAgTGlzdDxGaWxlPiBkaXJlY3RvcmllcyA9IGNvbXBhY3Rpb25JbmZvLmdldFRhcmdldERpcmVjdG9yaWVzKCk7CisgICAgICAgICAgICAgICAgaWYgKGRpcmVjdG9yaWVzID09IG51bGwgfHwgZGlyZWN0b3JpZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBsb25nIHJlbWFpbmluZ1dyaXRlQnl0ZXNQZXJEYXRhRGlyID0gY29tcGFjdGlvbkluZm8uZXN0aW1hdGVkUmVtYWluaW5nV3JpdGVCeXRlcygpIC8gZGlyZWN0b3JpZXMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGZvciAoRmlsZSBkaXJlY3RvcnkgOiBkaXJlY3RvcmllcykKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVCeXRlc1BlclNTVGFibGVEaXIubWVyZ2UoZGlyZWN0b3J5LCByZW1haW5pbmdXcml0ZUJ5dGVzUGVyRGF0YURpciwgTG9uZzo6c3VtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB3cml0ZUJ5dGVzUGVyU1NUYWJsZURpcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgogICAgICAqIEl0ZXJhdGVzIG92ZXIgdGhlIGFjdGl2ZSBjb21wYWN0aW9ucyBhbmQgdHJpZXMgdG8gZmluZCBDb21wYWN0aW9uSW5mb3Mgd2l0aCB0aGUgZ2l2ZW4gY29tcGFjdGlvblR5cGUgZm9yIHRoZSBnaXZlbiBzc3RhYmxlCiAgICAgICoKICAgICAgKiBOdW1iZXIgb2YgZW50cmllcyBpbiBjb21wYWN0aW9ucyBzaG91bGQgYmUgc21hbGwgKDwgMTApIGJ1dCBhdm9pZCBjYWxsaW5nIGluIGFueSB0aW1lLXNlbnNpdGl2ZSBjb250ZXh0CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25Db250cm9sbGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25Db250cm9sbGVyLmphdmEKaW5kZXggNjQ4MDYzMS4uMTExN2E1ZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uQ29udHJvbGxlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkNvbnRyb2xsZXIuamF2YQpAQCAtMTcsNyArMTcsMTQgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uTG9uZ1ByZWRpY2F0ZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlczsKQEAgLTI2LDggKzMzLDEwIEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5BYnN0cmFjdENvbXBhY3Rpb25Db250cm9sbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5NZW10YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwpAQCAtMzcsNiArNDYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk92ZXJsYXBJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ORVZFUl9QVVJHRV9UT01CU1RPTkVTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuU1NUYWJsZUludGVydmFsVHJlZS5idWlsZEludGVydmFsczsKIAogLyoqCkBAIC00NSw4ICs1NSw3IEBACiBwdWJsaWMgY2xhc3MgQ29tcGFjdGlvbkNvbnRyb2xsZXIgZXh0ZW5kcyBBYnN0cmFjdENvbXBhY3Rpb25Db250cm9sbGVyCiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbXBhY3Rpb25Db250cm9sbGVyLmNsYXNzKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVWRVJfUFVSR0VfVE9NQlNUT05FU19QUk9QRVJUWSA9IENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAibmV2ZXJfcHVyZ2VfdG9tYnN0b25lcyI7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gTkVWRVJfUFVSR0VfVE9NQlNUT05FUyA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihORVZFUl9QVVJHRV9UT01CU1RPTkVTX1BST1BFUlRZKTsKKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBORVZFUl9QVVJHRV9UT01CU1RPTkVTX1BST1BFUlRZX1ZBTFVFID0gTkVWRVJfUFVSR0VfVE9NQlNUT05FUy5nZXRCb29sZWFuKCk7CiAKICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY29tcGFjdGluZ1JlcGFpcmVkOwogICAgIC8vIG5vdGUgdGhhdCBvdmVybGFwSXRlcmF0b3IgYW5kIG92ZXJsYXBwaW5nU1NUYWJsZXMgd2lsbCBiZSBudWxsIGlmIE5FVkVSX1BVUkdFX1RPTUJTVE9ORVMgaXMgc2V0IC0gdGhpcyBpcyBhCkBAIC04MCwxNiArODksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb21wYWN0aW5nLnN0cmVhbSgpLm1hcFRvTG9uZyhTU1RhYmxlUmVhZGVyOjpnZXRNaW5UaW1lc3RhbXApLm1pbigpLmdldEFzTG9uZygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKICAgICAgICAgcmVmcmVzaE92ZXJsYXBzKCk7Ci0gICAgICAgIGlmIChORVZFUl9QVVJHRV9UT01CU1RPTkVTKQotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIllvdSBhcmUgcnVubmluZyB3aXRoIC1EY2Fzc2FuZHJhLm5ldmVyX3B1cmdlX3RvbWJzdG9uZXM9dHJ1ZSwgdGhpcyBpcyBkYW5nZXJvdXMhIik7CisgICAgICAgIGlmIChORVZFUl9QVVJHRV9UT01CU1RPTkVTX1BST1BFUlRZX1ZBTFVFKQorICAgICAgICAgICAgbG9nZ2VyLndhcm4oIllvdSBhcmUgcnVubmluZyB3aXRoIC1Ee309dHJ1ZSwgdGhpcyBpcyBkYW5nZXJvdXMhIiwgTkVWRVJfUFVSR0VfVE9NQlNUT05FUy5nZXRLZXkoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgbWF5YmVSZWZyZXNoT3ZlcmxhcHMoKQogICAgIHsKLSAgICAgICAgaWYgKE5FVkVSX1BVUkdFX1RPTUJTVE9ORVMpCisgICAgICAgIGlmIChORVZFUl9QVVJHRV9UT01CU1RPTkVTX1BST1BFUlRZX1ZBTFVFKQogICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoIm5vdCByZWZyZXNoaW5nIG92ZXJsYXBzIC0gcnVubmluZyB3aXRoIC1Ee309dHJ1ZSIsCi0gICAgICAgICAgICAgICAgICAgIE5FVkVSX1BVUkdFX1RPTUJTVE9ORVNfUFJPUEVSVFkpOworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJub3QgcmVmcmVzaGluZyBvdmVybGFwcyAtIHJ1bm5pbmcgd2l0aCAtRHt9PXRydWUiLCBORVZFUl9QVVJHRV9UT01CU1RPTkVTLmdldEtleSgpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0xMDUsMTkgKzExMywxMyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHJlYWRlciA6IG92ZXJsYXBwaW5nU1NUYWJsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZWFkZXIuaXNNYXJrZWRDb21wYWN0ZWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWZyZXNoT3ZlcmxhcHMoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKG92ZXJsYXBwaW5nU1NUYWJsZXMgPT0gbnVsbCB8fCBvdmVybGFwcGluZ1NTVGFibGVzLnN0cmVhbSgpLmFueU1hdGNoKFNTVGFibGVSZWFkZXI6OmlzTWFya2VkQ29tcGFjdGVkKSkKKyAgICAgICAgICAgIHJlZnJlc2hPdmVybGFwcygpOwogICAgIH0KIAogICAgIHZvaWQgcmVmcmVzaE92ZXJsYXBzKCkKICAgICB7Ci0gICAgICAgIGlmIChORVZFUl9QVVJHRV9UT01CU1RPTkVTIHx8IGNmcy5nZXROZXZlclB1cmdlVG9tYnN0b25lcygpKQorICAgICAgICBpZiAoTkVWRVJfUFVSR0VfVE9NQlNUT05FU19QUk9QRVJUWV9WQUxVRSB8fCBjZnMuZ2V0TmV2ZXJQdXJnZVRvbWJzdG9uZXMoKSkKICAgICAgICAgICAgIHJldHVybjsKIAogICAgICAgICBpZiAodGhpcy5vdmVybGFwcGluZ1NTVGFibGVzICE9IG51bGwpCkBAIC0xNjAsOCArMTYyLDggQEAKICAgICB7CiAgICAgICAgIGxvZ2dlci50cmFjZSgiQ2hlY2tpbmcgZHJvcHBhYmxlIHNzdGFibGVzIGluIHt9IiwgY2ZTdG9yZSk7CiAKLSAgICAgICAgaWYgKE5FVkVSX1BVUkdFX1RPTUJTVE9ORVMgfHwgY29tcGFjdGluZyA9PSBudWxsIHx8IGNmU3RvcmUuZ2V0TmV2ZXJQdXJnZVRvbWJzdG9uZXMoKSkKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48U1NUYWJsZVJlYWRlcj5lbXB0eVNldCgpOworICAgICAgICBpZiAoTkVWRVJfUFVSR0VfVE9NQlNUT05FU19QUk9QRVJUWV9WQUxVRSB8fCBjb21wYWN0aW5nID09IG51bGwgfHwgY2ZTdG9yZS5nZXROZXZlclB1cmdlVG9tYnN0b25lcygpIHx8IG92ZXJsYXBwaW5nID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKIAogICAgICAgICBpZiAoY2ZTdG9yZS5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCkub25seVB1cmdlUmVwYWlyZWRUb21ic3RvbmVzKCkgJiYgIUl0ZXJhYmxlcy5hbGwoY29tcGFjdGluZywgU1NUYWJsZVJlYWRlcjo6aXNSZXBhaXJlZCkpCiAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKQEAgLTI0Niw3ICsyNDgsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMb25nUHJlZGljYXRlIGdldFB1cmdlRXZhbHVhdG9yKERlY29yYXRlZEtleSBrZXkpCiAgICAgewotICAgICAgICBpZiAoTkVWRVJfUFVSR0VfVE9NQlNUT05FUyB8fCAhY29tcGFjdGluZ1JlcGFpcmVkKCkgfHwgY2ZzLmdldE5ldmVyUHVyZ2VUb21ic3RvbmVzKCkpCisgICAgICAgIGlmIChORVZFUl9QVVJHRV9UT01CU1RPTkVTX1BST1BFUlRZX1ZBTFVFIHx8ICFjb21wYWN0aW5nUmVwYWlyZWQoKSB8fCBjZnMuZ2V0TmV2ZXJQdXJnZVRvbWJzdG9uZXMoKSB8fCBvdmVybGFwSXRlcmF0b3IgPT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiB0aW1lIC0+IGZhbHNlOwogCiAgICAgICAgIG92ZXJsYXBJdGVyYXRvci51cGRhdGUoa2V5KTsKQEAgLTI1Nyw3ICsyNTksNyBAQAogCiAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlOiBmaWx0ZXJlZFNTVGFibGVzKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3N0YWJsZS5tYXliZVByZXNlbnQoa2V5KSkKKyAgICAgICAgICAgIGlmIChzc3RhYmxlLm1heUNvbnRhaW5Bc3N1bWluZ0tleUlzSW5SYW5nZShrZXkpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1pblRpbWVzdGFtcFNlZW4gPSBNYXRoLm1pbihtaW5UaW1lc3RhbXBTZWVuLCBzc3RhYmxlLmdldE1pblRpbWVzdGFtcCgpKTsKICAgICAgICAgICAgICAgICBoYXNUaW1lc3RhbXAgPSB0cnVlOwpAQCAtMzA3LDcgKzMwOSw3IEBACiAgICAgLy8gY2FsbGVyIG11c3QgY2xvc2UgaXRlcmF0b3JzCiAgICAgcHVibGljIEl0ZXJhYmxlPFVuZmlsdGVyZWRSb3dJdGVyYXRvcj4gc2hhZG93U291cmNlcyhEZWNvcmF0ZWRLZXkga2V5LCBib29sZWFuIHRvbWJzdG9uZU9ubHkpCiAgICAgewotICAgICAgICBpZiAoIXByb3ZpZGVUb21ic3RvbmVTb3VyY2VzKCkgfHwgIWNvbXBhY3RpbmdSZXBhaXJlZCgpIHx8IE5FVkVSX1BVUkdFX1RPTUJTVE9ORVMgfHwgY2ZzLmdldE5ldmVyUHVyZ2VUb21ic3RvbmVzKCkpCisgICAgICAgIGlmICghcHJvdmlkZVRvbWJzdG9uZVNvdXJjZXMoKSB8fCAhY29tcGFjdGluZ1JlcGFpcmVkKCkgfHwgTkVWRVJfUFVSR0VfVE9NQlNUT05FU19QUk9QRVJUWV9WQUxVRSB8fCBjZnMuZ2V0TmV2ZXJQdXJnZVRvbWJzdG9uZXMoKSkKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICBvdmVybGFwSXRlcmF0b3IudXBkYXRlKGtleSk7CiAgICAgICAgIHJldHVybiBJdGVyYWJsZXMuZmlsdGVyKEl0ZXJhYmxlcy50cmFuc2Zvcm0ob3ZlcmxhcEl0ZXJhdG9yLm92ZXJsYXBzKCksCkBAIC0zMjIsOCArMzI0LDggQEAKICAgICAgICAgICAgIHJlYWRlci5nZXRNYXhUaW1lc3RhbXAoKSA8PSBtaW5UaW1lc3RhbXAgfHwKICAgICAgICAgICAgIHRvbWJzdG9uZU9ubHkgJiYgIXJlYWRlci5tYXlIYXZlVG9tYnN0b25lcygpKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIFJvd0luZGV4RW50cnk8Pz4gcG9zaXRpb24gPSByZWFkZXIuZ2V0UG9zaXRpb24oa2V5LCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKLSAgICAgICAgaWYgKHBvc2l0aW9uID09IG51bGwpCisgICAgICAgIGxvbmcgcG9zaXRpb24gPSByZWFkZXIuZ2V0UG9zaXRpb24oa2V5LCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKKyAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICBGaWxlRGF0YUlucHV0IGRmaWxlID0gb3BlbkRhdGFGaWxlcy5jb21wdXRlSWZBYnNlbnQocmVhZGVyLCB0aGlzOjpvcGVuRGF0YUZpbGUpOwogICAgICAgICByZXR1cm4gcmVhZGVyLnNpbXBsZUl0ZXJhdG9yKGRmaWxlLCBrZXksIHBvc2l0aW9uLCB0b21ic3RvbmVPbmx5KTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkhpc3RvcnlUYWJ1bGFyRGF0YS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uSGlzdG9yeVRhYnVsYXJEYXRhLmphdmEKaW5kZXggNDg1ZjFhMC4uMTgyZjM0OCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uSGlzdG9yeVRhYnVsYXJEYXRhLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uSGlzdG9yeVRhYnVsYXJEYXRhLmphdmEKQEAgLTIxLDIwICsyMSwyMCBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5VbnR5cGVkUmVzdWx0U2V0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTG9uZ1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIAogcHVibGljIGNsYXNzIENvbXBhY3Rpb25IaXN0b3J5VGFidWxhckRhdGEKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJVEVNX05BTUVTID0gbmV3IFN0cmluZ1tdeyAiaWQiLCAia2V5c3BhY2VfbmFtZSIsICJjb2x1bW5mYW1pbHlfbmFtZSIsICJjb21wYWN0ZWRfYXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlc19pbiIsICJieXRlc19vdXQiLCAicm93c19tZXJnZWQiIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVzX2luIiwgImJ5dGVzX291dCIsICJyb3dzX21lcmdlZCIsICJjb21wYWN0aW9uX3Byb3BlcnRpZXMiIH07CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJVEVNX0RFU0NTID0gbmV3IFN0cmluZ1tdeyAidGltZSB1dWlkIiwgImtleXNwYWNlIG5hbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2x1bW4gZmFtaWx5IG5hbWUiLCAiY29tcGFjdGlvbiBmaW5pc2hlZCBhdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIGJ5dGVzIGluIiwgInRvdGFsIGJ5dGVzIG91dCIsICJ0b3RhbCByb3dzIG1lcmdlZCIgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG90YWwgYnl0ZXMgaW4iLCAidG90YWwgYnl0ZXMgb3V0IiwgInRvdGFsIHJvd3MgbWVyZ2VkIiwgImNvbXBhY3Rpb24gcHJvcGVydGllcyIgfTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX05BTUUgPSAiQ29tcGFjdGlvbkhpc3RvcnkiOwogCkBAIC00NSwxMyArNDUsMTUgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb3NpdGVUeXBlIENPTVBPU0lURV9UWVBFOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGFidWxhclR5cGUgVEFCVUxBUl9UWVBFOwotCisgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFDVElPTl9UWVBFX1BST1BFUlRZID0gImNvbXBhY3Rpb25fdHlwZSI7CisgICAgCiAgICAgc3RhdGljIAogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIElURU1fVFlQRVMgPSBuZXcgT3BlblR5cGVbXXsgU2ltcGxlVHlwZS5TVFJJTkcsIFNpbXBsZVR5cGUuU1RSSU5HLCBTaW1wbGVUeXBlLlNUUklORywgU2ltcGxlVHlwZS5MT05HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVUeXBlLkxPTkcsIFNpbXBsZVR5cGUuTE9ORywgU2ltcGxlVHlwZS5TVFJJTkcgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlVHlwZS5MT05HLCBTaW1wbGVUeXBlLkxPTkcsIFNpbXBsZVR5cGUuU1RSSU5HLCBTaW1wbGVUeXBlLlNUUklORyB9OwogCiAgICAgICAgICAgICBDT01QT1NJVEVfVFlQRSA9IG5ldyBDb21wb3NpdGVUeXBlKFRZUEVfTkFNRSwgUk9XX0RFU0MsIElURU1fTkFNRVMsIElURU1fREVTQ1MsIElURU1fVFlQRVMpOwogCkBAIC01OSw3ICs2MSw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKE9wZW5EYXRhRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc1LDEwICs3NywxMSBAQAogICAgICAgICAgICAgbG9uZyBieXRlc0luID0gcm93LmdldExvbmcoSVRFTV9OQU1FU1s0XSk7CiAgICAgICAgICAgICBsb25nIGJ5dGVzT3V0ID0gcm93LmdldExvbmcoSVRFTV9OQU1FU1s1XSk7CiAgICAgICAgICAgICBNYXA8SW50ZWdlciwgTG9uZz4gcm93TWVyZ2VkID0gcm93LmdldE1hcChJVEVNX05BTUVTWzZdLCBJbnQzMlR5cGUuaW5zdGFuY2UsIExvbmdUeXBlLmluc3RhbmNlKTsKLQorICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBjb21wYWN0aW9uUHJvcGVydGllcyA9IHJvdy5nZXRNYXAoSVRFTV9OQU1FU1s3XSwgVVRGOFR5cGUuaW5zdGFuY2UsIFVURjhUeXBlLmluc3RhbmNlKTsKICAgICAgICAgICAgIHJlc3VsdC5wdXQobmV3IENvbXBvc2l0ZURhdGFTdXBwb3J0KENPTVBPU0lURV9UWVBFLCBJVEVNX05BTUVTLAogICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IGlkLnRvU3RyaW5nKCksIGtzTmFtZSwgY2ZOYW1lLCBjb21wYWN0ZWRBdCwgYnl0ZXNJbiwgYnl0ZXNPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInsiICsgRkJVdGlsaXRpZXMudG9TdHJpbmcocm93TWVyZ2VkKSArICJ9IiB9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3snICsgRkJVdGlsaXRpZXMudG9TdHJpbmcocm93TWVyZ2VkKSArICd9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneycgKyBGQlV0aWxpdGllcy50b1N0cmluZyhjb21wYWN0aW9uUHJvcGVydGllcykgKyAnfScgfSkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uSW5mby5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uSW5mby5qYXZhCmluZGV4IDUxM2FkZmEuLjBiZmM5MjUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkluZm8uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25JbmZvLmphdmEKQEAgLTE4LDcgKzE4LDkgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbjsKIAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwpAQCAtMjcsNyArMjksOSBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiAKQEAgLTQyLDYgKzQ2LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTklUID0gInVuaXQiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBQ1RJT05fSUQgPSAiY29tcGFjdGlvbklkIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU1RBQkxFUyA9ICJzc3RhYmxlcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0RJUkVDVE9SWSA9ICJ0YXJnZXREaXJlY3RvcnkiOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhOwogICAgIHByaXZhdGUgZmluYWwgT3BlcmF0aW9uVHlwZSB0YXNrdHlwZTsKQEAgLTUwLDEzICs1NSw5IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBVbml0IHVuaXQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBUaW1lVVVJRCBjb21wYWN0aW9uSWQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBJbW11dGFibGVTZXQ8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFyZ2V0RGlyZWN0b3J5OwogCi0gICAgcHVibGljIENvbXBhY3Rpb25JbmZvKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIE9wZXJhdGlvblR5cGUgdGFza3R5cGUsIGxvbmcgYnl0ZXNDb21wbGV0ZSwgbG9uZyB0b3RhbEJ5dGVzLCBUaW1lVVVJRCBjb21wYWN0aW9uSWQsIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMpCi0gICAgewotICAgICAgICB0aGlzKG1ldGFkYXRhLCB0YXNrdHlwZSwgYnl0ZXNDb21wbGV0ZSwgdG90YWxCeXRlcywgVW5pdC5CWVRFUywgY29tcGFjdGlvbklkLCBzc3RhYmxlcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDb21wYWN0aW9uSW5mbyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBPcGVyYXRpb25UeXBlIHRhc2t0eXBlLCBsb25nIGNvbXBsZXRlZCwgbG9uZyB0b3RhbCwgVW5pdCB1bml0LCBUaW1lVVVJRCBjb21wYWN0aW9uSWQsIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMpCisgICAgcHVibGljIENvbXBhY3Rpb25JbmZvKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIE9wZXJhdGlvblR5cGUgdGFza3R5cGUsIGxvbmcgY29tcGxldGVkLCBsb25nIHRvdGFsLCBVbml0IHVuaXQsIFRpbWVVVUlEIGNvbXBhY3Rpb25JZCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgU1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMsIFN0cmluZyB0YXJnZXREaXJlY3RvcnkpCiAgICAgewogICAgICAgICB0aGlzLnRhc2t0eXBlID0gdGFza3R5cGU7CiAgICAgICAgIHRoaXMuY29tcGxldGVkID0gY29tcGxldGVkOwpAQCAtNjUsMjEgKzY2LDQxIEBACiAgICAgICAgIHRoaXMudW5pdCA9IHVuaXQ7CiAgICAgICAgIHRoaXMuY29tcGFjdGlvbklkID0gY29tcGFjdGlvbklkOwogICAgICAgICB0aGlzLnNzdGFibGVzID0gSW1tdXRhYmxlU2V0LmNvcHlPZihzc3RhYmxlcyk7CisgICAgICAgIHRoaXMudGFyZ2V0RGlyZWN0b3J5ID0gdGFyZ2V0RGlyZWN0b3J5OworICAgIH0KKworICAgIHB1YmxpYyBDb21wYWN0aW9uSW5mbyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBPcGVyYXRpb25UeXBlIHRhc2t0eXBlLCBsb25nIGNvbXBsZXRlZCwgbG9uZyB0b3RhbCwgVGltZVVVSUQgY29tcGFjdGlvbklkLCBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IHNzdGFibGVzLCBTdHJpbmcgdGFyZ2V0RGlyZWN0b3J5KQorICAgIHsKKyAgICAgICAgdGhpcyhtZXRhZGF0YSwgdGFza3R5cGUsIGNvbXBsZXRlZCwgdG90YWwsIFVuaXQuQllURVMsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMsIHRhcmdldERpcmVjdG9yeSk7CisgICAgfQorCisgICAgcHVibGljIENvbXBhY3Rpb25JbmZvKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIE9wZXJhdGlvblR5cGUgdGFza3R5cGUsIGxvbmcgY29tcGxldGVkLCBsb25nIHRvdGFsLCBUaW1lVVVJRCBjb21wYWN0aW9uSWQsIENvbGxlY3Rpb248PyBleHRlbmRzIFNTVGFibGVSZWFkZXI+IHNzdGFibGVzKQorICAgIHsKKyAgICAgICAgdGhpcyhtZXRhZGF0YSwgdGFza3R5cGUsIGNvbXBsZXRlZCwgdG90YWwsIFVuaXQuQllURVMsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMsIG51bGwpOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFNwZWNpYWwgY29tcGFjdGlvbiBpbmZvIHdoZXJlIHdlIGFsd2F5cyBuZWVkIHRvIGNhbmNlbCB0aGUgY29tcGFjdGlvbiAtIGZvciBleGFtcGxlIFZpZXdCdWlsZGVyVGFzayBhbmQgQXV0b1NhdmluZ0NhY2hlIHdoZXJlIHdlIGRvbid0IGtub3cKKyAgICAgKiBTcGVjaWFsIGNvbXBhY3Rpb24gaW5mbyB3aGVyZSB3ZSBhbHdheXMgbmVlZCB0byBjYW5jZWwgdGhlIGNvbXBhY3Rpb24gLSBmb3IgZXhhbXBsZSBWaWV3QnVpbGRlclRhc2sgd2hlcmUgd2UgZG9uJ3Qga25vdwogICAgICAqIHRoZSBzc3RhYmxlcyBhdCBjb25zdHJ1Y3Rpb24KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIENvbXBhY3Rpb25JbmZvIHdpdGhvdXRTU1RhYmxlcyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBPcGVyYXRpb25UeXBlIHRhc2t0eXBlLCBsb25nIGNvbXBsZXRlZCwgbG9uZyB0b3RhbCwgVW5pdCB1bml0LCBUaW1lVVVJRCBjb21wYWN0aW9uSWQpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKG1ldGFkYXRhLCB0YXNrdHlwZSwgY29tcGxldGVkLCB0b3RhbCwgdW5pdCwgY29tcGFjdGlvbklkLCBJbW11dGFibGVTZXQub2YoKSk7CisgICAgICAgIHJldHVybiB3aXRob3V0U1NUYWJsZXMobWV0YWRhdGEsIHRhc2t0eXBlLCBjb21wbGV0ZWQsIHRvdGFsLCB1bml0LCBjb21wYWN0aW9uSWQsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpYWwgY29tcGFjdGlvbiBpbmZvIHdoZXJlIHdlIGFsd2F5cyBuZWVkIHRvIGNhbmNlbCB0aGUgY29tcGFjdGlvbiAtIGZvciBleGFtcGxlIEF1dG9TYXZpbmdDYWNoZSB3aGVyZSB3ZSBkb24ndCBrbm93CisgICAgICogdGhlIHNzdGFibGVzIGF0IGNvbnN0cnVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29tcGFjdGlvbkluZm8gd2l0aG91dFNTVGFibGVzKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIE9wZXJhdGlvblR5cGUgdGFza3R5cGUsIGxvbmcgY29tcGxldGVkLCBsb25nIHRvdGFsLCBVbml0IHVuaXQsIFRpbWVVVUlEIGNvbXBhY3Rpb25JZCwgU3RyaW5nIHRhcmdldERpcmVjdG9yeSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8obWV0YWRhdGEsIHRhc2t0eXBlLCBjb21wbGV0ZWQsIHRvdGFsLCB1bml0LCBjb21wYWN0aW9uSWQsIEltbXV0YWJsZVNldC5vZigpLCB0YXJnZXREaXJlY3RvcnkpOwogICAgIH0KIAogICAgIC8qKiBAcmV0dXJuIEEgY29weSBvZiB0aGlzIENvbXBhY3Rpb25JbmZvIHdpdGggdXBkYXRlZCBwcm9ncmVzcy4gKi8KICAgICBwdWJsaWMgQ29tcGFjdGlvbkluZm8gZm9yUHJvZ3Jlc3MobG9uZyBjb21wbGV0ZSwgbG9uZyB0b3RhbCkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8obWV0YWRhdGEsIHRhc2t0eXBlLCBjb21wbGV0ZSwgdG90YWwsIHVuaXQsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMpOworICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKG1ldGFkYXRhLCB0YXNrdHlwZSwgY29tcGxldGUsIHRvdGFsLCB1bml0LCBjb21wYWN0aW9uSWQsIHNzdGFibGVzLCB0YXJnZXREaXJlY3RvcnkpOwogICAgIH0KIAogICAgIHB1YmxpYyBPcHRpb25hbDxTdHJpbmc+IGdldEtleXNwYWNlKCkKQEAgLTEyNyw2ICsxNDgsNTAgQEAKICAgICAgICAgcmV0dXJuIHNzdGFibGVzOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgZGlyZWN0b3JpZXMgdGhpcyBjb21wYWN0aW9uIGNvdWxkIHBvc3NpYmx5IHdyaXRlIHRvLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZGlyZWN0b3JpZXMgdGhhdCB3ZSBtaWdodCB3cml0ZSB0bywgb3IgZW1wdHkgbGlzdCBpZiB3ZSBkb24ndCBrbm93IHRoZSBtZXRhZGF0YQorICAgICAqIChsaWtlIGZvciBpbmRleCBzdW1tYXJ5IHJlZGlzdHJpYnV0aW9uKSwgb3IgbnVsbCBpZiB3ZSBkb24ndCBoYXZlIGFueSBkaXNrIGJvdW5kYXJpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxGaWxlPiBnZXRUYXJnZXREaXJlY3RvcmllcygpCisgICAgeworICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCAmJiAhbWV0YWRhdGEuaXNJbmRleCgpKQorICAgICAgICB7CisgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cyhtZXRhZGF0YS5pZCk7CisgICAgICAgICAgICBpZiAoY2ZzICE9IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNmcy5nZXREaXJlY3Rvcmllc0ZvckZpbGVzKHNzdGFibGVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0YXJnZXREaXJlY3RvcnkoKQorICAgIHsKKyAgICAgICAgaWYgKHRhcmdldERpcmVjdG9yeSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuICIiOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUodGFyZ2V0RGlyZWN0b3J5KS5jYW5vbmljYWxQYXRoKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJlc29sdmUgY2Fub25pY2FsIHBhdGggZm9yICIgKyB0YXJnZXREaXJlY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90ZSB0aGF0IHRoaXMgZXN0aW1hdGUgaXMgYmFzZWQgb24gdGhlIGFtb3VudCBvZiBkYXRhIHdlIGhhdmUgbGVmdCB0byByZWFkIC0gaXQgYXNzdW1lcyBpbnB1dAorICAgICAqIHNpemUgPT0gb3V0cHV0IHNpemUgZm9yIGEgY29tcGFjdGlvbiwgd2hpY2ggaXMgbm90IHJlYWxseSB0cnVlLCBidXQgc2hvdWxkIG1vc3Qgb2Z0ZW4gcHJvdmlkZSBhIHdvcnN0IGNhc2UKKyAgICAgKiByZW1haW5pbmcgd3JpdGUgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBlc3RpbWF0ZWRSZW1haW5pbmdXcml0ZUJ5dGVzKCkKKyAgICB7CisgICAgICAgIGlmICh1bml0ID09IFVuaXQuQllURVMgJiYgdGFza3R5cGUud3JpdGVzRGF0YSkKKyAgICAgICAgICAgIHJldHVybiBnZXRUb3RhbCgpIC0gZ2V0Q29tcGxldGVkKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgIHsKQEAgLTE1NSw2ICsyMjAsNyBAQAogICAgICAgICByZXQucHV0KFVOSVQsIHVuaXQudG9TdHJpbmcoKSk7CiAgICAgICAgIHJldC5wdXQoQ09NUEFDVElPTl9JRCwgY29tcGFjdGlvbklkID09IG51bGwgPyAiIiA6IGNvbXBhY3Rpb25JZC50b1N0cmluZygpKTsKICAgICAgICAgcmV0LnB1dChTU1RBQkxFUywgSm9pbmVyLm9uKCcsJykuam9pbihzc3RhYmxlcykpOworICAgICAgICByZXQucHV0KFRBUkdFVF9ESVJFQ1RPUlksIHRhcmdldERpcmVjdG9yeSgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkl0ZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25JdGVyYXRvci5qYXZhCmluZGV4IGEwZGMwODcuLjVjZGU0MWUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkl0ZXJhdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uSXRlcmF0b3IuamF2YQpAQCAtMTcsMzMgKzE3LDUxIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbjsKIAotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Mb25nUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uTG9uZ1ByZWRpY2F0ZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuT3JkZXJpbmc7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyYW5zZm9ybS5EdXBsaWNhdGVSb3dDaGVja2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQWJzdHJhY3RDb21wYWN0aW9uQ29udHJvbGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRW1wdHlJdGVyYXRvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVndWxhckFuZFN0YXRpY0NvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU3lzdGVtS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlB1cmdlRnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3JzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJhbmdlVG9tYnN0b25lQm91bmRNYXJrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5SYW5nZVRvbWJzdG9uZU1hcmtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvd3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLldyYXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyYW5zZm9ybS5EdXBsaWNhdGVSb3dDaGVja2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyYW5zZm9ybS5UcmFuc2Zvcm1hdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXgudHJhbnNhY3Rpb25zLkNvbXBhY3Rpb25UcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuVG9wUGFydGl0aW9uVHJhY2tlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcGFjdGlvblBhcmFtcy5Ub21ic3RvbmVPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuUGF4b3NSZXBhaXJIaXN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MudW5jb21taXR0ZWQuUGF4b3NSb3dzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwpAQCAtNzgsMTEgKzk2LDEzIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBJbW11dGFibGVTZXQ8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXM7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbm93SW5TZWM7CiAgICAgcHJpdmF0ZSBmaW5hbCBUaW1lVVVJRCBjb21wYWN0aW9uSWQ7Ci0KICAgICBwcml2YXRlIGZpbmFsIGxvbmcgdG90YWxCeXRlczsKICAgICBwcml2YXRlIGxvbmcgYnl0ZXNSZWFkOwogICAgIHByaXZhdGUgbG9uZyB0b3RhbFNvdXJjZUNRTFJvd3M7CiAKKyAgICAvLyBLZWVwIHRhcmdldERpcmVjdG9yeSBmb3IgY29tcGFjdGlvbnMsIG5lZWRlZCBmb3IgYG5vZGV0b29sIGNvbXBhY3Rpb25zdGF0c2AKKyAgICBwcml2YXRlIFN0cmluZyB0YXJnZXREaXJlY3Rvcnk7CisKICAgICAvKgogICAgICAqIGNvdW50ZXJzIGZvciBtZXJnZWQgcm93cy4KICAgICAgKiBhcnJheSBpbmRleCByZXByZXNlbnRzIChudW1iZXIgb2YgbWVyZ2VkIHJvd3MgLSAxKSwgc28gaW5kZXggMCBpcyBjb3VudGVyIGZvciBubyBtZXJnZSAoMSByb3cpLApAQCAtMTUxLDcgKzE3MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNSZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFjdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXREaXJlY3RvcnkpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKQEAgLTE1OSw2ICsxODAsMTEgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldFRhcmdldERpcmVjdG9yeShmaW5hbCBTdHJpbmcgdGFyZ2V0RGlyZWN0b3J5KQorICAgIHsKKyAgICAgICAgdGhpcy50YXJnZXREaXJlY3RvcnkgPSB0YXJnZXREaXJlY3Rvcnk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvdW50ZXJGb3IoaW50IHJvd3MpCiAgICAgewogICAgICAgICBhc3NlcnQgcm93cyA+IDAgJiYgcm93cyAtIDEgPCBtZXJnZUNvdW50ZXJzLmxlbmd0aDsKQEAgLTE5NCw5ICsyMjAsMTIgQEAKIAogICAgICAgICAgICAgICAgIENvbXBhY3Rpb25JdGVyYXRvci50aGlzLnVwZGF0ZUNvdW50ZXJGb3IobWVyZ2VkKTsKIAotICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiB8fCAhY29udHJvbGxlci5jZnMuaW5kZXhNYW5hZ2VyLmhhc0luZGV4ZXMoKSkKKyAgICAgICAgICAgICAgICBpZiAoICh0eXBlICE9IE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiAmJiB0eXBlICE9IE9wZXJhdGlvblR5cGUuTUFKT1JfQ09NUEFDVElPTikgCisgICAgICAgICAgICAgICAgICAgIHx8ICFjb250cm9sbGVyLmNmcy5pbmRleE1hbmFnZXIuaGFzSW5kZXhlcygpICkgCisgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICBDb2x1bW5zIHN0YXRpY3MgPSBDb2x1bW5zLk5PTkU7CiAgICAgICAgICAgICAgICAgQ29sdW1ucyByZWd1bGFycyA9IENvbHVtbnMuTk9ORTsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpPTAsIGlzaXplPXZlcnNpb25zLnNpemUoKTsgaTxpc2l6ZTsgaSsrKQpAQCAtMzQyLDYgKzM3MSwxOCBAQAogICAgICAgICB9CiAKICAgICAgICAgLyoKKyAgICAgICAgICogQ2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBuZXcgcGFydGl0aW9uCisgICAgICAgICAqIFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IHBhcnRpdGlvbktleSBpZ25vcmVzIHRoZSBnY19ncmFjZV9zZWNvbmRzIGR1cmluZyBjb21wYWN0aW9uLgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0aGUgb25OZXdQYXJ0aXRpb24gYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBjdXJyZW50S2V5CisgICAgICAgICAqIHdoaWNoIGlzIHNldCBpbiB0aGUgb25OZXdQYXJ0aXRpb24KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJZ25vcmVHY0dyYWNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuY2ZzLnNob3VsZElnbm9yZUdjR3JhY2VGb3JLZXkoY3VycmVudEtleSk7CisgICAgICAgIH0KKworICAgICAgICAvKgogICAgICAgICAgKiBFdmFsdWF0ZXMgd2hldGhlciBhIHRvbWJzdG9uZSB3aXRoIHRoZSBnaXZlbiBkZWxldGlvbiB0aW1lc3RhbXAgY2FuIGJlIHB1cmdlZC4gVGhpcyBpcyB0aGUgbWluaW11bQogICAgICAgICAgKiB0aW1lc3RhbXAgZm9yIGFueSBzc3RhYmxlIGNvbnRhaW5pbmcgYGN1cnJlbnRLZXlgIG91dHNpZGUgb2YgdGhlIHNldCBvZiBzc3RhYmxlcyBpbnZvbHZlZCBpbiB0aGlzIGNvbXBhY3Rpb24uCiAgICAgICAgICAqIFRoaXMgaXMgY29tcHV0ZWQgbGF6aWx5IG9uIGRlbWFuZCBhcyB3ZSBvbmx5IG5lZWQgdGhpcyBpZiB0aGVyZSBpcyB0b21ic3RvbmVzIGFuZCB0aGlzIGEgYml0IGV4cGVuc2l2ZQpAQCAtMzYyLDggKzQwMywxMCBAQAogICAgICAqIFRoZSByZXN1bHQgcHJvZHVjZWQgYnkgdGhpcyBpdGVyYXRvciBpcyBzdWNoIHRoYXQgd2hlbiBtZXJnZWQgd2l0aCB0b21iU291cmNlIGl0IHByb2R1Y2VzIHRoZSBzYW1lIG91dHB1dAogICAgICAqIGFzIHRoZSBtZXJnZSBvZiBkYXRhU291cmNlIGFuZCB0b21iU291cmNlLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdhcmJhZ2VTa2lwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvciBleHRlbmRzIFdyYXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR2FyYmFnZVNraXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGltcGxlbWVudHMgV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3IKICAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHdyYXBwZWQ7CisKICAgICAgICAgZmluYWwgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHRvbWJTb3VyY2U7CiAgICAgICAgIGZpbmFsIERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uOwogICAgICAgICBmaW5hbCBSb3cgc3RhdGljUm93OwpAQCAtMzkwLDcgKzQzMyw3IEBACiAgICAgICAgICAqLwogICAgICAgICBwcm90ZWN0ZWQgR2FyYmFnZVNraXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBkYXRhU291cmNlLCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdG9tYlNvdXJjZSwgYm9vbGVhbiBjZWxsTGV2ZWxHQykKICAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoZGF0YVNvdXJjZSk7CisgICAgICAgICAgICB0aGlzLndyYXBwZWQgPSBkYXRhU291cmNlOwogICAgICAgICAgICAgdGhpcy50b21iU291cmNlID0gdG9tYlNvdXJjZTsKICAgICAgICAgICAgIHRoaXMuY2VsbExldmVsR0MgPSBjZWxsTGV2ZWxHQzsKICAgICAgICAgICAgIG1ldGFkYXRhID0gZGF0YVNvdXJjZS5tZXRhZGF0YSgpOwpAQCAtNDEwLDYgKzQ1MywxMiBAQAogICAgICAgICAgICAgZGF0YU5leHQgPSBhZHZhbmNlKGRhdGFTb3VyY2UpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3Igd3JhcHBlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB3cmFwcGVkOworICAgICAgICB9CisKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVW5maWx0ZXJlZCBhZHZhbmNlKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBzb3VyY2UpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBzb3VyY2UuaGFzTmV4dCgpID8gc291cmNlLm5leHQoKSA6IG51bGw7CkBAIC00MjMsNyArNDcyLDcgQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgICAgICB3cmFwcGVkLmNsb3NlKCk7CiAgICAgICAgICAgICB0b21iU291cmNlLmNsb3NlKCk7CiAgICAgICAgIH0KIApAQCAtNjk2LDQgKzc0NSw0IEBACiAgICAgewogICAgICAgICByZXR1cm4gY2ZzLm5hbWUuZXF1YWxzKFN5c3RlbUtleXNwYWNlLlBBWE9TKSAmJiBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLmVxdWFscyhTY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUUpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25Mb2dnZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkxvZ2dlci5qYXZhCmluZGV4IDliZjA2M2IuLjg4YTc3MDUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkxvZ2dlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkxvZ2dlci5qYXZhCkBAIC0yMSwxMyArMjEsMTYgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLm5pby5maWxlLio7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5TdGFuZGFyZE9wZW5PcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CkBAIC00OSw2ICs1Miw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTm9TcGFtTG9nZ2VyOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTE9HX0RJUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwogCiBwdWJsaWMgY2xhc3MgQ29tcGFjdGlvbkxvZ2dlcgpAQCAtMTcyLDcgKzE3Niw3IEBACiAgICAgewogICAgICAgICBPYmplY3ROb2RlIG5vZGUgPSBqc29uLm9iamVjdE5vZGUoKTsKICAgICAgICAgbm9kZS5wdXQoImdlbmVyYXRpb24iLCBzc3RhYmxlLmRlc2NyaXB0b3IuaWQudG9TdHJpbmcoKSk7Ci0gICAgICAgIG5vZGUucHV0KCJ2ZXJzaW9uIiwgc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24uZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgbm9kZS5wdXQoInZlcnNpb24iLCBzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbi52ZXJzaW9uKTsKICAgICAgICAgbm9kZS5wdXQoInNpemUiLCBzc3RhYmxlLm9uRGlza0xlbmd0aCgpKTsKICAgICAgICAgSnNvbk5vZGUgbG9nUmVzdWx0ID0gc3RyYXRlZ3kuc3RyYXRlZ3lMb2dnZXIoKS5zc3RhYmxlKHNzdGFibGUpOwogICAgICAgICBpZiAobG9nUmVzdWx0ICE9IG51bGwpCkBAIC0zMDAsNyArMzA0LDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbXBhY3Rpb25Mb2dTZXJpYWxpemVyIGltcGxlbWVudHMgV3JpdGVyCiAgICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbG9nRGlyZWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEubG9nZGlyIiwgIi4iKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGxvZ0RpcmVjdG9yeSA9IExPR19ESVIuZ2V0U3RyaW5nKCk7CiAgICAgICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JQbHVzIGxvZ2dlclNlcnZpY2UgPSBleGVjdXRvckZhY3RvcnkoKS5zZXF1ZW50aWFsKCJDb21wYWN0aW9uTG9nZ2VyIik7CiAgICAgICAgIC8vIFRoaXMgaXMgb25seSBhY2Nlc3NlZCBvbiB0aGUgbG9nZ2VyIHNlcnZpY2UgdGhyZWFkLCBzbyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIHRocmVhZCBzYWZlCiAgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PE9iamVjdD4gcm9sbGVkID0gbmV3IEhhc2hTZXQ8PigpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uTWFuYWdlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uTWFuYWdlci5qYXZhCmluZGV4IDM0N2Y5YjMuLmE5NzI0MTUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbk1hbmFnZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25NYW5hZ2VyLmphdmEKQEAgLTQzLDYgKzQzLDcgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5BcnJheUxpc3RNdWx0aW1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkNvbGxlY3Rpb25zMjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkNvbmN1cnJlbnRIYXNoTXVsdGlzZXQ7CkBAIC01Nyw2ICs1OCw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAoraW1wb3J0IG5ldC5vcGVuaGZ0LmNocm9uaWNsZS5jb3JlLnV0aWwuVGhyb3dpbmdTdXBwbGllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5BdXRvU2F2aW5nQ2FjaGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5XcmFwcGVkRXhlY3V0b3JQbHVzOwpAQCAtNzgsMTYgKzgwLDE2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlldy5WaWV3QnVpbGRlclRhc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Cb3VuZHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguU2Vjb25kYXJ5SW5kZXhCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNjcnViYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVZlcmlmaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJld3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CkBAIC0xMDcsNiArMTA5LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KVk1TdGFiaWxpdHlJbnNwZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTUJlYW5XcmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5XcmFwcGVkUnVubmFibGU7CkBAIC0xNTYsNyArMTU5LDEzIEBACiAgICAgcHJpdmF0ZSBmaW5hbCBDb21wYWN0aW9uRXhlY3V0b3IgY2FjaGVDbGVhbnVwRXhlY3V0b3IgPSBuZXcgQ2FjaGVDbGVhbnVwRXhlY3V0b3IoKTsKICAgICBwcml2YXRlIGZpbmFsIENvbXBhY3Rpb25FeGVjdXRvciB2aWV3QnVpbGRFeGVjdXRvciA9IG5ldyBWaWV3QnVpbGRFeGVjdXRvcigpOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBDb21wYWN0aW9uTWV0cmljcyBtZXRyaWNzID0gbmV3IENvbXBhY3Rpb25NZXRyaWNzKGV4ZWN1dG9yLCB2YWxpZGF0aW9uRXhlY3V0b3IsIHZpZXdCdWlsZEV4ZWN1dG9yKTsKKyAgICAvLyBXZSBjYW4ndCBob3VzZSAyaSBidWlsZHMgaW4gU2Vjb25kYXJ5SW5kZXhNYW5hZ2VtZW50IGJlY2F1c2UgaXQgY291bGQgY2F1c2UgZGVhZGxvY2tzIHdpdGggaXRzZWxmLCBhbmQgY2FuIGNhdXNlCisgICAgLy8gbWFzc2l2ZSB0byBpbmRlZmluaXRlIHBhdXNlcyBpZiBwcmlvcml0aXplZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIG5vcm1hbCBjb21wYWN0aW9ucyBzbyB3ZSBpbnN0ZWFkIHB1dCBpdCBpbiBpdHMKKyAgICAvLyBvd24gcG9vbCB0byBwcmV2ZW50IGVpdGhlciBzY2VuYXJpby4KKyAgICBwcml2YXRlIGZpbmFsIFNlY29uZGFyeUluZGV4RXhlY3V0b3Igc2Vjb25kYXJ5SW5kZXhFeGVjdXRvciA9IG5ldyBTZWNvbmRhcnlJbmRleEV4ZWN1dG9yKCk7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbXBhY3Rpb25NZXRyaWNzIG1ldHJpY3MgPSBuZXcgQ29tcGFjdGlvbk1ldHJpY3MoZXhlY3V0b3IsIHZhbGlkYXRpb25FeGVjdXRvciwgdmlld0J1aWxkRXhlY3V0b3IsIHNlY29uZGFyeUluZGV4RXhlY3V0b3IpOworCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgZmluYWwgTXVsdGlzZXQ8Q29sdW1uRmFtaWx5U3RvcmU+IGNvbXBhY3RpbmdDRiA9IENvbmN1cnJlbnRIYXNoTXVsdGlzZXQuY3JlYXRlKCk7CiAKQEAgLTI2OSwxNCArMjc4LDE2IEBACiAgICAgICAgIGludCBwZW5kaW5nVGFza3MgPSBleGVjdXRvci5nZXRQZW5kaW5nVGFza0NvdW50KCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkV4ZWN1dG9yLmdldFBlbmRpbmdUYXNrQ291bnQoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3QnVpbGRFeGVjdXRvci5nZXRQZW5kaW5nVGFza0NvdW50KCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVDbGVhbnVwRXhlY3V0b3IuZ2V0UGVuZGluZ1Rhc2tDb3VudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVDbGVhbnVwRXhlY3V0b3IuZ2V0UGVuZGluZ1Rhc2tDb3VudCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeUluZGV4RXhlY3V0b3IuZ2V0UGVuZGluZ1Rhc2tDb3VudCgpOwogICAgICAgICBpZiAocGVuZGluZ1Rhc2tzID4gMCkKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCiAgICAgICAgIGludCBhY3RpdmVUYXNrcyA9IGV4ZWN1dG9yLmdldEFjdGl2ZVRhc2tDb3VudCgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkV4ZWN1dG9yLmdldEFjdGl2ZVRhc2tDb3VudCgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld0J1aWxkRXhlY3V0b3IuZ2V0QWN0aXZlVGFza0NvdW50KCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZUNsZWFudXBFeGVjdXRvci5nZXRBY3RpdmVUYXNrQ291bnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVDbGVhbnVwRXhlY3V0b3IuZ2V0QWN0aXZlVGFza0NvdW50KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlJbmRleEV4ZWN1dG9yLmdldEFjdGl2ZVRhc2tDb3VudCgpOwogCiAgICAgICAgIHJldHVybiBhY3RpdmVUYXNrcyA+IDA7CiAgICAgfQpAQCAtMjkyLDYgKzMwMyw3IEBACiAgICAgICAgIHZhbGlkYXRpb25FeGVjdXRvci5zaHV0ZG93bigpOwogICAgICAgICB2aWV3QnVpbGRFeGVjdXRvci5zaHV0ZG93bigpOwogICAgICAgICBjYWNoZUNsZWFudXBFeGVjdXRvci5zaHV0ZG93bigpOworICAgICAgICBzZWNvbmRhcnlJbmRleEV4ZWN1dG9yLnNodXRkb3duKCk7CiAKICAgICAgICAgLy8gaW50ZXJydXB0IGNvbXBhY3Rpb25zIGFuZCB2YWxpZGF0aW9ucwogICAgICAgICBmb3IgKEhvbGRlciBjb21wYWN0aW9uSG9sZGVyIDogYWN0aXZlLmdldENvbXBhY3Rpb25zKCkpCkBAIC0zMDIsNyArMzE0LDggQEAKICAgICAgICAgLy8gd2FpdCBmb3IgdGFza3MgdG8gdGVybWluYXRlCiAgICAgICAgIC8vIGNvbXBhY3Rpb24gdGFza3MgYXJlIGludGVycnVwdGVkIGFib3ZlLCBzbyBpdCBzaHVvbGQgYmUgZmFpcnkgcXVpY2sKICAgICAgICAgLy8gdW50aWwgbm90IGludGVycnVwdGVkIHRhc2tzIHRvIGNvbXBsZXRlLgotICAgICAgICBmb3IgKEV4ZWN1dG9yU2VydmljZSBleGVjIDogQXJyYXlzLmFzTGlzdChleGVjdXRvciwgdmFsaWRhdGlvbkV4ZWN1dG9yLCB2aWV3QnVpbGRFeGVjdXRvciwgY2FjaGVDbGVhbnVwRXhlY3V0b3IpKQorICAgICAgICBmb3IgKEV4ZWN1dG9yU2VydmljZSBleGVjIDogQXJyYXlzLmFzTGlzdChleGVjdXRvciwgdmFsaWRhdGlvbkV4ZWN1dG9yLCB2aWV3QnVpbGRFeGVjdXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGVDbGVhbnVwRXhlY3V0b3IsIHNlY29uZGFyeUluZGV4RXhlY3V0b3IpKQogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKQEAgLTQwNSw3MiArNDE4LDc4IEBACiAgICAgICogQHBhcmFtIG9wZXJhdGlvbiB0aGUgb3BlcmF0aW9uIHRvIHJ1bgogICAgICAqIEBwYXJhbSBqb2JzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byB1c2UgLSAwIG1lYW5zIHVzZSBhbGwgYXZhaWxhYmxlLiBJdCBuZXZlciB1c2VzIG1vcmUgdGhhbiBjb25jdXJyZW50X2NvbXBhY3RvcnMgdGhyZWFkcwogICAgICAqIEByZXR1cm4gc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24KLSAgICAgKiBAdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KICAgICAgKi8KICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHByaXZhdGUgQWxsU1NUYWJsZU9wU3RhdHVzIHBhcmFsbGVsQWxsU1NUYWJsZU9wZXJhdGlvbihmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGZpbmFsIE9uZVNTVGFibGVPcGVyYXRpb24gb3BlcmF0aW9uLCBpbnQgam9icywgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHByaXZhdGUgQWxsU1NUYWJsZU9wU3RhdHVzIHBhcmFsbGVsQWxsU1NUYWJsZU9wZXJhdGlvbihmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9uZVNTVGFibGVPcGVyYXRpb24gb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgam9icywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlKQogICAgIHsKLSAgICAgICAgbG9nZ2VyLmluZm8oIlN0YXJ0aW5nIHt9IGZvciB7fS57fSIsIG9wZXJhdGlvblR5cGUsIGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5nZXRUYWJsZU5hbWUoKSk7Ci0gICAgICAgIExpc3Q8TGlmZWN5Y2xlVHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBMaXN0PEZ1dHVyZTw/Pj4gZnV0dXJlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIGNvbXBhY3RpbmcgPSBjZnMubWFya0FsbENvbXBhY3Rpbmcob3BlcmF0aW9uVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wYWN0aW5nID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEFsbFNTVGFibGVPcFN0YXR1cy5VTkFCTEVfVE9fQ0FOQ0VMOwotCi0gICAgICAgICAgICBJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IExpc3RzLm5ld0FycmF5TGlzdChvcGVyYXRpb24uZmlsdGVyU1NUYWJsZXMoY29tcGFjdGluZykpOwotICAgICAgICAgICAgaWYgKEl0ZXJhYmxlcy5pc0VtcHR5KHNzdGFibGVzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiTm8gc3N0YWJsZXMgdG8ge30gZm9yIHt9Lnt9Iiwgb3BlcmF0aW9uVHlwZS5uYW1lKCksIGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5uYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQWxsU1NUYWJsZU9wU3RhdHVzLlNVQ0NFU1NGVUw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoZmluYWwgU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY29tcGFjdGluZy5zcGxpdChzaW5nbGV0b24oc3N0YWJsZSkpOwotICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucy5hZGQodHhuKTsKLSAgICAgICAgICAgICAgICBDYWxsYWJsZTxPYmplY3Q+IGNhbGxhYmxlID0gbmV3IENhbGxhYmxlPE9iamVjdD4oKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY2FsbCgpIHRocm93cyBFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uLmV4ZWN1dGUodHhuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICBGdXR1cmU8Pz4gZnV0ID0gZXhlY3V0b3Iuc3VibWl0SWZSdW5uaW5nKGNhbGxhYmxlLCAicGFyYWxlbGwgc3N0YWJsZSBvcGVyYXRpb24iKTsKLSAgICAgICAgICAgICAgICBpZiAoIWZ1dC5pc0NhbmNlbGxlZCgpKQotICAgICAgICAgICAgICAgICAgICBmdXR1cmVzLmFkZChmdXQpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFsbFNTVGFibGVPcFN0YXR1cy5BQk9SVEVEOwotCi0gICAgICAgICAgICAgICAgaWYgKGpvYnMgPiAwICYmIGZ1dHVyZXMuc2l6ZSgpID09IGpvYnMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGdXR1cmU8Pz4gZiA9IEZCVXRpbGl0aWVzLndhaXRPbkZpcnN0RnV0dXJlKGZ1dHVyZXMpOwotICAgICAgICAgICAgICAgICAgICBmdXR1cmVzLnJlbW92ZShmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGQlV0aWxpdGllcy53YWl0T25GdXR1cmVzKGZ1dHVyZXMpOwotICAgICAgICAgICAgYXNzZXJ0IGNvbXBhY3Rpbmcub3JpZ2luYWxzKCkuaXNFbXB0eSgpOwotICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkZpbmlzaGVkIHt9IGZvciB7fS57fSBzdWNjZXNzZnVsbHkiLCBvcGVyYXRpb25UeXBlLCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOwotICAgICAgICAgICAgcmV0dXJuIEFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gd2FpdCBvbiBhbnkgdW5maW5pc2hlZCBmdXR1cmVzIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBjbG9zZSBhbiBvbmdvaW5nIHRyYW5zYWN0aW9uCisgICAgICAgIFN0cmluZyBvcGVyYXRpb25OYW1lID0gb3BlcmF0aW9uVHlwZS5uYW1lKCk7CisgICAgICAgIFN0cmluZyBrZXlzcGFjZSA9IGNmcy5rZXlzcGFjZS5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyB0YWJsZSA9IGNmcy5nZXRUYWJsZU5hbWUoKTsKKyAgICAgICAgcmV0dXJuIGNmcy53aXRoQWxsU1NUYWJsZXMob3BlcmF0aW9uVHlwZSwgKGNvbXBhY3RpbmcpIC0+IHsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTdGFydGluZyB7fSBmb3Ige30ue30iLCBvcGVyYXRpb25UeXBlLCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOworICAgICAgICAgICAgTGlzdDxMaWZlY3ljbGVUcmFuc2FjdGlvbj4gdHJhbnNhY3Rpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBMaXN0PEZ1dHVyZTw/Pj4gZnV0dXJlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBhY3RpbmcgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFsbFNTVGFibGVPcFN0YXR1cy5VTkFCTEVfVE9fQ0FOQ0VMOworCisgICAgICAgICAgICAgICAgSXRlcmFibGU8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBMaXN0cy5uZXdBcnJheUxpc3Qob3BlcmF0aW9uLmZpbHRlclNTVGFibGVzKGNvbXBhY3RpbmcpKTsKKyAgICAgICAgICAgICAgICBpZiAoSXRlcmFibGVzLmlzRW1wdHkoc3N0YWJsZXMpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk5vIHNzdGFibGVzIHRvIHt9IGZvciB7fS57fSIsIG9wZXJhdGlvbk5hbWUsIGtleXNwYWNlLCB0YWJsZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBbGxTU1RhYmxlT3BTdGF0dXMuU1VDQ0VTU0ZVTDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY29tcGFjdGluZy5zcGxpdChzaW5nbGV0b24oc3N0YWJsZSkpOworICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMuYWRkKHR4bik7CisgICAgICAgICAgICAgICAgICAgIENhbGxhYmxlPE9iamVjdD4gY2FsbGFibGUgPSBuZXcgQ2FsbGFibGU8T2JqZWN0PigpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi5leGVjdXRlKHR4bik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIEZ1dHVyZTw/PiBmdXQgPSBleGVjdXRvci5zdWJtaXRJZlJ1bm5pbmcoY2FsbGFibGUsICJwYXJhbGxlbCBTU1RhYmxlIG9wZXJhdGlvbiIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZ1dC5pc0NhbmNlbGxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlcy5hZGQoZnV0KTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFsbFNTVGFibGVPcFN0YXR1cy5BQk9SVEVEOworCisgICAgICAgICAgICAgICAgICAgIGlmIChqb2JzID4gMCAmJiBmdXR1cmVzLnNpemUoKSA9PSBqb2JzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBGdXR1cmU8Pz4gZiA9IEZCVXRpbGl0aWVzLndhaXRPbkZpcnN0RnV0dXJlKGZ1dHVyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlcy5yZW1vdmUoZik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMud2FpdE9uRnV0dXJlcyhmdXR1cmVzKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgY29tcGFjdGluZy5vcmlnaW5hbHMoKS5pc0VtcHR5KCk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkZpbmlzaGVkIHt9IGZvciB7fS57fSBzdWNjZXNzZnVsbHkiLCBvcGVyYXRpb25UeXBlLCBrZXlzcGFjZSwgdGFibGUpOworICAgICAgICAgICAgICAgIHJldHVybiBBbGxTU1RhYmxlT3BTdGF0dXMuU1VDQ0VTU0ZVTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgICAgIGZpbmFsbHkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIC8vIHRoZXNlIGFyZSBoYW5kbGVkL2xvZ2dlZCBpbiBDb21wYWN0aW9uRXhlY3V0b3IjYWZ0ZXJFeGVjdXRlCisgICAgICAgICAgICAgICAgLy8gd2FpdCBvbiBhbnkgdW5maW5pc2hlZCBmdXR1cmVzIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBjbG9zZSBhbiBvbmdvaW5nIHRyYW5zYWN0aW9uCisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy53YWl0T25GdXR1cmVzKGZ1dHVyZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBhcmUgaGFuZGxlZC9sb2dnZWQgaW4gQ29tcGFjdGlvbkV4ZWN1dG9yI2FmdGVyRXhlY3V0ZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgZmFpbCA9IFRocm93YWJsZXMuY2xvc2UobnVsbCwgdHJhbnNhY3Rpb25zKTsKKyAgICAgICAgICAgICAgICBpZiAoZmFpbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byBjbGVhbnVwIGxpZmVjeWNsZSB0cmFuc2FjdGlvbnMgKHt9IGZvciB7fS57fSkiLCBvcGVyYXRpb25UeXBlLCBrZXlzcGFjZSwgdGFibGUsIGZhaWwpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgVGhyb3dhYmxlIGZhaWwgPSBUaHJvd2FibGVzLmNsb3NlKG51bGwsIHRyYW5zYWN0aW9ucyk7Ci0gICAgICAgICAgICBpZiAoZmFpbCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIGNsZWFudXAgbGlmZWN5Y2xlIHRyYW5zYWN0aW9ucyAoe30gZm9yIHt9Lnt9KSIsIG9wZXJhdGlvblR5cGUsIGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5nZXRUYWJsZU5hbWUoKSwgZmFpbCk7Ci0gICAgICAgIH0KKyAgICAgICAgfSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIE9uZVNTVGFibGVPcGVyYXRpb24KQEAgLTQ5MywxNiArNTEyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBBbGxTU1RhYmxlT3BTdGF0dXMgcGVyZm9ybVNjcnViKGZpbmFsIENvbHVtbkZhbWlseVN0b3JlIGNmcywgZmluYWwgYm9vbGVhbiBza2lwQ29ycnVwdGVkLCBmaW5hbCBib29sZWFuIGNoZWNrRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgam9icykKLSAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIHBlcmZvcm1TY3J1YihjZnMsIHNraXBDb3JydXB0ZWQsIGNoZWNrRGF0YSwgZmFsc2UsIGpvYnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxTU1RhYmxlT3BTdGF0dXMgcGVyZm9ybVNjcnViKGZpbmFsIENvbHVtbkZhbWlseVN0b3JlIGNmcywgZmluYWwgYm9vbGVhbiBza2lwQ29ycnVwdGVkLCBmaW5hbCBib29sZWFuIGNoZWNrRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTCwgaW50IGpvYnMpCi0gICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24KKyAgICBwdWJsaWMgQWxsU1NUYWJsZU9wU3RhdHVzIHBlcmZvcm1TY3J1YihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIElTY3J1YmJlci5PcHRpb25zIG9wdGlvbnMsIGludCBqb2JzKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBhcmFsbGVsQWxsU1NUYWJsZU9wZXJhdGlvbihjZnMsIG5ldyBPbmVTU1RhYmxlT3BlcmF0aW9uKCkKICAgICAgICAgewpAQCAtNTE1LDEyICs1MjUsMTIgQEAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShMaWZlY3ljbGVUcmFuc2FjdGlvbiBpbnB1dCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzY3J1Yk9uZShjZnMsIGlucHV0LCBza2lwQ29ycnVwdGVkLCBjaGVja0RhdGEsIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTCwgYWN0aXZlKTsKKyAgICAgICAgICAgICAgICBzY3J1Yk9uZShjZnMsIGlucHV0LCBvcHRpb25zLCBhY3RpdmUpOwogICAgICAgICAgICAgfQogICAgICAgICB9LCBqb2JzLCBPcGVyYXRpb25UeXBlLlNDUlVCKTsKICAgICB9CiAKLSAgICBwdWJsaWMgQWxsU1NUYWJsZU9wU3RhdHVzIHBlcmZvcm1WZXJpZnkoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBWZXJpZmllci5PcHRpb25zIG9wdGlvbnMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uCisgICAgcHVibGljIEFsbFNTVGFibGVPcFN0YXR1cyBwZXJmb3JtVmVyaWZ5KENvbHVtbkZhbWlseVN0b3JlIGNmcywgSVZlcmlmaWVyLk9wdGlvbnMgb3B0aW9ucykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGFzc2VydCAhY2ZzLmlzSW5kZXgoKTsKICAgICAgICAgcmV0dXJuIHBhcmFsbGVsQWxsU1NUYWJsZU9wZXJhdGlvbihjZnMsIG5ldyBPbmVTU1RhYmxlT3BlcmF0aW9uKCkKQEAgLTU1MSw3ICs1NjEsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICAgICAgLy8gU2tpcCBpZiBTU1RhYmxlIGNyZWF0aW9uIHRpbWUgaXMgcGFzdCBnaXZlbiB0aW1lc3RhbXAKLSAgICAgICAgICAgIGlmIChzc3RhYmxlLmdldENyZWF0aW9uVGltZUZvcihDb21wb25lbnQuREFUQSkgPiBza2lwSWZPbGRlclRoYW5UaW1lc3RhbXApCisgICAgICAgICAgICBpZiAoc3N0YWJsZS5nZXREYXRhQ3JlYXRpb25UaW1lKCkgPiBza2lwSWZPbGRlclRoYW5UaW1lc3RhbXApCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhID0gY2ZzLm1ldGFkYXRhLmdldCgpOwpAQCAtNjM2LDggKzY0Niw4IEBACiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiU2tpcHBpbmcge30gKFt7fSwge31dKSBmb3IgY2xlYW51cDsgYWxsIHJvd3Mgc2hvdWxkIGJlIGtlcHQuIE5lZWRzIGNsZWFudXAgZnVsbCByYW5nZXM6IHt9IE5lZWRzIGNsZWFudXAgdHJhbnNpZW50IHJhbmdlczoge30gUmVwYWlyZWQ6IHt9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmZpcnN0LmdldFRva2VuKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmxhc3QuZ2V0VG9rZW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0Rmlyc3QoKS5nZXRUb2tlbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRMYXN0KCkuZ2V0VG9rZW4oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzQ2xlYW51cEZ1bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkc0NsZWFudXBUcmFuc2llbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmlzUmVwYWlyZWQoKSk7CkBAIC05MDAsNyArOTEwLDcgQEAKICAgICAgICAgTGlzdDxSYW5nZTxUb2tlbj4+IG5vcm1hbGl6ZWRSYW5nZXMgPSBSYW5nZS5ub3JtYWxpemUocmFuZ2VzLnJhbmdlcygpKTsKICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKICAgICAgICAgewotICAgICAgICAgICAgQm91bmRzPFRva2VuPiBib3VuZHMgPSBuZXcgQm91bmRzPD4oc3N0YWJsZS5maXJzdC5nZXRUb2tlbigpLCBzc3RhYmxlLmxhc3QuZ2V0VG9rZW4oKSk7CisgICAgICAgICAgICBBYnN0cmFjdEJvdW5kczxUb2tlbj4gYm91bmRzID0gc3N0YWJsZS5nZXRCb3VuZHMoKTsKIAogICAgICAgICAgICAgaWYgKCFJdGVyYWJsZXMuYW55KG5vcm1hbGl6ZWRSYW5nZXMsIHIgLT4gKHIuY29udGFpbnMoYm91bmRzLmxlZnQpICYmIHIuY29udGFpbnMoYm91bmRzLnJpZ2h0KSkgfHwgci5pbnRlcnNlY3RzKGJvdW5kcykpKQogICAgICAgICAgICAgewpAQCAtOTIyLDEyICs5MzIsMTIgQEAKICAgICAgICAgewogICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gc3N0YWJsZUl0ZXJhdG9yLm5leHQoKTsKIAotICAgICAgICAgICAgQm91bmRzPFRva2VuPiBzc3RhYmxlQm91bmRzID0gbmV3IEJvdW5kczw+KHNzdGFibGUuZmlyc3QuZ2V0VG9rZW4oKSwgc3N0YWJsZS5sYXN0LmdldFRva2VuKCkpOworICAgICAgICAgICAgQWJzdHJhY3RCb3VuZHM8VG9rZW4+IHNzdGFibGVCb3VuZHMgPSBzc3RhYmxlLmdldEJvdW5kcygpOwogCiAgICAgICAgICAgICBmb3IgKFJhbmdlPFRva2VuPiByIDogbm9ybWFsaXplZFJhbmdlcykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyByYW5nZXMgYXJlIG5vcm1hbGl6ZWQgLSBubyB3cmFwIGFyb3VuZCAtIGlmIGZpcnN0IGFuZCBsYXN0IGFyZSBjb250YWluZWQgd2Uga25vdyB0aGF0IGFsbCB0b2tlbnMgYXJlIGNvbnRhaW5lZCBpbiB0aGUgcmFuZ2UKLSAgICAgICAgICAgICAgICBpZiAoci5jb250YWlucyhzc3RhYmxlLmZpcnN0LmdldFRva2VuKCkpICYmIHIuY29udGFpbnMoc3N0YWJsZS5sYXN0LmdldFRva2VuKCkpKQorICAgICAgICAgICAgICAgIGlmIChyLmNvbnRhaW5zKHNzdGFibGUuZ2V0Rmlyc3QoKS5nZXRUb2tlbigpKSAmJiByLmNvbnRhaW5zKHNzdGFibGUuZ2V0TGFzdCgpLmdldFRva2VuKCkpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInt9IFNTVGFibGUge30gZnVsbHkgY29udGFpbmVkIGluIHJhbmdlIHt9LCBtdXRhdGluZyByZXBhaXJlZEF0IGluc3RlYWQgb2YgYW50aWNvbXBhY3RpbmciLCBQcmV2aWV3S2luZC5OT05FLmxvZ1ByZWZpeChwYXJlbnRSZXBhaXJTZXNzaW9uKSwgc3N0YWJsZSwgcik7CiAgICAgICAgICAgICAgICAgICAgIGZ1bGx5Q29udGFpbmVkU1NUYWJsZXMuYWRkKHNzdGFibGUpOwpAQCAtOTUxLDEwICs5NjEsMTYgQEAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyB0aGUgdGFza3MgYXJlIGV4ZWN1dGVkIGluIHBhcmFsbGVsIG9uIHRoZSBleGVjdXRvciwgbWFraW5nIHN1cmUgdGhhdCB0aGV5IGdldCBjbG9zZWQKICAgICBwdWJsaWMgTGlzdDxGdXR1cmU8Pz4+IHN1Ym1pdE1heGltYWwoZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZTdG9yZSwgZmluYWwgaW50IGdjQmVmb3JlLCBib29sZWFuIHNwbGl0T3V0cHV0KQogICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdWJtaXRNYXhpbWFsKGNmU3RvcmUsIGdjQmVmb3JlLCBzcGxpdE91dHB1dCwgT3BlcmF0aW9uVHlwZS5NQUpPUl9DT01QQUNUSU9OKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQorICAgIHB1YmxpYyBMaXN0PEZ1dHVyZTw/Pj4gc3VibWl0TWF4aW1hbChmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSBjZlN0b3JlLCBmaW5hbCBpbnQgZ2NCZWZvcmUsIGJvb2xlYW4gc3BsaXRPdXRwdXQsIE9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSkKKyAgICB7CiAgICAgICAgIC8vIGhlcmUgd2UgY29tcHV0ZSB0aGUgdGFzayBvZmYgdGhlIGNvbXBhY3Rpb24gZXhlY3V0b3IsIHNvIGhhdmluZyB0aGF0IHByZXNlbnQgZG9lc24ndAogICAgICAgICAvLyBjb25mdXNlIHJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkIC0tIGkuZS4sIHdlIGRvbid0IHdhbnQgdG8gZGVhZGxvY2sgb3Vyc2VsdmVzLCB3YWl0aW5nCiAgICAgICAgIC8vIGZvciBvdXJzZWx2ZXMgdG8gZmluaXNoL2Fja25vd2xlZGdlIGNhbmNlbGxhdGlvbiBiZWZvcmUgY29udGludWluZy4KLSAgICAgICAgQ29tcGFjdGlvblRhc2tzIHRhc2tzID0gY2ZTdG9yZS5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCkuZ2V0TWF4aW1hbFRhc2tzKGdjQmVmb3JlLCBzcGxpdE91dHB1dCk7CisgICAgICAgIENvbXBhY3Rpb25UYXNrcyB0YXNrcyA9IGNmU3RvcmUuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLmdldE1heGltYWxUYXNrcyhnY0JlZm9yZSwgc3BsaXRPdXRwdXQsIG9wZXJhdGlvblR5cGUpOwogCiAgICAgICAgIGlmICh0YXNrcy5pc0VtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CkBAIC05OTksNiArMTAxNSw3IEBACiAKICAgICAgICAgdHJ5IChDb21wYWN0aW9uVGFza3MgdGFza3MgPSBjZlN0b3JlLnJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKHRhc2tDcmVhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZXNQcmVkaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25UeXBlLk1BSk9SX0NPTVBBQ1RJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKQpAQCAtMTAxMiw3ICsxMDI5LDEwIEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBmb3IgKEFic3RyYWN0Q29tcGFjdGlvblRhc2sgdGFzayA6IHRhc2tzKQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2sgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnNldENvbXBhY3Rpb25UeXBlKE9wZXJhdGlvblR5cGUuTUFKT1JfQ09NUEFDVElPTik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5leGVjdXRlKGFjdGl2ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKIApAQCAtMTAzMyw3ICsxMDUzLDcgQEAKICAgICB7CiAgICAgICAgIGZvcmNlQ29tcGFjdGlvbihjZlN0b3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gc3N0YWJsZXNJbkJvdW5kcyhjZlN0b3JlLCByYW5nZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZSAtPiBuZXcgQm91bmRzPD4oc3N0YWJsZS5maXJzdC5nZXRUb2tlbigpLCBzc3RhYmxlLmxhc3QuZ2V0VG9rZW4oKSkuaW50ZXJzZWN0cyhyYW5nZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUgLT4gc3N0YWJsZS5nZXRCb3VuZHMoKS5pbnRlcnNlY3RzKHJhbmdlcykpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTA3MSw3ICsxMDkxLDEyIEBACiAKICAgICBwdWJsaWMgdm9pZCBmb3JjZUNvbXBhY3Rpb25Gb3JLZXkoQ29sdW1uRmFtaWx5U3RvcmUgY2ZTdG9yZSwgRGVjb3JhdGVkS2V5IGtleSkKICAgICB7Ci0gICAgICAgIGZvcmNlQ29tcGFjdGlvbihjZlN0b3JlLCAoKSAtPiBzc3RhYmxlc1dpdGhLZXkoY2ZTdG9yZSwga2V5KSwgc3N0YWJsZSAtPiBzc3RhYmxlLm1heWJlUHJlc2VudChrZXkpKTsKKyAgICAgICAgZm9yY2VDb21wYWN0aW9uKGNmU3RvcmUsICgpIC0+IHNzdGFibGVzV2l0aEtleShjZlN0b3JlLCBrZXkpLCBQcmVkaWNhdGVzLmFsd2F5c1RydWUoKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0aW9uRm9yS2V5cyhDb2x1bW5GYW1pbHlTdG9yZSBjZlN0b3JlLCBDb2xsZWN0aW9uPERlY29yYXRlZEtleT4ga2V5cykKKyAgICB7CisgICAgICAgIGZvcmNlQ29tcGFjdGlvbihjZlN0b3JlLCAoKSAtPiBzc3RhYmxlc1dpdGhLZXlzKGNmU3RvcmUsIGtleXMpLCBQcmVkaWNhdGVzLmFsd2F5c1RydWUoKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlc1dpdGhLZXkoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBEZWNvcmF0ZWRLZXkga2V5KQpAQCAtMTA4MSwxMiArMTEwNiwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LmdldFRva2VuKCkubWF4S2V5Qm91bmQoKSk7CiAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogbGl2ZVRhYmxlcykKICAgICAgICAgewotICAgICAgICAgICAgaWYgKHNzdGFibGUubWF5YmVQcmVzZW50KGtleSkpCisgICAgICAgICAgICBpZiAoc3N0YWJsZS5tYXlDb250YWluQXNzdW1pbmdLZXlJc0luUmFuZ2Uoa2V5KSkKICAgICAgICAgICAgICAgICBzc3RhYmxlcy5hZGQoc3N0YWJsZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNzdGFibGVzLmlzRW1wdHkoKSA/IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpIDogc3N0YWJsZXM7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlc1dpdGhLZXlzKENvbHVtbkZhbWlseVN0b3JlIGNmcywgQ29sbGVjdGlvbjxEZWNvcmF0ZWRLZXk+IGRlY29yYXRlZEtleXMpCisgICAgeworICAgICAgICBmaW5hbCBTZXQ8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAgICAgZm9yIChEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkS2V5IDogZGVjb3JhdGVkS2V5cykKKyAgICAgICAgeworICAgICAgICAgICAgc3N0YWJsZXMuYWRkQWxsKHNzdGFibGVzV2l0aEtleShjZnMsIGRlY29yYXRlZEtleSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNzdGFibGVzOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGZvcmNlVXNlckRlZmluZWRDb21wYWN0aW9uKFN0cmluZyBkYXRhRmlsZXMpCiAgICAgewogICAgICAgICBTdHJpbmdbXSBmaWxlbmFtZXMgPSBkYXRhRmlsZXMuc3BsaXQoIiwiKTsKQEAgLTEwOTUsNyArMTEzMiw3IEBACiAgICAgICAgIGZvciAoU3RyaW5nIGZpbGVuYW1lIDogZmlsZW5hbWVzKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyBleHRyYWN0IGtleXNwYWNlIGFuZCBjb2x1bW5mYW1pbHkgbmFtZSBmcm9tIGZpbGVuYW1lCi0gICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShmaWxlbmFtZS50cmltKCkpOworICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZVdpdGhDb21wb25lbnQobmV3IEZpbGUoZmlsZW5hbWUudHJpbSgpKSwgZmFsc2UpLmxlZnQ7CiAgICAgICAgICAgICBpZiAoU2NoZW1hLmluc3RhbmNlLmdldFRhYmxlTWV0YWRhdGFSZWYoZGVzYykgPT0gbnVsbCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiU2NoZW1hIGRvZXMgbm90IGV4aXN0IGZvciBmaWxlIHt9LiBTa2lwcGluZy4iLCBmaWxlbmFtZSk7CkBAIC0xMTIxLDcgKzExNTgsNyBAQAogICAgICAgICBmb3IgKFN0cmluZyBmaWxlbmFtZSA6IGZpbGVuYW1lcykKICAgICAgICAgewogICAgICAgICAgICAgLy8gZXh0cmFjdCBrZXlzcGFjZSBhbmQgY29sdW1uZmFtaWx5IG5hbWUgZnJvbSBmaWxlbmFtZQotICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUoZmlsZW5hbWUudHJpbSgpKTsKKyAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IERlc2NyaXB0b3IuZnJvbUZpbGVXaXRoQ29tcG9uZW50KG5ldyBGaWxlKGZpbGVuYW1lLnRyaW0oKSksIGZhbHNlKS5sZWZ0OwogICAgICAgICAgICAgaWYgKFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZU1ldGFkYXRhUmVmKGRlc2MpID09IG51bGwpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlNjaGVtYSBkb2VzIG5vdCBleGlzdCBmb3IgZmlsZSB7fS4gU2tpcHBpbmcuIiwgZmlsZW5hbWUpOwpAQCAtMTI0MiwxMSArMTI3OSwxMSBAQAogICAgIH0KIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHZvaWQgc2NydWJPbmUoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBMaWZlY3ljbGVUcmFuc2FjdGlvbiBtb2RpZmllciwgYm9vbGVhbiBza2lwQ29ycnVwdGVkLCBib29sZWFuIGNoZWNrRGF0YSwgYm9vbGVhbiByZWluc2VydE92ZXJmbG93ZWRUVEwsIEFjdGl2ZUNvbXBhY3Rpb25zVHJhY2tlciBhY3RpdmVDb21wYWN0aW9ucykKKyAgICB2b2lkIHNjcnViT25lKENvbHVtbkZhbWlseVN0b3JlIGNmcywgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gbW9kaWZpZXIsIElTY3J1YmJlci5PcHRpb25zIG9wdGlvbnMsIEFjdGl2ZUNvbXBhY3Rpb25zVHJhY2tlciBhY3RpdmVDb21wYWN0aW9ucykKICAgICB7CiAgICAgICAgIENvbXBhY3Rpb25JbmZvLkhvbGRlciBzY3J1YkluZm8gPSBudWxsOwotCi0gICAgICAgIHRyeSAoU2NydWJiZXIgc2NydWJiZXIgPSBuZXcgU2NydWJiZXIoY2ZzLCBtb2RpZmllciwgc2tpcENvcnJ1cHRlZCwgY2hlY2tEYXRhLCByZWluc2VydE92ZXJmbG93ZWRUVEwpKQorICAgICAgICBTU1RhYmxlRm9ybWF0IGZvcm1hdCA9IG1vZGlmaWVyLm9ubHlPbmUoKS5kZXNjcmlwdG9yLmdldEZvcm1hdCgpOworICAgICAgICB0cnkgKElTY3J1YmJlciBzY3J1YmJlciA9IGZvcm1hdC5nZXRTY3J1YmJlcihjZnMsIG1vZGlmaWVyLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgb3B0aW9ucykpCiAgICAgICAgIHsKICAgICAgICAgICAgIHNjcnViSW5mbyA9IHNjcnViYmVyLmdldFNjcnViSW5mbygpOwogICAgICAgICAgICAgYWN0aXZlQ29tcGFjdGlvbnMuYmVnaW5Db21wYWN0aW9uKHNjcnViSW5mbyk7CkBAIC0xMjYwLDExICsxMjk3LDEwIEBACiAgICAgfQogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgdm9pZCB2ZXJpZnlPbmUoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBTU1RhYmxlUmVhZGVyIHNzdGFibGUsIFZlcmlmaWVyLk9wdGlvbnMgb3B0aW9ucywgQWN0aXZlQ29tcGFjdGlvbnNUcmFja2VyIGFjdGl2ZUNvbXBhY3Rpb25zKQorICAgIHZvaWQgdmVyaWZ5T25lKENvbHVtbkZhbWlseVN0b3JlIGNmcywgU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBJVmVyaWZpZXIuT3B0aW9ucyBvcHRpb25zLCBBY3RpdmVDb21wYWN0aW9uc1RyYWNrZXIgYWN0aXZlQ29tcGFjdGlvbnMpCiAgICAgewogICAgICAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgdmVyaWZ5SW5mbyA9IG51bGw7Ci0KLSAgICAgICAgdHJ5IChWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWZXJpZmllcihjZnMsIHNzdGFibGUsIGZhbHNlLCBvcHRpb25zKSkKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBvcHRpb25zKSkKICAgICAgICAgewogICAgICAgICAgICAgdmVyaWZ5SW5mbyA9IHZlcmlmaWVyLmdldFZlcmlmeUluZm8oKTsKICAgICAgICAgICAgIGFjdGl2ZUNvbXBhY3Rpb25zLmJlZ2luQ29tcGFjdGlvbih2ZXJpZnlJbmZvKTsKQEAgLTEyOTUsNyArMTMzMSw3IEBACiAgICAgICAgIC8vIHNlZSBpZiB0aGVyZSBhcmUgYW55IGtleXMgTFRFIHRoZSB0b2tlbiBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCByYW5nZQogICAgICAgICAvLyAodG9rZW4gcmFuZ2Ugb3duZXJzaGlwIGlzIGV4Y2x1c2l2ZSBvbiB0aGUgTEhTLikKICAgICAgICAgUmFuZ2U8VG9rZW4+IGZpcnN0UmFuZ2UgPSBzb3J0ZWRSYW5nZXMuZ2V0KDApOwotICAgICAgICBpZiAoc3N0YWJsZS5maXJzdC5nZXRUb2tlbigpLmNvbXBhcmVUbyhmaXJzdFJhbmdlLmxlZnQpIDw9IDApCisgICAgICAgIGlmIChzc3RhYmxlLmdldEZpcnN0KCkuZ2V0VG9rZW4oKS5jb21wYXJlVG8oZmlyc3RSYW5nZS5sZWZ0KSA8PSAwKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAgICAgLy8gdGhlbiwgaXRlcmF0ZSBvdmVyIGFsbCBvd25lZCByYW5nZXMgYW5kIHNlZSBpZiB0aGUgbmV4dCBrZXkgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG93bmVkCkBAIC0xMzUxLDExICsxMzg3LDExIEBACiAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IHR4bi5vbmx5T25lKCk7CiAKICAgICAgICAgLy8gaWYgcmFuZ2VzIGlzIGVtcHR5IGFuZCBubyBpbmRleCwgZW50aXJlIHNzdGFibGUgaXMgZGlzY2FyZGVkCi0gICAgICAgIGlmICghaGFzSW5kZXhlcyAmJiAhbmV3IEJvdW5kczw+KHNzdGFibGUuZmlyc3QuZ2V0VG9rZW4oKSwgc3N0YWJsZS5sYXN0LmdldFRva2VuKCkpLmludGVyc2VjdHMoYWxsUmFuZ2VzKSkKKyAgICAgICAgaWYgKCFoYXNJbmRleGVzICYmICFzc3RhYmxlLmdldEJvdW5kcygpLmludGVyc2VjdHMoYWxsUmFuZ2VzKSkKICAgICAgICAgewogICAgICAgICAgICAgdHhuLm9ic29sZXRlT3JpZ2luYWxzKCk7CiAgICAgICAgICAgICB0eG4uZmluaXNoKCk7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygiU1NUYWJsZSB7fSAoW3t9LCB7fV0pIGRvZXMgbm90IGludGVyc2VjdCB0aGUgb3duZWQgcmFuZ2VzICh7fSksIGRyb3BwaW5nIGl0Iiwgc3N0YWJsZSwgc3N0YWJsZS5maXJzdC5nZXRUb2tlbigpLCBzc3RhYmxlLmxhc3QuZ2V0VG9rZW4oKSwgYWxsUmFuZ2VzKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTU1RhYmxlIHt9IChbe30sIHt9XSkgZG9lcyBub3QgaW50ZXJzZWN0IHRoZSBvd25lZCByYW5nZXMgKHt9KSwgZHJvcHBpbmcgaXQiLCBzc3RhYmxlLCBzc3RhYmxlLmdldEZpcnN0KCkuZ2V0VG9rZW4oKSwgc3N0YWJsZS5nZXRMYXN0KCkuZ2V0VG9rZW4oKSwgYWxsUmFuZ2VzKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0xMzkxLDYgKzE0MjcsNyBAQAogCiAgICAgICAgICAgICB3aGlsZSAoY2kuaGFzTmV4dCgpKQogICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNpLnNldFRhcmdldERpcmVjdG9yeSh3cml0ZXIuY3VycmVudFdyaXRlcigpLmdldEZpbGVuYW1lKCkpOwogICAgICAgICAgICAgICAgIHRyeSAoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbiA9IGNpLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBub3RDbGVhbmVkID0gY2xlYW51cFN0cmF0ZWd5LmNsZWFudXAocGFydGl0aW9uKSkKICAgICAgICAgICAgICAgICB7CkBAIC0xNTU0LDE2ICsxNTkxLDE4IEBACiAgICAgewogICAgICAgICBGaWxlVXRpbHMuY3JlYXRlRGlyZWN0b3J5KGNvbXBhY3Rpb25GaWxlTG9jYXRpb24pOwogCi0gICAgICAgIHJldHVybiBTU1RhYmxlV3JpdGVyLmNyZWF0ZShjZnMubWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoY29tcGFjdGlvbkZpbGVMb2NhdGlvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZEJsb29tRmlsdGVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGFpcmVkQXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUcmFuc2llbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldFNTVGFibGVMZXZlbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5oZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eG4pOworICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoY29tcGFjdGlvbkZpbGVMb2NhdGlvbik7CisgICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldEZvcm1hdCgpLmdldFdyaXRlckZhY3RvcnkoKS5idWlsZGVyKGRlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEtleUNvdW50KGV4cGVjdGVkQmxvb21GaWx0ZXJTaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSZXBhaXJlZEF0KHJlcGFpcmVkQXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBlbmRpbmdSZXBhaXIocGVuZGluZ1JlcGFpcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VHJhbnNpZW50U1NUYWJsZShpc1RyYW5zaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGFibGVNZXRhZGF0YVJlZihjZnMubWV0YWRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1ldGFkYXRhQ29sbGVjdG9yKG5ldyBNZXRhZGF0YUNvbGxlY3RvcihjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yKS5zc3RhYmxlTGV2ZWwoc3N0YWJsZS5nZXRTU1RhYmxlTGV2ZWwoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoc3N0YWJsZS5oZWFkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZERlZmF1bHRDb21wb25lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmx1c2hPYnNlcnZlcnNGb3JTZWNvbmRhcnlJbmRleGVzKGNmcy5pbmRleE1hbmFnZXIubGlzdEluZGV4ZXMoKSwgdHhuLm9wVHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCh0eG4sIGNmcyk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlV3JpdGVyIGNyZWF0ZVdyaXRlckZvckFudGlDb21wYWN0aW9uKENvbHVtbkZhbWlseVN0b3JlIGNmcywKQEAgLTE1OTEsMTYgKzE2MzAsMTkgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gU1NUYWJsZVdyaXRlci5jcmVhdGUoY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGNvbXBhY3Rpb25GaWxlTG9jYXRpb24pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIGV4cGVjdGVkQmxvb21GaWx0ZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwYWlyZWRBdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdSZXBhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5tZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXRhZGF0YUNvbGxlY3Rvcihzc3RhYmxlcywgY2ZzLm1ldGFkYXRhKCkuY29tcGFyYXRvciwgbWluTGV2ZWwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLCBzc3RhYmxlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eG4pOworCisgICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihjb21wYWN0aW9uRmlsZUxvY2F0aW9uKTsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuZ2V0V3JpdGVyRmFjdG9yeSgpLmJ1aWxkZXIoZGVzY3JpcHRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0S2V5Q291bnQoZXhwZWN0ZWRCbG9vbUZpbHRlclNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFJlcGFpcmVkQXQocmVwYWlyZWRBdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGVuZGluZ1JlcGFpcihwZW5kaW5nUmVwYWlyKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUcmFuc2llbnRTU1RhYmxlKGlzVHJhbnNpZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUYWJsZU1ldGFkYXRhUmVmKGNmcy5tZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWV0YWRhdGFDb2xsZWN0b3IobmV3IE1ldGFkYXRhQ29sbGVjdG9yKHNzdGFibGVzLCBjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yLCBtaW5MZXZlbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLCBzc3RhYmxlcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZERlZmF1bHRDb21wb25lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmx1c2hPYnNlcnZlcnNGb3JTZWNvbmRhcnlJbmRleGVzKGNmcy5pbmRleE1hbmFnZXIubGlzdEluZGV4ZXMoKSwgdHhuLm9wVHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCh0eG4sIGNmcyk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNzQ1LDE1ICsxNzg3LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChmdWxsQ2hlY2tlci50ZXN0KHRva2VuKSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFdyaXRlci5hcHBlbmQocGFydGl0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNpLnNldFRhcmdldERpcmVjdG9yeShmdWxsV3JpdGVyLmN1cnJlbnRXcml0ZXIoKS5nZXRGaWxlbmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0cmFuc0NoZWNrZXIudGVzdCh0b2tlbikpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zV3JpdGVyLmFwcGVuZChwYXJ0aXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgY2kuc2V0VGFyZ2V0RGlyZWN0b3J5KHRyYW5zV3JpdGVyLmN1cnJlbnRXcml0ZXIoKS5nZXRGaWxlbmFtZSgpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgYXBwZW5kIGl0IHRvIHRoZSB1bnJlcGFpcmVkIHNzdGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgIHVucmVwYWlyZWRXcml0ZXIuYXBwZW5kKHBhcnRpdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBjaS5zZXRUYXJnZXREaXJlY3RvcnkodW5yZXBhaXJlZFdyaXRlci5jdXJyZW50V3JpdGVyKCkuZ2V0RmlsZW5hbWUoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbG9uZyBieXRlc1NjYW5uZWQgPSBzY2FubmVycy5nZXRUb3RhbEJ5dGVzU2Nhbm5lZCgpOwogICAgICAgICAgICAgICAgICAgICBjb21wYWN0aW9uUmF0ZUxpbWl0ZXJBY3F1aXJlKGxpbWl0ZXIsIGJ5dGVzU2Nhbm5lZCwgbGFzdEJ5dGVzU2Nhbm5lZCwgY29tcHJlc3Npb25SYXRpbyk7CkBAIC0xNzg4LDEwICsxODMzLDE3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBlKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIENvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbiAmJiBpc0NhbmNlbGxlZC5nZXRBc0Jvb2xlYW4oKSkKKyAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJBbnRpY29tcGFjdGlvbiBoYXMgYmVlbiBjYW5jZWxlZCBmb3Igc2Vzc2lvbiB7fSIsIHBlbmRpbmdSZXBhaXIpOwotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICAgICAgaWYgKGlzQ2FuY2VsbGVkLmdldEFzQm9vbGVhbigpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkFudGljb21wYWN0aW9uIGhhcyBiZWVuIGNhbmNlbGVkIGZvciBzZXNzaW9uIHt9IiwgcGVuZGluZ1JlcGFpcik7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZShlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJBbnRpY29tcGFjdGlvbiBmb3Igc2Vzc2lvbiB7fSBoYXMgYmVlbiBzdG9wcGVkIGJ5IHJlcXVlc3QuIiwgcGVuZGluZ1JlcGFpcik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewpAQCAtMTgzMyw3ICsxODg1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKIAotICAgICAgICByZXR1cm4gZXhlY3V0b3Iuc3VibWl0SWZSdW5uaW5nKHJ1bm5hYmxlLCAiaW5kZXggYnVpbGQiKTsKKyAgICAgICAgcmV0dXJuIHNlY29uZGFyeUluZGV4RXhlY3V0b3Iuc3VibWl0SWZSdW5uaW5nKHJ1bm5hYmxlLCAiaW5kZXggYnVpbGQiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE4ODIsMjIgKzE5MzQsMTYgQEAKICAgICAgICAgcmV0dXJuIGV4ZWN1dG9yLnN1Ym1pdElmUnVubmluZyhydW5uYWJsZSwgImNhY2hlIHdyaXRlIik7CiAgICAgfQogCi0gICAgcHVibGljIExpc3Q8U1NUYWJsZVJlYWRlcj4gcnVuSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24oSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24gcmVkaXN0cmlidXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHB1YmxpYyA8VCwgRSBleHRlbmRzIFRocm93YWJsZT4gVCBydW5Bc0FjdGl2ZUNvbXBhY3Rpb24oSG9sZGVyIGFjdGl2ZUNvbXBhY3Rpb25JbmZvLCBUaHJvd2luZ1N1cHBsaWVyPFQsIEU+IGNhbGxhYmxlKSB0aHJvd3MgRQogICAgIHsKLSAgICAgICAgcmV0dXJuIHJ1bkluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uKHJlZGlzdHJpYnV0aW9uLCBhY3RpdmUpOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gcnVuSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24oSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24gcmVkaXN0cmlidXRpb24sIEFjdGl2ZUNvbXBhY3Rpb25zVHJhY2tlciBhY3RpdmVDb21wYWN0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhY3RpdmVDb21wYWN0aW9ucy5iZWdpbkNvbXBhY3Rpb24ocmVkaXN0cmlidXRpb24pOworICAgICAgICBhY3RpdmUuYmVnaW5Db21wYWN0aW9uKGFjdGl2ZUNvbXBhY3Rpb25JbmZvKTsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByZWRpc3RyaWJ1dGlvbi5yZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBjYWxsYWJsZS5nZXQoKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbGx5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGFjdGl2ZUNvbXBhY3Rpb25zLmZpbmlzaENvbXBhY3Rpb24ocmVkaXN0cmlidXRpb24pOworICAgICAgICAgICAgYWN0aXZlLmZpbmlzaENvbXBhY3Rpb24oYWN0aXZlQ29tcGFjdGlvbkluZm8pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMDc2LDYgKzIxMjIsMTMgQEAKICAgICAgICAgbWV0cmljcy5zc3RhYmxlc0Ryb3BwcGVkRnJvbUNvbXBhY3Rpb25zLmluYyhudW0pOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlY29uZGFyeUluZGV4RXhlY3V0b3IgZXh0ZW5kcyBDb21wYWN0aW9uRXhlY3V0b3IKKyAgICB7CisgICAgICAgIHB1YmxpYyBTZWNvbmRhcnlJbmRleEV4ZWN1dG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbmN1cnJlbnRJbmRleEJ1aWxkZXJzKCksICJTZWNvbmRhcnlJbmRleEV4ZWN1dG9yIiwgSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICB9CisgICAgfQogCiAgICAgcHVibGljIExpc3Q8TWFwPFN0cmluZywgU3RyaW5nPj4gZ2V0Q29tcGFjdGlvbnMoKQogICAgIHsKQEAgLTIyODMsNiArMjMzNiwyNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIExpc3Q8SG9sZGVyPiBnZXRDb21wYWN0aW9uc01hdGNoaW5nKEl0ZXJhYmxlPFRhYmxlTWV0YWRhdGE+IGNvbHVtbkZhbWlsaWVzLCBQcmVkaWNhdGU8Q29tcGFjdGlvbkluZm8+IHByZWRpY2F0ZSkKKyAgICB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChjb2x1bW5GYW1pbGllcyAhPSBudWxsLCAiQXR0ZW1wdGVkIHRvIGdldENvbXBhY3Rpb25zTWF0Y2hpbmcgaW4gQ29tcGFjdGlvbk1hbmFnZXIgd2l0aCBubyBjb2x1bW5GYW1pbGllcyBzcGVjaWZpZWQuIik7CisKKyAgICAgICAgTGlzdDxIb2xkZXI+IG1hdGNoZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgLy8gY29uc2lkZXIgYWxsIGluLXByb2dyZXNzIGNvbXBhY3Rpb25zCisgICAgICAgIGZvciAoSG9sZGVyIGhvbGRlciA6IGFjdGl2ZS5nZXRDb21wYWN0aW9ucygpKQorICAgICAgICB7CisgICAgICAgICAgICBDb21wYWN0aW9uSW5mbyBpbmZvID0gaG9sZGVyLmdldENvbXBhY3Rpb25JbmZvKCk7CisgICAgICAgICAgICBpZiAoaW5mby5nZXRUYWJsZU1ldGFkYXRhKCkgPT0gbnVsbCB8fCBJdGVyYWJsZXMuY29udGFpbnMoY29sdW1uRmFtaWxpZXMsIGluZm8uZ2V0VGFibGVNZXRhZGF0YSgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocHJlZGljYXRlLnRlc3QoaW5mbykpCisgICAgICAgICAgICAgICAgICAgIG1hdGNoZWQuYWRkKGhvbGRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hdGNoZWQ7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVHJ5IHRvIHN0b3AgYWxsIG9mIHRoZSBjb21wYWN0aW9ucyBmb3IgZ2l2ZW4gQ29sdW1uRmFtaWxpZXMuCiAgICAgICoKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblN0cmF0ZWd5SG9sZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25TdHJhdGVneUhvbGRlci5qYXZhCmluZGV4IGNhYjBhZjAuLjI5ZThjMjkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblN0cmF0ZWd5SG9sZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uU3RyYXRlZ3lIb2xkZXIuamF2YQpAQCAtMjYxLDQgKzI2MSwxNCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIEl0ZXJhYmxlcy5hbnkoc3RyYXRlZ2llcywgYWNzIC0+IGFjcy5nZXRTU1RhYmxlcygpLmNvbnRhaW5zKHNzdGFibGUpKTsKICAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKCkKKyAgICB7CisgICAgICAgIGludCB0YXNrcyA9IDA7CisgICAgICAgIGZvciAoQWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3kgc3RyYXRlZ3kgOiBzdHJhdGVnaWVzKQorICAgICAgICB7CisgICAgICAgICAgICB0YXNrcyArPSBzdHJhdGVneS5nZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0YXNrczsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5qYXZhCmluZGV4IDVlMWQ1NjEuLmVhMzEyYmMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5qYXZhCkBAIC0yMywyMSArMjMsMjUgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtU3VwcG9ydDsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuTG9uZ3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTU0LDE0ICs1OCwxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNTVGFibGVTY2FubmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVNdWx0aVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5JTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuSU5vdGlmaWNhdGlvbkNvbnN1bWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuU1NUYWJsZUFkZGVkTm90aWZpY2F0aW9uOwpAQCAtNzEsNyArNzYsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuU1NUYWJsZVJlcGFpclN0YXR1c0NoYW5nZWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEucmVwYWlyLmNvbnNpc3RlbnQuYWRtaW4uQ2xlYW51cFN1bW1hcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXBhY3Rpb25QYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCkBAIC0xNDEsNiArMTQ1LDggQEAKICAgICBwcml2YXRlIHZvbGF0aWxlIGxvbmcgbWF4U1NUYWJsZVNpemVCeXRlczsKICAgICBwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBuYW1lOwogCisgICAgcHVibGljIHN0YXRpYyBpbnQgVFdDU19CVUNLRVRfQ09VTlRfTUFYID0gMTI4OworCiAgICAgcHVibGljIENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQogICAgIHsKICAgICAgICAgdGhpcyhjZnMsIGNmczo6Z2V0RGlza0JvdW5kYXJpZXMsIGNmcy5nZXRQYXJ0aXRpb25lcigpLnNwbGl0dGVyKCkuaXNQcmVzZW50KCkpOwpAQCAtMTc0LDkgKzE4MCwxMiBAQAogICAgICAgICB0aGlzLmNvbXBhY3Rpb25Mb2dnZXIgPSBuZXcgQ29tcGFjdGlvbkxvZ2dlcihjZnMsIHRoaXMpOwogICAgICAgICB0aGlzLmJvdW5kYXJpZXNTdXBwbGllciA9IGJvdW5kYXJpZXNTdXBwbGllcjsKICAgICAgICAgdGhpcy5wYXJ0aXRpb25TU1RhYmxlc0J5VG9rZW5SYW5nZSA9IHBhcnRpdGlvblNTVGFibGVzQnlUb2tlblJhbmdlOwotICAgICAgICBwYXJhbXMgPSBjZnMubWV0YWRhdGEoKS5wYXJhbXMuY29tcGFjdGlvbjsKKworICAgICAgICBjdXJyZW50Qm91bmRhcmllcyA9IGJvdW5kYXJpZXNTdXBwbGllci5nZXQoKTsKKyAgICAgICAgcGFyYW1zID0gc2NoZW1hQ29tcGFjdGlvblBhcmFtcyA9IGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5jb21wYWN0aW9uOwogICAgICAgICBlbmFibGVkID0gcGFyYW1zLmlzRW5hYmxlZCgpOwotICAgICAgICByZWxvYWQoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLmNvbXBhY3Rpb24pOworICAgICAgICBzZXRTdHJhdGVneShzY2hlbWFDb21wYWN0aW9uUGFyYW1zKTsKKyAgICAgICAgc3RhcnR1cCgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMjQzLDggKzI1Miw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHMgLT4gIWNvbXBhY3RpbmcuY29udGFpbnMocykgJiYgIXMuZGVzY3JpcHRvci52ZXJzaW9uLmlzTGF0ZXN0VmVyc2lvbigpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydGVkKChvMSwgbzIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZjEgPSBuZXcgRmlsZShvMS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlIGYyID0gbmV3IEZpbGUobzIuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmMSA9IG8xLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmMiA9IG8yLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExvbmdzLmNvbXBhcmUoZjEubGFzdE1vZGlmaWVkKCksIGYyLmxhc3RNb2RpZmllZCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBwb3RlbnRpYWxVcGdyYWRlKQpAQCAtNDQ5LDE5ICs0NTgsMjAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIG1heWJlUmVsb2FkKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgLyoqCisgICAgICogTWF5YmUgcmVsb2FkIHRoZSBjb21wYWN0aW9uIHN0cmF0ZWdpZXMuIENhbGxlZCBhZnRlciBjaGFuZ2luZyBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG1heWJlUmVsb2FkUGFyYW1zRnJvbVNjaGVtYShDb21wYWN0aW9uUGFyYW1zIHBhcmFtcykKICAgICB7CiAgICAgICAgIC8vIGNvbXBhcmUgdGhlIG9sZCBzY2hlbWEgY29uZmlndXJhdGlvbiB0byB0aGUgbmV3IG9uZSwgaWdub3JlIGFueSBsb2NhbGx5IHNldCBjaGFuZ2VzLgotICAgICAgICBpZiAobWV0YWRhdGEucGFyYW1zLmNvbXBhY3Rpb24uZXF1YWxzKHNjaGVtYUNvbXBhY3Rpb25QYXJhbXMpKQorICAgICAgICBpZiAocGFyYW1zLmVxdWFscyhzY2hlbWFDb21wYWN0aW9uUGFyYW1zKSkKICAgICAgICAgICAgIHJldHVybjsKIAogICAgICAgICB3cml0ZUxvY2subG9jaygpOwogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgLy8gY29tcGFyZSB0aGUgb2xkIHNjaGVtYSBjb25maWd1cmF0aW9uIHRvIHRoZSBuZXcgb25lLCBpZ25vcmUgYW55IGxvY2FsbHkgc2V0IGNoYW5nZXMuCi0gICAgICAgICAgICBpZiAobWV0YWRhdGEucGFyYW1zLmNvbXBhY3Rpb24uZXF1YWxzKHNjaGVtYUNvbXBhY3Rpb25QYXJhbXMpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIHJlbG9hZChtZXRhZGF0YS5wYXJhbXMuY29tcGFjdGlvbik7CisgICAgICAgICAgICBpZiAoIXBhcmFtcy5lcXVhbHMoc2NoZW1hQ29tcGFjdGlvblBhcmFtcykpCisgICAgICAgICAgICAgICAgcmVsb2FkUGFyYW1zRnJvbVNjaGVtYShwYXJhbXMpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkKICAgICAgICAgewpAQCAtNDcwLDE3ICs0ODAsODQgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBAcGFyYW0gbmV3UGFyYW1zIG5ldyBDb21wYWN0aW9uUGFyYW1zIHNldCBpbiB2aWEgQ1FMCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlbG9hZFBhcmFtc0Zyb21TY2hlbWEoQ29tcGFjdGlvblBhcmFtcyBuZXdQYXJhbXMpCisgICAgeworICAgICAgICBsb2dnZXIuZGVidWcoIlJlY3JlYXRpbmcgY29tcGFjdGlvbiBzdHJhdGVneSBmb3Ige30ue30gLSBjb21wYWN0aW9uIHBhcmFtZXRlcnMgY2hhbmdlZCB2aWEgQ1FMIiwKKyAgICAgICAgICAgICAgICAgICAgIGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5nZXRUYWJsZU5hbWUoKSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSXQncyBwb3NzaWJsZSBmb3IgY29tcGFjdGlvbiB0byBiZSBleHBsaWNpdGx5IGVuYWJsZWQvZGlzYWJsZWQKKyAgICAgICAgICogdmlhIEpNWCB3aGVuIGFscmVhZHkgZW5hYmxlZC9kaXNhYmxlZCB2aWEgcGFyYW1zLiBJbiB0aGF0IGNhc2UsCisgICAgICAgICAqIGlmIHdlIG5vdyB0b2dnbGUgZW5hYmxlZC9kaXNhYmxlZCB2aWEgcGFyYW1zLCB3ZSdsbCB0ZWNobmljYWxseQorICAgICAgICAgKiBiZSBvdmVycmlkaW5nIEpNWC1zZXQgdmFsdWUgd2l0aCBwYXJhbXMtc2V0IHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBlbmFibGVkV2l0aEpNWCA9IGVuYWJsZWQgJiYgIXNob3VsZEJlRW5hYmxlZCgpOworICAgICAgICBib29sZWFuIGRpc2FibGVkV2l0aEpNWCA9ICFlbmFibGVkICYmIHNob3VsZEJlRW5hYmxlZCgpOworCisgICAgICAgIHNjaGVtYUNvbXBhY3Rpb25QYXJhbXMgPSBuZXdQYXJhbXM7CisgICAgICAgIHNldFN0cmF0ZWd5KG5ld1BhcmFtcyk7CisKKyAgICAgICAgLy8gZW5hYmxlL2Rpc2FibGUgdmlhIEpNWCBvdmVycmlkZXMgQ1FMIHBhcmFtcywgYnV0IHBsZWFzZSBzZWUgdGhlIGNvbW1lbnQgYWJvdmUKKyAgICAgICAgaWYgKGVuYWJsZWQgJiYgIXNob3VsZEJlRW5hYmxlZCgpICYmICFlbmFibGVkV2l0aEpNWCkKKyAgICAgICAgICAgIGRpc2FibGUoKTsKKyAgICAgICAgZWxzZSBpZiAoIWVuYWJsZWQgJiYgc2hvdWxkQmVFbmFibGVkKCkgJiYgIWRpc2FibGVkV2l0aEpNWCkKKyAgICAgICAgICAgIGVuYWJsZSgpOworCisgICAgICAgIHN0YXJ0dXAoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVSZWxvYWRQYXJhbXNGcm9tSk1YKENvbXBhY3Rpb25QYXJhbXMgcGFyYW1zKQorICAgIHsKKyAgICAgICAgLy8gY29tcGFyZSB0aGUgb2xkIGxvY2FsIGNvbmZpZ3VyYXRpb24gdG8gdGhlIG5ldyBvbmUsIGlnbm9yaW5nIHNjaGVtYQorICAgICAgICBpZiAocGFyYW1zLmVxdWFscyh0aGlzLnBhcmFtcykpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgd3JpdGVMb2NrLmxvY2soKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghcGFyYW1zLmVxdWFscyh0aGlzLnBhcmFtcykpCisgICAgICAgICAgICAgICAgcmVsb2FkUGFyYW1zRnJvbUpNWChwYXJhbXMpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVMb2NrLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIG5ld1BhcmFtcyBuZXcgQ29tcGFjdGlvblBhcmFtcyBzZXQgdmlhIEpNWAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWxvYWRQYXJhbXNGcm9tSk1YKENvbXBhY3Rpb25QYXJhbXMgbmV3UGFyYW1zKQorICAgIHsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJSZWNyZWF0aW5nIGNvbXBhY3Rpb24gc3RyYXRlZ3kgZm9yIHt9Lnt9IC0gY29tcGFjdGlvbiBwYXJhbWV0ZXJzIGNoYW5nZWQgdmlhIEpNWCIsCisgICAgICAgICAgICAgICAgICAgICBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOworCisgICAgICAgIHNldFN0cmF0ZWd5KG5ld1BhcmFtcyk7CisKKyAgICAgICAgLy8gY29tcGFjdGlvbiBwYXJhbXMgc2V0IHZpYSBKTVggb3ZlcnJpZGUgZW5hYmxlL2Rpc2FibGUgdmlhIEpNWAorICAgICAgICBpZiAoZW5hYmxlZCAmJiAhc2hvdWxkQmVFbmFibGVkKCkpCisgICAgICAgICAgICBkaXNhYmxlKCk7CisgICAgICAgIGVsc2UgaWYgKCFlbmFibGVkICYmIHNob3VsZEJlRW5hYmxlZCgpKQorICAgICAgICAgICAgZW5hYmxlKCk7CisKKyAgICAgICAgc3RhcnR1cCgpOworICAgIH0KKworICAgIC8qKgogICAgICAqIENoZWNrcyBpZiB0aGUgZGlzayBib3VuZGFyaWVzIGNoYW5nZWQgYW5kIHJlbG9hZHMgdGhlIGNvbXBhY3Rpb24gc3RyYXRlZ2llcwogICAgICAqIHRvIHJlZmxlY3QgdGhlIG1vc3QgdXAtdG8tZGF0ZSBkaXNrIGJvdW5kYXJpZXMuCi0gICAgICoKKyAgICAgKiA8cD4KICAgICAgKiBUaGlzIGlzIHR5cGljYWxseSBjYWxsZWQgYmVmb3JlIGFjcXVpcmluZyB0aGUge0BsaW5rIHRoaXMjcmVhZExvY2t9IHRvIGVuc3VyZSB0aGUgbW9zdCB1cC10by1kYXRlCiAgICAgICogZGlzayBsb2NhdGlvbnMgYW5kIGJvdW5kYXJpZXMgYXJlIHVzZWQuCi0gICAgICoKKyAgICAgKiA8cD4KICAgICAgKiBUaGlzIHNob3VsZCAqbmV2ZXIqIGJlIGNhbGxlZCBpbnNpZGUgYnkgYSB0aHJlYWQgaG9sZGluZyB0aGUge0BsaW5rIHRoaXMjcmVhZExvY2t9LCBzaW5jZSBpdAogICAgICAqIHdpbGwgcG90ZW50aWFsbHkgYWNxdWlyZSB0aGUge0BsaW5rIHRoaXMjd3JpdGVMb2NrfSB0byB1cGRhdGUgdGhlIGNvbXBhY3Rpb24gc3RyYXRlZ2llcwogICAgICAqIHdoYXQgY2FuIGNhdXNlIGEgZGVhZGxvY2suCisgICAgICogPHA+CisgICAgICogVE9ETzogaW1wcm92ZSB0aGlzIHRvIHJlbG9hZCBhZnRlciByZWNlaXZpbmcgYSBub3RpZmljYXRpb24gcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIHJlbG9hZCBvbiBldmVyeSBvcGVyYXRpb24KICAgICAgKi8KLSAgICAvL1RPRE8gaW1wcm92ZSB0aGlzIHRvIHJlbG9hZCBhZnRlciByZWNlaXZpbmcgYSBub3RpZmljYXRpb24gcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIHJlbG9hZCBvbiBldmVyeSBvcGVyYXRpb24KICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBwcm90ZWN0ZWQgdm9pZCBtYXliZVJlbG9hZERpc2tCb3VuZGFyaWVzKCkKICAgICB7CkBAIC00OTAsOSArNTY3LDggQEAKICAgICAgICAgd3JpdGVMb2NrLmxvY2soKTsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY3VycmVudEJvdW5kYXJpZXMuaXNPdXRPZkRhdGUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICByZWxvYWQocGFyYW1zKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50Qm91bmRhcmllcy5pc091dE9mRGF0ZSgpKQorICAgICAgICAgICAgICAgIHJlbG9hZERpc2tCb3VuZGFyaWVzKGJvdW5kYXJpZXNTdXBwbGllci5nZXQoKSk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQogICAgICAgICB7CkBAIC01MDEsMzQgKzU3NywyMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJlbG9hZCB0aGUgY29tcGFjdGlvbiBzdHJhdGVnaWVzCi0gICAgICoKLSAgICAgKiBDYWxsZWQgYWZ0ZXIgY2hhbmdpbmcgY29uZmlndXJhdGlvbiBhbmQgYXQgc3RhcnR1cC4KLSAgICAgKiBAcGFyYW0gbmV3Q29tcGFjdGlvblBhcmFtcworICAgICAqIEBwYXJhbSBuZXdCb3VuZGFyaWVzIG5ldyBEaXNrQm91bmRhcmllcyAtIHBvdGVudGlhbGx5IGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIGN1cnJlbnQgb25lcwogICAgICAqLwotICAgIHByaXZhdGUgdm9pZCByZWxvYWQoQ29tcGFjdGlvblBhcmFtcyBuZXdDb21wYWN0aW9uUGFyYW1zKQorICAgIHByaXZhdGUgdm9pZCByZWxvYWREaXNrQm91bmRhcmllcyhEaXNrQm91bmRhcmllcyBuZXdCb3VuZGFyaWVzKQogICAgIHsKLSAgICAgICAgYm9vbGVhbiBlbmFibGVkV2l0aEpNWCA9IGVuYWJsZWQgJiYgIXNob3VsZEJlRW5hYmxlZCgpOwotICAgICAgICBib29sZWFuIGRpc2FibGVkV2l0aEpNWCA9ICFlbmFibGVkICYmIHNob3VsZEJlRW5hYmxlZCgpOworICAgICAgICBEaXNrQm91bmRhcmllcyBvbGRCb3VuZGFyaWVzID0gY3VycmVudEJvdW5kYXJpZXM7CisgICAgICAgIGN1cnJlbnRCb3VuZGFyaWVzID0gbmV3Qm91bmRhcmllczsKIAotICAgICAgICBpZiAoY3VycmVudEJvdW5kYXJpZXMgIT0gbnVsbCkKKyAgICAgICAgaWYgKG5ld0JvdW5kYXJpZXMuaXNFcXVpdmFsZW50VG8ob2xkQm91bmRhcmllcykpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghbmV3Q29tcGFjdGlvblBhcmFtcy5lcXVhbHMoc2NoZW1hQ29tcGFjdGlvblBhcmFtcykpCi0gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJSZWNyZWF0aW5nIGNvbXBhY3Rpb24gc3RyYXRlZ3kgLSBjb21wYWN0aW9uIHBhcmFtZXRlcnMgY2hhbmdlZCBmb3Ige30ue30iLCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOwotICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudEJvdW5kYXJpZXMuaXNPdXRPZkRhdGUoKSkKLSAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIlJlY3JlYXRpbmcgY29tcGFjdGlvbiBzdHJhdGVneSAtIGRpc2sgYm91bmRhcmllcyBhcmUgb3V0IG9mIGRhdGUgZm9yIHt9Lnt9LiIsIGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5nZXRUYWJsZU5hbWUoKSk7CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoIk5vdCByZWNyZWF0aW5nIGNvbXBhY3Rpb24gc3RyYXRlZ3kgZm9yIHt9Lnt9IC0gZGlzayBib3VuZGFyaWVzIGFyZSBlcXVpdmFsZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGN1cnJlbnRCb3VuZGFyaWVzID09IG51bGwgfHwgY3VycmVudEJvdW5kYXJpZXMuaXNPdXRPZkRhdGUoKSkKLSAgICAgICAgICAgIGN1cnJlbnRCb3VuZGFyaWVzID0gYm91bmRhcmllc1N1cHBsaWVyLmdldCgpOwotCi0gICAgICAgIHNldFN0cmF0ZWd5KG5ld0NvbXBhY3Rpb25QYXJhbXMpOwotICAgICAgICBzY2hlbWFDb21wYWN0aW9uUGFyYW1zID0gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLmNvbXBhY3Rpb247Ci0KLSAgICAgICAgaWYgKGRpc2FibGVkV2l0aEpNWCB8fCAhc2hvdWxkQmVFbmFibGVkKCkgJiYgIWVuYWJsZWRXaXRoSk1YKQotICAgICAgICAgICAgZGlzYWJsZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBlbmFibGUoKTsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJSZWNyZWF0aW5nIGNvbXBhY3Rpb24gc3RyYXRlZ3kgZm9yIHt9Lnt9IC0gZGlzayBib3VuZGFyaWVzIGFyZSBvdXQgb2YgZGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOworICAgICAgICBzZXRTdHJhdGVneShwYXJhbXMpOwogICAgICAgICBzdGFydHVwKCk7CiAgICAgfQogCkBAIC02MTAsNiArNjc1LDQ0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xldmVsZWRDb21wYWN0aW9uKCkKKyAgICB7CisgICAgICAgIHJlYWRMb2NrLmxvY2soKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByZXBhaXJlZC5maXJzdCgpIGluc3RhbmNlb2YgTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneTsKKyAgICAgICAgfSBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlYWRMb2NrLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGludFtdIGdldFNTVGFibGVDb3VudFBlclRXQ1NCdWNrZXQoKQorICAgIHsKKyAgICAgICAgcmVhZExvY2subG9jaygpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxNYXA8TG9uZywgSW50ZWdlcj4+IGNvdW50c0J5QnVja2V0ID0gU3RyZWFtLmNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1TdXBwb3J0LnN0cmVhbShyZXBhaXJlZC5hbGxTdHJhdGVnaWVzKCkuc3BsaXRlcmF0b3IoKSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVN1cHBvcnQuc3RyZWFtKHVucmVwYWlyZWQuYWxsU3RyYXRlZ2llcygpLnNwbGl0ZXJhdG9yKCksIGZhbHNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kuY2xhc3MpOjppc0luc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChzIC0+ICgoVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSlzKS5nZXRTU1RhYmxlQ291bnRCeUJ1Y2tldHMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICAgICAgcmV0dXJuIGNvdW50c0J5QnVja2V0LmlzRW1wdHkoKSA/IG51bGwgOiBzdW1Db3VudHNCeUJ1Y2tldChjb3VudHNCeUJ1Y2tldCwgVFdDU19CVUNLRVRfQ09VTlRfTUFYKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlYWRMb2NrLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGludFtdIHN1bUNvdW50c0J5QnVja2V0KExpc3Q8TWFwPExvbmcsIEludGVnZXI+PiBjb3VudHNCeUJ1Y2tldCwgaW50IG1heCkKKyAgICB7CisgICAgICAgIFRyZWVNYXA8TG9uZywgSW50ZWdlcj4gbWVyZ2VkID0gbmV3IFRyZWVNYXA8PihDb21wYXJhdG9yLnJldmVyc2VPcmRlcigpKTsKKyAgICAgICAgY291bnRzQnlCdWNrZXQuc3RyZWFtKCkuZmxhdE1hcChlIC0+IGUuZW50cnlTZXQoKS5zdHJlYW0oKSkuZm9yRWFjaChlIC0+IG1lcmdlZC5tZXJnZShlLmdldEtleSgpLCBlLmdldFZhbHVlKCksIEludGVnZXI6OnN1bSkpOworICAgICAgICByZXR1cm4gbWVyZ2VkLnZhbHVlcygpLnN0cmVhbSgpLmxpbWl0KG1heCkubWFwVG9JbnQoaSAtPiBpKS50b0FycmF5KCk7CisgICAgfQorCiAgICAgc3RhdGljIGludFtdIHN1bUFycmF5cyhpbnRbXSBhLCBpbnRbXSBiKQogICAgIHsKICAgICAgICAgaW50W10gcmVzID0gbmV3IGludFtNYXRoLm1heChhLmxlbmd0aCwgYi5sZW5ndGgpXTsKQEAgLTk1Nyw3ICsxMDYwLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBDb21wYWN0aW9uVGFza3MgZ2V0TWF4aW1hbFRhc2tzKGZpbmFsIGludCBnY0JlZm9yZSwgZmluYWwgYm9vbGVhbiBzcGxpdE91dHB1dCkKKyAgICBwdWJsaWMgQ29tcGFjdGlvblRhc2tzIGdldE1heGltYWxUYXNrcyhmaW5hbCBpbnQgZ2NCZWZvcmUsIGZpbmFsIGJvb2xlYW4gc3BsaXRPdXRwdXQsIE9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSkKICAgICB7CiAgICAgICAgIG1heWJlUmVsb2FkRGlza0JvdW5kYXJpZXMoKTsKICAgICAgICAgLy8gcnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQgY2FuY2VscyBhY3RpdmUgY29tcGFjdGlvbnMgYW5kIGRpc2FibGVzIHRoZW0sIHRoZW4gd2UgYXJlIGFibGUKQEAgLTk3MCw3ICsxMDczLDEwIEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZm9yIChBYnN0cmFjdFN0cmF0ZWd5SG9sZGVyIGhvbGRlciA6IGhvbGRlcnMpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0YXNrcy5hZGRBbGwoaG9sZGVyLmdldE1heGltYWxUYXNrcyhnY0JlZm9yZSwgc3BsaXRPdXRwdXQpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChBYnN0cmFjdENvbXBhY3Rpb25UYXNrIHRhc2s6IGhvbGRlci5nZXRNYXhpbWFsVGFza3MoZ2NCZWZvcmUsIHNwbGl0T3V0cHV0KSkgCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tzLmFkZCh0YXNrLnNldENvbXBhY3Rpb25UeXBlKG9wZXJhdGlvblR5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsbHkKQEAgLTk3OCw3ICsxMDg0LDcgQEAKICAgICAgICAgICAgICAgICByZWFkTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBDb21wYWN0aW9uVGFza3MuY3JlYXRlKHRhc2tzKTsKLSAgICAgICAgfSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgfSwgb3BlcmF0aW9uVHlwZSwgZmFsc2UsIGZhbHNlKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEwMjcsNiArMTEzMyw0NiBAQAogICAgICAgICByZXR1cm4gdGFza3M7CiAgICAgfQogCisgICAgcHVibGljIGludCBnZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcyhpbnQgYWRkaXRpb25hbFNTVGFibGVzLCBsb25nIGFkZGl0aW9uYWxCeXRlcywgYm9vbGVhbiBpc0luY3JlbWVudGFsKQorICAgIHsKKyAgICAgICAgaWYgKGFkZGl0aW9uYWxCeXRlcyA9PSAwIHx8IGFkZGl0aW9uYWxTU1RhYmxlcyA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKCk7CisKKyAgICAgICAgbWF5YmVSZWxvYWREaXNrQm91bmRhcmllcygpOworICAgICAgICByZWFkTG9jay5sb2NrKCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdGFza3MgPSBwZW5kaW5nUmVwYWlycy5nZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcygpOworCisgICAgICAgICAgICBJdGVyYWJsZTxBYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneT4gc3RyYXRlZ2llczsKKyAgICAgICAgICAgIGlmIChpc0luY3JlbWVudGFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBpdCBpcyB1bmxpa2VseSB0aGF0IHdlIGFyZSBiZWhpbmQgaW4gdGhlIHBlbmRpbmcgc3RyYXRlZ2llcyAoYXMgdGhleSBvbmx5IGhhdmUgYSBzbWFsbCBmcmFjdGlvbgorICAgICAgICAgICAgICAgIC8vIG9mIHRoZSB0b3RhbCBkYXRhKSwgc28gd2UgYXNzdW1lIGhlcmUgdGhhdCBhbnkgcGVuZGluZyBzc3RhYmxlcyBnbyBkaXJlY3RseSB0byB0aGUgcmVwYWlyZWQgYnVja2V0LgorICAgICAgICAgICAgICAgIHN0cmF0ZWdpZXMgPSByZXBhaXJlZC5hbGxTdHJhdGVnaWVzKCk7CisgICAgICAgICAgICAgICAgdGFza3MgKz0gdW5yZXBhaXJlZC5nZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEhlcmUgd2UgYXNzdW1lIHRoYXQgYWxsIHNzdGFibGVzIGdvIHRvIHVucmVwYWlyZWQsIHdoaWNoIGNhbiBiZSB3cm9uZyBpZiB3ZSBhcmUgcnVubmluZworICAgICAgICAgICAgICAgIC8vIGJvdGggaW5jcmVtZW50YWwgYW5kIGZ1bGwgcmVwYWlycy4KKyAgICAgICAgICAgICAgICBzdHJhdGVnaWVzID0gdW5yZXBhaXJlZC5hbGxTdHJhdGVnaWVzKCk7CisgICAgICAgICAgICAgICAgdGFza3MgKz0gcmVwYWlyZWQuZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHN0cmF0ZWd5Q291bnQgPSBNYXRoLm1heCgxLCBJdGVyYWJsZXMuc2l6ZShzdHJhdGVnaWVzKSk7CisgICAgICAgICAgICBpbnQgc3N0YWJsZXNQZXJTdHJhdGVneSA9IGFkZGl0aW9uYWxTU1RhYmxlcyAvIHN0cmF0ZWd5Q291bnQ7CisgICAgICAgICAgICBsb25nIGJ5dGVzUGVyU3RyYXRlZ3kgPSBhZGRpdGlvbmFsQnl0ZXMgLyBzdHJhdGVneUNvdW50OworICAgICAgICAgICAgZm9yIChBYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneSBzdHJhdGVneSA6IHN0cmF0ZWdpZXMpCisgICAgICAgICAgICAgICAgdGFza3MgKz0gc3RyYXRlZ3kuZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3Moc3N0YWJsZXNQZXJTdHJhdGVneSwgYnl0ZXNQZXJTdHJhdGVneSk7CisgICAgICAgICAgICByZXR1cm4gdGFza3M7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICByZWFkTG9jay51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIHNob3VsZEJlRW5hYmxlZCgpCiAgICAgewogICAgICAgICByZXR1cm4gcGFyYW1zLmlzRW5hYmxlZCgpOwpAQCAtMTA1MywyMyArMTE5OSwxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0TmV3TG9jYWxDb21wYWN0aW9uU3RyYXRlZ3koQ29tcGFjdGlvblBhcmFtcyBwYXJhbXMpCisgICAgcHVibGljIHZvaWQgb3ZlcnJpZGVMb2NhbFBhcmFtcyhDb21wYWN0aW9uUGFyYW1zIHBhcmFtcykKICAgICB7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJTd2l0Y2hpbmcgbG9jYWwgY29tcGFjdGlvbiBzdHJhdGVneSBmcm9tIHt9IHRvIHt9fSIsIHRoaXMucGFyYW1zLCBwYXJhbXMpOwotICAgICAgICB3cml0ZUxvY2subG9jaygpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgc2V0U3RyYXRlZ3kocGFyYW1zKTsKLSAgICAgICAgICAgIGlmIChzaG91bGRCZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBlbmFibGUoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBkaXNhYmxlKCk7Ci0gICAgICAgICAgICBzdGFydHVwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIH0KKyAgICAgICAgbG9nZ2VyLmluZm8oIlN3aXRjaGluZyBsb2NhbCBjb21wYWN0aW9uIHN0cmF0ZWd5IGZyb20ge30gdG8ge30iLCB0aGlzLnBhcmFtcywgcGFyYW1zKTsKKyAgICAgICAgbWF5YmVSZWxvYWRQYXJhbXNGcm9tSk1YKHBhcmFtcyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBpbnQgZ2V0TnVtVG9rZW5QYXJ0aXRpb25zKCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblRhc2suamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblRhc2suamF2YQppbmRleCA1ZmM4MDMxLi5iNjJiYWU1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25UYXNrLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uVGFzay5qYXZhCkBAIC0yMSwxMSArMjEsMTMgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlJhdGVMaW1pdGVyOwpAQCAtNDIsMTEgKzQ0LDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25IaXN0b3J5VGFidWxhckRhdGEuQ09NUEFDVElPTl9UWVBFX1BST1BFUlRZOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXMubm93OwpAQCAtMTMxLDggKzEzNSw5IEBACiAKICAgICAgICAgICAgIGZpbmFsIFNldDxTU1RhYmxlUmVhZGVyPiBmdWxseUV4cGlyZWRTU1RhYmxlcyA9IGNvbnRyb2xsZXIuZ2V0RnVsbHlFeHBpcmVkU1NUYWJsZXMoKTsKIAorICAgICAgICAgICAgVGltZVVVSUQgdGFza0lkID0gdHJhbnNhY3Rpb24ub3BJZCgpOwogICAgICAgICAgICAgLy8gc2VsZWN0IFNTVGFibGVzIHRvIGNvbXBhY3QgYmFzZWQgb24gYXZhaWxhYmxlIGRpc2sgc3BhY2UuCi0gICAgICAgICAgICBpZiAoIWJ1aWxkQ29tcGFjdGlvbkNhbmRpZGF0ZXNGb3JBdmFpbGFibGVEaXNrU3BhY2UoZnVsbHlFeHBpcmVkU1NUYWJsZXMpKQorICAgICAgICAgICAgaWYgKCFidWlsZENvbXBhY3Rpb25DYW5kaWRhdGVzRm9yQXZhaWxhYmxlRGlza1NwYWNlKGZ1bGx5RXhwaXJlZFNTVGFibGVzLCB0YXNrSWQpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIFRoZSBzZXQgb2Ygc3N0YWJsZXMgaGFzIGNoYW5nZWQgKG9uZSBvciBtb3JlIHdlcmUgZXhjbHVkZWQgZHVlIHRvIGxpbWl0ZWQgYXZhaWxhYmxlIGRpc2sgc3BhY2UpLgogICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcmVjb21wdXRlIHRoZSBvdmVybGFwcyBiZXR3ZWVuIHNzdGFibGVzLgpAQCAtMTQ5LDggKzE1NCw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CiAKLSAgICAgICAgICAgIFRpbWVVVUlEIHRhc2tJZCA9IHRyYW5zYWN0aW9uLm9wSWQoKTsKLQogICAgICAgICAgICAgLy8gbmV3IHNzdGFibGVzIGZyb20gZmx1c2ggY2FuIGJlIGFkZGVkIGR1cmluZyBhIGNvbXBhY3Rpb24sIGJ1dCBvbmx5IHRoZSBjb21wYWN0aW9uIGNhbiByZW1vdmUgdGhlbSwKICAgICAgICAgICAgIC8vIHNvIGluIG91ciBzaW5nbGUtdGhyZWFkZWQgY29tcGFjdGlvbiB3b3JsZCB0aGlzIGlzIGEgdmFsaWQgd2F5IG9mIGRldGVybWluaW5nIGlmIHdlJ3JlIGNvbXBhY3RpbmcKICAgICAgICAgICAgIC8vIGFsbCB0aGUgc3N0YWJsZXMgKHRoYXQgZXhpc3RlZCB3aGVuIHdlIHN0YXJ0ZWQpCkBAIC0yMDUsNiArMjA4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cml0ZXIuYXBwZW5kKGNpLm5leHQoKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxLZXlzV3JpdHRlbisrOwogCisgICAgICAgICAgICAgICAgICAgICAgICBjaS5zZXRUYXJnZXREaXJlY3Rvcnkod3JpdGVyLmdldFNTdGFibGVEaXJlY3RvcnkoKS5wYXRoKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBieXRlc1NjYW5uZWQgPSBzY2FubmVycy5nZXRUb3RhbEJ5dGVzU2Nhbm5lZCgpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYXRlIGxpbWl0IHRoZSBzY2FubmVycywgYW5kIGFjY291bnQgZm9yIGNvbXByZXNzaW9uCkBAIC0yNDMsMTIgKzI0NywxMyBAQAogCiAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIG5ld1NTVGFibGVOYW1lcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgcmVhZGVyIDogbmV3U1N0YWJsZXMpCi0gICAgICAgICAgICAgICAgbmV3U1NUYWJsZU5hbWVzLmFwcGVuZChyZWFkZXIuZGVzY3JpcHRvci5iYXNlRmlsZW5hbWUoKSkuYXBwZW5kKCIsIik7CisgICAgICAgICAgICAgICAgbmV3U1NUYWJsZU5hbWVzLmFwcGVuZChyZWFkZXIuZGVzY3JpcHRvci5iYXNlRmlsZSgpKS5hcHBlbmQoIiwiKTsKICAgICAgICAgICAgIGxvbmcgdG90YWxTb3VyY2VSb3dzID0gMDsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVyZ2VkUm93Q291bnRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgICAgICAgIHRvdGFsU291cmNlUm93cyArPSBtZXJnZWRSb3dDb3VudHNbaV0gKiAoaSArIDEpOwogCi0gICAgICAgICAgICBTdHJpbmcgbWVyZ2VTdW1tYXJ5ID0gdXBkYXRlQ29tcGFjdGlvbkhpc3RvcnkoY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpLCBtZXJnZWRSb3dDb3VudHMsIHN0YXJ0c2l6ZSwgZW5kc2l6ZSk7CisgICAgICAgICAgICBTdHJpbmcgbWVyZ2VTdW1tYXJ5ID0gdXBkYXRlQ29tcGFjdGlvbkhpc3RvcnkoY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpLCBtZXJnZWRSb3dDb3VudHMsIHN0YXJ0c2l6ZSwgZW5kc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVNYXAub2YoQ09NUEFDVElPTl9UWVBFX1BST1BFUlRZLCBjb21wYWN0aW9uVHlwZS50eXBlKSk7CiAKICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFN0cmluZy5mb3JtYXQoIkNvbXBhY3RlZCAoJXMpICVkIHNzdGFibGVzIHRvIFslc10gdG8gbGV2ZWw9JWQuICAlcyB0byAlcyAofiVkJSUgb2Ygb3JpZ2luYWwpIGluICUsZG1zLiAgUmVhZCBUaHJvdWdocHV0ID0gJXMsIFdyaXRlIFRocm91Z2hwdXQgPSAlcywgUm93IFRocm91Z2hwdXQgPSB+JSxkL3MuICAlLGQgdG90YWwgcGFydGl0aW9ucyBtZXJnZWQgdG8gJSxkLiAgUGFydGl0aW9uIG1lcmdlIGNvdW50cyB3ZXJlIHslc30uIFRpbWUgc3BlbnQgd3JpdGluZyBrZXlzID0gJSxkbXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFza0lkLApAQCAtMjg3LDcgKzI5Miw3IEBACiAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdENvbXBhY3Rpb25Xcml0ZXIoY2ZzLCBkaXJlY3RvcmllcywgdHJhbnNhY3Rpb24sIG5vbkV4cGlyZWRTU1RhYmxlcywga2VlcE9yaWdpbmFscywgZ2V0TGV2ZWwoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRlQ29tcGFjdGlvbkhpc3RvcnkoU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nIGNvbHVtbkZhbWlseU5hbWUsIGxvbmdbXSBtZXJnZWRSb3dDb3VudHMsIGxvbmcgc3RhcnRTaXplLCBsb25nIGVuZFNpemUpCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdXBkYXRlQ29tcGFjdGlvbkhpc3RvcnkoU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nIGNvbHVtbkZhbWlseU5hbWUsIGxvbmdbXSBtZXJnZWRSb3dDb3VudHMsIGxvbmcgc3RhcnRTaXplLCBsb25nIGVuZFNpemUsIE1hcDxTdHJpbmcsIFN0cmluZz4gY29tcGFjdGlvblByb3BlcnRpZXMpCiAgICAgewogICAgICAgICBTdHJpbmdCdWlsZGVyIG1lcmdlU3VtbWFyeSA9IG5ldyBTdHJpbmdCdWlsZGVyKG1lcmdlZFJvd0NvdW50cy5sZW5ndGggKiAxMCk7CiAgICAgICAgIE1hcDxJbnRlZ2VyLCBMb25nPiBtZXJnZWRSb3dzID0gbmV3IEhhc2hNYXA8PigpOwpAQCAtMzAxLDcgKzMwNiw3IEBACiAgICAgICAgICAgICBtZXJnZVN1bW1hcnkuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiVkOiVkLCAiLCByb3dzLCBjb3VudCkpOwogICAgICAgICAgICAgbWVyZ2VkUm93cy5wdXQocm93cywgY291bnQpOwogICAgICAgICB9Ci0gICAgICAgIFN5c3RlbUtleXNwYWNlLnVwZGF0ZUNvbXBhY3Rpb25IaXN0b3J5KGtleXNwYWNlTmFtZSwgY29sdW1uRmFtaWx5TmFtZSwgY3VycmVudFRpbWVNaWxsaXMoKSwgc3RhcnRTaXplLCBlbmRTaXplLCBtZXJnZWRSb3dzKTsKKyAgICAgICAgU3lzdGVtS2V5c3BhY2UudXBkYXRlQ29tcGFjdGlvbkhpc3Rvcnkoa2V5c3BhY2VOYW1lLCBjb2x1bW5GYW1pbHlOYW1lLCBjdXJyZW50VGltZU1pbGxpcygpLCBzdGFydFNpemUsIGVuZFNpemUsIG1lcmdlZFJvd3MsIGNvbXBhY3Rpb25Qcm9wZXJ0aWVzKTsKICAgICAgICAgcmV0dXJuIG1lcmdlU3VtbWFyeS50b1N0cmluZygpOwogICAgIH0KIApAQCAtMzU2LDEyICszNjEsMTEgQEAKIAogICAgIC8qCiAgICAgICogQ2hlY2tzIGlmIHdlIGhhdmUgZW5vdWdoIGRpc2sgc3BhY2UgdG8gZXhlY3V0ZSB0aGUgY29tcGFjdGlvbi4gIERyb3BzIHRoZSBsYXJnZXN0IHNzdGFibGUgb3V0IG9mIHRoZSBUYXNrIHVudGlsCi0gICAgICogdGhlcmUncyBlbm91Z2ggc3BhY2UgKGluIHRoZW9yeSkgdG8gaGFuZGxlIHRoZSBjb21wYWN0aW9uLiAgRG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgc3BhY2UgdGhhdCB3aWxsIGJlIHRha2VuIGJ5Ci0gICAgICogb3RoZXIgY29tcGFjdGlvbnMuCisgICAgICogdGhlcmUncyBlbm91Z2ggc3BhY2UgKGluIHRoZW9yeSkgdG8gaGFuZGxlIHRoZSBjb21wYWN0aW9uLgogICAgICAqCiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGVub3VnaCBkaXNrIHNwYWNlIHRvIGV4ZWN1dGUgdGhlIGNvbXBsZXRlIGNvbXBhY3Rpb24sIGZhbHNlIGlmIHNvbWUgc3N0YWJsZXMgYXJlIGV4Y2x1ZGVkLgogICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGJ1aWxkQ29tcGFjdGlvbkNhbmRpZGF0ZXNGb3JBdmFpbGFibGVEaXNrU3BhY2UoZmluYWwgU2V0PFNTVGFibGVSZWFkZXI+IGZ1bGx5RXhwaXJlZFNTVGFibGVzKQorICAgIHByb3RlY3RlZCBib29sZWFuIGJ1aWxkQ29tcGFjdGlvbkNhbmRpZGF0ZXNGb3JBdmFpbGFibGVEaXNrU3BhY2UoZmluYWwgU2V0PFNTVGFibGVSZWFkZXI+IGZ1bGx5RXhwaXJlZFNTVGFibGVzLCBUaW1lVVVJRCB0YXNrSWQpCiAgICAgewogICAgICAgICBpZighY2ZzLmlzQ29tcGFjdGlvbkRpc2tTcGFjZUNoZWNrRW5hYmxlZCgpICYmIGNvbXBhY3Rpb25UeXBlID09IE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTikKICAgICAgICAgewpAQCAtMzc2LDEzICszODAsMjkgQEAKICAgICAgICAgd2hpbGUoIW5vbkV4cGlyZWRTU1RhYmxlcy5pc0VtcHR5KCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXIgd3JpdGUgc2l6ZSBvZiBub24gZXhwaXJlZCBTU1RhYmxlcwotICAgICAgICAgICAgbG9uZyBleHBlY3RlZFdyaXRlU2l6ZSA9IGNmcy5nZXRFeHBlY3RlZENvbXBhY3RlZEZpbGVTaXplKG5vbkV4cGlyZWRTU1RhYmxlcywgY29tcGFjdGlvblR5cGUpOwotICAgICAgICAgICAgbG9uZyBlc3RpbWF0ZWRTU1RhYmxlcyA9IE1hdGgubWF4KDEsIGV4cGVjdGVkV3JpdGVTaXplIC8gc3RyYXRlZ3kuZ2V0TWF4U1NUYWJsZUJ5dGVzKCkpOworICAgICAgICAgICAgbG9uZyB3cml0ZVNpemU7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZVNpemUgPSBjZnMuZ2V0RXhwZWN0ZWRDb21wYWN0ZWRGaWxlU2l6ZShub25FeHBpcmVkU1NUYWJsZXMsIGNvbXBhY3Rpb25UeXBlKTsKKyAgICAgICAgICAgICAgICBNYXA8RmlsZSwgTG9uZz4gZXhwZWN0ZWROZXdXcml0ZVNpemUgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICAgICAgTGlzdDxGaWxlPiBuZXdDb21wYWN0aW9uRGF0YWRpcnMgPSBjZnMuZ2V0RGlyZWN0b3JpZXNGb3JGaWxlcyhub25FeHBpcmVkU1NUYWJsZXMpOworICAgICAgICAgICAgICAgIGxvbmcgd3JpdGVTaXplUGVyT3V0cHV0RGF0YWRpciA9IHdyaXRlU2l6ZSAvIE1hdGgubWF4KG5ld0NvbXBhY3Rpb25EYXRhZGlycy5zaXplKCksIDEpOworICAgICAgICAgICAgICAgIGZvciAoRmlsZSBkaXJlY3RvcnkgOiBuZXdDb21wYWN0aW9uRGF0YWRpcnMpCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkTmV3V3JpdGVTaXplLnB1dChkaXJlY3RvcnksIHdyaXRlU2l6ZVBlck91dHB1dERhdGFkaXIpOwogCi0gICAgICAgICAgICBpZihjZnMuZ2V0RGlyZWN0b3JpZXMoKS5oYXNBdmFpbGFibGVEaXNrU3BhY2UoZXN0aW1hdGVkU1NUYWJsZXMsIGV4cGVjdGVkV3JpdGVTaXplKSkKKyAgICAgICAgICAgICAgICBNYXA8RmlsZSwgTG9uZz4gZXhwZWN0ZWRXcml0ZVNpemUgPSBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZXN0aW1hdGVkUmVtYWluaW5nV3JpdGVCeXRlcygpOworCisgICAgICAgICAgICAgICAgLy8gdG9kbzogYWJvcnQgc3RyZWFtcyBpZiB0aGV5IGJsb2NrIGNvbXBhY3Rpb25zCisgICAgICAgICAgICAgICAgaWYgKGNmcy5nZXREaXJlY3RvcmllcygpLmhhc0Rpc2tTcGFjZUZvckNvbXBhY3Rpb25zQW5kU3RyZWFtcyhleHBlY3RlZE5ld1dyaXRlU2l6ZSwgZXhwZWN0ZWRXcml0ZVNpemUpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkNvdWxkIG5vdCBjaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggZGlzayBzcGFjZSBmb3IgY29tcGFjdGlvbiB7fSIsIHRhc2tJZCwgZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICghcmVkdWNlU2NvcGVGb3JMaW1pdGVkU3BhY2Uobm9uRXhwaXJlZFNTVGFibGVzLCBleHBlY3RlZFdyaXRlU2l6ZSkpCisgICAgICAgICAgICBpZiAoIXJlZHVjZVNjb3BlRm9yTGltaXRlZFNwYWNlKG5vbkV4cGlyZWRTU1RhYmxlcywgd3JpdGVTaXplKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyB3ZSBlbmQgdXAgaGVyZSBpZiB3ZSBjYW4ndCB0YWtlIGFueSBtb3JlIHNzdGFibGVzIG91dCBvZiB0aGUgY29tcGFjdGlvbi4KICAgICAgICAgICAgICAgICAvLyB1c3VhbGx5IG1lYW5zIHdlJ3ZlIHJ1biBvdXQgb2YgZGlzayBzcGFjZQpAQCAtMzk1LDE1ICs0MTUsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIk5vdCBlbm91Z2ggc3BhY2UgZm9yIGNvbXBhY3Rpb24sIGVzdGltYXRlZCBzc3RhYmxlcyA9ICVkLCBleHBlY3RlZCB3cml0ZSBzaXplID0gJWQiLCBlc3RpbWF0ZWRTU1RhYmxlcywgZXhwZWN0ZWRXcml0ZVNpemUpOworICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCJOb3QgZW5vdWdoIHNwYWNlIGZvciBjb21wYWN0aW9uICglcykgb2YgJXMuJXMsIGVzdGltYXRlZCBzc3RhYmxlcyA9ICVkLCBleHBlY3RlZCB3cml0ZSBzaXplID0gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KDEsIHdyaXRlU2l6ZSAvIHN0cmF0ZWd5LmdldE1heFNTVGFibGVCeXRlcygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVNpemUpOwogICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKG1zZyk7CiAgICAgICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuaW5jcmVtZW50QWJvcnRlZCgpOwogICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNzdGFibGVzUmVtb3ZlZCsrOwotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIk5vdCBlbm91Z2ggc3BhY2UgZm9yIGNvbXBhY3Rpb24sIHt9TWlCIGVzdGltYXRlZC4gIFJlZHVjaW5nIHNjb3BlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIGV4cGVjdGVkV3JpdGVTaXplIC8gMTAyNCAvIDEwMjQpOworICAgICAgICAgICAgbG9nZ2VyLndhcm4oIk5vdCBlbm91Z2ggc3BhY2UgZm9yIGNvbXBhY3Rpb24ge30sIHt9TWlCIGVzdGltYXRlZC4gUmVkdWNpbmcgc2NvcGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tJZCwgKGZsb2F0KSB3cml0ZVNpemUgLyAxMDI0IC8gMTAyNCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZihzc3RhYmxlc1JlbW92ZWQgPiAwKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9EYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0RhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxOGJmOS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0RhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lio7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5Kc29uTm9kZTsKLWltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5Kc29uTm9kZUZhY3Rvcnk7Ci1pbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuT2JqZWN0Tm9kZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlNTVGFibGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXBhY3Rpb25QYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKLQotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5maWx0ZXI7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2Yge0BsaW5rIFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3l9Ci0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5Ci17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kuY2xhc3MpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucyBvcHRpb25zOwotICAgIHByb3RlY3RlZCB2b2xhdGlsZSBpbnQgZXN0aW1hdGVkUmVtYWluaW5nVGFza3M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgcHJpdmF0ZSBsb25nIGxhc3RFeHBpcmVkQ2hlY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucyBzdGNzT3B0aW9uczsKLQotICAgIHB1YmxpYyBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5KENvbHVtbkZhbWlseVN0b3JlIGNmcywgTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zKQotICAgIHsKLSAgICAgICAgc3VwZXIoY2ZzLCBvcHRpb25zKTsKLSAgICAgICAgdGhpcy5lc3RpbWF0ZWRSZW1haW5pbmdUYXNrcyA9IDA7Ci0gICAgICAgIHRoaXMub3B0aW9ucyA9IG5ldyBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgaWYgKCFvcHRpb25zLmNvbnRhaW5zS2V5KEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5LlRPTUJTVE9ORV9DT01QQUNUSU9OX0lOVEVSVkFMX09QVElPTikgJiYgIW9wdGlvbnMuY29udGFpbnNLZXkoQWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3kuVE9NQlNUT05FX1RIUkVTSE9MRF9PUFRJT04pKQotICAgICAgICB7Ci0gICAgICAgICAgICBkaXNhYmxlVG9tYnN0b25lQ29tcGFjdGlvbnMgPSB0cnVlOwotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJEaXNhYmxpbmcgdG9tYnN0b25lIGNvbXBhY3Rpb25zIGZvciBEVENTIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJFbmFibGluZyB0b21ic3RvbmUgY29tcGFjdGlvbnMgZm9yIERUQ1MiKTsKLQotICAgICAgICB0aGlzLnN0Y3NPcHRpb25zID0gbmV3IFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zKG9wdGlvbnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgcHVibGljIEFic3RyYWN0Q29tcGFjdGlvblRhc2sgZ2V0TmV4dEJhY2tncm91bmRUYXNrKGludCBnY0JlZm9yZSkKLSAgICB7Ci0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gcHJldmlvdXNDYW5kaWRhdGUgPSBudWxsOwotICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBsYXRlc3RCdWNrZXQgPSBnZXROZXh0QmFja2dyb3VuZFNTVGFibGVzKGdjQmVmb3JlKTsKLQotICAgICAgICAgICAgaWYgKGxhdGVzdEJ1Y2tldC5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIC8vIEFscmVhZHkgdHJpZWQgYWNxdWlyaW5nIHJlZmVyZW5jZXMgd2l0aG91dCBzdWNjZXNzLiBJdCBtZWFucyB0aGVyZSBpcyBhIHJhY2Ugd2l0aAotICAgICAgICAgICAgLy8gdGhlIHRyYWNrZXIgYnV0IGNhbmRpZGF0ZSBTU1RhYmxlcyB3ZXJlIG5vdCB5ZXQgcmVwbGFjZWQgaW4gdGhlIGNvbXBhY3Rpb24gc3RyYXRlZ3kgbWFuYWdlcgotICAgICAgICAgICAgaWYgKGxhdGVzdEJ1Y2tldC5lcXVhbHMocHJldmlvdXNDYW5kaWRhdGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJDb3VsZCBub3QgYWNxdWlyZSByZWZlcmVuY2VzIGZvciBjb21wYWN0aW5nIFNTVGFibGVzIHt9IHdoaWNoIGlzIG5vdCBhIHByb2JsZW0gcGVyIHNlLCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmxlc3MgaXQgaGFwcGVucyBmcmVxdWVudGx5LCBpbiB3aGljaCBjYXNlIGl0IG11c3QgYmUgcmVwb3J0ZWQuIFdpbGwgcmV0cnkgbGF0ZXIuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RCdWNrZXQpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbiBtb2RpZmllciA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KGxhdGVzdEJ1Y2tldCwgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OKTsKLSAgICAgICAgICAgIGlmIChtb2RpZmllciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvblRhc2soY2ZzLCBtb2RpZmllciwgZ2NCZWZvcmUpOwotICAgICAgICAgICAgcHJldmlvdXNDYW5kaWRhdGUgPSBsYXRlc3RCdWNrZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBnY0JlZm9yZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN5bmNocm9uaXplZCBMaXN0PFNTVGFibGVSZWFkZXI+IGdldE5leHRCYWNrZ3JvdW5kU1NUYWJsZXMoZmluYWwgaW50IGdjQmVmb3JlKQotICAgIHsKLSAgICAgICAgU2V0PFNTVGFibGVSZWFkZXI+IHVuY29tcGFjdGluZzsKLSAgICAgICAgc3luY2hyb25pemVkIChzc3RhYmxlcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNzdGFibGVzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0KLSAgICAgICAgICAgIHVuY29tcGFjdGluZyA9IEltbXV0YWJsZVNldC5jb3B5T2YoZmlsdGVyKGNmcy5nZXRVbmNvbXBhY3RpbmdTU1RhYmxlcygpLCBzc3RhYmxlczo6Y29udGFpbnMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBleHBpcmVkID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKLSAgICAgICAgLy8gd2Ugb25seSBjaGVjayBmb3IgZXhwaXJlZCBzc3RhYmxlcyBldmVyeSAxMCBtaW51dGVzIChieSBkZWZhdWx0KSBkdWUgdG8gaXQgYmVpbmcgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbgotICAgICAgICBpZiAoY3VycmVudFRpbWVNaWxsaXMoKSAtIGxhc3RFeHBpcmVkQ2hlY2sgPiBvcHRpb25zLmV4cGlyZWRTU1RhYmxlQ2hlY2tGcmVxdWVuY3kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEZpbmQgZnVsbHkgZXhwaXJlZCBTU1RhYmxlcy4gVGhvc2Ugd2lsbCBiZSBpbmNsdWRlZCBubyBtYXR0ZXIgd2hhdC4KLSAgICAgICAgICAgIGV4cGlyZWQgPSBDb21wYWN0aW9uQ29udHJvbGxlci5nZXRGdWxseUV4cGlyZWRTU1RhYmxlcyhjZnMsIHVuY29tcGFjdGluZywgY2ZzLmdldE92ZXJsYXBwaW5nTGl2ZVNTVGFibGVzKHVuY29tcGFjdGluZyksIGdjQmVmb3JlKTsKLSAgICAgICAgICAgIGxhc3RFeHBpcmVkQ2hlY2sgPSBjdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICB9Ci0gICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBjYW5kaWRhdGVzID0gU2V0cy5uZXdIYXNoU2V0KGZpbHRlclN1c3BlY3RTU1RhYmxlcyh1bmNvbXBhY3RpbmcpKTsKLQotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IGNvbXBhY3Rpb25DYW5kaWRhdGVzID0gbmV3IEFycmF5TGlzdDw+KGdldE5leHROb25FeHBpcmVkU1NUYWJsZXMoU2V0cy5kaWZmZXJlbmNlKGNhbmRpZGF0ZXMsIGV4cGlyZWQpLCBnY0JlZm9yZSkpOwotICAgICAgICBpZiAoIWV4cGlyZWQuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoIkluY2x1ZGluZyBleHBpcmVkIHNzdGFibGVzOiB7fSIsIGV4cGlyZWQpOwotICAgICAgICAgICAgY29tcGFjdGlvbkNhbmRpZGF0ZXMuYWRkQWxsKGV4cGlyZWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21wYWN0aW9uQ2FuZGlkYXRlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8U1NUYWJsZVJlYWRlcj4gZ2V0TmV4dE5vbkV4cGlyZWRTU1RhYmxlcyhJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiBub25FeHBpcmluZ1NTVGFibGVzLCBmaW5hbCBpbnQgZ2NCZWZvcmUpCi0gICAgewotICAgICAgICBpbnQgYmFzZSA9IGNmcy5nZXRNaW5pbXVtQ29tcGFjdGlvblRocmVzaG9sZCgpOwotICAgICAgICBsb25nIG5vdyA9IGdldE5vdygpOwotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IG1vc3RJbnRlcmVzdGluZyA9IGdldENvbXBhY3Rpb25DYW5kaWRhdGVzKG5vbkV4cGlyaW5nU1NUYWJsZXMsIG5vdywgYmFzZSk7Ci0gICAgICAgIGlmIChtb3N0SW50ZXJlc3RpbmcgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1vc3RJbnRlcmVzdGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIHNzdGFibGUgdG8gY29tcGFjdCBpbiBzdGFuZGFyZCB3YXksIHRyeSBjb21wYWN0aW5nIHNpbmdsZSBzc3RhYmxlIHdob3NlIGRyb3BwYWJsZSB0b21ic3RvbmUKLSAgICAgICAgLy8gcmF0aW8gaXMgZ3JlYXRlciB0aGFuIHRocmVzaG9sZC4KLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlc1dpdGhUb21ic3RvbmVzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogbm9uRXhwaXJpbmdTU1RhYmxlcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHdvcnRoRHJvcHBpbmdUb21ic3RvbmVzKHNzdGFibGUsIGdjQmVmb3JlKSkKLSAgICAgICAgICAgICAgICBzc3RhYmxlc1dpdGhUb21ic3RvbmVzLmFkZChzc3RhYmxlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3N0YWJsZXNXaXRoVG9tYnN0b25lcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoQ29sbGVjdGlvbnMubWluKHNzdGFibGVzV2l0aFRvbWJzdG9uZXMsIFNTVGFibGVSZWFkZXIuc2l6ZUNvbXBhcmF0b3IpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8U1NUYWJsZVJlYWRlcj4gZ2V0Q29tcGFjdGlvbkNhbmRpZGF0ZXMoSXRlcmFibGU8U1NUYWJsZVJlYWRlcj4gY2FuZGlkYXRlU1NUYWJsZXMsIGxvbmcgbm93LCBpbnQgYmFzZSkKLSAgICB7Ci0gICAgICAgIEl0ZXJhYmxlPFNTVGFibGVSZWFkZXI+IGNhbmRpZGF0ZXMgPSBmaWx0ZXJPbGRTU1RhYmxlcyhMaXN0cy5uZXdBcnJheUxpc3QoY2FuZGlkYXRlU1NUYWJsZXMpLCBvcHRpb25zLm1heFNTVGFibGVBZ2UsIG5vdyk7Ci0KLSAgICAgICAgTGlzdDxMaXN0PFNTVGFibGVSZWFkZXI+PiBidWNrZXRzID0gZ2V0QnVja2V0cyhjcmVhdGVTU1RhYmxlQW5kTWluVGltZXN0YW1wUGFpcnMoY2FuZGlkYXRlcyksIG9wdGlvbnMuYmFzZVRpbWUsIGJhc2UsIG5vdywgb3B0aW9ucy5tYXhXaW5kb3dTaXplKTsKLSAgICAgICAgbG9nZ2VyLmRlYnVnKCJDb21wYWN0aW9uIGJ1Y2tldHMgYXJlIHt9IiwgYnVja2V0cyk7Ci0gICAgICAgIHVwZGF0ZUVzdGltYXRlZENvbXBhY3Rpb25zQnlUYXNrcyhidWNrZXRzKTsKLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBtb3N0SW50ZXJlc3RpbmcgPSBuZXdlc3RCdWNrZXQoYnVja2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmdldE1pbmltdW1Db21wYWN0aW9uVGhyZXNob2xkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5nZXRNYXhpbXVtQ29tcGFjdGlvblRocmVzaG9sZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuYmFzZVRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubWF4V2luZG93U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rjc09wdGlvbnMpOwotICAgICAgICBpZiAoIW1vc3RJbnRlcmVzdGluZy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gbW9zdEludGVyZXN0aW5nOwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0aW1lc3RhbXAgdGhhdCBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5IGNvbnNpZGVycyB0byBiZSB0aGUgImN1cnJlbnQgdGltZSIuCi0gICAgICogQHJldHVybiB0aGUgbWF4aW11bSB0aW1lc3RhbXAgYWNyb3NzIGFsbCBTU1RhYmxlcy4KLSAgICAgKiBAdGhyb3dzIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBubyBTU1RhYmxlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGxvbmcgZ2V0Tm93KCkKLSAgICB7Ci0gICAgICAgIC8vIG5vIG5lZWQgdG8gY29udmVydCB0byBjb2xsZWN0aW9uIGlmIGhhZCBhbiBJdGVyYWJsZXMubWF4KCksIGJ1dCBub3QgcHJlc2VudCBpbiBzdGFuZGFyZCB0b29sa2l0LCBhbmQgbm90IHdvcnRoIGFkZGluZwotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgSXRlcmFibGVzLmFkZEFsbChsaXN0LCBjZnMuZ2V0U1NUYWJsZXMoU1NUYWJsZVNldC5MSVZFKSk7Ci0gICAgICAgIGlmIChsaXN0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMubWF4KGxpc3QsIChvMSwgbzIpIC0+IExvbmcuY29tcGFyZShvMS5nZXRNYXhUaW1lc3RhbXAoKSwgbzIuZ2V0TWF4VGltZXN0YW1wKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWF4VGltZXN0YW1wKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgc3N0YWJsZXMgd2l0aCBtYXggdGltZXN0YW1wIG9sZGVyIHRoYW4gbWF4U1NUYWJsZUFnZS4KLSAgICAgKiBAcGFyYW0gc3N0YWJsZXMgYWxsIHNzdGFibGVzIHRvIGNvbnNpZGVyCi0gICAgICogQHBhcmFtIG1heFNTVGFibGVBZ2UgdGhlIGFnZSBpbiBtaWxsaXNlY29uZHMgd2hlbiBhbiBTU1RhYmxlIHN0b3BzIHBhcnRpY2lwYXRpbmcgaW4gY29tcGFjdGlvbnMKLSAgICAgKiBAcGFyYW0gbm93IGN1cnJlbnQgdGltZS4gU1NUYWJsZXMgd2l0aCBtYXggdGltZXN0YW1wIGxlc3MgdGhhbiAobm93IC0gbWF4U1NUYWJsZUFnZSkgYXJlIGZpbHRlcmVkLgotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHNzdGFibGVzIHdpdGggdGhlIG9sZGVzdCBzc3RhYmxlcyBleGNsdWRlZAotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiBmaWx0ZXJPbGRTU1RhYmxlcyhMaXN0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzLCBsb25nIG1heFNTVGFibGVBZ2UsIGxvbmcgbm93KQotICAgIHsKLSAgICAgICAgaWYgKG1heFNTVGFibGVBZ2UgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBzc3RhYmxlczsKLSAgICAgICAgZmluYWwgbG9uZyBjdXRvZmYgPSBub3cgLSBtYXhTU1RhYmxlQWdlOwotICAgICAgICByZXR1cm4gZmlsdGVyKHNzdGFibGVzLCBuZXcgUHJlZGljYXRlPFNTVGFibGVSZWFkZXI+KCkKLSAgICAgICAgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcHBseShTU1RhYmxlUmVhZGVyIHNzdGFibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNzdGFibGUuZ2V0TWF4VGltZXN0YW1wKCkgPj0gY3V0b2ZmOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8UGFpcjxTU1RhYmxlUmVhZGVyLCBMb25nPj4gY3JlYXRlU1NUYWJsZUFuZE1pblRpbWVzdGFtcFBhaXJzKEl0ZXJhYmxlPFNTVGFibGVSZWFkZXI+IHNzdGFibGVzKQotICAgIHsKLSAgICAgICAgTGlzdDxQYWlyPFNTVGFibGVSZWFkZXIsIExvbmc+PiBzc3RhYmxlTWluVGltZXN0YW1wUGFpcnMgPSBMaXN0cy5uZXdBcnJheUxpc3RXaXRoQ2FwYWNpdHkoSXRlcmFibGVzLnNpemUoc3N0YWJsZXMpKTsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIHNzdGFibGVNaW5UaW1lc3RhbXBQYWlycy5hZGQoUGFpci5jcmVhdGUoc3N0YWJsZSwgc3N0YWJsZS5nZXRNaW5UaW1lc3RhbXAoKSkpOwotICAgICAgICByZXR1cm4gc3N0YWJsZU1pblRpbWVzdGFtcFBhaXJzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRTU1RhYmxlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkKLSAgICB7Ci0gICAgICAgIHNzdGFibGVzLmFkZChzc3RhYmxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlU1NUYWJsZShTU1RhYmxlUmVhZGVyIHNzdGFibGUpCi0gICAgewotICAgICAgICBzc3RhYmxlcy5yZW1vdmUoc3N0YWJsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBTZXQ8U1NUYWJsZVJlYWRlcj4gZ2V0U1NUYWJsZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2Yoc3N0YWJsZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgdGFyZ2V0IHRpbWUgc3BhbiB1c2VkIGZvciBidWNrZXRpbmcgU1NUYWJsZXMgYmFzZWQgb24gdGltZXN0YW1wcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUYXJnZXQKLSAgICB7Ci0gICAgICAgIC8vIEhvdyBiaWcgYSByYW5nZSBvZiB0aW1lc3RhbXBzIGZpdCBpbnNpZGUgdGhlIHRhcmdldC4KLSAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgc2l6ZTsKLSAgICAgICAgLy8gQSB0aW1lc3RhbXAgdCBoaXRzIHRoZSB0YXJnZXQgaWZmIHQgLyBzaXplID09IGRpdlBvc2l0aW9uLgotICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBkaXZQb3NpdGlvbjsKLQotICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBtYXhXaW5kb3dTaXplOwotCi0gICAgICAgIHB1YmxpYyBUYXJnZXQobG9uZyBzaXplLCBsb25nIGRpdlBvc2l0aW9uLCBsb25nIG1heFdpbmRvd1NpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICB0aGlzLmRpdlBvc2l0aW9uID0gZGl2UG9zaXRpb247Ci0gICAgICAgICAgICB0aGlzLm1heFdpbmRvd1NpemUgPSBtYXhXaW5kb3dTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbXBhcmVzIHRoZSB0YXJnZXQgdG8gYSB0aW1lc3RhbXAuCi0gICAgICAgICAqIEBwYXJhbSB0aW1lc3RhbXAgdGhlIHRpbWVzdGFtcCB0byBjb21wYXJlLgotICAgICAgICAgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoZSB0YXJnZXQgbGllcyBiZWZvcmUsIGNvdmVyaW5nLCBvciBhZnRlciB0aGFuIHRoZSB0aW1lc3RhbXAuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUb1RpbWVzdGFtcChsb25nIHRpbWVzdGFtcCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIExvbmcuY29tcGFyZShkaXZQb3NpdGlvbiwgdGltZXN0YW1wIC8gc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGVsbHMgaWYgdGhlIHRpbWVzdGFtcCBoaXRzIHRoZSB0YXJnZXQuCi0gICAgICAgICAqIEBwYXJhbSB0aW1lc3RhbXAgdGhlIHRpbWVzdGFtcCB0byB0ZXN0LgotICAgICAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmZiB0aW1lc3RhbXAgLyBzaXplID09IGRpdlBvc2l0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25UYXJnZXQobG9uZyB0aW1lc3RhbXApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wYXJlVG9UaW1lc3RhbXAodGltZXN0YW1wKSA9PSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIG5leHQgdGFyZ2V0LCB3aGljaCByZXByZXNlbnRzIGFuIGVhcmxpZXIgdGltZSBzcGFuLgotICAgICAgICAgKiBAcGFyYW0gYmFzZSBUaGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgdGFyZ2V0cyB0aGF0IHdpbGwgaGF2ZSB0aGUgc2FtZSBzaXplLiBUYXJnZXRzIGZvbGxvd2luZyB0aG9zZSB3aWxsIGJlIDxjb2RlPmJhc2U8L2NvZGU+IHRpbWVzIGFzIGJpZy4KLSAgICAgICAgICogQHJldHVybgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFRhcmdldCBuZXh0VGFyZ2V0KGludCBiYXNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGl2UG9zaXRpb24gJSBiYXNlID4gMCB8fCBzaXplICogYmFzZSA+IG1heFdpbmRvd1NpemUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYXJnZXQoc2l6ZSwgZGl2UG9zaXRpb24gLSAxLCBtYXhXaW5kb3dTaXplKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhcmdldChzaXplICogYmFzZSwgZGl2UG9zaXRpb24gLyBiYXNlIC0gMSwgbWF4V2luZG93U2l6ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEdyb3VwIGZpbGVzIHdpdGggc2ltaWxhciBtaW4gdGltZXN0YW1wIGludG8gYnVja2V0cy4gRmlsZXMgd2l0aCByZWNlbnQgbWluIHRpbWVzdGFtcHMgYXJlIGdyb3VwZWQgdG9nZXRoZXIgaW50bwotICAgICAqIGJ1Y2tldHMgZGVzaWduYXRlZCB0byBzaG9ydCB0aW1lc3BhbnMgd2hpbGUgZmlsZXMgd2l0aCBvbGRlciB0aW1lc3RhbXBzIGFyZSBncm91cGVkIGludG8gYnVja2V0cyByZXByZXNlbnRpbmcKLSAgICAgKiBsb25nZXIgdGltZXNwYW5zLgotICAgICAqIEBwYXJhbSBmaWxlcyBwYWlycyBjb25zaXN0aW5nIG9mIGEgZmlsZSBhbmQgaXRzIG1pbiB0aW1lc3RhbXAKLSAgICAgKiBAcGFyYW0gdGltZVVuaXQKLSAgICAgKiBAcGFyYW0gYmFzZQotICAgICAqIEBwYXJhbSBub3cKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBidWNrZXRzIG9mIGZpbGVzLiBUaGUgbGlzdCBpcyBvcmRlcmVkIHN1Y2ggdGhhdCB0aGUgZmlsZXMgd2l0aCBuZXdlc3QgdGltZXN0YW1wcyBjb21lIGZpcnN0LgotICAgICAqICAgICAgICAgRWFjaCBidWNrZXQgaXMgYWxzbyBhIGxpc3Qgb2YgZmlsZXMgb3JkZXJlZCBmcm9tIG5ld2VzdCB0byBvbGRlc3QuCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIDxUPiBMaXN0PExpc3Q8VD4+IGdldEJ1Y2tldHMoQ29sbGVjdGlvbjxQYWlyPFQsIExvbmc+PiBmaWxlcywgbG9uZyB0aW1lVW5pdCwgaW50IGJhc2UsIGxvbmcgbm93LCBsb25nIG1heFdpbmRvd1NpemUpCi0gICAgewotICAgICAgICAvLyBTb3J0IGZpbGVzIGJ5IGFnZS4gTmV3ZXN0IGZpcnN0LgotICAgICAgICBmaW5hbCBMaXN0PFBhaXI8VCwgTG9uZz4+IHNvcnRlZEZpbGVzID0gTGlzdHMubmV3QXJyYXlMaXN0KGZpbGVzKTsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRGaWxlcywgQ29sbGVjdGlvbnMucmV2ZXJzZU9yZGVyKG5ldyBDb21wYXJhdG9yPFBhaXI8VCwgTG9uZz4+KCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFBhaXI8VCwgTG9uZz4gcDEsIFBhaXI8VCwgTG9uZz4gcDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHAxLnJpZ2h0LmNvbXBhcmVUbyhwMi5yaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pKTsKLQotICAgICAgICBMaXN0PExpc3Q8VD4+IGJ1Y2tldHMgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKLSAgICAgICAgVGFyZ2V0IHRhcmdldCA9IGdldEluaXRpYWxUYXJnZXQobm93LCB0aW1lVW5pdCwgbWF4V2luZG93U2l6ZSk7Ci0gICAgICAgIFBlZWtpbmdJdGVyYXRvcjxQYWlyPFQsIExvbmc+PiBpdCA9IEl0ZXJhdG9ycy5wZWVraW5nSXRlcmF0b3Ioc29ydGVkRmlsZXMuaXRlcmF0b3IoKSk7Ci0KLSAgICAgICAgb3V0ZXJMb29wOgotICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoIXRhcmdldC5vblRhcmdldChpdC5wZWVrKCkucmlnaHQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaWxlIGlzIHRvbyBuZXcgZm9yIHRoZSB0YXJnZXQsIHNraXAgaXQuCi0gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5jb21wYXJlVG9UaW1lc3RhbXAoaXQucGVlaygpLnJpZ2h0KSA8IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpdC5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpdC5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlckxvb3A7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgLy8gSWYgdGhlIGZpbGUgaXMgdG9vIG9sZCBmb3IgdGhlIHRhcmdldCwgc3dpdGNoIHRhcmdldHMuCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5uZXh0VGFyZ2V0KGJhc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxUPiBidWNrZXQgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKLSAgICAgICAgICAgIHdoaWxlICh0YXJnZXQub25UYXJnZXQoaXQucGVlaygpLnJpZ2h0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWNrZXQuYWRkKGl0Lm5leHQoKS5sZWZ0KTsKLQotICAgICAgICAgICAgICAgIGlmICghaXQuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1Y2tldHMuYWRkKGJ1Y2tldCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYnVja2V0czsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgVGFyZ2V0IGdldEluaXRpYWxUYXJnZXQobG9uZyBub3csIGxvbmcgdGltZVVuaXQsIGxvbmcgbWF4V2luZG93U2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGFyZ2V0KHRpbWVVbml0LCBub3cgLyB0aW1lVW5pdCwgbWF4V2luZG93U2l6ZSk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRXN0aW1hdGVkQ29tcGFjdGlvbnNCeVRhc2tzKExpc3Q8TGlzdDxTU1RhYmxlUmVhZGVyPj4gdGFza3MpCi0gICAgewotICAgICAgICBpbnQgbiA9IDA7Ci0gICAgICAgIGZvciAoTGlzdDxTU1RhYmxlUmVhZGVyPiBidWNrZXQgOiB0YXNrcykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChMaXN0PFNTVGFibGVSZWFkZXI+IHN0Y3NCdWNrZXQgOiBnZXRTVENTQnVja2V0cyhidWNrZXQsIHN0Y3NPcHRpb25zKSkKLSAgICAgICAgICAgICAgICBpZiAoc3Rjc0J1Y2tldC5zaXplKCkgPj0gY2ZzLmdldE1pbmltdW1Db21wYWN0aW9uVGhyZXNob2xkKCkpCi0gICAgICAgICAgICAgICAgICAgIG4gKz0gTWF0aC5jZWlsKChkb3VibGUpc3Rjc0J1Y2tldC5zaXplKCkgLyBjZnMuZ2V0TWF4aW11bUNvbXBhY3Rpb25UaHJlc2hvbGQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZXN0aW1hdGVkUmVtYWluaW5nVGFza3MgPSBuOwotICAgICAgICBjZnMuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLmNvbXBhY3Rpb25Mb2dnZXIucGVuZGluZyh0aGlzLCBuKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBidWNrZXRzIGxpc3Qgb2YgYnVja2V0cywgc29ydGVkIGZyb20gbmV3ZXN0IHRvIG9sZGVzdCwgZnJvbSB3aGljaCB0byByZXR1cm4gdGhlIG5ld2VzdCBidWNrZXQgd2l0aGluIHRocmVzaG9sZHMuCi0gICAgICogQHBhcmFtIG1pblRocmVzaG9sZCBtaW5pbXVtIG51bWJlciBvZiBzc3RhYmxlcyBpbiBhIGJ1Y2tldCB0byBxdWFsaWZ5LgotICAgICAqIEBwYXJhbSBtYXhUaHJlc2hvbGQgbWF4aW11bSBudW1iZXIgb2Ygc3N0YWJsZXMgdG8gY29tcGFjdCBhdCBvbmNlICh0aGUgcmV0dXJuZWQgYnVja2V0IHdpbGwgYmUgdHJpbW1lZCBkb3duIHRvIHRoaXMpLgotICAgICAqIEByZXR1cm4gYSBidWNrZXQgKGxpc3QpIG9mIHNzdGFibGVzIHRvIGNvbXBhY3QuCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIExpc3Q8U1NUYWJsZVJlYWRlcj4gbmV3ZXN0QnVja2V0KExpc3Q8TGlzdDxTU1RhYmxlUmVhZGVyPj4gYnVja2V0cywgaW50IG1pblRocmVzaG9sZCwgaW50IG1heFRocmVzaG9sZCwgbG9uZyBub3csIGxvbmcgYmFzZVRpbWUsIGxvbmcgbWF4V2luZG93U2l6ZSwgU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMgc3Rjc09wdGlvbnMpCi0gICAgewotICAgICAgICAvLyBJZiB0aGUgImluY29taW5nIHdpbmRvdyIgaGFzIGF0IGxlYXN0IG1pblRocmVzaG9sZCBTU1RhYmxlcywgY2hvb3NlIHRoYXQgb25lLgotICAgICAgICAvLyBGb3IgYW55IG90aGVyIGJ1Y2tldCwgYXQgbGVhc3QgMiBTU1RhYmxlcyBpcyBlbm91Z2guCi0gICAgICAgIC8vIEluIGFueSBjYXNlLCBsaW1pdCB0byBtYXhUaHJlc2hvbGQgU1NUYWJsZXMuCi0gICAgICAgIFRhcmdldCBpbmNvbWluZ1dpbmRvdyA9IGdldEluaXRpYWxUYXJnZXQobm93LCBiYXNlVGltZSwgbWF4V2luZG93U2l6ZSk7Ci0gICAgICAgIGZvciAoTGlzdDxTU1RhYmxlUmVhZGVyPiBidWNrZXQgOiBidWNrZXRzKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGluRmlyc3RXaW5kb3cgPSBpbmNvbWluZ1dpbmRvdy5vblRhcmdldChidWNrZXQuZ2V0KDApLmdldE1pblRpbWVzdGFtcCgpKTsKLSAgICAgICAgICAgIGlmIChidWNrZXQuc2l6ZSgpID49IG1pblRocmVzaG9sZCB8fCAoYnVja2V0LnNpemUoKSA+PSAyICYmICFpbkZpcnN0V2luZG93KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHN0Y3NTU1RhYmxlcyA9IGdldFNTVGFibGVzRm9yU1RDUyhidWNrZXQsIGluRmlyc3RXaW5kb3cgPyBtaW5UaHJlc2hvbGQgOiAyLCBtYXhUaHJlc2hvbGQsIHN0Y3NPcHRpb25zKTsKLSAgICAgICAgICAgICAgICBpZiAoIXN0Y3NTU1RhYmxlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGNzU1NUYWJsZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U1NUYWJsZVJlYWRlcj4gZ2V0U1NUYWJsZXNGb3JTVENTKENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMsIGludCBtaW5UaHJlc2hvbGQsIGludCBtYXhUaHJlc2hvbGQsIFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zIHN0Y3NPcHRpb25zKQotICAgIHsKLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzID0gU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneS5tb3N0SW50ZXJlc3RpbmdCdWNrZXQoZ2V0U1RDU0J1Y2tldHMoc3N0YWJsZXMsIHN0Y3NPcHRpb25zKSwgbWluVGhyZXNob2xkLCBtYXhUaHJlc2hvbGQpOwotICAgICAgICBsb2dnZXIuZGVidWcoIkdvdCBzc3RhYmxlcyB7fSBmb3IgU1RDUyBmcm9tIHt9Iiwgcywgc3N0YWJsZXMpOwotICAgICAgICByZXR1cm4gczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PExpc3Q8U1NUYWJsZVJlYWRlcj4+IGdldFNUQ1NCdWNrZXRzKENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMsIFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zIHN0Y3NPcHRpb25zKQotICAgIHsKLSAgICAgICAgTGlzdDxQYWlyPFNTVGFibGVSZWFkZXIsTG9uZz4+IHBhaXJzID0gU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneS5jcmVhdGVTU1RhYmxlQW5kTGVuZ3RoUGFpcnMoQWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3kuZmlsdGVyU3VzcGVjdFNTVGFibGVzKHNzdGFibGVzKSk7Ci0gICAgICAgIHJldHVybiBTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmdldEJ1Y2tldHMocGFpcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rjc09wdGlvbnMuYnVja2V0SGlnaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGNzT3B0aW9ucy5idWNrZXRMb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rjc09wdGlvbnMubWluU1NUYWJsZVNpemUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBDb2xsZWN0aW9uPEFic3RyYWN0Q29tcGFjdGlvblRhc2s+IGdldE1heGltYWxUYXNrKGludCBnY0JlZm9yZSwgYm9vbGVhbiBzcGxpdE91dHB1dCkKLSAgICB7Ci0gICAgICAgIEl0ZXJhYmxlPFNTVGFibGVSZWFkZXI+IGZpbHRlcmVkU1NUYWJsZXMgPSBmaWx0ZXJTdXNwZWN0U1NUYWJsZXMoc3N0YWJsZXMpOwotICAgICAgICBpZiAoSXRlcmFibGVzLmlzRW1wdHkoZmlsdGVyZWRTU1RhYmxlcykpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoZmlsdGVyZWRTU1RhYmxlcywgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OKTsKLSAgICAgICAgaWYgKHR4biA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48QWJzdHJhY3RDb21wYWN0aW9uVGFzaz5zaW5nbGV0b24obmV3IENvbXBhY3Rpb25UYXNrKGNmcywgdHhuLCBnY0JlZm9yZSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBBYnN0cmFjdENvbXBhY3Rpb25UYXNrIGdldFVzZXJEZWZpbmVkVGFzayhDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IHNzdGFibGVzLCBpbnQgZ2NCZWZvcmUpCi0gICAgewotICAgICAgICBhc3NlcnQgIXNzdGFibGVzLmlzRW1wdHkoKTsgLy8gY2hlY2tlZCBmb3IgYnkgQ00uc3VibWl0VXNlckRlZmluZWQKLQotICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbiBtb2RpZmllciA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGVzLCBPcGVyYXRpb25UeXBlLkNPTVBBQ1RJT04pOwotICAgICAgICBpZiAobW9kaWZpZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJVbmFibGUgdG8gbWFyayB7fSBmb3IgY29tcGFjdGlvbjsgcHJvYmFibHkgYSBiYWNrZ3JvdW5kIGNvbXBhY3Rpb24gZ290IHRvIGl0IGZpcnN0LiAgWW91IGNhbiBkaXNhYmxlIGJhY2tncm91bmQgY29tcGFjdGlvbnMgdGVtcG9yYXJpbHkgaWYgdGhpcyBpcyBhIHByb2JsZW0iLCBzc3RhYmxlcyk7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvblRhc2soY2ZzLCBtb2RpZmllciwgZ2NCZWZvcmUpLnNldFVzZXJEZWZpbmVkKHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldE1heFNTVGFibGVCeXRlcygpCi0gICAgewotICAgICAgICByZXR1cm4gTG9uZy5NQVhfVkFMVUU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRFRDUyBzaG91bGQgbm90IGdyb3VwIHNzdGFibGVzIGZvciBhbnRpY29tcGFjdGlvbiAtIHRoaXMgY2FuIG1peCBuZXcgYW5kIG9sZCBkYXRhCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbGxlY3Rpb248Q29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPj4gZ3JvdXBTU1RhYmxlc0ZvckFudGlDb21wYWN0aW9uKENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXNUb0dyb3VwKQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbjxDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+PiBncm91cHMgPSBuZXcgQXJyYXlMaXN0PD4oc3N0YWJsZXNUb0dyb3VwLnNpemUoKSk7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXNUb0dyb3VwKQotICAgICAgICB7Ci0gICAgICAgICAgICBncm91cHMuYWRkKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzc3RhYmxlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGdyb3VwczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsaWRhdGVPcHRpb25zKE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucykgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdW5jaGVja2VkT3B0aW9ucyA9IEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5LnZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgdW5jaGVja2VkT3B0aW9ucyA9IERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLnZhbGlkYXRlT3B0aW9ucyhvcHRpb25zLCB1bmNoZWNrZWRPcHRpb25zKTsKLQotICAgICAgICB1bmNoZWNrZWRPcHRpb25zLnJlbW92ZShDb21wYWN0aW9uUGFyYW1zLk9wdGlvbi5NSU5fVEhSRVNIT0xELnRvU3RyaW5nKCkpOwotICAgICAgICB1bmNoZWNrZWRPcHRpb25zLnJlbW92ZShDb21wYWN0aW9uUGFyYW1zLk9wdGlvbi5NQVhfVEhSRVNIT0xELnRvU3RyaW5nKCkpOwotCi0gICAgICAgIHVuY2hlY2tlZE9wdGlvbnMgPSBTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy52YWxpZGF0ZU9wdGlvbnMob3B0aW9ucywgdW5jaGVja2VkT3B0aW9ucyk7Ci0KLSAgICAgICAgcmV0dXJuIHVuY2hlY2tlZE9wdGlvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBhY3Rpb25Mb2dnZXIuU3RyYXRlZ3kgc3RyYXRlZ3lMb2dnZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uTG9nZ2VyLlN0cmF0ZWd5KCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIEpzb25Ob2RlIHNzdGFibGUoU1NUYWJsZVJlYWRlciBzc3RhYmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdE5vZGUgbm9kZSA9IEpzb25Ob2RlRmFjdG9yeS5pbnN0YW5jZS5vYmplY3ROb2RlKCk7Ci0gICAgICAgICAgICAgICAgbm9kZS5wdXQoIm1pbl90aW1lc3RhbXAiLCBzc3RhYmxlLmdldE1pblRpbWVzdGFtcCgpKTsKLSAgICAgICAgICAgICAgICBub2RlLnB1dCgibWF4X3RpbWVzdGFtcCIsIHNzdGFibGUuZ2V0TWF4VGltZXN0YW1wKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBub2RlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgSnNvbk5vZGUgb3B0aW9ucygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0Tm9kZSBub2RlID0gSnNvbk5vZGVGYWN0b3J5Lmluc3RhbmNlLm9iamVjdE5vZGUoKTsKLSAgICAgICAgICAgICAgICBUaW1lVW5pdCByZXNvbHV0aW9uID0gRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneS50aGlzLm9wdGlvbnMudGltZXN0YW1wUmVzb2x1dGlvbjsKLSAgICAgICAgICAgICAgICBub2RlLnB1dChEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5USU1FU1RBTVBfUkVTT0xVVElPTl9LRVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBub2RlLnB1dChEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5CQVNFX1RJTUVfS0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdXRpb24udG9TZWNvbmRzKERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kudGhpcy5vcHRpb25zLmJhc2VUaW1lKSk7Ci0gICAgICAgICAgICAgICAgbm9kZS5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuTUFYX1dJTkRPV19TSVpFX0tFWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uLnRvU2Vjb25kcyhEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LnRoaXMub3B0aW9ucy5tYXhXaW5kb3dTaXplKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneVslcy8lc10iLAotICAgICAgICAgICAgICAgIGNmcy5nZXRNaW5pbXVtQ29tcGFjdGlvblRocmVzaG9sZCgpLAotICAgICAgICAgICAgICAgIGNmcy5nZXRNYXhpbXVtQ29tcGFjdGlvblRocmVzaG9sZCgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0RhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0RhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MDRiYmMuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9EYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLmNsYXNzKTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRpbWVVbml0IERFRkFVTFRfVElNRVNUQU1QX1JFU09MVVRJT04gPSBUaW1lVW5pdC5NSUNST1NFQ09ORFM7Ci0gICAgQERlcHJlY2F0ZWQKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGRvdWJsZSBERUZBVUxUX01BWF9TU1RBQkxFX0FHRV9EQVlTID0gMzY1KjEwMDA7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfQkFTRV9USU1FX1NFQ09ORFMgPSA2MDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9NQVhfV0lORE9XX1NJWkVfU0VDT05EUyA9IFRpbWVVbml0LlNFQ09ORFMuY29udmVydCgxLCBUaW1lVW5pdC5EQVlTKTsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRVhQSVJFRF9TU1RBQkxFX0NIRUNLX0ZSRVFVRU5DWV9TRUNPTkRTID0gNjAgKiAxMDsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FU1RBTVBfUkVTT0xVVElPTl9LRVkgPSAidGltZXN0YW1wX3Jlc29sdXRpb24iOwotICAgIEBEZXByZWNhdGVkCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX1NTVEFCTEVfQUdFX0tFWSA9ICJtYXhfc3N0YWJsZV9hZ2VfZGF5cyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9USU1FX0tFWSA9ICJiYXNlX3RpbWVfc2Vjb25kcyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQSVJFRF9TU1RBQkxFX0NIRUNLX0ZSRVFVRU5DWV9TRUNPTkRTX0tFWSA9ICJleHBpcmVkX3NzdGFibGVfY2hlY2tfZnJlcXVlbmN5X3NlY29uZHMiOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9XSU5ET1dfU0laRV9LRVkgPSAibWF4X3dpbmRvd19zaXplX3NlY29uZHMiOwotCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwcm90ZWN0ZWQgZmluYWwgbG9uZyBtYXhTU1RhYmxlQWdlOwotICAgIHByb3RlY3RlZCBmaW5hbCBUaW1lVW5pdCB0aW1lc3RhbXBSZXNvbHV0aW9uOwotICAgIHByb3RlY3RlZCBmaW5hbCBsb25nIGJhc2VUaW1lOwotICAgIHByb3RlY3RlZCBmaW5hbCBsb25nIGV4cGlyZWRTU1RhYmxlQ2hlY2tGcmVxdWVuY3k7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIGxvbmcgbWF4V2luZG93U2l6ZTsKLQotICAgIHB1YmxpYyBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucyhNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpCi0gICAgewotICAgICAgICBTdHJpbmcgb3B0aW9uVmFsdWUgPSBvcHRpb25zLmdldChUSU1FU1RBTVBfUkVTT0xVVElPTl9LRVkpOwotICAgICAgICB0aW1lc3RhbXBSZXNvbHV0aW9uID0gb3B0aW9uVmFsdWUgPT0gbnVsbCA/IERFRkFVTFRfVElNRVNUQU1QX1JFU09MVVRJT04gOiBUaW1lVW5pdC52YWx1ZU9mKG9wdGlvblZhbHVlKTsKLSAgICAgICAgaWYgKHRpbWVzdGFtcFJlc29sdXRpb24gIT0gREVGQVVMVF9USU1FU1RBTVBfUkVTT0xVVElPTikKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJVc2luZyBhIG5vbi1kZWZhdWx0IHRpbWVzdGFtcF9yZXNvbHV0aW9uIHt9IC0gYXJlIHlvdSByZWFsbHkgZG9pbmcgaW5zZXJ0cyB3aXRoIFVTSU5HIFRJTUVTVEFNUCA8bm9uX21pY3Jvc2Vjb25kX3RpbWVzdGFtcD4gKG9yIGRyaXZlciBlcXVpdmFsZW50KT8iLCB0aW1lc3RhbXBSZXNvbHV0aW9uKTsKLSAgICAgICAgb3B0aW9uVmFsdWUgPSBvcHRpb25zLmdldChNQVhfU1NUQUJMRV9BR0VfS0VZKTsKLSAgICAgICAgZG91YmxlIGZyYWN0aW9uYWxEYXlzID0gb3B0aW9uVmFsdWUgPT0gbnVsbCA/IERFRkFVTFRfTUFYX1NTVEFCTEVfQUdFX0RBWVMgOiBEb3VibGUucGFyc2VEb3VibGUob3B0aW9uVmFsdWUpOwotICAgICAgICBtYXhTU1RhYmxlQWdlID0gTWF0aC5yb3VuZChmcmFjdGlvbmFsRGF5cyAqIHRpbWVzdGFtcFJlc29sdXRpb24uY29udmVydCgxLCBUaW1lVW5pdC5EQVlTKSk7Ci0gICAgICAgIG9wdGlvblZhbHVlID0gb3B0aW9ucy5nZXQoQkFTRV9USU1FX0tFWSk7Ci0gICAgICAgIGJhc2VUaW1lID0gdGltZXN0YW1wUmVzb2x1dGlvbi5jb252ZXJ0KG9wdGlvblZhbHVlID09IG51bGwgPyBERUZBVUxUX0JBU0VfVElNRV9TRUNPTkRTIDogTG9uZy5wYXJzZUxvbmcob3B0aW9uVmFsdWUpLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgb3B0aW9uVmFsdWUgPSBvcHRpb25zLmdldChFWFBJUkVEX1NTVEFCTEVfQ0hFQ0tfRlJFUVVFTkNZX1NFQ09ORFNfS0VZKTsKLSAgICAgICAgZXhwaXJlZFNTVGFibGVDaGVja0ZyZXF1ZW5jeSA9IFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KG9wdGlvblZhbHVlID09IG51bGwgPyBERUZBVUxUX0VYUElSRURfU1NUQUJMRV9DSEVDS19GUkVRVUVOQ1lfU0VDT05EUyA6IExvbmcucGFyc2VMb25nKG9wdGlvblZhbHVlKSwgVGltZVVuaXQuU0VDT05EUyk7Ci0gICAgICAgIG9wdGlvblZhbHVlID0gb3B0aW9ucy5nZXQoTUFYX1dJTkRPV19TSVpFX0tFWSk7Ci0gICAgICAgIG1heFdpbmRvd1NpemUgPSB0aW1lc3RhbXBSZXNvbHV0aW9uLmNvbnZlcnQob3B0aW9uVmFsdWUgPT0gbnVsbCA/IERFRkFVTFRfTUFYX1dJTkRPV19TSVpFX1NFQ09ORFMgOiBMb25nLnBhcnNlTG9uZyhvcHRpb25WYWx1ZSksIFRpbWVVbml0LlNFQ09ORFMpOwotICAgIH0KLQotICAgIHB1YmxpYyBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucygpCi0gICAgewotICAgICAgICBtYXhTU1RhYmxlQWdlID0gTWF0aC5yb3VuZChERUZBVUxUX01BWF9TU1RBQkxFX0FHRV9EQVlTICogREVGQVVMVF9USU1FU1RBTVBfUkVTT0xVVElPTi5jb252ZXJ0KChsb25nKSBERUZBVUxUX01BWF9TU1RBQkxFX0FHRV9EQVlTLCBUaW1lVW5pdC5EQVlTKSk7Ci0gICAgICAgIHRpbWVzdGFtcFJlc29sdXRpb24gPSBERUZBVUxUX1RJTUVTVEFNUF9SRVNPTFVUSU9OOwotICAgICAgICBiYXNlVGltZSA9IHRpbWVzdGFtcFJlc29sdXRpb24uY29udmVydChERUZBVUxUX0JBU0VfVElNRV9TRUNPTkRTLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgZXhwaXJlZFNTVGFibGVDaGVja0ZyZXF1ZW5jeSA9IFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KERFRkFVTFRfRVhQSVJFRF9TU1RBQkxFX0NIRUNLX0ZSRVFVRU5DWV9TRUNPTkRTLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgbWF4V2luZG93U2l6ZSA9IHRpbWVzdGFtcFJlc29sdXRpb24uY29udmVydCgxLCBUaW1lVW5pdC5EQVlTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsaWRhdGVPcHRpb25zKE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucywgTWFwPFN0cmluZywgU3RyaW5nPiB1bmNoZWNrZWRPcHRpb25zKSB0aHJvd3MgIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBvcHRpb25WYWx1ZSA9IG9wdGlvbnMuZ2V0KFRJTUVTVEFNUF9SRVNPTFVUSU9OX0tFWSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob3B0aW9uVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBUaW1lVW5pdC52YWx1ZU9mKG9wdGlvblZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoInRpbWVzdGFtcF9yZXNvbHV0aW9uICVzIGlzIG5vdCB2YWxpZCIsIG9wdGlvblZhbHVlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRpb25WYWx1ZSA9IG9wdGlvbnMuZ2V0KE1BWF9TU1RBQkxFX0FHRV9LRVkpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlIG1heFNTdGFibGVBZ2UgPSBvcHRpb25WYWx1ZSA9PSBudWxsID8gREVGQVVMVF9NQVhfU1NUQUJMRV9BR0VfREFZUyA6IERvdWJsZS5wYXJzZURvdWJsZShvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAobWF4U1N0YWJsZUFnZSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgbXVzdCBiZSBub24tbmVnYXRpdmU6ICUuMmYiLCBNQVhfU1NUQUJMRV9BR0VfS0VZLCBtYXhTU3RhYmxlQWdlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCIlcyBpcyBub3QgYSBwYXJzYWJsZSBpbnQgKGJhc2UxMCkgZm9yICVzIiwgb3B0aW9uVmFsdWUsIE1BWF9TU1RBQkxFX0FHRV9LRVkpLCBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wdGlvblZhbHVlID0gb3B0aW9ucy5nZXQoQkFTRV9USU1FX0tFWSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIGJhc2VUaW1lID0gb3B0aW9uVmFsdWUgPT0gbnVsbCA/IERFRkFVTFRfQkFTRV9USU1FX1NFQ09ORFMgOiBMb25nLnBhcnNlTG9uZyhvcHRpb25WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoYmFzZVRpbWUgPD0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCIlcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLCBidXQgd2FzICVkIiwgQkFTRV9USU1FX0tFWSwgYmFzZVRpbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhIHBhcnNhYmxlIGludCAoYmFzZTEwKSBmb3IgJXMiLCBvcHRpb25WYWx1ZSwgQkFTRV9USU1FX0tFWSksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uVmFsdWUgPSBvcHRpb25zLmdldChFWFBJUkVEX1NTVEFCTEVfQ0hFQ0tfRlJFUVVFTkNZX1NFQ09ORFNfS0VZKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgZXhwaXJlZENoZWNrRnJlcXVlbmN5ID0gb3B0aW9uVmFsdWUgPT0gbnVsbCA/IERFRkFVTFRfRVhQSVJFRF9TU1RBQkxFX0NIRUNLX0ZSRVFVRU5DWV9TRUNPTkRTIDogTG9uZy5wYXJzZUxvbmcob3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKGV4cGlyZWRDaGVja0ZyZXF1ZW5jeSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgbXVzdCBub3QgYmUgbmVnYXRpdmUsIGJ1dCB3YXMgJWQiLCBFWFBJUkVEX1NTVEFCTEVfQ0hFQ0tfRlJFUVVFTkNZX1NFQ09ORFNfS0VZLCBleHBpcmVkQ2hlY2tGcmVxdWVuY3kpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhIHBhcnNhYmxlIGludCAoYmFzZTEwKSBmb3IgJXMiLCBvcHRpb25WYWx1ZSwgRVhQSVJFRF9TU1RBQkxFX0NIRUNLX0ZSRVFVRU5DWV9TRUNPTkRTX0tFWSksIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3B0aW9uVmFsdWUgPSBvcHRpb25zLmdldChNQVhfV0lORE9XX1NJWkVfS0VZKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgbWF4V2luZG93U2l6ZSA9IG9wdGlvblZhbHVlID09IG51bGwgPyBERUZBVUxUX01BWF9XSU5ET1dfU0laRV9TRUNPTkRTIDogTG9uZy5wYXJzZUxvbmcob3B0aW9uVmFsdWUpOwotICAgICAgICAgICAgaWYgKG1heFdpbmRvd1NpemUgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIG11c3Qgbm90IGJlIG5lZ2F0aXZlLCBidXQgd2FzICVkIiwgTUFYX1dJTkRPV19TSVpFX0tFWSwgbWF4V2luZG93U2l6ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgaXMgbm90IGEgcGFyc2FibGUgaW50IChiYXNlMTApIGZvciAlcyIsIG9wdGlvblZhbHVlLCBNQVhfV0lORE9XX1NJWkVfS0VZKSwgZSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHVuY2hlY2tlZE9wdGlvbnMucmVtb3ZlKE1BWF9TU1RBQkxFX0FHRV9LRVkpOwotICAgICAgICB1bmNoZWNrZWRPcHRpb25zLnJlbW92ZShCQVNFX1RJTUVfS0VZKTsKLSAgICAgICAgdW5jaGVja2VkT3B0aW9ucy5yZW1vdmUoVElNRVNUQU1QX1JFU09MVVRJT05fS0VZKTsKLSAgICAgICAgdW5jaGVja2VkT3B0aW9ucy5yZW1vdmUoRVhQSVJFRF9TU1RBQkxFX0NIRUNLX0ZSRVFVRU5DWV9TRUNPTkRTX0tFWSk7Ci0gICAgICAgIHVuY2hlY2tlZE9wdGlvbnMucmVtb3ZlKE1BWF9XSU5ET1dfU0laRV9LRVkpOwotCi0gICAgICAgIHJldHVybiB1bmNoZWNrZWRPcHRpb25zOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9MZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5LmphdmEKaW5kZXggNTQ5NTNlNC4uYmJkZDEzYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9MZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9MZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5LmphdmEKQEAgLTMzLDcgKzMzLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXBhY3Rpb25QYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CkBAIC00MywxMSArNDIsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVE9MRVJBVEVfU1NUQUJMRV9TSVpFOworCiBwdWJsaWMgY2xhc3MgTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneSBleHRlbmRzIEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5CiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3kuY2xhc3MpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU1RBQkxFX1NJWkVfT1BUSU9OID0gInNzdGFibGVfc2l6ZV9pbl9tYiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB0b2xlcmF0ZVNzdGFibGVTaXplID0gQm9vbGVhbi5nZXRCb29sZWFuKENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAidG9sZXJhdGVfc3N0YWJsZV9zaXplIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiB0b2xlcmF0ZVNzdGFibGVTaXplID0gVE9MRVJBVEVfU1NUQUJMRV9TSVpFLmdldEJvb2xlYW4oKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxfRkFOT1VUX1NJWkVfT1BUSU9OID0gImZhbm91dF9zaXplIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX1NTVEFCTEVfVVBMRVZFTF9PUFRJT04gPSAic2luZ2xlX3NzdGFibGVfdXBsZXZlbCI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9MRVZFTF9GQU5PVVRfU0laRSA9IDEwOwpAQCAtMjgwLDYgKzI4MSwxMiBAQAogICAgICAgICByZXR1cm4gbjsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBpbnQgZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoaW50IGFkZGl0aW9uYWxTU1RhYmxlcywgbG9uZyBhZGRpdGlvbmFsQnl0ZXMpCisgICAgeworICAgICAgICByZXR1cm4gbWFuaWZlc3QuZ2V0RXN0aW1hdGVkVGFza3MoYWRkaXRpb25hbEJ5dGVzKTsKKyAgICB9CisKICAgICBwdWJsaWMgbG9uZyBnZXRNYXhTU1RhYmxlQnl0ZXMoKQogICAgIHsKICAgICAgICAgcmV0dXJuIG1heFNTVGFibGVTaXplSW5NaUIgKiAxMDI0TCAqIDEwMjRMOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9MZXZlbGVkR2VuZXJhdGlvbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTGV2ZWxlZEdlbmVyYXRpb25zLmphdmEKaW5kZXggMzZiNTYwMC4uMDhjZGE4OSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9MZXZlbGVkR2VuZXJhdGlvbnMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xldmVsZWRHZW5lcmF0aW9ucy5qYXZhCkBAIC0zNywxMSArMzcsMTEgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVJZEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfU1RSSUNUX0xDU19DSEVDS1M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIAogLyoqCkBAIC01Miw3ICs1Miw3IEBACiBjbGFzcyBMZXZlbGVkR2VuZXJhdGlvbnMKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTGV2ZWxlZEdlbmVyYXRpb25zLmNsYXNzKTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc3RyaWN0TENTQ2hlY2tzVGVzdCA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInRlc3Quc3RyaWN0X2xjc19jaGVja3MiKTsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc3RyaWN0TENTQ2hlY2tzVGVzdCA9IFRFU1RfU1RSSUNUX0xDU19DSEVDS1MuZ2V0Qm9vbGVhbigpOwogICAgIC8vIEl0IGluY2x1ZGVzIEwwLCBpLmUuIHdlIHN1cHBvcnQgW0wwIC0gTDhdIGxldmVscwogICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0xFVkVMX0NPVU5UID0gOTsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9MZXZlbGVkTWFuaWZlc3QuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTGV2ZWxlZE1hbmlmZXN0LmphdmEKaW5kZXggMjk3MmQ3ZC4uNDMzOTE4MSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9MZXZlbGVkTWFuaWZlc3QuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xldmVsZWRNYW5pZmVzdC5qYXZhCkBAIC0xNyw3ICsxNywxNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb247CiAKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlczsKQEAgLTI2LDE4ICszNiwxNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkludHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Cb3VuZHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIApAQCAtMTE0LDcgKzEyMiw3IEBACiAgICAgICAgICAgICBsb25nIG1heE1vZGlmaWNhdGlvblRpbWUgPSBMb25nLk1JTl9WQUxVRTsKICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc1RhYmxlUmVhZGVyIDogbGV2ZWwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBtb2RpZmljYXRpb25UaW1lID0gc3NUYWJsZVJlYWRlci5nZXRDcmVhdGlvblRpbWVGb3IoQ29tcG9uZW50LkRBVEEpOworICAgICAgICAgICAgICAgIGxvbmcgbW9kaWZpY2F0aW9uVGltZSA9IHNzVGFibGVSZWFkZXIuZ2V0RGF0YUNyZWF0aW9uVGltZSgpOwogICAgICAgICAgICAgICAgIGlmIChtb2RpZmljYXRpb25UaW1lID49IG1heE1vZGlmaWNhdGlvblRpbWUpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBzc3RhYmxlV2l0aE1heE1vZGlmaWNhdGlvblRpbWUgPSBzc1RhYmxlUmVhZGVyOwpAQCAtNjIyLDE2ICs2MzAsMjUgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgZ2V0RXN0aW1hdGVkVGFza3MoKQorICAgIHB1YmxpYyBpbnQgZ2V0RXN0aW1hdGVkVGFza3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldEVzdGltYXRlZFRhc2tzKDApOworICAgIH0KKworICAgIGludCBnZXRFc3RpbWF0ZWRUYXNrcyhsb25nIGFkZGl0aW9uYWxMZXZlbDBCeXRlcykKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRFc3RpbWF0ZWRUYXNrcygobGV2ZWwpIC0+IFNTVGFibGVSZWFkZXIuZ2V0VG90YWxCeXRlcyhnZXRMZXZlbChsZXZlbCkpICsgKGxldmVsID09IDAgPyBhZGRpdGlvbmFsTGV2ZWwwQnl0ZXMgOiAwKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgaW50IGdldEVzdGltYXRlZFRhc2tzKEZ1bmN0aW9uPEludGVnZXIsTG9uZz4gZm5Ub3RhbFNpemVCeXRlc0J5TGV2ZWwpCiAgICAgewogICAgICAgICBsb25nIHRhc2tzID0gMDsKICAgICAgICAgbG9uZ1tdIGVzdGltYXRlZCA9IG5ldyBsb25nW2dlbmVyYXRpb25zLmxldmVsQ291bnQoKV07CiAKICAgICAgICAgZm9yIChpbnQgaSA9IGdlbmVyYXRpb25zLmxldmVsQ291bnQoKSAtIDE7IGkgPj0gMDsgaS0tKQogICAgICAgICB7Ci0gICAgICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBnZW5lcmF0aW9ucy5nZXQoaSk7CiAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyAxIGJ5dGUgb3ZlciBUQkwgLSAoTUJMICogMS4wMDEpLCB0aGVyZSBpcyBzdGlsbCBhIHRhc2sgbGVmdCwgc28gd2UgbmVlZCB0byByb3VuZCB1cC4KLSAgICAgICAgICAgIGVzdGltYXRlZFtpXSA9IChsb25nKU1hdGguY2VpbCgoZG91YmxlKU1hdGgubWF4KDBMLCBTU1RhYmxlUmVhZGVyLmdldFRvdGFsQnl0ZXMoc3N0YWJsZXMpIC0gKGxvbmcpKG1heEJ5dGVzRm9yTGV2ZWwoaSwgbWF4U1NUYWJsZVNpemVJbkJ5dGVzKSAqIDEuMDAxKSkgLyAoZG91YmxlKW1heFNTVGFibGVTaXplSW5CeXRlcyk7CisgICAgICAgICAgICBlc3RpbWF0ZWRbaV0gPSAobG9uZylNYXRoLmNlaWwoKGRvdWJsZSlNYXRoLm1heCgwTCwgZm5Ub3RhbFNpemVCeXRlc0J5TGV2ZWwuYXBwbHkoaSkgLSAobG9uZykobWF4Qnl0ZXNGb3JMZXZlbChpLCBtYXhTU1RhYmxlU2l6ZUluQnl0ZXMpICogMS4wMDEpKSAvIChkb3VibGUpbWF4U1NUYWJsZVNpemVJbkJ5dGVzKTsKICAgICAgICAgICAgIHRhc2tzICs9IGVzdGltYXRlZFtpXTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL09wZXJhdGlvblR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vT3BlcmF0aW9uVHlwZS5qYXZhCmluZGV4IGU5NTdlNDIuLjJhNWZmYzYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vT3BlcmF0aW9uVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vT3BlcmF0aW9uVHlwZS5qYXZhCkBAIC0yMCwzNSArMjAsNTggQEAKIHB1YmxpYyBlbnVtIE9wZXJhdGlvblR5cGUKIHsKICAgICAvKiogRWFjaCBtb2RpZmljYXRpb24gaGVyZSBzaG91bGQgYmUgYWxzbyBhcHBsaWVkIHRvIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5ub2RldG9vbC5TdG9wI2NvbXBhY3Rpb25UeXBlfSAqLwotICAgIENPTVBBQ1RJT04oIkNvbXBhY3Rpb24iKSwKLSAgICBWQUxJREFUSU9OKCJWYWxpZGF0aW9uIiksCi0gICAgS0VZX0NBQ0hFX1NBVkUoIktleSBjYWNoZSBzYXZlIiksCi0gICAgUk9XX0NBQ0hFX1NBVkUoIlJvdyBjYWNoZSBzYXZlIiksCi0gICAgQ09VTlRFUl9DQUNIRV9TQVZFKCJDb3VudGVyIGNhY2hlIHNhdmUiKSwKLSAgICBDTEVBTlVQKCJDbGVhbnVwIiksCi0gICAgU0NSVUIoIlNjcnViIiksCi0gICAgVVBHUkFERV9TU1RBQkxFUygiVXBncmFkZSBzc3RhYmxlcyIpLAotICAgIElOREVYX0JVSUxEKCJTZWNvbmRhcnkgaW5kZXggYnVpbGQiKSwKLSAgICAvKiogQ29tcGFjdGlvbiBmb3IgdG9tYnN0b25lIHJlbW92YWwgKi8KLSAgICBUT01CU1RPTkVfQ09NUEFDVElPTigiVG9tYnN0b25lIENvbXBhY3Rpb24iKSwKLSAgICBVTktOT1dOKCJVbmtub3duIGNvbXBhY3Rpb24gdHlwZSIpLAotICAgIEFOVElDT01QQUNUSU9OKCJBbnRpY29tcGFjdGlvbiBhZnRlciByZXBhaXIiKSwKLSAgICBWRVJJRlkoIlZlcmlmeSIpLAotICAgIEZMVVNIKCJGbHVzaCIpLAotICAgIFNUUkVBTSgiU3RyZWFtIiksCi0gICAgV1JJVEUoIldyaXRlIiksCi0gICAgVklFV19CVUlMRCgiVmlldyBidWlsZCIpLAotICAgIElOREVYX1NVTU1BUlkoIkluZGV4IHN1bW1hcnkgcmVkaXN0cmlidXRpb24iKSwKLSAgICBSRUxPQ0FURSgiUmVsb2NhdGUgc3N0YWJsZXMgdG8gY29ycmVjdCBkaXNrIiksCi0gICAgR0FSQkFHRV9DT0xMRUNUKCJSZW1vdmUgZGVsZXRlZCBkYXRhIik7CisgICAgUDAoIkNhbmNlbCBhbGwgb3BlcmF0aW9ucyIsIGZhbHNlLCAwKSwKKworICAgIC8vIEF1dG9tYXRpb24gb3Igb3BlcmF0b3ItZHJpdmVuIHRhc2tzCisgICAgQ0xFQU5VUCgiQ2xlYW51cCIsIHRydWUsIDEpLAorICAgIFNDUlVCKCJTY3J1YiIsIHRydWUsIDEpLAorICAgIFVQR1JBREVfU1NUQUJMRVMoIlVwZ3JhZGUgc3N0YWJsZXMiLCB0cnVlLCAxKSwKKyAgICBWRVJJRlkoIlZlcmlmeSIsIGZhbHNlLCAxKSwKKyAgICBNQUpPUl9DT01QQUNUSU9OKCJNYWpvciBjb21wYWN0aW9uIiwgdHJ1ZSwgMSksCisgICAgUkVMT0NBVEUoIlJlbG9jYXRlIHNzdGFibGVzIHRvIGNvcnJlY3QgZGlzayIsIGZhbHNlLCAxKSwKKyAgICBHQVJCQUdFX0NPTExFQ1QoIlJlbW92ZSBkZWxldGVkIGRhdGEiLCB0cnVlLCAxKSwKKworICAgIC8vIEludGVybmFsIFNTVGFibGUgd3JpdGluZworICAgIEZMVVNIKCJGbHVzaCIsIHRydWUsIDEpLAorICAgIFdSSVRFKCJXcml0ZSIsIHRydWUsIDEpLAorCisgICAgQU5USUNPTVBBQ1RJT04oIkFudGljb21wYWN0aW9uIGFmdGVyIHJlcGFpciIsIHRydWUsIDIpLAorICAgIFZBTElEQVRJT04oIlZhbGlkYXRpb24iLCBmYWxzZSwgMyksCisKKyAgICBJTkRFWF9CVUlMRCgiU2Vjb25kYXJ5IGluZGV4IGJ1aWxkIiwgZmFsc2UsIDQpLAorICAgIFZJRVdfQlVJTEQoIlZpZXcgYnVpbGQiLCBmYWxzZSwgNCksCisKKyAgICBDT01QQUNUSU9OKCJDb21wYWN0aW9uIiwgdHJ1ZSwgNSksCisgICAgVE9NQlNUT05FX0NPTVBBQ1RJT04oIlRvbWJzdG9uZSBDb21wYWN0aW9uIiwgdHJ1ZSwgNSksIC8vIENvbXBhY3Rpb24gZm9yIHRvbWJzdG9uZSByZW1vdmFsCisgICAgVU5LTk9XTigiVW5rbm93biBjb21wYWN0aW9uIHR5cGUiLCBmYWxzZSwgNSksCisKKyAgICBTVFJFQU0oIlN0cmVhbSIsIHRydWUsIDYpLAorICAgIEtFWV9DQUNIRV9TQVZFKCJLZXkgY2FjaGUgc2F2ZSIsIGZhbHNlLCA2KSwKKyAgICBST1dfQ0FDSEVfU0FWRSgiUm93IGNhY2hlIHNhdmUiLCBmYWxzZSwgNiksCisgICAgQ09VTlRFUl9DQUNIRV9TQVZFKCJDb3VudGVyIGNhY2hlIHNhdmUiLCBmYWxzZSwgNiksCisgICAgSU5ERVhfU1VNTUFSWSgiSW5kZXggc3VtbWFyeSByZWRpc3RyaWJ1dGlvbiIsIGZhbHNlLCA2KTsKIAogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdHlwZTsKICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGZpbGVOYW1lOwogCi0gICAgT3BlcmF0aW9uVHlwZShTdHJpbmcgdHlwZSkKKyAgICAvKioKKyAgICAgKiBGb3IgcHVycG9zZXMgb2YgY2FsY3VsYXRpbmcgc3BhY2UgZm9yIGludGVyaW0gY29tcGFjdGlvbnMgaW4gZmxpZ2h0LCB3aGV0aGVyIG9yIG5vdCB0aGlzIE9wZXJhdGlvblR5cGUgaXMgZXhwZWN0ZWQKKyAgICAgKiB0byB3cml0ZSBkYXRhIHRvIGRpc2sKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiB3cml0ZXNEYXRhOworCisgICAgLy8gQXMgb2Ygbm93LCBwcmlvcml0eSB0YWtlcyBwYXJ0IG9ubHkgZm9yIGludGVycnVwdGluZyB0YXNrcyB0byBnaXZlIHdheSB0byBvcGVyYXRvci1kcml2ZW4gdGFza3MuCisgICAgLy8gT3BlcmF0aW9uIHR5cGVzIHRoYXQgaGF2ZSBhIHNtYWxsZXIgbnVtYmVyIHdpbGwgYmUgYWxsb3dlZCB0byBjYW5jZWwgb25lcyB0aGF0IGhhdmUgbGFyZ2VyIG51bWJlcnMuCisgICAgLy8KKyAgICAvLyBTdWJtaXR0ZWQgdGFza3MgbWF5IGJlIHByaW9yaXRpc2VkIGRpZmZlcmVudGx5IHdoZW4gZm9ybWluZyBhIHF1ZXVlLCBpZi93aGVuIENBU1NBTkRSQS0xMTIxOCBpcyBpbXBsZW1lbnRlZC4KKyAgICBwdWJsaWMgZmluYWwgaW50IHByaW9yaXR5OworCisgICAgT3BlcmF0aW9uVHlwZShTdHJpbmcgdHlwZSwgYm9vbGVhbiB3cml0ZXNEYXRhLCBpbnQgcHJpb3JpdHkpCiAgICAgewogICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICB0aGlzLmZpbGVOYW1lID0gdHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoIiAiLCAiIik7CisgICAgICAgIHRoaXMud3JpdGVzRGF0YSA9IHdyaXRlc0RhdGE7CisgICAgICAgIHRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIE9wZXJhdGlvblR5cGUgZnJvbUZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vUGVuZGluZ1JlcGFpckhvbGRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9QZW5kaW5nUmVwYWlySG9sZGVyLmphdmEKaW5kZXggMzE0ZGY5ZS4uYmY2YzQ5NyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9QZW5kaW5nUmVwYWlySG9sZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9QZW5kaW5nUmVwYWlySG9sZGVyLmphdmEKQEAgLTI4MSw0ICsyODEsMTMgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBJdGVyYWJsZXMuYW55KG1hbmFnZXJzLCBwcm0gLT4gcHJtLmNvbnRhaW5zU1NUYWJsZShzc3RhYmxlKSk7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcygpCisgICAgeworICAgICAgICBpbnQgdGFza3MgPSAwOworICAgICAgICBmb3IgKFBlbmRpbmdSZXBhaXJNYW5hZ2VyIG1hbmFnZXIgOiBtYW5hZ2VycykKKyAgICAgICAgICAgIHRhc2tzICs9IG1hbmFnZXIuZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoKTsKKyAgICAgICAgcmV0dXJuIHRhc2tzOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vUGVuZGluZ1JlcGFpck1hbmFnZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vUGVuZGluZ1JlcGFpck1hbmFnZXIuamF2YQppbmRleCAxMWQ2ZmU4Li44NWE0NDgzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1BlbmRpbmdSZXBhaXJNYW5hZ2VyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9QZW5kaW5nUmVwYWlyTWFuYWdlci5qYXZhCkBAIC0yMjgsMjIgKzIyOCwyNSBAQAogCiAgICAgcHJpdmF0ZSBpbnQgZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoVGltZVVVSUQgc2Vzc2lvbklELCBBYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneSBzdHJhdGVneSkKICAgICB7Ci0gICAgICAgIGlmIChjYW5DbGVhbnVwKHNlc3Npb25JRCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHN0cmF0ZWd5LmdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKCk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKHNlc3Npb25JRCwgc3RyYXRlZ3ksIDAsIDApOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKFRpbWVVVUlEIHNlc3Npb25JRCwgQWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3kgc3RyYXRlZ3ksIGludCBhZGRpdGlvbmFsU1NUYWJsZXMsIGxvbmcgYWRkaXRpb25hbEJ5dGVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNhbkNsZWFudXAoc2Vzc2lvbklEKSA/IDAgOiBzdHJhdGVneS5nZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcygpOwogICAgIH0KIAogICAgIGludCBnZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcygpCiAgICAgeworICAgICAgICByZXR1cm4gZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoMCwgMCk7CisgICAgfQorCisgICAgaW50IGdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKGludCBhZGRpdGlvbmFsU1NUYWJsZXMsIGxvbmcgYWRkaXRpb25hbEJ5dGVzKQorICAgIHsKICAgICAgICAgaW50IHRhc2tzID0gMDsKICAgICAgICAgZm9yIChNYXAuRW50cnk8VGltZVVVSUQsIEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5PiBlbnRyeSA6IHN0cmF0ZWdpZXMuZW50cnlTZXQoKSkKICAgICAgICAgewotICAgICAgICAgICAgdGFza3MgKz0gZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgdGFza3MgKz0gZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCksIGFkZGl0aW9uYWxTU1RhYmxlcywgYWRkaXRpb25hbEJ5dGVzKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdGFza3M7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9TY3J1YmJlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9TY3J1YmJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjgyNWQwLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vU2NydWJiZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0Vycm9yOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2s7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVhZFdyaXRlTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWZzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5IZWFwQ2xvbmVyOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZVVVSUQ7Ci0KLXB1YmxpYyBjbGFzcyBTY3J1YmJlciBpbXBsZW1lbnRzIENsb3NlYWJsZQotewotICAgIHByaXZhdGUgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOwotICAgIHByaXZhdGUgZmluYWwgU1NUYWJsZVJlYWRlciBzc3RhYmxlOwotICAgIHByaXZhdGUgZmluYWwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGRlc3RpbmF0aW9uOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBza2lwQ29ycnVwdGVkOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQ29tbXV0YXRpdmU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzSW5kZXg7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNoZWNrRGF0YTsKLSAgICBwcml2YXRlIGZpbmFsIGxvbmcgZXhwZWN0ZWRCbG9vbUZpbHRlclNpemU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJlYWRXcml0ZUxvY2sgZmlsZUFjY2Vzc0xvY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSYW5kb21BY2Nlc3NSZWFkZXIgZGF0YUZpbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSYW5kb21BY2Nlc3NSZWFkZXIgaW5kZXhGaWxlOwotICAgIHByaXZhdGUgZmluYWwgU2NydWJJbmZvIHNjcnViSW5mbzsKLSAgICBwcml2YXRlIGZpbmFsIFJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyIHJvd0luZGV4RW50cnlTZXJpYWxpemVyOwotCi0gICAgcHJpdmF0ZSBpbnQgZ29vZFBhcnRpdGlvbnM7Ci0gICAgcHJpdmF0ZSBpbnQgYmFkUGFydGl0aW9uczsKLSAgICBwcml2YXRlIGludCBlbXB0eVBhcnRpdGlvbnM7Ci0KLSAgICBwcml2YXRlIEJ5dGVCdWZmZXIgY3VycmVudEluZGV4S2V5OwotICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBuZXh0SW5kZXhLZXk7Ci0gICAgcHJpdmF0ZSBsb25nIGN1cnJlbnRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleDsKLSAgICBwcml2YXRlIGxvbmcgbmV4dFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4OwotCi0gICAgcHJpdmF0ZSBOZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljcyBuZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljcyA9IG5ldyBOZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljcygpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFBhcnRpdGlvbj4gcGFydGl0aW9uQ29tcGFyYXRvciA9IENvbXBhcmF0b3IuY29tcGFyaW5nKFBhcnRpdGlvbjo6cGFydGl0aW9uS2V5KTsKLSAgICBwcml2YXRlIGZpbmFsIFNvcnRlZFNldDxQYXJ0aXRpb24+IG91dE9mT3JkZXIgPSBuZXcgVHJlZVNldDw+KHBhcnRpdGlvbkNvbXBhcmF0b3IpOwotCi0gICAgcHVibGljIFNjcnViYmVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24sIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgYm9vbGVhbiBjaGVja0RhdGEpCi0gICAgewotICAgICAgICB0aGlzKGNmcywgdHJhbnNhY3Rpb24sIHNraXBDb3JydXB0ZWQsIGNoZWNrRGF0YSwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBTY3J1YmJlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIExpZmVjeWNsZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uLCBib29sZWFuIHNraXBDb3JydXB0ZWQsIGJvb2xlYW4gY2hlY2tEYXRhLAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MpCi0gICAgewotICAgICAgICB0aGlzKGNmcywgdHJhbnNhY3Rpb24sIHNraXBDb3JydXB0ZWQsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBjaGVja0RhdGEsIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgcHVibGljIFNjcnViYmVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywKLSAgICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwKLSAgICAgICAgICAgICAgICAgICAgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzKQotICAgIHsKLSAgICAgICAgdGhpcy5jZnMgPSBjZnM7Ci0gICAgICAgIHRoaXMudHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKLSAgICAgICAgdGhpcy5zc3RhYmxlID0gdHJhbnNhY3Rpb24ub25seU9uZSgpOwotICAgICAgICB0aGlzLm91dHB1dEhhbmRsZXIgPSBvdXRwdXRIYW5kbGVyOwotICAgICAgICB0aGlzLnNraXBDb3JydXB0ZWQgPSBza2lwQ29ycnVwdGVkOwotICAgICAgICB0aGlzLnJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MgPSByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzOwotICAgICAgICB0aGlzLnJvd0luZGV4RW50cnlTZXJpYWxpemVyID0gc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24uZ2V0U1NUYWJsZUZvcm1hdCgpLmdldEluZGV4U2VyaWFsaXplcihjZnMubWV0YWRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuaGVhZGVyKTsKLQotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHRvU2NydWIgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdGFibGUpOwotCi0gICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2soY2ZzLmdldERpc2tCb3VuZGFyaWVzKCkuZ2V0Q29ycmVjdERpc2tGb3JTU1RhYmxlKHNzdGFibGUpKTsKLSAgICAgICAgdGhpcy5pc0NvbW11dGF0aXZlID0gY2ZzLm1ldGFkYXRhKCkuaXNDb3VudGVyKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBoYXNJbmRleEZpbGUgPSAobmV3IEZpbGUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkpLmV4aXN0cygpOwotICAgICAgICB0aGlzLmlzSW5kZXggPSBjZnMuaXNJbmRleCgpOwotICAgICAgICBpZiAoIWhhc0luZGV4RmlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBhbnkgY29ycnVwdGlvbiBpbiB0aGUgLURhdGEuZGIgdGhlbiBwYXJ0aXRpb25zIGNhbid0IGJlIHNraXBwZWQgb3Zlci4gYnV0IGl0J3Mgd29ydGggYSBzaG90LgotICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCJNaXNzaW5nIGNvbXBvbmVudDogIiArIHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuY2hlY2tEYXRhID0gY2hlY2tEYXRhICYmICF0aGlzLmlzSW5kZXg7IC8vTG9jYWxCeVBhcnRpdGlvbmVyVHlwZSBkb2VzIG5vdCBzdXBwb3J0IHZhbGlkYXRpb24KLSAgICAgICAgdGhpcy5leHBlY3RlZEJsb29tRmlsdGVyU2l6ZSA9IE1hdGgubWF4KAotICAgICAgICAgICAgY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsCi0gICAgICAgICAgICBoYXNJbmRleEZpbGUgPyBTU1RhYmxlUmVhZGVyLmdldEFwcHJveGltYXRlS2V5Q291bnQodG9TY3J1YikgOiAwKTsKLQotICAgICAgICB0aGlzLmZpbGVBY2Nlc3NMb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKLSAgICAgICAgLy8gbG9vcCB0aHJvdWdoIGVhY2ggcGFydGl0aW9uLCBkZXNlcmlhbGl6aW5nIHRvIGNoZWNrIGZvciBkYW1hZ2UuCi0gICAgICAgIC8vIFdlJ2xsIGFsc28gbG9vcCB0aHJvdWdoIHRoZSBpbmRleCBhdCB0aGUgc2FtZSB0aW1lLCB1c2luZyB0aGUgcG9zaXRpb24gZnJvbSB0aGUgaW5kZXggdG8gcmVjb3ZlciBpZiB0aGUKLSAgICAgICAgLy8gcGFydGl0aW9uIGhlYWRlciAoa2V5IG9yIGRhdGEgc2l6ZSkgaXMgY29ycnVwdC4gKFRoaXMgbWVhbnMgb3VyIHBvc2l0aW9uIGluIHRoZSBpbmRleCBmaWxlIHdpbGwgYmUgb25lCi0gICAgICAgIC8vIHBhcnRpdGlvbiAiYWhlYWQiIG9mIHRoZSBkYXRhIGZpbGUuKQotICAgICAgICB0aGlzLmRhdGFGaWxlID0gdHJhbnNhY3Rpb24uaXNPZmZsaW5lKCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gc3N0YWJsZS5vcGVuRGF0YVJlYWRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IHNzdGFibGUub3BlbkRhdGFSZWFkZXIoQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZ2V0UmF0ZUxpbWl0ZXIoKSk7Ci0KLSAgICAgICAgdGhpcy5pbmRleEZpbGUgPSBoYXNJbmRleEZpbGUKLSAgICAgICAgICAgICAgICA/IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpKQotICAgICAgICAgICAgICAgIDogbnVsbDsKLQotICAgICAgICB0aGlzLnNjcnViSW5mbyA9IG5ldyBTY3J1YkluZm8oZGF0YUZpbGUsIHNzdGFibGUsIGZpbGVBY2Nlc3NMb2NrLnJlYWRMb2NrKCkpOwotCi0gICAgICAgIHRoaXMuY3VycmVudFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4ID0gMDsKLSAgICAgICAgdGhpcy5uZXh0UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXggPSAwOwotCi0gICAgICAgIGlmIChyZWluc2VydE92ZXJmbG93ZWRUVExSb3dzKQotICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIlN0YXJ0aW5nIHNjcnViIHdpdGggcmVpbnNlcnQgb3ZlcmZsb3dlZCBUVEwgb3B0aW9uIik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBVbmZpbHRlcmVkUm93SXRlcmF0b3Igd2l0aFZhbGlkYXRpb24oVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXIsIFN0cmluZyBmaWxlbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjaGVja0RhdGEgPyBVbmZpbHRlcmVkUm93SXRlcmF0b3JzLndpdGhWYWxpZGF0aW9uKGl0ZXIsIGZpbGVuYW1lKSA6IGl0ZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5U3RyaW5nKERlY29yYXRlZEtleSBrZXkpCi0gICAgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gIih1bmtub3duKSI7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjZnMubWV0YWRhdGEoKS5wYXJ0aXRpb25LZXlUeXBlLmdldFN0cmluZyhrZXkuZ2V0S2V5KCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIihjb3JydXB0ZWQ7IGhleCB2YWx1ZTogJXMpIiwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChrZXkuZ2V0S2V5KCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNjcnViKCkKLSAgICB7Ci0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gZmluaXNoZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoU3RyaW5nLmZvcm1hdCgiU2NydWJiaW5nICVzICglcykiLCBzc3RhYmxlLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShkYXRhRmlsZS5sZW5ndGgoKSkpKTsKLSAgICAgICAgdHJ5IChTU1RhYmxlUmV3cml0ZXIgd3JpdGVyID0gU1NUYWJsZVJld3JpdGVyLmNvbnN0cnVjdChjZnMsIHRyYW5zYWN0aW9uLCBmYWxzZSwgc3N0YWJsZS5tYXhEYXRhQWdlKTsKLSAgICAgICAgICAgICBSZWZzPFNTVGFibGVSZWFkZXI+IHJlZnMgPSBSZWZzLnJlZihDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3N0YWJsZSkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXh0SW5kZXhLZXkgPSBpbmRleEF2YWlsYWJsZSgpID8gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbmRleEZpbGUpIDogbnVsbDsKLSAgICAgICAgICAgIGlmIChpbmRleEF2YWlsYWJsZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHRocm93IGF3YXkgdmFyaWFibGUgc28gd2UgZG9uJ3QgaGF2ZSBhIHNpZGUgZWZmZWN0IGluIHRoZSBhc3NlcnQKLSAgICAgICAgICAgICAgICBsb25nIGZpcnN0Um93UG9zaXRpb25Gcm9tSW5kZXggPSByb3dJbmRleEVudHJ5U2VyaWFsaXplci5kZXNlcmlhbGl6ZVBvc2l0aW9uQW5kU2tpcChpbmRleEZpbGUpOwotICAgICAgICAgICAgICAgIGFzc2VydCBmaXJzdFJvd1Bvc2l0aW9uRnJvbUluZGV4ID09IDAgOiBmaXJzdFJvd1Bvc2l0aW9uRnJvbUluZGV4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdGF0c01ldGFkYXRhIG1ldGFkYXRhID0gc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKTsKLSAgICAgICAgICAgIHdyaXRlci5zd2l0Y2hXcml0ZXIoQ29tcGFjdGlvbk1hbmFnZXIuY3JlYXRlV3JpdGVyKGNmcywgZGVzdGluYXRpb24sIGV4cGVjdGVkQmxvb21GaWx0ZXJTaXplLCBtZXRhZGF0YS5yZXBhaXJlZEF0LCBtZXRhZGF0YS5wZW5kaW5nUmVwYWlyLCBtZXRhZGF0YS5pc1RyYW5zaWVudCwgc3N0YWJsZSwgdHJhbnNhY3Rpb24pKTsKLQotICAgICAgICAgICAgRGVjb3JhdGVkS2V5IHByZXZLZXkgPSBudWxsOwotCi0gICAgICAgICAgICB3aGlsZSAoIWRhdGFGaWxlLmlzRU9GKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNjcnViSW5mby5pc1N0b3BSZXF1ZXN0ZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbihzY3J1YkluZm8uZ2V0Q29tcGFjdGlvbkluZm8oKSk7Ci0KLSAgICAgICAgICAgICAgICBsb25nIHBhcnRpdGlvblN0YXJ0ID0gZGF0YUZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKCJSZWFkaW5nIHJvdyBhdCAiICsgcGFydGl0aW9uU3RhcnQpOwotCi0gICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHJhdyA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoZGF0YUZpbGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWNmcy5tZXRhZGF0YS5nZXRMb2NhbCgpLmlzSW5kZXgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5tZXRhZGF0YS5nZXRMb2NhbCgpLnBhcnRpdGlvbktleVR5cGUudmFsaWRhdGUocmF3KTsKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gc3N0YWJsZS5kZWNvcmF0ZUtleShyYXcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dJZkZhdGFsKHRoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG51bGwga2V5IGJlbG93Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdXBkYXRlSW5kZXhLZXkoKTsKLQotICAgICAgICAgICAgICAgIGxvbmcgZGF0YVN0YXJ0ID0gZGF0YUZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKLQotICAgICAgICAgICAgICAgIGxvbmcgZGF0YVN0YXJ0RnJvbUluZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgbG9uZyBkYXRhU2l6ZUZyb21JbmRleCA9IC0xOwotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXhLZXkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFTdGFydEZyb21JbmRleCA9IGN1cnJlbnRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCArIDIgKyBjdXJyZW50SW5kZXhLZXkucmVtYWluaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFTaXplRnJvbUluZGV4ID0gbmV4dFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4IC0gZGF0YVN0YXJ0RnJvbUluZGV4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFN0cmluZyBrZXlOYW1lID0ga2V5ID09IG51bGwgPyAiKHVucmVhZGFibGUga2V5KSIgOiBrZXlTdHJpbmcoa2V5KTsKLSAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKFN0cmluZy5mb3JtYXQoInBhcnRpdGlvbiAlcyBpcyAlcyIsIGtleU5hbWUsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGRhdGFTaXplRnJvbUluZGV4KSkpOwotICAgICAgICAgICAgICAgIGFzc2VydCBjdXJyZW50SW5kZXhLZXkgIT0gbnVsbCB8fCAhaW5kZXhBdmFpbGFibGUoKTsKLQotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXJyb3IobmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVhZCBwYXJ0aXRpb24ga2V5IGZyb20gZGF0YSBmaWxlIikpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXhLZXkgIT0gbnVsbCAmJiAha2V5LmdldEtleSgpLmVxdWFscyhjdXJyZW50SW5kZXhLZXkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FcnJvcihuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiS2V5IGZyb20gZGF0YSBmaWxlICglcykgZG9lcyBub3QgbWF0Y2gga2V5IGZyb20gaW5kZXggZmlsZSAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9CeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGtleS5nZXRLZXkoKSksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoY3VycmVudEluZGV4S2V5KSkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl90b28gYmlnXyIsIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoY3VycmVudEluZGV4S2V5KSkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleEZpbGUgIT0gbnVsbCAmJiBkYXRhU2l6ZUZyb21JbmRleCA+IGRhdGFGaWxlLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXJyb3IobmV3IElPRXhjZXB0aW9uKCJJbXBvc3NpYmxlIHBhcnRpdGlvbiBzaXplIChncmVhdGVyIHRoYW4gZmlsZSBsZW5ndGgpOiAiICsgZGF0YVNpemVGcm9tSW5kZXgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhGaWxlICE9IG51bGwgJiYgZGF0YVN0YXJ0ICE9IGRhdGFTdGFydEZyb21JbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybihTdHJpbmcuZm9ybWF0KCJEYXRhIGZpbGUgcGFydGl0aW9uIHBvc2l0aW9uICVkIGRpZmZlcnMgZnJvbSBpbmRleCBmaWxlIHJvdyBwb3NpdGlvbiAlZCIsIGRhdGFTdGFydCwgZGF0YVN0YXJ0RnJvbUluZGV4KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRyeUFwcGVuZChwcmV2S2V5LCBrZXksIHdyaXRlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2S2V5ID0ga2V5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dJZkZhdGFsKHRoKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKFN0cmluZy5mb3JtYXQoIkVycm9yIHJlYWRpbmcgcGFydGl0aW9uICVzIChzdGFja3RyYWNlIGZvbGxvd3MpOiIsIGtleU5hbWUpLCB0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleEtleSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoa2V5ID09IG51bGwgfHwgIWtleS5nZXRLZXkoKS5lcXVhbHMoY3VycmVudEluZGV4S2V5KSB8fCBkYXRhU3RhcnQgIT0gZGF0YVN0YXJ0RnJvbUluZGV4KSkKLSAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dChTdHJpbmcuZm9ybWF0KCJSZXRyeWluZyBmcm9tIHBhcnRpdGlvbiBpbmRleDsgZGF0YSBpcyAlcyBieXRlcyBzdGFydGluZyBhdCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplRnJvbUluZGV4LCBkYXRhU3RhcnRGcm9tSW5kZXgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHNzdGFibGUuZGVjb3JhdGVLZXkoY3VycmVudEluZGV4S2V5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2ZzLm1ldGFkYXRhLmdldExvY2FsKCkuaXNJbmRleCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0YWRhdGEuZ2V0TG9jYWwoKS5wYXJ0aXRpb25LZXlUeXBlLnZhbGlkYXRlKGtleS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpbGUuc2VlayhkYXRhU3RhcnRGcm9tSW5kZXgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyeUFwcGVuZChwcmV2S2V5LCBrZXksIHdyaXRlcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZLZXkgPSBrZXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoMikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0lmRmF0YWwodGgyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0lmQ2Fubm90Q29udGludWUoa2V5LCB0aDIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCJSZXRyeSBmYWlsZWQgdG9vLiBTa2lwcGluZyB0byBuZXh0IHBhcnRpdGlvbiAocmV0cnkncyBzdGFja3RyYWNlIGZvbGxvd3MpIiwgdGgyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRQYXJ0aXRpb25zKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWVrVG9OZXh0UGFydGl0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dJZkNhbm5vdENvbnRpbnVlKGtleSwgdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIlBhcnRpdGlvbiBzdGFydGluZyBhdCBwb3NpdGlvbiAiICsgZGF0YVN0YXJ0ICsgIiBpcyB1bnJlYWRhYmxlOyBza2lwcGluZyB0byBuZXh0Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiYWRQYXJ0aXRpb25zKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4S2V5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWVrVG9OZXh0UGFydGl0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIW91dE9mT3JkZXIuaXNFbXB0eSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG91dCBvZiBvcmRlciBwYXJ0aXRpb25zL3Jvd3MsIGJ1dCBubyBiYWQgcGFydGl0aW9uIGZvdW5kIC0gd2UgY2FuIGtlZXAgb3VyIHJlcGFpcmVkQXQgdGltZQotICAgICAgICAgICAgICAgIGxvbmcgcmVwYWlyZWRBdCA9IGJhZFBhcnRpdGlvbnMgPiAwID8gQWN0aXZlUmVwYWlyU2VydmljZS5VTlJFUEFJUkVEX1NTVEFCTEUgOiBzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLnJlcGFpcmVkQXQ7Ci0gICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBuZXdJbk9yZGVyU3N0YWJsZTsKLSAgICAgICAgICAgICAgICB0cnkgKFNTVGFibGVXcml0ZXIgaW5PcmRlcldyaXRlciA9IENvbXBhY3Rpb25NYW5hZ2VyLmNyZWF0ZVdyaXRlcihjZnMsIGRlc3RpbmF0aW9uLCBleHBlY3RlZEJsb29tRmlsdGVyU2l6ZSwgcmVwYWlyZWRBdCwgbWV0YWRhdGEucGVuZGluZ1JlcGFpciwgbWV0YWRhdGEuaXNUcmFuc2llbnQsIHNzdGFibGUsIHRyYW5zYWN0aW9uKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUGFydGl0aW9uIHBhcnRpdGlvbiA6IG91dE9mT3JkZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICBpbk9yZGVyV3JpdGVyLmFwcGVuZChwYXJ0aXRpb24udW5maWx0ZXJlZEl0ZXJhdG9yKCkpOwotICAgICAgICAgICAgICAgICAgICBuZXdJbk9yZGVyU3N0YWJsZSA9IGluT3JkZXJXcml0ZXIuZmluaXNoKC0xLCBzc3RhYmxlLm1heERhdGFBZ2UsIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi51cGRhdGUobmV3SW5PcmRlclNzdGFibGUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBmaW5pc2hlZC5hZGQobmV3SW5PcmRlclNzdGFibGUpOwotICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybihTdHJpbmcuZm9ybWF0KCIlZCBvdXQgb2Ygb3JkZXIgcGFydGl0aW9uIChvciBwYXJ0aXRpb25zIHdpdGggb3V0IG9mIG9yZGVyIHJvd3MpIGZvdW5kIHdoaWxlIHNjcnViYmluZyAlczsgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRob3NlIGhhdmUgYmVlbiB3cml0dGVuIChpbiBvcmRlcikgdG8gYSBuZXcgc3N0YWJsZSAoJXMpIiwgb3V0T2ZPcmRlci5zaXplKCksIHNzdGFibGUsIG5ld0luT3JkZXJTc3RhYmxlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGZpbmlzaCBvYnNvbGV0ZXMgdGhlIG9sZCBzc3RhYmxlCi0gICAgICAgICAgICBmaW5pc2hlZC5hZGRBbGwod3JpdGVyLnNldFJlcGFpcmVkQXQoYmFkUGFydGl0aW9ucyA+IDAgPyBBY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRSA6IHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkucmVwYWlyZWRBdCkuZmluaXNoKCkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbi5pc09mZmxpbmUoKSkKLSAgICAgICAgICAgICAgICBmaW5pc2hlZC5mb3JFYWNoKHNzdGFibGUgLT4gc3N0YWJsZS5zZWxmUmVmKCkucmVsZWFzZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZmluaXNoZWQuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiU2NydWIgb2YgIiArIHNzdGFibGUgKyAiIGNvbXBsZXRlOiAiICsgZ29vZFBhcnRpdGlvbnMgKyAiIHBhcnRpdGlvbnMgaW4gbmV3IHNzdGFibGUgYW5kICIgKyBlbXB0eVBhcnRpdGlvbnMgKyAiIGVtcHR5ICh0b21ic3RvbmVkKSBwYXJ0aXRpb25zIGRyb3BwZWQiKTsKLSAgICAgICAgICAgIGlmIChuZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljcy5maXhlZFJvd3MgPiAwKQotICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJGaXhlZCAiICsgbmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3MuZml4ZWRSb3dzICsgIiByb3dzIHdpdGggb3ZlcmZsb3dlZCBsb2NhbCBkZWxldGlvbiB0aW1lLiIpOwotICAgICAgICAgICAgaWYgKGJhZFBhcnRpdGlvbnMgPiAwKQotICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiVW5hYmxlIHRvIHJlY292ZXIgIiArIGJhZFBhcnRpdGlvbnMgKyAiIHBhcnRpdGlvbnMgdGhhdCB3ZXJlIHNraXBwZWQuICBZb3UgY2FuIGF0dGVtcHQgbWFudWFsIHJlY292ZXJ5IGZyb20gdGhlIHByZS1zY3J1YiBzbmFwc2hvdC4gIFlvdSBjYW4gYWxzbyBydW4gbm9kZXRvb2wgcmVwYWlyIHRvIHRyYW5zZmVyIHRoZSBkYXRhIGZyb20gYSBoZWFsdGh5IHJlcGxpY2EsIGlmIGFueSIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJhZFBhcnRpdGlvbnMgPiAwKQotICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiTm8gdmFsaWQgcGFydGl0aW9ucyBmb3VuZCB3aGlsZSBzY3J1YmJpbmcgIiArIHNzdGFibGUgKyAiOyBpdCBpcyBtYXJrZWQgZm9yIGRlbGV0aW9uIG5vdy4gSWYgeW91IHdhbnQgdG8gYXR0ZW1wdCBtYW51YWwgcmVjb3ZlcnksIHlvdSBjYW4gZmluZCBhIGNvcHkgaW4gdGhlIHByZS1zY3J1YiBzbmFwc2hvdCIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJTY3J1YiBvZiAiICsgc3N0YWJsZSArICIgY29tcGxldGU7IGxvb2tzIGxpa2UgYWxsICIgKyBlbXB0eVBhcnRpdGlvbnMgKyAiIHBhcnRpdGlvbnMgd2VyZSB0b21ic3RvbmVkIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHByaXZhdGUgYm9vbGVhbiB0cnlBcHBlbmQoRGVjb3JhdGVkS2V5IHByZXZLZXksIERlY29yYXRlZEtleSBrZXksIFNTVGFibGVSZXdyaXRlciB3cml0ZXIpCi0gICAgewotICAgICAgICAvLyBPcmRlckNoZWNrZXJJdGVyYXRvciB3aWxsIGNoZWNrLCBhdCBpdGVyYXRpb24gdGltZSwgdGhhdCB0aGUgcm93cyBhcmUgaW4gdGhlIHByb3BlciBvcmRlci4gSWYgaXQgZGV0ZWN0cwotICAgICAgICAvLyB0aGF0IG9uZSByb3cgaXMgb3V0IG9mIG9yZGVyLCBpdCB3aWxsIHN0b3AgcmV0dXJuaW5nIHRoZW0uIFRoZSByZW1haW5pbmcgcm93cyB3aWxsIGJlIHNvcnRlZCBhbmQgYWRkZWQKLSAgICAgICAgLy8gdG8gdGhlIG91dE9mT3JkZXIgc2V0IHRoYXQgd2lsbCBiZSBsYXRlciB3cml0dGVuIHRvIGEgbmV3IFNTVGFibGUuCi0gICAgICAgIE9yZGVyQ2hlY2tlckl0ZXJhdG9yIHNzdGFibGVJdGVyYXRvciA9IG5ldyBPcmRlckNoZWNrZXJJdGVyYXRvcihnZXRJdGVyYXRvcihrZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLm1ldGFkYXRhKCkuY29tcGFyYXRvcik7Ci0KLSAgICAgICAgdHJ5IChVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IgPSB3aXRoVmFsaWRhdGlvbihzc3RhYmxlSXRlcmF0b3IsIGRhdGFGaWxlLmdldFBhdGgoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwcmV2S2V5ICE9IG51bGwgJiYgcHJldktleS5jb21wYXJlVG8oa2V5KSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2F2ZU91dE9mT3JkZXJQYXJ0aXRpb24ocHJldktleSwga2V5LCBpdGVyYXRvcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAod3JpdGVyLnRyeUFwcGVuZChpdGVyYXRvcikgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICBlbXB0eVBhcnRpdGlvbnMrKzsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBnb29kUGFydGl0aW9ucysrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNzdGFibGVJdGVyYXRvci5oYXNSb3dzT3V0T2ZPcmRlcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oU3RyaW5nLmZvcm1hdCgiT3V0IG9mIG9yZGVyIHJvd3MgZm91bmQgaW4gcGFydGl0aW9uOiAlcyIsIGtleVN0cmluZyhrZXkpKSk7Ci0gICAgICAgICAgICBvdXRPZk9yZGVyLmFkZChzc3RhYmxlSXRlcmF0b3IuZ2V0Um93c091dE9mT3JkZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBPbmx5IHdyYXAgd2l0aCB7QGxpbmsgRml4TmVnYXRpdmVMb2NhbERlbGV0aW9uVGltZUl0ZXJhdG9yfSBpZiB7QGxpbmsgI3JlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3N9IG9wdGlvbgotICAgICAqIGlzIHNwZWNpZmllZAotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgcHJpdmF0ZSBVbmZpbHRlcmVkUm93SXRlcmF0b3IgZ2V0SXRlcmF0b3IoRGVjb3JhdGVkS2V5IGtleSkKLSAgICB7Ci0gICAgICAgIFJvd01lcmdpbmdTU1RhYmxlSXRlcmF0b3Igcm93TWVyZ2luZ0l0ZXJhdG9yID0gbmV3IFJvd01lcmdpbmdTU1RhYmxlSXRlcmF0b3IoU1NUYWJsZUlkZW50aXR5SXRlcmF0b3IuY3JlYXRlKHNzdGFibGUsIGRhdGFGaWxlLCBrZXkpKTsKLSAgICAgICAgcmV0dXJuIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MgPyBuZXcgRml4TmVnYXRpdmVMb2NhbERlbGV0aW9uVGltZUl0ZXJhdG9yKHJvd01lcmdpbmdJdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljcykgOiByb3dNZXJnaW5nSXRlcmF0b3I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUluZGV4S2V5KCkKLSAgICB7Ci0gICAgICAgIGN1cnJlbnRJbmRleEtleSA9IG5leHRJbmRleEtleTsKLSAgICAgICAgY3VycmVudFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4ID0gbmV4dFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4OwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbmV4dEluZGV4S2V5ID0gIWluZGV4QXZhaWxhYmxlKCkgPyBudWxsIDogQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbmRleEZpbGUpOwotCi0gICAgICAgICAgICBuZXh0UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXggPSAhaW5kZXhBdmFpbGFibGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkYXRhRmlsZS5sZW5ndGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByb3dJbmRleEVudHJ5U2VyaWFsaXplci5kZXNlcmlhbGl6ZVBvc2l0aW9uQW5kU2tpcChpbmRleEZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEpWTVN0YWJpbGl0eUluc3BlY3Rvci5pbnNwZWN0VGhyb3dhYmxlKHRoKTsKLSAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiRXJyb3IgcmVhZGluZyBpbmRleCBmaWxlIiwgdGgpOwotICAgICAgICAgICAgbmV4dEluZGV4S2V5ID0gbnVsbDsKLSAgICAgICAgICAgIG5leHRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCA9IGRhdGFGaWxlLmxlbmd0aCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGluZGV4QXZhaWxhYmxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmRleEZpbGUgIT0gbnVsbCAmJiAhaW5kZXhGaWxlLmlzRU9GKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNlZWtUb05leHRQYXJ0aXRpb24oKQotICAgIHsKLSAgICAgICAgd2hpbGUobmV4dFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4IDwgZGF0YUZpbGUubGVuZ3RoKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRhdGFGaWxlLnNlZWsobmV4dFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3dJZkZhdGFsKHRoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHRvIHNlZWsgdG8gbmV4dCBwYXJ0aXRpb24gcG9zaXRpb24gJWQiLCBuZXh0UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXgpLCB0aCk7Ci0gICAgICAgICAgICAgICAgYmFkUGFydGl0aW9ucysrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1cGRhdGVJbmRleEtleSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzYXZlT3V0T2ZPcmRlclBhcnRpdGlvbihEZWNvcmF0ZWRLZXkgcHJldktleSwgRGVjb3JhdGVkS2V5IGtleSwgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yKQotICAgIHsKLSAgICAgICAgLy8gVE9ETyBiaXRjaCBpZiB0aGUgcm93IGlzIHRvbyBsYXJnZT8gIGlmIGl0IGlzIHRoZXJlJ3Mgbm90IG11Y2ggd2UgY2FuIGRvIC4uLgotICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oU3RyaW5nLmZvcm1hdCgiT3V0IG9mIG9yZGVyIHBhcnRpdGlvbiBkZXRlY3RlZCAoJXMgZm91bmQgYWZ0ZXIgJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5U3RyaW5nKGtleSksIGtleVN0cmluZyhwcmV2S2V5KSkpOwotICAgICAgICBvdXRPZk9yZGVyLmFkZChJbW11dGFibGVCVHJlZVBhcnRpdGlvbi5jcmVhdGUoaXRlcmF0b3IpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZkZhdGFsKFRocm93YWJsZSB0aCkKLSAgICB7Ci0gICAgICAgIGlmICh0aCBpbnN0YW5jZW9mIEVycm9yICYmICEodGggaW5zdGFuY2VvZiBBc3NlcnRpb25FcnJvciB8fCB0aCBpbnN0YW5jZW9mIElPRXJyb3IpKQotICAgICAgICAgICAgdGhyb3cgKEVycm9yKSB0aDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZkNhbm5vdENvbnRpbnVlKERlY29yYXRlZEtleSBrZXksIFRocm93YWJsZSB0aCkKLSAgICB7Ci0gICAgICAgIGlmIChpc0luZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oU3RyaW5nLmZvcm1hdCgiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2NydWJiaW5nIHRoZSBwYXJ0aXRpb24gd2l0aCBrZXkgJyVzJyBmb3IgYW4gaW5kZXggdGFibGUuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjcnViYmluZyB3aWxsIGFib3J0IGZvciB0aGlzIHRhYmxlIGFuZCB0aGUgaW5kZXggd2lsbCBiZSByZWJ1aWx0LiIsIGtleVN0cmluZyhrZXkpKSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FcnJvcih0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaXNDb21tdXRhdGl2ZSAmJiAhc2tpcENvcnJ1cHRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKFN0cmluZy5mb3JtYXQoIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNjcnViYmluZyB0aGUgcGFydGl0aW9uIHdpdGgga2V5ICclcycuICBTa2lwcGluZyBjb3JydXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEgaW4gY291bnRlciB0YWJsZXMgd2lsbCByZXN1bHQgaW4gdW5kZXJjb3VudHMgZm9yIHRoZSBhZmZlY3RlZCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VudGVycyAoc2VlIENBU1NBTkRSQS0yNzU5IGZvciBtb3JlIGRldGFpbHMpLCBzbyBieSBkZWZhdWx0IHRoZSBzY3J1YiB3aWxsICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0b3AgYXQgdGhpcyBwb2ludC4gIElmIHlvdSB3b3VsZCBsaWtlIHRvIHNraXAgdGhlIHJvdyBhbnl3YXkgYW5kIGNvbnRpbnVlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjcnViYmluZywgcmUtcnVuIHRoZSBzY3J1YiB3aXRoIHRoZSAtLXNraXAtY29ycnVwdGVkIG9wdGlvbi4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5U3RyaW5nKGtleSkpKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0Vycm9yKHRoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICB7Ci0gICAgICAgIGZpbGVBY2Nlc3NMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkoZGF0YUZpbGUpOwotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShpbmRleEZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsZUFjY2Vzc0xvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGFjdGlvbkluZm8uSG9sZGVyIGdldFNjcnViSW5mbygpCi0gICAgewotICAgICAgICByZXR1cm4gc2NydWJJbmZvOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNjcnViSW5mbyBleHRlbmRzIENvbXBhY3Rpb25JbmZvLkhvbGRlcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSYW5kb21BY2Nlc3NSZWFkZXIgZGF0YUZpbGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU1NUYWJsZVJlYWRlciBzc3RhYmxlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFRpbWVVVUlEIHNjcnViQ29tcGFjdGlvbklkOwotICAgICAgICBwcml2YXRlIGZpbmFsIExvY2sgZmlsZVJlYWRMb2NrOwotCi0gICAgICAgIHB1YmxpYyBTY3J1YkluZm8oUmFuZG9tQWNjZXNzUmVhZGVyIGRhdGFGaWxlLCBTU1RhYmxlUmVhZGVyIHNzdGFibGUsIExvY2sgZmlsZVJlYWRMb2NrKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmRhdGFGaWxlID0gZGF0YUZpbGU7Ci0gICAgICAgICAgICB0aGlzLnNzdGFibGUgPSBzc3RhYmxlOwotICAgICAgICAgICAgdGhpcy5maWxlUmVhZExvY2sgPSBmaWxlUmVhZExvY2s7Ci0gICAgICAgICAgICBzY3J1YkNvbXBhY3Rpb25JZCA9IG5leHRUaW1lVVVJRCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsZVJlYWRMb2NrLmxvY2soKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8oc3N0YWJsZS5tZXRhZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uVHlwZS5TQ1JVQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWxlLmdldEZpbGVQb2ludGVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmlsZS5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcnViQ29tcGFjdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlU2V0Lm9mKHNzdGFibGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxlUmVhZExvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBTY3J1YlJlc3VsdCBzY3J1YldpdGhSZXN1bHQoKQotICAgIHsKLSAgICAgICAgc2NydWIoKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTY3J1YlJlc3VsdCh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNjcnViUmVzdWx0Ci0gICAgewotICAgICAgICBwdWJsaWMgZmluYWwgaW50IGdvb2RQYXJ0aXRpb25zOwotICAgICAgICBwdWJsaWMgZmluYWwgaW50IGJhZFBhcnRpdGlvbnM7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZW1wdHlQYXJ0aXRpb25zOwotCi0gICAgICAgIHB1YmxpYyBTY3J1YlJlc3VsdChTY3J1YmJlciBzY3J1YmJlcikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5nb29kUGFydGl0aW9ucyA9IHNjcnViYmVyLmdvb2RQYXJ0aXRpb25zOwotICAgICAgICAgICAgdGhpcy5iYWRQYXJ0aXRpb25zID0gc2NydWJiZXIuYmFkUGFydGl0aW9uczsKLSAgICAgICAgICAgIHRoaXMuZW1wdHlQYXJ0aXRpb25zID0gc2NydWJiZXIuZW1wdHlQYXJ0aXRpb25zOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE5lZ2F0aXZlTG9jYWxEZWxldGlvbkluZm9NZXRyaWNzCi0gICAgewotICAgICAgICBwdWJsaWMgdm9sYXRpbGUgaW50IGZpeGVkUm93cyA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRHVyaW5nIDIueCBtaWdyYXRpb24sIHVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcyByb3dzIG1pZ2h0IGhhdmUgZ290dGVuIGR1cGxpY2F0ZWQuCi0gICAgICogTWVyZ2luZyBpdGVyYXRvciBtZXJnZXMgcm93cyB3aXRoIHNhbWUgY2x1c3RlcmluZy4KLSAgICAgKgotICAgICAqIEZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvIENBU1NBTkRSQS0xMjE0NC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSb3dNZXJnaW5nU1NUYWJsZUl0ZXJhdG9yIGV4dGVuZHMgV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3IKLSAgICB7Ci0gICAgICAgIFVuZmlsdGVyZWQgbmV4dFRvT2ZmZXIgPSBudWxsOwotCi0gICAgICAgIFJvd01lcmdpbmdTU1RhYmxlSXRlcmF0b3IoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHNvdXJjZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoc291cmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5leHRUb09mZmVyICE9IG51bGwgfHwgd3JhcHBlZC5oYXNOZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFVuZmlsdGVyZWQgbmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFVuZmlsdGVyZWQgbmV4dCA9IG5leHRUb09mZmVyICE9IG51bGwgPyBuZXh0VG9PZmZlciA6IHdyYXBwZWQubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAobmV4dC5pc1JvdygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICh3cmFwcGVkLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWQgcGVlayA9IHdyYXBwZWQubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXBlZWsuaXNSb3coKSB8fCAhbmV4dC5jbHVzdGVyaW5nKCkuZXF1YWxzKHBlZWsuY2x1c3RlcmluZygpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRvT2ZmZXIgPSBwZWVrOyAvLyBPZmZlciBwZWVrIGluIG5leHQgY2FsbAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBEdXBsaWNhdGUgcm93LCBtZXJnZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IFJvd3MubWVyZ2UoKFJvdykgbmV4dCwgKFJvdykgcGVlayk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBuZXh0VG9PZmZlciA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gbmV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluIHNvbWUgY2FzZSBsaWtlIENBU1NBTkRSQS0xMjEyNyB0aGUgY2VsbHMgbWlnaHQgaGF2ZSBiZWVuIHN0b3JlZCBpbiB0aGUgd3Jvbmcgb3JkZXIuIFRoaXMgZGVjb3JhdG9yIGNoZWNrIHRoZQotICAgICAqIGNlbGxzIG9yZGVyIGFuZCBjb2xsZWN0IHRoZSBvdXQgb2Ygb3JkZXIgY2VsbHMgdG8gY29ycmVjdCB0aGUgcHJvYmxlbS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBPcmRlckNoZWNrZXJJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0SXRlcmF0b3I8VW5maWx0ZXJlZD4gaW1wbGVtZW50cyBVbmZpbHRlcmVkUm93SXRlcmF0b3IKLSAgICB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVjb3JhdGVkIGl0ZXJhdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3I7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yOwotCi0gICAgICAgIHByaXZhdGUgVW5maWx0ZXJlZCBwcmV2aW91czsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHBhcnRpdGlvbiBjb250YWluaW5nIHRoZSByb3dzIHdoaWNoIGFyZSBvdXQgb2Ygb3JkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIFBhcnRpdGlvbiByb3dzT3V0T2ZPcmRlcjsKLQotICAgICAgICBwdWJsaWMgT3JkZXJDaGVja2VySXRlcmF0b3IoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yLCBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IubWV0YWRhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmV2ZXJzZU9yZGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmlzUmV2ZXJzZU9yZGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1ucygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5jb2x1bW5zKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5wYXJ0aXRpb25LZXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBSb3cgc3RhdGljUm93KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLnN0YXRpY1JvdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IuaXNFbXB0eSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpdGVyYXRvci5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBFbmNvZGluZ1N0YXRzIHN0YXRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLnN0YXRzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNSb3dzT3V0T2ZPcmRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3dzT3V0T2ZPcmRlciAhPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFBhcnRpdGlvbiBnZXRSb3dzT3V0T2ZPcmRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3dzT3V0T2ZPcmRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIGNvbXB1dGVOZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOwotCi0gICAgICAgICAgICBVbmZpbHRlcmVkIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgIC8vIElmIHdlIGRldGVjdCB0aGF0IHNvbWUgcm93cyBhcmUgb3V0IG9mIG9yZGVyIHdlIHdpbGwgc3RvcmUgYW5kIHNvcnQgdGhlIHJlbWFpbmluZyBvbmVzIHRvIGluc2VydCB0aGVtCi0gICAgICAgICAgICAvLyBpbiBhIHNlcGFyYXRlIFNTVGFibGUuCi0gICAgICAgICAgICBpZiAocHJldmlvdXMgIT0gbnVsbCAmJiBjb21wYXJhdG9yLmNvbXBhcmUobmV4dCwgcHJldmlvdXMpIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByb3dzT3V0T2ZPcmRlciA9IEltbXV0YWJsZUJUcmVlUGFydGl0aW9uLmNyZWF0ZShVbmZpbHRlcmVkUm93SXRlcmF0b3JzLmNvbmNhdChuZXh0LCBpdGVyYXRvciksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW5kT2ZEYXRhKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmV2aW91cyA9IG5leHQ7Ci0gICAgICAgICAgICByZXR1cm4gbmV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgaXRlcmF0b3IgY29udmVydHMgbmVnYXRpdmUge0BsaW5rIEFic3RyYWN0Q2VsbCNsb2NhbERlbGV0aW9uVGltZSgpfSBpbnRvIHtAbGluayBBYnN0cmFjdENlbGwjTUFYX0RFTEVUSU9OX1RJTUV9Ci0gICAgICoKLSAgICAgKiBUaGlzIGlzIHRvIHJlY292ZXIgZW50cmllcyB3aXRoIG92ZXJmbG93ZWQgbG9jYWxFeHBpcmF0aW9uVGltZSBkdWUgdG8gQ0FTU0FORFJBLTE0MDkyCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRml4TmVnYXRpdmVMb2NhbERlbGV0aW9uVGltZUl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvcjxVbmZpbHRlcmVkPiBpbXBsZW1lbnRzIFVuZmlsdGVyZWRSb3dJdGVyYXRvcgotICAgIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWNvcmF0ZWQgaXRlcmF0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGZpbmFsIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvcjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBOZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljcyBuZWdhdGl2ZUxvY2FsRXhwaXJhdGlvblRpbWVNZXRyaWNzOwotCi0gICAgICAgIHB1YmxpYyBGaXhOZWdhdGl2ZUxvY2FsRGVsZXRpb25UaW1lSXRlcmF0b3IoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yLCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3MgbmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLSAgICAgICAgICAgIHRoaXMub3V0cHV0SGFuZGxlciA9IG91dHB1dEhhbmRsZXI7Ci0gICAgICAgICAgICB0aGlzLm5lZ2F0aXZlTG9jYWxFeHBpcmF0aW9uVGltZU1ldHJpY3MgPSBuZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLm1ldGFkYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JldmVyc2VPcmRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5pc1JldmVyc2VPcmRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IuY29sdW1ucygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXkoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IucGFydGl0aW9uS2V5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUm93IHN0YXRpY1JvdygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5zdGF0aWNSb3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmlzRW1wdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICAgICAgewotICAgICAgICAgICAgaXRlcmF0b3IuY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEZWxldGlvblRpbWUgcGFydGl0aW9uTGV2ZWxEZWxldGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5wYXJ0aXRpb25MZXZlbERlbGV0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRW5jb2RpbmdTdGF0cyBzdGF0cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5zdGF0cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWQgY29tcHV0ZU5leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZW5kT2ZEYXRhKCk7Ci0KLSAgICAgICAgICAgIFVuZmlsdGVyZWQgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIGlmICghbmV4dC5pc1JvdygpKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OwotCi0gICAgICAgICAgICBpZiAoaGFzTmVnYXRpdmVMb2NhbEV4cGlyYXRpb25UaW1lKChSb3cpIG5leHQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIuZGVidWcoU3RyaW5nLmZvcm1hdCgiRm91bmQgcm93IHdpdGggbmVnYXRpdmUgbG9jYWwgZXhwaXJhdGlvbiB0aW1lOiAlcyIsIG5leHQudG9TdHJpbmcobWV0YWRhdGEoKSwgZmFsc2UpKSk7Ci0gICAgICAgICAgICAgICAgbmVnYXRpdmVMb2NhbEV4cGlyYXRpb25UaW1lTWV0cmljcy5maXhlZFJvd3MrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gZml4TmVnYXRpdmVMb2NhbEV4cGlyYXRpb25UaW1lKChSb3cpIG5leHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNOZWdhdGl2ZUxvY2FsRXhwaXJhdGlvblRpbWUoUm93IG5leHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvdyByb3cgPSBuZXh0OwotICAgICAgICAgICAgaWYgKHJvdy5wcmltYXJ5S2V5TGl2ZW5lc3NJbmZvKCkuaXNFeHBpcmluZygpICYmIHJvdy5wcmltYXJ5S2V5TGl2ZW5lc3NJbmZvKCkubG9jYWxFeHBpcmF0aW9uVGltZSgpIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChDb2x1bW5EYXRhIGNkIDogcm93KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjZC5jb2x1bW4oKS5pc1NpbXBsZSgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ2VsbDw/PiBjZWxsID0gKENlbGw8Pz4pY2Q7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjZWxsLmlzRXhwaXJpbmcoKSAmJiBjZWxsLmxvY2FsRGVsZXRpb25UaW1lKCkgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbXBsZXhDb2x1bW5EYXRhIGNvbXBsZXhEYXRhID0gKENvbXBsZXhDb2x1bW5EYXRhKWNkOwotICAgICAgICAgICAgICAgICAgICBmb3IgKENlbGw8Pz4gY2VsbCA6IGNvbXBsZXhEYXRhKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5pc0V4cGlyaW5nKCkgJiYgY2VsbC5sb2NhbERlbGV0aW9uVGltZSgpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBVbmZpbHRlcmVkIGZpeE5lZ2F0aXZlTG9jYWxFeHBpcmF0aW9uVGltZShSb3cgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXZlbmVzc0luZm8gbGl2ZW5lc3NJbmZvID0gcm93LnByaW1hcnlLZXlMaXZlbmVzc0luZm8oKTsKLSAgICAgICAgICAgIGlmIChsaXZlbmVzc0luZm8uaXNFeHBpcmluZygpICYmIGxpdmVuZXNzSW5mby5sb2NhbEV4cGlyYXRpb25UaW1lKCkgPCAwKQotICAgICAgICAgICAgICAgIGxpdmVuZXNzSW5mbyA9IGxpdmVuZXNzSW5mby53aXRoVXBkYXRlZFRpbWVzdGFtcEFuZExvY2FsRGVsZXRpb25UaW1lKGxpdmVuZXNzSW5mby50aW1lc3RhbXAoKSArIDEsIEFic3RyYWN0Q2VsbC5NQVhfREVMRVRJT05fVElNRSk7Ci0KLSAgICAgICAgICAgIHJldHVybiByb3cudHJhbnNmb3JtQW5kRmlsdGVyKGxpdmVuZXNzSW5mbywgcm93LmRlbGV0aW9uKCksIGNkIC0+IHsKLSAgICAgICAgICAgICAgICBpZiAoY2QuY29sdW1uKCkuaXNTaW1wbGUoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENlbGwgY2VsbCA9IChDZWxsKWNkOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2VsbC5pc0V4cGlyaW5nKCkgJiYgY2VsbC5sb2NhbERlbGV0aW9uVGltZSgpIDwgMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjZWxsLndpdGhVcGRhdGVkVGltZXN0YW1wQW5kTG9jYWxEZWxldGlvblRpbWUoY2VsbC50aW1lc3RhbXAoKSArIDEsIEFic3RyYWN0Q2VsbC5NQVhfREVMRVRJT05fVElNRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2VsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29tcGxleENvbHVtbkRhdGEgY29tcGxleERhdGEgPSAoQ29tcGxleENvbHVtbkRhdGEpY2Q7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wbGV4RGF0YS50cmFuc2Zvcm1BbmRGaWx0ZXIoY2VsbCAtPiBjZWxsLmlzRXhwaXJpbmcoKSAmJiBjZWxsLmxvY2FsRGVsZXRpb25UaW1lKCkgPCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNlbGwud2l0aFVwZGF0ZWRUaW1lc3RhbXBBbmRMb2NhbERlbGV0aW9uVGltZShjZWxsLnRpbWVzdGFtcCgpICsgMSwgQWJzdHJhY3RDZWxsLk1BWF9ERUxFVElPTl9USU1FKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjZWxsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KS5jbG9uZShIZWFwQ2xvbmVyLmluc3RhbmNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vU2luZ2xlU1NUYWJsZUxDU1Rhc2suamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vU2luZ2xlU1NUYWJsZUxDU1Rhc2suamF2YQppbmRleCAyZTFkZmZjLi4xZjczYzRjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1NpbmdsZVNTVGFibGVMQ1NUYXNrLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9TaW5nbGVTU1RhYmxlTENTVGFzay5qYXZhCkBAIC0yNyw4ICsyNyw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi53cml0ZXJzLkNvbXBhY3Rpb25Bd2FyZVdyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7CiAKQEAgLTgyLDcgKzgyLDcgQEAKICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5hYm9ydCgpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbih0LCBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24odCwgc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjZnMuZ2V0VHJhY2tlcigpLm5vdGlmeVNTVGFibGVNZXRhZGF0YUNoYW5nZWQoc3N0YWJsZSwgbWV0YWRhdGFCZWZvcmUpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1RpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneS5qYXZhCmluZGV4IDU1NWQ4NmEuLmMxMGQzYTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneS5qYXZhCkBAIC0zMCw2ICszMCw4IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lio7CkBAIC01Nyw2ICs1OSw5IEBACiAgICAgcHJpdmF0ZSBsb25nIGxhc3RFeHBpcmVkQ2hlY2s7CiAgICAgcHJpdmF0ZSBsb25nIGhpZ2hlc3RXaW5kb3dTZWVuOwogCisgICAgLy8gVGhpcyBpcyBhY2Nlc3NlZCBpbiBib3RoIHRoZSB0aHJlYWRpbmcgY29udGV4dCBvZiBjb21wYWN0aW9uIC8gcmVwYWlyIGFuZCBhbHNvIEpNWAorICAgIHByaXZhdGUgdm9sYXRpbGUgTWFwPExvbmcsIEludGVnZXI+IHNzdGFibGVDb3VudEJ5QnVja2V0cyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisKICAgICBwdWJsaWMgVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneShDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucykKICAgICB7CiAgICAgICAgIHN1cGVyKGNmcywgb3B0aW9ucyk7CkBAIC0xNzksNiArMTg0LDcgQEAKICAgICAgICAgICAgICAgICB0aGlzLmhpZ2hlc3RXaW5kb3dTZWVuKTsKIAogICAgICAgICB0aGlzLmVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzID0gbW9zdEludGVyZXN0aW5nLmVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzOworICAgICAgICB0aGlzLnNzdGFibGVDb3VudEJ5QnVja2V0cyA9IGJ1Y2tldHMubGVmdC5rZXlTZXQoKS5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoRnVuY3Rpb24uaWRlbnRpdHkoKSwgayAtPiBidWNrZXRzLmxlZnQuZ2V0KGspLnNpemUoKSkpOwogICAgICAgICBpZiAoIW1vc3RJbnRlcmVzdGluZy5zc3RhYmxlcy5pc0VtcHR5KCkpCiAgICAgICAgICAgICByZXR1cm4gbW9zdEludGVyZXN0aW5nLnNzdGFibGVzOwogICAgICAgICByZXR1cm4gbnVsbDsKQEAgLTQyNiw2ICs0MzIsMTAgQEAKICAgICAgICAgcmV0dXJuIExvbmcuTUFYX1ZBTFVFOwogICAgIH0KIAorICAgIHB1YmxpYyBNYXA8TG9uZywgSW50ZWdlcj4gZ2V0U1NUYWJsZUNvdW50QnlCdWNrZXRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzc3RhYmxlQ291bnRCeUJ1Y2tldHM7CisgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHZhbGlkYXRlT3B0aW9ucyhNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9UaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9UaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5qYXZhCmluZGV4IDhiMmJhMjMuLmI5MzEyYTAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1RpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLmphdmEKQEAgLTI2LDkgKzI2LDEwIEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQUxMT1dfVU5TQUZFX0FHR1JFU1NJVkVfU1NUQUJMRV9FWFBJUkFUSU9OOworCiBwdWJsaWMgZmluYWwgY2xhc3MgVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuY2xhc3MpOwpAQCAtMzksMTMgKzQwLDEzIEBACiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9FWFBJUkVEX1NTVEFCTEVfQ0hFQ0tfRlJFUVVFTkNZX1NFQ09ORFMgPSA2MCAqIDEwOwogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBERUZBVUxUX1VOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTiA9IGZhbHNlOwogCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVNUQU1QX1JFU09MVVRJT05fS0VZID0gInRpbWVzdGFtcF9yZXNvbHV0aW9uIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQUNUSU9OX1dJTkRPV19VTklUX0tFWSA9ICJjb21wYWN0aW9uX3dpbmRvd191bml0IjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QQUNUSU9OX1dJTkRPV19TSVpFX0tFWSA9ICJjb21wYWN0aW9uX3dpbmRvd19zaXplIjsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBJUkVEX1NTVEFCTEVfQ0hFQ0tfRlJFUVVFTkNZX1NFQ09ORFNfS0VZID0gImV4cGlyZWRfc3N0YWJsZV9jaGVja19mcmVxdWVuY3lfc2Vjb25kcyI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TQUZFX0FHR1JFU1NJVkVfU1NUQUJMRV9FWFBJUkFUSU9OX0tFWSA9ICJ1bnNhZmVfYWdncmVzc2l2ZV9zc3RhYmxlX2V4cGlyYXRpb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTVEFNUF9SRVNPTFVUSU9OX0tFWSA9ICJ0aW1lc3RhbXBfcmVzb2x1dGlvbiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFDVElPTl9XSU5ET1dfVU5JVF9LRVkgPSAiY29tcGFjdGlvbl93aW5kb3dfdW5pdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFDVElPTl9XSU5ET1dfU0laRV9LRVkgPSAiY29tcGFjdGlvbl93aW5kb3dfc2l6ZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQSVJFRF9TU1RBQkxFX0NIRUNLX0ZSRVFVRU5DWV9TRUNPTkRTX0tFWSA9ICJleHBpcmVkX3NzdGFibGVfY2hlY2tfZnJlcXVlbmN5X3NlY29uZHMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTl9LRVkgPSAidW5zYWZlX2FnZ3Jlc3NpdmVfc3N0YWJsZV9leHBpcmF0aW9uIjsKIAotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5TQUZFX0FHR1JFU1NJVkVfU1NUQUJMRV9FWFBJUkFUSU9OX1BST1BFUlRZID0gQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJhbGxvd191bnNhZmVfYWdncmVzc2l2ZV9zc3RhYmxlX2V4cGlyYXRpb24iOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIFVOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTl9FTkFCTEVEID0gQUxMT1dfVU5TQUZFX0FHR1JFU1NJVkVfU1NUQUJMRV9FWFBJUkFUSU9OLmdldEJvb2xlYW4oKTsKIAogICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgc3N0YWJsZVdpbmRvd1NpemU7CiAgICAgcHJvdGVjdGVkIGZpbmFsIFRpbWVVbml0IHNzdGFibGVXaW5kb3dVbml0OwpAQCAtNzUsNyArNzYsNyBAQAogICAgICAgICBleHBpcmVkU1NUYWJsZUNoZWNrRnJlcXVlbmN5ID0gVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQob3B0aW9uVmFsdWUgPT0gbnVsbCA/IERFRkFVTFRfRVhQSVJFRF9TU1RBQkxFX0NIRUNLX0ZSRVFVRU5DWV9TRUNPTkRTIDogTG9uZy5wYXJzZUxvbmcob3B0aW9uVmFsdWUpLCBUaW1lVW5pdC5TRUNPTkRTKTsKIAogICAgICAgICBvcHRpb25WYWx1ZSA9IG9wdGlvbnMuZ2V0KFVOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTl9LRVkpOwotICAgICAgICBpZ25vcmVPdmVybGFwcyA9IG9wdGlvblZhbHVlID09IG51bGwgPyBERUZBVUxUX1VOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTiA6IChCb29sZWFuLmdldEJvb2xlYW4oVU5TQUZFX0FHR1JFU1NJVkVfU1NUQUJMRV9FWFBJUkFUSU9OX1BST1BFUlRZKSAmJiBCb29sZWFuLnBhcnNlQm9vbGVhbihvcHRpb25WYWx1ZSkpOworICAgICAgICBpZ25vcmVPdmVybGFwcyA9IG9wdGlvblZhbHVlID09IG51bGwgPyBERUZBVUxUX1VOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTiA6IChVTlNBRkVfQUdHUkVTU0lWRV9TU1RBQkxFX0VYUElSQVRJT05fRU5BQkxFRCAmJiBCb29sZWFuLnBhcnNlQm9vbGVhbihvcHRpb25WYWx1ZSkpOwogCiAgICAgICAgIHN0Y3NPcHRpb25zID0gbmV3IFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zKG9wdGlvbnMpOwogICAgIH0KQEAgLTE1Myw4ICsxNTQsOSBAQAogICAgICAgICAgICAgaWYgKCEob3B0aW9uVmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpIHx8IG9wdGlvblZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCAndHJ1ZScgb3IgJ2ZhbHNlJyAoJXMpIiwgVU5TQUZFX0FHR1JFU1NJVkVfU1NUQUJMRV9FWFBJUkFUSU9OX0tFWSwgb3B0aW9uVmFsdWUpKTsKIAotICAgICAgICAgICAgaWYob3B0aW9uVmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpICYmICFCb29sZWFuLmdldEJvb2xlYW4oVU5TQUZFX0FHR1JFU1NJVkVfU1NUQUJMRV9FWFBJUkFUSU9OX1BST1BFUlRZKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCIlcyBpcyByZXF1ZXN0ZWQgYnV0IG5vdCBhbGxvd2VkLCByZXN0YXJ0IGNhc3NhbmRyYSB3aXRoIC1EJXM9dHJ1ZSB0byBhbGxvdyBpdCIsIFVOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTl9LRVksIFVOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTl9QUk9QRVJUWSkpOworICAgICAgICAgICAgaWYgKG9wdGlvblZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSAmJiAhVU5TQUZFX0FHR1JFU1NJVkVfU1NUQUJMRV9FWFBJUkFUSU9OX0VOQUJMRUQpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgaXMgcmVxdWVzdGVkIGJ1dCBub3QgYWxsb3dlZCwgcmVzdGFydCBjYXNzYW5kcmEgd2l0aCAtRCVzPXRydWUgdG8gYWxsb3cgaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5TQUZFX0FHR1JFU1NJVkVfU1NUQUJMRV9FWFBJUkFUSU9OX0tFWSwgQUxMT1dfVU5TQUZFX0FHR1JFU1NJVkVfU1NUQUJMRV9FWFBJUkFUSU9OLmdldEtleSgpKSk7CiAgICAgICAgIH0KIAogICAgICAgICB1bmNoZWNrZWRPcHRpb25zLnJlbW92ZShDT01QQUNUSU9OX1dJTkRPV19TSVpFX0tFWSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1VwZ3JhZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1VwZ3JhZGVyLmphdmEKaW5kZXggODdiZjViOC4uZjE4Y2M0OSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9VcGdyYWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVXBncmFkZXIuamF2YQpAQCAtMTcsNyArMTcsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb247CiAKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Mb25nUHJlZGljYXRlOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwpAQCAtMjUsOSArMjUsMTAgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZXdyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKQEAgLTcyLDE2ICs3MywxOSBAQAogICAgIHsKICAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3Igc3N0YWJsZU1ldGFkYXRhQ29sbGVjdG9yID0gbmV3IE1ldGFkYXRhQ29sbGVjdG9yKGNmcy5nZXRDb21wYXJhdG9yKCkpOwogICAgICAgICBzc3RhYmxlTWV0YWRhdGFDb2xsZWN0b3Iuc3N0YWJsZUxldmVsKHNzdGFibGUuZ2V0U1NUYWJsZUxldmVsKCkpOwotICAgICAgICByZXR1cm4gU1NUYWJsZVdyaXRlci5jcmVhdGUoY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGRpcmVjdG9yeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRSb3dzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucmVwYWlyZWRBdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnBlbmRpbmdSZXBhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5pc1RyYW5zaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5tZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVNZXRhZGF0YUNvbGxlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZShjZnMubWV0YWRhdGEoKSwgU2V0cy5uZXdIYXNoU2V0KHNzdGFibGUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5pbmRleE1hbmFnZXIubGlzdEluZGV4ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uKTsKKworICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoZGlyZWN0b3J5KTsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuZ2V0V3JpdGVyRmFjdG9yeSgpLmJ1aWxkZXIoZGVzY3JpcHRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0S2V5Q291bnQoZXN0aW1hdGVkUm93cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UmVwYWlyZWRBdChtZXRhZGF0YS5yZXBhaXJlZEF0KQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQZW5kaW5nUmVwYWlyKG1ldGFkYXRhLnBlbmRpbmdSZXBhaXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRyYW5zaWVudFNTVGFibGUobWV0YWRhdGEuaXNUcmFuc2llbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhYmxlTWV0YWRhdGFSZWYoY2ZzLm1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXRhZGF0YUNvbGxlY3Rvcihzc3RhYmxlTWV0YWRhdGFDb2xsZWN0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLCBTZXRzLm5ld0hhc2hTZXQoc3N0YWJsZSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGREZWZhdWx0Q29tcG9uZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZsdXNoT2JzZXJ2ZXJzRm9yU2Vjb25kYXJ5SW5kZXhlcyhjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCksIHRyYW5zYWN0aW9uLm9wVHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCh0cmFuc2FjdGlvbiwgY2ZzKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB1cGdyYWRlKGJvb2xlYW4ga2VlcE9yaWdpbmFscykKQEAgLTkzLDYgKzk3LDcgQEAKICAgICAgICAgICAgICBDb21wYWN0aW9uSXRlcmF0b3IgaXRlciA9IG5ldyBDb21wYWN0aW9uSXRlcmF0b3IodHJhbnNhY3Rpb24ub3BUeXBlKCksIHNjYW5uZXJzLnNjYW5uZXJzLCBjb250cm9sbGVyLCBub3dJblNlYywgbmV4dFRpbWVVVUlEKCkpKQogICAgICAgICB7CiAgICAgICAgICAgICB3cml0ZXIuc3dpdGNoV3JpdGVyKGNyZWF0ZUNvbXBhY3Rpb25Xcml0ZXIoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKSkpOworICAgICAgICAgICAgaXRlci5zZXRUYXJnZXREaXJlY3Rvcnkod3JpdGVyLmN1cnJlbnRXcml0ZXIoKS5nZXRGaWxlbmFtZSgpKTsKICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKGl0ZXIubmV4dCgpKTsKIApAQCAtMTAxLDcgKzEwNiw4IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZlVuY2hlY2tlZChlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9WZXJpZmllci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9WZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWViMjk5Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Mb2NhbFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4U3VtbWFyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLktleUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUlkZW50aXR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuVmFsaWRhdGlvbk1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUludGVncml0eU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUludGVncml0eU1ldGFkYXRhLkZpbGVEaWdlc3RWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSW5wdXRTdHJlYW1QbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJsb29tRmlsdGVyU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5JRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7Ci0KLWltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXJyb3I7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWFkV3JpdGVMb2NrOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Mb25nUHJlZGljYXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZVVVSUQ7Ci0KLXB1YmxpYyBjbGFzcyBWZXJpZmllciBpbXBsZW1lbnRzIENsb3NlYWJsZQotewotICAgIHByaXZhdGUgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOwotICAgIHByaXZhdGUgZmluYWwgU1NUYWJsZVJlYWRlciBzc3RhYmxlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb21wYWN0aW9uQ29udHJvbGxlciBjb250cm9sbGVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSZWFkV3JpdGVMb2NrIGZpbGVBY2Nlc3NMb2NrOwotICAgIHByaXZhdGUgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGRhdGFGaWxlOwotICAgIHByaXZhdGUgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGluZGV4RmlsZTsKLSAgICBwcml2YXRlIGZpbmFsIFZlcmlmeUluZm8gdmVyaWZ5SW5mbzsKLSAgICBwcml2YXRlIGZpbmFsIFJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyIHJvd0luZGV4RW50cnlTZXJpYWxpemVyOwotICAgIHByaXZhdGUgZmluYWwgT3B0aW9ucyBvcHRpb25zOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc09mZmxpbmU7Ci0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBrZXlzcGFjZSwgcmV0dXJuIHRoZSBzZXQgb2YgbG9jYWwgYW5kIHBlbmRpbmcgdG9rZW4gcmFuZ2VzLiAgQnkgZGVmYXVsdCB7QGxpbmsgU3RvcmFnZVNlcnZpY2UjZ2V0TG9jYWxBbmRQZW5kaW5nUmFuZ2VzKFN0cmluZyl9Ci0gICAgICogaXMgZXhwZWN0ZWQsIGJ1dCBmb3IgdGhlIHN0YW5kYWxvbmUgdmVyaWZpZXIgY2FzZSB3ZSBjYW4ndCB1c2UgdGhhdCwgc28gdGhpcyBpcyBoZXJlIHRvIGFsbG93IHRoZSBDTEkgdG8gcHJvdmlkZQotICAgICAqIHRoZSB0b2tlbiByYW5nZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBGdW5jdGlvbjxTdHJpbmcsID8gZXh0ZW5kcyBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4+IHRva2VuTG9va3VwOwotCi0gICAgcHJpdmF0ZSBpbnQgZ29vZFJvd3M7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlcjsKLSAgICBwcml2YXRlIEZpbGVEaWdlc3RWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0gICAgcHVibGljIFZlcmlmaWVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywgU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBib29sZWFuIGlzT2ZmbGluZSwgT3B0aW9ucyBvcHRpb25zKQotICAgIHsKLSAgICAgICAgdGhpcyhjZnMsIHNzdGFibGUsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBpc09mZmxpbmUsIG9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBWZXJpZmllcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyLCBib29sZWFuIGlzT2ZmbGluZSwgT3B0aW9ucyBvcHRpb25zKQotICAgIHsKLSAgICAgICAgdGhpcy5jZnMgPSBjZnM7Ci0gICAgICAgIHRoaXMuc3N0YWJsZSA9IHNzdGFibGU7Ci0gICAgICAgIHRoaXMub3V0cHV0SGFuZGxlciA9IG91dHB1dEhhbmRsZXI7Ci0gICAgICAgIHRoaXMucm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIgPSBzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbi5nZXRTU1RhYmxlRm9ybWF0KCkuZ2V0SW5kZXhTZXJpYWxpemVyKGNmcy5tZXRhZGF0YSgpLCBzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbiwgc3N0YWJsZS5oZWFkZXIpOwotCi0gICAgICAgIHRoaXMuY29udHJvbGxlciA9IG5ldyBWZXJpZnlDb250cm9sbGVyKGNmcyk7Ci0KLSAgICAgICAgdGhpcy5maWxlQWNjZXNzTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7Ci0gICAgICAgIHRoaXMuZGF0YUZpbGUgPSBpc09mZmxpbmUKLSAgICAgICAgICAgICAgICAgICAgICAgID8gc3N0YWJsZS5vcGVuRGF0YVJlYWRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IHNzdGFibGUub3BlbkRhdGFSZWFkZXIoQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZ2V0UmF0ZUxpbWl0ZXIoKSk7Ci0gICAgICAgIHRoaXMuaW5kZXhGaWxlID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4obmV3IEZpbGUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkpOwotICAgICAgICB0aGlzLnZlcmlmeUluZm8gPSBuZXcgVmVyaWZ5SW5mbyhkYXRhRmlsZSwgc3N0YWJsZSwgZmlsZUFjY2Vzc0xvY2sucmVhZExvY2soKSk7Ci0gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7Ci0gICAgICAgIHRoaXMuaXNPZmZsaW5lID0gaXNPZmZsaW5lOwotICAgICAgICB0aGlzLnRva2VuTG9va3VwID0gb3B0aW9ucy50b2tlbkxvb2t1cDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBleHRlbmRlZCA9IG9wdGlvbnMuZXh0ZW5kZWRWZXJpZmljYXRpb247Ci0gICAgICAgIGxvbmcgcm93U3RhcnQgPSAwOwotCi0gICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KFN0cmluZy5mb3JtYXQoIlZlcmlmeWluZyAlcyAoJXMpIiwgc3N0YWJsZSwgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoZGF0YUZpbGUubGVuZ3RoKCkpKSk7Ci0gICAgICAgIGlmIChvcHRpb25zLmNoZWNrVmVyc2lvbiAmJiAhc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24uaXNMYXRlc3RWZXJzaW9uKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCIlcyBpcyBub3QgdGhlIGxhdGVzdCB2ZXJzaW9uLCBydW4gdXBncmFkZXNzdGFibGVzIiwgc3N0YWJsZSk7Ci0gICAgICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dChtc2cpOwotICAgICAgICAgICAgLy8gZG9uJ3QgdXNlIG1hcmtBbmRUaHJvdyBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBhIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGZvciB0aGlzLgotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obXNnKTsKLSAgICAgICAgfQotCi0gICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KFN0cmluZy5mb3JtYXQoIkRlc2VyaWFsaXppbmcgc3N0YWJsZSBtZXRhZGF0YSBmb3IgJXMgIiwgc3N0YWJsZSkpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgRW51bVNldDxNZXRhZGF0YVR5cGU+IHR5cGVzID0gRW51bVNldC5vZihNZXRhZGF0YVR5cGUuVkFMSURBVElPTiwgTWV0YWRhdGFUeXBlLlNUQVRTLCBNZXRhZGF0YVR5cGUuSEVBREVSKTsKLSAgICAgICAgICAgIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBzc3RhYmxlTWV0YWRhdGEgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZ2V0TWV0YWRhdGFTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoc3N0YWJsZS5kZXNjcmlwdG9yLCB0eXBlcyk7Ci0gICAgICAgICAgICBpZiAoc3N0YWJsZU1ldGFkYXRhLmNvbnRhaW5zS2V5KE1ldGFkYXRhVHlwZS5WQUxJREFUSU9OKSAmJgotICAgICAgICAgICAgICAgICEoKFZhbGlkYXRpb25NZXRhZGF0YSlzc3RhYmxlTWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5WQUxJREFUSU9OKSkucGFydGl0aW9uZXIuZXF1YWxzKHNzdGFibGUuZ2V0UGFydGl0aW9uZXIoKS5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJQYXJ0aXRpb25lciBkb2VzIG5vdCBtYXRjaCB2YWxpZGF0aW9uIG1ldGFkYXRhIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4odCk7Ci0gICAgICAgICAgICBtYXJrQW5kVGhyb3codCwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dEhhbmRsZXIuZGVidWcoIkRlc2VyaWFsaXppbmcgaW5kZXggZm9yICIrc3N0YWJsZSk7Ci0gICAgICAgICAgICBkZXNlcmlhbGl6ZUluZGV4KHNzdGFibGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKHQpOwotICAgICAgICAgICAgbWFya0FuZFRocm93KHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dEhhbmRsZXIuZGVidWcoIkRlc2VyaWFsaXppbmcgaW5kZXggc3VtbWFyeSBmb3IgIitzc3RhYmxlKTsKLSAgICAgICAgICAgIGRlc2VyaWFsaXplSW5kZXhTdW1tYXJ5KHNzdGFibGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIkluZGV4IHN1bW1hcnkgaXMgY29ycnVwdCAtIGlmIGl0IGlzIHJlbW92ZWQgaXQgd2lsbCBnZXQgcmVidWlsdCBvbiBzdGFydHVwICIrc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVU1NQVJZKSk7Ci0gICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4odCk7Ci0gICAgICAgICAgICBtYXJrQW5kVGhyb3codCwgZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dEhhbmRsZXIuZGVidWcoIkRlc2VyaWFsaXppbmcgYmxvb20gZmlsdGVyIGZvciAiK3NzdGFibGUpOwotICAgICAgICAgICAgZGVzZXJpYWxpemVCbG9vbUZpbHRlcihzc3RhYmxlKTsKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKHQpOwotICAgICAgICAgICAgbWFya0FuZFRocm93KHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMuY2hlY2tPd25zVG9rZW5zICYmICFpc09mZmxpbmUgJiYgIShjZnMuZ2V0UGFydGl0aW9uZXIoKSBpbnN0YW5jZW9mIExvY2FsUGFydGl0aW9uZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKCJDaGVja2luZyB0aGF0IGFsbCB0b2tlbnMgYXJlIG93bmVkIGJ5IHRoZSBjdXJyZW50IG5vZGUiKTsKLSAgICAgICAgICAgIHRyeSAoS2V5SXRlcmF0b3IgaXRlciA9IG5ldyBLZXlJdGVyYXRvcihzc3RhYmxlLmRlc2NyaXB0b3IsIHNzdGFibGUubWV0YWRhdGEoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGlzdDxSYW5nZTxUb2tlbj4+IG93bmVkUmFuZ2VzID0gUmFuZ2Uubm9ybWFsaXplKHRva2VuTG9va3VwLmFwcGx5KGNmcy5tZXRhZGF0YS5rZXlzcGFjZSkpOwotICAgICAgICAgICAgICAgIGlmIChvd25lZFJhbmdlcy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBSYW5nZU93bkhlbHBlciByYW5nZU93bkhlbHBlciA9IG5ldyBSYW5nZU93bkhlbHBlcihvd25lZFJhbmdlcyk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICByYW5nZU93bkhlbHBlci52YWxpZGF0ZShrZXkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4odCk7Ci0gICAgICAgICAgICAgICAgbWFya0FuZFRocm93KHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9wdGlvbnMucXVpY2spCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gVmVyaWZ5IHdpbGwgdXNlIHRoZSBEaWdlc3QgZmlsZXMsIHdoaWNoIHdvcmtzIGZvciBib3RoIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBzc3RhYmxlcwotICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dChTdHJpbmcuZm9ybWF0KCJDaGVja2luZyBjb21wdXRlZCBoYXNoIG9mICVzICIsIHNzdGFibGUpKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbGlkYXRvciA9IG51bGw7Ci0KLSAgICAgICAgICAgIGlmIChuZXcgRmlsZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRJR0VTVCkpLmV4aXN0cygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkYXRvciA9IERhdGFJbnRlZ3JpdHlNZXRhZGF0YS5maWxlRGlnZXN0VmFsaWRhdG9yKHNzdGFibGUuZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIkRhdGEgZGlnZXN0IG1pc3NpbmcsIGFzc3VtaW5nIGV4dGVuZGVkIHZlcmlmaWNhdGlvbiBvZiBkaXNrIHZhbHVlcyIpOwotICAgICAgICAgICAgICAgIGV4dGVuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKGUpOwotICAgICAgICAgICAgbWFya0FuZFRocm93KGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseSh2YWxpZGF0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFleHRlbmRlZCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiRXh0ZW5kZWQgVmVyaWZ5IHJlcXVlc3RlZCwgcHJvY2VlZGluZyB0byBpbnNwZWN0IHZhbHVlcyIpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBCeXRlQnVmZmVyIG5leHRJbmRleEtleSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW5kZXhGaWxlKTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIGZpcnN0Um93UG9zaXRpb25Gcm9tSW5kZXggPSByb3dJbmRleEVudHJ5U2VyaWFsaXplci5kZXNlcmlhbGl6ZVBvc2l0aW9uQW5kU2tpcChpbmRleEZpbGUpOwotICAgICAgICAgICAgICAgIGlmIChmaXJzdFJvd1Bvc2l0aW9uRnJvbUluZGV4ICE9IDApCi0gICAgICAgICAgICAgICAgICAgIG1hcmtBbmRUaHJvdyhuZXcgUnVudGltZUV4Y2VwdGlvbigiZmlyc3RSb3dQb3NpdGlvbkZyb21JbmRleCAhPSAwOiAiK2ZpcnN0Um93UG9zaXRpb25Gcm9tSW5kZXgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxSYW5nZTxUb2tlbj4+IG93bmVkUmFuZ2VzID0gaXNPZmZsaW5lID8gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgOiBSYW5nZS5ub3JtYWxpemUodG9rZW5Mb29rdXAuYXBwbHkoY2ZzLm1ldGFkYXRhKCkua2V5c3BhY2UpKTsKLSAgICAgICAgICAgIFJhbmdlT3duSGVscGVyIHJhbmdlT3duSGVscGVyID0gbmV3IFJhbmdlT3duSGVscGVyKG93bmVkUmFuZ2VzKTsKLSAgICAgICAgICAgIERlY29yYXRlZEtleSBwcmV2S2V5ID0gbnVsbDsKLQotICAgICAgICAgICAgd2hpbGUgKCFkYXRhRmlsZS5pc0VPRigpKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgaWYgKHZlcmlmeUluZm8uaXNTdG9wUmVxdWVzdGVkKCkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24odmVyaWZ5SW5mby5nZXRDb21wYWN0aW9uSW5mbygpKTsKLQotICAgICAgICAgICAgICAgIHJvd1N0YXJ0ID0gZGF0YUZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKCJSZWFkaW5nIHJvdyBhdCAiICsgcm93U3RhcnQpOwotCi0gICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBrZXkgPSBzc3RhYmxlLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoZGF0YUZpbGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93SWZGYXRhbCh0aCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBudWxsIGtleSBiZWxvdwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNoZWNrT3duc1Rva2VucyAmJiBvd25lZFJhbmdlcy5zaXplKCkgPiAwICYmICEoY2ZzLmdldFBhcnRpdGlvbmVyKCkgaW5zdGFuY2VvZiBMb2NhbFBhcnRpdGlvbmVyKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYW5nZU93bkhlbHBlci52YWxpZGF0ZShrZXkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKFN0cmluZy5mb3JtYXQoIktleSAlcyBpbiBzc3RhYmxlICVzIG5vdCBvd25lZCBieSBsb2NhbCByYW5nZXMgJXMiLCBrZXksIHNzdGFibGUsIG93bmVkUmFuZ2VzKSwgdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXJrQW5kVGhyb3codCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGN1cnJlbnRJbmRleEtleSA9IG5leHRJbmRleEtleTsKLSAgICAgICAgICAgICAgICBsb25nIG5leHRSb3dQb3NpdGlvbkZyb21JbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuZXh0SW5kZXhLZXkgPSBpbmRleEZpbGUuaXNFT0YoKSA/IG51bGwgOiBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluZGV4RmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRSb3dQb3NpdGlvbkZyb21JbmRleCA9IGluZGV4RmlsZS5pc0VPRigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRhdGFGaWxlLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJvd0luZGV4RW50cnlTZXJpYWxpemVyLmRlc2VyaWFsaXplUG9zaXRpb25BbmRTa2lwKGluZGV4RmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBtYXJrQW5kVGhyb3codGgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxvbmcgZGF0YVN0YXJ0ID0gZGF0YUZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKLSAgICAgICAgICAgICAgICBsb25nIGRhdGFTdGFydEZyb21JbmRleCA9IGN1cnJlbnRJbmRleEtleSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAtMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcm93U3RhcnQgKyAyICsgY3VycmVudEluZGV4S2V5LnJlbWFpbmluZygpOwotCi0gICAgICAgICAgICAgICAgbG9uZyBkYXRhU2l6ZSA9IG5leHRSb3dQb3NpdGlvbkZyb21JbmRleCAtIGRhdGFTdGFydEZyb21JbmRleDsKLSAgICAgICAgICAgICAgICAvLyBhdm9pZCBhbiBOUEUgaWYga2V5IGlzIG51bGwKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5TmFtZSA9IGtleSA9PSBudWxsID8gIih1bnJlYWRhYmxlIGtleSkiIDogQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChrZXkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIuZGVidWcoU3RyaW5nLmZvcm1hdCgicm93ICVzIGlzICVzIiwga2V5TmFtZSwgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoZGF0YVNpemUpKSk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQgY3VycmVudEluZGV4S2V5ICE9IG51bGwgfHwgaW5kZXhGaWxlLmlzRU9GKCk7Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCBkYXRhU2l6ZSA+IGRhdGFGaWxlLmxlbmd0aCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgbWFya0FuZFRocm93KG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoImtleSA9ICVzLCBkYXRhU2l6ZT0lZCwgZGF0YUZpbGUubGVuZ3RoKCkgPSAlZCIsIGtleSwgZGF0YVNpemUsIGRhdGFGaWxlLmxlbmd0aCgpKSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vbWltaWMgdGhlIHNjcnViIHJlYWQgcGF0aCwgaW50ZW50aW9uYWxseSB1bnVzZWQKLSAgICAgICAgICAgICAgICAgICAgdHJ5IChVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IgPSBTU1RhYmxlSWRlbnRpdHlJdGVyYXRvci5jcmVhdGUoc3N0YWJsZSwgZGF0YUZpbGUsIGtleSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICggKHByZXZLZXkgIT0gbnVsbCAmJiBwcmV2S2V5LmNvbXBhcmVUbyhrZXkpID4gMCkgfHwgIWtleS5nZXRLZXkoKS5lcXVhbHMoY3VycmVudEluZGV4S2V5KSB8fCBkYXRhU3RhcnQgIT0gZGF0YVN0YXJ0RnJvbUluZGV4ICkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtBbmRUaHJvdyhuZXcgUnVudGltZUV4Y2VwdGlvbigiS2V5IG91dCBvZiBvcmRlcjogcHJldmlvdXMgPSAiK3ByZXZLZXkgKyAiIDogY3VycmVudCA9ICIgKyBrZXkpKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGdvb2RSb3dzKys7Ci0gICAgICAgICAgICAgICAgICAgIHByZXZLZXkgPSBrZXk7Ci0KLQotICAgICAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKFN0cmluZy5mb3JtYXQoIlJvdyAlcyBhdCAlcyB2YWxpZCwgbW92aW5nIHRvIG5leHQgcm93IGF0ICVzICIsIGdvb2RSb3dzLCByb3dTdGFydCwgbmV4dFJvd1Bvc2l0aW9uRnJvbUluZGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgIGRhdGFGaWxlLnNlZWsobmV4dFJvd1Bvc2l0aW9uRnJvbUluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hcmtBbmRUaHJvdyh0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUodCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiVmVyaWZ5IG9mICIgKyBzc3RhYmxlICsgIiBzdWNjZWVkZWQuIEFsbCAiICsgZ29vZFJvd3MgKyAiIHJvd3MgcmVhZCBzdWNjZXNzZnVsbHkiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2UgdGhlIGZhY3QgdGhhdCBjaGVjayguLikgaXMgY2FsbGVkIHdpdGggc29ydGVkIHRva2VucyAtIHdlIGtlZXAgYSBwb2ludGVyIGluIHRvIHRoZSBub3JtYWxpemVkIHJhbmdlcwotICAgICAqIGFuZCBvbmx5IGJ1bXAgdGhlIHBvaW50ZXIgaWYgdGhlIGtleSBnaXZlbiBpcyBvdXQgb2YgcmFuZ2UuIFRoaXMgaXMgZG9uZSB0byBhdm9pZCBjYWxsaW5nIC5jb250YWlucyguLikgbWFueQotICAgICAqIHRpbWVzIGZvciBlYWNoIGtleSAod2l0aCB2bm9kZXMgZm9yIGV4YW1wbGUpCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBSYW5nZU93bkhlbHBlcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJhbmdlPFRva2VuPj4gbm9ybWFsaXplZFJhbmdlczsKLSAgICAgICAgcHJpdmF0ZSBpbnQgcmFuZ2VJbmRleCA9IDA7Ci0gICAgICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IGxhc3RLZXk7Ci0KLSAgICAgICAgcHVibGljIFJhbmdlT3duSGVscGVyKExpc3Q8UmFuZ2U8VG9rZW4+PiBub3JtYWxpemVkUmFuZ2VzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRSYW5nZXMgPSBub3JtYWxpemVkUmFuZ2VzOwotICAgICAgICAgICAgUmFuZ2UuYXNzZXJ0Tm9ybWFsaXplZChub3JtYWxpemVkUmFuZ2VzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBjaGVjayBpZiB0aGUgZ2l2ZW4ga2V5IGlzIGNvbnRhaW5lZCBpbiBhbnkgb2YgdGhlIGdpdmVuIHJhbmdlcwotICAgICAgICAgKgotICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCBpbiBzb3J0ZWQgb3JkZXIgLSBrZXkgc2hvdWxkIGJlIGluY3JlYXNpbmcKLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGtleSB0aGUga2V5Ci0gICAgICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUga2V5IGlzIG5vdCBjb250YWluZWQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKERlY29yYXRlZEtleSBrZXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY2hlY2soa2V5KSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiS2V5ICIgKyBrZXkgKyAiIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGdpdmVuIHJhbmdlcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIGNoZWNrIGlmIHRoZSBnaXZlbiBrZXkgaXMgY29udGFpbmVkIGluIGFueSBvZiB0aGUgZ2l2ZW4gcmFuZ2VzCi0gICAgICAgICAqCi0gICAgICAgICAqIE11c3QgYmUgY2FsbGVkIGluIHNvcnRlZCBvcmRlciAtIGtleSBzaG91bGQgYmUgaW5jcmVhc2luZwotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0ga2V5IHRoZSBrZXkKLSAgICAgICAgICogQHJldHVybiBib29sZWFuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBjaGVjayhEZWNvcmF0ZWRLZXkga2V5KQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgbGFzdEtleSA9PSBudWxsIHx8IGtleS5jb21wYXJlVG8obGFzdEtleSkgPiAwOwotICAgICAgICAgICAgbGFzdEtleSA9IGtleTsKLQotICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRSYW5nZXMuaXNFbXB0eSgpKSAvLyBoYW5kbGUgdGVzdHMgZXRjIHdoZXJlIHdlIGRvbid0IGhhdmUgYW55IHJhbmdlcwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBpZiAocmFuZ2VJbmRleCA+IG5vcm1hbGl6ZWRSYW5nZXMuc2l6ZSgpIC0gMSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSYW5nZU93bkhlbHBlciBjYW4gb25seSBiZSB1c2VkIHRvIGZpbmQgdGhlIGZpcnN0IG91dC1vZi1yYW5nZS10b2tlbiIpOwotCi0gICAgICAgICAgICB3aGlsZSAoIW5vcm1hbGl6ZWRSYW5nZXMuZ2V0KHJhbmdlSW5kZXgpLmNvbnRhaW5zKGtleS5nZXRUb2tlbigpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByYW5nZUluZGV4Kys7Ci0gICAgICAgICAgICAgICAgaWYgKHJhbmdlSW5kZXggPiBub3JtYWxpemVkUmFuZ2VzLnNpemUoKSAtIDEpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVzZXJpYWxpemVJbmRleChTU1RhYmxlUmVhZGVyIHNzdGFibGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5IChSYW5kb21BY2Nlc3NSZWFkZXIgcHJpbWFyeUluZGV4ID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4obmV3IEZpbGUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIGluZGV4U2l6ZSA9IHByaW1hcnlJbmRleC5sZW5ndGgoKTsKLQotICAgICAgICAgICAgd2hpbGUgKChwcmltYXJ5SW5kZXguZ2V0RmlsZVBvaW50ZXIoKSkgIT0gaW5kZXhTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChwcmltYXJ5SW5kZXgpOwotICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkuU2VyaWFsaXplci5za2lwKHByaW1hcnlJbmRleCwgc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlc2VyaWFsaXplSW5kZXhTdW1tYXJ5KFNTVGFibGVSZWFkZXIgc3N0YWJsZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNVTU1BUlkpKTsKLSAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9IGNmcy5tZXRhZGF0YSgpOwotICAgICAgICB0cnkgKERhdGFJbnB1dFN0cmVhbSBpU3RyZWFtID0gbmV3IERhdGFJbnB1dFN0cmVhbShGaWxlcy5uZXdJbnB1dFN0cmVhbShmaWxlLnRvUGF0aCgpKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSA9IEluZGV4U3VtbWFyeS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGlTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuZ2V0UGFydGl0aW9uZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnBhcmFtcy5taW5JbmRleEludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucGFyYW1zLm1heEluZGV4SW50ZXJ2YWwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoTGVuZ3RoKGlTdHJlYW0pOwotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoTGVuZ3RoKGlTdHJlYW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRlc2VyaWFsaXplQmxvb21GaWx0ZXIoU1NUYWJsZVJlYWRlciBzc3RhYmxlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEZpbGUgYmZQYXRoID0gbmV3IEZpbGUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5GSUxURVIpKTsKLSAgICAgICAgaWYgKGJmUGF0aC5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW1QbHVzIHN0cmVhbSA9IGJmUGF0aC5uZXdJbnB1dFN0cmVhbSgpOwotICAgICAgICAgICAgICAgICBJRmlsdGVyIGJmID0gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmRlc2VyaWFsaXplKHN0cmVhbSwgc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24uaGFzT2xkQmZGb3JtYXQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgewotICAgICAgICBmaWxlQWNjZXNzTG9jay53cml0ZUxvY2soKS5sb2NrKCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGRhdGFGaWxlKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkoaW5kZXhGaWxlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVBY2Nlc3NMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZGYXRhbChUaHJvd2FibGUgdGgpCi0gICAgewotICAgICAgICBpZiAodGggaW5zdGFuY2VvZiBFcnJvciAmJiAhKHRoIGluc3RhbmNlb2YgQXNzZXJ0aW9uRXJyb3IgfHwgdGggaW5zdGFuY2VvZiBJT0Vycm9yKSkKLSAgICAgICAgICAgIHRocm93IChFcnJvcikgdGg7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG1hcmtBbmRUaHJvdyhUaHJvd2FibGUgY2F1c2UpCi0gICAgewotICAgICAgICBtYXJrQW5kVGhyb3coY2F1c2UsIHRydWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtYXJrQW5kVGhyb3coVGhyb3dhYmxlIGNhdXNlLCBib29sZWFuIG11dGF0ZVJlcGFpcmVkKQotICAgIHsKLSAgICAgICAgaWYgKG11dGF0ZVJlcGFpcmVkICYmIG9wdGlvbnMubXV0YXRlUmVwYWlyU3RhdHVzKSAvLyBpZiB3ZSBhcmUgYWJsZSB0byBtdXRhdGUgcmVwYWlyZWQgZmxhZywgYW4gaW5jcmVtZW50YWwgcmVwYWlyIHNob3VsZCBiZSBlbm91Z2gKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3N0YWJsZS5tdXRhdGVSZXBhaXJlZEFuZFJlbG9hZChBY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRSwgc3N0YWJsZS5nZXRQZW5kaW5nUmVwYWlyKCksIHNzdGFibGUuaXNUcmFuc2llbnQoKSk7Ci0gICAgICAgICAgICAgICAgY2ZzLmdldFRyYWNrZXIoKS5ub3RpZnlTU1RhYmxlUmVwYWlyZWRTdGF0dXNDaGFuZ2VkKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzc3RhYmxlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIkVycm9yIG11dGF0aW5nIHJlcGFpcmVkQXQgZm9yIFNTVGFibGUgIiArICBzc3RhYmxlLmdldEZpbGVuYW1lKCkgKyAiLCBhcyBwYXJ0IG9mIG1hcmtBbmRUaHJvdyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIFNTVGFibGUgJXMsIHBsZWFzZSBmb3JjZSAlc3JlcGFpciIsIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSwgKG11dGF0ZVJlcGFpcmVkICYmIG9wdGlvbnMubXV0YXRlUmVwYWlyU3RhdHVzKSA/ICIiIDogImEgZnVsbCAiKSwgY2F1c2UpOwotICAgICAgICBpZiAob3B0aW9ucy5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSkKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCBzc3RhYmxlLmdldEZpbGVuYW1lKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tcGFjdGlvbkluZm8uSG9sZGVyIGdldFZlcmlmeUluZm8oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZlcmlmeUluZm87Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVyaWZ5SW5mbyBleHRlbmRzIENvbXBhY3Rpb25JbmZvLkhvbGRlcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSYW5kb21BY2Nlc3NSZWFkZXIgZGF0YUZpbGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU1NUYWJsZVJlYWRlciBzc3RhYmxlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFRpbWVVVUlEIHZlcmlmaWNhdGlvbkNvbXBhY3Rpb25JZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb2NrIGZpbGVSZWFkTG9jazsKLQotICAgICAgICBwdWJsaWMgVmVyaWZ5SW5mbyhSYW5kb21BY2Nlc3NSZWFkZXIgZGF0YUZpbGUsIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgTG9jayBmaWxlUmVhZExvY2spCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZGF0YUZpbGUgPSBkYXRhRmlsZTsKLSAgICAgICAgICAgIHRoaXMuc3N0YWJsZSA9IHNzdGFibGU7Ci0gICAgICAgICAgICB0aGlzLmZpbGVSZWFkTG9jayA9IGZpbGVSZWFkTG9jazsKLSAgICAgICAgICAgIHZlcmlmaWNhdGlvbkNvbXBhY3Rpb25JZCA9IG5leHRUaW1lVVVJRCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsZVJlYWRMb2NrLmxvY2soKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8oc3N0YWJsZS5tZXRhZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uVHlwZS5WRVJJRlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmlsZS5nZXRGaWxlUG9pbnRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpbGUubGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZmljYXRpb25Db21wYWN0aW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQub2Yoc3N0YWJsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmlsZVJlYWRMb2NrLnVubG9jaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBWZXJpZnlDb250cm9sbGVyIGV4dGVuZHMgQ29tcGFjdGlvbkNvbnRyb2xsZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBWZXJpZnlDb250cm9sbGVyKENvbHVtbkZhbWlseVN0b3JlIGNmcykKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoY2ZzLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIExvbmdQcmVkaWNhdGUgZ2V0UHVyZ2VFdmFsdWF0b3IoRGVjb3JhdGVkS2V5IGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRpbWUgLT4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9wdGlvbnMuQnVpbGRlciBvcHRpb25zKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgT3B0aW9ucy5CdWlsZGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBPcHRpb25zCi0gICAgewotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpbnZva2VEaXNrRmFpbHVyZVBvbGljeTsKLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXh0ZW5kZWRWZXJpZmljYXRpb247Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGNoZWNrVmVyc2lvbjsKLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gbXV0YXRlUmVwYWlyU3RhdHVzOwotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjaGVja093bnNUb2tlbnM7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHF1aWNrOwotICAgICAgICBwdWJsaWMgZmluYWwgRnVuY3Rpb248U3RyaW5nLCA/IGV4dGVuZHMgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+PiB0b2tlbkxvb2t1cDsKLQotICAgICAgICBwcml2YXRlIE9wdGlvbnMoYm9vbGVhbiBpbnZva2VEaXNrRmFpbHVyZVBvbGljeSwgYm9vbGVhbiBleHRlbmRlZFZlcmlmaWNhdGlvbiwgYm9vbGVhbiBjaGVja1ZlcnNpb24sIGJvb2xlYW4gbXV0YXRlUmVwYWlyU3RhdHVzLCBib29sZWFuIGNoZWNrT3duc1Rva2VucywgYm9vbGVhbiBxdWljaywgRnVuY3Rpb248U3RyaW5nLCA/IGV4dGVuZHMgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+PiB0b2tlbkxvb2t1cCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSA9IGludm9rZURpc2tGYWlsdXJlUG9saWN5OwotICAgICAgICAgICAgdGhpcy5leHRlbmRlZFZlcmlmaWNhdGlvbiA9IGV4dGVuZGVkVmVyaWZpY2F0aW9uOwotICAgICAgICAgICAgdGhpcy5jaGVja1ZlcnNpb24gPSBjaGVja1ZlcnNpb247Ci0gICAgICAgICAgICB0aGlzLm11dGF0ZVJlcGFpclN0YXR1cyA9IG11dGF0ZVJlcGFpclN0YXR1czsKLSAgICAgICAgICAgIHRoaXMuY2hlY2tPd25zVG9rZW5zID0gY2hlY2tPd25zVG9rZW5zOwotICAgICAgICAgICAgdGhpcy5xdWljayA9IHF1aWNrOwotICAgICAgICAgICAgdGhpcy50b2tlbkxvb2t1cCA9IHRva2VuTG9va3VwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIk9wdGlvbnN7IiArCi0gICAgICAgICAgICAgICAgICAgImludm9rZURpc2tGYWlsdXJlUG9saWN5PSIgKyBpbnZva2VEaXNrRmFpbHVyZVBvbGljeSArCi0gICAgICAgICAgICAgICAgICAgIiwgZXh0ZW5kZWRWZXJpZmljYXRpb249IiArIGV4dGVuZGVkVmVyaWZpY2F0aW9uICsKLSAgICAgICAgICAgICAgICAgICAiLCBjaGVja1ZlcnNpb249IiArIGNoZWNrVmVyc2lvbiArCi0gICAgICAgICAgICAgICAgICAgIiwgbXV0YXRlUmVwYWlyU3RhdHVzPSIgKyBtdXRhdGVSZXBhaXJTdGF0dXMgKwotICAgICAgICAgICAgICAgICAgICIsIGNoZWNrT3duc1Rva2Vucz0iICsgY2hlY2tPd25zVG9rZW5zICsKLSAgICAgICAgICAgICAgICAgICAiLCBxdWljaz0iICsgcXVpY2sgKwotICAgICAgICAgICAgICAgICAgICd9JzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlcgotICAgICAgICB7Ci0gICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kgPSBmYWxzZTsgLy8gaW52b2tpbmcgZGlzayBmYWlsdXJlIHBvbGljeSBjYW4gc3RvcCB0aGUgbm9kZSBpZiB3ZSBmaW5kIGEgY29ycnVwdCBzdGFibGUKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBleHRlbmRlZFZlcmlmaWNhdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrVmVyc2lvbiA9IGZhbHNlOwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG11dGF0ZVJlcGFpclN0YXR1cyA9IGZhbHNlOyAvLyBtdXRhdGluZyByZXBhaXIgc3RhdHVzIGNhbiBiZSBkYW5nZXJvdXMKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja093bnNUb2tlbnMgPSBmYWxzZTsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBxdWljayA9IGZhbHNlOwotICAgICAgICAgICAgcHJpdmF0ZSBGdW5jdGlvbjxTdHJpbmcsID8gZXh0ZW5kcyBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4+IHRva2VuTG9va3VwID0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2U6OmdldExvY2FsQW5kUGVuZGluZ1JhbmdlczsKLQotICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgaW52b2tlRGlza0ZhaWx1cmVQb2xpY3koYm9vbGVhbiBwYXJhbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmludm9rZURpc2tGYWlsdXJlUG9saWN5ID0gcGFyYW07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIGV4dGVuZGVkVmVyaWZpY2F0aW9uKGJvb2xlYW4gcGFyYW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5leHRlbmRlZFZlcmlmaWNhdGlvbiA9IHBhcmFtOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBjaGVja1ZlcnNpb24oYm9vbGVhbiBwYXJhbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNoZWNrVmVyc2lvbiA9IHBhcmFtOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBtdXRhdGVSZXBhaXJTdGF0dXMoYm9vbGVhbiBwYXJhbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLm11dGF0ZVJlcGFpclN0YXR1cyA9IHBhcmFtOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBjaGVja093bnNUb2tlbnMoYm9vbGVhbiBwYXJhbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT3duc1Rva2VucyA9IHBhcmFtOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBxdWljayhib29sZWFuIHBhcmFtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMucXVpY2sgPSBwYXJhbTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgdG9rZW5Mb29rdXAoRnVuY3Rpb248U3RyaW5nLCA/IGV4dGVuZHMgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+PiB0b2tlbkxvb2t1cCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLnRva2VuTG9va3VwID0gdG9rZW5Mb29rdXA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBPcHRpb25zIGJ1aWxkKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9wdGlvbnMoaW52b2tlRGlza0ZhaWx1cmVQb2xpY3ksIGV4dGVuZGVkVmVyaWZpY2F0aW9uLCBjaGVja1ZlcnNpb24sIG11dGF0ZVJlcGFpclN0YXR1cywgY2hlY2tPd25zVG9rZW5zLCBxdWljaywgdG9rZW5Mb29rdXApOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvQ29tcGFjdGlvbkF3YXJlV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvQ29tcGFjdGlvbkF3YXJlV3JpdGVyLmphdmEKaW5kZXggMGY0ZmUyZC4uNDUxYTc4ZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL0NvbXBhY3Rpb25Bd2FyZVdyaXRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9Db21wYWN0aW9uQXdhcmVXcml0ZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24ud3JpdGVyczsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKQEAgLTMwLDE2ICszMSwyMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpc2tCb3VuZGFyaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uVGFzazsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJld3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlRyYW5zYWN0aW9uYWw7CiAKKwogLyoqCiAgKiBDbGFzcyB0aGF0IGFic3RyYWN0cyBhd2F5IHRoZSBhY3R1YWwgd3JpdGluZyBvZiBmaWxlcyB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSBDb21wYWN0aW9uVGFzayBmb3IgbW9yZQogICogdXNlIGNhc2VzLgpAQCAtNjMsNiArNjksOSBAQAogICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXJ0aXRpb25Qb3NpdGlvbj4gZGlza0JvdW5kYXJpZXM7CiAgICAgcHJpdmF0ZSBpbnQgbG9jYXRpb25JbmRleDsKIAorICAgIC8vIEtlZXAgdGFyZ2V0RGlyZWN0b3J5IGZvciBjb21wYWN0aW9ucywgbmVlZGVkIGZvciBgbm9kZXRvb2wgY29tcGFjdGlvbnN0YXRzYAorICAgIHByb3RlY3RlZCBEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5IHNzdGFibGVEaXJlY3Rvcnk7CisKICAgICBwdWJsaWMgQ29tcGFjdGlvbkF3YXJlV3JpdGVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yaWVzIGRpcmVjdG9yaWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuLApAQCAtMTM0LDYgKzE0MywxMSBAQAogICAgICAgICByZXR1cm4gcmVhbEFwcGVuZChwYXJ0aXRpb24pOwogICAgIH0KIAorICAgIHB1YmxpYyBmaW5hbCBGaWxlIGdldFNTdGFibGVEaXJlY3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBnZXREaXJlY3RvcmllcygpLmdldExvY2F0aW9uRm9yRGlzayhzc3RhYmxlRGlyZWN0b3J5KTsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgVGhyb3dhYmxlIGRvUG9zdENsZWFudXAoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCiAgICAgewpAQCAtMjM1LDQgKzI0OSwyNCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIGNmcy5nZXRFeHBlY3RlZENvbXBhY3RlZEZpbGVTaXplKG5vbkV4cGlyZWRTU1RhYmxlcywgdHhuLm9wVHlwZSgpKTsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHNldCB0aGUgZm9sbG93aW5nIGZpZWxkczoKKyAgICAgKiAtIHtAbGluayBTU1RhYmxlV3JpdGVyLkJ1aWxkZXIjc2V0S2V5Q291bnQobG9uZyl9LAorICAgICAqIC0ge0BsaW5rIFNTVGFibGVXcml0ZXIuQnVpbGRlciNzZXRTZXJpYWxpemF0aW9uSGVhZGVyKFNlcmlhbGl6YXRpb25IZWFkZXIpfSBhbmQsCisgICAgICogLSB7QGxpbmsgU1NUYWJsZVdyaXRlci5CdWlsZGVyI3NldE1ldGFkYXRhQ29sbGVjdG9yKE1ldGFkYXRhQ29sbGVjdG9yKX0KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHByb3RlY3RlZCBTU1RhYmxlV3JpdGVyLkJ1aWxkZXI8PywgPz4gbmV3V3JpdGVyQnVpbGRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgeworICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5nZXRXcml0ZXJGYWN0b3J5KCkuYnVpbGRlcihkZXNjcmlwdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUYWJsZU1ldGFkYXRhUmVmKGNmcy5tZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VHJhbnNpZW50U1NUYWJsZShpc1RyYW5zaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UmVwYWlyZWRBdChtaW5SZXBhaXJlZEF0KQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQZW5kaW5nUmVwYWlyKHBlbmRpbmdSZXBhaXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZsdXNoT2JzZXJ2ZXJzRm9yU2Vjb25kYXJ5SW5kZXhlcyhjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCksIHR4bi5vcFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRGVmYXVsdENvbXBvbmVudHMoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvRGVmYXVsdENvbXBhY3Rpb25Xcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9EZWZhdWx0Q29tcGFjdGlvbldyaXRlci5qYXZhCmluZGV4IDYxODBmOTYuLmY5ODU4NDcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9EZWZhdWx0Q29tcGFjdGlvbldyaXRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9EZWZhdWx0Q29tcGFjdGlvbldyaXRlci5qYXZhCkBAIC0yNiw4ICsyNiw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwpAQCAtNjcsMTcgKzY4LDE3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc3dpdGNoQ29tcGFjdGlvbkxvY2F0aW9uKERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkgZGlyZWN0b3J5KQogICAgIHsKKyAgICAgICAgc3N0YWJsZURpcmVjdG9yeSA9IGRpcmVjdG9yeTsKKworICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2soZGlyZWN0b3J5KSk7CisgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3Rvcih0eG4ub3JpZ2luYWxzKCksIGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IsIHNzdGFibGVMZXZlbCk7CisgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyID0gU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLCBub25FeHBpcmVkU1NUYWJsZXMpOworCiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgICAgIFNTVGFibGVXcml0ZXIgd3JpdGVyID0gU1NUYWJsZVdyaXRlci5jcmVhdGUoY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKGRpcmVjdG9yeSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZFRvdGFsS2V5cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5SZXBhaXJlZEF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdSZXBhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUcmFuc2llbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXRhZGF0YUNvbGxlY3Rvcih0eG4ub3JpZ2luYWxzKCksIGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IsIHNzdGFibGVMZXZlbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLCBub25FeHBpcmVkU1NUYWJsZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5pbmRleE1hbmFnZXIubGlzdEluZGV4ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eG4pOworICAgICAgICBTU1RhYmxlV3JpdGVyIHdyaXRlciA9IG5ld1dyaXRlckJ1aWxkZXIoZGVzY3JpcHRvcikuc2V0TWV0YWRhdGFDb2xsZWN0b3IoY29sbGVjdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VyaWFsaXphdGlvbkhlYWRlcihoZWFkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRLZXlDb3VudChlc3RpbWF0ZWRUb3RhbEtleXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCh0eG4sIGNmcyk7CiAgICAgICAgIHNzdGFibGVXcml0ZXIuc3dpdGNoV3JpdGVyKHdyaXRlcik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvTWFqb3JMZXZlbGVkQ29tcGFjdGlvbldyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL01ham9yTGV2ZWxlZENvbXBhY3Rpb25Xcml0ZXIuamF2YQppbmRleCBiN2ZiODgxLi4zOGUyZDJkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvTWFqb3JMZXZlbGVkQ29tcGFjdGlvbldyaXRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9NYWpvckxldmVsZWRDb21wYWN0aW9uV3JpdGVyLmphdmEKQEAgLTIxLDExICsyMSwxMiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93SW5kZXhFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uTGV2ZWxlZE1hbmlmZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CkBAIC0zOSw3ICs0MCw2IEBACiAgICAgcHJpdmF0ZSBsb25nIHRvdGFsV3JpdHRlbkluTGV2ZWwgPSAwOwogICAgIHByaXZhdGUgaW50IHNzdGFibGVzV3JpdHRlbiA9IDA7CiAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGtleXNQZXJTU1RhYmxlOwotICAgIHByaXZhdGUgRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeSBzc3RhYmxlRGlyZWN0b3J5OwogICAgIHByaXZhdGUgZmluYWwgaW50IGxldmVsRmFub3V0U2l6ZTsKIAogICAgIHB1YmxpYyBNYWpvckxldmVsZWRDb21wYWN0aW9uV3JpdGVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywKQEAgLTcwLDcgKzcwLDcgQEAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogICAgIHB1YmxpYyBib29sZWFuIHJlYWxBcHBlbmQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbikKICAgICB7Ci0gICAgICAgIFJvd0luZGV4RW50cnkgcmllID0gc3N0YWJsZVdyaXRlci5hcHBlbmQocGFydGl0aW9uKTsKKyAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IHJpZSA9IHNzdGFibGVXcml0ZXIuYXBwZW5kKHBhcnRpdGlvbik7CiAgICAgICAgIHBhcnRpdGlvbnNXcml0dGVuKys7CiAgICAgICAgIGxvbmcgdG90YWxXcml0dGVuSW5DdXJyZW50V3JpdGVyID0gc3N0YWJsZVdyaXRlci5jdXJyZW50V3JpdGVyKCkuZ2V0RXN0aW1hdGVkT25EaXNrQnl0ZXNXcml0dGVuKCk7CiAgICAgICAgIGlmICh0b3RhbFdyaXR0ZW5JbkN1cnJlbnRXcml0ZXIgPiBtYXhTU1RhYmxlU2l6ZSkKQEAgLTkwLDE4ICs5MCwyMCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHN3aXRjaENvbXBhY3Rpb25Mb2NhdGlvbihEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5IGxvY2F0aW9uKQogICAgIHsKLSAgICAgICAgdGhpcy5zc3RhYmxlRGlyZWN0b3J5ID0gbG9jYXRpb247CisgICAgICAgIHNzdGFibGVEaXJlY3RvcnkgPSBsb2NhdGlvbjsKICAgICAgICAgYXZlcmFnZUVzdGltYXRlZEtleXNQZXJTU1RhYmxlID0gTWF0aC5yb3VuZCgoKGRvdWJsZSkgYXZlcmFnZUVzdGltYXRlZEtleXNQZXJTU1RhYmxlICogc3N0YWJsZXNXcml0dGVuICsgcGFydGl0aW9uc1dyaXR0ZW4pIC8gKHNzdGFibGVzV3JpdHRlbiArIDEpKTsKLSAgICAgICAgc3N0YWJsZVdyaXRlci5zd2l0Y2hXcml0ZXIoU1NUYWJsZVdyaXRlci5jcmVhdGUoY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKHNzdGFibGVEaXJlY3RvcnkpKSwKLSAgICAgICAgICAgICAgICBrZXlzUGVyU1NUYWJsZSwKLSAgICAgICAgICAgICAgICBtaW5SZXBhaXJlZEF0LAotICAgICAgICAgICAgICAgIHBlbmRpbmdSZXBhaXIsCi0gICAgICAgICAgICAgICAgaXNUcmFuc2llbnQsCi0gICAgICAgICAgICAgICAgY2ZzLm1ldGFkYXRhLAotICAgICAgICAgICAgICAgIG5ldyBNZXRhZGF0YUNvbGxlY3Rvcih0eG4ub3JpZ2luYWxzKCksIGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IsIGN1cnJlbnRMZXZlbCksCi0gICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLCB0eG4ub3JpZ2luYWxzKCkpLAotICAgICAgICAgICAgICAgIGNmcy5pbmRleE1hbmFnZXIubGlzdEluZGV4ZXMoKSwKLSAgICAgICAgICAgICAgICB0eG4pKTsKKworICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2soc3N0YWJsZURpcmVjdG9yeSkpOworICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IodHhuLm9yaWdpbmFscygpLCBjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yLCBjdXJyZW50TGV2ZWwpOworICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIHNlcmlhbGl6YXRpb25IZWFkZXIgPSBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksIHR4bi5vcmlnaW5hbHMoKSk7CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICAgICAgU1NUYWJsZVdyaXRlciB3cml0ZXIgPSBuZXdXcml0ZXJCdWlsZGVyKGRlc2NyaXB0b3IpLnNldEtleUNvdW50KGtleXNQZXJTU1RhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VyaWFsaXphdGlvbkhlYWRlcihzZXJpYWxpemF0aW9uSGVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWV0YWRhdGFDb2xsZWN0b3IoY29sbGVjdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQodHhuLCBjZnMpOworCisgICAgICAgIHNzdGFibGVXcml0ZXIuc3dpdGNoV3JpdGVyKHdyaXRlcik7CiAgICAgICAgIHBhcnRpdGlvbnNXcml0dGVuID0gMDsKICAgICAgICAgc3N0YWJsZXNXcml0dGVuID0gMDsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL3dyaXRlcnMvTWF4U1NUYWJsZVNpemVXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9NYXhTU1RhYmxlU2l6ZVdyaXRlci5qYXZhCmluZGV4IGRmOTE4YmMuLjgzNGJkYTkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9NYXhTU1RhYmxlU2l6ZVdyaXRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9NYXhTU1RhYmxlU2l6ZVdyaXRlci5qYXZhCkBAIC0yMSwxMSArMjEsMTIgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RSb3dJbmRleEVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKQEAgLTM2LDcgKzM3LDYgQEAKICAgICBwcml2YXRlIGZpbmFsIGludCBsZXZlbDsKICAgICBwcml2YXRlIGZpbmFsIGxvbmcgZXN0aW1hdGVkU1NUYWJsZXM7CiAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U1NUYWJsZVJlYWRlcj4gYWxsU1NUYWJsZXM7Ci0gICAgcHJpdmF0ZSBEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5IHNzdGFibGVEaXJlY3Rvcnk7CiAKICAgICBwdWJsaWMgTWF4U1NUYWJsZVNpemVXcml0ZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcmllcyBkaXJlY3RvcmllcywKQEAgLTgxLDcgKzgxLDcgQEAKIAogICAgIHByb3RlY3RlZCBib29sZWFuIHJlYWxBcHBlbmQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbikKICAgICB7Ci0gICAgICAgIFJvd0luZGV4RW50cnkgcmllID0gc3N0YWJsZVdyaXRlci5hcHBlbmQocGFydGl0aW9uKTsKKyAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IHJpZSA9IHNzdGFibGVXcml0ZXIuYXBwZW5kKHBhcnRpdGlvbik7CiAgICAgICAgIGlmIChzc3RhYmxlV3JpdGVyLmN1cnJlbnRXcml0ZXIoKS5nZXRFc3RpbWF0ZWRPbkRpc2tCeXRlc1dyaXR0ZW4oKSA+IG1heFNTVGFibGVTaXplKQogICAgICAgICB7CiAgICAgICAgICAgICBzd2l0Y2hDb21wYWN0aW9uTG9jYXRpb24oc3N0YWJsZURpcmVjdG9yeSk7CkBAIC05MywxOCArOTMsMTYgQEAKICAgICBwdWJsaWMgdm9pZCBzd2l0Y2hDb21wYWN0aW9uTG9jYXRpb24oRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeSBsb2NhdGlvbikKICAgICB7CiAgICAgICAgIHNzdGFibGVEaXJlY3RvcnkgPSBsb2NhdGlvbjsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKLSAgICAgICAgU1NUYWJsZVdyaXRlciB3cml0ZXIgPSBTU1RhYmxlV3JpdGVyLmNyZWF0ZShjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2soc3N0YWJsZURpcmVjdG9yeSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZFRvdGFsS2V5cyAvIGVzdGltYXRlZFNTVGFibGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblJlcGFpcmVkQXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1JlcGFpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1ldGFkYXRhQ29sbGVjdG9yKGFsbFNTVGFibGVzLCBjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yLCBsZXZlbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLCBub25FeHBpcmVkU1NUYWJsZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5pbmRleE1hbmFnZXIubGlzdEluZGV4ZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eG4pOwogCisgICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihnZXREaXJlY3RvcmllcygpLmdldExvY2F0aW9uRm9yRGlzayhzc3RhYmxlRGlyZWN0b3J5KSk7CisgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3RvcihhbGxTU1RhYmxlcywgY2ZzLm1ldGFkYXRhKCkuY29tcGFyYXRvciwgbGV2ZWwpOworICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciA9IFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZShjZnMubWV0YWRhdGEoKSwgbm9uRXhwaXJlZFNTVGFibGVzKTsKKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQorICAgICAgICBTU1RhYmxlV3JpdGVyIHdyaXRlciA9IG5ld1dyaXRlckJ1aWxkZXIoZGVzY3JpcHRvcikuc2V0S2V5Q291bnQoZXN0aW1hdGVkVG90YWxLZXlzIC8gZXN0aW1hdGVkU1NUYWJsZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXRhZGF0YUNvbGxlY3Rvcihjb2xsZWN0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJpYWxpemF0aW9uSGVhZGVyKGhlYWRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKHR4biwgY2ZzKTsKICAgICAgICAgc3N0YWJsZVdyaXRlci5zd2l0Y2hXcml0ZXIod3JpdGVyKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9TcGxpdHRpbmdTaXplVGllcmVkQ29tcGFjdGlvbldyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL1NwbGl0dGluZ1NpemVUaWVyZWRDb21wYWN0aW9uV3JpdGVyLmphdmEKaW5kZXggMjY0ZTE5Yy4uNDU4ZDgwYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL1NwbGl0dGluZ1NpemVUaWVyZWRDb21wYWN0aW9uV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL1NwbGl0dGluZ1NpemVUaWVyZWRDb21wYWN0aW9uV3JpdGVyLmphdmEKQEAgLTI1LDEwICsyNSwxMSBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93SW5kZXhFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CkBAIC00OSw3ICs1MCw2IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U1NUYWJsZVJlYWRlcj4gYWxsU1NUYWJsZXM7CiAgICAgcHJpdmF0ZSBsb25nIGN1cnJlbnRCeXRlc1RvV3JpdGU7CiAgICAgcHJpdmF0ZSBpbnQgY3VycmVudFJhdGlvSW5kZXggPSAwOwotICAgIHByaXZhdGUgRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeSBsb2NhdGlvbjsKIAogICAgIHB1YmxpYyBTcGxpdHRpbmdTaXplVGllcmVkQ29tcGFjdGlvbldyaXRlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIERpcmVjdG9yaWVzIGRpcmVjdG9yaWVzLCBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4sIFNldDxTU1RhYmxlUmVhZGVyPiBub25FeHBpcmVkU1NUYWJsZXMpCiAgICAgewpAQCAtODYsMTIgKzg2LDEzIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gcmVhbEFwcGVuZChVbmZpbHRlcmVkUm93SXRlcmF0b3IgcGFydGl0aW9uKQogICAgIHsKLSAgICAgICAgUm93SW5kZXhFbnRyeSByaWUgPSBzc3RhYmxlV3JpdGVyLmFwcGVuZChwYXJ0aXRpb24pOworICAgICAgICBBYnN0cmFjdFJvd0luZGV4RW50cnkgcmllID0gc3N0YWJsZVdyaXRlci5hcHBlbmQocGFydGl0aW9uKTsKICAgICAgICAgaWYgKHNzdGFibGVXcml0ZXIuY3VycmVudFdyaXRlcigpLmdldEVzdGltYXRlZE9uRGlza0J5dGVzV3JpdHRlbigpID4gY3VycmVudEJ5dGVzVG9Xcml0ZSAmJiBjdXJyZW50UmF0aW9JbmRleCA8IHJhdGlvcy5sZW5ndGggLSAxKSAvLyBpZiB3ZSB1bmRlcmVzdGltYXRlIGhvdyBtYW55IGtleXMgd2UgaGF2ZSwgdGhlIGxhc3Qgc3N0YWJsZSBtaWdodCBnZXQgbW9yZSB0aGFuIHdlIGV4cGVjdAogICAgICAgICB7CiAgICAgICAgICAgICBjdXJyZW50UmF0aW9JbmRleCsrOworCiAgICAgICAgICAgICBjdXJyZW50Qnl0ZXNUb1dyaXRlID0gZ2V0RXhwZWN0ZWRXcml0ZVNpemUoKTsKLSAgICAgICAgICAgIHN3aXRjaENvbXBhY3Rpb25Mb2NhdGlvbihsb2NhdGlvbik7CisgICAgICAgICAgICBzd2l0Y2hDb21wYWN0aW9uTG9jYXRpb24oc3N0YWJsZURpcmVjdG9yeSk7CiAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIlN3aXRjaGluZyB3cml0ZXIsIGN1cnJlbnRCeXRlc1RvV3JpdGUgPSB7fSIsIGN1cnJlbnRCeXRlc1RvV3JpdGUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByaWUgIT0gbnVsbDsKQEAgLTEwMCwxOSArMTAxLDE3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc3dpdGNoQ29tcGFjdGlvbkxvY2F0aW9uKERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkgbG9jYXRpb24pCiAgICAgewotICAgICAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247CisgICAgICAgIHNzdGFibGVEaXJlY3RvcnkgPSBsb2NhdGlvbjsKICAgICAgICAgbG9uZyBjdXJyZW50UGFydGl0aW9uc1RvV3JpdGUgPSBNYXRoLnJvdW5kKHJhdGlvc1tjdXJyZW50UmF0aW9JbmRleF0gKiBlc3RpbWF0ZWRUb3RhbEtleXMpOworICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2sobG9jYXRpb24pKTsKKyAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IE1ldGFkYXRhQ29sbGVjdG9yKGFsbFNTVGFibGVzLCBjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yLCAwKTsKKyAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksIG5vbkV4cGlyZWRTU1RhYmxlcyk7CisKICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKLSAgICAgICAgU1NUYWJsZVdyaXRlciB3cml0ZXIgPSBTU1RhYmxlV3JpdGVyLmNyZWF0ZShjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2sobG9jYXRpb24pKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFydGl0aW9uc1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUmVwYWlyZWRBdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVHJhbnNpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5tZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0YWRhdGFDb2xsZWN0b3IoYWxsU1NUYWJsZXMsIGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZShjZnMubWV0YWRhdGEoKSwgbm9uRXhwaXJlZFNTVGFibGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhuKTsKKyAgICAgICAgU1NUYWJsZVdyaXRlciB3cml0ZXIgPSBuZXdXcml0ZXJCdWlsZGVyKGRlc2NyaXB0b3IpLnNldEtleUNvdW50KGN1cnJlbnRQYXJ0aXRpb25zVG9Xcml0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1ldGFkYXRhQ29sbGVjdG9yKGNvbGxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoaGVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQodHhuLCBjZnMpOwogICAgICAgICBsb2dnZXIudHJhY2UoIlN3aXRjaGluZyB3cml0ZXIsIGN1cnJlbnRQYXJ0aXRpb25zVG9Xcml0ZSA9IHt9IiwgY3VycmVudFBhcnRpdGlvbnNUb1dyaXRlKTsKICAgICAgICAgc3N0YWJsZVdyaXRlci5zd2l0Y2hXcml0ZXIod3JpdGVyKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvQ2x1c3RlcmluZ0luZGV4RmlsdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvQ2x1c3RlcmluZ0luZGV4RmlsdGVyLmphdmEKaW5kZXggOTI0ZmYyMS4uNTY0Y2ExYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL0NsdXN0ZXJpbmdJbmRleEZpbHRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9DbHVzdGVyaW5nSW5kZXhGaWx0ZXIuamF2YQpAQCAtMjMsNyArMjMsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQ2FjaGVkUGFydGl0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwpAQCAtMTQyLDEzICsxNDEsMTQgQEAKICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGdldFVuZmlsdGVyZWRSb3dJdGVyYXRvcihDb2x1bW5GaWx0ZXIgY29sdW1uRmlsdGVyLCBQYXJ0aXRpb24gcGFydGl0aW9uKTsKIAogICAgIC8qKgotICAgICAqIFdoZXRoZXIgdGhlIHByb3ZpZGVkIHNzdGFibGUgbWF5IGNvbnRhaW4gZGF0YSB0aGF0IGlzIHNlbGVjdGVkIGJ5IHRoaXMgZmlsdGVyIChiYXNlZCBvbiB0aGUgc3N0YWJsZSBtZXRhZGF0YSkuCisgICAgICogV2hldGhlciB0aGUgZGF0YSBzZWxlY3RlZCBieSB0aGlzIGZpbHRlciBpbnRlcnNlY3RzIHdpdGggdGhlIHByb3ZpZGVkIHNsaWNlLgogICAgICAqCi0gICAgICogQHBhcmFtIHNzdGFibGUgdGhlIHNzdGFibGUgZm9yIHdoaWNoIHdlIHdhbnQgdG8gdGVzdCB0aGUgbmVlZCBmb3IgaW5jbHVzaW9uLgorICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIHRoZSBjb21wYXJhdG9yIG9mIHRoZSB0YWJsZSB0aGlzIGlmIGEgZmlsdGVyIG9uLgorICAgICAqIEBwYXJhbSBzbGljZSB0aGUgc2xpY2UgdG8gY2hlY2sgaW50ZXJzZWN0aW9uIHdpdGgsCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIge0Bjb2RlIHNzdGFibGV9IHNob3VsZCBiZSBpbmNsdWRlZCB0byBhbnN3ZXIgdGhpcyBmaWx0ZXIuCisgICAgICogQHJldHVybiB3aGV0aGVyIHRoZSBkYXRhIHNlbGVjdGVkIGJ5IHRoaXMgZmlsdGVyIGludGVyc2VjdHMgd2l0aCB7QGNvZGUgc2xpY2V9LgogICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZEluY2x1ZGUoU1NUYWJsZVJlYWRlciBzc3RhYmxlKTsKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsIFNsaWNlIHNsaWNlKTsKIAogICAgIHB1YmxpYyBLaW5kIGtpbmQoKTsKIApAQCAtMTYxLDQgKzE2MSw0IEBACiAgICAgICAgIHB1YmxpYyBDbHVzdGVyaW5nSW5kZXhGaWx0ZXIgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24sIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbjsKICAgICAgICAgcHVibGljIGxvbmcgc2VyaWFsaXplZFNpemUoQ2x1c3RlcmluZ0luZGV4RmlsdGVyIGZpbHRlciwgaW50IHZlcnNpb24pOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvQ2x1c3RlcmluZ0luZGV4TmFtZXNGaWx0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9DbHVzdGVyaW5nSW5kZXhOYW1lc0ZpbHRlci5qYXZhCmluZGV4IDE4ZGM0NzEuLmE5OGUzYmQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9DbHVzdGVyaW5nSW5kZXhOYW1lc0ZpbHRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9DbHVzdGVyaW5nSW5kZXhOYW1lc0ZpbHRlci5qYXZhCkBAIC0xOCw3ICsxOCw2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlcjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuT3BlcmF0b3I7CkBAIC0yNiw3ICsyNSw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uVHJhbnNmb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CkBAIC0xNDIsMTYgKzE0MCwxMSBAQAogICAgICAgICByZXR1cm4gcGFydGl0aW9uLnVuZmlsdGVyZWRJdGVyYXRvcihjb2x1bW5GaWx0ZXIsIGNsdXN0ZXJpbmdzSW5RdWVyeU9yZGVyLCBpc1JldmVyc2VkKCkpOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZEluY2x1ZGUoU1NUYWJsZVJlYWRlciBzc3RhYmxlKQorICAgIHB1YmxpYyBib29sZWFuIGludGVyc2VjdHMoQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwgU2xpY2Ugc2xpY2UpCiAgICAgewotICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yID0gc3N0YWJsZS5tZXRhZGF0YSgpLmNvbXBhcmF0b3I7Ci0gICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWluQ2x1c3RlcmluZ1ZhbHVlcyA9IHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkubWluQ2x1c3RlcmluZ1ZhbHVlczsKLSAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBtYXhDbHVzdGVyaW5nVmFsdWVzID0gc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5tYXhDbHVzdGVyaW5nVmFsdWVzOwotCi0gICAgICAgIC8vIElmIGFueSBvZiB0aGUgcmVxdWVzdGVkIGNsdXN0ZXJpbmcgaXMgd2l0aGluIHRoZSBib3VuZHMgY292ZXJlZCBieSB0aGUgc3N0YWJsZSwgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBzc3RhYmxlCiAgICAgICAgIGZvciAoQ2x1c3RlcmluZzw/PiBjbHVzdGVyaW5nIDogY2x1c3RlcmluZ3MpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChTbGljZS5tYWtlKGNsdXN0ZXJpbmcpLmludGVyc2VjdHMoY29tcGFyYXRvciwgbWluQ2x1c3RlcmluZ1ZhbHVlcywgbWF4Q2x1c3RlcmluZ1ZhbHVlcykpCisgICAgICAgICAgICBpZiAoc2xpY2UuaW5jbHVkZXMoY29tcGFyYXRvciwgY2x1c3RlcmluZykpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjI2LDcgKzIxOSw3IEBACiAgICAgcHJvdGVjdGVkIHZvaWQgc2VyaWFsaXplSW50ZXJuYWwoRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yID0gKENsdXN0ZXJpbmdDb21wYXJhdG9yKWNsdXN0ZXJpbmdzLmNvbXBhcmF0b3IoKTsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGNsdXN0ZXJpbmdzLnNpemUoKSk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGNsdXN0ZXJpbmdzLnNpemUoKSk7CiAgICAgICAgIGZvciAoQ2x1c3RlcmluZzw/PiBjbHVzdGVyaW5nIDogY2x1c3RlcmluZ3MpCiAgICAgICAgICAgICBDbHVzdGVyaW5nLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGNsdXN0ZXJpbmcsIG91dCwgdmVyc2lvbiwgY29tcGFyYXRvci5zdWJ0eXBlcygpKTsKICAgICB9CkBAIC0yNDUsNyArMjM4LDcgQEAKICAgICAgICAgcHVibGljIENsdXN0ZXJpbmdJbmRleEZpbHRlciBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbiwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgYm9vbGVhbiByZXZlcnNlZCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBtZXRhZGF0YS5jb21wYXJhdG9yOwotICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBzaXplID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICB0cnkgKEJUcmVlLkZhc3RCdWlsZGVyPENsdXN0ZXJpbmc8Pz4+IGJ1aWxkZXIgPSBCVHJlZS5mYXN0QnVpbGRlcigpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQpAQCAtMjU1LDQgKzI0OCw0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL0NsdXN0ZXJpbmdJbmRleFNsaWNlRmlsdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvQ2x1c3RlcmluZ0luZGV4U2xpY2VGaWx0ZXIuamF2YQppbmRleCAxNzhjOTZiLi42N2FlZWI3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvQ2x1c3RlcmluZ0luZGV4U2xpY2VGaWx0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvQ2x1c3RlcmluZ0luZGV4U2xpY2VGaWx0ZXIuamF2YQpAQCAtMTgsMTggKzE4LDE1IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlcjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQ2FjaGVkUGFydGl0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uVHJhbnNmb3JtYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIAogLyoqCiAgKiBBIGZpbHRlciBvdmVyIGEgc2luZ2xlIHBhcnRpdGlvbi4KQEAgLTEyNiwxNSArMTIzLDkgQEAKICAgICAgICAgcmV0dXJuIHBhcnRpdGlvbi51bmZpbHRlcmVkSXRlcmF0b3IoY29sdW1uRmlsdGVyLCBzbGljZXMsIHJldmVyc2VkKTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmNsdWRlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkKKyAgICBwdWJsaWMgYm9vbGVhbiBpbnRlcnNlY3RzKENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IsIFNsaWNlIHNsaWNlKQogICAgIHsKLSAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBtaW5DbHVzdGVyaW5nVmFsdWVzID0gc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5taW5DbHVzdGVyaW5nVmFsdWVzOwotICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IG1heENsdXN0ZXJpbmdWYWx1ZXMgPSBzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLm1heENsdXN0ZXJpbmdWYWx1ZXM7Ci0KLSAgICAgICAgaWYgKG1pbkNsdXN0ZXJpbmdWYWx1ZXMuaXNFbXB0eSgpIHx8IG1heENsdXN0ZXJpbmdWYWx1ZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgcmV0dXJuIHNsaWNlcy5pbnRlcnNlY3RzKG1pbkNsdXN0ZXJpbmdWYWx1ZXMsIG1heENsdXN0ZXJpbmdWYWx1ZXMpOworICAgICAgICByZXR1cm4gc2xpY2VzLmludGVyc2VjdHMoc2xpY2UpOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkKQEAgLTE3Niw0ICsxNjcsNCBAQAogICAgICAgICAgICAgcmV0dXJuIG5ldyBDbHVzdGVyaW5nSW5kZXhTbGljZUZpbHRlcihzbGljZXMsIHJldmVyc2VkKTsKICAgICAgICAgfQogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvQ29sdW1uRmlsdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvQ29sdW1uRmlsdGVyLmphdmEKaW5kZXggMGVkNjIzNy4uNDhiYTczOCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL0NvbHVtbkZpbHRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9Db2x1bW5GaWx0ZXIuamF2YQpAQCAtOTg4LDcgKzk4OCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChzdWJTZWxlY3Rpb25zICE9IG51bGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHN1YlNlbGVjdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihzdWJTZWxlY3Rpb25zLnNpemUoKSk7CiAgICAgICAgICAgICAgICAgZm9yIChDb2x1bW5TdWJzZWxlY3Rpb24gc3ViU2VsIDogc3ViU2VsZWN0aW9ucy52YWx1ZXMoKSkKICAgICAgICAgICAgICAgICAgICAgQ29sdW1uU3Vic2VsZWN0aW9uLnNlcmlhbGl6ZXIuc2VyaWFsaXplKHN1YlNlbCwgb3V0LCB2ZXJzaW9uKTsKICAgICAgICAgICAgIH0KQEAgLTEwNzgsNyArMTA3OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgU29ydGVkU2V0TXVsdGltYXA8Q29sdW1uSWRlbnRpZmllciwgQ29sdW1uU3Vic2VsZWN0aW9uPiBzdWJTZWxlY3Rpb25zID0gVHJlZU11bHRpbWFwLmNyZWF0ZShDb21wYXJhdG9yLm5hdHVyYWxPcmRlcigpLCBDb21wYXJhdG9yLm5hdHVyYWxPcmRlcigpKTsKLSAgICAgICAgICAgIGludCBzaXplID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIENvbHVtblN1YnNlbGVjdGlvbiBzdWJTZWwgPSBDb2x1bW5TdWJzZWxlY3Rpb24uc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgdmVyc2lvbiwgbWV0YWRhdGEpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL0RhdGFMaW1pdHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9EYXRhTGltaXRzLmphdmEKaW5kZXggZjk4OGNiMy4uNjQ5ZGYyMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL0RhdGFMaW1pdHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvRGF0YUxpbWl0cy5qYXZhCkBAIC0xMTQ0LDIyICsxMTQ0LDIyIEBACiAgICAgICAgICAgICAgICAgY2FzZSBDUUxfTElNSVQ6CiAgICAgICAgICAgICAgICAgY2FzZSBDUUxfUEFHSU5HX0xJTUlUOgogICAgICAgICAgICAgICAgICAgICBDUUxMaW1pdHMgY3FsTGltaXRzID0gKENRTExpbWl0cylsaW1pdHM7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChjcWxMaW1pdHMucm93TGltaXQpOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoY3FsTGltaXRzLnBlclBhcnRpdGlvbkxpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoY3FsTGltaXRzLnJvd0xpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoY3FsTGltaXRzLnBlclBhcnRpdGlvbkxpbWl0KTsKICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihjcWxMaW1pdHMuaXNEaXN0aW5jdCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChsaW1pdHMua2luZCgpID09IEtpbmQuQ1FMX1BBR0lOR19MSU1JVCkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgQ1FMUGFnaW5nTGltaXRzIHBhZ2luZ0xpbWl0cyA9IChDUUxQYWdpbmdMaW1pdHMpY3FsTGltaXRzOwogICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoVkludExlbmd0aChwYWdpbmdMaW1pdHMubGFzdFJldHVybmVkS2V5LCBvdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHBhZ2luZ0xpbWl0cy5sYXN0UmV0dXJuZWRLZXlSZW1haW5pbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIocGFnaW5nTGltaXRzLmxhc3RSZXR1cm5lZEtleVJlbWFpbmluZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBDUUxfR1JPVVBfQllfTElNSVQ6CiAgICAgICAgICAgICAgICAgY2FzZSBDUUxfR1JPVVBfQllfUEFHSU5HX0xJTUlUOgogICAgICAgICAgICAgICAgICAgICBDUUxHcm91cEJ5TGltaXRzIGdyb3VwQnlMaW1pdHMgPSAoQ1FMR3JvdXBCeUxpbWl0cykgbGltaXRzOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoZ3JvdXBCeUxpbWl0cy5ncm91cExpbWl0KTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGdyb3VwQnlMaW1pdHMuZ3JvdXBQZXJQYXJ0aXRpb25MaW1pdCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChncm91cEJ5TGltaXRzLnJvd0xpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoZ3JvdXBCeUxpbWl0cy5ncm91cExpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoZ3JvdXBCeUxpbWl0cy5ncm91cFBlclBhcnRpdGlvbkxpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoZ3JvdXBCeUxpbWl0cy5yb3dMaW1pdCk7CiAKICAgICAgICAgICAgICAgICAgICAgQWdncmVnYXRpb25TcGVjaWZpY2F0aW9uIGdyb3VwQnlTcGVjID0gZ3JvdXBCeUxpbWl0cy5ncm91cEJ5U3BlYzsKICAgICAgICAgICAgICAgICAgICAgQWdncmVnYXRpb25TcGVjaWZpY2F0aW9uLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGdyb3VwQnlTcGVjLCBvdXQsIHZlcnNpb24pOwpAQCAtMTE3MCw3ICsxMTcwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgQ1FMR3JvdXBCeVBhZ2luZ0xpbWl0cyBwYWdpbmdMaW1pdHMgPSAoQ1FMR3JvdXBCeVBhZ2luZ0xpbWl0cykgZ3JvdXBCeUxpbWl0czsKICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFZJbnRMZW5ndGgocGFnaW5nTGltaXRzLmxhc3RSZXR1cm5lZEtleSwgb3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChwYWdpbmdMaW1pdHMubGFzdFJldHVybmVkS2V5UmVtYWluaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHBhZ2luZ0xpbWl0cy5sYXN0UmV0dXJuZWRLZXlSZW1haW5pbmcpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xMTg0LDIxICsxMTg0LDIxIEBACiAgICAgICAgICAgICAgICAgY2FzZSBDUUxfTElNSVQ6CiAgICAgICAgICAgICAgICAgY2FzZSBDUUxfUEFHSU5HX0xJTUlUOgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJvd0xpbWl0ID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcGVyUGFydGl0aW9uTGltaXQgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICAgICAgICAgIGludCByb3dMaW1pdCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworICAgICAgICAgICAgICAgICAgICBpbnQgcGVyUGFydGl0aW9uTGltaXQgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0Rpc3RpbmN0ID0gaW4ucmVhZEJvb2xlYW4oKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gS2luZC5DUUxfTElNSVQpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3FsTGltaXRzKHJvd0xpbWl0LCBwZXJQYXJ0aXRpb25MaW1pdCwgaXNEaXN0aW5jdCk7CiAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgbGFzdEtleSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoVkludExlbmd0aChpbik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsYXN0UmVtYWluaW5nID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdFJlbWFpbmluZyA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENRTFBhZ2luZ0xpbWl0cyhyb3dMaW1pdCwgcGVyUGFydGl0aW9uTGltaXQsIGlzRGlzdGluY3QsIGxhc3RLZXksIGxhc3RSZW1haW5pbmcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXNlIENRTF9HUk9VUF9CWV9MSU1JVDoKICAgICAgICAgICAgICAgICBjYXNlIENRTF9HUk9VUF9CWV9QQUdJTkdfTElNSVQ6CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXBMaW1pdCA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwUGVyUGFydGl0aW9uTGltaXQgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByb3dMaW1pdCA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwTGltaXQgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwUGVyUGFydGl0aW9uTGltaXQgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJvd0xpbWl0ID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAKICAgICAgICAgICAgICAgICAgICAgQWdncmVnYXRpb25TcGVjaWZpY2F0aW9uIGdyb3VwQnlTcGVjID0gQWdncmVnYXRpb25TcGVjaWZpY2F0aW9uLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24sIG1ldGFkYXRhKTsKIApAQCAtMTIxMiw3ICsxMjEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBsYXN0S2V5ID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhWSW50TGVuZ3RoKGluKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RSZW1haW5pbmcgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICAgICAgICAgIGludCBsYXN0UmVtYWluaW5nID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ1FMR3JvdXBCeVBhZ2luZ0xpbWl0cyhncm91cExpbWl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBQZXJQYXJ0aXRpb25MaW1pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0xpbWl0LApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL1Jvd0ZpbHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL1Jvd0ZpbHRlci5qYXZhCmluZGV4IDVlMGZiNTEuLjZkNzE3MDEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9Sb3dGaWx0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvUm93RmlsdGVyLmphdmEKQEAgLTEwMzgsNyArMTAzOCw3IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShSb3dGaWx0ZXIgZmlsdGVyLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihmYWxzZSk7IC8vIE9sZCAiaXMgZm9yIHRocmlmdCIgYm9vbGVhbgotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGZpbHRlci5leHByZXNzaW9ucy5zaXplKCkpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoZmlsdGVyLmV4cHJlc3Npb25zLnNpemUoKSk7CiAgICAgICAgICAgICBmb3IgKEV4cHJlc3Npb24gZXhwciA6IGZpbHRlci5leHByZXNzaW9ucykKICAgICAgICAgICAgICAgICBFeHByZXNzaW9uLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGV4cHIsIG91dCwgdmVyc2lvbik7CiAKQEAgLTEwNDcsNyArMTA0Nyw3IEBACiAgICAgICAgIHB1YmxpYyBSb3dGaWx0ZXIgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24sIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBpbi5yZWFkQm9vbGVhbigpOyAvLyBVbnVzZWQKLSAgICAgICAgICAgIGludCBzaXplID0gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICAgICAgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9IG5ldyBBcnJheUxpc3Q8PihzaXplKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgICAgICAgICAgICAgIGV4cHJlc3Npb25zLmFkZChFeHByZXNzaW9uLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24sIG1ldGFkYXRhKSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvUm93SW5kZXhFbnRyeVJlYWRTaXplVG9vTGFyZ2VFeGNlcHRpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9Sb3dJbmRleEVudHJ5UmVhZFNpemVUb29MYXJnZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGYzZjhmLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9Sb3dJbmRleEVudHJ5UmVhZFNpemVUb29MYXJnZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWplY3RFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSb3dJbmRleEVudHJ5UmVhZFNpemVUb29MYXJnZUV4Y2VwdGlvbiBleHRlbmRzIFJlamVjdEV4Y2VwdGlvbgotewotICAgIHB1YmxpYyBSb3dJbmRleEVudHJ5UmVhZFNpemVUb29MYXJnZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKLSAgICB7Ci0gICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvRGlzYWJsZUZsYWcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvRGlzYWJsZUZsYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjMTk1MS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0Rpc2FibGVGbGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOwotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwotCi0vKioKLSAqIEEgZ3VhcmRyYWlsIHRoYXQgY29tcGxldGVseSBkaXNhYmxlcyB0aGUgdXNlIG9mIGEgcGFydGljdWxhciBmZWF0dXJlLgotICoKLSAqIDxwPk5vdGUgdGhhdCB0aGlzIGd1YXJkcmFpbCBvbmx5IGFib3J0cyBvcGVyYXRpb25zIChpZiB0aGUgZmVhdHVyZSBpcyBkaXNhYmxlZCkgc28gaXMgb25seSBtZWFudCBmb3IKLSAqIHF1ZXJ5LWJhc2VkIGd1YXJkcmFpbHMgKHdlJ3JlIGhhcHB5IHRvIHJlamVjdCBxdWVyaWVzIGRlZW1lZCBkYW5nZXJvdXMsIGJ1dCB3ZSBkb24ndCB3YW50IHRvIGNyZWF0ZSBhIGd1YXJkcmFpbAotICogdGhhdCBicmVha3MgY29tcGFjdGlvbiBmb3IgaW5zdGFuY2UpLgotICovCi1wdWJsaWMgY2xhc3MgRGlzYWJsZUZsYWcgZXh0ZW5kcyBHdWFyZHJhaWwKLXsKLSAgICBwcml2YXRlIGZpbmFsIFByZWRpY2F0ZTxDbGllbnRTdGF0ZT4gZGlzYWJsZWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgd2hhdDsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIERpc2FibGVGbGFnfSBndWFyZHJhaWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSAgICAgdGhlIGlkZW50aWZ5aW5nIG5hbWUgb2YgdGhlIGd1YXJkcmFpbAotICAgICAqIEBwYXJhbSBkaXNhYmxlZCBhIHtAbGluayBDbGllbnRTdGF0ZX0tYmFzZWQgc3VwcGxpZXIgb2YgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZlYXR1cmUgZ3VhcmRlZCBieSB0aGlzCi0gICAgICogICAgICAgICAgICAgICAgIGd1YXJkcmFpbCBtdXN0IGJlIGRpc2FibGVkLgotICAgICAqIEBwYXJhbSB3aGF0ICAgICBUaGUgZmVhdHVyZSB0aGF0IGlzIGd1YXJkZWQgYnkgdGhpcyBndWFyZHJhaWwgKGZvciByZXBvcnRpbmcgaW4gZXJyb3IgbWVzc2FnZXMpLAotICAgICAqICAgICAgICAgICAgICAgICB7QGxpbmsgRGlzYWJsZUZsYWcjZW5zdXJlRW5hYmxlZChTdHJpbmcsIENsaWVudFN0YXRlKX0gY2FuIHNwZWNpZnkgYSBkaWZmZXJlbnQge0Bjb2RlIHdoYXR9LgotICAgICAqLwotICAgIHB1YmxpYyBEaXNhYmxlRmxhZyhTdHJpbmcgbmFtZSwgUHJlZGljYXRlPENsaWVudFN0YXRlPiBkaXNhYmxlZCwgU3RyaW5nIHdoYXQpCi0gICAgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkOwotICAgICAgICB0aGlzLndoYXQgPSB3aGF0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFib3J0cyB0aGUgb3BlcmF0aW9uIGlmIHRoaXMgZ3VhcmRyYWlsIGlzIGRpc2FibGVkLgotICAgICAqCi0gICAgICogPHA+VGhpcyBtdXN0IGJlIGNhbGxlZCB3aGVuIHRoZSBmZWF0dXJlIGd1YXJkZWQgYnkgdGhpcyBndWFyZHJhaWwgaXMgdXNlZCB0byBlbnN1cmUgc3VjaCB1c2UgaXMgaW4gZmFjdAotICAgICAqIGFsbG93ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3RhdGUgVGhlIGNsaWVudCBzdGF0ZSwgdXNlZCB0byBza2lwIHRoZSBjaGVjayBpZiB0aGUgcXVlcnkgaXMgaW50ZXJuYWwgb3IgaXMgZG9uZSBieSBhIHN1cGVydXNlci4KLSAgICAgKiAgICAgICAgICAgICAgQSB7QGNvZGUgbnVsbH0gdmFsdWUgbWVhbnMgdGhhdCB0aGUgY2hlY2sgc2hvdWxkIGJlIGRvbmUgcmVnYXJkbGVzcyBvZiB0aGUgcXVlcnkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5zdXJlRW5hYmxlZChATnVsbGFibGUgQ2xpZW50U3RhdGUgc3RhdGUpCi0gICAgewotICAgICAgICBlbnN1cmVFbmFibGVkKHdoYXQsIHN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBYm9ydHMgdGhlIG9wZXJhdGlvbiBpZiB0aGlzIGd1YXJkcmFpbCBpcyBkaXNhYmxlZC4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgZmVhdHVyZSBndWFyZGVkIGJ5IHRoaXMgZ3VhcmRyYWlsIGlzIHVzZWQgdG8gZW5zdXJlIHN1Y2ggdXNlIGlzIGluIGZhY3QKLSAgICAgKiBhbGxvd2VkLgotICAgICAqCi0gICAgICogQHBhcmFtIHdoYXQgIFRoZSBmZWF0dXJlIHRoYXQgaXMgZ3VhcmRlZCBieSB0aGlzIGd1YXJkcmFpbCAoZm9yIHJlcG9ydGluZyBpbiBlcnJvciBtZXNzYWdlcykuCi0gICAgICogQHBhcmFtIHN0YXRlIFRoZSBjbGllbnQgc3RhdGUsIHVzZWQgdG8gc2tpcCB0aGUgY2hlY2sgaWYgdGhlIHF1ZXJ5IGlzIGludGVybmFsIG9yIGlzIGRvbmUgYnkgYSBzdXBlcnVzZXIuCi0gICAgICogICAgICAgICAgICAgIEEge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIHRoYXQgdGhlIGNoZWNrIHNob3VsZCBiZSBkb25lIHJlZ2FyZGxlc3Mgb2YgdGhlIHF1ZXJ5LCBhbHRob3VnaCBpdCB3b24ndAotICAgICAqICAgICAgICAgICAgICB0aHJvdyBhbnkgZXhjZXB0aW9uIGlmIHRoZSBmYWlsdXJlIHRocmVzaG9sZCBpcyBleGNlZWRlZC4gVGhpcyBpcyBzbyBiZWNhdXNlIGNoZWNrcyB3aXRob3V0IGFuCi0gICAgICogICAgICAgICAgICAgIGFzc29jaWF0ZWQgY2xpZW50IGNvbWUgZnJvbSBhc3luY2hyb25vdXMgcHJvY2Vzc2VzIHN1Y2ggYXMgY29tcGFjdGlvbiwgYW5kIHdlIGRvbid0IHdhbnQgdG8KLSAgICAgKiAgICAgICAgICAgICAgaW50ZXJydXB0IHN1Y2ggcHJvY2Vzc2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVuc3VyZUVuYWJsZWQoU3RyaW5nIHdoYXQsIEBOdWxsYWJsZSBDbGllbnRTdGF0ZSBzdGF0ZSkKLSAgICB7Ci0gICAgICAgIGlmIChlbmFibGVkKHN0YXRlKSAmJiBkaXNhYmxlZC50ZXN0KHN0YXRlKSkKLSAgICAgICAgICAgIGZhaWwod2hhdCArICIgaXMgbm90IGFsbG93ZWQiLCBzdGF0ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9FbmFibGVGbGFnLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0VuYWJsZUZsYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGUwOWJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9FbmFibGVGbGFnLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlsczsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CisKKy8qKgorICogQSBndWFyZHJhaWwgdGhhdCBlbmFibGVzIHRoZSB1c2Ugb2YgYSBwYXJ0aWN1bGFyIGZlYXR1cmUuCisgKgorICogPHA+Tm90ZSB0aGF0IHRoaXMgZ3VhcmRyYWlsIG9ubHkgYWJvcnRzIG9wZXJhdGlvbnMgKGlmIHRoZSBmZWF0dXJlIGlzIG5vdCBlbmFibGVkKSBzbyBpcyBvbmx5IG1lYW50IGZvciBxdWVyeS1iYXNlZAorICogZ3VhcmRyYWlscyAod2UncmUgaGFwcHkgdG8gcmVqZWN0IHF1ZXJpZXMgZGVlbWVkIGRhbmdlcm91cywgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3JlYXRlIGEgZ3VhcmRyYWlsIHRoYXQgYnJlYWtzCisgKiBjb21wYWN0aW9uIGZvciBpbnN0YW5jZSkuCisgKi8KK3B1YmxpYyBjbGFzcyBFbmFibGVGbGFnIGV4dGVuZHMgR3VhcmRyYWlsCit7CisgICAgcHJpdmF0ZSBmaW5hbCBQcmVkaWNhdGU8Q2xpZW50U3RhdGU+IHdhcm5lZDsKKyAgICBwcml2YXRlIGZpbmFsIFByZWRpY2F0ZTxDbGllbnRTdGF0ZT4gZW5hYmxlZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmZWF0dXJlTmFtZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEVuYWJsZUZsYWd9IGd1YXJkcmFpbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lICAgICAgICB0aGUgaWRlbnRpZnlpbmcgbmFtZSBvZiB0aGUgZ3VhcmRyYWlsCisgICAgICogQHBhcmFtIHJlYXNvbiAgICAgIHRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciBndWFyZGluZyB0aGUgb3BlcmF0aW9uCisgICAgICogQHBhcmFtIGVuYWJsZWQgICAgIGEge0BsaW5rIENsaWVudFN0YXRlfS1iYXNlZCBzdXBwbGllciBvZiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZmVhdHVyZSBndWFyZGVkIGJ5IHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgZ3VhcmRyYWlsIGlzIGVuYWJsZWQuCisgICAgICogQHBhcmFtIGZlYXR1cmVOYW1lIFRoZSBmZWF0dXJlIHRoYXQgaXMgZ3VhcmRlZCBieSB0aGlzIGd1YXJkcmFpbCAoZm9yIHJlcG9ydGluZyBpbiBlcnJvciBtZXNzYWdlcyksIHtAbGluaworICAgICAqICAgICAgICAgICAgICAgICAgICBFbmFibGVGbGFnI2Vuc3VyZUVuYWJsZWQoU3RyaW5nLCBDbGllbnRTdGF0ZSl9IGNhbiBzcGVjaWZ5IGEgZGlmZmVyZW50IHtAY29kZSBmZWF0dXJlTmFtZX0uCisgICAgICovCisgICAgcHVibGljIEVuYWJsZUZsYWcoU3RyaW5nIG5hbWUsIEBOdWxsYWJsZSBTdHJpbmcgcmVhc29uLCBQcmVkaWNhdGU8Q2xpZW50U3RhdGU+IGVuYWJsZWQsIFN0cmluZyBmZWF0dXJlTmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMobmFtZSwgcmVhc29uLCAoc3RhdGUpIC0+IGZhbHNlLCBlbmFibGVkLCBmZWF0dXJlTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgRW5hYmxlRmxhZ30gZ3VhcmRyYWlsLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgICAgICAgIHRoZSBpZGVudGlmeWluZyBuYW1lIG9mIHRoZSBndWFyZHJhaWwKKyAgICAgKiBAcGFyYW0gcmVhc29uICAgICAgdGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIGd1YXJkaW5nIHRoZSBvcGVyYXRpb24KKyAgICAgKiBAcGFyYW0gd2FybmVkICAgICAgYSB7QGxpbmsgQ2xpZW50U3RhdGV9LWJhc2VkIHN1cHBsaWVyIG9mIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHdhcm5pbmcgc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgIGVtaXR0ZWQgZXZlbiBndWFyZHJhaWwgYXMgc3VjaCBoYXMgcGFzc2VkLiBJZiBndWFyZHJhaWwgZmFpbHMsIHRoZSB3YXJuaW5nIHdpbGwgbm90IGJlCisgICAgICogICAgICAgICAgICAgICAgICAgIGVtaXR0ZWQuIFRoaXMgbWlnaHQgYmUgdXNlZCBmb3IgY2FzZXMgd2hlbiB3ZSB3YW50IHRvIHdhcm4gYSB1c2VyIHJlZ2FyZGxlc3Mgb2Ygc3VjY2Vzc2Z1bAorICAgICAqICAgICAgICAgICAgICAgICAgICBndWFyZHJhaWwgZXhlY3V0aW9uLgorICAgICAqIEBwYXJhbSBlbmFibGVkICAgICBhIHtAbGluayBDbGllbnRTdGF0ZX0tYmFzZWQgc3VwcGxpZXIgb2YgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZlYXR1cmUgZ3VhcmRlZCBieSB0aGlzCisgICAgICogICAgICAgICAgICAgICAgICAgIGd1YXJkcmFpbCBpcyBlbmFibGVkLgorICAgICAqIEBwYXJhbSBmZWF0dXJlTmFtZSBUaGUgZmVhdHVyZSB0aGF0IGlzIGd1YXJkZWQgYnkgdGhpcyBndWFyZHJhaWwgKGZvciByZXBvcnRpbmcgaW4gZXJyb3IgbWVzc2FnZXMpLCB7QGxpbmsKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgRW5hYmxlRmxhZyNlbnN1cmVFbmFibGVkKFN0cmluZywgQ2xpZW50U3RhdGUpfSBjYW4gc3BlY2lmeSBhIGRpZmZlcmVudCB7QGNvZGUgZmVhdHVyZU5hbWV9LgorICAgICAqLworICAgIHB1YmxpYyBFbmFibGVGbGFnKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgIFByZWRpY2F0ZTxDbGllbnRTdGF0ZT4gd2FybmVkLAorICAgICAgICAgICAgICAgICAgICAgIFByZWRpY2F0ZTxDbGllbnRTdGF0ZT4gZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZmVhdHVyZU5hbWUpCisgICAgeworICAgICAgICBzdXBlcihuYW1lLCByZWFzb24pOworICAgICAgICB0aGlzLndhcm5lZCA9IHdhcm5lZDsKKyAgICAgICAgdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKKyAgICAgICAgdGhpcy5mZWF0dXJlTmFtZSA9IGZlYXR1cmVOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZ3VhcmRlZCBmZWF0dXJlIGlzIGVuYWJsZWQgb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXRlIFRoZSBjbGllbnQgc3RhdGUsIHVzZWQgdG8gc2tpcCB0aGUgY2hlY2sgaWYgdGhlIHF1ZXJ5IGlzIGludGVybmFsIG9yIGlzIGRvbmUgYnkgYSBzdXBlcnVzZXIuCisgICAgICogICAgICAgICAgICAgIEEge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIHRoYXQgdGhlIGNoZWNrIHNob3VsZCBiZSBkb25lIHJlZ2FyZGxlc3Mgb2YgdGhlIHF1ZXJ5LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlzIHRoZSBmZWF0dXJlIGlzIGVuYWJsZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChATnVsbGFibGUgQ2xpZW50U3RhdGUgc3RhdGUpCisgICAgeworICAgICAgICByZXR1cm4gIWVuYWJsZWQoc3RhdGUpIHx8IGVuYWJsZWQudGVzdChzdGF0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWJvcnRzIHRoZSBvcGVyYXRpb24gaWYgdGhpcyBndWFyZHJhaWwgaXMgbm90IGVuYWJsZWQuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG11c3QgYmUgY2FsbGVkIHdoZW4gdGhlIGZlYXR1cmUgZ3VhcmRlZCBieSB0aGlzIGd1YXJkcmFpbCBpcyB1c2VkIHRvIGVuc3VyZSBzdWNoIHVzZSBpcyBpbiBmYWN0CisgICAgICogYWxsb3dlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZSBUaGUgY2xpZW50IHN0YXRlLCB1c2VkIHRvIHNraXAgdGhlIGNoZWNrIGlmIHRoZSBxdWVyeSBpcyBpbnRlcm5hbCBvciBpcyBkb25lIGJ5IGEgc3VwZXJ1c2VyLgorICAgICAqICAgICAgICAgICAgICBBIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyB0aGF0IHRoZSBjaGVjayBzaG91bGQgYmUgZG9uZSByZWdhcmRsZXNzIG9mIHRoZSBxdWVyeS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbnN1cmVFbmFibGVkKEBOdWxsYWJsZSBDbGllbnRTdGF0ZSBzdGF0ZSkKKyAgICB7CisgICAgICAgIGVuc3VyZUVuYWJsZWQoZmVhdHVyZU5hbWUsIHN0YXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBYm9ydHMgdGhlIG9wZXJhdGlvbiBpZiB0aGlzIGd1YXJkcmFpbCBpcyBub3QgZW5hYmxlZC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgZmVhdHVyZSBndWFyZGVkIGJ5IHRoaXMgZ3VhcmRyYWlsIGlzIHVzZWQgdG8gZW5zdXJlIHN1Y2ggdXNlIGlzIGluIGZhY3QKKyAgICAgKiBhbGxvd2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGZlYXR1cmVOYW1lIFRoZSBmZWF0dXJlIHRoYXQgaXMgZ3VhcmRlZCBieSB0aGlzIGd1YXJkcmFpbCAoZm9yIHJlcG9ydGluZyBpbiBlcnJvciBtZXNzYWdlcykuCisgICAgICogQHBhcmFtIHN0YXRlICAgICAgIFRoZSBjbGllbnQgc3RhdGUsIHVzZWQgdG8gc2tpcCB0aGUgY2hlY2sgaWYgdGhlIHF1ZXJ5IGlzIGludGVybmFsIG9yIGlzIGRvbmUgYnkgYSBzdXBlcnVzZXIuIEEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIHRoYXQgdGhlIGNoZWNrIHNob3VsZCBiZSBkb25lIHJlZ2FyZGxlc3Mgb2YgdGhlIHF1ZXJ5LCBhbHRob3VnaCBpdAorICAgICAqICAgICAgICAgICAgICAgICAgICB3b24ndCB0aHJvdyBhbnkgZXhjZXB0aW9uIGlmIHRoZSBmYWlsdXJlIHRocmVzaG9sZCBpcyBleGNlZWRlZC4gVGhpcyBpcyBzbyBiZWNhdXNlIGNoZWNrcworICAgICAqICAgICAgICAgICAgICAgICAgICB3aXRob3V0IGFuIGFzc29jaWF0ZWQgY2xpZW50IGNvbWUgZnJvbSBhc3luY2hyb25vdXMgcHJvY2Vzc2VzIHN1Y2ggYXMgY29tcGFjdGlvbiwgYW5kIHdlIGRvbid0CisgICAgICogICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gaW50ZXJydXB0IHN1Y2ggcHJvY2Vzc2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuc3VyZUVuYWJsZWQoU3RyaW5nIGZlYXR1cmVOYW1lLCBATnVsbGFibGUgQ2xpZW50U3RhdGUgc3RhdGUpCisgICAgeworICAgICAgICBpZiAoIWVuYWJsZWQoc3RhdGUpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICghZW5hYmxlZC50ZXN0KHN0YXRlKSkKKyAgICAgICAgeworICAgICAgICAgICAgZmFpbChmZWF0dXJlTmFtZSArICIgaXMgbm90IGFsbG93ZWQiLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAod2FybmVkLnRlc3Qoc3RhdGUpKQorICAgICAgICAgICAgd2FybihmZWF0dXJlTmFtZSArICIgaXMgbm90IHJlY29tbWVuZGVkIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWwuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsLmphdmEKaW5kZXggYzA1OGYxMC4uZmJkMWE1YiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWwuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbC5qYXZhCkBAIC01MSw2ICs1MSwxMCBAQAogICAgIC8qKiBBIG5hbWUgaWRlbnRpZnlpbmcgdGhlIGd1YXJkcmFpbCAobWFpbmx5IGZvciBzaGlwcGluZyB3aXRoIGRpYWdub3N0aWMgZXZlbnRzKS4gKi8KICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7CiAKKyAgICAvKiogQW4gb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgZ3VhcmRpbmcgdGhlIG9wZXJhdGlvbi4gKi8KKyAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHJlYXNvbjsKKwogICAgIC8qKiBNaW5pbXVtIGxvZ2dpbmcgYW5kIHRyaWdnZXJpbmcgaW50ZXJ2YWwgdG8gYXZvaWQgc3BhbW1pbmcgZG93bnN0cmVhbS4gKi8KICAgICBwcml2YXRlIGxvbmcgbWluTm90aWZ5SW50ZXJ2YWxJbk1zID0gMDsKIApAQCAtNjAsOSArNjQsMTAgQEAKICAgICAvKiogVGltZSBvZiBsYXN0IGZhaWx1cmUgaW4gbWlsbGlzZWNvbmRzLiAqLwogICAgIHByaXZhdGUgdm9sYXRpbGUgbG9uZyBsYXN0RmFpbEluTXMgPSAwOwogCi0gICAgR3VhcmRyYWlsKFN0cmluZyBuYW1lKQorICAgIEd1YXJkcmFpbChTdHJpbmcgbmFtZSwgQE51bGxhYmxlIFN0cmluZyByZWFzb24pCiAgICAgewogICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjsKICAgICB9CiAKICAgICAvKioKQEAgLTEzOCw4ICsxNDMsMTYgQEAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBTdHJpbmcgZGVjb3JhdGVNZXNzYWdlKFN0cmluZyBtZXNzYWdlKQogICAgIHsKLSAgICAgICAgLy8gQWRkIGEgcHJlZml4IHRvIGVycm9yIG1lc3NhZ2Ugc28gdXNlciBrbm93cyB3aGF0IHRocmV3IHRoZSB3YXJuaW5nIG9yIGNhdXNlIHRoZSBmYWlsdXJlCi0gICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJHdWFyZHJhaWwgJXMgdmlvbGF0ZWQ6ICVzIiwgbmFtZSwgbWVzc2FnZSk7CisgICAgICAgIC8vIEFkZCBhIHByZWZpeCB0byBlcnJvciBtZXNzYWdlIHNvIHVzZXIga25vd3Mgd2hhdCB0aHJldyB0aGUgd2FybmluZyBvciBjYXVzZSB0aGUgZmFpbHVyZS4KKyAgICAgICAgU3RyaW5nIGRlY29yYXRlZE1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KCJHdWFyZHJhaWwgJXMgdmlvbGF0ZWQ6ICVzIiwgbmFtZSwgbWVzc2FnZSk7CisKKyAgICAgICAgLy8gQWRkIHRoZSByZWFzb24gZm9yIHRoZSBndWFyZHJhaWwgdHJpZ2dlcmluZywgaWYgdGhlcmUgaXMgYW55LgorICAgICAgICBpZiAocmVhc29uICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlY29yYXRlZE1lc3NhZ2UgKz0gKG1lc3NhZ2UuZW5kc1dpdGgoIi4iKSA/ICcgJyA6ICIuICIpICsgcmVhc29uOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlY29yYXRlZE1lc3NhZ2U7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlscy5qYXZhCmluZGV4IDlkMDhhYjAuLmQyMjg5YjQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlscy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlscy5qYXZhCkBAIC0zMSw5ICszMSwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkd1YXJkcmFpbHNPcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbnNpc3RlbmN5TGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5UaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5kaXNrLnVzYWdlLkRpc2tVc2FnZUJyb2FkY2FzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1CZWFuV3JhcHBlcjsKIApAQCAtNTAsMTMgKzUzLDE0IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR3VhcmRyYWlsc09wdGlvbnMgREVGQVVMVF9DT05GSUcgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0R3VhcmRyYWlsc0NvbmZpZygpOwogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIGZpbmFsIEd1YXJkcmFpbHMgaW5zdGFuY2UgPSBuZXcgR3VhcmRyYWlscygpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgR3VhcmRyYWlscyBpbnN0YW5jZSA9IG5ldyBHdWFyZHJhaWxzKCk7CiAKICAgICAvKioKICAgICAgKiBHdWFyZHJhaWwgb24gdGhlIHRvdGFsIG51bWJlciBvZiB1c2VyIGtleXNwYWNlcy4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1heFRocmVzaG9sZCBrZXlzcGFjZXMgPQogICAgIG5ldyBNYXhUaHJlc2hvbGQoImtleXNwYWNlcyIsCisgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRLZXlzcGFjZXNXYXJuVGhyZXNob2xkKCksCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldEtleXNwYWNlc0ZhaWxUaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm5pbmcsIHdoYXQsIHZhbHVlLCB0aHJlc2hvbGQpIC0+CkBAIC03MCw2ICs3NCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXhUaHJlc2hvbGQgdGFibGVzID0KICAgICBuZXcgTWF4VGhyZXNob2xkKCJ0YWJsZXMiLAorICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0VGFibGVzV2FyblRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRUYWJsZXNGYWlsVGhyZXNob2xkKCksCiAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuaW5nLCB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSAtPgpAQCAtODMsNiArODgsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWF4VGhyZXNob2xkIGNvbHVtbnNQZXJUYWJsZSA9CiAgICAgbmV3IE1heFRocmVzaG9sZCgiY29sdW1uc19wZXJfdGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0Q29sdW1uc1BlclRhYmxlV2FyblRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRDb2x1bW5zUGVyVGFibGVGYWlsVGhyZXNob2xkKCksCiAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuaW5nLCB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSAtPgpAQCAtOTMsNiArOTksNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXhUaHJlc2hvbGQgc2Vjb25kYXJ5SW5kZXhlc1BlclRhYmxlID0KICAgICBuZXcgTWF4VGhyZXNob2xkKCJzZWNvbmRhcnlfaW5kZXhlc19wZXJfdGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0U2Vjb25kYXJ5SW5kZXhlc1BlclRhYmxlV2FyblRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRTZWNvbmRhcnlJbmRleGVzUGVyVGFibGVGYWlsVGhyZXNob2xkKCksCiAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuaW5nLCB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSAtPgpAQCAtMTA0LDE2ICsxMTEsMTggQEAKICAgICAvKioKICAgICAgKiBHdWFyZHJhaWwgZGlzYWJsaW5nIHVzZXIncyBhYmlsaXR5IHRvIGNyZWF0ZSBzZWNvbmRhcnkgaW5kZXhlcwogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRGlzYWJsZUZsYWcgY3JlYXRlU2Vjb25kYXJ5SW5kZXhlc0VuYWJsZWQgPQotICAgIG5ldyBEaXNhYmxlRmxhZygic2Vjb25kYXJ5X2luZGV4ZXMiLAotICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAhQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRTZWNvbmRhcnlJbmRleGVzRW5hYmxlZCgpLAotICAgICAgICAgICAgICAgICAgICAiVXNlciBjcmVhdGlvbiBvZiBzZWNvbmRhcnkgaW5kZXhlcyIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5hYmxlRmxhZyBjcmVhdGVTZWNvbmRhcnlJbmRleGVzRW5hYmxlZCA9CisgICAgbmV3IEVuYWJsZUZsYWcoInNlY29uZGFyeV9pbmRleGVzIiwKKyAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0U2Vjb25kYXJ5SW5kZXhlc0VuYWJsZWQoKSwKKyAgICAgICAgICAgICAgICAgICAiVXNlciBjcmVhdGlvbiBvZiBzZWNvbmRhcnkgaW5kZXhlcyIpOwogCiAgICAgLyoqCiAgICAgICogR3VhcmRyYWlsIG9uIHRoZSBudW1iZXIgb2YgbWF0ZXJpYWxpemVkIHZpZXdzIHBlciB0YWJsZS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1heFRocmVzaG9sZCBtYXRlcmlhbGl6ZWRWaWV3c1BlclRhYmxlID0KICAgICBuZXcgTWF4VGhyZXNob2xkKCJtYXRlcmlhbGl6ZWRfdmlld3NfcGVyX3RhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldE1hdGVyaWFsaXplZFZpZXdzUGVyVGFibGVXYXJuVGhyZXNob2xkKCksCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldE1hdGVyaWFsaXplZFZpZXdzUGVyVGFibGVGYWlsVGhyZXNob2xkKCksCiAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuaW5nLCB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSAtPgpAQCAtMTI3LDYgKzEzNiw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZXM8U3RyaW5nPiB0YWJsZVByb3BlcnRpZXMgPQogICAgIG5ldyBWYWx1ZXM8PigidGFibGVfcHJvcGVydGllcyIsCisgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0VGFibGVQcm9wZXJ0aWVzV2FybmVkKCksCiAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0VGFibGVQcm9wZXJ0aWVzSWdub3JlZCgpLAogICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFRhYmxlUHJvcGVydGllc0Rpc2FsbG93ZWQoKSwKQEAgLTEzNSw0MiArMTQ1LDgzIEBACiAgICAgLyoqCiAgICAgICogR3VhcmRyYWlsIGRpc2FibGluZyB1c2VyLXByb3ZpZGVkIHRpbWVzdGFtcHMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBEaXNhYmxlRmxhZyB1c2VyVGltZXN0YW1wc0VuYWJsZWQgPQotICAgIG5ldyBEaXNhYmxlRmxhZygidXNlcl90aW1lc3RhbXBzIiwKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gIUNPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0VXNlclRpbWVzdGFtcHNFbmFibGVkKCksCi0gICAgICAgICAgICAgICAgICAgICJVc2VyIHByb3ZpZGVkIHRpbWVzdGFtcHMgKFVTSU5HIFRJTUVTVEFNUCkiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVuYWJsZUZsYWcgdXNlclRpbWVzdGFtcHNFbmFibGVkID0KKyAgICBuZXcgRW5hYmxlRmxhZygidXNlcl90aW1lc3RhbXBzIiwKKyAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0VXNlclRpbWVzdGFtcHNFbmFibGVkKCksCisgICAgICAgICAgICAgICAgICAgIlVzZXIgcHJvdmlkZWQgdGltZXN0YW1wcyAoVVNJTkcgVElNRVNUQU1QKSIpOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBEaXNhYmxlRmxhZyBncm91cEJ5RW5hYmxlZCA9Ci0gICAgbmV3IERpc2FibGVGbGFnKCJncm91cF9ieSIsCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+ICFDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldEdyb3VwQnlFbmFibGVkKCksCi0gICAgICAgICAgICAgICAgICAgICJHUk9VUCBCWSBmdW5jdGlvbmFsaXR5Iik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbmFibGVGbGFnIGdyb3VwQnlFbmFibGVkID0KKyAgICBuZXcgRW5hYmxlRmxhZygiZ3JvdXBfYnkiLAorICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRHcm91cEJ5RW5hYmxlZCgpLAorICAgICAgICAgICAgICAgICAgICJHUk9VUCBCWSBmdW5jdGlvbmFsaXR5Iik7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERpc2FibGVGbGFnIGRyb3BUcnVuY2F0ZVRhYmxlRW5hYmxlZCA9Ci0gICAgbmV3IERpc2FibGVGbGFnKCJkcm9wX3RydW5jYXRlX3RhYmxlX2VuYWJsZWQiLAotICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAhQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXREcm9wVHJ1bmNhdGVUYWJsZUVuYWJsZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgIkRST1AgYW5kIFRSVU5DQVRFIFRBQkxFIGZ1bmN0aW9uYWxpdHkiKTsKKyAgICAvKioKKyAgICAgKiBHdWFyZHJhaWwgZGlzYWJsaW5nIEFMVEVSIFRBQkxFIGNvbHVtbiBtdXRhdGlvbiBhY2Nlc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbmFibGVGbGFnIGFsdGVyVGFibGVFbmFibGVkID0KKyAgICBuZXcgRW5hYmxlRmxhZygiYWx0ZXJfdGFibGUiLAorICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRBbHRlclRhYmxlRW5hYmxlZCgpLAorICAgICAgICAgICAgICAgICAgICJVc2VyIGFjY2VzcyB0byBBTFRFUiBUQUJMRSBzdGF0ZW1lbnQgZm9yIGNvbHVtbiBtdXRhdGlvbiIpOworCisgICAgLyoqCisgICAgICogR3VhcmRyYWlsIGRpc2FibGluZyBEUk9QIC8gVFJVTkNBVEUgVEFCTEUgYmVoYXZpb3IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVuYWJsZUZsYWcgZHJvcFRydW5jYXRlVGFibGVFbmFibGVkID0KKyAgICBuZXcgRW5hYmxlRmxhZygiZHJvcF90cnVuY2F0ZV90YWJsZV9lbmFibGVkIiwKKyAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0RHJvcFRydW5jYXRlVGFibGVFbmFibGVkKCksCisgICAgICAgICAgICAgICAgICAgIkRST1AgYW5kIFRSVU5DQVRFIFRBQkxFIGZ1bmN0aW9uYWxpdHkiKTsKKworICAgIC8qKgorICAgICAqIEd1YXJkcmFpbCBkaXNhYmxpbmcgRFJPUCBLRVlTUEFDRSBiZWhhdmlvcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5hYmxlRmxhZyBkcm9wS2V5c3BhY2VFbmFibGVkID0KKyAgICBuZXcgRW5hYmxlRmxhZygiZHJvcF9rZXlzcGFjZV9lbmFibGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXREcm9wS2V5c3BhY2VFbmFibGVkKCksCisgICAgICAgICAgICAgICAgICAgICJEUk9QIEtFWVNQQUNFIGZ1bmN0aW9uYWxpdHkiKTsKIAogICAgIC8qKgogICAgICAqIEd1YXJkcmFpbCBkaXNhYmxpbmcgdXNlcidzIGFiaWxpdHkgdG8gdHVybiBvZmYgY29tcHJlc3Npb24KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERpc2FibGVGbGFnIHVuY29tcHJlc3NlZFRhYmxlc0VuYWJsZWQgPQotICAgIG5ldyBEaXNhYmxlRmxhZygidW5jb21wcmVzc2VkX3RhYmxlc19lbmFibGVkIiwKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gIUNPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0VW5jb21wcmVzc2VkVGFibGVzRW5hYmxlZCgpLAotICAgICAgICAgICAgICAgICAgICAiVW5jb21wcmVzc2VkIHRhYmxlIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbmFibGVGbGFnIHVuY29tcHJlc3NlZFRhYmxlc0VuYWJsZWQgPQorICAgIG5ldyBFbmFibGVGbGFnKCJ1bmNvbXByZXNzZWRfdGFibGVzX2VuYWJsZWQiLAorICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRVbmNvbXByZXNzZWRUYWJsZXNFbmFibGVkKCksCisgICAgICAgICAgICAgICAgICAgIlVuY29tcHJlc3NlZCB0YWJsZSIpOwogCiAgICAgLyoqCiAgICAgICogR3VhcmRyYWlsIGRpc2FibGluZyB0aGUgY3JlYXRpb24gb2YgbmV3IENPTVBBQ1QgU1RPUkFHRSB0YWJsZXMKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERpc2FibGVGbGFnIGNvbXBhY3RUYWJsZXNFbmFibGVkID0KLSAgICBuZXcgRGlzYWJsZUZsYWcoImNvbXBhY3RfdGFibGVzIiwKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gIUNPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0Q29tcGFjdFRhYmxlc0VuYWJsZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgIkNyZWF0aW9uIG9mIG5ldyBDT01QQUNUIFNUT1JBR0UgdGFibGVzIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbmFibGVGbGFnIGNvbXBhY3RUYWJsZXNFbmFibGVkID0KKyAgICBuZXcgRW5hYmxlRmxhZygiY29tcGFjdF90YWJsZXMiLAorICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRDb21wYWN0VGFibGVzRW5hYmxlZCgpLAorICAgICAgICAgICAgICAgICAgICJDcmVhdGlvbiBvZiBuZXcgQ09NUEFDVCBTVE9SQUdFIHRhYmxlcyIpOworCisgICAgLyoqCisgICAgICogR3VhcmRyYWlsIHRvIHdhcm4gb3IgZmFpbCBhIENSRUFURSBvciBBTFRFUiBUQUJMRSBzdGF0ZW1lbnQgd2hlbiBkZWZhdWx0X3RpbWVfdG9fbGl2ZSBpcyBzZXQgdG8gMCBhbmQKKyAgICAgKiB0aGUgdGFibGUgaXMgdXNpbmcgVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneSBjb21wYWN0aW9uIG9yIGEgc3ViY2xhc3Mgb2YgaXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbmFibGVGbGFnIHplcm9UVExPblRXQ1NFbmFibGVkID0KKyAgICBuZXcgRW5hYmxlRmxhZygiemVyb190dGxfb25fdHdjcyIsCisgICAgICAgICAgICAgICAgICAgIkl0IGlzIHN1c3BpY2lvdXMgdG8gdXNlIGRlZmF1bHRfdGltZV90b19saXZlIHNldCB0byAwIHdpdGggc3VjaCBjb21wYWN0aW9uIHN0cmF0ZWd5LiAiICsKKyAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGtlZXAgaW4gbWluZCB0aGF0IGRhdGEgd2lsbCBub3Qgc3RhcnQgdG8gYXV0b21hdGljYWxseSBleHBpcmUgYWZ0ZXIgdGhleSBhcmUgb2xkZXIgIiArCisgICAgICAgICAgICAgICAgICAgInRoYW4gYSByZXNwZWN0aXZlIGNvbXBhY3Rpb24gd2luZG93IHVuaXQgb2YgYSBjZXJ0YWluIHNpemUuIFBsZWFzZSBzZXQgVFRMIGZvciB5b3VyIElOU0VSVCBvciBVUERBVEUgIiArCisgICAgICAgICAgICAgICAgICAgInN0YXRlbWVudHMgaWYgeW91IGV4cGVjdCBkYXRhIHRvIGJlIGV4cGlyZWQgYXMgdGFibGUgc2V0dGluZ3Mgd2lsbCBub3QgZG8gaXQuICIsCisgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRaZXJvVFRMT25UV0NTV2FybmVkKCksCisgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRaZXJvVFRMT25UV0NTRW5hYmxlZCgpLAorICAgICAgICAgICAgICAgICAgICIwIGRlZmF1bHRfdGltZV90b19saXZlIG9uIGEgdGFibGUgd2l0aCAiICsgVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiIGNvbXBhY3Rpb24gc3RyYXRlZ3kiKTsKIAogICAgIC8qKgogICAgICAqIEd1YXJkcmFpbCBvbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHJldHVybmVkIHdpdGhpbiBwYWdlLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWF4VGhyZXNob2xkIHBhZ2VTaXplID0KICAgICBuZXcgTWF4VGhyZXNob2xkKCJwYWdlX3NpemUiLAorICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0UGFnZVNpemVXYXJuVGhyZXNob2xkKCksCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFBhZ2VTaXplRmFpbFRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgKGlzV2FybmluZywgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkgLT4KQEAgLTE4NCw2ICsyMzUsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWF4VGhyZXNob2xkIHBhcnRpdGlvbktleXNJblNlbGVjdCA9CiAgICAgbmV3IE1heFRocmVzaG9sZCgicGFydGl0aW9uX2tleXNfaW5fc2VsZWN0IiwKKyAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFBhcnRpdGlvbktleXNJblNlbGVjdFdhcm5UaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0UGFydGl0aW9uS2V5c0luU2VsZWN0RmFpbFRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgKGlzV2FybmluZywgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkgLT4KQEAgLTE5NywyNCArMjQ5LDM2IEBACiAgICAgLyoqCiAgICAgICogR3VhcmRyYWlsIGRpc2FibGluZyBvcGVyYXRpb25zIG9uIGxpc3RzIHRoYXQgcmVxdWlyZSByZWFkIGJlZm9yZSB3cml0ZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERpc2FibGVGbGFnIHJlYWRCZWZvcmVXcml0ZUxpc3RPcGVyYXRpb25zRW5hYmxlZCA9Ci0gICAgbmV3IERpc2FibGVGbGFnKCJyZWFkX2JlZm9yZV93cml0ZV9saXN0X29wZXJhdGlvbnMiLAotICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAhQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRSZWFkQmVmb3JlV3JpdGVMaXN0T3BlcmF0aW9uc0VuYWJsZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgIkxpc3Qgb3BlcmF0aW9uIHJlcXVpcmluZyByZWFkIGJlZm9yZSB3cml0ZSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5hYmxlRmxhZyByZWFkQmVmb3JlV3JpdGVMaXN0T3BlcmF0aW9uc0VuYWJsZWQgPQorICAgIG5ldyBFbmFibGVGbGFnKCJyZWFkX2JlZm9yZV93cml0ZV9saXN0X29wZXJhdGlvbnMiLAorICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRSZWFkQmVmb3JlV3JpdGVMaXN0T3BlcmF0aW9uc0VuYWJsZWQoKSwKKyAgICAgICAgICAgICAgICAgICAiTGlzdCBvcGVyYXRpb24gcmVxdWlyaW5nIHJlYWQgYmVmb3JlIHdyaXRlIik7CiAKICAgICAvKioKICAgICAgKiBHdWFyZHJhaWwgZGlzYWJsaW5nIEFMTE9XIEZJTFRFUklORyBzdGF0ZW1lbnQgd2l0aGluIGEgcXVlcnkKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERpc2FibGVGbGFnIGFsbG93RmlsdGVyaW5nRW5hYmxlZCA9Ci0gICAgbmV3IERpc2FibGVGbGFnKCJhbGxvd19maWx0ZXJpbmciLAotICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAhQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRBbGxvd0ZpbHRlcmluZ0VuYWJsZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgIlF1ZXJ5aW5nIHdpdGggQUxMT1cgRklMVEVSSU5HIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbmFibGVGbGFnIGFsbG93RmlsdGVyaW5nRW5hYmxlZCA9CisgICAgbmV3IEVuYWJsZUZsYWcoImFsbG93X2ZpbHRlcmluZyIsCisgICAgICAgICAgICAgICAgICAgIkFMTE9XIEZJTFRFUklORyBjYW4gcG90ZW50aWFsbHkgdmlzaXQgYWxsIHRoZSBkYXRhIGluIHRoZSB0YWJsZSBhbmQgaGF2ZSB1bnByZWRpY3RhYmxlIHBlcmZvcm1hbmNlLiIsCisgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRBbGxvd0ZpbHRlcmluZ0VuYWJsZWQoKSwKKyAgICAgICAgICAgICAgICAgICAiUXVlcnlpbmcgd2l0aCBBTExPVyBGSUxURVJJTkciKTsKKworICAgIC8qKgorICAgICAqIEd1YXJkcmFpbCBkaXNhYmxpbmcgc2V0dGluZyBTaW1wbGVTdHJhdGVneSB2aWEga2V5c3BhY2UgY3JlYXRpb24gb3IgYWx0ZXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRW5hYmxlRmxhZyBzaW1wbGVTdHJhdGVneUVuYWJsZWQgPQorICAgIG5ldyBFbmFibGVGbGFnKCJzaW1wbGVzdHJhdGVneSIsCisgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFNpbXBsZVN0cmF0ZWd5RW5hYmxlZCgpLAorICAgICAgICAgICAgICAgICAgICJTaW1wbGVTdHJhdGVneSIpOwogCiAgICAgLyoqCiAgICAgICogR3VhcmRyYWlsIG9uIHRoZSBudW1iZXIgb2YgcmVzdHJpY3Rpb25zIGNyZWF0ZWQgYnkgYSBjYXJ0ZXNpYW4gcHJvZHVjdCBvZiBhIENRTCdzIHtAY29kZSBJTn0gcXVlcnkuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXhUaHJlc2hvbGQgaW5TZWxlY3RDYXJ0ZXNpYW5Qcm9kdWN0ID0KICAgICBuZXcgTWF4VGhyZXNob2xkKCJpbl9zZWxlY3RfY2FydGVzaWFuX3Byb2R1Y3QiLAorICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0SW5TZWxlY3RDYXJ0ZXNpYW5Qcm9kdWN0V2FyblRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRJblNlbGVjdENhcnRlc2lhblByb2R1Y3RGYWlsVGhyZXNob2xkKCksCiAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuaW5nLCB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSAtPgpAQCAtMjMwLDYgKzI5NCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBWYWx1ZXM8Q29uc2lzdGVuY3lMZXZlbD4gcmVhZENvbnNpc3RlbmN5TGV2ZWxzID0KICAgICBuZXcgVmFsdWVzPD4oInJlYWRfY29uc2lzdGVuY3lfbGV2ZWxzIiwKKyAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRSZWFkQ29uc2lzdGVuY3lMZXZlbHNXYXJuZWQoKSwKICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSwKICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRSZWFkQ29uc2lzdGVuY3lMZXZlbHNEaXNhbGxvd2VkKCksCkBAIC0yNDAsNDIgKzMwNSw2NiBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmFsdWVzPENvbnNpc3RlbmN5TGV2ZWw+IHdyaXRlQ29uc2lzdGVuY3lMZXZlbHMgPQogICAgIG5ldyBWYWx1ZXM8Pigid3JpdGVfY29uc2lzdGVuY3lfbGV2ZWxzIiwKKyAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRXcml0ZUNvbnNpc3RlbmN5TGV2ZWxzV2FybmVkKCksCiAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENvbGxlY3Rpb25zLmVtcHR5U2V0KCksCiAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0V3JpdGVDb25zaXN0ZW5jeUxldmVsc0Rpc2FsbG93ZWQoKSwKICAgICAgICAgICAgICAgICAgIndyaXRlIGNvbnNpc3RlbmN5IGxldmVscyIpOwogCiAgICAgLyoqCisgICAgICogR3VhcmRyYWlsIG9uIHRoZSBzaXplIG9mIGEgcGFydGl0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWF4VGhyZXNob2xkIHBhcnRpdGlvblNpemUgPQorICAgIG5ldyBNYXhUaHJlc2hvbGQoInBhcnRpdGlvbl9zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICJUb28gbGFyZ2UgcGFydGl0aW9ucyBjYW4gY2F1c2UgcGVyZm9ybWFuY2UgcHJvYmxlbXMuICIsCisgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBzaXplVG9CeXRlcyhDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFBhcnRpdGlvblNpemVXYXJuVGhyZXNob2xkKCkpLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gc2l6ZVRvQnl0ZXMoQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRQYXJ0aXRpb25TaXplRmFpbFRocmVzaG9sZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgIChpc1dhcm5pbmcsIHdoYXQsIHZhbHVlLCB0aHJlc2hvbGQpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiUGFydGl0aW9uICVzIGhhcyBzaXplICVzLCB0aGlzIGV4Y2VlZHMgdGhlICVzIHRocmVzaG9sZCBvZiAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwgdmFsdWUsIGlzV2FybmluZyA/ICJ3YXJuaW5nIiA6ICJmYWlsdXJlIiwgdGhyZXNob2xkKSk7CisKKyAgICAvKioKKyAgICAgKiBHdWFyZHJhaWwgb24gdGhlIHNpemUgb2YgYSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWF4VGhyZXNob2xkIGNvbHVtblZhbHVlU2l6ZSA9CisgICAgbmV3IE1heFRocmVzaG9sZCgiY29sdW1uX3ZhbHVlX3NpemUiLAorICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IHNpemVUb0J5dGVzKENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0Q29sdW1uVmFsdWVTaXplV2FyblRocmVzaG9sZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IHNpemVUb0J5dGVzKENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0Q29sdW1uVmFsdWVTaXplRmFpbFRocmVzaG9sZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgIChpc1dhcm5pbmcsIHdoYXQsIHZhbHVlLCB0aHJlc2hvbGQpIC0+CisgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlZhbHVlIG9mIGNvbHVtbiAlcyBoYXMgc2l6ZSAlcywgdGhpcyBleGNlZWRzIHRoZSAlcyB0aHJlc2hvbGQgb2YgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0LCB2YWx1ZSwgaXNXYXJuaW5nID8gIndhcm5pbmciIDogImZhaWx1cmUiLCB0aHJlc2hvbGQpKTsKKworICAgIC8qKgogICAgICAqIEd1YXJkcmFpbCBvbiB0aGUgc2l6ZSBvZiBhIGNvbGxlY3Rpb24uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXhUaHJlc2hvbGQgY29sbGVjdGlvblNpemUgPQogICAgIG5ldyBNYXhUaHJlc2hvbGQoImNvbGxlY3Rpb25fc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gc2l6ZVRvQnl0ZXMoQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRDb2xsZWN0aW9uU2l6ZVdhcm5UaHJlc2hvbGQoKSksCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBzaXplVG9CeXRlcyhDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldENvbGxlY3Rpb25TaXplRmFpbFRocmVzaG9sZCgpKSwKICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm5pbmcsIHdoYXQsIHZhbHVlLCB0aHJlc2hvbGQpIC0+Ci0gICAgICAgICAgICAgICAgICAgICBpc1dhcm5pbmcgPyBmb3JtYXQoIkRldGVjdGVkIGNvbGxlY3Rpb24gJXMgb2Ygc2l6ZSAlcywgdGhpcyBleGNlZWRzIHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiAlcy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQsIHZhbHVlLCB0aHJlc2hvbGQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmb3JtYXQoIkRldGVjdGVkIGNvbGxlY3Rpb24gJXMgb2Ygc2l6ZSAlcywgdGhpcyBleGNlZWRzIHRoZSBmYWlsdXJlIHRocmVzaG9sZCBvZiAlcy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQsIHZhbHVlLCB0aHJlc2hvbGQpKTsKKyAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiRGV0ZWN0ZWQgY29sbGVjdGlvbiAlcyBvZiBzaXplICVzLCB0aGlzIGV4Y2VlZHMgdGhlICVzIHRocmVzaG9sZCBvZiAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQsIHZhbHVlLCBpc1dhcm5pbmcgPyAid2FybmluZyIgOiAiZmFpbHVyZSIsIHRocmVzaG9sZCkpOwogCiAgICAgLyoqCiAgICAgICogR3VhcmRyYWlsIG9uIHRoZSBudW1iZXIgb2YgaXRlbXMgb2YgYSBjb2xsZWN0aW9uLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWF4VGhyZXNob2xkIGl0ZW1zUGVyQ29sbGVjdGlvbiA9CiAgICAgbmV3IE1heFRocmVzaG9sZCgiaXRlbXNfcGVyX2NvbGxlY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0SXRlbXNQZXJDb2xsZWN0aW9uV2FyblRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRJdGVtc1BlckNvbGxlY3Rpb25GYWlsVGhyZXNob2xkKCksCiAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuaW5nLCB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSAtPgotICAgICAgICAgICAgICAgICAgICAgaXNXYXJuaW5nID8gZm9ybWF0KCJEZXRlY3RlZCBjb2xsZWN0aW9uICVzIHdpdGggJXMgaXRlbXMsIHRoaXMgZXhjZWVkcyB0aGUgd2FybmluZyB0aHJlc2hvbGQgb2YgJXMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZm9ybWF0KCJEZXRlY3RlZCBjb2xsZWN0aW9uICVzIHdpdGggJXMgaXRlbXMsIHRoaXMgZXhjZWVkcyB0aGUgZmFpbHVyZSB0aHJlc2hvbGQgb2YgJXMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSk7CisgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIkRldGVjdGVkIGNvbGxlY3Rpb24gJXMgd2l0aCAlcyBpdGVtcywgdGhpcyBleGNlZWRzIHRoZSAlcyB0aHJlc2hvbGQgb2YgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0LCB2YWx1ZSwgaXNXYXJuaW5nID8gIndhcm5pbmciIDogImZhaWx1cmUiLCB0aHJlc2hvbGQpKTsKIAogICAgIC8qKgogICAgICAqIEd1YXJkcmFpbCBvbiB0aGUgbnVtYmVyIG9mIGZpZWxkcyBvbiBlYWNoIFVEVC4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1heFRocmVzaG9sZCBmaWVsZHNQZXJVRFQgPQogICAgIG5ldyBNYXhUaHJlc2hvbGQoImZpZWxkc19wZXJfdWR0IiwKKyAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldEZpZWxkc1BlclVEVFdhcm5UaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0RmllbGRzUGVyVURURmFpbFRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgKGlzV2FybmluZywgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkgLT4KQEAgLTI5MCw2ICszNzksNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGVyY2VudGFnZVRocmVzaG9sZCBsb2NhbERhdGFEaXNrVXNhZ2UgPQogICAgIG5ldyBQZXJjZW50YWdlVGhyZXNob2xkKCJsb2NhbF9kYXRhX2Rpc2tfdXNhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXREYXRhRGlza1VzYWdlUGVyY2VudGFnZVdhcm5UaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldERhdGFEaXNrVXNhZ2VQZXJjZW50YWdlRmFpbFRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm5pbmcsIHdoYXQsIHZhbHVlLCB0aHJlc2hvbGQpIC0+CkBAIC0zMDUsNiArMzk1LDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFByZWRpY2F0ZXM8SW5ldEFkZHJlc3NBbmRQb3J0PiByZXBsaWNhRGlza1VzYWdlID0KICAgICBuZXcgUHJlZGljYXRlczw+KCJyZXBsaWNhX2Rpc2tfdXNhZ2UiLAorICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IERpc2tVc2FnZUJyb2FkY2FzdGVyLmluc3RhbmNlOjppc1N0dWZmZWQsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBEaXNrVXNhZ2VCcm9hZGNhc3Rlci5pbnN0YW5jZTo6aXNGdWxsLAogICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHVzaW5nIGB2YWx1ZWAgYmVjYXVzZSBpdCByZXByZXNlbnRzIHJlcGxpY2EgYWRkcmVzcyB3aGljaCBzaG91bGQgYmUgaGlkZGVuIGZyb20gY2xpZW50LgpAQCAtMzI1LDEzICs0MTYsNDIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1pblRocmVzaG9sZCBtaW5pbXVtUmVwbGljYXRpb25GYWN0b3IgPQogICAgIG5ldyBNaW5UaHJlc2hvbGQoIm1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldE1pbmltdW1SZXBsaWNhdGlvbkZhY3Rvcldhcm5UaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0TWluaW11bVJlcGxpY2F0aW9uRmFjdG9yRmFpbFRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgKGlzV2FybmluZywgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkgLT4KLSAgICAgICAgICAgICAgICAgICAgIGlzV2FybmluZyA/IGZvcm1hdCgiVGhlIGtleXNwYWNlICVzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAlcywgYmVsb3cgdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICVzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZvcm1hdCgiVGhlIGtleXNwYWNlICVzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAlcywgYmVsb3cgdGhlIGZhaWx1cmUgdGhyZXNob2xkIG9mICVzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwgdmFsdWUsIHRocmVzaG9sZCkpOworICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJUaGUga2V5c3BhY2UgJXMgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mICVzLCBiZWxvdyB0aGUgJXMgdGhyZXNob2xkIG9mICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwgdmFsdWUsIGlzV2FybmluZyA/ICJ3YXJuaW5nIiA6ICJmYWlsdXJlIiwgdGhyZXNob2xkKSk7CisKKyAgICAvKioKKyAgICAgKiBHdWFyZHJhaWwgb24gdGhlIG1heGltdW0gcmVwbGljYXRpb24gZmFjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWF4VGhyZXNob2xkIG1heGltdW1SZXBsaWNhdGlvbkZhY3RvciA9CisgICAgbmV3IE1heFRocmVzaG9sZCgibWF4aW11bV9yZXBsaWNhdGlvbl9mYWN0b3IiLAorICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yV2FyblRocmVzaG9sZCgpLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JGYWlsVGhyZXNob2xkKCksCisgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuaW5nLCB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSAtPgorICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJUaGUga2V5c3BhY2UgJXMgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mICVzLCBhYm92ZSB0aGUgJXMgdGhyZXNob2xkIG9mICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwgdmFsdWUsIGlzV2FybmluZyA/ICJ3YXJuaW5nIiA6ICJmYWlsdXJlIiwgdGhyZXNob2xkKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1heFRocmVzaG9sZCBtYXhpbXVtQWxsb3dhYmxlVGltZXN0YW1wID0KKyAgICBuZXcgTWF4VGhyZXNob2xkKCJtYXhpbXVtX3RpbWVzdGFtcCIsCisgICAgICAgICAgICAgICAgICAgICAiVGltZXN0YW1wcyB0b28gZmFyIGluIHRoZSBmdXR1cmUgY2FuIGxlYWQgdG8gZGF0YSB0aGF0IGNhbid0IGJlIGVhc2lseSBvdmVyd3JpdHRlbiIsCisgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBtYXhpbXVtVGltZXN0YW1wQXNSZWxhdGl2ZU1pY3JvcyhDT05GSUdfUFJPVklERVIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldE1heGltdW1UaW1lc3RhbXBXYXJuVGhyZXNob2xkKCkpLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gbWF4aW11bVRpbWVzdGFtcEFzUmVsYXRpdmVNaWNyb3MoQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRNYXhpbXVtVGltZXN0YW1wRmFpbFRocmVzaG9sZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgIChpc1dhcm5pbmcsIHdoYXQsIHZhbHVlLCB0aHJlc2hvbGQpIC0+CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiVGhlIG1vZGlmaWNhdGlvbiB0byB0YWJsZSAlcyBoYXMgYSB0aW1lc3RhbXAgJXMgYWZ0ZXIgdGhlIG1heGltdW0gYWxsb3dhYmxlICVzIHRocmVzaG9sZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0LCB2YWx1ZSwgaXNXYXJuaW5nID8gIndhcm5pbmciIDogImZhaWx1cmUiLCB0aHJlc2hvbGQpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWluVGhyZXNob2xkIG1pbmltdW1BbGxvd2FibGVUaW1lc3RhbXAgPQorICAgIG5ldyBNaW5UaHJlc2hvbGQoIm1pbmltdW1fdGltZXN0YW1wIiwKKyAgICAgICAgICAgICAgICAgICAgICJUaW1lc3RhbXBzIHRvbyBmYXIgaW4gdGhlIHBhc3QgY2FuIGNhdXNlIHdyaXRlcyBjYW4gYmUgdW5leHBlY3RlZGx5IGxvc3QiLAorICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gbWluaW11bVRpbWVzdGFtcEFzUmVsYXRpdmVNaWNyb3MoQ09ORklHX1BST1ZJREVSLmdldE9yQ3JlYXRlKHN0YXRlKS5nZXRNaW5pbXVtVGltZXN0YW1wV2FyblRocmVzaG9sZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IG1pbmltdW1UaW1lc3RhbXBBc1JlbGF0aXZlTWljcm9zKENPTkZJR19QUk9WSURFUi5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0TWluaW11bVRpbWVzdGFtcEZhaWxUaHJlc2hvbGQoKSksCisgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuaW5nLCB3aGF0LCB2YWx1ZSwgdGhyZXNob2xkKSAtPgorICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJUaGUgbW9kaWZpY2F0aW9uIHRvIHRhYmxlICVzIGhhcyBhIHRpbWVzdGFtcCAlcyBiZWZvcmUgdGhlIG1pbmltdW0gYWxsb3dhYmxlICVzIHRocmVzaG9sZCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwgdmFsdWUsIGlzV2FybmluZyA/ICJ3YXJuaW5nIiA6ICJmYWlsdXJlIiwgdGhyZXNob2xkKSk7CiAKICAgICBwcml2YXRlIEd1YXJkcmFpbHMoKQogICAgIHsKQEAgLTU0MCw2ICs2NjAsMTggQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbHRlclRhYmxlRW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gREVGQVVMVF9DT05GSUcuZ2V0QWx0ZXJUYWJsZUVuYWJsZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBbHRlclRhYmxlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpCisgICAgeworICAgICAgICBERUZBVUxUX0NPTkZJRy5zZXRBbHRlclRhYmxlRW5hYmxlZChlbmFibGVkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBnZXRBbGxvd0ZpbHRlcmluZ0VuYWJsZWQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIERFRkFVTFRfQ09ORklHLmdldEFsbG93RmlsdGVyaW5nRW5hYmxlZCgpOwpAQCAtNTUyLDYgKzY4NCwxOCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGdldFNpbXBsZVN0cmF0ZWd5RW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gREVGQVVMVF9DT05GSUcuZ2V0U2ltcGxlU3RyYXRlZ3lFbmFibGVkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U2ltcGxlU3RyYXRlZ3lFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkKKyAgICB7CisgICAgICAgIERFRkFVTFRfQ09ORklHLnNldFNpbXBsZVN0cmF0ZWd5RW5hYmxlZChlbmFibGVkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBnZXRVbmNvbXByZXNzZWRUYWJsZXNFbmFibGVkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBERUZBVUxUX0NPTkZJRy5nZXRVbmNvbXByZXNzZWRUYWJsZXNFbmFibGVkKCk7CkBAIC02MDAsNiArNzQ0LDE4IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0RHJvcEtleXNwYWNlRW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gREVGQVVMVF9DT05GSUcuZ2V0RHJvcEtleXNwYWNlRW5hYmxlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldERyb3BLZXlzcGFjZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgREVGQVVMVF9DT05GSUcuc2V0RHJvcEtleXNwYWNlRW5hYmxlZChlbmFibGVkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldFBhZ2VTaXplV2FyblRocmVzaG9sZCgpCiAgICAgewogICAgICAgICByZXR1cm4gREVGQVVMVF9DT05GSUcuZ2V0UGFnZVNpemVXYXJuVGhyZXNob2xkKCk7CkBAIC02NDksNiArODA1LDQ2IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBATnVsbGFibGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblNpemVXYXJuVGhyZXNob2xkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzaXplVG9TdHJpbmcoREVGQVVMVF9DT05GSUcuZ2V0UGFydGl0aW9uU2l6ZVdhcm5UaHJlc2hvbGQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25TaXplRmFpbFRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gc2l6ZVRvU3RyaW5nKERFRkFVTFRfQ09ORklHLmdldFBhcnRpdGlvblNpemVGYWlsVGhyZXNob2xkKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFBhcnRpdGlvblNpemVUaHJlc2hvbGQoQE51bGxhYmxlIFN0cmluZyB3YXJuU2l6ZSwgQE51bGxhYmxlIFN0cmluZyBmYWlsU2l6ZSkKKyAgICB7CisgICAgICAgIERFRkFVTFRfQ09ORklHLnNldFBhcnRpdGlvblNpemVUaHJlc2hvbGQoc2l6ZUZyb21TdHJpbmcod2FyblNpemUpLCBzaXplRnJvbVN0cmluZyhmYWlsU2l6ZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVmFsdWVTaXplV2FyblRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gc2l6ZVRvU3RyaW5nKERFRkFVTFRfQ09ORklHLmdldENvbHVtblZhbHVlU2l6ZVdhcm5UaHJlc2hvbGQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE51bGxhYmxlCisgICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5WYWx1ZVNpemVGYWlsVGhyZXNob2xkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzaXplVG9TdHJpbmcoREVGQVVMVF9DT05GSUcuZ2V0Q29sdW1uVmFsdWVTaXplRmFpbFRocmVzaG9sZCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5WYWx1ZVNpemVUaHJlc2hvbGQoQE51bGxhYmxlIFN0cmluZyB3YXJuU2l6ZSwgQE51bGxhYmxlIFN0cmluZyBmYWlsU2l6ZSkKKyAgICB7CisgICAgICAgIERFRkFVTFRfQ09ORklHLnNldENvbHVtblZhbHVlU2l6ZVRocmVzaG9sZChzaXplRnJvbVN0cmluZyh3YXJuU2l6ZSksIHNpemVGcm9tU3RyaW5nKGZhaWxTaXplKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQE51bGxhYmxlCiAgICAgcHVibGljIFN0cmluZyBnZXRDb2xsZWN0aW9uU2l6ZVdhcm5UaHJlc2hvbGQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHNpemVUb1N0cmluZyhERUZBVUxUX0NPTkZJRy5nZXRDb2xsZWN0aW9uU2l6ZVdhcm5UaHJlc2hvbGQoKSk7CkBAIC04MTgsNiArMTAxNCwyNCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yV2FyblRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gREVGQVVMVF9DT05GSUcuZ2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yV2FyblRocmVzaG9sZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yRmFpbFRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gREVGQVVMVF9DT05GSUcuZ2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yRmFpbFRocmVzaG9sZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZCAoaW50IHdhcm4sIGludCBmYWlsKQorICAgIHsKKyAgICAgICAgREVGQVVMVF9DT05GSUcuc2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKHdhcm4sIGZhaWwpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0RGF0YURpc2tVc2FnZVBlcmNlbnRhZ2VXYXJuVGhyZXNob2xkKCkKICAgICB7CiAgICAgICAgIHJldHVybiBERUZBVUxUX0NPTkZJRy5nZXREYXRhRGlza1VzYWdlUGVyY2VudGFnZVdhcm5UaHJlc2hvbGQoKTsKQEAgLTg2Niw2ICsxMDgwLDY2IEBACiAgICAgICAgIERFRkFVTFRfQ09ORklHLnNldE1pbmltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZCh3YXJuLCBmYWlsKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRaZXJvVFRMT25UV0NTRW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gREVGQVVMVF9DT05GSUcuZ2V0WmVyb1RUTE9uVFdDU0VuYWJsZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRaZXJvVFRMT25UV0NTRW5hYmxlZChib29sZWFuIHZhbHVlKQorICAgIHsKKyAgICAgICAgREVGQVVMVF9DT05GSUcuc2V0WmVyb1RUTE9uVFdDU0VuYWJsZWQodmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGdldFplcm9UVExPblRXQ1NXYXJuZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERFRkFVTFRfQ09ORklHLmdldFplcm9UVExPblRXQ1NXYXJuZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRaZXJvVFRMT25UV0NTV2FybmVkKGJvb2xlYW4gdmFsdWUpCisgICAgeworICAgICAgICBERUZBVUxUX0NPTkZJRy5zZXRaZXJvVFRMT25UV0NTV2FybmVkKHZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1heGltdW1UaW1lc3RhbXBXYXJuVGhyZXNob2xkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkdXJhdGlvblRvU3RyaW5nKERFRkFVTFRfQ09ORklHLmdldE1heGltdW1UaW1lc3RhbXBXYXJuVGhyZXNob2xkKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF4aW11bVRpbWVzdGFtcEZhaWxUaHJlc2hvbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGR1cmF0aW9uVG9TdHJpbmcoREVGQVVMVF9DT05GSUcuZ2V0TWF4aW11bVRpbWVzdGFtcEZhaWxUaHJlc2hvbGQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TWF4aW11bVRpbWVzdGFtcFRocmVzaG9sZChTdHJpbmcgd2FyblNlY29uZHMsIFN0cmluZyBmYWlsU2Vjb25kcykKKyAgICB7CisgICAgICAgIERFRkFVTFRfQ09ORklHLnNldE1heGltdW1UaW1lc3RhbXBUaHJlc2hvbGQoZHVyYXRpb25Gcm9tU3RyaW5nKHdhcm5TZWNvbmRzKSwgZHVyYXRpb25Gcm9tU3RyaW5nKGZhaWxTZWNvbmRzKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRNaW5pbXVtVGltZXN0YW1wV2FyblRocmVzaG9sZCgpCisgICAgeworICAgICAgICByZXR1cm4gZHVyYXRpb25Ub1N0cmluZyhERUZBVUxUX0NPTkZJRy5nZXRNaW5pbXVtVGltZXN0YW1wV2FyblRocmVzaG9sZCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1pbmltdW1UaW1lc3RhbXBGYWlsVGhyZXNob2xkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkdXJhdGlvblRvU3RyaW5nKERFRkFVTFRfQ09ORklHLmdldE1pbmltdW1UaW1lc3RhbXBGYWlsVGhyZXNob2xkKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1pbmltdW1UaW1lc3RhbXBUaHJlc2hvbGQoU3RyaW5nIHdhcm5TZWNvbmRzLCBTdHJpbmcgZmFpbFNlY29uZHMpCisgICAgeworICAgICAgICBERUZBVUxUX0NPTkZJRy5zZXRNaW5pbXVtVGltZXN0YW1wVGhyZXNob2xkKGR1cmF0aW9uRnJvbVN0cmluZyh3YXJuU2Vjb25kcyksIGR1cmF0aW9uRnJvbVN0cmluZyhmYWlsU2Vjb25kcykpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b0NTVihTZXQ8U3RyaW5nPiB2YWx1ZXMpCiAgICAgewogICAgICAgICByZXR1cm4gdmFsdWVzID09IG51bGwgfHwgdmFsdWVzLmlzRW1wdHkoKSA/ICIiIDogU3RyaW5nLmpvaW4oIiwiLCB2YWx1ZXMpOwpAQCAtOTE0LDQgKzExODgsMjggQEAKICAgICB7CiAgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5pc0VtcHR5KHNpemUpID8gbnVsbCA6IG5ldyBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQoc2l6ZSk7CiAgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGR1cmF0aW9uVG9TdHJpbmcoQE51bGxhYmxlIER1cmF0aW9uU3BlYyBkdXJhdGlvbikKKyAgICB7CisgICAgICAgIHJldHVybiBkdXJhdGlvbiA9PSBudWxsID8gbnVsbCA6IGR1cmF0aW9uLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBkdXJhdGlvbkZyb21TdHJpbmcoQE51bGxhYmxlIFN0cmluZyBkdXJhdGlvbikKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5pc0VtcHR5KGR1cmF0aW9uKSA/IG51bGwgOiBuZXcgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZChkdXJhdGlvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBtYXhpbXVtVGltZXN0YW1wQXNSZWxhdGl2ZU1pY3JvcyhATnVsbGFibGUgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBkdXJhdGlvbikKKyAgICB7CisgICAgICAgIHJldHVybiBkdXJhdGlvbiA9PSBudWxsCisgICAgICAgICAgICAgICA/IExvbmcuTUFYX1ZBTFVFCisgICAgICAgICAgICAgICA6IChDbGllbnRTdGF0ZS5nZXRMYXN0VGltZXN0YW1wTWljcm9zKCkgKyBkdXJhdGlvbi50b01pY3Jvc2Vjb25kcygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIG1pbmltdW1UaW1lc3RhbXBBc1JlbGF0aXZlTWljcm9zKEBOdWxsYWJsZSBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIGR1cmF0aW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGR1cmF0aW9uID09IG51bGwKKyAgICAgICAgICAgICAgID8gTG9uZy5NSU5fVkFMVUUKKyAgICAgICAgICAgICAgIDogKENsaWVudFN0YXRlLmdldExhc3RUaW1lc3RhbXBNaWNyb3MoKSAtIGR1cmF0aW9uLnRvTWljcm9zZWNvbmRzKCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsc0NvbmZpZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzQ29uZmlnLmphdmEKaW5kZXggYTUyZWViMC4uYWYxYjViNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzQ29uZmlnLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzQ29uZmlnLmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRHVyYXRpb25TcGVjOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbnNpc3RlbmN5TGV2ZWw7CiAKIC8qKgpAQCAtMTMzLDYgKzEzNCwxMyBAQAogICAgIGJvb2xlYW4gZ2V0VXNlclRpbWVzdGFtcHNFbmFibGVkKCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdXNlcnMgYXJlIGFsbG93ZWQgYWNjZXNzIHRvIHRoZSBBTFRFUiBUQUJMRSBzdGF0ZW1lbnQgdG8gbXV0YXRlIGNvbHVtbnMgb3Igbm90CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBBTFRFUiBUQUJMRSBBREQvUkVNT1ZFL1JFTkFNRSBpcyBhbGxvd2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGdldEFsdGVyVGFibGVFbmFibGVkKCk7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGFibGVzIGNhbiBiZSB1bmNvbXByZXNzZWQKICAgICAgKgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHVzZXIncyBjYW4gZGlzYWJsZSBjb21wcmVzc2lvbiwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCkBAIC0xNjEsNiArMTY5LDEzIEBACiAgICAgYm9vbGVhbiBnZXREcm9wVHJ1bmNhdGVUYWJsZUVuYWJsZWQoKTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBEUk9QIG9uIGtleXNwYWNlcyBpcyBhbGxvd2VkCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhbGxvd2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGdldERyb3BLZXlzcGFjZUVuYWJsZWQoKTsKKworICAgIC8qKgogICAgICAqIEByZXR1cm4gVGhlIHRocmVzaG9sZCB0byB3YXJuIHdoZW4gcGFnZSBzaXplIGV4Y2VlZHMgZ2l2ZW4gc2l6ZS4KICAgICAgKi8KICAgICBpbnQgZ2V0UGFnZVNpemVXYXJuVGhyZXNob2xkKCk7CkBAIC0xODUsNiArMjAwLDEzIEBACiAgICAgYm9vbGVhbiBnZXRBbGxvd0ZpbHRlcmluZ0VuYWJsZWQoKTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBzZXR0aW5nIFNpbXBsZVN0cmF0ZWd5IHZpYSBrZXlzcGFjZSBjcmVhdGlvbiBvciBhbHRlcmF0aW9uIGlzIGVuYWJsZWQKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIFNpbXBsZVN0cmF0ZWd5IGlzIGFsbG93ZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gZ2V0U2ltcGxlU3RyYXRlZ3lFbmFibGVkKCk7CisKKyAgICAvKioKICAgICAgKiBAcmV0dXJuIFRoZSB0aHJlc2hvbGQgdG8gd2FybiB3aGVuIGFuIElOIHF1ZXJ5IGNyZWF0ZXMgYSBjYXJ0ZXNpYW4gcHJvZHVjdCB3aXRoIGEgc2l6ZSBleGNlZWRpbmcgdGhyZXNob2xkLgogICAgICAqIC0xIG1lYW5zIGRpc2FibGVkLgogICAgICAqLwpAQCAtMjE3LDYgKzIzOSwzMCBAQAogICAgIFNldDxDb25zaXN0ZW5jeUxldmVsPiBnZXRXcml0ZUNvbnNpc3RlbmN5TGV2ZWxzRGlzYWxsb3dlZCgpOwogCiAgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIHdhcm4gd2hlbiB3cml0aW5nIHBhcnRpdGlvbnMgbGFyZ2VyIHRoYW4gdGhyZXNob2xkLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCBnZXRQYXJ0aXRpb25TaXplV2FyblRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIGZhaWwgd2hlbiB3cml0aW5nIHBhcnRpdGlvbnMgbGFyZ2VyIHRoYW4gdGhyZXNob2xkLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCBnZXRQYXJ0aXRpb25TaXplRmFpbFRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIHdhcm4gd2hlbiB3cml0aW5nIGNvbHVtbiB2YWx1ZXMgbGFyZ2VyIHRoYW4gdGhyZXNob2xkLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCBnZXRDb2x1bW5WYWx1ZVNpemVXYXJuVGhyZXNob2xkKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB0aHJlc2hvbGQgdG8gcHJldmVudCB3cml0aW5nIGNvbHVtbiB2YWx1ZXMgbGFyZ2VyIHRoYW4gdGhyZXNob2xkLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCBnZXRDb2x1bW5WYWx1ZVNpemVGYWlsVGhyZXNob2xkKCk7CisKKyAgICAvKioKICAgICAgKiBAcmV0dXJuIFRoZSB0aHJlc2hvbGQgdG8gd2FybiB3aGVuIGVuY291bnRlcmluZyBhIGNvbGxlY3Rpb24gd2l0aCBsYXJnZXIgZGF0YSBzaXplIHRoYW4gdGhyZXNob2xkLgogICAgICAqLwogICAgIEBOdWxsYWJsZQpAQCAtMjc3LDQgKzMyMyw5MCBAQAogICAgICAqLwogICAgIGludCBnZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JGYWlsVGhyZXNob2xkKCk7CiAKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB0aHJlc2hvbGQgdG8gd2FybiB3aGVuIHJlcGxpY2F0aW9uIGZhY3RvciBpcyBncmVhdGVyIHRoYW4gdGhyZXNob2xkLgorICAgICAqLworICAgIGludCBnZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JXYXJuVGhyZXNob2xkKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB0aHJlc2hvbGQgdG8gZmFpbCB3aGVuIHJlcGxpY2F0aW9uIGZhY3RvciBpcyBncmVhdGVyIHRoYW4gdGhyZXNob2xkLgorICAgICAqLworICAgIGludCBnZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JGYWlsVGhyZXNob2xkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgd2FybmluZ3Mgd2lsbCBiZSBlbWl0dGVkIHdoZW4gdXNhZ2Ugb2YgMCBkZWZhdWx0IFRUTCBvbiBhCisgICAgICogdGFibGUgd2l0aCBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5IGlzIGRldGVjdGVkLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgd2FybmluZ3Mgd2lsbCBiZSBlbWl0dGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGdldFplcm9UVExPblRXQ1NXYXJuZWQoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB3YXJuaW5ncyB3aWxsIGJlIGVtaXR0ZWQgd2hlbiB1c2FnZSBvZiAwIGRlZmF1bHQgVFRMIG9uIGEKKyAgICAgKiB0YWJsZSB3aXRoIFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kgaXMgZGV0ZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUge0Bjb2RlIHRydWV9IGlmIHdhcm5pbmcgd2lsbCBiZSBlbWl0dGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFplcm9UVExPblRXQ1NXYXJuZWQoYm9vbGVhbiB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgaXQgaXMgYWxsb3dlZCB0byBjcmVhdGUgb3IgYWx0ZXIgdGFibGUgdG8gdXNlIDAgZGVmYXVsdCBUVEwgd2l0aCBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LgorICAgICAqIElmIGl0IGlzIG5vdCwgc3VjaCBxdWVyeSB3aWxsIGZhaWwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiAwIGRlZmF1bHQgVFRMIGlzIGFsbG93ZWQgb24gVFdDUyB0YWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBnZXRaZXJvVFRMT25UV0NTRW5hYmxlZCgpOworCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHVzZXJzIGNhbiB1c2UgMCBkZWZhdWx0IFRUTCBvbiBhIHRhYmxlIHdpdGggVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB7QGNvZGUgdHJ1ZX0gaWYgMCBkZWZhdWx0IFRUTCBvbiBUV0NTIHRhYmxlcyBpcyBhbGxvd2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFplcm9UVExPblRXQ1NFbmFibGVkKGJvb2xlYW4gdmFsdWUpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBBIHRpbWVzdGFtcCB0aGF0IGlmIGEgdXNlciBzdXBwbGllZCB0aW1lc3RhbXAgaXMgYWZ0ZXIgd2lsbCB0cmlnZ2VyIGEgd2FybmluZworICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQgZ2V0TWF4aW11bVRpbWVzdGFtcFdhcm5UaHJlc2hvbGQoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gQSB0aW1lc3RhbXAgdGhhdCBpZiBhIHVzZXIgc3VwcGxpZWQgdGltZXN0YW1wIGlzIGFmdGVyIHdpbGwgY2F1c2UgYSBmYWlsdXJlCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBnZXRNYXhpbXVtVGltZXN0YW1wRmFpbFRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd2FybmluZyB1cHBlciBib3VuZCBmb3IgdXNlciBzdXBwbGllZCB0aW1lc3RhbXBzCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2FybiBUaGUgaGlnaGVzdCBhY2NlcHRhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiBub3cgYW5kIHRoZSB3cml0dGVuIHZhbHVlIHRpbWVzdGFtcCBiZWZvcmUgdHJpZ2dlcmluZyBhCisgICAgICogICAgICAgICAgICAgd2FybmluZy4ge0Bjb2RlIG51bGx9IG1lYW5zIGRpc2FibGVkLgorICAgICAqIEBwYXJhbSBmYWlsIFRoZSBoaWdoZXN0IGFjY2VwdGFibGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5vdyBhbmQgdGhlIHdyaXR0ZW4gdmFsdWUgdGltZXN0YW1wIGJlZm9yZSB0cmlnZ2VyaW5nIGEKKyAgICAgKiAgICAgICAgICAgICBmYWlsdXJlLiB7QGNvZGUgbnVsbH0gbWVhbnMgZGlzYWJsZWQuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhpbXVtVGltZXN0YW1wVGhyZXNob2xkKEBOdWxsYWJsZSBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIHdhcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIGZhaWwpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBBIHRpbWVzdGFtcCB0aGF0IGlmIGEgdXNlciBzdXBwbGllZCB0aW1lc3RhbXAgaXMgYmVmb3JlIHdpbGwgdHJpZ2dlciBhIHdhcm5pbmcKKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIGdldE1pbmltdW1UaW1lc3RhbXBXYXJuVGhyZXNob2xkKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEEgdGltZXN0YW1wIHRoYXQgaWYgYSB1c2VyIHN1cHBsaWVkIHRpbWVzdGFtcCBpcyBhZnRlciB3aWxsIHRyaWdnZXIgYSB3YXJuaW5nCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBnZXRNaW5pbXVtVGltZXN0YW1wRmFpbFRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgd2FybmluZyBsb3dlciBib3VuZCBmb3IgdXNlciBzdXBwbGllZCB0aW1lc3RhbXBzCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2FybiBUaGUgbG93ZXN0IGFjY2VwdGFibGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5vdyBhbmQgdGhlIHdyaXR0ZW4gdmFsdWUgdGltZXN0YW1wIGJlZm9yZSB0cmlnZ2VyaW5nIGEKKyAgICAgKiAgICAgICAgICAgICB3YXJuaW5nLiB7QGNvZGUgbnVsbH0gbWVhbnMgZGlzYWJsZWQuCisgICAgICogQHBhcmFtIGZhaWwgVGhlIGxvd2VzdCBhY2NlcHRhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiBub3cgYW5kIHRoZSB3cml0dGVuIHZhbHVlIHRpbWVzdGFtcCBiZWZvcmUgdHJpZ2dlcmluZyBhCisgICAgICogICAgICAgICAgICAgZmFpbHVyZS4ge0Bjb2RlIG51bGx9IG1lYW5zIGRpc2FibGVkLgorICAgICAqLworICAgIHZvaWQgc2V0TWluaW11bVRpbWVzdGFtcFRocmVzaG9sZChATnVsbGFibGUgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCB3YXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCBmYWlsKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsc0NvbmZpZ1Byb3ZpZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHNDb25maWdQcm92aWRlci5qYXZhCmluZGV4IDYxMjg3NjQuLjI4MDQ2N2UgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsc0NvbmZpZ1Byb3ZpZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzQ29uZmlnUHJvdmlkZXIuamF2YQpAQCAtMjQsNiArMjQsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DVVNUT01fR1VBUkRSQUlMU19DT05GSUdfUFJPVklERVJfQ0xBU1M7CisKIC8qKgogICogUHJvdmlkZXIgb2Yge0BsaW5rIEd1YXJkcmFpbHNDb25maWd9cyBmb3IgYSB7QGxpbmsgQ2xpZW50U3RhdGV9LgogICogPHA+CkBAIC0zNywxMSArMzksMTQgQEAKICAqLwogcHVibGljIGludGVyZmFjZSBHdWFyZHJhaWxzQ29uZmlnUHJvdmlkZXIKIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fSU1QTEVNRU5UQVRJT05fUFJPUEVSVFkgPSAiY2Fzc2FuZHJhLmN1c3RvbV9ndWFyZHJhaWxzX2NvbmZpZ19wcm92aWRlcl9jbGFzcyI7CisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgQ1VTVE9NX0dVQVJEUkFJTFNfQ09ORklHX1BST1ZJREVSX0NMQVNTLmdldEtleSgpIG11c3QgYmUgdXNlZCBpbnN0ZWFkLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0lNUExFTUVOVEFUSU9OX1BST1BFUlRZID0gQ1VTVE9NX0dVQVJEUkFJTFNfQ09ORklHX1BST1ZJREVSX0NMQVNTLmdldEtleSgpOwogCi0gICAgc3RhdGljIGZpbmFsIEd1YXJkcmFpbHNDb25maWdQcm92aWRlciBpbnN0YW5jZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShDVVNUT01fSU1QTEVNRU5UQVRJT05fUFJPUEVSVFkpID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgRGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYnVpbGQoU3lzdGVtLmdldFByb3BlcnR5KENVU1RPTV9JTVBMRU1FTlRBVElPTl9QUk9QRVJUWSkpOworICAgIEd1YXJkcmFpbHNDb25maWdQcm92aWRlciBpbnN0YW5jZSA9IENVU1RPTV9HVUFSRFJBSUxTX0NPTkZJR19QUk9WSURFUl9DTEFTUy5nZXRTdHJpbmcoKSA9PSBudWxsID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdCgpIDogYnVpbGQoQ1VTVE9NX0dVQVJEUkFJTFNfQ09ORklHX1BST1ZJREVSX0NMQVNTLmdldFN0cmluZygpKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHtAbGluayBHdWFyZHJhaWxzQ29uZmlnfSB0byBiZSB1c2VkIGZvciB0aGUgc3BlY2lmaWVkIHtAbGluayBDbGllbnRTdGF0ZX0uCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHNNQmVhbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzTUJlYW4uamF2YQppbmRleCBhZDJlZGRhLi5jYWJiZTBjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHNNQmVhbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsc01CZWFuLmphdmEKQEAgLTIyMyw2ICsyMjMsMjAgQEAKICAgICB2b2lkIHNldEFsbG93RmlsdGVyaW5nRW5hYmxlZChib29sZWFuIGVuYWJsZWQpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIFNpbXBsZVN0cmF0ZWd5IGlzIGFsbG93ZWQgb24ga2V5c3BhY2UgY3JlYXRpb24gb3IgYWx0ZXJhdGlvbgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgU2ltcGxlU3RyYXRlZ3kgaXMgYWxsb3dlZDsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sZWFuIGdldFNpbXBsZVN0cmF0ZWd5RW5hYmxlZCgpOworCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIFNpbXBsZVN0cmF0ZWd5IGlzIGFsbG93ZWQgb24ga2V5c3BhY2UgY3JlYXRpb24gb3IgYWx0ZXJhdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIGVuYWJsZWQge0Bjb2RlIHRydWV9IGlmIFNpbXBsZVN0cmF0ZWd5IGlzIGFsbG93ZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZvaWQgc2V0U2ltcGxlU3RyYXRlZ3lFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdXNlcnMgY2FuIGRpc2FibGUgY29tcHJlc3Npb24gb24gdGFibGVzCiAgICAgICoKICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB1c2VycyBjYW4gZGlzYWJsZSBjb21wcmVzc2lvbiBvbiBhIHRhYmxlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KQEAgLTI1MSw2ICsyNjUsMjAgQEAKICAgICB2b2lkIHNldENvbXBhY3RUYWJsZXNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7CiAKICAgICAvKioKKyAgICAgKiBHZXRzIHdoZXRoZXIgdXNlcnMgY2FuIHVzZSB0aGUgQUxURVIgVEFCTEUgc3RhdGVtZW50IHRvIGNoYW5nZSBjb2x1bW5zCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBBTFRFUiBUQUJMRSBpcyBhbGxvd2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGdldEFsdGVyVGFibGVFbmFibGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdXNlcnMgY2FuIHVzZSB0aGUgQUxURVIgVEFCTEUgc3RhdGVtZW50IHRvIGNoYW5nZSBjb2x1bW5zCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5hYmxlZCB7QGNvZGUgdHJ1ZX0gaWYgY2hhbmdpbmcgY29sdW1ucyBpcyBhbGxvd2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldEFsdGVyVGFibGVFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgR1JPVVAgQlkgcXVlcmllcyBhcmUgYWxsb3dlZC4KICAgICAgKgogICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGFsbG93ZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgpAQCAtMjc3LDYgKzMwNSwxOCBAQAogICAgIHZvaWQgc2V0RHJvcFRydW5jYXRlVGFibGVFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdXNlcnMgY2FuIERST1AgYSBrZXlzcGFjZQorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYWxsb3dlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBnZXREcm9wS2V5c3BhY2VFbmFibGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgdXNlcnMgY2FuIERST1AgYSBrZXlzcGFjZQorICAgICAqLworICAgIHZvaWQgc2V0RHJvcEtleXNwYWNlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpOworCisgICAgLyoqCiAgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIHdhcm4gd2hlbiByZXF1ZXN0ZWQgcGFnZSBzaXplIGdyZWF0ZXIgdGhhbiB0aHJlc2hvbGQuCiAgICAgICogLTEgbWVhbnMgZGlzYWJsZWQuCiAgICAgICovCkBAIC00MjksNiArNDY5LDU3IEBACiAgICAgdm9pZCBzZXRXcml0ZUNvbnNpc3RlbmN5TGV2ZWxzRGlzYWxsb3dlZENTVihTdHJpbmcgY29uc2lzdGVuY3lMZXZlbHMpOwogCiAgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIHdhcm4gd2hlbiBlbmNvdW50ZXJpbmcgcGFydGl0aW9ucyBsYXJnZXIgdGhhbiB0aHJlc2hvbGQsIGFzIGEgc3RyaW5nIGZvcm1hdHRlZCBhcyBpbiwKKyAgICAgKiBmb3IgZXhhbXBsZSwge0Bjb2RlIDEwR2lCfSwge0Bjb2RlIDIwTWlCfSwge0Bjb2RlIDMwS2lCfSBvciB7QGNvZGUgNDBCfS4gQSB7QGNvZGUgbnVsbH0gdmFsdWUgbWVhbnMgZGlzYWJsZWQuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgU3RyaW5nIGdldFBhcnRpdGlvblNpemVXYXJuVGhyZXNob2xkKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB0aHJlc2hvbGQgdG8gZmFpbCB3aGVuIGVuY291bnRlcmluZyBwYXJ0aXRpb25zIGxhcmdlciB0aGFuIHRocmVzaG9sZCwgYXMgYSBzdHJpbmcgZm9ybWF0dGVkIGFzIGluLAorICAgICAqIGZvciBleGFtcGxlLCB7QGNvZGUgMTBHaUJ9LCB7QGNvZGUgMjBNaUJ9LCB7QGNvZGUgMzBLaUJ9IG9yIHtAY29kZSA0MEJ9LiBBIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyBkaXNhYmxlZC4KKyAgICAgKiBUcmlnZ2VyaW5nIGEgZmFpbHVyZSBlbWl0cyBhIGxvZyBtZXNzYWdlIGFuZCBhIGRpYWdub3N0aWMgIGV2ZW50LCBidXQgaXQgZG9lc24ndCB0aHJvdyBhbiBleGNlcHRpb24gaW50ZXJydXB0aW5nCisgICAgICogdGhlIG9mZmVuZGluZyBzc3RhYmxlIHdyaXRlLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIFN0cmluZyBnZXRQYXJ0aXRpb25TaXplRmFpbFRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogQHBhcmFtIHdhcm5TaXplIFRoZSB0aHJlc2hvbGQgdG8gd2FybiB3aGVuIGVuY291bnRlcmluZyBwYXJ0aXRpb25zIGxhcmdlciB0aGFuIHRocmVzaG9sZCwgYXMgYSBzdHJpbmcgZm9ybWF0dGVkCisgICAgICogICAgICAgICAgICAgICAgIGFzIGluLCBmb3IgZXhhbXBsZSwge0Bjb2RlIDEwR2lCfSwge0Bjb2RlIDIwTWlCfSwge0Bjb2RlIDMwS2lCfSBvciB7QGNvZGUgNDBCfS4KKyAgICAgKiAgICAgICAgICAgICAgICAgQSB7QGNvZGUgbnVsbH0gdmFsdWUgbWVhbnMgZGlzYWJsZWQuCisgICAgICogQHBhcmFtIGZhaWxTaXplIFRoZSB0aHJlc2hvbGQgdG8gZmFpbCB3aGVuIGVuY291bnRlcmluZyBwYXJ0aXRpb25zIGxhcmdlciB0aGFuIHRocmVzaG9sZCwgYXMgYSBzdHJpbmcgZm9ybWF0dGVkCisgICAgICogICAgICAgICAgICAgICAgIGFzIGluLCBmb3IgZXhhbXBsZSwge0Bjb2RlIDEwR2lCfSwge0Bjb2RlIDIwTWlCfSwge0Bjb2RlIDMwS2lCfSBvciB7QGNvZGUgNDBCfS4KKyAgICAgKiAgICAgICAgICAgICAgICAgQSB7QGNvZGUgbnVsbH0gdmFsdWUgbWVhbnMgZGlzYWJsZWQuIFRyaWdnZXJpbmcgYSBmYWlsdXJlIGVtaXRzIGEgbG9nIG1lc3NhZ2UgYW5kIGEgZGlhZ25vc3RpYworICAgICAqICAgICAgICAgICAgICAgICBldmVudCwgYnV0IGl0IGRlc24ndCB0aHJvdyBhbiBleGNlcHRpb24gaW50ZXJydXB0aW5nIHRoZSBvZmZlbmRpbmcgc3N0YWJsZSB3cml0ZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFBhcnRpdGlvblNpemVUaHJlc2hvbGQoQE51bGxhYmxlIFN0cmluZyB3YXJuU2l6ZSwgQE51bGxhYmxlIFN0cmluZyBmYWlsU2l6ZSk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSB0aHJlc2hvbGQgdG8gd2FybiB3aGVuIGVuY291bnRlcmluZyBjb2x1bW4gdmFsdWVzIGxhcmdlciB0aGFuIHRocmVzaG9sZCwgYXMgYSBzdHJpbmcgIGZvcm1hdHRlZCBhcworICAgICAqIGluLCBmb3IgZXhhbXBsZSwge0Bjb2RlIDEwR2lCfSwge0Bjb2RlIDIwTWlCfSwge0Bjb2RlIDMwS2lCfSBvciB7QGNvZGUgNDBCfS4gQSB7QGNvZGUgbnVsbH0gdmFsdWUgbWVhbnMgZGlzYWJsZWQuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgU3RyaW5nIGdldENvbHVtblZhbHVlU2l6ZVdhcm5UaHJlc2hvbGQoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIHRocmVzaG9sZCB0byBwcmV2ZW50IGNvbHVtbiB2YWx1ZXMgbGFyZ2VyIHRoYW4gdGhyZXNob2xkLCBhcyBhIHN0cmluZyBmb3JtYXR0ZWQgYXMgaW4sIGZvciBleGFtcGxlLAorICAgICAqIHtAY29kZSAxMEdpQn0sIHtAY29kZSAyME1pQn0sIHtAY29kZSAzMEtpQn0gb3Ige0Bjb2RlIDQwQn0uIEEge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIGRpc2FibGVkLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIFN0cmluZyBnZXRDb2x1bW5WYWx1ZVNpemVGYWlsVGhyZXNob2xkKCk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gd2FyblNpemUgVGhlIHRocmVzaG9sZCB0byB3YXJuIHdoZW4gZW5jb3VudGVyaW5nIGNvbHVtbiB2YWx1ZXMgbGFyZ2VyIHRoYW4gdGhyZXNob2xkLCBhcyBhIHN0cmluZworICAgICAqICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgYXMgaW4sIGZvciBleGFtcGxlLCB7QGNvZGUgMTBHaUJ9LCB7QGNvZGUgMjBNaUJ9LCB7QGNvZGUgMzBLaUJ9IG9yIHtAY29kZSA0MEJ9LgorICAgICAqICAgICAgICAgICAgICAgICBBIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyBkaXNhYmxlZC4KKyAgICAgKiBAcGFyYW0gZmFpbFNpemUgVGhlIHRocmVzaG9sZCB0byBwcmV2ZW50IGNvbHVtbiB2YWx1ZXMgbGFyZ2VyIHRoYW4gdGhyZXNob2xkLCBhcyBhIHN0cmluZyBmb3JtYXR0ZWQgYXMgaW4sIGZvcgorICAgICAqICAgICAgICAgICAgICAgICBleGFtcGxlLCB7QGNvZGUgMTBHaUJ9LCB7QGNvZGUgMjBNaUJ9LCB7QGNvZGUgMzBLaUJ9IG9yIHtAY29kZSA0MEJ9LgorICAgICAqICAgICAgICAgICAgICAgICBBIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICB2b2lkIHNldENvbHVtblZhbHVlU2l6ZVRocmVzaG9sZChATnVsbGFibGUgU3RyaW5nIHdhcm5TaXplLCBATnVsbGFibGUgU3RyaW5nIGZhaWxTaXplKTsKKworICAgIC8qKgogICAgICAqIEByZXR1cm4gVGhlIHRocmVzaG9sZCB0byB3YXJuIHdoZW4gZW5jb3VudGVyaW5nIGxhcmdlciBzaXplIG9mIGNvbGxlY3Rpb24gZGF0YSB0aGFuIHRocmVzaG9sZCwgYXMgYSBzdHJpbmcKICAgICAgKiBmb3JtYXR0ZWQgYXMgaW4sIGZvciBleGFtcGxlLCB7QGNvZGUgMTBHaUJ9LCB7QGNvZGUgMjBNaUJ9LCB7QGNvZGUgMzBLaUJ9IG9yIHtAY29kZSA0MEJ9LiAgQSB7QGNvZGUgbnVsbH0gdmFsdWUKICAgICAgKiBtZWFucyB0aGF0IHRoZSB0aHJlc2hvbGQgaXMgZGlzYWJsZWQuCkBAIC01MjIsMjEgKzYxMywxMjUgQEAKICAgICB2b2lkIHNldERhdGFEaXNrVXNhZ2VNYXhEaXNrU2l6ZShATnVsbGFibGUgU3RyaW5nIHNpemUpOwogCiAgICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIHdhcm4gd2hlbiByZXBsaWNhdGlvbiBmYWN0b3IgaXMgbGVzc2VyIHRocmVzaG9sZC4KKyAgICAgKiBAcmV0dXJuIFRoZSB0aHJlc2hvbGQgdG8gd2FybiB3aGVuIHJlcGxpY2F0aW9uIGZhY3RvciBpcyBsZXNzZXIgdGhhbiB0aHJlc2hvbGQuCiAgICAgICovCiAgICAgaW50IGdldE1pbmltdW1SZXBsaWNhdGlvbkZhY3Rvcldhcm5UaHJlc2hvbGQoKTsKIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHRocmVzaG9sZCB0byBmYWlsIHdoZW4gcmVwbGljYXRpb24gZmFjdG9yIGlzIGxlc3NlciB0aHJlc2hvbGQuCisgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIGZhaWwgd2hlbiByZXBsaWNhdGlvbiBmYWN0b3IgaXMgbGVzc2VyIHRoYW4gdGhyZXNob2xkLgogICAgICAqLwogICAgIGludCBnZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JGYWlsVGhyZXNob2xkKCk7CiAKICAgICAvKioKLSAgICAgKiBAcGFyYW0gd2FybiB0aGUgdGhyZXNob2xkIHRvIHdhcm4gd2hlbiB0aGUgbWluaW11bSByZXBsaWNhdGlvbiBmYWN0b3IgaXMgbGVzc2VyIHRoYW4KLSAgICAgKiAgICAgICAgICAgICB0aHJlc2hvbGQgLTEgbWVhbnMgZGlzYWJsZWQuCi0gICAgICogQHBhcmFtIGZhaWwgdGhlIHRocmVzaG9sZCB0byBmYWlsIHdoZW4gdGhlIG1pbmltdW0gcmVwbGljYXRpb24gZmFjdG9yIGlzIGxlc3NlciB0aGFuCi0gICAgICogICAgICAgICAgICAgdGhyZXNob2xkIC0xIG1lYW5zIGRpc2FibGVkLgorICAgICAqIEBwYXJhbSB3YXJuIFRoZSB0aHJlc2hvbGQgdG8gd2FybiB3aGVuIHRoZSBtaW5pbXVtIHJlcGxpY2F0aW9uIGZhY3RvciBpcyBsZXNzZXIgdGhhbiB0aHJlc2hvbGQuCisgICAgICogICAgICAgICAgICAgLTEgbWVhbnMgZGlzYWJsZWQuCisgICAgICogQHBhcmFtIGZhaWwgVGhlIHRocmVzaG9sZCB0byBmYWlsIHdoZW4gdGhlIG1pbmltdW0gcmVwbGljYXRpb24gZmFjdG9yIGlzIGxlc3NlciB0aGFuIHRocmVzaG9sZC4KKyAgICAgKiAgICAgICAgICAgIC0xIG1lYW5zIGRpc2FibGVkLgogICAgICAqLwogICAgIHZvaWQgc2V0TWluaW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkIChpbnQgd2FybiwgaW50IGZhaWwpOwogCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIGZhaWwgd2hlbiByZXBsaWNhdGlvbiBmYWN0b3IgaXMgZ3JlYXRlciB0aGFuIHRocmVzaG9sZC4KKyAgICAgKi8KKyAgICBpbnQgZ2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yV2FyblRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdGhyZXNob2xkIHRvIGZhaWwgd2hlbiByZXBsaWNhdGlvbiBmYWN0b3IgaXMgZ3JlYXRlciB0aGFuIHRocmVzaG9sZC4KKyAgICAgKi8KKyAgICBpbnQgZ2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yRmFpbFRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogQHBhcmFtIHdhcm4gVGhlIHRocmVzaG9sZCB0byB3YXJuIHdoZW4gdGhlIG1heGltdW0gcmVwbGljYXRpb24gZmFjdG9yIGlzIGdyZWF0ZXIgdGhhbiB0aHJlc2hvbGQuCisgICAgICogICAgICAgICAgICAgLTEgbWVhbnMgZGlzYWJsZWQuCisgICAgICogQHBhcmFtIGZhaWwgVGhlIHRocmVzaG9sZCB0byBmYWlsIHdoZW4gdGhlIG1heGltdW0gcmVwbGljYXRpb24gZmFjdG9yIGlzIGdyZWF0ZXIgdGhhbiB0aHJlc2hvbGQuCisgICAgICogICAgICAgICAgICAgLTEgbWVhbnMgZGlzYWJsZWQuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQgKGludCB3YXJuLCBpbnQgZmFpbCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgd2FybmluZ3Mgd2lsbCBiZSBlbWl0dGVkIHdoZW4gdXNhZ2Ugb2YgMCBkZWZhdWx0IFRUTCBvbiBhCisgICAgICogdGFibGUgd2l0aCBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5IGlzIGRldGVjdGVkLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgd2FybmluZ3Mgd2lsbCBiZSBlbWl0dGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGdldFplcm9UVExPblRXQ1NXYXJuZWQoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgd2hldGhlciB3YXJuaW5ncyB3aWxsIGJlIGVtaXR0ZWQgd2hlbiB1c2FnZSBvZiAwIGRlZmF1bHQgVFRMIG9uIGEKKyAgICAgKiB0YWJsZSB3aXRoIFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kgaXMgZGV0ZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUge0Bjb2RlIHRydWV9IGlmIHdhcm5pbmcgd2lsbCBiZSBlbWl0dGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFplcm9UVExPblRXQ1NXYXJuZWQoYm9vbGVhbiB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgaXQgaXMgYWxsb3dlZCB0byBjcmVhdGUgb3IgYWx0ZXIgdGFibGUgdG8gdXNlIDAgZGVmYXVsdCBUVEwgd2l0aCBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LgorICAgICAqIElmIGl0IGlzIG5vdCwgc3VjaCBxdWVyeSB3aWxsIGZhaWwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiAwIGRlZmF1bHQgVFRMIGlzIGFsbG93ZWQgb24gVFdDUyB0YWJsZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBnZXRaZXJvVFRMT25UV0NTRW5hYmxlZCgpOworCisgICAgLyoqCisgICAgICogU2V0cyB3aGV0aGVyIHVzZXJzIGNhbiB1c2UgMCBkZWZhdWx0IFRUTCBvbiBhIHRhYmxlIHdpdGggVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB7QGNvZGUgdHJ1ZX0gaWYgMCBkZWZhdWx0IFRUTCBvbiBUV0NTIHRhYmxlcyBpcyBhbGxvd2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2b2lkIHNldFplcm9UVExPblRXQ1NFbmFibGVkKGJvb2xlYW4gdmFsdWUpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgaGlnaGVzdCBhY2NlcHRhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiBub3cgYW5kIHRoZSB3cml0dGVuIHZhbHVlIHRpbWVzdGFtcCBiZWZvcmUgdHJpZ2dlcmluZyBhIHdhcm5pbmcuCisgICAgICogICAgICAgICBFeHByZXNzZWQgYXMgYSBzdHJpbmcgZm9ybWF0dGVkIGFzIGluLCBmb3IgZXhhbXBsZSwge0Bjb2RlIDEwc30ge0Bjb2RlIDIwbX0sIHtAY29kZSAzMGh9IG9yIHtAY29kZSA0MGR9LgorICAgICAqICAgICAgICAgQSB7QGNvZGUgbnVsbH0gdmFsdWUgbWVhbnMgZGlzYWJsZWQuCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgU3RyaW5nIGdldE1heGltdW1UaW1lc3RhbXBXYXJuVGhyZXNob2xkKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBoaWdoZXN0IGFjY2VwdGFibGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5vdyBhbmQgdGhlIHdyaXR0ZW4gdmFsdWUgdGltZXN0YW1wIGJlZm9yZSB0cmlnZ2VyaW5nIGEgZmFpbHVyZS4KKyAgICAgKiAgICAgICAgIEV4cHJlc3NlZCBhcyBhIHN0cmluZyBmb3JtYXR0ZWQgYXMgaW4sIGZvciBleGFtcGxlLCB7QGNvZGUgMTBzfSB7QGNvZGUgMjBtfSwge0Bjb2RlIDMwaH0gb3Ige0Bjb2RlIDQwZH0uCisgICAgICogICAgICAgICBBIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBTdHJpbmcgZ2V0TWF4aW11bVRpbWVzdGFtcEZhaWxUaHJlc2hvbGQoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdhcm5pbmcgdXBwZXIgYm91bmQgZm9yIHVzZXIgc3VwcGxpZWQgdGltZXN0YW1wcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3YXJuRHVyYXRpb24gVGhlIGhpZ2hlc3QgYWNjZXB0YWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gbm93IGFuZCB0aGUgd3JpdHRlbiB2YWx1ZSB0aW1lc3RhbXAgYmVmb3JlCisgICAgICogICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyaW5nIGEgd2FybmluZy4gRXhwcmVzc2VkIGFzIGEgc3RyaW5nIGZvcm1hdHRlZCBhcyBpbiwgZm9yIGV4YW1wbGUsIHtAY29kZSAxMHN9LAorICAgICAqICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIDIwbX0sIHtAY29kZSAzMGh9IG9yIHtAY29kZSA0MGR9LiBBIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyBkaXNhYmxlZC4KKyAgICAgKiBAcGFyYW0gZmFpbER1cmF0aW9uIFRoZSBoaWdoZXN0IGFjY2VwdGFibGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5vdyBhbmQgdGhlIHdyaXR0ZW4gdmFsdWUgdGltZXN0YW1wIGJlZm9yZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcmluZyBhIGZhaWx1cmUuIEV4cHJlc3NlZCBhcyBhIHN0cmluZyBmb3JtYXR0ZWQgYXMgaW4sIGZvciBleGFtcGxlLCB7QGNvZGUgMTBzfSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHtAY29kZSAyMG19LCB7QGNvZGUgMzBofSBvciB7QGNvZGUgNDBkfS4gQSB7QGNvZGUgbnVsbH0gdmFsdWUgbWVhbnMgZGlzYWJsZWQuCisgICAgICovCisgICAgdm9pZCBzZXRNYXhpbXVtVGltZXN0YW1wVGhyZXNob2xkKEBOdWxsYWJsZSBTdHJpbmcgd2FybkR1cmF0aW9uLCBATnVsbGFibGUgU3RyaW5nIGZhaWxEdXJhdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBsb3dlc3QgYWNjZXB0YWJsZSBkaWZmZXJlbmNlIGJldHdlZW4gbm93IGFuZCB0aGUgd3JpdHRlbiB2YWx1ZSB0aW1lc3RhbXAgYmVmb3JlIHRyaWdnZXJpbmcgYSB3YXJuaW5nLgorICAgICAqICAgICAgICAgRXhwcmVzc2VkIGFzIGEgc3RyaW5nIGZvcm1hdHRlZCBhcyBpbiwgZm9yIGV4YW1wbGUsIHtAY29kZSAxMHN9IHtAY29kZSAyMG19LCB7QGNvZGUgMzBofSBvciB7QGNvZGUgNDBkfS4KKyAgICAgKiAgICAgICAgIEEge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIGRpc2FibGVkLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIFN0cmluZyBnZXRNaW5pbXVtVGltZXN0YW1wV2FyblRocmVzaG9sZCgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgbG93ZXN0IGFjY2VwdGFibGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG5vdyBhbmQgdGhlIHdyaXR0ZW4gdmFsdWUgdGltZXN0YW1wIGJlZm9yZSB0cmlnZ2VyaW5nIGEgZmFpbHVyZS4KKyAgICAgKiAgICAgICAgIEV4cHJlc3NlZCBhcyBhIHN0cmluZyBmb3JtYXR0ZWQgYXMgaW4sIGZvciBleGFtcGxlLCB7QGNvZGUgMTBzfSB7QGNvZGUgMjBtfSwge0Bjb2RlIDMwaH0gb3Ige0Bjb2RlIDQwZH0uCisgICAgICogICAgICAgICBBIHtAY29kZSBudWxsfSB2YWx1ZSBtZWFucyBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBATnVsbGFibGUKKyAgICBTdHJpbmcgZ2V0TWluaW11bVRpbWVzdGFtcEZhaWxUaHJlc2hvbGQoKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHdhcm5pbmcgbG93ZXIgYm91bmQgZm9yIHVzZXIgc3VwcGxpZWQgdGltZXN0YW1wcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3YXJuRHVyYXRpb24gVGhlIGxvd2VzdCBhY2NlcHRhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiBub3cgYW5kIHRoZSB3cml0dGVuIHZhbHVlIHRpbWVzdGFtcCBiZWZvcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJpbmcgYSB3YXJuaW5nLiBFeHByZXNzZWQgYXMgYSBzdHJpbmcgZm9ybWF0dGVkIGFzIGluLCBmb3IgZXhhbXBsZSwge0Bjb2RlIDEwc30sCisgICAgICogICAgICAgICAgICAgICAgICAgICB7QGNvZGUgMjBtfSwge0Bjb2RlIDMwaH0gb3Ige0Bjb2RlIDQwZH0uIEEge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIGRpc2FibGVkLgorICAgICAqIEBwYXJhbSBmYWlsRHVyYXRpb24gVGhlIGxvd2VzdCBhY2NlcHRhYmxlIGRpZmZlcmVuY2UgYmV0d2VlbiBub3cgYW5kIHRoZSB3cml0dGVuIHZhbHVlIHRpbWVzdGFtcCBiZWZvcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJpbmcgYSBmYWlsdXJlLiBFeHByZXNzZWQgYXMgYSBzdHJpbmcgZm9ybWF0dGVkIGFzIGluLCBmb3IgZXhhbXBsZSwge0Bjb2RlIDEwc30sCisgICAgICogICAgICAgICAgICAgICAgICAgICB7QGNvZGUgMjBtfSwge0Bjb2RlIDMwaH0gb3Ige0Bjb2RlIDQwZH0uIEEge0Bjb2RlIG51bGx9IHZhbHVlIG1lYW5zIGRpc2FibGVkLgorICAgICAqLworICAgIHZvaWQgc2V0TWluaW11bVRpbWVzdGFtcFRocmVzaG9sZChATnVsbGFibGUgU3RyaW5nIHdhcm5EdXJhdGlvbiwgQE51bGxhYmxlIFN0cmluZyBmYWlsRHVyYXRpb24pOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9NYXhUaHJlc2hvbGQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvTWF4VGhyZXNob2xkLmphdmEKaW5kZXggYmFkYWZmNy4uNjIwM2VlMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9NYXhUaHJlc2hvbGQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL01heFRocmVzaG9sZC5qYXZhCkBAIC0xOSw2ICsxOSw4IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHM7CiAKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uVG9Mb25nRnVuY3Rpb247CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CiAKIC8qKgpAQCAtMzAsMTYgKzMyLDE4IEBACiAgICAgICogQ3JlYXRlcyBhIG5ldyB0aHJlc2hvbGQgZ3VhcmRyYWlsLgogICAgICAqCiAgICAgICogQHBhcmFtIG5hbWUgICAgICAgICAgICB0aGUgaWRlbnRpZnlpbmcgbmFtZSBvZiB0aGUgZ3VhcmRyYWlsCisgICAgICogQHBhcmFtIHJlYXNvbiAgICAgICAgICB0aGUgb3B0aW9uYWwgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgZ3VhcmRpbmcgdGhlIG9wZXJhdGlvbgogICAgICAqIEBwYXJhbSB3YXJuVGhyZXNob2xkICAgYSB7QGxpbmsgQ2xpZW50U3RhdGV9LWJhc2VkIHByb3ZpZGVyIG9mIHRoZSB2YWx1ZSBhYm92ZSB3aGljaCBhIHdhcm5pbmcgc2hvdWxkIGJlIHRyaWdnZXJlZC4KICAgICAgKiBAcGFyYW0gZmFpbFRocmVzaG9sZCAgIGEge0BsaW5rIENsaWVudFN0YXRlfS1iYXNlZCBwcm92aWRlciBvZiB0aGUgdmFsdWUgYWJvdmUgd2hpY2ggdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgYWJvcnRlZC4KICAgICAgKiBAcGFyYW0gbWVzc2FnZVByb3ZpZGVyIGEgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIHdhcm5pbmcgb3IgZXJyb3IgbWVzc2FnZSBpZiB0aGUgZ3VhcmRyYWlsIGlzIHRyaWdnZXJlZAogICAgICAqLwogICAgIHB1YmxpYyBNYXhUaHJlc2hvbGQoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgU3RyaW5nIHJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIFRvTG9uZ0Z1bmN0aW9uPENsaWVudFN0YXRlPiB3YXJuVGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgICAgVG9Mb25nRnVuY3Rpb248Q2xpZW50U3RhdGU+IGZhaWxUaHJlc2hvbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlc2hvbGQuRXJyb3JNZXNzYWdlUHJvdmlkZXIgbWVzc2FnZVByb3ZpZGVyKQogICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSwgd2FyblRocmVzaG9sZCwgZmFpbFRocmVzaG9sZCwgbWVzc2FnZVByb3ZpZGVyKTsKKyAgICAgICAgc3VwZXIobmFtZSwgcmVhc29uLCB3YXJuVGhyZXNob2xkLCBmYWlsVGhyZXNob2xkLCBtZXNzYWdlUHJvdmlkZXIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9NaW5UaHJlc2hvbGQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvTWluVGhyZXNob2xkLmphdmEKaW5kZXggNDI3ZjI3Ny4uNzI3MDRjYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9NaW5UaHJlc2hvbGQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL01pblRocmVzaG9sZC5qYXZhCkBAIC0xOSw2ICsxOSw4IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHM7CiAKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uVG9Mb25nRnVuY3Rpb247CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CiAKIC8qKgpAQCAtMzAsMTYgKzMyLDE4IEBACiAgICAgICogQ3JlYXRlcyBhIG5ldyBtaW5pbXVtIHRocmVzaG9sZCBndWFyZHJhaWwuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgIHRoZSBpZGVudGlmeWluZyBuYW1lIG9mIHRoZSBndWFyZHJhaWwKKyAgICAgKiBAcGFyYW0gcmVhc29uICAgICAgICAgIHRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciBndWFyZGluZyB0aGUgb3BlcmF0aW9uCiAgICAgICogQHBhcmFtIHdhcm5UaHJlc2hvbGQgICBhIHtAbGluayBDbGllbnRTdGF0ZX0tYmFzZWQgcHJvdmlkZXIgb2YgdGhlIHZhbHVlIGFib3ZlIHdoaWNoIGEgd2FybmluZyBzaG91bGQgYmUgdHJpZ2dlcmVkLgogICAgICAqIEBwYXJhbSBmYWlsVGhyZXNob2xkICAgYSB7QGxpbmsgQ2xpZW50U3RhdGV9LWJhc2VkIHByb3ZpZGVyIG9mIHRoZSB2YWx1ZSBhYm92ZSB3aGljaCB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBhYm9ydGVkLgogICAgICAqIEBwYXJhbSBtZXNzYWdlUHJvdmlkZXIgYSBmdW5jdGlvbiB0byBnZW5lcmF0ZSB0aGUgd2FybmluZyBvciBlcnJvciBtZXNzYWdlIGlmIHRoZSBndWFyZHJhaWwgaXMgdHJpZ2dlcmVkCiAgICAgICovCiAgICAgcHVibGljIE1pblRocmVzaG9sZChTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgcmVhc29uLAogICAgICAgICAgICAgICAgICAgICAgICAgVG9Mb25nRnVuY3Rpb248Q2xpZW50U3RhdGU+IHdhcm5UaHJlc2hvbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICBUb0xvbmdGdW5jdGlvbjxDbGllbnRTdGF0ZT4gZmFpbFRocmVzaG9sZCwKICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVzaG9sZC5FcnJvck1lc3NhZ2VQcm92aWRlciBtZXNzYWdlUHJvdmlkZXIpCiAgICAgewotICAgICAgICBzdXBlcihuYW1lLCB3YXJuVGhyZXNob2xkLCBmYWlsVGhyZXNob2xkLCBtZXNzYWdlUHJvdmlkZXIpOworICAgICAgICBzdXBlcihuYW1lLCByZWFzb24sIHdhcm5UaHJlc2hvbGQsIGZhaWxUaHJlc2hvbGQsIG1lc3NhZ2VQcm92aWRlcik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL1BlcmNlbnRhZ2VUaHJlc2hvbGQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvUGVyY2VudGFnZVRocmVzaG9sZC5qYXZhCmluZGV4IDZmODY2YzYuLmMzMTYyNzYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvUGVyY2VudGFnZVRocmVzaG9sZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvUGVyY2VudGFnZVRocmVzaG9sZC5qYXZhCkBAIC0yMCw2ICsyMCw4IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uVG9Mb25nRnVuY3Rpb247CiAKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKIAogLyoqCkBAIC0zMywxNiArMzUsMTggQEAKICAgICAgKiBDcmVhdGVzIGEgbmV3IHRocmVzaG9sZCBndWFyZHJhaWwuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgIHRoZSBpZGVudGlmeWluZyBuYW1lIG9mIHRoZSBndWFyZHJhaWwKKyAgICAgKiBAcGFyYW0gcmVhc29uICAgICAgICAgIHRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciBndWFyZGluZyB0aGUgb3BlcmF0aW9uCiAgICAgICogQHBhcmFtIHdhcm5UaHJlc2hvbGQgICBhIHtAbGluayBDbGllbnRTdGF0ZX0tYmFzZWQgcHJvdmlkZXIgb2YgdGhlIHZhbHVlIGFib3ZlIHdoaWNoIGEgd2FybmluZyBzaG91bGQgYmUgdHJpZ2dlcmVkLgogICAgICAqIEBwYXJhbSBmYWlsVGhyZXNob2xkICAgYSB7QGxpbmsgQ2xpZW50U3RhdGV9LWJhc2VkIHByb3ZpZGVyIG9mIHRoZSB2YWx1ZSBhYm92ZSB3aGljaCB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBhYm9ydGVkLgogICAgICAqIEBwYXJhbSBtZXNzYWdlUHJvdmlkZXIgYSBmdW5jdGlvbiB0byBnZW5lcmF0ZSB0aGUgd2FybmluZyBvciBlcnJvciBtZXNzYWdlIGlmIHRoZSBndWFyZHJhaWwgaXMgdHJpZ2dlcmVkCiAgICAgICovCiAgICAgcHVibGljIFBlcmNlbnRhZ2VUaHJlc2hvbGQoU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyByZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9Mb25nRnVuY3Rpb248Q2xpZW50U3RhdGU+IHdhcm5UaHJlc2hvbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9Mb25nRnVuY3Rpb248Q2xpZW50U3RhdGU+IGZhaWxUaHJlc2hvbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlUHJvdmlkZXIgbWVzc2FnZVByb3ZpZGVyKQogICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSwgd2FyblRocmVzaG9sZCwgZmFpbFRocmVzaG9sZCwgbWVzc2FnZVByb3ZpZGVyKTsKKyAgICAgICAgc3VwZXIobmFtZSwgcmVhc29uLCB3YXJuVGhyZXNob2xkLCBmYWlsVGhyZXNob2xkLCBtZXNzYWdlUHJvdmlkZXIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9QcmVkaWNhdGVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL1ByZWRpY2F0ZXMuamF2YQppbmRleCAxM2JlOWU5Li5hYjA4NTYwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL1ByZWRpY2F0ZXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL1ByZWRpY2F0ZXMuamF2YQpAQCAtNTYsMTYgKzU2LDE4IEBACiAgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUHJlZGljYXRlc30gZ3VhcmRyYWlsLgogICAgICAqCiAgICAgICogQHBhcmFtIG5hbWUgICAgICAgICAgICAgdGhlIGlkZW50aWZ5aW5nIG5hbWUgb2YgdGhlIGd1YXJkcmFpbAorICAgICAqIEBwYXJhbSByZWFzb24gICAgICAgICAgIHRoZSBvcHRpb25hbCBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciBndWFyZGluZyB0aGUgb3BlcmF0aW9uCiAgICAgICogQHBhcmFtIHdhcm5QcmVkaWNhdGUgICAgYSB7QGxpbmsgQ2xpZW50U3RhdGV9LWJhc2VkIHByZWRpY2F0ZSBwcm92aWRlciB0aGF0IGlzIHVzZWQgdG8gY2hlY2sgaWYgZ2l2ZW4gdmFsdWUgc2hvdWxkIHRyaWdnZXIgYSB3YXJuaW5nLgogICAgICAqIEBwYXJhbSBmYWlsdXJlUHJlZGljYXRlIGEge0BsaW5rIENsaWVudFN0YXRlfS1iYXNlZCBwcmVkaWNhdGUgcHJvdmlkZXIgdGhhdCBpcyB1c2VkIHRvIGNoZWNrIGlmIGdpdmVuIHZhbHVlIHNob3VsZCB0cmlnZ2VyIGEgZmFpbHVyZS4KICAgICAgKiBAcGFyYW0gbWVzc2FnZVByb3ZpZGVyICBhIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHRoZSB3YXJuaW5nIG9yIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGd1YXJkcmFpbCBpcyB0cmlnZ2VyZWQKICAgICAgKi8KICAgICBQcmVkaWNhdGVzKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyByZWFzb24sCiAgICAgICAgICAgICAgICBGdW5jdGlvbjxDbGllbnRTdGF0ZSwgUHJlZGljYXRlPFQ+PiB3YXJuUHJlZGljYXRlLAogICAgICAgICAgICAgICAgRnVuY3Rpb248Q2xpZW50U3RhdGUsIFByZWRpY2F0ZTxUPj4gZmFpbHVyZVByZWRpY2F0ZSwKICAgICAgICAgICAgICAgIE1lc3NhZ2VQcm92aWRlcjxUPiBtZXNzYWdlUHJvdmlkZXIpCiAgICAgewotICAgICAgICBzdXBlcihuYW1lKTsKKyAgICAgICAgc3VwZXIobmFtZSwgcmVhc29uKTsKICAgICAgICAgdGhpcy53YXJuUHJlZGljYXRlID0gd2FyblByZWRpY2F0ZTsKICAgICAgICAgdGhpcy5mYWlsdXJlUHJlZGljYXRlID0gZmFpbHVyZVByZWRpY2F0ZTsKICAgICAgICAgdGhpcy5tZXNzYWdlUHJvdmlkZXIgPSBtZXNzYWdlUHJvdmlkZXI7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL1RocmVzaG9sZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9UaHJlc2hvbGQuamF2YQppbmRleCBiNjcxOTA3Li4yNTdhYjAxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL1RocmVzaG9sZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvVGhyZXNob2xkLmphdmEKQEAgLTQxLDE2ICs0MSwxOCBAQAogICAgICAqIENyZWF0ZXMgYSBuZXcgdGhyZXNob2xkIGd1YXJkcmFpbC4KICAgICAgKgogICAgICAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgdGhlIGlkZW50aWZ5aW5nIG5hbWUgb2YgdGhlIGd1YXJkcmFpbAorICAgICAqIEBwYXJhbSByZWFzb24gICAgICAgICAgdGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIGd1YXJkaW5nIHRoZSBvcGVyYXRpb24KICAgICAgKiBAcGFyYW0gd2FyblRocmVzaG9sZCAgIGEge0BsaW5rIENsaWVudFN0YXRlfS1iYXNlZCBwcm92aWRlciBvZiB0aGUgdmFsdWUgYWJvdmUgd2hpY2ggYSB3YXJuaW5nIHNob3VsZCBiZSB0cmlnZ2VyZWQuCiAgICAgICogQHBhcmFtIGZhaWxUaHJlc2hvbGQgICBhIHtAbGluayBDbGllbnRTdGF0ZX0tYmFzZWQgcHJvdmlkZXIgb2YgdGhlIHZhbHVlIGFib3ZlIHdoaWNoIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIGFib3J0ZWQuCiAgICAgICogQHBhcmFtIG1lc3NhZ2VQcm92aWRlciBhIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIHRoZSB3YXJuaW5nIG9yIGVycm9yIG1lc3NhZ2UgaWYgdGhlIGd1YXJkcmFpbCBpcyB0cmlnZ2VyZWQKICAgICAgKi8KICAgICBwdWJsaWMgVGhyZXNob2xkKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyByZWFzb24sCiAgICAgICAgICAgICAgICAgICAgICBUb0xvbmdGdW5jdGlvbjxDbGllbnRTdGF0ZT4gd2FyblRocmVzaG9sZCwKICAgICAgICAgICAgICAgICAgICAgIFRvTG9uZ0Z1bmN0aW9uPENsaWVudFN0YXRlPiBmYWlsVGhyZXNob2xkLAogICAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlUHJvdmlkZXIgbWVzc2FnZVByb3ZpZGVyKQogICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7CisgICAgICAgIHN1cGVyKG5hbWUsIHJlYXNvbik7CiAgICAgICAgIHRoaXMud2FyblRocmVzaG9sZCA9IHdhcm5UaHJlc2hvbGQ7CiAgICAgICAgIHRoaXMuZmFpbFRocmVzaG9sZCA9IGZhaWxUaHJlc2hvbGQ7CiAgICAgICAgIHRoaXMubWVzc2FnZVByb3ZpZGVyID0gbWVzc2FnZVByb3ZpZGVyOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9WYWx1ZXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvVmFsdWVzLmphdmEKaW5kZXggZjQ2ZTNhZi4uOTUwNGEzZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9WYWx1ZXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL1ZhbHVlcy5qYXZhCkBAIC00NywxOCArNDcsMjAgQEAKICAgICAgKiBDcmVhdGVzIGEgbmV3IHZhbHVlcyBndWFyZHJhaWwuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbmFtZSAgICAgICAgICAgICB0aGUgaWRlbnRpZnlpbmcgbmFtZSBvZiB0aGUgZ3VhcmRyYWlsCisgICAgICogQHBhcmFtIHJlYXNvbiAgICAgICAgICAgdGhlIG9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIGd1YXJkaW5nIHRoZSBvcGVyYXRpb24KICAgICAgKiBAcGFyYW0gd2FybmVkVmFsdWVzICAgICBhIHtAbGluayBDbGllbnRTdGF0ZX0tYmFzZWQgcHJvdmlkZXIgb2YgdGhlIHZhbHVlcyBmb3Igd2hpY2ggYSB3YXJuaW5nIGlzIHRyaWdnZXJlZC4KICAgICAgKiBAcGFyYW0gaWdub3JlZFZhbHVlcyAgICBhIHtAbGluayBDbGllbnRTdGF0ZX0tYmFzZWQgcHJvdmlkZXIgb2YgdGhlIHZhbHVlcyB0aGF0IGFyZSBpZ25vcmVkLgogICAgICAqIEBwYXJhbSBkaXNhbGxvd2VkVmFsdWVzIGEge0BsaW5rIENsaWVudFN0YXRlfS1iYXNlZCBwcm92aWRlciBvZiB0aGUgdmFsdWVzIHRoYXQgYXJlIGRpc2FsbG93ZWQuCiAgICAgICogQHBhcmFtIHdoYXQgICAgICAgICAgICAgVGhlIGZlYXR1cmUgdGhhdCBpcyBndWFyZGVkIGJ5IHRoaXMgZ3VhcmRyYWlsIChmb3IgcmVwb3J0aW5nIGluIGVycm9yIG1lc3NhZ2VzKS4KICAgICAgKi8KICAgICBwdWJsaWMgVmFsdWVzKFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyByZWFzb24sCiAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjxDbGllbnRTdGF0ZSwgU2V0PFQ+PiB3YXJuZWRWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjxDbGllbnRTdGF0ZSwgU2V0PFQ+PiBpZ25vcmVkVmFsdWVzLAogICAgICAgICAgICAgICAgICAgRnVuY3Rpb248Q2xpZW50U3RhdGUsIFNldDxUPj4gZGlzYWxsb3dlZFZhbHVlcywKICAgICAgICAgICAgICAgICAgIFN0cmluZyB3aGF0KQogICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7CisgICAgICAgIHN1cGVyKG5hbWUsIHJlYXNvbik7CiAgICAgICAgIHRoaXMud2FybmVkVmFsdWVzID0gd2FybmVkVmFsdWVzOwogICAgICAgICB0aGlzLmlnbm9yZWRWYWx1ZXMgPSBpZ25vcmVkVmFsdWVzOwogICAgICAgICB0aGlzLmRpc2FsbG93ZWRWYWx1ZXMgPSBkaXNhbGxvd2VkVmFsdWVzOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0hlbHBlcnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9IZWxwZXJzLmphdmEKaW5kZXggOGUwZDUxNC4uMTM0YmVlYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0hlbHBlcnMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvSGVscGVycy5qYXZhCkBAIC0xNywxNiArMTcsMjcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGU7CiAKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lio7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlcy4qOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXMuYW5kOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGVzLmluOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXMubm90OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXMub3I7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmFueTsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMuY29uY2F0OwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5maWx0ZXI7CkBAIC01MCw3ICs2MSw3IEBACiAgICAgICogcmVhbGx5IHByZXNlbnQsIGFuZCB0aGF0IHRoZSBpdGVtcyB0byBhZGQgYXJlIG5vdCAodW5sZXNzIHdlJ3JlIGFsc28gcmVtb3ZpbmcgdGhlbSkKICAgICAgKiBAcmV0dXJuIGEgbmV3IGlkZW50aXR5IG1hcCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvdmlkZWQgb25lIG1vZGlmaWVkCiAgICAgICovCi0gICAgc3RhdGljIDxUPiBNYXA8VCwgVD4gcmVwbGFjZShNYXA8VCwgVD4gb3JpZ2luYWwsIFNldDxUPiByZW1vdmUsIEl0ZXJhYmxlPFQ+IGFkZCkKKyAgICBzdGF0aWMgPFQ+IE1hcDxULCBUPiByZXBsYWNlKE1hcDxULCBUPiBvcmlnaW5hbCwgU2V0PD8gZXh0ZW5kcyBUPiByZW1vdmUsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBUPiBhZGQpCiAgICAgewogICAgICAgICAvLyBlbnN1cmUgdGhlIG9uZXMgYmVpbmcgcmVtb3ZlZCBhcmUgdGhlIGV4YWN0IHNhbWUgb25lcyBwcmVzZW50CiAgICAgICAgIGZvciAoVCByZWFkZXIgOiByZW1vdmUpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTGlmZWN5Y2xlVHJhbnNhY3Rpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9MaWZlY3ljbGVUcmFuc2FjdGlvbi5qYXZhCmluZGV4IGQzZjNhMWUuLjdjZmY1N2QgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9MaWZlY3ljbGVUcmFuc2FjdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9MaWZlY3ljbGVUcmFuc2FjdGlvbi5qYXZhCkBAIC0xOCwzMyArMTgsNTQgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlOwogCiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlQcmVkaWNhdGU7CisKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyLlVuaXF1ZUlkZW50aWZpZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5UcmFuc2FjdGlvbmFsOwogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb25zLmNvbXBvc2U7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlcy4qOworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXMuaW47CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0LmNvcHlPZjsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMuKjsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMuY29uY2F0OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5nZXRGaXJzdDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMudHJhbnNmb3JtOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc2luZ2xldG9uOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy4qOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy5hYm9ydE9ic29sZXRpb247CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5IZWxwZXJzLmNoZWNrTm90UmVwbGFjZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5IZWxwZXJzLmNvbmNhdFVuaXE7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5IZWxwZXJzLmVtcHR5U2V0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy5maWx0ZXJJbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkhlbHBlcnMuZmlsdGVyT3V0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy5tYXJrT2Jzb2xldGU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5IZWxwZXJzLm9ySW47CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5IZWxwZXJzLnByZXBhcmVGb3JPYnNvbGV0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy5zZWxlY3Q7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5IZWxwZXJzLnNlbGVjdEZpcnN0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy5zZXRSZXBsYWNlZDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlZpZXcudXBkYXRlQ29tcGFjdGluZzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlZpZXcudXBkYXRlTGl2ZVNldDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlcy5tYXliZUZhaWw7CkBAIC0xNjAsMTIgKzE4MSwxMiBAQAogICAgIH0KIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIGxvZyBjbG9zZWQgZHVyaW5nIHBvc3RDbGVhbnVwCi0gICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24oVHJhY2tlciB0cmFja2VyLCBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUsIEl0ZXJhYmxlPFNTVGFibGVSZWFkZXI+IHJlYWRlcnMpCisgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24oVHJhY2tlciB0cmFja2VyLCBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBTU1RhYmxlUmVhZGVyPiByZWFkZXJzKQogICAgIHsKICAgICAgICAgdGhpcyh0cmFja2VyLCBuZXcgTG9nVHJhbnNhY3Rpb24ob3BlcmF0aW9uVHlwZSwgdHJhY2tlciksIHJlYWRlcnMpOwogICAgIH0KIAotICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uKFRyYWNrZXIgdHJhY2tlciwgTG9nVHJhbnNhY3Rpb24gbG9nLCBJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiByZWFkZXJzKQorICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uKFRyYWNrZXIgdHJhY2tlciwgTG9nVHJhbnNhY3Rpb24gbG9nLCBJdGVyYWJsZTw/IGV4dGVuZHMgU1NUYWJsZVJlYWRlcj4gcmVhZGVycykKICAgICB7CiAgICAgICAgIHRoaXMudHJhY2tlciA9IHRyYWNrZXI7CiAgICAgICAgIHRoaXMubG9nID0gbG9nOwpAQCAtNDU2LDcgKzQ3Nyw3IEBACiAgICAgcHJpdmF0ZSBMaXN0PFNTVGFibGVSZWFkZXI+IHJlc3RvcmVVcGRhdGVkT3JpZ2luYWxzKCkKICAgICB7CiAgICAgICAgIEl0ZXJhYmxlPFNTVGFibGVSZWFkZXI+IHRvcmVzdG9yZSA9IGZpbHRlckluKG9yaWdpbmFscywgbG9nZ2VkLnVwZGF0ZSwgbG9nZ2VkLm9ic29sZXRlKTsKLSAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3QuY29weU9mKHRyYW5zZm9ybSh0b3Jlc3RvcmUsIChyZWFkZXIpIC0+IGN1cnJlbnQocmVhZGVyKS5jbG9uZVdpdGhSZXN0b3JlZFN0YXJ0KHJlYWRlci5maXJzdCkpKTsKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3QuY29weU9mKHRyYW5zZm9ybSh0b3Jlc3RvcmUsIChyZWFkZXIpIC0+IGN1cnJlbnQocmVhZGVyKS5jbG9uZVdpdGhSZXN0b3JlZFN0YXJ0KHJlYWRlci5nZXRGaXJzdCgpKSkpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ0ZpbGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9Mb2dGaWxlLmphdmEKaW5kZXggMTFlM2ZmYi4uYWJmYjU1YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ0ZpbGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTG9nRmlsZS5qYXZhCkBAIC0yMSwyNCArMjEsMzQgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlOwogCiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5OYXZpZ2FibGVTZXQ7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTG9nUmVjb3JkLlR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCkBAIC02MSw4ICs3MSwxMCBAQAogCiAgICAgc3RhdGljIFN0cmluZyBFWFQgPSAiLmxvZyI7CiAgICAgc3RhdGljIGNoYXIgU0VQID0gJ18nOwotICAgIC8vIGNjX3R4bl9vcG5hbWVfaWQubG9nICh3aGVyZSBjYyBpcyBvbmUgb2YgdGhlIHNzdGFibGUgdmVyc2lvbnMgZGVmaW5lZCBpbiBCaWdWZXJzaW9uKQotICAgIHN0YXRpYyBQYXR0ZXJuIEZJTEVfUkVHRVggPSBQYXR0ZXJuLmNvbXBpbGUoU3RyaW5nLmZvcm1hdCgiXiguezJ9KV90eG5fKC4qKV8oLiopJXMkIiwgRVhUKSk7CisgICAgLy8gTG9nIGZpbGUgbmFtZSBmb3JtYXQ6CisgICAgLy8gbGVnYWN5IGZvciBCSUcgZm9ybWF0OiBjY190eG5fb3BuYW1lX2lkLmxvZyAod2hlcmUgY2MgaXMgb25lIG9mIHRoZSBzc3RhYmxlIHZlcnNpb25zIGRlZmluZWQgaW4gQmlnVmVyc2lvbikKKyAgICAvLyBvdGhlciBmb3JtYXRzOiBmbXQtY2NfdHhuX29wbmFtZV9pZC5sb2cgKHdoZXJlIGZtdCBpcyB0aGUgZm9ybWF0IGFuZCBuYW1lIGFuZCBjYyBpcyBvbmUgb2YgaXRzIHZlcnNpb25zKQorICAgIHN0YXRpYyBQYXR0ZXJuIEZJTEVfUkVHRVggPSBQYXR0ZXJuLmNvbXBpbGUoU3RyaW5nLmZvcm1hdCgiXigoPzpbYS16XSstKT8uezJ9Xyk/dHhuXyguKilfKC4qKSVzJCIsIEVYVCkpOwogCiAgICAgLy8gQSBzZXQgb2YgcGh5c2ljYWwgZmlsZXMgb24gZGlzaywgZWFjaCBmaWxlIGlzIGFuIGlkZW50aWNhbCByZXBsaWNhCiAgICAgcHJpdmF0ZSBmaW5hbCBMb2dSZXBsaWNhU2V0IHJlcGxpY2FzID0gbmV3IExvZ1JlcGxpY2FTZXQoKTsKQEAgLTc3LDYgKzg5LDggQEAKICAgICAvLyBUaGUgdW5pcXVlIGlkIG9mIHRoZSB0cmFuc2FjdGlvbgogICAgIHByaXZhdGUgZmluYWwgVGltZVVVSUQgaWQ7CiAKKyAgICBwcml2YXRlIGZpbmFsIFZlcnNpb24gdmVyc2lvbiA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKS5nZXRMYXRlc3RWZXJzaW9uKCk7CisKICAgICBzdGF0aWMgTG9nRmlsZSBtYWtlKEZpbGUgbG9nUmVwbGljYSkKICAgICB7CiAgICAgICAgIHJldHVybiBtYWtlKGxvZ1JlcGxpY2EubmFtZSgpLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGxvZ1JlcGxpY2EpKTsKQEAgLTQ5NiwxOCArNTEwLDE3IEBACiAKICAgICBwcml2YXRlIFN0cmluZyBnZXRGaWxlTmFtZSgpCiAgICAgewotICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMuam9pbihCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nRmlsZS5TRVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dGaWxlLlNFUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5maWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nRmlsZS5TRVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ0ZpbGUuRVhUKTsKKyAgICAgICAgLy8gRm9yIHByZS01LjAgdmVyc2lvbnMsIG9ubHkgQmlnRm9ybWF0IGlzIHN1cHBvcnRlZCwgYW5kIHRoZSBmaWxlIG5hbWUgaW5jbHVkZXMgb25seSB0aGUgdmVyc2lvbiBzdHJpbmcuCisgICAgICAgIC8vIFRvIHJldGFpbiB0aGUgYWJpbGl0eSB0byBkb3duZ3JhZGUgdG8gNC54LCB3ZSBrZWVwIHRoZSBvbGQgZmlsZSBuYW1pbmcgc2NoZW1lIGZvciBCaWdGb3JtYXQgc3N0YWJsZXMKKyAgICAgICAgLy8gYW5kIGFkZCBmb3JtYXQgbmFtZXMgZm9yIG90aGVyIGZvcm1hdHMgYXMgdGhleSBhcmUgc3VwcG9ydGVkIG9ubHkgaW4gNS4wIGFuZCBhYm92ZS4KKyAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmpvaW4oQmlnRm9ybWF0LmlzKHZlcnNpb24uZm9ybWF0KSA/IHZlcnNpb24udG9TdHJpbmcoKSA6IHZlcnNpb24udG9Gb3JtYXRBbmRWZXJzaW9uU3RyaW5nKCksIExvZ0ZpbGUuU0VQLCAvLyByZW1vdmUgdmVyc2lvbiBhbmQgc2VwYXJhdG9yIHdoZW4gZG93bmdyYWRpbmcgdG8gNC54IGlzIGJlY29tZXMgdW5zdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR4biIsIExvZ0ZpbGUuU0VQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLmZpbGVOYW1lLCBMb2dGaWxlLlNFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQudG9TdHJpbmcoKSwgTG9nRmlsZS5FWFQpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHJlY29yZHMuaXNFbXB0eSgpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTG9nUmVjb3JkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTG9nUmVjb3JkLmphdmEKaW5kZXggNDU2NTNjNC4uMzRmZDBkYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ1JlY29yZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9Mb2dSZWNvcmQuamF2YQpAQCAtMjIsNyArMjIsMTYgQEAKIAogCiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlQcmVkaWNhdGU7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CkBAIC0xNTIsNyArMTYxLDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgTG9nUmVjb3JkIG1ha2UoVHlwZSB0eXBlLCBTU1RhYmxlIHRhYmxlKQogICAgIHsKLSAgICAgICAgU3RyaW5nIGFic29sdXRlVGFibGVQYXRoID0gYWJzb2x1dGVQYXRoKHRhYmxlLmRlc2NyaXB0b3IuYmFzZUZpbGVuYW1lKCkpOworICAgICAgICBTdHJpbmcgYWJzb2x1dGVUYWJsZVBhdGggPSBhYnNvbHV0ZVBhdGgodGFibGUuZGVzY3JpcHRvci5iYXNlRmlsZSgpKTsKICAgICAgICAgcmV0dXJuIG1ha2UodHlwZSwgZ2V0RXhpc3RpbmdGaWxlcyhhYnNvbHV0ZVRhYmxlUGF0aCksIHRhYmxlLmdldEFsbEZpbGVQYXRocygpLnNpemUoKSwgYWJzb2x1dGVUYWJsZVBhdGgpOwogICAgIH0KIApAQCAtMTYxLDcgKzE3MCw3IEBACiAgICAgICAgIC8vIGNvbnRhaW5zIGEgbWFwcGluZyBmcm9tIHNzdGFibGUgYWJzb2x1dGUgcGF0aCAoZXZlcnl0aGluZyB1cCB1bnRpbCB0aGUgJ0RhdGEnLydJbmRleCcvZXRjIHBhcnQgb2YgdGhlIGZpbGVuYW1lKSB0byB0aGUgc3N0YWJsZQogICAgICAgICBNYXA8U3RyaW5nLCBTU1RhYmxlPiBhYnNvbHV0ZVBhdGhzID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgdGFibGUgOiB0YWJsZXMpCi0gICAgICAgICAgICBhYnNvbHV0ZVBhdGhzLnB1dChhYnNvbHV0ZVBhdGgodGFibGUuZGVzY3JpcHRvci5iYXNlRmlsZW5hbWUoKSksIHRhYmxlKTsKKyAgICAgICAgICAgIGFic29sdXRlUGF0aHMucHV0KGFic29sdXRlUGF0aCh0YWJsZS5kZXNjcmlwdG9yLmJhc2VGaWxlKCkpLCB0YWJsZSk7CiAKICAgICAgICAgLy8gbWFwcyBzc3RhYmxlIGJhc2UgZmlsZSBuYW1lIHRvIHRoZSBhY3R1YWwgZmlsZXMgb24gZGlzawogICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PEZpbGU+PiBleGlzdGluZ0ZpbGVzID0gZ2V0RXhpc3RpbmdGaWxlcyhhYnNvbHV0ZVBhdGhzLmtleVNldCgpKTsKQEAgLTE3Niw5ICsxODUsOSBAQAogICAgICAgICByZXR1cm4gcmVjb3JkczsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYWJzb2x1dGVQYXRoKFN0cmluZyBiYXNlRmlsZW5hbWUpCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFic29sdXRlUGF0aChGaWxlIGJhc2VGaWxlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEZpbGVVdGlscy5nZXRDYW5vbmljYWxQYXRoKGJhc2VGaWxlbmFtZSArIENvbXBvbmVudC5zZXBhcmF0b3IpOworICAgICAgICByZXR1cm4gYmFzZUZpbGUud2l0aFN1ZmZpeChTdHJpbmcudmFsdWVPZihDb21wb25lbnQuc2VwYXJhdG9yKSkuY2Fub25pY2FsUGF0aCgpOwogICAgIH0KIAogICAgIHB1YmxpYyBMb2dSZWNvcmQgd2l0aEV4aXN0aW5nRmlsZXMoTGlzdDxGaWxlPiBleGlzdGluZ0ZpbGVzKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ1JlcGxpY2EuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9Mb2dSZXBsaWNhLmphdmEKaW5kZXggMWVhOGI4My4uMDczYWM3YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ1JlcGxpY2EuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTG9nUmVwbGljYS5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKQEAgLTU4LDcgKzU5LDE2IEBACiAgICAgewogICAgICAgICBpbnQgZm9sZGVyRkQgPSBOYXRpdmVMaWJyYXJ5LnRyeU9wZW5EaXJlY3RvcnkoZGlyZWN0b3J5LnBhdGgoKSk7CiAgICAgICAgIGlmIChmb2xkZXJGRCA9PSAtMSAgJiYgUkVRVUlSRV9GRCkKLSAgICAgICAgICAgIHRocm93IG5ldyBGU1JlYWRFcnJvcihuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBmb2xkZXIgZGVzY3JpcHRvciB0cnlpbmcgdG8gY3JlYXRlIGxvZyByZXBsaWNhICVzIiwgZGlyZWN0b3J5LnBhdGgoKSkpLCBkaXJlY3RvcnkucGF0aCgpKTsKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKERhdGFiYXNlRGVzY3JpcHRvci5pc0NsaWVudEluaXRpYWxpemVkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkludmFsaWQgZm9sZGVyIGRlc2NyaXB0b3IgdHJ5aW5nIHRvIGNyZWF0ZSBsb2cgcmVwbGljYSB7fS4gQ29udGludWluZyB3aXRob3V0IE5hdGl2ZSBJL08gc3VwcG9ydC4iLCBkaXJlY3RvcnkucGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlNSZWFkRXJyb3IobmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgZm9sZGVyIGRlc2NyaXB0b3IgdHJ5aW5nIHRvIGNyZWF0ZSBsb2cgcmVwbGljYSAlcyIsIGRpcmVjdG9yeS5wYXRoKCkpKSwgZGlyZWN0b3J5LnBhdGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gbmV3IExvZ1JlcGxpY2EobmV3IEZpbGUoZmlsZU5hbWUpLCBmb2xkZXJGRCk7CiAgICAgfQpAQCAtNjcsNyArNzcsMTYgQEAKICAgICB7CiAgICAgICAgIGludCBmb2xkZXJGRCA9IE5hdGl2ZUxpYnJhcnkudHJ5T3BlbkRpcmVjdG9yeShmaWxlLnBhcmVudCgpLnBhdGgoKSk7CiAgICAgICAgIGlmIChmb2xkZXJGRCA9PSAtMSkKLSAgICAgICAgICAgIHRocm93IG5ldyBGU1JlYWRFcnJvcihuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBmb2xkZXIgZGVzY3JpcHRvciB0cnlpbmcgdG8gY3JlYXRlIGxvZyByZXBsaWNhICVzIiwgZmlsZS5wYXJlbnQoKS5wYXRoKCkpKSwgZmlsZS5wYXJlbnQoKS5wYXRoKCkpOworICAgICAgICB7CisgICAgICAgICAgICBpZiAoRGF0YWJhc2VEZXNjcmlwdG9yLmlzQ2xpZW50SW5pdGlhbGl6ZWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiSW52YWxpZCBmb2xkZXIgZGVzY3JpcHRvciB0cnlpbmcgdG8gY3JlYXRlIGxvZyByZXBsaWNhIHt9LiBDb250aW51aW5nIHdpdGhvdXQgTmF0aXZlIEkvTyBzdXBwb3J0LiIsIGZpbGUucGFyZW50UGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlNSZWFkRXJyb3IobmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgZm9sZGVyIGRlc2NyaXB0b3IgdHJ5aW5nIHRvIGNyZWF0ZSBsb2cgcmVwbGljYSAlcyIsIGZpbGUucGFyZW50KCkucGF0aCgpKSksIGZpbGUucGFyZW50KCkucGF0aCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBuZXcgTG9nUmVwbGljYShmaWxlLCBmb2xkZXJGRCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ1RyYW5zYWN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTG9nVHJhbnNhY3Rpb24uamF2YQppbmRleCBmMjAzYmQ4Li42ZDI0ODc0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTG9nVHJhbnNhY3Rpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTG9nVHJhbnNhY3Rpb24uamF2YQpAQCAtMjIsMTUgKzIyLDIwIEBACiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiAKLWltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5Db3VudGVyOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5SdW5uYWJsZXM7CiAKK2ltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5Db3VudGVyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTQxLDE1ICs0NiwxNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTG9nUmVjb3JkLlR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmQ291bnRlZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlRyYW5zYWN0aW9uYWw7CkBAIC0zODcsMTggKzM5NCwxNCBAQAogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgY2FuJ3Qgc3VjY2Vzc2Z1bGx5IGRlbGV0ZSB0aGUgREFUQSBjb21wb25lbnQsIHNldCB0aGUgdGFzayB0byBiZSByZXRyaWVkIGxhdGVyOiBzZWUgVHJhbnNhY3Rpb25UaWRpZXIKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBkYXRhZmlsZSA9IG5ldyBGaWxlKGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIlRpZGllciBydW5uaW5nIGZvciBvbGQgc3N0YWJsZSB7fSIsIGRlc2MuYmFzZUZpbGVuYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJUaWRpZXIgcnVubmluZyBmb3Igb2xkIHNzdGFibGUge30iLCBkZXNjKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YWZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUoZGF0YWZpbGUpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghd2FzTmV3KQorICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2MuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLmV4aXN0cygpICYmICF3YXNOZXcpCiAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlNTVGFibGVUaWRpZXIgcmFuIHdpdGggbm8gZXhpc3RpbmcgZGF0YSBmaWxlIGZvciBhbiBzc3RhYmxlIHRoYXQgd2FzIG5vdCBuZXciKTsKIAotICAgICAgICAgICAgICAgICAgICAvLyBsZXQgdGhlIHJlbWFpbmRlciBiZSBjbGVhbmVkIHVwIGJ5IGRlbGV0ZQotICAgICAgICAgICAgICAgICAgICBTU1RhYmxlLmRlbGV0ZShkZXNjLCBTU1RhYmxlLmRpc2NvdmVyQ29tcG9uZW50c0ZvcihkZXNjKSk7CisgICAgICAgICAgICAgICAgICAgIGRlc2MuZ2V0Rm9ybWF0KCkuZGVsZXRlKGRlc2MpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCiAgICAgICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL1RyYWNrZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9UcmFja2VyLmphdmEKaW5kZXggYWI4YTc0Yi4uYzU0ZWU4MyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL1RyYWNrZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvVHJhY2tlci5qYXZhCkBAIC0xNyw3ICsxNywxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZTsKIAotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKIApAQCAtMjUsMjMgKzI5LDM0IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC4qOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuTWVtdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1Bvc2l0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1Bvc2l0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5NZW10YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TdG9yYWdlTWV0cmljczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5JTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuSU5vdGlmaWNhdGlvbkNvbnN1bWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuSW5pdGlhbFNTVGFibGVBZGRlZE5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLk1lbXRhYmxlRGlzY2FyZGVkTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuTWVtdGFibGVSZW5ld2VkTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuTWVtdGFibGVTd2l0Y2hlZE5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLlNTVGFibGVBZGRlZE5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLlNTVGFibGVEZWxldGluZ05vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLlNTVGFibGVMaXN0Q2hhbmdlZE5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLlNTVGFibGVNZXRhZGF0YUNoYW5nZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlUmVwYWlyU3RhdHVzQ2hhbmdlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLlRydW5jYXRpb25Ob3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuT3BPcmRlcjsKQEAgLTUxLDcgKzY2LDExIEBACiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmZpbHRlcjsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbjsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5IZWxwZXJzLio7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5IZWxwZXJzLmFib3J0T2Jzb2xldGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkhlbHBlcnMubWFya09ic29sZXRlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuSGVscGVycy5ub3RJbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkhlbHBlcnMucHJlcGFyZUZvck9ic29sZXRpb247CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5IZWxwZXJzLnNldHVwT25saW5lOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuVmlldy5wZXJtaXRDb21wYWN0aW5nOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuVmlldy51cGRhdGVDb21wYWN0aW5nOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuVmlldy51cGRhdGVMaXZlU2V0OwpAQCAtOTksNyArMTE4LDcgQEAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIGEgVHJhbnNhY3Rpb24gb3ZlciB0aGUgcHJvdmlkZWQgc3N0YWJsZXMgaWYgd2UgYXJlIGFibGUgdG8gbWFyayB0aGUgZ2l2ZW4gQHBhcmFtIHNzdGFibGVzIGFzIGNvbXBhY3RlZCwgYmVmb3JlIGFueW9uZSBlbHNlCiAgICAgICovCi0gICAgcHVibGljIExpZmVjeWNsZVRyYW5zYWN0aW9uIHRyeU1vZGlmeShJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcywgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlKQorICAgIHB1YmxpYyBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0cnlNb2RpZnkoSXRlcmFibGU8PyBleHRlbmRzIFNTVGFibGVSZWFkZXI+IHNzdGFibGVzLCBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUpCiAgICAgewogICAgICAgICBpZiAoSXRlcmFibGVzLmlzRW1wdHkoc3N0YWJsZXMpKQogICAgICAgICAgICAgcmV0dXJuIG5ldyBMaWZlY3ljbGVUcmFuc2FjdGlvbih0aGlzLCBvcGVyYXRpb25UeXBlLCBzc3RhYmxlcyk7CkBAIC0xNTIsNiArMTcxLDggQEAKICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwogCiAgICAgICAgIGxvbmcgYWRkID0gMDsKKyAgICAgICAgbG9uZyBhZGRVbmNvbXByZXNzZWQgPSAwOworCiAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogbmV3U1NUYWJsZXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKQEAgLTE1OSwxMyArMTgwLDE3IEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBhZGQgKz0gc3N0YWJsZS5ieXRlc09uRGlzaygpOworICAgICAgICAgICAgICAgIGFkZFVuY29tcHJlc3NlZCArPSBzc3RhYmxlLmxvZ2ljYWxCeXRlc09uRGlzaygpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFjY3VtdWxhdGUgPSBtZXJnZShhY2N1bXVsYXRlLCB0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCiAgICAgICAgIGxvbmcgc3VidHJhY3QgPSAwOworICAgICAgICBsb25nIHN1YnRyYWN0VW5jb21wcmVzc2VkID0gMDsKKwogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IG9sZFNTVGFibGVzKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCkBAIC0xNzMsNiArMTk4LDcgQEAKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHN1YnRyYWN0ICs9IHNzdGFibGUuYnl0ZXNPbkRpc2soKTsKKyAgICAgICAgICAgICAgICBzdWJ0cmFjdFVuY29tcHJlc3NlZCArPSBzc3RhYmxlLmxvZ2ljYWxCeXRlc09uRGlzaygpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICAgICAgewpAQCAtMTgxLDcgKzIwNywxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgU3RvcmFnZU1ldHJpY3MubG9hZC5pbmMoYWRkIC0gc3VidHJhY3QpOworICAgICAgICBTdG9yYWdlTWV0cmljcy51bmNvbXByZXNzZWRMb2FkLmluYyhhZGRVbmNvbXByZXNzZWQgLSBzdWJ0cmFjdFVuY29tcHJlc3NlZCk7CisKICAgICAgICAgY2ZzdG9yZS5tZXRyaWMubGl2ZURpc2tTcGFjZVVzZWQuaW5jKGFkZCAtIHN1YnRyYWN0KTsKKyAgICAgICAgY2ZzdG9yZS5tZXRyaWMudW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQuaW5jKGFkZFVuY29tcHJlc3NlZCAtIHN1YnRyYWN0VW5jb21wcmVzc2VkKTsKIAogICAgICAgICAvLyB3ZSBkb24ndCBzdWJ0cmFjdCBmcm9tIHRvdGFsIHVudGlsIHRoZSBzc3RhYmxlIGlzIGRlbGV0ZWQsIHNlZSBUcmFuc2FjdGlvbkxvZ3MuU1NUYWJsZVRpZGllcgogICAgICAgICBjZnN0b3JlLm1ldHJpYy50b3RhbERpc2tTcGFjZVVzZWQuaW5jKGFkZCk7CkBAIC00MDgsNyArNDM3LDcgQEAKIAogICAgIHB1YmxpYyB2b2lkIG1heWJlSW5jcmVtZW50YWxseUJhY2t1cChmaW5hbCBJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcykKICAgICB7Ci0gICAgICAgIGlmICghRGF0YWJhc2VEZXNjcmlwdG9yLmlzSW5jcmVtZW50YWxCYWNrdXBzRW5hYmxlZCgpKQorICAgICAgICBpZiAoIWNmc3RvcmUuaXNUYWJsZUluY3JlbWVudGFsQmFja3Vwc0VuYWJsZWQoKSkKICAgICAgICAgICAgIHJldHVybjsKIAogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL1ZpZXcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9WaWV3LmphdmEKaW5kZXggOTU4YmMwZC4uYjIzOGQyNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL1ZpZXcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvVmlldy5qYXZhCkBAIC0xNywxNyArMTcsMjIgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGU7CiAKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWRpY2F0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lio7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkludGVydmFsOwpAQCAtMTM2LDEzICsxNDEsMzAgQEAKICAgICAgICAgICAgIGNhc2UgTk9OQ09NUEFDVElORzoKICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyKHNzdGFibGVzLCAocykgLT4gIWNvbXBhY3RpbmcuY29udGFpbnMocykpOwogICAgICAgICAgICAgY2FzZSBDQU5PTklDQUw6CisgICAgICAgICAgICAgICAgLy8gV2hlbiBlYXJseSBvcGVuIGlzIG5vdCBpbiBwbGF5LCB0aGUgTElWRSBhbmQgQ0FOT05JQ0FMIHNldHMgYXJlIHRoZSBzYW1lLgorICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIHdoZW4gd2UgZG8gaGF2ZSBlYXJseS1vcGVuIHNzdGFibGVzLCB3ZSB3aWxsIGhhdmUgc29tZSB1bmZpbmlzaGVkIHNvdXJjZXMgaW4gdGhlIGxpdmUgc2V0LgorICAgICAgICAgICAgICAgIC8vIEZvciB0aGVzZSBzb3VyY2VzIHdlIG5lZWQgdG8gZXh0cmFjdCB0aGUgb3JpZ2luYWxzLCBpbiB0aGVpciBub24tbW92ZWQtc3RhcnQgdmVyc2lvbnMsIGZyb20gdGhlCisgICAgICAgICAgICAgICAgLy8gY29tcGFjdGluZyBzZXQuCisgICAgICAgICAgICAgICAgLy8gVGhpcyBjcmVhdGVzIGEgcHJvYmxlbSB3aGVuIHRoZSBjb21wYWN0aW9uIGNvbXBsZXRlcywgYXMgdGhlbiBib3RoOgorICAgICAgICAgICAgICAgIC8vIC0gdGhlIHNvdXJjZSBpcyBpbiB0aGUgY29tcGFjdGluZyBzZXQKKyAgICAgICAgICAgICAgICAvLyAtIHRoZSByZXN1bHQgaXMgaW4gdGhlIGxpdmUgc2V0CisgICAgICAgICAgICAgICAgLy8gVGhpcyBjdXJyZW50bHkgY2F1c2VzIHRoZSBDQU5PTklDQUwgc2V0IHRvIHJldHVybiBib3RoIHNvdXJjZSBhbmQgcmVzdWx0IHdoZW4gZWFybHktb3BlbiBpcyBkaXNhYmxlZCwKKyAgICAgICAgICAgICAgICAvLyBhbmQgaXMgb3RoZXJ3aXNlIHdvcmtlZCBhcm91bmQgYnkgb3BlbmluZyBlYXJseSB0aGUgbGFzdCBzc3RhYmxlIGluIHRoZSByZXN1bHQgc2V0ICh3aGljaCBwdXNoZXMgaXQKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGUgY29tcGFjdGluZyBzZXQgd2l0aCBFQVJMWSBvcGVuUmVhc29uKSBhbmQgdGhlICFjb21wYWN0aW5nLmNvbnRhaW5zKHNzdGFibGUpIGNoZWNrIGluIHRoZQorICAgICAgICAgICAgICAgIC8vIHNlY29uZCBsb29wIGJlbG93LgorICAgICAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHkgdGhlcmUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgd2F5IHRvIGF2b2lkIHRoaXMgd29ya2Fyb3VuZC4gRmlsdGVyaW5nIHRoZSBjb21wYWN0aW5nCisgICAgICAgICAgICAgICAgLy8gc2V0IHRocm91Z2ggaGF2aW5nIGFuIGVhcmx5LW9wZW4gdmVyc2lvbiBpbiBsaXZlIGRvZXMgbm90IHdvcmsgYmVjYXVzZSBzb3VyY2VzIGFyZSBmdWxseSByZW1vdmVkIGZyb20KKyAgICAgICAgICAgICAgICAvLyB0aGUgbGl2ZSBzZXQgd2hlbiB0aGV5IGFyZSBjb21wbGV0ZWx5IGV4aGF1c3RlZC4KKworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgY29tcGFjdGluZyB2ZXJzaW9ucyBmaXJzdCBiZWNhdXNlIHRoZXkgd2lsbCBiZSB0aGUgY2Fub25pY2FsIHZlcnNpb25zIG9mIGNvbXBhY3Rpb24gc291cmNlcy4KICAgICAgICAgICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gY2Fub25pY2FsU1NUYWJsZXMgPSBuZXcgSGFzaFNldDw+KHNzdGFibGVzLnNpemUoKSArIGNvbXBhY3Rpbmcuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNvbXBhY3RpbmcpCiAgICAgICAgICAgICAgICAgICAgIGlmIChzc3RhYmxlLm9wZW5SZWFzb24gIT0gU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uLkVBUkxZKQogICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsU1NUYWJsZXMuYWRkKHNzdGFibGUpOwotICAgICAgICAgICAgICAgIC8vIHJlYXNvbiBmb3IgY2hlY2tpbmcgaWYgY29tcGFjdGluZyBjb250YWlucyB0aGUgc3N0YWJsZSBpcyB0aGF0IGlmIGNvbXBhY3RpbmcgaGFzIGFuIEVBUkxZIHZlcnNpb24KLSAgICAgICAgICAgICAgICAvLyBvZiBhIE5PUk1BTCBzc3RhYmxlLCB3ZSBzdGlsbCBoYXZlIHRoZSBjYW5vbmljYWwgdmVyc2lvbiBvZiB0aGF0IHNzdGFibGUgaW4gc3N0YWJsZXMuCi0gICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHRoZSBFQVJMWSB2ZXJzaW9uIGlzIGVxdWFsLCBidXQgbm90ID09IHNpbmNlIGl0IGlzIGEgZGlmZmVyZW50IGluc3RhbmNlIG9mIHRoZSBzYW1lIHNzdGFibGUuCisgICAgICAgICAgICAgICAgLy8gQWRkIGFueXRoaW5nIHRoYXQgaXMgbm90IGNvbXBhY3RpbmcsIHJlbW92aW5nIGFueSBjb21wYWN0aW9uIHJlc3VsdCB3aGVyZSB3ZSBzdGlsbCBoYXZlIHRoZQorICAgICAgICAgICAgICAgIC8vIGNvbXBhY3Rpb24gc291cmNlcy4KKyAgICAgICAgICAgICAgICAvLyBub3RlIHRoYXQgdGhlIEVBUkxZIHZlcnNpb24gaXMgZXF1YWwgdG8gdGhlIG9yaWdpbmFsLCBpLmUuIHRoZSBzZXQgaXRzZWxmIGNhbiBndWFyYW50ZWUgZWFybHktb3BlbgorICAgICAgICAgICAgICAgIC8vIHZlcnNpb25zIG9mIHNzdGFibGVzIGluIGNvbXBhY3Rpbmcgd29uJ3QgYmUgYWRkZWQsIGJ1dCB3ZSBhbHNvIHdhbnQgdG8gcmVtb3ZlIHRoZSByZXN1bHRzLgogICAgICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCiAgICAgICAgICAgICAgICAgICAgIGlmICghY29tcGFjdGluZy5jb250YWlucyhzc3RhYmxlKSAmJiBzc3RhYmxlLm9wZW5SZWFzb24gIT0gU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uLkVBUkxZKQogICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsU1NUYWJsZXMuYWRkKHNzdGFibGUpOwpAQCAtMjQxLDcgKzI2Myw3IEBACiAgICAgLy8gTUVUSE9EUyBUTyBDT05TVFJVQ1QgRlVOQ1RJT05TIEZPUiBNT0RJRllJTkcgQSBWSUVXOgogCiAgICAgLy8gcmV0dXJuIGEgZnVuY3Rpb24gdG8gdW4vbWFyayB0aGUgcHJvdmlkZWQgcmVhZGVycyBjb21wYWN0aW5nIGluIGEgdmlldwotICAgIHN0YXRpYyBGdW5jdGlvbjxWaWV3LCBWaWV3PiB1cGRhdGVDb21wYWN0aW5nKGZpbmFsIFNldDxTU1RhYmxlUmVhZGVyPiB1bm1hcmssIGZpbmFsIEl0ZXJhYmxlPFNTVGFibGVSZWFkZXI+IG1hcmspCisgICAgc3RhdGljIEZ1bmN0aW9uPFZpZXcsIFZpZXc+IHVwZGF0ZUNvbXBhY3RpbmcoZmluYWwgU2V0PD8gZXh0ZW5kcyBTU1RhYmxlUmVhZGVyPiB1bm1hcmssIGZpbmFsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBTU1RhYmxlUmVhZGVyPiBtYXJrKQogICAgIHsKICAgICAgICAgaWYgKHVubWFyay5pc0VtcHR5KCkgJiYgSXRlcmFibGVzLmlzRW1wdHkobWFyaykpCiAgICAgICAgICAgICByZXR1cm4gRnVuY3Rpb25zLmlkZW50aXR5KCk7CkBAIC0yNTksNyArMjgxLDcgQEAKIAogICAgIC8vIGNvbnN0cnVjdCBhIHByZWRpY2F0ZSB0byByZWplY3Qgdmlld3MgdGhhdCBkbyBub3QgcGVybWl0IHVzIHRvIG1hcmsgdGhlc2UgcmVhZGVycyBjb21wYWN0aW5nOwogICAgIC8vIGkuZS4gb25lIG9mIHRoZW0gaXMgZWl0aGVyIGFscmVhZHkgY29tcGFjdGluZywgaGFzIGJlZW4gY29tcGFjdGVkLCBvciBoYXMgYmVlbiByZXBsYWNlZAotICAgIHN0YXRpYyBQcmVkaWNhdGU8Vmlldz4gcGVybWl0Q29tcGFjdGluZyhmaW5hbCBJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiByZWFkZXJzKQorICAgIHN0YXRpYyBQcmVkaWNhdGU8Vmlldz4gcGVybWl0Q29tcGFjdGluZyhmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgU1NUYWJsZVJlYWRlcj4gcmVhZGVycykKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgUHJlZGljYXRlPFZpZXc+KCkKICAgICAgICAgewpAQCAtMzUzLDQgKzM3NSw0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQWJzdHJhY3RUaW1lVVVJRFR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQWJzdHJhY3RUaW1lVVVJRFR5cGUuamF2YQppbmRleCA5MWE1YjI3Li4zOGFmODEyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0Fic3RyYWN0VGltZVVVSURUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9BYnN0cmFjdFRpbWVVVUlEVHlwZS5qYXZhCkBAIC0yNiw2ICsyNiw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5VVUlEU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJREFzQnl0ZXM7CkBAIC00Myw2ICs0Niw3IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyA8VkwsIFZSPiBpbnQgY29tcGFyZUN1c3RvbShWTCBsZWZ0LCBWYWx1ZUFjY2Vzc29yPFZMPiBhY2Nlc3NvckwsIFZSIHJpZ2h0LCBWYWx1ZUFjY2Vzc29yPFZSPiBhY2Nlc3NvclIpCiAgICAgewogICAgICAgICAvLyBDb21wYXJlIGZvciBsZW5ndGgKQEAgLTU3LDEyICs2MSwxMiBAQAogCiAgICAgICAgIGxvbmcgbXNiMSA9IGFjY2Vzc29yTC5nZXRMb25nKGxlZnQsIDApOwogICAgICAgICBsb25nIG1zYjIgPSBhY2Nlc3NvclIuZ2V0TG9uZyhyaWdodCwgMCk7CisgICAgICAgIHZlcmlmeVZlcnNpb24obXNiMSk7CisgICAgICAgIHZlcmlmeVZlcnNpb24obXNiMik7CisKICAgICAgICAgbXNiMSA9IHJlb3JkZXJUaW1lc3RhbXBCeXRlcyhtc2IxKTsKICAgICAgICAgbXNiMiA9IHJlb3JkZXJUaW1lc3RhbXBCeXRlcyhtc2IyKTsKIAotICAgICAgICBhc3NlcnQgKG1zYjEgJiB0b3BieXRlKDB4ZjBMKSkgPT0gdG9wYnl0ZSgweDEwTCk7Ci0gICAgICAgIGFzc2VydCAobXNiMiAmIHRvcGJ5dGUoMHhmMEwpKSA9PSB0b3BieXRlKDB4MTBMKTsKLQogICAgICAgICBpbnQgYyA9IExvbmcuY29tcGFyZShtc2IxLCBtc2IyKTsKICAgICAgICAgaWYgKGMgIT0gMCkKICAgICAgICAgICAgIHJldHVybiBjOwpAQCAtNzQsNiArNzgsNDAgQEAKICAgICAgICAgcmV0dXJuIExvbmcuY29tcGFyZShsc2IxLCBsc2IyKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICBpZiAoYWNjZXNzb3IuaXNFbXB0eShkYXRhKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGxvbmcgaGlCaXRzID0gYWNjZXNzb3IuZ2V0TG9uZyhkYXRhLCAwKTsKKyAgICAgICAgdmVyaWZ5VmVyc2lvbihoaUJpdHMpOworICAgICAgICBCeXRlQnVmZmVyIHN3aXp6bGVkID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxNik7CisgICAgICAgIHN3aXp6bGVkLnB1dExvbmcoMCwgVGltZVVVSURUeXBlLnJlb3JkZXJUaW1lc3RhbXBCeXRlcyhoaUJpdHMpKTsKKyAgICAgICAgc3dpenpsZWQucHV0TG9uZyg4LCBhY2Nlc3Nvci5nZXRMb25nKGRhdGEsIDgpIF4gMHg4MDgwODA4MDgwODA4MDgwTCk7CisKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2UuZml4ZWRMZW5ndGgoc3dpenpsZWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICAvLyBPcHRpb25hbC1zdHlsZSBlbmNvZGluZyBvZiBlbXB0eSB2YWx1ZXMgYXMgbnVsbCBzb3VyY2VzCisgICAgICAgIGlmIChjb21wYXJhYmxlQnl0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5lbXB0eSgpOworCisgICAgICAgIC8vIFRoZSBub24tbGV4aWNhbCBVVUlEIGJpdHMgYXJlIHN0b3JlZCBhcyBhbiB1bnNpZ25lZCBmaXhlZC1sZW5ndGggMTI4LWJpdCBpbnRlZ2VyLgorICAgICAgICBsb25nIGhpQml0cyA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFVuc2lnbmVkRml4ZWRMZW5ndGhBc0xvbmcoY29tcGFyYWJsZUJ5dGVzLCA4KTsKKyAgICAgICAgbG9uZyBsb0JpdHMgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRVbnNpZ25lZEZpeGVkTGVuZ3RoQXNMb25nKGNvbXBhcmFibGVCeXRlcywgOCk7CisKKyAgICAgICAgaGlCaXRzID0gcmVvcmRlckJhY2tUaW1lc3RhbXBCeXRlcyhoaUJpdHMpOworICAgICAgICB2ZXJpZnlWZXJzaW9uKGhpQml0cyk7CisgICAgICAgIC8vIEluIGFkZGl0aW9uLCBUaW1lVVVJRFR5cGUgYWxzbyB0b3VjaGVzIHRoZSBsb3cgYml0cyBvZiB0aGUgVVVJRCAoc2VlIENBU1NBTkRSQS04NzMwIGFuZCBEQi0xNzU4KS4KKyAgICAgICAgbG9CaXRzIF49IDB4ODA4MDgwODA4MDgwODA4MEw7CisKKyAgICAgICAgcmV0dXJuIFVVSURUeXBlLm1ha2VVdWlkQnl0ZXMoYWNjZXNzb3IsIGhpQml0cywgbG9CaXRzKTsKKyAgICB9CisKICAgICAvLyB0YWtlcyBhcyBpbnB1dCA4IHNpZ25lZCBieXRlcyBpbiBuYXRpdmUgbWFjaGluZSBvcmRlcgogICAgIC8vIHJldHVybnMgdGhlIGZpcnN0IGJ5dGUgdW5jaGFuZ2VkLCBhbmQgdGhlIGZvbGxvd2luZyA3IGJ5dGVzIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCByZXByZXNlbnRhdGlvbgogICAgIC8vIHdoaWNoIGlzIHRoZSBzYW1lIGFzIGEgMidzIGNvbXBsZW1lbnQgbG9uZyBpbiBuYXRpdmUgZm9ybWF0CkBAIC04MiwxNiArMTIwLDMwIEBACiAgICAgICAgIHJldHVybiBzaWduZWRCeXRlcyBeIDB4MDA4MDgwODA4MDgwODA4MEw7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyB0b3BieXRlKGxvbmcgdG9wYnl0ZSkKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5VmVyc2lvbihsb25nIGhpQml0cykKICAgICB7Ci0gICAgICAgIHJldHVybiB0b3BieXRlIDw8IDU2OworICAgICAgICBsb25nIHZlcnNpb24gPSAoaGlCaXRzID4+PiAxMikgJiAweEY7CisgICAgICAgIGlmICh2ZXJzaW9uICE9IDEpCisgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIFVVSUQgdmVyc2lvbiAlZCBmb3IgdGltZXV1aWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKSk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIHJlb3JkZXJUaW1lc3RhbXBCeXRlcyhsb25nIGlucHV0KQogICAgIHsKLSAgICAgICAgcmV0dXJuICAgIChpbnB1dCA8PCAgNDgpCi0gICAgICAgICAgICAgICAgICB8ICgoaW5wdXQgPDwgIDE2KSAmIDB4RkZGRjAwMDAwMDAwTCkKLSAgICAgICAgICAgICAgICAgIHwgIChpbnB1dCA+Pj4gMzIpOworICAgICAgICByZXR1cm4gKGlucHV0IDw8ICA0OCkKKyAgICAgICAgICAgICAgIHwgKChpbnB1dCA8PCAgMTYpICYgMHhGRkZGMDAwMDAwMDBMKQorICAgICAgICAgICAgICAgfCAgKGlucHV0ID4+PiAzMik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIHJlb3JkZXJCYWNrVGltZXN0YW1wQnl0ZXMobG9uZyBpbnB1dCkKKyAgICB7CisgICAgICAgIC8vIEluIGEgdGltZS1iYXNlZCBVVUlEIHRoZSBoaWdoIGJpdHMgYXJlIHNpZ25pZmljYW50bHkgbW9yZSBzaHVmZmxlZCB0aGFuIGluIG90aGVyIFVVSURzIC0gaWYgW1hdIHJlcHJlc2VudHMgYQorICAgICAgICAvLyAxNi1iaXQgdHVwbGUsIFsxXVsyXVszXVs0XSBzaG91bGQgYmVjb21lIFszXVs0XVsyXVsxXS4KKyAgICAgICAgLy8gU2VlIHRoZSBVVUlEIEphdmFkb2MgKGFuZCBtb3JlIHNwZWNpZmljYWxseSB0aGUgaGlnaCBiaXRzIGxheW91dCBvZiBhIExlYWNoLVNhbHogVVVJRCkgdG8gdW5kZXJzdGFuZCB0aGUKKyAgICAgICAgLy8gcmVhc29uaW5nIGJlaGluZCB0aGlzIGJpdCB0d2lkZGxpbmcgaW4gdGhlIGZpcnN0IHBsYWNlIChpbiB0aGUgY29udGV4dCBvZiBjb21wYXJpc29ucykuCisgICAgICAgIHJldHVybiAoaW5wdXQgPDwgMzIpCisgICAgICAgICAgICAgICB8ICgoaW5wdXQgPj4+IDE2KSAmIDB4RkZGRjAwMDBMKQorICAgICAgICAgICAgICAgfCAoaW5wdXQgPj4+IDQ4KTsKICAgICB9CiAKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0Fic3RyYWN0VHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9BYnN0cmFjdFR5cGUuamF2YQppbmRleCA3NGQ0MDA2Li5iYzNkZDAxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0Fic3RyYWN0VHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQWJzdHJhY3RUeXBlLmphdmEKQEAgLTQwLDYgKzQwLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5UeXBlU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CiBpbXBvcnQgb3JnLmdpdGh1Yi5qYW1tLlVubWV0ZXJlZDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZS5Db21wYXJpc29uVHlwZS5DVVNUT007CkBAIC01NSw2ICs1OCw4IEBACiBAVW5tZXRlcmVkCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUeXBlPFQ+IGltcGxlbWVudHMgQ29tcGFyYXRvcjxCeXRlQnVmZmVyPiwgQXNzaWdubWVudFRlc3RhYmxlCiB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFZBUklBQkxFX0xFTkdUSCA9IC0xOworCiAgICAgcHVibGljIGZpbmFsIENvbXBhcmF0b3I8Qnl0ZUJ1ZmZlcj4gcmV2ZXJzZUNvbXBhcmF0b3I7CiAKICAgICBwdWJsaWMgZW51bSBDb21wYXJpc29uVHlwZQpAQCAtNDQ5LDExICs0NTQsMjggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGUgbGVuZ3RoIG9mIHZhbHVlcyBmb3IgdGhpcyB0eXBlIGlmIGFsbCB2YWx1ZXMgYXJlIG9mIGZpeGVkIGxlbmd0aCwgLTEgb3RoZXJ3aXNlLgorICAgICAqIFRoZSBsZW5ndGggb2YgdmFsdWVzIGZvciB0aGlzIHR5cGUgaWYgYWxsIHZhbHVlcyBhcmUgb2YgZml4ZWQgbGVuZ3RoLCAtMSBvdGhlcndpc2UuIFRoaXMgaGFzIGFuIGltcGFjdCBvbgorICAgICAqIHNlcmlhbGl6YXRpb24uCisgICAgICogPGx1PgorICAgICAqICA8bGk+IHNlZSB7QGxpbmsgI3dyaXRlVmFsdWV9IDwvbGk+CisgICAgICogIDxsaT4gc2VlIHtAbGluayAjcmVhZH0gPC9saT4KKyAgICAgKiAgPGxpPiBzZWUge0BsaW5rICN3cml0dGVuTGVuZ3RofSA8L2xpPgorICAgICAqICA8bGk+IHNlZSB7QGxpbmsgI3NraXBWYWx1ZX0gPC9saT4KKyAgICAgKiA8L2x1PgogICAgICAqLwogICAgIHB1YmxpYyBpbnQgdmFsdWVMZW5ndGhJZkZpeGVkKCkKICAgICB7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIFZBUklBQkxFX0xFTkdUSDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgYWxsIHZhbHVlcyBhcmUgb2YgZml4ZWQgbGVuZ3RoLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgYWxsIHZhbHVlcyBhcmUgb2YgZml4ZWQgbGVuZ3RoLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1ZhbHVlTGVuZ3RoRml4ZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlTGVuZ3RoSWZGaXhlZCgpICE9IFZBUklBQkxFX0xFTkdUSDsKICAgICB9CiAKICAgICAvLyBUaGlzIGFzc3VtZXMgdGhhdCBubyBlbXB0eSB2YWx1ZXMgYXJlIHBhc3NlZApAQCAtNTE4LDcgKzU0MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IucmVhZChpbiwgbGVuZ3RoKTsKICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbCA9IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgaW50IGwgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgICAgIGlmIChsIDwgMCkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvcnJ1cHQgKG5lZ2F0aXZlKSB2YWx1ZSBsZW5ndGggZW5jb3VudGVyZWQiKTsKIApAQCAtNTk5LDYgKzYyMSw2OSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFByb2R1Y2UgYSBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHZhbHVlLCBpLmUuIGEgc2VxdWVuY2Ugb2YgYnl0ZXMgdGhhdCBjb21wYXJlcyB0aGUgc2FtZSB3YXkKKyAgICAgKiB1c2luZyBsZXhpY29ncmFwaGljYWwgdW5zaWduZWQgYnl0ZSBjb21wYXJpc29uIGFzIHRoZSBvcmlnaW5hbCB2YWx1ZSB1c2luZyB0aGUgdHlwZSdzIGNvbXBhcmF0b3IuCisgICAgICoKKyAgICAgKiBXZSB1c2UgYSBzbGlnaHRseSBzdHJvbmdlciByZXF1aXJlbWVudCB0byBiZSBhYmxlIHRvIHVzZSB0aGUgdHlwZXMgaW4gdHVwbGVzLiBQcmVjaXNlbHksIGZvciBhbnkgcGFpciB4LCB5IG9mCisgICAgICogbm9uLWVxdWFsIHZhbGlkIHZhbHVlcyBvZiB0aGlzIHR5cGUgYW5kIGFueSBieXRlcyBiMSwgYjIgYmV0d2VlbiAweDEwIGFuZCAweEVGLAorICAgICAqICgrIHN0YW5kcyBmb3IgY29uY2F0ZW5hdGlvbikKKyAgICAgKiAgIGNvbXBhcmUoeCwgeSkgPT0gY29tcGFyZUxleGljb2dyYXBoaWNhbGx5VW5zaWduZWQoYXNCeXRlQ29tcGFyYWJsZSh4KStiMSwgYXNCeXRlQ29tcGFyYWJsZSh5KStiMikKKyAgICAgKiAoaS5lLiB0aGUgdmFsdWVzIGNvbXBhcmUgbGlrZSB0aGUgb3JpZ2luYWwgdHlwZSwgYW5kIGFuIGFkZGVkIDB4MTAtMHhFRiBieXRlIGF0IHRoZSBlbmQgZG9lcyBub3QgY2hhbmdlIHRoYXQpIGFuZDoKKyAgICAgKiAgIGFzQnl0ZUNvbXBhcmFibGUoeCkrYjEgaXMgbm90IGEgcHJlZml4IG9mIGFzQnl0ZUNvbXBhcmFibGUoeSkgICAgICAod2Vha2x5IHByZWZpeCBmcmVlKQorICAgICAqIChpLmUuIGEgdmFsaWQgcmVwcmVzZW50YXRpb24gb2YgYSB2YWx1ZSBtYXkgYmUgYSBwcmVmaXggb2YgYW5vdGhlciB2YWxpZCByZXByZXNlbnRhdGlvbiBvZiBhIHZhbHVlIG9ubHkgaWYgdGhlCisgICAgICogZm9sbG93aW5nIGJ5dGUgaW4gdGhlIGxhdHRlciBpcyBzbWFsbGVyIHRoYW4gMHgxMCBvciBsYXJnZXIgdGhhbiAweEVGKS4gVGhlc2UgcHJvcGVydGllcyBhcmUgdHJpdmlhbGx5IHRydWUgaWYKKyAgICAgKiB0aGUgZW5jb2RpbmcgY29tcGFyZXMgY29ycmVjdGx5IGFuZCBpcyBwcmVmaXggZnJlZSwgYnV0IGFsc28gcGVybWl0cyBhIGxpdHRsZSBtb3JlIGZyZWVkb20gdGhhdCBlbmFibGVzIHNvbWV3aGF0CisgICAgICogbW9yZSBlZmZpY2llbnQgZW5jb2Rpbmcgb2YgYXJiaXRyYXJ5LWxlbmd0aCBieXRlLWNvbXBhcmFibGUgYmxvYnMuCisgICAgICoKKyAgICAgKiBEZXBlbmRpbmcgb24gdGhlIHR5cGUsIHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgZm9yIG51bGwgb3IgZW1wdHkgaW5wdXQsIGluIHdoaWNoIGNhc2UgdGhlIG91dHB1dCBpcyBhbGxvd2VkIHRvCisgICAgICogYmUgbnVsbCAodGhlIGNsdXN0ZXJpbmcvdHVwbGUgZW5jb2Rpbmcgd2lsbCBhY2NlcHQgYW5kIGhhbmRsZSBpdCkuCisgICAgICovCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgdmFsdWUsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGlmIChpc0J5dGVPcmRlckNvbXBhcmFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdoZW4gYSB0eXBlIGlzIGJ5dGUtb3JkZXJlZCBvbiBpdHMgb3duLCB3ZSBvbmx5IG5lZWQgdG8gZXNjYXBlIGl0LCBzbyB0aGF0IHdlIGNhbiBpbmNsdWRlIGl0IGluCisgICAgICAgICAgICAvLyBtdWx0aS1jb21wb25lbnQgdHlwZXMgYW5kIG1ha2UgdGhlIGVuY29kaW5nIHdlYWtseS1wcmVmaXgtZnJlZS4KKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9mKGFjY2Vzc29yLCB2YWx1ZSwgdmVyc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLy8gZGVmYXVsdCBpcyBvbmx5IGdvb2QgZm9yIGJ5dGUtY29tcGFyYWJsZXMKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgZG9lcyBub3QgaW1wbGVtZW50IGFzQ29tcGFyYWJsZUJ5dGVzIik7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoQnl0ZUJ1ZmZlciBieXRlQnVmZmVyLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gYXNDb21wYXJhYmxlQnl0ZXMoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBieXRlQnVmZmVyLCB2ZXJzaW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGVzIHRoZSBnaXZlbiBieXRlLW9yZGVyZWQgcmVwcmVzZW50YXRpb24gdG8gdGhlIGNvbW1vbiwgbm9uLWJ5dGUtb3JkZXJlZCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgYQorICAgICAqIHBheWxvYWQgZm9yIHRoaXMgYWJzdHJhY3QgdHlwZSAodGhlIGxhdHRlciwgY29tbW9uIGJpbmFyeSByZXByZXNlbnRhdGlvbiBpcyB3aGF0IHdlIG1vc3RseSB3b3JrIHdpdGggaW4gdGhlCisgICAgICogc3RvcmFnZSBlbmdpbmUgaW50ZXJuYWxzKS4gSWYgdGhlIGdpdmVuIGJ5dGVzIGRvbid0IGNvcnJlc3BvbmQgdG8gdGhlIGVuY29kaW5nIG9mIHNvbWUgcGF5bG9hZCB2YWx1ZSBmb3IgdGhpcworICAgICAqIGFic3RyYWN0IHR5cGUsIGFuIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IG1heSBiZSB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzb3IgdmFsdWUgYWNjZXNzb3IgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIHZhbHVlLgorICAgICAqIEBwYXJhbSBjb21wYXJhYmxlQnl0ZXMgQSBieXRlLW9yZGVyZWQgcmVwcmVzZW50YXRpb24gKHByZXN1bWFibHkgb2YgYSBwYXlsb2FkIGZvciB0aGlzIGFic3RyYWN0IHR5cGUpLgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBieXRlLWNvbXBhcmFibGUgdmVyc2lvbiB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgcmVwcmVzZW50YXRpb24uCisgICAgICogQHJldHVybiBBIG9mIGEgcGF5bG9hZCBmb3IgdGhpcyBhYnN0cmFjdCB0eXBlLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBieXRlLW9yZGVyZWQgcmVwcmVzZW50YXRpb24sCisgICAgICogICAgICAgICBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgc3VwcGxpZWQgdmFsdWUgYWNjZXNzb3IuCisgICAgICoKKyAgICAgKiBAc2VlICNhc0NvbXBhcmFibGVCeXRlcworICAgICAqLworICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICBpZiAoaXNCeXRlT3JkZXJDb21wYXJhYmxlKQorICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLnZhbHVlT2YoQnl0ZVNvdXJjZUludmVyc2UuZ2V0VW5lc2NhcGVkQnl0ZXMoY29tcGFyYWJsZUJ5dGVzKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgZG9lcyBub3QgaW1wbGVtZW50IGZyb21Db21wYXJhYmxlQnl0ZXMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmluYWwgQnl0ZUJ1ZmZlciBmcm9tQ29tcGFyYWJsZUJ5dGVzKEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gZnJvbUNvbXBhcmFibGVCeXRlcyhCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGNvbXBhcmFibGVCeXRlcywgdmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCiAgICAgICogVGhpcyBtdXN0IGJlIG92ZXJyaWRlbiBieSBzdWJjbGFzc2VzIGlmIG5lY2Vzc2FyeSBzbyB0aGF0IGZvciBhbnkKICAgICAgKiBBYnN0cmFjdFR5cGUsIHRoaXMgPT0gVHlwZVBhcnNlci5wYXJzZSh0b1N0cmluZygpKS4KICAgICAgKgpAQCAtNjI0LDQgKzcwOSwxOCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIHRlc3RBc3NpZ25tZW50KHJlY2VpdmVyLnR5cGUpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0Q29tcGF0aWJsZVR5cGVJZktub3duKFN0cmluZyBrZXlzcGFjZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gQSBmaXhlZCwgc2VyaWFsaXplZCB2YWx1ZSB0byBiZSB1c2VkIHdoZW4gdGhlIGNvbHVtbiBpcyBtYXNrZWQsIHRvIGJlIHJldHVybmVkIGluc3RlYWQgb2YgdGhlIHJlYWwgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGVyZSBpc24ndCBhIGRlZmluZWQgbWFza2VkIHZhbHVlIGZvciB0eXBlICIgKyBhc0NRTDNUeXBlKCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQXNjaWlUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0FzY2lpVHlwZS5qYXZhCmluZGV4IDJkNzhjMWEuLmFjNTg1YTIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQXNjaWlUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Bc2NpaVR5cGUuamF2YQpAQCAtMjUsNyArMjUsNiBAQAogCiBpbXBvcnQgaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZhc3RUaHJlYWRMb2NhbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkpzb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVGVybTsKQEAgLTM0LDEwICszMywxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLkFzY2lpU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKIAogcHVibGljIGNsYXNzIEFzY2lpVHlwZSBleHRlbmRzIFN0cmluZ1R5cGUKIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFzY2lpVHlwZSBpbnN0YW5jZSA9IG5ldyBBc2NpaVR5cGUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZSgiKioqKiIpOwogCiAgICAgQXNjaWlUeXBlKCkge3N1cGVyKENvbXBhcmlzb25UeXBlLkJZVEVfT1JERVIpO30gLy8gc2luZ2xldG9uCiAKQEAgLTg1LDcgKzg2LDcgQEAKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gJyInICsgSnNvbi5xdW90ZUFzSnNvblN0cmluZyhCeXRlQnVmZmVyVXRpbC5zdHJpbmcoYnVmZmVyLCBTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSkgKyAnIic7CisgICAgICAgICAgICByZXR1cm4gJyInICsgSnNvblV0aWxzLnF1b3RlQXNKc29uU3RyaW5nKEJ5dGVCdWZmZXJVdGlsLnN0cmluZyhidWZmZXIsIFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkpKSArICciJzsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIGV4YykKICAgICAgICAgewpAQCAtMTAyLDQgKzEwMywxMCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIEFzY2lpU2VyaWFsaXplci5pbnN0YW5jZTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gTUFTS0VEX1ZBTFVFOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQm9vbGVhblR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQm9vbGVhblR5cGUuamF2YQppbmRleCA0ZWY1Zjk1Li45OWEyZGExIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0Jvb2xlYW5UeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Cb29sZWFuVHlwZS5qYXZhCkBAIC0yNiwxNiArMjYsMTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5Cb29sZWFuU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247Ci0KLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CiAKIHB1YmxpYyBjbGFzcyBCb29sZWFuVHlwZSBleHRlbmRzIEFic3RyYWN0VHlwZTxCb29sZWFuPgogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihCb29sZWFuVHlwZS5jbGFzcyk7Ci0KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW5UeXBlIGluc3RhbmNlID0gbmV3IEJvb2xlYW5UeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZShmYWxzZSk7CisKICAgICBCb29sZWFuVHlwZSgpIHtzdXBlcihDb21wYXJpc29uVHlwZS5DVVNUT00pO30gLy8gc2luZ2xldG9uCiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5VmFsdWVNZWFuaW5nbGVzcygpCkBAIC01NCw2ICs1MywyNiBAQAogICAgICAgICByZXR1cm4gdjEgLSB2MjsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICBpZiAoYWNjZXNzb3IuaXNFbXB0eShkYXRhKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBieXRlIGIgPSBhY2Nlc3Nvci50b0J5dGUoZGF0YSk7CisgICAgICAgIGlmIChiICE9IDApCisgICAgICAgICAgICBiID0gMTsKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uub25lQnl0ZShiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaWYgKGNvbXBhcmFibGVCeXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmVtcHR5KCk7CisgICAgICAgIGludCBiID0gY29tcGFyYWJsZUJ5dGVzLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIGFjY2Vzc29yLnZhbHVlT2YoYiA9PSAxKTsKKyAgICB9CisKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogCkBAIC05OSw0ICsxMTgsMTAgQEAKICAgICB7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9CeXRlQXJyYXlBY2Nlc3Nvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9CeXRlQXJyYXlBY2Nlc3Nvci5qYXZhCmluZGV4IGRmMjRhNjIuLmQ3MTA4OTkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZUFycmF5QWNjZXNzb3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVBcnJheUFjY2Vzc29yLmphdmEKQEAgLTI0OSw2ICsyNDksMTMgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHB1dEJ5dGUoYnl0ZVtdIGRzdCwgaW50IG9mZnNldCwgYnl0ZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGRzdFtvZmZzZXRdID0gdmFsdWU7CisgICAgICAgIHJldHVybiBUeXBlU2l6ZXMuQllURV9TSVpFOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgcHV0U2hvcnQoYnl0ZVtdIGRzdCwgaW50IG9mZnNldCwgc2hvcnQgdmFsdWUpCiAgICAgewogICAgICAgICBCeXRlQXJyYXlVdGlsLnB1dFNob3J0KGRzdCwgb2Zmc2V0LCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVBcnJheU9iamVjdEZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZUFycmF5T2JqZWN0RmFjdG9yeS5qYXZhCmluZGV4IGVhOWJmMTEuLmVkMWU2YTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZUFycmF5T2JqZWN0RmFjdG9yeS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZUFycmF5T2JqZWN0RmFjdG9yeS5qYXZhCkBAIC0xOCwxMyArMTgsNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWw7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5BcnJheUNsdXN0ZXJpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQXJyYXlDbHVzdGVyaW5nQm91bmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQXJyYXlDbHVzdGVyaW5nQm91bmRhcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQm91bmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdQcmVmaXg7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkFycmF5Q2VsbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsUGF0aDsKQEAgLTMzLDcgKzI3LDcgQEAKIAogY2xhc3MgQnl0ZUFycmF5T2JqZWN0RmFjdG9yeSBpbXBsZW1lbnRzIFZhbHVlQWNjZXNzb3IuT2JqZWN0RmFjdG9yeTxieXRlW10+CiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2x1c3RlcmluZzxieXRlW10+IEVNUFRZX0NMVVNURVJJTkcgPSBuZXcgQXJyYXlDbHVzdGVyaW5nKCkKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbHVzdGVyaW5nPGJ5dGVbXT4gRU1QVFlfQ0xVU1RFUklORyA9IG5ldyBBcnJheUNsdXN0ZXJpbmcoQWJzdHJhY3RBcnJheUNsdXN0ZXJpbmdQcmVmaXguRU1QVFlfVkFMVUVTX0FSUkFZKQogICAgIHsKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKQogICAgICAgICB7CkBAIC00MSwxNCArMzUsNDQgQEAKICAgICAgICAgfQogICAgIH07CiAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmc8Ynl0ZVtdPiBTVEFUSUNfQ0xVU1RFUklORyA9IG5ldyBBcnJheUNsdXN0ZXJpbmcoQWJzdHJhY3RBcnJheUNsdXN0ZXJpbmdQcmVmaXguRU1QVFlfVkFMVUVTX0FSUkFZKQorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBLaW5kIGtpbmQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gS2luZC5TVEFUSUNfQ0xVU1RFUklORzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJTVEFUSUMiOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9OworCiAgICAgc3RhdGljIGZpbmFsIFZhbHVlQWNjZXNzb3IuT2JqZWN0RmFjdG9yeTxieXRlW10+IGluc3RhbmNlID0gbmV3IEJ5dGVBcnJheU9iamVjdEZhY3RvcnkoKTsKIAogICAgIHByaXZhdGUgQnl0ZUFycmF5T2JqZWN0RmFjdG9yeSgpIHt9CiAKICAgICAvKiogVGhlIHNtYWxsZXN0IHN0YXJ0IGJvdW5kLCBpLmUuIHRoZSBvbmUgdGhhdCBzdGFydHMgYmVmb3JlIGFueSByb3cuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlDbHVzdGVyaW5nQm91bmQgQk9UVE9NX0JPVU5EID0gbmV3IEFycmF5Q2x1c3RlcmluZ0JvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX1NUQVJUX0JPVU5ELCBuZXcgYnl0ZVswXVtdKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUNsdXN0ZXJpbmdCb3VuZCBCT1RUT01fQk9VTkQgPSBuZXcgQXJyYXlDbHVzdGVyaW5nQm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfU1RBUlRfQk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0QXJyYXlDbHVzdGVyaW5nUHJlZml4LkVNUFRZX1ZBTFVFU19BUlJBWSk7CiAgICAgLyoqIFRoZSBiaWdnZXN0IGVuZCBib3VuZCwgaS5lLiB0aGUgb25lIHRoYXQgZW5kcyBhZnRlciBhbnkgcm93LiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5Q2x1c3RlcmluZ0JvdW5kIFRPUF9CT1VORCA9IG5ldyBBcnJheUNsdXN0ZXJpbmdCb3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9FTkRfQk9VTkQsIG5ldyBieXRlWzBdW10pOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5Q2x1c3RlcmluZ0JvdW5kIFRPUF9CT1VORCA9IG5ldyBBcnJheUNsdXN0ZXJpbmdCb3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9FTkRfQk9VTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0QXJyYXlDbHVzdGVyaW5nUHJlZml4LkVNUFRZX1ZBTFVFU19BUlJBWSk7CisKKyAgICAvKiogVGhlIGJpZ2dlc3Qgc3RhcnQgYm91bmQsIGkuZS4gdGhlIG9uZSB0aGF0IHN0YXJ0cyBhZnRlciBhbnkgcm93LiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5Q2x1c3RlcmluZ0JvdW5kIE1BWF9TVEFSVF9CT1VORCA9IG5ldyBBcnJheUNsdXN0ZXJpbmdCb3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQuRVhDTF9TVEFSVF9CT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RBcnJheUNsdXN0ZXJpbmdQcmVmaXguRU1QVFlfVkFMVUVTX0FSUkFZKTsKKyAgICAvKiogVGhlIHNtYWxsZXN0IGVuZCBib3VuZCwgaS5lLiB0aGUgb25lIHRoYXQgZW5kIGJlZm9yZSBhbnkgcm93LiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5Q2x1c3RlcmluZ0JvdW5kIE1JTl9FTkRfQk9VTkQgPSBuZXcgQXJyYXlDbHVzdGVyaW5nQm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkVYQ0xfRU5EX0JPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdEFycmF5Q2x1c3RlcmluZ1ByZWZpeC5FTVBUWV9WQUxVRVNfQVJSQVkpOwogCiAgICAgcHVibGljIENlbGw8Ynl0ZVtdPiBjZWxsKENvbHVtbk1ldGFkYXRhIGNvbHVtbiwgbG9uZyB0aW1lc3RhbXAsIGludCB0dGwsIGludCBsb2NhbERlbGV0aW9uVGltZSwgYnl0ZVtdIHZhbHVlLCBDZWxsUGF0aCBwYXRoKQogICAgIHsKQEAgLTY1LDYgKzg5LDExIEBACiAgICAgICAgIHJldHVybiBFTVBUWV9DTFVTVEVSSU5HOwogICAgIH0KIAorICAgIHB1YmxpYyBDbHVzdGVyaW5nPGJ5dGVbXT4gc3RhdGljQ2x1c3RlcmluZygpCisgICAgeworICAgICAgICByZXR1cm4gU1RBVElDX0NMVVNURVJJTkc7CisgICAgfQorCiAgICAgcHVibGljIENsdXN0ZXJpbmdCb3VuZDxieXRlW10+IGJvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZCBraW5kLCBieXRlW10uLi4gdmFsdWVzKQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUNsdXN0ZXJpbmdCb3VuZChraW5kLCB2YWx1ZXMpOwpAQCAtNzIsMTEgKzEwMSwxOSBAQAogCiAgICAgcHVibGljIENsdXN0ZXJpbmdCb3VuZDxieXRlW10+IGJvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZCBraW5kKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGtpbmQuaXNTdGFydCgpID8gQk9UVE9NX0JPVU5EIDogVE9QX0JPVU5EOworICAgICAgICBzd2l0Y2ggKGtpbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgRVhDTF9FTkRfQk9VTkQ6IHJldHVybiBNSU5fRU5EX0JPVU5EOworICAgICAgICAgICAgY2FzZSBJTkNMX1NUQVJUX0JPVU5EOiByZXR1cm4gQk9UVE9NX0JPVU5EOworICAgICAgICAgICAgY2FzZSBJTkNMX0VORF9CT1VORDogcmV0dXJuIFRPUF9CT1VORDsKKyAgICAgICAgICAgIGNhc2UgRVhDTF9TVEFSVF9CT1VORDogcmV0dXJuIE1BWF9TVEFSVF9CT1VORDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFN0cmluZy5mb3JtYXQoIlVuZXhwZWN0ZWQga2luZCAlcyBmb3IgZW1wdHkgYm91bmQgb3IgYm91bmRhcnkiLCBraW5kKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgQ2x1c3RlcmluZ0JvdW5kYXJ5PGJ5dGVbXT4gYm91bmRhcnkoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGtpbmQsIGJ5dGVbXS4uLiB2YWx1ZXMpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IEFycmF5Q2x1c3RlcmluZ0JvdW5kYXJ5KGtpbmQsIHZhbHVlcyk7CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZUJ1ZmZlckFjY2Vzc29yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVCdWZmZXJBY2Nlc3Nvci5qYXZhCmluZGV4IDQwYTNiZjQuLjA3MTI5MzAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZUJ1ZmZlckFjY2Vzc29yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9CeXRlQnVmZmVyQWNjZXNzb3IuamF2YQpAQCAtMjUzLDYgKzI1MywxMyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcHV0Qnl0ZShCeXRlQnVmZmVyIGRzdCwgaW50IG9mZnNldCwgYnl0ZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGRzdC5wdXQoZHN0LnBvc2l0aW9uKCkgKyBvZmZzZXQsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFR5cGVTaXplcy5CWVRFX1NJWkU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBwdXRTaG9ydChCeXRlQnVmZmVyIGRzdCwgaW50IG9mZnNldCwgc2hvcnQgdmFsdWUpCiAgICAgewogICAgICAgICBkc3QucHV0U2hvcnQoZHN0LnBvc2l0aW9uKCkgKyBvZmZzZXQsIHZhbHVlKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZUJ1ZmZlck9iamVjdEZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZUJ1ZmZlck9iamVjdEZhY3RvcnkuamF2YQppbmRleCAwMGY0NjQ2Li44MmViYTM3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVCdWZmZXJPYmplY3RGYWN0b3J5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9CeXRlQnVmZmVyT2JqZWN0RmFjdG9yeS5qYXZhCkBAIC0yMCwzNSArMjAsMjcgQEAKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5CdWZmZXJDbHVzdGVyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkJ1ZmZlckNsdXN0ZXJpbmdCb3VuZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5CdWZmZXJDbHVzdGVyaW5nQm91bmRhcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQm91bmQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdQcmVmaXg7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJ1ZmZlckNlbGw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbFBhdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogCiBjbGFzcyBCeXRlQnVmZmVyT2JqZWN0RmFjdG9yeSBpbXBsZW1lbnRzIFZhbHVlQWNjZXNzb3IuT2JqZWN0RmFjdG9yeTxCeXRlQnVmZmVyPgogewotICAgIC8qKiBFbXB0eSBjbHVzdGVyaW5nIGZvciB0YWJsZXMgaGF2aW5nIG5vIGNsdXN0ZXJpbmcgY29sdW1ucy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbHVzdGVyaW5nPEJ5dGVCdWZmZXI+IEVNUFRZX0NMVVNURVJJTkcgPSBuZXcgQnVmZmVyQ2x1c3RlcmluZygpCi0gICAgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIkVNUFRZIjsKLSAgICAgICAgfQotICAgIH07Ci0KICAgICAvKiogVGhlIHNtYWxsZXN0IHN0YXJ0IGJvdW5kLCBpLmUuIHRoZSBvbmUgdGhhdCBzdGFydHMgYmVmb3JlIGFueSByb3cuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kIEJPVFRPTV9CT1VORCA9IG5ldyBCdWZmZXJDbHVzdGVyaW5nQm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfU1RBUlRfQk9VTkQsIG5ldyBCeXRlQnVmZmVyWzBdKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCdWZmZXJDbHVzdGVyaW5nQm91bmQgQk9UVE9NX0JPVU5EID0gbmV3IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9TVEFSVF9CT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdEJ1ZmZlckNsdXN0ZXJpbmdQcmVmaXguRU1QVFlfVkFMVUVTX0FSUkFZKTsKICAgICAvKiogVGhlIGJpZ2dlc3QgZW5kIGJvdW5kLCBpLmUuIHRoZSBvbmUgdGhhdCBlbmRzIGFmdGVyIGFueSByb3cuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kIFRPUF9CT1VORCA9IG5ldyBCdWZmZXJDbHVzdGVyaW5nQm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfRU5EX0JPVU5ELCBuZXcgQnl0ZUJ1ZmZlclswXSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kIFRPUF9CT1VORCA9IG5ldyBCdWZmZXJDbHVzdGVyaW5nQm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfRU5EX0JPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0QnVmZmVyQ2x1c3RlcmluZ1ByZWZpeC5FTVBUWV9WQUxVRVNfQVJSQVkpOworCisgICAgLyoqIFRoZSBiaWdnZXN0IHN0YXJ0IGJvdW5kLCBpLmUuIHRoZSBvbmUgdGhhdCBzdGFydHMgYWZ0ZXIgYW55IHJvdy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCdWZmZXJDbHVzdGVyaW5nQm91bmQgTUFYX1NUQVJUX0JPVU5EID0gbmV3IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQuRVhDTF9TVEFSVF9CT1VORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RCdWZmZXJDbHVzdGVyaW5nUHJlZml4LkVNUFRZX1ZBTFVFU19BUlJBWSk7CisgICAgLyoqIFRoZSBzbWFsbGVzdCBlbmQgYm91bmQsIGkuZS4gdGhlIG9uZSB0aGF0IGVuZCBiZWZvcmUgYW55IHJvdy4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCdWZmZXJDbHVzdGVyaW5nQm91bmQgTUlOX0VORF9CT1VORCA9IG5ldyBCdWZmZXJDbHVzdGVyaW5nQm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkVYQ0xfRU5EX0JPVU5ELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RCdWZmZXJDbHVzdGVyaW5nUHJlZml4LkVNUFRZX1ZBTFVFU19BUlJBWSk7CiAKICAgICBzdGF0aWMgZmluYWwgVmFsdWVBY2Nlc3Nvci5PYmplY3RGYWN0b3J5PEJ5dGVCdWZmZXI+IGluc3RhbmNlID0gbmV3IEJ5dGVCdWZmZXJPYmplY3RGYWN0b3J5KCk7CiAKQEAgLTY2LDcgKzU4LDEyIEBACiAKICAgICBwdWJsaWMgQ2x1c3RlcmluZzxCeXRlQnVmZmVyPiBjbHVzdGVyaW5nKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBFTVBUWV9DTFVTVEVSSU5HOworICAgICAgICByZXR1cm4gQ2x1c3RlcmluZy5FTVBUWTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2x1c3RlcmluZzxCeXRlQnVmZmVyPiBzdGF0aWNDbHVzdGVyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDbHVzdGVyaW5nLlNUQVRJQ19DTFVTVEVSSU5HOwogICAgIH0KIAogICAgIHB1YmxpYyBDbHVzdGVyaW5nQm91bmQ8Qnl0ZUJ1ZmZlcj4gYm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGtpbmQsIEJ5dGVCdWZmZXIuLi4gdmFsdWVzKQpAQCAtNzYsMTEgKzczLDE5IEBACiAKICAgICBwdWJsaWMgQ2x1c3RlcmluZ0JvdW5kPEJ5dGVCdWZmZXI+IGJvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZCBraW5kKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGtpbmQuaXNTdGFydCgpID8gQk9UVE9NX0JPVU5EIDogVE9QX0JPVU5EOworICAgICAgICBzd2l0Y2ggKGtpbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgRVhDTF9FTkRfQk9VTkQ6IHJldHVybiBNSU5fRU5EX0JPVU5EOworICAgICAgICAgICAgY2FzZSBJTkNMX1NUQVJUX0JPVU5EOiByZXR1cm4gQk9UVE9NX0JPVU5EOworICAgICAgICAgICAgY2FzZSBJTkNMX0VORF9CT1VORDogcmV0dXJuIFRPUF9CT1VORDsKKyAgICAgICAgICAgIGNhc2UgRVhDTF9TVEFSVF9CT1VORDogcmV0dXJuIE1BWF9TVEFSVF9CT1VORDsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFN0cmluZy5mb3JtYXQoIlVuZXhwZWN0ZWQga2luZCAlcyBmb3IgZW1wdHkgYm91bmQgb3IgYm91bmRhcnkiLCBraW5kKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgQ2x1c3RlcmluZ0JvdW5kYXJ5PEJ5dGVCdWZmZXI+IGJvdW5kYXJ5KENsdXN0ZXJpbmdQcmVmaXguS2luZCBraW5kLCBCeXRlQnVmZmVyLi4uIHZhbHVlcykKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgQnVmZmVyQ2x1c3RlcmluZ0JvdW5kYXJ5KGtpbmQsIHZhbHVlcyk7CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZVR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZVR5cGUuamF2YQppbmRleCBmOTRmNGJiLi41YWE4ODgwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9CeXRlVHlwZS5qYXZhCkBAIC0yNywxMSArMjcsMTcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5UeXBlU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlLlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIAogcHVibGljIGNsYXNzIEJ5dGVUeXBlIGV4dGVuZHMgTnVtYmVyVHlwZTxCeXRlPgogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQnl0ZVR5cGUgaW5zdGFuY2UgPSBuZXcgQnl0ZVR5cGUoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gaW5zdGFuY2UuZGVjb21wb3NlKChieXRlKSAwKTsKKwogICAgIEJ5dGVUeXBlKCkKICAgICB7CiAgICAgICAgIHN1cGVyKENvbXBhcmlzb25UeXBlLkNVU1RPTSk7CkBAIC00Miw2ICs0OCwxOSBAQAogICAgICAgICByZXR1cm4gYWNjZXNzb3JMLmdldEJ5dGUobGVmdCwgMCkgLSBhY2Nlc3NvclIuZ2V0Qnl0ZShyaWdodCwgMCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgLy8gVGhpcyB0eXBlIGRvZXMgbm90IGFsbG93IG5vbi1wcmVzZW50IHZhbHVlcywgYnV0IHdlIGRvIGp1c3QgdG8gYXZvaWQgZnV0dXJlIGNvbXBsZXhpdHkuCisgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9wdGlvbmFsU2lnbmVkRml4ZWRMZW5ndGhOdW1iZXIoYWNjZXNzb3IsIGRhdGEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZUludmVyc2UuZ2V0T3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aChhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCAxKTsKKyAgICB9CisKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgICAvLyBSZXR1cm4gYW4gZW1wdHkgQnl0ZUJ1ZmZlciBmb3IgYW4gZW1wdHkgc3RyaW5nLgpAQCAtMTM2LDQgKzE1NSw0MCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChieXRlKSAtdG9CeXRlKGlucHV0KSk7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgYWJzKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGJ5dGUpIE1hdGguYWJzKHRvQnl0ZShpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleHAoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygoYnl0ZSkgTWF0aC5leHAodG9CeXRlKGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGxvZyhCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChieXRlKSBNYXRoLmxvZyh0b0J5dGUoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgbG9nMTAoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygoYnl0ZSkgTWF0aC5sb2cxMCh0b0J5dGUoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgcm91bmQoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5jbG9uZShpbnB1dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVzVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9CeXRlc1R5cGUuamF2YQppbmRleCBjYWJkMDA3Li41ZTc0MmU3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0J5dGVzVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQnl0ZXNUeXBlLmphdmEKQEAgLTMzLDYgKzMzLDggQEAKIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJ5dGVzVHlwZSBpbnN0YW5jZSA9IG5ldyBCeXRlc1R5cGUoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVI7CisKICAgICBCeXRlc1R5cGUoKSB7c3VwZXIoQ29tcGFyaXNvblR5cGUuQllURV9PUkRFUik7fSAvLyBzaW5nbGV0b24KIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGZyb21TdHJpbmcoU3RyaW5nIHNvdXJjZSkKQEAgLTk0LDQgKzk2LDEwIEBACiAgICAgewogICAgICAgICByZXR1cm4gQnl0ZXNTZXJpYWxpemVyLmluc3RhbmNlOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Db2xsZWN0aW9uVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Db2xsZWN0aW9uVHlwZS5qYXZhCmluZGV4IGM1MmNkZGMuLmU0MzQ2ZDUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQ29sbGVjdGlvblR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0NvbGxlY3Rpb25UeXBlLmphdmEKQEAgLTE5LDE0ICsxOSwxNyBAQAogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5TcGVjaWZpY2F0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuTGlzdHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5NYXBzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuU2V0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbFBhdGg7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwpAQCAtMzUsNiArMzgsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogCiAvKioKICAqIFRoZSBhYnN0cmFjdCB2YWxpZGF0b3IgdGhhdCBpcyB0aGUgYmFzZSBmb3IgbWFwcywgc2V0cyBhbmQgbGlzdHMgKGJvdGggZnJvemVuIGFuZCBub24tZnJvemVuKS4KQEAgLTE0NiwxMiArMTUyLDEyIEBACiAgICAgICAgIHJldHVybiB2YWx1ZXMuc2l6ZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBCeXRlQnVmZmVyIHNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKEl0ZXJhdG9yPENlbGw8Pz4+IGNlbGxzLCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBzZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChJdGVyYXRvcjxDZWxsPD8+PiBjZWxscykKICAgICB7CiAgICAgICAgIGFzc2VydCBpc011bHRpQ2VsbCgpOwogICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlcyA9IHNlcmlhbGl6ZWRWYWx1ZXMoY2VsbHMpOwogICAgICAgICBpbnQgc2l6ZSA9IGNvbGxlY3Rpb25TaXplKHZhbHVlcyk7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKHZhbHVlcywgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBzaXplLCB2ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2sodmFsdWVzLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHNpemUpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTYzLDcgKzE2OSw3IEBACiAgICAgICAgIGlmICghZ2V0Q2xhc3MoKS5lcXVhbHMocHJldmlvdXMuZ2V0Q2xhc3MoKSkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgQ29sbGVjdGlvblR5cGUgdHByZXYgPSAoQ29sbGVjdGlvblR5cGUpIHByZXZpb3VzOworICAgICAgICBDb2xsZWN0aW9uVHlwZTw/PiB0cHJldiA9IChDb2xsZWN0aW9uVHlwZTw/PikgcHJldmlvdXM7CiAgICAgICAgIGlmICh0aGlzLmlzTXVsdGlDZWxsKCkgIT0gdHByZXYuaXNNdWx0aUNlbGwoKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIApAQCAtMTkxLDcgKzE5Nyw3IEBACiAgICAgICAgIGlmICghZ2V0Q2xhc3MoKS5lcXVhbHMocHJldmlvdXMuZ2V0Q2xhc3MoKSkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgQ29sbGVjdGlvblR5cGUgdHByZXYgPSAoQ29sbGVjdGlvblR5cGUpIHByZXZpb3VzOworICAgICAgICBDb2xsZWN0aW9uVHlwZTw/PiB0cHJldiA9IChDb2xsZWN0aW9uVHlwZTw/PikgcHJldmlvdXM7CiAgICAgICAgIGlmICh0aGlzLmlzTXVsdGlDZWxsKCkgIT0gdHByZXYuaXNNdWx0aUNlbGwoKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIApAQCAtMjI4LDcgKzIzNCw3IEBACiAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb2xsZWN0aW9uVHlwZSkpCiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgQ29sbGVjdGlvblR5cGUgb3RoZXIgPSAoQ29sbGVjdGlvblR5cGUpbzsKKyAgICAgICAgQ29sbGVjdGlvblR5cGU8Pz4gb3RoZXIgPSAoQ29sbGVjdGlvblR5cGU8Pz4pIG87CiAKICAgICAgICAgaWYgKGtpbmQgIT0gb3RoZXIua2luZCkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTI0NSw2ICsyNTEsOTEgQEAKICAgICAgICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoZmFsc2UpOwogICAgIH0KIAorICAgIHN0YXRpYyA8VkwsIFZSPiBpbnQgY29tcGFyZUxpc3RPclNldChBYnN0cmFjdFR5cGU8Pz4gZWxlbWVudHNDb21wYXJhdG9yLCBWTCBsZWZ0LCBWYWx1ZUFjY2Vzc29yPFZMPiBhY2Nlc3NvckwsIFZSIHJpZ2h0LCBWYWx1ZUFjY2Vzc29yPFZSPiBhY2Nlc3NvclIpCisgICAgeworICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHVzZWQgaWYgdGhlIGNvbGxlY3Rpb24gaXMgZnJvemVuCisgICAgICAgIGlmIChhY2Nlc3NvckwuaXNFbXB0eShsZWZ0KSB8fCBhY2Nlc3NvclIuaXNFbXB0eShyaWdodCkpCisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5jb21wYXJlKGFjY2Vzc29yUi5pc0VtcHR5KHJpZ2h0KSwgYWNjZXNzb3JMLmlzRW1wdHkobGVmdCkpOworCisgICAgICAgIGludCBzaXplTCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRDb2xsZWN0aW9uU2l6ZShsZWZ0LCBhY2Nlc3NvckwpOworICAgICAgICBpbnQgb2Zmc2V0TCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZkNvbGxlY3Rpb25TaXplKCk7CisgICAgICAgIGludCBzaXplUiA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRDb2xsZWN0aW9uU2l6ZShyaWdodCwgYWNjZXNzb3JSKTsKKyAgICAgICAgaW50IG9mZnNldFIgPSBUeXBlU2l6ZXMuSU5UX1NJWkU7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNYXRoLm1pbihzaXplTCwgc2l6ZVIpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFZMIHYxID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKGxlZnQsIGFjY2Vzc29yTCwgb2Zmc2V0TCk7CisgICAgICAgICAgICBvZmZzZXRMICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKHYxLCBhY2Nlc3NvckwpOworICAgICAgICAgICAgVlIgdjIgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUocmlnaHQsIGFjY2Vzc29yUiwgb2Zmc2V0Uik7CisgICAgICAgICAgICBvZmZzZXRSICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKHYyLCBhY2Nlc3NvclIpOworICAgICAgICAgICAgaW50IGNtcCA9IGVsZW1lbnRzQ29tcGFyYXRvci5jb21wYXJlKHYxLCBhY2Nlc3NvckwsIHYyLCBhY2Nlc3NvclIpOworICAgICAgICAgICAgaWYgKGNtcCAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBjbXA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gSW50ZWdlci5jb21wYXJlKHNpemVMLCBzaXplUik7CisgICAgfQorCisgICAgc3RhdGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzTGlzdE9yU2V0KEFic3RyYWN0VHlwZTw/PiBlbGVtZW50c0NvbXBhcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaWYgKGFjY2Vzc29yLmlzRW1wdHkoZGF0YSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAgaW50IHNpemUgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkQ29sbGVjdGlvblNpemUoZGF0YSwgYWNjZXNzb3IpOworICAgICAgICBvZmZzZXQgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mQ29sbGVjdGlvblNpemUoKTsKKyAgICAgICAgQnl0ZVNvdXJjZVtdIHNyY3MgPSBuZXcgQnl0ZVNvdXJjZVtzaXplXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIFYgdiA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShkYXRhLCBhY2Nlc3Nvciwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZSh2LCBhY2Nlc3Nvcik7CisgICAgICAgICAgICBzcmNzW2ldID0gZWxlbWVudHNDb21wYXJhdG9yLmFzQ29tcGFyYWJsZUJ5dGVzKGFjY2Vzc29yLCB2LCB2ZXJzaW9uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvck1heWJlTGVnYWN5KHZlcnNpb24sIDB4MDAsIHNyY3MpOworICAgIH0KKworICAgIHN0YXRpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzTGlzdE9yU2V0KFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBlbGVtZW50VHlwZSkKKyAgICB7CisgICAgICAgIGlmIChjb21wYXJhYmxlQnl0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5lbXB0eSgpOworICAgICAgICBhc3NlcnQgdmVyc2lvbiAhPSBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLkxFR0FDWTsgLy8gbGVnYWN5IHRyYW5zbGF0aW9uIGlzIG5vdCByZXZlcnNpYmxlCisKKyAgICAgICAgTGlzdDxWPiBidWZmZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGludCBzZXBhcmF0b3IgPSBjb21wYXJhYmxlQnl0ZXMubmV4dCgpOworICAgICAgICB3aGlsZSAoc2VwYXJhdG9yICE9IEJ5dGVTb3VyY2UuVEVSTUlOQVRPUikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50TnVsbChzZXBhcmF0b3IpKQorICAgICAgICAgICAgICAgIGJ1ZmZlcnMuYWRkKGVsZW1lbnRUeXBlLmZyb21Db21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIGNvbXBhcmFibGVCeXRlcywgdmVyc2lvbikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJ1ZmZlcnMuYWRkKG51bGwpOworICAgICAgICAgICAgc2VwYXJhdG9yID0gY29tcGFyYWJsZUJ5dGVzLm5leHQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhidWZmZXJzLCBhY2Nlc3NvciwgYnVmZmVycy5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNldE9yTGlzdFRvSnNvblN0cmluZyhCeXRlQnVmZmVyIGJ1ZmZlciwgQWJzdHJhY3RUeXBlPD8+IGVsZW1lbnRzVHlwZSwgUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBidWZmZXIuZHVwbGljYXRlKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiWyIpOworICAgICAgICBpbnQgc2l6ZSA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRDb2xsZWN0aW9uU2l6ZSh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKKyAgICAgICAgaW50IG9mZnNldCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZkNvbGxlY3Rpb25TaXplKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBlbGVtZW50ID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUoZWxlbWVudCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChlbGVtZW50c1R5cGUudG9KU09OU3RyaW5nKGVsZW1lbnQsIHByb3RvY29sVmVyc2lvbikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi5hcHBlbmQoIl0iKS50b1N0cmluZygpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbGxlY3Rpb25QYXRoU2VyaWFsaXplciBpbXBsZW1lbnRzIENlbGxQYXRoLlNlcmlhbGl6ZXIKICAgICB7CiAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShDZWxsUGF0aCBwYXRoLCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgpAQCAtMjY3LDQgKzM1OCwxMSBAQAogICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuc2tpcFdpdGhWSW50TGVuZ3RoKGluKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZShCeXRlQnVmZmVyIGJ1ZmZlcikKKyAgICB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkQ29sbGVjdGlvblNpemUoYnVmZmVyLmR1cGxpY2F0ZSgpLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGZvckVhY2goQnl0ZUJ1ZmZlciBpbnB1dCwgQ29uc3VtZXI8Qnl0ZUJ1ZmZlcj4gYWN0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQ29tcG9zaXRlVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Db21wb3NpdGVUeXBlLmphdmEKaW5kZXggYmY1ZTkxNGEuLjAwY2JlYjUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQ29tcG9zaXRlVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQ29tcG9zaXRlVHlwZS5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwogCkBAIC0zMSw2ICszMiw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5TeW50YXhFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZS5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMuYW55OwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy50cmFuc2Zvcm07CkBAIC0xNjUsNiArMTY5LDg2IEBACiAgICAgICAgIHJldHVybiB0eXBlcy5nZXQoaSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCB8fCBhY2Nlc3Nvci5pc0VtcHR5KGRhdGEpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgQnl0ZVNvdXJjZVtdIHNyY3MgPSBuZXcgQnl0ZVNvdXJjZVt0eXBlcy5zaXplKCkgKiAyICsgMV07CisgICAgICAgIGludCBsZW5ndGggPSBhY2Nlc3Nvci5zaXplKGRhdGEpOworCisgICAgICAgIC8vIHN0YXRpY3MgZ28gZmlyc3QKKyAgICAgICAgYm9vbGVhbiBpc1N0YXRpYyA9IHJlYWRJc1N0YXRpY0ludGVybmFsKGRhdGEsIGFjY2Vzc29yKTsKKyAgICAgICAgaW50IG9mZnNldCA9IHN0YXJ0aW5nT2Zmc2V0SW50ZXJuYWwoaXNTdGF0aWMpOworICAgICAgICBzcmNzWzBdID0gaXNTdGF0aWMgPyBudWxsIDogQnl0ZVNvdXJjZS5FTVBUWTsKKworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGJ5dGUgbGFzdEVvYyA9IDA7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE9ubHkgdGhlIGVuZC1vZi1jb21wb25lbnQgYnl0ZSBvZiB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhpcyBjb21wb3NpdGUgY2FuIGJlIG5vbi16ZXJvLCBzbyB0aGUKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBiZWZvcmUgY2FuJ3QgaGF2ZSBhIG5vbi16ZXJvIGVuZC1vZi1jb21wb25lbnQgYnl0ZS4KKyAgICAgICAgICAgIGFzc2VydCBsYXN0RW9jID09IDAgOiBsYXN0RW9jOworCisgICAgICAgICAgICBpbnQgY29tcG9uZW50TGVuZ3RoID0gYWNjZXNzb3IuZ2V0VW5zaWduZWRTaG9ydChkYXRhLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgICAgICBzcmNzW2kgKiAyICsgMV0gPSB0eXBlcy5nZXQoaSkuYXNDb21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIGFjY2Vzc29yLnNsaWNlKGRhdGEsIG9mZnNldCwgY29tcG9uZW50TGVuZ3RoKSwgdmVyc2lvbik7CisgICAgICAgICAgICBvZmZzZXQgKz0gY29tcG9uZW50TGVuZ3RoOworICAgICAgICAgICAgbGFzdEVvYyA9IGFjY2Vzc29yLmdldEJ5dGUoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAxOworICAgICAgICAgICAgc3Jjc1tpICogMiArIDJdID0gQnl0ZVNvdXJjZS5vbmVCeXRlKGxhc3RFb2MgJiAweEZGIF4gMHg4MCk7IC8vIGVuZC1vZi1jb21wb25lbnQgYWxzbyB0YWtlcyBwYXJ0IGluIGNvbXBhcmlzb24gYXMgc2lnbmVkIGJ5dGUKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgICAvLyBBIGNvbXBvc2l0ZSBtYXkgYmUgbGVhdmluZyBzb21lIHZhbHVlcyB1bnNwZWNpZmllZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgbWFrZSBzdXJlIHdlIHRlcm1pbmF0ZSBlYXJseQorICAgICAgICAvLyBzbyB0aGF0IHRyYW5zbGF0aW9ucyBjcmVhdGVkIGJlZm9yZSBhbiBleHRyYSBmaWVsZCB3YXMgYWRkZWQgbWF0Y2ggdHJhbnNsYXRpb25zIHRoYXQgaGF2ZSB0aGUgZmllbGQgYnV0IGRvbid0CisgICAgICAgIC8vIHNwZWNpZnkgYSB2YWx1ZSBmb3IgaXQuCisgICAgICAgIGlmIChpICogMiArIDEgPCBzcmNzLmxlbmd0aCkKKyAgICAgICAgICAgIHNyY3MgPSBBcnJheXMuY29weU9mUmFuZ2Uoc3JjcywgMCwgaSAqIDIgKyAxKTsKKworICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvck1heWJlTGVnYWN5KHZlcnNpb24sIEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSwgc3Jjcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBWIGZyb21Db21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIC8vIEZvciBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLkxFR0FDWSB0aGUgdGVybWluYXRvciBieXRlIGlzIEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTS4gVGhlIGxhdHRlciBtZWFucyB0aGF0IGl0J3MKKyAgICAgICAgLy8gaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgRU5EX09GX1NUUkVBTSBieXRlIHRoYXQgZ2V0cyByZXR1cm5lZCBfYWZ0ZXJfIHRoZSB0ZXJtaW5hdG9yIGJ5dGUgaGFzIGFscmVhZHkKKyAgICAgICAgLy8gYmVlbiBjb25zdW1lZCwgd2hlbiB0aGUgY29tcG9zaXRlIGlzIHBhcnQgb2YgYSBtdWx0aS1jb21wb25lbnQgc2VxdWVuY2UuIFNvIGlmIGluIHN1Y2ggYSBzY2VuYXJpbyB3ZSBjb25zdW1lCisgICAgICAgIC8vIHRoZSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0gdGVybWluYXRvciBoZXJlLCB0aGlzIHdpbGwgcmVzdWx0IGluIGFjdHVhbGx5IGNvbnN1bWluZyB0aGUgbXVsdGktY29tcG9uZW50CisgICAgICAgIC8vIHNlcXVlbmNlIHNlcGFyYXRvciBhZnRlciBpdCBhbmQganVtcGluZyBkaXJlY3RseSBpbnRvIHRoZSBieXRlcyBvZiB0aGUgbmV4dCBjb21wb25lbnQsIHdoZW4gd2UgdHJ5IHRvCisgICAgICAgIC8vIGNvbnN1bWUgdGhlIChhbHJlYWR5IGNvbnN1bWVkKSBzZXBhcmF0b3IuCisgICAgICAgIC8vIEluc3RlYWQgb2YgdHJ5aW5nIHRvIGZpbmQgYSB3YXkgYXJvdW5kIHRoZSBzaXR1YXRpb24sIHdlIGNhbiBqdXN0IHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgd2UgZG9uJ3QKKyAgICAgICAgLy8gbmVlZCB0byBkZWNvZGUgZnJvbSBWZXJzaW9uLkxFR0FDWSwgYXNzdW1lIHRoYXQgd2UgbmV2ZXIgZG8gdGhhdCwgYW5kIGFzc2VydCBpdCBoZXJlLgorICAgICAgICBhc3NlcnQgdmVyc2lvbiAhPSBWZXJzaW9uLkxFR0FDWTsKKworICAgICAgICBpZiAoY29tcGFyYWJsZUJ5dGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IuZW1wdHkoKTsKKworICAgICAgICBpbnQgc2VwYXJhdG9yID0gY29tcGFyYWJsZUJ5dGVzLm5leHQoKTsKKyAgICAgICAgYm9vbGVhbiBpc1N0YXRpYyA9IEJ5dGVTb3VyY2VJbnZlcnNlLm5leHRDb21wb25lbnROdWxsKHNlcGFyYXRvcik7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgVltdIGJ1ZmZlcnMgPSBhY2Nlc3Nvci5jcmVhdGVBcnJheSh0eXBlcy5zaXplKCkpOworICAgICAgICBieXRlIGxhc3RFb2MgPSAwOworCisgICAgICAgIHdoaWxlICgoc2VwYXJhdG9yID0gY29tcGFyYWJsZUJ5dGVzLm5leHQoKSkgIT0gQnl0ZVNvdXJjZS5URVJNSU5BVE9SICYmIGkgPCB0eXBlcy5zaXplKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE9ubHkgdGhlIGVuZC1vZi1jb21wb25lbnQgYnl0ZSBvZiB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhpcyBjb21wb3NpdGUgY2FuIGJlIG5vbi16ZXJvLCBzbyB0aGUKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBiZWZvcmUgY2FuJ3QgaGF2ZSBhIG5vbi16ZXJvIGVuZC1vZi1jb21wb25lbnQgYnl0ZS4KKyAgICAgICAgICAgIGFzc2VydCBsYXN0RW9jID09IDAgOiBsYXN0RW9jOworCisgICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgdHlwZSBhbmQgZGVjb2RlIGl0cyBwYXlsb2FkLgorICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSB0eXBlcy5nZXQoaSk7CisgICAgICAgICAgICBWIGRlY29kZWQgPSB0eXBlLmZyb21Db21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZUludmVyc2UubmV4dENvbXBvbmVudFNvdXJjZShjb21wYXJhYmxlQnl0ZXMsIHNlcGFyYXRvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbik7CisgICAgICAgICAgICBidWZmZXJzW2krK10gPSBkZWNvZGVkOworCisgICAgICAgICAgICBsYXN0RW9jID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0U2lnbmVkQnl0ZShCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50U291cmNlKGNvbXBhcmFibGVCeXRlcykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZChhY2Nlc3NvciwgaXNTdGF0aWMsIEFycmF5cy5jb3B5T2YoYnVmZmVycywgaSksIGxhc3RFb2MpOworICAgIH0KKwogICAgIHByb3RlY3RlZCBQYXJzZWRDb21wYXJhdG9yIHBhcnNlQ29tcGFyYXRvcihpbnQgaSwgU3RyaW5nIHBhcnQpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IFN0YXRpY1BhcnNlZENvbXBhcmF0b3IodHlwZXMuZ2V0KGkpLCBwYXJ0KTsKQEAgLTM3MSw2ICs0NTUsMTIgQEAKICAgICBAU2FmZVZhcmFyZ3MKICAgICBwdWJsaWMgc3RhdGljIDxWPiBWIGJ1aWxkKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIGJvb2xlYW4gaXNTdGF0aWMsIFYuLi4gdmFsdWVzKQogICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkKGFjY2Vzc29yLCBpc1N0YXRpYywgdmFsdWVzLCAoYnl0ZSkgMCk7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyA8Vj4gViBidWlsZChWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBib29sZWFuIGlzU3RhdGljLCBWW10gdmFsdWVzLCBieXRlIGxhc3RFb2MpCisgICAgewogICAgICAgICBpbnQgdG90YWxMZW5ndGggPSBpc1N0YXRpYyA/IDIgOiAwOwogICAgICAgICBmb3IgKFYgdiA6IHZhbHVlcykKICAgICAgICAgICAgIHRvdGFsTGVuZ3RoICs9IDIgKyBhY2Nlc3Nvci5zaXplKHYpICsgMTsKQEAgLTM4MCwxMSArNDcwLDEyIEBACiAgICAgICAgIGlmIChpc1N0YXRpYykKICAgICAgICAgICAgIG91dC5wdXRTaG9ydCgoc2hvcnQpU1RBVElDX01BUktFUik7CiAKLSAgICAgICAgZm9yIChWIHYgOiB2YWx1ZXMpCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKQogICAgICAgICB7CisgICAgICAgICAgICBWIHYgPSB2YWx1ZXNbaV07CiAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVNob3J0TGVuZ3RoKG91dCwgYWNjZXNzb3Iuc2l6ZSh2KSk7CiAgICAgICAgICAgICBhY2Nlc3Nvci53cml0ZSh2LCBvdXQpOwotICAgICAgICAgICAgb3V0LnB1dCgoYnl0ZSkgMCk7CisgICAgICAgICAgICBvdXQucHV0KGkgIT0gdmFsdWVzLmxlbmd0aCAtIDEgPyAoYnl0ZSkgMCA6IGxhc3RFb2MpOwogICAgICAgICB9CiAgICAgICAgIG91dC5mbGlwKCk7CiAgICAgICAgIHJldHVybiBhY2Nlc3Nvci52YWx1ZU9mKG91dCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0NvdW50ZXJDb2x1bW5UeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0NvdW50ZXJDb2x1bW5UeXBlLmphdmEKaW5kZXggMGRhZTA5Mi4uYWQwMmJmYiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Db3VudGVyQ29sdW1uVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvQ291bnRlckNvbHVtblR5cGUuamF2YQpAQCAtMzIsNiArMzIsOCBAQAogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ291bnRlckNvbHVtblR5cGUgaW5zdGFuY2UgPSBuZXcgQ291bnRlckNvbHVtblR5cGUoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gaW5zdGFuY2UuZGVjb21wb3NlKDBMKTsKKwogICAgIENvdW50ZXJDb2x1bW5UeXBlKCkge3N1cGVyKENvbXBhcmlzb25UeXBlLk5PVF9DT01QQVJBQkxFKTt9IC8vIHNpbmdsZXRvbgogCiAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eVZhbHVlTWVhbmluZ2xlc3MoKQpAQCAtMTI4LDQgKzEzMCw0MCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKC10b0xvbmcoaW5wdXQpKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBhYnMoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcyhNYXRoLmFicyh0b0xvbmcoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGxvbmcpIE1hdGguZXhwKHRvTG9uZyhpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBsb2coQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygobG9uZykgTWF0aC5sb2codG9Mb25nKGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGxvZzEwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGxvbmcpIE1hdGgubG9nMTAodG9Mb25nKGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIHJvdW5kKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuY2xvbmUoaW5wdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EYXRlVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EYXRlVHlwZS5qYXZhCmluZGV4IDQ3M2NlZGYuLmY1Zjc4NmQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRGF0ZVR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0RhdGVUeXBlLmphdmEKQEAgLTMxLDYgKzMxLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIAogLyoqCiAgKiBUaGlzIGlzIHRoZSBvbGQgdmVyc2lvbiBvZiBUaW1lc3RhbXBUeXBlLCBidXQgaGFzIGJlZW4gcmVwbGFjZWQgYXMgaXQgd2Fzbid0IGNvbXBhcmluZyBwcmUtZXBvY2ggdGltZXN0YW1wcwpAQCAtNDMsNiArNDYsOCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBEYXRlVHlwZSBpbnN0YW5jZSA9IG5ldyBEYXRlVHlwZSgpOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBNQVNLRURfVkFMVUUgPSBpbnN0YW5jZS5kZWNvbXBvc2UobmV3IERhdGUoMCkpOworCiAgICAgRGF0ZVR5cGUoKSB7c3VwZXIoQ29tcGFyaXNvblR5cGUuQllURV9PUkRFUik7fSAvLyBzaW5nbGV0b24KIAogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHlWYWx1ZU1lYW5pbmdsZXNzKCkKQEAgLTUwLDYgKzU1LDE5IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIC8vIFdoaWxlIEJZVEVfT1JERVIgd291bGQgc3RpbGwgd29yayBmb3IgdGhpcyB0eXBlLCBtYWtpbmcgdXNlIG9mIHRoZSBmaXhlZCBsZW5ndGggaXMgbW9yZSBlZmZpY2llbnQuCisgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9wdGlvbmFsRml4ZWRMZW5ndGgoYWNjZXNzb3IsIGRhdGEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZUludmVyc2UuZ2V0T3B0aW9uYWxGaXhlZExlbmd0aChhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCA4KTsKKyAgICB9CisKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgLy8gUmV0dXJuIGFuIGVtcHR5IEJ5dGVCdWZmZXIgZm9yIGFuIGVtcHR5IHN0cmluZy4KQEAgLTEyMyw0ICsxNDEsMTAgQEAKICAgICB7CiAgICAgICAgIHJldHVybiA4OwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EZWNpbWFsVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EZWNpbWFsVHlwZS5qYXZhCmluZGV4IDU3NDBmZGMuLjkyZDY4OGMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRGVjaW1hbFR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0RlY2ltYWxUeXBlLmphdmEKQEAgLTI0LDYgKzI0LDggQEAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOworCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlRlcm07CkBAIC0zMiwxNSArMzQsMzEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKKworaW1wb3J0IGNoLm9iZXJtdWhsbmVyLm1hdGguYmlnLkJpZ0RlY2ltYWxNYXRoOwogCiBwdWJsaWMgY2xhc3MgRGVjaW1hbFR5cGUgZXh0ZW5kcyBOdW1iZXJUeXBlPEJpZ0RlY2ltYWw+CiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBEZWNpbWFsVHlwZSBpbnN0YW5jZSA9IG5ldyBEZWNpbWFsVHlwZSgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBNQVNLRURfVkFMVUUgPSBpbnN0YW5jZS5kZWNvbXBvc2UoQmlnRGVjaW1hbC5aRVJPKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1NDQUxFID0gMzI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9TSUdOSUZJQ0FOVF9ESUdJVFMgPSBNSU5fU0NBTEU7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TQ0FMRSA9IDEwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWF0aENvbnRleHQgTUFYX1BSRUNJU0lPTiA9IG5ldyBNYXRoQ29udGV4dCgxMDAwMCk7CiAKKyAgICAvLyBDb25zdGFudHMgb3IgZXNjYXBpbmcgdmFsdWVzIG5lZWRlZCB0byBlbmNvZGUvZGVjb2RlIHZhcmlhYmxlLWxlbmd0aCBmbG9hdGluZyBwb2ludCBudW1iZXJzIChkZWNpbWFscykgaW4gb3VyCisgICAgLy8gY3VzdG9tIGJ5dGUtb3JkZXJlZCBlbmNvZGluZyBzY2hlbWUuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPU0lUSVZFX0RFQ0lNQUxfSEVBREVSX01BU0sgPSAweDgwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBORUdBVElWRV9ERUNJTUFMX0hFQURFUl9NQVNLID0gMHgwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVDSU1BTF9FWFBPTkVOVF9MRU5HVEhfSEVBREVSX01BU0sgPSAweDQwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgREVDSU1BTF9MQVNUX0JZVEUgPSAoYnl0ZSkgMHgwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIEhVTkRSRUQgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMTAwKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgWkVST19CVUZGRVIgPSBpbnN0YW5jZS5kZWNvbXBvc2UoQmlnRGVjaW1hbC5aRVJPKTsKKwogICAgIERlY2ltYWxUeXBlKCkge3N1cGVyKENvbXBhcmlzb25UeXBlLkNVU1RPTSk7fSAvLyBzaW5nbGV0b24KIAogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHlWYWx1ZU1lYW5pbmdsZXNzKCkKQEAgLTU5LDYgKzc3LDE5NiBAQAogICAgICAgICByZXR1cm4gY29tcGFyZUNvbXBvc2VkKGxlZnQsIGFjY2Vzc29yTCwgcmlnaHQsIGFjY2Vzc29yUiwgdGhpcyk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbi4KKyAgICAgKiBUaGlzIGlzIHJhdGhlciBkaWZmaWN1bHQgYW5kIGludm9sdmVzIHJlY29uc3RydWN0aW5nIHRoZSBkZWNpbWFsLgorICAgICAqCisgICAgICogVG8gY29tcGFyZSwgd2UgbmVlZCBhIG5vcm1hbGl6ZWQgdmFsdWUsIGkuZS4gb25lIHdpdGggYSBzaWduLCBleHBvbmVudCBhbmQgKDAsMSkgbWFudGlzc2EuIFRvIGF2b2lkCisgICAgICogbG9zcyBvZiBwcmVjaXNpb24sIGJvdGggZXhwb25lbnQgYW5kIG1hbnRpc3NhIG5lZWQgdG8gYmUgYmFzZS0xMDAuICBXZSBjYW4ndCBnZXQgdGhpcyBkaXJlY3RseSBvZmYgdGhlIHNlcmlhbGl6ZWQKKyAgICAgKiBieXRlcywgYXMgdGhleSBoYXZlIGJhc2UtMTAgc2NhbGUgYW5kIGJhc2UtMjU2IHVuc2NhbGVkIHBhcnQuCisgICAgICoKKyAgICAgKiBXZSBzdG9yZToKKyAgICAgKiAgICAgLSBzaWduIGJpdCBpbnZlcnRlZCAqIDB4ODAgKyAweDQwICsgc2lnbmVkIGV4cG9uZW50IGxlbmd0aCwgd2hlcmUgZXhwb25lbnQgaXMgbmVnYXRlZCBpZiB2YWx1ZSBpcyBuZWdhdGl2ZQorICAgICAqICAgICAtIHplcm8gb3IgbW9yZSBleHBvbmVudCBieXRlcyAoYXMgZ2l2ZW4gYnkgbGVuZ3RoKQorICAgICAqICAgICAtIDB4ODAgKyBmaXJzdCBwYWlyIG9mIGRlY2ltYWwgZGlnaXRzLCBuZWdhdGl2ZSBpZiB2YWx1ZSBpcyBuZWdhdGl2ZSwgcm91bmRlZCB0byAtaW5mCisgICAgICogICAgIC0gemVybyBvciBtb3JlIDB4ODAgKyBwYWlyIG9mIGRlY2ltYWwgZGlnaXRzLCBhbHdheXMgcG9zaXRpdmUKKyAgICAgKiAgICAgLSB0cmFpbGluZyAweDAwCisgICAgICogWmVybyBpcyBzcGVjaWFsLWNhc2VkIGFzIDB4ODAuCisgICAgICoKKyAgICAgKiBCZWNhdXNlIHRoZSB0cmFpbGluZyAwMCBjYW5ub3QgYmUgcHJvZHVjZWQgZnJvbSBhIHBhaXIgb2YgZGVjaW1hbCBkaWdpdHMgKHBvc2l0aXZlIG9yIG5vdCksIG5vIHZhbHVlIGNhbiBiZQorICAgICAqIGEgcHJlZml4IG9mIGFub3RoZXIuCisgICAgICoKKyAgICAgKiBFbmNvZGluZyBleGFtcGxlczoKKyAgICAgKiAgICAxLjEgICAgYXMgICAgICAgYzEgPSAweDgwIChwb3NpdGl2ZSBudW1iZXIpICsgMHg0MCArIChwb3NpdGl2ZSBleHBvbmVudCkgMHgwMSAoZXhwIGxlbmd0aCAxKQorICAgICAqICAgICAgICAgICAgICAgICAgICAwMSA9IGV4cG9uZW50IDEgKDEwMF4xKQorICAgICAqICAgICAgICAgICAgICAgICAgICA4MSA9IDB4ODAgKyAwMSAoMC4wMSkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgOGEgPSAweDgwICsgMTAgKC4uLi4xMCkgICAwLjAxMTBlMgorICAgICAqICAgICAgICAgICAgICAgICAgICAwMAorICAgICAqICAgIC0xICAgICBhcyAgICAgICAzZiA9IDB4MDAgKG5lZ2F0aXZlIG51bWJlcikgKyAweDQwIC0gKG5lZ2F0aXZlIGV4cG9uZW50KSAweDAxIChleHAgbGVuZ3RoIDEpCisgICAgICogICAgICAgICAgICAgICAgICAgIGZmID0gZXhwb25lbnQgLTEuIG5lZ2F0aXZlIG51bWJlciwgdGh1cyAxMDBeMQorICAgICAqICAgICAgICAgICAgICAgICAgICA3ZiA9IDB4ODAgLSAwMSAoLTAuMDEpICAgIC0wLjAxZTIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgMDAKKyAgICAgKiAgICAtOTkuOSAgYXMgICAgICAgM2YgPSAweDAwIChuZWdhdGl2ZSBudW1iZXIpICsgMHg0MCAtIChuZWdhdGl2ZSBleHBvbmVudCkgMHgwMSAoZXhwIGxlbmd0aCAxKQorICAgICAqICAgICAgICAgICAgICAgICAgICBmZiA9IGV4cG9uZW50IC0xLiBuZWdhdGl2ZSBudW1iZXIsIHRodXMgMTAwXjEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgMWMgPSAweDgwIC0gMTAwICgtMS4wMCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgOGEgPSAweDgwICsgMTAgICgrLi4uLjEwKSAtMC45OTllMgorICAgICAqICAgICAgICAgICAgICAgICAgICAwMAorICAgICAqCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgQmlnRGVjaW1hbCB2YWx1ZSA9IGNvbXBvc2UoZGF0YSwgYWNjZXNzb3IpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAodmFsdWUuY29tcGFyZVRvKEJpZ0RlY2ltYWwuWkVSTykgPT0gMCkgIC8vIE5vdGU6IDAuZXF1YWxzKDAuMCkgcmV0dXJucyBmYWxzZSEKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9uZUJ5dGUoUE9TSVRJVkVfREVDSU1BTF9IRUFERVJfTUFTSyk7CisKKyAgICAgICAgbG9uZyBzY2FsZSA9ICgoKGxvbmcpIHZhbHVlLnNjYWxlKCkpIC0gdmFsdWUucHJlY2lzaW9uKCkpICYgfjE7CisgICAgICAgIGJvb2xlYW4gbmVnYXRpdmUgPSB2YWx1ZS5zaWdudW0oKSA8IDA7CisgICAgICAgIC8vIE1ha2UgYSBiYXNlLTEwMCBleHBvbmVudCAodGhpcyB3aWxsIGFsd2F5cyBmaXQgaW4gYW4gaW50KS4KKyAgICAgICAgaW50IGV4cG9uZW50ID0gTWF0aC50b0ludEV4YWN0KC1zY2FsZSA+PiAxKTsKKyAgICAgICAgLy8gRmxpcCB0aGUgZXhwb25lbnQgc2lnbiBmb3IgbmVnYXRpdmUgbnVtYmVycywgc28gdGhhdCBvbmVzIHdpdGggbGFyZ2VyIG1hZ25pdHVkZXMgYXJlIHByb3BlbHkgdHJlYXRlZCBhcyBzbWFsbGVyLgorICAgICAgICBmaW5hbCBpbnQgbW9kdWxhdGVkRXhwb25lbnQgPSBuZWdhdGl2ZSA/IC1leHBvbmVudCA6IGV4cG9uZW50OworICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgaGF2ZSBzY2FsZSA+IEludGVnZXIuTUFYX1ZBTFVFLCBhcyB3ZSdyZSBhbHdheXMgc3VidHJhY3RpbmcgdGhlIG5vbi1uZWdhdGl2ZSBwcmVjaXNpb24gb2YKKyAgICAgICAgLy8gdGhlIGVuY29kZWQgQmlnRGVjaW1hbCwgYW5kIGZ1cnRoZXJtb3JlIHdlJ3JlIHJvdW5kaW5nIHRvIG5lZ2F0aXZlIGluZmluaXR5LgorICAgICAgICBhc3NlcnQgc2NhbGUgPD0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIC8vIEhvd2V2ZXIsIHdlIG1heSBlbmQgdXAgb3ZlcmZsb3dpbmcgb24gdGhlIG5lZ2F0aXZlIHNpZGUuCisgICAgICAgIGlmIChzY2FsZSA8IEludGVnZXIuTUlOX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBBcyBzY2FsZUJ5UG93ZXJPZlRlbiBuZWVkcyBhbiBpbnQgc2NhbGUsIGRvIHRoZSBzY2FsaW5nIGluIHR3byBzdGVwcy4KKyAgICAgICAgICAgIGludCBtdiA9IEludGVnZXIuTUlOX1ZBTFVFOworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zY2FsZUJ5UG93ZXJPZlRlbihtdik7CisgICAgICAgICAgICBzY2FsZSAtPSBtdjsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBCaWdEZWNpbWFsIG1hbnRpc3NhID0gdmFsdWUuc2NhbGVCeVBvd2VyT2ZUZW4oSW50cy5jaGVja2VkQ2FzdChzY2FsZSkpLnN0cmlwVHJhaWxpbmdaZXJvcygpOworICAgICAgICAvLyBXZSBub3cgaGF2ZSBhIHNtYWxsZXItdGhhbi1vbmUgc2lnbmVkIG1hbnRpc3NhLCBhbmQgYSBzaWduZWQgYW5kIG1vZHVsYXRlZCBiYXNlLTEwMCBleHBvbmVudC4KKyAgICAgICAgYXNzZXJ0IG1hbnRpc3NhLmFicygpLmNvbXBhcmVUbyhCaWdEZWNpbWFsLk9ORSkgPCAwOworCisgICAgICAgIHJldHVybiBuZXcgQnl0ZVNvdXJjZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IHdpdGggdXAgdG8gNSBieXRlcyBmb3Igc2lnbiArIGV4cG9uZW50LgorICAgICAgICAgICAgaW50IGV4cG9uZW50Qnl0ZXNMZWZ0ID0gNTsKKyAgICAgICAgICAgIEJpZ0RlY2ltYWwgY3VycmVudCA9IG1hbnRpc3NhOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4cG9uZW50Qnl0ZXNMZWZ0ID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC0tZXhwb25lbnRCeXRlc0xlZnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHBvbmVudEJ5dGVzTGVmdCA9PSA0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGxlYWRpbmcgemVybyBieXRlcyBpbiB0aGUgbW9kdWxhdGVkRXhwb25lbnQuCisgICAgICAgICAgICAgICAgICAgICAgICBleHBvbmVudEJ5dGVzTGVmdCAtPSBJbnRlZ2VyLm51bWJlck9mTGVhZGluZ1plcm9zKE1hdGguYWJzKG1vZHVsYXRlZEV4cG9uZW50KSkgLyA4OworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHByZXBhcmUgdGhlIGxlYWRpbmcgYnl0ZSB3aGljaCBpbmNsdWRlcyB0aGUgc2lnbiBvZiB0aGUgbnVtYmVyIHBsdXMgdGhlIHNpZ24gYW5kIGxlbmd0aCBvZiB0aGUgbW9kdWxhdGVkRXhwb25lbnQuCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwbGVuID0gREVDSU1BTF9FWFBPTkVOVF9MRU5HVEhfSEVBREVSX01BU0sgKyAobW9kdWxhdGVkRXhwb25lbnQgPCAwID8gLWV4cG9uZW50Qnl0ZXNMZWZ0IDogZXhwb25lbnRCeXRlc0xlZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cGxlbiArIChuZWdhdGl2ZSA/IE5FR0FUSVZFX0RFQ0lNQUxfSEVBREVSX01BU0sgOiBQT1NJVElWRV9ERUNJTUFMX0hFQURFUl9NQVNLKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1vZHVsYXRlZEV4cG9uZW50ID4+IChleHBvbmVudEJ5dGVzTGVmdCAqIDgpKSAmIDB4RkY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50LmNvbXBhcmVUbyhCaWdEZWNpbWFsLlpFUk8pID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDB4MDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwgdiA9IGN1cnJlbnQuc2NhbGVCeVBvd2VyT2ZUZW4oMik7CisgICAgICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwgZmxvb3IgPSB2LnNldFNjYWxlKDAsIFJvdW5kaW5nTW9kZS5GTE9PUik7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB2LnN1YnRyYWN0KGZsb29yKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsb29yLmJ5dGVWYWx1ZUV4YWN0KCkgKyAweDgwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaWYgKGNvbXBhcmFibGVCeXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmVtcHR5KCk7CisKKyAgICAgICAgaW50IGhlYWRlckJpdHMgPSBjb21wYXJhYmxlQnl0ZXMubmV4dCgpOworICAgICAgICBpZiAoaGVhZGVyQml0cyA9PSBQT1NJVElWRV9ERUNJTUFMX0hFQURFUl9NQVNLKQorICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLnZhbHVlT2YoWkVST19CVUZGRVIpOworCisgICAgICAgIC8vIEkuIEV4dHJhY3QgdGhlIGV4cG9uZW50LgorICAgICAgICAvLyBUaGUgc2lnbiBvZiB0aGUgZGVjaW1hbCwgYW5kIHRoZSBzaWduIGFuZCB0aGUgbGVuZ3RoIChpbiBieXRlcykgb2YgdGhlIGRlY2ltYWwgZXhwb25lbnQsIGFyZSBhbGwgZW5jb2RlZCBpbgorICAgICAgICAvLyB0aGUgZmlyc3QgYnl0ZS4KKyAgICAgICAgLy8gR2V0IHRoZSBzaWduIG9mIHRoZSBkZWNpbWFsLi4uCisgICAgICAgIGJvb2xlYW4gaXNOZWdhdGl2ZSA9IGhlYWRlckJpdHMgPCBQT1NJVElWRV9ERUNJTUFMX0hFQURFUl9NQVNLOworICAgICAgICBoZWFkZXJCaXRzIC09IGlzTmVnYXRpdmUgPyBORUdBVElWRV9ERUNJTUFMX0hFQURFUl9NQVNLIDogUE9TSVRJVkVfREVDSU1BTF9IRUFERVJfTUFTSzsKKyAgICAgICAgaGVhZGVyQml0cyAtPSBERUNJTUFMX0VYUE9ORU5UX0xFTkdUSF9IRUFERVJfTUFTSzsKKyAgICAgICAgLy8gR2V0IHRoZSBzaWduIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBleHBvbmVudCAodGhlIGxhdHRlciBpcyBlbmNvZGVkIGFzIGl0cyBuZWdhdGl2ZSBpZiB0aGUgc2lnbiBvZiB0aGUKKyAgICAgICAgLy8gZXhwb25lbnQgaXMgbmVnYXRpdmUpLi4uCisgICAgICAgIGJvb2xlYW4gaXNFeHBvbmVudE5lZ2F0aXZlID0gaGVhZGVyQml0cyA8IDA7CisgICAgICAgIGhlYWRlckJpdHMgPSBpc0V4cG9uZW50TmVnYXRpdmUgPyAtaGVhZGVyQml0cyA6IGhlYWRlckJpdHM7CisgICAgICAgIC8vIE5vdyBjb25zdW1lIHRoZSBleHBvbmVudCBieXRlcy4gSWYgdGhlIGV4cG9uZW50IGlzIG5lZ2F0aXZlIGFuZCB1c2VzIGxlc3MgdGhhbiA0IGJ5dGVzLCB0aGUgcmVtYWluaW5nIGJ5dGVzCisgICAgICAgIC8vIHNob3VsZCBiZSBwYWRkZWQgd2l0aCAxcywgaW4gb3JkZXIgZm9yIHRoZSBjb25zdHJ1Y3RlZCBpbnQgdG8gY29udGFpbiB0aGUgY29ycmVjdCAobmVnYXRpdmUpIGV4cG9uZW50IHZhbHVlLgorICAgICAgICAvLyBTbywgaWYgdGhlIGV4cG9uZW50IGlzIG5lZ2F0aXZlLCB3ZSBjYW4ganVzdCBzdGFydCB3aXRoIGFsbCBiaXRzIHNldCB0byAxIChpLmUuIHdlIGNhbiBzdGFydCB3aXRoIC0xKS4KKyAgICAgICAgaW50IGV4cG9uZW50ID0gaXNFeHBvbmVudE5lZ2F0aXZlID8gLTEgOiAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlckJpdHM7ICsraSkKKyAgICAgICAgICAgIGV4cG9uZW50ID0gKGV4cG9uZW50IDw8IDgpIHwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKTsKKyAgICAgICAgLy8gVGhlIGVuY29kZWQgZXhwb25lbnQgYWxzbyBjb250YWlucyB0aGUgZGVjaW1hbCBzaWduLCBpbiBvcmRlciB0byBjb3JyZWN0bHkgY29tcGFyZSBleHBvbmVudHMgaW4gY2FzZSBvZgorICAgICAgICAvLyBuZWdhdGl2ZSBkZWNpbWFscyAoZS5nLiB4ICogMTBeeSA+IHggKiAxMF56IGlmIHggPCAwICYmIHkgPCB6KS4gQWZ0ZXIgdGhlIGRlY2ltYWwgc2lnbiBpcyAicmVtb3ZlZCIsIHdoYXQncworICAgICAgICAvLyBsZWZ0IGlzIGEgYmFzZS0xMDAgZXhwb25lbnQgZm9sbG93aW5nIEJpZ0RlY2ltYWwncyBjb252ZW50aW9uIGZvciB0aGUgZXhwb25lbnQgc2lnbi4KKyAgICAgICAgZXhwb25lbnQgPSBpc05lZ2F0aXZlID8gLWV4cG9uZW50IDogZXhwb25lbnQ7CisKKyAgICAgICAgLy8gSUkuIEV4dHJhY3QgdGhlIG1hbnRpc3NhIGFzIGEgQmlnSW50ZWdlciB2YWx1ZS4gSXQgd2FzIGVuY29kZWQgYXMgYSBCaWdEZWNpbWFsIHZhbHVlIGJldHdlZW4gMCBhbmQgMSwgaW4KKyAgICAgICAgLy8gb3JkZXIgdG8gYmUgdXNlZCBmb3IgY29tcGFyaXNvbiAoYWZ0ZXIgdGhlIHNpZ24gb2YgdGhlIGRlY2ltYWwgYW5kIHRoZSBzaWduIGFuZCB0aGUgdmFsdWUgb2YgdGhlIGV4cG9uZW50KSwKKyAgICAgICAgLy8gYnV0IHdoZW4gZGVjb2Rpbmcgd2UgZG9uJ3QgbmVlZCB0aGF0IHByb3BlcnR5IG9uIHRoZSB0cmFuc2llbnQgbWFudGlzc2EgdmFsdWUuCisgICAgICAgIEJpZ0ludGVnZXIgbWFudGlzc2EgPSBCaWdJbnRlZ2VyLlpFUk87CisgICAgICAgIGludCBjdXJyID0gY29tcGFyYWJsZUJ5dGVzLm5leHQoKTsKKyAgICAgICAgd2hpbGUgKGN1cnIgIT0gREVDSU1BTF9MQVNUX0JZVEUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoZSBtYW50aXNzYSB2YWx1ZSBpcyBjb25zdHJ1Y3RlZCBieSBhIHN0YW5kYXJkIHBvc2l0aW9uYWwgbm90YXRpb24gdmFsdWUgY2FsY3VsYXRpb24uCisgICAgICAgICAgICAvLyBUaGUgdmFsdWUgb2YgdGhlIG5leHQgZGlnaXQgaXMgdGhlIG5leHQgbW9zdC1zaWduaWZpY2FudCBtYW50aXNzYSBieXRlIGFzIGFuIHVuc2lnbmVkIGludGVnZXIsCisgICAgICAgICAgICAvLyBvZmZzZXQgYnkgYSBwcmVkZXRlcm1pbmVkIHZhbHVlIChpbiB0aGlzIGNhc2UsIDB4ODApLi4uCisgICAgICAgICAgICBpbnQgY3Vyck1vZGlmaWVkID0gY3VyciAtIDB4ODA7CisgICAgICAgICAgICAvLyAuLi5tdWx0aXBseSB0aGUgY3VycmVudCB2YWx1ZSBieSB0aGUgYmFzZSAoaW4gdGhpcyBjYXNlLCAxMDApLi4uCisgICAgICAgICAgICBtYW50aXNzYSA9IG1hbnRpc3NhLm11bHRpcGx5KEhVTkRSRUQpOworICAgICAgICAgICAgLy8gLi4udGhlbiBhZGQgdGhlIG5leHQgZGlnaXQgdG8gdGhlIG1vZGlmaWVkIGN1cnJlbnQgdmFsdWUuLi4KKyAgICAgICAgICAgIG1hbnRpc3NhID0gbWFudGlzc2EuYWRkKEJpZ0ludGVnZXIudmFsdWVPZihjdXJyTW9kaWZpZWQpKTsKKyAgICAgICAgICAgIC8vIC4uLmFuZCBmaW5hbGx5LCBhZGp1c3QgdGhlIGJhc2UtMTAwLCBCaWdEZWNpbWFsIGZvcm1hdCBleHBvbmVudCBhY2NvcmRpbmdseS4KKyAgICAgICAgICAgIC0tZXhwb25lbnQ7CisgICAgICAgICAgICBjdXJyID0gY29tcGFyYWJsZUJ5dGVzLm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElJSS4gQ29uc3RydWN0IHRoZSBmaW5hbCBCaWdEZWNpbWFsIHZhbHVlLCBieSBjb21iaW5pbmcgdGhlIG1hbnRpc3NhIGFuZCB0aGUgZXhwb25lbnQsIGd1YXJkaW5nIGFnYWluc3QKKyAgICAgICAgLy8gdW5kZXJmbG93IG9yIG92ZXJmbG93IHdoZW4gZXhwb25lbnRzIGFyZSBjbG9zZSB0byB0aGVpciBib3VuZGFyeSB2YWx1ZXMuCisgICAgICAgIGxvbmcgYmFzZTEwTm9uQmlnRGVjaW1hbEZvcm1hdEV4cCA9IDJMICogZXhwb25lbnQ7CisgICAgICAgIC8vIFdoZW4gZXhwcmVzc2luZyBhIHN1ZmZpY2llbnRseSBiaWcgZGVjaW1hbCwgQmlnRGVjaW1hbCdzIGludGVybmFsIHNjYWxlIHZhbHVlIHdpbGwgYmUgbmVnYXRpdmUgd2l0aCB2ZXJ5CisgICAgICAgIC8vIGJpZyBhYnNvbHV0ZSB2YWx1ZS4gVG8gY29tcHV0ZSB0aGUgZW5jb2RlZCBleHBvbmVudCwgdGhpcyBpbnRlcm5hbCBzY2FsZSBoYXMgdGhlIG51bWJlciBvZiBkaWdpdHMgb2YgdGhlCisgICAgICAgIC8vIHVuc2NhbGVkIHZhbHVlIHN1YnRyYWN0ZWQgZnJvbSBpdCwgYWZ0ZXIgd2hpY2ggaXQncyBkaXZpZGVkIGJ5IDIsIHJvdW5kaW5nIGRvd24gdG8gbmVnYXRpdmUgaW5maW5pdHkKKyAgICAgICAgLy8gKGJlZm9yZSBhY2NvdW50aW5nIGZvciB0aGUgZGVjaW1hbCBzaWduKS4gV2hlbiBkZWNvZGluZywgdGhpcyBleHBvbmVudCBpcyBjb252ZXJ0ZWQgdG8gYSBiYXNlLTEwIGV4cG9uZW50IGluCisgICAgICAgIC8vIG5vbi1CaWdEZWNpbWFsIGZvcm1hdCwgd2hpY2ggbWVhbnMgdGhhdCBpdCBjYW4gdmVyeSB3ZWxsIG92ZXJmbG93IEludGVnZXIuTUFYX1ZBTFVFLgorICAgICAgICAvLyBGb3IgZXhhbXBsZSwgc2VlIGhvdyA8Y29kZT5uZXcgQmlnRGVjaW1hbChCaWdJbnRlZ2VyLlRFTiwgSW50ZWdlci5NSU5fVkFMVUUpPC9jb2RlPiBpcyBlbmNvZGVkIGFuZCBkZWNvZGVkLgorICAgICAgICBpZiAoYmFzZTEwTm9uQmlnRGVjaW1hbEZvcm1hdEV4cCA+IEludGVnZXIuTUFYX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiB0aGUgYmFzZS0xMCBleHBvbmVudCB3aWxsIHJlc3VsdCBpbiBhbiBvdmVyZmxvdywgc29tZSBvZiBpdHMgcG93ZXJzIG9mIDEwIG5lZWQgdG8gYmUgYWJzb3JiZWQgYnkgdGhlCisgICAgICAgICAgICAvLyBtYW50aXNzYS4gSG93IG11Y2ggZXhhY3RseT8gQXMgbGl0dGxlIGFzIG5lZWRlZCwgaW4gb3JkZXIgdG8gYXZvaWQgY29tcGxleCBCaWdJbnRlZ2VyIG9wZXJhdGlvbnMsIHdoaWNoCisgICAgICAgICAgICAvLyBtZWFucyBleGFjdGx5IGFzIG11Y2ggYXMgdG8gaGF2ZSBhIHNjYWxlIG9mIC1JbnRlZ2VyLk1BWF9WQUxVRS4KKyAgICAgICAgICAgIGludCBleHBvbmVudFJlZHVjdGlvbiA9IChpbnQpIChiYXNlMTBOb25CaWdEZWNpbWFsRm9ybWF0RXhwIC0gSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICAgICAgbWFudGlzc2EgPSBtYW50aXNzYS5tdWx0aXBseShCaWdJbnRlZ2VyLlRFTi5wb3coZXhwb25lbnRSZWR1Y3Rpb24pKTsKKyAgICAgICAgICAgIGJhc2UxME5vbkJpZ0RlY2ltYWxGb3JtYXRFeHAgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQgYmFzZTEwTm9uQmlnRGVjaW1hbEZvcm1hdEV4cCA+PSBJbnRlZ2VyLk1JTl9WQUxVRSAmJiBiYXNlMTBOb25CaWdEZWNpbWFsRm9ybWF0RXhwIDw9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAvLyBIZXJlIHdlIG5lZ2F0ZSB0aGUgZXhwb25lbnQsIGFzIHdlIGFyZSBub3QgdXNpbmcgQmlnRGVjaW1hbC5zY2FsZUJ5UG93ZXJPZlRlbiwgd2hlcmUgYSBwb3NpdGl2ZSBudW1iZXIgbWVhbnMKKyAgICAgICAgLy8gIm11bHRpcGx5aW5nIGJ5IGEgcG9zaXRpdmUgcG93ZXIgb2YgMTAiLCBidXQgdG8gQmlnRGVjaW1hbCdzIGludGVybmFsIHNjYWxlIHJlcHJlc2VudGF0aW9uLCB3aGVyZSBhIHBvc2l0aXZlCisgICAgICAgIC8vIG51bWJlciBtZWFucyAiZGl2aWRpbmcgYnkgYSBwb3NpdGl2ZSBwb3dlciBvZiAxMCIuCisgICAgICAgIGJ5dGVbXSBtYW50aXNzYUJ5dGVzID0gbWFudGlzc2EudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgViByZXN1bHRCdWYgPSBhY2Nlc3Nvci5hbGxvY2F0ZSg0ICsgbWFudGlzc2FCeXRlcy5sZW5ndGgpOworICAgICAgICBhY2Nlc3Nvci5wdXRJbnQocmVzdWx0QnVmLCAwLCAoaW50KSAtYmFzZTEwTm9uQmlnRGVjaW1hbEZvcm1hdEV4cCk7CisgICAgICAgIGFjY2Vzc29yLmNvcHlCeXRlQXJyYXlUbyhtYW50aXNzYUJ5dGVzLCAwLCByZXN1bHRCdWYsIDQsIG1hbnRpc3NhQnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdEJ1ZjsKKyAgICB9CisKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgICAvLyBSZXR1cm4gYW4gZW1wdHkgQnl0ZUJ1ZmZlciBmb3IgYW4gZW1wdHkgc3RyaW5nLgpAQCAtMTg2LDQgKzM5NCw2NyBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIGRlY29tcG9zZSh0b0JpZ0RlY2ltYWwoaW5wdXQpLm5lZ2F0ZSgpKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBhYnMoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWNvbXBvc2UodG9CaWdEZWNpbWFsKGlucHV0KS5hYnMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gZGVjb21wb3NlKGV4cCh0b0JpZ0RlY2ltYWwoaW5wdXQpKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJpZ0RlY2ltYWwgZXhwKEJpZ0RlY2ltYWwgaW5wdXQpCisgICAgeworICAgICAgICBpbnQgcHJlY2lzaW9uID0gaW5wdXQucHJlY2lzaW9uKCk7CisgICAgICAgIHByZWNpc2lvbiA9IE1hdGgubWF4KE1JTl9TSUdOSUZJQ0FOVF9ESUdJVFMsIHByZWNpc2lvbik7CisgICAgICAgIHByZWNpc2lvbiA9IE1hdGgubWluKE1BWF9QUkVDSVNJT04uZ2V0UHJlY2lzaW9uKCksIHByZWNpc2lvbik7CisgICAgICAgIHJldHVybiBCaWdEZWNpbWFsTWF0aC5leHAoaW5wdXQsIG5ldyBNYXRoQ29udGV4dChwcmVjaXNpb24sIFJvdW5kaW5nTW9kZS5IQUxGX0VWRU4pKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBsb2coQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWNvbXBvc2UobG9nKHRvQmlnRGVjaW1hbChpbnB1dCkpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQmlnRGVjaW1hbCBsb2coQmlnRGVjaW1hbCBpbnB1dCkKKyAgICB7CisgICAgICAgIGlmIChpbnB1dC5jb21wYXJlVG8oQmlnRGVjaW1hbC5aRVJPKSA8PSAwKSB0aHJvdyBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbigiTmF0dXJhbCBsb2cgb2YgbnVtYmVyIHplcm8gb3IgbGVzcyIpOworICAgICAgICBpbnQgcHJlY2lzaW9uID0gaW5wdXQucHJlY2lzaW9uKCk7CisgICAgICAgIHByZWNpc2lvbiA9IE1hdGgubWF4KE1JTl9TSUdOSUZJQ0FOVF9ESUdJVFMsIHByZWNpc2lvbik7CisgICAgICAgIHByZWNpc2lvbiA9IE1hdGgubWluKE1BWF9QUkVDSVNJT04uZ2V0UHJlY2lzaW9uKCksIHByZWNpc2lvbik7CisgICAgICAgIHJldHVybiBCaWdEZWNpbWFsTWF0aC5sb2coaW5wdXQsIG5ldyBNYXRoQ29udGV4dChwcmVjaXNpb24sIFJvdW5kaW5nTW9kZS5IQUxGX0VWRU4pKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBsb2cxMChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlY29tcG9zZShsb2cxMCh0b0JpZ0RlY2ltYWwoaW5wdXQpKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJpZ0RlY2ltYWwgbG9nMTAoQmlnRGVjaW1hbCBpbnB1dCkKKyAgICB7CisgICAgICAgIGlmIChpbnB1dC5jb21wYXJlVG8oQmlnRGVjaW1hbC5aRVJPKSA8PSAwKSB0aHJvdyBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbigiTG9nMTAgb2YgbnVtYmVyIHplcm8gb3IgbGVzcyIpOworICAgICAgICBpbnQgcHJlY2lzaW9uID0gaW5wdXQucHJlY2lzaW9uKCk7CisgICAgICAgIHByZWNpc2lvbiA9IE1hdGgubWF4KE1JTl9TSUdOSUZJQ0FOVF9ESUdJVFMsIHByZWNpc2lvbik7CisgICAgICAgIHByZWNpc2lvbiA9IE1hdGgubWluKE1BWF9QUkVDSVNJT04uZ2V0UHJlY2lzaW9uKCksIHByZWNpc2lvbik7CisgICAgICAgIHJldHVybiBCaWdEZWNpbWFsTWF0aC5sb2cxMChpbnB1dCwgbmV3IE1hdGhDb250ZXh0KHByZWNpc2lvbiwgUm91bmRpbmdNb2RlLkhBTEZfRVZFTikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIHJvdW5kKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gRGVjaW1hbFR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKAorICAgICAgICB0b0JpZ0RlY2ltYWwoaW5wdXQpLnNldFNjYWxlKDAsIFJvdW5kaW5nTW9kZS5IQUxGX1VQKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0RvdWJsZVR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRG91YmxlVHlwZS5qYXZhCmluZGV4IDU3MGQ0MjAuLjk0NGJhYjAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRG91YmxlVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRG91YmxlVHlwZS5qYXZhCkBAIC0yNywxMSArMjcsMTYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIAogcHVibGljIGNsYXNzIERvdWJsZVR5cGUgZXh0ZW5kcyBOdW1iZXJUeXBlPERvdWJsZT4KIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIERvdWJsZVR5cGUgaW5zdGFuY2UgPSBuZXcgRG91YmxlVHlwZSgpOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBNQVNLRURfVkFMVUUgPSBpbnN0YW5jZS5kZWNvbXBvc2UoMGQpOworCiAgICAgRG91YmxlVHlwZSgpIHtzdXBlcihDb21wYXJpc29uVHlwZS5DVVNUT00pO30gLy8gc2luZ2xldG9uCiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5VmFsdWVNZWFuaW5nbGVzcygpCkBAIC01MCw2ICs1NSwxOCBAQAogICAgICAgICByZXR1cm4gY29tcGFyZUNvbXBvc2VkKGxlZnQsIGFjY2Vzc29yTCwgcmlnaHQsIGFjY2Vzc29yUiwgdGhpcyk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uub3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aEZsb2F0KGFjY2Vzc29yLCBkYXRhKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2VJbnZlcnNlLmdldE9wdGlvbmFsU2lnbmVkRml4ZWRMZW5ndGhGbG9hdChhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCA4KTsKKyAgICB9CisKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgLy8gUmV0dXJuIGFuIGVtcHR5IEJ5dGVCdWZmZXIgZm9yIGFuIGVtcHR5IHN0cmluZy4KQEAgLTE2NCw0ICsxODEsNDAgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygtdG9Eb3VibGUoaW5wdXQpKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBhYnMoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcyhNYXRoLmFicyh0b0RvdWJsZShpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleHAoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcyhNYXRoLmV4cCh0b0RvdWJsZShpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBsb2coQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcyhNYXRoLmxvZyh0b0RvdWJsZShpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBsb2cxMChCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKE1hdGgubG9nMTAodG9Eb3VibGUoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgcm91bmQoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygoZG91YmxlKSBNYXRoLnJvdW5kKHRvRG91YmxlKGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EdXJhdGlvblR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRHVyYXRpb25UeXBlLmphdmEKaW5kZXggMmFmYmZjMS4uMWY0YTE5OSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EdXJhdGlvblR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0R1cmF0aW9uVHlwZS5qYXZhCkBAIC0zNiw2ICszNiw4IEBACiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBEdXJhdGlvblR5cGUgaW5zdGFuY2UgPSBuZXcgRHVyYXRpb25UeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZShEdXJhdGlvbi5uZXdJbnN0YW5jZSgwLCAwLCAwKSk7CisKICAgICBEdXJhdGlvblR5cGUoKQogICAgIHsKICAgICAgICAgc3VwZXIoQ29tcGFyaXNvblR5cGUuQllURV9PUkRFUik7CkBAIC04Niw0ICs4OCwxMCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0R5bmFtaWNDb21wb3NpdGVUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0R5bmFtaWNDb21wb3NpdGVUeXBlLmphdmEKaW5kZXggNWRmMzYwMC4uZTdhMjM2MCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EeW5hbWljQ29tcG9zaXRlVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRHluYW1pY0NvbXBvc2l0ZVR5cGUuamF2YQpAQCAtMTksOSArMTksMTYgQEAKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwpAQCAtMzQsNiArNDEsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlR5cGVTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGUuVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmFueTsKIApAQCAtNjAsNyArNzAsMTEgQEAKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRHluYW1pY0NvbXBvc2l0ZVR5cGUuY2xhc3MpOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZVNvdXJjZVtdIEVNUFRZX0JZVEVfU09VUkNFX0FSUkFZID0gbmV3IEJ5dGVTb3VyY2VbMF07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVkVSU0VEX1RZUEUgPSBSZXZlcnNlZFR5cGUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCiAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8Qnl0ZSwgQWJzdHJhY3RUeXBlPD8+PiBhbGlhc2VzOworICAgIHByaXZhdGUgZmluYWwgTWFwPEFic3RyYWN0VHlwZTw/PiwgQnl0ZT4gaW52ZXJzZU1hcHBpbmc7CiAKICAgICAvLyBpbnRlcm5pbmcgaW5zdGFuY2VzCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8TWFwPEJ5dGUsIEFic3RyYWN0VHlwZTw/Pj4sIER5bmFtaWNDb21wb3NpdGVUeXBlPiBpbnN0YW5jZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwpAQCAtODEsNiArOTUsOSBAQAogICAgIHByaXZhdGUgRHluYW1pY0NvbXBvc2l0ZVR5cGUoTWFwPEJ5dGUsIEFic3RyYWN0VHlwZTw/Pj4gYWxpYXNlcykKICAgICB7CiAgICAgICAgIHRoaXMuYWxpYXNlcyA9IGFsaWFzZXM7CisgICAgICAgIHRoaXMuaW52ZXJzZU1hcHBpbmcgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PEJ5dGUsIEFic3RyYWN0VHlwZTw/Pj4gZW4gOiBhbGlhc2VzLmVudHJ5U2V0KCkpCisgICAgICAgICAgICB0aGlzLmludmVyc2VNYXBwaW5nLnB1dChlbi5nZXRWYWx1ZSgpLCBlbi5nZXRLZXkoKSk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIDxWPiBib29sZWFuIHJlYWRJc1N0YXRpYyhWIHZhbHVlLCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yKQpAQCAtMTk3LDYgKzIxNCwxOTYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIExpc3Q8Qnl0ZVNvdXJjZT4gc3JjcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBpbnQgbGVuZ3RoID0gYWNjZXNzb3Iuc2l6ZShkYXRhKTsKKworICAgICAgICAvLyBzdGF0aWNzIGdvIGZpcnN0CisgICAgICAgIGJvb2xlYW4gaXNTdGF0aWMgPSByZWFkSXNTdGF0aWMoZGF0YSwgYWNjZXNzb3IpOworICAgICAgICBpbnQgb2Zmc2V0ID0gc3RhcnRpbmdPZmZzZXQoaXNTdGF0aWMpOworICAgICAgICBzcmNzLmFkZChpc1N0YXRpYyA/IG51bGwgOiBCeXRlU291cmNlLkVNUFRZKTsKKworICAgICAgICBieXRlIGxhc3RFb2MgPSAwOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCBsZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE9ubHkgdGhlIGVuZC1vZi1jb21wb25lbnQgYnl0ZSBvZiB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhpcyBjb21wb3NpdGUgY2FuIGJlIG5vbi16ZXJvLCBzbyB0aGUKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBiZWZvcmUgY2FuJ3QgaGF2ZSBhIG5vbi16ZXJvIGVuZC1vZi1jb21wb25lbnQgYnl0ZS4KKyAgICAgICAgICAgIGFzc2VydCBsYXN0RW9jID09IDAgOiBsYXN0RW9jOworCisgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gY29tcCA9IGdldENvbXBhcmF0b3IoZGF0YSwgYWNjZXNzb3IsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gZ2V0Q29tcGFyYXRvclNpemUoaSwgZGF0YSwgYWNjZXNzb3IsIG9mZnNldCk7CisgICAgICAgICAgICAvLyBUaGUgY29tcGFyYWJsZSBieXRlcyBmb3IgdGhlIGNvbXBvbmVudCBuZWVkIHRvIGVuc3VyZSBjb21wYXJpc29ucyBjb25zaXN0ZW50IHdpdGgKKyAgICAgICAgICAgIC8vIEFic3RyYWN0Q29tcG9zaXRlVHlwZS5jb21wYXJlQ3VzdG9tKEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXIpIGFuZAorICAgICAgICAgICAgLy8gRHluYW1pY0NvbXBvc2l0ZVR5cGUuZ2V0Q29tcGFyYXRvcihpbnQsIEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXIpOgorICAgICAgICAgICAgaWYgKHZlcnNpb24gPT0gVmVyc2lvbi5MRUdBQ1kgfHwgIShjb21wIGluc3RhbmNlb2YgUmV2ZXJzZWRUeXBlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyAuLi5tb3N0IG9mdGVuIHRoYXQgbWVhbnMganVzdCBhZGRpbmcgdGhlIHNob3J0IG5hbWUgb2YgdGhlIHR5cGUsIGZvbGxvd2VkIGJ5IHRoZSBmdWxsIG5hbWUgb2YgdGhlIHR5cGUuCisgICAgICAgICAgICAgICAgc3Jjcy5hZGQoQnl0ZVNvdXJjZS5vZihjb21wLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICAgICAgc3Jjcy5hZGQoQnl0ZVNvdXJjZS5vZihjb21wLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gLi4uaG93ZXZlciBzb21lIHRpbWVzIHRoZSBjb21wb25lbnQgdXNlcyBhIGNvbXBsZXggdHlwZSAoY3VycmVudGx5IHRoZSBvbmx5IHN1cHBvcnRlZCBjb21wbGV4IHR5cGUKKyAgICAgICAgICAgICAgICAvLyBpcyBSZXZlcnNlZFR5cGUgLSB3ZSBjYW4ndCBoYXZlIGVsZW1lbnRzIHRoYXQgYXJlIG9mIE1hcFR5cGUsIENvbXBvc2l0ZVR5cGUsIFR1cGxlVHlwZSwgZXRjLikuLi4KKyAgICAgICAgICAgICAgICBSZXZlcnNlZFR5cGU8Pz4gcmV2ZXJzZWRDb21wID0gKFJldmVyc2VkVHlwZTw/PikgY29tcDsKKyAgICAgICAgICAgICAgICAvLyAuLi5pbiB0aGlzIGNhc2UsIHdlIG5lZWQgdG8gYWRkIHRoZSBzaG9ydCBuYW1lIG9mIFJldmVyc2VkVHlwZSBiZWZvcmUgdGhlIHNob3J0IG5hbWUgb2YgdGhlIGJhc2UKKyAgICAgICAgICAgICAgICAvLyB0eXBlLCB0byBlbnN1cmUgY29uc2lzdGVuY3kgd2l0aCBEeW5hbWljQ29tcG9zaXRlVHlwZS5nZXRDb21wYXJhdG9yKGludCwgQnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlcikuCisgICAgICAgICAgICAgICAgc3Jjcy5hZGQoQnl0ZVNvdXJjZS5vZihSRVZFUlNFRF9UWVBFLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICAgICAgc3Jjcy5hZGQoQnl0ZVNvdXJjZS5vZihyZXZlcnNlZENvbXAuYmFzZVR5cGUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksIHZlcnNpb24pKTsKKyAgICAgICAgICAgICAgICBzcmNzLmFkZChCeXRlU291cmNlLm9mKHJldmVyc2VkQ29tcC5iYXNlVHlwZS5nZXRDbGFzcygpLmdldE5hbWUoKSwgdmVyc2lvbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gT25seSB0aGVuIHRoZSBwYXlsb2FkIG9mIHRoZSBjb21wb25lbnQgZ2V0cyBlbmNvZGVkLgorICAgICAgICAgICAgaW50IGNvbXBvbmVudExlbmd0aCA9IGFjY2Vzc29yLmdldFVuc2lnbmVkU2hvcnQoZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgc3Jjcy5hZGQoY29tcC5hc0NvbXBhcmFibGVCeXRlcyhhY2Nlc3NvciwgYWNjZXNzb3Iuc2xpY2UoZGF0YSwgb2Zmc2V0LCBjb21wb25lbnRMZW5ndGgpLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gY29tcG9uZW50TGVuZ3RoOworICAgICAgICAgICAgLy8gVGhlIGVuZC1vZi1jb21wb25lbnQgYnl0ZSBhbHNvIHRha2VzIHBhcnQgaW4gdGhlIGNvbXBhcmlzb24sIGFuZCB0aGVyZWZvcmUgbmVlZHMgdG8gYmUgZW5jb2RlZC4KKyAgICAgICAgICAgIGxhc3RFb2MgPSBhY2Nlc3Nvci5nZXRCeXRlKGRhdGEsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMTsKKyAgICAgICAgICAgIHNyY3MuYWRkKEJ5dGVTb3VyY2Uub25lQnl0ZSh2ZXJzaW9uID09IFZlcnNpb24uTEVHQUNZID8gbGFzdEVvYyA6IGxhc3RFb2MgJiAweEZGIF4gMHg4MCkpOworICAgICAgICAgICAgKytpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3JNYXliZUxlZ2FjeSh2ZXJzaW9uLCBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0sIHNyY3MudG9BcnJheShFTVBUWV9CWVRFX1NPVVJDRV9BUlJBWSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICAvLyBGb3IgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5MRUdBQ1kgdGhlIHRlcm1pbmF0b3IgYnl0ZSBpcyBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0uIEp1c3QgbGlrZSB3aXRoCisgICAgICAgIC8vIENvbXBvc2l0ZVR5cGUsIHRoaXMgbWVhbnMgdGhhdCBpbiBtdWx0aS1jb21wb25lbnQgc2VxdWVuY2VzIHRoZSB0ZXJtaW5hdG9yIG1heSBiZSB0cmFuc2Zvcm1lZCB0byBhIHJlZ3VsYXIKKyAgICAgICAgLy8gY29tcG9uZW50IHNlcGFyYXRvciwgYnV0IHVubGlrZSBDb21wb3NpdGVUeXBlICh3aGVyZSB3ZSBoYXZlIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgdHlwZXMvY29tcG9uZW50cyksCisgICAgICAgIC8vIHRoaXMgY2FuIG1ha2UgdGhlIGVuZCBvZiB0aGUgd2hvbGUgZHluYW1pYyBjb21wb3NpdGUgdHlwZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIHRoZSBlbmQgb2YgYSBjb21wb25lbnQKKyAgICAgICAgLy8gc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIGR5bmFtaWMgY29tcG9zaXRlIHR5cGUuIEJlY2F1c2Ugb2YgdGhhdCwgRHluYW1pY0NvbXBvc2l0ZVR5cGUgZWxlbWVudHMKKyAgICAgICAgLy8gY2Fubm90IGFsd2F5cyBiZSBzYWZlbHkgZGVjb2RlZCB1c2luZyB0aGF0IGVuY29kaW5nIHZlcnNpb24uCisgICAgICAgIC8vIEV2ZW4gbW9yZSBzbyB0aGFuIHdpdGggQ29tcG9zaXRlVHlwZSwgd2UganVzdCB0YWtlIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IHdlIGRvbid0IG5lZWQgdG8gZGVjb2RlIGZyb20KKyAgICAgICAgLy8gVmVyc2lvbi5MRUdBQ1ksIGFzc3VtZSB0aGF0IHdlIG5ldmVyIGRvIHRoYXQsIGFuZCBhc3NlcnQgaXQgaGVyZS4KKyAgICAgICAgYXNzZXJ0IHZlcnNpb24gIT0gVmVyc2lvbi5MRUdBQ1k7CisKKyAgICAgICAgaWYgKGNvbXBhcmFibGVCeXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmVtcHR5KCk7CisKKyAgICAgICAgLy8gVGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGlzU3RhdGljIGZsYWcgd2hpY2ggd2UgZG9uJ3QgbmVlZCBidXQgbXVzdCBjb25zdW1lIHRvIGNvbnRpbnVlIHBhc3QgaXQuCisgICAgICAgIGNvbXBhcmFibGVCeXRlcy5uZXh0KCk7CisKKyAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Vj4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGJ5dGUgbGFzdEVvYyA9IDA7CisKKyAgICAgICAgZm9yIChpbnQgc2VwYXJhdG9yID0gY29tcGFyYWJsZUJ5dGVzLm5leHQoKTsgc2VwYXJhdG9yICE9IEJ5dGVTb3VyY2UuVEVSTUlOQVRPUjsgc2VwYXJhdG9yID0gY29tcGFyYWJsZUJ5dGVzLm5leHQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU29sZWx5IHRoZSBlbmQtb2YtY29tcG9uZW50IGJ5dGUgb2YgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoaXMgY29tcG9zaXRlIGNhbiBiZSBub24temVyby4KKyAgICAgICAgICAgIGFzc2VydCBsYXN0RW9jID09IDAgOiBsYXN0RW9jOworCisgICAgICAgICAgICBib29sZWFuIGlzUmV2ZXJzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIC8vIERlY29kZSB0aGUgbmV4dCB0eXBlJ3Mgc2ltcGxlIGNsYXNzIG5hbWUgdGhhdCBpcyBlbmNvZGVkIGJlZm9yZSBpdHMgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgKGluIG9yZGVyCisgICAgICAgICAgICAvLyBmb3IgY29tcGFyaXNvbnMgdG8gd29yayBjb3JyZWN0bHkpLgorICAgICAgICAgICAgU3RyaW5nIHNpbXBsZUNsYXNzTmFtZSA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFN0cmluZyhCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50U291cmNlKGNvbXBhcmFibGVCeXRlcywgc2VwYXJhdG9yKSk7CisgICAgICAgICAgICBpZiAoUkVWRVJTRURfVFlQRS5lcXVhbHMoc2ltcGxlQ2xhc3NOYW1lKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBTcGVjaWFsLWhhbmRsZSBpZiB0aGUgdHlwZSBpcyByZXZlcnNlZCAoYW5kIGRlY29kZSB0aGUgYWN0dWFsIGJhc2UgdHlwZSBzaW1wbGUgY2xhc3MgbmFtZSkuCisgICAgICAgICAgICAgICAgaXNSZXZlcnNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc2ltcGxlQ2xhc3NOYW1lID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0U3RyaW5nKEJ5dGVTb3VyY2VJbnZlcnNlLm5leHRDb21wb25lbnRTb3VyY2UoY29tcGFyYWJsZUJ5dGVzKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERlY29kZSB0aGUgdHlwZSdzIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIGFuZCBwYXJzZSB0aGUgYWN0dWFsIHR5cGUgZnJvbSBpdC4KKyAgICAgICAgICAgIFN0cmluZyBmdWxsQ2xhc3NOYW1lID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0U3RyaW5nKEJ5dGVTb3VyY2VJbnZlcnNlLm5leHRDb21wb25lbnRTb3VyY2UoY29tcGFyYWJsZUJ5dGVzKSk7CisgICAgICAgICAgICBhc3NlcnQgZnVsbENsYXNzTmFtZS5lbmRzV2l0aChzaW1wbGVDbGFzc05hbWUpOworICAgICAgICAgICAgaWYgKGlzUmV2ZXJzZWQpCisgICAgICAgICAgICAgICAgZnVsbENsYXNzTmFtZSA9IFJFVkVSU0VEX1RZUEUgKyAnKCcgKyBmdWxsQ2xhc3NOYW1lICsgJyknOworICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHR5cGUgPSBUeXBlUGFyc2VyLnBhcnNlKGZ1bGxDbGFzc05hbWUpOworICAgICAgICAgICAgYXNzZXJ0IHR5cGUgIT0gbnVsbDsKKyAgICAgICAgICAgIHR5cGVzLmFkZCh0eXBlKTsKKworICAgICAgICAgICAgLy8gRGVjb2RlIHRoZSBwYXlsb2FkIGZyb20gdGhpcyB0eXBlLgorICAgICAgICAgICAgViB2YWx1ZSA9IHR5cGUuZnJvbUNvbXBhcmFibGVCeXRlcyhhY2Nlc3NvciwgQnl0ZVNvdXJjZUludmVyc2UubmV4dENvbXBvbmVudFNvdXJjZShjb21wYXJhYmxlQnl0ZXMpLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOworCisgICAgICAgICAgICAvLyBBbHNvIGRlY29kZSB0aGUgY29ycmVzcG9uZGluZyBlbmQtb2YtY29tcG9uZW50IGJ5dGUgLSB0aGUgbGFzdCBvbmUgd2UgZGVjb2RlIHdpbGwgYmUgdGFrZW4gaW50bworICAgICAgICAgICAgLy8gYWNjb3VudCB3aGVuIHdlIGRlc2VyaWFsaXplIHRoZSBkZWNvZGVkIGRhdGEgaW50byBhbiBvYmplY3QuCisgICAgICAgICAgICBsYXN0RW9jID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0U2lnbmVkQnl0ZShCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50U291cmNlKGNvbXBhcmFibGVCeXRlcykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZChhY2Nlc3NvciwgdHlwZXMsIGludmVyc2VNYXBwaW5nLCB2YWx1ZXMsIGxhc3RFb2MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBidWlsZChMaXN0PFN0cmluZz4gdHlwZXMsIExpc3Q8Qnl0ZUJ1ZmZlcj4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgIExpc3RzLnRyYW5zZm9ybSh0eXBlcywgVHlwZVBhcnNlcjo6cGFyc2UpLAorICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwKKyAgICAgICAgICAgICAgICAgICAgIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgIChieXRlKSAwKTsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIDxWPiBWIGJ1aWxkKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8QWJzdHJhY3RUeXBlPD8+LCBCeXRlPiBpbnZlcnNlTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Vj4gdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBsYXN0RW9jKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHR5cGVzLnNpemUoKSA9PSB2YWx1ZXMuc2l6ZSgpOworCisgICAgICAgIGludCBudW1Db21wb25lbnRzID0gdHlwZXMuc2l6ZSgpOworICAgICAgICAvLyBDb21wdXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZSdsbCBuZWVkIHRvIHN0b3JlIHRoZSB0eXBlcyBhbmQgdGhlaXIgcGF5bG9hZHMuCisgICAgICAgIGludCB0b3RhbExlbmd0aCA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29tcG9uZW50czsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IHR5cGVzLmdldChpKTsKKyAgICAgICAgICAgIEJ5dGUgYWxpYXMgPSBpbnZlcnNlTWFwcGluZy5nZXQodHlwZSk7CisgICAgICAgICAgICBpbnQgdHlwZU5hbWVMZW5ndGggPSBhbGlhcyA9PSBudWxsID8gdHlwZS50b1N0cmluZygpLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpLmxlbmd0aCA6IDA7CisgICAgICAgICAgICAvLyBUaGUgdHlwZSBkYXRhIHdpbGwgYmUgc3RvcmVkIGJ5IG1lYW5zIG9mIHRoZSB0eXBlJ3MgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIG5vdCBieSBhbGlhc2luZywgc286CisgICAgICAgICAgICAvLyAgIDEuIFRoZSB0eXBlIGRhdGEgaGVhZGVyIHNob3VsZCBiZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgbGVuZ3RoIGluIGJ5dGVzLgorICAgICAgICAgICAgLy8gICAyLiBUaGUgbGVuZ3RoIHNob3VsZCBiZSBzbWFsbCBlbm91Z2ggc28gdGhhdCBpdCBmaXRzIGluIDE1IGJpdHMgKDIgYnl0ZXMgd2l0aCB0aGUgZmlyc3QgYml0IHplcm8pLgorICAgICAgICAgICAgYXNzZXJ0IHR5cGVOYW1lTGVuZ3RoIDw9IDB4N0ZGRjsKKyAgICAgICAgICAgIGludCB2YWx1ZUxlbmd0aCA9IGFjY2Vzc29yLnNpemUodmFsdWVzLmdldChpKSk7CisgICAgICAgICAgICAvLyBUaGUgdmFsdWUgbGVuZ3RoIHNob3VsZCBhbHNvIGV4cGVjdCBpdHMgZmlyc3QgYml0IHRvIGJlIDAsIGFzIHRoZSBsZW5ndGggc2hvdWxkIGJlIHN0b3JlZCBhcyBhIHNpZ25lZAorICAgICAgICAgICAgLy8gMi1ieXRlIHZhbHVlIChzaG9ydCkuCisgICAgICAgICAgICBhc3NlcnQgdmFsdWVMZW5ndGggPD0gMHg3RkZGOworICAgICAgICAgICAgdG90YWxMZW5ndGggKz0gMiArIHR5cGVOYW1lTGVuZ3RoICsgMiArIHZhbHVlTGVuZ3RoICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIFYgcmVzdWx0ID0gYWNjZXNzb3IuYWxsb2NhdGUodG90YWxMZW5ndGgpOworICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db21wb25lbnRzOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gdHlwZXMuZ2V0KGkpOworICAgICAgICAgICAgQnl0ZSBhbGlhcyA9IGludmVyc2VNYXBwaW5nLmdldCh0eXBlKTsKKyAgICAgICAgICAgIGlmIChhbGlhcyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdyaXRlIHRoZSB0eXBlIGRhdGEgKDItYnl0ZSBsZW5ndGggaGVhZGVyICsgdGhlIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUgaW4gVVRGLTgpLgorICAgICAgICAgICAgICAgIGJ5dGVbXSB0eXBlTmFtZUJ5dGVzID0gdHlwZS50b1N0cmluZygpLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgICAgICAgICAgICAgIGFjY2Vzc29yLnB1dFNob3J0KHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KSB0eXBlTmFtZUJ5dGVzLmxlbmd0aCk7IC8vIHRoaXMgc2hvdWxkIHdvcmsgZmluZSBhbHNvIGlmIGxlbmd0aCA+PSAzMjc2OAorICAgICAgICAgICAgICAgIG9mZnNldCArPSAyOworICAgICAgICAgICAgICAgIGFjY2Vzc29yLmNvcHlCeXRlQXJyYXlUbyh0eXBlTmFtZUJ5dGVzLCAwLCByZXN1bHQsIG9mZnNldCwgdHlwZU5hbWVCeXRlcy5sZW5ndGgpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSB0eXBlTmFtZUJ5dGVzLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci5wdXRTaG9ydChyZXN1bHQsIG9mZnNldCwgKHNob3J0KSAoYWxpYXMgfCAweDgwMDApKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV3JpdGUgdGhlIHR5cGUgcGF5bG9hZCBkYXRhICgyLWJ5dGUgbGVuZ3RoIGhlYWRlciArIHRoZSBwYXlsb2FkKS4KKyAgICAgICAgICAgIFYgdmFsdWUgPSB2YWx1ZXMuZ2V0KGkpOworICAgICAgICAgICAgaW50IGJ5dGVzVG9Db3B5ID0gYWNjZXNzb3Iuc2l6ZSh2YWx1ZSk7CisgICAgICAgICAgICBhY2Nlc3Nvci5wdXRTaG9ydChyZXN1bHQsIG9mZnNldCwgKHNob3J0KSBieXRlc1RvQ29weSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIGFjY2Vzc29yLmNvcHlUbyh2YWx1ZSwgMCwgcmVzdWx0LCBhY2Nlc3Nvciwgb2Zmc2V0LCBieXRlc1RvQ29weSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gYnl0ZXNUb0NvcHk7CisKKyAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBlbmQtb2YtY29tcG9uZW50IGJ5dGUuCisgICAgICAgICAgICBhY2Nlc3Nvci5wdXRCeXRlKHJlc3VsdCwgb2Zmc2V0LCBpICE9IG51bUNvbXBvbmVudHMgLSAxID8gKGJ5dGUpIDAgOiBsYXN0RW9jKTsKKyAgICAgICAgICAgIG9mZnNldCArPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIFBhcnNlZENvbXBhcmF0b3IgcGFyc2VDb21wYXJhdG9yKGludCBpLCBTdHJpbmcgcGFydCkKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgRHluYW1pY1BhcnNlZENvbXBhcmF0b3IocGFydCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0VtcHR5VHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9FbXB0eVR5cGUuamF2YQppbmRleCAzNTdiNmU4Li4zM2M0NTI0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0VtcHR5VHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRW1wdHlUeXBlLmphdmEKQEAgLTMzLDggKzMzLDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVHlwZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk5vU3BhbUxvZ2dlcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNFUklBTElaQVRJT05fRU1QVFlfVFlQRV9OT05FTVBUWV9CRUhBVklPUjsKKwogLyoqCiAgKiBBIHR5cGUgdGhhdCBvbmx5IGFjY2VwdCBlbXB0eSBkYXRhLgogICogSXQgaXMgb25seSB1c2VmdWwgYXMgYSB2YWx1ZSB2YWxpZGF0aW9uIHR5cGUsIG5vdCBhcyBhIGNvbXBhcmF0b3Igc2luY2UgY29sdW1uIG5hbWVzIGNhbid0IGJlIGVtcHR5LgpAQCAtNDQsMTMgKzQ4LDEyIEBACiAgICAgcHJpdmF0ZSBlbnVtIE5vbkVtcHR5V3JpdGVCZWhhdmlvciB7IEZBSUwsIExPR19EQVRBX0xPU1MsIFNJTEVOVF9EQVRBX0xPU1MgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEVtcHR5VHlwZS5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FTVBUWVRZUEVfTk9ORU1QVFlfQkVIQVZJT1IgPSAiY2Fzc2FuZHJhLnNlcmlhbGl6YXRpb24uZW1wdHl0eXBlLm5vbmVtcHR5X2JlaGF2aW9yIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOb1NwYW1Mb2dnZXIgTk9OX0VNUFRZX1dSSVRFX0xPR0dFUiA9IE5vU3BhbUxvZ2dlci5nZXRMb2dnZXIobG9nZ2VyLCAxLCBUaW1lVW5pdC5NSU5VVEVTKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOb25FbXB0eVdyaXRlQmVoYXZpb3IgTk9OX0VNUFRZX1dSSVRFX0JFSEFWSU9SID0gcGFyc2VOb25FbXB0eVdyaXRlQmVoYXZpb3IoKTsKIAogICAgIHByaXZhdGUgc3RhdGljIE5vbkVtcHR5V3JpdGVCZWhhdmlvciBwYXJzZU5vbkVtcHR5V3JpdGVCZWhhdmlvcigpCiAgICAgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoS0VZX0VNUFRZVFlQRV9OT05FTVBUWV9CRUhBVklPUik7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IFNFUklBTElaQVRJT05fRU1QVFlfVFlQRV9OT05FTVBUWV9CRUhBVklPUi5nZXRTdHJpbmcoKTsKICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCiAgICAgICAgICAgICByZXR1cm4gTm9uRW1wdHlXcml0ZUJlaGF2aW9yLkZBSUw7CiAgICAgICAgIHRyeQpAQCAtNTksNyArNjIsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlVuYWJsZSB0byBwYXJzZSBwcm9wZXJ0eSAiICsgS0VZX0VNUFRZVFlQRV9OT05FTVBUWV9CRUhBVklPUiArICIsIGZhbGxpbmcgYmFjayB0byBGQUlMIiwgZSk7CisgICAgICAgICAgICBsb2dnZXIud2FybigiVW5hYmxlIHRvIHBhcnNlIHByb3BlcnR5ICIgKyBTRVJJQUxJWkFUSU9OX0VNUFRZX1RZUEVfTk9ORU1QVFlfQkVIQVZJT1IuZ2V0S2V5KCkgKyAiLCBmYWxsaW5nIGJhY2sgdG8gRkFJTCIsIGUpOwogICAgICAgICAgICAgcmV0dXJuIE5vbkVtcHR5V3JpdGVCZWhhdmlvci5GQUlMOwogICAgICAgICB9CiAgICAgfQpAQCAtNjgsNiArNzEsMTggQEAKIAogICAgIHByaXZhdGUgRW1wdHlUeXBlKCkge3N1cGVyKENvbXBhcmlzb25UeXBlLkNVU1RPTSk7fSAvLyBzaW5nbGV0b24KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gYWNjZXNzb3IuZW1wdHkoKTsKKyAgICB9CisKICAgICBwdWJsaWMgPFZMLCBWUj4gaW50IGNvbXBhcmVDdXN0b20oVkwgbGVmdCwgVmFsdWVBY2Nlc3NvcjxWTD4gYWNjZXNzb3JMLCBWUiByaWdodCwgVmFsdWVBY2Nlc3NvcjxWUj4gYWNjZXNzb3JSKQogICAgIHsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xNjgsNCArMTgzLDEwIEBACiAgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKICAgICAgICAgfQogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0Zsb2F0VHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9GbG9hdFR5cGUuamF2YQppbmRleCAzNWFiZWUwLi43NDQxMWRjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0Zsb2F0VHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRmxvYXRUeXBlLmphdmEKQEAgLTI3LDEyICsyNywxNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogCiAKIHB1YmxpYyBjbGFzcyBGbG9hdFR5cGUgZXh0ZW5kcyBOdW1iZXJUeXBlPEZsb2F0PgogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRmxvYXRUeXBlIGluc3RhbmNlID0gbmV3IEZsb2F0VHlwZSgpOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBNQVNLRURfVkFMVUUgPSBpbnN0YW5jZS5kZWNvbXBvc2UoMGYpOworCiAgICAgRmxvYXRUeXBlKCkge3N1cGVyKENvbXBhcmlzb25UeXBlLkNVU1RPTSk7fSAvLyBzaW5nbGV0b24KIAogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHlWYWx1ZU1lYW5pbmdsZXNzKCkKQEAgLTUxLDYgKzU2LDE4IEBACiAgICAgICAgIHJldHVybiBjb21wYXJlQ29tcG9zZWQobGVmdCwgYWNjZXNzb3JMLCByaWdodCwgYWNjZXNzb3JSLCB0aGlzKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS5vcHRpb25hbFNpZ25lZEZpeGVkTGVuZ3RoRmxvYXQoYWNjZXNzb3IsIGRhdGEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZUludmVyc2UuZ2V0T3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aEZsb2F0KGFjY2Vzc29yLCBjb21wYXJhYmxlQnl0ZXMsIDQpOworICAgIH0KKwogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGZyb21TdHJpbmcoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KICAgICB7CiAgICAgICAvLyBSZXR1cm4gYW4gZW1wdHkgQnl0ZUJ1ZmZlciBmb3IgYW4gZW1wdHkgc3RyaW5nLgpAQCAtMTU5LDQgKzE3Niw0MCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKC10b0Zsb2F0KGlucHV0KSk7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgYWJzKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoTWF0aC5hYnModG9GbG9hdChpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleHAoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygoZmxvYXQpIE1hdGguZXhwKHRvRmxvYXQoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgbG9nKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGZsb2F0KSBNYXRoLmxvZyh0b0Zsb2F0KGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGxvZzEwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGZsb2F0KSBNYXRoLmxvZzEwKHRvRmxvYXQoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgcm91bmQoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygoZmxvYXQpIE1hdGgucm91bmQodG9GbG9hdChpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gTUFTS0VEX1ZBTFVFOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvSW5ldEFkZHJlc3NUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0luZXRBZGRyZXNzVHlwZS5qYXZhCmluZGV4IDY4MzhjODMuLjdlMGU1OGMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvSW5ldEFkZHJlc3NUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9JbmV0QWRkcmVzc1R5cGUuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsOwogCiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CkBAIC0zMyw2ICszNCw4IEBACiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbmV0QWRkcmVzc1R5cGUgaW5zdGFuY2UgPSBuZXcgSW5ldEFkZHJlc3NUeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZShuZXcgSW5ldFNvY2tldEFkZHJlc3MoMCkuZ2V0QWRkcmVzcygpKTsKKwogICAgIEluZXRBZGRyZXNzVHlwZSgpIHtzdXBlcihDb21wYXJpc29uVHlwZS5CWVRFX09SREVSKTt9IC8vIHNpbmdsZXRvbgogCiAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eVZhbHVlTWVhbmluZ2xlc3MoKQpAQCAtOTQsNCArOTcsMTAgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBJbmV0QWRkcmVzc1NlcmlhbGl6ZXIuaW5zdGFuY2U7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0ludDMyVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9JbnQzMlR5cGUuamF2YQppbmRleCA5OGY0YzgzLi4yZDcwYWM0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0ludDMyVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvSW50MzJUeXBlLmphdmEKQEAgLTI4LDExICsyOCwxNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVHlwZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIAogcHVibGljIGNsYXNzIEludDMyVHlwZSBleHRlbmRzIE51bWJlclR5cGU8SW50ZWdlcj4KIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEludDMyVHlwZSBpbnN0YW5jZSA9IG5ldyBJbnQzMlR5cGUoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gaW5zdGFuY2UuZGVjb21wb3NlKDApOworCiAgICAgSW50MzJUeXBlKCkKICAgICB7CiAgICAgICAgIHN1cGVyKENvbXBhcmlzb25UeXBlLkNVU1RPTSk7CkBAIC01NSw2ICs2MCwxOCBAQAogICAgICAgICByZXR1cm4gVmFsdWVBY2Nlc3Nvci5jb21wYXJlKGxlZnQsIGFjY2Vzc29yTCwgcmlnaHQsIGFjY2Vzc29yUik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uub3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aE51bWJlcihhY2Nlc3NvciwgZGF0YSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBWIGZyb21Db21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlU291cmNlSW52ZXJzZS5nZXRPcHRpb25hbFNpZ25lZEZpeGVkTGVuZ3RoKGFjY2Vzc29yLCBjb21wYXJhYmxlQnl0ZXMsIDQpOworICAgIH0KKwogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGZyb21TdHJpbmcoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KICAgICB7CiAgICAgICAgIC8vIFJldHVybiBhbiBlbXB0eSBCeXRlQnVmZmVyIGZvciBhbiBlbXB0eSBzdHJpbmcuCkBAIC0xNTksNCArMTc2LDQwIEBACiAgICAgewogICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoLXRvSW50KGlucHV0KSk7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgYWJzKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoTWF0aC5hYnModG9JbnQoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGludCkgTWF0aC5leHAodG9JbnQoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgbG9nKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGludCkgTWF0aC5sb2codG9JbnQoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgbG9nMTAoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygoaW50KSBNYXRoLmxvZzEwKHRvSW50KGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIHJvdW5kKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuY2xvbmUoaW5wdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9JbnRlZ2VyVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9JbnRlZ2VyVHlwZS5qYXZhCmluZGV4IDRjOTEzZDUuLjI5MTg5NTMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvSW50ZWdlclR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0ludGVnZXJUeXBlLmphdmEKQEAgLTMwLDExICszMCwyNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogCiBwdWJsaWMgZmluYWwgY2xhc3MgSW50ZWdlclR5cGUgZXh0ZW5kcyBOdW1iZXJUeXBlPEJpZ0ludGVnZXI+CiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyVHlwZSBpbnN0YW5jZSA9IG5ldyBJbnRlZ2VyVHlwZSgpOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBNQVNLRURfVkFMVUUgPSBpbnN0YW5jZS5kZWNvbXBvc2UoQmlnSW50ZWdlci5aRVJPKTsKKworICAgIC8vIENvbnN0YW50cyBvciBlc2NhcGluZyB2YWx1ZXMgbmVlZGVkIHRvIGVuY29kZS9kZWNvZGUgdmFyaWFibGUtbGVuZ3RoIGludGVnZXJzIGluIG91ciBjdXN0b20gYnl0ZS1vcmRlcmVkCisgICAgLy8gZW5jb2Rpbmcgc2NoZW1lLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1NJVElWRV9WQVJJTlRfSEVBREVSID0gMHg4MDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVHQVRJVkVfVkFSSU5UX0xFTkdUSF9IRUFERVIgPSAweDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1NJVElWRV9WQVJJTlRfTEVOR1RIX0hFQURFUiA9IDB4RkY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBCSUdfSU5URUdFUl9ORUdBVElWRV9MRUFESU5HX1pFUk8gPSAoYnl0ZSkgMHhGRjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEJJR19JTlRFR0VSX1BPU0lUSVZFX0xFQURJTkdfWkVSTyA9IChieXRlKSAweDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTExfRk9STV9USFJFU0hPTEQgPSA3OworCiAgICAgcHJpdmF0ZSBzdGF0aWMgPFY+IGludCBmaW5kTW9zdFNpZ25pZmljYW50Qnl0ZShWIHZhbHVlLCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yKQogICAgIHsKICAgICAgICAgaW50IGxlbiA9IGFjY2Vzc29yLnNpemUodmFsdWUpIC0gMTsKQEAgLTEzMSw2ICsxNDUsMzAxIEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlci4KKyAgICAgKgorICAgICAqIEluIHRoZSBjdXJyZW50IGZvcm1hdCB3ZSByZXByZXNlbnQgaXQ6CisgICAgICogICAgZGlyZWN0bHkgYXMgdmFyaW50LCBpZiB0aGUgbGVuZ3RoIGlzIDYgb3Igc21hbGxlciAodGhlIGVuY29kaW5nIGhhcyBub24tMDAvRkYgZmlyc3QgYnl0ZSkKKyAgICAgKiAgICA8c2lnbmJ5dGU+PGxlbmd0aCBhcyB1bnNpZ25lZCBpbnRlZ2VyIC0gNz48NyBvciBtb3JlIGJ5dGVzPiwgb3RoZXJ3aXNlCisgICAgICogd2hlcmUgPHNpZ25ieXRlPiBpcyAwMCBmb3IgbmVnYXRpdmUgbnVtYmVycyBhbmQgRkYgZm9yIHBvc2l0aXZlIG9uZXMsIGFuZCB0aGUgbGVuZ3RoJ3MgYnl0ZXMgYXJlIGludmVydGVkIGlmCisgICAgICogdGhlIG51bWJlciBpcyBuZWdhdGl2ZSAoc28gdGhhdCBsb25nZXIgbGVuZ3RoIHNvcnRzIHNtYWxsZXIpLgorICAgICAqCisgICAgICogQmVjYXVzZSB3ZSBwcmVzZW50IHRoZSBzaWduIHNlcGFyYXRlbHksIHdlIGRvbid0IG5lZWQgdG8gaW5jbHVkZSAweDAwIHByZWZpeCBmb3IgcG9zaXRpdmUgaW50ZWdlcnMgd2hvc2UgZmlyc3QKKyAgICAgKiBieXRlIGlzID49IDB4ODAgb3IgMHhGRiBwcmVmaXggZm9yIG5lZ2F0aXZlIGludGVnZXJzIHdob3NlIGZpcnN0IGJ5dGUgaXMgPCAweDgwLiBOb3RlIHRoYXQgd2UgZG8gdGhpcyBiZWZvcmUKKyAgICAgKiB0YWtpbmcgdGhlIGxlbmd0aCBmb3IgdGhlIHB1cnBvc2VzIG9mIGNob29zaW5nIGJldHdlZW4gdmFyaW50IGFuZCBmdWxsLWZvcm0gZW5jb2RpbmcuCisgICAgICoKKyAgICAgKiBUaGUgcmVwcmVzZW50YXRpb25zIGFyZSBwcmVmaXgtZnJlZSwgYmVjYXVzZSB0aGUgY2hvaWNlIGJldHdlZW4gdmFyaW50IGFuZCBmdWxsLWZvcm0gZW5jb2RpbmcgaXMgZGV0ZXJtaW5lZCBieQorICAgICAqIHRoZSBmaXJzdCBieXRlIHdoZXJlIHZhcmludHMgYXJlIHByb3Blcmx5IG9yZGVyZWQgYmV0d2VlbiBmdWxsLWZvcm0gbmVnYXRpdmUgYW5kIGZ1bGwtZm9ybSBwb3NpdGl2ZSwgdmFyaW50CisgICAgICogZW5jb2RpbmcgaXMgcHJlZml4LWZyZWUsIGFuZCBmdWxsLWZvcm0gcmVwcmVzZW50YXRpb25zIG9mIGRpZmZlcmVudCBsZW5ndGggYWx3YXlzIGhhdmUgbGVuZ3RoIGJ5dGVzIHRoYXQgZGlmZmVyLgorICAgICAqCisgICAgICogRXhhbXBsZXM6CisgICAgICogICAgLTEgICAgICAgICAgICBhcyA3RgorICAgICAqICAgIDAgICAgICAgICAgICAgYXMgODAKKyAgICAgKiAgICAxICAgICAgICAgICAgIGFzIDgxCisgICAgICogICAgMTI3ICAgICAgICAgICBhcyBDMDdGCisgICAgICogICAgMjU1ICAgICAgICAgICBhcyBDMEZGCisgICAgICogICAgMl4zMi0xICAgICAgICBhcyBGOEZGRkZGRkZGCisgICAgICogICAgMl4zMiAgICAgICAgICBhcyBGOTAwMDAwMDAwCisgICAgICogICAgMl41Ni0xICAgICAgICBhcyBGRUZGRkZGRkZGRkZGRkZGCisgICAgICogICAgMl41NiAgICAgICAgICBhcyBGRjAwMDEwMDAwMDAwMDAwMDAwMAorICAgICAqCisgICAgICogU2VlIHtAbGluayAjYXNDb21wYXJhYmxlQnl0ZXNMZWdhY3l9IGZvciBkZXNjcmlwdGlvbiBvZiB0aGUgbGVnYWN5IGZvcm1hdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICBmaW5hbCBpbnQgbGltaXQgPSBhY2Nlc3Nvci5zaXplKGRhdGEpOworICAgICAgICBpZiAobGltaXQgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIHNraXAgYW55IGxlYWRpbmcgc2lnbi1vbmx5IGJ5dGUocykKKyAgICAgICAgaW50IHAgPSAwOworICAgICAgICBmaW5hbCBieXRlIHNpZ25ieXRlID0gYWNjZXNzb3IuZ2V0Qnl0ZShkYXRhLCBwKTsKKyAgICAgICAgaWYgKHNpZ25ieXRlID09IEJJR19JTlRFR0VSX05FR0FUSVZFX0xFQURJTkdfWkVSTyB8fCBzaWduYnl0ZSA9PSBCSUdfSU5URUdFUl9QT1NJVElWRV9MRUFESU5HX1pFUk8pCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChwICsgMSA8IGxpbWl0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChhY2Nlc3Nvci5nZXRCeXRlKGRhdGEsICsrcCkgIT0gc2lnbmJ5dGUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5MRUdBQ1kpCisgICAgICAgICAgICByZXR1cm4gKGxpbWl0IC0gcCA8IEZVTExfRk9STV9USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgICAgPyBlbmNvZGVBc1ZhckludChhY2Nlc3NvciwgZGF0YSwgbGltaXQpCisgICAgICAgICAgICAgICAgICAgOiBhc0NvbXBhcmFibGVCeXRlc0N1cnJlbnQoYWNjZXNzb3IsIGRhdGEsIHAsIGxpbWl0LCAoc2lnbmJ5dGUgPj4gNykgJiAweEZGKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGFzQ29tcGFyYWJsZUJ5dGVzTGVnYWN5KGFjY2Vzc29yLCBkYXRhLCBwLCBsaW1pdCwgc2lnbmJ5dGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZSB0aGUgQmlnSW50ZWdlciBzdG9yZWQgaW4gdGhlIGdpdmVuIGJ1ZmZlciBhcyBhIHZhcmlhYmxlLWxlbmd0aCBzaWduZWQgaW50ZWdlci4KKyAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSBudW1iZXIgaXMgZ2l2ZW4gaW4gdGhlIGxpbWl0IGFyZ3VtZW50LCBhbmQgbXVzdCBiZSA8PSA4LgorICAgICAqLworICAgIHByaXZhdGUgPFY+IEJ5dGVTb3VyY2UgZW5jb2RlQXNWYXJJbnQoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBpbnQgbGltaXQpCisgICAgeworICAgICAgICBsb25nIHY7CisgICAgICAgIHN3aXRjaCAobGltaXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICB2ID0gYWNjZXNzb3IuZ2V0Qnl0ZShkYXRhLCAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICB2ID0gYWNjZXNzb3IuZ2V0U2hvcnQoZGF0YSwgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgdiA9IChhY2Nlc3Nvci5nZXRTaG9ydChkYXRhLCAwKSA8PCA4KSB8IChhY2Nlc3Nvci5nZXRCeXRlKGRhdGEsIDIpICYgMHhGRik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgdiA9IGFjY2Vzc29yLmdldEludChkYXRhLCAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICB2ID0gKChsb25nKSBhY2Nlc3Nvci5nZXRJbnQoZGF0YSwgMCkgPDwgOCkgfCAoYWNjZXNzb3IuZ2V0Qnl0ZShkYXRhLCA0KSAmIDB4RkYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIHYgPSAoKGxvbmcpIGFjY2Vzc29yLmdldEludChkYXRhLCAwKSA8PCAxNikgfCAoYWNjZXNzb3IuZ2V0U2hvcnQoZGF0YSwgNCkgJiAweEZGRkYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgICAgIHYgPSAoKGxvbmcpIGFjY2Vzc29yLmdldEludChkYXRhLCAwKSA8PCAyNCkgfCAoKGFjY2Vzc29yLmdldFNob3J0KGRhdGEsIDQpICYgMHhGRkZGKSA8PCA4KSB8IChhY2Nlc3Nvci5nZXRCeXRlKGRhdGEsIDYpICYgMHhGRik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgcmVhY2hhYmxlIHdpdGhpbiB0aGUgZW5jb2Rpbmc7IGFkZGVkIGZvciBjb21wbGV0ZW5lc3MuCisgICAgICAgICAgICAgICAgdiA9IGFjY2Vzc29yLmdldExvbmcoZGF0YSwgMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCeXRlU291cmNlLnZhcmlhYmxlTGVuZ3RoSW50ZWdlcih2KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZnVsbC1mb3JtIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbnVtYmVyIGluIHRoZSBjdXJyZW50IGZvcm1hdC4KKyAgICAgKgorICAgICAqIFRoaXMgY29udGFpbnM6CisgICAgICogICAgPHNpZ25ieXRlPjxsZW5ndGggYXMgdW5zaWduZWQgaW50ZWdlciAtIDc+PDcgb3IgbW9yZSBieXRlcz4sIG90aGVyd2lzZQorICAgICAqIHdoZXJlIDxzaWduYnl0ZT4gaXMgMDAgZm9yIG5lZ2F0aXZlIG51bWJlcnMgYW5kIEZGIGZvciBwb3NpdGl2ZSBvbmVzLCBhbmQgdGhlIGxlbmd0aCdzIGJ5dGVzIGFyZSBpbnZlcnRlZCBpZgorICAgICAqIHRoZSBudW1iZXIgaXMgbmVnYXRpdmUgKHNvIHRoYXQgbG9uZ2VyIGxlbmd0aCBzb3J0cyBzbWFsbGVyKS4KKyAgICAgKgorICAgICAqIEJlY2F1c2Ugd2UgcHJlc2VudCB0aGUgc2lnbiBzZXBhcmF0ZWx5LCB3ZSBkb24ndCBuZWVkIHRvIGluY2x1ZGUgMHgwMCBwcmVmaXggZm9yIHBvc2l0aXZlIGludGVnZXJzIHdob3NlIGZpcnN0CisgICAgICogYnl0ZSBpcyA+PSAweDgwIG9yIDB4RkYgcHJlZml4IGZvciBuZWdhdGl2ZSBpbnRlZ2VycyB3aG9zZSBmaXJzdCBieXRlIGlzIDwgMHg4MC4KKyAgICAgKgorICAgICAqIFRoZSByZXByZXNlbnRhdGlvbnMgYXJlIHByZWZpeC1mcmVlLCBiZWNhdXNlIHJlcHJlc2VudGF0aW9ucyBvZiBkaWZmZXJlbnQgbGVuZ3RoIGFsd2F5cyBoYXZlIGxlbmd0aCBieXRlcyB0aGF0CisgICAgICogZGlmZmVyLgorICAgICAqLworICAgIHByaXZhdGUgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXNDdXJyZW50KFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgaW50IHN0YXJ0cG9zLCBpbnQgbGltaXQsIGludCBzaWduYnl0ZSkKKyAgICB7CisgICAgICAgIC8vIHN0YXJ0IHdpdGggc2lnbiBhcyBhIGJ5dGUsIHRoZW4gdmFyaWFibGUtbGVuZ3RoLWVuY29kZWQgbGVuZ3RoLCB0aGVuIGJ5dGVzIChzdHJpcHBlZCBsZWFkaW5nIHNpZ24pCisgICAgICAgIHJldHVybiBuZXcgQnl0ZVNvdXJjZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwb3MgPSAtMjsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2UgbGVuZ3RoRW5jb2RpbmcgPSBuZXcgVmFyaWFibGVMZW5ndGhVbnNpZ25lZEludGVnZXIobGltaXQgLSBzdGFydHBvcyAtIEZVTExfRk9STV9USFJFU0hPTEQpOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSAtMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICsrcG9zOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lnbmJ5dGUgXiAweEZGOyAvLyAwMCBmb3IgbmVnYXRpdmUvRkYgZm9yIHBvc2l0aXZlICgwMS1GRSBmb3IgZGlyZWN0IHZhcmludCBlbmNvZGluZykKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocG9zID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5leHRCeXRlID0gbGVuZ3RoRW5jb2RpbmcubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEJ5dGUgIT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0Qnl0ZSBeIHNpZ25ieXRlOworICAgICAgICAgICAgICAgICAgICBwb3MgPSBzdGFydHBvczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAocG9zID09IGxpbWl0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5EX09GX1NUUkVBTTsKKworICAgICAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5nZXRCeXRlKGRhdGEsIHBvcysrKSAmIDB4RkY7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbnVtYmVyIGluIHRoZSBsZWdhY3kgZm9ybWF0LgorICAgICAqIFdlIHJlcHJlc2VudCBpdCBhcworICAgICAqICAgIDx6ZXJvIG9yIG1vcmUgbGVuZ3RoX2J5dGVzIHdoZXJlIGxlbmd0aCA9IDEyOD4gPGxlbmd0aF9ieXRlPiA8Zmlyc3Rfc2lnbmlmaWNhbnRfYnl0ZT4gPHplcm8gb3IgbW9yZSBieXRlcz4KKyAgICAgKiB3aGVyZSBhIGxlbmd0aF9ieXRlIGlzOgorICAgICAqICAgIC0gMHg4MCArIChsZW5ndGggLSAxKSBmb3IgcG9zaXRpdmUgbnVtYmVycyAoc28gdGhhdCBsb25nZXIgbGVuZ3RoIHNvcnRzIGJpZ2dlcikKKyAgICAgKiAgICAtIDB4N0YgLSAobGVuZ3RoIC0gMSkgZm9yIG5lZ2F0aXZlIG51bWJlcnMgKHNvIHRoYXQgbG9uZ2VyIGxlbmd0aCBzb3J0cyBzbWFsbGVyKQorICAgICAqCisgICAgICogQmVjYXVzZSB3ZSBpbmNsdWRlIHRoZSBzaWduIGluIHRoZSBsZW5ndGggYnl0ZToKKyAgICAgKiAtIHVubGlrZSBmaXhlZC1sZW5ndGggaW50cywgd2UgZG9uJ3QgbmVlZCB0byBzaWduLWludmVydCB0aGUgZmlyc3Qgc2lnbmlmaWNhbnQgYnl0ZSwKKyAgICAgKiAtIHVubGlrZSBCaWdJbnRlZ2VyLCB3ZSBkb24ndCBuZWVkIHRvIGluY2x1ZGUgMHgwMCBwcmVmaXggZm9yIHBvc2l0aXZlIGludGVnZXJzIHdob3NlIGZpcnN0IGJ5dGUgaXMgPj0gMHg4MAorICAgICAqICAgb3IgMHhGRiBwcmVmaXggZm9yIG5lZ2F0aXZlIGludGVnZXJzIHdob3NlIGZpcnN0IGJ5dGUgaXMgPCAweDgwLgorICAgICAqCisgICAgICogVGhlIHJlcHJlc2VudGF0aW9ucyBhcmUgcHJlZml4LWZyZWUsIGJlY2F1c2UgcmVwcmVzZW50YXRpb25zIG9mIGRpZmZlcmVudCBsZW5ndGggYWx3YXlzIGhhdmUgbGVuZ3RoIGJ5dGVzIHRoYXQKKyAgICAgKiBkaWZmZXIuCisgICAgICoKKyAgICAgKiBFeGFtcGxlczoKKyAgICAgKiAgICAwICAgICAgICAgICAgIGFzIDgwMDAKKyAgICAgKiAgICAxICAgICAgICAgICAgIGFzIDgwMDEKKyAgICAgKiAgICAxMjcgICAgICAgICAgIGFzIDgwN0YKKyAgICAgKiAgICAyNTUgICAgICAgICAgIGFzIDgwRkYKKyAgICAgKiAgICAyXjMxLTEgICAgICAgIGFzIDgzN0ZGRkZGRkYKKyAgICAgKiAgICAyXjMxICAgICAgICAgIGFzIDgzODAwMDAwMDAKKyAgICAgKiAgICAyXjMyICAgICAgICAgIGFzIDg0MDEwMDAwMDAwMAorICAgICAqLworICAgIHByaXZhdGUgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXNMZWdhY3koVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBpbnQgc3RhcnRwb3MsIGludCBsaW1pdCwgaW50IHNpZ25ieXRlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlU291cmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBvcyA9IHN0YXJ0cG9zOworICAgICAgICAgICAgaW50IHNpemVUb1JlcG9ydCA9IGxpbWl0IC0gc3RhcnRwb3M7CisgICAgICAgICAgICBib29sZWFuIHNpemVSZXBvcnRlZCA9IGZhbHNlOworCisgICAgICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghc2l6ZVJlcG9ydGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVUb1JlcG9ydCA+PSAxMjgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVUb1JlcG9ydCAtPSAxMjg7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lnbmJ5dGUgPj0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gUE9TSVRJVkVfVkFSSU5UX0xFTkdUSF9IRUFERVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5FR0FUSVZFX1ZBUklOVF9MRU5HVEhfSEVBREVSOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZVJlcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWduYnl0ZSA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQT1NJVElWRV9WQVJJTlRfSEVBREVSICsgKHNpemVUb1JlcG9ydCAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQT1NJVElWRV9WQVJJTlRfSEVBREVSIC0gc2l6ZVRvUmVwb3J0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBsaW1pdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisKKyAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IuZ2V0Qnl0ZShkYXRhLCBwb3MrKykgJiAweEZGOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICBhc3NlcnQgdmVyc2lvbiAhPSBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLkxFR0FDWTsKKyAgICAgICAgaWYgKGNvbXBhcmFibGVCeXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmVtcHR5KCk7CisKKyAgICAgICAgLy8gQ29uc3VtZSB0aGUgZmlyc3QgYnl0ZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZW5jb2RlZCBudW1iZXIgaXMgcG9zaXRpdmUgYW5kCisgICAgICAgIC8vIHN0YXJ0IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBsZW5ndGggaGVhZGVyIGJ5dGVzIGFuZCBjb2xsZWN0aW5nIHRoZSBudW1iZXIgb2YgdmFsdWUgYnl0ZXMuCisgICAgICAgIGludCBzaWduID0gY29tcGFyYWJsZUJ5dGVzLnBlZWsoKSBeIDB4RkY7ICAgLy8gRkYgaWYgbmVnYXRpdmUsIDAwIGlmIHBvc2l0aXZlCisgICAgICAgIGlmIChzaWduICE9IDB4RkYgJiYgc2lnbiAhPSAweDAwKQorICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3RWYXJJbnRCeXRlcyhhY2Nlc3NvciwgQnl0ZVNvdXJjZUludmVyc2UuZ2V0VmFyaWFibGVMZW5ndGhJbnRlZ2VyKGNvbXBhcmFibGVCeXRlcykpOworCisgICAgICAgIC8vIGNvbnN1bWUgdGhlIHNpZ24gYnl0ZQorICAgICAgICBjb21wYXJhYmxlQnl0ZXMubmV4dCgpOworCisgICAgICAgIC8vIFJlYWQgdGhlIGxlbmd0aCAoaW52ZXJ0ZWQgaWYgdGhlIG51bWJlciBpcyBuZWdhdGl2ZSkKKyAgICAgICAgaW50IHZhbHVlQnl0ZXMgPSBNYXRoLnRvSW50RXhhY3QoQnl0ZVNvdXJjZUludmVyc2UuZ2V0VmFyaWFibGVMZW5ndGhVbnNpZ25lZEludGVnZXJYb3JpbmcoY29tcGFyYWJsZUJ5dGVzLCBzaWduKSArIEZVTExfRk9STV9USFJFU0hPTEQpOworICAgICAgICAvLyBHZXQgdGhlIGJ5dGVzLgorICAgICAgICByZXR1cm4gZXh0cmFjdEJ5dGVzKGFjY2Vzc29yLCBjb21wYXJhYmxlQnl0ZXMsIHNpZ24sIHZhbHVlQnl0ZXMpOworICAgIH0KKworICAgIHByaXZhdGUgPFY+IFYgZXh0cmFjdFZhckludEJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIGxvbmcgdmFsdWUpCisgICAgeworICAgICAgICBpbnQgbGVuZ3RoID0gKDY0IC0gTG9uZy5udW1iZXJPZkxlYWRpbmdaZXJvcyh2YWx1ZSBeICh2YWx1ZSA+PiA2MykpICsgOCkgLyA4OyAgIC8vIG51bWJlciBvZiBieXRlcyBuZWVkZWQ6IDcgYml0cyAtPiBvbmUgYnl0ZSwgOCBiaXRzIC0+IDIgYnl0ZXMKKyAgICAgICAgViBidWYgPSBhY2Nlc3Nvci5hbGxvY2F0ZShsZW5ndGgpOworICAgICAgICBzd2l0Y2ggKGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGFjY2Vzc29yLnB1dEJ5dGUoYnVmLCAwLCAoYnl0ZSkgdmFsdWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGFjY2Vzc29yLnB1dFNob3J0KGJ1ZiwgMCwgKHNob3J0KSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgYWNjZXNzb3IucHV0U2hvcnQoYnVmLCAwLCAoc2hvcnQpICh2YWx1ZSA+PiA4KSk7CisgICAgICAgICAgICAgICAgYWNjZXNzb3IucHV0Qnl0ZShidWYsIDIsIChieXRlKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgYWNjZXNzb3IucHV0SW50KGJ1ZiwgMCwgKGludCkgdmFsdWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgIGFjY2Vzc29yLnB1dEludChidWYsIDAsIChpbnQpICh2YWx1ZSA+PiA4KSk7CisgICAgICAgICAgICAgICAgYWNjZXNzb3IucHV0Qnl0ZShidWYsIDQsIChieXRlKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgYWNjZXNzb3IucHV0SW50KGJ1ZiwgMCwgKGludCkgKHZhbHVlID4+IDE2KSk7CisgICAgICAgICAgICAgICAgYWNjZXNzb3IucHV0U2hvcnQoYnVmLCA0LCAoc2hvcnQpIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci5wdXRJbnQoYnVmLCAwLCAoaW50KSAodmFsdWUgPj4gMjQpKTsKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci5wdXRTaG9ydChidWYsIDQsIChzaG9ydCkgKHZhbHVlID4+IDgpKTsKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci5wdXRCeXRlKGJ1ZiwgNiwgKGJ5dGUpIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCByZWFjaGFibGUgd2l0aGluIHRoZSBlbmNvZGluZzsgYWRkZWQgZm9yIGNvbXBsZXRlbmVzcy4KKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci5wdXRMb25nKGJ1ZiwgMCwgdmFsdWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIHByaXZhdGUgPFY+IFYgZXh0cmFjdEJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBpbnQgc2lnbiwgaW50IHZhbHVlQnl0ZXMpCisgICAgeworICAgICAgICBpbnQgd3JpdHRlbkJ5dGVzID0gMDsKKyAgICAgICAgViBidWY7CisgICAgICAgIC8vIEFkZCAibGVhZGluZyB6ZXJvIiBpZiBuZWVkZWQgKGkuZS4gaW4gY2FzZSB0aGUgbGVhZGluZyBieXRlIG9mIGEgcG9zaXRpdmUgbnVtYmVyIGNvcnJlc3BvbmRzIHRvIGEgbmVnYXRpdmUKKyAgICAgICAgLy8gdmFsdWUsIG9yIGluIGNhc2UgdGhlIGxlYWRpbmcgYnl0ZSBvZiBhIG5lZ2F0aXZlIG51bWJlciBjb3JyZXNwb25kcyB0byBhIG5vbi1uZWdhdGl2ZSB2YWx1ZSkuCisgICAgICAgIC8vIFNpemUgdGhlIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSB2YWx1ZSBieXRlcyBhY2NvcmRpbmdseS4KKyAgICAgICAgaW50IGN1cnIgPSBjb21wYXJhYmxlQnl0ZXMubmV4dCgpOworICAgICAgICBpZiAoKGN1cnIgJiAweDgwKSAhPSAoc2lnbiAmIDB4ODApKQorICAgICAgICB7CisgICAgICAgICAgICArK3ZhbHVlQnl0ZXM7CisgICAgICAgICAgICBidWYgPSBhY2Nlc3Nvci5hbGxvY2F0ZSh2YWx1ZUJ5dGVzKTsKKyAgICAgICAgICAgIGFjY2Vzc29yLnB1dEJ5dGUoYnVmLCB3cml0dGVuQnl0ZXMrKywgKGJ5dGUpIHNpZ24pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1ZiA9IGFjY2Vzc29yLmFsbG9jYXRlKHZhbHVlQnl0ZXMpOworICAgICAgICAvLyBEb24ndCBmb3JnZXQgdG8gYWRkIHRoZSBmaXJzdCBjb25zdW1lZCB2YWx1ZSBieXRlIGFmdGVyIGRldGVybWluaW5nIHdoZXRoZXIgbGVhZGluZyB6ZXJvIHNob3VsZCBiZSBhZGRlZAorICAgICAgICAvLyBhbmQgc2l6aW5nIHRoZSB2YWx1ZSBieXRlcyBhcnJheS4KKyAgICAgICAgYWNjZXNzb3IucHV0Qnl0ZShidWYsIHdyaXR0ZW5CeXRlcysrLCAoYnl0ZSkgY3Vycik7CisKKyAgICAgICAgLy8gQ29uc3VtZSBleGFjdGx5IHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgdmFsdWUgYnl0ZXMuCisgICAgICAgIHdoaWxlICh3cml0dGVuQnl0ZXMgPCB2YWx1ZUJ5dGVzKQorICAgICAgICAgICAgYWNjZXNzb3IucHV0Qnl0ZShidWYsIHdyaXR0ZW5CeXRlcysrLCAoYnl0ZSkgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgICAvLyBSZXR1cm4gYW4gZW1wdHkgQnl0ZUJ1ZmZlciBmb3IgYW4gZW1wdHkgc3RyaW5nLgpAQCAtMjUyLDQgKzU2MSw1NCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIGRlY29tcG9zZSh0b0JpZ0ludGVnZXIoaW5wdXQpLm5lZ2F0ZSgpKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBhYnMoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWNvbXBvc2UodG9CaWdJbnRlZ2VyKGlucHV0KS5hYnMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICBCaWdJbnRlZ2VyIGJpID0gdG9CaWdJbnRlZ2VyKGlucHV0KTsKKyAgICAgICAgQmlnRGVjaW1hbCBiZCA9IG5ldyBCaWdEZWNpbWFsKGJpKTsKKyAgICAgICAgQmlnRGVjaW1hbCByZXN1bHQgPSBEZWNpbWFsVHlwZS5pbnN0YW5jZS5leHAoYmQpOworICAgICAgICBCaWdJbnRlZ2VyIG91dCA9IHJlc3VsdC50b0JpZ0ludGVnZXIoKTsKKyAgICAgICAgcmV0dXJuIEludGVnZXJUeXBlLmluc3RhbmNlLmRlY29tcG9zZShvdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGxvZyhCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgQmlnSW50ZWdlciBiaSA9IHRvQmlnSW50ZWdlcihpbnB1dCk7CisgICAgICAgIGlmIChiaS5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA8PSAwKSB0aHJvdyBuZXcgQXJpdGhtZXRpY0V4Y2VwdGlvbigiTmF0dXJhbCBsb2cgb2YgbnVtYmVyIHplcm8gb3IgbGVzcyIpOworICAgICAgICBCaWdEZWNpbWFsIGJkID0gbmV3IEJpZ0RlY2ltYWwoYmkpOworICAgICAgICBCaWdEZWNpbWFsIHJlc3VsdCA9IERlY2ltYWxUeXBlLmluc3RhbmNlLmxvZyhiZCk7CisgICAgICAgIEJpZ0ludGVnZXIgb3V0ID0gcmVzdWx0LnRvQmlnSW50ZWdlcigpOworICAgICAgICByZXR1cm4gSW50ZWdlclR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKG91dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgbG9nMTAoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIEJpZ0ludGVnZXIgYmkgPSB0b0JpZ0ludGVnZXIoaW5wdXQpOworICAgICAgICBpZiAoYmkuY29tcGFyZVRvKEJpZ0ludGVnZXIuWkVSTykgPD0gMCkgdGhyb3cgbmV3IEFyaXRobWV0aWNFeGNlcHRpb24oIkxvZzEwIG9mIG51bWJlciB6ZXJvIG9yIGxlc3MiKTsKKyAgICAgICAgQmlnRGVjaW1hbCBiZCA9IG5ldyBCaWdEZWNpbWFsKGJpKTsKKyAgICAgICAgQmlnRGVjaW1hbCByZXN1bHQgPSBEZWNpbWFsVHlwZS5pbnN0YW5jZS5sb2cxMChiZCk7CisgICAgICAgIEJpZ0ludGVnZXIgb3V0ID0gcmVzdWx0LnRvQmlnSW50ZWdlcigpOworICAgICAgICByZXR1cm4gSW50ZWdlclR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKG91dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgcm91bmQoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5jbG9uZShpbnB1dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0xlZ2FjeVRpbWVVVUlEVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9MZWdhY3lUaW1lVVVJRFR5cGUuamF2YQppbmRleCA1MjhhM2U4Li42MjI4MGI5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0xlZ2FjeVRpbWVVVUlEVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTGVnYWN5VGltZVVVSURUeXBlLmphdmEKQEAgLTE3LDE4ICsxNywyOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWw7CiAKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVHlwZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVVVJRFNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiAKIC8vIEZ1bGx5IGNvbXBhdGlibGUgd2l0aCBVVUlELCBhbmQgaW5kZWVkIGlzIGludGVycHJldGVkIGFzIFVVSUQgZm9yIFVERgogcHVibGljIGNsYXNzIExlZ2FjeVRpbWVVVUlEVHlwZSBleHRlbmRzIEFic3RyYWN0VGltZVVVSURUeXBlPFVVSUQ+CiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMZWdhY3lUaW1lVVVJRFR5cGUgaW5zdGFuY2UgPSBuZXcgTGVnYWN5VGltZVVVSURUeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZShUaW1lVVVJRC5taW5BdFVuaXhNaWxsaXMoMCkuYXNVVUlEKCkpOworCiAgICAgcHVibGljIFR5cGVTZXJpYWxpemVyPFVVSUQ+IGdldFNlcmlhbGl6ZXIoKQogICAgIHsKICAgICAgICAgcmV0dXJuIFVVSURTZXJpYWxpemVyLmluc3RhbmNlOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9MZXhpY2FsVVVJRFR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTGV4aWNhbFVVSURUeXBlLmphdmEKaW5kZXggNmRkNDE2MS4uZWFjOTRhNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9MZXhpY2FsVVVJRFR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0xleGljYWxVVUlEVHlwZS5qYXZhCkBAIC0yNiwxMSArMjYsMTYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlVVSURTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CiAKIHB1YmxpYyBjbGFzcyBMZXhpY2FsVVVJRFR5cGUgZXh0ZW5kcyBBYnN0cmFjdFR5cGU8VVVJRD4KIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExleGljYWxVVUlEVHlwZSBpbnN0YW5jZSA9IG5ldyBMZXhpY2FsVVVJRFR5cGUoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gaW5zdGFuY2UuZGVjb21wb3NlKFVVSUQuZnJvbVN0cmluZygiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwIikpOworCiAgICAgTGV4aWNhbFVVSURUeXBlKCkKICAgICB7CiAgICAgICAgIHN1cGVyKENvbXBhcmlzb25UeXBlLkNVU1RPTSk7CkBAIC00OCw2ICs1Myw0NiBAQAogICAgICAgICByZXR1cm4gYWNjZXNzb3JMLnRvVVVJRChsZWZ0KS5jb21wYXJlVG8oYWNjZXNzb3JSLnRvVVVJRChyaWdodCkpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGlmIChkYXRhID09IG51bGwgfHwgYWNjZXNzb3IuaXNFbXB0eShkYXRhKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIC8vIGZpeGVkLWxlbmd0aCAoaGVuY2UgcHJlZml4LWZyZWUpIHJlcHJlc2VudGF0aW9uLCBidXQKKyAgICAgICAgLy8gd2UgaGF2ZSB0byBzaWduLWZsaXAgdGhlIGhpZ2hlc3QgYnl0ZXMgb2YgdGhlIHR3byBsb25ncworICAgICAgICByZXR1cm4gbmV3IEJ5dGVTb3VyY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYnVmcG9zID0gMDsKKworICAgICAgICAgICAgcHVibGljIGludCBuZXh0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmcG9zID49IGFjY2Vzc29yLnNpemUoZGF0YSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIGludCB2ID0gYWNjZXNzb3IuZ2V0Qnl0ZShkYXRhLCBidWZwb3MpICYgMHhGRjsKKyAgICAgICAgICAgICAgICBpZiAoYnVmcG9zID09IDAgfHwgYnVmcG9zID09IDgpCisgICAgICAgICAgICAgICAgICAgIHYgXj0gMHg4MDsKKyAgICAgICAgICAgICAgICArK2J1ZnBvczsKKyAgICAgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFYgZnJvbUNvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgLy8gT3B0aW9uYWwtc3R5bGUgZW5jb2Rpbmcgb2YgZW1wdHkgdmFsdWVzIGFzIG51bGwgc291cmNlcworICAgICAgICBpZiAoY29tcGFyYWJsZUJ5dGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IuZW1wdHkoKTsKKworICAgICAgICBsb25nIGhpQml0cyA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZExvbmcoY29tcGFyYWJsZUJ5dGVzKTsKKyAgICAgICAgbG9uZyBsb0JpdHMgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRTaWduZWRMb25nKGNvbXBhcmFibGVCeXRlcyk7CisKKyAgICAgICAgLy8gTGV4aWNhbCBVVUlEcyBhcmUgc3RvcmVkIGFzIGp1c3QgdHdvIHNpZ25lZCBsb25ncy4gVGhlIGRlY29kaW5nIG9mIHRoZXNlIGxvbmdzIGZsaXBzIHRoZWlyIHNpZ24gYml0IGJhY2ssIHNvCisgICAgICAgIC8vIHRoZXkgY2FuIGRpcmVjdGx5IGJlIHVzZWQgZm9yIGNvbnN0cnVjdGluZyB0aGUgb3JpZ2luYWwgVVVJRC4KKyAgICAgICAgcmV0dXJuIFVVSURUeXBlLm1ha2VVdWlkQnl0ZXMoYWNjZXNzb3IsIGhpQml0cywgbG9CaXRzKTsKKyAgICB9CisKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgICAvLyBSZXR1cm4gYW4gZW1wdHkgQnl0ZUJ1ZmZlciBmb3IgYW4gZW1wdHkgc3RyaW5nLgpAQCAtODgsNCArMTMzLDEwIEBACiAgICAgewogICAgICAgICByZXR1cm4gMTY7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0xpc3RUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0xpc3RUeXBlLmphdmEKaW5kZXggMjgxZjdlZS4uMTU5NjgwZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9MaXN0VHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTGlzdFR5cGUuamF2YQpAQCAtMTgsMjEgKzE4LDI1IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWw7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkpzb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5MaXN0czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlRlcm07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5TeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuQ29sbGVjdGlvblNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTGlzdFNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZS5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CiAKIHB1YmxpYyBjbGFzcyBMaXN0VHlwZTxUPiBleHRlbmRzIENvbGxlY3Rpb25UeXBlPExpc3Q8VD4+CiB7CkBAIC0xNTYsMTQgKzE2MCwxNCBAQAogICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZVdpdGhGcm96ZW4oQ29sbGVjdGlvblR5cGU8Pz4gcHJldmlvdXMpCiAgICAgewogICAgICAgICBhc3NlcnQgIWlzTXVsdGlDZWxsOwotICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5pc0NvbXBhdGlibGVXaXRoKCgoTGlzdFR5cGUpIHByZXZpb3VzKS5lbGVtZW50cyk7CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLmlzQ29tcGF0aWJsZVdpdGgoKChMaXN0VHlwZTw/PikgcHJldmlvdXMpLmVsZW1lbnRzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbHVlQ29tcGF0aWJsZVdpdGhGcm96ZW4oQ29sbGVjdGlvblR5cGU8Pz4gcHJldmlvdXMpCiAgICAgewogICAgICAgICBhc3NlcnQgIWlzTXVsdGlDZWxsOwotICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5pc1ZhbHVlQ29tcGF0aWJsZVdpdGhJbnRlcm5hbCgoKExpc3RUeXBlKSBwcmV2aW91cykuZWxlbWVudHMpOworICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5pc1ZhbHVlQ29tcGF0aWJsZVdpdGhJbnRlcm5hbCgoKExpc3RUeXBlPD8+KSBwcmV2aW91cykuZWxlbWVudHMpOwogICAgIH0KIAogICAgIHB1YmxpYyA8VkwsIFZSPiBpbnQgY29tcGFyZUN1c3RvbShWTCBsZWZ0LCBWYWx1ZUFjY2Vzc29yPFZMPiBhY2Nlc3NvckwsIFZSIHJpZ2h0LCBWYWx1ZUFjY2Vzc29yPFZSPiBhY2Nlc3NvclIpCkBAIC0xNzEsMjkgKzE3NSwxNiBAQAogICAgICAgICByZXR1cm4gY29tcGFyZUxpc3RPclNldChlbGVtZW50cywgbGVmdCwgYWNjZXNzb3JMLCByaWdodCwgYWNjZXNzb3JSKTsKICAgICB9CiAKLSAgICBzdGF0aWMgPFZMLCBWUj4gaW50IGNvbXBhcmVMaXN0T3JTZXQoQWJzdHJhY3RUeXBlPD8+IGVsZW1lbnRzQ29tcGFyYXRvciwgVkwgbGVmdCwgVmFsdWVBY2Nlc3NvcjxWTD4gYWNjZXNzb3JMLCBWUiByaWdodCwgVmFsdWVBY2Nlc3NvcjxWUj4gYWNjZXNzb3JSKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIFZlcnNpb24gdmVyc2lvbikKICAgICB7Ci0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgdXNlZCBpZiB0aGUgY29sbGVjdGlvbiBpcyBmcm96ZW4KLSAgICAgICAgaWYgKGFjY2Vzc29yTC5pc0VtcHR5KGxlZnQpIHx8IGFjY2Vzc29yUi5pc0VtcHR5KHJpZ2h0KSkKLSAgICAgICAgICAgIHJldHVybiBCb29sZWFuLmNvbXBhcmUoYWNjZXNzb3JSLmlzRW1wdHkocmlnaHQpLCBhY2Nlc3NvckwuaXNFbXB0eShsZWZ0KSk7CisgICAgICAgIHJldHVybiBhc0NvbXBhcmFibGVCeXRlc0xpc3RPclNldChnZXRFbGVtZW50c1R5cGUoKSwgYWNjZXNzb3IsIGRhdGEsIHZlcnNpb24pOworICAgIH0KIAotICAgICAgICBpbnQgc2l6ZUwgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkQ29sbGVjdGlvblNpemUobGVmdCwgYWNjZXNzb3JMLCBQcm90b2NvbFZlcnNpb24uVjMpOwotICAgICAgICBpbnQgb2Zmc2V0TCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZkNvbGxlY3Rpb25TaXplKHNpemVMLCBQcm90b2NvbFZlcnNpb24uVjMpOwotICAgICAgICBpbnQgc2l6ZVIgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkQ29sbGVjdGlvblNpemUocmlnaHQsIGFjY2Vzc29yUiwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgaW50IG9mZnNldFIgPSBUeXBlU2l6ZXMuSU5UX1NJWkU7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNYXRoLm1pbihzaXplTCwgc2l6ZVIpOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZMIHYxID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKGxlZnQsIGFjY2Vzc29yTCwgb2Zmc2V0TCwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgICAgIG9mZnNldEwgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUodjEsIGFjY2Vzc29yTCwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgICAgIFZSIHYyID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKHJpZ2h0LCBhY2Nlc3NvclIsIG9mZnNldFIsIFByb3RvY29sVmVyc2lvbi5WMyk7Ci0gICAgICAgICAgICBvZmZzZXRSICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKHYyLCBhY2Nlc3NvclIsIFByb3RvY29sVmVyc2lvbi5WMyk7Ci0gICAgICAgICAgICBpbnQgY21wID0gZWxlbWVudHNDb21wYXJhdG9yLmNvbXBhcmUodjEsIGFjY2Vzc29yTCwgdjIsIGFjY2Vzc29yUik7Ci0gICAgICAgICAgICBpZiAoY21wICE9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNtcDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzaXplTCA9PSBzaXplUiA/IDAgOiAoc2l6ZUwgPCBzaXplUiA/IC0xIDogMSk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBWIGZyb21Db21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBmcm9tQ29tcGFyYWJsZUJ5dGVzTGlzdE9yU2V0KGFjY2Vzc29yLCBjb21wYXJhYmxlQnl0ZXMsIHZlcnNpb24sIGdldEVsZW1lbnRzVHlwZSgpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTIyNCwxMyArMjE1LDEzIEBACiAgICAgcHVibGljIFRlcm0gZnJvbUpTT05PYmplY3QoT2JqZWN0IHBhcnNlZCkgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGlmIChwYXJzZWQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgICAgICBwYXJzZWQgPSBKc29uLmRlY29kZUpzb24oKFN0cmluZykgcGFyc2VkKTsKKyAgICAgICAgICAgIHBhcnNlZCA9IEpzb25VdGlscy5kZWNvZGVKc29uKChTdHJpbmcpIHBhcnNlZCk7CiAKICAgICAgICAgaWYgKCEocGFyc2VkIGluc3RhbmNlb2YgTGlzdCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYSBsaXN0LCBidXQgZ290IGEgJXM6ICVzIiwgcGFyc2VkLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBwYXJzZWQpKTsKIAotICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgcGFyc2VkOworICAgICAgICBMaXN0PD8+IGxpc3QgPSAoTGlzdDw/PikgcGFyc2VkOwogICAgICAgICBMaXN0PFRlcm0+IHRlcm1zID0gbmV3IEFycmF5TGlzdDw+KGxpc3Quc2l6ZSgpKTsKICAgICAgICAgZm9yIChPYmplY3QgZWxlbWVudCA6IGxpc3QpCiAgICAgICAgIHsKQEAgLTI0MiwyMyArMjMzLDYgQEAKICAgICAgICAgcmV0dXJuIG5ldyBMaXN0cy5EZWxheWVkVmFsdWUodGVybXMpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNldE9yTGlzdFRvSnNvblN0cmluZyhCeXRlQnVmZmVyIGJ1ZmZlciwgQWJzdHJhY3RUeXBlIGVsZW1lbnRzVHlwZSwgUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbikKLSAgICB7Ci0gICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBidWZmZXIuZHVwbGljYXRlKCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiWyIpOwotICAgICAgICBpbnQgc2l6ZSA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRDb2xsZWN0aW9uU2l6ZSh2YWx1ZSwgcHJvdG9jb2xWZXJzaW9uKTsKLSAgICAgICAgaW50IG9mZnNldCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZkNvbGxlY3Rpb25TaXplKHNpemUsIHByb3RvY29sVmVyc2lvbik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgQnl0ZUJ1ZmZlciBlbGVtZW50ID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCwgcHJvdG9jb2xWZXJzaW9uKTsKLSAgICAgICAgICAgIG9mZnNldCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZShlbGVtZW50LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHByb3RvY29sVmVyc2lvbik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoZWxlbWVudHNUeXBlLnRvSlNPTlN0cmluZyhlbGVtZW50LCBwcm90b2NvbFZlcnNpb24pKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2IuYXBwZW5kKCJdIikudG9TdHJpbmcoKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRTbGljZUZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgY29sbGVjdGlvbiwgQnl0ZUJ1ZmZlciBmcm9tLCBCeXRlQnVmZmVyIHRvKQogICAgIHsKICAgICAgICAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBzbGljaW5nIG9uIGxpc3RzIHNvIHdlIGRvbid0IG5lZWQgdGhhdCBmdW5jdGlvbgpAQCAtMjcwLDQgKzI0NCwxNiBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIHNldE9yTGlzdFRvSnNvblN0cmluZyhidWZmZXIsIGVsZW1lbnRzLCBwcm90b2NvbFZlcnNpb24pOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZvckVhY2goQnl0ZUJ1ZmZlciBpbnB1dCwgQ29uc3VtZXI8Qnl0ZUJ1ZmZlcj4gYWN0aW9uKQorICAgIHsKKyAgICAgICAgc2VyaWFsaXplci5mb3JFYWNoKGlucHV0LCBhY3Rpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWNvbXBvc2UoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTG9uZ1R5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTG9uZ1R5cGUuamF2YQppbmRleCBhZDUzOWY3Li5jODA5NWZjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0xvbmdUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Mb25nVHlwZS5qYXZhCkBAIC0yOCwxMSArMjgsMTYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIAogcHVibGljIGNsYXNzIExvbmdUeXBlIGV4dGVuZHMgTnVtYmVyVHlwZTxMb25nPgogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9uZ1R5cGUgaW5zdGFuY2UgPSBuZXcgTG9uZ1R5cGUoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gaW5zdGFuY2UuZGVjb21wb3NlKDBMKTsKKwogICAgIExvbmdUeXBlKCkge3N1cGVyKENvbXBhcmlzb25UeXBlLkNVU1RPTSk7fSAvLyBzaW5nbGV0b24KIAogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHlWYWx1ZU1lYW5pbmdsZXNzKCkKQEAgLTU3LDYgKzYyLDI4IEBACiAgICAgICAgIHJldHVybiBWYWx1ZUFjY2Vzc29yLmNvbXBhcmUobGVmdCwgYWNjZXNzb3JMLCByaWdodCwgYWNjZXNzb3JSKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICBpZiAoYWNjZXNzb3IuaXNFbXB0eShkYXRhKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBpZiAodmVyc2lvbiA9PSBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLkxFR0FDWSkKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLnNpZ25lZEZpeGVkTGVuZ3RoTnVtYmVyKGFjY2Vzc29yLCBkYXRhKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2UudmFyaWFibGVMZW5ndGhJbnRlZ2VyKGFjY2Vzc29yLmdldExvbmcoZGF0YSwgMCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICBpZiAoY29tcGFyYWJsZUJ5dGVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IuZW1wdHkoKTsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5MRUdBQ1kpCisgICAgICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZUludmVyc2UuZ2V0U2lnbmVkRml4ZWRMZW5ndGgoYWNjZXNzb3IsIGNvbXBhcmFibGVCeXRlcywgOCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci52YWx1ZU9mKEJ5dGVTb3VyY2VJbnZlcnNlLmdldFZhcmlhYmxlTGVuZ3RoSW50ZWdlcihjb21wYXJhYmxlQnl0ZXMpKTsKKyAgICB9CisKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgICAvLyBSZXR1cm4gYW4gZW1wdHkgQnl0ZUJ1ZmZlciBmb3IgYW4gZW1wdHkgc3RyaW5nLgpAQCAtMTczLDQgKzIwMCw0MCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKC10b0xvbmcoaW5wdXQpKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBhYnMoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcyhNYXRoLmFicyh0b0xvbmcoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZXhwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGxvbmcpIE1hdGguZXhwKHRvTG9uZyhpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBsb2coQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygobG9uZykgTWF0aC5sb2codG9Mb25nKGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGxvZzEwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKGxvbmcpIE1hdGgubG9nMTAodG9Mb25nKGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIHJvdW5kKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuY2xvbmUoaW5wdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBNQVNLRURfVkFMVUU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9NYXBUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL01hcFR5cGUuamF2YQppbmRleCA5NDczZTI5Li40MGNkOGJmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL01hcFR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL01hcFR5cGUuamF2YQpAQCAtMTgsMTkgKzE4LDMwIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWw7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Kc29uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuTWFwczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlRlcm07CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlN5bnRheEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5Db2xsZWN0aW9uU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcFNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZS5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIAogcHVibGljIGNsYXNzIE1hcFR5cGU8SywgVj4gZXh0ZW5kcyBDb2xsZWN0aW9uVHlwZTxNYXA8SywgVj4+CkBAIC0xNjYsNyArMTc3LDcgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGVXaXRoRnJvemVuKENvbGxlY3Rpb25UeXBlPD8+IHByZXZpb3VzKQogICAgIHsKICAgICAgICAgYXNzZXJ0ICFpc011bHRpQ2VsbDsKLSAgICAgICAgTWFwVHlwZSB0cHJldiA9IChNYXBUeXBlKSBwcmV2aW91czsKKyAgICAgICAgTWFwVHlwZTw/LCA/PiB0cHJldiA9IChNYXBUeXBlPD8sID8+KSBwcmV2aW91czsKICAgICAgICAgcmV0dXJuIGtleXMuaXNDb21wYXRpYmxlV2l0aCh0cHJldi5rZXlzKSAmJiB2YWx1ZXMuaXNDb21wYXRpYmxlV2l0aCh0cHJldi52YWx1ZXMpOwogICAgIH0KIApAQCAtMTc0LDcgKzE4NSw3IEBACiAgICAgcHVibGljIGJvb2xlYW4gaXNWYWx1ZUNvbXBhdGlibGVXaXRoRnJvemVuKENvbGxlY3Rpb25UeXBlPD8+IHByZXZpb3VzKQogICAgIHsKICAgICAgICAgYXNzZXJ0ICFpc011bHRpQ2VsbDsKLSAgICAgICAgTWFwVHlwZSB0cHJldiA9IChNYXBUeXBlKSBwcmV2aW91czsKKyAgICAgICAgTWFwVHlwZTw/LCA/PiB0cHJldiA9IChNYXBUeXBlPD8sID8+KSBwcmV2aW91czsKICAgICAgICAgcmV0dXJuIGtleXMuaXNDb21wYXRpYmxlV2l0aCh0cHJldi5rZXlzKSAmJiB2YWx1ZXMuaXNWYWx1ZUNvbXBhdGlibGVXaXRoKHRwcmV2LnZhbHVlcyk7CiAgICAgfQogCkBAIC0xODksMzMgKzIwMCw5NSBAQAogICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uY29tcGFyZShhY2Nlc3NvclIuaXNFbXB0eShyaWdodCksIGFjY2Vzc29yTC5pc0VtcHR5KGxlZnQpKTsKIAogCi0gICAgICAgIFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24gPSBQcm90b2NvbFZlcnNpb24uVjM7Ci0gICAgICAgIGludCBzaXplTCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRDb2xsZWN0aW9uU2l6ZShsZWZ0LCBhY2Nlc3NvckwsIHByb3RvY29sVmVyc2lvbik7Ci0gICAgICAgIGludCBzaXplUiA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRDb2xsZWN0aW9uU2l6ZShyaWdodCwgYWNjZXNzb3JSLCBwcm90b2NvbFZlcnNpb24pOworICAgICAgICBpbnQgc2l6ZUwgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkQ29sbGVjdGlvblNpemUobGVmdCwgYWNjZXNzb3JMKTsKKyAgICAgICAgaW50IHNpemVSID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZENvbGxlY3Rpb25TaXplKHJpZ2h0LCBhY2Nlc3NvclIpOwogCi0gICAgICAgIGludCBvZmZzZXRMID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mQ29sbGVjdGlvblNpemUoc2l6ZUwsIHByb3RvY29sVmVyc2lvbik7Ci0gICAgICAgIGludCBvZmZzZXRSID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mQ29sbGVjdGlvblNpemUoc2l6ZVIsIHByb3RvY29sVmVyc2lvbik7CisgICAgICAgIGludCBvZmZzZXRMID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mQ29sbGVjdGlvblNpemUoKTsKKyAgICAgICAgaW50IG9mZnNldFIgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZDb2xsZWN0aW9uU2l6ZSgpOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTWF0aC5taW4oc2l6ZUwsIHNpemVSKTsgaSsrKQogICAgICAgICB7Ci0gICAgICAgICAgICBUTCBrMSA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShsZWZ0LCBhY2Nlc3NvckwsIG9mZnNldEwsIHByb3RvY29sVmVyc2lvbik7Ci0gICAgICAgICAgICBvZmZzZXRMICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKGsxLCBhY2Nlc3NvckwsIHByb3RvY29sVmVyc2lvbik7Ci0gICAgICAgICAgICBUUiBrMiA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShyaWdodCwgYWNjZXNzb3JSLCBvZmZzZXRSLCBwcm90b2NvbFZlcnNpb24pOwotICAgICAgICAgICAgb2Zmc2V0UiArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZShrMiwgYWNjZXNzb3JSLCBwcm90b2NvbFZlcnNpb24pOworICAgICAgICAgICAgVEwgazEgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUobGVmdCwgYWNjZXNzb3JMLCBvZmZzZXRMKTsKKyAgICAgICAgICAgIG9mZnNldEwgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUoazEsIGFjY2Vzc29yTCk7CisgICAgICAgICAgICBUUiBrMiA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShyaWdodCwgYWNjZXNzb3JSLCBvZmZzZXRSKTsKKyAgICAgICAgICAgIG9mZnNldFIgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUoazIsIGFjY2Vzc29yUik7CiAgICAgICAgICAgICBpbnQgY21wID0ga2V5c0NvbXBhcmF0b3IuY29tcGFyZShrMSwgYWNjZXNzb3JMLCBrMiwgYWNjZXNzb3JSKTsKICAgICAgICAgICAgIGlmIChjbXAgIT0gMCkKICAgICAgICAgICAgICAgICByZXR1cm4gY21wOwogCi0gICAgICAgICAgICBUTCB2MSA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShsZWZ0LCBhY2Nlc3NvckwsIG9mZnNldEwsIHByb3RvY29sVmVyc2lvbik7Ci0gICAgICAgICAgICBvZmZzZXRMICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKHYxLCBhY2Nlc3NvckwsIHByb3RvY29sVmVyc2lvbik7Ci0gICAgICAgICAgICBUUiB2MiA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShyaWdodCwgYWNjZXNzb3JSLCBvZmZzZXRSLCBwcm90b2NvbFZlcnNpb24pOwotICAgICAgICAgICAgb2Zmc2V0UiArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZSh2MiwgYWNjZXNzb3JSLCBwcm90b2NvbFZlcnNpb24pOworICAgICAgICAgICAgVEwgdjEgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUobGVmdCwgYWNjZXNzb3JMLCBvZmZzZXRMKTsKKyAgICAgICAgICAgIG9mZnNldEwgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUodjEsIGFjY2Vzc29yTCk7CisgICAgICAgICAgICBUUiB2MiA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZShyaWdodCwgYWNjZXNzb3JSLCBvZmZzZXRSKTsKKyAgICAgICAgICAgIG9mZnNldFIgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUodjIsIGFjY2Vzc29yUik7CiAgICAgICAgICAgICBjbXAgPSB2YWx1ZXNDb21wYXJhdG9yLmNvbXBhcmUodjEsIGFjY2Vzc29yTCwgdjIsIGFjY2Vzc29yUik7CiAgICAgICAgICAgICBpZiAoY21wICE9IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIGNtcDsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBzaXplTCA9PSBzaXplUiA/IDAgOiAoc2l6ZUwgPCBzaXplUiA/IC0xIDogMSk7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLmNvbXBhcmUoc2l6ZUwsIHNpemVSKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxUPiBhY2Nlc3NvciwgVCBkYXRhLCBWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gYXNDb21wYXJhYmxlQnl0ZXNNYXAoZ2V0S2V5c1R5cGUoKSwgZ2V0VmFsdWVzVHlwZSgpLCBhY2Nlc3NvciwgZGF0YSwgdmVyc2lvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBUIGZyb21Db21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxUPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBmcm9tQ29tcGFyYWJsZUJ5dGVzTWFwKGFjY2Vzc29yLCBjb21wYXJhYmxlQnl0ZXMsIHZlcnNpb24sIGdldEtleXNUeXBlKCksIGdldFZhbHVlc1R5cGUoKSk7CisgICAgfQorCisgICAgc3RhdGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzTWFwKEFic3RyYWN0VHlwZTw/PiBrZXlzQ29tcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHZhbHVlc0NvbXBhcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaWYgKGFjY2Vzc29yLmlzRW1wdHkoZGF0YSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICAgICAgaW50IHNpemUgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkQ29sbGVjdGlvblNpemUoZGF0YSwgYWNjZXNzb3IpOworICAgICAgICBvZmZzZXQgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mQ29sbGVjdGlvblNpemUoKTsKKyAgICAgICAgQnl0ZVNvdXJjZVtdIHNyY3MgPSBuZXcgQnl0ZVNvdXJjZVtzaXplICogMl07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBWIGsgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUoZGF0YSwgYWNjZXNzb3IsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUoaywgYWNjZXNzb3IpOworICAgICAgICAgICAgc3Jjc1tpICogMiArIDBdID0ga2V5c0NvbXBhcmF0b3IuYXNDb21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIGssIHZlcnNpb24pOworICAgICAgICAgICAgViB2ID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKGRhdGEsIGFjY2Vzc29yLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKHYsIGFjY2Vzc29yKTsKKyAgICAgICAgICAgIHNyY3NbaSAqIDIgKyAxXSA9IHZhbHVlc0NvbXBhcmF0b3IuYXNDb21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIHYsIHZlcnNpb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yTWF5YmVMZWdhY3kodmVyc2lvbiwgMHgwMCwgc3Jjcyk7CisgICAgfQorCisgICAgc3RhdGljIDxWPiBWIGZyb21Db21wYXJhYmxlQnl0ZXNNYXAoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGtleXNDb21wYXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB2YWx1ZXNDb21wYXJhdG9yKQorICAgIHsKKyAgICAgICAgaWYgKGNvbXBhcmFibGVCeXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmVtcHR5KCk7CisgICAgICAgIGFzc2VydCB2ZXJzaW9uICE9IEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uTEVHQUNZOyAvLyBsZWdhY3kgdHJhbnNsYXRpb24gaXMgbm90IHJldmVyc2libGUKKworICAgICAgICBMaXN0PFY+IGJ1ZmZlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgaW50IHNlcGFyYXRvciA9IGNvbXBhcmFibGVCeXRlcy5uZXh0KCk7CisgICAgICAgIHdoaWxlIChzZXBhcmF0b3IgIT0gQnl0ZVNvdXJjZS5URVJNSU5BVE9SKQorICAgICAgICB7CisgICAgICAgICAgICBidWZmZXJzLmFkZChCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50TnVsbChzZXBhcmF0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgIDoga2V5c0NvbXBhcmF0b3IuZnJvbUNvbXBhcmFibGVCeXRlcyhhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICBzZXBhcmF0b3IgPSBjb21wYXJhYmxlQnl0ZXMubmV4dCgpOworICAgICAgICAgICAgYnVmZmVycy5hZGQoQnl0ZVNvdXJjZUludmVyc2UubmV4dENvbXBvbmVudE51bGwoc2VwYXJhdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICA6IHZhbHVlc0NvbXBhcmF0b3IuZnJvbUNvbXBhcmFibGVCeXRlcyhhY2Nlc3NvciwgY29tcGFyYWJsZUJ5dGVzLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICBzZXBhcmF0b3IgPSBjb21wYXJhYmxlQnl0ZXMubmV4dCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGJ1ZmZlcnMsIGFjY2Vzc29yLGJ1ZmZlcnMuc2l6ZSgpIC8gMik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yNjAsMTUgKzMzMywxNSBAQAogICAgIHB1YmxpYyBUZXJtIGZyb21KU09OT2JqZWN0KE9iamVjdCBwYXJzZWQpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpZiAocGFyc2VkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgcGFyc2VkID0gSnNvbi5kZWNvZGVKc29uKChTdHJpbmcpIHBhcnNlZCk7CisgICAgICAgICAgICBwYXJzZWQgPSBKc29uVXRpbHMuZGVjb2RlSnNvbigoU3RyaW5nKSBwYXJzZWQpOwogCiAgICAgICAgIGlmICghKHBhcnNlZCBpbnN0YW5jZW9mIE1hcCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYSBtYXAsIGJ1dCBnb3QgYSAlczogJXMiLCBwYXJzZWQuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksIHBhcnNlZCkpOwogCi0gICAgICAgIE1hcDxPYmplY3QsIE9iamVjdD4gbWFwID0gKE1hcDxPYmplY3QsIE9iamVjdD4pIHBhcnNlZDsKKyAgICAgICAgTWFwPD8sID8+IG1hcCA9IChNYXA8PywgPz4pIHBhcnNlZDsKICAgICAgICAgTWFwPFRlcm0sIFRlcm0+IHRlcm1zID0gbmV3IEhhc2hNYXA8PihtYXAuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpCisgICAgICAgIGZvciAoTWFwLkVudHJ5PD8sID8+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKSA9PSBudWxsKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJJbnZhbGlkIG51bGwga2V5IGluIG1hcCIpOwpAQCAtMjg2LDI3ICszNTksMzkgQEAKICAgICB7CiAgICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBidWZmZXIuZHVwbGljYXRlKCk7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigieyIpOwotICAgICAgICBpbnQgc2l6ZSA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRDb2xsZWN0aW9uU2l6ZSh2YWx1ZSwgcHJvdG9jb2xWZXJzaW9uKTsKLSAgICAgICAgaW50IG9mZnNldCA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZkNvbGxlY3Rpb25TaXplKHNpemUsIHByb3RvY29sVmVyc2lvbik7CisgICAgICAgIGludCBzaXplID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZENvbGxlY3Rpb25TaXplKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOworICAgICAgICBpbnQgb2Zmc2V0ID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mQ29sbGVjdGlvblNpemUoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChpID4gMCkKICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CiAKICAgICAgICAgICAgIC8vIG1hcCBrZXlzIG11c3QgYmUgSlNPTiBzdHJpbmdzLCBzbyBjb252ZXJ0IG5vbi1zdHJpbmcga2V5cyB0byBzdHJpbmdzCi0gICAgICAgICAgICBCeXRlQnVmZmVyIGt2ID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCwgcHJvdG9jb2xWZXJzaW9uKTsKLSAgICAgICAgICAgIG9mZnNldCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZShrdiwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBwcm90b2NvbFZlcnNpb24pOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBrdiA9IENvbGxlY3Rpb25TZXJpYWxpemVyLnJlYWRWYWx1ZSh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQpOworICAgICAgICAgICAgb2Zmc2V0ICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKGt2LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOwogICAgICAgICAgICAgU3RyaW5nIGtleSA9IGtleXMudG9KU09OU3RyaW5nKGt2LCBwcm90b2NvbFZlcnNpb24pOwogICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKCJcIiIpKQogICAgICAgICAgICAgICAgIHNiLmFwcGVuZChrZXkpOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnIicpLmFwcGVuZChKc29uLnF1b3RlQXNKc29uU3RyaW5nKGtleSkpLmFwcGVuZCgnIicpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnIicpLmFwcGVuZChKc29uVXRpbHMucXVvdGVBc0pzb25TdHJpbmcoa2V5KSkuYXBwZW5kKCciJyk7CiAKICAgICAgICAgICAgIHNiLmFwcGVuZCgiOiAiKTsKLSAgICAgICAgICAgIEJ5dGVCdWZmZXIgdnYgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5yZWFkVmFsdWUodmFsdWUsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgb2Zmc2V0LCBwcm90b2NvbFZlcnNpb24pOwotICAgICAgICAgICAgb2Zmc2V0ICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKHZ2LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHByb3RvY29sVmVyc2lvbik7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHZ2ID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCk7CisgICAgICAgICAgICBvZmZzZXQgKz0gQ29sbGVjdGlvblNlcmlhbGl6ZXIuc2l6ZU9mVmFsdWUodnYsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CiAgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWVzLnRvSlNPTlN0cmluZyh2diwgcHJvdG9jb2xWZXJzaW9uKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHNiLmFwcGVuZCgifSIpLnRvU3RyaW5nKCk7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZm9yRWFjaChCeXRlQnVmZmVyIGlucHV0LCBDb25zdW1lcjxCeXRlQnVmZmVyPiBhY3Rpb24pCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVjb21wb3NlKENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvTnVtYmVyVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9OdW1iZXJUeXBlLmphdmEKaW5kZXggOWU3Njk3Zi4uNWIxMDcyMCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9OdW1iZXJUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9OdW1iZXJUeXBlLmphdmEKQEAgLTIyMCw0ICsyMjAsNTMgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBuZWdhdGVkIGFyZ3VtZW50CiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgbmVnYXRlKEJ5dGVCdWZmZXIgaW5wdXQpOworCisgICAgLyoqCisgICAgICogVGFrZXMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgYXJndW1lbnQgdG8gdGFrZSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YKKyAgICAgKiBAcmV0dXJuIGEgQnl0ZUJ1ZmZlciBjb250YWluaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQuIFRoZSB0eXBlIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgQnl0ZUJ1ZmZlcgorICAgICAqIHdpbGwgbWF0Y2ggdGhhdCBvZiB0aGUgaW5wdXQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgYWJzKEJ5dGVCdWZmZXIgaW5wdXQpOworCisgICAgLyoqCisgICAgICogUmFpc2VzIGUgdG8gdGhlIHBvd2VyIG9mIHRoZSBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgYXJndW1lbnQgdG8gcmFpc2UgZSB0bworICAgICAqIEByZXR1cm4gYSBCeXRlQnVmZmVyIGNvbnRhaW5nIHRoZSB2YWx1ZSBvZiBlICh0aGUgYmFzZSBvZiBuYXR1cmFsIGxvZ2FyaXRobXMpIHJhaXNlZCB0byB0aGUgcG93ZXIgb2YgdGhlCisgICAgICogYXJndW1lbnQuIFRoZSB0eXBlIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgQnl0ZUJ1ZmZlciB3aWxsIGJlIGEgZG91YmxlLCB1bmxlc3MgdGhlIGlucHV0IGlzIGEgRGVjaW1hbFR5cGUgb3IKKyAgICAgKiBJbnRlZ2VyVHlwZSwgaW4gd2hpY2ggdGhlIEJ5dGVCdWZmZXIgd2lsbCBjb250YWluIGEgRGVjaW1hbFR5cGUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgZXhwKEJ5dGVCdWZmZXIgaW5wdXQpOworCisgICAgLyoqCisgICAgICogVGFrZXMgdGhlIG5hdHVyYWwgbG9ncml0aG0gb2YgdGhlIGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IHRoZSBhcmd1bWVudCB0byB0YWtlIHRoZSBuYXR1cmFsIGxvZyAobG4pIG9mCisgICAgICogQHJldHVybiBhIEJ5dGVCdWZmZXIgY29udGFpbmcgdGhlIGxvZyBiYXNlIGUgKGxuKSBvZiB0aGUgYXJndW1lbnQuIFRoZSB0eXBlIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgQnl0ZUJ1ZmZlcgorICAgICAqIHdpbGwgYmUgYSBkb3VibGUsIHVubGVzcyB0aGUgaW5wdXQgaXMgYSBEZWNpbWFsVHlwZSBvciBJbnRlZ2VyVHlwZSwgaW4gd2hpY2ggdGhlIEJ5dGVCdWZmZXIgd2lsbCBjb250YWluIGEKKyAgICAgKiBEZWNpbWFsVHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZUJ1ZmZlciBsb2coQnl0ZUJ1ZmZlciBpbnB1dCk7CisKKyAgICAvKioKKyAgICAgKiBUYWtlcyB0aGUgbG9nIGJhc2UgMTAgb2YgdGhlIGFyZ3VlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgYXJndW1lbnQgdG8gdGFrZSB0aGUgbG9nIGJhc2UgdGVuIG9mCisgICAgICogQHJldHVybiBhIEJ5dGVCdWZmZXIgY29udGFpbmcgdGhlIGxvZyBiYXNlIDEwIG9mIHRoZSBhcmd1bWVudC4gVGhlIHR5cGUgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBCeXRlQnVmZmVyCisgICAgICogd2lsbCBiZSBhIGRvdWJsZSwgdW5sZXNzIHRoZSBpbnB1dCBpcyBhIERlY2ltYWxUeXBlIG9yIEludGVnZXJUeXBlLCBpbiB3aGljaCB0aGUgQnl0ZUJ1ZmZlciB3aWxsIGNvbnRhaW4gYQorICAgICAqIERlY2ltYWxUeXBlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBCeXRlQnVmZmVyIGxvZzEwKEJ5dGVCdWZmZXIgaW5wdXQpOworCisgICAgLyoqCisgICAgICogUm91bmRzIHRoZSBhcmd1bWVudCB0byB0aGUgbmVhcmVzdCB3aG9sZSBudW1iZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGFyZ3VtZW50IHRvIHJvdW5kCisgICAgICogQHJldHVybiBhIEJ5dGVCdWZmZXIgY29udGFpbmcgdGhlIHJvdW5kZWQgYXJndW1lbnQuIElmIHRoZSBpbnB1dCBpcyBhbiBpbnRlZ3JhbCB0eXBlLCB0aGUgQnl0ZUJ1ZmZlciB3aWxsIGNvbnRhaW4KKyAgICAgKiBhIGNvcHkgb2YgdGhlIGlucHV0LiBJZiB0aGUgaW5wdXQgaXMgYSBmbG9hdCwgdGhlIEJ5dGVCdWZmZXIgd2lsbCBjb250YWluIGFuIGludDMyLiBJZiB0aGUgaW5wdXQgaXMgYSBkb3VibGUsIHRoZQorICAgICAqIG91dHB1dCB3aWxsIGNvbnRhaW4gYSBsb25nLiBJZiB0aGUgaW5wdXQgaXMgYSBEZWNpbWFsVHlwZSwgdGhlIG91dHB1dCB3aWxsIGNvbnRhaW4gYW4gSW50ZWdlclR5cGUuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgcm91bmQoQnl0ZUJ1ZmZlciBpbnB1dCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1BhcnRpdGlvbmVyRGVmaW5lZE9yZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1BhcnRpdGlvbmVyRGVmaW5lZE9yZGVyLmphdmEKaW5kZXggODkyNDFiNC4uMWFkMWFlYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9QYXJ0aXRpb25lckRlZmluZWRPcmRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvUGFydGl0aW9uZXJEZWZpbmVkT3JkZXIuamF2YQpAQCAtMjIsMTEgKzIyLDE1IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVGVybTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVHlwZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGUuVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCiAvKiogZm9yIHNvcnRpbmcgY29sdW1ucyByZXByZXNlbnRpbmcgcm93IGtleXMgaW4gdGhlIHJvdyBvcmRlcmluZyBhcyBkZXRlcm1pbmVkIGJ5IGEgcGFydGl0aW9uZXIuCkBAIC05NCw2ICs5OCwzMyBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIC8vIFBhcnRpdGlvbmVycyB3b3JrIHdpdGggQnl0ZUJ1ZmZlcnMgb25seS4KKyAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UuY29udmVydChkYXRhLCBhY2Nlc3Nvcik7CisgICAgICAgIGlmICh2ZXJzaW9uICE9IFZlcnNpb24uTEVHQUNZKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBGb3IgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCBhbmQgYWJvdmUgd2UgZW5jb2RlIGFuIGVtcHR5IGtleSB3aXRoIGEgbnVsbCBieXRlIHNvdXJjZS4gVGhpcworICAgICAgICAgICAgLy8gd2F5IHdlIGF2b2lkIHRoZSBuZWVkIHRvIHNwZWNpYWwtaGFuZGxlIGEgc2VudGluZWwgdmFsdWUgd2hlbiB3ZSBkZWNvZGUgdGhlIGJ5dGUgc291cmNlIGZvciBzdWNoIGEga2V5CisgICAgICAgICAgICAvLyAoZS5nLiBmb3IgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5MZWdhY3kgd2UgdXNlIHRoZSBtaW5pbXVtIGtleSBib3VuZCBvZiB0aGUgcGFydGl0aW9uZXIncyBtaW5pbXVtIHRva2VuIGFzCisgICAgICAgICAgICAvLyBhIHNlbnRpbmVsIHZhbHVlLCBhbmQgdGhhdCByZXN1bHRzIGluIHRoZSBuZWVkIHRvIGdvIHR3aWNlIHRocm91Z2ggdGhlIGJ5dGUgc291cmNlIHRoYXQgaXMgYmVpbmcKKyAgICAgICAgICAgIC8vIGRlY29kZWQpLgorICAgICAgICAgICAgcmV0dXJuIGJ1Zi5oYXNSZW1haW5pbmcoKSA/IHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KGJ1ZikuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbikgOiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KGJ1ZiwgcGFydGl0aW9uZXIpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICBhc3NlcnQgdmVyc2lvbiAhPSBWZXJzaW9uLkxFR0FDWTsKKyAgICAgICAgaWYgKGNvbXBhcmFibGVCeXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmVtcHR5KCk7CisgICAgICAgIGJ5dGVbXSBrZXlCeXRlcyA9IERlY29yYXRlZEtleS5rZXlGcm9tQnl0ZVNvdXJjZShjb21wYXJhYmxlQnl0ZXMsIHZlcnNpb24sIHBhcnRpdGlvbmVyKTsKKyAgICAgICAgcmV0dXJuIGFjY2Vzc29yLnZhbHVlT2Yoa2V5Qnl0ZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKEJ5dGVCdWZmZXIgYnl0ZXMpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJZb3Ugc2hvdWxkbid0IGJlIHZhbGlkYXRpbmcgdGhpcy4iKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvUmV2ZXJzZWRUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1JldmVyc2VkVHlwZS5qYXZhCmluZGV4IGNlZWE4NGEuLjA3OTgzNmQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvUmV2ZXJzZWRUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9SZXZlcnNlZFR5cGUuamF2YQpAQCAtMjgsNiArMjgsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVHlwZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOwogCiBwdWJsaWMgY2xhc3MgUmV2ZXJzZWRUeXBlPFQ+IGV4dGVuZHMgQWJzdHJhY3RUeXBlPFQ+CiB7CkBAIC02Myw2ICs2NSwzMiBAQAogICAgICAgICByZXR1cm4gYmFzZVR5cGUuaXNFbXB0eVZhbHVlTWVhbmluZ2xlc3MoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICBCeXRlU291cmNlIHNyYyA9IGJhc2VUeXBlLmFzQ29tcGFyYWJsZUJ5dGVzKGFjY2Vzc29yLCBkYXRhLCB2ZXJzaW9uKTsKKyAgICAgICAgaWYgKHNyYyA9PSBudWxsKSAgICAvLyBOb3RlOiB0aGlzIHdpbGwgb25seSBjb21wYXJlIGNvcnJlY3RseSBpZiB1c2VkIHdpdGhpbiBhIHNlcXVlbmNlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgLy8gSW52ZXJ0IGFsbCBieXRlcy4KKyAgICAgICAgLy8gVGhlIGNvbXBhcmlzb24gcmVxdWlyZW1lbnRzIGZvciB0aGUgb3JpZ2luYWwgdHlwZSBlbnN1cmUgdGhhdCB0aGlzIGVuY29kaW5nIHdpbGwgY29tcGFyZSBjb3JyZWN0bHkgd2l0aAorICAgICAgICAvLyByZXNwZWN0IHRvIHRoZSByZXZlcnNlZCBjb21wYXJhdG9yIGZ1bmN0aW9uIChhbmQsIHNwZWNpZmljYWxseSwgcHJlZml4ZXMgb2YgZXNjYXBlZCBieXRlLW9yZGVyZWQgdHlwZXMgd2lsbAorICAgICAgICAvLyBjb21wYXJlIGFzIGxhcmdlcikuIEFkZGl0aW9uYWxseSwgdGhlIHdlYWsgcHJlZml4LWZyZWVkb20gcmVxdWlyZW1lbnQgZW5zdXJlcyB0aGlzIGVuY29kaW5nIHdpbGwgYWxzbyBiZQorICAgICAgICAvLyB3ZWFrbHkgcHJlZml4LWZyZWUuCisgICAgICAgIHJldHVybiAoKSAtPgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdiA9IHNyYy5uZXh0KCk7CisgICAgICAgICAgICBpZiAodiA9PSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgICAgICByZXR1cm4gdiBeIDB4RkY7CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBWIGZyb21Db21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBiYXNlVHlwZS5mcm9tQ29tcGFyYWJsZUJ5dGVzKGFjY2Vzc29yLCBSZXZlcnNlZFBlZWthYmxlQnl0ZVNvdXJjZS5vZihjb21wYXJhYmxlQnl0ZXMpLCB2ZXJzaW9uKTsKKyAgICB9CisKICAgICBwdWJsaWMgPFZMLCBWUj4gaW50IGNvbXBhcmVDdXN0b20oVkwgbGVmdCwgVmFsdWVBY2Nlc3NvcjxWTD4gYWNjZXNzb3JMLCBWUiByaWdodCwgVmFsdWVBY2Nlc3NvcjxWUj4gYWNjZXNzb3JSKQogICAgIHsKICAgICAgICAgcmV0dXJuIGJhc2VUeXBlLmNvbXBhcmUocmlnaHQsIGFjY2Vzc29yUiwgbGVmdCwgYWNjZXNzb3JMKTsKQEAgLTE1Niw0ICsxODQsNDQgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICIoIiArIGJhc2VUeXBlICsgIikiOwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJldmVyc2VkUGVla2FibGVCeXRlU291cmNlIGV4dGVuZHMgQnl0ZVNvdXJjZS5QZWVrYWJsZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCeXRlU291cmNlLlBlZWthYmxlIG9yaWdpbmFsOworCisgICAgICAgIHN0YXRpYyBCeXRlU291cmNlLlBlZWthYmxlIG9mKEJ5dGVTb3VyY2UuUGVla2FibGUgb3JpZ2luYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbCAhPSBudWxsID8gbmV3IFJldmVyc2VkUGVla2FibGVCeXRlU291cmNlKG9yaWdpbmFsKSA6IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJldmVyc2VkUGVla2FibGVCeXRlU291cmNlKEJ5dGVTb3VyY2UuUGVla2FibGUgb3JpZ2luYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG51bGwpOworICAgICAgICAgICAgdGhpcy5vcmlnaW5hbCA9IG9yaWdpbmFsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB2ID0gb3JpZ2luYWwubmV4dCgpOworICAgICAgICAgICAgaWYgKHYgIT0gRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdiBeIDB4RkY7CisgICAgICAgICAgICByZXR1cm4gRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHBlZWsoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdiA9IG9yaWdpbmFsLnBlZWsoKTsKKyAgICAgICAgICAgIGlmICh2ICE9IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuIHYgXiAweEZGOworICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gYmFzZVR5cGUuZ2V0TWFza2VkVmFsdWUoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1NldFR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvU2V0VHlwZS5qYXZhCmluZGV4IGU1YmRhZGEuLjFiYjFlZDUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvU2V0VHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvU2V0VHlwZS5qYXZhCkBAIC0yMCw4ICsyMCw4IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuKjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkpzb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5TZXRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVGVybTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CkBAIC0zMCw2ICszMCw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5TZXRTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CiAKIHB1YmxpYyBjbGFzcyBTZXRUeXBlPFQ+IGV4dGVuZHMgQ29sbGVjdGlvblR5cGU8U2V0PFQ+PgogewpAQCAtMTQyLDcgKzE0NSw3IEBACiAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlV2l0aEZyb3plbihDb2xsZWN0aW9uVHlwZTw/PiBwcmV2aW91cykKICAgICB7CiAgICAgICAgIGFzc2VydCAhaXNNdWx0aUNlbGw7Ci0gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRzLmlzQ29tcGF0aWJsZVdpdGgoKChTZXRUeXBlKSBwcmV2aW91cykuZWxlbWVudHMpOworICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50cy5pc0NvbXBhdGlibGVXaXRoKCgoU2V0VHlwZTw/PikgcHJldmlvdXMpLmVsZW1lbnRzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE1NCw3ICsxNTcsMTkgQEAKIAogICAgIHB1YmxpYyA8VkwsIFZSPiBpbnQgY29tcGFyZUN1c3RvbShWTCBsZWZ0LCBWYWx1ZUFjY2Vzc29yPFZMPiBhY2Nlc3NvckwsIFZSIHJpZ2h0LCBWYWx1ZUFjY2Vzc29yPFZSPiBhY2Nlc3NvclIpCiAgICAgewotICAgICAgICByZXR1cm4gTGlzdFR5cGUuY29tcGFyZUxpc3RPclNldChlbGVtZW50cywgbGVmdCwgYWNjZXNzb3JMLCByaWdodCwgYWNjZXNzb3JSKTsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmVMaXN0T3JTZXQoZWxlbWVudHMsIGxlZnQsIGFjY2Vzc29yTCwgcmlnaHQsIGFjY2Vzc29yUik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFzQ29tcGFyYWJsZUJ5dGVzTGlzdE9yU2V0KGdldEVsZW1lbnRzVHlwZSgpLCBhY2Nlc3NvciwgZGF0YSwgdmVyc2lvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBWIGZyb21Db21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBmcm9tQ29tcGFyYWJsZUJ5dGVzTGlzdE9yU2V0KGFjY2Vzc29yLCBjb21wYXJhYmxlQnl0ZXMsIHZlcnNpb24sIGdldEVsZW1lbnRzVHlwZSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgU2V0U2VyaWFsaXplcjxUPiBnZXRTZXJpYWxpemVyKCkKQEAgLTE3OSw3ICsxOTQsNyBAQAogCiAgICAgcHVibGljIExpc3Q8Qnl0ZUJ1ZmZlcj4gc2VyaWFsaXplZFZhbHVlcyhJdGVyYXRvcjxDZWxsPD8+PiBjZWxscykKICAgICB7Ci0gICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gYmJzID0gbmV3IEFycmF5TGlzdDxCeXRlQnVmZmVyPigpOworICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IGJicyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICB3aGlsZSAoY2VsbHMuaGFzTmV4dCgpKQogICAgICAgICAgICAgYmJzLmFkZChjZWxscy5uZXh0KCkucGF0aCgpLmdldCgwKSk7CiAgICAgICAgIHJldHVybiBiYnM7CkBAIC0xODksMTMgKzIwNCwxMyBAQAogICAgIHB1YmxpYyBUZXJtIGZyb21KU09OT2JqZWN0KE9iamVjdCBwYXJzZWQpIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpZiAocGFyc2VkIGluc3RhbmNlb2YgU3RyaW5nKQotICAgICAgICAgICAgcGFyc2VkID0gSnNvbi5kZWNvZGVKc29uKChTdHJpbmcpIHBhcnNlZCk7CisgICAgICAgICAgICBwYXJzZWQgPSBKc29uVXRpbHMuZGVjb2RlSnNvbigoU3RyaW5nKSBwYXJzZWQpOwogCiAgICAgICAgIGlmICghKHBhcnNlZCBpbnN0YW5jZW9mIExpc3QpKQogICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGEgbGlzdCAocmVwcmVzZW50aW5nIGEgc2V0KSwgYnV0IGdvdCBhICVzOiAlcyIsIHBhcnNlZC5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgcGFyc2VkKSk7CiAKLSAgICAgICAgTGlzdCBsaXN0ID0gKExpc3QpIHBhcnNlZDsKKyAgICAgICAgTGlzdDw/PiBsaXN0ID0gKExpc3Q8Pz4pIHBhcnNlZDsKICAgICAgICAgU2V0PFRlcm0+IHRlcm1zID0gbmV3IEhhc2hTZXQ8PihsaXN0LnNpemUoKSk7CiAgICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiBsaXN0KQogICAgICAgICB7CkBAIC0yMTAsNiArMjI1LDE4IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b0pTT05TdHJpbmcoQnl0ZUJ1ZmZlciBidWZmZXIsIFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCiAgICAgewotICAgICAgICByZXR1cm4gTGlzdFR5cGUuc2V0T3JMaXN0VG9Kc29uU3RyaW5nKGJ1ZmZlciwgZWxlbWVudHMsIHByb3RvY29sVmVyc2lvbik7CisgICAgICAgIHJldHVybiBzZXRPckxpc3RUb0pzb25TdHJpbmcoYnVmZmVyLCBlbGVtZW50cywgcHJvdG9jb2xWZXJzaW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmb3JFYWNoKEJ5dGVCdWZmZXIgaW5wdXQsIENvbnN1bWVyPEJ5dGVCdWZmZXI+IGFjdGlvbikKKyAgICB7CisgICAgICAgIHNlcmlhbGl6ZXIuZm9yRWFjaChpbnB1dCwgYWN0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVjb21wb3NlKENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvU2hvcnRUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1Nob3J0VHlwZS5qYXZhCmluZGV4IDAzZGNmNWQuLjI0ZDhlOTIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvU2hvcnRUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9TaG9ydFR5cGUuamF2YQpAQCAtMjgsMTEgKzI4LDE2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVHlwZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogCiBwdWJsaWMgY2xhc3MgU2hvcnRUeXBlIGV4dGVuZHMgTnVtYmVyVHlwZTxTaG9ydD4KIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNob3J0VHlwZSBpbnN0YW5jZSA9IG5ldyBTaG9ydFR5cGUoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gaW5zdGFuY2UuZGVjb21wb3NlKChzaG9ydCkgMCk7CisKICAgICBTaG9ydFR5cGUoKQogICAgIHsKICAgICAgICAgc3VwZXIoQ29tcGFyaXNvblR5cGUuQ1VTVE9NKTsKQEAgLTQ2LDYgKzUxLDE5IEBACiAgICAgICAgIHJldHVybiBWYWx1ZUFjY2Vzc29yLmNvbXBhcmUobGVmdCwgYWNjZXNzb3JMLCByaWdodCwgYWNjZXNzb3JSKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICAvLyBUaGlzIHR5cGUgZG9lcyBub3QgYWxsb3cgbm9uLXByZXNlbnQgdmFsdWVzLCBidXQgd2UgZG8ganVzdCB0byBhdm9pZCBmdXR1cmUgY29tcGxleGl0eS4KKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uub3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aE51bWJlcihhY2Nlc3NvciwgZGF0YSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBWIGZyb21Db21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlU291cmNlSW52ZXJzZS5nZXRPcHRpb25hbFNpZ25lZEZpeGVkTGVuZ3RoKGFjY2Vzc29yLCBjb21wYXJhYmxlQnl0ZXMsIDIpOworICAgIH0KKwogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGZyb21TdHJpbmcoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KICAgICB7CiAgICAgICAgIC8vIFJldHVybiBhbiBlbXB0eSBCeXRlQnVmZmVyIGZvciBhbiBlbXB0eSBzdHJpbmcuCkBAIC0xMzQsNCArMTUyLDQwIEBACiAgICAgewogICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKHNob3J0KSAtdG9TaG9ydChpbnB1dCkpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGFicyhCeXRlQnVmZmVyIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKChzaG9ydCkgTWF0aC5hYnModG9TaG9ydChpbnB1dCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleHAoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcygoc2hvcnQpIE1hdGguZXhwKHRvU2hvcnQoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgbG9nKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKHNob3J0KSBNYXRoLmxvZyh0b1Nob3J0KGlucHV0KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGxvZzEwKEJ5dGVCdWZmZXIgaW5wdXQpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoKHNob3J0KSBNYXRoLmxvZzEwKHRvU2hvcnQoaW5wdXQpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgcm91bmQoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5jbG9uZShpbnB1dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1NpbXBsZURhdGVUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1NpbXBsZURhdGVUeXBlLmphdmEKaW5kZXggOGYxZDY3Ny4uYTQ3NGQzOSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9TaW1wbGVEYXRlVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvU2ltcGxlRGF0ZVR5cGUuamF2YQpAQCAtMjgsNiArMjgsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5UeXBlU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlLlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuUmVxdWVzdFZhbGlkYXRpb25zLmludmFsaWRSZXF1ZXN0OwogCkBAIC0zNSw4ICszOSwyNCBAQAogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZVR5cGUgaW5zdGFuY2UgPSBuZXcgU2ltcGxlRGF0ZVR5cGUoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gaW5zdGFuY2UuZGVjb21wb3NlKFNpbXBsZURhdGVTZXJpYWxpemVyLnRpbWVJbk1pbGxpc1RvRGF5KDApKTsKKwogICAgIFNpbXBsZURhdGVUeXBlKCkge3N1cGVyKENvbXBhcmlzb25UeXBlLkJZVEVfT1JERVIpO30gLy8gc2luZ2xldG9uCiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICAvLyBXaGlsZSBCWVRFX09SREVSIHdvdWxkIHN0aWxsIHdvcmsgZm9yIHRoaXMgdHlwZSwgbWFraW5nIHVzZSBvZiB0aGUgZml4ZWQgbGVuZ3RoIGlzIG1vcmUgZWZmaWNpZW50LgorICAgICAgICAvLyBUaGlzIHR5cGUgZG9lcyBub3QgYWxsb3cgbm9uLXByZXNlbnQgdmFsdWVzLCBidXQgd2UgZG8ganVzdCB0byBhdm9pZCBmdXR1cmUgY29tcGxleGl0eS4KKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uub3B0aW9uYWxGaXhlZExlbmd0aChhY2Nlc3NvciwgZGF0YSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBWIGZyb21Db21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlU291cmNlSW52ZXJzZS5nZXRPcHRpb25hbEZpeGVkTGVuZ3RoKGFjY2Vzc29yLCBjb21wYXJhYmxlQnl0ZXMsIDQpOworICAgIH0KKwogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGZyb21TdHJpbmcoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KICAgICB7CiAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcyhTaW1wbGVEYXRlU2VyaWFsaXplci5kYXRlU3RyaW5nVG9EYXlzKHNvdXJjZSkpOwpAQCAtOTgsNCArMTE4LDEwIEBACiAgICAgICAgIGlmICghZHVyYXRpb24uaGFzRGF5UHJlY2lzaW9uKCkpCiAgICAgICAgICAgICB0aHJvdyBpbnZhbGlkUmVxdWVzdCgiVGhlIGR1cmF0aW9uIG11c3QgaGF2ZSBhIGRheSBwcmVjaXNpb24uIFdhczogJXMiLCBkdXJhdGlvbik7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVUeXBlLmphdmEKaW5kZXggZmQ4ZmFjNC4uZDc1MDA5NSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UaW1lVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVGltZVR5cGUuamF2YQpAQCAtMjgsNiArMjgsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5UeXBlU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGUuVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogCiAvKioKICAqIE5hbm9zZWNvbmQgcmVzb2x1dGlvbiB0aW1lIHZhbHVlcwpAQCAtMzUsNiArMzksOCBAQAogcHVibGljIGNsYXNzIFRpbWVUeXBlIGV4dGVuZHMgVGVtcG9yYWxUeXBlPExvbmc+CiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lVHlwZSBpbnN0YW5jZSA9IG5ldyBUaW1lVHlwZSgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBERUZBVUxUX01BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZSgwTCk7CiAgICAgcHJpdmF0ZSBUaW1lVHlwZSgpIHtzdXBlcihDb21wYXJpc29uVHlwZS5CWVRFX09SREVSKTt9IC8vIHNpbmdsZXRvbgogCiAgICAgcHVibGljIEJ5dGVCdWZmZXIgZnJvbVN0cmluZyhTdHJpbmcgc291cmNlKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgpAQCAtNDMsNiArNDksMjAgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICAvLyBXaGlsZSBCWVRFX09SREVSIHdvdWxkIHN0aWxsIHdvcmsgZm9yIHRoaXMgdHlwZSwgbWFraW5nIHVzZSBvZiB0aGUgZml4ZWQgbGVuZ3RoIGlzIG1vcmUgZWZmaWNpZW50LgorICAgICAgICAvLyBUaGlzIHR5cGUgZG9lcyBub3QgYWxsb3cgbm9uLXByZXNlbnQgdmFsdWVzLCBidXQgd2UgZG8ganVzdCB0byBhdm9pZCBmdXR1cmUgY29tcGxleGl0eS4KKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uub3B0aW9uYWxGaXhlZExlbmd0aChhY2Nlc3NvciwgZGF0YSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBWIGZyb21Db21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlU291cmNlSW52ZXJzZS5nZXRPcHRpb25hbEZpeGVkTGVuZ3RoKGFjY2Vzc29yLCBjb21wYXJhYmxlQnl0ZXMsIDgpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzVmFsdWVDb21wYXRpYmxlV2l0aEludGVybmFsKEFic3RyYWN0VHlwZTw/PiBvdGhlclR5cGUpCiAgICAgewogICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlclR5cGUgfHwgb3RoZXJUeXBlID09IExvbmdUeXBlLmluc3RhbmNlOwpAQCAtODMsNCArMTAzLDEwIEBACiAgICAgewogICAgICAgICByZXR1cm4gZGVjb21wb3NlKExvY2FsVGltZS5ub3coWm9uZU9mZnNldC5VVEMpLnRvTmFub09mRGF5KCkpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldE1hc2tlZFZhbHVlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBERUZBVUxUX01BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVVVUlEVHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UaW1lVVVJRFR5cGUuamF2YQppbmRleCBkM2IwZGVjLi40MGU1OTU2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVVVUlEVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVGltZVVVSURUeXBlLmphdmEKQEAgLTE3LDYgKzE3LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsOwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlR5cGVTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCkBAIC0yNSw2ICsyNyw4IEBACiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lVVVJRFR5cGUgaW5zdGFuY2UgPSBuZXcgVGltZVVVSURUeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZShUaW1lVVVJRC5taW5BdFVuaXhNaWxsaXMoMCkpOworCiAgICAgcHVibGljIFR5cGVTZXJpYWxpemVyPFRpbWVVVUlEPiBnZXRTZXJpYWxpemVyKCkKICAgICB7CiAgICAgICAgIHJldHVybiBUaW1lVVVJRC5TZXJpYWxpemVyLmluc3RhbmNlOwpAQCAtMzUsNCArMzksMTAgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBMZWdhY3lUaW1lVVVJRFR5cGUuaW5zdGFuY2U7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVzdGFtcFR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVGltZXN0YW1wVHlwZS5qYXZhCmluZGV4IGNjZjFkYTMuLjY3OTc2NzYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVGltZXN0YW1wVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVGltZXN0YW1wVHlwZS5qYXZhCkBAIC0zMiw2ICszMiw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVGltZXN0YW1wU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLlJlcXVlc3RWYWxpZGF0aW9ucy5pbnZhbGlkUmVxdWVzdDsKIApAQCAtNDgsNiArNTEsOCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaW1lc3RhbXBUeXBlIGluc3RhbmNlID0gbmV3IFRpbWVzdGFtcFR5cGUoKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgTUFTS0VEX1ZBTFVFID0gaW5zdGFuY2UuZGVjb21wb3NlKG5ldyBEYXRlKDApKTsKKwogICAgIHByaXZhdGUgVGltZXN0YW1wVHlwZSgpIHtzdXBlcihDb21wYXJpc29uVHlwZS5DVVNUT00pO30gLy8gc2luZ2xldG9uCiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5VmFsdWVNZWFuaW5nbGVzcygpCkBAIC02MCw2ICs2NSwxOCBAQAogICAgICAgICByZXR1cm4gTG9uZ1R5cGUuY29tcGFyZUxvbmdzKGxlZnQsIGFjY2Vzc29yTCwgcmlnaHQsIGFjY2Vzc29yUik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uub3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aE51bWJlcihhY2Nlc3NvciwgZGF0YSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBWIGZyb21Db21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlU291cmNlSW52ZXJzZS5nZXRPcHRpb25hbFNpZ25lZEZpeGVkTGVuZ3RoKGFjY2Vzc29yLCBjb21wYXJhYmxlQnl0ZXMsIDgpOworICAgIH0KKwogICAgIHB1YmxpYyBCeXRlQnVmZmVyIGZyb21TdHJpbmcoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KICAgICB7CiAgICAgICAvLyBSZXR1cm4gYW4gZW1wdHkgQnl0ZUJ1ZmZlciBmb3IgYW4gZW1wdHkgc3RyaW5nLgpAQCAtMTU1LDQgKzE3MiwxMCBAQAogICAgICAgICBpZiAoIWR1cmF0aW9uLmhhc01pbGxpc2Vjb25kUHJlY2lzaW9uKCkpCiAgICAgICAgICAgICB0aHJvdyBpbnZhbGlkUmVxdWVzdCgiVGhlIGR1cmF0aW9uIG11c3QgaGF2ZSBhIG1pbGxpc2Vjb25kIHByZWNpc2lvbi4gV2FzOiAlcyIsIGR1cmF0aW9uKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gTUFTS0VEX1ZBTFVFOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVHVwbGVUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1R1cGxlVHlwZS5qYXZhCmluZGV4IGNjMDg0ODcuLjc5ZjkyMTkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVHVwbGVUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UdXBsZVR5cGUuamF2YQpAQCAtMzAsMTEgKzMwLDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlN5bnRheEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZUludmVyc2U7CiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMuYW55OwogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy50cmFuc2Zvcm07CkBAIC0yMDAsNDcgKzIwMiwxMzYgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogU3BsaXQgYSB0dXBsZSB2YWx1ZSBpbnRvIGl0cyBjb21wb25lbnQgdmFsdWVzLgotICAgICAqLwotICAgIHB1YmxpYyBCeXRlQnVmZmVyW10gc3BsaXQoQnl0ZUJ1ZmZlciB2YWx1ZSkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCiAgICAgewotICAgICAgICByZXR1cm4gc3BsaXQodmFsdWUsIHNpemUoKSwgdGhpcyk7CisgICAgICAgIHN3aXRjaCAodmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBMRUdBQ1k6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFzQ29tcGFyYWJsZUJ5dGVzTGVnYWN5KGFjY2Vzc29yLCBkYXRhKTsKKyAgICAgICAgICAgIGNhc2UgT1NTNTA6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFzQ29tcGFyYWJsZUJ5dGVzTmV3KGFjY2Vzc29yLCBkYXRhLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIDxWPiBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzTGVnYWN5KFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSkKKyAgICB7CisgICAgICAgIGlmIChhY2Nlc3Nvci5pc0VtcHR5KGRhdGEpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgVltdIGJ1ZnMgPSBzcGxpdChhY2Nlc3NvciwgZGF0YSk7ICAvLyB0aGlzIG1heSBiZSBzaG9ydGVyIHRoYW4gdHlwZXMuc2l6ZSAtLSBvdGhlciBzcmNzIHJlbWFpbiBudWxsIGluIHRoYXQgY2FzZQorICAgICAgICBCeXRlU291cmNlW10gc3JjcyA9IG5ldyBCeXRlU291cmNlW3R5cGVzLnNpemUoKV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmcy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIHNyY3NbaV0gPSBidWZzW2ldICE9IG51bGwgPyB0eXBlcy5nZXQoaSkuYXNDb21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIGJ1ZnNbaV0sIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uTEVHQUNZKSA6IG51bGw7CisKKyAgICAgICAgLy8gV2UgYWx3YXlzIGhhdmUgYSBmaXhlZCBudW1iZXIgb2Ygc291cmNlcywgd2l0aCB0aGUgdHJhaWxpbmcgb25lcyBwb3NzaWJseSBiZWluZyBudWxscy4KKyAgICAgICAgLy8gVGhpcyBjYW4gb25seSByZXN1bHQgaW4gYSBwcmVmaXggaWYgdGhlIGxhc3QgdHlwZSBpbiB0aGUgdHVwbGUgYWxsb3dzIHByZWZpeGVzLiBTaW5jZSB0aGF0IHR5cGUgaXMgcmVxdWlyZWQKKyAgICAgICAgLy8gdG8gYmUgd2Vha2x5IHByZWZpeC1mcmVlLCBzbyBpcyB0aGUgdHVwbGUuCisgICAgICAgIHJldHVybiBCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yTGVnYWN5KEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSwgc3Jjcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8Vj4gQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlc05ldyhWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGlmIChhY2Nlc3Nvci5pc0VtcHR5KGRhdGEpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgVltdIGJ1ZnMgPSBzcGxpdChhY2Nlc3NvciwgZGF0YSk7CisgICAgICAgIGludCBsZW5ndGhXaXRob3V0VHJhaWxpbmdOdWxscyA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmcy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIGlmIChidWZzW2ldICE9IG51bGwpCisgICAgICAgICAgICAgICAgbGVuZ3RoV2l0aG91dFRyYWlsaW5nTnVsbHMgPSBpICsgMTsKKworICAgICAgICBCeXRlU291cmNlW10gc3JjcyA9IG5ldyBCeXRlU291cmNlW2xlbmd0aFdpdGhvdXRUcmFpbGluZ051bGxzXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGhXaXRob3V0VHJhaWxpbmdOdWxsczsgKytpKQorICAgICAgICAgICAgc3Jjc1tpXSA9IGJ1ZnNbaV0gIT0gbnVsbCA/IHR5cGVzLmdldChpKS5hc0NvbXBhcmFibGVCeXRlcyhhY2Nlc3NvciwgYnVmc1tpXSwgdmVyc2lvbikgOiBudWxsOworCisgICAgICAgIC8vIEJlY2F1c2Ugd2Ugc3RvcCBlYXJseSB3aGVuIHRoZXJlIGFyZSB0cmFpbGluZyBudWxscywgdGhlcmUgbmVlZHMgdG8gYmUgYW4gZXhwbGljaXQgdGVybWluYXRvciB0byBtYWtlIHRoZQorICAgICAgICAvLyB0eXBlIHByZWZpeC1mcmVlLgorICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcihCeXRlU291cmNlLlRFUk1JTkFUT1IsIHNyY3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICBhc3NlcnQgdmVyc2lvbiA9PSBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwOyAvLyBSZXZlcnNlIHRyYW5zbGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoZSBsZWdhY3kgdmVyc2lvbi4KKyAgICAgICAgaWYgKGNvbXBhcmFibGVCeXRlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLmVtcHR5KCk7CisKKyAgICAgICAgVltdIGNvbXBvbmVudEJ1ZmZlcnMgPSBhY2Nlc3Nvci5jcmVhdGVBcnJheSh0eXBlcy5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLnNpemUoKTsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29tcGFyYWJsZUJ5dGVzLnBlZWsoKSA9PSBCeXRlU291cmNlLlRFUk1JTkFUT1IpCisgICAgICAgICAgICAgICAgYnJlYWs7ICAvLyB0aGUgcmVzdCBvZiB0aGUgZmllbGRzIHJlbWFpbiBudWxsCisgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gY29tcG9uZW50VHlwZSA9IHR5cGVzLmdldChpKTsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcG9uZW50ID0gQnl0ZVNvdXJjZUludmVyc2UubmV4dENvbXBvbmVudFNvdXJjZShjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNvbXBvbmVudEJ1ZmZlcnNbaV0gPSBjb21wb25lbnRUeXBlLmZyb21Db21wYXJhYmxlQnl0ZXMoYWNjZXNzb3IsIGNvbXBvbmVudCwgdmVyc2lvbik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29tcG9uZW50QnVmZmVyc1tpXSA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgLy8gY29uc3VtZSB0ZXJtaW5hdG9yCisgICAgICAgIGludCB0ZXJtaW5hdG9yID0gY29tcGFyYWJsZUJ5dGVzLm5leHQoKTsKKyAgICAgICAgYXNzZXJ0IHRlcm1pbmF0b3IgPT0gQnl0ZVNvdXJjZS5URVJNSU5BVE9SIDogU3RyaW5nLmZvcm1hdCgiRXhwZWN0ZWQgVEVSTUlOQVRPUiAoMHglMngpIGFmdGVyICVkIGNvbXBvbmVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2UuVEVSTUlOQVRPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcy5zaXplKCkpOworICAgICAgICByZXR1cm4gYnVpbGRWYWx1ZShhY2Nlc3NvciwgY29tcG9uZW50QnVmZmVycyk7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogU3BsaXQgYSB0dXBsZSB2YWx1ZSBpbnRvIGl0cyBjb21wb25lbnQgdmFsdWVzLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlcltdIHNwbGl0KEJ5dGVCdWZmZXIgdmFsdWUsIGludCBudW1iZXJPZkVsZW1lbnRzLCBUdXBsZVR5cGUgdHlwZSkKKyAgICBwdWJsaWMgPFY+IFZbXSBzcGxpdChWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIHZhbHVlKQogICAgIHsKLSAgICAgICAgQnl0ZUJ1ZmZlcltdIGNvbXBvbmVudHMgPSBuZXcgQnl0ZUJ1ZmZlcltudW1iZXJPZkVsZW1lbnRzXTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCA9IHZhbHVlLmR1cGxpY2F0ZSgpOworICAgICAgICByZXR1cm4gc3BsaXQoYWNjZXNzb3IsIHZhbHVlLCBzaXplKCksIHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwbGl0IGEgdHVwbGUgdmFsdWUgaW50byBpdHMgY29tcG9uZW50IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxWPiBWW10gc3BsaXQoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViB2YWx1ZSwgaW50IG51bWJlck9mRWxlbWVudHMsIFR1cGxlVHlwZSB0eXBlKQorICAgIHsKKyAgICAgICAgVltdIGNvbXBvbmVudHMgPSBhY2Nlc3Nvci5jcmVhdGVBcnJheShudW1iZXJPZkVsZW1lbnRzKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IGFjY2Vzc29yLnNpemUodmFsdWUpOworICAgICAgICBpbnQgcG9zaXRpb24gPSAwOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mRWxlbWVudHM7IGkrKykKICAgICAgICAgewotICAgICAgICAgICAgaWYgKCFpbnB1dC5oYXNSZW1haW5pbmcoKSkKKyAgICAgICAgICAgIGlmIChwb3NpdGlvbiA9PSBsZW5ndGgpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2ZSYW5nZShjb21wb25lbnRzLCAwLCBpKTsKIAotICAgICAgICAgICAgaW50IHNpemUgPSBpbnB1dC5nZXRJbnQoKTsKLQotICAgICAgICAgICAgaWYgKGlucHV0LnJlbWFpbmluZygpIDwgc2l6ZSkKKyAgICAgICAgICAgIGlmIChwb3NpdGlvbiArIDQgPiBsZW5ndGgpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiTm90IGVub3VnaCBieXRlcyB0byByZWFkICVkdGggY29tcG9uZW50IiwgaSkpOwogCisgICAgICAgICAgICBpbnQgc2l6ZSA9IGFjY2Vzc29yLmdldEludCh2YWx1ZSwgcG9zaXRpb24pOworICAgICAgICAgICAgcG9zaXRpb24gKz0gNDsKKwogICAgICAgICAgICAgLy8gc2l6ZSA8IDAgbWVhbnMgbnVsbCB2YWx1ZQotICAgICAgICAgICAgY29tcG9uZW50c1tpXSA9IHNpemUgPCAwID8gbnVsbCA6IEJ5dGVCdWZmZXJVdGlsLnJlYWRCeXRlcyhpbnB1dCwgc2l6ZSk7CisgICAgICAgICAgICBpZiAoc2l6ZSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiArIHNpemUgPiBsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIk5vdCBlbm91Z2ggYnl0ZXMgdG8gcmVhZCAlZHRoIGNvbXBvbmVudCIsIGkpKTsKKworICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbaV0gPSBhY2Nlc3Nvci5zbGljZSh2YWx1ZSwgcG9zaXRpb24sIHNpemUpOworICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29tcG9uZW50c1tpXSA9IG51bGw7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBlcnJvciBvdXQgaWYgd2UgZ290IG1vcmUgdmFsdWVzIGluIHRoZSB0dXBsZS9VRFQgdGhhbiB3ZSBleHBlY3RlZAotICAgICAgICBpZiAoaW5wdXQuaGFzUmVtYWluaW5nKCkpCisgICAgICAgIGlmIChwb3NpdGlvbiA8IGxlbmd0aCkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAgICAgICAiRXhwZWN0ZWQgJXMgJXMgZm9yICVzIGNvbHVtbiwgYnV0IGdvdCBtb3JlIiwKLSAgICAgICAgICAgIG51bWJlck9mRWxlbWVudHMsIG51bWJlck9mRWxlbWVudHMgPT0gMSA/ICJ2YWx1ZSIgOiAidmFsdWVzIiwgdHlwZS5hc0NRTDNUeXBlKCkpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkICVzICVzIGZvciAlcyBjb2x1bW4sIGJ1dCBnb3QgbW9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlck9mRWxlbWVudHMsIG51bWJlck9mRWxlbWVudHMgPT0gMSA/ICJ2YWx1ZSIgOiAidmFsdWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS5hc0NRTDNUeXBlKCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBjb21wb25lbnRzOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgPFY+IFYgYnVpbGRWYWx1ZShWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWW10gY29tcG9uZW50cykKKyAgICBAU2FmZVZhcmFyZ3MKKyAgICBwdWJsaWMgc3RhdGljIDxWPiBWIGJ1aWxkVmFsdWUoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgVi4uLiBjb21wb25lbnRzKQogICAgIHsKICAgICAgICAgaW50IHRvdGFsTGVuZ3RoID0gMDsKICAgICAgICAgZm9yIChWIGNvbXBvbmVudCA6IGNvbXBvbmVudHMpCkBAIC0yNjQsNyArMzU1LDcgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgYnVpbGRWYWx1ZShCeXRlQnVmZmVyW10gY29tcG9uZW50cykKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgYnVpbGRWYWx1ZShCeXRlQnVmZmVyLi4uIGNvbXBvbmVudHMpCiAgICAgewogICAgICAgICByZXR1cm4gYnVpbGRWYWx1ZShCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGNvbXBvbmVudHMpOwogICAgIH0KQEAgLTMzMywxMyArNDI0LDEzIEBACiAgICAgcHVibGljIFRlcm0gZnJvbUpTT05PYmplY3QoT2JqZWN0IHBhcnNlZCkgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGlmIChwYXJzZWQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgICAgICBwYXJzZWQgPSBKc29uLmRlY29kZUpzb24oKFN0cmluZykgcGFyc2VkKTsKKyAgICAgICAgICAgIHBhcnNlZCA9IEpzb25VdGlscy5kZWNvZGVKc29uKChTdHJpbmcpIHBhcnNlZCk7CiAKICAgICAgICAgaWYgKCEocGFyc2VkIGluc3RhbmNlb2YgTGlzdCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYSBsaXN0IHJlcHJlc2VudGF0aW9uIG9mIGEgdHVwbGUsIGJ1dCBnb3QgYSAlczogJXMiLCBwYXJzZWQuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksIHBhcnNlZCkpOwogCi0gICAgICAgIExpc3QgbGlzdCA9IChMaXN0KSBwYXJzZWQ7CisgICAgICAgIExpc3Q8Pz4gbGlzdCA9IChMaXN0PD8+KSBwYXJzZWQ7CiAKICAgICAgICAgaWYgKGxpc3Quc2l6ZSgpID4gdHlwZXMuc2l6ZSgpKQogICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVHVwbGUgY29udGFpbnMgZXh0cmEgaXRlbXMgKGV4cGVjdGVkICVzKTogJXMiLCB0eXBlcy5zaXplKCksIHBhcnNlZCkpOwpAQCAtMzc1LDggKzQ2Niw4IEBACiAgICAgICAgICAgICBpZiAoaSA+IDApCiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOwogCi0gICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKGR1cGxpY2F0ZWQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgb2Zmc2V0LCBwcm90b2NvbFZlcnNpb24pOwotICAgICAgICAgICAgb2Zmc2V0ICs9IENvbGxlY3Rpb25TZXJpYWxpemVyLnNpemVPZlZhbHVlKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHByb3RvY29sVmVyc2lvbik7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gQ29sbGVjdGlvblNlcmlhbGl6ZXIucmVhZFZhbHVlKGR1cGxpY2F0ZWQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIG9mZnNldCArPSBDb2xsZWN0aW9uU2VyaWFsaXplci5zaXplT2ZWYWx1ZSh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOwogICAgICAgICAgICAgZWxzZQpAQCAtNDU5LDQgKzU1MCwxNyBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgVHlwZVBhcnNlci5zdHJpbmdpZnlUeXBlUGFyYW1ldGVycyh0eXBlcywgdHJ1ZSk7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlcltdIGJ1ZmZlcnMgPSBuZXcgQnl0ZUJ1ZmZlclt0eXBlcy5zaXplKCldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IHR5cGVzLmdldChpKTsKKyAgICAgICAgICAgIGJ1ZmZlcnNbaV0gPSB0eXBlLmdldE1hc2tlZFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2VyaWFsaXplci5zZXJpYWxpemUoYnVpbGRWYWx1ZShidWZmZXJzKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9VVEY4VHlwZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9VVEY4VHlwZS5qYXZhCmluZGV4IGUyNTYwNzAuLjIwZGU1ZmMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVVRGOFR5cGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1VURjhUeXBlLmphdmEKQEAgLTIyLDcgKzIyLDYgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkpzb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVGVybTsKQEAgLTMxLDExICszMCwxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlVURjhTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogCiBwdWJsaWMgY2xhc3MgVVRGOFR5cGUgZXh0ZW5kcyBTdHJpbmdUeXBlCiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVVEY4VHlwZSBpbnN0YW5jZSA9IG5ldyBVVEY4VHlwZSgpOwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBNQVNLRURfVkFMVUUgPSBpbnN0YW5jZS5kZWNvbXBvc2UoIioqKioiKTsKKwogICAgIFVURjhUeXBlKCkge3N1cGVyKENvbXBhcmlzb25UeXBlLkJZVEVfT1JERVIpO30gLy8gc2luZ2xldG9uCiAKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBmcm9tU3RyaW5nKFN0cmluZyBzb3VyY2UpCkBAIC02Miw3ICs2NCw3IEBACiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICciJyArIEpzb24ucXVvdGVBc0pzb25TdHJpbmcoQnl0ZUJ1ZmZlclV0aWwuc3RyaW5nKGJ1ZmZlciwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpICsgJyInOworICAgICAgICAgICAgcmV0dXJuICciJyArIEpzb25VdGlscy5xdW90ZUFzSnNvblN0cmluZyhCeXRlQnVmZmVyVXRpbC5zdHJpbmcoYnVmZmVyLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSkgKyAnIic7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiBleGMpCiAgICAgICAgIHsKQEAgLTg3LDQgKzg5LDEwIEBACiAgICAgewogICAgICAgICByZXR1cm4gVVRGOFNlcmlhbGl6ZXIuaW5zdGFuY2U7CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0TWFza2VkVmFsdWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1BU0tFRF9WQUxVRTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1VVSURUeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1VVSURUeXBlLmphdmEKaW5kZXggNTVjZTU5ZC4uMGRlOTA0MSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9VVUlEVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVVVJRFR5cGUuamF2YQpAQCAtMzAsNiArMzAsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVVVJRFNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5VVUlER2VuOwogCiAvKioKQEAgLTQ2LDYgKzQ5LDggQEAKIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVVSURUeXBlIGluc3RhbmNlID0gbmV3IFVVSURUeXBlKCk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIE1BU0tFRF9WQUxVRSA9IGluc3RhbmNlLmRlY29tcG9zZShVVUlELmZyb21TdHJpbmcoIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCIpKTsKKwogICAgIFVVSURUeXBlKCkKICAgICB7CiAgICAgICAgIHN1cGVyKENvbXBhcmlzb25UeXBlLkNVU1RPTSk7CkBAIC05NiwxMCArMTAxLDcyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBBbXVzaW5nbHkgKG9yIG5vdCBzbyBtdWNoKSwgYWx0aG91Z2ggVVVJRFR5cGUgZnJlZWx5IHRha2VzIHRpbWUgVVVJRHMgKFVVSURzIHdpdGggdmVyc2lvbiAxKSwgaXQgY29tcGFyZXMKKyAgICAgICAgLy8gdGhlbSBkaWZmZXJlbnRseSB0aGFuIFRpbWVVVUlEVHlwZS4gVGhpcyBpcyBldmlkZW50IGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBieXRlcyBjb21wYXJpc29uICh0aGUgY29kZQorICAgICAgICAvLyBiZWxvdyBmb3IgVVVJRFR5cGUpLCB3aGVyZSBVVUlEVHlwZSB0cmVhdHMgdGhlbSBhcyB1bnNpZ25lZCBieXRlcywgd2hpbGUgVGltZVVVSURUeXBlIGNvbXBhcmVzIHRoZSBieXRlcworICAgICAgICAvLyBzaWduZWQuIFNlZSBDQVNTQU5EUkEtODczMCBmb3IgZGV0YWlscyBhcm91bmQgdGhpcyBkaXNjcmVwYW5jeS4KICAgICAgICAgcmV0dXJuIFVuc2lnbmVkTG9uZ3MuY29tcGFyZShhY2Nlc3NvckwuZ2V0TG9uZyhsZWZ0LCA4KSwgYWNjZXNzb3JSLmdldExvbmcocmlnaHQsIDgpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHYpCisgICAgeworICAgICAgICBpZiAoYWNjZXNzb3IuaXNFbXB0eShkYXRhKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGxvbmcgbXNiID0gYWNjZXNzb3IuZ2V0TG9uZyhkYXRhLCAwKTsKKyAgICAgICAgbG9uZyB2ZXJzaW9uID0gKChtc2IgPj4+IDEyKSAmIDB4Zik7CisgICAgICAgIEJ5dGVCdWZmZXIgc3dpenpsZWQgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDE2KTsKKworICAgICAgICBpZiAodmVyc2lvbiA9PSAxKQorICAgICAgICAgICAgc3dpenpsZWQucHV0TG9uZygwLCBUaW1lVVVJRFR5cGUucmVvcmRlclRpbWVzdGFtcEJ5dGVzKG1zYikpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzd2l6emxlZC5wdXRMb25nKDAsICh2ZXJzaW9uIDw8IDYwKSB8ICgobXNiID4+PiA0KSAmIDB4MEZGRkZGRkZGRkZGRjAwMEwpIHwgKG1zYiAmIDB4RkZGTCkpOworCisgICAgICAgIHN3aXp6bGVkLnB1dExvbmcoOCwgYWNjZXNzb3IuZ2V0TG9uZyhkYXRhLCA4KSk7CisKKyAgICAgICAgLy8gZml4ZWQtbGVuZ3RoIHRodXMgcHJlZml4LWZyZWUKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2UuZml4ZWRMZW5ndGgoc3dpenpsZWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gViBmcm9tQ29tcGFyYWJsZUJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICAvLyBPcHRpb25hbC1zdHlsZSBlbmNvZGluZyBvZiBlbXB0eSB2YWx1ZXMgYXMgbnVsbCBzb3VyY2VzCisgICAgICAgIGlmIChjb21wYXJhYmxlQnl0ZXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5lbXB0eSgpOworCisgICAgICAgIC8vIFRoZSBVVUlEIGJpdHMgYXJlIHN0b3JlZCBhcyBhbiB1bnNpZ25lZCBmaXhlZC1sZW5ndGggMTI4LWJpdCBpbnRlZ2VyLgorICAgICAgICBsb25nIGhpQml0cyA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFVuc2lnbmVkRml4ZWRMZW5ndGhBc0xvbmcoY29tcGFyYWJsZUJ5dGVzLCA4KTsKKyAgICAgICAgbG9uZyBsb0JpdHMgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRVbnNpZ25lZEZpeGVkTGVuZ3RoQXNMb25nKGNvbXBhcmFibGVCeXRlcywgOCk7CisKKyAgICAgICAgbG9uZyB1dWlkVmVyc2lvbiA9IGhpQml0cyA+Pj4gNjAgJiAweEY7CisgICAgICAgIGlmICh1dWlkVmVyc2lvbiA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiB0aGUgdmVyc2lvbiBiaXRzIGFyZSBzZXQgdG8gMSwgdGhpcyBpcyBhIHRpbWUtYmFzZWQgVVVJRCwgYW5kIGl0cyBoaWdoIGJpdHMgYXJlIHNpZ25pZmljYW50bHkgbW9yZQorICAgICAgICAgICAgLy8gc2h1ZmZsZWQgdGhhbiBpbiBvdGhlciBVVUlEcy4gUmV2ZXJ0IHRoZSBzaHVmZmxlLgorICAgICAgICAgICAgaGlCaXRzID0gVGltZVVVSURUeXBlLnJlb3JkZXJCYWNrVGltZXN0YW1wQnl0ZXMoaGlCaXRzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZvciBub24tdGltZSBVVUlEcywgdGhlIG9ubHkgdGhpbmcgdGhhdCdzIG5lZWRlZCBpcyB0byBwdXQgdGhlIHZlcnNpb24gYml0cyBiYWNrIHdoZXJlIHRoZXkgd2VyZSBvcmlnaW5hbGx5LgorICAgICAgICAgICAgaGlCaXRzID0gaGlCaXRzIDw8IDQgJiAweEZGRkZGRkZGRkZGRjAwMDBMCisgICAgICAgICAgICAgICAgICAgICB8IHV1aWRWZXJzaW9uIDw8IDEyCisgICAgICAgICAgICAgICAgICAgICB8IGhpQml0cyAmIDB4MDAwMDAwMDAwMDAwMEZGRkw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWFrZVV1aWRCeXRlcyhhY2Nlc3NvciwgaGlCaXRzLCBsb0JpdHMpOworICAgIH0KKworICAgIHN0YXRpYyA8Vj4gViBtYWtlVXVpZEJ5dGVzKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIGxvbmcgaGlnaCwgbG9uZyBsb3cpCisgICAgeworICAgICAgICBWIGJ1ZmZlciA9IGFjY2Vzc29yLmFsbG9jYXRlKDE2KTsKKyAgICAgICAgYWNjZXNzb3IucHV0TG9uZyhidWZmZXIsIDAsIGhpZ2gpOworICAgICAgICBhY2Nlc3Nvci5wdXRMb25nKGJ1ZmZlciwgOCwgbG93KTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbHVlQ29tcGF0aWJsZVdpdGhJbnRlcm5hbChBYnN0cmFjdFR5cGU8Pz4gb3RoZXJUeXBlKQogICAgIHsKICAgICAgICAgcmV0dXJuIG90aGVyVHlwZSBpbnN0YW5jZW9mIFVVSURUeXBlIHx8IG90aGVyVHlwZSBpbnN0YW5jZW9mIFRpbWVVVUlEVHlwZTsKQEAgLTE3Myw0ICsyNDAsMTAgQEAKICAgICB7CiAgICAgICAgIHJldHVybiAxNjsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRNYXNrZWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gTUFTS0VEX1ZBTFVFOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVXNlclR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVXNlclR5cGUuamF2YQppbmRleCA2NGJkY2RkLi4yOGY2NTRlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1VzZXJUeXBlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9Vc2VyVHlwZS5qYXZhCkBAIC0zNiwxMCArMzYsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5Vc2VyVHlwZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIAogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5hbnk7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLnRyYW5zZm9ybTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5UWVBFX1VEVF9DT05GTElDVF9CRUhBVklPUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5JZGVudGlmaWVyLm1heWJlUXVvdGU7CiAKIC8qKgpAQCAtMjExLDcgKzIxMyw3IEBACiAgICAgcHVibGljIFRlcm0gZnJvbUpTT05PYmplY3QoT2JqZWN0IHBhcnNlZCkgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGlmIChwYXJzZWQgaW5zdGFuY2VvZiBTdHJpbmcpCi0gICAgICAgICAgICBwYXJzZWQgPSBKc29uLmRlY29kZUpzb24oKFN0cmluZykgcGFyc2VkKTsKKyAgICAgICAgICAgIHBhcnNlZCA9IEpzb25VdGlscy5kZWNvZGVKc29uKChTdHJpbmcpIHBhcnNlZCk7CiAKICAgICAgICAgaWYgKCEocGFyc2VkIGluc3RhbmNlb2YgTWFwKSkKICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCkBAIC0yMTksNyArMjIxLDcgQEAKIAogICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBwYXJzZWQ7CiAKLSAgICAgICAgSnNvbi5oYW5kbGVDYXNlU2Vuc2l0aXZpdHkobWFwKTsKKyAgICAgICAgSnNvblV0aWxzLmhhbmRsZUNhc2VTZW5zaXRpdml0eShtYXApOwogCiAgICAgICAgIExpc3Q8VGVybT4gdGVybXMgPSBuZXcgQXJyYXlMaXN0PD4odHlwZXMuc2l6ZSgpKTsKIApAQCAtMjU4LDcgKzI2MCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b0pTT05TdHJpbmcoQnl0ZUJ1ZmZlciBidWZmZXIsIFByb3RvY29sVmVyc2lvbiBwcm90b2NvbFZlcnNpb24pCiAgICAgewotICAgICAgICBCeXRlQnVmZmVyW10gYnVmZmVycyA9IHNwbGl0KGJ1ZmZlcik7CisgICAgICAgIEJ5dGVCdWZmZXJbXSBidWZmZXJzID0gc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBidWZmZXIpOwogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoInsiKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5zaXplKCk7IGkrKykKICAgICAgICAgewpAQCAtMjcwLDcgKzI3Miw3IEBACiAgICAgICAgICAgICAgICAgbmFtZSA9ICJcIiIgKyBuYW1lICsgIlwiIjsKIAogICAgICAgICAgICAgc2IuYXBwZW5kKCciJyk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoSnNvbi5xdW90ZUFzSnNvblN0cmluZyhuYW1lKSk7CisgICAgICAgICAgICBzYi5hcHBlbmQoSnNvblV0aWxzLnF1b3RlQXNKc29uU3RyaW5nKG5hbWUpKTsKICAgICAgICAgICAgIHNiLmFwcGVuZCgiXCI6ICIpOwogCiAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlQnVmZmVyID0gKGkgPj0gYnVmZmVycy5sZW5ndGgpID8gbnVsbCA6IGJ1ZmZlcnNbaV07CkBAIC01MjIsMTggKzUyNCwxNiBAQAogICAgICAgICAgICAgewogCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFN0cmluZy5mb3JtYXQoIkR1cGxpY2F0ZSBuYW1lcyBmb3VuZCBpbiBVRFQgJXMuJXMgZm9yIGNvbHVtbiAlczsgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIHJlc29sdmUgc2V0IC1EIiArIFVEVF9DT05GTElDVF9CRUhBVklPUiArICI9TE9HIG9uIHN0YXJ0dXAgYW5kIHJlbW92ZSB0aGUgdHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmVRdW90ZShrZXlzcGFjZSksIG1heWJlUXVvdGUobmFtZSksIG1heWJlUXVvdGUoZmllbGROYW1lKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byByZXNvbHZlIHNldCAtRCVzPUxPRyBvbiBzdGFydHVwIGFuZCByZW1vdmUgdGhlIHR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlUXVvdGUoa2V5c3BhY2UpLCBtYXliZVF1b3RlKG5hbWUpLCBtYXliZVF1b3RlKGZpZWxkTmFtZSksIFRZUEVfVURUX0NPTkZMSUNUX0JFSEFWSU9SLmdldEtleSgpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVEVF9DT05GTElDVF9CRUhBVklPUiA9ICJjYXNzYW5kcmEudHlwZS51ZHQuY29uZmxpY3RfYmVoYXZpb3IiOwotCiAgICAgICAgIGFic3RyYWN0IHZvaWQgb25Db25mbGljdChTdHJpbmcga2V5c3BhY2UsIFN0cmluZyBuYW1lLCBTdHJpbmcgZmllbGROYW1lKTsKIAogICAgICAgICBzdGF0aWMgQ29uZmxpY3RCZWhhdmlvciBnZXQoKQogICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoVURUX0NPTkZMSUNUX0JFSEFWSU9SLCBSRUpFQ1QubmFtZSgpKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IFRZUEVfVURUX0NPTkZMSUNUX0JFSEFWSU9SLmdldFN0cmluZyhSRUpFQ1QubmFtZSgpKTsKICAgICAgICAgICAgIHJldHVybiBDb25mbGljdEJlaGF2aW9yLnZhbHVlT2YodmFsdWUpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9WYWx1ZUFjY2Vzc29yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1ZhbHVlQWNjZXNzb3IuamF2YQppbmRleCBhNTE4MzZlLi4wYmI2Njc3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1ZhbHVlQWNjZXNzb3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1ZhbHVlQWNjZXNzb3IuamF2YQpAQCAtNjgsNiArNjgsNyBAQAogICAgICAgICBDZWxsPFY+IGNlbGwoQ29sdW1uTWV0YWRhdGEgY29sdW1uLCBsb25nIHRpbWVzdGFtcCwgaW50IHR0bCwgaW50IGxvY2FsRGVsZXRpb25UaW1lLCBWIHZhbHVlLCBDZWxsUGF0aCBwYXRoKTsKICAgICAgICAgQ2x1c3RlcmluZzxWPiBjbHVzdGVyaW5nKFYuLi4gdmFsdWVzKTsKICAgICAgICAgQ2x1c3RlcmluZzxWPiBjbHVzdGVyaW5nKCk7CisgICAgICAgIENsdXN0ZXJpbmc8Vj4gc3RhdGljQ2x1c3RlcmluZygpOwogICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Vj4gYm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGtpbmQsIFYuLi4gdmFsdWVzKTsKICAgICAgICAgQ2x1c3RlcmluZ0JvdW5kPFY+IGJvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZCBraW5kKTsKICAgICAgICAgQ2x1c3RlcmluZ0JvdW5kYXJ5PFY+IGJvdW5kYXJ5KENsdXN0ZXJpbmdQcmVmaXguS2luZCBraW5kLCBWLi4uIHZhbHVlcyk7CkBAIC0xMDUsNyArMTA2LDYgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGJvdW5kYXJ5KHJldmVyc2VkID8gSU5DTF9FTkRfRVhDTF9TVEFSVF9CT1VOREFSWSA6IEVYQ0xfRU5EX0lOQ0xfU1RBUlRfQk9VTkRBUlksIGJvdW5kVmFsdWVzKTsKICAgICAgICAgfQotCiAgICAgfQogICAgIC8qKgogICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGdpdmVuIHZhbHVlCkBAIC0xNjIsNyArMTYyLDcgQEAKIAogICAgIGRlZmF1bHQgdm9pZCB3cml0ZVdpdGhWSW50TGVuZ3RoKFYgdmFsdWUsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoc2l6ZSh2YWx1ZSkpOworICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihzaXplKHZhbHVlKSk7CiAgICAgICAgIHdyaXRlKHZhbHVlLCBvdXQpOwogICAgIH0KIApAQCAtMzMxLDYgKzMzMSwxMiBAQAogICAgIEJhbGxvdCB0b0JhbGxvdChWIHZhbHVlKTsKIAogICAgIC8qKgorICAgICAqIHdyaXRlcyB0aGUgYnl0ZSB2YWx1ZSB7QHBhcmFtIHZhbHVlfSB0byB7QHBhcmFtIGRzdH0gYXQgb2Zmc2V0IHtAcGFyYW0gb2Zmc2V0fQorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHtAcGFyYW0gdmFsdWV9CisgICAgICovCisgICAgaW50IHB1dEJ5dGUoViBkc3QsIGludCBvZmZzZXQsIGJ5dGUgdmFsdWUpOworCisgICAgLyoqCiAgICAgICogd3JpdGVzIHRoZSBzaG9ydCB2YWx1ZSB7QHBhcmFtIHZhbHVlfSB0byB7QHBhcmFtIGRzdH0gYXQgb2Zmc2V0IHtAcGFyYW0gb2Zmc2V0fQogICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHtAcGFyYW0gdmFsdWV9CiAgICAgICovCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9BYnN0cmFjdEFsbG9jYXRvck1lbXRhYmxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9BYnN0cmFjdEFsbG9jYXRvck1lbXRhYmxlLmphdmEKaW5kZXggYWUxMjUxNi4uODUyNmRhYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvQWJzdHJhY3RBbGxvY2F0b3JNZW10YWJsZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL0Fic3RyYWN0QWxsb2NhdG9yTWVtdGFibGUuamF2YQpAQCAtNDYsNiArNDYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW10YWJsZVBvb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk5hdGl2ZVBvb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5LlNsYWJQb29sOworaW1wb3J0IG9yZy5naXRodWIuamFtbS5Vbm1ldGVyZWQ7CiAKIC8qKgogICogQSBtZW10YWJsZSB0aGF0IHVzZXMgbWVtb3J5IHRyYWNrZWQgYW5kIG1heWJlIGFsbG9jYXRlZCB2aWEgYSBNZW10YWJsZUFsbG9jYXRvciBmcm9tIGEgTWVtdGFibGVQb29sLgpAQCAtNTcsMTcgKzU4LDI0IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1lbXRhYmxlUG9vbCBNRU1PUllfUE9PTCA9IEFic3RyYWN0QWxsb2NhdG9yTWVtdGFibGUuY3JlYXRlTWVtdGFibGVBbGxvY2F0b3JQb29sKCk7CiAKKyAgICBAVW5tZXRlcmVkCiAgICAgcHJvdGVjdGVkIGZpbmFsIE93bmVyIG93bmVyOworICAgIEBVbm1ldGVyZWQgIC8vIHRvdGFsIHBvb2wgc2l6ZSBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGluIG1lbXRhYmxlJ3MgZGVlcCBzaXplCiAgICAgcHJvdGVjdGVkIGZpbmFsIE1lbXRhYmxlQWxsb2NhdG9yIGFsbG9jYXRvcjsKIAogICAgIC8vIFJlY29yZCB0aGUgY29tcGFyYXRvciBvZiB0aGUgQ0ZTIGF0IHRoZSBjcmVhdGlvbiBvZiB0aGUgbWVtdGFibGUuIFRoaXMKICAgICAvLyBpcyBvbmx5IHVzZWQgd2hlbiBhIHVzZXIgdXBkYXRlIHRoZSBDRiBjb21wYXJhdG9yLCB0byBrbm93IGlmIHRoZQogICAgIC8vIG1lbXRhYmxlIHdhcyBjcmVhdGVkIHdpdGggdGhlIG5ldyBvciBvbGQgY29tcGFyYXRvci4KKyAgICBAVW5tZXRlcmVkCiAgICAgcHJvdGVjdGVkIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIGluaXRpYWxDb21wYXJhdG9yOworICAgIC8vIEFzIGFib3ZlLCB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgbWVtdGFibGUgbmVlZHMgdG8gYmUgZmx1c2hlZCBvbiBzY2hlbWEgY2hhbmdlLgorICAgIEBVbm1ldGVyZWQKKyAgICBwdWJsaWMgZmluYWwgRmFjdG9yeSBpbml0aWFsRmFjdG9yeTsKIAogICAgIHByaXZhdGUgZmluYWwgbG9uZyBjcmVhdGlvbk5hbm8gPSBDbG9jay5HbG9iYWwubmFub1RpbWUoKTsKIAotICAgIHByaXZhdGUgc3RhdGljIE1lbXRhYmxlUG9vbCBjcmVhdGVNZW10YWJsZUFsbG9jYXRvclBvb2woKQorICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyBNZW10YWJsZVBvb2wgY3JlYXRlTWVtdGFibGVBbGxvY2F0b3JQb29sKCkKICAgICB7CiAgICAgICAgIENvbmZpZy5NZW10YWJsZUFsbG9jYXRpb25UeXBlIGFsbG9jYXRpb25UeXBlID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1lbXRhYmxlQWxsb2NhdGlvblR5cGUoKTsKICAgICAgICAgbG9uZyBoZWFwTGltaXQgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TWVtdGFibGVIZWFwU3BhY2VJbk1pQigpIDw8IDIwOwpAQCAtMTA5LDYgKzExNyw3IEBACiAgICAgICAgIHN1cGVyKG1ldGFkYXRhUmVmLCBjb21taXRMb2dMb3dlckJvdW5kKTsKICAgICAgICAgdGhpcy5hbGxvY2F0b3IgPSBNRU1PUllfUE9PTC5uZXdBbGxvY2F0b3IobWV0YWRhdGFSZWYudG9TdHJpbmcoKSk7CiAgICAgICAgIHRoaXMuaW5pdGlhbENvbXBhcmF0b3IgPSBtZXRhZGF0YS5nZXQoKS5jb21wYXJhdG9yOworICAgICAgICB0aGlzLmluaXRpYWxGYWN0b3J5ID0gbWV0YWRhdGEoKS5wYXJhbXMubWVtdGFibGUuZmFjdG9yeSgpOwogICAgICAgICB0aGlzLm93bmVyID0gb3duZXI7CiAgICAgICAgIHNjaGVkdWxlRmx1c2goKTsKICAgICB9CkBAIC0xMjUsNyArMTM0LDcgQEAKICAgICAgICAgewogICAgICAgICBjYXNlIFNDSEVNQV9DSEFOR0U6CiAgICAgICAgICAgICByZXR1cm4gaW5pdGlhbENvbXBhcmF0b3IgIT0gbWV0YWRhdGEoKS5jb21wYXJhdG9yIC8vIElmIHRoZSBDRiBjb21wYXJhdG9yIGhhcyBjaGFuZ2VkLCBiZWNhdXNlIG91ciBwYXJ0aXRpb25zIHJlZmVyZW5jZSB0aGUgb2xkIG9uZQotICAgICAgICAgICAgICAgICAgIHx8IG1ldGFkYXRhKCkucGFyYW1zLm1lbXRhYmxlLmZhY3RvcnkoKSAhPSBmYWN0b3J5KCk7IC8vIElmIGEgZGlmZmVyZW50IHR5cGUgb2YgbWVtdGFibGUgaXMgcmVxdWVzdGVkCisgICAgICAgICAgICAgICAgICAgfHwgIWluaXRpYWxGYWN0b3J5LmVxdWFscyhtZXRhZGF0YSgpLnBhcmFtcy5tZW10YWJsZS5mYWN0b3J5KCkpOyAvLyBJZiBhIGRpZmZlcmVudCB0eXBlIG9mIG1lbXRhYmxlIGlzIHJlcXVlc3RlZAogICAgICAgICBjYXNlIE9XTkVEX1JBTkdFU19DSEFOR0U6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIGJ5IGRlZmF1bHQgd2UgZG9uJ3QgdXNlIHRoZSBsb2NhbCByYW5nZXMsIHRodXMgdGhpcyBoYXMgbm8gZWZmZWN0CiAgICAgICAgIGRlZmF1bHQ6CkBAIC0xNTAsOCArMTU5LDYgQEAKICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJwZXJmb3JtU25hcHNob3QgbXVzdCBiZSBpbXBsZW1lbnRlZCBpZiBzaG91bGRTd2l0Y2goU05BUFNIT1QpIGNhbiByZXR1cm4gZmFsc2UuIik7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IEZhY3RvcnkgZmFjdG9yeSgpOwotCiAgICAgcHVibGljIHZvaWQgc3dpdGNoT3V0KE9wT3JkZXIuQmFycmllciB3cml0ZUJhcnJpZXIsIEF0b21pY1JlZmVyZW5jZTxDb21taXRMb2dQb3NpdGlvbj4gY29tbWl0TG9nVXBwZXJCb3VuZCkKICAgICB7CiAgICAgICAgIHN1cGVyLnN3aXRjaE91dCh3cml0ZUJhcnJpZXIsIGNvbW1pdExvZ1VwcGVyQm91bmQpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvQWJzdHJhY3RNZW10YWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvQWJzdHJhY3RNZW10YWJsZS5qYXZhCmluZGV4IGNhNmRiZjYuLjhlNTA0NTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL0Fic3RyYWN0TWVtdGFibGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9BYnN0cmFjdE1lbXRhYmxlLmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CitpbXBvcnQgb3JnLmdpdGh1Yi5qYW1tLlVubWV0ZXJlZDsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWVtdGFibGUgaW1wbGVtZW50cyBNZW10YWJsZQogewpAQCAtNDgsNiArNDksNyBAQAogICAgIC8vIE5vdGU6IHN0YXRzQ29sbGVjdG9yIGhhcyBjb3JyZXNwb25kaW5nIHN0YXRpc3RpY3MgdG8gdGhlIHR3byBhYm92ZSwgYnV0IHN0YXJ0cyB3aXRoIGFuIGVwb2NoIHZhbHVlIHdoaWNoIGlzIG5vdAogICAgIC8vIGNvcnJlY3QgZm9yIHRoZWlyIHVzYWdlLgogCisgICAgQFVubWV0ZXJlZAogICAgIHByb3RlY3RlZCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhOwogCiAgICAgcHVibGljIEFic3RyYWN0TWVtdGFibGUoVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YVJlZikKQEAgLTc0LDEzICs3Niw2IEBACiAgICAgICAgIHJldHVybiBjdXJyZW50T3BlcmF0aW9ucy5nZXQoKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBtaW5UUyBpZiBvbmUgYXZhaWxhYmxlLCBvdGhlcndpc2UgTk9fTUlOX1RJTUVTVEFNUC4KLSAgICAgKgotICAgICAqIEVuY29kaW5nU3RhdHMgdXNlcyBhIHN5bnRoZXRpYyBlcG9jaCBUUyBhdCAyMDE1LiBXZSBkb24ndCB3YW50IHRvIGxlYWsgdGhhdCAoQ0FTU0FORFJBLTE4MTE4KSBzbyB3ZSByZXR1cm4gTk9fTUlOX1RJTUVTVEFNUCBpbnN0ZWFkLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWluVFMgb3IgTk9fTUlOX1RJTUVTVEFNUCBpZiBub25lIGF2YWlsYWJsZQotICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldE1pblRpbWVzdGFtcCgpCiAgICAgewogICAgICAgICByZXR1cm4gbWluVGltZXN0YW1wLmdldCgpICE9IEVuY29kaW5nU3RhdHMuTk9fU1RBVFMubWluVGltZXN0YW1wID8gbWluVGltZXN0YW1wLmdldCgpIDogTk9fTUlOX1RJTUVTVEFNUDsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL0Fic3RyYWN0U2hhcmRlZE1lbXRhYmxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9BYnN0cmFjdFNoYXJkZWRNZW10YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MTU3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9BYnN0cmFjdFNoYXJkZWRNZW10YWJsZS5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTUJlYW5XcmFwcGVyOworaW1wb3J0IG9yZy5naXRodWIuamFtbS5Vbm1ldGVyZWQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NRU1UQUJMRV9TSEFSRF9DT1VOVDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2hhcmRlZE1lbXRhYmxlIGV4dGVuZHMgQWJzdHJhY3RBbGxvY2F0b3JNZW10YWJsZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBYnN0cmFjdFNoYXJkZWRNZW10YWJsZS5jbGFzcyk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRFNfT1BUSU9OID0gInNoYXJkcyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hBUkRFRF9NRU1UQUJMRV9DT05GSUdfT0JKRUNUX05BTUUgPSAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI6dHlwZT1TaGFyZGVkTWVtdGFibGVDb25maWciOworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgTUJlYW5XcmFwcGVyLmluc3RhbmNlLnJlZ2lzdGVyTUJlYW4obmV3IFNoYXJkZWRNZW10YWJsZUNvbmZpZygpLCBTSEFSREVEX01FTVRBQkxFX0NPTkZJR19PQkpFQ1RfTkFNRSwgTUJlYW5XcmFwcGVyLk9uRXhjZXB0aW9uLkxPRyk7CisgICAgfQorCisgICAgLy8gZGVmYXVsdCBzaGFyZCBjb3VudCwgdXNlZCB3aGVuIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHNoYXJkcyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBvcHRpb25zCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgaW50IGRlZmF1bHRTaGFyZENvdW50ID0gTUVNVEFCTEVfU0hBUkRfQ09VTlQuZ2V0SW50KEZCVXRpbGl0aWVzLmdldEF2YWlsYWJsZVByb2Nlc3NvcnMoKSk7CisKKyAgICAvLyBUaGUgYm91bmRhcmllcyBmb3IgdGhlIGtleXNwYWNlIGFzIHRoZXkgd2VyZSBjYWxjdWxhdGVkIHdoZW4gdGhlIG1lbXRhYmxlIGlzIGNyZWF0ZWQuCisgICAgLy8gVGhlIGJvdW5kYXJpZXMgd2lsbCBiZSBOT05FIGZvciBzeXN0ZW0ga2V5c3BhY2VzIG9yIGlmIFN0b3JhZ2VTZXJ2aWNlIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQuCisgICAgLy8gVGhlIGZhY3QgdGhpcyBpcyBmaXhlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBtZW10YWJsZSBsaWZldGltZSwgZ3VhcmFudGVlcyB3ZSdsbCBhbHdheXMgcGljayB0aGUgc2FtZSBzaGFyZAorICAgIC8vIGZvciBhIGdpdmVuIGtleSwgZXZlbiBpZiB3ZSByYWNlIHdpdGggdGhlIFN0b3JhZ2VTZXJ2aWNlIGluaXRpYWxpemF0aW9uIG9yIHdpdGggdG9wb2xvZ3kgY2hhbmdlcy4KKyAgICBAVW5tZXRlcmVkCisgICAgcHJvdGVjdGVkIGZpbmFsIFNoYXJkQm91bmRhcmllcyBib3VuZGFyaWVzOworCisgICAgQWJzdHJhY3RTaGFyZGVkTWVtdGFibGUoQXRvbWljUmVmZXJlbmNlPENvbW1pdExvZ1Bvc2l0aW9uPiBjb21taXRMb2dMb3dlckJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duZXIgb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBzaGFyZENvdW50T3B0aW9uKQorICAgIHsKKyAgICAgICAgc3VwZXIoY29tbWl0TG9nTG93ZXJCb3VuZCwgbWV0YWRhdGFSZWYsIG93bmVyKTsKKyAgICAgICAgaW50IHNoYXJkQ291bnQgPSBzaGFyZENvdW50T3B0aW9uICE9IG51bGwgPyBzaGFyZENvdW50T3B0aW9uIDogZGVmYXVsdFNoYXJkQ291bnQ7CisgICAgICAgIHRoaXMuYm91bmRhcmllcyA9IG93bmVyLmxvY2FsUmFuZ2VTcGxpdHMoc2hhcmRDb3VudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2hhcmRlZE1lbXRhYmxlQ29uZmlnIGltcGxlbWVudHMgU2hhcmRlZE1lbXRhYmxlQ29uZmlnTVhCZWFuCisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdFNoYXJkQ291bnQoU3RyaW5nIHNoYXJkQ291bnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgiYXV0byIuZXF1YWxzSWdub3JlQ2FzZShzaGFyZENvdW50KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWZhdWx0U2hhcmRDb3VudCA9IEZCVXRpbGl0aWVzLmdldEF2YWlsYWJsZVByb2Nlc3NvcnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTaGFyZENvdW50ID0gSW50ZWdlci5wYXJzZUludChzaGFyZENvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJVbmFibGUgdG8gcGFyc2Uge30gYXMgdmFsaWQgdmFsdWUgZm9yIHNoYXJkIGNvdW50Iiwgc2hhcmRDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiUmVxdWVzdGVkIHNldHRpbmcgc2hhcmQgY291bnQgdG8ge307IHNldCB0bzoge30iLCBzaGFyZENvdW50LCBkZWZhdWx0U2hhcmRDb3VudCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2hhcmRDb3VudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGRlZmF1bHRTaGFyZENvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERlZmF1bHRTaGFyZENvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWZhdWx0U2hhcmRDb3VudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9GbHVzaGluZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvRmx1c2hpbmcuamF2YQppbmRleCAxYTMxMzc0Li5hZmU3YTEyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9GbHVzaGluZy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL0ZsdXNoaW5nLmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXNrQm91bmRhcmllczsKQEAgLTgyLDcgKzgzLDkgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGFib3J0UnVubmFibGVzKHJ1bm5hYmxlcywgZSkpOworICAgICAgICAgICAgVGhyb3dhYmxlIHQgPSBhYm9ydFJ1bm5hYmxlcyhydW5uYWJsZXMsIGUpOworICAgICAgICAgICAgVGhyb3dhYmxlcy50aHJvd0lmVW5jaGVja2VkKHQpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTk1LDEyICs5OCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeSBmbHVzaExvY2F0aW9uKQogICAgIHsKICAgICAgICAgTWVtdGFibGUuRmx1c2hhYmxlUGFydGl0aW9uU2V0PD8+IGZsdXNoU2V0ID0gbWVtdGFibGUuZ2V0Rmx1c2hTZXQoZnJvbSwgdG8pOwotICAgICAgICBTU1RhYmxlRm9ybWF0LlR5cGUgZm9ybWF0VHlwZSA9IFNTVGFibGVGb3JtYXQuVHlwZS5jdXJyZW50KCk7Ci0gICAgICAgIGxvbmcgZXN0aW1hdGVkU2l6ZSA9IGZvcm1hdFR5cGUuaW5mby5nZXRXcml0ZXJGYWN0b3J5KCkuZXN0aW1hdGVTaXplKGZsdXNoU2V0KTsKKyAgICAgICAgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCk7CisgICAgICAgIGxvbmcgZXN0aW1hdGVkU2l6ZSA9IGZvcm1hdC5nZXRXcml0ZXJGYWN0b3J5KCkuZXN0aW1hdGVTaXplKGZsdXNoU2V0KTsKIAogICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBmbHVzaExvY2F0aW9uID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0V3JpdGVhYmxlTG9jYXRpb25Bc0ZpbGUoZXN0aW1hdGVkU2l6ZSksIGZvcm1hdFR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGNmcy5nZXREaXJlY3RvcmllcygpLmdldExvY2F0aW9uRm9yRGlzayhmbHVzaExvY2F0aW9uKSwgZm9ybWF0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGNmcy5nZXREaXJlY3RvcmllcygpLmdldFdyaXRlYWJsZUxvY2F0aW9uQXNGaWxlKGVzdGltYXRlZFNpemUpLCBmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGNmcy5nZXREaXJlY3RvcmllcygpLmdldExvY2F0aW9uRm9yRGlzayhmbHVzaExvY2F0aW9uKSwgZm9ybWF0KTsKIAogICAgICAgICBTU1RhYmxlTXVsdGlXcml0ZXIgd3JpdGVyID0gY3JlYXRlRmx1c2hXcml0ZXIoY2ZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hTZXQsCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9NZW10YWJsZV9BUEkubWQgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9NZW10YWJsZV9BUEkubWQKaW5kZXggOGE1ODJlMy4uNzBmOGYwYiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVfQVBJLm1kCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlX0FQSS5tZApAQCAtNDUsMTMgKzQ1LDMyIEBACiAgICAgICAgICAgY2xhc3NfbmFtZTogU2tpcExpc3RNZW10YWJsZQogICAgICAgICBzaGFyZGVkOgogICAgICAgICAgIGNsYXNzX25hbWU6IFNoYXJkZWRTa2lwTGlzdE1lbXRhYmxlCisgICAgICAgIHRyaWU6CisgICAgICAgICAgY2xhc3NfbmFtZTogVHJpZU1lbXRhYmxlCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgaW5oZXJpdHM6IHNoYXJkZWQKKyAgICAgICAgICBpbmhlcml0czogdHJpZQogYGBgCiAKIE5vdGUgdGhhdCB0aGUgZGF0YWJhc2Ugd2lsbCBvbmx5IHZhbGlkYXRlIHRoZSBtZW10YWJsZSBjbGFzcyBhbmQgaXRzIHBhcmFtZXRlcnMgd2hlbiBhIGNvbmZpZ3VyYXRpb24gbmVlZHMgdG8gYmUKIGluc3RhbnRpYXRlZCBmb3IgYSB0YWJsZS4KIAorIyMgSW1wbGVtZW50YXRpb25zIHByb3ZpZGVkCisKK0Nhc3NhbmRyYSBjdXJyZW50bHkgY29tZXMgd2l0aCB0aHJlZSBtZW10YWJsZSBpbXBsZW1lbnRhdGlvbnM6CisKKy0gYFNraXBMaXN0TWVtdGFibGVgIGlzIHRoZSBkZWZhdWx0IGFuZCBtYXRjaGVzIHRoZSBtZW10YWJsZSBmb3JtYXQgb2YgQ2Fzc2FuZHJhIHZlcnNpb25zIHVwIHRvIDQuMS4gSXQgb3JnYW5pemVzCisgIHBhcnRpdGlvbnMgaW50byBhIHNpbmdsZSBjb25jdXJyZW50IHNraXAgbGlzdC4KKy0gYFNoYXJkZWRTa2lwTGlzdE1lbXRhYmxlYCBzcGxpdHMgdGhlIHBhcnRpdGlvbiBza2lwLWxpc3QgaW50byBzZXZlcmFsIGluZGVwZW5kZW50IHNraXAtbGlzdHMgZWFjaCBjb3ZlcmluZyBhIHJvdWdobHkKKyAgZXF1YWwgcGFydCBvZiB0aGUgdG9rZW4gc3BhY2Ugc2VydmVkIGJ5IHRoaXMgbm9kZS4gVGhpcyByZWR1Y2VzIGNvbmdlc3Rpb24gb2YgdGhlIHNraXAtbGlzdCBmcm9tIGNvbmN1cnJlbnQgd3JpdGVzIGFuZAorICBjYW4gbGVhZCB0byBpbXByb3ZlZCB3cml0ZSB0aHJvdWdocHV0LiBJdHMgY29uZmlndXJhdGlvbiB0YWtlcyB0d28gcGFyYW1ldGVyczoKKyAgLSBgc2hhcmRzYDogdGhlIG51bWJlciBvZiBzaGFyZHMgdG8gc3BsaXQgaW50bywgZGVmYXVsdGluZyB0byB0aGUgbnVtYmVyIG9mIENQVSBjb3JlcyBvbiB0aGUgbWFjaGluZS4KKyAgLSBgc2VyaWFsaXplX3dyaXRlc2A6IGlmIGZhbHNlIChkZWZhdWx0KSwgZWFjaCBzaGFyZCBtYXkgc2VydmUgbXVsdGlwbGUgd3JpdGVzIGluIHBhcmFsbGVsOyBpZiB0cnVlLCB3cml0ZXMgdG8gZWFjaAorICAgIHNoYXJkIGFyZSBzeW5jaHJvbml6ZWQuCistIGBUcmllTWVtdGFibGVgIGlzIGEgbm92ZWwgc29sdXRpb24gdGhhdCBvcmdhbml6ZXMgcGFydGl0aW9ucyBpbnRvIGFuIGluLW1lbW9yeSB0cmllIHdoaWNoIHBsYWNlcyB0aGUgcGFydGl0aW9uCisgIGluZGV4aW5nIHN0cnVjdHVyZSBpbiBhIGJ1ZmZlciwgb2ZmLWhlYXAgaWYgZGVzaXJlZCwgd2hpY2ggc2lnbmlmaWNhbnRseSBpbXByb3ZlcyBnYXJiYWdlIGNvbGxlY3Rpb24gZWZmaWNpZW5jeS4gSXQKKyAgYWxzbyBpbXByb3ZlcyB0aGUgbWVtdGFibGUncyBzcGFjZSBlZmZpY2llbmN5IGFuZCBsb29rdXAgcGVyZm9ybWFuY2UuIEl0cyBjb25maWd1cmF0aW9uIGNhbiB0YWtlIGEgc2luZ2xlIHBhcmFtZXRlcgorICBgc2hhcmRzYCBhcyBhYm92ZS4KKwogIyMgTWVtdGFibGUgc2VsZWN0aW9uCiAKIE9uY2UgYSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGRlZmluZWQsIGl0IGNhbiBiZSB1c2VkIGJ5IHNwZWNpZnlpbmcgaXQgaW4gdGhlIGBtZW10YWJsZWAgcGFyYW1ldGVyIG9mIGEgYENSRUFURSBUQUJMRWAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1NoYXJkQm91bmRhcmllcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvU2hhcmRCb3VuZGFyaWVzLmphdmEKaW5kZXggZmI5Y2M5OC4uODY0ODk5ZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvU2hhcmRCb3VuZGFyaWVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvU2hhcmRCb3VuZGFyaWVzLmphdmEKQEAgLTIyLDcgKzIyLDYgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CkBAIC04Myw3ICs4Miw3IEBACiAgICAgICAgIGlmIChib3VuZGFyaWVzLmxlbmd0aCA9PSAwKQogICAgICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgYXNzZXJ0IChrZXkuZ2V0UGFydGl0aW9uZXIoKSA9PSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UGFydGl0aW9uZXIoKSk7CisgICAgICAgIGFzc2VydCAoa2V5LmdldFBhcnRpdGlvbmVyKCkgPT0gYm91bmRhcmllc1swXS5nZXRQYXJ0aXRpb25lcigpKTsKICAgICAgICAgcmV0dXJuIGdldFNoYXJkRm9yVG9rZW4oa2V5LmdldFRva2VuKCkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvU2hhcmRlZE1lbXRhYmxlQ29uZmlnTVhCZWFuLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9TaGFyZGVkTWVtdGFibGVDb25maWdNWEJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGZmMTBlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvU2hhcmRlZE1lbXRhYmxlQ29uZmlnTVhCZWFuLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZTsKKworcHVibGljIGludGVyZmFjZSBTaGFyZGVkTWVtdGFibGVDb25maWdNWEJlYW4KK3sKKyAgICAvKioKKyAgICAgKiBBZGp1c3QgdGhlIHNoYXJkIGNvdW50IGZvciBzaGFyZGVkIG1lbXRhYmxlcyB0aGF0IGRvIG5vdCBzcGVjaWZ5IGl0IGV4cGxpY2l0bHkgaW4gdGhlIG1lbXRhYmxlIG9wdGlvbnMuCisgICAgICogQ2hhbmdlcyB3aWxsIGFwcGx5IG9uIHRoZSBuZXh0IG1lbXRhYmxlIGZsdXNoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRTaGFyZENvdW50KFN0cmluZyBudW1TaGFyZHMpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2hhcmQgY291bnQgZm9yIHNoYXJkZWQgbWVtdGFibGVzIHRoYXQgZG8gbm90IHNwZWNpZnkgaXQgZXhwbGljaXRseSBpbiB0aGUgbWVtdGFibGUgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTaGFyZENvdW50KCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9TaGFyZGVkU2tpcExpc3RNZW10YWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvU2hhcmRlZFNraXBMaXN0TWVtdGFibGUuamF2YQppbmRleCA1MWNkNWYyLi4wMzZkNzQyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9TaGFyZGVkU2tpcExpc3RNZW10YWJsZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1NoYXJkZWRTa2lwTGlzdE1lbXRhYmxlLmphdmEKQEAgLTQxLDYgKzQxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQWJzdHJhY3RVbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5BdG9taWNCVHJlZVBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkJUcmVlUGFydGl0aW9uVXBkYXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvblVwZGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKQEAgLTUxLDEwICs1Miw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkluY2x1ZGluZ0V4Y2x1ZGluZ0JvdW5kczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXgudHJhbnNhY3Rpb25zLlVwZGF0ZVRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5PcE9yZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5DbG9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk1lbXRhYmxlQWxsb2NhdG9yOwpAQCAtNzIsNDYgKzcyLDI2IEBACiAgKgogICogQWxzbyBzZWUgTWVtdGFibGVfQVBJLm1kLgogICovCi1wdWJsaWMgY2xhc3MgU2hhcmRlZFNraXBMaXN0TWVtdGFibGUgZXh0ZW5kcyBBYnN0cmFjdEFsbG9jYXRvck1lbXRhYmxlCitwdWJsaWMgY2xhc3MgU2hhcmRlZFNraXBMaXN0TWVtdGFibGUgZXh0ZW5kcyBBYnN0cmFjdFNoYXJkZWRNZW10YWJsZQogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTaGFyZGVkU2tpcExpc3RNZW10YWJsZS5jbGFzcyk7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRFNfT1BUSU9OID0gInNoYXJkcyI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS0lOR19PUFRJT04gPSAic2VyaWFsaXplX3dyaXRlcyI7CiAKLSAgICAvLyBUaGUgYm91bmRhcmllcyBmb3IgdGhlIGtleXNwYWNlIGFzIHRoZXkgd2VyZSBjYWxjdWxhdGVkIHdoZW4gdGhlIG1lbXRhYmxlIGlzIGNyZWF0ZWQuCi0gICAgLy8gVGhlIGJvdW5kYXJpZXMgd2lsbCBiZSBOT05FIGZvciBzeXN0ZW0ga2V5c3BhY2VzIG9yIGlmIFN0b3JhZ2VTZXJ2aWNlIGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQuCi0gICAgLy8gVGhlIGZhY3QgdGhpcyBpcyBmaXhlZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBtZW10YWJsZSBsaWZldGltZSwgZ3VhcmFudGVlcyB3ZSdsbCBhbHdheXMgcGljayB0aGUgc2FtZSBzaGFyZAotICAgIC8vIGZvciBhIGdpdmVuIGtleSwgZXZlbiBpZiB3ZSByYWNlIHdpdGggdGhlIFN0b3JhZ2VTZXJ2aWNlIGluaXRpYWxpemF0aW9uIG9yIHdpdGggdG9wb2xvZ3kgY2hhbmdlcy4KLSAgICBAVW5tZXRlcmVkCi0gICAgZmluYWwgU2hhcmRCb3VuZGFyaWVzIGJvdW5kYXJpZXM7Ci0KICAgICAvKioKLSAgICAgKiBDb3JlLXNwZWNpZmljIG1lbXRhYmxlIHJlZ2lvbnMuIEFsbCB3cml0ZXMgbXVzdCBnbyB0aHJvdWdoIHRoZSBzcGVjaWZpYyBjb3JlLiBUaGUgZGF0YSBzdHJ1Y3R1cmVzIHVzZWQKLSAgICAgKiBhcmUgY29uY3VycmVudC1yZWFkIHNhZmUsIHRodXMgcmVhZHMgY2FuIGJlIGNhcnJpZWQgb3V0IGZyb20gYW55IHRocmVhZC4KKyAgICAgKiBTaGFyZGVkIG1lbXRhYmxlIHNlY3Rpb25zLiBFYWNoIGlzIHJlc3BvbnNpYmxlIGZvciBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgdGhlIHRva2VuIHNwYWNlIChiZXR3ZWVuIGJvdW5kYXJpZXNbaV0KKyAgICAgKiBhbmQgYm91bmRhcmllc1tpKzFdKSBhbmQgaXMgd3JpdHRlbiB0byBieSBvbmUgdGhyZWFkIGF0IGEgdGltZSwgd2hpbGUgcmVhZHMgYXJlIGNhcnJpZWQgb3V0IGNvbmN1cnJlbnRseQorICAgICAqIChpbmNsdWRpbmcgd2l0aCBhbnkgd3JpdGUpLgogICAgICAqLwogICAgIGZpbmFsIE1lbXRhYmxlU2hhcmRbXSBzaGFyZHM7CiAKLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRF9DT1VOVF9QUk9QRVJUWSA9ICJjYXNzYW5kcmEubWVtdGFibGUuc2hhcmQuY291bnQiOwotCi0gICAgLy8gZGVmYXVsdCBzaGFyZCBjb3VudCwgdXNlZCB3aGVuIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHNoYXJkcyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBwYXJhbWV0ZXJzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIQVJEX0NPVU5UID0gSW50ZWdlci5nZXRJbnRlZ2VyKFNIQVJEX0NPVU5UX1BST1BFUlRZLCBGQlV0aWxpdGllcy5nZXRBdmFpbGFibGVQcm9jZXNzb3JzKCkpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgICAvLyBvbmx5IHRvIGJlIHVzZWQgYnkgaW5pdCgpLCB0byBzZXR1cCB0aGUgdmVyeSBmaXJzdCBtZW10YWJsZSBmb3IgdGhlIGNmcwogICAgIFNoYXJkZWRTa2lwTGlzdE1lbXRhYmxlKEF0b21pY1JlZmVyZW5jZTxDb21taXRMb2dQb3NpdGlvbj4gY29tbWl0TG9nTG93ZXJCb3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhUmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE93bmVyIG93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgc2hhcmRDb3VudE9wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5IGZhY3RvcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBzaGFyZENvdW50T3B0aW9uKQogICAgIHsKLSAgICAgICAgc3VwZXIoY29tbWl0TG9nTG93ZXJCb3VuZCwgbWV0YWRhdGFSZWYsIG93bmVyKTsKLSAgICAgICAgaW50IHNoYXJkQ291bnQgPSBzaGFyZENvdW50T3B0aW9uICE9IG51bGwgPyBzaGFyZENvdW50T3B0aW9uIDogU0hBUkRfQ09VTlQ7Ci0gICAgICAgIHRoaXMuYm91bmRhcmllcyA9IG93bmVyLmxvY2FsUmFuZ2VTcGxpdHMoc2hhcmRDb3VudCk7CisgICAgICAgIHN1cGVyKGNvbW1pdExvZ0xvd2VyQm91bmQsIG1ldGFkYXRhUmVmLCBvd25lciwgc2hhcmRDb3VudE9wdGlvbik7CiAgICAgICAgIHRoaXMuc2hhcmRzID0gZ2VuZXJhdGVQYXJ0aXRpb25TaGFyZHMoYm91bmRhcmllcy5zaGFyZENvdW50KCksIGFsbG9jYXRvciwgbWV0YWRhdGFSZWYpOwotICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIE1lbXRhYmxlU2hhcmRbXSBnZW5lcmF0ZVBhcnRpdGlvblNoYXJkcyhpbnQgc3BsaXRzLApAQCAtMTI4LDE3ICsxMDgsMTEgQEAKICAgICBwdWJsaWMgYm9vbGVhbiBpc0NsZWFuKCkKICAgICB7CiAgICAgICAgIGZvciAoTWVtdGFibGVTaGFyZCBzaGFyZCA6IHNoYXJkcykKLSAgICAgICAgICAgIGlmICghc2hhcmQuaXNFbXB0eSgpKQorICAgICAgICAgICAgaWYgKCFzaGFyZC5pc0NsZWFuKCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgTWVtdGFibGUuRmFjdG9yeSBmYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWN0b3J5OwotICAgIH0KLQogICAgIC8qKgogICAgICAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBDb2x1bW5GYW1pbHlTdG9yZS5hcHBseSB2aWEgS2V5c3BhY2UuYXBwbHksIHdoaWNoIHN1cHBsaWVzIHRoZSBhcHByb3ByaWF0ZQogICAgICAqIE9wT3JkZXJpbmcuCkBAIC0zOTYsMTQgKzM3MCwxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbG9uZ1tdIHBhaXIgPSBwcmV2aW91cy5hZGRBbGxXaXRoU2l6ZURlbHRhKHVwZGF0ZSwgY2xvbmVyLCBvcEdyb3VwLCBpbmRleGVyKTsKKyAgICAgICAgICAgIEJUcmVlUGFydGl0aW9uVXBkYXRlciB1cGRhdGVyID0gcHJldmlvdXMuYWRkQWxsKHVwZGF0ZSwgY2xvbmVyLCBvcEdyb3VwLCBpbmRleGVyKTsKICAgICAgICAgICAgIHVwZGF0ZU1pbihtaW5UaW1lc3RhbXAsIHVwZGF0ZS5zdGF0cygpLm1pblRpbWVzdGFtcCk7CiAgICAgICAgICAgICB1cGRhdGVNaW4obWluTG9jYWxEZWxldGlvblRpbWUsIHVwZGF0ZS5zdGF0cygpLm1pbkxvY2FsRGVsZXRpb25UaW1lKTsKLSAgICAgICAgICAgIGxpdmVEYXRhU2l6ZS5hZGRBbmRHZXQoaW5pdGlhbFNpemUgKyBwYWlyWzBdKTsKKyAgICAgICAgICAgIGxpdmVEYXRhU2l6ZS5hZGRBbmRHZXQoaW5pdGlhbFNpemUgKyB1cGRhdGVyLmRhdGFTaXplKTsKICAgICAgICAgICAgIGNvbHVtbnNDb2xsZWN0b3IudXBkYXRlKHVwZGF0ZS5jb2x1bW5zKCkpOwogICAgICAgICAgICAgc3RhdHNDb2xsZWN0b3IudXBkYXRlKHVwZGF0ZS5zdGF0cygpKTsKICAgICAgICAgICAgIGN1cnJlbnRPcGVyYXRpb25zLmFkZEFuZEdldCh1cGRhdGUub3BlcmF0aW9uQ291bnQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gcGFpclsxXTsKKyAgICAgICAgICAgIHJldHVybiB1cGRhdGVyLmNvbFVwZGF0ZVRpbWVEZWx0YTsKICAgICAgICAgfQogCiAgICAgICAgIHByaXZhdGUgTWFwPFBhcnRpdGlvblBvc2l0aW9uLCBBdG9taWNCVHJlZVBhcnRpdGlvbj4gZ2V0UGFydGl0aW9uc1N1Yk1hcChQYXJ0aXRpb25Qb3NpdGlvbiBsZWZ0LApAQCAtNDMyLDcgKzQwNiw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDbGVhbigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBwYXJ0aXRpb25zLmlzRW1wdHkoKTsKICAgICAgICAgfQpAQCAtNTAwLDkgKzQ3NCw5IEBACiAKICAgICBzdGF0aWMgY2xhc3MgTG9ja2luZyBleHRlbmRzIFNoYXJkZWRTa2lwTGlzdE1lbXRhYmxlCiAgICAgewotICAgICAgICBMb2NraW5nKEF0b21pY1JlZmVyZW5jZTxDb21taXRMb2dQb3NpdGlvbj4gY29tbWl0TG9nTG93ZXJCb3VuZCwgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YVJlZiwgT3duZXIgb3duZXIsIEludGVnZXIgc2hhcmRDb3VudE9wdGlvbiwgRmFjdG9yeSBmYWN0b3J5KQorICAgICAgICBMb2NraW5nKEF0b21pY1JlZmVyZW5jZTxDb21taXRMb2dQb3NpdGlvbj4gY29tbWl0TG9nTG93ZXJCb3VuZCwgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YVJlZiwgT3duZXIgb3duZXIsIEludGVnZXIgc2hhcmRDb3VudE9wdGlvbikKICAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoY29tbWl0TG9nTG93ZXJCb3VuZCwgbWV0YWRhdGFSZWYsIG93bmVyLCBzaGFyZENvdW50T3B0aW9uLCBmYWN0b3J5KTsKKyAgICAgICAgICAgIHN1cGVyKGNvbW1pdExvZ0xvd2VyQm91bmQsIG1ldGFkYXRhUmVmLCBvd25lciwgc2hhcmRDb3VudE9wdGlvbik7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTU0Nyw4ICs1MjEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE93bmVyIG93bmVyKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gaXNMb2NraW5nCi0gICAgICAgICAgICAgICAgICAgPyBuZXcgTG9ja2luZyhjb21taXRMb2dMb3dlckJvdW5kLCBtZXRhZGF0YVJlZiwgb3duZXIsIHNoYXJkQ291bnQsIHRoaXMpCi0gICAgICAgICAgICAgICAgICAgOiBuZXcgU2hhcmRlZFNraXBMaXN0TWVtdGFibGUoY29tbWl0TG9nTG93ZXJCb3VuZCwgbWV0YWRhdGFSZWYsIG93bmVyLCBzaGFyZENvdW50LCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICA/IG5ldyBMb2NraW5nKGNvbW1pdExvZ0xvd2VyQm91bmQsIG1ldGFkYXRhUmVmLCBvd25lciwgc2hhcmRDb3VudCkKKyAgICAgICAgICAgICAgICAgICA6IG5ldyBTaGFyZGVkU2tpcExpc3RNZW10YWJsZShjb21taXRMb2dMb3dlckJvdW5kLCBtZXRhZGF0YVJlZiwgb3duZXIsIHNoYXJkQ291bnQpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvU2tpcExpc3RNZW10YWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvU2tpcExpc3RNZW10YWJsZS5qYXZhCmluZGV4IDE3YzBjY2UuLmU2ZmVjZWMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1NraXBMaXN0TWVtdGFibGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9Ta2lwTGlzdE1lbXRhYmxlLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZTsKIAoraW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE5hdmlnYWJsZU1hcDsKQEAgLTM2LDkgKzM3LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1Bvc2l0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5DbHVzdGVyaW5nSW5kZXhGaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkFic3RyYWN0QlRyZWVQYXJ0aXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5BYnN0cmFjdFVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkF0b21pY0JUcmVlUGFydGl0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQlRyZWVQYXJ0aXRpb25EYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQlRyZWVQYXJ0aXRpb25VcGRhdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uVXBkYXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOwpAQCAtNDksMTQgKzUxLDE0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnRyYW5zYWN0aW9ucy5VcGRhdGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk9iamVjdFNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuT3BPcmRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuQ2xvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW10YWJsZUFsbG9jYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTmF0aXZlQWxsb2NhdG9yOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTUVNVEFCTEVfT1ZFUkhFQURfQ09NUFVURV9TVEVQUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NRU1UQUJMRV9PVkVSSEVBRF9TSVpFOwpAQCAtOTAsMTIgKzkyLDYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRmFjdG9yeSBmYWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQUNUT1JZOwotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzQ2xlYW4oKQogICAgIHsKICAgICAgICAgcmV0dXJuIHBhcnRpdGlvbnMuaXNFbXB0eSgpOwpAQCAtMTMxLDE0ICsxMjcsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGxvbmdbXSBwYWlyID0gcHJldmlvdXMuYWRkQWxsV2l0aFNpemVEZWx0YSh1cGRhdGUsIGNsb25lciwgb3BHcm91cCwgaW5kZXhlcik7CisgICAgICAgIEJUcmVlUGFydGl0aW9uVXBkYXRlciB1cGRhdGVyID0gcHJldmlvdXMuYWRkQWxsKHVwZGF0ZSwgY2xvbmVyLCBvcEdyb3VwLCBpbmRleGVyKTsKICAgICAgICAgdXBkYXRlTWluKG1pblRpbWVzdGFtcCwgdXBkYXRlLnN0YXRzKCkubWluVGltZXN0YW1wKTsKICAgICAgICAgdXBkYXRlTWluKG1pbkxvY2FsRGVsZXRpb25UaW1lLCB1cGRhdGUuc3RhdHMoKS5taW5Mb2NhbERlbGV0aW9uVGltZSk7Ci0gICAgICAgIGxpdmVEYXRhU2l6ZS5hZGRBbmRHZXQoaW5pdGlhbFNpemUgKyBwYWlyWzBdKTsKKyAgICAgICAgbGl2ZURhdGFTaXplLmFkZEFuZEdldChpbml0aWFsU2l6ZSArIHVwZGF0ZXIuZGF0YVNpemUpOwogICAgICAgICBjb2x1bW5zQ29sbGVjdG9yLnVwZGF0ZSh1cGRhdGUuY29sdW1ucygpKTsKICAgICAgICAgc3RhdHNDb2xsZWN0b3IudXBkYXRlKHVwZGF0ZS5zdGF0cygpKTsKICAgICAgICAgY3VycmVudE9wZXJhdGlvbnMuYWRkQW5kR2V0KHVwZGF0ZS5vcGVyYXRpb25Db3VudCgpKTsKLSAgICAgICAgcmV0dXJuIHBhaXJbMV07CisgICAgICAgIHJldHVybiB1cGRhdGVyLmNvbFVwZGF0ZVRpbWVEZWx0YTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTIyNywxMyArMjIzLDE4IEBACiAgICAgICAgICAgICBDbG9uZXIgY2xvbmVyID0gYWxsb2NhdG9yLmNsb25lcihncm91cCk7CiAgICAgICAgICAgICBDb25jdXJyZW50TmF2aWdhYmxlTWFwPFBhcnRpdGlvblBvc2l0aW9uLCBPYmplY3Q+IHBhcnRpdGlvbnMgPSBuZXcgQ29uY3VycmVudFNraXBMaXN0TWFwPD4oKTsKICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWwgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgdGVzdEJ1ZmZlclNpemUgPSA4OwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgY291bnQgOyBpKyspCi0gICAgICAgICAgICAgICAgcGFydGl0aW9ucy5wdXQoY2xvbmVyLmNsb25lKG5ldyBCdWZmZXJEZWNvcmF0ZWRLZXkobmV3IExvbmdUb2tlbihpKSwgQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIpKSwgdmFsKTsKLSAgICAgICAgICAgIGRvdWJsZSBhdmdTaXplID0gT2JqZWN0U2l6ZXMubWVhc3VyZURlZXAocGFydGl0aW9ucykgLyAoZG91YmxlKSBjb3VudDsKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb25zLnB1dChjbG9uZXIuY2xvbmUobmV3IEJ1ZmZlckRlY29yYXRlZEtleShuZXcgTG9uZ1Rva2VuKGkpLCBCeXRlQnVmZmVyLmFsbG9jYXRlKHRlc3RCdWZmZXJTaXplKSkpLCB2YWwpOworICAgICAgICAgICAgZG91YmxlIGF2Z1NpemUgPSBPYmplY3RTaXplcy5tZWFzdXJlRGVlcE9taXRTaGFyZWQocGFydGl0aW9ucykgLyAoZG91YmxlKSBjb3VudDsKICAgICAgICAgICAgIHJvd092ZXJoZWFkID0gKGludCkgKChhdmdTaXplIC0gTWF0aC5mbG9vcihhdmdTaXplKSkgPCAwLjA1ID8gTWF0aC5mbG9vcihhdmdTaXplKSA6IE1hdGguY2VpbChhdmdTaXplKSk7Ci0gICAgICAgICAgICByb3dPdmVyaGVhZCAtPSBPYmplY3RTaXplcy5tZWFzdXJlRGVlcChuZXcgTG9uZ1Rva2VuKDApKTsKKyAgICAgICAgICAgIHJvd092ZXJoZWFkIC09IG5ldyBMb25nVG9rZW4oMCkuZ2V0SGVhcFNpemUoKTsKICAgICAgICAgICAgIHJvd092ZXJoZWFkICs9IEF0b21pY0JUcmVlUGFydGl0aW9uLkVNUFRZX1NJWkU7Ci0gICAgICAgICAgICByb3dPdmVyaGVhZCArPSBBYnN0cmFjdEJUcmVlUGFydGl0aW9uLkhPTERFUl9VTlNIQVJFRF9IRUFQX1NJWkU7CisgICAgICAgICAgICByb3dPdmVyaGVhZCArPSBCVHJlZVBhcnRpdGlvbkRhdGEuVU5TSEFSRURfSEVBUF9TSVpFOworICAgICAgICAgICAgaWYgKCEoYWxsb2NhdG9yIGluc3RhbmNlb2YgTmF0aXZlQWxsb2NhdG9yKSkKKyAgICAgICAgICAgICAgICByb3dPdmVyaGVhZCAtPSB0ZXN0QnVmZmVyU2l6ZTsgIC8vIG1lYXN1cmVEZWVwT21pdFNoYXJlZCBpbmNsdWRlcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGV2ZW4gZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmYtaGVhcCBidWZmZXJzLCBidXQgbm90IGZvciBkaXJlY3QgbWVtb3J5LgorICAgICAgICAgICAgLy8gRGVjb3JhdGVkIGtleSBvdmVyaGVhZCB3aXRoIGJ5dGUgYnVmZmVyIChpZiBuZWVkZWQpIGlzIGluY2x1ZGVkCiAgICAgICAgICAgICBhbGxvY2F0b3Iuc2V0RGlzY2FyZGluZygpOwogICAgICAgICAgICAgYWxsb2NhdG9yLnNldERpc2NhcmRlZCgpOwogICAgICAgICAgICAgcmV0dXJuIHJvd092ZXJoZWFkOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvVHJpZU1lbXRhYmxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9UcmllTWVtdGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGQ1OTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvVHJpZU1lbXRhYmxlLmphdmEKQEAgLTAsMCArMSw3MjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTmF2aWdhYmxlU2V0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmF0b3JzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkJ1ZmZlckRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRhdGFSYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNsdXN0ZXJpbmdJbmRleEZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQWJzdHJhY3RVbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5CVHJlZVBhcnRpdGlvbkRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5CVHJlZVBhcnRpdGlvblVwZGF0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5JbW11dGFibGVCVHJlZVBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvblVwZGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXMuSW5NZW1vcnlUcmllOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzLlRyaWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Cb3VuZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkluY2x1ZGluZ0V4Y2x1ZGluZ0JvdW5kczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXgudHJhbnNhY3Rpb25zLlVwZGF0ZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkJ1ZmZlclR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlRhYmxlTWV0cmljczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlRyaWVNZW10YWJsZU1ldHJpY3NWaWV3OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5PcE9yZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5FbnN1cmVPbkhlYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk1lbXRhYmxlQWxsb2NhdG9yOworaW1wb3J0IG9yZy5naXRodWIuamFtbS5Vbm1ldGVyZWQ7CisKKy8qKgorICogVHJpZSBtZW10YWJsZSBpbXBsZW1lbnRhdGlvbi4gSW1wcm92ZXMgbWVtb3J5IHVzYWdlLCBnYXJiYWdlIGNvbGxlY3Rpb24gZWZmaWNpZW5jeSBhbmQgbG9va3VwIHBlcmZvcm1hbmNlLgorICogVGhlIGltcGxlbWVudGF0aW9uIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgaW4gdGhlIHBhcGVyOgorICogICAgICAgaHR0cHM6Ly93d3cudmxkYi5vcmcvcHZsZGIvdm9sMTUvcDMzNTktbGFtYm92LnBkZgorICoKKyAqIFRoZSBjb25maWd1cmF0aW9uIHRha2VzIGEgc2luZ2xlIHBhcmFtZXRlcjoKKyAqIC0gc2hhcmRzOiB0aGUgbnVtYmVyIG9mIHNoYXJkcyB0byBzcGxpdCBpbnRvLCBkZWZhdWx0aW5nIHRvIHRoZSBudW1iZXIgb2YgQ1BVIGNvcmVzLgorICoKKyAqIEFsc28gc2VlIE1lbXRhYmxlX0FQSS5tZC4KKyAqLworcHVibGljIGNsYXNzIFRyaWVNZW10YWJsZSBleHRlbmRzIEFic3RyYWN0U2hhcmRlZE1lbXRhYmxlCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRyaWVNZW10YWJsZS5jbGFzcyk7CisKKyAgICAvKiogQnVmZmVyIHR5cGUgdG8gdXNlIGZvciBtZW10YWJsZSB0cmllcyAob24tIHZzIG9mZi1oZWFwKSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQnVmZmVyVHlwZSBCVUZGRVJfVFlQRTsKKworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgc3dpdGNoIChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TWVtdGFibGVBbGxvY2F0aW9uVHlwZSgpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgdW5zbGFiYmVkX2hlYXBfYnVmZmVyczoKKyAgICAgICAgY2FzZSBoZWFwX2J1ZmZlcnM6CisgICAgICAgICAgICBCVUZGRVJfVFlQRSA9IEJ1ZmZlclR5cGUuT05fSEVBUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIG9mZmhlYXBfYnVmZmVyczoKKyAgICAgICAgY2FzZSBvZmZoZWFwX29iamVjdHM6CisgICAgICAgICAgICBCVUZGRVJfVFlQRSA9IEJ1ZmZlclR5cGUuT0ZGX0hFQVA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIElmIGtleXMgaXMgYmVsb3cgdGhpcyBsZW5ndGgsIHdlIHdpbGwgdXNlIGEgcmVjdXJzaXZlIHByb2NlZHVyZSBmb3IgaW5zZXJ0aW5nIGRhdGEgaW4gdGhlIG1lbXRhYmxlIHRyaWUuICovCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JFQ1VSU0lWRV9LRVlfTEVOR1RIID0gMTI4OworCisgICAgLyoqIFRoZSBieXRlLW9yZGVyaW5nIGNvbnZlcnNpb24gdmVyc2lvbiB0byB1c2UgZm9yIG1lbXRhYmxlcy4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gQllURV9DT01QQVJBQkxFX1ZFUlNJT04gPSBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwOworCisgICAgLy8gU2V0IHRvIHRydWUgd2hlbiB0aGUgbWVtdGFibGUgcmVxdWVzdHMgYSBzd2l0Y2ggKGUuZy4gZm9yIHRyaWUgc2l6ZSBsaW1pdCBiZWluZyByZWFjaGVkKSB0byBlbnN1cmUgb25seSBvbmUKKyAgICAvLyB0aHJlYWQgY2FsbHMgY2ZzLnN3aXRjaE1lbXRhYmxlSWZDdXJyZW50LgorICAgIHByaXZhdGUgZmluYWwgQXRvbWljQm9vbGVhbiBzd2l0Y2hSZXF1ZXN0ZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisKKyAgICAvKioKKyAgICAgKiBTaGFyZGVkIG1lbXRhYmxlIHNlY3Rpb25zLiBFYWNoIGlzIHJlc3BvbnNpYmxlIGZvciBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgdGhlIHRva2VuIHNwYWNlIChiZXR3ZWVuIGJvdW5kYXJpZXNbaV0KKyAgICAgKiBhbmQgYm91bmRhcmllc1tpKzFdKSBhbmQgaXMgd3JpdHRlbiB0byBieSBvbmUgdGhyZWFkIGF0IGEgdGltZSwgd2hpbGUgcmVhZHMgYXJlIGNhcnJpZWQgb3V0IGNvbmN1cnJlbnRseQorICAgICAqIChpbmNsdWRpbmcgd2l0aCBhbnkgd3JpdGUpLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTWVtdGFibGVTaGFyZFtdIHNoYXJkczsKKworICAgIC8qKgorICAgICAqIEEgbWVyZ2VkIHZpZXcgb2YgdGhlIG1lbXRhYmxlIG1hcC4gVXNlZCBmb3IgcGFydGl0aW9uIHJhbmdlIHF1ZXJpZXMgYW5kIGZsdXNoLgorICAgICAqIEZvciBlZmZpY2llbmN5IHdlIHNlcnZlIHNpbmdsZSBwYXJ0aXRpb24gcmVxdWVzdHMgb2ZmIHRoZSBzaGFyZCB3aGljaCBvZmZlcnMgbW9yZSBkaXJlY3QgSW5NZW1vcnlUcmllIG1ldGhvZHMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBUcmllPEJUcmVlUGFydGl0aW9uRGF0YT4gbWVyZ2VkVHJpZTsKKworICAgIEBVbm1ldGVyZWQKKyAgICBwcml2YXRlIGZpbmFsIFRyaWVNZW10YWJsZU1ldHJpY3NWaWV3IG1ldHJpY3M7CisKKyAgICBUcmllTWVtdGFibGUoQXRvbWljUmVmZXJlbmNlPENvbW1pdExvZ1Bvc2l0aW9uPiBjb21taXRMb2dMb3dlckJvdW5kLCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhUmVmLCBPd25lciBvd25lciwgSW50ZWdlciBzaGFyZENvdW50T3B0aW9uKQorICAgIHsKKyAgICAgICAgc3VwZXIoY29tbWl0TG9nTG93ZXJCb3VuZCwgbWV0YWRhdGFSZWYsIG93bmVyLCBzaGFyZENvdW50T3B0aW9uKTsKKyAgICAgICAgdGhpcy5tZXRyaWNzID0gbmV3IFRyaWVNZW10YWJsZU1ldHJpY3NWaWV3KG1ldGFkYXRhUmVmLmtleXNwYWNlLCBtZXRhZGF0YVJlZi5uYW1lKTsKKyAgICAgICAgdGhpcy5zaGFyZHMgPSBnZW5lcmF0ZVBhcnRpdGlvblNoYXJkcyhib3VuZGFyaWVzLnNoYXJkQ291bnQoKSwgYWxsb2NhdG9yLCBtZXRhZGF0YVJlZiwgbWV0cmljcyk7CisgICAgICAgIHRoaXMubWVyZ2VkVHJpZSA9IG1ha2VNZXJnZWRUcmllKHNoYXJkcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVtdGFibGVTaGFyZFtdIGdlbmVyYXRlUGFydGl0aW9uU2hhcmRzKGludCBzcGxpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbXRhYmxlQWxsb2NhdG9yIGFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpZU1lbXRhYmxlTWV0cmljc1ZpZXcgbWV0cmljcykKKyAgICB7CisgICAgICAgIE1lbXRhYmxlU2hhcmRbXSBwYXJ0aXRpb25NYXBDb250YWluZXIgPSBuZXcgTWVtdGFibGVTaGFyZFtzcGxpdHNdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwbGl0czsgaSsrKQorICAgICAgICAgICAgcGFydGl0aW9uTWFwQ29udGFpbmVyW2ldID0gbmV3IE1lbXRhYmxlU2hhcmQobWV0YWRhdGEsIGFsbG9jYXRvciwgbWV0cmljcyk7CisKKyAgICAgICAgcmV0dXJuIHBhcnRpdGlvbk1hcENvbnRhaW5lcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBUcmllPEJUcmVlUGFydGl0aW9uRGF0YT4gbWFrZU1lcmdlZFRyaWUoTWVtdGFibGVTaGFyZFtdIHNoYXJkcykKKyAgICB7CisgICAgICAgIExpc3Q8VHJpZTxCVHJlZVBhcnRpdGlvbkRhdGE+PiB0cmllcyA9IG5ldyBBcnJheUxpc3Q8PihzaGFyZHMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChNZW10YWJsZVNoYXJkIHNoYXJkIDogc2hhcmRzKQorICAgICAgICAgICAgdHJpZXMuYWRkKHNoYXJkLmRhdGEpOworICAgICAgICByZXR1cm4gVHJpZS5tZXJnZURpc3RpbmN0KHRyaWVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NsZWFuKCkKKyAgICB7CisgICAgICAgIGZvciAoTWVtdGFibGVTaGFyZCBzaGFyZCA6IHNoYXJkcykKKyAgICAgICAgICAgIGlmICghc2hhcmQuaXNDbGVhbigpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzY2FyZCgpCisgICAgeworICAgICAgICBzdXBlci5kaXNjYXJkKCk7CisgICAgICAgIC8vIG1ldHJpY3MgaGVyZSBhcmUgbm90IHRocmVhZCBzYWZlLCBidXQgSSB0aGluayB3ZSBjYW4gbGl2ZSB3aXRoIHRoYXQKKyAgICAgICAgbWV0cmljcy5sYXN0Rmx1c2hTaGFyZERhdGFTaXplcy5yZXNldCgpOworICAgICAgICBmb3IgKE1lbXRhYmxlU2hhcmQgc2hhcmQgOiBzaGFyZHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1ldHJpY3MubGFzdEZsdXNoU2hhcmREYXRhU2l6ZXMudXBkYXRlKHNoYXJkLmxpdmVEYXRhU2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICAvLyB0aGUgYnVmZmVyIHJlbGVhc2UgaXMgYSBsb25nZXItcnVubmluZyBwcm9jZXNzLCBkbyBpdCBpbiBhIHNlcGFyYXRlIGxvb3AgdG8gbm90IG1ha2UgdGhlIG1ldHJpY3MgdXBkYXRlIHdhaXQKKyAgICAgICAgZm9yIChNZW10YWJsZVNoYXJkIHNoYXJkIDogc2hhcmRzKQorICAgICAgICB7CisgICAgICAgICAgICBzaGFyZC5kYXRhLmRpc2NhcmRCdWZmZXJzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgQ29sdW1uRmFtaWx5U3RvcmUuYXBwbHkgdmlhIEtleXNwYWNlLmFwcGx5LCB3aGljaCBzdXBwbGllcyB0aGUgYXBwcm9wcmlhdGUKKyAgICAgKiBPcE9yZGVyaW5nLgorICAgICAqCisgICAgICogY29tbWl0TG9nU2VnbWVudFBvc2l0aW9uIHNob3VsZCBvbmx5IGJlIG51bGwgaWYgdGhpcyBpcyBhIHNlY29uZGFyeSBpbmRleCwgaW4gd2hpY2ggY2FzZSBpdCBpcyAqZXhwZWN0ZWQqIHRvIGJlIG51bGwKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBwdXQoUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSwgVXBkYXRlVHJhbnNhY3Rpb24gaW5kZXhlciwgT3BPcmRlci5Hcm91cCBvcEdyb3VwKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSB1cGRhdGUucGFydGl0aW9uS2V5KCk7CisgICAgICAgICAgICBNZW10YWJsZVNoYXJkIHNoYXJkID0gc2hhcmRzW2JvdW5kYXJpZXMuZ2V0U2hhcmRGb3JLZXkoa2V5KV07CisgICAgICAgICAgICBsb25nIGNvbFVwZGF0ZVRpbWVEZWx0YSA9IHNoYXJkLnB1dChrZXksIHVwZGF0ZSwgaW5kZXhlciwgb3BHcm91cCk7CisKKyAgICAgICAgICAgIGlmIChzaGFyZC5kYXRhLnJlYWNoZWRBbGxvY2F0ZWRTaXplVGhyZXNob2xkKCkgJiYgIXN3aXRjaFJlcXVlc3RlZC5nZXRBbmRTZXQodHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlNjaGVkdWxpbmcgZmx1c2ggZHVlIHRvIHRyaWUgc2l6ZSBsaW1pdCByZWFjaGVkLiIpOworICAgICAgICAgICAgICAgIG93bmVyLnNpZ25hbEZsdXNoUmVxdWlyZWQodGhpcywgQ29sdW1uRmFtaWx5U3RvcmUuRmx1c2hSZWFzb24uTUVNVEFCTEVfTElNSVQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gY29sVXBkYXRlVGltZURlbHRhOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbk1lbW9yeVRyaWUuU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIGFzIHtAbGluayBJbk1lbW9yeVRyaWUjcmVhY2hlZEFsbG9jYXRlZFNpemVUaHJlc2hvbGR9IHNob3VsZCBiZWNvbWUKKyAgICAgICAgICAgIC8vIHRydWUgYW5kIHRyaWdnZXIgYSBtZW10YWJsZSBzd2l0Y2ggbG9uZyBiZWZvcmUgdGhpcyBsaW1pdCBpcyByZWFjaGVkLgorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlY2huaWNhbGx5IHdlIHNob3VsZCBzY2F0dGVyIGdhdGhlciBvbiBhbGwgdGhlIGNvcmUgdGhyZWFkcyBiZWNhdXNlIHRoZSBzaXplIGluIGZvbGxvd2luZyBjYWxscyBhcmUgbm90CisgICAgICogdXNpbmcgdm9sYXRpbGUgdmFyaWFibGVzLCBidXQgZm9yIG1ldHJpY3MgcHVycG9zZSB0aGlzIHNob3VsZCBiZSBnb29kIGVub3VnaC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRMaXZlRGF0YVNpemUoKQorICAgIHsKKyAgICAgICAgbG9uZyB0b3RhbCA9IDBMOworICAgICAgICBmb3IgKE1lbXRhYmxlU2hhcmQgc2hhcmQgOiBzaGFyZHMpCisgICAgICAgICAgICB0b3RhbCArPSBzaGFyZC5saXZlRGF0YVNpemUoKTsKKyAgICAgICAgcmV0dXJuIHRvdGFsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIG9wZXJhdGlvbkNvdW50KCkKKyAgICB7CisgICAgICAgIGxvbmcgdG90YWwgPSAwTDsKKyAgICAgICAgZm9yIChNZW10YWJsZVNoYXJkIHNoYXJkIDogc2hhcmRzKQorICAgICAgICAgICAgdG90YWwgKz0gc2hhcmQuY3VycmVudE9wZXJhdGlvbnMoKTsKKyAgICAgICAgcmV0dXJuIHRvdGFsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIHBhcnRpdGlvbkNvdW50KCkKKyAgICB7CisgICAgICAgIGludCB0b3RhbCA9IDA7CisgICAgICAgIGZvciAoTWVtdGFibGVTaGFyZCBzaGFyZCA6IHNoYXJkcykKKyAgICAgICAgICAgIHRvdGFsICs9IHNoYXJkLnNpemUoKTsKKyAgICAgICAgcmV0dXJuIHRvdGFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1pblRTIGlmIG9uZSBhdmFpbGFibGUsIG90aGVyd2lzZSBOT19NSU5fVElNRVNUQU1QLgorICAgICAqCisgICAgICogRW5jb2RpbmdTdGF0cyB1c2VzIGEgc3ludGhldGljIGVwb2NoIFRTIGF0IDIwMTUuIFdlIGRvbid0IHdhbnQgdG8gbGVhayB0aGF0IChDQVNTQU5EUkEtMTgxMTgpIHNvIHdlIHJldHVybiBOT19NSU5fVElNRVNUQU1QIGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBtaW5UUyBvciBOT19NSU5fVElNRVNUQU1QIGlmIG5vbmUgYXZhaWxhYmxlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0TWluVGltZXN0YW1wKCkKKyAgICB7CisgICAgICAgIGxvbmcgbWluID0gTG9uZy5NQVhfVkFMVUU7CisgICAgICAgIGZvciAoTWVtdGFibGVTaGFyZCBzaGFyZCA6IHNoYXJkcykKKyAgICAgICAgICAgIG1pbiA9ICBMb25nLm1pbihtaW4sIHNoYXJkLm1pblRpbWVzdGFtcCgpKTsKKyAgICAgICAgcmV0dXJuIG1pbiAhPSBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTLm1pblRpbWVzdGFtcCA/IG1pbiA6IE5PX01JTl9USU1FU1RBTVA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRNaW5Mb2NhbERlbGV0aW9uVGltZSgpCisgICAgeworICAgICAgICBpbnQgbWluID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIGZvciAoTWVtdGFibGVTaGFyZCBzaGFyZCA6IHNoYXJkcykKKyAgICAgICAgICAgIG1pbiA9ICBJbnRlZ2VyLm1pbihtaW4sIHNoYXJkLm1pbkxvY2FsRGVsZXRpb25UaW1lKCkpOworICAgICAgICByZXR1cm4gbWluOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnMoKQorICAgIHsKKyAgICAgICAgZm9yIChNZW10YWJsZVNoYXJkIHNoYXJkIDogc2hhcmRzKQorICAgICAgICAgICAgY29sdW1uc0NvbGxlY3Rvci51cGRhdGUoc2hhcmQuY29sdW1uc0NvbGxlY3Rvcik7CisgICAgICAgIHJldHVybiBjb2x1bW5zQ29sbGVjdG9yLmdldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEVuY29kaW5nU3RhdHMgZW5jb2RpbmdTdGF0cygpCisgICAgeworICAgICAgICBmb3IgKE1lbXRhYmxlU2hhcmQgc2hhcmQgOiBzaGFyZHMpCisgICAgICAgICAgICBzdGF0c0NvbGxlY3Rvci51cGRhdGUoc2hhcmQuc3RhdHNDb2xsZWN0b3IuZ2V0KCkpOworICAgICAgICByZXR1cm4gc3RhdHNDb2xsZWN0b3IuZ2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lbXRhYmxlVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yIHBhcnRpdGlvbkl0ZXJhdG9yKGZpbmFsIENvbHVtbkZpbHRlciBjb2x1bW5GaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERhdGFSYW5nZSBkYXRhUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyIHJlYWRzTGlzdGVuZXIpCisgICAgeworICAgICAgICBBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4ga2V5UmFuZ2UgPSBkYXRhUmFuZ2Uua2V5UmFuZ2UoKTsKKworICAgICAgICBQYXJ0aXRpb25Qb3NpdGlvbiBsZWZ0ID0ga2V5UmFuZ2UubGVmdDsKKyAgICAgICAgUGFydGl0aW9uUG9zaXRpb24gcmlnaHQgPSBrZXlSYW5nZS5yaWdodDsKKyAgICAgICAgaWYgKGxlZnQuaXNNaW5pbXVtKCkpCisgICAgICAgICAgICBsZWZ0ID0gbnVsbDsKKyAgICAgICAgaWYgKHJpZ2h0LmlzTWluaW11bSgpKQorICAgICAgICAgICAgcmlnaHQgPSBudWxsOworCisgICAgICAgIGJvb2xlYW4gaXNCb3VuZCA9IGtleVJhbmdlIGluc3RhbmNlb2YgQm91bmRzOworICAgICAgICBib29sZWFuIGluY2x1ZGVTdGFydCA9IGlzQm91bmQgfHwga2V5UmFuZ2UgaW5zdGFuY2VvZiBJbmNsdWRpbmdFeGNsdWRpbmdCb3VuZHM7CisgICAgICAgIGJvb2xlYW4gaW5jbHVkZVN0b3AgPSBpc0JvdW5kIHx8IGtleVJhbmdlIGluc3RhbmNlb2YgUmFuZ2U7CisKKyAgICAgICAgVHJpZTxCVHJlZVBhcnRpdGlvbkRhdGE+IHN1Yk1hcCA9IG1lcmdlZFRyaWUuc3VidHJpZShsZWZ0LCBpbmNsdWRlU3RhcnQsIHJpZ2h0LCBpbmNsdWRlU3RvcCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBNZW10YWJsZVVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcihtZXRhZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvci5lbnN1cmVPbkhlYXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFSYW5nZSk7CisgICAgICAgIC8vIHJlYWRzTGlzdGVuZXIgaXMgaWdub3JlZCBhcyBpdCBvbmx5IGFjY2VwdHMgc3N0YWJsZSBzaWduYWxzCisgICAgfQorCisgICAgcHJpdmF0ZSBQYXJ0aXRpb24gZ2V0UGFydGl0aW9uKERlY29yYXRlZEtleSBrZXkpCisgICAgeworICAgICAgICBpbnQgc2hhcmRJbmRleCA9IGJvdW5kYXJpZXMuZ2V0U2hhcmRGb3JLZXkoa2V5KTsKKyAgICAgICAgQlRyZWVQYXJ0aXRpb25EYXRhIGRhdGEgPSBzaGFyZHNbc2hhcmRJbmRleF0uZGF0YS5nZXQoa2V5KTsKKyAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVQYXJ0aXRpb24obWV0YWRhdGEoKSwgYWxsb2NhdG9yLmVuc3VyZU9uSGVhcCgpLCBrZXksIGRhdGEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd0l0ZXJhdG9yKERlY29yYXRlZEtleSBrZXksIFNsaWNlcyBzbGljZXMsIENvbHVtbkZpbHRlciBzZWxlY3RlZENvbHVtbnMsIGJvb2xlYW4gcmV2ZXJzZWQsIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQorICAgIHsKKyAgICAgICAgUGFydGl0aW9uIHAgPSBnZXRQYXJ0aXRpb24oa2V5KTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gcC51bmZpbHRlcmVkSXRlcmF0b3Ioc2VsZWN0ZWRDb2x1bW5zLCBzbGljZXMsIHJldmVyc2VkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd0l0ZXJhdG9yKERlY29yYXRlZEtleSBrZXkpCisgICAgeworICAgICAgICBQYXJ0aXRpb24gcCA9IGdldFBhcnRpdGlvbihrZXkpOworICAgICAgICByZXR1cm4gcCAhPSBudWxsID8gcC51bmZpbHRlcmVkSXRlcmF0b3IoKSA6IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVtdGFibGVQYXJ0aXRpb24gY3JlYXRlUGFydGl0aW9uKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIEVuc3VyZU9uSGVhcCBlbnN1cmVPbkhlYXAsIERlY29yYXRlZEtleSBrZXksIEJUcmVlUGFydGl0aW9uRGF0YSBkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZW10YWJsZVBhcnRpdGlvbihtZXRhZGF0YSwgZW5zdXJlT25IZWFwLCBrZXksIGRhdGEpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1lbXRhYmxlUGFydGl0aW9uIGdldFBhcnRpdGlvbkZyb21UcmllRW50cnkoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgRW5zdXJlT25IZWFwIGVuc3VyZU9uSGVhcCwgTWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBCVHJlZVBhcnRpdGlvbkRhdGE+IGVuKQorICAgIHsKKyAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IEJ1ZmZlckRlY29yYXRlZEtleS5mcm9tQnl0ZUNvbXBhcmFibGUoZW4uZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5wYXJ0aXRpb25lcik7CisgICAgICAgIHJldHVybiBjcmVhdGVQYXJ0aXRpb24obWV0YWRhdGEsIGVuc3VyZU9uSGVhcCwga2V5LCBlbi5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGbHVzaGFibGVQYXJ0aXRpb25TZXQ8TWVtdGFibGVQYXJ0aXRpb24+IGdldEZsdXNoU2V0KFBhcnRpdGlvblBvc2l0aW9uIGZyb20sIFBhcnRpdGlvblBvc2l0aW9uIHRvKQorICAgIHsKKyAgICAgICAgVHJpZTxCVHJlZVBhcnRpdGlvbkRhdGE+IHRvRmx1c2ggPSBtZXJnZWRUcmllLnN1YnRyaWUoZnJvbSwgdHJ1ZSwgdG8sIGZhbHNlKTsKKyAgICAgICAgbG9uZyBrZXlTaXplID0gMDsKKyAgICAgICAgaW50IGtleUNvdW50ID0gMDsKKworICAgICAgICBmb3IgKEl0ZXJhdG9yPE1hcC5FbnRyeTxCeXRlQ29tcGFyYWJsZSwgQlRyZWVQYXJ0aXRpb25EYXRhPj4gaXQgPSB0b0ZsdXNoLmVudHJ5SXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeTxCeXRlQ29tcGFyYWJsZSwgQlRyZWVQYXJ0aXRpb25EYXRhPiBlbiA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIGJ5dGVbXSBrZXlCeXRlcyA9IERlY29yYXRlZEtleS5rZXlGcm9tQnl0ZVNvdXJjZShCeXRlU291cmNlLnBlZWthYmxlKGVuLmdldEtleSgpLmFzQ29tcGFyYWJsZUJ5dGVzKEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQllURV9DT01QQVJBQkxFX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEoKS5wYXJ0aXRpb25lcik7CisgICAgICAgICAgICBrZXlTaXplICs9IGtleUJ5dGVzLmxlbmd0aDsKKyAgICAgICAgICAgIGtleUNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgbG9uZyBwYXJ0aXRpb25LZXlTaXplID0ga2V5U2l6ZTsKKyAgICAgICAgaW50IHBhcnRpdGlvbkNvdW50ID0ga2V5Q291bnQ7CisKKyAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdEZsdXNoYWJsZVBhcnRpdGlvblNldDxNZW10YWJsZVBhcnRpdGlvbj4oKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgTWVtdGFibGUgbWVtdGFibGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBUcmllTWVtdGFibGUudGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFBhcnRpdGlvblBvc2l0aW9uIGZyb20oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmcm9tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgUGFydGl0aW9uUG9zaXRpb24gdG8oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0bzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgcGFydGl0aW9uQ291bnQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0aXRpb25Db3VudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPE1lbXRhYmxlUGFydGl0aW9uPiBpdGVyYXRvcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9ycy50cmFuc2Zvcm0odG9GbHVzaC5lbnRyeUl0ZXJhdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRHVyaW5nIGZsdXNoaW5nIHdlIGFyZSBjZXJ0YWluIHRoZSBtZW10YWJsZSB3aWxsIHJlbWFpbiBhdCBsZWFzdCB1bnRpbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmbHVzaCBjb21wbGV0ZXMuIE5vIGNvcHlpbmcgdG8gaGVhcCBpcyBuZWNlc3NhcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgLT4gZ2V0UGFydGl0aW9uRnJvbVRyaWVFbnRyeShtZXRhZGF0YSgpLCBFbnN1cmVPbkhlYXAuTk9PUCwgZW50cnkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGxvbmcgcGFydGl0aW9uS2V5c1NpemUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0aXRpb25LZXlTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBNZW10YWJsZVNoYXJkCisgICAgeworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgdm9sYXRpbGUgYXMgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB3aGVuIHdlCisgICAgICAgIC8vIGNvbGxlY3QgcmVzdWx0cyBmcm9tIGFsbCBzdWItcmFuZ2VzLCB0aGUgdGhyZWFkIGFjY2Vzc2luZyB0aGUgdmFsdWUKKyAgICAgICAgLy8gaXMgZ3VhcmFudGVlZCB0byBzZWUgdGhlIGNoYW5nZXMgdG8gdGhlIHZhbHVlcy4KKworICAgICAgICAvLyBUaGUgc21hbGxlc3QgdGltZXN0YW1wIGZvciBhbGwgcGFydGl0aW9ucyBzdG9yZWQgaW4gdGhpcyBzaGFyZAorICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGxvbmcgbWluVGltZXN0YW1wID0gTG9uZy5NQVhfVkFMVUU7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgbWluTG9jYWxEZWxldGlvblRpbWUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGxvbmcgbGl2ZURhdGFTaXplID0gMDsKKworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGxvbmcgY3VycmVudE9wZXJhdGlvbnMgPSAwOworCisgICAgICAgIEBVbm1ldGVyZWQKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRMb2NrIHdyaXRlTG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisKKyAgICAgICAgLy8gQ29udGVudCBtYXAgZm9yIHRoZSBnaXZlbiBzaGFyZC4gVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIG1lbXRhYmxlIHRyaWUgd2hpY2ggdXNlcyB0aGUgcHJlZml4LWZyZWUKKyAgICAgICAgLy8gYnl0ZS1jb21wYXJhYmxlIEJ5dGVTb3VyY2UgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBrZXlzIHRvIGFkZHJlc3MgdGhlIHBhcnRpdGlvbnMuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoaXMgbWFwIGlzIHVzZWQgaW4gYSBzaW5nbGUtcHJvZHVjZXIsIG11bHRpLWNvbnN1bWVyIGZhc2hpb246IG9ubHkgb25lIHRocmVhZCB3aWxsIGluc2VydCBpdGVtcyBidXQKKyAgICAgICAgLy8gc2V2ZXJhbCB0aHJlYWRzIG1heSByZWFkIGZyb20gaXQgYW5kIGl0ZXJhdGUgb3ZlciBpdC4gSXRlcmF0b3JzIChlc3BlY2lhbGx5IHBhcnRpdGlvbiByYW5nZSBpdGVyYXRvcnMpCisgICAgICAgIC8vIG1heSBvcGVyYXRlIGZvciBhIGxvbmcgcGVyaW9kIG9mIHRpbWUgYW5kIHRodXMgaXRlcmF0b3JzIHNob3VsZCBub3QgdGhyb3cgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbnMKKyAgICAgICAgLy8gaWYgdGhlIHVuZGVybHlpbmcgbWFwIGlzIG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24sIHRoZXkgc2hvdWxkIHByb3ZpZGUgYSB3ZWFrbHkgY29uc2lzdGVudCB2aWV3IG9mIHRoZSBtYXAKKyAgICAgICAgLy8gaW5zdGVhZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWxzbywgdGhpcyBkYXRhIGlzIGJhY2tlZCBieSBtZW10YWJsZSBtZW1vcnksIHdoZW4gYWNjZXNzaW5nIGl0IGNhbGxlcnMgbXVzdCBzcGVjaWZ5IGlmIGl0IGNhbiBiZSBhY2Nlc3NlZAorICAgICAgICAvLyB1bnNhZmVseSwgbWVhbmluZyB0aGF0IHRoZSBtZW10YWJsZSB3aWxsIG5vdCBiZSBkaXNjYXJkZWQgYXMgbG9uZyBhcyB0aGUgZGF0YSBpcyB1c2VkLCBvciB3aGV0aGVyIHRoZSBkYXRhCisgICAgICAgIC8vIHNob3VsZCBiZSBjb3BpZWQgb24gaGVhcCBmb3Igb2ZmLWhlYXAgYWxsb2NhdG9ycy4KKyAgICAgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgICAgIGZpbmFsIEluTWVtb3J5VHJpZTxCVHJlZVBhcnRpdGlvbkRhdGE+IGRhdGE7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2x1bW5zQ29sbGVjdG9yIGNvbHVtbnNDb2xsZWN0b3I7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdGF0c0NvbGxlY3RvciBzdGF0c0NvbGxlY3RvcjsKKworICAgICAgICBAVW5tZXRlcmVkICAvLyB0b3RhbCBwb29sIHNpemUgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiBtZW10YWJsZSdzIGRlZXAgc2l6ZQorICAgICAgICBwcml2YXRlIGZpbmFsIE1lbXRhYmxlQWxsb2NhdG9yIGFsbG9jYXRvcjsKKworICAgICAgICBAVW5tZXRlcmVkCisgICAgICAgIHByaXZhdGUgZmluYWwgVHJpZU1lbXRhYmxlTWV0cmljc1ZpZXcgbWV0cmljczsKKworICAgICAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICAgICAgTWVtdGFibGVTaGFyZChUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhLCBNZW10YWJsZUFsbG9jYXRvciBhbGxvY2F0b3IsIFRyaWVNZW10YWJsZU1ldHJpY3NWaWV3IG1ldHJpY3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBJbk1lbW9yeVRyaWU8PihCVUZGRVJfVFlQRSk7CisgICAgICAgICAgICB0aGlzLmNvbHVtbnNDb2xsZWN0b3IgPSBuZXcgQWJzdHJhY3RNZW10YWJsZS5Db2x1bW5zQ29sbGVjdG9yKG1ldGFkYXRhLmdldCgpLnJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zKCkpOworICAgICAgICAgICAgdGhpcy5zdGF0c0NvbGxlY3RvciA9IG5ldyBBYnN0cmFjdE1lbXRhYmxlLlN0YXRzQ29sbGVjdG9yKCk7CisgICAgICAgICAgICB0aGlzLmFsbG9jYXRvciA9IGFsbG9jYXRvcjsKKyAgICAgICAgICAgIHRoaXMubWV0cmljcyA9IG1ldHJpY3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBwdXQoRGVjb3JhdGVkS2V5IGtleSwgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSwgVXBkYXRlVHJhbnNhY3Rpb24gaW5kZXhlciwgT3BPcmRlci5Hcm91cCBvcEdyb3VwKSB0aHJvd3MgSW5NZW1vcnlUcmllLlNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIEJUcmVlUGFydGl0aW9uVXBkYXRlciB1cGRhdGVyID0gbmV3IEJUcmVlUGFydGl0aW9uVXBkYXRlcihhbGxvY2F0b3IsIGFsbG9jYXRvci5jbG9uZXIob3BHcm91cCksIG9wR3JvdXAsIGluZGV4ZXIpOworICAgICAgICAgICAgYm9vbGVhbiBsb2NrZWQgPSB3cml0ZUxvY2sudHJ5TG9jaygpOworICAgICAgICAgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZXRyaWNzLnVuY29udGVuZGVkUHV0cy5pbmMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZXRyaWNzLmNvbnRlbmRlZFB1dHMuaW5jKCk7CisgICAgICAgICAgICAgICAgbG9uZyBsb2NrU3RhcnRUaW1lID0gQ2xvY2suR2xvYmFsLm5hbm9UaW1lKCk7CisgICAgICAgICAgICAgICAgd3JpdGVMb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICBtZXRyaWNzLmNvbnRlbnRpb25UaW1lLmFkZE5hbm8oQ2xvY2suR2xvYmFsLm5hbm9UaW1lKCkgLSBsb2NrU3RhcnRUaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBvbkhlYXAgPSBkYXRhLnNpemVPbkhlYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBvZmZIZWFwID0gZGF0YS5zaXplT2ZmSGVhcCgpOworICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGZhc3QgcmVjdXJzaXZlIHB1dCBpZiB3ZSBrbm93IHRoZSBrZXkgaXMgc21hbGwgZW5vdWdoIHRvIG5vdCBjYXVzZSBhIHN0YWNrIG92ZXJmbG93LgorICAgICAgICAgICAgICAgICAgICBkYXRhLnB1dFNpbmdsZXRvbihrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcjo6bWVyZ2VQYXJ0aXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkuZ2V0S2V5TGVuZ3RoKCkgPCBNQVhfUkVDVVJTSVZFX0tFWV9MRU5HVEgpOworICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3Iub2ZmSGVhcCgpLmFkanVzdChkYXRhLnNpemVPZmZIZWFwKCkgLSBvZmZIZWFwLCBvcEdyb3VwKTsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLm9uSGVhcCgpLmFkanVzdChkYXRhLnNpemVPbkhlYXAoKSAtIG9uSGVhcCwgb3BHcm91cCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1pblRpbWVzdGFtcCA9IE1hdGgubWluKG1pblRpbWVzdGFtcCwgdXBkYXRlLnN0YXRzKCkubWluVGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgbWluTG9jYWxEZWxldGlvblRpbWUgPSBNYXRoLm1pbihtaW5Mb2NhbERlbGV0aW9uVGltZSwgdXBkYXRlLnN0YXRzKCkubWluTG9jYWxEZWxldGlvblRpbWUpOworICAgICAgICAgICAgICAgICAgICBsaXZlRGF0YVNpemUgKz0gdXBkYXRlci5kYXRhU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudE9wZXJhdGlvbnMgKz0gdXBkYXRlLm9wZXJhdGlvbkNvdW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgY29sdW1uc0NvbGxlY3Rvci51cGRhdGUodXBkYXRlLmNvbHVtbnMoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRzQ29sbGVjdG9yLnVwZGF0ZSh1cGRhdGUuc3RhdHMoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1cGRhdGVyLmNvbFVwZGF0ZVRpbWVEZWx0YTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2xlYW4oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGF0YS5pc0VtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNpemUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGF0YS52YWx1ZXNDb3VudCgpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBtaW5UaW1lc3RhbXAoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbWluVGltZXN0YW1wOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBsaXZlRGF0YVNpemUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbGl2ZURhdGFTaXplOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyBjdXJyZW50T3BlcmF0aW9ucygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50T3BlcmF0aW9uczsKKyAgICAgICAgfQorCisgICAgICAgIGludCBtaW5Mb2NhbERlbGV0aW9uVGltZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtaW5Mb2NhbERlbGV0aW9uVGltZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBNZW10YWJsZVVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvciBleHRlbmRzIEFic3RyYWN0VW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yIGltcGxlbWVudHMgVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgICAgIHByaXZhdGUgZmluYWwgRW5zdXJlT25IZWFwIGVuc3VyZU9uSGVhcDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIEJUcmVlUGFydGl0aW9uRGF0YT4+IGl0ZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29sdW1uRmlsdGVyIGNvbHVtbkZpbHRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBEYXRhUmFuZ2UgZGF0YVJhbmdlOworCisgICAgICAgIHB1YmxpYyBNZW10YWJsZVVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcihUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5zdXJlT25IZWFwIGVuc3VyZU9uSGVhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWU8QlRyZWVQYXJ0aXRpb25EYXRhPiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgY29sdW1uRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVJhbmdlIGRhdGFSYW5nZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOworICAgICAgICAgICAgdGhpcy5lbnN1cmVPbkhlYXAgPSBlbnN1cmVPbkhlYXA7CisgICAgICAgICAgICB0aGlzLml0ZXIgPSBzb3VyY2UuZW50cnlJdGVyYXRvcigpOworICAgICAgICAgICAgdGhpcy5jb2x1bW5GaWx0ZXIgPSBjb2x1bW5GaWx0ZXI7CisgICAgICAgICAgICB0aGlzLmRhdGFSYW5nZSA9IGRhdGFSYW5nZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1ldGFkYXRhOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLmhhc05leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgbmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcnRpdGlvbiBwYXJ0aXRpb24gPSBnZXRQYXJ0aXRpb25Gcm9tVHJpZUVudHJ5KG1ldGFkYXRhKCksIGVuc3VyZU9uSGVhcCwgaXRlci5uZXh0KCkpOworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IHBhcnRpdGlvbi5wYXJ0aXRpb25LZXkoKTsKKyAgICAgICAgICAgIENsdXN0ZXJpbmdJbmRleEZpbHRlciBmaWx0ZXIgPSBkYXRhUmFuZ2UuY2x1c3RlcmluZ0luZGV4RmlsdGVyKGtleSk7CisKKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXIuZ2V0VW5maWx0ZXJlZFJvd0l0ZXJhdG9yKGNvbHVtbkZpbHRlciwgcGFydGl0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBNZW10YWJsZVBhcnRpdGlvbiBleHRlbmRzIEltbXV0YWJsZUJUcmVlUGFydGl0aW9uCisgICAgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgRW5zdXJlT25IZWFwIGVuc3VyZU9uSGVhcDsKKworICAgICAgICBwcml2YXRlIE1lbXRhYmxlUGFydGl0aW9uKFRhYmxlTWV0YWRhdGEgdGFibGUsIEVuc3VyZU9uSGVhcCBlbnN1cmVPbkhlYXAsIERlY29yYXRlZEtleSBrZXksIEJUcmVlUGFydGl0aW9uRGF0YSBkYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcih0YWJsZSwga2V5LCBkYXRhKTsKKyAgICAgICAgICAgIHRoaXMuZW5zdXJlT25IZWFwID0gZW5zdXJlT25IZWFwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNhbkhhdmVTaGFkb3dlZERhdGEoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGUgQnRyZWVQYXJ0aXRpb25EYXRhIHdlIHN0b3JlIGluIHRoZSBtZW10YWJsZSBhcmUgYnVpbGQgaXRlcmF0aXZlbHkgYnkgQlRyZWVQYXJ0aXRpb25EYXRhLmFkZCgpLCB3aGljaAorICAgICAgICAgICAgLy8gZG9lc24ndCBtYWtlIHN1cmUgdGhlcmUgaXNuJ3Qgc2hhZG93ZWQgZGF0YSwgc28gd2UnbGwgbmVlZCB0byBlbGltaW5hdGUgYW55LgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbnN1cmVPbkhlYXAuYXBwbHlUb0RlbGV0aW9uSW5mbyhzdXBlci5kZWxldGlvbkluZm8oKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJvdyBzdGF0aWNSb3coKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5zdXJlT25IZWFwLmFwcGx5VG9TdGF0aWMoc3VwZXIuc3RhdGljUm93KCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuc3VyZU9uSGVhcC5hcHBseVRvUGFydGl0aW9uS2V5KHN1cGVyLnBhcnRpdGlvbktleSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUm93IGdldFJvdyhDbHVzdGVyaW5nPD8+IGNsdXN0ZXJpbmcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbnN1cmVPbkhlYXAuYXBwbHlUb1JvdyhzdXBlci5nZXRSb3coY2x1c3RlcmluZykpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSb3cgbGFzdFJvdygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbnN1cmVPbkhlYXAuYXBwbHlUb1JvdyhzdXBlci5sYXN0Um93KCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdW5maWx0ZXJlZEl0ZXJhdG9yKENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIFNsaWNlcyBzbGljZXMsIGJvb2xlYW4gcmV2ZXJzZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB1bmZpbHRlcmVkSXRlcmF0b3IoaG9sZGVyKCksIHNlbGVjdGlvbiwgc2xpY2VzLCByZXZlcnNlZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB1bmZpbHRlcmVkSXRlcmF0b3IoQ29sdW1uRmlsdGVyIHNlbGVjdGlvbiwgTmF2aWdhYmxlU2V0PENsdXN0ZXJpbmc8Pz4+IGNsdXN0ZXJpbmdzSW5RdWVyeU9yZGVyLCBib29sZWFuIHJldmVyc2VkKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5zdXJlT25IZWFwLmFwcGx5VG9QYXJ0aXRpb24oc3VwZXIudW5maWx0ZXJlZEl0ZXJhdG9yKHNlbGVjdGlvbiwgY2x1c3RlcmluZ3NJblF1ZXJ5T3JkZXIsIHJldmVyc2VkKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB1bmZpbHRlcmVkSXRlcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdW5maWx0ZXJlZEl0ZXJhdG9yKENvbHVtbkZpbHRlci5zZWxlY3Rpb24oc3VwZXIuY29sdW1ucygpKSwgU2xpY2VzLkFMTCwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdW5maWx0ZXJlZEl0ZXJhdG9yKEJUcmVlUGFydGl0aW9uRGF0YSBjdXJyZW50LCBDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uLCBTbGljZXMgc2xpY2VzLCBib29sZWFuIHJldmVyc2VkKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5zdXJlT25IZWFwLmFwcGx5VG9QYXJ0aXRpb24oc3VwZXIudW5maWx0ZXJlZEl0ZXJhdG9yKGN1cnJlbnQsIHNlbGVjdGlvbiwgc2xpY2VzLCByZXZlcnNlZCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxSb3c+IGl0ZXJhdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuc3VyZU9uSGVhcC5hcHBseVRvUGFydGl0aW9uKHN1cGVyLml0ZXJhdG9yKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGYWN0b3J5IGZhY3RvcnkoTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zQ29weSkKKyAgICB7CisgICAgICAgIFN0cmluZyBzaGFyZHNTdHJpbmcgPSBvcHRpb25zQ29weS5yZW1vdmUoU0hBUkRTX09QVElPTik7CisgICAgICAgIEludGVnZXIgc2hhcmRDb3VudCA9IHNoYXJkc1N0cmluZyAhPSBudWxsID8gSW50ZWdlci5wYXJzZUludChzaGFyZHNTdHJpbmcpIDogbnVsbDsKKyAgICAgICAgcmV0dXJuIG5ldyBGYWN0b3J5KHNoYXJkQ291bnQpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgTWVtdGFibGUuRmFjdG9yeQorICAgIHsKKyAgICAgICAgZmluYWwgSW50ZWdlciBzaGFyZENvdW50OworCisgICAgICAgIEZhY3RvcnkoSW50ZWdlciBzaGFyZENvdW50KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnNoYXJkQ291bnQgPSBzaGFyZENvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1lbXRhYmxlIGNyZWF0ZShBdG9taWNSZWZlcmVuY2U8Q29tbWl0TG9nUG9zaXRpb24+IGNvbW1pdExvZ0xvd2VyQm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGFSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duZXIgb3duZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHJpZU1lbXRhYmxlKGNvbW1pdExvZ0xvd2VyQm91bmQsIG1ldGFkYVJlZiwgb3duZXIsIHNoYXJkQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUYWJsZU1ldHJpY3MuUmVsZWFzYWJsZU1ldHJpYyBjcmVhdGVNZW10YWJsZU1ldHJpY3MoVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YVJlZikKKyAgICAgICAgeworICAgICAgICAgICAgVHJpZU1lbXRhYmxlTWV0cmljc1ZpZXcgbWV0cmljcyA9IG5ldyBUcmllTWVtdGFibGVNZXRyaWNzVmlldyhtZXRhZGF0YVJlZi5rZXlzcGFjZSwgbWV0YWRhdGFSZWYubmFtZSk7CisgICAgICAgICAgICByZXR1cm4gbWV0cmljczo6cmVsZWFzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgRmFjdG9yeSBmYWN0b3J5ID0gKEZhY3RvcnkpIG87CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoc2hhcmRDb3VudCwgZmFjdG9yeS5zaGFyZENvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKHNoYXJkQ291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIGxvbmcgdW51c2VkUmVzZXJ2ZWRNZW1vcnkoKQorICAgIHsKKyAgICAgICAgbG9uZyBzaXplID0gMDsKKyAgICAgICAgZm9yIChNZW10YWJsZVNoYXJkIHNoYXJkIDogc2hhcmRzKQorICAgICAgICAgICAgc2l6ZSArPSBzaGFyZC5kYXRhLnVudXNlZFJlc2VydmVkTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21vbml0b3JpbmcvTW9uaXRvcmluZ1Rhc2suamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21vbml0b3JpbmcvTW9uaXRvcmluZ1Rhc2suamF2YQppbmRleCBkNjgxZTRiLi4yNDM1Njk5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tb25pdG9yaW5nL01vbml0b3JpbmdUYXNrLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbW9uaXRvcmluZy9Nb25pdG9yaW5nVGFzay5qYXZhCkBAIC0zMywxMSArMzMsMTIgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Ob1NwYW1Mb2dnZXI7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN5c3RlbS5nZXRQcm9wZXJ0eTsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTkFOT1NFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTU9OSVRPUklOR19NQVhfT1BFUkFUSU9OUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NT05JVE9SSU5HX1JFUE9SVF9JTlRFUlZBTF9NUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTW9ub3RvbmljQ2xvY2suR2xvYmFsLmFwcHJveFRpbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZXMubmV3QmxvY2tpbmdRdWV1ZTsKIApAQCAtNDgsMjAgKzQ5LDIwIEBACiAgKi8KIGNsYXNzIE1vbml0b3JpbmdUYXNrCiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfU0VQQVJBVE9SID0gZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfU0VQQVJBVE9SID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkxJTkVfU0VQQVJBVE9SLmdldFN0cmluZygpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihNb25pdG9yaW5nVGFzay5jbGFzcyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTm9TcGFtTG9nZ2VyIG5vU3BhbUxvZ2dlciA9IE5vU3BhbUxvZ2dlci5nZXRMb2dnZXIobG9nZ2VyLCA1TCwgVGltZVVuaXQuTUlOVVRFUyk7CiAKICAgICAvKioKICAgICAgKiBEZWZpbmVzIHRoZSBpbnRlcnZhbCBmb3IgcmVwb3J0aW5nIGFueSBvcGVyYXRpb25zIHRoYXQgaGF2ZSB0aW1lZCBvdXQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFUE9SVF9JTlRFUlZBTF9NUyA9IE1hdGgubWF4KDAsIEludGVnZXIucGFyc2VJbnQoU3lzdGVtLmdldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAibW9uaXRvcmluZ19yZXBvcnRfaW50ZXJ2YWxfbXMiLCAiNTAwMCIpKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFUE9SVF9JTlRFUlZBTF9NUyA9IE1hdGgubWF4KDAsIE1PTklUT1JJTkdfUkVQT1JUX0lOVEVSVkFMX01TLmdldEludCgpKTsKIAogICAgIC8qKgogICAgICAqIERlZmluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHVuaXF1ZSB0aW1lZCBvdXQgcXVlcmllcyB0aGF0IHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIGxvZ3MuCiAgICAgICogVXNlIGEgbmVnYXRpdmUgbnVtYmVyIHRvIHJlbW92ZSBhbnkgbGltaXQuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9PUEVSQVRJT05TID0gSW50ZWdlci5wYXJzZUludChTeXN0ZW0uZ2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJtb25pdG9yaW5nX21heF9vcGVyYXRpb25zIiwgIjUwIikpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfT1BFUkFUSU9OUyA9IE1PTklUT1JJTkdfTUFYX09QRVJBVElPTlMuZ2V0SW50KCk7CiAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBzdGF0aWMgTW9uaXRvcmluZ1Rhc2sgaW5zdGFuY2UgPSBtYWtlKFJFUE9SVF9JTlRFUlZBTF9NUywgTUFYX09QRVJBVElPTlMpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9BYnN0cmFjdEJUcmVlUGFydGl0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0Fic3RyYWN0QlRyZWVQYXJ0aXRpb24uamF2YQppbmRleCA1OTI2Y2VkLi4zMzI3MjM3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0Fic3RyYWN0QlRyZWVQYXJ0aXRpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0Fic3RyYWN0QlRyZWVQYXJ0aXRpb24uamF2YQpAQCAtMjIsMTQgKzIyLDEyIEBACiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5OYXZpZ2FibGVTZXQ7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhdG9yczsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2VhcmNoSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuQlRyZWU7CiAKQEAgLTM3LDEyICszNSw5IEBACiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJUcmVlUGFydGl0aW9uIGltcGxlbWVudHMgUGFydGl0aW9uLCBJdGVyYWJsZTxSb3c+CiB7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBIb2xkZXIgRU1QVFkgPSBuZXcgSG9sZGVyKFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zLk5PTkUsIEJUcmVlLmVtcHR5KCksIERlbGV0aW9uSW5mby5MSVZFLCBSb3dzLkVNUFRZX1NUQVRJQ19ST1csIEVuY29kaW5nU3RhdHMuTk9fU1RBVFMpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBIT0xERVJfVU5TSEFSRURfSEVBUF9TSVpFID0gT2JqZWN0U2l6ZXMubWVhc3VyZShFTVBUWSk7Ci0KICAgICBwcm90ZWN0ZWQgZmluYWwgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleTsKIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBIb2xkZXIgaG9sZGVyKCk7CisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXIoKTsKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBjYW5IYXZlU2hhZG93ZWREYXRhKCk7CiAKICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RCVHJlZVBhcnRpdGlvbihEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5KQpAQCAtNTAsMzEgKzQ1LDYgQEAKICAgICAgICAgdGhpcy5wYXJ0aXRpb25LZXkgPSBwYXJ0aXRpb25LZXk7CiAgICAgfQogCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBIb2xkZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zOwotICAgICAgICBwdWJsaWMgZmluYWwgRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbzsKLSAgICAgICAgLy8gdGhlIGJ0cmVlIG9mIHJvd3MKLSAgICAgICAgcHVibGljIGZpbmFsIE9iamVjdFtdIHRyZWU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBSb3cgc3RhdGljUm93OwotICAgICAgICBwdWJsaWMgZmluYWwgRW5jb2RpbmdTdGF0cyBzdGF0czsKLQotICAgICAgICBIb2xkZXIoUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1ucywgT2JqZWN0W10gdHJlZSwgRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbywgUm93IHN0YXRpY1JvdywgRW5jb2RpbmdTdGF0cyBzdGF0cykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1uczsKLSAgICAgICAgICAgIHRoaXMudHJlZSA9IHRyZWU7Ci0gICAgICAgICAgICB0aGlzLmRlbGV0aW9uSW5mbyA9IGRlbGV0aW9uSW5mbzsKLSAgICAgICAgICAgIHRoaXMuc3RhdGljUm93ID0gc3RhdGljUm93ID09IG51bGwgPyBSb3dzLkVNUFRZX1NUQVRJQ19ST1cgOiBzdGF0aWNSb3c7Ci0gICAgICAgICAgICB0aGlzLnN0YXRzID0gc3RhdHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgSG9sZGVyIHdpdGhDb2x1bW5zKFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSG9sZGVyKGNvbHVtbnMsIHRoaXMudHJlZSwgdGhpcy5kZWxldGlvbkluZm8sIHRoaXMuc3RhdGljUm93LCB0aGlzLnN0YXRzKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHB1YmxpYyBEZWxldGlvbkluZm8gZGVsZXRpb25JbmZvKCkKICAgICB7CiAgICAgICAgIHJldHVybiBob2xkZXIoKS5kZWxldGlvbkluZm87CkBAIC04NywxMyArNTcsMTMgQEAKIAogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQogICAgIHsKLSAgICAgICAgSG9sZGVyIGhvbGRlciA9IGhvbGRlcigpOworICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyID0gaG9sZGVyKCk7CiAgICAgICAgIHJldHVybiBob2xkZXIuZGVsZXRpb25JbmZvLmlzTGl2ZSgpICYmIEJUcmVlLmlzRW1wdHkoaG9sZGVyLnRyZWUpICYmIGhvbGRlci5zdGF0aWNSb3cuaXNFbXB0eSgpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGhhc1Jvd3MoKQogICAgIHsKLSAgICAgICAgSG9sZGVyIGhvbGRlciA9IGhvbGRlcigpOworICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyID0gaG9sZGVyKCk7CiAgICAgICAgIHJldHVybiAhQlRyZWUuaXNFbXB0eShob2xkZXIudHJlZSk7CiAgICAgfQogCkBAIC0xMjIsNyArOTIsNyBAQAogICAgIHB1YmxpYyBSb3cgZ2V0Um93KENsdXN0ZXJpbmc8Pz4gY2x1c3RlcmluZykKICAgICB7CiAgICAgICAgIENvbHVtbkZpbHRlciBjb2x1bW5zID0gQ29sdW1uRmlsdGVyLnNlbGVjdGlvbihjb2x1bW5zKCkpOwotICAgICAgICBIb2xkZXIgaG9sZGVyID0gaG9sZGVyKCk7CisgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXIgPSBob2xkZXIoKTsKIAogICAgICAgICBpZiAoY2x1c3RlcmluZyA9PSBDbHVzdGVyaW5nLlNUQVRJQ19DTFVTVEVSSU5HKQogICAgICAgICB7CkBAIC0xNTIsNyArMTIyLDcgQEAKICAgICAgICAgcmV0dXJuIHJvdy5maWx0ZXIoY29sdW1ucywgYWN0aXZlRGVsZXRpb24sIHRydWUsIG1ldGFkYXRhKCkpOwogICAgIH0KIAotICAgIHByaXZhdGUgUm93IHN0YXRpY1JvdyhIb2xkZXIgY3VycmVudCwgQ29sdW1uRmlsdGVyIGNvbHVtbnMsIGJvb2xlYW4gc2V0QWN0aXZlRGVsZXRpb25Ub1JvdykKKyAgICBwcml2YXRlIFJvdyBzdGF0aWNSb3coQlRyZWVQYXJ0aXRpb25EYXRhIGN1cnJlbnQsIENvbHVtbkZpbHRlciBjb2x1bW5zLCBib29sZWFuIHNldEFjdGl2ZURlbGV0aW9uVG9Sb3cpCiAgICAgewogICAgICAgICBEZWxldGlvblRpbWUgcGFydGl0aW9uRGVsZXRpb24gPSBjdXJyZW50LmRlbGV0aW9uSW5mby5nZXRQYXJ0aXRpb25EZWxldGlvbigpOwogICAgICAgICBpZiAoY29sdW1ucy5mZXRjaGVkQ29sdW1ucygpLnN0YXRpY3MuaXNFbXB0eSgpIHx8IChjdXJyZW50LnN0YXRpY1Jvdy5pc0VtcHR5KCkgJiYgcGFydGl0aW9uRGVsZXRpb24uaXNMaXZlKCkpKQpAQCAtMTg1LDcgKzE1NSw3IEBACiAgICAgICAgIHJldHVybiB1bmZpbHRlcmVkSXRlcmF0b3IoaG9sZGVyKCksIHNlbGVjdGlvbiwgc2xpY2VzLCByZXZlcnNlZCk7CiAgICAgfQogCi0gICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB1bmZpbHRlcmVkSXRlcmF0b3IoSG9sZGVyIGN1cnJlbnQsIENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIFNsaWNlcyBzbGljZXMsIGJvb2xlYW4gcmV2ZXJzZWQpCisgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB1bmZpbHRlcmVkSXRlcmF0b3IoQlRyZWVQYXJ0aXRpb25EYXRhIGN1cnJlbnQsIENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIFNsaWNlcyBzbGljZXMsIGJvb2xlYW4gcmV2ZXJzZWQpCiAgICAgewogICAgICAgICBSb3cgc3RhdGljUm93ID0gc3RhdGljUm93KGN1cnJlbnQsIHNlbGVjdGlvbiwgZmFsc2UpOwogICAgICAgICBpZiAoc2xpY2VzLnNpemUoKSA9PSAwKQpAQCAtMTk5LDcgKzE2OSw3IEBACiAgICAgICAgICAgICAgICA6IG5ldyBTbGljZXNJdGVyYXRvcihzZWxlY3Rpb24sIHNsaWNlcywgcmV2ZXJzZWQsIGN1cnJlbnQsIHN0YXRpY1Jvdyk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBVbmZpbHRlcmVkUm93SXRlcmF0b3Igc2xpY2VJdGVyYXRvcihDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uLCBTbGljZSBzbGljZSwgYm9vbGVhbiByZXZlcnNlZCwgSG9sZGVyIGN1cnJlbnQsIFJvdyBzdGF0aWNSb3cpCisgICAgcHJpdmF0ZSBVbmZpbHRlcmVkUm93SXRlcmF0b3Igc2xpY2VJdGVyYXRvcihDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uLCBTbGljZSBzbGljZSwgYm9vbGVhbiByZXZlcnNlZCwgQlRyZWVQYXJ0aXRpb25EYXRhIGN1cnJlbnQsIFJvdyBzdGF0aWNSb3cpCiAgICAgewogICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gc3RhcnQgPSBzbGljZS5zdGFydCgpLmlzQm90dG9tKCkgPyBudWxsIDogc2xpY2Uuc3RhcnQoKTsKICAgICAgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IGVuZCA9IHNsaWNlLmVuZCgpLmlzVG9wKCkgPyBudWxsIDogc2xpY2UuZW5kKCk7CkBAIC0yMDksNyArMTc5LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIFJvd0FuZERlbGV0aW9uTWVyZ2VJdGVyYXRvciBtZXJnZShJdGVyYXRvcjxSb3c+IHJvd0l0ZXIsIEl0ZXJhdG9yPFJhbmdlVG9tYnN0b25lPiBkZWxldGVJdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIGJvb2xlYW4gcmV2ZXJzZWQsIEhvbGRlciBjdXJyZW50LCBSb3cgc3RhdGljUm93KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIGJvb2xlYW4gcmV2ZXJzZWQsIEJUcmVlUGFydGl0aW9uRGF0YSBjdXJyZW50LCBSb3cgc3RhdGljUm93KQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBSb3dBbmREZWxldGlvbk1lcmdlSXRlcmF0b3IobWV0YWRhdGEoKSwgcGFydGl0aW9uS2V5KCksIGN1cnJlbnQuZGVsZXRpb25JbmZvLmdldFBhcnRpdGlvbkRlbGV0aW9uKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbiwgc3RhdGljUm93LCByZXZlcnNlZCwgY3VycmVudC5zdGF0cywKQEAgLTIxOSwxMCArMTg5LDEwIEBACiAKICAgICBwcml2YXRlIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVuZmlsdGVyZWRSb3dJdGVyYXRvcgogICAgIHsKLSAgICAgICAgZmluYWwgSG9sZGVyIGN1cnJlbnQ7CisgICAgICAgIGZpbmFsIEJUcmVlUGFydGl0aW9uRGF0YSBjdXJyZW50OwogICAgICAgICBmaW5hbCBDb2x1bW5GaWx0ZXIgc2VsZWN0aW9uOwogCi0gICAgICAgIHByaXZhdGUgQWJzdHJhY3RJdGVyYXRvcihIb2xkZXIgY3VycmVudCwgUm93IHN0YXRpY1JvdywgQ29sdW1uRmlsdGVyIHNlbGVjdGlvbiwgYm9vbGVhbiBpc1JldmVyc2VkKQorICAgICAgICBwcml2YXRlIEFic3RyYWN0SXRlcmF0b3IoQlRyZWVQYXJ0aXRpb25EYXRhIGN1cnJlbnQsIFJvdyBzdGF0aWNSb3csIENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIGJvb2xlYW4gaXNSZXZlcnNlZCkKICAgICAgICAgewogICAgICAgICAgICAgc3VwZXIoQWJzdHJhY3RCVHJlZVBhcnRpdGlvbi50aGlzLm1ldGFkYXRhKCksCiAgICAgICAgICAgICAgICAgICBBYnN0cmFjdEJUcmVlUGFydGl0aW9uLnRoaXMucGFydGl0aW9uS2V5KCksCkBAIC0yNDUsNyArMjE1LDcgQEAKICAgICAgICAgcHJpdmF0ZSBpbnQgaWR4OwogICAgICAgICBwcml2YXRlIEl0ZXJhdG9yPFVuZmlsdGVyZWQ+IGN1cnJlbnRTbGljZTsKIAotICAgICAgICBwcml2YXRlIFNsaWNlc0l0ZXJhdG9yKENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIFNsaWNlcyBzbGljZXMsIGJvb2xlYW4gaXNSZXZlcnNlZCwgSG9sZGVyIGN1cnJlbnQsIFJvdyBzdGF0aWNSb3cpCisgICAgICAgIHByaXZhdGUgU2xpY2VzSXRlcmF0b3IoQ29sdW1uRmlsdGVyIHNlbGVjdGlvbiwgU2xpY2VzIHNsaWNlcywgYm9vbGVhbiBpc1JldmVyc2VkLCBCVHJlZVBhcnRpdGlvbkRhdGEgY3VycmVudCwgUm93IHN0YXRpY1JvdykKICAgICAgICAgewogICAgICAgICAgICAgc3VwZXIoY3VycmVudCwgc3RhdGljUm93LCBzZWxlY3Rpb24sIGlzUmV2ZXJzZWQpOwogICAgICAgICAgICAgdGhpcy5zbGljZXMgPSBzbGljZXM7CkBAIC0yODMsNyArMjUzLDcgQEAKICAgICAgICAgcHJpdmF0ZSBDbHVzdGVyaW5nc0l0ZXJhdG9yKENvbHVtbkZpbHRlciBzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXZpZ2FibGVTZXQ8Q2x1c3RlcmluZzw/Pj4gY2x1c3RlcmluZ3NJblF1ZXJ5T3JkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUmV2ZXJzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb2xkZXIgY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBjdXJyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93IHN0YXRpY1JvdykKICAgICAgICAgewogICAgICAgICAgICAgc3VwZXIoY3VycmVudCwgc3RhdGljUm93LCBzZWxlY3Rpb24sIGlzUmV2ZXJzZWQpOwpAQCAtMzI2LDEyICsyOTYsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByb3RlY3RlZCBzdGF0aWMgSG9sZGVyIGJ1aWxkKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvciwgaW50IGluaXRpYWxSb3dDYXBhY2l0eSkKKyAgICBwcm90ZWN0ZWQgc3RhdGljIEJUcmVlUGFydGl0aW9uRGF0YSBidWlsZChVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IsIGludCBpbml0aWFsUm93Q2FwYWNpdHkpCiAgICAgewogICAgICAgICByZXR1cm4gYnVpbGQoaXRlcmF0b3IsIGluaXRpYWxSb3dDYXBhY2l0eSwgdHJ1ZSk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBIb2xkZXIgYnVpbGQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yLCBpbnQgaW5pdGlhbFJvd0NhcGFjaXR5LCBib29sZWFuIG9yZGVyZWQpCisgICAgcHJvdGVjdGVkIHN0YXRpYyBCVHJlZVBhcnRpdGlvbkRhdGEgYnVpbGQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yLCBpbnQgaW5pdGlhbFJvd0NhcGFjaXR5LCBib29sZWFuIG9yZGVyZWQpCiAgICAgewogICAgICAgICBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhID0gaXRlcmF0b3IubWV0YWRhdGEoKTsKICAgICAgICAgUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1ucyA9IGl0ZXJhdG9yLmNvbHVtbnMoKTsKQEAgLTM1MywxMiArMzIzLDEyIEBACiAgICAgICAgIGlmIChyZXZlcnNlZCkKICAgICAgICAgICAgIGJ1aWxkZXIucmV2ZXJzZSgpOwogCi0gICAgICAgIHJldHVybiBuZXcgSG9sZGVyKGNvbHVtbnMsIGJ1aWxkZXIuYnVpbGQoKSwgZGVsZXRpb25CdWlsZGVyLmJ1aWxkKCksIGl0ZXJhdG9yLnN0YXRpY1JvdygpLCBpdGVyYXRvci5zdGF0cygpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBCVHJlZVBhcnRpdGlvbkRhdGEoY29sdW1ucywgYnVpbGRlci5idWlsZCgpLCBkZWxldGlvbkJ1aWxkZXIuYnVpbGQoKSwgaXRlcmF0b3Iuc3RhdGljUm93KCksIGl0ZXJhdG9yLnN0YXRzKCkpOwogICAgIH0KIAogICAgIC8vIE5vdGUgdGhhdCB3aGVuIGJ1aWxkaW5nIHdpdGggYSBSb3dJdGVyYXRvciwgZGVsZXRpb24gd2lsbCBnZW5lcmFsbHkgYmUgTElWRSwgYnV0IHdlIGFsbG93IHRvIHBhc3MgaXQgbm9uZXRoZWxlc3MgYmVjYXVzZSBQYXJ0aXRpb25VcGRhdGUKICAgICAvLyBwYXNzZXMgYSBNdXRhYmxlRGVsZXRpb25JbmZvIHRoYXQgaXQgbXV0YXRlcyBsYXRlci4KLSAgICBwcm90ZWN0ZWQgc3RhdGljIEhvbGRlciBidWlsZChSb3dJdGVyYXRvciByb3dzLCBEZWxldGlvbkluZm8gZGVsZXRpb24sIGJvb2xlYW4gYnVpbGRFbmNvZGluZ1N0YXRzKQorICAgIHByb3RlY3RlZCBzdGF0aWMgQlRyZWVQYXJ0aXRpb25EYXRhIGJ1aWxkKFJvd0l0ZXJhdG9yIHJvd3MsIERlbGV0aW9uSW5mbyBkZWxldGlvbiwgYm9vbGVhbiBidWlsZEVuY29kaW5nU3RhdHMpCiAgICAgewogICAgICAgICBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zID0gcm93cy5jb2x1bW5zKCk7CiAgICAgICAgIGJvb2xlYW4gcmV2ZXJzZWQgPSByb3dzLmlzUmV2ZXJzZU9yZGVyKCk7CkBAIC0zNzUsNyArMzQ1LDcgQEAKICAgICAgICAgICAgIFJvdyBzdGF0aWNSb3cgPSByb3dzLnN0YXRpY1JvdygpOwogICAgICAgICAgICAgRW5jb2RpbmdTdGF0cyBzdGF0cyA9IGJ1aWxkRW5jb2RpbmdTdGF0cyA/IEVuY29kaW5nU3RhdHMuQ29sbGVjdG9yLmNvbGxlY3Qoc3RhdGljUm93LCBCVHJlZS5pdGVyYXRvcih0cmVlKSwgZGVsZXRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRW5jb2RpbmdTdGF0cy5OT19TVEFUUzsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSG9sZGVyKGNvbHVtbnMsIHRyZWUsIGRlbGV0aW9uLCBzdGF0aWNSb3csIHN0YXRzKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQlRyZWVQYXJ0aXRpb25EYXRhKGNvbHVtbnMsIHRyZWUsIGRlbGV0aW9uLCBzdGF0aWNSb3csIHN0YXRzKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNDIwLDcgKzM5MCw3IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICAgICAgUGFydGl0aW9uVXBkYXRlIHRoYXQgPSAoUGFydGl0aW9uVXBkYXRlKSBvYmo7Ci0gICAgICAgIEhvbGRlciBhID0gdGhpcy5ob2xkZXIoKSwgYiA9IHRoYXQuaG9sZGVyKCk7CisgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBhID0gdGhpcy5ob2xkZXIoKSwgYiA9IHRoYXQuaG9sZGVyKCk7CiAgICAgICAgIHJldHVybiBwYXJ0aXRpb25LZXkuZXF1YWxzKHRoYXQucGFydGl0aW9uS2V5KQogICAgICAgICAgICAgICAgJiYgbWV0YWRhdGEoKS5pZC5lcXVhbHModGhhdC5tZXRhZGF0YSgpLmlkKQogICAgICAgICAgICAgICAgJiYgYS5kZWxldGlvbkluZm8uZXF1YWxzKGIuZGVsZXRpb25JbmZvKQpAQCAtNDQ2LDE2ICs0MTYsNCBAQAogCiAgICAgICAgIHJldHVybiBCVHJlZS5maW5kQnlJbmRleCh0cmVlLCBCVHJlZS5zaXplKHRyZWUpIC0gMSk7CiAgICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIHN0YXRpYyBIb2xkZXIgdW5zYWZlR2V0RW1wdHlIb2xkZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEVNUFRZOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBzdGF0aWMgSG9sZGVyIHVuc2FmZUNvbnN0cnVjdEhvbGRlcihSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zLCBPYmplY3RbXSB0cmVlLCBEZWxldGlvbkluZm8gZGVsZXRpb25JbmZvLCBSb3cgc3RhdGljUm93LCBFbmNvZGluZ1N0YXRzIHN0YXRzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIb2xkZXIoY29sdW1ucywgdHJlZSwgZGVsZXRpb25JbmZvLCBzdGF0aWNSb3csIHN0YXRzKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0F0b21pY0JUcmVlUGFydGl0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0F0b21pY0JUcmVlUGFydGl0aW9uLmphdmEKaW5kZXggOTg2ZTcwNy4uYzkwMzViZSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9BdG9taWNCVHJlZVBhcnRpdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvQXRvbWljQlRyZWVQYXJ0aXRpb24uamF2YQpAQCAtMTgsMjggKzE4LDI0IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnM7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5OYXZpZ2FibGVTZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZUZpZWxkVXBkYXRlcjsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXgudHJhbnNhY3Rpb25zLlVwZGF0ZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC50cmFuc2FjdGlvbnMuVXBkYXRlVHJhbnNhY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuQlRyZWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuVXBkYXRlRnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5PcE9yZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5DbG9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5LkhlYXBDbG9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk1lbXRhYmxlQWxsb2NhdG9yOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IG9yZy5naXRodWIuamFtbS5Vbm1ldGVyZWQ7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOwogCkBAIC03MSw3ICs2Nyw3IEBACiAgICAgLy8gQ0xPQ0tfR1JBTlVMQVJJVFkgPSAxXjlucyA+PiBDTE9DS19TSElGVCA9PSAxMzJ1cyA9PSAoMS83LjYzKW1zCiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyRmllbGRVcGRhdGVyPEF0b21pY0JUcmVlUGFydGl0aW9uPiB3YXN0ZVRyYWNrZXJVcGRhdGVyID0gQXRvbWljSW50ZWdlckZpZWxkVXBkYXRlci5uZXdVcGRhdGVyKEF0b21pY0JUcmVlUGFydGl0aW9uLmNsYXNzLCAid2FzdGVUcmFja2VyIik7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyPEF0b21pY0JUcmVlUGFydGl0aW9uLCBIb2xkZXI+IHJlZlVwZGF0ZXIgPSBBdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXIubmV3VXBkYXRlcihBdG9taWNCVHJlZVBhcnRpdGlvbi5jbGFzcywgSG9sZGVyLmNsYXNzLCAicmVmIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyPEF0b21pY0JUcmVlUGFydGl0aW9uLCBCVHJlZVBhcnRpdGlvbkRhdGE+IHJlZlVwZGF0ZXIgPSBBdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXIubmV3VXBkYXRlcihBdG9taWNCVHJlZVBhcnRpdGlvbi5jbGFzcywgQlRyZWVQYXJ0aXRpb25EYXRhLmNsYXNzLCAicmVmIik7CiAKICAgICAvKioKICAgICAgKiAoY2xvY2sgKyBhbGxvY2F0aW9uKSBncmFudWxhcml0eSBhcmUgY29tYmluZWQgdG8gZ2l2ZSB1cyBhbiBhY2NlcHRhYmxlICh3YXN0ZSkgYWxsb2NhdGlvbiByYXRlIHRoYXQgaXMgZGVmaW5lZCBieQpAQCAtODMsOSArNzksMTIgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvbGF0aWxlIGludCB3YXN0ZVRyYWNrZXIgPSBUUkFDS0VSX05FVkVSX1dBU1RFRDsKIAorICAgIEBVbm1ldGVyZWQKICAgICBwcml2YXRlIGZpbmFsIE1lbXRhYmxlQWxsb2NhdG9yIGFsbG9jYXRvcjsKLSAgICBwcml2YXRlIHZvbGF0aWxlIEhvbGRlciByZWY7CiAKKyAgICBwcml2YXRlIHZvbGF0aWxlIEJUcmVlUGFydGl0aW9uRGF0YSByZWY7CisKKyAgICBAVW5tZXRlcmVkCiAgICAgcHJpdmF0ZSBmaW5hbCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhOwogCiAgICAgcHVibGljIEF0b21pY0JUcmVlUGFydGl0aW9uKFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEsIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksIE1lbXRhYmxlQWxsb2NhdG9yIGFsbG9jYXRvcikKQEAgLTk0LDEwICs5MywxMCBAQAogICAgICAgICBzdXBlcihwYXJ0aXRpb25LZXkpOwogICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7CiAgICAgICAgIHRoaXMuYWxsb2NhdG9yID0gYWxsb2NhdG9yOwotICAgICAgICB0aGlzLnJlZiA9IEVNUFRZOworICAgICAgICB0aGlzLnJlZiA9IEJUcmVlUGFydGl0aW9uRGF0YS5FTVBUWTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgSG9sZGVyIGhvbGRlcigpCisgICAgcHJvdGVjdGVkIEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXIoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHJlZjsKICAgICB9CkBAIC0xMTIsOTIgKzExMSw3OCBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBwcml2YXRlIGxvbmdbXSBhZGRBbGxXaXRoU2l6ZURlbHRhSW50ZXJuYWwoUm93VXBkYXRlciB1cGRhdGVyLCBQYXJ0aXRpb25VcGRhdGUgdXBkYXRlLCBVcGRhdGVUcmFuc2FjdGlvbiBpbmRleGVyKQotICAgIHsKLSAgICAgICAgSG9sZGVyIGN1cnJlbnQgPSByZWY7Ci0gICAgICAgIHVwZGF0ZXIucmVzZXQoKTsKLQotICAgICAgICBpZiAoIXVwZGF0ZS5kZWxldGlvbkluZm8oKS5nZXRQYXJ0aXRpb25EZWxldGlvbigpLmlzTGl2ZSgpKQotICAgICAgICAgICAgaW5kZXhlci5vblBhcnRpdGlvbkRlbGV0aW9uKHVwZGF0ZS5kZWxldGlvbkluZm8oKS5nZXRQYXJ0aXRpb25EZWxldGlvbigpKTsKLQotICAgICAgICBpZiAodXBkYXRlLmRlbGV0aW9uSW5mbygpLmhhc1JhbmdlcygpKQotICAgICAgICAgICAgdXBkYXRlLmRlbGV0aW9uSW5mbygpLnJhbmdlSXRlcmF0b3IoZmFsc2UpLmZvckVhY2hSZW1haW5pbmcoaW5kZXhlcjo6b25SYW5nZVRvbWJzdG9uZSk7Ci0KLSAgICAgICAgRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbzsKLSAgICAgICAgaWYgKHVwZGF0ZS5kZWxldGlvbkluZm8oKS5tYXlNb2RpZnkoY3VycmVudC5kZWxldGlvbkluZm8pKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodXBkYXRlci5pbnB1dERlbGV0aW9uSW5mb0NvcHkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB1cGRhdGVyLmlucHV0RGVsZXRpb25JbmZvQ29weSA9IHVwZGF0ZS5kZWxldGlvbkluZm8oKS5jbG9uZShIZWFwQ2xvbmVyLmluc3RhbmNlKTsKLQotICAgICAgICAgICAgZGVsZXRpb25JbmZvID0gY3VycmVudC5kZWxldGlvbkluZm8ubXV0YWJsZUNvcHkoKS5hZGQodXBkYXRlci5pbnB1dERlbGV0aW9uSW5mb0NvcHkpOwotICAgICAgICAgICAgdXBkYXRlci5vbkFsbG9jYXRlZE9uSGVhcChkZWxldGlvbkluZm8udW5zaGFyZWRIZWFwU2l6ZSgpIC0gY3VycmVudC5kZWxldGlvbkluZm8udW5zaGFyZWRIZWFwU2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGV0aW9uSW5mbyA9IGN1cnJlbnQuZGVsZXRpb25JbmZvOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1ucyA9IHVwZGF0ZS5jb2x1bW5zKCkubWVyZ2VUbyhjdXJyZW50LmNvbHVtbnMpOwotICAgICAgICB1cGRhdGVyLm9uQWxsb2NhdGVkT25IZWFwKGNvbHVtbnMudW5zaGFyZWRIZWFwU2l6ZSgpIC0gY3VycmVudC5jb2x1bW5zLnVuc2hhcmVkSGVhcFNpemUoKSk7Ci0gICAgICAgIFJvdyBuZXdTdGF0aWMgPSB1cGRhdGUuc3RhdGljUm93KCk7Ci0gICAgICAgIFJvdyBzdGF0aWNSb3cgPSBuZXdTdGF0aWMuaXNFbXB0eSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IGN1cnJlbnQuc3RhdGljUm93Ci0gICAgICAgICAgICAgICAgICAgICAgICA6IChjdXJyZW50LnN0YXRpY1Jvdy5pc0VtcHR5KCkgPyB1cGRhdGVyLmluc2VydChuZXdTdGF0aWMpIDogdXBkYXRlci5tZXJnZShjdXJyZW50LnN0YXRpY1JvdywgbmV3U3RhdGljKSk7Ci0gICAgICAgIE9iamVjdFtdIHRyZWUgPSBCVHJlZS51cGRhdGUoY3VycmVudC50cmVlLCB1cGRhdGUuaG9sZGVyKCkudHJlZSwgdXBkYXRlLm1ldGFkYXRhKCkuY29tcGFyYXRvciwgdXBkYXRlcik7Ci0gICAgICAgIEVuY29kaW5nU3RhdHMgbmV3U3RhdHMgPSBjdXJyZW50LnN0YXRzLm1lcmdlV2l0aCh1cGRhdGUuc3RhdHMoKSk7Ci0gICAgICAgIHVwZGF0ZXIub25BbGxvY2F0ZWRPbkhlYXAobmV3U3RhdHMudW5zaGFyZWRIZWFwU2l6ZSgpIC0gY3VycmVudC5zdGF0cy51bnNoYXJlZEhlYXBTaXplKCkpOwotCi0gICAgICAgIGlmICh0cmVlICE9IG51bGwgJiYgcmVmVXBkYXRlci5jb21wYXJlQW5kU2V0KHRoaXMsIGN1cnJlbnQsIG5ldyBIb2xkZXIoY29sdW1ucywgdHJlZSwgZGVsZXRpb25JbmZvLCBzdGF0aWNSb3csIG5ld1N0YXRzKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVwZGF0ZXIuZmluaXNoKCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IGxvbmdbXXsgdXBkYXRlci5kYXRhU2l6ZSwgdXBkYXRlci5jb2xVcGRhdGVUaW1lRGVsdGEgfTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQogICAgIC8qKgogICAgICAqIEFkZHMgYSBnaXZlbiB1cGRhdGUgdG8gdGhpcyBpbi1tZW10YWJsZSBwYXJ0aXRpb24uCiAgICAgICoKICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgZmlyc3QgdGhlIGRpZmZlcmVuY2UgaW4gc2l6ZSBzZWVuIGFmdGVyIG1lcmdpbmcgdGhlIHVwZGF0ZXMsIGFuZCBzZWNvbmQgdGhlIG1pbmltdW0KLSAgICAgKiB0aW1lIGRldGxhIGJldHdlZW4gdXBkYXRlcy4KKyAgICAgKiB0aW1lIGRlbHRhIGJldHdlZW4gdXBkYXRlcy4KICAgICAgKi8KLSAgICBwdWJsaWMgbG9uZ1tdIGFkZEFsbFdpdGhTaXplRGVsdGEoZmluYWwgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvbmVyIGNsb25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BPcmRlci5Hcm91cCB3cml0ZU9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVUcmFuc2FjdGlvbiBpbmRleGVyKQorICAgIHB1YmxpYyBCVHJlZVBhcnRpdGlvblVwZGF0ZXIgYWRkQWxsKGZpbmFsIFBhcnRpdGlvblVwZGF0ZSB1cGRhdGUsIENsb25lciBjbG9uZXIsIE9wT3JkZXIuR3JvdXAgd3JpdGVPcCwgVXBkYXRlVHJhbnNhY3Rpb24gaW5kZXhlcikKICAgICB7Ci0gICAgICAgIFJvd1VwZGF0ZXIgdXBkYXRlciA9IG5ldyBSb3dVcGRhdGVyKGFsbG9jYXRvciwgY2xvbmVyLCB3cml0ZU9wLCBpbmRleGVyKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkTG9jayA9IHNob3VsZExvY2sod3JpdGVPcCk7Ci0gICAgICAgICAgICBpbmRleGVyLnN0YXJ0KCk7CisgICAgICAgIHJldHVybiBuZXcgVXBkYXRlcihhbGxvY2F0b3IsIGNsb25lciwgd3JpdGVPcCwgaW5kZXhlcikuYWRkQWxsKHVwZGF0ZSk7CisgICAgfQogCi0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgdm9pZCB1bnNhZmVTZXRIb2xkZXIoQlRyZWVQYXJ0aXRpb25EYXRhIGhvbGRlcikKKyAgICB7CisgICAgICAgIHJlZiA9IGhvbGRlcjsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgQlRyZWVQYXJ0aXRpb25EYXRhIHVuc2FmZUdldEhvbGRlcigpCisgICAgeworICAgICAgICByZXR1cm4gcmVmOworICAgIH0KKworICAgIGNsYXNzIFVwZGF0ZXIgZXh0ZW5kcyBCVHJlZVBhcnRpdGlvblVwZGF0ZXIKKyAgICB7CisgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBjdXJyZW50OworCisgICAgICAgIHB1YmxpYyBVcGRhdGVyKE1lbXRhYmxlQWxsb2NhdG9yIGFsbG9jYXRvciwgQ2xvbmVyIGNsb25lciwgT3BPcmRlci5Hcm91cCB3cml0ZU9wLCBVcGRhdGVUcmFuc2FjdGlvbiBpbmRleGVyKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihhbGxvY2F0b3IsIGNsb25lciwgd3JpdGVPcCwgaW5kZXhlcik7CisgICAgICAgIH0KKworICAgICAgICBVcGRhdGVyIGFkZEFsbChmaW5hbCBQYXJ0aXRpb25VcGRhdGUgdXBkYXRlKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc2hvdWxkTG9jaykKKyAgICAgICAgICAgICAgICBib29sZWFuIHNob3VsZExvY2sgPSBzaG91bGRMb2NrKHdyaXRlT3ApOworICAgICAgICAgICAgICAgIGluZGV4ZXIuc3RhcnQoKTsKKworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQorICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkTG9jaykKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ1tdIHJlc3VsdCA9IGFkZEFsbFdpdGhTaXplRGVsdGFJbnRlcm5hbCh1cGRhdGVyLCB1cGRhdGUsIGluZGV4ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyeVVwZGF0ZURhdGEodXBkYXRlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJ5VXBkYXRlRGF0YSh1cGRhdGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworCisgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRMb2NrID0gc2hvdWxkTG9jayhoZWFwU2l6ZSwgd3JpdGVPcCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9uZ1tdIHJlc3VsdCA9IGFkZEFsbFdpdGhTaXplRGVsdGFJbnRlcm5hbCh1cGRhdGVyLCB1cGRhdGUsIGluZGV4ZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgICAgICAgICAgICAgICAgIHNob3VsZExvY2sgPSBzaG91bGRMb2NrKHVwZGF0ZXIuaGVhcFNpemUsIHdyaXRlT3ApOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleGVyLmNvbW1pdCgpOworICAgICAgICAgICAgICAgIHJlcG9ydEFsbG9jYXRlZE1lbW9yeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gdHJ5VXBkYXRlRGF0YShQYXJ0aXRpb25VcGRhdGUgdXBkYXRlKQogICAgICAgICB7Ci0gICAgICAgICAgICBpbmRleGVyLmNvbW1pdCgpOworICAgICAgICAgICAgY3VycmVudCA9IHJlZjsKKyAgICAgICAgICAgIHRoaXMuZGF0YVNpemUgPSAwOworICAgICAgICAgICAgdGhpcy5oZWFwU2l6ZSA9IDA7CisgICAgICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgcmVzdWx0ID0gbWFrZU1lcmdlZFBhcnRpdGlvbihjdXJyZW50LCB1cGRhdGUpOworICAgICAgICAgICAgcmV0dXJuIHJlZlVwZGF0ZXIuY29tcGFyZUFuZFNldChBdG9taWNCVHJlZVBhcnRpdGlvbi50aGlzLCBjdXJyZW50LCByZXN1bHQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMzIsMjUgKzIxNyw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB1bmZpbHRlcmVkSXRlcmF0b3IoQ29sdW1uRmlsdGVyIHNlbGVjdGlvbiwgU2xpY2VzIHNsaWNlcywgYm9vbGVhbiByZXZlcnNlZCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhbGxvY2F0b3IuZW5zdXJlT25IZWFwKCkuYXBwbHlUb1BhcnRpdGlvbihzdXBlci51bmZpbHRlcmVkSXRlcmF0b3Ioc2VsZWN0aW9uLCBzbGljZXMsIHJldmVyc2VkKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB1bmZpbHRlcmVkSXRlcmF0b3IoQ29sdW1uRmlsdGVyIHNlbGVjdGlvbiwgTmF2aWdhYmxlU2V0PENsdXN0ZXJpbmc8Pz4+IGNsdXN0ZXJpbmdzSW5RdWVyeU9yZGVyLCBib29sZWFuIHJldmVyc2VkKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFsbG9jYXRvci5lbnN1cmVPbkhlYXAoKS5hcHBseVRvUGFydGl0aW9uKHN1cGVyLnVuZmlsdGVyZWRJdGVyYXRvcihzZWxlY3Rpb24sIGNsdXN0ZXJpbmdzSW5RdWVyeU9yZGVyLCByZXZlcnNlZCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdW5maWx0ZXJlZEl0ZXJhdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhbGxvY2F0b3IuZW5zdXJlT25IZWFwKCkuYXBwbHlUb1BhcnRpdGlvbihzdXBlci51bmZpbHRlcmVkSXRlcmF0b3IoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB1bmZpbHRlcmVkSXRlcmF0b3IoSG9sZGVyIGN1cnJlbnQsIENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIFNsaWNlcyBzbGljZXMsIGJvb2xlYW4gcmV2ZXJzZWQpCisgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB1bmZpbHRlcmVkSXRlcmF0b3IoQlRyZWVQYXJ0aXRpb25EYXRhIGN1cnJlbnQsIENvbHVtbkZpbHRlciBzZWxlY3Rpb24sIFNsaWNlcyBzbGljZXMsIGJvb2xlYW4gcmV2ZXJzZWQpCiAgICAgewogICAgICAgICByZXR1cm4gYWxsb2NhdG9yLmVuc3VyZU9uSGVhcCgpLmFwcGx5VG9QYXJ0aXRpb24oc3VwZXIudW5maWx0ZXJlZEl0ZXJhdG9yKGN1cnJlbnQsIHNlbGVjdGlvbiwgc2xpY2VzLCByZXZlcnNlZCkpOwogICAgIH0KQEAgLTMzNCwxMTggKzMwMSw0IEBACiAgICAgICAgICAgICByZXR1cm4gd2FzdGVUcmFja2VyICsgMTsKICAgICAgICAgcmV0dXJuIHdhc3RlVHJhY2tlcjsKICAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwdWJsaWMgdm9pZCB1bnNhZmVTZXRIb2xkZXIoSG9sZGVyIGhvbGRlcikKLSAgICB7Ci0gICAgICAgIHJlZiA9IGhvbGRlcjsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwdWJsaWMgSG9sZGVyIHVuc2FmZUdldEhvbGRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gcmVmOwotICAgIH0KLQotICAgIC8vIHRoZSBmdW5jdGlvbiB3ZSBwcm92aWRlIHRvIHRoZSBidHJlZSB1dGlsaXRpZXMgdG8gcGVyZm9ybSBhbnkgY29sdW1uIHJlcGxhY2VtZW50cwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJvd1VwZGF0ZXIgaW1wbGVtZW50cyBVcGRhdGVGdW5jdGlvbjxSb3csIFJvdz4sIENvbHVtbkRhdGEuUG9zdFJlY29uY2lsaWF0aW9uRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIE1lbXRhYmxlQWxsb2NhdG9yIGFsbG9jYXRvcjsKLSAgICAgICAgZmluYWwgT3BPcmRlci5Hcm91cCB3cml0ZU9wOwotICAgICAgICBmaW5hbCBVcGRhdGVUcmFuc2FjdGlvbiBpbmRleGVyOwotICAgICAgICBmaW5hbCBDbG9uZXIgY2xvbmVyOwotICAgICAgICBsb25nIGRhdGFTaXplOwotICAgICAgICBsb25nIGhlYXBTaXplOwotICAgICAgICBsb25nIGNvbFVwZGF0ZVRpbWVEZWx0YSA9IExvbmcuTUFYX1ZBTFVFOwotICAgICAgICBMaXN0PFJvdz4gaW5zZXJ0ZWQ7IC8vIFRPRE86IHJlcGxhY2Ugd2l0aCB3YWxrIG9mIGFib3J0ZWQgQlRyZWUKLQotICAgICAgICBEZWxldGlvbkluZm8gaW5wdXREZWxldGlvbkluZm9Db3B5ID0gbnVsbDsKLQotICAgICAgICBwcml2YXRlIFJvd1VwZGF0ZXIoTWVtdGFibGVBbGxvY2F0b3IgYWxsb2NhdG9yLCBDbG9uZXIgY2xvbmVyLCBPcE9yZGVyLkdyb3VwIHdyaXRlT3AsIFVwZGF0ZVRyYW5zYWN0aW9uIGluZGV4ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuYWxsb2NhdG9yID0gYWxsb2NhdG9yOwotICAgICAgICAgICAgdGhpcy53cml0ZU9wID0gd3JpdGVPcDsKLSAgICAgICAgICAgIHRoaXMuaW5kZXhlciA9IGluZGV4ZXI7Ci0gICAgICAgICAgICB0aGlzLmNsb25lciA9IGNsb25lcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUm93IGluc2VydChSb3cgaW5zZXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBSb3cgZGF0YSA9IGluc2VydC5jbG9uZShjbG9uZXIpOyAKLSAgICAgICAgICAgIGluZGV4ZXIub25JbnNlcnRlZChpbnNlcnQpOwotCi0gICAgICAgICAgICB0aGlzLmRhdGFTaXplICs9IGRhdGEuZGF0YVNpemUoKTsKLSAgICAgICAgICAgIHRoaXMuaGVhcFNpemUgKz0gZGF0YS51bnNoYXJlZEhlYXBTaXplRXhjbHVkaW5nRGF0YSgpOwotICAgICAgICAgICAgaWYgKGluc2VydGVkID09IG51bGwpCi0gICAgICAgICAgICAgICAgaW5zZXJ0ZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGluc2VydGVkLmFkZChkYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBkYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJvdyBtZXJnZShSb3cgZXhpc3RpbmcsIFJvdyB1cGRhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvdyByZWNvbmNpbGVkID0gUm93cy5tZXJnZShleGlzdGluZywgdXBkYXRlLCB0aGlzKTsKLSAgICAgICAgICAgIGluZGV4ZXIub25VcGRhdGVkKGV4aXN0aW5nLCByZWNvbmNpbGVkKTsKLQotICAgICAgICAgICAgaWYgKGluc2VydGVkID09IG51bGwpCi0gICAgICAgICAgICAgICAgaW5zZXJ0ZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGluc2VydGVkLmFkZChyZWNvbmNpbGVkKTsKLQotICAgICAgICAgICAgcmV0dXJuIHJlY29uY2lsZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUm93IHJldGFpbihSb3cgZXhpc3RpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBleGlzdGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5kYXRhU2l6ZSA9IDA7Ci0gICAgICAgICAgICB0aGlzLmhlYXBTaXplID0gMDsKLSAgICAgICAgICAgIGlmIChpbnNlcnRlZCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGluc2VydGVkLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ2VsbDw/PiBtZXJnZShDZWxsPD8+IHByZXZpb3VzLCBDZWxsPD8+IGluc2VydCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGluc2VydCA9PSBwcmV2aW91cykKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5zZXJ0OwotICAgICAgICAgICAgbG9uZyB0aW1lRGVsdGEgPSBNYXRoLmFicyhpbnNlcnQudGltZXN0YW1wKCkgLSBwcmV2aW91cy50aW1lc3RhbXAoKSk7Ci0gICAgICAgICAgICBpZiAodGltZURlbHRhIDwgY29sVXBkYXRlVGltZURlbHRhKQotICAgICAgICAgICAgICAgIGNvbFVwZGF0ZVRpbWVEZWx0YSA9IHRpbWVEZWx0YTsKLSAgICAgICAgICAgIGlmIChjbG9uZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBpbnNlcnQgPSBjbG9uZXIuY2xvbmUoaW5zZXJ0KTsKLSAgICAgICAgICAgIGRhdGFTaXplICs9IGluc2VydC5kYXRhU2l6ZSgpIC0gcHJldmlvdXMuZGF0YVNpemUoKTsKLSAgICAgICAgICAgIGhlYXBTaXplICs9IGluc2VydC51bnNoYXJlZEhlYXBTaXplRXhjbHVkaW5nRGF0YSgpIC0gcHJldmlvdXMudW5zaGFyZWRIZWFwU2l6ZUV4Y2x1ZGluZ0RhdGEoKTsKLSAgICAgICAgICAgIHJldHVybiBpbnNlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29sdW1uRGF0YSBpbnNlcnQoQ29sdW1uRGF0YSBpbnNlcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjbG9uZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBpbnNlcnQgPSBpbnNlcnQuY2xvbmUoY2xvbmVyKTsKLSAgICAgICAgICAgIGRhdGFTaXplICs9IGluc2VydC5kYXRhU2l6ZSgpOwotICAgICAgICAgICAgaGVhcFNpemUgKz0gaW5zZXJ0LnVuc2hhcmVkSGVhcFNpemVFeGNsdWRpbmdEYXRhKCk7Ci0gICAgICAgICAgICByZXR1cm4gaW5zZXJ0OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShDb2x1bW5EYXRhIGV4aXN0aW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBkYXRhU2l6ZSAtPSBleGlzdGluZy5kYXRhU2l6ZSgpOwotICAgICAgICAgICAgaGVhcFNpemUgLT0gZXhpc3RpbmcudW5zaGFyZWRIZWFwU2l6ZUV4Y2x1ZGluZ0RhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQWxsb2NhdGVkT25IZWFwKGxvbmcgaGVhcFNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuaGVhcFNpemUgKz0gaGVhcFNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2goKQotICAgICAgICB7Ci0gICAgICAgICAgICBhbGxvY2F0b3Iub25IZWFwKCkuYWRqdXN0KGhlYXBTaXplLCB3cml0ZU9wKTsKLSAgICAgICAgfQotICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvQlRyZWVQYXJ0aXRpb25EYXRhLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0JUcmVlUGFydGl0aW9uRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZmNkMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0JUcmVlUGFydGl0aW9uRGF0YS5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVndWxhckFuZFN0YXRpY0NvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PYmplY3RTaXplczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5idHJlZS5CVHJlZTsKKworLyoqCisgKiBIb2xkZXIgb2YgdGhlIGNvbnRlbnQgb2YgYSBwYXJ0aXRpb24sIHNlZSB7QGxpbmsgQWJzdHJhY3RCVHJlZVBhcnRpdGlvbn0uCisgKiBXaGVuIHVwZGF0aW5nIGEgcGFydGl0aW9uIG9uZSBob2xkZXIgaXMgc3dhcHBlZCBmb3IgYW5vdGhlciBhdG9taWNhbGx5LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQlRyZWVQYXJ0aXRpb25EYXRhCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCVHJlZVBhcnRpdGlvbkRhdGEgRU1QVFkgPSBuZXcgQlRyZWVQYXJ0aXRpb25EYXRhKFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zLk5PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUcmVlLmVtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uSW5mby5MSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3dzLkVNUFRZX1NUQVRJQ19ST1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kaW5nU3RhdHMuTk9fU1RBVFMpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBVTlNIQVJFRF9IRUFQX1NJWkUgPSBPYmplY3RTaXplcy5tZWFzdXJlKEVNUFRZKTsKKworCisgICAgZmluYWwgUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1uczsKKyAgICBmaW5hbCBEZWxldGlvbkluZm8gZGVsZXRpb25JbmZvOworICAgIC8vIHRoZSBidHJlZSBvZiByb3dzCisgICAgZmluYWwgT2JqZWN0W10gdHJlZTsKKyAgICBmaW5hbCBSb3cgc3RhdGljUm93OworICAgIHB1YmxpYyBmaW5hbCBFbmNvZGluZ1N0YXRzIHN0YXRzOworCisgICAgQlRyZWVQYXJ0aXRpb25EYXRhKFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uSW5mbyBkZWxldGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIFJvdyBzdGF0aWNSb3csCisgICAgICAgICAgICAgICAgICAgICAgIEVuY29kaW5nU3RhdHMgc3RhdHMpCisgICAgeworICAgICAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zOworICAgICAgICB0aGlzLnRyZWUgPSB0cmVlOworICAgICAgICB0aGlzLmRlbGV0aW9uSW5mbyA9IGRlbGV0aW9uSW5mbzsKKyAgICAgICAgdGhpcy5zdGF0aWNSb3cgPSBzdGF0aWNSb3cgPT0gbnVsbCA/IFJvd3MuRU1QVFlfU1RBVElDX1JPVyA6IHN0YXRpY1JvdzsKKyAgICAgICAgdGhpcy5zdGF0cyA9IHN0YXRzOworICAgIH0KKworICAgIEJUcmVlUGFydGl0aW9uRGF0YSB3aXRoQ29sdW1ucyhSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCVHJlZVBhcnRpdGlvbkRhdGEoY29sdW1ucywgdGhpcy50cmVlLCB0aGlzLmRlbGV0aW9uSW5mbywgdGhpcy5zdGF0aWNSb3csIHRoaXMuc3RhdHMpOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgQlRyZWVQYXJ0aXRpb25EYXRhIHVuc2FmZUdldEVtcHR5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBFTVBUWTsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIEJUcmVlUGFydGl0aW9uRGF0YSB1bnNhZmVDb25zdHJ1Y3QoUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93IHN0YXRpY1JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmdTdGF0cyBzdGF0cykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQlRyZWVQYXJ0aXRpb25EYXRhKGNvbHVtbnMsIHRyZWUsIGRlbGV0aW9uSW5mbywgc3RhdGljUm93LCBzdGF0cyk7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVuc2FmZUludmFsaWRhdGUoQXRvbWljQlRyZWVQYXJ0aXRpb24gcGFydGl0aW9uKQorICAgIHsKKyAgICAgICAgQlRyZWVQYXJ0aXRpb25EYXRhIGhvbGRlciA9IHBhcnRpdGlvbi51bnNhZmVHZXRIb2xkZXIoKTsKKyAgICAgICAgaWYgKCFCVHJlZS5pc0VtcHR5KGhvbGRlci50cmVlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcGFydGl0aW9uLnVuc2FmZVNldEhvbGRlcih1bnNhZmVDb25zdHJ1Y3QoaG9sZGVyLmNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuY29weU9mKGhvbGRlci50cmVlLCBob2xkZXIudHJlZS5sZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9sZGVyLmRlbGV0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRlci5zdGF0aWNSb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIuc3RhdHMpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvQlRyZWVQYXJ0aXRpb25VcGRhdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0JUcmVlUGFydGl0aW9uVXBkYXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMzAxOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0JUcmVlUGFydGl0aW9uVXBkYXRlci5qYXZhCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVndWxhckFuZFN0YXRpY0NvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ29sdW1uRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3dzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnRyYW5zYWN0aW9ucy5VcGRhdGVUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5idHJlZS5CVHJlZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5idHJlZS5VcGRhdGVGdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50Lk9wT3JkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5LkNsb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuSGVhcENsb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTWVtdGFibGVBbGxvY2F0b3I7CisKKy8qKgorICogIHRoZSBmdW5jdGlvbiB3ZSBwcm92aWRlIHRvIHRoZSB0cmllIGFuZCBidHJlZSB1dGlsaXRpZXMgdG8gcGVyZm9ybSBhbnkgcm93IGFuZCBjb2x1bW4gcmVwbGFjZW1lbnRzCisgKi8KK3B1YmxpYyBjbGFzcyBCVHJlZVBhcnRpdGlvblVwZGF0ZXIgaW1wbGVtZW50cyBVcGRhdGVGdW5jdGlvbjxSb3csIFJvdz4sIENvbHVtbkRhdGEuUG9zdFJlY29uY2lsaWF0aW9uRnVuY3Rpb24KK3sKKyAgICBmaW5hbCBNZW10YWJsZUFsbG9jYXRvciBhbGxvY2F0b3I7CisgICAgZmluYWwgT3BPcmRlci5Hcm91cCB3cml0ZU9wOworICAgIGZpbmFsIENsb25lciBjbG9uZXI7CisgICAgZmluYWwgVXBkYXRlVHJhbnNhY3Rpb24gaW5kZXhlcjsKKyAgICBwdWJsaWMgbG9uZyBkYXRhU2l6ZTsKKyAgICBsb25nIGhlYXBTaXplOworICAgIHB1YmxpYyBsb25nIGNvbFVwZGF0ZVRpbWVEZWx0YSA9IExvbmcuTUFYX1ZBTFVFOworCisgICAgcHVibGljIEJUcmVlUGFydGl0aW9uVXBkYXRlcihNZW10YWJsZUFsbG9jYXRvciBhbGxvY2F0b3IsIENsb25lciBjbG9uZXIsIE9wT3JkZXIuR3JvdXAgd3JpdGVPcCwgVXBkYXRlVHJhbnNhY3Rpb24gaW5kZXhlcikKKyAgICB7CisgICAgICAgIHRoaXMuYWxsb2NhdG9yID0gYWxsb2NhdG9yOworICAgICAgICB0aGlzLmNsb25lciA9IGNsb25lcjsKKyAgICAgICAgdGhpcy53cml0ZU9wID0gd3JpdGVPcDsKKyAgICAgICAgdGhpcy5pbmRleGVyID0gaW5kZXhlcjsKKyAgICAgICAgdGhpcy5oZWFwU2l6ZSA9IDA7CisgICAgICAgIHRoaXMuZGF0YVNpemUgPSAwOworICAgIH0KKworICAgIHB1YmxpYyBCVHJlZVBhcnRpdGlvbkRhdGEgbWVyZ2VQYXJ0aXRpb25zKEJUcmVlUGFydGl0aW9uRGF0YSBjdXJyZW50LCBmaW5hbCBQYXJ0aXRpb25VcGRhdGUgdXBkYXRlKQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgY3VycmVudCA9IEJUcmVlUGFydGl0aW9uRGF0YS5FTVBUWTsKKyAgICAgICAgICAgIG9uQWxsb2NhdGVkT25IZWFwKEJUcmVlUGFydGl0aW9uRGF0YS5VTlNIQVJFRF9IRUFQX1NJWkUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGV4ZXIuc3RhcnQoKTsKKworICAgICAgICAgICAgcmV0dXJuIG1ha2VNZXJnZWRQYXJ0aXRpb24oY3VycmVudCwgdXBkYXRlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGV4ZXIuY29tbWl0KCk7CisgICAgICAgICAgICByZXBvcnRBbGxvY2F0ZWRNZW1vcnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBCVHJlZVBhcnRpdGlvbkRhdGEgbWFrZU1lcmdlZFBhcnRpdGlvbihCVHJlZVBhcnRpdGlvbkRhdGEgY3VycmVudCwgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSkKKyAgICB7CisgICAgICAgIERlbGV0aW9uSW5mbyBuZXdEZWxldGlvbkluZm8gPSBtZXJnZShjdXJyZW50LmRlbGV0aW9uSW5mbywgdXBkYXRlLmRlbGV0aW9uSW5mbygpKTsKKworICAgICAgICBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zID0gY3VycmVudC5jb2x1bW5zOworICAgICAgICBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBuZXdDb2x1bW5zID0gdXBkYXRlLmNvbHVtbnMoKS5tZXJnZVRvKGNvbHVtbnMpOworICAgICAgICBvbkFsbG9jYXRlZE9uSGVhcChuZXdDb2x1bW5zLnVuc2hhcmVkSGVhcFNpemUoKSAtIGNvbHVtbnMudW5zaGFyZWRIZWFwU2l6ZSgpKTsKKyAgICAgICAgUm93IG5ld1N0YXRpYyA9IG1lcmdlU3RhdGljKGN1cnJlbnQuc3RhdGljUm93LCB1cGRhdGUuc3RhdGljUm93KCkpOworCisgICAgICAgIE9iamVjdFtdIHRyZWUgPSBCVHJlZS51cGRhdGUoY3VycmVudC50cmVlLCB1cGRhdGUuaG9sZGVyKCkudHJlZSwgdXBkYXRlLm1ldGFkYXRhKCkuY29tcGFyYXRvciwgdGhpcyk7CisgICAgICAgIEVuY29kaW5nU3RhdHMgbmV3U3RhdHMgPSBjdXJyZW50LnN0YXRzLm1lcmdlV2l0aCh1cGRhdGUuc3RhdHMoKSk7CisgICAgICAgIG9uQWxsb2NhdGVkT25IZWFwKG5ld1N0YXRzLnVuc2hhcmVkSGVhcFNpemUoKSAtIGN1cnJlbnQuc3RhdHMudW5zaGFyZWRIZWFwU2l6ZSgpKTsKKworICAgICAgICByZXR1cm4gbmV3IEJUcmVlUGFydGl0aW9uRGF0YShuZXdDb2x1bW5zLCB0cmVlLCBuZXdEZWxldGlvbkluZm8sIG5ld1N0YXRpYywgbmV3U3RhdHMpOworICAgIH0KKworICAgIHByaXZhdGUgUm93IG1lcmdlU3RhdGljKFJvdyBjdXJyZW50LCBSb3cgdXBkYXRlKQorICAgIHsKKyAgICAgICAgaWYgKHVwZGF0ZS5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICAgICAgaWYgKGN1cnJlbnQuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGluc2VydCh1cGRhdGUpOworCisgICAgICAgIHJldHVybiBtZXJnZShjdXJyZW50LCB1cGRhdGUpOworICAgIH0KKworICAgIHByaXZhdGUgRGVsZXRpb25JbmZvIG1lcmdlKERlbGV0aW9uSW5mbyBleGlzdGluZywgRGVsZXRpb25JbmZvIHVwZGF0ZSkKKyAgICB7CisgICAgICAgIGlmICh1cGRhdGUuaXNMaXZlKCkgfHwgIXVwZGF0ZS5tYXlNb2RpZnkoZXhpc3RpbmcpKQorICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nOworCisgICAgICAgIGlmICghdXBkYXRlLmdldFBhcnRpdGlvbkRlbGV0aW9uKCkuaXNMaXZlKCkpCisgICAgICAgICAgICBpbmRleGVyLm9uUGFydGl0aW9uRGVsZXRpb24odXBkYXRlLmdldFBhcnRpdGlvbkRlbGV0aW9uKCkpOworCisgICAgICAgIGlmICh1cGRhdGUuaGFzUmFuZ2VzKCkpCisgICAgICAgICAgICB1cGRhdGUucmFuZ2VJdGVyYXRvcihmYWxzZSkuZm9yRWFjaFJlbWFpbmluZyhpbmRleGVyOjpvblJhbmdlVG9tYnN0b25lKTsKKworICAgICAgICAvLyBMaWtlIGZvciByb3dzLCB3ZSBoYXZlIHRvIGNsb25lIHRoZSB1cGRhdGUgaW4gY2FzZSBpbnRlcm5hbCBidWZmZXJzICh3aGVuIGl0IGhhcyByYW5nZSB0b21ic3RvbmVzKSByZWZlcmVuY2UKKyAgICAgICAgLy8gbWVtb3J5IHdlIHNob3VsZG4ndCBob2xkIGludG8uIEJ1dCB3ZSBkb24ndCBldmVyIHN0b3JlIHRoaXMgb2ZmLWhlYXAgY3VycmVudGx5IHNvIHdlIGp1c3QgZGVmYXVsdCB0byB0aGUKKyAgICAgICAgLy8gSGVhcEFsbG9jYXRvciAocmF0aGVyIHRoYW4gdXNpbmcgJ2FsbG9jYXRvcicpLgorICAgICAgICBEZWxldGlvbkluZm8gbmV3SW5mbyA9IGV4aXN0aW5nLm11dGFibGVDb3B5KCkuYWRkKHVwZGF0ZS5jbG9uZShIZWFwQ2xvbmVyLmluc3RhbmNlKSk7CisgICAgICAgIG9uQWxsb2NhdGVkT25IZWFwKG5ld0luZm8udW5zaGFyZWRIZWFwU2l6ZSgpIC0gZXhpc3RpbmcudW5zaGFyZWRIZWFwU2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIG5ld0luZm87CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJvdyBpbnNlcnQoUm93IGluc2VydCkKKyAgICB7CisgICAgICAgIFJvdyBkYXRhID0gaW5zZXJ0LmNsb25lKGNsb25lcik7CisgICAgICAgIGluZGV4ZXIub25JbnNlcnRlZChpbnNlcnQpOworCisgICAgICAgIGRhdGFTaXplICs9IGRhdGEuZGF0YVNpemUoKTsKKyAgICAgICAgaGVhcFNpemUgKz0gZGF0YS51bnNoYXJlZEhlYXBTaXplRXhjbHVkaW5nRGF0YSgpOworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICBwdWJsaWMgUm93IG1lcmdlKFJvdyBleGlzdGluZywgUm93IHVwZGF0ZSkKKyAgICB7CisgICAgICAgIFJvdyByZWNvbmNpbGVkID0gUm93cy5tZXJnZShleGlzdGluZywgdXBkYXRlLCB0aGlzKTsKKyAgICAgICAgaW5kZXhlci5vblVwZGF0ZWQoZXhpc3RpbmcsIHJlY29uY2lsZWQpOworCisgICAgICAgIHJldHVybiByZWNvbmNpbGVkOworICAgIH0KKworICAgIHB1YmxpYyBDZWxsPD8+IG1lcmdlKENlbGw8Pz4gcHJldmlvdXMsIENlbGw8Pz4gaW5zZXJ0KQorICAgIHsKKyAgICAgICAgaWYgKGluc2VydCA9PSBwcmV2aW91cykKKyAgICAgICAgICAgIHJldHVybiBpbnNlcnQ7CisKKyAgICAgICAgbG9uZyB0aW1lRGVsdGEgPSBNYXRoLmFicyhpbnNlcnQudGltZXN0YW1wKCkgLSBwcmV2aW91cy50aW1lc3RhbXAoKSk7CisgICAgICAgIGlmICh0aW1lRGVsdGEgPCBjb2xVcGRhdGVUaW1lRGVsdGEpCisgICAgICAgICAgICBjb2xVcGRhdGVUaW1lRGVsdGEgPSB0aW1lRGVsdGE7CisgICAgICAgIGlmIChjbG9uZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGluc2VydCA9IGNsb25lci5jbG9uZShpbnNlcnQpOworICAgICAgICBkYXRhU2l6ZSArPSBpbnNlcnQuZGF0YVNpemUoKSAtIHByZXZpb3VzLmRhdGFTaXplKCk7CisgICAgICAgIGhlYXBTaXplICs9IGluc2VydC51bnNoYXJlZEhlYXBTaXplRXhjbHVkaW5nRGF0YSgpIC0gcHJldmlvdXMudW5zaGFyZWRIZWFwU2l6ZUV4Y2x1ZGluZ0RhdGEoKTsKKyAgICAgICAgcmV0dXJuIGluc2VydDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uRGF0YSBpbnNlcnQoQ29sdW1uRGF0YSBpbnNlcnQpCisgICAgeworICAgICAgICBpZiAoY2xvbmVyICE9IG51bGwpCisgICAgICAgICAgICBpbnNlcnQgPSBpbnNlcnQuY2xvbmUoY2xvbmVyKTsKKyAgICAgICAgZGF0YVNpemUgKz0gaW5zZXJ0LmRhdGFTaXplKCk7CisgICAgICAgIGhlYXBTaXplICs9IGluc2VydC51bnNoYXJlZEhlYXBTaXplRXhjbHVkaW5nRGF0YSgpOworICAgICAgICByZXR1cm4gaW5zZXJ0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShDb2x1bW5EYXRhIGV4aXN0aW5nKQorICAgIHsKKyAgICAgICAgZGF0YVNpemUgLT0gZXhpc3RpbmcuZGF0YVNpemUoKTsKKyAgICAgICAgaGVhcFNpemUgLT0gZXhpc3RpbmcudW5zaGFyZWRIZWFwU2l6ZUV4Y2x1ZGluZ0RhdGEoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkFsbG9jYXRlZE9uSGVhcChsb25nIGhlYXBTaXplKQorICAgIHsKKyAgICAgICAgdGhpcy5oZWFwU2l6ZSArPSBoZWFwU2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXBvcnRBbGxvY2F0ZWRNZW1vcnkoKQorICAgIHsKKyAgICAgICAgYWxsb2NhdG9yLm9uSGVhcCgpLmFkanVzdChoZWFwU2l6ZSwgd3JpdGVPcCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9DYWNoZWRCVHJlZVBhcnRpdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9DYWNoZWRCVHJlZVBhcnRpdGlvbi5qYXZhCmluZGV4IDIxODNhOTguLmYwOWY3NWEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvQ2FjaGVkQlRyZWVQYXJ0aXRpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0NhY2hlZEJUcmVlUGFydGl0aW9uLmphdmEKQEAgLTQwLDcgKzQwLDcgQEAKIAogICAgIHByaXZhdGUgQ2FjaGVkQlRyZWVQYXJ0aXRpb24oVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb2xkZXIgaG9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlRyZWVQYXJ0aXRpb25EYXRhIGhvbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjcmVhdGVkQXRJblNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWNoZWRMaXZlUm93cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dzV2l0aE5vbkV4cGlyaW5nQ2VsbHMpCkBAIC04MCw3ICs4MCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDYWNoZWRCVHJlZVBhcnRpdGlvbiBjcmVhdGUoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yLCBpbnQgaW5pdGlhbFJvd0NhcGFjaXR5LCBpbnQgbm93SW5TZWMpCiAgICAgewotICAgICAgICBIb2xkZXIgaG9sZGVyID0gSW1tdXRhYmxlQlRyZWVQYXJ0aXRpb24uYnVpbGQoaXRlcmF0b3IsIGluaXRpYWxSb3dDYXBhY2l0eSk7CisgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXIgPSBJbW11dGFibGVCVHJlZVBhcnRpdGlvbi5idWlsZChpdGVyYXRvciwgaW5pdGlhbFJvd0NhcGFjaXR5KTsKIAogICAgICAgICBpbnQgY2FjaGVkTGl2ZVJvd3MgPSAwOwogICAgICAgICBpbnQgcm93c1dpdGhOb25FeHBpcmluZ0NlbGxzID0gMDsKQEAgLTE4MCw3ICsxODAsNyBAQAogICAgICAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yU2VyaWFsaXplci5IZWFkZXIgaGVhZGVyID0gVW5maWx0ZXJlZFJvd0l0ZXJhdG9yU2VyaWFsaXplci5zZXJpYWxpemVyLmRlc2VyaWFsaXplSGVhZGVyKG1ldGFkYXRhLCBudWxsLCBpbiwgdmVyc2lvbiwgRGVzZXJpYWxpemF0aW9uSGVscGVyLkZsYWcuTE9DQUwpOwogICAgICAgICAgICAgYXNzZXJ0ICFoZWFkZXIuaXNSZXZlcnNlZCAmJiBoZWFkZXIucm93RXN0aW1hdGUgPj0gMDsKIAotICAgICAgICAgICAgSG9sZGVyIGhvbGRlcjsKKyAgICAgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXI7CiAgICAgICAgICAgICB0cnkgKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24gPSBVbmZpbHRlcmVkUm93SXRlcmF0b3JTZXJpYWxpemVyLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24sIG1ldGFkYXRhLCBEZXNlcmlhbGl6YXRpb25IZWxwZXIuRmxhZy5MT0NBTCwgaGVhZGVyKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBob2xkZXIgPSBJbW11dGFibGVCVHJlZVBhcnRpdGlvbi5idWlsZChwYXJ0aXRpb24sIGhlYWRlci5yb3dFc3RpbWF0ZSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0ltbXV0YWJsZUJUcmVlUGFydGl0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0ltbXV0YWJsZUJUcmVlUGFydGl0aW9uLmphdmEKaW5kZXggNTEzOWQ0MC4uNjYxNzI1NSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9JbW11dGFibGVCVHJlZVBhcnRpdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvSW1tdXRhYmxlQlRyZWVQYXJ0aXRpb24uamF2YQpAQCAtMjcsNyArMjcsNyBAQAogcHVibGljIGNsYXNzIEltbXV0YWJsZUJUcmVlUGFydGl0aW9uIGV4dGVuZHMgQWJzdHJhY3RCVHJlZVBhcnRpdGlvbgogewogCi0gICAgcHJvdGVjdGVkIGZpbmFsIEhvbGRlciBob2xkZXI7CisgICAgcHJvdGVjdGVkIGZpbmFsIEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXI7CiAgICAgcHJvdGVjdGVkIGZpbmFsIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGE7CiAKICAgICBwdWJsaWMgSW1tdXRhYmxlQlRyZWVQYXJ0aXRpb24oVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKQEAgLTQwLDEyICs0MCwxMiBAQAogICAgIHsKICAgICAgICAgc3VwZXIocGFydGl0aW9uS2V5KTsKICAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB0aGlzLmhvbGRlciA9IG5ldyBIb2xkZXIoY29sdW1ucywgdHJlZSwgZGVsZXRpb25JbmZvLCBzdGF0aWNSb3csIHN0YXRzKTsKKyAgICAgICAgdGhpcy5ob2xkZXIgPSBuZXcgQlRyZWVQYXJ0aXRpb25EYXRhKGNvbHVtbnMsIHRyZWUsIGRlbGV0aW9uSW5mbywgc3RhdGljUm93LCBzdGF0cyk7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIEltbXV0YWJsZUJUcmVlUGFydGl0aW9uKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvbGRlciBob2xkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXIpCiAgICAgewogICAgICAgICBzdXBlcihwYXJ0aXRpb25LZXkpOwogICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7CkBAIC0xMTksNyArMTE5LDcgQEAKICAgICAgICAgcmV0dXJuIG1ldGFkYXRhOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBIb2xkZXIgaG9sZGVyKCkKKyAgICBwcm90ZWN0ZWQgQlRyZWVQYXJ0aXRpb25EYXRhIGhvbGRlcigpCiAgICAgewogICAgICAgICByZXR1cm4gaG9sZGVyOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvUGFydGl0aW9uU3RhdGlzdGljc0NvbGxlY3Rvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9QYXJ0aXRpb25TdGF0aXN0aWNzQ29sbGVjdG9yLmphdmEKaW5kZXggNmQzNzY0MC4uN2MzYmExNSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9QYXJ0aXRpb25TdGF0aXN0aWNzQ29sbGVjdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9QYXJ0aXRpb25TdGF0aXN0aWNzQ29sbGVjdG9yLmphdmEKQEAgLTIyLDkgKzIyLDEwIEBACiAKIHB1YmxpYyBpbnRlcmZhY2UgUGFydGl0aW9uU3RhdGlzdGljc0NvbGxlY3RvcgogewotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShMaXZlbmVzc0luZm8gaW5mbyk7Ci0gICAgcHVibGljIHZvaWQgdXBkYXRlKERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUpOwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShDZWxsPD8+IGNlbGwpOwotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNvbHVtblNldFBlclJvdyhsb25nIGNvbHVtblNldEluUm93KTsKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVIYXNMZWdhY3lDb3VudGVyU2hhcmRzKGJvb2xlYW4gaGFzTGVnYWN5Q291bnRlclNoYXJkcyk7Ci19CisgICAgdm9pZCB1cGRhdGUoTGl2ZW5lc3NJbmZvIGluZm8pOworICAgIHZvaWQgdXBkYXRlUGFydGl0aW9uRGVsZXRpb24oRGVsZXRpb25UaW1lIGR0KTsKKyAgICB2b2lkIHVwZGF0ZShEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKTsKKyAgICB2b2lkIHVwZGF0ZShDZWxsPD8+IGNlbGwpOworICAgIHZvaWQgdXBkYXRlQ29sdW1uU2V0UGVyUm93KGxvbmcgY29sdW1uU2V0SW5Sb3cpOworICAgIHZvaWQgdXBkYXRlSGFzTGVnYWN5Q291bnRlclNoYXJkcyhib29sZWFuIGhhc0xlZ2FjeUNvdW50ZXJTaGFyZHMpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvUGFydGl0aW9uVXBkYXRlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL1BhcnRpdGlvblVwZGF0ZS5qYXZhCmluZGV4IDYwMTlkNTYuLjdmMmNhN2QgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3BhcnRpdGlvbnMvUGFydGl0aW9uVXBkYXRlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9QYXJ0aXRpb25VcGRhdGUuamF2YQpAQCAtMzYsNyArMzYsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5JbmRleFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7CkBAIC02Nyw3ICs3MCw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFBhcnRpdGlvblVwZGF0ZVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBQYXJ0aXRpb25VcGRhdGVTZXJpYWxpemVyKCk7CiAKLSAgICBwcml2YXRlIGZpbmFsIEhvbGRlciBob2xkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyOwogICAgIHByaXZhdGUgZmluYWwgRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbzsKICAgICBwcml2YXRlIGZpbmFsIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGE7CiAKQEAgLTc1LDcgKzc4LDcgQEAKIAogICAgIHByaXZhdGUgUGFydGl0aW9uVXBkYXRlKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb2xkZXIgaG9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0YWJsZURlbGV0aW9uSW5mbyBkZWxldGlvbkluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjYW5IYXZlU2hhZG93ZWREYXRhKQogICAgIHsKQEAgLTk3LDcgKzEwMCw3IEBACiAgICAgcHVibGljIHN0YXRpYyBQYXJ0aXRpb25VcGRhdGUgZW1wdHlVcGRhdGUoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgRGVjb3JhdGVkS2V5IGtleSkKICAgICB7CiAgICAgICAgIE11dGFibGVEZWxldGlvbkluZm8gZGVsZXRpb25JbmZvID0gTXV0YWJsZURlbGV0aW9uSW5mby5saXZlKCk7Ci0gICAgICAgIEhvbGRlciBob2xkZXIgPSBuZXcgSG9sZGVyKFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zLk5PTkUsIEJUcmVlLmVtcHR5KCksIGRlbGV0aW9uSW5mbywgUm93cy5FTVBUWV9TVEFUSUNfUk9XLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKKyAgICAgICAgQlRyZWVQYXJ0aXRpb25EYXRhIGhvbGRlciA9IG5ldyBCVHJlZVBhcnRpdGlvbkRhdGEoUmVndWxhckFuZFN0YXRpY0NvbHVtbnMuTk9ORSwgQlRyZWUuZW1wdHkoKSwgZGVsZXRpb25JbmZvLCBSb3dzLkVNUFRZX1NUQVRJQ19ST1csIEVuY29kaW5nU3RhdHMuTk9fU1RBVFMpOwogICAgICAgICByZXR1cm4gbmV3IFBhcnRpdGlvblVwZGF0ZShtZXRhZGF0YSwga2V5LCBob2xkZXIsIGRlbGV0aW9uSW5mbywgZmFsc2UpOwogICAgIH0KIApAQCAtMTE0LDcgKzExNyw3IEBACiAgICAgcHVibGljIHN0YXRpYyBQYXJ0aXRpb25VcGRhdGUgZnVsbFBhcnRpdGlvbkRlbGV0ZShUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBEZWNvcmF0ZWRLZXkga2V5LCBsb25nIHRpbWVzdGFtcCwgaW50IG5vd0luU2VjKQogICAgIHsKICAgICAgICAgTXV0YWJsZURlbGV0aW9uSW5mbyBkZWxldGlvbkluZm8gPSBuZXcgTXV0YWJsZURlbGV0aW9uSW5mbyh0aW1lc3RhbXAsIG5vd0luU2VjKTsKLSAgICAgICAgSG9sZGVyIGhvbGRlciA9IG5ldyBIb2xkZXIoUmVndWxhckFuZFN0YXRpY0NvbHVtbnMuTk9ORSwgQlRyZWUuZW1wdHkoKSwgZGVsZXRpb25JbmZvLCBSb3dzLkVNUFRZX1NUQVRJQ19ST1csIEVuY29kaW5nU3RhdHMuTk9fU1RBVFMpOworICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyID0gbmV3IEJUcmVlUGFydGl0aW9uRGF0YShSZWd1bGFyQW5kU3RhdGljQ29sdW1ucy5OT05FLCBCVHJlZS5lbXB0eSgpLCBkZWxldGlvbkluZm8sIFJvd3MuRU1QVFlfU1RBVElDX1JPVywgRW5jb2RpbmdTdGF0cy5OT19TVEFUUyk7CiAgICAgICAgIHJldHVybiBuZXcgUGFydGl0aW9uVXBkYXRlKG1ldGFkYXRhLCBrZXksIGhvbGRlciwgZGVsZXRpb25JbmZvLCBmYWxzZSk7CiAgICAgfQogCkBAIC0xMzEsNyArMTM0LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIFBhcnRpdGlvblVwZGF0ZSBzaW5nbGVSb3dVcGRhdGUoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgRGVjb3JhdGVkS2V5IGtleSwgUm93IHJvdywgUm93IHN0YXRpY1JvdykKICAgICB7CiAgICAgICAgIE11dGFibGVEZWxldGlvbkluZm8gZGVsZXRpb25JbmZvID0gTXV0YWJsZURlbGV0aW9uSW5mby5saXZlKCk7Ci0gICAgICAgIEhvbGRlciBob2xkZXIgPSBuZXcgSG9sZGVyKAorICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyID0gbmV3IEJUcmVlUGFydGl0aW9uRGF0YSgKICAgICAgICAgICAgIG5ldyBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucygKICAgICAgICAgICAgICAgICBzdGF0aWNSb3cgPT0gbnVsbCA/IENvbHVtbnMuTk9ORSA6IENvbHVtbnMuZnJvbShzdGF0aWNSb3cpLAogICAgICAgICAgICAgICAgIHJvdyA9PSBudWxsID8gQ29sdW1ucy5OT05FIDogQ29sdW1ucy5mcm9tKHJvdykKQEAgLTE4Nyw3ICsxOTAsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgUGFydGl0aW9uVXBkYXRlIGZyb21JdGVyYXRvcihVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IsIENvbHVtbkZpbHRlciBmaWx0ZXIpCiAgICAgewogICAgICAgICBpdGVyYXRvciA9IFVuZmlsdGVyZWRSb3dJdGVyYXRvcnMud2l0aE9ubHlRdWVyaWVkRGF0YShpdGVyYXRvciwgZmlsdGVyKTsKLSAgICAgICAgSG9sZGVyIGhvbGRlciA9IGJ1aWxkKGl0ZXJhdG9yLCAxNik7CisgICAgICAgIEJUcmVlUGFydGl0aW9uRGF0YSBob2xkZXIgPSBidWlsZChpdGVyYXRvciwgMTYpOwogICAgICAgICBNdXRhYmxlRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbyA9IChNdXRhYmxlRGVsZXRpb25JbmZvKSBob2xkZXIuZGVsZXRpb25JbmZvOwogICAgICAgICByZXR1cm4gbmV3IFBhcnRpdGlvblVwZGF0ZShpdGVyYXRvci5tZXRhZGF0YSgpLCBpdGVyYXRvci5wYXJ0aXRpb25LZXkoKSwgaG9sZGVyLCBkZWxldGlvbkluZm8sIGZhbHNlKTsKICAgICB9CkBAIC0yMDgsNyArMjExLDcgQEAKICAgICB7CiAgICAgICAgIGl0ZXJhdG9yID0gUm93SXRlcmF0b3JzLndpdGhPbmx5UXVlcmllZERhdGEoaXRlcmF0b3IsIGZpbHRlcik7CiAgICAgICAgIE11dGFibGVEZWxldGlvbkluZm8gZGVsZXRpb25JbmZvID0gTXV0YWJsZURlbGV0aW9uSW5mby5saXZlKCk7Ci0gICAgICAgIEhvbGRlciBob2xkZXIgPSBidWlsZChpdGVyYXRvciwgZGVsZXRpb25JbmZvLCB0cnVlKTsKKyAgICAgICAgQlRyZWVQYXJ0aXRpb25EYXRhIGhvbGRlciA9IGJ1aWxkKGl0ZXJhdG9yLCBkZWxldGlvbkluZm8sIHRydWUpOwogICAgICAgICByZXR1cm4gbmV3IFBhcnRpdGlvblVwZGF0ZShpdGVyYXRvci5tZXRhZGF0YSgpLCBpdGVyYXRvci5wYXJ0aXRpb25LZXkoKSwgaG9sZGVyLCBkZWxldGlvbkluZm8sIGZhbHNlKTsKICAgICB9CiAKQEAgLTM3Myw3ICszNzYsNyBAQAogICAgICAgICByZXR1cm4gaG9sZGVyLmNvbHVtbnM7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIEhvbGRlciBob2xkZXIoKQorICAgIHByb3RlY3RlZCBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyKCkKICAgICB7CiAgICAgICAgIHJldHVybiBob2xkZXI7CiAgICAgfQpAQCAtNDYzLDYgKzQ2Niw2MiBAQAogICAgICAgICByZXR1cm4gbWFya3M7CiAgICAgfQogCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9mIHJvd3MgYWZmZWN0ZWQgYnkgdGhpcyBtdXRhdGlvbiAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGFmZmVjdGVkUm93Q291bnQoKQorICAgIHsKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwYXJ0aXRpb24tbGV2ZWwgZGVsZXRpb24sIHdlIGludGVuZCB0byBkZWxldGUgYXQgbGVhc3Qgb25lIHJvdy4KKyAgICAgICAgaWYgKCFwYXJ0aXRpb25MZXZlbERlbGV0aW9uKCkuaXNMaXZlKCkpCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICBpbnQgY291bnQgPSAwOworCisgICAgICAgIC8vIEVhY2ggcmFuZ2UgZGVsZXRlIHNob3VsZCBjb3JyZXNwb25kIHRvIGF0IGxlYXN0IG9uZSBpbnRlbmRlZCByb3cgZGVsZXRpb24uCisgICAgICAgIGlmIChkZWxldGlvbkluZm8oKS5oYXNSYW5nZXMoKSkKKyAgICAgICAgICAgIGNvdW50ICs9IGRlbGV0aW9uSW5mbygpLnJhbmdlQ291bnQoKTsKKworICAgICAgICBjb3VudCArPSByb3dDb3VudCgpOworCisgICAgICAgIGlmICghc3RhdGljUm93KCkuaXNFbXB0eSgpKQorICAgICAgICAgICAgY291bnQrKzsKKworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBlc3RpbWF0ZWQgdG90YWwgbnVtYmVyIG9mIGNvbHVtbnMgdGhhdCBlaXRoZXIgaGF2ZSBsaXZlIGRhdGEgb3IgYXJlIGNvdmVyZWQgYnkgYSBkZWxldGUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGFmZmVjdGVkQ29sdW1uQ291bnQoKQorICAgIHsKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwYXJ0aXRpb24tbGV2ZWwgZGVsZXRpb24sIHdlIGludGVuZCB0byBkZWxldGUgYXQgbGVhc3QgdGhlIGNvbHVtbnMgb2Ygb25lIHJvdy4KKyAgICAgICAgaWYgKCFwYXJ0aXRpb25MZXZlbERlbGV0aW9uKCkuaXNMaXZlKCkpCisgICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEoKS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLnNpemUoKTsKKworICAgICAgICBpbnQgY291bnQgPSAwOworCisgICAgICAgIC8vIEVhY2ggcmFuZ2UgZGVsZXRlIHNob3VsZCBjb3JyZXNwb25kIHRvIGF0IGxlYXN0IG9uZSBpbnRlbmRlZCByb3cgZGVsZXRpb24sIGFuZCB3aXRoIGl0LCBpdHMgcmVndWxhciBjb2x1bW5zLgorICAgICAgICBpZiAoZGVsZXRpb25JbmZvKCkuaGFzUmFuZ2VzKCkpCisgICAgICAgICAgICBjb3VudCArPSBkZWxldGlvbkluZm8oKS5yYW5nZUNvdW50KCkgKiBtZXRhZGF0YSgpLnJlZ3VsYXJDb2x1bW5zKCkuc2l6ZSgpOworCisgICAgICAgIGZvciAoUm93IHJvdyA6IHRoaXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyb3cuZGVsZXRpb24oKS5pc0xpdmUoKSkKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcm93IGlzIGxpdmUsIHRoaXMgd2lsbCBpbmNsdWRlIHNpbXBsZSB0b21ic3RvbmVzIGFzIHdlbGwgYXMgY2VsbHMgdy8gYWN0dWFsIGRhdGEuIAorICAgICAgICAgICAgICAgIGNvdW50ICs9IHJvdy5jb2x1bW5Db3VudCgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSByb3cgZGVsZXRpb24sIHNvIGFjY291bnQgZm9yIHRoZSBjb2x1bW5zIHRoYXQgbWlnaHQgYmUgZGVsZXRlZC4KKyAgICAgICAgICAgICAgICBjb3VudCArPSBtZXRhZGF0YSgpLnJlZ3VsYXJDb2x1bW5zKCkuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdGF0aWNSb3coKS5pc0VtcHR5KCkpCisgICAgICAgICAgICBjb3VudCArPSBzdGF0aWNSb3coKS5jb2x1bW5Db3VudCgpOworCisgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE1hcmtzRm9yUm93KFJvdyByb3csIExpc3Q8Q291bnRlck1hcms+IG1hcmtzKQogICAgIHsKICAgICAgICAgZm9yIChDZWxsPD8+IGNlbGwgOiByb3cuY2VsbHMoKSkKQEAgLTQ5NCw3ICs1NTMsNyBAQAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIHB1YmxpYyBzdGF0aWMgUGFydGl0aW9uVXBkYXRlIHVuc2FmZUNvbnN0cnVjdChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb2xkZXIgaG9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEgaG9sZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRhYmxlRGVsZXRpb25JbmZvIGRlbGV0aW9uSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjYW5IYXZlU2hhZG93ZWREYXRhKQogICAgIHsKQEAgLTY5MCw3ICs3NDksNyBAQAogICAgICAgICAgICAgTXV0YWJsZURlbGV0aW9uSW5mbyBkZWxldGlvbkluZm8gPSBkZWxldGlvbkJ1aWxkZXIuYnVpbGQoKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgUGFydGl0aW9uVXBkYXRlKG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIb2xkZXIoaGVhZGVyLnNIZWFkZXIuY29sdW1ucygpLCByb3dzLCBkZWxldGlvbkluZm8sIGhlYWRlci5zdGF0aWNSb3csIGhlYWRlci5zSGVhZGVyLnN0YXRzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJUcmVlUGFydGl0aW9uRGF0YShoZWFkZXIuc0hlYWRlci5jb2x1bW5zKCksIHJvd3MsIGRlbGV0aW9uSW5mbywgaGVhZGVyLnN0YXRpY1JvdywgaGVhZGVyLnNIZWFkZXIuc3RhdHMoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGlvbkluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgICAgIH0KQEAgLTcwMiw3ICs3NjEsNyBAQAogICAgICAgICAgICAgaWYgKHBvc2l0aW9uID49IGluLmxpbWl0KCkpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigpOwogICAgICAgICAgICAgLy8gRGVjb3JhdGVkS2V5IGtleSA9IG1ldGFkYXRhLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoVkludExlbmd0aChpbikpOwotICAgICAgICAgICAgaW50IGtleUxlbmd0aCA9IChpbnQpIFZJbnRDb2RpbmcuZ2V0VW5zaWduZWRWSW50KGluLCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQga2V5TGVuZ3RoID0gVkludENvZGluZy5nZXRVbnNpZ25lZFZJbnQzMihpbiwgcG9zaXRpb24pOwogICAgICAgICAgICAgcG9zaXRpb24gKz0ga2V5TGVuZ3RoICsgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZShrZXlMZW5ndGgpOwogICAgICAgICAgICAgaWYgKHBvc2l0aW9uID49IGluLmxpbWl0KCkpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigpOwpAQCAtODAwLDcgKzg1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0aWFsUm93Q2FwYWNpdHksCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FuSGF2ZVNoYWRvd2VkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgSG9sZGVyIGhvbGRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgQlRyZWVQYXJ0aXRpb25EYXRhIGhvbGRlcikKICAgICAgICAgewogICAgICAgICAgICAgdGhpcyhtZXRhZGF0YSwga2V5LCBjb2x1bW5zLCBpbml0aWFsUm93Q2FwYWNpdHksIGNhbkhhdmVTaGFkb3dlZERhdGEsIGhvbGRlci5zdGF0aWNSb3csIGhvbGRlci5kZWxldGlvbkluZm8sIGhvbGRlci50cmVlKTsKICAgICAgICAgfQpAQCAtOTA5LDExICs5NjgsMTEgQEAKICAgICAgICAgICAgIGlzQnVpbHQgPSB0cnVlOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25VcGRhdGUobWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25LZXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIb2xkZXIoY29sdW1ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGlvbkluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY1JvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJUcmVlUGFydGl0aW9uRGF0YShjb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0aW9uSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljUm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGlvbkluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5IYXZlU2hhZG93ZWREYXRhKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9QdXJnZUZ1bmN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL1B1cmdlRnVuY3Rpb24uamF2YQppbmRleCAwOWYzYWUzLi41ZDk3ZmQzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL1B1cmdlRnVuY3Rpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL1B1cmdlRnVuY3Rpb24uamF2YQpAQCAtMzEsMTMgKzMxLDE1IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGVuZm9yY2VTdHJpY3RMaXZlbmVzczsKICAgICBwcml2YXRlIGJvb2xlYW4gaXNSZXZlcnNlT3JkZXI7CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlR2NHcmFjZVNlY29uZHM7CisKICAgICBwdWJsaWMgUHVyZ2VGdW5jdGlvbihpbnQgbm93SW5TZWMsIGludCBnY0JlZm9yZSwgaW50IG9sZGVzdFVucmVwYWlyZWRUb21ic3RvbmUsIGJvb2xlYW4gb25seVB1cmdlUmVwYWlyZWRUb21ic3RvbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZW5mb3JjZVN0cmljdExpdmVuZXNzKQogICAgIHsKICAgICAgICAgdGhpcy5ub3dJblNlYyA9IG5vd0luU2VjOwogICAgICAgICB0aGlzLnB1cmdlciA9ICh0aW1lc3RhbXAsIGxvY2FsRGVsZXRpb25UaW1lKSAtPgogICAgICAgICAgICAgICAgICAgICAgICEob25seVB1cmdlUmVwYWlyZWRUb21ic3RvbmVzICYmIGxvY2FsRGVsZXRpb25UaW1lID49IG9sZGVzdFVucmVwYWlyZWRUb21ic3RvbmUpCi0gICAgICAgICAgICAgICAgICAgICAgJiYgbG9jYWxEZWxldGlvblRpbWUgPCBnY0JlZm9yZQorICAgICAgICAgICAgICAgICAgICAgICYmIChsb2NhbERlbGV0aW9uVGltZSA8IGdjQmVmb3JlIHx8IGlnbm9yZUdjR3JhY2VTZWNvbmRzKQogICAgICAgICAgICAgICAgICAgICAgICYmIGdldFB1cmdlRXZhbHVhdG9yKCkudGVzdCh0aW1lc3RhbXApOwogICAgICAgICB0aGlzLmVuZm9yY2VTdHJpY3RMaXZlbmVzcyA9IGVuZm9yY2VTdHJpY3RMaXZlbmVzczsKICAgICB9CkBAIC01OSw2ICs2MSwxMyBAQAogICAgIHsKICAgICB9CiAKKyAgICAvLyBDYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIG5ldyBwYXJ0aXRpb24KKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudCBwYXJ0aXRpb25LZXkgaWdub3JlcyB0aGUgZ2NfZ3JhY2Vfc2Vjb25kcyBkdXJpbmcgY29tcGFjdGlvbi4KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRJZ25vcmVHY0dyYWNlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSZXZlcnNlT3JkZXIoYm9vbGVhbiBpc1JldmVyc2VPcmRlcikKICAgICB7CiAgICAgICAgIHRoaXMuaXNSZXZlcnNlT3JkZXIgPSBpc1JldmVyc2VPcmRlcjsKQEAgLTcwLDYgKzc5LDggQEAKICAgICB7CiAgICAgICAgIG9uTmV3UGFydGl0aW9uKHBhcnRpdGlvbi5wYXJ0aXRpb25LZXkoKSk7CiAKKyAgICAgICAgaWdub3JlR2NHcmFjZVNlY29uZHMgPSBzaG91bGRJZ25vcmVHY0dyYWNlKCk7CisKICAgICAgICAgc2V0UmV2ZXJzZU9yZGVyKHBhcnRpdGlvbi5pc1JldmVyc2VPcmRlcigpKTsKICAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHB1cmdlZCA9IFRyYW5zZm9ybWF0aW9uLmFwcGx5KHBhcnRpdGlvbiwgdGhpcyk7CiAgICAgICAgIGlmIChwdXJnZWQuaXNFbXB0eSgpKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3JzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL1VuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcnMuamF2YQppbmRleCBhMDUxZWUxLi4wMmZkZGUwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL1VuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcnMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL1VuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcnMuamF2YQpAQCAtMzg2LDQgKzM4Niw0IEBACiAgICAgICAgICAgICB9OwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3JlcGFpci9QZW5kaW5nQW50aUNvbXBhY3Rpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3JlcGFpci9QZW5kaW5nQW50aUNvbXBhY3Rpb24uamF2YQppbmRleCBhZjk4ODhhLi41NTEzOGU4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yZXBhaXIvUGVuZGluZ0FudGlDb21wYWN0aW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcmVwYWlyL1BlbmRpbmdBbnRpQ29tcGFjdGlvbi5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkZ1dHVyZVRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkZ1dHVyZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkZ1dHVyZUNvbWJpbmVyOwpAQCAtNjcsOCArNjgsOCBAQAogcHVibGljIGNsYXNzIFBlbmRpbmdBbnRpQ29tcGFjdGlvbgogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQZW5kaW5nQW50aUNvbXBhY3Rpb24uY2xhc3MpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1FVSVJFX1NMRUVQX01TID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEuYWNxdWlyZV9zbGVlcF9tcyIsIDEwMDApOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBQ1FVSVJFX1JFVFJZX1NFQ09ORFMgPSBJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS5hY3F1aXJlX3JldHJ5X3NlY29uZHMiLCA2MCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFDUVVJUkVfU0xFRVBfTVMgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQUNRVUlSRV9TTEVFUF9NUy5nZXRJbnQoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNRVUlSRV9SRVRSWV9TRUNPTkRTID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFDUVVJUkVfUkVUUllfU0VDT05EUy5nZXRJbnQoKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWNxdWlyZVJlc3VsdAogICAgIHsKQEAgLTIxNCw2ICsyMTUsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKKyAgICAgICAgcHJvdGVjdGVkIEFjcXVpcmVSZXN1bHQgYWNxdWlyZVNTVGFibGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNmcy5ydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZCh0aGlzOjphY3F1aXJlVHVwbGUsIHByZWRpY2F0ZSwgT3BlcmF0aW9uVHlwZS5BTlRJQ09NUEFDVElPTiwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgQWNxdWlyZVJlc3VsdCBjYWxsKCkKICAgICAgICAgewogICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJhY3F1aXJpbmcgc3N0YWJsZXMgZm9yIHBlbmRpbmcgYW50aSBjb21wYWN0aW9uIG9uIHNlc3Npb24ge30iLCBzZXNzaW9uSUQpOwpAQCAtMjMxLDcgKzIzNyw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgYW50aWNvbXBhY3Rpb25zIGFyZSBub3QgZGlzYWJsZWQgd2hlbiBydW5uaW5nIHRoaXMuIFRoaXMgaXMgc2FmZSBzaW5jZSBydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZAogICAgICAgICAgICAgICAgICAgICAvLyBpcyBzeW5jaHJvbml6ZWQgLSBhY3F1aXJlVHVwbGUgYW5kIHByZWRpY2F0ZSBjYW4gb25seSBiZSBydW4gYnkgYSBzaW5nbGUgdGhyZWFkIChmb3IgdGhlIGdpdmVuIGNmcykuCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjZnMucnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQodGhpczo6YWNxdWlyZVR1cGxlLCBwcmVkaWNhdGUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNxdWlyZVNTVGFibGVzKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChTU1RhYmxlQWNxdWlzaXRpb25FeGNlcHRpb24gZSkKICAgICAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL0FydGlmaWNpYWxCb3VuZE1hcmtlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9BcnRpZmljaWFsQm91bmRNYXJrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDZlMzlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9BcnRpZmljaWFsQm91bmRNYXJrZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdCb3VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CisKK3B1YmxpYyBjbGFzcyBBcnRpZmljaWFsQm91bmRNYXJrZXIgZXh0ZW5kcyBSYW5nZVRvbWJzdG9uZUJvdW5kTWFya2VyCit7CisgICAgcHVibGljIEFydGlmaWNpYWxCb3VuZE1hcmtlcihDbHVzdGVyaW5nQm91bmQ8Pz4gYm91bmQpCisgICAgeworICAgICAgICBzdXBlcihib3VuZCwgRGVsZXRpb25UaW1lLkxJVkUpOworICAgICAgICBhc3NlcnQgYm91bmQuaXNBcnRpZmljaWFsKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICh0aGlzID09IG90aGVyKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBBcnRpZmljaWFsQm91bmRNYXJrZXIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIEFydGlmaWNpYWxCb3VuZE1hcmtlciB0aGF0ID0gKEFydGlmaWNpYWxCb3VuZE1hcmtlcikgb3RoZXI7CisgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFscyhib3VuZCwgdGhhdC5ib3VuZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpCisgICAgeworICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKGJvdW5kKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiTG93ZXJCb3VuZE1hcmtlciAlcyIsIGJvdW5kLnRvU3RyaW5nKG1ldGFkYXRhKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvRW5jb2RpbmdTdGF0cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9FbmNvZGluZ1N0YXRzLmphdmEKaW5kZXggMzdkZDM0ZS4uYTI5Y2U4ZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9FbmNvZGluZ1N0YXRzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9FbmNvZGluZ1N0YXRzLmphdmEKQEAgLTY3LDcgKzY3LDcgQEAKIAogICAgIC8vIFdlIHNob3VsZCB1c2UgdGhpcyBzcGFyaW5nbHkgb2J2aW91c2x5CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbmNvZGluZ1N0YXRzIE5PX1NUQVRTID0gbmV3IEVuY29kaW5nU3RhdHMoVElNRVNUQU1QX0VQT0NILCBERUxFVElPTl9USU1FX0VQT0NILCBUVExfRVBPQ0gpOwotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBIRUFQX1NJWkUgPSBPYmplY3RTaXplcy5tZWFzdXJlKE5PX1NUQVRTKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgSEVBUF9TSVpFID0gT2JqZWN0U2l6ZXMubWVhc3VyZShOT19TVEFUUyk7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBTZXJpYWxpemVyKCk7CiAKQEAgLTIxNSw2ICsyMTUsMTIgQEAKICAgICAgICAgICAgIHVwZGF0ZUxvY2FsRGVsZXRpb25UaW1lKGRlbGV0aW9uVGltZS5sb2NhbERlbGV0aW9uVGltZSgpKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVQYXJ0aXRpb25EZWxldGlvbihEZWxldGlvblRpbWUgZHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVwZGF0ZShkdCk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVUaW1lc3RhbXAobG9uZyB0aW1lc3RhbXApCiAgICAgICAgIHsKICAgICAgICAgICAgIGlzVGltZXN0YW1wU2V0ID0gdHJ1ZTsKQEAgLTI2Niw4ICsyNzIsOCBAQAogICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoRW5jb2RpbmdTdGF0cyBzdGF0cywgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHN0YXRzLm1pblRpbWVzdGFtcCAtIFRJTUVTVEFNUF9FUE9DSCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoc3RhdHMubWluTG9jYWxEZWxldGlvblRpbWUgLSBERUxFVElPTl9USU1FX0VQT0NIKTsKLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChzdGF0cy5taW5UVEwgLSBUVExfRVBPQ0gpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoc3RhdHMubWluTG9jYWxEZWxldGlvblRpbWUgLSBERUxFVElPTl9USU1FX0VQT0NIKTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHN0YXRzLm1pblRUTCAtIFRUTF9FUE9DSCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgaW50IHNlcmlhbGl6ZWRTaXplKEVuY29kaW5nU3RhdHMgc3RhdHMpCkBAIC0yODAsOSArMjg2LDkgQEAKICAgICAgICAgcHVibGljIEVuY29kaW5nU3RhdHMgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIGxvbmcgbWluVGltZXN0YW1wID0gaW4ucmVhZFVuc2lnbmVkVkludCgpICsgVElNRVNUQU1QX0VQT0NIOwotICAgICAgICAgICAgaW50IG1pbkxvY2FsRGVsZXRpb25UaW1lID0gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCkgKyBERUxFVElPTl9USU1FX0VQT0NIOwotICAgICAgICAgICAgaW50IG1pblRUTCA9IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpICsgVFRMX0VQT0NIOworICAgICAgICAgICAgaW50IG1pbkxvY2FsRGVsZXRpb25UaW1lID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCkgKyBERUxFVElPTl9USU1FX0VQT0NIOworICAgICAgICAgICAgaW50IG1pblRUTCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpICsgVFRMX0VQT0NIOwogICAgICAgICAgICAgcmV0dXJuIG5ldyBFbmNvZGluZ1N0YXRzKG1pblRpbWVzdGFtcCwgbWluTG9jYWxEZWxldGlvblRpbWUsIG1pblRUTCk7CiAgICAgICAgIH0KICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9MYXppbHlJbml0aWFsaXplZFVuZmlsdGVyZWRSb3dJdGVyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9MYXppbHlJbml0aWFsaXplZFVuZmlsdGVyZWRSb3dJdGVyYXRvci5qYXZhCmluZGV4IGQ4YmQzNmYuLjhhOGIyMjkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvTGF6aWx5SW5pdGlhbGl6ZWRVbmZpbHRlcmVkUm93SXRlcmF0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL0xhemlseUluaXRpYWxpemVkVW5maWx0ZXJlZFJvd0l0ZXJhdG9yLmphdmEKQEAgLTE3LDE3ICsxNywxNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3M7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkFic3RyYWN0SXRlcmF0b3I7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwotCiAvKioKLSAqIEFic3RyYWN0IGNsYXNzIHRvIGNyZWF0ZSBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdGhhdCBsYXppbHkgaW5pdGlhbGl6ZSB0aGVtc2VsdmVzLgotICoKKyAqIEFic3RyYWN0IGNsYXNzIHRvIGNyZWF0ZSBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdGhhdCBsYXppbHkgaW5pdGlhbGl6ZXMgaXRzZWxmLgorICogPHA+CiAgKiBUaGlzIGlzIHVzZWQgZHVyaW5nIHBhcnRpdGlvbiByYW5nZSBxdWVyaWVzIHdoZW4gd2Uga25vdyB0aGUgcGFydGl0aW9uIGtleSBidXQgd2FudAotICogdG8gZGVmZXIgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSByZXN0IG9mIHRoZSBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdW50aWwgd2UgbmVlZCB0aG9zZSBpbmZvcm1hdGlvbnMuCi0gKiBTZWUge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdUYWJsZVNjYW5uZXIuS2V5U2Nhbm5pbmdJdGVyYXRvcn0gZm9yIGluc3RhbmNlLgorICogdG8gZGVmZXIgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSByZXN0IG9mIHRoZSBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdW50aWwgd2UgbmVlZCBpdC4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIExhemlseUluaXRpYWxpemVkVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvcjxVbmZpbHRlcmVkPiBpbXBsZW1lbnRzIFVuZmlsdGVyZWRSb3dJdGVyYXRvcgogewpAQCAtNDgsMTEgKzQ4LDYgQEAKICAgICAgICAgICAgIGl0ZXJhdG9yID0gaW5pdGlhbGl6ZUl0ZXJhdG9yKCk7CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yICE9IG51bGw7Ci0gICAgfQotCiAgICAgcHVibGljIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEoKQogICAgIHsKICAgICAgICAgbWF5YmVJbml0KCk7CkBAIC0xMDMsNiArOTgsMTQgQEAKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCiAgICAgewogICAgICAgICBpZiAoaXRlcmF0b3IgIT0gbnVsbCkKKyAgICAgICAgewogICAgICAgICAgICAgaXRlcmF0b3IuY2xvc2UoKTsKKyAgICAgICAgICAgIGl0ZXJhdG9yID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpCisgICAgeworICAgICAgICByZXR1cm4gaXRlcmF0b3IgIT0gbnVsbDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1Jvdy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9Sb3cuamF2YQppbmRleCBiZjhjMDUxLi45ZTgyNzZhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1Jvdy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvUm93LmphdmEKQEAgLTE1MCwxMCArMTUwLDEwIEBACiAgICAgcHVibGljIENvbXBsZXhDb2x1bW5EYXRhIGdldENvbXBsZXhDb2x1bW5EYXRhKENvbHVtbk1ldGFkYXRhIGMpOwogCiAgICAgLyoqCi0gICAgICogVGhlIGRhdGEgZm9yIGEgcmVndWxhciBvciBjb21wbGV4IGNvbHVtbi4KKyAgICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgQ29sdW1uRGF0YX0gZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgogICAgICAqCi0gICAgICogQHBhcmFtIGMgdGhlIGNvbHVtbiBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBjb21wbGV4IGRhdGEuCi0gICAgICogQHJldHVybiB0aGUgZGF0YSBmb3Ige0Bjb2RlIGN9IG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcm93IGhhcyBubyBkYXRhIGZvciB0aGlzIGNvbHVtbi4KKyAgICAgKiBAcGFyYW0gYyB0aGUgY29sdW1uIGZvciB3aGljaCB0byBmZXRjaCB0aGUgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRhIGZvciB0aGUgY29sdW1uIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgcm93IGhhcyBubyBkYXRhIGZvciB0aGlzIGNvbHVtbi4KICAgICAgKi8KICAgICBwdWJsaWMgQ29sdW1uRGF0YSBnZXRDb2x1bW5EYXRhKENvbHVtbk1ldGFkYXRhIGMpOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1Rocm90dGxlZFVuZmlsdGVyZWRJdGVyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9UaHJvdHRsZWRVbmZpbHRlcmVkSXRlcmF0b3IuamF2YQppbmRleCBjYmJhYzY0Li4yNDc0MDg0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1Rocm90dGxlZFVuZmlsdGVyZWRJdGVyYXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVGhyb3R0bGVkVW5maWx0ZXJlZEl0ZXJhdG9yLmphdmEKQEAgLTIxLDEzICsyMSwxMyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5BYnN0cmFjdEl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb3NlYWJsZUl0ZXJhdG9yOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci0KIC8qKgogICogQSB1dGlsaXR5IGNsYXNzIHRvIHNwbGl0IHRoZSBnaXZlbiB7QGxpbmsjVW5maWx0ZXJlZFJvd0l0ZXJhdG9yfSBpbnRvIHNtYWxsZXIgY2h1bmtzIGVhY2gKICAqIGhhdmluZyBhdCBtb3N0IHtAbGluayAjdGhyb3R0bGV9ICsgMSB1bmZpbHRlcmVkcy4KQEAgLTgzLDcgKzgzLDcgQEAKICAgICAgICAgICAgIHJldHVybiB0aHJvdHRsZWRJdHIgPSBvcmlnaW47CiAgICAgICAgIH0KIAotICAgICAgICB0aHJvdHRsZWRJdHIgPSBuZXcgV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3Iob3JpZ2luKQorICAgICAgICB0aHJvdHRsZWRJdHIgPSBuZXcgV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3IoKQogICAgICAgICB7CiAgICAgICAgICAgICBwcml2YXRlIGludCBjb3VudCA9IDA7CiAgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNGaXJzdCA9IHRocm90dGxlZEl0ciA9PSBudWxsOwpAQCAtOTcsOSArOTcsMTUgQEAKICAgICAgICAgICAgIHByaXZhdGUgUmFuZ2VUb21ic3RvbmVNYXJrZXIgY2xvc2VNYXJrZXIgPSBudWxsOwogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3Igd3JhcHBlZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHdpdGhpbkxpbWl0KCkgJiYgd3JhcHBlZC5oYXNOZXh0KCkpIHx8IGNsb3NlTWFya2VyICE9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuICh3aXRoaW5MaW1pdCgpICYmIG9yaWdpbi5oYXNOZXh0KCkpIHx8IGNsb3NlTWFya2VyICE9IG51bGw7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtMTE5LDcgKzEyNSw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG92ZXJmbG93ZWQuaGFzTmV4dCgpKQogICAgICAgICAgICAgICAgICAgICBuZXh0ID0gb3ZlcmZsb3dlZC5uZXh0KCk7CiAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBuZXh0ID0gd3JhcHBlZC5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIG5leHQgPSBvcmlnaW4ubmV4dCgpOwogICAgICAgICAgICAgICAgIHJlY29yZE5leHQobmV4dCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7CiAgICAgICAgICAgICB9CkBAIC0xMzIsOCArMTM4LDggQEAKICAgICAgICAgICAgICAgICAvLyB3aGVuIHJlYWNoIHRocm90dGxlIHdpdGggYSByZW1haW5pbmcgb3Blbk1hcmtlciwgd2UgbmVlZCB0byBjcmVhdGUgY29ycmVzcG9uZGluZyBjbG9zZU1hcmtlci4KICAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gdGhyb3R0bGUgJiYgb3Blbk1hcmtlciAhPSBudWxsKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHdyYXBwZWQuaGFzTmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBjbG9zZU9wZW5NYXJrZXIod3JhcHBlZC5uZXh0KCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgb3JpZ2luLmhhc05leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VPcGVuTWFya2VyKG9yaWdpbi5uZXh0KCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMTkxLDEzICsxOTcsMTMgQEAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uKCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXNGaXJzdCA/IHdyYXBwZWQucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpIDogRGVsZXRpb25UaW1lLkxJVkU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlzRmlyc3QgPyBvcmlnaW4ucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpIDogRGVsZXRpb25UaW1lLkxJVkU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIFJvdyBzdGF0aWNSb3coKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBpc0ZpcnN0ID8gd3JhcHBlZC5zdGF0aWNSb3coKSA6IFJvd3MuRU1QVFlfU1RBVElDX1JPVzsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXNGaXJzdCA/IG9yaWdpbi5zdGF0aWNSb3coKSA6IFJvd3MuRU1QVFlfU1RBVElDX1JPVzsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCkBAIC0yNTgsNCArMjY0LDQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkUm93SXRlcmF0b3JTZXJpYWxpemVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1VuZmlsdGVyZWRSb3dJdGVyYXRvclNlcmlhbGl6ZXIuamF2YQppbmRleCAxMTU0MWVlLi4xYmUzZDU0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1VuZmlsdGVyZWRSb3dJdGVyYXRvclNlcmlhbGl6ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1VuZmlsdGVyZWRSb3dJdGVyYXRvclNlcmlhbGl6ZXIuamF2YQpAQCAtMTcsMTUgKzE3LDIxIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93czsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0Vycm9yOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb247CiAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkVtcHR5SXRlcmF0b3JzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdFBhcnRpdGlvbldyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKQEAgLTYwLDcgKzY2LDcgQEAKICAqCiAgKiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBmb3JtYXQgZGVzY3JpYmVkIGFib3ZlIGlzIHRoZSBvbi13aXJlIGZvcm1hdC4gT24tZGlzaywgdGhlIGZvcm1hdCBpcyBiYXNpY2FsbHkgdGhlCiAgKiBzYW1lLCBidXQgdGhlIGhlYWRlciBpcyB3cml0dGVuIG9uY2UgcGVyIHNzdGFibGUsIG5vdCBvbmNlIHBlci1wYXJ0aXRpb24uIEZ1cnRoZXIsIHRoZSBhY3R1YWwgcm93IGFuZAotICogcmFuZ2UgdG9tYnN0b25lcyBhcmUgbm90IHdyaXR0ZW4gdXNpbmcgdGhpcyBjbGFzcywgYnV0IHJhdGhlciBieSB7QGxpbmsgQ29sdW1uSW5kZXh9LgorICogcmFuZ2UgdG9tYnN0b25lcyBhcmUgbm90IHdyaXR0ZW4gdXNpbmcgdGhpcyBjbGFzcywgYnV0IHJhdGhlciBieSB7QGxpbmsgQmlnRm9ybWF0UGFydGl0aW9uV3JpdGVyfS4KICAqLwogcHVibGljIGNsYXNzIFVuZmlsdGVyZWRSb3dJdGVyYXRvclNlcmlhbGl6ZXIKIHsKQEAgLTE0MCw3ICsxNDYsNyBAQAogICAgICAgICAgICAgVW5maWx0ZXJlZFNlcmlhbGl6ZXIuc2VyaWFsaXplci5zZXJpYWxpemUoc3RhdGljUm93LCBoZWxwZXIsIG91dCwgdmVyc2lvbik7CiAKICAgICAgICAgaWYgKHJvd0VzdGltYXRlID49IDApCi0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocm93RXN0aW1hdGUpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIocm93RXN0aW1hdGUpOwogCiAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCiAgICAgICAgICAgICBVbmZpbHRlcmVkU2VyaWFsaXplci5zZXJpYWxpemVyLnNlcmlhbGl6ZShpdGVyYXRvci5uZXh0KCksIGhlbHBlciwgb3V0LCB2ZXJzaW9uKTsKQEAgLTIxMSw3ICsyMTcsNyBAQAogICAgICAgICBpZiAoaGFzU3RhdGljKQogICAgICAgICAgICAgc3RhdGljUm93ID0gVW5maWx0ZXJlZFNlcmlhbGl6ZXIuc2VyaWFsaXplci5kZXNlcmlhbGl6ZVN0YXRpY1JvdyhpbiwgaGVhZGVyLCBuZXcgRGVzZXJpYWxpemF0aW9uSGVscGVyKG1ldGFkYXRhLCB2ZXJzaW9uLCBmbGFnKSk7CiAKLSAgICAgICAgaW50IHJvd0VzdGltYXRlID0gaGFzUm93RXN0aW1hdGUgPyAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKSA6IC0xOworICAgICAgICBpbnQgcm93RXN0aW1hdGUgPSBoYXNSb3dFc3RpbWF0ZSA/IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpIDogLTE7CiAgICAgICAgIHJldHVybiBuZXcgSGVhZGVyKGhlYWRlciwga2V5LCBpc1JldmVyc2VkLCBmYWxzZSwgcGFydGl0aW9uRGVsZXRpb24sIHN0YXRpY1Jvdywgcm93RXN0aW1hdGUpOwogICAgIH0KIApAQCAtMjgwLDQgKzI4Niw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzSGVhZGVyLCBrZXksIGlzUmV2ZXJzZWQsIGlzRW1wdHksIHBhcnRpdGlvbkRlbGV0aW9uLCBzdGF0aWNSb3csIHJvd0VzdGltYXRlKTsKICAgICAgICAgfQogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1VuZmlsdGVyZWRSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1VuZmlsdGVyZWRSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kLmphdmEKaW5kZXggNGQxZDcxYi4uZmJhMTYzZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQuamF2YQpAQCAtMjAsMjEgKzIwLDI3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93czsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVCdWZmZXJBY2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdQcmVmaXg7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWd1bGFyQW5kU3RhdGljQ29sdW1uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNsdXN0ZXJpbmdJbmRleEZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyYW5zZm9ybS5SVEJvdW5kVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5rZXljYWNoZS5LZXlDYWNoZVN1cHBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkl0ZXJhdG9yV2l0aExvd2VyQm91bmQ7CiAKIC8qKgpAQCAtNDgsMTAgKzU0LDExIEBACiBwdWJsaWMgY2xhc3MgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQgZXh0ZW5kcyBMYXppbHlJbml0aWFsaXplZFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yV2l0aExvd2VyQm91bmQ8VW5maWx0ZXJlZD4KIHsKICAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKLSAgICBwcml2YXRlIGZpbmFsIENsdXN0ZXJpbmdJbmRleEZpbHRlciBmaWx0ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTbGljZXMgc2xpY2VzOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1JldmVyc2VPcmRlcjsKICAgICBwcml2YXRlIGZpbmFsIENvbHVtbkZpbHRlciBzZWxlY3RlZENvbHVtbnM7CiAgICAgcHJpdmF0ZSBmaW5hbCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcjsKLSAgICBwcml2YXRlIENsdXN0ZXJpbmdCb3VuZDw/PiBsb3dlckJvdW5kOworICAgIHByaXZhdGUgT3B0aW9uYWw8VW5maWx0ZXJlZD4gbG93ZXJCb3VuZE1hcmtlcjsKICAgICBwcml2YXRlIGJvb2xlYW4gZmlyc3RJdGVtUmV0cmlldmVkOwogCiAgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kKERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksCkBAIC02MCwyNSArNjcsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIHNlbGVjdGVkQ29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCiAgICAgeworICAgICAgICB0aGlzKHBhcnRpdGlvbktleSwgc3N0YWJsZSwgZmlsdGVyLmdldFNsaWNlcyhzc3RhYmxlLm1ldGFkYXRhKCkpLCBmaWx0ZXIuaXNSZXZlcnNlZCgpLCBzZWxlY3RlZENvbHVtbnMsIGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQoRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZXMgc2xpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUmV2ZXJzZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgc2VsZWN0ZWRDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICB7CiAgICAgICAgIHN1cGVyKHBhcnRpdGlvbktleSk7CiAgICAgICAgIHRoaXMuc3N0YWJsZSA9IHNzdGFibGU7Ci0gICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyOworICAgICAgICB0aGlzLnNsaWNlcyA9IHNsaWNlczsKKyAgICAgICAgdGhpcy5pc1JldmVyc2VPcmRlciA9IGlzUmV2ZXJzZU9yZGVyOwogICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHNlbGVjdGVkQ29sdW1uczsKICAgICAgICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotICAgICAgICB0aGlzLmxvd2VyQm91bmQgPSBudWxsOwogICAgICAgICB0aGlzLmZpcnN0SXRlbVJldHJpZXZlZCA9IGZhbHNlOwogICAgIH0KIAogICAgIHB1YmxpYyBVbmZpbHRlcmVkIGxvd2VyQm91bmQoKQogICAgIHsKLSAgICAgICAgaWYgKGxvd2VyQm91bmQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBtYWtlQm91bmQobG93ZXJCb3VuZCk7CisgICAgICAgIGlmIChsb3dlckJvdW5kTWFya2VyICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbG93ZXJCb3VuZE1hcmtlci5vckVsc2UobnVsbCk7CiAKLSAgICAgICAgLy8gVGhlIHBhcnRpdGlvbiBpbmRleCBsb3dlciBib3VuZCBpcyBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIHNzdGFibGUgbWV0YWRhdGEgbG93ZXIgYm91bmQgYnV0IGl0IGlzIG9ubHkKLSAgICAgICAgLy8gcHJlc2VudCBpZiB0aGUgaXRlcmF0b3IgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCwgd2hpY2ggd2Ugb25seSBkbyB3aGVuIHRoZXJlIGFyZSB0b21ic3RvbmVzIHNpbmNlIGluCi0gICAgICAgIC8vIHRoaXMgY2FzZSB3ZSBjYW5ub3QgdXNlIHRoZSBzc3RhYmxlIG1ldGFkYXRhIGNsdXN0ZXJpbmcgdmFsdWVzCi0gICAgICAgIENsdXN0ZXJpbmdCb3VuZDw/PiByZXQgPSBnZXRQYXJ0aXRpb25JbmRleExvd2VyQm91bmQoKTsKLSAgICAgICAgcmV0dXJuIHJldCAhPSBudWxsID8gbWFrZUJvdW5kKHJldCkgOiBtYWtlQm91bmQoZ2V0TWV0YWRhdGFMb3dlckJvdW5kKCkpOworICAgICAgICAvLyBsb3dlciBib3VuZCBmcm9tIGNhY2hlIG1heSBiZSBtb3JlIGFjY3VyYXRlIGFzIGl0IHN0b3JlcyBpbmZvcm1hdGlvbiBhYm91dCBjbHVzdGVyaW5ncyByYW5nZSBmb3IgdGhhdCBleGFjdAorICAgICAgICAvLyByb3csIHNvIHdlIHRyeSBpdCBmaXJzdCAod2l0aG91dCBpbml0aWFsaXppbmcgaXRlcmF0b3IpCisgICAgICAgIENsdXN0ZXJpbmdCb3VuZDw/PiBsb3dlckJvdW5kID0gbWF5YmVHZXRMb3dlckJvdW5kRnJvbUtleUNhY2hlKCk7CisgICAgICAgIGlmIChsb3dlckJvdW5kID09IG51bGwpCisgICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBnZXQgdGhlIGxvd2VyIGJvdW5kIGZyb20gY2FjaGUsIHdlIHRyeSB3aXRoIG1ldGFkYXRhCisgICAgICAgICAgICBsb3dlckJvdW5kID0gbWF5YmVHZXRMb3dlckJvdW5kRnJvbU1ldGFkYXRhKCk7CisKKyAgICAgICAgaWYgKGxvd2VyQm91bmQgIT0gbnVsbCkKKyAgICAgICAgICAgIGxvd2VyQm91bmRNYXJrZXIgPSBPcHRpb25hbC5vZihtYWtlQm91bmQobG93ZXJCb3VuZCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsb3dlckJvdW5kTWFya2VyID0gT3B0aW9uYWwuZW1wdHkoKTsKKworICAgICAgICByZXR1cm4gbG93ZXJCb3VuZE1hcmtlci5vckVsc2UobnVsbCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBVbmZpbHRlcmVkIG1ha2VCb3VuZChDbHVzdGVyaW5nQm91bmQ8Pz4gYm91bmQpCkBAIC04NiwyMSArMTEyLDE1IEBACiAgICAgICAgIGlmIChib3VuZCA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAKLSAgICAgICAgaWYgKGxvd2VyQm91bmQgIT0gYm91bmQpCi0gICAgICAgICAgICBsb3dlckJvdW5kID0gYm91bmQ7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBSYW5nZVRvbWJzdG9uZUJvdW5kTWFya2VyKGxvd2VyQm91bmQsIERlbGV0aW9uVGltZS5MSVZFKTsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnRpZmljaWFsQm91bmRNYXJrZXIoYm91bmQpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaW5pdGlhbGl6ZUl0ZXJhdG9yKCkKICAgICB7CiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vICdpdGVyJyBpcyBhZGRlZCB0byBpdGVyYXRvcnMgd2hpY2ggaXMgY2xvc2VkIG9uIGV4Y2VwdGlvbiwgb3IgdGhyb3VnaCB0aGUgY2xvc2luZyBvZiB0aGUgZmluYWwgbWVyZ2VkIGl0ZXJhdG9yCi0gICAgICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyID0gUlRCb3VuZFZhbGlkYXRvci52YWxpZGF0ZSgKLSAgICAgICAgICAgIHNzdGFibGUucm93SXRlcmF0b3IocGFydGl0aW9uS2V5KCksIGZpbHRlci5nZXRTbGljZXMobWV0YWRhdGEoKSksIHNlbGVjdGVkQ29sdW1ucywgZmlsdGVyLmlzUmV2ZXJzZWQoKSwgbGlzdGVuZXIpLAotICAgICAgICAgICAgUlRCb3VuZFZhbGlkYXRvci5TdGFnZS5TU1RBQkxFLAotICAgICAgICAgICAgZmFsc2UKLSAgICAgICAgKTsKKyAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXIgPSBSVEJvdW5kVmFsaWRhdG9yLnZhbGlkYXRlKHNzdGFibGUucm93SXRlcmF0b3IocGFydGl0aW9uS2V5KCksIHNsaWNlcywgc2VsZWN0ZWRDb2x1bW5zLCBpc1JldmVyc2VPcmRlciwgbGlzdGVuZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRCb3VuZFZhbGlkYXRvci5TdGFnZS5TU1RBQkxFLCBmYWxzZSk7CiAgICAgICAgIHJldHVybiBpdGVyOwogICAgIH0KIApAQCAtMTEzLDE5ICsxMzMsMjAgQEAKIAogICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBsb3dlciBib3VuZCBpcyBub3QgYmlnZ2VyIHRoYW4gdGhlIGZpcnN0IGl0ZW0gcmV0cmlldmVkCiAgICAgICAgIGZpcnN0SXRlbVJldHJpZXZlZCA9IHRydWU7CisgICAgICAgIFVuZmlsdGVyZWQgbG93ZXJCb3VuZCA9IGxvd2VyQm91bmQoKTsKICAgICAgICAgaWYgKGxvd2VyQm91bmQgIT0gbnVsbCAmJiByZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIGFzc2VydCBjb21wYXJhdG9yKCkuY29tcGFyZShsb3dlckJvdW5kLCByZXQuY2x1c3RlcmluZygpKSA8PSAwCi0gICAgICAgICAgICAgICAgOiBTdHJpbmcuZm9ybWF0KCJMb3dlciBib3VuZCBbJXMgXWlzIGJpZ2dlciB0aGFuIGZpcnN0IHJldHVybmVkIHZhbHVlIFslc10gZm9yIHNzdGFibGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlckJvdW5kLnRvU3RyaW5nKG1ldGFkYXRhKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQudG9TdHJpbmcobWV0YWRhdGEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnQgY29tcGFyYXRvcigpLmNvbXBhcmUobG93ZXJCb3VuZC5jbHVzdGVyaW5nKCksIHJldC5jbHVzdGVyaW5nKCkpIDw9IDAKKyAgICAgICAgICAgIDogU3RyaW5nLmZvcm1hdCgiTG93ZXIgYm91bmQgWyVzIF1pcyBiaWdnZXIgdGhhbiBmaXJzdCByZXR1cm5lZCB2YWx1ZSBbJXNdIGZvciBzc3RhYmxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlckJvdW5kLmNsdXN0ZXJpbmcoKS50b1N0cmluZyhtZXRhZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQudG9TdHJpbmcobWV0YWRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRGaWxlbmFtZSgpKTsKIAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAogICAgIHByaXZhdGUgQ29tcGFyYXRvcjxDbHVzdGVyYWJsZT4gY29tcGFyYXRvcigpCiAgICAgewotICAgICAgICByZXR1cm4gZmlsdGVyLmlzUmV2ZXJzZWQoKSA/IG1ldGFkYXRhKCkuY29tcGFyYXRvci5yZXZlcnNlZCgpIDogbWV0YWRhdGEoKS5jb21wYXJhdG9yOworICAgICAgICByZXR1cm4gaXNSZXZlcnNlT3JkZXIgPyBtZXRhZGF0YSgpLmNvbXBhcmF0b3IucmV2ZXJzZWQoKSA6IG1ldGFkYXRhKCkuY29tcGFyYXRvcjsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTEzNyw3ICsxNTgsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGlzUmV2ZXJzZU9yZGVyKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBmaWx0ZXIuaXNSZXZlcnNlZCgpOworICAgICAgICByZXR1cm4gaXNSZXZlcnNlT3JkZXI7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xNTUsNyArMTc2LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRGVsZXRpb25UaW1lIHBhcnRpdGlvbkxldmVsRGVsZXRpb24oKQogICAgIHsKLSAgICAgICAgaWYgKCFzc3RhYmxlLm1heUhhdmVUb21ic3RvbmVzKCkpCisgICAgICAgIGlmICghc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5oYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9ucykKICAgICAgICAgICAgIHJldHVybiBEZWxldGlvblRpbWUuTElWRTsKIAogICAgICAgICByZXR1cm4gc3VwZXIucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpOwpAQCAtMTcwLDkzICsxOTEsNjYgQEAKICAgICAgICAgcmV0dXJuIHN1cGVyLnN0YXRpY1JvdygpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIDxWPiBDbHVzdGVyaW5nQm91bmQ8Vj4gY3JlYXRlSW5jbHVzaXZlT3Blbihib29sZWFuIGlzUmV2ZXJzZWQsIENsdXN0ZXJpbmdQcmVmaXg8Vj4gZnJvbSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmcm9tLmFjY2Vzc29yKCkuZmFjdG9yeSgpLmluY2x1c2l2ZU9wZW4oaXNSZXZlcnNlZCwgZnJvbS5nZXRSYXdWYWx1ZXMoKSk7Ci0gICAgfQotCiAgICAgLyoqCiAgICAgICogQHJldHVybiB0aGUgbG93ZXIgYm91bmQgc3RvcmVkIG9uIHRoZSBpbmRleCBlbnRyeSBmb3IgdGhpcyBwYXJ0aXRpb24sIGlmIGF2YWlsYWJsZS4KICAgICAgKi8KLSAgICBwcml2YXRlIENsdXN0ZXJpbmdCb3VuZDw/PiBnZXRQYXJ0aXRpb25JbmRleExvd2VyQm91bmQoKQorICAgIHByaXZhdGUgQ2x1c3RlcmluZ0JvdW5kPD8+IG1heWJlR2V0TG93ZXJCb3VuZEZyb21LZXlDYWNoZSgpCiAgICAgewotICAgICAgICAvLyBOT1RFOiBDQVNTQU5EUkEtMTEyMDYgcmVtb3ZlZCB0aGUgbG9va3VwIGFnYWluc3QgdGhlIGtleS1jYWNoZSBhcyB0aGUgSW5kZXhJbmZvIG9iamVjdHMgYXJlIG5vIGxvbmdlcgotICAgICAgICAvLyBpbiBtZW1vcnkgZm9yIG5vdCBoZWFwIGJhY2tlZCBJbmRleEluZm8gb2JqZWN0cyAoc28sIHRoZXNlIGFyZSBvbiBkaXNrKS4KLSAgICAgICAgLy8gQ0FTU0FORFJBLTExMzY5IGlzIHRoZXJlIHRvIGZpeCB0aGlzIGFmdGVyd2FyZHMuCisgICAgICAgIGlmIChzc3RhYmxlIGluc3RhbmNlb2YgS2V5Q2FjaGVTdXBwb3J0PD8+KQorICAgICAgICAgICAgcmV0dXJuICgoS2V5Q2FjaGVTdXBwb3J0PD8+KSBzc3RhYmxlKS5nZXRMb3dlckJvdW5kUHJlZml4RnJvbUNhY2hlKHBhcnRpdGlvbktleSgpLCBpc1JldmVyc2VPcmRlcik7CiAKLSAgICAgICAgLy8gQ3JlYXRpbmcgdGhlIGl0ZXJhdG9yIGVuc3VyZXMgdGhhdCByb3dJbmRleEVudHJ5IGlzIGxvYWRlZCBpZiBhdmFpbGFibGUgKHBhcnRpdGlvbnMgYmlnZ2VyIHRoYW4KLSAgICAgICAgLy8gRGF0YWJhc2VEZXNjcmlwdG9yLmNvbHVtbl9pbmRleF9zaXplKQotICAgICAgICBpZiAoIWNhblVzZU1ldGFkYXRhTG93ZXJCb3VuZCgpKQotICAgICAgICAgICAgbWF5YmVJbml0KCk7Ci0KLSAgICAgICAgUm93SW5kZXhFbnRyeSByb3dJbmRleEVudHJ5ID0gc3N0YWJsZS5nZXRDYWNoZWRQb3NpdGlvbihwYXJ0aXRpb25LZXkoKSwgZmFsc2UpOwotICAgICAgICBpZiAocm93SW5kZXhFbnRyeSA9PSBudWxsIHx8ICFyb3dJbmRleEVudHJ5LmluZGV4T25IZWFwKCkpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLQotICAgICAgICB0cnkgKFJvd0luZGV4RW50cnkuSW5kZXhJbmZvUmV0cmlldmVyIG9uSGVhcFJldHJpZXZlciA9IHJvd0luZGV4RW50cnkub3BlbldpdGhJbmRleChudWxsKSkKLSAgICAgICAgewotICAgICAgICAgICAgSW5kZXhJbmZvIGNvbHVtbiA9IG9uSGVhcFJldHJpZXZlci5jb2x1bW5zSW5kZXgoZmlsdGVyLmlzUmV2ZXJzZWQoKSA/IHJvd0luZGV4RW50cnkuY29sdW1uc0luZGV4Q291bnQoKSAtIDEgOiAwKTsKLSAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gbG93ZXJCb3VuZFByZWZpeCA9IGZpbHRlci5pc1JldmVyc2VkKCkgPyBjb2x1bW4ubGFzdE5hbWUgOiBjb2x1bW4uZmlyc3ROYW1lOwotICAgICAgICAgICAgYXNzZXJ0IGxvd2VyQm91bmRQcmVmaXguZ2V0UmF3VmFsdWVzKCkubGVuZ3RoIDw9IG1ldGFkYXRhKCkuY29tcGFyYXRvci5zaXplKCkgOgotICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiVW5leHBlY3RlZCBudW1iZXIgb2YgY2x1c3RlcmluZyB2YWx1ZXMgJWQsIGV4cGVjdGVkICVkIG9yIGZld2VyIGZvciAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyQm91bmRQcmVmaXguZ2V0UmF3VmFsdWVzKCkubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSgpLmNvbXBhcmF0b3Iuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldEZpbGVuYW1lKCkpOwotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUluY2x1c2l2ZU9wZW4oZmlsdGVyLmlzUmV2ZXJzZWQoKSwgbG93ZXJCb3VuZFByZWZpeCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJzaG91bGQgbmV2ZXIgb2NjdXIiLCBlKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBXaGV0aGVyIHdlIGNhbiB1c2UgdGhlIGNsdXN0ZXJpbmcgdmFsdWVzIGluIHRoZSBzdGF0cyBvZiB0aGUgc3N0YWJsZSB0byBidWlsZCB0aGUgbG93ZXIgYm91bmQuCi0gICAgICogPHA+Ci0gICAgICogQ3VycmVudGx5LCB0aGUgY2x1c3RlcmluZyB2YWx1ZXMgb2YgdGhlIHN0YXRzIGZpbGUgcmVjb3JkcyBmb3IgZWFjaCBjbHVzdGVyaW5nIGNvbXBvbmVudCB0aGUgbWluIGFuZCBtYXgKLSAgICAgKiB2YWx1ZSBzZWVuLCBudWxsIGV4Y2x1ZGVkLiBJbiBvdGhlciB3b3JkcywgaGF2aW5nIGEgbm9uLW51bGwgdmFsdWUgZm9yIGEgY29tcG9uZW50IGluIHRob3NlIG1pbi9tYXggY2x1c3RlcmluZwotICAgICAqIHZhbHVlcyBkb2VzIF9ub3RfIGd1YXJhbnRlZSB0aGF0IHRoZXJlIGlzbid0IGFuIHVuZmlsdGVyZWQgaW4gdGhlIHNzdGFibGUgd2hvc2UgY2x1c3RlcmluZyBoYXMgZWl0aGVyIG5vIHZhbHVlIGZvcgotICAgICAqIHRoYXQgY29tcG9uZW50IChpdCdzIGEgcHJlZml4KSBvciBhIG51bGwgdmFsdWUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpcyBwcm9ibGVtYXRpYyBhcyB0aGlzIG1lYW5zIHdlIGNhbid0IGluIGdlbmVyYWwgYnVpbGQgYSBsb3dlciBib3VuZCBmcm9tIHRob3NlIHZhbHVlcyBzaW5jZSB0aGUgIm1pbiIKLSAgICAgKiB2YWx1ZXMgZG9lc24ndCBhY3R1YWxseSBndWFyYW50ZWUgbWluaW1hbGl0eS4KLSAgICAgKiA8cD4KLSAgICAgKiBIb3dldmVyLCB3ZSBjYW4gdXNlIHRob3NlIHZhbHVlcyBpZiB3ZSBjYW4gZ3VhcmFudGVlIHRoYXQgbm8gY2x1c3RlcmluZyBpbiB0aGUgc3N0YWJsZSAxKSBpcyBhIHRydWUgcHJlZml4IGFuZAotICAgICAqIDIpIHVzZXMgbnVsbCB2YWx1ZXMuIE5hdCBoYXZpbmcgdHJ1ZSBwcmVmaXhlcyBtZWFucyBoYXZpbmcgbm8gcmFuZ2UgdG9tYnN0b25lIG1hcmtlcnMgc2luY2Ugcm93cyB1c2UKLSAgICAgKiB7QGxpbmsgQ2x1c3RlcmluZ30gd2hpY2ggaXMgYWx3YXlzICJmdWxsIiAoYWxsIGNvbXBvbmVudHMgYXJlIGFsd2F5cyBwcmVzZW50KS4gQXMgZm9yIG51bGwgdmFsdWVzLCB3ZSBoYXBwZW4gdG8KLSAgICAgKiBvbmx5IGFsbG93IHRob3NlIGluIGNvbXBhY3QgdGFibGVzIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSksIHNvIHdlIGNhbiBzaW1wbHkgZXhjbHVkZSB0aG9zZSB0YWJsZXMuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiB3ZSBjdXJyZW50bHkgaGF2ZSBhdCBvdXIgZGlzcG9zYWwgbWFrZSB0aGlzIGNvbmRpdGlvbiBsZXNzIHByZWNpc2UgdGhhdCBpdCBjb3VsZCBiZS4KLSAgICAgKiBJbiBwYXJ0aWN1bGFyLCB7QGxpbmsgU1NUYWJsZVJlYWRlciNtYXlIYXZlVG9tYnN0b25lc30gY291bGQgcmV0dXJuIHtAY29kZSB0cnVlfSAobWFraW5nIHVzIG5vdCB1c2UgdGhlIHN0YXRzKQotICAgICAqIGJlY2F1c2Ugb2YgY2VsbCB0b21ic3RvbmUgb3IgZXZlbiBleHBpcmluZyBjZWxscyBldmVuIGlmIHRoZSBzc3RhYmxlIGhhcyBubyByYW5nZSB0b21ic3RvbmUgbWFya2VycywgZXZlbiB0aG91Z2gKLSAgICAgKiBpdCdzIHJlYWxseSBvbmx5IG1hcmtlcnMgd2Ugd2FudCB0byBleGNsdWRlIGhlcmUgKG1vcmUgcHJlY2lzZWx5LCBhcyBzYWlkIGFib3ZlLCB3ZSB3YW50IHRvIGV4Y2x1ZGUgYW55dGhpbmcKLSAgICAgKiB3aG9zZSBjbHVzdGVyaW5nIGlzIG5vdCAiZnVsbCIsIGJ1dCB0aGF0J3Mgb25seSBtYXJrZXJzKS4gSXQgd291bGRuJ3QgYmUgdmVyeSBoYXJkIHRvIGNvbGxlY3Qgd2hldGhlciBhIHNzdGFibGUKLSAgICAgKiBoYXMgYW55IHJhbmdlIHRvbWJzdG9uZSBtYXJrZXIgaG93ZXZlciBzbyBpdCdzIGEgcG9zc2libGUgaW1wcm92ZW1lbnQuCiAgICAgICovCiAgICAgcHJpdmF0ZSBib29sZWFuIGNhblVzZU1ldGFkYXRhTG93ZXJCb3VuZCgpCiAgICAgewotICAgICAgICAvLyBTaWRlLW5vdGU6IHByZS0yLjEgc3N0YWJsZSBzdGF0IGZpbGUgaGFkIGNsdXN0ZXJpbmcgdmFsdWUgYXJyYXlzIHdob3NlIHNpemUgbWF5IG5vdCBtYXRjaCB0aGUgY29tcGFyYXRvciBzaXplCi0gICAgICAgIC8vIGFuZCB0aGF0IHdvdWxkIGJyZWFrIGdldE1ldGFkYXRhTG93ZXJCb3VuZC4gV2UgZG9uJ3Qgc3VwcG9ydCB1cGdyYWRlIGZyb20gMi4wIHRvIDMuMCBkaXJlY3RseSBob3dldmVyIHNvIGl0J3MKLSAgICAgICAgLy8gbm90IGEgdHJ1ZSBjb25jZXJuLiBCZXNpZGVzLCAhc3N0YWJsZS5tYXlIYXZlVG9tYnN0b25lcyBhbHJlYWR5IGVuc3VyZSB0aGlzIGlzIGEgMy4wIHNzdGFibGUgYW55d2F5LgotICAgICAgICByZXR1cm4gIXNzdGFibGUubWF5SGF2ZVRvbWJzdG9uZXMoKSAmJiAhc3N0YWJsZS5tZXRhZGF0YSgpLmlzQ29tcGFjdFRhYmxlKCk7CisgICAgICAgIGlmIChzc3RhYmxlLm1ldGFkYXRhKCkuaXNDb21wYWN0VGFibGUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBTbGljZXMgcmVxdWVzdGVkU2xpY2VzID0gc2xpY2VzOworCisgICAgICAgIGlmIChyZXF1ZXN0ZWRTbGljZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgLy8gU2ltcGx5IGV4Y2x1ZGUgdGhlIGNhc2VzIHdoZXJlIGxvd2VyIGJvdW5kIHdvdWxkIG5vdCBiZSB1c2VkIGFueXdheSwgdGhhdCBpcywgdGhlIHN0YXJ0IG9mIGNvdmVyZWQgcmFuZ2Ugb2YKKyAgICAgICAgLy8gY2x1c3RlcmluZ3MgaW4gc3N0YWJsZSBpcyBsb3dlciB0aGFuIHRoZSByZXF1ZXN0ZWQgc2xpY2UuIEluIHN1Y2ggY2FzZSwgd2UgbmVlZCB0byBhY2Nlc3MgdGhhdCBzc3RhYmxlJ3MKKyAgICAgICAgLy8gaXRlcmF0b3IgYW55d2F5IHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gdXNlIGEgbG93ZXIgYm91bmQgb3B0aW1pemF0aW9uIGV4dHJhIGNvbXBsZXhpdHkuCisgICAgICAgIGlmICghaXNSZXZlcnNlT3JkZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICFyZXF1ZXN0ZWRTbGljZXMuaGFzTG93ZXJCb3VuZCgpIHx8CisgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEoKS5jb21wYXJhdG9yLmNvbXBhcmUocmVxdWVzdGVkU2xpY2VzLnN0YXJ0KCksIHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcuc3RhcnQoKSkgPCAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICFyZXF1ZXN0ZWRTbGljZXMuaGFzVXBwZXJCb3VuZCgpIHx8CisgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEoKS5jb21wYXJhdG9yLmNvbXBhcmUocmVxdWVzdGVkU2xpY2VzLmVuZCgpLCBzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLmNvdmVyZWRDbHVzdGVyaW5nLmVuZCgpKSA+IDA7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBAcmV0dXJuIGEgZ2xvYmFsIGxvd2VyIGJvdW5kIG1hZGUgZnJvbSB0aGUgY2x1c3RlcmluZyB2YWx1ZXMgc3RvcmVkIGluIHRoZSBzc3RhYmxlIG1ldGFkYXRhLCBub3RlIHRoYXQKICAgICAgKiB0aGlzIGN1cnJlbnRseSBkb2VzIG5vdCBjb3JyZWN0bHkgY29tcGFyZSB0b21ic3RvbmUgYm91bmRzLCBlc3BlY2lhbGx5IHJhbmdlcy4KICAgICAgKi8KLSAgICBwcml2YXRlIENsdXN0ZXJpbmdCb3VuZDw/PiBnZXRNZXRhZGF0YUxvd2VyQm91bmQoKQorICAgIHByaXZhdGUgQ2x1c3RlcmluZ0JvdW5kPD8+IG1heWJlR2V0TG93ZXJCb3VuZEZyb21NZXRhZGF0YSgpCiAgICAgewogICAgICAgICBpZiAoIWNhblVzZU1ldGFkYXRhTG93ZXJCb3VuZCgpKQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAKICAgICAgICAgZmluYWwgU3RhdHNNZXRhZGF0YSBtID0gc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKTsKLSAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiB2YWxzID0gZmlsdGVyLmlzUmV2ZXJzZWQoKSA/IG0ubWF4Q2x1c3RlcmluZ1ZhbHVlcyA6IG0ubWluQ2x1c3RlcmluZ1ZhbHVlczsKLSAgICAgICAgYXNzZXJ0IHZhbHMuc2l6ZSgpIDw9IG1ldGFkYXRhKCkuY29tcGFyYXRvci5zaXplKCkgOgotICAgICAgICBTdHJpbmcuZm9ybWF0KCJVbmV4cGVjdGVkIG51bWJlciBvZiBjbHVzdGVyaW5nIHZhbHVlcyAlZCwgZXhwZWN0ZWQgJWQgb3IgZmV3ZXIgZm9yICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICB2YWxzLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSgpLmNvbXBhcmF0b3Iuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSk7Ci0gICAgICAgIHJldHVybiBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UuZmFjdG9yeSgpLmluY2x1c2l2ZU9wZW4oZmlsdGVyLmlzUmV2ZXJzZWQoKSwgdmFscy50b0FycmF5KG5ldyBCeXRlQnVmZmVyW3ZhbHMuc2l6ZSgpXSkpOworICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gYm91bmQgPSBtLmNvdmVyZWRDbHVzdGVyaW5nLm9wZW4oaXNSZXZlcnNlT3JkZXIpOworICAgICAgICBhc3NlcnRCb3VuZFNpemUoYm91bmQsIHNzdGFibGUpOworICAgICAgICByZXR1cm4gYm91bmQuYXJ0aWZpY2lhbExvd2VyQm91bmQoaXNSZXZlcnNlT3JkZXIpOwogICAgIH0KLX0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRCb3VuZFNpemUoQ2x1c3RlcmluZ1ByZWZpeDw/PiBsb3dlckJvdW5kLCBTU1RhYmxlIHNzdGFibGUpCisgICAgeworICAgICAgICBhc3NlcnQgbG93ZXJCb3VuZC5zaXplKCkgPD0gc3N0YWJsZS5tZXRhZGF0YSgpLmNvbXBhcmF0b3Iuc2l6ZSgpIDoKKyAgICAgICAgU3RyaW5nLmZvcm1hdCgiVW5leHBlY3RlZCBudW1iZXIgb2YgY2x1c3RlcmluZyB2YWx1ZXMgJWQsIGV4cGVjdGVkICVkIG9yIGZld2VyIGZvciAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgbG93ZXJCb3VuZC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5tZXRhZGF0YSgpLmNvbXBhcmF0b3Iuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFJvd0l0ZXJhdG9ycy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkUm93SXRlcmF0b3JzLmphdmEKaW5kZXggMmViNWQ4Zi4uOTVjZjA4MCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkUm93SXRlcmF0b3JzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkUm93SXRlcmF0b3JzLmphdmEKQEAgLTE3LDEyICsxNywxNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3M7CiAKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaWdlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRW1wdHlJdGVyYXRvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVndWxhckFuZFN0YXRpY0NvbHVtbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uRmlsdGVyZWRSb3dzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyYW5zZm9ybS5Nb3JlUm93czsKQEAgLTI2MywxNiArMjY4LDIyIEBACiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IGNvbmNhdGVuYXRlIHRoZSBzcGVjaWZpZWQgYXRvbSB3aXRoIHRoZSBpdGVyYXRvci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBjb25jYXQoZmluYWwgVW5maWx0ZXJlZCBmaXJzdCwgZmluYWwgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJlc3QpCisgICAgcHVibGljIHN0YXRpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgY29uY2F0KGZpbmFsIFVuZmlsdGVyZWQgZmlyc3QsIGZpbmFsIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB3cmFwcGVkKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvcihyZXN0KQorICAgICAgICByZXR1cm4gbmV3IFdyYXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yKCkKICAgICAgICAgewogICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhc1JldHVybmVkRmlyc3Q7CiAKICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB3cmFwcGVkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzUmV0dXJuZWRGaXJzdCA/IHN1cGVyLmhhc05leHQoKSA6IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc1JldHVybmVkRmlyc3QgPyB3cmFwcGVkLmhhc05leHQoKSA6IHRydWU7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQpAQCAtMjgzLDcgKzI5NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGhhc1JldHVybmVkRmlyc3QgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3Q7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQubmV4dCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9OwogICAgIH0KQEAgLTYwNCw0ICs2MTUsNCBAQAogICAgICAgICB9CiAgICAgfQogCi19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkU2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkU2VyaWFsaXplci5qYXZhCmluZGV4IDFjMGRjZDQuLmQ1MjhhNzAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFNlcmlhbGl6ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1VuZmlsdGVyZWRTZXJpYWxpemVyLmphdmEKQEAgLTIwLDE0ICsyMCwxNCBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIGltcG9ydCBuZXQubmljb3VsYWouY29tcGlsZWNvbW1hbmQuYW5ub3RhdGlvbnMuSW5saW5lOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZUFycmF5QWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQXJyYXlBY2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdy5EZWxldGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TZWFyY2hJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5XcmFwcGVkRXhjZXB0aW9uOwogCkBAIC0xOTYsNyArMTk2LDcgQEAKICAgICAgICAgICAgICAgICAvLyBXZSB3cml0ZSB0aGUgc2l6ZSBvZiB0aGUgcHJldmlvdXMgdW5maWx0ZXJlZCB0byBtYWtlIHJldmVyc2UgcXVlcmllcyBtb3JlIGVmZmljaWVudCAoYW5kIHNpbXBsZXIpLgogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgY3VycmVudGx5IG5vdCB1c2VkIGhvd2V2ZXIgYW5kIHVzaW5nIGl0IGlzIHRiZC4KICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocHJldmlvdXNVbmZpbHRlcmVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKGRvYi5nZXREYXRhKCksIDAsIGRvYi5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGRvYi51bnNhZmVHZXRCdWZmZXJBbmRGbGlwKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVsc2UKQEAgLTI3MCw3ICsyNzAsNyBAQAogICAgICAgICBpZiAoaGFzQ29tcGxleERlbGV0aW9uKQogICAgICAgICAgICAgaGVhZGVyLndyaXRlRGVsZXRpb25UaW1lKGRhdGEuY29tcGxleERlbGV0aW9uKCksIG91dCk7CiAKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGRhdGEuY2VsbHNDb3VudCgpKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoZGF0YS5jZWxsc0NvdW50KCkpOwogICAgICAgICBmb3IgKENlbGw8Pz4gY2VsbCA6IGRhdGEpCiAgICAgICAgICAgICBDZWxsLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGNlbGwsIGNvbHVtbiwgb3V0LCByb3dMaXZlbmVzcywgaGVhZGVyKTsKICAgICB9CkBAIC02NjIsNyArNjYyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDb21wbGV4RGVsZXRpb24oY29sdW1uLCBjb21wbGV4RGVsZXRpb24pOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbnQgY291bnQgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBpbnQgY291bnQgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgICAgIHdoaWxlICgtLWNvdW50ID49IDApCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQ2VsbDxieXRlW10+IGNlbGwgPSBDZWxsLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHJvd0xpdmVuZXNzLCBjb2x1bW4sIGhlYWRlciwgaGVscGVyLCBCeXRlQXJyYXlBY2Nlc3Nvci5pbnN0YW5jZSk7CkBAIC02ODAsNyArNjgwLDcgQEAKIAogICAgIHB1YmxpYyB2b2lkIHNraXBSb3dCb2R5KERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgaW50IHJvd1NpemUgPSAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgaW50IHJvd1NpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgaW4uc2tpcEJ5dGVzRnVsbHkocm93U2l6ZSk7CiAgICAgfQogCkBAIC02OTUsNyArNjk1LDcgQEAKIAogICAgIHB1YmxpYyB2b2lkIHNraXBNYXJrZXJCb2R5KERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgaW50IG1hcmtlclNpemUgPSAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgaW50IG1hcmtlclNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgaW4uc2tpcEJ5dGVzRnVsbHkobWFya2VyU2l6ZSk7CiAgICAgfQogCkBAIC03MDUsNyArNzA1LDcgQEAKICAgICAgICAgaWYgKGhhc0NvbXBsZXhEZWxldGlvbikKICAgICAgICAgICAgIGhlYWRlci5za2lwRGVsZXRpb25UaW1lKGluKTsKIAotICAgICAgICBpbnQgY291bnQgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgIGludCBjb3VudCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICB3aGlsZSAoLS1jb3VudCA+PSAwKQogICAgICAgICAgICAgQ2VsbC5zZXJpYWxpemVyLnNraXAoaW4sIGNvbHVtbiwgaGVhZGVyKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1VuZmlsdGVyZWRTb3VyY2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFNvdXJjZS5qYXZhCmluZGV4IGI5ODQ1MjIuLjYyYzIyZWQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFNvdXJjZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFNvdXJjZS5qYXZhCkBAIC0yMyw3ICsyMyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2VzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIAogLyoqCiAgKiBDb21tb24gZGF0YSBhY2Nlc3MgaW50ZXJmYWNlIGZvciBzc3RhYmxlcyBhbmQgbWVtdGFibGVzLgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9XcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9XcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvci5qYXZhCmluZGV4IDAyZTFjZWMuLmUzODcxMzYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1dyYXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yLmphdmEKQEAgLTE3LDc2ICsxNyw3MiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3M7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlVubW9kaWZpYWJsZUl0ZXJhdG9yOwotCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWd1bGFyQW5kU3RhdGljQ29sdW1uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uVHJhbnNmb3JtYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKIAogLyoqCiAgKiBBYnN0cmFjdCBjbGFzcyB0byBtYWtlIHdyaXRpbmcgdW5maWx0ZXJlZCBpdGVyYXRvcnMgdGhhdCB3cmFwIGFub3RoZXIgaXRlcmF0b3IKICAqIGVhc2llci4gQnkgZGVmYXVsdCwgdGhlIHdyYXBwaW5nIGl0ZXJhdG9yIHNpbXBseSBkZWxlZ2F0ZSBldmVyeSBjYWxsIHRvCi0gKiB0aGUgd3JhcHBlZCBpdGVyYXRvciBzbyBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBoYXZlIHRvIG92ZXJyaWRlCi0gKiBzb21lIG9mIHRoZSBtZXRob2RzLgorICogdGhlIHdyYXBwZWQgaXRlcmF0b3Igc28gY29uY3JldGUgaW1wbGVtZW50YXRpb25zIHdpbGwgaGF2ZSB0byBvdmVycmlkZSBzb21lIG1ldGhvZHMuCiAgKiA8cD4KICAqIE5vdGUgdGhhdCBpZiBtb3N0IG9mIHdoYXQgeW91IHdhbnQgdG8gZG8gaXMgbW9kaWZ5aW5nL2ZpbHRlcmluZyB0aGUgcmV0dXJuZWQKLSAqIHtAY29kZSBVbmZpbHRlcmVkfSwge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyYW5zZm9ybS5UcmFuc2Zvcm1hdGlvbiNtZXJnZShVbmZpbHRlcmVkUm93SXRlcmF0b3IsVHJhbnNmb3JtYXRpb24pfSBjYW4gYmUgYSBzaW1wbGVyIG9wdGlvbi4KKyAqIHtAY29kZSBVbmZpbHRlcmVkfSwge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyYW5zZm9ybS5UcmFuc2Zvcm1hdGlvbiNhcHBseShVbmZpbHRlcmVkUm93SXRlcmF0b3IsIFRyYW5zZm9ybWF0aW9uKX0KKyAqIGNhbiBiZSBhIHNpbXBsZXIgb3B0aW9uLgogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3IgZXh0ZW5kcyBVbm1vZGlmaWFibGVJdGVyYXRvcjxVbmZpbHRlcmVkPiAgaW1wbGVtZW50cyBVbmZpbHRlcmVkUm93SXRlcmF0b3IKK3B1YmxpYyBpbnRlcmZhY2UgV3JhcHBpbmdVbmZpbHRlcmVkUm93SXRlcmF0b3IgZXh0ZW5kcyBVbmZpbHRlcmVkUm93SXRlcmF0b3IKIHsKLSAgICBwcm90ZWN0ZWQgZmluYWwgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHdyYXBwZWQ7CisgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHdyYXBwZWQoKTsKIAotICAgIHByb3RlY3RlZCBXcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvcihVbmZpbHRlcmVkUm93SXRlcmF0b3Igd3JhcHBlZCkKKyAgICBkZWZhdWx0IFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEoKQogICAgIHsKLSAgICAgICAgdGhpcy53cmFwcGVkID0gd3JhcHBlZDsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQoKS5tZXRhZGF0YSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKCkKKyAgICBkZWZhdWx0IFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnMoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQubWV0YWRhdGEoKTsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQoKS5jb2x1bW5zKCk7CiAgICAgfQogCi0gICAgcHVibGljIFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnMoKQorICAgIGRlZmF1bHQgYm9vbGVhbiBpc1JldmVyc2VPcmRlcigpCiAgICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZC5jb2x1bW5zKCk7CisgICAgICAgIHJldHVybiB3cmFwcGVkKCkuaXNSZXZlcnNlT3JkZXIoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JldmVyc2VPcmRlcigpCisgICAgZGVmYXVsdCBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5KCkKICAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmlzUmV2ZXJzZU9yZGVyKCk7CisgICAgICAgIHJldHVybiB3cmFwcGVkKCkucGFydGl0aW9uS2V5KCk7CiAgICAgfQogCi0gICAgcHVibGljIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXkoKQorICAgIGRlZmF1bHQgRGVsZXRpb25UaW1lIHBhcnRpdGlvbkxldmVsRGVsZXRpb24oKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQucGFydGl0aW9uS2V5KCk7CisgICAgICAgIHJldHVybiB3cmFwcGVkKCkucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpOwogICAgIH0KIAotICAgIHB1YmxpYyBEZWxldGlvblRpbWUgcGFydGl0aW9uTGV2ZWxEZWxldGlvbigpCisgICAgZGVmYXVsdCBSb3cgc3RhdGljUm93KCkKICAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKTsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQoKS5zdGF0aWNSb3coKTsKICAgICB9CiAKLSAgICBwdWJsaWMgUm93IHN0YXRpY1JvdygpCisgICAgZGVmYXVsdCBFbmNvZGluZ1N0YXRzIHN0YXRzKCkKICAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLnN0YXRpY1JvdygpOworICAgICAgICByZXR1cm4gd3JhcHBlZCgpLnN0YXRzKCk7CiAgICAgfQogCi0gICAgcHVibGljIEVuY29kaW5nU3RhdHMgc3RhdHMoKQorICAgIGRlZmF1bHQgYm9vbGVhbiBoYXNOZXh0KCkKICAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLnN0YXRzKCk7CisgICAgICAgIHJldHVybiB3cmFwcGVkKCkuaGFzTmV4dCgpOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQorICAgIGRlZmF1bHQgVW5maWx0ZXJlZCBuZXh0KCkKICAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLmhhc05leHQoKTsKKyAgICAgICAgcmV0dXJuIHdyYXBwZWQoKS5uZXh0KCk7CiAgICAgfQogCi0gICAgcHVibGljIFVuZmlsdGVyZWQgbmV4dCgpCisgICAgZGVmYXVsdCB2b2lkIGNsb3NlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkLm5leHQoKTsKKyAgICAgICAgd3JhcHBlZCgpLmNsb3NlKCk7CiAgICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgIHsKLSAgICAgICAgd3JhcHBlZC5jbG9zZSgpOwotICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhQ29tcHJlc3NlZFN0cmVhbVJlYWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYUNvbXByZXNzZWRTdHJlYW1SZWFkZXIuamF2YQppbmRleCAwMDVhOWFhLi41YTZlNzEwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhQ29tcHJlc3NlZFN0cmVhbVJlYWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFDb21wcmVzc2VkU3RyZWFtUmVhZGVyLmphdmEKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgVHJhY2tlZERhdGFJbnB1dFBsdXMgaW4gPSBuZXcgVHJhY2tlZERhdGFJbnB1dFBsdXMoY2lzKTsKICAgICAgICAgICAgIGRlc2VyaWFsaXplciA9IG5ldyBTdHJlYW1EZXNlcmlhbGl6ZXIoY2ZzLm1ldGFkYXRhKCksIGluLCBpbnB1dFZlcnNpb24sIGdldEhlYWRlcihjZnMubWV0YWRhdGEoKSkpOwotICAgICAgICAgICAgd3JpdGVyID0gY3JlYXRlV3JpdGVyKGNmcywgdG90YWxTaXplLCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBmb3JtYXQpOworICAgICAgICAgICAgd3JpdGVyID0gY3JlYXRlV3JpdGVyKGNmcywgdG90YWxTaXplLCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpbnB1dFZlcnNpb24uZm9ybWF0KTsKICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IHdyaXRlci5nZXRGaWxlbmFtZSgpOwogICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25OYW1lID0gZmlsZW5hbWUgKyAnLScgKyBmaWxlU2VxTnVtOwogICAgICAgICAgICAgaW50IHNlY3Rpb25JZHggPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYUNvbXByZXNzZWRTdHJlYW1Xcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFDb21wcmVzc2VkU3RyZWFtV3JpdGVyLmphdmEKaW5kZXggNDFmZDliMS4uODA2YTc0YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYUNvbXByZXNzZWRTdHJlYW1Xcml0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhQ29tcHJlc3NlZFN0cmVhbVdyaXRlci5qYXZhCkBAIC0yNywxMiArMjcsMTIgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5DaGFubmVsUHJveHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlByb2dyZXNzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtaW5nRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbWluZ0RhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCiAvKioKQEAgLTcxLDcgKzcxLDcgQEAKICAgICAgICAgICAgIGludCBzZWN0aW9uSWR4ID0gMDsKIAogICAgICAgICAgICAgLy8gc3RyZWFtIGVhY2ggb2YgdGhlIHJlcXVpcmVkIHNlY3Rpb25zIG9mIHRoZSBmaWxlCi0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpOworICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKS50b1N0cmluZygpOwogICAgICAgICAgICAgZm9yIChTZWN0aW9uIHNlY3Rpb24gOiBzZWN0aW9ucykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBsZW5ndGggb2YgdGhlIHNlY3Rpb24gdG8gc3RyZWFtCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhRW50aXJlU1NUYWJsZVN0cmVhbVJlYWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYUVudGlyZVNTVGFibGVTdHJlYW1SZWFkZXIuamF2YQppbmRleCA1MTVjODVkLi45YzVlMDQ4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhRW50aXJlU1NUYWJsZVN0cmVhbVJlYWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFFbnRpcmVTU1RhYmxlU3RyZWFtUmVhZGVyLmphdmEKQEAgLTI1LDE3ICsyNSwyMCBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVOZXdUcmFja2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkJ1ZmZlclR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSU9PcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZU11bHRpV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlWmVyb0NvcHlXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlWmVyb0NvcHlXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyT3B0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5Qcm9ncmVzc0luZm87CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVJlY2VpdmVyOwpAQCAtNjAsOSArNjMsNiBAQAogCiAgICAgcHVibGljIENhc3NhbmRyYUVudGlyZVNTVGFibGVTdHJlYW1SZWFkZXIoU3RyZWFtTWVzc2FnZUhlYWRlciBtZXNzYWdlSGVhZGVyLCBDYXNzYW5kcmFTdHJlYW1IZWFkZXIgc3RyZWFtSGVhZGVyLCBTdHJlYW1TZXNzaW9uIHNlc3Npb24pCiAgICAgewotICAgICAgICBpZiAoc3RyZWFtSGVhZGVyLmZvcm1hdCAhPSBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVbnN1cHBvcnRlZCBTU1RhYmxlIGZvcm1hdCAiICsgc3RyZWFtSGVhZGVyLmZvcm1hdCk7Ci0KICAgICAgICAgaWYgKHNlc3Npb24uZ2V0UGVuZGluZ1JlcGFpcigpICE9IG51bGwpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBvbmx5IGV2ZXIgYmUgc3RyZWFtaW5nIHBlbmRpbmcgcmVwYWlyIHNzdGFibGVzIGlmIHRoZSBzZXNzaW9uIGhhcyBhIHBlbmRpbmcgcmVwYWlyIGlkCkBAIC04NCw3ICs4NCw3IEBACiAgICAgICovCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gaW5wdXQgbmVlZHMgdG8gcmVtYWluIG9wZW4sIHN0cmVhbXMgb24gdG9wIG9mIGl0IGNhbid0IGJlIGNsb3NlZAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTU1RhYmxlTXVsdGlXcml0ZXIgcmVhZChEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgcHVibGljIFNTVGFibGVNdWx0aVdyaXRlciByZWFkKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gQ29sdW1uRmFtaWx5U3RvcmUuZ2V0SWZFeGlzdHModGFibGVJZCk7CiAgICAgICAgIGlmIChjZnMgPT0gbnVsbCkKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgcHJldHR5UHJpbnRNZW1vcnkodG90YWxTaXplKSwKICAgICAgICAgICAgICAgICAgICAgIGNmcy5tZXRhZGF0YSgpKTsKIAotICAgICAgICBCaWdUYWJsZVplcm9Db3B5V3JpdGVyIHdyaXRlciA9IG51bGw7CisgICAgICAgIFNTVGFibGVaZXJvQ29weVdyaXRlciB3cml0ZXIgPSBudWxsOwogCiAgICAgICAgIHRyeQogICAgICAgICB7CkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldHR5UHJpbnRNZW1vcnkodG90YWxTaXplKSk7CiAKICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVDb21wb25lbnQoY29tcG9uZW50LnR5cGUsIGluLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIHNlc3Npb24ucHJvZ3Jlc3Mod3JpdGVyLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoY29tcG9uZW50KSwgUHJvZ3Jlc3NJbmZvLkRpcmVjdGlvbi5JTiwgbGVuZ3RoLCBsZW5ndGgsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgc2Vzc2lvbi5wcm9ncmVzcyh3cml0ZXIuZGVzY3JpcHRvci5maWxlRm9yKGNvbXBvbmVudCkudG9TdHJpbmcoKSwgUHJvZ3Jlc3NJbmZvLkRpcmVjdGlvbi5JTiwgbGVuZ3RoLCBsZW5ndGgsIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgYnl0ZXNSZWFkICs9IGxlbmd0aDsKIAogICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiW1N0cmVhbSAje31dIEZpbmlzaGVkIHJlY2VpdmluZyB7fSBjb21wb25lbnQgZnJvbSB7fSwgY29tcG9uZW50U2l6ZSA9IHt9LCByZWFkQnl0ZXMgPSB7fSwgdG90YWxTaXplID0ge30iLApAQCAtMTQ1LDcgKzE0NSwxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIltTdHJlYW0ge31dIEVycm9yIHdoaWxlIHJlYWRpbmcgc3N0YWJsZSBmcm9tIHN0cmVhbSBmb3IgdGFibGUgPSB7fSIsIHNlc3Npb24ucGxhbklkKCksIGNmcy5tZXRhZGF0YSgpLCBlKTsKICAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBlID0gd3JpdGVyLmFib3J0KGUpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRocm93YWJsZSBlMiA9IHdyaXRlci5hYm9ydChudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAoZTIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgZS5hZGRTdXBwcmVzc2VkKGUyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjUsNyArMTY5LDcgQEAKICAgICB9CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHByb3RlY3RlZCBCaWdUYWJsZVplcm9Db3B5V3JpdGVyIGNyZWF0ZVdyaXRlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGxvbmcgdG90YWxTaXplLCBDb2xsZWN0aW9uPENvbXBvbmVudD4gY29tcG9uZW50cykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgcHJvdGVjdGVkIFNTVGFibGVaZXJvQ29weVdyaXRlciBjcmVhdGVXcml0ZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBsb25nIHRvdGFsU2l6ZSwgQ29sbGVjdGlvbjxDb21wb25lbnQ+IGNvbXBvbmVudHMpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgRmlsZSBkYXRhRGlyID0gZ2V0RGF0YURpcihjZnMsIHRvdGFsU2l6ZSk7CiAKQEAgLTE3NCwxMCArMTc4LDI2IEBACiAKICAgICAgICAgTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyID0gQ2Fzc2FuZHJhU3RyZWFtUmVjZWl2ZXIuZnJvbVJlY2VpdmVyKHNlc3Npb24uZ2V0QWdncmVnYXRvcih0YWJsZUlkKSkuY3JlYXRlTGlmZWN5Y2xlTmV3VHJhY2tlcigpOwogCi0gICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihkYXRhRGlyLCBoZWFkZXIudmVyc2lvbiwgaGVhZGVyLmZvcm1hdCk7CisgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihkYXRhRGlyLCBoZWFkZXIudmVyc2lvbik7CiAKLSAgICAgICAgbG9nZ2VyLmRlYnVnKCJbVGFibGUgI3t9XSB7fSBDb21wb25lbnRzIHRvIHdyaXRlOiB7fSIsIGNmcy5tZXRhZGF0YSgpLCBkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSwgY29tcG9uZW50cyk7CisgICAgICAgIElPT3B0aW9ucyBpb09wdGlvbnMgPSBuZXcgSU9PcHRpb25zKERhdGFiYXNlRGVzY3JpcHRvci5nZXREaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3koKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldERpc2tBY2Nlc3NNb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbmRleEFjY2Vzc01vZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldERpc2tPcHRpbWl6YXRpb25Fc3RpbWF0ZVBlcmNlbnRpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmlja2xlRnN5bmMoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVmZmVyU2l6ZSgyIDw8IDIwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclR5cGUoQnVmZmVyVHlwZS5PRkZfSEVBUCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Rmx1c2hDb21wcmVzc2lvbigpKTsKIAotICAgICAgICByZXR1cm4gbmV3IEJpZ1RhYmxlWmVyb0NvcHlXcml0ZXIoZGVzYywgY2ZzLm1ldGFkYXRhLCBsaWZlY3ljbGVOZXdUcmFja2VyLCBjb21wb25lbnRzKTsKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJbVGFibGUgI3t9XSB7fSBDb21wb25lbnRzIHRvIHdyaXRlOiB7fSIsIGNmcy5tZXRhZGF0YSgpLCBkZXNjLCBjb21wb25lbnRzKTsKKyAgICAgICAgcmV0dXJuIGRlc2MuZ2V0Rm9ybWF0KCkKKyAgICAgICAgICAgICAgICAgICAuZ2V0V3JpdGVyRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgICAgLmJ1aWxkZXIoZGVzYykKKyAgICAgICAgICAgICAgICAgICAuc2V0Q29tcG9uZW50cyhjb21wb25lbnRzKQorICAgICAgICAgICAgICAgICAgIC5zZXRUYWJsZU1ldGFkYXRhUmVmKGNmcy5tZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAuc2V0SU9PcHRpb25zKGlvT3B0aW9ucykKKyAgICAgICAgICAgICAgICAgICAuY3JlYXRlWmVyb0NvcHlXcml0ZXIobGlmZWN5Y2xlTmV3VHJhY2tlciwgY2ZzKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhRW50aXJlU1NUYWJsZVN0cmVhbVdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYUVudGlyZVNTVGFibGVTdHJlYW1Xcml0ZXIuamF2YQppbmRleCAzZDY3OWE1Li41NGZlYzQ5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhRW50aXJlU1NUYWJsZVN0cmVhbVdyaXRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFFbnRpcmVTU1RhYmxlU3RyZWFtV3JpdGVyLmphdmEKQEAgLTI3LDkgKzI3LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5Qcm9ncmVzc0luZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbWluZ0RhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1NYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1pbmdEYXRhT3V0cHV0UGx1czsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtTWFuYWdlci5TdHJlYW1SYXRlTGltaXRlcjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnk7CkBAIC05Myw3ICs5Myw3IEBACiAgICAgICAgICAgICBsb25nIGJ5dGVzV3JpdHRlbiA9IG91dC53cml0ZUZpbGVUb0NoYW5uZWwoY2hhbm5lbCwgbGltaXRlcik7CiAgICAgICAgICAgICBwcm9ncmVzcyArPSBieXRlc1dyaXR0ZW47CiAKLSAgICAgICAgICAgIHNlc3Npb24ucHJvZ3Jlc3Moc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGNvbXBvbmVudCksIFByb2dyZXNzSW5mby5EaXJlY3Rpb24uT1VULCBieXRlc1dyaXR0ZW4sIGJ5dGVzV3JpdHRlbiwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHNlc3Npb24ucHJvZ3Jlc3Moc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoY29tcG9uZW50KS50b1N0cmluZygpLCBQcm9ncmVzc0luZm8uRGlyZWN0aW9uLk9VVCwgYnl0ZXNXcml0dGVuLCBieXRlc1dyaXR0ZW4sIGxlbmd0aCk7CiAKICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiW1N0cmVhbSAje31dIEZpbmlzaGVkIHN0cmVhbWluZyB7fS57fSBnZW4ge30gY29tcG9uZW50IHt9IHRvIHt9LCB4ZmVyZWQgPSB7fSwgbGVuZ3RoID0ge30sIHRvdGFsU2l6ZSA9IHt9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLnBsYW5JZCgpLApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYU91dGdvaW5nRmlsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYU91dGdvaW5nRmlsZS5qYXZhCmluZGV4IDM2N2MzMDQuLjg4ZWNmZjggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFPdXRnb2luZ0ZpbGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhT3V0Z29pbmdGaWxlLmphdmEKQEAgLTMxLDkgKzMxLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5PdXRnb2luZ1N0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtaW5nRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbU9wZXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtaW5nRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWY7CiAKQEAgLTc2LDE2ICs3NiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkU3RyZWFtRW50aXJlU1NUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRNYW5pZmVzdCBtYW5pZmVzdCkKICAgICB7Ci0gICAgICAgIGJvb2xlYW4ga2VlcFNTVGFibGVMZXZlbCA9IG9wZXJhdGlvbiA9PSBTdHJlYW1PcGVyYXRpb24uQk9PVFNUUkFQIHx8IG9wZXJhdGlvbiA9PSBTdHJlYW1PcGVyYXRpb24uUkVCVUlMRDsKLQogICAgICAgICBDb21wcmVzc2lvbkluZm8gY29tcHJlc3Npb25JbmZvID0gc3N0YWJsZS5jb21wcmVzc2lvbgogICAgICAgICAgICAgICAgID8gQ29tcHJlc3Npb25JbmZvLm5ld0xhenlJbnN0YW5jZShzc3RhYmxlLmdldENvbXByZXNzaW9uTWV0YWRhdGEoKSwgc2VjdGlvbnMpCiAgICAgICAgICAgICAgICAgOiBudWxsOwogCiAgICAgICAgIHJldHVybiBDYXNzYW5kcmFTdHJlYW1IZWFkZXIuYnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVGb3JtYXQoc3N0YWJsZS5kZXNjcmlwdG9yLmZvcm1hdFR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVWZXJzaW9uKHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlTGV2ZWwoa2VlcFNTVGFibGVMZXZlbCA/IHNzdGFibGUuZ2V0U1NUYWJsZUxldmVsKCkgOiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlTGV2ZWwob3BlcmF0aW9uLmtlZXBTU1RhYmxlTGV2ZWwoKSA/IHNzdGFibGUuZ2V0U1NUYWJsZUxldmVsKCkgOiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhFc3RpbWF0ZWRLZXlzKGVzdGltYXRlZEtleXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNlY3Rpb25zKHNlY3Rpb25zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb21wcmVzc2lvbkluZm8oY29tcHJlc3Npb25JbmZvKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbUhlYWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbUhlYWRlci5qYXZhCmluZGV4IGM5ZTEwY2YuLjJiMTIyM2IgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1IZWFkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyLmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKQEAgLTQ3LDggKzQ4LDYgQEAKICAgICAvKiogU1NUYWJsZSB2ZXJzaW9uICovCiAgICAgcHVibGljIGZpbmFsIFZlcnNpb24gdmVyc2lvbjsKIAotICAgIC8qKiBTU1RhYmxlIGZvcm1hdCAqKi8KLSAgICBwdWJsaWMgZmluYWwgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdDsKICAgICBwdWJsaWMgZmluYWwgbG9uZyBlc3RpbWF0ZWRLZXlzOwogICAgIHB1YmxpYyBmaW5hbCBMaXN0PFNTVGFibGVSZWFkZXIuUGFydGl0aW9uUG9zaXRpb25Cb3VuZHM+IHNlY3Rpb25zOwogICAgIHB1YmxpYyBmaW5hbCBDb21wcmVzc2lvbkluZm8gY29tcHJlc3Npb25JbmZvOwpAQCAtNjgsNyArNjcsNiBAQAogICAgIHByaXZhdGUgQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyKEJ1aWxkZXIgYnVpbGRlcikKICAgICB7CiAgICAgICAgIHZlcnNpb24gPSBidWlsZGVyLnZlcnNpb247Ci0gICAgICAgIGZvcm1hdCA9IGJ1aWxkZXIuZm9ybWF0OwogICAgICAgICBlc3RpbWF0ZWRLZXlzID0gYnVpbGRlci5lc3RpbWF0ZWRLZXlzOwogICAgICAgICBzZWN0aW9ucyA9IGJ1aWxkZXIuc2VjdGlvbnM7CiAgICAgICAgIGNvbXByZXNzaW9uSW5mbyA9IGJ1aWxkZXIuY29tcHJlc3Npb25JbmZvOwpAQCAtMTI0LDcgKzEyMiw2IEBACiAgICAgICAgICAgICAgICBzc3RhYmxlTGV2ZWwgPT0gdGhhdC5zc3RhYmxlTGV2ZWwgJiYKICAgICAgICAgICAgICAgIGlzRW50aXJlU1NUYWJsZSA9PSB0aGF0LmlzRW50aXJlU1NUYWJsZSAmJgogICAgICAgICAgICAgICAgT2JqZWN0cy5lcXVhbHModmVyc2lvbiwgdGhhdC52ZXJzaW9uKSAmJgotICAgICAgICAgICAgICAgZm9ybWF0ID09IHRoYXQuZm9ybWF0ICYmCiAgICAgICAgICAgICAgICBPYmplY3RzLmVxdWFscyhzZWN0aW9ucywgdGhhdC5zZWN0aW9ucykgJiYKICAgICAgICAgICAgICAgIE9iamVjdHMuZXF1YWxzKGNvbXByZXNzaW9uSW5mbywgdGhhdC5jb21wcmVzc2lvbkluZm8pICYmCiAgICAgICAgICAgICAgICBPYmplY3RzLmVxdWFscyhzZXJpYWxpemF0aW9uSGVhZGVyLCB0aGF0LnNlcmlhbGl6YXRpb25IZWFkZXIpICYmCkBAIC0xMzYsNyArMTMzLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2godmVyc2lvbiwgZm9ybWF0LCBlc3RpbWF0ZWRLZXlzLCBzZWN0aW9ucywgY29tcHJlc3Npb25JbmZvLCBzc3RhYmxlTGV2ZWwsIHNlcmlhbGl6YXRpb25IZWFkZXIsIGNvbXBvbmVudE1hbmlmZXN0LAorICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKHZlcnNpb24sIGVzdGltYXRlZEtleXMsIHNlY3Rpb25zLCBjb21wcmVzc2lvbkluZm8sIHNzdGFibGVMZXZlbCwgc2VyaWFsaXphdGlvbkhlYWRlciwgY29tcG9uZW50TWFuaWZlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNFbnRpcmVTU1RhYmxlLCBmaXJzdEtleSwgdGFibGVJZCk7CiAgICAgfQogCkBAIC0xNDUsNyArMTQyLDcgQEAKICAgICB7CiAgICAgICAgIHJldHVybiAiQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyeyIgKwogICAgICAgICAgICAgICAgInZlcnNpb249IiArIHZlcnNpb24gKwotICAgICAgICAgICAgICAgIiwgZm9ybWF0PSIgKyBmb3JtYXQgKworICAgICAgICAgICAgICAgIiwgZm9ybWF0PSIgKyB2ZXJzaW9uLmZvcm1hdC5uYW1lKCkgKwogICAgICAgICAgICAgICAgIiwgZXN0aW1hdGVkS2V5cz0iICsgZXN0aW1hdGVkS2V5cyArCiAgICAgICAgICAgICAgICAiLCBzZWN0aW9ucz0iICsgc2VjdGlvbnMgKwogICAgICAgICAgICAgICAgIiwgc3N0YWJsZUxldmVsPSIgKyBzc3RhYmxlTGV2ZWwgKwpAQCAtMTYzLDcgKzE2MCw3IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShDYXNzYW5kcmFTdHJlYW1IZWFkZXIgaGVhZGVyLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgb3V0LndyaXRlVVRGKGhlYWRlci52ZXJzaW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgb3V0LndyaXRlVVRGKGhlYWRlci5mb3JtYXQubmFtZSk7CisgICAgICAgICAgICBvdXQud3JpdGVVVEYoaGVhZGVyLnZlcnNpb24uZm9ybWF0Lm5hbWUoKSk7CiAKICAgICAgICAgICAgIG91dC53cml0ZUxvbmcoaGVhZGVyLmVzdGltYXRlZEtleXMpOwogICAgICAgICAgICAgb3V0LndyaXRlSW50KGhlYWRlci5zZWN0aW9ucy5zaXplKCkpOwpAQCAtMTgyLDcgKzE3OSw3IEBACiAKICAgICAgICAgICAgIGlmIChoZWFkZXIuaXNFbnRpcmVTU1RhYmxlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbXBvbmVudE1hbmlmZXN0LnNlcmlhbGl6ZXIuc2VyaWFsaXplKGhlYWRlci5jb21wb25lbnRNYW5pZmVzdCwgb3V0LCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBDb21wb25lbnRNYW5pZmVzdC5zZXJpYWxpemVycy5nZXQoaGVhZGVyLnZlcnNpb24uZm9ybWF0Lm5hbWUoKSkuc2VyaWFsaXplKGhlYWRlci5jb21wb25lbnRNYW5pZmVzdCwgb3V0LCB2ZXJzaW9uKTsKICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhWSW50TGVuZ3RoKGhlYWRlci5maXJzdEtleS5nZXRLZXkoKSwgb3V0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjAxLDggKzE5OCwxMSBAQAogICAgICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICAgICAgcHVibGljIENhc3NhbmRyYVN0cmVhbUhlYWRlciBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbiwgRnVuY3Rpb248VGFibGVJZCwgSVBhcnRpdGlvbmVyPiBwYXJ0aXRpb25lck1hcHBlcikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIFZlcnNpb24gc3N0YWJsZVZlcnNpb24gPSBTU1RhYmxlRm9ybWF0LlR5cGUuY3VycmVudCgpLmluZm8uZ2V0VmVyc2lvbihpbi5yZWFkVVRGKCkpOwotICAgICAgICAgICAgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdCA9IFNTVGFibGVGb3JtYXQuVHlwZS52YWxpZGF0ZShpbi5yZWFkVVRGKCkpOworICAgICAgICAgICAgU3RyaW5nIHNzdGFibGVWZXJzaW9uU3RyaW5nID0gaW4ucmVhZFVURigpOworICAgICAgICAgICAgU3RyaW5nIGZvcm1hdE5hbWUgPSBpbi5yZWFkVVRGKCk7CisgICAgICAgICAgICBTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTVGFibGVGb3JtYXRzKCkuZ2V0KGZvcm1hdE5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlVua25vd24gU1NUYWJsZSBmb3JtYXQgJyVzJyIsIGZvcm1hdE5hbWUpKTsKKyAgICAgICAgICAgIFZlcnNpb24gc3N0YWJsZVZlcnNpb24gPSBmb3JtYXQuZ2V0VmVyc2lvbihzc3RhYmxlVmVyc2lvblN0cmluZyk7CiAKICAgICAgICAgICAgIGxvbmcgZXN0aW1hdGVkS2V5cyA9IGluLnJlYWRMb25nKCk7CiAgICAgICAgICAgICBpbnQgY291bnQgPSBpbi5yZWFkSW50KCk7CkBAIC0yMjEsNyArMjIxLDcgQEAKIAogICAgICAgICAgICAgaWYgKGlzRW50aXJlU1NUYWJsZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYW5pZmVzdCA9IENvbXBvbmVudE1hbmlmZXN0LnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24pOworICAgICAgICAgICAgICAgIG1hbmlmZXN0ID0gQ29tcG9uZW50TWFuaWZlc3Quc2VyaWFsaXplcnMuZ2V0KGZvcm1hdC5uYW1lKCkpLmRlc2VyaWFsaXplKGluLCB2ZXJzaW9uKTsKICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGtleUJ1ZiA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoVkludExlbmd0aChpbik7CiAgICAgICAgICAgICAgICAgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gcGFydGl0aW9uZXJNYXBwZXIuYXBwbHkodGFibGVJZCk7CiAgICAgICAgICAgICAgICAgaWYgKHBhcnRpdGlvbmVyID09IG51bGwpCkBAIC0yMjksOCArMjI5LDcgQEAKICAgICAgICAgICAgICAgICBmaXJzdEtleSA9IHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KGtleUJ1Zik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJldHVybiBidWlsZGVyKCkud2l0aFNTVGFibGVGb3JtYXQoZm9ybWF0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZVZlcnNpb24oc3N0YWJsZVZlcnNpb24pCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcigpLndpdGhTU1RhYmxlVmVyc2lvbihzc3RhYmxlVmVyc2lvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVMZXZlbChzc3RhYmxlTGV2ZWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhFc3RpbWF0ZWRLZXlzKGVzdGltYXRlZEtleXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTZWN0aW9ucyhzZWN0aW9ucykKQEAgLTI0Nyw3ICsyNDYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBsb25nIHNpemUgPSAwOwogICAgICAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mKGhlYWRlci52ZXJzaW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mKGhlYWRlci5mb3JtYXQubmFtZSk7CisgICAgICAgICAgICBzaXplICs9IFR5cGVTaXplcy5zaXplb2YoaGVhZGVyLnZlcnNpb24uZm9ybWF0Lm5hbWUoKSk7CiAgICAgICAgICAgICBzaXplICs9IFR5cGVTaXplcy5zaXplb2YoaGVhZGVyLmVzdGltYXRlZEtleXMpOwogCiAgICAgICAgICAgICBzaXplICs9IFR5cGVTaXplcy5zaXplb2YoaGVhZGVyLnNlY3Rpb25zLnNpemUoKSk7CkBAIC0yNjcsNyArMjY2LDcgQEAKIAogICAgICAgICAgICAgaWYgKGhlYWRlci5pc0VudGlyZVNTVGFibGUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2l6ZSArPSBDb21wb25lbnRNYW5pZmVzdC5zZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKGhlYWRlci5jb21wb25lbnRNYW5pZmVzdCwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgc2l6ZSArPSBDb21wb25lbnRNYW5pZmVzdC5zZXJpYWxpemVycy5nZXQoaGVhZGVyLnZlcnNpb24uZm9ybWF0Lm5hbWUoKSkuc2VyaWFsaXplZFNpemUoaGVhZGVyLmNvbXBvbmVudE1hbmlmZXN0LCB2ZXJzaW9uKTsKICAgICAgICAgICAgICAgICBzaXplICs9IEJ5dGVCdWZmZXJVdGlsLnNlcmlhbGl6ZWRTaXplV2l0aFZJbnRMZW5ndGgoaGVhZGVyLmZpcnN0S2V5LmdldEtleSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBzaXplOwpAQCAtMjc3LDcgKzI3Niw2IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyCiAgICAgewogICAgICAgICBwcml2YXRlIFZlcnNpb24gdmVyc2lvbjsKLSAgICAgICAgcHJpdmF0ZSBTU1RhYmxlRm9ybWF0LlR5cGUgZm9ybWF0OwogICAgICAgICBwcml2YXRlIGxvbmcgZXN0aW1hdGVkS2V5czsKICAgICAgICAgcHJpdmF0ZSBMaXN0PFNTVGFibGVSZWFkZXIuUGFydGl0aW9uUG9zaXRpb25Cb3VuZHM+IHNlY3Rpb25zOwogICAgICAgICBwcml2YXRlIENvbXByZXNzaW9uSW5mbyBjb21wcmVzc2lvbkluZm87CkBAIC0yODgsMTIgKzI4Niw2IEBACiAgICAgICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IGZpcnN0S2V5OwogICAgICAgICBwcml2YXRlIFRhYmxlSWQgdGFibGVJZDsKIAotICAgICAgICBwdWJsaWMgQnVpbGRlciB3aXRoU1NUYWJsZUZvcm1hdChTU1RhYmxlRm9ybWF0LlR5cGUgZm9ybWF0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KICAgICAgICAgcHVibGljIEJ1aWxkZXIgd2l0aFNTVGFibGVWZXJzaW9uKFZlcnNpb24gdmVyc2lvbikKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKQEAgLTM1Nyw3ICszNDksNiBAQAogICAgICAgICBwdWJsaWMgQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyIGJ1aWxkKCkKICAgICAgICAgewogICAgICAgICAgICAgY2hlY2tOb3ROdWxsKHZlcnNpb24pOwotICAgICAgICAgICAgY2hlY2tOb3ROdWxsKGZvcm1hdCk7CiAgICAgICAgICAgICBjaGVja05vdE51bGwoc2VjdGlvbnMpOwogICAgICAgICAgICAgY2hlY2tOb3ROdWxsKHNlcmlhbGl6YXRpb25IZWFkZXIpOwogICAgICAgICAgICAgY2hlY2tOb3ROdWxsKHRhYmxlSWQpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbU1hbmFnZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1NYW5hZ2VyLmphdmEKaW5kZXggNDZjZjI1My4uOGNhN2FjNSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbU1hbmFnZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtTWFuYWdlci5qYXZhCkBAIC0zMCw2ICszMCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlJhbmdlc0F0RW5kcG9pbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZTsKQEAgLTEwNSw3ICsxMDYsMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJlZGljYXRlID0gcyAtPiBzLmlzUGVuZGluZ1JlcGFpcigpICYmIHMuZ2V0U1NUYWJsZU1ldGFkYXRhKCkucGVuZGluZ1JlcGFpci5lcXVhbHMocGVuZGluZ1JlcGFpcik7CisgICAgICAgICAgICAgICAgICAgIHByZWRpY2F0ZSA9IHMgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzc3RhYmxlTWV0YWRhdGEgPSBzLmdldFNTVGFibGVNZXRhZGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNzdGFibGVNZXRhZGF0YS5wZW5kaW5nUmVwYWlyICE9IEFjdGl2ZVJlcGFpclNlcnZpY2UuTk9fUEVORElOR19SRVBBSVIgJiYgc3N0YWJsZU1ldGFkYXRhLnBlbmRpbmdSZXBhaXIuZXF1YWxzKHBlbmRpbmdSZXBhaXIpOworICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvciAoUmFuZ2U8UGFydGl0aW9uUG9zaXRpb24+IGtleVJhbmdlIDoga2V5UmFuZ2VzKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbVJlYWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbVJlYWRlci5qYXZhCmluZGV4IDA0MjY4ZjAuLjIzMjU4MjggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1SZWFkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtUmVhZGVyLmphdmEKQEAgLTM5LDkgKzM5LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Vbmtub3duQ29sdW1uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlTXVsdGlXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlU2ltcGxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CkBAIC03Myw3ICs3Myw2IEBACiAgICAgcHJvdGVjdGVkIGZpbmFsIFZlcnNpb24gaW5wdXRWZXJzaW9uOwogICAgIHByb3RlY3RlZCBmaW5hbCBsb25nIHJlcGFpcmVkQXQ7CiAgICAgcHJvdGVjdGVkIGZpbmFsIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXQ7CiAgICAgcHJvdGVjdGVkIGZpbmFsIGludCBzc3RhYmxlTGV2ZWw7CiAgICAgcHJvdGVjdGVkIGZpbmFsIFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50IGhlYWRlcjsKICAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGZpbGVTZXFOdW07CkBAIC05Myw3ICs5Miw2IEBACiAgICAgICAgIHRoaXMuaW5wdXRWZXJzaW9uID0gc3RyZWFtSGVhZGVyLnZlcnNpb247CiAgICAgICAgIHRoaXMucmVwYWlyZWRBdCA9IGhlYWRlci5yZXBhaXJlZEF0OwogICAgICAgICB0aGlzLnBlbmRpbmdSZXBhaXIgPSBoZWFkZXIucGVuZGluZ1JlcGFpcjsKLSAgICAgICAgdGhpcy5mb3JtYXQgPSBzdHJlYW1IZWFkZXIuZm9ybWF0OwogICAgICAgICB0aGlzLnNzdGFibGVMZXZlbCA9IHN0cmVhbUhlYWRlci5zc3RhYmxlTGV2ZWw7CiAgICAgICAgIHRoaXMuaGVhZGVyID0gc3RyZWFtSGVhZGVyLnNlcmlhbGl6YXRpb25IZWFkZXI7CiAgICAgICAgIHRoaXMuZmlsZVNlcU51bSA9IGhlYWRlci5zZXF1ZW5jZU51bWJlcjsKQEAgLTEyNSw3ICsxMjMsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBUcmFja2VkRGF0YUlucHV0UGx1cyBpbiA9IG5ldyBUcmFja2VkRGF0YUlucHV0UGx1cyhzdHJlYW1Db21wcmVzc2lvbklucHV0U3RyZWFtKTsKICAgICAgICAgICAgIGRlc2VyaWFsaXplciA9IG5ldyBTdHJlYW1EZXNlcmlhbGl6ZXIoY2ZzLm1ldGFkYXRhKCksIGluLCBpbnB1dFZlcnNpb24sIGdldEhlYWRlcihjZnMubWV0YWRhdGEoKSkpOwotICAgICAgICAgICAgd3JpdGVyID0gY3JlYXRlV3JpdGVyKGNmcywgdG90YWxTaXplLCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBmb3JtYXQpOworICAgICAgICAgICAgd3JpdGVyID0gY3JlYXRlV3JpdGVyKGNmcywgdG90YWxTaXplLCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpbnB1dFZlcnNpb24uZm9ybWF0KTsKICAgICAgICAgICAgIFN0cmluZyBzZXF1ZW5jZU5hbWUgPSB3cml0ZXIuZ2V0RmlsZW5hbWUoKSArICctJyArIGZpbGVTZXFOdW07CiAgICAgICAgICAgICBsb25nIGxhc3RCeXRlc1JlYWQgPSAwOwogICAgICAgICAgICAgd2hpbGUgKGluLmdldEJ5dGVzUmVhZCgpIDwgdG90YWxTaXplKQpAQCAtMTU3LDcgKzE1NSw3IEBACiAgICAgICAgIHJldHVybiBoZWFkZXIgIT0gbnVsbD8gaGVhZGVyLnRvSGVhZGVyKG1ldGFkYXRhKSA6IG51bGw7IC8vcHJlLTMuMCBzc3RhYmxlIGhhdmUgbm8gU2VyaWFsaXphdGlvbkhlYWRlcgogICAgIH0KICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHByb3RlY3RlZCBTU1RhYmxlTXVsdGlXcml0ZXIgY3JlYXRlV3JpdGVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywgbG9uZyB0b3RhbFNpemUsIGxvbmcgcmVwYWlyZWRBdCwgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgcHJvdGVjdGVkIFNTVGFibGVNdWx0aVdyaXRlciBjcmVhdGVXcml0ZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBsb25nIHRvdGFsU2l6ZSwgbG9uZyByZXBhaXJlZEF0LCBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyLCBTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5IGxvY2FsRGlyID0gY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0V3JpdGVhYmxlTG9jYXRpb24odG90YWxTaXplKTsKICAgICAgICAgaWYgKGxvY2FsRGlyID09IG51bGwpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtUmVjZWl2ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1SZWNlaXZlci5qYXZhCmluZGV4IDQ4ZGU4YjUuLjUxOGQ1MzcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1SZWNlaXZlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1SZWNlaXZlci5qYXZhCkBAIC0yNSwxOCArMjUsMTYgQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVOZXdUcmFja2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKLQogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLk11dGF0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVOZXdUcmFja2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvblVwZGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlRocm90dGxlZFVuZmlsdGVyZWRJdGVyYXRvcjsKQEAgLTQ1LDYgKzQzLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQm91bmRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlTXVsdGlXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuSW5jb21pbmdTdHJlYW07CkBAIC01NCwxMSArNTMsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFUEFJUl9NVVRBVElPTl9SRVBBSVJfUk9XU19QRVJfQkFUQ0g7CisKIHB1YmxpYyBjbGFzcyBDYXNzYW5kcmFTdHJlYW1SZWNlaXZlciBpbXBsZW1lbnRzIFN0cmVhbVJlY2VpdmVyCiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENhc3NhbmRyYVN0cmVhbVJlY2VpdmVyLmNsYXNzKTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUk9XU19QRVJfQkFUQ0ggPSBJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS5yZXBhaXIubXV0YXRpb25fcmVwYWlyX3Jvd3NfcGVyX2JhdGNoIiwgMTAwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JPV1NfUEVSX0JBVENIID0gUkVQQUlSX01VVEFUSU9OX1JFUEFJUl9ST1dTX1BFUl9CQVRDSC5nZXRJbnQoKTsKIAogICAgIHByaXZhdGUgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOwogICAgIHByaXZhdGUgZmluYWwgU3RyZWFtU2Vzc2lvbiBzZXNzaW9uOwpAQCAtMTcyLDIzICsxNzMsMzEgQEAKICAgICAgICAgcmV0dXJuIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5jZGM7CiAgICAgfQogCisgICAgLy8gcmV0dXJucyB0cnVlIGlpZiBpdCBpcyBhIGNkYyB0YWJsZSBhbmQgY2RjIG9uIHJlcGFpciBpcyBlbmFibGVkLgorICAgIHByaXZhdGUgYm9vbGVhbiBjZGNSZXF1aXJlc1dyaXRlQ29tbWl0TG9nKENvbHVtbkZhbWlseVN0b3JlIGNmcykKKyAgICB7CisgICAgICAgIHJldHVybiBEYXRhYmFzZURlc2NyaXB0b3IuaXNDRENPblJlcGFpckVuYWJsZWQoKSAmJiBoYXNDREMoY2ZzKTsKKyAgICB9CisKICAgICAvKgogICAgICAqIFdlIGhhdmUgYSBzcGVjaWFsIHBhdGggZm9yIHZpZXdzIGFuZCBmb3IgQ0RDLgogICAgICAqCiAgICAgICogRm9yIHZpZXdzLCBzaW5jZSB0aGUgdmlldyByZXF1aXJlcyBjbGVhbmluZyB1cCBhbnkgcHJlLWV4aXN0aW5nIHN0YXRlLCB3ZSBtdXN0IHB1dCBhbGwgcGFydGl0aW9ucwogICAgICAqIHRocm91Z2ggdGhlIHNhbWUgd3JpdGUgcGF0aCBhcyBub3JtYWwgbXV0YXRpb25zLiBUaGlzIGFsc28gZW5zdXJlcyBhbnkgMmlzIGFyZSBhbHNvIHVwZGF0ZWQuCiAgICAgICoKLSAgICAgKiBGb3IgQ0RDLWVuYWJsZWQgdGFibGVzLCB3ZSB3YW50IHRvIGVuc3VyZSB0aGF0IHRoZSBtdXRhdGlvbnMgYXJlIHJ1biB0aHJvdWdoIHRoZSBDb21taXRMb2cgc28gdGhleQotICAgICAqIGNhbiBiZSBhcmNoaXZlZCBieSB0aGUgQ0RDIHByb2Nlc3Mgb24gZGlzY2FyZC4KKyAgICAgKiBGb3IgQ0RDLWVuYWJsZWQgdGFibGVzIGFuZCB3cml0ZSBwYXRoIGZvciBDREMgaXMgZW5hYmxlZCwgd2Ugd2FudCB0byBlbnN1cmUgdGhhdCB0aGUgbXV0YXRpb25zIGFyZQorICAgICAqIHJ1biB0aHJvdWdoIHRoZSBDb21taXRMb2csIHNvIHRoZXkgY2FuIGJlIGFyY2hpdmVkIGJ5IHRoZSBDREMgcHJvY2VzcyBvbiBkaXNjYXJkLgogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiByZXF1aXJlc1dyaXRlUGF0aChDb2x1bW5GYW1pbHlTdG9yZSBjZnMpCiAgICAgewotICAgICAgICByZXR1cm4gaGFzQ0RDKGNmcykgfHwgY2ZzLnN0cmVhbVRvTWVtdGFibGUoKSB8fCAoc2Vzc2lvbi5zdHJlYW1PcGVyYXRpb24oKS5yZXF1aXJlc1ZpZXdCdWlsZCgpICYmIGhhc1ZpZXdzKGNmcykpOworICAgICAgICByZXR1cm4gY2RjUmVxdWlyZXNXcml0ZUNvbW1pdExvZyhjZnMpCisgICAgICAgICAgICAgICB8fCBjZnMuc3RyZWFtVG9NZW10YWJsZSgpCisgICAgICAgICAgICAgICB8fCAoc2Vzc2lvbi5zdHJlYW1PcGVyYXRpb24oKS5yZXF1aXJlc1ZpZXdCdWlsZCgpICYmIGhhc1ZpZXdzKGNmcykpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBzZW5kVGhyb3VnaFdyaXRlUGF0aChDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gcmVhZGVycykKICAgICB7Ci0gICAgICAgIGJvb2xlYW4gaGFzQ2RjID0gaGFzQ0RDKGNmcyk7CisgICAgICAgIGJvb2xlYW4gd3JpdGVDRENDb21taXRMb2cgPSBjZGNSZXF1aXJlc1dyaXRlQ29tbWl0TG9nKGNmcyk7CiAgICAgICAgIENvbHVtbkZpbHRlciBmaWx0ZXIgPSBDb2x1bW5GaWx0ZXIuYWxsKGNmcy5tZXRhZGF0YSgpKTsKICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHJlYWRlciA6IHJlYWRlcnMpCiAgICAgICAgIHsKQEAgLTIwNiw3ICsyMTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgQ0ZTIGhhcyBDREMsIGhvd2V2ZXIsIHRoZXNlIHVwZGF0ZXMgbmVlZCB0byBiZSB3cml0dGVuIHRvIHRoZSBDb21taXRMb2cKICAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhleSBnZXQgYXJjaGl2ZWQgaW50byB0aGUgY2RjX3JhdyBmb2xkZXIKICAgICAgICAgICAgICAgICAgICAga3MuYXBwbHkobmV3IE11dGF0aW9uKFBhcnRpdGlvblVwZGF0ZS5mcm9tSXRlcmF0b3IodGhyb3R0bGVkUGFydGl0aW9ucy5uZXh0KCksIGZpbHRlcikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDZGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlQ0RDQ29tbWl0TG9nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbVdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbVdyaXRlci5qYXZhCmluZGV4IDlkOWVhM2MuLjNlOThjN2QgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1Xcml0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtV3JpdGVyLmphdmEKQEAgLTIxLDIzICsyMSwyMSBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG5ldC5qcG91bnR6Lmx6NC5MWjRDb21wcmVzc29yOwogaW1wb3J0IG5ldC5qcG91bnR6Lmx6NC5MWjRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkJ1ZmZlclR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5DaGFubmVsUHJveHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW50ZWdyaXR5TWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW50ZWdyaXR5TWV0YWRhdGEuQ2hlY2tzdW1WYWxpZGF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlByb2dyZXNzSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtaW5nRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbU1hbmFnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbU1hbmFnZXIuU3RyZWFtUmF0ZUxpbWl0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbWluZ0RhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5hc3luYy5TdHJlYW1Db21wcmVzc2lvblNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5LkJ1ZmZlclBvb2xzOwpAQCAtODQsOSArODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRGaWxlbmFtZSgpLCBzZXNzaW9uLnBlZXIsIHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkucmVwYWlyZWRBdCwgdG90YWxTaXplKTsKIAogICAgICAgICB0cnkoQ2hhbm5lbFByb3h5IHByb3h5ID0gc3N0YWJsZS5nZXREYXRhQ2hhbm5lbCgpLm5ld0NoYW5uZWwoKTsKLSAgICAgICAgICAgIENoZWNrc3VtVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuQ1JDKSkuZXhpc3RzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRGF0YUludGVncml0eU1ldGFkYXRhLmNoZWNrc3VtVmFsaWRhdG9yKHNzdGFibGUuZGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCkKKyAgICAgICAgICAgIENoZWNrc3VtVmFsaWRhdG9yIHZhbGlkYXRvciA9IHNzdGFibGUubWF5YmVHZXRDaGVja3N1bVZhbGlkYXRvcigpKQogICAgICAgICB7CiAgICAgICAgICAgICBpbnQgYnVmZmVyU2l6ZSA9IHZhbGlkYXRvciA9PSBudWxsID8gREVGQVVMVF9DSFVOS19TSVpFOiB2YWxpZGF0b3IuY2h1bmtTaXplOwogCkBAIC05NCw3ICs5MCw3IEBACiAgICAgICAgICAgICBsb25nIHByb2dyZXNzID0gMEw7CiAKICAgICAgICAgICAgIC8vIHN0cmVhbSBlYWNoIG9mIHRoZSByZXF1aXJlZCBzZWN0aW9ucyBvZiB0aGUgZmlsZQotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKTsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkudG9TdHJpbmcoKTsKICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlci5QYXJ0aXRpb25Qb3NpdGlvbkJvdW5kcyBzZWN0aW9uIDogc2VjdGlvbnMpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbG9uZyBzdGFydCA9IHZhbGlkYXRvciA9PSBudWxsID8gc2VjdGlvbi5sb3dlclBvc2l0aW9uIDogdmFsaWRhdG9yLmNodW5rU3RhcnQoc2VjdGlvbi5sb3dlclBvc2l0aW9uKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9Db21wb25lbnRDb250ZXh0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ29tcG9uZW50Q29udGV4dC5qYXZhCmluZGV4IGM4YzA4YWEuLjE2NGRkNmIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9Db21wb25lbnRDb250ZXh0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0NvbXBvbmVudENvbnRleHQuamF2YQpAQCAtMTgsMzIgKzE4LDIzIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuc3RyZWFtaW5nOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIE11dGFibGUgU1NUYWJsZSBjb21wb25lbnRzIGFuZCB0aGVpciBoYXJkbGlua3MgdG8gYXZvaWQgY29uY3VycmVudCBzc3RhYmxlIGNvbXBvbmVudCBtb2RpZmljYXRpb24KLSAqIGR1cmluZyBlbnRpcmUtc3N0YWJsZS1zdHJlYW1pbmcuCi0gKi8KIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiAKIHB1YmxpYyBjbGFzcyBDb21wb25lbnRDb250ZXh0IGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb21wb25lbnRDb250ZXh0LmNsYXNzKTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDb21wb25lbnQ+IE1VVEFCTEVfQ09NUE9ORU5UUyA9IEltbXV0YWJsZVNldC5vZihDb21wb25lbnQuU1RBVFMsIENvbXBvbmVudC5TVU1NQVJZKTsKLQogICAgIHByaXZhdGUgZmluYWwgTWFwPENvbXBvbmVudCwgRmlsZT4gaGFyZExpbmtzOwogICAgIHByaXZhdGUgZmluYWwgQ29tcG9uZW50TWFuaWZlc3QgbWFuaWZlc3Q7CiAKQEAgLTU3LDEzICs0OCwxMyBAQAogICAgIHsKICAgICAgICAgTWFwPENvbXBvbmVudCwgRmlsZT4gaGFyZExpbmtzID0gbmV3IEhhc2hNYXA8PigxKTsKIAotICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBNVVRBQkxFX0NPTVBPTkVOVFMpCisgICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkubXV0YWJsZUNvbXBvbmVudHMoKSkKICAgICAgICAgewotICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb21wb25lbnQpKTsKKyAgICAgICAgICAgIEZpbGUgZmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpOwogICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgICBGaWxlIGhhcmRsaW5rID0gbmV3IEZpbGUoZGVzY3JpcHRvci50bXBGaWxlbmFtZUZvclN0cmVhbWluZyhjb21wb25lbnQpKTsKKyAgICAgICAgICAgIEZpbGUgaGFyZGxpbmsgPSBkZXNjcmlwdG9yLnRtcEZpbGVGb3JTdHJlYW1pbmcoY29tcG9uZW50KTsKICAgICAgICAgICAgIEZpbGVVdGlscy5jcmVhdGVIYXJkTGluayhmaWxlLCBoYXJkbGluayk7CiAgICAgICAgICAgICBoYXJkTGlua3MucHV0KGNvbXBvbmVudCwgaGFyZGxpbmspOwogICAgICAgICB9CkBAIC04MSw5ICs3Miw5IEBACiAgICAgICovCiAgICAgcHVibGljIEZpbGVDaGFubmVsIGNoYW5uZWwoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBDb21wb25lbnQgY29tcG9uZW50LCBsb25nIHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3RyaW5nIHRvVHJhbnNmZXIgPSBoYXJkTGlua3MuY29udGFpbnNLZXkoY29tcG9uZW50KSA/IGhhcmRMaW5rcy5nZXQoY29tcG9uZW50KS5wYXRoKCkgOiBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGNvbXBvbmVudCk7CisgICAgICAgIEZpbGUgdG9UcmFuc2ZlciA9IGhhcmRMaW5rcy5jb250YWluc0tleShjb21wb25lbnQpID8gaGFyZExpbmtzLmdldChjb21wb25lbnQpIDogZGVzY3JpcHRvci5maWxlRm9yKGNvbXBvbmVudCk7CiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIGZpbGUgY2hhbm5lbCB3aWxsIGJlIGNsb3NlZCBieSBDYWxsZXIKLSAgICAgICAgRmlsZUNoYW5uZWwgY2hhbm5lbCA9IG5ldyBGaWxlKHRvVHJhbnNmZXIpLm5ld1JlYWRDaGFubmVsKCk7CisgICAgICAgIEZpbGVDaGFubmVsIGNoYW5uZWwgPSB0b1RyYW5zZmVyLm5ld1JlYWRDaGFubmVsKCk7CiAKICAgICAgICAgYXNzZXJ0IHNpemUgPT0gY2hhbm5lbC5zaXplKCkgOiBTdHJpbmcuZm9ybWF0KCJFbnRpcmUgc3N0YWJsZSBzdHJlYW1pbmcgZXhwZWN0cyAlcyBmaWxlIHNpemUgdG8gYmUgJXMgYnV0IGdvdCAlcy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LCBzaXplLCBjaGFubmVsLnNpemUoKSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ29tcG9uZW50TWFuaWZlc3QuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9Db21wb25lbnRNYW5pZmVzdC5qYXZhCmluZGV4IGI3N2I1OTQuLjVlM2NjMGMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9Db21wb25lbnRNYW5pZmVzdC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9Db21wb25lbnRNYW5pZmVzdC5qYXZhCkBAIC0xOCwzMCArMTgsMzIgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5zdHJlYW1pbmc7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5JVmVyc2lvbmVkU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogCiAvKioKICAqIFNTVGFibGUgY29tcG9uZW50cyBhbmQgdGhlaXIgc2l6ZXMgdG8gYmUgdHJhbmZlcmVkIHZpYSBlbnRpcmUtc3N0YWJsZS1zdHJlYW1pbmcKICAqLwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKLQogcHVibGljIGZpbmFsIGNsYXNzIENvbXBvbmVudE1hbmlmZXN0IGltcGxlbWVudHMgSXRlcmFibGU8Q29tcG9uZW50PgogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8Q29tcG9uZW50PiBTVFJFQU1fQ09NUE9ORU5UUyA9IEltbXV0YWJsZUxpc3Qub2YoQ29tcG9uZW50LkRBVEEsIENvbXBvbmVudC5QUklNQVJZX0lOREVYLCBDb21wb25lbnQuU1RBVFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudC5DT01QUkVTU0lPTl9JTkZPLCBDb21wb25lbnQuRklMVEVSLCBDb21wb25lbnQuU1VNTUFSWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50LkRJR0VTVCwgQ29tcG9uZW50LkNSQyk7Ci0KICAgICBwcml2YXRlIGZpbmFsIExpbmtlZEhhc2hNYXA8Q29tcG9uZW50LCBMb25nPiBjb21wb25lbnRzOwogCiAgICAgcHVibGljIENvbXBvbmVudE1hbmlmZXN0KE1hcDxDb21wb25lbnQsIExvbmc+IGNvbXBvbmVudHMpCkBAIC01MiwxMSArNTQsMTEgQEAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBwdWJsaWMgc3RhdGljIENvbXBvbmVudE1hbmlmZXN0IGNyZWF0ZShEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCiAgICAgewotICAgICAgICBMaW5rZWRIYXNoTWFwPENvbXBvbmVudCwgTG9uZz4gY29tcG9uZW50cyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oU1RSRUFNX0NPTVBPTkVOVFMuc2l6ZSgpKTsKKyAgICAgICAgTGlua2VkSGFzaE1hcDxDb21wb25lbnQsIExvbmc+IGNvbXBvbmVudHMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KGRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuc3RyZWFtaW5nQ29tcG9uZW50cygpLnNpemUoKSk7CiAKLSAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogU1RSRUFNX0NPTVBPTkVOVFMpCisgICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuc3RyZWFtaW5nQ29tcG9uZW50cygpKQogICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpOworICAgICAgICAgICAgRmlsZSBmaWxlID0gZGVzY3JpcHRvci5maWxlRm9yKGNvbXBvbmVudCk7CiAgICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAKQEAgLTExNCw0NSArMTE2LDU4IEBACiAgICAgICAgICAgICAgICAnfSc7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBJVmVyc2lvbmVkU2VyaWFsaXplcjxDb21wb25lbnRNYW5pZmVzdD4gc2VyaWFsaXplciA9IG5ldyBJVmVyc2lvbmVkU2VyaWFsaXplcjxDb21wb25lbnRNYW5pZmVzdD4oKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSVZlcnNpb25lZFNlcmlhbGl6ZXI8Q29tcG9uZW50TWFuaWZlc3Q+PiBzZXJpYWxpemVyczsKKworICAgIHN0YXRpYwogICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKENvbXBvbmVudE1hbmlmZXN0IG1hbmlmZXN0LCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgSW1tdXRhYmxlTWFwLkJ1aWxkZXI8U3RyaW5nLCBJVmVyc2lvbmVkU2VyaWFsaXplcjxDb21wb25lbnRNYW5pZmVzdD4+IGIgPSBJbW11dGFibGVNYXAuYnVpbGRlcigpOworICAgICAgICBmb3IgKFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0IDogRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTVGFibGVGb3JtYXRzKCkudmFsdWVzKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChtYW5pZmVzdC5jb21wb25lbnRzLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxDb21wb25lbnQsIExvbmc+IGVudHJ5IDogbWFuaWZlc3QuY29tcG9uZW50cy5lbnRyeVNldCgpKQorICAgICAgICAgICAgSVZlcnNpb25lZFNlcmlhbGl6ZXI8Q29tcG9uZW50TWFuaWZlc3Q+IHNlcmlhbGl6ZXIgPSBuZXcgSVZlcnNpb25lZFNlcmlhbGl6ZXI8Q29tcG9uZW50TWFuaWZlc3Q+KCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYoZW50cnkuZ2V0S2V5KCkubmFtZSk7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKENvbXBvbmVudE1hbmlmZXN0IG1hbmlmZXN0LCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKG1hbmlmZXN0LmNvbXBvbmVudHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8Q29tcG9uZW50LCBMb25nPiBlbnRyeSA6IG1hbmlmZXN0LmNvbXBvbmVudHMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVVRGKGVudHJ5LmdldEtleSgpLm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVibGljIENvbXBvbmVudE1hbmlmZXN0IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgTGlua2VkSGFzaE1hcDxDb21wb25lbnQsIExvbmc+IGNvbXBvbmVudHMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KHNpemUpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50LnBhcnNlKGluLnJlYWRVVEYoKSwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGVuZ3RoID0gaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXQoY29tcG9uZW50LCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRNYW5pZmVzdChjb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBzZXJpYWxpemVkU2l6ZShDb21wb25lbnRNYW5pZmVzdCBtYW5pZmVzdCwgaW50IHZlcnNpb24pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb25nIHNpemUgPSBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KG1hbmlmZXN0LmNvbXBvbmVudHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8Q29tcG9uZW50LCBMb25nPiBlbnRyeSA6IG1hbmlmZXN0LmNvbXBvbmVudHMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mKGVudHJ5LmdldEtleSgpLm5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGIucHV0KGZvcm1hdC5uYW1lKCksIHNlcmlhbGl6ZXIpOwogICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbXBvbmVudE1hbmlmZXN0IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaW50IHNpemUgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0KLSAgICAgICAgICAgIExpbmtlZEhhc2hNYXA8Q29tcG9uZW50LCBMb25nPiBjb21wb25lbnRzID0gbmV3IExpbmtlZEhhc2hNYXA8PihzaXplKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudC5wYXJzZShpbi5yZWFkVVRGKCkpOwotICAgICAgICAgICAgICAgIGxvbmcgbGVuZ3RoID0gaW4ucmVhZFVuc2lnbmVkVkludCgpOwotICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHV0KGNvbXBvbmVudCwgbGVuZ3RoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRNYW5pZmVzdChjb21wb25lbnRzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIHNlcmlhbGl6ZWRTaXplKENvbXBvbmVudE1hbmlmZXN0IG1hbmlmZXN0LCBpbnQgdmVyc2lvbikKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBzaXplID0gVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludChtYW5pZmVzdC5jb21wb25lbnRzLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxDb21wb25lbnQsIExvbmc+IGVudHJ5IDogbWFuaWZlc3QuY29tcG9uZW50cy5lbnRyeVNldCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNpemUgKz0gVHlwZVNpemVzLnNpemVvZihlbnRyeS5nZXRLZXkoKS5uYW1lKTsKLSAgICAgICAgICAgICAgICBzaXplICs9IFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgfQotICAgIH07CisgICAgICAgIHNlcmlhbGl6ZXJzID0gYi5idWlsZCgpOworICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBJdGVyYXRvcjxDb21wb25lbnQ+IGl0ZXJhdG9yKCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyYW5zZm9ybS9CYXNlUGFydGl0aW9ucy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJhbnNmb3JtL0Jhc2VQYXJ0aXRpb25zLmphdmEKaW5kZXggNDY0YWU2Zi4uNzllODk1MiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJhbnNmb3JtL0Jhc2VQYXJ0aXRpb25zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJhbnNmb3JtL0Jhc2VQYXJ0aXRpb25zLmphdmEKQEAgLTIwLDggKzIwLDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm07CiAKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkJhc2VQYXJ0aXRpb25JdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJhc2VSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwpAQCAtMTEyLDcgKzExMCw3IEBACiAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKICAgICAgICAgewogICAgICAgICAgICAgaWYgKG5leHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBUaHJvd2FibGVzLmNsb3NlKHQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXh0KSk7CisgICAgICAgICAgICAgICAgVGhyb3dhYmxlcy5jbG9zZSh0LCBuZXh0KTsKICAgICAgICAgICAgIHRocm93IHQ7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmFuc2Zvcm0vUlRCb3VuZFZhbGlkYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJhbnNmb3JtL1JUQm91bmRWYWxpZGF0b3IuamF2YQppbmRleCBlYjM3ZjRiLi5lMTk3Y2UyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmFuc2Zvcm0vUlRCb3VuZFZhbGlkYXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyYW5zZm9ybS9SVEJvdW5kVmFsaWRhdG9yLmphdmEKQEAgLTE3LDExICsxNywxMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyYW5zZm9ybTsKIAoraW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUmFuZ2VUb21ic3RvbmVNYXJrZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiAKIC8qKgogICogQSB2YWxpZGF0aW5nIHRyYW5zZm9ybWF0aW9uIHRoYXQgc2FuaXR5LWNoZWNrcyB0aGUgc2VxdWVuY2Ugb2YgUlQgYm91bmRzIGFuZCBib3VuZGFyaWVzIGluIGV2ZXJ5IHBhcnRpdGlvbi4KQEAgLTUxLDI5ICs1MiwyNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdmFsaWRhdGUoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbiwgU3RhZ2Ugc3RhZ2UsIGJvb2xlYW4gZW5mb3JjZUlzQ2xvc2VkKQogICAgIHsKLSAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWF0aW9uLmFwcGx5KHBhcnRpdGlvbiwgbmV3IFJvd3NUcmFuc2Zvcm1hdGlvbihzdGFnZSwgcGFydGl0aW9uLm1ldGFkYXRhKCksIHBhcnRpdGlvbi5pc1JldmVyc2VPcmRlcigpLCBlbmZvcmNlSXNDbG9zZWQpKTsKKyAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWF0aW9uLmFwcGx5KHBhcnRpdGlvbiwgbmV3IFJvd3NUcmFuc2Zvcm1hdGlvbihzdGFnZSwgcGFydGl0aW9uLCBlbmZvcmNlSXNDbG9zZWQpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGFwcGx5VG9QYXJ0aXRpb24oVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbikKICAgICB7Ci0gICAgICAgIHJldHVybiBUcmFuc2Zvcm1hdGlvbi5hcHBseShwYXJ0aXRpb24sIG5ldyBSb3dzVHJhbnNmb3JtYXRpb24oc3RhZ2UsIHBhcnRpdGlvbi5tZXRhZGF0YSgpLCBwYXJ0aXRpb24uaXNSZXZlcnNlT3JkZXIoKSwgZW5mb3JjZUlzQ2xvc2VkKSk7CisgICAgICAgIHJldHVybiBUcmFuc2Zvcm1hdGlvbi5hcHBseShwYXJ0aXRpb24sIG5ldyBSb3dzVHJhbnNmb3JtYXRpb24oc3RhZ2UsIHBhcnRpdGlvbiwgZW5mb3JjZUlzQ2xvc2VkKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgY2xhc3MgUm93c1RyYW5zZm9ybWF0aW9uIGV4dGVuZHMgVHJhbnNmb3JtYXRpb24KICAgICB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgU3RhZ2Ugc3RhZ2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzUmV2ZXJzZU9yZGVyOwogICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZW5mb3JjZUlzQ2xvc2VkOworICAgICAgICBwcml2YXRlIGZpbmFsIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb247CiAKICAgICAgICAgcHJpdmF0ZSBEZWxldGlvblRpbWUgb3Blbk1hcmtlckRlbGV0aW9uVGltZTsKIAotICAgICAgICBwcml2YXRlIFJvd3NUcmFuc2Zvcm1hdGlvbihTdGFnZSBzdGFnZSwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgYm9vbGVhbiBpc1JldmVyc2VPcmRlciwgYm9vbGVhbiBlbmZvcmNlSXNDbG9zZWQpCisgICAgICAgIHByaXZhdGUgUm93c1RyYW5zZm9ybWF0aW9uKFN0YWdlIHN0YWdlLCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgcGFydGl0aW9uLCBib29sZWFuIGVuZm9yY2VJc0Nsb3NlZCkKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5zdGFnZSA9IHN0YWdlOwotICAgICAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgdGhpcy5pc1JldmVyc2VPcmRlciA9IGlzUmV2ZXJzZU9yZGVyOworICAgICAgICAgICAgdGhpcy5wYXJ0aXRpb24gPSBwYXJ0aXRpb247CiAgICAgICAgICAgICB0aGlzLmVuZm9yY2VJc0Nsb3NlZCA9IGVuZm9yY2VJc0Nsb3NlZDsKICAgICAgICAgfQogCkBAIC04MywyNSArODIsMjUgQEAKICAgICAgICAgICAgIGlmIChudWxsID09IG9wZW5NYXJrZXJEZWxldGlvblRpbWUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIG9wZW4gUlQgaW4gdGhlIHN0cmVhbSAtIHdlIGFyZSBleHBlY3RpbmcgYSAqX1NUQVJUX0JPVU5ECi0gICAgICAgICAgICAgICAgaWYgKG1hcmtlci5pc0Nsb3NlKGlzUmV2ZXJzZU9yZGVyKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgaXNlKCJ1bmV4cGVjdGVkIGVuZCBib3VuZCBvciBib3VuZGFyeSAiICsgbWFya2VyLnRvU3RyaW5nKG1ldGFkYXRhKSk7CisgICAgICAgICAgICAgICAgaWYgKG1hcmtlci5pc0Nsb3NlKHBhcnRpdGlvbi5pc1JldmVyc2VPcmRlcigpKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgaXNlKCJ1bmV4cGVjdGVkIGVuZCBib3VuZCBvciBib3VuZGFyeSAiICsgbWFya2VyLnRvU3RyaW5nKHBhcnRpdGlvbi5tZXRhZGF0YSgpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gb3BlbiBSVCBpbiB0aGUgc3RyZWFtIC0gd2UgYXJlIGV4cGVjdGluZyBhICpfQk9VTkRBUlkgb3IgYW4gKl9FTkRfQk9VTkQKLSAgICAgICAgICAgICAgICBpZiAoIW1hcmtlci5pc0Nsb3NlKGlzUmV2ZXJzZU9yZGVyKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgaXNlKCJzdGFydCBib3VuZCBmb2xsb3dlZCBieSBhbm90aGVyIHN0YXJ0IGJvdW5kICIgKyBtYXJrZXIudG9TdHJpbmcobWV0YWRhdGEpKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1hcmtlci5pc0Nsb3NlKHBhcnRpdGlvbi5pc1JldmVyc2VPcmRlcigpKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgaXNlKCJzdGFydCBib3VuZCBmb2xsb3dlZCBieSBhbm90aGVyIHN0YXJ0IGJvdW5kICIgKyBtYXJrZXIudG9TdHJpbmcocGFydGl0aW9uLm1ldGFkYXRhKCkpKTsKIAogICAgICAgICAgICAgICAgIC8vIGRlbGV0aW9uIHRpbWVzIG9mIG9wZW4vY2xvc2UgbWFya2VycyBtdXN0IG1hdGNoCi0gICAgICAgICAgICAgICAgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSA9IG1hcmtlci5jbG9zZURlbGV0aW9uVGltZShpc1JldmVyc2VPcmRlcik7CisgICAgICAgICAgICAgICAgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSA9IG1hcmtlci5jbG9zZURlbGV0aW9uVGltZShwYXJ0aXRpb24uaXNSZXZlcnNlT3JkZXIoKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFkZWxldGlvblRpbWUuZXF1YWxzKG9wZW5NYXJrZXJEZWxldGlvblRpbWUpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBpc2UoIm9wZW4gbWFya2VyIGFuZCBjbG9zZSBtYXJrZXIgaGF2ZSBkaWZmZXJlbnQgZGVsZXRpb24gdGltZXMiKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgaXNlKCJvcGVuIG1hcmtlciBhbmQgY2xvc2UgbWFya2VyIGhhdmUgZGlmZmVyZW50IGRlbGV0aW9uIHRpbWVzLCBjbG9zZT0iICsgZGVsZXRpb25UaW1lKTsKIAogICAgICAgICAgICAgICAgIG9wZW5NYXJrZXJEZWxldGlvblRpbWUgPSBudWxsOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobWFya2VyLmlzT3Blbihpc1JldmVyc2VPcmRlcikpCi0gICAgICAgICAgICAgICAgb3Blbk1hcmtlckRlbGV0aW9uVGltZSA9IG1hcmtlci5vcGVuRGVsZXRpb25UaW1lKGlzUmV2ZXJzZU9yZGVyKTsKKyAgICAgICAgICAgIGlmIChtYXJrZXIuaXNPcGVuKHBhcnRpdGlvbi5pc1JldmVyc2VPcmRlcigpKSkKKyAgICAgICAgICAgICAgICBvcGVuTWFya2VyRGVsZXRpb25UaW1lID0gbWFya2VyLm9wZW5EZWxldGlvblRpbWUocGFydGl0aW9uLmlzUmV2ZXJzZU9yZGVyKCkpOwogCiAgICAgICAgICAgICByZXR1cm4gbWFya2VyOwogICAgICAgICB9CkBAIC0xMTUsOSArMTE0LDE3IEBACiAKICAgICAgICAgcHJpdmF0ZSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXNlKFN0cmluZyB3aHkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0KLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcyBVbmZpbHRlcmVkUm93SXRlcmF0b3IgZm9yICVzIGhhcyBhbiBpbGxlZ2FsIFJUIGJvdW5kcyBzZXF1ZW5jZTogJXMiLCBzdGFnZSwgbWV0YWRhdGEsIHdoeSk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihtZXNzYWdlKHdoeSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZShTdHJpbmcgd2h5KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGZvciAlcyAoa2V5OiAlcyBvbWR0OiBbJXNdKSBoYXMgYW4gaWxsZWdhbCBSVCBib3VuZHMgc2VxdWVuY2U6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uLm1ldGFkYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24ubWV0YWRhdGEoKS5wYXJ0aXRpb25LZXlUeXBlLmdldFN0cmluZyhwYXJ0aXRpb24ucGFydGl0aW9uS2V5KCkuZ2V0S2V5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0cy50b1N0cmluZyhvcGVuTWFya2VyRGVsZXRpb25UaW1lLCAibm90IHByZXNlbnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoeSk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Db2xsZWN0aW9uTWVyZ2VUcmllLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Db2xsZWN0aW9uTWVyZ2VUcmllLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzNjkxMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0NvbGxlY3Rpb25NZXJnZVRyaWUuamF2YQpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CisKKy8qKgorICogQSBtZXJnZWQgdmlldyBvZiBtdWx0aXBsZSB0cmllcy4KKyAqCisgKiBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSB3YWxraW5nIHRoZSBjdXJzb3JzIGluIHBhcmFsbGVsOyB0aGUgbWVyZ2VkIGN1cnNvciB0YWtlcyB0aGUgcG9zaXRpb24gYW5kIGZlYXR1cmVzIG9mIHRoZQorICogc21hbGxlc3QgYW5kIGFkdmFuY2VzIHdpdGggaXQ7IHdoZW4gbXVsdGlwbGUgY3Vyc29ycyBhcmUgZXF1YWwsIGFsbCBvZiB0aGVtIGFyZSBhZHZhbmNlZC4gVGhlIG9yZGVyZWQgdmlldyBvZiB0aGUKKyAqIGN1cnNvcnMgaXMgbWFpbnRhaW5lZCB1c2luZyBhIGN1c3RvbSBiaW5hcnkgbWluLWhlYXAsIGJ1aWx0IGZvciBlZmZpY2llbnRseSByZWZvcm1pbmcgdGhlIGhlYXAgd2hlbiB0aGUgdG9wIGVsZW1lbnRzCisgKiBhcmUgYWR2YW5jZWQgKHNlZSB7QGxpbmsgQ29sbGVjdGlvbk1lcmdlQ3Vyc29yfSkuCisgKgorICogQ3J1Y2lhbCBmb3IgdGhlIGVmZmljaWVuY3kgb2YgdGhpcyBpcyB0aGUgZmFjdCB0aGF0IHdoZW4gdGhleSBhcmUgYWR2YW5jZWQgbGlrZSB0aGlzLCB3ZSBjYW4gY29tcGFyZSBjdXJzb3JzJworICogcG9zaXRpb25zIGJ5IHRoZWlyIGRlcHRoIGRlc2NlbmRpbmcgYW5kIHRoZW4gaW5jb21pbmdUcmFuc2l0aW9uIGFzY2VuZGluZy4KKyAqCisgKiBTZWUgVHJpZS5tZCBmb3IgZnVydGhlciBkZXRhaWxzLgorICovCitjbGFzcyBDb2xsZWN0aW9uTWVyZ2VUcmllPFQ+IGV4dGVuZHMgVHJpZTxUPgoreworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbk1lcmdlUmVzb2x2ZXI8VD4gcmVzb2x2ZXI7ICAvLyBvbmx5IGNhbGxlZCBvbiBtb3JlIHRoYW4gb25lIGlucHV0CisgICAgcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb248PyBleHRlbmRzIFRyaWU8VD4+IGlucHV0czsKKworICAgIENvbGxlY3Rpb25NZXJnZVRyaWUoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVHJpZTxUPj4gaW5wdXRzLCBDb2xsZWN0aW9uTWVyZ2VSZXNvbHZlcjxUPiByZXNvbHZlcikKKyAgICB7CisgICAgICAgIHRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKKyAgICAgICAgdGhpcy5pbnB1dHMgPSBpbnB1dHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEN1cnNvcjxUPiBjdXJzb3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uTWVyZ2VDdXJzb3I8PihyZXNvbHZlciwgaW5wdXRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHRoZSBwb3NpdGlvbnMgb2YgdHdvIGN1cnNvcnMuIE9uZSBpcyBiZWZvcmUgdGhlIG90aGVyIHdoZW4KKyAgICAgKiAtIGl0cyBkZXB0aCBpcyBncmVhdGVyLCBvcgorICAgICAqIC0gaXRzIGRlcHRoIGlzIGVxdWFsLCBhbmQgdGhlIGluY29taW5nIHRyYW5zaXRpb24gaXMgc21hbGxlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgPFQ+IGJvb2xlYW4gZ3JlYXRlckN1cnNvcihDdXJzb3I8VD4gYzEsIEN1cnNvcjxUPiBjMikKKyAgICB7CisgICAgICAgIGludCBjMWRlcHRoID0gYzEuZGVwdGgoKTsKKyAgICAgICAgaW50IGMyZGVwdGggPSBjMi5kZXB0aCgpOworICAgICAgICBpZiAoYzFkZXB0aCAhPSBjMmRlcHRoKQorICAgICAgICAgICAgcmV0dXJuIGMxZGVwdGggPCBjMmRlcHRoOworICAgICAgICByZXR1cm4gYzEuaW5jb21pbmdUcmFuc2l0aW9uKCkgPiBjMi5pbmNvbWluZ1RyYW5zaXRpb24oKTsKKyAgICB9CisKKyAgICBzdGF0aWMgPFQ+IGJvb2xlYW4gZXF1YWxDdXJzb3IoQ3Vyc29yPFQ+IGMxLCBDdXJzb3I8VD4gYzIpCisgICAgeworICAgICAgICByZXR1cm4gYzEuZGVwdGgoKSA9PSBjMi5kZXB0aCgpICYmIGMxLmluY29taW5nVHJhbnNpdGlvbigpID09IGMyLmluY29taW5nVHJhbnNpdGlvbigpOworICAgIH0KKworICAgIC8qCisgICAgICogVGhlIG1lcmdlIGN1cnNvciBpcyBhIHZhcmlhdGlvbiBvZiB0aGUgaWRlYSBvZiBhIG1lcmdlIGl0ZXJhdG9yIHdpdGggb25lIGtleSBvYnNlcnZhdGlvbjogYmVjYXVzZSB3ZSBhZHZhbmNlCisgICAgICogdGhlIHNvdXJjZSBpdGVyYXRvcnMgdG9nZXRoZXIsIHdlIGNhbiBjb21wYXJlIHRoZW0ganVzdCBieSBkZXB0aCBhbmQgaW5jb21pbmcgdHJhbnNpdGlvbi4KKyAgICAgKgorICAgICAqIFRoZSBtb3N0IHN0cmFpZ2h0Zm9yd2FyZCB3YXkgdG8gaW1wbGVtZW50IG1lcmdpbmcgb2YgaXRlcmF0b3JzIGlzIHRvIHVzZSBhIHtAY29kZSBQcmlvcml0eVF1ZXVlfSwKKyAgICAgKiB7QGNvZGUgcG9sbH0gaXQgdG8gZmluZCB0aGUgbmV4dCBpdGVtIHRvIGNvbnN1bWUsIHRoZW4ge0Bjb2RlIGFkZH0gdGhlIGl0ZXJhdG9yIGJhY2sgYWZ0ZXIgYWR2YW5jaW5nLgorICAgICAqIFRoaXMgaXMgbm90IHZlcnkgZWZmaWNpZW50IGFzIHtAY29kZSBwb2xsfSBhbmQge0Bjb2RlIGFkZH0gaW4gYWxsIGNhc2VzIHJlcXVpcmUgYXQgbGVhc3QKKyAgICAgKiB7QGNvZGUgbG9nKHNpemUpfSBjb21wYXJpc29ucyBhbmQgc3dhcHMgKHVzdWFsbHkgbW9yZSB0aGFuIHtAY29kZSAyKmxvZyhzaXplKX0pIHBlciBjb25zdW1lZCBpdGVtLCBldmVuCisgICAgICogaWYgdGhlIGlucHV0IGlzIHN1aXRhYmxlIGZvciBmYXN0IGl0ZXJhdGlvbi4KKyAgICAgKgorICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBiZWxvdyBtYWtlcyB1c2Ugb2YgdGhlIGZhY3QgdGhhdCByZXBsYWNpbmcgdGhlIHRvcCBlbGVtZW50IGluIGEgYmluYXJ5IGhlYXAgY2FuIGJlCisgICAgICogZG9uZSBtdWNoIG1vcmUgZWZmaWNpZW50bHkgdGhhbiBzZXBhcmF0ZWx5IHJlbW92aW5nIGl0IGFuZCBwbGFjaW5nIGl0IGJhY2ssIGVzcGVjaWFsbHkgaW4gdGhlIGNhc2VzIHdoZXJlCisgICAgICogdGhlIHRvcCBpdGVyYXRvciBpcyB0byBiZSB1c2VkIGFnYWluIHZlcnkgc29vbiAoZS5nLiB3aGVuIHRoZXJlIGFyZSBsYXJnZSBzZWN0aW9ucyBvZiB0aGUgb3V0cHV0IHdoZXJlCisgICAgICogb25seSBhIGxpbWl0ZWQgbnVtYmVyIG9mIGlucHV0IGl0ZXJhdG9ycyBvdmVybGFwLCB3aGljaCBpcyBub3JtYWxseSB0aGUgY2FzZSBpbiBtYW55IHByYWN0aWNhbGx5IHVzZWZ1bAorICAgICAqIHNpdHVhdGlvbnMsIGUuZy4gbGV2ZWxsZWQgY29tcGFjdGlvbikuCisgICAgICoKKyAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gYnVpbGRzIGFuZCBtYWludGFpbnMgYSBiaW5hcnkgaGVhcCBvZiBzb3VyY2VzIChzdG9yZWQgaW4gYW4gYXJyYXkpLCB3aGVyZSB3ZSBkbyBub3QKKyAgICAgKiBhZGQgaXRlbXMgYWZ0ZXIgdGhlIGluaXRpYWwgY29uc3RydWN0aW9uLiBJbnN0ZWFkIHdlIGFkdmFuY2UgdGhlIHNtYWxsZXN0IGVsZW1lbnQgKHdoaWNoIGlzIGF0IHRoZSB0b3AKKyAgICAgKiBvZiB0aGUgaGVhcCkgYW5kIHB1c2ggaXQgZG93biB0byBmaW5kIGl0cyBwbGFjZSBmb3IgaXRzIG5ldyBwb3NpdGlvbi4gU2hvdWxkIHRoaXMgc291cmNlIGJlIGV4aGF1c3RlZCwKKyAgICAgKiB3ZSBzd2FwIGl0IHdpdGggdGhlIGxhc3Qgc291cmNlIGluIHRoZSBoZWFwIGFuZCBwcm9jZWVkIGJ5IHB1c2hpbmcgdGhhdCBkb3duIGluIHRoZSBoZWFwLgorICAgICAqCisgICAgICogSW4gdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBtdWx0aXBsZSBzb3VyY2VzIHdpdGggbWF0Y2hpbmcgcG9zaXRpb25zLCB0aGUgbWVyZ2luZyBhbGdvcml0aG0KKyAgICAgKiBtdXN0IGJlIGFibGUgdG8gbWVyZ2UgYWxsIGVxdWFsIHZhbHVlcy4gVG8gYWNoaWV2ZSB0aGlzIHtAY29kZSBjb250ZW50fSB3YWxrcyB0aGUgaGVhcCB0bworICAgICAqIGZpbmQgYWxsIGVxdWFsIGN1cnNvcnMgd2l0aG91dCBhZHZhbmNpbmcgdGhlbSwgYW5kIHNlcGFyYXRlbHkge0Bjb2RlIGFkdmFuY2V9IGFkdmFuY2VzCisgICAgICogYWxsIGVxdWFsIHNvdXJjZXMgYW5kIHJlc3RvcmVzIHRoZSBoZWFwIHN0cnVjdHVyZS4KKyAgICAgKgorICAgICAqIFRoZSBsYXR0ZXIgaXMgZG9uZSBlcXVpdmFsZW50bHkgdG8gdGhlIHByb2Nlc3Mgb2YgaW5pdGlhbCBjb25zdHJ1Y3Rpb24gb2YgYSBtaW4taGVhcCB1c2luZyBiYWNrLXRvLWZyb250CisgICAgICogaGVhcGlmaWNhdGlvbiBhcyBkb25lIGluIHRoZSBjbGFzc2ljIGhlYXBzb3J0IGFsZ29yaXRobS4gSXQgb25seSBuZWVkcyB0byBoZWFwaWZ5IHN1YmhlYXBzIHdob3NlIHRvcCBpdGVtCisgICAgICogaXMgYWR2YW5jZWQgKGkuZS4gb25lIHdob3NlIHBvc2l0aW9uIG1hdGNoZXMgdGhlIGN1cnJlbnQpLCBhbmQgd2UgY2FuIGRvIHRoYXQgcmVjdXJzaXZlbHkgZnJvbQorICAgICAqIGJvdHRvbSB0byB0b3AuIFNob3VsZCBhIHNvdXJjZSBiZSBleGhhdXN0ZWQgd2hlbiBhZHZhbmNpbmcsIGl0IGNhbiBiZSB0aHJvd24gYXdheSBieSBzd2FwcGluZyBpbiB0aGUgbGFzdAorICAgICAqIHNvdXJjZSBpbiB0aGUgaGVhcCAobm90ZTogd2UgbXVzdCBiZSBjYXJlZnVsIHRvIGFkdmFuY2UgdGhhdCBzb3VyY2UgdG9vIGlmIHJlcXVpcmVkKS4KKyAgICAgKgorICAgICAqIFRvIG1ha2UgaXQgZWFzaWVyIHRvIGFkdmFuY2UgZWZmaWNpZW50eSBpbiBzaW5nbGUtc291cmNlZCBicmFuY2hlcyBvZiB0cmllcywgd2UgZXh0cmFjdCB0aGUgY3VycmVudCBzbWFsbGVzdAorICAgICAqIGN1cnNvciAodGhlIGhlYWQpIHNlcGFyYXRlbHksIGFuZCBzdGFydCBhbnkgYWR2YW5jZSB3aXRoIGNvbXBhcmluZyB0aGF0IHRvIHRoZSBoZWFwJ3MgZmlyc3QuIFdoZW4gdGhlIHNtYWxsZXN0CisgICAgICogY3Vyc29yIHJlbWFpbnMgdGhlIHNhbWUgKGUuZy4gaW4gYnJhbmNoZXMgY29taW5nIGZyb20gYSBzaW5nbGUgc291cmNlKSB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGFkdmFuY2Ugd2l0aAorICAgICAqIGp1c3Qgb25lIGNvbXBhcmlzb24gaW5zdGVhZCBvZiB0d28gYXQgdGhlIGV4cGVuc2Ugb2YgaW5jcmVhc2luZyB0aGUgbnVtYmVyIGJ5IG9uZSBpbiB0aGUgZ2VuZXJhbCBjYXNlLgorICAgICAqCisgICAgICogTm90ZTogVGhpcyBpcyBhIHNpbXBsaWZpY2F0aW9uIG9mIHRoZSBNZXJnZUl0ZXJhdG9yIGNvZGUgZnJvbSBDQVNTQU5EUkEtODkxNSwgd2l0aG91dCB0aGUgbGVhZGluZyBvcmRlcmVkCisgICAgICogc2VjdGlvbiBhbmQgZXF1YWxQYXJlbnQgZmxhZyBzaW5jZSBjb21wYXJpc29ucyBvZiBjdXJzb3IgcG9zaXRpb25zIGFyZSBjaGVhcC4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgQ29sbGVjdGlvbk1lcmdlQ3Vyc29yPFQ+IGltcGxlbWVudHMgQ3Vyc29yPFQ+CisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25NZXJnZVJlc29sdmVyPFQ+IHJlc29sdmVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc21hbGxlc3QgY3Vyc29yLCB0cmFja2VkIHNlcGFyYXRlbHkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBpbiBzaW5nbGUtc291cmNlIHNlY3Rpb25zIG9mIHRoZSB0cmllLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBDdXJzb3I8VD4gaGVhZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQmluYXJ5IGhlYXAgb2YgdGhlIHJlbWFpbmluZyBjdXJzb3JzLiBUaGUgc21hbGxlc3QgZWxlbWVudCBpcyBhdCBwb3NpdGlvbiAwLgorICAgICAgICAgKiBFdmVyeSBlbGVtZW50IGkgaXMgc21hbGxlciB0aGFuIG9yIGVxdWFsIHRvIGl0cyB0d28gY2hpbGRyZW4sIGkuZS4KKyAgICAgICAgICogICAgIGhlYXBbaV0gPD0gaGVhcFtpKjIgKyAxXSAmJiBoZWFwW2ldIDw9IGhlYXBbaSoyICsgMl0KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yPFQ+W10gaGVhcDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSBsaXN0IHVzZWQgdG8gY29sbGVjdCBjb250ZW50cyBkdXJpbmcgY29udGVudCgpIGNhbGxzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFQ+IGNvbnRlbnRzOworCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uTWVyZ2VDdXJzb3IoQ29sbGVjdGlvbk1lcmdlUmVzb2x2ZXI8VD4gcmVzb2x2ZXIsIENvbGxlY3Rpb248PyBleHRlbmRzIFRyaWU8VD4+IGlucHV0cykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOworICAgICAgICAgICAgaW50IGNvdW50ID0gaW5wdXRzLnNpemUoKTsKKyAgICAgICAgICAgIC8vIEdldCBjdXJzb3JzIGZvciBhbGwgaW5wdXRzLiBQdXQgb25lIG9mIHRoZW0gaW4gaGVhZCBhbmQgdGhlIHJlc3QgaW4gdGhlIGhlYXAuCisgICAgICAgICAgICBoZWFwID0gbmV3IEN1cnNvcltjb3VudCAtIDFdOworICAgICAgICAgICAgY29udGVudHMgPSBuZXcgQXJyYXlMaXN0PD4oY291bnQpOworICAgICAgICAgICAgaW50IGkgPSAtMTsKKyAgICAgICAgICAgIGZvciAoVHJpZTxUPiB0cmllIDogaW5wdXRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN1cnNvcjxUPiBjdXJzb3IgPSB0cmllLmN1cnNvcigpOworICAgICAgICAgICAgICAgIGFzc2VydCBjdXJzb3IuZGVwdGgoKSA9PSAwOworICAgICAgICAgICAgICAgIGlmIChpID49IDApCisgICAgICAgICAgICAgICAgICAgIGhlYXBbaV0gPSBjdXJzb3I7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBoZWFkID0gY3Vyc29yOworICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRoZSBjdXJzb3JzIGFyZSBhbGwgY3VycmVudGx5IHBvc2l0aW9uZWQgb24gdGhlIHJvb3QgYW5kIHRodXMgaW4gdmFsaWQgaGVhcCBvcmRlci4KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnRlcmZhY2UgZm9yIGludGVybmFsIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byB0aGUgZXF1YWwgdG9wIGVsZW1lbnRzIG9mIHRoZSBoZWFwLgorICAgICAgICAgKi8KKyAgICAgICAgaW50ZXJmYWNlIEhlYXBPcDxUPgorICAgICAgICB7CisgICAgICAgICAgICB2b2lkIGFwcGx5KENvbGxlY3Rpb25NZXJnZUN1cnNvcjxUPiBzZWxmLCBDdXJzb3I8VD4gY3Vyc29yLCBpbnQgaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFwcGx5IGEgbm9uLWludGVyZmVyaW5nIG9wZXJhdGlvbiwgaS5lLiBvbmUgdGhhdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnNvciBzdGF0ZSwgdG8gYWxsIGlucHV0cyBpbiB0aGUgaGVhcAorICAgICAgICAgKiB0aGF0IGFyZSBvbiBlcXVhbCBwb3NpdGlvbiB0byB0aGUgaGVhZC4KKyAgICAgICAgICogRm9yIGludGVyZmVyaW5nIG9wZXJhdGlvbnMgbGlrZSBhZHZhbmNpbmcgdGhlIGN1cnNvcnMsIHVzZSB7QGxpbmsgI2FkdmFuY2VFcXVhbEFuZFJlc3RvcmVIZWFwKEFkdmFuY2luZ0hlYXBPcCl9LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFwcGx5VG9FcXVhbE9uSGVhcChIZWFwT3A8VD4gYWN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBhcHBseVRvRXF1YWxFbGVtZW50c0luSGVhcChhY3Rpb24sIDApOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEludGVyZmFjZSBmb3IgaW50ZXJuYWwgYWR2YW5jaW5nIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byB0aGUgaGVhcCBjdXJzb3JzLiBUaGlzIGludGVyZmFjZSBwcm92aWRlcworICAgICAgICAgKiB0aGUgY29kZSB0byByZXN0b3JlIHRoZSBoZWFwIHN0cnVjdHVyZSBhZnRlciBhZHZhbmNpbmcgdGhlIGN1cnNvcnMuCisgICAgICAgICAqLworICAgICAgICBpbnRlcmZhY2UgQWR2YW5jaW5nSGVhcE9wPFQ+IGV4dGVuZHMgSGVhcE9wPFQ+CisgICAgICAgIHsKKyAgICAgICAgICAgIHZvaWQgYXBwbHkoQ3Vyc29yPFQ+IGN1cnNvcik7CisKKyAgICAgICAgICAgIGRlZmF1bHQgdm9pZCBhcHBseShDb2xsZWN0aW9uTWVyZ2VDdXJzb3I8VD4gc2VsZiwgQ3Vyc29yPFQ+IGN1cnNvciwgaW50IGluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEFwcGx5IHRoZSBvcGVyYXRpb24sIHdoaWNoIHNob3VsZCBhZHZhbmNlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZWxlbWVudC4KKyAgICAgICAgICAgICAgICBhcHBseShjdXJzb3IpOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uIHRoZSBiYWNrIHBhdGggb2YgdGhlIHJlY3Vyc2lvbi4gQXQgdGhpcyBwb2ludCB0aGUgaGVhcHMgYXQgYm90aCBjaGlsZHJlbiBhcmUKKyAgICAgICAgICAgICAgICAvLyBhZHZhbmNlZCBhbmQgd2VsbC1mb3JtZWQuCisgICAgICAgICAgICAgICAgLy8gUGxhY2UgY3VycmVudCBub2RlIGluIGl0cyBwcm9wZXIgcG9zaXRpb24uCisgICAgICAgICAgICAgICAgc2VsZi5oZWFwaWZ5RG93bihjdXJzb3IsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAvLyBUaGUgaGVhcCByb290ZWQgYXQgaW5kZXggaXMgbm93IGFkdmFuY2VkIGFuZCB3ZWxsLWZvcm1lZC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkdmFuY2UgdGhlIHN0YXRlIG9mIGFsbCBpbnB1dHMgaW4gdGhlIGhlYXAgdGhhdCBhcmUgb24gZXF1YWwgcG9zaXRpb24gYXMgdGhlIGhlYWQgYW5kIHJlc3RvcmUgdGhlIGhlYXAKKyAgICAgICAgICogaW52YXJpYW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFkdmFuY2VFcXVhbEFuZFJlc3RvcmVIZWFwKEFkdmFuY2luZ0hlYXBPcDxUPiBhY3Rpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGFwcGx5VG9FcXVhbEVsZW1lbnRzSW5IZWFwKGFjdGlvbiwgMCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQXBwbHkgYW4gb3BlcmF0aW9uIHRvIGFsbCBlbGVtZW50cyBvbiB0aGUgaGVhcCB0aGF0IGFyZSBlcXVhbCB0byB0aGUgaGVhZC4gRGVzY2VuZHMgcmVjdXJzaXZlbHkgaW4gdGhlIGhlYXAKKyAgICAgICAgICogc3RydWN0dXJlIHRvIGFsbCBlcXVhbCBjaGlsZHJlbiBhbmQgYXBwbGllcyB0aGUgb3BlcmF0aW9uIG9uIHRoZSB3YXkgYmFjay4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBvcGVyYXRpb24gY2FuIGJlIHNvbWV0aGluZyB0aGF0IGRvZXMgbm90IGNoYW5nZSB0aGUgY3Vyc29yIHN0YXRlIChzZWUge0BsaW5rICNjb250ZW50fSkgb3IgYW4gb3BlcmF0aW9uCisgICAgICAgICAqIHRoYXQgYWR2YW5jZXMgdGhlIGN1cnNvciB0byBhIG5ldyBzdGF0ZSwgd3JhcHBlZCBpbiBhIHtAbGluayBBZHZhbmNpbmdIZWFwT3B9ICh7QGxpbmsgI2FkdmFuY2V9IG9yCisgICAgICAgICAqIHtAbGluayAjc2tpcENoaWxkcmVufSkuIFRoZSBsYXR0ZXIgaW50ZXJmYWNlIHRha2VzIGNhcmUgb2YgcHVzaGluZyBlbGVtZW50cyBkb3duIGluIHRoZSBoZWFwIGFmdGVyIGFkdmFuY2luZworICAgICAgICAgKiBhbmQgcmVzdG9yZXMgdGhlIHN1YmhlYXAgc3RhdGUgb24gcmV0dXJuIGZyb20gZWFjaCBsZXZlbCBvZiB0aGUgcmVjdXJzaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFwcGx5VG9FcXVhbEVsZW1lbnRzSW5IZWFwKEhlYXBPcDxUPiBhY3Rpb24sIGludCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGluZGV4ID49IGhlYXAubGVuZ3RoKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIEN1cnNvcjxUPiBpdGVtID0gaGVhcFtpbmRleF07CisgICAgICAgICAgICBpZiAoIWVxdWFsQ3Vyc29yKGl0ZW0sIGhlYWQpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gSWYgdGhlIGNoaWxkcmVuIGFyZSBhdCB0aGUgc2FtZSBwb3NpdGlvbiwgdGhleSBhbHNvIG5lZWQgYWR2YW5jaW5nIGFuZCB0aGVpciBzdWJoZWFwCisgICAgICAgICAgICAvLyBpbnZhcmlhbnQgdG8gYmUgcmVzdG9yZWQuCisgICAgICAgICAgICBhcHBseVRvRXF1YWxFbGVtZW50c0luSGVhcChhY3Rpb24sIGluZGV4ICogMiArIDEpOworICAgICAgICAgICAgYXBwbHlUb0VxdWFsRWxlbWVudHNJbkhlYXAoYWN0aW9uLCBpbmRleCAqIDIgKyAyKTsKKworICAgICAgICAgICAgLy8gQXBwbHkgdGhlIGFjdGlvbi4gVGhpcyBpcyBkb25lIG9uIHRoZSByZXZlcnNlIGRpcmVjdGlvbiB0byBnaXZlIHRoZSBhY3Rpb24gYSBjaGFuY2UgdG8gZm9ybSBwcm9wZXIKKyAgICAgICAgICAgIC8vIHN1YmhlYXBzIGFuZCBjb21iaW5lIHRoZW0gb24gcHJvY2Vzc2luZyB0aGUgcGFyZW50LgorICAgICAgICAgICAgYWN0aW9uLmFwcGx5KHRoaXMsIGl0ZW0sIGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQdXNoIHRoZSBnaXZlbiBzdGF0ZSBkb3duIGluIHRoZSBoZWFwIGZyb20gdGhlIGdpdmVuIGluZGV4IHVudGlsIGl0IGZpbmRzIGl0cyBwcm9wZXIgcGxhY2UgYW1vbmcKKyAgICAgICAgICogdGhlIHN1YmhlYXAgcm9vdGVkIGF0IHRoYXQgcG9zaXRpb24uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgaGVhcGlmeURvd24oQ3Vyc29yPFQ+IGl0ZW0sIGludCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG5leHQgPSBpbmRleCAqIDIgKyAxOworICAgICAgICAgICAgICAgIGlmIChuZXh0ID49IGhlYXAubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIHNtYWxsZXIgb2YgdGhlIHR3byBjaGlsZHJlbiB0byBwdXNoIGRvd24gdG8uCisgICAgICAgICAgICAgICAgaWYgKG5leHQgKyAxIDwgaGVhcC5sZW5ndGggJiYgZ3JlYXRlckN1cnNvcihoZWFwW25leHRdLCBoZWFwW25leHQgKyAxXSkpCisgICAgICAgICAgICAgICAgICAgICsrbmV4dDsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY2hpbGQgaXMgZ3JlYXRlciBvciBlcXVhbCwgdGhlIGludmFyaWFudCBoYXMgYmVlbiByZXN0b3JlZC4KKyAgICAgICAgICAgICAgICBpZiAoIWdyZWF0ZXJDdXJzb3IoaXRlbSwgaGVhcFtuZXh0XSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGhlYXBbaW5kZXhdID0gaGVhcFtuZXh0XTsKKyAgICAgICAgICAgICAgICBpbmRleCA9IG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoZWFwW2luZGV4XSA9IGl0ZW07CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2sgaWYgdGhlIGhlYWQgaXMgZ3JlYXRlciB0aGFuIHRoZSB0b3AgZWxlbWVudCBpbiB0aGUgaGVhcCwgYW5kIGlmIHNvLCBzd2FwIHRoZW0gYW5kIHB1c2ggZG93biB0aGUgbmV3CisgICAgICAgICAqIHRvcCB1bnRpbCBpdHMgcHJvcGVyIHBsYWNlLgorICAgICAgICAgKiBAcGFyYW0gaGVhZERlcHRoIHRoZSBkZXB0aCBvZiB0aGUgaGVhZCBjdXJzb3IgKGFzIHJldHVybmVkIGJ5IGUuZy4gYWR2YW5jZSkuCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5ldyBoZWFkIGVsZW1lbnQncyBkZXB0aAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgbWF5YmVTd2FwSGVhZChpbnQgaGVhZERlcHRoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaGVhcDBEZXB0aCA9IGhlYXBbMF0uZGVwdGgoKTsKKyAgICAgICAgICAgIGlmIChoZWFkRGVwdGggPiBoZWFwMERlcHRoIHx8CisgICAgICAgICAgICAgICAgKGhlYWREZXB0aCA9PSBoZWFwMERlcHRoICYmIGhlYWQuaW5jb21pbmdUcmFuc2l0aW9uKCkgPD0gaGVhcFswXS5pbmNvbWluZ1RyYW5zaXRpb24oKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGhlYWREZXB0aDsgICAvLyBoZWFkIGlzIHN0aWxsIHNtYWxsZXN0CisKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBuZWVkIHRvIHN3YXAgaGVhcCBhbmQgaGVhcFswXQorICAgICAgICAgICAgQ3Vyc29yPFQ+IG5ld0hlYXAwID0gaGVhZDsKKyAgICAgICAgICAgIGhlYWQgPSBoZWFwWzBdOworICAgICAgICAgICAgaGVhcGlmeURvd24obmV3SGVhcDAsIDApOworICAgICAgICAgICAgcmV0dXJuIGhlYXAwRGVwdGg7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBhZHZhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYWR2YW5jZUVxdWFsQW5kUmVzdG9yZUhlYXAoQ3Vyc29yOjphZHZhbmNlKTsKKyAgICAgICAgICAgIHJldHVybiBtYXliZVN3YXBIZWFkKGhlYWQuYWR2YW5jZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGFkdmFuY2VNdWx0aXBsZShUcmFuc2l0aW9uc1JlY2VpdmVyIHJlY2VpdmVyKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyBwcmVzZW50IGluIGp1c3Qgb25lIGN1cnNvciwgd2UgY2FuIHNhZmVseSBkZXNjZW5kIG11bHRpcGxlIGxldmVscyB3aXRoaW4KKyAgICAgICAgICAgIC8vIGl0cyBicmFuY2ggYXMgbm8gb25lIG9mIHRoZSBvdGhlciB0cmllcyBoYXMgY29udGVudCBmb3IgaXQuCisgICAgICAgICAgICBpZiAoZXF1YWxDdXJzb3IoaGVhcFswXSwgaGVhZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsgICAvLyBNb3JlIHRoYW4gb25lIHNvdXJjZSBhdCBjdXJyZW50IHBvc2l0aW9uLCBkbyBzaW5nbGUtc3RlcCBhZHZhbmNlLgorCisgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gY2hpbGRyZW4sIGkuZS4gdGhlIGN1cnNvciBhc2NlbmRzLCB3ZSBoYXZlIHRvIGNoZWNrIGlmIGl0J3MgYmVjb21lIGxhcmdlciB0aGFuIHNvbWUKKyAgICAgICAgICAgIC8vIG90aGVyIGNhbmRpZGF0ZS4KKyAgICAgICAgICAgIHJldHVybiBtYXliZVN3YXBIZWFkKGhlYWQuYWR2YW5jZU11bHRpcGxlKHJlY2VpdmVyKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBza2lwQ2hpbGRyZW4oKQorICAgICAgICB7CisgICAgICAgICAgICBhZHZhbmNlRXF1YWxBbmRSZXN0b3JlSGVhcChDdXJzb3I6OnNraXBDaGlsZHJlbik7CisgICAgICAgICAgICByZXR1cm4gbWF5YmVTd2FwSGVhZChoZWFkLnNraXBDaGlsZHJlbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlcHRoKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGhlYWQuZGVwdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGluY29taW5nVHJhbnNpdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBoZWFkLmluY29taW5nVHJhbnNpdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUIGNvbnRlbnQoKQorICAgICAgICB7CisgICAgICAgICAgICBhcHBseVRvRXF1YWxPbkhlYXAoQ29sbGVjdGlvbk1lcmdlQ3Vyc29yOjpjb2xsZWN0Q29udGVudCk7CisgICAgICAgICAgICBjb2xsZWN0Q29udGVudChoZWFkLCAtMSk7CisKKyAgICAgICAgICAgIFQgdG9SZXR1cm47CisgICAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnRzLnNpemUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHRvUmV0dXJuID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB0b1JldHVybiA9IGNvbnRlbnRzLmdldCgwKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdG9SZXR1cm4gPSByZXNvbHZlci5yZXNvbHZlKGNvbnRlbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250ZW50cy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIHRvUmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNvbGxlY3RDb250ZW50KEN1cnNvcjxUPiBpdGVtLCBpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFQgaXRlbUNvbnRlbnQgPSBpdGVtLmNvbnRlbnQoKTsKKyAgICAgICAgICAgIGlmIChpdGVtQ29udGVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRlbnRzLmFkZChpdGVtQ29udGVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsIGluc3RhbmNlIGZvciBzb3VyY2VzIHRoYXQgYXJlIGd1YXJhbnRlZWQgZGlzdGluY3QuIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCB3ZSBjYW4gZm9ybSB1bm9yZGVyZWQKKyAgICAgKiB2YWx1ZSBsaXN0IGJ5IGNvbmNhdGVuYXRpbmcgc291cmNlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgRGlzdGluY3Q8VD4gZXh0ZW5kcyBDb2xsZWN0aW9uTWVyZ2VUcmllPFQ+CisgICAgeworICAgICAgICBEaXN0aW5jdChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUcmllPFQ+PiBpbnB1dHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGlucHV0cywgdGhyb3dpbmdSZXNvbHZlcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmFibGU8VD4gdmFsdWVzVW5vcmRlcmVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEl0ZXJhYmxlcy5jb25jYXQoSXRlcmFibGVzLnRyYW5zZm9ybShpbnB1dHMsIFRyaWU6OnZhbHVlc1Vub3JkZXJlZCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlSZWFkVHJpZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlSZWFkVHJpZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZjU5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVJlYWRUcmllLmphdmEKQEAgLTAsMCArMSw5MjAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlQXJyYXk7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgb3JnLmFncm9uYS5jb25jdXJyZW50LlVuc2FmZUJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworCisvKioKKyAqIEluLW1lbW9yeSB0cmllIGJ1aWx0IGZvciBmYXN0IG1vZGlmaWNhdGlvbiBhbmQgcmVhZHMgZXhlY3V0aW5nIGNvbmN1cnJlbnRseSB3aXRoIHdyaXRlcyBmcm9tIGEgc2luZ2xlIG11dGF0b3IgdGhyZWFkLgorICoKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIHJlYWQtb25seSBmdW5jdGlvbmFsaXR5LCBleHBhbmRlZCBpbiB7QGxpbmsgSW5NZW1vcnlUcmllfSB0byB3cml0ZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBJbk1lbW9yeVJlYWRUcmllPFQ+IGV4dGVuZHMgVHJpZTxUPgoreworICAgIC8qCisgICAgVFJJRSBGT1JNQVQgQU5EIE5PREUgVFlQRVMKKworICAgIFRoZSBtZW10YWJsZSB0cmllIHVzZXMgZml2ZSBkaWZmZXJlbnQgdHlwZXMgb2Ygbm9kZXM6CisgICAgIC0gImxlYWYiIG5vZGVzLCB3aGljaCBoYXZlIGNvbnRlbnQgYW5kIG5vIGNoaWxkcmVuOworICAgICAtIHNpbmdsZS10cmFuc2l0aW9uICJjaGFpbiIgbm9kZXMsIHdoaWNoIGhhdmUgZXhhY3RseSBvbmUgY2hpbGQ7IHdoaWxlIGVhY2ggbm9kZSBpcyBhIHNpbmdsZSB0cmFuc2l0aW9uLCB0aGV5IGFyZQorICAgICAgIGNhbGxlZCAiY2hhaW4iIGJlY2F1c2UgbXVsdGlwbGUgc3VjaCB0cmFuc2l0aW9uIGFyZSBwYWNrZWQgaW4gYSBibG9jay4KKyAgICAgLSAic3BhcnNlIiBub2RlcyB3aGljaCBoYXZlIGJldHdlZW4gdHdvIGFuZCBzaXggY2hpbGRyZW47CisgICAgIC0gInNwbGl0IiBub2RlcyBmb3IgYW55dGhpbmcgYWJvdmUgc2l4IGNoaWxkcmVuOworICAgICAtICJwcmVmaXgiIG5vZGVzIHRoYXQgYXVnbWVudCBvbmUgb2YgdGhlIG90aGVyIHR5cGVzIChleGNlcHQgbGVhZikgd2l0aCBjb250ZW50LgorCisgICAgVGhlIGRhdGEgZm9yIGFsbCBub2RlcyBleGNlcHQgbGVhZiBvbmVzIGlzIHN0b3JlZCBpbiBhIGNvbnRpZ3VvdXMgJ25vZGUgYnVmZmVyJyBhbmQgbGFpZCBvdXQgaW4gYmxvY2tzIG9mIDMyIGJ5dGVzLgorICAgIEEgYmxvY2sgb25seSBjb250YWlucyBkYXRhIGZvciBhIHNpbmdsZSB0eXBlIG9mIG5vZGUsIGJ1dCB0aGVyZSBpcyBubyBkaXJlY3QgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBibG9jayBhbmQgbm9kZQorICAgIGluIHRoYXQ6CisgICAgIC0gYSBzaW5nbGUgYmxvY2sgY2FuIGNvbnRhaW4gbXVsdGlwbGUgImNoYWluIiBub2Rlcy4KKyAgICAgLSBhIHNwYXJzZSBub2RlIG9jY3VwaWVzIGV4YWN0bHkgb25lIGJsb2NrLgorICAgICAtIGEgc3BsaXQgbm9kZSBvY2N1cGllcyBhIHZhcmlhYmxlIG51bWJlciBvZiBibG9ja3MuCisgICAgIC0gYSBwcmVmaXggbm9kZSBjYW4gYmUgcGxhY2VkIGluIHRoZSBzYW1lIGJsb2NrIGFzIHRoZSBub2RlIGl0IGF1Z21lbnRzLCBvciBpbiBhIHNlcGFyYXRlIGJsb2NrLgorCisgICAgTm9kZXMgYXJlIHJlZmVyZW5jZWQgaW4gdGhhdCBidWZmZXIgYnkgYW4gaW50ZWdlciBwb3NpdGlvbi9wb2ludGVyLCB0aGUgJ25vZGUgcG9pbnRlcicuIE5vdGUgdGhhdCBub2RlIHBvaW50ZXJzIGFyZQorICAgIG5vdCBwb2ludGluZyBhdCB0aGUgYmVnaW5uaW5nIG9mIGJsb2NrcywgYW5kIHdlIGNhbGwgJ3BvaW50ZXIgb2Zmc2V0JyB0aGUgb2Zmc2V0IG9mIHRoZSBub2RlIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGl0CisgICAgcG9pbnRzIGludG8uIFRoZSB2YWx1ZSBvZiBhICdub2RlIHBvaW50ZXInIGlzIHVzZWQgdG8gZGVjaWRlIHdoYXQga2luZCBvZiBub2RlIGlzIHBvaW50ZWQ6CisKKyAgICAgLSBJZiB0aGUgcG9pbnRlciBpcyBuZWdhdGl2ZSwgd2UgaGF2ZSBhIGxlYWYgbm9kZS4gU2luY2UgYSBsZWFmIGhhcyBubyBjaGlsZHJlbiwgd2UgbmVlZCBubyBkYXRhIG91dHNpZGUgb2YgaXRzCisgICAgICAgY29udGVudCB0byByZXByZXNlbnQgaXQsIGFuZCB0aGF0IGNvbnRlbnQgaXMgc3RvcmVkIGluIGEgJ2NvbnRlbnQgbGlzdCcsIG5vdCBpbiB0aGUgbm9kZXMgYnVmZmVyLiBUaGUgY29udGVudAorICAgICAgIG9mIGEgcGFydGljdWxhciBsZWFmIG5vZGUgaXMgbG9jYXRlZCBhdCB0aGUgfnBvaW50ZXIgcG9zaXRpb24gaW4gdGhlIGNvbnRlbnQgbGlzdCAofiBpbnN0ZWFkIG9mIC0gc28gdGhhdCAtMSBjYW4KKyAgICAgICBjb3JyZXNwb25kIHRvIHBvc2l0aW9uIDApLgorCisgICAgIC0gSWYgdGhlICdwb2ludGVyIG9mZnNldCcgaXMgc21hbGxlciB0aGFuIDI4LCB3ZSBoYXZlIGEgY2hhaW4gbm9kZSB3aXRoIG9uZSB0cmFuc2l0aW9uLiBUaGUgdHJhbnNpdGlvbiBjaGFyYWN0ZXIgaXMKKyAgICAgICB0aGUgYnl0ZSBhdCB0aGUgcG9zaXRpb24gcG9pbnRlZCBpbiB0aGUgJ25vZGUgYnVmZmVyJywgYW5kIHRoZSBjaGlsZCBpcyBwb2ludGVkIGJ5OgorICAgICAgIC0gdGhlIGludGVnZXIgdmFsdWUgYXQgb2Zmc2V0IDI4IG9mIHRoZSBibG9jayBwb2ludGVkIGlmIHRoZSAncG9pbnRlciBvZmZzZXQnIGlzIDI3CisgICAgICAgLSBwb2ludGVyICsgMSAod2hpY2ggaXMgZ3VhcmFudGVlZCB0byBoYXZlIG9mZnNldCBzbWFsbGVyIHRoYW4gMjgsIGkuZS4gdG8gYmUgYSBjaGFpbiBub2RlKSwgb3RoZXJ3aXNlCisgICAgICAgSW4gb3RoZXIgd29yZHMsIGEgY2hhaW4gYmxvY2sgY29udGFpbnMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHRoYXQgbGVhZHMgdG8gdGhlIGNoaWxkIHdob3NlIGFkZHJlc3MgaXMgYXQKKyAgICAgICBvZmZzZXQgMjguIEl0IG1heSBoYXZlIGJldHdlZW4gMSBhbmQgMjggY2hhcmFjdGVycyBkZXBlbmRpbmcgb24gdGhlIHBvaW50ZXIgd2l0aCB3aGljaCB0aGUgYmxvY2sgaXMgZW50ZXJlZC4KKworICAgICAtIElmIHRoZSAncG9pbnRlciBvZmZzZXQnIGlzIDMwLCB3ZSBoYXZlIGEgc3BhcnNlIG5vZGUuIFRoZSBkYXRhIG9mIGEgc3BhcnNlIG5vZGUgb2NjdXBpZXMgYSBmdWxsIGJsb2NrIGFuZCBpcyBsYWlkCisgICAgICAgb3V0IGFzOgorICAgICAgIC0gc2l4IHBvaW50ZXJzIHRvIGNoaWxkcmVuIGF0IG9mZnNldHMgMCB0byAyNAorICAgICAgIC0gc2l4IHRyYW5zaXRpb24gY2hhcmFjdGVycyBhdCBvZmZzZXRzIDI0IHRvIDMwCisgICAgICAgLSBhbiBvcmRlciB3b3JkIHN0b3JlZCBpbiB0aGUgdHdvIGJ5dGVzIGF0IG9mZnNldCAzMAorICAgICAgIFRvIGVuYWJsZSBpbi1wbGFjZSBhZGRpdGlvbiBvZiBjaGlsZHJlbiwgdGhlIHBvaW50ZXJzIGFuZCB0cmFuc2l0aW9uIGNoYXJhY3RlcnMgYXJlIG5vdCBzdG9yZWQgb3JkZXJlZC4KKyAgICAgICBJbnN0ZWFkLCB3ZSB1c2UgYW4gb3JkZXIgZW5jb2RpbmcgaW4gdGhlIGxhc3QgMiBieXRlcyBvZiB0aGUgbm9kZS4gVGhlIGVuY29kaW5nIGlzIGEgYmFzZS02IG51bWJlciB3aGljaAorICAgICAgIGRlc2NyaWJlcyB0aGUgb3JkZXIgb2YgdGhlIHRyYW5zaXRpb25zIChsZWFzdCBzaWduaWZpY2FudCBkaWdpdCBiZWluZyB0aGUgc21hbGxlc3QpLgorICAgICAgIFRoZSBub2RlIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gdHJhbnNpdGlvbnMgYW5kIHRoZSB0cmFuc2l0aW9uIGF0IHBvc2l0aW9uIDAgaXMgbmV2ZXIgdGhlIGJpZ2dlc3QgKHdlIGNhbgorICAgICAgIGVuZm9yY2UgdGhpcyBieSBjaG9vc2luZyBmb3IgcG9zaXRpb24gMCB0aGUgc21hbGxlciBvZiB0aGUgdHdvIHRyYW5zaXRpb25zIGEgc3BhcnNlIG5vZGUgc3RhcnRzIHdpdGgpLiBUaGlzCisgICAgICAgYWxsb3dzIGl0ZXJhdGlvbiBvdmVyIHRoZSBvcmRlciB3b3JkICh3aGljaCBkaXZpZGVzIHNhaWQgd29yZCBieSA2IGVhY2ggc3RlcCkgdG8gZmluaXNoIHdoZW4gdGhlIHJlc3VsdCBiZWNvbWVzIDAuCisKKyAgICAgLSBJZiB0aGUgJ3BvaW50ZXIgb2Zmc2V0JyBpcyAyOCwgdGhlIG5vZGUgaXMgYSBzcGxpdCBvbmUuIFNwbGl0IG5vZGVzIGFyZSBkZW5zZSwgbWVhbmluZyB0aGF0IHRoZXJlIGlzIGEgZGlyZWN0CisgICAgICAgbWFwcGluZyBiZXR3ZWVuIGEgdHJhbnNpdGlvbiBjaGFyYWN0ZXIgYW5kIHRoZSBhZGRyZXNzIG9mIHRoZSBhc3NvY2lhdGVkIHBvaW50ZXIsIGFuZCBuZXcgY2hpbGRyZW4gY2FuIGVhc2lseSBiZQorICAgICAgIGFkZGVkIGluIHBsYWNlLgorICAgICAgIFNwbGl0IG5vZGVzIG9jY3VweSBtdWx0aXBsZSBibG9ja3MsIGFuZCBhIGNoaWxkIGlzIGxvY2F0ZWQgYnkgdHJhdmVyc2luZyAzIGxheWVycyBvZiBwb2ludGVyczoKKyAgICAgICAtIHRoZSBmaXJzdCBwb2ludGVyIGlzIHdpdGhpbiB0aGUgdG9wLWxldmVsIGJsb2NrICh0aGUgb25lIHBvaW50ZWQgYnkgdGhlIHBvaW50ZXIpIGFuZCBwb2ludHMgdG8gYSAibWlkIiBibG9jay4KKyAgICAgICAgIFRoZSB0b3AtbGV2ZWwgYmxvY2sgaGFzIDQgc3VjaCBwb2ludGVycyB0byAibWlkIiBibG9jaywgbG9jYXRlZCBiZXR3ZWVuIG9mZnNldCAxNiBhbmQgMzIuCisgICAgICAgLSB0aGUgMm5kIHBvaW50ZXIgaXMgd2l0aGluIHRoZSAibWlkIiBibG9jayBhbmQgcG9pbnRzIHRvIGEgInRhaWwiIGJsb2NrLiBBICJtaWQiIGJsb2NrIGhhcyA4IHN1Y2ggcG9pbnRlcnMKKyAgICAgICAgIG9jY3VweWluZyB0aGUgd2hvbGUgYmxvY2suCisgICAgICAgLSB0aGUgM3JkIHBvaW50ZXIgaXMgd2l0aCB0aGUgInRhaWwiIGJsb2NrIGFuZCBpcyB0aGUgYWN0dWFsIGNoaWxkIHBvaW50ZXIuIExpa2UgIm1pZCIgYmxvY2ssIHRoZXJlIGFyZSA4IHN1Y2gKKyAgICAgICAgIHBvaW50ZXJzIChzbyB3ZSBmaW5hbGx5IGFkZHJlc3MgNCAqIDggKiA4ID0gMjU2IGNoaWxkcmVuKS4KKyAgICAgICBUbyBmaW5kIGEgY2hpbGQsIHdlIHRodXMgbmVlZCB0byBrbm93IHRoZSBpbmRleCBvZiB0aGUgcG9pbnRlciB0byBmb2xsb3cgd2l0aGluIHRoZSB0b3AtbGV2ZWwgYmxvY2ssIHRoZSBpbmRleAorICAgICAgIG9mIHRoZSBvbmUgaW4gdGhlICJtaWQiIGJsb2NrIGFuZCB0aGUgaW5kZXggaW4gdGhlICJ0YWlsIiBibG9jay4gRm9yIHRoYXQsIHdlIHNwbGl0IHRoZSB0cmFuc2l0aW9uIGJ5dGUgaW4gYQorICAgICAgIHNlcXVlbmNlIG9mIDItMy0zIGJpdHM6CisgICAgICAgLSB0aGUgZmlyc3QgMiBiaXRzIGFyZSB0aGUgaW5kZXggaW4gdGhlIHRvcC1sZXZlbCBibG9jazsKKyAgICAgICAtIHRoZSBuZXh0IDMgYml0cywgdGhlIGluZGV4IGluIHRoZSAibWlkIiBibG9jazsKKyAgICAgICAtIGFuZCB0aGUgbGFzdCAzIGJpdHMgdGhlIGluZGV4IGluIHRoZSAidGFpbCIgYmxvY2suCisgICAgICAgVGhpcyBsYXlvdXQgYWxsb3dzIHRoZSBub2RlIHRvIHVzZSB0aGUgc21hbGxlciBmaXhlZC1zaXplIGJsb2NrcyAoaW5zdGVhZCBvZiAyNTYqNCBieXRlcyBmb3IgdGhlIHdob2xlIGNoYXJhY3RlcgorICAgICAgIHNwYWNlKSBhbmQgYWxzbyBsZWF2ZXMgc29tZSByb29tIGluIHRoZSBoZWFkIGJsb2NrICh0aGUgMTYgZmlyc3QgYnl0ZXMpIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICh3aGljaCB3ZSBjYW4KKyAgICAgICB1c2UgdG8gc3RvcmUgcHJlZml4IG5vZGVzIGNvbnRhaW5pbmcgdGhpbmdzIGxpa2UgZGVsZXRpb24gdGltZXMpLgorICAgICAgIE9uZSBzcGxpdCBub2RlIG1heSBuZWVkIHVwIHRvIDEgKyA0ICsgNCo4IGJsb2NrcyAoMTE4NCBieXRlcykgdG8gc3RvcmUgYWxsIGl0cyBjaGlsZHJlbi4KKworICAgICAtIElmIHRoZSBwb2ludGVyIG9mZnNldCBpcyAzMSwgd2UgaGF2ZSBhIHByZWZpeCBub2RlLiBUaGVzZSBhcmUgdHdvIHR5cGVzOgorICAgICAgIC0tIEVtYmVkZGVkIHByZWZpeCBub2RlcyBvY2N1cHkgdGhlIGZyZWUgYnl0ZXMgaW4gYSBjaGFpbiBvciBzcGxpdCBub2RlLiBUaGUgYnl0ZSBhdCBvZmZzZXQgNCBoYXMgdGhlIG9mZnNldAorICAgICAgICAgIHdpdGhpbiB0aGUgMzItYnl0ZSBibG9jayBmb3IgdGhlIGF1Z21lbnRlZCBub2RlLgorICAgICAgIC0tIEZ1bGwgcHJlZml4IG5vZGVzIGhhdmUgMHhGRiBhdCBvZmZzZXQgNCBhbmQgYSBwb2ludGVyIGF0IDI4LCBwb2ludGluZyB0byB0aGUgYXVnbWVudGVkIG5vZGUuCisgICAgICAgQm90aCB0eXBlcyBjb250YWluIGFuIGluZGV4IGZvciBjb250ZW50IGF0IG9mZnNldCAwLiBUaGUgYXVnbWVudGVkIG5vZGUgY2Fubm90IGJlIGEgbGVhZiBvciBOT05FIC0tIGluIHRoZSBmb3JtZXIKKyAgICAgICBjYXNlIHRoZSBsZWFmIGl0c2VsZiBjb250YWlucyB0aGUgY29udGVudCBpbmRleCwgaW4gdGhlIGxhdHRlciB3ZSB1c2UgYSBsZWFmIGluc3RlYWQuCisgICAgICAgVGhlIHRlcm0gIm5vZGUiIHdoZW4gYXBwbGllZCB0byB0aGVzZSBpcyBhIGJpdCBvZiBhIG1pc25vbWVyIGFzIHRoZXkgYXJlIG5vdCBwcmVzZW50ZWQgYXMgc2VwYXJhdGUgbm9kZXMgZHVyaW5nCisgICAgICAgdHJhdmVyc2Fscy4gSW5zdGVhZCwgdGhleSBhdWdtZW50IGEgbm9kZSwgY2hhbmdpbmcgb25seSBpdHMgY29udGVudC4gSW50ZXJuYWxseSB3ZSBjcmVhdGUgYSBOb2RlIG9iamVjdCBmb3IgdGhlCisgICAgICAgYXVnbWVudGVkIG5vZGUgYW5kIHdyYXAgYSBQcmVmaXhOb2RlIGFyb3VuZCBpdCwgd2hpY2ggY2hhbmdlcyB0aGUgYGNvbnRlbnQoKWAgbWV0aG9kIGFuZCByb3V0ZXMgYWxsIG90aGVyCisgICAgICAgY2FsbHMgdG8gdGhlIGF1Z21lbnRlZCBub2RlJ3MgbWV0aG9kcy4KKworICAgICBXaGVuIGJ1aWxkaW5nIGEgdHJpZSB3ZSBmaXJzdCBhbGxvY2F0ZSB0aGUgY29udGVudCwgdGhlbiBjcmVhdGUgYSBjaGFpbiBub2RlIGxlYWRpbmcgdG8gaXQuIFdoaWxlIHdlIG9ubHkgaGF2ZQorICAgICBzaW5nbGUgdHJhbnNpdGlvbnMgbGVhZGluZyB0byBhIGNoYWluIG5vZGUsIHdlIGNhbiBleHBhbmQgdGhhdCBub2RlIChhdHRhY2hpbmcgYSBjaGFyYWN0ZXIgYW5kIHVzaW5nIHBvaW50ZXIgLSAxKQorICAgICBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4gV2hlbiBhIGNoYWluIG5vZGUgYWxyZWFkeSBoYXMgYSBjaGlsZCBhbmQgbmVlZHMgYSBuZXcgb25lIGFkZGVkIHdlIGNoYW5nZSB0aGUgdHlwZQorICAgICAoaS5lLiBjcmVhdGUgYSBuZXcgbm9kZSBhbmQgcmVtYXAgdGhlIHBhcmVudCkgdG8gc3BhcnNlIHdpdGggdHdvIGNoaWxkcmVuLiBXaGVuIGEgc2l4LWNoaWxkIHNwYXJzZSBub2RlIG5lZWRzIGEgbmV3CisgICAgIGNoaWxkLCB3ZSBzd2l0Y2ggdG8gc3BsaXQuCisKKyAgICAgQmxvY2tzIGN1cnJlbnRseSBhcmUgbm90IHJldXNlZCwgYmVjYXVzZSB3ZSBkbyBub3QgeWV0IGhhdmUgYSBtZWNoYW5pc20gdG8gdGVsbCB3aGVuIHJlYWRlcnMgYXJlIGRvbmUgd2l0aCBibG9ja3MKKyAgICAgdGhleSBhcmUgcmVmZXJlbmNpbmcuIFRoaXMgY3VycmVudGx5IGNhdXNlcyBhIHZlcnkgbG93IG92ZXJoZWFkIChiZWNhdXNlIHdlIGNoYW5nZSBkYXRhIGluIHBsYWNlIHdpdGggdGhlIG9ubHkKKyAgICAgZXhjZXB0aW9uIG9mIG5vZGVzIG5lZWRpbmcgdG8gY2hhbmdlIHR5cGUpIGFuZCBpcyBwbGFubmVkIHRvIGJlIGFkZHJlc3NlZCBsYXRlci4KKworICAgICBGb3IgZnVydGhlciBkZXNjcmlwdGlvbnMgYW5kIGV4YW1wbGVzIG9mIHRoZSBtZWNoYW5pY3Mgb2YgdGhlIHRyaWUsIHNlZSBJbk1lbW9yeVRyaWUubWQuCisgICAgICovCisKKyAgICBzdGF0aWMgZmluYWwgaW50IEJMT0NLX1NJWkUgPSAzMjsKKworICAgIC8vIEJpZ2dlc3QgYmxvY2sgb2Zmc2V0IHRoYXQgY2FuIGNvbnRhaW4gYSBwb2ludGVyLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgTEFTVF9QT0lOVEVSX09GRlNFVCA9IEJMT0NLX1NJWkUgLSA0OworCisgICAgLyoKKyAgICAgQmxvY2sgb2Zmc2V0cyB1c2VkIHRvIGlkZW50aWZ5IG5vZGUgdHlwZXMgKGJ5IGNvbXBhcmluZyB0aGVtIHRvIHRoZSBub2RlICdwb2ludGVyIG9mZnNldCcpLgorICAgICAqLworCisgICAgLy8gc3BsaXQgbm9kZSAoZGVuc2UsIDItMy0zIHRyYW5zaXRpb25zKSwgbGFpZCBvdXQgYXMgNCBwb2ludGVycyB0byAibWlkIiBibG9jaywgd2l0aCBoYXMgOCBwb2ludGVycyB0byAidGFpbCIgYmxvY2ssCisgICAgLy8gd2hpY2ggaGFzIDggcG9pbnRlcnMgdG8gY2hpbGRyZW4KKyAgICBzdGF0aWMgZmluYWwgaW50IFNQTElUX09GRlNFVCA9IEJMT0NLX1NJWkUgLSA0OworICAgIC8vIHNwYXJzZSBub2RlLCB1bm9yZGVyZWQgbGlzdCBvZiB1cCB0byA2IHRyYW5zaXRpb24sIGxhaWQgb3V0IGFzIDYgdHJhbnNpdGlvbiBwb2ludGVycyBmb2xsb3dlZCBieSA2IHRyYW5zaXRpb24KKyAgICAvLyBieXRlcy4gVGhlIGxhc3QgdHdvIGJ5dGVzIGNvbnRhaW4gYW4gb3JkZXJpbmcgb2YgdGhlIHRyYW5zaXRpb25zIChpbiBiYXNlLTYpIHdoaWNoIGlzIHVzZWQgZm9yIGl0ZXJhdGlvbi4gT24KKyAgICAvLyB1cGRhdGUgdGhlIHBvaW50ZXIgaXMgc2V0IGxhc3QsIGkuZS4gZHVyaW5nIHJlYWRzIHRoZSBub2RlIG1heSBzaG93IHRoYXQgYSB0cmFuc2l0aW9uIGV4aXN0cyBhbmQgbGlzdCBhIGNoYXJhY3RlcgorICAgIC8vIGZvciBpdCwgYnV0IHBvaW50ZXIgbWF5IHN0aWxsIGJlIG51bGwuCisgICAgc3RhdGljIGZpbmFsIGludCBTUEFSU0VfT0ZGU0VUID0gQkxPQ0tfU0laRSAtIDI7CisgICAgLy8gbWluIGFuZCBtYXggb2Zmc2V0IGZvciBhIGNoYWluIG5vZGUuIEEgYmxvY2sgb2YgY2hhaW4gbm9kZSBpcyBsYWlkIG91dCBhcyBhIHBvaW50ZXIgYXQgTEFTVF9QT0lOVEVSX09GRlNFVCwKKyAgICAvLyBwcmVjZWRlZCBieSBjaGFyYWN0ZXJzIHRoYXQgbGVhZCB0byBpdC4gVGh1cyBhIGZ1bGwgY2hhaW4gYmxvY2sgY29udGFpbnMgQkxPQ0tfU0laRS00IHRyYW5zaXRpb25zL2NoYWluIG5vZGVzLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBSU5fTUlOX09GRlNFVCA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBDSEFJTl9NQVhfT0ZGU0VUID0gQkxPQ0tfU0laRSAtIDU7CisgICAgLy8gUHJlZml4IG5vZGUsIGFuIGludGVybWVkaWF0ZSBub2RlIGF1Z21lbnRpbmcgaXRzIGNoaWxkIG5vZGUgd2l0aCBjb250ZW50LgorICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJFRklYX09GRlNFVCA9IEJMT0NLX1NJWkUgLSAxOworCisgICAgLyoKKyAgICAgT2Zmc2V0cyBhbmQgdmFsdWVzIGZvciBuYXZpZ2F0aW5nIGluIGEgYmxvY2sgZm9yIHBhcnRpY3VsYXIgbm9kZSB0eXBlLiBUaG9zZSBvZmZzZXRzIGFyZSAnZnJvbSB0aGUgbm9kZSBwb2ludGVyJworICAgICAobm90IHRoZSBibG9jayBzdGFydCkgYW5kIGNhbiBiZSB0aHVzIG5lZ2F0aXZlIHNpbmNlIG5vZGUgcG9pbnRlcnMgcG9pbnRzIHRvd2FyZHMgdGhlIGVuZCBvZiBibG9ja3MuCisgICAgICovCisKKyAgICAvLyBMaW1pdCBmb3IgdGhlIHN0YXJ0aW5nIGNlbGwgLyBzdWJsZXZlbCAoMiBiaXRzIC0+IDQgcG9pbnRlcnMpLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgU1BMSVRfU1RBUlRfTEVWRUxfTElNSVQgPSA0OworICAgIC8vIExpbWl0IGZvciB0aGUgb3RoZXIgc3VibGV2ZWxzICgzIGJpdHMgLT4gOCBwb2ludGVycykuCisgICAgc3RhdGljIGZpbmFsIGludCBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVCA9IDg7CisgICAgLy8gQml0c2hpZnQgYmV0d2VlbiBsZXZlbHMuCisgICAgc3RhdGljIGZpbmFsIGludCBTUExJVF9MRVZFTF9TSElGVCA9IDM7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IFNQQVJTRV9DSElMRF9DT1VOVCA9IDY7CisgICAgLy8gT2Zmc2V0IHRvIHRoZSBmaXJzdCBjaGlsZCBwb2ludGVyIG9mIGEgc3BhcmUgbm9kZSAobGFpZCBvdXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrKQorICAgIHN0YXRpYyBmaW5hbCBpbnQgU1BBUlNFX0NISUxEUkVOX09GRlNFVCA9IDAgLSBTUEFSU0VfT0ZGU0VUOworICAgIC8vIE9mZnNldCB0byB0aGUgZmlyc3QgdHJhbnNpdGlvbiBieXRlIG9mIGEgc3BhcnNlIG5vZGUgKGxhaWQgb3V0IGFmdGVyIHRoZSBjaGlsZCBwb2ludGVycykKKyAgICBzdGF0aWMgZmluYWwgaW50IFNQQVJTRV9CWVRFU19PRkZTRVQgPSBTUEFSU0VfQ0hJTERfQ09VTlQgKiA0IC0gU1BBUlNFX09GRlNFVDsKKyAgICAvLyBPZmZzZXQgdG8gdGhlIG9yZGVyIHdvcmQgb2YgYSBzcGFyc2Ugbm9kZSAobGFpZCBvdXQgYWZ0ZXIgdGhlIGNoaWxkcmVuIChwb2ludGVyICsgdHJhbnNpdGlvbiBieXRlKSkKKyAgICBzdGF0aWMgZmluYWwgaW50IFNQQVJTRV9PUkRFUl9PRkZTRVQgPSBTUEFSU0VfQ0hJTERfQ09VTlQgKiA1IC0gU1BBUlNFX09GRlNFVDsgIC8vIDAKKworICAgIC8vIE9mZnNldCBvZiB0aGUgZmxhZyBieXRlIGluIGEgcHJlZml4IG5vZGUuIEluIHNoYXJlZCBibG9ja3MsIHRoaXMgY29udGFpbnMgdGhlIG9mZnNldCBvZiB0aGUgbmV4dCBub2RlLgorICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJFRklYX0ZMQUdTX09GRlNFVCA9IDQgLSBQUkVGSVhfT0ZGU0VUOworICAgIC8vIE9mZnNldCBvZiB0aGUgY29udGVudCBpZAorICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJFRklYX0NPTlRFTlRfT0ZGU0VUID0gMCAtIFBSRUZJWF9PRkZTRVQ7CisgICAgLy8gT2Zmc2V0IG9mIHRoZSBuZXh0IHBvaW50ZXIgaW4gYSBub24tc2hhcmVkIHByZWZpeCBub2RlCisgICAgc3RhdGljIGZpbmFsIGludCBQUkVGSVhfUE9JTlRFUl9PRkZTRVQgPSBMQVNUX1BPSU5URVJfT0ZGU0VUIC0gUFJFRklYX09GRlNFVDsKKworICAgIC8qKgorICAgICAqIFZhbHVlIHVzZWQgYXMgbnVsbCBmb3Igbm9kZSBwb2ludGVycy4KKyAgICAgKiBObyBub2RlIGNhbiB1c2UgdGhpcyBhZGRyZXNzICh3ZSBlbmZvcmNlIHRoaXMgYnkgbm90IGFsbG93aW5nIGNoYWluIG5vZGVzIHRvIGdyb3cgdG8gcG9zaXRpb24gMCkuCisgICAgICogRG8gbm90IGNoYW5nZSB0aGlzIGFzIHRoZSBjb2RlIHJlbGllcyB0aGVyZSBiZWluZyBhIE5PTkUgcGxhY2VkIGluIGFsbCBieXRlcyBvZiB0aGUgYmxvY2sgdGhhdCBhcmUgbm90IHNldC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOworCisgICAgdm9sYXRpbGUgaW50IHJvb3Q7CisKKyAgICAvKgorICAgICBFWFBBTkRBQkxFIERBVEEgU1RPUkFHRQorCisgICAgIFRoZSB0cmllcyB3aWxsIG5lZWQgbW9yZSBhbmQgbW9yZSBzcGFjZSBpbiBidWZmZXJzIGFuZCBjb250ZW50IGxpc3RzIGFzIHRoZXkgZ3Jvdy4gSW5zdGVhZCBvZiB1c2luZyBBcnJheUxpc3QtbGlrZQorICAgICByZWFsbG9jYXRpb24gd2l0aCBjb3B5aW5nLCB3aGljaCBtYXkgYmUgcHJvaGliaXRpdmVseSBleHBlbnNpdmUgZm9yIGxhcmdlIGJ1ZmZlcnMsIHdlIHVzZSBhIHNlcXVlbmNlIG9mCisgICAgIGJ1ZmZlcnMvY29udGVudCBhcnJheXMgdGhhdCBkb3VibGUgaW4gc2l6ZSBvbiBldmVyeSBleHBhbnNpb24uCisKKyAgICAgRm9yIGEgZ2l2ZW4gYWRkcmVzcyB4IHRoZSBpbmRleCBvZiB0aGUgYnVmZmVyIGNhbiBiZSBmb3VuZCB3aXRoIHRoZSBmb2xsb3dpbmcgY2FsY3VsYXRpb246CisgICAgICAgIGluZGV4X29mX21vc3Rfc2lnbmlmaWNhbnRfc2V0X2JpdCh4IC8gbWluX3NpemUgKyAxKQorICAgICAocmVseWluZyBvbiBzdW0gKDJeaSkgZm9yIGkgaW4gWzAsIG4tMV0gPT0gMl5uIC0gMSkgd2hpY2ggY2FuIGJlIHBlcmZvcm1lZCBxdWlja2x5IG9uIG1vZGVybiBoYXJkd2FyZS4KKworICAgICBGaW5kaW5nIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBidWZmZXIgaXMgdGhlbgorICAgICAgICB4ICsgbWluIC0gKG1pbiA8PCBidWZmZXJfaW5kZXgpCisKKyAgICAgVGhlIGFsbG9jYXRlZCBzcGFjZSBzdGFydHMgMjU2IGJ5dGVzIGZvciB0aGUgYnVmZmVyIGFuZCAxNiBlbnRyaWVzIGZvciB0aGUgY29udGVudCBsaXN0LgorCisgICAgIE5vdGUgdGhhdCBhIGJ1ZmZlciBpcyBub3QgYWxsb3dlZCB0byBzcGxpdCAzMi1ieXRlIGJsb2NrcyAoY29kZSBhc3N1bWVzIHNhbWUgYnVmZmVyIGNhbiBiZSB1c2VkIGZvciBhbGwgYnl0ZXMKKyAgICAgaW5zaWRlIHRoZSBibG9jaykuCisgICAgICovCisKKyAgICBzdGF0aWMgZmluYWwgaW50IEJVRl9TVEFSVF9TSElGVCA9IDg7CisgICAgc3RhdGljIGZpbmFsIGludCBCVUZfU1RBUlRfU0laRSA9IDEgPDwgQlVGX1NUQVJUX1NISUZUOworCisgICAgc3RhdGljIGZpbmFsIGludCBDT05URU5UU19TVEFSVF9TSElGVCA9IDQ7CisgICAgc3RhdGljIGZpbmFsIGludCBDT05URU5UU19TVEFSVF9TSVpFID0gMSA8PCBDT05URU5UU19TVEFSVF9TSElGVDsKKworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgYXNzZXJ0IEJVRl9TVEFSVF9TSVpFICUgQkxPQ0tfU0laRSA9PSAwIDogIkluaXRpYWwgYnVmZmVyIHNpemUgbXVzdCBmaXQgYSBmdWxsIGJsb2NrLiI7CisgICAgfQorCisgICAgZmluYWwgVW5zYWZlQnVmZmVyW10gYnVmZmVyczsKKyAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2VBcnJheTxUPltdIGNvbnRlbnRBcnJheXM7CisKKyAgICBJbk1lbW9yeVJlYWRUcmllKFVuc2FmZUJ1ZmZlcltdIGJ1ZmZlcnMsIEF0b21pY1JlZmVyZW5jZUFycmF5PFQ+W10gY29udGVudEFycmF5cywgaW50IHJvb3QpCisgICAgeworICAgICAgICB0aGlzLmJ1ZmZlcnMgPSBidWZmZXJzOworICAgICAgICB0aGlzLmNvbnRlbnRBcnJheXMgPSBjb250ZW50QXJyYXlzOworICAgICAgICB0aGlzLnJvb3QgPSByb290OworICAgIH0KKworICAgIC8qCisgICAgIEJ1ZmZlciwgY29udGVudCBsaXN0IGFuZCBibG9jayBtYW5hZ2VtZW50CisgICAgICovCisgICAgaW50IGdldENodW5rSWR4KGludCBwb3MsIGludCBtaW5DaHVua1NoaWZ0LCBpbnQgbWluQ2h1bmtTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDMxIC0gbWluQ2h1bmtTaGlmdCAtIEludGVnZXIubnVtYmVyT2ZMZWFkaW5nWmVyb3MocG9zICsgbWluQ2h1bmtTaXplKTsKKyAgICB9CisKKyAgICBpbnQgaW5DaHVua1BvaW50ZXIoaW50IHBvcywgaW50IGNodW5rSW5kZXgsIGludCBtaW5DaHVua1NpemUpCisgICAgeworICAgICAgICByZXR1cm4gcG9zICsgbWluQ2h1bmtTaXplIC0gKG1pbkNodW5rU2l6ZSA8PCBjaHVua0luZGV4KTsKKyAgICB9CisKKyAgICBVbnNhZmVCdWZmZXIgZ2V0Q2h1bmsoaW50IHBvcykKKyAgICB7CisgICAgICAgIGludCBsZWFkQml0ID0gZ2V0Q2h1bmtJZHgocG9zLCBCVUZfU1RBUlRfU0hJRlQsIEJVRl9TVEFSVF9TSVpFKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcnNbbGVhZEJpdF07CisgICAgfQorCisgICAgaW50IGluQ2h1bmtQb2ludGVyKGludCBwb3MpCisgICAgeworICAgICAgICBpbnQgbGVhZEJpdCA9IGdldENodW5rSWR4KHBvcywgQlVGX1NUQVJUX1NISUZULCBCVUZfU1RBUlRfU0laRSk7CisgICAgICAgIHJldHVybiBpbkNodW5rUG9pbnRlcihwb3MsIGxlYWRCaXQsIEJVRl9TVEFSVF9TSVpFKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFBvaW50ZXIgb2Zmc2V0IGZvciBhIG5vZGUgcG9pbnRlci4KKyAgICAgKi8KKyAgICBpbnQgb2Zmc2V0KGludCBwb3MpCisgICAgeworICAgICAgICByZXR1cm4gcG9zICYgKEJMT0NLX1NJWkUgLSAxKTsKKyAgICB9CisKKyAgICBmaW5hbCBpbnQgZ2V0VW5zaWduZWRCeXRlKGludCBwb3MpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Q2h1bmsocG9zKS5nZXRCeXRlKGluQ2h1bmtQb2ludGVyKHBvcykpICYgMHhGRjsKKyAgICB9CisKKyAgICBmaW5hbCBpbnQgZ2V0VW5zaWduZWRTaG9ydChpbnQgcG9zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldENodW5rKHBvcykuZ2V0U2hvcnQoaW5DaHVua1BvaW50ZXIocG9zKSkgJiAweEZGRkY7CisgICAgfQorCisgICAgZmluYWwgaW50IGdldEludChpbnQgcG9zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldENodW5rKHBvcykuZ2V0SW50KGluQ2h1bmtQb2ludGVyKHBvcykpOworICAgIH0KKworICAgIFQgZ2V0Q29udGVudChpbnQgaW5kZXgpCisgICAgeworICAgICAgICBpbnQgbGVhZEJpdCA9IGdldENodW5rSWR4KGluZGV4LCBDT05URU5UU19TVEFSVF9TSElGVCwgQ09OVEVOVFNfU1RBUlRfU0laRSk7CisgICAgICAgIGludCBvZnMgPSBpbkNodW5rUG9pbnRlcihpbmRleCwgbGVhZEJpdCwgQ09OVEVOVFNfU1RBUlRfU0laRSk7CisgICAgICAgIEF0b21pY1JlZmVyZW5jZUFycmF5PFQ+IGFycmF5ID0gY29udGVudEFycmF5c1tsZWFkQml0XTsKKyAgICAgICAgcmV0dXJuIGFycmF5LmdldChvZnMpOworICAgIH0KKworICAgIC8qCisgICAgIFJlYWRpbmcgbm9kZSBjb250ZW50CisgICAgICovCisKKyAgICBib29sZWFuIGlzTnVsbChpbnQgbm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlID09IE5PTkU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc0xlYWYoaW50IG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZSA8IE5PTkU7CisgICAgfQorCisgICAgYm9vbGVhbiBpc051bGxPckxlYWYoaW50IG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZSA8PSBOT05FOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB0cmFuc2l0aW9ucyBpbiBhIGNoYWluIGJsb2NrIGVudGVyZWQgd2l0aCB0aGUgZ2l2ZW4gcG9pbnRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjaGFpbkJsb2NrTGVuZ3RoKGludCBub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExBU1RfUE9JTlRFUl9PRkZTRVQgLSBvZmZzZXQobm9kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbm9kZSdzIGNoaWxkIGZvciB0aGUgZ2l2ZW4gdHJhbnNpdGlvbiBjaGFyYWN0ZXIKKyAgICAgKi8KKyAgICBpbnQgZ2V0Q2hpbGQoaW50IG5vZGUsIGludCB0cmFucykKKyAgICB7CisgICAgICAgIGlmIChpc051bGxPckxlYWYobm9kZSkpCisgICAgICAgICAgICByZXR1cm4gTk9ORTsKKworICAgICAgICBub2RlID0gZm9sbG93Q29udGVudFRyYW5zaXRpb24obm9kZSk7CisKKyAgICAgICAgc3dpdGNoIChvZmZzZXQobm9kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU1BBUlNFX09GRlNFVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3BhcnNlQ2hpbGQobm9kZSwgdHJhbnMpOworICAgICAgICAgICAgY2FzZSBTUExJVF9PRkZTRVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNwbGl0Q2hpbGQobm9kZSwgdHJhbnMpOworICAgICAgICAgICAgY2FzZSBDSEFJTl9NQVhfT0ZGU0VUOgorICAgICAgICAgICAgICAgIGlmICh0cmFucyAhPSBnZXRVbnNpZ25lZEJ5dGUobm9kZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT05FOworICAgICAgICAgICAgICAgIHJldHVybiBnZXRJbnQobm9kZSArIDEpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAodHJhbnMgIT0gZ2V0VW5zaWduZWRCeXRlKG5vZGUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9ORTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZSArIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGZvbGxvd0NvbnRlbnRUcmFuc2l0aW9uKGludCBub2RlKQorICAgIHsKKyAgICAgICAgaWYgKGlzTnVsbE9yTGVhZihub2RlKSkKKyAgICAgICAgICAgIHJldHVybiBOT05FOworCisgICAgICAgIGlmIChvZmZzZXQobm9kZSkgPT0gUFJFRklYX09GRlNFVCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGIgPSBnZXRVbnNpZ25lZEJ5dGUobm9kZSArIFBSRUZJWF9GTEFHU19PRkZTRVQpOworICAgICAgICAgICAgaWYgKGIgPCBCTE9DS19TSVpFKQorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlIC0gUFJFRklYX09GRlNFVCArIGI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbm9kZSA9IGdldEludChub2RlICsgUFJFRklYX1BPSU5URVJfT0ZGU0VUKTsKKworICAgICAgICAgICAgYXNzZXJ0IG5vZGUgPj0gMCAmJiBvZmZzZXQobm9kZSkgIT0gUFJFRklYX09GRlNFVDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZHZhbmNlIGFzIGxvbmcgYXMgdGhlIGNlbGwgcG9pbnRlZCB0byBieSB0aGUgZ2l2ZW4gcG9pbnRlciB3aWxsIGxldCB5b3UuCisgICAgICogPHA+CisgICAgICogVGhpcyBpcyB0aGUgc2FtZSBhcyBnZXRDaGlsZChub2RlLCBmaXJzdCksIGV4Y2VwdCBmb3IgY2hhaW4gbm9kZXMgd2hlcmUgaXQgd291bGQgd2FsayB0aGUgZmlsbCBjaGFpbiBhcyBsb25nIGFzCisgICAgICogdGhlIGlucHV0IHNvdXJjZSBtYXRjaGVzLgorICAgICAqLworICAgIGludCBhZHZhbmNlKGludCBub2RlLCBpbnQgZmlyc3QsIEJ5dGVTb3VyY2UgcmVzdCkKKyAgICB7CisgICAgICAgIGlmIChpc051bGxPckxlYWYobm9kZSkpCisgICAgICAgICAgICByZXR1cm4gTk9ORTsKKworICAgICAgICBub2RlID0gZm9sbG93Q29udGVudFRyYW5zaXRpb24obm9kZSk7CisKKyAgICAgICAgc3dpdGNoIChvZmZzZXQobm9kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU1BBUlNFX09GRlNFVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3BhcnNlQ2hpbGQobm9kZSwgZmlyc3QpOworICAgICAgICAgICAgY2FzZSBTUExJVF9PRkZTRVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNwbGl0Q2hpbGQobm9kZSwgZmlyc3QpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgZmlyc3QgYnl0ZSBtYXRjaGVzIHRoZSBleHBlY3RlZAorICAgICAgICAgICAgICAgIGlmIChnZXRVbnNpZ25lZEJ5dGUobm9kZSsrKSAhPSBmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PTkU7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHJlc3Qgb2YgdGhlIGJ5dGVzIHByb3ZpZGVkIGJ5IHRoZSBjaGFpbiBub2RlCisgICAgICAgICAgICAgICAgZm9yIChpbnQgbGVuZ3RoID0gY2hhaW5CbG9ja0xlbmd0aChub2RlKTsgbGVuZ3RoID4gMDsgLS1sZW5ndGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IHJlc3QubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0VW5zaWduZWRCeXRlKG5vZGUrKykgIT0gZmlyc3QpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9ORTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gQWxsIGJ5dGVzIG1hdGNoZWQsIG5vZGUgaXMgbm93IHBvc2l0aW9uZWQgb24gdGhlIGNoaWxkIHBvaW50ZXIuIEZvbGxvdyBpdC4KKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW50KG5vZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjaGlsZCBmb3IgdGhlIGdpdmVuIHRyYW5zaXRpb24gY2hhcmFjdGVyLCBrbm93aW5nIHRoYXQgdGhlIG5vZGUgaXMgc3BhcnNlCisgICAgICovCisgICAgaW50IGdldFNwYXJzZUNoaWxkKGludCBub2RlLCBpbnQgdHJhbnMpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNQQVJTRV9DSElMRF9DT1VOVDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZ2V0VW5zaWduZWRCeXRlKG5vZGUgKyBTUEFSU0VfQllURVNfT0ZGU0VUICsgaSkgPT0gdHJhbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNoaWxkID0gZ2V0SW50KG5vZGUgKyBTUEFSU0VfQ0hJTERSRU5fT0ZGU0VUICsgaSAqIDQpOworCisgICAgICAgICAgICAgICAgLy8gd2UgY2FuJ3QgdHJ1c3QgdGhlIHRyYW5zaXRpb24gY2hhcmFjdGVyIHJlYWQgYWJvdmUsIGJlY2F1c2UgaXQgbWF5IGhhdmUgYmVlbiBmZXRjaGVkIGJlZm9yZSBhCisgICAgICAgICAgICAgICAgLy8gY29uY3VycmVudCB1cGRhdGUgaGFwcGVuZWQsIGFuZCB0aGUgdXBkYXRlIG1heSBoYXZlIG1hbmFnZWQgdG8gbW9kaWZ5IHRoZSBwb2ludGVyIGJ5IG5vdy4KKyAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCBpZiB3ZSByZWFkIGl0IG5vdyB0aGF0IHdlIGhhdmUgYWNjZXNzZWQgdGhlIHZvbGF0aWxlIHBvaW50ZXIsIGl0IG11c3QgaGF2ZSB0aGUgY29ycmVjdAorICAgICAgICAgICAgICAgIC8vIHZhbHVlIGFzIGl0IGlzIHNldCBiZWZvcmUgdGhlIHBvaW50ZXIuCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkICE9IE5PTkUgJiYgZ2V0VW5zaWduZWRCeXRlKG5vZGUgKyBTUEFSU0VfQllURVNfT0ZGU0VUICsgaSkgPT0gdHJhbnMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9ORTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIHRyYW5zaXRpb24sIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXggKHdpdGhpbiB0aGUgbm9kZSBibG9jaykgb2YgdGhlIHBvaW50ZXIgdG8gdGhlIG1pZCBibG9jayBvZgorICAgICAqIGEgc3BsaXQgbm9kZS4KKyAgICAgKi8KKyAgICBpbnQgc3BsaXROb2RlTWlkSW5kZXgoaW50IHRyYW5zKQorICAgIHsKKyAgICAgICAgLy8gZmlyc3QgMiBiaXRzIG9mIHRoZSAyLTMtMyBzcGxpdAorICAgICAgICByZXR1cm4gKHRyYW5zID4+IDYpICYgMHgzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgdHJhbnNpdGlvbiwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBpbmRleCAod2l0aGluIHRoZSBtaWQgYmxvY2spIG9mIHRoZSBwb2ludGVyIHRvIHRoZSB0YWlsIGJsb2NrIG9mCisgICAgICogYSBzcGxpdCBub2RlLgorICAgICAqLworICAgIGludCBzcGxpdE5vZGVUYWlsSW5kZXgoaW50IHRyYW5zKQorICAgIHsKKyAgICAgICAgLy8gc2Vjb25kIDMgYml0cyBvZiB0aGUgMi0zLTMgc3BsaXQKKyAgICAgICAgcmV0dXJuICh0cmFucyA+PiAzKSAmIDB4NzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIHRyYW5zaXRpb24sIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXggKHdpdGhpbiB0aGUgdGFpbCBibG9jaykgb2YgdGhlIHBvaW50ZXIgdG8gdGhlIGNoaWxkIG9mCisgICAgICogYSBzcGxpdCBub2RlLgorICAgICAqLworICAgIGludCBzcGxpdE5vZGVDaGlsZEluZGV4KGludCB0cmFucykKKyAgICB7CisgICAgICAgIC8vIHRoaXJkIDMgYml0cyBvZiB0aGUgMi0zLTMgc3BsaXQKKyAgICAgICAgcmV0dXJuIHRyYW5zICYgMHg3OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2hpbGQgZm9yIHRoZSBnaXZlbiB0cmFuc2l0aW9uIGNoYXJhY3Rlciwga25vd2luZyB0aGF0IHRoZSBub2RlIGlzIHNwbGl0CisgICAgICovCisgICAgaW50IGdldFNwbGl0Q2hpbGQoaW50IG5vZGUsIGludCB0cmFucykKKyAgICB7CisgICAgICAgIGludCBtaWQgPSBnZXRTcGxpdEJsb2NrUG9pbnRlcihub2RlLCBzcGxpdE5vZGVNaWRJbmRleCh0cmFucyksIFNQTElUX1NUQVJUX0xFVkVMX0xJTUlUKTsKKyAgICAgICAgaWYgKGlzTnVsbChtaWQpKQorICAgICAgICAgICAgcmV0dXJuIE5PTkU7CisKKyAgICAgICAgaW50IHRhaWwgPSBnZXRTcGxpdEJsb2NrUG9pbnRlcihtaWQsIHNwbGl0Tm9kZVRhaWxJbmRleCh0cmFucyksIFNQTElUX09USEVSX0xFVkVMX0xJTUlUKTsKKyAgICAgICAgaWYgKGlzTnVsbCh0YWlsKSkKKyAgICAgICAgICAgIHJldHVybiBOT05FOworICAgICAgICByZXR1cm4gZ2V0U3BsaXRCbG9ja1BvaW50ZXIodGFpbCwgc3BsaXROb2RlQ2hpbGRJbmRleCh0cmFucyksIFNQTElUX09USEVSX0xFVkVMX0xJTUlUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbnRlbnQgZm9yIGEgZ2l2ZW4gbm9kZQorICAgICAqLworICAgIFQgZ2V0Tm9kZUNvbnRlbnQoaW50IG5vZGUpCisgICAgeworICAgICAgICBpZiAoaXNMZWFmKG5vZGUpKQorICAgICAgICAgICAgcmV0dXJuIGdldENvbnRlbnQofm5vZGUpOworCisgICAgICAgIGlmIChvZmZzZXQobm9kZSkgIT0gUFJFRklYX09GRlNFVCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGludCBpbmRleCA9IGdldEludChub2RlICsgUFJFRklYX0NPTlRFTlRfT0ZGU0VUKTsKKyAgICAgICAgcmV0dXJuIChpbmRleCA+PSAwKQorICAgICAgICAgICAgICAgPyBnZXRDb250ZW50KGluZGV4KQorICAgICAgICAgICAgICAgOiBudWxsOworICAgIH0KKworICAgIGludCBzcGxpdEJsb2NrUG9pbnRlckFkZHJlc3MoaW50IG5vZGUsIGludCBjaGlsZEluZGV4LCBpbnQgc3ViTGV2ZWxMaW1pdCkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlIC0gU1BMSVRfT0ZGU0VUICsgKDggLSBzdWJMZXZlbExpbWl0ICsgY2hpbGRJbmRleCkgKiA0OworICAgIH0KKworICAgIGludCBnZXRTcGxpdEJsb2NrUG9pbnRlcihpbnQgbm9kZSwgaW50IGNoaWxkSW5kZXgsIGludCBzdWJMZXZlbExpbWl0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldEludChzcGxpdEJsb2NrUG9pbnRlckFkZHJlc3Mobm9kZSwgY2hpbGRJbmRleCwgc3ViTGV2ZWxMaW1pdCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJhY2t0cmFja2luZyBzdGF0ZSBmb3IgYSBjdXJzb3IuCisgICAgICoKKyAgICAgKiBUbyBhdm9pZCBhbGxvY2F0aW9ucyBhbmQgcG9pbnRlci1jaGFzaW5nLCB0aGUgYmFja3RyYWNraW5nIGRhdGEgaXMgc3RvcmVkIGluIGEgc2ltcGxlIGludCBhcnJheSB3aXRoCisgICAgICogQkFDS1RSQUNLX0lOVFNfUEVSX0VOVFJZIGludHMgZm9yIGVhY2ggbGV2ZWwuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3Vyc29yQmFja3RyYWNraW5nU3RhdGUKKyAgICB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQkFDS1RSQUNLX0lOVFNfUEVSX0VOVFJZID0gMzsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBCQUNLVFJBQ0tfSU5JVElBTF9TSVpFID0gMTY7CisgICAgICAgIHByaXZhdGUgaW50W10gYmFja3RyYWNrID0gbmV3IGludFtCQUNLVFJBQ0tfSU5JVElBTF9TSVpFICogQkFDS1RSQUNLX0lOVFNfUEVSX0VOVFJZXTsKKyAgICAgICAgaW50IGJhY2t0cmFja0RlcHRoID0gMDsKKworICAgICAgICB2b2lkIGFkZEJhY2t0cmFjayhpbnQgbm9kZSwgaW50IGRhdGEsIGludCBkZXB0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJhY2t0cmFja0RlcHRoICogQkFDS1RSQUNLX0lOVFNfUEVSX0VOVFJZID49IGJhY2t0cmFjay5sZW5ndGgpCisgICAgICAgICAgICAgICAgYmFja3RyYWNrID0gQXJyYXlzLmNvcHlPZihiYWNrdHJhY2ssIGJhY2t0cmFjay5sZW5ndGggKiAyKTsKKyAgICAgICAgICAgIGJhY2t0cmFja1tiYWNrdHJhY2tEZXB0aCAqIEJBQ0tUUkFDS19JTlRTX1BFUl9FTlRSWSArIDBdID0gbm9kZTsKKyAgICAgICAgICAgIGJhY2t0cmFja1tiYWNrdHJhY2tEZXB0aCAqIEJBQ0tUUkFDS19JTlRTX1BFUl9FTlRSWSArIDFdID0gZGF0YTsKKyAgICAgICAgICAgIGJhY2t0cmFja1tiYWNrdHJhY2tEZXB0aCAqIEJBQ0tUUkFDS19JTlRTX1BFUl9FTlRSWSArIDJdID0gZGVwdGg7CisgICAgICAgICAgICArK2JhY2t0cmFja0RlcHRoOworICAgICAgICB9CisKKyAgICAgICAgaW50IG5vZGUoaW50IGJhY2t0cmFja0RlcHRoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmFja3RyYWNrW2JhY2t0cmFja0RlcHRoICogQkFDS1RSQUNLX0lOVFNfUEVSX0VOVFJZICsgMF07CisgICAgICAgIH0KKworICAgICAgICBpbnQgZGF0YShpbnQgYmFja3RyYWNrRGVwdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiYWNrdHJhY2tbYmFja3RyYWNrRGVwdGggKiBCQUNLVFJBQ0tfSU5UU19QRVJfRU5UUlkgKyAxXTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBkZXB0aChpbnQgYmFja3RyYWNrRGVwdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiYWNrdHJhY2tbYmFja3RyYWNrRGVwdGggKiBCQUNLVFJBQ0tfSU5UU19QRVJfRU5UUlkgKyAyXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQ3Vyc29yIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogSW5NZW1vcnlUcmllIGN1cnNvcnMgbWFpbnRhaW4gdGhlaXIgYmFja3RyYWNraW5nIHN0YXRlIGluIEN1cnNvckJhY2t0cmFja2luZ1N0YXRlIHdoZXJlIHRoZXkgc3RvcmUKKyAgICAgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbm9kZSB0byBiYWNrdHJhY2sgdG8gYW5kIHRoZSB0cmFuc2l0aW9ucyBzdGlsbCBsZWZ0IHRvIHRha2Ugb3IgYXR0ZW1wdC4KKyAgICAgKgorICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgZGlmZmVyZW50IGZvciB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIG5vZGU6CisgICAgICogLSBmb3IgbGVhZiBhbmQgY2hhaW4gbm8gYmFja3RyYWNraW5nIGlzIHNhdmVkIChiZWNhdXNlIHdlIGtub3cgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgdHJhbnNpdGlvbnMpCisgICAgICogLSBmb3Igc3BhcnNlIHdlIHN0b3JlIHRoZSByZW1haW5kZXIgb2YgdGhlIG9yZGVyIHdvcmQKKyAgICAgKiAtIGZvciBzcGxpdCB3ZSBzdG9yZSBvbmUgZW50cnkgcGVyIHN1Yi1sZXZlbCBvZiB0aGUgMi0zLTMgc3BsaXQKKyAgICAgKgorICAgICAqIFdoZW4gdGhlIGN1cnNvciBpcyBhc2tlZCB0byBhZHZhbmNlIGl0IGZpcnN0IGNoZWNrcyB0aGUgY3VycmVudCBub2RlIGZvciBjaGlsZHJlbiwgYW5kIGlmIHRoZXJlIGFyZW4ndCBhbnkKKyAgICAgKiAoaS5lLiBpdCBpcyBwb3NpdGlvbmVkIG9uIGEgbGVhZiBub2RlKSwgaXQgZ29lcyBvbmUgbGV2ZWwgdXAgdGhlIGJhY2t0cmFja2luZyBjaGFpbiwgd2hlcmUgd2UgYXJlIGd1YXJhbnRlZWQgdG8KKyAgICAgKiBoYXZlIGEgcmVtYWluaW5nIGNoaWxkIHRvIGFkdmFuY2UgdG8uIFdoZW4gdGhlcmUncyBub3RoaW5nIHRvIGJhY2t0cmFjayB0bywgdGhlIHRyaWUgaXMgZXhoYXVzdGVkLgorICAgICAqLworICAgIGNsYXNzIE1lbXRhYmxlQ3Vyc29yIGV4dGVuZHMgQ3Vyc29yQmFja3RyYWNraW5nU3RhdGUgaW1wbGVtZW50cyBDdXJzb3I8VD4KKyAgICB7CisgICAgICAgIHByaXZhdGUgaW50IGN1cnJlbnROb2RlOworICAgICAgICBwcml2YXRlIGludCBpbmNvbWluZ1RyYW5zaXRpb247CisgICAgICAgIHByaXZhdGUgVCBjb250ZW50OworICAgICAgICBwcml2YXRlIGludCBkZXB0aCA9IC0xOworCisgICAgICAgIE1lbXRhYmxlQ3Vyc29yKCkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzY2VuZEludG8ocm9vdCwgLTEpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgYWR2YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpc051bGxPckxlYWYoY3VycmVudE5vZGUpKQorICAgICAgICAgICAgICAgIHJldHVybiBiYWNrdHJhY2soKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gYWR2YW5jZVRvRmlyc3RDaGlsZChjdXJyZW50Tm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBhZHZhbmNlTXVsdGlwbGUoVHJhbnNpdGlvbnNSZWNlaXZlciByZWNlaXZlcikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG5vZGUgPSBjdXJyZW50Tm9kZTsKKyAgICAgICAgICAgIGlmICghaXNDaGFpbk5vZGUobm9kZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKKworICAgICAgICAgICAgLy8gSnVtcCBkaXJlY3RseSB0byB0aGUgY2hhaW4ncyBjaGlsZC4KKyAgICAgICAgICAgIFVuc2FmZUJ1ZmZlciBjaHVuayA9IGdldENodW5rKG5vZGUpOworICAgICAgICAgICAgaW50IGluQ2h1bmtOb2RlID0gaW5DaHVua1BvaW50ZXIobm9kZSk7CisgICAgICAgICAgICBpbnQgYnl0ZXNKdW1wZWQgPSBjaGFpbkJsb2NrTGVuZ3RoKG5vZGUpIC0gMTsgICAvLyBsZWF2ZSB0aGUgbGFzdCBieXRlIGZvciBpbmNvbWluZ1RyYW5zaXRpb24KKyAgICAgICAgICAgIGlmIChyZWNlaXZlciAhPSBudWxsICYmIGJ5dGVzSnVtcGVkID4gMCkKKyAgICAgICAgICAgICAgICByZWNlaXZlci5hZGRQYXRoQnl0ZXMoY2h1bmssIGluQ2h1bmtOb2RlLCBieXRlc0p1bXBlZCk7CisgICAgICAgICAgICBkZXB0aCArPSBieXRlc0p1bXBlZDsgICAgLy8gZGVzY2VuZEludG8gd2lsbCBhZGQgb25lCisgICAgICAgICAgICBpbkNodW5rTm9kZSArPSBieXRlc0p1bXBlZDsKKworICAgICAgICAgICAgLy8gaW5DaHVua05vZGUgaXMgbm93IHBvc2l0aW9uZWQgb24gdGhlIGxhc3QgYnl0ZSBvZiB0aGUgY2hhaW4uCisgICAgICAgICAgICAvLyBDb25zdW1lIGl0IHRvIGJlIHRoZSBuZXcgc3RhdGUncyBpbmNvbWluZ1RyYW5zaXRpb24uCisgICAgICAgICAgICBpbnQgdHJhbnNpdGlvbiA9IGNodW5rLmdldEJ5dGUoaW5DaHVua05vZGUrKykgJiAweEZGOworICAgICAgICAgICAgLy8gaW5DaHVua05vZGUgaXMgbm93IHBvc2l0aW9uZWQgb24gdGhlIGNoaWxkIHBvaW50ZXIuCisgICAgICAgICAgICBpbnQgY2hpbGQgPSBjaHVuay5nZXRJbnQoaW5DaHVua05vZGUpOworICAgICAgICAgICAgcmV0dXJuIGRlc2NlbmRJbnRvKGNoaWxkLCB0cmFuc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNraXBDaGlsZHJlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiYWNrdHJhY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlcHRoKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlcHRoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUIGNvbnRlbnQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY29udGVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGluY29taW5nVHJhbnNpdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpbmNvbWluZ1RyYW5zaXRpb247CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBiYWNrdHJhY2soKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoLS1iYWNrdHJhY2tEZXB0aCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlcHRoID0gLTE7CisKKyAgICAgICAgICAgIGRlcHRoID0gZGVwdGgoYmFja3RyYWNrRGVwdGgpOworICAgICAgICAgICAgcmV0dXJuIGFkdmFuY2VUb05leHRDaGlsZChub2RlKGJhY2t0cmFja0RlcHRoKSwgZGF0YShiYWNrdHJhY2tEZXB0aCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgYWR2YW5jZVRvRmlyc3RDaGlsZChpbnQgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0ICghaXNOdWxsT3JMZWFmKG5vZGUpKTsKKworICAgICAgICAgICAgc3dpdGNoIChvZmZzZXQobm9kZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBTUExJVF9PRkZTRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjZW5kSW5TcGxpdFN1YmxldmVsKG5vZGUsIFNQTElUX1NUQVJUX0xFVkVMX0xJTUlULCAwLCBTUExJVF9MRVZFTF9TSElGVCAqIDIpOworICAgICAgICAgICAgICAgIGNhc2UgU1BBUlNFX09GRlNFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRWYWxpZFNwYXJzZVRyYW5zaXRpb24obm9kZSwgZ2V0VW5zaWduZWRTaG9ydChub2RlICsgU1BBUlNFX09SREVSX09GRlNFVCkpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRDaGFpblRyYW5zaXRpb24obm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBhZHZhbmNlVG9OZXh0Q2hpbGQoaW50IG5vZGUsIGludCBkYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgKCFpc051bGxPckxlYWYobm9kZSkpOworCisgICAgICAgICAgICBzd2l0Y2ggKG9mZnNldChub2RlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIFNQTElUX09GRlNFVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRWYWxpZFNwbGl0VHJhbnNpdGlvbihub2RlLCBkYXRhKTsKKyAgICAgICAgICAgICAgICBjYXNlIFNQQVJTRV9PRkZTRVQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0VmFsaWRTcGFyc2VUcmFuc2l0aW9uKG5vZGUsIGRhdGEpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5leHBlY3RlZCBub2RlIHR5cGUgaW4gYmFja3RyYWNrIHN0YXRlLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlc2NlbmQgaW50byB0aGUgc3ViLWxldmVscyBvZiBhIHNwbGl0IG5vZGUuIEFkdmFuY2VzIHRvIHRoZSBmaXJzdCBjaGlsZCBhbmQgY3JlYXRlcyBiYWNrdHJhY2tpbmcgZW50cmllcworICAgICAgICAgKiBmb3IgdGhlIGZvbGxvd2luZyBvbmVzLiBXZSB1c2UgdGhlIGJpdHMgb2YgdHJhbnMgKGxvd2VzdCBub24temVybyBvbmVzKSB0byBpZGVudGlmeSB3aGljaCBzdWItbGV2ZWwgYW4KKyAgICAgICAgICogZW50cnkgcmVmZXJzIHRvLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbm9kZSBUaGUgbm9kZSBvciBibG9jayBpZCwgbXVzdCBoYXZlIG9mZnNldCBTUExJVF9PRkZTRVQuCisgICAgICAgICAqIEBwYXJhbSBsaW1pdCBUaGUgdHJhbnNpdGlvbiBsaW1pdCBmb3IgdGhlIGN1cnJlbnQgc3ViLWxldmVsICg0IGZvciB0aGUgc3RhcnQsIDggZm9yIHRoZSBvdGhlcnMpLgorICAgICAgICAgKiBAcGFyYW0gY29sbGVjdGVkIFRoZSB0cmFuc2l0aW9uIGJpdHMgY29sbGVjdGVkIGZyb20gdGhlIHBhcmVudCBjaGFpbiAoZS5nLiAweDQwIGFmdGVyIGZvbGxvd2luZyAxIG9uIHRoZSB0b3AKKyAgICAgICAgICogICAgICAgICAgICAgICAgICBzdWItbGV2ZWwpLgorICAgICAgICAgKiBAcGFyYW0gc2hpZnQgVGhpcyBsZXZlbCdzIGJpdCBzaGlmdCAoNiBmb3Igc3RhcnQsIDMgZm9yIG1pZCBhbmQgMCBmb3IgdGFpbCkuCisgICAgICAgICAqIEByZXR1cm4gdGhlIGRlcHRoIHJlYWNoZWQgYWZ0ZXIgZGVzY2VuZGluZy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IGRlc2NlbmRJblNwbGl0U3VibGV2ZWwoaW50IG5vZGUsIGludCBsaW1pdCwgaW50IGNvbGxlY3RlZCwgaW50IHNoaWZ0KQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgb2Zmc2V0KG5vZGUpID09IFNQTElUX09GRlNFVDsKKyAgICAgICAgICAgICAgICBpbnQgY2hpbGRJbmRleDsKKyAgICAgICAgICAgICAgICBpbnQgY2hpbGQgPSBOT05FOworICAgICAgICAgICAgICAgIC8vIGZpbmQgdGhlIGZpcnN0IG5vbi1udWxsIGNoaWxkCisgICAgICAgICAgICAgICAgZm9yIChjaGlsZEluZGV4ID0gMDsgY2hpbGRJbmRleCA8IGxpbWl0OyArK2NoaWxkSW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGdldFNwbGl0QmxvY2tQb2ludGVyKG5vZGUsIGNoaWxkSW5kZXgsIGxpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc051bGwoY2hpbGQpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGNoaWxkCisgICAgICAgICAgICAgICAgYXNzZXJ0IGNoaWxkSW5kZXggPCBsaW1pdCAmJiBjaGlsZCAhPSBOT05FOworCisgICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgYW55IG1vcmUgdmFsaWQgdHJhbnNpdGlvbnMgYW5kIGFkZCBiYWNrdHJhY2tpbmcgaWYgZm91bmQKKyAgICAgICAgICAgICAgICBtYXliZUFkZFNwbGl0QmFja3RyYWNrKG5vZGUsIGNoaWxkSW5kZXgsIGxpbWl0LCBjb2xsZWN0ZWQsIHNoaWZ0KTsKKworICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgYml0cyBqdXN0IGZvdW5kCisgICAgICAgICAgICAgICAgY29sbGVjdGVkIHw9IGNoaWxkSW5kZXggPDwgc2hpZnQ7CisgICAgICAgICAgICAgICAgLy8gZGVzY2VuZCB0byBuZXh0IHN1Yi1sZXZlbCBvciBjaGlsZAorICAgICAgICAgICAgICAgIGlmIChzaGlmdCA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY2VuZEludG8oY2hpbGQsIGNvbGxlY3RlZCk7CisgICAgICAgICAgICAgICAgLy8gY29udGludWUgd2l0aCBuZXh0IHN1YmxldmVsOyBzYW1lIGFzCisgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGRlc2NlbmRJblNwbGl0U3VibGV2ZWwoY2hpbGQgKyBTUExJVF9PRkZTRVQsIDgsIGNvbGxlY3RlZCwgc2hpZnQgLSAzKQorICAgICAgICAgICAgICAgIG5vZGUgPSBjaGlsZDsKKyAgICAgICAgICAgICAgICBsaW1pdCA9IFNQTElUX09USEVSX0xFVkVMX0xJTUlUOworICAgICAgICAgICAgICAgIHNoaWZ0IC09IFNQTElUX0xFVkVMX1NISUZUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJhY2t0cmFjayB0byBhIHNwbGl0IHN1Yi1sZXZlbC4gVGhlIGxldmVsIGlzIGlkZW50aWZpZWQgYnkgdGhlIGxvd2VzdCBub24tMCBiaXRzIGluIHRyYW5zLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgbmV4dFZhbGlkU3BsaXRUcmFuc2l0aW9uKGludCBub2RlLCBpbnQgdHJhbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCB0cmFucyA+PSAwICYmIHRyYW5zIDw9IDB4RkY7CisgICAgICAgICAgICBpbnQgY2hpbGRJbmRleCA9IHNwbGl0Tm9kZUNoaWxkSW5kZXgodHJhbnMpOworICAgICAgICAgICAgaWYgKGNoaWxkSW5kZXggPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1heWJlQWRkU3BsaXRCYWNrdHJhY2sobm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zICYgLSgxIDw8IChTUExJVF9MRVZFTF9TSElGVCAqIDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQTElUX0xFVkVMX1NISUZUICogMCk7CisgICAgICAgICAgICAgICAgaW50IGNoaWxkID0gZ2V0U3BsaXRCbG9ja1BvaW50ZXIobm9kZSwgY2hpbGRJbmRleCwgU1BMSVRfT1RIRVJfTEVWRUxfTElNSVQpOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNjZW5kSW50byhjaGlsZCwgdHJhbnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHRhaWxJbmRleCA9IHNwbGl0Tm9kZVRhaWxJbmRleCh0cmFucyk7CisgICAgICAgICAgICBpZiAodGFpbEluZGV4ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXliZUFkZFNwbGl0QmFja3RyYWNrKG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zICYgLSgxIDw8IChTUExJVF9MRVZFTF9TSElGVCAqIDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQTElUX0xFVkVMX1NISUZUICogMSk7CisgICAgICAgICAgICAgICAgaW50IHRhaWwgPSBnZXRTcGxpdEJsb2NrUG9pbnRlcihub2RlLCB0YWlsSW5kZXgsIFNQTElUX09USEVSX0xFVkVMX0xJTUlUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzY2VuZEluU3BsaXRTdWJsZXZlbCh0YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQTElUX09USEVSX0xFVkVMX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQTElUX0xFVkVMX1NISUZUICogMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbWlkSW5kZXggPSBzcGxpdE5vZGVNaWRJbmRleCh0cmFucyk7CisgICAgICAgICAgICBhc3NlcnQgbWlkSW5kZXggPiAwOworICAgICAgICAgICAgbWF5YmVBZGRTcGxpdEJhY2t0cmFjayhub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BMSVRfU1RBUlRfTEVWRUxfTElNSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQTElUX0xFVkVMX1NISUZUICogMik7CisgICAgICAgICAgICBpbnQgbWlkID0gZ2V0U3BsaXRCbG9ja1BvaW50ZXIobm9kZSwgbWlkSW5kZXgsIFNQTElUX1NUQVJUX0xFVkVMX0xJTUlUKTsKKyAgICAgICAgICAgIHJldHVybiBkZXNjZW5kSW5TcGxpdFN1YmxldmVsKG1pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQTElUX09USEVSX0xFVkVMX0xJTUlULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUExJVF9MRVZFTF9TSElGVCAqIDEpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvb2sgZm9yIGFueSBmdXJ0aGVyIG5vbi1udWxsIHRyYW5zaXRpb25zIG9uIHRoaXMgc3ViLWxldmVsIGFuZCwgaWYgZm91bmQsIGFkZCBhIGJhY2t0cmFja2luZyBlbnRyeS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBtYXliZUFkZFNwbGl0QmFja3RyYWNrKGludCBub2RlLCBpbnQgc3RhcnRBZnRlciwgaW50IGxpbWl0LCBpbnQgY29sbGVjdGVkLCBpbnQgc2hpZnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuZXh0Q2hpbGRJbmRleDsKKyAgICAgICAgICAgIGZvciAobmV4dENoaWxkSW5kZXggPSBzdGFydEFmdGVyICsgMTsgbmV4dENoaWxkSW5kZXggPCBsaW1pdDsgKytuZXh0Q2hpbGRJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzTnVsbChnZXRTcGxpdEJsb2NrUG9pbnRlcihub2RlLCBuZXh0Q2hpbGRJbmRleCwgbGltaXQpKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV4dENoaWxkSW5kZXggPCBsaW1pdCkKKyAgICAgICAgICAgICAgICBhZGRCYWNrdHJhY2sobm9kZSwgY29sbGVjdGVkIHwgKG5leHRDaGlsZEluZGV4IDw8IHNoaWZ0KSwgZGVwdGgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbmV4dFZhbGlkU3BhcnNlVHJhbnNpdGlvbihpbnQgbm9kZSwgaW50IGRhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFVuc2FmZUJ1ZmZlciBjaHVuayA9IGdldENodW5rKG5vZGUpOworICAgICAgICAgICAgaW50IGluQ2h1bmtOb2RlID0gaW5DaHVua1BvaW50ZXIobm9kZSk7CisKKyAgICAgICAgICAgIC8vIFBlZWwgb2ZmIHRoZSBuZXh0IGluZGV4LgorICAgICAgICAgICAgaW50IGluZGV4ID0gZGF0YSAlIFNQQVJTRV9DSElMRF9DT1VOVDsKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhIC8gU1BBUlNFX0NISUxEX0NPVU5UOworCisgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgcmVtYWluaW5nIHRyYW5zaXRpb25zLCBhZGQgYmFja3RyYWNraW5nIGVudHJ5LgorICAgICAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICAgICAgICAgIGFkZEJhY2t0cmFjayhub2RlLCBkYXRhLCBkZXB0aCk7CisKKyAgICAgICAgICAgIC8vIEZvbGxvdyB0aGUgdHJhbnNpdGlvbi4KKyAgICAgICAgICAgIGludCBjaGlsZCA9IGNodW5rLmdldEludChpbkNodW5rTm9kZSArIFNQQVJTRV9DSElMRFJFTl9PRkZTRVQgKyBpbmRleCAqIDQpOworICAgICAgICAgICAgaW50IHRyYW5zaXRpb24gPSBjaHVuay5nZXRCeXRlKGluQ2h1bmtOb2RlICsgU1BBUlNFX0JZVEVTX09GRlNFVCArIGluZGV4KSAmIDB4RkY7CisgICAgICAgICAgICByZXR1cm4gZGVzY2VuZEludG8oY2hpbGQsIHRyYW5zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0Q2hhaW5UcmFuc2l0aW9uKGludCBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBObyBiYWNrdHJhY2tpbmcgbmVlZGVkLgorICAgICAgICAgICAgVW5zYWZlQnVmZmVyIGNodW5rID0gZ2V0Q2h1bmsobm9kZSk7CisgICAgICAgICAgICBpbnQgaW5DaHVua05vZGUgPSBpbkNodW5rUG9pbnRlcihub2RlKTsKKyAgICAgICAgICAgIGludCB0cmFuc2l0aW9uID0gY2h1bmsuZ2V0Qnl0ZShpbkNodW5rTm9kZSkgJiAweEZGOworICAgICAgICAgICAgaW50IG5leHQgPSBub2RlICsgMTsKKyAgICAgICAgICAgIGlmIChvZmZzZXQobmV4dCkgPD0gQ0hBSU5fTUFYX09GRlNFVCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzY2VuZEludG9DaGFpbihuZXh0LCB0cmFuc2l0aW9uKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzY2VuZEludG8oY2h1bmsuZ2V0SW50KGluQ2h1bmtOb2RlICsgMSksIHRyYW5zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgZGVzY2VuZEludG8oaW50IGNoaWxkLCBpbnQgdHJhbnNpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgKytkZXB0aDsKKyAgICAgICAgICAgIGluY29taW5nVHJhbnNpdGlvbiA9IHRyYW5zaXRpb247CisgICAgICAgICAgICBjb250ZW50ID0gZ2V0Tm9kZUNvbnRlbnQoY2hpbGQpOworICAgICAgICAgICAgY3VycmVudE5vZGUgPSBmb2xsb3dDb250ZW50VHJhbnNpdGlvbihjaGlsZCk7CisgICAgICAgICAgICByZXR1cm4gZGVwdGg7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBkZXNjZW5kSW50b0NoYWluKGludCBjaGlsZCwgaW50IHRyYW5zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgICsrZGVwdGg7CisgICAgICAgICAgICBpbmNvbWluZ1RyYW5zaXRpb24gPSB0cmFuc2l0aW9uOworICAgICAgICAgICAgY29udGVudCA9IG51bGw7CisgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGNoaWxkOworICAgICAgICAgICAgcmV0dXJuIGRlcHRoOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ2hhaW5Ob2RlKGludCBub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFpc051bGxPckxlYWYobm9kZSkgJiYgb2Zmc2V0KG5vZGUpIDw9IENIQUlOX01BWF9PRkZTRVQ7CisgICAgfQorCisgICAgcHVibGljIE1lbXRhYmxlQ3Vyc29yIGN1cnNvcigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE1lbXRhYmxlQ3Vyc29yKCk7CisgICAgfQorCisgICAgLyoKKyAgICAgRGlyZWN0IHJlYWQgbWV0aG9kcworICAgICAqLworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb250ZW50IG1hcHBlZCBieSB0aGUgc3BlY2lmaWVkIGtleS4KKyAgICAgKiBGYXN0IGltcGxlbWVudGF0aW9uIHVzaW5nIGludGVnZXIgbm9kZSBhZGRyZXNzZXMuCisgICAgICovCisgICAgcHVibGljIFQgZ2V0KEJ5dGVDb21wYXJhYmxlIHBhdGgpCisgICAgeworICAgICAgICBpbnQgbiA9IHJvb3Q7CisgICAgICAgIEJ5dGVTb3VyY2Ugc291cmNlID0gcGF0aC5hc0NvbXBhcmFibGVCeXRlcyhCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTik7CisgICAgICAgIHdoaWxlICghaXNOdWxsKG4pKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYyA9IHNvdXJjZS5uZXh0KCk7CisgICAgICAgICAgICBpZiAoYyA9PSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldE5vZGVDb250ZW50KG4pOworCisgICAgICAgICAgICBuID0gYWR2YW5jZShuLCBjLCBzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCisgICAgeworICAgICAgICByZXR1cm4gaXNOdWxsKHJvb3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIG9mIGR1bXAgdG8gcHJvdmlkZSBtb3JlIGRldGFpbGVkIHByaW50b3V0IHRoYXQgaW5jbHVkZXMgdGhlIHR5cGUgb2YgZWFjaCBub2RlIGluIHRoZSB0cmllLgorICAgICAqIFdlIGRvIHRoaXMgdmlhIGEgd3JhcHBpbmcgY3Vyc29yIHRoYXQgcmV0dXJucyBhIGNvbnRlbnQgc3RyaW5nIGZvciB0aGUgdHlwZSBvZiBub2RlIGZvciBldmVyeSBub2RlIHdlIHJldHVybi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGR1bXAoRnVuY3Rpb248VCwgU3RyaW5nPiBjb250ZW50VG9TdHJpbmcpCisgICAgeworICAgICAgICBNZW10YWJsZUN1cnNvciBzb3VyY2UgPSBjdXJzb3IoKTsKKyAgICAgICAgY2xhc3MgVHlwZWROb2Rlc0N1cnNvciBpbXBsZW1lbnRzIEN1cnNvcjxTdHJpbmc+CisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBhZHZhbmNlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLmFkdmFuY2UoKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgYWR2YW5jZU11bHRpcGxlKFRyYW5zaXRpb25zUmVjZWl2ZXIgcmVjZWl2ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5hZHZhbmNlTXVsdGlwbGUocmVjZWl2ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgc2tpcENoaWxkcmVuKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLnNraXBDaGlsZHJlbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZGVwdGgoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2UuZGVwdGgoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGluY29taW5nVHJhbnNpdGlvbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5pbmNvbWluZ1RyYW5zaXRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbnRlbnQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyB0eXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnQgbm9kZSA9IHNvdXJjZS5jdXJyZW50Tm9kZTsKKyAgICAgICAgICAgICAgICBpZiAoIWlzTnVsbE9yTGVhZihub2RlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob2Zmc2V0KG5vZGUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNQQVJTRV9PRkZTRVQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJbU1BBUlNFXSI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNQTElUX09GRlNFVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIltTUExJVF0iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQUkVGSVhfT0ZGU0VUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5leHBlY3RlZCBwcmVmaXggYXMgY3Vyc29yIGN1cnJlbnROb2RlLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIltDSEFJTl0iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFQgY29udGVudCA9IHNvdXJjZS5jb250ZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudFRvU3RyaW5nLmFwcGx5KGNvbnRlbnQpICsgIiAtPiAiICsgdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRUb1N0cmluZy5hcHBseShjb250ZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvY2VzcyhuZXcgVHJpZUR1bXBlcjw+KEZ1bmN0aW9uLmlkZW50aXR5KCkpLCBuZXcgVHlwZWROb2Rlc0N1cnNvcigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZjI4YzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUuamF2YQpAQCAtMCwwICsxLDEwMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlQXJyYXk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKKworaW1wb3J0IG9yZy5hZ3JvbmEuY29uY3VycmVudC5VbnNhZmVCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5CdWZmZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7CitpbXBvcnQgb3JnLmdpdGh1Yi5qYW1tLk1lbW9yeUxheW91dFNwZWNpZmljYXRpb247CisKKy8qKgorICogSW4tbWVtb3J5IHRyaWUgYnVpbHQgZm9yIGZhc3QgbW9kaWZpY2F0aW9uIGFuZCByZWFkcyBleGVjdXRpbmcgY29uY3VycmVudGx5IHdpdGggd3JpdGVzIGZyb20gYSBzaW5nbGUgbXV0YXRvciB0aHJlYWQuCisgKgorICogVGhpcyBjbGFzcyBjYW4gY3VycmVudGx5IG9ubHkgcHJvdmlkZSBhdG9taWNpdHkgKGkuZS4gcmVhZHMgc2VlaW5nIGVpdGhlciB0aGUgY29udGVudCBiZWZvcmUgYSB3cml0ZSwgb3IgdGhlCisgKiBjb250ZW50IGFmdGVyIGl0OyBhbnkgcmVhZCBzZWVpbmcgdGhlIHdyaXRlIGVuZm9yY2luZyBhbnkgc3Vic2VxdWVudCAoaS5lLiBzdGFydGVkIGFmdGVyIGl0IGNvbXBsZXRlZCkgcmVhZHMgdG8KKyAqIGFsc28gc2VlIGl0KSBmb3Igc2luZ2xldG9uIHdyaXRlcyAoaS5lLiBjYWxscyB0byB7QGxpbmsgI3B1dFJlY3Vyc2l2ZX0sIHtAbGluayAjcHV0U2luZ2xldG9ufSBvciB7QGxpbmsgI2FwcGx5fQorICogd2l0aCBhIHNpbmdsZXRvbiB0cmllIGFzIGFyZ3VtZW50KS4KKyAqCisgKiBCZWNhdXNlIGl0IHVzZXMgMzItYml0IHBvaW50ZXJzIGluIGJ5dGUgYnVmZmVycywgdGhpcyB0cmllIGhhcyBhIGZpeGVkIHNpemUgbGltaXQgb2YgMkdCLgorICovCitwdWJsaWMgY2xhc3MgSW5NZW1vcnlUcmllPFQ+IGV4dGVuZHMgSW5NZW1vcnlSZWFkVHJpZTxUPgoreworICAgIC8vIFNlZSB0aGUgdHJpZSBmb3JtYXQgZGVzY3JpcHRpb24gaW4gSW5NZW1vcnlSZWFkVHJpZS4KKworICAgIC8qKgorICAgICAqIFRyaWUgc2l6ZSBsaW1pdC4gVGhpcyBpcyBub3QgZW5mb3JjZWQsIGJ1dCB1c2VycyBtdXN0IGNoZWNrIGZyb20gdGltZSB0byB0aW1lIHRoYXQgaXQgaXMgbm90IGV4Y2VlZGVkICh1c2luZworICAgICAqIHtAbGluayAjcmVhY2hlZEFsbG9jYXRlZFNpemVUaHJlc2hvbGQoKX0pIGFuZCBzdGFydCBzd2l0Y2hpbmcgdG8gYSBuZXcgdHJpZSBpZiBpdCBpcy4KKyAgICAgKiBUaGlzIG11c3QgYmUgZG9uZSB0byBhdm9pZCB0cmllcyBncm93aW5nIGJleW9uZCB0aGVpciBoYXJkIDJHQiBzaXplIGxpbWl0IChkdWUgdG8gdGhlIDMyLWJpdCBwb2ludGVycykuCisgICAgICovCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgc3RhdGljIGZpbmFsIGludCBBTExPQ0FURURfU0laRV9USFJFU0hPTEQ7CisgICAgc3RhdGljCisgICAgeworICAgICAgICAvLyBEZWZhdWx0IHRocmVzaG9sZCArIDEwJSA9PSAyIEdCLiBUaGlzIHNob3VsZCBnaXZlIHRoZSBvd25lciBlbm91Z2ggdGltZSB0byByZWFjdCB0byB0aGUKKyAgICAgICAgLy8ge0BsaW5rICNyZWFjaGVkQWxsb2NhdGVkU2l6ZVRocmVzaG9sZCgpfSBzaWduYWwgYW5kIHN3aXRjaCB0aGlzIHRyaWUgb3V0IGJlZm9yZSBpdCBmaWxscyB1cC4KKyAgICAgICAgaW50IGxpbWl0SW5NQiA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NRU1UQUJMRV9PVkVSSEVBRF9TSVpFLmdldEludCgyMDQ4ICogMTAgLyAxMSk7CisgICAgICAgIGlmIChsaW1pdEluTUIgPCAxIHx8IGxpbWl0SW5NQiA+IDIwNDcpCisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk1FTVRBQkxFX09WRVJIRUFEX1NJWkUuZ2V0S2V5KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbXVzdCBiZSB3aXRoaW4gMSBhbmQgMjA0NyIpOworICAgICAgICBBTExPQ0FURURfU0laRV9USFJFU0hPTEQgPSAxMDI0ICogMTAyNCAqIGxpbWl0SW5NQjsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBhbGxvY2F0ZWRQb3MgPSAwOworICAgIHByaXZhdGUgaW50IGNvbnRlbnRDb3VudCA9IDA7CisKKyAgICBwcml2YXRlIGZpbmFsIEJ1ZmZlclR5cGUgYnVmZmVyVHlwZTsgICAgLy8gb24gb3Igb2ZmIGhlYXAKKworICAgIC8vIGNvbnN0YW50cyBmb3Igc3BhY2UgY2FsY3VsYXRpb25zCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBFTVBUWV9TSVpFX09OX0hFQVA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBFTVBUWV9TSVpFX09GRl9IRUFQOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUkVGRVJFTkNFX0FSUkFZX09OX0hFQVBfU0laRSA9IE9iamVjdFNpemVzLm1lYXN1cmVEZWVwKG5ldyBBdG9taWNSZWZlcmVuY2VBcnJheTw+KDApKTsKKworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgSW5NZW1vcnlUcmllPE9iamVjdD4gZW1wdHkgPSBuZXcgSW5NZW1vcnlUcmllPD4oQnVmZmVyVHlwZS5PTl9IRUFQKTsKKyAgICAgICAgRU1QVFlfU0laRV9PTl9IRUFQID0gT2JqZWN0U2l6ZXMubWVhc3VyZURlZXAoZW1wdHkpOworICAgICAgICBlbXB0eSA9IG5ldyBJbk1lbW9yeVRyaWU8PihCdWZmZXJUeXBlLk9GRl9IRUFQKTsKKyAgICAgICAgRU1QVFlfU0laRV9PRkZfSEVBUCA9IE9iamVjdFNpemVzLm1lYXN1cmVEZWVwKGVtcHR5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5NZW1vcnlUcmllKEJ1ZmZlclR5cGUgYnVmZmVyVHlwZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG5ldyBVbnNhZmVCdWZmZXJbMzEgLSBCVUZfU1RBUlRfU0hJRlRdLCAgLy8gbGFzdCBvbmUgaXMgMUcgZm9yIGEgdG90YWwgb2YgfjJHIGJ5dGVzCisgICAgICAgICAgICAgIG5ldyBBdG9taWNSZWZlcmVuY2VBcnJheVsyOSAtIENPTlRFTlRTX1NUQVJUX1NISUZUXSwgIC8vIHRha2VzIGF0IGxlYXN0IDQgYnl0ZXMgdG8gd3JpdGUgcG9pbnRlciB0byBvbmUgY29udGVudCAtPiA0IHRpbWVzIHNtYWxsZXIgdGhhbiBidWZmZXJzCisgICAgICAgICAgICAgIE5PTkUpOworICAgICAgICB0aGlzLmJ1ZmZlclR5cGUgPSBidWZmZXJUeXBlOworICAgIH0KKworICAgIC8vIEJ1ZmZlciwgY29udGVudCBsaXN0IGFuZCBibG9jayBtYW5hZ2VtZW50CisKKyAgICAvKioKKyAgICAgKiBCZWNhdXNlIHdlIHVzZSBidWZmZXJzIGFuZCAzMi1iaXQgcG9pbnRlcnMsIHRoZSB0cmllIGNhbm5vdCBncm93IG92ZXIgMkdCIG9mIHNpemUuIFRoaXMgZXhjZXB0aW9uIGlzIHRocm93biBpZgorICAgICAqIGEgdHJpZSBvcGVyYXRpb24gbmVlZHMgaXQgdG8gZ3JvdyBvdmVyIHRoYXQgbGltaXQuCisgICAgICoKKyAgICAgKiBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHVzZXJzIHNob3VsZCBxdWVyeSB7QGxpbmsgI3JlYWNoZWRBbGxvY2F0ZWRTaXplVGhyZXNob2xkfSBmcm9tIHRpbWUgdG8gdGltZS4gSWYgdGhlIGNhbGwKKyAgICAgKiByZXR1cm5zIHRydWUsIHRoZXkgc2hvdWxkIHN3aXRjaCB0byBhIG5ldyB0cmllIChlLmcuIGJ5IGZsdXNoaW5nIGEgbWVtdGFibGUpIGFzIHNvb24gYXMgcG9zc2libGUuIFRoZSB0aHJlc2hvbGQKKyAgICAgKiBpcyBjb25maWd1cmFibGUsIGFuZCBpcyBzZXQgYnkgZGVmYXVsdCB0byAxMCUgdW5kZXIgdGhlIDJHQiBsaW1pdCB0byBnaXZlIGFtcGxlIHRpbWUgZm9yIHRoZSBzd2l0Y2ggdG8gaGFwcGVuLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKCJUaGUgaGFyZCAyR0IgbGltaXQgb24gdHJpZSBzaXplIGhhcyBiZWVuIGV4Y2VlZGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaW5hbCB2b2lkIHB1dEludChpbnQgcG9zLCBpbnQgdmFsdWUpCisgICAgeworICAgICAgICBnZXRDaHVuayhwb3MpLnB1dEludChpbkNodW5rUG9pbnRlcihwb3MpLCB2YWx1ZSk7CisgICAgfQorCisgICAgZmluYWwgdm9pZCBwdXRJbnRWb2xhdGlsZShpbnQgcG9zLCBpbnQgdmFsdWUpCisgICAgeworICAgICAgICBnZXRDaHVuayhwb3MpLnB1dEludFZvbGF0aWxlKGluQ2h1bmtQb2ludGVyKHBvcyksIHZhbHVlKTsKKyAgICB9CisKKyAgICBmaW5hbCB2b2lkIHB1dFNob3J0KGludCBwb3MsIHNob3J0IHZhbHVlKQorICAgIHsKKyAgICAgICAgZ2V0Q2h1bmsocG9zKS5wdXRTaG9ydChpbkNodW5rUG9pbnRlcihwb3MpLCB2YWx1ZSk7CisgICAgfQorCisgICAgZmluYWwgdm9pZCBwdXRTaG9ydFZvbGF0aWxlKGludCBwb3MsIHNob3J0IHZhbHVlKQorICAgIHsKKyAgICAgICAgZ2V0Q2h1bmsocG9zKS5wdXRTaG9ydChpbkNodW5rUG9pbnRlcihwb3MpLCB2YWx1ZSk7CisgICAgfQorCisgICAgZmluYWwgdm9pZCBwdXRCeXRlKGludCBwb3MsIGJ5dGUgdmFsdWUpCisgICAgeworICAgICAgICBnZXRDaHVuayhwb3MpLnB1dEJ5dGUoaW5DaHVua1BvaW50ZXIocG9zKSwgdmFsdWUpOworICAgIH0KKworCisgICAgcHJpdmF0ZSBpbnQgYWxsb2NhdGVCbG9jaygpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gTm90ZTogSWYgdGhpcyBtZXRob2QgaXMgbW9kaWZpZWQsIHBsZWFzZSBydW4gSW5NZW1vcnlUcmllVGVzdC50ZXN0T3ZlcjFHU2l6ZSB0byB2ZXJpZnkgaXQgYWN0cyBjb3JyZWN0bHkKKyAgICAgICAgLy8gY2xvc2UgdG8gdGhlIDJHIGxpbWl0LgorICAgICAgICBpbnQgdiA9IGFsbG9jYXRlZFBvczsKKyAgICAgICAgaWYgKGluQ2h1bmtQb2ludGVyKHYpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZWFkQml0ID0gZ2V0Q2h1bmtJZHgodiwgQlVGX1NUQVJUX1NISUZULCBCVUZfU1RBUlRfU0laRSk7CisgICAgICAgICAgICBpZiAobGVhZEJpdCArIEJVRl9TVEFSVF9TSElGVCA9PSAzMSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBuZXdCdWZmZXIgPSBidWZmZXJUeXBlLmFsbG9jYXRlKEJVRl9TVEFSVF9TSVpFIDw8IGxlYWRCaXQpOworICAgICAgICAgICAgYnVmZmVyc1tsZWFkQml0XSA9IG5ldyBVbnNhZmVCdWZmZXIobmV3QnVmZmVyKTsKKyAgICAgICAgICAgIC8vIE5vdGU6IFNpbmNlIHdlIGFyZSBub3QgbW92aW5nIGV4aXN0aW5nIGRhdGEgdG8gYSBuZXcgYnVmZmVyLCB3ZSBhcmUgb2theSB3aXRoIG5vIGhhcHBlbnMtYmVmb3JlIGVuZm9yY2luZworICAgICAgICAgICAgLy8gd3JpdGVzLiBBbnkgcmVhZGVyIHRoYXQgc2VlcyBhIHBvaW50ZXIgaW4gdGhlIG5ldyBidWZmZXIgbWF5IG9ubHkgZG8gc28gYWZ0ZXIgcmVhZGluZyB0aGUgdm9sYXRpbGUgd3JpdGUKKyAgICAgICAgICAgIC8vIHRoYXQgYXR0YWNoZWQgdGhlIG5ldyBwYXRoLgorICAgICAgICB9CisKKyAgICAgICAgYWxsb2NhdGVkUG9zICs9IEJMT0NLX1NJWkU7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIHByaXZhdGUgaW50IGFkZENvbnRlbnQoVCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGludCBpbmRleCA9IGNvbnRlbnRDb3VudCsrOworICAgICAgICBpbnQgbGVhZEJpdCA9IGdldENodW5rSWR4KGluZGV4LCBDT05URU5UU19TVEFSVF9TSElGVCwgQ09OVEVOVFNfU1RBUlRfU0laRSk7CisgICAgICAgIGludCBvZnMgPSBpbkNodW5rUG9pbnRlcihpbmRleCwgbGVhZEJpdCwgQ09OVEVOVFNfU1RBUlRfU0laRSk7CisgICAgICAgIEF0b21pY1JlZmVyZW5jZUFycmF5PFQ+IGFycmF5ID0gY29udGVudEFycmF5c1tsZWFkQml0XTsKKyAgICAgICAgaWYgKGFycmF5ID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBvZnMgPT0gMCA6ICJFcnJvciBpbiBjb250ZW50IGFycmF5cyBjb25maWd1cmF0aW9uLiI7CisgICAgICAgICAgICBjb250ZW50QXJyYXlzW2xlYWRCaXRdID0gYXJyYXkgPSBuZXcgQXRvbWljUmVmZXJlbmNlQXJyYXk8PihDT05URU5UU19TVEFSVF9TSVpFIDw8IGxlYWRCaXQpOworICAgICAgICB9CisgICAgICAgIGFycmF5LmxhenlTZXQob2ZzLCB2YWx1ZSk7IC8vIG5vIG5lZWQgZm9yIGEgdm9sYXRpbGUgc2V0IGhlcmU7IGF0IHRoaXMgcG9pbnQgdGhlIGl0ZW0gaXMgbm90IHJlZmVyZW5jZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgYW55IG5vZGUgaW4gdGhlIHRyaWUsIGFuZCBhIHZvbGF0aWxlIHNldCB3aWxsIGJlIG1hZGUgdG8gcmVmZXJlbmNlIGl0LgorICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldENvbnRlbnQoaW50IGluZGV4LCBUIHZhbHVlKQorICAgIHsKKyAgICAgICAgaW50IGxlYWRCaXQgPSBnZXRDaHVua0lkeChpbmRleCwgQ09OVEVOVFNfU1RBUlRfU0hJRlQsIENPTlRFTlRTX1NUQVJUX1NJWkUpOworICAgICAgICBpbnQgb2ZzID0gaW5DaHVua1BvaW50ZXIoaW5kZXgsIGxlYWRCaXQsIENPTlRFTlRTX1NUQVJUX1NJWkUpOworICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxUPiBhcnJheSA9IGNvbnRlbnRBcnJheXNbbGVhZEJpdF07CisgICAgICAgIGFycmF5LnNldChvZnMsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkaXNjYXJkQnVmZmVycygpCisgICAgeworICAgICAgICBpZiAoYnVmZmVyVHlwZSA9PSBCdWZmZXJUeXBlLk9OX0hFQVApCisgICAgICAgICAgICByZXR1cm47IC8vIG5vIGNsZWFuaW5nIG5lZWRlZAorCisgICAgICAgIGZvciAoVW5zYWZlQnVmZmVyIGIgOiBidWZmZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYiAhPSBudWxsKQorICAgICAgICAgICAgICAgIEZpbGVVdGlscy5jbGVhbihiLmJ5dGVCdWZmZXIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXcml0ZSBtZXRob2RzCisKKyAgICAvLyBXcml0ZSB2aXNpYmlsaXR5IG1vZGVsOiB3cml0ZXMgYXJlIG5vdCB2b2xhdGlsZSwgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBmaW5hbCB3cml0ZSBiZWZvcmUgYSBjYWxsIHJldHVybnMKKyAgICAvLyB0aGUgc2FtZSB2YWx1ZSB0aGF0IHdhcyBwcmVzZW50IGJlZm9yZSAoZS5nLiBjb250ZW50IHdhcyB1cGRhdGVkIGluLXBsYWNlIC8gZXhpc3Rpbmcgbm9kZSBnb3QgYSBuZXcgY2hpbGQgb3IgaGFkCisgICAgLy8gYSBjaGlsZCBwb2ludGVyIHVwZGF0ZWQpOyBpZiB0aGUgd2hvbGUgcGF0aCBpbmNsdWRpbmcgdGhlIHJvb3Qgbm9kZSBjaGFuZ2VkLCB0aGUgcm9vdCBpdHNlbGYgZ2V0cyBhIHZvbGF0aWxlCisgICAgLy8gd3JpdGUuCisgICAgLy8gVGhpcyBmaW5hbCB3cml0ZSBpcyB0aGUgcG9pbnQgd2hlcmUgYW55IG5ldyBjZWxscyBjcmVhdGVkIGR1cmluZyB0aGUgd3JpdGUgYmVjb21lIHZpc2libGUgZm9yIHJlYWRlcnMgZm9yIHRoZQorICAgIC8vIGZpcnN0IHRpbWUsIGFuZCBzdWNoIHJlYWRlcnMgbXVzdCBwYXNzIHRocm91Z2ggcmVhZGluZyB0aGF0IHBvaW50ZXIsIHdoaWNoIGZvcmNlcyBhIGhhcHBlbnMtYmVmb3JlIHJlbGF0aW9uc2hpcAorICAgIC8vIHRoYXQgZXh0ZW5kcyB0byBhbGwgdmFsdWVzIHdyaXR0ZW4gYnkgdGhpcyB0aHJlYWQgYmVmb3JlIGl0LgorCisgICAgLyoqCisgICAgICogQXR0YWNoIGEgY2hpbGQgdG8gdGhlIGdpdmVuIG5vbi1jb250ZW50IG5vZGUuIFRoaXMgbWF5IGJlIGFuIHVwZGF0ZSBmb3IgYW4gZXhpc3RpbmcgYnJhbmNoLCBvciBhIG5ldyBjaGlsZCBmb3IKKyAgICAgKiB0aGUgbm9kZS4gQW4gdXBkYXRlIF9pc18gcmVxdWlyZWQgKGkuZS4gdGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBuZXdDaGlsZCBwb2ludGVyIGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUKKyAgICAgKiBleGlzdGluZyB2YWx1ZSkuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgYXR0YWNoQ2hpbGQoaW50IG5vZGUsIGludCB0cmFucywgaW50IG5ld0NoaWxkKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGFzc2VydCAhaXNMZWFmKG5vZGUpIDogImF0dGFjaENoaWxkIGNhbm5vdCBiZSB1c2VkIG9uIGNvbnRlbnQgbm9kZXMuIjsKKworICAgICAgICBzd2l0Y2ggKG9mZnNldChub2RlKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBQUkVGSVhfT0ZGU0VUOgorICAgICAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6ICJhdHRhY2hDaGlsZCBjYW5ub3QgYmUgdXNlZCBvbiBjb250ZW50IG5vZGVzLiI7CisgICAgICAgICAgICBjYXNlIFNQQVJTRV9PRkZTRVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGF0dGFjaENoaWxkVG9TcGFyc2Uobm9kZSwgdHJhbnMsIG5ld0NoaWxkKTsKKyAgICAgICAgICAgIGNhc2UgU1BMSVRfT0ZGU0VUOgorICAgICAgICAgICAgICAgIGF0dGFjaENoaWxkVG9TcGxpdChub2RlLCB0cmFucywgbmV3Q2hpbGQpOworICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICAgICAgY2FzZSBMQVNUX1BPSU5URVJfT0ZGU0VUIC0gMToKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiBhIENoYWluIGJsb2NrLCB3ZSBjYW4gbW9kaWZ5IHRoZSBjaGlsZCBpbi1wbGFjZQorICAgICAgICAgICAgICAgIGlmICh0cmFucyA9PSBnZXRVbnNpZ25lZEJ5dGUobm9kZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXRJbnRWb2xhdGlsZShub2RlICsgMSwgbmV3Q2hpbGQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZWxzZSBwYXNzIHRocm91Z2gKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGF0dGFjaENoaWxkVG9DaGFpbihub2RlLCB0cmFucywgbmV3Q2hpbGQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0YWNoIGEgY2hpbGQgdG8gdGhlIGdpdmVuIHNwbGl0IG5vZGUuIFRoaXMgbWF5IGJlIGFuIHVwZGF0ZSBmb3IgYW4gZXhpc3RpbmcgYnJhbmNoLCBvciBhIG5ldyBjaGlsZCBmb3IgdGhlIG5vZGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGF0dGFjaENoaWxkVG9TcGxpdChpbnQgbm9kZSwgaW50IHRyYW5zLCBpbnQgbmV3Q2hpbGQpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IG1pZFBvcyA9IHNwbGl0QmxvY2tQb2ludGVyQWRkcmVzcyhub2RlLCBzcGxpdE5vZGVNaWRJbmRleCh0cmFucyksIFNQTElUX1NUQVJUX0xFVkVMX0xJTUlUKTsKKyAgICAgICAgaW50IG1pZCA9IGdldEludChtaWRQb3MpOworICAgICAgICBpZiAoaXNOdWxsKG1pZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pZCA9IGNyZWF0ZUVtcHR5U3BsaXROb2RlKCk7CisgICAgICAgICAgICBpbnQgdGFpbFBvcyA9IHNwbGl0QmxvY2tQb2ludGVyQWRkcmVzcyhtaWQsIHNwbGl0Tm9kZVRhaWxJbmRleCh0cmFucyksIFNQTElUX09USEVSX0xFVkVMX0xJTUlUKTsKKyAgICAgICAgICAgIGludCB0YWlsID0gY3JlYXRlRW1wdHlTcGxpdE5vZGUoKTsKKyAgICAgICAgICAgIGludCBjaGlsZFBvcyA9IHNwbGl0QmxvY2tQb2ludGVyQWRkcmVzcyh0YWlsLCBzcGxpdE5vZGVDaGlsZEluZGV4KHRyYW5zKSwgU1BMSVRfT1RIRVJfTEVWRUxfTElNSVQpOworICAgICAgICAgICAgcHV0SW50KGNoaWxkUG9zLCBuZXdDaGlsZCk7CisgICAgICAgICAgICBwdXRJbnQodGFpbFBvcywgdGFpbCk7CisgICAgICAgICAgICBwdXRJbnRWb2xhdGlsZShtaWRQb3MsIG1pZCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpbnQgdGFpbFBvcyA9IHNwbGl0QmxvY2tQb2ludGVyQWRkcmVzcyhtaWQsIHNwbGl0Tm9kZVRhaWxJbmRleCh0cmFucyksIFNQTElUX09USEVSX0xFVkVMX0xJTUlUKTsKKyAgICAgICAgaW50IHRhaWwgPSBnZXRJbnQodGFpbFBvcyk7CisgICAgICAgIGlmIChpc051bGwodGFpbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRhaWwgPSBjcmVhdGVFbXB0eVNwbGl0Tm9kZSgpOworICAgICAgICAgICAgaW50IGNoaWxkUG9zID0gc3BsaXRCbG9ja1BvaW50ZXJBZGRyZXNzKHRhaWwsIHNwbGl0Tm9kZUNoaWxkSW5kZXgodHJhbnMpLCBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVCk7CisgICAgICAgICAgICBwdXRJbnQoY2hpbGRQb3MsIG5ld0NoaWxkKTsKKyAgICAgICAgICAgIHB1dEludFZvbGF0aWxlKHRhaWxQb3MsIHRhaWwpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaW50IGNoaWxkUG9zID0gc3BsaXRCbG9ja1BvaW50ZXJBZGRyZXNzKHRhaWwsIHNwbGl0Tm9kZUNoaWxkSW5kZXgodHJhbnMpLCBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVCk7CisgICAgICAgIHB1dEludFZvbGF0aWxlKGNoaWxkUG9zLCBuZXdDaGlsZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0YWNoIGEgY2hpbGQgdG8gdGhlIGdpdmVuIHNwYXJzZSBub2RlLiBUaGlzIG1heSBiZSBhbiB1cGRhdGUgZm9yIGFuIGV4aXN0aW5nIGJyYW5jaCwgb3IgYSBuZXcgY2hpbGQgZm9yIHRoZSBub2RlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGF0dGFjaENoaWxkVG9TcGFyc2UoaW50IG5vZGUsIGludCB0cmFucywgaW50IG5ld0NoaWxkKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgaW50IHNtYWxsZXJDb3VudCA9IDA7CisgICAgICAgIC8vIGZpcnN0IGNoZWNrIGlmIHRoaXMgaXMgYW4gdXBkYXRlIGFuZCBtb2RpZnkgaW4tcGxhY2UgaWYgc28KKyAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgU1BBUlNFX0NISUxEX0NPVU5UOyArK2luZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNOdWxsKGdldEludChub2RlICsgU1BBUlNFX0NISUxEUkVOX09GRlNFVCArIGluZGV4ICogNCkpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZmluYWwgaW50IGV4aXN0aW5nID0gZ2V0VW5zaWduZWRCeXRlKG5vZGUgKyBTUEFSU0VfQllURVNfT0ZGU0VUICsgaW5kZXgpOworICAgICAgICAgICAgaWYgKGV4aXN0aW5nID09IHRyYW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB1dEludFZvbGF0aWxlKG5vZGUgKyBTUEFSU0VfQ0hJTERSRU5fT0ZGU0VUICsgaW5kZXggKiA0LCBuZXdDaGlsZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChleGlzdGluZyA8IHRyYW5zKQorICAgICAgICAgICAgICAgICsrc21hbGxlckNvdW50OworICAgICAgICB9CisgICAgICAgIGludCBjaGlsZENvdW50ID0gaW5kZXg7CisKKyAgICAgICAgaWYgKGNoaWxkQ291bnQgPT0gU1BBUlNFX0NISUxEX0NPVU5UKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb2RlIGlzIGZ1bGwuIFN3aXRjaCB0byBzcGxpdAorICAgICAgICAgICAgaW50IHNwbGl0ID0gY3JlYXRlRW1wdHlTcGxpdE5vZGUoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU1BBUlNFX0NISUxEX0NPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHQgPSBnZXRVbnNpZ25lZEJ5dGUobm9kZSArIFNQQVJTRV9CWVRFU19PRkZTRVQgKyBpKTsKKyAgICAgICAgICAgICAgICBpbnQgcCA9IGdldEludChub2RlICsgU1BBUlNFX0NISUxEUkVOX09GRlNFVCArIGkgKiA0KTsKKyAgICAgICAgICAgICAgICBhdHRhY2hDaGlsZFRvU3BsaXROb25Wb2xhdGlsZShzcGxpdCwgdCwgcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRhY2hDaGlsZFRvU3BsaXROb25Wb2xhdGlsZShzcGxpdCwgdHJhbnMsIG5ld0NoaWxkKTsKKyAgICAgICAgICAgIHJldHVybiBzcGxpdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCBhIG5ldyB0cmFuc2l0aW9uLiBUaGV5IGFyZSBub3Qga2VwdCBpbiBvcmRlciwgc28gYXBwZW5kIGl0IGF0IHRoZSBmaXJzdCBmcmVlIHBvc2l0aW9uLgorICAgICAgICBwdXRCeXRlKG5vZGUgKyBTUEFSU0VfQllURVNfT0ZGU0VUICsgY2hpbGRDb3VudCwgKGJ5dGUpIHRyYW5zKTsKKworICAgICAgICAvLyBVcGRhdGUgb3JkZXIgd29yZC4KKyAgICAgICAgaW50IG9yZGVyID0gZ2V0VW5zaWduZWRTaG9ydChub2RlICsgU1BBUlNFX09SREVSX09GRlNFVCk7CisgICAgICAgIGludCBuZXdPcmRlciA9IGluc2VydEluT3JkZXJXb3JkKG9yZGVyLCBjaGlsZENvdW50LCBzbWFsbGVyQ291bnQpOworCisgICAgICAgIC8vIFNwYXJzZSBub2RlcyBoYXZlIHR3byBhY2Nlc3MgbW9kZXM6IHZpYSB0aGUgb3JkZXIgd29yZCwgd2hlbiBsaXN0aW5nIHRyYW5zaXRpb25zLCBvciBkaXJlY3RseSB0byBjaGFyYWN0ZXJzCisgICAgICAgIC8vIGFuZCBhZGRyZXNzZXMuCisgICAgICAgIC8vIFRvIHN1cHBvcnQgdGhlIGZvcm1lciwgd2Ugdm9sYXRpbGUgd3JpdGUgdG8gdGhlIG9yZGVyIHdvcmQgbGFzdCwgYW5kIGV2ZXJ5dGhpbmcgaXMgY29ycmVjdGx5IHNldCB1cC4KKyAgICAgICAgLy8gVGhlIGxhdHRlciBkb2VzIG5vdCB0b3VjaCB0aGUgb3JkZXIgd29yZC4gVG8gc3VwcG9ydCB0aGF0IHRvbywgd2Ugdm9sYXRpbGUgd3JpdGUgdGhlIGFkZHJlc3MsIGFzIHRoZSByZWFkZXIKKyAgICAgICAgLy8gY2FuJ3QgZGV0ZXJtaW5lIGlmIHRoZSBwb3NpdGlvbiBpcyBpbiB1c2UgYmFzZWQgb24gdGhlIGNoYXJhY3RlciBieXRlIGFsb25lICgwMCBpcyBhbHNvIGEgdmFsaWQgdHJhbnNpdGlvbikuCisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1lYW5zIHRoYXQgcmVhZGVyIG11c3QgY2hlY2sgdGhlIHRyYW5zaXRpb24gYnl0ZSBBRlRFUiB0aGUgYWRkcmVzcywgdG8gZW5zdXJlIHRoZXkgZ2V0IHRoZQorICAgICAgICAvLyBjb3JyZWN0IHZhbHVlIChzZWUgZ2V0U3BhcnNlQ2hpbGQpLgorCisgICAgICAgIC8vIHNldHRpbmcgY2hpbGQgZW5hYmxlcyByZWFkcyB0byBzdGFydCBzZWVpbmcgdGhlIG5ldyBicmFuY2gKKyAgICAgICAgcHV0SW50Vm9sYXRpbGUobm9kZSArIFNQQVJTRV9DSElMRFJFTl9PRkZTRVQgKyBjaGlsZENvdW50ICogNCwgbmV3Q2hpbGQpOworCisgICAgICAgIC8vIHNvbWUgcmVhZGVycyB3aWxsIGRlY2lkZSB3aGV0aGVyIHRvIGNoZWNrIHRoZSBwb2ludGVyIGJhc2VkIG9uIHRoZSBvcmRlciB3b3JkCisgICAgICAgIC8vIHdyaXRlIHRoYXQgdm9sYXRpbGUgdG8gbWFrZSBzdXJlIHRoZXkgc2VlIHRoZSBuZXcgY2hhbmdlIHRvbworICAgICAgICBwdXRTaG9ydFZvbGF0aWxlKG5vZGUgKyBTUEFSU0VfT1JERVJfT0ZGU0VULCAgKHNob3J0KSBuZXdPcmRlcik7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydCB0aGUgZ2l2ZW4gbmV3SW5kZXggaW4gdGhlIGJhc2UtNiBlbmNvZGVkIG9yZGVyIHdvcmQgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gd2l0aCByZXNwZWN0IHRvIHRoZSBvcmRlcmluZy4KKyAgICAgKgorICAgICAqIEUuZy4KKyAgICAgKiAgIC0gaW5zZXJ0T3JkZXJXb3JkKDEyMCwgMywgMCkgbXVzdCByZXR1cm4gMTIwMyAoZGVjaW1hbCA0OCo2ICsgMykKKyAgICAgKiAgIC0gaW5zZXJ0T3JkZXJXb3JkKDEyMCwgMywgMSwgcHRyKSBtdXN0IHJldHVybiAxMjMwIChkZWNpbWFsIDgqMzYgKyAzKjYgKyAwKQorICAgICAqICAgLSBpbnNlcnRPcmRlcldvcmQoMTIwLCAzLCAyLCBwdHIpIG11c3QgcmV0dXJuIDEzMjAgKGRlY2ltYWwgMSoyMTYgKyAzKjM2ICsgMTIpCisgICAgICogICAtIGluc2VydE9yZGVyV29yZCgxMjAsIDMsIDMsIHB0cikgbXVzdCByZXR1cm4gMzEyMCAoZGVjaW1hbCAzKjIxNiArIDQ4KQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBpbnNlcnRJbk9yZGVyV29yZChpbnQgb3JkZXIsIGludCBuZXdJbmRleCwgaW50IHNtYWxsZXJDb3VudCkKKyAgICB7CisgICAgICAgIGludCByID0gMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzbWFsbGVyQ291bnQ7ICsraSkKKyAgICAgICAgICAgIHIgKj0gNjsKKyAgICAgICAgaW50IGhlYWQgPSBvcmRlciAvIHI7CisgICAgICAgIGludCB0YWlsID0gb3JkZXIgJSByOworICAgICAgICAvLyBpbnNlcnQgbmV3SW5kZXggYWZ0ZXIgdGhlIG9uZXMgd2UgaGF2ZSBwYXNzZWQgKG9yZGVyICUgcikgYW5kIGJlZm9yZSB0aGUgcmVtYWluaW5nIChvcmRlciAvIHIpCisgICAgICAgIHJldHVybiB0YWlsICsgKGhlYWQgKiA2ICsgbmV3SW5kZXgpICogcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb24tdm9sYXRpbGUgdmVyc2lvbiBvZiBhdHRhY2hDaGlsZFRvU3BsaXQuIFVzZWQgd2hlbiB0aGUgc3BsaXQgbm9kZSBpcyBub3QgcmVhY2hhYmxlIHlldCAoZHVyaW5nIHRoZSBjb252ZXJzaW9uCisgICAgICogZnJvbSBzcGFyc2UpLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBhdHRhY2hDaGlsZFRvU3BsaXROb25Wb2xhdGlsZShpbnQgbm9kZSwgaW50IHRyYW5zLCBpbnQgbmV3Q2hpbGQpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYXNzZXJ0IG9mZnNldChub2RlKSA9PSBTUExJVF9PRkZTRVQgOiAiSW52YWxpZCBzcGxpdCBub2RlIGluIHRyaWUiOworICAgICAgICBpbnQgbWlkUG9zID0gc3BsaXRCbG9ja1BvaW50ZXJBZGRyZXNzKG5vZGUsIHNwbGl0Tm9kZU1pZEluZGV4KHRyYW5zKSwgU1BMSVRfU1RBUlRfTEVWRUxfTElNSVQpOworICAgICAgICBpbnQgbWlkID0gZ2V0SW50KG1pZFBvcyk7CisgICAgICAgIGlmIChpc051bGwobWlkKSkKKyAgICAgICAgeworICAgICAgICAgICAgbWlkID0gY3JlYXRlRW1wdHlTcGxpdE5vZGUoKTsKKyAgICAgICAgICAgIHB1dEludChtaWRQb3MsIG1pZCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQgb2Zmc2V0KG1pZCkgPT0gU1BMSVRfT0ZGU0VUIDogIkludmFsaWQgc3BsaXQgbm9kZSBpbiB0cmllIjsKKyAgICAgICAgaW50IHRhaWxQb3MgPSBzcGxpdEJsb2NrUG9pbnRlckFkZHJlc3MobWlkLCBzcGxpdE5vZGVUYWlsSW5kZXgodHJhbnMpLCBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVCk7CisgICAgICAgIGludCB0YWlsID0gZ2V0SW50KHRhaWxQb3MpOworICAgICAgICBpZiAoaXNOdWxsKHRhaWwpKQorICAgICAgICB7CisgICAgICAgICAgICB0YWlsID0gY3JlYXRlRW1wdHlTcGxpdE5vZGUoKTsKKyAgICAgICAgICAgIHB1dEludCh0YWlsUG9zLCB0YWlsKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCBvZmZzZXQodGFpbCkgPT0gU1BMSVRfT0ZGU0VUIDogIkludmFsaWQgc3BsaXQgbm9kZSBpbiB0cmllIjsKKyAgICAgICAgaW50IGNoaWxkUG9zID0gc3BsaXRCbG9ja1BvaW50ZXJBZGRyZXNzKHRhaWwsIHNwbGl0Tm9kZUNoaWxkSW5kZXgodHJhbnMpLCBTUExJVF9PVEhFUl9MRVZFTF9MSU1JVCk7CisgICAgICAgIHB1dEludChjaGlsZFBvcywgbmV3Q2hpbGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGFjaCBhIGNoaWxkIHRvIHRoZSBnaXZlbiBjaGFpbiBub2RlLiBUaGlzIG1heSBiZSBhbiB1cGRhdGUgZm9yIGFuIGV4aXN0aW5nIGJyYW5jaCB3aXRoIGRpZmZlcmVudCB0YXJnZXQKKyAgICAgKiBhZGRyZXNzLCBvciBhIHNlY29uZCBjaGlsZCBmb3IgdGhlIG5vZGUuCisgICAgICogVGhpcyBtZXRob2QgYWx3YXlzIGNvcGllcyB0aGUgbm9kZSAtLSB3aXRoIHRoZSBleGNlcHRpb24gb2YgdXBkYXRlcyB0aGF0IGNoYW5nZSB0aGUgY2hpbGQgb2YgdGhlIGxhc3Qgbm9kZSBpbiBhCisgICAgICogY2hhaW4gYmxvY2sgd2l0aCBtYXRjaGluZyB0cmFuc2l0aW9uIGJ5dGUgKHdoaWNoIHRoaXMgbWV0aG9kIGlzIG5vdCB1c2VkIGZvciwgc2VlIGF0dGFjaENoaWxkKSwgbW9kaWZpY2F0aW9ucyB0bworICAgICAqIGNoYWluIG5vZGVzIGNhbm5vdCBiZSBkb25lIGluIHBsYWNlLCBlaXRoZXIgYmVjYXVzZSB3ZSBpbnRyb2R1Y2UgYSBuZXcgdHJhbnNpdGlvbiBieXRlIGFuZCBoYXZlIHRvIGNvbnZlcnQgZnJvbQorICAgICAqIHRoZSBzaW5nbGUtdHJhbnNpdGlvbiBjaGFpbiB0eXBlIHRvIHNwYXJzZSwgb3IgYmVjYXVzZSB3ZSBoYXZlIHRvIHJlbWFwIHRoZSBjaGlsZCBmcm9tIHRoZSBpbXBsaWNpdCBub2RlICsgMSB0bworICAgICAqIHNvbWV0aGluZyBlbHNlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGF0dGFjaENoaWxkVG9DaGFpbihpbnQgbm9kZSwgaW50IHRyYW5zaXRpb25CeXRlLCBpbnQgbmV3Q2hpbGQpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IGV4aXN0aW5nQnl0ZSA9IGdldFVuc2lnbmVkQnl0ZShub2RlKTsKKyAgICAgICAgaWYgKHRyYW5zaXRpb25CeXRlID09IGV4aXN0aW5nQnl0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgYmUgY2FsbGVkIGlmIG5ldyBjaGlsZCBpcyBkaWZmZXJlbnQgZnJvbSBvbGQsIGFuZCB0aGUgdXBkYXRlIGlzIG5vdCBvbiB0aGUgZmluYWwgY2hpbGQKKyAgICAgICAgICAgIC8vIHdoZXJlIHdlIGNhbiBjaGFuZ2UgaXQgaW4gcGxhY2UgKHNlZSBhdHRhY2hDaGlsZCkuIFdlIG11c3QgYWx3YXlzIGNyZWF0ZSBzb21ldGhpbmcgbmV3LgorICAgICAgICAgICAgLy8gSWYgdGhlIGNoaWxkIGlzIGEgY2hhaW4sIHdlIGNhbiBleHBhbmQgaXQgKHNpbmNlIGl0J3MgYSBkaWZmZXJlbnQgdmFsdWUsIGl0cyBicmFuY2ggbXVzdCBiZSBuZXcgYW5kCisgICAgICAgICAgICAvLyBub3RoaW5nIGNhbiBhbHJlYWR5IHJlc2lkZSBpbiB0aGUgcmVzdCBvZiB0aGUgYmxvY2spLgorICAgICAgICAgICAgcmV0dXJuIGV4cGFuZE9yQ3JlYXRlQ2hhaW5Ob2RlKHRyYW5zaXRpb25CeXRlLCBuZXdDaGlsZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgbmV3IHRyYW5zaXRpb24gaXMgZGlmZmVyZW50LCBzbyB3ZSBubyBsb25nZXIgaGF2ZSBvbmx5IG9uZSB0cmFuc2l0aW9uLiBDaGFuZ2UgdHlwZS4KKyAgICAgICAgaW50IGV4aXN0aW5nQ2hpbGQgPSBub2RlICsgMTsKKyAgICAgICAgaWYgKG9mZnNldChleGlzdGluZ0NoaWxkKSA9PSBMQVNUX1BPSU5URVJfT0ZGU0VUKQorICAgICAgICB7CisgICAgICAgICAgICBleGlzdGluZ0NoaWxkID0gZ2V0SW50KGV4aXN0aW5nQ2hpbGQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjcmVhdGVTcGFyc2VOb2RlKGV4aXN0aW5nQnl0ZSwgZXhpc3RpbmdDaGlsZCwgdHJhbnNpdGlvbkJ5dGUsIG5ld0NoaWxkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNFeHBhbmRhYmxlQ2hhaW4oaW50IG5ld0NoaWxkKQorICAgIHsKKyAgICAgICAgaW50IG5ld09mZnNldCA9IG9mZnNldChuZXdDaGlsZCk7CisgICAgICAgIHJldHVybiBuZXdDaGlsZCA+IDAgJiYgbmV3Q2hpbGQgLSAxID4gTk9ORSAmJiBuZXdPZmZzZXQgPiBDSEFJTl9NSU5fT0ZGU0VUICYmIG5ld09mZnNldCA8PSBDSEFJTl9NQVhfT0ZGU0VUOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHNwYXJzZSBub2RlIHdpdGggdHdvIGNoaWxkcmVuLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGNyZWF0ZVNwYXJzZU5vZGUoaW50IGJ5dGUxLCBpbnQgY2hpbGQxLCBpbnQgYnl0ZTIsIGludCBjaGlsZDIpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYXNzZXJ0IGJ5dGUxICE9IGJ5dGUyIDogIkF0dGVtcHRlZCB0byBjcmVhdGUgYSBzcGFyc2Ugbm9kZSB3aXRoIHR3byBvZiB0aGUgc2FtZSB0cmFuc2l0aW9uIjsKKyAgICAgICAgaWYgKGJ5dGUxID4gYnl0ZTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHN3YXAgdGhlbSBzbyB0aGUgc21hbGxlciBpcyBieXRlMSwgaS5lLiB0aGVyZSdzIGFsd2F5cyBzb21ldGhpbmcgYmlnZ2VyIHRoYW4gY2hpbGQgMCBzbyAwIG5ldmVyIGlzCisgICAgICAgICAgICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBvcmRlcgorICAgICAgICAgICAgaW50IHQgPSBieXRlMTsgYnl0ZTEgPSBieXRlMjsgYnl0ZTIgPSB0OworICAgICAgICAgICAgdCA9IGNoaWxkMTsgY2hpbGQxID0gY2hpbGQyOyBjaGlsZDIgPSB0OworICAgICAgICB9CisKKyAgICAgICAgaW50IG5vZGUgPSBhbGxvY2F0ZUJsb2NrKCkgKyBTUEFSU0VfT0ZGU0VUOworICAgICAgICBwdXRCeXRlKG5vZGUgKyBTUEFSU0VfQllURVNfT0ZGU0VUICsgMCwgIChieXRlKSBieXRlMSk7CisgICAgICAgIHB1dEJ5dGUobm9kZSArIFNQQVJTRV9CWVRFU19PRkZTRVQgKyAxLCAgKGJ5dGUpIGJ5dGUyKTsKKyAgICAgICAgcHV0SW50KG5vZGUgKyBTUEFSU0VfQ0hJTERSRU5fT0ZGU0VUICsgMCAqIDQsIGNoaWxkMSk7CisgICAgICAgIHB1dEludChub2RlICsgU1BBUlNFX0NISUxEUkVOX09GRlNFVCArIDEgKiA0LCBjaGlsZDIpOworICAgICAgICBwdXRTaG9ydChub2RlICsgU1BBUlNFX09SREVSX09GRlNFVCwgIChzaG9ydCkgKDEgKiA2ICsgMCkpOworICAgICAgICAvLyBOb3RlOiB0aGlzIGRvZXMgbm90IG5lZWQgYSB2b2xhdGlsZSB3cml0ZSBhcyBpdCBpcyBhIG5ldyBub2RlLCByZXR1cm5pbmcgYSBuZXcgcG9pbnRlciwgd2hpY2ggbmVlZHMgdG8gYmUKKyAgICAgICAgLy8gcHV0IGluIGFuIGV4aXN0aW5nIG5vZGUgb3IgdGhlIHJvb3QuIFRoYXQgYWN0aW9uIGVuZHMgaW4gYSBoYXBwZW5zLWJlZm9yZSBlbmZvcmNpbmcgd3JpdGUuCisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjaGFpbiBub2RlIHdpdGggdGhlIHNpbmdsZSBwcm92aWRlZCB0cmFuc2l0aW9uIChwb2ludGluZyB0byB0aGUgcHJvdmlkZWQgY2hpbGQpLgorICAgICAqIE5vdGUgdGhhdCB0byBhdm9pZCBjcmVhdGluZyBpbmVmZmljaWVudCB0cmllcyB3aXRoIHVuZGVyLXV0aWxpemVkIGNoYWluIG5vZGVzLCB0aGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tCisgICAgICoge0BsaW5rICNleHBhbmRPckNyZWF0ZUNoYWluTm9kZX0gYW5kIG90aGVyIGNhbGwtc2l0ZXMgc2hvdWxkIGNhbGwge0BsaW5rICNleHBhbmRPckNyZWF0ZUNoYWluTm9kZX0uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY3JlYXRlTmV3Q2hhaW5Ob2RlKGludCB0cmFuc2l0aW9uQnl0ZSwgaW50IG5ld0NoaWxkKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCBuZXdOb2RlID0gYWxsb2NhdGVCbG9jaygpICsgTEFTVF9QT0lOVEVSX09GRlNFVCAtIDE7CisgICAgICAgIHB1dEJ5dGUobmV3Tm9kZSwgKGJ5dGUpIHRyYW5zaXRpb25CeXRlKTsKKyAgICAgICAgcHV0SW50KG5ld05vZGUgKyAxLCBuZXdDaGlsZCk7CisgICAgICAgIC8vIE5vdGU6IHRoaXMgZG9lcyBub3QgbmVlZCBhIHZvbGF0aWxlIHdyaXRlIGFzIGl0IGlzIGEgbmV3IG5vZGUsIHJldHVybmluZyBhIG5ldyBwb2ludGVyLCB3aGljaCBuZWVkcyB0byBiZQorICAgICAgICAvLyBwdXQgaW4gYW4gZXhpc3Rpbmcgbm9kZSBvciB0aGUgcm9vdC4gVGhhdCBhY3Rpb24gZW5kcyBpbiBhIGhhcHBlbnMtYmVmb3JlIGVuZm9yY2luZyB3cml0ZS4KKyAgICAgICAgcmV0dXJuIG5ld05vZGU7CisgICAgfQorCisgICAgLyoqIExpa2Uge0BsaW5rICNjcmVhdGVOZXdDaGFpbk5vZGV9LCBidXQgaWYgdGhlIG5ldyBjaGlsZCBpcyBhbHJlYWR5IGEgY2hhaW4gbm9kZSBhbmQgaGFzIHJvb20sIGV4cGFuZAorICAgICAqIGl0IGluc3RlYWQgb2YgY3JlYXRpbmcgYSBicmFuZCBuZXcgbm9kZS4gKi8KKyAgICBwcml2YXRlIGludCBleHBhbmRPckNyZWF0ZUNoYWluTm9kZShpbnQgdHJhbnNpdGlvbkJ5dGUsIGludCBuZXdDaGlsZCkgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoaXNFeHBhbmRhYmxlQ2hhaW4obmV3Q2hpbGQpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBhdHRhY2ggYXMgYSBuZXcgY2hhcmFjdGVyIGluIGNoaWxkIG5vZGUKKyAgICAgICAgICAgIGludCBuZXdOb2RlID0gbmV3Q2hpbGQgLSAxOworICAgICAgICAgICAgcHV0Qnl0ZShuZXdOb2RlLCAoYnl0ZSkgdHJhbnNpdGlvbkJ5dGUpOworICAgICAgICAgICAgcmV0dXJuIG5ld05vZGU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3JlYXRlTmV3Q2hhaW5Ob2RlKHRyYW5zaXRpb25CeXRlLCBuZXdDaGlsZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgY3JlYXRlRW1wdHlTcGxpdE5vZGUoKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBhbGxvY2F0ZUJsb2NrKCkgKyBTUExJVF9PRkZTRVQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgY3JlYXRlUHJlZml4Tm9kZShpbnQgY29udGVudEluZGV4LCBpbnQgY2hpbGQsIGJvb2xlYW4gaXNTYWZlQ2hhaW4pIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYXNzZXJ0ICFpc051bGxPckxlYWYoY2hpbGQpIDogIlByZWZpeCBub2RlIGNhbm5vdCByZWZlcmVuY2UgYSBjaGlsZGxlc3Mgbm9kZS4iOworCisgICAgICAgIGludCBvZmZzZXQgPSBvZmZzZXQoY2hpbGQpOworICAgICAgICBpbnQgbm9kZTsKKyAgICAgICAgaWYgKG9mZnNldCA9PSBTUExJVF9PRkZTRVQgfHwgaXNTYWZlQ2hhaW4gJiYgb2Zmc2V0ID4gKFBSRUZJWF9GTEFHU19PRkZTRVQgKyBQUkVGSVhfT0ZGU0VUKSAmJiBvZmZzZXQgPD0gQ0hBSU5fTUFYX09GRlNFVCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gV2UgY2FuIGRvIGFuIGVtYmVkZGVkIHByZWZpeCBub2RlCisgICAgICAgICAgICAvLyBOb3RlOiBmb3IgY2hhaW4gbm9kZXMgd2UgaGF2ZSBhIHJpc2sgdGhhdCB0aGUgbm9kZSBjb250aW51ZXMgYmV5b25kIHRoZSBjdXJyZW50IHBvaW50LCBpbiB3aGljaCBjYXNlCisgICAgICAgICAgICAvLyBjcmVhdGluZyB0aGUgZW1iZWRkZWQgbm9kZSBtYXkgb3ZlcndyaXRlIGluZm9ybWF0aW9uIHRoYXQgaXMgc3RpbGwgbmVlZGVkIGJ5IGNvbmN1cnJlbnQgcmVhZGVycyBvciB0aGUKKyAgICAgICAgICAgIC8vIG11dGF0aW9uIHByb2Nlc3MgaXRzZWxmLgorICAgICAgICAgICAgbm9kZSA9IChjaGlsZCAmIC1CTE9DS19TSVpFKSB8IFBSRUZJWF9PRkZTRVQ7CisgICAgICAgICAgICBwdXRCeXRlKG5vZGUgKyBQUkVGSVhfRkxBR1NfT0ZGU0VULCAoYnl0ZSkgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZ1bGwgcHJlZml4IG5vZGUKKyAgICAgICAgICAgIG5vZGUgPSBhbGxvY2F0ZUJsb2NrKCkgKyBQUkVGSVhfT0ZGU0VUOworICAgICAgICAgICAgcHV0Qnl0ZShub2RlICsgUFJFRklYX0ZMQUdTX09GRlNFVCwgKGJ5dGUpIDB4RkYpOworICAgICAgICAgICAgcHV0SW50KG5vZGUgKyBQUkVGSVhfUE9JTlRFUl9PRkZTRVQsIGNoaWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1dEludChub2RlICsgUFJFRklYX0NPTlRFTlRfT0ZGU0VULCBjb250ZW50SW5kZXgpOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCB1cGRhdGVQcmVmaXhOb2RlQ2hpbGQoaW50IG5vZGUsIGludCBjaGlsZCkgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBhc3NlcnQgb2Zmc2V0KG5vZGUpID09IFBSRUZJWF9PRkZTRVQgOiAidXBkYXRlUHJlZml4IGNhbGxlZCBvbiBub24tcHJlZml4IG5vZGUiOworICAgICAgICBhc3NlcnQgIWlzTnVsbE9yTGVhZihjaGlsZCkgOiAiUHJlZml4IG5vZGUgY2Fubm90IHJlZmVyZW5jZSBhIGNoaWxkbGVzcyBub2RlLiI7CisKKyAgICAgICAgLy8gV2UgY2FuIG9ubHkgdXBkYXRlIGluLXBsYWNlIGlmIHdlIGhhdmUgYSBmdWxsIHByZWZpeCBub2RlCisgICAgICAgIGlmICghaXNFbWJlZGRlZFByZWZpeE5vZGUobm9kZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoaXMgYXR0YWNoZXMgdGhlIGNoaWxkIGJyYW5jaCBhbmQgbWFrZXMgaXQgcmVhY2hhYmxlIC0tIHRoZSB3cml0ZSBtdXN0IGJlIHZvbGF0aWxlLgorICAgICAgICAgICAgcHV0SW50Vm9sYXRpbGUobm9kZSArIFBSRUZJWF9QT0lOVEVSX09GRlNFVCwgY2hpbGQpOworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29udGVudEluZGV4ID0gZ2V0SW50KG5vZGUgKyBQUkVGSVhfQ09OVEVOVF9PRkZTRVQpOworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByZWZpeE5vZGUoY29udGVudEluZGV4LCBjaGlsZCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNFbWJlZGRlZFByZWZpeE5vZGUoaW50IG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0VW5zaWduZWRCeXRlKG5vZGUgKyBQUkVGSVhfRkxBR1NfT0ZGU0VUKSA8IEJMT0NLX1NJWkU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSB0aGUgY29udGVudCBmcm9tIGFuIGV4aXN0aW5nIG5vZGUsIGlmIGl0IGhhcyBhbnksIHRvIGEgbmV3bHktcHJlcGFyZWQgdXBkYXRlIGZvciBpdHMgY2hpbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhpc3RpbmdQcmVDb250ZW50Tm9kZSBwb2ludGVyIHRvIHRoZSBleGlzdGluZyBub2RlIGJlZm9yZSBza2lwcGluZyBvdmVyIGNvbnRlbnQgbm9kZXMsIGkuZS4gdGhpcyBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpdGhlciB0aGUgc2FtZSBhcyBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSBvciBhIHBvaW50ZXIgdG8gYSBwcmVmaXggb3IgbGVhZiBub2RlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hvc2UgY2hpbGQgaXMgZXhpc3RpbmdQb3N0Q29udGVudE5vZGUKKyAgICAgKiBAcGFyYW0gZXhpc3RpbmdQb3N0Q29udGVudE5vZGUgcG9pbnRlciB0byB0aGUgZXhpc3Rpbmcgbm9kZSBiZWluZyB1cGRhdGVkLCBhZnRlciBhbnkgY29udGVudCBub2RlcyBoYXZlIGJlZW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCBhbmQgYmVmb3JlIGFueSBtb2RpZmljYXRpb24gaGF2ZSBiZWVuIGFwcGxpZWQ7IGFsd2F5cyBhIG5vbi1jb250ZW50IG5vZGUKKyAgICAgKiBAcGFyYW0gdXBkYXRlZFBvc3RDb250ZW50Tm9kZSBpcyB0aGUgdXBkYXRlZCBub2RlLCBpLmUuIHRoZSBub2RlIHRvIHdoaWNoIGFsbCByZWxldmFudCBtb2RpZmljYXRpb25zIGhhdmUgYmVlbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQ7IGlmIHRoZSBtb2RpZmljYXRpb25zIHdlcmUgYXBwbGllZCBpbi1wbGFjZSwgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdQb3N0Q29udGVudE5vZGUsIG90aGVyd2lzZSBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IHBvaW50ZXI7IGFsd2F5cyBhIG5vbi0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50IG5vZGUKKyAgICAgKiBAcmV0dXJuIGEgbm9kZSB3aGljaCBoYXMgdGhlIGNoaWxkcmVuIG9mIHVwZGF0ZWRQb3N0Q29udGVudE5vZGUgY29tYmluZWQgd2l0aCB0aGUgY29udGVudCBvZgorICAgICAqICAgICAgICAgZXhpc3RpbmdQcmVDb250ZW50Tm9kZQorICAgICAqLworICAgIHByaXZhdGUgaW50IHByZXNlcnZlQ29udGVudChpbnQgZXhpc3RpbmdQcmVDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4aXN0aW5nUG9zdENvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXBkYXRlZFBvc3RDb250ZW50Tm9kZSkgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoZXhpc3RpbmdQcmVDb250ZW50Tm9kZSA9PSBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSkKKyAgICAgICAgICAgIHJldHVybiB1cGRhdGVkUG9zdENvbnRlbnROb2RlOyAgICAgLy8gbm8gY29udGVudCB0byBwcmVzZXJ2ZQorCisgICAgICAgIGlmIChleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSA9PSB1cGRhdGVkUG9zdENvbnRlbnROb2RlKQorICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nUHJlQ29udGVudE5vZGU7ICAgICAvLyBjaGlsZCBkaWRuJ3QgY2hhbmdlLCBubyB1cGRhdGUgbmVjZXNzYXJ5CisKKyAgICAgICAgLy8gZWxzZSB3ZSBoYXZlIGV4aXN0aW5nIHByZWZpeCBub2RlLCBhbmQgd2UgbmVlZCB0byByZWZlcmVuY2UgYSBuZXcgY2hpbGQKKyAgICAgICAgaWYgKGlzTGVhZihleGlzdGluZ1ByZUNvbnRlbnROb2RlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByZWZpeE5vZGUofmV4aXN0aW5nUHJlQ29udGVudE5vZGUsIHVwZGF0ZWRQb3N0Q29udGVudE5vZGUsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IG9mZnNldChleGlzdGluZ1ByZUNvbnRlbnROb2RlKSA9PSBQUkVGSVhfT0ZGU0VUIDogIlVuZXhwZWN0ZWQgY29udGVudCBpbiBub24tcHJlZml4IGFuZCBub24tbGVhZiBub2RlLiI7CisgICAgICAgIHJldHVybiB1cGRhdGVQcmVmaXhOb2RlQ2hpbGQoZXhpc3RpbmdQcmVDb250ZW50Tm9kZSwgdXBkYXRlZFBvc3RDb250ZW50Tm9kZSk7CisgICAgfQorCisgICAgZmluYWwgQXBwbHlTdGF0ZSBhcHBseVN0YXRlID0gbmV3IEFwcGx5U3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIHN0YXRlIGZvciBhbiB7QGxpbmsgI2FwcGx5fSBvcGVyYXRpb24uIENvbnRhaW5zIGEgc3RhY2sgb2YgYWxsIG5vZGVzIHdlIGRlc2NlbmRlZCB0aHJvdWdoCisgICAgICogYW5kIHVzZWQgdG8gdXBkYXRlIHRoZSBub2RlcyB3aXRoIGFueSBuZXcgZGF0YSBkdXJpbmcgYXNjZW50LgorICAgICAqCisgICAgICogVG8gbWFrZSB0aGlzIGFzIGVmZmljaWVudCBhbmQgR0MtZnJpZW5kbHkgYXMgcG9zc2libGUsIHdlIHVzZSBhbiBpbnRlZ2VyIGFycmF5IChpbnN0ZWFkIG9mIGlzIGFuIG9iamVjdCBzdGFjaykKKyAgICAgKiBhbmQgd2UgcmV1c2UgdGhlIHNhbWUgb2JqZWN0LiBUaGUgbGF0dGVyIGlzIHNhZmUgYmVjYXVzZSBtZW10YWJsZSB0cmllcyBjYW5ub3QgYmUgbXV0YXRlZCBpbiBwYXJhbGxlbCBieSBtdWx0aXBsZQorICAgICAqIHdyaXRlcnMuCisgICAgICovCisgICAgY2xhc3MgQXBwbHlTdGF0ZQorICAgIHsKKyAgICAgICAgaW50W10gZGF0YSA9IG5ldyBpbnRbMTYgKiA1XTsKKyAgICAgICAgaW50IGN1cnJlbnREZXB0aCA9IC0xOworCisgICAgICAgIHZvaWQgcmVzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyZW50RGVwdGggPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQb2ludGVyIHRvIHRoZSBleGlzdGluZyBub2RlIGJlZm9yZSBza2lwcGluZyBvdmVyIGNvbnRlbnQgbm9kZXMsIGkuZS4gdGhpcyBpcyBlaXRoZXIgdGhlIHNhbWUgYXMKKyAgICAgICAgICogZXhpc3RpbmdQb3N0Q29udGVudE5vZGUgb3IgYSBwb2ludGVyIHRvIGEgcHJlZml4IG9yIGxlYWYgbm9kZSB3aG9zZSBjaGlsZCBpcyBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZS4KKyAgICAgICAgICovCisgICAgICAgIGludCBleGlzdGluZ1ByZUNvbnRlbnROb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRhdGFbY3VycmVudERlcHRoICogNSArIDBdOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2V0RXhpc3RpbmdQcmVDb250ZW50Tm9kZShpbnQgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFbY3VycmVudERlcHRoICogNSArIDBdID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUG9pbnRlciB0byB0aGUgZXhpc3Rpbmcgbm9kZSBiZWluZyB1cGRhdGVkLCBhZnRlciBhbnkgY29udGVudCBub2RlcyBoYXZlIGJlZW4gc2tpcHBlZCBhbmQgYmVmb3JlIGFueQorICAgICAgICAgKiBtb2RpZmljYXRpb24gaGF2ZSBiZWVuIGFwcGxpZWQuIEFsd2F5cyBhIG5vbi1jb250ZW50IG5vZGUuCisgICAgICAgICAqLworICAgICAgICBpbnQgZXhpc3RpbmdQb3N0Q29udGVudE5vZGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGF0YVtjdXJyZW50RGVwdGggKiA1ICsgMV07CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXRFeGlzdGluZ1Bvc3RDb250ZW50Tm9kZShpbnQgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFbY3VycmVudERlcHRoICogNSArIDFdID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHVwZGF0ZWQgbm9kZSwgaS5lLiB0aGUgbm9kZSB0byB3aGljaCB0aGUgcmVsZXZhbnQgbW9kaWZpY2F0aW9ucyBhcmUgYmVpbmcgYXBwbGllZC4gVGhpcyB3aWxsIGNoYW5nZSBhcworICAgICAgICAgKiBjaGlsZHJlbiBhcmUgcHJvY2Vzc2VkIGFuZCBhdHRhY2hlZCB0byB0aGUgbm9kZS4gQWZ0ZXIgYWxsIGNoaWxkcmVuIGhhdmUgYmVlbiBwcm9jZXNzZWQsIHRoaXMgd2lsbCBjb250YWluCisgICAgICAgICAqIHRoZSBmdWxseSB1cGRhdGVkIG5vZGUgKGkuZS4gdGhlIHVuaW9uIG9mIGV4aXN0aW5nUG9zdENvbnRlbnROb2RlIGFuZCBtdXRhdGlvbk5vZGUpIHdpdGhvdXQgYW55IGNvbnRlbnQsCisgICAgICAgICAqIHdoaWNoIHdpbGwgYmUgcHJvY2Vzc2VkIHNlcGFyYXRlbHkgYW5kLCBpZiBuZWNlc3NhcnksIGF0dGFjaGVkIGFoZWFkIG9mIHRoaXMuIElmIHRoZSBtb2RpZmljYXRpb25zIHdlcmUKKyAgICAgICAgICogYXBwbGllZCBpbi1wbGFjZSwgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIGV4aXN0aW5nUG9zdENvbnRlbnROb2RlLCBvdGhlcndpc2UgYSBjb21wbGV0ZWx5IGRpZmZlcmVudAorICAgICAgICAgKiBwb2ludGVyLiBBbHdheXMgYSBub24tY29udGVudCBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IHVwZGF0ZWRQb3N0Q29udGVudE5vZGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGF0YVtjdXJyZW50RGVwdGggKiA1ICsgMl07CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXRVcGRhdGVkUG9zdENvbnRlbnROb2RlKGludCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YVtjdXJyZW50RGVwdGggKiA1ICsgMl0gPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdHJhbnNpdGlvbiB3ZSB0b29rIG9uIHRoZSB3YXkgZG93bi4KKyAgICAgICAgICovCisgICAgICAgIGludCB0cmFuc2l0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRhdGFbY3VycmVudERlcHRoICogNSArIDNdOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2V0VHJhbnNpdGlvbihpbnQgdHJhbnNpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgZGF0YVtjdXJyZW50RGVwdGggKiA1ICsgM10gPSB0cmFuc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb21waWxlZCBjb250ZW50IGluZGV4LiBOZWVkZWQgYmVjYXVzZSB3ZSBjYW4gb25seSBhY2Nlc3MgYSBjdXJzb3IncyBjb250ZW50IG9uIHRoZSB3YXkgZG93biBidXQgd2UgY2FuJ3QKKyAgICAgICAgICogYXR0YWNoIGl0IHVudGlsIHdlIGFzY2VuZCBmcm9tIHRoZSBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGNvbnRlbnRJbmRleCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkYXRhW2N1cnJlbnREZXB0aCAqIDUgKyA0XTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIHNldENvbnRlbnRJbmRleChpbnQgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFbY3VycmVudERlcHRoICogNSArIDRdID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGVzY2VuZCB0byBhIGNoaWxkIG5vZGUuIFByZXBhcmVzIGEgbmV3IGVudHJ5IGluIHRoZSBzdGFjayBmb3IgdGhlIG5vZGUuCisgICAgICAgICAqLworICAgICAgICA8VT4gdm9pZCBkZXNjZW5kKGludCB0cmFuc2l0aW9uLCBVIG11dGF0aW9uQ29udGVudCwgZmluYWwgVXBzZXJ0VHJhbnNmb3JtZXI8VCwgVT4gdHJhbnNmb3JtZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBleGlzdGluZ1ByZUNvbnRlbnROb2RlOworICAgICAgICAgICAgaWYgKGN1cnJlbnREZXB0aCA8IDApCisgICAgICAgICAgICAgICAgZXhpc3RpbmdQcmVDb250ZW50Tm9kZSA9IHJvb3Q7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2V0VHJhbnNpdGlvbih0cmFuc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBleGlzdGluZ1ByZUNvbnRlbnROb2RlID0gaXNOdWxsKGV4aXN0aW5nUG9zdENvbnRlbnROb2RlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTk9ORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldENoaWxkKGV4aXN0aW5nUG9zdENvbnRlbnROb2RlKCksIHRyYW5zaXRpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICArK2N1cnJlbnREZXB0aDsKKyAgICAgICAgICAgIGlmIChjdXJyZW50RGVwdGggKiA1ID49IGRhdGEubGVuZ3RoKQorICAgICAgICAgICAgICAgIGRhdGEgPSBBcnJheXMuY29weU9mKGRhdGEsIGN1cnJlbnREZXB0aCAqIDUgKiAyKTsKKyAgICAgICAgICAgIHNldEV4aXN0aW5nUHJlQ29udGVudE5vZGUoZXhpc3RpbmdQcmVDb250ZW50Tm9kZSk7CisKKyAgICAgICAgICAgIGludCBleGlzdGluZ0NvbnRlbnRJbmRleCA9IC0xOworICAgICAgICAgICAgaW50IGV4aXN0aW5nUG9zdENvbnRlbnROb2RlOworICAgICAgICAgICAgaWYgKGlzTGVhZihleGlzdGluZ1ByZUNvbnRlbnROb2RlKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBleGlzdGluZ0NvbnRlbnRJbmRleCA9IH5leGlzdGluZ1ByZUNvbnRlbnROb2RlOworICAgICAgICAgICAgICAgIGV4aXN0aW5nUG9zdENvbnRlbnROb2RlID0gTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKG9mZnNldChleGlzdGluZ1ByZUNvbnRlbnROb2RlKSA9PSBQUkVGSVhfT0ZGU0VUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGV4aXN0aW5nQ29udGVudEluZGV4ID0gZ2V0SW50KGV4aXN0aW5nUHJlQ29udGVudE5vZGUgKyBQUkVGSVhfQ09OVEVOVF9PRkZTRVQpOworICAgICAgICAgICAgICAgIGV4aXN0aW5nUG9zdENvbnRlbnROb2RlID0gZm9sbG93Q29udGVudFRyYW5zaXRpb24oZXhpc3RpbmdQcmVDb250ZW50Tm9kZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZXhpc3RpbmdQb3N0Q29udGVudE5vZGUgPSBleGlzdGluZ1ByZUNvbnRlbnROb2RlOworICAgICAgICAgICAgc2V0RXhpc3RpbmdQb3N0Q29udGVudE5vZGUoZXhpc3RpbmdQb3N0Q29udGVudE5vZGUpOworICAgICAgICAgICAgc2V0VXBkYXRlZFBvc3RDb250ZW50Tm9kZShleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSk7CisKKyAgICAgICAgICAgIGludCBjb250ZW50SW5kZXggPSB1cGRhdGVDb250ZW50SW5kZXgobXV0YXRpb25Db250ZW50LCBleGlzdGluZ0NvbnRlbnRJbmRleCwgdHJhbnNmb3JtZXIpOworICAgICAgICAgICAgc2V0Q29udGVudEluZGV4KGNvbnRlbnRJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29tYmluZSBleGlzdGluZyBhbmQgbmV3IGNvbnRlbnQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIDxVPiBpbnQgdXBkYXRlQ29udGVudEluZGV4KFUgbXV0YXRpb25Db250ZW50LCBpbnQgZXhpc3RpbmdDb250ZW50SW5kZXgsIGZpbmFsIFVwc2VydFRyYW5zZm9ybWVyPFQsIFU+IHRyYW5zZm9ybWVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobXV0YXRpb25Db250ZW50ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ29udGVudEluZGV4ICE9IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVCBleGlzdGluZ0NvbnRlbnQgPSBnZXRDb250ZW50KGV4aXN0aW5nQ29udGVudEluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgVCBjb21iaW5lZENvbnRlbnQgPSB0cmFuc2Zvcm1lci5hcHBseShleGlzdGluZ0NvbnRlbnQsIG11dGF0aW9uQ29udGVudCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCAoY29tYmluZWRDb250ZW50ICE9IG51bGwpIDogIlRyYW5zZm9ybWVyIGNhbm5vdCBiZSB1c2VkIHRvIHJlbW92ZSBjb250ZW50LiI7CisgICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnQoZXhpc3RpbmdDb250ZW50SW5kZXgsIGNvbWJpbmVkQ29udGVudCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGlzdGluZ0NvbnRlbnRJbmRleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVCBjb21iaW5lZENvbnRlbnQgPSB0cmFuc2Zvcm1lci5hcHBseShudWxsLCBtdXRhdGlvbkNvbnRlbnQpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgKGNvbWJpbmVkQ29udGVudCAhPSBudWxsKSA6ICJUcmFuc2Zvcm1lciBjYW5ub3QgYmUgdXNlZCB0byByZW1vdmUgY29udGVudC4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkQ29udGVudChjb21iaW5lZENvbnRlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdDb250ZW50SW5kZXg7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQXR0YWNoIGEgY2hpbGQgdG8gdGhlIGN1cnJlbnQgbm9kZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBhdHRhY2hDaGlsZChpbnQgdHJhbnNpdGlvbiwgaW50IGNoaWxkKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaW50IHVwZGF0ZWRQb3N0Q29udGVudE5vZGUgPSB1cGRhdGVkUG9zdENvbnRlbnROb2RlKCk7CisgICAgICAgICAgICBpZiAoaXNOdWxsKHVwZGF0ZWRQb3N0Q29udGVudE5vZGUpKQorICAgICAgICAgICAgICAgIHNldFVwZGF0ZWRQb3N0Q29udGVudE5vZGUoZXhwYW5kT3JDcmVhdGVDaGFpbk5vZGUodHJhbnNpdGlvbiwgY2hpbGQpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzZXRVcGRhdGVkUG9zdENvbnRlbnROb2RlKEluTWVtb3J5VHJpZS50aGlzLmF0dGFjaENoaWxkKHVwZGF0ZWRQb3N0Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBcHBseSB0aGUgY29sbGVjdGVkIGNvbnRlbnQgdG8gYSBub2RlLiBDb252ZXJ0cyBOT05FIHRvIGEgbGVhZiBub2RlLCBhbmQgYWRkcyBvciB1cGRhdGVzIGEgcHJlZml4IGZvciBhbGwKKyAgICAgICAgICogb3RoZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBpbnQgYXBwbHlDb250ZW50KCkgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb250ZW50SW5kZXggPSBjb250ZW50SW5kZXgoKTsKKyAgICAgICAgICAgIGludCB1cGRhdGVkUG9zdENvbnRlbnROb2RlID0gdXBkYXRlZFBvc3RDb250ZW50Tm9kZSgpOworICAgICAgICAgICAgaWYgKGNvbnRlbnRJbmRleCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdXBkYXRlZFBvc3RDb250ZW50Tm9kZTsKKworICAgICAgICAgICAgaWYgKGlzTnVsbCh1cGRhdGVkUG9zdENvbnRlbnROb2RlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gfmNvbnRlbnRJbmRleDsKKworICAgICAgICAgICAgaW50IGV4aXN0aW5nUHJlQ29udGVudE5vZGUgPSBleGlzdGluZ1ByZUNvbnRlbnROb2RlKCk7CisgICAgICAgICAgICBpbnQgZXhpc3RpbmdQb3N0Q29udGVudE5vZGUgPSBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSgpOworCisgICAgICAgICAgICAvLyBXZSBjYW4ndCB1cGRhdGUgaW4tcGxhY2UgaWYgdGhlcmUgd2FzIG5vIHByZWV4aXN0aW5nIHByZWZpeCwgb3IgaWYgdGhlIHByZWZpeCB3YXMgZW1iZWRkZWQgYW5kIHRoZSB0YXJnZXQKKyAgICAgICAgICAgIC8vIG5vZGUgbXVzdCBjaGFuZ2UuCisgICAgICAgICAgICBpZiAoZXhpc3RpbmdQcmVDb250ZW50Tm9kZSA9PSBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSB8fAorICAgICAgICAgICAgICAgIGlzTnVsbChleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSkgfHwKKyAgICAgICAgICAgICAgICBpc0VtYmVkZGVkUHJlZml4Tm9kZShleGlzdGluZ1ByZUNvbnRlbnROb2RlKSAmJiB1cGRhdGVkUG9zdENvbnRlbnROb2RlICE9IGV4aXN0aW5nUG9zdENvbnRlbnROb2RlKQorICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcmVmaXhOb2RlKGNvbnRlbnRJbmRleCwgdXBkYXRlZFBvc3RDb250ZW50Tm9kZSwgaXNOdWxsKGV4aXN0aW5nUG9zdENvbnRlbnROb2RlKSk7CisKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBtb2RpZnkgaW4gcGxhY2UKKyAgICAgICAgICAgIGlmICh1cGRhdGVkUG9zdENvbnRlbnROb2RlICE9IGV4aXN0aW5nUG9zdENvbnRlbnROb2RlKSAvLyB0byB1c2Ugdm9sYXRpbGUgd3JpdGUgYnV0IGFsc28gZW5zdXJlIHdlIGRvbid0IGNvcnJ1cHQgZW1iZWRkZWQgbm9kZXMKKyAgICAgICAgICAgICAgICBwdXRJbnRWb2xhdGlsZShleGlzdGluZ1ByZUNvbnRlbnROb2RlICsgUFJFRklYX1BPSU5URVJfT0ZGU0VULCB1cGRhdGVkUG9zdENvbnRlbnROb2RlKTsKKyAgICAgICAgICAgIGFzc2VydCBjb250ZW50SW5kZXggPT0gZ2V0SW50KGV4aXN0aW5nUHJlQ29udGVudE5vZGUgKyBQUkVGSVhfQ09OVEVOVF9PRkZTRVQpIDogIlVuZXhwZWN0ZWQgY2hhbmdlIG9mIGNvbnRlbnQgaW5kZXguIjsKKyAgICAgICAgICAgIHJldHVybiBleGlzdGluZ1ByZUNvbnRlbnROb2RlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFmdGVyIGEgbm9kZSdzIGNoaWxkcmVuIGFyZSBwcm9jZXNzZWQsIHRoaXMgaXMgY2FsbGVkIHRvIGFzY2VuZCBmcm9tIGl0LiBUaGlzIG1lYW5zIGFwcGx5aW5nIHRoZSBjb2xsZWN0ZWQKKyAgICAgICAgICogY29udGVudCB0byB0aGUgY29tcGlsZWQgdXBkYXRlZFBvc3RDb250ZW50Tm9kZSBhbmQgY3JlYXRpbmcgYSBtYXBwaW5nIGluIHRoZSBwYXJlbnQgdG8gaXQgKG9yIHVwZGF0aW5nIGlmCisgICAgICAgICAqIG9uZSBhbHJlYWR5IGV4aXN0cykuCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiBzdGlsbCBoYXZlIHdvcmsgdG8gZG8sIGZhbHNlIGlmIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGF0dGFjaEFuZE1vdmVUb1BhcmVudFN0YXRlKCkgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB1cGRhdGVkUHJlQ29udGVudE5vZGUgPSBhcHBseUNvbnRlbnQoKTsKKyAgICAgICAgICAgIGludCBleGlzdGluZ1ByZUNvbnRlbnROb2RlID0gZXhpc3RpbmdQcmVDb250ZW50Tm9kZSgpOworICAgICAgICAgICAgLS1jdXJyZW50RGVwdGg7CisgICAgICAgICAgICBpZiAoY3VycmVudERlcHRoID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCByb290ID09IGV4aXN0aW5nUHJlQ29udGVudE5vZGUgOiAiVW5leHBlY3RlZCBjaGFuZ2UgdG8gcm9vdC4gQ29uY3VycmVudCB0cmllIG1vZGlmaWNhdGlvbj8iOworICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkUHJlQ29udGVudE5vZGUgIT0gZXhpc3RpbmdQcmVDb250ZW50Tm9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgd3JpdGUgdG8gcm9vdCBpZiB0aGV5IGFyZSBkaWZmZXJlbnQgKHZhbHVlIGRvZXNuJ3QgY2hhbmdlLCBidXQKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byBpbnZhbGlkYXRlIHRoZSB2YWx1ZSBpbiBvdGhlciBjb3JlcycgY2FjaGVzIHVubmVjZXNzYXJpbHkpLgorICAgICAgICAgICAgICAgICAgICByb290ID0gdXBkYXRlZFByZUNvbnRlbnROb2RlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodXBkYXRlZFByZUNvbnRlbnROb2RlICE9IGV4aXN0aW5nUHJlQ29udGVudE5vZGUpCisgICAgICAgICAgICAgICAgYXR0YWNoQ2hpbGQodHJhbnNpdGlvbigpLCB1cGRhdGVkUHJlQ29udGVudE5vZGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTb21ld2hhdCBzaW1pbGFyIHRvIHtAbGluayBNZXJnZVJlc29sdmVyfSwgdGhpcyBlbmNhcHN1bGF0ZXMgbG9naWMgdG8gYmUgYXBwbGllZCB3aGVuZXZlciBuZXcgY29udGVudCBpcyBiZWluZworICAgICAqIHVwc2VydGVkIGludG8gYSB7QGxpbmsgSW5NZW1vcnlUcmllfS4gVW5saWtlIHtAbGluayBNZXJnZVJlc29sdmVyfSwge0BsaW5rIFVwc2VydFRyYW5zZm9ybWVyfSB3aWxsIGJlIGFwcGxpZWQgbm8KKyAgICAgKiBtYXR0ZXIgaWYgdGhlcmUncyBwcmUtZXhpc3RpbmcgY29udGVudCBmb3IgdGhhdCB0cmllIGtleS9wYXRoIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gVGhlIGNvbnRlbnQgdHlwZSBmb3IgdGhpcyB7QGxpbmsgSW5NZW1vcnlUcmllfS4KKyAgICAgKiBAcGFyYW0gPFU+IFRoZSB0eXBlIG9mIHRoZSBuZXcgY29udGVudCBiZWluZyBhcHBsaWVkIHRvIHRoaXMge0BsaW5rIEluTWVtb3J5VHJpZX0uCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBVcHNlcnRUcmFuc2Zvcm1lcjxULCBVPgorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZXJlJ3MgY29udGVudCBpbiB0aGUgdXBkYXRpbmcgdHJpZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV4aXN0aW5nIEV4aXN0aW5nIGNvbnRlbnQgZm9yIHRoaXMga2V5LCBvciBudWxsIGlmIHRoZXJlIGlzbid0IGFueS4KKyAgICAgICAgICogQHBhcmFtIHVwZGF0ZSAgIFRoZSB1cGRhdGUsIGFsd2F5cyBub24tbnVsbC4KKyAgICAgICAgICogQHJldHVybiBUaGUgY29tYmluZWQgdmFsdWUgdG8gdXNlLiBDYW5ub3QgYmUgbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIFQgYXBwbHkoVCBleGlzdGluZywgVSB1cGRhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1vZGlmeSB0aGlzIHRyaWUgdG8gYXBwbHkgdGhlIG11dGF0aW9uIGdpdmVuIGluIHRoZSBmb3JtIG9mIGEgdHJpZS4gQW55IGNvbnRlbnQgaW4gdGhlIG11dGF0aW9uIHdpbGwgYmUgcmVzb2x2ZWQKKyAgICAgKiB3aXRoIHRoZSBnaXZlbiBmdW5jdGlvbiBiZWZvcmUgYmVpbmcgcGxhY2VkIGluIHRoaXMgdHJpZSAoZXZlbiBpZiB0aGVyZSdzIG5vIHByZS1leGlzdGluZyBjb250ZW50IGluIHRoaXMgdHJpZSkuCisgICAgICogQHBhcmFtIG11dGF0aW9uIHRoZSBtdXRhdGlvbiB0byBiZSBhcHBsaWVkLCBnaXZlbiBpbiB0aGUgZm9ybSBvZiBhIHRyaWUuIE5vdGUgdGhhdCBpdHMgY29udGVudCBjYW4gYmUgb2YgdHlwZQorICAgICAqIGRpZmZlcmVudCB0aGFuIHRoZSBlbGVtZW50IHR5cGUgZm9yIHRoaXMgbWVtdGFibGUgdHJpZS4KKyAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgYSBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBwb3RlbnRpYWxseSBwcmUtZXhpc3RpbmcgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXksIGFuZCB0aGUgbmV3CisgICAgICogdmFsdWUuIEFwcGxpZWQgZXZlbiBpZiB0aGVyZSdzIG5vIHByZS1leGlzdGluZyB2YWx1ZSBpbiB0aGUgbWVtdGFibGUgdHJpZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFU+IHZvaWQgYXBwbHkoVHJpZTxVPiBtdXRhdGlvbiwgZmluYWwgVXBzZXJ0VHJhbnNmb3JtZXI8VCwgVT4gdHJhbnNmb3JtZXIpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ3Vyc29yPFU+IG11dGF0aW9uQ3Vyc29yID0gbXV0YXRpb24uY3Vyc29yKCk7CisgICAgICAgIGFzc2VydCBtdXRhdGlvbkN1cnNvci5kZXB0aCgpID09IDAgOiAiVW5leHBlY3RlZCBub24tZnJlc2ggY3Vyc29yLiI7CisgICAgICAgIEFwcGx5U3RhdGUgc3RhdGUgPSBhcHBseVN0YXRlOworICAgICAgICBzdGF0ZS5yZXNldCgpOworICAgICAgICBzdGF0ZS5kZXNjZW5kKC0xLCBtdXRhdGlvbkN1cnNvci5jb250ZW50KCksIHRyYW5zZm9ybWVyKTsKKyAgICAgICAgYXNzZXJ0IHN0YXRlLmN1cnJlbnREZXB0aCA9PSAwIDogIlVuZXhwZWN0ZWQgY2hhbmdlIHRvIGFwcGx5U3RhdGUuIENvbmN1cnJlbnQgdHJpZSBtb2RpZmljYXRpb24/IjsKKworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGRlcHRoID0gbXV0YXRpb25DdXJzb3IuYWR2YW5jZSgpOworICAgICAgICAgICAgd2hpbGUgKHN0YXRlLmN1cnJlbnREZXB0aCA+PSBkZXB0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbm8gbW9yZSBjaGlsZHJlbi4gQXNjZW5kIHRvIHRoZSBwYXJlbnQgc3RhdGUgdG8gY29udGludWUgd2Fsay4KKyAgICAgICAgICAgICAgICBpZiAoIXN0YXRlLmF0dGFjaEFuZE1vdmVUb1BhcmVudFN0YXRlKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZGVwdGggPT0gLTEgOiAiVW5leHBlY3RlZCBjaGFuZ2UgdG8gYXBwbHlTdGF0ZS4gQ29uY3VycmVudCB0cmllIG1vZGlmaWNhdGlvbj8iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBXZSBoYXZlIGEgdHJhbnNpdGlvbiwgZ2V0IGNoaWxkIHRvIGRlc2NlbmQgaW50bworICAgICAgICAgICAgc3RhdGUuZGVzY2VuZChtdXRhdGlvbkN1cnNvci5pbmNvbWluZ1RyYW5zaXRpb24oKSwgbXV0YXRpb25DdXJzb3IuY29udGVudCgpLCB0cmFuc2Zvcm1lcik7CisgICAgICAgICAgICBhc3NlcnQgc3RhdGUuY3VycmVudERlcHRoID09IGRlcHRoIDogIlVuZXhwZWN0ZWQgY2hhbmdlIHRvIGFwcGx5U3RhdGUuIENvbmN1cnJlbnQgdHJpZSBtb2RpZmljYXRpb24/IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcC1saWtlIHB1dCBtZXRob2QsIHVzaW5nIHRoZSBhcHBseSBtYWNoaW5lcnkgYWJvdmUgd2hpY2ggY2Fubm90IHJ1biBpbnRvIHN0YWNrIG92ZXJmbG93LiBXaGVuIHRoZSBjb3JyZWN0CisgICAgICogcG9zaXRpb24gaW4gdGhlIHRyaWUgaGFzIGJlZW4gcmVhY2hlZCwgdGhlIHZhbHVlIHdpbGwgYmUgcmVzb2x2ZWQgd2l0aCB0aGUgZ2l2ZW4gZnVuY3Rpb24gYmVmb3JlIGJlaW5nIHBsYWNlZCBpbgorICAgICAqIHRoZSB0cmllIChldmVuIGlmIHRoZXJlJ3Mgbm8gcHJlLWV4aXN0aW5nIGNvbnRlbnQgaW4gdGhpcyB0cmllKS4KKyAgICAgKiBAcGFyYW0ga2V5IHRoZSB0cmllIHBhdGgva2V5IGZvciB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBiZWluZyBwdXQgaW4gdGhlIG1lbXRhYmxlIHRyaWUuIE5vdGUgdGhhdCBpdCBjYW4gYmUgb2YgdHlwZSBkaWZmZXJlbnQgdGhhbiB0aGUgZWxlbWVudAorICAgICAqIHR5cGUgZm9yIHRoaXMgbWVtdGFibGUgdHJpZS4gSXQncyB1cCB0byB0aGUge0Bjb2RlIHRyYW5zZm9ybWVyfSB0byByZXR1cm4gdGhlIGZpbmFsIHZhbHVlIHRoYXQgd2lsbCBzdGF5IGluCisgICAgICogdGhlIG1lbXRhYmxlIHRyaWUuCisgICAgICogQHBhcmFtIHRyYW5zZm9ybWVyIGEgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgcG90ZW50aWFsbHkgcHJlLWV4aXN0aW5nIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5LCBhbmQgdGhlIG5ldworICAgICAqIHZhbHVlIChvZiBhIHBvdGVudGlhbGx5IGRpZmZlcmVudCB0eXBlKSwgcmV0dXJuaW5nIHRoZSBmaW5hbCB2YWx1ZSB0aGF0IHdpbGwgc3RheSBpbiB0aGUgbWVtdGFibGUgdHJpZS4gQXBwbGllZAorICAgICAqIGV2ZW4gaWYgdGhlcmUncyBubyBwcmUtZXhpc3RpbmcgdmFsdWUgaW4gdGhlIG1lbXRhYmxlIHRyaWUuCisgICAgICovCisgICAgcHVibGljIDxSPiB2b2lkIHB1dFNpbmdsZXRvbihCeXRlQ29tcGFyYWJsZSBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBzZXJ0VHJhbnNmb3JtZXI8VCwgPyBzdXBlciBSPiB0cmFuc2Zvcm1lcikgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBhcHBseShUcmllLnNpbmdsZXRvbihrZXksIHZhbHVlKSwgdHJhbnNmb3JtZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdmVyc2lvbiBvZiBwdXRTaW5nbGV0b24gd2hpY2ggdXNlcyByZWN1cnNpdmUgcHV0IGlmIHRoZSBsYXN0IGFyZ3VtZW50IGlzIHRydWUuCisgICAgICovCisgICAgcHVibGljIDxSPiB2b2lkIHB1dFNpbmdsZXRvbihCeXRlQ29tcGFyYWJsZSBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBzZXJ0VHJhbnNmb3JtZXI8VCwgPyBzdXBlciBSPiB0cmFuc2Zvcm1lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlUmVjdXJzaXZlKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmICh1c2VSZWN1cnNpdmUpCisgICAgICAgICAgICBwdXRSZWN1cnNpdmUoa2V5LCB2YWx1ZSwgdHJhbnNmb3JtZXIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwdXRTaW5nbGV0b24oa2V5LCB2YWx1ZSwgdHJhbnNmb3JtZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcC1saWtlIHB1dCBtZXRob2QsIHVzaW5nIGEgZmFzdCByZWN1cnNpdmUgaW1wbGVtZW50YXRpb24gdGhyb3VnaCB0aGUga2V5IGJ5dGVzLiBNYXkgcnVuIGludG8gc3RhY2sgb3ZlcmZsb3cgaWYKKyAgICAgKiB0aGUgdHJpZSBiZWNvbWVzIHRvbyBkZWVwLiBXaGVuIHRoZSBjb3JyZWN0IHBvc2l0aW9uIGluIHRoZSB0cmllIGhhcyBiZWVuIHJlYWNoZWQsIHRoZSB2YWx1ZSB3aWxsIGJlIHJlc29sdmVkCisgICAgICogd2l0aCB0aGUgZ2l2ZW4gZnVuY3Rpb24gYmVmb3JlIGJlaW5nIHBsYWNlZCBpbiB0aGUgdHJpZSAoZXZlbiBpZiB0aGVyZSdzIG5vIHByZS1leGlzdGluZyBjb250ZW50IGluIHRoaXMgdHJpZSkuCisgICAgICogQHBhcmFtIGtleSB0aGUgdHJpZSBwYXRoL2tleSBmb3IgdGhlIGdpdmVuIHZhbHVlLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgYmVpbmcgcHV0IGluIHRoZSBtZW10YWJsZSB0cmllLiBOb3RlIHRoYXQgaXQgY2FuIGJlIG9mIHR5cGUgZGlmZmVyZW50IHRoYW4gdGhlIGVsZW1lbnQKKyAgICAgKiB0eXBlIGZvciB0aGlzIG1lbXRhYmxlIHRyaWUuIEl0J3MgdXAgdG8gdGhlIHtAY29kZSB0cmFuc2Zvcm1lcn0gdG8gcmV0dXJuIHRoZSBmaW5hbCB2YWx1ZSB0aGF0IHdpbGwgc3RheSBpbgorICAgICAqIHRoZSBtZW10YWJsZSB0cmllLgorICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1lciBhIGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIHBvdGVudGlhbGx5IHByZS1leGlzdGluZyB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSwgYW5kIHRoZSBuZXcKKyAgICAgKiB2YWx1ZSAob2YgYSBwb3RlbnRpYWxseSBkaWZmZXJlbnQgdHlwZSksIHJldHVybmluZyB0aGUgZmluYWwgdmFsdWUgdGhhdCB3aWxsIHN0YXkgaW4gdGhlIG1lbXRhYmxlIHRyaWUuIEFwcGxpZWQKKyAgICAgKiBldmVuIGlmIHRoZXJlJ3Mgbm8gcHJlLWV4aXN0aW5nIHZhbHVlIGluIHRoZSBtZW10YWJsZSB0cmllLgorICAgICAqLworICAgIHB1YmxpYyA8Uj4gdm9pZCBwdXRSZWN1cnNpdmUoQnl0ZUNvbXBhcmFibGUga2V5LCBSIHZhbHVlLCBmaW5hbCBVcHNlcnRUcmFuc2Zvcm1lcjxULCBSPiB0cmFuc2Zvcm1lcikgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBpbnQgbmV3Um9vdCA9IHB1dFJlY3Vyc2l2ZShyb290LCBrZXkuYXNDb21wYXJhYmxlQnl0ZXMoQllURV9DT01QQVJBQkxFX1ZFUlNJT04pLCB2YWx1ZSwgdHJhbnNmb3JtZXIpOworICAgICAgICBpZiAobmV3Um9vdCAhPSByb290KQorICAgICAgICAgICAgcm9vdCA9IG5ld1Jvb3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSA8Uj4gaW50IHB1dFJlY3Vyc2l2ZShpbnQgbm9kZSwgQnl0ZVNvdXJjZSBrZXksIFIgdmFsdWUsIGZpbmFsIFVwc2VydFRyYW5zZm9ybWVyPFQsIFI+IHRyYW5zZm9ybWVyKSB0aHJvd3MgU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCB0cmFuc2l0aW9uID0ga2V5Lm5leHQoKTsKKyAgICAgICAgaWYgKHRyYW5zaXRpb24gPT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgcmV0dXJuIGFwcGx5Q29udGVudChub2RlLCB2YWx1ZSwgdHJhbnNmb3JtZXIpOworCisgICAgICAgIGludCBjaGlsZCA9IGdldENoaWxkKG5vZGUsIHRyYW5zaXRpb24pOworCisgICAgICAgIGludCBuZXdDaGlsZCA9IHB1dFJlY3Vyc2l2ZShjaGlsZCwga2V5LCB2YWx1ZSwgdHJhbnNmb3JtZXIpOworICAgICAgICBpZiAobmV3Q2hpbGQgPT0gY2hpbGQpCisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKworICAgICAgICBpbnQgc2tpcHBlZENvbnRlbnQgPSBmb2xsb3dDb250ZW50VHJhbnNpdGlvbihub2RlKTsKKyAgICAgICAgaW50IGF0dGFjaGVkQ2hpbGQgPSAhaXNOdWxsKHNraXBwZWRDb250ZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXR0YWNoQ2hpbGQoc2tpcHBlZENvbnRlbnQsIHRyYW5zaXRpb24sIG5ld0NoaWxkKSAgLy8gU2luZ2xlIHBhdGgsIG5vIGNvcHlpbmcgcmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGV4cGFuZE9yQ3JlYXRlQ2hhaW5Ob2RlKHRyYW5zaXRpb24sIG5ld0NoaWxkKTsKKworICAgICAgICByZXR1cm4gcHJlc2VydmVDb250ZW50KG5vZGUsIHNraXBwZWRDb250ZW50LCBhdHRhY2hlZENoaWxkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxSPiBpbnQgYXBwbHlDb250ZW50KGludCBub2RlLCBSIHZhbHVlLCBVcHNlcnRUcmFuc2Zvcm1lcjxULCBSPiB0cmFuc2Zvcm1lcikgdGhyb3dzIFNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoaXNOdWxsKG5vZGUpKQorICAgICAgICAgICAgcmV0dXJuIH5hZGRDb250ZW50KHRyYW5zZm9ybWVyLmFwcGx5KG51bGwsIHZhbHVlKSk7CisKKyAgICAgICAgaWYgKGlzTGVhZihub2RlKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvbnRlbnRJbmRleCA9IH5ub2RlOworICAgICAgICAgICAgc2V0Q29udGVudChjb250ZW50SW5kZXgsIHRyYW5zZm9ybWVyLmFwcGx5KGdldENvbnRlbnQoY29udGVudEluZGV4KSwgdmFsdWUpKTsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9mZnNldChub2RlKSA9PSBQUkVGSVhfT0ZGU0VUKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29udGVudEluZGV4ID0gZ2V0SW50KG5vZGUgKyBQUkVGSVhfQ09OVEVOVF9PRkZTRVQpOworICAgICAgICAgICAgc2V0Q29udGVudChjb250ZW50SW5kZXgsIHRyYW5zZm9ybWVyLmFwcGx5KGdldENvbnRlbnQoY29udGVudEluZGV4KSwgdmFsdWUpKTsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcmVmaXhOb2RlKGFkZENvbnRlbnQodHJhbnNmb3JtZXIuYXBwbHkobnVsbCwgdmFsdWUpKSwgbm9kZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYWxsb2NhdGlvbiB0aHJlc2hvbGQgaGFzIGJlZW4gcmVhY2hlZC4gVG8gYmUgY2FsbGVkIGJ5IHRoZSB0aGUgd3JpdGluZyB0aHJlYWQgKGlkZWFsbHksIGp1c3QKKyAgICAgKiBhZnRlciB0aGUgd3JpdGUgY29tcGxldGVzKS4gV2hlbiB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlIHVzZXIgc2hvdWxkIHN3aXRjaCB0byBhIG5ldyB0cmllIGFzIHNvb24gYXMgZmVhc2libGUuCisgICAgICoKKyAgICAgKiBUaGUgdHJpZSBleHBlY3RzIHVwIHRvIDEwJSBncm93dGggYWJvdmUgdGhpcyB0aHJlc2hvbGQuIEFueSBncm93dGggYmV5b25kIHRoYXQgbWF5IGJlIGRvbmUgaW5lZmZpY2llbnRseSwgYW5kCisgICAgICogdGhlIHRyaWUgd2lsbCBmYWlsIGFsdG9nZXRoZXIgd2hlbiB0aGUgc2l6ZSBncm93cyBiZXlvbmQgMkcgLSAyNTYgYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVhY2hlZEFsbG9jYXRlZFNpemVUaHJlc2hvbGQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFsbG9jYXRlZFBvcyA+PSBBTExPQ0FURURfU0laRV9USFJFU0hPTEQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yIHRlc3RzIG9ubHkhIEFkdmFuY2UgdGhlIGFsbG9jYXRpb24gcG9pbnRlciAoYW5kIGFsbG9jYXRlIHNwYWNlKSBieSB0aGlzIG11Y2ggdG8gdGVzdCBiZWhhdmlvdXIgY2xvc2UgdG8KKyAgICAgKiBmdWxsLgorICAgICAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIGludCBhZHZhbmNlQWxsb2NhdGVkUG9zKGludCB3YW50ZWRQb3MpIHRocm93cyBTcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgd2hpbGUgKGFsbG9jYXRlZFBvcyA8IHdhbnRlZFBvcykKKyAgICAgICAgICAgIGFsbG9jYXRlQmxvY2soKTsKKyAgICAgICAgcmV0dXJuIGFsbG9jYXRlZFBvczsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0aGUgb2ZmIGhlYXAgc2l6ZSBvZiB0aGUgbWVtdGFibGUgdHJpZSBpdHNlbGYsIG5vdCBjb3VudGluZyBhbnkgc3BhY2UgdGFrZW4gYnkgcmVmZXJlbmNlZCBjb250ZW50LiAqLworICAgIHB1YmxpYyBsb25nIHNpemVPZmZIZWFwKCkKKyAgICB7CisgICAgICAgIHJldHVybiBidWZmZXJUeXBlID09IEJ1ZmZlclR5cGUuT05fSEVBUCA/IDAgOiBhbGxvY2F0ZWRQb3M7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdGhlIG9uIGhlYXAgc2l6ZSBvZiB0aGUgbWVtdGFibGUgdHJpZSBpdHNlbGYsIG5vdCBjb3VudGluZyBhbnkgc3BhY2UgdGFrZW4gYnkgcmVmZXJlbmNlZCBjb250ZW50LiAqLworICAgIHB1YmxpYyBsb25nIHNpemVPbkhlYXAoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbnRlbnRDb3VudCAqIE1lbW9yeUxheW91dFNwZWNpZmljYXRpb24uU1BFQy5nZXRSZWZlcmVuY2VTaXplKCkgKworICAgICAgICAgICAgICAgUkVGRVJFTkNFX0FSUkFZX09OX0hFQVBfU0laRSAqIGdldENodW5rSWR4KGNvbnRlbnRDb3VudCwgQ09OVEVOVFNfU1RBUlRfU0hJRlQsIENPTlRFTlRTX1NUQVJUX1NJWkUpICsKKyAgICAgICAgICAgICAgIChidWZmZXJUeXBlID09IEJ1ZmZlclR5cGUuT05fSEVBUCA/IGFsbG9jYXRlZFBvcyArIEVNUFRZX1NJWkVfT05fSEVBUCA6IEVNUFRZX1NJWkVfT0ZGX0hFQVApICsKKyAgICAgICAgICAgICAgIFJFRkVSRU5DRV9BUlJBWV9PTl9IRUFQX1NJWkUgKiBnZXRDaHVua0lkeChhbGxvY2F0ZWRQb3MsIEJVRl9TVEFSVF9TSElGVCwgQlVGX1NUQVJUX1NJWkUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJdGVyYWJsZTxUPiB2YWx1ZXNVbm9yZGVyZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgpIC0+IG5ldyBJdGVyYXRvcjxUPigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpZHggPSAwOworCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaWR4IDwgY29udGVudENvdW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgVCBuZXh0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBnZXRDb250ZW50KGlkeCsrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHZhbHVlc0NvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb250ZW50Q291bnQ7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgdW51c2VkUmVzZXJ2ZWRNZW1vcnkoKQorICAgIHsKKyAgICAgICAgaW50IGJ1ZmZlck92ZXJoZWFkID0gMDsKKyAgICAgICAgaWYgKGJ1ZmZlclR5cGUgPT0gQnVmZmVyVHlwZS5PTl9IRUFQKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9zID0gdGhpcy5hbGxvY2F0ZWRQb3M7CisgICAgICAgICAgICBVbnNhZmVCdWZmZXIgYnVmZmVyID0gZ2V0Q2h1bmsocG9zKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWZmZXJPdmVyaGVhZCA9IGJ1ZmZlci5jYXBhY2l0eSgpIC0gaW5DaHVua1BvaW50ZXIocG9zKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBpbmRleCA9IGNvbnRlbnRDb3VudDsKKyAgICAgICAgaW50IGxlYWRCaXQgPSBnZXRDaHVua0lkeChpbmRleCwgQ09OVEVOVFNfU1RBUlRfU0hJRlQsIENPTlRFTlRTX1NUQVJUX1NJWkUpOworICAgICAgICBpbnQgb2ZzID0gaW5DaHVua1BvaW50ZXIoaW5kZXgsIGxlYWRCaXQsIENPTlRFTlRTX1NUQVJUX1NJWkUpOworICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxUPiBjb250ZW50QXJyYXkgPSBjb250ZW50QXJyYXlzW2xlYWRCaXRdOworICAgICAgICBpbnQgY29udGVudE92ZXJoZWFkID0gKChjb250ZW50QXJyYXkgIT0gbnVsbCA/IGNvbnRlbnRBcnJheS5sZW5ndGgoKSA6IDApIC0gb2ZzKSAqIE1lbW9yeUxheW91dFNwZWNpZmljYXRpb24uU1BFQy5nZXRSZWZlcmVuY2VTaXplKCk7CisKKyAgICAgICAgcmV0dXJuIGJ1ZmZlck92ZXJoZWFkICsgY29udGVudE92ZXJoZWFkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZCBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWMxNDA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kCkBAIC0wLDAgKzEsNzUzIEBACis8IS0tLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKyMgSW5NZW1vcnlUcmllIERlc2lnbgorCitUaGUgYEluTWVtb3J5VHJpZWAgaXMgb25lIG9mIHRoZSBtYWluIGNvbXBvbmVudHMgb2YgdGhlIHRyaWUgaW5mcmFzdHJ1Y3R1cmUsIGEgbXV0YWJsZSBpbi1tZW1vcnkgdHJpZSBidWlsdCBmb3IgZmFzdAorbW9kaWZpY2F0aW9uIGFuZCByZWFkcyBleGVjdXRpbmcgY29uY3VycmVudGx5IHdpdGggd3JpdGVzIGZyb20gYSBzaW5nbGUgbXV0YXRvciB0aHJlYWQuCisKK1RoZSBtYWluIGZlYXR1cmVzIG9mIGl0cyBpbXBsZW1lbnRhdGlvbiBhcmU6CistIGZ1bGwgc3VwcG9ydCBvZiB0aGUgYFRyaWVgIGludGVyZmFjZQorLSB1c2luZyBub2RlcyBvZiBzZXZlcmFsIGRpZmZlcmVudCB0eXBlcyBmb3IgZWZmaWNpZW5jeQorLSBzdXBwb3J0IGZvciBjb250ZW50IG9uIGFueSBub2RlLCBpbmNsdWRpbmcgaW50ZXJtZWRpYXRlIChwcmVmaXgpCistIHN1cHBvcnQgZm9yIHdyaXRlcyBmcm9tIGEgc2luZ2xlIG11dGF0b3IgdGhyZWFkIGNvbmN1cnJlbnQgd2l0aCBtdWx0aXBsZSByZWFkZXJzCistIG1heGltdW0gdHJpZSBzaXplIG9mIDJHQgorCisKKyMjIE1lbW9yeSBsYXlvdXQKKworT25lIG9mIHRoZSBtYWluIGRlc2lnbiBkcml2ZXJzIG9mIHRoZSBtZW10YWJsZSB0cmllIGlzIHRoZSBkZXNpcmUgdG8gYXZvaWQgb24taGVhcCBzdG9yYWdlIGFuZCBKYXZhIG9iamVjdCBtYW5hZ2VtZW50LgorVGhlIHRyaWUgdGh1cyBpbXBsZW1lbnRzIGl0cyBvd24gbWVtb3J5IG1hbmFnZW1lbnQgZm9yIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHRyaWUgKGNvbnRlbnQgaXMsIGF0IHRoaXMgdGltZSwgc3RpbGwgZ2l2ZW4KK2FzIEphdmEgb2JqZWN0cyBpbiBhIGNvbnRlbnQgYXJyYXkpLiBUaGUgc3RydWN0dXJlIHJlc2lkZXMgaW4gb25lIGBVbnNhZmVCdWZmZXJgICh3aGljaCBjYW4gYmUgb24gb3Igb2ZmIGhlYXAgYXMKK2Rlc2lyZWQpIGFuZCBpcyBicm9rZW4gdXAgaW4gMzItYnl0ZSAiY2VsbHMiIChhbHNvIGNhbGxlZCAiYmxvY2tzIiBpbiB0aGUgY29kZSksIHdoaWNoIGFyZSB0aGUgdW5pdCBvZiBhbGxvY2F0aW9uLAordXBkYXRlIGFuZCByZXVzZS4KKworTGlrZSBhbGwgdHJpZXMsIGBJbk1lbW9yeVRyaWVgIGlzIGJ1aWx0IGZyb20gbm9kZXMgYW5kIGhhcyBhIHJvb3QgcG9pbnRlci4gVGhlIG5vZGVzIHJlc2lkZSBpbiBjZWxscywgYnV0IHRoZXJlIGlzIG5vCisxOjEgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBub2RlcyBhbmQgY2VsbHMgLSBzb21lIG5vZGUgdHlwZXMgcGFjayBtdWx0aXBsZSBpbiBvbmUgY2VsbCwgd2hpbGUgb3RoZXIgdHlwZXMgcmVxdWlyZQorbXVsdGlwbGUgY2VsbHMuCisKKyMjIyBQb2ludGVycyBhbmQgbm9kZSB0eXBlcworCitBICJwb2ludGVyIiBpcyBhbiBpbnRlZ2VyIHRoYXQgcG9pbnRzIHRvIGEgbm9kZSBpbiB0aGUgdHJpZSBidWZmZXIuIEEgcG9pbnRlciBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBub2RlCisoaXRzIHN0YXJ0aW5nIGNlbGwpLCBidXQgYWxzbyBkZWZpbmVzIHRoZSB0eXBlIG9mIG5vZGUgaW4gaXRzIDUgbG93ZXN0LW9yZGVyIGJpdHMgKGkuZS4gdGhlIG9mZnNldCB3aXRoaW4gdGhlIGNlbGwpLgorSWYgYSBwb2ludGVyIGhhcyBhIG5lZ2F0aXZlIHZhbHVlLCBpdCByZWZlcnMgdG8gYSB2YWx1ZSBpbiB0aGUgY29udGVudCBhcnJheSwgYW5kIGltcGxpZXMgYSBsZWFmIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkCitjb250ZW50LiBBZGRpdGlvbmFsbHksIHRoZSBzcGVjaWFsIHBvaW50ZXIgdmFsdWUgYE5PTkVgICgwKSBpcyB1c2VkIHRvIHNwZWNpZnkgIm5vIGNoaWxkIi4gV2UgdXNlIDMyLWJpdCBpbnRlZ2VycyBhcworcG9pbnRlcnMsIHRoZXJlZm9yZSB0aGUgc2l6ZSBvZiB0aGUgdHJpZSBzdHJ1Y3R1cmUgaXMgbGltaXRlZCB0byBhIGxpdHRsZSBsZXNzIHRoYW4gMkdCLgorCitGb3IgZXhhbXBsZSwgdGhlIHBvaW50ZXIgYDB4MDEwOUVgIHNwZWNpZmllcyBhIG5vZGUgcmVzaWRpbmcgaW4gdGhlIGNlbGwgYXQgYnl0ZXMgYDB4MDEwODBgLWAweDAxMDlGYCBpbiB0aGUgYnVmZmVyCisoc3BlY2lmaWVkIGJ5IHRoZSBwb2ludGVycycgMjcgbGVhZGluZyBiaXRzKSwgd2hlcmUgdGhlIG5vZGUgdHlwZSBpcyBgU3BhcnNlYCAoc3BlY2lmaWVkIGJ5IGAweDFFYCBpbiB0aGUgbGFzdCA1IGJpdHMpLgorCitUaGUgcG9pbnRlciBgMHhGRkZGRkZGMGAgc3BlY2lmaWVzIGEgbGVhZiBub2RlIChiZWluZyBuZWdhdGl2ZSksIHdoZXJlIHRoZSBjb250ZW50J3MgaW5kZXggaXMgYDB4RmAgKG9idGFpbmVkIGJ5CituZWdhdGluZyBhbGwgYml0cyBvZiB0aGUgcG9pbnRlcikuCisKK1RvIHNhdmUgc3BhY2UgYW5kIHJlZHVjZSBwb2ludGVyIGNoYXNpbmcsIHdlIHVzZSBzZXZlcmFsIGRpZmZlcmVudCB0eXBlcyBvZiBub2RlcyB0aGF0IGFkZHJlc3MgZGlmZmVyZW50IGNvbW1vbiBwYXR0ZXJucworaW4gYSB0cmllLiBJdCBpcyBjb21tb24gZm9yIGEgdHJpZSB0byBoYXZlIG9uZSBvciBhIGNvdXBsZSBvZiB0b3AgbGV2ZWxzIHdoaWNoIGhhdmUgbWFueSBjaGlsZHJlbiwgYW5kIHdoZXJlIGl0IGlzCitpbXBvcnRhbnQgdG8gbWFrZSBkZWNpc2lvbnMgd2l0aCBhcyBmZXcgaWYtdGhlbi1lbHNlIGJyYW5jaGVzIGFzIHBvc3NpYmxlIChzZXJ2ZWQgYnkgdGhlIGBTcGxpdGAgdHlwZSksIGFub3RoZXIgb25lIG9yCit0d28gbGV2ZWxzIG9mIG5vZGVzIHdpdGggYSBzbWFsbCBudW1iZXIgb2YgY2hpbGRyZW4sIHdoZXJlIGl0IGlzIG1vc3QgaW1wb3J0YW50IHRvIHNhdmUgc3BhY2UgYXMgdGhlIG51bWJlciBvZiB0aGVzZQorbm9kZXMgaXMgaGlnaCAoc2VydmVkIGJ5IHRoZSBgU3BhcnNlYCB0eXBlKSwgYW5kIGEgbG90IG9mIHNlcXVlbmNlcyBvZiBzaW5nbGUtY2hpbGQgbm9kZXMgY29udGFpbmluZyB0aGUgdHJhaWxpbmcgYnl0ZXMKK29mIHRoZSBrZXkgb3Igb2Ygc29tZSBjb21tb24ga2V5IHByZWZpeCAoc2VydmVkIGJ5IHRoZSBgQ2hhaW5gIHR5cGUpLiBNb3N0IG9mIHRoZSBwYXlsb2FkL2NvbnRlbnQgb2YgdGhlIHRyaWUgcmVzaWRlcworYXQgdGhlIGxlYXZlcywgd2hlcmUgaXQgbWFrZXMgc2Vuc2UgdG8gYXZvaWQgdGFraW5nIGFueSBzcGFjZSBmb3IgYSBub2RlICh0aGUgYExlYWZgIHR5cGUpLCBidXQgd2UgbXVzdCBhbHNvIGFsbG93IHRoZQorcG9zc2liaWxpdHkgZm9yIHZhbHVlcyB0byBiZSBwcmVzZW50IGluIGludGVybWVkaWF0ZSBub2RlcyAmbWRhc2g7IGJlY2F1c2UgdGhpcyBpcyByYXJlLCB3ZSBzdXBwb3J0IGl0IHdpdGggYSBzcGVjaWFsCitgUHJlZml4YCB0eXBlIGluc3RlYWQgb2YgcmVzZXJ2aW5nIGEgc3BhY2UgZm9yIHBheWxvYWQgaW4gYWxsIG90aGVyIG5vZGUgdHlwZXMuCisKK1RoZSBTcGxpdC1TcGFyc2UtQ2hhaW4tTGVhZi9QcmVmaXggcGF0dGVybiBtYXkgcmVwZWF0IHNldmVyYWwgdGltZXMuIEZvciBleGFtcGxlLCB3ZSBjb3VsZCBoYXZlIHRoZXNlIGZvdXIgbGF5ZXJzIGZvcgordGhlIHBhcnRpdGlvbiBrZXkgd2l0aCBzb21lIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGFydGl0aW9uLCB0aGVuIGZvciB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSBjbHVzdGVyaW5nIGtleSwKK3RoZW4gZm9yIHRoZSBzZWNvbmQgY29tcG9uZW50IGV0Yy4KKworVGhlIHNlY3Rpb25zIGJlbG93IHNwZWNpZnkgdGhlIGxheW91dCBvZiBlYWNoIHN1cHBvcnRlZCBub2RlIHR5cGUuCisKKyMjIyMgTGVhZiBub2RlcworCitMZWFmIG5vZGVzIGRvIG5vdCBoYXZlIGEgY29ycmVzcG9uZGluZyBjZWxsIGluIHRoZSBidWZmZXIuIEluc3RlYWQsIHRoZXkgcmVmZXJlbmNlIGEgdmFsdWUgKGkuZS4gYSBQT0pPIGluIHRoZQorYEluTWVtb3J5VHJpZWAncyBjb250ZW50IHR5cGUpIGluIHRoZSBjb250ZW50IGFycmF5LiBUaGUgaW5kZXggb2YgdGhlIHZhbHVlIGlzIHNwZWNpZmllZCBieSBgfnBvaW50ZXJgICh1bmxpa2UgYC14YCwKK2B+eGAgYWxsb3dzIG9uZSB0byBhbHNvIGVuY29kZSAwIGluIGEgbmVnYXRpdmUgbnVtYmVyKS4KKworTGVhZiBub2RlcyBoYXZlIG5vIGNoaWxkcmVuLCBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgdmFsdWUgZm9yIGBjb250ZW50KClgLgorCitFeGFtcGxlOiAtMSBpcyBhIGxlYWYgY2VsbCB3aXRoIGNvbnRlbnQgYGNvbnRlbnRBcnJheVswXWAuCisKKyMjIyMgYENoYWluYCBub2RlcyAtIHNpbmdsZSBwYXRoLCBtdWx0aXBsZSB0cmFuc2l0aW9ucyBpbiBvbmUgY2VsbAorCitDaGFpbiBub2RlcyBhcmUgb25lLWNoaWxkIG5vZGVzLiBNdWx0aXBsZSBjaGFpbiBub2RlcywgZm9ybWluZyBhIGNoYWluIG9mIHRyYW5zaXRpb25zIHRvIG9uZSB0YXJnZXQsIGNhbiByZXNpZGUgaW4gYQorc2luZ2xlIGNlbGwuIENoYWluIG5vZGVzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBsb3dlc3QgNSBiaXRzIG9mIGEgcG9pbnRlciBiZWluZyBiZXR3ZWVuIGAweDAwYCBhbmQgYDB4MUJgLiBJbiBhZGRpdGlvbgordG8gdGhlIHR5cGUgb2Ygbm9kZSwgaW4gdGhpcyBjYXNlIHRoZSBiaXRzIGFsc28gZGVmaW5lIHRoZSBsZW5ndGggb2YgdGhlIGNoYWluICZtZGFzaDsgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorYDB4MUNgIGFuZCB0aGUgcG9pbnRlciBvZmZzZXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgY2hhaW4uCisKK1RoZSBzaW1wbGVzdCBjaGFpbiBub2RlIGhhcyBvbmUgdHJhbnNpdGlvbiBsZWFkaW5nIHRvIG9uZSBjaGlsZCBhbmQgaXMgbGFpZCBvdXQgbGlrZSB0aGlzOgorCitvZmZzZXR8Y29udGVudHxleGFtcGxlCistLS18LS0tfC0tLQorMDAgLSAxQXx1bnVzZWR8CisxQiAgICAgfGNoYXJhY3Rlcnw0MSBBCisxQyAtIDFGfGNoaWxkIHBvaW50ZXJ8RkZGRkZGRkYKKword2hlcmUgdGhlIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBgMUJgIGxpbmUgaW4gdGhlIGNlbGwuCisKK0V4YW1wbGU6IFRoZSBjZWxsIGB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHh4eCB4eHh4eHg0MSBGRkZGRkZGRmAgYXQgYnl0ZXMgYDB4MTIwYC1gMHgxM0ZgIGFuZAorcG9pbnRlciBgMHgxM0JgIHBvaW50IHRvIGEgbm9kZSB3aXRoIG9uZSBjaGlsZCB3aXRoIHRyYW5zaXRpb24gYDB4NDFgIGBBYCB0byBhIGxlYWYgbm9kZSB3aXRoIGNvbnRlbnQgYGNvbnRlbnRBcnJheVswXWAuCisKK0Fub3RoZXIgY2hhaW4gY2VsbCwgd2hpY2ggcG9pbnRzIHRvIHRoaXMgb25lLCBjYW4gYmUgYWRkZWQgaW4gdGhlIHNhbWUgY2VsbCBieSBwbGFjaW5nIGEgY2hhcmFjdGVyIGF0IG9mZnNldCBgMUFgLiBUaGlzCituZXcgbm9kZSBpcyBlZmZlY3RpdmVseSBsYWlkIG91dCBhcworCitvZmZzZXR8Y29udGVudHxleGFtcGxlCistLS18LS0tfC0tLQorMDAgLSAxOXx1bnVzZWR8CisxQSAgICAgfGNoYXJhY3Rlcnw0OCBICisxQiAtIDFGfHVudXNlZHwKKword2hlcmUgdGhlIHBvaW50ZXIgcG9pbnRzIHRvIGxpbmUgYDFBYC4gVGhpcyBub2RlIGhhcyBvbmUgdHJhbnNpdGlvbiwgYW5kIHRoZSBjaGlsZCBwb2ludGVyIGlzIGltcGxpY2l0IGFzIHRoZSBub2RlJ3MKK3BvaW50ZXIgcGx1cyBvbmUuCisKK1RoaXMgY2FuIGNvbnRpbnVlIHVudGlsIGFsbCB0aGUgYnl0ZXMgaW4gdGhlICJ1bnVzZWQiIGFyZWEgYXJlIGZpbGxlZC4KKworRXhhbXBsZTogVGhlIGNlbGwgYHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4eHh4eHh4IHh4NDM0ODQxIEZGRkZGRkZGYCBhdCBieXRlcyBgMHgxMjBgLWAweDEzRmAgYW5kCitwb2ludGVyIGAweDEzOWAgcG9pbnQgdG8gYSBub2RlIHdpdGggb25lIGNoaWxkIHdpdGggdHJhbnNpdGlvbiBgMHg0M2AgYENgIHRvIGEgbm9kZSB3aXRoIG9uZSBjaGlsZCB3aXRoIHRyYW5zaXRpb24KK2AweDQ4YCBgSGAgdG8gYSBub2RlIHdpdGggb25lIGNoaWxkIHdpdGggdHJhbnNpdGlvbiBgMHg0MWAgYEFgIHRvIGEgbGVhZiBub2RlIHdpdGggY29udGVudCBgY29udGVudEFycmF5WzBdYC4KKworb2Zmc2V0fGNvbnRlbnR8ZXhhbXBsZQorLS0tfC0tLXwtLS0KKzAwIC0gMTh8dW51c2VkfAorMTkgICAgIHxjaGFyYWN0ZXJ8NDMgQworMUEgICAgIHxjaGFyYWN0ZXJ8NDggSAorMUIgICAgIHxjaGFyYWN0ZXJ8NDEgQQorMUMgLSAxRnxjaGlsZCBwb2ludGVyfEZGRkZGRkZGCisKKworSW4gdGhpcyBleGFtcGxlIGAweDEzQWAgYW5kIGAweDEzQmAgYXJlIGFsc28gdmFsaWQgcG9pbnRlcnMgdG8gdGhlIHJlc3BlY3RpdmUgY2hhaW5zIGFuZCBjb3VsZCBiZSByZWZlcmVuY2VkIGZyb20gb3RoZXIKK25vZGVzIChhbiBleGFtcGxlIHdpbGwgYmUgZ2l2ZW4gYmVsb3cpLiBJbiBhbnkgY2FzZSwgdGhlIGJ5dGUgcG9pbnRlZCBkaXJlY3RseSBieSB0aGUgbm9kZSBwb2ludGVyIGNvbnRhaW5zIHRoZQordHJhbnNpdGlvbiBieXRlLiBUaGUgY2hpbGQgcG9pbnRlciBpcyBlaXRoZXIgYHBvaW50ZXIgKyAxYCAoaWYgdGhlIGxvd2VzdCA1IHBvaW50ZXIgYml0cyBhcmUgbGVzcyB0aGFuIGAweDFCYCksIG9yIHRoZQoraW50ZWdlciBzdG9yZWQgYXQgYHBvaW50ZXIgKyAxYCAoaWYgdGhlIHBvaW50ZXIncyBsYXN0IDUgYml0cyBhcmUgYDB4MUJgKS4KKworIVtncmFwaF0oSW5NZW1vcnlUcmllLm1kLmcxLnN2ZykKKworTm90ZTogb2Zmc2V0IGAweDAwYCBhbHNvIHNwZWNpZmllcyBhIGNoYWluIG5vZGUsIGJ1dCB0aGUgcG9pbnRlciAwIGlzIGEgc3BlY2lhbCBjYXNlIGFuZCBjYXJlIG11c3QgYmUgdGFrZW4gdG8gZW5zdXJlIG5vCisyOC1ieXRlIGNoYWluIG5vZGUgaXMgcGxhY2VkIGluIHRoZSBjZWxsIGF0IGJ5dGVzIGAweDAwYC1gMHgxRmAuCisKKyMjIyMgYFNwYXJzZWAgbm9kZXMgLSBiZXR3ZWVuIDIgYW5kIDYgY2hpbGRyZW4gaW4gb25lIGNlbGwKKworU3BhcnNlIG5vZGVzIGFyZSB1c2VkIHdoZW4gYSBub2RlIGhhcyBhdCBsZWFzdCB0d28gY2hpbGRyZW4sIGFuZCBhbGwgcG9pbnRlcnMgYW5kIHRyYW5zaXRpb24gY2hhcmFjdGVycyBjYW4gZml0IGluIG9uZQorY2VsbCwgd2hpY2ggbGltaXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGlsZHJlbiB0byA2LiBUaGVpciBsYXlvdXQgaXM6CisKK29mZnNldHxjb250ZW50fAorLS0tfC0tLXwKKzAwIC0gMDN8Y2hpbGQgcG9pbnRlciAwfAorMDQgLSAwN3xjaGlsZCBwb2ludGVyIDF8CiswOCAtIDBCfGNoaWxkIHBvaW50ZXIgMnwKKzBDIC0gMEZ8Y2hpbGQgcG9pbnRlciAzfAorMTAgLSAxM3xjaGlsZCBwb2ludGVyIDR8CisxNCAtIDE3fGNoaWxkIHBvaW50ZXIgNXwKKzE4ICAgICB8Y2hhcmFjdGVyIDB8CisxOSAgICAgfGNoYXJhY3RlciAxfAorMUEgICAgIHxjaGFyYWN0ZXIgMnwKKzFCICAgICB8Y2hhcmFjdGVyIDN8CisxQyAgICAgfGNoYXJhY3RlciA0fAorMUQgICAgIHxjaGFyYWN0ZXIgNXwKKzFFIC0gMUZ8b3JkZXIgd29yZHwKKword2hlcmUgdGhlIHBvaW50ZXIgcG9pbnRzIHRvIHRoZSBsaW5lIGAxRWAgKGkuZS4gdGhlIHR5cGUgaWRlbnRpZmllciBmb3IgYSBzcGFyc2Ugbm9kZSBpcyBgMHgxRWApLgorCitJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBwb2ludGVycyBhbmQgY2hhcmFjdGVycyBhcmUgbm90IGluIG9yZGVyLiBUaGlzIGlzIGRvbmUgc28gdGhhdCBhbiB1cGRhdGUgdG8gYSBzcGFyc2UKK25vZGUgd2hlcmUgYSBuZXcgY2hpbGQgaXMgaW5zZXJ0ZWQgY2FuIGJlIGRvbmUgd2hpbGUgdGhlIHByZXZpb3VzIHN0YXRlIG9mIHRoZSBub2RlIGlzIHN0aWxsIHZhbGlkIGFuZCByZWFkYWJsZSBmb3IKK2FueSBjb25jdXJyZW50IHJlYWRlcnMuIEluc3RlYWQsIG5ldyBjaGlsZHJlbiBhcmUgYXBwZW5kZWQsIGFuZCB0aGUgb3JkZXIgaXMgbWFpbnRhaW5lZCBpbiB0aGUgIm9yZGVyIHdvcmQiLiBUaGlzIHdvcmQKK2lzIGEgbnVtYmVyIHdob3NlIGRpZ2l0cyBzcGVjaWZ5IHRoZSBvcmRlciBvZiB0aGUgY2hpbGRyZW4ncyB0cmFuc2l0aW9uIGNoYXJhY3RlcnMgKHdoZXJlIGhpZ2hlci1vcmRlciBkaWdpdHMgc3BlY2lmeQorYmlnZ2VyIGNoYXJhY3RlcnMpIGVuY29kZWQsIHRvIGJlIGFibGUgdG8gZml0IGludG8gYSAxNi1iaXQgd29yZCwgaW4gYmFzZSA2LiBJdHMgbnVtYmVyIG9mIGRpZ2l0cyBhbHNvIHNwZWNpZmllcyB0aGUKK251bWJlciBvZiBjaGlsZHJlbiBvZiB0aGUgbm9kZS4KKworVG8gZXhwbGFpbiB0aGlzIGJldHRlciwgd2Ugd2lsbCBnaXZlIGFuIGV4YW1wbGUgb2YgdGhlIGV2b2x1dGlvbiBvZiBhIHNwYXJzZSBub2RlLiBTdXBwb3NlIHdlIGhhZCB0aGUgYDB4MTM5YCBub2RlIGZyb20KK3RoZSBwcmV2aW91cyBzZWN0aW9uLCBhbmQgc29tZSB1cGRhdGUgbmVlZHMgdG8gYXR0YWNoIGEgc2Vjb25kIGNoaWxkIHRvIHRoYXQsIGUuZy4gd2l0aCB0aGUgY2hhcmFjdGVyIGBBYCBhbmQgY2hpbGQKK2AweDIzOGAuCisKKyFbZ3JhcGhdKEluTWVtb3J5VHJpZS5tZC5nMi5zdmcpCisKK1RvIGRvIHRoaXMsIHRoZSBtdXRhdGluZyB0aHJlYWQgd2lsbCBoYXZlIHRvIGNvbnZlcnQgdGhlIGNoYWluIG5vZGUgaW50byBhIHNwYXJzZSBieSBhbGxvY2F0aW5nIGEgbmV3IGNlbGwKKyhlLmcuIGAweDI0MGAtYDB4MjVGYCkgYW5kIGZpbGxpbmcgaW4gdGhlIHNwYXJzZSBub2RlIGAwMDAwMDIzOCAwMDAwMDEzQSAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCA0MTQzMDAwMAorMDAwMDAwMDZgIHdpdGggcG9pbnRlciBgMHgyNUVgOgorCitvZmZzZXR8Y29udGVudHxleGFtcGxlCistLS18LS0tfC0tLQorMDAgLSAwM3xjaGlsZCBwb2ludGVyIDB8IDAwMDAwMjM4CiswNCAtIDA3fGNoaWxkIHBvaW50ZXIgMXwgMDAwMDAxM0EKKzA4IC0gMTd8dW51c2VkfAorMTggICAgIHxjaGFyYWN0ZXIgMHwgNDEgQQorMTkgICAgIHxjaGFyYWN0ZXIgMXwgNDMgQworMUEgLSAxRHx1bnVzZWR8CisxRSAtIDFGfG9yZGVyIHdvcmQsIGFsd2F5cyAxMHwgMDAwNiA9IDEwIChiYXNlIDYpCisKK1RoaXMgaXMgdGhlIHNtYWxsZXN0IGtpbmQgb2Ygc3BhcnNlIG5vZGUsIHdpdGgganVzdCB0d28gY2hpbGRyZW4uIFR3by1jaGlsZHJlbiBzcGFyc2Ugbm9kZXMgYWx3YXlzCitwdXQgdGhlaXIgdHdvIGNoaWxkcmVuIGluIG9yZGVyICh3ZSBjYW4gZG8gdGhpcyBhcyB0aGlzIGRvZXMgbm90IGhhcHBlbiBpbiByZXNwb25zZSB0byBhbiBhZGRpdGlvbiBvZiBhIG5ldyBjaGlsZCB0bworYW4gZXhpc3Rpbmcgc3BhcnNlIG5vZGUsIGJ1dCB0aGlzIGlzIGNvbnN0cnVjdGVkIGRpcmVjdGx5KSBhbmQgdGh1cyB0aGVpciBvcmRlciB3b3JkIGlzIGFsd2F5cyAxMCAoaWYgdGhleSB3ZXJlCitub3QgaW4gb3JkZXIsIHRoZSBvcmRlciB3b3JkIHdvdWxkIGhhdmUgdG8gYmUgMDEsIHdoaWNoIHdvdWxkIGJlIG1pc2ludGVycHJldGVkIGFzIHRoZSBzaW5nbGUtZGlnaXQgMSkuCisKK1RoaXMgbm9kZSBoYXMgdHdvICh0aGUgbnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgb3JkZXIgd29yZCkgY2hpbGRyZW4uIFRoZSBmaXJzdCBjaGlsZCBpcyBhdCB0aGUgcG9zaXRpb24gc3BlY2lmaWVkIGJ5IHRoZQorbGVhc3Qgc2lnbmlmaWNhbnQgZGlnaXQgb2YgdGhlIG9yZGVyIHdvcmQsIDAuIFRoZSBzZWNvbmQgY2hpbGQgaXMgc3BlY2lmaWVkIGJ5IHRoZSBzZWNvbmQgbGVhc3Qgc2lnbmlmaWNhbnQgZGlnaXQsIDEuCisKK1N1cHBvc2Ugd2UgdGhlbiBuZWVkIHRvIGFkZCBhIG5ldyBjaGlsZCwgdXNpbmcgY2hhcmFjdGVyIGAweDM1YCBgNWAgYW5kIGNoaWxkIGAweDMzQmAuIFRoZSBub2RlIHdpbGwgY2hhbmdlIHRvIGAwMDAwMDIzOAorMDAwMDAxM0EgMDAwMDAzM0IgMDAwMDAwMDAgMDAwMDAwMDAgMDAwMDAwMDAgNDE0MzM1MDAgMDAwMDAwMjZgIGFuZCB0aGUgcG9pbnRlciB0byBpdCBzdGF5cyB0aGUgc2FtZS4KKworb2Zmc2V0fGNvbnRlbnR8ZXhhbXBsZQorLS0tfC0tLXwtLS0KKzAwIC0gMDN8Y2hpbGQgcG9pbnRlciAwfCAwMDAwMDIzOAorMDQgLSAwN3xjaGlsZCBwb2ludGVyIDF8IDAwMDAwMTNBCiswOCAtIDBCfGNoaWxkIHBvaW50ZXIgMnwgMDAwMDAzM0IKKzBDIC0gMTd8dW51c2VkfAorMTggICAgIHxjaGFyYWN0ZXIgMHwgNDEgQQorMTkgICAgIHxjaGFyYWN0ZXIgMXwgNDMgQworMUEgICAgIHxjaGFyYWN0ZXIgMnwgMzUgNQorMUIgLSAxRHx1bnVzZWR8CisxRSAtIDFGfG9yZGVyIHdvcmR8IDAwMjYgPSAxMDIgKGJhc2UgNikKKworVGhpcyBub2RlIGhhcyB0aHJlZSAodGhlIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIG9yZGVyIHdvcmQpIGNoaWxkcmVuLiBUaGUgZmlyc3QgY2hpbGQgaXMgYXQgdGhlIHBvc2l0aW9uIHNwZWNpZmllZCBieQordGhlIGxlYXN0IHNpZ25pZmljYW50IGRpZ2l0IG9mIHRoZSBvcmRlciB3b3JkLCAyLiBUaGUgc2Vjb25kIGNoaWxkIGlzIHNwZWNpZmllZCBieSB0aGUgc2Vjb25kIGxlYXN0IHNpZ25pZmljYW50IGRpZ2l0LAorMCwgYW5kIHRoZSBsYXN0IGNoaWxkIGlzIHNwZWNpZmllZCBieSB0aGUgbGVhZGluZyBkaWdpdCwgMS4KKworTm90ZSB0aGF0IGJlY2F1c2Ugb2YgdGhlIG9yZGVyaW5nIG9mIHRoZSB0d28gY2hpbGRyZW4gaW4gdGhlIHNtYWxsZXN0IHNwYXJzZSBub2RlLCB0aGUgZGlnaXQgMCBpcyBhbHdheXMgcHJlY2VkZWQgYnkgYQorbW9yZS1zaWduaWZpY2FudCAxIGluIHRoZSBvcmRlciB3b3JkIGluIGJhc2UgNi4gVGhlcmVmb3JlIHRoZSBsZWFkaW5nIGRpZ2l0IG9mIHRoZSBvcmRlciB3b3JkIGNhbiBuZXZlciBiZSAwIGFuZCB0aHVzIHdlCitjYW5ub3QgbWlzY291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbi4KKworVGhlIGFkZGl0aW9uIG9mIGNoaWxkcmVuIGNhbiBjb250aW51ZSB1bnRpbCB3ZSBoYXZlIDYsIGZvciBleGFtcGxlIGAwMDAwMDIzOCAwMDAwMDEzQSAwMDAwMDMzQiAwMDAwMDM1QyAwMDAwMDM3QQorMDAwMDA0MUIgNDE0MzM1NDIgNTAzMzgxMjlgIChwb2ludGVyIGAweDI1RWApIGZvcgorCitvZmZzZXR8Y29udGVudHxleGFtcGxlCistLS18LS0tfC0tLQorMDAgLSAwM3xjaGlsZCBwb2ludGVyIDB8IDAwMDAwMjM4CiswNCAtIDA3fGNoaWxkIHBvaW50ZXIgMXwgMDAwMDAxM0EKKzA4IC0gMEJ8Y2hpbGQgcG9pbnRlciAyfCAwMDAwMDMzQgorMEMgLSAwRnxjaGlsZCBwb2ludGVyIDN8IDAwMDAwMzVDCisxMCAtIDEzfGNoaWxkIHBvaW50ZXIgNHwgMDAwMDAzN0EKKzE0IC0gMTd8Y2hpbGQgcG9pbnRlciA1fCAwMDAwMDQxQgorMTggICAgIHxjaGFyYWN0ZXIgMHwgNDEgQQorMTkgICAgIHxjaGFyYWN0ZXIgMXwgNDMgQworMUEgICAgIHxjaGFyYWN0ZXIgMnwgMzUgNQorMUIgICAgIHxjaGFyYWN0ZXIgM3wgNDIgQgorMUMgICAgIHxjaGFyYWN0ZXIgNHwgNTAgUAorMUQgICAgIHxjaGFyYWN0ZXIgNXwgMzMgMworMUUgLSAxRnxvcmRlciB3b3JkfCA4MTI5ID0gNDEzMDI1IChiYXNlIDYpCisKK0JleW9uZCA2IGNoaWxkcmVuLCBhIG5vZGUgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIHNwbGl0LgorCisjIyMjIGBTcGxpdGAgbm9kZXMgLSB1cCB0byAyNTYgY2hpbGRyZW4gaW4gbXVsdGlwbGUgY2VsbHMKKworU3BsaXQgbm9kZXMgYXJlIHVzZWQgdG8gaGFuZGxlIHRoZSBub2RlcyB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIGNoaWxkcmVuLiBXZSBjYW4gb25seSBhbGxvY2F0ZSBjZWxscyBvZiAzMiBieXRlcywgdGh1cword2UgaGF2ZSB0byBkaXN0cmlidXRlIHRoZSBjaGlsZCB0cmFuc2l0aW9ucyBhbW9uZyBjZWxscyBpbiBzb21lIHdheSB0aGF0IGlzIGVmZmljaWVudCBmb3IgcmVhZGluZyBhbmQgdXBkYXRpbmcuIFRoZQorbWV0aG9kIHdlIGNob3NlIGlzIHRvIGNvbnN0cnVjdCBhICJtaW5pLXRyaWUiIHdpdGggMi0zLTMgYml0IHRyYW5zaXRpb25zLgorCitBIHNwbGl0IG5vZGUgaXMgaWRlbnRpZmllZCBieSB0aGUgYDB4MUNgIG9mZnNldC4gVGhlIHN0YXJ0aW5nIGNlbGwgb2YgYSBzcGxpdCBub2RlIGhhcyB0aGlzIGxheW91dDoKKworb2Zmc2V0fGNvbnRlbnR8CistLS18LS0tfAorMDAgLSAwRnx1bnVzZWR8CisxMCAtIDEzfG1pZC1jZWxsIGZvciBsZWFkaW5nIDAwfAorMTQgLSAxN3xtaWQtY2VsbCBmb3IgbGVhZGluZyAwMXwKKzE4IC0gMUJ8bWlkLWNlbGwgZm9yIGxlYWRpbmcgMTB8CisxQyAtIDFGfG1pZC1jZWxsIGZvciBsZWFkaW5nIDExfAorCisocG9pbnRlcnMgdG8gdGhpcyBub2RlIHBvaW50IHRvIHRoZSBgMUNgIGxpbmUpIGFuZCB3aGVyZSBlYWNoIG1pZC1jZWxsIGNvbnRhaW5zOgorCitvZmZzZXR8Y29udGVudHwKKy0tLXwtLS18CiswMCAtIDAzfGVuZC1jZWxsIGZvciBtaWRkbGUgMDAwfAorMDQgLSAwN3xlbmQtY2VsbCBmb3IgbWlkZGxlIDAwMXwKKzA4IC0gMEJ8ZW5kLWNlbGwgZm9yIG1pZGRsZSAwMTB8CiswQyAtIDBGfGVuZC1jZWxsIGZvciBtaWRkbGUgMDExfAorMTAgLSAxM3xlbmQtY2VsbCBmb3IgbWlkZGxlIDEwMHwKKzE0IC0gMTd8ZW5kLWNlbGwgZm9yIG1pZGRsZSAxMDF8CisxOCAtIDFCfGVuZC1jZWxsIGZvciBtaWRkbGUgMTEwfAorMUMgLSAxRnxlbmQtY2VsbCBmb3IgbWlkZGxlIDExMXwKKworYW5kIGVuZC1jZWxsOgorCitvZmZzZXR8Y29udGVudHwKKy0tLXwtLS18CiswMCAtIDAzfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAwMDB8CiswNCAtIDA3fHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAwMDF8CiswOCAtIDBCfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAwMTB8CiswQyAtIDBGfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAwMTF8CisxMCAtIDEzfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAxMDB8CisxNCAtIDE3fHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAxMDF8CisxOCAtIDFCfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAxMTB8CisxQyAtIDFGfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAxMTF8CisKK0luIGFueSBvZiB0aGUgY2VsbCBvciBwb2ludGVyIHBvc2l0aW9ucyB3ZSBjYW4gaGF2ZSBgTk9ORWAsIG1lYW5pbmcgdGhhdCBzdWNoIGEgY2hpbGQgKG9yIGJsb2NrIG9mIGNoaWxkcmVuKSBkb2VzIG5vdAorZXhpc3QuIEF0IG1pbmltdW0sIGEgc3BsaXQgbm9kZSBvY2N1cGllcyAzIGNlbGxzIChvbmUgbGVhZGluZywgb25lIG1pZCBhbmQgb25lIGVuZCksIGFuZCBhdCBtYXhpbXVtICZtZGFzaDsKK2AxICsgNCArIDQqOCA9IDM3YCBjZWxscyBpLmUuIGAxMTg0YCBieXRlcy4gSWYgd2UgY291bGQgYWxsb2NhdGUgY29udGlndW91cyBhcnJheXMsIGEgZnVsbCBzcGxpdCBub2RlIHdvdWxkIHVzZSBgMTAyNGAKK2J5dGVzLCB0aHVzIHRoaXMgc3BsaXR0aW5nIGNhbiBhZGQgfjE1JSBvdmVyaGVhZC4gSG93ZXZlciwgcmVhbCBkYXRhIG9mdGVuIGhhcyBhZGRpdGlvbmFsIHN0cnVjdHVyZSB0aGF0IHRoaXMgY2FuIG1ha2UKK3VzZSBvZiB0byBhdm9pZCBjcmVhdGluZyBzb21lIG9mIHRoZSBibG9ja3MsIGUuZy4gaWYgdGhlIHRyaWUgZW5jb2RlcyBVUy1BU0NJSSBvciBVVEYtZW5jb2RlZCBzdHJpbmdzIHdoZXJlIHNvbWUKK2NoYXJhY3RlciByYW5nZXMgYXJlIG5vdCBhbGxvd2VkIGF0IGFsbCwgYW5kIG90aGVycyBhcmUgcHJldmFsZW50LiBBbm90aGVyIGJlbmVmaXQgaXMgdGhhdCB0byBjaGFuZ2UgYSB0cmFuc2l0aW9uIHdoaWxlCitwcmVzZXJ2aW5nIHRoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgbm9kZSBmb3IgY29uY3VycmVudCByZWFkZXJzIHdlIGhhdmUgdG8gb25seSBjb3B5IHRocmVlIGJsb2NrcyBhbmQgbm90IHRoZSBlbnRpcmUKK3JhbmdlIG9mIGNoaWxkcmVuIChhcHBsaWNhdGlvbnMgb2YgdGhpcyB3aWxsIGJlIGdpdmVuIGxhdGVyKS4KKworQXMgYW4gZXhhbXBsZSwgc3VwcG9zZSB3ZSBuZWVkIHRvIGFkZCBhIGAweDUxYCBgUWAgdHJhbnNpdGlvbiB0byBgMHg0NTVgIHRvIHRoZSA2LWNoaWxkcmVuIHNwYXJzZSBub2RlIGZyb20gdGhlIHByZXZpb3VzCitzZWN0aW9uLiBUaGlzIHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisKK0xlYWRpbmcgY2VsbCAoZS5nLiBgMHg1MDBgLWAweDUxRmAgd2l0aCBwb2ludGVyIGAweDUxQ2ApCisKK29mZnNldHxjb250ZW50fGV4YW1wbGUKKy0tLXwtLS18LS0tCiswMCAtIDBGfHVudXNlZHwKKzEwIC0gMTN8bWlkLWNlbGwgZm9yIGxlYWRpbmcgMDB8MDAwMDA1M0MKKzE0IC0gMTd8bWlkLWNlbGwgZm9yIGxlYWRpbmcgMDF8MDAwMDA1N0MKKzE4IC0gMUJ8bWlkLWNlbGwgZm9yIGxlYWRpbmcgMTB8MDAwMDAwMDAgTk9ORQorMUMgLSAxRnxtaWQtY2VsbCBmb3IgbGVhZGluZyAxMXwwMDAwMDAwMCBOT05FCisKK01pZCBjZWxsIGAwMGAgYXQgYDB4NTIwYC1gMHg1M0ZgOgorCitvZmZzZXR8Y29udGVudHxleGFtcGxlCistLS18LS0tfC0tLQorMDAgLSAwM3xlbmQtY2VsbCBmb3IgbWlkZGxlIDAwMHwwMDAwMDAwMCBOT05FCiswNCAtIDA3fGVuZC1jZWxsIGZvciBtaWRkbGUgMDAxfDAwMDAwMDAwIE5PTkUKKzA4IC0gMEJ8ZW5kLWNlbGwgZm9yIG1pZGRsZSAwMTB8MDAwMDAwMDAgTk9ORQorMEMgLSAwRnxlbmQtY2VsbCBmb3IgbWlkZGxlIDAxMXwwMDAwMDAwMCBOT05FCisxMCAtIDEzfGVuZC1jZWxsIGZvciBtaWRkbGUgMTAwfDAwMDAwMDAwIE5PTkUKKzE0IC0gMTd8ZW5kLWNlbGwgZm9yIG1pZGRsZSAxMDF8MDAwMDAwMDAgTk9ORQorMTggLSAxQnxlbmQtY2VsbCBmb3IgbWlkZGxlIDExMHwwMDAwMDU1QworMUMgLSAxRnxlbmQtY2VsbCBmb3IgbWlkZGxlIDExMXwwMDAwMDAwMCBOT05FCisKK0VuZCBjZWxsIGAwMCAxMTBgIGF0IGAweDU0MGAtYDB4NTVGYDoKKworb2Zmc2V0fGNvbnRlbnR8ZXhhbXBsZQorLS0tfC0tLXwtLS0KKzAwIC0gMDN8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDAwMHwwMDAwMDAwMCBOT05FCiswNCAtIDA3fHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAwMDF8MDAwMDAwMDAgTk9ORQorMDggLSAwQnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDEwfDAwMDAwMDAwIE5PTkUKKzBDIC0gMEZ8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDAxMXwwMDAwMDQxQgorMTAgLSAxM3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTAwfDAwMDAwMDAwIE5PTkUKKzE0IC0gMTd8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDEwMXwwMDAwMDMzQgorMTggLSAxQnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTEwfDAwMDAwMDAwIE5PTkUKKzFDIC0gMUZ8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDExMXwwMDAwMDAwMCBOT05FCisKK01pZCBjZWxsIGAwMWAgYXQgYDB4NTYwYC1gMHg1N0ZgOgorCitvZmZzZXR8Y29udGVudHxleGFtcGxlCistLS18LS0tfC0tLQorMDAgLSAwM3xlbmQtY2VsbCBmb3IgbWlkZGxlIDAwMHwwMDAwMDU5QworMDQgLSAwN3xlbmQtY2VsbCBmb3IgbWlkZGxlIDAwMXwwMDAwMDAwMCBOT05FCiswOCAtIDBCfGVuZC1jZWxsIGZvciBtaWRkbGUgMDEwfDAwMDAwNUJDCiswQyAtIDBGfGVuZC1jZWxsIGZvciBtaWRkbGUgMDExfDAwMDAwMDAwIE5PTkUKKzEwIC0gMTN8ZW5kLWNlbGwgZm9yIG1pZGRsZSAxMDB8MDAwMDAwMDAgTk9ORQorMTQgLSAxN3xlbmQtY2VsbCBmb3IgbWlkZGxlIDEwMXwwMDAwMDAwMCBOT05FCisxOCAtIDFCfGVuZC1jZWxsIGZvciBtaWRkbGUgMTEwfDAwMDAwMDAwIE5PTkUKKzFDIC0gMUZ8ZW5kLWNlbGwgZm9yIG1pZGRsZSAxMTF8MDAwMDAwMDAgTk9ORQorCitFbmQgY2VsbCBgMDEgMDAwYCBhdCBgMHg1ODBgLWAweDU5RmA6CisKK29mZnNldHxjb250ZW50fGV4YW1wbGUKKy0tLXwtLS18LS0tCiswMCAtIDAzfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAwMDB8MDAwMDAwMDAgTk9ORQorMDQgLSAwN3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDAxfDAwMDAwMjM4CiswOCAtIDBCfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAwMTB8MDAwMDAzNUMKKzBDIC0gMEZ8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDAxMXwwMDAwMDEzQQorMTAgLSAxM3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTAwfDAwMDAwMDAwIE5PTkUKKzE0IC0gMTd8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDEwMXwwMDAwMDAwMCBOT05FCisxOCAtIDFCfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAxMTB8MDAwMDAwMDAgTk9ORQorMUMgLSAxRnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTExfDAwMDAwMDAwIE5PTkUKKworRW5kIGNlbGwgYDAxIDAxMGAgYXQgYDB4NUEwYC1gMHg1QkZgOgorCitvZmZzZXR8Y29udGVudHxleGFtcGxlCistLS18LS0tfC0tLQorMDAgLSAwM3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDAwfDAwMDAwMzdBCiswNCAtIDA3fHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAwMDF8MDAwMDA0NTUKKzA4IC0gMEJ8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDAxMHwwMDAwMDAwMCBOT05FCiswQyAtIDBGfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAwMTF8MDAwMDAwMDAgTk9ORQorMTAgLSAxM3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTAwfDAwMDAwMDAwIE5PTkUKKzE0IC0gMTd8cG9pbnRlciB0byBjaGlsZCBmb3IgZW5kaW5nIDEwMXwwMDAwMDAwMCBOT05FCisxOCAtIDFCfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAxMTB8MDAwMDAwMDAgTk9ORQorMUMgLSAxRnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTExfDAwMDAwMDAwIE5PTkUKKworVG8gZmluZCBhIGNoaWxkIGluIHRoaXMgc3RydWN0dXJlLCB3ZSBmb2xsb3cgdGhlIHRyYW5zaXRpb25zIGFsb25nIHRoZSBiaXRzIG9mIHRoZSBtaW5pLXRyaWUuIEZvciBleGFtcGxlLCBmb3IgYDB4NDJgCitgQmAgPSBgMGIwMTAwMDAxMGAgd2Ugc3RhcnQgYXQgYDB4NTFDYCwgdGFrZSB0aGUgYDAxYCBwb2ludGVyIHRvIGAweDU3Q2AsIHRoZW4gdGhlIGAwMDBgIHBvaW50ZXIgdG8gYDB4NTlDYCBhbmQgZmluYWxseQordGhlIGAwMTBgIGluZGV4IHRvIHJldHJpZXZlIHRoZSBub2RlIHBvaW50ZXIgYDB4MzVDYC4gTm90ZSB0aGF0IHRoZSBpbnRlcm1lZGlhdGUgY2VsbHMgKGRhc2hlZCBpbiB0aGUgZGlhZ3JhbSkgYXJlIG5vdAorcmVhY2hhYmxlIHdpdGggcG9pbnRlcnMsIHRoZXkgb25seSBtYWtlIHNlbnNlIGFzIHN1YnN0cnVjdHVyZSBvZiB0aGUgc3BsaXQgbm9kZS4KKworIVtncmFwaF0oSW5NZW1vcnlUcmllLm1kLmczLnN2ZykKKworIyMjIyBDb250ZW50IGBQcmVmaXhgCisKK1ByZWZpeCBub2RlcyBhcmUgbm90IG5vZGVzIGluIHRoZW1zZWx2ZXMsIGJ1dCB0aGV5IGFkZCBpbmZvcm1hdGlvbiB0byB0aGUgbm9kZSB0aGV5IGxlYWQgdG8uIFNwZWNpZmljYWxseSwgdGhleQorZW5jb2RlIGFuIGluZGV4IGluIHRoZSBjb250ZW50IGFycmF5LCBhbmQgYSBwb2ludGVyIHRvIHRoZSBub2RlIHRvIHdoaWNoIHRoaXMgY29udGVudCBpcyBhdHRhY2hlZC4gSW4gYW55dGhpbmcgb3RoZXIKK3RoYW4gdGhlIGNvbnRlbnQsIHRoZXkgYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGxpbmtlZCBub2RlICZtZGFzaDsgaS5lLiBhIHByZWZpeCBub2RlIHBvaW50ZXIgaGFzIHRoZSBzYW1lIGNoaWxkcmVuIGFzCit0aGUgbm9kZSBpdCBsaW5rcyB0byAoYW5vdGhlciB3YXkgdG8gc2VlIHRoaXMgaXMgYXMgYSBjb250ZW50LWNhcnJ5aW5nIG5vZGUgaXMgb25lIHRoYXQgaGFzIGFuIF/OtV8gdHJhbnNpdGlvbiB0byB0aGUKK2xpbmtlZCBub2RlIGFuZCBubyBvdGhlciBmZWF0dXJlcyBleGNlcHQgYWRkZWQgY29udGVudCkuIFdlIGRvIG5vdCBhbGxvdyBtb3JlIHRoYW4gb25lIHByZWZpeCB0byBhIG5vZGUgKGkuZS4gcHJlZml4CitjYW4ndCBwb2ludCB0byBhbm90aGVyIHByZWZpeCksIGFuZCB0aGUgY2hpbGQgb2YgYSBwcmVmaXggbm9kZSBjYW5ub3QgYmUgYSBsZWFmLgorCitUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIHByZWZpeGVzOgorLSBzdGFuZGFsb25lLCB3aGljaCBoYXMgYSBmdWxsIDMyLWJpdCBwb2ludGVyIHRvIHRoZSBsaW5rZWQgbm9kZQorLSBlbWJlZGRlZCwgd2hpY2ggb2NjdXBpZXMgdW51c2VkIHNwYWNlIGluIGBDaGFpbmAgb3IgYFNwbGl0YCBub2RlcyBhbmQgc3BlY2lmaWVzIHRoZSA1LWJpdCBvZmZzZXQgd2l0aGluIHRoZSBzYW1lIGNlbGwKK29mIHRoZSBsaW5rZWQgbm9kZQorCitTdGFuZGFsb25lIHByZWZpeGVzIGhhdmUgdGhpcyBsYXlvdXQ6CisKK29mZnNldHxjb250ZW50fGV4YW1wbGUKKy0tLXwtLS18LS0tCiswMCAtIDAzfGNvbnRlbnQgaW5kZXh8MDAwMDAwMDEKKzA0fHN0YW5kYWxvbmUgZmxhZywgMHhGRnxGRgorMDUgLSAxQnx1bnVzZWR8CisxQyAtIDFGfGxpbmtlZCBub2RlIHBvaW50ZXJ8MDAwMDAyNUUKKworYW5kIHBvaW50ZXIgb2Zmc2V0IGAweDFGYC4gVGhlIHNhbXBsZSB2YWx1ZXMgYWJvdmUgd2lsbCBiZSB0aGUgb25lcyB1c2VkIHRvIGxpbmsgYSBwcmVmaXggbm9kZSB0byBvdXIgYFNwYXJzZWAKK2V4YW1wbGUsIHdoZXJlIGEgcHJlZml4IGNhbm5vdCBiZSBlbWJlZGRlZCBhcyBhbGwgdGhlIGJ5dGVzIG9mIHRoZSBjZWxsIGFyZSBpbiB1c2UuCisKK0lmIHdlIHdhbnQgdG8gYXR0YWNoIHRoZSBzYW1lIHByZWZpeCB0byB0aGUgYFNwbGl0YCBleGFtcGxlLCB3ZSB3aWxsIHBsYWNlIHRoaXMKKworb2Zmc2V0fGNvbnRlbnR8ZXhhbXBsZQorLS0tfC0tLXwtLS0KKzAwIC0gMDN8Y29udGVudCBpbmRleHwwMDAwMDAwMQorMDR8ZW1iZWRkZWQgb2Zmc2V0IHdpdGhpbiBjZWxsfDFDCiswNSAtIDFGfHVudXNlZHwKKworX2luc2lkZV8gdGhlIGxlYWRpbmcgc3BsaXQgY2VsbCwgd2l0aCBwb2ludGVyIGAweDFGYC4gU2luY2UgdGhpcyBpcyBhbiBlbWJlZGRlZCBub2RlLCB0aGUgYXVnbWVudGVkIG9uZSByZXNpZGVzIHdpdGhpbgordGhlIHNhbWUgY2VsbCwgYW5kIHRodXMgd2UgbmVlZCBvbmx5IDUgYml0cyB0byBlbmNvZGUgdGhlIHBvaW50ZXIgKHRoZSBvdGhlciAyNyBhcmUgdGhlIHNhbWUgYXMgdGhlIHByZWZpeCdzKS4KK1RoZSBjb21iaW5lZCBjb250ZW50IG9mIHRoZSBjZWxsIGF0IGAweDUwMC0weDUxRmAgd2lsbCB0aGVuIGJlIGAwMDAwMDAwMSAxQzAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDUyMCAwMDAwMDU2MAorMDAwMDAwMDAgMDAwMDAwMDBgOgorCitvZmZzZXR8Y29udGVudHxleGFtcGxlCistLS18LS0tfC0tLQorMDAgLSAwM3xjb250ZW50IGluZGV4fDAwMDAwMDAxCiswNHxlbWJlZGRlZCBvZmZzZXQgd2l0aGluIGNlbGx8MUMKKzA1IC0gMEZ8dW51c2VkfAorMTAgLSAxM3xtaWQtY2VsbCBmb3IgbGVhZGluZyAwMHwwMDAwMDUyMAorMTQgLSAxN3xtaWQtY2VsbCBmb3IgbGVhZGluZyAwMXwwMDAwMDU2MAorMTggLSAxQnxtaWQtY2VsbCBmb3IgbGVhZGluZyAxMHwwMDAwMDAwMCBOT05FCisxQyAtIDFGfG1pZC1jZWxsIGZvciBsZWFkaW5nIDExfDAwMDAwMDAwIE5PTkUKKworQm90aCBgMHg1MUNgIGFuZCBgMHg1MUZgIGFyZSB2YWxpZCBwb2ludGVycyBpbiB0aGlzIGNlbGwuIFRoZSBmb3JtZXIgcmVmZXJzIHRvIHRoZSBwbGFpbiBzcGxpdCBub2RlLCB0aGUgbGF0dGVyIHRvIGl0cworY29udGVudC1hdWdtZW50ZWQgdmVyc2lvbi4gVGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gaXMgdGhlIHJlc3VsdCBvZiBhIGNhbGwgdG8gYGNvbnRlbnQoKWAuCisKKyFbZ3JhcGhdKEluTWVtb3J5VHJpZS5tZC5nNC5zdmcpCisKKworIyMgUmVhZGluZyBhIHRyaWUKKworYEluTWVtb3J5VHJpZWAgaXMgbWFpbmx5IG1lYW50IHRvIGJlIHVzZWQgYXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYFRyaWVgLiBBcyBzdWNoLCB0aGUgbWFpbiBtZXRob2Qgb2YgcmV0cmlldmFsIG9mCitpbmZvcm1hdGlvbiBpcyB2aWEgc29tZSBzZWxlY3Rpb24gKGkuZS4gaW50ZXJzZWN0aW9uKSBvZiBhIHN1YnRyaWUgZm9sbG93ZWQgYnkgYSB3YWxrIG92ZXIgdGhlIGNvbnRlbnQgaW4gdGhpcworc3VidHJpZS4gU3RyYWlnaHRmb3J3YXJkIG1ldGhvZHMgZm9yIGRpcmVjdCByZXRyaWV2YWwgb2YgZGF0YSBieSBrZXkgYXJlIGFsc28gcHJvdmlkZWQsIGJ1dCB0aGV5IGFyZSBtYWlubHkgZm9yIHRlc3RpbmcuCisKK1RoZSBtZXRob2RzIGZvciBpdGVyYXRpbmcgb3ZlciBhbmQgdHJhbnNmb3JtaW5nIHRyaWVzIGFyZSBwcm92aWRlZCBieSB0aGUgYFRyaWVgIGludGVyZmFjZSBhbmQgYXJlIGJ1aWx0IG9uIHRoZSBjdXJzb3IKK2ludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBgSW5NZW1vcnlUcmllYCAoc2VlIGBUcmllLm1kYCBmb3IgYSBkZXNjcmlwdGlvbiBvZiBjdXJzb3JzKS4KKworIVtncmFwaF0oSW5NZW1vcnlUcmllLm1kLndjMS5zdmcpCisKKyhFZGdlcyBpbiBibGFjayBzaG93IHRoZSB0cmllJ3Mgc3RydWN0dXJlLCBhbmQgdGhlIG9uZXMgaW4gPHNwYW4gc3R5bGU9ImNvbG9yOmxpZ2h0Ymx1ZSI+bGlnaHQgYmx1ZTwvc3Bhbj4gdGhlIHBhdGggdGhlIGN1cnNvciB3YWxrIHRha2VzLikKKworIyMjIEN1cnNvcnMgb3ZlciBgSW5NZW1vcnlUcmllYAorCitgSW5NZW1vcnlUcmllYCBpbXBsZW1lbnRzIGN1cnNvcnMgdXNpbmcgYXJyYXlzIG9mIGludGVnZXJzIHRvIHN0b3JlIHRoZSBiYWNrdHJhY2tpbmcgc3RhdGUgKGFzIHRoZSBzaW1wbGVzdAorcG9zc2libGUgc3RydWN0dXJlIHRoYXQgY2FuIGJlIGVhc2lseSB3YWxrZWQgYW5kIGdhcmJhZ2UgY29sbGVjdGVkKS4gTm8gYmFja3RyYWNraW5nIHN0YXRlIGlzIGFkZGVkIGZvciBgQ2hhaW5gIG9yIAorYExlYWZgIG5vZGVzIGFuZCBhbnkgcHJlZml4LiBGb3IgYFNwYXJzZWAgd2Ugc3RvcmUgdGhlIG5vZGUgYWRkcmVzcywgZGVwdGggYW5kIHRoZSByZW1haW5kZXIgb2YgdGhlIHNwYXJzZSBvcmRlciB3b3JkLgorVGhhdCBpcywgd2UgcmVhZCB0aGUgc3BhcnNlIG9yZGVyIHdvcmQgb24gZW50cnksIHBlZWwgb2ZmIHRoZSBuZXh0IGluZGV4IHRvIGRlc2NlbmQgYW5kIHN0b3JlIHRoZSByZW1haW5kZXIuIFdoZW4gd2UgCitiYWNrdHJhY2sgdG8gdGhlIG5vZGUgd2UgcGVlbCBvZmYgYW5vdGhlciBpbmRleCAtLSBpZiB0aGUgcmVtYWluZGVyIGJlY29tZXMgMCwgdGhlcmUgYXJlIG5vIGZ1cnRoZXIgY2hpbGRyZW4gYW5kIHRoZSAKK2JhY2t0cmFja2luZyBlbnRyeSBjYW4gYmUgcmVtb3ZlZC4KKworRm9yIGBTcGxpdGAgbm9kZXMgd2Ugc3RvcmUgb25lIGVudHJ5IHBlciBzcGxpdCBub2RlIGNlbGwuIFRoaXMgbWVhbnM6CistIG9uZSBlbnRyeSBmb3IgdGhlIGhlYWQgY2VsbCB3aXRoIGFkZHJlc3MsIGRlcHRoIGFuZCBuZXh0IGNoaWxkIGJpdHMgYDBiSEgwMDAwMDBgIHdoZXJlIEhIIGlzIGJldHdlZW4gMSBhbmQgMworLSBvbmUgZW50cnkgZm9yIHRoZSBtaWQgY2VsbCB3aXRoIGFkZHJlc3MsIGRlcHRoIGFuZCBuZXh0IGNoaWxkIGJpdHMgYDBiSEhNTU0wMDBgIHdoZXJlIE1NTSBpcyBiZXR3ZWVuIDEgYW5kIDcKKy0gb25lIGVudHJ5IGZvciB0aGUgdGFpbCBjZWxsIHdpdGggYWRkcmVzcywgZGVwdGggYW5kIG5leHQgY2hpbGQgYml0cyBgMGJISE1NTVRUVGAgd2hlcmUgVFRUIGlzIGJldHdlZW4gMSBhbmQgNworCitPbiBiYWNrdHJhY2tpbmcgd2UgcmVjb2duaXplIHRoZSBzdWJsZXZlbCBieSB0aGUgcG9zaXRpb24gb2YgdGhlIGxvd2VzdCBub24temVybyBiaXQgdHJpcGxlLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGxhc3QKK3RocmVlIGFyZSBub3QgYDBiMDAwYCwgdGhpcyBpcyBhIHRhaWwgY2VsbCwgd2UgY2FuIGFkdmFuY2UgaW4gaXQgYW5kIHVzZSB0aGUgSEhNTU0gYml0cyB0byBmb3JtIHRoZSB0cmFuc2l0aW9uIGJ5dGUuCisKK1RoaXMgc3Vic3RydWN0dXJlIGlzIGEgbGl0dGxlIG1vcmUgZWZmaWNpZW50IHRoYW4gc3RvcmluZyBvbmx5IG9uZSBlbnRyeSBmb3IgdGhlIHNwbGl0IG5vZGUgKHRoZSBoZWFkLXRvLW1pZCBhbmQgCittaWQtdG8tdGFpbCBsaW5rcyBkbyBub3QgbmVlZCB0byBiZSBmb2xsb3dlZCBmb3IgZXZlcnkgbmV3IGNoaWxkKSBhbmQgYWxzbyBhbGxvd3MgdXMgdG8gZWFzaWx5IGdldCB0aGUgcHJlY2lzZSBuZXh0IAorY2hpbGQgYW5kIHJlbW92ZSB0aGUgYmFja3RyYWNraW5nIGVudHJ5IHdoZW4gYSBjZWxsIGhhcyBubyBmdXJ0aGVyIGNoaWxkcmVuLgorCitgSW5NZW1vcnlUcmllYCBjdXJzb3JzIGFsc28gaW1wbGVtZW50IGBhZHZhbmNlTXVsdGlwbGVgLCB3aGljaCBqdW1wcyBvdmVyIGludGVybWVkaWF0ZSBub2RlcyBpbiBgQ2hhaW5gIGJsb2NrczoKKworIVtncmFwaF0oSW5NZW1vcnlUcmllLm1kLndjMi5zdmcpCisKKyMjIE11dGF0aW9uCisKK011dGF0aW9uIG9mIGBJbk1lbW9yeVRyaWVgIG11c3QgYmUgZG9uZSBieSBvbmUgdGhyZWFkIG9ubHkgKGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHdlIGRvbid0IGVuZm9yY2UgaXQsIHRoZSB1c2VyIG11c3QKK21ha2Ugc3VyZSB0aGF0J3MgdGhlIGNhc2UpLCBidXQgd3JpdGVzIG1heSBiZSBjb25jdXJyZW50IHdpdGggbXVsdGlwbGUgcmVhZHMgb3ZlciB0aGUgZGF0YSB0aGF0IGlzIGJlaW5nIG11dGF0ZWQuIFRoZQordHJpZSBpcyBidWlsdCB0byBzdXBwb3J0IHRoaXMgYnkgbWFraW5nIHN1cmUgdGhhdCBhbnkgbW9kaWZpY2F0aW9uIG9mIGEgbm9kZSBpcyBzYWZlIGZvciBhbnkgcmVhZGVyIHRoYXQgaXMgb3BlcmF0aW5nCitjb25jdXJyZW50bHkuCisKK1RoZSBtYWluIG1ldGhvZCBmb3IgbXV0YXRpbmcgYSBgSW5NZW1vcnlUcmllYCBpcyBgYXBwbHlgLCB3aGljaCBtZXJnZXMgdGhlIHN0cnVjdHVyZSBvZiBhbm90aGVyIGBUcmllYCBpbi4gCitgSW5NZW1vcnlUcmllYCBhbHNvIHByb3ZpZGVzIHNpbXBsZXIgcmVjdXJzaXZlIG1ldGhvZCBvZiBtb2RpZmljYXRpb24sIGBwdXRSZWN1cnNpdmVgLCB3aGljaCBjcmVhdGVzIGEgc2luZ2xlIAorYGtleSAtPiB2YWx1ZWAgbWFwcGluZyBpbiB0aGUgdHJpZS4gV2Ugd2lsbCBkZXNjcmliZSB0aGUgbXV0YXRpb24gcHJvY2VzcyBzdGFydGluZyB3aXRoIGEgYHB1dFJlY3Vyc2l2ZWAgZXhhbXBsZS4KKworIyMjIEFkZGluZyBhIG5ldyBrZXkgLT4gdmFsdWUgbWFwcGluZyB1c2luZyBgcHV0UmVjdXJzaXZlYAorCitTdXBwb3NlIHdlIHdhbnQgdG8gaW5zZXJ0IHRoZSB2YWx1ZSBgdHJhdmVyc2VgIGludG8gdGhlIHRyaWUgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGguIFRoZSByZWN1cnNpdmUKK2luc2VydGlvbiBwcm9jZXNzIHdhbGtzIHRoZSB0cmllIHRvIGZpbmQgY29ycmVzcG9uZGluZyBleGlzdGluZyBub2RlcyBmb3IgdGhlIG9uZXMgaW4gdGhlIHBhdGggdG8gYmUgaW5zZXJ0ZWQuCitXaGVuIGl0IGhhcyB0byBsZWF2ZSB0aGUgZXhpc3RpbmcgdHJpZSwgYmVjYXVzZSBpdCBoYXMgbm8gZW50cmllcyBmb3IgdGhlIHBhdGgsIHRoZSBwcm9jZXNzIGNvbnRpbnVlcyB1c2luZyBgTk9ORWAgYXMKK3RoZSB0cmllIG5vZGUuCisKKyFbZ3JhcGhdKEluTWVtb3J5VHJpZS5tZC5tMS5zdmcpCisKK1doZW4gaXQgcmVhY2hlcyB0aGUgZW5kIG9mIHRoZSBwYXRoLCBpdCBuZWVkcyB0byBhdHRhY2ggdGhlIHZhbHVlLiBVbmxlc3MgdGhpcyBpcyBhIHByZWZpeCBvZiBhbiBleGlzdGluZyBlbnRyeSwgdGhlIAorbWF0Y2hpbmcgdHJpZSBub2RlIHdpbGwgZWl0aGVyIGJlIGBOT05FYCBvciBhIGxlYWYgbm9kZS4gSGVyZSBpdCdzIGBOT05FYCwgc28gd2UgY3JlYXRlIGEgaXRlbSBpbiB0aGUKK2NvbnRlbnQgYXJyYXksIGBjb250ZW50QXJyYXlbM11gLCBwdXQgdGhlIHZhbHVlIGluIGl0LCBhbmQgdGh1cyBmb3JtIHRoZSBsZWFmIG5vZGUgYH4zYCAoYDB4RkZGRkZGRkNgKS4gVGhlIHJlY3Vyc2l2ZQorcHJvY2VzcyByZXR1cm5zIHRoaXMgdG8gdGhlIHByZXZpb3VzIHN0ZXAuCisKK1RoZSBwcmV2aW91cyBzdGVwIG11c3QgYXR0YWNoIGEgY2hpbGQgd2l0aCB0aGUgdHJhbnNpdGlvbiBgZWAgdG8gdGhlIG5vZGUgYE5PTkVgLiBTaW5jZSB0aGlzIGlzIGEgbmV3IG5vZGUsIHdlIGRvIHRoaXMKK2J5IGNyZWF0aW5nIGEgbmV3IGBDaGFpbmAgbm9kZSBhdCBhZGRyZXNzIGAweDBCQmAgbWFwcGluZyBgZWAgdG8gYH4zYCBhbmQgcmV0dXJuIHRoYXQuIEZvciB0aGUgbm9kZSBhYm92ZSwgd2UgYWdhaW4KK25lZWQgdG8gYXR0YWNoIGEgY2hpbGQgdG8gYE5PTkVgLCBidXQgdGhpcyB0aW1lIHRoZSBjaGlsZCBpcyBhIGBDaGFpbmAgbm9kZSwgc28gd2UgY2FuIGRvIHRoaXMgYnkgZXhwYW5kaW5nIGl0LCBpLmUuCit3cml0aW5nIHRoZSBuZXcgY2hhcmFjdGVyIGF0IHRoZSBhZGRyZXNzIGp1c3QgYmVmb3JlIHRoZSBjaGlsZCBwb2ludGVyLCBhbmQgcmV0dXJuaW5nIHRoYXQgYWRkcmVzcyAobm90ZSB0aGF0IHRoZQorY2hpbGQgY2hhaW4gbm9kZSBpcyBuZXdseSBjcmVhdGVkLCBzbyB3ZSBjYW4ndCBiZSBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgZGF0YSB0aGVyZSkuIFdlIGNhbiBkbyB0aGlzIHNldmVyYWwgbW9yZQordGltZXMuCisKKyFbZ3JhcGhdKEluTWVtb3J5VHJpZS5tZC5tMi5zdmcpCisKKyg8c3BhbiBzdHlsZT0iY29sb3I6bGlnaHRibHVlIj5MaWdodCBibHVlPC9zcGFuPiBzcGVjaWZpZXMgdGhlIGRlc2NlbnQgcGF0aCwgPHNwYW4gc3R5bGU9ImNvbG9yOnBpbmsiPnBpbms8L3NwYW4+Cit0aGUgdmFsdWVzIHJldHVybmVkLCA8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+Ymx1ZTwvc3Bhbj4gc3RhbmRzIGZvciBuZXdseS1jcmVhdGVkIG5vZGVzIGFuZCBsaW5rcywgYW5kCis8c3BhbiBzdHlsZT0iY29sb3I6bGlnaHRncmF5Ij5saWdodCBncmF5PC9zcGFuPiBmb3Igb2Jzb2xldGVkIG5vZGVzIGFuZCBsaW5rcy4pCisKK0luIHRoZSBuZXh0IHN0ZXAgd2UgbXVzdCBhdHRhY2ggdGhlIGNoaWxkIGAweDBCOGAgd2l0aCB0cmFuc2l0aW9uIGB2YCB0byB0aGUgZXhpc3RpbmcgYENoYWluYCBub2RlIGAweDAxOGAuIFRoaXMgaXMgYQorZGlmZmVyZW50IHRyYW5zaXRpb24gZnJvbSB0aGUgb25lIHRoYXQgbm9kZSBhbHJlYWR5IGhhcywgc28gdGhlIGNoYW5nZSBjYW5ub3QgYmUgYWNjb21tb2RhdGVkIGJ5IGEgbm9kZSBvZiB0eXBlIGBDaGFpbmAsCit0aHVzIHdlIG5lZWQgdG8gY29weSB0aGlzIGludG8gYSBuZXcgYFNwYXJzZWAgbm9kZSBgMHgwREVgIHdpdGggdHdvIGNoaWxkcmVuLCB0aGUgZXhpc3RpbmcgYGMgLT4gMHgwMTlgIGFuZCB0aGUgbmV3CitgdiAtPiAweDBCOGAgYW5kIHJldHVybiBgMHgwREVgIHRvIHRoZSBwYXJlbnQgc3RlcC4KKworVGhlIHBhcmVudCBzdGVwIG11c3QgdGhlbiBjaGFuZ2UgaXRzIGV4aXN0aW5nIHBvaW50ZXIgZm9yIHRoZSBjaGFyYWN0ZXIgYGFgIGZyb20gYDB4MDE4YCB0byBgMHgwREVgIHdoaWNoIGl0IGNhbiBkbyBpbgorcGxhY2UgYnkgd3JpdGluZyB0aGUgbmV3IHZhbHVlIGluIGl0cyBwb2ludGVyIGNlbGwgZm9yIGBhYC4gVGhpcyBpcyB0aGUgYXR0YWNobWVudCBwb2ludCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQKK3N1YnN0cnVjdHVyZSwgaS5lLiBiZWZvcmUgdGhpcywgdGhlIG5ldyBub2RlcyB3ZXJlIG5vdCByZWFjaGFibGUsIGFuZCBub3cgYmVjb21lIHJlYWNoYWJsZTsgYmVmb3JlIHRoaXMsIHRoZSBub2RlCitgMHgwMTggYCB3YXMgcmVhY2hhYmxlLCBhbmQgbm93IGJlY29tZXMgdW5yZWFjaGFibGUuIFRoZSBhdHRhY2htZW50IGlzIGRvbmUgYnkgYSB2b2xhdGlsZSB3cml0ZSwgdG8gZW5mb3JjZSBhIAoraGFwcGVucy1iZWZvcmUgcmVsYXRpb25zaGlwIHRoYXQgbWFrZXMgc3VyZSB0aGF0IGFsbCB0aGUgbmV3IHN1YnN0cnVjdHVyZSAoYWxsIHdyaXR0ZW4gYnkgdGhpcyB0aHJlYWQpIGlzIGZ1bGx5IHJlYWRhYmxlCitieSBhbGwgcmVhZGVycyB3aG8gcGFzcyB0aHJvdWdoIHRoZSBuZXcgcG9pbnRlciAod2hpY2ggaXMgdGhlIG9ubHkgd2F5IHRoZXkgY2FuIHJlYWNoIGl0KS4gVGhlIHNhbWUgaGFwcGVucy1iZWZvcmUgYWxzbyAKK2Vuc3VyZXMgdGhhdCBhbnkgbmV3IHJlYWRlcnMgY2Fubm90IHJlYWNoIHRoZSBvYnNvbGV0ZWQgbm9kZXMgKHRoZXJlIG1heSBiZSBleGlzdGluZyByZWFkZXIgdGhyZWFkcyB0aGF0IGFyZSBhbHJlYWR5IGluIAordGhlbSkuCisKK0l0IGNhbiB0aGVuIHJldHVybiBpdHMgYWRkcmVzcyBgMHgwN0VgIHVuY2hhbmdlZCB1cCwgYW5kIG5vIGNoYW5nZXMgbmVlZCB0byBiZSBkb25lIGluIGFueSBvZiB0aGUgcmVtYWluaW5nIHN0ZXBzLiBUaGUKK3Byb2Nlc3MgZmluaXNoZXMgaW4gYSBuZXcgdmFsdWUgZm9yIGByb290YCwgd2hpY2ggaW4gdGhpcyBjYXNlIHJlbWFpbnMgdW5jaGFuZ2VkLgorCishW2dyYXBoXShJbk1lbW9yeVRyaWUubWQubTMuc3ZnKQorCitUaGUgcHJvY2VzcyBjcmVhdGVkIGEgZmV3IG5ldyBub2RlcyAoaW4gYmx1ZSksIGFuZCBtYWRlIG9uZSBvYnNvbGV0ZSAoaW4gZ3JleSkuIFdoYXQgY29uY3VycmVudCByZWFkZXJzIGNhbiBzZWUgZGVwZW5kcworb24gd2hlcmUgdGhleSBhcmUgYXQgdGhlIHRpbWUgdGhlIGF0dGFjaG1lbnQgcG9pbnQgd3JpdGUgaXMgZG9uZS4gRm9yd2FyZCB0cmF2ZXJzYWxzLCBpZiB0aGV5IGFyZSBpbiB0aGUgcGF0aCBiZWxvdworYDB4MDdFYCwgd2lsbCBjb250aW51ZSB3b3JraW5nIHdpdGggdGhlIG9ic29sZXRlZCBkYXRhIGFuZCB3aWxsIG5vdCBzZWUgYW55IG9mIHRoZSBuZXcgY2hhbmdlcy4gSWYgdGhleSBhcmUgYWJvdmUKK2AweDA3RWAsIHRoZXkgd2lsbCBzZWUgdGhlIHVwZGF0ZWQgY29udGVudC4gSWYgdGhleSBhcmUgX2F0XyB0aGUgYDB4MDdFYCBub2RlLCB0aGV5IG1heSBzZWUgZWl0aGVyLCBkZXBlbmRpbmcgb24gdGhlCit0aW1lIHRoZXkgcmVhZCB0aGUgcG9pbnRlciBmb3IgYGFgLiBSZXZlcnNlIHRyYXZlcnNhbHMgdGhhdCBoYXBwZW4gdG8gYmUgaW4gdGhlIHJlZ2lvbiB0byB0aGUgcmlnaHQgb2YgdGhlIG5ldyBub2RlcworX3dpbGxfIHNlZSB0aGUgdXBkYXRlZCBjb250ZW50LCBhcyB0aGV5IHdpbGwgcmVhZCB0aGUgcG9pbnRlciBhZnRlciBpdCBoYXMgYmVlbiB1cGRhdGVkLgorCitJbiBhbnkgY2FzZSwgdGhlIG9ic29sZXRlIHBhdGhzIHJlbWFpbiBjb3JyZWN0IGFuZCB1c2FibGUgZm9yIGFueSB0aHJlYWQgdGhhdCBoYXMgYWxyZWFkeSByZWFjaGVkIHRoZW0sIGFuZCB0aGUgbmV3CitwYXRocyBhcmUgY29ycmVjdCBhbmQgdXNhYmxlIGZyb20gdGhlIG1vbWVudCB0aGV5IGJlY29tZSByZWFjaGFibGUuCisKK05vdGUgdGhhdCBpZiB3ZSBwZXJmb3JtIG11bHRpcGxlIG11dGF0aW9ucyBpbiBzZXF1ZW5jZSwgYW5kIGEgcmVhZGVyIGhhcHBlbnMgdG8gYmUgc3RhbGxlZCBiZXR3ZWVuIHRoZW0gKGluIGl0ZXJhdGlvbgorb3JkZXIpLCBzdWNoIHJlYWRlciBtYXkgc2VlIG9ubHkgdGhlIG11dGF0aW9uIHRoYXQgaXMgYWhlYWQgb2YgaXQgX2luIGl0ZXJhdGlvbiBvcmRlcl8sIHdoaWNoIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUKK211dGF0aW9uIHRoYXQgaGFwcGVuZWQgZmlyc3QuIEZvciB0aGUgZXhhbXBsZSBhYm92ZSwgaWYgd2UgYWxzbyBpbnNlcnRlZCBgdHJlc3Bhc3NgLCBhIHJlYWRlciB0aHJlYWQgdGhhdCB3YXMgcGF1c2VkCithdCBgMHgwMThgIGluIGEgZm9yd2FyZCB0cmF2ZXJzYWwgYW5kIHdha2VzIHVwIGFmdGVyIGJvdGggaW5zZXJ0aW9ucyBoYXZlIGNvbXBsZXRlZCB3aWxsIHNlZSBgdHJlc3Bhc3NgLCBidXQgX3dpbGwgbm90Xworc2VlIGB0cmF2ZXJzZWAgZXZlbiB0aG91Z2ggaXQgd2FzIGluc2VydGVkIGVhcmxpZXIuCisKKyMjIyBJbi1wbGFjZSBtb2RpZmljYXRpb25zCisKK1doZW4gdGhlIGJhY2t0cmFja2luZyBwcm9jZXNzIHJldHVybnMgd2l0aCBhIG5ldyBtYXBwaW5nLCB0aGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVuIHdlIGNhbiBhcHBseSBhIGNoYW5nZSBpbiBwbGFjZQorKGNyZWF0aW5nIGFuIGF0dGFjaG1lbnQgcG9pbnQgZm9yIHRoZSBuZXcgcGF0aCkuIFdlIHdpbGwgZXhwbGFpbiB0aGVzZSBpbiBkZXRhaWwsIGFzIGl0IGlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHdoYXQKK2V4YWN0bHkgaGFwcGVucyBmcm9tIGNvbmN1cnJlbnQgcmVhZGVycycgcG9pbnQgb2YgdmlldyBpbiBhbGwgb2YgdGhlbS4KKworTm90ZSB0aGF0IGlmIGEgbW9kaWZpY2F0aW9uIGNhbm5vdCBiZSBkb25lIGluIHBsYWNlLCB3ZSBjb3B5IHRoZSBjb250ZW50IHRvIGEgbmV3IG5vZGUuIFRoZSBjb3BpZWQgbm9kZSBpcyBhbHdheXMKK3VucmVhY2hhYmxlIGFuZCB0aGVyZSB3aWxsIGFsd2F5cyBiZSBhbiBhdHRhY2htZW50IHBvaW50IHRoYXQgbWFrZXMgaXQgcmVhY2hhYmxlIHNvbWV3aGVyZSBpbiB0aGUgcGFyZW50IGNoYWluLgorCisjIyMjIENoYW5naW5nIHRoZSBjaGlsZCBwb2ludGVyIG9mIHRoZSBsYXN0IGBDaGFpbmAgbm9kZSBpbiBhIGNoYWluCisKK1RoaXMgaGFwcGVucyB3aGVuIHRoZSBleGlzdGluZyB0cmFuc2l0aW9uIG1hdGNoZXMgdGhlIHRyYW5zaXRpb24gb2YgdGhlIG5ldyBjaGFyYWN0ZXIsIGJ1dCB0aGUgcG9pbnRlciBpcyBkaWZmZXJlbnQsCithbmQgb25seSBhcHBsaWVzIHRvIGBDaGFpbmAgbm9kZXMgd2hvc2Ugb2Zmc2V0IGlzIGAweDFCYC4gSW4gdGhpcyBjYXNlIHRoZSBjaGlsZCBwb2ludGVyIGlzIHdyaXR0ZW4gYXQgb2Zmc2V0IGAweDFDYCwKK2FuZCB3ZSBjYW4gcHV0IGluIHRoZSBuZXcgdmFsdWUgYnkgcGVyZm9ybWluZyBhIHZvbGF0aWxlIHdyaXRlLgorCitGb3IgZXhhbXBsZSwgdXBkYXRpbmcgYE4gLT4gMHgzOUNgIGlzIGFjY29tcGxpc2hlZCBieSBtYWtpbmcgdGhlIHZvbGF0aWxlIHdyaXRlOgorCitvZmZzZXR8Y29udGVudHxiZWZvcmV8YWZ0ZXIKKy0tLXwtLS18LS0tfC0tLQorMDAtMUF8aXJyZWxldmFudHx8CisxQnxjaGFyYWN0ZXJ8TnxOCisxQy0xRnxwb2ludGVyfDAwMDAwMzFFfF8qKjAwMDAwMzlDKipfCisKKyhIZXJlIGFuZCBiZWxvdyBub3JtYWwgd3JpdGVzIGFyZSBpbiBib2xkIGFuZCB2b2xhdGlsZSB3cml0ZXMgaW4gYm9sZCBpdGFsaWMuKQorCitSZWFkZXJzIGhhdmUgdG8gcmVhZCB0aGUgcG9pbnRlciB0byByZWFjaCB0aGUgY2hpbGQgKG9sZCBvciBuZXcpLCBzbyB0aGlzIGFjaGlldmVzIHRoZSBoYXBwZW5zLWJlZm9yZSBndWFyYW50ZWVzIHdlCitzZWVrLiBSZWFkZXJzIGVpdGhlciBzZWUgdGhlIG9sZCB2YWx1ZSAod2hlcmUgbm9uZSBvZiB0aGUgYnJhbmNoJ3MgZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBpbiBhbnkgd2F5KSwgb3IgdGhlIG5ldyB2YWx1ZQorKHdoZXJlIHRoZSBoYXBwZW5zLWJlZm9yZSBndWFyYW50ZWVzIGFsbCB3cml0ZXMgY3JlYXRpbmcgdGhlIGF0dGFjaGVkIHN1YnN0cnVjdHVyZSBhcmUgZnVsbHkgdmlzaWJsZSkuCisKK05vdGUgdGhhdCBpZiB0aGUgbm9kZSBpcyBub3QgdGhlIGxhc3QgaW4gdGhlIGNoYWluLCB0aGUgcG9pbnRlciBpcyBpbXBsaWNpdCBhbmQgd2UgY2Fubm90IGNoYW5nZSBpdC4gVGh1cyB3ZSBoYXZlCit0byBjb3B5LCBpLmUuIGNyZWF0ZSBhIG5ldyBub2RlLCB3aGljaCBpbiB0aGlzIGNhc2Ugd2lsbCBhbHNvIGJlIGEgYENoYWluYCBub2RlLCBiZWNhdXNlIHRoZXJlIGlzIG5vdGhpbmcgZWxzZSBpbiB0aGUKK29yaWdpbmFsIG5vZGUgdGhhdCBuZWVkcyB0byBiZSBwcmVzZXJ2ZWQgKHRoZSBvbmx5IGV4aXN0aW5nIHRyYW5zaXRpb24gaXMgcmVwbGFjZWQgYnkgdGhlIHVwZGF0ZSkuCisKKyMjIyMgQ2hhbmdpbmcgdGhlIGNoaWxkIHBvaW50ZXIgb2YgYSBgU3BhcnNlYCBvciBgU3BsaXRgIG5vZGUKKworU2ltaWxhcmx5IHRvIGFib3ZlLCBpbiB0aGlzIGNhc2UgdGhlIHRyYW5zaXRpb24gbWF0Y2hlcyBhbiBleGlzdGluZyBvbmUsIGFuZCB0aHVzIHdlIGFscmVhZHkgaGF2ZSBhIDQtYnl0ZSBsb2NhdGlvbgord2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIG9sZCBjaGlsZCBpcyB3cml0dGVuLCBhbmQgd2UgY2FuIHVwZGF0ZSBpdCBieSBkb2luZyBhIHZvbGF0aWxlIHdyaXRlLgorCitGb3IgZXhhbXBsZSwgdXBkYXRpbmcgYEMgLT4gMHg1MUVgIGluIGEgc3BhcnNlIG5vZGUgY2FuIGJlOgorCitvZmZzZXR8Y29udGVudHxiZWZvcmV8YWZ0ZXIKKy0tLXwtLS18LS0tfC0tLQorMDAgLSAwM3xjaGlsZCBwb2ludGVyIDB8IDAwMDAwMjM4fDAwMDAwMjM4CiswNCAtIDA3fGNoaWxkIHBvaW50ZXIgMXwgMDAwMDAxM0F8XyoqMDAwMDA1MUUqKl8KKzA4IC0gMEJ8Y2hpbGQgcG9pbnRlciAyfCAwMDAwMDMzQnwwMDAwMDMzQgorMEMgLSAxN3x1bnVzZWR8CisxOCAgICAgfGNoYXJhY3RlciAwfCA0MSBBfDQxIEEKKzE5ICAgICB8Y2hhcmFjdGVyIDF8IDQzIEN8NDMgQworMUEgICAgIHxjaGFyYWN0ZXIgMnwgMzUgNXwzNSA1CisxQiAtIDFEfHVudXNlZHwKKzFFIC0gMUZ8b3JkZXIgd29yZHwgMDAyNiA9IDEwMiAoYmFzZSA2KQorCisKKyMjIyMgQWRkaW5nIGEgbmV3IGNoaWxkIHRvIGBTcGxpdGAKKworSWYgd2UgYWxyZWFkeSBoYXZlIHRoZSBzdWJzdHJ1Y3R1cmUgdGhhdCBsZWFkcyB0byB0aGUgcG9pbnRlciBmb3IgdGhlIG5ldyB0cmFuc2l0aW9uIChpLmUuIGEgbWlkLSBhbmQgZW5kLWNlbGwgZm9yIHRoZQordHJhbnNpdGlvbidzIGZpcnN0IDItMyBiaXRzIGFscmVhZHkgZXhpc3RzKSwgdGhlIHNpdHVhdGlvbiBpcyBhcyBhYm92ZSwgd2hlcmUgdGhlIGV4aXN0aW5nIHBvaW50ZXIgaXMgYE5PTkVgLCBhbmQgd2UgY2FuCitzaW1wbHkgcGVyZm9ybSBhIHZvbGF0aWxlIHdyaXRlLgorCitJZiBhbiBlbmQtY2VsbCBtYXBwaW5nIGRvZXMgbm90IGV4aXN0LCB3ZSBhbGxvY2F0ZSBhIG5ldyBjbGVhcmVkIGNlbGwgKHNvIHRoYXQgYWxsIHBvaW50ZXJzIGFyZSBgTk9ORWApLCB3cml0ZSB0aGUgbmV3Citwb2ludGVyIGF0IGl0cyBwb3NpdGlvbiB1c2luZyBhIG5vbi12b2xhdGlsZSB3cml0ZSwgYW5kIHRoZW4gY3JlYXRlIGEgbWFwcGluZyB0byB0aGlzIGVuZC1jZWxsIGluIHRoZSBtaWQgY2VsbCBieQordm9sYXRpbGUgd3JpdGluZyBpdHMgcG9pbnRlciBvdmVyIHRoZSBgTk9ORWAgaW4gdGhlIGNvcnJlY3Qgb2Zmc2V0LiBTaW1pbGFybHksIGlmIHRoZXJlJ3Mgbm8gbWlkLWNlbGwgZWl0aGVyLCB3ZSBjcmVhdGUKK2VtcHR5IGVuZC1jZWxsIGFuZCBtaWQtY2VsbCwgd3JpdGUgcG9pbnRlciBpbiBlbmQtY2VsbCBhbmQgbWFwcGluZyBpbiBtaWQtY2VsbCBub24tdm9sYXRpbGUsIGFuZCB3cml0ZSB0aGUgbWFwcGluZyBpbgordGhlIGxlYWRpbmcgY2VsbCB2b2xhdGlsZS4KKworSW4gYW55IG9mIHRoZXNlIGNhc2VzLCByZWFkZXJzIGhhdmUgdG8gcGFzcyB0aHJvdWdoIHRoZSB2b2xhdGlsZSB1cGRhdGUgdG8gcmVhY2ggYW55IG9mIHRoZSBuZXcgY29udGVudC4KKworRm9yIGV4YW1wbGUsIHRvIGFkZCBgeCAtPiAweDcxQWAgKGB4YCBpcyBgMHg3OGAgb3IgYDBiMDExMTEwMDBgKSB0byB0aGUgc3BsaXQgbm9kZSBleGFtcGxlIG5lZWRzIGEgbmV3IGVuZCBjZWxsIGZvcgorYDAxIDExMWAgKGZvciBleGFtcGxlIGF0IGAweDcyMC0weDczRmApICh0aGVzZSB3cml0ZXMgY2FuIGJlIG5vbi12b2xhdGlsZSk6CisKK29mZnNldHxjb250ZW50fGJlZm9yZXxhZnRlcgorLS0tfC0tLXwtLS18LS0tCiswMCAtIDAzfHBvaW50ZXIgdG8gY2hpbGQgZm9yIGVuZGluZyAwMDB8bi9hfCoqMDAwMDA3MUEqKgorMDQgLSAwN3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDAxfG4vYXwqKjAwMDAwMDAwKiogTk9ORQorMDggLSAwQnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDEwfG4vYXwqKjAwMDAwMDAwKiogTk9ORQorMEMgLSAwRnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMDExfG4vYXwqKjAwMDAwMDAwKiogTk9ORQorMTAgLSAxM3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTAwfG4vYXwqKjAwMDAwMDAwKiogTk9ORQorMTQgLSAxN3xwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTAxfG4vYXwqKjAwMDAwMDAwKiogTk9ORQorMTggLSAxQnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTEwfG4vYXwqKjAwMDAwMDAwKiogTk9ORQorMUMgLSAxRnxwb2ludGVyIHRvIGNoaWxkIGZvciBlbmRpbmcgMTExfG4vYXwqKjAwMDAwMDAwKiogTk9ORQorCithbmQgdGhpcyB2b2xhdGlsZSB3cml0ZSB0byB0aGUgbWlkIGNlbGwgYDB4NTIwYDoKKworb2Zmc2V0fGNvbnRlbnR8YmVmb3JlfGFmdGVyCistLS18LS0tfC0tLXwtLS0KKzAwIC0gMDN8ZW5kLWNlbGwgZm9yIG1pZGRsZSAwMDB8MDAwMDAwMDAgTk9ORXwwMDAwMDAwMCBOT05FCiswNCAtIDA3fGVuZC1jZWxsIGZvciBtaWRkbGUgMDAxfDAwMDAwMDAwIE5PTkV8MDAwMDAwMDAgTk9ORQorMDggLSAwQnxlbmQtY2VsbCBmb3IgbWlkZGxlIDAxMHwwMDAwMDAwMCBOT05FfDAwMDAwMDAwIE5PTkUKKzBDIC0gMEZ8ZW5kLWNlbGwgZm9yIG1pZGRsZSAwMTF8MDAwMDAwMDAgTk9ORXwwMDAwMDAwMCBOT05FCisxMCAtIDEzfGVuZC1jZWxsIGZvciBtaWRkbGUgMTAwfDAwMDAwMDAwIE5PTkV8MDAwMDAwMDAgTk9ORQorMTQgLSAxN3xlbmQtY2VsbCBmb3IgbWlkZGxlIDEwMXwwMDAwMDAwMCBOT05FfDAwMDAwMDAwIE5PTkUKKzE4IC0gMUJ8ZW5kLWNlbGwgZm9yIG1pZGRsZSAxMTB8MDAwMDA1NUN8MDAwMDA1NUMKKzFDIC0gMUZ8ZW5kLWNlbGwgZm9yIG1pZGRsZSAxMTF8MDAwMDAwMDAgTk9ORXxfKiowMDAwMDczQyoqXworCitUaGUgc3RhcnQgY2VsbCwgYW5kIHRoZSBvdGhlciBtaWQgYW5kIGVuZCBjZWxscyByZW1haW4gdW5jaGFuZ2VkLgorCisjIyMjIEFkZGluZyBhIG5ldyBjaGlsZCB0byBgU3BhcnNlYCB3aXRoIDUgb3IgZmV3ZXIgZXhpc3RpbmcgY2hpbGRyZW4KKworVGhlIG5lZWQgdG8gbWFpbnRhaW4gYSBjb3JyZWN0IHZpZXcgZm9yIGNvbmN1cnJlbnQgcmVhZGVycyB3aXRob3V0IGJsb2NraW5nIGlzIHRoZSByZWFzb24gd2h5IHdlIGNhbm5vdCBrZWVwIHRoZQorY2hpbGRyZW4gaW4gYSBgU3BhcnNlYCBjZWxsIG9yZGVyZWQgKGlmIHdlIGluc2VydCBvcmRlcmVkLCB3ZSBvcGVuIG91cnNlbHZlcyB0byByZWFkZXJzIHBvc3NpYmx5IHNlZWluZyB0aGUgc2FtZSBwb2ludGVyCitvciBjaGlsZCB0d2ljZSwgb3IgZXZlbiBnb2luZyBiYWNrIGluIHRoZSBpdGVyYXRpb24gb3JkZXIpLiBJbnN0ZWFkIHdlIGFsd2F5cyBhZGQgbmV3IGNoYXJhY3RlcnMgYW5kIHBvaW50ZXJzIGF0IHRoZQorbmV4dCBmcmVlIHBvc2l0aW9uIGFuZCB0aGVuIHVwZGF0ZSB0aGUgb3JkZXIgd29yZCB0byBpbmNsdWRlIGl0LiBNb3JlIHByZWNpc2VseToKKy0gd2UgZmluZCB0aGUgc21hbGxlc3QgaW5kZXggYGkgPCA2YCBmb3Igd2hpY2ggdGhlIHBvaW50ZXIgaXMgYE5PTkVgCistIHdlIHdyaXRlIHRoZSB0cmFuc2l0aW9uIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBgaWAKKy0gd2Ugd3JpdGUgdGhlIHBvaW50ZXIgYXQgcG9zaXRpb24gYGlgIG92ZXIgYE5PTkVgIHZvbGF0aWxlCistIHdlIGNvbXBpbGUgYSBuZXcgb3JkZXIgd29yZCBieSBpbnNlcnRpbmcgYGlgIGFmdGVyIGFsbCBpbmRleGVzIHdpdGggZ3JlYXRlciB0cmFuc2l0aW9uIGFuZCBiZWZvcmUgYWxsIGluZGV4ZXMgd2l0aAorICBzbWFsbGVyIGluIHRoZSBiYXNlLTYgcmVwcmVzZW50YXRpb24gKGUuZy4gdG8gaW5zZXJ0IGBqYCBpbiBzcGFyc2Ugbm9kZSB0aGF0IGhhcyBgYUA0IGZAMCBnQDIga0AxIHFAM2Agd2UgY2hhbmdlIHRoZQorICBvcmRlciB3b3JkIGAzMTIwNGAgdG8gYDMxNTIwNGApIGFuZCB3cml0ZSBpdCB2b2xhdGlsZQorCitUaGlzIGVuc3VyZXMgdGhhdCBhbnkgcmVhZGVyIHRoYXQgaXRlcmF0ZXMgb3ZlciBjaGlsZHJlbiAoaS5lLiBvbmUgdGhhdCBuZWVkcyB0aGUgb3JkZXIgd29yZCkgd2lsbCBoYXZlIHRvIHBhc3MgdGhyb3VnaAordGhlIHZvbGF0aWxlIG9yZGVyIHdvcmQgdXBkYXRlIGFuZCB3aWxsIHNlZSB0aGUgY29ycmVjdCBjaGFyYWN0ZXIgYW5kIHBvaW50ZXIgdmFsdWVzLiBSZWFkZXJzIHdobyBoYXZlIHJlYWQgdGhlIG9yZGVyCit3b3JkIGF0IHNvbWUgZWFybGllciB0aW1lIHdpbGwgbm90IGluY2x1ZGUgdGhlIG5ldyBwb2ludGVyIG9yIGNoYXJhY3RlciBpbiB0aGUgaXRlcmF0aW9uLgorCitSZWFkZXJzIHRoYXQgZGlyZWN0bHkgc2VsZWN0IHRoZSBjaGlsZCBmb3IgYSBnaXZlbiB0cmFuc2l0aW9uIG11c3QgcmVhZCB0aGUgcG9pbnRlciBmb3IgZWFjaCBpbmRleCBfYmVmb3JlXyByZWFkaW5nIHRoZQorY2hhcmFjdGVyIHRvIGVuc3VyZSB0aGV5IGNhbiBzZWUgdGhlIHByb3Blcmx5IHVwZGF0ZWQgdmFsdWUgKG90aGVyd2lzZSB0aGV5IGNvdWxkIG1hdGNoIGUuZy4gYSBgMDBgIHRyYW5zaXRpb24gdG8gdGhlCituZXcgYnJhbmNoIGJlY2F1c2UgdGhlIHJlYWwgY2hhcmFjdGVyIHdhcyBub3Qgd3JpdHRlbiB3aGVuIHRoZXkgcmVhZCB0aGUgYnl0ZSwgYnV0IHRoZSBwb2ludGVyIHdhcyB3aGVuIHRoZXkgZ290IHRvIGl0KQorYW5kIHN0b3Agc2VhcmNoaW5nIHdoZW4gdGhleSBmaW5kIGEgYE5PTkVgIHBvaW50ZXIuCisKK0ZvciBleGFtcGxlLCBhZGRpbmcgYHggLT4gMHg3MUFgIHRvIHRoZSBzcGFyc2UgZXhhbXBsZSBhYm92ZSBpcyBkb25lIGJ5OgorCitvZmZzZXR8Y29udGVudHxiZWZvcmV8YWZ0ZXIKKy0tLXwtLS18LS0tfC0tLQorMDAgLSAwM3xjaGlsZCBwb2ludGVyIDB8IDAwMDAwMjM4fDAwMDAwMjM4CiswNCAtIDA3fGNoaWxkIHBvaW50ZXIgMXwgMDAwMDA1MUV8MDAwMDA1MUUKKzA4IC0gMEJ8Y2hpbGQgcG9pbnRlciAyfCAwMDAwMDMzQnwwMDAwMDMzQgorMEMgLSAwRnxjaGlsZCBwb2ludGVyIDN8YW55fF8qKjAwMDAwNzFBKipfCisxMCAtIDE3fHVudXNlZHxOT05FfE5PTkUKKzE4ICAgICB8Y2hhcmFjdGVyIDB8IDQxIEF8NDEgQQorMTkgICAgIHxjaGFyYWN0ZXIgMXwgNDMgQ3w0MyBDCisxQSAgICAgfGNoYXJhY3RlciAyfCAzNSA1fDM1IDUKKzFCICAgICB8Y2hhcmFjdGVyIDN8IGFueSB8Kio3OCoqIHgKKzFDIC0gMUR8dW51c2VkfDAwIDAwfDAwIDAwCisxRSAtIDFGfG9yZGVyIHdvcmR8MDAyNiA9IDEwMiAoYmFzZSA2KXxfKiowMkFFKipfID0gMzEwMiAoYmFzZSA2KQorCit3aGVyZSB3ZSBmaXJzdCB3cml0ZSB0aGUgY2hhcmFjdGVyLCB0aGVuIHZvbGF0aWxlIHdyaXRlIHRoZSBwb2ludGVyLCBhbmQgZmluYWxseSB0aGUgb3JkZXIgd29yZC4KKworIyMjIyBDaGFuZ2luZyB0aGUgcm9vdCBwb2ludGVyCisKK0lmIGFuIHVwZGF0ZSBwcm9wYWdhdGVzIHdpdGggY29weWluZyBtb2RpZmljYXRpb25zIGFsbCB0aGUgd2F5IHRvIHRoZSByb290LCB3ZSBtdXN0IHVwZGF0ZSB0aGUgcm9vdCBwb2ludGVyLiBUaGUgbGF0dGVyCitpcyBhIHZvbGF0aWxlIHZhcmlhYmxlLCBzbyB0aGlzIGFsc28gZW5mb3JjZXMgdGhlIGhhcHBlbnMtYmVmb3JlIHJlbGF0aW9uc2hpcCB3ZSBuZWVkLgorCisjIyMgTWVyZ2luZyBhIGJyYW5jaCB1c2luZyBgYXBwbHlgCisKK1RoaXMgaXMgYSBnZW5lcmFsaXphdGlvbiBvZiB0aGUgbXV0YXRpb24gcHJvY2VkdXJlIGFib3ZlLCB3aGljaCBhcHBsaWVzIHRvIG1vcmUgY29tcGxleCBicmFuY2hlcywgd2hlcmUgZWFjaCBub2RlIG1heQorcG90ZW50aWFsbHkgbmVlZCBtdWx0aXBsZSB1cGRhdGVzIHRvIGF0dGFjaCBtb3JlIHRoYW4gb25lIGNoaWxkLiBUaGUgcHJvY2VzcyBwcm9jZWVkcyBmb2xsb3dpbmcgdGhlIG5vZGVzIHRoYXQgYSBjdXJzb3IKK29mIHRoZSBtdXRhdGlvbiB0cmllIHByb2R1Y2VzIGFuZCB3ZSBtYWludGFpbiBmdWxsIChpLmUuIGZvciBhbGwgbm9kZXMgaW4gdGhlIHBhcmVudCBjaGFpbikgYmFja3RyYWNraW5nIGluZm9ybWF0aW9uIGluCithbiBhcnJheSBvZiBpbnRlZ2VycyB0aGF0IGNvbnRhaW5zCistIGBleGlzdGluZ05vZGVgLCB0aGUgY29ycmVzcG9uZGluZyBwb2ludGVyIGluIHRoZSBtZW10YWJsZSB0cmllLAorLSBgdXBkYXRlZE5vZGVgLCB0aGUgY3VycmVudCBjb3JyZXNwb25kaW5nIHBvaW50ZXIgaW4gdGhlIG1lbXRhYmxlIHRyaWUsIHdoaWNoIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgYWJvdmUgaWYgdGhlCisgIG11dGF0aW9uIG5vZGUgaXMgYnJhbmNoaW5nIGFuZCBvbmUgb3IgbW9yZSBvZiBpdHMgY2hpbGRyZW4gaGF2ZSBiZWVuIGFscmVhZHkgYWRkZWQsCistIGB0cmFuc2l0aW9uYCwgdGhlIGluY29taW5nIGVkZ2Ugd2UgdG9vayB0byByZWFjaCB0aGUgbm9kZS4KKworV2hlbiB3ZSBkZXNjZW5kLCB3ZSBmb2xsb3cgdGhlIHRyYW5zaXRpb25zIGluIHRoZSBtZW10YWJsZSB0cmllIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9uZXMgZnJvbSBhbiBpdGVyYXRpb24gb3ZlciB0aGUKK3N0cnVjdHVyZSBvZiB0aGUgbXV0YXRpb24gdHJpZSB0byBvYnRhaW4gdGhlIGBleGlzdGluZ05vZGVgIHBvaW50ZXJzLCBhbmQgaW5pdGlhbGl6ZSBgdXBkYXRlZE5vZGVgIHRvIHRoZSBzYW1lLiBXaGVuIHRoZQoraXRlcmF0aW9uIHByb2Nlc3NlcyBhIGNoaWxkLCB3ZSBhcHBseSB0aGUgdXBkYXRlIHRvIHRoZSBub2RlLCB3aGljaCBtYXkgaGFwcGVuIGluIHBsYWNlLCBvciBtYXkgcmVxdWlyZSBjb3B5aW5nCismbWRhc2g7IGluIHRoZSBsYXR0ZXIgY2FzZSBgdXBkYXRlZE5vZGVgIHdpbGwgY2hhbmdlIHRvIHRoZSBuZXcgdmFsdWUuIE5vdGUgdGhhdCBpZiBgdXBkYXRlZE5vZGVgIHdhcyBkaWZmZXJlbnQgZnJvbQordGhlIG9yaWdpbmFsIGBleGlzdGluZ05vZGVgLCBpdCB3YXMgcG9pbnRpbmcgdG8gYW4gdW5yZWFjaGFibGUgY29waWVkIG5vZGUgd2hpY2ggd2lsbCByZW1haW4gdW5yZWFjaGFibGUgYXMgd2Ugd2lsbCBvbmx5CithdHRhY2ggdGhlIG5ld2VyIHZlcnNpb24uCisKK0FmdGVyIGFsbCBtb2RpZmljYXRpb25zIGNvbWluZyBhcyB0aGUgcmVzdWx0IG9mIGFwcGxpY2F0aW9uIG9mIGNoaWxkIGJyYW5jaGVzIGhhdmUgYmVlbiBhcHBsaWVkLCB3ZSBoYXZlIGFuCitgdXBkYXRlZE5vZGVgIHRoYXQgcmVmbGVjdHMgYWxsLiBBcyB3ZSBhc2NlbmQgd2UgYXBwbHkgdGhhdCBuZXcgdmFsdWUgdG8gdGhlIHBhcmVudCdzIGB1cGRhdGVkTm9kZWAuCisKK0ZvciBleGFtcGxlIChhZGRpbmcgYSB0cmllIGNvbnRhaW5pbmcgInRyYXZlcnNlLCB0cnVjayIgdG8gdGhlICJ0cmFjdG9yLCB0cmVlLCB0cmllIiBvbmUpOgorCishW2dyYXBoXShJbk1lbW9yeVRyaWUubWQuYTEuc3ZnKQorCitJbiB0aGlzIGRpYWdyYW0gYGV4aXN0aW5nTm9kZWBzIGFyZSB0aGUgb25lcyByZWFjaGVkIHRocm91Z2ggdGhlIDxzcGFuIHN0eWxlPSJjb2xvcjpsaWdodGJsdWUiPmxpZ2h0IGJsdWU8L3NwYW4+IGFycm93cyBkdXJpbmcgdGhlIGRlc2NlbnQgcGhhc2UgKGUuZy4KK2AweDAxOGAgZm9yIHRoZSBgQXBwbHlTdGF0ZWAgYXQgYHRyYWAsIG9yIGBOT05FYCBmb3IgYHRydWApLCBhbmQgYHVwZGF0ZWROb2RlYHMgYXJlIHRoZSBvbmVzIGFzY2VudCAoPHNwYW4gc3R5bGU9ImNvbG9yOnBpbmsiPnBpbms8L3NwYW4+IGFycm93cykKK3JldHVybnMgd2l0aCAoZS5nIC4gYDB4MERFYCBhbmQgYDB4MEZBYCBmb3IgdGhlIHJlc3BlY3RpdmUgc3RhdGVzKS4KKworRHVyaW5nIHRoaXMgcHJvY2VzcywgcmVhZGVycyBjYW4gc2VlIGFueSBtb2RpZmljYXRpb25zIG1hZGUgaW4gcGxhY2UgKGVhY2ggaW4tcGxhY2UgbW9kaWZpY2F0aW9uIGlzIGFuIGF0dGFjaG1lbnQgcG9pbnQKK3doaWNoIG1ha2VzIHBhcnQgb2YgdGhlIG5ldyBub2RlcyByZWFjaGFibGUpLiBUaGUgdXBkYXRlIG1lY2hhbmlzbSBhYm92ZSBtYWtlcyBzdXJlIGJvdGggdGhhdCB0aGUgc3RhdGUgYmVmb3JlIHRoZQordXBkYXRlIGlzIHByZXNlcnZlZCwgYW5kIHRoYXQgdGhlIHN0YXRlIGFmdGVyIHRoZSB1cGRhdGUgaXMgZnVsbHkgdmlzaWJsZSBmb3IgcmVhZGVycyB0aGF0IGNhbiByZWFjaCBpdCwgYnV0IGl0IGRvZXMgbm90CitndWFyYW50ZWUgdGhhdCB0aGUgbXV0YXRpb24gaXMgc2VlbiBhdG9taWNhbGx5IGJ5IHRoZSByZWFkZXJzIGlmIGl0IGNvbnRhaW5zIG11bHRpcGxlIHNlcGFyYXRlIGJyYW5jaGVzLgorSXQgaXMgcG9zc2libGUgZm9yIGEgcmVhZGVyIHRvIHNlZSBvbmx5IGEgcGFydCBvZiB0aGUgdXBkYXRlLCBmb3IgZXhhbXBsZToKKy0gYSByZWFkaW5nIHRocmVhZCByYWNpbmcgd2l0aCB0aGUgbXV0YXRvciBjYW4gaXRlcmF0ZSBvdmVyIGB0cmF2ZXJzZWAgYnV0IGZpbmlzaCBpdGVyYXRpbmcgYmVmb3JlIHRoZSBtdXRhdG9yCittYW5hZ2VzIHRvIGF0dGFjaCBgdHJ1Y2tgOworLSBhIHJlYWRpbmcgdGhyZWFkIHRoYXQgaXRlcmF0ZWQgdG8gYHRyZWVgICh3aGlsZSBgdHJhdmVyc2VgIHdhcyBub3QgeWV0IGF0dGFjaGVkKSBhbmQgcGF1c2VkLCB3aWxsIHNlZSBgdHJ1Y2tgIGlmIHRoZQorbXV0YXRpbmcgdGhyZWFkIGFwcGxpZXMgdGhlIHVwZGF0ZSBkdXJpbmcgdGhlIHBhdXNlLgorCisjIyMgSGFuZGxpbmcgcHJlZml4IG5vZGVzCisKK1RoZSBkZXNjcmlwdGlvbnMgYWJvdmUgd2VyZSBnaXZlbiB3aXRob3V0IHByZWZpeCBub2Rlcy4gSGFuZGxpbmcgcHJlZml4ZXMgaXMganVzdCBhIGxpdHRsZSBjb21wbGljYXRpb24gb3ZlciB0aGUgdXBkYXRlCitwcm9jZXNzIHdoZXJlIHdlIG11c3QgYXVnbWVudCBgdXBkYXRlZE5vZGVgIHdpdGggYW55IGFwcGxpY2FibGUgY29udGVudCBiZWZvcmUgYXBwbHlpbmcgdGhlIGNoYW5nZSB0byB0aGUgcGFyZW50LgorVG8gZG8gdGhpcyB3ZSBleHBhbmQgdGhlIHN0YXRlIHRyYWNrZWQgdG86CistIGBleGlzdGluZ1ByZUNvbnRlbnROb2RlYCB3aGljaCBwb2ludHMgdG8gdGhlIGV4aXN0aW5nIG5vZGUgaW5jbHVkaW5nIGFueSBwcmVmaXgsCistIGBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZWAgd2hpY2ggaXMgb2J0YWluZWQgYnkgc2tpcHBpbmcgb3ZlciB0aGUgcHJlZml4IChmb3Igc2ltcGxpY2l0eSB3ZSBhbHNvIHRyZWF0IGxlYWYKKyAgbm9kZXMgbGlrZSBhIHByZWZpeCB3aXRoIG5vIGNoaWxkKSBhbmQgaXMgdGhlIGJhc2UgZm9yIGFsbCBjaGlsZCB1cGRhdGVzIChpLmUuIGl0IHRha2VzIHRoZSByb2xlIG9mCisgIGBleGlzdGluZ05vZGVgIGluIHRoZSBkZXNjcmlwdGlvbnMgYWJvdmUpLAorLSBgdXBkYXRlZFBvc3RDb250ZW50Tm9kZWAgd2hpY2ggaXMgdGhlIG5vZGUgYXMgY2hhbmdlZC9jb3BpZWQgYWZ0ZXIgY2hpbGRyZW4gbW9kaWZpY2F0aW9ucyBhcmUgYXBwbGllZCwKKy0gYGNvbnRlbnRJbmRleGAgd2hpY2ggaXMgdGhlIGluZGV4IGluIHRoZSBjb250ZW50IGFycmF5IGZvciB0aGUgcmVzdWx0IG9mIG1lcmdpbmcgZXhpc3RpbmcgYW5kIG5ld2x5IGludHJvZHVjZWQgCisgIGNvbnRlbnQsIChOb3RlOiBUaGUgbXV0YXRpb24gY29udGVudCBpcyBvbmx5IHJlYWRhYmxlIHdoZW4gdGhlIGN1cnNvciBlbnRlcnMgdGhlIG5vZGUsIGFuZCB3ZSBjYW4gb25seSBhdHRhY2ggaXQgd2hlbgorICB3ZSBhc2NlbmQgZnJvbSBpdC4pCistIGB0cmFuc2l0aW9uYCByZW1haW5zIGFzIGJlZm9yZS4KKworYW5kIHdlIHRoZW4gYXR0YWNoIGBjb250ZW50SW5kZXhgIHRvIGNvbXBpbGUgYW4gYHVwZGF0ZWRQcmVDb250ZW50Tm9kZWAgd2hpY2ggdGhlIHBhcmVudCBpcyBtYWRlIHRvIGxpbmsgdG8uIFRoaXMgd2lsbAorYmUgZXF1YWwgdG8gYHVwZGF0ZWRQb3N0Q29udGVudE5vZGVgIGlmIG5vIGNvbnRlbnQgYXBwbGllcywgaS5lLiBgY29udGVudEluZGV4ID09IC0xYC4KKworKCJQcmUtIiBhbmQgInBvc3QtIiByZWZlciB0byBkZXNjZW50L2l0ZXJhdGlvbiBvcmRlciwgbm90IHRvIGNvbnN0cnVjdGlvbiBvcmRlcjsgZS5nLiBgdXBkYXRlZFByZUNvbnRlbnROb2RlYCBpcworY29uc3RydWN0ZWQgYWZ0ZXIgYHVwZGF0ZWRQb3N0Q29udGVudE5vZGVgIGJ1dCBsaW5rcyBhYm92ZSBpdCBpbiB0aGUgdHJpZS4pCisKK0FzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBwcm9jZXNzIG9mIGFkZGluZyBgdHJlZXNgIHRvIG91ciBzYW1wbGUgdHJpZToKKworIVtncmFwaF0oSW5NZW1vcnlUcmllLm1kLnAxLnN2ZykKKworV2hlbiBkZXNjZW5kaW5nIGF0IGB0cmVlYCB3ZSBzZXQgYGV4aXN0aW5nUHJlQ29udGVudE5vZGUgPSB+MWAsIGBleGlzdGluZ1Bvc3RDb250ZW50Tm9kZSA9IE5PTkVgIGFuZCBgY29udGVudEluZGV4ID0gMWAuCitBc2NlbmRpbmcgYmFjayB0byBhZGQgdGhlIGNoaWxkIGB+M2AsIHdlIGFkZCBhIGNoaWxkIHRvIGBOT05FYCBhbmQgZ2V0IGB1cGRhdGVkUG9zdENvbnRlbnROb2RlID0gMHgwQkJgLiBUbyB0aGVuIGFwcGx5Cit0aGUgZXhpc3RpbmcgY29udGVudCwgd2UgY3JlYXRlIHRoZSBlbWJlZGRlZCBwcmVmaXggbm9kZSBgdXBkYXRlZFByZUNvbnRlbnROb2RlID0gMHgwQkZgIHdpdGggYGNvbnRlbnRJbmRleCA9IDFgIGFuZAorcGFzcyB0aGF0IG9uIHRvIHRoZSByZWN1cnNpb24uCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQuYTEuc3ZnIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLmExLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjM3ZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLmExLnN2ZwpAQCAtMCwwICsxLDU5OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgorPCEtLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBHZW5lcmF0ZWQgYnkgZ3JhcGh2aXogdmVyc2lvbiAyLjQwLjEgKDIwMTYxMjI1LjAzMDQpCisjIGVtYmVkZGVkIERPVCAocGxhbnR1bWwpIHdvcmtzIGluIElERUEgcHJldmlldworIyBidXQgbm90IG9uIEdpdEh1YgorYGBgcGxhbnR1bWwKK2RpZ3JhcGggRyB7CisgICAgeyByYW5rPXNhbWUgcm9vdCAtPiBzdGFydCBbc3R5bGU9aW52aXNdIH0KKyAgICBzdGFydCBbbGFiZWw9InN0YXJ0L2VuZCJdCisKKyAgICB0cmFjdG9yIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMF0iXQorICAgIHRyYWN0byBbbGFiZWwgPSAiMHgwMUIiXQorICAgIHRyYWN0IFtsYWJlbCA9ICIweDAxQSJdCisgICAgdHJhYyBbbGFiZWwgPSAiMHgwMTkiXQorICAgIHRyYSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDE4IjsgY29sb3IgPSAibGlnaHRncmV5IjsgZm9udGNvbG9yID0gbGlnaHRncmF5XQorCisgICAgdHJlZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzFdIl0KKyAgICB0cmUgW2xhYmVsID0gIkNoYWluXG4weDAzQiJdCisgICAgdHJpZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzJdIl0KKyAgICB0cmkgW2xhYmVsID0gIkNoYWluXG4weDA1QiJdCisKKyAgICB0ciBbbGFiZWwgPSAiU3BhcnNlXG4weDA3RSJdCisKKyAgICB0IFtsYWJlbCA9ICIweDA5QiJdCisgICAgcm9vdCBbbGFiZWwgPSAiQ2hhaW5cbjB4OUEiXQorCisgICAgcm9vdCAtPiB0IFtsYWJlbCA9ICIgdCJdCisgICAgdCAtPiB0ciBbbGFiZWwgPSAiIHIiXQorICAgIHRyYWMgLT4gdHJhY3QgW2xhYmVsID0gIiB0Il0KKyAgICB0cmFjdCAtPiB0cmFjdG8gW2xhYmVsID0gIiBvIl0KKyAgICB0cmFjdG8gLT4gdHJhY3RvciBbbGFiZWwgPSAiIHIiXQorCisgICAgdHIgLT4gdHJhIFtsYWJlbCA9ICIgYSI7IGNvbG9yID0gImxpZ2h0Z3JleSI7IGZvbnRjb2xvciA9IGxpZ2h0Z3JheV0KKyAgICB0cmEgLT4gdHJhYyBbbGFiZWwgPSAiIGMiOyBjb2xvciA9ICJsaWdodGdyZXkiOyBmb250Y29sb3IgPSBsaWdodGdyYXldCisKKyAgICB0ciAtPiB0cmUgW2xhYmVsID0gIiBlIl0KKyAgICB0cmUgLT4gdHJlZSBbbGFiZWwgPSAiIGUiXQorCisgICAgdHIgLT4gdHJpIFtsYWJlbCA9ICIgaSJdCisgICAgdHJpIC0+IHRyaWUgW2xhYmVsID0gIiBlIl0KKworICAgIHN1YmdyYXBoIHBhdGggeworICAgICAgICBlZGdlIFtjb2xvciA9ICJsaWdodGJsdWUiOyBmb250Y29sb3I9ImJsdWUiOyBhcnJvd2hlYWQ9InZlZSJdCisgICAgICAgIG5vZGUgW2NvbG9yID0gImJsdWUiOyBmb250Y29sb3I9ImJsdWUiXQorCisgICAgICAgIHN0YXJ0IC0+IHJvb3QKKworICAgICAgICByb290IC0+IHQgW2xhYmVsID0gIiB0Il0KKyAgICAgICAgdCAtPiB0ciBbbGFiZWwgPSAiIHIiXQorICAgICAgICB0ciAtPiB0cmEgW2xhYmVsID0gIiBhIl0KKyAgICAgICAgdHJhIC0+IHRyYXYgW2xhYmVsID0gIiB2Il0KKyAgICAgICAgdHJhdiAtPiB0cmF2ZSBbbGFiZWwgPSAiIGUiXQorICAgICAgICB0cmF2ZSAtPiB0cmF2ZXIgW2xhYmVsID0gIiByIl0KKyAgICAgICAgdHJhdmVyIC0+IHRyYXZlcnMgW2xhYmVsID0gIiBzIl0KKyAgICAgICAgdHJhdmVycyAtPiB0cmF2ZXJzZSBbbGFiZWwgPSAiIGUiXQorCisgICAgICAgIHRyYTIgW2xhYmVsID0gIlNwYXJzZVxuMHgwREUiXQorICAgICAgICB0cmF2IFtsYWJlbCA9ICJDaGFpblxuMHgwQjgiXQorICAgICAgICB0cmF2ZSBbbGFiZWwgPSAiMHgwQjkiXQorICAgICAgICB0cmF2ZXIgW2xhYmVsID0gIjB4MEJBIl0KKyAgICAgICAgdHJhdmVycyBbbGFiZWwgPSAiMHgwQkIiXQorICAgICAgICB0cmF2ZXJzZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzNdIl0KKworICAgICAgICB0ciAtPiB0cnUgW2xhYmVsID0gIiB1Il0KKyAgICAgICAgdHJ1IC0+IHRydWMgW2xhYmVsID0gIiBjIl0KKyAgICAgICAgdHJ1YyAtPiB0cnVjayBbbGFiZWwgPSAiIGsiXQorCisgICAgICAgIHRydSBbbGFiZWwgPSAiQ2hhaW5cbjB4MEZBIl0KKyAgICAgICAgdHJ1YyBbbGFiZWwgPSAiMHgwRkIiXQorICAgICAgICB0cnVjayBbbGFiZWwgPSAiY29udGVudEFycmF5WzRdIl0KKyAgICB9CisKKyAgICB7cmFuaz1zYW1lIHRyYSAtPiB0cmEyIC0+IHRyZSAtPiB0cmkgLT4gdHJ1IFtzdHlsZT1pbnZpc119CisgICAge3Jhbms9c2FtZSB0cmFjIC0+IHRyYXYgLT4gdHJlZSAtPiB0cmllIC0+IHRydWMgW3N0eWxlPWludmlzXX0KKworICAgIHsKKyAgICAgICAgZWRnZSBbY29sb3IgPSAiYmx1ZSJdCisgICAgICAgIHRyIC0+IHRyYTIgW2xhYmVsID0gIiBhIl0KKyAgICAgICAgdHJhMiAtPiB0cmFjIFtsYWJlbCA9ICIgYyJdCisgICAgICAgIHRyYTIgLT4gdHJhdiBbbGFiZWwgPSAiIHYiXQorICAgICAgICB0cmF2IC0+IHRyYXZlIFtsYWJlbCA9ICIgZSJdCisgICAgICAgIHRyYXZlIC0+IHRyYXZlciBbbGFiZWwgPSAiIHIiXQorICAgICAgICB0cmF2ZXIgLT4gdHJhdmVycyBbbGFiZWwgPSAiIHMiXQorICAgICAgICB0cmF2ZXJzIC0+IHRyYXZlcnNlIFtsYWJlbCA9ICIgZSJdCisgICAgICAgIHRyIC0+IHRydSBbbGFiZWwgPSAiIHUiXQorICAgICAgICB0cnUgLT4gdHJ1YyBbbGFiZWwgPSAiIGMiXQorICAgICAgICB0cnVjIC0+IHRydWNrIFtsYWJlbCA9ICIgayJdCisgICAgfQorCisgICAgc3ViZ3JhcGggYmFjayB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gInBpbmsiOyBmb250Y29sb3I9InJlZCI7IGFycm93aGVhZD0idmVlIjsgY29uc3RyYWluPSJmYWxzZSJdCisKKyAgICAgICAgdHJhdmVyc2UgLT4gdHJhdmVycyBbbGFiZWwgPSAiIH4zIl0KKyAgICAgICAgdHJhdmVycyAtPiB0cmF2ZXIgW2xhYmVsID0gIjB4MEJCIl0KKyAgICAgICAgdHJhdmVyIC0+IHRyYXZlIFtsYWJlbCA9ICIweDBCQSJdCisgICAgICAgIHRyYXZlIC0+IHRyYXYgW2xhYmVsID0gIjB4MEI5Il0KKyAgICAgICAgdHJhdiAtPiB0cmEyIFtsYWJlbCA9ICIweDBCOCJdCisgICAgICAgIHRyYTIgLT4gdHIgW2xhYmVsID0gIjB4MERFIl0KKyAgICAgICAgdHIgLT4gdCBbbGFiZWwgPSAiMHgwN0UiXQorICAgICAgICB0IC0+IHJvb3QgW2xhYmVsID0gIjB4MDlCIl0KKyAgICAgICAgcm9vdCAtPiBzdGFydCBbbGFiZWwgPSAiMHgwOUEiXQorCisgICAgICAgIHRydWNrIC0+IHRydWMgW2xhYmVsID0gIn40Il0KKyAgICAgICAgdHJ1YyAtPiB0cnUgW2xhYmVsID0gIjB4MEZCIl0KKyAgICAgICAgdHJ1IC0+IHRyIFtsYWJlbCA9ICIweDBGQSJdCisgICAgfQorfQorYGBgCisgLS0+Cis8IS0tIFRpdGxlOiBHIFBhZ2VzOiAxIC0tPgorPHN2ZyB3aWR0aD0iNzU3cHQiIGhlaWdodD0iODQ2cHQiCisgICAgIHZpZXdCb3g9IjAuMDAgMC4wMCA3NTcuNDcgODQ1LjczIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KKyAgICA8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMSAxKSByb3RhdGUoMCkgdHJhbnNsYXRlKDQgODQxLjcyNTEpIj4KKyAgICAgICAgPHRpdGxlPkc8L3RpdGxlPgorICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9InRyYW5zcGFyZW50IiBwb2ludHM9Ii00LDQgLTQsLTg0MS43MjUxIDc1My40NzM4LC04NDEuNzI1MSA3NTMuNDczOCw0IC00LDQiLz4KKyAgICAgICAgPCEtLSByb290IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM1Ny4yMzY5IiBjeT0iLTgwOC4zMDk1IiByeD0iMzMuMTMzNyIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM1Ny4yMzY5IiB5PSItODEyLjUwOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNTcuMjM2OSIgeT0iLTc5NS43MDk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4OUE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSBzdGFydCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+c3RhcnQ8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNDkwLjIzNjkiIGN5PSItODA4LjMwOTUiIHJ4PSI0NC4wNzc1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ5MC4yMzY5IiB5PSItODA0LjEwOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+c3RhcnQvZW5kPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3N0YXJ0IC0tPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDtzdGFydCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U1MSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3QmIzQ1OyZndDtzdGFydDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0zOTAuNzk4NCwtODA4LjMwOTVDNDA0LjMwMzcsLTgwOC4zMDk1IDQyMC4yMzM5LC04MDguMzA5NSA0MzUuMzM5OCwtODA4LjMwOTUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSI0NDUuNjI2MSwtODA4LjMwOTUgNDM1LjYyNjIsLTgxMi44MDk2IDQ0MC42MjYxLC04MDguMzA5NSA0MzUuNjI2MSwtODA4LjMwOTYgNDM1LjYyNjEsLTgwOC4zMDk2IDQzNS42MjYxLC04MDguMzA5NiA0NDAuNjI2MSwtODA4LjMwOTUgNDM1LjYyNjEsLTgwMy44MDk2IDQ0NS42MjYxLC04MDguMzA5NSA0NDUuNjI2MSwtODA4LjMwOTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQxOC4yNTA5IiB5PSItODE1LjUwOTUiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwOUE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzNTcuMjM2OSIgY3k9Ii03MDguMDkzOSIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzU3LjIzNjkiIHk9Ii03MDMuODkzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA5QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDt0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290JiM0NTsmZ3Q7dDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zMzcuOTU2NCwtNzg0LjI2MTJDMzMwLjczOTMsLTc3Mi4zNDg1IDMyNS4yNzY4LC03NTcuNjQ2MiAzMjkuODQ2MywtNzQ0LjA5MzkgMzMxLjE2MzYsLTc0MC4xODY5IDMzMy4wOTI2LC03MzYuMzY4NCAzMzUuMzI2OSwtNzMyLjc2NjMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzMzguMzg0NCwtNzM0LjUwNjggMzQxLjMzNTcsLTcyNC4zMzEzIDMzMi42ODMsLTczMC40NDU0IDMzOC4zODQ0LC03MzQuNTA2OCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzMzLjkzMjIiIHk9Ii03NDguMjkzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDt0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMzU3LjIzNjksLTc3OC43ODM1QzM1Ny4yMzY5LC03NjUuMjk4NCAzNTcuMjM2OSwtNzQ5LjQwNjIgMzU3LjIzNjksLTczNi4xMDkyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMzU3LjIzNjksLTcyNi4wOTcyIDM2MS43MzcsLTczNi4wOTcxIDM1Ny4yMzY5LC03MzEuMDk3MiAzNTcuMjM3LC03MzYuMDk3MiAzNTcuMjM3LC03MzYuMDk3MiAzNTcuMjM3LC03MzYuMDk3MiAzNTcuMjM2OSwtNzMxLjA5NzIgMzUyLjczNywtNzM2LjA5NzIgMzU3LjIzNjksLTcyNi4wOTcyIDM1Ny4yMzY5LC03MjYuMDk3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzYwLjkzMjIiIHk9Ii03NDguMjkzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHN0YXJ0JiM0NTsmZ3Q7cm9vdCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnN0YXJ0JiM0NTsmZ3Q7cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik00NDYuNDA0MiwtODA1LjYzMzNDNDM0LjI5MzgsLTgwNS4xODE4IDQyMS4xNDc5LC04MDQuOTU4NCA0MDkuMDE4NCwtODA1LjMwOTUgNDA2LjMyNjQsLTgwNS4zODc0IDQwMy41NTY4LC04MDUuNDg4MSA0MDAuNzY0MywtODA1LjYwNTEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIzOTAuNjUwNCwtODA2LjA4OSA0MDAuNDIzOSwtODAxLjExNjEgMzk1LjY0NDcsLTgwNS44NSA0MDAuNjM5LC04MDUuNjExIDQwMC42MzksLTgwNS42MTEgNDAwLjYzOSwtODA1LjYxMSAzOTUuNjQ0NywtODA1Ljg1IDQwMC44NTQxLC04MTAuMTA1OCAzOTAuNjUwNCwtODA2LjA4OSAzOTAuNjUwNCwtODA2LjA4OSIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTEwNi44IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTAyLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzBdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTQiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG88L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzQuMjM2OSIgY3k9Ii0xOTUuNiIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzQuMjM2OSIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDFCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvJiM0NTsmZ3Q7dHJhY3RvciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvJiM0NTsmZ3Q7dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik03NC4wMjk3LC0xNzcuMjAwNkM3My44OTM0LC0xNjUuMDk0OSA3My43MTIyLC0xNDkuMDA3NiA3My41NTc1LC0xMzUuMjY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijc3LjA1MjksLTEzNC44MzE5IDczLjQ0MDQsLTEyNC44NzIgNzAuMDUzMywtMTM0LjkxMDggNzcuMDUyOSwtMTM0LjgzMTkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc4LjMxNzIiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU1IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzguMjM2OSIgY3k9Ii0yODQuNCIgcng9IjM3LjE0NDMiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzguMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDFBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QmIzQ1OyZndDt0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0JiM0NTsmZ3Q7dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTc3LjQwODEsLTI2Ni4wMDA2Qzc2Ljg2MjgsLTI1My44OTQ5IDc2LjEzODEsLTIzNy44MDc2IDc1LjUxOTIsLTIyNC4wNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNzguOTk3NSwtMjIzLjUwNDQgNzUuMDUwOSwtMjEzLjY3MiA3Mi4wMDQ2LC0yMjMuODE5NCA3OC45OTc1LC0yMjMuNTA0NCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iODIuNDg2OSIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBvPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU2IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI5NC4yMzY5IiBjeT0iLTM4NC42MTU2IiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5NC4yMzY5IiB5PSItMzgwLjQxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMTk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjJiM0NTsmZ3Q7dHJhY3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWMmIzQ1OyZndDt0cmFjdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik05MS4zMDIyLC0zNjYuMjM0NUM4OC45MTE1LC0zNTEuMjYwMyA4NS40OTU1LC0zMjkuODY0MyA4Mi43NTYsLTMxMi43MDU1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iODYuMTg1OCwtMzExLjk4NzcgODEuMTUyOSwtMzAyLjY2NDYgNzkuMjczNCwtMzEzLjA5MTMgODYuMTg1OCwtMzExLjk4NzciLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijg5LjkzMjIiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXYgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTQiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjIwMi4yMzY5IiBjeT0iLTM4NC42MTU2IiByeD0iMzcuOTMwNiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwMi4yMzY5IiB5PSItMzg4LjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDIuMjM2OSIgeT0iLTM3Mi4wMTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPjB4MEI4PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyYXYgLS0+CisgICAgICAgIDwhLS0gdHJhIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTciIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmE8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZDNkM2QzIiBjeD0iMTMzLjIzNjkiIGN5PSItNDk2LjI0NjkiIHJ4PSIzNi4xMjUiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMzMuMjM2OSIgeT0iLTUwMC40NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNkM2QzZDMiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTMzLjIzNjkiIHk9Ii00ODMuNjQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZDNkM2QzIj4weDAxODwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYSYjNDU7Jmd0O3RyYWMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYSYjNDU7Jmd0O3RyYWM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZDNkM2QzIiBkPSJNMTE0LjUxODgsLTQ3MC42NzM5QzExMC4zMDE2LC00NjMuODYyMiAxMDYuMjY2NiwtNDU2LjMwOTggMTAzLjUyMjMsLTQ0OC44MzEzIDk5LjM3NTgsLTQzNy41MzE4IDk3LjA3MzEsLTQyNC40Nzc2IDk1Ljc5NzMsLTQxMy4xMDIxIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZDNkM2QzIiBzdHJva2U9IiNkM2QzZDMiIHBvaW50cz0iOTkuMjUzOCwtNDEyLjQ2MzggOTQuODYyMiwtNDAyLjgyMiA5Mi4yODI2LC00MTMuMDk4IDk5LjI1MzgsLTQxMi40NjM4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMDkuMDk0MiIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNkM2QzZDMiPiBjPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhJiM0NTsmZ3Q7dHJhdiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYSYjNDU7Jmd0O3RyYXY8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMTMwLjc1MjcsLTQ2Ni42MTk3QzEzMS4wMzk5LC00NTUuMTg4OSAxMzIuOTczNCwtNDQyLjM5NzUgMTM4LjczNjksLTQzMi4wMzEzIDE0NC4yNjUxLC00MjIuMDg4MSAxNTIuODQ2OSwtNDEzLjYyMTQgMTYxLjkzMywtNDA2LjcxNDgiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIxNzAuMzQ2LC00MDAuODEyOSAxNjQuNzQzOSwtNDEwLjIzOTggMTY2LjI1MjcsLTQwMy42ODQ0IDE2Mi4xNTk1LC00MDYuNTU1OSAxNjIuMTU5NSwtNDA2LjU1NTkgMTYyLjE1OTUsLTQwNi41NTU5IDE2Ni4yNTI3LC00MDMuNjg0NCAxNTkuNTc1MSwtNDAyLjg3MiAxNzAuMzQ2LC00MDAuODEyOSAxNzAuMzQ2LC00MDAuODEyOSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTQ0LjQ4NjkiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gdjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYTIgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTkiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEyPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjI0NC4yMzY5IiBjeT0iLTQ5Ni4yNDY5IiByeD0iMzkuMjE0NSIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI0NC4yMzY5IiB5PSItNTAwLjQ0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+U3BhcnNlPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjQ0LjIzNjkiIHk9Ii00ODMuNjQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4weDBERTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYSYjNDU7Jmd0O3RyYTIgLS0+CisgICAgICAgIDwhLS0gdHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU4IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzNDguMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzQ4LjIzNjkiIHk9Ii0zODAuNDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMV08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmllIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEwIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI1MzAuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNTMwLjIzNjkiIHk9Ii0zODAuNDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMl08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlJiM0NTsmZ3Q7dHJpZSAtLT4KKyAgICAgICAgPCEtLSB0cmUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlOSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzNTcuMjM2OSIgY3k9Ii00OTYuMjQ2OSIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNTcuMjM2OSIgeT0iLTUwMC40NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzU3LjIzNjkiIHk9Ii00ODMuNjQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAzQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZSYjNDU7Jmd0O3RyZWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTAiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmUmIzQ1OyZndDt0cmVlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTM1NC44NDg3LC00NjYuNjI0OUMzNTMuNTA3MywtNDQ5Ljk4NzMgMzUxLjg0MjIsLTQyOS4zMzQgMzUwLjUxODYsLTQxMi45MTYzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzUzLjk5NzMsLTQxMi41MTAzIDM0OS43MDQ5LC00MDIuODIzOSAzNDcuMDE5OSwtNDEzLjA3MjkgMzUzLjk5NzMsLTQxMi41MTAzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNTkuMDk0MiIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTExIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjQ2OC4yMzY5IiBjeT0iLTQ5Ni4yNDY5IiByeD0iMzcuOTMwNiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ2OC4yMzY5IiB5PSItNTAwLjQ0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NjguMjM2OSIgeT0iLTQ4My42NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDVCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlJiM0NTsmZ3Q7dHJpIC0tPgorICAgICAgICA8IS0tIHRydWMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMjEiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cnVjPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjY3Ni4yMzY5IiBjeT0iLTM4NC42MTU2IiByeD0iMzcuMTYxNiIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2NzYuMjM2OSIgeT0iLTM4MC40MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPjB4MEZCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpZSYjNDU7Jmd0O3RydWMgLS0+CisgICAgICAgIDwhLS0gdHJpJiM0NTsmZ3Q7dHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyaSYjNDU7Jmd0O3RyaWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNDgzLjI0NTQsLTQ2OS4yMjQxQzQ5Mi45MjE2LC00NTEuODAxOSA1MDUuNDYwNCwtNDI5LjIyNTggNTE1LjE1MTcsLTQxMS43NzY1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNTE4LjQxMDksLTQxMy4xMTY4IDUyMC4yMDY2LC00MDIuNjc1MiA1MTIuMjkxNCwtNDA5LjcxOCA1MTguNDEwOSwtNDEzLjExNjgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjUwNy4wOTQyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cnUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMjAiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cnU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBjeD0iNTgwLjIzNjkiIGN5PSItNDk2LjI0NjkiIHJ4PSIzOC42MjYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1ODAuMjM2OSIgeT0iLTUwMC40NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNTgwLjIzNjkiIHk9Ii00ODMuNjQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4weDBGQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSYjNDU7Jmd0O3RydSAtLT4KKyAgICAgICAgPCEtLSB0ciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM1Ny4yMzY5IiBjeT0iLTYwNy44NzgyIiByeD0iMzcuOTAyNyIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM1Ny4yMzY5IiB5PSItNjEyLjA3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+U3BhcnNlPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzU3LjIzNjkiIHk9Ii01OTUuMjc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA3RTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJhIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyYTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNkM2QzZDMiIGQ9Ik0zMjEuODg3MiwtNTk3LjIxNTNDMjk1LjcxNDQsLTU4OC43Mzc5IDI1OS41NDMsLTU3NS43ODE1IDIyOS41MjIzLC01NjAuNDYyNiAyMDguMjk3MSwtNTQ5LjYzMTggMTg2LjA3MzgsLTUzNS4wNTQ4IDE2OC4zMzIzLC01MjIuNTI2OCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2QzZDNkMyIgc3Ryb2tlPSIjZDNkM2QzIiBwb2ludHM9IjE3MC4xNzU0LC01MTkuNTQxOCAxNjAuMDA2OCwtNTE2LjU2NjcgMTY2LjEwMDcsLTUyNS4yMzM2IDE3MC4xNzU0LC01MTkuNTQxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM1LjA5NDIiIHk9Ii01NDcuODYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZDNkM2QzIj4gYTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJhIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmE8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMzE5LjgyMDgsLTYwMy43MDM1QzI4My44MzU0LC01OTguMjkxOSAyMjkuMDcyNSwtNTg2LjI4MTYgMTg4LjUyMjMsLTU2MC40NjI2IDE3Ni4zNTk0LC01NTIuNzE4MiAxNjUuNDA1OCwtNTQxLjQ5MDYgMTU2LjUxODQsLTUzMC41ODIyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTUwLjEzOTIsLTUyMi4zNjU4IDE1OS44MjYzLC01MjcuNTA0OSAxNTMuMjA1NSwtNTI2LjMxNTIgMTU2LjI3MTksLTUzMC4yNjQ2IDE1Ni4yNzE5LC01MzAuMjY0NiAxNTYuMjcxOSwtNTMwLjI2NDYgMTUzLjIwNTUsLTUyNi4zMTUyIDE1Mi43MTc0LC01MzMuMDI0MyAxNTAuMTM5MiwtNTIyLjM2NTggMTUwLjEzOTIsLTUyMi4zNjU4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxOTQuMDk0MiIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBhPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTM1Ny4yMzY5LC01NzguMjU2MkMzNTcuMjM2OSwtNTY1LjM4ODEgMzU3LjIzNjksLTU1MC4xMTc5IDM1Ny4yMzY5LC01MzYuMjYzMSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjM2MC43MzcsLTUzNi4wMDc0IDM1Ny4yMzY5LC01MjYuMDA3NCAzNTMuNzM3LC01MzYuMDA3NCAzNjAuNzM3LC01MzYuMDA3NCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzYyLjA5NDIiIHk9Ii01NDcuODYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJpIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmk8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzgwLjUwNjEsLTU4NC40NzY2QzM5Ny4wODI1LC01NjcuODA2IDQxOS41MjkxLC01NDUuMjMxOCA0MzcuNTY3NCwtNTI3LjA5MDgiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI0NDAuNDI5MiwtNTI5LjE3NjcgNDQ0Ljk5ODMsLTUxOS42MTc3IDQzNS40NjU0LC01MjQuMjQxIDQ0MC40MjkyLC01MjkuMTc2NyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDIzLjkzMjIiIHk9Ii01NDcuODYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gaTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0OSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0zNTUuMTM5OSwtNjM3LjI4N0MzNTQuNjA1LC02NDguMjE1OSAzNTQuMjgxNiwtNjYwLjcyMDUgMzU0LjY4NDMsLTY3Mi4wOTM5IDM1NC43NzAzLC02NzQuNTI0MiAzNTQuODg5LC02NzcuMDQ1MSAzNTUuMDI4MywtNjc5LjU3MzMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIzNTUuNjg3NSwtNjg5Ljc5MzEgMzUwLjU1MzEsLTY4MC4xMDM1IDM1NS4zNjU2LC02ODQuODAzNCAzNTUuMDQzOCwtNjc5LjgxMzggMzU1LjA0MzgsLTY3OS44MTM4IDM1NS4wNDM4LC02NzkuODEzOCAzNTUuMzY1NiwtNjg0LjgwMzQgMzU5LjUzNDQsLTY3OS41MjQxIDM1NS42ODc1LC02ODkuNzkzMSAzNTUuNjg3NSwtNjg5Ljc5MzEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM3My41MTMyIiB5PSItNjU5LjQ5MzkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwN0U8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyYTIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyYTI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNMzMzLjkzMjMsLTU4NC4yOTEzQzMyMS44NDI3LC01NzIuMTA3MSAzMDYuODAyOSwtNTU3LjAzIDI5My4yMzY5LC01NDMuNjYyNiAyODcuNjA0NSwtNTM4LjExMjcgMjgxLjU3NTQsLTUzMi4yMzA5IDI3NS43NCwtNTI2LjU2ODIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIyNzguMTE1MywtNTIzLjk5NjIgMjY4LjQ5NjYsLTUxOS41NTQxIDI3My4yNDU4LC01MjkuMDI0OSAyNzguMTE1MywtNTIzLjk5NjIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMxNC4wOTQyIiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RydSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJ1PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTM4OS4xODc0LC01OTEuODg0MkM0MjguNDU3MywtNTcyLjIyNjEgNDk1LjE5NjksLTUzOC44MTcgNTM4LjQ4OTUsLTUxNy4xNDUyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iNTQ3LjYyMDUsLTUxMi41NzQzIDU0MC42OTI3LC01MjEuMDc0NyA1NDMuMTQ5NCwtNTE0LjgxMjUgNTM4LjY3ODMsLTUxNy4wNTA3IDUzOC42NzgzLC01MTcuMDUwNyA1MzguNjc4MywtNTE3LjA1MDcgNTQzLjE0OTQsLTUxNC44MTI1IDUzNi42NjQsLTUxMy4wMjY3IDU0Ny42MjA1LC01MTIuNTc0MyA1NDcuNjIwNSwtNTEyLjU3NDMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ4Ni40ODY5IiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RydSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0MCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJ1PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgZD0iTTM5My4zOTY3LC01OTkuMDE2OUM0MjIuMjUzOCwtNTkxLjEzODMgNDYzLjE3ODgsLTU3OC4xMjYgNDk2LjIzNjksLTU2MC40NjI2IDUxNC4yNjg5LC01NTAuODI3OCA1MzIuNTEwMiwtNTM3LjQyMTkgNTQ3LjM2NTUsLTUyNS4zNDk5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iNTQ5Ljc4NDUsLTUyNy44OTA4IDU1NS4yNDczLC01MTguODEyOCA1NDUuMzE1OCwtNTIyLjUwMjggNTQ5Ljc4NDUsLTUyNy44OTA4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1MjUuNDg2OSIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiB1PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCYjNDU7Jmd0O3Jvb3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNTAiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50JiM0NTsmZ3Q7cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0zNjIuMDg4NiwtNzI2LjI3ODZDMzYzLjM4MDIsLTczMS45NDI2IDM2NC41OTQyLC03MzguMjM4OCAzNjUuMjM2OSwtNzQ0LjA5MzkgMzY2LjEyNDcsLTc1Mi4xODE3IDM2NS44NywtNzYwLjgzMjcgMzY1LjA0OCwtNzY5LjA4MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjM2My43NDY5LC03NzkuMjQwNyAzNjAuNTUzNywtNzY4Ljc1MDEgMzY0LjM4MjEsLTc3NC4yODEyIDM2NS4wMTczLC03NjkuMzIxNyAzNjUuMDE3MywtNzY5LjMyMTcgMzY1LjAxNzMsLTc2OS4zMjE3IDM2NC4zODIxLC03NzQuMjgxMiAzNjkuNDgwOCwtNzY5Ljg5MzQgMzYzLjc0NjksLTc3OS4yNDA3IDM2My43NDY5LC03NzkuMjQwNyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzg0LjkwNTIiIHk9Ii03NDguMjkzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDA5QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dCYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTM3OC43NzI5LC02OTMuMjMwOEMzODUuMzI0NCwtNjg3LjQ2ODIgMzkxLjcxNzksLTY4MC4yNzUxIDM5NS4yMzY5LC02NzIuMDkzOSAzOTguMTg3MiwtNjY1LjIzNDggMzk3LjcxMTUsLTY2Mi4zMzg1IDM5NS4yMzY5LC02NTUuMjkzOSAzOTMuMjY1OSwtNjQ5LjY4MjggMzkwLjMyMDIsLTY0NC4yNDM2IDM4Ni45MjQ3LC02MzkuMTcyNyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjM4OS42NDY5LC02MzYuOTY3NyAzODAuODc4MiwtNjMxLjAyMTEgMzg0LjAyNDcsLTY0MS4xMzggMzg5LjY0NjksLTYzNi45Njc3Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MDIuMzE3MiIgeT0iLTY1OS40OTM5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dCYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTM0MC4zMjQsLTY5Mi4wMTM4QzMzNS4zOTk1LC02ODYuMjU0MyAzMzAuNjU0MywtNjc5LjM3MjIgMzI4LjA3NjMsLTY3Mi4wOTM5IDMyNC40ODI3LC02NjEuOTQ4MSAzMjYuNzk1NCwtNjUxLjE5ODMgMzMxLjM4MiwtNjQxLjQ1NTYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIzMzYuMzU3NiwtNjMyLjQ3NTggMzM1LjQ0NzEsLTY0My40MDM4IDMzMy45MzQyLC02MzYuODQ5MyAzMzEuNTEwOSwtNjQxLjIyMjggMzMxLjUxMDksLTY0MS4yMjI4IDMzMS41MTA5LC02NDEuMjIyOCAzMzMuOTM0MiwtNjM2Ljg0OTMgMzI3LjU3NDcsLTYzOS4wNDE4IDMzNi4zNTc2LC02MzIuNDc1OCAzMzYuMzU3NiwtNjMyLjQ3NTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMzMi4zMTcyIiB5PSItNjU5LjQ5MzkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2JiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPCEtLSB0cmF2ZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjIwMi4yMzY5IiBjeT0iLTI4NC40IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDIuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPjB4MEI5PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdiYjNDU7Jmd0O3RyYXZlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdiYjNDU7Jmd0O3RyYXZlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTE4MS40NjkyLC0zNTkuNDQ3NkMxNzYuOTgzMywtMzUyLjYyODEgMTcyLjg4MTUsLTM0NC45NzA3IDE3MC41MjIzLC0zMzcuMiAxNjguMzUzMSwtMzMwLjA1NTQgMTY3Ljg4NDMsLTMyNy4zODUxIDE3MC41MjIzLC0zMjAuNCAxNzIuMTU1NSwtMzE2LjA3NTMgMTc0LjU3MTIsLTMxMS45MzM4IDE3Ny4zNTMzLC0zMDguMDk5MiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjE4My44Njc2LC0zMDAuMjQzMSAxODAuOTQ4NSwtMzEwLjgxMzQgMTgwLjY3NjEsLTMwNC4wOTIxIDE3Ny40ODQ1LC0zMDcuOTQxIDE3Ny40ODQ1LC0zMDcuOTQxIDE3Ny40ODQ1LC0zMDcuOTQxIDE4MC42NzYxLC0zMDQuMDkyMSAxNzQuMDIwNSwtMzA1LjA2ODYgMTgzLjg2NzYsLTMwMC4yNDMxIDE4My44Njc2LC0zMDAuMjQzMSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTc2LjA5NDIiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXYmIzQ1OyZndDt0cmF2ZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXYmIzQ1OyZndDt0cmF2ZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGQ9Ik0yMDIuMjM2OSwtMzU1LjA4OTdDMjAyLjIzNjksLTM0MS42MDQ2IDIwMi4yMzY5LC0zMjUuNzEyMyAyMDIuMjM2OSwtMzEyLjQxNTMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIyMDUuNzM3LC0zMTIuNDAzMyAyMDIuMjM2OSwtMzAyLjQwMzMgMTk4LjczNywtMzEyLjQwMzQgMjA1LjczNywtMzEyLjQwMzMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwNy4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2JiM0NTsmZ3Q7dHJhMiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0NyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXYmIzQ1OyZndDt0cmEyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTIxMy4wMTYzLC00MTIuOTM4OEMyMTUuNDAwMiwtNDE5LjIyMjggMjE3LjkwOSwtNDI1Ljg1MTQgMjIwLjIzNjksLTQzMi4wMzEzIDIyMy40Mzc1LC00NDAuNTI4MiAyMjYuODYxOSwtNDQ5LjY2MzYgMjMwLjA5MjQsLTQ1OC4zMDI1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjMzLjYzNTIsLTQ2Ny43ODQ1IDIyNS45MTk3LC00NTkuOTkyIDIzMS44ODUxLC00NjMuMTAwNyAyMzAuMTM1MSwtNDU4LjQxNyAyMzAuMTM1MSwtNDU4LjQxNyAyMzAuMTM1MSwtNDU4LjQxNyAyMzEuODg1MSwtNDYzLjEwMDcgMjM0LjM1MDUsLTQ1Ni44NDE5IDIzMy42MzUyLC00NjcuNzg0NSAyMzMuNjM1MiwtNDY3Ljc4NDUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI0NC45MDUyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwQjg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZSYjNDU7Jmd0O3RyYXYgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNDYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZSYjNDU7Jmd0O3RyYXY8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjA4LjkwMjQsLTMwMi40NzIyQzIxMC42NzgyLC0zMDguMTMxNyAyMTIuMzQ4NywtMzE0LjQ1MzUgMjEzLjIzNjksLTMyMC40IDIxNC40NzI0LC0zMjguNjcxMyAyMTQuMDc2NiwtMzM3LjUyMTMgMjEyLjg4ODgsLTM0NS45MjYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMTEuMTAzNiwtMzU1Ljg4OCAyMDguNDM4MiwtMzQ1LjI1MDkgMjExLjk4NTYsLTM1MC45NjY0IDIxMi44Njc2LC0zNDYuMDQ0OCAyMTIuODY3NiwtMzQ2LjA0NDggMjEyLjg2NzYsLTM0Ni4wNDQ4IDIxMS45ODU2LC0zNTAuOTY2NCAyMTcuMjk3LC0zNDYuODM4NiAyMTEuMTAzNiwtMzU1Ljg4OCAyMTEuMTAzNiwtMzU1Ljg4OCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjMyLjkwNTIiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDBCOTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSIyMDIuMjM2OSIgY3k9Ii0xOTUuNiIgcng9IjM4Ljg2NzEiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAyLjIzNjkiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4weDBCQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlJiM0NTsmZ3Q7dHJhdmVyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmUmIzQ1OyZndDt0cmF2ZXI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMTg1LjMyNCwtMjY4LjMyQzE4MC4zOTk1LC0yNjIuNTYwNSAxNzUuNjU0MywtMjU1LjY3ODQgMTczLjA3NjMsLTI0OC40IDE3MC41ODM0LC0yNDEuMzYxOCAxNzAuNTgzNCwtMjM4LjYzODIgMTczLjA3NjMsLTIzMS42IDE3NC40OTYyLC0yMjcuNTkxMiAxNzYuNTczNSwtMjIzLjcwMjYgMTc4Ljk3NjIsLTIyMC4wNTU2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTg1LjAxNjQsLTIxMi4wNDE1IDE4Mi41OTExLC0yMjIuNzM1OCAxODIuMDA3LC0yMTYuMDM0NCAxNzguOTk3NSwtMjIwLjAyNzMgMTc4Ljk5NzUsLTIyMC4wMjczIDE3OC45OTc1LC0yMjAuMDI3MyAxODIuMDA3LC0yMTYuMDM0NCAxNzUuNDAzOSwtMjE3LjMxODggMTg1LjAxNjQsLTIxMi4wNDE1IDE4NS4wMTY0LC0yMTIuMDQxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTc3LjMxNzIiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlJiM0NTsmZ3Q7dHJhdmVyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTM3IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmUmIzQ1OyZndDt0cmF2ZXI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNMjAyLjIzNjksLTI2Ni4wMDA2QzIwMi4yMzY5LC0yNTMuODk0OSAyMDIuMjM2OSwtMjM3LjgwNzYgMjAyLjIzNjksLTIyNC4wNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iMjA1LjczNywtMjIzLjY3MiAyMDIuMjM2OSwtMjEzLjY3MiAxOTguNzM3LC0yMjMuNjcyMSAyMDUuNzM3LC0yMjMuNjcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDYuMzE3MiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyJiM0NTsmZ3Q7dHJhdmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNDUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXImIzQ1OyZndDt0cmF2ZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMDcuNjkzNywtMjEzLjc1MDlDMjA5LjE0NjcsLTIxOS40MTM2IDIxMC41MTI3LC0yMjUuNzE3NCAyMTEuMjM2OSwtMjMxLjYgMjEyLjE0OTIsLTIzOS4wMTA3IDIxMi4xNDkyLC0yNDAuOTg5MyAyMTEuMjM2OSwtMjQ4LjQgMjEwLjkyMDEsLTI1MC45NzM2IDIxMC40ODA0LC0yNTMuNjI3OSAyMDkuOTY0MywtMjU2LjI3MzgiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMDcuNjkzNywtMjY2LjI0OTEgMjA1LjUyNTUsLTI1NS40OTk3IDIwOC44MDM1LC0yNjEuMzczOCAyMDkuOTEzMiwtMjU2LjQ5ODUgMjA5LjkxMzIsLTI1Ni40OTg1IDIwOS45MTMyLC0yNTYuNDk4NSAyMDguODAzNSwtMjYxLjM3MzggMjE0LjMwMSwtMjU3LjQ5NzMgMjA3LjY5MzcsLTI2Ni4yNDkxIDIwNy42OTM3LC0yNjYuMjQ5MSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjMyLjQ1ODUiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDBCQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTciIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjIwMy4yMzY5IiBjeT0iLTEwNi44IiByeD0iMzguMzA1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwMy4yMzY5IiB5PSItMTAyLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+MHgwQkI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXImIzQ1OyZndDt0cmF2ZXJzIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyJiM0NTsmZ3Q7dHJhdmVyczwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xODMuOTg1NCwtMTc5LjY2NThDMTc0LjY5NjUsLTE2OS41Mzk3IDE2Ni4zMTM3LC0xNTUuOTExNiAxNzEuMjkyMywtMTQyLjggMTcyLjkzODUsLTEzOC40NjQ1IDE3NS4zNzIzLC0xMzQuMzE2OSAxNzguMTc0OSwtMTMwLjQ3OTMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIxODQuNzM2NywtMTIyLjYyMTMgMTgxLjc4MTIsLTEzMy4xODE0IDE4MS41MzE5LC0xMjYuNDU5MiAxNzguMzI3MSwtMTMwLjI5NzEgMTc4LjMyNzEsLTEzMC4yOTcxIDE3OC4zMjcxLC0xMzAuMjk3MSAxODEuNTMxOSwtMTI2LjQ1OTIgMTc0Ljg3MywtMTI3LjQxMjggMTg0LjczNjcsLTEyMi42MjEzIDE4NC43MzY3LC0xMjIuNjIxMyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTc2LjcwOTIiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXImIzQ1OyZndDt0cmF2ZXJzIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTM4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyJiM0NTsmZ3Q7dHJhdmVyczwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGQ9Ik0yMDIuNDQ0MSwtMTc3LjIwMDZDMjAyLjU4MDQsLTE2NS4wOTQ5IDIwMi43NjE2LC0xNDkuMDA3NiAyMDIuOTE2MywtMTM1LjI2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIyMDYuNDIwNSwtMTM0LjkxMDggMjAzLjAzMzQsLTEyNC44NzIgMTk5LjQyMDksLTEzNC44MzE5IDIwNi40MjA1LC0xMzQuOTEwOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjA3LjcwOTIiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQ0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVycyYjNDU7Jmd0O3RyYXZlcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMDkuMDY2NiwtMTI0LjgzNzZDMjExLjY2MzgsLTEzNS4wMTg2IDIxMy44MTkzLC0xNDcuOTkwOCAyMTIuMjM2OSwtMTU5LjYgMjExLjg3MTcsLTE2Mi4yNzkzIDIxMS4zNjAyLC0xNjUuMDQwNyAyMTAuNzU5OSwtMTY3Ljc4NjMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMDguMjk4MywtMTc3LjQ4NjYgMjA2LjM5NjMsLTE2Ni42ODY5IDIwOS41MjgyLC0xNzIuNjQwMiAyMTAuNzU4LC0xNjcuNzkzOCAyMTAuNzU4LC0xNjcuNzkzOCAyMTAuNzU4LC0xNjcuNzkzOCAyMDkuNTI4MiwtMTcyLjY0MDIgMjE1LjExOTgsLTE2OC45MDA3IDIwOC4yOTgzLC0xNzcuNDg2NiAyMDguMjk4MywtMTc3LjQ4NjYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzMy4wNzM1IiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MEJCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyc2UgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTgiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSIyMDMuMjM2OSIgY3k9Ii0xOCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAzLjIzNjkiIHk9Ii0xMy44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPmNvbnRlbnRBcnJheVszXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnMmIzQ1OyZndDt0cmF2ZXJzZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcnMmIzQ1OyZndDt0cmF2ZXJzZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xODQuODY3NiwtOTAuOTU2OUMxNzkuNTEzNSwtODUuMjEzMiAxNzQuMzQ3NCwtNzguMjgwNSAxNzEuNTIyMywtNzAuOCAxNjguODg0MywtNjMuODE0OSAxNjguODg0MywtNjAuOTg1MSAxNzEuNTIyMywtNTQgMTcyLjg2NjgsLTUwLjQzOTkgMTc0Ljc0MTUsLTQ3LjAwNCAxNzYuOTE0NCwtNDMuNzYxMiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjE4My4yMDMsLTM1LjY3NiAxODAuNjE1NSwtNDYuMzMyMyAxODAuMTMzMiwtMzkuNjIyNyAxNzcuMDYzNCwtNDMuNTY5NSAxNzcuMDYzNCwtNDMuNTY5NSAxNzcuMDYzNCwtNDMuNTY5NSAxODAuMTMzMiwtMzkuNjIyNyAxNzMuNTExNCwtNDAuODA2NyAxODMuMjAzLC0zNS42NzYgMTgzLjIwMywtMzUuNjc2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNzcuMDk0MiIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyc2UgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyc2U8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNMjAzLjIzNjksLTg4LjQwMDZDMjAzLjIzNjksLTc2LjI5NDkgMjAzLjIzNjksLTYwLjIwNzYgMjAzLjIzNjksLTQ2LjQ2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIyMDYuNzM3LC00Ni4wNzIgMjAzLjIzNjksLTM2LjA3MiAxOTkuNzM3LC00Ni4wNzIxIDIwNi43MzcsLTQ2LjA3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjA4LjA5NDIiIHk9Ii01OC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyc2UmIzQ1OyZndDt0cmF2ZXJzIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyc2UmIzQ1OyZndDt0cmF2ZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTIwOS45MDI0LC0zNi4wNzIyQzIxMS42NzgyLC00MS43MzE3IDIxMy4zNDg3LC00OC4wNTM1IDIxNC4yMzY5LC01NCAyMTUuMzM5OSwtNjEuMzg0NyAyMTUuMzM5OSwtNjMuNDE1MyAyMTQuMjM2OSwtNzAuOCAyMTMuODM0NCwtNzMuNDk0NSAyMTMuMjcxMywtNzYuMjY2MSAyMTIuNjEwNiwtNzkuMDE4MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjIwOS45MDI0LC04OC43Mjc4IDIwOC4yNTQ2LC03Ny44ODY0IDIxMS4yNDU4LC04My45MTE2IDIxMi41ODkxLC03OS4wOTU0IDIxMi41ODkxLC03OS4wOTU0IDIxMi41ODkxLC03OS4wOTU0IDIxMS4yNDU4LC04My45MTE2IDIxNi45MjM3LC04MC4zMDQ0IDIwOS45MDI0LC04OC43Mjc4IDIwOS45MDI0LC04OC43Mjc4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjQuMjczMiIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+IH4zPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhMiYjNDU7Jmd0O3RyYWMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEyJiM0NTsmZ3Q7dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGQ9Ik0yMTYuMDIzLC00NzUuMjQ5OUMxODkuMjIwNywtNDU1LjMwMzQgMTQ5LjE0NTYsLTQyNS40NzkyIDEyMi4zNjk5LC00MDUuNTUyNSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDBmZiIgc3Ryb2tlPSIjMDAwMGZmIiBwb2ludHM9IjEyNC4yODk0LC00MDIuNjE4MSAxMTQuMTc3NSwtMzk5LjQ1NTYgMTIwLjExMDIsLTQwOC4yMzM3IDEyNC4yODk0LC00MDIuNjE4MSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTgzLjA5NDIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gYzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYTImIzQ1OyZndDt0cmUgLS0+CisgICAgICAgIDwhLS0gdHJhMiYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQ4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhMiYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTI0MC40OTQ0LC01MjUuNjMwNUMyNDAuNDc4OSwtNTM3LjQxOSAyNDIuNDk4LC01NTAuNTM0NCAyNDkuNTc3NywtNTYwLjQ2MjYgMjYzLjc2NzksLTU4MC4zNjIyIDI4OC4yMTc2LC01OTIuMDE4NiAzMTAuMjMzOCwtNTk4Ljc4OTkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIzMjAuMTMyNiwtNjAxLjU2OTQgMzA5LjI4ODMsLTYwMy4xOTg0IDMxNS4zMTg3LC02MDAuMjE3NyAzMTAuNTA0OSwtNTk4Ljg2NiAzMTAuNTA0OSwtNTk4Ljg2NiAzMTAuNTA0OSwtNTk4Ljg2NiAzMTUuMzE4NywtNjAwLjIxNzcgMzExLjcyMTQsLTU5NC41MzM1IDMyMC4xMzI2LC02MDEuNTY5NCAzMjAuMTMyNiwtNjAxLjU2OTQiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI3MC4wNjY1IiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwREU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEyJiM0NTsmZ3Q7dHJhdiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYTImIzQ1OyZndDt0cmF2PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgZD0iTTIyMi42NTksLTQ3MS41ODIzQzIxNy42MzUsLTQ2NC42Mzg3IDIxMi44NTAzLC00NTYuNzk1OSAyMDkuNzM2OSwtNDQ4LjgzMTMgMjA2LjcxNTQsLTQ0MS4xMDE5IDIwNC44MTM2LC00MzIuNDgwNiAyMDMuNjM2OCwtNDI0LjEyNzUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIyMDcuMTExNSwtNDIzLjcwNDUgMjAyLjUzNDQsLTQxNC4xNDk0IDIwMC4xNTM4LC00MjQuNDczMyAyMDcuMTExNSwtNDIzLjcwNDUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNS40ODY5IiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHY8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cnUmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U1NCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRydSYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTU2Ni41ODQyLC01MjQuMDg4QzU1OC45OTM2LC01MzYuODk4NSA1NDguNDA0MSwtNTUxLjI2MDggNTM1LjIzNjksLTU2MC40NjI2IDQ5Ni42NTk4LC01ODcuNDIxNyA0NDMuNjEzLC01OTkuMDU0NiA0MDUuNDgxLC02MDQuMDczIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMzk1LjE0NTcsLTYwNS4zMjAzIDQwNC41MzQ0LC01OTkuNjU0NSA0MDAuMTA5NywtNjA0LjcyMTIgNDA1LjA3MzYsLTYwNC4xMjIxIDQwNS4wNzM2LC02MDQuMTIyMSA0MDUuMDczNiwtNjA0LjEyMjEgNDAwLjEwOTcsLTYwNC43MjEyIDQwNS42MTI4LC02MDguNTg5NyAzOTUuMTQ1NywtNjA1LjMyMDMgMzk1LjE0NTcsLTYwNS4zMjAzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI1NzEuNjgxNSIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MEZBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJ1JiM0NTsmZ3Q7dHJ1YyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRydSYjNDU7Jmd0O3RydWM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNNTg0LjkwNiwtNDY3LjAxMTdDNTg3Ljg4NzIsLTQ1NS4yNDcgNTkyLjcyMjUsLTQ0Mi4xMDk0IDYwMC41MjIzLC00MzIuMDMxMyA2MTAuNTY3NCwtNDE5LjA1MTkgNjI1LjI0NTEsLTQwOC43MDExIDYzOS4wMDkyLC00MDEuMDIzNSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjY0Ny44NjQ0LC0zOTYuMzYzNSA2NDEuMTEwNiwtNDA1LjAwMjggNjQzLjQzOTcsLTM5OC42OTIgNjM5LjAxNDksLTQwMS4wMjA1IDYzOS4wMTQ5LC00MDEuMDIwNSA2MzkuMDE0OSwtNDAxLjAyMDUgNjQzLjQzOTcsLTM5OC42OTIgNjM2LjkxOTMsLTM5Ny4wMzgzIDY0Ny44NjQ0LC0zOTYuMzYzNSA2NDcuODY0NCwtMzk2LjM2MzUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjYwNS4wOTQyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cnUmIzQ1OyZndDt0cnVjIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQxIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJ1JiM0NTsmZ3Q7dHJ1YzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGQ9Ik02MDEuNTQyNCwtNDcxLjQ3MjNDNjE3LjUxNzcsLTQ1Mi44OTU4IDYzOS4yNzc0LC00MjcuNTkzMSA2NTUuMTg5OCwtNDA5LjA4OTciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSI2NTcuOTY1NiwtNDExLjIyOTggNjYxLjgzMjMsLTQwMS4zNjU3IDY1Mi42NTgzLC00MDYuNjY1NiA2NTcuOTY1NiwtNDExLjIyOTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjYzOC4wOTQyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cnVjJiM0NTsmZ3Q7dHJ1IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTUzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJ1YyYjNDU7Jmd0O3RydTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik02NzAuOTczMSwtNDAyLjY0NjJDNjY2LjMyNjMsLTQxNi4zNjI1IDY1OC41MjEzLC00MzUuMTQ2NCA2NDcuMjM2OSwtNDQ4LjgzMTMgNjM5LjY2NDEsLTQ1OC4wMTUgNjI5Ljg5OTksLTQ2Ni4yNTM4IDYyMC4xODA2LC00NzMuMTg2NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjYxMS43MDcxLC00NzguOTMzNiA2MTcuNDU3MiwtNDY5LjU5NjIgNjE1Ljg0NTIsLTQ3Ni4xMjcgNjE5Ljk4MzIsLTQ3My4zMjA0IDYxOS45ODMyLC00NzMuMzIwNCA2MTkuOTgzMiwtNDczLjMyMDQgNjE1Ljg0NTIsLTQ3Ni4xMjcgNjIyLjUwOTEsLTQ3Ny4wNDQ2IDYxMS43MDcxLC00NzguOTMzNiA2MTEuNzA3MSwtNDc4LjkzMzYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjY3Ni4yOTY1IiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwRkI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cnVjayAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUyMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRydWNrPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjY3Ni4yMzY5IiBjeT0iLTI4NC40IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2NzYuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPmNvbnRlbnRBcnJheVs0XTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRydWMmIzQ1OyZndDt0cnVjayAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRydWMmIzQ1OyZndDt0cnVjazwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik02NjEuMTI0NywtMzY3Ljk0MTZDNjU0LjM5OTMsLTM1OS40MDE4IDY0Ny4yMjIsLTM0OC40NDg5IDY0My43MzY5LC0zMzcuMiA2NDEuNTI3MiwtMzMwLjA2NzggNjQxLjA1NjUsLTMyNy4zNjkgNjQzLjczNjksLTMyMC40IDY0NS4xNTg1LC0zMTYuNzAzOSA2NDcuMTU0NywtMzEzLjE1MDcgNjQ5LjQ2NjMsLTMwOS44MTI5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iNjU1LjcxNDgsLTMwMi4wMDAyIDY1Mi45ODMxLC0zMTIuNjIwNCA2NTIuNTkxOCwtMzA1LjkwNDkgNjQ5LjQ2ODksLTMwOS44MDk3IDY0OS40Njg5LC0zMDkuODA5NyA2NDkuNDY4OSwtMzA5LjgwOTcgNjUyLjU5MTgsLTMwNS45MDQ5IDY0NS45NTQ2LC0zMDYuOTk5IDY1NS43MTQ4LC0zMDIuMDAwMiA2NTUuNzE0OCwtMzAyLjAwMDIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjY0OC40ODY5IiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGs8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cnVjJiM0NTsmZ3Q7dHJ1Y2sgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNDIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cnVjJiM0NTsmZ3Q7dHJ1Y2s8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNNjc2LjIzNjksLTM2Ni4yMzQ1QzY3Ni4yMzY5LC0zNTEuMjYwMyA2NzYuMjM2OSwtMzI5Ljg2NDMgNjc2LjIzNjksLTMxMi43MDU1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iNjc5LjczNywtMzEyLjY2NDUgNjc2LjIzNjksLTMwMi42NjQ2IDY3Mi43MzcsLTMxMi42NjQ2IDY3OS43MzcsLTMxMi42NjQ1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI2ODEuNDg2OSIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBrPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJ1Y2smIzQ1OyZndDt0cnVjIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTUyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJ1Y2smIzQ1OyZndDt0cnVjPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTY4My41MDYxLC0zMDIuNDI3NUM2ODUuNDQzMiwtMzA4LjA4NTIgNjg3LjI2NiwtMzE0LjQxNzIgNjg4LjIzNjksLTMyMC40IDY5MC4xODQyLC0zMzIuMzk5NyA2ODguMzk3MSwtMzQ1LjYwODYgNjg1LjY2MTQsLTM1Ni45MTAzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iNjgyLjk2MjMsLTM2Ni42NjM5IDY4MS4yOTI0LC0zNTUuODI1OSA2ODQuMjk1OCwtMzYxLjg0NSA2ODUuNjI5NCwtMzU3LjAyNjEgNjg1LjYyOTQsLTM1Ny4wMjYxIDY4NS42Mjk0LC0zNTcuMDI2MSA2ODQuMjk1OCwtMzYxLjg0NSA2ODkuOTY2NCwtMzU4LjIyNjMgNjgyLjk2MjMsLTM2Ni42NjM5IDY4Mi45NjIzLC0zNjYuNjYzOSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjk1LjUyMzIiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj5+NDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLmcxLnN2ZyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5nMS5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzYjMyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5nMS5zdmcKQEAgLTAsMCArMSw3NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgorPCEtLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBHZW5lcmF0ZWQgYnkgZ3JhcGh2aXogdmVyc2lvbiAyLjQwLjEgKDIwMTYxMjI1LjAzMDQpCisgLS0+Cis8IS0tIFRpdGxlOiBHIFBhZ2VzOiAxIC0tPgorPHN2ZyB3aWR0aD0iMTU0cHQiIGhlaWdodD0iMzEwcHQiCisgICAgIHZpZXdCb3g9IjAuMDAgMC4wMCAxNTQuNDcgMzEwLjQwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KKyAgICA8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMSAxKSByb3RhdGUoMCkgdHJhbnNsYXRlKDQgMzA2LjQpIj4KKyAgICAgICAgPHRpdGxlPkc8L3RpdGxlPgorICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9InRyYW5zcGFyZW50IiBwb2ludHM9Ii00LDQgLTQsLTMwNi40IDE1MC40NzM4LC0zMDYuNCAxNTAuNDczOCw0IC00LDQiLz4KKyAgICAgICAgPCEtLSAweDEzQiAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxM0I8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xMDYuOCIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTEwMi42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MTNCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gY29udGVudEFycmF5WzBdIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5jb250ZW50QXJyYXlbMF08L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xOCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTEzLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzBdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgxM0ImIzQ1OyZndDtjb250ZW50QXJyYXlbMF0gLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4MTNCJiM0NTsmZ3Q7Y29udGVudEFycmF5WzBdPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTczLjIzNjksLTg4LjQwMDZDNzMuMjM2OSwtNzYuMjk0OSA3My4yMzY5LC02MC4yMDc2IDczLjIzNjksLTQ2LjQ2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI3Ni43MzcsLTQ2LjA3MiA3My4yMzY5LC0zNi4wNzIgNjkuNzM3LC00Ni4wNzIxIDc2LjczNywtNDYuMDcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI4MS43OTAyIiB5PSItNTguMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7QTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MTNBIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDEzQTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTE5NS42IiByeD0iMzcuMTQ0MyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTkxLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgxM0E8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDEzQSYjNDU7Jmd0OzB4MTNCIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDEzQSYjNDU7Jmd0OzB4MTNCPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTczLjIzNjksLTE3Ny4yMDA2QzczLjIzNjksLTE2NS4wOTQ5IDczLjIzNjksLTE0OS4wMDc2IDczLjIzNjksLTEzNS4yNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNzYuNzM3LC0xMzQuODcyIDczLjIzNjksLTEyNC44NzIgNjkuNzM3LC0xMzQuODcyMSA3Ni43MzcsLTEzNC44NzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjgxLjQwNTIiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwO0g8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDEzOSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxMzk8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0yODQuNCIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MTM5PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgxMzkmIzQ1OyZndDsweDEzQSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxMzkmIzQ1OyZndDsweDEzQTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik03My4yMzY5LC0yNjYuMDAwNkM3My4yMzY5LC0yNTMuODk0OSA3My4yMzY5LC0yMzcuODA3NiA3My4yMzY5LC0yMjQuMDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijc2LjczNywtMjIzLjY3MiA3My4yMzY5LC0yMTMuNjcyIDY5LjczNywtMjIzLjY3MjEgNzYuNzM3LC0yMjMuNjcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI4MS40MDUyIiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwO0M8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5nMi5zdmcgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQuZzIuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YzdlZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQuZzIuc3ZnCkBAIC0wLDAgKzEsMTE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cis8IS0tLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDAuMSAoMjAxNjEyMjUuMDMwNCkKK3N0cmljdCBkaWdyYXBoIEcgeworICAiMHgxMzkiIFtjb2xvcj1ncmV5LGZvbnRjb2xvcj1ncmV5XTsKKworICAiMHgxM0IiIC0+ICJjb250ZW50QXJyYXlbMF0iIFtsYWJlbD0iICBBIl07CisgICIweDEzQSIgLT4gIjB4MTNCIiBbbGFiZWw9IiAgSCJdOworICAiMHgxMzkiIC0+ICIweDEzQSIgW2xhYmVsPSIgIEMiLGNvbG9yPSJncmV5Iixmb250Y29sb3I9ImdyZXkiXTsKKworICAiMHgyNUUiIC0+ICIweDIzOCIgW2xhYmVsPSIgIEEiXTsKKyAgIjB4MjVFIiAtPiAiMHgxM0EiIFtsYWJlbD0iICBDIl07CisvLyAgICIweDI1RSIgLT4gIjB4MzNCIiBbbGFiZWw9IiAgNSJdOworLy8gICAiMHgyNUUiIC0+ICIweDM1QyIgW2xhYmVsPSIgIEIiXTsKKy8vICAgIjB4MjVFIiAtPiAiMHgzN0EiIFtsYWJlbD0iICBQIl07CisvLyAgICIweDI1RSIgLT4gIjB4NDFCIiBbbGFiZWw9IiAgMyJdOworfQorIC0tPgorPCEtLSBUaXRsZTogRyBQYWdlczogMSAtLT4KKzxzdmcgd2lkdGg9IjIwN3B0IiBoZWlnaHQ9IjMxMHB0IgorICAgICB2aWV3Qm94PSIwLjAwIDAuMDAgMjA3LjQ5IDMxMC40MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CisgICAgPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDMwNi40KSI+CisgICAgICAgIDx0aXRsZT5HPC90aXRsZT4KKyAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgcG9pbnRzPSItNCw0IC00LC0zMDYuNCAyMDMuNDg2NywtMzA2LjQgMjAzLjQ4NjcsNCAtNCw0Ii8+CisgICAgICAgIDwhLS0gMHgxMzkgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4MTM5PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2MwYzBjMCIgY3g9IjczLjIzNjkiIGN5PSItMjg0LjQiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjYzBjMGMwIj4weDEzOTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MTNBIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTQiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDEzQTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTE5NS42IiByeD0iMzcuMTQ0MyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTkxLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgxM0E8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDEzOSYjNDU7Jmd0OzB4MTNBIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDEzOSYjNDU7Jmd0OzB4MTNBPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2MwYzBjMCIgZD0iTTczLjIzNjksLTI2Ni4wMDA2QzczLjIzNjksLTI1My44OTQ5IDczLjIzNjksLTIzNy44MDc2IDczLjIzNjksLTIyNC4wNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYzBjMGMwIiBzdHJva2U9IiNjMGMwYzAiIHBvaW50cz0iNzYuNzM3LC0yMjMuNjcyIDczLjIzNjksLTIxMy42NzIgNjkuNzM3LC0yMjMuNjcyMSA3Ni43MzcsLTIyMy42NzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjgxLjQwNTIiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjYzBjMGMwIj4gJiMxNjA7QzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MTNCIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDEzQjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTEwNi44IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTAyLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgxM0I8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSBjb250ZW50QXJyYXlbMF0gLS0+CisgICAgICAgIDxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPmNvbnRlbnRBcnJheVswXTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTE4IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTMuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMF08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDEzQiYjNDU7Jmd0O2NvbnRlbnRBcnJheVswXSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxM0ImIzQ1OyZndDtjb250ZW50QXJyYXlbMF08L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNzMuMjM2OSwtODguNDAwNkM3My4yMzY5LC03Ni4yOTQ5IDczLjIzNjksLTYwLjIwNzYgNzMuMjM2OSwtNDYuNDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijc2LjczNywtNDYuMDcyIDczLjIzNjksLTM2LjA3MiA2OS43MzcsLTQ2LjA3MjEgNzYuNzM3LC00Ni4wNzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjgxLjc5MDIiIHk9Ii01OC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDtBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgxM0EmIzQ1OyZndDsweDEzQiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxM0EmIzQ1OyZndDsweDEzQjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik03My4yMzY5LC0xNzcuMjAwNkM3My4yMzY5LC0xNjUuMDk0OSA3My4yMzY5LC0xNDkuMDA3NiA3My4yMzY5LC0xMzUuMjY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijc2LjczNywtMTM0Ljg3MiA3My4yMzY5LC0xMjQuODcyIDY5LjczNywtMTM0Ljg3MjEgNzYuNzM3LC0xMzQuODcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI4MS40MDUyIiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDtIPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgyNUUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4MjVFPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjE2My4yMzY5IiBjeT0iLTI4NC40IiByeD0iMzYuNTAxNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNjMuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MjVFPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgyNUUmIzQ1OyZndDsweDEzQSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgyNUUmIzQ1OyZndDsweDEzQTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0xNDYuNzI5NSwtMjY4LjExMjdDMTMyLjc3NDIsLTI1NC4zNDM1IDExMi42MDgzLC0yMzQuNDQ2NSA5Ni45MjkzLC0yMTguOTc2NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijk5LjIxNjIsLTIxNi4zMTYxIDg5LjYzOTYsLTIxMS43ODQgOTQuMjk5OCwtMjIxLjI5OSA5OS4yMTYyLC0yMTYuMzE2MSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTM1LjQwNTIiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7QzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MjM4IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTYiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDIzODwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIxNjQuMjM2OSIgY3k9Ii0xOTUuNiIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTY0LjIzNjkiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDIzODwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MjVFJiM0NTsmZ3Q7MHgyMzggLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4MjVFJiM0NTsmZ3Q7MHgyMzg8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMTYzLjQ0NDEsLTI2Ni4wMDA2QzE2My41ODA0LC0yNTMuODk0OSAxNjMuNzYxNiwtMjM3LjgwNzYgMTYzLjkxNjMsLTIyNC4wNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMTY3LjQyMDUsLTIyMy43MTA4IDE2NC4wMzM0LC0yMTMuNjcyIDE2MC40MjA5LC0yMjMuNjMxOSAxNjcuNDIwNSwtMjIzLjcxMDgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE3MS43OTAyIiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwO0E8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5nMy5zdmcgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQuZzMuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMzI2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQuZzMuc3ZnCkBAIC0wLDAgKzEsMjUzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cis8IS0tLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDAuMSAoMjAxNjEyMjUuMDMwNCkKKyMgaHR0cDovL3d3dy5ncmFwaHZpei5vcmcvY29udGVudC9jbHVzdGVyCisKK3N0cmljdCBkaWdyYXBoIEcgeworICAgICIweDUxQyI7CisKKyAgICBzdWJncmFwaCBjbHVzdGVyXzUxQyB7CisgICAgICAgIGxhYmVsPSAiU3BsaXQgbm9kZSAweDUxQyI7CisgICAgICAgIGNvbG9yPWdyZXk7CisgICAgICAgIG5vZGUgW3N0eWxlPWRhc2hlZF0gIjB4NTNDIiwgIjB4NTVDIiwgIjB4NTdDIiwgIjB4NTlDIiwgIjB4NUJDIjsKKworICAgICAgICAiMHg1MUMiIC0+ICIweDUzQyIgW2xhYmVsPSIgIDAwIl07CisgICAgICAgICIweDUxQyIgLT4gIjB4NTdDIiBbbGFiZWw9IiAgMDEiXTsKKyAgICAgICAgIjB4NTNDIiAtPiAiMHg1NUMiIFtsYWJlbD0iICAxMTAiXTsKKyAgICAgICAgIjB4NTdDIiAtPiAiMHg1OUMiIFtsYWJlbD0iICAwMDAiXTsKKyAgICAgICAgIjB4NTdDIiAtPiAiMHg1QkMiIFtsYWJlbD0iICAwMTAiXTsKKyAgICB9CisKKyAgICAiMHg1NUMiIC0+ICIweDQxQiIgW2xhYmVsPSIgIDAxMSJdOworICAgICIweDU1QyIgLT4gIjB4MzNCIiBbbGFiZWw9IiAgMTAxIl07CisgICAgIjB4NTlDIiAtPiAiMHgyMzgiIFtsYWJlbD0iICAwMDEiXTsKKyAgICAiMHg1OUMiIC0+ICIweDM1QyIgW2xhYmVsPSIgIDAxMCJdOworICAgICIweDU5QyIgLT4gIjB4MTNBIiBbbGFiZWw9IiAgMDExIl07CisgICAgIjB4NUJDIiAtPiAiMHgzN0EiIFtsYWJlbD0iICAwMDAiXTsKKyAgICAiMHg1QkMiIC0+ICIweDQ1NSIgW2xhYmVsPSIgIDAwMSJdOworCisgICAgIjB4MTNCIiAtPiAiY29udGVudEFycmF5WzBdIiBbbGFiZWw9IiAgQSJdOworICAgICIweDEzQSIgLT4gIjB4MTNCIiBbbGFiZWw9IiAgSCJdOworfQorCisgLS0+Cis8IS0tIFRpdGxlOiBHIFBhZ2VzOiAxIC0tPgorPHN2ZyB3aWR0aD0iNjI4cHQiIGhlaWdodD0iNjA1cHQiCisgICAgIHZpZXdCb3g9IjAuMDAgMC4wMCA2MjcuOTcgNjA0LjgwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KKyAgICA8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMSAxKSByb3RhdGUoMCkgdHJhbnNsYXRlKDQgNjAwLjgpIj4KKyAgICAgICAgPHRpdGxlPkc8L3RpdGxlPgorICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9InRyYW5zcGFyZW50IiBwb2ludHM9Ii00LDQgLTQsLTYwMC44IDYyMy45Njk1LC02MDAuOCA2MjMuOTY5NSw0IC00LDQiLz4KKyAgICAgICAgPGcgaWQ9ImNsdXN0MSIgY2xhc3M9ImNsdXN0ZXIiPgorICAgICAgICAgICAgPHRpdGxlPmNsdXN0ZXJfNTFDPC90aXRsZT4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2MwYzBjMCIgcG9pbnRzPSIxNzcuNzkwNiwtMjU4LjQgMTc3Ljc5MDYsLTU4OC44IDQ0NC43OTA2LC01ODguOCA0NDQuNzkwNiwtMjU4LjQgMTc3Ljc5MDYsLTI1OC40Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMTEuMjkwNiIgeT0iLTU3Mi4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPlNwbGl0IG5vZGUgMHg1MUM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDUxQyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1MUM8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjY0Ljc5MDYiIGN5PSItNTM4IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNjQuNzkwNiIgeT0iLTUzMy44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4NTFDPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1M0MgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTNDPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLWRhc2hhcnJheT0iNSwyIiBjeD0iMjIwLjc5MDYiIGN5PSItNDExLjIiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMC43OTA2IiB5PSItNDA3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4NTNDPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1MUMmIzQ1OyZndDsweDUzQyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1MUMmIzQ1OyZndDsweDUzQzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yNTguNTc5OCwtNTIwLjEwMTZDMjUxLjIwOTUsLTQ5OC44NjE2IDIzOC44NDIxLC00NjMuMjIxMSAyMzAuMjcyNiwtNDM4LjUyNTQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyMzMuNTU0NywtNDM3LjMwNzMgMjI2Ljk2OTgsLTQyOS4wMDc0IDIyNi45NDE2LC00MzkuNjAyMiAyMzMuNTU0NywtNDM3LjMwNzMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI1Ni4yOTA2IiB5PSItNDcwLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAwPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1N0MgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTdDPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLWRhc2hhcnJheT0iNSwyIiBjeD0iMzA4Ljc5MDYiIGN5PSItNDExLjIiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMwOC43OTA2IiB5PSItNDA3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4NTdDPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1MUMmIzQ1OyZndDsweDU3QyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1MUMmIzQ1OyZndDsweDU3QzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yNzEuMDAxNCwtNTIwLjEwMTZDMjc4LjM3MTgsLTQ5OC44NjE2IDI5MC43MzkxLC00NjMuMjIxMSAyOTkuMzA4NiwtNDM4LjUyNTQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzMDIuNjM5NywtNDM5LjYwMjIgMzAyLjYxMTQsLTQyOS4wMDc0IDI5Ni4wMjY1LC00MzcuMzA3MyAzMDIuNjM5NywtNDM5LjYwMjIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMwMC4yOTA2IiB5PSItNDcwLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAxPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1NUMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTVDPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLWRhc2hhcnJheT0iNSwyIiBjeD0iMjIwLjc5MDYiIGN5PSItMjg0LjQiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMC43OTA2IiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg1NUM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDUzQyYjNDU7Jmd0OzB4NTVDIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDUzQyYjNDU7Jmd0OzB4NTVDPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTIyMC43OTA2LC0zOTMuMDMyN0MyMjAuNzkwNiwtMzcyLjAzNTIgMjIwLjc5MDYsLTMzNy4yMjYxIDIyMC43OTA2LC0zMTIuNjc5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjI0LjI5MDcsLTMxMi41MzM2IDIyMC43OTA2LC0zMDIuNTMzNiAyMTcuMjkwNywtMzEyLjUzMzcgMjI0LjI5MDcsLTMxMi41MzM2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzQuNzkwNiIgeT0iLTM0My42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDsxMTA8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDQxQiAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU3IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg0MUI8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzYuNzkwNiIgY3k9Ii0xOTUuNiIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzYuNzkwNiIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4NDFCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1NUMmIzQ1OyZndDsweDQxQiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1NUMmIzQ1OyZndDsweDQxQjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0xOTIuNTk5LC0yNzMuNDA4N0MxNzUuNjYwNiwtMjY2LjYwNTMgMTUzLjc4MDIsLTI1Ny40NjM1IDEzNC43OTA2LC0yNDguNCAxMTIuNzU3MiwtMjM3Ljg4MzcgODguNjA1MywtMjI0Ljg4OSA2OS43OTEsLTIxNC40MjI2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNzEuNDUxOCwtMjExLjM0MTIgNjEuMDE2NCwtMjA5LjUwOTcgNjguMDMxOSwtMjE3LjQ0OSA3MS40NTE4LC0yMTEuMzQxMiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTQ4Ljc5MDYiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7MDExPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgzM0IgLS0+CisgICAgICAgIDxnIGlkPSJub2RlOCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4MzNCPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjEyOC43OTA2IiBjeT0iLTE5NS42IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMjguNzkwNiIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MzNCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1NUMmIzQ1OyZndDsweDMzQiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U3IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1NUMmIzQ1OyZndDsweDMzQjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMDMuOTE2NCwtMjY4LjExMjdDMTg5LjY1MSwtMjU0LjM0MzUgMTY5LjAzNywtMjM0LjQ0NjUgMTUzLjAwOTUsLTIxOC45NzY1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMTU1LjE4MzcsLTIxNi4yMTA2IDE0NS41NTc5LC0yMTEuNzg0IDE1MC4zMjIzLC0yMjEuMjQ3MiAxNTUuMTgzNywtMjE2LjIxMDYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE5Ny43OTA2IiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzEwMTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTlDIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTUiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDU5QzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1kYXNoYXJyYXk9IjUsMiIgY3g9IjMwOC43OTA2IiBjeT0iLTI4NC40IiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMDguNzkwNiIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4NTlDPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1N0MmIzQ1OyZndDsweDU5QyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1N0MmIzQ1OyZndDsweDU5QzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zMDguNzkwNiwtMzkzLjAzMjdDMzA4Ljc5MDYsLTM3Mi4wMzUyIDMwOC43OTA2LC0zMzcuMjI2MSAzMDguNzkwNiwtMzEyLjY3OSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjMxMi4yOTA3LC0zMTIuNTMzNiAzMDguNzkwNiwtMzAyLjUzMzYgMzA1LjI5MDcsLTMxMi41MzM3IDMxMi4yOTA3LC0zMTIuNTMzNiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzIyLjc5MDYiIHk9Ii0zNDMuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7MDAwPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1QkMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4NUJDPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLWRhc2hhcnJheT0iNSwyIiBjeD0iMzk5Ljc5MDYiIGN5PSItMjg0LjQiIHJ4PSIzNy4xNDQzIiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM5OS43OTA2IiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg1QkM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDU3QyYjNDU7Jmd0OzB4NUJDIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDU3QyYjNDU7Jmd0OzB4NUJDPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTMyMS4wNjMzLC0zOTQuMDk5MkMzMzYuNTk5NSwtMzcyLjQ1MSAzNjMuNTAwMiwtMzM0Ljk2NzQgMzgxLjQ3MSwtMzA5LjkyNjciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzODQuNDM0NywtMzExLjc5OTkgMzg3LjQyMTgsLTMwMS42MzQ4IDM3OC43NDc2LC0zMDcuNzE4NSAzODQuNDM0NywtMzExLjc5OTkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM3My43OTA2IiB5PSItMzQzLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAxMDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MjM4IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDIzODwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTguNzkwNiIgY3k9Ii0xOTUuNiIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE4Ljc5MDYiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDIzODwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTlDJiM0NTsmZ3Q7MHgyMzggLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTlDJiM0NTsmZ3Q7MHgyMzg8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjkyLjI4MzIsLTI2OC4xMTI3QzI3OC4zMjc5LC0yNTQuMzQzNSAyNTguMTYyLC0yMzQuNDQ2NSAyNDIuNDgzLC0yMTguOTc2NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjI0NC43NywtMjE2LjMxNjEgMjM1LjE5MzQsLTIxMS43ODQgMjM5Ljg1MzUsLTIyMS4yOTkgMjQ0Ljc3LC0yMTYuMzE2MSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjg2Ljc5MDYiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7MDAxPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgzNUMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTAiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDM1QzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzMDguNzkwNiIgY3k9Ii0xOTUuNiIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzA4Ljc5MDYiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDM1QzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTlDJiM0NTsmZ3Q7MHgzNUMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTlDJiM0NTsmZ3Q7MHgzNUM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzA4Ljc5MDYsLTI2Ni4wMDA2QzMwOC43OTA2LC0yNTMuODk0OSAzMDguNzkwNiwtMjM3LjgwNzYgMzA4Ljc5MDYsLTIyNC4wNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzEyLjI5MDcsLTIyMy42NzIgMzA4Ljc5MDYsLTIxMy42NzIgMzA1LjI5MDcsLTIyMy42NzIxIDMxMi4yOTA3LC0yMjMuNjcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMjIuNzkwNiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDswMTA8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDEzQSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4MTNBPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjQwMC43OTA2IiBjeT0iLTE5NS42IiByeD0iMzcuMTQ0MyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MDAuNzkwNiIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MTNBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1OUMmIzQ1OyZndDsweDEzQSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTlDJiM0NTsmZ3Q7MHgxM0E8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzI1LjY2NDgsLTI2OC4xMTI3QzMzOS45MzAzLC0yNTQuMzQzNSAzNjAuNTQ0MywtMjM0LjQ0NjUgMzc2LjU3MTcsLTIxOC45NzY1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzc5LjI1OSwtMjIxLjI0NzIgMzg0LjAyMzQsLTIxMS43ODQgMzc0LjM5NzYsLTIxNi4yMTA2IDM3OS4yNTksLTIyMS4yNDcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNzcuNzkwNiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDswMTE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDM3QSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4MzdBPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjQ5My43OTA2IiBjeT0iLTE5NS42IiByeD0iMzcuMTQ0MyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0OTMuNzkwNiIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MzdBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1QkMmIzQ1OyZndDsweDM3QSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NUJDJiM0NTsmZ3Q7MHgzN0E8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNDE3LjAzMTcsLTI2OC4xMTI3QzQzMS42MDcyLC0yNTQuMzQzNSA0NTIuNjY5MywtMjM0LjQ0NjUgNDY5LjA0NTIsLTIxOC45NzY1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNDcxLjc5MzEsLTIyMS4xOTU1IDQ3Ni42NTg5LC0yMTEuNzg0IDQ2Ni45ODYxLC0yMTYuMTA3IDQ3MS43OTMxLC0yMjEuMTk1NSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDY5Ljc5MDYiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7MDAwPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg0NTUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDQ1NTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI1ODQuNzkwNiIgY3k9Ii0xOTUuNiIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNTg0Ljc5MDYiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDQ1NTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NUJDJiM0NTsmZ3Q7MHg0NTUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDVCQyYjNDU7Jmd0OzB4NDU1PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTQyOS40NzY1LC0yNzMuMTk4M0M0NDYuNzA1MSwtMjY2LjQ2NDUgNDY4LjcwNTEsLTI1Ny40NjQ1IDQ4Ny43OTA2LC0yNDguNCA1MDkuNzE4NiwtMjM3Ljk4NTUgNTMzLjY4MjgsLTIyNC45NTc3IDU1Mi4zMDU1LC0yMTQuNDQ4NyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjU1NC4yODgsLTIxNy4zNDc4IDU2MS4yNTE1LC0yMDkuMzYyNyA1NTAuODI4NCwtMjExLjI2MjUgNTU0LjI4OCwtMjE3LjM0NzgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjUzMy43OTA2IiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAwMTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MTNCIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxM0I8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNDAwLjc5MDYiIGN5PSItMTA2LjgiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQwMC43OTA2IiB5PSItMTAyLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgxM0I8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDEzQSYjNDU7Jmd0OzB4MTNCIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxM0EmIzQ1OyZndDsweDEzQjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik00MDAuNzkwNiwtMTc3LjIwMDZDNDAwLjc5MDYsLTE2NS4wOTQ5IDQwMC43OTA2LC0xNDkuMDA3NiA0MDAuNzkwNiwtMTM1LjI2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI0MDQuMjkwNywtMTM0Ljg3MiA0MDAuNzkwNiwtMTI0Ljg3MiAzOTcuMjkwNywtMTM0Ljg3MjEgNDA0LjI5MDcsLTEzNC44NzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQwOS4zNDM5IiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDtIPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gY29udGVudEFycmF5WzBdIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE1IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+Y29udGVudEFycmF5WzBdPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjQwMC43OTA2IiBjeT0iLTE4IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MDAuNzkwNiIgeT0iLTEzLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzBdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgxM0ImIzQ1OyZndDtjb250ZW50QXJyYXlbMF0gLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDEzQiYjNDU7Jmd0O2NvbnRlbnRBcnJheVswXTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik00MDAuNzkwNiwtODguNDAwNkM0MDAuNzkwNiwtNzYuMjk0OSA0MDAuNzkwNiwtNjAuMjA3NiA0MDAuNzkwNiwtNDYuNDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjQwNC4yOTA3LC00Ni4wNzIgNDAwLjc5MDYsLTM2LjA3MiAzOTcuMjkwNywtNDYuMDcyMSA0MDQuMjkwNywtNDYuMDcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MDkuMzQzOSIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwO0E8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5nNC5zdmcgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQuZzQuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MjM3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQuZzQuc3ZnCkBAIC0wLDAgKzEsMjkwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cis8IS0tLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDAuMSAoMjAxNjEyMjUuMDMwNCkKKyMgaHR0cDovL3d3dy5ncmFwaHZpei5vcmcvY29udGVudC9jbHVzdGVyCisKK3N0cmljdCBkaWdyYXBoIEcgeworLy8gICIweDEzOSIgW2NvbG9yPWdyZXksZm9udGNvbG9yPWdyZXldOworCisgICIweDEzQiIgLT4gImNvbnRlbnRBcnJheVswXSIgW2xhYmVsPSIgIEEiXTsKKyAgIjB4MTNBIiAtPiAiMHgxM0IiIFtsYWJlbD0iICBIIl07CisvLyAgICIweDEzOSIgLT4gIjB4MTNBIiBbbGFiZWw9IiAgQyJdOworLy8gICIweDEzOSIgLT4gIjB4MTNBIiBbbGFiZWw9IiAgQyIsY29sb3I9ImdyZXkiLGZvbnRjb2xvcj0iZ3JleSJdOworCisvLyAgICIweDI1RSIgLT4gIjB4MjM4IiBbbGFiZWw9IiAgQSJdOworLy8gICAiMHgyNUUiIC0+ICIweDEzQSIgW2xhYmVsPSIgIEMiXTsKKy8vICAgIjB4MjVFIiAtPiAiMHgzM0IiIFtsYWJlbD0iICA1Il07CisvLyAgICIweDI1RSIgLT4gIjB4MzVDIiBbbGFiZWw9IiAgQiJdOworLy8gICAiMHgyNUUiIC0+ICIweDM3QSIgW2xhYmVsPSIgIFAiXTsKKy8vICAgIjB4MjVFIiAtPiAiMHg0MUIiIFtsYWJlbD0iICAzIl07CisKKyAgc3ViZ3JhcGggY2x1c3Rlcl81MUYgeworICAgIGxhYmVsID0gIk5vZGUgMHg1MUYiCisgICAgIjB4NTFGIiBbbGFiZWw9IlByZWZpeCAweDUxRlxuY29udGVudEFycmF5WzFdIl0KKyAgICAiMHg1MUYiIC0+ICIweDUxQyIgW2xhYmVsPSLOtSJdOworCisgICAgc3ViZ3JhcGggY2x1c3Rlcl81MUMgeworICAgICAgbGFiZWw9ICJTcGxpdCBub2RlIDB4NTFDIjsKKyAgICAgIHJhbmtzZXA9MQorICAgICAgY29sb3I9Z3JleTsKKyAgICAgIG5vZGUgW3N0eWxlPWRhc2hlZF0gIjB4NTNDIiwgIjB4NTVDIiwgIjB4NTdDIiwgIjB4NTlDIiwgIjB4NUJDIjsKKworICAgICAgIjB4NTFDIiAtPiAiMHg1M0MiIFtsYWJlbD0iICAwMCJdOworICAgICAgIjB4NTFDIiAtPiAiMHg1N0MiIFtsYWJlbD0iICAwMSJdOworICAgICAgIjB4NTNDIiAtPiAiMHg1NUMiIFtsYWJlbD0iICAxMTAiXTsKKyAgICAgICIweDU3QyIgLT4gIjB4NTlDIiBbbGFiZWw9IiAgMDAwIl07CisgICAgICAiMHg1N0MiIC0+ICIweDVCQyIgW2xhYmVsPSIgIDAxMCJdOworICAgIH0KKyAgfQorICAiMHg1NUMiIC0+ICIweDQxQiIgW2xhYmVsPSIgIDAxMSIsbWlubGVuPTJdOworICAiMHg1NUMiIC0+ICIweDMzQiIgW2xhYmVsPSIgIDEwMSIsbWlubGVuPTJdOworICAiMHg1OUMiIC0+ICIweDIzOCIgW2xhYmVsPSIgIDAwMSIsbWlubGVuPTJdOworICAiMHg1OUMiIC0+ICIweDM1QyIgW2xhYmVsPSIgIDAxMCIsbWlubGVuPTJdOworICAiMHg1OUMiIC0+ICIweDEzQSIgW2xhYmVsPSIgIDAxMSIsbWlubGVuPTJdOworICAiMHg1QkMiIC0+ICIweDM3QSIgW2xhYmVsPSIgIDAwMCIsbWlubGVuPTJdOworICAiMHg1QkMiIC0+ICIweDQ1NSIgW2xhYmVsPSIgIDAwMSIsbWlubGVuPTJdOworCisgIHsgcmFuaz1zYW1lICIweDIzOCIgLT4gIjB4MzVDIiAtPiAiMHgxM0EiIFtzdHlsZT1pbnZpcyxjb25zdHJhaW49ZmFsc2VdfQorfQorLS0+Cis8IS0tIFRpdGxlOiBHIFBhZ2VzOiAxIC0tPgorPHN2ZyB3aWR0aD0iNjYzcHQiIGhlaWdodD0iNzM5cHQiCisgICAgIHZpZXdCb3g9IjAuMDAgMC4wMCA2NjIuOTcgNzM5LjIzIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KKyAgICA8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMSAxKSByb3RhdGUoMCkgdHJhbnNsYXRlKDQgNzM1LjIzMTMpIj4KKyAgICAgICAgPHRpdGxlPkc8L3RpdGxlPgorICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9InRyYW5zcGFyZW50IiBwb2ludHM9Ii00LDQgLTQsLTczNS4yMzEzIDY1OC45Njk1LC03MzUuMjMxMyA2NTguOTY5NSw0IC00LDQiLz4KKyAgICAgICAgPGcgaWQ9ImNsdXN0MSIgY2xhc3M9ImNsdXN0ZXIiPgorICAgICAgICAgICAgPHRpdGxlPmNsdXN0ZXJfNTFGPC90aXRsZT4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIxODYuNzkwNiwtMjMxLjQgMTg2Ljc5MDYsLTcyMy4yMzEzIDQ2OS43OTA2LC03MjMuMjMxMyA0NjkuNzkwNiwtMjMxLjQgMTg2Ljc5MDYsLTIzMS40Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMjguMjkwNiIgeT0iLTcwNi42MzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPk5vZGUgMHg1MUY8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPGcgaWQ9ImNsdXN0MiIgY2xhc3M9ImNsdXN0ZXIiPgorICAgICAgICAgICAgPHRpdGxlPmNsdXN0ZXJfNTFDPC90aXRsZT4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2MwYzBjMCIgcG9pbnRzPSIxOTQuNzkwNiwtMjM5LjQgMTk0Ljc5MDYsLTU3Ny44IDQ2MS43OTA2LC01NzcuOCA0NjEuNzkwNiwtMjM5LjQgMTk0Ljc5MDYsLTIzOS40Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMjguMjkwNiIgeT0iLTU2MS4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPlNwbGl0IG5vZGUgMHg1MUM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDEzQiAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxM0I8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNDM1Ljc5MDYiIGN5PSItODguOCIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDM1Ljc5MDYiIHk9Ii04NC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MTNCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gY29udGVudEFycmF5WzBdIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5jb250ZW50QXJyYXlbMF08L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNDM1Ljc5MDYiIGN5PSItMTgiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQzNS43OTA2IiB5PSItMTMuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMF08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDEzQiYjNDU7Jmd0O2NvbnRlbnRBcnJheVswXSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxM0ImIzQ1OyZndDtjb250ZW50QXJyYXlbMF08L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNDM1Ljc5MDYsLTcwLjU2NzJDNDM1Ljc5MDYsLTYzLjI3NDMgNDM1Ljc5MDYsLTU0LjY5ODcgNDM1Ljc5MDYsLTQ2LjYxMzciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI0MzkuMjkwNywtNDYuNDE3IDQzNS43OTA2LC0zNi40MTcgNDMyLjI5MDcsLTQ2LjQxNzEgNDM5LjI5MDcsLTQ2LjQxNyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDQ0LjM0MzkiIHk9Ii00OS4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDtBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgxM0EgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4MTNBPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjQzNS43OTA2IiBjeT0iLTE1OS42IiByeD0iMzcuMTQ0MyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MzUuNzkwNiIgeT0iLTE1NS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MTNBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgxM0EmIzQ1OyZndDsweDEzQiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgxM0EmIzQ1OyZndDsweDEzQjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik00MzUuNzkwNiwtMTQxLjM2NzJDNDM1Ljc5MDYsLTEzNC4wNzQzIDQzNS43OTA2LC0xMjUuNDk4NyA0MzUuNzkwNiwtMTE3LjQxMzciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI0MzkuMjkwNywtMTE3LjIxNyA0MzUuNzkwNiwtMTA3LjIxNyA0MzIuMjkwNywtMTE3LjIxNzEgNDM5LjI5MDcsLTExNy4yMTciLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ0NC4zNDM5IiB5PSItMTIwIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDtIPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1MUYgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTFGPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjMxOC43OTA2IiBjeT0iLTY2MS4wMTU2IiByeD0iMTE3LjI2MjkiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMTguNzkwNiIgeT0iLTY2NS4yMTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPlByZWZpeCAweDUxRjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMxOC43OTA2IiB5PSItNjQ4LjQxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzFdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1MUMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTFDPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjMxOC43OTA2IiBjeT0iLTUyNyIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzE4Ljc5MDYiIHk9Ii01MjIuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDUxQzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTFGJiM0NTsmZ3Q7MHg1MUMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTFGJiM0NTsmZ3Q7MHg1MUM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzE4Ljc5MDYsLTYzMS4yNzMyQzMxOC43OTA2LC02MDguNjA5MSAzMTguNzkwNiwtNTc3LjYwNTIgMzE4Ljc5MDYsLTU1NS4zMDQ0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzIyLjI5MDcsLTU1NS4xMzA1IDMxOC43OTA2LC01NDUuMTMwNiAzMTUuMjkwNywtNTU1LjEzMDYgMzIyLjI5MDcsLTU1NS4xMzA1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMjIuODcwOSIgeT0iLTYwMCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj7OtTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTNDIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTYiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDUzQzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1kYXNoYXJyYXk9IjUsMiIgY3g9IjIzNy43OTA2IiBjeT0iLTM5Ni4yIiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzcuNzkwNiIgeT0iLTM5MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDUzQzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTFDJiM0NTsmZ3Q7MHg1M0MgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTFDJiM0NTsmZ3Q7MHg1M0M8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjg0LjExMzEsLTUyMC42ODA0QzI2Ny43NjQ3LC01MTUuNDkzNyAyNTEuNzkwNiwtNTA2LjE2MjQgMjUxLjc5MDYsLTQ4OS41IDI1MS43OTA2LC00ODkuNSAyNTEuNzkwNiwtNDg5LjUgMjUxLjc5MDYsLTQzMy43IDI1MS43OTA2LC00MzAuMjk0OCAyNTEuMjc3NywtNDI2LjgxOTMgMjUwLjQ0ODIsLTQyMy40MjUyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjUzLjY3MzQsLTQyMi4wMzA3IDI0Ny4yMDY1LC00MTMuNjM4NSAyNDcuMDI4NSwtNDI0LjIzMTggMjUzLjY3MzQsLTQyMi4wMzA3Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNjIuMjkwNiIgeT0iLTQ1Ny40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDswMDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTdDIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDU3QzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1kYXNoYXJyYXk9IjUsMiIgY3g9IjMyNS43OTA2IiBjeT0iLTM5Ni4yIiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMjUuNzkwNiIgeT0iLTM5MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDU3QzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTFDJiM0NTsmZ3Q7MHg1N0MgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTFDJiM0NTsmZ3Q7MHg1N0M8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzIwLjg0MTQsLTUwOC43MTI5QzMyMS4zNjg3LC01MDIuNjEwOSAzMjEuNzkwNiwtNDk1Ljc3IDMyMS43OTA2LC00ODkuNSAzMjEuNzkwNiwtNDg5LjUgMzIxLjc5MDYsLTQ4OS41IDMyMS43OTA2LC00MzMuNyAzMjEuNzkwNiwtNDMwLjc1MzcgMzIxLjkxNDIsLTQyNy42ODQ1IDMyMi4xMTgsLTQyNC42MjY2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzI1LjYyMTUsLTQyNC43NDg2IDMyMy4wNTYyLC00MTQuNDY5IDMxOC42NTEyLC00MjQuMTA0NiAzMjUuNjIxNSwtNDI0Ljc0ODYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMzMi4yOTA2IiB5PSItNDU3LjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAxPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1NUMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTVDPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLWRhc2hhcnJheT0iNSwyIiBjeD0iMjM3Ljc5MDYiIGN5PSItMjY1LjQiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzNy43OTA2IiB5PSItMjYxLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg1NUM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDUzQyYjNDU7Jmd0OzB4NTVDIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDUzQyYjNDU7Jmd0OzB4NTVDPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTIzNy43OTA2LC0zNzcuODg5NUMyMzcuNzkwNiwtMzcxLjc4NTkgMjM3Ljc5MDYsLTM2NC45NSAyMzcuNzkwNiwtMzU4LjcgMjM3Ljc5MDYsLTM1OC43IDIzNy43OTA2LC0zNTguNyAyMzcuNzkwNiwtMzAyLjkgMjM3Ljc5MDYsLTI5OS45NzAzIDIzNy43OTA2LC0yOTYuOTExOSAyMzcuNzkwNiwtMjkzLjg2MDUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyNDEuMjkwNywtMjkzLjcxMDUgMjM3Ljc5MDYsLTI4My43MTA1IDIzNC4yOTA3LC0yOTMuNzEwNiAyNDEuMjkwNywtMjkzLjcxMDUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI1MS43OTA2IiB5PSItMzI2LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzExMDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NDFCIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTExIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg0MUI8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzYuNzkwNiIgY3k9Ii0xNTkuNiIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzYuNzkwNiIgeT0iLTE1NS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4NDFCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1NUMmIzQ1OyZndDsweDQxQiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1NUMmIzQ1OyZndDsweDQxQjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMTIuNTQ0OSwtMjUyLjc2MTdDMTkxLjg0NDksLTI0Mi4zNDM0IDE2MS44MjA4LC0yMjcuMTA1IDEzNS43OTA2LC0yMTMuNCAxMTMuOTI0NSwtMjAxLjg4NzQgODkuNTMxMiwtMTg4LjYzNjEgNzAuNDI5NiwtMTc4LjE2NTYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI3MS45NjE5LC0xNzUuMDE0IDYxLjUxMTgsLTE3My4yNjg2IDY4LjU5MjYsLTE4MS4xNDk4IDcxLjk2MTksLTE3NS4wMTQiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE0OS43OTA2IiB5PSItMjAwLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAxMTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MzNCIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgzM0I8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMTI4Ljc5MDYiIGN5PSItMTU5LjYiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEyOC43OTA2IiB5PSItMTU1LjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgzM0I8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDU1QyYjNDU7Jmd0OzB4MzNCIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1NUMmIzQ1OyZndDsweDMzQjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMjEuMjM1OSwtMjQ5LjMzMTNDMjAyLjk4OTUsLTIzMS42MjA2IDE3My40NzgyLC0yMDIuOTc1NyAxNTIuNzE3MSwtMTgyLjgyNCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjE1NS4xMTQ1LC0xODAuMjczNSAxNDUuNTAxMiwtMTc1LjgyIDE1MC4yMzkxLC0xODUuMjk2NCAxNTUuMTE0NSwtMTgwLjI3MzUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE5Ny43OTA2IiB5PSItMjAwLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzEwMTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTlDIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDU5QzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1kYXNoYXJyYXk9IjUsMiIgY3g9IjMyNS43OTA2IiBjeT0iLTI2NS40IiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMjUuNzkwNiIgeT0iLTI2MS4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4NTlDPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1N0MmIzQ1OyZndDsweDU5QyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U3IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1N0MmIzQ1OyZndDsweDU5QzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zMjUuNzkwNiwtMzc3Ljg4OTVDMzI1Ljc5MDYsLTM3MS43ODU5IDMyNS43OTA2LC0zNjQuOTUgMzI1Ljc5MDYsLTM1OC43IDMyNS43OTA2LC0zNTguNyAzMjUuNzkwNiwtMzU4LjcgMzI1Ljc5MDYsLTMwMi45IDMyNS43OTA2LC0yOTkuOTcwMyAzMjUuNzkwNiwtMjk2LjkxMTkgMzI1Ljc5MDYsLTI5My44NjA1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzI5LjI5MDcsLTI5My43MTA1IDMyNS43OTA2LC0yODMuNzEwNSAzMjIuMjkwNywtMjkzLjcxMDYgMzI5LjI5MDcsLTI5My43MTA1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMzkuNzkwNiIgeT0iLTMyNi42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDswMDA8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDVCQyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4NUJDPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLWRhc2hhcnJheT0iNSwyIiBjeD0iNDE2Ljc5MDYiIGN5PSItMjY1LjQiIHJ4PSIzNy4xNDQzIiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQxNi43OTA2IiB5PSItMjYxLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg1QkM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDU3QyYjNDU7Jmd0OzB4NUJDIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDU3QyYjNDU7Jmd0OzB4NUJDPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTM1Ni42NjU4LC0zODcuMjQzNUMzNzguMDg3OCwtMzgwLjA3OSA0MDIuNzkwNiwtMzY5LjQ4MDEgNDAyLjc5MDYsLTM1OC43IDQwMi43OTA2LC0zNTguNyA0MDIuNzkwNiwtMzU4LjcgNDAyLjc5MDYsLTMwMi45IDQwMi43OTA2LC0yOTkuNDk0OCA0MDMuMzAzNSwtMjk2LjAxOTMgNDA0LjEzMywtMjkyLjYyNTIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI0MDcuNTUyOCwtMjkzLjQzMTggNDA3LjM3NDcsLTI4Mi44Mzg1IDQwMC45MDc4LC0yOTEuMjMwNyA0MDcuNTUyOCwtMjkzLjQzMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQxNi43OTA2IiB5PSItMzI2LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAxMDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NTlDJiM0NTsmZ3Q7MHgxM0EgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDU5QyYjNDU7Jmd0OzB4MTNBPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTM0Mi40OTcyLC0yNDkuMzMxM0MzNjAuOTExLC0yMzEuNjIwNiAzOTAuNjkzLC0yMDIuOTc1NyA0MTEuNjQ0NywtMTgyLjgyNCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjQxNC4xNDU3LC0xODUuMjc0NyA0MTguOTI2OCwtMTc1LjgyIDQwOS4yOTMxLC0xODAuMjI5NiA0MTQuMTQ1NywtMTg1LjI3NDciLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQxMC43OTA2IiB5PSItMjAwLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAxMTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MjM4IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgyMzg8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE4Ljc5MDYiIGN5PSItMTU5LjYiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxOC43OTA2IiB5PSItMTU1LjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgyMzg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDU5QyYjNDU7Jmd0OzB4MjM4IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1OUMmIzQ1OyZndDsweDIzODwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zMDkuNTM5NiwtMjQ5LjMzMTNDMjkxLjcwNjcsLTIzMS42OTgzIDI2Mi45MTIyLC0yMDMuMjI2NyAyNDIuNTQ2NywtMTgzLjA4OTciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyNDQuNzY2MywtMTgwLjM2MjMgMjM1LjE5NDUsLTE3NS44MiAyMzkuODQ0NSwtMTg1LjMzOTkgMjQ0Ljc2NjMsLTE4MC4zNjIzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyODYuNzkwNiIgeT0iLTIwMC44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiAmIzE2MDswMDE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDM1QyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPjB4MzVDPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjMyNS43OTA2IiBjeT0iLTE1OS42IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMjUuNzkwNiIgeT0iLTE1NS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MzVDPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg1OUMmIzQ1OyZndDsweDM1QyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPjB4NTlDJiM0NTsmZ3Q7MHgzNUM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzI1Ljc5MDYsLTI0Ni45NzFDMzI1Ljc5MDYsLTIzMC42NjIyIDMyNS43OTA2LC0yMDYuNjExMSAzMjUuNzkwNiwtMTg3Ljg2OTgiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzMjkuMjkwNywtMTg3LjgxNzcgMzI1Ljc5MDYsLTE3Ny44MTc4IDMyMi4yOTA3LC0xODcuODE3OCAzMjkuMjkwNywtMTg3LjgxNzciLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMzOS43OTA2IiB5PSItMjAwLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+ICYjMTYwOzAxMDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4MzdBIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE1IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+MHgzN0E8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNTI4Ljc5MDYiIGN5PSItMTU5LjYiIHJ4PSIzNy4xNDQzIiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjUyOC43OTA2IiB5PSItMTU1LjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgzN0E8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSAweDVCQyYjNDU7Jmd0OzB4MzdBIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+MHg1QkMmIzQ1OyZndDsweDM3QTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik00MzMuODAxLC0yNDkuMzMxM0M0NTIuNTQ5NSwtMjMxLjYyMDYgNDgyLjg3MzEsLTIwMi45NzU3IDUwNC4yMDU3LC0xODIuODI0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNTA2Ljc1NDIsLTE4NS4yMzEzIDUxMS42MjAxLC0xNzUuODIgNTAxLjk0NzIsLTE4MC4xNDI3IDUwNi43NTQyLC0xODUuMjMxMyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNTAyLjc5MDYiIHk9Ii0yMDAuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7MDAwPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHg0NTUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTYiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDQ1NTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI2MTkuNzkwNiIgY3k9Ii0xNTkuNiIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNjE5Ljc5MDYiIHk9Ii0xNTUuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDQ1NTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIDB4NUJDJiM0NTsmZ3Q7MHg0NTUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT4weDVCQyYjNDU7Jmd0OzB4NDU1PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTQ0My40MTk3LC0yNTIuMzk3QzQ2NC41MDY1LC0yNDIuMDI1NCA0OTQuNjU4MywtMjI3LjAyODYgNTIwLjc5MDYsLTIxMy40IDU0Mi45OTk2LC0yMDEuODE3NSA1NjcuNzU5NiwtMTg4LjM2MTkgNTg2Ljk2MjQsLTE3Ny44MDQ3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNTg4LjgzOCwtMTgwLjc2NzQgNTk1LjkwNzIsLTE3Mi44NzU4IDU4NS40NTk3LC0xNzQuNjM2NSA1ODguODM4LC0xODAuNzY3NCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNTY0Ljc5MDYiIHk9Ii0yMDAuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gJiMxNjA7MDAxPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gMHgyMzgmIzQ1OyZndDsweDM1QyAtLT4KKyAgICAgICAgPCEtLSAweDM1QyYjNDU7Jmd0OzB4MTNBIC0tPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLm0xLnN2ZyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5tMS5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY5MjhhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5tMS5zdmcKQEAgLTAsMCArMSwzNDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIgorICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KKzwhLS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gR2VuZXJhdGVkIGJ5IGdyYXBodml6IHZlcnNpb24gMi40MC4xICgyMDE2MTIyNS4wMzA0KQorIyBlbWJlZGRlZCBET1QgKHBsYW50dW1sKSB3b3JrcyBpbiBJREVBIHByZXZpZXcKKyMgYnV0IG5vdCBvbiBHaXRIdWIKK2BgYHBsYW50dW1sCitkaWdyYXBoIEcgeworICAgIHsgcmFuaz1zYW1lIHJvb3QgLT4gc3RhcnQgW3N0eWxlPWludmlzXSB9CisgICAgc3RhcnQgW2xhYmVsPSJzdGFydC9lbmQiXQorCisgICAgdHJhY3RvciBbbGFiZWwgPSAiY29udGVudEFycmF5WzBdIl0KKyAgICB0cmFjdG8gW2xhYmVsID0gIjB4MDFCIl0KKyAgICB0cmFjdCBbbGFiZWwgPSAiMHgwMUEiXQorICAgIHRyYWMgW2xhYmVsID0gIjB4MDE5Il0KKyAgICB0cmEgW2xhYmVsID0gIkNoYWluXG4weDAxOCJdCisKKyAgICB0cmVlIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMV0iXQorICAgIHRyZSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDNCIl0KKyAgICB0cmllIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMl0iXQorICAgIHRyaSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDVCIl0KKworICAgIHRyIFtsYWJlbCA9ICJTcGFyc2VcbjB4MDdFIl0KKworICAgIHQgW2xhYmVsID0gIjB4MDlCIl0KKyAgICByb290IFtsYWJlbCA9ICJDaGFpblxuMHg5QSJdCisKKyAgICByb290IC0+IHQgW2xhYmVsID0gIiB0Il0KKyAgICB0IC0+IHRyIFtsYWJlbCA9ICIgciJdCisgICAgdHIgLT4gdHJhIFtsYWJlbCA9ICIgYSJdCisgICAgdHJhIC0+IHRyYWMgW2xhYmVsID0gIiBjIl0KKyAgICB0cmFjIC0+IHRyYWN0IFtsYWJlbCA9ICIgdCJdCisgICAgdHJhY3QgLT4gdHJhY3RvIFtsYWJlbCA9ICIgbyJdCisgICAgdHJhY3RvIC0+IHRyYWN0b3IgW2xhYmVsID0gIiByIl0KKworICAgIHRyIC0+IHRyZSBbbGFiZWwgPSAiIGUiXQorICAgIHRyZSAtPiB0cmVlIFtsYWJlbCA9ICIgZSJdCisKKyAgICB0ciAtPiB0cmkgW2xhYmVsID0gIiBpIl0KKyAgICB0cmkgLT4gdHJpZSBbbGFiZWwgPSAiIGUiXQorCisgICAgLy8ge3Jhbms9c2FtZSB0cmEgLT4gdHJlIC0+IHRyaSBbc3R5bGU9aW52aXNdfQorICAgIHtyYW5rPXNhbWUgdHJhYyAtPiB0cmVlIC0+IHRyaWUgW3N0eWxlPWludmlzXX0KKworICAgIHN1YmdyYXBoIHBhdGggeworICAgICAgICBlZGdlIFtjb2xvciA9ICJsaWdodGJsdWUiOyBmb250Y29sb3I9ImJsdWUiOyBhcnJvd2hlYWQ9InZlZSJdCisgICAgICAgIG5vZGUgW2NvbG9yID0gImxpZ2h0Ymx1ZSI7IGZvbnRjb2xvcj0iYmx1ZSJdCisKKyAgICAgICAgc3RhcnQgLT4gcm9vdAorCisgICAgICAgIHJvb3QgLT4gdCBbbGFiZWwgPSAiIHQiXQorICAgICAgICB0IC0+IHRyIFtsYWJlbCA9ICIgciJdCisgICAgICAgIHRyIC0+IHRyYSBbbGFiZWwgPSAiIGEiXQorICAgICAgICB0cmEgLT4gdHJhdiBbbGFiZWwgPSAiIHYiXQorICAgICAgICB0cmF2IC0+IHRyYXZlIFtsYWJlbCA9ICIgZSJdCisgICAgICAgIHRyYXZlIC0+IHRyYXZlciBbbGFiZWwgPSAiIHIiXQorICAgICAgICB0cmF2ZXIgLT4gdHJhdmVycyBbbGFiZWwgPSAiIHMiXQorICAgICAgICB0cmF2ZXJzIC0+IHRyYXZlcnNlIFtsYWJlbCA9ICIgZSJdCisKKyAgICAgICAgdHJhdiBbbGFiZWwgPSAiTk9ORSJdCisgICAgICAgIHRyYXZlIFtsYWJlbCA9ICJOT05FIl0KKyAgICAgICAgdHJhdmVyIFtsYWJlbCA9ICJOT05FIl0KKyAgICAgICAgdHJhdmVycyBbbGFiZWwgPSAiTk9ORSJdCisgICAgICAgIHRyYXZlcnNlIFtsYWJlbCA9ICJOT05FIl0KKyAgICB9Cit9CitgYGAKKyAtLT4KKzwhLS0gVGl0bGU6IEcgUGFnZXM6IDEgLS0+Cis8c3ZnIHdpZHRoPSI1NzVwdCIgaGVpZ2h0PSI4MjNwdCIKKyAgICAgdmlld0JveD0iMC4wMCAwLjAwIDU3NS40NyA4MjIuODkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgorICAgIDxnIGlkPSJncmFwaDAiIGNsYXNzPSJncmFwaCIgdHJhbnNmb3JtPSJzY2FsZSgxIDEpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCA4MTguODkzOSkiPgorICAgICAgICA8dGl0bGU+RzwvdGl0bGU+CisgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtODE4Ljg5MzkgNTcxLjQ3MzgsLTgxOC44OTM5IDU3MS40NzM4LDQgLTQsNCIvPgorICAgICAgICA8IS0tIHJvb3QgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjc5LjIzNjkiIGN5PSItNzg1LjQ3ODIiIHJ4PSIzMy4xMzM3IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjc5LjIzNjkiIHk9Ii03ODkuNjc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI3OS4yMzY5IiB5PSItNzcyLjg3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg5QTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHN0YXJ0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5zdGFydDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzOTIuMjM2OSIgY3k9Ii03ODUuNDc4MiIgcng9IjQ0LjA3NzUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzkyLjIzNjkiIHk9Ii03ODEuMjc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5zdGFydC9lbmQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7c3RhcnQgLS0+CisgICAgICAgIDwhLS0gdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnQ8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjc5LjIzNjkiIGN5PSItNjg1LjI2MjYiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI3OS4yMzY5IiB5PSItNjgxLjA2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwOUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7dCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjY5LjMzNjgsLTc1Ny4wODI0QzI2Ni42MTA0LC03NDUuOTM2OCAyNjQuODc5NCwtNzMzLjAyMTEgMjY2Ljg0NjMsLTcyMS4yNjI2IDI2Ny4zMjY4LC03MTguMzkgMjY4LjAwOSwtNzE1LjQzOTggMjY4LjgwOTEsLTcxMi41MjM4Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjcyLjE3MzIsLTcxMy40OTQgMjcxLjg2MjcsLTcwMi45MDM3IDI2NS41MDEyLC03MTEuMzc2MiAyNzIuMTczMiwtNzEzLjQ5NCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjcwLjkzMjIiIHk9Ii03MjUuNDYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDt0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjc5LjIzNjksLTc1NS45NTIyQzI3OS4yMzY5LC03NDIuNDY3MSAyNzkuMjM2OSwtNzI2LjU3NDkgMjc5LjIzNjksLTcxMy4yNzc5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjc5LjIzNjksLTcwMy4yNjU5IDI4My43MzcsLTcxMy4yNjU5IDI3OS4yMzY5LC03MDguMjY1OSAyNzkuMjM3LC03MTMuMjY1OSAyNzkuMjM3LC03MTMuMjY1OSAyNzkuMjM3LC03MTMuMjY1OSAyNzkuMjM2OSwtNzA4LjI2NTkgMjc0LjczNywtNzEzLjI2NTkgMjc5LjIzNjksLTcwMy4yNjU5IDI3OS4yMzY5LC03MDMuMjY1OSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjgyLjkzMjIiIHk9Ii03MjUuNDYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHN0YXJ0JiM0NTsmZ3Q7cm9vdCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnN0YXJ0JiM0NTsmZ3Q7cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0zNjcuNjExMiwtODAwLjUxODVDMzUwLjczNDgsLTgwNy45NTM3IDMzMy44NTg1LC04MDkuNDgzOSAzMTYuOTgyMSwtODA1LjEwOSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjMwNy4wNDU1LC04MDEuODUwOCAzMTcuOTQ5OCwtODAwLjY5MDcgMzExLjc5NjYsLTgwMy40MDg3IDMxNi41NDc3LC04MDQuOTY2NyAzMTYuNTQ3NywtODA0Ljk2NjcgMzE2LjU0NzcsLTgwNC45NjY3IDMxMS43OTY2LC04MDMuNDA4NyAzMTUuMTQ1NiwtODA5LjI0MjcgMzA3LjA0NTUsLTgwMS44NTA4IDMwNy4wNDU1LC04MDEuODUwOCIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTEwNi44IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTAyLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzBdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTQiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG88L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iOTEuMjM2OSIgY3k9Ii0xOTUuNiIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTEuMjM2OSIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDFCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvJiM0NTsmZ3Q7dHJhY3RvciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvJiM0NTsmZ3Q7dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik04Ny41OTQzLC0xNzcuNjNDODUuMTIyMSwtMTY1LjQzMzggODEuODAyLC0xNDkuMDU0MyA3OC45NzcyLC0xMzUuMTE4NyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjgyLjM1MjgsLTEzNC4xNTM0IDc2LjkzNTgsLTEyNS4wNDgxIDc1LjQ5MjMsLTEzNS41NDQxIDgyLjM1MjgsLTEzNC4xNTM0Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI4OC4zMTcyIiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjkxLjIzNjkiIGN5PSItMjg0LjQiIHJ4PSIzNy4xNDQzIiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjkxLjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0JiM0NTsmZ3Q7dHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdCYjNDU7Jmd0O3RyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik05MS4yMzY5LC0yNjYuMDAwNkM5MS4yMzY5LC0yNTMuODk0OSA5MS4yMzY5LC0yMzcuODA3NiA5MS4yMzY5LC0yMjQuMDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijk0LjczNywtMjIzLjY3MiA5MS4yMzY5LC0yMTMuNjcyIDg3LjczNywtMjIzLjY3MjEgOTQuNzM3LC0yMjMuNjcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5Ni40ODY5IiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IG88L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTYiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjkyLjIzNjkiIGN5PSItMzczLjIiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjkyLjIzNjkiIHk9Ii0zNjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMTk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjJiM0NTsmZ3Q7dHJhY3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWMmIzQ1OyZndDt0cmFjdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik05Mi4wMjk3LC0zNTQuODAwNkM5MS44OTM0LC0zNDIuNjk0OSA5MS43MTIyLC0zMjYuNjA3NiA5MS41NTc1LC0zMTIuODY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijk1LjA1MjksLTMxMi40MzE5IDkxLjQ0MDQsLTMwMi40NzIgODguMDUzMywtMzEyLjUxMDggOTUuMDUyOSwtMzEyLjQzMTkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijk1LjkzMjIiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlOCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzEyLjIzNjkiIGN5PSItMzczLjIiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMxMi4yMzY5IiB5PSItMzY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsxXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8IS0tIHRyYSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU3IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIwMy4yMzY5IiBjeT0iLTQ3My40MTU2IiByeD0iMzYuMTI1IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAzLjIzNjkiIHk9Ii00NzcuNjE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwMy4yMzY5IiB5PSItNDYwLjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMTg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmFjIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEmIzQ1OyZndDt0cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTE3OC44Nzc1LC00NTEuNDIyOUMxNjAuNTYxOCwtNDM0Ljg4NjcgMTM1LjU1NjEsLTQxMi4zMTA1IDExNy4xMTU2LC0zOTUuNjYxNiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjExOS40MjEsLTM5My4wMjc2IDEwOS42NTMxLC0zODguOTI0MSAxMTQuNzMwMSwtMzk4LjIyMzMgMTE5LjQyMSwtMzkzLjAyNzYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE1My4wOTQyIiB5PSItNDEzLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGN4PSIxODMuMjM2OSIgY3k9Ii0zNzMuMiIgcng9IjM3LjcwMDYiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTgzLjIzNjkiIHk9Ii0zNjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+Tk9ORTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYSYjNDU7Jmd0O3RyYXYgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEmIzQ1OyZndDt0cmF2PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTE5Ny4zOTgzLC00NDQuMTU5N0MxOTQuNzA1NCwtNDMwLjY2NiAxOTEuNTIyNCwtNDE0LjcxNjggMTg4Ljg1NjgsLTQwMS4zNjA0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTg2Ljg0OTMsLTM5MS4zMDExIDE5My4yMTk1LC00MDAuMjI3IDE4Ny44Mjc5LC0zOTYuMjA0NCAxODguODA2NSwtNDAxLjEwNzggMTg4LjgwNjUsLTQwMS4xMDc4IDE4OC44MDY1LC00MDEuMTA3OCAxODcuODI3OSwtMzk2LjIwNDQgMTg0LjM5MzUsLTQwMS45ODg1IDE4Ni44NDkzLC0zOTEuMzAxMSAxODYuODQ5MywtMzkxLjMwMTEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE5OC40ODY5IiB5PSItNDEzLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHY8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmllIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEwIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI0OTQuMjM2OSIgY3k9Ii0zNzMuMiIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDk0LjIzNjkiIHk9Ii0zNjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzJdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDwhLS0gdHJlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzA0LjIzNjkiIGN5PSItNDczLjQxNTYiIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzA0LjIzNjkiIHk9Ii00NzcuNjE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMwNC4yMzY5IiB5PSItNDYwLjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwM0I8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlJiM0NTsmZ3Q7dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zMDYuNTkzOSwtNDQzLjg4OTdDMzA3LjY3MDQsLTQzMC40MDQ2IDMwOC45MzksLTQxNC41MTIzIDMxMC4wMDA1LC00MDEuMjE1MyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjMxMy40OTI4LC00MDEuNDUwMiAzMTAuNzk5NywtMzkxLjIwMzMgMzA2LjUxNSwtNDAwLjg5MzEgMzEzLjQ5MjgsLTQwMS40NTAyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMTQuMDk0MiIgeT0iLTQxMy40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTExIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjQ0Ni4yMzY5IiBjeT0iLTQ3My40MTU2IiByeD0iMzcuOTMwNiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ0Ni4yMzY5IiB5PSItNDc3LjYxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NDYuMjM2OSIgeT0iLTQ2MC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDVCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpJiM0NTsmZ3Q7dHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyaSYjNDU7Jmd0O3RyaWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNDU5LjQ4MDIsLTQ0NS43NjZDNDY2LjI0NDEsLTQzMS42NDQxIDQ3NC40NDUyLC00MTQuNTIxNSA0ODEuMTgyMiwtNDAwLjQ1NiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjQ4NC40MTM0LC00MDEuODEyIDQ4NS41NzY2LC0zOTEuMjgxMiA0NzguMTAwMiwtMzk4Ljc4ODEgNDg0LjQxMzQsLTQwMS44MTIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ4MC4wOTQyIiB5PSItNDEzLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjI3OS4yMzY5IiBjeT0iLTU4NS4wNDY5IiByeD0iMzcuOTAyNyIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI3OS4yMzY5IiB5PSItNTg5LjI0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+U3BhcnNlPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjc5LjIzNjkiIHk9Ii01NzIuNDQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA3RTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJhIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyYTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yNTIuNDU0OSwtNTY0LjA4NDZDMjQzLjk2ODYsLTU1Ni40NDk1IDIzNS4wOTU2LC01NDcuMzAwMyAyMjguNTIyMywtNTM3LjYzMTMgMjIzLjE3OTYsLTUyOS43NzI0IDIxOC43MjA0LC01MjAuNjE5NCAyMTUuMTEsLTUxMS43Mjg0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjE4LjMzODIsLTUxMC4zNyAyMTEuNTIzOSwtNTAyLjI1NzMgMjExLjc5MTgsLTUxMi44NDg3IDIxOC4zMzgyLC01MTAuMzciLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzNC4wOTQyIiB5PSItNTI1LjAzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyYSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTI2Mi44NzcsLTU1OC41Mzk5QzI1NS41MjMyLC01NDYuODU4NCAyNDYuNjI2OCwtNTMzLjA0MDkgMjM4LjIzNjksLTUyMC44MzEzIDIzNS4xMjIzLC01MTYuMjk4NyAyMzEuNzcyNywtNTExLjU3OTIgMjI4LjQyNCwtNTA2Ljk1MTEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMjIuNDQ4NSwtNDk4Ljc3OTMgMjMxLjk4MzYsLTUwNC4xOTUyIDIyNS4zOTk4LC01MDIuODE1NCAyMjguMzUxMiwtNTA2Ljg1MTQgMjI4LjM1MTIsLTUwNi44NTE0IDIyOC4zNTEyLC01MDYuODUxNCAyMjUuMzk5OCwtNTAyLjgxNTQgMjI0LjcxODcsLTUwOS41MDc3IDIyMi40NDg1LC00OTguNzc5MyAyMjIuNDQ4NSwtNDk4Ljc3OTMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI1NC4wOTQyIiB5PSItNTI1LjAzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjg1Ljc0MDEsLTU1Ni4wMDg1QzI4OC42OTcxLC01NDIuODA0NiAyOTIuMjQwOSwtNTI2Ljk4MDcgMjk1LjQzMTgsLTUxMi43MzI3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjk4LjkwOTMsLTUxMy4yMTk2IDI5Ny42Nzk0LC01MDIuNjk2NCAyOTIuMDc4NSwtNTExLjY4OTggMjk4LjkwOTMsLTUxMy4yMTk2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyOTguMDk0MiIgeT0iLTUyNS4wMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmkgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyaTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zMDcuOTQ1MiwtNTY1Ljg1NjhDMzM1Ljc4NTQsLTU0Ny4yNDcgMzc4LjE3NTEsLTUxOC45MTE2IDQwOC42ODI2LC00OTguNTE4OCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjQxMC45NzU3LC01MDEuMTk2IDQxNy4zNDQzLC00OTIuNzI4OSA0MDcuMDg1NiwtNDk1LjM3NjQgNDEwLjk3NTcsLTUwMS4xOTYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM3Ni45MzIyIiB5PSItNTI1LjAzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0JiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnQmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yNzEuNDA2NiwtNjY3LjY1OTFDMjY5LjIzMDksLTY2MS45MTE5IDI2Ny4xNjY5LC02NTUuNDIyIDI2Ni4wNzYzLC02NDkuMjYyNiAyNjQuNTk1MiwtNjQwLjg5NzUgMjY1LjA5NjksLTYzMS45NTA3IDI2Ni41NTA5LC02MjMuNDcyOCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjI3MC4wMjg5LC02MjMuOTQ5MyAyNjguNzI3NywtNjEzLjQzNDcgMjYzLjE4NzksLTYyMi40NjU4IDI3MC4wMjg5LC02MjMuOTQ5MyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjcwLjMxNzIiIHk9Ii02MzYuNjYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnQmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yNzkuMjM2OSwtNjY2Ljg4MTVDMjc5LjIzNjksLTY1NS4xNTAyIDI3OS4yMzY5LC02MzkuNDc3NCAyNzkuMjM2OSwtNjI0Ljk4ODUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyNzkuMjM2OSwtNjE0LjcyMDkgMjgzLjczNywtNjI0LjcyMDggMjc5LjIzNjksLTYxOS43MjA5IDI3OS4yMzcsLTYyNC43MjA5IDI3OS4yMzcsLTYyNC43MjA5IDI3OS4yMzcsLTYyNC43MjA5IDI3OS4yMzY5LC02MTkuNzIwOSAyNzQuNzM3LC02MjQuNzIwOSAyNzkuMjM2OSwtNjE0LjcyMDkgMjc5LjIzNjksLTYxNC43MjA5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyODMuMzE3MiIgeT0iLTYzNi42NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTUiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGN4PSIxODguMjM2OSIgY3k9Ii0yODQuNCIgcng9IjM3LjcwMDYiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTg4LjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj5OT05FPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdiYjNDU7Jmd0O3RyYXZlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdiYjNDU7Jmd0O3RyYXZlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTE4NC4yNzI5LC0zNTQuODAwNkMxODQuOTYxMywtMzQyLjU3NSAxODUuODc4MywtMzI2LjI4ODcgMTg2LjY1NjksLTMxMi40NTk5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTg3LjIxOTMsLTMwMi40NzIgMTkxLjE0OTksLTMxMi43MDkyIDE4Ni45MzgyLC0zMDcuNDY0MSAxODYuNjU3MSwtMzEyLjQ1NjIgMTg2LjY1NzEsLTMxMi40NTYyIDE4Ni42NTcxLC0zMTIuNDU2MiAxODYuOTM4MiwtMzA3LjQ2NDEgMTgyLjE2NDIsLTMxMi4yMDMyIDE4Ny4yMTkzLC0zMDIuNDcyIDE4Ny4yMTkzLC0zMDIuNDcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxOTEuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE2IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgY3g9IjE5My4yMzY5IiBjeT0iLTE5NS42IiByeD0iMzcuNzAwNiIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxOTMuMjM2OSIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPk5PTkU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZSYjNDU7Jmd0O3RyYXZlciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlJiM0NTsmZ3Q7dHJhdmVyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTE4OS4yNzI5LC0yNjYuMDAwNkMxODkuOTYxMywtMjUzLjc3NSAxOTAuODc4MywtMjM3LjQ4ODcgMTkxLjY1NjksLTIyMy42NTk5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTkyLjIxOTMsLTIxMy42NzIgMTk2LjE0OTksLTIyMy45MDkyIDE5MS45MzgyLC0yMTguNjY0MSAxOTEuNjU3MSwtMjIzLjY1NjIgMTkxLjY1NzEsLTIyMy42NTYyIDE5MS42NTcxLC0yMjMuNjU2MiAxOTEuOTM4MiwtMjE4LjY2NDEgMTg3LjE2NDIsLTIyMy40MDMyIDE5Mi4yMTkzLC0yMTMuNjcyIDE5Mi4yMTkzLC0yMTMuNjcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxOTUuMzE3MiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVycyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcnM8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBjeD0iMjAyLjIzNjkiIGN5PSItMTA2LjgiIHJ4PSIzNy43MDA2IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwMi4yMzY5IiB5PSItMTAyLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+Tk9ORTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlciYjNDU7Jmd0O3RyYXZlcnMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXImIzQ1OyZndDt0cmF2ZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTE5NS4xMDE3LC0xNzcuMjAwNkMxOTYuMzQwOCwtMTY0Ljk3NSAxOTcuOTkxNCwtMTQ4LjY4ODcgMTk5LjM5MywtMTM0Ljg1OTkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMDAuNDA1MywtMTI0Ljg3MiAyMDMuODczOSwtMTM1LjI3NDggMTk5LjkwMSwtMTI5Ljg0NjUgMTk5LjM5NjgsLTEzNC44MjEgMTk5LjM5NjgsLTEzNC44MjEgMTk5LjM5NjgsLTEzNC44MjEgMTk5LjkwMSwtMTI5Ljg0NjUgMTk0LjkxOTgsLTEzNC4zNjczIDIwMC40MDUzLC0xMjQuODcyIDIwMC40MDUzLC0xMjQuODcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDMuNzA5MiIgeT0iLTE0NyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gczwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnNlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE4IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyc2U8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBjeD0iMjAyLjIzNjkiIGN5PSItMTgiIHJ4PSIzNy43MDA2IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwMi4yMzY5IiB5PSItMTMuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj5OT05FPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVycyYjNDU7Jmd0O3RyYXZlcnNlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVycyYjNDU7Jmd0O3RyYXZlcnNlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIwMi4yMzY5LC04OC40MDA2QzIwMi4yMzY5LC03Ni4yOTQ5IDIwMi4yMzY5LC02MC4yMDc2IDIwMi4yMzY5LC00Ni40Njc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjAyLjIzNjksLTM2LjA3MiAyMDYuNzM3LC00Ni4wNzIgMjAyLjIzNjksLTQxLjA3MiAyMDIuMjM3LC00Ni4wNzIgMjAyLjIzNywtNDYuMDcyIDIwMi4yMzcsLTQ2LjA3MiAyMDIuMjM2OSwtNDEuMDcyIDE5Ny43MzcsLTQ2LjA3MjEgMjAyLjIzNjksLTM2LjA3MiAyMDIuMjM2OSwtMzYuMDcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDcuMDk0MiIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5tMi5zdmcgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQubTIuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzNkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQubTIuc3ZnCkBAIC0wLDAgKzEsNDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cis8IS0tLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDAuMSAoMjAxNjEyMjUuMDMwNCkKKyMgZW1iZWRkZWQgRE9UIChwbGFudHVtbCkgd29ya3MgaW4gSURFQSBwcmV2aWV3CisjIGJ1dCBub3Qgb24gR2l0SHViCitgYGBwbGFudHVtbAorZGlncmFwaCBHIHsKKyAgICB7IHJhbms9c2FtZSByb290IC0+IHN0YXJ0IFtzdHlsZT1pbnZpc10gfQorICAgIHN0YXJ0IFtsYWJlbD0ic3RhcnQvZW5kIl0KKworICAgIHRyYWN0b3IgW2xhYmVsID0gImNvbnRlbnRBcnJheVswXSJdCisgICAgdHJhY3RvIFtsYWJlbCA9ICIweDAxQiJdCisgICAgdHJhY3QgW2xhYmVsID0gIjB4MDFBIl0KKyAgICB0cmFjIFtsYWJlbCA9ICIweDAxOSJdCisgICAgdHJhIFtsYWJlbCA9ICJDaGFpblxuMHgwMTgiXQorCisgICAgdHJlZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzFdIl0KKyAgICB0cmUgW2xhYmVsID0gIkNoYWluXG4weDAzQiJdCisgICAgdHJpZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzJdIl0KKyAgICB0cmkgW2xhYmVsID0gIkNoYWluXG4weDA1QiJdCisKKyAgICB0ciBbbGFiZWwgPSAiU3BhcnNlXG4weDA3RSJdCisKKyAgICB0IFtsYWJlbCA9ICIweDA5QiJdCisgICAgcm9vdCBbbGFiZWwgPSAiQ2hhaW5cbjB4OUEiXQorCisgICAgcm9vdCAtPiB0IFtsYWJlbCA9ICIgdCJdCisgICAgdCAtPiB0ciBbbGFiZWwgPSAiIHIiXQorICAgIHRyIC0+IHRyYSBbbGFiZWwgPSAiIGEiXQorICAgIHRyYSAtPiB0cmFjIFtsYWJlbCA9ICIgYyJdCisgICAgdHJhYyAtPiB0cmFjdCBbbGFiZWwgPSAiIHQiXQorICAgIHRyYWN0IC0+IHRyYWN0byBbbGFiZWwgPSAiIG8iXQorICAgIHRyYWN0byAtPiB0cmFjdG9yIFtsYWJlbCA9ICIgciJdCisKKyAgICB0ciAtPiB0cmUgW2xhYmVsID0gIiBlIl0KKyAgICB0cmUgLT4gdHJlZSBbbGFiZWwgPSAiIGUiXQorCisgICAgdHIgLT4gdHJpIFtsYWJlbCA9ICIgaSJdCisgICAgdHJpIC0+IHRyaWUgW2xhYmVsID0gIiBlIl0KKworICAgIC8vIHtyYW5rPXNhbWUgdHJhIC0+IHRyZSAtPiB0cmkgW3N0eWxlPWludmlzXX0KKyAgICB7cmFuaz1zYW1lIHRyYWMgLT4gdHJlZSAtPiB0cmllIFtzdHlsZT1pbnZpc119CisKKyAgICBzdWJncmFwaCBwYXRoIHsKKyAgICAgICAgZWRnZSBbY29sb3IgPSAibGlnaHRibHVlIjsgZm9udGNvbG9yPSJibHVlIjsgYXJyb3doZWFkPSJ2ZWUiXQorICAgICAgICBub2RlIFtjb2xvciA9ICJibHVlIjsgZm9udGNvbG9yPSJibHVlIl0KKworICAgICAgICBzdGFydCAtPiByb290CisKKyAgICAgICAgcm9vdCAtPiB0IFtsYWJlbCA9ICIgdCJdCisgICAgICAgIHQgLT4gdHIgW2xhYmVsID0gIiByIl0KKyAgICAgICAgdHIgLT4gdHJhIFtsYWJlbCA9ICIgYSJdCisgICAgICAgIHRyYSAtPiB0cmF2IFtsYWJlbCA9ICIgdiJdCisgICAgICAgIHRyYXYgLT4gdHJhdmUgW2xhYmVsID0gIiBlIl0KKyAgICAgICAgdHJhdmUgLT4gdHJhdmVyIFtsYWJlbCA9ICIgciJdCisgICAgICAgIHRyYXZlciAtPiB0cmF2ZXJzIFtsYWJlbCA9ICIgcyJdCisgICAgICAgIHRyYXZlcnMgLT4gdHJhdmVyc2UgW2xhYmVsID0gIiBlIl0KKworICAgICAgICB0cmF2IFtsYWJlbCA9ICIweDBCOCJdCisgICAgICAgIHRyYXZlIFtsYWJlbCA9ICIweDBCOSJdCisgICAgICAgIHRyYXZlciBbbGFiZWwgPSAiMHgwQkEiXQorICAgICAgICB0cmF2ZXJzIFtsYWJlbCA9ICIweDBCQiJdCisgICAgICAgIHRyYXZlcnNlIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbM10iXQorICAgIH0KKworICAgIHsKKyAgICAgICAgZWRnZSBbY29sb3IgPSAiYmx1ZSJdCisgICAgICAgIHRyYXYgLT4gdHJhdmUgW2xhYmVsID0gIiBlIl0KKyAgICAgICAgdHJhdmUgLT4gdHJhdmVyIFtsYWJlbCA9ICIgciJdCisgICAgICAgIHRyYXZlciAtPiB0cmF2ZXJzIFtsYWJlbCA9ICIgcyJdCisgICAgICAgIHRyYXZlcnMgLT4gdHJhdmVyc2UgW2xhYmVsID0gIiBlIl0KKyAgICB9CisKKyAgICBzdWJncmFwaCBiYWNrIHsKKyAgICAgICAgZWRnZSBbY29sb3IgPSAicGluayI7IGZvbnRjb2xvcj0icmVkIjsgYXJyb3doZWFkPSJ2ZWUiOyBjb25zdHJhaW49ImZhbHNlIl0KKworICAgICAgICB0cmF2ZXJzZSAtPiB0cmF2ZXJzIFtsYWJlbCA9ICIgfjMiXQorICAgICAgICB0cmF2ZXJzIC0+IHRyYXZlciBbbGFiZWwgPSAiMHgwQkIiXQorICAgICAgICB0cmF2ZXIgLT4gdHJhdmUgW2xhYmVsID0gIjB4MEJBIl0KKyAgICAgICAgdHJhdmUgLT4gdHJhdiBbbGFiZWwgPSAiMHgwQjkiXQorICAgICAgICB0cmF2IC0+IHRyYSBbbGFiZWwgPSAiMHgwQjgiXQorICAgIH0KK30KK2BgYAorIC0tPgorPCEtLSBUaXRsZTogRyBQYWdlczogMSAtLT4KKzxzdmcgd2lkdGg9IjU3NHB0IiBoZWlnaHQ9IjgyM3B0IgorICAgICB2aWV3Qm94PSIwLjAwIDAuMDAgNTc0LjQ3IDgyMi44OSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CisgICAgPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDgxOC44OTM5KSI+CisgICAgICAgIDx0aXRsZT5HPC90aXRsZT4KKyAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgcG9pbnRzPSItNCw0IC00LC04MTguODkzOSA1NzAuNDczOCwtODE4Ljg5MzkgNTcwLjQ3MzgsNCAtNCw0Ii8+CisgICAgICAgIDwhLS0gcm9vdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyODkuMjM2OSIgY3k9Ii03ODUuNDc4MiIgcng9IjMzLjEzMzciIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyODkuMjM2OSIgeT0iLTc4OS42NzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjg5LjIzNjkiIHk9Ii03NzIuODc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDlBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gc3RhcnQgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnN0YXJ0PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjQwMi4yMzY5IiBjeT0iLTc4NS40NzgyIiByeD0iNDQuMDc3NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MDIuMjM2OSIgeT0iLTc4MS4yNzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPnN0YXJ0L2VuZDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDtzdGFydCAtLT4KKyAgICAgICAgPCEtLSB0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyODkuMjM2OSIgY3k9Ii02ODUuMjYyNiIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjg5LjIzNjkiIHk9Ii02ODEuMDYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA5QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDt0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290JiM0NTsmZ3Q7dDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yNzkuMzM2OCwtNzU3LjA4MjRDMjc2LjYxMDQsLTc0NS45MzY4IDI3NC44Nzk0LC03MzMuMDIxMSAyNzYuODQ2MywtNzIxLjI2MjYgMjc3LjMyNjgsLTcxOC4zOSAyNzguMDA5LC03MTUuNDM5OCAyNzguODA5MSwtNzEyLjUyMzgiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyODIuMTczMiwtNzEzLjQ5NCAyODEuODYyNywtNzAyLjkwMzcgMjc1LjUwMTIsLTcxMS4zNzYyIDI4Mi4xNzMyLC03MTMuNDk0Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyODAuOTMyMiIgeT0iLTcyNS40NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290JiM0NTsmZ3Q7dDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yODkuMjM2OSwtNzU1Ljk1MjJDMjg5LjIzNjksLTc0Mi40NjcxIDI4OS4yMzY5LC03MjYuNTc0OSAyODkuMjM2OSwtNzEzLjI3NzkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyODkuMjM2OSwtNzAzLjI2NTkgMjkzLjczNywtNzEzLjI2NTkgMjg5LjIzNjksLTcwOC4yNjU5IDI4OS4yMzcsLTcxMy4yNjU5IDI4OS4yMzcsLTcxMy4yNjU5IDI4OS4yMzcsLTcxMy4yNjU5IDI4OS4yMzY5LC03MDguMjY1OSAyODQuNzM3LC03MTMuMjY1OSAyODkuMjM2OSwtNzAzLjI2NTkgMjg5LjIzNjksLTcwMy4yNjU5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyOTIuOTMyMiIgeT0iLTcyNS40NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gc3RhcnQmIzQ1OyZndDtyb290IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+c3RhcnQmIzQ1OyZndDtyb290PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTM3Ny42MTEyLC04MDAuNTE4NUMzNjAuNzM0OCwtODA3Ljk1MzcgMzQzLjg1ODUsLTgwOS40ODM5IDMyNi45ODIxLC04MDUuMTA5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMzE3LjA0NTUsLTgwMS44NTA4IDMyNy45NDk4LC04MDAuNjkwNyAzMjEuNzk2NiwtODAzLjQwODcgMzI2LjU0NzcsLTgwNC45NjY3IDMyNi41NDc3LC04MDQuOTY2NyAzMjYuNTQ3NywtODA0Ljk2NjcgMzIxLjc5NjYsLTgwMy40MDg3IDMyNS4xNDU2LC04MDkuMjQyNyAzMTcuMDQ1NSwtODAxLjg1MDggMzE3LjA0NTUsLTgwMS44NTA4Ii8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG9yIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG9yPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMTA2LjgiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0xMDIuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMF08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI5MS4yMzY5IiBjeT0iLTE5NS42IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5MS4yMzY5IiB5PSItMTkxLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG8mIzQ1OyZndDt0cmFjdG9yIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG8mIzQ1OyZndDt0cmFjdG9yPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTg3LjU5NDMsLTE3Ny42M0M4NS4xMjIxLC0xNjUuNDMzOCA4MS44MDIsLTE0OS4wNTQzIDc4Ljk3NzIsLTEzNS4xMTg3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iODIuMzUyOCwtMTM0LjE1MzQgNzYuOTM1OCwtMTI1LjA0ODEgNzUuNDkyMywtMTM1LjU0NDEgODIuMzUyOCwtMTM0LjE1MzQiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijg4LjMxNzIiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU1IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iOTIuMjM2OSIgY3k9Ii0yODQuNCIgcng9IjM3LjE0NDMiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTIuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDFBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QmIzQ1OyZndDt0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0JiM0NTsmZ3Q7dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTkyLjAyOTcsLTI2Ni4wMDA2QzkxLjg5MzQsLTI1My44OTQ5IDkxLjcxMjIsLTIzNy44MDc2IDkxLjU1NzUsLTIyNC4wNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iOTUuMDUyOSwtMjIzLjYzMTkgOTEuNDQwNCwtMjEzLjY3MiA4OC4wNTMzLC0yMjMuNzEwOCA5NS4wNTI5LC0yMjMuNjMxOSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTcuNDg2OSIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBvPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU2IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI5My4yMzY5IiBjeT0iLTM3My4yIiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5My4yMzY5IiB5PSItMzY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDE5PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyYWN0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjJiM0NTsmZ3Q7dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNOTMuMDI5NywtMzU0LjgwMDZDOTIuODkzNCwtMzQyLjY5NDkgOTIuNzEyMiwtMzI2LjYwNzYgOTIuNTU3NSwtMzEyLjg2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI5Ni4wNTI5LC0zMTIuNDMxOSA5Mi40NDA0LC0zMDIuNDcyIDg5LjA1MzMsLTMxMi41MTA4IDk2LjA1MjksLTMxMi40MzE5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5Ni45MzIyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjMxMS4yMzY5IiBjeT0iLTM3My4yIiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMTEuMjM2OSIgeT0iLTM2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMV08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjJiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPCEtLSB0cmEgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTkuMjM2OSIgY3k9Ii00NzMuNDE1NiIgcng9IjM2LjEyNSIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxOS4yMzY5IiB5PSItNDc3LjYxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTkuMjM2OSIgeT0iLTQ2MC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDE4PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhJiM0NTsmZ3Q7dHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhJiM0NTsmZ3Q7dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0xOTEuMTQ2MSwtNDU0LjQ3MkMxNzkuMDM5NCwtNDQ2LjA0ODIgMTY0Ljg1ODQsLTQzNS44Mjg2IDE1Mi41MjIzLC00MjYgMTQwLjc1MzksLTQxNi42MjM3IDEyOC4yNDEsLTQwNS42NDIyIDExNy43NTg5LC0zOTYuMTI5OCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjExOS45MjM0LC0zOTMuMzY2IDExMC4xODUsLTM4OS4xOTI4IDExNS4xOTU0LC0zOTguNTI4MSAxMTkuOTIzNCwtMzkzLjM2NiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTU4LjA5NDIiIHk9Ii00MTMuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gYzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXYgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTQiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjE4My4yMzY5IiBjeT0iLTM3My4yIiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxODMuMjM2OSIgeT0iLTM2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4weDBCODwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYSYjNDU7Jmd0O3RyYXYgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEmIzQ1OyZndDt0cmF2PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIxNy41NjUyLC00NDMuODYxOEMyMTYuMTg0OCwtNDMyLjY4NjIgMjEzLjY5NzksLTQyMC4wNTMyIDIwOS4yMzY5LC00MDkuMiAyMDcuNjk4MSwtNDA1LjQ1NjQgMjA1LjY5NywtNDAxLjczNDIgMjAzLjQ4NzksLTM5OC4xODIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIxOTcuNzEzLC0zODkuNzg3MyAyMDcuMDg4MSwtMzk1LjQ3NTcgMjAwLjU0NjgsLTM5My45MDY3IDIwMy4zODA3LC0zOTguMDI2MSAyMDMuMzgwNywtMzk4LjAyNjEgMjAzLjM4MDcsLTM5OC4wMjYxIDIwMC41NDY4LC0zOTMuOTA2NyAxOTkuNjczMiwtNDAwLjU3NjYgMTk3LjcxMywtMzg5Ljc4NzMgMTk3LjcxMywtMzg5Ljc4NzMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxOS40ODY5IiB5PSItNDEzLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHY8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmllIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEwIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI0OTMuMjM2OSIgY3k9Ii0zNzMuMiIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDkzLjIzNjkiIHk9Ii0zNjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzJdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDwhLS0gdHJlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzExLjIzNjkiIGN5PSItNDczLjQxNTYiIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzExLjIzNjkiIHk9Ii00NzcuNjE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMxMS4yMzY5IiB5PSItNDYwLjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwM0I8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlJiM0NTsmZ3Q7dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zMTEuMjM2OSwtNDQzLjg4OTdDMzExLjIzNjksLTQzMC40MDQ2IDMxMS4yMzY5LC00MTQuNTEyMyAzMTEuMjM2OSwtNDAxLjIxNTMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzMTQuNzM3LC00MDEuMjAzMyAzMTEuMjM2OSwtMzkxLjIwMzMgMzA3LjczNywtNDAxLjIwMzQgMzE0LjczNywtNDAxLjIwMzMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMxNi4wOTQyIiB5PSItNDEzLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmkgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTEiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmk8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNDQ4LjIzNjkiIGN5PSItNDczLjQxNTYiIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDQ4LjIzNjkiIHk9Ii00NzcuNjE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQ0OC4yMzY5IiB5PSItNDYwLjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwNUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmkmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpJiM0NTsmZ3Q7dHJpZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik00NjAuNzcxOSwtNDQ1LjVDNDY3LjExMDksLTQzMS4zODMgNDc0Ljc3MjMsLTQxNC4zMjA5IDQ4MS4wNjAzLC00MDAuMzE3NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjQ4NC4yNTc1LC00MDEuNzQxNSA0ODUuMTYwOSwtMzkxLjE4NTIgNDc3Ljg3MTcsLTM5OC44NzQgNDg0LjI1NzUsLTQwMS43NDE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0ODAuMDk0MiIgeT0iLTQxMy40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHIgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyODkuMjM2OSIgY3k9Ii01ODUuMDQ2OSIgcng9IjM3LjkwMjciIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyODkuMjM2OSIgeT0iLTU4OS4yNDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPlNwYXJzZTwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI4OS4yMzY5IiB5PSItNTcyLjQ0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwN0U8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyYSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmE8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjYyLjM1MTYsLTU2NC4wMjAxQzI1NC4wODYsLTU1Ni40NDQ0IDI0NS41ODAzLC01NDcuMzQ3NSAyMzkuNTIyMywtNTM3LjYzMTMgMjM0LjcxMzMsLTUyOS45MTg0IDIzMC45NTQ0LC01MjAuOTY3OSAyMjguMDUxMiwtNTEyLjI0MjgiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyMzEuMzcsLTUxMS4xMjU2IDIyNS4xMjY3LC01MDIuNTY1NyAyMjQuNjY5MiwtNTEzLjE1MDYgMjMxLjM3LC01MTEuMTI1NiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjQ1LjA5NDIiIHk9Ii01MjUuMDMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gYTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJhIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmE8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjcyLjczNjYsLTU1OC40NjQzQzI2NS41Mzg0LC01NDYuODkxNyAyNTYuOTg4NywtNTMzLjE3OSAyNDkuMjM2OSwtNTIwLjgzMTMgMjQ2LjcxNTIsLTUxNi44MTQ1IDI0NC4wNjc1LC01MTIuNjEwNSAyNDEuNDMzMSwtNTA4LjQzNTkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMzYuMDg4NiwtNDk5Ljk3NzMgMjQ1LjIzNDQsLTUwNi4wMjc1IDIzOC43NTk0LC01MDQuMjA0MyAyNDEuNDMwMiwtNTA4LjQzMTIgMjQxLjQzMDIsLTUwOC40MzEyIDI0MS40MzAyLC01MDguNDMxMiAyMzguNzU5NCwtNTA0LjIwNDMgMjM3LjYyNTksLTUxMC44MzQ5IDIzNi4wODg2LC00OTkuOTc3MyAyMzYuMDg4NiwtNDk5Ljk3NzMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI2NC4wOTQyIiB5PSItNTI1LjAzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjk1LjAxNzEsLTU1NS43MTcxQzI5Ny42MTkyLC01NDIuNTEzOCAzMDAuNzI4NiwtNTI2LjczNjQgMzAzLjUyNTYsLTUxMi41NDQxIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzA2Ljk5NTUsLTUxMy4wMzc2IDMwNS40OTUzLC01MDIuNTQ5NiAzMDAuMTI3NiwtNTExLjY4NDEgMzA2Ljk5NTUsLTUxMy4wMzc2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMDcuMDk0MiIgeT0iLTUyNS4wMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmkgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyaTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zMTcuMjk2OSwtNTY1LjM0NjVDMzQzLjU1NDksLTU0Ni45MTExIDM4Mi45MzM0LC01MTkuMjY0MiA0MTEuNjQ3OCwtNDk5LjEwNDMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI0MTQuMDE3MywtNTAxLjcxNzIgNDIwLjE5MDQsLTQ5My4xMDY2IDQwOS45OTUsLTQ5NS45ODgyIDQxNC4wMTczLC01MDEuNzE3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzgxLjkzMjIiIHk9Ii01MjUuMDMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gaTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dCYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTI4MS40MDY2LC02NjcuNjU5MUMyNzkuMjMwOSwtNjYxLjkxMTkgMjc3LjE2NjksLTY1NS40MjIgMjc2LjA3NjMsLTY0OS4yNjI2IDI3NC41OTUyLC02NDAuODk3NSAyNzUuMDk2OSwtNjMxLjk1MDcgMjc2LjU1MDksLTYyMy40NzI4Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjgwLjAyODksLTYyMy45NDkzIDI3OC43Mjc3LC02MTMuNDM0NyAyNzMuMTg3OSwtNjIyLjQ2NTggMjgwLjAyODksLTYyMy45NDkzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyODAuMzE3MiIgeT0iLTYzNi42NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE3IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dCYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTI4OS4yMzY5LC02NjYuODgxNUMyODkuMjM2OSwtNjU1LjE1MDIgMjg5LjIzNjksLTYzOS40Nzc0IDI4OS4yMzY5LC02MjQuOTg4NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjI4OS4yMzY5LC02MTQuNzIwOSAyOTMuNzM3LC02MjQuNzIwOCAyODkuMjM2OSwtNjE5LjcyMDkgMjg5LjIzNywtNjI0LjcyMDkgMjg5LjIzNywtNjI0LjcyMDkgMjg5LjIzNywtNjI0LjcyMDkgMjg5LjIzNjksLTYxOS43MjA5IDI4NC43MzcsLTYyNC43MjA5IDI4OS4yMzY5LC02MTQuNzIwOSAyODkuMjM2OSwtNjE0LjcyMDkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI5My4zMTcyIiB5PSItNjM2LjY2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2JiM0NTsmZ3Q7dHJhIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdiYjNDU7Jmd0O3RyYTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0xNzIuMTMyNSwtMzkwLjcxOTZDMTY2Ljk1NzYsLTQwMS4xOTM4IDE2Mi45MjUsLTQxNC42MzE5IDE2Ny45MDAzLC00MjYgMTcxLjQzMTUsLTQzNC4wNjg2IDE3Ny4wODgxLC00NDEuMzczOSAxODMuMzgwOCwtNDQ3LjciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIxOTAuOTcwNywtNDU0LjY2MzcgMTgwLjU1OTksLTQ1MS4yMTkgMTg3LjI4NjQsLTQ1MS4yODM0IDE4My42MDIxLC00NDcuOTAzMSAxODMuNjAyMSwtNDQ3LjkwMzEgMTgzLjYwMjEsLTQ0Ny45MDMxIDE4Ny4yODY0LC00NTEuMjgzNCAxODYuNjQ0NCwtNDQ0LjU4NzMgMTkwLjk3MDcsLTQ1NC42NjM3IDE5MC45NzA3LC00NTQuNjYzNyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTg2LjkwNTIiIHk9Ii00MTMuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDBCODwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE1IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBjeD0iMTg5LjIzNjkiIGN5PSItMjg0LjQiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE4OS4yMzY5IiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+MHgwQjk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2JiM0NTsmZ3Q7dHJhdmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjAiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2JiM0NTsmZ3Q7dHJhdmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjA2LjAwNCwtMzU5LjAwMTJDMjEzLjIxOTQsLTM1My4yMTAyIDIyMC4zMzAxLC0zNDUuODI5NCAyMjQuMjM2OSwtMzM3LjIgMjI4LjkzNzgsLTMyNi44MTY0IDIyNC4wOTU5LC0zMTYuMTg2NCAyMTYuNjY3NSwtMzA3LjIxMTQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMDkuNjQ4NSwtMjk5Ljc5OCAyMTkuNzkxNSwtMzAzLjk2NTcgMjEzLjA4NjEsLTMwMy40Mjg4IDIxNi41MjM4LC0zMDcuMDU5NiAyMTYuNTIzOCwtMzA3LjA1OTYgMjE2LjUyMzgsLTMwNy4wNTk2IDIxMy4wODYxLC0zMDMuNDI4OCAyMTMuMjU2MSwtMzEwLjE1MzUgMjA5LjY0ODUsLTI5OS43OTggMjA5LjY0ODUsLTI5OS43OTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzMS4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2JiM0NTsmZ3Q7dHJhdmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2JiM0NTsmZ3Q7dHJhdmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNMTY1LjkyMzksLTM1Ny4wMjcxQzE1Ny4xNjI2LC0zNDYuODExMyAxNDkuMzY3MiwtMzMzLjE3MjUgMTU0LjUyMjMsLTMyMC40IDE1Ni4zNzQ2LC0zMTUuODEwNyAxNTkuMTIzLC0zMTEuNDgwMyAxNjIuMjc2NywtMzA3LjUyMTEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIxNjUuMDIyMywtMzA5LjcwNDIgMTY5LjE2MiwtMjk5Ljk1MTUgMTU5Ljg0NCwtMzA0Ljk5NCAxNjUuMDIyMywtMzA5LjcwNDIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE2MC4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZSYjNDU7Jmd0O3RyYXYgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZSYjNDU7Jmd0O3RyYXY8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMTg1LjM5MjYsLTMwMi42MzI1QzE4NC4zNjk1LC0zMDguMjk4NSAxODMuNDA4MywtMzE0LjU4MzcgMTgyLjkwMDMsLTMyMC40IDE4Mi4yMDk0LC0zMjguMzEwNyAxODIuMDI0NiwtMzM2LjkxMzQgMTgyLjA4MjUsLTM0NC44MzM5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMTgyLjI4NzIsLTM1NS4wODI5IDE3Ny41ODgzLC0zNDUuMTc0OCAxODIuMTg3MywtMzUwLjA4MzkgMTgyLjA4NzQsLTM0NS4wODQ5IDE4Mi4wODc0LC0zNDUuMDg0OSAxODIuMDg3NCwtMzQ1LjA4NDkgMTgyLjE4NzMsLTM1MC4wODM5IDE4Ni41ODY1LC0zNDQuOTk1IDE4Mi4yODcyLC0zNTUuMDgyOSAxODIuMjg3MiwtMzU1LjA4MjkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwMS45MDUyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwQjk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXIgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTYiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXI8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBjeD0iMTk0LjIzNjkiIGN5PSItMTk1LjYiIHJ4PSIzOC44NjcxIiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE5NC4yMzY5IiB5PSItMTkxLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+MHgwQkE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZSYjNDU7Jmd0O3RyYXZlciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlJiM0NTsmZ3Q7dHJhdmVyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIxMy4wODk4LC0yNzAuNDE1NEMyMjAuNjU0OSwtMjY0LjY0NDYgMjI4LjExNzMsLTI1Ny4yMjE3IDIzMi4yMzY5LC0yNDguNCAyMzcuMjc2OSwtMjM3LjYwNzMgMjMxLjcxNDIsLTIyNi43NDU2IDIyMy40Mjk3LC0yMTcuNzAzNiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIxNi4wMDM1LC0yMTAuNTc3OCAyMjYuMzM0NywtMjE0LjI1NDUgMjE5LjYxMTMsLTIxNC4wMzk2IDIyMy4yMTksLTIxNy41MDE1IDIyMy4yMTksLTIxNy41MDE1IDIyMy4yMTksLTIxNy41MDE1IDIxOS42MTEzLC0yMTQuMDM5NiAyMjAuMTAzNCwtMjIwLjc0ODUgMjE2LjAwMzUsLTIxMC41Nzc4IDIxNi4wMDM1LC0yMTAuNTc3OCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM4LjMxNzIiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlJiM0NTsmZ3Q7dHJhdmVyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTI1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmUmIzQ1OyZndDt0cmF2ZXI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNMTcyLjg3ODIsLTI2OC4xODUxQzE2NC41OTc2LC0yNTcuOTUzNCAxNTcuMjI0OCwtMjQ0LjMxMjggMTYyLjA3NjMsLTIzMS42IDE2My43MDAxLC0yMjcuMzQ0OSAxNjYuMDgzOCwtMjIzLjI3NDEgMTY4LjgzMTUsLTIxOS41MDExIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iMTcxLjU2NjgsLTIyMS42ODU5IDE3NS4yNzQ3LC0yMTEuNzYxIDE2Ni4xODY5LC0yMTcuMjA3NCAxNzEuNTY2OCwtMjIxLjY4NTkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE2Ni4zMTcyIiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXImIzQ1OyZndDt0cmF2ZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlciYjNDU7Jmd0O3RyYXZlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTE5MC4zMjgsLTIxMy44Mjk4QzE4OS4yODc3LC0yMTkuNDk1NyAxODguMzEwMywtMjI1Ljc4MTUgMTg3Ljc5MzcsLTIzMS42IDE4Ny4wOTEyLC0yMzkuNTEyNSAxODcuMDI5NCwtMjQ4LjExNTcgMTg3LjI1NTEsLTI1Ni4wMzYzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMTg3LjcwNzksLTI2Ni4yODQ5IDE4Mi43NzA4LC0yNTYuNDkzNCAxODcuNDg3MSwtMjYxLjI4OTggMTg3LjI2NjQsLTI1Ni4yOTQ3IDE4Ny4yNjY0LC0yNTYuMjk0NyAxODcuMjY2NCwtMjU2LjI5NDcgMTg3LjQ4NzEsLTI2MS4yODk4IDE5MS43NjIsLTI1Ni4wOTYgMTg3LjcwNzksLTI2Ni4yODQ5IDE4Ny43MDc5LC0yNjYuMjg0OSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjA4LjQ1ODUiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDBCQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTciIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjIwMy4yMzY5IiBjeT0iLTEwNi44IiByeD0iMzguMzA1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwMy4yMzY5IiB5PSItMTAyLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+MHgwQkI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXImIzQ1OyZndDt0cmF2ZXJzIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyJiM0NTsmZ3Q7dHJhdmVyczwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMTkuNjQ4NSwtMTgxLjQ4NjRDMjI3LjM5OTYsLTE3NS43ODM5IDIzNC45ODk2LC0xNjguNDM3MSAyMzkuMjM2OSwtMTU5LjYgMjQ0LjI2ODIsLTE0OS4xMzE3IDIzOS4xNjQ0LC0xMzguMzk1NCAyMzEuMzczMiwtMTI5LjM2MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIyNC4zNjAxLC0xMjIuMjE1NiAyMzQuNTc2NCwtMTI2LjIwMDMgMjI3Ljg2MjQsLTEyNS43ODQgMjMxLjM2NDgsLTEyOS4zNTI0IDIzMS4zNjQ4LC0xMjkuMzUyNCAyMzEuMzY0OCwtMTI5LjM1MjQgMjI3Ljg2MjQsLTEyNS43ODQgMjI4LjE1MzIsLTEzMi41MDQ2IDIyNC4zNjAxLC0xMjIuMjE1NiAyMjQuMzYwMSwtMTIyLjIxNTYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI0NS43MDkyIiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBzPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyJiM0NTsmZ3Q7dHJhdmVycyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlciYjNDU7Jmd0O3RyYXZlcnM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNMTc3Ljc0MDMsLTE3OS4yNzIyQzE2OS40MjQ2LC0xNjguOTk4MSAxNjIuMDk4NiwtMTU1LjM1MjQgMTY3LjI5MjMsLTE0Mi44IDE2OS4yNjc3LC0xMzguMDI1OCAxNzIuMjE3MywtMTMzLjU1MzYgMTc1LjU5MjYsLTEyOS40OTQ4Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMGZmIiBzdHJva2U9IiMwMDAwZmYiIHBvaW50cz0iMTc4LjEzNjQsLTEzMS44OTg4IDE4Mi40NjQyLC0xMjIuMjI4MiAxNzMuMDUwMywtMTI3LjA4OTIgMTc4LjEzNjQsLTEzMS44OTg4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNzIuNzA5MiIgeT0iLTE0NyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gczwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnMmIzQ1OyZndDt0cmF2ZXIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTE5OC42NzM0LC0xMjUuMDA1MUMxOTcuNDM4MiwtMTMwLjY2OTkgMTk2LjI1MzMsLTEzNi45NjE0IDE5NS41NjM3LC0xNDIuOCAxOTQuNjMyLC0xNTAuNjg4MyAxOTQuMTc4OSwtMTU5LjI4MzggMTkzLjk4NzMsLTE2Ny4yMDQ2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMTkzLjg2NzUsLTE3Ny40NTc3IDE4OS40ODQ3LC0xNjcuNDA1OCAxOTMuOTI1OSwtMTcyLjQ1ODEgMTkzLjk4NDQsLTE2Ny40NTg0IDE5My45ODQ0LC0xNjcuNDU4NCAxOTMuOTg0NCwtMTY3LjQ1ODQgMTkzLjkyNTksLTE3Mi40NTgxIDE5OC40ODQxLC0xNjcuNTExIDE5My44Njc1LC0xNzcuNDU3NyAxOTMuODY3NSwtMTc3LjQ1NzciLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNi4wNzM1IiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MEJCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyc2UgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTgiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSIyMDMuMjM2OSIgY3k9Ii0xOCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAzLjIzNjkiIHk9Ii0xMy44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPmNvbnRlbnRBcnJheVszXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnMmIzQ1OyZndDt0cmF2ZXJzZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcnMmIzQ1OyZndDt0cmF2ZXJzZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xODQuODY3NiwtOTAuOTU2OUMxNzkuNTEzNSwtODUuMjEzMiAxNzQuMzQ3NCwtNzguMjgwNSAxNzEuNTIyMywtNzAuOCAxNjguODg0MywtNjMuODE0OSAxNjguODg0MywtNjAuOTg1MSAxNzEuNTIyMywtNTQgMTcyLjg2NjgsLTUwLjQzOTkgMTc0Ljc0MTUsLTQ3LjAwNCAxNzYuOTE0NCwtNDMuNzYxMiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjE4My4yMDMsLTM1LjY3NiAxODAuNjE1NSwtNDYuMzMyMyAxODAuMTMzMiwtMzkuNjIyNyAxNzcuMDYzNCwtNDMuNTY5NSAxNzcuMDYzNCwtNDMuNTY5NSAxNzcuMDYzNCwtNDMuNTY5NSAxODAuMTMzMiwtMzkuNjIyNyAxNzMuNTExNCwtNDAuODA2NyAxODMuMjAzLC0zNS42NzYgMTgzLjIwMywtMzUuNjc2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNzcuMDk0MiIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyc2UgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyc2U8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNMjAzLjIzNjksLTg4LjQwMDZDMjAzLjIzNjksLTc2LjI5NDkgMjAzLjIzNjksLTYwLjIwNzYgMjAzLjIzNjksLTQ2LjQ2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIyMDYuNzM3LC00Ni4wNzIgMjAzLjIzNjksLTM2LjA3MiAxOTkuNzM3LC00Ni4wNzIxIDIwNi43MzcsLTQ2LjA3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjA4LjA5NDIiIHk9Ii01OC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyc2UmIzQ1OyZndDt0cmF2ZXJzIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTI4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyc2UmIzQ1OyZndDt0cmF2ZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTIwOS45MDI0LC0zNi4wNzIyQzIxMS42NzgyLC00MS43MzE3IDIxMy4zNDg3LC00OC4wNTM1IDIxNC4yMzY5LC01NCAyMTUuMzM5OSwtNjEuMzg0NyAyMTUuMzM5OSwtNjMuNDE1MyAyMTQuMjM2OSwtNzAuOCAyMTMuODM0NCwtNzMuNDk0NSAyMTMuMjcxMywtNzYuMjY2MSAyMTIuNjEwNiwtNzkuMDE4MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjIwOS45MDI0LC04OC43Mjc4IDIwOC4yNTQ2LC03Ny44ODY0IDIxMS4yNDU4LC04My45MTE2IDIxMi41ODkxLC03OS4wOTU0IDIxMi41ODkxLC03OS4wOTU0IDIxMi41ODkxLC03OS4wOTU0IDIxMS4yNDU4LC04My45MTE2IDIxNi45MjM3LC04MC4zMDQ0IDIwOS45MDI0LC04OC43Mjc4IDIwOS45MDI0LC04OC43Mjc4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjQuMjczMiIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+IH4zPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQubTMuc3ZnIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLm0zLnN2ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzExMTRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLm0zLnN2ZwpAQCAtMCwwICsxLDUwMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgorPCEtLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBHZW5lcmF0ZWQgYnkgZ3JhcGh2aXogdmVyc2lvbiAyLjQwLjEgKDIwMTYxMjI1LjAzMDQpCisjIGVtYmVkZGVkIERPVCAocGxhbnR1bWwpIHdvcmtzIGluIElERUEgcHJldmlldworIyBidXQgbm90IG9uIEdpdEh1YgorYGBgcGxhbnR1bWwKK2RpZ3JhcGggRyB7CisgICAgeyByYW5rPXNhbWUgcm9vdCAtPiBzdGFydCBbc3R5bGU9aW52aXNdIH0KKyAgICBzdGFydCBbbGFiZWw9InN0YXJ0L2VuZCJdCisKKyAgICB0cmFjdG9yIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMF0iXQorICAgIHRyYWN0byBbbGFiZWwgPSAiMHgwMUIiXQorICAgIHRyYWN0IFtsYWJlbCA9ICIweDAxQSJdCisgICAgdHJhYyBbbGFiZWwgPSAiMHgwMTkiXQorICAgIHRyYSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDE4IjsgY29sb3IgPSAibGlnaHRncmV5IjsgZm9udGNvbG9yID0gbGlnaHRncmF5XQorCisgICAgdHJlZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzFdIl0KKyAgICB0cmUgW2xhYmVsID0gIkNoYWluXG4weDAzQiJdCisgICAgdHJpZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzJdIl0KKyAgICB0cmkgW2xhYmVsID0gIkNoYWluXG4weDA1QiJdCisKKyAgICB0ciBbbGFiZWwgPSAiU3BhcnNlXG4weDA3RSJdCisKKyAgICB0IFtsYWJlbCA9ICIweDA5QiJdCisgICAgcm9vdCBbbGFiZWwgPSAiQ2hhaW5cbjB4OUEiXQorCisgICAgcm9vdCAtPiB0IFtsYWJlbCA9ICIgdCJdCisgICAgdCAtPiB0ciBbbGFiZWwgPSAiIHIiXQorICAgIHRyYWMgLT4gdHJhY3QgW2xhYmVsID0gIiB0Il0KKyAgICB0cmFjdCAtPiB0cmFjdG8gW2xhYmVsID0gIiBvIl0KKyAgICB0cmFjdG8gLT4gdHJhY3RvciBbbGFiZWwgPSAiIHIiXQorCisgICAgdHIgLT4gdHJhIFtsYWJlbCA9ICIgYSI7IGNvbG9yID0gImxpZ2h0Z3JleSI7IGZvbnRjb2xvciA9IGxpZ2h0Z3JheV0KKyAgICB0cmEgLT4gdHJhYyBbbGFiZWwgPSAiIGMiOyBjb2xvciA9ICJsaWdodGdyZXkiOyBmb250Y29sb3IgPSBsaWdodGdyYXldCisKKyAgICB0ciAtPiB0cmUgW2xhYmVsID0gIiBlIl0KKyAgICB0cmUgLT4gdHJlZSBbbGFiZWwgPSAiIGUiXQorCisgICAgdHIgLT4gdHJpIFtsYWJlbCA9ICIgaSJdCisgICAgdHJpIC0+IHRyaWUgW2xhYmVsID0gIiBlIl0KKworICAgIHN1YmdyYXBoIHBhdGggeworICAgICAgICBlZGdlIFtjb2xvciA9ICJsaWdodGJsdWUiOyBmb250Y29sb3I9ImJsdWUiOyBhcnJvd2hlYWQ9InZlZSJdCisgICAgICAgIG5vZGUgW2NvbG9yID0gImJsdWUiOyBmb250Y29sb3I9ImJsdWUiXQorCisgICAgICAgIHN0YXJ0IC0+IHJvb3QKKworICAgICAgICByb290IC0+IHQgW2xhYmVsID0gIiB0Il0KKyAgICAgICAgdCAtPiB0ciBbbGFiZWwgPSAiIHIiXQorICAgICAgICB0ciAtPiB0cmEgW2xhYmVsID0gIiBhIl0KKyAgICAgICAgdHJhIC0+IHRyYXYgW2xhYmVsID0gIiB2Il0KKyAgICAgICAgdHJhdiAtPiB0cmF2ZSBbbGFiZWwgPSAiIGUiXQorICAgICAgICB0cmF2ZSAtPiB0cmF2ZXIgW2xhYmVsID0gIiByIl0KKyAgICAgICAgdHJhdmVyIC0+IHRyYXZlcnMgW2xhYmVsID0gIiBzIl0KKyAgICAgICAgdHJhdmVycyAtPiB0cmF2ZXJzZSBbbGFiZWwgPSAiIGUiXQorCisgICAgICAgIHRyYTIgW2xhYmVsID0gIlNwYXJzZVxuMHgwREUiXQorICAgICAgICB0cmF2IFtsYWJlbCA9ICJDaGFpblxuMHgwQjgiXQorICAgICAgICB0cmF2ZSBbbGFiZWwgPSAiMHgwQjkiXQorICAgICAgICB0cmF2ZXIgW2xhYmVsID0gIjB4MEJBIl0KKyAgICAgICAgdHJhdmVycyBbbGFiZWwgPSAiMHgwQkIiXQorICAgICAgICB0cmF2ZXJzZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzNdIl0KKyAgICB9CisKKyAgICB7cmFuaz1zYW1lIHRyYSAtPiB0cmEyIC0+IHRyZSAtPiB0cmkgW3N0eWxlPWludmlzXX0KKyAgICB7cmFuaz1zYW1lIHRyYWMgLT4gdHJhdiAtPiB0cmVlIC0+IHRyaWUgW3N0eWxlPWludmlzXX0KKworICAgIHsKKyAgICAgICAgZWRnZSBbY29sb3IgPSAiYmx1ZSJdCisgICAgICAgIHRyIC0+IHRyYTIgW2xhYmVsID0gIiBhIl0KKyAgICAgICAgdHJhMiAtPiB0cmFjIFtsYWJlbCA9ICIgYyJdCisgICAgICAgIHRyYTIgLT4gdHJhdiBbbGFiZWwgPSAiIHYiXQorICAgICAgICB0cmF2IC0+IHRyYXZlIFtsYWJlbCA9ICIgZSJdCisgICAgICAgIHRyYXZlIC0+IHRyYXZlciBbbGFiZWwgPSAiIHIiXQorICAgICAgICB0cmF2ZXIgLT4gdHJhdmVycyBbbGFiZWwgPSAiIHMiXQorICAgICAgICB0cmF2ZXJzIC0+IHRyYXZlcnNlIFtsYWJlbCA9ICIgZSJdCisgICAgfQorCisgICAgc3ViZ3JhcGggYmFjayB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gInBpbmsiOyBmb250Y29sb3I9InJlZCI7IGFycm93aGVhZD0idmVlIjsgY29uc3RyYWluPSJmYWxzZSJdCisKKyAgICAgICAgdHJhdmVyc2UgLT4gdHJhdmVycyBbbGFiZWwgPSAiIH4zIl0KKyAgICAgICAgdHJhdmVycyAtPiB0cmF2ZXIgW2xhYmVsID0gIjB4MEJCIl0KKyAgICAgICAgdHJhdmVyIC0+IHRyYXZlIFtsYWJlbCA9ICIweDBCQSJdCisgICAgICAgIHRyYXZlIC0+IHRyYXYgW2xhYmVsID0gIjB4MEI5Il0KKyAgICAgICAgdHJhdiAtPiB0cmEyIFtsYWJlbCA9ICIweDBCOCJdCisgICAgICAgIHRyYTIgLT4gdHIgW2xhYmVsID0gIjB4MERFIl0KKyAgICAgICAgdHIgLT4gdCBbbGFiZWwgPSAiMHgwN0UiXQorICAgICAgICB0IC0+IHJvb3QgW2xhYmVsID0gIjB4MDlCIl0KKyAgICAgICAgcm9vdCAtPiBzdGFydCBbbGFiZWwgPSAiMHgwOUEiXQorICAgIH0KK30KK2BgYAorIC0tPgorPCEtLSBUaXRsZTogRyBQYWdlczogMSAtLT4KKzxzdmcgd2lkdGg9IjYxMXB0IiBoZWlnaHQ9Ijg0NnB0IgorICAgICB2aWV3Qm94PSIwLjAwIDAuMDAgNjExLjQ3IDg0NS43MyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CisgICAgPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDg0MS43MjUxKSI+CisgICAgICAgIDx0aXRsZT5HPC90aXRsZT4KKyAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgcG9pbnRzPSItNCw0IC00LC04NDEuNzI1MSA2MDcuNDczOCwtODQxLjcyNTEgNjA3LjQ3MzgsNCAtNCw0Ii8+CisgICAgICAgIDwhLS0gcm9vdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMzAuMjM2OSIgY3k9Ii04MDguMzA5NSIgcng9IjMzLjEzMzciIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzAuMjM2OSIgeT0iLTgxMi41MDk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjMwLjIzNjkiIHk9Ii03OTUuNzA5NSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDlBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gc3RhcnQgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnN0YXJ0PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM2My4yMzY5IiBjeT0iLTgwOC4zMDk1IiByeD0iNDQuMDc3NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNjMuMjM2OSIgeT0iLTgwNC4xMDk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPnN0YXJ0L2VuZDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDtzdGFydCAtLT4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7c3RhcnQgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNDMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290JiM0NTsmZ3Q7c3RhcnQ8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjYzLjc5ODQsLTgwOC4zMDk1QzI3Ny4zMDM3LC04MDguMzA5NSAyOTMuMjMzOSwtODA4LjMwOTUgMzA4LjMzOTgsLTgwOC4zMDk1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMzE4LjYyNjEsLTgwOC4zMDk1IDMwOC42MjYyLC04MTIuODA5NiAzMTMuNjI2MSwtODA4LjMwOTUgMzA4LjYyNjEsLTgwOC4zMDk2IDMwOC42MjYxLC04MDguMzA5NiAzMDguNjI2MSwtODA4LjMwOTYgMzEzLjYyNjEsLTgwOC4zMDk1IDMwOC42MjYxLC04MDMuODA5NiAzMTguNjI2MSwtODA4LjMwOTUgMzE4LjYyNjEsLTgwOC4zMDk1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyOTEuMjUwOSIgeT0iLTgxNS41MDk1IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MDlBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnQ8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjMwLjIzNjkiIGN5PSItNzA4LjA5MzkiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzMC4yMzY5IiB5PSItNzAzLjg5MzkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwOUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7dCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjEwLjk1NjQsLTc4NC4yNjEyQzIwMy43MzkzLC03NzIuMzQ4NSAxOTguMjc2OCwtNzU3LjY0NjIgMjAyLjg0NjMsLTc0NC4wOTM5IDIwNC4xNjM2LC03NDAuMTg2OSAyMDYuMDkyNiwtNzM2LjM2ODQgMjA4LjMyNjksLTczMi43NjYzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjExLjM4NDQsLTczNC41MDY4IDIxNC4zMzU3LC03MjQuMzMxMyAyMDUuNjgzLC03MzAuNDQ1NCAyMTEuMzg0NCwtNzM0LjUwNjgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwNi45MzIyIiB5PSItNzQ4LjI5MzkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7dCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3QmIzQ1OyZndDt0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIzMC4yMzY5LC03NzguNzgzNUMyMzAuMjM2OSwtNzY1LjI5ODQgMjMwLjIzNjksLTc0OS40MDYyIDIzMC4yMzY5LC03MzYuMTA5MiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIzMC4yMzY5LC03MjYuMDk3MiAyMzQuNzM3LC03MzYuMDk3MSAyMzAuMjM2OSwtNzMxLjA5NzIgMjMwLjIzNywtNzM2LjA5NzIgMjMwLjIzNywtNzM2LjA5NzIgMjMwLjIzNywtNzM2LjA5NzIgMjMwLjIzNjksLTczMS4wOTcyIDIyNS43MzcsLTczNi4wOTcyIDIzMC4yMzY5LC03MjYuMDk3MiAyMzAuMjM2OSwtNzI2LjA5NzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzMy45MzIyIiB5PSItNzQ4LjI5MzkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSBzdGFydCYjNDU7Jmd0O3Jvb3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5zdGFydCYjNDU7Jmd0O3Jvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMzE5LjQwNDIsLTgwNS42MzMzQzMwNy4yOTM4LC04MDUuMTgxOCAyOTQuMTQ3OSwtODA0Ljk1ODQgMjgyLjAxODQsLTgwNS4zMDk1IDI3OS4zMjY0LC04MDUuMzg3NCAyNzYuNTU2OCwtODA1LjQ4ODEgMjczLjc2NDMsLTgwNS42MDUxIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjYzLjY1MDQsLTgwNi4wODkgMjczLjQyMzksLTgwMS4xMTYxIDI2OC42NDQ3LC04MDUuODUgMjczLjYzOSwtODA1LjYxMSAyNzMuNjM5LC04MDUuNjExIDI3My42MzksLTgwNS42MTEgMjY4LjY0NDcsLTgwNS44NSAyNzMuODU0MSwtODEwLjEwNTggMjYzLjY1MDQsLTgwNi4wODkgMjYzLjY1MDQsLTgwNi4wODkiLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xMDYuOCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTEwMi42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVswXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9Ijc0LjIzNjkiIGN5PSItMTk1LjYiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc0LjIzNjkiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byYjNDU7Jmd0O3RyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0byYjNDU7Jmd0O3RyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNzQuMDI5NywtMTc3LjIwMDZDNzMuODkzNCwtMTY1LjA5NDkgNzMuNzEyMiwtMTQ5LjAwNzYgNzMuNTU3NSwtMTM1LjI2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI3Ny4wNTI5LC0xMzQuODMxOSA3My40NDA0LC0xMjQuODcyIDcwLjA1MzMsLTEzNC45MTA4IDc3LjA1MjksLTEzNC44MzE5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3OC4zMTcyIiB5PSItMTQ3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9Ijc4LjIzNjkiIGN5PSItMjg0LjQiIHJ4PSIzNy4xNDQzIiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc4LjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0JiM0NTsmZ3Q7dHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdCYjNDU7Jmd0O3RyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik03Ny40MDgxLC0yNjYuMDAwNkM3Ni44NjI4LC0yNTMuODk0OSA3Ni4xMzgxLC0yMzcuODA3NiA3NS41MTkyLC0yMjQuMDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijc4Ljk5NzUsLTIyMy41MDQ0IDc1LjA1MDksLTIxMy42NzIgNzIuMDA0NiwtMjIzLjgxOTQgNzguOTk3NSwtMjIzLjUwNDQiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjgyLjQ4NjkiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gbzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWM8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iOTQuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTQuMjM2OSIgeT0iLTM4MC40MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDE5PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyYWN0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjJiM0NTsmZ3Q7dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNOTEuMzAyMiwtMzY2LjIzNDVDODguOTExNSwtMzUxLjI2MDMgODUuNDk1NSwtMzI5Ljg2NDMgODIuNzU2LC0zMTIuNzA1NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijg2LjE4NTgsLTMxMS45ODc3IDgxLjE1MjksLTMwMi42NjQ2IDc5LjI3MzQsLTMxMy4wOTEzIDg2LjE4NTgsLTMxMS45ODc3Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI4OS45MzIyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSIyMDIuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDIuMjM2OSIgeT0iLTM4OC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAyLjIzNjkiIHk9Ii0zNzIuMDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4weDBCODwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmF2IC0tPgorICAgICAgICA8IS0tIHRyYSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU3IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2QzZDNkMyIgY3g9IjEyNC4yMzY5IiBjeT0iLTQ5Ni4yNDY5IiByeD0iMzYuMTI1IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTI0LjIzNjkiIHk9Ii01MDAuNDQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZDNkM2QzIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEyNC4yMzY5IiB5PSItNDgzLjY0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2QzZDNkMyI+MHgwMTg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmFjIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEmIzQ1OyZndDt0cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2QzZDNkMyIgZD0iTTEwOC43OTIsLTQ2OS42MTA0QzEwNS41NjU3LC00NjMuMDA4IDEwMi41MzY0LC00NTUuODE4IDEwMC41MjIzLC00NDguODMxMyA5Ny4yMDY4LC00MzcuMzMwMyA5NS41NjQxLC00MjQuMjQyOSA5NC43NzUyLC00MTIuODk2OSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2QzZDNkMyIgc3Ryb2tlPSIjZDNkM2QzIiBwb2ludHM9Ijk4LjI1ODEsLTQxMi40NzAxIDk0LjI1MzksLTQwMi42NjExIDkxLjI2NzIsLTQxMi44MjYyIDk4LjI1ODEsLTQxMi40NzAxIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMDYuMDk0MiIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNkM2QzZDMiPiBjPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhJiM0NTsmZ3Q7dHJhdiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYSYjNDU7Jmd0O3RyYXY8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMTI0LjgwMjQsLTQ2Ni43MTUxQzEyNi4xODMyLC00NTUuMTY5NSAxMjkuMjU1NSwtNDQyLjI3MTIgMTM1LjczNjksLTQzMi4wMzEzIDE0Mi4yNTM5LC00MjEuNzM1MSAxNTEuODg5NCwtNDEzLjAwODMgMTYxLjgxNTIsLTQwNS45NTc2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTcwLjE1OTEsLTQwMC40MzE1IDE2NC4zMDY1LC00MDkuNzA1MSAxNjUuOTkwNCwtNDAzLjE5MjQgMTYxLjgyMTgsLTQwNS45NTMzIDE2MS44MjE4LC00MDUuOTUzMyAxNjEuODIxOCwtNDA1Ljk1MzMgMTY1Ljk5MDQsLTQwMy4xOTI0IDE1OS4zMzcsLTQwMi4yMDE1IDE3MC4xNTkxLC00MDAuNDMxNSAxNzAuMTU5MSwtNDAwLjQzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE0MS40ODY5IiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHY8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEyIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE5IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhMjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGN4PSIyMzUuMjM2OSIgY3k9Ii00OTYuMjQ2OSIgcng9IjM5LjIxNDUiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzUuMjM2OSIgeT0iLTUwMC40NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPlNwYXJzZTwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzNS4yMzY5IiB5PSItNDgzLjY0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+MHgwREU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmEyIC0tPgorICAgICAgICA8IS0tIHRyZWUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlOCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzQ4LjIzNjkiIGN5PSItMzg0LjYxNTYiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM0OC4yMzY5IiB5PSItMzgwLjQxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzFdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyaWU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNTMwLjIzNjkiIGN5PSItMzg0LjYxNTYiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjUzMC4yMzY5IiB5PSItMzgwLjQxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzJdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDwhLS0gdHJlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzQ4LjIzNjkiIGN5PSItNDk2LjI0NjkiIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzQ4LjIzNjkiIHk9Ii01MDAuNDQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM0OC4yMzY5IiB5PSItNDgzLjY0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwM0I8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlJiM0NTsmZ3Q7dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zNDguMjM2OSwtNDY2LjYyNDlDMzQ4LjIzNjksLTQ0OS45ODczIDM0OC4yMzY5LC00MjkuMzM0IDM0OC4yMzY5LC00MTIuOTE2MyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjM1MS43MzcsLTQxMi44MjM5IDM0OC4yMzY5LC00MDIuODIzOSAzNDQuNzM3LC00MTIuODIzOSAzNTEuNzM3LC00MTIuODIzOSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzUzLjA5NDIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyaTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI0NTkuMjM2OSIgY3k9Ii00OTYuMjQ2OSIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NTkuMjM2OSIgeT0iLTUwMC40NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDU5LjIzNjkiIHk9Ii00ODMuNjQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA1QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZSYjNDU7Jmd0O3RyaSAtLT4KKyAgICAgICAgPCEtLSB0cmkmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpJiM0NTsmZ3Q7dHJpZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik00NzYuMDYyOSwtNDY5Ljc5MTlDNDg3LjMwNzIsLTQ1Mi4xMTI4IDUwMi4wNDU3LC00MjguOTM5OSA1MTMuMzEwNiwtNDExLjIyODMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI1MTYuNDM0NSwtNDEyLjgzODQgNTE4Ljg0OCwtNDAyLjUyMjEgNTEwLjUyNzksLTQwOS4wODE3IDUxNi40MzQ1LC00MTIuODM4NCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNTAzLjA5NDIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHI8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjMwLjIzNjkiIGN5PSItNjA3Ljg3ODIiIHJ4PSIzNy45MDI3IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjMwLjIzNjkiIHk9Ii02MTIuMDc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5TcGFyc2U8L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzAuMjM2OSIgeT0iLTU5NS4yNzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDdFPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmEgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2QzZDNkMyIgZD0iTTE5NS43NDM4LC01OTUuMTgwN0MxNzguODcwOCwtNTg3LjQzMDggMTU5LjQ2MSwtNTc1Ljk4ODkgMTQ2LjUyMjMsLTU2MC40NjI2IDE0MC40MTk1LC01NTMuMTM5MyAxMzUuOTQ5MSwtNTQ0LjA0MzYgMTMyLjY4ODcsLTUzNS4wMjMzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZDNkM2QzIiBzdHJva2U9IiNkM2QzZDMiIHBvaW50cz0iMTM1Ljk3NzcsLTUzMy44MTY4IDEyOS42MDU3LC01MjUuMzUyMyAxMjkuMzA4NCwtNTM1Ljk0MyAxMzUuOTc3NywtNTMzLjgxNjgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE1Mi4wOTQyIiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2QzZDNkMyI+IGE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyYSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIwNy43NTcsLTU4NC4yMDQxQzE5MS45MTA3LC01NjcuNTE1OSAxNzAuNTQyNiwtNTQ1LjAxMjcgMTUzLjM4NywtNTI2Ljk0NTciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIxNDYuMzIwOSwtNTE5LjUwNDEgMTU2LjQ2OTksLTUyMy42NTcxIDE0OS43NjM4LC01MjMuMTMgMTUzLjIwNjcsLTUyNi43NTU4IDE1My4yMDY3LC01MjYuNzU1OCAxNTMuMjA2NywtNTI2Ljc1NTggMTQ5Ljc2MzgsLTUyMy4xMyAxNDkuOTQzNSwtNTI5Ljg1NDQgMTQ2LjMyMDksLTUxOS41MDQxIDE0Ni4zMjA5LC01MTkuNTA0MSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTg5LjA5NDIiIHk9Ii01NDcuODYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gYTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yNTQuNDAwNywtNTg1LjAxODZDMjcyLjM3NzMsLTU2OC4wMTIyIDI5Ny4wNzYsLTU0NC42NDY1IDMxNi42MjE4LC01MjYuMTU1NiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjMxOS4yNDYzLC01MjguNDkwOSAzMjQuMTA1NCwtNTE5LjA3NiAzMTQuNDM1NywtNTIzLjQwNTggMzE5LjI0NjMsLTUyOC40OTA5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMDIuMDk0MiIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmkgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyaTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yNjIuNTYxMywtNTkyLjEyMDlDMzAzLjMwNzQsLTU3Mi4yNTgzIDM3My4zOTc4LC01MzguMDkxMSA0MTcuOTcyMywtNTE2LjM2MjMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI0MTkuNjIxNywtNTE5LjQ1MiA0MjcuMDc2OSwtNTExLjkyNCA0MTYuNTU0NCwtNTEzLjE1OTggNDE5LjYyMTcsLTUxOS40NTIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM2MS45MzIyIiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNDEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjI4LjEzOTksLTYzNy4yODdDMjI3LjYwNSwtNjQ4LjIxNTkgMjI3LjI4MTYsLTY2MC43MjA1IDIyNy42ODQzLC02NzIuMDkzOSAyMjcuNzcwMywtNjc0LjUyNDIgMjI3Ljg4OSwtNjc3LjA0NTEgMjI4LjAyODMsLTY3OS41NzMzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjI4LjY4NzUsLTY4OS43OTMxIDIyMy41NTMxLC02ODAuMTAzNSAyMjguMzY1NiwtNjg0LjgwMzQgMjI4LjA0MzgsLTY3OS44MTM4IDIyOC4wNDM4LC02NzkuODEzOCAyMjguMDQzOCwtNjc5LjgxMzggMjI4LjM2NTYsLTY4NC44MDM0IDIzMi41MzQ0LC02NzkuNTI0MSAyMjguNjg3NSwtNjg5Ljc5MzEgMjI4LjY4NzUsLTY4OS43OTMxIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNDYuNTEzMiIgeT0iLTY1OS40OTM5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MDdFPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmEyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTI4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmEyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgZD0iTTIxOC41NTcyLC01NzkuODE5NkMyMTUuMjY0LC01NjguNjA0OSAyMTMuMTQ5MSwtNTU1LjU1MTggMjE1LjUyMjMsLTU0My42NjI2IDIxNi4xOTcxLC01NDAuMjgxNiAyMTcuMTE4LC01MzYuODQwMiAyMTguMTk1MSwtNTMzLjQzMzYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIyMjEuNDk1MywtNTM0LjU5OTMgMjIxLjU3LC01MjQuMDA0NyAyMTQuOTA0NywtNTMyLjI0MDMgMjIxLjQ5NTMsLTUzNC41OTkzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjEuMDk0MiIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBhPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCYjNDU7Jmd0O3Jvb3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNDIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50JiM0NTsmZ3Q7cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMzUuMDg4NiwtNzI2LjI3ODZDMjM2LjM4MDIsLTczMS45NDI2IDIzNy41OTQyLC03MzguMjM4OCAyMzguMjM2OSwtNzQ0LjA5MzkgMjM5LjEyNDcsLTc1Mi4xODE3IDIzOC44NywtNzYwLjgzMjcgMjM4LjA0OCwtNzY5LjA4MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjIzNi43NDY5LC03NzkuMjQwNyAyMzMuNTUzNywtNzY4Ljc1MDEgMjM3LjM4MjEsLTc3NC4yODEyIDIzOC4wMTczLC03NjkuMzIxNyAyMzguMDE3MywtNzY5LjMyMTcgMjM4LjAxNzMsLTc2OS4zMjE3IDIzNy4zODIxLC03NzQuMjgxMiAyNDIuNDgwOCwtNzY5Ljg5MzQgMjM2Ljc0NjksLTc3OS4yNDA3IDIzNi43NDY5LC03NzkuMjQwNyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjU3LjkwNTIiIHk9Ii03NDguMjkzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDA5QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dCYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTI1MS43NzI5LC02OTMuMjMwOEMyNTguMzI0NCwtNjg3LjQ2ODIgMjY0LjcxNzksLTY4MC4yNzUxIDI2OC4yMzY5LC02NzIuMDkzOSAyNzEuMTg3MiwtNjY1LjIzNDggMjcwLjcxMTUsLTY2Mi4zMzg1IDI2OC4yMzY5LC02NTUuMjkzOSAyNjYuMjY1OSwtNjQ5LjY4MjggMjYzLjMyMDIsLTY0NC4yNDM2IDI1OS45MjQ3LC02MzkuMTcyNyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjI2Mi42NDY5LC02MzYuOTY3NyAyNTMuODc4MiwtNjMxLjAyMTEgMjU3LjAyNDcsLTY0MS4xMzggMjYyLjY0NjksLTYzNi45Njc3Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNzUuMzE3MiIgeT0iLTY1OS40OTM5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dCYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIxMy4zMjQsLTY5Mi4wMTM4QzIwOC4zOTk1LC02ODYuMjU0MyAyMDMuNjU0MywtNjc5LjM3MjIgMjAxLjA3NjMsLTY3Mi4wOTM5IDE5Ny40ODI3LC02NjEuOTQ4MSAxOTkuNzk1NCwtNjUxLjE5ODMgMjA0LjM4MiwtNjQxLjQ1NTYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMDkuMzU3NiwtNjMyLjQ3NTggMjA4LjQ0NzEsLTY0My40MDM4IDIwNi45MzQyLC02MzYuODQ5MyAyMDQuNTEwOSwtNjQxLjIyMjggMjA0LjUxMDksLTY0MS4yMjI4IDIwNC41MTA5LC02NDEuMjIyOCAyMDYuOTM0MiwtNjM2Ljg0OTMgMjAwLjU3NDcsLTYzOS4wNDE4IDIwOS4zNTc2LC02MzIuNDc1OCAyMDkuMzU3NiwtNjMyLjQ3NTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwNS4zMTcyIiB5PSItNjU5LjQ5MzkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2JiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPCEtLSB0cmF2ZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjIwMi4yMzY5IiBjeT0iLTI4NC40IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDIuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPjB4MEI5PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdiYjNDU7Jmd0O3RyYXZlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdiYjNDU7Jmd0O3RyYXZlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTE4MS40NjkyLC0zNTkuNDQ3NkMxNzYuOTgzMywtMzUyLjYyODEgMTcyLjg4MTUsLTM0NC45NzA3IDE3MC41MjIzLC0zMzcuMiAxNjguMzUzMSwtMzMwLjA1NTQgMTY3Ljg4NDMsLTMyNy4zODUxIDE3MC41MjIzLC0zMjAuNCAxNzIuMTU1NSwtMzE2LjA3NTMgMTc0LjU3MTIsLTMxMS45MzM4IDE3Ny4zNTMzLC0zMDguMDk5MiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjE4My44Njc2LC0zMDAuMjQzMSAxODAuOTQ4NSwtMzEwLjgxMzQgMTgwLjY3NjEsLTMwNC4wOTIxIDE3Ny40ODQ1LC0zMDcuOTQxIDE3Ny40ODQ1LC0zMDcuOTQxIDE3Ny40ODQ1LC0zMDcuOTQxIDE4MC42NzYxLC0zMDQuMDkyMSAxNzQuMDIwNSwtMzA1LjA2ODYgMTgzLjg2NzYsLTMwMC4yNDMxIDE4My44Njc2LC0zMDAuMjQzMSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTc2LjA5NDIiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXYmIzQ1OyZndDt0cmF2ZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXYmIzQ1OyZndDt0cmF2ZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGQ9Ik0yMDIuMjM2OSwtMzU1LjA4OTdDMjAyLjIzNjksLTM0MS42MDQ2IDIwMi4yMzY5LC0zMjUuNzEyMyAyMDIuMjM2OSwtMzEyLjQxNTMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIyMDUuNzM3LC0zMTIuNDAzMyAyMDIuMjM2OSwtMzAyLjQwMzMgMTk4LjczNywtMzEyLjQwMzQgMjA1LjczNywtMzEyLjQwMzMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwNy4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2JiM0NTsmZ3Q7dHJhMiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXYmIzQ1OyZndDt0cmEyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTIxMC44MjExLC00MTMuNjU0QzIxNC44MDUsLTQyNy4xMzA1IDIxOS41OTU3LC00NDMuMzM2MyAyMjMuODc0NCwtNDU3LjgxMDIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMjYuNzM4NiwtNDY3LjQ5OTEgMjE5LjU4ODIsLTQ1OS4xODUxIDIyNS4zMjExLC00NjIuNzA0MiAyMjMuOTAzNiwtNDU3LjkwOTMgMjIzLjkwMzYsLTQ1Ny45MDkzIDIyMy45MDM2LC00NTcuOTA5MyAyMjUuMzIxMSwtNDYyLjcwNDIgMjI4LjIxOSwtNDU2LjYzMzYgMjI2LjczODYsLTQ2Ny40OTkxIDIyNi43Mzg2LC00NjcuNDk5MSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM5LjkwNTIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDBCODwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlJiM0NTsmZ3Q7dHJhdiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlJiM0NTsmZ3Q7dHJhdjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMDguOTAyNCwtMzAyLjQ3MjJDMjEwLjY3ODIsLTMwOC4xMzE3IDIxMi4zNDg3LC0zMTQuNDUzNSAyMTMuMjM2OSwtMzIwLjQgMjE0LjQ3MjQsLTMyOC42NzEzIDIxNC4wNzY2LC0zMzcuNTIxMyAyMTIuODg4OCwtMzQ1LjkyNiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjIxMS4xMDM2LC0zNTUuODg4IDIwOC40MzgyLC0zNDUuMjUwOSAyMTEuOTg1NiwtMzUwLjk2NjQgMjEyLjg2NzYsLTM0Ni4wNDQ4IDIxMi44Njc2LC0zNDYuMDQ0OCAyMTIuODY3NiwtMzQ2LjA0NDggMjExLjk4NTYsLTM1MC45NjY0IDIxNy4yOTcsLTM0Ni44Mzg2IDIxMS4xMDM2LC0zNTUuODg4IDIxMS4xMDM2LC0zNTUuODg4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzIuOTA1MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MEI5PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVyIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE2IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVyPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjIwMi4yMzY5IiBjeT0iLTE5NS42IiByeD0iMzguODY3MSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDIuMjM2OSIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPjB4MEJBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmUmIzQ1OyZndDt0cmF2ZXIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZSYjNDU7Jmd0O3RyYXZlcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xODUuMzI0LC0yNjguMzJDMTgwLjM5OTUsLTI2Mi41NjA1IDE3NS42NTQzLC0yNTUuNjc4NCAxNzMuMDc2MywtMjQ4LjQgMTcwLjU4MzQsLTI0MS4zNjE4IDE3MC41ODM0LC0yMzguNjM4MiAxNzMuMDc2MywtMjMxLjYgMTc0LjQ5NjIsLTIyNy41OTEyIDE3Ni41NzM1LC0yMjMuNzAyNiAxNzguOTc2MiwtMjIwLjA1NTYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIxODUuMDE2NCwtMjEyLjA0MTUgMTgyLjU5MTEsLTIyMi43MzU4IDE4Mi4wMDcsLTIxNi4wMzQ0IDE3OC45OTc1LC0yMjAuMDI3MyAxNzguOTk3NSwtMjIwLjAyNzMgMTc4Ljk5NzUsLTIyMC4wMjczIDE4Mi4wMDcsLTIxNi4wMzQ0IDE3NS40MDM5LC0yMTcuMzE4OCAxODUuMDE2NCwtMjEyLjA0MTUgMTg1LjAxNjQsLTIxMi4wNDE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNzcuMzE3MiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmUmIzQ1OyZndDt0cmF2ZXIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZSYjNDU7Jmd0O3RyYXZlcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGQ9Ik0yMDIuMjM2OSwtMjY2LjAwMDZDMjAyLjIzNjksLTI1My44OTQ5IDIwMi4yMzY5LC0yMzcuODA3NiAyMDIuMjM2OSwtMjI0LjA2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwZmYiIHN0cm9rZT0iIzAwMDBmZiIgcG9pbnRzPSIyMDUuNzM3LC0yMjMuNjcyIDIwMi4yMzY5LC0yMTMuNjcyIDE5OC43MzcsLTIyMy42NzIxIDIwNS43MzcsLTIyMy42NzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwNi4zMTcyIiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXImIzQ1OyZndDt0cmF2ZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlciYjNDU7Jmd0O3RyYXZlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTIwNy42OTM3LC0yMTMuNzUwOUMyMDkuMTQ2NywtMjE5LjQxMzYgMjEwLjUxMjcsLTIyNS43MTc0IDIxMS4yMzY5LC0yMzEuNiAyMTIuMTQ5MiwtMjM5LjAxMDcgMjEyLjE0OTIsLTI0MC45ODkzIDIxMS4yMzY5LC0yNDguNCAyMTAuOTIwMSwtMjUwLjk3MzYgMjEwLjQ4MDQsLTI1My42Mjc5IDIwOS45NjQzLC0yNTYuMjczOCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjIwNy42OTM3LC0yNjYuMjQ5MSAyMDUuNTI1NSwtMjU1LjQ5OTcgMjA4LjgwMzUsLTI2MS4zNzM4IDIwOS45MTMyLC0yNTYuNDk4NSAyMDkuOTEzMiwtMjU2LjQ5ODUgMjA5LjkxMzIsLTI1Ni40OTg1IDIwOC44MDM1LC0yNjEuMzczOCAyMTQuMzAxLC0yNTcuNDk3MyAyMDcuNjkzNywtMjY2LjI0OTEgMjA3LjY5MzcsLTI2Ni4yNDkxIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzIuNDU4NSIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MEJBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVycyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcnM8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBjeD0iMjAzLjIzNjkiIGN5PSItMTA2LjgiIHJ4PSIzOC4zMDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjAzLjIzNjkiIHk9Ii0xMDIuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4weDBCQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlciYjNDU7Jmd0O3RyYXZlcnMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjAiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXImIzQ1OyZndDt0cmF2ZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTE4My45ODU0LC0xNzkuNjY1OEMxNzQuNjk2NSwtMTY5LjUzOTcgMTY2LjMxMzcsLTE1NS45MTE2IDE3MS4yOTIzLC0xNDIuOCAxNzIuOTM4NSwtMTM4LjQ2NDUgMTc1LjM3MjMsLTEzNC4zMTY5IDE3OC4xNzQ5LC0xMzAuNDc5MyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjE4NC43MzY3LC0xMjIuNjIxMyAxODEuNzgxMiwtMTMzLjE4MTQgMTgxLjUzMTksLTEyNi40NTkyIDE3OC4zMjcxLC0xMzAuMjk3MSAxNzguMzI3MSwtMTMwLjI5NzEgMTc4LjMyNzEsLTEzMC4yOTcxIDE4MS41MzE5LC0xMjYuNDU5MiAxNzQuODczLC0xMjcuNDEyOCAxODQuNzM2NywtMTIyLjYyMTMgMTg0LjczNjcsLTEyMi42MjEzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNzYuNzA5MiIgeT0iLTE0NyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gczwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlciYjNDU7Jmd0O3RyYXZlcnMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXImIzQ1OyZndDt0cmF2ZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgZD0iTTIwMi40NDQxLC0xNzcuMjAwNkMyMDIuNTgwNCwtMTY1LjA5NDkgMjAyLjc2MTYsLTE0OS4wMDc2IDIwMi45MTYzLC0xMzUuMjY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDBmZiIgc3Ryb2tlPSIjMDAwMGZmIiBwb2ludHM9IjIwNi40MjA1LC0xMzQuOTEwOCAyMDMuMDMzNCwtMTI0Ljg3MiAxOTkuNDIwOSwtMTM0LjgzMTkgMjA2LjQyMDUsLTEzNC45MTA4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDcuNzA5MiIgeT0iLTE0NyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gczwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnMmIzQ1OyZndDt0cmF2ZXIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzJiM0NTsmZ3Q7dHJhdmVyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTIwOS4wNjY2LC0xMjQuODM3NkMyMTEuNjYzOCwtMTM1LjAxODYgMjEzLjgxOTMsLTE0Ny45OTA4IDIxMi4yMzY5LC0xNTkuNiAyMTEuODcxNywtMTYyLjI3OTMgMjExLjM2MDIsLTE2NS4wNDA3IDIxMC43NTk5LC0xNjcuNzg2MyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjIwOC4yOTgzLC0xNzcuNDg2NiAyMDYuMzk2MywtMTY2LjY4NjkgMjA5LjUyODIsLTE3Mi42NDAyIDIxMC43NTgsLTE2Ny43OTM4IDIxMC43NTgsLTE2Ny43OTM4IDIxMC43NTgsLTE2Ny43OTM4IDIwOS41MjgyLC0xNzIuNjQwMiAyMTUuMTE5OCwtMTY4LjkwMDcgMjA4LjI5ODMsLTE3Ny40ODY2IDIwOC4yOTgzLC0xNzcuNDg2NiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjMzLjA3MzUiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iI2ZmMDAwMCI+MHgwQkI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXJzZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxOCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcnNlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgY3g9IjIwMy4yMzY5IiBjeT0iLTE4IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDMuMjM2OSIgeT0iLTEzLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+Y29udGVudEFycmF5WzNdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhdmVycyYjNDU7Jmd0O3RyYXZlcnNlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIxIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhdmVycyYjNDU7Jmd0O3RyYXZlcnNlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTE4NC44Njc2LC05MC45NTY5QzE3OS41MTM1LC04NS4yMTMyIDE3NC4zNDc0LC03OC4yODA1IDE3MS41MjIzLC03MC44IDE2OC44ODQzLC02My44MTQ5IDE2OC44ODQzLC02MC45ODUxIDE3MS41MjIzLC01NCAxNzIuODY2OCwtNTAuNDM5OSAxNzQuNzQxNSwtNDcuMDA0IDE3Ni45MTQ0LC00My43NjEyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTgzLjIwMywtMzUuNjc2IDE4MC42MTU1LC00Ni4zMzIzIDE4MC4xMzMyLC0zOS42MjI3IDE3Ny4wNjM0LC00My41Njk1IDE3Ny4wNjM0LC00My41Njk1IDE3Ny4wNjM0LC00My41Njk1IDE4MC4xMzMyLC0zOS42MjI3IDE3My41MTE0LC00MC44MDY3IDE4My4yMDMsLTM1LjY3NiAxODMuMjAzLC0zNS42NzYiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE3Ny4wOTQyIiB5PSItNTguMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYXZlcnMmIzQ1OyZndDt0cmF2ZXJzZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UzNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYXZlcnMmIzQ1OyZndDt0cmF2ZXJzZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwZmYiIGQ9Ik0yMDMuMjM2OSwtODguNDAwNkMyMDMuMjM2OSwtNzYuMjk0OSAyMDMuMjM2OSwtNjAuMjA3NiAyMDMuMjM2OSwtNDYuNDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDBmZiIgc3Ryb2tlPSIjMDAwMGZmIiBwb2ludHM9IjIwNi43MzcsLTQ2LjA3MiAyMDMuMjM2OSwtMzYuMDcyIDE5OS43MzcsLTQ2LjA3MjEgMjA2LjczNywtNDYuMDcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMDguMDk0MiIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmF2ZXJzZSYjNDU7Jmd0O3RyYXZlcnMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmF2ZXJzZSYjNDU7Jmd0O3RyYXZlcnM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjA5LjkwMjQsLTM2LjA3MjJDMjExLjY3ODIsLTQxLjczMTcgMjEzLjM0ODcsLTQ4LjA1MzUgMjE0LjIzNjksLTU0IDIxNS4zMzk5LC02MS4zODQ3IDIxNS4zMzk5LC02My40MTUzIDIxNC4yMzY5LC03MC44IDIxMy44MzQ0LC03My40OTQ1IDIxMy4yNzEzLC03Ni4yNjYxIDIxMi42MTA2LC03OS4wMTgxIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjA5LjkwMjQsLTg4LjcyNzggMjA4LjI1NDYsLTc3Ljg4NjQgMjExLjI0NTgsLTgzLjkxMTYgMjEyLjU4OTEsLTc5LjA5NTQgMjEyLjU4OTEsLTc5LjA5NTQgMjEyLjU4OTEsLTc5LjA5NTQgMjExLjI0NTgsLTgzLjkxMTYgMjE2LjkyMzcsLTgwLjMwNDQgMjA5LjkwMjQsLTg4LjcyNzggMjA5LjkwMjQsLTg4LjcyNzgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyNC4yNzMyIiB5PSItNTguMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4gfjM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEyJiM0NTsmZ3Q7dHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYTImIzQ1OyZndDt0cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDBmZiIgZD0iTTIwOC4wNTA3LC00NzQuNzIzM0MxODMuMTc0MSwtNDU1LjAyODIgMTQ2LjU1MDEsLTQyNi4wMzI2IDEyMS42MTM3LC00MDYuMjkwMSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDBmZiIgc3Ryb2tlPSIjMDAwMGZmIiBwb2ludHM9IjEyMy42NTE4LC00MDMuNDM5NiAxMTMuNjM4OSwtMzk5Ljk3NjQgMTE5LjMwNjcsLTQwOC45Mjc4IDEyMy42NTE4LC00MDMuNDM5NiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTc4LjA5NDIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gYzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYTImIzQ1OyZndDt0cmUgLS0+CisgICAgICAgIDwhLS0gdHJhMiYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhMiYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTIzMy45MDM5LC01MjYuMDA3NEMyMzMuMzI2OCwtNTM4Ljg5MjYgMjMyLjY0MjcsLTU1NC4xNjYzIDIzMi4wMjI2LC01NjguMDEwOSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjIzMS41NjM3LC01NzguMjU2MiAyMjcuNTE1NywtNTY4LjA2NDggMjMxLjc4NzQsLTU3My4yNjEyIDIzMi4wMTEyLC01NjguMjY2MiAyMzIuMDExMiwtNTY4LjI2NjIgMjMyLjAxMTIsLTU2OC4yNjYyIDIzMS43ODc0LC01NzMuMjYxMiAyMzYuNTA2NywtNTY4LjQ2NzYgMjMxLjU2MzcsLTU3OC4yNTYyIDIzMS41NjM3LC01NzguMjU2MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjUzLjA2NjUiIHk9Ii01NDcuODYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDBERTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYTImIzQ1OyZndDt0cmF2IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhMiYjNDU7Jmd0O3RyYXY8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMGZmIiBkPSJNMjE0LjczMzUsLTQ3MS4wMjI4QzIxMC4yNzU2LC00NjQuMjA0NCAyMDYuMTY5NSwtNDU2LjU2MTUgMjAzLjczNjksLTQ0OC44MzEzIDIwMS4zMTI3LC00NDEuMTI3NSAyMDAuMTQsLTQzMi42NDMzIDE5OS43MDQ4LC00MjQuNDM2NiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDBmZiIgc3Ryb2tlPSIjMDAwMGZmIiBwb2ludHM9IjIwMy4yMDEsLTQyNC4yMDA1IDE5OS41MDkyLC00MTQuMjY5NyAxOTYuMjAyMywtNDI0LjMzNTIgMjAzLjIwMSwtNDI0LjIwMDUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIwOS40ODY5IiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHY8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC5wMS5zdmcgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQucDEuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OWMwODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQucDEuc3ZnCkBAIC0wLDAgKzEsNDA1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cis8IS0tLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDAuMSAoMjAxNjEyMjUuMDMwNCkKK2RpZ3JhcGggRyB7CisgICAgeyByYW5rPXNhbWUgcm9vdCAtPiBzdGFydCBbc3R5bGU9aW52aXNdIH0KKyAgICBuZXdyYW5rID0gdHJ1ZQorICAgIHN0YXJ0IFtsYWJlbD0ic3RhcnQvZW5kIl0KKworICAgIHRyYWN0b3IgW2xhYmVsID0gImNvbnRlbnRBcnJheVswXSJdCisgICAgdHJhY3RvIFtsYWJlbCA9ICIweDAxQiJdCisgICAgdHJhY3QgW2xhYmVsID0gIjB4MDFBIl0KKyAgICB0cmFjIFtsYWJlbCA9ICIweDAxOSJdCisgICAgdHJhIFtsYWJlbCA9ICJDaGFpblxuMHgwMTgiXQorCisgICAgdHJlZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzFdIjsgY29sb3IgPSAibGlnaHRncmV5IjsgZm9udGNvbG9yID0gbGlnaHRncmF5XQorICAgIHRyZSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDNCIl0KKyAgICB0cmllIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMl0iXQorICAgIHRyaSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDVCIl0KKworICAgIHRyIFtsYWJlbCA9ICJTcGFyc2VcbjB4MDdFIl0KKworICAgIHQgW2xhYmVsID0gIjB4MDlCIl0KKyAgICByb290IFtsYWJlbCA9ICJDaGFpblxuMHg5QSJdCisKKyAgICByb290IC0+IHQgW2xhYmVsID0gIiB0Il0KKyAgICB0IC0+IHRyIFtsYWJlbCA9ICIgciJdCisgICAgdHIgLT4gdHJhIFtsYWJlbCA9ICIgYSJdCisgICAgdHJhIC0+IHRyYWMgW2xhYmVsID0gIiBjIl0KKyAgICB0cmFjIC0+IHRyYWN0IFtsYWJlbCA9ICIgdCJdCisgICAgdHJhY3QgLT4gdHJhY3RvIFtsYWJlbCA9ICIgbyJdCisgICAgdHJhY3RvIC0+IHRyYWN0b3IgW2xhYmVsID0gIiByIl0KKworICAgIHRyIC0+IHRyZSBbbGFiZWwgPSAiIGUiXQorICAgIHRyZSAtPiB0cmVlIFtsYWJlbCA9ICIgZSI7IGNvbG9yID0gImxpZ2h0Z3JleSI7IGZvbnRjb2xvciA9IGxpZ2h0Z3JheV0KKworICAgIHRyIC0+IHRyaSBbbGFiZWwgPSAiIGkiXQorICAgIHRyaSAtPiB0cmllIFtsYWJlbCA9ICIgZSJdCisKKyAgICB7CisgICAgICAgIHJhbmtzZXAgPSAwLjEKKyAgICAgICAgdHJlZTIgW2xhYmVsID0gIkNoYWluXG4weDBCQiJdCisgICAgICAgIHRyZWUycCBbbGFiZWwgPSAiUHJlZml4XG4weDBCRlxuY29udGVudEFycmF5WzFdIl0KKyAgICAgICAgdHJlZTJwIC0+IHRyZWUyIFtsYWJlbCA9ICIgJmVwc2lsb247Il0KKyAgICB9CisKKyAgICB0cmUgLT4gdHJlZTJwIFtsYWJlbCA9ICIgZSJdCisgICAgdHJlZTIgLT4gdHJlZXMgW2xhYmVsID0gIiBzIl0KKworICAgIHtyYW5rPXNhbWUgdHJhIC0+IHRyZSAtPiB0cmkgW3N0eWxlPWludmlzXX0KKyAgICB7cmFuaz1zYW1lIHRyYWMgLT4gdHJlZSAtPiB0cmVlMnAgLT4gdHJpZSBbc3R5bGU9aW52aXNdfQorCisgICAgc3ViZ3JhcGggcGF0aCB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gImxpZ2h0Ymx1ZSI7IGZvbnRjb2xvcj0iYmx1ZSI7IGFycm93aGVhZD0idmVlIl0KKyAgICAgICAgbm9kZSBbY29sb3IgPSAibGlnaHRibHVlIjsgZm9udGNvbG9yPSJibHVlIl0KKworICAgICAgICBzdGFydCAtPiByb290CisKKyAgICAgICAgcm9vdCAtPiB0IFtsYWJlbCA9ICIgdCJdCisgICAgICAgIHQgLT4gdHIgW2xhYmVsID0gIiByIl0KKyAgICAgICAgdHIgLT4gdHJlIFtsYWJlbCA9ICIgZSJdCisgICAgICAgIHRyZSAtPiB0cmVlIFtsYWJlbCA9ICIgZSJdCisgICAgICAgIHRyZWUgLT4gdHJlZXMgW2xhYmVsID0gIiBzIl0KKworICAgICAgICB0cmVlcyBbbGFiZWwgPSAiY29udGVudEFycmF5WzNdIjsgY29uc3RyYWludCA9IGZhbHNlXQorICAgIH0KKworCisgICAgc3ViZ3JhcGggYmFjayB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gInBpbmsiOyBmb250Y29sb3I9InJlZCI7IGFycm93aGVhZD0idmVlIjsgY29uc3RyYWludD0iZmFsc2UiXQorCisgICAgICAgIHRyZWVzIC0+IHRyZWUyIFtsYWJlbCA9ICIgfjMiXQorICAgICAgICB0cmVlMiAtPiB0cmVlMnAgW2xhYmVsID0gIjB4MEJCIl0KKyAgICAgICAgdHJlZTJwIC0+IHRyZSBbbGFiZWwgPSAiMHgwQkYiXQorICAgICAgICB0cmUgLT4gdHIgW2xhYmVsID0gIjB4MDNCIl0KKyAgICAgICAgdHIgLT4gdCBbbGFiZWwgPSAiMHgwN0UiXQorICAgICAgICB0IC0+IHJvb3QgW2xhYmVsID0gIjB4MDlCIl0KKyAgICAgICAgcm9vdCAtPiBzdGFydCBbbGFiZWwgPSAiMHgwOUEiXQorICAgIH0KK30KKyAtLT4KKzwhLS0gVGl0bGU6IEcgUGFnZXM6IDEgLS0+Cis8c3ZnIHdpZHRoPSI2NjZwdCIgaGVpZ2h0PSI2NzhwdCIKKyAgICAgdmlld0JveD0iMC4wMCAwLjAwIDY2Ni40NyA2NzcuNTIiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgorICAgIDxnIGlkPSJncmFwaDAiIGNsYXNzPSJncmFwaCIgdHJhbnNmb3JtPSJzY2FsZSgxIDEpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCA2NzMuNTE1MikiPgorICAgICAgICA8dGl0bGU+RzwvdGl0bGU+CisgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtNjczLjUxNTIgNjYyLjQ3MzgsLTY3My41MTUyIDY2Mi40NzM4LDQgLTQsNCIvPgorICAgICAgICA8IS0tIHJvb3QgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjY0LjIzNjkiIGN5PSItNjQwLjA5OTYiIHJ4PSIzMy4xMzM3IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjY0LjIzNjkiIHk9Ii02NDQuMjk5NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI2NC4yMzY5IiB5PSItNjI3LjQ5OTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg5QTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHN0YXJ0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5zdGFydDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzOTcuMjM2OSIgY3k9Ii02NDAuMDk5NiIgcng9IjQ0LjA3NzUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzk3LjIzNjkiIHk9Ii02MzUuODk5NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5zdGFydC9lbmQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7c3RhcnQgLS0+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3N0YXJ0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3N0YXJ0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTI5Ny43OTg0LC02NDAuMDk5NkMzMTEuMzAzNywtNjQwLjA5OTYgMzI3LjIzMzksLTY0MC4wOTk2IDM0Mi4zMzk4LC02NDAuMDk5NiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjM1Mi42MjYxLC02NDAuMDk5NiAzNDIuNjI2MiwtNjQ0LjU5OTcgMzQ3LjYyNjEsLTY0MC4wOTk2IDM0Mi42MjYxLC02NDAuMDk5NyAzNDIuNjI2MSwtNjQwLjA5OTcgMzQyLjYyNjEsLTY0MC4wOTk3IDM0Ny42MjYxLC02NDAuMDk5NiAzNDIuNjI2MSwtNjM1LjU5OTcgMzUyLjYyNjEsLTY0MC4wOTk2IDM1Mi42MjYxLC02NDAuMDk5NiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzI1LjI1MDkiIHk9Ii02NDcuMjk5NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDA5QTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjI2NC4yMzY5IiBjeT0iLTU1Ny44ODM5IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNjQuMjM2OSIgeT0iLTU1My42ODM5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDlCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3QmIzQ1OyZndDt0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTI1My4xOTE4LC02MTIuMzA2N0MyNTEuNDI2MywtNjA1LjI1MDUgMjUwLjM2OCwtNTk3LjU3MzQgMjUyLjYwMzYsLTU4NS4zMTI1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjU2LjAyNTksLTU4Ni4wNDczIDI1NC44NTA2LC01NzUuNTE3OSAyNDkuMjAzMSwtNTg0LjQ4MjEgMjU2LjAyNTksLTU4Ni4wNDczIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNTUuOTMyMiIgeT0iLTU4OS4wODM5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290JiM0NTsmZ3Q7dDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yNjQuMjM2OSwtNjEwLjQxNzhDMjY0LjIzNjksLTYwMi41NzU2IDI2NC4yMzY5LC01OTQuMTMwNyAyNjQuMjM2OSwtNTg2LjM1NDIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyNjQuMjM2OSwtNTc2LjI4MzUgMjY4LjczNywtNTg2LjI4MzUgMjY0LjIzNjksLTU4MS4yODM1IDI2NC4yMzcsLTU4Ni4yODM1IDI2NC4yMzcsLTU4Ni4yODM1IDI2NC4yMzcsLTU4Ni4yODM1IDI2NC4yMzY5LC01ODEuMjgzNSAyNTkuNzM3LC01ODYuMjgzNiAyNjQuMjM2OSwtNTc2LjI4MzUgMjY0LjIzNjksLTU3Ni4yODM1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNjcuOTMyMiIgeT0iLTU4OS4wODM5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gc3RhcnQmIzQ1OyZndDtyb290IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIxIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+c3RhcnQmIzQ1OyZndDtyb290PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTM1My40MDQyLC02MzcuNDIzM0MzNDEuMjkzOCwtNjM2Ljk3MTkgMzI4LjE0NzksLTYzNi43NDg1IDMxNi4wMTg0LC02MzcuMDk5NiAzMTMuMzI2NCwtNjM3LjE3NzUgMzEwLjU1NjgsLTYzNy4yNzgxIDMwNy43NjQzLC02MzcuMzk1MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjI5Ny42NTA0LC02MzcuODc5MSAzMDcuNDIzOSwtNjMyLjkwNjIgMzAyLjY0NDcsLTYzNy42NDAxIDMwNy42MzksLTYzNy40MDEgMzA3LjYzOSwtNjM3LjQwMSAzMDcuNjM5LC02MzcuNDAxIDMwMi42NDQ3LC02MzcuNjQwMSAzMDcuODU0MSwtNjQxLjg5NTkgMjk3LjY1MDQsLTYzNy44NzkxIDI5Ny42NTA0LC02MzcuODc5MSIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTE4IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTMuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMF08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTg4LjgiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii04NC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDFCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvJiM0NTsmZ3Q7dHJhY3RvciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvJiM0NTsmZ3Q7dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik03My4yMzY5LC03MC41NjcyQzczLjIzNjksLTYzLjI3NDMgNzMuMjM2OSwtNTQuNjk4NyA3My4yMzY5LC00Ni42MTM3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNzYuNzM3LC00Ni40MTcgNzMuMjM2OSwtMzYuNDE3IDY5LjczNywtNDYuNDE3MSA3Ni43MzcsLTQ2LjQxNyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzcuMzE3MiIgeT0iLTQ5LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU1IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xNzEuMDE1NiIgcng9IjM3LjE0NDMiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTE2Ni44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDFBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QmIzQ1OyZndDt0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0JiM0NTsmZ3Q7dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTczLjIzNjksLTE1Mi43NjkzQzczLjIzNjksLTE0Mi4zMzggNzMuMjM2OSwtMTI5LjAyNyA3My4yMzY5LC0xMTcuMjUxNCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijc2LjczNywtMTE2Ljk5NTMgNzMuMjM2OSwtMTA2Ljk5NTMgNjkuNzM3LC0xMTYuOTk1MyA3Ni43MzcsLTExNi45OTUzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3OC40ODY5IiB5PSItMTIwIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBvPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU2IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTI3Ni41MjYzIiByeD0iMzUuMzU4NyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMjcyLjMyNjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMTk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjJiM0NTsmZ3Q7dHJhY3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWMmIzQ1OyZndDt0cmFjdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik03My4yMzY5LC0yNTguMTQ3OEM3My4yMzY5LC0yNDEuODgzNSA3My4yMzY5LC0yMTcuODk4MiA3My4yMzY5LC0xOTkuMjA4MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9Ijc2LjczNywtMTk5LjE4MzYgNzMuMjM2OSwtMTg5LjE4MzYgNjkuNzM3LC0xOTkuMTgzNiA3Ni43MzcsLTE5OS4xODM2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3Ni45MzIyIiB5PSItMjEzLjYzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2QzZDNkMyIgY3g9IjIxNy4yMzY5IiBjeT0iLTI3Ni41MjYzIiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTI3Mi4zMjYzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNkM2QzZDMiPmNvbnRlbnRBcnJheVsxXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8IS0tIHRyYSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU3IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjE0MS4yMzY5IiBjeT0iLTM4Mi4wMzciIHJ4PSIzNi4xMjUiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNDEuMjM2OSIgeT0iLTM4Ni4yMzciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNDEuMjM2OSIgeT0iLTM2OS40MzciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMTg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmFjIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEmIzQ1OyZndDt0cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTEyNC40Mjc5LC0zNTUuOTU1N0MxMTMuODc1MywtMzM5LjU4MiAxMDAuMzI0NCwtMzE4LjU1NjEgODkuODE1OCwtMzAyLjI1MDYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI5Mi42ODgzLC0zMDAuMjQ2NyA4NC4zMjksLTI5My43MzcyIDg2LjgwNDQsLTMwNC4wMzg4IDkyLjY4ODMsLTMwMC4yNDY3Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMjEuMDk0MiIgeT0iLTMzMS4wMjE0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBjPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjUwLjIzNjkiIGN5PSItMzgyLjAzNyIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNTAuMjM2OSIgeT0iLTM4Ni4yMzciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNTAuMjM2OSIgeT0iLTM2OS40MzciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwM0I8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmUgLS0+CisgICAgICAgIDwhLS0gdHJlZTJwIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE1IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlZTJwPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjQwMS4yMzY5IiBjeT0iLTI3Ni41MjYzIiByeD0iNzUuMTUyOCIgcnk9IjQxLjA5MTEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQwMS4yMzY5IiB5PSItMjg5LjEyNjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+UHJlZml4PC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDAxLjIzNjkiIHk9Ii0yNzIuMzI2MyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDBCRjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQwMS4yMzY5IiB5PSItMjU1LjUyNjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzFdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSYjNDU7Jmd0O3RyZWUycCAtLT4KKyAgICAgICAgPCEtLSB0cmVlcyAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxNiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWVzPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjI5NS4yMzY5IiBjeT0iLTg4LjgiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI5NS4yMzY5IiB5PSItODQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbM108L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlJiM0NTsmZ3Q7dHJlZXMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlJiM0NTsmZ3Q7dHJlZXM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjI0LjcxNTksLTI1OC41MjYzQzIzOC40MDE4LC0yMjUuNTg3NiAyNjcuNTU2MSwtMTU1LjQyMDcgMjgzLjc2NTUsLTExNi40MDg4Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjg3Ljc4MDYsLTEwNi43NDU1IDI4OC4wOTkxLC0xMTcuNzA2OCAyODUuODYyMSwtMTExLjM2MjggMjgzLjk0MzUsLTExNS45ODAxIDI4My45NDM1LC0xMTUuOTgwMSAyODMuOTQzNSwtMTE1Ljk4MDEgMjg1Ljg2MjEsLTExMS4zNjI4IDI3OS43ODgsLTExNC4yNTM0IDI4Ny43ODA2LC0xMDYuNzQ1NSAyODcuNzgwNiwtMTA2Ljc0NTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI3Ny43MDkyIiB5PSItMTY2LjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlJiM0NTsmZ3Q7dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNkM2QzZDMiIGQ9Ik0yMjcuMDM0OSwtMzU4LjgxMDZDMjIzLjU3MjUsLTM1NC4xMjAzIDIyMC41MDQ0LC0zNDguOTc0MiAyMTguNTIyMywtMzQzLjYyMTQgMjE0LjAxNjMsLTMzMS40NTMgMjEzLjE4NzgsLTMxNy4xNzMxIDIxMy42ODk3LC0zMDQuOTIyMSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2QzZDNkMyIgc3Ryb2tlPSIjZDNkM2QzIiBwb2ludHM9IjIxNy4xOTI1LC0zMDUuMDA2NSAyMTQuNDE0NCwtMjk0Ljc4MjQgMjEwLjIxMDQsLTMwNC41MDc0IDIxNy4xOTI1LC0zMDUuMDA2NSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjI0LjA5NDIiIHk9Ii0zMzEuMDIxNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZDNkM2QzIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZSYjNDU7Jmd0O3RyZWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmUmIzQ1OyZndDt0cmVlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTI0MS4yMTk1LC0zNTMuMjA1N0MyMzYuNDc0OSwtMzM4LjAzNTggMjMwLjY4MywtMzE5LjUxNzYgMjI1Ljk3OTgsLTMwNC40Nzk5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjIyLjkyMzksLTI5NC43MDkzIDIzMC4yMDM4LC0zMDIuOTEwMSAyMjQuNDE2NCwtMjk5LjQ4MTMgMjI1LjkwOSwtMzA0LjI1MzQgMjI1LjkwOSwtMzA0LjI1MzQgMjI1LjkwOSwtMzA0LjI1MzQgMjI0LjQxNjQsLTI5OS40ODEzIDIyMS42MTQyLC0zMDUuNTk2NyAyMjIuOTIzOSwtMjk0LjcwOTMgMjIyLjkyMzksLTI5NC43MDkzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNDMuMDk0MiIgeT0iLTMzMS4wMjE0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTExIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM2MS4yMzY5IiBjeT0iLTM4Mi4wMzciIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzYxLjIzNjkiIHk9Ii0zODYuMjM3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzYxLjIzNjkiIHk9Ii0zNjkuNDM3IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDVCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlJiM0NTsmZ3Q7dHJpIC0tPgorICAgICAgICA8IS0tIHRyIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHI8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjY0LjIzNjkiIGN5PSItNDc1LjY2ODMiIHJ4PSIzNy45MDI3IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjY0LjIzNjkiIHk9Ii00NzkuODY4MyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5TcGFyc2U8L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyNjQuMjM2OSIgeT0iLTQ2My4wNjgzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDdFPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlJiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzAiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmUmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMjAuMTQ1MSwtMzk5LjgxODVDMjA2Ljk2MDYsLTQxMC4wMjIyIDE5Ni4wMTM1LC00MjMuNTA4NyAyMDMuNTc3NywtNDM3LjI1MjYgMjA3Ljg1NDQsLTQ0NS4wMjM0IDIxNC40NDAxLC00NTEuNDQyMiAyMjEuNzIwOCwtNDU2LjY2MDQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMzAuNDkwMiwtNDYyLjI0MzUgMjE5LjYzOCwtNDYwLjY2ODkgMjI2LjI3MjUsLTQ1OS41NTgyIDIyMi4wNTQ3LC00NTYuODcyOSAyMjIuMDU0NywtNDU2Ljg3MjkgMjIyLjA1NDcsLTQ1Ni44NzI5IDIyNi4yNzI1LC00NTkuNTU4MiAyMjQuNDcxNSwtNDUzLjA3NjkgMjMwLjQ5MDIsLTQ2Mi4yNDM1IDIzMC40OTAyLC00NjIuMjQzNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjI0LjA2NjUiIHk9Ii00MjQuNjUyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDAzQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZSYjNDU7Jmd0O3RyZWUycCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZSYjNDU7Jmd0O3RyZWUycDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yODEuOTQ0MSwtMzY1LjkxMzVDMjkyLjA4NDIsLTM2MS4xOCAzMDMuNDczNiwtMzU2LjI5MzggMzE0LjIzNjksLTM1Mi42MjE0IDMzMS4wNzI4LC0zNDYuODc3IDMzOC40Mzg2LC0zNTMuNDkzMyAzNTMuMjM2OSwtMzQzLjYyMTQgMzYwLjkzNjcsLTMzOC40ODQ4IDM2Ny44MDc4LC0zMzEuNjY1OSAzNzMuNzc4MSwtMzI0LjM0MTMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzNzYuNjU3LC0zMjYuMzM3MSAzNzkuODk5NCwtMzE2LjI1MDYgMzcxLjA3NDYsLTMyMi4xMTM2IDM3Ni42NTcsLTMyNi4zMzcxIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNzcuMDk0MiIgeT0iLTMzMS4wMjE0IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyaWU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNTg1LjIzNjkiIGN5PSItMjc2LjUyNjMiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjU4NS4yMzY5IiB5PSItMjcyLjMyNjMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzJdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpJiM0NTsmZ3Q7dHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyaSYjNDU7Jmd0O3RyaWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzkzLjgwODQsLTM2Ni42OTQ4QzQzMi45MjE5LC0zNDguMjcxMiA0OTguNjYyOCwtMzE3LjMwNTMgNTQxLjk5OSwtMjk2Ljg5MjciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI1NDMuNjAxOSwtMzAwLjAwNjUgNTUxLjE1NzEsLTI5Mi41Nzg5IDU0MC42MTksLTI5My42NzM5IDU0My42MDE5LC0zMDAuMDA2NSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDc4LjA5NDIiIHk9Ii0zMzEuMDIxNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJhIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyYTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMzAuMzg2MiwtNDYyLjM0NzNDMjE2LjM0OTgsLTQ1NS45MzE4IDIwMC4zNzgsLTQ0Ny40MTA2IDE4Ny41MjIzLC00MzcuMjUyNiAxNzkuNzM4MSwtNDMxLjEwMiAxNzIuMzM0NiwtNDIzLjQ2MjYgMTY1LjgyMjksLTQxNS44NDczIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMTY4LjE3MTQsLTQxMy4xOTAyIDE1OS4xMzE0LC00MDcuNjY0OSAxNjIuNzUyNiwtNDE3LjYyMTcgMTY4LjE3MTQsLTQxMy4xOTAyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxOTMuMDk0MiIgeT0iLTQyNC42NTI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBhPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTI2Mi4zMjM0LC00NDYuMDU3NUMyNjEuNzM1NCwtNDM5LjQ5NzkgMjYwLjk4NTQsLTQzMi40OTUxIDI1OS4yMDU5LC00MjEuMjgzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjYyLjY0MSwtNDIwLjYwMzYgMjU3LjU0MTQsLTQxMS4zMTY4IDI1NS43MzY2LC00MjEuNzU2NyAyNjIuNjQxLC00MjAuNjAzNiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjY3LjA5NDIiIHk9Ii00MjQuNjUyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTI0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjUxLjQzNjgsLTQ0Ny45NDM5QzI1MC4yNDA1LC00NDQuNDA3NiAyNDkuMjE3NCwtNDQwLjc4NzkgMjQ4LjUyMjMsLTQzNy4yNTI2IDI0Ny41MywtNDMyLjIwNjMgMjQ3LjAyODcsLTQyNi44NTEzIDI0Ni44NTYyLC00MjEuNTM4MyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjI0Ni44ODcxLC00MTEuNDY1NCAyNTEuMzU2MywtNDIxLjQ3OTIgMjQ2Ljg3MTcsLTQxNi40NjU0IDI0Ni44NTYzLC00MjEuNDY1NCAyNDYuODU2MywtNDIxLjQ2NTQgMjQ2Ljg1NjMsLTQyMS40NjU0IDI0Ni44NzE3LC00MTYuNDY1NCAyNDIuMzU2MywtNDIxLjQ1MTYgMjQ2Ljg4NzEsLTQxMS40NjU0IDI0Ni44ODcxLC00MTEuNDY1NCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjU0LjA5NDIiIHk9Ii00MjQuNjUyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJpIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmk8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjg4LjIxNDQsLTQ1Mi41MjM1QzMwMC44MDU5LC00NDAuMzY5MyAzMTYuMzksLTQyNS4zMjY0IDMyOS45MjM0LC00MTIuMjYzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzMyLjQzNDksLTQxNC43MDMzIDMzNy4xOTksLTQwNS4yNDAxIDMyNy41NzMzLC00MDkuNjY2OSAzMzIuNDM0OSwtNDE0LjcwMzMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMyNS45MzIyIiB5PSItNDI0LjY1MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMzEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjY0LjIzNjksLTUwNS4xNjQ5QzI2NC4yMzY5LC01MTMuMDc5OSAyNjQuMjM2OSwtNTIxLjYyMDQgMjY0LjIzNjksLTUyOS40NzUxIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjY0LjIzNjksLTUzOS42Mzc2IDI1OS43MzcsLTUyOS42Mzc2IDI2NC4yMzY5LC01MzQuNjM3NiAyNjQuMjM3LC01MjkuNjM3NiAyNjQuMjM3LC01MjkuNjM3NiAyNjQuMjM3LC01MjkuNjM3NiAyNjQuMjM2OSwtNTM0LjYzNzYgMjY4LjczNywtNTI5LjYzNzcgMjY0LjIzNjksLTUzOS42Mzc2IDI2NC4yMzY5LC01MzkuNjM3NiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjgyLjUxMzIiIHk9Ii01MTguMjgzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDA3RTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDtyb290IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dCYjNDU7Jmd0O3Jvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjcyLjU3NDUsLTU3NS41OTQyQzI3My42Nzc0LC01NzguNjMyNiAyNzQuNjMzNiwtNTgxLjgwNDMgMjc1LjIzNjksLTU4NC44ODM5IDI3Ni4zMDU2LC01OTAuMzM5NCAyNzYuMzU2NCwtNTk2LjA5NjIgMjc1Ljc4OSwtNjAxLjc1MTIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyNzQuMTg2MiwtNjExLjczMyAyNzEuMzI4NiwtNjAxLjE0NiAyNzQuOTc4OSwtNjA2Ljc5NjIgMjc1Ljc3MTcsLTYwMS44NTk1IDI3NS43NzE3LC02MDEuODU5NSAyNzUuNzcxNywtNjAxLjg1OTUgMjc0Ljk3ODksLTYwNi43OTYyIDI4MC4yMTQ4LC02MDIuNTczIDI3NC4xODYyLC02MTEuNzMzIDI3NC4xODYyLC02MTEuNzMzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyOTQuOTA1MiIgeT0iLTU4OS4wODM5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MDlCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50JiM0NTsmZ3Q7dHI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjU0LjI3MDUsLTU0MC4yOTU0QzI1Mi45NDk5LC01MzcuMjQyMyAyNTEuODAzMiwtNTM0LjAzNDMgMjUxLjA3NjMsLTUzMC44ODM5IDI0OS44MDIzLC01MjUuMzYyNiAyNDkuNzY0NiwtNTE5LjUzNiAyNTAuNDcyLC01MTMuODE5NyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjI1My45NTg5LC01MTQuMjI1NSAyNTIuNDQ0MSwtNTAzLjczOTUgMjQ3LjA4OTEsLTUxMi44ODE0IDI1My45NTg5LC01MTQuMjI1NSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjU1LjMxNzIiIHk9Ii01MTguMjgzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnQmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yOTYuMzY4NCwtNTQ4LjgwNTJDMzA0Ljk0OTUsLTU0NC43NTQ3IDMxMy4yMjIzLC01MzguOTk3NiAzMTguMjM2OSwtNTMwLjg4MzkgMzI1Ljg2OTgsLTUxOC41MzM2IDMxNy4zODQ3LC01MDYuNzUyNSAzMDUuMDUxLC00OTcuMjY4NyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjI5Ni41MjEsLTQ5MS4zODU0IDMwNy4zMDc5LC00OTMuMzU4OCAzMDAuNjM2OSwtNDk0LjIyNDMgMzA0Ljc1MjksLTQ5Ny4wNjMxIDMwNC43NTI5LC00OTcuMDYzMSAzMDQuNzUyOSwtNDk3LjA2MzEgMzAwLjYzNjksLTQ5NC4yMjQzIDMwMi4xOTc5LC01MDAuNzY3NSAyOTYuNTIxLC00OTEuMzg1NCAyOTYuNTIxLC00OTEuMzg1NCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzI1LjMxNzIiIHk9Ii01MTguMjgzOSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUyIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTE0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlZTI8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzU0LjIzNjkiIGN5PSItMTcxLjAxNTYiIHJ4PSIzOS4yMzQyIiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzU0LjIzNjkiIHk9Ii0xNzUuMjE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM1NC4yMzY5IiB5PSItMTU4LjQxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwQkI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlMiYjNDU7Jmd0O3RyZWUycCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWUyJiM0NTsmZ3Q7dHJlZTJwPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTMzMi41OTk4LC0xOTUuNzIyNUMzMjYuODA0NCwtMjA1LjM0MzkgMzIzLjQxMTIsLTIxNi4zOTk0IDMyOC41NjM3LC0yMjYuMjMxMyAzMzEuMzQ2OSwtMjMxLjU0MjIgMzM0Ljk3MzgsLTIzNi40MDM3IDMzOS4xMjIsLTI0MC44MjkyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMzQ2LjUzODMsLTI0Ny44Njc3IDMzNi4xODcxLC0yNDQuMjQ3OCAzNDIuOTExNiwtMjQ0LjQyNTcgMzM5LjI4NDksLTI0MC45ODM4IDMzOS4yODQ5LC0yNDAuOTgzOCAzMzkuMjg0OSwtMjQwLjk4MzggMzQyLjkxMTYsLTI0NC40MjU3IDM0Mi4zODI3LC0yMzcuNzE5NyAzNDYuNTM4MywtMjQ3Ljg2NzcgMzQ2LjUzODMsLTI0Ny44Njc3Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNDkuMDczNSIgeT0iLTIxMy42MzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPjB4MEJCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZTImIzQ1OyZndDt0cmVlcyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWUyJiM0NTsmZ3Q7dHJlZXM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMzM1LjU2ODksLTE0NS4wMDIxQzMyOC42OTM1LC0xMzUuNDIxMyAzMjAuOTA2NCwtMTI0LjU3MDEgMzE0LjAyMDgsLTExNC45NzUxIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzE2LjY3NjYsLTExMi42NzI4IDMwOC4wMDI3LC0xMDYuNTg4OSAzMTAuOTg5NSwtMTE2Ljc1NDEgMzE2LjY3NjYsLTExMi42NzI4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMzEuNzA5MiIgeT0iLTEyMCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gczwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUycCYjNDU7Jmd0O3RyZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWUycCYjNDU7Jmd0O3RyZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0zNDYuMTU5LC0zMDQuNjQ0MkMzMzQuMjg2OCwtMzExLjQxOTcgMzIyLjAzMjQsLTMxOC45ODI0IDMxMS4xMTc3LC0zMjYuODIxNCAzMDAuNzk1NSwtMzM0LjIzNDcgMjkwLjI4NjksLTM0My4xNzI5IDI4MC45NzA4LC0zNTEuNjc3NiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjI3My40NTYxLC0zNTguNjc2NiAyNzcuNzA2OCwtMzQ4LjU2ODEgMjc3LjExNDksLTM1NS4yNjg5IDI4MC43NzM4LC0zNTEuODYxMSAyODAuNzczOCwtMzUxLjg2MTEgMjgwLjc3MzgsLTM1MS44NjExIDI3Ny4xMTQ5LC0zNTUuMjY4OSAyODMuODQwOCwtMzU1LjE1NDEgMjczLjQ1NjEsLTM1OC42NzY2IDI3My40NTYxLC0zNTguNjc2NiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzMwLjI5NjUiIHk9Ii0zMzEuMDIxNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjZmYwMDAwIj4weDBCRjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUycCYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDwhLS0gdHJlZTJwJiM0NTsmZ3Q7dHJlZTIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlMnAmIzQ1OyZndDt0cmVlMjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zODMuMzM0MSwtMjM2LjMzNjNDMzc5LjIxMzgsLTIyNy4wODY2IDM3NC44NDk4LC0yMTcuMjg5OCAzNzAuNzg5OCwtMjA4LjE3NTQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzNzMuOTU4MSwtMjA2LjY4NjMgMzY2LjY5MTgsLTE5OC45NzU3IDM2Ny41NjM4LC0yMDkuNTM0NiAzNzMuOTU4MSwtMjA2LjY4NjMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM4My4wNjcyIiB5PSItMjEzLjYzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IM61PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZXMmIzQ1OyZndDt0cmVlMiAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWVzJiM0NTsmZ3Q7dHJlZTI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjkwLjgyMzYsLTEwNi44MjY3QzI4OS43NDk5LC0xMTUuMTQxOSAyODkuOTI2OSwtMTI0Ljg2MDYgMjk0LjE2NDMsLTEzMi42IDI5OC4xMzU0LC0xMzkuODUzMSAzMDQuMTI0LC0xNDUuOTM2NiAzMTAuODA3LC0xNTAuOTY3MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjMxOS41NDM4LC0xNTYuNzg0NSAzMDguNzI2MSwtMTU0Ljk4NzggMzE1LjM4MiwtMTU0LjAxMzMgMzExLjIyMDIsLTE1MS4yNDIxIDMxMS4yMjAyLC0xNTEuMjQyMSAzMTEuMjIwMiwtMTUxLjI0MjEgMzE1LjM4MiwtMTU0LjAxMzMgMzEzLjcxNDMsLTE0Ny40OTY1IDMxOS41NDM4LC0xNTYuNzg0NSAzMTkuNTQzOCwtMTU2Ljc4NDUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMwMy4yNzMyIiB5PSItMTIwIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiNmZjAwMDAiPiB+MzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLncxLnN2ZyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC53MS5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlOTRhZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC53MS5zdmcKQEAgLTAsMCArMSwyMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIgorICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KKzwhLS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gR2VuZXJhdGVkIGJ5IGdyYXBodml6IHZlcnNpb24gMi40MC4xICgyMDE2MTIyNS4wMzA0KQorIyBlbWJlZGRlZCBET1QgKHBsYW50dW1sKSB3b3JrcyBpbiBJREVBIHByZXZpZXcKKyMgYnV0IG5vdCBvbiBHaXRIdWIKK2BgYCBwbGFudHVtbAorZGlncmFwaCBHIHsKKyAgICB0cmFjdG9yIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMF0iXQorICAgIHRyYWN0byBbbGFiZWwgPSAiMHgwMUIiXQorICAgIHRyYWN0IFtsYWJlbCA9ICIweDAxQSJdCisgICAgdHJhYyBbbGFiZWwgPSAiMHgwMTkiXQorICAgIHRyYSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDE4Il0KKworICAgIHRyZWUgW2xhYmVsID0gImNvbnRlbnRBcnJheVsxXSJdCisgICAgdHJlIFtsYWJlbCA9ICJDaGFpblxuMHgwM0IiXQorICAgIHRyaWUgW2xhYmVsID0gImNvbnRlbnRBcnJheVsyXSJdCisgICAgdHJpIFtsYWJlbCA9ICJDaGFpblxuMHgwNUIiXQorCisgICAgdHIgW2xhYmVsID0gIlNwYXJzZVxuMHgwN0UiXQorCisgICAgdCBbbGFiZWwgPSAiMHgwOUIiXQorICAgIHJvb3QgW2xhYmVsID0gIkNoYWluXG4weDlBIl0KKworICAgIC8vIGVkZ2UgW2NvbG9yPSJub25lIiwgZm9udGNvbG9yPSJub25lIl0KKyAgICByb290IC0+IHQgW2xhYmVsID0gIiB0Il0KKyAgICB0IC0+IHRyIFtsYWJlbCA9ICIgciJdCisgICAgdHIgLT4gdHJhIFtsYWJlbCA9ICIgYSJdCisgICAgdHJhIC0+IHRyYWMgW2xhYmVsID0gIiBjIl0KKyAgICB0cmFjIC0+IHRyYWN0IFtsYWJlbCA9ICIgdCJdCisgICAgdHJhY3QgLT4gdHJhY3RvIFtsYWJlbCA9ICIgbyJdCisgICAgdHJhY3RvIC0+IHRyYWN0b3IgW2xhYmVsID0gIiByIl0KKworICAgIHRyIC0+IHRyZSBbbGFiZWwgPSAiIGUiXQorICAgIHRyZSAtPiB0cmVlIFtsYWJlbCA9ICIgZSJdCisKKyAgICB0ciAtPiB0cmkgW2xhYmVsID0gIiBpIl0KKyAgICB0cmkgLT4gdHJpZSBbbGFiZWwgPSAiIGUiXQorCisgICAgLy8ge3Jhbms9c2FtZSB0cmEgLT4gdHJlIC0+IHRyaSBbc3R5bGU9aW52aXNdfQorICAgIHtyYW5rPXNhbWUgdHJhYyAtPiB0cmVlIC0+IHRyaWUgW3N0eWxlPWludmlzXX0KK30KK2BgYAorIC0tPgorPCEtLSBUaXRsZTogRyBQYWdlczogMSAtLT4KKzxzdmcgd2lkdGg9IjQ4MHB0IiBoZWlnaHQ9IjczNHB0IgorICAgICB2aWV3Qm94PSIwLjAwIDAuMDAgNDgwLjQ3IDczNC4wOSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CisgICAgPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDczMC4wOTM5KSI+CisgICAgICAgIDx0aXRsZT5HPC90aXRsZT4KKyAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgcG9pbnRzPSItNCw0IC00LC03MzAuMDkzOSA0NzYuNDczOCwtNzMwLjA5MzkgNDc2LjQ3MzgsNCAtNCw0Ii8+CisgICAgICAgIDwhLS0gdHJhY3RvciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTE4IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTMuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMF08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0bzwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTEwNi44IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTAyLjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG8mIzQ1OyZndDt0cmFjdG9yIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG8mIzQ1OyZndDt0cmFjdG9yPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTczLjIzNjksLTg4LjQwMDZDNzMuMjM2OSwtNzYuMjk0OSA3My4yMzY5LC02MC4yMDc2IDczLjIzNjksLTQ2LjQ2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI3Ni43MzcsLTQ2LjA3MiA3My4yMzY5LC0zNi4wNzIgNjkuNzM3LC00Ni4wNzIxIDc2LjczNywtNDYuMDcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3Ny4zMTcyIiB5PSItNTguMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTE5NS42IiByeD0iMzcuMTQ0MyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTkxLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMUE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdCYjNDU7Jmd0O3RyYWN0byAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3QmIzQ1OyZndDt0cmFjdG88L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNzMuMjM2OSwtMTc3LjIwMDZDNzMuMjM2OSwtMTY1LjA5NDkgNzMuMjM2OSwtMTQ5LjAwNzYgNzMuMjM2OSwtMTM1LjI2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI3Ni43MzcsLTEzNC44NzIgNzMuMjM2OSwtMTI0Ljg3MiA2OS43MzcsLTEzNC44NzIxIDc2LjczNywtMTM0Ljg3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzguNDg2OSIgeT0iLTE0NyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gbzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWM8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0yODQuNCIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDE5PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyYWN0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjJiM0NTsmZ3Q7dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNzMuMjM2OSwtMjY2LjAwMDZDNzMuMjM2OSwtMjUzLjg5NDkgNzMuMjM2OSwtMjM3LjgwNzYgNzMuMjM2OSwtMjI0LjA2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI3Ni43MzcsLTIyMy42NzIgNzMuMjM2OSwtMjEzLjY3MiA2OS43MzcsLTIyMy42NzIxIDc2LjczNywtMjIzLjY3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzYuOTMyMiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU2IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii0yODQuNCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMV08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjJiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPCEtLSB0cmEgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIxMTIuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjM2LjEyNSIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjExMi4yMzY5IiB5PSItMzg4LjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMTIuMjM2OSIgeT0iLTM3Mi4wMTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDE4PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhJiM0NTsmZ3Q7dHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhJiM0NTsmZ3Q7dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0xMDEuMjY5NCwtMzU2LjQzMzNDOTUuODMwNiwtMzQyLjQ1NzUgODkuMjg4NywtMzI1LjY0NzIgODMuODkyOSwtMzExLjc4MjEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI4Ny4wODcyLC0zMTAuMzM5MyA4MC4xOTg4LC0zMDIuMjg5NSA4MC41NjM4LC0zMTIuODc4IDg3LjA4NzIsLTMxMC4zMzkzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5OC4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmllIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM5OS4yMzY5IiBjeT0iLTI4NC40IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzOTkuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsyXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8IS0tIHRyZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU3IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIxNy4yMzY5IiBjeT0iLTM4NC42MTU2IiByeD0iMzcuOTMwNiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItMzg4LjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTM3Mi4wMTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDNCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlJiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlJiM0NTsmZ3Q7dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMTcuMjM2OSwtMzU1LjA4OTdDMjE3LjIzNjksLTM0MS42MDQ2IDIxNy4yMzY5LC0zMjUuNzEyMyAyMTcuMjM2OSwtMzEyLjQxNTMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyMjAuNzM3LC0zMTIuNDAzMyAyMTcuMjM2OSwtMzAyLjQwMzMgMjEzLjczNywtMzEyLjQwMzQgMjIwLjczNywtMzEyLjQwMzMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMi4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmkgLS0+CisgICAgICAgIDxnIGlkPSJub2RlOSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyaTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzNTQuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNTQuMjM2OSIgeT0iLTM4OC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzU0LjIzNjkiIHk9Ii0zNzIuMDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA1QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmkmIzQ1OyZndDt0cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTM2Ni43NzE5LC0zNTYuN0MzNzMuMTEwOSwtMzQyLjU4MyAzODAuNzcyMywtMzI1LjUyMDkgMzg3LjA2MDMsLTMxMS41MTc1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzkwLjI1NzUsLTMxMi45NDE1IDM5MS4xNjA5LC0zMDIuMzg1MiAzODMuODcxNywtMzEwLjA3NCAzOTAuMjU3NSwtMzEyLjk0MTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM4Ni4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIxNy4yMzY5IiBjeT0iLTQ5Ni4yNDY5IiByeD0iMzcuOTAyNyIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItNTAwLjQ0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+U3BhcnNlPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii00ODMuNjQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA3RTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJhIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyYTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0xOTQuNzExOCwtNDcyLjI5OTJDMTc5LjEwNDcsLTQ1NS43MDY1IDE1OC4xODI4LC00MzMuNDYzMyAxNDEuMzE3LC00MTUuNTMyMyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjE0My43NjUzLC00MTMuMDI2NyAxMzQuMzY0NCwtNDA4LjE0MDYgMTM4LjY2NjQsLTQxNy44MjI3IDE0My43NjUzLC00MTMuMDI2NyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTc2LjA5NDIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gYTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMTcuMjM2OSwtNDY2LjYyNDlDMjE3LjIzNjksLTQ1My43NTY4IDIxNy4yMzY5LC00MzguNDg2NyAyMTcuMjM2OSwtNDI0LjYzMTkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyMjAuNzM3LC00MjQuMzc2MSAyMTcuMjM2OSwtNDE0LjM3NjEgMjEzLjczNywtNDI0LjM3NjIgMjIwLjczNywtNDI0LjM3NjEiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMi4wOTQyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyaSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTI0My4zMjgsLTQ3NC45ODcyQzI2NC45OTU2LC00NTcuMzMxOSAyOTUuOTk2MywtNDMyLjA3MTYgMzE5LjcxNjksLTQxMi43NDM1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMzIyLjIzNDgsLTQxNS4yMDY2IDMyNy43NzYzLC00MDYuMTc2NSAzMTcuODEzLC00MDkuNzggMzIyLjIzNDgsLTQxNS4yMDY2Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyOTYuOTMyMiIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBpPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnQ8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE3LjIzNjkiIGN5PSItNTk2LjQ2MjYiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItNTkyLjI2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwOUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0JiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnQmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMTcuMjM2OSwtNTc4LjA4MTVDMjE3LjIzNjksLTU2Ni4zNTAyIDIxNy4yMzY5LC01NTAuNjc3NCAyMTcuMjM2OSwtNTM2LjE4ODUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyMjAuNzM3LC01MzUuOTIwOCAyMTcuMjM2OSwtNTI1LjkyMDkgMjEzLjczNywtNTM1LjkyMDkgMjIwLjczNywtNTM1LjkyMDgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMS4zMTcyIiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii02OTYuNjc4MiIgcng9IjMzLjEzMzciIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTcwMC44NzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii02ODQuMDc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDlBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3QmIzQ1OyZndDt0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTIxNy4yMzY5LC02NjcuMTUyMkMyMTcuMjM2OSwtNjUzLjY2NzEgMjE3LjIzNjksLTYzNy43NzQ5IDIxNy4yMzY5LC02MjQuNDc3OSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjIyMC43MzcsLTYyNC40NjU5IDIxNy4yMzY5LC02MTQuNDY1OSAyMTMuNzM3LC02MjQuNDY1OSAyMjAuNzM3LC02MjQuNDY1OSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjIwLjkzMjIiIHk9Ii02MzYuNjYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLncyLnN2ZyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC53Mi5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4YWIyMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC53Mi5zdmcKQEAgLTAsMCArMSwzMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIgorICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KKzwhLS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gR2VuZXJhdGVkIGJ5IGdyYXBodml6IHZlcnNpb24gMi40MC4xICgyMDE2MTIyNS4wMzA0KQorYGBgcGxhbnR1bWwKK2RpZ3JhcGggRyB7CisgICAgeyByYW5rPXNhbWUgcm9vdCAtPiBzdGFydCBbc3R5bGU9aW52aXNdIH0KKyAgICBzdGFydCBbbGFiZWw9InN0YXJ0L2VuZCJdCisKKyAgICB0cmFjdG9yIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMF0iXQorICAgIHRyYWN0byBbbGFiZWwgPSAiMHgwMUIiXQorICAgIHRyYWN0IFtsYWJlbCA9ICIweDAxQSJdCisgICAgdHJhYyBbbGFiZWwgPSAiMHgwMTkiXQorICAgIHRyYSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDE4Il0KKworICAgIHRyZWUgW2xhYmVsID0gImNvbnRlbnRBcnJheVsxXSJdCisgICAgdHJlIFtsYWJlbCA9ICJDaGFpblxuMHgwM0IiXQorICAgIHRyaWUgW2xhYmVsID0gImNvbnRlbnRBcnJheVsyXSJdCisgICAgdHJpIFtsYWJlbCA9ICJDaGFpblxuMHgwNUIiXQorCisgICAgdHIgW2xhYmVsID0gIlNwYXJzZVxuMHgwN0UiXQorCisgICAgdCBbbGFiZWwgPSAiMHgwOUIiXQorICAgIHJvb3QgW2xhYmVsID0gIkNoYWluXG4weDlBIl0KKworICAgIC8vIHtyYW5rPXNhbWUgdHJhIC0+IHRyZSAtPiB0cmkgW3N0eWxlPWludmlzXX0KKyAgICB7cmFuaz1zYW1lIHRyYWMgLT4gdHJlZSAtPiB0cmllIFtzdHlsZT1pbnZpc119CisKKyAgICBzdWJncmFwaCBwYXRoIHsKKyAgICAgICAgZWRnZSBbY29sb3IgPSAibGlnaHRibHVlIjsgZm9udGNvbG9yPSJibHVlIjsgYXJyb3doZWFkPSJ2ZWUiXQorCisgICAgICAgIHN0YXJ0IC0+IHJvb3QKKworICAgIHJvb3QgLT4gdCBbbGFiZWwgPSAiIHQiXQorICAgIHQgLT4gdHIgW2xhYmVsID0gIiByIl0KKyAgICB0ciAtPiB0cmEgW2xhYmVsID0gIiBhIl0KKyAgICB0cmEgLT4gdHJhYyBbbGFiZWwgPSAiIGMiXQorICAgIHRyYWMgLT4gdHJhY3QgW2xhYmVsID0gIiB0Il0KKyAgICB0cmFjdCAtPiB0cmFjdG8gW2xhYmVsID0gIiBvIl0KKyAgICB0cmFjdG8gLT4gdHJhY3RvciBbbGFiZWwgPSAiIHIiXQorCisgICAgdHIgLT4gdHJlIFtsYWJlbCA9ICIgZSJdCisgICAgdHJlIC0+IHRyZWUgW2xhYmVsID0gIiBlIl0KKworICAgIHRyIC0+IHRyaSBbbGFiZWwgPSAiIGkiXQorICAgIHRyaSAtPiB0cmllIFtsYWJlbCA9ICIgZSJdCisgICAgfQorCisgICAgc3ViZ3JhcGggYmFjayB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gInBpbmsiOyBmb250Y29sb3I9ImJsdWUiOyBjb25zdHJhaW50PSJmYWxzZSI7IGFycm93aGVhZD0idmVlIl0KKworICAgICAgICB0cmFjdG9yIC0+IHRyYWN0byAtPiB0cmFjdCAtPiB0cmFjIC0+IHRyYSAtPiB0cgorICAgICAgICB0cmVlIC0+IHRyZSAtPiB0cgorICAgICAgICB0cmllIC0+IHRyaSAtPiB0ciAtPiB0IC0+IHJvb3QgLT4gc3RhcnQKKyAgICB9Cit9CisKK2BgYAorIC0tPgorPCEtLSBUaXRsZTogRyBQYWdlczogMSAtLT4KKzxzdmcgd2lkdGg9IjQ4MHB0IiBoZWlnaHQ9IjczNHB0IgorICAgICB2aWV3Qm94PSIwLjAwIDAuMDAgNDgwLjQ3IDczNC4wOSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CisgICAgPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDczMC4wOTM5KSI+CisgICAgICAgIDx0aXRsZT5HPC90aXRsZT4KKyAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgcG9pbnRzPSItNCw0IC00LC03MzAuMDkzOSA0NzYuNDczOCwtNzMwLjA5MzkgNDc2LjQ3MzgsNCAtNCw0Ii8+CisgICAgICAgIDwhLS0gcm9vdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii02OTYuNjc4MiIgcng9IjMzLjEzMzciIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTcwMC44NzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii02ODQuMDc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDlBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gc3RhcnQgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnN0YXJ0PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjMzMC4yMzY5IiBjeT0iLTY5Ni42NzgyIiByeD0iNDQuMDc3NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMzAuMjM2OSIgeT0iLTY5Mi40NzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPnN0YXJ0L2VuZDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDtzdGFydCAtLT4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7c3RhcnQgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290JiM0NTsmZ3Q7c3RhcnQ8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMjQ1LjA0NTUsLTcxMy4wNTA4QzI2Mi4wNzk2LC03MTkuODA2MSAyNzkuMTEzNywtNzIwLjU0NTUgMjk2LjE0NzgsLTcxNS4yNjg5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMzA1LjYxMTIsLTcxMS43MTg1IDI5Ny44MjkyLC03MTkuNDQ0NCAzMDAuOTI5OSwtNzEzLjQ3NDggMjk2LjI0ODUsLTcxNS4yMzEyIDI5Ni4yNDg1LC03MTUuMjMxMiAyOTYuMjQ4NSwtNzE1LjIzMTIgMzAwLjkyOTksLTcxMy40NzQ4IDI5NC42Njc4LC03MTEuMDE3OSAzMDUuNjExMiwtNzExLjcxODUgMzA1LjYxMTIsLTcxMS43MTg1Ii8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii01OTYuNDYyNiIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii01OTIuMjYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA5QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDt0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290JiM0NTsmZ3Q7dDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMTcuMjM2OSwtNjY3LjE1MjJDMjE3LjIzNjksLTY1My42NjcxIDIxNy4yMzY5LC02MzcuNzc0OSAyMTcuMjM2OSwtNjI0LjQ3NzkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMTcuMjM2OSwtNjE0LjQ2NTkgMjIxLjczNywtNjI0LjQ2NTkgMjE3LjIzNjksLTYxOS40NjU5IDIxNy4yMzcsLTYyNC40NjU5IDIxNy4yMzcsLTYyNC40NjU5IDIxNy4yMzcsLTYyNC40NjU5IDIxNy4yMzY5LC02MTkuNDY1OSAyMTIuNzM3LC02MjQuNDY1OSAyMTcuMjM2OSwtNjE0LjQ2NTkgMjE3LjIzNjksLTYxNC40NjU5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjAuOTMyMiIgeT0iLTYzNi42NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gc3RhcnQmIzQ1OyZndDtyb290IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5zdGFydCYjNDU7Jmd0O3Jvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjg1Ljg1NDksLTY5Ni42NzgyQzI3Ny41NDM3LC02OTYuNjc4MiAyNjkuMjMyNiwtNjk2LjY3ODIgMjYwLjkyMTUsLTY5Ni42NzgyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjUwLjc4MzgsLTY5Ni42NzgyIDI2MC43ODM4LC02OTIuMTc4MyAyNTUuNzgzOCwtNjk2LjY3ODMgMjYwLjc4MzgsLTY5Ni42NzgzIDI2MC43ODM4LC02OTYuNjc4MyAyNjAuNzgzOCwtNjk2LjY3ODMgMjU1Ljc4MzgsLTY5Ni42NzgzIDI2MC43ODM3LC03MDEuMTc4MyAyNTAuNzgzOCwtNjk2LjY3ODIgMjUwLjc4MzgsLTY5Ni42NzgyIi8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG9yIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG9yPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMTgiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0xMy44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVswXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMTA2LjgiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0xMDIuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0b3ImIzQ1OyZndDt0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG9yJiM0NTsmZ3Q7dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTc4LjY5MzcsLTM2LjE1MDlDODAuMTQ2NywtNDEuODEzNiA4MS41MTI3LC00OC4xMTc0IDgyLjIzNjksLTU0IDgzLjE0OTIsLTYxLjQxMDcgODMuMTQ5MiwtNjMuMzg5MyA4Mi4yMzY5LC03MC44IDgxLjkyMDEsLTczLjM3MzYgODEuNDgwNCwtNzYuMDI3OSA4MC45NjQzLC03OC42NzM4Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iNzguNjkzNywtODguNjQ5MSA3Ni41MjU1LC03Ny44OTk3IDc5LjgwMzUsLTgzLjc3MzggODAuOTEzMiwtNzguODk4NSA4MC45MTMyLC03OC44OTg1IDgwLjkxMzIsLTc4Ljg5ODUgNzkuODAzNSwtODMuNzczOCA4NS4zMDEsLTc5Ljg5NzMgNzguNjkzNywtODguNjQ5MSA3OC42OTM3LC04OC42NDkxIi8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG8mIzQ1OyZndDt0cmFjdG9yIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvJiM0NTsmZ3Q7dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik03My4yMzY5LC04OC40MDA2QzczLjIzNjksLTc2LjI5NDkgNzMuMjM2OSwtNjAuMjA3NiA3My4yMzY5LC00Ni40Njc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iNzMuMjM2OSwtMzYuMDcyIDc3LjczNywtNDYuMDcyIDczLjIzNjksLTQxLjA3MiA3My4yMzcsLTQ2LjA3MiA3My4yMzcsLTQ2LjA3MiA3My4yMzcsLTQ2LjA3MiA3My4yMzY5LC00MS4wNzIgNjguNzM3LC00Ni4wNzIxIDczLjIzNjksLTM2LjA3MiA3My4yMzY5LC0zNi4wNzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc3LjMxNzIiIHk9Ii01OC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMTk1LjYiIHJ4PSIzNy4xNDQzIiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byYjNDU7Jmd0O3RyYWN0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE3IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvJiM0NTsmZ3Q7dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNODAuMzc5NiwtMTI0LjQ1OTVDODIuMzYzNSwtMTMwLjIwOTcgODQuMjQ0OSwtMTM2LjY4NzIgODUuMjM2OSwtMTQyLjggODYuNDMyOSwtMTUwLjE3MDMgODYuNDMyOSwtMTUyLjIyOTcgODUuMjM2OSwtMTU5LjYgODQuNzk3LC0xNjIuMzEwOSA4NC4xODIxLC0xNjUuMDkzNiA4My40NjEsLTE2Ny44NTI3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iODAuNTA2MSwtMTc3LjU3MjUgNzkuMTA5MywtMTY2LjY5NTkgODEuOTYwNCwtMTcyLjc4ODYgODMuNDE0OCwtMTY4LjAwNDggODMuNDE0OCwtMTY4LjAwNDggODMuNDE0OCwtMTY4LjAwNDggODEuOTYwNCwtMTcyLjc4ODYgODcuNzIwMiwtMTY5LjMxMzcgODAuNTA2MSwtMTc3LjU3MjUgODAuNTA2MSwtMTc3LjU3MjUiLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0JiM0NTsmZ3Q7dHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3QmIzQ1OyZndDt0cmFjdG88L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNNzMuMjM2OSwtMTc3LjIwMDZDNzMuMjM2OSwtMTY1LjA5NDkgNzMuMjM2OSwtMTQ5LjAwNzYgNzMuMjM2OSwtMTM1LjI2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSI3My4yMzY5LC0xMjQuODcyIDc3LjczNywtMTM0Ljg3MiA3My4yMzY5LC0xMjkuODcyIDczLjIzNywtMTM0Ljg3MiA3My4yMzcsLTEzNC44NzIgNzMuMjM3LC0xMzQuODcyIDczLjIzNjksLTEyOS44NzIgNjguNzM3LC0xMzQuODcyMSA3My4yMzY5LC0xMjQuODcyIDczLjIzNjksLTEyNC44NzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc4LjQ4NjkiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IG88L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTYiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMjg0LjQiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxOTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0JiM0NTsmZ3Q7dHJhYyAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0JiM0NTsmZ3Q7dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik03OC4wODg2LC0yMTMuNzg0N0M3OS4zODAyLC0yMTkuNDQ4NyA4MC41OTQyLC0yMjUuNzQ0OSA4MS4yMzY5LC0yMzEuNiA4Mi4wNTE2LC0yMzkuMDIyMSA4Mi4wNTE2LC0yNDAuOTc3OSA4MS4yMzY5LC0yNDguNCA4MC45NTU3LC0yNTAuOTYxNiA4MC41NjUyLC0yNTMuNjA3NiA4MC4xMDY2LC0yNTYuMjQ4MiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9Ijc4LjA4ODYsLTI2Ni4yMTUzIDc1LjY2MjYsLTI1NS41MjExIDc5LjA4MDgsLTI2MS4zMTQ3IDgwLjA3MzEsLTI1Ni40MTQyIDgwLjA3MzEsLTI1Ni40MTQyIDgwLjA3MzEsLTI1Ni40MTQyIDc5LjA4MDgsLTI2MS4zMTQ3IDg0LjQ4MzYsLTI1Ny4zMDcyIDc4LjA4ODYsLTI2Ni4yMTUzIDc4LjA4ODYsLTI2Ni4yMTUzIi8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjJiM0NTsmZ3Q7dHJhY3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWMmIzQ1OyZndDt0cmFjdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik03My4yMzY5LC0yNjYuMDAwNkM3My4yMzY5LC0yNTMuODk0OSA3My4yMzY5LC0yMzcuODA3NiA3My4yMzY5LC0yMjQuMDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjczLjIzNjksLTIxMy42NzIgNzcuNzM3LC0yMjMuNjcyIDczLjIzNjksLTIxOC42NzIgNzMuMjM3LC0yMjMuNjcyIDczLjIzNywtMjIzLjY3MiA3My4yMzcsLTIyMy42NzIgNzMuMjM2OSwtMjE4LjY3MiA2OC43MzcsLTIyMy42NzIxIDczLjIzNjksLTIxMy42NzIgNzMuMjM2OSwtMjEzLjY3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzYuOTMyMiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTciIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmE8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMTEyLjIzNjkiIGN5PSItMzg0LjYxNTYiIHJ4PSIzNi4xMjUiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMTIuMjM2OSIgeT0iLTM4OC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTEyLjIzNjkiIHk9Ii0zNzIuMDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxODwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmEgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjJiM0NTsmZ3Q7dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTkyLjIwMjMsLTI5OS44MTA3Qzk4LjAzOTgsLTMwNS42MTcyIDEwMy44MjI2LC0zMTIuNjk4IDEwNy4yMzY5LC0zMjAuNCAxMTAuNjE5OCwtMzI4LjAzMTIgMTEyLjQ1NSwtMzM2LjY3MjEgMTEzLjM1NzQsLTM0NS4wODQ5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMTE0LjAzNjksLTM1NS4xNTA1IDEwOC44NzM1LC0zNDUuNDc2MyAxMTMuNzAwMSwtMzUwLjE2MTggMTEzLjM2MzMsLTM0NS4xNzMyIDExMy4zNjMzLC0zNDUuMTczMiAxMTMuMzYzMywtMzQ1LjE3MzIgMTEzLjcwMDEsLTM1MC4xNjE4IDExNy44NTMsLTM0NC44NyAxMTQuMDM2OSwtMzU1LjE1MDUgMTE0LjAzNjksLTM1NS4xNTA1Ii8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIxNy4yMzY5IiBjeT0iLTI4NC40IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsxXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8IS0tIHRyYSYjNDU7Jmd0O3RyYWMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYSYjNDU7Jmd0O3RyYWM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMTAxLjI2OTQsLTM1Ni40MzMzQzk1LjgzMDYsLTM0Mi40NTc1IDg5LjI4ODcsLTMyNS42NDcyIDgzLjg5MjksLTMxMS43ODIxIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iODAuMTk4OCwtMzAyLjI4OTUgODguMDE5MSwtMzA5Ljk3NjYgODIuMDEyMSwtMzA2Ljk0OTEgODMuODI1NSwtMzExLjYwODcgODMuODI1NSwtMzExLjYwODcgODMuODI1NSwtMzExLjYwODcgODIuMDEyMSwtMzA2Ljk0OTEgNzkuNjMxOSwtMzEzLjI0MDcgODAuMTk4OCwtMzAyLjI4OTUgODAuMTk4OCwtMzAyLjI4OTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijk4LjA5NDIiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gYzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHI8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE3LjIzNjkiIGN5PSItNDk2LjI0NjkiIHJ4PSIzNy45MDI3IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii01MDAuNDQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5TcGFyc2U8L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTQ4My42NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDdFPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhJiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjAiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0xMzQuODI0NCwtNDA3LjY0NjdDMTQyLjMxOTgsLTQxNS4zNTYgMTUwLjY3ODIsLTQyNC4wMjUzIDE1OC4yMzY5LC00MzIuMDMxMyAxNjguMDkyOCwtNDQyLjQ3MDQgMTc4Ljc0MjYsLTQ1My45ODcgMTg4LjI0NTcsLTQ2NC4zNTA0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMTk1LjI1NzIsLTQ3Mi4wMTM2IDE4NS4xODY3LC00NjcuNjczNCAxOTEuODgyLC00NjguMzI0NyAxODguNTA2OCwtNDY0LjYzNTcgMTg4LjUwNjgsLTQ2NC42MzU3IDE4OC41MDY4LC00NjQuNjM1NyAxOTEuODgyLC00NjguMzI0NyAxOTEuODI2OCwtNDYxLjU5OCAxOTUuMjU3MiwtNDcyLjAxMzYgMTk1LjI1NzIsLTQ3Mi4wMTM2Ii8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlOSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTM4OC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii0zNzIuMDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAzQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUmIzQ1OyZndDt0cmUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlJiM0NTsmZ3Q7dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTIyNS43MTE2LC0zMDIuMzI3OUMyMjcuOTcxMywtMzA3Ljk4MTQgMjMwLjA5OTMsLTMxNC4zMzYzIDIzMS4yMzY5LC0zMjAuNCAyMzIuODI0NywtMzI4Ljg2MzcgMjMyLjI1OTYsLTMzNy45MTc5IDIzMC42NzMsLTM0Ni40NzkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMjguNDA5LC0zNTYuMjM3NiAyMjYuMjg1NSwtMzQ1LjQ3OTMgMjI5LjUzOTEsLTM1MS4zNjY5IDIzMC42NjkxLC0zNDYuNDk2MyAyMzAuNjY5MSwtMzQ2LjQ5NjMgMjMwLjY2OTEsLTM0Ni40OTYzIDIyOS41MzkxLC0zNTEuMzY2OSAyMzUuMDUyNywtMzQ3LjUxMzMgMjI4LjQwOSwtMzU2LjIzNzYgMjI4LjQwOSwtMzU2LjIzNzYiLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaWUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTAiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM5OS4yMzY5IiBjeT0iLTI4NC40IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzOTkuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsyXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8IS0tIHRyZSYjNDU7Jmd0O3RyZWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmUmIzQ1OyZndDt0cmVlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIxNy4yMzY5LC0zNTUuMDg5N0MyMTcuMjM2OSwtMzQxLjYwNDYgMjE3LjIzNjksLTMyNS43MTIzIDIxNy4yMzY5LC0zMTIuNDE1MyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIxNy4yMzY5LC0zMDIuNDAzMyAyMjEuNzM3LC0zMTIuNDAzMyAyMTcuMjM2OSwtMzA3LjQwMzMgMjE3LjIzNywtMzEyLjQwMzMgMjE3LjIzNywtMzEyLjQwMzMgMjE3LjIzNywtMzEyLjQwMzMgMjE3LjIzNjksLTMwNy40MDMzIDIxMi43MzcsLTMxMi40MDM0IDIxNy4yMzY5LC0zMDIuNDAzMyAyMTcuMjM2OSwtMzAyLjQwMzMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMi4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZSYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2ZmYzBjYiIgZD0iTTIyNy44OTIzLC00MTIuOTA3OUMyMzAuOTAzNywtNDI0LjA0IDIzMi45NTA5LC00MzYuOTczNiAyMzEuMjM2OSwtNDQ4LjgzMTMgMjMwLjgwMjcsLTQ1MS44MzUgMjMwLjIyMTQsLTQ1NC45MTM2IDIyOS41NDE4LC00NTcuOTg5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMjI3LjA5NjgsLTQ2Ny43MDU3IDIyNS4xNzMyLC00NTYuOTA5OSAyMjguMzE3LC00NjIuODU2OSAyMjkuNTM3MSwtNDU4LjAwOCAyMjkuNTM3MSwtNDU4LjAwOCAyMjkuNTM3MSwtNDU4LjAwOCAyMjguMzE3LC00NjIuODU2OSAyMzMuOTAxMSwtNDU5LjEwNjIgMjI3LjA5NjgsLTQ2Ny43MDU3IDIyNy4wOTY4LC00NjcuNzA1NyIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTExIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjMyNi4yMzY5IiBjeT0iLTM4NC42MTU2IiByeD0iMzcuOTMwNiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMyNi4yMzY5IiB5PSItMzg4LjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMjYuMjM2OSIgeT0iLTM3Mi4wMTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDVCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpZSYjNDU7Jmd0O3RyaSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyaWUmIzQ1OyZndDt0cmk8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMzkzLjg1NjMsLTMwMi40ODIyQzM5MC4xNzI0LC0zMTMuMTU1OCAzODQuNjE0NCwtMzI2LjYwNiAzNzcuMjM2OSwtMzM3LjIgMzcyLjUyNDgsLTM0My45NjY1IDM2Ni43MDM2LC0zNTAuNDkzIDM2MC42OTg3LC0zNTYuNDI3MiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjM1My4wNjM4LC0zNjMuNjAwNSAzNTcuMjcwNCwtMzUzLjQ3MzYgMzU2LjcwNzgsLTM2MC4xNzY4IDM2MC4zNTE4LC0zNTYuNzUzMSAzNjAuMzUxOCwtMzU2Ljc1MzEgMzYwLjM1MTgsLTM1Ni43NTMxIDM1Ni43MDc4LC0zNjAuMTc2OCAzNjMuNDMzMSwtMzYwLjAzMjcgMzUzLjA2MzgsLTM2My42MDA1IDM1My4wNjM4LC0zNjMuNjAwNSIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpJiM0NTsmZ3Q7dHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyaSYjNDU7Jmd0O3RyaWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMzQyLjIzODYsLTM1Ny43NjM1QzM0OS41NTYyLC0zNDYuMDE4MiAzNTguNTc2NywtMzMyLjI0NjEgMzY3LjUyMjMsLTMyMC40IDM3MC4xMTk5LC0zMTYuOTYwMiAzNzIuOTYzMywtMzEzLjQzOTkgMzc1Ljg0NjksLTMxMC4wMTI0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMzgyLjU1MTgsLTMwMi4yNjQ0IDM3OS40MTA4LC0zMTIuNzcwOCAzNzkuMjc5OSwtMzA2LjA0NTMgMzc2LjAwODEsLTMwOS44MjYxIDM3Ni4wMDgxLC0zMDkuODI2MSAzNzYuMDA4MSwtMzA5LjgyNjEgMzc5LjI3OTksLTMwNi4wNDUzIDM3Mi42MDUzLC0zMDYuODgxNSAzODIuNTUxOCwtMzAyLjI2NDQgMzgyLjU1MTgsLTMwMi4yNjQ0Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNzIuMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpJiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmkmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0zMTQuMTY5NywtNDEyLjc5NjhDMzA4LjEzODIsLTQyNC43ODgzIDMwMC4wMjQyLC00MzguMzg1MyAyOTAuMjM2OSwtNDQ4LjgzMTMgMjgwLjkzMjYsLTQ1OC43NjE4IDI2OS4xNDE5LC00NjcuNTcyOCAyNTcuNzY1MSwtNDc0LjgyMzEiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyNDkuMTkzOSwtNDgwLjA1NiAyNTUuMzg0MSwtNDcxLjAwNDQgMjUzLjQ2MTQsLTQ3Ny40NTA2IDI1Ny43MjksLTQ3NC44NDUxIDI1Ny43MjksLTQ3NC44NDUxIDI1Ny43MjksLTQ3NC44NDUxIDI1My40NjE0LC00NzcuNDUwNiAyNjAuMDczOSwtNDc4LjY4NTkgMjQ5LjE5MzksLTQ4MC4wNTYgMjQ5LjE5MzksLTQ4MC4wNTYiLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJhIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyYTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xODYuMTc2NiwtNDc5LjA1MzlDMTczLjQ3OSwtNDcxLjAwODMgMTU5LjI3OTQsLTQ2MC41OTkxIDE0OC41MjIzLC00NDguODMxMyAxNDEuMTIzOSwtNDQwLjczNzcgMTM0LjYxNSwtNDMwLjg3MzYgMTI5LjIyODMsLTQyMS4zMjkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIxMjQuNDE1MywtNDEyLjM0NDEgMTMzLjEwNDEsLTQxOS4wMzQxIDEyNi43NzYzLC00MTYuNzUxNiAxMjkuMTM3MywtNDIxLjE1OSAxMjkuMTM3MywtNDIxLjE1OSAxMjkuMTM3MywtNDIxLjE1OSAxMjYuNzc2MywtNDE2Ljc1MTYgMTI1LjE3MDYsLTQyMy4yODQgMTI0LjQxNTMsLTQxMi4zNDQxIDEyNC40MTUzLC00MTIuMzQ0MSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTU0LjA5NDIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gYTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjE3LjIzNjksLTQ2Ni42MjQ5QzIxNy4yMzY5LC00NTMuNzU2OCAyMTcuMjM2OSwtNDM4LjQ4NjcgMjE3LjIzNjksLTQyNC42MzE5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjE3LjIzNjksLTQxNC4zNzYxIDIyMS43MzcsLTQyNC4zNzYxIDIxNy4yMzY5LC00MTkuMzc2MSAyMTcuMjM3LC00MjQuMzc2MSAyMTcuMjM3LC00MjQuMzc2MSAyMTcuMjM3LC00MjQuMzc2MSAyMTcuMjM2OSwtNDE5LjM3NjEgMjEyLjczNywtNDI0LjM3NjIgMjE3LjIzNjksLTQxNC4zNzYxIDIxNy4yMzY5LC00MTQuMzc2MSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjIyLjA5NDIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJpIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmk8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjQwLjA4NjksLTQ3Mi44NDU0QzI1Ni4yNTUzLC00NTYuMjg2NiAyNzguMTExMSwtNDMzLjkwMzIgMjk1Ljc2MjgsLTQxNS44MjU0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMzAzLjA0MTYsLTQwOC4zNzA5IDI5OS4yNzUsLTQxOC42Njk2IDI5OS41NDg1LC00MTEuOTQ4MyAyOTYuMDU1MywtNDE1LjUyNTggMjk2LjA1NTMsLTQxNS41MjU4IDI5Ni4wNTUzLC00MTUuNTI1OCAyOTkuNTQ4NSwtNDExLjk0ODMgMjkyLjgzNTYsLTQxMi4zODIgMzAzLjA0MTYsLTQwOC4zNzA5IDMwMy4wNDE2LC00MDguMzcwOSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjgyLjkzMjIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gaTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMjQuNTU2NiwtNTI1LjMwOTZDMjI2LjQ3MzQsLTUzNi4zMTEyIDIyNy42NTM2LC01NDguOTU0MiAyMjYuMjM2OSwtNTYwLjQ2MjYgMjI1LjkyMDEsLTU2My4wMzYyIDIyNS40ODA0LC01NjUuNjkwNSAyMjQuOTY0MywtNTY4LjMzNjQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMjIuNjkzNywtNTc4LjMxMTcgMjIwLjUyNTUsLTU2Ny41NjIzIDIyMy44MDM1LC01NzMuNDM2NCAyMjQuOTEzMiwtNTY4LjU2MTEgMjI0LjkxMzIsLTU2OC41NjExIDIyNC45MTMyLC01NjguNTYxMSAyMjMuODAzNSwtNTczLjQzNjQgMjI5LjMwMSwtNTY5LjU1OTkgMjIyLjY5MzcsLTU3OC4zMTE3IDIyMi42OTM3LC01NzguMzExNyIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCYjNDU7Jmd0O3Jvb3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50JiM0NTsmZ3Q7cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0yMjIuMDg4NiwtNjE0LjY0NzNDMjIzLjM4MDIsLTYyMC4zMTEzIDIyNC41OTQyLC02MjYuNjA3NSAyMjUuMjM2OSwtNjMyLjQ2MjYgMjI2LjEyNDcsLTY0MC41NTA0IDIyNS44NywtNjQ5LjIwMTQgMjI1LjA0OCwtNjU3LjQ0OTciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIyMjMuNzQ2OSwtNjY3LjYwOTQgMjIwLjU1MzcsLTY1Ny4xMTg4IDIyNC4zODIxLC02NjIuNjQ5OSAyMjUuMDE3MywtNjU3LjY5MDQgMjI1LjAxNzMsLTY1Ny42OTA0IDIyNS4wMTczLC02NTcuNjkwNCAyMjQuMzgyMSwtNjYyLjY0OTkgMjI5LjQ4MDgsLTY1OC4yNjIxIDIyMy43NDY5LC02NjcuNjA5NCAyMjMuNzQ2OSwtNjY3LjYwOTQiLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHQmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dCYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIxNy4yMzY5LC01NzguMDgxNUMyMTcuMjM2OSwtNTY2LjM1MDIgMjE3LjIzNjksLTU1MC42Nzc0IDIxNy4yMzY5LC01MzYuMTg4NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIxNy4yMzY5LC01MjUuOTIwOSAyMjEuNzM3LC01MzUuOTIwOCAyMTcuMjM2OSwtNTMwLjkyMDkgMjE3LjIzNywtNTM1LjkyMDkgMjE3LjIzNywtNTM1LjkyMDkgMjE3LjIzNywtNTM1LjkyMDkgMjE3LjIzNjksLTUzMC45MjA5IDIxMi43MzcsLTUzNS45MjA5IDIxNy4yMzY5LC01MjUuOTIwOSAyMTcuMjM2OSwtNTI1LjkyMDkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMS4zMTcyIiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC53My5zdmcgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQudzMuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMDJhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQudzMuc3ZnCkBAIC0wLDAgKzEsMjY5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIKKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+Cis8IS0tLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIEdlbmVyYXRlZCBieSBncmFwaHZpeiB2ZXJzaW9uIDIuNDAuMSAoMjAxNjEyMjUuMDMwNCkKKyMgZW1iZWRkZWQgRE9UIChwbGFudHVtbCkgd29ya3MgaW4gSURFQSBwcmV2aWV3CisjIGJ1dCBub3Qgb24gR2l0SHViCitkaWdyYXBoIEcgeworICAgIHsgcmFuaz1zYW1lIHJvb3QgLT4gc3RhcnQgW3N0eWxlPWludmlzXSB9CisgICAgc3RhcnQgW2xhYmVsPSJzdGFydC9lbmQiXQorCisgICAgdHJhY3RvciBbbGFiZWwgPSAiY29udGVudEFycmF5WzBdIl0KKyAgICB0cmFjdG8gW2xhYmVsID0gIjB4MDFCIl0KKyAgICB0cmFjdCBbbGFiZWwgPSAiMHgwMUEiXQorICAgIHRyYWMgW2xhYmVsID0gIjB4MDE5Il0KKyAgICB0cmEgW2xhYmVsID0gIkNoYWluXG4weDAxOCJdCisKKyAgICB0cmVlIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMV0iXQorICAgIHRyZSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDNCIl0KKyAgICB0cmllIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMl0iXQorICAgIHRyaSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDVCIl0KKworICAgIHRyIFtsYWJlbCA9ICJTcGFyc2VcbjB4MDdFIl0KKworICAgIHQgW2xhYmVsID0gIjB4MDlCIl0KKyAgICByb290IFtsYWJlbCA9ICJDaGFpblxuMHg5QSJdCisKKyAgICBzdWJncmFwaCBwYXRoIHsKKyAgICAgICAgZWRnZSBbY29sb3IgPSAibGlnaHRibHVlIjsgZm9udGNvbG9yPSJibHVlIjsgYXJyb3doZWFkPSJ2ZWUiXQorCisgICAgICAgIHN0YXJ0IC0+IHJvb3QKKyAgICAgICAgcm9vdCAtPiB0IFtsYWJlbCA9ICIgdCJdCisgICAgICAgIHQgLT4gdHIgW2xhYmVsID0gIiByIl0KKyAgICAgICAgdHIgLT4gdHJhIFtsYWJlbCA9ICIgYSJdCisgICAgICAgIHRyYSAtPiB0cmFjIFtsYWJlbCA9ICIgYyJdCisgICAgICAgIHRyYWMgLT4gdHJhY3QgW2xhYmVsID0gIiB0Il0KKyAgICAgICAgdHJhY3QgLT4gdHJhY3RvIFtsYWJlbCA9ICIgbyJdCisgICAgICAgIHRyYWN0byAtPiB0cmFjdG9yIFtsYWJlbCA9ICIgciJdCisKKyAgICAgICAgdHIgLT4gdHJlIFtsYWJlbCA9ICIgZSJdCisgICAgICAgIHRyZSAtPiB0cmVlIFtsYWJlbCA9ICIgZSJdCisKKyAgICAgICAgdHIgLT4gdHJpIFtsYWJlbCA9ICIgaSJdCisgICAgICAgIHRyaSAtPiB0cmllIFtsYWJlbCA9ICIgZSJdCisKKyAgICAgICAgLy8ge3Jhbms9c2FtZSB0cmEgLT4gdHJlIC0+IHRyaSBbc3R5bGU9aW52aXNdfQorICAgICAgICB7cmFuaz1zYW1lIHRyYWMgLT4gdHJlZSAtPiB0cmllIFtzdHlsZT1pbnZpc119CisgICAgfQorCisgICAgc3ViZ3JhcGggYmFjayB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gInBpbmsiOyBmb250Y29sb3I9ImJsdWUiOyBjb25zdHJhaW50PSJmYWxzZSI7IGFycm93aGVhZD0idmVlIl0KKyAgICAgICAgdHJhY3RvciAtPiB0cgorICAgICAgICB0cmVlIC0+IHRyCisgICAgICAgIHRyaWUgLT4gc3RhcnQKKyAgICB9Cit9CisgLS0+Cis8IS0tIFRpdGxlOiBHIFBhZ2VzOiAxIC0tPgorPHN2ZyB3aWR0aD0iNDgwcHQiIGhlaWdodD0iNzM0cHQiCisgICAgIHZpZXdCb3g9IjAuMDAgMC4wMCA0ODAuNDcgNzM0LjA5IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj4KKyAgICA8ZyBpZD0iZ3JhcGgwIiBjbGFzcz0iZ3JhcGgiIHRyYW5zZm9ybT0ic2NhbGUoMSAxKSByb3RhdGUoMCkgdHJhbnNsYXRlKDQgNzMwLjA5MzkpIj4KKyAgICAgICAgPHRpdGxlPkc8L3RpdGxlPgorICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZmZmZmIiBzdHJva2U9InRyYW5zcGFyZW50IiBwb2ludHM9Ii00LDQgLTQsLTczMC4wOTM5IDQ3Ni40NzM4LC03MzAuMDkzOSA0NzYuNDczOCw0IC00LDQiLz4KKyAgICAgICAgPCEtLSByb290IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIxNy4yMzY5IiBjeT0iLTY5Ni42NzgyIiByeD0iMzQuOTIxMyIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItNzAwLjg3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTY4NC4wNzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4OUE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSBzdGFydCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+c3RhcnQ8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzMyLjIzNjkiIGN5PSItNjk2LjY3ODIiIHJ4PSI0NC4wNzc1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMzMi4yMzY5IiB5PSItNjkyLjQ3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+c3RhcnQvZW5kPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3N0YXJ0IC0tPgorICAgICAgICA8IS0tIHQgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTMiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIxNy4yMzY5IiBjeT0iLTU5Ni40NjI2IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTU5Mi4yNjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDlCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3QmIzQ1OyZndDt0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIxNy4yMzY5LC02NjcuMTUyMkMyMTcuMjM2OSwtNjUzLjY2NzEgMjE3LjIzNjksLTYzNy43NzQ5IDIxNy4yMzY5LC02MjQuNDc3OSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIxNy4yMzY5LC02MTQuNDY1OSAyMjEuNzM3LC02MjQuNDY1OSAyMTcuMjM2OSwtNjE5LjQ2NTkgMjE3LjIzNywtNjI0LjQ2NTkgMjE3LjIzNywtNjI0LjQ2NTkgMjE3LjIzNywtNjI0LjQ2NTkgMjE3LjIzNjksLTYxOS40NjU5IDIxMi43MzcsLTYyNC40NjU5IDIxNy4yMzY5LC02MTQuNDY1OSAyMTcuMjM2OSwtNjE0LjQ2NTkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMC45MzIyIiB5PSItNjM2LjY2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSBzdGFydCYjNDU7Jmd0O3Jvb3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnN0YXJ0JiM0NTsmZ3Q7cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0zMDcuNDM1MSwtNzExLjYwNTZDMjkwLjQzOCwtNzE5LjAyMjcgMjczLjQ0MDksLTcyMC42NTY1IDI1Ni40NDM4LC03MTYuNTA3Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjQ2LjQzNjEsLTcxMy4zOTU1IDI1Ny4zMjEzLC03MTIuMDY3NCAyNTEuMjEwNywtNzE0Ljg4IDI1NS45ODUyLC03MTYuMzY0NSAyNTUuOTg1MiwtNzE2LjM2NDUgMjU1Ljk4NTIsLTcxNi4zNjQ1IDI1MS4yMTA3LC03MTQuODggMjU0LjY0OTIsLTcyMC42NjE2IDI0Ni40MzYxLC03MTMuMzk1NSAyNDYuNDM2MSwtNzEzLjM5NTUiLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xOCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTEzLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzBdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHIgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cjwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii00OTYuMjQ2OSIgcng9IjM3LjkwMjciIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTUwMC40NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPlNwYXJzZTwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItNDgzLjY0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwN0U8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG9yJiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG9yJiM0NTsmZ3Q7dHI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNNTcuNTEzNSwtMzUuNzQyOEM0Ni42NTcxLC00OS4yNDIzIDMzLjE1MDcsLTY4Ljg0MzEgMjcuMjM2OSwtODguOCAyNi4yNDI5LC05Mi4xNTQ0IDI0LjYxMzgsLTI3Ny40NjExIDI5LjIzNjksLTMwMi40IDMyLjkxNDMsLTMyMi4yMzc2IDU2LjYzNywtNDIwLjk1MzcgOTAuMjM2OSwtNDQ4LjgzMTMgMTEzLjI2MjYsLTQ2Ny45MzU1IDE0NC43Mzc0LC00NzkuNzU4NSAxNzAuNTkyLC00ODYuODIwNyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmYzBjYiIgc3Ryb2tlPSIjZmZjMGNiIiBwb2ludHM9IjE4MC41NTgsLTQ4OS4zODc0IDE2OS43NTE3LC00OTEuMjUxMSAxNzUuNzE2LC00ODguMTQwMyAxNzAuODc0LC00ODYuODkzMyAxNzAuODc0LC00ODYuODkzMyAxNzAuODc0LC00ODYuODkzMyAxNzUuNzE2LC00ODguMTQwMyAxNzEuOTk2MywtNDgyLjUzNTUgMTgwLjU1OCwtNDg5LjM4NzQgMTgwLjU1OCwtNDg5LjM4NzQiLz4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU0IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMTA2LjgiIHJ4PSIzNi41ODI0IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0xMDIuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byYjNDU7Jmd0O3RyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0byYjNDU7Jmd0O3RyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNNzMuMjM2OSwtODguNDAwNkM3My4yMzY5LC03Ni4yOTQ5IDczLjIzNjksLTYwLjIwNzYgNzMuMjM2OSwtNDYuNDY3NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjczLjIzNjksLTM2LjA3MiA3Ny43MzcsLTQ2LjA3MiA3My4yMzY5LC00MS4wNzIgNzMuMjM3LC00Ni4wNzIgNzMuMjM3LC00Ni4wNzIgNzMuMjM3LC00Ni4wNzIgNzMuMjM2OSwtNDEuMDcyIDY4LjczNywtNDYuMDcyMSA3My4yMzY5LC0zNi4wNzIgNzMuMjM2OSwtMzYuMDcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3Ny4zMTcyIiB5PSItNTguMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTUiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI3My4yMzY5IiBjeT0iLTE5NS42IiByeD0iMzcuMTQ0MyIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3My4yMzY5IiB5PSItMTkxLjQiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMUE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdCYjNDU7Jmd0O3RyYWN0byAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3QmIzQ1OyZndDt0cmFjdG88L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNNzMuMjM2OSwtMTc3LjIwMDZDNzMuMjM2OSwtMTY1LjA5NDkgNzMuMjM2OSwtMTQ5LjAwNzYgNzMuMjM2OSwtMTM1LjI2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSI3My4yMzY5LC0xMjQuODcyIDc3LjczNywtMTM0Ljg3MiA3My4yMzY5LC0xMjkuODcyIDczLjIzNywtMTM0Ljg3MiA3My4yMzcsLTEzNC44NzIgNzMuMjM3LC0xMzQuODcyIDczLjIzNjksLTEyOS44NzIgNjguNzM3LC0xMzQuODcyMSA3My4yMzY5LC0xMjQuODcyIDczLjIzNjksLTEyNC44NzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc4LjQ4NjkiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IG88L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTYiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjczLjIzNjkiIGN5PSItMjg0LjQiIHJ4PSIzNS4zNTg3IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjczLjIzNjkiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxOTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmFjdCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U3IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhYyYjNDU7Jmd0O3RyYWN0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTczLjIzNjksLTI2Ni4wMDA2QzczLjIzNjksLTI1My44OTQ5IDczLjIzNjksLTIzNy44MDc2IDczLjIzNjksLTIyNC4wNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iNzMuMjM2OSwtMjEzLjY3MiA3Ny43MzcsLTIyMy42NzIgNzMuMjM2OSwtMjE4LjY3MiA3My4yMzcsLTIyMy42NzIgNzMuMjM3LC0yMjMuNjcyIDczLjIzNywtMjIzLjY3MiA3My4yMzY5LC0yMTguNjcyIDY4LjczNywtMjIzLjY3MjEgNzMuMjM2OSwtMjEzLjY3MiA3My4yMzY5LC0yMTMuNjcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI3Ni45MzIyIiB5PSItMjM1LjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTgiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmVlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIxNy4yMzY5IiBjeT0iLTI4NC40IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsxXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8IS0tIHRyYSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU3IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjEyNC4yMzY5IiBjeT0iLTM4NC42MTU2IiByeD0iMzYuMTI1IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTI0LjIzNjkiIHk9Ii0zODguODE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjEyNC4yMzY5IiB5PSItMzcyLjAxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMTg8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmFjIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEmIzQ1OyZndDt0cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTExMC4zMDA5LC0zNTcuMjMxM0MxMDMuMDE2MywtMzQyLjkxNjkgOTQuMTM0MiwtMzI1LjQ2MzUgODYuODkxNCwtMzExLjIzMTMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSI4Mi4xNzg4LC0zMDEuOTcwOSA5MC43MjQ5LC0zMDguODQyMiA4NC40NDY1LC0zMDYuNDI3MSA4Ni43MTQzLC0zMTAuODgzMiA4Ni43MTQzLC0zMTAuODgzMiA4Ni43MTQzLC0zMTAuODgzMiA4NC40NDY1LC0zMDYuNDI3MSA4Mi43MDM4LC0zMTIuOTI0MiA4Mi4xNzg4LC0zMDEuOTcwOSA4Mi4xNzg4LC0zMDEuOTcwOSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTA0LjA5NDIiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gYzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaWUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTAiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM5OS4yMzY5IiBjeT0iLTI4NC40IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzOTkuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVsyXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8IS0tIHRyZWUmIzQ1OyZndDt0ciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWUmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNmZmMwY2IiIGQ9Ik0xNTguMzMyNywtMjk1LjE5NDJDMTI5LjczNDIsLTMwMS41NDY2IDk5LjM4NTgsLTMxMC4zMDgzIDg5LjIzNjksLTMyMC40IDc3LjgyNTYsLTMzMS43NDcgODEuNDgxLC0zMzkuMjY0NyA3OS4yMzY5LC0zNTUuMiA3NS41OTA2LC0zODEuMDkxNyA2Ni4zMTg3LC0zOTEuMjk4MSA3OS4yMzY5LC00MTQuMDMxMyA5OC45NjU1LC00NDguNzQ5NCAxMzkuNzk3NCwtNDcwLjM1MDggMTcxLjk1MzMsLTQ4Mi42NDcyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjZmZjMGNiIiBzdHJva2U9IiNmZmMwY2IiIHBvaW50cz0iMTgxLjYyMTIsLTQ4Ni4xNjg4IDE3MC42ODQ5LC00ODYuOTc0NCAxNzYuOTIzMiwtNDg0LjQ1NzQgMTcyLjIyNTEsLTQ4Mi43NDYxIDE3Mi4yMjUxLC00ODIuNzQ2MSAxNzIuMjI1MSwtNDgyLjc0NjEgMTc2LjkyMzIsLTQ4NC40NTc0IDE3My43NjUzLC00NzguNTE3OSAxODEuNjIxMiwtNDg2LjE2ODggMTgxLjYyMTIsLTQ4Ni4xNjg4Ii8+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlOSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii0zODQuNjE1NiIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTM4OC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii0zNzIuMDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAzQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZSYjNDU7Jmd0O3RyZWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmUmIzQ1OyZndDt0cmVlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIxNy4yMzY5LC0zNTUuMDg5N0MyMTcuMjM2OSwtMzQxLjYwNDYgMjE3LjIzNjksLTMyNS43MTIzIDIxNy4yMzY5LC0zMTIuNDE1MyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIxNy4yMzY5LC0zMDIuNDAzMyAyMjEuNzM3LC0zMTIuNDAzMyAyMTcuMjM2OSwtMzA3LjQwMzMgMjE3LjIzNywtMzEyLjQwMzMgMjE3LjIzNywtMzEyLjQwMzMgMjE3LjIzNywtMzEyLjQwMzMgMjE3LjIzNjksLTMwNy40MDMzIDIxMi43MzcsLTMxMi40MDM0IDIxNy4yMzY5LC0zMDIuNDAzMyAyMTcuMjM2OSwtMzAyLjQwMzMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMi4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmllJiM0NTsmZ3Q7c3RhcnQgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmllJiM0NTsmZ3Q7c3RhcnQ8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjZmZjMGNiIiBkPSJNMzk4LjUzNzgsLTMwMi41MDk3QzM5Ny40MDkyLC0zMjcuNjM3OSAzOTQuNzMyNiwtMzc0LjQ1ODEgMzg5LjIzNjksLTQxNC4wMzEzIDM3Ni4xNTQ4LC01MDguMjMxNiAzNTEuMDk2NSwtNjE4LjI4NDggMzM5LjA0MzEsLTY2OC43NzkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmMwY2IiIHN0cm9rZT0iI2ZmYzBjYiIgcG9pbnRzPSIzMzYuNjc3NCwtNjc4LjYyMjcgMzM0LjYzODgsLTY2Ny44NDggMzM3Ljg0NTgsLTY3My43NjEyIDMzOS4wMTQyLC02NjguODk5NiAzMzkuMDE0MiwtNjY4Ljg5OTYgMzM5LjAxNDIsLTY2OC44OTk2IDMzNy44NDU4LC02NzMuNzYxMiAzNDMuMzg5NiwtNjY5Ljk1MTEgMzM2LjY3NzQsLTY3OC42MjI3IDMzNi42Nzc0LC02NzguNjIyNyIvPgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTExIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM0Mi4yMzY5IiBjeT0iLTM4NC42MTU2IiByeD0iMzcuOTMwNiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM0Mi4yMzY5IiB5PSItMzg4LjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNDIuMjM2OSIgeT0iLTM3Mi4wMTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDVCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpJiM0NTsmZ3Q7dHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyaSYjNDU7Jmd0O3RyaWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMzUxLjE2NzcsLTM1NS43OTRDMzU1LjMyMTcsLTM0NC4zNTE3IDM2MC44MzU5LC0zMzEuMzM4NyAzNjcuNTIyMywtMzIwLjQgMzY5LjcyMTUsLTMxNi44MDIyIDM3Mi4yOTExLC0zMTMuMjE5NCAzNzQuOTk4NywtMzA5Ljc4NjYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIzODEuNDU3MywtMzAyLjExMTkgMzc4LjQ2MTUsLTMxMi42NjA3IDM3OC4yMzc5LC0zMDUuOTM3NSAzNzUuMDE4NCwtMzA5Ljc2MzIgMzc1LjAxODQsLTMwOS43NjMyIDM3NS4wMTg0LC0zMDkuNzYzMiAzNzguMjM3OSwtMzA1LjkzNzUgMzcxLjU3NTQsLTMwNi44NjU3IDM4MS40NTczLC0zMDIuMTExOSAzODEuNDU3MywtMzAyLjExMTkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM3Mi4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyYSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U1IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmE8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMTk2LjU5NzIsLTQ3MS40NzIzQzE4My4yMzI0LC00NTUuNDMgMTY1LjY4ODUsLTQzNC4zNzE1IDE1MS4yMjI3LC00MTcuMDA3NyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjE0NC44MTg5LC00MDkuMzIxIDE1NC42NzcxLC00MTQuMTIzNyAxNDguMDE5MywtNDEzLjE2MjUgMTUxLjIxOTcsLTQxNy4wMDQxIDE1MS4yMTk3LC00MTcuMDA0MSAxNTEuMjE5NywtNDE3LjAwNDEgMTQ4LjAxOTMsLTQxMy4xNjI1IDE0Ny43NjIzLC00MTkuODg0NSAxNDQuODE4OSwtNDA5LjMyMSAxNDQuODE4OSwtNDA5LjMyMSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTgyLjA5NDIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gYTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjE3LjIzNjksLTQ2Ni42MjQ5QzIxNy4yMzY5LC00NTMuNzU2OCAyMTcuMjM2OSwtNDM4LjQ4NjcgMjE3LjIzNjksLTQyNC42MzE5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjE3LjIzNjksLTQxNC4zNzYxIDIyMS43MzcsLTQyNC4zNzYxIDIxNy4yMzY5LC00MTkuMzc2MSAyMTcuMjM3LC00MjQuMzc2MSAyMTcuMjM3LC00MjQuMzc2MSAyMTcuMjM3LC00MjQuMzc2MSAyMTcuMjM2OSwtNDE5LjM3NjEgMjEyLjczNywtNDI0LjM3NjIgMjE3LjIzNjksLTQxNC4zNzYxIDIxNy4yMzY5LC00MTQuMzc2MSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjIyLjA5NDIiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJpIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmk8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjQxLjA3OTQsLTQ3My4zNDM3QzI1NC4xNDM5LC00NjAuOTQzNyAyNzAuNzEzOSwtNDQ1LjQ1NzkgMjg1Ljg0NjMsLTQzMi4wMzEzIDI5My4wMTMxLC00MjUuNjcyMyAzMDAuODEzOCwtNDE4Ljk3NTEgMzA4LjI2MzksLTQxMi42ODIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIzMTYuMTYzOCwtNDA2LjA0NzEgMzExLjQwMDQsLTQxNS45MjQ0IDMxMi4zMzUsLTQwOS4yNjI4IDMwOC41MDYyLC00MTIuNDc4NSAzMDguNTA2MiwtNDEyLjQ3ODUgMzA4LjUwNjIsLTQxMi40Nzg1IDMxMi4zMzUsLTQwOS4yNjI4IDMwNS42MTIxLC00MDkuMDMyNiAzMTYuMTYzOCwtNDA2LjA0NzEgMzE2LjE2MzgsLTQwNi4wNDcxIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyODguOTMyMiIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiBpPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdCYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50JiM0NTsmZ3Q7dHI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjE3LjIzNjksLTU3OC4wODE1QzIxNy4yMzY5LC01NjYuMzUwMiAyMTcuMjM2OSwtNTUwLjY3NzQgMjE3LjIzNjksLTUzNi4xODg1Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjE3LjIzNjksLTUyNS45MjA5IDIyMS43MzcsLTUzNS45MjA4IDIxNy4yMzY5LC01MzAuOTIwOSAyMTcuMjM3LC01MzUuOTIwOSAyMTcuMjM3LC01MzUuOTIwOSAyMTcuMjM3LC01MzUuOTIwOSAyMTcuMjM2OSwtNTMwLjkyMDkgMjEyLjczNywtNTM1LjkyMDkgMjE3LjIzNjksLTUyNS45MjA5IDIxNy4yMzY5LC01MjUuOTIwOSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjIxLjMxNzIiIHk9Ii01NDcuODYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgIDwvZz4KKzwvc3ZnPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC53YzEuc3ZnIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllLm1kLndjMS5zdmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1OTVmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC53YzEuc3ZnCkBAIC0wLDAgKzEsMzQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhLS0KKyAgLSBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgIC0gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgIC0gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAgLSByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgIC0gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICAtICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAgLSB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIC0KKyAgLSAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIC0KKyAgLSBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIC0gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgLSBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgLSBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIC0gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgIC0tPgorCis8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iCisgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgorPCEtLSBHZW5lcmF0ZWQgYnkgZ3JhcGh2aXogdmVyc2lvbiAyLjQwLjEgKDIwMTYxMjI1LjAzMDQpCitkaWdyYXBoIEcgeworICAgIHsgcmFuaz1zYW1lIHJvb3QgLT4gc3RhcnQgW3N0eWxlPWludmlzXSB9CisgICAgc3RhcnQgW2xhYmVsPSJzdGFydC9lbmQiXQorCisgICAgdHJhY3RvciBbbGFiZWwgPSAiY29udGVudEFycmF5WzBdIl0KKyAgICB0cmFjdG8gW2xhYmVsID0gIjB4MDFCIl0KKyAgICB0cmFjdCBbbGFiZWwgPSAiMHgwMUEiXQorICAgIHRyYWMgW2xhYmVsID0gIjB4MDE5Il0KKyAgICB0cmEgW2xhYmVsID0gIkNoYWluXG4weDAxOCJdCisKKyAgICB0cmVlIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMV0iXQorICAgIHRyZSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDNCIl0KKyAgICB0cmllIFtsYWJlbCA9ICJjb250ZW50QXJyYXlbMl0iXQorICAgIHRyaSBbbGFiZWwgPSAiQ2hhaW5cbjB4MDVCIl0KKworICAgIHRyIFtsYWJlbCA9ICJTcGFyc2VcbjB4MDdFIl0KKworICAgIHQgW2xhYmVsID0gIjB4MDlCIl0KKyAgICByb290IFtsYWJlbCA9ICJDaGFpblxuMHg5QSJdCisKKyAgICByb290IC0+IHQgW2xhYmVsID0gIiB0Il0KKyAgICB0IC0+IHRyIFtsYWJlbCA9ICIgciJdCisgICAgdHIgLT4gdHJhIFtsYWJlbCA9ICIgYSJdCisgICAgdHJhIC0+IHRyYWMgW2xhYmVsID0gIiBjIl0KKyAgICB0cmFjIC0+IHRyYWN0IFtsYWJlbCA9ICIgdCJdCisgICAgdHJhY3QgLT4gdHJhY3RvIFtsYWJlbCA9ICIgbyJdCisgICAgdHJhY3RvIC0+IHRyYWN0b3IgW2xhYmVsID0gIiByIl0KKworICAgIHRyIC0+IHRyZSBbbGFiZWwgPSAiIGUiXQorICAgIHRyZSAtPiB0cmVlIFtsYWJlbCA9ICIgZSJdCisKKyAgICB0ciAtPiB0cmkgW2xhYmVsID0gIiBpIl0KKyAgICB0cmkgLT4gdHJpZSBbbGFiZWwgPSAiIGUiXQorCisgICAgLy8ge3Jhbms9c2FtZSB0cmEgLT4gdHJlIC0+IHRyaSBbc3R5bGU9aW52aXNdfQorICAgIHtyYW5rPXNhbWUgdHJhYyAtPiB0cmVlIC0+IHRyaWUgW3N0eWxlPWludmlzXX0KKworICAgc3ViZ3JhcGggcGF0aCB7CisgICAgICAgIGVkZ2UgW2NvbG9yID0gImxpZ2h0Ymx1ZSI7IGZvbnRjb2xvcj0iYmx1ZSI7IGFycm93aGVhZD0idmVlIjsgY29uc3RyYWludD0iZmFsc2UiXQorCisgICAgICAgIHN0YXJ0IC0+IHJvb3QgW2xhYmVsID0gIiAwLCAtMSJdCisKKyAgICAgICAgcm9vdCAtPiB0IFtsYWJlbCA9ICIgMSwgdCJdCisgICAgICAgIHQgLT4gdHIgW2xhYmVsID0gIiAyLCByIl0KKyAgICAgICAgdHIgLT4gdHJhIFtsYWJlbCA9ICIgMywgYSJdCisgICAgICAgIHRyYSAtPiB0cmFjIFtsYWJlbCA9ICIgNCwgYyJdCisgICAgICAgIHRyYWMgLT4gdHJhY3QgW2xhYmVsID0gIiA1LCB0Il0KKyAgICAgICAgdHJhY3QgLT4gdHJhY3RvIFtsYWJlbCA9ICIgNiwgbyJdCisgICAgICAgIHRyYWN0byAtPiB0cmFjdG9yIFtsYWJlbCA9ICIgNywgciJdCisKKyAgICAgICAgdHJhY3RvciAtPiB0cmUgW2xhYmVsID0gIiAzLCBlIl0KKworICAgICAgICAvLyB0ciAtPiB0cmUgW2xhYmVsID0gIiBlIl0KKyAgICAgICAgdHJlIC0+IHRyZWUgW2xhYmVsID0gIiA0LCBlIl0KKworICAgICAgICB0cmVlIC0+IHRyaSBbbGFiZWwgPSAiMywgaSI7IF0KKworICAgICAgICAvLyB0ciAtPiB0cmkgW2xhYmVsID0gIiBpIl0KKyAgICAgICAgdHJpIC0+IHRyaWUgW2xhYmVsID0gIiA0LCBlIl0KKworICAgICAgICB0cmllIC0+IHN0YXJ0IFtsYWJlbCA9ICItMSwgLTEiXQorICAgIH0KK30KKworIC0tPgorPCEtLSBUaXRsZTogRyBQYWdlczogMSAtLT4KKzxzdmcgd2lkdGg9IjQ5NnB0IiBoZWlnaHQ9IjczNHB0IgorICAgICB2aWV3Qm94PSIwLjAwIDAuMDAgNDk2LjQ3IDczNC4wOSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CisgICAgPGcgaWQ9ImdyYXBoMCIgY2xhc3M9ImdyYXBoIiB0cmFuc2Zvcm09InNjYWxlKDEgMSkgcm90YXRlKDApIHRyYW5zbGF0ZSg0IDczMC4wOTM5KSI+CisgICAgICAgIDx0aXRsZT5HPC90aXRsZT4KKyAgICAgICAgPHBvbHlnb24gZmlsbD0iI2ZmZmZmZiIgc3Ryb2tlPSJ0cmFuc3BhcmVudCIgcG9pbnRzPSItNCw0IC00LC03MzAuMDkzOSA0OTIuNDY3MywtNzMwLjA5MzkgNDkyLjQ2NzMsNCAtNCw0Ii8+CisgICAgICAgIDwhLS0gcm9vdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii02OTYuNjc4MiIgcng9IjM0LjkyMTMiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMTcuMjM2OSIgeT0iLTcwMC44NzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii02ODQuMDc4MiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDlBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gc3RhcnQgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnN0YXJ0PC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjM0My4yMzY5IiBjeT0iLTY5Ni42NzgyIiByeD0iNDQuMDc3NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNDMuMjM2OSIgeT0iLTY5Mi40NzgyIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPnN0YXJ0L2VuZDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDtzdGFydCAtLT4KKyAgICAgICAgPCEtLSB0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMTcuMjM2OSIgY3k9Ii01OTYuNDYyNiIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii01OTIuMjYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA5QjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHJvb3QmIzQ1OyZndDt0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5yb290JiM0NTsmZ3Q7dDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMTcuMjM2OSwtNjY3LjE1MjJDMjE3LjIzNjksLTY1My42NjcxIDIxNy4yMzY5LC02MzcuNzc0OSAyMTcuMjM2OSwtNjI0LjQ3NzkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyMjAuNzM3LC02MjQuNDY1OSAyMTcuMjM2OSwtNjE0LjQ2NTkgMjEzLjczNywtNjI0LjQ2NTkgMjIwLjczNywtNjI0LjQ2NTkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMC45MzIyIiB5PSItNjM2LjY2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7dCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3QmIzQ1OyZndDt0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIyNi4xMDM2LC02NjcuOTUwNUMyMjguNDg1MSwtNjU2Ljg3NjQgMjI5Ljk3NDcsLTY0NC4wOTY5IDIyOC4yMzY5LC02MzIuNDYyNiAyMjcuODM0NCwtNjI5Ljc2ODEgMjI3LjI3MTMsLTYyNi45OTY1IDIyNi42MTA2LC02MjQuMjQ0NCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjIyMy45MDI0LC02MTQuNTM0OCAyMzAuOTIzNywtNjIyLjk1ODEgMjI1LjI0NTgsLTYxOS4zNTEgMjI2LjU4OTEsLTYyNC4xNjcyIDIyNi41ODkxLC02MjQuMTY3MiAyMjYuNTg5MSwtNjI0LjE2NzIgMjI1LjI0NTgsLTYxOS4zNTEgMjIyLjI1NDYsLTYyNS4zNzYyIDIyMy45MDI0LC02MTQuNTM0OCAyMjMuOTAyNCwtNjE0LjUzNDgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIzOS45MzIyIiB5PSItNjM2LjY2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IDEsIHQ8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSBzdGFydCYjNDU7Jmd0O3Jvb3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT5zdGFydCYjNDU7Jmd0O3Jvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjk4Ljg3MjIsLTY5Ni42NzgyQzI4Ny4wNzA3LC02OTYuNjc4MiAyNzQuMzEwNiwtNjk2LjY3ODIgMjYyLjQ2MzcsLTY5Ni42NzgyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjUyLjMzNDksLTY5Ni42NzgyIDI2Mi4zMzUsLTY5Mi4xNzgzIDI1Ny4zMzQ5LC02OTYuNjc4MyAyNjIuMzM0OSwtNjk2LjY3ODMgMjYyLjMzNDksLTY5Ni42NzgzIDI2Mi4zMzQ5LC02OTYuNjc4MyAyNTcuMzM0OSwtNjk2LjY3ODMgMjYyLjMzNDksLTcwMS4xNzgzIDI1Mi4zMzQ5LC02OTYuNjc4MiAyNTIuMzM0OSwtNjk2LjY3ODIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI3NS41NzMxIiB5PSItNzAzLjg3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IDAsICYjNDU7MTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xOCIgcng9IjczLjQ3NDUiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTEzLjgiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzBdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTkiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE3LjIzNjkiIGN5PSItMzg0LjYxNTYiIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii0zODguODE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItMzcyLjAxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwM0I8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG9yJiM0NTsmZ3Q7dHJlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIzIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvciYjNDU7Jmd0O3RyZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xMjMuNzgyLC0zMS4yMDMzQzIxNC43MTc5LC01OC4wMDUyIDQwMy42NDI1LC0xMjguMzE0NyA0ODEuMjM2OSwtMjY2LjQgNDg5LjA3NSwtMjgwLjM0ODYgNDkyLjE2NDksLTI5MC43MTM0IDQ4MS4yMzY5LC0zMDIuNCA0NDAuNDY4NiwtMzQ1Ljk5ODMgMjU0LjAwNTIsLTI3Ni44MDE3IDIxMy4yMzY5LC0zMjAuNCAyMDYuNzkzNywtMzI3LjI5MDQgMjA1LjAzNywtMzM2LjYyMzIgMjA1LjU3NTksLTM0Ni4wMzcxIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjA2Ljk0ODUsLTM1Ni4xNzIyIDIwMS4xNDcxLC0zNDYuODY2NiAyMDYuMjc3NSwtMzUxLjIxNzQgMjA1LjYwNjQsLTM0Ni4yNjI3IDIwNS42MDY0LC0zNDYuMjYyNyAyMDUuNjA2NCwtMzQ2LjI2MjcgMjA2LjI3NzUsLTM1MS4yMTc0IDIxMC4wNjU3LC0zNDUuNjU4NyAyMDYuOTQ4NSwtMzU2LjE3MjIgMjA2Ljk0ODUsLTM1Ni4xNzIyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NTMuMDk0MiIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiAzLCBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTQiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG88L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xMDYuOCIgcng9IjM2LjU4MjQiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTEwMi42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDFCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvJiM0NTsmZ3Q7dHJhY3RvciAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U4IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvJiM0NTsmZ3Q7dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik03My4yMzY5LC04OC40MDA2QzczLjIzNjksLTc2LjI5NDkgNzMuMjM2OSwtNjAuMjA3NiA3My4yMzY5LC00Ni40Njc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNzYuNzM3LC00Ni4wNzIgNzMuMjM2OSwtMzYuMDcyIDY5LjczNywtNDYuMDcyMSA3Ni43MzcsLTQ2LjA3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzcuMzE3MiIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdG8mIzQ1OyZndDt0cmFjdG9yIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3RvJiM0NTsmZ3Q7dHJhY3RvcjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik03OC42OTM3LC04OC42NDkxQzgwLjE0NjcsLTgyLjk4NjQgODEuNTEyNywtNzYuNjgyNiA4Mi4yMzY5LC03MC44IDgzLjE0OTIsLTYzLjM4OTMgODMuMTQ5MiwtNjEuNDEwNyA4Mi4yMzY5LC01NCA4MS45MjAxLC01MS40MjY0IDgxLjQ4MDQsLTQ4Ljc3MjEgODAuOTY0MywtNDYuMTI2MiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9Ijc4LjY5MzcsLTM2LjE1MDkgODUuMzAxLC00NC45MDI3IDc5LjgwMzUsLTQxLjAyNjIgODAuOTEzMiwtNDUuOTAxNSA4MC45MTMyLC00NS45MDE1IDgwLjkxMzIsLTQ1LjkwMTUgNzkuODAzNSwtNDEuMDI2MiA3Ni41MjU1LC00Ni45MDAzIDc4LjY5MzcsLTM2LjE1MDkgNzguNjkzNywtMzYuMTUwOSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTQuMzE3MiIgeT0iLTU4LjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IDcsIHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdCAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU1IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0xOTUuNiIgcng9IjM3LjE0NDMiIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDFBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QmIzQ1OyZndDt0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0JiM0NTsmZ3Q7dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTczLjIzNjksLTE3Ny4yMDA2QzczLjIzNjksLTE2NS4wOTQ5IDczLjIzNjksLTE0OS4wMDc2IDczLjIzNjksLTEzNS4yNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iNzYuNzM3LC0xMzQuODcyIDczLjIzNjksLTEyNC44NzIgNjkuNzM3LC0xMzQuODcyMSA3Ni43MzcsLTEzNC44NzIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijc4LjQ4NjkiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IG88L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjdCYjNDU7Jmd0O3RyYWN0byAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0JiM0NTsmZ3Q7dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTgwLjUwNjEsLTE3Ny41NzI1QzgyLjQ0MzIsLTE3MS45MTQ4IDg0LjI2NiwtMTY1LjU4MjggODUuMjM2OSwtMTU5LjYgODYuNDMyOSwtMTUyLjIyOTcgODYuNDMyOSwtMTUwLjE3MDMgODUuMjM2OSwtMTQyLjggODQuNzcxOSwtMTM5LjkzNDYgODQuMTExNSwtMTM2Ljk4OTEgODMuMzM2NywtMTM0LjA3NTkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSI4MC4zNzk2LC0xMjQuNDU5NSA4Ny42MjAxLC0xMzIuNjk1MSA4MS44NDkyLC0xMjkuMjM4NyA4My4zMTg5LC0xMzQuMDE3OCA4My4zMTg5LC0xMzQuMDE3OCA4My4zMTg5LC0xMzQuMDE3OCA4MS44NDkyLC0xMjkuMjM4NyA3OS4wMTc2LC0xMzUuMzQwNSA4MC4zNzk2LC0xMjQuNDU5NSA4MC4zNzk2LC0xMjQuNDU5NSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTguNDg2OSIgeT0iLTE0NyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gNiwgbzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWMgLS0+CisgICAgICAgIDxnIGlkPSJub2RlNiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWM8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iNzMuMjM2OSIgY3k9Ii0yODQuNCIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzMuMjM2OSIgeT0iLTI4MC4yIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDE5PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyYWN0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTYiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjJiM0NTsmZ3Q7dHJhY3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNNzMuMjM2OSwtMjY2LjAwMDZDNzMuMjM2OSwtMjUzLjg5NDkgNzMuMjM2OSwtMjM3LjgwNzYgNzMuMjM2OSwtMjI0LjA2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI3Ni43MzcsLTIyMy42NzIgNzMuMjM2OSwtMjEzLjY3MiA2OS43MzcsLTIyMy42NzIxIDc2LjczNywtMjIzLjY3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNzYuOTMyMiIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyYWN0IC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhYyYjNDU7Jmd0O3RyYWN0PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTc5Ljc4NjUsLTI2Ni42OTU5QzgxLjYwNTIsLTI2MC45NDM0IDgzLjMyOTQsLTI1NC40NzU3IDg0LjIzNjksLTI0OC40IDg1LjMzOTksLTI0MS4wMTUzIDg1LjMzOTksLTIzOC45ODQ3IDg0LjIzNjksLTIzMS42IDgzLjgzNDQsLTIyOC45MDU1IDgzLjI3MTMsLTIyNi4xMzM5IDgyLjYxMDYsLTIyMy4zODE5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iNzkuOTAyNCwtMjEzLjY3MjIgODYuOTIzNywtMjIyLjA5NTYgODEuMjQ1OCwtMjE4LjQ4ODQgODIuNTg5MSwtMjIzLjMwNDYgODIuNTg5MSwtMjIzLjMwNDYgODIuNTg5MSwtMjIzLjMwNDYgODEuMjQ1OCwtMjE4LjQ4ODQgNzguMjU0NiwtMjI0LjUxMzYgNzkuOTAyNCwtMjEzLjY3MjIgNzkuOTAyNCwtMjEzLjY3MjIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9Ijk1LjkzMjIiIHk9Ii0yMzUuOCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gNSwgdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZWUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlOCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjE3LjIzNjkiIGN5PSItMjg0LjQiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzFdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyZWUgLS0+CisgICAgICAgIDwhLS0gdHJhIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTciIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmE8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMTIzLjIzNjkiIGN5PSItMzg0LjYxNTYiIHJ4PSIzNi4xMjUiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMjMuMjM2OSIgeT0iLTM4OC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTIzLjIzNjkiIHk9Ii0zNzIuMDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxODwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYSYjNDU7Jmd0O3RyYWMgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYSYjNDU7Jmd0O3RyYWM8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMTAyLjc2MzgsLTM2MC4wNzQ4Qzk3LjU4MDcsLTM1My4wMDg4IDkyLjM5MjksLTM0NS4wNzQgODguNTIyMywtMzM3LjIgODQuNzMzNCwtMzI5LjQ5MjIgODEuNzE5MywtMzIwLjY3OCA3OS40MDM2LC0zMTIuNDg4MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjgyLjczMjcsLTMxMS4zODE5IDc2LjgzODEsLTMwMi41NzgzIDc1Ljk1NjEsLTMxMy4xMzY0IDgyLjczMjcsLTMxMS4zODE5Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5NC4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGM8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmFjIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJhJiM0NTsmZ3Q7dHJhYzwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xMTMuODAwOSwtMzU2LjE2MTJDMTA5LjYwNTcsLTM0NC43NzIzIDEwNC4yNTE1LC0zMzEuNzAwMSA5OC4yMzY5LC0zMjAuNCA5Ni4zNTk5LC0zMTYuODczNiA5NC4yMDEzLC0zMTMuMjc5NSA5MS45NTU2LC0zMDkuNzkzOCIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9Ijg2LjMwNDYsLTMwMS40NTI3IDk1LjYzOTEsLTMwNy4yMDc2IDg5LjEwOTEsLTMwNS41OTIyIDkxLjkxMzYsLTMwOS43MzE2IDkxLjkxMzYsLTMwOS43MzE2IDkxLjkxMzYsLTMwOS43MzE2IDg5LjEwOTEsLTMwNS41OTIyIDg4LjE4ODEsLTMxMi4yNTU3IDg2LjMwNDYsLTMwMS40NTI3IDg2LjMwNDYsLTMwMS40NTI3Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxMTguMDk0MiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiA0LCBjPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJpZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMCIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyaWU8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzk5LjIzNjkiIGN5PSItMjg0LjQiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM5OS4yMzY5IiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzJdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDwhLS0gdHJpIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTExIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjMzMy4yMzY5IiBjeT0iLTM4NC42MTU2IiByeD0iMzcuOTMwNiIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMzMy4yMzY5IiB5PSItMzg4LjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzMzMuMjM2OSIgeT0iLTM3Mi4wMTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDVCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSYjNDU7Jmd0O3RyaSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZWUmIzQ1OyZndDt0cmk8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjM4LjMxOTUsLTMwMS44NzZDMjQ1LjMyNCwtMzA3LjcyODYgMjUzLjE0NDEsLTMxNC4zMTI5IDI2MC4yMzY5LC0zMjAuNCAyNzMuNjAyMiwtMzMxLjg3MDMgMjg4LjE5OTksLTM0NC42NTg1IDMwMC44MDUsLTM1NS43ODQ2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMzA4LjM2NzEsLTM2Mi40NzA3IDI5Ny44OTQ3LC0zNTkuMjE4MSAzMDQuNjIxMywtMzU5LjE1ODggMzAwLjg3NTUsLTM1NS44NDY5IDMwMC44NzU1LC0zNTUuODQ2OSAzMDAuODc1NSwtMzU1Ljg0NjkgMzA0LjYyMTMsLTM1OS4xNTg4IDMwMy44NTYyLC0zNTIuNDc1NiAzMDguMzY3MSwtMzYyLjQ3MDcgMzA4LjM2NzEsLTM2Mi40NzA3Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyODguMTgyMiIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPjMsIGk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEwIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlJiM0NTsmZ3Q7dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMTcuMjM2OSwtMzU1LjA4OTdDMjE3LjIzNjksLTM0MS42MDQ2IDIxNy4yMzY5LC0zMjUuNzEyMyAyMTcuMjM2OSwtMzEyLjQxNTMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyMjAuNzM3LC0zMTIuNDAzMyAyMTcuMjM2OSwtMzAyLjQwMzMgMjEzLjczNywtMzEyLjQwMzQgMjIwLjczNywtMzEyLjQwMzMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMi4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmUmIzQ1OyZndDt0cmVlIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTI0IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlJiM0NTsmZ3Q7dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yMjguNDA5LC0zNTYuMjM3NkMyMzEuNDg3NywtMzQ1LjA5NDMgMjMzLjQ0NiwtMzMyLjE3NTUgMjMxLjIzNjksLTMyMC40IDIzMC43MDM3LC0zMTcuNTU3NiAyMjkuOTUyOCwtMzE0LjY1MTMgMjI5LjA3MjcsLTMxMS43ODMyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjI1LjcxMTYsLTMwMi4zMjc5IDIzMy4zMDEyLC0zMTAuMjQzIDIyNy4zODYzLC0zMDcuMDM5MSAyMjkuMDYxMSwtMzExLjc1MDMgMjI5LjA2MTEsLTMxMS43NTAzIDIyOS4wNjExLC0zMTEuNzUwMyAyMjcuMzg2MywtMzA3LjAzOTEgMjI0LjgyMSwtMzEzLjI1NzUgMjI1LjcxMTYsLTMwMi4zMjc5IDIyNS43MTE2LC0zMDIuMzI3OSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjQ0LjA5NDIiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4gNCwgZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaWUmIzQ1OyZndDtzdGFydCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyaWUmIzQ1OyZndDtzdGFydDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik00MDUuMjk4MywtMzAyLjUxMzRDNDA2LjkxMjcsLTMwOC4xNzQ1IDQwOC40MzA5LC0zMTQuNDg3IDQwOS4yMzY5LC0zMjAuNCA0MTAuMjQ1MywtMzI3Ljc5ODMgNDA5LjkxMzgsLTMyOS43NjQxIDQwOS4yMzY5LC0zMzcuMiAzOTcuODY3MywtNDYyLjA4NzIgMzY0LjcxNjksLTYwOC4zOTQgMzUwLjE5MTcsLTY2OC42MTYxIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMzQ3Ljc4NTYsLTY3OC41MDkzIDM0NS43NzYzLC02NjcuNzI5IDM0OC45NjcyLC02NzMuNjUwOSAzNTAuMTQ4OSwtNjY4Ljc5MjUgMzUwLjE0ODksLTY2OC43OTI1IDM1MC4xNDg5LC02NjguNzkyNSAzNDguOTY3MiwtNjczLjY1MDkgMzU0LjUyMTQsLTY2OS44NTYgMzQ3Ljc4NTYsLTY3OC41MDkzIDM0Ny43ODU2LC02NzguNTA5MyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iNDA2LjM5NzUiIHk9Ii00OTIuMDQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4mIzQ1OzEsICYjNDU7MTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTIiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmkmIzQ1OyZndDt0cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTM0My41MzA4LC0zNTYuMjI4M0MzNDguNDA2OCwtMzQ0LjYwMDIgMzU0Ljg1NDIsLTMzMS4zMzUzIDM2Mi41MjIzLC0zMjAuNCAzNjUuMTg5LC0zMTYuNTk3IDM2OC4yODg0LC0zMTIuODUyOCAzNzEuNTM0NCwtMzA5LjMwMDUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzNzQuMjkwOSwtMzExLjQ4NjggMzc4Ljc2MzYsLTMwMS44ODI0IDM2OS4yNzc3LC0zMDYuNjAxMyAzNzQuMjkwOSwtMzExLjQ4NjgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM2Ny4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmkmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTI2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpJiM0NTsmZ3Q7dHJpZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0zNTQuOTMzNiwtMzYwLjI4OThDMzYwLjg3NjYsLTM1My4wOTY5IDM2Ny4wOTI2LC0zNDUuMDQzMSAzNzIuMjM2OSwtMzM3LjIgMzc3LjQ4ODMsLTMyOS4xOTM2IDM4Mi40ODc1LC0zMjAuMDM2MSAzODYuNzI0NywtMzExLjYyMDYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIzOTEuMTU3NywtMzAyLjUzNTMgMzkwLjgxNjcsLTMxMy40OTU5IDM4OC45NjUxLC0zMDcuMDI4OSAzODYuNzcyNSwtMzExLjUyMjUgMzg2Ljc3MjUsLTMxMS41MjI1IDM4Ni43NzI1LC0zMTEuNTIyNSAzODguOTY1MSwtMzA3LjAyODkgMzgyLjcyODIsLTMwOS41NDkyIDM5MS4xNTc3LC0zMDIuNTM1MyAzOTEuMTU3NywtMzAyLjUzNTMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjM5My4wOTQyIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IDQsIGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGUxMiIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIxNy4yMzY5IiBjeT0iLTQ5Ni4yNDY5IiByeD0iMzcuOTAyNyIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIxNy4yMzY5IiB5PSItNTAwLjQ0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+U3BhcnNlPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjE3LjIzNjkiIHk9Ii00ODMuNjQ2OSIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDA3RTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJhIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTQiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyYTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0xODIuNjExNiwtNDg0LjEwMDRDMTY1Ljg4ODksLTQ3Ni40OTYxIDE0Ny4wMDU2LC00NjUuMDE4IDEzNS41MjIzLC00NDguODMxMyAxMzAuNDI0MSwtNDQxLjY0NSAxMjcuMjg4MiwtNDMyLjkxMjUgMTI1LjM5MzIsLTQyNC4yMzIzIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMTI4LjgwOTMsLTQyMy40NDEzIDEyMy42OTU0LC00MTQuMTYyMyAxMjEuOTA2NywtNDI0LjYwNTEgMTI4LjgwOTMsLTQyMy40NDEzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxNDEuMDk0MiIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBhPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmEgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyYTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0xOTYuMzc1MiwtNDcxLjQ3MjNDMTgyLjc3MjksLTQ1NS4zMTg2IDE2NC44ODc3LC00MzQuMDc4OCAxNTAuMjA4NywtNDE2LjY0NjUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIxNDMuNzE2OCwtNDA4LjkzNjkgMTUzLjYwMDIsLTQxMy42ODc3IDE0Ni45Mzc0LC00MTIuNzYxNiAxNTAuMTU4LC00MTYuNTg2MiAxNTAuMTU4LC00MTYuNTg2MiAxNTAuMTU4LC00MTYuNTg2MiAxNDYuOTM3NCwtNDEyLjc2MTYgMTQ2LjcxNTgsLTQxOS40ODQ4IDE0My43MTY4LC00MDguOTM2OSAxNDMuNzE2OCwtNDA4LjkzNjkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE4OC4wOTQyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IDMsIGE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjE3LjIzNjksLTQ2Ni42MjQ5QzIxNy4yMzY5LC00NTMuNzU2OCAyMTcuMjM2OSwtNDM4LjQ4NjcgMjE3LjIzNjksLTQyNC42MzE5Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMjIwLjczNywtNDI0LjM3NjEgMjE3LjIzNjksLTQxNC4zNzYxIDIxMy43MzcsLTQyNC4zNzYyIDIyMC43MzcsLTQyNC4zNzYxIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMjIuMDk0MiIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmkgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTEiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50ciYjNDU7Jmd0O3RyaTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMzQuMDA0OSwtNDY5LjY4NzNDMjQyLjQyNDEsLTQ1Ny40Njc4IDI1My4yODMzLC00NDMuMjMyOCAyNjQuODQ2MywtNDMyLjAzMTMgMjczLjc2NDEsLTQyMy4zOTIyIDI4NC40MDE2LC00MTUuMjEwMSAyOTQuNTk5MSwtNDA4LjE1MTYiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyOTYuNjYzMSwtNDEwLjk4MTUgMzAzLjAxNDMsLTQwMi41MDEzIDI5Mi43NjEsLTQwNS4xNyAyOTYuNjYzMSwtNDEwLjk4MTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI2OC45MzIyIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0JiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnQmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMTcuMjM2OSwtNTc4LjA4MTVDMjE3LjIzNjksLTU2Ni4zNTAyIDIxNy4yMzY5LC01NTAuNjc3NCAyMTcuMjM2OSwtNTM2LjE4ODUiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyMjAuNzM3LC01MzUuOTIwOCAyMTcuMjM2OSwtNTI1LjkyMDkgMjEzLjczNywtNTM1LjkyMDkgMjIwLjczNywtNTM1LjkyMDgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjIyMS4zMTcyIiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0JiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTciIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50JiM0NTsmZ3Q7dHI8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjI0LjM3OTYsLTU3OC44MDNDMjI2LjM2MzUsLTU3My4wNTI5IDIyOC4yNDQ5LC01NjYuNTc1NCAyMjkuMjM2OSwtNTYwLjQ2MjYgMjMwLjU4MDEsLTU1Mi4xODUyIDIzMC4xNDY1LC01NDMuMzMyNSAyMjguODUwMywtNTM0LjkyNzMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMjYuOTAyOSwtNTI0Ljk2NTUgMjMzLjIzNzksLTUzMy45MTY0IDIyNy44NjIyLC01MjkuODcyNiAyMjguODIxNSwtNTM0Ljc3OTggMjI4LjgyMTUsLTUzNC43Nzk4IDIyOC44MjE1LC01MzQuNzc5OCAyMjcuODYyMiwtNTI5Ljg3MjYgMjI0LjQwNTEsLTUzNS42NDMxIDIyNi45MDI5LC01MjQuOTY1NSAyMjYuOTAyOSwtNTI0Ljk2NTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI0MS4zMTcyIiB5PSItNTQ3Ljg2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IDIsIHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICA8L2c+Cis8L3N2Zz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQud2MyLnN2ZyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZS5tZC53YzIuc3ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjM1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWUubWQud2MyLnN2ZwpAQCAtMCwwICsxLDMxNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cis8IS0tCisgIC0gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICAtIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICAtIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIC0gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICAtIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgLSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIC0gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAtCisgIC0gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAtCisgIC0gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAtIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIC0gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIC0gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAtIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIgorICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KKzwhLS0gR2VuZXJhdGVkIGJ5IGdyYXBodml6IHZlcnNpb24gMi40MC4xICgyMDE2MTIyNS4wMzA0KQorZGlncmFwaCBHIHsKKyAgICB7IHJhbms9c2FtZSByb290IC0+IHN0YXJ0IFtzdHlsZT1pbnZpc10gfQorICAgIHN0YXJ0IFtsYWJlbD0ic3RhcnQvZW5kIl0KKworICAgIHRyYWN0b3IgW2xhYmVsID0gImNvbnRlbnRBcnJheVswXSJdCisgICAgdHJhY3RvIFtsYWJlbCA9ICIweDAxQiJdCisgICAgdHJhY3QgW2xhYmVsID0gIjB4MDFBIl0KKyAgICB0cmFjIFtsYWJlbCA9ICIweDAxOSJdCisgICAgdHJhIFtsYWJlbCA9ICJDaGFpblxuMHgwMTgiXQorCisgICAgdHJlZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzFdIl0KKyAgICB0cmUgW2xhYmVsID0gIkNoYWluXG4weDAzQiJdCisgICAgdHJpZSBbbGFiZWwgPSAiY29udGVudEFycmF5WzJdIl0KKyAgICB0cmkgW2xhYmVsID0gIkNoYWluXG4weDA1QiJdCisKKyAgICB0ciBbbGFiZWwgPSAiU3BhcnNlXG4weDA3RSJdCisKKyAgICB0IFtsYWJlbCA9ICIweDA5QiJdCisgICAgcm9vdCBbbGFiZWwgPSAiQ2hhaW5cbjB4OUEiXQorCisgICAgcm9vdCAtPiB0IFtsYWJlbCA9ICIgdCJdCisgICAgdCAtPiB0ciBbbGFiZWwgPSAiIHIiXQorICAgIHRyIC0+IHRyYSBbbGFiZWwgPSAiIGEiXQorICAgIHRyYSAtPiB0cmFjIFtsYWJlbCA9ICIgYyJdCisgICAgdHJhYyAtPiB0cmFjdCBbbGFiZWwgPSAiIHQiXQorICAgIHRyYWN0IC0+IHRyYWN0byBbbGFiZWwgPSAiIG8iXQorICAgIHRyYWN0byAtPiB0cmFjdG9yIFtsYWJlbCA9ICIgciJdCisKKyAgICB0ciAtPiB0cmUgW2xhYmVsID0gIiBlIl0KKyAgICB0cmUgLT4gdHJlZSBbbGFiZWwgPSAiIGUiXQorCisgICAgdHIgLT4gdHJpIFtsYWJlbCA9ICIgaSJdCisgICAgdHJpIC0+IHRyaWUgW2xhYmVsID0gIiBlIl0KKworICAgIC8vIHtyYW5rPXNhbWUgdHJhIC0+IHRyZSAtPiB0cmkgW3N0eWxlPWludmlzXX0KKyAgICB7cmFuaz1zYW1lIHRyYWMgLT4gdHJlZSAtPiB0cmllIFtzdHlsZT1pbnZpc119CisKKyAgICBzdWJncmFwaCBwYXRoIHsKKyAgICAgICAgZWRnZSBbY29sb3IgPSAibGlnaHRibHVlIjsgZm9udGNvbG9yPSJibHVlIjsgYXJyb3doZWFkPSJ2ZWUiOyBjb25zdHJhaW50PSJmYWxzZSJdCisKKyAgICAgICAgc3RhcnQgLT4gcm9vdCBbbGFiZWwgPSAiIDAsIC0xIl0KKworICAgICAgICByb290IC0+IHRyIFtsYWJlbCA9ICJ0LCAyLCByICJdCisgICAgICAgIHRyIC0+IHRyYSBbbGFiZWwgPSAiMywgYSJdCisgICAgICAgIHRyYSAtPiB0cmFjdG9yIFtsYWJlbCA9ICJjdG8sIDcsIHIiXQorCisgICAgICAgIC8vIHRyIC0+IHRyZSBbbGFiZWwgPSAiIGUiXQorICAgICAgICB0cmUgLT4gdHJlZSBbbGFiZWwgPSAiIDQsIGUiXQorCisgICAgICAgIC8vIHRyIC0+IHRyaSBbbGFiZWwgPSAiIGkiXQorICAgICAgICB0cmkgLT4gdHJpZSBbbGFiZWwgPSAiIDQsIGUiXQorCisgICAgICAgIHRyYWN0b3IgLT4gdHJlIFtsYWJlbCA9ICIgMywgZSJdCisgICAgICAgIHRyZWUgLT4gdHJpIFtsYWJlbCA9ICIzLCBpIjsgXQorICAgICAgICB0cmllIC0+IHN0YXJ0IFtsYWJlbCA9ICItMSwgLTEiXQorICAgIH0KK30KKyAtLT4KKzwhLS0gVGl0bGU6IEcgUGFnZXM6IDEgLS0+Cis8c3ZnIHdpZHRoPSI1MTVwdCIgaGVpZ2h0PSI3MzRwdCIKKyAgICAgdmlld0JveD0iMC4wMCAwLjAwIDUxNC45NyA3MzQuMDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgorICAgIDxnIGlkPSJncmFwaDAiIGNsYXNzPSJncmFwaCIgdHJhbnNmb3JtPSJzY2FsZSgxIDEpIHJvdGF0ZSgwKSB0cmFuc2xhdGUoNCA3MzAuMDkzOSkiPgorICAgICAgICA8dGl0bGU+RzwvdGl0bGU+CisgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNmZmZmZmYiIHN0cm9rZT0idHJhbnNwYXJlbnQiIHBvaW50cz0iLTQsNCAtNCwtNzMwLjA5MzkgNTEwLjk3MzUsLTczMC4wOTM5IDUxMC45NzM1LDQgLTQsNCIvPgorICAgICAgICA8IS0tIHJvb3QgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMSIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnJvb3Q8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjM1Ljc0MyIgY3k9Ii02OTYuNjc4MiIgcng9IjM0LjkyMTMiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzUuNzQzIiB5PSItNzAwLjg3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzUuNzQzIiB5PSItNjg0LjA3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHg5QTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHN0YXJ0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTIiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT5zdGFydDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIzNjEuNzQzIiBjeT0iLTY5Ni42NzgyIiByeD0iNDQuMDc3NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNjEuNzQzIiB5PSItNjkyLjQ3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+c3RhcnQvZW5kPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3N0YXJ0IC0tPgorICAgICAgICA8IS0tIHRyIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEyIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHI8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMjM1Ljc0MyIgY3k9Ii00OTYuMjQ2OSIgcng9IjM3LjkwMjciIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzUuNzQzIiB5PSItNTAwLjQ0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+U3BhcnNlPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM1Ljc0MyIgeT0iLTQ4My42NDY5IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDdFPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gcm9vdCYjNDU7Jmd0O3RyIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE2IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3RyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTIwOC45MjU2LC02NzcuODA0QzE5MC4zNywtNjYyLjk4NzUgMTY3LjE5NjYsLTY0MC41NDQyIDE1Ni42OTE4LC02MTQuNDYyNiAxNDIuNzk3NiwtNTc5Ljk2NTYgMTcyLjYyMywtNTQ1LjEzNjYgMTk5LjUyOSwtNTIyLjMwOTciLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyMDcuMzY2NywtNTE1LjkxMjUgMjAyLjQ2NTEsLTUyNS43MjE5IDIwMy40OTMxLC01MTkuMDc0MSAxOTkuNjE5NiwtNTIyLjIzNTcgMTk5LjYxOTYsLTUyMi4yMzU3IDE5OS42MTk2LC01MjIuMjM1NyAyMDMuNDkzMSwtNTE5LjA3NDEgMTk2Ljc3NDEsLTUxOC43NDk1IDIwNy4zNjY3LC01MTUuOTEyNSAyMDcuMzY2NywtNTE1LjkxMjUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjE3My4yNjg2IiB5PSItNTkyLjI2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+dCwgMiwgciA8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTEzIiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMzUuNzQzIiBjeT0iLTU5Ni40NjI2IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzUuNzQzIiB5PSItNTkyLjI2MjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwOUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSByb290JiM0NTsmZ3Q7dCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+cm9vdCYjNDU7Jmd0O3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjM1Ljc0MywtNjY3LjE1MjJDMjM1Ljc0MywtNjUzLjY2NzEgMjM1Ljc0MywtNjM3Ljc3NDkgMjM1Ljc0MywtNjI0LjQ3NzkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyMzkuMjQzMSwtNjI0LjQ2NTkgMjM1Ljc0MywtNjE0LjQ2NTkgMjMyLjI0MzEsLTYyNC40NjU5IDIzOS4yNDMxLC02MjQuNDY1OSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM5LjQzODMiIHk9Ii02MzYuNjYyNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gdDwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHN0YXJ0JiM0NTsmZ3Q7cm9vdCAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxNSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnN0YXJ0JiM0NTsmZ3Q7cm9vdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0zMTcuMzc4MywtNjk2LjY3ODJDMzA1LjU3NjksLTY5Ni42NzgyIDI5Mi44MTY3LC02OTYuNjc4MiAyODAuOTY5OCwtNjk2LjY3ODIiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiNhZGQ4ZTYiIHN0cm9rZT0iI2FkZDhlNiIgcG9pbnRzPSIyNzAuODQxLC02OTYuNjc4MiAyODAuODQxMSwtNjkyLjE3ODMgMjc1Ljg0MSwtNjk2LjY3ODMgMjgwLjg0MSwtNjk2LjY3ODMgMjgwLjg0MSwtNjk2LjY3ODMgMjgwLjg0MSwtNjk2LjY3ODMgMjc1Ljg0MSwtNjk2LjY3ODMgMjgwLjg0MSwtNzAxLjE3ODMgMjcwLjg0MSwtNjk2LjY3ODIgMjcwLjg0MSwtNjk2LjY3ODIiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI5NC4wNzkyIiB5PSItNzAzLjg3ODIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IDAsICYjNDU7MTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMyIgY2xhc3M9Im5vZGUiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iOTEuNzQzIiBjeT0iLTE4IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5MS43NDMiIHk9Ii0xMy44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPmNvbnRlbnRBcnJheVswXTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU5IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjIzNS43NDMiIGN5PSItMzg0LjYxNTYiIHJ4PSIzNy45MzA2IiByeT0iMjkuMzMxNSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM1Ljc0MyIgeT0iLTM4OC44MTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPkNoYWluPC90ZXh0PgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjM1Ljc0MyIgeT0iLTM3Mi4wMTU2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDNCPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvciYjNDU7Jmd0O3RyZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UyMSIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0b3ImIzQ1OyZndDt0cmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMTQyLjI4ODEsLTMxLjIwMzNDMjMzLjIyNCwtNTguMDA1MiA0MjIuMTQ4NiwtMTI4LjMxNDcgNDk5Ljc0MywtMjY2LjQgNTA3LjU4MTIsLTI4MC4zNDg2IDUxMC42NzExLC0yOTAuNzEzNCA0OTkuNzQzLC0zMDIuNCA0NTguOTc0NywtMzQ1Ljk5ODMgMjcyLjUxMTMsLTI3Ni44MDE3IDIzMS43NDMsLTMyMC40IDIyNS4yOTk5LC0zMjcuMjkwNCAyMjMuNTQzMiwtMzM2LjYyMzIgMjI0LjA4MjEsLTM0Ni4wMzcxIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjI1LjQ1NDcsLTM1Ni4xNzIyIDIxOS42NTMyLC0zNDYuODY2NiAyMjQuNzgzNiwtMzUxLjIxNzQgMjI0LjExMjUsLTM0Ni4yNjI3IDIyNC4xMTI1LC0zNDYuMjYyNyAyMjQuMTEyNSwtMzQ2LjI2MjcgMjI0Ljc4MzYsLTM1MS4yMTc0IDIyOC41NzE4LC0zNDUuNjU4NyAyMjUuNDU0NywtMzU2LjE3MjIgMjI1LjQ1NDcsLTM1Ni4xNzIyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0NzEuNjAwMyIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiAzLCBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3RvIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTQiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdG88L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iOTEuNzQzIiBjeT0iLTEwNi44IiByeD0iMzYuNTgyNCIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5MS43NDMiIHk9Ii0xMDIuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxQjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0byYjNDU7Jmd0O3RyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlOCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0byYjNDU7Jmd0O3RyYWN0b3I8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNOTEuNzQzLC04OC40MDA2QzkxLjc0MywtNzYuMjk0OSA5MS43NDMsLTYwLjIwNzYgOTEuNzQzLC00Ni40Njc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iOTUuMjQzMSwtNDYuMDcyIDkxLjc0MywtMzYuMDcyIDg4LjI0MzEsLTQ2LjA3MjEgOTUuMjQzMSwtNDYuMDcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5NS44MjMzIiB5PSItNTguMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gcjwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYWN0IC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTUiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjdDwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSI5MS43NDMiIGN5PSItMTk1LjYiIHJ4PSIzNy4xNDQzIiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjkxLjc0MyIgeT0iLTE5MS40IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPjB4MDFBPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhY3QmIzQ1OyZndDt0cmFjdG8gLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWN0JiM0NTsmZ3Q7dHJhY3RvPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTkxLjc0MywtMTc3LjIwMDZDOTEuNzQzLC0xNjUuMDk0OSA5MS43NDMsLTE0OS4wMDc2IDkxLjc0MywtMTM1LjI2NzQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSI5NS4yNDMxLC0xMzQuODcyIDkxLjc0MywtMTI0Ljg3MiA4OC4yNDMxLC0xMzQuODcyMSA5NS4yNDMxLC0xMzQuODcyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI5Ni45OTMiIHk9Ii0xNDciIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IG88L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTYiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjkxLjc0MyIgY3k9Ii0yODQuNCIgcng9IjM1LjM1ODciIHJ5PSIxOCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTEuNzQzIiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwMTk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmFjJiM0NTsmZ3Q7dHJhY3QgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNiIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyYWMmIzQ1OyZndDt0cmFjdDwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik05MS43NDMsLTI2Ni4wMDA2QzkxLjc0MywtMjUzLjg5NDkgOTEuNzQzLC0yMzcuODA3NiA5MS43NDMsLTIyNC4wNjc0Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iOTUuMjQzMSwtMjIzLjY3MiA5MS43NDMsLTIxMy42NzIgODguMjQzMSwtMjIzLjY3MjEgOTUuMjQzMSwtMjIzLjY3MiIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iOTUuNDM4MyIgeT0iLTIzNS44IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiB0PC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9Im5vZGU4IiBjbGFzcz0ibm9kZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlZTwvdGl0bGU+CisgICAgICAgICAgICA8ZWxsaXBzZSBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGN4PSIyMzUuNzQzIiBjeT0iLTI4NC40IiByeD0iNzMuNDc0NSIgcnk9IjE4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzUuNzQzIiB5PSItMjgwLjIiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Y29udGVudEFycmF5WzFdPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJhYyYjNDU7Jmd0O3RyZWUgLS0+CisgICAgICAgIDwhLS0gdHJhIC0tPgorICAgICAgICA8ZyBpZD0ibm9kZTciIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmE8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMTE3Ljc0MyIgY3k9Ii0zODQuNjE1NiIgcng9IjM2LjEyNSIgcnk9IjI5LjMzMTUiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjExNy43NDMiIHk9Ii0zODguODE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5DaGFpbjwvdGV4dD4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjExNy43NDMiIHk9Ii0zNzIuMDE1NiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4weDAxODwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyYSYjNDU7Jmd0O3RyYWN0b3IgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTgiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEmIzQ1OyZndDt0cmFjdG9yPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTk0LjM5MTgsLTM2MS44NDhDNjUuMjE3MiwtMzMxLjM4MDUgMTcuMzcxLC0yNzQuMTI3NyAyLjk3NzIsLTIxMy42IC0xMi4zODI4LC0xNDkuMDA5MiAzNi41NTMsLTc5LjY1NTcgNjcuNzg0NSwtNDMuNDAzMyIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9Ijc0LjUzMTQsLTM1Ljc2MjMgNzEuMjg1NywtNDYuMjM2OSA3MS4yMjE5LC0zOS41MTA0IDY3LjkxMjUsLTQzLjI1ODQgNjcuOTEyNSwtNDMuMjU4NCA2Ny45MTI1LC00My4yNTg0IDcxLjIyMTksLTM5LjUxMDQgNjQuNTM5MywtNDAuMjc5OSA3NC41MzE0LC0zNS43NjIzIDc0LjUzMTQsLTM1Ljc2MjMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI1LjEyNTkiIHk9Ii0xOTEuNCIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj5jdG8sIDcsIHI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmEmIzQ1OyZndDt0cmFjIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTUiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmEmIzQ1OyZndDt0cmFjPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTExMC4yMjI3LC0zNTUuNjI5MUMxMDYuNjYxMywtMzQxLjkwMTYgMTAyLjQyODIsLTMyNS41ODU0IDk4LjkxMjYsLTMxMi4wMzQ4Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjMDAwMDAwIiBzdHJva2U9IiMwMDAwMDAiIHBvaW50cz0iMTAyLjI4NjMsLTMxMS4xMDA5IDk2LjM4NzEsLTMwMi4zMDAzIDk1LjUxMDYsLTMxMi44NTg4IDEwMi4yODYzLC0zMTEuMTAwOSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTA5LjYwMDMiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gYzwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaWUgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTAiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxlbGxpcHNlIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgY3g9IjQxNy43NDMiIGN5PSItMjg0LjQiIHJ4PSI3My40NzQ1IiByeT0iMTgiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQxNy43NDMiIHk9Ii0yODAuMiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj5jb250ZW50QXJyYXlbMl08L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlJiM0NTsmZ3Q7dHJpZSAtLT4KKyAgICAgICAgPCEtLSB0cmkgLS0+CisgICAgICAgIDxnIGlkPSJub2RlMTEiIGNsYXNzPSJub2RlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmk8L3RpdGxlPgorICAgICAgICAgICAgPGVsbGlwc2UgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBjeD0iMzUxLjc0MyIgY3k9Ii0zODQuNjE1NiIgcng9IjM3LjkzMDYiIHJ5PSIyOS4zMzE1Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNTEuNzQzIiB5PSItMzg4LjgxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+Q2hhaW48L3RleHQ+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIzNTEuNzQzIiB5PSItMzcyLjAxNTYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+MHgwNUI8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmVlJiM0NTsmZ3Q7dHJpIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTIyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJlZSYjNDU7Jmd0O3RyaTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiNhZGQ4ZTYiIGQ9Ik0yNTYuMjcyMywtMzAxLjk1MzFDMjYzLjEwOTcsLTMwNy44MTA5IDI3MC43NjEzLC0zMTQuMzc4NyAyNzcuNzQzLC0zMjAuNCAyOTEuMTgzNywtMzMxLjk5MTkgMzA1Ljk2MTUsLTM0NC44MDI1IDMxOC43NTM1LC0zNTUuOTEyNiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjMyNi40MzIsLTM2Mi41ODQzIDMxNS45MzE4LC0zNTkuNDIyMyAzMjIuNjU3NywtMzU5LjMwNDggMzE4Ljg4MzQsLTM1Ni4wMjU0IDMxOC44ODM0LC0zNTYuMDI1NCAzMTguODgzNCwtMzU2LjAyNTQgMzIyLjY1NzcsLTM1OS4zMDQ4IDMyMS44MzQ5LC0zNTIuNjI4NSAzMjYuNDMyLC0zNjIuNTg0MyAzMjYuNDMyLC0zNjIuNTg0MyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzA0LjY4ODMiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMGZmIj4zLCBpPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHJlJiM0NTsmZ3Q7dHJlZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2UxMCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyZSYjNDU7Jmd0O3RyZWU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjM1Ljc0MywtMzU1LjA4OTdDMjM1Ljc0MywtMzQxLjYwNDYgMjM1Ljc0MywtMzI1LjcxMjMgMjM1Ljc0MywtMzEyLjQxNTMiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyMzkuMjQzMSwtMzEyLjQwMzMgMjM1Ljc0MywtMzAyLjQwMzMgMjMyLjI0MzEsLTMxMi40MDM0IDIzOS4yNDMxLC0zMTIuNDAzMyIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjQwLjYwMDMiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyZSYjNDU7Jmd0O3RyZWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMTkiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmUmIzQ1OyZndDt0cmVlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTI0Ni45MTUyLC0zNTYuMjM3NkMyNDkuOTkzOSwtMzQ1LjA5NDMgMjUxLjk1MjEsLTMzMi4xNzU1IDI0OS43NDMsLTMyMC40IDI0OS4yMDk4LC0zMTcuNTU3NiAyNDguNDU4OSwtMzE0LjY1MTMgMjQ3LjU3ODksLTMxMS43ODMyIi8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMjQ0LjIxNzcsLTMwMi4zMjc5IDI1MS44MDczLC0zMTAuMjQzIDI0NS44OTI1LC0zMDcuMDM5MSAyNDcuNTY3MiwtMzExLjc1MDMgMjQ3LjU2NzIsLTMxMS43NTAzIDI0Ny41NjcyLC0zMTEuNzUwMyAyNDUuODkyNSwtMzA3LjAzOTEgMjQzLjMyNzEsLTMxMy4yNTc1IDI0NC4yMTc3LC0zMDIuMzI3OSAyNDQuMjE3NywtMzAyLjMyNzkiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjI2MS42MDAzIiB5PSItMzI0LjYiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+IDQsIGU8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmllJiM0NTsmZ3Q7c3RhcnQgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjMiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmllJiM0NTsmZ3Q7c3RhcnQ8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNNDIzLjgwNDQsLTMwMi41MTM0QzQyNS40MTg4LC0zMDguMTc0NSA0MjYuOTM3LC0zMTQuNDg3IDQyNy43NDMsLTMyMC40IDQyOC43NTE1LC0zMjcuNzk4MyA0MjguNDIsLTMyOS43NjQxIDQyNy43NDMsLTMzNy4yIDQxNi4zNzM0LC00NjIuMDg3MiAzODMuMjIzLC02MDguMzk0IDM2OC42OTc4LC02NjguNjE2MSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iI2FkZDhlNiIgc3Ryb2tlPSIjYWRkOGU2IiBwb2ludHM9IjM2Ni4yOTE3LC02NzguNTA5MyAzNjQuMjgyNSwtNjY3LjcyOSAzNjcuNDczNCwtNjczLjY1MDkgMzY4LjY1NSwtNjY4Ljc5MjUgMzY4LjY1NSwtNjY4Ljc5MjUgMzY4LjY1NSwtNjY4Ljc5MjUgMzY3LjQ3MzQsLTY3My42NTA5IDM3My4wMjc1LC02NjkuODU2IDM2Ni4yOTE3LC02NzguNTA5MyAzNjYuMjkxNywtNjc4LjUwOTMiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjQyNC45MDM2IiB5PSItNDkyLjA0NjkiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDBmZiI+JiM0NTsxLCAmIzQ1OzE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0cmkmIzQ1OyZndDt0cmllIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTEyIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHJpJiM0NTsmZ3Q7dHJpZTwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0zNjIuMDM2OSwtMzU2LjIyODNDMzY2LjkxMjksLTM0NC42MDAyIDM3My4zNjAzLC0zMzEuMzM1MyAzODEuMDI4NCwtMzIwLjQgMzgzLjY5NTIsLTMxNi41OTcgMzg2Ljc5NDYsLTMxMi44NTI4IDM5MC4wNDA2LC0zMDkuMzAwNSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjM5Mi43OTcxLC0zMTEuNDg2OCAzOTcuMjY5OCwtMzAxLjg4MjQgMzg3Ljc4MzksLTMwNi42MDEzIDM5Mi43OTcxLC0zMTEuNDg2OCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMzg1LjYwMDMiIHk9Ii0zMjQuNiIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyaSYjNDU7Jmd0O3RyaWUgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMjAiIGNsYXNzPSJlZGdlIj4KKyAgICAgICAgICAgIDx0aXRsZT50cmkmIzQ1OyZndDt0cmllPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2FkZDhlNiIgZD0iTTM3My40Mzk3LC0zNjAuMjg5OEMzNzkuMzgyOCwtMzUzLjA5NjkgMzg1LjU5ODgsLTM0NS4wNDMxIDM5MC43NDMsLTMzNy4yIDM5NS45OTQ0LC0zMjkuMTkzNiA0MDAuOTkzNiwtMzIwLjAzNjEgNDA1LjIzMDgsLTMxMS42MjA2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iNDA5LjY2MzgsLTMwMi41MzUzIDQwOS4zMjI4LC0zMTMuNDk1OSA0MDcuNDcxMiwtMzA3LjAyODkgNDA1LjI3ODYsLTMxMS41MjI1IDQwNS4yNzg2LC0zMTEuNTIyNSA0MDUuMjc4NiwtMzExLjUyMjUgNDA3LjQ3MTIsLTMwNy4wMjg5IDQwMS4yMzQzLC0zMDkuNTQ5MiA0MDkuNjYzOCwtMzAyLjUzNTMgNDA5LjY2MzgsLTMwMi41MzUzIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSI0MTEuNjAwMyIgeT0iLTMyNC42IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPiA0LCBlPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgICAgIDwhLS0gdHImIzQ1OyZndDt0cmEgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlNCIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnRyJiM0NTsmZ3Q7dHJhPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXRoIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgZD0iTTIwMS43NTA5LC00ODIuODE4M0MxODQuOTE3NSwtNDc0Ljg3NTIgMTY1LjIxNjEsLTQ2My40ODEyIDE1MS4wMjg0LC00NDguODMxMyAxNDMuNjkwMywtNDQxLjI1NDEgMTM3LjU4NDEsLTQzMS43MzU2IDEzMi42OTE1LC00MjIuMzY1NiIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjEzNS43MTk2LC00MjAuNTg4OCAxMjguMjAyNywtNDEzLjEyMjQgMTI5LjQyMjgsLTQyMy42NDY4IDEzNS43MTk2LC00MjAuNTg4OCIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMTU2LjYwMDMiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gYTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJhIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTE3IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmE8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYWRkOGU2IiBkPSJNMjExLjU3OTIsLTQ3My4zODczQzE5My40ODM2LC00NTYuMjY4MyAxNjguNTc2NCwtNDMyLjcwNTUgMTQ4Ljk3MDQsLTQxNC4xNTc2Ii8+CisgICAgICAgICAgICA8cG9seWdvbiBmaWxsPSIjYWRkOGU2IiBzdHJva2U9IiNhZGQ4ZTYiIHBvaW50cz0iMTQxLjQ3MTMsLTQwNy4wNjMyIDE1MS44MjgyLC00MTAuNjY2NiAxNDUuMTAzNSwtNDEwLjQ5OTQgMTQ4LjczNTcsLTQxMy45MzU2IDE0OC43MzU3LC00MTMuOTM1NiAxNDguNzM1NywtNDEzLjkzNTYgMTQ1LjEwMzUsLTQxMC40OTk0IDE0NS42NDMxLC00MTcuMjA0NiAxNDEuNDcxMywtNDA3LjA2MzIgMTQxLjQ3MTMsLTQwNy4wNjMyIi8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIxOTQuODUwMyIgeT0iLTQzNi4yMzEzIiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwZmYiPjMsIGE8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0ciYjNDU7Jmd0O3RyZSAtLT4KKyAgICAgICAgPGcgaWQ9ImVkZ2U5IiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmU8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjM1Ljc0MywtNDY2LjYyNDlDMjM1Ljc0MywtNDUzLjc1NjggMjM1Ljc0MywtNDM4LjQ4NjcgMjM1Ljc0MywtNDI0LjYzMTkiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIyMzkuMjQzMSwtNDI0LjM3NjEgMjM1Ljc0MywtNDE0LjM3NjEgMjMyLjI0MzEsLTQyNC4zNzYyIDIzOS4yNDMxLC00MjQuMzc2MSIvPgorICAgICAgICAgICAgPHRleHQgdGV4dC1hbmNob3I9Im1pZGRsZSIgeD0iMjQwLjYwMDMiIHk9Ii00MzYuMjMxMyIgZm9udC1mYW1pbHk9IlRpbWVzLHNlcmlmIiBmb250LXNpemU9IjE0LjAwIiBmaWxsPSIjMDAwMDAwIj4gZTwvdGV4dD4KKyAgICAgICAgPC9nPgorICAgICAgICA8IS0tIHRyJiM0NTsmZ3Q7dHJpIC0tPgorICAgICAgICA8ZyBpZD0iZWRnZTExIiBjbGFzcz0iZWRnZSI+CisgICAgICAgICAgICA8dGl0bGU+dHImIzQ1OyZndDt0cmk8L3RpdGxlPgorICAgICAgICAgICAgPHBhdGggZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBkPSJNMjU5LjQ5NzMsLTQ3My4zODczQzI3Ny4wNTIxLC00NTYuNDkzNiAzMDEuMTI4LC00MzMuMzI0NCAzMjAuMjgxNCwtNDE0Ljg5MjQiLz4KKyAgICAgICAgICAgIDxwb2x5Z29uIGZpbGw9IiMwMDAwMDAiIHN0cm9rZT0iIzAwMDAwMCIgcG9pbnRzPSIzMjIuODQzNCwtNDE3LjI4NDQgMzI3LjYyMTksLTQwNy44MjgzIDMxNy45ODk1LC00MTIuMjQwNSAzMjIuODQzNCwtNDE3LjI4NDQiLz4KKyAgICAgICAgICAgIDx0ZXh0IHRleHQtYW5jaG9yPSJtaWRkbGUiIHg9IjMwMy40MzgzIiB5PSItNDM2LjIzMTMiIGZvbnQtZmFtaWx5PSJUaW1lcyxzZXJpZiIgZm9udC1zaXplPSIxNC4wMCIgZmlsbD0iIzAwMDAwMCI+IGk8L3RleHQ+CisgICAgICAgIDwvZz4KKyAgICAgICAgPCEtLSB0JiM0NTsmZ3Q7dHIgLS0+CisgICAgICAgIDxnIGlkPSJlZGdlMyIgY2xhc3M9ImVkZ2UiPgorICAgICAgICAgICAgPHRpdGxlPnQmIzQ1OyZndDt0cjwvdGl0bGU+CisgICAgICAgICAgICA8cGF0aCBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIGQ9Ik0yMzUuNzQzLC01NzguMDgxNUMyMzUuNzQzLC01NjYuMzUwMiAyMzUuNzQzLC01NTAuNjc3NCAyMzUuNzQzLC01MzYuMTg4NSIvPgorICAgICAgICAgICAgPHBvbHlnb24gZmlsbD0iIzAwMDAwMCIgc3Ryb2tlPSIjMDAwMDAwIiBwb2ludHM9IjIzOS4yNDMxLC01MzUuOTIwOCAyMzUuNzQzLC01MjUuOTIwOSAyMzIuMjQzMSwtNTM1LjkyMDkgMjM5LjI0MzEsLTUzNS45MjA4Ii8+CisgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibWlkZGxlIiB4PSIyMzkuODIzMyIgeT0iLTU0Ny44NjI2IiBmb250LWZhbWlseT0iVGltZXMsc2VyaWYiIGZvbnQtc2l6ZT0iMTQuMDAiIGZpbGw9IiMwMDAwMDAiPiByPC90ZXh0PgorICAgICAgICA8L2c+CisgICAgPC9nPgorPC9zdmc+CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9NZXJnZVRyaWUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL01lcmdlVHJpZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyODA3NzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9NZXJnZVRyaWUuamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKKworLyoqCisgKiBBIG1lcmdlZCB2aWV3IG9mIHR3byB0cmllcy4KKyAqCisgKiBUaGlzIGlzIGFjY29tcGxpc2hlZCBieSB3YWxraW5nIHRoZSB0d28gY3Vyc29ycyBpbiBwYXJhbGxlbDsgdGhlIG1lcmdlZCBjdXJzb3IgdGFrZXMgdGhlIHBvc2l0aW9uIGFuZCBmZWF0dXJlcyBvZiB0aGUKKyAqIHNtYWxsZXIgYW5kIGFkdmFuY2VzIHdpdGggaXQ7IHdoZW4gdGhlIHR3byBjdXJzb3JzIGFyZSBlcXVhbCwgYm90aCBhcmUgYWR2YW5jZWQuCisgKgorICogQ3J1Y2lhbCBmb3IgdGhlIGVmZmljaWVuY3kgb2YgdGhpcyBpcyB0aGUgZmFjdCB0aGF0IHdoZW4gdGhleSBhcmUgYWR2YW5jZWQgbGlrZSB0aGlzLCB3ZSBjYW4gY29tcGFyZSBjdXJzb3JzJworICogcG9zaXRpb25zIGJ5IHRoZWlyIGRlcHRoIGRlc2NlbmRpbmcgYW5kIHRoZW4gaW5jb21pbmdUcmFuc2l0aW9uIGFzY2VuZGluZy4KKyAqCisgKiBTZWUgVHJpZS5tZCBmb3IgZnVydGhlciBkZXRhaWxzLgorICovCitjbGFzcyBNZXJnZVRyaWU8VD4gZXh0ZW5kcyBUcmllPFQ+Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXJnZVJlc29sdmVyPFQ+IHJlc29sdmVyOworICAgIHByb3RlY3RlZCBmaW5hbCBUcmllPFQ+IHQxOworICAgIHByb3RlY3RlZCBmaW5hbCBUcmllPFQ+IHQyOworCisgICAgTWVyZ2VUcmllKE1lcmdlUmVzb2x2ZXI8VD4gcmVzb2x2ZXIsIFRyaWU8VD4gdDEsIFRyaWU8VD4gdDIpCisgICAgeworICAgICAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgICAgIHRoaXMudDEgPSB0MTsKKyAgICAgICAgdGhpcy50MiA9IHQyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBDdXJzb3I8VD4gY3Vyc29yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTWVyZ2VDdXJzb3I8PihyZXNvbHZlciwgdDEsIHQyKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTWVyZ2VDdXJzb3I8VD4gaW1wbGVtZW50cyBDdXJzb3I8VD4KKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWVyZ2VSZXNvbHZlcjxUPiByZXNvbHZlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDdXJzb3I8VD4gYzE7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ3Vyc29yPFQ+IGMyOworCisgICAgICAgIGJvb2xlYW4gYXRDMTsKKyAgICAgICAgYm9vbGVhbiBhdEMyOworCisgICAgICAgIE1lcmdlQ3Vyc29yKE1lcmdlUmVzb2x2ZXI8VD4gcmVzb2x2ZXIsIFRyaWU8VD4gdDEsIFRyaWU8VD4gdDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucmVzb2x2ZXIgPSByZXNvbHZlcjsKKyAgICAgICAgICAgIHRoaXMuYzEgPSB0MS5jdXJzb3IoKTsKKyAgICAgICAgICAgIHRoaXMuYzIgPSB0Mi5jdXJzb3IoKTsKKyAgICAgICAgICAgIGFzc2VydCBjMS5kZXB0aCgpID09IDA7CisgICAgICAgICAgICBhc3NlcnQgYzIuZGVwdGgoKSA9PSAwOworICAgICAgICAgICAgYXRDMSA9IGF0QzIgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgYWR2YW5jZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjaGVja09yZGVyKGF0QzEgPyBjMS5hZHZhbmNlKCkgOiBjMS5kZXB0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRDMiA/IGMyLmFkdmFuY2UoKSA6IGMyLmRlcHRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2tpcENoaWxkcmVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNoZWNrT3JkZXIoYXRDMSA/IGMxLnNraXBDaGlsZHJlbigpIDogYzEuZGVwdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0QzIgPyBjMi5za2lwQ2hpbGRyZW4oKSA6IGMyLmRlcHRoKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgYWR2YW5jZU11bHRpcGxlKFRyYW5zaXRpb25zUmVjZWl2ZXIgcmVjZWl2ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdoaWxlIHdlIGFyZSBvbiBhIHNoYXJlZCBwb3NpdGlvbiwgd2UgbXVzdCBkZXNjZW5kIG9uZSBieXRlIGF0IGEgdGltZSB0byBtYWludGFpbiB0aGUgY3Vyc29yIG9yZGVyaW5nLgorICAgICAgICAgICAgaWYgKGF0QzEgJiYgYXRDMikKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tPcmRlcihjMS5hZHZhbmNlKCksIGMyLmFkdmFuY2UoKSk7CisKKyAgICAgICAgICAgIC8vIElmIHdlIGFyZSBpbiBhIGJyYW5jaCB0aGF0J3Mgb25seSBjb3ZlcmVkIGJ5IG9uZSBvZiB0aGUgc291cmNlcywgd2UgY2FuIHVzZSBpdHMgYWR2YW5jZU11bHRpcGxlIGFzIGl0IGlzCisgICAgICAgICAgICAvLyBvbmx5IGRpZmZlcmVudCBmcm9tIGFkdmFuY2UgaWYgaXQgdGFrZXMgbXVsdGlwbGUgc3RlcHMgZG93biwgd2hpY2ggZG9lcyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGUKKyAgICAgICAgICAgIC8vIGN1cnNvcnMuCisgICAgICAgICAgICAvLyBTaW5jZSBpdCBtaWdodCBhc2NlbmQsIHdlIHN0aWxsIGhhdmUgdG8gY2hlY2sgdGhlIG9yZGVyIGFmdGVyIHRoZSBjYWxsLgorICAgICAgICAgICAgaWYgKGF0QzEpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrT3JkZXIoYzEuYWR2YW5jZU11bHRpcGxlKHJlY2VpdmVyKSwgYzIuZGVwdGgoKSk7CisgICAgICAgICAgICBlbHNlIC8vIGF0QzIKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hlY2tPcmRlcihjMS5kZXB0aCgpLCBjMi5hZHZhbmNlTXVsdGlwbGUocmVjZWl2ZXIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGNoZWNrT3JkZXIoaW50IGMxZGVwdGgsIGludCBjMmRlcHRoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYzFkZXB0aCA+IGMyZGVwdGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXRDMSA9IHRydWU7CisgICAgICAgICAgICAgICAgYXRDMiA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBjMWRlcHRoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGMxZGVwdGggPCBjMmRlcHRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF0QzEgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBhdEMyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzJkZXB0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGMxZGVwdGggPT0gYzJkZXB0aAorICAgICAgICAgICAgaW50IGMxdHJhbnMgPSBjMS5pbmNvbWluZ1RyYW5zaXRpb24oKTsKKyAgICAgICAgICAgIGludCBjMnRyYW5zID0gYzIuaW5jb21pbmdUcmFuc2l0aW9uKCk7CisgICAgICAgICAgICBhdEMxID0gYzF0cmFucyA8PSBjMnRyYW5zOworICAgICAgICAgICAgYXRDMiA9IGMxdHJhbnMgPj0gYzJ0cmFuczsKKyAgICAgICAgICAgIHJldHVybiBjMWRlcHRoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZGVwdGgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXRDMSA/IGMxLmRlcHRoKCkgOiBjMi5kZXB0aCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaW5jb21pbmdUcmFuc2l0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGF0QzEgPyBjMS5pbmNvbWluZ1RyYW5zaXRpb24oKSA6IGMyLmluY29taW5nVHJhbnNpdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFQgY29udGVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFQgbWMgPSBhdEMyID8gYzIuY29udGVudCgpIDogbnVsbDsKKyAgICAgICAgICAgIFQgbmMgPSBhdEMxID8gYzEuY29udGVudCgpIDogbnVsbDsKKyAgICAgICAgICAgIGlmIChtYyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBuYzsKKyAgICAgICAgICAgIGVsc2UgaWYgKG5jID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG1jOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlci5yZXNvbHZlKG5jLCBtYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsIGluc3RhbmNlIGZvciBzb3VyY2VzIHRoYXQgYXJlIGd1YXJhbnRlZWQgKGJ5IHRoZSBjYWxsZXIpIGRpc3RpbmN0LiBUaGUgbWFpbiBkaWZmZXJlbmNlIGlzIHRoYXQgd2UgY2FuCisgICAgICogZm9ybSB1bm9yZGVyZWQgdmFsdWUgbGlzdCBieSBjb25jYXRlbmF0aW5nIHNvdXJjZXMuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIERpc3RpbmN0PFQ+IGV4dGVuZHMgTWVyZ2VUcmllPFQ+CisgICAgeworICAgICAgICBEaXN0aW5jdChUcmllPFQ+IGlucHV0MSwgVHJpZTxUPiBpbnB1dDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHRocm93aW5nUmVzb2x2ZXIoKSwgaW5wdXQxLCBpbnB1dDIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJdGVyYWJsZTxUPiB2YWx1ZXNVbm9yZGVyZWQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSXRlcmFibGVzLmNvbmNhdCh0MS52YWx1ZXNVbm9yZGVyZWQoKSwgdDIudmFsdWVzVW5vcmRlcmVkKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvU2luZ2xldG9uVHJpZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvU2luZ2xldG9uVHJpZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMzZhODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9TaW5nbGV0b25UcmllLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKKworLyoqCisgKiBTaW5nbGV0b24gdHJpZSwgbWFwcGluZyB0aGUgZ2l2ZW4ga2V5IHRvIHZhbHVlLgorICovCitjbGFzcyBTaW5nbGV0b25UcmllPFQ+IGV4dGVuZHMgVHJpZTxUPgoreworICAgIHByaXZhdGUgZmluYWwgQnl0ZUNvbXBhcmFibGUga2V5OworICAgIHByaXZhdGUgZmluYWwgVCB2YWx1ZTsKKworICAgIFNpbmdsZXRvblRyaWUoQnl0ZUNvbXBhcmFibGUga2V5LCBUIHZhbHVlKQorICAgIHsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ3Vyc29yIGN1cnNvcigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEN1cnNvcigpOworICAgIH0KKworICAgIGNsYXNzIEN1cnNvciBpbXBsZW1lbnRzIFRyaWUuQ3Vyc29yPFQ+CisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVTb3VyY2Ugc3JjID0ga2V5LmFzQ29tcGFyYWJsZUJ5dGVzKEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY3VycmVudERlcHRoID0gMDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY3VycmVudFRyYW5zaXRpb24gPSAtMTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbmV4dFRyYW5zaXRpb24gPSBzcmMubmV4dCgpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGFkdmFuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyZW50VHJhbnNpdGlvbiA9IG5leHRUcmFuc2l0aW9uOworICAgICAgICAgICAgaWYgKGN1cnJlbnRUcmFuc2l0aW9uICE9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXh0VHJhbnNpdGlvbiA9IHNyYy5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuICsrY3VycmVudERlcHRoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGVwdGggPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGFkdmFuY2VNdWx0aXBsZShUcmFuc2l0aW9uc1JlY2VpdmVyIHJlY2VpdmVyKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobmV4dFRyYW5zaXRpb24gPT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGVwdGggPSAtMTsKKyAgICAgICAgICAgIGludCBjdXJyZW50ID0gbmV4dFRyYW5zaXRpb247CisgICAgICAgICAgICBpbnQgZGVwdGggPSBjdXJyZW50RGVwdGg7CisgICAgICAgICAgICBpbnQgbmV4dCA9IHNyYy5uZXh0KCk7CisgICAgICAgICAgICB3aGlsZSAobmV4dCAhPSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyLmFkZFBhdGhCeXRlKGN1cnJlbnQpOworICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0OworICAgICAgICAgICAgICAgIG5leHQgPSBzcmMubmV4dCgpOworICAgICAgICAgICAgICAgICsrZGVwdGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50VHJhbnNpdGlvbiA9IGN1cnJlbnQ7CisgICAgICAgICAgICBuZXh0VHJhbnNpdGlvbiA9IG5leHQ7CisgICAgICAgICAgICByZXR1cm4gY3VycmVudERlcHRoID0gKytkZXB0aDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNraXBDaGlsZHJlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50RGVwdGggPSAtMTsgIC8vIG5vIGFsdGVybmF0aXZlcworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZGVwdGgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY3VycmVudERlcHRoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUIGNvbnRlbnQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV4dFRyYW5zaXRpb24gPT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNID8gdmFsdWUgOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaW5jb21pbmdUcmFuc2l0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRUcmFuc2l0aW9uOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvU2xpY2VkVHJpZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvU2xpY2VkVHJpZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YWUzZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9TbGljZWRUcmllLmphdmEKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworCisvKioKKyAqIFJlcHJlc2VudHMgYSBzbGljZWQgdmlldyBvZiBhIHRyaWUsIGkuZS4gdGhlIGNvbnRlbnQgd2l0aGluIHRoZSBnaXZlbiBwYWlyIG9mIGJvdW5kcy4KKyAqCisgKiBBcHBsaWVkIGJ5IGFkdmFuY2luZyB0aHJlZSB0cmllcyBpbiBwYXJhbGxlbDogdGhlIGxlZnQgYm91bmQsIHRoZSBzb3VyY2UgYW5kIHRoZSByaWdodCBib3VuZC4gV2hpbGUgdGhlIHNvdXJjZQorICogYm91bmQgaXMgc21hbGxlc3QsIHdlIGRvbid0IGlzc3VlIGFueSBjb250ZW50IGFuZCBza2lwIG92ZXIgYW55IGNoaWxkcmVuLiBBcyBzb29uIGFzIHRoZSBsZWZ0IGJvdW5kIGJlY29tZXMgc3RyaWN0bHkKKyAqIHNtYWxsZXIsIHdlIHN0b3AgcHJvY2Vzc2luZyBpdCAoYXMgaXQncyBhIHNpbmdsZXRvbiB0cmllIGl0IHdpbGwgcmVtYWluIHNtYWxsZXIgdW50aWwgaXQncyBleGhhdXN0ZWQpIGFuZCBzdGFydAorICogaXNzdWluZyB0aGUgbm9kZXMgYW5kIGNvbnRlbnQgZnJvbSB0aGUgc291cmNlLiBBcyBzb29uIGFzIHRoZSByaWdodCBib3VuZCBiZWNvbWVzIHN0cmljdGx5IHNtYWxsZXIsIHdlIGZpbmlzaCB0aGUKKyAqIHdhbGsuCisgKgorICogV2UgZG9uJ3QgZXhwbGljaXRseSBjb25zdHJ1Y3QgdHJpZXMgZm9yIHRoZSB0d28gYm91bmRzOyB0cmFja2luZyB0aGUgY3VycmVudCBkZXB0aCAoPSBwcmVmaXggbGVuZ3RoKSBhbmQgdHJhbnNpdGlvbgorICogYXMgY2hhcmFjdGVycyBhcmUgcmVxdWVzdGVkIGZyb20gdGhlIGtleSBpcyBzdWZmaWNpZW50IGFzIGl0IGlzIGEgdHJpZSB3aXRoIGp1c3QgYSBzaW5nbGUgZGVzY2VudCBwYXRoLiBCZWNhdXNlIHdlCisgKiBuZWVkIHRoZSBuZXh0IGNoYXJhY3RlciB0byB0ZWxsIGlmIGl0J3MgYmVlbiBleGhhdXN0ZWQsIHdlIGtlZXAgdGhlc2Ugb25lIHBvc2l0aW9uIGFoZWFkLiBUaGUgc291cmNlIGlzIGFsd2F5cworICogYWR2YW5jZWQsIHRodXMgdGhpcyBnaXZlcyB1cyB0aGUgdGhpbmcgdG8gY29tcGFyZSBpdCBhZ2FpbnN0IGFmdGVyIHRoZSBhZHZhbmNlLgorICoKKyAqIFdlIGFsc28gdHJhY2sgdGhlIGN1cnJlbnQgc3RhdGUgdG8gbWFrZSBzb21lIGRlY2lzaW9ucyBhIGxpdHRsZSBzaW1wbGVyLgorICoKKyAqIFNlZSBUcmllLm1kIGZvciBmdXJ0aGVyIGRldGFpbHMuCisgKi8KK3B1YmxpYyBjbGFzcyBTbGljZWRUcmllPFQ+IGV4dGVuZHMgVHJpZTxUPgoreworICAgIHByaXZhdGUgZmluYWwgVHJpZTxUPiBzb3VyY2U7CisKKyAgICAvKiogTGVmdC1zaWRlIGJvdW5kYXJ5LiBUaGUgY2hhcmFjdGVycyBvZiB0aGlzIGFyZSByZXF1ZXN0ZWQgYXMgd2UgZGVzY2VuZCBhbG9uZyB0aGUgbGVmdC1zaWRlIGJvdW5kYXJ5LiAqLworICAgIHByaXZhdGUgZmluYWwgQnl0ZUNvbXBhcmFibGUgbGVmdDsKKworICAgIC8qKiBSaWdodC1zaWRlIGJvdW5kYXJ5LiBUaGUgY2hhcmFjdGVycyBvZiB0aGlzIGFyZSByZXF1ZXN0ZWQgYXMgd2UgZGVzY2VuZCBhbG9uZyB0aGUgcmlnaHQtc2lkZSBib3VuZGFyeS4gKi8KKyAgICBwcml2YXRlIGZpbmFsIEJ5dGVDb21wYXJhYmxlIHJpZ2h0OworCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGluY2x1ZGVMZWZ0OworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpbmNsdWRlUmlnaHQ7CisKKyAgICBwdWJsaWMgU2xpY2VkVHJpZShUcmllPFQ+IHNvdXJjZSwgQnl0ZUNvbXBhcmFibGUgbGVmdCwgYm9vbGVhbiBpbmNsdWRlTGVmdCwgQnl0ZUNvbXBhcmFibGUgcmlnaHQsIGJvb2xlYW4gaW5jbHVkZVJpZ2h0KQorICAgIHsKKyAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgICAgIHRoaXMubGVmdCA9IGxlZnQ7CisgICAgICAgIHRoaXMucmlnaHQgPSByaWdodDsKKyAgICAgICAgdGhpcy5pbmNsdWRlTGVmdCA9IGluY2x1ZGVMZWZ0OworICAgICAgICB0aGlzLmluY2x1ZGVSaWdodCA9IGluY2x1ZGVSaWdodDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQ3Vyc29yPFQ+IGN1cnNvcigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFNsaWNlZEN1cnNvcjw+KHRoaXMpOworICAgIH0KKworICAgIHByaXZhdGUgZW51bSBTdGF0ZQorICAgIHsKKyAgICAgICAgLyoqIFRoZSBjdXJzb3IgaXMgc3RpbGwgcG9zaXRpb25lZCBvbiBzb21lIHByZWZpeCBvZiB0aGUgbGVmdCBib3VuZC4gQ29udGVudCBzaG91bGQgbm90IGJlIHByb2R1Y2VkLiAqLworICAgICAgICBCRUZPUkVfTEVGVCwKKyAgICAgICAgLyoqIFRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBpbnNpZGUgdGhlIHJhbmdlLCBpLmUuIGJleW9uZCB0aGUgbGVmdCBib3VuZCwgcG9zc2libHkgb24gYSBwcmVmaXggb2YgdGhlIHJpZ2h0LiAqLworICAgICAgICBJTlNJREUsCisgICAgICAgIC8qKiBUaGUgY3Vyc29yIGlzIHBvc2l0aW9uZWQgYmV5b25kIHRoZSByaWdodCBib3VuZC4gRXhoYXVzdGlvbiAoZGVwdGggLTEpIGhhcyBiZWVuIHJlcG9ydGVkLiAqLworICAgICAgICBBRlRFUl9SSUdIVAorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNsaWNlZEN1cnNvcjxUPiBpbXBsZW1lbnRzIEN1cnNvcjxUPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCeXRlU291cmNlIGxlZnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZVNvdXJjZSByaWdodDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGluY2x1ZGVMZWZ0OworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZXhjbHVkZVJpZ2h0OworICAgICAgICBwcml2YXRlIGZpbmFsIEN1cnNvcjxUPiBzb3VyY2U7CisKKyAgICAgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbGVmdE5leHQ7CisgICAgICAgIHByaXZhdGUgaW50IGxlZnROZXh0RGVwdGg7CisgICAgICAgIHByaXZhdGUgaW50IHJpZ2h0TmV4dDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcmlnaHROZXh0RGVwdGg7CisKKyAgICAgICAgcHVibGljIFNsaWNlZEN1cnNvcihTbGljZWRUcmllPFQ+IHNsaWNlZFRyaWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNvdXJjZSA9IHNsaWNlZFRyaWUuc291cmNlLmN1cnNvcigpOworICAgICAgICAgICAgaWYgKHNsaWNlZFRyaWUubGVmdCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxlZnQgPSBzbGljZWRUcmllLmxlZnQuYXNDb21wYXJhYmxlQnl0ZXMoQllURV9DT01QQVJBQkxFX1ZFUlNJT04pOworICAgICAgICAgICAgICAgIGluY2x1ZGVMZWZ0ID0gc2xpY2VkVHJpZS5pbmNsdWRlTGVmdDsKKyAgICAgICAgICAgICAgICBsZWZ0TmV4dCA9IGxlZnQubmV4dCgpOworICAgICAgICAgICAgICAgIGxlZnROZXh0RGVwdGggPSAxOworICAgICAgICAgICAgICAgIGlmIChsZWZ0TmV4dCA9PSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0gJiYgaW5jbHVkZUxlZnQpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuSU5TSURFOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5CRUZPUkVfTEVGVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbmNsdWRlTGVmdCA9IHRydWU7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5JTlNJREU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzbGljZWRUcmllLnJpZ2h0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmlnaHQgPSBzbGljZWRUcmllLnJpZ2h0LmFzQ29tcGFyYWJsZUJ5dGVzKEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICBleGNsdWRlUmlnaHQgPSAhc2xpY2VkVHJpZS5pbmNsdWRlUmlnaHQ7CisgICAgICAgICAgICAgICAgcmlnaHROZXh0ID0gcmlnaHQubmV4dCgpOworICAgICAgICAgICAgICAgIHJpZ2h0TmV4dERlcHRoID0gMTsKKyAgICAgICAgICAgICAgICBpZiAocmlnaHROZXh0ID09IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSAmJiBleGNsdWRlUmlnaHQpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuQkVGT1JFX0xFRlQ7ICAvLyBUaGlzIGlzIGEgaGFjaywgd2UgYXJlIGFmdGVyIHRoZSByaWdodCBib3VuZCBidXQgd2UgZG9uJ3Qgd2FudCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwb3J0IGRlcHRoIC0xIHlldC4gU28ganVzdCBtYWtlIHN1cmUgcm9vdCdzIGNvbnRlbnQgaXMgbm90IHJlcG9ydGVkLgorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJpZ2h0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBleGNsdWRlUmlnaHQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJpZ2h0TmV4dERlcHRoID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGFkdmFuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgKHN0YXRlICE9IFN0YXRlLkFGVEVSX1JJR0hUKTsKKworICAgICAgICAgICAgaW50IG5ld0RlcHRoID0gc291cmNlLmFkdmFuY2UoKTsKKyAgICAgICAgICAgIGludCB0cmFuc2l0aW9uID0gc291cmNlLmluY29taW5nVHJhbnNpdGlvbigpOworCisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQkVGT1JFX0xFRlQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gU2tpcCBhbnkgdHJhbnNpdGlvbnMgYmVmb3JlIHRoZSBsZWZ0IGJvdW5kCisgICAgICAgICAgICAgICAgd2hpbGUgKG5ld0RlcHRoID09IGxlZnROZXh0RGVwdGggJiYgdHJhbnNpdGlvbiA8IGxlZnROZXh0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3RGVwdGggPSBzb3VyY2Uuc2tpcENoaWxkcmVuKCk7CisgICAgICAgICAgICAgICAgICAgIHRyYW5zaXRpb24gPSBzb3VyY2UuaW5jb21pbmdUcmFuc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIHN0aWxsIGZvbGxvd2luZyB0aGUgbGVmdCBib3VuZAorICAgICAgICAgICAgICAgIGlmIChuZXdEZXB0aCA9PSBsZWZ0TmV4dERlcHRoICYmIHRyYW5zaXRpb24gPT0gbGVmdE5leHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbGVmdE5leHQgIT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgICAgICBsZWZ0TmV4dCA9IGxlZnQubmV4dCgpOworICAgICAgICAgICAgICAgICAgICArK2xlZnROZXh0RGVwdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0TmV4dCA9PSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0gJiYgaW5jbHVkZUxlZnQpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLklOU0lERTsgLy8gcmVwb3J0IHRoZSBjb250ZW50IG9uIHRoZSBsZWZ0IGJvdW5kCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgLy8gb3RoZXJ3aXNlIHdlIGFyZSBiZXlvbmQgaXQKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5JTlNJREU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjaGVja1JpZ2h0Qm91bmQobmV3RGVwdGgsIHRyYW5zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbWFya0RvbmUoKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkFGVEVSX1JJR0hUOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY2hlY2tSaWdodEJvdW5kKGludCBuZXdEZXB0aCwgaW50IHRyYW5zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEN1cnNvciBwb3NpdGlvbnMgY29tcGFyZSBieSBkZXB0aCBkZXNjZW5kaW5nIGFuZCB0cmFuc2l0aW9uIGFzY2VuZGluZy4KKyAgICAgICAgICAgIGlmIChuZXdEZXB0aCA+IHJpZ2h0TmV4dERlcHRoKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXdEZXB0aDsKKyAgICAgICAgICAgIGlmIChuZXdEZXB0aCA8IHJpZ2h0TmV4dERlcHRoKQorICAgICAgICAgICAgICAgIHJldHVybiBtYXJrRG9uZSgpOworICAgICAgICAgICAgLy8gbmV3RGVwdGggPT0gcmlnaHREZXB0aAorICAgICAgICAgICAgaWYgKHRyYW5zaXRpb24gPCByaWdodE5leHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0RlcHRoOworICAgICAgICAgICAgaWYgKHRyYW5zaXRpb24gPiByaWdodE5leHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcmtEb25lKCk7CisKKyAgICAgICAgICAgIC8vIEZvbGxvd2luZyByaWdodCBib3VuZAorICAgICAgICAgICAgcmlnaHROZXh0ID0gcmlnaHQubmV4dCgpOworICAgICAgICAgICAgKytyaWdodE5leHREZXB0aDsKKyAgICAgICAgICAgIGlmIChyaWdodE5leHQgPT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNICYmIGV4Y2x1ZGVSaWdodCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFya0RvbmUoKTsgIC8vIGRvIG5vdCByZXBvcnQgYW55IGNvbnRlbnQgb24gdGhlIHJpZ2h0IGJvdW5kCisgICAgICAgICAgICByZXR1cm4gbmV3RGVwdGg7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBhZHZhbmNlTXVsdGlwbGUoVHJhbnNpdGlvbnNSZWNlaXZlciByZWNlaXZlcikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJFRk9SRV9MRUZUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWR2YW5jZSgpOyAgIC8vIGRlc2NlbmQgb25seSBvbmUgbGV2ZWwgdG8gYmUgYWJsZSB0byBjb21wYXJlIGN1cnNvcnMgY29ycmVjdGx5CisgICAgICAgICAgICAgICAgY2FzZSBJTlNJREU6CisgICAgICAgICAgICAgICAgICAgIGludCBkZXB0aCA9IHNvdXJjZS5kZXB0aCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gcmlnaHROZXh0RGVwdGggLSAxKSAgLy8gdGhpcyBpcyBwb3NzaWJsZSBiZWNhdXNlIHJpZ2h0IGlzIGFscmVhZHkgYWR2YW5jZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWR2YW5jZSgpOyAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgbmV4dCBieXRlIGFnYWluc3QgcmlnaHQgYm91bmRhcnkgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgICAgIGludCBuZXdEZXB0aCA9IHNvdXJjZS5hZHZhbmNlTXVsdGlwbGUocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3RGVwdGggPiBkZXB0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdEZXB0aDsgICAgLy8gc3VjY2Vzc2Z1bGx5IGFkdmFuY2VkCisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFzY2VuZGVkLCBjaGVjayBpZiB3ZSBhcmUgc3RpbGwgd2l0aGluIGJvdW5kYXJpZXMKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrUmlnaHRCb3VuZChuZXdEZXB0aCwgc291cmNlLmluY29taW5nVHJhbnNpdGlvbigpKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNraXBDaGlsZHJlbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCAoc3RhdGUgIT0gU3RhdGUuQUZURVJfUklHSFQpOworCisgICAgICAgICAgICAvLyBXZSBhcmUgZWl0aGVyIGluc2lkZSBvciBmb2xsb3dpbmcgdGhlIGxlZnQgYm91bmQuIEluIHRoZSBsYXR0ZXIgY2FzZSBhc2NlbmQgdGFrZXMgdXMgYmV5b25kIGl0LgorICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5JTlNJREU7CisgICAgICAgICAgICByZXR1cm4gY2hlY2tSaWdodEJvdW5kKHNvdXJjZS5za2lwQ2hpbGRyZW4oKSwgc291cmNlLmluY29taW5nVHJhbnNpdGlvbigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGRlcHRoKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0YXRlID09IFN0YXRlLkFGVEVSX1JJR0hUID8gLTEgOiBzb3VyY2UuZGVwdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGluY29taW5nVHJhbnNpdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzb3VyY2UuaW5jb21pbmdUcmFuc2l0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFQgY29udGVudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZSA9PSBTdGF0ZS5JTlNJREUgPyBzb3VyY2UuY29udGVudCgpIDogbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTM5ZTA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZS5qYXZhCkBAIC0wLDAgKzEsNjIyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CisKK2ltcG9ydCBvcmcuYWdyb25hLkRpcmVjdEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKKworLyoqCisgKiBCYXNlIGNsYXNzIGZvciB0cmllcy4KKyAqCisgKiBOb3JtYWwgdXNlcnMgb2YgdHJpZXMgd2lsbCBvbmx5IHVzZSB0aGUgcHVibGljIG1ldGhvZHMsIHdoaWNoIHByb3ZpZGUgdmFyaW91cyB0cmFuc2Zvcm1hdGlvbnMgb2YgdGhlIHRyaWUsIGNvbnZlcnNpb24KKyAqIG9mIGl0cyBjb250ZW50IHRvIG90aGVyIGZvcm1hdHMgKGUuZy4gaXRlcmFibGUgb2YgdmFsdWVzKSwgYW5kIHNldmVyYWwgZm9ybXMgb2YgcHJvY2Vzc2luZy4KKyAqCisgKiBGb3IgYW55IHVuaW1wbGVtZW50ZWQgZGF0YSBleHRyYWN0aW9uIG9wZXJhdGlvbnMgb25lIGNhbiBidWlsZCBvbiB0aGUge0BsaW5rIFRyaWVFbnRyaWVzV2Fsa2VyfSAoZm9yLWVhY2ggcHJvY2Vzc2luZykKKyAqIGFuZCB7QGxpbmsgVHJpZUVudHJpZXNJdGVyYXRvcn0gKHRvIGl0ZXJhdG9yKSBiYXNlIGNsYXNzZXMsIHdoaWNoIHByb3ZpZGUgdGhlIG5lY2Vzc2FyeSBtZWNoYW5pc21zIHRvIGhhbmRsZSB3YWxraW5nCisgKiB0aGUgdHJpZS4KKyAqCisgKiBUaGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdHJpZXMgdXNpbmcgdGhpcyBpbnRlcmZhY2UgaXMgZGVmaW5lZCBpbiB0aGUge0BsaW5rIEN1cnNvcn0gaW50ZXJmYWNlLgorICoKKyAqIEN1cnNvcnMgYXJlIGEgbWV0aG9kIG9mIHByZXNlbnRpbmcgdGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiBhIHRyaWUgd2l0aG91dCByZXByZXNlbnRpbmcgbm9kZXMgYXMgb2JqZWN0cywgd2hpY2ggaXMKKyAqIHN0aWxsIHVzZWZ1bCBmb3IgcGVyZm9ybWluZyB0aGUgYmFzaWMgb3BlcmF0aW9ucyBvbiB0cmllcyAoaXRlcmF0aW9uLCBzbGljaW5nL2ludGVyc2VjdGlvbiBhbmQgbWVyZ2luZykuIEEgY3Vyc29yCisgKiB3aWxsIGxpc3QgdGhlIG5vZGVzIG9mIGEgdHJpZSBpbiBvcmRlciwgdG9nZXRoZXIgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGF0aCB0aGF0IHdhcyB0YWtlbiB0byByZWFjaCB0aGVtLgorICoKKyAqIFRvIGJlZ2luIHRyYXZlcnNhbCBvdmVyIGEgdHJpZSwgb25lIG11c3QgcmV0cmlldmUgYSBjdXJzb3IgYnkgY2FsbGluZyB7QGxpbmsgI2N1cnNvcigpfS4gQmVjYXVzZSBjdXJzb3JzIGFyZQorICogc3RhdGVmdWwsIHRoZSB0cmF2ZXJzYWwgbXVzdCBhbHdheXMgcHJvY2VlZCBmcm9tIG9uZSB0aHJlYWQuIFNob3VsZCBjb25jdXJyZW50IHJlYWRzIGJlIHJlcXVpcmVkLCBzZXBhcmF0ZSBjYWxscyB0bworICoge0BsaW5rICNjdXJzb3IoKX0gbXVzdCBiZSBtYWRlLiBBbnkgbW9kaWZpY2F0aW9uIHRoYXQgaGFzIGNvbXBsZXRlZCBiZWZvcmUgdGhlIGNvbnN0cnVjdGlvbiBvZiBhIGN1cnNvciBtdXN0IGJlCisgKiB2aXNpYmxlLCBidXQgYW55IGxhdGVyIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9ucyBtYXkgYmUgcHJlc2VudGVkIGZ1bGx5LCBwYXJ0aWFsbHkgb3Igbm90IGF0IGFsbDsgdGhpcyBhbHNvIG1lYW5zIHRoYXQKKyAqIGlmIG11bHRpcGxlIGFyZSBtYWRlLCB0aGUgY3Vyc29yIG1heSBzZWUgYW55IHBhcnQgb2YgYW55IHN1YnNldCBvZiB0aGVtLgorICoKKyAqIE5vdGU6IFRoaXMgbW9kZWwgb25seSBzdXBwb3J0cyBkZXB0aC1maXJzdCB0cmF2ZXJzYWxzLiBXZSBkbyBub3QgY3VycmVudGx5IGhhdmUgYSBuZWVkIGZvciBicmVhZHRoLWZpcnN0IHdhbGtzLgorICoKKyAqIFNlZSBUcmllLm1kIGZvciBmdXJ0aGVyIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmllIHJlcHJlc2VudGF0aW9uIG1vZGVsLgorICoKKyAqIEBwYXJhbSA8VD4gVGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgdHJpZS4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRyaWU8VD4KK3sKKyAgICAvKioKKyAgICAgKiBBIHRyaWUgY3Vyc29yLgorICAgICAqCisgICAgICogVGhpcyBpcyB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRyaWUsIHdoaWNoIGVuYWJsZXMgZWZmaWNpZW50IHdhbGtzIGFuZCBiYXNpYyBvcGVyYXRpb25zIChtZXJnZSwKKyAgICAgKiBzbGljZSkgb24gdHJpZXMuCisgICAgICoKKyAgICAgKiBUaGUgY3Vyc29yIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGEgd2FsayBvdmVyIHRoZSBub2RlcyBvZiB0cmllLiBJdCBwcm92aWRlcyB0aHJlZSBtYWluIGZlYXR1cmVzOgorICAgICAqIC0gdGhlIGN1cnJlbnQgImRlcHRoIiBvciBkZXNjZW5kLWRlcHRoIGluIHRoZSB0cmllOworICAgICAqIC0gdGhlICJpbmNvbWluZ1RyYW5zaXRpb24iLCBpLmUuIHRoZSBieXRlIHRoYXQgd2FzIHVzZWQgdG8gcmVhY2ggdGhlIGN1cnJlbnQgcG9pbnQ7CisgICAgICogLSB0aGUgImNvbnRlbnQiIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBub2RlLAorICAgICAqIGFuZCBwcm92aWRlcyBtZXRob2RzIGZvciBhZHZhbmNpbmcgdG8gdGhlIG5leHQgcG9zaXRpb24uICBUaGlzIGlzIGVub3VnaCBpbmZvcm1hdGlvbiB0byBleHRyYWN0IGFsbCBwYXRocywgYW5kCisgICAgICogYWxzbyB0byBlYXNpbHkgY29tcGFyZSBjdXJzb3JzIG92ZXIgZGlmZmVyZW50IHRyaWVzIHRoYXQgYXJlIGFkdmFuY2VkIHRvZ2V0aGVyLiBBZHZhbmNpbmcgaXMgYWx3YXlzIGRvbmUgaW4KKyAgICAgKiBvcmRlcjsgaWYgb25lIGltYWdpbmVzIHRoZSBzZXQgb2Ygbm9kZXMgaW4gdGhlIHRyaWUgd2l0aCB0aGVpciBhc3NvY2lhdGVkIHBhdGhzLCBhIGN1cnNvciBtYXkgb25seSBhZHZhbmNlIGZyb20gYQorICAgICAqIG5vZGUgd2l0aCBhIGxleGljb2dyYXBoaWNhbGx5IHNtYWxsZXIgcGF0aCB0byBvbmUgd2l0aCBiaWdnZXIuIFRoZSAiYWR2YW5jZSIgb3BlcmF0aW9uIG1vdmVzIHRvIHRoZSBpbW1lZGlhdGUKKyAgICAgKiBuZXh0LCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNraXAgb3ZlciBzb21lIGl0ZW1zIGUuZy4gYWxsIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUgKCJza2lwQ2hpbGRyZW4iKS4KKyAgICAgKgorICAgICAqIE1vdmluZyB0byB0aGUgaW1tZWRpYXRlIG5leHQgcG9zaXRpb24gaW4gdGhlIGxleGljb2dyYXBoaWMgb3JkZXIgaXMgYWNjb21wbGlzaGVkIGJ5OgorICAgICAqIC0gaWYgdGhlIGN1cnJlbnQgbm9kZSBoYXMgY2hpbGRyZW4sIG1vdmluZyB0byBpdHMgZmlyc3QgY2hpbGQ7CisgICAgICogLSBvdGhlcndpc2UsIGFzY2VuZCB0aGUgcGFyZW50IGNoYWluIGFuZCByZXR1cm4gdGhlIG5leHQgY2hpbGQgb2YgdGhlIGNsb3Nlc3QgcGFyZW50IHRoYXQgc3RpbGwgaGFzIGFueS4KKyAgICAgKiBBcyBsb25nIGFzIHRoZSB0cmllIGlzIG5vdCBleGhhdXN0ZWQsIGFkdmFuY2luZyBhbHdheXMgdGFrZXMgb25lIHN0ZXAgZG93biwgZnJvbSB0aGUgY3VycmVudCBub2RlLCBvciBmcm9tIGEgbm9kZQorICAgICAqIG9uIHRoZSBwYXJlbnQgY2hhaW4uIEJ5IGNvbXBhcmluZyB0aGUgbmV3IGRlcHRoICh3aGljaCAiYWR2YW5jZSIgYWxzbyByZXR1cm5zKSB3aXRoIHRoZSBvbmUgYmVmb3JlIHRoZSBhZHZhbmNlLAorICAgICAqIG9uZSBjYW4gdGVsbCBpZiB0aGUgZm9ybWVyIHdhcyB0aGUgY2FzZSAoaWYgbmV3RGVwdGggPT0gb2xkRGVwdGggKyAxKSBhbmQgaG93IG1hbnkgc3RlcHMgdXAgd2UgaGFkIHRvIHRha2UKKyAgICAgKiAob2xkRGVwdGggKyAxIC0gbmV3RGVwdGgpLiBXaGVuIGZvbGxvd2luZyBhIHBhdGggZG93biwgdGhlIGN1cnNvciB3aWxsIHN0b3Agb24gYWxsIHByZWZpeGVzLgorICAgICAqCisgICAgICogV2hlbiBpdCBpcyBjcmVhdGVkIHRoZSBjdXJzb3IgaXMgcGxhY2VkIG9uIHRoZSByb290IG5vZGUgd2l0aCBkZXB0aCgpID0gMCwgaW5jb21pbmdUcmFuc2l0aW9uKCkgPSAtMS4gU2luY2UKKyAgICAgKiB0cmllcyBjYW4gaGF2ZSBtYXBwaW5ncyBmb3IgZW1wdHksIGNvbnRlbnQoKSBjYW4gcG9zc2libHkgYmUgbm9uLW51bGwuIEl0IGlzIG5vdCBhbGxvd2VkIGZvciBhIGN1cnNvciB0byBzdGFydAorICAgICAqIGluIGV4aGF1c3RlZCBzdGF0ZSAoaS5lLiB3aXRoIGRlcHRoKCkgPSAtMSkuCisgICAgICoKKyAgICAgKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB0cmllOgorICAgICAqICB0CisgICAgICogICByCisgICAgICogICAgZQorICAgICAqICAgICBlICoKKyAgICAgKiAgICBpCisgICAgICogICAgIGUgKgorICAgICAqICAgICBwICoKKyAgICAgKiAgdworICAgICAqICAgaQorICAgICAqICAgIG4gICoKKyAgICAgKiBoYXMgbm9kZXMgcmVhY2hhYmxlIHdpdGggdGhlIHBhdGhzCisgICAgICogICIiLCB0LCB0ciwgdHJlLCB0cmVlKiwgdHJpLCB0cmllKiwgdHJpcCosIHcsIHdpLCB3aW4qCisgICAgICogYW5kIHRoZSBjdXJzb3Igd2lsbCBsaXN0IHRoZW0gd2l0aCB0aGUgZm9sbG93aW5nIChkZXB0aCwgaW5jb21pbmdUcmFuc2l0aW9uKSBwYWlyczoKKyAgICAgKiAgKDAsIC0xKSwgKDEsIHQpLCAoMiwgciksICgzLCBlKSwgKDQsIGUpKiwgKDMsIGkpLCAoNCwgZSkqLCAoNCwgcCkqLCAoMSwgdyksICgyLCBpKSwgKDMsIG4pKgorICAgICAqCisgICAgICogQmVjYXVzZSB3ZSBleGhhdXN0IHRyYW5zaXRpb25zIG9uIGJpZ2dlciBkZXB0aHMgYmVmb3JlIHdlIGdvIHRoZSBuZXh0IHRyYW5zaXRpb24gb24gdGhlIHNtYWxsZXIgb25lcywgd2hlbgorICAgICAqIGN1cnNvcnMgYXJlIGFkdmFuY2VkIHRvZ2V0aGVyIHRoZWlyIHBvc2l0aW9ucyBjYW4gYmUgZWFzaWx5IGNvbXBhcmVkIHVzaW5nIG9ubHkgdGhlIGRlcHRoIGFuZCBpbmNvbWluZ1RyYW5zaXRpb246CisgICAgICogLSBvbmUgdGhhdCBpcyBoaWdoZXIgaW4gZGVwdGggaXMgYmVmb3JlIG9uZSB0aGF0IGlzIGxvd2VyOworICAgICAqIC0gZm9yIGVxdWFsIGRlcHRocywgdGhlIG9uZSB3aXRoIHNtYWxsZXIgaW5jb21pbmdUcmFuc2l0aW9uIGlzIGZpcnN0LgorICAgICAqCisgICAgICogSWYgd2UgY29uc2lkZXIgd2Fsa2luZyB0aGUgdHJpZSBhYm92ZSBpbiBwYXJhbGxlbCB3aXRoIHRoaXM6CisgICAgICogIHQKKyAgICAgKiAgIHIKKyAgICAgKiAgICBpCisgICAgICogICAgIGMKKyAgICAgKiAgICAgIGsgKgorICAgICAqICB1CisgICAgICogICBwICoKKyAgICAgKiB0aGUgY29tYmluZWQgaXRlcmF0aW9uIHdpbGwgcHJvY2VlZCBhcyBmb2xsb3dzOgorICAgICAqICAoMCwgLTEpKyAgICAoMCwgLTEpKyAgICAgICAgICAgICAgIGN1cnNvcnMgZXF1YWwsIGFkdmFuY2UgYm90aAorICAgICAqICAoMSwgdCkrICAgICAoMSwgdCkrICAgICAgICB0ICAgICAgIGN1cnNvcnMgZXF1YWwsIGFkdmFuY2UgYm90aAorICAgICAqICAoMiwgcikrICAgICAoMiwgcikrICAgICAgICB0ciAgICAgIGN1cnNvcnMgZXF1YWwsIGFkdmFuY2UgYm90aAorICAgICAqICAoMywgZSkrICA8ICAoMywgaSkgICAgICAgICB0cmUgICAgIGN1cnNvcnMgbm90IGVxdWFsLCBhZHZhbmNlIHNtYWxsZXIgKDMgPSAzLCBlIDwgaSkKKyAgICAgKiAgKDQsIGUpKyAgPCAgKDMsIGkpICAgICAgICAgdHJlZSogICBjdXJzb3JzIG5vdCBlcXVhbCwgYWR2YW5jZSBzbWFsbGVyICg0ID4gMykKKyAgICAgKiAgKDMsIGkpKyAgICAgKDMsIGkpKyAgICAgICAgdHJpICAgICBjdXJzb3JzIGVxdWFsLCBhZHZhbmNlIGJvdGgKKyAgICAgKiAgKDQsIGUpICAgPiAgKDQsIGMpKyAgICAgICAgdHJpYyAgICBjdXJzb3JzIG5vdCBlcXVhbCwgYWR2YW5jZSBzbWFsbGVyICg0ID0gNCwgZSA+IGMpCisgICAgICogICg0LCBlKSAgID4gICg1LCBrKSsgICAgICAgIHRyaWNrKiAgY3Vyc29ycyBub3QgZXF1YWwsIGFkdmFuY2Ugc21hbGxlciAoNCA8IDUpCisgICAgICogICg0LCBlKSsgIDwgICgxLCB1KSAgICAgICAgIHRyaWUqICAgY3Vyc29ycyBub3QgZXF1YWwsIGFkdmFuY2Ugc21hbGxlciAoNCA+IDEpCisgICAgICogICg0LCBwKSsgIDwgICgxLCB1KSAgICAgICAgIHRyaXAqICAgY3Vyc29ycyBub3QgZXF1YWwsIGFkdmFuY2Ugc21hbGxlciAoNCA+IDEpCisgICAgICogICgxLCB3KSAgID4gICgxLCB1KSsgICAgICAgIHUgICAgICAgY3Vyc29ycyBub3QgZXF1YWwsIGFkdmFuY2Ugc21hbGxlciAoMSA9IDEsIHcgPiB1KQorICAgICAqICAoMSwgdykgICA+ICAoMiwgcCkrICAgICAgICB1cCogICAgIGN1cnNvcnMgbm90IGVxdWFsLCBhZHZhbmNlIHNtYWxsZXIgKDEgPCAyKQorICAgICAqICAoMSwgdykrICA8ICAoLTEsIC0xKSAgICAgICB3ICAgICAgIGN1cnNvcnMgbm90IGVxdWFsLCBhZHZhbmNlIHNtYWxsZXIgKDEgPiAtMSkKKyAgICAgKiAgKDIsIGkpKyAgPCAgKC0xLCAtMSkgICAgICAgd2kgICAgICBjdXJzb3JzIG5vdCBlcXVhbCwgYWR2YW5jZSBzbWFsbGVyICgyID4gLTEpCisgICAgICogICgzLCBuKSsgIDwgICgtMSwgLTEpICAgICAgIHdpbiogICAgY3Vyc29ycyBub3QgZXF1YWwsIGFkdmFuY2Ugc21hbGxlciAoMyA+IC0xKQorICAgICAqICAoLTEsIC0xKSAgICAoLTEsIC0xKSAgICAgICAgICAgICAgIGJvdGggZXhoYXN0ZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50ZXJmYWNlIEN1cnNvcjxUPgorICAgIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgY3VycmVudCBkZXNjZW5kLWRlcHRoOyAwLCBpZiB0aGUgY3Vyc29yIGhhcyBqdXN0IGJlZW4gY3JlYXRlZCBhbmQgaXMgcG9zaXRpb25lZCBvbiB0aGUgcm9vdCwKKyAgICAgICAgICogICAgICAgICBhbmQgLTEsIGlmIHRoZSB0cmllIGhhcyBiZWVuIGV4aGF1c3RlZC4KKyAgICAgICAgICovCisgICAgICAgIGludCBkZXB0aCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IHRyYW5zaXRpb24gdGFrZW47IGlmIHBvc2l0aW9uZWQgb24gdGhlIHJvb3QsIHJldHVybiAtMQorICAgICAgICAgKi8KKyAgICAgICAgaW50IGluY29taW5nVHJhbnNpdGlvbigpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBub2RlLiBUaGlzIG1heSBiZSBub24tbnVsbCBmb3IgYW55IHByZXNlbnRlZCBub2RlLCBpbmNsdWRpbmcKKyAgICAgICAgICogICAgICAgICB0aGUgcm9vdC4KKyAgICAgICAgICovCisgICAgICAgIFQgY29udGVudCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZHZhbmNlIG9uZSBwb3NpdGlvbiB0byB0aGUgbm9kZSB3aG9zZSBhc3NvY2lhdGVkIHBhdGggaXMgbmV4dCBsZXhpY29ncmFwaGljYWxseS4KKyAgICAgICAgICogVGhpcyBjYW4gYmUgZWl0aGVyOgorICAgICAgICAgKiAtIGRlc2NlbmRpbmcgb25lIGxldmVsIHRvIHRoZSBmaXJzdCBjaGlsZCBvZiB0aGUgY3VycmVudCBub2RlLAorICAgICAgICAgKiAtIGFzY2VuZGluZyB0byB0aGUgY2xvc2VzdCBwYXJlbnQgdGhhdCBoYXMgcmVtYWluaW5nIGNoaWxkcmVuLCBhbmQgdGhlbiBkZXNjZW5kaW5nIG9uZSBsZXZlbCB0byBpdHMgbmV4dAorICAgICAgICAgKiAgIGNoaWxkLgorICAgICAgICAgKgorICAgICAgICAgKiBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgYWZ0ZXIgdGhlIHRyaWUgaGFzIGFscmVhZHkgYmVlbiBleGhhdXN0ZWQgKGkuZS4gd2hlbiBkZXB0aCgpID09IC0xKTsKKyAgICAgICAgICogZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgd2Ugd29uJ3QgYWx3YXlzIGNoZWNrIHRoaXMuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gZGVwdGggKGNhbiBiZSBwcmV2KzEgb3IgPD1wcmV2KSwgLTEgbWVhbnMgdGhhdCB0aGUgdHJpZSBpcyBleGhhdXN0ZWQKKyAgICAgICAgICovCisgICAgICAgIGludCBhZHZhbmNlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkdmFuY2UsIGRlc2NlbmRpbmcgbXVsdGlwbGUgbGV2ZWxzIGlmIHRoZSBjdXJzb3IgY2FuIGRvIHRoaXMgZm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhvdXQgZXh0cmEgd29yaworICAgICAgICAgKiAoZS5nLiB3aGVuIHBvc2l0aW9uZWQgb24gYSBjaGFpbiBub2RlIGluIGEgbWVtdGFibGUgdHJpZSkuIElmIHRoZSBjdXJyZW50IG5vZGUgZG9lcyBub3QgaGF2ZSBjaGlsZHJlbiB0aGlzCisgICAgICAgICAqIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgYWR2YW5jZSgpLCBvdGhlcndpc2UgaXQgbWF5IHRha2UgbXVsdGlwbGUgc3RlcHMgZG93biAoYnV0IHdpbGwgbm90IG5lY2Vzc2FyaWx5LCBldmVuCisgICAgICAgICAqIGlmIHRoZXkgZXhpc3QpLgorICAgICAgICAgKgorICAgICAgICAgKiBOb3RlIHRoYXQgaWYgYW55IHBvc2l0aW9ucyBhcmUgc2tpcHBlZCwgdGhlaXIgY29udGVudCBtdXN0IGJlIG51bGwuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgaXMgYW4gb3B0aW9uYWwgb3B0aW1pemF0aW9uOyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmYWxscyBiYWNrIHRvIGNhbGxpbmcgYWR2YW5jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIGFmdGVyIHRoZSB0cmllIGhhcyBhbHJlYWR5IGJlZW4gZXhoYXVzdGVkIChpLmUuIHdoZW4gZGVwdGgoKSA9PSAtMSk7CisgICAgICAgICAqIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHdlIHdvbid0IGFsd2F5cyBjaGVjayB0aGlzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVjZWl2ZXIgb2JqZWN0IHRoYXQgd2lsbCByZWNlaXZlIGFsbCB0cmFuc2l0aW9ucyB0YWtlbiBleGNlcHQgdGhlIGxhc3Q7CisgICAgICAgICAqICAgICAgICAgICAgICAgICBvbiBhc2NlbmQsIG9yIGlmIG9ubHkgb25lIHN0ZXAgZG93biB3YXMgdGFrZW4sIGl0IHdpbGwgbm90IHJlY2VpdmUgYW55CisgICAgICAgICAqIEByZXR1cm4gdGhlIG5ldyBkZXB0aCwgLTEgaWYgdGhlIHRyaWUgaXMgZXhoYXVzdGVkCisgICAgICAgICAqLworICAgICAgICBkZWZhdWx0IGludCBhZHZhbmNlTXVsdGlwbGUoVHJhbnNpdGlvbnNSZWNlaXZlciByZWNlaXZlcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFkdmFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZHZhbmNlIGFsbCB0aGUgd2F5IHRvIHRoZSBuZXh0IG5vZGUgd2l0aCBub24tbnVsbCBjb250ZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgYWZ0ZXIgdGhlIHRyaWUgaGFzIGFscmVhZHkgYmVlbiBleGhhdXN0ZWQgKGkuZS4gd2hlbiBkZXB0aCgpID09IC0xKTsKKyAgICAgICAgICogZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgd2Ugd29uJ3QgYWx3YXlzIGNoZWNrIHRoaXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZWNlaXZlciBvYmplY3QgdGhhdCB3aWxsIHJlY2VpdmUgYWxsIHRha2VuIHRyYW5zaXRpb25zCisgICAgICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQsIG51bGwgaWYgdGhlIHRyaWUgaXMgZXhoYXVzdGVkCisgICAgICAgICAqLworICAgICAgICBkZWZhdWx0IFQgYWR2YW5jZVRvQ29udGVudChSZXNldHRpbmdUcmFuc2l0aW9uc1JlY2VpdmVyIHJlY2VpdmVyKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcHJldkRlcHRoID0gZGVwdGgoKTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjdXJyRGVwdGggPSBhZHZhbmNlTXVsdGlwbGUocmVjZWl2ZXIpOworICAgICAgICAgICAgICAgIGlmIChjdXJyRGVwdGggPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHJlY2VpdmVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3VyckRlcHRoIDw9IHByZXZEZXB0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVyLnJlc2V0UGF0aExlbmd0aChjdXJyRGVwdGggLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZXIuYWRkUGF0aEJ5dGUoaW5jb21pbmdUcmFuc2l0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBUIGNvbnRlbnQgPSBjb250ZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7CisgICAgICAgICAgICAgICAgcHJldkRlcHRoID0gY3VyckRlcHRoOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElnbm9yZSB0aGUgY3VycmVudCBub2RlJ3MgY2hpbGRyZW4gYW5kIGFkdmFuY2UgdG8gdGhlIG5leHQgY2hpbGQgb2YgdGhlIGNsb3Nlc3Qgbm9kZSBvbiB0aGUgcGFyZW50IGNoYWluIHRoYXQKKyAgICAgICAgICogaGFzIGFueS4KKyAgICAgICAgICoKKyAgICAgICAgICogSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIGFmdGVyIHRoZSB0cmllIGhhcyBhbHJlYWR5IGJlZW4gZXhoYXVzdGVkIChpLmUuIHdoZW4gZGVwdGgoKSA9PSAtMSk7CisgICAgICAgICAqIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHdlIHdvbid0IGFsd2F5cyBjaGVjayB0aGlzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBuZXcgZGVwdGgsIGFsd2F5cyA8PSBwcmV2aW91cyBkZXB0aDsgLTEgaWYgdGhlIHRyaWUgaXMgZXhoYXVzdGVkCisgICAgICAgICAqLworICAgICAgICBpbnQgc2tpcENoaWxkcmVuKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEN1cnNvcjxUPiBjdXJzb3IoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYnkge0BsaW5rIEN1cnNvciNhZHZhbmNlTXVsdGlwbGV9IHRvIGZlZWQgdGhlIHRyYW5zaXRpb25zIHRha2VuLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgVHJhbnNpdGlvbnNSZWNlaXZlcgorICAgIHsKKyAgICAgICAgLyoqIEFkZCBhIHNpbmdsZSBieXRlIHRvIHRoZSBwYXRoLiAqLworICAgICAgICB2b2lkIGFkZFBhdGhCeXRlKGludCBuZXh0Qnl0ZSk7CisgICAgICAgIC8qKiBBZGQgdGhlIGNvdW50IGJ5dGVzIGZyb20gcG9zaXRpb24gcG9zIGluIHRoZSBnaXZlbiBidWZmZXIuICovCisgICAgICAgIHZvaWQgYWRkUGF0aEJ5dGVzKERpcmVjdEJ1ZmZlciBidWZmZXIsIGludCBwb3MsIGludCBjb3VudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCBieSB7QGxpbmsgQ3Vyc29yI2FkdmFuY2VUb0NvbnRlbnR9IHRvIHRyYWNrIHRoZSB0cmFuc2l0aW9ucyBhbmQgYmFja3RyYWNraW5nIHRha2VuLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgUmVzZXR0aW5nVHJhbnNpdGlvbnNSZWNlaXZlciBleHRlbmRzIFRyYW5zaXRpb25zUmVjZWl2ZXIKKyAgICB7CisgICAgICAgIC8qKiBEZWxldGUgYWxsIGJ5dGVzIGJleW9uZCB0aGUgZ2l2ZW4gbGVuZ3RoLiAqLworICAgICAgICB2b2lkIHJlc2V0UGF0aExlbmd0aChpbnQgbmV3TGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHB1c2ggaW50ZXJmYWNlIGZvciB3YWxraW5nIG92ZXIgdGhlIHRyaWUuIEJ1aWxkcyB1cG9uIFRyYW5zaXRpb25zUmVjZWl2ZXIgdG8gYmUgZ2l2ZW4gdGhlIGJ5dGVzIG9mIHRoZQorICAgICAqIHBhdGgsIGFuZCBhZGRzIG1ldGhvZHMgY2FsbGVkIG9uIGVuY291bnRlcmluZyBjb250ZW50IGFuZCBjb21wbGV0aW9uLgorICAgICAqIFNlZSB7QGxpbmsgVHJpZUR1bXBlcn0gZm9yIGFuIGV4YW1wbGUgb2YgaG93IHRoaXMgY2FuIGJlIHVzZWQsIGFuZCB7QGxpbmsgVHJpZUVudHJpZXNXYWxrZXJ9IGFzIGEgYmFzZSBjbGFzcworICAgICAqIGZvciBvdGhlciBjb21tb24gdXNhZ2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnRlcmZhY2UgV2Fsa2VyPFQsIFI+IGV4dGVuZHMgUmVzZXR0aW5nVHJhbnNpdGlvbnNSZWNlaXZlcgorICAgIHsKKyAgICAgICAgLyoqIENhbGxlZCB3aGVuIGNvbnRlbnQgaXMgZm91bmQuICovCisgICAgICAgIHZvaWQgY29udGVudChUIGNvbnRlbnQpOworCisgICAgICAgIC8qKiBDYWxsZWQgYXQgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHdhbGsuICovCisgICAgICAgIFIgY29tcGxldGUoKTsKKyAgICB9CisKKyAgICAvLyBWZXJzaW9uIG9mIHRoZSBieXRlIGNvbXBhcmFibGUgY29udmVyc2lvbiB0byB1c2UgZm9yIGFsbCBvcGVyYXRpb25zCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OID0gQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MDsKKworICAgIC8qKgorICAgICAqIEFkYXB0ZXIgaW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgbWV0aG9kcyBhIHtAbGluayBXYWxrZXJ9IHRvIGEge0BsaW5rIENvbnN1bWVyfSwgc28gdGhhdCB0aGUgbGF0dGVyIGNhbiBiZSB1c2VkCisgICAgICogd2l0aCB7QGxpbmsgI3Byb2Nlc3N9LgorICAgICAqCisgICAgICogVGhpcyBlbmFibGVzIGNhbGxzIGxpa2UKKyAgICAgKiAgICAgdHJpZS5mb3JFYWNoRW50cnkoeCAtPiBTeXN0ZW0ub3V0LnByaW50bG4oeCkpOworICAgICAqIHRvIGJlIG1hcHBlZCBkaXJlY3RseSB0byBhIHNpbmdsZSBjYWxsIHRvIHtAbGluayAjcHJvY2Vzc30gd2l0aG91dCBleHRyYSBhbGxvY2F0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIFZhbHVlQ29uc3VtZXI8VD4gZXh0ZW5kcyBDb25zdW1lcjxUPiwgV2Fsa2VyPFQsIFZvaWQ+CisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgZGVmYXVsdCB2b2lkIGNvbnRlbnQoVCBjb250ZW50KQorICAgICAgICB7CisgICAgICAgICAgICBhY2NlcHQoY29udGVudCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgZGVmYXVsdCBWb2lkIGNvbXBsZXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgZGVmYXVsdCB2b2lkIHJlc2V0UGF0aExlbmd0aChpbnQgbmV3RGVwdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vdCB0cmFja2luZyBwYXRoCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgZGVmYXVsdCB2b2lkIGFkZFBhdGhCeXRlKGludCBuZXh0Qnl0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90IHRyYWNraW5nIHBhdGgKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBkZWZhdWx0IHZvaWQgYWRkUGF0aEJ5dGVzKERpcmVjdEJ1ZmZlciBidWZmZXIsIGludCBwb3MsIGludCBjb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90IHRyYWNraW5nIHBhdGgKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgdGhlIGdpdmVuIGNvbnN1bWVyIG9uIGFsbCBjb250ZW50IHZhbHVlcyBpbiB0aGUgdHJpZSBpbiBvcmRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmb3JFYWNoVmFsdWUoVmFsdWVDb25zdW1lcjxUPiBjb25zdW1lcikKKyAgICB7CisgICAgICAgIHByb2Nlc3MoY29uc3VtZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGwgdGhlIGdpdmVuIGNvbnN1bWVyIG9uIGFsbCAocGF0aCwgY29udGVudCkgcGFpcnMgd2l0aCBub24tbnVsbCBjb250ZW50IGluIHRoZSB0cmllIGluIG9yZGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZvckVhY2hFbnRyeShCaUNvbnN1bWVyPEJ5dGVDb21wYXJhYmxlLCBUPiBjb25zdW1lcikKKyAgICB7CisgICAgICAgIHByb2Nlc3MobmV3IFRyaWVFbnRyaWVzV2Fsa2VyLldpdGhDb25zdW1lcjxUPihjb25zdW1lcikpOworICAgICAgICAvLyBOb3RlOiB3ZSBjYW4ndCBkbyB0aGUgVmFsdWVDb25zdW1lciB0cmljayBoZXJlLCBiZWNhdXNlIHRoZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyBzdGF0ZSBhbmQgY2Fubm90IGJlCisgICAgICAgIC8vIGltcGxlbWVudGVkIHdpdGggZGVmYXVsdCBtZXRob2RzIGFsb25lLgorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHRyaWUgdXNpbmcgdGhlIGdpdmVuIFdhbGtlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFI+IFIgcHJvY2VzcyhXYWxrZXI8VCwgUj4gd2Fsa2VyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3Mod2Fsa2VyLCBjdXJzb3IoKSk7CisgICAgfQorCisgICAgc3RhdGljIDxULCBSPiBSIHByb2Nlc3MoV2Fsa2VyPFQsIFI+IHdhbGtlciwgQ3Vyc29yPFQ+IGN1cnNvcikKKyAgICB7CisgICAgICAgIGFzc2VydCBjdXJzb3IuZGVwdGgoKSA9PSAwIDogIlRoZSBwcm92aWRlZCBjdXJzb3IgaGFzIGFscmVhZHkgYmVlbiBhZHZhbmNlZC4iOworICAgICAgICBUIGNvbnRlbnQgPSBjdXJzb3IuY29udGVudCgpOyAgIC8vIGhhbmRsZSBjb250ZW50IG9uIHRoZSByb290IG5vZGUKKyAgICAgICAgaWYgKGNvbnRlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgIGNvbnRlbnQgPSBjdXJzb3IuYWR2YW5jZVRvQ29udGVudCh3YWxrZXIpOworCisgICAgICAgIHdoaWxlIChjb250ZW50ICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhbGtlci5jb250ZW50KGNvbnRlbnQpOworICAgICAgICAgICAgY29udGVudCA9IGN1cnNvci5hZHZhbmNlVG9Db250ZW50KHdhbGtlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdhbGtlci5jb21wbGV0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0dWN0IGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHJpZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGR1bXAoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGR1bXAoT2JqZWN0Ojp0b1N0cmluZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3R1Y3QgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0cmllIHVzaW5nIHRoZSBnaXZlbiBjb250ZW50LXRvLXN0cmluZyBtYXBwZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBkdW1wKEZ1bmN0aW9uPFQsIFN0cmluZz4gY29udGVudFRvU3RyaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3MobmV3IFRyaWVEdW1wZXI8Pihjb250ZW50VG9TdHJpbmcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2luZ2xldG9uIHRyaWUgbWFwcGluZyB0aGUgZ2l2ZW4gYnl0ZSBwYXRoIHRvIGNvbnRlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVHJpZTxUPiBzaW5nbGV0b24oQnl0ZUNvbXBhcmFibGUgYiwgVCB2KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGV0b25UcmllPD4oYiwgdik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZpZXcgb2YgdGhlIHN1YnRyaWUgY29udGFpbmluZyBldmVyeXRoaW5nIGluIHRoaXMgdHJpZSB3aG9zZSBrZXlzIGZhbGwgYmV0d2VlbiB0aGUgZ2l2ZW4gYm91bmRhcmllcy4KKyAgICAgKiBUaGUgdmlldyBpcyBsaXZlLCBpLmUuIGFueSB3cml0ZSB0byB0aGUgc291cmNlIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBzdWJ0cmllLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY2hlY2sgaXRzIGFyZ3VtZW50cyBmb3IgY29ycmVjdG5lc3MuIFRoZSByZXN1bHRpbmcgdHJpZSBtYXkgYmUgZW1wdHkgb3IgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICogaWYgdGhlIHJpZ2h0IGJvdW5kIGlzIHNtYWxsZXIgdGhhbiB0aGUgbGVmdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWZ0IHRoZSBsZWZ0IGJvdW5kIGZvciB0aGUgcmV0dXJuZWQgc3VidHJpZS4gSWYge0Bjb2RlIG51bGx9LCB0aGUgcmVzdWx0aW5nIHN1YnRyaWUgaXMgbm90IGxlZnQtYm91bmRlZC4KKyAgICAgKiBAcGFyYW0gaW5jbHVkZUxlZnQgd2hldGhlciB7QGNvZGUgbGVmdH0gaXMgYW4gaW5jbHVzaXZlIGJvdW5kIG9mIG5vdC4KKyAgICAgKiBAcGFyYW0gcmlnaHQgdGhlIHJpZ2h0IGJvdW5kIGZvciB0aGUgcmV0dXJuZWQgc3VidHJpZS4gSWYge0Bjb2RlIG51bGx9LCB0aGUgcmVzdWx0aW5nIHN1YnRyaWUgaXMgbm90IHJpZ2h0LWJvdW5kZWQuCisgICAgICogQHBhcmFtIGluY2x1ZGVSaWdodCB3aGV0aGVyIHtAY29kZSByaWdodH0gaXMgYW4gaW5jbHVzaXZlIGJvdW5kIG9mIG5vdC4KKyAgICAgKiBAcmV0dXJuIGEgdmlldyBvZiB0aGUgc3VidHJpZSBjb250YWluaW5nIGFsbCB0aGUga2V5cyBvZiB0aGlzIHRyaWUgZmFsbGluZyBiZXR3ZWVuIHtAY29kZSBsZWZ0fSAoaW5jbHVzaXZlbHkgaWYKKyAgICAgKiB7QGNvZGUgaW5jbHVkZUxlZnR9KSBhbmQge0Bjb2RlIHJpZ2h0fSAoaW5jbHVzaXZlbHkgaWYge0Bjb2RlIGluY2x1ZGVSaWdodH0pLgorICAgICAqLworICAgIHB1YmxpYyBUcmllPFQ+IHN1YnRyaWUoQnl0ZUNvbXBhcmFibGUgbGVmdCwgYm9vbGVhbiBpbmNsdWRlTGVmdCwgQnl0ZUNvbXBhcmFibGUgcmlnaHQsIGJvb2xlYW4gaW5jbHVkZVJpZ2h0KQorICAgIHsKKyAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIHJldHVybiBuZXcgU2xpY2VkVHJpZTw+KHRoaXMsIGxlZnQsIGluY2x1ZGVMZWZ0LCByaWdodCwgaW5jbHVkZVJpZ2h0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdmlldyBvZiB0aGUgc3VidHJpZSBjb250YWluaW5nIGV2ZXJ5dGhpbmcgaW4gdGhpcyB0cmllIHdob3NlIGtleXMgZmFsbCBiZXR3ZWVuIHRoZSBnaXZlbiBib3VuZGFyaWVzLAorICAgICAqIGxlZnQtaW5jbHVzaXZlIGFuZCByaWdodC1leGNsdXNpdmUuCisgICAgICogVGhlIHZpZXcgaXMgbGl2ZSwgaS5lLiBhbnkgd3JpdGUgdG8gdGhlIHNvdXJjZSB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgc3VidHJpZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNoZWNrIGl0cyBhcmd1bWVudHMgZm9yIGNvcnJlY3RuZXNzLiBUaGUgcmVzdWx0aW5nIHRyaWUgbWF5IGJlIGVtcHR5IG9yIHRocm93IGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIHRoZSByaWdodCBib3VuZCBpcyBzbWFsbGVyIHRoYW4gdGhlIGxlZnQuCisgICAgICoKKyAgICAgKiBFcXVpdmFsZW50IHRvIGNhbGxpbmcgc3VidHJpZShsZWZ0LCB0cnVlLCByaWdodCwgZmFsc2UpLgorICAgICAqCisgICAgICogQHBhcmFtIGxlZnQgdGhlIGxlZnQgYm91bmQgZm9yIHRoZSByZXR1cm5lZCBzdWJ0cmllLiBJZiB7QGNvZGUgbnVsbH0sIHRoZSByZXN1bHRpbmcgc3VidHJpZSBpcyBub3QgbGVmdC1ib3VuZGVkLgorICAgICAqIEBwYXJhbSByaWdodCB0aGUgcmlnaHQgYm91bmQgZm9yIHRoZSByZXR1cm5lZCBzdWJ0cmllLiBJZiB7QGNvZGUgbnVsbH0sIHRoZSByZXN1bHRpbmcgc3VidHJpZSBpcyBub3QgcmlnaHQtYm91bmRlZC4KKyAgICAgKiBAcmV0dXJuIGEgdmlldyBvZiB0aGUgc3VidHJpZSBjb250YWluaW5nIGFsbCB0aGUga2V5cyBvZiB0aGlzIHRyaWUgZmFsbGluZyBiZXR3ZWVuIHtAY29kZSBsZWZ0fSAoaW5jbHVzaXZlbHkgaWYKKyAgICAgKiB7QGNvZGUgaW5jbHVkZUxlZnR9KSBhbmQge0Bjb2RlIHJpZ2h0fSAoaW5jbHVzaXZlbHkgaWYge0Bjb2RlIGluY2x1ZGVSaWdodH0pLgorICAgICAqLworICAgIHB1YmxpYyBUcmllPFQ+IHN1YnRyaWUoQnl0ZUNvbXBhcmFibGUgbGVmdCwgQnl0ZUNvbXBhcmFibGUgcmlnaHQpCisgICAgeworICAgICAgICByZXR1cm4gc3VidHJpZShsZWZ0LCB0cnVlLCByaWdodCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9yZGVyZWQgZW50cnkgc2V0IG9mIHRoaXMgdHJpZSdzIGNvbnRlbnQgYXMgYW4gaXRlcmFibGUuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhYmxlPE1hcC5FbnRyeTxCeXRlQ29tcGFyYWJsZSwgVD4+IGVudHJ5U2V0KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzOjplbnRyeUl0ZXJhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9yZGVyZWQgZW50cnkgc2V0IG9mIHRoaXMgdHJpZSdzIGNvbnRlbnQgaW4gYW4gaXRlcmF0b3IuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhdG9yPE1hcC5FbnRyeTxCeXRlQ29tcGFyYWJsZSwgVD4+IGVudHJ5SXRlcmF0b3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUcmllRW50cmllc0l0ZXJhdG9yLkFzRW50cmllczw+KHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9yZGVyZWQgc2V0IG9mIHZhbHVlcyBvZiB0aGlzIHRyaWUgYXMgYW4gaXRlcmFibGUuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhYmxlPFQ+IHZhbHVlcygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpczo6dmFsdWVJdGVyYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIHNldCBvZiB2YWx1ZXMgb2YgdGhpcyB0cmllIGluIGFuIGl0ZXJhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvcjxUPiB2YWx1ZUl0ZXJhdG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVHJpZVZhbHVlc0l0ZXJhdG9yPD4odGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWVzIGluIGFueSBvcmRlci4gRm9yIHNvbWUgdHJpZXMgdGhpcyBpcyBtdWNoIGZhc3RlciB0aGFuIHRoZSBvcmRlcmVkIGl0ZXJhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYWJsZTxUPiB2YWx1ZXNVbm9yZGVyZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmVyIG9mIGNvbnRlbnQgb2YgbWVyZ2VkIG5vZGVzLCB1c2VkIGZvciB0d28tc291cmNlIG1lcmdlcyAoaS5lLiBtZXJnZVdpdGgpLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgTWVyZ2VSZXNvbHZlcjxUPgorICAgIHsKKyAgICAgICAgLy8gTm90ZTogTm8gZ3VhcmFudGVlcyBhYm91dCBhcmd1bWVudCBvcmRlci4KKyAgICAgICAgLy8gRS5nLiBkdXJpbmcgdDEubWVyZ2VXaXRoKHQyLCByZXNvbHZlciksIHJlc29sdmVyIG1heSBiZSBjYWxsZWQgd2l0aCB0MSBvciB0MidzIGl0ZW1zIGFzIGZpcnN0IGFyZ3VtZW50LgorICAgICAgICBUIHJlc29sdmUoVCBiMSwgVCBiMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZpZXcgb2YgdGhlIG1lcmdlIG9mIHRoaXMgdHJpZSB3aXRoIHRoZSBnaXZlbiBvbmUuIFRoZSB2aWV3IGlzIGxpdmUsIGkuZS4gYW55IHdyaXRlIHRvIGFueSBvZiB0aGUKKyAgICAgKiBzb3VyY2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBtZXJnZWQgdmlldy4KKyAgICAgKgorICAgICAqIElmIHRoZXJlIGlzIGNvbnRlbnQgZm9yIGEgZ2l2ZW4ga2V5IGluIGJvdGggc291cmNlcywgdGhlIHJlc29sdmVyIHdpbGwgYmUgY2FsbGVkIHRvIG9idGFpbiB0aGUgY29tYmluYXRpb24uCisgICAgICogKFRoZSByZXNvbHZlciB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgdGhlcmUncyBjb250ZW50IGZyb20gb25seSBvbmUgc291cmNlLikKKyAgICAgKi8KKyAgICBwdWJsaWMgVHJpZTxUPiBtZXJnZVdpdGgoVHJpZTxUPiBvdGhlciwgTWVyZ2VSZXNvbHZlcjxUPiByZXNvbHZlcikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTWVyZ2VUcmllPD4ocmVzb2x2ZXIsIHRoaXMsIG90aGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlciBvZiBjb250ZW50IG9mIG1lcmdlZCBub2Rlcy4KKyAgICAgKgorICAgICAqIFRoZSByZXNvbHZlcidzIG1ldGhvZHMgYXJlIG9ubHkgY2FsbGVkIGlmIG1vcmUgdGhhbiBvbmUgb2YgdGhlIG1lcmdlZCBub2RlcyBjb250YWluIGNvbnRlbnQsIGFuZCB0aGUKKyAgICAgKiBvcmRlciBpbiB3aGljaCB0aGUgYXJndW1lbnRzIGFyZSBnaXZlbiBpcyBub3QgZGVmaW5lZC4gT25seSBwcmVzZW50IG5vbi1udWxsIHZhbHVlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQorICAgICAqIGNvbGxlY3Rpb24gcGFzc2VkIHRvIHRoZSByZXNvbHZpbmcgbWV0aG9kcy4KKyAgICAgKgorICAgICAqIENhbiBhbHNvIGJlIHVzZWQgYXMgYSB0d28tc291cmNlIHJlc29sdmVyLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ29sbGVjdGlvbk1lcmdlUmVzb2x2ZXI8VD4gZXh0ZW5kcyBNZXJnZVJlc29sdmVyPFQ+CisgICAgeworICAgICAgICBUIHJlc29sdmUoQ29sbGVjdGlvbjxUPiBjb250ZW50cyk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGRlZmF1bHQgVCByZXNvbHZlKFQgYzEsIFQgYzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByZXNvbHZlKEltbXV0YWJsZUxpc3Qub2YoYzEsIGMyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uTWVyZ2VSZXNvbHZlcjxPYmplY3Q+IFRIUk9XSU5HX1JFU09MVkVSID0gbmV3IENvbGxlY3Rpb25NZXJnZVJlc29sdmVyPE9iamVjdD4oKQorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgcmVzb2x2ZShDb2xsZWN0aW9uPE9iamVjdD4gY29udGVudHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IGVycm9yKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEFzc2VydGlvbkVycm9yIGVycm9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJFbnRyaWVzIG11c3QgYmUgZGlzdGluY3QuIik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHJlc29sdmVyIHRoYXQgdGhyb3dzIHdoZW5ldmVyIG1vcmUgdGhhbiBvbmUgb2YgdGhlIG1lcmdlZCBub2RlcyBjb250YWlucyBjb250ZW50LgorICAgICAqIENhbiBiZSB1c2VkIHRvIG1lcmdlIHRyaWVzIHRoYXQgYXJlIGtub3duIHRvIGhhdmUgZGlzdGluY3QgY29udGVudCBwYXRocy4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBDb2xsZWN0aW9uTWVyZ2VSZXNvbHZlcjxUPiB0aHJvd2luZ1Jlc29sdmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoQ29sbGVjdGlvbk1lcmdlUmVzb2x2ZXI8VD4pIFRIUk9XSU5HX1JFU09MVkVSOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2aWV3IG9mIHRoZSBtZXJnZSBvZiBtdWx0aXBsZSB0cmllcy4gVGhlIHZpZXcgaXMgbGl2ZSwgaS5lLiBhbnkgd3JpdGUgdG8gYW55IG9mIHRoZQorICAgICAqIHNvdXJjZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIG1lcmdlZCB2aWV3LgorICAgICAqCisgICAgICogSWYgdGhlcmUgaXMgY29udGVudCBmb3IgYSBnaXZlbiBrZXkgaW4gbW9yZSB0aGFuIG9uZSBzb3VyY2VzLCB0aGUgcmVzb2x2ZXIgd2lsbCBiZSBjYWxsZWQgdG8gb2J0YWluIHRoZQorICAgICAqIGNvbWJpbmF0aW9uLiAoVGhlIHJlc29sdmVyIHdpbGwgbm90IGJlIGNhbGxlZCBpZiB0aGVyZSdzIGNvbnRlbnQgZnJvbSBvbmx5IG9uZSBzb3VyY2UuKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFRyaWU8VD4gbWVyZ2UoQ29sbGVjdGlvbjw/IGV4dGVuZHMgVHJpZTxUPj4gc291cmNlcywgQ29sbGVjdGlvbk1lcmdlUmVzb2x2ZXI8VD4gcmVzb2x2ZXIpCisgICAgeworICAgICAgICBzd2l0Y2ggKHNvdXJjZXMuc2l6ZSgpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJldHVybiBlbXB0eSgpOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZXR1cm4gc291cmNlcy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICB7CisgICAgICAgICAgICBJdGVyYXRvcjw/IGV4dGVuZHMgVHJpZTxUPj4gaXQgPSBzb3VyY2VzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBUcmllPFQ+IHQxID0gaXQubmV4dCgpOworICAgICAgICAgICAgVHJpZTxUPiB0MiA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIHJldHVybiB0MS5tZXJnZVdpdGgodDIsIHJlc29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uTWVyZ2VUcmllPD4oc291cmNlcywgcmVzb2x2ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZpZXcgb2YgdGhlIG1lcmdlIG9mIG11bHRpcGxlIHRyaWVzLCB3aGVyZSBlYWNoIHNvdXJjZSBtdXN0IGhhdmUgZGlzdGluY3Qga2V5cy4gVGhlIHZpZXcgaXMgbGl2ZSwKKyAgICAgKiBpLmUuIGFueSB3cml0ZSB0byBhbnkgb2YgdGhlIHNvdXJjZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIG1lcmdlZCB2aWV3LgorICAgICAqCisgICAgICogSWYgdGhlcmUgaXMgY29udGVudCBmb3IgYSBnaXZlbiBrZXkgaW4gbW9yZSB0aGFuIG9uZSBzb3VyY2VzLCB0aGUgbWVyZ2Ugd2lsbCB0aHJvdyBhbiBhc3NlcnRpb24gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVHJpZTxUPiBtZXJnZURpc3RpbmN0KENvbGxlY3Rpb248PyBleHRlbmRzIFRyaWU8VD4+IHNvdXJjZXMpCisgICAgeworICAgICAgICBzd2l0Y2ggKHNvdXJjZXMuc2l6ZSgpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJldHVybiBlbXB0eSgpOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZXR1cm4gc291cmNlcy5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICB7CisgICAgICAgICAgICBJdGVyYXRvcjw/IGV4dGVuZHMgVHJpZTxUPj4gaXQgPSBzb3VyY2VzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBUcmllPFQ+IHQxID0gaXQubmV4dCgpOworICAgICAgICAgICAgVHJpZTxUPiB0MiA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWVyZ2VUcmllLkRpc3RpbmN0PD4odDEsIHQyKTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xsZWN0aW9uTWVyZ2VUcmllLkRpc3RpbmN0PD4oc291cmNlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmllPE9iamVjdD4gRU1QVFkgPSBuZXcgVHJpZTxPYmplY3Q+KCkKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBDdXJzb3I8T2JqZWN0PiBjdXJzb3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvcjxPYmplY3Q+KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZGVwdGggPSAwOworCisgICAgICAgICAgICAgICAgcHVibGljIGludCBhZHZhbmNlKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXB0aCA9IC0xOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgc2tpcENoaWxkcmVuKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXB0aCA9IC0xOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgZGVwdGgoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlcHRoOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY29udGVudCgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGluY29taW5nVHJhbnNpdGlvbigpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUcmllPFQ+IGVtcHR5KCkKKyAgICB7CisgICAgICAgIHJldHVybiAoVHJpZTxUPikgRU1QVFk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZS5tZCBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI2NTg3MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWUubWQKQEAgLTAsMCArMSwyNTIgQEAKKzwhLS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIAorICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAKKyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworIyBgVHJpZWAgaW50ZXJmYWNlCisKK1RyaWVzIGluIENhc3NhbmRyYSBhcmUgdXNlZCB0byByZXByZXNlbnQga2V5LXZhbHVlIG1hcHBpbmdzIGluIGFuIGVmZmljaWVudCB3YXksIGN1cnJlbnRseSBvbmx5IGZvciB0aGUgcGFydGl0aW9uIG1hcAoraW4gYSBtZW10YWJsZS4gVGhlIGRlc2lnbiB3ZSB1c2UgaXMgZm9jdXNzZWQgb24gcGVyZm9ybWluZyB0aGUgZXF1aXZhbGVudCBvZiBhIHJlYWQgcXVlcnksIGJlaW5nIGFibGUgdG8gbW9zdCBlZmZpY2llbnRseToKKy0gY29tYmluZSBtdWx0aXBsZSBzb3VyY2VzIHdoaWxlIG1haW50YWluaW5nIG9yZGVyLAorLSByZXN0cmljdCB0aGUgY29tYmluYXRpb24gdG8gYSByYW5nZSBvZiBrZXlzLAorLSBlZmZpY2llbnRseSB3YWxrIHRoZSByZXN1bHQgYW5kIGV4dHJhY3QgYWxsIGNvdmVyZWQga2V5LXZhbHVlIGNvbWJpbmF0aW9ucy4KKworRm9yIHRoaXMgdGhlIGBUcmllYCBpbnRlcmZhY2UgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBwdWJsaWMgbWV0aG9kczoKKy0gQ29uc3VtaW5nIHRoZSBjb250ZW50IHVzaW5nIGBmb3JFYWNoVmFsdWVgIG9yIGBmb3JFYWNoRW50cnlgLgorLSBDb252ZXJzaW9uIHRvIGl0ZXJhYmxlIGFuZCBpdGVyYXRvciB1c2luZyBgdmFsdWVzL3ZhbHVlc0l0ZXJhdG9yYCBhbmQgYGVudHJ5U2V0L2VudHJ5SXRlcmF0b3JgLgorLSBHZXR0aW5nIGEgdmlldyBvZiB0aGUgc3VidHJpZSBiZXR3ZWVuIGEgZ2l2ZW4gcGFpciBvZiBib3VuZHMgdXNpbmcgYHN1YnRyaWVgLgorLSBNZXJnaW5nIHR3byBvciBtdWx0aXBsZSB0cmllcyB0b2dldGhlciB1c2luZyBgbWVyZ2VXaXRoYCBhbmQgdGhlIHN0YXRpYyBgbWVyZ2VgLgorLSBDb25zdHJ1Y3RpbmcgYHNpbmdsZXRvbmAgdHJpZXMgcmVwcmVzZW50aW5nIGEgc2luZ2xlIGtleS10by12YWx1ZSBtYXBwaW5nLgorCitUaGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSB0cmllIGlzIGdpdmVuIGJ5IGEgYEN1cnNvcmAsIHdoaWNoIHByb3ZpZGVzIGEgbWV0aG9kIG9mIHdhbGtpbmcgdGhlIG5vZGVzIG9mIHRoZSB0cmllIAoraW4gb3JkZXIsIGFuZCB0byB3aGljaCB2YXJpb3VzIHRyYW5zZm9ybWF0aW9ucyBsaWtlIG1lcmdlcyBhbmQgaW50ZXJzZWN0aW9ucyBjYW4gYmUgZWFzaWx5IGFuZCBlZmZpY2llbnRseSBhcHBsaWVkLgorVGhlIHNlY3Rpb25zIGJlbG93IGRldGFpbCB0aGUgbW90aXZhdGlvbiBiZWhpbmQgdGhpcyBkZXNpZ24gYXMgd2VsbCBhcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBiYXNpYyBvcGVyYXRpb25zLgorCisjIyBXYWxraW5nIGEgdHJpZQorCitXYWxraW5nIGEgYFRyaWVgIGlzIGFjaGlldmVkIHVzaW5nIGEgY3Vyc29yLiBCZWZvcmUgd2UgZGVzY3JpYmUgaXQgaW4gZGV0YWlsLCBsZXQncyBnaXZlIGEgcXVpY2sgZXhhbXBsZSBvZiB3aGF0IGEKK2NsYXNzaWMgdHJpZSB3YWxrIGxvb2tzIGxpa2UgYW5kIGhvdyBpdCBjYW4gYmUgb3B0aW1pemVkLiBTdXBwb3NlIHdlIHdhbnQgdG8gd2FsayB0aGUgZm9sbG93aW5nIHRyaWU6CisKKyFbZ3JhcGhdKEluTWVtb3J5VHJpZS5tZC53MS5zdmcpCisKKyhOb3RlOiB0aGUgbm9kZSBsYWJlbHMgYXJlIGBJbk1lbW9yeVRyaWVgIG5vZGUgSURzIHdoaWNoIGNhbiBiZSBpZ25vcmVkIGhlcmUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBgY29udGVudEFycmF5W3hdYCAKK29uZXMgd2hpY2ggc3BlY2lmeSB0aGF0IHRoZSByZWxldmFudCBub2RlIGhhcyBzb21lIGFzc29jaWF0ZWQgY29udGVudC4pCisKK1RoZSBjbGFzc2ljIHdhbGsgZGVzY2VuZHMgKDxzcGFuIHN0eWxlPSJjb2xvcjpsaWdodGJsdWUiPmxpZ2h0IGJsdWU8L3NwYW4+KSBvbiBldmVyeSBjaGFyYWN0ZXIgYW5kIGJhY2t0cmFja3MgCisoPHNwYW4gc3R5bGU9ImNvbG9yOnBpbmsiPnBpbms8L3NwYW4+KSB0byB0aGUgcGFyZW50LCByZXN1bHRpbmcgaW4gdGhlIGZvbGxvd2luZyB3YWxrOgorCishW2dyYXBoXShJbk1lbW9yeVRyaWUubWQudzIuc3ZnKQorCitPbmUgY2FuIHNlZSBmcm9tIHRoaXMgZ3JhcGggdGhhdCBtYW55IG9mIHRoZSBiYWNrdHJhY2tpbmcgc3RlcHMgYXJlIG9ubHkgdGFrZW4gc28gdGhhdCB0aGV5IGNhbiBpbW1lZGlhdGVseSBiZSBmb2xsb3dlZAorYnkgYW5vdGhlciBiYWNrdHJhY2tpbmcgc3RlcC4gV2Ugb2Z0ZW4gYWxzbyBrbm93IGluIGFkdmFuY2UgdGhhdCBhIG5vZGUgZG9lcyBub3QgbmVlZCB0byBiZSBleGFtaW5lZCBmdXJ0aGVyIG9uIHRoZSB3YXkKK2JhY2s6IGlmIGl0IG9ubHkgaGFzIG9uZSBjaGlsZCAod2hpY2ggaXMgYWx3YXlzIHRoZSBjYXNlIGZvciBhbGwgbm9kZXMgaW4gYSBgQ2hhaW5gKSwgb3IgaWYgd2UgYXJlIGRlc2NlbmRpbmcgaW50byAKK2l0cyBsYXN0IGNoaWxkICh3aGljaCBpcyBlYXN5IHRvIGNoZWNrIGZvciBgU3BhcnNlYCBub2RlcykuIFRoaXMgc2ltcGxpZmllcyB0aGUgd2FsayB0bzoKKworIVtncmFwaF0oSW5NZW1vcnlUcmllLm1kLnczLnN2ZykKKworSW4gYWRkaXRpb24gdG8gbWFraW5nIHRoZSB3YWxrIHNpbXBsZXIsIHNob3J0ZW5pbmcgdGhlIGJhY2t0cmFja2luZyBwYXRocyBtZWFucyBhIHNtYWxsZXIgd2FsayBzdGF0ZSByZXByZXNlbnRhdGlvbiwKK3doaWNoIGlzIHF1aXRlIGhlbHBmdWwgaW4ga2VlcGluZyB0aGUgZ2FyYmFnZSBjb2xsZWN0aW9uIGNvc3QgZG93bi4gSW4gdGhpcyBleGFtcGxlLCB0aGUgYmFja3RyYWNraW5nIHN0YXRlIG9mIHRoZSB3YWxrCithdCB0aGUgInRyYWN0b3IiIG5vZGUgaXMgb25seSBgWygidHIiLCBjaGlsZCAyKV1gLCBjaGFuZ2VzIHRvIGBbKCJ0ciIsIGNoaWxkIDMpXWAgb24gZGVzY2VudCB0byAidHJlIiwgYW5kIGJlY29tZXMgZW1wdHkKKyhhcyAidHIiIGhhcyBubyBmdXJ0aGVyIGNoaWxkcmVuIGFuZCBjYW4gYmUgcmVtb3ZlZCkgb24gZGVzY2VudCB0byAidHJpIi4gIAorCitPbmUgZnVydGhlciBvcHRpbWl6YXRpb24gb2YgdGhlIHdhbGsgaXMgdG8ganVtcCBkaXJlY3RseSB0byB0aGUgbmV4dCBjaGlsZCB3aXRob3V0IHN0b3BwaW5nIGF0IGEgYnJhbmNoaW5nIHBhcmVudCAobm90ZToKK3RoZSBibGFjayBhcnJvd3MgcmVwcmVzZW50IHRoZSB0cmllIHN0cnVjdHVyZSk6CisKKyFbZ3JhcGhdKEluTWVtb3J5VHJpZS5tZC53YzEuc3ZnKQorCitUaGlzIGdyYXBoIGlzIHdoYXQgYSBjdXJzb3Igd2FsayBvdmVyIHRoaXMgdHJpZSBpcy4gTG9va2luZyBjbG9zZWx5IGF0IHRoZSBncmFwaCwgb25lIGNhbiBzZWUgdGhhdCBpdCBzdG9wcyBleGFjdGx5IG9uY2UKK29uIGVhY2ggbm9kZSwgYW5kIHRoYXQgdGhlIG5vZGVzIGFyZSB2aXNpdGVkIGluIGxleGljb2dyYXBoaWMgb3JkZXIuIFRoZXJlIGlzIG5vIGxvbmdlciBhIG5lZWQgZm9yIGEgc2VwYXJhdGUgYmFja3RyYWNrCitvciBhc2NlbmQgb3BlcmF0aW9uLCBiZWNhdXNlIGFsbCBhcnJvd3MgX2FkdmFuY2VfIGluIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHJpZS4gSG93ZXZlciwgdG8gYmUgYWJsZSB0byB1bmRlcnN0YW5kCit3aGVyZSB0aGUgbmV4dCB0cmFuc2l0aW9uIGNoYXJhY3RlciBzaXRzIGluIHRoZSBwYXRoLCBldmVyeSB0cmFuc2l0aW9uIG5vdyBhbHNvIGNvbWVzIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlCitkZXNjZW5kLWRlcHRoIGl0IGVuZHMgaW4uCisKK1RvIHNlZSBob3cgdGhpcyBjYW4gYmUgdXNlZCB0byBtYXAgdGhlIHN0YXRlIHRvIGEgcGF0aCwgd2UgY2FuIGltYWdpbmUgYW4gYXJyYXkgYmVpbmcgZmlsbGVkIGF0IGl0cyBgZGVwdGgtMWB0aAorcG9zaXRpb24gb24gZXZlcnkgdHJhbnNpdGlvbiwgYW5kIHRoZSBjdXJyZW50IHBhdGggYmVpbmcgdGhlIGBkZXB0aGAtbG9uZyBzZXF1ZW5jZS4gVGhpcywgZS5nLiB0aGUgYXJyYXkgd291bGQgaG9sZAorW3QsIHIsIGEsIGMsIHQsIG8sIHJdIGF0IHRoZSAidHJhY3RvciIgbm9kZSBhbmQgY2hhbmdlIHRvIFt0LCByLCBlLCBjLCB0LCBvLCByXSBmb3IgdGhlIG5leHQgYWR2YW5jZSwgd2hlcmUgdGhlIG5ldyAKK2N1cnJlbnQgcGF0aCBpcyB0aGUgZmlyc3QgMyBjaGFyYWN0ZXJzIG9mIHRoZSBhcnJheS4KKworQ3Vyc29ycyBhcmUgc3RhdGVmdWwgb2JqZWN0cyB0aGF0IHN0b3JlIHRoZSBiYWNrdHJhY2tpbmcgc3RhdGUgb2YgdGhlIHdhbGsuIFRoYXQgaXMsIGEgbGlzdCBvZiBhbGwgcGFyZW50IG5vZGVzIGluIHRoZQorcGF0aCB0byByZWFjaCB0aGUgY3VycmVudCBub2RlIHRoYXQgaGF2ZSBmdXJ0aGVyIGNoaWxkcmVuLCB0b2dldGhlciB3aXRoIGluZm9ybWF0aW9uIHdoaWNoIGNoaWxkIGJhY2t0cmFja2luZyBzaG91bGQgZ28KK3RvLiBDdXJzb3JzIGRvIG5vdCBzdG9yZSBwYXRocyBhcyB0aGVzZSBhcmUgb2Z0ZW4gbm90IG5lZWRlZCAmbWRhc2g7IGZvciBleGFtcGxlLCBpbiBhIHdhbGsgb3ZlciBhIG1lcmdlZCB0cmllIGl0IG1ha2VzIAorYmV0dGVyIHNlbnNlIGZvciB0aGUgY29uc3VtZXIgdG8gY29uc3RydWN0IHRoZSBwYXRoIGluc3RlYWQgb2YgaGF2aW5nIHRoZW0gZHVwbGljYXRlZCBpbiBldmVyeSBzb3VyY2UgY3Vyc29yLiBNdWx0aXBsZSAKK2N1cnNvcnMgY2FuIGJlIGNvbnN0cnVjdGVkIGFuZCBvcGVyYXRlZCBpbiBwYXJhbGxlbCBvdmVyIGEgdHJpZS4KKworQ3Vyc29yIHdhbGtzIG9mIHRoaXMgdHlwZSBhcmUgdmVyeSBlZmZpY2llbnQgYnV0IHN0aWxsIGNhcnJ5IGVub3VnaCBpbmZvcm1hdGlvbiB0byBtYWtlIGl0IHZlcnkgZWFzeSBhbmQgZWZmaWNpZW50IHRvCittZXJnZSBhbmQgaW50ZXJzZWN0IHRyaWVzLiBJZiB3ZSBhcmUgd2Fsa2luZyBhIHNpbmdsZSB0cmllIChvciBhIHNpbmdsZS1zb3VyY2UgYnJhbmNoIGluIGEgdW5pb24gdHJpZSksIHdlIGNhbgoraW1wcm92ZSB0aGUgZWZmaWNpZW5jeSBldmVuIGZ1cnRoZXIgYnkgdGFraW5nIG11bHRpcGxlIHN0ZXBzIGRvd24gaW4gYENoYWluYCBub2RlcywgcHJvdmlkZWQgd2UgaGF2ZSBhIHN1aXRhYmxlCittZWNoYW5pc20gb2YgcGFzc2luZyBhZGRpdGlvbmFsIHRyYW5zaXRpb24gY2hhcmFjdGVyczoKKworIVtncmFwaF0oSW5NZW1vcnlUcmllLm1kLndjMi5zdmcpCisKK1RoaXMgaXMgc3VwcG9ydGVkIGJ5IGBDdXJzb3IuYWR2YW5jZU11bHRpcGxlYC4KKworIyMjIFdoeSBjdXJzb3JzIGluc3RlYWQgb2Ygbm9kZXM/CisKK1RoZSBtb3N0IHN0cmFpZ2h0Zm9yd2FyZCByZXByZXNlbnRhdGlvbiBvZiBhIHRyaWUgaXMgZG9uZSBieSBnaXZpbmcgdXNlcnMgZXZlcnkgYE5vZGVgIHZpc2l0ZWQgYXMgYW4gb2JqZWN0LgorVGhlbiB0aGUgY29uc3VtZXIgY2FuIHF1ZXJ5IGl0cyB0cmFuc2l0aW9ucywgZ2V0IGl0cyBjaGlsZHJlbiwgZGVjaWRlIHRvIHdhbGsgb3ZlciB0aGVtIGluIGFueSBvcmRlciBpdCBzZWVzCitmaXQsIGFuZCByZXRhaW4gdGhvc2UgdGhhdCBpdCBhY3R1YWxseSBuZWVkcy4gVGhpcyBpcyBhIHZlcnkgbmF0dXJhbCBhbmQgY2hlYXAgcmVwcmVzZW50aW9uIGlmIHRoZSBub2RlcyBhcmUgYWN0dWFsbHkgCit0aGUgb2JqZWN0cyBpbiBtZW1vcnkgdGhhdCByZXByZXNlbnQgdGhlIHRyaWUuCisKK1RoZSBsYXR0ZXIgaXMgbm90IHRoZSBjYXNlIGZvciB1czogd2Ugc3RvcmUgdHJpZXMgaW4gaW50ZWdlciBibG9icyBvciBmaWxlcyBvbiBkaXNrIGFuZCB3ZSBwcmVzZW50IHRyYW5zZm9ybWVkIHZpZXdzIG9mCit0cmllcy4gVGh1cyBldmVyeSBzdWNoIGBOb2RlYCBvYmplY3QgdG8gZ2l2ZSB0byBjb25zdW1lcnMgbXVzdCBiZSBjb25zdHJ1Y3RlZC4gQWxzbywgd2Ugb25seSBkbyBkZXB0aC1maXJzdCB3YWxrcyBhbmQgaXQgCitkb2VzIG5vdCBtYWtlIHRoYXQgbXVjaCBzZW5zZSB0byBwcm92aWRlIHRoZSBmdWxsIGZsZXhpYmlsaXR5IG9mIHRoYXQga2luZCBvZiBpbnRlcmZhY2UuCisKK1doZW4gZG9pbmcgb25seSBkZXB0aC1maXJzdCB3YWxrcywgYSBjdXJzb3IgbmVlZHMgZmFyIGZld2VyIG9iamVjdHMgdG8gcmVwcmVzZW50IGl0cyBzdGF0ZSB0aGFuIGEgbm9kZSByZXByZXNlbnRhdGlvbi4KK0NvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZm9yIGFuIGFwcHJvYWNoIHByZXNlbnRpbmcgbm9kZXM6CistIEluIGEgcHJvY2VzcyB0aGF0IHJlcXVpcmVzIHNpbmdsZS1zdGVwIGRlc2NlbmRzIChpLmUuIGluIGEgbWVyZ2Ugb3IgaW50ZXJzZWN0aW9uKSB0aGUgaXRlcmF0aW9uIHN0YXRlIG11c3QgY3JlYXRlIGFuCisgIG9iamVjdCBmb3IgZXZlcnkgaW50ZXJtZWRpYXRlIG5vZGUgZXZlbiB3aGVuIHRoZXkgYXJlIGtub3duIHRvIHJlcXVpcmUgbm8gYmFja3RyYWNraW5nIGJlY2F1c2UgdGhleSBoYXZlIG9ubHkgb25lCisgIGNoaWxkLiAKKy0gQ2hpbGRsZXNzIGZpbmFsIHN0YXRlcyByZXF1aXJlIGEgbm9kZS4KKy0gQSB0cmFuc2Zvcm1hdGlvbiBzdWNoIGFzIGEgbWVyZ2UgbXVzdCBwcmVzZW50IHRoZSByZXN1bHQgYXMgYSB0cmFuc2Zvcm1lZCBub2RlLCBidXQgaXQgYWxzbyByZXF1aXJlcyBhIG5vZGUgZm9yIGVhY2gKKyAgaW5wdXQuIElmIHRoZSB0cmFuc2Zvcm1lZCBub2RlIGlzIHJldGFpbmVkLCBzbyBtdXN0IGJlIHRoZSBzb3VyY2VzLgorCitDdXJzb3JzIGNhbiByZXByZXNlbnQgdGhlIGZpcnN0IHR3byBpbiB0aGVpciBpbnRlcm5hbCBzdGF0ZSB3aXRob3V0IGFkZGl0aW9uYWwgYmFja3RyYWNraW5nIHN0YXRlLCBhbmQgcmVxdWlyZSBvbmx5IG9uZQordHJhbnNmb3JtZWQgY3Vyc29yIHRvIGJlIGNvbnN0cnVjdGVkIGZvciB0aGUgZW50aXJlIHdhbGsuIEFkZGl0aW9uYWxseSwgY3Vyc29ycycgcmVwcmVzZW50YXRpb24gb2YgYmFja3RyYWNraW5nIHN0YXRlIAorbWF5IGJlIGNsb3NlbHkgdGllZCB0byB0aGUgc3BlY2lmaWMgdHJpZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggYWxzbyBnaXZlcyBmdXJ0aGVyIGltcHJvdmVtZW50IG9wcG9ydHVuaXRpZXMgKGUuZy4gdGhlIAorYFNwbGl0YCBub2RlIHRyZWF0bWVudCBpbiBgSW5NZW1vcnlUcmllYCkuCisKKyMjIyBXaHkgbm90IHZpc2l0b3JzPworCitBIHZpc2l0b3Igb3IgYSBwdXNoIGFsdGVybmF0aXZlIGlzIG9uZSB3aGVyZSB0aGUgdHJpZSBkcml2ZXMgdGhlIGl0ZXJhdGlvbiBhbmQgdGhlIGNhbGxlciBwcm92aWRlcyBhIHZpc2l0b3Igb3IgYSAKK2NvbnN1bWVyLiBUaGlzIGNhbiB3b3JrIHdlbGwgaWYgdGhlIHRyaWUgdG8gd2FsayBpcyBzaW5nbGUtc291cmNlLCBidXQgcmVxdWlyZXMgc29tZSBmb3JtIG9mIHN0b3AvcmVzdGFydCBvciBwdWxsCittZWNoYW5pc20gdG8gaW1wbGVtZW50IG9yZGVyZWQgbWVyZ2VzLgorCitQdXNoLXN0eWxlIHdhbGtzIGFyZSBzdGlsbCBhIHVzZWZ1bCB3YXkgdG8gY29uc3VtZSB0aGUgZmluYWwgdHJhbnNmb3JtZWQvbWVyZ2VkIGNvbnRlbnQsIHRodXMgYFRyaWVgIHByb3ZpZGVzIAordGhlIGBXYWxrZXJgIGludGVyZmFjZSBhbmQgYHByb2Nlc3NgIG1ldGhvZC4gVGhlIGltcGxlbWVudGF0aW9ucyBvZiBgZm9yRWFjaEVudHJ5YCBhbmQgYGR1bXBgIGFyZSBzdHJhaWdodGZvcndhcmQKK2FwcGxpY2F0aW9ucyBvZiB0aGlzLgorCisjIyMgVGhlIGBDdXJzb3JgIGludGVyZmFjZQorCitUaGUgY3Vyc29yIHJlcHJlc2VudHMgdGhlIHN0YXRlIG9mIGEgd2FsayBvdmVyIHRoZSBub2RlcyBvZiB0cmllLiBJdCBwcm92aWRlcyB0aHJlZSBtYWluIGZlYXR1cmVzOgorLSB0aGUgY3VycmVudCBgZGVwdGhgIG9yIGRlc2NlbmQtZGVwdGggaW4gdGhlIHRyaWU7CistIHRoZSBgaW5jb21pbmdUcmFuc2l0aW9uYCwgaS5lLiB0aGUgYnl0ZSB0aGF0IHdhcyB1c2VkIHRvIHJlYWNoIHRoZSBjdXJyZW50IHBvaW50OworLSB0aGUgYGNvbnRlbnRgIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBub2RlLAorCithbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWR2YW5jaW5nIHRvIHRoZSBuZXh0IHBvc2l0aW9uLiAgVGhpcyBpcyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZXh0cmFjdCBhbGwgcGF0aHMsIGFuZAorYWxzbyB0byBlYXNpbHkgY29tcGFyZSBjdXJzb3JzIG92ZXIgZGlmZmVyZW50IHRyaWVzIHRoYXQgYXJlIGFkdmFuY2VkIHRvZ2V0aGVyLiBBZHZhbmNpbmcgaXMgYWx3YXlzIGRvbmUgaW4KK29yZGVyOyBpZiBvbmUgaW1hZ2luZXMgdGhlIHNldCBvZiBub2RlcyBpbiB0aGUgdHJpZSB3aXRoIHRoZWlyIGFzc29jaWF0ZWQgcGF0aHMsIGEgY3Vyc29yIG1heSBvbmx5IGFkdmFuY2UgZnJvbSBhCitub2RlIHdpdGggYSBsZXhpY29ncmFwaGljYWxseSBzbWFsbGVyIHBhdGggdG8gb25lIHdpdGggYmlnZ2VyLiBUaGUgYGFkdmFuY2VgIG9wZXJhdGlvbiBtb3ZlcyB0byB0aGUgaW1tZWRpYXRlCituZXh0LCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNraXAgb3ZlciBzb21lIGl0ZW1zIGUuZy4gYWxsIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IG5vZGUgKGBza2lwQ2hpbGRyZW5gKS4KKworTW92aW5nIHRvIHRoZSBpbW1lZGlhdGUgbmV4dCBwb3NpdGlvbiBpbiB0aGUgbGV4aWNvZ3JhcGhpYyBvcmRlciBpcyBhY2NvbXBsaXNoZWQgYnk6CistIGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIGNoaWxkcmVuLCBtb3ZpbmcgdG8gaXRzIGZpcnN0IGNoaWxkOworLSBvdGhlcndpc2UsIGFzY2VuZCB0aGUgcGFyZW50IGNoYWluIGFuZCByZXR1cm4gdGhlIG5leHQgY2hpbGQgb2YgdGhlIGNsb3Nlc3QgcGFyZW50IHRoYXQgc3RpbGwgaGFzIGFueS4KKworQXMgbG9uZyBhcyB0aGUgdHJpZSBpcyBub3QgZXhoYXVzdGVkLCBhZHZhbmNpbmcgYWx3YXlzIHRha2VzIG9uZSBzdGVwIGRvd24sIGZyb20gdGhlIGN1cnJlbnQgbm9kZSwgb3IgZnJvbSBhIG5vZGUKK29uIHRoZSBwYXJlbnQgY2hhaW4uIEJ5IGNvbXBhcmluZyB0aGUgbmV3IGRlcHRoICh3aGljaCBgYWR2YW5jZWAgYWxzbyByZXR1cm5zKSB3aXRoIHRoZSBvbmUgYmVmb3JlIHRoZSBhZHZhbmNlLAorb25lIGNhbiB0ZWxsIGlmIHRoZSBmb3JtZXIgd2FzIHRoZSBjYXNlIChpZiBgbmV3RGVwdGggPT0gb2xkRGVwdGggKyAxYCkgYW5kIGhvdyBtYW55IHN0ZXBzIHVwIHdlIGhhZCB0byB0YWtlCisoYG9sZERlcHRoICsgMSAtIG5ld0RlcHRoYCkuIFdoZW4gZm9sbG93aW5nIGEgcGF0aCBkb3duLCB0aGUgY3Vyc29yIHdpbGwgc3RvcCBvbiBhbGwgcHJlZml4ZXMuCisKK0luIGFkZGl0aW9uIHRvIHRoZSBzaW5nbGUtc3RlcCBgYWR2YW5jZWAgbWV0aG9kLCB0aGUgY3Vyc29yIGFsc28gcHJvdmlkZXMgYW4gYGFkdmFuY2VNdWx0aXBsZWAgbWV0aG9kIGZvciBkZXNjZW5kaW5nCittdWx0aXBsZSBzdGVwcyBkb3duIHdoZW4gdGhpcyBpcyBrbm93biB0byBiZSBlZmZpY2llbnQuIElmIGl0IGlzIG5vdCBmZWFzaWJsZSB0byBkZXNjZW5kIChlLmcuIGJlY2F1c2UgdGhlcmUgYXJlIG5vCitjaGlsZHJlbiwgb3IgYmVjYXVzZSBnZXR0aW5nIHRvIHRoZSBjaGlsZCBvZiB0aGUgZmlyc3QgY2hpbGQgcmVxdWlyZXMgYSBwYWdlIGZldGNoIGZyb20gZGlzayksIGBhZHZhbmNlTXVsdGlwbGVgIHdpbGwKK2FjdCBqdXN0IGxpa2UgYGFkdmFuY2VgLgorCitGb3IgY29udmVuaWVuY2UsIHRoZSBpbnRlcmZhY2UgYWxzbyBwcm92aWRlcyBhbiBgYWR2YW5jZVRvQ29udGVudGAgbWV0aG9kIGZvciB3YWxraW5nIHRvIHRoZSBuZXh0IG5vZGUgd2l0aCBub24tbnVsbAorY29udGVudC4gVGhpcyBpcyBpbXBsZW1lbnRlZCB2aWEgYGFkdmFuY2VNdWx0aXBsZWAuCisKK1doZW4gdGhlIGN1cnNvciBpcyBjcmVhdGVkIGl0IGlzIHBsYWNlZCBvbiB0aGUgcm9vdCBub2RlIHdpdGggYGRlcHRoKCkgPSAwYCwgYGluY29taW5nVHJhbnNpdGlvbigpID0gLTFgLiBTaW5jZQordHJpZXMgY2FuIGhhdmUgbWFwcGluZ3MgZm9yIGVtcHR5LCBgY29udGVudCgpYCBjYW4gcG9zc2libHkgYmUgbm9uLW51bGwgaW4gdGhlIHN0YXJ0aW5nIHBvc2l0aW9uLiBJdCBpcyBub3QgYWxsb3dlZAorZm9yIGEgY3Vyc29yIHRvIHN0YXJ0IGluIGV4aGF1c3RlZCBzdGF0ZSAoaS5lLiB3aXRoIGBkZXB0aCgpID0gLTFgKS4KKworIyMjIFVzaW5nIGN1cnNvcnMgaW4gcGFyYWxsZWwKKworT25lIGltcG9ydGFudCBmZWF0dXJlIG9mIGN1cnNvcnMgaXMgdGhlIGZhY3QgdGhhdCB3ZSBjYW4gZWFzaWx5IHdhbGsgdGhlbSBpbiBwYXJhbGxlbC4gTW9yZSBwcmVjaXNlbHksIHdoZW4gd2UgdXNlIGEgCitwcm9jZWR1cmUgd2hlcmUgd2Ugb25seSBhZHZhbmNlIHRoZSBzbWFsbGVyLCBvciBib3RoIGlmIHRoZXkgYXJlIGVxdWFsLCB3ZSBjYW4gY29tcGFyZSB0aGUgY3Vyc29ycycgc3RhdGUgYnk6CistIHRoZSByZXZlcnNlIG9yZGVyIG9mIHRoZWlyIGN1cnJlbnQgZGVwdGggKGkuZS4gaGlnaGVyIGRlcHRoIGZpcnN0KSwKKy0gaWYgZGVwdGhzIGFyZSBlcXVhbCwgdGhlIG9yZGVyIG9mIHRoZWlyIGN1cnJlbnQgaW5jb21pbmcgdHJhbnNpdGlvbiAobGV4aWNvZ3JhcGhpY2FsbHkgc21hbGxlciBmaXJzdCkuCisKK1dlIGNhbiBwcm92ZSB0aGlzIGJ5IGluZHVjdGlvbiwgd2hlcmUgZm9yIHR3byBjdXJzb3JzIGBhYCBhbmQgYGJgIHdlIG1haW50YWluIHRoYXQ6CisxLiBmb3IgYW55IGRlcHRoIGBpIDwgbWluZGVwdGggLSAxYCwgYHBhdGgoYSlbaV0gPT0gcGF0aChiKVtpXWAKKzIuIGlmIGBhLmRlcHRoIDwgYi5kZXB0aGAsIHRoZW4gYHBhdGgoYSlbbWluZGVwdGggLSAxXSA+IHBhdGgoYilbbWluZGVwdGggLSAxXWAKKzMuIGlmIGBhLmRlcHRoID4gYi5kZXB0aGAsIHRoZW4gYHBhdGgoYSlbbWluZGVwdGggLSAxXSA8IHBhdGgoYilbbWluZGVwdGggLSAxXWAKKword2hlcmUgYG1pbmRlcHRoID0gbWluKGEuZGVwdGgsIGIuZGVwdGgpYCBhbmQgYHBhdGgoY3Vyc29yKWAgaXMgdGhlIHBhdGggY29ycmVzcG9uZGluZyB0byB0aGUgbm9kZSB0aGUgY3Vyc29yIGlzCitwb3NpdGlvbmVkIGF0LiBOb3RlIHRoYXQgYHBhdGgoY3Vyc29yKVtjdXJzb3IuZGVwdGggLSAxXSA9PSBjdXJzb3IuaW5jb21pbmdUcmFuc2l0aW9uYC4KKworVGhlc2UgY29uZGl0aW9ucyBlbnN1cmUgdGhhdCBgcGF0aChhKSA8IHBhdGgoYilgIGlmIGFuZCBvbmx5IGlmIGBhLmRlcHRoID4gYi5kZXB0aGAgb3IgYGEuZGVwdGggPT0gYi5kZXB0aGAgYW5kIAorYGEuaW5jb21pbmdUcmFuc2l0aW9uIDwgYi5pbmNvbWluZ1RyYW5zaXRpb25gLiBJbmRlZWQsIGlmIHRoZSBzZWNvbmQgcGFydCBpcyB0cnVlIHRoZW4gMSBhbmQgMyBlbmZvcmNlIHRoZSBmaXJzdCwKK2FuZCBpZiB0aGUgc2Vjb25kIHBhcnQgaXMgbm90IHRydWUsIGkuZS4gYGEuZGVwdGggPD0gYi5kZXB0aGAgYW5kIChgYS5kZXB0aCAhPSBiLmRlcHRoYCBvciAKK2BhLmluY29taW5nVHJhbnNpdGlvbiA+PSBiLmluY29taW5nVHJhbnNpdGlvbmApLCB3aGljaCBlbnRhaWxzIGBhLmRlcHRoIDwgYi5kZXB0aGAgb3IgYGEuZGVwdGggPT0gYi5kZXB0aGAgYW5kCitgYS5pbmNvbWluZ1RyYW5zaXRpb24gPj0gYi5pbmNvbWluZ1RyYW5zaXRpb25gLCB0aGVuIGJ5IDIgYW5kIDEgd2UgY2FuIGNvbmNsdWRlIHRoYXQgYHBhdGgoYSkgPj0gcGF0aChiKWAsIGkuZS4gdGhlCitmaXJzdCBwYXJ0IGlzIG5vdCB0cnVlIGVpdGhlci4KKworVGhlIGNvbmRpdGlvbnMgYXJlIHRyaXZpYWxseSB0cnVlIGZvciB0aGUgaW5pdGlhbCBzdGF0ZSB3aGVyZSBib3RoIGN1cnNvcnMgYXJlIHBvc2l0aW9uZWQgYXQgdGhlIHJvb3Qgd2l0aCBkZXB0aCAwLgorQWxzbywgd2hlbiB3ZSBhZHZhbmNlIGEgY3Vyc29yLCBpdCBpcyBhbHdheXMgdGhlIGNhc2UgdGhhdCB0aGUgcGF0aCBvZiB0aGUgcHJldmlvdXMgc3RhdGUgYW5kIHRoZSBwYXRoIG9mIHRoZSBuZXcgc3RhdGUgCittdXN0IGJlIHRoZSBzYW1lIGluIGFsbCBwb3NpdGlvbnMgYmVmb3JlIGl0cyBuZXcgZGVwdGggbWludXMgb25lJ3RoLiBUaHVzLCBpZiB0aGUgdHdvIGN1cnNvcnMgYXJlIGVxdWFsIGJlZm9yZQorYWR2YW5jaW5nLCBpLmUuIHRoZXkgYXJlIHBvc2l0aW9uZWQgb24gZXhhY3RseSB0aGUgc2FtZSBwYXRoLCB0aGUgc3RhdGUgYWZ0ZXIgYWR2YW5jaW5nIG11c3Qgc2F0aXNmeSBjb25kaXRpb24gMSBhYm92ZQorYmVjYXVzZSB0aGUgZWFybGllc3QgYnl0ZSBpbiBlaXRoZXIgcGF0aCB0aGF0IGNhbiBoYXZlIGNoYW5nZWQgaXMgdGhlIG9uZSBhdCBwb3NpdGlvbiBgbWluKGEuZGVwdGgsIGIuZGVwdGgpIC0gMWAuCitNb3Jlb3ZlciwgaWYgdGhlIGRlcHRocyBhcmUgZGlmZmVyZW50LCB0aGUgY3Vyc29yIHdpdGggdGhlIGxvd2VyIG9uZSB3aWxsIGhhdmUgYWR2YW5jZWQgaXRzIGNoYXJhY3RlciBpbiBwb3NpdGlvbgorYGRlcHRoIC0gMWAgd2hpbGUgdGhlIG90aGVyIGN1cnNvcidzIGNoYXJhY3RlciBhdCB0aGF0IHBvc2l0aW9uIHdpbGwgaGF2ZSByZW1haW5lZCB0aGUgc2FtZSwgdGh1cyBjb25kaXRpb25zIDIgYW5kIDMgYXJlCithbHNvIHNhdGlzZmllZC4KKworSWYgYHBhdGgoYSlgIHdhcyBzbWFsbGVyIGJlZm9yZSBhZHZhbmNpbmcgd2UgaGF2ZSB0aGF0IGBhLmRlcHRoID49IGIuZGVwdGhgLiBUaGUgcGFyYWxsZWwgd2FsayB3aWxsIHRoZW4gb25seSBhZHZhbmNlCitgYWAuIElmIHRoZSBuZXcgZGVwdGggb2YgYGFgIGlzIGhpZ2hlciB0aGFuIGBiYCdzLCBub3RoaW5nIGNoYW5nZXMgaW4gY29uZGl0aW9ucyAxLTMgKHRoZSBieXRlcyBiZWZvcmUgYGIuZGVwdGhgIGRvIAorbm90IGNoYW5nZSBhdCBhbGwgaW4gZWl0aGVyIGN1cnNvcikuIElmIHRoZSBuZXcgZGVwdGggb2YgYGFgIGlzIHRoZSBzYW1lIGFzIGBiYCdzLCBjb25kaXRpb24gMSBpcyBzdGlsbCBzYXRpc2ZpZWQKK2JlY2F1c2UgdGhlc2UgYnl0ZXMgY2Fubm90IGhhdmUgY2hhbmdlZCwgYW5kIHRoZSBwcmVtaXNlcyBpbiAyIGFuZCAzIGFyZSBmYWxzZS4gSWYgdGhlIG5ldyBkZXB0aCBvZiBgYWAgaXMgbG93ZXIKK3RoYW4gYGJgJ3MsIGhvd2V2ZXIsIGBhYCBtdXN0IGhhdmUgYWR2YW5jZWQgdGhlIGJ5dGUgYXQgaW5kZXggYGRlcHRoIC0gMWAsIGFuZCBiZWNhdXNlIChkdWUgdG8gMSkgaXQgd2FzIHByZXZpb3VzbHkKK2VxdWFsIHRvIGBiYCdzIGF0IHRoaXMgaW5kZXgsIGl0IG11c3Qgbm93IGJlIGhpZ2hlciwgcHJvdmluZyAyLiBDb25kaXRpb24gMSBpcyBzdGlsbCB0cnVlIGJlY2F1c2UgdGhlc2UgYnl0ZXMgY2Fubm90CitoYXZlIGNoYW5nZWQsIGFuZCAzIGlzIHRydWUgYmVjYXVzZSBpdCBoYXMgYSBmYWxzZSBwcmVtaXNlLgorCitUaGUgc2FtZSBhcmd1bWVudCBob2xkcyB3aGVuIGBiYCBpcyB0aGUgc21hbGxlciBjdXJzb3IgdG8gYmUgYWR2YW5jZWQuCisKKyMjIE1lcmdpbmcgdHdvIHRyaWVzCisKK1R3byB0cmllcyBjYW4gYmUgbWVyZ2VkIHVzaW5nIGBUcmllLm1lcmdlV2l0aGAsIHdoaWNoIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSBjbGFzcyBgTWVyZ2VUcmllYC4gVGhlIGltcGxlbWVudGF0aW9uCitpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBhcHBsaWNhdGlvbiBvZiB0aGUgcGFyYWxsZWwgd2Fsa2luZyBzY2hlbWUgYWJvdmUsIHdoZXJlIHRoZSBtZXJnZWQgY3Vyc29yIHByZXNlbnRzIHRoZSBkZXB0aAorYW5kIGluY29taW5nIHRyYW5zaXRpb24gb2YgdGhlIGN1cnJlbnRseSBzbWFsbGVyIGN1cnNvciwgYW5kIGFkdmFuY2VzIGJ5IGFkdmFuY2luZyB0aGUgc21hbGxlciBjdXJzb3IsIG9yIGJvdGggaWYgdGhleQorYXJlIGVxdWFsLgorCitJZiB0aGUgY3Vyc29ycyBhcmUgbm90IGVxdWFsLCB3ZSBjYW4gYWxzbyBhcHBseSBgYWR2YW5jZU11bHRpcGxlYCwgYmVjYXVzZSBpdCBjYW4gb25seSBiZSBkaWZmZXJlbnQgZnJvbSBgYWR2YW5jZWAKK2lmIGl0IGRlc2NlbmRzLiBXaGVuIGEgY3Vyc29yIGlzIGtub3duIHRvIGJlIHNtYWxsZXIgaXQgaXMgZ3VhcmFudGVlZCB0byByZW1haW4gc21hbGxlciB3aGVuIGl0IGRlc2NlbmRzIGFzIGl0cworbmV3IGRlcHRoIHdpbGwgYmUgbGFyZ2VyIHRoYW4gYmVmb3JlIGFuZCB0aHVzIGxhcmdlciB0aGFuIHRoZSBvdGhlciBjdXJzb3Incy4gVGhpcyBjYW5ub3QgYmUgZG9uZSB0byBhZHZhbmNlIGJvdGgKK2N1cnNvcnMgd2hlbiB0aGV5IGFyZSBlcXVhbCwgYmVjYXVzZSB0aGF0IGNhbiB2aW9sYXRlIHRoZSBjb25kaXRpb25zLiAoU2ltcGxlIGV4YW1wbGU6IG9uZSBkZXNjZW5kcyB0aHJvdWdoICJhIiBhbmQgCit0aGUgb3RoZXIgdGhyb3VnaCAiYmIiICZtZGFzaDsgY29uZGl0aW9uIDIuIGlzIHZpb2xhdGVkLCB0aGUgbGF0dGVyIHdpbGwgaGF2ZSBoaWdoZXIgZGVwdGggYnV0IHdpbGwgbm90IGJlIHNtYWxsZXIuKQorCisjIyBNZXJnaW5nIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgdHJpZXMKKworTWVyZ2luZyBpcyBleHRlbmRlZCB0byBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHNvdXJjZXMgaW4gYENvbGxlY3Rpb25NZXJnZVRyaWVgLCB1c2VkIHRocm91Z2ggdGhlIHN0YXRpYyBgVHJpZS5tZXJnZWAuCitUaGUgcHJvY2VzcyBpcyBhIGdlbmVyYWxpemF0aW9uIG9mIHRoZSBhYm92ZSwgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIG1pbi1oZWFwIHNvbHV0aW9uIGZyb20gYE1lcmdlSXRlcmF0b3JgIGFwcGxpZWQKK3RvIGN1cnNvcnMuCisKK0luIHRoaXMgc29sdXRpb24gYW4gZXh0cmEgaGVhZCBlbGVtZW50IGlzIG1haW50YWluZWQgX2JlZm9yZV8gdGhlIG1pbi1oZWFwIHRvIG9wdGltaXplIGZvciBzaW5nbGUtc291cmNlIGJyYW5jaGVzCit3aGVyZSB3ZSBwcmVmZXIgdG8gYWR2YW5jZSB1c2luZyBqdXN0IG9uZSBjb21wYXJpc29uIChoZWFkIHRvIGhlYXAgdG9wKSBpbnN0ZWFkIG9mIHR3byAoaGVhcCB0b3AgdG8gaXRzIHR3byAKK2Rlc2NlbmRhbnRzKSBhdCB0aGUgZXhwZW5zZSBvZiBwb3NzaWJseSBhZGRpbmcgb25lIGFkZGl0aW9uYWwgY29tcGFyaXNvbiBpbiB0aGUgZ2VuZXJhbCBjYXNlLgorCitBcyBhYm92ZSwgd2hlbiB3ZSBrbm93IHRoYXQgdGhlIGhlYWQgZWxlbWVudCBpcyBub3QgZXF1YWwgdG8gdGhlIGhlYXAgdG9wIChpLmUuIGl0J3MgbmVjZXNzYXJpbHkgc21hbGxlcikgd2UgY2FuCit1c2UgaXRzIGBhZHZhbmNlTXVsdGlwbGVgIHNhZmVseS4KKworIyMgU2xpY2luZyB0cmllcworCitTbGljaW5nLCBpbXBsZW1lbnRlZCBpbiBgU2xpY2VkVHJpZWAgYW5kIHVzZWQgdmlhIGBUcmllLnN1YnRyaWVgLCBjYW4gYWxzbyBiZSBzZWVuIGFzIGEgdmFyaWF0aW9uIG9mIHRoZSBwYXJhbGxlbCAKK3dhbGsuIEluIHRoaXMgY2FzZSB3ZSB3YWxrIHRoZSBzb3VyY2UgYXMgd2VsbCBhcyBzaW5nbGV0b25zIG9mIHRoZSB0d28gYm91bmRzLgorCitNb3JlIHByZWNpc2VseSwgd2hpbGUgdGhlIHNvdXJjZSBjdXJzb3IgaXMgc21hbGxlciB0aGFuIHRoZSBsZWZ0IGJvdW5kLCB3ZSBkb24ndCBwcm9kdWNlIGFueSBvdXRwdXQuIFRoYXQgaXMsIHdlCitrZWVwIGFkdmFuY2luZyBpbiBhIGxvb3AsIGJ1dCB0byBhdm9pZCB3YWxraW5nIHN1YnRyaWVzIHVubmVjZXNzYXJpbHksIHdlIHVzZSBgc2tpcENoaWxkcmVuYCBpbnN0ZWFkIG9mIGBhZHZhbmNlYC4KK0FzIHdlIHNhdyBhYm92ZSwgYSBzbWFsbGVyIGN1cnNvciB0aGF0IGRlc2NlbmRzIHJlbWFpbnMgc21hbGxlciwgdGh1cyB0aGVyZSBpcyBubyBwb2ludCB0byBkbyBzbyB3aGVuIHdlIGFyZQorYWhlYWQgb2YgdGhlIGxlZnQgYm91bmQuIFdoZW4gdGhlIHNvdXJjZSBtYXRjaGVzIGEgbm9kZSBmcm9tIHRoZSBsZWZ0IGJvdW5kLCB3ZSBkZXNjZW5kIGJvdGggYW5kIHBhc3MgdGhlCitzdGF0ZSB0byB0aGUgY29uc3VtZXIuIEFzIHNvb24gYXMgdGhlIHNvdXJjZSBiZWNvbWVzIGtub3duIGdyZWF0ZXIgdGhhbiB0aGUgbGVmdCBib3VuZCwgd2UgY2FuIHN0b3AgcHJvY2Vzc2luZyAKK3RoZSBsYXR0ZXIgYW5kIHBhc3MgYW55IHN0YXRlIHdlIHNlZSB0byB0aGUgY29uc3VtZXIuIAorCitUaHJvdWdob3V0IHRoaXMgd2UgYWxzbyBwcm9jZXNzIHRoZSByaWdodCBib3VuZCBjdXJzb3IgYW5kIHdlIHN0b3AgdGhlIGl0ZXJhdGlvbiAoYnkgcmV0dXJuaW5nIGBkZXB0aCA9IC0xYCkgCithcyBzb29uIGFzIHRoZSBzb3VyY2UgYmVjb21lcyBsYXJnZXIgdGhhbiB0aGUgcmlnaHQgYm91bmQuCisKK2BTbGljZWRUcmllYCBkb2VzIG5vdCB1c2Ugc2luZ2xldG9uIHRyaWVzIGFuZCBjdXJzb3JzIG92ZXIgdGhlbSBidXQgb3B0cyB0byBpbXBsZW1lbnQgdGhlbSBkaXJlY3RseSwgdXNpbmcgYW4KK2ltcGxpY2l0IHJlcHJlc2VudGF0aW9uIHVzaW5nIGEgcGFpciBvZiBgZGVwdGhgIGFuZCBgaW5jb21pbmdUcmFuc2l0aW9uYCBmb3IgZWFjaCBib3VuZC4KKworSW4gc2xpY2VzIHdlIGNhbiBhbHNvIHVzZSBgYWR2YW5jZU11bHRpcGxlYCB3aGVuIHdlIGFyZSBjZXJ0YWluIHRvIGJlIHN0cmljdGx5IGluc2lkZSB0aGUgc2xpY2UsIGkuZS4gYmV5b25kIHRoZQorbGVmdCBib3VuZCBhbmQgYmVmb3JlIGEgcHJlZml4IG9mIHRoZSByaWdodCBib3VuZC4gQXMgYWJvdmUsIGRlc2NlbmRpbmcgdG8gYW55IGRlcHRoIGluIHRoaXMgY2FzZSBpcyBzYWZlIGFzIHRoZQorcmVzdWx0IHdpbGwgcmVtYWluIHNtYWxsZXIgdGhhbiB0aGUgcmlnaHQgYm91bmQuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZUR1bXBlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZUR1bXBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZmIyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllRHVtcGVyLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBvcmcuYWdyb25hLkRpcmVjdEJ1ZmZlcjsKKworLyoqCisgKiBTaW1wbGUgdXRpbGl0eSBjbGFzcyBmb3IgZHVtcGluZyB0aGUgc3RydWN0dXJlIG9mIGEgdHJpZSB0byBzdHJpbmcuCisgKi8KK2NsYXNzIFRyaWVEdW1wZXI8VD4gaW1wbGVtZW50cyBUcmllLldhbGtlcjxULCBTdHJpbmc+Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIGI7CisgICAgcHJpdmF0ZSBmaW5hbCBGdW5jdGlvbjxULCBTdHJpbmc+IGNvbnRlbnRUb1N0cmluZzsKKyAgICBpbnQgbmVlZHNJbmRlbnQgPSAtMTsKKyAgICBpbnQgY3VycmVudExlbmd0aCA9IDA7CisKKyAgICBwdWJsaWMgVHJpZUR1bXBlcihGdW5jdGlvbjxULCBTdHJpbmc+IGNvbnRlbnRUb1N0cmluZykKKyAgICB7CisgICAgICAgIHRoaXMuY29udGVudFRvU3RyaW5nID0gY29udGVudFRvU3RyaW5nOworICAgICAgICB0aGlzLmIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbmRMaW5lQW5kU2V0SW5kZW50KGludCBuZXdJbmRlbnQpCisgICAgeworICAgICAgICBuZWVkc0luZGVudCA9IG5ld0luZGVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldFBhdGhMZW5ndGgoaW50IG5ld0xlbmd0aCkKKyAgICB7CisgICAgICAgIGN1cnJlbnRMZW5ndGggPSBuZXdMZW5ndGg7CisgICAgICAgIGVuZExpbmVBbmRTZXRJbmRlbnQobmV3TGVuZ3RoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVJbmRlbnQoKQorICAgIHsKKyAgICAgICAgaWYgKG5lZWRzSW5kZW50ID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGIuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZWVkc0luZGVudDsgKytpKQorICAgICAgICAgICAgICAgIGIuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgbmVlZHNJbmRlbnQgPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFBhdGhCeXRlKGludCBuZXh0Qnl0ZSkKKyAgICB7CisgICAgICAgIG1heWJlSW5kZW50KCk7CisgICAgICAgICsrY3VycmVudExlbmd0aDsKKyAgICAgICAgYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJTAyeCIsIG5leHRCeXRlKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkUGF0aEJ5dGVzKERpcmVjdEJ1ZmZlciBidWZmZXIsIGludCBwb3MsIGludCBjb3VudCkKKyAgICB7CisgICAgICAgIG1heWJlSW5kZW50KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKyAgICAgICAgICAgIGIuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUwMngiLCBidWZmZXIuZ2V0Qnl0ZShwb3MgKyBpKSAmIDB4RkYpKTsKKyAgICAgICAgY3VycmVudExlbmd0aCArPSBjb3VudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb250ZW50KFQgY29udGVudCkKKyAgICB7CisgICAgICAgIGIuYXBwZW5kKCIgLT4gIik7CisgICAgICAgIGIuYXBwZW5kKGNvbnRlbnRUb1N0cmluZy5hcHBseShjb250ZW50KSk7CisgICAgICAgIGVuZExpbmVBbmRTZXRJbmRlbnQoY3VycmVudExlbmd0aCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBjb21wbGV0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVFbnRyaWVzSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVFbnRyaWVzSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWIzZTdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZUVudHJpZXNJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzOworCitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CisKKy8qKgorICogQ29udmVydG9yIG9mIHRyaWUgZW50cmllcyB0byBpdGVyYXRvciB3aGVyZSBlYWNoIGVudHJ5IGlzIHBhc3NlZCB0aHJvdWdoIHtAbGluayAjbWFwQ29udGVudH0gKHRvIGJlIGltcGxlbWVudGVkIGJ5CisgKiBkZXNjZW5kYW50cykuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmllRW50cmllc0l0ZXJhdG9yPFQsIFY+IGV4dGVuZHMgVHJpZVBhdGhSZWNvbnN0cnVjdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8Vj4KK3sKKyAgICBwcml2YXRlIGZpbmFsIFRyaWUuQ3Vyc29yPFQ+IGN1cnNvcjsKKyAgICBUIG5leHQ7CisgICAgYm9vbGVhbiBnb3ROZXh0OworCisgICAgcHJvdGVjdGVkIFRyaWVFbnRyaWVzSXRlcmF0b3IoVHJpZTxUPiB0cmllKQorICAgIHsKKyAgICAgICAgY3Vyc29yID0gdHJpZS5jdXJzb3IoKTsKKyAgICAgICAgYXNzZXJ0IGN1cnNvci5kZXB0aCgpID09IDA7CisgICAgICAgIG5leHQgPSBjdXJzb3IuY29udGVudCgpOworICAgICAgICBnb3ROZXh0ID0gbmV4dCAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQorICAgIHsKKyAgICAgICAgaWYgKCFnb3ROZXh0KQorICAgICAgICB7CisgICAgICAgICAgICBuZXh0ID0gY3Vyc29yLmFkdmFuY2VUb0NvbnRlbnQodGhpcyk7CisgICAgICAgICAgICBnb3ROZXh0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXh0ICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIFYgbmV4dCgpCisgICAgeworICAgICAgICBnb3ROZXh0ID0gZmFsc2U7CisgICAgICAgIFQgdiA9IG5leHQ7CisgICAgICAgIG5leHQgPSBudWxsOworICAgICAgICByZXR1cm4gbWFwQ29udGVudCh2LCBrZXlCeXRlcywga2V5UG9zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgViBtYXBDb250ZW50KFQgY29udGVudCwgYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZUxlbmd0aCk7CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvciByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIHRyaWUgYSBzZXF1ZW5jZSBvZiAocGF0aCwgY29udGVudCkgcGFpcnMuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIEFzRW50cmllczxUPiBleHRlbmRzIFRyaWVFbnRyaWVzSXRlcmF0b3I8VCwgTWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBUPj4KKyAgICB7CisgICAgICAgIHB1YmxpYyBBc0VudHJpZXMoVHJpZTxUPiB0cmllKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcih0cmllKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgTWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBUPiBtYXBDb250ZW50KFQgY29udGVudCwgYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZUxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRvRW50cnkoY29udGVudCwgYnl0ZXMsIGJ5dGVMZW5ndGgpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIDxUPiBqYXZhLnV0aWwuTWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBUPiB0b0VudHJ5KFQgY29udGVudCwgYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZUxlbmd0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RNYXAuU2ltcGxlSW1tdXRhYmxlRW50cnk8Pih0b0J5dGVDb21wYXJhYmxlKGJ5dGVzLCBieXRlTGVuZ3RoKSwgY29udGVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZUVudHJpZXNXYWxrZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVFbnRyaWVzV2Fsa2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwNjAxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVFbnRyaWVzV2Fsa2VyLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlDb25zdW1lcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworCisvKioKKyAqIFdhbGtlciBvZiB0cmllIGVudHJpZXMsIHVzZWQgd2l0aCBUcmllLnByb2Nlc3MgdG8gd2FsayBhbGwgY29udGVudCBpbiBvcmRlciBhbmQgcHJvdmlkZSB0aGUgcGF0aCB0aHJvdWdoIHdoaWNoIHZhbHVlcworICogYXJlIHJlYWNoZWQuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmllRW50cmllc1dhbGtlcjxULCBWPiBleHRlbmRzIFRyaWVQYXRoUmVjb25zdHJ1Y3RvciBpbXBsZW1lbnRzIFRyaWUuV2Fsa2VyPFQsIFY+Cit7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29udGVudChUIGNvbnRlbnQpCisgICAgeworICAgICAgICBjb250ZW50KGNvbnRlbnQsIGtleUJ5dGVzLCBrZXlQb3MpOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNvbnRlbnQoVCBjb250ZW50LCBieXRlW10gYnl0ZXMsIGludCBieXRlTGVuZ3RoKTsKKworICAgIC8qKgorICAgICAqIEl0ZXJhdG9yIHJlcHJlc2VudGluZyB0aGUgY29udGVudCBvZiB0aGUgdHJpZSBhIHNlcXVlbmNlIG9mIChwYXRoLCBjb250ZW50KSBwYWlycy4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgV2l0aENvbnN1bWVyPFQ+IGV4dGVuZHMgVHJpZUVudHJpZXNXYWxrZXI8VCwgVm9pZD4KKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQmlDb25zdW1lcjxCeXRlQ29tcGFyYWJsZSwgVD4gY29uc3VtZXI7CisKKyAgICAgICAgcHVibGljIFdpdGhDb25zdW1lcihCaUNvbnN1bWVyPEJ5dGVDb21wYXJhYmxlLCBUPiBjb25zdW1lcikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jb25zdW1lciA9IGNvbnN1bWVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbnRlbnQoVCBjb250ZW50LCBieXRlW10gYnl0ZXMsIGludCBieXRlTGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdW1lci5hY2NlcHQodG9CeXRlQ29tcGFyYWJsZShieXRlcywgYnl0ZUxlbmd0aCksIGNvbnRlbnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWb2lkIGNvbXBsZXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllUGF0aFJlY29uc3RydWN0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVQYXRoUmVjb25zdHJ1Y3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOTg4M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllUGF0aFJlY29uc3RydWN0b3IuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IG9yZy5hZ3JvbmEuRGlyZWN0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworCitwdWJsaWMgY2xhc3MgVHJpZVBhdGhSZWNvbnN0cnVjdG9yIGltcGxlbWVudHMgVHJpZS5SZXNldHRpbmdUcmFuc2l0aW9uc1JlY2VpdmVyCit7CisgICAgcHJvdGVjdGVkIGJ5dGVbXSBrZXlCeXRlcyA9IG5ldyBieXRlWzMyXTsKKyAgICBwcm90ZWN0ZWQgaW50IGtleVBvcyA9IDA7CisKKyAgICBwdWJsaWMgdm9pZCBhZGRQYXRoQnl0ZShpbnQgbmV4dEJ5dGUpCisgICAgeworICAgICAgICBpZiAoa2V5UG9zID49IGtleUJ5dGVzLmxlbmd0aCkKKyAgICAgICAgICAgIGtleUJ5dGVzID0gQXJyYXlzLmNvcHlPZihrZXlCeXRlcywga2V5UG9zICogMik7CisgICAgICAgIGtleUJ5dGVzW2tleVBvcysrXSA9IChieXRlKSBuZXh0Qnl0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRQYXRoQnl0ZXMoRGlyZWN0QnVmZmVyIGJ1ZmZlciwgaW50IHBvcywgaW50IGNvdW50KQorICAgIHsKKyAgICAgICAgaW50IG5ld1BvcyA9IGtleVBvcyArIGNvdW50OworICAgICAgICBpZiAobmV3UG9zID4ga2V5Qnl0ZXMubGVuZ3RoKQorICAgICAgICAgICAga2V5Qnl0ZXMgPSBBcnJheXMuY29weU9mKGtleUJ5dGVzLCBNYXRoLm1heChuZXdQb3MgKyAxNiwga2V5Qnl0ZXMubGVuZ3RoICogMikpOworICAgICAgICBidWZmZXIuZ2V0Qnl0ZXMocG9zLCBrZXlCeXRlcywga2V5UG9zLCBjb3VudCk7CisgICAgICAgIGtleVBvcyA9IG5ld1BvczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldFBhdGhMZW5ndGgoaW50IG5ld0xlbmd0aCkKKyAgICB7CisgICAgICAgIGtleVBvcyA9IG5ld0xlbmd0aDsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGUgdG9CeXRlQ29tcGFyYWJsZShieXRlW10gYnl0ZXMsIGludCBieXRlTGVuZ3RoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVDb21wYXJhYmxlLmZpeGVkTGVuZ3RoKEFycmF5cy5jb3B5T2YoYnl0ZXMsIGJ5dGVMZW5ndGgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllVmFsdWVzSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVWYWx1ZXNJdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDM2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllVmFsdWVzSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBPcmRlcmVkIGl0ZXJhdG9yIG9mIHRyaWUgY29udGVudC4KKyAqLworY2xhc3MgVHJpZVZhbHVlc0l0ZXJhdG9yPFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4KK3sKKyAgICBwcml2YXRlIGZpbmFsIFRyaWUuQ3Vyc29yPFQ+IGN1cnNvcjsKKyAgICBUIG5leHQ7CisgICAgYm9vbGVhbiBnb3ROZXh0OworCisgICAgcHJvdGVjdGVkIFRyaWVWYWx1ZXNJdGVyYXRvcihUcmllPFQ+IHRyaWUpCisgICAgeworICAgICAgICBjdXJzb3IgPSB0cmllLmN1cnNvcigpOworICAgICAgICBhc3NlcnQgY3Vyc29yLmRlcHRoKCkgPT0gMDsKKyAgICAgICAgbmV4dCA9IGN1cnNvci5jb250ZW50KCk7CisgICAgICAgIGdvdE5leHQgPSBuZXh0ICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCisgICAgeworICAgICAgICBpZiAoIWdvdE5leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5leHQgPSBjdXJzb3IuYWR2YW5jZVRvQ29udGVudChudWxsKTsKKyAgICAgICAgICAgIGdvdE5leHQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5leHQgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgVCBuZXh0KCkKKyAgICB7CisgICAgICAgIGdvdE5leHQgPSBmYWxzZTsKKyAgICAgICAgVCB2ID0gbmV4dDsKKyAgICAgICAgbmV4dCA9IG51bGw7CisgICAgICAgIHJldHVybiB2OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpZXcvVmlldy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlldy9WaWV3LmphdmEKaW5kZXggZDgxM2QwZS4uYTNlY2MzMyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlldy9WaWV3LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlldy9WaWV3LmphdmEKQEAgLTM1LDYgKzM1LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5WaWV3TWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwpAQCAtMTc3LDcgKzE3OCw3IEBACiAKICAgICAgICAgICAgIHJhd1NlbGVjdC5zZXRCaW5kVmFyaWFibGVzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKIAotICAgICAgICAgICAgc2VsZWN0ID0gcmF3U2VsZWN0LnByZXBhcmUodHJ1ZSk7CisgICAgICAgICAgICBzZWxlY3QgPSByYXdTZWxlY3QucHJlcGFyZShDbGllbnRTdGF0ZS5mb3JJbnRlcm5hbENhbGxzKCksIHRydWUpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHNlbGVjdDsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpZXcvVmlld01hbmFnZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpZXcvVmlld01hbmFnZXIuamF2YQppbmRleCAxMTFmOTZhLi4xMDZhMTVmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aWV3L1ZpZXdNYW5hZ2VyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlldy9WaWV3TWFuYWdlci5qYXZhCkBAIC0zNiw2ICszNiw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlZpZXdzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NVl9FTkFCTEVfQ09PUkRJTkFUT1JfQkFUQ0hMT0c7CisKIC8qKgogICogTWFuYWdlcyB7QGxpbmsgVmlld30ncyBmb3IgYSBzaW5nbGUge0BsaW5rIENvbHVtbkZhbWlseVN0b3JlfS4gQWxsIG9mIHRoZSB2aWV3cyBmb3IgdGhhdCB0YWJsZSBhcmUgY3JlYXRlZCB3aGVuIHRoaXMKICAqIG1hbmFnZXIgaXMgaW5pdGlhbGl6ZWQuCkBAIC01Nyw3ICs1OSw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpcGVkPExvY2s+IExPQ0tTID0gU3RyaXBlZC5sYXp5V2Vha0xvY2soRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbmN1cnJlbnRWaWV3V3JpdGVycygpICogMTAyNCk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGVuYWJsZUNvb3JkaW5hdG9yQmF0Y2hsb2cgPSBCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5tdl9lbmFibGVfY29vcmRpbmF0b3JfYmF0Y2hsb2ciKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGVuYWJsZUNvb3JkaW5hdG9yQmF0Y2hsb2cgPSBNVl9FTkFCTEVfQ09PUkRJTkFUT1JfQkFUQ0hMT0cuZ2V0Qm9vbGVhbigpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgVmlldz4gdmlld3NCeU5hbWUgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwogICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxUYWJsZUlkLCBUYWJsZVZpZXdzPiB2aWV3c0J5QmFzZVRhYmxlID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvQ2xpZW50c1RhYmxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL0NsaWVudHNUYWJsZS5qYXZhCmluZGV4IGQzOWMyNjkuLjAyN2JiOWIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvQ2xpZW50c1RhYmxlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9DbGllbnRzVGFibGUuamF2YQpAQCAtNDAsNiArNDAsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU0xfRU5BQkxFRCA9ICJzc2xfZW5hYmxlZCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTTF9QUk9UT0NPTCA9ICJzc2xfcHJvdG9jb2wiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU0xfQ0lQSEVSX1NVSVRFID0gInNzbF9jaXBoZXJfc3VpdGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRV9OQU1FID0gImtleXNwYWNlX25hbWUiOwogCiAgICAgQ2xpZW50c1RhYmxlKFN0cmluZyBrZXlzcGFjZSkKICAgICB7CkBAIC02MCw2ICs2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbihTU0xfRU5BQkxFRCwgQm9vbGVhblR5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbihTU0xfUFJPVE9DT0wsIFVURjhUeXBlLmluc3RhbmNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oU1NMX0NJUEhFUl9TVUlURSwgVVRGOFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbihLRVlTUEFDRV9OQU1FLCBVVEY4VHlwZS5pbnN0YW5jZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKICAgICB9CiAKQEAgLTgzLDcgKzg1LDggQEAKICAgICAgICAgICAgICAgICAgIC5jb2x1bW4oUkVRVUVTVF9DT1VOVCwgY2xpZW50LnJlcXVlc3RDb3VudCgpKQogICAgICAgICAgICAgICAgICAgLmNvbHVtbihTU0xfRU5BQkxFRCwgY2xpZW50LnNzbEVuYWJsZWQoKSkKICAgICAgICAgICAgICAgICAgIC5jb2x1bW4oU1NMX1BST1RPQ09MLCBjbGllbnQuc3NsUHJvdG9jb2woKS5vckVsc2UobnVsbCkpCi0gICAgICAgICAgICAgICAgICAuY29sdW1uKFNTTF9DSVBIRVJfU1VJVEUsIGNsaWVudC5zc2xDaXBoZXJTdWl0ZSgpLm9yRWxzZShudWxsKSk7CisgICAgICAgICAgICAgICAgICAuY29sdW1uKFNTTF9DSVBIRVJfU1VJVEUsIGNsaWVudC5zc2xDaXBoZXJTdWl0ZSgpLm9yRWxzZShudWxsKSkKKyAgICAgICAgICAgICAgICAgIC5jb2x1bW4oS0VZU1BBQ0VfTkFNRSwgY2xpZW50LmtleXNwYWNlKCkub3JFbHNlKG51bGwpKTsKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL0xvZ01lc3NhZ2VzVGFibGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvTG9nTWVzc2FnZXNUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MDNhYzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL0xvZ01lc3NhZ2VzVGFibGUuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBjaC5xb3MubG9nYmFjay5jbGFzc2ljLnNwaS5Mb2dnaW5nRXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5UaW1lc3RhbXBUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkxvY2FsUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CisKKy8qKgorICogVmlydHVhbCB0YWJsZSBmb3IgaG9sZGluZyBDYXNzYW5kcmEgbG9ncy4gRW50cmllcyB0byB0aGlzIHRhYmxlIGFyZSBhZGRlZCB2aWEgbG9nIGFwcGVuZGVyLgorICogPHA+CisgKiBUaGUgdmlydHVhbCB0YWJsZSBpcyBib3VuZGVkIGluIGl0cyBzaXplLiBJZiBhIG5ldyBsb2cgbWVzc2FnZSBpcyBhcHBlbmRlZCB0byB2aXJ0dWFsIHRhYmxlLAorICogdGhlIG9sZGVzdCBvbmUgaXMgcmVtb3ZlZC4KKyAqIDxwPgorICogVGhpcyB2aXJ0dWFsIHRhYmxlIGNhbiBiZSB0cnVuY2F0ZWQuCisgKiA8cD4KKyAqIFRoaXMgdGFibGUgZG9lcyBub3QgZW5hYmxlIHtAY29kZSBBTExPVyBGSUxURVJJTkd9IGltcGxpY2l0bHkuCisgKgorICogQHNlZSA8YSBocmVmPSJodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS0xODIzOCI+Q0FTU0FORFJBLTE4MjM4PC9hPgorICogQHNlZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5sb2dnaW5nLlZpcnR1YWxUYWJsZUFwcGVuZGVyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBMb2dNZXNzYWdlc1RhYmxlIGV4dGVuZHMgQWJzdHJhY3RNdXRhYmxlVmlydHVhbFRhYmxlCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExvZ01lc3NhZ2VzVGFibGUuY2xhc3MpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9HU19WSVJUVUFMX1RBQkxFX01JTl9ST1dTID0gMTAwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0dTX1ZJUlRVQUxfVEFCTEVfREVGQVVMVF9ST1dTID0gNTBfMDAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPR1NfVklSVFVBTF9UQUJMRV9NQVhfUk9XUyA9IDEwMF8wMDA7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gInN5c3RlbV9sb2dzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfQ09NTUVOVCA9ICJDYXNzYW5kcmEgbG9ncyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FU1RBTVBfQ09MVU1OX05BTUUgPSAidGltZXN0YW1wIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHRVJfQ09MVU1OX05BTUUgPSAibG9nZ2VyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUl9JTl9NSUxMSVNFQ09ORF9DT0xVTU5fTkFNRSA9ICJvcmRlcl9pbl9taWxsaXNlY29uZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVWRUxfQ09MVU1OX05BTUUgPSAibGV2ZWwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0VfQ09MVU1OX05BTUUgPSAibWVzc2FnZSI7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8TG9nTWVzc2FnZT4gYnVmZmVyOworCisgICAgTG9nTWVzc2FnZXNUYWJsZShTdHJpbmcga2V5c3BhY2UpCisgICAgeworICAgICAgICB0aGlzKGtleXNwYWNlLCByZXNvbHZlQnVmZmVyU2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBMb2dNZXNzYWdlc1RhYmxlKFN0cmluZyBrZXlzcGFjZSwgaW50IHNpemUpCisgICAgeworICAgICAgICBzdXBlcihUYWJsZU1ldGFkYXRhLmJ1aWxkZXIoa2V5c3BhY2UsIFRBQkxFX05BTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tbWVudChUQUJMRV9DT01NRU5UKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmtpbmQoVGFibGVNZXRhZGF0YS5LaW5kLlZJUlRVQUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFydGl0aW9uZXIobmV3IExvY2FsUGFydGl0aW9uZXIoVGltZXN0YW1wVHlwZS5pbnN0YW5jZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUGFydGl0aW9uS2V5Q29sdW1uKFRJTUVTVEFNUF9DT0xVTU5fTkFNRSwgVGltZXN0YW1wVHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbHVzdGVyaW5nQ29sdW1uKE9SREVSX0lOX01JTExJU0VDT05EX0NPTFVNTl9OQU1FLCBJbnQzMlR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbihMT0dHRVJfQ09MVU1OX05BTUUsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oTEVWRUxfQ09MVU1OX05BTUUsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oTUVTU0FHRV9DT0xVTU5fTkFNRSwgVVRGOFR5cGUuaW5zdGFuY2UpLmJ1aWxkKCkpOworCisgICAgICAgIGxvZ2dlci5kZWJ1ZygiY2FwYWNpdHkgb2YgdmlydHVhbCB0YWJsZSB7fSBpcyBzZXQgdG8gYmUgYXQgbW9zdCB7fSByb3dzIiwgbWV0YWRhdGEoKS50b1N0cmluZygpLCBzaXplKTsKKyAgICAgICAgYnVmZmVyID0gQm91bmRlZExpbmtlZExpc3QuY3JlYXRlKHNpemUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEYXRhU2V0IGRhdGEoKQorICAgIHsKKyAgICAgICAgU2ltcGxlRGF0YVNldCByZXN1bHQgPSBuZXcgU2ltcGxlRGF0YVNldChtZXRhZGF0YSgpLCBEZWNvcmF0ZWRLZXkuY29tcGFyYXRvci5yZXZlcnNlZCgpKTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKGJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBtaWxsaVNlY29uZHNPZlByZXZpb3VzTG9nID0gMDsKKyAgICAgICAgICAgIGxvbmcgbWlsbGlTZWNvbmRzT2ZDdXJyZW50TG9nOworCisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworCisgICAgICAgICAgICBJdGVyYXRvcjxMb2dNZXNzYWdlPiBpdGVyYXRvciA9IGJ1ZmZlci5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTG9nTWVzc2FnZSBsb2cgPSBpdGVyYXRvci5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICBtaWxsaVNlY29uZHNPZkN1cnJlbnRMb2cgPSBsb2cudGltZXN0YW1wOworICAgICAgICAgICAgICAgIGlmIChtaWxsaVNlY29uZHNPZlByZXZpb3VzTG9nID09IG1pbGxpU2Vjb25kc09mQ3VycmVudExvZykKKyAgICAgICAgICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKKworICAgICAgICAgICAgICAgIG1pbGxpU2Vjb25kc09mUHJldmlvdXNMb2cgPSBtaWxsaVNlY29uZHNPZkN1cnJlbnRMb2c7CisKKyAgICAgICAgICAgICAgICByZXN1bHQucm93KG5ldyBEYXRlKGxvZy50aW1lc3RhbXApLCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICAuY29sdW1uKExPR0dFUl9DT0xVTU5fTkFNRSwgbG9nLmxvZ2dlcikKKyAgICAgICAgICAgICAgICAgICAgICAuY29sdW1uKExFVkVMX0NPTFVNTl9OQU1FLCBsb2cubGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgLmNvbHVtbihNRVNTQUdFX0NPTFVNTl9OQU1FLCBsb2cubWVzc2FnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZChMb2dnaW5nRXZlbnQgZXZlbnQpCisgICAgeworICAgICAgICBidWZmZXIuYWRkKG5ldyBMb2dNZXNzYWdlKGV2ZW50KSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdHJ1bmNhdGUoKQorICAgIHsKKyAgICAgICAgYnVmZmVyLmNsZWFyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYWxsb3dGaWx0ZXJpbmdJbXBsaWNpdGx5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBzdGF0aWMgaW50IHJlc29sdmVCdWZmZXJTaXplKCkKKyAgICB7CisgICAgICAgIGludCBzaXplID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkxPR1NfVklSVFVBTF9UQUJMRV9NQVhfUk9XUy5nZXRJbnQoKTsKKyAgICAgICAgcmV0dXJuIChzaXplIDwgTE9HU19WSVJUVUFMX1RBQkxFX01JTl9ST1dTIHx8IHNpemUgPiBMT0dTX1ZJUlRVQUxfVEFCTEVfTUFYX1JPV1MpCisgICAgICAgICAgICAgICA/IExPR1NfVklSVFVBTF9UQUJMRV9ERUZBVUxUX1JPV1MgOiBzaXplOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTG9nTWVzc2FnZQorICAgIHsKKyAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgdGltZXN0YW1wOworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGxvZ2dlcjsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBsZXZlbDsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBtZXNzYWdlOworCisgICAgICAgIHB1YmxpYyBMb2dNZXNzYWdlKExvZ2dpbmdFdmVudCBldmVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcyhldmVudC5nZXRUaW1lU3RhbXAoKSwgZXZlbnQuZ2V0TG9nZ2VyTmFtZSgpLCBldmVudC5nZXRMZXZlbCgpLnRvU3RyaW5nKCksIGV2ZW50LmdldEZvcm1hdHRlZE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTG9nTWVzc2FnZShsb25nIHRpbWVzdGFtcCwgU3RyaW5nIGxvZ2dlciwgU3RyaW5nIGxldmVsLCBTdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKKyAgICAgICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBCb3VuZGVkTGlua2VkTGlzdDxUPiBleHRlbmRzIExpbmtlZExpc3Q8VD4KKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1heFNpemU7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyA8VD4gTGlzdDxUPiBjcmVhdGUoaW50IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBCb3VuZGVkTGlua2VkTGlzdDw+KHNpemUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQm91bmRlZExpbmtlZExpc3QoaW50IG1heFNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWF4U2l6ZSA9IG1heFNpemU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkKFQgdCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNpemUoKSA9PSBtYXhTaXplKQorICAgICAgICAgICAgICAgIHJlbW92ZUxhc3QoKTsKKworICAgICAgICAgICAgYWRkRmlyc3QodCk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9RdWVyaWVzVGFibGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvUXVlcmllc1RhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViYTYxYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvUXVlcmllc1RhYmxlLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRGVidWdnYWJsZVRhc2s7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TaGFyZWRFeGVjdXRvclBvb2w7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Mb25nVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Mb2NhbFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5Mb25nLm1heDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTkFOT1NFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1vbm90b25pY0Nsb2NrLkdsb2JhbC5hcHByb3hUaW1lOworCisvKioKKyAqIFZpcnR1YWwgdGFibGUgdGhhdCBsaXN0cyBjdXJyZW50bHkgcnVubmluZyBxdWVyaWVzIG9uIHRoZSBOVFIgKGNvb3JkaW5hdG9yKSBhbmQgUmVhZC9NdXRhdGlvbiAobG9jYWwpIHN0YWdlcworICoKKyAqIEV4YW1wbGU6CisgKiA8cHJlPgorICogY3Fsc2g+IFNFTEVDVCAqIEZST00gc3lzdGVtX3ZpZXdzLnF1ZXJpZXM7CisgKgorICogIHRocmVhZF9pZCAgICAgICAgICAgICAgICAgICB8IHF1ZXVlZF9taWNyb3MgfCAgcnVubmluZ19taWNyb3MgfCB0YXNrCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgTmF0aXZlLVRyYW5zcG9ydC1SZXF1ZXN0cy03IHwgICAgICAgICA3MjkyMyB8ICAgICAgICAgICAgNzYxMSB8ICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIHNlbGVjdCAqIGZyb20gc3lzdGVtX3ZpZXdzLnF1ZXJpZXM7IFtwYWdlU2l6ZSA9IDEwMF0KKyAqICAgICAgICAgICAgICBNdXRhdGlvblN0YWdlLTIgfCAgICAgICAgIDE4MjQ5IHwgICAgICAgICAgICAyMDg0IHwgTXV0YXRpb24oa2V5c3BhY2U9J2Rpc3RyaWJ1dGVkX3Rlc3Rfa2V5c3BhY2UnLCBrZXk9JzAwMDAwMGY4JywgbW9kaWZpY2F0aW9ucy4uLgorICogICAgICAgICAgICAgICAgICBSZWFkU3RhZ2UtMiB8ICAgICAgICAgNzI0NDcgfCAgICAgICAgICAgMTAxMjEgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUICogRlJPTSBrZXlzcGFjZS50YWJsZSBMSU1JVCA1MDAwCisgKiA8L3ByZT4KKyAqLyAgICAKK2ZpbmFsIGNsYXNzIFF1ZXJpZXNUYWJsZSBleHRlbmRzIEFic3RyYWN0VmlydHVhbFRhYmxlCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAicXVlcmllcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInRocmVhZF9pZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVVFRCA9ICJxdWV1ZWRfbWljcm9zIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVOTklORyA9ICJydW5uaW5nX21pY3JvcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0MgPSAidGFzayI7CisKKyAgICBRdWVyaWVzVGFibGUoU3RyaW5nIGtleXNwYWNlKQorICAgIHsKKyAgICAgICAgc3VwZXIoVGFibGVNZXRhZGF0YS5idWlsZGVyKGtleXNwYWNlLCBUQUJMRV9OQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbW1lbnQoIkxpc3RzIGN1cnJlbnRseSBydW5uaW5nIHF1ZXJpZXMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmtpbmQoVGFibGVNZXRhZGF0YS5LaW5kLlZJUlRVQUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFydGl0aW9uZXIobmV3IExvY2FsUGFydGl0aW9uZXIoVVRGOFR5cGUuaW5zdGFuY2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRocmVhZCBuYW1lIGlzIHVuaXF1ZSBzaW5jZSB0aGUgaWQgZ2l2ZW4gdG8gZWFjaCBTRVBXb3JrZXIgaXMgdW5pcXVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUGFydGl0aW9uS2V5Q29sdW1uKElELCBVVEY4VHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKFFVRVVFRCwgTG9uZ1R5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbihSVU5OSU5HLCBMb25nVHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKERFU0MsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdhbGtzIHRoZSB7QGxpbmsgU2hhcmVkRXhlY3V0b3JQb29sfSB3b3JrZXJzIGZvciBhbnkge0BsaW5rIERlYnVnZ2FibGVUYXNrfSBpbnN0YW5jZXMgYW5kIHBvcHVsYXRlcyB0aGUgdGFibGUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERhdGFTZXQgZGF0YSgpCisgICAgeworICAgICAgICBTaW1wbGVEYXRhU2V0IHJlc3VsdCA9IG5ldyBTaW1wbGVEYXRhU2V0KG1ldGFkYXRhKCkpOworICAgICAgICAKKyAgICAgICAgZm9yIChEZWJ1Z2dhYmxlVGFzay5SdW5uaW5nRGVidWdnYWJsZVRhc2sgdGFzayA6IFNoYXJlZEV4ZWN1dG9yUG9vbC5TSEFSRUQucnVubmluZ1Rhc2tzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghdGFzay5oYXNUYXNrKCkpIGNvbnRpbnVlOworICAgICAgICAgICAgCisgICAgICAgICAgICBsb25nIGNyZWF0aW9uVGltZU5hbm9zID0gdGFzay5jcmVhdGlvblRpbWVOYW5vcygpOworICAgICAgICAgICAgbG9uZyBzdGFydFRpbWVOYW5vcyA9IHRhc2suc3RhcnRUaW1lTmFub3MoKTsKKyAgICAgICAgICAgIGxvbmcgbm93ID0gYXBwcm94VGltZS5ub3coKTsKKworICAgICAgICAgICAgbG9uZyBxdWV1ZWRNaWNyb3MgPSBOQU5PU0VDT05EUy50b01pY3JvcyhtYXgoKHN0YXJ0VGltZU5hbm9zID4gMCA/IHN0YXJ0VGltZU5hbm9zIDogbm93KSAtIGNyZWF0aW9uVGltZU5hbm9zLCAwKSk7CisgICAgICAgICAgICBsb25nIHJ1bm5pbmdNaWNyb3MgPSBzdGFydFRpbWVOYW5vcyA+IDAgPyBOQU5PU0VDT05EUy50b01pY3Jvcyhub3cgLSBzdGFydFRpbWVOYW5vcykgOiAwOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXN1bHQucm93KHRhc2sudGhyZWFkSWQoKSkKKyAgICAgICAgICAgICAgICAgIC5jb2x1bW4oUVVFVUVELCBxdWV1ZWRNaWNyb3MpCisgICAgICAgICAgICAgICAgICAuY29sdW1uKFJVTk5JTkcsIHJ1bm5pbmdNaWNyb3MpCisgICAgICAgICAgICAgICAgICAuY29sdW1uKERFU0MsIHRhc2suZGVzY3JpcHRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TU1RhYmxlVGFza3NUYWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TU1RhYmxlVGFza3NUYWJsZS5qYXZhCmluZGV4IDQ4OGI1ODAuLmUyZjM4ZjggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU1NUYWJsZVRhc2tzVGFibGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1NTVGFibGVUYXNrc1RhYmxlLmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1NUQUJMRVMgPSAic3N0YWJsZXMiOwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUT1RBTCA9ICJ0b3RhbCI7CiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOSVQgPSAidW5pdCI7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRBUkdFVF9ESVJFQ1RPUlkgPSAidGFyZ2V0X2RpcmVjdG9yeSI7CiAKICAgICBTU1RhYmxlVGFza3NUYWJsZShTdHJpbmcga2V5c3BhY2UpCiAgICAgewpAQCAtNTQsNiArNTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oU1NUQUJMRVMsIEludDMyVHlwZS5pbnN0YW5jZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKFRPVEFMLCBMb25nVHlwZS5pbnN0YW5jZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKFVOSVQsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oVEFSR0VUX0RJUkVDVE9SWSwgVVRGOFR5cGUuaW5zdGFuY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CiAgICAgfQogCkBAIC03Niw3ICs3OCw4IEBACiAgICAgICAgICAgICAgICAgICAuY29sdW1uKFBST0dSRVNTLCBjb21wbGV0ZWQpCiAgICAgICAgICAgICAgICAgICAuY29sdW1uKFNTVEFCTEVTLCB0YXNrLmdldFNTVGFibGVzKCkuc2l6ZSgpKQogICAgICAgICAgICAgICAgICAgLmNvbHVtbihUT1RBTCwgdG90YWwpCi0gICAgICAgICAgICAgICAgICAuY29sdW1uKFVOSVQsIHRhc2suZ2V0VW5pdCgpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSk7CisgICAgICAgICAgICAgICAgICAuY29sdW1uKFVOSVQsIHRhc2suZ2V0VW5pdCgpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkKKyAgICAgICAgICAgICAgICAgIC5jb2x1bW4oVEFSR0VUX0RJUkVDVE9SWSwgdGFzay50YXJnZXREaXJlY3RvcnkoKSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TaW1wbGVEYXRhU2V0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1NpbXBsZURhdGFTZXQuamF2YQppbmRleCA3MTVmNGY4Li42ZjMwNTJkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1NpbXBsZURhdGFTZXQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1NpbXBsZURhdGFTZXQuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTU0LDEwICs1NSwxNSBAQAogCiAgICAgcHJpdmF0ZSBSb3cgY3VycmVudFJvdzsKIAorICAgIHB1YmxpYyBTaW1wbGVEYXRhU2V0KFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIENvbXBhcmF0b3I8RGVjb3JhdGVkS2V5PiBjb21wYXJhdG9yKQorICAgIHsKKyAgICAgICAgc3VwZXIobmV3IFRyZWVNYXA8Pihjb21wYXJhdG9yKSk7CisgICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICB9CisKICAgICBwdWJsaWMgU2ltcGxlRGF0YVNldChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKQogICAgIHsKLSAgICAgICAgc3VwZXIobmV3IFRyZWVNYXA8PihEZWNvcmF0ZWRLZXkuY29tcGFyYXRvcikpOwotICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7CisgICAgICAgIHRoaXMobWV0YWRhdGEsIERlY29yYXRlZEtleS5jb21wYXJhdG9yKTsKICAgICB9CiAKICAgICBwdWJsaWMgU2ltcGxlRGF0YVNldCByb3coT2JqZWN0Li4uIHByaW1hcnlLZXlWYWx1ZXMpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1NuYXBzaG90c1RhYmxlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1NuYXBzaG90c1RhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNkZjI5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU25hcHNob3RzVGFibGUuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQm9vbGVhblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Mb25nVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlRpbWVzdGFtcFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTG9jYWxQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2Uuc25hcHNob3QuVGFibGVTbmFwc2hvdDsKKworcHVibGljIGNsYXNzIFNuYXBzaG90c1RhYmxlIGV4dGVuZHMgQWJzdHJhY3RWaXJ0dWFsVGFibGUKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0VfTkFNRSA9ICJrZXlzcGFjZV9uYW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJ0YWJsZV9uYW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRV9TSVpFID0gInRydWVfc2l6ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJWkVfT05fRElTSyA9ICJzaXplX29uX2Rpc2siOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVEX0FUID0gImNyZWF0ZWRfYXQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFBJUkVTX0FUID0gImV4cGlyZXNfYXQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUEhFTUVSQUwgPSAiZXBoZW1lcmFsIjsKKworICAgIFNuYXBzaG90c1RhYmxlKFN0cmluZyBrZXlzcGFjZSkKKyAgICB7CisgICAgICAgIHN1cGVyKFRhYmxlTWV0YWRhdGEuYnVpbGRlcihrZXlzcGFjZSwgInNuYXBzaG90cyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tbWVudCgiYXZhaWxhYmxlIHNuYXBzaG90cyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAua2luZChUYWJsZU1ldGFkYXRhLktpbmQuVklSVFVBTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJ0aXRpb25lcihuZXcgTG9jYWxQYXJ0aXRpb25lcihVVEY4VHlwZS5pbnN0YW5jZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUGFydGl0aW9uS2V5Q29sdW1uKE5BTUUsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsdXN0ZXJpbmdDb2x1bW4oS0VZU1BBQ0VfTkFNRSwgVVRGOFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2x1c3RlcmluZ0NvbHVtbihUQUJMRV9OQU1FLCBVVEY4VHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKFRSVUVfU0laRSwgTG9uZ1R5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbihTSVpFX09OX0RJU0ssIExvbmdUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oQ1JFQVRFRF9BVCwgVGltZXN0YW1wVHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKEVYUElSRVNfQVQsIFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbihFUEhFTUVSQUwsIEJvb2xlYW5UeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEYXRhU2V0IGRhdGEoKQorICAgIHsKKyAgICAgICAgU2ltcGxlRGF0YVNldCByZXN1bHQgPSBuZXcgU2ltcGxlRGF0YVNldChtZXRhZGF0YSgpKTsKKworICAgICAgICBmb3IgKFRhYmxlU25hcHNob3QgdGFibGVTbmFwc2hvdCA6IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLnNuYXBzaG90TWFuYWdlci5sb2FkU25hcHNob3RzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNpbXBsZURhdGFTZXQgcm93ID0gcmVzdWx0LnJvdyh0YWJsZVNuYXBzaG90LmdldFRhZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlU25hcHNob3QuZ2V0S2V5c3BhY2VOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVTbmFwc2hvdC5nZXRUYWJsZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbHVtbihUUlVFX1NJWkUsIHRhYmxlU25hcHNob3QuY29tcHV0ZVRydWVTaXplQnl0ZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbHVtbihTSVpFX09OX0RJU0ssIHRhYmxlU25hcHNob3QuY29tcHV0ZVNpemVPbkRpc2tCeXRlcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sdW1uKENSRUFURURfQVQsIG5ldyBEYXRlKHRhYmxlU25hcHNob3QuZ2V0Q3JlYXRlZEF0KCkudG9FcG9jaE1pbGxpKCkpKTsKKworICAgICAgICAgICAgaWYgKHRhYmxlU25hcHNob3QuaXNFeHBpcmluZygpKQorICAgICAgICAgICAgICAgIHJvdy5jb2x1bW4oRVhQSVJFU19BVCwgbmV3IERhdGUodGFibGVTbmFwc2hvdC5nZXRFeHBpcmVzQXQoKS50b0Vwb2NoTWlsbGkoKSkpOworCisgICAgICAgICAgICByb3cuY29sdW1uKEVQSEVNRVJBTCwgdGFibGVTbmFwc2hvdC5pc0VwaGVtZXJhbCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TeXN0ZW1Qcm9wZXJ0aWVzVGFibGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU3lzdGVtUHJvcGVydGllc1RhYmxlLmphdmEKaW5kZXggZDA4ZDYxNC4uZjFkMGQ3YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TeXN0ZW1Qcm9wZXJ0aWVzVGFibGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1N5c3RlbVByb3BlcnRpZXNUYWJsZS5qYXZhCkBAIC00NywxNSArNDcsMTUgQEAKICAgICB7CiAgICAgICAgIFNpbXBsZURhdGFTZXQgcmVzdWx0ID0gbmV3IFNpbXBsZURhdGFTZXQobWV0YWRhdGEoKSk7CiAKLSAgICAgICAgU3lzdGVtLmdldGVudigpLmtleVNldCgpCisgICAgICAgIFN5c3RlbS5nZXRlbnYoKS5rZXlTZXQoKSAvLyBjaGVja3N0eWxlOiBzdXBwcmVzcyBuZWFyYnkgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKICAgICAgICAgICAgICAgLnN0cmVhbSgpCiAgICAgICAgICAgICAgIC5maWx0ZXIoU3lzdGVtUHJvcGVydGllc1RhYmxlOjppc0Nhc3NhbmRyYVJlbGV2YW50KQotICAgICAgICAgICAgICAuZm9yRWFjaChuYW1lIC0+IGFkZFJvdyhyZXN1bHQsIG5hbWUsIFN5c3RlbS5nZXRlbnYobmFtZSkpKTsKKyAgICAgICAgICAgICAgLmZvckVhY2gobmFtZSAtPiBhZGRSb3cocmVzdWx0LCBuYW1lLCBTeXN0ZW0uZ2V0ZW52KG5hbWUpKSk7IC8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnYmxvY2tTeXN0ZW1Qcm9wZXJ0eVVzYWdlJwogCiAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuc3RyaW5nUHJvcGVydHlOYW1lcygpCiAgICAgICAgICAgICAgIC5zdHJlYW0oKQogICAgICAgICAgICAgICAuZmlsdGVyKFN5c3RlbVByb3BlcnRpZXNUYWJsZTo6aXNDYXNzYW5kcmFSZWxldmFudCkKLSAgICAgICAgICAgICAgLmZvckVhY2gobmFtZSAtPiBhZGRSb3cocmVzdWx0LCBuYW1lLCBTeXN0ZW0uZ2V0UHJvcGVydHkobmFtZSkpKTsKKyAgICAgICAgICAgICAgLmZvckVhY2gobmFtZSAtPiBhZGRSb3cocmVzdWx0LCBuYW1lLCBTeXN0ZW0uZ2V0UHJvcGVydHkobmFtZSkpKTsgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdibG9ja1N5c3RlbVByb3BlcnR5VXNhZ2UnCiAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CkBAIC02Niw3ICs2Niw3IEBACiAgICAgICAgIFNpbXBsZURhdGFTZXQgcmVzdWx0ID0gbmV3IFNpbXBsZURhdGFTZXQobWV0YWRhdGEoKSk7CiAgICAgICAgIFN0cmluZyBuYW1lID0gVVRGOFR5cGUuaW5zdGFuY2UuY29tcG9zZShwYXJ0aXRpb25LZXkuZ2V0S2V5KCkpOwogICAgICAgICBpZiAoaXNDYXNzYW5kcmFSZWxldmFudChuYW1lKSkKLSAgICAgICAgICAgIGFkZFJvdyhyZXN1bHQsIG5hbWUsIFN5c3RlbS5nZXRQcm9wZXJ0eShuYW1lLCBTeXN0ZW0uZ2V0ZW52KG5hbWUpKSk7CisgICAgICAgICAgICBhZGRSb3cocmVzdWx0LCBuYW1lLCBTeXN0ZW0uZ2V0UHJvcGVydHkobmFtZSwgU3lzdGVtLmdldGVudihuYW1lKSkpOyAvLyBjaGVja3N0eWxlOiBzdXBwcmVzcyBuZWFyYnkgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKIAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU3lzdGVtVmlld3NLZXlzcGFjZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TeXN0ZW1WaWV3c0tleXNwYWNlLmphdmEKaW5kZXggZjEzZTYxYy4uMTJkZjZjNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TeXN0ZW1WaWV3c0tleXNwYWNlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TeXN0ZW1WaWV3c0tleXNwYWNlLmphdmEKQEAgLTQ3LDYgKzQ3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgQmF0Y2hNZXRyaWNzVGFibGUoVklSVFVBTF9WSUVXUykpCiAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFN0cmVhbWluZ1ZpcnR1YWxUYWJsZShWSVJUVUFMX1ZJRVdTKSkKICAgICAgICAgICAgICAgICAgICAgLmFkZChuZXcgR29zc2lwSW5mb1RhYmxlKFZJUlRVQUxfVklFV1MpKQorICAgICAgICAgICAgICAgICAgICAuYWRkKG5ldyBRdWVyaWVzVGFibGUoVklSVFVBTF9WSUVXUykpCisgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IExvZ01lc3NhZ2VzVGFibGUoVklSVFVBTF9WSUVXUykpCisgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3IFNuYXBzaG90c1RhYmxlKFZJUlRVQUxfVklFV1MpKQogICAgICAgICAgICAgICAgICAgICAuYWRkQWxsKExvY2FsUmVwYWlyVGFibGVzLmdldEFsbChWSVJUVUFMX1ZJRVdTKSkKICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvVGFibGVNZXRyaWNUYWJsZXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvVGFibGVNZXRyaWNUYWJsZXMuamF2YQppbmRleCA5ZmY0MjFjLi44MzY4ZmQ5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1RhYmxlTWV0cmljVGFibGVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9UYWJsZU1ldHJpY1RhYmxlcy5qYXZhCkBAIC03Nyw3ICs3Nyw5IEBACiAgICAgICAgICAgICBuZXcgSGlzdG9ncmFtVGFibGVNZXRyaWMobmFtZSwgInRvbWJzdG9uZXNfcGVyX3JlYWQiLCB0IC0+IHQudG9tYnN0b25lU2Nhbm5lZEhpc3RvZ3JhbS5jZiksCiAgICAgICAgICAgICBuZXcgSGlzdG9ncmFtVGFibGVNZXRyaWMobmFtZSwgInJvd3NfcGVyX3JlYWQiLCB0IC0+IHQubGl2ZVNjYW5uZWRIaXN0b2dyYW0uY2YpLAogICAgICAgICAgICAgbmV3IFN0b3JhZ2VUYWJsZU1ldHJpYyhuYW1lLCAiZGlza191c2FnZSIsIChUYWJsZU1ldHJpY3MgdCkgLT4gdC50b3RhbERpc2tTcGFjZVVzZWQpLAotICAgICAgICAgICAgbmV3IFN0b3JhZ2VUYWJsZU1ldHJpYyhuYW1lLCAibWF4X3BhcnRpdGlvbl9zaXplIiwgKFRhYmxlTWV0cmljcyB0KSAtPiB0Lm1heFBhcnRpdGlvblNpemUpKTsKKyAgICAgICAgICAgIG5ldyBTdG9yYWdlVGFibGVNZXRyaWMobmFtZSwgIm1heF9wYXJ0aXRpb25fc2l6ZSIsIChUYWJsZU1ldHJpY3MgdCkgLT4gdC5tYXhQYXJ0aXRpb25TaXplKSwKKyAgICAgICAgICAgIG5ldyBTdG9yYWdlVGFibGVNZXRyaWMobmFtZSwgIm1heF9zc3RhYmxlX3NpemUiLCAoVGFibGVNZXRyaWNzIHQpIC0+IHQubWF4U1NUYWJsZVNpemUpLAorICAgICAgICAgICAgbmV3IFRhYmxlTWV0cmljVGFibGUobmFtZSwgIm1heF9zc3RhYmxlX2R1cmF0aW9uIiwgdCAtPiB0Lm1heFNTVGFibGVEdXJhdGlvbiwgIm1heF9zc3RhYmxlX2R1cmF0aW9uIiwgTG9uZ1R5cGUuaW5zdGFuY2UsICIiKSk7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1ZpcnR1YWxUYWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9WaXJ0dWFsVGFibGUuamF2YQppbmRleCA1MzczZjRjLi41M2E5ZjJhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1ZpcnR1YWxUYWJsZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvVmlydHVhbFRhYmxlLmphdmEKQEAgLTc2LDQgKzc2LDE1IEBACiAgICAgICogVHJ1bmNhdGVzIGRhdGEgZnJvbSB0aGUgdW5kZXJseWluZyBzb3VyY2UsIGlmIHN1cHBvcnRlZC4KICAgICAgKi8KICAgICB2b2lkIHRydW5jYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBUZWxscyB3aGV0aGVyIHtAY29kZSBBTExPVyBGSUxURVJJTkd9IGlzIGltcGxpY2l0bHkgYWRkZWQgdG8gc2VsZWN0IHN0YXRlbWVudAorICAgICAqIHdoaWNoIHJlcXVpcmVzIGl0LiBEZWZhdWx0cyB0byB0cnVlLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHtAY29kZSBBTExPVyBGSUxURVJJTkd9IGlzIGltcGxpY2l0bHkgYWRkZWQgdG8gc2VsZWN0IHN0YXRlbWVudHMgd2hlbiByZXF1aXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGRlZmF1bHQgYm9vbGVhbiBhbGxvd0ZpbHRlcmluZ0ltcGxpY2l0bHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L0J5dGVPcmRlcmVkUGFydGl0aW9uZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9CeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmphdmEKaW5kZXggM2E1ZGI1Mi4uYWU5MjljOCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L0J5dGVPcmRlcmVkUGFydGl0aW9uZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5qYXZhCkBAIC0yNiw2ICsyNiw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlSW52ZXJzZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5IZXg7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7CkBAIC0xMDIsNiArMTA1LDEyIEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS5vZih0b2tlbiwgdmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIElQYXJ0aXRpb25lciBnZXRQYXJ0aXRpb25lcigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKQEAgLTIyMiw2ICsyMzEsMTEgQEAKIAogICAgIHByaXZhdGUgZmluYWwgVG9rZW4uVG9rZW5GYWN0b3J5IHRva2VuRmFjdG9yeSA9IG5ldyBUb2tlbi5Ub2tlbkZhY3RvcnkoKQogICAgIHsKKyAgICAgICAgcHVibGljIFRva2VuIGZyb21Db21wYXJhYmxlQnl0ZXMoQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlc1Rva2VuKEJ5dGVTb3VyY2VJbnZlcnNlLmdldFVuZXNjYXBlZEJ5dGVzKGNvbXBhcmFibGVCeXRlcykpOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgdG9CeXRlQXJyYXkoVG9rZW4gdG9rZW4pCiAgICAgICAgIHsKICAgICAgICAgICAgIEJ5dGVzVG9rZW4gYnl0ZXNUb2tlbiA9IChCeXRlc1Rva2VuKSB0b2tlbjsKQEAgLTI4Nyw3ICszMDEsNyBAQAogICAgICAgICBUb2tlbiBsYXN0VG9rZW4gPSBzb3J0ZWRUb2tlbnMuZ2V0KHNvcnRlZFRva2Vucy5zaXplKCkgLSAxKTsKICAgICAgICAgZm9yIChUb2tlbiBub2RlIDogc29ydGVkVG9rZW5zKQogICAgICAgICB7Ci0gICAgICAgICAgICBhbGxUb2tlbnMucHV0KG5vZGUsIG5ldyBGbG9hdCgwLjApKTsKKyAgICAgICAgICAgIGFsbFRva2Vucy5wdXQobm9kZSwgMC4wRik7CiAgICAgICAgICAgICBzb3J0ZWRSYW5nZXMuYWRkKG5ldyBSYW5nZTxUb2tlbj4obGFzdFRva2VuLCBub2RlKSk7CiAgICAgICAgICAgICBsYXN0VG9rZW4gPSBub2RlOwogICAgICAgICB9CkBAIC0zMDUsNyArMzE5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFN1bSBldmVyeSBjb3VudCB1cCBhbmQgZGl2aWRlIGNvdW50L3RvdGFsIGZvciB0aGUgZnJhY3Rpb25hbCBvd25lcnNoaXAuCi0gICAgICAgIEZsb2F0IHRvdGFsID0gbmV3IEZsb2F0KDAuMCk7CisgICAgICAgIEZsb2F0IHRvdGFsID0gMC4wRjsKICAgICAgICAgZm9yIChGbG9hdCBmIDogYWxsVG9rZW5zLnZhbHVlcygpKQogICAgICAgICAgICAgdG90YWwgKz0gZjsKICAgICAgICAgZm9yIChNYXAuRW50cnk8VG9rZW4sIEZsb2F0PiByb3cgOiBhbGxUb2tlbnMuZW50cnlTZXQoKSkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9Mb2NhbFBhcnRpdGlvbmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvTG9jYWxQYXJ0aXRpb25lci5qYXZhCmluZGV4IDA5Y2QyYjcuLjc0YTEyNjQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9Mb2NhbFBhcnRpdGlvbmVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L0xvY2FsUGFydGl0aW9uZXIuamF2YQpAQCAtMjYsNyArMjYsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2FjaGVkSGFzaERlY29yYXRlZEtleTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVCdWZmZXJBY2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk9iamVjdFNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5IZWFwQ2xvbmVyOwogCkBAIC04Myw2ICs4NiwxMiBAQAogCiAgICAgcHJpdmF0ZSBmaW5hbCBUb2tlbi5Ub2tlbkZhY3RvcnkgdG9rZW5GYWN0b3J5ID0gbmV3IFRva2VuLlRva2VuRmFjdG9yeSgpCiAgICAgeworICAgICAgICBwdWJsaWMgVG9rZW4gZnJvbUNvbXBhcmFibGVCeXRlcyhCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHRva2VuRGF0YSA9IGNvbXBhcmF0b3IuZnJvbUNvbXBhcmFibGVCeXRlcyhCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGNvbXBhcmFibGVCeXRlcywgdmVyc2lvbik7CisgICAgICAgICAgICByZXR1cm4gbmV3IExvY2FsVG9rZW4odG9rZW5EYXRhKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIHRvQnl0ZUFycmF5KFRva2VuIHRva2VuKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gKChMb2NhbFRva2VuKXRva2VuKS50b2tlbjsKQEAgLTExNiw3ICsxMjUsNyBAQAogCiAgICAgcHVibGljIE1hcDxUb2tlbiwgRmxvYXQ+IGRlc2NyaWJlT3duZXJzaGlwKExpc3Q8VG9rZW4+IHNvcnRlZFRva2VucykKICAgICB7Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoKFRva2VuKWdldE1pbmltdW1Ub2tlbigpLCBuZXcgRmxvYXQoMS4wKSk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoKFRva2VuKWdldE1pbmltdW1Ub2tlbigpLCAxLjBGKTsKICAgICB9CiAKICAgICBwdWJsaWMgQWJzdHJhY3RUeXBlPD8+IGdldFRva2VuVmFsaWRhdG9yKCkKQEAgLTE3NSw2ICsxODQsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJhdG9yLmFzQ29tcGFyYWJsZUJ5dGVzKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgdG9rZW4sIHZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBJUGFydGl0aW9uZXIgZ2V0UGFydGl0aW9uZXIoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gTG9jYWxQYXJ0aXRpb25lci50aGlzOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L011cm11cjNQYXJ0aXRpb25lci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L011cm11cjNQYXJ0aXRpb25lci5qYXZhCmluZGV4IGUyZGFhYzQuLjU3OTkzYTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9NdXJtdXIzUGFydGl0aW9uZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvTXVybXVyM1BhcnRpdGlvbmVyLmphdmEKQEAgLTMzLDYgKzMzLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk11cm11ckhhc2g7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7CiAKQEAgLTE3Nyw2ICsxODAsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9mKHRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgSVBhcnRpdGlvbmVyIGdldFBhcnRpdGlvbmVyKCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOwpAQCAtMjk0LDcgKzMwMyw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gbm9kZXMgcHJlc2VudCBpbiB0aGUgY2x1c3Rlci4gSGFzIHRoaXMgbm9kZSBmaW5pc2hlZCBzdGFydGluZyB1cD8iKTsKICAgICAgICAgLy8gMS1jYXNlCiAgICAgICAgIGlmIChzb3J0ZWRUb2tlbnMuc2l6ZSgpID09IDEpCi0gICAgICAgICAgICBvd25lcnNoaXBzLnB1dChpLm5leHQoKSwgbmV3IEZsb2F0KDEuMCkpOworICAgICAgICAgICAgb3duZXJzaGlwcy5wdXQoaS5uZXh0KCksIDEuMEYpOwogICAgICAgICAvLyBuLWNhc2UKICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0zMjYsNiArMzM1LDEyIEBACiAKICAgICBwcml2YXRlIGZpbmFsIFRva2VuLlRva2VuRmFjdG9yeSB0b2tlbkZhY3RvcnkgPSBuZXcgVG9rZW4uVG9rZW5GYWN0b3J5KCkKICAgICB7CisgICAgICAgIHB1YmxpYyBUb2tlbiBmcm9tQ29tcGFyYWJsZUJ5dGVzKEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgdG9rZW5EYXRhID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0U2lnbmVkTG9uZyhjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nVG9rZW4odG9rZW5EYXRhKTsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIHRvQnl0ZUFycmF5KFRva2VuIHRva2VuKQogICAgICAgICB7CiAgICAgICAgICAgICBMb25nVG9rZW4gbG9uZ1Rva2VuID0gKExvbmdUb2tlbikgdG9rZW47CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9PcmRlclByZXNlcnZpbmdQYXJ0aXRpb25lci5qYXZhCmluZGV4IDE2YzVkYjEuLjI1NjZjYmYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9PcmRlclByZXNlcnZpbmdQYXJ0aXRpb25lci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9PcmRlclByZXNlcnZpbmdQYXJ0aXRpb25lci5qYXZhCkBAIC0zMyw2ICszMyw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk9iamVjdFNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CkBAIC0xMjgsNiArMTMxLDExIEBACiAKICAgICBwcml2YXRlIGZpbmFsIFRva2VuLlRva2VuRmFjdG9yeSB0b2tlbkZhY3RvcnkgPSBuZXcgVG9rZW4uVG9rZW5GYWN0b3J5KCkKICAgICB7CisgICAgICAgIHB1YmxpYyBUb2tlbiBmcm9tQ29tcGFyYWJsZUJ5dGVzKEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nVG9rZW4oQnl0ZVNvdXJjZUludmVyc2UuZ2V0U3RyaW5nKGNvbXBhcmFibGVCeXRlcykpOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgdG9CeXRlQXJyYXkoVG9rZW4gdG9rZW4pCiAgICAgICAgIHsKICAgICAgICAgICAgIFN0cmluZ1Rva2VuIHN0cmluZ1Rva2VuID0gKFN0cmluZ1Rva2VuKSB0b2tlbjsKQEAgLTE5NCw2ICsyMDIsMTIgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NJWkUgKyBPYmplY3RTaXplcy5zaXplT2YodG9rZW4pOwogICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uub2YodG9rZW4sIHZlcnNpb24pOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZ1Rva2VuIGdldFRva2VuKEJ5dGVCdWZmZXIga2V5KQpAQCAtMjIwLDcgKzIzNCw3IEBACiAgICAgICAgIFRva2VuIGxhc3RUb2tlbiA9IHNvcnRlZFRva2Vucy5nZXQoc29ydGVkVG9rZW5zLnNpemUoKSAtIDEpOwogICAgICAgICBmb3IgKFRva2VuIG5vZGUgOiBzb3J0ZWRUb2tlbnMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGFsbFRva2Vucy5wdXQobm9kZSwgbmV3IEZsb2F0KDAuMCkpOworICAgICAgICAgICAgYWxsVG9rZW5zLnB1dChub2RlLCAwLjBGKTsKICAgICAgICAgICAgIHNvcnRlZFJhbmdlcy5hZGQobmV3IFJhbmdlPFRva2VuPihsYXN0VG9rZW4sIG5vZGUpKTsKICAgICAgICAgICAgIGxhc3RUb2tlbiA9IG5vZGU7CiAgICAgICAgIH0KQEAgLTIzOCw3ICsyNTIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gU3VtIGV2ZXJ5IGNvdW50IHVwIGFuZCBkaXZpZGUgY291bnQvdG90YWwgZm9yIHRoZSBmcmFjdGlvbmFsIG93bmVyc2hpcC4KLSAgICAgICAgRmxvYXQgdG90YWwgPSBuZXcgRmxvYXQoMC4wKTsKKyAgICAgICAgRmxvYXQgdG90YWwgPSAwLjBGOwogICAgICAgICBmb3IgKEZsb2F0IGYgOiBhbGxUb2tlbnMudmFsdWVzKCkpCiAgICAgICAgICAgICB0b3RhbCArPSBmOwogICAgICAgICBmb3IgKE1hcC5FbnRyeTxUb2tlbiwgRmxvYXQ+IHJvdyA6IGFsbFRva2Vucy5lbnRyeVNldCgpKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L1JhbmRvbVBhcnRpdGlvbmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvUmFuZG9tUGFydGl0aW9uZXIuamF2YQppbmRleCAyNDFiNzg1Li4xNTc0MzAxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvUmFuZG9tUGFydGl0aW9uZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvUmFuZG9tUGFydGl0aW9uZXIuamF2YQpAQCAtMjcsNiArMjcsOCBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2FjaGVkSGFzaERlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVBcnJheUFjY2Vzc29yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZUJ1ZmZlckFjY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CkBAIC0zNCw2ICszNiw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5QYXJ0aXRpb25lckRlZmluZWRPcmRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuR3VpZEdlbmVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PYmplY3RTaXplczsKQEAgLTE1OCw2ICsxNjIsMTEgQEAKIAogICAgIHByaXZhdGUgZmluYWwgVG9rZW4uVG9rZW5GYWN0b3J5IHRva2VuRmFjdG9yeSA9IG5ldyBUb2tlbi5Ub2tlbkZhY3RvcnkoKQogICAgIHsKKyAgICAgICAgcHVibGljIFRva2VuIGZyb21Db21wYXJhYmxlQnl0ZXMoQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZyb21CeXRlQXJyYXkoSW50ZWdlclR5cGUuaW5zdGFuY2UuZnJvbUNvbXBhcmFibGVCeXRlcyhCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGNvbXBhcmFibGVCeXRlcywgdmVyc2lvbikpOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgdG9CeXRlQXJyYXkoVG9rZW4gdG9rZW4pCiAgICAgICAgIHsKICAgICAgICAgICAgIEJpZ0ludGVnZXJUb2tlbiBiaWdJbnRlZ2VyVG9rZW4gPSAoQmlnSW50ZWdlclRva2VuKSB0b2tlbjsKQEAgLTI0NSw2ICsyNTQsMTIgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyVHlwZS5pbnN0YW5jZS5hc0NvbXBhcmFibGVCeXRlcyhCeXRlQXJyYXlBY2Nlc3Nvci5pbnN0YW5jZSwgdG9rZW4udG9CeXRlQXJyYXkoKSwgdmVyc2lvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIElQYXJ0aXRpb25lciBnZXRQYXJ0aXRpb25lcigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKQEAgLTI5Myw3ICszMDgsNyBAQAogICAgICAgICAvLyAxLWNhc2UKICAgICAgICAgaWYgKHNvcnRlZFRva2Vucy5zaXplKCkgPT0gMSkKICAgICAgICAgewotICAgICAgICAgICAgb3duZXJzaGlwcy5wdXQoaS5uZXh0KCksIG5ldyBGbG9hdCgxLjApKTsKKyAgICAgICAgICAgIG93bmVyc2hpcHMucHV0KGkubmV4dCgpLCAxLjBGKTsKICAgICAgICAgfQogICAgICAgICAvLyBuLWNhc2UKICAgICAgICAgZWxzZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L1JhbmdlU3RyZWFtZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9SYW5nZVN0cmVhbWVyLmphdmEKaW5kZXggZGRhNjg2My4uOWI3ODMzYiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L1JhbmdlU3RyZWFtZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvUmFuZ2VTdHJlYW1lci5qYXZhCkBAIC03MSw2ICs3MSw3IEBACiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlZGljYXRlcy5ub3Q7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmFsbDsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFU0VUX0JPT1RTVFJBUF9QUk9HUkVTUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhLmZ1bGxSZXBsaWNhOwogCiAvKioKQEAgLTIwMyw2ICsyMDQsMzMgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAqIFNvdXJjZSBmaWx0ZXIgd2hpY2ggZXhjbHVkZXMgbm9kZXMgZnJvbSBsb2NhbCBEQy4KKyAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjbHVkZUxvY2FsRGF0YWNlbnRlckZpbHRlciBpbXBsZW1lbnRzIFNvdXJjZUZpbHRlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJRW5kcG9pbnRTbml0Y2ggc25pdGNoOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBsb2NhbERjOworCisgICAgICAgIHB1YmxpYyBFeGNsdWRlTG9jYWxEYXRhY2VudGVyRmlsdGVyKElFbmRwb2ludFNuaXRjaCBzbml0Y2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc25pdGNoID0gc25pdGNoOworICAgICAgICAgICAgdGhpcy5sb2NhbERjID0gc25pdGNoLmdldExvY2FsRGF0YWNlbnRlcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFwcGx5KFJlcGxpY2EgcmVwbGljYSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICFzbml0Y2guZ2V0RGF0YWNlbnRlcihyZXBsaWNhKS5lcXVhbHMobG9jYWxEYyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBtZXNzYWdlKFJlcGxpY2EgcmVwbGljYSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJGaWx0ZXJlZCAiICsgcmVwbGljYSArICIgb3V0IGJlY2F1c2UgaXQgYmVsb25ncyB0byB0aGUgbG9jYWwgZGF0YWNlbnRlciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKICAgICAgKiBTb3VyY2UgZmlsdGVyIHdoaWNoIGV4Y2x1ZGVzIHRoZSBjdXJyZW50IG5vZGUgZnJvbSBzb3VyY2UgY2FsY3VsYXRpb25zCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNsdWRlTG9jYWxOb2RlRmlsdGVyIGltcGxlbWVudHMgU291cmNlRmlsdGVyCkBAIC02NjcsMzIgKzY5NSw2MiBAQAogICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJLZXlzcGFjZSB7fSBTb3VyY2VzIHt9Iiwga2V5c3BhY2UsIHNvdXJjZXMpOwogICAgICAgICAgICAgc291cmNlcy5hc01hcCgpLmZvckVhY2goKHNvdXJjZSwgZmV0Y2hSZXBsaWNhcykgLT4gewogCi0gICAgICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBhbHJlYWR5IHN0cmVhbWVkIHJhbmdlcwotICAgICAgICAgICAgICAgIFN5c3RlbUtleXNwYWNlLkF2YWlsYWJsZVJhbmdlcyBhdmFpbGFibGUgPSBzdGF0ZVN0b3JlLmdldEF2YWlsYWJsZVJhbmdlcyhrZXlzcGFjZSwgbWV0YWRhdGEucGFydGl0aW9uZXIpOworICAgICAgICAgICAgICAgIExpc3Q8RmV0Y2hSZXBsaWNhPiByZW1haW5pbmc7CiAKLSAgICAgICAgICAgICAgICBQcmVkaWNhdGU8RmV0Y2hSZXBsaWNhPiBpc0F2YWlsYWJsZSA9IGZldGNoIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0luRnVsbCA9IGF2YWlsYWJsZS5mdWxsLmNvbnRhaW5zKGZldGNoLmxvY2FsLnJhbmdlKCkpOwotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzSW5UcmFucyA9IGF2YWlsYWJsZS50cmFucy5jb250YWlucyhmZXRjaC5sb2NhbC5yYW5nZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSW5GdWxsICYmICFpc0luVHJhbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICAvL1JhbmdlIGlzIHVuYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZldGNoLmxvY2FsLmlzRnVsbCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgLy9Gb3IgZnVsbCwgcGljayBvbmx5IHJlcGxpY2FzIHdpdGggbWF0Y2hpbmcgdHJhbnNpZW50bmVzcwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzSW5GdWxsID09IGZldGNoLnJlbW90ZS5pc0Z1bGwoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBBbnkgdHJhbnNpZW50IG9yIGZ1bGwgd2lsbCBkbwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAgICAgTGlzdDxGZXRjaFJlcGxpY2E+IHJlbWFpbmluZyA9IGZldGNoUmVwbGljYXMuc3RyZWFtKCkuZmlsdGVyKG5vdChpc0F2YWlsYWJsZSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nLnNpemUoKSA8IGF2YWlsYWJsZS5mdWxsLnNpemUoKSArIGF2YWlsYWJsZS50cmFucy5zaXplKCkpCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG9wZXJhdG9yJ3Mgc3BlY2lmaWVkIHRoZXkgd2FudCB0byByZXNldCBib290c3RyYXAgcHJvZ3Jlc3MsIHdlIGRvbid0IGNoZWNrIHByZXZpb3VzIGF0dGVtcHRlZAorICAgICAgICAgICAgICAgIC8vIGJvb3RzdHJhcHMgYW5kIGp1c3QgcmVzdGFydCB3aXRoIGFsbC4KKyAgICAgICAgICAgICAgICBpZiAoUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTLmdldEJvb2xlYW4oKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8RmV0Y2hSZXBsaWNhPiBza2lwcGVkID0gZmV0Y2hSZXBsaWNhcy5zdHJlYW0oKS5maWx0ZXIoaXNBdmFpbGFibGUpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTb21lIHJhbmdlcyBvZiB7fSBhcmUgYWxyZWFkeSBhdmFpbGFibGUuIFNraXBwaW5nIHN0cmVhbWluZyB0aG9zZSByYW5nZXMuIFNraXBwaW5nIHt9LiBGdWxseSBhdmFpbGFibGUge30gVHJhbnNpZW50bHkgYXZhaWxhYmxlIHt9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hSZXBsaWNhcywgc2tpcHBlZCwgYXZhaWxhYmxlLmZ1bGwsIGF2YWlsYWJsZS50cmFucyk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEFsc28gcmVtb3ZlIHRoZSBmaWxlcyBvbiBkaXNrLiBTZWUgZGlzY3Vzc2lvbiBpbiBDQVNTQU5EUkEtMTc2NzkKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtS2V5c3BhY2UucmVzZXRBdmFpbGFibGVTdHJlYW1lZFJhbmdlc0ZvcktleXNwYWNlKGtleXNwYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nID0gbmV3IEFycmF5TGlzdDw+KGZldGNoUmVwbGljYXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGFscmVhZHkgc3RyZWFtZWQgcmFuZ2VzCisgICAgICAgICAgICAgICAgICAgIFN5c3RlbUtleXNwYWNlLkF2YWlsYWJsZVJhbmdlcyBhdmFpbGFibGUgPSBzdGF0ZVN0b3JlLmdldEF2YWlsYWJsZVJhbmdlcyhrZXlzcGFjZSwgbWV0YWRhdGEucGFydGl0aW9uZXIpOworCisgICAgICAgICAgICAgICAgICAgIFByZWRpY2F0ZTxGZXRjaFJlcGxpY2E+IGlzQXZhaWxhYmxlID0gZmV0Y2ggLT4geworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0luRnVsbCA9IGF2YWlsYWJsZS5mdWxsLmNvbnRhaW5zKGZldGNoLmxvY2FsLnJhbmdlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0luVHJhbnMgPSBhdmFpbGFibGUudHJhbnMuY29udGFpbnMoZmV0Y2gubG9jYWwucmFuZ2UoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNJbkZ1bGwgJiYgIWlzSW5UcmFucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSYW5nZSBpcyB1bmF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZldGNoLmxvY2FsLmlzRnVsbCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBmdWxsLCBwaWNrIG9ubHkgcmVwbGljYXMgd2l0aCBtYXRjaGluZyB0cmFuc2llbnRuZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzSW5GdWxsID09IGZldGNoLnJlbW90ZS5pc0Z1bGwoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW55IHRyYW5zaWVudCBvciBmdWxsIHdpbGwgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IGZldGNoUmVwbGljYXMuc3RyZWFtKCkuZmlsdGVyKG5vdChpc0F2YWlsYWJsZSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZy5zaXplKCkgPCBhdmFpbGFibGUuZnVsbC5zaXplKCkgKyBhdmFpbGFibGUudHJhbnMuc2l6ZSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgb3BlcmF0b3IgaGFzbid0IHNwZWNpZmllZCB3aGF0IHRvIGRvIHdoZW4gd2UgZGlzY292ZXIgYSBwcmV2aW91cyBwYXJ0aWFsbHkgc3VjY2Vzc2Z1bCBib290c3RyYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBlcnJvciBvdXQgYW5kIHRlbGwgdGhlbSB0byBtYW51YWxseSByZWNvbmNpbGUgaXQuIFNlZSBDQVNTQU5EUkEtMTc2NzkuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVJFU0VUX0JPT1RTVFJBUF9QUk9HUkVTUy5pc1ByZXNlbnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEZldGNoUmVwbGljYT4gc2tpcHBlZCA9IGZldGNoUmVwbGljYXMuc3RyZWFtKCkuZmlsdGVyKGlzQXZhaWxhYmxlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCJEaXNjb3ZlcmVkIGV4aXN0aW5nIGJvb3RzdHJhcCBkYXRhIGFuZCAlcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGNvbmZpZ3VyZWQ7IGFib3J0aW5nIGJvb3RzdHJhcC4gUGxlYXNlIGNsZWFuIHVwIGxvY2FsIGZpbGVzIG1hbnVhbGx5ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgdHJ5IGFnYWluIG9yIHNldCBjYXNzYW5kcmEucmVzZXRfYm9vdHN0cmFwX3Byb2dyZXNzPXRydWUgdG8gaWdub3JlLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm91bmQ6ICVzLiBGdWxseSBhdmFpbGFibGU6ICVzLiBUcmFuc2llbnRseSBhdmFpbGFibGU6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNFVF9CT09UU1RSQVBfUFJPR1JFU1MuZ2V0S2V5KCksIHNraXBwZWQsIGF2YWlsYWJsZS5mdWxsLCBhdmFpbGFibGUudHJhbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihtc2cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24obXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSRVNFVF9CT09UU1RSQVBfUFJPR1JFU1MuZ2V0Qm9vbGVhbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8RmV0Y2hSZXBsaWNhPiBza2lwcGVkID0gZmV0Y2hSZXBsaWNhcy5zdHJlYW0oKS5maWx0ZXIoaXNBdmFpbGFibGUpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlNvbWUgcmFuZ2VzIG9mIHt9IGFyZSBhbHJlYWR5IGF2YWlsYWJsZS4gU2tpcHBpbmcgc3RyZWFtaW5nIHRob3NlIHJhbmdlcy4gU2tpcHBpbmcge30uIEZ1bGx5IGF2YWlsYWJsZSB7fSBUcmFuc2llbnRseSBhdmFpbGFibGUge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZldGNoUmVwbGljYXMsIHNraXBwZWQsIGF2YWlsYWJsZS5mdWxsLCBhdmFpbGFibGUudHJhbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L1Rva2VuLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvVG9rZW4uamF2YQppbmRleCBkOGU4MmY4Li4zNTQzZGFiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvVG9rZW4uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvVG9rZW4uamF2YQpAQCAtMjYsNiArMjYsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVG9rZW4gaW1wbGVtZW50cyBSaW5nUG9zaXRpb248VG9rZW4+LCBTZXJpYWxpemFibGUKIHsKQEAgLTM3LDggKzM5LDMxIEBACiAgICAgewogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgQnl0ZUJ1ZmZlciB0b0J5dGVBcnJheShUb2tlbiB0b2tlbik7CiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUb2tlbiBmcm9tQnl0ZUFycmF5KEJ5dGVCdWZmZXIgYnl0ZXMpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9kdWNlIGEgYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0b2tlbi4KKyAgICAgICAgICogU2VlIHtAbGluayBUb2tlbiNhc0NvbXBhcmFibGVCeXRlc30KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFRva2VuIHRva2VuLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbi5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcmFuc2xhdGVzIHRoZSBnaXZlbiBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb24gdG8gYSB0b2tlbiBpbnN0YW5jZS4gSWYgdGhlIGdpdmVuIGJ5dGVzIGRvbid0IGNvcnJlc3BvbmQKKyAgICAgICAgICogdG8gdGhlIGVuY29kaW5nIG9mIGFuIGluc3RhbmNlIG9mIHRoZSBleHBlY3RlZCB0b2tlbiB0eXBlLCBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBtYXkgYmUgdGhyb3duLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29tcGFyYWJsZUJ5dGVzIEEgYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uIChwcmVzdW1hYmx5IG9mIGEgdG9rZW4gb2Ygc29tZSBleHBlY3RlZCB0b2tlbiB0eXBlKS4KKyAgICAgICAgICogQHJldHVybiBBIG5ldyB7QGxpbmsgVG9rZW59IGluc3RhbmNlLCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBieXRlLW9yZGVyZWQgcmVwcmVzZW50YXRpb24uIElmIHdlIHdlcmUKKyAgICAgICAgICogdG8gY2FsbCB7QGxpbmsgI2FzQ29tcGFyYWJsZUJ5dGVzKEJ5dGVDb21wYXJhYmxlLlZlcnNpb24pfSBvbiB0aGUgcmV0dXJuZWQgb2JqZWN0LCB3ZSBzaG91bGQgZ2V0IGEKKyAgICAgICAgICoge0BsaW5rIEJ5dGVTb3VyY2V9IGVxdWFsIHRvIHRoZSBpbnB1dCBvbmUgYXMgYSByZXN1bHQuCisgICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBieXRlcyBkbyBub3QgZW5jb2RlIGEgdmFsaWQgdG9rZW4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVG9rZW4gZnJvbUNvbXBhcmFibGVCeXRlcyhCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKTsKKwogICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHRvU3RyaW5nKFRva2VuIHRva2VuKTsgLy8gc2VyaWFsaXplIGFzIHN0cmluZywgbm90IG5lY2Vzc2FyaWx5IGh1bWFuLXJlYWRhYmxlCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUb2tlbiBmcm9tU3RyaW5nKFN0cmluZyBzdHJpbmcpOyAvLyBkZXNlcmlhbGl6ZQorCiAgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHZhbGlkYXRlKFN0cmluZyB0b2tlbikgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb247CiAKICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKFRva2VuIHRva2VuLCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgpAQCAtMTAwLDYgKzEyNSwyMCBAQAogICAgIGFic3RyYWN0IHB1YmxpYyBPYmplY3QgZ2V0VG9rZW5WYWx1ZSgpOwogCiAgICAgLyoqCisgICAgICogUHJvZHVjZSBhIHdlYWtseSBwcmVmaXgtZnJlZSBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRva2VuLCBpLmUuIHN1Y2ggYSBzZXF1ZW5jZSBvZiBieXRlcyB0aGF0IGFueQorICAgICAqIHBhaXIgeCwgeSBvZiB2YWxpZCB0b2tlbnMgb2YgdGhpcyB0eXBlIGFuZCBhbnkgYnl0ZXMgYjEsIGIyIGJldHdlZW4gMHgxMCBhbmQgMHhFRiwKKyAgICAgKiAoKyBzdGFuZHMgZm9yIGNvbmNhdGVuYXRpb24pCisgICAgICogICBjb21wYXJlKHgsIHkpID09IGNvbXBhcmVMZXhpY29ncmFwaGljYWxseVVuc2lnbmVkKGFzQnl0ZUNvbXBhcmFibGUoeCkrYjEsIGFzQnl0ZUNvbXBhcmFibGUoeSkrYjIpCisgICAgICogKGkuZS4gdGhlIHZhbHVlcyBjb21wYXJlIGxpa2UgdGhlIG9yaWdpbmFsIHR5cGUsIGFuZCBhbiBhZGRlZCAweDEwLTB4RUYgYnl0ZSBhdCB0aGUgZW5kIGRvZXMgbm90IGNoYW5nZSB0aGF0KSBhbmQ6CisgICAgICogICBhc0J5dGVDb21wYXJhYmxlKHgpK2IxIGlzIG5vdCBhIHByZWZpeCBvZiBhc0J5dGVDb21wYXJhYmxlKHkpICAgICAgKHdlYWtseSBwcmVmaXggZnJlZSkKKyAgICAgKiAoaS5lLiBhIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIGEgdmFsdWUgbWF5IGJlIGEgcHJlZml4IG9mIGFub3RoZXIgdmFsaWQgcmVwcmVzZW50YXRpb24gb2YgYSB2YWx1ZSBvbmx5IGlmIHRoZQorICAgICAqIGZvbGxvd2luZyBieXRlIGluIHRoZSBsYXR0ZXIgaXMgc21hbGxlciB0aGFuIDB4MTAgb3IgbGFyZ2VyIHRoYW4gMHhFRikuIFRoZXNlIHByb3BlcnRpZXMgYXJlIHRyaXZpYWxseSB0cnVlIGlmCisgICAgICogdGhlIGVuY29kaW5nIGNvbXBhcmVzIGNvcnJlY3RseSBhbmQgaXMgcHJlZml4IGZyZWUsIGJ1dCBhbHNvIHBlcm1pdHMgYSBsaXR0bGUgbW9yZSBmcmVlZG9tIHRoYXQgZW5hYmxlcyBzb21ld2hhdAorICAgICAqIG1vcmUgZWZmaWNpZW50IGVuY29kaW5nIG9mIGFyYml0cmFyeS1sZW5ndGggYnl0ZS1jb21wYXJhYmxlIGJsb2JzLgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbik7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIGEgbWVhc3VyZSBmb3IgdGhlIHRva2VuIHNwYWNlIGNvdmVyZWQgYmV0d2VlbiB0aGlzIHRva2VuIGFuZCBuZXh0LgogICAgICAqIFVzZWQgYnkgdGhlIHRva2VuIGFsbG9jYXRpb24gYWxnb3JpdGhtIChzZWUgQ0FTU0FORFJBLTcwMzIpLgogICAgICAqLwpAQCAtMTI4LDcgKzE2Nyw3IEBACiAKICAgICAvKgogICAgICAqIEEgdG9rZW4gY29ycmVzcG9uZHMgdG8gdGhlIHJhbmdlIG9mIGFsbCB0aGUga2V5cyBoYXZpbmcgdGhpcyB0b2tlbi4KLSAgICAgKiBBIHRva2VuIGlzIHRodXMgbm8gY29tcGFyYWJsZSBkaXJlY3RseSB0byBhIGtleS4gQnV0IHRvIGJlIGFibGUgdG8gc2VsZWN0CisgICAgICogQSB0b2tlbiBpcyB0aHVzIG5vdCBjb21wYXJhYmxlIGRpcmVjdGx5IHRvIGEga2V5LiBCdXQgdG8gYmUgYWJsZSB0byBzZWxlY3QKICAgICAgKiBrZXlzIGdpdmVuIHRva2Vucywgd2UgaW50cm9kdWNlIHR3byAiZmFrZSIga2V5cyBmb3IgZWFjaCB0b2tlbiBUOgogICAgICAqICAgLSBsb3dlckJvdW5kS2V5OiBhICJmYWtlIiBrZXkgcmVwcmVzZW50aW5nIHRoZSBsb3dlciBib3VuZCBUIHJlcHJlc2VudHMuCiAgICAgICogICAgICAgICAgICAgICAgICAgIEluIG90aGVyIHdvcmRzLCBsb3dlckJvdW5kS2V5IGlzIHRoZSBzbWFsbGVzdCBrZXkgdGhhdApAQCAtMTkwLDYgKzIyOSwyMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiAoKHBvcyBpbnN0YW5jZW9mIEtleUJvdW5kKSAmJiAhKChLZXlCb3VuZClwb3MpLmlzTWluaW11bUJvdW5kKSA/IDAgOiAxOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlU291cmNlIGFzQ29tcGFyYWJsZUJ5dGVzKFZlcnNpb24gdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRlcm1pbmF0b3IgPSBpc01pbmltdW1Cb3VuZCA/IEJ5dGVTb3VyY2UuTFRfTkVYVF9DT01QT05FTlQgOiBCeXRlU291cmNlLkdUX05FWFRfQ09NUE9ORU5UOworICAgICAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IodGVybWluYXRvciwgdG9rZW4uYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQ29tcGFyYWJsZSBhc0NvbXBhcmFibGVCb3VuZChib29sZWFuIGJlZm9yZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyBjbGFzcyBpcyBhbHJlYWR5IGEgYm91bmQgdGh1cyBub3RoaW5nIG5lZWRzIHRvIGJlIGNoYW5nZWQgZnJvbSBpdHMgcmVwcmVzZW50YXRpb24KKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIElQYXJ0aXRpb25lciBnZXRQYXJ0aXRpb25lcigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBnZXRUb2tlbigpLmdldFBhcnRpdGlvbmVyKCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9leGNlcHRpb25zL1F1ZXJ5Q2FuY2VsbGVkRXhjZXB0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9leGNlcHRpb25zL1F1ZXJ5Q2FuY2VsbGVkRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViNjMzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2V4Y2VwdGlvbnMvUXVlcnlDYW5jZWxsZWRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVhZENvbW1hbmQ7CisKK3B1YmxpYyBjbGFzcyBRdWVyeUNhbmNlbGxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24KK3sKKyAgICBwdWJsaWMgUXVlcnlDYW5jZWxsZWRFeGNlcHRpb24oUmVhZENvbW1hbmQgY29tbWFuZCkKKyAgICB7CisgICAgICAgIHN1cGVyKCJRdWVyeSBjYW5jZWxsZWQgZm9yIHRha2luZyB0b28gbG9uZzogIiArIGNvbW1hbmQudG9DUUxTdHJpbmcoKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2V4Y2VwdGlvbnMvUmVxdWVzdEZhaWx1cmVSZWFzb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2V4Y2VwdGlvbnMvUmVxdWVzdEZhaWx1cmVSZWFzb24uamF2YQppbmRleCAzZDM0NzZhLi5jYTY0Mjk4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9leGNlcHRpb25zL1JlcXVlc3RGYWlsdXJlUmVhc29uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZXhjZXB0aW9ucy9SZXF1ZXN0RmFpbHVyZVJlYXNvbi5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLlRvbWJzdG9uZU92ZXJ3aGVsbWluZ0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5JVmVyc2lvbmVkU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CkBAIC0xMDEsMTIgKzk5LDEyIEBACiAgICAgICAgICAgICBpZiAodmVyc2lvbiA8IFZFUlNJT05fNDApCiAgICAgICAgICAgICAgICAgb3V0LndyaXRlU2hvcnQocmVhc29uLmNvZGUpOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChyZWFzb24uY29kZSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIocmVhc29uLmNvZGUpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFJlcXVlc3RGYWlsdXJlUmVhc29uIGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZyb21Db2RlKHZlcnNpb24gPCBWRVJTSU9OXzQwID8gaW4ucmVhZFVuc2lnbmVkU2hvcnQoKSA6IEludHMuY2hlY2tlZENhc3QoaW4ucmVhZFVuc2lnbmVkVkludCgpKSk7CisgICAgICAgICAgICByZXR1cm4gZnJvbUNvZGUodmVyc2lvbiA8IFZFUlNJT05fNDAgPyBpbi5yZWFkVW5zaWduZWRTaG9ydCgpIDogaW4ucmVhZFVuc2lnbmVkVkludDMyKCkpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIGxvbmcgc2VyaWFsaXplZFNpemUoUmVxdWVzdEZhaWx1cmVSZWFzb24gcmVhc29uLCBpbnQgdmVyc2lvbikKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9BcHBsaWNhdGlvblN0YXRlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvQXBwbGljYXRpb25TdGF0ZS5qYXZhCmluZGV4IGM0NWQzYzIuLjNmNDRiY2MgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9BcHBsaWNhdGlvblN0YXRlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0FwcGxpY2F0aW9uU3RhdGUuamF2YQpAQCAtNTIsNyArNTIsNyBAQAogICAgICAqIHdoaWNoIG5ldyBzc3RhYmxlcyBhcmUgd3JpdHRlbiksIGJ1dCBtYXkgY29udGFpbiBtb3JlIG9uIG5ld2x5IHVwZ3JhZGVkIG5vZGVzIGJlZm9yZSBgdXBncmFkZXNzdGFibGVgIGhhcyBiZWVuCiAgICAgICogcnVuLgogICAgICAqCi0gICAgICogPHA+VGhlIHZhbHVlIChhIHNldCBvZiBzc3RhYmxlIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uQW5kVHlwZX0pIGlzIHNlcmlhbGl6ZWQgYXMKKyAgICAgKiA8cD5UaGUgdmFsdWUgKGEgc2V0IG9mIHNzdGFibGUge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb259KSBpcyBzZXJpYWxpemVkIGFzCiAgICAgICogYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4KICAgICAgKiovCiAgICAgU1NUQUJMRV9WRVJTSU9OUywKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9FbmRwb2ludFN0YXRlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvRW5kcG9pbnRTdGF0ZS5qYXZhCmluZGV4IGU3NTY3NDQuLjQyNDNjNzUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9FbmRwb2ludFN0YXRlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0VuZHBvaW50U3RhdGUuamF2YQpAQCAtMjksNiArMjksNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5JVmVyc2lvbmVkU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CkBAIC00Niw2ICs0Nyw4IEBACiB7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRW5kcG9pbnRTdGF0ZS5jbGFzcyk7CiAKKyAgICBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBMT09TRV9ERUZfT0ZfRU1QVFlfRU5BQkxFRCA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5MT09TRV9ERUZfT0ZfRU1QVFlfRU5BQkxFRC5nZXRCb29sZWFuKCk7CisKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIElWZXJzaW9uZWRTZXJpYWxpemVyPEVuZHBvaW50U3RhdGU+IHNlcmlhbGl6ZXIgPSBuZXcgRW5kcG9pbnRTdGF0ZVNlcmlhbGl6ZXIoKTsKICAgICBwdWJsaWMgZmluYWwgc3RhdGljIElWZXJzaW9uZWRTZXJpYWxpemVyPEVuZHBvaW50U3RhdGU+IG51bGxhYmxlU2VyaWFsaXplciA9IE51bGxhYmxlU2VyaWFsaXplci53cmFwKHNlcmlhbGl6ZXIpOwogCkBAIC0xODYsMTcgKzE4OSwyNSBAQAogICAgICAgICB1cGRhdGVUaW1lc3RhbXAgPSBuYW5vVGltZSgpOwogICAgIH0KIAorICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyB2b2lkIHVuc2FmZVNldFVwZGF0ZVRpbWVzdGFtcChsb25nIHZhbHVlKQorICAgIHsKKyAgICAgICAgdXBkYXRlVGltZXN0YW1wID0gdmFsdWU7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNBbGl2ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gaXNBbGl2ZTsKICAgICB9CiAKLSAgICB2b2lkIG1hcmtBbGl2ZSgpCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHZvaWQgbWFya0FsaXZlKCkKICAgICB7CiAgICAgICAgIGlzQWxpdmUgPSB0cnVlOwogICAgIH0KIAotICAgIHZvaWQgbWFya0RlYWQoKQorICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyB2b2lkIG1hcmtEZWFkKCkKICAgICB7CiAgICAgICAgIGlzQWxpdmUgPSBmYWxzZTsKICAgICB9CkBAIC0yMDcsNyArMjE4LDE3IEBACiAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eVdpdGhvdXRTdGF0dXMoKQogICAgIHsKICAgICAgICAgTWFwPEFwcGxpY2F0aW9uU3RhdGUsIFZlcnNpb25lZFZhbHVlPiBzdGF0ZSA9IGFwcGxpY2F0aW9uU3RhdGUuZ2V0KCk7Ci0gICAgICAgIHJldHVybiBoYlN0YXRlLmlzRW1wdHkoKSAmJiAhKHN0YXRlLmNvbnRhaW5zS2V5KEFwcGxpY2F0aW9uU3RhdGUuU1RBVFVTX1dJVEhfUE9SVCkgfHwgc3RhdGUuY29udGFpbnNLZXkoQXBwbGljYXRpb25TdGF0ZS5TVEFUVVMpKTsKKyAgICAgICAgYm9vbGVhbiBoYXNTdGF0dXMgPSBzdGF0ZS5jb250YWluc0tleShBcHBsaWNhdGlvblN0YXRlLlNUQVRVU19XSVRIX1BPUlQpIHx8IHN0YXRlLmNvbnRhaW5zS2V5KEFwcGxpY2F0aW9uU3RhdGUuU1RBVFVTKTsKKyAgICAgICAgcmV0dXJuIGhiU3RhdGUuaXNFbXB0eSgpICYmICFoYXNTdGF0dXMKKyAgICAgICAgICAgICAgIC8vIEluIHRoZSB2ZXJ5IHNwZWNpZmljIGNhc2Ugd2hlcmUgaGJTdGF0ZS5pc0VtcHR5IGFuZCBTVEFUVVMgaXMgbWlzc2luZywgdGhpcyBpcyBrbm93biB0byBiZSBzYWZlIHRvICJmYWtlIgorICAgICAgICAgICAgICAgLy8gdGhlIGRhdGEsIGFzIHRoaXMgaGFwcGVucyB3aGVuIHRoZSBnb3NzaXAgc3RhdGUgaXNuJ3QgY29taW5nIGZyb20gdGhlIG5vZGUgYnV0IGluc3RlYWQgZnJvbSBhIHBlZXIgd2hvCisgICAgICAgICAgICAgICAvLyByZXN0YXJ0ZWQgYW5kIGlzIG1pc3NpbmcgdGhlIG5vZGUncyBzdGF0ZS4KKyAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAvLyBXaGVuIGhiU3RhdGUgaXMgbm90IGVtcHR5LCB0aGVuIHRoZSBub2RlIGdvc3NpcGVkIGFuIGVtcHR5IFNUQVRVUzsgdGhpcyBoYXBwZW5zIGR1cmluZyBib290c3RyYXAgYW5kIGl0J3Mgbm90CisgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSB0byB0ZWxsIGlmIHRoaXMgaXMgb2sgb3Igbm90ICh3ZSBjYW4ndCByZWFsbHkgdGVsbCBpZiB0aGUgbm9kZSBpcyBkZWFkIG9yIGhhdmluZyBuZXR3b3JraW5nIGlzc3VlcykuCisgICAgICAgICAgICAgICAvLyBGb3IgdGhlc2UgY2FzZXMgYWxsb3cgYW4gZXh0ZXJuYWwgYWN0b3IgdG8gdmVyaWZ5IGFuZCBpbmZvcm0gQ2Fzc2FuZHJhIHRoYXQgaXQgaXMgc2FmZSAtIHRoaXMgaXMgZG9uZSBieQorICAgICAgICAgICAgICAgLy8gdXBkYXRpbmcgdGhlIExPT1NFX0RFRl9PRl9FTVBUWV9FTkFCTEVEIGZpZWxkLgorICAgICAgICAgICAgICAgfHwgKExPT1NFX0RFRl9PRl9FTVBUWV9FTkFCTEVEICYmICFoYXNTdGF0dXMpOwogICAgIH0KIAogICAgIHB1YmxpYyBib29sZWFuIGlzUnBjUmVhZHkoKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0ZhaWx1cmVEZXRlY3Rvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0ZhaWx1cmVEZXRlY3Rvci5qYXZhCmluZGV4IDUxNzcxNTQuLjljZjdhZDAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9GYWlsdXJlRGV0ZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvRmFpbHVyZURldGVjdG9yLmphdmEKQEAgLTE3LDI5ICsxNyw0NiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtczsKIAotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5TdGFuZGFyZE9wZW5PcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwotaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5TdGFuZGFyZE9wZW5PcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKLWltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi4qOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGE7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uQ29tcG9zaXRlRGF0YVN1cHBvcnQ7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uQ29tcG9zaXRlVHlwZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5PcGVuRGF0YUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5PcGVuVHlwZTsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5TaW1wbGVUeXBlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLlRhYnVsYXJEYXRhOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLlRhYnVsYXJEYXRhU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5UYWJ1bGFyVHlwZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYTsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1CZWFuV3JhcHBlcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkZEX0lOSVRJQUxfVkFMVUVfTVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRkRfTUFYX0lOVEVSVkFMX01TOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkxJTkVfU0VQQVJBVE9SOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk1BWF9MT0NBTF9QQVVTRV9JTl9NUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvci5uZXdGYWlsdXJlRGV0ZWN0b3I7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1vbm90b25pY0Nsb2NrLkdsb2JhbC5wcmVjaXNlVGltZTsKIApAQCAtNTUsMjEgKzcyLDE5IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNBTVBMRV9TSVpFID0gMTAwMDsKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgSU5JVElBTF9WQUxVRV9OQU5PUyA9IFRpbWVVbml0Lk5BTk9TRUNPTkRTLmNvbnZlcnQoZ2V0SW5pdGlhbFZhbHVlKCksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFQlVHX1BFUkNFTlRBR0UgPSA4MDsgLy8gaWYgdGhlIHBoaSBpcyBsYXJnZXIgdGhhbiB0aGlzIHBlcmNlbnRhZ2Ugb2YgdGhlIG1heCwgbG9nIGEgZGVidWcgbWVzc2FnZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9NQVhfUEFVU0UgPSA1MDAwTCAqIDEwMDAwMDBMOyAvLyA1IHNlY29uZHMKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1BWF9MT0NBTF9QQVVTRV9JTl9OQU5PUyA9IGdldE1heExvY2FsUGF1c2UoKTsKICAgICBwcml2YXRlIGxvbmcgbGFzdEludGVycHJldCA9IHByZWNpc2VUaW1lLm5vdygpOwogICAgIHByaXZhdGUgbG9uZyBsYXN0UGF1c2UgPSAwTDsKIAogICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0TWF4TG9jYWxQYXVzZSgpCiAgICAgewotICAgICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEubWF4X2xvY2FsX3BhdXNlX2luX21zIikgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBwYXVzZSA9IExvbmcucGFyc2VMb25nKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLm1heF9sb2NhbF9wYXVzZV9pbl9tcyIpKTsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJPdmVycmlkaW5nIG1heCBsb2NhbCBwYXVzZSB0aW1lIHRvIHt9bXMiLCBwYXVzZSk7Ci0gICAgICAgICAgICByZXR1cm4gcGF1c2UgKiAxMDAwMDAwTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gREVGQVVMVF9NQVhfUEFVU0U7CisgICAgICAgIGxvbmcgcGF1c2UgPSBNQVhfTE9DQUxfUEFVU0VfSU5fTVMuZ2V0TG9uZygpOworCisgICAgICAgIGlmICghU3RyaW5nLnZhbHVlT2YocGF1c2UpLmVxdWFscyhNQVhfTE9DQUxfUEFVU0VfSU5fTVMuZ2V0RGVmYXVsdFZhbHVlKCkpKQorICAgICAgICAgICAgbG9nZ2VyLndhcm4oIk92ZXJyaWRpbmcge30gbWF4IGxvY2FsIHBhdXNlIHRpbWUgZnJvbSB7fW1zIHRvIHt9bXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0xPQ0FMX1BBVVNFX0lOX01TLmdldEtleSgpLCBNQVhfTE9DQUxfUEFVU0VfSU5fTVMuZ2V0RGVmYXVsdFZhbHVlKCksIHBhdXNlKTsKKworICAgICAgICByZXR1cm4gcGF1c2UgKiAxMDAwMDAwTDsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElGYWlsdXJlRGV0ZWN0b3IgaW5zdGFuY2UgPSBuZXdGYWlsdXJlRGV0ZWN0b3IoKTsKQEAgLTkzLDE2ICsxMDgsMTIgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0SW5pdGlhbFZhbHVlKCkKICAgICB7Ci0gICAgICAgIFN0cmluZyBuZXd2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmZkX2luaXRpYWxfdmFsdWVfbXMiKTsKLSAgICAgICAgaWYgKG5ld3ZhbHVlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBHb3NzaXBlci5pbnRlcnZhbEluTWlsbGlzICogMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJPdmVycmlkaW5nIEZEIElOSVRJQUxfVkFMVUUgdG8ge31tcyIsIG5ld3ZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KG5ld3ZhbHVlKTsKLSAgICAgICAgfQorICAgICAgICBsb25nIG5ld1ZhbHVlID0gRkRfSU5JVElBTF9WQUxVRV9NUy5nZXRMb25nKEdvc3NpcGVyLmludGVydmFsSW5NaWxsaXMgKiAyTCk7CisKKyAgICAgICAgaWYgKG5ld1ZhbHVlICE9IEdvc3NpcGVyLmludGVydmFsSW5NaWxsaXMgKiAyKQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk92ZXJyaWRpbmcge30gZnJvbSB7fW1zIHRvIHt9bXMiLCBGRF9JTklUSUFMX1ZBTFVFX01TLmdldEtleSgpLCBHb3NzaXBlci5pbnRlcnZhbEluTWlsbGlzICogMiwgbmV3VmFsdWUpOworCisgICAgICAgIHJldHVybiBuZXdWYWx1ZTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGdldEFsbEVuZHBvaW50U3RhdGVzKCkKQEAgLTQ3NiwxNiArNDg3LDEwIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldE1heEludGVydmFsKCkKICAgICB7Ci0gICAgICAgIFN0cmluZyBuZXd2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmZkX21heF9pbnRlcnZhbF9tcyIpOwotICAgICAgICBpZiAobmV3dmFsdWUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEZhaWx1cmVEZXRlY3Rvci5JTklUSUFMX1ZBTFVFX05BTk9TOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk92ZXJyaWRpbmcgRkQgTUFYX0lOVEVSVkFMIHRvIHt9bXMiLCBuZXd2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gVGltZVVuaXQuTkFOT1NFQ09ORFMuY29udmVydChJbnRlZ2VyLnBhcnNlSW50KG5ld3ZhbHVlKSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLSAgICAgICAgfQorICAgICAgICBsb25nIG5ld1ZhbHVlID0gRkRfTUFYX0lOVEVSVkFMX01TLmdldExvbmcoRmFpbHVyZURldGVjdG9yLklOSVRJQUxfVkFMVUVfTkFOT1MpOworICAgICAgICBpZiAobmV3VmFsdWUgIT0gRmFpbHVyZURldGVjdG9yLklOSVRJQUxfVkFMVUVfTkFOT1MpCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiT3ZlcnJpZGluZyB7fSBmcm9tIHt9bXMgdG8ge31tcyIsIEZEX01BWF9JTlRFUlZBTF9NUy5nZXRLZXkoKSwgRmFpbHVyZURldGVjdG9yLklOSVRJQUxfVkFMVUVfTkFOT1MsIG5ld1ZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFRpbWVVbml0Lk5BTk9TRUNPTkRTLmNvbnZlcnQobmV3VmFsdWUsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CiAgICAgfQogCiAgICAgc3luY2hyb25pemVkIHZvaWQgYWRkKGxvbmcgdmFsdWUsIEluZXRBZGRyZXNzQW5kUG9ydCBlcCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9Hb3NzaXBlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0dvc3NpcGVyLmphdmEKaW5kZXggYWUyMTNjMC4uYWRmZjA0NCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0dvc3NpcGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0dvc3NpcGVyLmphdmEKQEAgLTE4LDggKzE4LDIxIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtczsKIAogaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRTa2lwTGlzdFNldDsKQEAgLTMyLDU5ICs0NSw2MCBAQAogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Cb29sZWFuU3VwcGxpZXI7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKLQogaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5pbnRlcnJ1cHRpYmxlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkZ1dHVyZVRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk5vUGF5bG9hZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DYXNzYW5kcmFWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkV4ZWN1dG9yVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRXhwaXJpbmdNZW1vaXppbmdTdXBwbGllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NQmVhbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTm9TcGFtTG9nZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRnV0dXJlVGFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlN0YWdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU3lzdGVtS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5SZXF1ZXN0Q2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk5vUGF5bG9hZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuUmVxdWVzdENhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2Fzc2FuZHJhVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5FeGVjdXRvclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkV4cGlyaW5nTWVtb2l6aW5nU3VwcGxpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1CZWFuV3JhcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Ob1NwYW1Mb2dnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5SZWNvbXB1dGluZ1N1cHBsaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVW5jaGVja2VkSW50ZXJydXB0ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Ob3RTY2hlZHVsZWRGdXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5VbmNoZWNrZWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yRmFjdG9yeS5HbG9iYWwuZXhlY3V0b3JGYWN0b3J5OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkRJU0FCTEVfR09TU0lQX0VORFBPSU5UX1JFTU9WQUw7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuR09TU0lQRVJfUVVBUkFOVElORV9ERUxBWTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5HT1NTSVBFUl9TS0lQX1dBSVRJTkdfVE9fU0VUVExFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNIVVRET1dOX0FOTk9VTkNFX0RFTEFZX0lOX01TOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlZFUllfTE9OR19USU1FX01TOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yLmdldENsdXN0ZXJOYW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBhcnRpdGlvbmVyTmFtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLlZlcnNpb25lZFZhbHVlLkJPT1RTVFJBUFBJTkdfU1RBVFVTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTm9QYXlsb2FkLm5vUGF5bG9hZDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmIuRUNIT19SRVE7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiLkdPU1NJUF9ESUdFU1RfU1lOOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0OwogCiAvKioKICAqIFRoaXMgbW9kdWxlIGlzIHJlc3BvbnNpYmxlIGZvciBHb3NzaXBpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBsb2NhbCBlbmRwb2ludC4gVGhpcyBhYnN0cmFjdGlvbgpAQCAtMTA1LDExICsxMTksNiBAQAogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1CRUFOX05BTUUgPSAib3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0OnR5cGU9R29zc2lwZXIiOwogCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9wcwotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9USFJFQURfVkFMSURBVElPTiA9ICJjYXNzYW5kcmEuZ29zc2lwLmRpc2FibGVfdGhyZWFkX3ZhbGlkYXRpb24iOwotICAgIH0KLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yUGx1cyBleGVjdXRvciA9IGV4ZWN1dG9yRmFjdG9yeSgpLnNjaGVkdWxlZCgiR29zc2lwVGFza3MiKTsKIAogICAgIHN0YXRpYyBmaW5hbCBBcHBsaWNhdGlvblN0YXRlW10gU1RBVEVTID0gQXBwbGljYXRpb25TdGF0ZS52YWx1ZXMoKTsKQEAgLTIwNCwxMSArMjEzLDEzIEBACiAgICAgICAgIHJldHVybiBlcFN0YXRlcy5pc0VtcHR5KCkgfHwgZXBTdGF0ZXMua2V5U2V0KCkuZXF1YWxzKENvbGxlY3Rpb25zLnNpbmdsZXRvbihGQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydCgpKSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwaXJpbmdNZW1vaXppbmdTdXBwbGllci5NZW1vaXplZDxDYXNzYW5kcmFWZXJzaW9uPiBOT19VUEdSQURFX0lOX1BST0dSRVNTID0gbmV3IEV4cGlyaW5nTWVtb2l6aW5nU3VwcGxpZXIuTWVtb2l6ZWQ8PihudWxsKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHBpcmluZ01lbW9pemluZ1N1cHBsaWVyLk5vdE1lbW9pemVkPENhc3NhbmRyYVZlcnNpb24+IENVUlJFTlRfTk9ERV9WRVJTSU9OID0gbmV3IEV4cGlyaW5nTWVtb2l6aW5nU3VwcGxpZXIuTm90TWVtb2l6ZWQ8PihTeXN0ZW1LZXlzcGFjZS5DVVJSRU5UX1ZFUlNJT04pOwogICAgIGZpbmFsIFN1cHBsaWVyPEV4cGlyaW5nTWVtb2l6aW5nU3VwcGxpZXIuUmV0dXJuVmFsdWU8Q2Fzc2FuZHJhVmVyc2lvbj4+IHVwZ3JhZGVGcm9tVmVyc2lvblN1cHBsaWVyID0gKCkgLT4KICAgICB7CiAgICAgICAgIC8vIE9uY2UgdGhlcmUgYXJlIG5vIHByaW9yIHZlcnNpb24gbm9kZXMgd2UgZG9uJ3QgbmVlZCB0byBrZWVwIHJlY2hlY2tpbmcKICAgICAgICAgaWYgKCF1cGdyYWRlSW5Qcm9ncmVzc1Bvc3NpYmxlKQotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHBpcmluZ01lbW9pemluZ1N1cHBsaWVyLk1lbW9pemVkPD4obnVsbCk7CisgICAgICAgICAgICByZXR1cm4gTk9fVVBHUkFERV9JTl9QUk9HUkVTUzsKIAogICAgICAgICBDYXNzYW5kcmFWZXJzaW9uIG1pblZlcnNpb24gPSBTeXN0ZW1LZXlzcGFjZS5DVVJSRU5UX1ZFUlNJT047CiAKQEAgLTIxNywxNCArMjI4LDE1IEBACiAgICAgICAgIC8vIElmIHdlIGRvbid0IGtub3cgYW55IGVwc3RhdGUgd2UgZG9uJ3Qga25vdyBhbnl0aGluZyBhYm91dCB0aGUgY2x1c3Rlci4KICAgICAgICAgLy8gSWYgd2Ugb25seSBrbm93IGFib3V0IG91cnNlbHZlcywgd2UgY2FuIGFzc3VtZSB0aGF0IHZlcnNpb24gaXMgQ1VSUkVOVF9WRVJTSU9OCiAgICAgICAgIGlmICghaXNFbmFibGVkKCkgfHwgaXNMb25lTm9kZShlbmRwb2ludFN0YXRlTWFwKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHBpcmluZ01lbW9pemluZ1N1cHBsaWVyLk5vdE1lbW9pemVkPD4obWluVmVyc2lvbik7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDVVJSRU5UX05PREVfVkVSU0lPTjsKIAogICAgICAgICAvLyBDaGVjayB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mIGFsbCB0aGUgcGVlcnMgaXQgaGVhcmQgb2YuIE5vdCBuZWNlc3NhcnkgdGhlIHBlZXIgdGhhdCBpdCBoYXMvaGFkIGNvbnRhY3RlZCB3aXRoLgogICAgICAgICBib29sZWFuIGFsbEhvc3RzSGF2ZUtub3duVmVyc2lvbiA9IHRydWU7CiAgICAgICAgIGZvciAoSW5ldEFkZHJlc3NBbmRQb3J0IGhvc3QgOiBlbmRwb2ludFN0YXRlTWFwLmtleVNldCgpKQogICAgICAgICB7CisgICAgICAgICAgICBpZiAoanVzdFJlbW92ZWRFbmRwb2ludHMuY29udGFpbnNLZXkoaG9zdCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKICAgICAgICAgICAgIENhc3NhbmRyYVZlcnNpb24gdmVyc2lvbiA9IGdldFJlbGVhc2VWZXJzaW9uKGhvc3QpOwogCiAgICAgICAgICAgICAvL1JhY2VkIHdpdGggY2hhbmdlcyB0byBnb3NzaXAgc3RhdGUsIHdhaXQgdW50aWwgbmV4dCBpdGVyYXRpb24KQEAgLTI0MSw3ICsyNTMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHBpcmluZ01lbW9pemluZ1N1cHBsaWVyLk5vdE1lbW9pemVkPD4obWluVmVyc2lvbik7CiAKICAgICAgICAgdXBncmFkZUluUHJvZ3Jlc3NQb3NzaWJsZSA9IGZhbHNlOwotICAgICAgICByZXR1cm4gbmV3IEV4cGlyaW5nTWVtb2l6aW5nU3VwcGxpZXIuTWVtb2l6ZWQ8PihudWxsKTsKKyAgICAgICAgcmV0dXJuIE5PX1VQR1JBREVfSU5fUFJPR1JFU1M7CiAgICAgfTsKIAogICAgIHByaXZhdGUgZmluYWwgU3VwcGxpZXI8Q2Fzc2FuZHJhVmVyc2lvbj4gdXBncmFkZUZyb21WZXJzaW9uTWVtb2l6ZWQgPSBFeHBpcmluZ01lbW9pemluZ1N1cHBsaWVyLm1lbW9pemVXaXRoRXhwaXJhdGlvbih1cGdyYWRlRnJvbVZlcnNpb25TdXBwbGllciwgMSwgVGltZVVuaXQuTUlOVVRFUyk7CkBAIC0yNTMsMTggKzI2NSwxOCBAQAogICAgICAgICAoKEV4cGlyaW5nTWVtb2l6aW5nU3VwcGxpZXI8Q2Fzc2FuZHJhVmVyc2lvbj4pIHVwZ3JhZGVGcm9tVmVyc2lvbk1lbW9pemVkKS5leHBpcmUoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGRpc2FibGVUaHJlYWRWYWxpZGF0aW9uID0gQm9vbGVhbi5nZXRCb29sZWFuKFByb3BzLkRJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04pOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGlzYWJsZVRocmVhZFZhbGlkYXRpb24gPSBHT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTi5nZXRCb29sZWFuKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBkaXNhYmxlRW5kcG9pbnRSZW1vdmFsID0gRElTQUJMRV9HT1NTSVBfRU5EUE9JTlRfUkVNT1ZBTC5nZXRCb29sZWFuKCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldFZlcnlMb25nVGltZSgpCiAgICAgewotICAgICAgICBTdHJpbmcgbmV3VkxUID0gIFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnZlcnlfbG9uZ190aW1lX21zIik7Ci0gICAgICAgIGlmIChuZXdWTFQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk92ZXJyaWRpbmcgYVZlcnlMb25nVGltZSB0byB7fW1zIiwgbmV3VkxUKTsKLSAgICAgICAgICAgIHJldHVybiBMb25nLnBhcnNlTG9uZyhuZXdWTFQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAyNTkyMDAgKiAxMDAwOyAvLyAzIGRheXMKKyAgICAgICAgbG9uZyB0aW1lID0gVkVSWV9MT05HX1RJTUVfTVMuZ2V0TG9uZygpOworICAgICAgICBTdHJpbmcgZGVmYXVsdFZhbHVlID0gVkVSWV9MT05HX1RJTUVfTVMuZ2V0RGVmYXVsdFZhbHVlKCk7CisKKyAgICAgICAgaWYgKCFTdHJpbmcudmFsdWVPZih0aW1lKS5lcXVhbHMoZGVmYXVsdFZhbHVlKSkKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJPdmVycmlkaW5nIHt9IGZyb20ge30gdG8ge31tcyIsIFZFUllfTE9OR19USU1FX01TLmdldEtleSgpLCBkZWZhdWx0VmFsdWUsIHRpbWUpOworCisgICAgICAgIHJldHVybiB0aW1lOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbkdvc3NpcFN0YWdlKCkKQEAgLTE1MDIsNyArMTUxNCw3IEBACiAgICAgICAgIHJldHVybiBpc0FkbWluaXN0cmF0aXZlbHlJbmFjdGl2ZVN0YXRlKGVwU3RhdGUpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRHb3NzaXBTdGF0dXMoRW5kcG9pbnRTdGF0ZSBlcFN0YXRlKQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEdvc3NpcFN0YXR1cyhFbmRwb2ludFN0YXRlIGVwU3RhdGUpCiAgICAgewogICAgICAgICBpZiAoZXBTdGF0ZSA9PSBudWxsKQogICAgICAgICB7CkBAIC0xNTI1LDExICsxNTM3LDc4IEBACiAgICAgICAgIHJldHVybiBwaWVjZXNbMF07CiAgICAgfQogCisgICAgLyoqCisgICAgICogR29zc2lwIG9mZmVycyBubyBoYXBwZW5zLWJlZm9yZSByZWxhdGlvbnNoaXAsIGJ1dCBkb3duc3RyZWFtIHN1YnNjcmliZXJzIGFzc3VtZSBhIGhhcHBlbnMtYmVmb3JlIHJlbGF0aW9uc2hpcAorICAgICAqIGJlZm9yZSBiZWluZyBub3RpZmllZCEgIFRvIGF0dGVtcHQgdG8gYmUgbmljZXIgdG8gc3Vic2NyaWJlcnMsIHRoaXMge0BsaW5rIENvbXBhcmF0b3J9IGF0dGVtcHRzIHRvIG9yZGVyIEVuZHBvaW50U3RhdGUKKyAgICAgKiB3aXRoaW4gYSBtYXAgYmFzZWQgb2ZmIGEgZmV3IGhldXJpc3RpY3M6CisgICAgICogPG9sPgorICAgICAqICAgICA8bGk+U1RBVFVTIC0gc29tZSBTVEFUVVMgZGVwZW5kcyBvbiBvdGhlciBpbnN0YW5jZSBTVEFUVVMsIHNvIG1ha2Ugc3VyZSB0aGV5IGFyZSBsYXN0OyBlZy4gQk9PVCwgYW5kIEJPT1RfUkVQTEFDRTwvbGk+CisgICAgICogICAgIDxsaT5nZW5lcmF0aW9uIC0gbm9ybWFsbHkgZGVmaW5lZCBhcyBzeXN0ZW0gY2xvY2sgbWlsbGlzLCB0aGlzIGNhbiBiZSBza2V3ZWQgYW5kIGlzIGEgYmVzdCBlZmZvcnQ8L2xpPgorICAgICAqICAgICA8bGk+YWRkcmVzcyAtIHRpZSBicmVha2VyIHRvIG1ha2Ugc3VyZSBvcmRlciBpcyBjb25zaXN0ZW50PC9saT4KKyAgICAgKiA8L29sPgorICAgICAqIDxwPgorICAgICAqIFByb2JsZW1zOgorICAgICAqIEdlbmVyYXRpb24gaXMgbm9ybWFsbHkgZGVmaW5lZCBhcyBzeXN0ZW0gY2xvY2sgbWlsbGlzLCB3aGljaCBjYW4gYmUgc2tld2VkIGFuZCBpbi1jb25zaXN0ZW50IGNyb3NzIG5vZGVzCisgICAgICogKGdlbmVyYXRpb25zIGRvIG5vdCBoYXZlIGEgaGFwcGVucy1iZWZvcmUgcmVsYXRpb25zaGlwLCBzbyBvcmRlcmluZyBpcyBza2V0Y2h5IGF0IGJlc3QpLgorICAgICAqIDxwPgorICAgICAqIE1vdGl2YXRpb25zOgorICAgICAqIHtAbGluayBNYXAjZW50cnlTZXQoKX0gcmV0dXJucyBkYXRhIGluIGVmZmVjdGl2bGx5IHJhbmRvbSBvcmRlciwgc28gY2FuIGdldCBpbnRvIGEgc2l0dWF0aW9uIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBleGFtcGxlLgorICAgICAqIHtAY29kZQorICAgICAqIDMgbm9kZSBjbHVzdGVyOiBuMSwgbjIsIGFuZCBuMworICAgICAqIG4yIGdvZXMgZG93biBhbmQgbjQgZG9lcyBob3N0IHJlcGxhY2VtZW50IGFuZCBmYWlscyBiZWZvcmUgY29tcGxldGlvbgorICAgICAqIGg1IHRyaWVzIHRvIGRvIGEgaG9zdCByZXBsYWNlbWVudCBhZ2FpbnN0IG40IChpZ25vcmUgdGhlIGZhY3QgdGhpcyBkb2Vzbid0IG1ha2Ugc2Vuc2UpCisgICAgICogfQorICAgICAqIEluIHRoYXQgY2FzZSBhYm92ZSwgdGhlIHtAbGluayBNYXAjZW50cnlTZXQoKX0gb3JkZXJpbmcgY2FuIGJlIHJhbmRvbSwgY2F1c2luZyBoNCB0byBhcHBseSBiZWZvcmUgaDIsIHdoaWNoIHdpbGwKKyAgICAgKiBiZSByZWplY3RlZCBieSBzdWJzY3JpcGVycyAob25seSBhZnRlciB1cGRhdGluZyBnb3NzaXAgY2F1c2luZyB6ZXJvIHJldHJpZXMpLgorICAgICAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyBDb21wYXJhdG9yPEVudHJ5PEluZXRBZGRyZXNzQW5kUG9ydCwgRW5kcG9pbnRTdGF0ZT4+IHN0YXRlT3JkZXJNYXAoKQorICAgIHsKKyAgICAgICAgLy8gVGhlcmUgYXBlYXJzIHRvIGJlIHNvbWUgZWRnZSBjYXNlcyB3aGVyZSB0aGUgc3RhdGUgd2UgYXJlIG9yZGVyaW5nIGdldCBhZGRlZCB0byB0aGUgZ2xvYmFsIHN0YXRlIGNhdXNpbmcKKyAgICAgICAgLy8gb3JkZXJpbmcgdG8gY2hhbmdlLi4uIHRvIGF2b2lkIHRoYXQgcmVseSBvbiBhIGNhY2hlCisgICAgICAgIC8vIHNlZSBDQVNTQU5EUkEtMTc5MDgKKyAgICAgICAgY2xhc3MgQ2FjaGUgZXh0ZW5kcyBIYXNoTWFwPEluZXRBZGRyZXNzQW5kUG9ydCwgRW5kcG9pbnRTdGF0ZT4KKyAgICAgICAgeworICAgICAgICAgICAgRW5kcG9pbnRTdGF0ZSBnZXQoRW50cnk8SW5ldEFkZHJlc3NBbmRQb3J0LCBFbmRwb2ludFN0YXRlPiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjb250YWluc0tleShlLmdldEtleSgpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldChlLmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICBwdXQoZS5nZXRLZXkoKSwgbmV3IEVuZHBvaW50U3RhdGUoZS5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldChlLmdldEtleSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDYWNoZSBjYWNoZSA9IG5ldyBDYWNoZSgpOworICAgICAgICByZXR1cm4gKChDb21wYXJhdG9yPEVudHJ5PEluZXRBZGRyZXNzQW5kUG9ydCwgRW5kcG9pbnRTdGF0ZT4+KSAoZTEsIGUyKSAtPiB7CisgICAgICAgICAgICBTdHJpbmcgZTFzdGF0dXMgPSBnZXRHb3NzaXBTdGF0dXMoY2FjaGUuZ2V0KGUxKSk7CisgICAgICAgICAgICBTdHJpbmcgZTJzdGF0dXMgPSBnZXRHb3NzaXBTdGF0dXMoY2FjaGUuZ2V0KGUyKSk7CisKKyAgICAgICAgICAgIGlmIChPYmplY3RzLmVxdWFscyhlMXN0YXR1cywgZTJzdGF0dXMpIHx8IChCT09UU1RSQVBQSU5HX1NUQVRVUy5jb250YWlucyhlMXN0YXR1cykgJiYgQk9PVFNUUkFQUElOR19TVEFUVVMuY29udGFpbnMoZTJzdGF0dXMpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgLy8gY2hlY2sgc3RhdHVzIGZpcnN0LCBtYWtlIHN1cmUgYm9vdHN0cmFwIHN0YXR1cyBoYXBwZW5zLWFmdGVyIGFsbCBvdGhlcnMKKyAgICAgICAgICAgIGlmIChCT09UU1RSQVBQSU5HX1NUQVRVUy5jb250YWlucyhlMXN0YXR1cykpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICBpZiAoQk9PVFNUUkFQUElOR19TVEFUVVMuY29udGFpbnMoZTJzdGF0dXMpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9KQorICAgICAgICAudGhlbkNvbXBhcmluZ0ludCgoRW50cnk8SW5ldEFkZHJlc3NBbmRQb3J0LCBFbmRwb2ludFN0YXRlPiBlKSAtPiBjYWNoZS5nZXQoZSkuZ2V0SGVhcnRCZWF0U3RhdGUoKS5nZXRHZW5lcmF0aW9uKCkpCisgICAgICAgIC50aGVuQ29tcGFyaW5nKEVudHJ5OjpnZXRLZXkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEl0ZXJhYmxlPEVudHJ5PEluZXRBZGRyZXNzQW5kUG9ydCwgRW5kcG9pbnRTdGF0ZT4+IG9yZGVyKE1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+IGVwU3RhdGVNYXApCisgICAgeworICAgICAgICBMaXN0PEVudHJ5PEluZXRBZGRyZXNzQW5kUG9ydCwgRW5kcG9pbnRTdGF0ZT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oZXBTdGF0ZU1hcC5lbnRyeVNldCgpKTsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0LCBzdGF0ZU9yZGVyTWFwKCkpOworICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBwdWJsaWMgdm9pZCBhcHBseVN0YXRlTG9jYWxseShNYXA8SW5ldEFkZHJlc3NBbmRQb3J0LCBFbmRwb2ludFN0YXRlPiBlcFN0YXRlTWFwKQogICAgIHsKICAgICAgICAgY2hlY2tQcm9wZXJUaHJlYWRGb3JTdGF0ZU11dGF0aW9uKCk7Ci0gICAgICAgIGZvciAoRW50cnk8SW5ldEFkZHJlc3NBbmRQb3J0LCBFbmRwb2ludFN0YXRlPiBlbnRyeSA6IGVwU3RhdGVNYXAuZW50cnlTZXQoKSkKKyAgICAgICAgYm9vbGVhbiBoYXNNYWpvclZlcnNpb24zTm9kZXMgPSBoYXNNYWpvclZlcnNpb24zTm9kZXMoKTsKKyAgICAgICAgZm9yIChFbnRyeTxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+IGVudHJ5IDogb3JkZXIoZXBTdGF0ZU1hcCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBlcCA9IGVudHJ5LmdldEtleSgpOwogICAgICAgICAgICAgaWYgKGVwLmVxdWFscyhnZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydCgpKSAmJiAhaXNJblNoYWRvd1JvdW5kKCkpCkBAIC0xNTQzLDcgKzE2MjIsNyBAQAogCiAgICAgICAgICAgICBFbmRwb2ludFN0YXRlIGxvY2FsRXBTdGF0ZVB0ciA9IGVuZHBvaW50U3RhdGVNYXAuZ2V0KGVwKTsKICAgICAgICAgICAgIEVuZHBvaW50U3RhdGUgcmVtb3RlU3RhdGUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKCFoYXNNYWpvclZlcnNpb24zTm9kZXMoKSkKKyAgICAgICAgICAgIGlmICghaGFzTWFqb3JWZXJzaW9uM05vZGVzKQogICAgICAgICAgICAgICAgIHJlbW90ZVN0YXRlLnJlbW92ZU1ham9yVmVyc2lvbjNMZWdhY3lBcHBsaWNhdGlvblN0YXRlcygpOwogCiAgICAgICAgICAgICAvKgpAQCAtMTU3OSw3ICsxNjU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW90ZU1heFZlcnNpb24gPiBsb2NhbE1heFZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IHN0YXRlcywgYnV0IGRvIG5vdCBub3RpZnkgc2luY2UgdGhlcmUgaXMgbm8gbWFqb3IgY2hhbmdlCi0gICAgICAgICAgICAgICAgICAgICAgICBhcHBseU5ld1N0YXRlcyhlcCwgbG9jYWxFcFN0YXRlUHRyLCByZW1vdGVTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseU5ld1N0YXRlcyhlcCwgbG9jYWxFcFN0YXRlUHRyLCByZW1vdGVTdGF0ZSwgaGFzTWFqb3JWZXJzaW9uM05vZGVzKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIklnbm9yaW5nIHJlbW90ZSB2ZXJzaW9uIHt9IDw9IHt9IGZvciB7fSIsIHJlbW90ZU1heFZlcnNpb24sIGxvY2FsTWF4VmVyc2lvbiwgZXApOwpAQCAtMTYwMiw3ICsxNjgxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBhcHBseU5ld1N0YXRlcyhJbmV0QWRkcmVzc0FuZFBvcnQgYWRkciwgRW5kcG9pbnRTdGF0ZSBsb2NhbFN0YXRlLCBFbmRwb2ludFN0YXRlIHJlbW90ZVN0YXRlKQorICAgIHByaXZhdGUgdm9pZCBhcHBseU5ld1N0YXRlcyhJbmV0QWRkcmVzc0FuZFBvcnQgYWRkciwgRW5kcG9pbnRTdGF0ZSBsb2NhbFN0YXRlLCBFbmRwb2ludFN0YXRlIHJlbW90ZVN0YXRlLCBib29sZWFuIGhhc01ham9yVmVyc2lvbjNOb2RlcykKICAgICB7CiAgICAgICAgIC8vIGRvbid0IGFzc2VydCBoZXJlLCBzaW5jZSBpZiB0aGUgbm9kZSByZXN0YXJ0cyB0aGUgdmVyc2lvbiB3aWxsIGdvIGJhY2sgdG8gemVybwogICAgICAgICBpbnQgb2xkVmVyc2lvbiA9IGxvY2FsU3RhdGUuZ2V0SGVhcnRCZWF0U3RhdGUoKS5nZXRIZWFydEJlYXRWZXJzaW9uKCk7CkBAIC0xNjMxLDcgKzE3MTAsNyBAQAogICAgICAgICBsb2NhbFN0YXRlLmFkZEFwcGxpY2F0aW9uU3RhdGVzKHVwZGF0ZWRTdGF0ZXMpOwogCiAgICAgICAgIC8vIGdldCByaWQgb2YgbGVnYWN5IGZpZWxkcyBvbmNlIHRoZSBjbHVzdGVyIGlzIG5vdCBpbiBtaXhlZCBtb2RlCi0gICAgICAgIGlmICghaGFzTWFqb3JWZXJzaW9uM05vZGVzKCkpCisgICAgICAgIGlmICghaGFzTWFqb3JWZXJzaW9uM05vZGVzKQogICAgICAgICAgICAgbG9jYWxTdGF0ZS5yZW1vdmVNYWpvclZlcnNpb24zTGVnYWN5QXBwbGljYXRpb25TdGF0ZXMoKTsKIAogICAgICAgICAvLyBuZWVkIHRvIHJ1biBTVEFUVVMgb3IgU1RBVFVTX1dJVEhfUE9SVCBmaXJzdCB0byBoYW5kbGUgQk9PVF9SRVBMQUNFIGNvcnJlY3RseSAoZWxzZSB3b24ndCBiZSBhIG1lbWJlciwgc28gVE9LRU5TIHdvbid0IGJlIHByb2Nlc3NlZCkKQEAgLTI0OTAsNiArMjU2OSwxOSBAQAogICAgICAgICByZXR1cm4gbWluVmVyc2lvbjsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRMb29zZUVtcHR5RW5hYmxlZCgpCisgICAgeworICAgICAgICByZXR1cm4gRW5kcG9pbnRTdGF0ZS5MT09TRV9ERUZfT0ZfRU1QVFlfRU5BQkxFRDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRMb29zZUVtcHR5RW5hYmxlZChib29sZWFuIGVuYWJsZWQpCisgICAgeworICAgICAgICBsb2dnZXIuaW5mbygiU2V0dGluZyBsb29zZSBkZWZpbml0aW9uIG9mIGVtcHR5IHRvIHt9IiwgZW5hYmxlZCk7CisgICAgICAgIEVuZHBvaW50U3RhdGUuTE9PU0VfREVGX09GX0VNUFRZX0VOQUJMRUQgPSBlbmFibGVkOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHVuc2FmZVNldEVuYWJsZWQoKQogICAgIHsKICAgICAgICAgc2NoZWR1bGVkR29zc2lwVGFzayA9IG5ldyBOb3RTY2hlZHVsZWRGdXR1cmU8PigpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0dvc3NpcGVyTUJlYW4uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9Hb3NzaXBlck1CZWFuLmphdmEKaW5kZXggNDdkNzIwNy4uMmQ1OWUzNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0dvc3NpcGVyTUJlYW4uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvR29zc2lwZXJNQmVhbi5qYXZhCkBAIC0zOCw0ICszOCw3IEBACiAgICAgLyoqIFJldHVybnMgZWFjaCBub2RlJ3MgZGF0YWJhc2UgcmVsZWFzZSB2ZXJzaW9uICovCiAgICAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0UmVsZWFzZVZlcnNpb25zV2l0aFBvcnQoKTsKIAorICAgIHB1YmxpYyBib29sZWFuIGdldExvb3NlRW1wdHlFbmFibGVkKCk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMb29zZUVtcHR5RW5hYmxlZChib29sZWFuIGVuYWJsZWQpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL1ZlcnNpb25lZFZhbHVlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvVmVyc2lvbmVkVmFsdWUuamF2YQppbmRleCAyNjY0NGUxLi43YzY0Mjc4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvVmVyc2lvbmVkVmFsdWUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvVmVyc2lvbmVkVmFsdWUuamF2YQpAQCAtMTcsMjkgKzE3LDMyIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zOwogCi1pbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xOwotCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklWZXJzaW9uZWRTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb25BbmRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOworCitpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xOwogCiAKIC8qKgpAQCAtODQsNiArODcsOCBAQAogICAgIC8vIHZhbHVlcyBmb3IgQXBwbGljYXRpb25TdGF0ZS5SRU1PVkFMX0NPT1JESU5BVE9SCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVNT1ZBTF9DT09SRElOQVRPUiA9ICJSRU1PVkVSIjsKIAorICAgIHB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gQk9PVFNUUkFQUElOR19TVEFUVVMgPSBJbW11dGFibGVTZXQub2YoU1RBVFVTX0JPT1RTVFJBUFBJTkcsIFNUQVRVU19CT09UU1RSQVBQSU5HX1JFUExBQ0UpOworCiAgICAgcHVibGljIGZpbmFsIGludCB2ZXJzaW9uOwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdmFsdWU7CiAKQEAgLTk5LDYgKzEwNCwxMiBAQAogICAgICAgICB0aGlzKHZhbHVlLCBWZXJzaW9uR2VuZXJhdG9yLmdldE5leHRWZXJzaW9uKCkpOwogICAgIH0KIAorICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBWZXJzaW9uZWRWYWx1ZSB3aXRoVmVyc2lvbihpbnQgdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVmVyc2lvbmVkVmFsdWUodmFsdWUsIHZlcnNpb24pOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgVmVyc2lvbmVkVmFsdWUgdW5zYWZlTWFrZVZlcnNpb25lZFZhbHVlKFN0cmluZyB2YWx1ZSwgaW50IHZlcnNpb24pCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IFZlcnNpb25lZFZhbHVlKHZhbHVlLCB2ZXJzaW9uKTsKQEAgLTMxNSwxMCArMzI2LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gbmV3IFZlcnNpb25lZFZhbHVlKFN0cmluZy52YWx1ZU9mKHZhbHVlKSk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgVmVyc2lvbmVkVmFsdWUgc3N0YWJsZVZlcnNpb25zKFNldDxWZXJzaW9uQW5kVHlwZT4gdmVyc2lvbnMpCisgICAgICAgIHB1YmxpYyBWZXJzaW9uZWRWYWx1ZSBzc3RhYmxlVmVyc2lvbnMoU2V0PFZlcnNpb24+IHZlcnNpb25zKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFZlcnNpb25lZFZhbHVlKHZlcnNpb25zLnN0cmVhbSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChWZXJzaW9uQW5kVHlwZTo6dG9TdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChWZXJzaW9uOjp0b0Zvcm1hdEFuZFZlcnNpb25TdHJpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsIikpKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9Db2x1bW5GYW1pbHlTcGxpdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL0NvbHVtbkZhbWlseVNwbGl0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MjU2ODUuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL0NvbHVtbkZhbWlseVNwbGl0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaW8uV3JpdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLklucHV0U3BsaXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dDsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXQ7Ci1pbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1wdWJsaWMgY2xhc3MgQ29sdW1uRmFtaWx5U3BsaXQgZXh0ZW5kcyBJbnB1dFNwbGl0IGltcGxlbWVudHMgV3JpdGFibGUsIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5JbnB1dFNwbGl0Ci17Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc3RhcnRUb2tlbjsKLSAgICBwcml2YXRlIFN0cmluZyBlbmRUb2tlbjsKLSAgICBwcml2YXRlIGxvbmcgbGVuZ3RoOwotICAgIHByaXZhdGUgU3RyaW5nW10gZGF0YU5vZGVzOwotCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgQ29sdW1uRmFtaWx5U3BsaXQoU3RyaW5nIHN0YXJ0VG9rZW4sIFN0cmluZyBlbmRUb2tlbiwgU3RyaW5nW10gZGF0YU5vZGVzKQotICAgIHsKLSAgICAgICAgdGhpcyhzdGFydFRva2VuLCBlbmRUb2tlbiwgTG9uZy5NQVhfVkFMVUUsIGRhdGFOb2Rlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbHVtbkZhbWlseVNwbGl0KFN0cmluZyBzdGFydFRva2VuLCBTdHJpbmcgZW5kVG9rZW4sIGxvbmcgbGVuZ3RoLCBTdHJpbmdbXSBkYXRhTm9kZXMpCi0gICAgewotICAgICAgICBhc3NlcnQgc3RhcnRUb2tlbiAhPSBudWxsOwotICAgICAgICBhc3NlcnQgZW5kVG9rZW4gIT0gbnVsbDsKLSAgICAgICAgdGhpcy5zdGFydFRva2VuID0gc3RhcnRUb2tlbjsKLSAgICAgICAgdGhpcy5lbmRUb2tlbiA9IGVuZFRva2VuOwotICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLSAgICAgICAgdGhpcy5kYXRhTm9kZXMgPSBkYXRhTm9kZXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRTdGFydFRva2VuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdGFydFRva2VuOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5kVG9rZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuZFRva2VuOwotICAgIH0KLQotICAgIC8vIGdldExlbmd0aCBhbmQgZ2V0TG9jYXRpb25zIHNhdGlzZnkgdGhlIElucHV0U3BsaXQgYWJzdHJhY3Rpb24KLQotICAgIHB1YmxpYyBsb25nIGdldExlbmd0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gbGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRMb2NhdGlvbnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRhdGFOb2RlczsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgS2V5c3BhY2VTcGxpdC5yZWFkKCk7Ci0gICAgcHJvdGVjdGVkIENvbHVtbkZhbWlseVNwbGl0KCkge30KLQotICAgIC8vIFRoZXNlIHRocmVlIG1ldGhvZHMgYXJlIGZvciBzZXJpYWxpemluZyBhbmQgZGVzZXJpYWxpemluZwotICAgIC8vIEtleXNwYWNlU3BsaXRzIGFzIG5lZWRlZCBieSB0aGUgV3JpdGFibGUgaW50ZXJmYWNlLgotICAgIHB1YmxpYyB2b2lkIHdyaXRlKERhdGFPdXRwdXQgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG91dC53cml0ZVVURihzdGFydFRva2VuKTsKLSAgICAgICAgb3V0LndyaXRlVVRGKGVuZFRva2VuKTsKLSAgICAgICAgb3V0LndyaXRlSW50KGRhdGFOb2Rlcy5sZW5ndGgpOwotICAgICAgICBmb3IgKFN0cmluZyBlbmRwb2ludCA6IGRhdGFOb2RlcykKLSAgICAgICAgewotICAgICAgICAgICAgb3V0LndyaXRlVVRGKGVuZHBvaW50KTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGVMb25nKGxlbmd0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVhZEZpZWxkcyhEYXRhSW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3RhcnRUb2tlbiA9IGluLnJlYWRVVEYoKTsKLSAgICAgICAgZW5kVG9rZW4gPSBpbi5yZWFkVVRGKCk7Ci0gICAgICAgIGludCBudW1PZkVuZHBvaW50cyA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgZGF0YU5vZGVzID0gbmV3IFN0cmluZ1tudW1PZkVuZHBvaW50c107Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBudW1PZkVuZHBvaW50czsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBkYXRhTm9kZXNbaV0gPSBpbi5yZWFkVVRGKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGxlbmd0aCA9IGluLnJlYWRMb25nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEVPRkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL1dlIG11c3QgYmUgZGVzZXJpYWxpemluZyBpbiBhIG1peGVkLXZlcnNpb24gY2x1c3Rlci4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuICJDb2x1bW5GYW1pbHlTcGxpdCgiICsKLSAgICAgICAgICAgICAgICIoIiArIHN0YXJ0VG9rZW4KLSAgICAgICAgICAgICAgICsgIiwgJyIgKyBlbmRUb2tlbiArICddJwotICAgICAgICAgICAgICAgKyAiIEAiICsgKGRhdGFOb2RlcyA9PSBudWxsID8gbnVsbCA6IEFycmF5cy5hc0xpc3QoZGF0YU5vZGVzKSkgKyAnKSc7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDb2x1bW5GYW1pbHlTcGxpdCByZWFkKERhdGFJbnB1dCBpbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb2x1bW5GYW1pbHlTcGxpdCB3ID0gbmV3IENvbHVtbkZhbWlseVNwbGl0KCk7Ci0gICAgICAgIHcucmVhZEZpZWxkcyhpbik7Ci0gICAgICAgIHJldHVybiB3OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9Db25maWdIZWxwZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9Db25maWdIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1MzliMS4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvQ29uZmlnSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAotLyoKLSAqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3A7Ci0KLQotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKLQotcHVibGljIGNsYXNzIENvbmZpZ0hlbHBlcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9QQVJUSVRJT05FUl9DT05GSUcgPSAiY2Fzc2FuZHJhLmlucHV0LnBhcnRpdGlvbmVyLmNsYXNzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX1BBUlRJVElPTkVSX0NPTkZJRyA9ICJjYXNzYW5kcmEub3V0cHV0LnBhcnRpdGlvbmVyLmNsYXNzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfS0VZU1BBQ0VfQ09ORklHID0gImNhc3NhbmRyYS5pbnB1dC5rZXlzcGFjZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9LRVlTUEFDRV9DT05GSUcgPSAiY2Fzc2FuZHJhLm91dHB1dC5rZXlzcGFjZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX0tFWVNQQUNFX1VTRVJOQU1FX0NPTkZJRyA9ICJjYXNzYW5kcmEuaW5wdXQua2V5c3BhY2UudXNlcm5hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9LRVlTUEFDRV9QQVNTV0RfQ09ORklHID0gImNhc3NhbmRyYS5pbnB1dC5rZXlzcGFjZS5wYXNzd2QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfS0VZU1BBQ0VfVVNFUk5BTUVfQ09ORklHID0gImNhc3NhbmRyYS5vdXRwdXQua2V5c3BhY2UudXNlcm5hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfS0VZU1BBQ0VfUEFTU1dEX0NPTkZJRyA9ICJjYXNzYW5kcmEub3V0cHV0LmtleXNwYWNlLnBhc3N3ZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX0NPTFVNTkZBTUlMWV9DT05GSUcgPSAiY2Fzc2FuZHJhLmlucHV0LmNvbHVtbmZhbWlseSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9DT0xVTU5GQU1JTFlfQ09ORklHID0gIm1hcHJlZHVjZS5vdXRwdXQuYmFzZW5hbWUiOyAvL3RoaXMgbXVzdCA9PSBPdXRwdXRGb3JtYXQuQkFTRV9PVVRQVVRfTkFNRQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9QUkVESUNBVEVfQ09ORklHID0gImNhc3NhbmRyYS5pbnB1dC5wcmVkaWNhdGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9LRVlSQU5HRV9DT05GSUcgPSAiY2Fzc2FuZHJhLmlucHV0LmtleVJhbmdlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfU1BMSVRfU0laRV9DT05GSUcgPSAiY2Fzc2FuZHJhLmlucHV0LnNwbGl0LnNpemUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9TUExJVF9TSVpFX0lOX01JQl9DT05GSUcgPSAiY2Fzc2FuZHJhLmlucHV0LnNwbGl0LnNpemVfbWIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9XSURFUk9XU19DT05GSUcgPSAiY2Fzc2FuZHJhLmlucHV0LndpZGVyb3dzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TUExJVF9TSVpFID0gNjQgKiAxMDI0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSQU5HRV9CQVRDSF9TSVpFX0NPTkZJRyA9ICJjYXNzYW5kcmEucmFuZ2UuYmF0Y2guc2l6ZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUkFOR0VfQkFUQ0hfU0laRSA9IDQwOTY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX0lOSVRJQUxfQUREUkVTUyA9ICJjYXNzYW5kcmEuaW5wdXQuYWRkcmVzcyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9JTklUSUFMX0FERFJFU1MgPSAiY2Fzc2FuZHJhLm91dHB1dC5hZGRyZXNzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0lOSVRJQUxfUE9SVCA9ICJjYXNzYW5kcmEub3V0cHV0LnBvcnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0NPTlNJU1RFTkNZX0xFVkVMID0gImNhc3NhbmRyYS5jb25zaXN0ZW5jeWxldmVsLnJlYWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUklURV9DT05TSVNURU5DWV9MRVZFTCA9ICJjYXNzYW5kcmEuY29uc2lzdGVuY3lsZXZlbC53cml0ZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9DT01QUkVTU0lPTl9DTEFTUyA9ICJjYXNzYW5kcmEub3V0cHV0LmNvbXByZXNzaW9uLmNsYXNzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0NPTVBSRVNTSU9OX0NIVU5LX0xFTkdUSCA9ICJjYXNzYW5kcmEub3V0cHV0LmNvbXByZXNzaW9uLmxlbmd0aCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9MT0NBTF9EQ19PTkxZID0gImNhc3NhbmRyYS5vdXRwdXQubG9jYWwuZGMub25seSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0FTU0FORFJBX05BVElWRV9QT1JUID0gIjcwMDAiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbmZpZ0hlbHBlci5jbGFzcyk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGtleXNwYWNlIGFuZCBjb2x1bW4gZmFtaWx5IGZvciB0aGUgaW5wdXQgb2YgdGhpcyBqb2IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZiAgICAgICAgIEpvYiBjb25maWd1cmF0aW9uIHlvdSBhcmUgYWJvdXQgdG8gcnVuCi0gICAgICogQHBhcmFtIGtleXNwYWNlCi0gICAgICogQHBhcmFtIGNvbHVtbkZhbWlseQotICAgICAqIEBwYXJhbSB3aWRlcm93cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dENvbHVtbkZhbWlseShDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIGNvbHVtbkZhbWlseSwgYm9vbGVhbiB3aWRlcm93cykKLSAgICB7Ci0gICAgICAgIGlmIChrZXlzcGFjZSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJrZXlzcGFjZSBtYXkgbm90IGJlIG51bGwiKTsKLQotICAgICAgICBpZiAoY29sdW1uRmFtaWx5ID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInRhYmxlIG1heSBub3QgYmUgbnVsbCIpOwotCi0gICAgICAgIGNvbmYuc2V0KElOUFVUX0tFWVNQQUNFX0NPTkZJRywga2V5c3BhY2UpOwotICAgICAgICBjb25mLnNldChJTlBVVF9DT0xVTU5GQU1JTFlfQ09ORklHLCBjb2x1bW5GYW1pbHkpOwotICAgICAgICBjb25mLnNldChJTlBVVF9XSURFUk9XU19DT05GSUcsIFN0cmluZy52YWx1ZU9mKHdpZGVyb3dzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBrZXlzcGFjZSBhbmQgY29sdW1uIGZhbWlseSBmb3IgdGhlIGlucHV0IG9mIHRoaXMgam9iLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmYgICAgICAgICBKb2IgY29uZmlndXJhdGlvbiB5b3UgYXJlIGFib3V0IHRvIHJ1bgotICAgICAqIEBwYXJhbSBrZXlzcGFjZQotICAgICAqIEBwYXJhbSBjb2x1bW5GYW1pbHkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXRDb2x1bW5GYW1pbHkoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcga2V5c3BhY2UsIFN0cmluZyBjb2x1bW5GYW1pbHkpCi0gICAgewotICAgICAgICBzZXRJbnB1dENvbHVtbkZhbWlseShjb25mLCBrZXlzcGFjZSwgY29sdW1uRmFtaWx5LCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBrZXlzcGFjZSBmb3IgdGhlIG91dHB1dCBvZiB0aGlzIGpvYi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25mIEpvYiBjb25maWd1cmF0aW9uIHlvdSBhcmUgYWJvdXQgdG8gcnVuCi0gICAgICogQHBhcmFtIGtleXNwYWNlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE91dHB1dEtleXNwYWNlKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGtleXNwYWNlKQotICAgIHsKLSAgICAgICAgaWYgKGtleXNwYWNlID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImtleXNwYWNlIG1heSBub3QgYmUgbnVsbCIpOwotCi0gICAgICAgIGNvbmYuc2V0KE9VVFBVVF9LRVlTUEFDRV9DT05GSUcsIGtleXNwYWNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNvbHVtbiBmYW1pbHkgZm9yIHRoZSBvdXRwdXQgb2YgdGhpcyBqb2IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZiAgICAgICAgIEpvYiBjb25maWd1cmF0aW9uIHlvdSBhcmUgYWJvdXQgdG8gcnVuCi0gICAgICogQHBhcmFtIGNvbHVtbkZhbWlseQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPdXRwdXRDb2x1bW5GYW1pbHkoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgY29sdW1uRmFtaWx5KQotICAgIHsKLSAgICAJY29uZi5zZXQoT1VUUFVUX0NPTFVNTkZBTUlMWV9DT05GSUcsIGNvbHVtbkZhbWlseSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBjb2x1bW4gZmFtaWx5IGZvciB0aGUgb3V0cHV0IG9mIHRoaXMgam9iLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbmYgICAgICAgICBKb2IgY29uZmlndXJhdGlvbiB5b3UgYXJlIGFib3V0IHRvIHJ1bgotICAgICAqIEBwYXJhbSBrZXlzcGFjZQotICAgICAqIEBwYXJhbSBjb2x1bW5GYW1pbHkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0Q29sdW1uRmFtaWx5KENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgY29sdW1uRmFtaWx5KQotICAgIHsKLSAgICAJc2V0T3V0cHV0S2V5c3BhY2UoY29uZiwga2V5c3BhY2UpOwotICAgIAlzZXRPdXRwdXRDb2x1bW5GYW1pbHkoY29uZiwgY29sdW1uRmFtaWx5KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHJvd3MgdG8gcmVxdWVzdCB3aXRoIGVhY2ggZ2V0IHJhbmdlIHNsaWNlcyByZXF1ZXN0LgotICAgICAqIFRvbyBiaWcgYW5kIHlvdSBjYW4gZWl0aGVyIGdldCB0aW1lb3V0cyB3aGVuIGl0IHRha2VzIENhc3NhbmRyYSB0b28KLSAgICAgKiBsb25nIHRvIGZldGNoIGFsbCB0aGUgZGF0YS4gVG9vIHNtYWxsIGFuZCB0aGUgcGVyZm9ybWFuY2UKLSAgICAgKiB3aWxsIGJlIGVhdGVuIHVwIGJ5IHRoZSBvdmVyaGVhZCBvZiBlYWNoIHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZiAgICAgIEpvYiBjb25maWd1cmF0aW9uIHlvdSBhcmUgYWJvdXQgdG8gcnVuCi0gICAgICogQHBhcmFtIGJhdGNoc2l6ZSBOdW1iZXIgb2Ygcm93cyB0byByZXF1ZXN0IGVhY2ggdGltZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSYW5nZUJhdGNoU2l6ZShDb25maWd1cmF0aW9uIGNvbmYsIGludCBiYXRjaHNpemUpCi0gICAgewotICAgICAgICBjb25mLnNldEludChSQU5HRV9CQVRDSF9TSVpFX0NPTkZJRywgYmF0Y2hzaXplKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgbnVtYmVyIG9mIHJvd3MgdG8gcmVxdWVzdCB3aXRoIGVhY2ggZ2V0IHJhbmdlIHNsaWNlcyByZXF1ZXN0LgotICAgICAqIFRvbyBiaWcgYW5kIHlvdSBjYW4gZWl0aGVyIGdldCB0aW1lb3V0cyB3aGVuIGl0IHRha2VzIENhc3NhbmRyYSB0b28KLSAgICAgKiBsb25nIHRvIGZldGNoIGFsbCB0aGUgZGF0YS4gVG9vIHNtYWxsIGFuZCB0aGUgcGVyZm9ybWFuY2UKLSAgICAgKiB3aWxsIGJlIGVhdGVuIHVwIGJ5IHRoZSBvdmVyaGVhZCBvZiBlYWNoIHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZiBKb2IgY29uZmlndXJhdGlvbiB5b3UgYXJlIGFib3V0IHRvIHJ1bgotICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIHJvd3MgdG8gcmVxdWVzdCBlYWNoIHRpbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRSYW5nZUJhdGNoU2l6ZShDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gY29uZi5nZXRJbnQoUkFOR0VfQkFUQ0hfU0laRV9DT05GSUcsIERFRkFVTFRfUkFOR0VfQkFUQ0hfU0laRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzcGxpdC4KLSAgICAgKiBUaGlzIGFmZmVjdHMgdGhlIG51bWJlciBvZiBtYXBzIGNyZWF0ZWQsIGlmIHRoZSBudW1iZXIgaXMgdG9vIHNtYWxsCi0gICAgICogdGhlIG92ZXJoZWFkIG9mIGVhY2ggbWFwIHdpbGwgdGFrZSB1cCB0aGUgYnVsayBvZiB0aGUgam9iIHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZiAgICAgIEpvYiBjb25maWd1cmF0aW9uIHlvdSBhcmUgYWJvdXQgdG8gcnVuCi0gICAgICogQHBhcmFtIHNwbGl0c2l6ZSBOdW1iZXIgb2YgcGFydGl0aW9ucyBpbiB0aGUgaW5wdXQgc3BsaXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXRTcGxpdFNpemUoQ29uZmlndXJhdGlvbiBjb25mLCBpbnQgc3BsaXRzaXplKQotICAgIHsKLSAgICAgICAgY29uZi5zZXRJbnQoSU5QVVRfU1BMSVRfU0laRV9DT05GSUcsIHNwbGl0c2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0SW5wdXRTcGxpdFNpemUoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuZ2V0SW50KElOUFVUX1NQTElUX1NJWkVfQ09ORklHLCBERUZBVUxUX1NQTElUX1NJWkUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc3BsaXQuIHNldElucHV0U3BsaXRTaXplIHZhbHVlIGlzIHVzZWQgaWYgdGhpcyBpcyBub3Qgc2V0LgotICAgICAqIFRoaXMgYWZmZWN0cyB0aGUgbnVtYmVyIG9mIG1hcHMgY3JlYXRlZCwgaWYgdGhlIG51bWJlciBpcyB0b28gc21hbGwKLSAgICAgKiB0aGUgb3ZlcmhlYWQgb2YgZWFjaCBtYXAgd2lsbCB0YWtlIHVwIHRoZSBidWxrIG9mIHRoZSBqb2IgdGltZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25mICAgICAgICAgIEpvYiBjb25maWd1cmF0aW9uIHlvdSBhcmUgYWJvdXQgdG8gcnVuCi0gICAgICogQHBhcmFtIHNwbGl0U2l6ZU1iICAgSW5wdXQgc3BsaXQgc2l6ZSBpbiBNaUIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXRTcGxpdFNpemVJbk1iKENvbmZpZ3VyYXRpb24gY29uZiwgaW50IHNwbGl0U2l6ZU1iKQotICAgIHsKLSAgICAgICAgY29uZi5zZXRJbnQoSU5QVVRfU1BMSVRfU0laRV9JTl9NSUJfQ09ORklHLCBzcGxpdFNpemVNYik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY2Fzc2FuZHJhLmlucHV0LnNwbGl0LnNpemUgd2lsbCBiZSB1c2VkIGlmIHRoZSB2YWx1ZSBpcyB1bmRlZmluZWQgb3IgbmVnYXRpdmUuCi0gICAgICogQHBhcmFtIGNvbmYgIEpvYiBjb25maWd1cmF0aW9uIHlvdSBhcmUgYWJvdXQgdG8gcnVuCi0gICAgICogQHJldHVybiAgICAgIHNwbGl0IHNpemUgaW4gTWlCIG9yIC0xIGlmIGl0IGlzIHVuZGVmaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRJbnB1dFNwbGl0U2l6ZUluTWIoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuZ2V0SW50KElOUFVUX1NQTElUX1NJWkVfSU5fTUlCX0NPTkZJRywgLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgS2V5UmFuZ2UgdG8gbGltaXQgdGhlIHJvd3MuCi0gICAgICogQHBhcmFtIGNvbmYgSm9iIGNvbmZpZ3VyYXRpb24geW91IGFyZSBhYm91dCB0byBydW4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXRSYW5nZShDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBzdGFydFRva2VuLCBTdHJpbmcgZW5kVG9rZW4pCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9LRVlSQU5HRV9DT05GSUcsIHN0YXJ0VG9rZW4gKyAiLCIgKyBlbmRUb2tlbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHN0YXJ0IGFuZCBlbmQgdG9rZW4gb2YgdGhlIGlucHV0IGtleSByYW5nZSBhcyBhIHBhaXIuCi0gICAgICoKLSAgICAgKiBtYXkgYmUgbnVsbCBpZiB1bnNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFBhaXI8U3RyaW5nLCBTdHJpbmc+IGdldElucHV0S2V5UmFuZ2UoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHN0ciA9IGNvbmYuZ2V0KElOUFVUX0tFWVJBTkdFX0NPTkZJRyk7Ci0gICAgICAgIGlmIChzdHIgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFN0cmluZ1tdIHBhcnRzID0gc3RyLnNwbGl0KCIsIik7Ci0gICAgICAgIGFzc2VydCBwYXJ0cy5sZW5ndGggPT0gMjsKLSAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKHBhcnRzWzBdLCBwYXJ0c1sxXSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5wdXRLZXlzcGFjZShDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gY29uZi5nZXQoSU5QVVRfS0VZU1BBQ0VfQ09ORklHKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPdXRwdXRLZXlzcGFjZShDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gY29uZi5nZXQoT1VUUFVUX0tFWVNQQUNFX0NPTkZJRyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0S2V5c3BhY2VVc2VyTmFtZUFuZFBhc3N3b3JkKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpCi0gICAgewotICAgICAgICBzZXRJbnB1dEtleXNwYWNlVXNlck5hbWUoY29uZiwgdXNlcm5hbWUpOwotICAgICAgICBzZXRJbnB1dEtleXNwYWNlUGFzc3dvcmQoY29uZiwgcGFzc3dvcmQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dEtleXNwYWNlVXNlck5hbWUoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgdXNlcm5hbWUpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9LRVlTUEFDRV9VU0VSTkFNRV9DT05GSUcsIHVzZXJuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbnB1dEtleXNwYWNlVXNlck5hbWUoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAJcmV0dXJuIGNvbmYuZ2V0KElOUFVUX0tFWVNQQUNFX1VTRVJOQU1FX0NPTkZJRyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0S2V5c3BhY2VQYXNzd29yZChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBwYXNzd29yZCkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX0tFWVNQQUNFX1BBU1NXRF9DT05GSUcsIHBhc3N3b3JkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbnB1dEtleXNwYWNlUGFzc3dvcmQoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAJcmV0dXJuIGNvbmYuZ2V0KElOUFVUX0tFWVNQQUNFX1BBU1NXRF9DT05GSUcpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPdXRwdXRLZXlzcGFjZVVzZXJOYW1lQW5kUGFzc3dvcmQoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkKLSAgICB7Ci0gICAgICAgIHNldE91dHB1dEtleXNwYWNlVXNlck5hbWUoY29uZiwgdXNlcm5hbWUpOwotICAgICAgICBzZXRPdXRwdXRLZXlzcGFjZVBhc3N3b3JkKGNvbmYsIHBhc3N3b3JkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0S2V5c3BhY2VVc2VyTmFtZShDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyB1c2VybmFtZSkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KE9VVFBVVF9LRVlTUEFDRV9VU0VSTkFNRV9DT05GSUcsIHVzZXJuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPdXRwdXRLZXlzcGFjZVVzZXJOYW1lKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgCXJldHVybiBjb25mLmdldChPVVRQVVRfS0VZU1BBQ0VfVVNFUk5BTUVfQ09ORklHKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0S2V5c3BhY2VQYXNzd29yZChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBwYXNzd29yZCkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KE9VVFBVVF9LRVlTUEFDRV9QQVNTV0RfQ09ORklHLCBwYXNzd29yZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0S2V5c3BhY2VQYXNzd29yZChDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgIAlyZXR1cm4gY29uZi5nZXQoT1VUUFVUX0tFWVNQQUNFX1BBU1NXRF9DT05GSUcpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElucHV0Q29sdW1uRmFtaWx5KENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25mLmdldChJTlBVVF9DT0xVTU5GQU1JTFlfQ09ORklHKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPdXRwdXRDb2x1bW5GYW1pbHkoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAJaWYgKGNvbmYuZ2V0KE9VVFBVVF9DT0xVTU5GQU1JTFlfQ09ORklHKSAhPSBudWxsKQotICAgIAkJcmV0dXJuIGNvbmYuZ2V0KE9VVFBVVF9DT0xVTU5GQU1JTFlfQ09ORklHKTsKLSAgICAJZWxzZQotICAgIAkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJZb3UgbXVzdCBzZXQgdGhlIG91dHB1dCBjb2x1bW4gZmFtaWx5IHVzaW5nIGVpdGhlciBzZXRPdXRwdXRDb2x1bW5GYW1pbHkgb3IgYnkgYWRkaW5nIGEgbmFtZWQgb3V0cHV0IHdpdGggTXVsdGlwbGVPdXRwdXRzIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGdldElucHV0SXNXaWRlKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBCb29sZWFuLnBhcnNlQm9vbGVhbihjb25mLmdldChJTlBVVF9XSURFUk9XU19DT05GSUcpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWFkQ29uc2lzdGVuY3lMZXZlbChDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gY29uZi5nZXQoUkVBRF9DT05TSVNURU5DWV9MRVZFTCwgIkxPQ0FMX09ORSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZWFkQ29uc2lzdGVuY3lMZXZlbChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBjb25zaXN0ZW5jeUxldmVsKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoUkVBRF9DT05TSVNURU5DWV9MRVZFTCwgY29uc2lzdGVuY3lMZXZlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V3JpdGVDb25zaXN0ZW5jeUxldmVsKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25mLmdldChXUklURV9DT05TSVNURU5DWV9MRVZFTCwgIkxPQ0FMX09ORSIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRXcml0ZUNvbnNpc3RlbmN5TGV2ZWwoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgY29uc2lzdGVuY3lMZXZlbCkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KFdSSVRFX0NPTlNJU1RFTkNZX0xFVkVMLCBjb25zaXN0ZW5jeUxldmVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbnB1dEluaXRpYWxBZGRyZXNzKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25mLmdldChJTlBVVF9JTklUSUFMX0FERFJFU1MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dEluaXRpYWxBZGRyZXNzKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGFkZHJlc3MpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9JTklUSUFMX0FERFJFU1MsIGFkZHJlc3MpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXRQYXJ0aXRpb25lcihDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBjbGFzc25hbWUpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9QQVJUSVRJT05FUl9DT05GSUcsIGNsYXNzbmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJUGFydGl0aW9uZXIgZ2V0SW5wdXRQYXJ0aXRpb25lcihDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gRkJVdGlsaXRpZXMubmV3UGFydGl0aW9uZXIoY29uZi5nZXQoSU5QVVRfUEFSVElUSU9ORVJfQ09ORklHKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0SW5pdGlhbEFkZHJlc3MoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuZ2V0KE9VVFBVVF9JTklUSUFMX0FERFJFU1MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPdXRwdXRJbml0aWFsUG9ydChDb25maWd1cmF0aW9uIGNvbmYsIEludGVnZXIgcG9ydCkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KE9VVFBVVF9JTklUSUFMX1BPUlQsIHBvcnQudG9TdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBJbnRlZ2VyIGdldE91dHB1dEluaXRpYWxQb3J0KENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoY29uZi5nZXQoT1VUUFVUX0lOSVRJQUxfUE9SVCwgREVGQVVMVF9DQVNTQU5EUkFfTkFUSVZFX1BPUlQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0SW5pdGlhbEFkZHJlc3MoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgYWRkcmVzcykKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KE9VVFBVVF9JTklUSUFMX0FERFJFU1MsIGFkZHJlc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPdXRwdXRQYXJ0aXRpb25lcihDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBjbGFzc25hbWUpCi0gICAgewotICAgICAgICBjb25mLnNldChPVVRQVVRfUEFSVElUSU9ORVJfQ09ORklHLCBjbGFzc25hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVBhcnRpdGlvbmVyIGdldE91dHB1dFBhcnRpdGlvbmVyKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBGQlV0aWxpdGllcy5uZXdQYXJ0aXRpb25lcihjb25mLmdldChPVVRQVVRfUEFSVElUSU9ORVJfQ09ORklHKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0Q29tcHJlc3Npb25DbGFzcyhDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gY29uZi5nZXQoT1VUUFVUX0NPTVBSRVNTSU9OX0NMQVNTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPdXRwdXRDb21wcmVzc2lvbkNodW5rTGVuZ3RoKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25mLmdldChPVVRQVVRfQ09NUFJFU1NJT05fQ0hVTktfTEVOR1RILCBTdHJpbmcudmFsdWVPZihDb21wcmVzc2lvblBhcmFtcy5ERUZBVUxUX0NIVU5LX0xFTkdUSCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPdXRwdXRDb21wcmVzc2lvbkNsYXNzKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGNsYXNzbmFtZSkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KE9VVFBVVF9DT01QUkVTU0lPTl9DTEFTUywgY2xhc3NuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0Q29tcHJlc3Npb25DaHVua0xlbmd0aChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBsZW5ndGgpCi0gICAgewotICAgICAgICBjb25mLnNldChPVVRQVVRfQ09NUFJFU1NJT05fQ0hVTktfTEVOR1RILCBsZW5ndGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRPdXRwdXRMb2NhbERDT25seShDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4oY29uZi5nZXQoT1VUUFVUX0xPQ0FMX0RDX09OTFksICJmYWxzZSIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0TG9jYWxEQ09ubHkoQ29uZmlndXJhdGlvbiBjb25mLCBib29sZWFuIGxvY2FsRENPbmx5KQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoT1VUUFVUX0xPQ0FMX0RDX09OTFksIEJvb2xlYW4udG9TdHJpbmcobG9jYWxEQ09ubHkpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvSGFkb29wQ29tcGF0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvSGFkb29wQ29tcGF0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OWY5NDguLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL0hhZG9vcENvbXBhdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUwICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5Db3VudGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5JbnB1dFNwbGl0OwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5Kb2JDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5Kb2JJRDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuTWFwQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuT3V0cHV0Q29tbWl0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5SZWNvcmRSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlJlY29yZFdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuU3RhdHVzUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlRhc2tBdHRlbXB0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuVGFza0F0dGVtcHRJRDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuVGFza0lucHV0T3V0cHV0Q29udGV4dDsKLQotLyoKLSAqIFRoaXMgaXMgYmFzZWQgb24gQ29udGV4dEZhY3RvcnkuamF2YSBmcm9tIGhhZG9vcC0yLjAueCBzb3VyY2VzLgotICovCi0KLS8qKgotICogVXRpbGl0eSBtZXRob2RzIHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBkZWFsIHdpdGggaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4KLSAqIE1hcFJlZHVjZSBDb250ZXh0IE9iamVjdHMgQVBJIGJldHdlZW4gSGFkb29wIDEueCBhbmQgMi54LgotICovCi1wdWJsaWMgY2xhc3MgSGFkb29wQ29tcGF0Ci17Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIHVzZVYyMTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnN0cnVjdG9yPD8+IEpPQl9DT05URVhUX0NPTlNUUlVDVE9SOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnN0cnVjdG9yPD8+IFRBU0tfQ09OVEVYVF9DT05TVFJVQ1RPUjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBNQVBfQ09OVEVYVF9DT05TVFJVQ1RPUjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBHRU5FUklDX0NPVU5URVJfQ09OU1RSVUNUT1I7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWVsZCBSRUFERVJfRklFTEQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmllbGQgV1JJVEVSX0ZJRUxEOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIEdFVF9DT05GSUdVUkFUSU9OX01FVEhPRDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgU0VUX1NUQVRVU19NRVRIT0Q7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIEdFVF9DT1VOVEVSX01FVEhPRDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZXRob2QgSU5DUkVNRU5UX0NPVU5URVJfTUVUSE9EOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBHRVRfVEFTS19BVFRFTVBUX0lEOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldGhvZCBQUk9HUkVTU19NRVRIT0Q7Ci0KLSAgICBzdGF0aWMKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gdjIxID0gdHJ1ZTsKLSAgICAgICAgZmluYWwgU3RyaW5nIFBBQ0tBR0UgPSAib3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlIjsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENsYXNzLmZvck5hbWUoUEFDS0FHRSArICIudGFzay5Kb2JDb250ZXh0SW1wbCIpOwotICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZmUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHYyMSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHVzZVYyMSA9IHYyMTsKLSAgICAgICAgQ2xhc3M8Pz4gam9iQ29udGV4dENsczsKLSAgICAgICAgQ2xhc3M8Pz4gdGFza0NvbnRleHRDbHM7Ci0gICAgICAgIENsYXNzPD8+IHRhc2tJT0NvbnRleHRDbHM7Ci0gICAgICAgIENsYXNzPD8+IG1hcENvbnRleHRDbHM7Ci0gICAgICAgIENsYXNzPD8+IGdlbmVyaWNDb3VudGVyQ2xzOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHYyMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBqb2JDb250ZXh0Q2xzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoUEFDS0FHRSsiLnRhc2suSm9iQ29udGV4dEltcGwiKTsKLSAgICAgICAgICAgICAgICB0YXNrQ29udGV4dENscyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKFBBQ0tBR0UrIi50YXNrLlRhc2tBdHRlbXB0Q29udGV4dEltcGwiKTsKLSAgICAgICAgICAgICAgICB0YXNrSU9Db250ZXh0Q2xzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoUEFDS0FHRSsiLnRhc2suVGFza0lucHV0T3V0cHV0Q29udGV4dEltcGwiKTsKLSAgICAgICAgICAgICAgICBtYXBDb250ZXh0Q2xzID0gQ2xhc3MuZm9yTmFtZShQQUNLQUdFICsgIi50YXNrLk1hcENvbnRleHRJbXBsIik7Ci0gICAgICAgICAgICAgICAgZ2VuZXJpY0NvdW50ZXJDbHMgPSBDbGFzcy5mb3JOYW1lKFBBQ0tBR0UrIi5jb3VudGVycy5HZW5lcmljQ291bnRlciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGpvYkNvbnRleHRDbHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShQQUNLQUdFKyIuSm9iQ29udGV4dCIpOwotICAgICAgICAgICAgICAgIHRhc2tDb250ZXh0Q2xzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzLmZvck5hbWUoUEFDS0FHRSsiLlRhc2tBdHRlbXB0Q29udGV4dCIpOwotICAgICAgICAgICAgICAgIHRhc2tJT0NvbnRleHRDbHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZShQQUNLQUdFKyIuVGFza0lucHV0T3V0cHV0Q29udGV4dCIpOwotICAgICAgICAgICAgICAgIG1hcENvbnRleHRDbHMgPSBDbGFzcy5mb3JOYW1lKFBBQ0tBR0UgKyAiLk1hcENvbnRleHQiKTsKLSAgICAgICAgICAgICAgICBnZW5lcmljQ291bnRlckNscyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuQ291bnRlcnMkQ291bnRlciIpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgZmluZCBjbGFzcyIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBKT0JfQ09OVEVYVF9DT05TVFJVQ1RPUiA9Ci0gICAgICAgICAgICAgICAgICAgIGpvYkNvbnRleHRDbHMuZ2V0Q29uc3RydWN0b3IoQ29uZmlndXJhdGlvbi5jbGFzcywgSm9iSUQuY2xhc3MpOwotICAgICAgICAgICAgSk9CX0NPTlRFWFRfQ09OU1RSVUNUT1Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIFRBU0tfQ09OVEVYVF9DT05TVFJVQ1RPUiA9Ci0gICAgICAgICAgICAgICAgICAgIHRhc2tDb250ZXh0Q2xzLmdldENvbnN0cnVjdG9yKENvbmZpZ3VyYXRpb24uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza0F0dGVtcHRJRC5jbGFzcyk7Ci0gICAgICAgICAgICBUQVNLX0NPTlRFWFRfQ09OU1RSVUNUT1Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIEdFTkVSSUNfQ09VTlRFUl9DT05TVFJVQ1RPUiA9Ci0gICAgICAgICAgICAgICAgICAgIGdlbmVyaWNDb3VudGVyQ2xzLmdldERlY2xhcmVkQ29uc3RydWN0b3IoU3RyaW5nLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLlRZUEUpOwotICAgICAgICAgICAgR0VORVJJQ19DT1VOVEVSX0NPTlNUUlVDVE9SLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0KLSAgICAgICAgICAgIGlmICh1c2VWMjEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTUFQX0NPTlRFWFRfQ09OU1RSVUNUT1IgPQotICAgICAgICAgICAgICAgICAgICAgICAgbWFwQ29udGV4dENscy5nZXREZWNsYXJlZENvbnN0cnVjdG9yKENvbmZpZ3VyYXRpb24uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tBdHRlbXB0SUQuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZFJlYWRlci5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkV3JpdGVyLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRDb21taXR0ZXIuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1c1JlcG9ydGVyLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFNwbGl0LmNsYXNzKTsKLSAgICAgICAgICAgICAgICBNZXRob2QgZ2V0X2NvdW50ZXI7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZXRfY291bnRlciA9IENsYXNzLmZvck5hbWUoUEFDS0FHRSArICIuVGFza0F0dGVtcHRDb250ZXh0IikuZ2V0TWV0aG9kKCJnZXRDb3VudGVyIiwgU3RyaW5nLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGdldF9jb3VudGVyID0gQ2xhc3MuZm9yTmFtZShQQUNLQUdFICsgIi5UYXNrSW5wdXRPdXRwdXRDb250ZXh0IikuZ2V0TWV0aG9kKCJnZXRDb3VudGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEdFVF9DT1VOVEVSX01FVEhPRCA9IGdldF9jb3VudGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1BUF9DT05URVhUX0NPTlNUUlVDVE9SID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1hcENvbnRleHRDbHMuZ2V0Q29uc3RydWN0b3IoQ29uZmlndXJhdGlvbi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFza0F0dGVtcHRJRC5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkUmVhZGVyLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRXcml0ZXIuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dENvbW1pdHRlci5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzUmVwb3J0ZXIuY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3BsaXQuY2xhc3MpOwotICAgICAgICAgICAgICAgIEdFVF9DT1VOVEVSX01FVEhPRCA9IENsYXNzLmZvck5hbWUoUEFDS0FHRSsiLlRhc2tJbnB1dE91dHB1dENvbnRleHQiKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1ldGhvZCgiZ2V0Q291bnRlciIsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1BUF9DT05URVhUX0NPTlNUUlVDVE9SLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICBSRUFERVJfRklFTEQgPSBtYXBDb250ZXh0Q2xzLmdldERlY2xhcmVkRmllbGQoInJlYWRlciIpOwotICAgICAgICAgICAgUkVBREVSX0ZJRUxELnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICBXUklURVJfRklFTEQgPSB0YXNrSU9Db250ZXh0Q2xzLmdldERlY2xhcmVkRmllbGQoIm91dHB1dCIpOwotICAgICAgICAgICAgV1JJVEVSX0ZJRUxELnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICBHRVRfQ09ORklHVVJBVElPTl9NRVRIT0QgPSBDbGFzcy5mb3JOYW1lKFBBQ0tBR0UrIi5Kb2JDb250ZXh0IikKLSAgICAgICAgICAgICAgICAgICAgLmdldE1ldGhvZCgiZ2V0Q29uZmlndXJhdGlvbiIpOwotICAgICAgICAgICAgU0VUX1NUQVRVU19NRVRIT0QgPSBDbGFzcy5mb3JOYW1lKFBBQ0tBR0UrIi5UYXNrQXR0ZW1wdENvbnRleHQiKQotICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kKCJzZXRTdGF0dXMiLCBTdHJpbmcuY2xhc3MpOwotICAgICAgICAgICAgR0VUX1RBU0tfQVRURU1QVF9JRCA9IENsYXNzLmZvck5hbWUoUEFDS0FHRSsiLlRhc2tBdHRlbXB0Q29udGV4dCIpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRNZXRob2QoImdldFRhc2tBdHRlbXB0SUQiKTsKLSAgICAgICAgICAgIElOQ1JFTUVOVF9DT1VOVEVSX01FVEhPRCA9IENsYXNzLmZvck5hbWUoUEFDS0FHRSsiLkNvdW50ZXIiKQotICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kKCJpbmNyZW1lbnQiLCBMb25nLlRZUEUpOwotICAgICAgICAgICAgUFJPR1JFU1NfTUVUSE9EID0gQ2xhc3MuZm9yTmFtZShQQUNLQUdFKyIuVGFza0F0dGVtcHRDb250ZXh0IikKLSAgICAgICAgICAgICAgICAgICAgLmdldE1ldGhvZCgicHJvZ3Jlc3MiKTsKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBydW4gY29uc3RydWN0b3IgIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBmaW5kIGNvbnN0cnVjdG9yICIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBmaW5kIGZpZWxkICIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IGZpbmQgY2xhc3MiLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgcnVudGltZSBIYWRvb3AgdmVyc2lvbiBpcyAyLngsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWZXJzaW9uMngoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVzZVYyMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoQ29uc3RydWN0b3I8Pz4gY29uc3RydWN0b3IsIE9iamVjdC4uLmFyZ3MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IGluc3RhbnRpYXRlICIgKyBjb25zdHJ1Y3RvciwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgaW5zdGFudGlhdGUgIiArIGNvbnN0cnVjdG9yLCBlKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBpbnN0YW50aWF0ZSAiICsgY29uc3RydWN0b3IsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBKb2JDb250ZXh0IGZyb20gYSBKb2JDb25mIGFuZCBqb2JJZCB1c2luZyB0aGUgY29ycmVjdCBjb25zdHJ1Y3RvcgotICAgICAqIGZvciBiYXNlZCBvbiBIYWRvb3AgdmVyc2lvbi4gPGNvZGU+am9iSWQ8L2NvZGU+IGNvdWxkIGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBKb2JDb250ZXh0IG5ld0pvYkNvbnRleHQoQ29uZmlndXJhdGlvbiBjb25mLCBKb2JJRCBqb2JJZCkgewotICAgICAgICByZXR1cm4gKEpvYkNvbnRleHQpIG5ld0luc3RhbmNlKEpPQl9DT05URVhUX0NPTlNUUlVDVE9SLCBjb25mLCBqb2JJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBUYXNrQXR0ZW1wQ29udGV4dCBmcm9tIGEgSm9iQ29uZiBhbmQgam9iSWQgdXNpbmcgdGhlIGNvcnJlY3QKLSAgICAgKiBjb25zdHJ1Y3RvciBmb3IgYmFzZWQgb24gSGFkb29wIHZlcnNpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUYXNrQXR0ZW1wdENvbnRleHQgbmV3VGFza0F0dGVtcHRDb250ZXh0KAotICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25mLCBUYXNrQXR0ZW1wdElEIHRhc2tBdHRlbXB0SWQpIHsKLSAgICAgICAgcmV0dXJuIChUYXNrQXR0ZW1wdENvbnRleHQpCi0gICAgICAgICAgICAgICAgbmV3SW5zdGFuY2UoVEFTS19DT05URVhUX0NPTlNUUlVDVE9SLCBjb25mLCB0YXNrQXR0ZW1wdElkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnN0YW50aWF0ZXMgTWFwQ29udGV4dCB1bmRlciBIYWRvb3AgMSBhbmQgTWFwQ29udGV4dEltcGwgdW5kZXIgSGFkb29wIDIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNYXBDb250ZXh0IG5ld01hcENvbnRleHQoQ29uZmlndXJhdGlvbiBjb25mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tBdHRlbXB0SUQgdGFza0F0dGVtcHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRSZWFkZXIgcmVjb3JkUmVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZFdyaXRlciByZWNvcmRXcml0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Q29tbWl0dGVyIG91dHB1dENvbW1pdHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNSZXBvcnRlciBzdGF0dXNSZXBvcnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFNwbGl0IGlucHV0U3BsaXQpIHsKLSAgICAgICAgcmV0dXJuIChNYXBDb250ZXh0KSBuZXdJbnN0YW5jZShNQVBfQ09OVEVYVF9DT05TVFJVQ1RPUiwKLSAgICAgICAgICAgICAgICBjb25mLCB0YXNrQXR0ZW1wdElELCByZWNvcmRSZWFkZXIsIHJlY29yZFdyaXRlciwgb3V0cHV0Q29tbWl0dGVyLAotICAgICAgICAgICAgICAgIHN0YXR1c1JlcG9ydGVyLCBpbnB1dFNwbGl0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHdpdGggSGFkb29wIDIgOiA8Y29kZT5uZXcgR2VuZXJpY0NvdW50ZXIoYXJncyk8L2NvZGU+LDxicj4KLSAgICAgKiAgICAgICAgIHdpdGggSGFkb29wIDEgOiA8Y29kZT5uZXcgQ291bnRlcihhcmdzKTwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvdW50ZXIgbmV3R2VuZXJpY0NvdW50ZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBkaXNwbGF5TmFtZSwgbG9uZyB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKENvdW50ZXIpCi0gICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfQ09VTlRFUl9DT05TVFJVQ1RPUi5uZXdJbnN0YW5jZShuYW1lLCBkaXNwbGF5TmFtZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuJ3QgaW5zdGFudGlhdGUgQ291bnRlciIsIGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlcyBhIG1ldGhvZCBhbmQgcmV0aHJvd3MgYW55IGV4Y2VwdGlvbiBhcyBydW50aW1lIGV4Y2V0cGlvbnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGludm9rZShNZXRob2QgbWV0aG9kLCBPYmplY3Qgb2JqLCBPYmplY3QuLi4gYXJncykKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZShvYmosIGFyZ3MpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBpbnZva2UgbWV0aG9kICIgKyBtZXRob2QuZ2V0TmFtZSgpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZSBnZXRDb25maWd1cmF0aW9uKCkgb24gSm9iQ29udGV4dC4gV29ya3Mgd2l0aCBib3RoCi0gICAgICogSGFkb29wIDEgYW5kIDIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oSm9iQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChDb25maWd1cmF0aW9uKSBpbnZva2UoR0VUX0NPTkZJR1VSQVRJT05fTUVUSE9ELCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnZva2Ugc2V0U3RhdHVzKCkgb24gVGFza0F0dGVtcHRDb250ZXh0LiBXb3JrcyB3aXRoIGJvdGgKLSAgICAgKiBIYWRvb3AgMSBhbmQgMi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdHVzKFRhc2tBdHRlbXB0Q29udGV4dCBjb250ZXh0LCBTdHJpbmcgc3RhdHVzKQotICAgIHsKLSAgICAgICAgaW52b2tlKFNFVF9TVEFUVVNfTUVUSE9ELCBjb250ZXh0LCBzdGF0dXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHJldHVybnMgVGFza0F0dGVtcHRDb250ZXh0LmdldFRhc2tBdHRlbXB0SUQoKS4gV29ya3Mgd2l0aCBib3RoCi0gICAgICogSGFkb29wIDEgYW5kIDIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUYXNrQXR0ZW1wdElEIGdldFRhc2tBdHRlbXB0SUQoVGFza0F0dGVtcHRDb250ZXh0IHRhc2tDb250ZXh0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIChUYXNrQXR0ZW1wdElEKSBpbnZva2UoR0VUX1RBU0tfQVRURU1QVF9JRCwgdGFza0NvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludm9rZSBnZXRDb3VudGVyKCkgb24gVGFza0lucHV0T3V0cHV0Q29udGV4dC4gV29ya3Mgd2l0aCBib3RoCi0gICAgICogSGFkb29wIDEgYW5kIDIuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb3VudGVyIGdldENvdW50ZXIoVGFza0lucHV0T3V0cHV0Q29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBncm91cE5hbWUsIFN0cmluZyBjb3VudGVyTmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoQ291bnRlcikgaW52b2tlKEdFVF9DT1VOVEVSX01FVEhPRCwgY29udGV4dCwgZ3JvdXBOYW1lLCBjb3VudGVyTmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW52b2tlIFRhc2tBdHRlbXB0Q29udGV4dC5wcm9ncmVzcygpLiBXb3JrcyB3aXRoIGJvdGgKLSAgICAgKiBIYWRvb3AgMSBhbmQgMi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvZ3Jlc3MoVGFza0F0dGVtcHRDb250ZXh0IGNvbnRleHQpCi0gICAgewotICAgICAgICBpbnZva2UoUFJPR1JFU1NfTUVUSE9ELCBjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmNyZW1lbnQgdGhlIGNvdW50ZXIuIFdvcmtzIHdpdGggYm90aCBIYWRvb3AgMSBhbmQgMgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbmNyZW1lbnRDb3VudGVyKENvdW50ZXIgY291bnRlciwgbG9uZyBpbmNyZW1lbnQpCi0gICAgewotICAgICAgICAvLyBpbmNyZW1lbnRpbmcgYSBjb3VudCBtaWdodCBiZSBjYWxsZWQgb2Z0ZW4uIE1pZ2h0IGJlIGFmZmVjdGVkIGJ5Ci0gICAgICAgIC8vIGNvc3Qgb2YgaW52b2tlKCkuIG1pZ2h0IGJlIGdvb2QgY2FuZGlkYXRlIHRvIGhhbmRsZSBpbiBhIHNoaW0uCi0gICAgICAgIC8vIChUT0RPIFJhZ2h1KSBmaWd1cmUgb3V0IGhvdyBhY2hpZXZlIHN1Y2ggYSBidWlsZCB3aXRoIG1hdmVuCi0gICAgICAgIGludm9rZShJTkNSRU1FTlRfQ09VTlRFUl9NRVRIT0QsIGNvdW50ZXIsIGluY3JlbWVudCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL1JlcG9ydGVyV3JhcHBlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL1JlcG9ydGVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmNjNzY5Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9SZXBvcnRlcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5Db3VudGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuSW5wdXRTcGxpdDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlN0YXR1c1JlcG9ydGVyOwotCi0vKioKLSAqIEEgcmVwb3J0ZXIgdGhhdCB3b3JrcyB3aXRoIGJvdGggbWFwcmVkIGFuZCBtYXByZWR1Y2UgQVBJcy4KLSAqLwotcHVibGljIGNsYXNzIFJlcG9ydGVyV3JhcHBlciBleHRlbmRzIFN0YXR1c1JlcG9ydGVyIGltcGxlbWVudHMgUmVwb3J0ZXIKLXsKLSAgICBwcml2YXRlIFJlcG9ydGVyIHdyYXBwZWRSZXBvcnRlcjsKLQotICAgIHB1YmxpYyBSZXBvcnRlcldyYXBwZXIoUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gICAgewotICAgICAgICB3cmFwcGVkUmVwb3J0ZXIgPSByZXBvcnRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ291bnRlcnMuQ291bnRlciBnZXRDb3VudGVyKEVudW08Pz4gYW5FbnVtKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWRSZXBvcnRlci5nZXRDb3VudGVyKGFuRW51bSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvdW50ZXJzLkNvdW50ZXIgZ2V0Q291bnRlcihTdHJpbmcgcywgU3RyaW5nIHMxKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWRSZXBvcnRlci5nZXRDb3VudGVyKHMsIHMxKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbmNyQ291bnRlcihFbnVtPD8+IGFuRW51bSwgbG9uZyBsKQotICAgIHsKLSAgICAgICAgd3JhcHBlZFJlcG9ydGVyLmluY3JDb3VudGVyKGFuRW51bSwgbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5jckNvdW50ZXIoU3RyaW5nIHMsIFN0cmluZyBzMSwgbG9uZyBsKQotICAgIHsKLSAgICAgICAgd3JhcHBlZFJlcG9ydGVyLmluY3JDb3VudGVyKHMsIHMxLCBsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW5wdXRTcGxpdCBnZXRJbnB1dFNwbGl0KCkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gd3JhcHBlZFJlcG9ydGVyLmdldElucHV0U3BsaXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcm9ncmVzcygpCi0gICAgewotICAgICAgICB3cmFwcGVkUmVwb3J0ZXIucHJvZ3Jlc3MoKTsKLSAgICB9Ci0KLSAgICAvLyBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0UHJvZ3Jlc3MoKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzKQotICAgIHsKLSAgICAgICAgd3JhcHBlZFJlcG9ydGVyLnNldFN0YXR1cyhzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxCdWxrT3V0cHV0Rm9ybWF0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxCdWxrT3V0cHV0Rm9ybWF0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZGY4NTUuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL2NxbDMvQ3FsQnVsa091dHB1dEZvcm1hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5jcWwzOwotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuQ29uZmlnSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5IYWRvb3BDb21wYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZpbGVTeXN0ZW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLkpvYkNvbmY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLkpvYkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLk91dHB1dENvbW1pdHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuT3V0cHV0Rm9ybWF0OwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5SZWNvcmRXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlRhc2tBdHRlbXB0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC51dGlsLlByb2dyZXNzYWJsZTsKLQotLyoqCi0gKiBUaGUgPGNvZGU+Q3FsQnVsa091dHB1dEZvcm1hdDwvY29kZT4gYWN0cyBhcyBhIEhhZG9vcC1zcGVjaWZpYwotICogT3V0cHV0Rm9ybWF0IHRoYXQgYWxsb3dzIHJlZHVjZSB0YXNrcyB0byBzdG9yZSBrZXlzIChhbmQgY29ycmVzcG9uZGluZwotICogYm91bmQgdmFyaWFibGUgdmFsdWVzKSBhcyBDUUwgcm93cyAoYW5kIHJlc3BlY3RpdmUgY29sdW1ucykgaW4gYSBnaXZlbgotICogdGFibGUuCi0gKgotICogPHA+Ci0gKiBBcyBpcyB0aGUgY2FzZSB3aXRoIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLmNxbDMuQ3FsT3V0cHV0Rm9ybWF0fSwgCi0gKiB5b3UgbmVlZCB0byBzZXQgdGhlIHByZXBhcmVkIHN0YXRlbWVudCBpbiB5b3VyCi0gKiBIYWRvb3Agam9iIENvbmZpZ3VyYXRpb24uIFRoZSB7QGxpbmsgQ3FsQ29uZmlnSGVscGVyfSBjbGFzcywgdGhyb3VnaCBpdHMKLSAqIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuQ29uZmlnSGVscGVyI3NldE91dHB1dFByZXBhcmVkU3RhdGVtZW50fSBtZXRob2QsIGlzIHByb3ZpZGVkIHRvIG1ha2UgdGhpcwotICogc2ltcGxlLgotICogeW91IG5lZWQgdG8gc2V0IHRoZSBLZXlzcGFjZS4gVGhlIHtAbGluayBDb25maWdIZWxwZXJ9IGNsYXNzLCB0aHJvdWdoIGl0cwotICoge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5Db25maWdIZWxwZXIjc2V0T3V0cHV0Q29sdW1uRmFtaWx5fSBtZXRob2QsIGlzIHByb3ZpZGVkIHRvIG1ha2UgdGhpcwotICogc2ltcGxlLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ3FsQnVsa091dHB1dEZvcm1hdCBleHRlbmRzIE91dHB1dEZvcm1hdDxPYmplY3QsIExpc3Q8Qnl0ZUJ1ZmZlcj4+Ci0gICAgICAgIGltcGxlbWVudHMgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLk91dHB1dEZvcm1hdDxPYmplY3QsIExpc3Q8Qnl0ZUJ1ZmZlcj4+Ci17ICAgCi0gIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfQ1FMX1NDSEVNQV9QUkVGSVggPSAiY2Fzc2FuZHJhLnRhYmxlLnNjaGVtYS4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfQ1FMX0lOU0VSVF9QUkVGSVggPSAiY2Fzc2FuZHJhLnRhYmxlLmluc2VydC4iOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxFVEVfU09VUkNFID0gImNhc3NhbmRyYS5vdXRwdXQuZGVsZXRlLnNvdXJjZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX0FMSUFTX1BSRUZJWCA9ICJjcWxidWxrb3V0cHV0Zm9ybWF0LnRhYmxlLmFsaWFzLiI7Ci0gIAotICAgIC8qKiBGaWxscyB0aGUgZGVwcmVjYXRlZCBPdXRwdXRGb3JtYXQgaW50ZXJmYWNlIGZvciBzdHJlYW1pbmcuICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgQ3FsQnVsa1JlY29yZFdyaXRlciBnZXRSZWNvcmRXcml0ZXIoRmlsZVN5c3RlbSBmaWxlc3lzdGVtLCBKb2JDb25mIGpvYiwgU3RyaW5nIG5hbWUsIFByb2dyZXNzYWJsZSBwcm9ncmVzcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IENxbEJ1bGtSZWNvcmRXcml0ZXIoam9iLCBwcm9ncmVzcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB7QGxpbmsgUmVjb3JkV3JpdGVyfSBmb3IgdGhlIGdpdmVuIHRhc2suCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqICAgICAgICAgICAgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHRhc2suCi0gICAgICogQHJldHVybiBhIHtAbGluayBSZWNvcmRXcml0ZXJ9IHRvIHdyaXRlIHRoZSBvdXRwdXQgZm9yIHRoZSBqb2IuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBDcWxCdWxrUmVjb3JkV3JpdGVyIGdldFJlY29yZFdyaXRlcihmaW5hbCBUYXNrQXR0ZW1wdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDcWxCdWxrUmVjb3JkV3JpdGVyKGNvbnRleHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNoZWNrT3V0cHV0U3BlY3MoSm9iQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgY2hlY2tPdXRwdXRTcGVjcyhIYWRvb3BDb21wYXQuZ2V0Q29uZmlndXJhdGlvbihjb250ZXh0KSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrT3V0cHV0U3BlY3MoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgaWYgKENvbmZpZ0hlbHBlci5nZXRPdXRwdXRLZXlzcGFjZShjb25mKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oInlvdSBtdXN0IHNldCB0aGUga2V5c3BhY2Ugd2l0aCBzZXRUYWJsZSgpIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogRmlsbHMgdGhlIGRlcHJlY2F0ZWQgT3V0cHV0Rm9ybWF0IGludGVyZmFjZSBmb3Igc3RyZWFtaW5nLiAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIHZvaWQgY2hlY2tPdXRwdXRTcGVjcyhvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtIGZpbGVzeXN0ZW0sIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5Kb2JDb25mIGpvYikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjaGVja091dHB1dFNwZWNzKGpvYik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE91dHB1dENvbW1pdHRlciBnZXRPdXRwdXRDb21taXR0ZXIoVGFza0F0dGVtcHRDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgTnVsbE91dHB1dENvbW1pdHRlcigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGFibGVTY2hlbWEoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgY29sdW1uRmFtaWx5LCBTdHJpbmcgc2NoZW1hKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoT1VUUFVUX0NRTF9TQ0hFTUFfUFJFRklYICsgY29sdW1uRmFtaWx5LCBzY2hlbWEpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUYWJsZUluc2VydFN0YXRlbWVudChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBjb2x1bW5GYW1pbHksIFN0cmluZyBpbnNlcnRTdGF0ZW1lbnQpCi0gICAgewotICAgICAgICBjb25mLnNldChPVVRQVVRfQ1FMX0lOU0VSVF9QUkVGSVggKyBjb2x1bW5GYW1pbHksIGluc2VydFN0YXRlbWVudCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhYmxlU2NoZW1hKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGNvbHVtbkZhbWlseSkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBzY2hlbWEgPSBjb25mLmdldChPVVRQVVRfQ1FMX1NDSEVNQV9QUkVGSVggKyBjb2x1bW5GYW1pbHkpOwotICAgICAgICBpZiAoc2NoZW1hID09IG51bGwpCi0gICAgICAgIHsgCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIllvdSBtdXN0IHNldCB0aGUgVGFibGUgc2NoZW1hIHVzaW5nIHNldFRhYmxlU2NoZW1hLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzY2hlbWE7IAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYWJsZUluc2VydFN0YXRlbWVudChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBjb2x1bW5GYW1pbHkpCi0gICAgewotICAgICAgICBTdHJpbmcgaW5zZXJ0ID0gY29uZi5nZXQoT1VUUFVUX0NRTF9JTlNFUlRfUFJFRklYICsgY29sdW1uRmFtaWx5KTsgCi0gICAgICAgIGlmIChpbnNlcnQgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJZb3UgbXVzdCBzZXQgdGhlIFRhYmxlIGluc2VydCBzdGF0ZW1lbnQgdXNpbmcgc2V0VGFibGVTY2hlbWEuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluc2VydDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlbGV0ZVNvdXJjZU9uU3VjY2VzcyhDb25maWd1cmF0aW9uIGNvbmYsIGJvb2xlYW4gZGVsZXRlU3JjKQotICAgIHsKLSAgICAgICAgY29uZi5zZXRCb29sZWFuKERFTEVURV9TT1VSQ0UsIGRlbGV0ZVNyYyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXREZWxldGVTb3VyY2VPblN1Y2Nlc3MoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuZ2V0Qm9vbGVhbihERUxFVEVfU09VUkNFLCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUYWJsZUFsaWFzKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGFsaWFzLCBTdHJpbmcgY29sdW1uRmFtaWx5KQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoVEFCTEVfQUxJQVNfUFJFRklYICsgYWxpYXMsIGNvbHVtbkZhbWlseSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhYmxlRm9yQWxpYXMoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgYWxpYXMpCi0gICAgewotICAgICAgICByZXR1cm4gY29uZi5nZXQoVEFCTEVfQUxJQVNfUFJFRklYICsgYWxpYXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgaG9zdHMgdG8gaWdub3JlIGFzIGNvbW1hIGRlbGltaXRlZCB2YWx1ZXMuCi0gICAgICogRGF0YSB3aWxsIG5vdCBiZSBidWxrIGxvYWRlZCBvbnRvIHRoZSBpZ25vcmVkIG5vZGVzLgotICAgICAqIEBwYXJhbSBjb25mIGpvYiBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGlnbm9yZU5vZGVzQ3N2IGEgY29tbWEgZGVsaW1pdGVkIGxpc3Qgb2Ygbm9kZXMgdG8gaWdub3JlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElnbm9yZUhvc3RzKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGlnbm9yZU5vZGVzQ3N2KQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoQ3FsQnVsa1JlY29yZFdyaXRlci5JR05PUkVfSE9TVFMsIGlnbm9yZU5vZGVzQ3N2KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGhvc3RzIHRvIGlnbm9yZS4gRGF0YSB3aWxsIG5vdCBiZSBidWxrIGxvYWRlZCBvbnRvIHRoZSBpZ25vcmVkIG5vZGVzLgotICAgICAqIEBwYXJhbSBjb25mIGpvYiBjb25maWd1cmF0aW9uCi0gICAgICogQHBhcmFtIGlnbm9yZU5vZGVzIHRoZSBub2RlcyB0byBpZ25vcmUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SWdub3JlSG9zdHMoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcuLi4gaWdub3JlTm9kZXMpCi0gICAgewotICAgICAgICBjb25mLnNldFN0cmluZ3MoQ3FsQnVsa1JlY29yZFdyaXRlci5JR05PUkVfSE9TVFMsIGlnbm9yZU5vZGVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGhvc3RzIHRvIGlnbm9yZSBhcyBhIGNvbGxlY3Rpb24gb2Ygc3RyaW5ncwotICAgICAqIEBwYXJhbSBjb25mIGpvYiBjb25maWd1cmF0aW9uCi0gICAgICogQHJldHVybiB0aGUgbm9kZXMgdG8gaWdub3JlIGFzIGEgY29sbGVjdGlvbiBvZiBzdGlybmdzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SWdub3JlSG9zdHMoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmYuZ2V0U3RyaW5nQ29sbGVjdGlvbihDcWxCdWxrUmVjb3JkV3JpdGVyLklHTk9SRV9IT1NUUyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBOdWxsT3V0cHV0Q29tbWl0dGVyIGV4dGVuZHMgT3V0cHV0Q29tbWl0dGVyCi0gICAgewotICAgICAgICBwdWJsaWMgdm9pZCBhYm9ydFRhc2soVGFza0F0dGVtcHRDb250ZXh0IHRhc2tDb250ZXh0KSB7IH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbGVhbnVwSm9iKEpvYkNvbnRleHQgam9iQ29udGV4dCkgeyB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY29tbWl0VGFzayhUYXNrQXR0ZW1wdENvbnRleHQgdGFza0NvbnRleHQpIHsgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG5lZWRzVGFza0NvbW1pdChUYXNrQXR0ZW1wdENvbnRleHQgdGFza0NvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldHVwSm9iKEpvYkNvbnRleHQgam9iQ29udGV4dCkgeyB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0dXBUYXNrKFRhc2tBdHRlbXB0Q29udGV4dCB0YXNrQ29udGV4dCkgeyB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL2NxbDMvQ3FsQnVsa1JlY29yZFdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL2NxbDMvQ3FsQnVsa1JlY29yZFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmQ1ZThhLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbEJ1bGtSZWNvcmRXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuY3FsMzsKLQotaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24ubmV0Lkhvc3RBbmRQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVRhYmxlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5Db25maWdIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLkhhZG9vcENvbXBhdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNRTFNTVGFibGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1TdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5OYXRpdmVTU1RhYmxlTG9hZGVyQ2xpZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5SZWNvcmRXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlRhc2tBdHRlbXB0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC51dGlsLlByb2dyZXNzYWJsZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpBVkFfSU9fVE1QRElSOwotCi0vKioKLSAqIFRoZSA8Y29kZT5DcWxCdWxrUmVjb3JkV3JpdGVyPC9jb2RlPiBtYXBzIHRoZSBvdXRwdXQgJmx0O2tleSwgdmFsdWUmZ3Q7Ci0gKiBwYWlycyB0byBhIENhc3NhbmRyYSBjb2x1bW4gZmFtaWx5LiBJbiBwYXJ0aWN1bGFyLCBpdCBhcHBsaWVzIHRoZSBiaW5kZWQgdmFyaWFibGVzCi0gKiBpbiB0aGUgdmFsdWUgdG8gdGhlIHByZXBhcmVkIHN0YXRlbWVudCwgd2hpY2ggaXQgYXNzb2NpYXRlcyB3aXRoIHRoZSBrZXksIGFuZCBpbiAKLSAqIHR1cm4gdGhlIHJlc3BvbnNpYmxlIGVuZHBvaW50LgotICoKLSAqIDxwPgotICogRnVydGhlcm1vcmUsIHRoaXMgd3JpdGVyIGdyb3VwcyB0aGUgY3FsIHF1ZXJpZXMgYnkgdGhlIGVuZHBvaW50IHJlc3BvbnNpYmxlIGZvcgotICogdGhlIHJvd3MgYmVpbmcgYWZmZWN0ZWQuIFRoaXMgYWxsb3dzIHRoZSBjcWwgcXVlcmllcyB0byBiZSBleGVjdXRlZCBpbiBwYXJhbGxlbCwKLSAqIGRpcmVjdGx5IHRvIGEgcmVzcG9uc2libGUgZW5kcG9pbnQuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBDcWxCdWxrT3V0cHV0Rm9ybWF0Ci0gKi8KLXB1YmxpYyBjbGFzcyBDcWxCdWxrUmVjb3JkV3JpdGVyIGV4dGVuZHMgUmVjb3JkV3JpdGVyPE9iamVjdCwgTGlzdDxCeXRlQnVmZmVyPj4KLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuUmVjb3JkV3JpdGVyPE9iamVjdCwgTGlzdDxCeXRlQnVmZmVyPj4KLXsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBPVVRQVVRfTE9DQVRJT04gPSAibWFwcmVkdWNlLm91dHB1dC5idWxrb3V0cHV0Zm9ybWF0LmxvY2FsZGlyIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBCVUZGRVJfU0laRV9JTl9NQiA9ICJtYXByZWR1Y2Uub3V0cHV0LmJ1bGtvdXRwdXRmb3JtYXQuYnVmZmVyc2l6ZSI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSRUFNX1RIUk9UVExFX01CSVRTID0gIm1hcHJlZHVjZS5vdXRwdXQuYnVsa291dHB1dGZvcm1hdC5zdHJlYW10aHJvdHRsZW1iaXRzIjsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNQVhfRkFJTEVEX0hPU1RTID0gIm1hcHJlZHVjZS5vdXRwdXQuYnVsa291dHB1dGZvcm1hdC5tYXhmYWlsZWRob3N0cyI7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUdOT1JFX0hPU1RTID0gIm1hcHJlZHVjZS5vdXRwdXQuYnVsa291dHB1dGZvcm1hdC5pZ25vcmVob3N0cyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDcWxCdWxrUmVjb3JkV3JpdGVyLmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmY7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIGludCBtYXhGYWlsdXJlczsKLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGJ1ZmZlclNpemU7Ci0gICAgcHJvdGVjdGVkIENsb3NlYWJsZSB3cml0ZXI7Ci0gICAgcHJvdGVjdGVkIFNTVGFibGVMb2FkZXIgbG9hZGVyOwotICAgIHByb3RlY3RlZCBQcm9ncmVzc2FibGUgcHJvZ3Jlc3M7Ci0gICAgcHJvdGVjdGVkIFRhc2tBdHRlbXB0Q29udGV4dCBjb250ZXh0OwotICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8SW5ldEFkZHJlc3NBbmRQb3J0PiBpZ25vcmVzID0gbmV3IEhhc2hTZXQ8PigpOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcga2V5c3BhY2U7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdGFibGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgc2NoZW1hOwotICAgIHByaXZhdGUgU3RyaW5nIGluc2VydFN0YXRlbWVudDsKLSAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyOwotICAgIHByaXZhdGUgYm9vbGVhbiBkZWxldGVTcmM7Ci0gICAgcHJpdmF0ZSBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXI7Ci0KLSAgICBDcWxCdWxrUmVjb3JkV3JpdGVyKFRhc2tBdHRlbXB0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRoaXMoSGFkb29wQ29tcGF0LmdldENvbmZpZ3VyYXRpb24oY29udGV4dCkpOwotICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBzZXRDb25maWdzKCk7Ci0gICAgfQotCi0gICAgQ3FsQnVsa1JlY29yZFdyaXRlcihDb25maWd1cmF0aW9uIGNvbmYsIFByb2dyZXNzYWJsZSBwcm9ncmVzcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aGlzKGNvbmYpOwotICAgICAgICB0aGlzLnByb2dyZXNzID0gcHJvZ3Jlc3M7Ci0gICAgICAgIHNldENvbmZpZ3MoKTsKLSAgICB9Ci0KLSAgICBDcWxCdWxrUmVjb3JkV3JpdGVyKENvbmZpZ3VyYXRpb24gY29uZikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aGlzLmNvbmYgPSBjb25mOwotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0U3RyZWFtVGhyb3VnaHB1dE91dGJvdW5kTWVnYWJpdHNQZXJTZWMoSW50ZWdlci5wYXJzZUludChjb25mLmdldChTVFJFQU1fVEhST1RUTEVfTUJJVFMsICIwIikpKTsKLSAgICAgICAgbWF4RmFpbHVyZXMgPSBJbnRlZ2VyLnBhcnNlSW50KGNvbmYuZ2V0KE1BWF9GQUlMRURfSE9TVFMsICIwIikpOwotICAgICAgICBidWZmZXJTaXplID0gSW50ZWdlci5wYXJzZUludChjb25mLmdldChCVUZGRVJfU0laRV9JTl9NQiwgIjY0IikpOwotICAgICAgICBzZXRDb25maWdzKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBzZXRDb25maWdzKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBpZiBhbnl0aGluZyBpcyBtaXNzaW5nLCBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duIGhlcmUsIGluc3RlYWQgb2Ygb24gd3JpdGUoKQotICAgICAgICBrZXlzcGFjZSA9IENvbmZpZ0hlbHBlci5nZXRPdXRwdXRLZXlzcGFjZShjb25mKTsKLSAgICAgICAgdGFibGUgPSBDb25maWdIZWxwZXIuZ2V0T3V0cHV0Q29sdW1uRmFtaWx5KGNvbmYpOwotICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgaWYgdGFibGUgaXMgYWxpYXNlZAotICAgICAgICBTdHJpbmcgYWxpYXNlZENmID0gQ3FsQnVsa091dHB1dEZvcm1hdC5nZXRUYWJsZUZvckFsaWFzKGNvbmYsIHRhYmxlKTsKLSAgICAgICAgaWYgKGFsaWFzZWRDZiAhPSBudWxsKQotICAgICAgICAgICAgdGFibGUgPSBhbGlhc2VkQ2Y7Ci0gICAgICAgIAotICAgICAgICBzY2hlbWEgPSBDcWxCdWxrT3V0cHV0Rm9ybWF0LmdldFRhYmxlU2NoZW1hKGNvbmYsIHRhYmxlKTsKLSAgICAgICAgaW5zZXJ0U3RhdGVtZW50ID0gQ3FsQnVsa091dHB1dEZvcm1hdC5nZXRUYWJsZUluc2VydFN0YXRlbWVudChjb25mLCB0YWJsZSk7Ci0gICAgICAgIG91dHB1dERpciA9IGdldFRhYmxlRGlyZWN0b3J5KCk7Ci0gICAgICAgIGRlbGV0ZVNyYyA9IENxbEJ1bGtPdXRwdXRGb3JtYXQuZ2V0RGVsZXRlU291cmNlT25TdWNjZXNzKGNvbmYpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcGFydGl0aW9uZXIgPSBDb25maWdIZWxwZXIuZ2V0SW5wdXRQYXJ0aXRpb25lcihjb25mKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcnRpdGlvbmVyID0gTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlOwotICAgICAgICB9Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBob3N0VG9JZ25vcmUgOiBDcWxCdWxrT3V0cHV0Rm9ybWF0LmdldElnbm9yZUhvc3RzKGNvbmYpKQotICAgICAgICAgICAgICAgIGlnbm9yZXMuYWRkKEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoaG9zdFRvSWdub3JlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCgiVW5rbm93biBob3N0OiAiICsgZS5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0T3V0cHV0TG9jYXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBkaXIgPSBjb25mLmdldChPVVRQVVRfTE9DQVRJT04sIEpBVkFfSU9fVE1QRElSLmdldFN0cmluZygpKTsKLSAgICAgICAgaWYgKGRpciA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJPdXRwdXQgZGlyZWN0b3J5IG5vdCBkZWZpbmVkLCBpZiBoYWRvb3AgaXMgbm90IHNldHRpbmcgamF2YS5pby50bXBkaXIgdGhlbiBkZWZpbmUgIiArIE9VVFBVVF9MT0NBVElPTik7Ci0gICAgICAgIHJldHVybiBkaXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh3cml0ZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyID0gQ1FMU1NUYWJsZVdyaXRlci5idWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yVGFibGUoc2NoZW1hKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51c2luZyhpbnNlcnRTdGF0ZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhQYXJ0aXRpb25lcihDb25maWdIZWxwZXIuZ2V0T3V0cHV0UGFydGl0aW9uZXIoY29uZikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluRGlyZWN0b3J5KG91dHB1dERpcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEJ1ZmZlclNpemVJbk1pQihJbnRlZ2VyLnBhcnNlSW50KGNvbmYuZ2V0KEJVRkZFUl9TSVpFX0lOX01CLCAiNjQiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhQYXJ0aXRpb25lcihwYXJ0aXRpb25lcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgRXh0ZXJuYWxDbGllbnQgZXh0ZXJuYWxDbGllbnQgPSBuZXcgRXh0ZXJuYWxDbGllbnQoY29uZik7Ci0gICAgICAgICAgICBleHRlcm5hbENsaWVudC5zZXRUYWJsZU1ldGFkYXRhKFRhYmxlTWV0YWRhdGFSZWYuZm9yT2ZmbGluZVRvb2xzKENyZWF0ZVRhYmxlU3RhdGVtZW50LnBhcnNlKHNjaGVtYSwga2V5c3BhY2UpLmJ1aWxkKCkpKTsKLQotICAgICAgICAgICAgbG9hZGVyID0gbmV3IFNTVGFibGVMb2FkZXIob3V0cHV0RGlyLCBleHRlcm5hbENsaWVudCwgbmV3IE51bGxPdXRwdXRIYW5kbGVyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdWNjZXNzKFN0cmVhbVN0YXRlIGZpbmFsU3RhdGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRlU3JjKQotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVJlY3Vyc2l2ZShvdXRwdXREaXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNvbHVtbiB2YWx1ZXMgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBvcmRlciBpbiB3aGljaAotICAgICAqIHRoZXkgYXBwZWFyIGluIHRoZSBpbnNlcnQgc3RvcmVkIHByb2NlZHVyZS4gCi0gICAgICogCi0gICAgICogS2V5IGlzIG5vdCB1c2VkLCBzbyBpdCBjYW4gYmUgbnVsbCBvciBhbnkgb2JqZWN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXkKLSAgICAgKiAgICAgICAgICAgIGFueSBvYmplY3Qgb3IgbnVsbC4KLSAgICAgKiBAcGFyYW0gdmFsdWVzCi0gICAgICogICAgICAgICAgICB0aGUgdmFsdWVzIHRvIHdyaXRlLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZShPYmplY3Qga2V5LCBMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBwcmVwYXJlV3JpdGVyKCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICAoKENRTFNTVGFibGVXcml0ZXIpIHdyaXRlcikucmF3QWRkUm93KHZhbHVlcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChudWxsICE9IHByb2dyZXNzKQotICAgICAgICAgICAgICAgIHByb2dyZXNzLnByb2dyZXNzKCk7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSBjb250ZXh0KQotICAgICAgICAgICAgICAgIEhhZG9vcENvbXBhdC5wcm9ncmVzcyhjb250ZXh0KTsKLSAgICAgICAgfSAKLSAgICAgICAgY2F0Y2ggKEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgYWRkaW5nIHJvdyB3aXRoIGtleTogIiArIGtleSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBGaWxlIGdldFRhYmxlRGlyZWN0b3J5KCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKFN0cmluZy5mb3JtYXQoIiVzJXMlcyVzJXMtJXMiLCBnZXRPdXRwdXRMb2NhdGlvbigpLCBGaWxlLnBhdGhTZXBhcmF0b3IoKSwga2V5c3BhY2UsIEZpbGUucGF0aFNlcGFyYXRvcigpLCB0YWJsZSwgVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSkpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkgJiYgIWRpci50cnlDcmVhdGVEaXJlY3RvcmllcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGVkIG91dHB1dCBkaXJlY3Rvcnk6ICIgKyBkaXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZGlyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKFRhc2tBdHRlbXB0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjbG9zZSgpOwotICAgIH0KLQotICAgIC8qKiBGaWxscyB0aGUgZGVwcmVjYXRlZCBSZWNvcmRXcml0ZXIgaW50ZXJmYWNlIGZvciBzdHJlYW1pbmcuICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgdm9pZCBjbG9zZShvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgICAgICAgICBGdXR1cmU8U3RyZWFtU3RhdGU+IGZ1dHVyZSA9IGxvYWRlci5zdHJlYW0oaWdub3Jlcyk7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZ1dHVyZS5nZXQoMTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gfCBUaW1lb3V0RXhjZXB0aW9uIHRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gcHJvZ3Jlc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5wcm9ncmVzcygpOwotICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSBjb250ZXh0KQotICAgICAgICAgICAgICAgICAgICAgICAgSGFkb29wQ29tcGF0LnByb2dyZXNzKGNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobG9hZGVyLmdldEZhaWxlZEhvc3RzKCkuc2l6ZSgpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobG9hZGVyLmdldEZhaWxlZEhvc3RzKCkuc2l6ZSgpID4gbWF4RmFpbHVyZXMpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVG9vIG1hbnkgaG9zdHMgZmFpbGVkOiAiICsgbG9hZGVyLmdldEZhaWxlZEhvc3RzKCkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlNvbWUgaG9zdHMgZmFpbGVkOiB7fSIsIGxvYWRlci5nZXRGYWlsZWRIb3N0cygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4dGVybmFsQ2xpZW50IGV4dGVuZHMgTmF0aXZlU1NUYWJsZUxvYWRlckNsaWVudAotICAgIHsKLSAgICAgICAgcHVibGljIEV4dGVybmFsQ2xpZW50KENvbmZpZ3VyYXRpb24gY29uZikKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIocmVzb2x2ZUhvc3RBZGRyZXNzZXMoY29uZiksCi0gICAgICAgICAgICAgICAgICBDb25maWdIZWxwZXIuZ2V0T3V0cHV0SW5pdGlhbFBvcnQoY29uZiksCi0gICAgICAgICAgICAgICAgICBDb25maWdIZWxwZXIuZ2V0T3V0cHV0S2V5c3BhY2VVc2VyTmFtZShjb25mKSwKLSAgICAgICAgICAgICAgICAgIENvbmZpZ0hlbHBlci5nZXRPdXRwdXRLZXlzcGFjZVBhc3N3b3JkKGNvbmYpLAotICAgICAgICAgICAgICAgICAgQ3FsQ29uZmlnSGVscGVyLmdldFNTTE9wdGlvbnMoY29uZikub3JOdWxsKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxJbmV0U29ja2V0QWRkcmVzcz4gcmVzb2x2ZUhvc3RBZGRyZXNzZXMoQ29uZmlndXJhdGlvbiBjb25mKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXQ8SW5ldFNvY2tldEFkZHJlc3M+IGFkZHJlc3NlcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgICAgIGludCBwb3J0ID0gQ3FsQ29uZmlnSGVscGVyLmdldE91dHB1dE5hdGl2ZVBvcnQoY29uZik7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBob3N0IDogQ29uZmlnSGVscGVyLmdldE91dHB1dEluaXRpYWxBZGRyZXNzKGNvbmYpLnNwbGl0KCIsIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBIb3N0QW5kUG9ydCBoYXAgPSBIb3N0QW5kUG9ydC5mcm9tU3RyaW5nKGhvc3QpOwotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzZXMuYWRkKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhJbmV0QWRkcmVzcy5nZXRCeU5hbWUoaGFwLmdldEhvc3QoKSksIGhhcC5nZXRQb3J0T3JEZWZhdWx0KHBvcnQpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYWRkcmVzc2VzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBOdWxsT3V0cHV0SGFuZGxlciBpbXBsZW1lbnRzIE91dHB1dEhhbmRsZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG91dHB1dChTdHJpbmcgbXNnKSB7fQotICAgICAgICBwdWJsaWMgdm9pZCBkZWJ1ZyhTdHJpbmcgbXNnKSB7fQotICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKFN0cmluZyBtc2cpIHt9Ci0gICAgICAgIHB1YmxpYyB2b2lkIHdhcm4oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRoKSB7fQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbENsaWVudEhlbHBlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL2NxbDMvQ3FsQ2xpZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYTYzODQuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL2NxbDMvQ3FsQ2xpZW50SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuY3FsMzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci0KLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuSG9zdDsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuTWV0YWRhdGE7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlRva2VuOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Ub2tlblJhbmdlOwotCi1wdWJsaWMgY2xhc3MgQ3FsQ2xpZW50SGVscGVyCi17Ci0gICAgcHJpdmF0ZSBDcWxDbGllbnRIZWxwZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE1hcDxUb2tlblJhbmdlLCBMaXN0PEhvc3Q+PiBnZXRMb2NhbFByaW1hcnlSYW5nZUZvckRDKFN0cmluZyBrZXlzcGFjZSwgTWV0YWRhdGEgbWV0YWRhdGEsIFN0cmluZyB0YXJnZXREQykKLSAgICB7Ci0gICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwoa2V5c3BhY2UsICJrZXlzcGFjZSIpOwotICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKG1ldGFkYXRhLCAibWV0YWRhdGEiKTsKLSAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbCh0YXJnZXREQywgInRhcmdldERDIik7Ci0KLSAgICAgICAgLy8gSW4gMi4xIHRoZSBsb2dpYyB3YXMgdG8gaGF2ZSBhIHNldCBvZiBub2RlcyB1c2VkIGFzIGEgc2VlZCwgdGhleSB3ZXJlIHVzZWQgdG8gcXVlcnkKLSAgICAgICAgLy8gY2xpZW50LmRlc2NyaWJlX2xvY2FsX3Jpbmcoa2V5c3BhY2UpIC0+IExpc3Q8VG9rZW5SYW5nZT47IHRoaXMgc2hvdWxkIGluY2x1ZGUgYWxsIG5vZGVzIGluIHRoZSBsb2NhbCBkYy4KLSAgICAgICAgLy8gVG9rZW5SYW5nZSBjb250YWluZWQgdGhlIGVuZHBvaW50cyBpbiBvcmRlciwgc28gLmVuZHBvaW50cy5nZXQoMCkgaXMgdGhlIHByaW1hcnkgb3duZXIKLSAgICAgICAgLy8gQ2xpZW50IGRvZXMgbm90IGhhdmUgYSBzaW1pbGFyIEFQSSwgaW5zdGVhZCBpdCByZXR1cm5zIFNldDxIb3N0Pi4gIFRvIHJlcGxpY2F0ZSB0aGlzIHdlIGZpcnN0IG5lZWQKLSAgICAgICAgLy8gdG8gY29tcHV0ZSB0aGUgcHJpbWFyeSBvd25lcnMsIHRoZW4gYWRkIGluIHRoZSByZXBsaWNhcwotCi0gICAgICAgIExpc3Q8VG9rZW4+IHRva2VucyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBNYXA8VG9rZW4sIEhvc3Q+IHRva2VuVG9Ib3N0ID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBmb3IgKEhvc3QgaG9zdCA6IG1ldGFkYXRhLmdldEFsbEhvc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghdGFyZ2V0REMuZXF1YWxzKGhvc3QuZ2V0RGF0YWNlbnRlcigpKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgZm9yIChUb2tlbiB0b2tlbiA6IGhvc3QuZ2V0VG9rZW5zKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSG9zdCBwcmV2aW91cyA9IHRva2VuVG9Ib3N0LnB1dElmQWJzZW50KHRva2VuLCBob3N0KTsKLSAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVHdvIGhvc3RzIHNoYXJlIHRoZSBzYW1lIHRva2VuOyBob3N0cyAiICsgaG9zdC5nZXRIb3N0SWQoKSArICI6IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaG9zdC5nZXRUb2tlbnMoKSArICIsICIgKyBwcmV2aW91cy5nZXRIb3N0SWQoKSArICI6IiArIHByZXZpb3VzLmdldFRva2VucygpKTsKLSAgICAgICAgICAgICAgICB0b2tlbnMuYWRkKHRva2VuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHRva2Vucyk7Ci0KLSAgICAgICAgTWFwPFRva2VuUmFuZ2UsIExpc3Q8SG9zdD4+IHJhbmdlVG9SZXBsaWNhcyA9IG5ldyBIYXNoTWFwPD4oKTsKLQotICAgICAgICAvLyBUaGUgZmlyc3QgdG9rZW4gaW4gdGhlIHJpbmcgdXNlcyB0aGUgbGFzdCB0b2tlbiBhcyBpdHMgJ3N0YXJ0JywgaGFuZGxlIHRoaXMgaGVyZSB0byBzaW1wbGlmeSB0aGUgbG9vcAotICAgICAgICBUb2tlbiBzdGFydCA9IHRva2Vucy5nZXQodG9rZW5zLnNpemUoKSAtIDEpOwotICAgICAgICBUb2tlbiBlbmQgPSB0b2tlbnMuZ2V0KDApOwotCi0gICAgICAgIGFkZFJhbmdlKGtleXNwYWNlLCBtZXRhZGF0YSwgdG9rZW5Ub0hvc3QsIHJhbmdlVG9SZXBsaWNhcywgc3RhcnQsIGVuZCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgdG9rZW5zLnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdGFydCA9IHRva2Vucy5nZXQoaSAtIDEpOwotICAgICAgICAgICAgZW5kID0gdG9rZW5zLmdldChpKTsKLQotICAgICAgICAgICAgYWRkUmFuZ2Uoa2V5c3BhY2UsIG1ldGFkYXRhLCB0b2tlblRvSG9zdCwgcmFuZ2VUb1JlcGxpY2FzLCBzdGFydCwgZW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByYW5nZVRvUmVwbGljYXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRSYW5nZShTdHJpbmcga2V5c3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxUb2tlbiwgSG9zdD4gdG9rZW5Ub0hvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8VG9rZW5SYW5nZSwgTGlzdDxIb3N0Pj4gcmFuZ2VUb1JlcGxpY2FzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4gc3RhcnQsIFRva2VuIGVuZCkKLSAgICB7Ci0gICAgICAgIEhvc3QgaG9zdCA9IHRva2VuVG9Ib3N0LmdldChlbmQpOwotICAgICAgICBTdHJpbmcgZGMgPSBob3N0LmdldERhdGFjZW50ZXIoKTsKLQotICAgICAgICBUb2tlblJhbmdlIHJhbmdlID0gbWV0YWRhdGEubmV3VG9rZW5SYW5nZShzdGFydCwgZW5kKTsKLSAgICAgICAgTGlzdDxIb3N0PiByZXBsaWNhcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICByZXBsaWNhcy5hZGQoaG9zdCk7Ci0gICAgICAgIC8vIGdldCBhbGwgdGhlIHJlcGxpY2FzIGZvciB0aGUgc3BlY2lmaWMgREMKLSAgICAgICAgZm9yIChIb3N0IHJlcGxpY2EgOiBtZXRhZGF0YS5nZXRSZXBsaWNhcyhrZXlzcGFjZSwgcmFuZ2UpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGMuZXF1YWxzKHJlcGxpY2EuZ2V0RGF0YWNlbnRlcigpKSAmJiAhaG9zdC5lcXVhbHMocmVwbGljYSkpCi0gICAgICAgICAgICAgICAgcmVwbGljYXMuYWRkKHJlcGxpY2EpOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8SG9zdD4gcHJldmlvdXMgPSByYW5nZVRvUmVwbGljYXMucHV0KHJhbmdlLCByZXBsaWNhcyk7Ci0gICAgICAgIGlmIChwcmV2aW91cyAhPSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVHdvIGhvc3RzICgiICsgaG9zdCArICIsICIgKyBwcmV2aW91cyArICIpIG1hcCB0byB0aGUgc2FtZSB0b2tlbiByYW5nZTogIiArIHJhbmdlKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxDb25maWdIZWxwZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbENvbmZpZ0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OThhNzU0Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbENvbmZpZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLmNxbDM7Ci0vKgotKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKgotKi8KLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LktleU1hbmFnZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IGphdmF4Lm5ldC5zc2wuS2V5TWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0OwotaW1wb3J0IGphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyRmFjdG9yeTsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT3B0aW9uYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOwotCi1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkF1dGhQcm92aWRlcjsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ2x1c3RlcjsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuSG9zdERpc3RhbmNlOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5KZGtTU0xPcHRpb25zOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5QbGFpblRleHRBdXRoUHJvdmlkZXI7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlByb3RvY29sVmVyc2lvbjsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUucG9saWNpZXMuTG9hZEJhbGFuY2luZ1BvbGljeTsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuUG9vbGluZ09wdGlvbnM7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlByb3RvY29sT3B0aW9uczsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuUXVlcnlPcHRpb25zOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TU0xPcHRpb25zOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Tb2NrZXRPcHRpb25zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5Db25maWdIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ3FsQ29uZmlnSGVscGVyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX0NRTF9DT0xVTU5TX0NPTkZJRyA9ICJjYXNzYW5kcmEuaW5wdXQuY29sdW1uZmFtaWx5LmNvbHVtbnMiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9DUUxfUEFHRV9ST1dfU0laRV9DT05GSUcgPSAiY2Fzc2FuZHJhLmlucHV0LnBhZ2Uucm93LnNpemUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9DUUxfV0hFUkVfQ0xBVVNFX0NPTkZJRyA9ICJjYXNzYW5kcmEuaW5wdXQud2hlcmUuY2xhdXNlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfQ1FMID0gImNhc3NhbmRyYS5pbnB1dC5jcWwiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJOQU1FID0gImNhc3NhbmRyYS51c2VybmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEID0gImNhc3NhbmRyYS5wYXNzd29yZCI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfTkFUSVZFX1BPUlQgPSAiY2Fzc2FuZHJhLmlucHV0Lm5hdGl2ZS5wb3J0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfTkFUSVZFX0NPUkVfQ09OTkVDVElPTlNfUEVSX0hPU1QgPSAiY2Fzc2FuZHJhLmlucHV0Lm5hdGl2ZS5jb3JlLmNvbm5lY3Rpb25zLnBlci5ob3N0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfTkFUSVZFX01BWF9DT05ORUNUSU9OU19QRVJfSE9TVCA9ICJjYXNzYW5kcmEuaW5wdXQubmF0aXZlLm1heC5jb25uZWN0aW9ucy5wZXIuaG9zdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX05BVElWRV9NQVhfU0lNVUxUX1JFUV9QRVJfQ09OTkVDVElPTiA9ICJjYXNzYW5kcmEuaW5wdXQubmF0aXZlLm1heC5zaW11bHQucmVxcy5wZXIuY29ubmVjdGlvbiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX05BVElWRV9DT05ORUNUSU9OX1RJTUVPVVQgPSAiY2Fzc2FuZHJhLmlucHV0Lm5hdGl2ZS5jb25uZWN0aW9uLnRpbWVvdXQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9OQVRJVkVfUkVBRF9DT05ORUNUSU9OX1RJTUVPVVQgPSAiY2Fzc2FuZHJhLmlucHV0Lm5hdGl2ZS5yZWFkLmNvbm5lY3Rpb24udGltZW91dCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX05BVElWRV9SRUNFSVZFX0JVRkZFUl9TSVpFID0gImNhc3NhbmRyYS5pbnB1dC5uYXRpdmUucmVjZWl2ZS5idWZmZXIuc2l6ZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX05BVElWRV9TRU5EX0JVRkZFUl9TSVpFID0gImNhc3NhbmRyYS5pbnB1dC5uYXRpdmUuc2VuZC5idWZmZXIuc2l6ZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX05BVElWRV9TT0xJTkdFUiA9ICJjYXNzYW5kcmEuaW5wdXQubmF0aXZlLnNvbGluZ2VyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfTkFUSVZFX1RDUF9OT0RFTEFZID0gImNhc3NhbmRyYS5pbnB1dC5uYXRpdmUudGNwLm5vZGVsYXkiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9OQVRJVkVfUkVVU0VfQUREUkVTUyA9ICJjYXNzYW5kcmEuaW5wdXQubmF0aXZlLnJldXNlLmFkZHJlc3MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9OQVRJVkVfS0VFUF9BTElWRSA9ICJjYXNzYW5kcmEuaW5wdXQubmF0aXZlLmtlZXAuYWxpdmUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9OQVRJVkVfQVVUSF9QUk9WSURFUiA9ICJjYXNzYW5kcmEuaW5wdXQubmF0aXZlLmF1dGgucHJvdmlkZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9OQVRJVkVfU1NMX1RSVVNUX1NUT1JFX1BBVEggPSAiY2Fzc2FuZHJhLmlucHV0Lm5hdGl2ZS5zc2wudHJ1c3Quc3RvcmUucGF0aCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX05BVElWRV9TU0xfS0VZX1NUT1JFX1BBVEggPSAiY2Fzc2FuZHJhLmlucHV0Lm5hdGl2ZS5zc2wua2V5LnN0b3JlLnBhdGgiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVF9OQVRJVkVfU1NMX1RSVVNUX1NUT1JFX1BBU1NXQVJEID0gImNhc3NhbmRyYS5pbnB1dC5uYXRpdmUuc3NsLnRydXN0LnN0b3JlLnBhc3N3b3JkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfTkFUSVZFX1NTTF9LRVlfU1RPUkVfUEFTU1dBUkQgPSAiY2Fzc2FuZHJhLmlucHV0Lm5hdGl2ZS5zc2wua2V5LnN0b3JlLnBhc3N3b3JkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVRfTkFUSVZFX1NTTF9DSVBIRVJfU1VJVEVTID0gImNhc3NhbmRyYS5pbnB1dC5uYXRpdmUuc3NsLmNpcGhlci5zdWl0ZXMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX05BVElWRV9QUk9UT0NPTF9WRVJTSU9OID0gImNhc3NhbmRyYS5pbnB1dC5uYXRpdmUucHJvdG9jb2wudmVyc2lvbiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0NRTCA9ICJjYXNzYW5kcmEub3V0cHV0LmNxbCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9OQVRJVkVfUE9SVCA9ICJjYXNzYW5kcmEub3V0cHV0Lm5hdGl2ZS5wb3J0IjsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgQ1FMIGNvbHVtbnMgZm9yIHRoZSBpbnB1dCBvZiB0aGlzIGpvYi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25mIEpvYiBjb25maWd1cmF0aW9uIHlvdSBhcmUgYWJvdXQgdG8gcnVuCi0gICAgICogQHBhcmFtIGNvbHVtbnMKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXRDb2x1bW5zKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGNvbHVtbnMpCi0gICAgewotICAgICAgICBpZiAoY29sdW1ucyA9PSBudWxsIHx8IGNvbHVtbnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGNvbmYuc2V0KElOUFVUX0NRTF9DT0xVTU5TX0NPTkZJRywgY29sdW1ucyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBDUUwgcXVlcnkgTGltaXQgZm9yIHRoZSBpbnB1dCBvZiB0aGlzIGpvYi4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb25mIEpvYiBjb25maWd1cmF0aW9uIHlvdSBhcmUgYWJvdXQgdG8gcnVuCi0gICAgICogQHBhcmFtIGNxbFBhZ2VSb3dTaXplCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0Q1FMUGFnZVJvd1NpemUoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgY3FsUGFnZVJvd1NpemUpCi0gICAgewotICAgICAgICBpZiAoY3FsUGFnZVJvd1NpemUgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJjcWwgcGFnZSByb3cgc2l6ZSBtYXkgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbmYuc2V0KElOUFVUX0NRTF9QQUdFX1JPV19TSVpFX0NPTkZJRywgY3FsUGFnZVJvd1NpemUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgQ1FMIHVzZXIgZGVmaW5lZCB3aGVyZSBjbGF1c2VzIGZvciB0aGUgaW5wdXQgb2YgdGhpcyBqb2IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZiBKb2IgY29uZmlndXJhdGlvbiB5b3UgYXJlIGFib3V0IHRvIHJ1bgotICAgICAqIEBwYXJhbSBjbGF1c2VzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0V2hlcmVDbGF1c2VzKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGNsYXVzZXMpCi0gICAgewotICAgICAgICBpZiAoY2xhdXNlcyA9PSBudWxsIHx8IGNsYXVzZXMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGNvbmYuc2V0KElOUFVUX0NRTF9XSEVSRV9DTEFVU0VfQ09ORklHLCBjbGF1c2VzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIENRTCBwcmVwYXJlZCBzdGF0ZW1lbnQgZm9yIHRoZSBvdXRwdXQgb2YgdGhpcyBqb2IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29uZiBKb2IgY29uZmlndXJhdGlvbiB5b3UgYXJlIGFib3V0IHRvIHJ1bgotICAgICAqIEBwYXJhbSBjcWwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0T3V0cHV0Q3FsKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGNxbCkKLSAgICB7Ci0gICAgICAgIGlmIChjcWwgPT0gbnVsbCB8fCBjcWwuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGNvbmYuc2V0KE9VVFBVVF9DUUwsIGNxbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0Q3FsKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGNxbCkKLSAgICB7Ci0gICAgICAgIGlmIChjcWwgPT0gbnVsbCB8fCBjcWwuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGNvbmYuc2V0KElOUFVUX0NRTCwgY3FsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXNlck5hbWVBbmRQYXNzd29yZChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKQotICAgIHsKLSAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90QmxhbmsodXNlcm5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25mLnNldChJTlBVVF9OQVRJVkVfQVVUSF9QUk9WSURFUiwgUGxhaW5UZXh0QXV0aFByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBjb25mLnNldChVU0VSTkFNRSwgdXNlcm5hbWUpOwotICAgICAgICAgICAgY29uZi5zZXQoUEFTU1dPUkQsIHBhc3N3b3JkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8SW50ZWdlcj4gZ2V0SW5wdXRDb3JlQ29ubmVjdGlvbnMoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEludFNldHRpbmcoSU5QVVRfTkFUSVZFX0NPUkVfQ09OTkVDVElPTlNfUEVSX0hPU1QsIGNvbmYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8SW50ZWdlcj4gZ2V0SW5wdXRNYXhDb25uZWN0aW9ucyhDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0SW50U2V0dGluZyhJTlBVVF9OQVRJVkVfTUFYX0NPTk5FQ1RJT05TX1BFUl9IT1NULCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRJbnB1dE5hdGl2ZVBvcnQoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoY29uZi5nZXQoSU5QVVRfTkFUSVZFX1BPUlQsICI5MDQyIikpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldE91dHB1dE5hdGl2ZVBvcnQoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoY29uZi5nZXQoT1VUUFVUX05BVElWRV9QT1JULCAiOTA0MiIpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPEludGVnZXI+IGdldElucHV0TWF4U2ltdWx0UmVxUGVyQ29ubmVjdGlvbnMoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEludFNldHRpbmcoSU5QVVRfTkFUSVZFX01BWF9TSU1VTFRfUkVRX1BFUl9DT05ORUNUSU9OLCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPEludGVnZXI+IGdldElucHV0TmF0aXZlQ29ubmVjdGlvblRpbWVvdXQoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEludFNldHRpbmcoSU5QVVRfTkFUSVZFX0NPTk5FQ1RJT05fVElNRU9VVCwgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxJbnRlZ2VyPiBnZXRJbnB1dE5hdGl2ZVJlYWRDb25uZWN0aW9uVGltZW91dChDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0SW50U2V0dGluZyhJTlBVVF9OQVRJVkVfUkVBRF9DT05ORUNUSU9OX1RJTUVPVVQsIGNvbmYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8SW50ZWdlcj4gZ2V0SW5wdXROYXRpdmVSZWNlaXZlQnVmZmVyU2l6ZShDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0SW50U2V0dGluZyhJTlBVVF9OQVRJVkVfUkVDRUlWRV9CVUZGRVJfU0laRSwgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxJbnRlZ2VyPiBnZXRJbnB1dE5hdGl2ZVNlbmRCdWZmZXJTaXplKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRJbnRTZXR0aW5nKElOUFVUX05BVElWRV9TRU5EX0JVRkZFUl9TSVpFLCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPEludGVnZXI+IGdldElucHV0TmF0aXZlU29saW5nZXIoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEludFNldHRpbmcoSU5QVVRfTkFUSVZFX1NPTElOR0VSLCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPEJvb2xlYW4+IGdldElucHV0TmF0aXZlVGNwTm9kZWxheShDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblNldHRpbmcoSU5QVVRfTkFUSVZFX1RDUF9OT0RFTEFZLCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPEJvb2xlYW4+IGdldElucHV0TmF0aXZlUmV1c2VBZGRyZXNzKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRCb29sZWFuU2V0dGluZyhJTlBVVF9OQVRJVkVfUkVVU0VfQUREUkVTUywgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxTdHJpbmc+IGdldElucHV0TmF0aXZlQXV0aFByb3ZpZGVyKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmdTZXR0aW5nKElOUFVUX05BVElWRV9BVVRIX1BST1ZJREVSLCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFN0cmluZz4gZ2V0SW5wdXROYXRpdmVTU0xUcnVzdHN0b3JlUGF0aChDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nU2V0dGluZyhJTlBVVF9OQVRJVkVfU1NMX1RSVVNUX1NUT1JFX1BBVEgsIGNvbmYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8U3RyaW5nPiBnZXRJbnB1dE5hdGl2ZVNTTEtleXN0b3JlUGF0aChDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0U3RyaW5nU2V0dGluZyhJTlBVVF9OQVRJVkVfU1NMX0tFWV9TVE9SRV9QQVRILCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFN0cmluZz4gZ2V0SW5wdXROYXRpdmVTU0xLZXlzdG9yZVBhc3N3b3JkKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmdTZXR0aW5nKElOUFVUX05BVElWRV9TU0xfS0VZX1NUT1JFX1BBU1NXQVJELCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPFN0cmluZz4gZ2V0SW5wdXROYXRpdmVTU0xUcnVzdHN0b3JlUGFzc3dvcmQoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFN0cmluZ1NldHRpbmcoSU5QVVRfTkFUSVZFX1NTTF9UUlVTVF9TVE9SRV9QQVNTV0FSRCwgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxTdHJpbmc+IGdldElucHV0TmF0aXZlU1NMQ2lwaGVyU3VpdGVzKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRTdHJpbmdTZXR0aW5nKElOUFVUX05BVElWRV9TU0xfQ0lQSEVSX1NVSVRFUywgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxCb29sZWFuPiBnZXRJbnB1dE5hdGl2ZUtlZXBBbGl2ZShDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhblNldHRpbmcoSU5QVVRfTkFUSVZFX0tFRVBfQUxJVkUsIGNvbmYpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElucHV0Y29sdW1ucyhDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gY29uZi5nZXQoSU5QVVRfQ1FMX0NPTFVNTlNfQ09ORklHKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9wdGlvbmFsPEludGVnZXI+IGdldElucHV0UGFnZVJvd1NpemUoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEludFNldHRpbmcoSU5QVVRfQ1FMX1BBR0VfUk9XX1NJWkVfQ09ORklHLCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbnB1dFdoZXJlQ2xhdXNlcyhDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gY29uZi5nZXQoSU5QVVRfQ1FMX1dIRVJFX0NMQVVTRV9DT05GSUcpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElucHV0Q3FsKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBjb25mLmdldChJTlBVVF9DUUwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE91dHB1dENxbChDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICByZXR1cm4gY29uZi5nZXQoT1VUUFVUX0NRTCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT3B0aW9uYWw8SW50ZWdlcj4gZ2V0UHJvdG9jb2xWZXJzaW9uKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRJbnRTZXR0aW5nKElOUFVUX05BVElWRV9QUk9UT0NPTF9WRVJTSU9OLCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENsdXN0ZXIgZ2V0SW5wdXRDbHVzdGVyKFN0cmluZyBob3N0LCBDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICAvLyB0aGlzIG1ldGhvZCBoYXMgYmVlbiBsZWZ0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIHJldHVybiBnZXRJbnB1dENsdXN0ZXIobmV3IFN0cmluZ1tdIHtob3N0fSwgY29uZik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbHVzdGVyIGdldElucHV0Q2x1c3RlcihTdHJpbmdbXSBob3N0cywgQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgaW50IHBvcnQgPSBnZXRJbnB1dE5hdGl2ZVBvcnQoY29uZik7Ci0gICAgICAgIHJldHVybiBnZXRDbHVzdGVyKGhvc3RzLCBjb25mLCBwb3J0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENsdXN0ZXIgZ2V0T3V0cHV0Q2x1c3RlcihTdHJpbmcgaG9zdCwgQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE91dHB1dENsdXN0ZXIobmV3IFN0cmluZ1tde2hvc3R9LCBjb25mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENsdXN0ZXIgZ2V0T3V0cHV0Q2x1c3RlcihTdHJpbmdbXSBob3N0cywgQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgaW50IHBvcnQgPSBnZXRPdXRwdXROYXRpdmVQb3J0KGNvbmYpOwotICAgICAgICByZXR1cm4gZ2V0Q2x1c3Rlcihob3N0cywgY29uZiwgcG9ydCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBDbHVzdGVyIGdldENsdXN0ZXIoU3RyaW5nW10gaG9zdHMsIENvbmZpZ3VyYXRpb24gY29uZiwgaW50IHBvcnQpCi0gICAgewotICAgICAgICBPcHRpb25hbDxBdXRoUHJvdmlkZXI+IGF1dGhQcm92aWRlciA9IGdldEF1dGhQcm92aWRlcihjb25mKTsKLSAgICAgICAgT3B0aW9uYWw8U1NMT3B0aW9ucz4gc3NsT3B0aW9ucyA9IGdldFNTTE9wdGlvbnMoY29uZik7Ci0gICAgICAgIE9wdGlvbmFsPEludGVnZXI+IHByb3RvY29sVmVyc2lvbiA9IGdldFByb3RvY29sVmVyc2lvbihjb25mKTsKLSAgICAgICAgTG9hZEJhbGFuY2luZ1BvbGljeSBsb2FkQmFsYW5jaW5nUG9saWN5ID0gZ2V0UmVhZExvYWRCYWxhbmNpbmdQb2xpY3koaG9zdHMpOwotICAgICAgICBTb2NrZXRPcHRpb25zIHNvY2tldE9wdGlvbnMgPSBnZXRSZWFkU29ja2V0T3B0aW9ucyhjb25mKTsKLSAgICAgICAgUXVlcnlPcHRpb25zIHF1ZXJ5T3B0aW9ucyA9IGdldFJlYWRRdWVyeU9wdGlvbnMoY29uZik7Ci0gICAgICAgIFBvb2xpbmdPcHRpb25zIHBvb2xpbmdPcHRpb25zID0gZ2V0UmVhZFBvb2xpbmdPcHRpb25zKGNvbmYpOwotCi0gICAgICAgIENsdXN0ZXIuQnVpbGRlciBidWlsZGVyID0gQ2x1c3Rlci5idWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuYWRkQ29udGFjdFBvaW50cyhob3N0cykKLSAgICAgICAgICAgICAgICAud2l0aFBvcnQocG9ydCkKLSAgICAgICAgICAgICAgICAud2l0aENvbXByZXNzaW9uKFByb3RvY29sT3B0aW9ucy5Db21wcmVzc2lvbi5OT05FKTsKLQotICAgICAgICBpZiAoYXV0aFByb3ZpZGVyLmlzUHJlc2VudCgpKQotICAgICAgICAgICAgYnVpbGRlci53aXRoQXV0aFByb3ZpZGVyKGF1dGhQcm92aWRlci5nZXQoKSk7Ci0gICAgICAgIGlmIChzc2xPcHRpb25zLmlzUHJlc2VudCgpKQotICAgICAgICAgICAgYnVpbGRlci53aXRoU1NMKHNzbE9wdGlvbnMuZ2V0KCkpOwotCi0gICAgICAgIGlmIChwcm90b2NvbFZlcnNpb24uaXNQcmVzZW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ1aWxkZXIud2l0aFByb3RvY29sVmVyc2lvbihQcm90b2NvbFZlcnNpb24uZnJvbUludChwcm90b2NvbFZlcnNpb24uZ2V0KCkpKTsKLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLndpdGhMb2FkQmFsYW5jaW5nUG9saWN5KGxvYWRCYWxhbmNpbmdQb2xpY3kpCi0gICAgICAgICAgICAgICAgLndpdGhTb2NrZXRPcHRpb25zKHNvY2tldE9wdGlvbnMpCi0gICAgICAgICAgICAgICAgLndpdGhRdWVyeU9wdGlvbnMocXVlcnlPcHRpb25zKQotICAgICAgICAgICAgICAgIC53aXRoUG9vbGluZ09wdGlvbnMocG9vbGluZ09wdGlvbnMpOwotCi0gICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0Q29yZUNvbm5lY3Rpb25zKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGNvbm5lY3Rpb25zKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfTkFUSVZFX0NPUkVfQ09OTkVDVElPTlNfUEVSX0hPU1QsIGNvbm5lY3Rpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXRNYXhDb25uZWN0aW9ucyhDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBjb25uZWN0aW9ucykKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9NQVhfQ09OTkVDVElPTlNfUEVSX0hPU1QsIGNvbm5lY3Rpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXRNYXhTaW11bHRSZXFQZXJDb25uZWN0aW9ucyhDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyByZXFzKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfTkFUSVZFX01BWF9TSU1VTFRfUkVRX1BFUl9DT05ORUNUSU9OLCByZXFzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXROYXRpdmVDb25uZWN0aW9uVGltZW91dChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyB0aW1lb3V0KQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfTkFUSVZFX0NPTk5FQ1RJT05fVElNRU9VVCwgdGltZW91dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0TmF0aXZlUmVhZENvbm5lY3Rpb25UaW1lb3V0KENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIHRpbWVvdXQpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9OQVRJVkVfUkVBRF9DT05ORUNUSU9OX1RJTUVPVVQsIHRpbWVvdXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dE5hdGl2ZVJlY2VpdmVCdWZmZXJTaXplKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIHNpemUpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9OQVRJVkVfUkVDRUlWRV9CVUZGRVJfU0laRSwgc2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0TmF0aXZlU2VuZEJ1ZmZlclNpemUoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgc2l6ZSkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9TRU5EX0JVRkZFUl9TSVpFLCBzaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXROYXRpdmVTb2xpbmdlcihDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBzb2xpbmdlcikKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9TT0xJTkdFUiwgc29saW5nZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dE5hdGl2ZVRjcE5vZGVsYXkoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgdGNwTm9kZWxheSkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9UQ1BfTk9ERUxBWSwgdGNwTm9kZWxheSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0TmF0aXZlQXV0aFByb3ZpZGVyKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGF1dGhQcm92aWRlcikKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9BVVRIX1BST1ZJREVSLCBhdXRoUHJvdmlkZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dE5hdGl2ZVNTTFRydXN0c3RvcmVQYXRoKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIHBhdGgpCi0gICAgewotICAgICAgICBjb25mLnNldChJTlBVVF9OQVRJVkVfU1NMX1RSVVNUX1NUT1JFX1BBVEgsIHBhdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dE5hdGl2ZVNTTEtleXN0b3JlUGF0aChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBwYXRoKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfTkFUSVZFX1NTTF9LRVlfU1RPUkVfUEFUSCwgcGF0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0TmF0aXZlU1NMS2V5c3RvcmVQYXNzd29yZChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBwYXNzKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfTkFUSVZFX1NTTF9LRVlfU1RPUkVfUEFTU1dBUkQsIHBhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dE5hdGl2ZVNTTFRydXN0c3RvcmVQYXNzd29yZChDb25maWd1cmF0aW9uIGNvbmYsIFN0cmluZyBwYXNzKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfTkFUSVZFX1NTTF9UUlVTVF9TVE9SRV9QQVNTV0FSRCwgcGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0TmF0aXZlU1NMQ2lwaGVyU3VpdGVzKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIHN1aXRlcykKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9TU0xfQ0lQSEVSX1NVSVRFUywgc3VpdGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW5wdXROYXRpdmVSZXVzZUFkZHJlc3MoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgcmV1c2VBZGRyZXNzKQotICAgIHsKLSAgICAgICAgY29uZi5zZXQoSU5QVVRfTkFUSVZFX1JFVVNFX0FERFJFU1MsIHJldXNlQWRkcmVzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldElucHV0TmF0aXZlS2VlcEFsaXZlKENvbmZpZ3VyYXRpb24gY29uZiwgU3RyaW5nIGtlZXBBbGl2ZSkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9LRUVQX0FMSVZFLCBrZWVwQWxpdmUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnB1dE5hdGl2ZVBvcnQoQ29uZmlndXJhdGlvbiBjb25mLCBTdHJpbmcgcG9ydCkKLSAgICB7Ci0gICAgICAgIGNvbmYuc2V0KElOUFVUX05BVElWRV9QT1JULCBwb3J0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBQb29saW5nT3B0aW9ucyBnZXRSZWFkUG9vbGluZ09wdGlvbnMoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgT3B0aW9uYWw8SW50ZWdlcj4gY29yZUNvbm5lY3Rpb25zID0gZ2V0SW5wdXRDb3JlQ29ubmVjdGlvbnMoY29uZik7Ci0gICAgICAgIE9wdGlvbmFsPEludGVnZXI+IG1heENvbm5lY3Rpb25zID0gZ2V0SW5wdXRNYXhDb25uZWN0aW9ucyhjb25mKTsKLSAgICAgICAgT3B0aW9uYWw8SW50ZWdlcj4gbWF4U2ltdWx0YW5lb3VzUmVxdWVzdHMgPSBnZXRJbnB1dE1heFNpbXVsdFJlcVBlckNvbm5lY3Rpb25zKGNvbmYpOwotCi0gICAgICAgIFBvb2xpbmdPcHRpb25zIHBvb2xpbmdPcHRpb25zID0gbmV3IFBvb2xpbmdPcHRpb25zKCk7Ci0KLSAgICAgICAgZm9yIChIb3N0RGlzdGFuY2UgaG9zdERpc3RhbmNlIDogQXJyYXlzLmFzTGlzdChIb3N0RGlzdGFuY2UuTE9DQUwsIEhvc3REaXN0YW5jZS5SRU1PVEUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29yZUNvbm5lY3Rpb25zLmlzUHJlc2VudCgpKQotICAgICAgICAgICAgICAgIHBvb2xpbmdPcHRpb25zLnNldENvcmVDb25uZWN0aW9uc1Blckhvc3QoaG9zdERpc3RhbmNlLCBjb3JlQ29ubmVjdGlvbnMuZ2V0KCkpOwotICAgICAgICAgICAgaWYgKG1heENvbm5lY3Rpb25zLmlzUHJlc2VudCgpKQotICAgICAgICAgICAgICAgIHBvb2xpbmdPcHRpb25zLnNldE1heENvbm5lY3Rpb25zUGVySG9zdChob3N0RGlzdGFuY2UsIG1heENvbm5lY3Rpb25zLmdldCgpKTsKLSAgICAgICAgICAgIGlmIChtYXhTaW11bHRhbmVvdXNSZXF1ZXN0cy5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgICAgICBwb29saW5nT3B0aW9ucy5zZXROZXdDb25uZWN0aW9uVGhyZXNob2xkKGhvc3REaXN0YW5jZSwgbWF4U2ltdWx0YW5lb3VzUmVxdWVzdHMuZ2V0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHBvb2xpbmdPcHRpb25zOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFF1ZXJ5T3B0aW9ucyBnZXRSZWFkUXVlcnlPcHRpb25zKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIFN0cmluZyBDTCA9IENvbmZpZ0hlbHBlci5nZXRSZWFkQ29uc2lzdGVuY3lMZXZlbChjb25mKTsKLSAgICAgICAgT3B0aW9uYWw8SW50ZWdlcj4gZmV0Y2hTaXplID0gZ2V0SW5wdXRQYWdlUm93U2l6ZShjb25mKTsKLSAgICAgICAgUXVlcnlPcHRpb25zIHF1ZXJ5T3B0aW9ucyA9IG5ldyBRdWVyeU9wdGlvbnMoKTsKLSAgICAgICAgaWYgKENMICE9IG51bGwgJiYgIUNMLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHF1ZXJ5T3B0aW9ucy5zZXRDb25zaXN0ZW5jeUxldmVsKGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Db25zaXN0ZW5jeUxldmVsLnZhbHVlT2YoQ0wpKTsKLQotICAgICAgICBpZiAoZmV0Y2hTaXplLmlzUHJlc2VudCgpKQotICAgICAgICAgICAgcXVlcnlPcHRpb25zLnNldEZldGNoU2l6ZShmZXRjaFNpemUuZ2V0KCkpOwotICAgICAgICByZXR1cm4gcXVlcnlPcHRpb25zOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFNvY2tldE9wdGlvbnMgZ2V0UmVhZFNvY2tldE9wdGlvbnMoQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgU29ja2V0T3B0aW9ucyBzb2NrZXRPcHRpb25zID0gbmV3IFNvY2tldE9wdGlvbnMoKTsKLSAgICAgICAgT3B0aW9uYWw8SW50ZWdlcj4gY29ubmVjdFRpbWVvdXRNaWxsaXMgPSBnZXRJbnB1dE5hdGl2ZUNvbm5lY3Rpb25UaW1lb3V0KGNvbmYpOwotICAgICAgICBPcHRpb25hbDxJbnRlZ2VyPiByZWFkVGltZW91dE1pbGxpcyA9IGdldElucHV0TmF0aXZlUmVhZENvbm5lY3Rpb25UaW1lb3V0KGNvbmYpOwotICAgICAgICBPcHRpb25hbDxJbnRlZ2VyPiByZWNlaXZlQnVmZmVyU2l6ZSA9IGdldElucHV0TmF0aXZlUmVjZWl2ZUJ1ZmZlclNpemUoY29uZik7Ci0gICAgICAgIE9wdGlvbmFsPEludGVnZXI+IHNlbmRCdWZmZXJTaXplID0gZ2V0SW5wdXROYXRpdmVTZW5kQnVmZmVyU2l6ZShjb25mKTsKLSAgICAgICAgT3B0aW9uYWw8SW50ZWdlcj4gc29MaW5nZXIgPSBnZXRJbnB1dE5hdGl2ZVNvbGluZ2VyKGNvbmYpOwotICAgICAgICBPcHRpb25hbDxCb29sZWFuPiB0Y3BOb0RlbGF5ID0gZ2V0SW5wdXROYXRpdmVUY3BOb2RlbGF5KGNvbmYpOwotICAgICAgICBPcHRpb25hbDxCb29sZWFuPiByZXVzZUFkZHJlc3MgPSBnZXRJbnB1dE5hdGl2ZVJldXNlQWRkcmVzcyhjb25mKTsKLSAgICAgICAgT3B0aW9uYWw8Qm9vbGVhbj4ga2VlcEFsaXZlID0gZ2V0SW5wdXROYXRpdmVLZWVwQWxpdmUoY29uZik7Ci0KLSAgICAgICAgaWYgKGNvbm5lY3RUaW1lb3V0TWlsbGlzLmlzUHJlc2VudCgpKQotICAgICAgICAgICAgc29ja2V0T3B0aW9ucy5zZXRDb25uZWN0VGltZW91dE1pbGxpcyhjb25uZWN0VGltZW91dE1pbGxpcy5nZXQoKSk7Ci0gICAgICAgIGlmIChyZWFkVGltZW91dE1pbGxpcy5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgIHNvY2tldE9wdGlvbnMuc2V0UmVhZFRpbWVvdXRNaWxsaXMocmVhZFRpbWVvdXRNaWxsaXMuZ2V0KCkpOwotICAgICAgICBpZiAocmVjZWl2ZUJ1ZmZlclNpemUuaXNQcmVzZW50KCkpCi0gICAgICAgICAgICBzb2NrZXRPcHRpb25zLnNldFJlY2VpdmVCdWZmZXJTaXplKHJlY2VpdmVCdWZmZXJTaXplLmdldCgpKTsKLSAgICAgICAgaWYgKHNlbmRCdWZmZXJTaXplLmlzUHJlc2VudCgpKQotICAgICAgICAgICAgc29ja2V0T3B0aW9ucy5zZXRTZW5kQnVmZmVyU2l6ZShzZW5kQnVmZmVyU2l6ZS5nZXQoKSk7Ci0gICAgICAgIGlmIChzb0xpbmdlci5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgIHNvY2tldE9wdGlvbnMuc2V0U29MaW5nZXIoc29MaW5nZXIuZ2V0KCkpOwotICAgICAgICBpZiAodGNwTm9EZWxheS5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgIHNvY2tldE9wdGlvbnMuc2V0VGNwTm9EZWxheSh0Y3BOb0RlbGF5LmdldCgpKTsKLSAgICAgICAgaWYgKHJldXNlQWRkcmVzcy5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgIHNvY2tldE9wdGlvbnMuc2V0UmV1c2VBZGRyZXNzKHJldXNlQWRkcmVzcy5nZXQoKSk7Ci0gICAgICAgIGlmIChrZWVwQWxpdmUuaXNQcmVzZW50KCkpCi0gICAgICAgICAgICBzb2NrZXRPcHRpb25zLnNldEtlZXBBbGl2ZShrZWVwQWxpdmUuZ2V0KCkpOwotCi0gICAgICAgIHJldHVybiBzb2NrZXRPcHRpb25zOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExvYWRCYWxhbmNpbmdQb2xpY3kgZ2V0UmVhZExvYWRCYWxhbmNpbmdQb2xpY3koZmluYWwgU3RyaW5nW10gc3RpY2tIb3N0cykKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgTGltaXRlZExvY2FsTm9kZUZpcnN0TG9jYWxCYWxhbmNpbmdQb2xpY3koc3RpY2tIb3N0cyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT3B0aW9uYWw8QXV0aFByb3ZpZGVyPiBnZXREZWZhdWx0QXV0aFByb3ZpZGVyKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIE9wdGlvbmFsPFN0cmluZz4gdXNlcm5hbWUgPSBnZXRTdHJpbmdTZXR0aW5nKFVTRVJOQU1FLCBjb25mKTsKLSAgICAgICAgT3B0aW9uYWw8U3RyaW5nPiBwYXNzd29yZCA9IGdldFN0cmluZ1NldHRpbmcoUEFTU1dPUkQsIGNvbmYpOwotCi0gICAgICAgIGlmICh1c2VybmFtZS5pc1ByZXNlbnQoKSAmJiBwYXNzd29yZC5pc1ByZXNlbnQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKG5ldyBQbGFpblRleHRBdXRoUHJvdmlkZXIodXNlcm5hbWUuZ2V0KCksIHBhc3N3b3JkLmdldCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuYWJzZW50KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBPcHRpb25hbDxBdXRoUHJvdmlkZXI+IGdldEF1dGhQcm92aWRlcihDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICBPcHRpb25hbDxTdHJpbmc+IGF1dGhQcm92aWRlciA9IGdldElucHV0TmF0aXZlQXV0aFByb3ZpZGVyKGNvbmYpOwotICAgICAgICBpZiAoIWF1dGhQcm92aWRlci5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0QXV0aFByb3ZpZGVyKGNvbmYpOwotCi0gICAgICAgIHJldHVybiBPcHRpb25hbC5vZihnZXRDbGllbnRBdXRoUHJvdmlkZXIoYXV0aFByb3ZpZGVyLmdldCgpLCBjb25mKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPcHRpb25hbDxTU0xPcHRpb25zPiBnZXRTU0xPcHRpb25zKENvbmZpZ3VyYXRpb24gY29uZikKLSAgICB7Ci0gICAgICAgIE9wdGlvbmFsPFN0cmluZz4gdHJ1c3RzdG9yZVBhdGggPSBnZXRJbnB1dE5hdGl2ZVNTTFRydXN0c3RvcmVQYXRoKGNvbmYpOwotCi0gICAgICAgIGlmICh0cnVzdHN0b3JlUGF0aC5pc1ByZXNlbnQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgT3B0aW9uYWw8U3RyaW5nPiBrZXlzdG9yZVBhdGggPSBnZXRJbnB1dE5hdGl2ZVNTTEtleXN0b3JlUGF0aChjb25mKTsKLSAgICAgICAgICAgIE9wdGlvbmFsPFN0cmluZz4gdHJ1c3RzdG9yZVBhc3N3b3JkID0gZ2V0SW5wdXROYXRpdmVTU0xUcnVzdHN0b3JlUGFzc3dvcmQoY29uZik7Ci0gICAgICAgICAgICBPcHRpb25hbDxTdHJpbmc+IGtleXN0b3JlUGFzc3dvcmQgPSBnZXRJbnB1dE5hdGl2ZVNTTEtleXN0b3JlUGFzc3dvcmQoY29uZik7Ci0gICAgICAgICAgICBPcHRpb25hbDxTdHJpbmc+IGNpcGhlclN1aXRlcyA9IGdldElucHV0TmF0aXZlU1NMQ2lwaGVyU3VpdGVzKGNvbmYpOwotCi0gICAgICAgICAgICBTU0xDb250ZXh0IGNvbnRleHQ7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0ID0gZ2V0U1NMQ29udGV4dCh0cnVzdHN0b3JlUGF0aCwgdHJ1c3RzdG9yZVBhc3N3b3JkLCBrZXlzdG9yZVBhdGgsIGtleXN0b3JlUGFzc3dvcmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24gfCBLZXlNYW5hZ2VtZW50RXhjZXB0aW9uIHwKLSAgICAgICAgICAgICAgICAgICAgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHwgS2V5U3RvcmVFeGNlcHRpb24gfCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmdbXSBjc3MgPSBudWxsOwotICAgICAgICAgICAgaWYgKGNpcGhlclN1aXRlcy5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgICAgICBjc3MgPSBjaXBoZXJTdWl0ZXMuZ2V0KCkuc3BsaXQoIiwiKTsKLSAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihKZGtTU0xPcHRpb25zLmJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTTENvbnRleHQoY29udGV4dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDaXBoZXJTdWl0ZXMoY3NzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmFic2VudCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE9wdGlvbmFsPEludGVnZXI+IGdldEludFNldHRpbmcoU3RyaW5nIHBhcmFtZXRlciwgQ29uZmlndXJhdGlvbiBjb25mKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHNldHRpbmcgPSBjb25mLmdldChwYXJhbWV0ZXIpOwotICAgICAgICBpZiAoc2V0dGluZyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmFic2VudCgpOwotICAgICAgICByZXR1cm4gT3B0aW9uYWwub2YoSW50ZWdlci52YWx1ZU9mKHNldHRpbmcpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBPcHRpb25hbDxCb29sZWFuPiBnZXRCb29sZWFuU2V0dGluZyhTdHJpbmcgcGFyYW1ldGVyLCBDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICBTdHJpbmcgc2V0dGluZyA9IGNvbmYuZ2V0KHBhcmFtZXRlcik7Ci0gICAgICAgIGlmIChzZXR0aW5nID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuYWJzZW50KCk7Ci0gICAgICAgIHJldHVybiBPcHRpb25hbC5vZihCb29sZWFuLnZhbHVlT2Yoc2V0dGluZykpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE9wdGlvbmFsPFN0cmluZz4gZ2V0U3RyaW5nU2V0dGluZyhTdHJpbmcgcGFyYW1ldGVyLCBDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICBTdHJpbmcgc2V0dGluZyA9IGNvbmYuZ2V0KHBhcmFtZXRlcik7Ci0gICAgICAgIGlmIChzZXR0aW5nID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gT3B0aW9uYWwuYWJzZW50KCk7Ci0gICAgICAgIHJldHVybiBPcHRpb25hbC5vZihzZXR0aW5nKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBBdXRoUHJvdmlkZXIgZ2V0Q2xpZW50QXV0aFByb3ZpZGVyKFN0cmluZyBmYWN0b3J5Q2xhc3NOYW1lLCBDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ2xhc3M8Pz4gYyA9IENsYXNzLmZvck5hbWUoZmFjdG9yeUNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAoUGxhaW5UZXh0QXV0aFByb3ZpZGVyLmNsYXNzLmVxdWFscyhjKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBnZXRTdHJpbmdTZXR0aW5nKFVTRVJOQU1FLCBjb25mKS5vcigiIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhc3N3b3JkID0gZ2V0U3RyaW5nU2V0dGluZyhQQVNTV09SRCwgY29uZikub3IoIiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAoQXV0aFByb3ZpZGVyKSBjLmdldENvbnN0cnVjdG9yKFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKHVzZXJuYW1lLCBwYXNzd29yZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChBdXRoUHJvdmlkZXIpIGMubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gaW5zdGFudGlhdGUgYXV0aCBwcm92aWRlcjoiICsgZmFjdG9yeUNsYXNzTmFtZSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTU0xDb250ZXh0IGdldFNTTENvbnRleHQoT3B0aW9uYWw8U3RyaW5nPiB0cnVzdHN0b3JlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8U3RyaW5nPiB0cnVzdHN0b3JlUGFzc3dvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPFN0cmluZz4ga2V5c3RvcmVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxTdHJpbmc+IGtleXN0b3JlUGFzc3dvcmQpCi0gICAgdGhyb3dzIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKLSAgICAgICAgICAgS2V5U3RvcmVFeGNlcHRpb24sCi0gICAgICAgICAgIENlcnRpZmljYXRlRXhjZXB0aW9uLAotICAgICAgICAgICBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbiwKLSAgICAgICAgICAgS2V5TWFuYWdlbWVudEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU1NMQ29udGV4dCBjdHggPSBTU0xDb250ZXh0LmdldEluc3RhbmNlKCJTU0wiKTsKLQotICAgICAgICBUcnVzdE1hbmFnZXJGYWN0b3J5IHRtZiA9IG51bGw7Ci0gICAgICAgIGlmICh0cnVzdHN0b3JlUGF0aC5pc1ByZXNlbnQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSB0c2YgPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShGaWxlLmdldFBhdGgodHJ1c3RzdG9yZVBhdGguZ2V0KCkpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBLZXlTdG9yZSB0cyA9IEtleVN0b3JlLmdldEluc3RhbmNlKCJKS1MiKTsKLSAgICAgICAgICAgICAgICB0cy5sb2FkKHRzZiwgdHJ1c3RzdG9yZVBhc3N3b3JkLmlzUHJlc2VudCgpID8gdHJ1c3RzdG9yZVBhc3N3b3JkLmdldCgpLnRvQ2hhckFycmF5KCkgOiBudWxsKTsKLSAgICAgICAgICAgICAgICB0bWYgPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpKTsKLSAgICAgICAgICAgICAgICB0bWYuaW5pdCh0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBLZXlNYW5hZ2VyRmFjdG9yeSBrbWYgPSBudWxsOwotICAgICAgICBpZiAoa2V5c3RvcmVQYXRoLmlzUHJlc2VudCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGtzZiA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKEZpbGUuZ2V0UGF0aChrZXlzdG9yZVBhdGguZ2V0KCkpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBLZXlTdG9yZSBrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKCJKS1MiKTsKLSAgICAgICAgICAgICAgICBrcy5sb2FkKGtzZiwga2V5c3RvcmVQYXNzd29yZC5pc1ByZXNlbnQoKSA/IGtleXN0b3JlUGFzc3dvcmQuZ2V0KCkudG9DaGFyQXJyYXkoKSA6IG51bGwpOwotICAgICAgICAgICAgICAgIGttZiA9IEtleU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKEtleU1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKSk7Ci0gICAgICAgICAgICAgICAga21mLmluaXQoa3MsIGtleXN0b3JlUGFzc3dvcmQuaXNQcmVzZW50KCkgPyBrZXlzdG9yZVBhc3N3b3JkLmdldCgpLnRvQ2hhckFycmF5KCkgOiBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGN0eC5pbml0KGttZiAhPSBudWxsID8ga21mLmdldEtleU1hbmFnZXJzKCkgOiBudWxsLAotICAgICAgICAgICAgICAgICB0bWYgIT0gbnVsbCA/IHRtZi5nZXRUcnVzdE1hbmFnZXJzKCkgOiBudWxsLAotICAgICAgICAgICAgICAgICBuZXcgU2VjdXJlUmFuZG9tKCkpOwotICAgICAgICByZXR1cm4gY3R4OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbElucHV0Rm9ybWF0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxJbnB1dEZvcm1hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzU1Njg0Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbElucHV0Rm9ybWF0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLmNxbDM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7Ci0KLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ2x1c3RlcjsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuSG9zdDsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuTWV0YWRhdGE7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJlc3VsdFNldDsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuUm93OwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TZXNzaW9uOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TaW1wbGVTdGF0ZW1lbnQ7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlN0YXRlbWVudDsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuVG9rZW5SYW5nZTsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk1hcHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKLQotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5leGNlcHRpb25zLkludmFsaWRRdWVyeUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmNvbmYuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuSW5wdXRTcGxpdDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuSm9iQ29uZjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuUmVjb3JkUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5SZXBvcnRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSm9iQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuVGFza0F0dGVtcHRDb250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5UYXNrQXR0ZW1wdElEOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU3lzdGVtS2V5c3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuKjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yRmFjdG9yeS5HbG9iYWwuZXhlY3V0b3JGYWN0b3J5OwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7Ci0KLS8qKgotICogSGFkb29wIElucHV0Rm9ybWF0IGFsbG93aW5nIG1hcC9yZWR1Y2UgYWdhaW5zdCBDYXNzYW5kcmEgcm93cyB3aXRoaW4gb25lIENvbHVtbkZhbWlseS4KLSAqCi0gKiBBdCBtaW5pbXVtLCB5b3UgbmVlZCB0byBzZXQgdGhlIEtTIGFuZCBDRiBpbiB5b3VyIEhhZG9vcCBqb2IgQ29uZmlndXJhdGlvbi4KLSAqIFRoZSBDb25maWdIZWxwZXIgY2xhc3MgaXMgcHJvdmlkZWQgdG8gbWFrZSB0aGlzCi0gKiBzaW1wbGU6Ci0gKiAgIENvbmZpZ0hlbHBlci5zZXRJbnB1dENvbHVtbkZhbWlseQotICoKLSAqIFlvdSBjYW4gYWxzbyBjb25maWd1cmUgdGhlIG51bWJlciBvZiByb3dzIHBlciBJbnB1dFNwbGl0IHdpdGgKLSAqICAgMTogQ29uZmlnSGVscGVyLnNldElucHV0U3BsaXRTaXplLiBUaGUgZGVmYXVsdCBzcGxpdCBzaXplIGlzIDY0ayByb3dzLgotICogICBvcgotICogICAyOiBDb25maWdIZWxwZXIuc2V0SW5wdXRTcGxpdFNpemVJbk1iLiBJbnB1dFNwbGl0IHNpemUgaW4gTUIgd2l0aCBuZXcsIG1vcmUgcHJlY2lzZSBtZXRob2QKLSAqICAgSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQgZm9yIElucHV0U3BsaXRTaXplSW5NYiwgd2UgZGVmYXVsdCB0byB1c2luZyBJbnB1dFNwbGl0U2l6ZS4KLSAqCi0gKiAgIENRTENvbmZpZ0hlbHBlci5zZXRJbnB1dENRTFBhZ2VSb3dTaXplLiBUaGUgZGVmYXVsdCBwYWdlIHJvdyBzaXplIGlzIDEwMDAuIFlvdQotICogICBzaG91bGQgc2V0IGl0IHRvICJhcyBiaWcgYXMgcG9zc2libGUsIGJ1dCBubyBiaWdnZXIuIiBJdCBzZXQgdGhlIExJTUlUIGZvciB0aGUgQ1FMCi0gKiAgIHF1ZXJ5LCBzbyB5b3UgbmVlZCBzZXQgaXQgYmlnIGVub3VnaCB0byBtaW5pbWl6ZSB0aGUgbmV0d29yayBvdmVyaGVhZCwgYW5kIGFsc28KLSAqICAgbm90IHRvbyBiaWcgdG8gYXZvaWQgb3V0IG9mIG1lbW9yeSBpc3N1ZS4KLSAqCi0gKiAgIG90aGVyIG5hdGl2ZSBwcm90b2NvbCBjb25uZWN0aW9uIHBhcmFtZXRlcnMgaW4gQ3FsQ29uZmlnSGVscGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBDcWxJbnB1dEZvcm1hdCBleHRlbmRzIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5JbnB1dEZvcm1hdDxMb25nLCBSb3c+IGltcGxlbWVudHMgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLklucHV0Rm9ybWF0PExvbmcsIFJvdz4KLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBSRURfVEFTS19JRCA9ICJtYXByZWQudGFzay5pZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENxbElucHV0Rm9ybWF0LmNsYXNzKTsKLSAgICBwcml2YXRlIFN0cmluZyBrZXlzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyBjZk5hbWU7Ci0gICAgcHJpdmF0ZSBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXI7Ci0KLSAgICBwdWJsaWMgUmVjb3JkUmVhZGVyPExvbmcsIFJvdz4gZ2V0UmVjb3JkUmVhZGVyKElucHV0U3BsaXQgc3BsaXQsIEpvYkNvbmYgam9iQ29uZiwgZmluYWwgUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFRhc2tBdHRlbXB0Q29udGV4dCB0YWMgPSBIYWRvb3BDb21wYXQubmV3TWFwQ29udGV4dCgKLSAgICAgICAgICAgICAgICBqb2JDb25mLAotICAgICAgICAgICAgICAgIFRhc2tBdHRlbXB0SUQuZm9yTmFtZShqb2JDb25mLmdldChNQVBSRURfVEFTS19JRCkpLAotICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgIG5ldyBSZXBvcnRlcldyYXBwZXIocmVwb3J0ZXIpLAotICAgICAgICAgICAgICAgIG51bGwpOwotCi0KLSAgICAgICAgQ3FsUmVjb3JkUmVhZGVyIHJlY29yZFJlYWRlciA9IG5ldyBDcWxSZWNvcmRSZWFkZXIoKTsKLSAgICAgICAgcmVjb3JkUmVhZGVyLmluaXRpYWxpemUoKG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5JbnB1dFNwbGl0KXNwbGl0LCB0YWMpOwotICAgICAgICByZXR1cm4gcmVjb3JkUmVhZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuUmVjb3JkUmVhZGVyPExvbmcsIFJvdz4gY3JlYXRlUmVjb3JkUmVhZGVyKAotICAgICAgICAgICAgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLklucHV0U3BsaXQgYXJnMCwgVGFza0F0dGVtcHRDb250ZXh0IGFyZzEpIHRocm93cyBJT0V4Y2VwdGlvbiwKLSAgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IENxbFJlY29yZFJlYWRlcigpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICBpZiAoQ29uZmlnSGVscGVyLmdldElucHV0S2V5c3BhY2UoY29uZikgPT0gbnVsbCB8fCBDb25maWdIZWxwZXIuZ2V0SW5wdXRDb2x1bW5GYW1pbHkoY29uZikgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJ5b3UgbXVzdCBzZXQgdGhlIGtleXNwYWNlIGFuZCB0YWJsZSB3aXRoIHNldElucHV0Q29sdW1uRmFtaWx5KCkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ29uZmlnSGVscGVyLmdldElucHV0SW5pdGlhbEFkZHJlc3MoY29uZikgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiWW91IG11c3Qgc2V0IHRoZSBpbml0aWFsIG91dHB1dCBhZGRyZXNzIHRvIGEgQ2Fzc2FuZHJhIG5vZGUgd2l0aCBzZXRJbnB1dEluaXRpYWxBZGRyZXNzIik7Ci0gICAgICAgIGlmIChDb25maWdIZWxwZXIuZ2V0SW5wdXRQYXJ0aXRpb25lcihjb25mKSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJZb3UgbXVzdCBzZXQgdGhlIENhc3NhbmRyYSBwYXJ0aXRpb25lciBjbGFzcyB3aXRoIHNldElucHV0UGFydGl0aW9uZXIiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSW5wdXRTcGxpdD4gZ2V0U3BsaXRzKEpvYkNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb25maWd1cmF0aW9uIGNvbmYgPSBIYWRvb3BDb21wYXQuZ2V0Q29uZmlndXJhdGlvbihjb250ZXh0KTsKLQotICAgICAgICB2YWxpZGF0ZUNvbmZpZ3VyYXRpb24oY29uZik7Ci0KLSAgICAgICAga2V5c3BhY2UgPSBDb25maWdIZWxwZXIuZ2V0SW5wdXRLZXlzcGFjZShjb25mKTsKLSAgICAgICAgY2ZOYW1lID0gQ29uZmlnSGVscGVyLmdldElucHV0Q29sdW1uRmFtaWx5KGNvbmYpOwotICAgICAgICBwYXJ0aXRpb25lciA9IENvbmZpZ0hlbHBlci5nZXRJbnB1dFBhcnRpdGlvbmVyKGNvbmYpOwotICAgICAgICBsb2dnZXIudHJhY2UoInBhcnRpdGlvbmVyIGlzIHt9IiwgcGFydGl0aW9uZXIpOwotCi0gICAgICAgIC8vIGNhbm9uaWNhbCByYW5nZXMsIHNwbGl0IGludG8gcGllY2VzLCBmZXRjaGluZyB0aGUgc3BsaXRzIGluIHBhcmFsbGVsCi0gICAgICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IGV4ZWN1dG9yRmFjdG9yeSgpLnBvb2xlZCgiSGFkb29wSW5wdXQiLCAxMjgpOwotICAgICAgICBMaXN0PG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5JbnB1dFNwbGl0PiBzcGxpdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICBTdHJpbmdbXSBpbnB1dEluaXRpYWxBZGRyZXNzID0gQ29uZmlnSGVscGVyLmdldElucHV0SW5pdGlhbEFkZHJlc3MoY29uZikuc3BsaXQoIiwiKTsKLSAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBDcWxDb25maWdIZWxwZXIuZ2V0SW5wdXRDbHVzdGVyKGlucHV0SW5pdGlhbEFkZHJlc3MsIGNvbmYpOwotICAgICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGNsdXN0ZXIuY29ubmVjdCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0PFNwbGl0RnV0dXJlPiBzcGxpdGZ1dHVyZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIC8vVE9ETyBpZiB0aGUgam9iIHJhbmdlIGlzIGRlZmluZWQgYW5kIGRvZXMgcGVyZmVjdGx5IG1hdGNoIHRva2VucywgdGhlbiB0aGUgbG9naWMgd2lsbCBiZSB1bmFibGUgdG8gZ2V0IGVzdGltYXRlcyBzaW5jZSB0aGV5IGFyZSBwcmUtY29tcHV0ZWQKLSAgICAgICAgICAgIC8vIHRva2VuczogWzAsIDEwLCAyMF0KLSAgICAgICAgICAgIC8vIGpvYiByYW5nZTogWzAsIDEwKSAtIGFibGUgdG8gZ2V0IGVzdGltYXRlCi0gICAgICAgICAgICAvLyBqb2IgcmFuZ2U6IFs1LCAxNSkgLSB1bmFibGUgdG8gZ2V0IGVzdGltYXRlCi0gICAgICAgICAgICBQYWlyPFN0cmluZywgU3RyaW5nPiBqb2JLZXlSYW5nZSA9IENvbmZpZ0hlbHBlci5nZXRJbnB1dEtleVJhbmdlKGNvbmYpOwotICAgICAgICAgICAgUmFuZ2U8VG9rZW4+IGpvYlJhbmdlID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChqb2JLZXlSYW5nZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGpvYlJhbmdlID0gbmV3IFJhbmdlPD4ocGFydGl0aW9uZXIuZ2V0VG9rZW5GYWN0b3J5KCkuZnJvbVN0cmluZyhqb2JLZXlSYW5nZS5sZWZ0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbmVyLmdldFRva2VuRmFjdG9yeSgpLmZyb21TdHJpbmcoam9iS2V5UmFuZ2UucmlnaHQpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWV0YWRhdGEgbWV0YWRhdGEgPSBjbHVzdGVyLmdldE1ldGFkYXRhKCk7Ci0KLSAgICAgICAgICAgIC8vIGNhbm9uaWNhbCByYW5nZXMgYW5kIG5vZGVzIGhvbGRpbmcgcmVwbGljYXMKLSAgICAgICAgICAgIE1hcDxUb2tlblJhbmdlLCBMaXN0PEhvc3Q+PiBtYXN0ZXJSYW5nZU5vZGVzID0gZ2V0UmFuZ2VNYXAoa2V5c3BhY2UsIG1ldGFkYXRhLCBnZXRUYXJnZXREQyhtZXRhZGF0YSwgaW5wdXRJbml0aWFsQWRkcmVzcykpOwotICAgICAgICAgICAgZm9yIChUb2tlblJhbmdlIHJhbmdlIDogbWFzdGVyUmFuZ2VOb2Rlcy5rZXlTZXQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoam9iUmFuZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoVG9rZW5SYW5nZSB1bndyYXBwZWQgOiByYW5nZS51bndyYXAoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGVhY2ggdG9rZW5SYW5nZSwgcGljayBhIGxpdmUgb3duZXIgYW5kIGFzayBpdCBmb3IgdGhlIGJ5dGUtc2l6ZWQgc3BsaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICBTcGxpdEZ1dHVyZSB0YXNrID0gbmV3IFNwbGl0RnV0dXJlKG5ldyBTcGxpdENhbGxhYmxlKHVud3JhcHBlZCwgbWFzdGVyUmFuZ2VOb2Rlcy5nZXQocmFuZ2UpLCBjb25mLCBzZXNzaW9uKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQodGFzayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGxpdGZ1dHVyZXMuYWRkKHRhc2spOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFRva2VuUmFuZ2Ugam9iVG9rZW5SYW5nZSA9IHJhbmdlVG9Ub2tlblJhbmdlKG1ldGFkYXRhLCBqb2JSYW5nZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZS5pbnRlcnNlY3RzKGpvYlRva2VuUmFuZ2UpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFRva2VuUmFuZ2UgaW50ZXJzZWN0aW9uOiByYW5nZS5pbnRlcnNlY3RXaXRoKGpvYlRva2VuUmFuZ2UpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoVG9rZW5SYW5nZSB1bndyYXBwZWQgOiBpbnRlcnNlY3Rpb24udW53cmFwKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZWFjaCB0b2tlblJhbmdlLCBwaWNrIGEgbGl2ZSBvd25lciBhbmQgYXNrIGl0IGZvciB0aGUgYnl0ZS1zaXplZCBzcGxpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BsaXRGdXR1cmUgdGFzayA9IG5ldyBTcGxpdEZ1dHVyZShuZXcgU3BsaXRDYWxsYWJsZSh1bndyYXBwZWQsICBtYXN0ZXJSYW5nZU5vZGVzLmdldChyYW5nZSksIGNvbmYsIHNlc3Npb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3Iuc3VibWl0KHRhc2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGxpdGZ1dHVyZXMuYWRkKHRhc2spOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gd2FpdCB1bnRpbCB3ZSBoYXZlIGFsbCB0aGUgcmVzdWx0cyBiYWNrCi0gICAgICAgICAgICBMaXN0PFNwbGl0RnV0dXJlPiBmYWlsZWRUYXNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgaW50IG1heFNwbGl0cyA9IDA7Ci0gICAgICAgICAgICBsb25nIGV4cGVjdGVkUGFydGlvbnNGb3JGYWlsZWRSYW5nZXMgPSAwOwotICAgICAgICAgICAgZm9yIChTcGxpdEZ1dHVyZSB0YXNrIDogc3BsaXRmdXR1cmVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxDb2x1bW5GYW1pbHlTcGxpdD4gdG9rZW5SYW5nZVNwbGl0cyA9IHRhc2suZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblJhbmdlU3BsaXRzLnNpemUoKSA+IG1heFNwbGl0cykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3BsaXRzID0gdG9rZW5SYW5nZVNwbGl0cy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFBhcnRpb25zRm9yRmFpbGVkUmFuZ2VzID0gdG9rZW5SYW5nZVNwbGl0cy5nZXQoMCkuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3BsaXRzLmFkZEFsbCh0b2tlblJhbmdlU3BsaXRzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbGVkVGFza3MuYWRkKHRhc2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRoZSBlc3RpbWF0ZSBpcyBvbmx5IHN0b3JlZCBvbiBhIHNpbmdsZSBob3N0LCBpZiB0aGF0IGhvc3QgaXMgZG93biB0aGVuIGNhbiBub3QgZ2V0IHRoZSBlc3RpbWF0ZQotICAgICAgICAgICAgLy8gaXRzIG1vcmUgdGhhbiBsaWtlbHkgdGhhdCBhIHNpbmdsZSBob3N0IGNvdWxkIGJlICJ0b28gbGFyZ2UiIGZvciBvbmUgc3BsaXQgYnV0IHRoZXJlIGlzIG5vIHdheSBvZgotICAgICAgICAgICAgLy8ga25vd25pbmchCi0gICAgICAgICAgICAvLyBUaGlzIGxvZ2ljIGF0dGVtcHRzIHRvIGd1ZXNzIHRoZSBlc3RpbWF0ZSBmcm9tIGFsbCB0aGUgc3VjY2Vzc2Z1bCByYW5nZXMKLSAgICAgICAgICAgIGlmICghZmFpbGVkVGFza3MuaXNFbXB0eSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGlmIGV2ZXJ5IHNwbGl0IGZhaWxlZCB0aGlzIHdpbGwgYmUgMAotICAgICAgICAgICAgICAgIGlmIChtYXhTcGxpdHMgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dBbGxTcGxpdHNGYWlsZWQoZmFpbGVkVGFza3MpOwotICAgICAgICAgICAgICAgIGZvciAoU3BsaXRGdXR1cmUgdGFzayA6IGZhaWxlZFRhc2tzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0YXNrIGZhaWxlZCwgc28gdGhpcyBzaG91bGQgdGhyb3cKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBjYXVzZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlVuYWJsZSB0byBnZXQgZXN0aW1hdGUgZm9yIHt9LCB0aGUgaG9zdCB7fSBoYWQgYSBleGNlcHRpb247IGZhbGxpbmcgYmFjayB0byBkZWZhdWx0IGVzdGltYXRlIiwgdGFzay5zcGxpdENhbGxhYmxlLnRva2VuUmFuZ2UsIHRhc2suc3BsaXRDYWxsYWJsZS5ob3N0cy5nZXQoMCksIGNhdXNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKFNwbGl0RnV0dXJlIHRhc2sgOiBmYWlsZWRUYXNrcykKLSAgICAgICAgICAgICAgICAgICAgc3BsaXRzLmFkZEFsbCh0b1NwbGl0KHRhc2suc3BsaXRDYWxsYWJsZS5ob3N0cywgc3BsaXRUb2tlblJhbmdlKHRhc2suc3BsaXRDYWxsYWJsZS50b2tlblJhbmdlLCBtYXhTcGxpdHMsIGV4cGVjdGVkUGFydGlvbnNGb3JGYWlsZWRSYW5nZXMpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBleGVjdXRvci5zaHV0ZG93bk5vdygpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IHNwbGl0cy5zaXplKCkgPiAwOwotICAgICAgICBDb2xsZWN0aW9ucy5zaHVmZmxlKHNwbGl0cywgbmV3IFJhbmRvbShuYW5vVGltZSgpKSk7Ci0gICAgICAgIHJldHVybiBzcGxpdHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHRocm93QWxsU3BsaXRzRmFpbGVkKExpc3Q8U3BsaXRGdXR1cmU+IGZhaWxlZFRhc2tzKQotICAgIHsKLSAgICAgICAgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIHN1Y2Nlc3NmdWwgdGFza3MgZm91bmQiKTsKLSAgICAgICAgZm9yIChTcGxpdEZ1dHVyZSB0YXNrIDogZmFpbGVkVGFza3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHRoZSB0YXNrIGZhaWxlZCwgc28gdGhpcyBzaG91bGQgdGhyb3cKLSAgICAgICAgICAgICAgICB0YXNrLmdldCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBjYXVzZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleGNlcHRpb24uYWRkU3VwcHJlc3NlZChjYXVzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3cgZXhjZXB0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUYXJnZXREQyhNZXRhZGF0YSBtZXRhZGF0YSwgU3RyaW5nW10gaW5wdXRJbml0aWFsQWRkcmVzcykKLSAgICB7Ci0gICAgICAgIEJpTXVsdGlWYWxNYXA8SW5ldEFkZHJlc3MsIFN0cmluZz4gYWRkcmVzc1RvRGMgPSBuZXcgQmlNdWx0aVZhbE1hcDw+KCk7Ci0gICAgICAgIE11bHRpbWFwPFN0cmluZywgSW5ldEFkZHJlc3M+IGRjVG9BZGRyZXNzZXMgPSBhZGRyZXNzVG9EYy5pbnZlcnNlKCk7Ci0KLSAgICAgICAgLy8gb25seSB3YXkgdG8gbWF0Y2ggaXMgb2ZmIHRoZSBicm9hZGNhc3QgYWRkcmVzc2VzLCBzbyBmb3IgYWxsIGhvc3RzIGRvIGEgZXhpc3RlbmNlIGNoZWNrCi0gICAgICAgIFNldDxJbmV0QWRkcmVzcz4gYWRkcmVzc2VzID0gbmV3IEhhc2hTZXQ8PihpbnB1dEluaXRpYWxBZGRyZXNzLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGlucHV0QWRkcmVzcyA6IGlucHV0SW5pdGlhbEFkZHJlc3MpCi0gICAgICAgICAgICBhZGRyZXNzZXMuYWRkQWxsKHBhcnNlQWRkcmVzcyhpbnB1dEFkZHJlc3MpKTsKLQotICAgICAgICBmb3IgKEhvc3QgaG9zdCA6IG1ldGFkYXRhLmdldEFsbEhvc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluZXRBZGRyZXNzIGFkZHJlc3MgPSBob3N0LmdldEJyb2FkY2FzdEFkZHJlc3MoKTsKLSAgICAgICAgICAgIGlmIChhZGRyZXNzZXMuY29udGFpbnMoYWRkcmVzcykpCi0gICAgICAgICAgICAgICAgYWRkcmVzc1RvRGMucHV0KGFkZHJlc3MsIGhvc3QuZ2V0RGF0YWNlbnRlcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoZGNUb0FkZHJlc3Nlcy5rZXlTZXQoKS5zaXplKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICByZXR1cm4gSXRlcmFibGVzLmdldE9ubHlFbGVtZW50KGRjVG9BZGRyZXNzZXMua2V5U2V0KCkpOwotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIklucHV0IGFkZHJlc3NlcyBjb3VsZCBub3QgYmUgdXNlZCB0byBmaW5kIERDOyBub24gbWF0Y2ggY2xpZW50IG1ldGFkYXRhIik7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIC8vIE11dGxpcGxlIERDcyBmb3VuZCwgYXR0ZW1wdCB0byBwaWNrIHRoZSBmaXJzdCBiYXNlZCBvZmYgYWRkcmVzcyBsaXN0LiBUaGlzIGlzIHRvIG1pbWljIHRoZSAyLjEKLSAgICAgICAgICAgICAgICAvLyBiZWhhdmlvciB3aGljaCB3b3VsZCBjb25uZWN0IGluIG9yZGVyIGFuZCB0aGUgZmlyc3Qgbm9kZSBzdWNjZXNzZnVsbHkgYWJsZSB0byBjb25uZWN0IHRvIHdhcyB0aGUKLSAgICAgICAgICAgICAgICAvLyBsb2NhbCBEQyB0byB1c2U7IHNpbmNlIGNsaWVudCBhYnN0cmFjdHMgdGhpcywgd2UgcmVseSBvbiBleGlzdGVuY2UgYXMgYSBwcm94eSBmb3IgY29ubmVjdC4KLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBpbnB1dEFkZHJlc3MgOiBpbnB1dEluaXRpYWxBZGRyZXNzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChJbmV0QWRkcmVzcyBhZGQgOiBwYXJzZUFkZHJlc3MoaW5wdXRBZGRyZXNzKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRjID0gYWRkcmVzc1RvRGMuZ2V0KGFkZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NzaWJsZSB0aGUgYWRkcmVzcyBpc24ndCBpbiB0aGUgY2x1c3RlciBhbmQgdGhlIGNsaWVudCBkcm9wcGVkLCBzbyBpZ25vcmUgbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRjICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRjOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIHNvbWUgaG93IHdlIHdlcmUgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBjbHVzdGVyLCBmaW5kIG11bHRpcGxlIERDcyB1c2luZyBtYXRjaGluZywgYW5kIHlldCBjb3VsZG4ndAotICAgICAgICAgICAgICAgIC8vIG1hdGNoIGFnYWluLi4uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVbmFibGUgdG8gaW5mZXIgZGF0YWNlbnRlciBmcm9tIGluaXRpYWwgYWRkcmVzc2VzOyBtdWx0aXBsZSBkYXRhY2VudGVycyBmb3VuZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZGNUb0FkZHJlc3Nlcy5rZXlTZXQoKSArICIsIHNob3VsZCBvbmx5IHVzZSBhZGRyZXNzZXMgZnJvbSBvbmUgZGF0YWNlbnRlciIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxJbmV0QWRkcmVzcz4gcGFyc2VBZGRyZXNzKFN0cmluZyBzdHIpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoSW5ldEFkZHJlc3MuZ2V0QWxsQnlOYW1lKHN0cikpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFRva2VuUmFuZ2UgcmFuZ2VUb1Rva2VuUmFuZ2UoTWV0YWRhdGEgbWV0YWRhdGEsIFJhbmdlPFRva2VuPiByYW5nZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtZXRhZGF0YS5uZXdUb2tlblJhbmdlKG1ldGFkYXRhLm5ld1Rva2VuKHBhcnRpdGlvbmVyLmdldFRva2VuRmFjdG9yeSgpLnRvU3RyaW5nKHJhbmdlLmxlZnQpKSwKLSAgICAgICAgICAgICAgICBtZXRhZGF0YS5uZXdUb2tlbihwYXJ0aXRpb25lci5nZXRUb2tlbkZhY3RvcnkoKS50b1N0cmluZyhyYW5nZS5yaWdodCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1hcDxUb2tlblJhbmdlLCBMb25nPiBnZXRTdWJTcGxpdHMoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgY2ZOYW1lLCBUb2tlblJhbmdlIHJhbmdlLCBIb3N0IGhvc3QsIENvbmZpZ3VyYXRpb24gY29uZiwgU2Vzc2lvbiBzZXNzaW9uKQotICAgIHsKLSAgICAgICAgaW50IHNwbGl0U2l6ZSA9IENvbmZpZ0hlbHBlci5nZXRJbnB1dFNwbGl0U2l6ZShjb25mKTsKLSAgICAgICAgaW50IHNwbGl0U2l6ZU1pQiA9IENvbmZpZ0hlbHBlci5nZXRJbnB1dFNwbGl0U2l6ZUluTWIoY29uZik7Ci0gICAgICAgIHJldHVybiBkZXNjcmliZVNwbGl0cyhrZXlzcGFjZSwgY2ZOYW1lLCByYW5nZSwgaG9zdCwgc3BsaXRTaXplLCBzcGxpdFNpemVNaUIsIHNlc3Npb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIE1hcDxUb2tlblJhbmdlLCBMaXN0PEhvc3Q+PiBnZXRSYW5nZU1hcChTdHJpbmcga2V5c3BhY2UsIE1ldGFkYXRhIG1ldGFkYXRhLCBTdHJpbmcgdGFyZ2V0REMpCi0gICAgewotICAgICAgICByZXR1cm4gQ3FsQ2xpZW50SGVscGVyLmdldExvY2FsUHJpbWFyeVJhbmdlRm9yREMoa2V5c3BhY2UsIG1ldGFkYXRhLCB0YXJnZXREQyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXA8VG9rZW5SYW5nZSwgTG9uZz4gZGVzY3JpYmVTcGxpdHMoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUsIFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgSG9zdCBob3N0LCBpbnQgc3BsaXRTaXplLCBpbnQgc3BsaXRTaXplTWIsIFNlc3Npb24gc2Vzc2lvbikKLSAgICB7Ci0gICAgICAgIC8vIEluIDIuMSB0aGUgaG9zdCBsaXN0IHdhcyB3YWxrZWQgaW4tb3JkZXIgKG9ubHkgbW92ZSB0byBuZXh0IGlmIElPRXhjZXB0aW9uKSBhbmQgY2FsbHMKLSAgICAgICAgLy8gb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZS5nZXRTcGxpdHMoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlPG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbj4sIGludCkKLSAgICAgICAgLy8gdGhhdCBjYWxsIGNvbXB1dGVzIHRvdGFsUm93Q291bnRFc3RpbWF0ZSAodXNlZCB0byBjb21wdXRlICNzcGxpdHMpIHRoZW4gc3BsaXRzIHRoZSByaW5nIGJhc2VkIG9mZiB0aG9zZSBlc3RpbWF0ZXMKLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhlIG1haW4gZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBlc3RpbWF0ZXMgaW4gMi4xIHdlcmUgY29tcHV0ZWQgYmFzZWQgb2ZmIHRoZSBkYXRhLCBzbyByZXBsaWNhcyBjb3VsZCBhbnN3ZXIgdGhlIGVzdGltYXRlcwotICAgICAgICAvLyBJbiAzLjAgd2UgcmVseSBvbiB0aGUgYmVsb3cgQ1FMIHF1ZXJ5IHdoaWNoIGlzIGxvY2FsIGFuZCBvbmx5IGNvbXB1dGVzIGVzdGltYXRlcyBmb3IgdGhlIHByaW1hcnkgcmFuZ2U7IHRoaXMKLSAgICAgICAgLy8gcHV0cyB1cyBpbiBhIHN0aWNreSBzcG90IHRvIGFuc3dlciwgaWYgdGhlIG5vZGUgZmFpbHMgd2hhdCBkbyB3ZSBkbz8gIDMuMCBiZWhhdmlvciBvbmx5IG1hdGNoZXMgMi4xIElGRiBhbGwKLSAgICAgICAgLy8gbm9kZXMgYXJlIHVwIGFuZCBoZWFsdGh5Ci0gICAgICAgIFJlc3VsdFNldCByZXN1bHRTZXQgPSBxdWVyeVRhYmxlRXN0aW1hdGVzKHNlc3Npb24sIGhvc3QsIGtleXNwYWNlLCB0YWJsZSwgdG9rZW5SYW5nZSk7Ci0KLSAgICAgICAgUm93IHJvdyA9IHJlc3VsdFNldC5vbmUoKTsKLQotICAgICAgICBsb25nIG1lYW5QYXJ0aXRpb25TaXplID0gMDsKLSAgICAgICAgbG9uZyBwYXJ0aXRpb25Db3VudCA9IDA7Ci0gICAgICAgIGludCBzcGxpdENvdW50ID0gMDsKLQotICAgICAgICBpZiAocm93ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lYW5QYXJ0aXRpb25TaXplID0gcm93LmdldExvbmcoIm1lYW5fcGFydGl0aW9uX3NpemUiKTsKLSAgICAgICAgICAgIHBhcnRpdGlvbkNvdW50ID0gcm93LmdldExvbmcoInBhcnRpdGlvbnNfY291bnQiKTsKLQotICAgICAgICAgICAgc3BsaXRDb3VudCA9IHNwbGl0U2l6ZU1iID4gMAotICAgICAgICAgICAgICAgID8gKGludCkobWVhblBhcnRpdGlvblNpemUgKiBwYXJ0aXRpb25Db3VudCAvIHNwbGl0U2l6ZU1iIC8gMTAyNCAvIDEwMjQpCi0gICAgICAgICAgICAgICAgOiAoaW50KShwYXJ0aXRpb25Db3VudCAvIHNwbGl0U2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIGRhdGEgb24gdGhpcyBzcGxpdCBvciB0aGUgc2l6ZSBlc3RpbWF0ZSBpcyAwLAotICAgICAgICAvLyByZXR1cm4gdGhlIGZ1bGwgc3BsaXQgaS5lLiwgZG8gbm90IHN1Yi1zcGxpdAotICAgICAgICAvLyBBc3N1bWUgc21hbGxlc3QgZ3JhbnVsYXJpdHkgb2YgcGFydGl0aW9uIGNvdW50IGF2YWlsYWJsZSBmcm9tIENBU1NBTkRSQS03Njg4Ci0gICAgICAgIGlmIChzcGxpdENvdW50ID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hcDxUb2tlblJhbmdlLCBMb25nPiB3cmFwcGVkVG9rZW5SYW5nZSA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgICAgIHdyYXBwZWRUb2tlblJhbmdlLnB1dCh0b2tlblJhbmdlLCBwYXJ0aXRpb25Db3VudCA9PSAwID8gMTI4TCA6IHBhcnRpdGlvbkNvdW50KTsKLSAgICAgICAgICAgIHJldHVybiB3cmFwcGVkVG9rZW5SYW5nZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzcGxpdFRva2VuUmFuZ2UodG9rZW5SYW5nZSwgc3BsaXRDb3VudCwgcGFydGl0aW9uQ291bnQgLyBzcGxpdENvdW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBSZXN1bHRTZXQgcXVlcnlUYWJsZUVzdGltYXRlcyhTZXNzaW9uIHNlc3Npb24sIEhvc3QgaG9zdCwgU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUsIFRva2VuUmFuZ2UgdG9rZW5SYW5nZSkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgcXVlcnkgPSBTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgbWVhbl9wYXJ0aXRpb25fc2l6ZSwgcGFydGl0aW9uc19jb3VudCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZST00gJXMuJXMgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSEVSRSBrZXlzcGFjZV9uYW1lID0gPyBBTkQgdGFibGVfbmFtZSA9ID8gQU5EIHJhbmdlX3R5cGUgPSAnJXMnIEFORCByYW5nZV9zdGFydCA9ID8gQU5EIHJhbmdlX2VuZCA9ID8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbUtleXNwYWNlLlRBQkxFX0VTVElNQVRFUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtS2V5c3BhY2UuVEFCTEVfRVNUSU1BVEVTX1RZUEVfTE9DQUxfUFJJTUFSWSk7Ci0gICAgICAgICAgICBTdGF0ZW1lbnQgc3RtdCA9IG5ldyBTaW1wbGVTdGF0ZW1lbnQocXVlcnksIGtleXNwYWNlLCB0YWJsZSwgdG9rZW5SYW5nZS5nZXRTdGFydCgpLnRvU3RyaW5nKCksIHRva2VuUmFuZ2UuZ2V0RW5kKCkudG9TdHJpbmcoKSkuc2V0SG9zdChob3N0KTsKLSAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLmV4ZWN1dGUoc3RtdCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEludmFsaWRRdWVyeUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZiB0aGUgdGFibGUgZG9lc24ndCBleGlzdCwgZmFsbCBiYWNrIHRvIG9sZCB0YWJsZS4gIFRoaXMgaXMgbGlrZWx5IHRvIHJldHVybiBubyByZWNvcmRzIGluIGEgbXVsdGkKLSAgICAgICAgICAgIC8vIERDIHNldHVwLCBidXQgc2hvdWxkIHdvcmsgZmluZSBpbiBhIHNpbmdsZSBEQyBzZXR1cC4KLSAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IFN0cmluZy5mb3JtYXQoIlNFTEVDVCBtZWFuX3BhcnRpdGlvbl9zaXplLCBwYXJ0aXRpb25zX2NvdW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRlJPTSAlcy4lcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldIRVJFIGtleXNwYWNlX25hbWUgPSA/IEFORCB0YWJsZV9uYW1lID0gPyBBTkQgcmFuZ2Vfc3RhcnQgPSA/IEFORCByYW5nZV9lbmQgPSA/IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5MRUdBQ1lfU0laRV9FU1RJTUFURVMpOwotCi0gICAgICAgICAgICBTdGF0ZW1lbnQgc3RtdCA9IG5ldyBTaW1wbGVTdGF0ZW1lbnQocXVlcnksIGtleXNwYWNlLCB0YWJsZSwgdG9rZW5SYW5nZS5nZXRTdGFydCgpLnRvU3RyaW5nKCksIHRva2VuUmFuZ2UuZ2V0RW5kKCkudG9TdHJpbmcoKSkuc2V0SG9zdChob3N0KTsKLSAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLmV4ZWN1dGUoc3RtdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8VG9rZW5SYW5nZSwgTG9uZz4gc3BsaXRUb2tlblJhbmdlKFRva2VuUmFuZ2UgdG9rZW5SYW5nZSwgaW50IHNwbGl0Q291bnQsIGxvbmcgcGFydGl0aW9uQ291bnQpCi0gICAgewotICAgICAgICBMaXN0PFRva2VuUmFuZ2U+IHNwbGl0UmFuZ2VzID0gdG9rZW5SYW5nZS5zcGxpdEV2ZW5seShzcGxpdENvdW50KTsKLSAgICAgICAgTWFwPFRva2VuUmFuZ2UsIExvbmc+IHJhbmdlc1dpdGhMZW5ndGggPSBNYXBzLm5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKHNwbGl0UmFuZ2VzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoVG9rZW5SYW5nZSByYW5nZSA6IHNwbGl0UmFuZ2VzKQotICAgICAgICAgICAgcmFuZ2VzV2l0aExlbmd0aC5wdXQocmFuZ2UsIHBhcnRpdGlvbkNvdW50KTsKLQotICAgICAgICByZXR1cm4gcmFuZ2VzV2l0aExlbmd0aDsKLSAgICB9Ci0KLSAgICAvLyBPbGQgSGFkb29wIEFQSQotICAgIHB1YmxpYyBJbnB1dFNwbGl0W10gZ2V0U3BsaXRzKEpvYkNvbmYgam9iQ29uZiwgaW50IG51bVNwbGl0cykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBUYXNrQXR0ZW1wdENvbnRleHQgdGFjID0gSGFkb29wQ29tcGF0Lm5ld1Rhc2tBdHRlbXB0Q29udGV4dChqb2JDb25mLCBuZXcgVGFza0F0dGVtcHRJRCgpKTsKLSAgICAgICAgTGlzdDxvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWR1Y2UuSW5wdXRTcGxpdD4gbmV3SW5wdXRTcGxpdHMgPSB0aGlzLmdldFNwbGl0cyh0YWMpOwotICAgICAgICBJbnB1dFNwbGl0W10gb2xkSW5wdXRTcGxpdHMgPSBuZXcgSW5wdXRTcGxpdFtuZXdJbnB1dFNwbGl0cy5zaXplKCldOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5ld0lucHV0U3BsaXRzLnNpemUoKTsgaSsrKQotICAgICAgICAgICAgb2xkSW5wdXRTcGxpdHNbaV0gPSAoQ29sdW1uRmFtaWx5U3BsaXQpbmV3SW5wdXRTcGxpdHMuZ2V0KGkpOwotICAgICAgICByZXR1cm4gb2xkSW5wdXRTcGxpdHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIHRva2VuIHRva2VuUmFuZ2UgYW5kIHNwbGl0cyBpdCB1cCBhY2NvcmRpbmcgdG8gdGhlIHN1Z2dlc3RlZAotICAgICAqIHNpemUgaW50byBpbnB1dCBzcGxpdHMgdGhhdCBIYWRvb3AgY2FuIHVzZS4KLSAgICAgKi8KLSAgICBjbGFzcyBTcGxpdENhbGxhYmxlIGltcGxlbWVudHMgQ2FsbGFibGU8TGlzdDxDb2x1bW5GYW1pbHlTcGxpdD4+Ci0gICAgewotCi0gICAgICAgIHByaXZhdGUgZmluYWwgVG9rZW5SYW5nZSB0b2tlblJhbmdlOwotICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8SG9zdD4gaG9zdHM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29uZmlndXJhdGlvbiBjb25mOwotICAgICAgICBwcml2YXRlIGZpbmFsIFNlc3Npb24gc2Vzc2lvbjsKLQotICAgICAgICBwdWJsaWMgU3BsaXRDYWxsYWJsZShUb2tlblJhbmdlIHRva2VuUmFuZ2UsIExpc3Q8SG9zdD4gaG9zdHMsIENvbmZpZ3VyYXRpb24gY29uZiwgU2Vzc2lvbiBzZXNzaW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoIWhvc3RzLmlzRW1wdHkoKSwgImhvc3RzIGxpc3QgcmVxdWlyZXMgYXQgbGVhc3QgMSBob3N0IGJ1dCB3YXMgZW1wdHkiKTsKLSAgICAgICAgICAgIHRoaXMudG9rZW5SYW5nZSA9IHRva2VuUmFuZ2U7Ci0gICAgICAgICAgICB0aGlzLmhvc3RzID0gaG9zdHM7Ci0gICAgICAgICAgICB0aGlzLmNvbmYgPSBjb25mOwotICAgICAgICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaXN0PENvbHVtbkZhbWlseVNwbGl0PiBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBNYXA8VG9rZW5SYW5nZSwgTG9uZz4gc3ViU3BsaXRzID0gZ2V0U3ViU3BsaXRzKGtleXNwYWNlLCBjZk5hbWUsIHRva2VuUmFuZ2UsIGhvc3RzLmdldCgwKSwgY29uZiwgc2Vzc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gdG9TcGxpdChob3N0cywgc3ViU3BsaXRzKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3BsaXRGdXR1cmUgZXh0ZW5kcyBGdXR1cmVUYXNrPExpc3Q8Q29sdW1uRmFtaWx5U3BsaXQ+PgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTcGxpdENhbGxhYmxlIHNwbGl0Q2FsbGFibGU7Ci0KLSAgICAgICAgU3BsaXRGdXR1cmUoU3BsaXRDYWxsYWJsZSBzcGxpdENhbGxhYmxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihzcGxpdENhbGxhYmxlKTsKLSAgICAgICAgICAgIHRoaXMuc3BsaXRDYWxsYWJsZSA9IHNwbGl0Q2FsbGFibGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8Q29sdW1uRmFtaWx5U3BsaXQ+IHRvU3BsaXQoTGlzdDxIb3N0PiBob3N0cywgTWFwPFRva2VuUmFuZ2UsIExvbmc+IHN1YlNwbGl0cykKLSAgICB7Ci0gICAgICAgIC8vIHR1cm4gdGhlIHN1Yi1yYW5nZXMgaW50byBJbnB1dFNwbGl0cwotICAgICAgICBTdHJpbmdbXSBlbmRwb2ludHMgPSBuZXcgU3RyaW5nW2hvc3RzLnNpemUoKV07Ci0KLSAgICAgICAgLy8gaGFkb29wIG5lZWRzIGhvc3RuYW1lLCBub3QgaXAKLSAgICAgICAgaW50IGVuZHBvaW50SW5kZXggPSAwOwotICAgICAgICBmb3IgKEhvc3QgZW5kcG9pbnQgOiBob3N0cykKLSAgICAgICAgICAgIGVuZHBvaW50c1tlbmRwb2ludEluZGV4KytdID0gZW5kcG9pbnQuZ2V0QWRkcmVzcygpLmdldEhvc3ROYW1lKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBwYXJ0aXRpb25lcklzT3BwID0gcGFydGl0aW9uZXIgaW5zdGFuY2VvZiBPcmRlclByZXNlcnZpbmdQYXJ0aXRpb25lciB8fCBwYXJ0aXRpb25lciBpbnN0YW5jZW9mIEJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7Ci0KLSAgICAgICAgQXJyYXlMaXN0PENvbHVtbkZhbWlseVNwbGl0PiBzcGxpdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8VG9rZW5SYW5nZSwgTG9uZz4gc3ViU3BsaXRFbnRyeSA6IHN1YlNwbGl0cy5lbnRyeVNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBUb2tlblJhbmdlIHN1YnJhbmdlID0gc3ViU3BsaXRFbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIENvbHVtbkZhbWlseVNwbGl0IHNwbGl0ID0KLSAgICAgICAgICAgICAgICBuZXcgQ29sdW1uRmFtaWx5U3BsaXQoCi0gICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbmVySXNPcHAgPwotICAgICAgICAgICAgICAgICAgICAgICAgc3VicmFuZ2UuZ2V0U3RhcnQoKS50b1N0cmluZygpLnN1YnN0cmluZygyKSA6IHN1YnJhbmdlLmdldFN0YXJ0KCkudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uZXJJc09wcCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdWJyYW5nZS5nZXRFbmQoKS50b1N0cmluZygpLnN1YnN0cmluZygyKSA6IHN1YnJhbmdlLmdldEVuZCgpLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgIHN1YlNwbGl0RW50cnkuZ2V0VmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnRzKTsKLQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJhZGRpbmcge30iLCBzcGxpdCk7Ci0gICAgICAgICAgICBzcGxpdHMuYWRkKHNwbGl0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3BsaXRzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbE91dHB1dEZvcm1hdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL2NxbDMvQ3FsT3V0cHV0Rm9ybWF0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMGE2YjEuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGFkb29wL2NxbDMvQ3FsT3V0cHV0Rm9ybWF0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLmNxbDM7Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi4qOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS4qOwotCi0vKioKLSAqIFRoZSA8Y29kZT5DcWxPdXRwdXRGb3JtYXQ8L2NvZGU+IGFjdHMgYXMgYSBIYWRvb3Atc3BlY2lmaWMKLSAqIE91dHB1dEZvcm1hdCB0aGF0IGFsbG93cyByZWR1Y2UgdGFza3MgdG8gc3RvcmUga2V5cyAoYW5kIGNvcnJlc3BvbmRpbmcKLSAqIGJvdW5kIHZhcmlhYmxlIHZhbHVlcykgYXMgQ1FMIHJvd3MgKGFuZCByZXNwZWN0aXZlIGNvbHVtbnMpIGluIGEgZ2l2ZW4KLSAqIHRhYmxlLgotICoKLSAqIDxwPgotICogQXMgaXMgdGhlIGNhc2Ugd2l0aCB0aGUge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5Db2x1bW5GYW1pbHlJbnB1dEZvcm1hdH0sIAotICogeW91IG5lZWQgdG8gc2V0IHRoZSBwcmVwYXJlZCBzdGF0ZW1lbnQgaW4geW91cgotICogSGFkb29wIGpvYiBDb25maWd1cmF0aW9uLiBUaGUge0BsaW5rIENxbENvbmZpZ0hlbHBlcn0gY2xhc3MsIHRocm91Z2ggaXRzCi0gKiB7QGxpbmsgQ3FsQ29uZmlnSGVscGVyI3NldE91dHB1dENxbH0gbWV0aG9kLCBpcyBwcm92aWRlZCB0byBtYWtlIHRoaXMKLSAqIHNpbXBsZS4KLSAqIHlvdSBuZWVkIHRvIHNldCB0aGUgS2V5c3BhY2UuIFRoZSB7QGxpbmsgQ29uZmlnSGVscGVyfSBjbGFzcywgdGhyb3VnaCBpdHMKLSAqIHtAbGluayBDb25maWdIZWxwZXIjc2V0T3V0cHV0Q29sdW1uRmFtaWx5fSBtZXRob2QsIGlzIHByb3ZpZGVkIHRvIG1ha2UgdGhpcwotICogc2ltcGxlLgotICogPC9wPgotICogCi0gKiA8cD4KLSAqIEZvciB0aGUgc2FrZSBvZiBwZXJmb3JtYW5jZSwgdGhpcyBjbGFzcyBlbXBsb3lzIGEgbGF6eSB3cml0ZS1iYWNrIGNhY2hpbmcKLSAqIG1lY2hhbmlzbSwgd2hlcmUgaXRzIHJlY29yZCB3cml0ZXIgcHJlcGFyZWQgc3RhdGVtZW50IGJpbmRlZCB2YXJpYWJsZSB2YWx1ZXMKLSAqIGNyZWF0ZWQgYmFzZWQgb24gdGhlIHJlZHVjZSdzIGlucHV0cyAoaW4gYSB0YXNrLXNwZWNpZmljIG1hcCksIGFuZCBwZXJpb2RpY2FsbHkgCi0gKiBtYWtlcyB0aGUgY2hhbmdlcyBvZmZpY2lhbCBieSBzZW5kaW5nIGEgZXhlY3V0aW9uIG9mIHByZXBhcmVkIHN0YXRlbWVudCByZXF1ZXN0IAotICogdG8gQ2Fzc2FuZHJhLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgQ3FsT3V0cHV0Rm9ybWF0IGV4dGVuZHMgT3V0cHV0Rm9ybWF0PE1hcDxTdHJpbmcsIEJ5dGVCdWZmZXI+LCBMaXN0PEJ5dGVCdWZmZXI+PgotICAgICAgICBpbXBsZW1lbnRzIG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZC5PdXRwdXRGb3JtYXQ8TWFwPFN0cmluZywgQnl0ZUJ1ZmZlcj4sIExpc3Q8Qnl0ZUJ1ZmZlcj4+Ci17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFUQ0hfVEhSRVNIT0xEID0gIm1hcHJlZHVjZS5vdXRwdXQuY29sdW1uZmFtaWx5b3V0cHV0Zm9ybWF0LmJhdGNoLnRocmVzaG9sZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFVUVfU0laRSA9ICJtYXByZWR1Y2Uub3V0cHV0LmNvbHVtbmZhbWlseW91dHB1dGZvcm1hdC5xdWV1ZS5zaXplIjsKLQotICAgIC8qKgotICAgICAqIENoZWNrIGZvciB2YWxpZGl0eSBvZiB0aGUgb3V0cHV0LXNwZWNpZmljYXRpb24gZm9yIHRoZSBqb2IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGpvYgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNoZWNrT3V0cHV0U3BlY3MoSm9iQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgY2hlY2tPdXRwdXRTcGVjcyhIYWRvb3BDb21wYXQuZ2V0Q29uZmlndXJhdGlvbihjb250ZXh0KSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tPdXRwdXRTcGVjcyhDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICBpZiAoQ29uZmlnSGVscGVyLmdldE91dHB1dEtleXNwYWNlKGNvbmYpID09IG51bGwpCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIllvdSBtdXN0IHNldCB0aGUga2V5c3BhY2Ugd2l0aCBzZXRPdXRwdXRLZXlzcGFjZSgpIik7Ci0gICAgICAgIGlmIChDb25maWdIZWxwZXIuZ2V0T3V0cHV0UGFydGl0aW9uZXIoY29uZikgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiWW91IG11c3Qgc2V0IHRoZSBvdXRwdXQgcGFydGl0aW9uZXIgdG8gdGhlIG9uZSB1c2VkIGJ5IHlvdXIgQ2Fzc2FuZHJhIGNsdXN0ZXIiKTsKLSAgICAgICAgaWYgKENvbmZpZ0hlbHBlci5nZXRPdXRwdXRJbml0aWFsQWRkcmVzcyhjb25mKSA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJZb3UgbXVzdCBzZXQgdGhlIGluaXRpYWwgb3V0cHV0IGFkZHJlc3MgdG8gYSBDYXNzYW5kcmEgbm9kZSIpOwotICAgIH0KLQotICAgIC8qKiBGaWxscyB0aGUgZGVwcmVjYXRlZCBPdXRwdXRGb3JtYXQgaW50ZXJmYWNlIGZvciBzdHJlYW1pbmcuICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgdm9pZCBjaGVja091dHB1dFNwZWNzKG9yZy5hcGFjaGUuaGFkb29wLmZzLkZpbGVTeXN0ZW0gZmlsZXN5c3RlbSwgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkLkpvYkNvbmYgam9iKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGNoZWNrT3V0cHV0U3BlY3Moam9iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgT3V0cHV0Q29tbWl0dGVyIGZvciB0aGlzIGZvcm1hdCBkb2VzIG5vdCB3cml0ZSBhbnkgZGF0YSB0byB0aGUgREZTLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQKLSAgICAgKiAgICAgICAgICAgIHRoZSB0YXNrIGNvbnRleHQKLSAgICAgKiBAcmV0dXJuIGFuIG91dHB1dCBjb21taXR0ZXIKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBPdXRwdXRDb21taXR0ZXIgZ2V0T3V0cHV0Q29tbWl0dGVyKFRhc2tBdHRlbXB0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IE51bGxPdXRwdXRDb21taXR0ZXIoKTsKLSAgICB9Ci0KLSAgICAvKiogRmlsbHMgdGhlIGRlcHJlY2F0ZWQgT3V0cHV0Rm9ybWF0IGludGVyZmFjZSBmb3Igc3RyZWFtaW5nLiAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgcHVibGljIENxbFJlY29yZFdyaXRlciBnZXRSZWNvcmRXcml0ZXIob3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVN5c3RlbSBmaWxlc3lzdGVtLCBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuSm9iQ29uZiBqb2IsIFN0cmluZyBuYW1lLCBvcmcuYXBhY2hlLmhhZG9vcC51dGlsLlByb2dyZXNzYWJsZSBwcm9ncmVzcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IENxbFJlY29yZFdyaXRlcihqb2IsIHByb2dyZXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHtAbGluayBSZWNvcmRXcml0ZXJ9IGZvciB0aGUgZ2l2ZW4gdGFzay4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogICAgICAgICAgICB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgdGFzay4KLSAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFJlY29yZFdyaXRlcn0gdG8gd3JpdGUgdGhlIG91dHB1dCBmb3IgdGhlIGpvYi4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIENxbFJlY29yZFdyaXRlciBnZXRSZWNvcmRXcml0ZXIoZmluYWwgVGFza0F0dGVtcHRDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ3FsUmVjb3JkV3JpdGVyKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFuIHtAbGluayBPdXRwdXRDb21taXR0ZXJ9IHRoYXQgZG9lcyBub3RoaW5nLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxPdXRwdXRDb21taXR0ZXIgZXh0ZW5kcyBPdXRwdXRDb21taXR0ZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIGFib3J0VGFzayhUYXNrQXR0ZW1wdENvbnRleHQgdGFza0NvbnRleHQpIHsgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFudXBKb2IoSm9iQ29udGV4dCBqb2JDb250ZXh0KSB7IH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjb21taXRUYXNrKFRhc2tBdHRlbXB0Q29udGV4dCB0YXNrQ29udGV4dCkgeyB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gbmVlZHNUYXNrQ29tbWl0KFRhc2tBdHRlbXB0Q29udGV4dCB0YXNrQ29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0dXBKb2IoSm9iQ29udGV4dCBqb2JDb250ZXh0KSB7IH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXR1cFRhc2soVGFza0F0dGVtcHRDb250ZXh0IHRhc2tDb250ZXh0KSB7IH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxSZWNvcmRSZWFkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbFJlY29yZFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWFhZDE5Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbFJlY29yZFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5jcWwzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOwotCi1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlR5cGVDb2RlYzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5BYnN0cmFjdEl0ZXJhdG9yOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5DbHVzdGVyOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Db2x1bW5EZWZpbml0aW9uczsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ29sdW1uTWV0YWRhdGE7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkxvY2FsRGF0ZTsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuTWV0YWRhdGE7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJlc3VsdFNldDsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuUm93OwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TZXNzaW9uOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Ub2tlbjsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuVHVwbGVWYWx1ZTsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuVURUVmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucmVmbGVjdC5UeXBlVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuQ29sdW1uRmFtaWx5U3BsaXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLkNvbmZpZ0hlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuSGFkb29wQ29tcGF0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5JbnB1dFNwbGl0OwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5SZWNvcmRSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlRhc2tBdHRlbXB0Q29udGV4dDsKLQotLyoqCi0gKiA8cD4KLSAqIENxbFJlY29yZFJlYWRlciByZWFkcyB0aGUgcm93cyByZXR1cm4gZnJvbSB0aGUgQ1FMIHF1ZXJ5Ci0gKiBJdCB1c2VzIENRTCBhdXRvLXBhZ2luZy4KLSAqIDwvcD4KLSAqIDxwPgotICogUmV0dXJuIGEgTG9uZyBhcyBhIGxvY2FsIENRTCByb3cga2V5IHN0YXJ0cyBmcm9tIDA7Ci0gKiA8L3A+Ci0gKiB7QGNvZGUKLSAqIFJvdyBhcyBDKiBqYXZhIGRyaXZlciBDUUwgcmVzdWx0IHNldCByb3cKLSAqIDEpIHNlbGVjdCBjbGF1c2UgbXVzdCBpbmNsdWRlIHBhcnRpdGlvbiBrZXkgY29sdW1ucyAodG8gY2FsY3VsYXRlIHRoZSBwcm9ncmVzcyBiYXNlZCBvbiB0aGUgYWN0dWFsIENGIHJvdyBwcm9jZXNzZWQpCi0gKiAyKSB3aGVyZSBjbGF1c2UgbXVzdCBpbmNsdWRlIHRva2VuKHBhcnRpdGlvbl9rZXkxLCAuLi4gICwgcGFydGl0aW9uX2tleW4pID4gPyBhbmQgCi0gKiAgICAgICB0b2tlbihwYXJ0aXRpb25fa2V5MSwgLi4uICwgcGFydGl0aW9uX2tleW4pIDw9ID8gIChpbiB0aGUgcmlnaHQgb3JkZXIpIAotICogfQotICovCi1wdWJsaWMgY2xhc3MgQ3FsUmVjb3JkUmVhZGVyIGV4dGVuZHMgUmVjb3JkUmVhZGVyPExvbmcsIFJvdz4KLSAgICAgICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuUmVjb3JkUmVhZGVyPExvbmcsIFJvdz4sIEF1dG9DbG9zZWFibGUKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ3FsUmVjb3JkUmVhZGVyLmNsYXNzKTsKLQotICAgIHByaXZhdGUgQ29sdW1uRmFtaWx5U3BsaXQgc3BsaXQ7Ci0gICAgcHJpdmF0ZSBSb3dJdGVyYXRvciByb3dJdGVyYXRvcjsKLQotICAgIHByaXZhdGUgUGFpcjxMb25nLCBSb3c+IGN1cnJlbnRSb3c7Ci0gICAgcHJpdmF0ZSBpbnQgdG90YWxSb3dDb3VudDsgLy8gdG90YWwgbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2gKLSAgICBwcml2YXRlIFN0cmluZyBrZXlzcGFjZTsKLSAgICBwcml2YXRlIFN0cmluZyBjZk5hbWU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY3FsUXVlcnk7Ci0gICAgcHJpdmF0ZSBDbHVzdGVyIGNsdXN0ZXI7Ci0gICAgcHJpdmF0ZSBTZXNzaW9uIHNlc3Npb247Ci0gICAgcHJpdmF0ZSBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgaW5wdXRDb2x1bW5zOwotICAgIHByaXZhdGUgU3RyaW5nIHVzZXJEZWZpbmVkV2hlcmVDbGF1c2VzOwotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGFydGl0aW9uS2V5cyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgLy8gcGFydGl0aW9uIGtleXMgLS0ga2V5IGFsaWFzZXMKLSAgICBwcml2YXRlIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBCb29sZWFuPiBwYXJ0aXRpb25Cb3VuZENvbHVtbnMgPSBNYXBzLm5ld0xpbmtlZEhhc2hNYXAoKTsKLSAgICBwcm90ZWN0ZWQgaW50IG5hdGl2ZVByb3RvY29sVmVyc2lvbiA9IDE7Ci0KLSAgICBwdWJsaWMgQ3FsUmVjb3JkUmVhZGVyKCkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJbnB1dFNwbGl0IHNwbGl0LCBUYXNrQXR0ZW1wdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aGlzLnNwbGl0ID0gKENvbHVtbkZhbWlseVNwbGl0KSBzcGxpdDsKLSAgICAgICAgQ29uZmlndXJhdGlvbiBjb25mID0gSGFkb29wQ29tcGF0LmdldENvbmZpZ3VyYXRpb24oY29udGV4dCk7Ci0gICAgICAgIHRvdGFsUm93Q291bnQgPSAodGhpcy5zcGxpdC5nZXRMZW5ndGgoKSA8IExvbmcuTUFYX1ZBTFVFKQotICAgICAgICAgICAgICAgICAgICAgID8gKGludCkgdGhpcy5zcGxpdC5nZXRMZW5ndGgoKQotICAgICAgICAgICAgICAgICAgICAgIDogQ29uZmlnSGVscGVyLmdldElucHV0U3BsaXRTaXplKGNvbmYpOwotICAgICAgICBjZk5hbWUgPSBDb25maWdIZWxwZXIuZ2V0SW5wdXRDb2x1bW5GYW1pbHkoY29uZik7Ci0gICAgICAgIGtleXNwYWNlID0gQ29uZmlnSGVscGVyLmdldElucHV0S2V5c3BhY2UoY29uZik7Ci0gICAgICAgIHBhcnRpdGlvbmVyID0gQ29uZmlnSGVscGVyLmdldElucHV0UGFydGl0aW9uZXIoY29uZik7Ci0gICAgICAgIGlucHV0Q29sdW1ucyA9IENxbENvbmZpZ0hlbHBlci5nZXRJbnB1dGNvbHVtbnMoY29uZik7Ci0gICAgICAgIHVzZXJEZWZpbmVkV2hlcmVDbGF1c2VzID0gQ3FsQ29uZmlnSGVscGVyLmdldElucHV0V2hlcmVDbGF1c2VzKGNvbmYpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2x1c3RlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgQ2x1c3RlciBpbnN0YW5jZQotICAgICAgICAgICAgU3RyaW5nW10gbG9jYXRpb25zID0gc3BsaXQuZ2V0TG9jYXRpb25zKCk7Ci0gICAgICAgICAgICBjbHVzdGVyID0gQ3FsQ29uZmlnSGVscGVyLmdldElucHV0Q2x1c3Rlcihsb2NhdGlvbnMsIGNvbmYpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2x1c3RlciAhPSBudWxsKQotICAgICAgICAgICAgc2Vzc2lvbiA9IGNsdXN0ZXIuY29ubmVjdChxdW90ZShrZXlzcGFjZSkpOwotCi0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpCi0gICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbid0IGNyZWF0ZSBjb25uZWN0aW9uIHNlc3Npb24iKTsKLQotICAgICAgICAvL2dldCBuZWdvdGlhdGVkIHNlcmlhbGl6YXRpb24gcHJvdG9jb2wKLSAgICAgICAgbmF0aXZlUHJvdG9jb2xWZXJzaW9uID0gY2x1c3Rlci5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvdG9jb2xPcHRpb25zKCkuZ2V0UHJvdG9jb2xWZXJzaW9uKCkudG9JbnQoKTsKLQotICAgICAgICAvLyBJZiB0aGUgdXNlciBwcm92aWRlcyBhIENRTCBxdWVyeSB0aGVuIHdlIHdpbGwgdXNlIGl0IHdpdGhvdXQgdmFsaWRhdGlvbgotICAgICAgICAvLyBvdGhlcndpc2Ugd2Ugd2lsbCBmYWxsIGJhY2sgdG8gYnVpbGRpbmcgYSBxdWVyeSB1c2luZyB0aGU6Ci0gICAgICAgIC8vICAgaW5wdXRDb2x1bW5zCi0gICAgICAgIC8vICAgd2hlcmVDbGF1c2VzCi0gICAgICAgIGNxbFF1ZXJ5ID0gQ3FsQ29uZmlnSGVscGVyLmdldElucHV0Q3FsKGNvbmYpOwotICAgICAgICAvLyB2YWxpZGF0ZSB0aGF0IHRoZSB1c2VyIGhhc24ndCB0cmllZCB0byBnaXZlIHVzIGEgY3VzdG9tIHF1ZXJ5IGFsb25nIHdpdGggaW5wdXQgY29sdW1ucwotICAgICAgICAvLyBhbmQgd2hlcmUgY2xhdXNlcwotICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNOb3RFbXB0eShjcWxRdWVyeSkgJiYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkoaW5wdXRDb2x1bW5zKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1V0aWxzLmlzTm90RW1wdHkodXNlckRlZmluZWRXaGVyZUNsYXVzZXMpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJDYW5ub3QgZGVmaW5lIGEgY3VzdG9tIHF1ZXJ5IHdpdGggaW5wdXQgY29sdW1ucyBhbmQgLyBvciB3aGVyZSBjbGF1c2VzIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eShjcWxRdWVyeSkpCi0gICAgICAgICAgICBjcWxRdWVyeSA9IGJ1aWxkUXVlcnkoKTsKLSAgICAgICAgbG9nZ2VyLnRyYWNlKCJjcWxRdWVyeSB7fSIsIGNxbFF1ZXJ5KTsKLQotICAgICAgICByb3dJdGVyYXRvciA9IG5ldyBSb3dJdGVyYXRvcigpOwotICAgICAgICBsb2dnZXIudHJhY2UoImNyZWF0ZWQge30iLCByb3dJdGVyYXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgIHsKLSAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkKLSAgICAgICAgICAgIHNlc3Npb24uY2xvc2UoKTsKLSAgICAgICAgaWYgKGNsdXN0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGNsdXN0ZXIuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTG9uZyBnZXRDdXJyZW50S2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjdXJyZW50Um93LmxlZnQ7Ci0gICAgfQotCi0gICAgcHVibGljIFJvdyBnZXRDdXJyZW50VmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRSb3cucmlnaHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGZsb2F0IGdldFByb2dyZXNzKCkKLSAgICB7Ci0gICAgICAgIGlmICghcm93SXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICAgICAgcmV0dXJuIDEuMEY7Ci0KLSAgICAgICAgLy8gdGhlIHByb2dyZXNzIGlzIGxpa2VseSB0byBiZSByZXBvcnRlZCBzbGlnaHRseSBvZmYgdGhlIGFjdHVhbCBidXQgY2xvc2UgZW5vdWdoCi0gICAgICAgIGZsb2F0IHByb2dyZXNzID0gKChmbG9hdCkgcm93SXRlcmF0b3IudG90YWxSZWFkIC8gdG90YWxSb3dDb3VudCk7Ci0gICAgICAgIHJldHVybiBwcm9ncmVzcyA+IDEuMEYgPyAxLjBGIDogcHJvZ3Jlc3M7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbmV4dEtleVZhbHVlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoIXJvd0l0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJGaW5pc2hlZCBzY2FubmluZyB7fSByb3dzIChlc3RpbWF0ZSB3YXM6IHt9KSIsIHJvd0l0ZXJhdG9yLnRvdGFsUmVhZCwgdG90YWxSb3dDb3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudFJvdyA9IHJvd0l0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHRocm93IGl0IGFzIElPRXhjZXB0aW9uLCBzbyBjbGllbnQgY2FuIGNhdGNoIGl0IGFuZCBoYW5kbGUgaXQgYXQgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIElPRXhjZXB0aW9uIGlvZSA9IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICBpb2UuaW5pdENhdXNlKGlvZS5nZXRDYXVzZSgpKTsKLSAgICAgICAgICAgIHRocm93IGlvZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBCZWNhdXNlIHRoZSBvbGQgSGFkb29wIEFQSSB3YW50cyB1cyB0byB3cml0ZSB0byB0aGUga2V5IGFuZCB2YWx1ZQotICAgIC8vIGFuZCB0aGUgbmV3IGFza3MgZm9yIHRoZW0sIHdlIG5lZWQgdG8gY29weSB0aGUgb3V0cHV0IG9mIHRoZSBuZXcgQVBJCi0gICAgLy8gdG8gdGhlIG9sZC4gVGh1cywgZXhwZWN0IGEgc21hbGwgcGVyZm9ybWFuY2UgaGl0LgotICAgIC8vIEFuZCBvYnZpb3VzbHkgdGhpcyB3b3VsZG4ndCB3b3JrIGZvciB3aWRlIHJvd3MuIEJ1dCBzaW5jZSBDb2x1bW5GYW1pbHlJbnB1dEZvcm1hdAotICAgIC8vIGFuZCBDb2x1bW5GYW1pbHlSZWNvcmRSZWFkZXIgZG9uJ3Qgc3VwcG9ydCB0aGVtLCBpdCBzaG91bGQgYmUgZmluZSBmb3Igbm93LgotICAgIHB1YmxpYyBib29sZWFuIG5leHQoTG9uZyBrZXksIFJvdyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAobmV4dEtleVZhbHVlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoV3JhcHBlZFJvdyl2YWx1ZSkuc2V0Um93KGdldEN1cnJlbnRWYWx1ZSgpKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRQb3MoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiByb3dJdGVyYXRvci50b3RhbFJlYWQ7Ci0gICAgfQotCi0gICAgcHVibGljIExvbmcgY3JlYXRlS2V5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMb25nLnZhbHVlT2YoMEwpOwotICAgIH0KLQotICAgIHB1YmxpYyBSb3cgY3JlYXRlVmFsdWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBXcmFwcGVkUm93KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIG5hdGl2ZSB2ZXJzaW9uIHByb3RvY29sIG9mIHRoZSBjbHVzdGVyIGNvbm5lY3Rpb24KLSAgICAgKiBAcmV0dXJuIHNlcmlhbGl6YXRpb24gcHJvdG9jb2wgdmVyc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5hdGl2ZVByb3RvY29sVmVyc2lvbigpIAotICAgIHsKLSAgICAgICAgcmV0dXJuIG5hdGl2ZVByb3RvY29sVmVyc2lvbjsKLSAgICB9Ci0KLSAgICAvKiogQ1FMIHJvdyBpdGVyYXRvciAKLSAgICAgKiAgSW5wdXQgY3FsIHF1ZXJ5ICAKLSAgICAgKiAgMSkgc2VsZWN0IGNsYXVzZSBtdXN0IGluY2x1ZGUga2V5IGNvbHVtbnMgKGlmIHdlIHVzZSBwYXJ0aXRpb24ga2V5IGJhc2VkIHJvdyBjb3VudCkKLSAgICAgKiAgMikgd2hlcmUgY2xhdXNlIG11c3QgaW5jbHVkZSB0b2tlbihwYXJ0aXRpb25fa2V5MSAuLi4gcGFydGl0aW9uX2tleW4pID4gPyBhbmQgCi0gICAgICogICAgIHRva2VuKHBhcnRpdGlvbl9rZXkxIC4uLiBwYXJ0aXRpb25fa2V5bikgPD0gPyAKLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIFJvd0l0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvcjxQYWlyPExvbmcsIFJvdz4+Ci0gICAgewotICAgICAgICBwcml2YXRlIGxvbmcga2V5SWQgPSAwTDsKLSAgICAgICAgcHJvdGVjdGVkIGludCB0b3RhbFJlYWQgPSAwOyAvLyB0b3RhbCBudW1iZXIgb2YgY2Ygcm93cyByZWFkCi0gICAgICAgIHByb3RlY3RlZCBJdGVyYXRvcjxSb3c+IHJvd3M7Ci0gICAgICAgIHByaXZhdGUgTWFwPFN0cmluZywgQnl0ZUJ1ZmZlcj4gcHJldmlvdXNSb3dLZXkgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEJ5dGVCdWZmZXI+KCk7IC8vIHByZXZpb3VzIENGIHJvdyBrZXkKLQotICAgICAgICBwdWJsaWMgUm93SXRlcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBYnN0cmFjdFR5cGUgdHlwZSA9IHBhcnRpdGlvbmVyLmdldFRva2VuVmFsaWRhdG9yKCk7Ci0gICAgICAgICAgICBSZXN1bHRTZXQgcnMgPSBzZXNzaW9uLmV4ZWN1dGUoY3FsUXVlcnksIHR5cGUuY29tcG9zZSh0eXBlLmZyb21TdHJpbmcoc3BsaXQuZ2V0U3RhcnRUb2tlbigpKSksIHR5cGUuY29tcG9zZSh0eXBlLmZyb21TdHJpbmcoc3BsaXQuZ2V0RW5kVG9rZW4oKSkpICk7Ci0gICAgICAgICAgICBmb3IgKENvbHVtbk1ldGFkYXRhIG1ldGEgOiBjbHVzdGVyLmdldE1ldGFkYXRhKCkuZ2V0S2V5c3BhY2UocXVvdGUoa2V5c3BhY2UpKS5nZXRUYWJsZShxdW90ZShjZk5hbWUpKS5nZXRQYXJ0aXRpb25LZXkoKSkKLSAgICAgICAgICAgICAgICBwYXJ0aXRpb25Cb3VuZENvbHVtbnMucHV0KG1ldGEuZ2V0TmFtZSgpLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgICAgcm93cyA9IHJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgUGFpcjxMb25nLCBSb3c+IGNvbXB1dGVOZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHJvd3MgPT0gbnVsbCB8fCAhcm93cy5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOwotCi0gICAgICAgICAgICBSb3cgcm93ID0gcm93cy5uZXh0KCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBCeXRlQnVmZmVyPiBrZXlDb2x1bW5zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCeXRlQnVmZmVyPihwYXJ0aXRpb25Cb3VuZENvbHVtbnMuc2l6ZSgpKTsgCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBjb2x1bW4gOiBwYXJ0aXRpb25Cb3VuZENvbHVtbnMua2V5U2V0KCkpCi0gICAgICAgICAgICAgICAga2V5Q29sdW1ucy5wdXQoY29sdW1uLCByb3cuZ2V0Qnl0ZXNVbnNhZmUoY29sdW1uKSk7Ci0KLSAgICAgICAgICAgIC8vIGluY3JlYXNlIHRvdGFsIENGIHJvdyByZWFkCi0gICAgICAgICAgICBpZiAocHJldmlvdXNSb3dLZXkuaXNFbXB0eSgpICYmICFrZXlDb2x1bW5zLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmV2aW91c1Jvd0tleSA9IGtleUNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgdG90YWxSZWFkKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgY29sdW1uIDogcGFydGl0aW9uQm91bmRDb2x1bW5zLmtleVNldCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBub3QgY29ycmVjdCAtIGJ1dCB3ZSBkb24ndCBzZWVtIHRvIGhhdmUgZWFzeSBhY2Nlc3MgdG8gYmV0dGVyIHR5cGUgaW5mb3JtYXRpb24gaGVyZQotICAgICAgICAgICAgICAgICAgICBpZiAoQnl0ZUJ1ZmZlclV0aWwuY29tcGFyZVVuc2lnbmVkKGtleUNvbHVtbnMuZ2V0KGNvbHVtbiksIHByZXZpb3VzUm93S2V5LmdldChjb2x1bW4pKSAhPSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1Jvd0tleSA9IGtleUNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFJlYWQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAga2V5SWQgKys7Ci0gICAgICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUoa2V5SWQsIHJvdyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXcmFwcGVkUm93IGltcGxlbWVudHMgUm93Ci0gICAgewotICAgICAgICBwcml2YXRlIFJvdyByb3c7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Um93KFJvdyByb3cpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucm93ID0gcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBDb2x1bW5EZWZpbml0aW9ucyBnZXRDb2x1bW5EZWZpbml0aW9ucygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0Q29sdW1uRGVmaW5pdGlvbnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc051bGwoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuaXNOdWxsKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbChTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5pc051bGwobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0T2JqZWN0KGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8VD4gVCBnZXQoaW50IGksIENsYXNzPFQ+IGFDbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXQoaSwgYUNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgPFQ+IFQgZ2V0KGludCBpLCBUeXBlVG9rZW48VD4gdHlwZVRva2VuKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldChpLCB0eXBlVG9rZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8VD4gVCBnZXQoaW50IGksIFR5cGVDb2RlYzxUPiB0eXBlQ29kZWMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0KGksIHR5cGVDb2RlYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRPYmplY3QoU3RyaW5nIHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0T2JqZWN0KHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8VD4gVCBnZXQoU3RyaW5nIHMsIENsYXNzPFQ+IGFDbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXQocywgYUNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgPFQ+IFQgZ2V0KFN0cmluZyBzLCBUeXBlVG9rZW48VD4gdHlwZVRva2VuKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldChzLCB0eXBlVG9rZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8VD4gVCBnZXQoU3RyaW5nIHMsIFR5cGVDb2RlYzxUPiB0eXBlQ29kZWMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0KHMsIHR5cGVDb2RlYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbChpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRCb29sKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2woU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0Qm9vbChuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgc2hvcnQgZ2V0U2hvcnQoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0U2hvcnQoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHNob3J0IGdldFNob3J0KFN0cmluZyBzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldFNob3J0KHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBieXRlIGdldEJ5dGUoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0Qnl0ZShpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYnl0ZSBnZXRCeXRlKFN0cmluZyBzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldEJ5dGUocyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRJbnQoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0SW50KGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldEludChuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRMb25nKGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldExvbmcoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgZ2V0TG9uZyhTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRMb25nKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBEYXRlIGdldFRpbWVzdGFtcChpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRUaW1lc3RhbXAoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERhdGUgZ2V0VGltZXN0YW1wKFN0cmluZyBzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldFRpbWVzdGFtcChzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTG9jYWxEYXRlIGdldERhdGUoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0RGF0ZShpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTG9jYWxEYXRlIGdldERhdGUoU3RyaW5nIHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0RGF0ZShzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRUaW1lKGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldFRpbWUoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgZ2V0VGltZShTdHJpbmcgcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRUaW1lKHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdChpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRGbG9hdChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0RmxvYXQobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0RG91YmxlKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldERvdWJsZShuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRCeXRlc1Vuc2FmZShpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRCeXRlc1Vuc2FmZShpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRCeXRlc1Vuc2FmZShTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRCeXRlc1Vuc2FmZShuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRCeXRlcyhpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRCeXRlcyhpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRCeXRlcyhTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRCeXRlcyhuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRTdHJpbmcoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0U3RyaW5nKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGdldFZhcmludChpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRWYXJpbnQoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJpZ0ludGVnZXIgZ2V0VmFyaW50KFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldFZhcmludChuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQmlnRGVjaW1hbCBnZXREZWNpbWFsKGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldERlY2ltYWwoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0RGVjaW1hbChTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXREZWNpbWFsKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBVVUlEIGdldFVVSUQoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0VVVJRChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVVVJRCBnZXRVVUlEKFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldFVVSUQobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEluZXRBZGRyZXNzIGdldEluZXQoaW50IGkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0SW5ldChpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0SW5ldChTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRJbmV0KG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBnZXRMaXN0KGludCBpLCBDbGFzczxUPiBlbGVtZW50c0NsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldExpc3QoaSwgZWxlbWVudHNDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIDxUPiBMaXN0PFQ+IGdldExpc3QoaW50IGksIFR5cGVUb2tlbjxUPiB0eXBlVG9rZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0TGlzdChpLCB0eXBlVG9rZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBnZXRMaXN0KFN0cmluZyBuYW1lLCBDbGFzczxUPiBlbGVtZW50c0NsYXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldExpc3QobmFtZSwgZWxlbWVudHNDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIDxUPiBMaXN0PFQ+IGdldExpc3QoU3RyaW5nIHMsIFR5cGVUb2tlbjxUPiB0eXBlVG9rZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0TGlzdChzLCB0eXBlVG9rZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8VD4gU2V0PFQ+IGdldFNldChpbnQgaSwgQ2xhc3M8VD4gZWxlbWVudHNDbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRTZXQoaSwgZWxlbWVudHNDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIDxUPiBTZXQ8VD4gZ2V0U2V0KGludCBpLCBUeXBlVG9rZW48VD4gdHlwZVRva2VuKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldFNldChpLCB0eXBlVG9rZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8VD4gU2V0PFQ+IGdldFNldChTdHJpbmcgbmFtZSwgQ2xhc3M8VD4gZWxlbWVudHNDbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRTZXQobmFtZSwgZWxlbWVudHNDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIDxUPiBTZXQ8VD4gZ2V0U2V0KFN0cmluZyBzLCBUeXBlVG9rZW48VD4gdHlwZVRva2VuKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldFNldChzLCB0eXBlVG9rZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8SywgVj4gTWFwPEssIFY+IGdldE1hcChpbnQgaSwgQ2xhc3M8Sz4ga2V5c0NsYXNzLCBDbGFzczxWPiB2YWx1ZXNDbGFzcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRNYXAoaSwga2V5c0NsYXNzLCB2YWx1ZXNDbGFzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIDxLLCBWPiBNYXA8SywgVj4gZ2V0TWFwKGludCBpLCBUeXBlVG9rZW48Sz4gdHlwZVRva2VuLCBUeXBlVG9rZW48Vj4gdHlwZVRva2VuMSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRNYXAoaSwgdHlwZVRva2VuLCB0eXBlVG9rZW4xKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgPEssIFY+IE1hcDxLLCBWPiBnZXRNYXAoU3RyaW5nIG5hbWUsIENsYXNzPEs+IGtleXNDbGFzcywgQ2xhc3M8Vj4gdmFsdWVzQ2xhc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0TWFwKG5hbWUsIGtleXNDbGFzcywgdmFsdWVzQ2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyA8SywgVj4gTWFwPEssIFY+IGdldE1hcChTdHJpbmcgcywgVHlwZVRva2VuPEs+IHR5cGVUb2tlbiwgVHlwZVRva2VuPFY+IHR5cGVUb2tlbjEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0TWFwKHMsIHR5cGVUb2tlbiwgdHlwZVRva2VuMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFVEVFZhbHVlIGdldFVEVFZhbHVlKGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldFVEVFZhbHVlKGkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBVRFRWYWx1ZSBnZXRVRFRWYWx1ZShTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRVRFRWYWx1ZShuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVHVwbGVWYWx1ZSBnZXRUdXBsZVZhbHVlKGludCBpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93LmdldFR1cGxlVmFsdWUoaSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFR1cGxlVmFsdWUgZ2V0VHVwbGVWYWx1ZShTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRUdXBsZVZhbHVlKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBUb2tlbiBnZXRUb2tlbihpbnQgaSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRUb2tlbihpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVG9rZW4gZ2V0VG9rZW4oU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiByb3cuZ2V0VG9rZW4obmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFRva2VuIGdldFBhcnRpdGlvbktleVRva2VuKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJvdy5nZXRQYXJ0aXRpb25LZXlUb2tlbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGQgYSBxdWVyeSBmb3IgdGhlIHJlYWRlciBvZiB0aGUgZm9ybToKLSAgICAgKgotICAgICAqIFNFTEVDVCAqIEZST00ga3M+Y2YgdG9rZW4ocGsxLC4uLnBrbik+PyBBTkQgdG9rZW4ocGsxLC4uLnBrbik8PT8gW0FORCB1c2VyIHdoZXJlIGNsYXVzZXNdIFtBTExPVyBGSUxURVJJTkddCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgYnVpbGRRdWVyeSgpCi0gICAgewotICAgICAgICBmZXRjaEtleXMoKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gY29sdW1ucyA9IGdldFNlbGVjdENvbHVtbnMoKTsKLSAgICAgICAgU3RyaW5nIHNlbGVjdENvbHVtbkxpc3QgPSBjb2x1bW5zLnNpemUoKSA9PSAwID8gIioiIDogbWFrZUNvbHVtbkxpc3QoY29sdW1ucyk7Ci0gICAgICAgIFN0cmluZyBwYXJ0aXRpb25LZXlMaXN0ID0gbWFrZUNvbHVtbkxpc3QocGFydGl0aW9uS2V5cyk7Ci0KLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlNFTEVDVCAlcyBGUk9NICVzLiVzIFdIRVJFIHRva2VuKCVzKT4/IEFORCB0b2tlbiglcyk8PT8iICsgZ2V0QWRkaXRpb25hbFdoZXJlQ2xhdXNlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RDb2x1bW5MaXN0LCBxdW90ZShrZXlzcGFjZSksIHF1b3RlKGNmTmFtZSksIHBhcnRpdGlvbktleUxpc3QsIHBhcnRpdGlvbktleUxpc3QpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEFkZGl0aW9uYWxXaGVyZUNsYXVzZXMoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHdoZXJlQ2xhdXNlID0gIiI7Ci0gICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KHVzZXJEZWZpbmVkV2hlcmVDbGF1c2VzKSkKLSAgICAgICAgICAgIHdoZXJlQ2xhdXNlICs9ICIgQU5EICIgKyB1c2VyRGVmaW5lZFdoZXJlQ2xhdXNlczsKLSAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzTm90RW1wdHkodXNlckRlZmluZWRXaGVyZUNsYXVzZXMpKQotICAgICAgICAgICAgd2hlcmVDbGF1c2UgKz0gIiBBTExPVyBGSUxURVJJTkciOwotICAgICAgICByZXR1cm4gd2hlcmVDbGF1c2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0U2VsZWN0Q29sdW1ucygpCi0gICAgewotICAgICAgICBMaXN0PFN0cmluZz4gc2VsZWN0Q29sdW1ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgICAgIGlmIChTdHJpbmdVdGlscy5pc05vdEVtcHR5KGlucHV0Q29sdW1ucykpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFdlIG11c3Qgc2VsZWN0IGFsbCB0aGUgcGFydGl0aW9uIGtleXMgcGx1cyBhbnkgb3RoZXIgY29sdW1ucyB0aGUgdXNlciB3YW50cwotICAgICAgICAgICAgc2VsZWN0Q29sdW1ucy5hZGRBbGwocGFydGl0aW9uS2V5cyk7Ci0gICAgICAgICAgICBmb3IgKFN0cmluZyBjb2x1bW4gOiBTcGxpdHRlci5vbignLCcpLnNwbGl0KGlucHV0Q29sdW1ucykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwYXJ0aXRpb25LZXlzLmNvbnRhaW5zKGNvbHVtbikpCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdENvbHVtbnMuYWRkKGNvbHVtbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlbGVjdENvbHVtbnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWFrZUNvbHVtbkxpc3QoQ29sbGVjdGlvbjxTdHJpbmc+IGNvbHVtbnMpCi0gICAgewotICAgICAgICByZXR1cm4gSm9pbmVyLm9uKCcsJykuam9pbihJdGVyYWJsZXMudHJhbnNmb3JtKGNvbHVtbnMsIG5ldyBGdW5jdGlvbjxTdHJpbmcsIFN0cmluZz4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFwcGx5KFN0cmluZyBjb2x1bW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHF1b3RlKGNvbHVtbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmV0Y2hLZXlzKCkKLSAgICB7Ci0gICAgICAgIC8vIGdldCBDRiBtZXRhIGRhdGEKLSAgICAgICAgVGFibGVNZXRhZGF0YSB0YWJsZU1ldGFkYXRhID0gc2Vzc2lvbi5nZXRDbHVzdGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRhZGF0YSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0S2V5c3BhY2UoTWV0YWRhdGEucXVvdGUoa2V5c3BhY2UpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRhYmxlKE1ldGFkYXRhLnF1b3RlKGNmTmFtZSkpOwotICAgICAgICBpZiAodGFibGVNZXRhZGF0YSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gdGFibGUgbWV0YWRhdGEgZm91bmQgZm9yICIgKyBrZXlzcGFjZSArICIuIiArIGNmTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy9IZXJlIHdlIGFzc3VtZSB0aGF0IHRhYmxlTWV0YWRhdGEuZ2V0UGFydGl0aW9uS2V5KCkgYWx3YXlzCi0gICAgICAgIC8vcmV0dXJucyB0aGUgbGlzdCBvZiBjb2x1bW5zIGluIG9yZGVyIG9mIGNvbXBvbmVudF9pbmRleAotICAgICAgICBmb3IgKENvbHVtbk1ldGFkYXRhIHBhcnRpdGlvbktleSA6IHRhYmxlTWV0YWRhdGEuZ2V0UGFydGl0aW9uS2V5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcnRpdGlvbktleXMuYWRkKHBhcnRpdGlvbktleS5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcXVvdGUoU3RyaW5nIGlkZW50aWZpZXIpCi0gICAgewotICAgICAgICByZXR1cm4gIlwiIiArIGlkZW50aWZpZXIucmVwbGFjZUFsbCgiXCIiLCAiXCJcIiIpICsgIlwiIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9DcWxSZWNvcmRXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbFJlY29yZFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmNlOTg5Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0NxbFJlY29yZFdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5jcWwzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50Lio7Ci0KLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLio7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLmV4Y2VwdGlvbnMuKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZUJ1ZmZlckFjY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQ29tcG9zaXRlVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oYWRvb3AuQ29uZmlnSGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhhZG9vcC5IYWRvb3BDb21wYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLm1hcHJlZHVjZS5SZWNvcmRXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AubWFwcmVkdWNlLlRhc2tBdHRlbXB0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC51dGlsLlByb2dyZXNzYWJsZTsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9NYXA7Ci0KLS8qKgotICogVGhlIDxjb2RlPkNxbFJlY29yZFdyaXRlcjwvY29kZT4gbWFwcyB0aGUgb3V0cHV0ICZsdDtrZXksIHZhbHVlJmd0OwotICogcGFpcnMgdG8gYSBDYXNzYW5kcmEgdGFibGUuIEluIHBhcnRpY3VsYXIsIGl0IGFwcGxpZXMgdGhlIGJpbmRlZCB2YXJpYWJsZXMKLSAqIGluIHRoZSB2YWx1ZSB0byB0aGUgcHJlcGFyZWQgc3RhdGVtZW50LCB3aGljaCBpdCBhc3NvY2lhdGVzIHdpdGggdGhlIGtleSwgYW5kIGluCi0gKiB0dXJuIHRoZSByZXNwb25zaWJsZSBlbmRwb2ludC4KLSAqCi0gKiA8cD4KLSAqIEZ1cnRoZXJtb3JlLCB0aGlzIHdyaXRlciBncm91cHMgdGhlIGNxbCBxdWVyaWVzIGJ5IHRoZSBlbmRwb2ludCByZXNwb25zaWJsZSBmb3IKLSAqIHRoZSByb3dzIGJlaW5nIGFmZmVjdGVkLiBUaGlzIGFsbG93cyB0aGUgY3FsIHF1ZXJpZXMgdG8gYmUgZXhlY3V0ZWQgaW4gcGFyYWxsZWwsCi0gKiBkaXJlY3RseSB0byBhIHJlc3BvbnNpYmxlIGVuZHBvaW50LgotICogPC9wPgotICoKLSAqIEBzZWUgQ3FsT3V0cHV0Rm9ybWF0Ci0gKi8KLWNsYXNzIENxbFJlY29yZFdyaXRlciBleHRlbmRzIFJlY29yZFdyaXRlcjxNYXA8U3RyaW5nLCBCeXRlQnVmZmVyPiwgTGlzdDxCeXRlQnVmZmVyPj4gaW1wbGVtZW50cwotICAgICAgICBvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuUmVjb3JkV3JpdGVyPE1hcDxTdHJpbmcsIEJ5dGVCdWZmZXI+LCBMaXN0PEJ5dGVCdWZmZXI+PiwgQXV0b0Nsb3NlYWJsZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDcWxSZWNvcmRXcml0ZXIuY2xhc3MpOwotCi0gICAgLy8gVGhlIGNvbmZpZ3VyYXRpb24gdGhpcyB3cml0ZXIgaXMgYXNzb2NpYXRlZCB3aXRoLgotICAgIHByb3RlY3RlZCBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmY7Ci0gICAgLy8gVGhlIG51bWJlciBvZiBtdXRhdGlvbnMgdG8gYnVmZmVyIHBlciBlbmRwb2ludAotICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgcXVldWVTaXplOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIGxvbmcgYmF0Y2hUaHJlc2hvbGQ7Ci0KLSAgICBwcm90ZWN0ZWQgUHJvZ3Jlc3NhYmxlIHByb2dyZXNzYWJsZTsKLSAgICBwcm90ZWN0ZWQgVGFza0F0dGVtcHRDb250ZXh0IGNvbnRleHQ7Ci0KLSAgICAvLyBUaGUgcmluZyBjYWNoZSB0aGF0IGRlc2NyaWJlcyB0aGUgdG9rZW4gcmFuZ2VzIGVhY2ggbm9kZSBpbiB0aGUgcmluZyBpcwotICAgIC8vIHJlc3BvbnNpYmxlIGZvci4gVGhpcyBpcyB3aGF0IGFsbG93cyB1cyB0byBncm91cCB0aGUgbXV0YXRpb25zIGJ5Ci0gICAgLy8gdGhlIGVuZHBvaW50cyB0aGV5IHNob3VsZCBiZSB0YXJnZXRlZCBhdC4gVGhlIHRhcmdldGVkIGVuZHBvaW50Ci0gICAgLy8gZXNzZW50aWFsbHkKLSAgICAvLyBhY3RzIGFzIHRoZSBwcmltYXJ5IHJlcGxpY2EgZm9yIHRoZSByb3dzIGJlaW5nIGFmZmVjdGVkIGJ5IHRoZSBtdXRhdGlvbnMuCi0gICAgcHJpdmF0ZSBmaW5hbCBOYXRpdmVSaW5nQ2FjaGUgcmluZ0NhY2hlOwotCi0gICAgLy8gaGFuZGxlcyBmb3IgY2xpZW50cyBmb3IgZWFjaCByYW5nZSBydW5uaW5nIGluIHRoZSB0aHJlYWRwb29sCi0gICAgcHJvdGVjdGVkIGZpbmFsIE1hcDxJbmV0QWRkcmVzcywgUmFuZ2VDbGllbnQ+IGNsaWVudHM7Ci0KLSAgICAvLyBob3N0IHRvIHByZXBhcmVkIHN0YXRlbWVudCBpZCBtYXBwaW5ncwotICAgIHByb3RlY3RlZCBmaW5hbCBDb25jdXJyZW50SGFzaE1hcDxTZXNzaW9uLCBQcmVwYXJlZFN0YXRlbWVudD4gcHJlcGFyZWRTdGF0ZW1lbnRzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFNlc3Npb24sIFByZXBhcmVkU3RhdGVtZW50PigpOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBjcWw7Ci0KLSAgICBwcm90ZWN0ZWQgTGlzdDxDb2x1bW5NZXRhZGF0YT4gcGFydGl0aW9uS2V5Q29sdW1uczsKLSAgICBwcm90ZWN0ZWQgTGlzdDxDb2x1bW5NZXRhZGF0YT4gY2x1c3RlckNvbHVtbnM7Ci0KLSAgICAvKioKLSAgICAgKiBVcG9uIGNvbnN0cnVjdGlvbiwgb2J0YWluIHRoZSBtYXAgdGhhdCB0aGlzIHdyaXRlciB3aWxsIHVzZSB0byBjb2xsZWN0Ci0gICAgICogbXV0YXRpb25zLCBhbmQgdGhlIHJpbmcgY2FjaGUgZm9yIHRoZSBnaXZlbiBrZXlzcGFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSB0YXNrIGF0dGVtcHQgY29udGV4dAotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKi8KLSAgICBDcWxSZWNvcmRXcml0ZXIoVGFza0F0dGVtcHRDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhpcyhIYWRvb3BDb21wYXQuZ2V0Q29uZmlndXJhdGlvbihjb250ZXh0KSk7Ci0gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgQ3FsUmVjb3JkV3JpdGVyKENvbmZpZ3VyYXRpb24gY29uZiwgUHJvZ3Jlc3NhYmxlIHByb2dyZXNzYWJsZSkKLSAgICB7Ci0gICAgICAgIHRoaXMoY29uZik7Ci0gICAgICAgIHRoaXMucHJvZ3Jlc3NhYmxlID0gcHJvZ3Jlc3NhYmxlOwotICAgIH0KLQotICAgIENxbFJlY29yZFdyaXRlcihDb25maWd1cmF0aW9uIGNvbmYpCi0gICAgewotICAgICAgICB0aGlzLmNvbmYgPSBjb25mOwotICAgICAgICB0aGlzLnF1ZXVlU2l6ZSA9IGNvbmYuZ2V0SW50KENxbE91dHB1dEZvcm1hdC5RVUVVRV9TSVpFLCAzMiAqIEZCVXRpbGl0aWVzLmdldEF2YWlsYWJsZVByb2Nlc3NvcnMoKSk7Ci0gICAgICAgIGJhdGNoVGhyZXNob2xkID0gY29uZi5nZXRMb25nKENxbE91dHB1dEZvcm1hdC5CQVRDSF9USFJFU0hPTEQsIDMyKTsKLSAgICAgICAgdGhpcy5jbGllbnRzID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBTdHJpbmcga2V5c3BhY2UgPSBDb25maWdIZWxwZXIuZ2V0T3V0cHV0S2V5c3BhY2UoY29uZik7Ci0KLSAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBDcWxDb25maWdIZWxwZXIuZ2V0T3V0cHV0Q2x1c3RlcihDb25maWdIZWxwZXIuZ2V0T3V0cHV0SW5pdGlhbEFkZHJlc3MoY29uZiksIGNvbmYpKQotICAgICAgICB7Ci0gICAgICAgICAgICBNZXRhZGF0YSBtZXRhZGF0YSA9IGNsdXN0ZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgIHJpbmdDYWNoZSA9IG5ldyBOYXRpdmVSaW5nQ2FjaGUoY29uZiwgbWV0YWRhdGEpOwotICAgICAgICAgICAgVGFibGVNZXRhZGF0YSB0YWJsZU1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0S2V5c3BhY2UoTWV0YWRhdGEucXVvdGUoa2V5c3BhY2UpKS5nZXRUYWJsZShDb25maWdIZWxwZXIuZ2V0T3V0cHV0Q29sdW1uRmFtaWx5KGNvbmYpKTsKLSAgICAgICAgICAgIGNsdXN0ZXJDb2x1bW5zID0gdGFibGVNZXRhZGF0YS5nZXRDbHVzdGVyaW5nQ29sdW1ucygpOwotICAgICAgICAgICAgcGFydGl0aW9uS2V5Q29sdW1ucyA9IHRhYmxlTWV0YWRhdGEuZ2V0UGFydGl0aW9uS2V5KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBjcWxRdWVyeSA9IENxbENvbmZpZ0hlbHBlci5nZXRPdXRwdXRDcWwoY29uZikudHJpbSgpOwotICAgICAgICAgICAgaWYgKGNxbFF1ZXJ5LnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5zdGFydHNXaXRoKCJpbnNlcnQiKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIklOU0VSVCB3aXRoIENxbFJlY29yZFdyaXRlciBpcyBub3Qgc3VwcG9ydGVkLCBwbGVhc2UgdXNlIFVQREFURS9ERUxFVEUgc3RhdGVtZW50Iik7Ci0gICAgICAgICAgICBjcWwgPSBhcHBlbmRLZXlXaGVyZUNsYXVzZXMoY3FsUXVlcnkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9zZSB0aGlzIDxjb2RlPlJlY29yZFdyaXRlcjwvY29kZT4gdG8gZnV0dXJlIG9wZXJhdGlvbnMsIGJ1dCBub3QgYmVmb3JlCi0gICAgICogZmx1c2hpbmcgb3V0IHRoZSBiYXRjaGVkIG11dGF0aW9ucy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSB0YXNrCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsb3NlKFRhc2tBdHRlbXB0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjbG9zZSgpOwotICAgIH0KLQotICAgIC8qKiBGaWxscyB0aGUgZGVwcmVjYXRlZCBSZWNvcmRXcml0ZXIgaW50ZXJmYWNlIGZvciBzdHJlYW1pbmcuICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgdm9pZCBjbG9zZShvcmcuYXBhY2hlLmhhZG9vcC5tYXByZWQuUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gY2xvc2UgYWxsIHRoZSBjbGllbnRzIGJlZm9yZSB0aHJvd2luZyBhbnl0aGluZwotICAgICAgICBJT0V4Y2VwdGlvbiBjbGllbnRFeGNlcHRpb24gPSBudWxsOwotICAgICAgICBmb3IgKFJhbmdlQ2xpZW50IGNsaWVudCA6IGNsaWVudHMudmFsdWVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2xpZW50RXhjZXB0aW9uID0gZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbGllbnRFeGNlcHRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IGNsaWVudEV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUga2V5IGlzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHZhbGlkIHZhbHVlLCBhIG11dGF0aW9uIGlzIGNyZWF0ZWQKLSAgICAgKiBmb3IgaXQgd2l0aCB0aGUgZ2l2ZW4gdGFibGUgYW5kIGNvbHVtbnMuIEluIHRoZSBldmVudCB0aGUgdmFsdWUKLSAgICAgKiBpbiB0aGUgY29sdW1uIGlzIG1pc3NpbmcgKGkuZS4sIG51bGwpLCB0aGVuIGl0IGlzIG1hcmtlZCBmb3IKLSAgICAgKiB7QGxpbmsgRGVsZXRpb259LiBTaW1pbGFybHksIGlmIHRoZSBlbnRpcmUgdmFsdWUgZm9yIGEga2V5IGlzIG1pc3NpbmcKLSAgICAgKiAoaS5lLiwgbnVsbCksIHRoZW4gdGhlIGVudGlyZSBrZXkgaXMgbWFya2VkIGZvciB7QGxpbmsgRGVsZXRpb259LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBrZXlDb2x1bW5zCi0gICAgICogICAgICAgICAgICB0aGUga2V5IHRvIHdyaXRlLgotICAgICAqIEBwYXJhbSB2YWx1ZXMKLSAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZXMgdG8gd3JpdGUuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKE1hcDxTdHJpbmcsIEJ5dGVCdWZmZXI+IGtleUNvbHVtbnMsIExpc3Q8Qnl0ZUJ1ZmZlcj4gdmFsdWVzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFRva2VuUmFuZ2UgcmFuZ2UgPSByaW5nQ2FjaGUuZ2V0UmFuZ2UoZ2V0UGFydGl0aW9uS2V5KGtleUNvbHVtbnMpKTsKLQotICAgICAgICAvLyBnZXQgdGhlIGNsaWVudCBmb3IgdGhlIGdpdmVuIHJhbmdlLCBvciBjcmVhdGUgYSBuZXcgb25lCi0gICAgICAgIGZpbmFsIEluZXRBZGRyZXNzIGFkZHJlc3MgPSByaW5nQ2FjaGUuZ2V0RW5kcG9pbnRzKHJhbmdlKS5nZXQoMCk7Ci0gICAgICAgIFJhbmdlQ2xpZW50IGNsaWVudCA9IGNsaWVudHMuZ2V0KGFkZHJlc3MpOwotICAgICAgICBpZiAoY2xpZW50ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGhhdmVuJ3Qgc2VlbiBrZXlzIGZvciB0aGlzIHJhbmdlOiBjcmVhdGUgbmV3IGNsaWVudAotICAgICAgICAgICAgY2xpZW50ID0gbmV3IFJhbmdlQ2xpZW50KHJpbmdDYWNoZS5nZXRFbmRwb2ludHMocmFuZ2UpKTsKLSAgICAgICAgICAgIGNsaWVudC5zdGFydCgpOwotICAgICAgICAgICAgY2xpZW50cy5wdXQoYWRkcmVzcywgY2xpZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGFkZCBwcmltYXJ5IGtleSBjb2x1bW5zIHRvIHRoZSBiaW5kIHZhcmlhYmxlcwotICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IGFsbFZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8Qnl0ZUJ1ZmZlcj4odmFsdWVzKTsKLSAgICAgICAgZm9yIChDb2x1bW5NZXRhZGF0YSBjb2x1bW4gOiBwYXJ0aXRpb25LZXlDb2x1bW5zKQotICAgICAgICAgICAgYWxsVmFsdWVzLmFkZChrZXlDb2x1bW5zLmdldChjb2x1bW4uZ2V0TmFtZSgpKSk7Ci0gICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgY29sdW1uIDogY2x1c3RlckNvbHVtbnMpCi0gICAgICAgICAgICBhbGxWYWx1ZXMuYWRkKGtleUNvbHVtbnMuZ2V0KGNvbHVtbi5nZXROYW1lKCkpKTsKLQotICAgICAgICBjbGllbnQucHV0KGFsbFZhbHVlcyk7Ci0KLSAgICAgICAgaWYgKHByb2dyZXNzYWJsZSAhPSBudWxsKQotICAgICAgICAgICAgcHJvZ3Jlc3NhYmxlLnByb2dyZXNzKCk7Ci0gICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpCi0gICAgICAgICAgICBIYWRvb3BDb21wYXQucHJvZ3Jlc3MoY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbG9zZVNlc3Npb24oU2Vzc2lvbiBzZXNzaW9uKQotICAgIHsKLSAgICAgICAgLy9DbG9zZSB0aGUgc2Vzc2lvbiB0byBzYXRpc2Z5IHRvIGF2b2lkIHdhcm5pbmdzIGZvciB0aGUgcmVzb3VyY2Ugbm90IGJlaW5nIGNsb3NlZAotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENsdXN0ZXIoKS5jbG9zZUFzeW5jKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIud2FybigiRXJyb3IgY2xvc2luZyBjb25uZWN0aW9uIiwgdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNsaWVudCB0aGF0IHJ1bnMgaW4gYSB0aHJlYWRwb29sIGFuZCBjb25uZWN0cyB0byB0aGUgbGlzdCBvZiBlbmRwb2ludHMgZm9yIGEgcGFydGljdWxhcgotICAgICAqIHJhbmdlLiBCb3VuZCB2YXJpYWJsZXMgZm9yIGtleXMgaW4gdGhhdCByYW5nZSBhcmUgc2VudCB0byB0aGlzIGNsaWVudCB2aWEgYSBxdWV1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgUmFuZ2VDbGllbnQgZXh0ZW5kcyBUaHJlYWQKLSAgICB7Ci0gICAgICAgIC8vIFRoZSBsaXN0IG9mIGVuZHBvaW50cyBmb3IgdGhpcyByYW5nZQotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgTGlzdDxJbmV0QWRkcmVzcz4gZW5kcG9pbnRzOwotICAgICAgICBwcm90ZWN0ZWQgQ2x1c3RlciBjbHVzdGVyID0gbnVsbDsKLSAgICAgICAgLy8gQSBib3VuZGVkIHF1ZXVlIG9mIGluY29taW5nIG11dGF0aW9ucyBmb3IgdGhpcyByYW5nZQotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQmxvY2tpbmdRdWV1ZTxMaXN0PEJ5dGVCdWZmZXI+PiBxdWV1ZSA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8TGlzdDxCeXRlQnVmZmVyPj4ocXVldWVTaXplKTsKLQotICAgICAgICBwcm90ZWN0ZWQgdm9sYXRpbGUgYm9vbGVhbiBydW4gPSB0cnVlOwotICAgICAgICAvLyB3ZSB3YW50IHRoZSBjYWxsZXIgdG8ga25vdyBpZiBzb21ldGhpbmcgd2VudCB3cm9uZywgc28gd2UgcmVjb3JkIGFueSB1bnJlY292ZXJhYmxlIGV4Y2VwdGlvbiB3aGlsZSB3cml0aW5nCi0gICAgICAgIC8vIHNvIHdlIGNhbiB0aHJvdyBpdCBvbiB0aGUgY2FsbGVyJ3Mgc3RhY2sgd2hlbiBoZSBjYWxscyBwdXQoKSBhZ2Fpbiwgb3IgaWYgdGhlcmUgYXJlIG5vIG1vcmUgcHV0IGNhbGxzLAotICAgICAgICAvLyB3aGVuIHRoZSBjbGllbnQgaXMgY2xvc2VkLgotICAgICAgICBwcm90ZWN0ZWQgdm9sYXRpbGUgSU9FeGNlcHRpb24gbGFzdEV4Y2VwdGlvbjsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ29uc3RydWN0cyBhbiB7QGxpbmsgUmFuZ2VDbGllbnR9IGZvciB0aGUgZ2l2ZW4gZW5kcG9pbnRzLgotICAgICAgICAgKiBAcGFyYW0gZW5kcG9pbnRzIHRoZSBwb3NzaWJsZSBlbmRwb2ludHMgdG8gZXhlY3V0ZSB0aGUgbXV0YXRpb25zIG9uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUmFuZ2VDbGllbnQoTGlzdDxJbmV0QWRkcmVzcz4gZW5kcG9pbnRzKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcigiY2xpZW50LSIgKyBlbmRwb2ludHMpOwotICAgICAgICAgICAgdGhpcy5lbmRwb2ludHMgPSBlbmRwb2ludHM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogZW5xdWV1ZXMgdGhlIGdpdmVuIHZhbHVlIHRvIENhc3NhbmRyYQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcHV0KExpc3Q8Qnl0ZUJ1ZmZlcj4gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobGFzdEV4Y2VwdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBsYXN0RXhjZXB0aW9uOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXVlLm9mZmVyKHZhbHVlLCAxMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIExvb3BzIGNvbGxlY3RpbmcgY3FsIGJpbmRlZCB2YXJpYWJsZSB2YWx1ZXMgZnJvbSB0aGUgcXVldWUgYW5kIHNlbmRpbmcgdG8gQ2Fzc2FuZHJhCi0gICAgICAgICAqLwotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBudWxsOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRlcjoKLSAgICAgICAgICAgICAgICB3aGlsZSAocnVuIHx8ICFxdWV1ZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IGJpbmRWYXJpYWJsZXM7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiaW5kVmFyaWFibGVzID0gcXVldWUudGFrZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZS1jaGVjayBsb29wIGNvbmRpdGlvbiBhZnRlciBpbnRlcnJ1cHQKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgTGlzdEl0ZXJhdG9yPEluZXRBZGRyZXNzPiBpdGVyID0gZW5kcG9pbnRzLmxpc3RJdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCB0aGUgbXV0YXRpb24gdG8gdGhlIGxhc3QtdXNlZCBlbmRwb2ludC4gIGZpcnN0IHRpbWUgdGhyb3VnaCwgdGhpcyB3aWxsIE5QRSBoYXJtbGVzc2x5LgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgc3RhdGVtZW50ID0gcHJlcGFyZWRTdGF0ZW1lbnQoc2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChiaW5kVmFyaWFibGVzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kU3RhdGVtZW50IGJvdW5kU3RhdGVtZW50ID0gbmV3IEJvdW5kU3RhdGVtZW50KHN0YXRlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjb2x1bW5Qb3NpdGlvbiA9IDA7IGNvbHVtblBvc2l0aW9uIDwgYmluZFZhcmlhYmxlcy5zaXplKCk7IGNvbHVtblBvc2l0aW9uKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRTdGF0ZW1lbnQuc2V0Qnl0ZXNVbnNhZmUoY29sdW1uUG9zaXRpb24sIGJpbmRWYXJpYWJsZXMuZ2V0KGNvbHVtblBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmV4ZWN1dGUoYm91bmRTdGF0ZW1lbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBiYXRjaFRocmVzaG9sZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRWYXJpYWJsZXMgPSBxdWV1ZS5wb2xsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlSW50ZXJuYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEV4Y2VwdGlvbiA9IG5ldyBJT0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdHRlbXB0IHRvIGNvbm5lY3QgdG8gYSBkaWZmZXJlbnQgZW5kcG9pbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzIGFkZHJlc3MgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IGFkZHJlc3MuZ2V0SG9zdE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyID0gQ3FsQ29uZmlnSGVscGVyLmdldE91dHB1dENsdXN0ZXIoaG9zdCwgY29uZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VTZXNzaW9uKHNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gPSBjbHVzdGVyLmNvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGNvbm5lY3Rpb24gZGllZCBkdWUgdG8gSW50ZXJydXB0LCBqdXN0IHRyeSBjb25uZWN0aW5nIHRvIHRoZSBlbmRwb2ludCBhZ2Fpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RoZXJlIGFyZSB0b28gbWFueSB3YXlzIGZvciB0aGUgVGhyZWFkLmludGVycnVwdGVkKCkgc3RhdGUgdG8gYmUgY2xlYXJlZCwgc28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3dlIGNhbid0IHJlbHkgb24gdGhhdCBoZXJlLiBVbnRpbCB0aGUgamF2YSBkcml2ZXIgZ2l2ZXMgdXMgYSBiZXR0ZXIgd2F5IG9mIGtub3dpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoYXQgdGhpcyBleGNlcHRpb24gY2FtZSBmcm9tIGFuIEludGVycnVwdGVkRXhjZXB0aW9uLCB0aGlzIGlzIHRoZSBiZXN0IHNvbHV0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5SZXRyeURyaXZlckNvbm5lY3Rpb24oZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnByZXZpb3VzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlSW50ZXJuYWwoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1vc3QgZXhjZXB0aW9ucyBtZWFuIHNvbWV0aGluZyB1bmV4cGVjdGVkIHdlbnQgd3JvbmcgdG8gdGhhdCBlbmRwb2ludCwgc28KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgdHJ5IGFnYWluIHRvIGFub3RoZXIuICBPdGhlciBleGNlcHRpb25zIChhdXRoIG9yIGludmFsaWQgcmVxdWVzdCkgYXJlIGZhdGFsLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZSBpbnN0YW5jZW9mIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHx8IGUgaW5zdGFuY2VvZiBJbnZhbGlkUXVlcnlFeGNlcHRpb24pIHx8ICFpdGVyLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RFeGNlcHRpb24gPSBuZXcgSU9FeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjbG9zZVNlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgLy8gY2xvc2UgYWxsIG91ciBjb25uZWN0aW9ucyBvbmNlIHdlIGFyZSBkb25lLgotICAgICAgICAgICAgICAgIGNsb3NlSW50ZXJuYWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKiBnZXQgcHJlcGFyZWQgc3RhdGVtZW50IGlkIGZyb20gY2FjaGUsIG90aGVyd2lzZSBwcmVwYXJlIGl0IGZyb20gQ2Fzc2FuZHJhIHNlcnZlciovCi0gICAgICAgIHByaXZhdGUgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZWRTdGF0ZW1lbnQoU2Vzc2lvbiBjbGllbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHN0YXRlbWVudCA9IHByZXBhcmVkU3RhdGVtZW50cy5nZXQoY2xpZW50KTsKLSAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQcmVwYXJlZFN0YXRlbWVudCByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjbGllbnQucHJlcGFyZShjcWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoTm9Ib3N0QXZhaWxhYmxlRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiZmFpbGVkIHRvIHByZXBhcmUgY3FsIHF1ZXJ5ICIgKyBjcWwsIGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHByZXZpb3VzSWQgPSBwcmVwYXJlZFN0YXRlbWVudHMucHV0SWZBYnNlbnQoY2xpZW50LCByZXN1bHQpOwotICAgICAgICAgICAgICAgIHN0YXRlbWVudCA9IHByZXZpb3VzSWQgPT0gbnVsbCA/IHJlc3VsdCA6IHByZXZpb3VzSWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgLy8gc3RvcCB0aGUgcnVuIGxvb3AuICB0aGlzIHdpbGwgcmVzdWx0IGluIGNsb3NlSW50ZXJuYWwgYmVpbmcgY2FsbGVkIGJ5IHRoZSB0aW1lIGpvaW4oKSBmaW5pc2hlcy4KLSAgICAgICAgICAgIHJ1biA9IGZhbHNlOwotICAgICAgICAgICAgaW50ZXJydXB0KCk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmpvaW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxhc3RFeGNlcHRpb24gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBsYXN0RXhjZXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgY2xvc2VJbnRlcm5hbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjbHVzdGVyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2x1c3Rlci5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNhblJldHJ5RHJpdmVyQ29ubmVjdGlvbihFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBEcml2ZXJFeGNlcHRpb24gJiYgZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIkNvbm5lY3Rpb24gdGhyZWFkIGludGVycnVwdGVkIikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE5vSG9zdEF2YWlsYWJsZUV4Y2VwdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKChOb0hvc3RBdmFpbGFibGVFeGNlcHRpb24pIGUpLmdldEVycm9ycygpLnNpemUoKSA9PSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gKChOb0hvc3RBdmFpbGFibGVFeGNlcHRpb24pIGUpLmdldEVycm9ycygpLnZhbHVlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2F1c2UgIT0gbnVsbCAmJiBjYXVzZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQnlJbnRlcnJ1cHRFeGNlcHRpb24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGdldFBhcnRpdGlvbktleShNYXA8U3RyaW5nLCBCeXRlQnVmZmVyPiBrZXlDb2x1bW5zKQotICAgIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciBwYXJ0aXRpb25LZXk7Ci0gICAgICAgIGlmIChwYXJ0aXRpb25LZXlDb2x1bW5zLnNpemUoKSA+IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSBrZXlzID0gbmV3IEJ5dGVCdWZmZXJbcGFydGl0aW9uS2V5Q29sdW1ucy5zaXplKCldOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8IGtleXMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAga2V5c1tpXSA9IGtleUNvbHVtbnMuZ2V0KHBhcnRpdGlvbktleUNvbHVtbnMuZ2V0KGkpLmdldE5hbWUoKSk7Ci0KLSAgICAgICAgICAgIHBhcnRpdGlvbktleSA9IENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBrZXlzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcnRpdGlvbktleSA9IGtleUNvbHVtbnMuZ2V0KHBhcnRpdGlvbktleUNvbHVtbnMuZ2V0KDApLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBhcnRpdGlvbktleTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBhZGQgd2hlcmUgY2xhdXNlcyBmb3IgcGFydGl0aW9uIGtleXMgYW5kIGNsdXN0ZXIgY29sdW1ucwotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGFwcGVuZEtleVdoZXJlQ2xhdXNlcyhTdHJpbmcgY3FsUXVlcnkpCi0gICAgewotICAgICAgICBTdHJpbmcga2V5V2hlcmVDbGF1c2UgPSAiIjsKLQotICAgICAgICBmb3IgKENvbHVtbk1ldGFkYXRhIHBhcnRpdGlvbktleSA6IHBhcnRpdGlvbktleUNvbHVtbnMpCi0gICAgICAgICAgICBrZXlXaGVyZUNsYXVzZSArPSBTdHJpbmcuZm9ybWF0KCIlcyA9ID8iLCBrZXlXaGVyZUNsYXVzZS5pc0VtcHR5KCkgPyBxdW90ZShwYXJ0aXRpb25LZXkuZ2V0TmFtZSgpKSA6ICgiIEFORCAiICsgcXVvdGUocGFydGl0aW9uS2V5LmdldE5hbWUoKSkpKTsKLSAgICAgICAgZm9yIChDb2x1bW5NZXRhZGF0YSBjbHVzdGVyQ29sdW1uIDogY2x1c3RlckNvbHVtbnMpCi0gICAgICAgICAgICBrZXlXaGVyZUNsYXVzZSArPSAiIEFORCAiICsgcXVvdGUoY2x1c3RlckNvbHVtbi5nZXROYW1lKCkpICsgIiA9ID8iOwotCi0gICAgICAgIHJldHVybiBjcWxRdWVyeSArICIgV0hFUkUgIiArIGtleVdoZXJlQ2xhdXNlOwotICAgIH0KLQotICAgIC8qKiBRdW90aW5nIGZvciB3b3JraW5nIHdpdGggdXBwZXJjYXNlICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgcXVvdGUoU3RyaW5nIGlkZW50aWZpZXIpCi0gICAgewotICAgICAgICByZXR1cm4gIlwiIiArIGlkZW50aWZpZXIucmVwbGFjZUFsbCgiXCIiLCAiXCJcIiIpICsgIlwiIjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgTmF0aXZlUmluZ0NhY2hlCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxUb2tlblJhbmdlLCBTZXQ8SG9zdD4+IHJhbmdlTWFwOwotICAgICAgICBwcml2YXRlIGZpbmFsIE1ldGFkYXRhIG1ldGFkYXRhOwotICAgICAgICBwcml2YXRlIGZpbmFsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lcjsKLQotICAgICAgICBwdWJsaWMgTmF0aXZlUmluZ0NhY2hlKENvbmZpZ3VyYXRpb24gY29uZiwgTWV0YWRhdGEgbWV0YWRhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucGFydGl0aW9uZXIgPSBDb25maWdIZWxwZXIuZ2V0T3V0cHV0UGFydGl0aW9uZXIoY29uZik7Ci0gICAgICAgICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgICAgICBTdHJpbmcga2V5c3BhY2UgPSBDb25maWdIZWxwZXIuZ2V0T3V0cHV0S2V5c3BhY2UoY29uZik7Ci0gICAgICAgICAgICB0aGlzLnJhbmdlTWFwID0gbWV0YWRhdGEuZ2V0VG9rZW5SYW5nZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdCh0b01hcChwIC0+IHAsIHAgLT4gbWV0YWRhdGEuZ2V0UmVwbGljYXMoJyInICsga2V5c3BhY2UgKyAnIicsIHApKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVG9rZW5SYW5nZSBnZXRSYW5nZShCeXRlQnVmZmVyIGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgVG9rZW4gdCA9IHBhcnRpdGlvbmVyLmdldFRva2VuKGtleSk7Ci0gICAgICAgICAgICBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuVG9rZW4gZHJpdmVyVG9rZW4gPSBtZXRhZGF0YS5uZXdUb2tlbihwYXJ0aXRpb25lci5nZXRUb2tlbkZhY3RvcnkoKS50b1N0cmluZyh0KSk7Ci0gICAgICAgICAgICBmb3IgKFRva2VuUmFuZ2UgcmFuZ2UgOiByYW5nZU1hcC5rZXlTZXQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocmFuZ2UuY29udGFpbnMoZHJpdmVyVG9rZW4pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgdG9rZW4gaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgZGVzY3JpYmVfcmluZzogIiArIHJhbmdlTWFwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaXN0PEluZXRBZGRyZXNzPiBnZXRFbmRwb2ludHMoVG9rZW5SYW5nZSByYW5nZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0PEhvc3Q+IGhvc3RTZXQgPSByYW5nZU1hcC5nZXQocmFuZ2UpOwotICAgICAgICAgICAgTGlzdDxJbmV0QWRkcmVzcz4gYWRkcmVzc2VzID0gbmV3IEFycmF5TGlzdDw+KGhvc3RTZXQuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoSG9zdCBob3N0OiBob3N0U2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZHJlc3Nlcy5hZGQoaG9zdC5nZXRBZGRyZXNzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3NlczsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0xpbWl0ZWRMb2NhbE5vZGVGaXJzdExvY2FsQmFsYW5jaW5nUG9saWN5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvY3FsMy9MaW1pdGVkTG9jYWxOb2RlRmlyc3RMb2NhbEJhbGFuY2luZ1BvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWI0ZWNhLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9jcWwzL0xpbWl0ZWRMb2NhbE5vZGVGaXJzdExvY2FsQmFsYW5jaW5nUG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wLmNxbDM7Ci0KLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ2x1c3RlcjsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuSG9zdDsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuSG9zdERpc3RhbmNlOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TdGF0ZW1lbnQ7Ci1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLnBvbGljaWVzLkxvYWRCYWxhbmNpbmdQb2xpY3k7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhdG9yczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0Lk5ldHdvcmtJbnRlcmZhY2U7Ci1pbXBvcnQgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlTZXQ7Ci0KLS8qKgotICogVGhpcyBsb2FkIGJhbGFuY2luZyBwb2xpY3kgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IGZvciBDcWxSZWNvcmRSZWFkZXIgd2hlbiBpdCBmZXRjaGVzIGEgcGFydGljdWxhciBzcGxpdC4KLSAqIDxwLz4KLSAqIEl0IGNob29zZXMgYWxpdmUgaG9zdHMgb25seSBmcm9tIHRoZSBzZXQgb2YgdGhlIGdpdmVuIHJlcGxpY2FzIC0gYmVjYXVzZSB0aGUgY29ubmVjdGlvbiBpcyB1c2VkIHRvIGxvYWQgdGhlIGRhdGEgZnJvbQotICogdGhlIHBhcnRpY3VsYXIgc3BsaXQsIHdpdGggYSBzdHJpY3RseSBkZWZpbmVkIGxpc3Qgb2YgdGhlIHJlcGxpY2FzLCBpdCBpcyBwb2ludGxlc3MgdG8gdHJ5IHRoZSBvdGhlciBub2Rlcy4KLSAqIFRoZSBwb2xpY3kgdHJhY2tzIHdoaWNoIG9mIHRoZSByZXBsaWNhcyBhcmUgYWxpdmUsIGFuZCB3aGVuIGEgbmV3IHF1ZXJ5IHBsYW4gaXMgcmVxdWVzdGVkLCBpdCByZXR1cm5zIHRob3NlIHJlcGxpY2FzCi0gKiBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotICogPHVsPgotICogPGxpPnRoZSBsb2NhbCBub2RlPC9saT4KLSAqIDxsaT50aGUgY29sbGVjdGlvbiBvZiB0aGUgcmVtYWluaW5nIGhvc3RzICh3aGljaCBpcyBzaHVmZmxlZCBvbiBlYWNoIHJlcXVlc3QpPC9saT4KLSAqIDwvdWw+Ci0gKi8KLWNsYXNzIExpbWl0ZWRMb2NhbE5vZGVGaXJzdExvY2FsQmFsYW5jaW5nUG9saWN5IGltcGxlbWVudHMgTG9hZEJhbGFuY2luZ1BvbGljeQotewotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihMaW1pdGVkTG9jYWxOb2RlRmlyc3RMb2NhbEJhbGFuY2luZ1BvbGljeS5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTZXQ8SW5ldEFkZHJlc3M+IGxvY2FsQWRkcmVzc2VzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KGdldExvY2FsSW5ldEFkZHJlc3NlcygpKTsKLQotICAgIHByaXZhdGUgZmluYWwgQ29weU9uV3JpdGVBcnJheVNldDxIb3N0PiBsaXZlUmVwbGljYUhvc3RzID0gbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8PigpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SW5ldEFkZHJlc3M+IHJlcGxpY2FBZGRyZXNzZXMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBhbGxvd2VkRENzID0gbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8PigpOwotCi0gICAgcHVibGljIExpbWl0ZWRMb2NhbE5vZGVGaXJzdExvY2FsQmFsYW5jaW5nUG9saWN5KFN0cmluZ1tdIHJlcGxpY2FzKQotICAgIHsKLSAgICAgICAgZm9yIChTdHJpbmcgcmVwbGljYSA6IHJlcGxpY2FzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJbmV0QWRkcmVzc1tdIGFkZHJlc3NlcyA9IEluZXRBZGRyZXNzLmdldEFsbEJ5TmFtZShyZXBsaWNhKTsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5hZGRBbGwocmVwbGljYUFkZHJlc3NlcywgYWRkcmVzc2VzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJJbnZhbGlkIHJlcGxpY2EgaG9zdCBuYW1lOiB7fSwgc2tpcHBpbmcgaXQiLCByZXBsaWNhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoIkNyZWF0ZWQgaW5zdGFuY2Ugd2l0aCB0aGUgZm9sbG93aW5nIHJlcGxpY2FzOiB7fSIsIEFycmF5cy5hc0xpc3QocmVwbGljYXMpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0KENsdXN0ZXIgY2x1c3RlciwgQ29sbGVjdGlvbjxIb3N0PiBob3N0cykKLSAgICB7Ci0gICAgICAgIC8vIGZpcnN0IGZpbmQgd2hpY2ggRENzIHRoZSB1c2VyIGRlZmluZWQKLSAgICAgICAgU2V0PFN0cmluZz4gZGNzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBmb3IgKEhvc3QgaG9zdCA6IGhvc3RzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocmVwbGljYUFkZHJlc3Nlcy5jb250YWlucyhob3N0LmdldEFkZHJlc3MoKSkpCi0gICAgICAgICAgICAgICAgZGNzLmFkZChob3N0LmdldERhdGFjZW50ZXIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZmlsdGVyIHRvIGFsbCBub2RlcyB3aXRoaW4gdGhlIHRhcmdldGVkIERDcwotICAgICAgICBMaXN0PEhvc3Q+IHJlcGxpY2FIb3N0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKEhvc3QgaG9zdCA6IGhvc3RzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGNzLmNvbnRhaW5zKGhvc3QuZ2V0RGF0YWNlbnRlcigpKSkKLSAgICAgICAgICAgICAgICByZXBsaWNhSG9zdHMuYWRkKGhvc3QpOwotICAgICAgICB9Ci0gICAgICAgIGxpdmVSZXBsaWNhSG9zdHMuYWRkQWxsKHJlcGxpY2FIb3N0cyk7Ci0gICAgICAgIGFsbG93ZWREQ3MuYWRkQWxsKGRjcyk7Ci0gICAgICAgIGxvZ2dlci50cmFjZSgiSW5pdGlhbGl6ZWQgd2l0aCByZXBsaWNhIGhvc3RzOiB7fSIsIHJlcGxpY2FIb3N0cyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgIHsKLSAgICAgICAgLy8KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSG9zdERpc3RhbmNlIGRpc3RhbmNlKEhvc3QgaG9zdCkKLSAgICB7Ci0gICAgICAgIGlmIChpc0xvY2FsSG9zdChob3N0KSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEhvc3REaXN0YW5jZS5MT0NBTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBIb3N0RGlzdGFuY2UuUkVNT1RFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEl0ZXJhdG9yPEhvc3Q+IG5ld1F1ZXJ5UGxhbihTdHJpbmcga2V5c3BhY2UsIFN0YXRlbWVudCBzdGF0ZW1lbnQpCi0gICAgewotICAgICAgICBMaXN0PEhvc3Q+IGxvY2FsID0gbmV3IEFycmF5TGlzdDw+KDEpOwotICAgICAgICBMaXN0PEhvc3Q+IHJlbW90ZSA9IG5ldyBBcnJheUxpc3Q8PihsaXZlUmVwbGljYUhvc3RzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoSG9zdCBsaXZlUmVwbGljYUhvc3QgOiBsaXZlUmVwbGljYUhvc3RzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNMb2NhbEhvc3QobGl2ZVJlcGxpY2FIb3N0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2NhbC5hZGQobGl2ZVJlcGxpY2FIb3N0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZW1vdGUuYWRkKGxpdmVSZXBsaWNhSG9zdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBDb2xsZWN0aW9ucy5zaHVmZmxlKHJlbW90ZSk7Ci0KLSAgICAgICAgbG9nZ2VyLnRyYWNlKCJVc2luZyB0aGUgZm9sbG93aW5nIGhvc3RzIG9yZGVyIGZvciB0aGUgbmV3IHF1ZXJ5IHBsYW46IHt9IHwge30iLCBsb2NhbCwgcmVtb3RlKTsKLQotICAgICAgICByZXR1cm4gSXRlcmF0b3JzLmNvbmNhdChsb2NhbC5pdGVyYXRvcigpLCByZW1vdGUuaXRlcmF0b3IoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BZGQoSG9zdCBob3N0KQotICAgIHsKLSAgICAgICAgaWYgKGxpdmVSZXBsaWNhSG9zdHMuY29udGFpbnMoaG9zdCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxpdmVSZXBsaWNhSG9zdHMuYWRkKGhvc3QpOwotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJBZGRlZCBhIG5ldyBob3N0IHt9IiwgaG9zdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblVwKEhvc3QgaG9zdCkKLSAgICB7Ci0gICAgICAgIGlmIChsaXZlUmVwbGljYUhvc3RzLmNvbnRhaW5zKGhvc3QpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsaXZlUmVwbGljYUhvc3RzLmFkZChob3N0KTsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiVGhlIGhvc3Qge30gaXMgbm93IHVwIiwgaG9zdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRvd24oSG9zdCBob3N0KQotICAgIHsKLSAgICAgICAgaWYgKGxpdmVSZXBsaWNhSG9zdHMucmVtb3ZlKGhvc3QpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoIlRoZSBob3N0IHt9IGlzIG5vdyBkb3duIiwgaG9zdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVtb3ZlKEhvc3QgaG9zdCkKLSAgICB7Ci0gICAgICAgIGlmIChsaXZlUmVwbGljYUhvc3RzLnJlbW92ZShob3N0KSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJSZW1vdmVkIHRoZSBob3N0IHt9IiwgaG9zdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblN1c3BlY3RlZChIb3N0IGhvc3QpCi0gICAgewotICAgICAgICAvLyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbG9hZCBiYWxhbmNpbmcgcG9saWN5Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsSG9zdChIb3N0IGhvc3QpCi0gICAgewotICAgICAgICBJbmV0QWRkcmVzcyBob3N0QWRkcmVzcyA9IGhvc3QuZ2V0QWRkcmVzcygpOwotICAgICAgICByZXR1cm4gaG9zdEFkZHJlc3MuaXNMb29wYmFja0FkZHJlc3MoKSB8fCBsb2NhbEFkZHJlc3Nlcy5jb250YWlucyhob3N0QWRkcmVzcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2V0PEluZXRBZGRyZXNzPiBnZXRMb2NhbEluZXRBZGRyZXNzZXMoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBTZXRzLm5ld0hhc2hTZXQoSXRlcmF0b3JzLmNvbmNhdCgKLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JzLnRyYW5zZm9ybSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcnMuZm9yRW51bWVyYXRpb24oTmV0d29ya0ludGVyZmFjZS5nZXROZXR3b3JrSW50ZXJmYWNlcygpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb248TmV0d29ya0ludGVyZmFjZSwgSXRlcmF0b3I8SW5ldEFkZHJlc3M+PigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPEluZXRBZGRyZXNzPiBhcHBseShOZXR3b3JrSW50ZXJmYWNlIG5ldElmYWNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSXRlcmF0b3JzLmZvckVudW1lcmF0aW9uKG5ldElmYWNlLmdldEluZXRBZGRyZXNzZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChTb2NrZXRFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkNvdWxkIG5vdCByZXRyaWV2ZSBsb2NhbCBuZXR3b3JrIGludGVyZmFjZXMuIiwgZSk7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9wYWNrYWdlLWluZm8uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hhZG9vcC9wYWNrYWdlLWluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1MTY1Yi4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oYWRvb3AvcGFja2FnZS1pbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIFRoaXMgcGFja2FnZSB3YXMgZGVwcmVjYXRlZC4gU2VlIENBU1NBTkRSQS0xNjk4NC4KLSAqLwotQERlcHJlY2F0ZWQKLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGFkb29wOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnQuamF2YQppbmRleCAzMDg5ODk0Li5jNjhjMjY2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludC5qYXZhCkBAIC0yMiwxMiArMjIsMTEgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7Ci0KIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkludHM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuTXV0YXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU3lzdGVtS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uSVZlcnNpb25lZFNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRCdWZmZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwpAQCAtMzgsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZzsKIGltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLnV0aWwuVmlzaWJsZUZvclRlc3Rpbmc7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfTUFYX0hJTlRfVFRMOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXMuc2l6ZW9mOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CkBAIC02MCw3ICs2MCw3IEBACiBwdWJsaWMgZmluYWwgY2xhc3MgSGludAogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFNlcmlhbGl6ZXIoKTsKLSAgICBzdGF0aWMgZmluYWwgaW50IG1heEhpbnRUVEwgPSBJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS5tYXhIaW50VFRMIiwgSW50ZWdlci5NQVhfVkFMVUUpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgbWF4SGludFRUTCA9IENBU1NBTkRSQV9NQVhfSElOVF9UVEwuZ2V0SW50KCk7CiAKICAgICBmaW5hbCBNdXRhdGlvbiBtdXRhdGlvbjsKICAgICBmaW5hbCBsb25nIGNyZWF0aW9uVGltZTsgIC8vIHRpbWUgb2YgaGludCBjcmVhdGlvbiAoaW4gbWlsbGlzZWNvbmRzKQpAQCAtMTIwLDcgKzEyMCw4IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlLmdldENhdXNlKCkpOworICAgICAgICAgICAgVGhyb3dhYmxlcy50aHJvd0lmVW5jaGVja2VkKGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldENhdXNlKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNzAsMTQgKzE3MSwxNCBAQAogICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoSGludCBoaW50LCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgb3V0LndyaXRlTG9uZyhoaW50LmNyZWF0aW9uVGltZSk7Ci0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoaGludC5nY2dzKTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGhpbnQuZ2Nncyk7CiAgICAgICAgICAgICBNdXRhdGlvbi5zZXJpYWxpemVyLnNlcmlhbGl6ZShoaW50Lm11dGF0aW9uLCBvdXQsIHZlcnNpb24pOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIEhpbnQgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBsb25nIGNyZWF0aW9uVGltZSA9IGluLnJlYWRMb25nKCk7Ci0gICAgICAgICAgICBpbnQgZ2NncyA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBnY2dzID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IEhpbnQoTXV0YXRpb24uc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgdmVyc2lvbiksIGNyZWF0aW9uVGltZSwgZ2Nncyk7CiAgICAgICAgIH0KIApAQCAtMTk4LDcgKzE5OSw3IEBACiAgICAgICAgIEhpbnQgZGVzZXJpYWxpemVJZkxpdmUoRGF0YUlucHV0UGx1cyBpbiwgbG9uZyBub3csIGxvbmcgc2l6ZSwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBsb25nIGNyZWF0aW9uVGltZSA9IGluLnJlYWRMb25nKCk7Ci0gICAgICAgICAgICBpbnQgZ2NncyA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBnY2dzID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICBpbnQgYnl0ZXNSZWFkID0gc2l6ZW9mKGNyZWF0aW9uVGltZSkgKyBzaXplb2ZVbnNpZ25lZFZJbnQoZ2Nncyk7CiAKICAgICAgICAgICAgIGlmIChpc0xpdmUoY3JlYXRpb25UaW1lLCBub3csIGdjZ3MpKQpAQCAtMjI2LDcgKzIyNyw3IEBACiAgICAgICAgICAgICB0cnkgKERhdGFJbnB1dEJ1ZmZlciBpbnB1dCA9IG5ldyBEYXRhSW5wdXRCdWZmZXIoaGVhZGVyKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBsb25nIGNyZWF0aW9uVGltZSA9IGlucHV0LnJlYWRMb25nKCk7Ci0gICAgICAgICAgICAgICAgaW50IGdjZ3MgPSAoaW50KSBpbnB1dC5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICAgICAgaW50IGdjZ3MgPSBpbnB1dC5yZWFkVW5zaWduZWRWSW50MzIoKTsKIAogICAgICAgICAgICAgICAgIGlmICghaXNMaXZlKGNyZWF0aW9uVGltZSwgbm93LCBnY2dzKSkKICAgICAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50TWVzc2FnZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludE1lc3NhZ2UuamF2YQppbmRleCA2MGQ3NjQxLi45NzhhYjQxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50TWVzc2FnZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRNZXNzYWdlLmphdmEKQEAgLTIyLDEwICsyMiwxMCBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuSW50czsKIAoraW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuVW5rbm93blRhYmxlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklWZXJzaW9uZWRBc3ltbWV0cmljU2VyaWFsaXplcjsKQEAgLTEzNSw3ICsxMzUsNyBAQAogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXJpYWxpemUoKSBjYWxsZWQgd2l0aCBub24tbWF0Y2hpbmcgdmVyc2lvbiAiICsgdmVyc2lvbik7CiAKICAgICAgICAgICAgICAgICBVVUlEU2VyaWFsaXplci5zZXJpYWxpemVyLnNlcmlhbGl6ZShtZXNzYWdlLmhvc3RJZCwgb3V0LCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQobWVzc2FnZS5oaW50LnJlbWFpbmluZygpKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihtZXNzYWdlLmhpbnQucmVtYWluaW5nKCkpOwogICAgICAgICAgICAgICAgIG91dC53cml0ZShtZXNzYWdlLmhpbnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludHNCdWZmZXJQb29sLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c0J1ZmZlclBvb2wuamF2YQppbmRleCA3OGYwN2RkLi5kZDU4MjlkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c0J1ZmZlclBvb2wuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c0J1ZmZlclBvb2wuamF2YQpAQCAtMjIsMTAgKzIyLDEwIEBACiBpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5VbmNoZWNrZWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk1BWF9ISU5UX0JVRkZFUlM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZXMubmV3QmxvY2tpbmdRdWV1ZTsKIAogLyoqCkBAIC0zOSw3ICszOSw3IEBACiAgICAgICAgIHZvaWQgZmx1c2goSGludHNCdWZmZXIgYnVmZmVyLCBIaW50c0J1ZmZlclBvb2wgcG9vbCk7CiAgICAgfQogCi0gICAgc3RhdGljIGZpbmFsIGludCBNQVhfQUxMT0NBVEVEX0JVRkZFUlMgPSBJbnRlZ2VyLmdldEludGVnZXIoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJNQVhfSElOVF9CVUZGRVJTIiwgMyk7CisgICAgc3RhdGljIGZpbmFsIGludCBNQVhfQUxMT0NBVEVEX0JVRkZFUlMgPSBNQVhfSElOVF9CVUZGRVJTLmdldEludCgpOwogICAgIHByaXZhdGUgdm9sYXRpbGUgSGludHNCdWZmZXIgY3VycmVudEJ1ZmZlcjsKICAgICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8SGludHNCdWZmZXI+IHJlc2VydmVCdWZmZXJzOwogICAgIHByaXZhdGUgZmluYWwgaW50IGJ1ZmZlclNpemU7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c0NhdGFsb2cuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRzQ2F0YWxvZy5qYXZhCmluZGV4IDg1OTI1MmYuLjZiYzAwMzAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRzQ2F0YWxvZy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRzQ2F0YWxvZy5qYXZhCkBAIC0yNiwxMCArMjYsMTEgQEAKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU0Vycm9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTUmVhZEVycm9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKQEAgLTE2MSw4ICsxNjIsMTQgQEAKICAgICAgICAgICAgICAgICBGaWxlVXRpbHMuaGFuZGxlRlNFcnJvckFuZFByb3BhZ2F0ZShlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChEYXRhYmFzZURlc2NyaXB0b3IuaXNDbGllbnRJbml0aWFsaXplZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIud2FybigiVW5hYmxlIHRvIG9wZW4gaGludCBkaXJlY3RvcnkgdXNpbmcgTmF0aXZlIGxpYnJhcnkuIFNraXBwaW5nIHN5bmMuIik7CisgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CisgICAgICAgICAgICBpZiAoU3luY1V0aWwuU0tJUF9TWU5DKQorICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5hYmxlIHRvIG9wZW4gZGlyZWN0b3J5IHt9IiwgaGludHNEaXJlY3RvcnkuYWJzb2x1dGVQYXRoKCkpOwogICAgICAgICAgICAgRmlsZVV0aWxzLmhhbmRsZUZTRXJyb3JBbmRQcm9wYWdhdGUobmV3IEZTV3JpdGVFcnJvcihuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVW5hYmxlIHRvIG9wZW4gaGludCBkaXJlY3RvcnkgJXMiLCBoaW50c0RpcmVjdG9yeS5hYnNvbHV0ZVBhdGgoKSkpLCBoaW50c0RpcmVjdG9yeS5hYnNvbHV0ZVBhdGgoKSkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c0Rlc2NyaXB0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRzRGVzY3JpcHRvci5qYXZhCmluZGV4IDhlMWY3ODIuLjhhYThiN2IgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRzRGVzY3JpcHRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRzRGVzY3JpcHRvci5qYXZhCkBAIC0xOSw3ICsxOSw2IEBACiAKIGltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dDsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTM3LDYgKzM2LDggQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVJbnB1dFN0cmVhbVBsdXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uQnl0ZVN0cmVhbXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uQ291bnRpbmdPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIApAQCAtNDksOCArNTAsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5FbmNyeXB0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5NYXJzaGFsRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkhleDsKLWltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTlZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy51cGRhdGVDaGVja3N1bUludDsKIApAQCAtMzY4LDcgKzM3MCw3IEBACiAgICAgICAgIG91dC53cml0ZUxvbmcoaG9zdElkLmdldExlYXN0U2lnbmlmaWNhbnRCaXRzKCkpOwogICAgICAgICB1cGRhdGVDaGVja3N1bUxvbmcoY3JjLCBob3N0SWQuZ2V0TGVhc3RTaWduaWZpY2FudEJpdHMoKSk7CiAKLSAgICAgICAgYnl0ZVtdIHBhcmFtc0J5dGVzID0gSlNPTlZhbHVlLnRvSlNPTlN0cmluZyhwYXJhbWV0ZXJzKS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICAgICAgYnl0ZVtdIHBhcmFtc0J5dGVzID0gSnNvblV0aWxzLndyaXRlQXNKc29uQnl0ZXMocGFyYW1ldGVycyk7CiAgICAgICAgIG91dC53cml0ZUludChwYXJhbXNCeXRlcy5sZW5ndGgpOwogICAgICAgICB1cGRhdGVDaGVja3N1bUludChjcmMsIHBhcmFtc0J5dGVzLmxlbmd0aCk7CiAgICAgICAgIG91dC53cml0ZUludCgoaW50KSBjcmMuZ2V0VmFsdWUoKSk7CkBAIC0zODcsMTAgKzM4OSwyMCBAQAogICAgICAgICBzaXplICs9IFR5cGVTaXplcy5zaXplb2YoaG9zdElkLmdldE1vc3RTaWduaWZpY2FudEJpdHMoKSk7CiAgICAgICAgIHNpemUgKz0gVHlwZVNpemVzLnNpemVvZihob3N0SWQuZ2V0TGVhc3RTaWduaWZpY2FudEJpdHMoKSk7CiAKLSAgICAgICAgYnl0ZVtdIHBhcmFtc0J5dGVzID0gSlNPTlZhbHVlLnRvSlNPTlN0cmluZyhwYXJhbWV0ZXJzKS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKLSAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mKHBhcmFtc0J5dGVzLmxlbmd0aCk7CisgICAgICAgIC8vIExldCdzIGF2b2lkIGFsbG9jYXRpb24gb2Ygc2VyaWFsaXplZCBvdXRwdXQsIHVzZSBjb3VudGluZyBvdXRwdXQgc3RyZWFtCisgICAgICAgIGludCBzZXJpYWxpemVkUGFyYW1zTGVuZ3RoOworICAgICAgICB0cnkgKENvdW50aW5nT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBDb3VudGluZ091dHB1dFN0cmVhbShCeXRlU3RyZWFtcy5udWxsT3V0cHV0U3RyZWFtKCkpKQorICAgICAgICB7CisgICAgICAgICAgICBKc29uVXRpbHMuSlNPTl9PQkpFQ1RfTUFQUEVSLndyaXRlVmFsdWUob3V0LCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRQYXJhbXNMZW5ndGggPSAoaW50KSBvdXQuZ2V0Q291bnQoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7IC8vIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgfQorICAgICAgICBzaXplICs9IFR5cGVTaXplcy5zaXplb2Yoc2VyaWFsaXplZFBhcmFtc0xlbmd0aCk7CiAgICAgICAgIHNpemUgKz0gNDsgLy8gc2l6ZSBjaGVja3N1bQotICAgICAgICBzaXplICs9IHBhcmFtc0J5dGVzLmxlbmd0aDsKKyAgICAgICAgc2l6ZSArPSBzZXJpYWxpemVkUGFyYW1zTGVuZ3RoOwogICAgICAgICBzaXplICs9IDQ7IC8vIHRvdGFsIGNoZWNrc3VtCiAKICAgICAgICAgcmV0dXJuIHNpemU7CkBAIC00MjgsNyArNDQwLDE4IEBACiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHJpdmF0ZSBzdGF0aWMgSW1tdXRhYmxlTWFwPFN0cmluZywgT2JqZWN0PiBkZWNvZGVKU09OQnl0ZXMoYnl0ZVtdIGJ5dGVzKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEltbXV0YWJsZU1hcC5jb3B5T2YoKE1hcDxTdHJpbmcsIE9iamVjdD4pIEpTT05WYWx1ZS5wYXJzZShuZXcgU3RyaW5nKGJ5dGVzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KSkpOworICAgICAgICAvLyBub3RlOiBUaGVyZSBpcyBhIEphY2tzb24gbW9kdWxlIChkYXRhdHlwZS1ndWF2YSkgZm9yIGRpcmVjdGx5IHJlYWRpbmcgaW50byBJbW11dGFibGVNYXAsCisgICAgICAgIC8vIGJ1dCB3b3VsZCByZXF1aXJlIGFkZGluZyBkZXBlbmRlbmN5IHRvIHRoYXQKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBJbW11dGFibGVNYXAuY29weU9mKEpzb25VdGlscy5mcm9tSnNvbk1hcChieXRlcykpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChNYXJzaGFsRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENvdXBsZSBvZiBvcHRpb25zIGhlcmU6IHVwIHRvIDQuMCBzaW1wbHkgcmV0dXJuZWQgbnVsbCBhbmQgY2FsbGVyIGZhaWxlZCB3aXRoIE5QRS4KKyAgICAgICAgICAgIC8vIFNlZW1zIGNsZWFuZXIgdG8gdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiQ29ycnVwdCBIaW50c0Rlc2NyaXB0b3Igc2VyaWFsaXphdGlvbiwgcHJvYmxlbTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlQ2hlY2tzdW1Mb25nKENSQzMyIGNyYywgbG9uZyB2YWx1ZSkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRzRGlzcGF0Y2hFeGVjdXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludHNEaXNwYXRjaEV4ZWN1dG9yLmphdmEKaW5kZXggMGYzNGRiNi4uNTQwZjViZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludHNEaXNwYXRjaEV4ZWN1dG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludHNEaXNwYXRjaEV4ZWN1dG9yLmphdmEKQEAgLTE5Miw3ICsxOTIsNyBAQAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gdHJhbnNmZXIoVVVJRCBob3N0SWQpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNhdGFsb2cuc3RvcmVzKCkKLSAgICAgICAgICAgICAgICAgICAubWFwKHN0b3JlIC0+IG5ldyBEaXNwYXRjaEhpbnRzVGFzayhzdG9yZSwgaG9zdElkKSkKKyAgICAgICAgICAgICAgICAgICAubWFwKHN0b3JlIC0+IG5ldyBEaXNwYXRjaEhpbnRzVGFzayhzdG9yZSwgaG9zdElkLCB0cnVlKSkKICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChSdW5uYWJsZTo6cnVuKTsKIAogICAgICAgICAgICAgcmV0dXJuICFjYXRhbG9nLmhhc0ZpbGVzKCk7CkBAIC0yMDUsMjEgKzIwNSwyNyBAQAogICAgICAgICBwcml2YXRlIGZpbmFsIFVVSUQgaG9zdElkOwogICAgICAgICBwcml2YXRlIGZpbmFsIFJhdGVMaW1pdGVyIHJhdGVMaW1pdGVyOwogCi0gICAgICAgIERpc3BhdGNoSGludHNUYXNrKEhpbnRzU3RvcmUgc3RvcmUsIFVVSUQgaG9zdElkKQorICAgICAgICBEaXNwYXRjaEhpbnRzVGFzayhIaW50c1N0b3JlIHN0b3JlLCBVVUlEIGhvc3RJZCwgYm9vbGVhbiBpc1RyYW5zZmVyKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgICB0aGlzLmhvc3RJZCA9IGhvc3RJZDsKIAotICAgICAgICAgICAgLy8gcmF0ZSBsaW1pdCBpcyBpbiBieXRlcyBwZXIgc2Vjb25kLiBVc2VzIERvdWJsZS5NQVhfVkFMVUUgaWYgZGlzYWJsZWQgKHNldCB0byAwIGluIGNhc3NhbmRyYS55YW1sKS4KLSAgICAgICAgICAgIC8vIG1heCByYXRlIGlzIHNjYWxlZCBieSB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBjbHVzdGVyIChDQVNTQU5EUkEtNTI3MikuCi0gICAgICAgICAgICAvLyB0aGUgZ29hbCBpcyB0byBib3VuZCBtYXhpbXVtIGhpbnRzIHRyYWZmaWMgZ29pbmcgdG93YXJkcyBhIHBhcnRpY3VsYXIgbm9kZSBmcm9tIHRoZSByZXN0IG9mIHRoZSBjbHVzdGVyLAotICAgICAgICAgICAgLy8gbm90IHRvdGFsIG91dGdvaW5nIGhpbnRzIHRyYWZmaWMgZnJvbSB0aGlzIG5vZGUgLSB0aGlzIGlzIHdoeSB0aGUgcmF0ZSBsaW1pdGVyIGlzIG5vdCBzaGFyZWQgYmV0d2VlbgorICAgICAgICAgICAgLy8gUmF0ZSBsaW1pdCBpcyBpbiBieXRlcyBwZXIgc2Vjb25kLiBVc2VzIERvdWJsZS5NQVhfVkFMVUUgaWYgZGlzYWJsZWQgKHNldCB0byAwIGluIGNhc3NhbmRyYS55YW1sKS4KKyAgICAgICAgICAgIC8vIE1heCByYXRlIGlzIHNjYWxlZCBieSB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBjbHVzdGVyIChDQVNTQU5EUkEtNTI3MiksIHVubGVzcyB3ZSBhcmUgdHJhbnNmZXJyaW5nCisgICAgICAgICAgICAvLyBoaW50cyBkdXJpbmcgZGVjb21pc3Npb24gcmF0aGVyIHRoYW4gZGlzcGF0Y2hpbmcgdGhlbSB0byB0aGVpciBmaW5hbCBkZXN0aW5hdGlvbi4KKyAgICAgICAgICAgIC8vIFRoZSBnb2FsIGlzIHRvIGJvdW5kIG1heGltdW0gaGludHMgdHJhZmZpYyBnb2luZyB0b3dhcmRzIGEgcGFydGljdWxhciBub2RlIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGNsdXN0ZXIsCisgICAgICAgICAgICAvLyBub3QgdG90YWwgb3V0Z29pbmcgaGludHMgdHJhZmZpYyBmcm9tIHRoaXMgbm9kZS4gVGhpcyBpcyB3aHkgdGhlIHJhdGUgbGltaXRlciBpcyBub3Qgc2hhcmVkIGJldHdlZW4KICAgICAgICAgICAgIC8vIGFsbCB0aGUgZGlzcGF0Y2ggdGFza3MgKGFzIHRoZXJlIHdpbGwgYmUgYXQgbW9zdCBvbmUgZGlzcGF0Y2ggdGFzayBmb3IgYSBwYXJ0aWN1bGFyIGhvc3QgaWQgYXQgYSB0aW1lKS4KLSAgICAgICAgICAgIGludCBub2Rlc0NvdW50ID0gTWF0aC5tYXgoMSwgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuZ2V0VG9rZW5NZXRhZGF0YSgpLmdldEFsbEVuZHBvaW50cygpLnNpemUoKSAtIDEpOworICAgICAgICAgICAgaW50IG5vZGVzQ291bnQgPSBpc1RyYW5zZmVyID8gMSA6IE1hdGgubWF4KDEsIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKS5nZXRBbGxFbmRwb2ludHMoKS5zaXplKCkgLSAxKTsKICAgICAgICAgICAgIGRvdWJsZSB0aHJvdHRsZUluQnl0ZXMgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SGludGVkSGFuZG9mZlRocm90dGxlSW5LaUIoKSAqIDEwMjQuMCAvIG5vZGVzQ291bnQ7CiAgICAgICAgICAgICB0aGlzLnJhdGVMaW1pdGVyID0gUmF0ZUxpbWl0ZXIuY3JlYXRlKHRocm90dGxlSW5CeXRlcyA9PSAwID8gRG91YmxlLk1BWF9WQUxVRSA6IHRocm90dGxlSW5CeXRlcyk7CiAgICAgICAgIH0KIAorICAgICAgICBEaXNwYXRjaEhpbnRzVGFzayhIaW50c1N0b3JlIHN0b3JlLCBVVUlEIGhvc3RJZCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcyhzdG9yZSwgaG9zdElkLCBmYWxzZSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRzV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50c1dyaXRlci5qYXZhCmluZGV4IDY2MzQyN2EuLjU5MWUwM2QgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRzV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludHNXcml0ZXIuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlN5bmNVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzLnVwZGF0ZUNoZWNrc3VtOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy51cGRhdGVDaGVja3N1bUludDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlcy5wZXJmb3JtOwpAQCAtNzgsNyArNzksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICAvLyB3cml0ZSB0aGUgZGVzY3JpcHRvcgogICAgICAgICAgICAgZGVzY3JpcHRvci5zZXJpYWxpemUoZG9iKTsKLSAgICAgICAgICAgIEJ5dGVCdWZmZXIgZGVzY3JpcHRvckJ5dGVzID0gZG9iLmJ1ZmZlcigpOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBkZXNjcmlwdG9yQnl0ZXMgPSBkb2IudW5zYWZlR2V0QnVmZmVyQW5kRmxpcCgpOwogICAgICAgICAgICAgdXBkYXRlQ2hlY2tzdW0oY3JjLCBkZXNjcmlwdG9yQnl0ZXMpOwogICAgICAgICAgICAgY2hhbm5lbC53cml0ZShkZXNjcmlwdG9yQnl0ZXMpOwogCkBAIC0yNDgsNyArMjQ5LDEwIEBACiAgICAgICAgICAgICAgICAgdXBkYXRlQ2hlY2tzdW1JbnQoY3JjLCBoaW50U2l6ZSk7CiAgICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KChpbnQpIGNyYy5nZXRWYWx1ZSgpKTsKIAorICAgICAgICAgICAgICAgIGxvbmcgc3RhcnRQb3NpdGlvbiA9IG91dC5wb3NpdGlvbigpOwogICAgICAgICAgICAgICAgIEhpbnQuc2VyaWFsaXplci5zZXJpYWxpemUoaGludCwgb3V0LCBkZXNjcmlwdG9yLm1lc3NhZ2luZ1ZlcnNpb24oKSk7CisgICAgICAgICAgICAgICAgbG9uZyBhY3R1YWxTaXplID0gb3V0LnBvc2l0aW9uKCkgLSBzdGFydFBvc2l0aW9uOworICAgICAgICAgICAgICAgIGNoZWNrU3RhdGUoYWN0dWFsU2l6ZSA9PSBoaW50U2l6ZSwgIlNlcmlhbGl6ZWQgaGludCBzaXplIGRvZXNuJ3QgbWF0Y2ggY2FsY3VsYXRlZCBoaW50IHNpemUiKTsKICAgICAgICAgICAgICAgICB1cGRhdGVDaGVja3N1bShjcmMsIGhpbnRCdWZmZXIsIGhpbnRCdWZmZXIucG9zaXRpb24oKSAtIGhpbnRTaXplLCBoaW50U2l6ZSk7CiAgICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KChpbnQpIGNyYy5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L0luZGV4LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9JbmRleC5qYXZhCmluZGV4IDlmNTFiMTYuLmYyMzA3YjkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L0luZGV4LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvSW5kZXguamF2YQpAQCAtMjYsMTMgKzI2LDE5IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5NZW10YWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5PcGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmFuZ2VUb21ic3RvbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVhZENvbW1hbmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVhZEV4ZWN1dGlvbkNvbnRyb2xsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVndWxhckFuZFN0YXRpY0NvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuV3JpdGVDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuUm93RmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25VcGRhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7CkBAIC00Miw4ICs0OCw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXgudHJhbnNhY3Rpb25zLkluZGV4VHJhbnNhY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuUmVkdWNpbmdLZXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRmx1c2hPYnNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVGbHVzaE9ic2VydmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5JbmRleE1ldGFkYXRhOwogCiAvKioKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L1NlY29uZGFyeUluZGV4TWFuYWdlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvU2Vjb25kYXJ5SW5kZXhNYW5hZ2VyLmphdmEKaW5kZXggOTNlY2Q1OS4uNGM0MTJhMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvU2Vjb25kYXJ5SW5kZXhNYW5hZ2VyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvU2Vjb25kYXJ5SW5kZXhNYW5hZ2VyLmphdmEKQEAgLTczLDYgKzczLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50Lio7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GT1JDRV9ERUZBVUxUX0lOREVYSU5HX1BBR0VfU0laRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRXhlY3V0b3JVdGlscy5hd2FpdFRlcm1pbmF0aW9uOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5FeGVjdXRvclV0aWxzLnNodXRkb3duOwogCkBAIC05OTEsNyArOTkyLDcgQEAKICAgICAgKi8KICAgICBwdWJsaWMgaW50IGNhbGN1bGF0ZUluZGV4aW5nUGFnZVNpemUoKQogICAgIHsKLSAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLmZvcmNlX2RlZmF1bHRfaW5kZXhpbmdfcGFnZV9zaXplIikpCisgICAgICAgIGlmIChGT1JDRV9ERUZBVUxUX0lOREVYSU5HX1BBR0VfU0laRS5nZXRCb29sZWFuKCkpCiAgICAgICAgICAgICByZXR1cm4gREVGQVVMVF9QQUdFX1NJWkU7CiAKICAgICAgICAgZG91YmxlIHRhcmdldFBhZ2VTaXplSW5CeXRlcyA9IDMyICogMTAyNCAqIDEwMjQ7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL1NBU0lJbmRleC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9TQVNJSW5kZXguamF2YQppbmRleCAxZTg2YmM2Li4zODU4OGQzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL1NBU0lJbmRleC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvU0FTSUluZGV4LmphdmEKQEAgLTE3LDE2ICsxNywzMCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2k7CiAKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTmF2aWdhYmxlTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CiAKIGltcG9ydCBjb20uZ29vZ2xlY29kZS5jb25jdXJyZW50dHJlZXMuY29tbW9uLkl0ZXJhYmxlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5PcGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkluZGV4VGFyZ2V0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2Fzc2FuZHJhV3JpdGVDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmFuZ2VUb21ic3RvbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVhZENvbW1hbmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVndWxhckFuZFN0YXRpY0NvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuV3JpdGVDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Sb3dGaWx0ZXI7CkBAIC00OSw5ICs2MywxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kucGxhbi5RdWVyeVBsYW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXgudHJhbnNhY3Rpb25zLkluZGV4VHJhbnNhY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGbHVzaE9ic2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUZsdXNoT2JzZXJ2ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5JTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuSU5vdGlmaWNhdGlvbkNvbnN1bWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuTWVtdGFibGVEaXNjYXJkZWROb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5NZW10YWJsZVJlbmV3ZWROb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5NZW10YWJsZVN3aXRjaGVkTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuU1NUYWJsZUFkZGVkTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuU1NUYWJsZUxpc3RDaGFuZ2VkTm90aWZpY2F0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuSW5kZXhNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9TQVNJSW5kZXhCdWlsZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL1NBU0lJbmRleEJ1aWxkZXIuamF2YQppbmRleCA1N2EzZjUxLi41NTViY2UxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL1NBU0lJbmRleEJ1aWxkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL1NBU0lJbmRleEJ1aWxkZXIuamF2YQpAQCAtMjEsMTMgKzIxLDEzIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2k7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dJbmRleEVudHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkluZm87CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwpAQCAtMzYsMTEgKzM2LDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS5jb25mLkNvbHVtbkluZGV4OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kuZGlzay5QZXJTU1RhYmxlSW5kZXhXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNSZWFkRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5LZXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5LZXlSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlSWRlbnRpdHlJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiAKQEAgLTUxLDI1ICs1MiwyOSBAQAogICAgIHByaXZhdGUgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOwogICAgIHByaXZhdGUgZmluYWwgVGltZVVVSUQgY29tcGFjdGlvbklkID0gbmV4dFRpbWVVVUlEKCk7CiAKKyAgICAvLyBLZWVwIHRhcmdldERpcmVjdG9yeSBmb3IgY29tcGFjdGlvbnMsIG5lZWRlZCBmb3IgYG5vZGV0b29sIGNvbXBhY3Rpb25zdGF0c2AKKyAgICBwcml2YXRlIFN0cmluZyB0YXJnZXREaXJlY3Rvcnk7CisKICAgICBwcml2YXRlIGZpbmFsIFNvcnRlZE1hcDxTU1RhYmxlUmVhZGVyLCBNYXA8Q29sdW1uTWV0YWRhdGEsIENvbHVtbkluZGV4Pj4gc3N0YWJsZXM7CiAKICAgICBwcml2YXRlIGxvbmcgYnl0ZXNQcm9jZXNzZWQgPSAwOwotICAgIHByaXZhdGUgZmluYWwgbG9uZyB0b3RhbFNpemVJbkJ5dGVzOworICAgIHByaXZhdGUgZmluYWwgbG9uZyB0b3RhbEJ5dGVzVG9Qcm9jZXNzOwogCiAgICAgcHVibGljIFNBU0lJbmRleEJ1aWxkZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBTb3J0ZWRNYXA8U1NUYWJsZVJlYWRlciwgTWFwPENvbHVtbk1ldGFkYXRhLCBDb2x1bW5JbmRleD4+IHNzdGFibGVzKQogICAgIHsKLSAgICAgICAgbG9uZyB0b3RhbEluZGV4Qnl0ZXMgPSAwOworICAgICAgICBsb25nIHRvdGFsQnl0ZXNUb1Byb2Nlc3MgPSAwOwogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzLmtleVNldCgpKQotICAgICAgICAgICAgdG90YWxJbmRleEJ5dGVzICs9IGdldFByaW1hcnlJbmRleExlbmd0aChzc3RhYmxlKTsKKyAgICAgICAgICAgIHRvdGFsQnl0ZXNUb1Byb2Nlc3MgKz0gc3N0YWJsZS51bmNvbXByZXNzZWRMZW5ndGgoKTsKIAogICAgICAgICB0aGlzLmNmcyA9IGNmczsKICAgICAgICAgdGhpcy5zc3RhYmxlcyA9IHNzdGFibGVzOwotICAgICAgICB0aGlzLnRvdGFsU2l6ZUluQnl0ZXMgPSB0b3RhbEluZGV4Qnl0ZXM7CisgICAgICAgIHRoaXMudG90YWxCeXRlc1RvUHJvY2VzcyA9IHRvdGFsQnl0ZXNUb1Byb2Nlc3M7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgYnVpbGQoKQogICAgIHsKICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGtleVZhbGlkYXRvciA9IGNmcy5tZXRhZGF0YSgpLnBhcnRpdGlvbktleVR5cGU7CisgICAgICAgIGxvbmcgcHJvY2Vzc2VkQnl0ZXNJbkZpbmlzaGVkU1NUYWJsZXMgPSAwOwogICAgICAgICBmb3IgKE1hcC5FbnRyeTxTU1RhYmxlUmVhZGVyLCBNYXA8Q29sdW1uTWV0YWRhdGEsIENvbHVtbkluZGV4Pj4gZSA6IHNzdGFibGVzLmVudHJ5U2V0KCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGUuZ2V0S2V5KCk7CkBAIC03OCw0NyArODMsNDcgQEAKICAgICAgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGRhdGFGaWxlID0gc3N0YWJsZS5vcGVuRGF0YVJlYWRlcigpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFBlclNTVGFibGVJbmRleFdyaXRlciBpbmRleFdyaXRlciA9IFNBU0lJbmRleC5uZXdXcml0ZXIoa2V5VmFsaWRhdG9yLCBzc3RhYmxlLmRlc2NyaXB0b3IsIGluZGV4ZXMsIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTik7CisgICAgICAgICAgICAgICAgdGFyZ2V0RGlyZWN0b3J5ID0gaW5kZXhXcml0ZXIuZ2V0RGVzY3JpcHRvcigpLmRpcmVjdG9yeS5wYXRoKCk7CiAKLSAgICAgICAgICAgICAgICBsb25nIHByZXZpb3VzS2V5UG9zaXRpb24gPSAwOwotICAgICAgICAgICAgICAgIHRyeSAoS2V5SXRlcmF0b3Iga2V5cyA9IG5ldyBLZXlJdGVyYXRvcihzc3RhYmxlLmRlc2NyaXB0b3IsIGNmcy5tZXRhZGF0YSgpKSkKKyAgICAgICAgICAgICAgICB0cnkgKEtleVJlYWRlciBrZXlzID0gc3N0YWJsZS5rZXlSZWFkZXIoKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFrZXlzLmlzRXhoYXVzdGVkKCkpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1N0b3BSZXF1ZXN0ZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uKGdldENvbXBhY3Rpb25JbmZvKCkpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEZWNvcmF0ZWRLZXkga2V5ID0ga2V5cy5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGtleVBvc2l0aW9uID0ga2V5cy5nZXRLZXlQb3NpdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRGVjb3JhdGVkS2V5IGtleSA9IHNzdGFibGUuZGVjb3JhdGVLZXkoa2V5cy5rZXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGtleVBvc2l0aW9uID0ga2V5cy5rZXlQb3NpdGlvbkZvclNlY29uZGFyeUluZGV4KCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4V3JpdGVyLnN0YXJ0UGFydGl0aW9uKGtleSwga2V5UG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhXcml0ZXIuc3RhcnRQYXJ0aXRpb24oa2V5LCBrZXlzLmRhdGFQb3NpdGlvbigpLCBrZXlQb3NpdGlvbik7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpbGUuc2VlayhrZXlzLmRhdGFQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoZGF0YUZpbGUpOyAvLyBrZXkKKworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IChTU1RhYmxlSWRlbnRpdHlJdGVyYXRvciBwYXJ0aXRpb24gPSBTU1RhYmxlSWRlbnRpdHlJdGVyYXRvci5jcmVhdGUoc3N0YWJsZSwgZGF0YUZpbGUsIGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihrZXksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWxlLnNlZWsoaW5kZXhFbnRyeS5wb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChkYXRhRmlsZSk7IC8vIGtleQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IChTU1RhYmxlSWRlbnRpdHlJdGVyYXRvciBwYXJ0aXRpb24gPSBTU1RhYmxlSWRlbnRpdHlJdGVyYXRvci5jcmVhdGUoc3N0YWJsZSwgZGF0YUZpbGUsIGtleSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHJvdyBoYXMgc3RhdGljcyBhdHRhY2hlZCwgaXQgaGFzIHRvIGJlIGluZGV4ZWQgc2VwYXJhdGVseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZnMubWV0YWRhdGEoKS5oYXNTdGF0aWNDb2x1bW5zKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgcm93IGhhcyBzdGF0aWNzIGF0dGFjaGVkLCBpdCBoYXMgdG8gYmUgaW5kZXhlZCBzZXBhcmF0ZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZnMubWV0YWRhdGEoKS5oYXNTdGF0aWNDb2x1bW5zKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFdyaXRlci5uZXh0VW5maWx0ZXJlZENsdXN0ZXIocGFydGl0aW9uLnN0YXRpY1JvdygpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFydGl0aW9uLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4V3JpdGVyLm5leHRVbmZpbHRlcmVkQ2x1c3RlcihwYXJ0aXRpb24ubmV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhXcml0ZXIubmV4dFVuZmlsdGVyZWRDbHVzdGVyKHBhcnRpdGlvbi5zdGF0aWNSb3coKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGU1JlYWRFcnJvcihleCwgc3N0YWJsZS5nZXRGaWxlbmFtZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJ0aXRpb24uaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFdyaXRlci5uZXh0VW5maWx0ZXJlZENsdXN0ZXIocGFydGl0aW9uLm5leHQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUHJvY2Vzc2VkICs9IGtleVBvc2l0aW9uIC0gcHJldmlvdXNLZXlQb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzS2V5UG9zaXRpb24gPSBrZXlQb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleXMuYWR2YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkYXRhUG9zaXRpb24gPSBrZXlzLmlzRXhoYXVzdGVkKCkgPyBzc3RhYmxlLnVuY29tcHJlc3NlZExlbmd0aCgpIDoga2V5cy5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUHJvY2Vzc2VkID0gcHJvY2Vzc2VkQnl0ZXNJbkZpbmlzaGVkU1NUYWJsZXMgKyBkYXRhUG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZVNTVGFibGUoaW5kZXhXcml0ZXIsIHNzdGFibGUsIGluZGV4ZXMudmFsdWVzKCkpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlNSZWFkRXJyb3IoZXgsIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByb2Nlc3NlZEJ5dGVzSW5GaW5pc2hlZFNTVGFibGVzICs9IHNzdGFibGUudW5jb21wcmVzc2VkTGVuZ3RoKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjgsMTUgKzEzMywxMCBAQAogICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKGNmcy5tZXRhZGF0YSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuSU5ERVhfQlVJTEQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTaXplSW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzVG9Qcm9jZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhY3Rpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlcy5rZXlTZXQoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBsb25nIGdldFByaW1hcnlJbmRleExlbmd0aChTU1RhYmxlIHNzdGFibGUpCi0gICAgewotICAgICAgICBGaWxlIHByaW1hcnlJbmRleCA9IG5ldyBGaWxlKHNzdGFibGUuZ2V0SW5kZXhGaWxlbmFtZSgpKTsKLSAgICAgICAgcmV0dXJuIHByaW1hcnlJbmRleC5leGlzdHMoKSA/IHByaW1hcnlJbmRleC5sZW5ndGgoKSA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZXMua2V5U2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RGlyZWN0b3J5KTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY29tcGxldGVTU1RhYmxlKFBlclNTVGFibGVJbmRleFdyaXRlciBpbmRleFdyaXRlciwgU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBDb2xsZWN0aW9uPENvbHVtbkluZGV4PiBpbmRleGVzKQpAQCAtMTQ1LDcgKzE0NSw3IEBACiAKICAgICAgICAgZm9yIChDb2x1bW5JbmRleCBpbmRleCA6IGluZGV4ZXMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgdG1wSW5kZXggPSBuZXcgRmlsZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoaW5kZXguZ2V0Q29tcG9uZW50KCkpKTsKKyAgICAgICAgICAgIEZpbGUgdG1wSW5kZXggPSBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihpbmRleC5nZXRDb21wb25lbnQoKSk7CiAgICAgICAgICAgICBpZiAoIXRtcEluZGV4LmV4aXN0cygpKSAvLyBubyBkYXRhIHdhcyBpbnNlcnRlZCBpbnRvIHRoZSBpbmRleCBmb3IgZ2l2ZW4gc3N0YWJsZQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL1NTVGFibGVJbmRleC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9TU1RhYmxlSW5kZXguamF2YQppbmRleCBkNzU2NzM3Li5kZTljMGMyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL1NTVGFibGVJbmRleC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvU1NUYWJsZUluZGV4LmphdmEKQEAgLTIyLDYgKzIyLDkgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuSGFzaENvZGVCdWlsZGVyOworCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kuY29uZi5Db2x1bW5JbmRleDsKQEAgLTM2LDEwICszOSw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWY7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5IYXNoQ29kZUJ1aWxkZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOwotCiBwdWJsaWMgY2xhc3MgU1NUYWJsZUluZGV4CiB7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb2x1bW5JbmRleCBjb2x1bW5JbmRleDsKQEAgLTE3Niw3ICsxNzUsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3N0YWJsZS5rZXlBdChvZmZzZXQpOworICAgICAgICAgICAgICAgIHJldHVybiBzc3RhYmxlLmtleUF0UG9zaXRpb25Gcm9tU2Vjb25kYXJ5SW5kZXgob2Zmc2V0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9jb25mL0NvbHVtbkluZGV4LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL2NvbmYvQ29sdW1uSW5kZXguamF2YQppbmRleCA4MWI3NzZkLi43ZDgyODc4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL2NvbmYvQ29sdW1uSW5kZXguamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL2NvbmYvQ29sdW1uSW5kZXguamF2YQpAQCAtMjgsMTMgKzI4LDEyIEBACiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLk9wZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5NZW10YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFzY2lpVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLmFuYWx5emVyLkFic3RyYWN0QW5hbHl6ZXI7CkBAIC00Nyw3ICs0Niw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS51dGlscy5SYW5nZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kudXRpbHMuUmFuZ2VVbmlvbkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuSW5kZXhNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIApAQCAtNzgsNyArNzksNyBAQAogICAgICAgICB0aGlzLm1vZGUgPSBJbmRleE1vZGUuZ2V0TW9kZShjb2x1bW4sIGNvbmZpZyk7CiAgICAgICAgIHRoaXMubWVtdGFibGUgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4obmV3IEluZGV4TWVtdGFibGUodGhpcykpOwogICAgICAgICB0aGlzLnRyYWNrZXIgPSBuZXcgRGF0YVRyYWNrZXIoa2V5VmFsaWRhdG9yLCB0aGlzKTsKLSAgICAgICAgdGhpcy5jb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KENvbXBvbmVudC5UeXBlLlNFQ09OREFSWV9JTkRFWCwgU3RyaW5nLmZvcm1hdChGSUxFX05BTUVfRk9STUFULCBnZXRJbmRleE5hbWUoKSkpOworICAgICAgICB0aGlzLmNvbXBvbmVudCA9IENvbXBvbmVudHMuVHlwZXMuU0VDT05EQVJZX0lOREVYLmNyZWF0ZUNvbXBvbmVudChTdHJpbmcuZm9ybWF0KEZJTEVfTkFNRV9GT1JNQVQsIGdldEluZGV4TmFtZSgpKSk7CiAgICAgICAgIHRoaXMuaXNUb2tlbml6ZWQgPSBnZXRBbmFseXplcigpLmlzVG9rZW5pemluZygpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9jb25mL0RhdGFUcmFja2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL2NvbmYvRGF0YVRyYWNrZXIuamF2YQppbmRleCBiZjIyOTNmLi45YjNlOWFiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL2NvbmYvRGF0YVRyYWNrZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL2NvbmYvRGF0YVRyYWNrZXIuamF2YQpAQCAtMjQsNiArMjQsOSBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kuU1NUYWJsZUluZGV4OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kuY29uZi52aWV3LlZpZXc7CkBAIC0zMSw5ICszNCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCiAvKiogYSBwYXJlZC1kb3duIHZlcnNpb24gb2YgRGF0YVRyYWNrZXIgYW5kIERULlZpZXcuIG5lZWQgb25lIGZvciBlYWNoIGluZGV4IG9mIGVhY2ggY29sdW1uIGZhbWlseSAqLwogcHVibGljIGNsYXNzIERhdGFUcmFja2VyCiB7CkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICAgICAgICAgIGlmIChzc3RhYmxlLmlzTWFya2VkQ29tcGFjdGVkKCkpCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgICAgIEZpbGUgaW5kZXhGaWxlID0gbmV3IEZpbGUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGNvbHVtbkluZGV4LmdldENvbXBvbmVudCgpKSk7CisgICAgICAgICAgICBGaWxlIGluZGV4RmlsZSA9IHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKGNvbHVtbkluZGV4LmdldENvbXBvbmVudCgpKTsKICAgICAgICAgICAgIGlmICghaW5kZXhGaWxlLmV4aXN0cygpKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL2Rpc2svT25EaXNrSW5kZXguamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvZGlzay9PbkRpc2tJbmRleC5qYXZhCmluZGV4IGU0MzgwNzkuLjg4YjI3MmEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvZGlzay9PbkRpc2tJbmRleC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvZGlzay9PbkRpc2tJbmRleC5qYXZhCkBAIC0xNywyMSArMTcsMzMgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLmRpc2s7CiAKLWltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5OYXZpZ2FibGVNYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhdG9yczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlBlZWtpbmdJdGVyYXRvcjsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLlRlcm07CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS5wbGFuLkV4cHJlc3Npb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS5wbGFuLkV4cHJlc3Npb24uT3A7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS51dGlscy5NYXBwZWRCdWZmZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS51dGlscy5SYW5nZVVuaW9uSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS51dGlscy5BYnN0cmFjdEl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kudXRpbHMuTWFwcGVkQnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kudXRpbHMuUmFuZ2VJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLnV0aWxzLlJhbmdlVW5pb25JdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1JlYWRFcnJvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkNoYW5uZWxQcm94eTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CkBAIC00MCwxMSArNTIsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhdG9yczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlBlZWtpbmdJdGVyYXRvcjsKLQogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLmRpc2suT25EaXNrQmxvY2suU2VhcmNoUmVzdWx0OwogCiBwdWJsaWMgY2xhc3MgT25EaXNrSW5kZXggaW1wbGVtZW50cyBJdGVyYWJsZTxPbkRpc2tJbmRleC5EYXRhVGVybT4sIENsb3NlYWJsZQpAQCAtMTQ0LDcgKzE1MSw3IEBACiAKICAgICAgICAgICAgIEZpbGVDaGFubmVsIGNoYW5uZWwgPSBpbmRleC5uZXdSZWFkQ2hhbm5lbCgpOwogICAgICAgICAgICAgaW5kZXhTaXplID0gY2hhbm5lbC5zaXplKCk7Ci0gICAgICAgICAgICBpbmRleEZpbGUgPSBuZXcgTWFwcGVkQnVmZmVyKG5ldyBDaGFubmVsUHJveHkoaW5kZXhQYXRoLCBjaGFubmVsKSk7CisgICAgICAgICAgICBpbmRleEZpbGUgPSBuZXcgTWFwcGVkQnVmZmVyKG5ldyBDaGFubmVsUHJveHkoaW5kZXgsIGNoYW5uZWwpKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9kaXNrL1BlclNTVGFibGVJbmRleFdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9kaXNrL1BlclNTVGFibGVJbmRleFdyaXRlci5qYXZhCmluZGV4IGZiNWU5YjkuLmY4OWZmNjIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvZGlzay9QZXJTU1RhYmxlSW5kZXhXcml0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL2Rpc2svUGVyU1NUYWJsZUluZGV4V3JpdGVyLmphdmEKQEAgLTIxLDM1ICsyMSwzNyBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yUGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS5hbmFseXplci5BYnN0cmFjdEFuYWx5emVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kuY29uZi5Db2x1bW5JbmRleDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLnV0aWxzLkNvbWJpbmVkVGVybUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kudXRpbHMuVHlwZVV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNFcnJvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZsdXNoT2JzZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlRmx1c2hPYnNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkltbWVkaWF0ZUZ1dHVyZTsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKLQotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoLm5ld0NvdW50RG93bkxhdGNoOwpAQCAtOTgsMTUgKzEwMCwyNCBAQAogICAgICAgICAgICAgaW5kZXhlcy5wdXQoZW50cnkuZ2V0S2V5KCksIG5ld0luZGV4KGVudHJ5LmdldFZhbHVlKCkpKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBiZWdpbigpCiAgICAge30KIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0UGFydGl0aW9uKERlY29yYXRlZEtleSBrZXksIGxvbmcgY3VyUG9zaXRpb24pCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnRQYXJ0aXRpb24oRGVjb3JhdGVkS2V5IGtleSwgbG9uZyBrZXlQb3NpdGlvbiwgbG9uZyBLZXlQb3NpdGlvbkZvclNBU0kpCiAgICAgewogICAgICAgICBjdXJyZW50S2V5ID0ga2V5OwotICAgICAgICBjdXJyZW50S2V5UG9zaXRpb24gPSBjdXJQb3NpdGlvbjsKKyAgICAgICAgY3VycmVudEtleVBvc2l0aW9uID0gS2V5UG9zaXRpb25Gb3JTQVNJOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXRpY1JvdyhSb3cgc3RhdGljUm93KQorICAgIHsKKyAgICAgICAgbmV4dFVuZmlsdGVyZWRDbHVzdGVyKHN0YXRpY1Jvdyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbmV4dFVuZmlsdGVyZWRDbHVzdGVyKFVuZmlsdGVyZWQgdW5maWx0ZXJlZCkKICAgICB7CiAgICAgICAgIGlmICghdW5maWx0ZXJlZC5pc1JvdygpKQpAQCAtMTI2LDYgKzEzNyw3IEBACiAgICAgICAgIH0pOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlKCkKICAgICB7CiAgICAgICAgIGlmIChpc0NvbXBsZXRlKQpAQCAtMTY4LDcgKzE4MCw3IEBACiAgICAgcHJvdGVjdGVkIGNsYXNzIEluZGV4CiAgICAgewogICAgICAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBvdXRwdXRGaWxlOworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgRmlsZSBvdXRwdXRGaWxlOwogCiAgICAgICAgIHByaXZhdGUgZmluYWwgQ29sdW1uSW5kZXggY29sdW1uSW5kZXg7CiAgICAgICAgIHByaXZhdGUgZmluYWwgQWJzdHJhY3RBbmFseXplciBhbmFseXplcjsKQEAgLTE4Myw3ICsxOTUsNyBAQAogICAgICAgICBwdWJsaWMgSW5kZXgoQ29sdW1uSW5kZXggY29sdW1uSW5kZXgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMuY29sdW1uSW5kZXggPSBjb2x1bW5JbmRleDsKLSAgICAgICAgICAgIHRoaXMub3V0cHV0RmlsZSA9IGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoY29sdW1uSW5kZXguZ2V0Q29tcG9uZW50KCkpOworICAgICAgICAgICAgdGhpcy5vdXRwdXRGaWxlID0gZGVzY3JpcHRvci5maWxlRm9yKGNvbHVtbkluZGV4LmdldENvbXBvbmVudCgpKTsKICAgICAgICAgICAgIHRoaXMuYW5hbHl6ZXIgPSBjb2x1bW5JbmRleC5nZXRBbmFseXplcigpOwogICAgICAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgICAgIHRoaXMubWF4TWVtb3J5U2l6ZSA9IG1heE1lbW9yeVNpemUoY29sdW1uSW5kZXgpOwpAQCAtMjQ0LDE1ICsyNTYsMTQgQEAKICAgICAgICAgICAgIGZpbmFsIE9uRGlza0luZGV4QnVpbGRlciBidWlsZGVyID0gY3VycmVudEJ1aWxkZXI7CiAgICAgICAgICAgICBjdXJyZW50QnVpbGRlciA9IG5ld0luZGV4QnVpbGRlcigpOwogCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VnbWVudEZpbGUgPSBmaWxlbmFtZShpc0ZpbmFsKTsKKyAgICAgICAgICAgIGZpbmFsIEZpbGUgc2VnbWVudEZpbGUgPSBmaWxlKGlzRmluYWwpOwogCiAgICAgICAgICAgICByZXR1cm4gKCkgLT4gewogICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBuYW5vVGltZSgpOwogCiAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGaWxlIGluZGV4ID0gbmV3IEZpbGUoc2VnbWVudEZpbGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goaW5kZXgpID8gbmV3IE9uRGlza0luZGV4KGluZGV4LCBjb2x1bW5JbmRleC5nZXRWYWxpZGF0b3IoKSwgbnVsbCkgOiBudWxsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5maW5pc2goc2VnbWVudEZpbGUpID8gbmV3IE9uRGlza0luZGV4KHNlZ21lbnRGaWxlLCBjb2x1bW5JbmRleC5nZXRWYWxpZGF0b3IoKSwgbnVsbCkgOiBudWxsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHwgRlNFcnJvciBlKQogICAgICAgICAgICAgICAgIHsKQEAgLTMxMCwxMyArMzIxLDEzIEBACiAKICAgICAgICAgICAgICAgICAgICAgT25EaXNrSW5kZXhCdWlsZGVyIGJ1aWxkZXIgPSBuZXdJbmRleEJ1aWxkZXIoKTsKICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5maW5pc2goUGFpci5jcmVhdGUoY29tYmluZWRNaW4sIGNvbWJpbmVkTWF4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUob3V0cHV0RmlsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21iaW5lZFRlcm1JdGVyYXRvcihwYXJ0cykpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHwgRlNFcnJvciBlKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gZmx1c2ggaW5kZXgge30uIiwgb3V0cHV0RmlsZSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGUob3V0cHV0RmlsZSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEZpbGUudHJ5RGVsZXRlKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZpbmFsbHkKICAgICAgICAgICAgICAgICB7CkBAIC0zMzAsNyArMzQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShwYXJ0KTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZShvdXRwdXRGaWxlICsgIl8iICsgc2VnbWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGaWxlLndpdGhTdWZmaXgoIl8iICsgc2VnbWVudCkudHJ5RGVsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBsYXRjaC5kZWNyZW1lbnQoKTsKQEAgLTM0OCw5ICszNTksOSBAQAogICAgICAgICAgICAgcmV0dXJuIG5ldyBPbkRpc2tJbmRleEJ1aWxkZXIoa2V5VmFsaWRhdG9yLCBjb2x1bW5JbmRleC5nZXRWYWxpZGF0b3IoKSwgY29sdW1uSW5kZXguZ2V0TW9kZSgpLm1vZGUpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFN0cmluZyBmaWxlbmFtZShib29sZWFuIGlzRmluYWwpCisgICAgICAgIHB1YmxpYyBGaWxlIGZpbGUoYm9vbGVhbiBpc0ZpbmFsKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gb3V0cHV0RmlsZSArIChpc0ZpbmFsID8gIiIgOiAiXyIgKyBzZWdtZW50TnVtYmVyKyspOworICAgICAgICAgICAgcmV0dXJuIGlzRmluYWwgPyBvdXRwdXRGaWxlIDogb3V0cHV0RmlsZS53aXRoU3VmZml4KCJfIiArIHNlZ21lbnROdW1iZXIrKyk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL0lHZW5lcmljU2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vSUdlbmVyaWNTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlMjFjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL0lHZW5lcmljU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW87CisKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dDsKK2ltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXQ7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGludGVyZmFjZSBJR2VuZXJpY1NlcmlhbGl6ZXI8VCwgSSBleHRlbmRzIERhdGFJbnB1dCwgTyBleHRlbmRzIERhdGFPdXRwdXQ+Cit7CisgICAgdm9pZCBzZXJpYWxpemUoVCB0LCBPIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgVCBkZXNlcmlhbGl6ZShJIGluKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBsb25nIHNlcmlhbGl6ZWRTaXplKFQgdCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9JU2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vSVNlcmlhbGl6ZXIuamF2YQppbmRleCA2MzdhMWM3Li5kYTkwNDlkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9JU2VyaWFsaXplci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL0lTZXJpYWxpemVyLmphdmEKQEAgLTIyLDcgKzIyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIAotcHVibGljIGludGVyZmFjZSBJU2VyaWFsaXplcjxUPgorcHVibGljIGludGVyZmFjZSBJU2VyaWFsaXplcjxUPiBleHRlbmRzIElHZW5lcmljU2VyaWFsaXplcjxULCBEYXRhSW5wdXRQbHVzLCBEYXRhT3V0cHV0UGx1cz4KIHsKICAgICAvKioKICAgICAgKiBTZXJpYWxpemUgdGhlIHNwZWNpZmllZCB0eXBlIGludG8gdGhlIHNwZWNpZmllZCBEYXRhT3V0cHV0IGluc3RhbmNlLgpAQCAtMzIsNyArMzIsOCBAQAogICAgICAqIEBwYXJhbSBvdXQgRGF0YU91dHB1dCBpbnRvIHdoaWNoIHNlcmlhbGl6YXRpb24gbmVlZHMgdG8gaGFwcGVuLgogICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShUIHQsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIEBPdmVycmlkZQorICAgIHZvaWQgc2VyaWFsaXplKFQgdCwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICAvKioKICAgICAgKiBEZXNlcmlhbGl6ZSBmcm9tIHRoZSBzcGVjaWZpZWQgRGF0YUlucHV0IGluc3RhbmNlLgpAQCAtNDAsMTEgKzQxLDEzIEBACiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqIEByZXR1cm4gdGhlIHR5cGUgdGhhdCB3YXMgZGVzZXJpYWxpemVkCiAgICAgICovCi0gICAgcHVibGljIFQgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIEBPdmVycmlkZQorICAgIFQgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uOwogCi0gICAgcHVibGljIGxvbmcgc2VyaWFsaXplZFNpemUoVCB0KTsKKyAgICBAT3ZlcnJpZGUKKyAgICBsb25nIHNlcmlhbGl6ZWRTaXplKFQgdCk7CiAKLSAgICBwdWJsaWMgZGVmYXVsdCB2b2lkIHNraXAoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgZGVmYXVsdCB2b2lkIHNraXAoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBkZXNlcmlhbGl6ZShpbik7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vY29tcHJlc3MvQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyLmphdmEKaW5kZXggMDI0ZTRlZi4uN2Q1NGUwOSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vY29tcHJlc3MvQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9jb21wcmVzcy9Db21wcmVzc2VkU2VxdWVudGlhbFdyaXRlci5qYXZhCkBAIC0yOSw3ICsyOSwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQ2hlY2tzdW1Xcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXJPcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXByZXNzaW9uUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogCkBAIC02NiwxNCArNzEsMTQgQEAKICAgICAgKiBDcmVhdGUgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIgd2l0aG91dCBkaWdlc3QgZmlsZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBmaWxlIEZpbGUgdG8gd3JpdGUKLSAgICAgKiBAcGFyYW0gb2Zmc2V0c1BhdGggRmlsZSBuYW1lIHRvIHdyaXRlIGNvbXByZXNzaW9uIG1ldGFkYXRhCisgICAgICogQHBhcmFtIG9mZnNldHNGaWxlIEZpbGUgdG8gd3JpdGUgY29tcHJlc3Npb24gbWV0YWRhdGEKICAgICAgKiBAcGFyYW0gZGlnZXN0RmlsZSBGaWxlIHRvIHdyaXRlIGRpZ2VzdAogICAgICAqIEBwYXJhbSBvcHRpb24gV3JpdGUgb3B0aW9uIChidWZmZXIgc2l6ZSBhbmQgdHlwZSB3aWxsIGJlIHNldCB0aGUgc2FtZSBhcyBjb21wcmVzc2lvbiBwYXJhbXMpCiAgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgQ29tcHJlc3Npb24gbXBhcmFtZXRlcnMKICAgICAgKiBAcGFyYW0gc3N0YWJsZU1ldGFkYXRhQ29sbGVjdG9yIE1ldGFkYXRhIGNvbGxlY3RvcgogICAgICAqLwogICAgIHB1YmxpYyBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcihGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvZmZzZXRzUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBvZmZzZXRzRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBkaWdlc3RGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uIG9wdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb25QYXJhbXMgcGFyYW1ldGVycywKQEAgLTk1LDcgKzEwMCw3IEBACiAgICAgICAgIG1heENvbXByZXNzZWRMZW5ndGggPSBwYXJhbWV0ZXJzLm1heENvbXByZXNzZWRMZW5ndGgoKTsKIAogICAgICAgICAvKiBJbmRleCBGaWxlICgtQ29tcHJlc3Npb25JbmZvLmRiIGNvbXBvbmVudCkgYW5kIGl0J3MgaGVhZGVyICovCi0gICAgICAgIG1ldGFkYXRhV3JpdGVyID0gQ29tcHJlc3Npb25NZXRhZGF0YS5Xcml0ZXIub3BlbihwYXJhbWV0ZXJzLCBvZmZzZXRzUGF0aCk7CisgICAgICAgIG1ldGFkYXRhV3JpdGVyID0gQ29tcHJlc3Npb25NZXRhZGF0YS5Xcml0ZXIub3BlbihwYXJhbWV0ZXJzLCBvZmZzZXRzRmlsZSk7CiAKICAgICAgICAgdGhpcy5zc3RhYmxlTWV0YWRhdGFDb2xsZWN0b3IgPSBzc3RhYmxlTWV0YWRhdGFDb2xsZWN0b3I7CiAgICAgICAgIGNyY01ldGFkYXRhID0gbmV3IENoZWNrc3VtV3JpdGVyKG5ldyBEYXRhT3V0cHV0U3RyZWFtKENoYW5uZWxzLm5ld091dHB1dFN0cmVhbShjaGFubmVsKSkpOwpAQCAtMzk3LDQgKzQwMiw0IEBACiAgICAgICAgICAgICB0aGlzLm5leHRDaHVua0luZGV4ID0gbmV4dENodW5rSW5kZXg7CiAgICAgICAgIH0KICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vY29tcHJlc3MvQ29tcHJlc3Npb25NZXRhZGF0YS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vY29tcHJlc3MvQ29tcHJlc3Npb25NZXRhZGF0YS5qYXZhCmluZGV4IDVhZjljOTIuLmQyZmFiMzAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzaW9uTWV0YWRhdGEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9jb21wcmVzcy9Db21wcmVzc2lvbk1ldGFkYXRhLmphdmEKQEAgLTE3LDE0ICsxNywxMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzOwogCi1pbXBvcnQgamF2YS5uaW8uZmlsZS5Ob1N1Y2hGaWxlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0OwogaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dDsKIGltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuKjsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtMzIsNyArMjksNiBAQAogaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuTG9uZ3M7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CkBAIC00MCwxOCArMzYsMjUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1JlYWRFcnJvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uSVZlcnNpb25lZFNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSW5wdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZU91dHB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5NZW1vcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TYWZlTWVtb3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlRyYW5zYWN0aW9uYWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5UcmFuc2FjdGlvbmFsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuV3JhcHBlZFNoYXJlZENsb3NlYWJsZTsKIAogLyoqCiAgKiBIb2xkcyBtZXRhZGF0YSBhYm91dCBjb21wcmVzc2VkIGZpbGUKKyAqIFRPRE8gZXh0cmFjdCBpbnRlcmZhY2UgSUNvbXByZXNzaW9uTWV0YWRhdGEgd2hpY2ggd2lsbCBqdXN0IHByb3ZpZGUgbm9uLXJlc291cmNlIHByb3BlcnRpZXMKICAqLwotcHVibGljIGNsYXNzIENvbXByZXNzaW9uTWV0YWRhdGEKK3B1YmxpYyBjbGFzcyBDb21wcmVzc2lvbk1ldGFkYXRhIGV4dGVuZHMgV3JhcHBlZFNoYXJlZENsb3NlYWJsZQogewogICAgIC8vIGRhdGFMZW5ndGggY2FuIHJlcHJlc2VudCBlaXRoZXIgdGhlIHRydWUgbGVuZ3RoIG9mIHRoZSBmaWxlCiAgICAgLy8gb3Igc29tZSBzaG9ydGVyIHZhbHVlLCBpbiB0aGUgY2FzZSB3ZSB3YW50IHRvIGltcG9zZSBhIHNob3J0ZXIgbGltaXQgb24gcmVhZGVycwpAQCAtNjAsNDIgKzYzLDE4IEBACiAgICAgcHVibGljIGZpbmFsIGxvbmcgY29tcHJlc3NlZEZpbGVMZW5ndGg7CiAgICAgcHJpdmF0ZSBmaW5hbCBNZW1vcnkgY2h1bmtPZmZzZXRzOwogICAgIHByaXZhdGUgZmluYWwgbG9uZyBjaHVua09mZnNldHNTaXplOwotICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgaW5kZXhGaWxlUGF0aDsKKyAgICBwdWJsaWMgZmluYWwgRmlsZSBjaHVua3NJbmRleEZpbGU7CiAgICAgcHVibGljIGZpbmFsIENvbXByZXNzaW9uUGFyYW1zIHBhcmFtZXRlcnM7CiAKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgbWV0YWRhdGEgYWJvdXQgZ2l2ZW4gY29tcHJlc3NlZCBmaWxlIGluY2x1ZGluZyB1bmNvbXByZXNzZWQgZGF0YSBsZW5ndGgsIGNodW5rIHNpemUKLSAgICAgKiBhbmQgbGlzdCBvZiB0aGUgY2h1bmsgb2Zmc2V0cyBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLgotICAgICAqCi0gICAgICogVGhpcyBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uISBEb24ndCBjcmVhdGUgbW9yZSB0aGFuIG9uZSBmb3IgZWFjaAotICAgICAqIHNzdGFibGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YUZpbGVQYXRoIFBhdGggdG8gdGhlIGNvbXByZXNzZWQgZmlsZQotICAgICAqCi0gICAgICogQHJldHVybiBtZXRhZGF0YSBhYm91dCBnaXZlbiBjb21wcmVzc2VkIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBDb21wcmVzc2lvbk1ldGFkYXRhIGNyZWF0ZShTdHJpbmcgZGF0YUZpbGVQYXRoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZVdpdGhMZW5ndGgoZGF0YUZpbGVQYXRoLCBuZXcgRmlsZShkYXRhRmlsZVBhdGgpLmxlbmd0aCgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIENvbXByZXNzaW9uTWV0YWRhdGEgY3JlYXRlV2l0aExlbmd0aChTdHJpbmcgZGF0YUZpbGVQYXRoLCBsb25nIGNvbXByZXNzZWRMZW5ndGgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IENvbXByZXNzaW9uTWV0YWRhdGEoRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUoZGF0YUZpbGVQYXRoKSwgY29tcHJlc3NlZExlbmd0aCk7Ci0gICAgfQotCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIENvbXByZXNzaW9uTWV0YWRhdGEoRGVzY3JpcHRvciBkZXNjLCBsb25nIGNvbXByZXNzZWRMZW5ndGgpCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIENvbXByZXNzaW9uTWV0YWRhdGEgb3BlbihGaWxlIGNodW5rc0luZGV4RmlsZSwgbG9uZyBjb21wcmVzc2VkTGVuZ3RoLCBib29sZWFuIGhhc01heENvbXByZXNzZWRTaXplKQogICAgIHsKLSAgICAgICAgdGhpcyhkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5DT01QUkVTU0lPTl9JTkZPKSwgY29tcHJlc3NlZExlbmd0aCwgZGVzYy52ZXJzaW9uLmhhc01heENvbXByZXNzZWRMZW5ndGgoKSk7Ci0gICAgfQorICAgICAgICBDb21wcmVzc2lvblBhcmFtcyBwYXJhbWV0ZXJzOworICAgICAgICBsb25nIGRhdGFMZW5ndGg7CisgICAgICAgIE1lbW9yeSBjaHVua09mZnNldHM7CiAKLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwdWJsaWMgQ29tcHJlc3Npb25NZXRhZGF0YShTdHJpbmcgaW5kZXhGaWxlUGF0aCwgbG9uZyBjb21wcmVzc2VkTGVuZ3RoLCBib29sZWFuIGhhc01heENvbXByZXNzZWRTaXplKQotICAgIHsKLSAgICAgICAgdGhpcy5pbmRleEZpbGVQYXRoID0gaW5kZXhGaWxlUGF0aDsKLQotICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbVBsdXMgc3RyZWFtID0gbmV3IEZpbGUoaW5kZXhGaWxlUGF0aCkubmV3SW5wdXRTdHJlYW0oKSkKKyAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW1QbHVzIHN0cmVhbSA9IGNodW5rc0luZGV4RmlsZS5uZXdJbnB1dFN0cmVhbSgpKQogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmcgY29tcHJlc3Nvck5hbWUgPSBzdHJlYW0ucmVhZFVURigpOwogICAgICAgICAgICAgaW50IG9wdGlvbkNvdW50ID0gc3RyZWFtLnJlYWRJbnQoKTsKQEAgLTEyMCw3ICs5OSw2IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGRhdGFMZW5ndGggPSBzdHJlYW0ucmVhZExvbmcoKTsKLSAgICAgICAgICAgIGNvbXByZXNzZWRGaWxlTGVuZ3RoID0gY29tcHJlc3NlZExlbmd0aDsKICAgICAgICAgICAgIGNodW5rT2Zmc2V0cyA9IHJlYWRDaHVua09mZnNldHMoc3RyZWFtKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHwgTm9TdWNoRmlsZUV4Y2VwdGlvbiBlKQpAQCAtMTI5LDIyICsxMDcsMzkgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIGluZGV4RmlsZVBhdGgpOworICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIGNodW5rc0luZGV4RmlsZSk7CiAgICAgICAgIH0KIAotICAgICAgICB0aGlzLmNodW5rT2Zmc2V0c1NpemUgPSBjaHVua09mZnNldHMuc2l6ZSgpOworICAgICAgICByZXR1cm4gbmV3IENvbXByZXNzaW9uTWV0YWRhdGEoY2h1bmtzSW5kZXhGaWxlLCBwYXJhbWV0ZXJzLCBjaHVua09mZnNldHMsIGNodW5rT2Zmc2V0cy5zaXplKCksIGRhdGFMZW5ndGgsIGNvbXByZXNzZWRMZW5ndGgpOwogICAgIH0KIAogICAgIC8vIGRvIG5vdCBjYWxsIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHksIHVubGVzcyB1c2VkIGluIHRlc3RpbmcKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwdWJsaWMgQ29tcHJlc3Npb25NZXRhZGF0YShTdHJpbmcgZmlsZVBhdGgsIENvbXByZXNzaW9uUGFyYW1zIHBhcmFtZXRlcnMsIE1lbW9yeSBvZmZzZXRzLCBsb25nIG9mZnNldHNTaXplLCBsb25nIGRhdGFMZW5ndGgsIGxvbmcgY29tcHJlc3NlZExlbmd0aCkKKyAgICBwdWJsaWMgQ29tcHJlc3Npb25NZXRhZGF0YShGaWxlIGNodW5rc0luZGV4RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvblBhcmFtcyBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeSBjaHVua09mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBjaHVua09mZnNldHNTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZGF0YUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGNvbXByZXNzZWRGaWxlTGVuZ3RoKQogICAgIHsKLSAgICAgICAgdGhpcy5pbmRleEZpbGVQYXRoID0gZmlsZVBhdGg7CisgICAgICAgIHN1cGVyKGNodW5rT2Zmc2V0cyk7CisgICAgICAgIHRoaXMuY2h1bmtzSW5kZXhGaWxlID0gY2h1bmtzSW5kZXhGaWxlOwogICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOwogICAgICAgICB0aGlzLmRhdGFMZW5ndGggPSBkYXRhTGVuZ3RoOwotICAgICAgICB0aGlzLmNvbXByZXNzZWRGaWxlTGVuZ3RoID0gY29tcHJlc3NlZExlbmd0aDsKLSAgICAgICAgdGhpcy5jaHVua09mZnNldHMgPSBvZmZzZXRzOwotICAgICAgICB0aGlzLmNodW5rT2Zmc2V0c1NpemUgPSBvZmZzZXRzU2l6ZTsKKyAgICAgICAgdGhpcy5jb21wcmVzc2VkRmlsZUxlbmd0aCA9IGNvbXByZXNzZWRGaWxlTGVuZ3RoOworICAgICAgICB0aGlzLmNodW5rT2Zmc2V0cyA9IGNodW5rT2Zmc2V0czsKKyAgICAgICAgdGhpcy5jaHVua09mZnNldHNTaXplID0gY2h1bmtPZmZzZXRzU2l6ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbXByZXNzaW9uTWV0YWRhdGEoQ29tcHJlc3Npb25NZXRhZGF0YSBjb3B5KQorICAgIHsKKyAgICAgICAgc3VwZXIoY29weSk7CisgICAgICAgIHRoaXMuY2h1bmtzSW5kZXhGaWxlID0gY29weS5jaHVua3NJbmRleEZpbGU7CisgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IGNvcHkucGFyYW1ldGVyczsKKyAgICAgICAgdGhpcy5kYXRhTGVuZ3RoID0gY29weS5kYXRhTGVuZ3RoOworICAgICAgICB0aGlzLmNvbXByZXNzZWRGaWxlTGVuZ3RoID0gY29weS5jb21wcmVzc2VkRmlsZUxlbmd0aDsKKyAgICAgICAgdGhpcy5jaHVua09mZnNldHMgPSBjb3B5LmNodW5rT2Zmc2V0czsKKyAgICAgICAgdGhpcy5jaHVua09mZnNldHNTaXplID0gY29weS5jaHVua09mZnNldHNTaXplOwogICAgIH0KIAogICAgIHB1YmxpYyBJQ29tcHJlc3NvciBjb21wcmVzc29yKCkKQEAgLTE3MSwxMSArMTY2LDE5IEBACiAgICAgICAgIHJldHVybiBjaHVua09mZnNldHMuc2l6ZSgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZFRvKFJlZi5JZGVudGl0eUNvbGxlY3Rpb24gaWRlbnRpdGllcykKICAgICB7CisgICAgICAgIHN1cGVyLmFkZFRvKGlkZW50aXRpZXMpOwogICAgICAgICBpZGVudGl0aWVzLmFkZChjaHVua09mZnNldHMpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb21wcmVzc2lvbk1ldGFkYXRhIHNoYXJlZENvcHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wcmVzc2lvbk1ldGFkYXRhKHRoaXMpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJlYWQgb2Zmc2V0cyBvZiB0aGUgaW5kaXZpZHVhbCBjaHVua3MgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQuCiAgICAgICoKQEAgLTE4Myw3ICsxODYsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBjb2xsZWN0aW9uIG9mIHRoZSBjaHVuayBvZmZzZXRzLgogICAgICAqLwotICAgIHByaXZhdGUgTWVtb3J5IHJlYWRDaHVua09mZnNldHMoRGF0YUlucHV0IGlucHV0KQorICAgIHByaXZhdGUgc3RhdGljIE1lbW9yeSByZWFkQ2h1bmtPZmZzZXRzKEZpbGVJbnB1dFN0cmVhbVBsdXMgaW5wdXQpCiAgICAgewogICAgICAgICBmaW5hbCBpbnQgY2h1bmtDb3VudDsKICAgICAgICAgdHJ5CkBAIC0xOTQsNyArMTk3LDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZTUmVhZEVycm9yKGUsIGluZGV4RmlsZVBhdGgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEZTUmVhZEVycm9yKGUsIGlucHV0LmZpbGUpOwogICAgICAgICB9CiAKICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKQEAgLTIxOCwxMCArMjIxLDEwIEBACiAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVPRkV4Y2VwdGlvbikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiQ29ycnVwdGVkIEluZGV4IEZpbGUgJXM6IHJlYWQgJWQgYnV0IGV4cGVjdGVkICVkIGNodW5rcy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4RmlsZVBhdGgsIGksIGNodW5rQ291bnQpOwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihuZXcgSU9FeGNlcHRpb24obXNnLCBlKSwgaW5kZXhGaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZmlsZS5wYXRoKCksIGksIGNodW5rQ291bnQpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihuZXcgSU9FeGNlcHRpb24obXNnLCBlKSwgaW5wdXQuZmlsZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRlNSZWFkRXJyb3IoZSwgaW5kZXhGaWxlUGF0aCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgRlNSZWFkRXJyb3IoZSwgaW5wdXQuZmlsZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIzNywxMSArMjQwLDExIEBACiAgICAgICAgIGxvbmcgaWR4ID0gOCAqIChwb3NpdGlvbiAvIHBhcmFtZXRlcnMuY2h1bmtMZW5ndGgoKSk7CiAKICAgICAgICAgaWYgKGlkeCA+PSBjaHVua09mZnNldHNTaXplKQotICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKG5ldyBFT0ZFeGNlcHRpb24oKSwgaW5kZXhGaWxlUGF0aCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24obmV3IEVPRkV4Y2VwdGlvbigpLCBjaHVua3NJbmRleEZpbGUpOwogCiAgICAgICAgIGlmIChpZHggPCAwKQogICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBuZWdhdGl2ZSBjaHVuayBpbmRleCAlZCB3aXRoIHBvc2l0aW9uICVkIiwgaWR4LCBwb3NpdGlvbikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4RmlsZVBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rc0luZGV4RmlsZSk7CiAKICAgICAgICAgbG9uZyBjaHVua09mZnNldCA9IGNodW5rT2Zmc2V0cy5nZXRMb25nKGlkeCk7CiAgICAgICAgIGxvbmcgbmV4dENodW5rT2Zmc2V0ID0gKGlkeCArIDggPT0gY2h1bmtPZmZzZXRzU2l6ZSkKQEAgLTI1MSw2ICsyNTQsMjggQEAKICAgICAgICAgcmV0dXJuIG5ldyBDaHVuayhjaHVua09mZnNldCwgKGludCkgKG5leHRDaHVua09mZnNldCAtIGNodW5rT2Zmc2V0IC0gNCkpOyAvLyAiNCIgYnl0ZXMgcmVzZXJ2ZWQgZm9yIGNoZWNrc3VtCiAgICAgfQogCisgICAgcHVibGljIGxvbmcgZ2V0RGF0YU9mZnNldEZvckNodW5rT2Zmc2V0KGxvbmcgY2h1bmtPZmZzZXQpCisgICAgeworICAgICAgICBsb25nIGwgPSAwOworICAgICAgICBsb25nIGggPSAoY2h1bmtPZmZzZXRzU2l6ZSA+PiAzKSAtIDE7CisgICAgICAgIGxvbmcgaWR4LCBvZmZzZXQ7CisKKyAgICAgICAgd2hpbGUgKGwgPD0gaCkKKyAgICAgICAgeworICAgICAgICAgICAgaWR4ID0gKGwgKyBoKSA+Pj4gMTsKKyAgICAgICAgICAgIG9mZnNldCA9IGNodW5rT2Zmc2V0cy5nZXRMb25nKGlkeCA8PCAzKTsKKworICAgICAgICAgICAgaWYgKG9mZnNldCA8IGNodW5rT2Zmc2V0KQorICAgICAgICAgICAgICAgIGwgPSBpZHggKyAxOworICAgICAgICAgICAgZWxzZSBpZiAob2Zmc2V0ID4gY2h1bmtPZmZzZXQpCisgICAgICAgICAgICAgICAgaCA9IGlkeCAtIDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIGlkeCAqIHBhcmFtZXRlcnMuY2h1bmtMZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIGNodW5rIHdpdGggb2Zmc2V0ICIgKyBjaHVua09mZnNldCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQHBhcmFtIHNlY3Rpb25zIENvbGxlY3Rpb24gb2Ygc2VjdGlvbnMgaW4gdW5jb21wcmVzc2VkIGZpbGUuIFNob3VsZCBub3QgY29udGFpbiBzZWN0aW9ucyB0aGF0IG92ZXJsYXAgZWFjaCBvdGhlci4KICAgICAgKiBAcmV0dXJuIFRvdGFsIGNodW5rIHNpemUgaW4gYnl0ZXMgZm9yIGdpdmVuIHNlY3Rpb25zIGluY2x1ZGluZyBjaGVja3N1bS4KQEAgLTMxNSwxNiArMzQwLDExIEBACiAgICAgICAgIHJldHVybiBvZmZzZXRzLnRvQXJyYXkobmV3IENodW5rW29mZnNldHMuc2l6ZSgpXSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgIHsKLSAgICAgICAgY2h1bmtPZmZzZXRzLmNsb3NlKCk7Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXcml0ZXIgZXh0ZW5kcyBUcmFuc2FjdGlvbmFsLkFic3RyYWN0VHJhbnNhY3Rpb25hbCBpbXBsZW1lbnRzIFRyYW5zYWN0aW9uYWwKICAgICB7CiAgICAgICAgIC8vIHBhdGggdG8gdGhlIGZpbGUKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wcmVzc2lvblBhcmFtcyBwYXJhbWV0ZXJzOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlUGF0aDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGZpbGU7CiAgICAgICAgIHByaXZhdGUgaW50IG1heENvdW50ID0gMTAwOwogICAgICAgICBwcml2YXRlIFNhZmVNZW1vcnkgb2Zmc2V0cyA9IG5ldyBTYWZlTWVtb3J5KG1heENvdW50ICogOEwpOwogICAgICAgICBwcml2YXRlIGludCBjb3VudCA9IDA7CkBAIC0zMzIsMTUgKzM1MiwxNSBAQAogICAgICAgICAvLyBwcm92aWRlZCBieSB1c2VyIHdoZW4gc2V0RGVzY3JpcHRvcgogICAgICAgICBwcml2YXRlIGxvbmcgZGF0YUxlbmd0aCwgY2h1bmtDb3VudDsKIAotICAgICAgICBwcml2YXRlIFdyaXRlcihDb21wcmVzc2lvblBhcmFtcyBwYXJhbWV0ZXJzLCBTdHJpbmcgcGF0aCkKKyAgICAgICAgcHJpdmF0ZSBXcml0ZXIoQ29tcHJlc3Npb25QYXJhbXMgcGFyYW1ldGVycywgRmlsZSBmaWxlKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOwotICAgICAgICAgICAgZmlsZVBhdGggPSBwYXRoOworICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgV3JpdGVyIG9wZW4oQ29tcHJlc3Npb25QYXJhbXMgcGFyYW1ldGVycywgU3RyaW5nIHBhdGgpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgV3JpdGVyIG9wZW4oQ29tcHJlc3Npb25QYXJhbXMgcGFyYW1ldGVycywgRmlsZSBmaWxlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFdyaXRlcihwYXJhbWV0ZXJzLCBwYXRoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV3JpdGVyKHBhcmFtZXRlcnMsIGZpbGUpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgYWRkT2Zmc2V0KGxvbmcgb2Zmc2V0KQpAQCAtMzc1LDcgKzM5NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIGZpbGVQYXRoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIGZpbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTM4Nyw2ICs0MDcsNyBAQAogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgZG9QcmVwYXJlKCkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0IGNodW5rQ291bnQgPT0gY291bnQ7CkBAIC00MDEsNyArNDIyLDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gZmx1c2ggdGhlIGRhdGEgdG8gZGlzawotICAgICAgICAgICAgdHJ5IChGaWxlT3V0cHV0U3RyZWFtUGx1cyBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbVBsdXMoZmlsZVBhdGgpKQorICAgICAgICAgICAgdHJ5IChGaWxlT3V0cHV0U3RyZWFtUGx1cyBvdXQgPSBmaWxlLm5ld091dHB1dFN0cmVhbShGaWxlLldyaXRlTW9kZS5PVkVSV1JJVEUpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHdyaXRlSGVhZGVyKG91dCwgZGF0YUxlbmd0aCwgY291bnQpOwogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKQEAgLTQxMiwxMSArNDMzLDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHwgTm9TdWNoRmlsZUV4Y2VwdGlvbiBmbmZlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGZuZmUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGZuZmUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCBmaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCBmaWxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC00MzUsNyArNDU2LDcgQEAKICAgICAgICAgICAgIGlmICh0Q291bnQgPCB0aGlzLmNvdW50KQogICAgICAgICAgICAgICAgIGNvbXByZXNzZWRMZW5ndGggPSB0T2Zmc2V0cy5nZXRMb25nKHRDb3VudCAqIDhMKTsKIAotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wcmVzc2lvbk1ldGFkYXRhKGZpbGVQYXRoLCBwYXJhbWV0ZXJzLCB0T2Zmc2V0cywgdENvdW50ICogOEwsIGRhdGFMZW5ndGgsIGNvbXByZXNzZWRMZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wcmVzc2lvbk1ldGFkYXRhKGZpbGUsIHBhcmFtZXRlcnMsIHRPZmZzZXRzLCB0Q291bnQgKiA4TCwgZGF0YUxlbmd0aCwgY29tcHJlc3NlZExlbmd0aCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTQ2MSwxNiArNDgyLDE5IEBACiAgICAgICAgICAgICBjb3VudCA9IGNodW5rSW5kZXg7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb1Bvc3RDbGVhbnVwKFRocm93YWJsZSBmYWlsZWQpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBvZmZzZXRzLmNsb3NlKGZhaWxlZCk7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb0NvbW1pdChUaHJvd2FibGUgYWNjdW11bGF0ZSkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb0Fib3J0KFRocm93YWJsZSBhY2N1bXVsYXRlKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKQEAgLTQ5NSw2ICs1MTksNyBAQAogICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSByZXR1cm4gdHJ1ZTsKQEAgLTUwNCw2ICs1MjksNyBAQAogICAgICAgICAgICAgcmV0dXJuIGxlbmd0aCA9PSBjaHVuay5sZW5ndGggJiYgb2Zmc2V0ID09IGNodW5rLm9mZnNldDsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKICAgICAgICAgewogICAgICAgICAgICAgaW50IHJlc3VsdCA9IChpbnQpIChvZmZzZXQgXiAob2Zmc2V0ID4+PiAzMikpOwpAQCAtNTExLDYgKzUzNyw3IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiQ2h1bms8b2Zmc2V0OiAlZCwgbGVuZ3RoOiAlZD4iLCBvZmZzZXQsIGxlbmd0aCk7CkBAIC01MTksMTcgKzU0NiwyMCBAQAogCiAgICAgc3RhdGljIGNsYXNzIENodW5rU2VyaWFsaXplciBpbXBsZW1lbnRzIElWZXJzaW9uZWRTZXJpYWxpemVyPENodW5rPgogICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShDaHVuayBjaHVuaywgRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIG91dC53cml0ZUxvbmcoY2h1bmsub2Zmc2V0KTsKICAgICAgICAgICAgIG91dC53cml0ZUludChjaHVuay5sZW5ndGgpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBDaHVuayBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBuZXcgQ2h1bmsoaW4ucmVhZExvbmcoKSwgaW4ucmVhZEludCgpKTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgbG9uZyBzZXJpYWxpemVkU2l6ZShDaHVuayBjaHVuaywgaW50IHZlcnNpb24pCiAgICAgICAgIHsKICAgICAgICAgICAgIGxvbmcgc2l6ZSA9IFR5cGVTaXplcy5zaXplb2YoY2h1bmsub2Zmc2V0KTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQWJzdHJhY3RNZXRyaWNzUHJvdmlkZXJzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Fic3RyYWN0TWV0cmljc1Byb3ZpZGVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjExNjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Fic3RyYWN0TWV0cmljc1Byb3ZpZGVycy5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1ldHJpY3NQcm92aWRlcnM8UiBleHRlbmRzIFNTVGFibGVSZWFkZXI+IGltcGxlbWVudHMgTWV0cmljc1Byb3ZpZGVycworeworICAgIHByb3RlY3RlZCBmaW5hbCA8VCBleHRlbmRzIE51bWJlcj4gR2F1Z2VQcm92aWRlcjxUPiBuZXdHYXVnZVByb3ZpZGVyKFN0cmluZyBuYW1lLCBGdW5jdGlvbjxJdGVyYWJsZTxSPiwgVD4gY29tYmluZXIpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUdhdWdlUHJvdmlkZXI8Pih0aGlzOjptYXAsIG5hbWUsIGNvbWJpbmVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgPFQgZXh0ZW5kcyBOdW1iZXI+IEdhdWdlUHJvdmlkZXI8VD4gbmV3R2F1Z2VQcm92aWRlcihTdHJpbmcgbmFtZSwgVCBuZXV0cmFsVmFsdWUsIEZ1bmN0aW9uPFIsIFQ+IGV4dHJhY3RvciwgQmlGdW5jdGlvbjxULCBULCBUPiBjb21iaW5lcikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgU2ltcGxlR2F1Z2VQcm92aWRlcjw+KHRoaXM6Om1hcCwgbmFtZSwgcmVhZGVycyAtPiB7CisgICAgICAgICAgICBUIHRvdGFsID0gbmV1dHJhbFZhbHVlOworICAgICAgICAgICAgZm9yIChSIHJlYWRlciA6IHJlYWRlcnMpCisgICAgICAgICAgICAgICAgdG90YWwgPSBjb21iaW5lci5hcHBseSh0b3RhbCwgZXh0cmFjdG9yLmFwcGx5KHJlYWRlcikpOworICAgICAgICAgICAgcmV0dXJuIHRvdGFsOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUiBtYXAoU1NUYWJsZVJlYWRlciByKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQWJzdHJhY3RSb3dJbmRleEVudHJ5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Fic3RyYWN0Um93SW5kZXhFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmY2ZiZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Fic3RyYWN0Um93SW5kZXhFbnRyeS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5JTWVhc3VyYWJsZU1lbW9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworCisvKioKKyAqIFRoZSBiYXNlIFJvd0luZGV4RW50cnkgaXMgbm90IHN0b3JlZCBvbiBkaXNrLCBvbmx5IHNwZWNpZmllcyBhIHBvc2l0aW9uIGluIHRoZSBkYXRhIGZpbGUKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Um93SW5kZXhFbnRyeSBpbXBsZW1lbnRzIElNZWFzdXJhYmxlTWVtb3J5Cit7CisgICAgcHVibGljIGZpbmFsIGxvbmcgcG9zaXRpb247CisKKyAgICBwdWJsaWMgQWJzdHJhY3RSb3dJbmRleEVudHJ5KGxvbmcgcG9zaXRpb24pCisgICAgeworICAgICAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUm93IHBvc2l0aW9uIGluIGEgZGF0YSBmaWxlCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0UG9zaXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBvc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGluZGV4IGVudHJ5IGNvbnRhaW5zIHRoZSByb3ctbGV2ZWwgdG9tYnN0b25lIGFuZCBjb2x1bW4gc3VtbWFyeS4gT3RoZXJ3aXNlLAorICAgICAqIGNhbGxlciBzaG91bGQgZmV0Y2ggdGhlc2UgZnJvbSB0aGUgcm93IGhlYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrQ291bnQoKSA+IDE7CisgICAgfQorCisgICAgcHVibGljIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIGludCBibG9ja0NvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBTU1RhYmxlRm9ybWF0PD8sID8+IGdldFNTVGFibGVGb3JtYXQoKTsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZSB0aGlzIGVudHJ5IGZvciBrZXkgY2FjaGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dCBzdHJlYW0gZm9yIHNlcmlhbGl6ZWQgZW50cnkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXJpYWxpemVGb3JDYWNoZShEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmMyMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9BYnN0cmFjdFNTVGFibGVJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNTg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5CdWZmZXJDbHVzdGVyaW5nQm91bmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWd1bGFyQW5kU3RhdGljQ29sdW1uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVW5maWx0ZXJlZERlc2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5VbmZpbHRlcmVkVmFsaWRhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRGVzZXJpYWxpemF0aW9uSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRW5jb2RpbmdTdGF0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJhbmdlVG9tYnN0b25lQm91bmRNYXJrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5SYW5nZVRvbWJzdG9uZU1hcmtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvd3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZy5WSW50T3V0T2ZSYW5nZUV4Y2VwdGlvbjsKKworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3I8UklFIGV4dGVuZHMgQWJzdHJhY3RSb3dJbmRleEVudHJ5PiBpbXBsZW1lbnRzIFVuZmlsdGVyZWRSb3dJdGVyYXRvcgoreworICAgIHByb3RlY3RlZCBmaW5hbCBTU1RhYmxlUmVhZGVyIHNzdGFibGU7CisgICAgLy8gV2UgY291bGQgdXNlIHNzdGFibGUubWV0YWRhdGEoKSwgYnV0IHRoYXQgY2FuIGNoYW5nZSBkdXJpbmcgZXhlY3V0aW9uIHNvIGl0J3MgZ29vZCBoeWdpZW5lIHRvIGdyYWIgYW4gaW1tdXRhYmxlIGluc3RhbmNlCisgICAgcHJvdGVjdGVkIGZpbmFsIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGE7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgRGVjb3JhdGVkS2V5IGtleTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgRGVsZXRpb25UaW1lIHBhcnRpdGlvbkxldmVsRGVsZXRpb247CisgICAgcHJvdGVjdGVkIGZpbmFsIENvbHVtbkZpbHRlciBjb2x1bW5zOworICAgIHByb3RlY3RlZCBmaW5hbCBEZXNlcmlhbGl6YXRpb25IZWxwZXIgaGVscGVyOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFJvdyBzdGF0aWNSb3c7CisgICAgcHJvdGVjdGVkIGZpbmFsIFJlYWRlciByZWFkZXI7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgRmlsZUhhbmRsZSBpZmlsZTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0Nsb3NlZDsKKworICAgIHByb3RlY3RlZCBmaW5hbCBTbGljZXMgc2xpY2VzOworCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gV2UgbmVlZCB0aGlzIGJlY2F1c2UgdGhlIGFuYWx5c2lzIGlzIG5vdCBhYmxlIHRvIGRldGVybWluZSB0aGF0IHdlIGRvIGNsb3NlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsZSBvbiBldmVyeSBwYXRoIHdoZXJlIHdlIGNyZWF0ZWQgaXQuCisgICAgcHJvdGVjdGVkIEFic3RyYWN0U1NUYWJsZUl0ZXJhdG9yKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURhdGFJbnB1dCBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSUUgaW5kZXhFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2VzIHNsaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIGNvbHVtbkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUhhbmRsZSBpZmlsZSkKKyAgICB7CisgICAgICAgIHRoaXMuc3N0YWJsZSA9IHNzdGFibGU7CisgICAgICAgIHRoaXMubWV0YWRhdGEgPSBzc3RhYmxlLm1ldGFkYXRhKCk7CisgICAgICAgIHRoaXMuaWZpbGUgPSBpZmlsZTsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbkZpbHRlcjsKKyAgICAgICAgdGhpcy5zbGljZXMgPSBzbGljZXM7CisgICAgICAgIHRoaXMuaGVscGVyID0gbmV3IERlc2VyaWFsaXphdGlvbkhlbHBlcihtZXRhZGF0YSwgc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24uY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb24oKSwgRGVzZXJpYWxpemF0aW9uSGVscGVyLkZsYWcuTE9DQUwsIGNvbHVtbkZpbHRlcik7CisKKyAgICAgICAgaWYgKGluZGV4RW50cnkgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wYXJ0aXRpb25MZXZlbERlbGV0aW9uID0gRGVsZXRpb25UaW1lLkxJVkU7CisgICAgICAgICAgICB0aGlzLnJlYWRlciA9IG51bGw7CisgICAgICAgICAgICB0aGlzLnN0YXRpY1JvdyA9IFJvd3MuRU1QVFlfU1RBVElDX1JPVzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlID0gZmlsZSA9PSBudWxsOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV2Ugc2VlayB0byB0aGUgYmVnaW5uaW5nIHRvIHRoZSBwYXJ0aXRpb24gaWYgZWl0aGVyOgorICAgICAgICAgICAgICAgIC8vICAgLSB0aGUgcGFydGl0aW9uIGlzIG5vdCBpbmRleGVkOyB3ZSB0aGVuIGhhdmUgYSBzaW5nbGUgYmxvY2sgdG8gcmVhZCBhbnl3YXkKKyAgICAgICAgICAgICAgICAvLyAgICAgKGFuZCB3ZSBuZWVkIHRvIHJlYWQgdGhlIHBhcnRpdGlvbiBkZWxldGlvbiB0aW1lKS4KKyAgICAgICAgICAgICAgICAvLyAgIC0gd2UncmUgcXVlcnlpbmcgc3RhdGljIGNvbHVtbnMuCisgICAgICAgICAgICAgICAgYm9vbGVhbiBuZWVkU2Vla0F0UGFydGl0aW9uU3RhcnQgPSAhaW5kZXhFbnRyeS5pc0luZGV4ZWQoKSB8fCAhY29sdW1ucy5mZXRjaGVkQ29sdW1ucygpLnN0YXRpY3MuaXNFbXB0eSgpOworCisgICAgICAgICAgICAgICAgaWYgKG5lZWRTZWVrQXRQYXJ0aXRpb25TdGFydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBpbmRleGVkIChvciBpcyByZWFkaW5nIHN0YXRpYyksIHNldCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJ0aXRpb24gYW5kIHJlYWQgcGFydGl0aW9uIGxldmVsIGRlbGV0aW9uIHRoZXJlCisgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gc3N0YWJsZS5nZXRGaWxlRGF0YUlucHV0KGluZGV4RW50cnkucG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnNlZWsoaW5kZXhFbnRyeS5wb3NpdGlvbik7CisKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuc2tpcFNob3J0TGVuZ3RoKGZpbGUpOyAvLyBTa2lwIHBhcnRpdGlvbiBrZXkKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJ0aXRpb25MZXZlbERlbGV0aW9uID0gRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZmlsZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyIGZpbGUgIT0gbnVsbCBhbmQgYWZ0ZXIgdGhlIHBhcnRpdGlvbkRlbGV0aW9uIGhhcyBiZWVuIHNldCwgYnV0IGJlZm9yZSByZWFkU3RhdGljUm93CisgICAgICAgICAgICAgICAgICAgIC8vIChzaW5jZSBpdCB1c2VzIGl0KSBzbyB3ZSBjYW4ndCBtb3ZlIHRoYXQgdXAgKGJ1dCB3ZSdsbCBiZSBhYmxlIHRvIHNpbXBsaWZ5IGFzIHNvb24gYXMgd2UgZHJvcCBzdXBwb3J0IGZvciB0aGUgb2xkIGZpbGUgZm9ybWF0KS4KKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkZXIgPSBjcmVhdGVSZWFkZXIoaW5kZXhFbnRyeSwgZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0aWNSb3cgPSByZWFkU3RhdGljUm93KHNzdGFibGUsIGZpbGUsIGhlbHBlciwgY29sdW1ucy5mZXRjaGVkQ29sdW1ucygpLnN0YXRpY3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcnRpdGlvbkxldmVsRGVsZXRpb24gPSBpbmRleEVudHJ5LmRlbGV0aW9uVGltZSgpOworICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRpY1JvdyA9IFJvd3MuRU1QVFlfU1RBVElDX1JPVzsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkZXIgPSBjcmVhdGVSZWFkZXIoaW5kZXhFbnRyeSwgZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFwYXJ0aXRpb25MZXZlbERlbGV0aW9uLnZhbGlkYXRlKCkpCisgICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRWYWxpZGF0aW9uLmhhbmRsZUludmFsaWQobWV0YWRhdGEoKSwga2V5LCBzc3RhYmxlLCAicGFydGl0aW9uTGV2ZWxEZWxldGlvbj0iK3BhcnRpdGlvbkxldmVsRGVsZXRpb24udG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwgJiYgIXNsaWNlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5zZXRGb3JTbGljZShuZXh0U2xpY2UoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVhZGVyID09IG51bGwgJiYgZmlsZSAhPSBudWxsICYmIHNob3VsZENsb3NlRmlsZSkKKyAgICAgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3N0YWJsZS5tYXJrU3VzcGVjdCgpOworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IGZpbGUuZ2V0UGF0aCgpOworICAgICAgICAgICAgICAgIGlmIChzaG91bGRDbG9zZUZpbGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBzdXBwcmVzc2VkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlLmFkZFN1cHByZXNzZWQoc3VwcHJlc3NlZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIGZpbGVQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU2xpY2UgbmV4dFNsaWNlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzbGljZXMuZ2V0KG5leHRTbGljZUluZGV4KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHNsaWNlIHRvIHByb2Nlc3MuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIG5leHQgc2xpY2UgdG8gcHJvY2VzcworICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgbmV4dFNsaWNlSW5kZXgoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGVyZSBhcmUgbW9yZSBzbGljZSB0byBwcm9jZXNzLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZXJlIGFyZSBtb3JlIHNsaWNlIHRvIHByb2Nlc3MsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGhhc01vcmVTbGljZXMoKTsKKworICAgIHByaXZhdGUgc3RhdGljIFJvdyByZWFkU3RhdGljUm93KFNTVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGF0YUlucHV0IGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzZXJpYWxpemF0aW9uSGVscGVyIGhlbHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5zIHN0YXRpY3MpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKCFzc3RhYmxlLmhlYWRlci5oYXNTdGF0aWMoKSkKKyAgICAgICAgICAgIHJldHVybiBSb3dzLkVNUFRZX1NUQVRJQ19ST1c7CisKKyAgICAgICAgaWYgKHN0YXRpY3MuaXNFbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBVbmZpbHRlcmVkU2VyaWFsaXplci5zZXJpYWxpemVyLnNraXBTdGF0aWNSb3coZmlsZSwgc3N0YWJsZS5oZWFkZXIsIGhlbHBlcik7CisgICAgICAgICAgICByZXR1cm4gUm93cy5FTVBUWV9TVEFUSUNfUk9XOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemVTdGF0aWNSb3coZmlsZSwgc3N0YWJsZS5oZWFkZXIsIGhlbHBlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmVhZGVyIGNyZWF0ZVJlYWRlckludGVybmFsKFJJRSBpbmRleEVudHJ5LCBGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKTsKKworICAgIHByaXZhdGUgUmVhZGVyIGNyZWF0ZVJlYWRlcihSSUUgaW5kZXhFbnRyeSwgRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKKyAgICB7CisgICAgICAgIHJldHVybiBzbGljZXMuaXNFbXB0eSgpID8gbmV3IE5vUm93c1JlYWRlcihmaWxlLCBzaG91bGRDbG9zZUZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3JlYXRlUmVhZGVySW50ZXJuYWwoaW5kZXhFbnRyeSwgZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKKyAgICB9OworCisgICAgcHVibGljIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1ldGFkYXRhOworICAgIH0KKworICAgIHB1YmxpYyBSZWd1bGFyQW5kU3RhdGljQ29sdW1ucyBjb2x1bW5zKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb2x1bW5zLmZldGNoZWRDb2x1bW5zKCk7CisgICAgfQorCisgICAgcHVibGljIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBwdWJsaWMgRGVsZXRpb25UaW1lIHBhcnRpdGlvbkxldmVsRGVsZXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnRpdGlvbkxldmVsRGVsZXRpb247CisgICAgfQorCisgICAgcHVibGljIFJvdyBzdGF0aWNSb3coKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY1JvdzsKKyAgICB9CisKKyAgICBwdWJsaWMgRW5jb2RpbmdTdGF0cyBzdGF0cygpCisgICAgeworICAgICAgICByZXR1cm4gc3N0YWJsZS5zdGF0cygpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQorICAgIHsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyZWFkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGlmIChyZWFkZXIuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICBpZiAoIWhhc01vcmVTbGljZXMoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIHNsaWNlKG5leHRTbGljZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBVbmZpbHRlcmVkIG5leHQoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHJlYWRlciAhPSBudWxsOworICAgICAgICByZXR1cm4gcmVhZGVyLm5leHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2xpY2UoU2xpY2Ugc2xpY2UpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlYWRlci5zZXRGb3JTbGljZShzbGljZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsb3NlSW50ZXJuYWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBzdXBwcmVzc2VkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGUuYWRkU3VwcHJlc3NlZChzdXBwcmVzc2VkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzdGFibGUubWFya1N1c3BlY3QoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCByZWFkZXIudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsb3NlSW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIEl0J3MgaW1wb3J0YW50IHRvIG1ha2UgY2xvc2luZyBpZGVtcG90ZW50IHNpbmNlIGl0IHdvdWxkIGJhZCB0byBkb3VibGUtY2xvc2UgJ2ZpbGUnIGFzIGl0cyBhIFJhbmRvbUFjY2Vzc1JlYWRlcgorICAgICAgICAvLyBhbmQgaXRzIGNsb3NlIGlzIG5vdCBpZGVtcHRvdGVudCBpbiB0aGUgY2FzZSB3aGVyZSB3ZSByZWN5Y2xlIGl0LgorICAgICAgICBpZiAoaXNDbG9zZWQpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKQorICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisKKyAgICAgICAgaXNDbG9zZWQgPSB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBjbG9zZUludGVybmFsKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNzdGFibGUubWFya1N1c3BlY3QoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCByZWFkZXIudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFJlYWRlciBleHRlbmRzIEl0ZXJhdG9yPFVuZmlsdGVyZWQ+LCBDbG9zZWFibGUgeworCisgICAgICAgIHZvaWQgc2V0Rm9yU2xpY2UoU2xpY2Ugc2xpY2UpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgICAgICB2b2lkIHNlZWtUb1Bvc2l0aW9uKGxvbmcgY29sdW1uT2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVhZGVyIGltcGxlbWVudHMgUmVhZGVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlOworICAgICAgICBwdWJsaWMgRmlsZURhdGFJbnB1dCBmaWxlOworCisgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkRGVzZXJpYWxpemVyIGRlc2VyaWFsaXplcjsKKworICAgICAgICAvLyBSZWNvcmRzIHRoZSBjdXJyZW50bHkgb3BlbiByYW5nZSB0b21ic3RvbmUgKGlmIGFueSkKKyAgICAgICAgcHVibGljIERlbGV0aW9uVGltZSBvcGVuTWFya2VyOworCisgICAgICAgIHByb3RlY3RlZCBBYnN0cmFjdFJlYWRlcihGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgICAgICAgdGhpcy5zaG91bGRDbG9zZUZpbGUgPSBzaG91bGRDbG9zZUZpbGU7CisKKyAgICAgICAgICAgIGlmIChmaWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgY3JlYXRlRGVzZXJpYWxpemVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlRGVzZXJpYWxpemVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGZpbGUgIT0gbnVsbCAmJiBkZXNlcmlhbGl6ZXIgPT0gbnVsbDsKKyAgICAgICAgICAgIGRlc2VyaWFsaXplciA9IFVuZmlsdGVyZWREZXNlcmlhbGl6ZXIuY3JlYXRlKG1ldGFkYXRhLCBmaWxlLCBzc3RhYmxlLmhlYWRlciwgaGVscGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNlZWtUb1Bvc2l0aW9uKGxvbmcgcG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICAvLyBUaGlzIG1heSBiZSB0aGUgZmlyc3QgdGltZSB3ZSdyZSBhY3R1YWxseSBsb29raW5nIGludG8gdGhlIGZpbGUKKyAgICAgICAgICAgIGlmIChmaWxlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsZSA9IHNzdGFibGUuZ2V0RmlsZURhdGFJbnB1dChwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgY3JlYXRlRGVzZXJpYWxpemVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsZS5zZWVrKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZXIuY2xlYXJTdGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlT3Blbk1hcmtlcihSYW5nZVRvbWJzdG9uZU1hcmtlciBtYXJrZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBhbHdheXMgcmVhZCBpbmRleCBibG9ja3MgaW4gZm9yd2FyZCBvcmRlciBzbyB0aGlzIG1ldGhvZCBpcyBhbHdheXMgY2FsbGVkIGluIGZvcndhcmQgb3JkZXIKKyAgICAgICAgICAgIG9wZW5NYXJrZXIgPSBtYXJrZXIuaXNPcGVuKGZhbHNlKSA/IG1hcmtlci5vcGVuRGVsZXRpb25UaW1lKGZhbHNlKSA6IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc05leHRJbnRlcm5hbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB8IFZJbnRPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjbG9zZUludGVybmFsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBzdXBwcmVzc2VkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZS5hZGRTdXBwcmVzc2VkKHN1cHByZXNzZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzc3RhYmxlLm1hcmtTdXNwZWN0KCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIHRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFVuZmlsdGVyZWQgbmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXh0SW50ZXJuYWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VJbnRlcm5hbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gc3VwcHJlc3NlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGUuYWRkU3VwcHJlc3NlZChzdXBwcmVzc2VkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3N0YWJsZS5tYXJrU3VzcGVjdCgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCB0b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldCB0aGUgcmVhZGVyIHNvIGl0cyBoYXNOZXh0L25leHQgbWV0aG9kcyByZXR1cm4gdmFsdWVzIHdpdGhpbiB0aGUgcHJvdmlkZWQgc2xpY2UKKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgc2V0Rm9yU2xpY2UoU2xpY2Ugc2xpY2UpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBoYXNOZXh0SW50ZXJuYWwoKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBVbmZpbHRlcmVkIG5leHRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNob3VsZENsb3NlRmlsZSAmJiBmaWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmlsZSAhPSBudWxsID8gZmlsZS50b1N0cmluZygpIDogIm51bGwiOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGNsYXNzIEZvcndhcmRSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdFJlYWRlcgorICAgIHsKKyAgICAgICAgLy8gVGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHNsaWNlLiBUaGlzIHdpbGwgYmUgbnVsbCBhcyBzb29uIGFzIHdlIGtub3cgd2UndmUgcGFzc2VkIHRoYXQgYm91bmQuCisgICAgICAgIHByb3RlY3RlZCBDbHVzdGVyaW5nQm91bmQ8Pz4gc3RhcnQ7CisgICAgICAgIC8vIFRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgc2xpY2UuIFdpbGwgbmV2ZXIgYmUgbnVsbC4KKyAgICAgICAgcHJvdGVjdGVkIENsdXN0ZXJpbmdCb3VuZDw/PiBlbmQgPSBCdWZmZXJDbHVzdGVyaW5nQm91bmQuVE9QOworCisgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIG5leHQ7IC8vIHRoZSBuZXh0IGVsZW1lbnQgdG8gcmV0dXJuOiB0aGlzIGlzIGNvbXB1dGVkIGJ5IGhhc05leHRJbnRlcm5hbCgpLgorCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHNsaWNlRG9uZTsgLy8gc2V0IHRvIHRydWUgb25jZSB3ZSBrbm93IHdlIGhhdmUgbm8gbW9yZSByZXN1bHQgZm9yIHRoZSBzbGljZS4gVGhpcyBpcyBpbiBwYXJ0aWN1bGFyCisgICAgICAgIC8vIHVzZWQgYnkgdGhlIGluZGV4ZWQgcmVhZGVyIHdoZW4gd2Uga25vdyB3ZSBjYW4ndCBoYXZlIHJlc3VsdHMgYmFzZWQgb24gdGhlIGluZGV4LgorCisgICAgICAgIHB1YmxpYyBGb3J3YXJkUmVhZGVyKEZpbGVEYXRhSW5wdXQgZmlsZSwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGZpbGUsIHNob3VsZENsb3NlRmlsZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb3JTbGljZShTbGljZSBzbGljZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXJ0ID0gc2xpY2Uuc3RhcnQoKS5pc0JvdHRvbSgpID8gbnVsbCA6IHNsaWNlLnN0YXJ0KCk7CisgICAgICAgICAgICBlbmQgPSBzbGljZS5lbmQoKTsKKworICAgICAgICAgICAgc2xpY2VEb25lID0gZmFsc2U7CisgICAgICAgICAgICBuZXh0ID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNraXAgYWxsIGRhdGEgdGhhdCBjb21lcyBiZWZvcmUgdGhlIGN1cnJlbnRseSBzZXQgc2xpY2UuCisgICAgICAgIC8vIFJldHVybiB3aGF0IHNob3VsZCBiZSByZXR1cm5lZCBhdCB0aGUgZW5kIG9mIHRoaXMsIG9yIG51bGwgaWYgbm90aGluZyBzaG91bGQuCisgICAgICAgIHByaXZhdGUgVW5maWx0ZXJlZCBoYW5kbGVQcmVTbGljZURhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGRlc2VyaWFsaXplciAhPSBudWxsOworCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyBjb21wYXJpc29uIGlzIG5vdCBzdHJpY3QuIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgb25seSBjYXNlcworICAgICAgICAgICAgLy8gd2hlcmUgaXQgY2FuIGJlID09IGlzIGlmIHRoZSAibmV4dCIgaXMgYSBSVCBzdGFydCBtYXJrZXIgKGVpdGhlciBhICdbJyBvZiBhICcpWycgYm91bmRhcnkpLAorICAgICAgICAgICAgLy8gYW5kIGlmIHdlIGhhZCBhIHN0cmljdCBpbmVxdWFsaXR5IGFuZCBhbiBvcGVuIFJUIG1hcmtlciBiZWZvcmUgdGhpcywgd2Ugd291bGQgaXNzdWUKKyAgICAgICAgICAgIC8vIHRoZSBvcGVuIG1hcmtlciBmaXJzdCwgYW5kIHRoZW4gcmV0dXJuIHRoZW4gbmV4dCBsYXRlciwgd2hpY2ggd291bGQgc2VuZCBpbiB0aGUKKyAgICAgICAgICAgIC8vIHN0cmVhbSBib3RoICdbJyAob3IgJygnKSBhbmQgdGhlbiAnKVsnIGZvciB0aGUgc2FtZSBjbHVzdGVyaW5nIHZhbHVlLCB3aGljaCBpcyB3cm9uZy4KKyAgICAgICAgICAgIC8vIEJ5IHVzaW5nIGEgbm9uLXN0cmljdCBpbmVxdWFsaXR5LCB3ZSBhdm9pZCB0aGF0IHByb2JsZW0gKGlmIHdlIGRvIGdldCAnKVsnIGZvciB0aGUgc2FtZQorICAgICAgICAgICAgLy8gY2x1c3RlcmluZyB2YWx1ZSB0aGFuIHRoZSBzbGljZSwgd2UnbGwgc2ltcGx5IHJlY29yZCBpdCBpbiAnb3Blbk1hcmtlcicpLgorICAgICAgICAgICAgd2hpbGUgKGRlc2VyaWFsaXplci5oYXNOZXh0KCkgJiYgZGVzZXJpYWxpemVyLmNvbXBhcmVOZXh0VG8oc3RhcnQpIDw9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRlc2VyaWFsaXplci5uZXh0SXNSb3coKSkKKyAgICAgICAgICAgICAgICAgICAgZGVzZXJpYWxpemVyLnNraXBOZXh0KCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcGVuTWFya2VyKChSYW5nZVRvbWJzdG9uZU1hcmtlcilkZXNlcmlhbGl6ZXIucmVhZE5leHQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsdXN0ZXJpbmdCb3VuZDw/PiBzbGljZVN0YXJ0ID0gc3RhcnQ7CisgICAgICAgICAgICBzdGFydCA9IG51bGw7CisKKyAgICAgICAgICAgIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGJlZ2lubmluZyBvZiBvdXIgcXVlcmllZCBzbGljZS4gSWYgd2UgaGF2ZSBhbiBvcGVuIG1hcmtlcgorICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIHJldHVybiB0aGF0IGZpcnN0LgorICAgICAgICAgICAgaWYgKG9wZW5NYXJrZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlVG9tYnN0b25lQm91bmRNYXJrZXIoc2xpY2VTdGFydCwgb3Blbk1hcmtlcik7CisKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29tcHV0ZSB0aGUgbmV4dCBlbGVtZW50IHRvIHJldHVybiwgYXNzdW1pbmcgd2UncmUgaW4gdGhlIG1pZGRsZSB0byB0aGUgc2xpY2UKKyAgICAgICAgLy8gYW5kIHRoZSBuZXh0IGVsZW1lbnQgaXMgZWl0aGVyIGluIHRoZSBzbGljZSwgb3IganVzdCBhZnRlciBpdC4gUmV0dXJucyBudWxsCisgICAgICAgIC8vIGlmIHdlJ3JlIGRvbmUgd2l0aCB0aGUgc2xpY2UuCisgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIGNvbXB1dGVOZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBkZXNlcmlhbGl6ZXIgIT0gbnVsbDsKKworICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV2UgdXNlIGEgc2FtZSByZWFzb25pbmcgYXMgaW4gaGFuZGxlUHJlU2xpY2VEYXRhIHJlZ2FyZGluZyB0aGUgc3RyaWN0bmVzcyBvZiB0aGUgaW5lcXVhbGl0eSBiZWxvdy4KKyAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGV4Y2x1ZGUgZGVzZXJpYWxpemVkIHVuZmlsdGVyZWQgZXF1YWwgdG8gZW5kLCBiZWNhdXNlIDEpIHdlIHdvbid0IG1pc3MgYW55IHJvd3Mgc2luY2UgdGhvc2UKKyAgICAgICAgICAgICAgICAvLyB3b3Vkbid0IGJlIGVxdWFsIHRvIGEgc2xpY2UgYm91bmQgYW5kIDIpIGEgZW5kIGJvdW5kIGNhbiBiZSBlcXVhbCB0byBhIHN0YXJ0IGJvdW5kCisgICAgICAgICAgICAgICAgLy8gKEVYQ0xfRU5EKHgpID09IElOQ0xfU1RBUlQoeCkgZm9yIGluc3RhbmNlKSBhbmQgaW4gdGhhdCBjYXNlIHdlIGRvbid0IHdhbnQgdG8gcmV0dXJuIHN0YXJ0IGJvdW5kIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAvLyBpdCdzIGZ1bmRhbWVudGFsbHkgZXhjbHVkZWQuIEFuZCBpZiB0aGUgYm91bmQgaXMgYSAgZW5kIChmb3IgYSByYW5nZSB0b21ic3RvbmUpLCBpdCBtZWFucyBpdCdzIGV4YWN0bHkKKyAgICAgICAgICAgICAgICAvLyBvdXIgc2xpY2UgZW5kLCBidXQgaW4gdGhhdCAgY2FzZSB3ZSB3aWxsIHByb3Blcmx5IGNsb3NlIHRoZSByYW5nZSB0b21ic3RvbmUgYW55d2F5IGFzIHBhcnQgb2Ygb3VyICJjbG9zZQorICAgICAgICAgICAgICAgIC8vIGFuIG9wZW4gbWFya2VyIiBjb2RlIGluIGhhc05leHRJbnRlcm5hCisgICAgICAgICAgICAgICAgaWYgKCFkZXNlcmlhbGl6ZXIuaGFzTmV4dCgpIHx8IGRlc2VyaWFsaXplci5jb21wYXJlTmV4dFRvKGVuZCkgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICBVbmZpbHRlcmVkIG5leHQgPSBkZXNlcmlhbGl6ZXIucmVhZE5leHQoKTsKKyAgICAgICAgICAgICAgICBVbmZpbHRlcmVkVmFsaWRhdGlvbi5tYXliZVZhbGlkYXRlVW5maWx0ZXJlZChuZXh0LCBtZXRhZGF0YSgpLCBrZXksIHNzdGFibGUpOworICAgICAgICAgICAgICAgIC8vIFdlIG1heSBnZXQgZW1wdHkgcm93IGZvciB0aGUgc2FtZSByZWFzb24gZXhwcmVzc2VkIG9uIFVuZmlsdGVyZWRTZXJpYWxpemVyLmRlc2VyaWFsaXplT25lLgorICAgICAgICAgICAgICAgIGlmIChuZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpZiAobmV4dC5raW5kKCkgPT0gVW5maWx0ZXJlZC5LaW5kLlJBTkdFX1RPTUJTVE9ORV9NQVJLRVIpCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9wZW5NYXJrZXIoKFJhbmdlVG9tYnN0b25lTWFya2VyKSBuZXh0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGhhc05leHRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobmV4dCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgICAgICBpZiAoc2xpY2VEb25lKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVW5maWx0ZXJlZCB1bmZpbHRlcmVkID0gaGFuZGxlUHJlU2xpY2VEYXRhKCk7CisgICAgICAgICAgICAgICAgaWYgKHVuZmlsdGVyZWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5leHQgPSB1bmZpbHRlcmVkOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5leHQgPSBjb21wdXRlTmV4dCgpOworICAgICAgICAgICAgaWYgKG5leHQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgLy8gZm9yIGN1cnJlbnQgc2xpY2UsIG5vIGRhdGEgcmVhZCBmcm9tIGRlc2VyaWFsaXphdGlvbgorICAgICAgICAgICAgc2xpY2VEb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gb3BlbiBtYXJrZXIsIHdlIHNob3VsZCBub3QgY2xvc2UgaXQsIHRoZXJlIGNvdWxkIGJlIG1vcmUgc2xpY2VzCisgICAgICAgICAgICBpZiAob3Blbk1hcmtlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5leHQgPSBuZXcgUmFuZ2VUb21ic3RvbmVCb3VuZE1hcmtlcihlbmQsIG9wZW5NYXJrZXIpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWQgbmV4dEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaGFzTmV4dEludGVybmFsKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKworICAgICAgICAgICAgVW5maWx0ZXJlZCB0b1JldHVybiA9IG5leHQ7CisgICAgICAgICAgICBuZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiB0b1JldHVybjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gUmVhZGVyIGZvciB3aGVuIHdlIGhhdmUgU2xpY2VzLk5PTkUgYnV0IG5lZWQgdG8gcmVhZCBzdGF0aWMgcm93IG9yIHBhcnRpdGlvbiBsZXZlbCBkZWxldGlvbgorICAgIHByaXZhdGUgY2xhc3MgTm9Sb3dzUmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RSZWFkZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgTm9Sb3dzUmVhZGVyKEZpbGVEYXRhSW5wdXQgZmlsZSwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGZpbGUsIHNob3VsZENsb3NlRmlsZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9yU2xpY2UoU2xpY2Ugc2xpY2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dEludGVybmFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIG5leHRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9BYnN0cmFjdFNTVGFibGVTaW1wbGVXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQWJzdHJhY3RTU1RhYmxlU2ltcGxlV3JpdGVyLmphdmEKaW5kZXggNDljZWI3Ni4uNDI5OTk1YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9BYnN0cmFjdFNTVGFibGVTaW1wbGVXcml0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Fic3RyYWN0U1NUYWJsZVNpbXBsZVdyaXRlci5qYXZhCkBAIC0xOCw4ICsxOCw4IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CiAKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwpAQCAtMjcsNyArMjcsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWd1bGFyQW5kU3RhdGljQ29sdW1uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uVXBkYXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRW5jb2RpbmdTdGF0czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OwpAQCAtNDMsNyArNDYsNyBAQAogICAgIHByb3RlY3RlZCBmaW5hbCBGaWxlIGRpcmVjdG9yeTsKICAgICBwcm90ZWN0ZWQgZmluYWwgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YTsKICAgICBwcm90ZWN0ZWQgZmluYWwgUmVndWxhckFuZFN0YXRpY0NvbHVtbnMgY29sdW1uczsKLSAgICBwcm90ZWN0ZWQgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdFR5cGUgPSBTU1RhYmxlRm9ybWF0LlR5cGUuY3VycmVudCgpOworICAgIHByb3RlY3RlZCBTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKTsKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxTU1RhYmxlSWQ+IGlkID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KFNTVGFibGVJZEZhY3RvcnkuaW5zdGFuY2UuZGVmYXVsdEJ1aWxkZXIoKS5nZW5lcmF0b3IoU3RyZWFtLmVtcHR5KCkpLmdldCgpKTsKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtYWtlUmFuZ2VBd2FyZSA9IGZhbHNlOwogCkBAIC01NCw5ICs1Nyw5IEBACiAgICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U1NUYWJsZUZvcm1hdFR5cGUoU1NUYWJsZUZvcm1hdC5UeXBlIHR5cGUpCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0U1NUYWJsZUZvcm1hdFR5cGUoU1NUYWJsZUZvcm1hdDw/LCA/PiB0eXBlKQogICAgIHsKLSAgICAgICAgdGhpcy5mb3JtYXRUeXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5mb3JtYXQgPSB0eXBlOwogICAgIH0KIAogICAgIHByb3RlY3RlZCB2b2lkIHNldFJhbmdlQXdhcmVXcml0aW5nKGJvb2xlYW4gbWFrZVJhbmdlQXdhcmUpCkBAIC02NCwyNSArNjcsMjYgQEAKICAgICAgICAgdGhpcy5tYWtlUmFuZ2VBd2FyZSA9IG1ha2VSYW5nZUF3YXJlOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBTU1RhYmxlVHhuV3JpdGVyIGNyZWF0ZVdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHByb3RlY3RlZCBTU1RhYmxlVHhuV3JpdGVyIGNyZWF0ZVdyaXRlcihTU1RhYmxlLk93bmVyIG93bmVyKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyID0gbmV3IFNlcmlhbGl6YXRpb25IZWFkZXIodHJ1ZSwgbWV0YWRhdGEuZ2V0KCksIGNvbHVtbnMsIEVuY29kaW5nU3RhdHMuTk9fU1RBVFMpOwogCiAgICAgICAgIGlmIChtYWtlUmFuZ2VBd2FyZSkKLSAgICAgICAgICAgIHJldHVybiBTU1RhYmxlVHhuV3JpdGVyLmNyZWF0ZVJhbmdlQXdhcmUobWV0YWRhdGEsIDAsICBBY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRSwgQWN0aXZlUmVwYWlyU2VydmljZS5OT19QRU5ESU5HX1JFUEFJUiwgZmFsc2UsIGZvcm1hdFR5cGUsIDAsIGhlYWRlcik7CisgICAgICAgICAgICByZXR1cm4gU1NUYWJsZVR4bldyaXRlci5jcmVhdGVSYW5nZUF3YXJlKG1ldGFkYXRhLCAwLCBBY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRSwgQWN0aXZlUmVwYWlyU2VydmljZS5OT19QRU5ESU5HX1JFUEFJUiwgZmFsc2UsIGZvcm1hdCwgMCwgaGVhZGVyKTsKIAogICAgICAgICByZXR1cm4gU1NUYWJsZVR4bldyaXRlci5jcmVhdGUobWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZXNjcmlwdG9yKGRpcmVjdG9yeSwgbWV0YWRhdGEua2V5c3BhY2UsIG1ldGFkYXRhLm5hbWUsIGZvcm1hdFR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVzY3JpcHRvcihkaXJlY3RvcnksIG1ldGFkYXRhLmtleXNwYWNlLCBtZXRhZGF0YS5uYW1lLCBmb3JtYXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2ZVJlcGFpclNlcnZpY2UuVU5SRVBBSVJFRF9TU1RBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZlUmVwYWlyU2VydmljZS5OT19QRU5ESU5HX1JFUEFJUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBEZXNjcmlwdG9yIGNyZWF0ZURlc2NyaXB0b3IoRmlsZSBkaXJlY3RvcnksIGZpbmFsIFN0cmluZyBrZXlzcGFjZSwgZmluYWwgU3RyaW5nIGNvbHVtbkZhbWlseSwgZmluYWwgU1NUYWJsZUZvcm1hdC5UeXBlIGZtdCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgRGVzY3JpcHRvciBjcmVhdGVEZXNjcmlwdG9yKEZpbGUgZGlyZWN0b3J5LCBmaW5hbCBTdHJpbmcga2V5c3BhY2UsIGZpbmFsIFN0cmluZyBjb2x1bW5GYW1pbHksIGZpbmFsIFNTVGFibGVGb3JtYXQ8PywgPz4gZm10KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIFNTVGFibGVJZCBuZXh0R2VuID0gZ2V0TmV4dElkKGRpcmVjdG9yeSwgY29sdW1uRmFtaWx5KTsKICAgICAgICAgcmV0dXJuIG5ldyBEZXNjcmlwdG9yKGRpcmVjdG9yeSwga2V5c3BhY2UsIGNvbHVtbkZhbWlseSwgbmV4dEdlbiwgZm10KTsKQEAgLTk1LDcgKzk5LDcgQEAKICAgICAgICAgICAgIHRyeSAoU3RyZWFtPFBhdGg+IGV4aXN0aW5nUGF0aHMgPSBGaWxlcy5saXN0KGRpcmVjdG9yeS50b1BhdGgoKSkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgU3RyZWFtPFNTVGFibGVJZD4gZXhpc3RpbmdJZHMgPSBleGlzdGluZ1BhdGhzLm1hcChGaWxlOjpuZXcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChTU1RhYmxlOjp0cnlEZXNjcmlwdG9yRnJvbUZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoU1NUYWJsZTo6dHJ5RGVzY3JpcHRvckZyb21GaWxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZCAtPiBkICE9IG51bGwgJiYgZC5jZm5hbWUuZXF1YWxzKGNvbHVtbkZhbWlseSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChkIC0+IGQuaWQpOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Jsb29tRmlsdGVyVHJhY2tlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9CbG9vbUZpbHRlclRyYWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc1MjNhMC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Jsb29tRmlsdGVyVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOwotCi1wdWJsaWMgY2xhc3MgQmxvb21GaWx0ZXJUcmFja2VyCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIGZhbHNlUG9zaXRpdmVDb3VudCA9IG5ldyBBdG9taWNMb25nKDApOwotICAgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyB0cnVlUG9zaXRpdmVDb3VudCA9IG5ldyBBdG9taWNMb25nKDApOwotICAgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyB0cnVlTmVnYXRpdmVDb3VudCA9IG5ldyBBdG9taWNMb25nKDApOwotICAgIHByaXZhdGUgbG9uZyBsYXN0RmFsc2VQb3NpdGl2ZUNvdW50ID0gMEw7Ci0gICAgcHJpdmF0ZSBsb25nIGxhc3RUcnVlUG9zaXRpdmVDb3VudCA9IDBMOwotICAgIHByaXZhdGUgbG9uZyBsYXN0VHJ1ZU5lZ2F0aXZlQ291bnQgPSAwTDsKLQotICAgIHB1YmxpYyB2b2lkIGFkZEZhbHNlUG9zaXRpdmUoKQotICAgIHsKLSAgICAgICAgZmFsc2VQb3NpdGl2ZUNvdW50LmluY3JlbWVudEFuZEdldCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFRydWVQb3NpdGl2ZSgpCi0gICAgewotICAgICAgICB0cnVlUG9zaXRpdmVDb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRUcnVlTmVnYXRpdmUoKQotICAgIHsKLSAgICAgICAgdHJ1ZU5lZ2F0aXZlQ291bnQuaW5jcmVtZW50QW5kR2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZVBvc2l0aXZlQ291bnQuZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0UmVjZW50RmFsc2VQb3NpdGl2ZUNvdW50KCkKLSAgICB7Ci0gICAgICAgIGxvbmcgZnBjID0gZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKGZwYyAtIGxhc3RGYWxzZVBvc2l0aXZlQ291bnQpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgbGFzdEZhbHNlUG9zaXRpdmVDb3VudCA9IGZwYzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFRydWVQb3NpdGl2ZUNvdW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlUG9zaXRpdmVDb3VudC5nZXQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRSZWNlbnRUcnVlUG9zaXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICBsb25nIHRwYyA9IGdldFRydWVQb3NpdGl2ZUNvdW50KCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKHRwYyAtIGxhc3RUcnVlUG9zaXRpdmVDb3VudCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBsYXN0VHJ1ZVBvc2l0aXZlQ291bnQgPSB0cGM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRUcnVlTmVnYXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZU5lZ2F0aXZlQ291bnQuZ2V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0UmVjZW50VHJ1ZU5lZ2F0aXZlQ291bnQoKQotICAgIHsKLSAgICAgICAgbG9uZyB0bmMgPSBnZXRUcnVlTmVnYXRpdmVDb3VudCgpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICh0bmMgLSBsYXN0VHJ1ZU5lZ2F0aXZlQ291bnQpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgbGFzdFRydWVOZWdhdGl2ZUNvdW50ID0gdG5jOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9DUUxTU1RhYmxlV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0NRTFNTVGFibGVXcml0ZXIuamF2YQppbmRleCA2ZDU0NTYxLi5kMGJjYWZkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0NRTFNTVGFibGVXcml0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0NRTFNTVGFibGVXcml0ZXIuamF2YQpAQCAtMzQsOCArMzQsNiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5zY2hlbWEuQ3JlYXRlVGFibGVTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5DcmVhdGVUeXBlU3RhdGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29sdW1uU3BlY2lmaWNhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5T3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yOwpAQCAtNDQsNiArNDIsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLnR5cGVzLlR5cGVDb2RlYzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy50eXBlcy5Vc2VyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuTW9kaWZpY2F0aW9uU3RhdGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5zY2hlbWEuQ3JlYXRlVGFibGVTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5DcmVhdGVUeXBlU3RhdGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2VzOwpAQCAtNTQsNyArNTQsMTcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlN5bnRheEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFUcmFuc2Zvcm1hdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVHlwZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlVzZXJGdW5jdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlZpZXdzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKQEAgLTM2Niw3ICszNzYsNyBAQAogICAgIHsKICAgICAgICAgcHJpdmF0ZSBGaWxlIGRpcmVjdG9yeTsKIAotICAgICAgICBwcm90ZWN0ZWQgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdFR5cGUgPSBudWxsOworICAgICAgICBwcm90ZWN0ZWQgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQgPSBudWxsOwogCiAgICAgICAgIHByaXZhdGUgQ3JlYXRlVGFibGVTdGF0ZW1lbnQuUmF3IHNjaGVtYVN0YXRlbWVudDsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENyZWF0ZVR5cGVTdGF0ZW1lbnQuUmF3PiB0eXBlU3RhdGVtZW50czsKQEAgLTU2MywxMSArNTczLDExIEBACiAgICAgICAgICAgICAgICAgU3RyaW5nIGtleXNwYWNlTmFtZSA9IHNjaGVtYVN0YXRlbWVudC5rZXlzcGFjZSgpOwogCiAgICAgICAgICAgICAgICAgU2NoZW1hLmluc3RhbmNlLnRyYW5zZm9ybShTY2hlbWFUcmFuc2Zvcm1hdGlvbnMuYWRkS2V5c3BhY2UoS2V5c3BhY2VNZXRhZGF0YS5jcmVhdGUoa2V5c3BhY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlcy5ub25lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdzLm5vbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZXMubm9uZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbnMubm9uZSgpKSwgdHJ1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZXMubm9uZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdzLm5vbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlcy5ub25lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlckZ1bmN0aW9ucy5ub25lKCkpLCB0cnVlKSk7CiAKICAgICAgICAgICAgICAgICBLZXlzcGFjZU1ldGFkYXRhIGtzbSA9IFNjaGVtYS5pbnN0YW5jZS5nZXRLZXlzcGFjZU1ldGFkYXRhKGtleXNwYWNlTmFtZSk7CiAKQEAgLTU4Nyw4ICs1OTcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBTU1RhYmxlU2ltcGxlV3JpdGVyKGRpcmVjdG9yeSwgcmVmLCBwcmVwYXJlZE1vZGlmaWNhdGlvblN0YXRlbWVudC51cGRhdGVkQ29sdW1ucygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBTU1RhYmxlU2ltcGxlVW5zb3J0ZWRXcml0ZXIoZGlyZWN0b3J5LCByZWYsIHByZXBhcmVkTW9kaWZpY2F0aW9uU3RhdGVtZW50LnVwZGF0ZWRDb2x1bW5zKCksIGJ1ZmZlclNpemVJbk1pQik7CiAKLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0VHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuc2V0U1NUYWJsZUZvcm1hdFR5cGUoZm9ybWF0VHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuc2V0U1NUYWJsZUZvcm1hdFR5cGUoZm9ybWF0KTsKIAogICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ1FMU1NUYWJsZVdyaXRlcih3cml0ZXIsIHByZXBhcmVkTW9kaWZpY2F0aW9uU3RhdGVtZW50LCBwcmVwYXJlZE1vZGlmaWNhdGlvblN0YXRlbWVudC5nZXRCaW5kVmFyaWFibGVzKCkpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9Db21wb25lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQ29tcG9uZW50LmphdmEKaW5kZXggZDg3ZDhiNy4uZjJlZWE5OSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9Db21wb25lbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0NvbXBvbmVudC5qYXZhCkBAIC0xNywxMSArMTcsMTggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOwogCi1pbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzLlR5cGVzOwogCiAvKioKICAqIFNTVGFibGVzIGFyZSBtYWRlIHVwIG9mIG11bHRpcGxlIGNvbXBvbmVudHMgaW4gc2VwYXJhdGUgZmlsZXMuIENvbXBvbmVudHMgYXJlCkBAIC0zMiw4NCArMzksMTQ5IEBACiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIHNlcGFyYXRvciA9ICctJzsKIAotICAgIGZpbmFsIHN0YXRpYyBFbnVtU2V0PFR5cGU+IFRZUEVTID0gRW51bVNldC5hbGxPZihUeXBlLmNsYXNzKTsKLQogICAgIC8qKgogICAgICAqIFdBUk5JTkc6IEJlIGNhcmVmdWwgd2hpbGUgY2hhbmdpbmcgdGhlIG5hbWVzIG9yIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW51bQogICAgICAqIG1lbWJlcnMuIFN0cmVhbWluZyBjb2RlIGRlcGVuZHMgb24gdGhlIG5hbWVzIGR1cmluZyBzdHJlYW1pbmcgKFJlZjogQ0FTU0FORFJBLTE0NTU2KS4KICAgICAgKi8KLSAgICBwdWJsaWMgZW51bSBUeXBlCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBjbGFzcyBUeXBlCiAgICAgewotICAgICAgICAvLyB0aGUgYmFzZSBkYXRhIGZvciBhbiBzc3RhYmxlOiB0aGUgcmVtYWluaW5nIGNvbXBvbmVudHMgY2FuIGJlIHJlZ2VuZXJhdGVkCi0gICAgICAgIC8vIGJhc2VkIG9uIHRoZSBkYXRhIGNvbXBvbmVudAotICAgICAgICBEQVRBKCJEYXRhLmRiIiksCi0gICAgICAgIC8vIGluZGV4IG9mIHRoZSByb3cga2V5cyB3aXRoIHBvaW50ZXJzIHRvIHRoZWlyIHBvc2l0aW9ucyBpbiB0aGUgZGF0YSBmaWxlCi0gICAgICAgIFBSSU1BUllfSU5ERVgoIkluZGV4LmRiIiksCi0gICAgICAgIC8vIHNlcmlhbGl6ZWQgYmxvb20gZmlsdGVyIGZvciB0aGUgcm93IGtleXMgaW4gdGhlIHNzdGFibGUKLSAgICAgICAgRklMVEVSKCJGaWx0ZXIuZGIiKSwKLSAgICAgICAgLy8gZmlsZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHVuY29tcHJlc3NlZCBkYXRhIGxlbmd0aCwgY2h1bmsgb2Zmc2V0cyBldGMuCi0gICAgICAgIENPTVBSRVNTSU9OX0lORk8oIkNvbXByZXNzaW9uSW5mby5kYiIpLAotICAgICAgICAvLyBzdGF0aXN0aWNhbCBtZXRhZGF0YSBhYm91dCB0aGUgY29udGVudCBvZiB0aGUgc3N0YWJsZQotICAgICAgICBTVEFUUygiU3RhdGlzdGljcy5kYiIpLAotICAgICAgICAvLyBob2xkcyBDUkMzMiBjaGVja3N1bSBvZiB0aGUgZGF0YSBmaWxlCi0gICAgICAgIERJR0VTVCgiRGlnZXN0LmNyYzMyIiksCi0gICAgICAgIC8vIGhvbGRzIHRoZSBDUkMzMiBmb3IgY2h1bmtzIGluIGFuIGEgdW5jb21wcmVzc2VkIGZpbGUuCi0gICAgICAgIENSQygiQ1JDLmRiIiksCi0gICAgICAgIC8vIGhvbGRzIFNTVGFibGUgSW5kZXggU3VtbWFyeSAoc2FtcGxpbmcgb2YgSW5kZXggY29tcG9uZW50KQotICAgICAgICBTVU1NQVJZKCJTdW1tYXJ5LmRiIiksCi0gICAgICAgIC8vIHRhYmxlIG9mIGNvbnRlbnRzLCBzdG9yZXMgdGhlIGxpc3Qgb2YgYWxsIGNvbXBvbmVudHMgZm9yIHRoZSBzc3RhYmxlCi0gICAgICAgIFRPQygiVE9DLnR4dCIpLAotICAgICAgICAvLyBidWlsdC1pbiBzZWNvbmRhcnkgaW5kZXggKG1heSBiZSBtdWx0aXBsZSBwZXIgc3N0YWJsZSkKLSAgICAgICAgU0VDT05EQVJZX0lOREVYKCJTSV8uKi5kYiIpLAotICAgICAgICAvLyBjdXN0b20gY29tcG9uZW50LCB1c2VkIGJ5IGUuZy4gY3VzdG9tIGNvbXBhY3Rpb24gc3RyYXRlZ3kKLSAgICAgICAgQ1VTVE9NKG51bGwpOworICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBDb3B5T25Xcml0ZUFycmF5TGlzdDxUeXBlPiB0eXBlc0NvbGxlY3RvciA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CiAKLSAgICAgICAgZmluYWwgU3RyaW5nIHJlcHI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxUeXBlPiBhbGwgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHR5cGVzQ29sbGVjdG9yKTsKIAotICAgICAgICBUeXBlKFN0cmluZyByZXByKQorICAgICAgICBwdWJsaWMgZmluYWwgaW50IGlkOworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgcmVwcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnQgc2luZ2xldG9uOworCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgICAgICAgIHB1YmxpYyBmaW5hbCBDbGFzczw/IGV4dGVuZHMgU1NUYWJsZUZvcm1hdD4gZm9ybWF0Q2xhc3M7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgbm9uLXNpbmdsZXRvbiB0eXBlIGFuZCByZWdpc3RlcnMgaXQgYSBnbG9iYWwgdHlwZSByZWdpc3RyeSAtIHNlZSB7QGxpbmsgI3JlZ2lzdGVyVHlwZShUeXBlKX0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lICAgICAgICB0eXBlIG5hbWUsIG11c3QgYmUgdW5pcXVlIGZvciB0aGlzIGFuZCBhbGwgcGFyZW50IGZvcm1hdHMKKyAgICAgICAgICogQHBhcmFtIHJlcHIgICAgICAgIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gYmUgdXNlZCB0byByZWNvZ25pemUgYSBuYW1lIHJlcHJlc2VudHMgdGhpcyB0eXBlCisgICAgICAgICAqIEBwYXJhbSBmb3JtYXRDbGFzcyBmb3JtYXQgY2xhc3MgZm9yIHdoaWNoIHRoaXMgdHlwZSBpcyBkZWZpbmVkIGZvcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBUeXBlIGNyZWF0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHJlcHIsIENsYXNzPD8gZXh0ZW5kcyBTU1RhYmxlRm9ybWF0PD8sID8+PiBmb3JtYXRDbGFzcykKICAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUeXBlKG5hbWUsIHJlcHIsIGZhbHNlLCBmb3JtYXRDbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBzaW5nbGV0b24gdHlwZSBhbmQgcmVnaXN0ZXJzIGl0IGluIGEgZ2xvYmFsIHR5cGUgcmVnaXN0cnkgLSBzZWUge0BsaW5rICNyZWdpc3RlclR5cGUoVHlwZSl9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSAgICAgICAgdHlwZSBuYW1lLCBtdXN0IGJlIHVuaXF1ZSBmb3IgdGhpcyBhbmQgYWxsIHBhcmVudCBmb3JtYXRzCisgICAgICAgICAqIEBwYXJhbSByZXByICAgICAgICB0aGUgcmVndWxhciBleHByZXNzaW9uIHRvIGJlIHVzZWQgdG8gcmVjb2duaXplIGEgbmFtZSByZXByZXNlbnRzIHRoaXMgdHlwZQorICAgICAgICAgKiBAcGFyYW0gZm9ybWF0Q2xhc3MgZm9ybWF0IGNsYXNzIGZvciB3aGljaCB0aGlzIHR5cGUgaXMgZGVmaW5lZCBmb3IKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBjcmVhdGVTaW5nbGV0b24oU3RyaW5nIG5hbWUsIFN0cmluZyByZXByLCBDbGFzczw/IGV4dGVuZHMgU1NUYWJsZUZvcm1hdDw/LCA/Pj4gZm9ybWF0Q2xhc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZShuYW1lLCByZXByLCB0cnVlLCBmb3JtYXRDbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFR5cGUoU3RyaW5nIG5hbWUsIFN0cmluZyByZXByLCBib29sZWFuIGlzU2luZ2xldG9uLCBDbGFzczw/IGV4dGVuZHMgU1NUYWJsZUZvcm1hdDw/LCA/Pj4gZm9ybWF0Q2xhc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwobmFtZSk7CiAgICAgICAgICAgICB0aGlzLnJlcHIgPSByZXByOworICAgICAgICAgICAgdGhpcy5pZCA9IHR5cGVzQ29sbGVjdG9yLnNpemUoKTsKKyAgICAgICAgICAgIHRoaXMuZm9ybWF0Q2xhc3MgPSBmb3JtYXRDbGFzcyA9PSBudWxsID8gU1NUYWJsZUZvcm1hdC5jbGFzcyA6IGZvcm1hdENsYXNzOworICAgICAgICAgICAgdGhpcy5zaW5nbGV0b24gPSBpc1NpbmdsZXRvbiA/IG5ldyBDb21wb25lbnQodGhpcykgOiBudWxsOworCisgICAgICAgICAgICByZWdpc3RlclR5cGUodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSWYgeW91IGhhdmUgdHdvIGZvcm1hdHMgcmVnaXN0ZXJlZCwgdGhleSBtYXkgYm90aCBkZWZpbmUgYSB0eXBlIHNheSBgSU5ERVhgLiBJdCBpcyBhbGxvd2VkIGV2ZW4gdGhvdWdoCisgICAgICAgICAqIHRoZXkgaGF2ZSB0aGUgc2FtZSBuYW1lIGJlY2F1c2UgdGhleSBhcmUgbm90IGluIHRoZSBzYW1lIGJyYW5jaC4gVGhvdWdoLCB3ZSBjYW5ub3QgbGV0IGEgY3VzdG9tIHR5cGUKKyAgICAgICAgICogZGVmaW5lIGEgdHlwZSBgVE9DYCB3aGljaCBpcyBkZWNsYXJlZCBvbiB0aGUgdG9wIGxldmVsLgorICAgICAgICAgKiBTbywgZS5nLiBnaXZlbiB3ZSBoYXZlIGBUT0NAU1NUYWJsZUZvcm1hdGAsIGFuZCBgQmlnRm9ybWF0YCB0cmllcyB0byBkZWZpbmUgYFRPQ0BCaWdGb3JtYXRgLCB3ZSBzaG91bGQKKyAgICAgICAgICogZm9yYmlkIHRoYXQ7IGJ1dCwgZ2l2ZW4gd2UgaGF2ZSBgSU5ERVhAQmlnRm9ybWF0YCwgd2Ugc2hvdWxkIGFsbG93IHRvIGRlZmluZSBgSU5ERVhAVHJpZUZvcm1hdGAgYXMgdGhvc2UKKyAgICAgICAgICogdHlwZXMgYXJlIGJlIGRpc3Rpbmd1aXNoYWJsZSB2aWEgZm9ybWF0IHR5cGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0eXBlIGEgdHlwZSB0byBiZSByZWdpc3RlcmVkCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlZ2lzdGVyVHlwZShUeXBlIHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodHlwZXNDb2xsZWN0b3IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVzQ29sbGVjdG9yLnN0cmVhbSgpLmFueU1hdGNoKHQgLT4gKE9iamVjdHMuZXF1YWxzKHQubmFtZSwgdHlwZS5uYW1lKSB8fCBPYmplY3RzLmVxdWFscyh0LnJlcHIsIHR5cGUucmVwcikpICYmICh0LmZvcm1hdENsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZS5mb3JtYXRDbGFzcykpKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJUeXBlIG5hbWVkICIgKyB0eXBlLm5hbWUgKyAiIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCIpOworCisgICAgICAgICAgICAgICAgdHlwZXNDb2xsZWN0b3IuYWRkKHR5cGUpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBmcm9tUmVwcmVzZW50YXRpb24oU3RyaW5nIHJlcHIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBmcm9tUmVwcmVzZW50YXRpb24oU3RyaW5nIHJlcHIsIFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0KQogICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKFR5cGUgdHlwZSA6IFRZUEVTKQorICAgICAgICAgICAgZm9yIChUeXBlIHR5cGUgOiBUeXBlLmFsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodHlwZS5yZXByICE9IG51bGwgJiYgUGF0dGVybi5tYXRjaGVzKHR5cGUucmVwciwgcmVwcikpCisgICAgICAgICAgICAgICAgaWYgKHR5cGUucmVwciAhPSBudWxsICYmIFBhdHRlcm4ubWF0Y2hlcyh0eXBlLnJlcHIsIHJlcHIpICYmIHR5cGUuZm9ybWF0Q2xhc3MuaXNBc3NpZ25hYmxlRnJvbShmb3JtYXQuZ2V0Q2xhc3MoKSkpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIENVU1RPTTsKKyAgICAgICAgICAgIHJldHVybiBUeXBlcy5DVVNUT007CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIENvbXBvbmVudCBjcmVhdGVDb21wb25lbnQoU3RyaW5nIHJlcHIsIFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0KQorICAgICAgICB7CisgICAgICAgICAgICBUeXBlIHR5cGUgPSBmcm9tUmVwcmVzZW50YXRpb24ocmVwciwgZm9ybWF0KTsKKyAgICAgICAgICAgIGlmICh0eXBlLnNpbmdsZXRvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLnNpbmdsZXRvbjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudCh0eXBlLCByZXByKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgVHlwZSB0eXBlID0gKFR5cGUpIG87CisgICAgICAgICAgICByZXR1cm4gaWQgPT0gdHlwZS5pZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21wb25lbnQgZ2V0U2luZ2xldG9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMucmVxdWlyZU5vbk51bGwoc2luZ2xldG9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21wb25lbnQgY3JlYXRlQ29tcG9uZW50KFN0cmluZyByZXByKQorICAgICAgICB7CisgICAgICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoc2luZ2xldG9uID09IG51bGwpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnQodGhpcywgcmVwcik7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBzaW5nbGV0b24gY29tcG9uZW50cyBmb3IgdHlwZXMgdGhhdCBkb24ndCBuZWVkIGlkcwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29tcG9uZW50IERBVEEgPSBuZXcgQ29tcG9uZW50KFR5cGUuREFUQSk7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgUFJJTUFSWV9JTkRFWCA9IG5ldyBDb21wb25lbnQoVHlwZS5QUklNQVJZX0lOREVYKTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIENvbXBvbmVudCBGSUxURVIgPSBuZXcgQ29tcG9uZW50KFR5cGUuRklMVEVSKTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIENvbXBvbmVudCBDT01QUkVTU0lPTl9JTkZPID0gbmV3IENvbXBvbmVudChUeXBlLkNPTVBSRVNTSU9OX0lORk8pOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29tcG9uZW50IFNUQVRTID0gbmV3IENvbXBvbmVudChUeXBlLlNUQVRTKTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIENvbXBvbmVudCBESUdFU1QgPSBuZXcgQ29tcG9uZW50KFR5cGUuRElHRVNUKTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIENvbXBvbmVudCBDUkMgPSBuZXcgQ29tcG9uZW50KFR5cGUuQ1JDKTsKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIENvbXBvbmVudCBTVU1NQVJZID0gbmV3IENvbXBvbmVudChUeXBlLlNVTU1BUlkpOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29tcG9uZW50IFRPQyA9IG5ldyBDb21wb25lbnQoVHlwZS5UT0MpOwotCiAgICAgcHVibGljIGZpbmFsIFR5cGUgdHlwZTsKICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7CiAgICAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZTsKIAotICAgIHB1YmxpYyBDb21wb25lbnQoVHlwZSB0eXBlKQorICAgIHByaXZhdGUgQ29tcG9uZW50KFR5cGUgdHlwZSkKICAgICB7CiAgICAgICAgIHRoaXModHlwZSwgdHlwZS5yZXByKTsKLSAgICAgICAgYXNzZXJ0IHR5cGUgIT0gVHlwZS5DVVNUT007CiAgICAgfQogCi0gICAgcHVibGljIENvbXBvbmVudChUeXBlIHR5cGUsIFN0cmluZyBuYW1lKQorICAgIHByaXZhdGUgQ29tcG9uZW50KFR5cGUgdHlwZSwgU3RyaW5nIG5hbWUpCiAgICAgewogICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsIDogIkNvbXBvbmVudCBuYW1lIGNhbm5vdCBiZSBudWxsIjsKKwogICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLmhhc2hDb2RlID0gT2JqZWN0cy5oYXNoQ29kZSh0eXBlLCBuYW1lKTsKKyAgICAgICAgdGhpcy5oYXNoQ29kZSA9IE9iamVjdHMuaGFzaCh0eXBlLCBuYW1lKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEyNywyNiArMTk5LDI0IEBACiAgICAgICogQHJldHVybiB0aGUgY29tcG9uZW50IGNvcnJlc3BvbmRpbmcgdG8ge0Bjb2RlIG5hbWV9LiBOb3RlIHRoYXQgdGhpcyBhbHdheXMgcmV0dXJuIGEgY29tcG9uZW50IGFzIGFuIHVucmVjb2duaXplZAogICAgICAqIG5hbWUgaXMgcGFyc2VkIGludG8gYSBDVVNUT00gY29tcG9uZW50LgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50IHBhcnNlKFN0cmluZyBuYW1lKQorICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50IHBhcnNlKFN0cmluZyBuYW1lLCBTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCkKICAgICB7Ci0gICAgICAgIFR5cGUgdHlwZSA9IFR5cGUuZnJvbVJlcHJlc2VudGF0aW9uKG5hbWUpOworICAgICAgICByZXR1cm4gVHlwZS5jcmVhdGVDb21wb25lbnQobmFtZSwgZm9ybWF0KTsKKyAgICB9CiAKLSAgICAgICAgLy8gQnVpbGQgKG9yIHJldHJpZXZlIHNpbmdsZXRvbiBmb3IpIHRoZSBjb21wb25lbnQgb2JqZWN0Ci0gICAgICAgIHN3aXRjaCAodHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBEQVRBOiAgICAgICAgICAgICByZXR1cm4gQ29tcG9uZW50LkRBVEE7Ci0gICAgICAgICAgICBjYXNlIFBSSU1BUllfSU5ERVg6ICAgIHJldHVybiBDb21wb25lbnQuUFJJTUFSWV9JTkRFWDsKLSAgICAgICAgICAgIGNhc2UgRklMVEVSOiAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC5GSUxURVI7Ci0gICAgICAgICAgICBjYXNlIENPTVBSRVNTSU9OX0lORk86IHJldHVybiBDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTzsKLSAgICAgICAgICAgIGNhc2UgU1RBVFM6ICAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC5TVEFUUzsKLSAgICAgICAgICAgIGNhc2UgRElHRVNUOiAgICAgICAgICAgcmV0dXJuIENvbXBvbmVudC5ESUdFU1Q7Ci0gICAgICAgICAgICBjYXNlIENSQzogICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQuQ1JDOwotICAgICAgICAgICAgY2FzZSBTVU1NQVJZOiAgICAgICAgICByZXR1cm4gQ29tcG9uZW50LlNVTU1BUlk7Ci0gICAgICAgICAgICBjYXNlIFRPQzogICAgICAgICAgICAgIHJldHVybiBDb21wb25lbnQuVE9DOwotICAgICAgICAgICAgY2FzZSBTRUNPTkRBUllfSU5ERVg6ICByZXR1cm4gbmV3IENvbXBvbmVudChUeXBlLlNFQ09OREFSWV9JTkRFWCwgbmFtZSk7Ci0gICAgICAgICAgICBjYXNlIENVU1RPTTogICAgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50KFR5cGUuQ1VTVE9NLCBuYW1lKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPENvbXBvbmVudD4gZ2V0U2luZ2xldG9uc0ZvcihTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCkKKyAgICB7CisgICAgICAgIHJldHVybiBJdGVyYWJsZXMudHJhbnNmb3JtKEl0ZXJhYmxlcy5maWx0ZXIoVHlwZS5hbGwsIHQgLT4gdC5zaW5nbGV0b24gIT0gbnVsbCAmJiB0LmZvcm1hdENsYXNzLmlzQXNzaWduYWJsZUZyb20oZm9ybWF0LmdldENsYXNzKCkpKSwgdCAtPiB0LnNpbmdsZXRvbik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDb21wb25lbnQ+IGdldFNpbmdsZXRvbnNGb3IoQ2xhc3M8PyBleHRlbmRzIFNTVGFibGVGb3JtYXQ8PywgPz4+IGZvcm1hdENsYXNzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEl0ZXJhYmxlcy50cmFuc2Zvcm0oSXRlcmFibGVzLmZpbHRlcihUeXBlLmFsbCwgdCAtPiB0LnNpbmdsZXRvbiAhPSBudWxsICYmIHQuZm9ybWF0Q2xhc3MuaXNBc3NpZ25hYmxlRnJvbShmb3JtYXRDbGFzcykpLCB0IC0+IHQuc2luZ2xldG9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkRm9yKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICB7CisgICAgICAgIHJldHVybiB0eXBlLmZvcm1hdENsYXNzLmlzQXNzaWduYWJsZUZyb20oZGVzY3JpcHRvci52ZXJzaW9uLmZvcm1hdC5nZXRDbGFzcygpKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE2Miw4ICsyMzIsOCBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb21wb25lbnQpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBDb21wb25lbnQgdGhhdCA9IChDb21wb25lbnQpbzsKLSAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PSB0aGF0LnR5cGUgJiYgdGhpcy5uYW1lLmVxdWFscyh0aGF0Lm5hbWUpOworICAgICAgICBDb21wb25lbnQgdGhhdCA9IChDb21wb25lbnQpIG87CisgICAgICAgIHJldHVybiB0aGlzLmhhc2hDb2RlID09IHRoYXQuaGFzaENvZGUgJiYgdGhpcy50eXBlID09IHRoYXQudHlwZSAmJiB0aGlzLm5hbWUuZXF1YWxzKHRoYXQubmFtZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Rlc2NyaXB0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvRGVzY3JpcHRvci5qYXZhCmluZGV4IDc1ZDUxODUuLmQ3N2QxZjEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvRGVzY3JpcHRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvRGVzY3JpcHRvci5qYXZhCkBAIC0xNywxMyArMTcsMjEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5PYmplY3RzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKQEAgLTMyLDYgKzQwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIAoraW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudC5zZXBhcmF0b3I7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZVVVSUQ7CiAKQEAgLTQ0LDYgKzUzLDI0IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yCiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERlc2NyaXB0b3IuY2xhc3MpOworCisgICAgLy8gQ3VycmVudCBTU1RhYmxlIGRpcmVjdG9yeSBmb3JtYXQgaXMge2tleXNwYWNlfS97dGFibGVOYW1lfS17dGFibGVJZH1bL2JhY2t1cHN8L3NuYXBzaG90cy97dGFnfV1bLy57aW5kZXhOYW1lfV0ve2NvbXBvbmVudH0uZGIKKyAgICAvLyAqIHt2YXJ9IGFyZSBtYW5kYXRvcnkgY29tcG9uZW50cworICAgIC8vICogW3Zhcl0gYXJlIG9wdGlvbmFsIGNvbXBvbmVudHMKKyAgICBzdGF0aWMgZmluYWwgUGF0dGVybiBTU1RBQkxFX0RJUl9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCIuKi8oPzxrZXlzcGFjZT5cXHcrKS8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoPzx0YWJsZU5hbWU+XFx3KyktKD88dGFibGVJZD5bMC05YS1mXXszMn0pLyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihiYWNrdXBzL3xzbmFwc2hvdHMvKD88dGFnPltcXHctXSspLyk/IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFxcLig/PGluZGV4TmFtZT5bXFx3LV0rKS8pPyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig/PGNvbXBvbmVudD5bXFx3LV0rKVxcLig/PGV4dD5bXFx3XSspJCIpOworCisgICAgLy8gUHJlIDIuMSBTU1RhYmxlIGRpcmVjdG9yeSBmb3JtYXQgaXMge2tleXNwYWNlfS97dGFibGVOYW1lfS17dGFibGVJZH1bL2JhY2t1cHN8L3NuYXBzaG90cy97dGFnfV1bLy57aW5kZXhOYW1lfV0ve2NvbXBvbmVudH0uZGIKKyAgICBzdGF0aWMgZmluYWwgUGF0dGVybiBMRUdBQ1lfU1NUQUJMRV9ESVJfUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiLiovKD88a2V5c3BhY2U+XFx3KykvIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig/PHRhYmxlTmFtZT5cXHcrKS8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGJhY2t1cHMvfHNuYXBzaG90cy8oPzx0YWc+W1xcdy1dKykvKT8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFxcLig/PGluZGV4TmFtZT5bXFx3LV0rKS8pPyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoPzxjb21wb25lbnQ+W1xcdy1dKylcXC4oPzxleHQ+W1xcd10rKSQiKTsKKwogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBMRUdBQ1lfVE1QX1JFR0VYX1NUUiA9ICJeKCguKilcXC0oLiopXFwtKT90bXAobGluayk/XFwtKCg/Omx8aykuKVxcLShcXGQpKlxcLSguKikkIjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXR0ZXJuIExFR0FDWV9UTVBfUkVHRVggPSBQYXR0ZXJuLmNvbXBpbGUoTEVHQUNZX1RNUF9SRUdFWF9TVFIpOwogCkBAIC02MCw4ICs4Nyw5IEBACiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBrc25hbWU7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBjZm5hbWU7CiAgICAgcHVibGljIGZpbmFsIFNTVGFibGVJZCBpZDsKLSAgICBwdWJsaWMgZmluYWwgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdFR5cGU7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaGFzaENvZGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJlZml4OworICAgIHByaXZhdGUgZmluYWwgRmlsZSBiYXNlRmlsZTsKIAogICAgIC8qKgogICAgICAqIEEgZGVzY3JpcHRvciB0aGF0IGFzc3VtZXMgQ1VSUkVOVF9WRVJTSU9OLgpAQCAtNjksNzUgKzk3LDkwIEBACiAgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgcHVibGljIERlc2NyaXB0b3IoRmlsZSBkaXJlY3RvcnksIFN0cmluZyBrc25hbWUsIFN0cmluZyBjZm5hbWUsIFNTVGFibGVJZCBpZCkKICAgICB7Ci0gICAgICAgIHRoaXMoU1NUYWJsZUZvcm1hdC5UeXBlLmN1cnJlbnQoKS5pbmZvLmdldExhdGVzdFZlcnNpb24oKSwgZGlyZWN0b3J5LCBrc25hbWUsIGNmbmFtZSwgaWQsIFNTVGFibGVGb3JtYXQuVHlwZS5jdXJyZW50KCkpOworICAgICAgICB0aGlzKERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKS5nZXRMYXRlc3RWZXJzaW9uKCksIGRpcmVjdG9yeSwga3NuYW1lLCBjZm5hbWUsIGlkKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RvciBmb3Igc3N0YWJsZSB3cml0ZXJzIG9ubHkuCiAgICAgICovCi0gICAgcHVibGljIERlc2NyaXB0b3IoRmlsZSBkaXJlY3RvcnksIFN0cmluZyBrc25hbWUsIFN0cmluZyBjZm5hbWUsIFNTVGFibGVJZCBpZCwgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdFR5cGUpCisgICAgcHVibGljIERlc2NyaXB0b3IoRmlsZSBkaXJlY3RvcnksIFN0cmluZyBrc25hbWUsIFN0cmluZyBjZm5hbWUsIFNTVGFibGVJZCBpZCwgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQpCiAgICAgewotICAgICAgICB0aGlzKGZvcm1hdFR5cGUuaW5mby5nZXRMYXRlc3RWZXJzaW9uKCksIGRpcmVjdG9yeSwga3NuYW1lLCBjZm5hbWUsIGlkLCBmb3JtYXRUeXBlKTsKKyAgICAgICAgdGhpcyhmb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpLCBkaXJlY3RvcnksIGtzbmFtZSwgY2ZuYW1lLCBpZCk7CiAgICAgfQogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIERlc2NyaXB0b3IoU3RyaW5nIHZlcnNpb24sIEZpbGUgZGlyZWN0b3J5LCBTdHJpbmcga3NuYW1lLCBTdHJpbmcgY2ZuYW1lLCBTU1RhYmxlSWQgaWQsIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXRUeXBlKQorICAgIHB1YmxpYyBEZXNjcmlwdG9yKFN0cmluZyB2ZXJzaW9uLCBGaWxlIGRpcmVjdG9yeSwgU3RyaW5nIGtzbmFtZSwgU3RyaW5nIGNmbmFtZSwgU1NUYWJsZUlkIGlkLCBTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCkKICAgICB7Ci0gICAgICAgIHRoaXMoZm9ybWF0VHlwZS5pbmZvLmdldFZlcnNpb24odmVyc2lvbiksIGRpcmVjdG9yeSwga3NuYW1lLCBjZm5hbWUsIGlkLCBmb3JtYXRUeXBlKTsKKyAgICAgICAgdGhpcyhmb3JtYXQuZ2V0VmVyc2lvbih2ZXJzaW9uKSwgZGlyZWN0b3J5LCBrc25hbWUsIGNmbmFtZSwgaWQpOwogICAgIH0KIAotICAgIHB1YmxpYyBEZXNjcmlwdG9yKFZlcnNpb24gdmVyc2lvbiwgRmlsZSBkaXJlY3RvcnksIFN0cmluZyBrc25hbWUsIFN0cmluZyBjZm5hbWUsIFNTVGFibGVJZCBpZCwgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdFR5cGUpCisgICAgcHVibGljIERlc2NyaXB0b3IoVmVyc2lvbiB2ZXJzaW9uLCBGaWxlIGRpcmVjdG9yeSwgU3RyaW5nIGtzbmFtZSwgU3RyaW5nIGNmbmFtZSwgU1NUYWJsZUlkIGlkKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IHZlcnNpb24gIT0gbnVsbCAmJiBkaXJlY3RvcnkgIT0gbnVsbCAmJiBrc25hbWUgIT0gbnVsbCAmJiBjZm5hbWUgIT0gbnVsbCAmJiBmb3JtYXRUeXBlLmluZm8uZ2V0TGF0ZXN0VmVyc2lvbigpLmdldENsYXNzKCkuZXF1YWxzKHZlcnNpb24uZ2V0Q2xhc3MoKSk7CisgICAgICAgIGNoZWNrTm90TnVsbCh2ZXJzaW9uKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGRpcmVjdG9yeSk7CisgICAgICAgIGNoZWNrTm90TnVsbChrc25hbWUpOworICAgICAgICBjaGVja05vdE51bGwoY2ZuYW1lKTsKKwogICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwogICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeS50b0Nhbm9uaWNhbCgpOwogICAgICAgICB0aGlzLmtzbmFtZSA9IGtzbmFtZTsKICAgICAgICAgdGhpcy5jZm5hbWUgPSBjZm5hbWU7CiAgICAgICAgIHRoaXMuaWQgPSBpZDsKLSAgICAgICAgdGhpcy5mb3JtYXRUeXBlID0gZm9ybWF0VHlwZTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGFwcGVuZEZpbGVOYW1lKGJ1Zik7CisgICAgICAgIHRoaXMucHJlZml4ID0gYnVmLnRvU3RyaW5nKCk7CisgICAgICAgIHRoaXMuYmFzZUZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnkudG9QYXRoKCkucmVzb2x2ZShwcmVmaXgpKTsKIAogICAgICAgICAvLyBkaXJlY3RvcnkgaXMgdW5uZWNlc3NhcnkgZm9yIGhhc2hDb2RlLCBhbmQgZm9yIHNpbXVsYXRvciBjb25zaXN0ZW5jeSB3ZSBkbyBub3QgaW5jbHVkZSBpdAotICAgICAgICBoYXNoQ29kZSA9IE9iamVjdHMuaGFzaENvZGUodmVyc2lvbiwgaWQsIGtzbmFtZSwgY2ZuYW1lLCBmb3JtYXRUeXBlKTsKKyAgICAgICAgaGFzaENvZGUgPSBPYmplY3RzLmhhc2hDb2RlKHZlcnNpb24sIGlkLCBrc25hbWUsIGNmbmFtZSk7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyB0bXBGaWxlbmFtZUZvcihDb21wb25lbnQgY29tcG9uZW50KQorICAgIHByaXZhdGUgU3RyaW5nIHRtcEZpbGVuYW1lRm9yKENvbXBvbmVudCBjb21wb25lbnQpCiAgICAgewotICAgICAgICByZXR1cm4gZmlsZW5hbWVGb3IoY29tcG9uZW50KSArIFRNUF9FWFQ7CisgICAgICAgIHJldHVybiBmaWxlRm9yKGNvbXBvbmVudCkgKyBUTVBfRVhUOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGUgbmFtZSBmb3IgZ2l2ZW4gY29tcG9uZW50IGR1cmluZyBlbnRpcmUtc3N0YWJsZS1zdHJlYW1pbmcuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0bXBGaWxlbmFtZUZvclN0cmVhbWluZyhDb21wb25lbnQgY29tcG9uZW50KQorICAgIHB1YmxpYyBGaWxlIHRtcEZpbGVGb3IoQ29tcG9uZW50IGNvbXBvbmVudCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShkaXJlY3RvcnkudG9QYXRoKCkucmVzb2x2ZSh0bXBGaWxlbmFtZUZvcihjb21wb25lbnQpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgdG1wRmlsZW5hbWVGb3JTdHJlYW1pbmcoQ29tcG9uZW50IGNvbXBvbmVudCkKICAgICB7CiAgICAgICAgIC8vIFVzZSBVVUlEIHRvIGhhbmRsZSBjb25jdXJyZW50IHN0cmVhbWluZ3Mgb24gdGhlIHNhbWUgc3N0YWJsZS4KICAgICAgICAgLy8gVE1QX0VYVCBhbGxvd3MgdGVtcCBmaWxlIHRvIGJlIHJlbW92ZWQgYnkge0BsaW5rIENvbHVtbkZhbWlseVN0b3JlI3NjcnViRGF0YURpcmVjdG9yaWVzfQogICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMuJXMlcyIsIGZpbGVuYW1lRm9yKGNvbXBvbmVudCksIG5leHRUaW1lVVVJRCgpLCBUTVBfRVhUKTsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGZpbGVuYW1lRm9yKENvbXBvbmVudCBjb21wb25lbnQpCisgICAgLyoqCisgICAgICogQHJldHVybiBhIHVuaXF1ZSB0ZW1wb3JhcnkgZmlsZSBuYW1lIGZvciBnaXZlbiBjb21wb25lbnQgZHVyaW5nIGVudGlyZS1zc3RhYmxlLXN0cmVhbWluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZSB0bXBGaWxlRm9yU3RyZWFtaW5nKENvbXBvbmVudCBjb21wb25lbnQpCiAgICAgewotICAgICAgICByZXR1cm4gYmFzZUZpbGVuYW1lKCkgKyBzZXBhcmF0b3IgKyBjb21wb25lbnQubmFtZSgpOworICAgICAgICByZXR1cm4gbmV3IEZpbGUoZGlyZWN0b3J5LnRvUGF0aCgpLnJlc29sdmUodG1wRmlsZW5hbWVGb3JTdHJlYW1pbmcoY29tcG9uZW50KSkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGZpbGVuYW1lRm9yKENvbXBvbmVudCBjb21wb25lbnQpCisgICAgeworICAgICAgICByZXR1cm4gcHJlZml4ICsgc2VwYXJhdG9yICsgY29tcG9uZW50Lm5hbWUoKTsKICAgICB9CiAKICAgICBwdWJsaWMgRmlsZSBmaWxlRm9yKENvbXBvbmVudCBjb21wb25lbnQpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IEZpbGUoZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7CisgICAgICAgIHJldHVybiBuZXcgRmlsZShkaXJlY3RvcnkudG9QYXRoKCkucmVzb2x2ZShmaWxlbmFtZUZvcihjb21wb25lbnQpKSk7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBiYXNlRmlsZW5hbWUoKQorICAgIHB1YmxpYyBGaWxlIGJhc2VGaWxlKCkKICAgICB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGJ1ZmYuYXBwZW5kKGRpcmVjdG9yeSkuYXBwZW5kKEZpbGUucGF0aFNlcGFyYXRvcigpKTsKLSAgICAgICAgYXBwZW5kRmlsZU5hbWUoYnVmZik7Ci0gICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBiYXNlRmlsZTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYXBwZW5kRmlsZU5hbWUoU3RyaW5nQnVpbGRlciBidWZmKQogICAgIHsKICAgICAgICAgYnVmZi5hcHBlbmQodmVyc2lvbikuYXBwZW5kKHNlcGFyYXRvcik7CiAgICAgICAgIGJ1ZmYuYXBwZW5kKGlkLnRvU3RyaW5nKCkpOwotICAgICAgICBidWZmLmFwcGVuZChzZXBhcmF0b3IpLmFwcGVuZChmb3JtYXRUeXBlLm5hbWUpOworICAgICAgICBidWZmLmFwcGVuZChzZXBhcmF0b3IpLmFwcGVuZCh2ZXJzaW9uLmZvcm1hdC5uYW1lKCkpOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgcmVsYXRpdmVGaWxlbmFtZUZvcihDb21wb25lbnQgY29tcG9uZW50KQpAQCAtMTUzLDkgKzE5Niw5IEBACiAgICAgICAgIHJldHVybiBidWZmLnRvU3RyaW5nKCk7CiAgICAgfQogCi0gICAgcHVibGljIFNTVGFibGVGb3JtYXQgZ2V0Rm9ybWF0KCkKKyAgICBwdWJsaWMgU1NUYWJsZUZvcm1hdDw/LCA/PiBnZXRGb3JtYXQoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGZvcm1hdFR5cGUuaW5mbzsKKyAgICAgICAgcmV0dXJuIHZlcnNpb24uZm9ybWF0OwogICAgIH0KIAogICAgIC8qKiBSZXR1cm4gYW55IHRlbXBvcmFyeSBmaWxlcyBmb3VuZCBpbiB0aGUgZGlyZWN0b3J5ICovCkBAIC0xNzEsNiArMjE0LDIyIEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGNvbXBvbmVudHMgY29uc2lzdGluZyBvZiB0aGUgcHJvdmlkZWQgbWFuZGF0b3J5IGNvbXBvbmVudHMgYW5kIHRob3NlIG9wdGlvbmFsIGNvbXBvbmVudHMKKyAgICAgKiBmb3Igd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgZmlsZSBleGlzdHMuCisgICAgICovCisgICAgcHVibGljIFNldDxDb21wb25lbnQ+IGdldENvbXBvbmVudHMoU2V0PENvbXBvbmVudD4gbWFuZGF0b3J5LCBTZXQ8Q29tcG9uZW50PiBvcHRpb25hbCkKKyAgICB7CisgICAgICAgIEltbXV0YWJsZVNldC5CdWlsZGVyPENvbXBvbmVudD4gYnVpbGRlciA9IEltbXV0YWJsZVNldC5idWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIuYWRkQWxsKG1hbmRhdG9yeSk7CisgICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IG9wdGlvbmFsKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmlsZUZvcihjb21wb25lbnQpLmV4aXN0cygpKQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkKGNvbXBvbmVudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEZpbGUoRmlsZSBmaWxlKQogICAgIHsKICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZmlsZS5uYW1lKCk7CkBAIC0xODAsMjMgKzIzOSw2IEBACiAgICAgLyoqCiAgICAgICogUGFyc2UgYSBzc3RhYmxlIGZpbGVuYW1lIGludG8gYSBEZXNjcmlwdG9yLgogICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgYSBzaG9ydGN1dCBmb3Ige0Bjb2RlIGZyb21GaWxlbmFtZShuZXcgRmlsZShmaWxlbmFtZSkpfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWxlbmFtZSB0aGUgZmlsZW5hbWUgdG8gYSBzc3RhYmxlIGNvbXBvbmVudC4KLSAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgcGFyc2VkIGZpbGUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZWQge0Bjb2RlIGZpbGV9IGRvZXMgcG9pbnQgdG8gYSB2YWxpZCBzc3RhYmxlIGZpbGVuYW1lLiBUaGlzIGNvdWxkCi0gICAgICogbWVhbiBlaXRoZXIgdGhhdCB0aGUgZmlsZW5hbWUgZG9lc24ndCBsb29rIGxpa2UgYSBzc3RhYmxlIGZpbGUsIG9yIHRoYXQgaXQgaXMgZm9yIGFuIG9sZCBhbmQgdW5zdXBwb3J0ZWQKLSAgICAgKiB2ZXJzaW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERlc2NyaXB0b3IgZnJvbUZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmcm9tRmlsZW5hbWUobmV3IEZpbGUoZmlsZW5hbWUpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhIHNzdGFibGUgZmlsZW5hbWUgaW50byBhIERlc2NyaXB0b3IuCi0gICAgICogPHA+CiAgICAgICogU1NUYWJsZXMgZmlsZXMgYXJlIGFsbCBsb2NhdGVkIHdpdGhpbiBzdWJkaXJlY3RvcmllcyBvZiB0aGUgZm9ybSB7QGNvZGUgPGtleXNwYWNlPi88dGFibGU+L30uIE5vcm1hbCBzc3RhYmxlcyBhcmUKICAgICAgKiBhcmUgZGlyZWN0bHkgd2l0aGluIHRoYXQgc3ViZGlyZWN0b3J5IHN0cnVjdHVyZSB3aGlsZSAybmRhcnkgaW5kZXgsIGJhY2t1cHMgYW5kIHNuYXBzaG90IGFyZSBlYWNoIGluc2lkZSBhbgogICAgICAqIGFkZGl0aW9uYWwgc3ViZGlyZWN0b3J5LiBUaGUgZmlsZSB0aGVtc2VsdmVzIGhhdmUgdGhlIGZvcm06CkBAIC0yMTEsMTMgKzI1MywzMSBAQAogICAgICAqIG1lYW4gZWl0aGVyIHRoYXQgdGhlIGZpbGVuYW1lIGRvZXNuJ3QgbG9vayBsaWtlIGEgc3N0YWJsZSBmaWxlLCBvciB0aGF0IGl0IGlzIGZvciBhbiBvbGQgYW5kIHVuc3VwcG9ydGVkCiAgICAgICogdmVyc2lvbnMuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEZXNjcmlwdG9yIGZyb21GaWxlbmFtZShGaWxlIGZpbGUpCisgICAgcHVibGljIHN0YXRpYyBEZXNjcmlwdG9yIGZyb21GaWxlKEZpbGUgZmlsZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBmcm9tRmlsZW5hbWVXaXRoQ29tcG9uZW50KGZpbGUpLmxlZnQ7CisgICAgICAgIHJldHVybiBmcm9tRmlsZVdpdGhDb21wb25lbnQoZmlsZSkubGVmdDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIENvbXBvbmVudCBjb21wb25lbnRGcm9tRmlsZShGaWxlIGZpbGUpCisgICAgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGZpbGUubmFtZSgpOworICAgICAgICBMaXN0PFN0cmluZz4gdG9rZW5zID0gZmlsZW5hbWVUb2tlbnMobmFtZSk7CisKKyAgICAgICAgcmV0dXJuIENvbXBvbmVudC5wYXJzZSh0b2tlbnMuZ2V0KDMpLCBmb3JtYXRGcm9tTmFtZShuYW1lLCB0b2tlbnMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdEZyb21OYW1lKFN0cmluZyBmaWxlTmFtZSwgTGlzdDxTdHJpbmc+IHRva2VucykKKyAgICB7CisgICAgICAgIFN0cmluZyBmb3JtYXRTdHJpbmcgPSB0b2tlbnMuZ2V0KDIpOworICAgICAgICBTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpLmdldChmb3JtYXRTdHJpbmcpOworICAgICAgICBpZiAoZm9ybWF0ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBpbnZhbGlkU1NUYWJsZShmaWxlTmFtZSwgInVua25vd24gJ2Zvcm1hdCcgcGFydCAoJXMpIiwgZm9ybWF0U3RyaW5nKTsKKyAgICAgICAgcmV0dXJuIGZvcm1hdDsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBQYXJzZSBhIHNzdGFibGUgZmlsZW5hbWUsIGV4dHJhY3RpbmcgYm90aCB0aGUge0Bjb2RlIERlc2NyaXB0b3J9IGFuZCB7QGNvZGUgQ29tcG9uZW50fSBwYXJ0LgorICAgICAqIFRoZSBrZXlzcGFjZS90YWJsZSBuYW1lIHdpbGwgYmUgZXh0cmFjdGVkIGZyb20gdGhlIGRpcmVjdG9yeSBwYXRoLgogICAgICAqCiAgICAgICogQHBhcmFtIGZpbGUgdGhlIHtAY29kZSBGaWxlfSBvYmplY3QgZm9yIHRoZSBmaWxlbmFtZSB0byBwYXJzZS4KICAgICAgKiBAcmV0dXJuIGEgcGFpciBvZiB0aGUgZGVzY3JpcHRvciBhbmQgY29tcG9uZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3ZpZGVkIHtAY29kZSBmaWxlfS4KQEAgLTIyNiwxNCArMjg2LDc3IEBACiAgICAgICogbWVhbiBlaXRoZXIgdGhhdCB0aGUgZmlsZW5hbWUgZG9lc24ndCBsb29rIGxpa2UgYSBzc3RhYmxlIGZpbGUsIG9yIHRoYXQgaXQgaXMgZm9yIGFuIG9sZCBhbmQgdW5zdXBwb3J0ZWQKICAgICAgKiB2ZXJzaW9ucy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFBhaXI8RGVzY3JpcHRvciwgQ29tcG9uZW50PiBmcm9tRmlsZW5hbWVXaXRoQ29tcG9uZW50KEZpbGUgZmlsZSkKKyAgICBwdWJsaWMgc3RhdGljIFBhaXI8RGVzY3JpcHRvciwgQ29tcG9uZW50PiBmcm9tRmlsZVdpdGhDb21wb25lbnQoRmlsZSBmaWxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZyb21GaWxlV2l0aENvbXBvbmVudChmaWxlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFBhaXI8RGVzY3JpcHRvciwgQ29tcG9uZW50PiBmcm9tRmlsZVdpdGhDb21wb25lbnQoRmlsZSBmaWxlLCBib29sZWFuIHZhbGlkYXRlRGlycykKICAgICB7CiAgICAgICAgIC8vIFdlIG5lZWQgdG8gZXh0cmFjdCB0aGUga2V5c3BhY2UgYW5kIHRhYmxlIG5hbWVzIGZyb20gdGhlIHBhcmVudCBkaXJlY3Rvcmllcywgc28gbWFrZSBzdXJlIHdlIGRlYWwgd2l0aCB0aGUKICAgICAgICAgLy8gYWJzb2x1dGUgcGF0aC4KICAgICAgICAgaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkKICAgICAgICAgICAgIGZpbGUgPSBmaWxlLnRvQWJzb2x1dGUoKTsKIAorICAgICAgICBTU1RhYmxlSW5mbyBpbmZvID0gdmFsaWRhdGVBbmRFeHRyYWN0SW5mbyhmaWxlKTsKICAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlLm5hbWUoKTsKKworICAgICAgICBTdHJpbmcga2V5c3BhY2VOYW1lID0gIiI7CisgICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSAiIjsKKworICAgICAgICBNYXRjaGVyIHNzdGFibGVEaXJNYXRjaGVyID0gU1NUQUJMRV9ESVJfUEFUVEVSTi5tYXRjaGVyKGZpbGUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgLy8gVXNlIHByZS0yLjEgU1NUYWJsZSBmb3JtYXQgaWYgY3VycmVudCBvbmUgZG9lcyBub3QgbWF0Y2ggaXQKKyAgICAgICAgaWYgKCFzc3RhYmxlRGlyTWF0Y2hlci5maW5kKDApKQorICAgICAgICB7CisgICAgICAgICAgICBzc3RhYmxlRGlyTWF0Y2hlciA9IExFR0FDWV9TU1RBQkxFX0RJUl9QQVRURVJOLm1hdGNoZXIoZmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzc3RhYmxlRGlyTWF0Y2hlci5maW5kKDApKQorICAgICAgICB7CisgICAgICAgICAgICBrZXlzcGFjZU5hbWUgPSBzc3RhYmxlRGlyTWF0Y2hlci5ncm91cCgia2V5c3BhY2UiKTsKKyAgICAgICAgICAgIHRhYmxlTmFtZSA9IHNzdGFibGVEaXJNYXRjaGVyLmdyb3VwKCJ0YWJsZU5hbWUiKTsKKyAgICAgICAgICAgIFN0cmluZyBpbmRleE5hbWUgPSBzc3RhYmxlRGlyTWF0Y2hlci5ncm91cCgiaW5kZXhOYW1lIik7CisgICAgICAgICAgICBpZiAoaW5kZXhOYW1lICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGFibGVOYW1lID0gU3RyaW5nLmZvcm1hdCgiJXMuJXMiLCB0YWJsZU5hbWUsIGluZGV4TmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodmFsaWRhdGVEaXJzKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoIkNvdWxkIG5vdCBleHRyYWN0IGtleXNwYWNlL3RhYmxlIGluZm8gZnJvbSBzc3RhYmxlIGRpcmVjdG9yeSB7fSIsIGZpbGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB0aHJvdyBpbnZhbGlkU1NUYWJsZShuYW1lLCBTdHJpbmcuZm9ybWF0KCJjYW5ub3QgZXh0cmFjdCBrZXlzcGFjZSBhbmQgdGFibGUgbmFtZSBmcm9tICVzOyBtYWtlIHN1cmUgdGhlIHNzdGFibGUgaXMgaW4gdGhlIHByb3BlciBzdWItZGlyZWN0b3JpZXMiLCBmaWxlKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUobmV3IERlc2NyaXB0b3IoaW5mby52ZXJzaW9uLCBwYXJlbnRPZihuYW1lLCBmaWxlKSwga2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsIGluZm8uaWQpLCBpbmZvLmNvbXBvbmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgYSBzc3RhYmxlIGZpbGVuYW1lLCBleHRyYWN0aW5nIGJvdGggdGhlIHtAY29kZSBEZXNjcmlwdG9yfSBhbmQge0Bjb2RlIENvbXBvbmVudH0gcGFydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlICAgICB0aGUge0Bjb2RlIEZpbGV9IG9iamVjdCBmb3IgdGhlIGZpbGVuYW1lIHRvIHBhcnNlLgorICAgICAqIEBwYXJhbSBrZXlzcGFjZSBUaGUga2V5c3BhY2UgbmFtZSBvZiB0aGUgZmlsZS4gSWYgPGNvZGU+bnVsbDwvY29kZT4sIHRoZW4gdGhlIGtleXNwYWNlIG5hbWUgd2lsbCBiZSBleHRyYWN0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgZnJvbSB0aGUgZGlyZWN0b3J5IHBhdGguCisgICAgICogQHBhcmFtIHRhYmxlICAgIFRoZSB0YWJsZSBuYW1lIG9mIHRoZSBmaWxlLiBJZiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiB0aGUgdGFibGUgbmFtZSB3aWxsIGJlIGV4dHJhY3RlZCBmcm9tIHRoZQorICAgICAqICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgcGF0aC4KKyAgICAgKiBAcmV0dXJuIGEgcGFpciBvZiB0aGUgZGVzY3JpcHRvciBhbmQgY29tcG9uZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByb3ZpZGVkIHtAY29kZSBmaWxlfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJvdmlkZWQge0Bjb2RlIGZpbGV9IGRvZXMgcG9pbnQgdG8gYSB2YWxpZCBzc3RhYmxlIGZpbGVuYW1lLiBUaGlzIGNvdWxkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbiBlaXRoZXIgdGhhdCB0aGUgZmlsZW5hbWUgZG9lc24ndCBsb29rIGxpa2UgYSBzc3RhYmxlIGZpbGUsIG9yIHRoYXQgaXQgaXMgZm9yIGFuIG9sZCBhbmQgdW5zdXBwb3J0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhaXI8RGVzY3JpcHRvciwgQ29tcG9uZW50PiBmcm9tRmlsZVdpdGhDb21wb25lbnQoRmlsZSBmaWxlLCBTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSkKKyAgICB7CisgICAgICAgIGlmIChudWxsID09IGtleXNwYWNlIHx8IG51bGwgPT0gdGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmcm9tRmlsZVdpdGhDb21wb25lbnQoZmlsZSk7CisgICAgICAgIH0KKworICAgICAgICBTU1RhYmxlSW5mbyBpbmZvID0gdmFsaWRhdGVBbmRFeHRyYWN0SW5mbyhmaWxlKTsKKyAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKG5ldyBEZXNjcmlwdG9yKGluZm8udmVyc2lvbiwgcGFyZW50T2YoZmlsZS5uYW1lKCksIGZpbGUpLCBrZXlzcGFjZSwgdGFibGUsIGluZm8uaWQpLCBpbmZvLmNvbXBvbmVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGZpbGVuYW1lVG9rZW5zKFN0cmluZyBuYW1lKQorICAgIHsKICAgICAgICAgTGlzdDxTdHJpbmc+IHRva2VucyA9IGZpbGVuYW1lU3BsaXR0ZXIuc3BsaXRUb0xpc3QobmFtZSk7CiAgICAgICAgIGludCBzaXplID0gdG9rZW5zLnNpemUoKTsKIApAQCAtMjQ1LDExICszNjgsMTYgQEAKICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBhc3N1bWUgaXQncyBhbiBvbGQgZm9ybWF0IHNzdGFibGUgaWYgaXQgaGFzIHRoZSByaWdodCBudW1iZXIgb2YgdG9rZW5zOiB0aGlzIGlzIG5vdCBwZXJmZWN0CiAgICAgICAgICAgICAvLyBidXQgd2UncmUganVzdCB0cnlpbmcgdG8gYmUgaGVscGZ1bCwgbm90IHBlcmZlY3QuCiAgICAgICAgICAgICBpZiAoc2l6ZSA9PSA1IHx8IHNpemUgPT0gNikKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIiVzIGlzIG9mIHZlcnNpb24gJXMgd2hpY2ggaXMgbm93IHVuc3VwcG9ydGVkIGFuZCBjYW5ub3QgYmUgcmVhZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnMuZ2V0KHNpemUgLSAzKSkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiJXMgaXMgb2YgdmVyc2lvbiAlcyB3aGljaCBpcyBub3cgdW5zdXBwb3J0ZWQgYW5kIGNhbm5vdCBiZSByZWFkLiIsIG5hbWUsIHRva2Vucy5nZXQoc2l6ZSAtIDMpKSk7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkludmFsaWQgc3N0YWJsZSBmaWxlICVzOiB0aGUgbmFtZSBkb2Vzbid0IGxvb2sgbGlrZSBhIHN1cHBvcnRlZCBzc3RhYmxlIGZpbGUgbmFtZSIsIG5hbWUpKTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gdG9rZW5zOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFNTVGFibGVJbmZvIHZhbGlkYXRlQW5kRXh0cmFjdEluZm8oRmlsZSBmaWxlKQorICAgIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlLm5hbWUoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHRva2VucyA9IGZpbGVuYW1lVG9rZW5zKG5hbWUpOwogCiAgICAgICAgIFN0cmluZyB2ZXJzaW9uU3RyaW5nID0gdG9rZW5zLmdldCgwKTsKICAgICAgICAgaWYgKCFWZXJzaW9uLnZhbGlkYXRlKHZlcnNpb25TdHJpbmcpKQpAQCAtMjY1LDQ5ICszOTMsMjggQEAKICAgICAgICAgICAgIHRocm93IGludmFsaWRTU1RhYmxlKG5hbWUsICJ0aGUgJ2lkJyBwYXJ0ICglcykgb2YgdGhlIG5hbWUgZG9lc24ndCBwYXJzZSBhcyBhIHZhbGlkIHVuaXF1ZSBpZGVudGlmaWVyIiwgdG9rZW5zLmdldCgxKSk7CiAgICAgICAgIH0KIAotICAgICAgICBTdHJpbmcgZm9ybWF0U3RyaW5nID0gdG9rZW5zLmdldCgyKTsKLSAgICAgICAgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcm1hdCA9IFNTVGFibGVGb3JtYXQuVHlwZS52YWxpZGF0ZShmb3JtYXRTdHJpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IGludmFsaWRTU1RhYmxlKG5hbWUsICJ1bmtub3duICdmb3JtYXQnIHBhcnQgKCVzKSIsIGZvcm1hdFN0cmluZyk7Ci0gICAgICAgIH0KKyAgICAgICAgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQgPSBmb3JtYXRGcm9tTmFtZShuYW1lLCB0b2tlbnMpOworICAgICAgICBDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50LnBhcnNlKHRva2Vucy5nZXQoMyksIGZvcm1hdCk7CiAKLSAgICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudC5wYXJzZSh0b2tlbnMuZ2V0KDMpKTsKLQotICAgICAgICBWZXJzaW9uIHZlcnNpb24gPSBmb3JtYXQuaW5mby5nZXRWZXJzaW9uKHZlcnNpb25TdHJpbmcpOworICAgICAgICBWZXJzaW9uIHZlcnNpb24gPSBmb3JtYXQuZ2V0VmVyc2lvbih2ZXJzaW9uU3RyaW5nKTsKICAgICAgICAgaWYgKCF2ZXJzaW9uLmlzQ29tcGF0aWJsZSgpKQogICAgICAgICAgICAgdGhyb3cgaW52YWxpZFNTVGFibGUobmFtZSwgImluY29tcGF0aWJsZSBzc3RhYmxlIHZlcnNpb24gKCVzKTsgeW91IHNob3VsZCBoYXZlIHJ1biB1cGdyYWRlc3N0YWJsZXMgYmVmb3JlIHVwZ3JhZGluZyIsIHZlcnNpb25TdHJpbmcpOwogCi0gICAgICAgIEZpbGUgZGlyZWN0b3J5ID0gcGFyZW50T2YobmFtZSwgZmlsZSk7Ci0gICAgICAgIEZpbGUgdGFibGVEaXIgPSBkaXJlY3Rvcnk7CisgICAgICAgIHJldHVybiBuZXcgU1NUYWJsZUluZm8odmVyc2lvbiwgaWQsIGNvbXBvbmVudCk7CisgICAgfQogCi0gICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSAybmRhcnkgaW5kZXggZGlyZWN0b3J5IChub3QgdGhhdCBpdCBkb2Vzbid0IGV4Y2x1ZGUgaXQgdG8gYmUgYWxzbyBhIGJhY2t1cCBvciBzbmFwc2hvdCkKLSAgICAgICAgU3RyaW5nIGluZGV4TmFtZSA9ICIiOwotICAgICAgICBpZiAoRGlyZWN0b3JpZXMuaXNTZWNvbmRhcnlJbmRleEZvbGRlcih0YWJsZURpcikpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU1NUYWJsZUluZm8KKyAgICB7CisgICAgICAgIGZpbmFsIFZlcnNpb24gdmVyc2lvbjsKKyAgICAgICAgZmluYWwgU1NUYWJsZUlkIGlkOworICAgICAgICBmaW5hbCBDb21wb25lbnQgY29tcG9uZW50OworCisgICAgICAgIFNTVGFibGVJbmZvKFZlcnNpb24gdmVyc2lvbiwgU1NUYWJsZUlkIGlkLCBDb21wb25lbnQgY29tcG9uZW50KQogICAgICAgICB7Ci0gICAgICAgICAgICBpbmRleE5hbWUgPSB0YWJsZURpci5uYW1lKCk7Ci0gICAgICAgICAgICB0YWJsZURpciA9IHBhcmVudE9mKG5hbWUsIHRhYmxlRGlyKTsKKyAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKICAgICAgICAgfQotCi0gICAgICAgIC8vIFRoZW4gaXQgY2FuIGJlIGEgYmFja3VwIG9yIGEgc25hcHNob3QKLSAgICAgICAgaWYgKHRhYmxlRGlyLm5hbWUoKS5lcXVhbHMoRGlyZWN0b3JpZXMuQkFDS1VQU19TVUJESVIpICYmIHRhYmxlRGlyLnBhcmVudCgpLm5hbWUoKS5jb250YWlucygiLSIpKQotICAgICAgICAgICAgdGFibGVEaXIgPSB0YWJsZURpci5wYXJlbnQoKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGtleXNwYWNlT3JTbmFwc2hvdERpciA9IHBhcmVudE9mKG5hbWUsIHRhYmxlRGlyKTsKLSAgICAgICAgICAgIGlmIChrZXlzcGFjZU9yU25hcHNob3REaXIubmFtZSgpLmVxdWFscyhEaXJlY3Rvcmllcy5TTkFQU0hPVF9TVUJESVIpCi0gICAgICAgICAgICAgICAgJiYgcGFyZW50T2YobmFtZSwga2V5c3BhY2VPclNuYXBzaG90RGlyKS5uYW1lKCkuY29udGFpbnMoIi0iKSkKLSAgICAgICAgICAgICAgICB0YWJsZURpciA9IHBhcmVudE9mKG5hbWUsIGtleXNwYWNlT3JTbmFwc2hvdERpcik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgdGFibGUgPSB0YWJsZURpci5uYW1lKCkuc3BsaXQoIi0iKVswXSArIGluZGV4TmFtZTsKLSAgICAgICAgU3RyaW5nIGtleXNwYWNlID0gcGFyZW50T2YobmFtZSwgdGFibGVEaXIpLm5hbWUoKTsKLQotICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUobmV3IERlc2NyaXB0b3IodmVyc2lvbiwgZGlyZWN0b3J5LCBrZXlzcGFjZSwgdGFibGUsIGlkLCBmb3JtYXQpLCBjb21wb25lbnQpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIEZpbGUgcGFyZW50T2YoU3RyaW5nIG5hbWUsIEZpbGUgZmlsZSkKQEAgLTMzNiwxMCArNDQzLDIxIEBACiAgICAgICAgIHJldHVybiB2ZXJzaW9uLmlzQ29tcGF0aWJsZSgpOwogICAgIH0KIAorICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiBkaXNjb3ZlckNvbXBvbmVudHMoKQorICAgIHsKKyAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IFNldHMubmV3SGFzaFNldFdpdGhFeHBlY3RlZFNpemUoQ29tcG9uZW50LlR5cGUuYWxsLnNpemUoKSk7CisgICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IENvbXBvbmVudC5nZXRTaW5nbGV0b25zRm9yKHZlcnNpb24uZm9ybWF0KSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpbGVGb3IoY29tcG9uZW50KS5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFkZChjb21wb25lbnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21wb25lbnRzOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VGaWxlbmFtZSgpOworICAgICAgICByZXR1cm4gYmFzZUZpbGUoKS5hYnNvbHV0ZVBhdGgoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTM1MCwxMiArNDY4LDEzIEBACiAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgRGVzY3JpcHRvciB0aGF0ID0gKERlc2NyaXB0b3IpbzsKKyAgICAgICAgaWYgKHRoaXMuaGFzaENvZGUgIT0gdGhhdC5oYXNoQ29kZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgcmV0dXJuIHRoYXQuZGlyZWN0b3J5LmVxdWFscyh0aGlzLmRpcmVjdG9yeSkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhhdC5pZC5lcXVhbHModGhpcy5pZCkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGhhdC5rc25hbWUuZXF1YWxzKHRoaXMua3NuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGF0LmNmbmFtZS5lcXVhbHModGhpcy5jZm5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICYmIHRoYXQudmVyc2lvbi5lcXVhbHModGhpcy52ZXJzaW9uKQotICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGF0LmZvcm1hdFR5cGUgPT0gdGhpcy5mb3JtYXRUeXBlOworICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGF0LnZlcnNpb24uZXF1YWxzKHRoaXMudmVyc2lvbik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0VtcHR5U1NUYWJsZVNjYW5uZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvRW1wdHlTU1RhYmxlU2Nhbm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NzZlZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0VtcHR5U1NUYWJsZVNjYW5uZXIuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkFic3RyYWN0VW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CisKK3B1YmxpYyBjbGFzcyBFbXB0eVNTVGFibGVTY2FubmVyIGV4dGVuZHMgQWJzdHJhY3RVbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3IgaW1wbGVtZW50cyBJU1NUYWJsZVNjYW5uZXIKK3sKKyAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKKworICAgIHB1YmxpYyBFbXB0eVNTVGFibGVTY2FubmVyKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkKKyAgICB7CisgICAgICAgIHRoaXMuc3N0YWJsZSA9IHNzdGFibGU7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0Qnl0ZXNTY2FubmVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldExlbmd0aEluQnl0ZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0Q29tcHJlc3NlZExlbmd0aEluQnl0ZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIFNldDxTU1RhYmxlUmVhZGVyPiBnZXRCYWNraW5nU1NUYWJsZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5vZihzc3RhYmxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNzdGFibGUubWV0YWRhdGEoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIG5leHQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvR2F1Z2VQcm92aWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9HYXVnZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2ODBiZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvR2F1Z2VQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkdhdWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2F1Z2VQcm92aWRlcjxUIGV4dGVuZHMgTnVtYmVyPgoreworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgIHB1YmxpYyBHYXVnZVByb3ZpZGVyKFN0cmluZyBuYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgR2F1Z2U8VD4gZ2V0VGFibGVHYXVnZShDb2x1bW5GYW1pbHlTdG9yZSBjZnMpOworCisgICAgcHVibGljIGFic3RyYWN0IEdhdWdlPFQ+IGdldEtleXNwYWNlR2F1Z2UoS2V5c3BhY2Uga2V5c3BhY2UpOworCisgICAgcHVibGljIGFic3RyYWN0IEdhdWdlPFQ+IGdldEdsb2JhbEdhdWdlKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0lPT3B0aW9ucy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JT09wdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjM5NWE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JT09wdGlvbnMuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyT3B0aW9uOworCitwdWJsaWMgY2xhc3MgSU9PcHRpb25zCit7CisgICAgcHVibGljIHN0YXRpYyBJT09wdGlvbnMgZnJvbURhdGFiYXNlRGVzY3JpcHRvcigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IElPT3B0aW9ucyhEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGlza09wdGltaXphdGlvblN0cmF0ZWd5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5nZXREaXNrQWNjZXNzTW9kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW5kZXhBY2Nlc3NNb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5nZXREaXNrT3B0aW1pemF0aW9uRXN0aW1hdGVQZXJjZW50aWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24ubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHJpY2tsZUZzeW5jKERhdGFiYXNlRGVzY3JpcHRvci5nZXRUcmlja2xlRnN5bmMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmlja2xlRnN5bmNCeXRlSW50ZXJ2YWwoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFRyaWNrbGVGc3luY0ludGVydmFsSW5LaUIoKSAqIDEwMjQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEZsdXNoQ29tcHJlc3Npb24oKSk7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIERpc2tPcHRpbWl6YXRpb25TdHJhdGVneSBkaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3k7CisgICAgcHVibGljIGZpbmFsIENvbmZpZy5EaXNrQWNjZXNzTW9kZSBkZWZhdWx0RGlza0FjY2Vzc01vZGU7CisgICAgcHVibGljIGZpbmFsIENvbmZpZy5EaXNrQWNjZXNzTW9kZSBpbmRleERpc2tBY2Nlc3NNb2RlOworICAgIHB1YmxpYyBmaW5hbCBkb3VibGUgZGlza09wdGltaXphdGlvbkVzdGltYXRlUGVyY2VudGlsZTsKKyAgICBwdWJsaWMgZmluYWwgU2VxdWVudGlhbFdyaXRlck9wdGlvbiB3cml0ZXJPcHRpb25zOworICAgIHB1YmxpYyBmaW5hbCBDb25maWcuRmx1c2hDb21wcmVzc2lvbiBmbHVzaENvbXByZXNzaW9uOworCisgICAgcHVibGljIElPT3B0aW9ucyhEaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3kgZGlza09wdGltaXphdGlvblN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgQ29uZmlnLkRpc2tBY2Nlc3NNb2RlIGRlZmF1bHREaXNrQWNjZXNzTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5EaXNrQWNjZXNzTW9kZSBpbmRleERpc2tBY2Nlc3NNb2RlLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRpc2tPcHRpbWl6YXRpb25Fc3RpbWF0ZVBlcmNlbnRpbGUsCisgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uIHdyaXRlck9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBDb25maWcuRmx1c2hDb21wcmVzc2lvbiBmbHVzaENvbXByZXNzaW9uKQorICAgIHsKKyAgICAgICAgdGhpcy5kaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3kgPSBkaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3k7CisgICAgICAgIHRoaXMuZGVmYXVsdERpc2tBY2Nlc3NNb2RlID0gZGVmYXVsdERpc2tBY2Nlc3NNb2RlOworICAgICAgICB0aGlzLmluZGV4RGlza0FjY2Vzc01vZGUgPSBpbmRleERpc2tBY2Nlc3NNb2RlOworICAgICAgICB0aGlzLmRpc2tPcHRpbWl6YXRpb25Fc3RpbWF0ZVBlcmNlbnRpbGUgPSBkaXNrT3B0aW1pemF0aW9uRXN0aW1hdGVQZXJjZW50aWxlOworICAgICAgICB0aGlzLndyaXRlck9wdGlvbnMgPSB3cml0ZXJPcHRpb25zOworICAgICAgICB0aGlzLmZsdXNoQ29tcHJlc3Npb24gPSBmbHVzaENvbXByZXNzaW9uOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0lTU1RhYmxlU2Nhbm5lci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JU1NUYWJsZVNjYW5uZXIuamF2YQppbmRleCBhZjY2MWI3Li42NzFiY2NiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0lTU1RhYmxlU2Nhbm5lci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSVNTVGFibGVTY2FubmVyLmphdmEKQEAgLTY0LDcgKzY0LDggQEAKIAogICAgICAgICBpZiAodGhyb3dhYmxlICE9IG51bGwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFRocm93YWJsZXMucHJvcGFnYXRlKHRocm93YWJsZSk7CisgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQodGhyb3dhYmxlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRocm93YWJsZSk7CiAgICAgICAgIH0KIAogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSVNjcnViYmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0lTY3J1YmJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYzZlYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0lTY3J1YmJlci5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nSm9pbmVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb3NlYWJsZTsKKworcHVibGljIGludGVyZmFjZSBJU2NydWJiZXIgZXh0ZW5kcyBDbG9zZWFibGUKK3sKKyAgICB2b2lkIHNjcnViKCk7CisKKyAgICB2b2lkIGNsb3NlKCk7CisKKyAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgZ2V0U2NydWJJbmZvKCk7CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBTY3J1YlJlc3VsdCBzY3J1YldpdGhSZXN1bHQoKTsKKworICAgIHN0YXRpYyBPcHRpb25zLkJ1aWxkZXIgb3B0aW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IE9wdGlvbnMuQnVpbGRlcigpOworICAgIH0KKworICAgIGZpbmFsIGNsYXNzIFNjcnViUmVzdWx0CisgICAgeworICAgICAgICBwdWJsaWMgZmluYWwgaW50IGdvb2RQYXJ0aXRpb25zOworICAgICAgICBwdWJsaWMgZmluYWwgaW50IGJhZFBhcnRpdGlvbnM7CisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgZW1wdHlQYXJ0aXRpb25zOworCisgICAgICAgIHB1YmxpYyBTY3J1YlJlc3VsdChpbnQgZ29vZFBhcnRpdGlvbnMsIGludCBiYWRQYXJ0aXRpb25zLCBpbnQgZW1wdHlQYXJ0aXRpb25zKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmdvb2RQYXJ0aXRpb25zID0gZ29vZFBhcnRpdGlvbnM7CisgICAgICAgICAgICB0aGlzLmJhZFBhcnRpdGlvbnMgPSBiYWRQYXJ0aXRpb25zOworICAgICAgICAgICAgdGhpcy5lbXB0eVBhcnRpdGlvbnMgPSBlbXB0eVBhcnRpdGlvbnM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBPcHRpb25zCisgICAgeworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjaGVja0RhdGE7CisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3M7CisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHNraXBDb3JydXB0ZWQ7CisKKyAgICAgICAgcHJpdmF0ZSBPcHRpb25zKGJvb2xlYW4gY2hlY2tEYXRhLCBib29sZWFuIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jaGVja0RhdGEgPSBjaGVja0RhdGE7CisgICAgICAgICAgICB0aGlzLnJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MgPSByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzOworICAgICAgICAgICAgdGhpcy5za2lwQ29ycnVwdGVkID0gc2tpcENvcnJ1cHRlZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdKb2luZXIoIiwgIiwgT3B0aW9ucy5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyAiWyIsICJdIikKKyAgICAgICAgICAgICAgICAgICAuYWRkKCJjaGVja0RhdGE9IiArIGNoZWNrRGF0YSkKKyAgICAgICAgICAgICAgICAgICAuYWRkKCJyZWluc2VydE92ZXJmbG93ZWRUVExSb3dzPSIgKyByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzKQorICAgICAgICAgICAgICAgICAgIC5hZGQoInNraXBDb3JydXB0ZWQ9IiArIHNraXBDb3JydXB0ZWQpCisgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrRGF0YSA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBza2lwQ29ycnVwdGVkID0gZmFsc2U7CisKKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNoZWNrRGF0YSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5jaGVja0RhdGEgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBjaGVja0RhdGEoYm9vbGVhbiBjaGVja0RhdGEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5jaGVja0RhdGEgPSBjaGVja0RhdGE7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMucmVpbnNlcnRPdmVyZmxvd2VkVFRMUm93cyA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MoYm9vbGVhbiByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMucmVpbnNlcnRPdmVyZmxvd2VkVFRMUm93cyA9IHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3M7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNraXBDb3JydXB0ZWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuc2tpcENvcnJ1cHRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNraXBDb3JydXB0ZWQoYm9vbGVhbiBza2lwQ29ycnVwdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuc2tpcENvcnJ1cHRlZCA9IHNraXBDb3JydXB0ZWQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBPcHRpb25zIGJ1aWxkKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9wdGlvbnMoY2hlY2tEYXRhLCByZWluc2VydE92ZXJmbG93ZWRUVExSb3dzLCBza2lwQ29ycnVwdGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0lWZXJpZmllci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JVmVyaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmVjMDY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JVmVyaWZpZXIuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CisKK3B1YmxpYyBpbnRlcmZhY2UgSVZlcmlmaWVyIGV4dGVuZHMgQ2xvc2VhYmxlCit7CisgICAgc3RhdGljIE9wdGlvbnMuQnVpbGRlciBvcHRpb25zKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgT3B0aW9ucy5CdWlsZGVyKCk7CisgICAgfQorCisgICAgdm9pZCB2ZXJpZnkoKTsKKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgY2xvc2UoKTsKKworICAgIENvbXBhY3Rpb25JbmZvLkhvbGRlciBnZXRWZXJpZnlJbmZvKCk7CisKKyAgICBjbGFzcyBPcHRpb25zCisgICAgeworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpbnZva2VEaXNrRmFpbHVyZVBvbGljeTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRm9yY2UgZXh0ZW5kZWQgdmVyaWZpY2F0aW9uIC0gdW5sZXNzIGl0IGlzIGVuYWJsZWQsIGV4dGVuZGVkIHZlcmlmaWNpYXRpb24gd2lsbCBiZSBkb25lIG9ubHkKKyAgICAgICAgICogaWYgdGhlcmUgaXMgbm8gZGlnZXN0IHByZXNlbnQuIFNldHRpbmcgaXQgYWxvbmcgd2l0aCBxdWljayBtYWtlcyBubyBzZW5zZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGV4dGVuZGVkVmVyaWZpY2F0aW9uOworCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGNoZWNrVmVyc2lvbjsKKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gbXV0YXRlUmVwYWlyU3RhdHVzOworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjaGVja093bnNUb2tlbnM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFF1aWNrIGNoZWNrIHdoaWNoIGRvZXMgbm90IGluY2x1ZGUgc3N0YWJsZSBkYXRhIHZlcmlmaWNhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHF1aWNrOworCisgICAgICAgIHB1YmxpYyBmaW5hbCBGdW5jdGlvbjxTdHJpbmcsID8gZXh0ZW5kcyBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4+IHRva2VuTG9va3VwOworCisgICAgICAgIHByaXZhdGUgT3B0aW9ucyhib29sZWFuIGludm9rZURpc2tGYWlsdXJlUG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHRlbmRlZFZlcmlmaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hlY2tWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtdXRhdGVSZXBhaXJTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrT3duc1Rva2VucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcXVpY2ssCisgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjxTdHJpbmcsID8gZXh0ZW5kcyBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4+IHRva2VuTG9va3VwKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmludm9rZURpc2tGYWlsdXJlUG9saWN5ID0gaW52b2tlRGlza0ZhaWx1cmVQb2xpY3k7CisgICAgICAgICAgICB0aGlzLmV4dGVuZGVkVmVyaWZpY2F0aW9uID0gZXh0ZW5kZWRWZXJpZmljYXRpb247CisgICAgICAgICAgICB0aGlzLmNoZWNrVmVyc2lvbiA9IGNoZWNrVmVyc2lvbjsKKyAgICAgICAgICAgIHRoaXMubXV0YXRlUmVwYWlyU3RhdHVzID0gbXV0YXRlUmVwYWlyU3RhdHVzOworICAgICAgICAgICAgdGhpcy5jaGVja093bnNUb2tlbnMgPSBjaGVja093bnNUb2tlbnM7CisgICAgICAgICAgICB0aGlzLnF1aWNrID0gcXVpY2s7CisgICAgICAgICAgICB0aGlzLnRva2VuTG9va3VwID0gdG9rZW5Mb29rdXA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiT3B0aW9uc3siICsKKyAgICAgICAgICAgICAgICAgICAiaW52b2tlRGlza0ZhaWx1cmVQb2xpY3k9IiArIGludm9rZURpc2tGYWlsdXJlUG9saWN5ICsKKyAgICAgICAgICAgICAgICAgICAiLCBleHRlbmRlZFZlcmlmaWNhdGlvbj0iICsgZXh0ZW5kZWRWZXJpZmljYXRpb24gKworICAgICAgICAgICAgICAgICAgICIsIGNoZWNrVmVyc2lvbj0iICsgY2hlY2tWZXJzaW9uICsKKyAgICAgICAgICAgICAgICAgICAiLCBtdXRhdGVSZXBhaXJTdGF0dXM9IiArIG11dGF0ZVJlcGFpclN0YXR1cyArCisgICAgICAgICAgICAgICAgICAgIiwgY2hlY2tPd25zVG9rZW5zPSIgKyBjaGVja093bnNUb2tlbnMgKworICAgICAgICAgICAgICAgICAgICIsIHF1aWNrPSIgKyBxdWljayArCisgICAgICAgICAgICAgICAgICAgJ30nOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpbnZva2VEaXNrRmFpbHVyZVBvbGljeSA9IGZhbHNlOyAvLyBpbnZva2luZyBkaXNrIGZhaWx1cmUgcG9saWN5IGNhbiBzdG9wIHRoZSBub2RlIGlmIHdlIGZpbmQgYSBjb3JydXB0IHN0YWJsZQorICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkVmVyaWZpY2F0aW9uID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tWZXJzaW9uID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gbXV0YXRlUmVwYWlyU3RhdHVzID0gZmFsc2U7IC8vIG11dGF0aW5nIHJlcGFpciBzdGF0dXMgY2FuIGJlIGRhbmdlcm91cworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrT3duc1Rva2VucyA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIHF1aWNrID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIEZ1bmN0aW9uPFN0cmluZywgPyBleHRlbmRzIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+Pj4gdG9rZW5Mb29rdXAgPSBTdG9yYWdlU2VydmljZS5pbnN0YW5jZTo6Z2V0TG9jYWxBbmRQZW5kaW5nUmFuZ2VzOworCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciBpbnZva2VEaXNrRmFpbHVyZVBvbGljeShib29sZWFuIHBhcmFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kgPSBwYXJhbTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIEJ1aWxkZXIgZXh0ZW5kZWRWZXJpZmljYXRpb24oYm9vbGVhbiBwYXJhbSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmV4dGVuZGVkVmVyaWZpY2F0aW9uID0gcGFyYW07CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNoZWNrVmVyc2lvbihib29sZWFuIHBhcmFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tWZXJzaW9uID0gcGFyYW07CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIG11dGF0ZVJlcGFpclN0YXR1cyhib29sZWFuIHBhcmFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMubXV0YXRlUmVwYWlyU3RhdHVzID0gcGFyYW07CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNoZWNrT3duc1Rva2Vucyhib29sZWFuIHBhcmFtKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tPd25zVG9rZW5zID0gcGFyYW07CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBCdWlsZGVyIHF1aWNrKGJvb2xlYW4gcGFyYW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhpcy5xdWljayA9IHBhcmFtOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQnVpbGRlciB0b2tlbkxvb2t1cChGdW5jdGlvbjxTdHJpbmcsID8gZXh0ZW5kcyBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4+IHRva2VuTG9va3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMudG9rZW5Mb29rdXAgPSB0b2tlbkxvb2t1cDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIE9wdGlvbnMgYnVpbGQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT3B0aW9ucyhpbnZva2VEaXNrRmFpbHVyZVBvbGljeSwgZXh0ZW5kZWRWZXJpZmljYXRpb24sIGNoZWNrVmVyc2lvbiwgbXV0YXRlUmVwYWlyU3RhdHVzLCBjaGVja093bnNUb2tlbnMsIHF1aWNrLCB0b2tlbkxvb2t1cCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleEluZm8uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhJbmZvLmphdmEKaW5kZXggZmEwZmIyYy4uZGJjZTQxNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleEluZm8uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4SW5mby5qYXZhCkBAIC0yMywxMiArMjMsMTIgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdQcmVmaXg7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uSVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuUm93SW5kZXhFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PYmplY3RTaXplczsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4U3VtbWFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNhZGZkLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKLQotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlT3JkZXI7Ci0KLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5XcmFwcGVkU2hhcmVkQ2xvc2VhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW1vcnlVdGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUw7Ci0KLS8qCi0gKiBMYXlvdXQgb2YgTWVtb3J5IGZvciBpbmRleCBzdW1tYXJpZXM6Ci0gKgotICogVGhlcmUgYXJlIHR3byBzZWN0aW9uczoKLSAqICAxLiBBICJoZWFkZXIiIGNvbnRhaW5pbmcgdGhlIG9mZnNldCBpbnRvIGBieXRlc2Agb2YgZW50cmllcyBpbiB0aGUgc3VtbWFyeSBzdW1tYXJ5IGRhdGEsIGNvbnNpc3Rpbmcgb2YKLSAqICAgICBvbmUgZm91ciBieXRlIHBvc2l0aW9uIGZvciBlYWNoIGVudHJ5IGluIHRoZSBzdW1tYXJ5LiAgVGhpcyBhbGxvd3MgdXMgZG8gc2ltcGxlIG1hdGggaW4gZ2V0SW5kZXgoKQotICogICAgIHRvIGZpbmQgdGhlIHBvc2l0aW9uIGluIHRoZSBNZW1vcnkgdG8gc3RhcnQgcmVhZGluZyB0aGUgYWN0dWFsIGluZGV4IHN1bW1hcnkgZW50cnkuCi0gKiAgICAgKFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Uga2V5cyBjYW4gaGF2ZSBkaWZmZXJlbnQgbGVuZ3Rocy4pCi0gKiAgMi4gIEEgc2VxdWVuY2Ugb2YgKERlY29yYXRlZEtleSwgcG9zaXRpb24pIHBhaXJzLCB3aGVyZSBwb3NpdGlvbiBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIGFjdHVhbCBpbmRleCBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5IGV4dGVuZHMgV3JhcHBlZFNoYXJlZENsb3NlYWJsZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbmRleFN1bW1hcnkuY2xhc3MpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW5kZXhTdW1tYXJ5U2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IEluZGV4U3VtbWFyeVNlcmlhbGl6ZXIoKTsKLQotICAgIC8qKgotICAgICAqIEEgbG93ZXIgYm91bmQgZm9yIHRoZSBhdmVyYWdlIG51bWJlciBvZiBwYXJ0aXRpb25zIGluIGJldHdlZW4gZWFjaCBpbmRleCBzdW1tYXJ5IGVudHJ5LiBBIGxvd2VyIHZhbHVlIG1lYW5zCi0gICAgICogdGhhdCBtb3JlIHBhcnRpdGlvbnMgd2lsbCBoYXZlIGFuIGVudHJ5IGluIHRoZSBpbmRleCBzdW1tYXJ5IHdoZW4gYXQgdGhlIGZ1bGwgc2FtcGxpbmcgbGV2ZWwuCi0gICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWluSW5kZXhJbnRlcnZhbDsKLQotICAgIHByaXZhdGUgZmluYWwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyOwotICAgIHByaXZhdGUgZmluYWwgaW50IHNpemVBdEZ1bGxTYW1wbGluZzsKLSAgICAvLyB3ZSBwZXJtaXQgdGhlIG1lbW9yeSB0byBzcGFuIGEgcmFuZ2UgbGFyZ2VyIHRoYW4gd2UgdXNlLAotICAgIC8vIHNvIHdlIGhhdmUgYW4gYWNjb21wYW55aW5nIGNvdW50IGFuZCBsZW5ndGggZm9yIGVhY2ggcGFydAotICAgIC8vIHdlIHNwbGl0IG91ciBkYXRhIGludG8gdHdvIHJhbmdlczogb2Zmc2V0cyAoaW5kZXhpbmcgaW50byBlbnRyaWVzKSwKLSAgICAvLyBhbmQgZW50cmllcyBjb250YWluaW5nIHRoZSBzdW1tYXJ5IGRhdGEKLSAgICBwcml2YXRlIGZpbmFsIE1lbW9yeSBvZmZzZXRzOwotICAgIHByaXZhdGUgZmluYWwgaW50IG9mZnNldENvdW50OwotICAgIC8vIGVudHJpZXMgaXMgYSBsaXN0IG9mIChwYXJ0aXRpb24ga2V5LCBpbmRleCBmaWxlIG9mZnNldCkgcGFpcnMKLSAgICBwcml2YXRlIGZpbmFsIE1lbW9yeSBlbnRyaWVzOwotICAgIHByaXZhdGUgZmluYWwgbG9uZyBlbnRyaWVzTGVuZ3RoOwotCi0gICAgLyoqCi0gICAgICogQSB2YWx1ZSBiZXR3ZWVuIDEgYW5kIEJBU0VfU0FNUExJTkdfTEVWRUwgdGhhdCByZXByZXNlbnRzIGhvdyBtYW55IG9mIHRoZSBvcmlnaW5hbAotICAgICAqIGluZGV4IHN1bW1hcnkgZW50cmllcyAoKDEgLyBpbmRleEludGVydmFsKSAqIG51bUtleXMpIGhhdmUgYmVlbiByZXRhaW5lZC4KLSAgICAgKgotICAgICAqIFRodXMsIHRoaXMgc3VtbWFyeSBjb250YWlucyAoc2FtcGxpbmdMZXZlbCAvIEJBU0VfU0FNUExJTkdfTEVWRUwpICogKCgxIC8gaW5kZXhJbnRlcnZhbCkgKiBudW1LZXlzKSkgZW50cmllcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGludCBzYW1wbGluZ0xldmVsOwotCi0gICAgcHVibGljIEluZGV4U3VtbWFyeShJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIsIE1lbW9yeSBvZmZzZXRzLCBpbnQgb2Zmc2V0Q291bnQsIE1lbW9yeSBlbnRyaWVzLCBsb25nIGVudHJpZXNMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZUF0RnVsbFNhbXBsaW5nLCBpbnQgbWluSW5kZXhJbnRlcnZhbCwgaW50IHNhbXBsaW5nTGV2ZWwpCi0gICAgewotICAgICAgICBzdXBlcihuZXcgTWVtb3J5W10geyBvZmZzZXRzLCBlbnRyaWVzIH0pOwotICAgICAgICBhc3NlcnQgb2Zmc2V0cy5nZXRJbnQoMCkgPT0gMDsKLSAgICAgICAgdGhpcy5wYXJ0aXRpb25lciA9IHBhcnRpdGlvbmVyOwotICAgICAgICB0aGlzLm1pbkluZGV4SW50ZXJ2YWwgPSBtaW5JbmRleEludGVydmFsOwotICAgICAgICB0aGlzLm9mZnNldENvdW50ID0gb2Zmc2V0Q291bnQ7Ci0gICAgICAgIHRoaXMuZW50cmllc0xlbmd0aCA9IGVudHJpZXNMZW5ndGg7Ci0gICAgICAgIHRoaXMuc2l6ZUF0RnVsbFNhbXBsaW5nID0gc2l6ZUF0RnVsbFNhbXBsaW5nOwotICAgICAgICB0aGlzLm9mZnNldHMgPSBvZmZzZXRzOwotICAgICAgICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzOwotICAgICAgICB0aGlzLnNhbXBsaW5nTGV2ZWwgPSBzYW1wbGluZ0xldmVsOwotICAgICAgICBhc3NlcnQgc2FtcGxpbmdMZXZlbCA+IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbmRleFN1bW1hcnkoSW5kZXhTdW1tYXJ5IGNvcHkpCi0gICAgewotICAgICAgICBzdXBlcihjb3B5KTsKLSAgICAgICAgdGhpcy5wYXJ0aXRpb25lciA9IGNvcHkucGFydGl0aW9uZXI7Ci0gICAgICAgIHRoaXMubWluSW5kZXhJbnRlcnZhbCA9IGNvcHkubWluSW5kZXhJbnRlcnZhbDsKLSAgICAgICAgdGhpcy5vZmZzZXRDb3VudCA9IGNvcHkub2Zmc2V0Q291bnQ7Ci0gICAgICAgIHRoaXMuZW50cmllc0xlbmd0aCA9IGNvcHkuZW50cmllc0xlbmd0aDsKLSAgICAgICAgdGhpcy5zaXplQXRGdWxsU2FtcGxpbmcgPSBjb3B5LnNpemVBdEZ1bGxTYW1wbGluZzsKLSAgICAgICAgdGhpcy5vZmZzZXRzID0gY29weS5vZmZzZXRzOwotICAgICAgICB0aGlzLmVudHJpZXMgPSBjb3B5LmVudHJpZXM7Ci0gICAgICAgIHRoaXMuc2FtcGxpbmdMZXZlbCA9IGNvcHkuc2FtcGxpbmdMZXZlbDsKLSAgICB9Ci0KLSAgICAvLyBiaW5hcnkgc2VhcmNoIGlzIG5vdG9yaW91c2x5IG1vcmUgZGlmZmljdWx0IHRvIGdldCByaWdodCB0aGFuIGl0IGxvb2tzOyB0aGlzIGlzIGxpZnRlZCBmcm9tCi0gICAgLy8gSGFybW9ueSdzIENvbGxlY3Rpb25zIGltcGxlbWVudGF0aW9uCi0gICAgcHVibGljIGludCBiaW5hcnlTZWFyY2goUGFydGl0aW9uUG9zaXRpb24ga2V5KQotICAgIHsKLSAgICAgICAgLy8gV2Ugd2lsbCBiZSBjb21wYXJpbmcgbm9uLW5hdGl2ZSBLZXlzLCBzbyB1c2UgYSBidWZmZXIgd2l0aCBhcHByb3ByaWF0ZSBieXRlIG9yZGVyCi0gICAgICAgIEJ5dGVCdWZmZXIgaG9sbG93ID0gTWVtb3J5VXRpbC5nZXRIb2xsb3dEaXJlY3RCeXRlQnVmZmVyKCkub3JkZXIoQnl0ZU9yZGVyLkJJR19FTkRJQU4pOwotICAgICAgICBpbnQgbG93ID0gMCwgbWlkID0gb2Zmc2V0Q291bnQsIGhpZ2ggPSBtaWQgLSAxLCByZXN1bHQgPSAtMTsKLSAgICAgICAgd2hpbGUgKGxvdyA8PSBoaWdoKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaWQgPSAobG93ICsgaGlnaCkgPj4gMTsKLSAgICAgICAgICAgIGZpbGxUZW1wb3JhcnlLZXkobWlkLCBob2xsb3cpOwotICAgICAgICAgICAgcmVzdWx0ID0gLURlY29yYXRlZEtleS5jb21wYXJlVG8ocGFydGl0aW9uZXIsIGhvbGxvdywga2V5KTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWlkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIC1taWQgLSAocmVzdWx0IDwgMCA/IDEgOiAyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgYWN0dWFsIGluZGV4IHN1bW1hcnkgZW50cnkgaW4gb3VyIE1lbW9yeSBhdHRyaWJ1dGUsICdieXRlcycuCi0gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZW50cnkgb3Iga2V5IHRvIGdldCB0aGUgcG9zaXRpb24gZm9yCi0gICAgICogQHJldHVybiBhbiBvZmZzZXQgaW50byBvdXIgTWVtb3J5IGF0dHJpYnV0ZSB3aGVyZSB0aGUgYWN0dWFsIGVudHJ5IHJlc2lkZXMKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBvc2l0aW9uSW5TdW1tYXJ5KGludCBpbmRleCkKLSAgICB7Ci0gICAgICAgIC8vIFRoZSBmaXJzdCBzZWN0aW9uIG9mIGJ5dGVzIGhvbGRzIGEgZm91ci1ieXRlIHBvc2l0aW9uIGZvciBlYWNoIGVudHJ5IGluIHRoZSBzdW1tYXJ5LCBzbyBqdXN0IG11bHRpcGx5IGJ5IDQuCi0gICAgICAgIHJldHVybiBvZmZzZXRzLmdldEludChpbmRleCA8PCAyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYnl0ZVtdIGdldEtleShpbnQgaW5kZXgpCi0gICAgewotICAgICAgICBsb25nIHN0YXJ0ID0gZ2V0UG9zaXRpb25JblN1bW1hcnkoaW5kZXgpOwotICAgICAgICBpbnQga2V5U2l6ZSA9IChpbnQpIChjYWxjdWxhdGVFbmQoaW5kZXgpIC0gc3RhcnQgLSA4TCk7Ci0gICAgICAgIGJ5dGVbXSBrZXkgPSBuZXcgYnl0ZVtrZXlTaXplXTsKLSAgICAgICAgZW50cmllcy5nZXRCeXRlcyhzdGFydCwga2V5LCAwLCBrZXlTaXplKTsKLSAgICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmlsbFRlbXBvcmFyeUtleShpbnQgaW5kZXgsIEJ5dGVCdWZmZXIgYnVmZmVyKQotICAgIHsKLSAgICAgICAgbG9uZyBzdGFydCA9IGdldFBvc2l0aW9uSW5TdW1tYXJ5KGluZGV4KTsKLSAgICAgICAgaW50IGtleVNpemUgPSAoaW50KSAoY2FsY3VsYXRlRW5kKGluZGV4KSAtIHN0YXJ0IC0gOEwpOwotICAgICAgICBlbnRyaWVzLnNldEJ5dGVCdWZmZXIoYnVmZmVyLCBzdGFydCwga2V5U2l6ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkVG8oUmVmLklkZW50aXR5Q29sbGVjdGlvbiBpZGVudGl0aWVzKQotICAgIHsKLSAgICAgICAgc3VwZXIuYWRkVG8oaWRlbnRpdGllcyk7Ci0gICAgICAgIGlkZW50aXRpZXMuYWRkKG9mZnNldHMpOwotICAgICAgICBpZGVudGl0aWVzLmFkZChlbnRyaWVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRQb3NpdGlvbihpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gZW50cmllcy5nZXRMb25nKGNhbGN1bGF0ZUVuZChpbmRleCkgLSA4KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRFbmRJblN1bW1hcnkoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZUVuZChpbmRleCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBsb25nIGNhbGN1bGF0ZUVuZChpbnQgaW5kZXgpCi0gICAgewotICAgICAgICByZXR1cm4gaW5kZXggPT0gKG9mZnNldENvdW50IC0gMSkgPyBlbnRyaWVzTGVuZ3RoIDogZ2V0UG9zaXRpb25JblN1bW1hcnkoaW5kZXggKyAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldE1pbkluZGV4SW50ZXJ2YWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1pbkluZGV4SW50ZXJ2YWw7Ci0gICAgfQotCi0gICAgcHVibGljIGRvdWJsZSBnZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoQkFTRV9TQU1QTElOR19MRVZFTCAvIChkb3VibGUpIHNhbXBsaW5nTGV2ZWwpICogbWluSW5kZXhJbnRlcnZhbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSB0b3RhbCBudW1iZXIgb2Yga2V5cyBpbiB0aGUgU1NUYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRFc3RpbWF0ZWRLZXlDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gKChsb25nKSBnZXRNYXhOdW1iZXJPZkVudHJpZXMoKSArIDEpICogbWluSW5kZXhJbnRlcnZhbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG9mZnNldENvdW50OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0U2FtcGxpbmdMZXZlbCgpCi0gICAgewotICAgICAgICByZXR1cm4gc2FtcGxpbmdMZXZlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyB0aGlzIHN1bW1hcnkgd291bGQgaGF2ZSBpZiBpdCB3ZXJlIGF0IHRoZSBmdWxsIHNhbXBsaW5nIGxldmVsLCB3aGljaCBpcyBlcXVhbAotICAgICAqIHRvIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcHJpbWFyeSBvbi1kaXNrIGluZGV4IGRpdmlkZWQgYnkgdGhlIG1pbiBpbmRleCBpbnRlcnZhbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1heE51bWJlck9mRW50cmllcygpCi0gICAgewotICAgICAgICByZXR1cm4gc2l6ZUF0RnVsbFNhbXBsaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBvZmYtaGVhcCBtZW1vcnkgdXNlZCBmb3IgdGhlIGVudHJpZXMgcG9ydGlvbiBvZiB0aGlzIHN1bW1hcnkuCi0gICAgICogQHJldHVybiBzaXplIGluIGJ5dGVzCi0gICAgICovCi0gICAgbG9uZyBnZXRFbnRyaWVzTGVuZ3RoKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbnRyaWVzTGVuZ3RoOwotICAgIH0KLQotICAgIE1lbW9yeSBnZXRPZmZzZXRzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvZmZzZXRzOwotICAgIH0KLQotICAgIE1lbW9yeSBnZXRFbnRyaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbnRyaWVzOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldE9mZkhlYXBTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvZmZzZXRDb3VudCAqIDQgKyBlbnRyaWVzTGVuZ3RoOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwcmltYXJ5IChvbi1kaXNrKSBpbmRleCBlbnRyaWVzIGJldHdlZW4gdGhlIGluZGV4IHN1bW1hcnkgZW50cnkgYXQgYGluZGV4YCBhbmQgdGhlIG5leHQKLSAgICAgKiBpbmRleCBzdW1tYXJ5IGVudHJ5IChhc3N1bWluZyB0aGVyZSBpcyBvbmUpLiAgV2l0aG91dCBhbnkgZG93bnNhbXBsaW5nLCB0aGlzIHdpbGwgYWx3YXlzIGJlIGVxdWl2YWxlbnQgdG8KLSAgICAgKiB0aGUgaW5kZXggaW50ZXJ2YWwuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIGFuIGluZGV4IHN1bW1hcnkgZW50cnkgKGJldHdlZW4gemVybyBhbmQgdGhlIGluZGV4IGVudHJ5IHNpemUpCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFydGl0aW9ucyBhZnRlciBgaW5kZXhgIHVudGlsIHRoZSBuZXh0IHBhcnRpdGlvbiB3aXRoIGEgc3VtbWFyeSBlbnRyeQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbEFmdGVySW5kZXgoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIERvd25zYW1wbGluZy5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsQWZ0ZXJJbmRleChpbmRleCwgc2FtcGxpbmdMZXZlbCwgbWluSW5kZXhJbnRlcnZhbCk7Ci0gICAgfQotCi0gICAgcHVibGljIEluZGV4U3VtbWFyeSBzaGFyZWRDb3B5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgSW5kZXhTdW1tYXJ5KHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5kZXhTdW1tYXJ5U2VyaWFsaXplcgotICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKEluZGV4U3VtbWFyeSB0LCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQud3JpdGVJbnQodC5taW5JbmRleEludGVydmFsKTsKLSAgICAgICAgICAgIG91dC53cml0ZUludCh0Lm9mZnNldENvdW50KTsKLSAgICAgICAgICAgIG91dC53cml0ZUxvbmcodC5nZXRPZmZIZWFwU2l6ZSgpKTsKLSAgICAgICAgICAgIG91dC53cml0ZUludCh0LnNhbXBsaW5nTGV2ZWwpOwotICAgICAgICAgICAgb3V0LndyaXRlSW50KHQuc2l6ZUF0RnVsbFNhbXBsaW5nKTsKLSAgICAgICAgICAgIC8vIG91ciBvbi1kaXNrIHJlcHJlc2VudGF0aW9uIHRyZWF0cyB0aGUgb2Zmc2V0cyBhbmQgdGhlIHN1bW1hcnkgZGF0YSBhcyBvbmUgY29udGlndW91cyBzdHJ1Y3R1cmUsCi0gICAgICAgICAgICAvLyBpbiB3aGljaCB0aGUgb2Zmc2V0cyBhcmUgYmFzZWQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHN0cnVjdHVyZS4gaS5lLiwgaWYgdGhlIG9mZnNldHMgb2NjdXB5Ci0gICAgICAgICAgICAvLyBYIGJ5dGVzLCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IG9mZnNldCB3aWxsIGJlIFguIEluIG1lbW9yeSB3ZSBzcGxpdCB0aGUgdHdvIHJlZ2lvbnMgdXAsIHNvIHRoYXQKLSAgICAgICAgICAgIC8vIHRoZSBzdW1tYXJ5IHZhbHVlcyBhcmUgaW5kZXhlZCBmcm9tIHplcm8sIHNvIHdlIGFwcGx5IGEgY29ycmVjdGlvbiB0byB0aGUgb2Zmc2V0cyB3aGVuIGRlL3NlcmlhbGl6aW5nLgotICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIGFkZGluZyBYIHRvIGVhY2ggb2YgdGhlIG9mZnNldHMuCi0gICAgICAgICAgICBpbnQgYmFzZU9mZnNldCA9IHQub2Zmc2V0Q291bnQgKiA0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdC5vZmZzZXRDb3VudCA7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gdC5vZmZzZXRzLmdldEludChpICogNCkgKyBiYXNlT2Zmc2V0OwotICAgICAgICAgICAgICAgIC8vIG91ciBzZXJpYWxpemF0aW9uIGZvcm1hdCBmb3IgdGhpcyBmaWxlIHVzZXMgbmF0aXZlIGJ5dGUgb3JkZXIsIHNvIGlmIHRoaXMgaXMgZGlmZmVyZW50IHRvIHRoZQotICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgSmF2YSBzZXJpYWxpemF0aW9uIG9yZGVyIChCSUdfRU5ESUFOKSB3ZSBoYXZlIHRvIHJldmVyc2Ugb3VyIGJ5dGVzCi0gICAgICAgICAgICAgICAgaWYgKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpICE9IEJ5dGVPcmRlci5CSUdfRU5ESUFOKQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBJbnRlZ2VyLnJldmVyc2VCeXRlcyhvZmZzZXQpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZUludChvZmZzZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LndyaXRlKHQuZW50cmllcywgMCwgdC5lbnRyaWVzTGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgICAgIHB1YmxpYyBJbmRleFN1bW1hcnkgZGVzZXJpYWxpemUoRGF0YUlucHV0U3RyZWFtIGluLCBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIsIGludCBleHBlY3RlZE1pbkluZGV4SW50ZXJ2YWwsIGludCBtYXhJbmRleEludGVydmFsKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaW50IG1pbkluZGV4SW50ZXJ2YWwgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgICAgICBpZiAobWluSW5kZXhJbnRlcnZhbCAhPSBleHBlY3RlZE1pbkluZGV4SW50ZXJ2YWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNhbm5vdCByZWFkIGluZGV4IHN1bW1hcnkgYmVjYXVzZSBtaW5faW5kZXhfaW50ZXJ2YWwgY2hhbmdlZCBmcm9tICVkIHRvICVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluSW5kZXhJbnRlcnZhbCwgZXhwZWN0ZWRNaW5JbmRleEludGVydmFsKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBvZmZzZXRDb3VudCA9IGluLnJlYWRJbnQoKTsKLSAgICAgICAgICAgIGxvbmcgb2ZmaGVhcFNpemUgPSBpbi5yZWFkTG9uZygpOwotICAgICAgICAgICAgaW50IHNhbXBsaW5nTGV2ZWwgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgICAgICBpbnQgZnVsbFNhbXBsaW5nU3VtbWFyeVNpemUgPSBpbi5yZWFkSW50KCk7Ci0KLSAgICAgICAgICAgIGludCBlZmZlY3RpdmVJbmRleEludGVydmFsID0gKGludCkgTWF0aC5jZWlsKChCQVNFX1NBTVBMSU5HX0xFVkVMIC8gKGRvdWJsZSkgc2FtcGxpbmdMZXZlbCkgKiBtaW5JbmRleEludGVydmFsKTsKLSAgICAgICAgICAgIGlmIChlZmZlY3RpdmVJbmRleEludGVydmFsID4gbWF4SW5kZXhJbnRlcnZhbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiUmVidWlsZGluZyBpbmRleCBzdW1tYXJ5IGJlY2F1c2UgdGhlIGVmZmVjdGl2ZSBpbmRleCBpbnRlcnZhbCAoJWQpIGlzIGhpZ2hlciB0aGFuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0aGUgY3VycmVudCBtYXggaW5kZXggaW50ZXJ2YWwgKCVkKSIsIGVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwsIG1heEluZGV4SW50ZXJ2YWwpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVtb3J5IG9mZnNldHMgPSBNZW1vcnkuYWxsb2NhdGUob2Zmc2V0Q291bnQgKiA0KTsKLSAgICAgICAgICAgIE1lbW9yeSBlbnRyaWVzID0gTWVtb3J5LmFsbG9jYXRlKG9mZmhlYXBTaXplIC0gb2Zmc2V0cy5zaXplKCkpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMuY29weShpbiwgbmV3IE1lbW9yeU91dHB1dFN0cmVhbShvZmZzZXRzKSwgb2Zmc2V0cy5zaXplKCkpOwotICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLmNvcHkoaW4sIG5ldyBNZW1vcnlPdXRwdXRTdHJlYW0oZW50cmllcyksIGVudHJpZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0cy5mcmVlKCk7Ci0gICAgICAgICAgICAgICAgZW50cmllcy5mcmVlKCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgaW9lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gb3VyIG9uLWRpc2sgcmVwcmVzZW50YXRpb24gdHJlYXRzIHRoZSBvZmZzZXRzIGFuZCB0aGUgc3VtbWFyeSBkYXRhIGFzIG9uZSBjb250aWd1b3VzIHN0cnVjdHVyZSwKLSAgICAgICAgICAgIC8vIGluIHdoaWNoIHRoZSBvZmZzZXRzIGFyZSBiYXNlZCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc3RydWN0dXJlLiBpLmUuLCBpZiB0aGUgb2Zmc2V0cyBvY2N1cHkKLSAgICAgICAgICAgIC8vIFggYnl0ZXMsIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3Qgb2Zmc2V0IHdpbGwgYmUgWC4gSW4gbWVtb3J5IHdlIHNwbGl0IHRoZSB0d28gcmVnaW9ucyB1cCwgc28gdGhhdAotICAgICAgICAgICAgLy8gdGhlIHN1bW1hcnkgdmFsdWVzIGFyZSBpbmRleGVkIGZyb20gemVybywgc28gd2UgYXBwbHkgYSBjb3JyZWN0aW9uIHRvIHRoZSBvZmZzZXRzIHdoZW4gZGUvc2VyaWFsaXppbmcuCi0gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2Ugc3VidHJhY3RpbmcgWCBmcm9tIGVhY2ggb2YgdGhlIG9mZnNldHMuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBvZmZzZXRzLnNpemUoKSA7IGkgKz0gNCkKLSAgICAgICAgICAgICAgICBvZmZzZXRzLnNldEludChpLCAoaW50KSAob2Zmc2V0cy5nZXRJbnQoaSkgLSBvZmZzZXRzLnNpemUoKSkpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmRleFN1bW1hcnkocGFydGl0aW9uZXIsIG9mZnNldHMsIG9mZnNldENvdW50LCBlbnRyaWVzLCBlbnRyaWVzLnNpemUoKSwgZnVsbFNhbXBsaW5nU3VtbWFyeVNpemUsIG1pbkluZGV4SW50ZXJ2YWwsIHNhbXBsaW5nTGV2ZWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIERlc2VyaWFsaXplcyB0aGUgZmlyc3QgYW5kIGxhc3Qga2V5IHN0b3JlZCBpbiB0aGUgc3VtbWFyeQotICAgICAgICAgKgotICAgICAgICAgKiBPbmx5IGZvciB1c2UgYnkgb2ZmbGluZSB0b29scyBsaWtlIFNTVGFibGVNZXRhZGF0YVZpZXdlciwgb3RoZXJ3aXNlIFNTVGFibGUuZmlyc3QvbGFzdCBzaG91bGQgYmUgdXNlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBQYWlyPERlY29yYXRlZEtleSwgRGVjb3JhdGVkS2V5PiBkZXNlcmlhbGl6ZUZpcnN0TGFzdEtleShEYXRhSW5wdXRTdHJlYW0gaW4sIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluLnNraXBCeXRlcyg0KTsgLy8gbWluSW5kZXhJbnRlcnZhbAotICAgICAgICAgICAgaW50IG9mZnNldENvdW50ID0gaW4ucmVhZEludCgpOwotICAgICAgICAgICAgbG9uZyBvZmZoZWFwU2l6ZSA9IGluLnJlYWRMb25nKCk7Ci0gICAgICAgICAgICBpbi5za2lwQnl0ZXMoOCk7IC8vIHNhbXBsaW5nTGV2ZWwsIGZ1bGxTYW1wbGluZ1N1bW1hcnlTaXplCi0KLSAgICAgICAgICAgIGluLnNraXAob2Zmc2V0Q291bnQgKiA0KTsKLSAgICAgICAgICAgIGluLnNraXAob2ZmaGVhcFNpemUgLSBvZmZzZXRDb3VudCAqIDQpOwotCi0gICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZmlyc3QgPSBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aExlbmd0aChpbikpOwotICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGxhc3QgPSBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aExlbmd0aChpbikpOwotICAgICAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKGZpcnN0LCBsYXN0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5QnVpbGRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1Y2NhODQuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5NZW1vcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TYWZlTWVtb3J5V3JpdGVyOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUw7Ci0KLXB1YmxpYyBjbGFzcyBJbmRleFN1bW1hcnlCdWlsZGVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbmRleFN1bW1hcnlCdWlsZGVyLmNsYXNzKTsKLQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgZGVmYXVsdEV4cGVjdGVkS2V5U2l6ZU5hbWUgPSBDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImluZGV4X3N1bW1hcnlfZXhwZWN0ZWRfa2V5X3NpemUiOwotICAgIHN0YXRpYyBsb25nIGRlZmF1bHRFeHBlY3RlZEtleVNpemUgPSBMb25nLnZhbHVlT2YoU3lzdGVtLmdldFByb3BlcnR5KGRlZmF1bHRFeHBlY3RlZEtleVNpemVOYW1lLCAiNjQiKSk7Ci0KLSAgICAvLyB0aGUgb2Zmc2V0IGluIHRoZSBrZXlzIG1lbW9yeSByZWdpb24gdG8gbG9vayBmb3IgYSBnaXZlbiBzdW1tYXJ5IGJvdW5kYXJ5Ci0gICAgcHJpdmF0ZSBmaW5hbCBTYWZlTWVtb3J5V3JpdGVyIG9mZnNldHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTYWZlTWVtb3J5V3JpdGVyIGVudHJpZXM7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBtaW5JbmRleEludGVydmFsOwotICAgIHByaXZhdGUgZmluYWwgaW50IHNhbXBsaW5nTGV2ZWw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSBzdGFydFBvaW50czsKLSAgICBwcml2YXRlIGxvbmcga2V5c1dyaXR0ZW4gPSAwOwotICAgIHByaXZhdGUgbG9uZyBpbmRleEludGVydmFsTWF0Y2hlcyA9IDA7Ci0gICAgcHJpdmF0ZSBsb25nIG5leHRTYW1wbGVQb3NpdGlvbjsKLQotICAgIC8vIGZvciBlYWNoIFJlYWRhYmxlQm91bmRhcnksIHdlIG1hcCBpdHMgZGF0YUxlbmd0aCBwcm9wZXJ0eSB0byBpdHNlbGYsIHBlcm1pdHRpbmcgdXMgdG8gbG9va3VwIHRoZQotICAgIC8vIGxhc3QgcmVhZGFibGUgYm91bmRhcnkgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGRhdGEgZmlsZQotICAgIC8vIFtkYXRhIGZpbGUgcG9zaXRpb24gbGltaXRdID0+IFtSZWFkYWJsZUJvdW5kYXJ5XQotICAgIHByaXZhdGUgVHJlZU1hcDxMb25nLCBSZWFkYWJsZUJvdW5kYXJ5PiBsYXN0UmVhZGFibGVCeURhdGEgPSBuZXcgVHJlZU1hcDw+KCk7Ci0gICAgLy8gZm9yIGVhY2ggUmVhZGFibGVCb3VuZGFyeSwgd2UgbWFwIGl0cyBpbmRleExlbmd0aCBwcm9wZXJ0eSB0byBpdHNlbGYsIHBlcm1pdHRpbmcgdXMgdG8gbG9va3VwIHRoZQotICAgIC8vIGxhc3QgcmVhZGFibGUgYm91bmRhcnkgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGluZGV4IGZpbGUKLSAgICAvLyBbaW5kZXggZmlsZSBwb3NpdGlvbiBsaW1pdF0gPT4gW1JlYWRhYmxlQm91bmRhcnldCi0gICAgcHJpdmF0ZSBUcmVlTWFwPExvbmcsIFJlYWRhYmxlQm91bmRhcnk+IGxhc3RSZWFkYWJsZUJ5SW5kZXggPSBuZXcgVHJlZU1hcDw+KCk7Ci0gICAgLy8gdGhlIGxhc3Qgc3luY2VkIGRhdGEgZmlsZSBwb3NpdGlvbgotICAgIHByaXZhdGUgbG9uZyBkYXRhU3luY1Bvc2l0aW9uOwotICAgIC8vIHRoZSBsYXN0IHN5bmNlZCBpbmRleCBmaWxlIHBvc2l0aW9uCi0gICAgcHJpdmF0ZSBsb25nIGluZGV4U3luY1Bvc2l0aW9uOwotCi0gICAgLy8gdGhlIGxhc3Qgc3VtbWFyeSBpbnRlcnZhbCBib3VuZGFyeSB0aGF0IGlzIGZ1bGx5IHJlYWRhYmxlIGluIGJvdGggZGF0YSBhbmQgaW5kZXggZmlsZXMKLSAgICBwcml2YXRlIFJlYWRhYmxlQm91bmRhcnkgbGFzdFJlYWRhYmxlQm91bmRhcnk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXByZXNlbnRzIGEgYm91bmRhcnkgdGhhdCBpcyBndWFyYW50ZWVkIGZ1bGx5IHJlYWRhYmxlIGluIHRoZSBzdW1tYXJ5LCBpbmRleCBmaWxlIGFuZCBkYXRhIGZpbGUuCi0gICAgICogVGhlIGtleSBjb250YWluZWQgaXMgdGhlIGxhc3Qga2V5IHJlYWRhYmxlIGlmIHRoZSBpbmRleCBhbmQgZGF0YSBmaWxlcyBoYXZlIGJlZW4gZmx1c2hlZCB0byB0aGUKLSAgICAgKiBzdG9yZWQgbGVuZ3Rocy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlYWRhYmxlQm91bmRhcnkKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBEZWNvcmF0ZWRLZXkgbGFzdEtleTsKLSAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgaW5kZXhMZW5ndGg7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIGRhdGFMZW5ndGg7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgc3VtbWFyeUNvdW50OwotICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBlbnRyaWVzTGVuZ3RoOwotICAgICAgICBwdWJsaWMgUmVhZGFibGVCb3VuZGFyeShEZWNvcmF0ZWRLZXkgbGFzdEtleSwgbG9uZyBpbmRleExlbmd0aCwgbG9uZyBkYXRhTGVuZ3RoLCBpbnQgc3VtbWFyeUNvdW50LCBsb25nIGVudHJpZXNMZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubGFzdEtleSA9IGxhc3RLZXk7Ci0gICAgICAgICAgICB0aGlzLmluZGV4TGVuZ3RoID0gaW5kZXhMZW5ndGg7Ci0gICAgICAgICAgICB0aGlzLmRhdGFMZW5ndGggPSBkYXRhTGVuZ3RoOwotICAgICAgICAgICAgdGhpcy5zdW1tYXJ5Q291bnQgPSBzdW1tYXJ5Q291bnQ7Ci0gICAgICAgICAgICB0aGlzLmVudHJpZXNMZW5ndGggPSBlbnRyaWVzTGVuZ3RoOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGQgYW4gaW5kZXggc3VtbWFyeSBidWlsZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGV4cGVjdGVkS2V5cyAtIHRoZSBudW1iZXIgb2Yga2V5cyB3ZSBleHBlY3QgaW4gdGhlIHNzdGFibGUKLSAgICAgKiBAcGFyYW0gbWluSW5kZXhJbnRlcnZhbCAtIHRoZSBtaW5pbXVtIGludGVydmFsIGJldHdlZW4gZW50cmllcyBzZWxlY3RlZCBmb3Igc2FtcGxpbmcKLSAgICAgKiBAcGFyYW0gc2FtcGxpbmdMZXZlbCAtIHRoZSBsZXZlbCBhdCB3aGljaCBlbnRyaWVzIGFyZSBzYW1wbGVkCi0gICAgICovCi0gICAgcHVibGljIEluZGV4U3VtbWFyeUJ1aWxkZXIobG9uZyBleHBlY3RlZEtleXMsIGludCBtaW5JbmRleEludGVydmFsLCBpbnQgc2FtcGxpbmdMZXZlbCkKLSAgICB7Ci0gICAgICAgIHRoaXMuc2FtcGxpbmdMZXZlbCA9IHNhbXBsaW5nTGV2ZWw7Ci0gICAgICAgIHRoaXMuc3RhcnRQb2ludHMgPSBEb3duc2FtcGxpbmcuZ2V0U3RhcnRQb2ludHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc2FtcGxpbmdMZXZlbCk7Ci0KLSAgICAgICAgbG9uZyBleHBlY3RlZEVudHJ5U2l6ZSA9IGdldEVudHJ5U2l6ZShkZWZhdWx0RXhwZWN0ZWRLZXlTaXplKTsKLSAgICAgICAgbG9uZyBtYXhFeHBlY3RlZEVudHJpZXMgPSBleHBlY3RlZEtleXMgLyBtaW5JbmRleEludGVydmFsOwotICAgICAgICBsb25nIG1heEV4cGVjdGVkRW50cmllc1NpemUgPSBtYXhFeHBlY3RlZEVudHJpZXMgKiBleHBlY3RlZEVudHJ5U2l6ZTsKLSAgICAgICAgaWYgKG1heEV4cGVjdGVkRW50cmllc1NpemUgPiBJbnRlZ2VyLk1BWF9WQUxVRSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdGhhdCdzIGEgX2xvdF8gb2Yga2V5cywgYW5kIGEgdmVyeSBsb3cgbWluIGluZGV4IGludGVydmFsCi0gICAgICAgICAgICBpbnQgZWZmZWN0aXZlTWluSW50ZXJ2YWwgPSAoaW50KSBNYXRoLmNlaWwoKGRvdWJsZSkoZXhwZWN0ZWRLZXlzICogZXhwZWN0ZWRFbnRyeVNpemUpIC8gSW50ZWdlci5NQVhfVkFMVUUpOwotICAgICAgICAgICAgbWF4RXhwZWN0ZWRFbnRyaWVzID0gZXhwZWN0ZWRLZXlzIC8gZWZmZWN0aXZlTWluSW50ZXJ2YWw7Ci0gICAgICAgICAgICBtYXhFeHBlY3RlZEVudHJpZXNTaXplID0gbWF4RXhwZWN0ZWRFbnRyaWVzICogZXhwZWN0ZWRFbnRyeVNpemU7Ci0gICAgICAgICAgICBhc3NlcnQgbWF4RXhwZWN0ZWRFbnRyaWVzU2l6ZSA8PSBJbnRlZ2VyLk1BWF9WQUxVRSA6IG1heEV4cGVjdGVkRW50cmllc1NpemU7Ci0gICAgICAgICAgICBsb2dnZXIud2FybigibWluX2luZGV4X2ludGVydmFsIG9mIHt9IGlzIHRvbyBsb3cgZm9yIHt9IGV4cGVjdGVkIGtleXMgb2YgYXZnIHNpemUge307IHVzaW5nIGludGVydmFsIG9mIHt9IGluc3RlYWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbWluSW5kZXhJbnRlcnZhbCwgZXhwZWN0ZWRLZXlzLCBkZWZhdWx0RXhwZWN0ZWRLZXlTaXplLCBlZmZlY3RpdmVNaW5JbnRlcnZhbCk7Ci0gICAgICAgICAgICB0aGlzLm1pbkluZGV4SW50ZXJ2YWwgPSBlZmZlY3RpdmVNaW5JbnRlcnZhbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubWluSW5kZXhJbnRlcnZhbCA9IG1pbkluZGV4SW50ZXJ2YWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmb3IgaW5pdGlhbGl6aW5nIGRhdGEgc3RydWN0dXJlcywgYWRqdXN0IG91ciBlc3RpbWF0ZXMgYmFzZWQgb24gdGhlIHNhbXBsaW5nIGxldmVsCi0gICAgICAgIG1heEV4cGVjdGVkRW50cmllcyA9IE1hdGgubWF4KDEsIChtYXhFeHBlY3RlZEVudHJpZXMgKiBzYW1wbGluZ0xldmVsKSAvIEJBU0VfU0FNUExJTkdfTEVWRUwpOwotICAgICAgICBvZmZzZXRzID0gbmV3IFNhZmVNZW1vcnlXcml0ZXIoNCAqIG1heEV4cGVjdGVkRW50cmllcykub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpOwotICAgICAgICBlbnRyaWVzID0gbmV3IFNhZmVNZW1vcnlXcml0ZXIoZXhwZWN0ZWRFbnRyeVNpemUgKiBtYXhFeHBlY3RlZEVudHJpZXMpLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKLQotICAgICAgICAvLyB0aGUgc3VtbWFyeSB3aWxsIGFsd2F5cyBjb250YWluIHRoZSBmaXJzdCBpbmRleCBlbnRyeSAoZG93bnNhbXBsaW5nIHdpbGwgbmV2ZXIgcmVtb3ZlIGl0KQotICAgICAgICBuZXh0U2FtcGxlUG9zaXRpb24gPSAwOwotICAgICAgICBpbmRleEludGVydmFsTWF0Y2hlcysrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdpdmVuIGEga2V5LCByZXR1cm4gaG93IGxvbmcgdGhlIHNlcmlhbGl6ZWQgaW5kZXggc3VtbWFyeSBlbnRyeSB3aWxsIGJlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0RW50cnlTaXplKERlY29yYXRlZEtleSBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gZ2V0RW50cnlTaXplKGtleS5nZXRLZXkoKS5yZW1haW5pbmcoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2l2ZW4gYSBrZXkgc2l6ZSwgcmV0dXJuIGhvdyBsb25nIHRoZSBzZXJpYWxpemVkIGluZGV4IHN1bW1hcnkgZW50cnkgd2lsbCBiZSwgdGhhdCBpcyBhZGQgOCBieXRlcyB0bwotICAgICAqIGFjY29tb2RhdGUgZm9yIHRoZSBzaXplIG9mIHRoZSBwb3NpdGlvbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldEVudHJ5U2l6ZShsb25nIGtleVNpemUpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5U2l6ZSArIFR5cGVTaXplcy5zaXplb2YoMEwpOwotICAgIH0KLQotICAgIC8vIHRoZSBpbmRleCBmaWxlIGhhcyBiZWVuIGZsdXNoZWQgdG8gdGhlIHByb3ZpZGVkIHBvc2l0aW9uOyBzdGFzaCBpdCBhbmQgdXNlIHRoYXQgdG8gcmVjYWxjdWxhdGUgb3VyIG1heCByZWFkYWJsZSBib3VuZGFyeQotICAgIHB1YmxpYyB2b2lkIG1hcmtJbmRleFN5bmNlZChsb25nIHVwVG9Qb3NpdGlvbikKLSAgICB7Ci0gICAgICAgIGluZGV4U3luY1Bvc2l0aW9uID0gdXBUb1Bvc2l0aW9uOwotICAgICAgICByZWZyZXNoUmVhZGFibGVCb3VuZGFyeSgpOwotICAgIH0KLQotICAgIC8vIHRoZSBkYXRhIGZpbGUgaGFzIGJlZW4gZmx1c2hlZCB0byB0aGUgcHJvdmlkZWQgcG9zaXRpb247IHN0YXNoIGl0IGFuZCB1c2UgdGhhdCB0byByZWNhbGN1bGF0ZSBvdXIgbWF4IHJlYWRhYmxlIGJvdW5kYXJ5Ci0gICAgcHVibGljIHZvaWQgbWFya0RhdGFTeW5jZWQobG9uZyB1cFRvUG9zaXRpb24pCi0gICAgewotICAgICAgICBkYXRhU3luY1Bvc2l0aW9uID0gdXBUb1Bvc2l0aW9uOwotICAgICAgICByZWZyZXNoUmVhZGFibGVCb3VuZGFyeSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWZyZXNoUmVhZGFibGVCb3VuZGFyeSgpCi0gICAgewotICAgICAgICAvLyBncmFiIHRoZSByZWFkYWJsZSBib3VuZGFyeSBwcmlvciB0byB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gZWl0aGVyIHRoZSBkYXRhIG9yIGluZGV4IGZpbGUKLSAgICAgICAgTWFwLkVudHJ5PD8sIFJlYWRhYmxlQm91bmRhcnk+IGJ5RGF0YSA9IGxhc3RSZWFkYWJsZUJ5RGF0YS5mbG9vckVudHJ5KGRhdGFTeW5jUG9zaXRpb24pOwotICAgICAgICBNYXAuRW50cnk8PywgUmVhZGFibGVCb3VuZGFyeT4gYnlJbmRleCA9IGxhc3RSZWFkYWJsZUJ5SW5kZXguZmxvb3JFbnRyeShpbmRleFN5bmNQb3NpdGlvbik7Ci0gICAgICAgIGlmIChieURhdGEgPT0gbnVsbCB8fCBieUluZGV4ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLy8gdGFrZSB0aGUgbG93ZXN0IG9mIHRoZSB0d28sIGFuZCBzdGFzaCBpdAotICAgICAgICBsYXN0UmVhZGFibGVCb3VuZGFyeSA9IGJ5SW5kZXguZ2V0VmFsdWUoKS5pbmRleExlbmd0aCA8IGJ5RGF0YS5nZXRWYWx1ZSgpLmluZGV4TGVuZ3RoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBieUluZGV4LmdldFZhbHVlKCkgOiBieURhdGEuZ2V0VmFsdWUoKTsKLQotICAgICAgICAvLyBjbGVhciBvdXIgZGF0YSBwcmlvciB0byB0aGlzLCBzaW5jZSB3ZSBubyBsb25nZXIgbmVlZCBpdAotICAgICAgICBsYXN0UmVhZGFibGVCeURhdGEuaGVhZE1hcChsYXN0UmVhZGFibGVCb3VuZGFyeS5kYXRhTGVuZ3RoLCBmYWxzZSkuY2xlYXIoKTsKLSAgICAgICAgbGFzdFJlYWRhYmxlQnlJbmRleC5oZWFkTWFwKGxhc3RSZWFkYWJsZUJvdW5kYXJ5LmluZGV4TGVuZ3RoLCBmYWxzZSkuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVhZGFibGVCb3VuZGFyeSBnZXRMYXN0UmVhZGFibGVCb3VuZGFyeSgpCi0gICAgewotICAgICAgICByZXR1cm4gbGFzdFJlYWRhYmxlQm91bmRhcnk7Ci0gICAgfQotCi0gICAgcHVibGljIEluZGV4U3VtbWFyeUJ1aWxkZXIgbWF5YmVBZGRFbnRyeShEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkS2V5LCBsb25nIGluZGV4U3RhcnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG1heWJlQWRkRW50cnkoZGVjb3JhdGVkS2V5LCBpbmRleFN0YXJ0LCAwLCAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSBkZWNvcmF0ZWRLZXkgdGhlIGtleSBmb3IgdGhpcyByZWNvcmQKLSAgICAgKiBAcGFyYW0gaW5kZXhTdGFydCB0aGUgcG9zaXRpb24gaW4gdGhlIGluZGV4IGZpbGUgdGhpcyByZWNvcmQgYmVnaW5zCi0gICAgICogQHBhcmFtIGluZGV4RW5kIHRoZSBwb3NpdGlvbiBpbiB0aGUgaW5kZXggZmlsZSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gcmVhZCB0byAoZXhjbHVzaXZlKSB0byByZWFkIHRoaXMgcmVjb3JkCi0gICAgICogQHBhcmFtIGRhdGFFbmQgdGhlIHBvc2l0aW9uIGluIHRoZSBkYXRhIGZpbGUgd2UgbmVlZCB0byBiZSBhYmxlIHRvIHJlYWQgdG8gKGV4Y2x1c2l2ZSkgdG8gcmVhZCB0aGlzIHJlY29yZAotICAgICAqICAgICAgICAgICAgICAgIGEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgd2UgYXJlIG5vdCB0cmFja2luZyByZWFkYWJsZSBib3VuZGFyaWVzCi0gICAgICovCi0gICAgcHVibGljIEluZGV4U3VtbWFyeUJ1aWxkZXIgbWF5YmVBZGRFbnRyeShEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkS2V5LCBsb25nIGluZGV4U3RhcnQsIGxvbmcgaW5kZXhFbmQsIGxvbmcgZGF0YUVuZCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoa2V5c1dyaXR0ZW4gPT0gbmV4dFNhbXBsZVBvc2l0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGVudHJpZXMubGVuZ3RoKCkgKyBnZXRFbnRyeVNpemUoZGVjb3JhdGVkS2V5KSkgPD0gSW50ZWdlci5NQVhfVkFMVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0cy53cml0ZUludCgoaW50KSBlbnRyaWVzLmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBlbnRyaWVzLndyaXRlKGRlY29yYXRlZEtleS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgZW50cmllcy53cml0ZUxvbmcoaW5kZXhTdGFydCk7Ci0gICAgICAgICAgICAgICAgc2V0TmV4dFNhbXBsZVBvc2l0aW9uKGtleXNXcml0dGVuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB3ZSBjYW5ub3QgZnVsbHkgc2FtcGxlIHRoaXMgc3N0YWJsZSBkdWUgdG8gdG9vIG11Y2ggbWVtb3J5IGluIHRoZSBpbmRleCBzdW1tYXJ5LCBzbyBsZXQncyB0ZWxsIHRoZSB1c2VyCi0gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJNZW1vcnkgY2FwYWNpdHkgb2YgaW5kZXggc3VtbWFyeSBleGNlZWRlZCAoMkdpQiksIGluZGV4IHN1bW1hcnkgd2lsbCBub3QgY292ZXIgZnVsbCBzc3RhYmxlLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInlvdSBzaG91bGQgaW5jcmVhc2UgbWluX3NhbXBsaW5nX2xldmVsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoZGF0YUVuZCAhPSAwICYmIGtleXNXcml0dGVuICsgMSA9PSBuZXh0U2FtcGxlUG9zaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHRoaXMgaXMgdGhlIGxhc3Qga2V5IGluIHRoaXMgc3VtbWFyeSBpbnRlcnZhbCwgc28gc3Rhc2ggaXQKLSAgICAgICAgICAgIFJlYWRhYmxlQm91bmRhcnkgYm91bmRhcnkgPSBuZXcgUmVhZGFibGVCb3VuZGFyeShkZWNvcmF0ZWRLZXksIGluZGV4RW5kLCBkYXRhRW5kLCAoaW50KSAob2Zmc2V0cy5sZW5ndGgoKSAvIDQpLCBlbnRyaWVzLmxlbmd0aCgpKTsKLSAgICAgICAgICAgIGxhc3RSZWFkYWJsZUJ5RGF0YS5wdXQoZGF0YUVuZCwgYm91bmRhcnkpOwotICAgICAgICAgICAgbGFzdFJlYWRhYmxlQnlJbmRleC5wdXQoaW5kZXhFbmQsIGJvdW5kYXJ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGtleXNXcml0dGVuKys7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8vIGNhbGN1bGF0ZSB0aGUgbmV4dCBrZXkgd2Ugd2lsbCBzdG9yZSB0byBvdXIgc3VtbWFyeQotICAgIHByaXZhdGUgdm9pZCBzZXROZXh0U2FtcGxlUG9zaXRpb24obG9uZyBwb3NpdGlvbikKLSAgICB7Ci0gICAgICAgIHRyeUFnYWluOiB3aGlsZSAodHJ1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcG9zaXRpb24gKz0gbWluSW5kZXhJbnRlcnZhbDsKLSAgICAgICAgICAgIGxvbmcgdGVzdCA9IGluZGV4SW50ZXJ2YWxNYXRjaGVzKys7Ci0gICAgICAgICAgICBmb3IgKGludCBzdGFydCA6IHN0YXJ0UG9pbnRzKQotICAgICAgICAgICAgICAgIGlmICgodGVzdCAtIHN0YXJ0KSAlIEJBU0VfU0FNUExJTkdfTEVWRUwgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUgdHJ5QWdhaW47Ci0KLSAgICAgICAgICAgIG5leHRTYW1wbGVQb3NpdGlvbiA9IHBvc2l0aW9uOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZVRvQ29tbWl0KCkKLSAgICB7Ci0gICAgICAgIC8vIHRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZCB3aGVuIHdlJ3ZlIGZpbmlzaGVkIGFwcGVuZGluZyByZWNvcmRzLCBzbyB3ZSB0cnVuY2F0ZSB0aGUKLSAgICAgICAgLy8gbWVtb3J5IHdlJ3JlIHVzaW5nIHRvIHRoZSBleGFjdCBhbW91bnQgcmVxdWlyZWQgdG8gcmVwcmVzZW50IGl0IGJlZm9yZSBidWlsZGluZyBvdXIgc3VtbWFyeQotICAgICAgICBlbnRyaWVzLnRyaW0oKTsKLSAgICAgICAgb2Zmc2V0cy50cmltKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEluZGV4U3VtbWFyeSBidWlsZChJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIpCi0gICAgewotICAgICAgICByZXR1cm4gYnVpbGQocGFydGl0aW9uZXIsIG51bGwpOwotICAgIH0KLQotICAgIC8vIGJ1aWxkIHRoZSBzdW1tYXJ5IHVwIHRvIHRoZSBwcm92aWRlZCBib3VuZGFyeTsgdGhpcyBpcyBiYWNrZWQgYnkgc2hhcmVkIG1lbW9yeSBiZXR3ZWVuCi0gICAgLy8gbXVsdGlwbGUgaW52b2NhdGlvbnMgb2YgdGhpcyBidWlsZCBtZXRob2QKLSAgICBwdWJsaWMgSW5kZXhTdW1tYXJ5IGJ1aWxkKElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciwgUmVhZGFibGVCb3VuZGFyeSBib3VuZGFyeSkKLSAgICB7Ci0gICAgICAgIGFzc2VydCBlbnRyaWVzLmxlbmd0aCgpID4gMDsKLQotICAgICAgICBpbnQgY291bnQgPSAoaW50KSAob2Zmc2V0cy5sZW5ndGgoKSAvIDQpOwotICAgICAgICBsb25nIGVudHJpZXNMZW5ndGggPSBlbnRyaWVzLmxlbmd0aCgpOwotICAgICAgICBpZiAoYm91bmRhcnkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgY291bnQgPSBib3VuZGFyeS5zdW1tYXJ5Q291bnQ7Ci0gICAgICAgICAgICBlbnRyaWVzTGVuZ3RoID0gYm91bmRhcnkuZW50cmllc0xlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBzaXplQXRGdWxsU2FtcGxpbmcgPSAoaW50KSBNYXRoLmNlaWwoa2V5c1dyaXR0ZW4gLyAoZG91YmxlKSBtaW5JbmRleEludGVydmFsKTsKLSAgICAgICAgYXNzZXJ0IGNvdW50ID4gMDsKLSAgICAgICAgcmV0dXJuIG5ldyBJbmRleFN1bW1hcnkocGFydGl0aW9uZXIsIG9mZnNldHMuY3VycmVudEJ1ZmZlcigpLnNoYXJlZENvcHkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGVudHJpZXMuY3VycmVudEJ1ZmZlcigpLnNoYXJlZENvcHkoKSwgZW50cmllc0xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZUF0RnVsbFNhbXBsaW5nLCBtaW5JbmRleEludGVydmFsLCBzYW1wbGluZ0xldmVsKTsKLSAgICB9Ci0KLSAgICAvLyBjbG9zZSB0aGUgYnVpbGRlciBhbmQgcmVsZWFzZSBhbnkgYXNzb2NpYXRlZCBtZW1vcnkKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgewotICAgICAgICBlbnRyaWVzLmNsb3NlKCk7Ci0gICAgICAgIG9mZnNldHMuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGhyb3dhYmxlIGNsb3NlKFRocm93YWJsZSBhY2N1bXVsYXRlKQotICAgIHsKLSAgICAgICAgYWNjdW11bGF0ZSA9IGVudHJpZXMuY2xvc2UoYWNjdW11bGF0ZSk7Ci0gICAgICAgIGFjY3VtdWxhdGUgPSBvZmZzZXRzLmNsb3NlKGFjY3VtdWxhdGUpOwotICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGVudHJpZXNBdFNhbXBsaW5nTGV2ZWwoaW50IHNhbXBsaW5nTGV2ZWwsIGludCBtYXhTdW1tYXJ5U2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoaW50KSBNYXRoLmNlaWwoKHNhbXBsaW5nTGV2ZWwgKiBtYXhTdW1tYXJ5U2l6ZSkgLyAoZG91YmxlKSBCQVNFX1NBTVBMSU5HX0xFVkVMKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGNhbGN1bGF0ZVNhbXBsaW5nTGV2ZWwoaW50IGN1cnJlbnRTYW1wbGluZ0xldmVsLCBpbnQgY3VycmVudE51bUVudHJpZXMsIGxvbmcgdGFyZ2V0TnVtRW50cmllcywgaW50IG1pbkluZGV4SW50ZXJ2YWwsIGludCBtYXhJbmRleEludGVydmFsKQotICAgIHsKLSAgICAgICAgLy8gZWZmZWN0aXZlIGluZGV4IGludGVydmFsID09IChCQVNFX1NBTVBMSU5HX0xFVkVMIC8gc2FtcGxpbmdMZXZlbCkgKiBtaW5JbmRleEludGVydmFsCi0gICAgICAgIC8vIHNvIHdlIGNhbiBqdXN0IHNvbHZlIGZvciBtaW5TYW1wbGluZ0xldmVsIGhlcmU6Ci0gICAgICAgIC8vIG1heEluZGV4SW50ZXJ2YWwgPT0gKEJBU0VfU0FNUExJTkdfTEVWRUwgLyBtaW5TYW1wbGluZ0xldmVsKSAqIG1pbkluZGV4SW50ZXJ2YWwKLSAgICAgICAgaW50IGVmZmVjdGl2ZU1pblNhbXBsaW5nTGV2ZWwgPSBNYXRoLm1heCgxLCAoaW50KSBNYXRoLmNlaWwoKEJBU0VfU0FNUExJTkdfTEVWRUwgKiBtaW5JbmRleEludGVydmFsKSAvIChkb3VibGUpIG1heEluZGV4SW50ZXJ2YWwpKTsKLQotICAgICAgICAvLyBBbGdlYnJhaWMgZXhwbGFuYXRpb24gZm9yIGNhbGN1bGF0aW5nIHRoZSBuZXcgc2FtcGxpbmcgbGV2ZWwgKHNvbHZlIGZvciBuZXdTYW1wbGluZ0xldmVsKToKLSAgICAgICAgLy8gb3JpZ2luYWxOdW1FbnRyaWVzID0gKGJhc2VTYW1wbGluZ0xldmVsIC8gY3VycmVudFNhbXBsaW5nTGV2ZWwpICogY3VycmVudE51bUVudHJpZXMKLSAgICAgICAgLy8gbmV3U3BhY2VVc2VkID0gKG5ld1NhbXBsaW5nTGV2ZWwgLyBiYXNlU2FtcGxpbmdMZXZlbCkgKiBvcmlnaW5hbE51bUVudHJpZXMKLSAgICAgICAgLy8gbmV3U3BhY2VVc2VkID0gKG5ld1NhbXBsaW5nTGV2ZWwgLyBiYXNlU2FtcGxpbmdMZXZlbCkgKiAoYmFzZVNhbXBsaW5nTGV2ZWwgLyBjdXJyZW50U2FtcGxpbmdMZXZlbCkgKiBjdXJyZW50TnVtRW50cmllcwotICAgICAgICAvLyBuZXdTcGFjZVVzZWQgPSAobmV3U2FtcGxpbmdMZXZlbCAvIGN1cnJlbnRTYW1wbGluZ0xldmVsKSAqIGN1cnJlbnROdW1FbnRyaWVzCi0gICAgICAgIC8vIChuZXdTcGFjZVVzZWQgKiBjdXJyZW50U2FtcGxpbmdMZXZlbCkgLyBjdXJyZW50TnVtRW50cmllcyA9IG5ld1NhbXBsaW5nTGV2ZWwKLSAgICAgICAgaW50IG5ld1NhbXBsaW5nTGV2ZWwgPSAoaW50KSAodGFyZ2V0TnVtRW50cmllcyAqIGN1cnJlbnRTYW1wbGluZ0xldmVsKSAvIGN1cnJlbnROdW1FbnRyaWVzOwotICAgICAgICByZXR1cm4gTWF0aC5taW4oQkFTRV9TQU1QTElOR19MRVZFTCwgTWF0aC5tYXgoZWZmZWN0aXZlTWluU2FtcGxpbmdMZXZlbCwgbmV3U2FtcGxpbmdMZXZlbCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvd25zYW1wbGVzIGFuIGV4aXN0aW5nIGluZGV4IHN1bW1hcnkgdG8gYSBuZXcgc2FtcGxpbmcgbGV2ZWwuCi0gICAgICogQHBhcmFtIGV4aXN0aW5nIGFuIGV4aXN0aW5nIEluZGV4U3VtbWFyeQotICAgICAqIEBwYXJhbSBuZXdTYW1wbGluZ0xldmVsIHRoZSB0YXJnZXQgbGV2ZWwgZm9yIHRoZSBuZXcgSW5kZXhTdW1tYXJ5LiAgVGhpcyBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgY3VycmVudCBzYW1wbGluZwotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsIGZvciBgZXhpc3RpbmdgLgotICAgICAqIEBwYXJhbSBwYXJ0aXRpb25lciB0aGUgcGFydGl0aW9uZXIgdXNlZCBmb3IgdGhlIGluZGV4IHN1bW1hcnkKLSAgICAgKiBAcmV0dXJuIGEgbmV3IEluZGV4U3VtbWFyeQotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgcHVibGljIHN0YXRpYyBJbmRleFN1bW1hcnkgZG93bnNhbXBsZShJbmRleFN1bW1hcnkgZXhpc3RpbmcsIGludCBuZXdTYW1wbGluZ0xldmVsLCBpbnQgbWluSW5kZXhJbnRlcnZhbCwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKQotICAgIHsKLSAgICAgICAgLy8gVG8gZG93bnNhbXBsZSB0aGUgb2xkIGluZGV4IHN1bW1hcnksIHdlJ2xsIGdvIHRocm91Z2ggKHBvdGVudGlhbGx5KSBzZXZlcmFsIHJvdW5kcyBvZiBkb3duc2FtcGxpbmcuCi0gICAgICAgIC8vIENvbmNlcHR1YWxseSwgZWFjaCByb3VuZCBzdGFydHMgYXQgcG9zaXRpb24gWCBhbmQgdGhlbiByZW1vdmVzIGV2ZXJ5IE50aCBpdGVtLiAgVGhlIHZhbHVlIG9mIFggZm9sbG93cwotICAgICAgICAvLyBhIHBhcnRpY3VsYXIgcGF0dGVybiB0byBldmVubHkgc3BhY2Ugb3V0IHRoZSBpdGVtcyB0aGF0IHdlIHJlbW92ZS4gIFRoZSB2YWx1ZSBvZiBOIGRlY3JlYXNlcyBieSBvbmUgZWFjaAotICAgICAgICAvLyByb3VuZC4KLQotICAgICAgICBpbnQgY3VycmVudFNhbXBsaW5nTGV2ZWwgPSBleGlzdGluZy5nZXRTYW1wbGluZ0xldmVsKCk7Ci0gICAgICAgIGFzc2VydCBjdXJyZW50U2FtcGxpbmdMZXZlbCA+IG5ld1NhbXBsaW5nTGV2ZWw7Ci0gICAgICAgIGFzc2VydCBtaW5JbmRleEludGVydmFsID09IGV4aXN0aW5nLmdldE1pbkluZGV4SW50ZXJ2YWwoKTsKLQotICAgICAgICAvLyBjYWxjdWxhdGUgc3RhcnRpbmcgaW5kZXhlcyBmb3IgZG93bnNhbXBsaW5nIHJvdW5kcwotICAgICAgICBpbnRbXSBzdGFydFBvaW50cyA9IERvd25zYW1wbGluZy5nZXRTdGFydFBvaW50cyhjdXJyZW50U2FtcGxpbmdMZXZlbCwgbmV3U2FtcGxpbmdMZXZlbCk7Ci0KLSAgICAgICAgLy8gY2FsY3VsYXRlIG5ldyBvZmYtaGVhcCBzaXplCi0gICAgICAgIGludCBuZXdLZXlDb3VudCA9IGV4aXN0aW5nLnNpemUoKTsKLSAgICAgICAgbG9uZyBuZXdFbnRyaWVzTGVuZ3RoID0gZXhpc3RpbmcuZ2V0RW50cmllc0xlbmd0aCgpOwotICAgICAgICBmb3IgKGludCBzdGFydCA6IHN0YXJ0UG9pbnRzKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gc3RhcnQ7IGogPCBleGlzdGluZy5zaXplKCk7IGogKz0gY3VycmVudFNhbXBsaW5nTGV2ZWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3S2V5Q291bnQtLTsKLSAgICAgICAgICAgICAgICBsb25nIGxlbmd0aCA9IGV4aXN0aW5nLmdldEVuZEluU3VtbWFyeShqKSAtIGV4aXN0aW5nLmdldFBvc2l0aW9uSW5TdW1tYXJ5KGopOwotICAgICAgICAgICAgICAgIG5ld0VudHJpZXNMZW5ndGggLT0gbGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgTWVtb3J5IG9sZEVudHJpZXMgPSBleGlzdGluZy5nZXRFbnRyaWVzKCk7Ci0gICAgICAgIE1lbW9yeSBuZXdPZmZzZXRzID0gTWVtb3J5LmFsbG9jYXRlKG5ld0tleUNvdW50ICogNCk7Ci0gICAgICAgIE1lbW9yeSBuZXdFbnRyaWVzID0gTWVtb3J5LmFsbG9jYXRlKG5ld0VudHJpZXNMZW5ndGgpOwotCi0gICAgICAgIC8vIENvcHkgb2xkIGVudHJpZXMgdG8gb3VyIG5ldyBNZW1vcnkuCi0gICAgICAgIGludCBpID0gMDsKLSAgICAgICAgaW50IG5ld0VudHJpZXNPZmZzZXQgPSAwOwotICAgICAgICBvdXRlcjoKLSAgICAgICAgZm9yIChpbnQgb2xkU3VtbWFyeUluZGV4ID0gMDsgb2xkU3VtbWFyeUluZGV4IDwgZXhpc3Rpbmcuc2l6ZSgpOyBvbGRTdW1tYXJ5SW5kZXgrKykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIGlmIHdlIGNhbiBza2lwIHRoaXMgZW50cnksIGdvIHRocm91Z2ggdGhlIHN0YXJ0aW5nIHBvaW50cyBmb3Igb3VyIGRvd25zYW1wbGluZyByb3VuZHMKLSAgICAgICAgICAgIC8vIGFuZCBzZWUgaWYgdGhlIGVudHJ5J3MgaW5kZXggaXMgY292ZXJlZCBieSB0aGF0IHJvdW5kCi0gICAgICAgICAgICBmb3IgKGludCBzdGFydCA6IHN0YXJ0UG9pbnRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgob2xkU3VtbWFyeUluZGV4IC0gc3RhcnQpICUgY3VycmVudFNhbXBsaW5nTGV2ZWwgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHdyaXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgYWN0dWFsIGVudHJ5IGluIHRoZSBpbmRleCBzdW1tYXJ5ICg0IGJ5dGVzKQotICAgICAgICAgICAgbmV3T2Zmc2V0cy5zZXRJbnQoaSAqIDQsIG5ld0VudHJpZXNPZmZzZXQpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgbG9uZyBzdGFydCA9IGV4aXN0aW5nLmdldFBvc2l0aW9uSW5TdW1tYXJ5KG9sZFN1bW1hcnlJbmRleCk7Ci0gICAgICAgICAgICBsb25nIGxlbmd0aCA9IGV4aXN0aW5nLmdldEVuZEluU3VtbWFyeShvbGRTdW1tYXJ5SW5kZXgpIC0gc3RhcnQ7Ci0gICAgICAgICAgICBuZXdFbnRyaWVzLnB1dChuZXdFbnRyaWVzT2Zmc2V0LCBvbGRFbnRyaWVzLCBzdGFydCwgbGVuZ3RoKTsKLSAgICAgICAgICAgIG5ld0VudHJpZXNPZmZzZXQgKz0gbGVuZ3RoOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydCBuZXdFbnRyaWVzT2Zmc2V0ID09IG5ld0VudHJpZXNMZW5ndGg7Ci0gICAgICAgIHJldHVybiBuZXcgSW5kZXhTdW1tYXJ5KHBhcnRpdGlvbmVyLCBuZXdPZmZzZXRzLCBuZXdLZXlDb3VudCwgbmV3RW50cmllcywgbmV3RW50cmllc0xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcuZ2V0TWF4TnVtYmVyT2ZFbnRyaWVzKCksIG1pbkluZGV4SW50ZXJ2YWwsIG5ld1NhbXBsaW5nTGV2ZWwpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5TWFuYWdlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMWFkMmIuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7Ci0KLWltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5UaW1lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yUGx1czsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlNTVGFibGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlZpZXc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5FeGVjdXRvclV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1CZWFuV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLldyYXBwZWRSdW5uYWJsZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yRmFjdG9yeS5HbG9iYWwuZXhlY3V0b3JGYWN0b3J5OwotLyoqCi0gKiBNYW5hZ2VzIHRoZSBmaXhlZC1zaXplIG1lbW9yeSBwb29sIGZvciBpbmRleCBzdW1tYXJpZXMsIHBlcmlvZGljYWxseSByZXNpemluZyB0aGVtCi0gKiBpbiBvcmRlciB0byBnaXZlIG1vcmUgbWVtb3J5IHRvIGhvdCBzc3RhYmxlcyBhbmQgbGVzcyBtZW1vcnkgdG8gY29sZCBzc3RhYmxlcy4KLSAqLwotcHVibGljIGNsYXNzIEluZGV4U3VtbWFyeU1hbmFnZXIgaW1wbGVtZW50cyBJbmRleFN1bW1hcnlNYW5hZ2VyTUJlYW4KLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSW5kZXhTdW1tYXJ5TWFuYWdlci5jbGFzcyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUJFQU5fTkFNRSA9ICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPUluZGV4U3VtbWFyaWVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEluZGV4U3VtbWFyeU1hbmFnZXIgaW5zdGFuY2U7Ci0KLSAgICBwcml2YXRlIGxvbmcgbWVtb3J5UG9vbEJ5dGVzOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclBsdXMgZXhlY3V0b3I7Ci0KLSAgICAvLyBvdXIgbmV4dCBzY2hlZHVsZWQgcmVzaXppbmcgcnVuCi0gICAgcHJpdmF0ZSBTY2hlZHVsZWRGdXR1cmUgZnV0dXJlOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBpbnN0YW5jZSA9IG5ldyBJbmRleFN1bW1hcnlNYW5hZ2VyKCk7Ci0gICAgICAgIE1CZWFuV3JhcHBlci5pbnN0YW5jZS5yZWdpc3Rlck1CZWFuKGluc3RhbmNlLCBNQkVBTl9OQU1FKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEluZGV4U3VtbWFyeU1hbmFnZXIoKQotICAgIHsKLSAgICAgICAgZXhlY3V0b3IgPSBleGVjdXRvckZhY3RvcnkoKS5zY2hlZHVsZWQoZmFsc2UsICJJbmRleFN1bW1hcnlNYW5hZ2VyIiwgVGhyZWFkLk1JTl9QUklPUklUWSk7Ci0KLSAgICAgICAgbG9uZyBpbmRleFN1bW1hcnlTaXplSW5NQiA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbmRleFN1bW1hcnlDYXBhY2l0eUluTWlCKCk7Ci0gICAgICAgIGludCBpbnRlcnZhbCA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbmRleFN1bW1hcnlSZXNpemVJbnRlcnZhbEluTWludXRlcygpOwotICAgICAgICBsb2dnZXIuaW5mbygiSW5pdGlhbGl6aW5nIGluZGV4IHN1bW1hcnkgbWFuYWdlciB3aXRoIGEgbWVtb3J5IHBvb2wgc2l6ZSBvZiB7fSBNQiBhbmQgYSByZXNpemUgaW50ZXJ2YWwgb2Yge30gbWludXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIGluZGV4U3VtbWFyeVNpemVJbk1CLCBpbnRlcnZhbCk7Ci0KLSAgICAgICAgc2V0TWVtb3J5UG9vbENhcGFjaXR5SW5NQihEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW5kZXhTdW1tYXJ5Q2FwYWNpdHlJbk1pQigpKTsKLSAgICAgICAgc2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluZGV4U3VtbWFyeVJlc2l6ZUludGVydmFsSW5NaW51dGVzKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbmRleFN1bW1hcnlSZXNpemVJbnRlcnZhbEluTWludXRlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKGludCByZXNpemVJbnRlcnZhbEluTWludXRlcykKLSAgICB7Ci0gICAgICAgIGludCBvbGRJbnRlcnZhbCA9IGdldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKCk7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRJbmRleFN1bW1hcnlSZXNpemVJbnRlcnZhbEluTWludXRlcyhyZXNpemVJbnRlcnZhbEluTWludXRlcyk7Ci0KLSAgICAgICAgbG9uZyBpbml0aWFsRGVsYXk7Ci0gICAgICAgIGlmIChmdXR1cmUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW5pdGlhbERlbGF5ID0gb2xkSW50ZXJ2YWwgPCAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlc2l6ZUludGVydmFsSW5NaW51dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1hdGgubWF4KDAsIHJlc2l6ZUludGVydmFsSW5NaW51dGVzIC0gKG9sZEludGVydmFsIC0gZnV0dXJlLmdldERlbGF5KFRpbWVVbml0Lk1JTlVURVMpKSk7Ci0gICAgICAgICAgICBmdXR1cmUuY2FuY2VsKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluaXRpYWxEZWxheSA9IHJlc2l6ZUludGVydmFsSW5NaW51dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlc2l6ZUludGVydmFsSW5NaW51dGVzIDwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgZnV0dXJlID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1dHVyZSA9IGV4ZWN1dG9yLnNjaGVkdWxlV2l0aEZpeGVkRGVsYXkobmV3IFdyYXBwZWRSdW5uYWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHJ1bk1heVRocm93KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9LCBpbml0aWFsRGVsYXksIHJlc2l6ZUludGVydmFsSW5NaW51dGVzLCBUaW1lVW5pdC5NSU5VVEVTKTsKLSAgICB9Ci0KLSAgICAvLyBmb3IgdGVzdGluZyBvbmx5Ci0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgTG9uZyBnZXRUaW1lVG9OZXh0UmVzaXplKFRpbWVVbml0IHRpbWVVbml0KQotICAgIHsKLSAgICAgICAgaWYgKGZ1dHVyZSA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgcmV0dXJuIGZ1dHVyZS5nZXREZWxheSh0aW1lVW5pdCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0TWVtb3J5UG9vbENhcGFjaXR5SW5NQigpCi0gICAgewotICAgICAgICByZXR1cm4gbWVtb3J5UG9vbEJ5dGVzIC8gMTAyNEwgLyAxMDI0TDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPFN0cmluZywgSW50ZWdlcj4gZ2V0SW5kZXhJbnRlcnZhbHMoKQotICAgIHsKLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IGdldEFsbFNTVGFibGVzKCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IGludGVydmFscyA9IG5ldyBIYXNoTWFwPD4oc3N0YWJsZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIGludGVydmFscy5wdXQoc3N0YWJsZS5nZXRGaWxlbmFtZSgpLCAoaW50KSBNYXRoLnJvdW5kKHNzdGFibGUuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpKSk7Ci0KLSAgICAgICAgcmV0dXJuIGludGVydmFsczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldEF2ZXJhZ2VJbmRleEludGVydmFsKCkKLSAgICB7Ci0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBnZXRBbGxTU1RhYmxlcygpOwotICAgICAgICBkb3VibGUgdG90YWwgPSAwLjA7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICB0b3RhbCArPSBzc3RhYmxlLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKTsKLSAgICAgICAgcmV0dXJuIHRvdGFsIC8gc3N0YWJsZXMuc2l6ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIobG9uZyBtZW1vcnlQb29sQ2FwYWNpdHlJbk1CKQotICAgIHsKLSAgICAgICAgdGhpcy5tZW1vcnlQb29sQnl0ZXMgPSBtZW1vcnlQb29sQ2FwYWNpdHlJbk1CICogMTAyNEwgKiAxMDI0TDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBhY3R1YWwgc3BhY2UgY29uc3VtZWQgYnkgaW5kZXggc3VtbWFyaWVzIGZvciBhbGwgc3N0YWJsZXMuCi0gICAgICogQHJldHVybiBzcGFjZSBjdXJyZW50bHkgdXNlZCBpbiBNQgotICAgICAqLwotICAgIHB1YmxpYyBkb3VibGUgZ2V0TWVtb3J5UG9vbFNpemVJbk1CKCkKLSAgICB7Ci0gICAgICAgIGxvbmcgdG90YWwgPSAwOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGdldEFsbFNTVGFibGVzKCkpCi0gICAgICAgICAgICB0b3RhbCArPSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeU9mZkhlYXBTaXplKCk7Ci0gICAgICAgIHJldHVybiB0b3RhbCAvIDEwMjQuMCAvIDEwMjQuMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8U1NUYWJsZVJlYWRlcj4gZ2V0QWxsU1NUYWJsZXMoKQotICAgIHsKLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChLZXlzcGFjZSBrcyA6IEtleXNwYWNlLmFsbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmU3RvcmU6IGtzLmdldENvbHVtbkZhbWlseVN0b3JlcygpKQotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoY2ZTdG9yZS5nZXRMaXZlU1NUYWJsZXMoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hcmtzIHRoZSBub24tY29tcGFjdGluZyBzc3RhYmxlcyBhcyBjb21wYWN0aW5nIGZvciBpbmRleCBzdW1tYXJ5IHJlZGlzdHJpYnV0aW9uIGZvciBhbGwga2V5c3BhY2VzL3RhYmxlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gUGFpciBjb250YWluaW5nOgotICAgICAqICAgICAgICAgIGxlZnQ6IHRvdGFsIHNpemUgb2YgdGhlIG9mZiBoZWFwIGluZGV4IHN1bW1hcmllcyBmb3IgdGhlIHNzdGFibGVzIHdlIHdlcmUgdW5hYmxlIHRvIG1hcmsgY29tcGFjdGluZyAodGhleSB3ZXJlIGludm9sdmVkIGluIG90aGVyIGNvbXBhY3Rpb25zKQotICAgICAqICAgICAgICAgIHJpZ2h0OiB0aGUgdHJhbnNhY3Rpb25zLCBrZXllZCBieSB0YWJsZSBpZC4KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHByaXZhdGUgUGFpcjxMb25nLCBNYXA8VGFibGVJZCwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24+PiBnZXRSZXN0cmlidXRpb25UcmFuc2FjdGlvbnMoKQotICAgIHsKLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBhbGxDb21wYWN0aW5nID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIE1hcDxUYWJsZUlkLCBMaWZlY3ljbGVUcmFuc2FjdGlvbj4gYWxsTm9uQ29tcGFjdGluZyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgZm9yIChLZXlzcGFjZSBrcyA6IEtleXNwYWNlLmFsbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmU3RvcmU6IGtzLmdldENvbHVtbkZhbWlseVN0b3JlcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBub25Db21wYWN0aW5nLCBhbGxTU1RhYmxlczsKLSAgICAgICAgICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG47Ci0gICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFZpZXcgdmlldyA9IGNmU3RvcmUuZ2V0VHJhY2tlcigpLmdldFZpZXcoKTsKLSAgICAgICAgICAgICAgICAgICAgYWxsU1NUYWJsZXMgPSBJbW11dGFibGVTZXQuY29weU9mKHZpZXcuc2VsZWN0KFNTVGFibGVTZXQuQ0FOT05JQ0FMKSk7Ci0gICAgICAgICAgICAgICAgICAgIG5vbkNvbXBhY3RpbmcgPSBJbW11dGFibGVTZXQuY29weU9mKHZpZXcuZ2V0VW5jb21wYWN0aW5nKGFsbFNTVGFibGVzKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlIChudWxsID09ICh0eG4gPSBjZlN0b3JlLmdldFRyYWNrZXIoKS50cnlNb2RpZnkobm9uQ29tcGFjdGluZywgT3BlcmF0aW9uVHlwZS5JTkRFWF9TVU1NQVJZKSkpOwotCi0gICAgICAgICAgICAgICAgYWxsTm9uQ29tcGFjdGluZy5wdXQoY2ZTdG9yZS5tZXRhZGF0YS5pZCwgdHhuKTsKLSAgICAgICAgICAgICAgICBhbGxDb21wYWN0aW5nLmFkZEFsbChTZXRzLmRpZmZlcmVuY2UoYWxsU1NUYWJsZXMsIG5vbkNvbXBhY3RpbmcpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsb25nIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUgPSBhbGxDb21wYWN0aW5nLnN0cmVhbSgpLm1hcFRvTG9uZyhTU1RhYmxlUmVhZGVyOjpnZXRJbmRleFN1bW1hcnlPZmZIZWFwU2l6ZSkuc3VtKCk7Ci0gICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZShub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplLCBhbGxOb25Db21wYWN0aW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5pc0dsb2JhbENvbXBhY3Rpb25QYXVzZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgUGFpcjxMb25nLCBNYXA8VGFibGVJZCwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24+PiByZWRpc3RyaWJ1dGlvblRyYW5zYWN0aW9uSW5mbyA9IGdldFJlc3RyaWJ1dGlvblRyYW5zYWN0aW9ucygpOwotICAgICAgICBNYXA8VGFibGVJZCwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9ucyA9IHJlZGlzdHJpYnV0aW9uVHJhbnNhY3Rpb25JbmZvLnJpZ2h0OwotICAgICAgICBsb25nIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUgPSByZWRpc3RyaWJ1dGlvblRyYW5zYWN0aW9uSW5mby5sZWZ0OwotICAgICAgICB0cnkgKFRpbWVyLkNvbnRleHQgY3R4ID0gQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZ2V0TWV0cmljcygpLmluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uVGltZS50aW1lKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhuZXcgSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24odHJhbnNhY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVBvb2xCeXRlcykpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkluZGV4IHN1bW1hcnkgaW50ZXJydXB0ZWQ6IHt9IiwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiR290IGV4Y2VwdGlvbiBkdXJpbmcgaW5kZXggc3VtbWFyeSByZWRpc3RyaWJ1dGlvbiIsIGUpOwotICAgICAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5jbG9zZUFsbCh0cmFuc2FjdGlvbnMudmFsdWVzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXR0ZW1wdHMgdG8gZmFpcmx5IGRpc3RyaWJ1dGUgYSBmaXhlZCBwb29sIG9mIG1lbW9yeSBmb3IgaW5kZXggc3VtbWFyaWVzIGFjcm9zcyBhIHNldCBvZiBTU1RhYmxlcyBiYXNlZCBvbgotICAgICAqIHRoZWlyIHJlY2VudCByZWFkIHJhdGVzLgotICAgICAqIEBwYXJhbSByZWRpc3RyaWJ1dGlvbiBlbmNhcHN1bGF0aW5nIHRoZSB0cmFuc2FjdGlvbnMgY29udGFpbmluZyB0aGUgc3N0YWJsZXMgd2UgYXJlIHRvIHJlZGlzdHJpYnV0ZSB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IHBvb2wgYWNyb3NzIGFuZCBhIHNpemUgKGluIGJ5dGVzKSB0aGF0IHRoZSB0b3RhbCBpbmRleCBzdW1tYXJ5IHNwYWNlIHVzYWdlCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBzdGF5IGNsb3NlIHRvIG9yIHVuZGVyLCBpZiBwb3NzaWJsZQotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIG5ldyBTU1RhYmxlUmVhZGVyIGluc3RhbmNlcwotICAgICAqLwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTU1RhYmxlUmVhZGVyPiByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24gcmVkaXN0cmlidXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnJ1bkluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uKHJlZGlzdHJpYnV0aW9uKTsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bkFuZFdhaXQobG9uZyB0aW1lb3V0LCBUaW1lVW5pdCB1bml0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmIChmdXR1cmUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZnV0dXJlLmNhbmNlbChmYWxzZSk7Ci0gICAgICAgICAgICBmdXR1cmUgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIEV4ZWN1dG9yVXRpbHMuc2h1dGRvd25BbmRXYWl0KHRpbWVvdXQsIHVuaXQsIGV4ZWN1dG9yKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4U3VtbWFyeU1hbmFnZXJNQmVhbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlNYW5hZ2VyTUJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhM2Q0MC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4U3VtbWFyeU1hbmFnZXJNQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotcHVibGljIGludGVyZmFjZSBJbmRleFN1bW1hcnlNYW5hZ2VyTUJlYW4KLXsKLSAgICBwdWJsaWMgbG9uZyBnZXRNZW1vcnlQb29sQ2FwYWNpdHlJbk1CKCk7Ci0gICAgcHVibGljIHZvaWQgc2V0TWVtb3J5UG9vbENhcGFjaXR5SW5NQihsb25nIG1lbW9yeVBvb2xDYXBhY2l0eUluTUIpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY3VycmVudCBhY3R1YWwgb2ZmLWhlYXAgbWVtb3J5IHVzYWdlIG9mIHRoZSBpbmRleCBzdW1tYXJpZXMgZm9yIGFsbCBub24tY29tcGFjdGluZyBzc3RhYmxlcy4KLSAgICAgKiBAcmV0dXJuIFRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgaW4gTWlCLgotICAgICAqLwotICAgIHB1YmxpYyBkb3VibGUgZ2V0TWVtb3J5UG9vbFNpemVJbk1CKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbWFwIG9mIFNTVGFibGUgZmlsZW5hbWVzIHRvIHRoZWlyIGN1cnJlbnQgZWZmZWN0aXZlIGluZGV4IGludGVydmFsLgotICAgICAqLwotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBnZXRJbmRleEludGVydmFscygpOwotCi0gICAgcHVibGljIGRvdWJsZSBnZXRBdmVyYWdlSW5kZXhJbnRlcnZhbCgpOwotCi0gICAgcHVibGljIHZvaWQgcmVkaXN0cmlidXRlU3VtbWFyaWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgcHVibGljIGludCBnZXRSZXNpemVJbnRlcnZhbEluTWludXRlcygpOwotCi0gICAgLyoqCi0gICAgICogU2V0IHJlc2l6ZUludGVydmFsSW5NaW51dGVzID0gLTEgZm9yIGRpc2FibGVkOyBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIGluZGV4X3N1bW1hcnlfcmVzaXplX2ludGVydmFsIGJlaW5nCi0gICAgICogc2V0IHRvIG51bGwgaW4gY2Fzc2FuZHJhLnlhbWwKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXNpemVJbnRlcnZhbEluTWludXRlcyhpbnQgcmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmJlNzA5Li4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW5mby5Vbml0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuU3RvcmFnZU1ldHJpY3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZnM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Eb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwotCi1wdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24gZXh0ZW5kcyBDb21wYWN0aW9uSW5mby5Ib2xkZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24uY2xhc3MpOwotCi0gICAgLy8gVGhlIHRhcmdldCAob3IgaWRlYWwpIG51bWJlciBvZiBpbmRleCBzdW1tYXJ5IGVudHJpZXMgbXVzdCBkaWZmZXIgZnJvbSB0aGUgYWN0dWFsIG51bWJlciBvZgotICAgIC8vIGVudHJpZXMgYnkgdGhpcyByYXRpbyBpbiBvcmRlciB0byB0cmlnZ2VyIGFuIHVwc2FtcGxlIG9yIGRvd25zYW1wbGUgb2YgdGhlIHN1bW1hcnkuICBCZWNhdXNlCi0gICAgLy8gdXBzYW1wbGluZyByZXF1aXJlcyByZWFkaW5nIHRoZSBwcmltYXJ5IGluZGV4IGluIG9yZGVyIHRvIHJlYnVpbGQgdGhlIHN1bW1hcnksIHRoZSB0aHJlc2hvbGQKLSAgICAvLyBmb3IgdXBzYW1wbGluZyBpcyBpcyBoaWdoZXIuCi0gICAgc3RhdGljIGZpbmFsIGRvdWJsZSBVUFNBTVBMRV9USFJFU0hPTEQgPSAxLjU7Ci0gICAgc3RhdGljIGZpbmFsIGRvdWJsZSBET1dOU0FNUExFX1RIRVNIT0xEID0gMC43NTsKLQotICAgIHByaXZhdGUgZmluYWwgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBsb25nIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1lbW9yeVBvb2xCeXRlczsKLSAgICBwcml2YXRlIGZpbmFsIFRpbWVVVUlEIGNvbXBhY3Rpb25JZDsKLSAgICBwcml2YXRlIHZvbGF0aWxlIGxvbmcgcmVtYWluaW5nU3BhY2U7Ci0KLSAgICAvKioKLSAgICAgKgotICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbnMgdGhlIHRyYW5zYWN0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCBrZXlzcGFjZXMvdGFibGVzIHdlIGFyZSB0byByZWRpc3RyaWJ1dGUKLSAgICAgKiBAcGFyYW0gbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSB0aGUgdG90YWwgaW5kZXggc3VtbWFyeSBvZmYgaGVhcCBzaXplIGZvciBhbGwgc3N0YWJsZXMgd2Ugd2VyZSBub3QgYWJsZSB0byBtYXJrIGNvbXBhY3RpbmcgKGR1ZSB0byB0aGVtIGJlaW5nIGludm9sdmVkIGluIG90aGVyIGNvbXBhY3Rpb25zKQotICAgICAqIEBwYXJhbSBtZW1vcnlQb29sQnl0ZXMgc2l6ZSBvZiB0aGUgbWVtb3J5IHBvb2wKLSAgICAgKi8KLSAgICBwdWJsaWMgSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24oTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnMsIGxvbmcgbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSwgbG9uZyBtZW1vcnlQb29sQnl0ZXMpCi0gICAgewotICAgICAgICB0aGlzLnRyYW5zYWN0aW9ucyA9IHRyYW5zYWN0aW9uczsKLSAgICAgICAgdGhpcy5ub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplID0gbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZTsKLSAgICAgICAgdGhpcy5tZW1vcnlQb29sQnl0ZXMgPSBtZW1vcnlQb29sQnl0ZXM7Ci0gICAgICAgIHRoaXMuY29tcGFjdGlvbklkID0gbmV4dFRpbWVVVUlEKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U1NUYWJsZVJlYWRlcj4gcmVkaXN0cmlidXRlU3VtbWFyaWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBsb25nIHN0YXJ0ID0gbmFub1RpbWUoKTsKLSAgICAgICAgbG9nZ2VyLmluZm8oIlJlZGlzdHJpYnV0aW5nIGluZGV4IHN1bW1hcmllcyIpOwotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHJlZGlzdHJpYnV0ZSA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA6IHRyYW5zYWN0aW9ucy52YWx1ZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVkaXN0cmlidXRlLmFkZEFsbCh0eG4ub3JpZ2luYWxzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9uZyB0b3RhbCA9IG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemU7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogcmVkaXN0cmlidXRlKQotICAgICAgICAgICAgdG90YWwgKz0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlPZmZIZWFwU2l6ZSgpOwotCi0gICAgICAgIGxvZ2dlci5pbmZvKCJCZWdpbm5pbmcgcmVkaXN0cmlidXRpb24gb2YgaW5kZXggc3VtbWFyaWVzIGZvciB7fSBzc3RhYmxlcyB3aXRoIG1lbW9yeSBwb29sIHNpemUge30gTWlCOyBjdXJyZW50IHNwYWNlZCB1c2VkIGlzIHt9IE1pQiIsCi0gICAgICAgICAgICAgICAgICAgICByZWRpc3RyaWJ1dGUuc2l6ZSgpLCBtZW1vcnlQb29sQnl0ZXMgLyAxMDI0TCAvIDEwMjRMLCB0b3RhbCAvIDEwMjQuMCAvIDEwMjQuMCk7Ci0KLSAgICAgICAgZmluYWwgTWFwPFNTVGFibGVSZWFkZXIsIERvdWJsZT4gcmVhZFJhdGVzID0gbmV3IEhhc2hNYXA8PihyZWRpc3RyaWJ1dGUuc2l6ZSgpKTsKLSAgICAgICAgZG91YmxlIHRvdGFsUmVhZHNQZXJTZWMgPSAwLjA7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogcmVkaXN0cmlidXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNTdG9wUmVxdWVzdGVkKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbihnZXRDb21wYWN0aW9uSW5mbygpKTsKLQotICAgICAgICAgICAgaWYgKHNzdGFibGUuZ2V0UmVhZE1ldGVyKCkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEb3VibGUgcmVhZFJhdGUgPSBzc3RhYmxlLmdldFJlYWRNZXRlcigpLmZpZnRlZW5NaW51dGVSYXRlKCk7Ci0gICAgICAgICAgICAgICAgdG90YWxSZWFkc1BlclNlYyArPSByZWFkUmF0ZTsKLSAgICAgICAgICAgICAgICByZWFkUmF0ZXMucHV0KHNzdGFibGUsIHJlYWRSYXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBsb2dnZXIudHJhY2UoIlRvdGFsIHJlYWRzL3NlYyBhY3Jvc3MgYWxsIHNzdGFibGVzIGluIGluZGV4IHN1bW1hcnkgcmVzaXplIHByb2Nlc3M6IHt9IiwgdG90YWxSZWFkc1BlclNlYyk7Ci0KLSAgICAgICAgLy8gY29weSBhbmQgc29ydCBieSByZWFkIHJhdGVzIChhc2NlbmRpbmcpCi0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXNCeUhvdG5lc3MgPSBuZXcgQXJyYXlMaXN0PD4ocmVkaXN0cmlidXRlKTsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzc3RhYmxlc0J5SG90bmVzcywgbmV3IFJlYWRSYXRlQ29tcGFyYXRvcihyZWFkUmF0ZXMpKTsKLQotICAgICAgICBsb25nIHJlbWFpbmluZ0J5dGVzID0gbWVtb3J5UG9vbEJ5dGVzIC0gbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZTsKLQotICAgICAgICBsb2dnZXIudHJhY2UoIkluZGV4IHN1bW1hcmllcyBmb3IgY29tcGFjdGluZyBTU1RhYmxlcyBhcmUgdXNpbmcge30gTWlCIG9mIHNwYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgIChtZW1vcnlQb29sQnl0ZXMgLSByZW1haW5pbmdCeXRlcykgLyAxMDI0LjAgLyAxMDI0LjApOwotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IG5ld1NTVGFibGVzOwotICAgICAgICB0cnkgKFJlZnM8U1NUYWJsZVJlYWRlcj4gcmVmcyA9IFJlZnMucmVmKHNzdGFibGVzQnlIb3RuZXNzKSkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3U1NUYWJsZXMgPSBhZGp1c3RTYW1wbGluZ0xldmVscyhzc3RhYmxlc0J5SG90bmVzcywgdHJhbnNhY3Rpb25zLCB0b3RhbFJlYWRzUGVyU2VjLCByZW1haW5pbmdCeXRlcyk7Ci0KLSAgICAgICAgICAgIGZvciAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuIDogdHJhbnNhY3Rpb25zLnZhbHVlcygpKQotICAgICAgICAgICAgICAgIHR4bi5maW5pc2goKTsKLSAgICAgICAgfQotICAgICAgICB0b3RhbCA9IG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemU7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogbmV3U1NUYWJsZXMpCi0gICAgICAgICAgICB0b3RhbCArPSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeU9mZkhlYXBTaXplKCk7Ci0KLSAgICAgICAgbG9nZ2VyLmluZm8oIkNvbXBsZXRlZCByZXNpemluZyBvZiBpbmRleCBzdW1tYXJpZXM7IGN1cnJlbnQgYXBwcm94aW1hdGUgbWVtb3J5IHVzZWQ6IHt9IE1pQiwgdGltZSBzcGVudDoge31tcyIsCi0gICAgICAgICAgICAgICAgICAgIHRvdGFsIC8gMTAyNC4wIC8gMTAyNC4wLCBUaW1lVW5pdC5OQU5PU0VDT05EUy50b01pbGxpcyhuYW5vVGltZSgpIC0gc3RhcnQpKTsKLQotICAgICAgICByZXR1cm4gbmV3U1NUYWJsZXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PFNTVGFibGVSZWFkZXI+IGFkanVzdFNhbXBsaW5nTGV2ZWxzKExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxUYWJsZUlkLCBMaWZlY3ljbGVUcmFuc2FjdGlvbj4gdHJhbnNhY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG90YWxSZWFkc1BlclNlYywgbG9uZyBtZW1vcnlQb29sQ2FwYWNpdHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTGlzdDxSZXNhbXBsZUVudHJ5PiB0b0Rvd25zYW1wbGUgPSBuZXcgQXJyYXlMaXN0PD4oc3N0YWJsZXMuc2l6ZSgpIC8gNCk7Ci0gICAgICAgIExpc3Q8UmVzYW1wbGVFbnRyeT4gdG9VcHNhbXBsZSA9IG5ldyBBcnJheUxpc3Q8Pihzc3RhYmxlcy5zaXplKCkgLyA0KTsKLSAgICAgICAgTGlzdDxSZXNhbXBsZUVudHJ5PiBmb3JjZVJlc2FtcGxlID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIExpc3Q8UmVzYW1wbGVFbnRyeT4gZm9yY2VVcHNhbXBsZSA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IG5ld1NTVGFibGVzID0gbmV3IEFycmF5TGlzdDw+KHNzdGFibGVzLnNpemUoKSk7Ci0KLSAgICAgICAgLy8gR29pbmcgZnJvbSB0aGUgY29sZGVzdCB0byB0aGUgaG90dGVzdCBzc3RhYmxlcywgdHJ5IHRvIGdpdmUgZWFjaCBzc3RhYmxlIGFuIGFtb3VudCBvZiBzcGFjZSBwcm9wb3J0aW9uYWwKLSAgICAgICAgLy8gdG8gdGhlIG51bWJlciBvZiB0b3RhbCByZWFkcy9zZWMgaXQgaGFuZGxlcy4KLSAgICAgICAgcmVtYWluaW5nU3BhY2UgPSBtZW1vcnlQb29sQ2FwYWNpdHk7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc1N0b3BSZXF1ZXN0ZWQoKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uKGdldENvbXBhY3Rpb25JbmZvKCkpOwotCi0gICAgICAgICAgICBpbnQgbWluSW5kZXhJbnRlcnZhbCA9IHNzdGFibGUubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsKLSAgICAgICAgICAgIGludCBtYXhJbmRleEludGVydmFsID0gc3N0YWJsZS5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsOwotCi0gICAgICAgICAgICBkb3VibGUgcmVhZHNQZXJTZWMgPSBzc3RhYmxlLmdldFJlYWRNZXRlcigpID09IG51bGwgPyAwLjAgOiBzc3RhYmxlLmdldFJlYWRNZXRlcigpLmZpZnRlZW5NaW51dGVSYXRlKCk7Ci0gICAgICAgICAgICBsb25nIGlkZWFsU3BhY2UgPSBNYXRoLnJvdW5kKHJlbWFpbmluZ1NwYWNlICogKHJlYWRzUGVyU2VjIC8gdG90YWxSZWFkc1BlclNlYykpOwotCi0gICAgICAgICAgICAvLyBmaWd1cmUgb3V0IGhvdyBtYW55IGVudHJpZXMgb3VyIGlkZWFsU3BhY2Ugd291bGQgYnV5IHVzLCBhbmQgcGljayBhIG5ldyBzYW1wbGluZyBsZXZlbCBiYXNlZCBvbiB0aGF0Ci0gICAgICAgICAgICBpbnQgY3VycmVudE51bUVudHJpZXMgPSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeVNpemUoKTsKLSAgICAgICAgICAgIGRvdWJsZSBhdmdFbnRyeVNpemUgPSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeU9mZkhlYXBTaXplKCkgLyAoZG91YmxlKSBjdXJyZW50TnVtRW50cmllczsKLSAgICAgICAgICAgIGxvbmcgdGFyZ2V0TnVtRW50cmllcyA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoaWRlYWxTcGFjZSAvIGF2Z0VudHJ5U2l6ZSkpOwotICAgICAgICAgICAgaW50IGN1cnJlbnRTYW1wbGluZ0xldmVsID0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCk7Ci0gICAgICAgICAgICBpbnQgbWF4U3VtbWFyeVNpemUgPSBzc3RhYmxlLmdldE1heEluZGV4U3VtbWFyeVNpemUoKTsKLQotICAgICAgICAgICAgLy8gaWYgdGhlIG1pbl9pbmRleF9pbnRlcnZhbCBjaGFuZ2VkLCBjYWxjdWxhdGUgd2hhdCBvdXIgY3VycmVudCBzYW1wbGluZyBsZXZlbCB3b3VsZCBiZSB1bmRlciB0aGUgbmV3IG1pbgotICAgICAgICAgICAgaWYgKHNzdGFibGUuZ2V0TWluSW5kZXhJbnRlcnZhbCgpICE9IG1pbkluZGV4SW50ZXJ2YWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGVmZmVjdGl2ZVNhbXBsaW5nTGV2ZWwgPSAoaW50KSBNYXRoLnJvdW5kKGN1cnJlbnRTYW1wbGluZ0xldmVsICogKG1pbkluZGV4SW50ZXJ2YWwgLyAoZG91YmxlKSBzc3RhYmxlLmdldE1pbkluZGV4SW50ZXJ2YWwoKSkpOwotICAgICAgICAgICAgICAgIG1heFN1bW1hcnlTaXplID0gKGludCkgTWF0aC5yb3VuZChtYXhTdW1tYXJ5U2l6ZSAqIChzc3RhYmxlLmdldE1pbkluZGV4SW50ZXJ2YWwoKSAvIChkb3VibGUpIG1pbkluZGV4SW50ZXJ2YWwpKTsKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm1pbl9pbmRleF9pbnRlcnZhbCBjaGFuZ2VkIGZyb20ge30gdG8ge30sIHNvIHRoZSBjdXJyZW50IHNhbXBsaW5nIGxldmVsIGZvciB7fSBpcyBlZmZlY3RpdmVseSBub3cge30gKHdhcyB7fSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldE1pbkluZGV4SW50ZXJ2YWwoKSwgbWluSW5kZXhJbnRlcnZhbCwgc3N0YWJsZSwgZWZmZWN0aXZlU2FtcGxpbmdMZXZlbCwgY3VycmVudFNhbXBsaW5nTGV2ZWwpOwotICAgICAgICAgICAgICAgIGN1cnJlbnRTYW1wbGluZ0xldmVsID0gZWZmZWN0aXZlU2FtcGxpbmdMZXZlbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IG5ld1NhbXBsaW5nTGV2ZWwgPSBJbmRleFN1bW1hcnlCdWlsZGVyLmNhbGN1bGF0ZVNhbXBsaW5nTGV2ZWwoY3VycmVudFNhbXBsaW5nTGV2ZWwsIGN1cnJlbnROdW1FbnRyaWVzLCB0YXJnZXROdW1FbnRyaWVzLAotICAgICAgICAgICAgICAgICAgICBtaW5JbmRleEludGVydmFsLCBtYXhJbmRleEludGVydmFsKTsKLSAgICAgICAgICAgIGludCBudW1FbnRyaWVzQXROZXdTYW1wbGluZ0xldmVsID0gSW5kZXhTdW1tYXJ5QnVpbGRlci5lbnRyaWVzQXRTYW1wbGluZ0xldmVsKG5ld1NhbXBsaW5nTGV2ZWwsIG1heFN1bW1hcnlTaXplKTsKLSAgICAgICAgICAgIGRvdWJsZSBlZmZlY3RpdmVJbmRleEludGVydmFsID0gc3N0YWJsZS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCk7Ci0KLSAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInt9IGhhcyB7fSByZWFkcy9zZWM7IGlkZWFsIHNwYWNlIGZvciBpbmRleCBzdW1tYXJ5OiB7fSAoe30gZW50cmllcyk7IGNvbnNpZGVyaW5nIG1vdmluZyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyb20gbGV2ZWwge30gKHt9IGVudHJpZXMsIHt9KSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIGxldmVsIHt9ICh7fSBlbnRyaWVzLCB7fSkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldEZpbGVuYW1lKCksIHJlYWRzUGVyU2VjLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShpZGVhbFNwYWNlKSwgdGFyZ2V0TnVtRW50cmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNhbXBsaW5nTGV2ZWwsIGN1cnJlbnROdW1FbnRyaWVzLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeSgobG9uZykgKGN1cnJlbnROdW1FbnRyaWVzICogYXZnRW50cnlTaXplKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NhbXBsaW5nTGV2ZWwsIG51bUVudHJpZXNBdE5ld1NhbXBsaW5nTGV2ZWwsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KChsb25nKSAobnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbCAqIGF2Z0VudHJ5U2l6ZSkpKTsKLQotICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwgPCBtaW5JbmRleEludGVydmFsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRoZSBtaW5faW5kZXhfaW50ZXJ2YWwgd2FzIGNoYW5nZWQ7IHJlLXNhbXBsZSB0byBtYXRjaCBpdC4KLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkZvcmNpbmcgcmVzYW1wbGUgb2Yge30gYmVjYXVzZSB0aGUgY3VycmVudCBpbmRleCBpbnRlcnZhbCAoe30pIGlzIGJlbG93IG1pbl9pbmRleF9pbnRlcnZhbCAoe30pIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUsIGVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwsIG1pbkluZGV4SW50ZXJ2YWwpOwotICAgICAgICAgICAgICAgIGxvbmcgc3BhY2VVc2VkID0gKGxvbmcpIE1hdGguY2VpbChhdmdFbnRyeVNpemUgKiBudW1FbnRyaWVzQXROZXdTYW1wbGluZ0xldmVsKTsKLSAgICAgICAgICAgICAgICBmb3JjZVJlc2FtcGxlLmFkZChuZXcgUmVzYW1wbGVFbnRyeShzc3RhYmxlLCBzcGFjZVVzZWQsIG5ld1NhbXBsaW5nTGV2ZWwpKTsKLSAgICAgICAgICAgICAgICByZW1haW5pbmdTcGFjZSAtPSBzcGFjZVVzZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChlZmZlY3RpdmVJbmRleEludGVydmFsID4gbWF4SW5kZXhJbnRlcnZhbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgbWF4X2luZGV4X2ludGVydmFsIHdhcyBsb3dlcmVkOyBmb3JjZSBhbiB1cHNhbXBsZSB0byB0aGUgZWZmZWN0aXZlIG1pbmltdW0gc2FtcGxpbmcgbGV2ZWwKLSAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkZvcmNpbmcgdXBzYW1wbGUgb2Yge30gYmVjYXVzZSB0aGUgY3VycmVudCBpbmRleCBpbnRlcnZhbCAoe30pIGlzIGFib3ZlIG1heF9pbmRleF9pbnRlcnZhbCAoe30pIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUsIGVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwsIG1heEluZGV4SW50ZXJ2YWwpOwotICAgICAgICAgICAgICAgIG5ld1NhbXBsaW5nTGV2ZWwgPSBNYXRoLm1heCgxLCAoQkFTRV9TQU1QTElOR19MRVZFTCAqIG1pbkluZGV4SW50ZXJ2YWwpIC8gbWF4SW5kZXhJbnRlcnZhbCk7Ci0gICAgICAgICAgICAgICAgbnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbCA9IEluZGV4U3VtbWFyeUJ1aWxkZXIuZW50cmllc0F0U2FtcGxpbmdMZXZlbChuZXdTYW1wbGluZ0xldmVsLCBzc3RhYmxlLmdldE1heEluZGV4U3VtbWFyeVNpemUoKSk7Ci0gICAgICAgICAgICAgICAgbG9uZyBzcGFjZVVzZWQgPSAobG9uZykgTWF0aC5jZWlsKGF2Z0VudHJ5U2l6ZSAqIG51bUVudHJpZXNBdE5ld1NhbXBsaW5nTGV2ZWwpOwotICAgICAgICAgICAgICAgIGZvcmNlVXBzYW1wbGUuYWRkKG5ldyBSZXNhbXBsZUVudHJ5KHNzdGFibGUsIHNwYWNlVXNlZCwgbmV3U2FtcGxpbmdMZXZlbCkpOwotICAgICAgICAgICAgICAgIHJlbWFpbmluZ1NwYWNlIC09IGF2Z0VudHJ5U2l6ZSAqIG51bUVudHJpZXNBdE5ld1NhbXBsaW5nTGV2ZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0YXJnZXROdW1FbnRyaWVzID49IGN1cnJlbnROdW1FbnRyaWVzICogVVBTQU1QTEVfVEhSRVNIT0xEICYmIG5ld1NhbXBsaW5nTGV2ZWwgPiBjdXJyZW50U2FtcGxpbmdMZXZlbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIHNwYWNlVXNlZCA9IChsb25nKSBNYXRoLmNlaWwoYXZnRW50cnlTaXplICogbnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbCk7Ci0gICAgICAgICAgICAgICAgdG9VcHNhbXBsZS5hZGQobmV3IFJlc2FtcGxlRW50cnkoc3N0YWJsZSwgc3BhY2VVc2VkLCBuZXdTYW1wbGluZ0xldmVsKSk7Ci0gICAgICAgICAgICAgICAgcmVtYWluaW5nU3BhY2UgLT0gYXZnRW50cnlTaXplICogbnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHRhcmdldE51bUVudHJpZXMgPCBjdXJyZW50TnVtRW50cmllcyAqIERPV05TQU1QTEVfVEhFU0hPTEQgJiYgbmV3U2FtcGxpbmdMZXZlbCA8IGN1cnJlbnRTYW1wbGluZ0xldmVsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgc3BhY2VVc2VkID0gKGxvbmcpIE1hdGguY2VpbChhdmdFbnRyeVNpemUgKiBudW1FbnRyaWVzQXROZXdTYW1wbGluZ0xldmVsKTsKLSAgICAgICAgICAgICAgICB0b0Rvd25zYW1wbGUuYWRkKG5ldyBSZXNhbXBsZUVudHJ5KHNzdGFibGUsIHNwYWNlVXNlZCwgbmV3U2FtcGxpbmdMZXZlbCkpOwotICAgICAgICAgICAgICAgIHJlbWFpbmluZ1NwYWNlIC09IHNwYWNlVXNlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBrZWVwIHRoZSBzYW1lIHNhbXBsaW5nIGxldmVsCi0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJTU1RhYmxlIHt9IGlzIHdpdGhpbiB0aHJlc2hvbGRzIG9mIGlkZWFsIHNhbXBsaW5nIiwgc3N0YWJsZSk7Ci0gICAgICAgICAgICAgICAgcmVtYWluaW5nU3BhY2UgLT0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlPZmZIZWFwU2l6ZSgpOwotICAgICAgICAgICAgICAgIG5ld1NTVGFibGVzLmFkZChzc3RhYmxlKTsKLSAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMuZ2V0KHNzdGFibGUubWV0YWRhdGEoKS5pZCkuY2FuY2VsKHNzdGFibGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG90YWxSZWFkc1BlclNlYyAtPSByZWFkc1BlclNlYzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZW1haW5pbmdTcGFjZSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhaXI8TGlzdDxTU1RhYmxlUmVhZGVyPiwgTGlzdDxSZXNhbXBsZUVudHJ5Pj4gcmVzdWx0ID0gZGlzdHJpYnV0ZVJlbWFpbmluZ1NwYWNlKHRvRG93bnNhbXBsZSwgcmVtYWluaW5nU3BhY2UpOwotICAgICAgICAgICAgdG9Eb3duc2FtcGxlID0gcmVzdWx0LnJpZ2h0OwotICAgICAgICAgICAgbmV3U1NUYWJsZXMuYWRkQWxsKHJlc3VsdC5sZWZ0KTsKLSAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogcmVzdWx0LmxlZnQpCi0gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zLmdldChzc3RhYmxlLm1ldGFkYXRhKCkuaWQpLmNhbmNlbChzc3RhYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGRvd25zYW1wbGUgZmlyc3QsIHRoZW4gdXBzYW1wbGUKLSAgICAgICAgbG9nZ2VyLmluZm8oImluZGV4IHN1bW1hcmllczogZG93bnNhbXBsZToge30sIGZvcmNlIHJlc2FtcGxlOiB7fSwgdXBzYW1wbGU6IHt9LCBmb3JjZSB1cHNhbXBsZToge30iLCB0b0Rvd25zYW1wbGUuc2l6ZSgpLCBmb3JjZVJlc2FtcGxlLnNpemUoKSwgdG9VcHNhbXBsZS5zaXplKCksIGZvcmNlVXBzYW1wbGUuc2l6ZSgpKTsKLSAgICAgICAgdG9Eb3duc2FtcGxlLmFkZEFsbChmb3JjZVJlc2FtcGxlKTsKLSAgICAgICAgdG9Eb3duc2FtcGxlLmFkZEFsbCh0b1Vwc2FtcGxlKTsKLSAgICAgICAgdG9Eb3duc2FtcGxlLmFkZEFsbChmb3JjZVVwc2FtcGxlKTsKLSAgICAgICAgZm9yIChSZXNhbXBsZUVudHJ5IGVudHJ5IDogdG9Eb3duc2FtcGxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNTdG9wUmVxdWVzdGVkKCkpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbihnZXRDb21wYWN0aW9uSW5mbygpKTsKLQotICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gZW50cnkuc3N0YWJsZTsKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiUmUtc2FtcGxpbmcgaW5kZXggc3VtbWFyeSBmb3Ige30gZnJvbSB7fS97fSB0byB7fS97fSBvZiB0aGUgb3JpZ2luYWwgbnVtYmVyIG9mIGVudHJpZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2FtcGxpbmdMZXZlbCgpLCBEb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5uZXdTYW1wbGluZ0xldmVsLCBEb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTCk7Ci0gICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKHNzdGFibGUubWV0YWRhdGEoKS5rZXlzcGFjZSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoc3N0YWJsZS5tZXRhZGF0YSgpLmlkKTsKLSAgICAgICAgICAgIGxvbmcgb2xkU2l6ZSA9IHNzdGFibGUuYnl0ZXNPbkRpc2soKTsKLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVwbGFjZW1lbnQgPSBzc3RhYmxlLmNsb25lV2l0aE5ld1N1bW1hcnlTYW1wbGluZ0xldmVsKGNmcywgZW50cnkubmV3U2FtcGxpbmdMZXZlbCk7Ci0gICAgICAgICAgICBsb25nIG5ld1NpemUgPSByZXBsYWNlbWVudC5ieXRlc09uRGlzaygpOwotICAgICAgICAgICAgbmV3U1NUYWJsZXMuYWRkKHJlcGxhY2VtZW50KTsKLSAgICAgICAgICAgIHRyYW5zYWN0aW9ucy5nZXQoc3N0YWJsZS5tZXRhZGF0YSgpLmlkKS51cGRhdGUocmVwbGFjZW1lbnQsIHRydWUpOwotICAgICAgICAgICAgYWRkSG9va3MoY2ZzLCB0cmFuc2FjdGlvbnMsIG9sZFNpemUsIG5ld1NpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG5ld1NTVGFibGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBob29rcyB0byBjb3JyZWN0bHkgdXBkYXRlIHRoZSBzdG9yYWdlIGxvYWQgbWV0cmljcyBvbmNlIHRoZSB0cmFuc2FjdGlvbiBpcyBjbG9zZWQvYWJvcnRlZAotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFRyYW5zYWN0aW9ucyBhcmUgY2xvc2VkIGluIGZpbmFsbHkgb3V0c2lkZSBvZiB0aGlzIG1ldGhvZAotICAgIHByaXZhdGUgdm9pZCBhZGRIb29rcyhDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIE1hcDxUYWJsZUlkLCBMaWZlY3ljbGVUcmFuc2FjdGlvbj4gdHJhbnNhY3Rpb25zLCBsb25nIG9sZFNpemUsIGxvbmcgbmV3U2l6ZSkKLSAgICB7Ci0gICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IHRyYW5zYWN0aW9ucy5nZXQoY2ZzLm1ldGFkYXRhLmlkKTsKLSAgICAgICAgdHhuLnJ1bk9uQ29tbWl0KCgpIC0+IHsKLSAgICAgICAgICAgIC8vIFRoZSBuZXcgc2l6ZSB3aWxsIGJlIGFkZGVkIGluIFRyYW5zYWN0aW9uYWwuY29tbWl0KCkgYXMgYW4gdXBkYXRlZCBTU1RhYmxlLCBtb3JlIGRldGFpbHM6IENBU1NBTkRSQS0xMzczOAotICAgICAgICAgICAgU3RvcmFnZU1ldHJpY3MubG9hZC5kZWMob2xkU2l6ZSk7Ci0gICAgICAgICAgICBjZnMubWV0cmljLmxpdmVEaXNrU3BhY2VVc2VkLmRlYyhvbGRTaXplKTsKLSAgICAgICAgICAgIGNmcy5tZXRyaWMudG90YWxEaXNrU3BhY2VVc2VkLmRlYyhvbGRTaXplKTsKLSAgICAgICAgfSk7Ci0gICAgICAgIHR4bi5ydW5PbkFib3J0KCgpIC0+IHsKLSAgICAgICAgICAgIC8vIHRoZSBsb2NhbCBkaXNrIHdhcyBtb2RpZmllZCBidXQgYm9vayBrZWVwaW5nIGNvdWxkbid0IGJlIGNvbW1pdGVkLCBhcHBseSB0aGUgZGVsdGEKLSAgICAgICAgICAgIGxvbmcgZGVsdGEgPSBvbGRTaXplIC0gbmV3U2l6ZTsgLy8gaWYgbmV3IGlzIGxhcmdlciB0aGlzIHdpbGwgYmUgbmVnYXRpdmUsIHNvIGRlYyB3aWxsIGJlY29tZSBhIGluYwotICAgICAgICAgICAgU3RvcmFnZU1ldHJpY3MubG9hZC5kZWMoZGVsdGEpOwotICAgICAgICAgICAgY2ZzLm1ldHJpYy5saXZlRGlza1NwYWNlVXNlZC5kZWMoZGVsdGEpOwotICAgICAgICAgICAgY2ZzLm1ldHJpYy50b3RhbERpc2tTcGFjZVVzZWQuZGVjKGRlbHRhKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIFBhaXI8TGlzdDxTU1RhYmxlUmVhZGVyPiwgTGlzdDxSZXNhbXBsZUVudHJ5Pj4gZGlzdHJpYnV0ZVJlbWFpbmluZ1NwYWNlKExpc3Q8UmVzYW1wbGVFbnRyeT4gdG9Eb3duc2FtcGxlLCBsb25nIHJlbWFpbmluZ1NwYWNlKQotICAgIHsKLSAgICAgICAgLy8gc29ydCBieSB0aGUgYW1vdW50IG9mIHNwYWNlIHJlZ2FpbmVkIGJ5IGRvaW5nIHRoZSBkb3duc2FtcGxlIG9wZXJhdGlvbjsgd2Ugd2FudCB0byB0cnkgdG8gYXZvaWQgb3BlcmF0aW9ucwotICAgICAgICAvLyB0aGF0IHdpbGwgbWFrZSBsaXR0bGUgZGlmZmVyZW5jZS4KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0b0Rvd25zYW1wbGUsIG5ldyBDb21wYXJhdG9yPFJlc2FtcGxlRW50cnk+KCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFJlc2FtcGxlRW50cnkgbzEsIFJlc2FtcGxlRW50cnkgbzIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5jb21wYXJlKG8xLnNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5T2ZmSGVhcFNpemUoKSAtIG8xLm5ld1NwYWNlVXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbzIuc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlPZmZIZWFwU2l6ZSgpIC0gbzIubmV3U3BhY2VVc2VkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgaW50IG5vRG93bnNhbXBsZUN1dG9mZiA9IDA7Ci0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gd2lsbE5vdERvd25zYW1wbGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgd2hpbGUgKHJlbWFpbmluZ1NwYWNlID4gMCAmJiBub0Rvd25zYW1wbGVDdXRvZmYgPCB0b0Rvd25zYW1wbGUuc2l6ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXNhbXBsZUVudHJ5IGVudHJ5ID0gdG9Eb3duc2FtcGxlLmdldChub0Rvd25zYW1wbGVDdXRvZmYpOwotCi0gICAgICAgICAgICBsb25nIGV4dHJhU3BhY2VSZXF1aXJlZCA9IGVudHJ5LnNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5T2ZmSGVhcFNpemUoKSAtIGVudHJ5Lm5ld1NwYWNlVXNlZDsKLSAgICAgICAgICAgIC8vIHNlZSBpZiB3ZSBoYXZlIGVub3VnaCBsZWZ0b3ZlciBzcGFjZSB0byBrZWVwIHRoZSBjdXJyZW50IHNhbXBsaW5nIGxldmVsCi0gICAgICAgICAgICBpZiAoZXh0cmFTcGFjZVJlcXVpcmVkIDw9IHJlbWFpbmluZ1NwYWNlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiVXNpbmcgbGVmdG92ZXIgc3BhY2UgdG8ga2VlcCB7fSBhdCB0aGUgY3VycmVudCBzYW1wbGluZyBsZXZlbCAoe30pIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuc3N0YWJsZSwgZW50cnkuc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICAgICAgICAgIHdpbGxOb3REb3duc2FtcGxlLmFkZChlbnRyeS5zc3RhYmxlKTsKLSAgICAgICAgICAgICAgICByZW1haW5pbmdTcGFjZSAtPSBleHRyYVNwYWNlUmVxdWlyZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5vRG93bnNhbXBsZUN1dG9mZisrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZSh3aWxsTm90RG93bnNhbXBsZSwgdG9Eb3duc2FtcGxlLnN1Ykxpc3Qobm9Eb3duc2FtcGxlQ3V0b2ZmLCB0b0Rvd25zYW1wbGUuc2l6ZSgpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBDb21wYWN0aW9uSW5mby53aXRob3V0U1NUYWJsZXMobnVsbCwgT3BlcmF0aW9uVHlwZS5JTkRFWF9TVU1NQVJZLCAobWVtb3J5UG9vbEJ5dGVzIC0gcmVtYWluaW5nU3BhY2UpLCBtZW1vcnlQb29sQnl0ZXMsIFVuaXQuQllURVMsIGNvbXBhY3Rpb25JZCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqIFV0aWxpdHkgY2xhc3MgZm9yIHNvcnRpbmcgc3N0YWJsZXMgYnkgdGhlaXIgcmVhZCByYXRlcy4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWFkUmF0ZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPFNTVGFibGVSZWFkZXI+Ci0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTU1RhYmxlUmVhZGVyLCBEb3VibGU+IHJlYWRSYXRlczsKLQotICAgICAgICBSZWFkUmF0ZUNvbXBhcmF0b3IoTWFwPFNTVGFibGVSZWFkZXIsIERvdWJsZT4gcmVhZFJhdGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJlYWRSYXRlcyA9IHJlYWRSYXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoU1NUYWJsZVJlYWRlciBvMSwgU1NUYWJsZVJlYWRlciBvMikKLSAgICAgICAgewotICAgICAgICAgICAgRG91YmxlIHJlYWRSYXRlMSA9IHJlYWRSYXRlcy5nZXQobzEpOwotICAgICAgICAgICAgRG91YmxlIHJlYWRSYXRlMiA9IHJlYWRSYXRlcy5nZXQobzIpOwotICAgICAgICAgICAgaWYgKHJlYWRSYXRlMSA9PSBudWxsICYmIHJlYWRSYXRlMiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgZWxzZSBpZiAocmVhZFJhdGUxID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgZWxzZSBpZiAocmVhZFJhdGUyID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5jb21wYXJlKHJlYWRSYXRlMSwgcmVhZFJhdGUyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlc2FtcGxlRW50cnkKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBTU1RhYmxlUmVhZGVyIHNzdGFibGU7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIG5ld1NwYWNlVXNlZDsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBuZXdTYW1wbGluZ0xldmVsOwotCi0gICAgICAgIFJlc2FtcGxlRW50cnkoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBsb25nIG5ld1NwYWNlVXNlZCwgaW50IG5ld1NhbXBsaW5nTGV2ZWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc3N0YWJsZSA9IHNzdGFibGU7Ci0gICAgICAgICAgICB0aGlzLm5ld1NwYWNlVXNlZCA9IG5ld1NwYWNlVXNlZDsKLSAgICAgICAgICAgIHRoaXMubmV3U2FtcGxpbmdMZXZlbCA9IG5ld1NhbXBsaW5nTGV2ZWw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0tleUl0ZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0tleUl0ZXJhdG9yLmphdmEKaW5kZXggY2VhY2Y4Ny4uZGJlNTAxZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9LZXlJdGVyYXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvS2V5SXRlcmF0b3IuamF2YQpAQCAtMTksMTAzICsxOSw0OCBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWFkV3JpdGVMb2NrOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudFJlYWRXcml0ZUxvY2s7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93SW5kZXhFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQWJzdHJhY3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9zZWFibGVJdGVyYXRvcjsKIAogcHVibGljIGNsYXNzIEtleUl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvcjxEZWNvcmF0ZWRLZXk+IGltcGxlbWVudHMgQ2xvc2VhYmxlSXRlcmF0b3I8RGVjb3JhdGVkS2V5PgogewotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGNsYXNzIEluCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIEZpbGUgcGF0aDsKLSAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBSYW5kb21BY2Nlc3NSZWFkZXIgaW47Ci0KLSAgICAgICAgcHVibGljIEluKEZpbGUgcGF0aCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtYXliZUluaXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaW4gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGluID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4ocGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIERhdGFJbnB1dFBsdXMgZ2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgbWF5YmVJbml0KCk7Ci0gICAgICAgICAgICByZXR1cm4gaW47Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VPRigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heWJlSW5pdCgpOwotICAgICAgICAgICAgcmV0dXJuIGluLmlzRU9GKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbiAhPSBudWxsKQotICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRGaWxlUG9pbnRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heWJlSW5pdCgpOwotICAgICAgICAgICAgcmV0dXJuIGluLmdldEZpbGVQb2ludGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBsZW5ndGgoKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXliZUluaXQoKTsKLSAgICAgICAgICAgIHJldHVybiBpbi5sZW5ndGgoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvciBkZXNjOwotICAgIHByaXZhdGUgZmluYWwgSW4gaW47CiAgICAgcHJpdmF0ZSBmaW5hbCBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBLZXlSZWFkZXIgaXQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBSZWFkV3JpdGVMb2NrIGZpbGVBY2Nlc3NMb2NrOworICAgIHByaXZhdGUgZmluYWwgbG9uZyB0b3RhbEJ5dGVzOwogCi0gICAgcHJpdmF0ZSBsb25nIGtleVBvc2l0aW9uOworICAgIHByaXZhdGUgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOwogCi0gICAgcHVibGljIEtleUl0ZXJhdG9yKERlc2NyaXB0b3IgZGVzYywgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICBwdWJsaWMgS2V5SXRlcmF0b3IoS2V5UmVhZGVyIGl0LCBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIsIGxvbmcgdG90YWxCeXRlcywgUmVhZFdyaXRlTG9jayBmaWxlQWNjZXNzTG9jaykKICAgICB7Ci0gICAgICAgIHRoaXMuZGVzYyA9IGRlc2M7Ci0gICAgICAgIGluID0gbmV3IEluKG5ldyBGaWxlKGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpKSk7Ci0gICAgICAgIHBhcnRpdGlvbmVyID0gbWV0YWRhdGEucGFydGl0aW9uZXI7Ci0gICAgICAgIGZpbGVBY2Nlc3NMb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICAgICAgdGhpcy5pdCA9IGl0OworICAgICAgICB0aGlzLnBhcnRpdGlvbmVyID0gcGFydGl0aW9uZXI7CisgICAgICAgIHRoaXMudG90YWxCeXRlcyA9IHRvdGFsQnl0ZXM7CisgICAgICAgIHRoaXMuZmlsZUFjY2Vzc0xvY2sgPSBmaWxlQWNjZXNzTG9jazsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgRGVjb3JhdGVkS2V5IGNvbXB1dGVOZXh0KCkKICAgICB7Ci0gICAgICAgIGZpbGVBY2Nlc3NMb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICBpZiAoZmlsZUFjY2Vzc0xvY2sgIT0gbnVsbCkKKyAgICAgICAgICAgIGZpbGVBY2Nlc3NMb2NrLnJlYWRMb2NrKCkubG9jaygpOwogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGluLmlzRU9GKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOwotCi0gICAgICAgICAgICBrZXlQb3NpdGlvbiA9IGluLmdldEZpbGVQb2ludGVyKCk7Ci0gICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbi5nZXQoKSkpOwotICAgICAgICAgICAgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyLnNraXAoaW4uZ2V0KCksIGRlc2MudmVyc2lvbik7IC8vIHNraXAgcmVtYWluZGVyIG9mIHRoZSBlbnRyeQotICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgICAgIGlmICghaW5pdGlhbGl6ZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBpdC5pc0V4aGF1c3RlZCgpCisgICAgICAgICAgICAgICAgICAgICAgID8gZW5kT2ZEYXRhKCkKKyAgICAgICAgICAgICAgICAgICAgICAgOiBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShpdC5rZXkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0LmFkdmFuY2UoKQorICAgICAgICAgICAgICAgICAgICAgICA/IHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KGl0LmtleSgpKQorICAgICAgICAgICAgICAgICAgICAgICA6IGVuZE9mRGF0YSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQogICAgICAgICB7CkBAIC0xMjMsNDUgKzY4LDQ0IEBACiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQogICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlQWNjZXNzTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgaWYgKGZpbGVBY2Nlc3NMb2NrICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmlsZUFjY2Vzc0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKICAgICB7Ci0gICAgICAgIGZpbGVBY2Nlc3NMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgaWYgKGZpbGVBY2Nlc3NMb2NrICE9IG51bGwpCisgICAgICAgICAgICBmaWxlQWNjZXNzTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgaXQuY2xvc2UoKTsKICAgICAgICAgfQogICAgICAgICBmaW5hbGx5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVBY2Nlc3NMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICAgICAgaWYgKGZpbGVBY2Nlc3NMb2NrICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmlsZUFjY2Vzc0xvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgbG9uZyBnZXRCeXRlc1JlYWQoKQogICAgIHsKLSAgICAgICAgZmlsZUFjY2Vzc0xvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgIGlmIChmaWxlQWNjZXNzTG9jayAhPSBudWxsKQorICAgICAgICAgICAgZmlsZUFjY2Vzc0xvY2sucmVhZExvY2soKS5sb2NrKCk7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW4uZ2V0RmlsZVBvaW50ZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBpdC5pc0V4aGF1c3RlZCgpID8gdG90YWxCeXRlcyA6IGl0LmRhdGFQb3NpdGlvbigpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkKICAgICAgICAgewotICAgICAgICAgICAgZmlsZUFjY2Vzc0xvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgICAgIGlmIChmaWxlQWNjZXNzTG9jayAhPSBudWxsKQorICAgICAgICAgICAgICAgIGZpbGVBY2Nlc3NMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbEJ5dGVzKCkKICAgICB7Ci0gICAgICAgIC8vIGxlbmd0aCBpcyBmaW5hbCBpbiB0aGUgcmVmZXJlbmNlZCBvYmplY3QuCi0gICAgICAgIC8vIG5vIG5lZWQgdG8gYWNxdWlyZSB0aGUgbG9jawotICAgICAgICByZXR1cm4gaW4ubGVuZ3RoKCk7CisgICAgICAgIHJldHVybiB0b3RhbEJ5dGVzOwogICAgIH0KIAotICAgIHB1YmxpYyBsb25nIGdldEtleVBvc2l0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBrZXlQb3NpdGlvbjsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0tleVJlYWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9LZXlSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGVlMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9LZXlSZWFkZXIuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisvKioKKyAqIFJlYWRzIGtleXMgZnJvbSBhbiBTU1RhYmxlLgorICogPHAvPgorICogSXQgaXMgc3BlY2lmaWMgdG8gU1NUYWJsZSBmb3JtYXQgaG93IHRoZSBrZXlzIGFyZSByZWFkIGJ1dCBpbiBnZW5lcmFsIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgaXQgd2lsbCByZWFkIGFsbCB0aGUKKyAqIGtleXMgaW4gdGhlIG9yZGVyIGFzIHRoZXkgYXJlIHBsYWNlZCBpbiBkYXRhIGZpbGUuCisgKiA8cC8+CisgKiBBZnRlciBjcmVhdGluZyBpdCwgaXQgc2hvdWxkIGJlIGF0IHRoZSBmaXJzdCBrZXkuIFVubGVzcyB0aGUgU1NUYWJsZSBpcyBlbXB0eSwge0BsaW5rICNrZXkoKX0sCisgKiB7QGxpbmsgI2tleVBvc2l0aW9uRm9yU2Vjb25kYXJ5SW5kZXgoKX0gYW5kIHtAbGluayAjZGF0YVBvc2l0aW9uKCl9IHNob3VsZCByZXR1cm4gYXBwcm9yaWF0ZSB2YWx1ZXMuIElmIHRoZXJlIGlzCisgKiBubyBkYXRhLCB7QGxpbmsgI2lzRXhoYXVzdGVkKCl9IHJldHVybnMge0Bjb2RlIHRydWV9LiBJbiBvcmRlciB0byBtb3ZlIHRvIHRoZSBuZXh0IGtleSwge0BsaW5rICNhZHZhbmNlKCl9IHNob3VsZCBiZQorICogY2FsbGVkLiBJdCByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgcmVhZGVyIG1vdmVkIHRvIHRoZSBuZXh0IGtleTsgb3RoZXJ3aXNlLCB0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8gcmVhZCBhbmQKKyAqIHRoZSByZWFkZXIgaXMgZXhoYXVzdGVkLiBXaGVuIHRoZSByZWFkZXIgaXMgZXhoYXVzdGVkLCByZXR1cm4gdmFsdWVzIG9mIHtAbGluayAja2V5KCl9LAorICoge0BsaW5rICNrZXlQb3NpdGlvbkZvclNlY29uZGFyeUluZGV4KCl9IGFuZCB7QGxpbmsgI2RhdGFQb3NpdGlvbigpfSBhcmUgdW5kZWZpbmVkLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEtleVJlYWRlciBleHRlbmRzIENsb3NlYWJsZQoreworICAgIC8qKgorICAgICAqIEN1cnJlbnQga2V5CisgICAgICovCisgICAgQnl0ZUJ1ZmZlciBrZXkoKTsKKworICAgIC8qKgorICAgICAqIFBvc2l0aW9uIGluIHRoZSBjb21wb25lbnQgcHJlZmVycmVkIGZvciByZWFkaW5nIGtleXMuIFRoaXMgaXMgc3BlY2lmaWMgdG8gU1NUYWJsZSBpbXBsZW1lbnRhdGlvbgorICAgICAqLworICAgIGxvbmcga2V5UG9zaXRpb25Gb3JTZWNvbmRhcnlJbmRleCgpOworCisgICAgLyoqCisgICAgICogUG9zaXRpb24gaW4gdGhlIGRhdGEgZmlsZSB3aGVyZSB0aGUgYXNzb2NpYXRlZCBjb250ZW50IHJlc2lkZXMKKyAgICAgKi8KKyAgICBsb25nIGRhdGFQb3NpdGlvbigpOworCisgICAgLyoqCisgICAgICogTW92ZXMgdGhlIGl0ZXJhdG9yIGZvcndhcmQuIFJldHVybnMgZmFsc2UgaWYgd2UgcmVhY2ggRU9GIGFuZCB0aGVyZSBub3RoaW5nIG1vcmUgdG8gcmVhZAorICAgICAqLworICAgIGJvb2xlYW4gYWR2YW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB3ZSByZWFjaCBFT0YKKyAgICAgKi8KKyAgICBib29sZWFuIGlzRXhoYXVzdGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIGl0ZXJhdG9yIHRvIHRoZSBpbml0aWFsIHBvc2l0aW9uCisgICAgICovCisgICAgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgaXRlcmF0b3IgcXVpZXRseQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHZvaWQgY2xvc2UoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL01ldHJpY3NQcm92aWRlcnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvTWV0cmljc1Byb3ZpZGVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNTJiNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL01ldHJpY3NQcm92aWRlcnMuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CisKK3B1YmxpYyBpbnRlcmZhY2UgTWV0cmljc1Byb3ZpZGVycworeworICAgIEl0ZXJhYmxlPEdhdWdlUHJvdmlkZXI8Pz4+IGdldEdhdWdlUHJvdmlkZXJzKCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1JhbmdlQXdhcmVTU1RhYmxlV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1JhbmdlQXdhcmVTU1RhYmxlV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNhZWYwYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXIuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXNrQm91bmRhcmllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVOZXdUcmFja2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKKworcHVibGljIGNsYXNzIFJhbmdlQXdhcmVTU1RhYmxlV3JpdGVyIGltcGxlbWVudHMgU1NUYWJsZU11bHRpV3JpdGVyCit7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBhcnRpdGlvblBvc2l0aW9uPiBib3VuZGFyaWVzOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5PiBkaXJlY3RvcmllczsKKyAgICBwcml2YXRlIGZpbmFsIGludCBzc3RhYmxlTGV2ZWw7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGVzdGltYXRlZEtleXM7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHJlcGFpcmVkQXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1RyYW5zaWVudDsKKyAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0OworICAgIHByaXZhdGUgZmluYWwgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXI7CisgICAgcHJpdmF0ZSBpbnQgY3VycmVudEluZGV4ID0gLTE7CisgICAgcHVibGljIGZpbmFsIENvbHVtbkZhbWlseVN0b3JlIGNmczsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8U1NUYWJsZU11bHRpV3JpdGVyPiBmaW5pc2hlZFdyaXRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8U1NUYWJsZVJlYWRlcj4gZmluaXNoZWRSZWFkZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBTU1RhYmxlTXVsdGlXcml0ZXIgY3VycmVudFdyaXRlciA9IG51bGw7CisKKyAgICBwdWJsaWMgUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBsb25nIGVzdGltYXRlZEtleXMsIGxvbmcgcmVwYWlyZWRBdCwgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwgYm9vbGVhbiBpc1RyYW5zaWVudCwgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQsIGludCBzc3RhYmxlTGV2ZWwsIGxvbmcgdG90YWxTaXplLCBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIsIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIERpc2tCb3VuZGFyaWVzIGRiID0gY2ZzLmdldERpc2tCb3VuZGFyaWVzKCk7CisgICAgICAgIGRpcmVjdG9yaWVzID0gZGIuZGlyZWN0b3JpZXM7CisgICAgICAgIHRoaXMuc3N0YWJsZUxldmVsID0gc3N0YWJsZUxldmVsOworICAgICAgICB0aGlzLmNmcyA9IGNmczsKKyAgICAgICAgdGhpcy5lc3RpbWF0ZWRLZXlzID0gZXN0aW1hdGVkS2V5cyAvIGRpcmVjdG9yaWVzLnNpemUoKTsKKyAgICAgICAgdGhpcy5yZXBhaXJlZEF0ID0gcmVwYWlyZWRBdDsKKyAgICAgICAgdGhpcy5wZW5kaW5nUmVwYWlyID0gcGVuZGluZ1JlcGFpcjsKKyAgICAgICAgdGhpcy5pc1RyYW5zaWVudCA9IGlzVHJhbnNpZW50OworICAgICAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgdGhpcy5saWZlY3ljbGVOZXdUcmFja2VyID0gbGlmZWN5Y2xlTmV3VHJhY2tlcjsKKyAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CisgICAgICAgIGJvdW5kYXJpZXMgPSBkYi5wb3NpdGlvbnM7CisgICAgICAgIGlmIChib3VuZGFyaWVzID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkgbG9jYWxEaXIgPSBjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRXcml0ZWFibGVMb2NhdGlvbih0b3RhbFNpemUpOworICAgICAgICAgICAgaWYgKGxvY2FsRGlyID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkluc3VmZmljaWVudCBkaXNrIHNwYWNlIHRvIHN0b3JlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeSh0b3RhbFNpemUpKSk7CisgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKGxvY2FsRGlyKSwgZm9ybWF0KTsKKyAgICAgICAgICAgIGN1cnJlbnRXcml0ZXIgPSBjZnMuY3JlYXRlU1NUYWJsZU11bHRpV3JpdGVyKGRlc2MsIGVzdGltYXRlZEtleXMsIHJlcGFpcmVkQXQsIHBlbmRpbmdSZXBhaXIsIGlzVHJhbnNpZW50LCBzc3RhYmxlTGV2ZWwsIGhlYWRlciwgbGlmZWN5Y2xlTmV3VHJhY2tlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVTd2l0Y2hXcml0ZXIoRGVjb3JhdGVkS2V5IGtleSkKKyAgICB7CisgICAgICAgIGlmIChib3VuZGFyaWVzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgYm9vbGVhbiBzd2l0Y2hlZCA9IGZhbHNlOworICAgICAgICB3aGlsZSAoY3VycmVudEluZGV4IDwgMCB8fCBrZXkuY29tcGFyZVRvKGJvdW5kYXJpZXMuZ2V0KGN1cnJlbnRJbmRleCkpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoZWQgPSB0cnVlOworICAgICAgICAgICAgY3VycmVudEluZGV4Kys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3dpdGNoZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50V3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmluaXNoZWRXcml0ZXJzLmFkZChjdXJyZW50V3JpdGVyKTsKKworICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGNmcy5nZXREaXJlY3RvcmllcygpLmdldExvY2F0aW9uRm9yRGlzayhkaXJlY3Rvcmllcy5nZXQoY3VycmVudEluZGV4KSksIGZvcm1hdCk7CisgICAgICAgICAgICBjdXJyZW50V3JpdGVyID0gY2ZzLmNyZWF0ZVNTVGFibGVNdWx0aVdyaXRlcihkZXNjLCBlc3RpbWF0ZWRLZXlzLCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpc1RyYW5zaWVudCwgc3N0YWJsZUxldmVsLCBoZWFkZXIsIGxpZmVjeWNsZU5ld1RyYWNrZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gYXBwZW5kKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pCisgICAgeworICAgICAgICBtYXliZVN3aXRjaFdyaXRlcihwYXJ0aXRpb24ucGFydGl0aW9uS2V5KCkpOworICAgICAgICByZXR1cm4gY3VycmVudFdyaXRlci5hcHBlbmQocGFydGl0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBmaW5pc2gobG9uZyByZXBhaXJlZEF0LCBsb25nIG1heERhdGFBZ2UsIGJvb2xlYW4gb3BlblJlc3VsdCkKKyAgICB7CisgICAgICAgIGlmIChjdXJyZW50V3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICBmaW5pc2hlZFdyaXRlcnMuYWRkKGN1cnJlbnRXcml0ZXIpOworICAgICAgICBjdXJyZW50V3JpdGVyID0gbnVsbDsKKyAgICAgICAgZm9yIChTU1RhYmxlTXVsdGlXcml0ZXIgd3JpdGVyIDogZmluaXNoZWRXcml0ZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAod3JpdGVyLmdldEZpbGVQb2ludGVyKCkgPiAwKQorICAgICAgICAgICAgICAgIGZpbmlzaGVkUmVhZGVycy5hZGRBbGwod3JpdGVyLmZpbmlzaChyZXBhaXJlZEF0LCBtYXhEYXRhQWdlLCBvcGVuUmVzdWx0KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgU1NUYWJsZU11bHRpV3JpdGVyLmFib3J0T3JEaWUod3JpdGVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmluaXNoZWRSZWFkZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IGZpbmlzaChib29sZWFuIG9wZW5SZXN1bHQpCisgICAgeworICAgICAgICBpZiAoY3VycmVudFdyaXRlciAhPSBudWxsKQorICAgICAgICAgICAgZmluaXNoZWRXcml0ZXJzLmFkZChjdXJyZW50V3JpdGVyKTsKKyAgICAgICAgY3VycmVudFdyaXRlciA9IG51bGw7CisgICAgICAgIGZvciAoU1NUYWJsZU11bHRpV3JpdGVyIHdyaXRlciA6IGZpbmlzaGVkV3JpdGVycykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHdyaXRlci5nZXRGaWxlUG9pbnRlcigpID4gMCkKKyAgICAgICAgICAgICAgICBmaW5pc2hlZFJlYWRlcnMuYWRkQWxsKHdyaXRlci5maW5pc2gob3BlblJlc3VsdCkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFNTVGFibGVNdWx0aVdyaXRlci5hYm9ydE9yRGllKHdyaXRlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbmlzaGVkUmVhZGVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBmaW5pc2hlZCgpCisgICAgeworICAgICAgICByZXR1cm4gZmluaXNoZWRSZWFkZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTU1RhYmxlTXVsdGlXcml0ZXIgc2V0T3BlblJlc3VsdChib29sZWFuIG9wZW5SZXN1bHQpCisgICAgeworICAgICAgICBmaW5pc2hlZFdyaXRlcnMuZm9yRWFjaCgodykgLT4gdy5zZXRPcGVuUmVzdWx0KG9wZW5SZXN1bHQpKTsKKyAgICAgICAgY3VycmVudFdyaXRlci5zZXRPcGVuUmVzdWx0KG9wZW5SZXN1bHQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVuYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmcuam9pbigiLyIsIGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5nZXRUYWJsZU5hbWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0RmlsZVBvaW50ZXIoKQorICAgIHsKKyAgICAgICByZXR1cm4gY3VycmVudFdyaXRlciAhPSBudWxsID8gY3VycmVudFdyaXRlci5nZXRGaWxlUG9pbnRlcigpIDogMEw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRhYmxlSWQgZ2V0VGFibGVJZCgpCisgICAgeworICAgICAgICByZXR1cm4gY2ZzLm1ldGFkYXRhLmlkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUaHJvd2FibGUgY29tbWl0KFRocm93YWJsZSBhY2N1bXVsYXRlKQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJlbnRXcml0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGZpbmlzaGVkV3JpdGVycy5hZGQoY3VycmVudFdyaXRlcik7CisgICAgICAgIGN1cnJlbnRXcml0ZXIgPSBudWxsOworICAgICAgICBmb3IgKFNTVGFibGVNdWx0aVdyaXRlciB3cml0ZXIgOiBmaW5pc2hlZFdyaXRlcnMpCisgICAgICAgICAgICBhY2N1bXVsYXRlID0gd3JpdGVyLmNvbW1pdChhY2N1bXVsYXRlKTsKKyAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRocm93YWJsZSBhYm9ydChUaHJvd2FibGUgYWNjdW11bGF0ZSkKKyAgICB7CisgICAgICAgIGlmIChjdXJyZW50V3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICBmaW5pc2hlZFdyaXRlcnMuYWRkKGN1cnJlbnRXcml0ZXIpOworICAgICAgICBjdXJyZW50V3JpdGVyID0gbnVsbDsKKyAgICAgICAgZm9yIChTU1RhYmxlTXVsdGlXcml0ZXIgZmluaXNoZWRXcml0ZXIgOiBmaW5pc2hlZFdyaXRlcnMpCisgICAgICAgICAgICBhY2N1bXVsYXRlID0gZmluaXNoZWRXcml0ZXIuYWJvcnQoYWNjdW11bGF0ZSk7CisKKyAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlcGFyZVRvQ29tbWl0KCkKKyAgICB7CisgICAgICAgIGlmIChjdXJyZW50V3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICBmaW5pc2hlZFdyaXRlcnMuYWRkKGN1cnJlbnRXcml0ZXIpOworICAgICAgICBjdXJyZW50V3JpdGVyID0gbnVsbDsKKyAgICAgICAgZmluaXNoZWRXcml0ZXJzLmZvckVhY2goU1NUYWJsZU11bHRpV3JpdGVyOjpwcmVwYXJlVG9Db21taXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIGlmIChjdXJyZW50V3JpdGVyICE9IG51bGwpCisgICAgICAgICAgICBmaW5pc2hlZFdyaXRlcnMuYWRkKGN1cnJlbnRXcml0ZXIpOworICAgICAgICBjdXJyZW50V3JpdGVyID0gbnVsbDsKKyAgICAgICAgZmluaXNoZWRXcml0ZXJzLmZvckVhY2goU1NUYWJsZU11bHRpV3JpdGVyOjpjbG9zZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9SZWR1Y2luZ0tleUl0ZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1JlZHVjaW5nS2V5SXRlcmF0b3IuamF2YQppbmRleCA4MjZiOTFkLi4xY2Q3ODBlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1JlZHVjaW5nS2V5SXRlcmF0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1JlZHVjaW5nS2V5SXRlcmF0b3IuamF2YQpAQCAtMTcsMTUgKzE3LDE4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9zZWFibGVJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5JTWVyZ2VJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NZXJnZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CiAKIC8qKgogICogQ2FsbGVyIG11c3QgYWNxdWlyZSBhbmQgcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSBzc3RhYmxlcyB1c2VkIGhlcmUuCkBAIC0zOSw3ICs0MiwxNyBAQAogICAgIHsKICAgICAgICAgaXRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oc3N0YWJsZXMuc2l6ZSgpKTsKICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIGl0ZXJzLmFkZChuZXcgS2V5SXRlcmF0b3Ioc3N0YWJsZS5kZXNjcmlwdG9yLCBzc3RhYmxlLm1ldGFkYXRhKCkpKTsKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXRlcnMuYWRkKHNzdGFibGUua2V5SXRlcmF0b3IoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXRlcnMuZm9yRWFjaChGaWxlVXRpbHM6OmNsb3NlUXVpZXRseSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWxlZCB0byBjcmVhdGUgYSBrZXkgaXRlcmF0b3IgZm9yIHNzdGFibGUgIiArIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgbWF5YmVJbml0KCkKQEAgLTc4LDcgKzkxLDE3IEBACiAgICAgcHVibGljIHZvaWQgY2xvc2UoKQogICAgIHsKICAgICAgICAgaWYgKG1pICE9IG51bGwpCisgICAgICAgIHsKICAgICAgICAgICAgIG1pLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZiBtZXJnaW5nIGl0ZXJhdG9yIHdhcyBub3QgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoaXMgcmVkdWNpbmcgaXRlcmF0b3IgaXMgY2xvc2VkLCB3ZSBuZWVkIHRvIGNsb3NlIHRoZQorICAgICAgICAgICAgLy8gdW5kZXJseWluZyBpdGVyYXRvcnMgbWFudWFsbHkKKyAgICAgICAgICAgIFRocm93YWJsZSBlcnIgPSBUaHJvd2FibGVzLmNsb3NlKG51bGwsIGl0ZXJzKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnVuY2hlY2tlZChlcnIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIGxvbmcgZ2V0VG90YWxCeXRlcygpCkBAIC0xMjEsNCArMTQ0LDQgQEAKICAgICB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZS5qYXZhCmluZGV4IDgxMDMwYzIuLjUxNTZhZGMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZS5qYXZhCkBAIC0xNywxNiArMTcsMTUgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOwogCi0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXJyb3I7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5Ob1N1Y2hGaWxlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheVNldDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOwpAQCAtMzQsNDMgKzMzLDM1IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5Db2xsZWN0aW9uczI7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQnVmZmVyRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkNodW5rQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93SW5kZXhFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGlza09wdGltaXphdGlvblN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZU91dHB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVE9DQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlRhYmxlTWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5IZWFwQ2xvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuT3BPcmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlNoYXJlZENsb3NlYWJsZTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGUuV3JpdGVNb2RlLkFQUEVORDsKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlLk5PX1BFTkRJTkdfUkVQQUlSOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2UuVU5SRVBBSVJFRF9TU1RBQkxFOwogCiAvKioKLSAqIFRoaXMgY2xhc3MgaXMgYnVpbHQgb24gdG9wIG9mIHRoZSBTZXF1ZW5jZUZpbGUuIEl0IHN0b3JlcwotICogZGF0YSBvbiBkaXNrIGluIHNvcnRlZCBmYXNoaW9uLiBIb3dldmVyIHRoZSBzb3J0aW5nIGlzIHVwdG8KLSAqIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBjbGFzcyBleHBlY3RzIGtleXMgdG8gYmUgaGFuZGVkIHRvIGl0Ci0gKiBpbiBzb3J0ZWQgb3JkZXIuCi0gKgotICogQSBzZXBhcmF0ZSBpbmRleCBmaWxlIGlzIG1haW50YWluZWQgYXMgd2VsbCwgY29udGFpbmluZyB0aGUKLSAqIFNTVGFibGUga2V5cyBhbmQgdGhlIG9mZnNldCBpbnRvIHRoZSBTU1RhYmxlIGF0IHdoaWNoIHRoZXkgYXJlIGZvdW5kLgotICogRXZlcnkgMS9pbmRleEludGVydmFsIGtleSBpcyByZWFkIGludG8gbWVtb3J5IHdoZW4gdGhlIFNTVGFibGUgaXMgb3BlbmVkLgotICoKLSAqIEZpbmFsbHksIGEgYmxvb20gZmlsdGVyIGZpbGUgaXMgYWxzbyBrZXB0IGZvciB0aGUga2V5cyBpbiBlYWNoIFNTVGFibGUuCisgKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gYWJzdHJhY3Qgc3N0YWJsZSBvbiBkaXNrIHdob3NlIGtleXMgYW5kIGNvcnJlc3BvbmRpbmcgcGFydGl0aW9ucyBhcmUgc3RvcmVkIGluCisgKiBhIHtAbGluayBTU1RhYmxlRm9ybWF0LkNvbXBvbmVudHMjREFUQX0gZmlsZSBpbiBvcmRlciBhcyBpbXBvc2VkIGJ5IHtAbGluayBEZWNvcmF0ZWRLZXkjY29tcGFyYXRvcn0uCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTU1RhYmxlCiB7CkBAIC03OCw3MCArNjksMTAxIEBACiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT01CU1RPTkVfSElTVE9HUkFNX0JJTl9TSVpFID0gMTAwOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRPTUJTVE9ORV9ISVNUT0dSQU1fU1BPT0xfU0laRSA9IDEwMDAwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT01CU1RPTkVfSElTVE9HUkFNX1RUTF9ST1VORF9TRUNPTkRTID0gSW50ZWdlci52YWx1ZU9mKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN0cmVhbWluZ2hpc3RvZ3JhbS5yb3VuZHNlY29uZHMiLCAiNjAiKSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9NQlNUT05FX0hJU1RPR1JBTV9UVExfUk9VTkRfU0VDT05EUyA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVFJFQU1JTkdfSElTVE9HUkFNX1JPVU5EX1NFQ09ORFMuZ2V0SW50KCk7CiAKICAgICBwdWJsaWMgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yOwogICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzOwogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGNvbXByZXNzaW9uOwogCi0gICAgcHVibGljIERlY29yYXRlZEtleSBmaXJzdDsKLSAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IGxhc3Q7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgRGlza09wdGltaXphdGlvblN0cmF0ZWd5IG9wdGltaXphdGlvblN0cmF0ZWd5OwogICAgIHByb3RlY3RlZCBmaW5hbCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhOwogCi0gICAgcHJvdGVjdGVkIFNTVGFibGUoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzLCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhLCBEaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3kgb3B0aW1pemF0aW9uU3RyYXRlZ3kpCi0gICAgewotICAgICAgICAvLyBJbiBhbG1vc3QgYWxsIGNhc2VzLCBtZXRhZGF0YSBzaG91bGRuJ3QgYmUgbnVsbCwgYnV0IGFsbG93aW5nIG51bGwgYWxsb3dzIHRvIGNyZWF0ZSBhIG1vc3RseSBmdW5jdGlvbmFsIFNTVGFibGUgd2l0aG91dAotICAgICAgICAvLyBmdWxsIHNjaGVtYSBkZWZpbml0aW9uLiBTU1RhYmxlTG9hZGVyIHVzZSB0aGF0IGFiaWxpdHkKLSAgICAgICAgYXNzZXJ0IGRlc2NyaXB0b3IgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0IGNvbXBvbmVudHMgIT0gbnVsbDsKKyAgICBwdWJsaWMgZmluYWwgQ2h1bmtDYWNoZSBjaHVua0NhY2hlOworICAgIHB1YmxpYyBmaW5hbCBJT09wdGlvbnMgaW9PcHRpb25zOwogCi0gICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgIFNldDxDb21wb25lbnQ+IGRhdGFDb21wb25lbnRzID0gbmV3IEhhc2hTZXQ8Pihjb21wb25lbnRzKTsKLSAgICAgICAgdGhpcy5jb21wcmVzc2lvbiA9IGRhdGFDb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5DT01QUkVTU0lPTl9JTkZPKTsKLSAgICAgICAgdGhpcy5jb21wb25lbnRzID0gbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8PihkYXRhQ29tcG9uZW50cyk7Ci0gICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgdGhpcy5vcHRpbWl6YXRpb25TdHJhdGVneSA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwob3B0aW1pemF0aW9uU3RyYXRlZ3kpOworICAgIEBOdWxsYWJsZQorICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxPd25lcj4gb3duZXI7CisKKyAgICBwdWJsaWMgU1NUYWJsZShCdWlsZGVyPD8sID8+IGJ1aWxkZXIsIE93bmVyIG93bmVyKQorICAgIHsKKyAgICAgICAgdGhpcy5vd25lciA9IG5ldyBXZWFrUmVmZXJlbmNlPD4ob3duZXIpOworICAgICAgICBjaGVja05vdE51bGwoYnVpbGRlci5kZXNjcmlwdG9yKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGJ1aWxkZXIuZ2V0Q29tcG9uZW50cygpKTsKKworICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBidWlsZGVyLmRlc2NyaXB0b3I7CisgICAgICAgIHRoaXMuaW9PcHRpb25zID0gYnVpbGRlci5nZXRJT09wdGlvbnMoKTsKKyAgICAgICAgdGhpcy5jb21wb25lbnRzID0gbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8PihidWlsZGVyLmdldENvbXBvbmVudHMoKSk7CisgICAgICAgIHRoaXMuY29tcHJlc3Npb24gPSBjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudHMuQ09NUFJFU1NJT05fSU5GTyk7CisgICAgICAgIHRoaXMubWV0YWRhdGEgPSBidWlsZGVyLmdldFRhYmxlTWV0YWRhdGFSZWYoKTsKKyAgICAgICAgdGhpcy5jaHVua0NhY2hlID0gYnVpbGRlci5nZXRDaHVua0NhY2hlKCk7CiAgICAgfQogCisgICAgcHVibGljIGZpbmFsIE9wdGlvbmFsPE93bmVyPiBvd25lcigpCisgICAgeworICAgICAgICBpZiAob3duZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShvd25lci5nZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbmFtZShEZXNjcmlwdG9yIHRtcGRlc2MsIERlc2NyaXB0b3IgbmV3ZGVzYywgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cykKKyAgICB7CisgICAgICAgIGNvbXBvbmVudHMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgIC5maWx0ZXIoYyAtPiAhbmV3ZGVzYy5nZXRGb3JtYXQoKS5nZW5lcmF0ZWRPbkxvYWRDb21wb25lbnRzKCkuY29udGFpbnMoYykpCisgICAgICAgICAgICAgICAgICAuZmlsdGVyKGMgLT4gIWMuZXF1YWxzKENvbXBvbmVudHMuREFUQSkpCisgICAgICAgICAgICAgICAgICAuZm9yRWFjaChjIC0+IHRtcGRlc2MuZmlsZUZvcihjKS5tb3ZlKG5ld2Rlc2MuZmlsZUZvcihjKSkpOworCisgICAgICAgIC8vIGRvIC1EYXRhIGxhc3QgYmVjYXVzZSAtRGF0YSBwcmVzZW50IHNob3VsZCBtZWFuIHRoZSBzc3RhYmxlIHdhcyBjb21wbGV0ZWx5IHJlbmFtZWQgYmVmb3JlIGNyYXNoCisgICAgICAgIHRtcGRlc2MuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLm1vdmUobmV3ZGVzYy5maWxlRm9yKENvbXBvbmVudHMuREFUQSkpOworCisgICAgICAgIC8vIHJlbmFtZSBpdCB3aXRob3V0IGNvbmZpcm1hdGlvbiBiZWNhdXNlIHN1bW1hcnkgY2FuIGJlIGF2YWlsYWJsZSBmb3IgbG9hZE5ld1NTVGFibGVzIGJ1dCBub3QgZm9yIGNsb3NlQW5kT3BlblJlYWRlcgorICAgICAgICBjb21wb25lbnRzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAuZmlsdGVyKGMgLT4gbmV3ZGVzYy5nZXRGb3JtYXQoKS5nZW5lcmF0ZWRPbkxvYWRDb21wb25lbnRzKCkuY29udGFpbnMoYykpCisgICAgICAgICAgICAgICAgICAuZm9yRWFjaChjIC0+IHRtcGRlc2MuZmlsZUZvcihjKS50cnlNb3ZlKG5ld2Rlc2MuZmlsZUZvcihjKSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KERlc2NyaXB0b3IgdG1wZGVzYywgRGVzY3JpcHRvciBuZXdkZXNjLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzKQorICAgIHsKKyAgICAgICAgY29tcG9uZW50cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgLmZpbHRlcihjIC0+ICFuZXdkZXNjLmdldEZvcm1hdCgpLmdlbmVyYXRlZE9uTG9hZENvbXBvbmVudHMoKS5jb250YWlucyhjKSkKKyAgICAgICAgICAgICAgICAgIC5maWx0ZXIoYyAtPiAhYy5lcXVhbHMoQ29tcG9uZW50cy5EQVRBKSkKKyAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGMgLT4gRmlsZVV0aWxzLmNvcHlXaXRoQ29uZmlybSh0bXBkZXNjLmZpbGVGb3IoYyksIG5ld2Rlc2MuZmlsZUZvcihjKSkpOworCisgICAgICAgIC8vIGRvIC1EYXRhIGxhc3QgYmVjYXVzZSAtRGF0YSBwcmVzZW50IHNob3VsZCBtZWFuIHRoZSBzc3RhYmxlIHdhcyBjb21wbGV0ZWx5IGNvcGllZCBiZWZvcmUgY3Jhc2gKKyAgICAgICAgRmlsZVV0aWxzLmNvcHlXaXRoQ29uZmlybSh0bXBkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSwgbmV3ZGVzYy5maWxlRm9yKENvbXBvbmVudHMuREFUQSkpOworCisgICAgICAgIC8vIGNvcHkgaXQgd2l0aG91dCBjb25maXJtYXRpb24gYmVjYXVzZSBzdW1tYXJ5IGNhbiBiZSBhdmFpbGFibGUgZm9yIGxvYWROZXdTU1RhYmxlcyBidXQgbm90IGZvciBjbG9zZUFuZE9wZW5SZWFkZXIKKyAgICAgICAgY29tcG9uZW50cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgLmZpbHRlcihjIC0+IG5ld2Rlc2MuZ2V0Rm9ybWF0KCkuZ2VuZXJhdGVkT25Mb2FkQ29tcG9uZW50cygpLmNvbnRhaW5zKGMpKQorICAgICAgICAgICAgICAgICAgLmZvckVhY2goYyAtPiBGaWxlVXRpbHMuY29weVdpdGhPdXRDb25maXJtKHRtcGRlc2MuZmlsZUZvcihjKSwgbmV3ZGVzYy5maWxlRm9yKGMpKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGhhcmRsaW5rKERlc2NyaXB0b3IgdG1wZGVzYywgRGVzY3JpcHRvciBuZXdkZXNjLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzKQorICAgIHsKKyAgICAgICAgY29tcG9uZW50cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgLmZpbHRlcihjIC0+ICFuZXdkZXNjLmdldEZvcm1hdCgpLmdlbmVyYXRlZE9uTG9hZENvbXBvbmVudHMoKS5jb250YWlucyhjKSkKKyAgICAgICAgICAgICAgICAgIC5maWx0ZXIoYyAtPiAhYy5lcXVhbHMoQ29tcG9uZW50cy5EQVRBKSkKKyAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGMgLT4gRmlsZVV0aWxzLmNyZWF0ZUhhcmRMaW5rV2l0aENvbmZpcm0odG1wZGVzYy5maWxlRm9yKGMpLCBuZXdkZXNjLmZpbGVGb3IoYykpKTsKKworICAgICAgICAvLyBkbyAtRGF0YSBsYXN0IGJlY2F1c2UgLURhdGEgcHJlc2VudCBzaG91bGQgbWVhbiB0aGUgc3N0YWJsZSB3YXMgY29tcGxldGVseSBjb3BpZWQgYmVmb3JlIGNyYXNoCisgICAgICAgIEZpbGVVdGlscy5jcmVhdGVIYXJkTGlua1dpdGhDb25maXJtKHRtcGRlc2MuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLCBuZXdkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSk7CisKKyAgICAgICAgLy8gY29weSBpdCB3aXRob3V0IGNvbmZpcm1hdGlvbiBiZWNhdXNlIHN1bW1hcnkgY2FuIGJlIGF2YWlsYWJsZSBmb3IgbG9hZE5ld1NTVGFibGVzIGJ1dCBub3QgZm9yIGNsb3NlQW5kT3BlblJlYWRlcgorICAgICAgICBjb21wb25lbnRzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAuZmlsdGVyKGMgLT4gbmV3ZGVzYy5nZXRGb3JtYXQoKS5nZW5lcmF0ZWRPbkxvYWRDb21wb25lbnRzKCkuY29udGFpbnMoYykpCisgICAgICAgICAgICAgICAgICAuZm9yRWFjaChjIC0+IEZpbGVVdGlscy5jcmVhdGVIYXJkTGlua1dpdGhvdXRDb25maXJtKHRtcGRlc2MuZmlsZUZvcihjKSwgbmV3ZGVzYy5maWxlRm9yKGMpKSk7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IERlY29yYXRlZEtleSBnZXRGaXJzdCgpOworCisgICAgcHVibGljIGFic3RyYWN0IERlY29yYXRlZEtleSBnZXRMYXN0KCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgQWJzdHJhY3RCb3VuZHM8VG9rZW4+IGdldEJvdW5kcygpOworCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCiAgICAgcHVibGljIFNldDxDb21wb25lbnQ+IGdldENvbXBvbmVudHMoKQogICAgIHsKICAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YoY29tcG9uZW50cyk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogV2UgdXNlIGEgUmVmZXJlbmNlUXVldWUgdG8gbWFuYWdlIGRlbGV0aW5nIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbXBhY3RlZAotICAgICAqIGFuZCBmb3Igd2hpY2ggbm8gbW9yZSBTU1RhYmxlIHJlZmVyZW5jZXMgZXhpc3QuICBCdXQgdGhpcyBpcyBub3QgZ3VhcmFudGVlZAotICAgICAqIHRvIHJ1biBmb3IgZWFjaCBzdWNoIGZpbGUgYmVjYXVzZSBvZiB0aGUgc2VtYW50aWNzIG9mIHRoZSBKVk0gZ2MuICBTbywKLSAgICAgKiB3ZSB3cml0ZSBhIG1hcmtlciB0byBgY29tcGFjdGVkRmlsZW5hbWVgIHdoZW4gYSBmaWxlIGlzIGNvbXBhY3RlZDsKLSAgICAgKiBpZiBzdWNoIGEgbWFya2VyIGV4aXN0cyBvbiBzdGFydHVwLCB0aGUgZmlsZSBzaG91bGQgYmUgcmVtb3ZlZC4KLSAgICAgKgotICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyByZW1vdmUgU1NUYWJsZXMgdGhhdCBhcmUgbWFya2VkIGFzIHRlbXBvcmFyeS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgZGVsZXRlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkZWxldGUoRGVzY3JpcHRvciBkZXNjLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzKQotICAgIHsKLSAgICAgICAgbG9nZ2VyLmluZm8oIkRlbGV0aW5nIHNzdGFibGU6IHt9IiwgZGVzYyk7Ci0gICAgICAgIC8vIHJlbW92ZSB0aGUgREFUQSBjb21wb25lbnQgZmlyc3QgaWYgaXQgZXhpc3RzCi0gICAgICAgIGlmIChjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5EQVRBKSkKLSAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGVXaXRoQ29uZmlybShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7Ci0gICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnQuZXF1YWxzKENvbXBvbmVudC5EQVRBKSB8fCBjb21wb25lbnQuZXF1YWxzKENvbXBvbmVudC5TVU1NQVJZKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVdpdGhDb25maXJtKGRlc2MuZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuU1VNTUFSWSkpCi0gICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlKGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNVTU1BUlkpKTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KICAgICBwdWJsaWMgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSgpCiAgICAgewogICAgICAgICByZXR1cm4gbWV0YWRhdGEuZ2V0KCk7CkBAIC0xNTcsMjUgKzE3OSw5IEBACiAgICAgICAgIHJldHVybiBnZXRQYXJ0aXRpb25lcigpLmRlY29yYXRlS2V5KGtleSk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGdpdmVuIEBwYXJhbSBrZXkgb2NjdXBpZXMgb25seSBwYXJ0IG9mIGEgbGFyZ2VyIGJ1ZmZlciwgYWxsb2NhdGUgYSBuZXcgYnVmZmVyIHRoYXQgaXMgb25seQotICAgICAqIGFzIGxhcmdlIGFzIG5lY2Vzc2FyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIERlY29yYXRlZEtleSBnZXRNaW5pbWFsS2V5KERlY29yYXRlZEtleSBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5LmdldEtleSgpLnBvc2l0aW9uKCkgPiAwIHx8IGtleS5nZXRLZXkoKS5oYXNSZW1haW5pbmcoKSB8fCAha2V5LmdldEtleSgpLmhhc0FycmF5KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IEJ1ZmZlckRlY29yYXRlZEtleShrZXkuZ2V0VG9rZW4oKSwgSGVhcENsb25lci5pbnN0YW5jZS5jbG9uZShrZXkuZ2V0S2V5KCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrZXk7Ci0gICAgfQotCiAgICAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpCiAgICAgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRJbmRleEZpbGVuYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKTsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLmFic29sdXRlUGF0aCgpOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uRmFtaWx5TmFtZSgpCkBAIC0xOTIsMTEgKzE5OCwzMiBAQAogICAgIHsKICAgICAgICAgTGlzdDxTdHJpbmc+IHJldCA9IG5ldyBBcnJheUxpc3Q8Pihjb21wb25lbnRzLnNpemUoKSk7CiAgICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMpCi0gICAgICAgICAgICByZXQuYWRkKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7CisgICAgICAgICAgICByZXQuYWRkKGRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpLmFic29sdXRlUGF0aCgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGUgbWV0aG9kIHNldHMgZmllbGRzIGZvciB0aGlzIHNzdGFibGUgcmVwcmVzZW50YXRpb24gb24gdGhlIHByb3ZpZGVkIHtAbGluayBCdWlsZGVyfS4gVGhlIG1ldGhvZCBpcyBpbnRlbmRlZAorICAgICAqIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSBvdmVybG9hZGVkIHtAY29kZSB1bmJ1aWxkVG99IG1ldGhvZCBpbiBzdWJjbGFzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1aWxkZXIgICAgdGhlIGJ1aWxkZXIgb24gd2hpY2ggdGhlIGZpZWxkcyBzaG91bGQgYmUgc2V0CisgICAgICogQHBhcmFtIHNoYXJlZENvcHkgd2hldGhlciB0aGUge0BsaW5rIFNoYXJlZENsb3NlYWJsZX0gcmVzb3VyY2VzIHNob3VsZCBiZSBwYXNzZWQgYXMgc2hhcmVkIGNvcGllcyBvciBkaXJlY3RseTsKKyAgICAgKiAgICAgICAgICAgICAgICAgICBub3RlIHRoYXQgdGhlIG1ldGhvZCB3aWxsIG92ZXJ3cml0ZSB0aGUgZmllbGRzIHJlcHJlc2VudGluZyB7QGxpbmsgU2hhcmVkQ2xvc2VhYmxlfSBvbmx5IGlmCisgICAgICogICAgICAgICAgICAgICAgICAgdGhleSBhcmUgbm90IHNldCBpbiB0aGUgYnVpbGRlciB5ZXQgKHRoZSByZWxldmFudCBmaWVsZHMgaW4gdGhlIGJ1aWxkZXIgYXJlIHtAY29kZSBudWxsfSkuCisgICAgICogICAgICAgICAgICAgICAgICAgQWx0aG91Z2gge0BsaW5rIFNTVGFibGV9IGRvZXMgbm90IGtlZXAgYW55IHJlZmVyZW5jZXMgdG8gcmVzb3VyY2VzLCB0aGUgcGFyYW1ldGVycyBpcyBhZGRlZAorICAgICAqICAgICAgICAgICAgICAgICAgIGZvciB0aGUgcG9zc2libGUgZnV0dXJlIGZpZWxkcyBhbmQgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIG92ZXJsb2FkZWQgaW1wbGVtZW50YXRpb25zIGluCisgICAgICogICAgICAgICAgICAgICAgICAgc3ViY2xhc3NlcworICAgICAqIEByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2Ugb2YgYnVpbGRlciBhcyBwcm92aWRlZAorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCA8QiBleHRlbmRzIEJ1aWxkZXI8PywgQj4+IEIgdW5idWlsZFRvKEIgYnVpbGRlciwgYm9vbGVhbiBzaGFyZWRDb3B5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuc2V0VGFibGVNZXRhZGF0YVJlZihtZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAuc2V0Q29tcG9uZW50cyhjb21wb25lbnRzKQorICAgICAgICAgICAgICAgICAgICAgIC5zZXRDaHVua0NhY2hlKGNodW5rQ2FjaGUpCisgICAgICAgICAgICAgICAgICAgICAgLnNldElPT3B0aW9ucyhpb09wdGlvbnMpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFBhcnNlIGEgc3N0YWJsZSBmaWxlbmFtZSBpbnRvIGJvdGggYSB7QGxpbmsgRGVzY3JpcHRvcn0gYW5kIHtAY29kZSBDb21wb25lbnR9IG9iamVjdC4KICAgICAgKgogICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlbmFtZSB0byBwYXJzZS4KQEAgLTIwOCw3ICsyMzUsMjkgQEAKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWVXaXRoQ29tcG9uZW50KGZpbGUpOworICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0b3IuZnJvbUZpbGVXaXRoQ29tcG9uZW50KGZpbGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIHNzdGFibGUgZmlsZW5hbWUgaW50byBib3RoIGEge0BsaW5rIERlc2NyaXB0b3J9IGFuZCB7QGNvZGUgQ29tcG9uZW50fSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZSAgICAgdGhlIGZpbGVuYW1lIHRvIHBhcnNlLgorICAgICAqIEBwYXJhbSBrZXlzcGFjZSBUaGUga2V5c3BhY2UgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgKiBAcGFyYW0gdGFibGUgICAgVGhlIHRhYmxlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICogQHJldHVybiBhIHBhaXIgb2YgdGhlIHtAY29kZSBEZXNjcmlwdG9yfSBhbmQge0Bjb2RlIENvbXBvbmVudH0gY29ycmVzcG9uZGluZyB0byB7QGNvZGUgZmlsZX0gaWYgaXQgY29ycmVzcG9uZHMgdG8KKyAgICAgKiBhIHZhbGlkIGFuZCBzdXBwb3J0ZWQgc3N0YWJsZSBmaWxlbmFtZSwge0Bjb2RlIG51bGx9IG90aGVyd2lzZS4gTm90ZSB0aGF0IGNvbXBvbmVudHMgb2YgYW4gdW5rbm93biB0eXBlIHdpbGwgYmUKKyAgICAgKiByZXR1cm5lZCBhcyBDVVNUT00gb25lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBhaXI8RGVzY3JpcHRvciwgQ29tcG9uZW50PiB0cnlDb21wb25lbnRGcm9tRmlsZW5hbWUoRmlsZSBmaWxlLCBTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRvci5mcm9tRmlsZVdpdGhDb21wb25lbnQoZmlsZSwga2V5c3BhY2UsIHRhYmxlKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCiAgICAgICAgIHsKQEAgLTIyNiwxMSArMjc1LDExIEBACiAgICAgICogQHJldHVybiB0aGUge0Bjb2RlIERlc2NyaXB0b3J9IGNvcnJlc3BvbmRpbmcgdG8ge0Bjb2RlIGZpbGV9IGlmIGl0IGNvcnJlc3BvbmRzIHRvIGEgdmFsaWQgYW5kIHN1cHBvcnRlZCBzc3RhYmxlCiAgICAgICogZmlsZW5hbWUsIHtAY29kZSBudWxsfSBvdGhlcndpc2UuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBEZXNjcmlwdG9yIHRyeURlc2NyaXB0b3JGcm9tRmlsZW5hbWUoRmlsZSBmaWxlKQorICAgIHB1YmxpYyBzdGF0aWMgRGVzY3JpcHRvciB0cnlEZXNjcmlwdG9yRnJvbUZpbGUoRmlsZSBmaWxlKQogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShmaWxlKTsKKyAgICAgICAgICAgIHJldHVybiBEZXNjcmlwdG9yLmZyb21GaWxlKGZpbGUpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKICAgICAgICAgewpAQCAtMjM4LDE1MCArMjg3LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBEaXNjb3ZlcnMgZXhpc3RpbmcgY29tcG9uZW50cyBmb3IgdGhlIGRlc2NyaXB0b3IuIFNsb3c6IG9ubHkgaW50ZW5kZWQgZm9yIHVzZSBvdXRzaWRlIHRoZSBjcml0aWNhbCBwYXRoLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU2V0PENvbXBvbmVudD4gY29tcG9uZW50c0ZvcihmaW5hbCBEZXNjcmlwdG9yIGRlc2MpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRUT0MoZGVzYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHwgTm9TdWNoRmlsZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBkaXNjb3ZlckNvbXBvbmVudHNGb3IoZGVzYyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50czsgLy8gc3N0YWJsZSBkb2Vzbid0IGV4aXN0IHlldAotCi0gICAgICAgICAgICAgICAgaWYgKCFjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5UT0MpKQotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnQuVE9DKTsKLSAgICAgICAgICAgICAgICBhcHBlbmRUT0MoZGVzYywgY29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0Vycm9yKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZXQ8Q29tcG9uZW50PiBkaXNjb3ZlckNvbXBvbmVudHNGb3IoRGVzY3JpcHRvciBkZXNjKQotICAgIHsKLSAgICAgICAgU2V0PENvbXBvbmVudC5UeXBlPiBrbm93blR5cGVzID0gU2V0cy5kaWZmZXJlbmNlKENvbXBvbmVudC5UWVBFUywgQ29sbGVjdGlvbnMuc2luZ2xldG9uKENvbXBvbmVudC5UeXBlLkNVU1RPTSkpOwotICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gU2V0cy5uZXdIYXNoU2V0V2l0aEV4cGVjdGVkU2l6ZShrbm93blR5cGVzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoQ29tcG9uZW50LlR5cGUgY29tcG9uZW50VHlwZSA6IGtub3duVHlwZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbXBvbmVudCBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KGNvbXBvbmVudFR5cGUpOwotICAgICAgICAgICAgaWYgKG5ldyBGaWxlKGRlc2MuZmlsZW5hbWVGb3IoY29tcG9uZW50KSkuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoY29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcG9uZW50czsKLSAgICB9Ci0KLSAgICAvKiogQHJldHVybiBBbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGtleXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBpbmRleCBmaWxlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBlc3RpbWF0ZVJvd3NGcm9tSW5kZXgoUmFuZG9tQWNjZXNzUmVhZGVyIGlmaWxlLCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gY29sbGVjdCBzaXplcyBmb3IgdGhlIGZpcnN0IDEwMDAwIGtleXMsIG9yIGZpcnN0IDEwIG1lYmlieXRlcyBvZiBkYXRhCi0gICAgICAgIGZpbmFsIGludCBTQU1QTEVTX0NBUCA9IDEwMDAwLCBCWVRFU19DQVAgPSAoaW50KU1hdGgubWluKDEwMDAwMDAwLCBpZmlsZS5sZW5ndGgoKSk7Ci0gICAgICAgIGludCBrZXlzID0gMDsKLSAgICAgICAgd2hpbGUgKGlmaWxlLmdldEZpbGVQb2ludGVyKCkgPCBCWVRFU19DQVAgJiYga2V5cyA8IFNBTVBMRVNfQ0FQKQotICAgICAgICB7Ci0gICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5za2lwU2hvcnRMZW5ndGgoaWZpbGUpOwotICAgICAgICAgICAgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyLnNraXAoaWZpbGUsIGRlc2NyaXB0b3IudmVyc2lvbik7Ci0gICAgICAgICAgICBrZXlzKys7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0IGtleXMgPiAwICYmIGlmaWxlLmdldEZpbGVQb2ludGVyKCkgPiAwICYmIGlmaWxlLmxlbmd0aCgpID4gMCA6ICJVbmV4cGVjdGVkIGVtcHR5IGluZGV4IGZpbGU6ICIgKyBpZmlsZTsKLSAgICAgICAgbG9uZyBlc3RpbWF0ZWRSb3dzID0gaWZpbGUubGVuZ3RoKCkgLyAoaWZpbGUuZ2V0RmlsZVBvaW50ZXIoKSAvIGtleXMpOwotICAgICAgICBpZmlsZS5zZWVrKDApOwotICAgICAgICByZXR1cm4gZXN0aW1hdGVkUm93czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBieXRlc09uRGlzaygpCi0gICAgewotICAgICAgICBsb25nIGJ5dGVzID0gMDsKLSAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZXMgKz0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb21wb25lbnQpKS5sZW5ndGgoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgfQotCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgewotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiKCIgKwotICAgICAgICAgICAgICAgInBhdGg9JyIgKyBnZXRGaWxlbmFtZSgpICsgJ1wnJyArCi0gICAgICAgICAgICAgICAnKSc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgdGhlIGxpc3Qgb2YgY29tcG9uZW50cyBmcm9tIHRoZSBUT0MgY29tcG9uZW50LgotICAgICAqIEByZXR1cm4gc2V0IG9mIGNvbXBvbmVudHMgZm91bmQgaW4gdGhlIFRPQwotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgU2V0PENvbXBvbmVudD4gcmVhZFRPQyhEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlYWRUT0MoZGVzY3JpcHRvciwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVhZHMgdGhlIGxpc3Qgb2YgY29tcG9uZW50cyBmcm9tIHRoZSBUT0MgY29tcG9uZW50LgotICAgICAqIEBwYXJhbSBza2lwTWlzc2luZywgc2tpcCBhZGRpbmcgdGhlIGNvbXBvbmVudCB0byB0aGUgcmV0dXJuZWQgc2V0IGlmIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgaXMgbWlzc2luZy4KLSAgICAgKiBAcmV0dXJuIHNldCBvZiBjb21wb25lbnRzIGZvdW5kIGluIHRoZSBUT0MKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFNldDxDb21wb25lbnQ+IHJlYWRUT0MoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBib29sZWFuIHNraXBNaXNzaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEZpbGUgdG9jRmlsZSA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlRPQykpOwotICAgICAgICBMaXN0PFN0cmluZz4gY29tcG9uZW50TmFtZXMgPSBGaWxlcy5yZWFkQWxsTGluZXModG9jRmlsZS50b1BhdGgoKSk7Ci0gICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBTZXRzLm5ld0hhc2hTZXRXaXRoRXhwZWN0ZWRTaXplKGNvbXBvbmVudE5hbWVzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoU3RyaW5nIGNvbXBvbmVudE5hbWUgOiBjb21wb25lbnROYW1lcykKLSAgICAgICAgewotICAgICAgICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoQ29tcG9uZW50LlR5cGUuZnJvbVJlcHJlc2VudGF0aW9uKGNvbXBvbmVudE5hbWUpLCBjb21wb25lbnROYW1lKTsKLSAgICAgICAgICAgIGlmIChza2lwTWlzc2luZyAmJiAhbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb21wb25lbnQpKS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIk1pc3NpbmcgY29tcG9uZW50OiB7fSIsIGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoY29tcG9uZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29tcG9uZW50czsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcHBlbmRzIG5ldyBjb21wb25lbnQgbmFtZXMgdG8gdGhlIFRPQyBjb21wb25lbnQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFwcGVuZFRPQyhEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIENvbGxlY3Rpb248Q29tcG9uZW50PiBjb21wb25lbnRzKQotICAgIHsKLSAgICAgICAgRmlsZSB0b2NGaWxlID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuVE9DKSk7Ci0gICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gdG9jRmlsZS5uZXdPdXRwdXRTdHJlYW0oQVBQRU5EKTsKLSAgICAgICAgICAgICBQcmludFdyaXRlciB3ID0gbmV3IFByaW50V3JpdGVyKG91dCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMpCi0gICAgICAgICAgICAgICAgdy5wcmludGxuKGNvbXBvbmVudC5uYW1lKTsKLSAgICAgICAgICAgIHcuZmx1c2goKTsKLSAgICAgICAgICAgIG91dC5zeW5jKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgdG9jRmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgbmV3IGN1c3RvbSBjb21wb25lbnRzLiBVc2VkIGJ5IGN1c3RvbSBjb21wYWN0aW9uIHN0cmF0ZWdpZXMuCi0gICAgICogQWRkaW5nIGEgY29tcG9uZW50IGZvciB0aGUgc2Vjb25kIHRpbWUgaXMgYSBuby1vcC4KLSAgICAgKiBEb24ndCByZW1vdmUgdGhpcyAtIHRoaXMgbWV0aG9kIGlzIGEgcGFydCBvZiB0aGUgcHVibGljIEFQSSwgaW50ZW5kZWQgZm9yIHVzZSBieSBjdXN0b20gY29tcGFjdGlvbiBzdHJhdGVnaWVzLgotICAgICAqIEBwYXJhbSBuZXdDb21wb25lbnRzIGNvbGxlY3Rpb24gb2YgY29tcG9uZW50cyB0byBiZSBhZGRlZAotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb21wb25lbnRzKENvbGxlY3Rpb248Q29tcG9uZW50PiBuZXdDb21wb25lbnRzKQotICAgIHsKLSAgICAgICAgQ29sbGVjdGlvbjxDb21wb25lbnQ+IGNvbXBvbmVudHNUb0FkZCA9IENvbGxlY3Rpb25zMi5maWx0ZXIobmV3Q29tcG9uZW50cywgUHJlZGljYXRlcy5ub3QoUHJlZGljYXRlcy5pbihjb21wb25lbnRzKSkpOwotICAgICAgICBhcHBlbmRUT0MoZGVzY3JpcHRvciwgY29tcG9uZW50c1RvQWRkKTsKLSAgICAgICAgY29tcG9uZW50cy5hZGRBbGwoY29tcG9uZW50c1RvQWRkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RCb3VuZHM8VG9rZW4+IGdldEJvdW5kcygpCi0gICAgewotICAgICAgICByZXR1cm4gQWJzdHJhY3RCb3VuZHMuYm91bmRzKGZpcnN0LmdldFRva2VuKCksIHRydWUsIGxhc3QuZ2V0VG9rZW4oKSwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlczolcyhwYXRoPSclcycpIiwgZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksIGRlc2NyaXB0b3IudmVyc2lvbi5mb3JtYXQubmFtZSgpLCBnZXRGaWxlbmFtZSgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVSZXBhaXJlZE1ldGFkYXRhKGxvbmcgcmVwYWlyZWRBdCwgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwgYm9vbGVhbiBpc1RyYW5zaWVudCkKQEAgLTM5MCw2ICsyOTksMTE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGVuZGluZ1JlcGFpciBjYW5ub3QgYmUgc2V0IG9uIGEgcmVwYWlyZWQgc3N0YWJsZSIpOwogICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoIWlzVHJhbnNpZW50IHx8IChwZW5kaW5nUmVwYWlyICE9IE5PX1BFTkRJTkdfUkVQQUlSKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpc1RyYW5zaWVudCBjYW4gb25seSBiZSB0cnVlIGZvciBzc3RhYmxlcyBwZW5kaW5nIHJlcGFpciIpOworICAgIH0KIAorICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBuZXcgY3VzdG9tIGNvbXBvbmVudHMuIFVzZWQgYnkgY3VzdG9tIGNvbXBhY3Rpb24gc3RyYXRlZ2llcy4KKyAgICAgKiBBZGRpbmcgYSBjb21wb25lbnQgZm9yIHRoZSBzZWNvbmQgdGltZSBpcyBhIG5vLW9wLgorICAgICAqIERvbid0IHJlbW92ZSB0aGlzIC0gdGhpcyBtZXRob2QgaXMgYSBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLCBpbnRlbmRlZCBmb3IgdXNlIGJ5IGN1c3RvbSBjb21wYWN0aW9uIHN0cmF0ZWdpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV3Q29tcG9uZW50cyBjb2xsZWN0aW9uIG9mIGNvbXBvbmVudHMgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ29tcG9uZW50cyhDb2xsZWN0aW9uPENvbXBvbmVudD4gbmV3Q29tcG9uZW50cykKKyAgICB7CisgICAgICAgIENvbGxlY3Rpb248Q29tcG9uZW50PiBjb21wb25lbnRzVG9BZGQgPSBDb2xsZWN0aW9uczIuZmlsdGVyKG5ld0NvbXBvbmVudHMsIFByZWRpY2F0ZXMubm90KFByZWRpY2F0ZXMuaW4oY29tcG9uZW50cykpKTsKKyAgICAgICAgVE9DQ29tcG9uZW50LmFwcGVuZFRPQyhkZXNjcmlwdG9yLCBjb21wb25lbnRzVG9BZGQpOworICAgICAgICBjb21wb25lbnRzLmFkZEFsbChjb21wb25lbnRzVG9BZGQpOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT3duZXIKKyAgICB7CisgICAgICAgIERvdWJsZSBnZXRDcmNDaGVja0NoYW5jZSgpOworCisgICAgICAgIE9wT3JkZXIuQmFycmllciBuZXdSZWFkT3JkZXJpbmdCYXJyaWVyKCk7CisKKyAgICAgICAgVGFibGVNZXRyaWNzIGdldE1ldHJpY3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGJ1aWxkZXIgb2YgdGhpcyBzc3RhYmxlIHJlcHJlc2VudGF0aW9uLiBJdCBzaG91bGQgYmUgZXh0ZW5kZWQgZm9yIGVhY2ggaW1wbGVtZW50YXRpb24gd2l0aCB0aGUgc3BlY2lmaWMgZmllbGRzLgorICAgICAqCisgICAgICogQHBhcmFtIDxTPiB0eXBlIG9mIHRoZSBzc3RhYmxlIHJlcHJlc2VudGF0aW9uIHRvIGJlIGJ1aWxkIHdpdGggdGhpcyBidWlsZGVyCisgICAgICogQHBhcmFtIDxCPiB0eXBlIG9mIHRoaXMgYnVpbGRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlcjxTIGV4dGVuZHMgU1NUYWJsZSwgQiBleHRlbmRzIEJ1aWxkZXI8UywgQj4+CisgICAgeworICAgICAgICBwdWJsaWMgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yOworCisgICAgICAgIHByaXZhdGUgU2V0PENvbXBvbmVudD4gY29tcG9uZW50czsKKyAgICAgICAgcHJpdmF0ZSBUYWJsZU1ldGFkYXRhUmVmIHRhYmxlTWV0YWRhdGFSZWY7CisgICAgICAgIHByaXZhdGUgQ2h1bmtDYWNoZSBjaHVua0NhY2hlID0gQ2h1bmtDYWNoZS5pbnN0YW5jZTsKKyAgICAgICAgcHJpdmF0ZSBJT09wdGlvbnMgaW9PcHRpb25zID0gSU9PcHRpb25zLmZyb21EYXRhYmFzZURlc2NyaXB0b3IoKTsKKworICAgICAgICBwdWJsaWMgQnVpbGRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbChkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQiBzZXRDb21wb25lbnRzKENvbGxlY3Rpb248Q29tcG9uZW50PiBjb21wb25lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50cyAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuZm9yRWFjaChjIC0+IFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZShjLmlzVmFsaWRGb3IoZGVzY3JpcHRvciksICJJbnZhbGlkIGNvbXBvbmVudCB0eXBlIGZvciBzc3RhYmxlIGZvcm1hdCAiICsgZGVzY3JpcHRvci52ZXJzaW9uLmZvcm1hdC5uYW1lKCkpKTsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBJbW11dGFibGVTZXQuY29weU9mKGNvbXBvbmVudHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQiBhZGRDb21wb25lbnRzKENvbGxlY3Rpb248Q29tcG9uZW50PiBjb21wb25lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29tcG9uZW50cyA9PSBudWxsIHx8IGNvbXBvbmVudHMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIHJldHVybiAoQikgdGhpczsKKworICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50cyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBzZXRDb21wb25lbnRzKGNvbXBvbmVudHMpOworCisgICAgICAgICAgICByZXR1cm4gc2V0Q29tcG9uZW50cyhTZXRzLnVuaW9uKHRoaXMuY29tcG9uZW50cywgSW1tdXRhYmxlU2V0LmNvcHlPZihjb21wb25lbnRzKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEIgc2V0VGFibGVNZXRhZGF0YVJlZihUYWJsZU1ldGFkYXRhUmVmIHJlZikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50YWJsZU1ldGFkYXRhUmVmID0gcmVmOworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEIgc2V0Q2h1bmtDYWNoZShDaHVua0NhY2hlIGNodW5rQ2FjaGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY2h1bmtDYWNoZSA9IGNodW5rQ2FjaGU7CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQiBzZXRJT09wdGlvbnMoSU9PcHRpb25zIGlvT3B0aW9ucykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5pb09wdGlvbnMgPSBpb09wdGlvbnM7CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2V0PENvbXBvbmVudD4gZ2V0Q29tcG9uZW50cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRhYmxlTWV0YWRhdGFSZWYgZ2V0VGFibGVNZXRhZGF0YVJlZigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0YWJsZU1ldGFkYXRhUmVmOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENodW5rQ2FjaGUgZ2V0Q2h1bmtDYWNoZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjaHVua0NhY2hlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElPT3B0aW9ucyBnZXRJT09wdGlvbnMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaW9PcHRpb25zOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlRmx1c2hPYnNlcnZlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlRmx1c2hPYnNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNWQ4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVGbHVzaE9ic2VydmVyLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKKworLyoqCisgKiBPYnNlcnZlciBmb3IgZXZlbnRzIGluIHRoZSBsaWZlY3ljbGUgb2Ygd3JpdGluZyBvdXQgYW4gc3N0YWJsZS4KKyAqLworcHVibGljIGludGVyZmFjZSBTU1RhYmxlRmx1c2hPYnNlcnZlcgoreworICAgIC8qKgorICAgICAqIENhbGxlZCBiZWZvcmUgd3JpdGluZyBhbnkgZGF0YSB0byB0aGUgc3N0YWJsZS4KKyAgICAgKi8KKyAgICB2b2lkIGJlZ2luKCk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIG5ldyBwYXJ0aXRpb24gaW4gYmVpbmcgd3JpdHRlbiB0byB0aGUgc3N0YWJsZSwKKyAgICAgKiBidXQgYmVmb3JlIGFueSBjZWxscyBhcmUgcHJvY2Vzc2VkIChzZWUge0BsaW5rICNuZXh0VW5maWx0ZXJlZENsdXN0ZXIoVW5maWx0ZXJlZCl9KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgICAgdGhlIGtleSBiZWluZyBhcHBlbmRlZCB0byBTU1RhYmxlLgorICAgICAqIEBwYXJhbSBrZXlQb3NpdGlvbiAgICAgICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBrZXkgaW4gdGhlIFNTVGFibGUgZGF0YSBmaWxlCisgICAgICogQHBhcmFtIEtleVBvc2l0aW9uRm9yU0FTSSBTU1RhYmxlIGZvcm1hdCBzcGVjaWZpYyBrZXkgcG9zaXRpb24gZm9yIHN0b3JhZ2UgYXR0YWNoZWQgaW5kZXhlcywgaXQgY2FuIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBkYXRhIGZpbGUgb3IgaW4gc29tZSBpbmRleCBmaWxlLiBJdCBpcyB0aGUgc2FtZSBwb3NpdGlvbiBhcyByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIEtleVJlYWRlciNrZXlQb3NpdGlvbkZvclNlY29uZGFyeUluZGV4KCl9IGZvciB0aGUgc2FtZSBmb3JtYXQsIGFuZCB0aGUgc2FtZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gYXMgZXhwZWN0ZWQgYnkge0BsaW5rIFNTVGFibGVSZWFkZXIja2V5QXRQb3NpdGlvbkZyb21TZWNvbmRhcnlJbmRleChsb25nKX0uCisgICAgICovCisgICAgdm9pZCBzdGFydFBhcnRpdGlvbihEZWNvcmF0ZWRLZXkga2V5LCBsb25nIGtleVBvc2l0aW9uLCBsb25nIEtleVBvc2l0aW9uRm9yU0FTSSk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhIHN0YXRpYyByb3cgaXMgYmVpbmcgd3JpdHRlbiB0byB0aGUgc3N0YWJsZS4gSWYgc3RhdGljIGNvbHVtbnMgYXJlIHByZXNlbnQgaW4gdGhlIHRhYmxlLCBpdCBpcyBjYWxsZWQKKyAgICAgKiBhZnRlciB7QGxpbmsgI3N0YXJ0UGFydGl0aW9uKERlY29yYXRlZEtleSwgbG9uZywgbG9uZyl9IGFuZCBiZWZvcmUgYW55IGNhbGxzIHRvIHtAbGluayAjbmV4dFVuZmlsdGVyZWRDbHVzdGVyKFVuZmlsdGVyZWQpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0aWNSb3cgc3RhdGljIHJvdyBhcHBlbmRlZCB0byB0aGUgc3N0YWJsZSwgY2FuIGJlIGVtcHR5LCBtYXkgbm90IGJlIHtAY29kZSBudWxsfQorICAgICAqLworICAgIHZvaWQgc3RhdGljUm93KFJvdyBzdGF0aWNSb3cpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIGFmdGVyIHRoZSB1bmZpbHRlcmVkIGNsdXN0ZXIgaXMgd3JpdHRlbiB0byB0aGUgc3N0YWJsZS4KKyAgICAgKiBXaWxsIGJlIHByZWNlZGVkIGJ5IGEgY2FsbCB0byB7QGNvZGUgc3RhcnRQYXJ0aXRpb24oRGVjb3JhdGVkS2V5LCBsb25nKX0sCisgICAgICogYW5kIHRoZSBjbHVzdGVyIHNob3VsZCBiZSBhc3N1bWVkIHRvIGJlbG9uZyB0byB0aGF0IHBhcnRpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bmZpbHRlcmVkQ2x1c3RlciBUaGUgdW5maWx0ZXJlZCBjbHVzdGVyIGJlaW5nIGFkZGVkIHRvIFNTVGFibGUuCisgICAgICovCisgICAgdm9pZCBuZXh0VW5maWx0ZXJlZENsdXN0ZXIoVW5maWx0ZXJlZCB1bmZpbHRlcmVkQ2x1c3Rlcik7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBhbGwgZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBmaWxlIGFuZCBpdCdzIHJlYWR5IHRvIGJlIGZpbmlzaGVkIHVwLgorICAgICAqLworICAgIHZvaWQgY29tcGxldGUoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVIZWFkZXJGaXguamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUhlYWRlckZpeC5qYXZhCmluZGV4IGY3ODIwMGEuLmU3ODUxOTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUhlYWRlckZpeC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUhlYWRlckZpeC5qYXZhCkBAIC0zNSw3ICszNSw2IEBACiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTU0LDggKzUzLDExIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5TZXRUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVHVwbGVUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVXNlclR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50cy5UeXBlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkluZGV4TWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKQEAgLTY2LDE1ICs2OCwxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfU0tJUF9BVVRPTUFUSUNfVURUX0ZJWDsKKwogLyoqCiAgKiBWYWxpZGF0ZXMgYW5kIGZpeGVzIHR5cGUgaXNzdWVzIGluIHRoZSBzZXJpYWxpemF0aW9uLWhlYWRlciBvZiBzc3RhYmxlcy4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFNTVGFibGVIZWFkZXJGaXgKIHsKICAgICAvLyBDKiAzLjAgdXBncmFkZSBjb2RlCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUEFVVE9NQVRJQ1VEVEZJWCA9ICJjYXNzYW5kcmEuc2tpcGF1dG9tYXRpY3VkdGZpeCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBTS0lQX0FVVE9NQVRJQ19GSVhfT05fVVBHUkFERSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihTS0lQQVVUT01BVElDVURURklYKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFNLSVBfQVVUT01BVElDX0ZJWF9PTl9VUEdSQURFID0gQ0FTU0FORFJBX1NLSVBfQVVUT01BVElDX1VEVF9GSVguZ2V0Qm9vbGVhbigpOwogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpeE5vbkZyb3plblVEVElmVXBncmFkZUZyb20zMCgpCiAgICAgewpAQCAtOTQsNyArOTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgInNzdGFibGUgbWV0YWRhdGEgc2VyaWFsaXphdGlvbi1oZWFkZXJzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVmVyc2lvblN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLmdldFJlbGVhc2VWZXJzaW9uU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBTS0lQQVVUT01BVElDVURURklYKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENBU1NBTkRSQV9TS0lQX0FVVE9NQVRJQ19VRFRfRklYLmdldEtleSgpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC0zMDEsNyArMzAzLDcgQEAKICAgICAgICAgICAgICAgLmZpbHRlcihwIC0+IHsKICAgICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZVdpdGhDb21wb25lbnQobmV3IEZpbGUocCkpLnJpZ2h0LnR5cGUgPT0gQ29tcG9uZW50LlR5cGUuREFUQTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRvci5mcm9tRmlsZVdpdGhDb21wb25lbnQobmV3IEZpbGUocCkpLnJpZ2h0LnR5cGUgPT0gVHlwZXMuREFUQTsKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gdCkKICAgICAgICAgICAgICAgICAgIHsKQEAgLTMwOSw4ICszMTEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgLm1hcChQYXRoOjp0b1N0cmluZykKLSAgICAgICAgICAgICAgLm1hcChEZXNjcmlwdG9yOjpmcm9tRmlsZW5hbWUpCisgICAgICAgICAgICAgIC5tYXAoRmlsZTo6bmV3KQorICAgICAgICAgICAgICAubWFwKGZpbGUgLT4gRGVzY3JpcHRvci5mcm9tRmlsZVdpdGhDb21wb25lbnQoZmlsZSwgZmFsc2UpLmxlZnQpCiAgICAgICAgICAgICAgIC5mb3JFYWNoKGRlc2NyaXB0b3JzOjphZGQpOwogICAgIH0KIApAQCAtMzQyLDggKzM0NCw4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gU1NUYWJsZS5kaXNjb3ZlckNvbXBvbmVudHNGb3IoZGVzYyk7Ci0gICAgICAgIGlmIChjb21wb25lbnRzLnN0cmVhbSgpLm5vbmVNYXRjaChjIC0+IGMudHlwZSA9PSBDb21wb25lbnQuVHlwZS5TVEFUUykpCisgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBkZXNjLmRpc2NvdmVyQ29tcG9uZW50cygpOworICAgICAgICBpZiAoY29tcG9uZW50cy5zdHJlYW0oKS5ub25lTWF0Y2goYyAtPiBjLnR5cGUgPT0gVHlwZXMuU1RBVFMpKQogICAgICAgICB7CiAgICAgICAgICAgICBlcnJvcigic3N0YWJsZSAlcyBoYXMgbm8gLVN0YXRpc3RpY3MuZGIgY29tcG9uZW50LiIsIGRlc2MpOwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtODQ1LDcgKzg0Nyw3IEBACiAKICAgICBwcml2YXRlIHZvaWQgd3JpdGVOZXdNZXRhZGF0YShEZXNjcmlwdG9yIGRlc2MsIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBuZXdNZXRhZGF0YSkKICAgICB7Ci0gICAgICAgIFN0cmluZyBmaWxlID0gZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuU1RBVFMpOworICAgICAgICBGaWxlIGZpbGUgPSBkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUyk7CiAgICAgICAgIGluZm8uYWNjZXB0KFN0cmluZy5mb3JtYXQoIiAgV3JpdGluZyBuZXcgbWV0YWRhdGEgZmlsZSAlcyIsIGZpbGUpKTsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUlkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVJZC5qYXZhCmluZGV4IGEzZDk1ZGQuLjdhMjIzNWIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUlkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlSWQuamF2YQpAQCAtMzMsNyArMzMsNyBAQAogICogQSBuZXcgaW1wbGVtZW50YXRpb24gbXVzdCBhZGhlcmUgdG8gdGhlIGZvbGxvd2luZyBpbnZhcmlhbnRzOgogICogLSBNdXN0IGJlIGxvY2FsbHkgc29ydGFibGUgLSB0aGF0IGlzLCB0aGUgY29tcGFyaXNvbiBtdXN0IHJlZmxlY3QgdGhlIGNvbXBhcmlzb24gb2YgZ2VuZXJhdGlvbiB0aW1lcyBvZiBpZGVudGlmaWVycwogICogZ2VuZXJhdGVkIG9uIHRoZSBzYW1lIG5vZGUKLSAqIC0gU3RyaW5nIHJlcHJlc2VudGF0aW9uIG11c3QgKm5vdCogaW5jbHVkZSB0aGUge0BsaW5rIERlc2NyaXB0b3IjRklMRU5BTUVfU0VQQVJBVE9SfSBjaGFyYWN0ZXIsIHNlZSB7QGxpbmsgRGVzY3JpcHRvciNmcm9tRmlsZW5hbWVXaXRoQ29tcG9uZW50KEZpbGUpfQorICogLSBTdHJpbmcgcmVwcmVzZW50YXRpb24gbXVzdCAqbm90KiBpbmNsdWRlIHRoZSB7QGxpbmsgRGVzY3JpcHRvciNGSUxFTkFNRV9TRVBBUkFUT1J9IGNoYXJhY3Rlciwgc2VlIHtAbGluayBEZXNjcmlwdG9yI2Zyb21GaWxlV2l0aENvbXBvbmVudChGaWxlKX0KICAqIC0gbXVzdCBiZSBjYXNlLWluc2Vuc2l0aXZlIGJlY2F1c2UgdGhlIHNzdGFibGVzIGNhbiBiZSBzdG9yZWQgb24gY2FzZS1pbnNlbnNpdGl2ZSBmaWxlIHN5c3RlbQogICogPHA+CiAgKi8KQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgKiB7QGxpbmsgQnVpbGRlciNmcm9tU3RyaW5nKFN0cmluZyl9CiAgICAgICogPHA+CiAgICAgICogTXVzdCBub3QgY29udGFpbiBhbnkge0BsaW5rIERlc2NyaXB0b3IjRklMRU5BTUVfU0VQQVJBVE9SfSBjaGFyYWN0ZXIgYXMgaXQgaXMgdXNlZCBpbiB0aGUgRGVzY3JpcHRvcgotICAgICAqIHNlZSB7QGxpbmsgRGVzY3JpcHRvciNmcm9tRmlsZW5hbWVXaXRoQ29tcG9uZW50KEZpbGUpfQorICAgICAqIHNlZSB7QGxpbmsgRGVzY3JpcHRvciNmcm9tRmlsZVdpdGhDb21wb25lbnQoRmlsZSl9CiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgU3RyaW5nIHRvU3RyaW5nKCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVJZGVudGl0eUl0ZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVJZGVudGl0eUl0ZXJhdG9yLmphdmEKaW5kZXggNzZlMTJjOC4uYjA1YjNjMyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlSWRlbnRpdHlJdGVyYXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUlkZW50aXR5SXRlcmF0b3IuamF2YQpAQCAtMTcsMTYgKzE3LDI2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKIAotaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLmlvLklPRXJyb3I7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVndWxhckFuZFN0YXRpY0NvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVW5maWx0ZXJlZFZhbGlkYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5EZXNlcmlhbGl6YXRpb25IZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy52aW50LlZJbnRDb2RpbmcuVkludE91dE9mUmFuZ2VFeGNlcHRpb247CisKIHB1YmxpYyBjbGFzcyBTU1RhYmxlSWRlbnRpdHlJdGVyYXRvciBpbXBsZW1lbnRzIENvbXBhcmFibGU8U1NUYWJsZUlkZW50aXR5SXRlcmF0b3I+LCBVbmZpbHRlcmVkUm93SXRlcmF0b3IKIHsKICAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKQEAgLTY5LDEzICs3OSwxNiBAQAogICAgIH0KIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgcHVibGljIHN0YXRpYyBTU1RhYmxlSWRlbnRpdHlJdGVyYXRvciBjcmVhdGUoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBGaWxlRGF0YUlucHV0IGRmaWxlLCBSb3dJbmRleEVudHJ5PD8+IGluZGV4RW50cnksIERlY29yYXRlZEtleSBrZXksIGJvb2xlYW4gdG9tYnN0b25lT25seSkKKyAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVJZGVudGl0eUl0ZXJhdG9yIGNyZWF0ZShTU1RhYmxlUmVhZGVyIHNzdGFibGUsIEZpbGVEYXRhSW5wdXQgZGZpbGUsIGxvbmcgZGF0YVBvc2l0aW9uLCBEZWNvcmF0ZWRLZXkga2V5LCBib29sZWFuIHRvbWJzdG9uZU9ubHkpCiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgZGZpbGUuc2VlayhpbmRleEVudHJ5LnBvc2l0aW9uKTsKKyAgICAgICAgICAgIGRmaWxlLnNlZWsoZGF0YVBvc2l0aW9uKTsKICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLnNraXBTaG9ydExlbmd0aChkZmlsZSk7IC8vIFNraXAgcGFydGl0aW9uIGtleQogICAgICAgICAgICAgRGVsZXRpb25UaW1lIHBhcnRpdGlvbkxldmVsRGVsZXRpb24gPSBEZWxldGlvblRpbWUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkZmlsZSk7CisgICAgICAgICAgICBpZiAoIXBhcnRpdGlvbkxldmVsRGVsZXRpb24udmFsaWRhdGUoKSkKKyAgICAgICAgICAgICAgICBVbmZpbHRlcmVkVmFsaWRhdGlvbi5oYW5kbGVJbnZhbGlkKHNzdGFibGUubWV0YWRhdGEoKSwga2V5LCBzc3RhYmxlLCAicGFydGl0aW9uTGV2ZWxEZWxldGlvbj0iK3BhcnRpdGlvbkxldmVsRGVsZXRpb24udG9TdHJpbmcoKSk7CisKICAgICAgICAgICAgIERlc2VyaWFsaXphdGlvbkhlbHBlciBoZWxwZXIgPSBuZXcgRGVzZXJpYWxpemF0aW9uSGVscGVyKHNzdGFibGUubWV0YWRhdGEoKSwgc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24uY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb24oKSwgRGVzZXJpYWxpemF0aW9uSGVscGVyLkZsYWcuTE9DQUwpOwogICAgICAgICAgICAgU1NUYWJsZVNpbXBsZUl0ZXJhdG9yIGl0ZXJhdG9yID0gdG9tYnN0b25lT25seQogICAgICAgICAgICAgICAgICAgICA/IFNTVGFibGVTaW1wbGVJdGVyYXRvci5jcmVhdGVUb21ic3RvbmVPbmx5KHNzdGFibGUubWV0YWRhdGEoKSwgZGZpbGUsIHNzdGFibGUuaGVhZGVyLCBoZWxwZXIsIHBhcnRpdGlvbkxldmVsRGVsZXRpb24pCkBAIC0xMjUsNyArMTM4LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKICAgICAgICAgfQotICAgICAgICBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKQorICAgICAgICBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB8IFZJbnRPdXRPZlJhbmdlRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHNzdGFibGUubWFya1N1c3BlY3QoKTsKICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCBmaWxlbmFtZSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVMb2FkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUxvYWRlci5qYXZhCmluZGV4IDdkZGJlNzIuLjE4N2Q2Y2UgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUxvYWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUxvYWRlci5qYXZhCkBAIC0xNywyNSArMTcsNDMgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkhhc2hNdWx0aW1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuc3RyZWFtaW5nLkNhc3NhbmRyYU91dGdvaW5nRmlsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuc3RyZWFtaW5nLkNhc3NhbmRyYU91dGdvaW5nRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5PdXRnb2luZ1N0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuUHJldmlld0tpbmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbUV2ZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1FdmVudEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtUGxhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtUmVzdWx0RnV0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1TdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtaW5nQ2hhbm5lbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtaW5nQ2hhbm5lbC5GYWN0b3J5Lkdsb2JhbC5zdHJlYW1pbmdGYWN0b3J5OwpAQCAtNDgsMTMgKzY2LDEzIEBACiB7CiAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGRpcmVjdG9yeTsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBrZXlzcGFjZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0YWJsZTsKICAgICBwcml2YXRlIGZpbmFsIENsaWVudCBjbGllbnQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY29ubmVjdGlvbnNQZXJIb3N0OwogICAgIHByaXZhdGUgZmluYWwgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyOwogICAgIHByaXZhdGUgZmluYWwgU2V0PEluZXRBZGRyZXNzQW5kUG9ydD4gZmFpbGVkSG9zdHMgPSBuZXcgSGFzaFNldDw+KCk7CiAKICAgICBwcml2YXRlIGZpbmFsIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICBwcml2YXRlIGZpbmFsIE11bHRpbWFwPEluZXRBZGRyZXNzQW5kUG9ydCwgT3V0Z29pbmdTdHJlYW0+IHN0cmVhbWluZ0RldGFpbHMgPSBIYXNoTXVsdGltYXAuY3JlYXRlKCk7CiAKICAgICBwdWJsaWMgU1NUYWJsZUxvYWRlcihGaWxlIGRpcmVjdG9yeSwgQ2xpZW50IGNsaWVudCwgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyKQogICAgIHsKQEAgLTYzLDE4ICs4MSwyNSBAQAogCiAgICAgcHVibGljIFNTVGFibGVMb2FkZXIoRmlsZSBkaXJlY3RvcnksIENsaWVudCBjbGllbnQsIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlciwgaW50IGNvbm5lY3Rpb25zUGVySG9zdCwgU3RyaW5nIHRhcmdldEtleXNwYWNlKQogICAgIHsKKyAgICAgICAgdGhpcyhkaXJlY3RvcnksIGNsaWVudCwgb3V0cHV0SGFuZGxlciwgY29ubmVjdGlvbnNQZXJIb3N0LCB0YXJnZXRLZXlzcGFjZSwgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFNTVGFibGVMb2FkZXIoRmlsZSBkaXJlY3RvcnksIENsaWVudCBjbGllbnQsIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlciwgaW50IGNvbm5lY3Rpb25zUGVySG9zdCwgU3RyaW5nIHRhcmdldEtleXNwYWNlLCBTdHJpbmcgdGFyZ2V0VGFibGUpCisgICAgewogICAgICAgICB0aGlzLmRpcmVjdG9yeSA9IGRpcmVjdG9yeTsKICAgICAgICAgdGhpcy5rZXlzcGFjZSA9IHRhcmdldEtleXNwYWNlICE9IG51bGwgPyB0YXJnZXRLZXlzcGFjZSA6IGRpcmVjdG9yeS5wYXJlbnQoKS5uYW1lKCk7CisgICAgICAgIHRoaXMudGFibGUgPSB0YXJnZXRUYWJsZTsKICAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CiAgICAgICAgIHRoaXMub3V0cHV0SGFuZGxlciA9IG91dHB1dEhhbmRsZXI7CiAgICAgICAgIHRoaXMuY29ubmVjdGlvbnNQZXJIb3N0ID0gY29ubmVjdGlvbnNQZXJIb3N0OwogICAgIH0KIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgcHJvdGVjdGVkIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gb3BlblNTVGFibGVzKGZpbmFsIE1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+Pj4gcmFuZ2VzKQorICAgIHByaXZhdGUgTXVsdGltYXA8SW5ldEFkZHJlc3NBbmRQb3J0LCBDYXNzYW5kcmFPdXRnb2luZ0ZpbGU+IG9wZW5TU1RhYmxlcyhmaW5hbCBNYXA8SW5ldEFkZHJlc3NBbmRQb3J0LCBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4+IHJhbmdlcykKICAgICB7CiAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJPcGVuaW5nIHNzdGFibGVzIGFuZCBjYWxjdWxhdGluZyBzZWN0aW9ucyB0byBzdHJlYW0iKTsKIAorICAgICAgICBNdWx0aW1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIENhc3NhbmRyYU91dGdvaW5nRmlsZT4gc3RyZWFtaW5nRGV0YWlscyA9IEhhc2hNdWx0aW1hcC5jcmVhdGUoKTsKICAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24uZ2V0RmlsZXMoZGlyZWN0b3J5LnRvUGF0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZSwgdHlwZSkgLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewpAQCAtODcsMTUgKzExMiwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpcjxEZXNjcmlwdG9yLCBDb21wb25lbnQ+IHAgPSBTU1RhYmxlLnRyeUNvbXBvbmVudEZyb21GaWxlbmFtZShmaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaXI8RGVzY3JpcHRvciwgQ29tcG9uZW50PiBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0ga2V5c3BhY2UgJiYgbnVsbCAhPSB0YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gU1NUYWJsZS50cnlDb21wb25lbnRGcm9tRmlsZW5hbWUoZmlsZSwga2V5c3BhY2UsIHRhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gU1NUYWJsZS50cnlDb21wb25lbnRGcm9tRmlsZW5hbWUoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IHAgPT0gbnVsbCA/IG51bGwgOiBwLmxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBudWxsIHx8ICFwLnJpZ2h0LmVxdWFscyhDb21wb25lbnQuREFUQSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBudWxsIHx8ICFwLnJpZ2h0LmVxdWFscyhDb21wb25lbnRzLkRBVEEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkuZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjIDogZGVzYy5nZXRGb3JtYXQoKS5wcmltYXJ5Q29tcG9uZW50cygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KFN0cmluZy5mb3JtYXQoIlNraXBwaW5nIGZpbGUgJXMgYmVjYXVzZSBpbmRleCBpcyBtaXNzaW5nIiwgbmFtZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlc2MuZmlsZUZvcihjKS5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KFN0cmluZy5mb3JtYXQoIlNraXBwaW5nIGZpbGUgJXMgYmVjYXVzZSAlcyBpcyBtaXNzaW5nIiwgbmFtZSwgYy5uYW1lKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEgPSBjbGllbnQuZ2V0VGFibGVNZXRhZGF0YShkZXNjLmNmbmFtZSk7CkBAIC0xMDUsMjIgKzE0MiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5EQVRBKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5QUklNQVJZX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVU1NQVJZKSkuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50LlNVTU1BUlkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ldyBGaWxlKGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkNPTVBSRVNTSU9OX0lORk8pKS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuU1RBVFMpKS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnQuU1RBVFMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IGRlc2MuZ2V0Q29tcG9uZW50cyhkZXNjLmdldEZvcm1hdCgpLnByaW1hcnlDb21wb25lbnRzKCksIGRlc2MuZ2V0Rm9ybWF0KCkudXBsb2FkQ29tcG9uZW50cygpKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG8gY29uc2VydmUgbWVtb3J5LCBvcGVuIFNTVGFibGVSZWFkZXJzIHdpdGhvdXQgYmxvb20gZmlsdGVycyBhbmQgZGlzY2FyZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbmRleCBzdW1tYXJ5IGFmdGVyIGNhbGN1bGF0aW5nIHRoZSBmaWxlIHNlY3Rpb25zIHRvIHN0cmVhbSBhbmQgdGhlIGVzdGltYXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBrZXlzIGZvciBlYWNoIGVuZHBvaW50LiBTZWUgQ0FTU0FORFJBLTU1NTUgZm9yIGRldGFpbHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gU1NUYWJsZVJlYWRlci5vcGVuRm9yQmF0Y2goZGVzYywgY29tcG9uZW50cywgbWV0YWRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IFNTVGFibGVSZWFkZXIub3BlbkZvckJhdGNoKG51bGwsIGRlc2MsIGNvbXBvbmVudHMsIG1ldGFkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlcy5hZGQoc3N0YWJsZSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIHNzdGFibGUgc2VjdGlvbnMgdG8gc3RyZWFtIGFzIHdlbGwgYXMgdGhlIGVzdGltYXRlZCBudW1iZXIgb2YKQEAgLTEzOCwxMiArMTY3LDEyIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBlc3RpbWF0ZWRLZXlzID0gc3N0YWJsZS5lc3RpbWF0ZWRLZXlzRm9yUmFuZ2VzKHRva2VuUmFuZ2VzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmPFNTVGFibGVSZWFkZXI+IHJlZiA9IHNzdGFibGUucmVmKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dGdvaW5nU3RyZWFtIHN0cmVhbSA9IG5ldyBDYXNzYW5kcmFPdXRnb2luZ0ZpbGUoU3RyZWFtT3BlcmF0aW9uLkJVTEtfTE9BRCwgcmVmLCBzc3RhYmxlU2VjdGlvbnMsIHRva2VuUmFuZ2VzLCBlc3RpbWF0ZWRLZXlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2Fzc2FuZHJhT3V0Z29pbmdGaWxlIHN0cmVhbSA9IG5ldyBDYXNzYW5kcmFPdXRnb2luZ0ZpbGUoU3RyZWFtT3BlcmF0aW9uLkJVTEtfTE9BRCwgcmVmLCBzc3RhYmxlU2VjdGlvbnMsIHRva2VuUmFuZ2VzLCBlc3RpbWF0ZWRLZXlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtaW5nRGV0YWlscy5wdXQoZW5kcG9pbnQsIHN0cmVhbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY29uc2VydmUgaGVhcCBzcGFjZSB3aGVuIGJ1bGsgbG9hZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUucmVsZWFzZVN1bW1hcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLnJlbGVhc2VJbk1lbW9yeUNvbXBvbmVudHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChGU0Vycm9yIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CkBAIC0xNTQsNyArMTgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3JpZXMuT25UeG5FcnIuSUdOT1JFKTsKIAotICAgICAgICByZXR1cm4gc3N0YWJsZXM7CisgICAgICAgIHJldHVybiBzdHJlYW1pbmdEZXRhaWxzOwogICAgIH0KIAogICAgIHB1YmxpYyBTdHJlYW1SZXN1bHRGdXR1cmUgc3RyZWFtKCkKQEAgLTE3MCwxNCArMTk5LDE0IEBACiAgICAgICAgIFN0cmVhbVBsYW4gcGxhbiA9IG5ldyBTdHJlYW1QbGFuKFN0cmVhbU9wZXJhdGlvbi5CVUxLX0xPQUQsIGNvbm5lY3Rpb25zUGVySG9zdCwgZmFsc2UsIG51bGwsIFByZXZpZXdLaW5kLk5PTkUpLmNvbm5lY3Rpb25GYWN0b3J5KGNsaWVudC5nZXRDb25uZWN0aW9uRmFjdG9yeSgpKTsKIAogICAgICAgICBNYXA8SW5ldEFkZHJlc3NBbmRQb3J0LCBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4+IGVuZHBvaW50VG9SYW5nZXMgPSBjbGllbnQuZ2V0RW5kcG9pbnRUb1Jhbmdlc01hcCgpOwotICAgICAgICBvcGVuU1NUYWJsZXMoZW5kcG9pbnRUb1Jhbmdlcyk7Ci0gICAgICAgIGlmIChzc3RhYmxlcy5pc0VtcHR5KCkpCisgICAgICAgIE11bHRpbWFwPEluZXRBZGRyZXNzQW5kUG9ydCwgQ2Fzc2FuZHJhT3V0Z29pbmdGaWxlPiBzdHJlYW1pbmdEZXRhaWxzID0gb3BlblNTVGFibGVzKGVuZHBvaW50VG9SYW5nZXMpOworICAgICAgICBpZiAoc3RyZWFtaW5nRGV0YWlscy5pc0VtcHR5KCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIHJldHVybiBlbXB0eSByZXN1bHQKICAgICAgICAgICAgIHJldHVybiBwbGFuLmV4ZWN1dGUoKTsKICAgICAgICAgfQogCi0gICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KFN0cmluZy5mb3JtYXQoIlN0cmVhbWluZyByZWxldmFudCBwYXJ0IG9mICVzIHRvICVzIiwgbmFtZXMoc3N0YWJsZXMpLCBlbmRwb2ludFRvUmFuZ2VzLmtleVNldCgpKSk7CisgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KFN0cmluZy5mb3JtYXQoIlN0cmVhbWluZyByZWxldmFudCBwYXJ0IG9mICVzIHRvICVzIiwgbmFtZXMoc3RyZWFtaW5nRGV0YWlscy52YWx1ZXMoKSksIGVuZHBvaW50VG9SYW5nZXMua2V5U2V0KCkpKTsKIAogICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbmV0QWRkcmVzc0FuZFBvcnQsIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+Pj4gZW50cnkgOiBlbmRwb2ludFRvUmFuZ2VzLmVudHJ5U2V0KCkpCiAgICAgICAgIHsKQEAgLTE4NSwxMyArMjE0LDggQEAKICAgICAgICAgICAgIGlmICh0b0lnbm9yZS5jb250YWlucyhyZW1vdGUpKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgICBMaXN0PE91dGdvaW5nU3RyZWFtPiBzdHJlYW1zID0gbmV3IExpbmtlZExpc3Q8PigpOwotCiAgICAgICAgICAgICAvLyByZWZlcmVuY2VzIGFyZSBhY3F1aXJlZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUgU1NUYWJsZVN0cmVhbWluZ1NlY3Rpb25zIGFib3ZlCi0gICAgICAgICAgICBmb3IgKE91dGdvaW5nU3RyZWFtIHN0cmVhbSA6IHN0cmVhbWluZ0RldGFpbHMuZ2V0KHJlbW90ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtcy5hZGQoc3RyZWFtKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExpc3Q8T3V0Z29pbmdTdHJlYW0+IHN0cmVhbXMgPSBuZXcgTGlua2VkTGlzdDw+KHN0cmVhbWluZ0RldGFpbHMuZ2V0KHJlbW90ZSkpOwogCiAgICAgICAgICAgICBwbGFuLnRyYW5zZmVyU3RyZWFtcyhyZW1vdGUsIHN0cmVhbXMpOwogICAgICAgICB9CkBAIC0yMTMsMTAgKzIzNywxMyBAQAogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCByZWxlYXNlUmVmZXJlbmNlcygpCiAgICAgewotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICBJdGVyYXRvcjxTU1RhYmxlUmVhZGVyPiBpdCA9IHNzdGFibGVzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCiAgICAgICAgIHsKKyAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGl0Lm5leHQoKTsKICAgICAgICAgICAgIHNzdGFibGUuc2VsZlJlZigpLnJlbGVhc2UoKTsKICAgICAgICAgICAgIGFzc2VydCBzc3RhYmxlLnNlbGZSZWYoKS5nbG9iYWxDb3VudCgpID09IDAgOiBTdHJpbmcuZm9ybWF0KCJmb3Igc3N0YWJsZSA9ICVzLCByZWYgY291bnQgPSAlZCIsIHNzdGFibGUsIHNzdGFibGUuc2VsZlJlZigpLmdsb2JhbENvdW50KCkpOworICAgICAgICAgICAgaXQucmVtb3ZlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIzMCwxMiArMjU3LDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgU3RyaW5nIG5hbWVzKENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMpCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZXMoQ29sbGVjdGlvbjxDYXNzYW5kcmFPdXRnb2luZ0ZpbGU+IHNzdGFibGVzKQogICAgIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpLmFwcGVuZCgiICIpOwotICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICByZXR1cm4gc3N0YWJsZXMuc3RyZWFtKCkubWFwKENhc3NhbmRyYU91dGdvaW5nRmlsZTo6Z2V0TmFtZSkuZGlzdGluY3QoKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiICIpKTsKICAgICB9CiAKICAgICBwdWJsaWMgU2V0PEluZXRBZGRyZXNzQW5kUG9ydD4gZ2V0RmFpbGVkSG9zdHMoKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlUmVhZHNMaXN0ZW5lci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlUmVhZHNMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNDk0ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVSZWFkc0xpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYWNpbmcuVHJhY2luZzsKKworLyoqCisgKiBMaXN0ZW5lciBmb3IgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHJlYWRpbmcgU1NUYWJsZXMuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU1NUYWJsZVJlYWRzTGlzdGVuZXIKK3sKKyAgICAvKioKKyAgICAgKiBUaGUgcmVhc29ucyBmb3Igc2tpcHBpbmcgYW4gU1NUYWJsZQorICAgICAqLworICAgIGVudW0gU2tpcHBpbmdSZWFzb24KKyAgICB7CisgICAgICAgIEJMT09NX0ZJTFRFUigiQmxvb20gZmlsdGVyIGFsbG93cyBza2lwcGluZyBzc3RhYmxlIHt9IiksCisgICAgICAgIE1JTl9NQVhfS0VZUygiQ2hlY2sgYWdhaW5zdCBtaW4gYW5kIG1heCBrZXlzIGFsbG93cyBza2lwcGluZyBzc3RhYmxlIHt9IiksCisgICAgICAgIFBBUlRJVElPTl9JTkRFWF9MT09LVVAoIlBhcnRpdGlvbiBpbmRleCBsb29rdXAgYWxsb3dzIHNraXBwaW5nIHNzdGFibGUge30iKSwKKyAgICAgICAgSU5ERVhfRU5UUllfTk9UX0ZPVU5EKCJQYXJ0aXRpb24gaW5kZXggbG9va3VwIGNvbXBsZXRlIChibG9vbSBmaWx0ZXIgZmFsc2UgcG9zaXRpdmUpIGZvciBzc3RhYmxlIHt9Iik7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKKworICAgICAgICBTa2lwcGluZ1JlYXNvbihTdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHRyYWNlKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICAgICAgeworICAgICAgICAgICAgVHJhY2luZy50cmFjZShtZXNzYWdlLCBkZXNjcmlwdG9yLmlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSByZWFzb25zIGZvciBzZWxlY3RpbmcgYW4gU1NUYWJsZQorICAgICAqLworICAgIGVudW0gU2VsZWN0aW9uUmVhc29uCisgICAgeworICAgICAgICBLRVlfQ0FDSEVfSElUKCJLZXkgY2FjaGUgaGl0IGZvciBzc3RhYmxlIHt9LCBzaXplID0ge30iKSwKKyAgICAgICAgSU5ERVhfRU5UUllfRk9VTkQoIlBhcnRpdGlvbiBpbmRleCBmb3VuZCBmb3Igc3N0YWJsZSB7fSwgc2l6ZSA9IHt9Iik7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKKworICAgICAgICBTZWxlY3Rpb25SZWFzb24oU3RyaW5nIG1lc3NhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0cmFjZShEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIEFic3RyYWN0Um93SW5kZXhFbnRyeSBlbnRyeSkKKyAgICAgICAgeworICAgICAgICAgICAgVHJhY2luZy50cmFjZShtZXNzYWdlLCBkZXNjcmlwdG9yLmlkLCBlbnRyeS5ibG9ja0NvdW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlzdGVuZXIgdGhhdCBkb2VzIG5vdGhpbmcuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFNTVGFibGVSZWFkc0xpc3RlbmVyIE5PT1BfTElTVEVORVIgPSBuZXcgU1NUYWJsZVJlYWRzTGlzdGVuZXIoKSB7fTsKKworICAgIC8qKgorICAgICAqIEhhbmRsZXMgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHNwZWNpZmllZCBTU1RhYmxlIGhhcyBiZWVuIHNraXBwZWQgZHVyaW5nIGEgc2luZ2xlIHBhcnRpdGlvbiBxdWVyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzc3RhYmxlIHRoZSBTU1RhYmxlIHJlYWRlcgorICAgICAqIEBwYXJhbSByZWFzb24gdGhlIHJlYXNvbiBmb3Igd2hpY2ggdGhlIFNTVGFibGUgaGFzIGJlZW4gc2tpcHBlZAorICAgICAqLworICAgIGRlZmF1bHQgdm9pZCBvblNTVGFibGVTa2lwcGVkKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgU2tpcHBpbmdSZWFzb24gcmVhc29uKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzcGVjaWZpZWQgU1NUYWJsZSBoYXMgYmVlbiBzZWxlY3RlZCBkdXJpbmcgYSBzaW5nbGUgcGFydGl0aW9uIHF1ZXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHNzdGFibGUgdGhlIFNTVGFibGUgcmVhZGVyCisgICAgICogQHBhcmFtIGluZGV4RW50cnkgdGhlIGluZGV4IGVudHJ5CisgICAgICogQHBhcmFtIHJlYXNvbiB0aGUgcmVhc29uIGZvciB3aGljaCB0aGUgU1NUYWJsZSBoYXMgYmVlbiBzZWxlY3RlZAorICAgICAqLworICAgIGRlZmF1bHQgdm9pZCBvblNTVGFibGVTZWxlY3RlZChTU1RhYmxlUmVhZGVyIHNzdGFibGUsIFNlbGVjdGlvblJlYXNvbiByZWFzb24pCisgICAgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZXMgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHNwZWNpZmllZCBTU1RhYmxlIGlzIGJlaW5nIHNjYW5uZWQgZHVyaW5nIGEgcGFydGl0aW9uIHJhbmdlIHF1ZXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHNzdGFibGUgdGhlIFNTVGFibGUgcmVhZGVyIG9mIHRoZSBTU1RhYmxlIGJlaW5nIHNjYW5uZWQuCisgICAgICovCisgICAgZGVmYXVsdCB2b2lkIG9uU2Nhbm5pbmdTdGFydGVkKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkKKyAgICB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlUmV3cml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVJld3JpdGVyLmphdmEKaW5kZXggZTM5NGJiZC4uODJhZTRkYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlUmV3cml0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVSZXdyaXRlci5qYXZhCkBAIC0xNywyMiArMTcsMTggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOwogCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkluc3RydW1lbnRpbmdDYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5LZXlDYWNoZUtleTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dJbmRleEVudHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5JTGlmZWN5Y2xlVHJhbnNhY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk5hdGl2ZUxpYnJhcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5UcmFuc2FjdGlvbmFsOwogCiAvKioKQEAgLTQzLDEyICszOSwxMiBAQAogICogZm9yIG9uLWNsb3NlIChpLmUuIHdoZW4gYWxsIHJlZmVyZW5jZXMgZXhwaXJlKSB0aGF0IGRyb3BzIHRoZSBwYWdlIGNhY2hlIHByaW9yIHRvIHRoYXQga2V5IHBvc2l0aW9uCiAgKgogICogaGFyZC1saW5rcyBhcmUgY3JlYXRlZCBmb3IgZWFjaCBwYXJ0aWFsbHkgd3JpdHRlbiBzc3RhYmxlIHNvIHRoYXQgcmVhZGVycyBvcGVuZWQgYWdhaW5zdCB0aGVtIGNvbnRpbnVlIHRvIHdvcmsgcGFzdAotICogdGhlIHJlbmFtZSBvZiB0aGUgdGVtcG9yYXJ5IGZpbGUsIHdoaWNoIGlzIGRlbGV0ZWQgb25jZSBhbGwgcmVhZGVycyBhZ2FpbnN0IHRoZSBoYXJkLWxpbmsgaGF2ZSBiZWVuIGNsb3NlZC4KKyAqIHJlbmFtaW5nIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSwgd2hpY2ggaXMgZGVsZXRlZCBvbmNlIGFsbCByZWFkZXJzIGFnYWluc3QgdGhlIGhhcmQtbGluayBoYXZlIGJlZW4gY2xvc2VkLgogICogSWYgZm9yIGFueSByZWFzb24gdGhlIHdyaXRlciBpcyByb2xsZWQgb3Zlciwgd2UgaW1tZWRpYXRlbHkgcmVuYW1lIGFuZCBmdWxseSBleHBvc2UgdGhlIGNvbXBsZXRlZCBmaWxlIGluIHRoZSBUcmFja2VyLgogICoKLSAqIE9uIGFib3J0IHdlIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGxvd2VyIGJvdW5kcyB0byB0aGUgZXhpc3RpbmcgcmVhZGVycyBhbmQgZGVsZXRlIGFueSB0ZW1wb3JhcnkgZmlsZXMgd2UgaGFkIGluIHByb2dyZXNzLAotICogYnV0IGxlYXZlIGFueSBoYXJkLWxpbmtzIGluIHBsYWNlIGZvciB0aGUgcmVhZGVycyB3ZSBvcGVuZWQgdG8gY2xlYW51cCB3aGVuIHRoZXkncmUgZmluaXNoZWQgYXMgd2Ugd291bGQgaGFkIHdlIGZpbmlzaGVkCi0gKiBzdWNjZXNzZnVsbHkuCisgKiBPbiBhYm9ydCwgd2UgcmVzdG9yZSB0aGUgb3JpZ2luYWwgbG93ZXIgYm91bmRzIHRvIHRoZSBleGlzdGluZyByZWFkZXJzIGFuZCBkZWxldGUgYW55IHRlbXBvcmFyeSBmaWxlcyB3ZSBoYWQgaW4gcHJvZ3Jlc3MsCisgKiBidXQgbGVhdmUgYW55IGhhcmQtbGlua3MgaW4gcGxhY2UgZm9yIHRoZSByZWFkZXJzIHdlIG9wZW5lZCwgYW5kIGNsZWFuLXVwIHdoZW4gdGhlIHJlYWRlcnMgZmluaXNoIGFzIHdlIHdvdWxkIGRvCisgKiBpZiB3ZSBoYWQgZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LgogICovCiBwdWJsaWMgY2xhc3MgU1NUYWJsZVJld3JpdGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25hbC5BYnN0cmFjdFRyYW5zYWN0aW9uYWwgaW1wbGVtZW50cyBUcmFuc2FjdGlvbmFsCiB7CkBAIC02OSw3ICs2NSw2IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGVhZ2VyV3JpdGVyTWV0YVJlbGVhc2U7IC8vIHRydWUgaWYgdGhlIHdyaXRlciBtZXRhZGF0YSBzaG91bGQgYmUgcmVsZWFzZWQgd2hlbiBzd2l0Y2ggaXMgY2FsbGVkCiAKICAgICBwcml2YXRlIFNTVGFibGVXcml0ZXIgd3JpdGVyOwotICAgIHByaXZhdGUgTWFwPERlY29yYXRlZEtleSwgUm93SW5kZXhFbnRyeT4gY2FjaGVkS2V5cyA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgIC8vIGZvciB0ZXN0aW5nIChUT0RPOiByZW1vdmUgd2hlbiBoYXZlIGJ5dGVtYW4gc2V0dXApCiAgICAgcHJpdmF0ZSBib29sZWFuIHRocm93RWFybHksIHRocm93TGF0ZTsKQEAgLTExNywzMSArMTEyLDE2IEBACiAgICAgICAgIHJldHVybiB3cml0ZXI7CiAgICAgfQogCi0gICAgcHVibGljIFJvd0luZGV4RW50cnkgYXBwZW5kKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pCisgICAgcHVibGljIEFic3RyYWN0Um93SW5kZXhFbnRyeSBhcHBlbmQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbikKICAgICB7Ci0gICAgICAgIC8vIHdlIGRvIHRoaXMgYmVmb3JlIGFwcGVuZGluZyB0byBlbnN1cmUgd2UgY2FuIHJlc2V0QW5kVHJ1bmNhdGUoKSBzYWZlbHkgaWYgdGhlIGFwcGVuZCBmYWlscworICAgICAgICAvLyB3ZSBkbyB0aGlzIGJlZm9yZSBhcHBlbmRpbmcgdG8gZW5zdXJlIHdlIGNhbiByZXNldEFuZFRydW5jYXRlKCkgc2FmZWx5IGlmIGFwcGVuZGluZyBmYWlscwogICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gcGFydGl0aW9uLnBhcnRpdGlvbktleSgpOwogICAgICAgICBtYXliZVJlb3BlbkVhcmx5KGtleSk7Ci0gICAgICAgIFJvd0luZGV4RW50cnkgaW5kZXggPSB3cml0ZXIuYXBwZW5kKHBhcnRpdGlvbik7Ci0gICAgICAgIGlmIChEYXRhYmFzZURlc2NyaXB0b3Iuc2hvdWxkTWlncmF0ZUtleWNhY2hlT25Db21wYWN0aW9uKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb24uaXNPZmZsaW5lKCkgJiYgaW5kZXggIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgcmVhZGVyIDogdHJhbnNhY3Rpb24ub3JpZ2luYWxzKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyLmdldENhY2hlZFBvc2l0aW9uKGtleSwgZmFsc2UpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlZEtleXMucHV0KGtleSwgaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICByZXR1cm4gd3JpdGVyLmFwcGVuZChwYXJ0aXRpb24pOwogICAgIH0KIAogICAgIC8vIGF0dGVtcHRzIHRvIGFwcGVuZCB0aGUgcm93LCBpZiBmYWlscyByZXNldHMgdGhlIHdyaXRlciBwb3NpdGlvbgotICAgIHB1YmxpYyBSb3dJbmRleEVudHJ5IHRyeUFwcGVuZChVbmZpbHRlcmVkUm93SXRlcmF0b3IgcGFydGl0aW9uKQorICAgIHB1YmxpYyBBYnN0cmFjdFJvd0luZGV4RW50cnkgdHJ5QXBwZW5kKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pCiAgICAgewogICAgICAgICB3cml0ZXIubWFyaygpOwogICAgICAgICB0cnkKQEAgLTE2MywyMCArMTQzLDE4IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHJlYWRlciA6IHRyYW5zYWN0aW9uLm9yaWdpbmFscygpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUm93SW5kZXhFbnRyeSBpbmRleCA9IHJlYWRlci5nZXRQb3NpdGlvbihrZXksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuR0UpOwotICAgICAgICAgICAgICAgICAgICBOYXRpdmVMaWJyYXJ5LnRyeVNraXBDYWNoZShyZWFkZXIuZ2V0RmlsZW5hbWUoKSwgMCwgaW5kZXggPT0gbnVsbCA/IDAgOiBpbmRleC5wb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlci50cnlTa2lwRmlsZUNhY2hlQmVmb3JlKGtleSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gd3JpdGVyLnNldE1heERhdGFBZ2UobWF4QWdlKS5vcGVuRWFybHkoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlci5zZXRNYXhEYXRhQWdlKG1heEFnZSk7CisgICAgICAgICAgICAgICAgd3JpdGVyLm9wZW5FYXJseShyZWFkZXIgLT4gewogICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi51cGRhdGUocmVhZGVyLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseU9wZW5lZEVhcmx5QXQgPSB3cml0ZXIuZ2V0RmlsZVBvaW50ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgbW92ZVN0YXJ0cyhyZWFkZXIsIHJlYWRlci5sYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgbW92ZVN0YXJ0cyhyZWFkZXIubGFzdCk7CiAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLmNoZWNrcG9pbnQoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yMTAsMjcgKzE4OCwxMyBAQAogICAgICAqIG9uZSwgdGhlIG9sZCAqaW5zdGFuY2UqIHdpbGwgaGF2ZSByZWZlcmVuY2UgY291bnQgPT0gMCBhbmQgaWYgd2Ugd2VyZSB0byBzdGFydCBhIG5ldyBjb21wYWN0aW9uIHdpdGggdGhhdCBvbGQKICAgICAgKiBpbnN0YW5jZSwgd2Ugd291bGQgZ2V0IGV4Y2VwdGlvbnMuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gbmV3UmVhZGVyIHRoZSByZXdyaXR0ZW4gcmVhZGVyIHRoYXQgcmVwbGFjZXMgdGhlbSBmb3IgdGhpcyByZWdpb24KICAgICAgKiBAcGFyYW0gbG93ZXJib3VuZCBpZiAhcmVzZXQsIG11c3QgYmUgbm9uLW51bGwsIGFuZCBtYXJrcyB0aGUgZXhjbHVzaXZlIGxvd2VyYm91bmQgb2YgdGhlIHN0YXJ0IGZvciBlYWNoIHNzdGFibGUKICAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgbW92ZVN0YXJ0cyhTU1RhYmxlUmVhZGVyIG5ld1JlYWRlciwgRGVjb3JhdGVkS2V5IGxvd2VyYm91bmQpCisgICAgcHJpdmF0ZSB2b2lkIG1vdmVTdGFydHMoRGVjb3JhdGVkS2V5IGxvd2VyYm91bmQpCiAgICAgewogICAgICAgICBpZiAodHJhbnNhY3Rpb24uaXNPZmZsaW5lKCkgfHwgcHJlZW1wdGl2ZU9wZW5JbnRlcnZhbCA9PSBMb25nLk1BWF9WQUxVRSkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBuZXdSZWFkZXIuc2V0dXBPbmxpbmUoKTsKLSAgICAgICAgTGlzdDxEZWNvcmF0ZWRLZXk+IGludmFsaWRhdGVLZXlzID0gbnVsbDsKLSAgICAgICAgaWYgKCFjYWNoZWRLZXlzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW52YWxpZGF0ZUtleXMgPSBuZXcgQXJyYXlMaXN0PD4oY2FjaGVkS2V5cy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8RGVjb3JhdGVkS2V5LCBSb3dJbmRleEVudHJ5PiBjYWNoZUtleSA6IGNhY2hlZEtleXMuZW50cnlTZXQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlS2V5cy5hZGQoY2FjaGVLZXkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIG5ld1JlYWRlci5jYWNoZUtleShjYWNoZUtleS5nZXRLZXkoKSwgY2FjaGVLZXkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjYWNoZWRLZXlzLmNsZWFyKCk7CiAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogdHJhbnNhY3Rpb24ub3JpZ2luYWxzKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIHdlIGNhbGwgZ2V0Q3VycmVudFJlcGxhY2VtZW50KCkgdG8gc3VwcG9ydCBtdWx0aXBsZSByZXdyaXRlcnMgb3BlcmF0aW5nIG92ZXIgdGhlIHNhbWUgc291cmNlIHJlYWRlcnMgYXQgb25jZS4KQEAgLTI0MSw0OSArMjA1LDE5IEBACiAgICAgICAgICAgICBpZiAobGF0ZXN0LmZpcnN0LmNvbXBhcmVUbyhsb3dlcmJvdW5kKSA+IDApCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgICAgIFJ1bm5hYmxlIHJ1bk9uQ2xvc2UgPSBpbnZhbGlkYXRlS2V5cyAhPSBudWxsID8gbmV3IEludmFsaWRhdGVLZXlzKGxhdGVzdCwgaW52YWxpZGF0ZUtleXMpIDogbnVsbDsKICAgICAgICAgICAgIGlmIChsb3dlcmJvdW5kLmNvbXBhcmVUbyhsYXRlc3QubGFzdCkgPj0gMCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoIXRyYW5zYWN0aW9uLmlzT2Jzb2xldGUobGF0ZXN0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChydW5PbkNsb3NlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVzdC5ydW5PbkNsb3NlKHJ1bk9uQ2xvc2UpOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uLm9ic29sZXRlKGxhdGVzdCk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBEZWNvcmF0ZWRLZXkgbmV3U3RhcnQgPSBsYXRlc3QuZmlyc3RLZXlCZXlvbmQobG93ZXJib3VuZCk7Ci0gICAgICAgICAgICBhc3NlcnQgbmV3U3RhcnQgIT0gbnVsbDsKLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVwbGFjZW1lbnQgPSBsYXRlc3QuY2xvbmVXaXRoTmV3U3RhcnQobmV3U3RhcnQsIHJ1bk9uQ2xvc2UpOwotICAgICAgICAgICAgdHJhbnNhY3Rpb24udXBkYXRlKHJlcGxhY2VtZW50LCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEludmFsaWRhdGVLZXlzIGltcGxlbWVudHMgUnVubmFibGUKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8S2V5Q2FjaGVLZXk+IGNhY2hlS2V5cyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmaW5hbCBXZWFrUmVmZXJlbmNlPEluc3RydW1lbnRpbmdDYWNoZTxLZXlDYWNoZUtleSwgPz4+IGNhY2hlUmVmOwotCi0gICAgICAgIHByaXZhdGUgSW52YWxpZGF0ZUtleXMoU1NUYWJsZVJlYWRlciByZWFkZXIsIENvbGxlY3Rpb248RGVjb3JhdGVkS2V5PiBpbnZhbGlkYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNhY2hlUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8PihyZWFkZXIuZ2V0S2V5Q2FjaGUoKSk7Ci0gICAgICAgICAgICBpZiAoY2FjaGVSZWYuZ2V0KCkgIT0gbnVsbCkKKyAgICAgICAgICAgIGlmICghdHJhbnNhY3Rpb24uaXNPYnNvbGV0ZShsYXRlc3QpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoRGVjb3JhdGVkS2V5IGtleSA6IGludmFsaWRhdGUpCi0gICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5cy5hZGQocmVhZGVyLmdldENhY2hlS2V5KGtleSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChLZXlDYWNoZUtleSBrZXkgOiBjYWNoZUtleXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSW5zdHJ1bWVudGluZ0NhY2hlPEtleUNhY2hlS2V5LCA/PiBjYWNoZSA9IGNhY2hlUmVmLmdldCgpOwotICAgICAgICAgICAgICAgIGlmIChjYWNoZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICBjYWNoZS5yZW1vdmUoa2V5KTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgbmV3U3RhcnQgPSBsYXRlc3QuZmlyc3RLZXlCZXlvbmQobG93ZXJib3VuZCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG5ld1N0YXJ0ICE9IG51bGw7CisgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZXBsYWNlbWVudCA9IGxhdGVzdC5jbG9uZVdpdGhOZXdTdGFydChuZXdTdGFydCk7CisgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24udXBkYXRlKHJlcGxhY2VtZW50LCB0cnVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI5MSw3ICsyMjUsMTAgQEAKICAgICBwdWJsaWMgdm9pZCBzd2l0Y2hXcml0ZXIoU1NUYWJsZVdyaXRlciBuZXdXcml0ZXIpCiAgICAgewogICAgICAgICBpZiAobmV3V3JpdGVyICE9IG51bGwpCi0gICAgICAgICAgICB3cml0ZXJzLmFkZChuZXdXcml0ZXIuc2V0TWF4RGF0YUFnZShtYXhBZ2UpKTsKKyAgICAgICAgeworICAgICAgICAgICAgbmV3V3JpdGVyLnNldE1heERhdGFBZ2UobWF4QWdlKTsKKyAgICAgICAgICAgIHdyaXRlcnMuYWRkKG5ld1dyaXRlcik7CisgICAgICAgIH0KIAogICAgICAgICBpZiAoZWFnZXJXcml0ZXJNZXRhUmVsZWFzZSAmJiB3cml0ZXIgIT0gbnVsbCkKICAgICAgICAgICAgIHdyaXRlci5yZWxlYXNlTWV0YWRhdGFPdmVyaGVhZCgpOwpAQCAtMzEwLDEyICsyNDcsMTUgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCisgICAgICAgIC8vIE9wZW4gZnVsbHkgY29tcGxldGVkIHNzdGFibGVzIGVhcmx5LiBUaGlzIGlzIGFsc28gcmVxdWlyZWQgZm9yIHRoZSBmaW5hbCBzc3RhYmxlIGluIGEgc2V0ICh3aGVyZSBuZXdXcml0ZXIKKyAgICAgICAgLy8gaXMgbnVsbCkgdG8gcGVybWl0IHRoZSBjb21waWxhdGlvbiBvZiBhIGNhbm9uaWNhbCBzZXQgb2Ygc3N0YWJsZXMgKHNlZSBWaWV3LnNlbGVjdCkuCiAgICAgICAgIGlmIChwcmVlbXB0aXZlT3BlbkludGVydmFsICE9IExvbmcuTUFYX1ZBTFVFKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyB3ZSBsZWF2ZSBpdCBhcyBhIHRtcCBmaWxlLCBidXQgd2Ugb3BlbiBpdCBhbmQgYWRkIGl0IHRvIHRoZSBUcmFja2VyCi0gICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHJlYWRlciA9IHdyaXRlci5zZXRNYXhEYXRhQWdlKG1heEFnZSkub3BlbkZpbmFsRWFybHkoKTsKKyAgICAgICAgICAgIHdyaXRlci5zZXRNYXhEYXRhQWdlKG1heEFnZSk7CisgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHJlYWRlciA9IHdyaXRlci5vcGVuRmluYWxFYXJseSgpOwogICAgICAgICAgICAgdHJhbnNhY3Rpb24udXBkYXRlKHJlYWRlciwgZmFsc2UpOwotICAgICAgICAgICAgbW92ZVN0YXJ0cyhyZWFkZXIsIHJlYWRlci5sYXN0KTsKKyAgICAgICAgICAgIG1vdmVTdGFydHMocmVhZGVyLmxhc3QpOwogICAgICAgICAgICAgdHJhbnNhY3Rpb24uY2hlY2twb2ludCgpOwogICAgICAgICB9CiAKQEAgLTM3MCw3ICszMTAsOSBAQAogICAgICAgICBmb3IgKFNTVGFibGVXcml0ZXIgd3JpdGVyIDogd3JpdGVycykKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0IHdyaXRlci5nZXRGaWxlUG9pbnRlcigpID4gMDsKLSAgICAgICAgICAgIHdyaXRlci5zZXRSZXBhaXJlZEF0KHJlcGFpcmVkQXQpLnNldE9wZW5SZXN1bHQodHJ1ZSkucHJlcGFyZVRvQ29tbWl0KCk7CisgICAgICAgICAgICB3cml0ZXIuc2V0UmVwYWlyZWRBdChyZXBhaXJlZEF0KTsKKyAgICAgICAgICAgIHdyaXRlci5zZXRPcGVuUmVzdWx0KHRydWUpOworICAgICAgICAgICAgd3JpdGVyLnByZXBhcmVUb0NvbW1pdCgpOwogICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSB3cml0ZXIuZmluaXNoZWQoKTsKICAgICAgICAgICAgIHRyYW5zYWN0aW9uLnVwZGF0ZShyZWFkZXIsIGZhbHNlKTsKICAgICAgICAgICAgIHByZXBhcmVkRm9yQ29tbWl0LmFkZChyZWFkZXIpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlU2ltcGxlVW5zb3J0ZWRXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVNpbXBsZVVuc29ydGVkV3JpdGVyLmphdmEKaW5kZXggM2IxZWQxYi4uMDg1MTU3NCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlU2ltcGxlVW5zb3J0ZWRXcml0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVTaW1wbGVVbnNvcnRlZFdyaXRlci5qYXZhCkBAIC04Myw3ICs4Myw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIHRvZG86IGluZWZmaWNpZW50IC0gd2UgY3JlYXRlIGFuZCBzZXJpYWxpemUgYSBQVSBqdXN0IHRvIGdldCBpdHMgc2l6ZSwgdGhlbiByZWNyZWF0ZSBpdAogICAgICAgICAgICAgLy8gdG9kbzogZWl0aGVyIGFsbG93IFBhcnRpdGlvblVwZGF0ZUJ1aWxkZXIgdG8gaGF2ZSAuYnVpbGQoKSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBvciBwcmUtY2FsY3VsYXRlIHRoZSBzaXplCi0gICAgICAgICAgICBjdXJyZW50U2l6ZSArPSBQYXJ0aXRpb25VcGRhdGUuc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShjcmVhdGVQYXJ0aXRpb25VcGRhdGVCdWlsZGVyKGtleSkuYnVpbGQoKSwgZm9ybWF0VHlwZS5pbmZvLmdldExhdGVzdFZlcnNpb24oKS5jb3JyZXNwb25kaW5nTWVzc2FnaW5nVmVyc2lvbigpKTsKKyAgICAgICAgICAgIGN1cnJlbnRTaXplICs9IFBhcnRpdGlvblVwZGF0ZS5zZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKGNyZWF0ZVBhcnRpdGlvblVwZGF0ZUJ1aWxkZXIoa2V5KS5idWlsZCgpLCBmb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpLmNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCkpOwogICAgICAgICAgICAgcHJldmlvdXMgPSBjcmVhdGVQYXJ0aXRpb25VcGRhdGVCdWlsZGVyKGtleSk7CiAgICAgICAgICAgICBidWZmZXIucHV0KGtleSwgcHJldmlvdXMpOwogICAgICAgICB9CkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgICAgIC8vIGltcHJvdmUgdGhhdC4gSW4gcGFydGljdWxhciwgd2hhdCB3ZSBjb3VudCBpcyBjbG9zZXIgdG8gdGhlIHNlcmlhbGl6ZWQgdmFsdWUsIGJ1dCBpdCdzIGRlYmF0YWJsZSB0aGF0IGl0J3MgdGhlIHJpZ2h0IHRoaW5nCiAgICAgICAgIC8vIHRvIGNvdW50IHNpbmNlIGl0IHdpbGwgdGFrZSBhIGxvdCBtb3JlIHNwYWNlIGluIG1lbW9yeSBhbmQgdGhlIGJ1ZmZlclNpemUgaWYgZmlyc3QgYW5kIGZvcmVtb3N0IHVzZWQgdG8gYXZvaWQgT09NIHdoZW4KICAgICAgICAgLy8gdXNpbmcgdGhpcyB3cml0ZXIuCi0gICAgICAgIGN1cnJlbnRTaXplICs9IFVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUocm93LCBoZWxwZXIsIDAsIGZvcm1hdFR5cGUuaW5mby5nZXRMYXRlc3RWZXJzaW9uKCkuY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb24oKSk7CisgICAgICAgIGN1cnJlbnRTaXplICs9IFVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUocm93LCBoZWxwZXIsIDAsIGZvcm1hdC5nZXRMYXRlc3RWZXJzaW9uKCkuY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb24oKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIG1heWJlU3luYygpIHRocm93cyBTeW5jRXhjZXB0aW9uCkBAIC0xODIsNyArMTgyLDEwIEBACiAgICAgICAgICAgICBpZiAoZGlza1dyaXRlci5leGNlcHRpb24gaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikKICAgICAgICAgICAgICAgICB0aHJvdyAoSU9FeGNlcHRpb24pIGRpc2tXcml0ZXIuZXhjZXB0aW9uOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGRpc2tXcml0ZXIuZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQoZGlza1dyaXRlci5leGNlcHRpb24pOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGRpc2tXcml0ZXIuZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjExLDcgKzIxNCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChiID09IFNFTlRJTkVMKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgKFNTVGFibGVUeG5Xcml0ZXIgd3JpdGVyID0gY3JlYXRlV3JpdGVyKCkpCisgICAgICAgICAgICAgICAgICAgIHRyeSAoU1NUYWJsZVR4bldyaXRlciB3cml0ZXIgPSBjcmVhdGVXcml0ZXIobnVsbCkpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PERlY29yYXRlZEtleSwgUGFydGl0aW9uVXBkYXRlLkJ1aWxkZXI+IGVudHJ5IDogYi5lbnRyeVNldCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoZW50cnkuZ2V0VmFsdWUoKS5idWlsZCgpLnVuZmlsdGVyZWRJdGVyYXRvcigpKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVNpbXBsZVdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlU2ltcGxlV3JpdGVyLmphdmEKaW5kZXggYzkzNTZhMy4uNzQ0ZjM1YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlU2ltcGxlV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlU2ltcGxlV3JpdGVyLmphdmEKQEAgLTIxLDcgKzIxLDggQEAKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uVXBkYXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKQEAgLTUxLDcgKzUyLDcgQEAKICAgICBwcml2YXRlIFNTVGFibGVUeG5Xcml0ZXIgZ2V0T3JDcmVhdGVXcml0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGlmICh3cml0ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHdyaXRlciA9IGNyZWF0ZVdyaXRlcigpOworICAgICAgICAgICAgd3JpdGVyID0gY3JlYXRlV3JpdGVyKG51bGwpOwogCiAgICAgICAgIHJldHVybiB3cml0ZXI7CiAgICAgfQpAQCAtODUsNyArODYsOSBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUod3JpdGVyID09IG51bGwgPyB0IDogd3JpdGVyLmFib3J0KHQpKTsKKyAgICAgICAgICAgIFRocm93YWJsZSBlID0gd3JpdGVyID09IG51bGwgPyB0IDogd3JpdGVyLmFib3J0KHQpOworICAgICAgICAgICAgVGhyb3dhYmxlcy50aHJvd0lmVW5jaGVja2VkKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVR4bldyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlVHhuV3JpdGVyLmphdmEKaW5kZXggODNjNTU0Mi4uZmFkN2Q1NCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlVHhuV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlVHhuV3JpdGVyLmphdmEKQEAgLTI4LDcgKzI4LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CkBAIC0xMTMsNyArMTEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJlcGFpcmVkQXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzVHJhbnNpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVGb3JtYXQuVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVGb3JtYXQ8PywgPz4gdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3N0YWJsZUxldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyKQogICAgIHsKQEAgLTE0NCwxMiArMTQzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzVHJhbnNpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNzdGFibGVMZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJbmRleD4gaW5kZXhlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248SW5kZXg+IGluZGV4ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlLk93bmVyIG93bmVyKQogICAgIHsKICAgICAgICAgLy8gaWYgdGhlIGNvbHVtbiBmYW1pbHkgc3RvcmUgZG9lcyBub3QgZXhpc3QsIHdlIGNyZWF0ZSBhIG5ldyBkZWZhdWx0IFNTVGFibGVNdWx0aVdyaXRlciB0byB1c2U6CiAgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IExpZmVjeWNsZVRyYW5zYWN0aW9uLm9mZmxpbmUoT3BlcmF0aW9uVHlwZS5XUklURSk7CiAgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3RvcihtZXRhZGF0YS5nZXQoKS5jb21wYXJhdG9yKS5zc3RhYmxlTGV2ZWwoc3N0YWJsZUxldmVsKTsKLSAgICAgICAgU1NUYWJsZU11bHRpV3JpdGVyIHdyaXRlciA9IFNpbXBsZVNTVGFibGVNdWx0aVdyaXRlci5jcmVhdGUoZGVzY3JpcHRvciwga2V5Q291bnQsIHJlcGFpcmVkQXQsIHBlbmRpbmdSZXBhaXIsIGlzVHJhbnNpZW50LCBtZXRhZGF0YSwgY29sbGVjdG9yLCBoZWFkZXIsIGluZGV4ZXMsIHR4bik7CisgICAgICAgIFNTVGFibGVNdWx0aVdyaXRlciB3cml0ZXIgPSBTaW1wbGVTU1RhYmxlTXVsdGlXcml0ZXIuY3JlYXRlKGRlc2NyaXB0b3IsIGtleUNvdW50LCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpc1RyYW5zaWVudCwgbWV0YWRhdGEsIGNvbGxlY3RvciwgaGVhZGVyLCBpbmRleGVzLCB0eG4sIG93bmVyKTsKICAgICAgICAgcmV0dXJuIG5ldyBTU1RhYmxlVHhuV3JpdGVyKHR4biwgd3JpdGVyKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVplcm9Db3B5V3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVaZXJvQ29weVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZTY0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVaZXJvQ29weVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRDaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZU5ld1RyYWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5Bc3luY1N0cmVhbWluZ0lucHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnk7CisKK3B1YmxpYyBjbGFzcyBTU1RhYmxlWmVyb0NvcHlXcml0ZXIgZXh0ZW5kcyBTU1RhYmxlIGltcGxlbWVudHMgU1NUYWJsZU11bHRpV3JpdGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNTVGFibGVaZXJvQ29weVdyaXRlci5jbGFzcyk7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIFNTVGFibGVSZWFkZXIgZmluYWxSZWFkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8Q29tcG9uZW50LlR5cGUsIFNlcXVlbnRpYWxXcml0ZXI+IGNvbXBvbmVudFdyaXRlcnM7CisKKyAgICBwdWJsaWMgU1NUYWJsZVplcm9Db3B5V3JpdGVyKEJ1aWxkZXI8PywgPz4gYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGUuT3duZXIgb3duZXIpCisgICAgeworICAgICAgICBzdXBlcihidWlsZGVyLCBvd25lcik7CisKKyAgICAgICAgbGlmZWN5Y2xlTmV3VHJhY2tlci50cmFja05ldyh0aGlzKTsKKyAgICAgICAgdGhpcy5jb21wb25lbnRXcml0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIGlmICghZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5zdHJlYW1pbmdDb21wb25lbnRzKCkuY29udGFpbnNBbGwoY29tcG9uZW50cykpCisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZm9ybWF0KCJVbnN1cHBvcnRlZCBzdHJlYW1pbmcgY29tcG9uZW50IGRldGVjdGVkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0cy5kaWZmZXJlbmNlKEltbXV0YWJsZVNldC5jb3B5T2YoY29tcG9uZW50cyksIGRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuc3RyZWFtaW5nQ29tcG9uZW50cygpKSkpOworCisgICAgICAgIGZvciAoQ29tcG9uZW50IGMgOiBjb21wb25lbnRzKQorICAgICAgICAgICAgY29tcG9uZW50V3JpdGVycy5wdXQoYy50eXBlLCBtYWtlV3JpdGVyKGRlc2NyaXB0b3IsIGMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IGdldEZpcnN0KCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgZ2V0TGFzdCgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQWJzdHJhY3RCb3VuZHM8VG9rZW4+IGdldEJvdW5kcygpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNlcXVlbnRpYWxXcml0ZXIgbWFrZVdyaXRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIENvbXBvbmVudCBjb21wb25lbnQpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFNlcXVlbnRpYWxXcml0ZXIoZGVzY3JpcHRvci5maWxlRm9yKGNvbXBvbmVudCksIGlvT3B0aW9ucy53cml0ZXJPcHRpb25zLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlKERhdGFJbnB1dFBsdXMgaW4sIGxvbmcgc2l6ZSwgU2VxdWVudGlhbFdyaXRlciBvdXQpIHRocm93cyBGU1dyaXRlRXJyb3IKKyAgICB7CisgICAgICAgIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDEgPDwgMjA7CisgICAgICAgIGxvbmcgYnl0ZXNSZWFkID0gMDsKKyAgICAgICAgYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoYnl0ZXNSZWFkIDwgc2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdG9SZWFkID0gKGludCkgTWF0aC5taW4oc2l6ZSAtIGJ5dGVzUmVhZCwgQlVGRkVSX1NJWkUpOworICAgICAgICAgICAgICAgIGluLnJlYWRGdWxseShidWZmLCAwLCB0b1JlYWQpOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IE1hdGgubWluKHRvUmVhZCwgQlVGRkVSX1NJWkUpOworICAgICAgICAgICAgICAgIG91dC53cml0ZShidWZmLCAwLCBjb3VudCk7CisgICAgICAgICAgICAgICAgYnl0ZXNSZWFkICs9IGNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LnN5bmMoKTsgLy8gZmluaXNoIHdpbGwgYWxzbyBjYWxsIHN5bmMoKS4gTGVhdmluZyBoZXJlIHRvIGdldCBzdHVmZiBmbHVzaGVkIGFzIGVhcmx5IGFzIHBvc3NpYmxlCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgb3V0LmdldEZpbGUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBhcHBlbmQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbikKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IGZpbmlzaChsb25nIHJlcGFpcmVkQXQsIGxvbmcgbWF4RGF0YUFnZSwgYm9vbGVhbiBvcGVuUmVzdWx0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZpbmlzaChvcGVuUmVzdWx0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBmaW5pc2goYm9vbGVhbiBvcGVuUmVzdWx0KQorICAgIHsKKyAgICAgICAgc2V0T3BlblJlc3VsdChvcGVuUmVzdWx0KTsKKworICAgICAgICBmb3IgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyIDogY29tcG9uZW50V3JpdGVycy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHdyaXRlci5maW5pc2goKTsKKworICAgICAgICByZXR1cm4gZmluaXNoZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBmaW5pc2hlZCgpCisgICAgeworICAgICAgICBpZiAoZmluYWxSZWFkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGZpbmFsUmVhZGVyID0gU1NUYWJsZVJlYWRlci5vcGVuKG93bmVyKCkub3JFbHNlKG51bGwpLCBkZXNjcmlwdG9yLCBjb21wb25lbnRzLCBtZXRhZGF0YSk7CisKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoZmluYWxSZWFkZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTU1RhYmxlTXVsdGlXcml0ZXIgc2V0T3BlblJlc3VsdChib29sZWFuIG9wZW5SZXN1bHQpCisgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRGaWxlUG9pbnRlcigpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGFibGVJZCBnZXRUYWJsZUlkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtZXRhZGF0YS5pZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGhyb3dhYmxlIGNvbW1pdChUaHJvd2FibGUgYWNjdW11bGF0ZSkKKyAgICB7CisgICAgICAgIGZvciAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgOiBjb21wb25lbnRXcml0ZXJzLnZhbHVlcygpKQorICAgICAgICAgICAgYWNjdW11bGF0ZSA9IHdyaXRlci5jb21taXQoYWNjdW11bGF0ZSk7CisgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUaHJvd2FibGUgYWJvcnQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCisgICAgeworICAgICAgICBmb3IgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyIDogY29tcG9uZW50V3JpdGVycy52YWx1ZXMoKSkKKyAgICAgICAgICAgIGFjY3VtdWxhdGUgPSB3cml0ZXIuYWJvcnQoYWNjdW11bGF0ZSk7CisgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXBhcmVUb0NvbW1pdCgpCisgICAgeworICAgICAgICBmb3IgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyIDogY29tcG9uZW50V3JpdGVycy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHdyaXRlci5wcmVwYXJlVG9Db21taXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBmb3IgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyIDogY29tcG9uZW50V3JpdGVycy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlQ29tcG9uZW50KENvbXBvbmVudC5UeXBlIHR5cGUsIERhdGFJbnB1dFBsdXMgaW4sIGxvbmcgc2l6ZSkgdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvZ2dlci5pbmZvKCJXcml0aW5nIGNvbXBvbmVudCB7fSB0byB7fSBsZW5ndGgge30iLCB0eXBlLCBjb21wb25lbnRXcml0ZXJzLmdldCh0eXBlKS5nZXRQYXRoKCksIHByZXR0eVByaW50TWVtb3J5KHNpemUpKTsKKworICAgICAgICBpZiAoaW4gaW5zdGFuY2VvZiBBc3luY1N0cmVhbWluZ0lucHV0UGx1cykKKyAgICAgICAgICAgIHdyaXRlKChBc3luY1N0cmVhbWluZ0lucHV0UGx1cykgaW4sIHNpemUsIGNvbXBvbmVudFdyaXRlcnMuZ2V0KHR5cGUpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd3JpdGUoaW4sIHNpemUsIGNvbXBvbmVudFdyaXRlcnMuZ2V0KHR5cGUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGUoQXN5bmNTdHJlYW1pbmdJbnB1dFBsdXMgaW4sIGxvbmcgc2l6ZSwgU2VxdWVudGlhbFdyaXRlciB3cml0ZXIpIHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb2dnZXIuaW5mbygiQmxvY2sgV3JpdGluZyBjb21wb25lbnQgdG8ge30gbGVuZ3RoIHt9Iiwgd3JpdGVyLmdldFBhdGgoKSwgcHJldHR5UHJpbnRNZW1vcnkoc2l6ZSkpOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpbi5jb25zdW1lKHdyaXRlcjo6d3JpdGVEaXJlY3RseVRvQ2hhbm5lbCwgc2l6ZSk7CisgICAgICAgICAgICB3cml0ZXIuc3luYygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFT0ZFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBGU1dyaXRlRXJyb3IgdHJpZ2dlcnMgZGlzayBmYWlsdXJlIHBvbGljeSwgYnV0IGlmIHdlIGdldCBhIGNvbm5lY3Rpb24gaXNzdWUgd2UgZG8gbm90IHdhbnQgdG8gZG8gdGhhdAorICAgICAgICAgICAgLy8gc28gcmV0aHJvdyBzbyB0aGUgZXJyb3IgaGFuZGxpbmcgbG9naWMgaGlnaGVyIHVwIGlzIGFibGUgdG8gZGVhbCB3aXRoIHRoaXMKKyAgICAgICAgICAgIC8vIHNlZSBDQVNTQU5EUkEtMTcxMTYKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgd3JpdGVyLmdldFBhdGgoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVfQVBJLm1kIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlX0FQSS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTA0NDA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlX0FQSS5tZApAQCAtMCwwICsxLDI2MiBAQAorIyBTU1RhYmxlIEFQSQorCitbQ0VQLTE3XShodHRwczovL2N3aWtpLmFwYWNoZS5vcmcvY29uZmx1ZW5jZS9kaXNwbGF5L0NBU1NBTkRSQS9DRVAtMTclM0ErU1NUYWJsZStmb3JtYXQrQVBJKSAKKy8gW0NBU1NBTkRSQS0xNzA1Nl0oaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTcwNTYpCisKKyMjIFNTVGFibGUgZm9ybWF0CisKK1NTVGFibGUgZm9ybWF0IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBgU1NUYWJsZUZvcm1hdGAgaW50ZXJmYWNlLiBJdCBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgcmVhZGVycywgd3JpdGVycywKK3NjcnViYmVycywgdmVyaWZpZXJzLCBhbmQgb3RoZXIgY29tcG9uZW50cyBmb3IgcHJvY2Vzc2luZyB0aGUgc3N0YWJsZXMuIEFuIFNTVGFibGUgZm9ybWF0IGltcGxlbWVudGF0aW9uIGNvbWVzIHdpdGggCithIGZhY3RvcnkgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBgU1NUYWJsZUZvcm1hdC5GYWN0b3J5YCBpbnRlcmZhY2UuIFRoZSBmYWN0b3J5IGlzIHJlcXVpcmVkIHRvIHByb3ZpZGUgYSB1bmlxdWUgbmFtZSAKK29mIHRoZSBpbXBsZW1lbnRhdGlvbiBhbmQgYSBtZXRob2QgZm9yIGNyZWF0aW5nIHRoZSBmb3JtYXQgaW5zdGFuY2UuCisKKyMjIENvbmZpZ3VyYXRpb24gc3BlY2lmaWNhdGlvbgorCitTU1RhYmxlIGZvcm1hdCBmYWN0b3JpZXMgYXJlIGRpc2NvdmVyZWQgdXNpbmcgCitbSmF2YSBTZXJ2aWNlIExvYWRlcl0oaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvamF2YS91dGlsL1NlcnZpY2VMb2FkZXIuaHRtbCkgbWVjaGFuaXNtLiBUaGUgbG9hZGVkIAorZm9ybWF0IGltcGxlbWVudGF0aW9ucyBjYW4gYmUgdXNlZCB0byByZWFkIHRoZSBleGlzdGluZyBzc3RhYmxlcy4gVGhlIHdyaXRlIGZvcm1hdCBpcyBjaG9zZW4gYmFzZWQgb24gdGhlIGNvbmZpZ3VyYXRpb24uIAorSWYgaXQgaXMgbm90IHNwZWNpZmllZCwgYEJpZ0Zvcm1hdGAgaW1wbGVtZW50YXRpb24gaXMgYXNzdW1lZC4gCisKK09wdGlvbmFsIFNTVGFibGUgZm9ybWF0cyBjb25maWd1cmF0aW9uIGNhbiBiZSBzdXBwbGllZCBpbiB0aGUgX2Nhc3NhbmRyYS55YW1sXyBmaWxlIHVuZGVyIHRoZSBgc3N0YWJsZWAga2V5LiAKKworYGBgeWFtbAorc3N0YWJsZToKKyAgc2VsZWN0ZWRfZm9ybWF0OiDijKluYW1lIG9mIHRoZSBkZWZhdWx0IFNTVGFibGVGb3JtYXQgaW1wbGVtZW50YXRpb27ijKoKKyAgZm9ybWF0OgorICAgIOKMqWZvcm1hdDEgbmFtZeKMqjoKKyAgICAgIHBhcmFtMTog4oypZm9ybWF0IHNwZWNpZmljIHBhcmFtZXRlciAx4oyqCisgICAgICBwYXJhbTI6IOKMqWZvcm1hdCBzcGVjaWZpYyBwYXJhbWV0ZXIgMuKMqgorICAgICAgIyAuLi4KKyAgICDijKlmb3JtYXQyIG5hbWXijKo6CisgICAgICBwYXJhbTE6IOKMqWZvcm1hdCBzcGVjaWZpYyBwYXJhbWV0ZXIgMeKMqgorICAgICAgcGFyYW0yOiDijKlmb3JtYXQgc3BlY2lmaWMgcGFyYW1ldGVyIDLijKoKKyAgICAgICMgLi4uCisgICAgIyAuLi4gICAgICAKK2BgYAorCitFYWNoIGltcGxlbWVudGF0aW9uIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lIHRoYXQgaXMgdXNlZCB0byB1bmFub25pbW91c2x5IGlkZW50aWZ5IHRoZSBmb3JtYXQuIFRoZSBuYW1lIG11c3QgYmUgCitjb25zaXN0ZW50bHkgcmV0dXJuZWQgYnkgYG5hbWUoKWAgbWV0aG9kcyBpbiB0aGUgYFNTVGFibGVGb3JtYXRgIGFuZCBgU1NUYWJsZUZvcm1hdC5GYWN0b3J5YCBpbXBsZW1lbnRhdGlvbnMuIEl0IG11c3QgCitpbmNsdWRlIG9ubHkgbG93ZXJjYXNlIEFTQ0lJIGxldHRlcnMuCisKK1BhcmFtZXRlcnMgc3BlY2lmaWVkIHVuZGVyIHRoZSBrZXkgbmFtZWQgYWZ0ZXIgdGhlIGZvcm1hdCBuYW1lIGFyZSBwYXNzZWQgdG8gdGhlIGZhY3RvcnkgbWV0aG9kIG9mIHRoZSBjb3JyZXNwb25kaW5nCitpbXBsZW1lbnRhdGlvbi4gQWxsIG9mIHRob3NlIHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsIGFuZCBkZXBlbmQgb24gdGhlIGltcGxlbWVudGF0aW9uLgorCitUaGUgYXNzdW1lZCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gLSB3aGljaCBpcyBlcXVpdmFsZW50IHRvIGVtcHR5IGNvbmZpZ3VyYXRpb246CitgYGB5YW1sCitzc3RhYmxlOgorICBzZWxlY3RlZF9mb3JtYXQ6IGJpZworYGBgCisKK0V4YW1wbGUgY29uZmlndXJhdGlvbiB3aGljaCB1c2VzIGBidGlgIGFzIHRoZSBkZWZhdWx0OgorYGBgeWFtbAorc3N0YWJsZToKKyAgc2VsZWN0ZWRfZm9ybWF0OiBidGkKKyAgZm9ybWF0OgorICAgIGJpZzoKKyAgICAgIHBhcmFtMTogdmFsdWUxCisgICAgICBwYXJhbTI6IHZhbHVlMgorICAgIGJ0aToKKyAgICAgIHBhcmFtMTogdmFsdWUxCisgICAgICBwYXJhbTI6IHZhbHVlMgorCitgYGAKKworIyMgQ29tcG9uZW50cworCitFYWNoIHNzdGFibGUgY29uc2lzdHMgb2YgYSBzZXQgb2YgY29tcG9uZW50cyAtIHJlcXVpcmVkIGFuZCBvcHRpb25hbC4gQSBjb21wb25lbnQgY29uc3RpdHV0ZXMgYW4gaWRlbnRpZmllciByZXF1aXJlZCAKK3RvIG9idGFpbiB0aGUgZXhhY3QgZmlsZSB3aXRoIGFuIHNzdGFibGUgZGVzY3JpcHRvci4gQ29tcG9uZW50cyBhcmUgZ3JvdXBlZCBieSB0eXBlLiBBIHR5cGUgbWF5IGRlZmluZSBlaXRoZXIgCithIHNpbmdsZXRvbiBjb21wb25lbnQgKGZvciBleGFtcGxlLCBfc3RhdHNfIGNvbXBvbmVudCkgb3IgYSBub24tc2luZ2xldG9uIGNvbXBvbmVudCAoZm9yIGV4YW1wbGUsIF9zZWNvbmRhcnkgaW5kZXhfIAorY29tcG9uZW50KS4KKworQSBzZXQgb2YgZ2VuZXJpYyB0eXBlcyBvZiBjb21wb25lbnRzIHRoYXQgYXJlIHRob3VnaHQgb2YgYXMgY29tbW9uIHRvIGFsbCB0aGUgc3N0YWJsZSBpbXBsZW1lbnRhdGlvbnMgaXMgZGVmaW5lZCBpbiB0aGUgCitbYFNTVGFibGVGb3JtYXQuQ29tcG9uZW50c2BdKGZvcm1hdC9TU1RhYmxlRm9ybWF0LmphdmEpIGNsYXNzLiBUaGV5IGluY2x1ZGUgc2luZ2xldG9uIHR5cGVzIGxpa2UgYERBVEFgLCAKK2BDT01QUkVTU0lPTl9JTkZPYCwgYFNUQVRTYCwgYEZJTFRFUmAsIGBESUdFU1RgLCBgQ1JDYCwgYW5kIGBUT0NgLCB3aGljaCBjb21lcyB3aXRoIHByZWRlZmluZWQgc2luZ2xldG9uIGNvbXBvbmVudCAKK2luc3RhbmNlcywgYXMgd2VsbCBhcyBub24tc2luZ2xldG9uIHR5cGVzIGxpa2UgYFNFQ09OREFSWV9JTkRFWGAgYW5kIGBDVVNUT01gLgorCitBcGFydCBmcm9tIHRoZSBnZW5lcmljIGNvbXBvbmVudHMsIGVhY2ggc3N0YWJsZSBmb3JtYXQgaW1wbGVtZW50YXRpb24gbWF5IGRlc2NyaWJlIGl0cyBzcGVjaWZpYyBjb21wb25lbnQgdHlwZXMuCitGb3IgZXhhbXBsZSwgdGhlIF9iaWcgdGFibGVfIGZvcm1hdCBkZXNjcmliZXMgYWRkaXRpb25hbGx5IGBQUklNQVJZX0lOREVYYCBhbmQgYFNVTU1BUllgIHNpbmdsZXRvbiB0eXBlcyBhbmQgCit0aGUgY29ycmVzcG9uZGluZyBzaW5nbGV0b24gY29tcG9uZW50cyAoc2VlIFtgQmlnRm9ybWF0LkNvbXBvbmVudHNgXShmb3JtYXQvYmlnL0JpZ0Zvcm1hdC5qYXZhKSkuCisKK0N1c3RvbSB0eXBlcyBjYW4gYmUgY3JlYXRlZCB3aXRoIG9uZSBvZiB0aGUgYENvbXBvbmVudC5UeXBlLmNyZWF0ZShuYW1lLCByZXByLCBmb3JtYXRDbGFzcylgLAorYENvbXBvbmVudC5UeXBlLmNyZWF0ZVNpbmdsZXRvbihuYW1lLCByZXByLCBmb3JtYXRDbGFzcylgIG1ldGhvZHMuIEVhY2ggY3JlYXRlZCB0eXBlIGlzIHJlZ2lzdGVyZWQgaW4gYSBnbG9iYWwgdHlwZXMnCityZWdpc3RyeS4gVHlwZXMgcmVnaXN0cnkgaXMgaGllcmFyY2hpY2FsIHdoaWNoIG1lYW5zIHRoYXQgYW4gc3N0YWJsZSBpbXBsZW1lbnRhdGlvbiBtYXkgdXNlIHR5cGVzIGRlZmluZWQgZm9yIGl0cworZm9ybWF0IGNsYXNzIGFuZCBmb3IgYWxsIHBhcmVudCBmb3JtYXQgY2xhc3NlcyAoZm9yIGV4YW1wbGUsIHRoZSB0eXBlcyBkZWZpbmVkIGZvciB0aGUgYEJpZ0Zvcm1hdGAgY2xhc3MgZXh0ZW5kIHRoZSBzZXQKK29mIHR5cGVzIGRlZmluZWQgZm9yIHRoZSBgU1NUYWJsZUZvcm1hdGAgaW50ZXJmYWNlKS4KKworRm9yIGV4YW1wbGUsIHR5cGVzIGRlZmluZWQgZm9yIGBCaWdGb3JtYXRgOgorCitgYGBqYXZhCitwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVzIGV4dGVuZHMgU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzLlR5cGVzCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnQuVHlwZSBQUklNQVJZX0lOREVYID0gQ29tcG9uZW50LlR5cGUuY3JlYXRlU2luZ2xldG9uKCJQUklNQVJZX0lOREVYIiwgIkluZGV4LmRiIiwgQmlnRm9ybWF0LmNsYXNzKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudC5UeXBlIFNVTU1BUlkgPSBDb21wb25lbnQuVHlwZS5jcmVhdGVTaW5nbGV0b24oIlNVTU1BUlkiLCAiU3VtbWFyeS5kYiIsIEJpZ0Zvcm1hdC5jbGFzcyk7Cit9CitgYGAKKworU2luZ2xldG9uIGNvbXBvbmVudHMgYXJlIGltbWVkaWF0ZWx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2luZ2xldG9uIHR5cGVzIGFuZCByZXRyaWV2ZWQgd2l0aCB0aGUgYDx0eXBlPi5nZXRTaW5nbGV0b24oKWAgCittZXRob2Q6CisKK2BgYGphdmEKK3B1YmxpYyBzdGF0aWMgY2xhc3MgQ29tcG9uZW50cyBleHRlbmRzIEFic3RyYWN0U1NUYWJsZUZvcm1hdC5Db21wb25lbnRzCit7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgUFJJTUFSWV9JTkRFWCA9IFR5cGVzLlBSSU1BUllfSU5ERVguZ2V0U2luZ2xldG9uKCk7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgU1VNTUFSWSA9IFR5cGVzLlNVTU1BUlkuZ2V0U2luZ2xldG9uKCk7Cit9CitgYGAKKworTm9uLXNpbmdsZXRvbiBjb21wb25lbnRzIGFyZSBjcmVhdGVkIGV4cGxpY2l0bHkgYXMgZm9sbG93czoKKworYGBgamF2YQorQ29tcG9uZW50IGlkeDEgPSBUeXBlcy5TRUNPTkRBUllfSU5ERVguY3JlYXRlQ29tcG9uZW50KCJTSV9pZHgxLmRiIik7CitgYGAKKworIyMgSW1wbGVtZW50YXRpb24KKworV2Ugc3Ryb25nbHkgc3VnZ2VzdCB0aGUgbWFpbiBmb3JtYXQgY2xhc3MgdG8gZXh0ZW5kIFtgQWJzdHJhY3RTU1RhYmxlRm9ybWF0YF0oZm9ybWF0L0Fic3RyYWN0U1NUYWJsZUZvcm1hdC5qYXZhKSBiZWNhdXNlIAoraXQgaW5jbHVkZXMgdGhlIGV4cGVjdGVkIGltcGxlbWVudGF0aW9uIG9mIGEgY291cGxlIG9mIG1ldGhvZHMgdGhhdCBzaG91bGQgbm90IGJlIHJlaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkuCisKKyMjIyBJbml0aWFsaXphdGlvbiAKKworQ2Fzc2FuZHJhIGVpdGhlciBpbml0aWFsaXplcyB0aGUgc3N0YWJsZSBmb3JtYXQgY2xhc3MgYXMgYSBzaW5nbGV0b24gYnkgY2FsbGluZyBpdHMgY29uc3RydWN0b3Igb3Igb2J0YWlucyB0aGUgaW5zdGFuY2UgCitieSBhY2Nlc3NpbmcgYSBzdGF0aWMgZmllbGQgY2FsbGVkIGBpbnN0YW5jZWAgaW4gdGhlIGNsYXNzLiBBcyBhIHBhcnQgb2YgdGhlIGluaXRpYWxpemF0aW9uLCBDYXNzYW5kcmEgY2FsbHMgdGhlIGBzZXR1cGAgCittZXRob2QgYW5kIHByb3ZpZGVzIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuIFJpZ2h0IGFmdGVyIGluaXRpYWxpemF0aW9uLCBDYXNzYW5kcmEgY2FsbHMgdGhlIGBhbGxDb21wb25lbnRzYCBtZXRob2QgCit0byBjb25maXJtIGFsbCB0aGUgY29tcG9uZW50cyBkZWZpbmVkIGZvciB0aGUgZm9ybWF0IGFyZSBpbml0aWFsaXplZCBhbmQgdXNhYmxlLgorCisjIyMgUHJlZGVmaW5lZCBzZXRzIG9mIGNvbXBvbmVudHMKKworU1NUYWJsZSBmb3JtYXQgZGVmaW5lcyBhIGNvdXBsZSBvZiBjb2xsZWN0aW9ucyBvZiBjb21wb25lbnRzLiBZb3Ugc2hvdWxkIGRlY2xhcmUgdGhvc2UgY29sbGVjdGlvbnMgYXMgY29uc3RhbnQgYW5kIAoraW1tdXRhYmxlIHNldHMuCisKKyMjIyBSZWFkZXIKKworIyMjIyBDb25zdHJ1Y3Rpb24KKworQW4gc3N0YWJsZSByZWFkZXIgKFtgU1NUYWJsZVJlYWRlcmBdKGZvcm1hdC9TU1RhYmxlUmVhZGVyLmphdmEpKSBpcyByZXNwb25zaWJsZSBmb3IgcmVhZGluZyB0aGUgZGF0YSBmcm9tIGFuIHNzdGFibGUuIAorSXQgaXMgY3JlYXRlZCBieSBhIF9zaW1wbGUgYnVpbGRlcl8gKFtgU1NUYWJsZVJlYWRlci5CdWlsZGVyYF0oZm9ybWF0L1NTVGFibGVSZWFkZXIuamF2YSkpIG9yIGEgX2xvYWRpbmcgCitidWlsZGVyXyAoW2BTU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXJgXShmb3JtYXQvU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyLmphdmEpKS4gVGhlIGJ1aWxkZXJzIGFyZSBzdXBwbGllZCBieSAKK2EgX3JlYWRlciBmYWN0b3J5XyAoW2BTU1RhYmxlRm9ybWF0LlNTVGFibGVSZWFkZXJGYWN0b3J5YF0oZm9ybWF0L1NTVGFibGVGb3JtYXQuamF2YSkpLgorCitUaGUgY29uc3RydWN0b3Igb2YgYSBwYXJ0aWN1bGFyIGBTU1RhYmxlUmVhZGVyYCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYWNjZXB0IHR3byBwYXJhbWV0ZXJzIC0gb25lIGlzIHRoZSBmb3JtYXQtc3BlY2lmaWMKK19zaW1wbGUgYnVpbGRlcl8gYW5kIHRoZSBvdGhlciBvbmUgaXMgYW4gc3N0YWJsZSBvd25lciAodXN1YWxseSBhIGBDb2x1bW5GYW1pbHlTdG9yZWAgaW5zdGFuY2UsIGJ1dCBpdCBjYW4gYmUgbnVsbCAKK2VpdGhlcikuIFRoZSBjb25zdHJ1Y3RvciBzaG91bGQgYmUgc2ltcGxlIGFuZCBub3QgZG8gYW55dGhpbmcgYnV0IGFzc2lnbiBpbnRlcm5hbCBmaWVsZHMgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgYnVpbGRlci4KKworQSBzaW1wbGUgYnVpbGRlciBkb2VzIG5vdCBwZXJmb3JtIGFueSBsb2dpYyBleGNlcHQgYmFzaWMgdmFsaWRhdGlvbiAtIGl0IG9ubHkgc3RvcmVzIHRoZSBwcm92aWRlZCB2YWx1ZXMgdGhlIHJlYWRlciAKK2NvbnN0cnVjdG9yIGNhbiBhY2Nlc3MuIEEgbmV3IHJlYWRlciBpbXBsZW1lbnRhdGlvbiBzaG91bGQgaW5jbHVkZSBhIHB1YmxpYyBzdGF0aWMgc2ltcGxlIGJ1aWxkZXIgaW5uZXIgY2xhc3MgdGhhdCAKK2V4dGVuZHMgdGhlIGBTU1RhYmxlUmVhZGVyLkJ1aWxkZXJgIGdlbmVyaWMgcmVhZGVyIGJ1aWxkZXIgKG9yIGBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlci5CdWlsZGVyYCwgc2VlIFtiZWxvd10oI2ZpbHRlcikpLgorCitJbiBjb250cmFzdCB0byB0aGUgc2ltcGxlIGJ1aWxkZXIsIGEgbG9hZGluZyBidWlsZGVyIGNhbiBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucyBsaWtlIG1vcmUgY29tcGxleCB2YWxpZGF0aW9uLCAKK29wZW5pbmcgcmVzb3VyY2VzLCBsb2FkaW5nIGNhY2hlcywgaW5kZXhlcywgZmlsdGVycywgZXRjLiBJdCBpbnRlcm5hbGx5IGNyZWF0ZXMgYSBzaW1wbGUgYnVpbGRlciBhbmQgZXZlbnR1YWxseSAKK2luc3RhbnRpYXRlcyBhIHJlYWRlci4KKworIyMjIyBHZW5lcmFsIG5vdGVzCisKK05vdGUgdGhhdCBpZiB0aGUgYnVpbGRlciBjYXJyaWVzIHNvbWUgY2xvc2VhYmxlIHJlc291cmNlcyB0byB0aGUgcmVhZGVyLCB0aGV5IHNob3VsZCBiZSByZXR1cm5lZCBieSB0aGUgYHNldHVwSW5zdGFuY2VgIAorbWV0aG9kLgorCitZb3Ugd2lsbCBmaW5kIHNvbWUgYGNsb25lWFhYYCBtZXRob2RzIHRvIGltcGxlbWVudCAtIHJlbWVtYmVyIHRvIGNyZWF0ZSBhIHJlYWRlciBjbG9uZSBpbiBhIGxhbWJkYSBwYXNzZWQgdG8gCit0aGUgYHJ1bldpdGhMb2NrKClgIG1ldGhvZC4KKworIyMjIyBVbmJ1aWxkaW5nCitJdCBpcyBjb252ZW5pZW50IHRvIGltcGxlbWVudCB0aGUgYHVuYnVpbGRUb2AgbWV0aG9kLCB3aGljaCB0YWtlcyBhIF9zaW1wbGUgYnVpbGRlcl8gYW5kIGluaXRpYWxpemVzIGl0IHNvIHRoYXQKK3RoZSBidWlsZGVyIGNhbiBwcm9kdWNlIHRoZSBzYW1lIHJlYWRlci4gVGhlIG1ldGhvZCBzaG91bGQgYWxzbyB0YWtlIHRoZSBgc2hhcmVkQ29weWAgYm9vbGVhbiBhcmd1bWVudCBkZW5vdGluZyB3aGV0aGVyCitpdCBzaG91bGQgY29weSB0aGUgZmllbGRzIHJlZmVyZW5jaW5nIGNsb3NlYWJsZSByZXNvdXJjZXMgdG8gdGhlIGJ1aWxkZXIgZGlyZWN0bHkgb3IgYXMgKHNoYXJlZCkgY29waWVzLiBUaGUgY29udmVudGlvbgorYWxzbyByZXF1aXJlcyBjb3B5aW5nIHRoZSByZXNvdXJjZXMgb25seSBpZiB0aGV5IGFyZSB1bnNldCBpbiB0aGUgYnVpbGRlciAodGhlIGZpZWxkIGlzIG51bGwpLiBUaGUgbWV0aG9kIHNob3VsZCBjYWxsCit0aGUgYHN1cGVyLnVuYnVpbGRUb2AgbWV0aG9kIGFzIGEgZmlyc3Qgc3RlcCBzbyB0aGF0IGFsbCB0aGUgZmllbGRzIG1hbmFnZWQgYnkgdGhlIHBhcmVudCBjbGFzcyBhcmUgY29waWVkIGFuZCBpbgordGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBvbmx5IHRoZSBmaWVsZHMgc3BlY2lmaWMgdG8gdGhpcyBmb3JtYXQgaGF2ZSB0byBiZSBhc3NpZ25lZC4KKworRm9yIGV4YW1wbGUsIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGF0IG1ldGhvZCBpbiBhIHJlYWRlciBmb3IgdGhlIF9iaWcgdGFibGVfIGZvcm1hdCBpcyBhcyBmb2xsb3dzOgorCitgYGBqYXZhCitwcm90ZWN0ZWQgZmluYWwgQnVpbGRlciB1bmJ1aWxkVG8oQnVpbGRlciBidWlsZGVyLCBib29sZWFuIHNoYXJlZENvcHkpCit7CisgICAgQnVpbGRlciBiID0gc3VwZXIudW5idWlsZFRvKGJ1aWxkZXIsIHNoYXJlZENvcHkpOworICAgIGlmIChidWlsZGVyLmdldEluZGV4RmlsZSgpID09IG51bGwpCisgICAgICAgIGIuc2V0SW5kZXhGaWxlKHNoYXJlZENvcHkgPyBzaGFyZWRDb3B5T3JOdWxsKGlmaWxlKSA6IGlmaWxlKTsKKyAgICBpZiAoYnVpbGRlci5nZXRJbmRleFN1bW1hcnkoKSA9PSBudWxsKQorICAgICAgICBiLnNldEluZGV4U3VtbWFyeShzaGFyZWRDb3B5ID8gc2hhcmVkQ29weU9yTnVsbChpbmRleFN1bW1hcnkpIDogaW5kZXhTdW1tYXJ5KTsKKworICAgIGIuc2V0S2V5Q2FjaGUoa2V5Q2FjaGUpOworCisgICAgcmV0dXJuIGI7Cit9CitgYGAKKworIyMjIyBGaWx0ZXIKKworSWYgdGhlIHNzdGFibGUgaW5jbHVkZXMgYSBfZmlsdGVyXywgdGhlIHJlYWRlciBjbGFzcyBzaG91bGQgZXh0ZW5kIAordGhlIFtgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXJgXShmb3JtYXQvU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIuamF2YSkgYWJzdHJhY3QgcmVhZGVyIChhbmQgaXRzIF9zaW1wbGUgYnVpbGRlcl8gc2hvdWxkIAorZXh0ZW5kIHRoZSBgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIuU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXJCdWlsZGVyYCBidWlsZGVyKS4KKworVGhlIHJlYWRlciB3aXRoIGZpbHRlciBwcm92aWRlcyB0aGUgYGlzUHJlc2VudEluRmlsdGVyYCBtZXRob2QgZm9yIGV4dGVuZGluZyBpbXBsZW1lbnRhdGlvbi4gSXQgYWxzbyBpbXBsZW1lbnRzIG90aGVyIAorZmlsdGVyLXNwZWNpZmljIG1ldGhvZHMgdGhlIHN5c3RlbSByZWxpZXMgb24gaWYgdGhlIGltcGxlbWVudGVkIHJlYWRlciBleHRlbmRzIHRoYXQgY2xhc3MuCisKK05vdGUgdGhhdCBpZiB0aGUgaW1wbGVtZW50ZWQgcmVhZGVyIGV4dGVuZHMgdGhlIGBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlcmAgY2xhc3MsIGl0IHNob3VsZCBpbmNsdWRlIHRoZSBgRklMVEVSYCAKK2NvbXBvbmVudCBpbiB0aGUgYXBwcm9wcmlhdGUgY29tcG9uZW50IHNldHMuCisKK1RoZSByZWFkZXIgd2l0aCBmaWx0ZXIgaW1wbGVtZW50YXRpb24gY29tZXMgd2l0aCBhZGRpdGlvbmFsIFttZXRyaWNzXShmaWx0ZXIvQmxvb21GaWx0ZXJNZXRyaWNzLmphdmEpIC0gcmVhZCBtb3JlIGFib3V0IGN1c3RvbQorbWV0cmljcyBzdXBwb3J0IFtoZXJlXSgjbWV0cmljcykuCisKKyMjIyMgSW5kZXggc3VtbWFyeQorCitTb21lIHNzdGFibGUgZm9ybWF0IGltcGxlbWVudGF0aW9ucywgc3VjaCBhcyBfYmlnIHRhYmxlXyBmb3JtYXQsIG1heSB1c2UgX2luZGV4IHN1bW1hcmllc18uIElmIGEgcmVhZGVyIHVzZXMgX2luZGV4IAorc3VtbWFyaWVzXyBpdCBzaG91bGQgaW1wbGVtZW50IHRoZSBbYEluZGV4U3VtbWFyeVN1cHBvcnRgXShpbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5U3VwcG9ydC5qYXZhKSBpbnRlcmZhY2UuIAorCitUaGUgc3VwcG9ydCBmb3IgX2luZGV4IHN1bW1hcmllc18gY29tZXMgd2l0aCBhZGRpdGlvbmFsIFttZXRyaWNzXShpbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5TWV0cmljcy5qYXZhKSAtIHJlYWQgbW9yZSAKK2Fib3V0IGN1c3RvbSBtZXRyaWNzIHN1cHBvcnQgW2hlcmVdKCNtZXRyaWNzKS4KKworIyMjIyBLZXkgY2FjaGUKKworSWYgYW4gc3N0YWJsZSBmb3JtYXQgaW1wbGVtZW50YXRpb24gdXNlcyByb3cga2V5IGNhY2hlLCBpdCBzaG91bGQgaW1wbGVtZW50IAordGhlW2BLZXlDYWNoZVN1cHBvcnRgXShrZXljYWNoZS9LZXlDYWNoZVN1cHBvcnQuamF2YSkgaW50ZXJmYWNlLiBJbiBwYXJ0aWN1bGFyLCBpdCBzaG91bGQgc3RvcmUgYSBgS2V5Q2FjaGVgIGluc3RhbmNlIAorYW5kIHJldHVybiBpdCB3aXRoIHRoZSBgZ2V0S2V5Q2FjaGUoKWAgbWV0aG9kLiBUaGUgaW50ZXJmYWNlIGhhcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2Ygc2V2ZXJhbCBtZXRob2RzIAordGhlIHN5c3RlbSByZWxpZXMgb24gaWYgdGhlIHJlYWRlciBpbXBsZW1lbnRzIHRoZSBgS2V5Q2FjaGVTdXBwb3J0YCBpbnRlcmZhY2UuCisKK1RoZSBpbnRlcmZhY2UgY29tZXMgd2l0aCBhZGRpdGlvbmFsIFttZXRyaWNzXShrZXljYWNoZS9LZXlDYWNoZU1ldHJpY3MuamF2YSkgLSByZWFkIG1vcmUgYWJvdXQgY3VzdG9tIG1ldHJpY3Mgc3VwcG9ydCAKK1toZXJlXSgjbWV0cmljcykuCisKKyMjIyMgTWV0cmljcworCitBIGN1c3RvbSBzc3RhYmxlIGZvcm1hdCBpbXBsZW1lbnRhdGlvbiBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG1ldHJpY3Mgb24gYSB0YWJsZSwga2V5c3BhY2UsIGFuZCBnbG9iYWwgbGV2ZWwuIFRob3NlIAorbWV0cmljcyBhcmUgYWNjZXNzaWJsZSB2aWEgSk1YLiBUaGUgYFNTVGFibGVGb3JtYXRgIGltcGxlbWVudGF0aW9uIGV4cG9zZXMgdGhlIGFkZGl0aW9uYWwgbWV0cmljcyBieSBpbXBsZW1lbnRpbmcgdGhlCitgU1NUYWJsZUZvcm1hdC5nZXRGb3JtYXRTcGVjaWZpY01ldHJpY3NQcm92aWRlcnNgIG1ldGhvZC4gVGhlIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgc2luZ2xldG9uIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlCitbYE1ldHJpY3NQcm92aWRlcnNgXShNZXRyaWNzUHJvdmlkZXJzLmphdmEpIGludGVyZmFjZS4gQ3VycmVudGx5LCB0aGVyZSBpcyBvbmx5IHN1cHBvcnQgZm9yIGN1c3RvbSBnYXVnZXMsIGJ1dCBpdCBjYW4gYmUKK2V4dGVuZGVkIHdoZW4gbmVlZGVkLgorCitFYWNoIGN1c3RvbSBtZXRyaWMgKGdhdWdlKSBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgW0dhdWdlUHJvdmlkZXJdKEdhdWdlUHJvdmlkZXIuamF2YSkgYWJzdHJhY3QgY2xhc3MuIEFsdGhvdWdoIHRoZQorY2xhc3MgZXhwZWN0cyB0aGUgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBhIGdhdWdlIGZvciBlYWNoIGxldmVsIG9mIGFnZ3JlZ2F0aW9uLCB0aGVyZSBpcyBhIGhlbHBlciBjbGFzcyAtCitbU2ltcGxlR2F1Z2VQcm92aWRlcl0oU2ltcGxlR2F1Z2VQcm92aWRlci5qYXZhKSAtIHdoaWNoIGRvZXMgdGhhdCBhdXRvbWF0aWNhbGx5IHdpdGggYSBzdXBwbGllZCByZWR1Y3Rpb24gbGFtYmRhLiBUaGVyZSAKK2lzIFtgQWJzdHJhY3RNZXRyaWNzUHJvdmlkZXJzYF0oQWJzdHJhY3RNZXRyaWNzUHJvdmlkZXJzLmphdmEpIGNsYXNzIHdoaWNoIGlzIGEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKK2BNZXRyaWNzUHJvdmlkZXJzYCBpbnRlcmZhY2UgYW5kIGxldmVyYWdlcyBgU2ltcGxlR2F1Z2VQcm92aWRlcmAgaW4gdGhlIG9mZmVyZWQgbWV0aG9kcy4KKworRXhhbXBsZSAtIGFkZGl0aW9uYWwgbWV0cmljcyBmb3Igc3N0YWJsZXMgc3VwcG9ydGluZyBpbmRleCBzdW1tYXJpZXMgKHNlZSAKK1tgSW5kZXhTdW1tYXJ5TWV0cmljc2BdKGluZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlNZXRyaWNzLmphdmEpIGZvciBhIGZ1bGwgZXhhbXBsZSk6CitgYGBqYXZhCitwcml2YXRlIGZpbmFsIEdhdWdlUHJvdmlkZXI8TG9uZz4gaW5kZXhTdW1tYXJ5T2ZmSGVhcE1lbW9yeVVzZWQgPSBuZXdHYXVnZVByb3ZpZGVyKCJJbmRleFN1bW1hcnlPZmZIZWFwTWVtb3J5VXNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIC0+IHIuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0T2ZmSGVhcFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZzo6c3VtKTsKK2BgYAorCisjIyMgV3JpdGVyCisKKyMjIyMgQ29uc3RydWN0aW9uCisKK0FuIHNzdGFibGUgd3JpdGVyIChbYFNTVGFibGVXcml0ZXJgXShmb3JtYXQvU1NUYWJsZVdyaXRlci5qYXZhKSkgaXMgcmVzcG9uc2libGUgZm9yIHdyaXRpbmcgdGhlIGRhdGEgdG8gc3N0YWJsZSBmaWxlcy4KK0l0IGlzIGNyZWF0ZWQgYnkgYSBfYnVpbGRlcl8gKFtgU1NUYWJsZVdyaXRlci5CdWlsZGVyYF0oZm9ybWF0L1NTVGFibGVXcml0ZXIuamF2YSkpLiBUaGUgYnVpbGRlciBpcyBzdXBwbGllZCBieQorYSBfd3JpdGVyIGZhY3RvcnlfIChbYFNTVGFibGVGb3JtYXQuU1NUYWJsZVdyaXRlckZhY3RvcnlgXShmb3JtYXQvU1NUYWJsZUZvcm1hdC5qYXZhKSkuCisKKyMjIyMgU29ydGVkVGFibGVXcml0ZXIKKworVGhlcmUgYXJlIG5vdCBtYW55IG1ldGhvZHMgdG8gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHdyaXRlci4gVGhlIG1vc3Qgbm90YWJsZSBvbmUgaXMgYGFwcGVuZGAgd2hpY2ggc2hvdWxkIHdyaXRlIAordGhlIHByb3ZpZGVkIHBhcnRpdGlvbiB0byBkaXNrLiBIb3dldmVyLCB0aGVyZSBpcyBhIGdlbmVyaWMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAKK1tgU29ydGVkVGFibGVXcml0ZXJgXShmb3JtYXQvU29ydGVkVGFibGVXcml0ZXIuamF2YSkgd2hpY2ggaGFuZGxlcyB0aGluZ3MgbGlrZSB3cml0aW5nIHRvIHRoZSBkYXRhIGZpbGUgdXNpbmcgCit0aGUgZGVmYXVsdCBzZXJpYWxpemVycywgZ2VuZXJpYyBzdXBwb3J0IGZvciBhIHBhcnRpdGlvbiBpbmRleCwgbm90aWZpY2F0aW9ucywgbWV0YWRhdGEgY29sbGVjdGlvbiwgYW5kIGJ1aWxkaW5nIAorYSBmaWx0ZXIuIFRoZSB3cml0ZXIgdHJpZ2dlcnMgZmluZS1ncmFpbmVkIGV2ZW50cyB3aGVuIGRhdGEgYXJlIGFkZGVkIGFuZCB0aG9zZSBtZXRob2RzIGNhbiBiZSBvdmVycmlkZGVuIGluIAordGhlIHN1YmNsYXNzZXMgdG8gYXBwbHkgc3BlY2lmaWMgYmVoYXZpb3VycyAoZm9yIGV4YW1wbGUsIGBvblBhcnRpdGlvblN0YXJ0YCwgYG9uUm93YCwgYG9uU3RhdGljUm93YCwgZXRjLikuCitFdmVudHVhbGx5IGl0IGNhbGxzIGFuIGFic3RyYWN0IGBjcmVhdGVSb3dJbmRleEVudHJ5YCBtZXRob2Qgd2hpY2ggc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSBzdWJjbGFzcy4gCisKKyMjIyBTY3J1YmJlciBhbmQgdmVyaWZpZXIKKworQSBjdXN0b20gc3N0YWJsZSBmb3JtYXQgc2hvdWxkIGFsc28gY29tZSB3aXRoIGl0cyBvd24gdmVyaWZpZXIgYW5kIHNjcnViYmVyIGltcGxlbWVudGluZyBbYElWZXJpZmllcmBdKElWZXJpZmllci5qYXZhKQorYW5kIFtgSVNjcnViYmVyYF0oSVNjcnViYmVyLmphdmEpIGludGVyZmFjZXMgY29ycmVzcG9uZGluZ2x5LiBBIGdlbmVyaWMgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZCBpbiAKK1tgU29ydGVkVGFibGVWZXJpZmllcmBdKGZvcm1hdC9Tb3J0ZWRUYWJsZVZlcmlmaWVyLmphdmEpIGFuZCBbYFNvcnRlZFRhYmxlU2NydWJiZXJgXShmb3JtYXQvU29ydGVkVGFibGVTY3J1YmJlci5qYXZhKS4KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU2ltcGxlR2F1Z2VQcm92aWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TaW1wbGVHYXVnZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkyOTA5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU2ltcGxlR2F1Z2VQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworCitpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuR2F1Z2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKKworcHVibGljIGNsYXNzIFNpbXBsZUdhdWdlUHJvdmlkZXI8VCBleHRlbmRzIE51bWJlciwgUiBleHRlbmRzIFNTVGFibGVSZWFkZXI+IGV4dGVuZHMgR2F1Z2VQcm92aWRlcjxUPgoreworICAgIHByaXZhdGUgZmluYWwgRnVuY3Rpb248U1NUYWJsZVJlYWRlciwgUj4gbWFwcGVyOworICAgIHByaXZhdGUgZmluYWwgRnVuY3Rpb248SXRlcmFibGU8Uj4sIFQ+IGNvbWJpbmVyOworCisgICAgcHVibGljIFNpbXBsZUdhdWdlUHJvdmlkZXIoRnVuY3Rpb248U1NUYWJsZVJlYWRlciwgUj4gbWFwcGVyLCBTdHJpbmcgbmFtZSwgRnVuY3Rpb248SXRlcmFibGU8Uj4sIFQ+IGNvbWJpbmVyKQorICAgIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgICAgIHRoaXMubWFwcGVyID0gbWFwcGVyOworICAgICAgICB0aGlzLmNvbWJpbmVyID0gY29tYmluZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEdhdWdlPFQ+IGdldFRhYmxlR2F1Z2UoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgpIC0+IGNvbWJpbmUoY2ZzLmdldExpdmVTU1RhYmxlcygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgR2F1Z2U8VD4gZ2V0S2V5c3BhY2VHYXVnZShLZXlzcGFjZSBrZXlzcGFjZSkKKyAgICB7CisgICAgICAgIHJldHVybiAoKSAtPiBjb21iaW5lKGdldEFsbFJlYWRlcnMoa2V5c3BhY2UpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgR2F1Z2U8VD4gZ2V0R2xvYmFsR2F1Z2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgpIC0+IGNvbWJpbmUoSXRlcmFibGVzLmNvbmNhdChJdGVyYWJsZXMudHJhbnNmb3JtKEtleXNwYWNlLmFsbCgpLCBTaW1wbGVHYXVnZVByb3ZpZGVyOjpnZXRBbGxSZWFkZXJzKSkpOworICAgIH0KKworICAgIHByaXZhdGUgVCBjb21iaW5lKEl0ZXJhYmxlPFNTVGFibGVSZWFkZXI+IGFsbFJlYWRlcnMpCisgICAgeworICAgICAgICBJdGVyYWJsZTxSPiByZWFkZXJzID0gSXRlcmFibGVzLmZpbHRlcihJdGVyYWJsZXMudHJhbnNmb3JtKGFsbFJlYWRlcnMsIG1hcHBlcjo6YXBwbHkpLCBPYmplY3RzOjpub25OdWxsKTsKKyAgICAgICAgcmV0dXJuIGNvbWJpbmVyLmFwcGx5KHJlYWRlcnMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEl0ZXJhYmxlPFNTVGFibGVSZWFkZXI+IGdldEFsbFJlYWRlcnMoS2V5c3BhY2Uga2V5c3BhY2UpCisgICAgeworICAgICAgICByZXR1cm4gSXRlcmFibGVzLmNvbmNhdChJdGVyYWJsZXMudHJhbnNmb3JtKGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlcygpLCBDb2x1bW5GYW1pbHlTdG9yZTo6Z2V0TGl2ZVNTVGFibGVzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TaW1wbGVTU1RhYmxlTXVsdGlXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU2ltcGxlU1NUYWJsZU11bHRpV3JpdGVyLmphdmEKaW5kZXggZWMyODUyOC4uMzgxYzVlYiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TaW1wbGVTU1RhYmxlTXVsdGlXcml0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NpbXBsZVNTVGFibGVNdWx0aVdyaXRlci5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93SW5kZXhFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVOZXdUcmFja2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOwpAQCAtNDUsMTMgKzQ0LDE1IEBACiAKICAgICBwdWJsaWMgYm9vbGVhbiBhcHBlbmQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbikKICAgICB7Ci0gICAgICAgIFJvd0luZGV4RW50cnk8Pz4gaW5kZXhFbnRyeSA9IHdyaXRlci5hcHBlbmQocGFydGl0aW9uKTsKKyAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGluZGV4RW50cnkgPSB3cml0ZXIuYXBwZW5kKHBhcnRpdGlvbik7CiAgICAgICAgIHJldHVybiBpbmRleEVudHJ5ICE9IG51bGw7CiAgICAgfQogCiAgICAgcHVibGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gZmluaXNoKGxvbmcgcmVwYWlyZWRBdCwgbG9uZyBtYXhEYXRhQWdlLCBib29sZWFuIG9wZW5SZXN1bHQpCiAgICAgewotICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKHdyaXRlci5maW5pc2gocmVwYWlyZWRBdCwgbWF4RGF0YUFnZSwgb3BlblJlc3VsdCkpOworICAgICAgICB3cml0ZXIuc2V0UmVwYWlyZWRBdChyZXBhaXJlZEF0KTsKKyAgICAgICAgd3JpdGVyLnNldE1heERhdGFBZ2UobWF4RGF0YUFnZSk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24od3JpdGVyLmZpbmlzaChvcGVuUmVzdWx0KSk7CiAgICAgfQogCiAgICAgcHVibGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gZmluaXNoKGJvb2xlYW4gb3BlblJlc3VsdCkKQEAgLTExNiw5ICsxMTcsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEluZGV4PiBpbmRleGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZS5Pd25lciBvd25lcikKICAgICB7Ci0gICAgICAgIFNTVGFibGVXcml0ZXIgd3JpdGVyID0gU1NUYWJsZVdyaXRlci5jcmVhdGUoZGVzY3JpcHRvciwga2V5Q291bnQsIHJlcGFpcmVkQXQsIHBlbmRpbmdSZXBhaXIsIGlzVHJhbnNpZW50LCBtZXRhZGF0YSwgbWV0YWRhdGFDb2xsZWN0b3IsIGhlYWRlciwgaW5kZXhlcywgbGlmZWN5Y2xlTmV3VHJhY2tlcik7CisgICAgICAgIFNTVGFibGVXcml0ZXIgd3JpdGVyID0gZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5nZXRXcml0ZXJGYWN0b3J5KCkuYnVpbGRlcihkZXNjcmlwdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0S2V5Q291bnQoa2V5Q291bnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSZXBhaXJlZEF0KHJlcGFpcmVkQXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRQZW5kaW5nUmVwYWlyKHBlbmRpbmdSZXBhaXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUcmFuc2llbnRTU1RhYmxlKGlzVHJhbnNpZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGFibGVNZXRhZGF0YVJlZihtZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1ldGFkYXRhQ29sbGVjdG9yKG1ldGFkYXRhQ29sbGVjdG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VyaWFsaXphdGlvbkhlYWRlcihoZWFkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGREZWZhdWx0Q29tcG9uZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRGbHVzaE9ic2VydmVyc0ZvclNlY29uZGFyeUluZGV4ZXMoaW5kZXhlcywgbGlmZWN5Y2xlTmV3VHJhY2tlci5vcFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKGxpZmVjeWNsZU5ld1RyYWNrZXIsIG93bmVyKTsKICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTU1RhYmxlTXVsdGlXcml0ZXIod3JpdGVyLCBsaWZlY3ljbGVOZXdUcmFja2VyKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2ZpbHRlci9CbG9vbUZpbHRlck1ldHJpY3MuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZmlsdGVyL0Jsb29tRmlsdGVyTWV0cmljcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNWZjM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2ZpbHRlci9CbG9vbUZpbHRlck1ldHJpY3MuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZpbHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0TWV0cmljc1Byb3ZpZGVyczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkdhdWdlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyV2l0aEZpbHRlcjsKKworcHVibGljIGNsYXNzIEJsb29tRmlsdGVyTWV0cmljczxSIGV4dGVuZHMgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXI+IGV4dGVuZHMgQWJzdHJhY3RNZXRyaWNzUHJvdmlkZXJzPFI+Cit7CisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBCbG9vbUZpbHRlck1ldHJpY3M8Pz4gaW5zdGFuY2UgPSBuZXcgQmxvb21GaWx0ZXJNZXRyaWNzPD4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSIG1hcChTU1RhYmxlUmVhZGVyIHIpCisgICAgeworICAgICAgICBpZiAociBpbnN0YW5jZW9mIFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyKQorICAgICAgICAgICAgcmV0dXJuIChSKSByOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgZmFsc2UgcG9zaXRpdmVzIGluIGJsb29tIGZpbHRlcgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBHYXVnZVByb3ZpZGVyPExvbmc+IGJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXMgPSBuZXdHYXVnZVByb3ZpZGVyKCJCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIC0+IHIuZ2V0RmlsdGVyVHJhY2tlcigpLmdldEZhbHNlUG9zaXRpdmVDb3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmc6OnN1bSk7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgZmFsc2UgcG9zaXRpdmVzIGluIGJsb29tIGZpbHRlciBmcm9tIGxhc3QgcmVhZAorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBHYXVnZVByb3ZpZGVyPExvbmc+IHJlY2VudEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXMgPSBuZXdHYXVnZVByb3ZpZGVyKCJSZWNlbnRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIC0+IHIuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFJlY2VudEZhbHNlUG9zaXRpdmVDb3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmc6OnN1bSk7CisKKyAgICAvKioKKyAgICAgKiBEaXNrIHNwYWNlIHVzZWQgYnkgYmxvb20gZmlsdGVyCisgICAgICovCisgICAgcHVibGljIGZpbmFsIEdhdWdlUHJvdmlkZXI8TG9uZz4gYmxvb21GaWx0ZXJEaXNrU3BhY2VVc2VkID0gbmV3R2F1Z2VQcm92aWRlcigiQmxvb21GaWx0ZXJEaXNrU3BhY2VVc2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXI6OmdldEZpbHRlclNlcmlhbGl6ZWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZzo6c3VtKTsKKworICAgIC8qKgorICAgICAqIE9mZiBoZWFwIG1lbW9yeSB1c2VkIGJ5IGJsb29tIGZpbHRlcgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBHYXVnZVByb3ZpZGVyPExvbmc+IGJsb29tRmlsdGVyT2ZmSGVhcE1lbW9yeVVzZWQgPSBuZXdHYXVnZVByb3ZpZGVyKCJCbG9vbUZpbHRlck9mZkhlYXBNZW1vcnlVc2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlcjo6Z2V0RmlsdGVyT2ZmSGVhcFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZzo6c3VtKTsKKworICAgIC8qKgorICAgICAqIEZhbHNlIHBvc2l0aXZlIHJhdGlvIG9mIGJsb29tIGZpbHRlcgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBHYXVnZVByb3ZpZGVyPERvdWJsZT4gYmxvb21GaWx0ZXJGYWxzZVJhdGlvID0gbmV3R2F1Z2VQcm92aWRlcigiQmxvb21GaWx0ZXJGYWxzZVJhdGlvIiwgcmVhZGVycyAtPiB7CisgICAgICAgIGxvbmcgZmFsc2VQb3NpdGl2ZUNvdW50ID0gMEw7CisgICAgICAgIGxvbmcgdHJ1ZVBvc2l0aXZlQ291bnQgPSAwTDsKKyAgICAgICAgbG9uZyB0cnVlTmVnYXRpdmVDb3VudCA9IDBMOworICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyIHNzdGFibGUgOiByZWFkZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBmYWxzZVBvc2l0aXZlQ291bnQgKz0gc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCk7CisgICAgICAgICAgICB0cnVlUG9zaXRpdmVDb3VudCArPSBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRUcnVlUG9zaXRpdmVDb3VudCgpOworICAgICAgICAgICAgdHJ1ZU5lZ2F0aXZlQ291bnQgKz0gc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0VHJ1ZU5lZ2F0aXZlQ291bnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmFsc2VQb3NpdGl2ZUNvdW50ID09IDBMICYmIHRydWVQb3NpdGl2ZUNvdW50ID09IDBMKQorICAgICAgICAgICAgcmV0dXJuIDBkOworICAgICAgICByZXR1cm4gKGRvdWJsZSkgZmFsc2VQb3NpdGl2ZUNvdW50IC8gKHRydWVQb3NpdGl2ZUNvdW50ICsgZmFsc2VQb3NpdGl2ZUNvdW50ICsgdHJ1ZU5lZ2F0aXZlQ291bnQpOworICAgIH0pOworCisgICAgLyoqCisgICAgICogRmFsc2UgcG9zaXRpdmUgcmF0aW8gb2YgYmxvb20gZmlsdGVyIGZyb20gbGFzdCByZWFkCisgICAgICovCisgICAgcHVibGljIGZpbmFsIEdhdWdlUHJvdmlkZXI8RG91YmxlPiByZWNlbnRCbG9vbUZpbHRlckZhbHNlUmF0aW8gPSBuZXdHYXVnZVByb3ZpZGVyKCJSZWNlbnRCbG9vbUZpbHRlckZhbHNlUmF0aW8iLCByZWFkZXJzIC0+IHsKKyAgICAgICAgbG9uZyBmYWxzZVBvc2l0aXZlQ291bnQgPSAwTDsKKyAgICAgICAgbG9uZyB0cnVlUG9zaXRpdmVDb3VudCA9IDBMOworICAgICAgICBsb25nIHRydWVOZWdhdGl2ZUNvdW50ID0gMEw7CisgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIgc3N0YWJsZSA6IHJlYWRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZhbHNlUG9zaXRpdmVDb3VudCArPSBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRSZWNlbnRGYWxzZVBvc2l0aXZlQ291bnQoKTsKKyAgICAgICAgICAgIHRydWVQb3NpdGl2ZUNvdW50ICs9IHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFJlY2VudFRydWVQb3NpdGl2ZUNvdW50KCk7CisgICAgICAgICAgICB0cnVlTmVnYXRpdmVDb3VudCArPSBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRSZWNlbnRUcnVlTmVnYXRpdmVDb3VudCgpOworICAgICAgICB9CisgICAgICAgIGlmIChmYWxzZVBvc2l0aXZlQ291bnQgPT0gMEwgJiYgdHJ1ZVBvc2l0aXZlQ291bnQgPT0gMEwpCisgICAgICAgICAgICByZXR1cm4gMGQ7CisgICAgICAgIHJldHVybiAoZG91YmxlKSBmYWxzZVBvc2l0aXZlQ291bnQgLyAodHJ1ZVBvc2l0aXZlQ291bnQgKyBmYWxzZVBvc2l0aXZlQ291bnQgKyB0cnVlTmVnYXRpdmVDb3VudCk7CisgICAgfSk7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8R2F1Z2VQcm92aWRlcjw/Pj4gZ2F1Z2VQcm92aWRlcnMgPSBBcnJheXMuYXNMaXN0KGJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlbnRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb21GaWx0ZXJEaXNrU3BhY2VVc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb21GaWx0ZXJPZmZIZWFwTWVtb3J5VXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb29tRmlsdGVyRmFsc2VSYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VudEJsb29tRmlsdGVyRmFsc2VSYXRpbyk7CisKKyAgICBwdWJsaWMgTGlzdDxHYXVnZVByb3ZpZGVyPD8+PiBnZXRHYXVnZVByb3ZpZGVycygpCisgICAgeworICAgICAgICByZXR1cm4gZ2F1Z2VQcm92aWRlcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9maWx0ZXIvQmxvb21GaWx0ZXJUcmFja2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2ZpbHRlci9CbG9vbUZpbHRlclRyYWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjI5MjYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9maWx0ZXIvQmxvb21GaWx0ZXJUcmFja2VyLmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuTG9uZ0FkZGVyOworCitwdWJsaWMgY2xhc3MgQmxvb21GaWx0ZXJUcmFja2VyCit7CisgICAgcHJpdmF0ZSBmaW5hbCBMb25nQWRkZXIgZmFsc2VQb3NpdGl2ZUNvdW50ID0gbmV3IExvbmdBZGRlcigpOworICAgIHByaXZhdGUgZmluYWwgTG9uZ0FkZGVyIHRydWVQb3NpdGl2ZUNvdW50ID0gbmV3IExvbmdBZGRlcigpOworICAgIHByaXZhdGUgZmluYWwgTG9uZ0FkZGVyIHRydWVOZWdhdGl2ZUNvdW50ID0gbmV3IExvbmdBZGRlcigpOworICAgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyBsYXN0RmFsc2VQb3NpdGl2ZUNvdW50ID0gbmV3IEF0b21pY0xvbmcoKTsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgbGFzdFRydWVQb3NpdGl2ZUNvdW50ID0gbmV3IEF0b21pY0xvbmcoKTsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgbGFzdFRydWVOZWdhdGl2ZUNvdW50ID0gbmV3IEF0b21pY0xvbmcoKTsKKworICAgIHB1YmxpYyB2b2lkIGFkZEZhbHNlUG9zaXRpdmUoKQorICAgIHsKKyAgICAgICAgZmFsc2VQb3NpdGl2ZUNvdW50LmluY3JlbWVudCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZFRydWVQb3NpdGl2ZSgpCisgICAgeworICAgICAgICB0cnVlUG9zaXRpdmVDb3VudC5pbmNyZW1lbnQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUcnVlTmVnYXRpdmUoKQorICAgIHsKKyAgICAgICAgdHJ1ZU5lZ2F0aXZlQ291bnQuaW5jcmVtZW50KCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZVBvc2l0aXZlQ291bnQuc3VtKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0UmVjZW50RmFsc2VQb3NpdGl2ZUNvdW50KCkKKyAgICB7CisgICAgICAgIGxvbmcgZnBjID0gZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCk7CisgICAgICAgIGxvbmcgbGFzdCA9IGxhc3RGYWxzZVBvc2l0aXZlQ291bnQuZ2V0QW5kU2V0KGZwYyk7CisgICAgICAgIHJldHVybiBmcGMgLSBsYXN0OworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFRydWVQb3NpdGl2ZUNvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlUG9zaXRpdmVDb3VudC5zdW0oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRSZWNlbnRUcnVlUG9zaXRpdmVDb3VudCgpCisgICAgeworICAgICAgICBsb25nIHRwYyA9IGdldFRydWVQb3NpdGl2ZUNvdW50KCk7CisgICAgICAgIGxvbmcgbGFzdCA9IGxhc3RUcnVlUG9zaXRpdmVDb3VudC5nZXRBbmRTZXQodHBjKTsKKyAgICAgICAgcmV0dXJuIHRwYyAtIGxhc3Q7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0VHJ1ZU5lZ2F0aXZlQ291bnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWVOZWdhdGl2ZUNvdW50LnN1bSgpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFJlY2VudFRydWVOZWdhdGl2ZUNvdW50KCkKKyAgICB7CisgICAgICAgIGxvbmcgdG5jID0gZ2V0VHJ1ZU5lZ2F0aXZlQ291bnQoKTsKKyAgICAgICAgbG9uZyBsYXN0ID0gbGFzdFRydWVOZWdhdGl2ZUNvdW50LmdldEFuZFNldCh0bmMpOworICAgICAgICByZXR1cm4gdG5jIC0gbGFzdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9BYnN0cmFjdFNTVGFibGVGb3JtYXQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L0Fic3RyYWN0U1NUYWJsZUZvcm1hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYzE5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9BYnN0cmFjdFNTVGFibGVGb3JtYXQuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U1NUYWJsZUZvcm1hdDxSIGV4dGVuZHMgU1NUYWJsZVJlYWRlciwgVyBleHRlbmRzIFNTVGFibGVXcml0ZXI+IGltcGxlbWVudHMgU1NUYWJsZUZvcm1hdDxSLCBXPgoreworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zOworCisgICAgcHJvdGVjdGVkIEFic3RyYWN0U1NUYWJsZUZvcm1hdChTdHJpbmcgbmFtZSwgTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zKQorICAgIHsKKyAgICAgICAgdGhpcy5uYW1lID0gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChuYW1lKTsKKyAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgQWJzdHJhY3RTU1RhYmxlRm9ybWF0PD8sID8+IHRoYXQgPSAoQWJzdHJhY3RTU1RhYmxlRm9ybWF0PD8sID8+KSBvOworICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMobmFtZSwgdGhhdC5uYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2gobmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9Db21wcmVzc2lvbkluZm9Db21wb25lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmMxMGJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50LmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5Ob1N1Y2hGaWxlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1JlYWRFcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5Db21wcmVzc2lvbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CisKK3B1YmxpYyBjbGFzcyBDb21wcmVzc2lvbkluZm9Db21wb25lbnQKK3sKKyAgICBwdWJsaWMgc3RhdGljIENvbXByZXNzaW9uTWV0YWRhdGEgbWF5YmVMb2FkKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cykKKyAgICB7CisgICAgICAgIGlmIChjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudHMuQ09NUFJFU1NJT05fSU5GTykpCisgICAgICAgICAgICByZXR1cm4gbG9hZChkZXNjcmlwdG9yKTsKKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIENvbXByZXNzaW9uTWV0YWRhdGEgbG9hZElmRXhpc3RzKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKS5leGlzdHMoKSkKKyAgICAgICAgICAgIHJldHVybiBsb2FkKGRlc2NyaXB0b3IpOworCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ29tcHJlc3Npb25NZXRhZGF0YSBsb2FkKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICB7CisgICAgICAgIHJldHVybiBDb21wcmVzc2lvbk1ldGFkYXRhLm9wZW4oZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuQ09NUFJFU1NJT05fSU5GTyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci52ZXJzaW9uLmhhc01heENvbXByZXNzZWRMZW5ndGgoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVzdC1lZmZvcnQgY2hlY2tpbmcgdG8gdmVyaWZ5IHRoZSBleHBlY3RlZCBjb21wcmVzc2lvbiBpbmZvIGNvbXBvbmVudCBleGlzdHMsIGFjY29yZGluZyB0byB0aGUgVE9DIGZpbGUuCisgICAgICogVGhlIHZlcmlmaWNhdGlvbiBkZXBlbmRzIG9uIHRoZSBleGlzdGVuY2Ugb2YgVE9DIGZpbGUuIElmIGFic2VudCwgdGhlIHZlcmlmaWNhdGlvbiBpcyBza2lwcGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2NyaXB0b3IKKyAgICAgKiBAcGFyYW0gYWN0dWFsQ29tcG9uZW50cywgYWN0dWFsIGNvbXBvbmVudHMgbGlzdGVkIGZyb20gdGhlIGZpbGUgc3lzdGVtLgorICAgICAqIEB0aHJvd3MgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24sIGlmIFRPQyBleHBlY3RzIGNvbXByZXNzaW9uIGluZm8gYnV0IG5vdCBmb3VuZCBmcm9tIGRpc2suCisgICAgICogQHRocm93cyBGU1JlYWRFcnJvciwgICAgICAgICAgICAgaWYgdW5hYmxlIHRvIHJlYWQgZnJvbSBUT0MgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5Q29tcHJlc3Npb25JbmZvRXhpc3RlbmNlSWZBcHBsaWNhYmxlKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgU2V0PENvbXBvbmVudD4gYWN0dWFsQ29tcG9uZW50cykgdGhyb3dzIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uLCBGU1JlYWRFcnJvcgorICAgIHsKKyAgICAgICAgRmlsZSB0b2NGaWxlID0gZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuVE9DKTsKKyAgICAgICAgaWYgKHRvY0ZpbGUuZXhpc3RzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGV4cGVjdGVkQ29tcG9uZW50cyA9IFRPQ0NvbXBvbmVudC5sb2FkVE9DKGRlc2NyaXB0b3IsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBpZiAoZXhwZWN0ZWRDb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudHMuQ09NUFJFU1NJT05fSU5GTykgJiYgIWFjdHVhbENvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUgY29tcHJlc3Npb25JbmZvRmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkNPTVBSRVNTSU9OX0lORk8pOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24obmV3IE5vU3VjaEZpbGVFeGNlcHRpb24oY29tcHJlc3Npb25JbmZvRmlsZS5hYnNvbHV0ZVBhdGgoKSksIGNvbXByZXNzaW9uSW5mb0ZpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBGU1JlYWRFcnJvcihlLCB0b2NGaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L0RhdGFDb21wb25lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L0RhdGFDb21wb25lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzY3Y2I0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvRGF0YUNvbXBvbmVudC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZy5GbHVzaENvbXByZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5Db21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5JQ29tcHJlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5DaGVja3N1bW1lZFNlcXVlbnRpYWxXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlck9wdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcHJlc3Npb25QYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CisKK3B1YmxpYyBjbGFzcyBEYXRhQ29tcG9uZW50Cit7CisgICAgcHVibGljIHN0YXRpYyBTZXF1ZW50aWFsV3JpdGVyIGJ1aWxkV3JpdGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlck9wdGlvbiBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBtZXRhZGF0YUNvbGxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbHVzaENvbXByZXNzaW9uIGZsdXNoQ29tcHJlc3Npb24pCisgICAgeworICAgICAgICBpZiAobWV0YWRhdGEucGFyYW1zLmNvbXByZXNzaW9uLmlzRW5hYmxlZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBDb21wcmVzc2lvblBhcmFtcyBjb21wcmVzc2lvblBhcmFtcyA9IGJ1aWxkQ29tcHJlc3Npb25QYXJhbXMobWV0YWRhdGEsIG9wZXJhdGlvblR5cGUsIGZsdXNoQ29tcHJlc3Npb24pOworCisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRElHRVNUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQ29sbGVjdG9yKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2hlY2tzdW1tZWRTZXF1ZW50aWFsV3JpdGVyKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuQ1JDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRJR0VTVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGFuIE9wVHlwZSwgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IENvbXByZXNzaW9uIFBhcmFtZXRlcnMKKyAgICAgKgorICAgICAqIEByZXR1cm4ge0BsaW5rIENvbXByZXNzaW9uUGFyYW1zfQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENvbXByZXNzaW9uUGFyYW1zIGJ1aWxkQ29tcHJlc3Npb25QYXJhbXMoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgT3BlcmF0aW9uVHlwZSBvcGVyYXRpb25UeXBlLCBGbHVzaENvbXByZXNzaW9uIGZsdXNoQ29tcHJlc3Npb24pCisgICAgeworICAgICAgICBDb21wcmVzc2lvblBhcmFtcyBjb21wcmVzc2lvblBhcmFtcyA9IG1ldGFkYXRhLnBhcmFtcy5jb21wcmVzc2lvbjsKKyAgICAgICAgZmluYWwgSUNvbXByZXNzb3IgY29tcHJlc3NvciA9IGNvbXByZXNzaW9uUGFyYW1zLmdldFNzdGFibGVDb21wcmVzc29yKCk7CisKKyAgICAgICAgaWYgKG51bGwgIT0gY29tcHJlc3NvciAmJiBvcGVyYXRpb25UeXBlID09IE9wZXJhdGlvblR5cGUuRkxVU0gpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGZsdXNoaW5nIG91dCBvZiB0aGUgbWVtdGFibGUgdGhyb3VnaHB1dCBvZiB0aGUgY29tcHJlc3NvciBpcyBjcml0aWNhbCBhcyBmbHVzaGVzLAorICAgICAgICAgICAgLy8gZXNwZWNpYWxseSBvZiBsYXJnZSB0YWJsZXMsIGNhbiBxdWV1ZSB1cCBhbmQgcG90ZW50aWFsbHkgYmxvY2sgd3JpdGVzLgorICAgICAgICAgICAgLy8gVGhpcyBvcHRpbWl6YXRpb24gYWxsb3dzIHVzIHRvIGZhbGwgYmFjayB0byBhIGZhc3RlciBjb21wcmVzc29yIGlmIGEgcGFydGljdWxhcgorICAgICAgICAgICAgLy8gY29tcHJlc3Npb24gYWxnb3JpdGhtIGluZGljYXRlcyB3ZSBzaG91bGQuIFNlZSBDQVNTQU5EUkEtMTUzNzkgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAgICAgICAgIHN3aXRjaCAoZmx1c2hDb21wcmVzc2lvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBJdCBpcyByZWxhdGl2ZWx5IGVhc2llciB0byBpbnNlcnQgYSBOb29wIGNvbXByZXNzb3IgdGhhbiB0byBkaXNhYmxlIGNvbXByZXNzZWQgd3JpdGluZworICAgICAgICAgICAgICAgIC8vIGVudGlyZWx5IGFzIHRoZSAiY29tcHJlc3Npb24iIG1lbWJlciBmaWVsZCBpcyBwcm92aWRlZCBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGNsYXNzLgorICAgICAgICAgICAgICAgIC8vIEl0IG1heSBtYWtlIHNlbnNlIGluIHRoZSBmdXR1cmUgdG8gcmVmYWN0b3IgdGhlIG93bmVyc2hpcCBvZiB0aGUgY29tcHJlc3Npb24gZmxhZyBzbyB0aGF0CisgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGJ5cGFzcyB0aGUgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIgaW4gdGhpcyBjYXNlIGVudGlyZWx5LgorICAgICAgICAgICAgICAgIGNhc2Ugbm9uZToKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25QYXJhbXMgPSBDb21wcmVzc2lvblBhcmFtcy5OT09QOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGZhc3Q6CisgICAgICAgICAgICAgICAgICAgIGlmICghY29tcHJlc3Nvci5yZWNvbW1lbmRlZFVzZXMoKS5jb250YWlucyhJQ29tcHJlc3Nvci5Vc2VzLkZBU1RfQ09NUFJFU1NJT04pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCBjb21wcmVzc29yIGlzIGdlbmVyYWxseSBmYXN0IChMWjQgd2l0aCAxNktpQiBibG9jayBzaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25QYXJhbXMgPSBDb21wcmVzc2lvblBhcmFtcy5ERUZBVUxUOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgICAgICBjYXNlIHRhYmxlOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjb21wcmVzc2lvblBhcmFtczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9GaWx0ZXJDb21wb25lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L0ZpbHRlckNvbXBvbmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTlkN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9GaWx0ZXJDb21wb25lbnQuamF2YQpAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuVmFsaWRhdGlvbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVJbnB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CbG9vbUZpbHRlclNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRmlsdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5JRmlsdGVyOworCitwdWJsaWMgY2xhc3MgRmlsdGVyQ29tcG9uZW50Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEZpbHRlckNvbXBvbmVudC5jbGFzcyk7CisKKyAgICBmaW5hbCBzdGF0aWMgYm9vbGVhbiByZWJ1aWxkRmlsdGVyT25GUENoYW5jZUNoYW5nZSA9IGZhbHNlOworICAgIGZpbmFsIHN0YXRpYyBkb3VibGUgZmlsdGVyRlBDaGFuY2VUb2xlcmFuY2UgPSAwZDsKKworICAgIHByaXZhdGUgRmlsdGVyQ29tcG9uZW50KCkKKyAgICB7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCBibG9vbSBmaWx0ZXIgZnJvbSBGaWx0ZXIuZGIgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIElGaWx0ZXIgbG9hZChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRmlsZSBmaWx0ZXJGaWxlID0gZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRklMVEVSKTsKKworICAgICAgICBpZiAoIWZpbHRlckZpbGUuZXhpc3RzKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpZiAoZmlsdGVyRmlsZS5sZW5ndGgoKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIEZpbHRlckZhY3RvcnkuQWx3YXlzUHJlc2VudDsKKworICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbVBsdXMgc3RyZWFtID0gZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRklMVEVSKS5uZXdJbnB1dFN0cmVhbSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmZvclZlcnNpb24oZGVzY3JpcHRvci52ZXJzaW9uLmhhc09sZEJmRm9ybWF0KCkpLmRlc2VyaWFsaXplKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byBsb2FkIEJsb29tIGZpbHRlciBmb3IgU1NUYWJsZTogIiArIGRlc2NyaXB0b3IuYmFzZUZpbGUoKSwgZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNhdmUoSUZpbHRlciBmaWx0ZXIsIERlc2NyaXB0b3IgZGVzY3JpcHRvciwgYm9vbGVhbiBkZWxldGVPbkZhaWx1cmUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRmlsZSBmaWx0ZXJGaWxlID0gZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRklMVEVSKTsKKyAgICAgICAgdHJ5IChGaWxlT3V0cHV0U3RyZWFtUGx1cyBzdHJlYW0gPSBmaWx0ZXJGaWxlLm5ld091dHB1dFN0cmVhbShGaWxlLldyaXRlTW9kZS5PVkVSV1JJVEUpKQorICAgICAgICB7CisgICAgICAgICAgICBmaWx0ZXIuc2VyaWFsaXplKHN0cmVhbSwgZGVzY3JpcHRvci52ZXJzaW9uLmhhc09sZEJmRm9ybWF0KCkpOworICAgICAgICAgICAgc3RyZWFtLmZsdXNoKCk7CisgICAgICAgICAgICBzdHJlYW0uc3luYygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRlbGV0ZU9uRmFpbHVyZSkKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5GSUxURVIpLmRlbGV0ZUlmRXhpc3RzKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byBzYXZlIEJsb29tIGZpbHRlciBmb3IgU1NUYWJsZTogIiArIGRlc2NyaXB0b3IuYmFzZUZpbGUoKSwgZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogT3B0aW9uYWxseSBsb2FkcyBhIEJsb29tIGZpbHRlci4KKyAgICAgKiBJZiB0aGUgZmlsdGVyIGlzIG5vdCBuZWVkZWQgKEZQIGNoYW5jZSBpcyBuZWdsZWN0YWJsZSksIGl0IHJldHVybnMge0BsaW5rIEZpbHRlckZhY3RvcnkjQWx3YXlzUHJlc2VudH0uCisgICAgICogSWYgdGhlIGZpbHRlciBpcyBleHBlY3RlZCB0byBiZSByZWNyZWF0ZWQgZm9yIHZhcmlvdXMgcmVhc29ucyB0aGUgbWV0aG9kIHJldHVybnMge0Bjb2RlIG51bGx9LgorICAgICAqIE90aGVyd2lzZSwgYW4gYXR0ZW1wdCB0byBsb2FkIHRoZSBmaWx0ZXIgaXMgbWFkZSBhbmQgaWYgaXQgc3VjY2VlZHMsIHRoZSBsb2FkZWQgZmlsdGVyIGlzIHJldHVybmVkLgorICAgICAqIElmIGxvYWRpbmcgZmFpbHMsIHRoZSBtZXRob2QgcmV0dXJucyB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAbGluayBGaWx0ZXJGYWN0b3J5I0Fsd2F5c1ByZXNlbnR9LCBsb2FkZWQgZmlsdGVyIG9yIHtAY29kZSBudWxsfSAod2hpY2ggbWVhbnMgdGhhdCB0aGUgZmlsdGVyIHNob3VsZCBiZSByZWJ1aWx0KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSUZpbHRlciBtYXliZUxvYWRCbG9vbUZpbHRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMsIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIFZhbGlkYXRpb25NZXRhZGF0YSB2YWxpZGF0aW9uTWV0YWRhdGEpCisgICAgeworICAgICAgICBkb3VibGUgY3VycmVudEZQQ2hhbmNlID0gdmFsaWRhdGlvbk1ldGFkYXRhICE9IG51bGwgPyB2YWxpZGF0aW9uTWV0YWRhdGEuYmxvb21GaWx0ZXJGUENoYW5jZSA6IERvdWJsZS5OYU47CisgICAgICAgIGRvdWJsZSBkZXNpcmVkRlBDaGFuY2UgPSBtZXRhZGF0YS5wYXJhbXMuYmxvb21GaWx0ZXJGcENoYW5jZTsKKworICAgICAgICBJRmlsdGVyIGZpbHRlciA9IG51bGw7CisgICAgICAgIGlmICghc2hvdWxkVXNlQmxvb21GaWx0ZXIoZGVzaXJlZEZQQ2hhbmNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiQmxvb20gZmlsdGVyIGZvciB7fSB3aWxsIG5vdCBiZSBsb2FkZWQgYmVjYXVzZSBmcENoYW5jZT17fSBpcyBuZWdsaWdpYmxlIiwgZGVzY3JpcHRvciwgZGVzaXJlZEZQQ2hhbmNlKTsKKworICAgICAgICAgICAgcmV0dXJuIEZpbHRlckZhY3RvcnkuQWx3YXlzUHJlc2VudDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnRzLkZJTFRFUikgfHwgRG91YmxlLmlzTmFOKGN1cnJlbnRGUENoYW5jZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkJsb29tIGZpbHRlciBmb3Ige30gd2lsbCBub3QgYmUgbG9hZGVkIGJlY2F1c2UgdGhlIGZpbHRlciBjb21wb25lbnQgaXMgbWlzc2luZyBvciBzc3RhYmxlIGxhY2tzIHZhbGlkYXRpb24gbWV0YWRhdGEiLCBkZXNjcmlwdG9yKTsKKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIWlzRlBDaGFuY2VEaWZmTmVnbGlnaWJsZShkZXNpcmVkRlBDaGFuY2UsIGN1cnJlbnRGUENoYW5jZSkgJiYgcmVidWlsZEZpbHRlck9uRlBDaGFuY2VDaGFuZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkJsb29tIGZpbHRlciBmb3Ige30gd2lsbCBub3QgYmUgbG9hZGVkIGJlY2F1c2UgZnBDaGFuY2UgaGFzIGNoYW5nZWQgZnJvbSB7fSB0byB7fSBhbmQgdGhlIGZpbHRlciBzaG91bGQgYmUgcmVjcmVhdGVkIiwgZGVzY3JpcHRvciwgY3VycmVudEZQQ2hhbmNlLCBkZXNpcmVkRlBDaGFuY2UpOworCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBmaWx0ZXIgPSBsb2FkKGRlc2NyaXB0b3IpOworICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsIHx8ICFmaWx0ZXIuaXNJbmZvcm1hdGl2ZSgpKQorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJCbG9vbSBmaWx0ZXIgZm9yIHt9IGlzIG1pc3Npbmcgb3IgaW52YWxpZCIsIGRlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkJsb29tIGZpbHRlciBmb3IgIiArIGRlc2NyaXB0b3IgKyAiIGNvdWxkIG5vdCBiZSBkZXNlcmlhbGl6ZWQiLCBleCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmlsdGVyOworICAgIH0KKworICAgIHN0YXRpYyBib29sZWFuIHNob3VsZFVzZUJsb29tRmlsdGVyKGRvdWJsZSBmcENoYW5jZSkKKyAgICB7CisgICAgICAgIHJldHVybiAhKE1hdGguYWJzKDEgLSBmcENoYW5jZSkgPD0gZmlsdGVyRlBDaGFuY2VUb2xlcmFuY2UpOworICAgIH0KKworICAgIHN0YXRpYyBib29sZWFuIGlzRlBDaGFuY2VEaWZmTmVnbGlnaWJsZShkb3VibGUgZnBDaGFuY2UxLCBkb3VibGUgZnBDaGFuY2UyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1hdGguYWJzKGZwQ2hhbmNlMSAtIGZwQ2hhbmNlMikgPD0gZmlsdGVyRlBDaGFuY2VUb2xlcmFuY2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvSW5kZXhDb21wb25lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L0luZGV4Q29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkZmM2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L0luZGV4Q29tcG9uZW50LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkNodW5rQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JT09wdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CisKK3B1YmxpYyBjbGFzcyBJbmRleENvbXBvbmVudAoreworICAgIHB1YmxpYyBzdGF0aWMgRmlsZUhhbmRsZS5CdWlsZGVyIGZpbGVCdWlsZGVyKEZpbGUgZmlsZSwgSU9PcHRpb25zIGlvT3B0aW9ucywgQ2h1bmtDYWNoZSBjaHVua0NhY2hlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZmlsZSkud2l0aENodW5rQ2FjaGUoY2h1bmtDYWNoZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubW1hcHBlZChpb09wdGlvbnMuaW5kZXhEaXNrQWNjZXNzTW9kZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGaWxlSGFuZGxlLkJ1aWxkZXIgZmlsZUJ1aWxkZXIoQ29tcG9uZW50IGNvbXBvbmVudCwgU1NUYWJsZSBzc1RhYmxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZpbGVCdWlsZGVyKHNzVGFibGUuZGVzY3JpcHRvci5maWxlRm9yKGNvbXBvbmVudCksIHNzVGFibGUuaW9PcHRpb25zLCBzc1RhYmxlLmNodW5rQ2FjaGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmlsZUhhbmRsZS5CdWlsZGVyIGZpbGVCdWlsZGVyKENvbXBvbmVudCBjb21wb25lbnQsIFNTVGFibGUuQnVpbGRlcjw/LCA/PiBidWlsZGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZpbGVCdWlsZGVyKGJ1aWxkZXIuZGVzY3JpcHRvci5maWxlRm9yKGNvbXBvbmVudCksIGJ1aWxkZXIuZ2V0SU9PcHRpb25zKCksIGJ1aWxkZXIuZ2V0Q2h1bmtDYWNoZSgpKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1JhbmdlQXdhcmVTU1RhYmxlV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YjE1YjEuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXNrQm91bmRhcmllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVOZXdUcmFja2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVNdWx0aVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKLQotcHVibGljIGNsYXNzIFJhbmdlQXdhcmVTU1RhYmxlV3JpdGVyIGltcGxlbWVudHMgU1NUYWJsZU11bHRpV3JpdGVyCi17Ci0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBhcnRpdGlvblBvc2l0aW9uPiBib3VuZGFyaWVzOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5PiBkaXJlY3RvcmllczsKLSAgICBwcml2YXRlIGZpbmFsIGludCBzc3RhYmxlTGV2ZWw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBsb25nIGVzdGltYXRlZEtleXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBsb25nIHJlcGFpcmVkQXQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc1RyYW5zaWVudDsKLSAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVGb3JtYXQuVHlwZSBmb3JtYXQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcjsKLSAgICBwcml2YXRlIGZpbmFsIExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlcjsKLSAgICBwcml2YXRlIGludCBjdXJyZW50SW5kZXggPSAtMTsKLSAgICBwdWJsaWMgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxTU1RhYmxlTXVsdGlXcml0ZXI+IGZpbmlzaGVkV3JpdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIHByaXZhdGUgZmluYWwgTGlzdDxTU1RhYmxlUmVhZGVyPiBmaW5pc2hlZFJlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICBwcml2YXRlIFNTVGFibGVNdWx0aVdyaXRlciBjdXJyZW50V3JpdGVyID0gbnVsbDsKLQotICAgIHB1YmxpYyBSYW5nZUF3YXJlU1NUYWJsZVdyaXRlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGxvbmcgZXN0aW1hdGVkS2V5cywgbG9uZyByZXBhaXJlZEF0LCBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyLCBib29sZWFuIGlzVHJhbnNpZW50LCBTU1RhYmxlRm9ybWF0LlR5cGUgZm9ybWF0LCBpbnQgc3N0YWJsZUxldmVsLCBsb25nIHRvdGFsU2l6ZSwgTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyLCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEaXNrQm91bmRhcmllcyBkYiA9IGNmcy5nZXREaXNrQm91bmRhcmllcygpOwotICAgICAgICBkaXJlY3RvcmllcyA9IGRiLmRpcmVjdG9yaWVzOwotICAgICAgICB0aGlzLnNzdGFibGVMZXZlbCA9IHNzdGFibGVMZXZlbDsKLSAgICAgICAgdGhpcy5jZnMgPSBjZnM7Ci0gICAgICAgIHRoaXMuZXN0aW1hdGVkS2V5cyA9IGVzdGltYXRlZEtleXMgLyBkaXJlY3Rvcmllcy5zaXplKCk7Ci0gICAgICAgIHRoaXMucmVwYWlyZWRBdCA9IHJlcGFpcmVkQXQ7Ci0gICAgICAgIHRoaXMucGVuZGluZ1JlcGFpciA9IHBlbmRpbmdSZXBhaXI7Ci0gICAgICAgIHRoaXMuaXNUcmFuc2llbnQgPSBpc1RyYW5zaWVudDsKLSAgICAgICAgdGhpcy5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIHRoaXMubGlmZWN5Y2xlTmV3VHJhY2tlciA9IGxpZmVjeWNsZU5ld1RyYWNrZXI7Ci0gICAgICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyOwotICAgICAgICBib3VuZGFyaWVzID0gZGIucG9zaXRpb25zOwotICAgICAgICBpZiAoYm91bmRhcmllcyA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5IGxvY2FsRGlyID0gY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0V3JpdGVhYmxlTG9jYXRpb24odG90YWxTaXplKTsKLSAgICAgICAgICAgIGlmIChsb2NhbERpciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbnN1ZmZpY2llbnQgZGlzayBzcGFjZSB0byBzdG9yZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkodG90YWxTaXplKSkpOwotICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGNmcy5nZXREaXJlY3RvcmllcygpLmdldExvY2F0aW9uRm9yRGlzayhsb2NhbERpciksIGZvcm1hdCk7Ci0gICAgICAgICAgICBjdXJyZW50V3JpdGVyID0gY2ZzLmNyZWF0ZVNTVGFibGVNdWx0aVdyaXRlcihkZXNjLCBlc3RpbWF0ZWRLZXlzLCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpc1RyYW5zaWVudCwgc3N0YWJsZUxldmVsLCBoZWFkZXIsIGxpZmVjeWNsZU5ld1RyYWNrZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG1heWJlU3dpdGNoV3JpdGVyKERlY29yYXRlZEtleSBrZXkpCi0gICAgewotICAgICAgICBpZiAoYm91bmRhcmllcyA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGJvb2xlYW4gc3dpdGNoZWQgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKGN1cnJlbnRJbmRleCA8IDAgfHwga2V5LmNvbXBhcmVUbyhib3VuZGFyaWVzLmdldChjdXJyZW50SW5kZXgpKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGN1cnJlbnRJbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN3aXRjaGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY3VycmVudFdyaXRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIGZpbmlzaGVkV3JpdGVycy5hZGQoY3VycmVudFdyaXRlcik7Ci0KLSAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2soZGlyZWN0b3JpZXMuZ2V0KGN1cnJlbnRJbmRleCkpLCBmb3JtYXQpOwotICAgICAgICAgICAgY3VycmVudFdyaXRlciA9IGNmcy5jcmVhdGVTU1RhYmxlTXVsdGlXcml0ZXIoZGVzYywgZXN0aW1hdGVkS2V5cywgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgaXNUcmFuc2llbnQsIHNzdGFibGVMZXZlbCwgaGVhZGVyLCBsaWZlY3ljbGVOZXdUcmFja2VyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGFwcGVuZChVbmZpbHRlcmVkUm93SXRlcmF0b3IgcGFydGl0aW9uKQotICAgIHsKLSAgICAgICAgbWF5YmVTd2l0Y2hXcml0ZXIocGFydGl0aW9uLnBhcnRpdGlvbktleSgpKTsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRXcml0ZXIuYXBwZW5kKHBhcnRpdGlvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gZmluaXNoKGxvbmcgcmVwYWlyZWRBdCwgbG9uZyBtYXhEYXRhQWdlLCBib29sZWFuIG9wZW5SZXN1bHQpCi0gICAgewotICAgICAgICBpZiAoY3VycmVudFdyaXRlciAhPSBudWxsKQotICAgICAgICAgICAgZmluaXNoZWRXcml0ZXJzLmFkZChjdXJyZW50V3JpdGVyKTsKLSAgICAgICAgY3VycmVudFdyaXRlciA9IG51bGw7Ci0gICAgICAgIGZvciAoU1NUYWJsZU11bHRpV3JpdGVyIHdyaXRlciA6IGZpbmlzaGVkV3JpdGVycykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHdyaXRlci5nZXRGaWxlUG9pbnRlcigpID4gMCkKLSAgICAgICAgICAgICAgICBmaW5pc2hlZFJlYWRlcnMuYWRkQWxsKHdyaXRlci5maW5pc2gocmVwYWlyZWRBdCwgbWF4RGF0YUFnZSwgb3BlblJlc3VsdCkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFNTVGFibGVNdWx0aVdyaXRlci5hYm9ydE9yRGllKHdyaXRlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbmlzaGVkUmVhZGVyczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBmaW5pc2goYm9vbGVhbiBvcGVuUmVzdWx0KQotICAgIHsKLSAgICAgICAgaWYgKGN1cnJlbnRXcml0ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgIGZpbmlzaGVkV3JpdGVycy5hZGQoY3VycmVudFdyaXRlcik7Ci0gICAgICAgIGN1cnJlbnRXcml0ZXIgPSBudWxsOwotICAgICAgICBmb3IgKFNTVGFibGVNdWx0aVdyaXRlciB3cml0ZXIgOiBmaW5pc2hlZFdyaXRlcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh3cml0ZXIuZ2V0RmlsZVBvaW50ZXIoKSA+IDApCi0gICAgICAgICAgICAgICAgZmluaXNoZWRSZWFkZXJzLmFkZEFsbCh3cml0ZXIuZmluaXNoKG9wZW5SZXN1bHQpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBTU1RhYmxlTXVsdGlXcml0ZXIuYWJvcnRPckRpZSh3cml0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaW5pc2hlZFJlYWRlcnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gZmluaXNoZWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbmlzaGVkUmVhZGVyczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU1NUYWJsZU11bHRpV3JpdGVyIHNldE9wZW5SZXN1bHQoYm9vbGVhbiBvcGVuUmVzdWx0KQotICAgIHsKLSAgICAgICAgZmluaXNoZWRXcml0ZXJzLmZvckVhY2goKHcpIC0+IHcuc2V0T3BlblJlc3VsdChvcGVuUmVzdWx0KSk7Ci0gICAgICAgIGN1cnJlbnRXcml0ZXIuc2V0T3BlblJlc3VsdChvcGVuUmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaWxlbmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gU3RyaW5nLmpvaW4oIi8iLCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEZpbGVQb2ludGVyKCkKLSAgICB7Ci0gICAgICAgcmV0dXJuIGN1cnJlbnRXcml0ZXIgIT0gbnVsbCA/IGN1cnJlbnRXcml0ZXIuZ2V0RmlsZVBvaW50ZXIoKSA6IDBMOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUYWJsZUlkIGdldFRhYmxlSWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNmcy5tZXRhZGF0YS5pZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVGhyb3dhYmxlIGNvbW1pdChUaHJvd2FibGUgYWNjdW11bGF0ZSkKLSAgICB7Ci0gICAgICAgIGlmIChjdXJyZW50V3JpdGVyICE9IG51bGwpCi0gICAgICAgICAgICBmaW5pc2hlZFdyaXRlcnMuYWRkKGN1cnJlbnRXcml0ZXIpOwotICAgICAgICBjdXJyZW50V3JpdGVyID0gbnVsbDsKLSAgICAgICAgZm9yIChTU1RhYmxlTXVsdGlXcml0ZXIgd3JpdGVyIDogZmluaXNoZWRXcml0ZXJzKQotICAgICAgICAgICAgYWNjdW11bGF0ZSA9IHdyaXRlci5jb21taXQoYWNjdW11bGF0ZSk7Ci0gICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUaHJvd2FibGUgYWJvcnQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCi0gICAgewotICAgICAgICBpZiAoY3VycmVudFdyaXRlciAhPSBudWxsKQotICAgICAgICAgICAgZmluaXNoZWRXcml0ZXJzLmFkZChjdXJyZW50V3JpdGVyKTsKLSAgICAgICAgY3VycmVudFdyaXRlciA9IG51bGw7Ci0gICAgICAgIGZvciAoU1NUYWJsZU11bHRpV3JpdGVyIGZpbmlzaGVkV3JpdGVyIDogZmluaXNoZWRXcml0ZXJzKQotICAgICAgICAgICAgYWNjdW11bGF0ZSA9IGZpbmlzaGVkV3JpdGVyLmFib3J0KGFjY3VtdWxhdGUpOwotCi0gICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVUb0NvbW1pdCgpCi0gICAgewotICAgICAgICBpZiAoY3VycmVudFdyaXRlciAhPSBudWxsKQotICAgICAgICAgICAgZmluaXNoZWRXcml0ZXJzLmFkZChjdXJyZW50V3JpdGVyKTsKLSAgICAgICAgY3VycmVudFdyaXRlciA9IG51bGw7Ci0gICAgICAgIGZpbmlzaGVkV3JpdGVycy5mb3JFYWNoKFNTVGFibGVNdWx0aVdyaXRlcjo6cHJlcGFyZVRvQ29tbWl0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgewotICAgICAgICBpZiAoY3VycmVudFdyaXRlciAhPSBudWxsKQotICAgICAgICAgICAgZmluaXNoZWRXcml0ZXJzLmFkZChjdXJyZW50V3JpdGVyKTsKLSAgICAgICAgY3VycmVudFdyaXRlciA9IG51bGw7Ci0gICAgICAgIGZpbmlzaGVkV3JpdGVycy5mb3JFYWNoKFNTVGFibGVNdWx0aVdyaXRlcjo6Y2xvc2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVGbHVzaE9ic2VydmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlRmx1c2hPYnNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk5MjVlLi4wMDAwMDAwCi0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVGbHVzaE9ic2VydmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7Ci0KLS8qKgotICogT2JzZXJ2ZXIgZm9yIGV2ZW50cyBpbiB0aGUgbGlmZWN5Y2xlIG9mIHdyaXRpbmcgb3V0IGFuIHNzdGFibGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU1NUYWJsZUZsdXNoT2JzZXJ2ZXIKLXsKLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYmVmb3JlIHdyaXRpbmcgYW55IGRhdGEgdG8gdGhlIHNzdGFibGUuCi0gICAgICovCi0gICAgdm9pZCBiZWdpbigpOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gYSBuZXcgcGFydGl0aW9uIGluIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIHNzdGFibGUsCi0gICAgICogYnV0IGJlZm9yZSBhbnkgY2VsbHMgYXJlIHByb2Nlc3NlZCAoc2VlIHtAbGluayAjbmV4dFVuZmlsdGVyZWRDbHVzdGVyKFVuZmlsdGVyZWQpfSkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgYmVpbmcgYXBwZW5kZWQgdG8gU1NUYWJsZS4KLSAgICAgKiBAcGFyYW0gaW5kZXhQb3NpdGlvbiBUaGUgcG9zaXRpb24gb2YgdGhlIGtleSBpbiB0aGUgU1NUYWJsZSBQUklNQVJZX0lOREVYIGZpbGUuCi0gICAgICovCi0gICAgdm9pZCBzdGFydFBhcnRpdGlvbihEZWNvcmF0ZWRLZXkga2V5LCBsb25nIGluZGV4UG9zaXRpb24pOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGFmdGVyIHRoZSB1bmZpbHRlcmVkIGNsdXN0ZXIgaXMgd3JpdHRlbiB0byB0aGUgc3N0YWJsZS4KLSAgICAgKiBXaWxsIGJlIHByZWNlZGVkIGJ5IGEgY2FsbCB0byB7QGNvZGUgc3RhcnRQYXJ0aXRpb24oRGVjb3JhdGVkS2V5LCBsb25nKX0sCi0gICAgICogYW5kIHRoZSBjbHVzdGVyIHNob3VsZCBiZSBhc3N1bWVkIHRvIGJlbG9uZyB0byB0aGF0IHBhcnRpdGlvbi4KLSAgICAgKgotICAgICAqIEBwYXJhbSB1bmZpbHRlcmVkQ2x1c3RlciBUaGUgdW5maWx0ZXJlZCBjbHVzdGVyIGJlaW5nIGFkZGVkIHRvIFNTVGFibGUuCi0gICAgICovCi0gICAgdm9pZCBuZXh0VW5maWx0ZXJlZENsdXN0ZXIoVW5maWx0ZXJlZCB1bmZpbHRlcmVkQ2x1c3Rlcik7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBhbGwgZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBmaWxlIGFuZCBpdCdzIHJlYWR5IHRvIGJlIGZpbmlzaGVkIHVwLgotICAgICAqLwotICAgIHZvaWQgY29tcGxldGUoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVGb3JtYXQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVGb3JtYXQuamF2YQppbmRleCAxNGY2NjAyLi4xY2FhODdiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlRm9ybWF0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZUZvcm1hdC5qYXZhCkBAIC0xNyw2MSArMTcsMTk4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJNYXRjaGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTm9ubnVsbDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlTmV3VHJhY2tlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU2NydWJiZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5NZXRyaWNzUHJvdmlkZXJzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKIC8qKgogICogUHJvdmlkZXMgdGhlIGFjY2Vzc29ycyB0byBkYXRhIG9uIGRpc2suCiAgKi8KLXB1YmxpYyBpbnRlcmZhY2UgU1NUYWJsZUZvcm1hdAorcHVibGljIGludGVyZmFjZSBTU1RhYmxlRm9ybWF0PFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyLCBXIGV4dGVuZHMgU1NUYWJsZVdyaXRlcj4KIHsKLSAgICBzdGF0aWMgYm9vbGVhbiBlbmFibGVTU1RhYmxlRGV2ZWxvcG1lbnRUZXN0TW9kZSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLnRlc3Quc3N0YWJsZWZvcm1hdGRldmVsb3BtZW50Iik7Ci0KKyAgICBTdHJpbmcgbmFtZSgpOwogCiAgICAgVmVyc2lvbiBnZXRMYXRlc3RWZXJzaW9uKCk7CiAgICAgVmVyc2lvbiBnZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKTsKIAotICAgIFNTVGFibGVXcml0ZXIuRmFjdG9yeSBnZXRXcml0ZXJGYWN0b3J5KCk7Ci0gICAgU1NUYWJsZVJlYWRlci5GYWN0b3J5IGdldFJlYWRlckZhY3RvcnkoKTsKKyAgICBTU1RhYmxlV3JpdGVyRmFjdG9yeTxXLCA/PiBnZXRXcml0ZXJGYWN0b3J5KCk7CiAKLSAgICBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplcjw/PiBnZXRJbmRleFNlcmlhbGl6ZXIoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgVmVyc2lvbiB2ZXJzaW9uLCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcik7CisgICAgU1NUYWJsZVJlYWRlckZhY3Rvcnk8UiwgPz4gZ2V0UmVhZGVyRmFjdG9yeSgpOwogCi0gICAgcHVibGljIHN0YXRpYyBlbnVtIFR5cGUKKyAgICAvKioKKyAgICAgKiBBbGwgdGhlIGNvbXBvbmVudHMgdGhhdCB0aGUgd3JpdHRlciBjYW4gcHJvZHVjZSB3aGVuIHNhdmluZyBhbiBzc3RhYmxlLCBhcyB3ZWxsIGFzIGFsbCB0aGUgY29tcG9uZW50cworICAgICAqIHRoYXQgdGhlIHJlYWRlciBjYW4gcmVhZC4KKyAgICAgKi8KKyAgICBTZXQ8Q29tcG9uZW50PiBhbGxDb21wb25lbnRzKCk7CisKKyAgICBTZXQ8Q29tcG9uZW50PiBzdHJlYW1pbmdDb21wb25lbnRzKCk7CisKKyAgICBTZXQ8Q29tcG9uZW50PiBwcmltYXJ5Q29tcG9uZW50cygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBjb21wb25lbnRzIHJlcXVpcmVkIGJ5IG9mZmxpbmUgY29tcGFjdGlvbiB0YXNrcyAtIGxpa2Ugc3BsaXR0aW5nIHNzdGFibGVzLgorICAgICAqLworICAgIFNldDxDb21wb25lbnQ+IGJhdGNoQ29tcG9uZW50cygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29tcG9uZW50cyB3aGljaCBzaG91bGQgYmUgc2VsZWN0ZWQgZm9yIHVwbG9hZCBieSB0aGUgc3N0YWJsZSBsb2FkZXIuCisgICAgICovCisgICAgU2V0PENvbXBvbmVudD4gdXBsb2FkQ29tcG9uZW50cygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNldCBvZiB0aGUgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBjaGFuZ2VkIGFmdGVyIGFuIHNzdGFibGUgd2FzIHdyaXR0ZW4uCisgICAgICovCisgICAgU2V0PENvbXBvbmVudD4gbXV0YWJsZUNvbXBvbmVudHMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZXQgb2YgY29tcG9uZW50cyB0aGF0IGNhbiBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB3aGVuIGxvYWRpbmcgc3N0YWJsZSBhbmQgdGh1cyBhcmUgbm90IG1hbmRhdG9yeS4KKyAgICAgKi8KKyAgICBTZXQ8Q29tcG9uZW50PiBnZW5lcmF0ZWRPbkxvYWRDb21wb25lbnRzKCk7CisKKyAgICBLZXlDYWNoZVZhbHVlU2VyaWFsaXplcjxSLCA/PiBnZXRLZXlDYWNoZVZhbHVlU2VyaWFsaXplcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBzY3J1YmJlciBmb3IgYW4gc3N0YWJsZS4gTm90ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBtdXN0IGNvbnRhaW4gb25seSBvbmUgcmVhZGVyCisgICAgICogYW5kIHRoZSByZWFkZXIgbXVzdCBtYXRjaCB0aGUgcHJvdmlkZWQgY2ZzLgorICAgICAqLworICAgIElTY3J1YmJlciBnZXRTY3J1YmJlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIElTY3J1YmJlci5PcHRpb25zIG9wdGlvbnMpOworCisgICAgTWV0cmljc1Byb3ZpZGVycyBnZXRGb3JtYXRTcGVjaWZpY01ldHJpY3NQcm92aWRlcnMoKTsKKworICAgIHZvaWQgZGVsZXRlT3JwaGFuZWRDb21wb25lbnRzKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyk7CisKKyAgICAvKioKKyAgICAgKiBEZWxldGVzIHRoZSBleGlzdGluZyBjb21wb25lbnRzIG9mIHRoZSBzc3RhYmxlcyByZXByZXNlbnRlZCBieSB0aGUgcHJvdmlkZWQgZGVzY3JpcHRvci4KKyAgICAgKiBUaGUgbWV0aG9kIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGNsZWFuaW5nIHVwIHRoZSBpbi1tZW1vcnkgcmVzb3VyY2VzIG9jY3VwaWVkIGJ5IHRoZSBzdHVmZiByZWxhdGVkIHRvIHRoYXQKKyAgICAgKiBzc3RhYmxlcywgc3VjaCBhcyByb3cga2V5IGNhY2hlIGVudHJpZXMuCisgICAgICovCisgICAgdm9pZCBkZWxldGUoRGVzY3JpcHRvciBkZXNjcmlwdG9yKTsKKworICAgIGludGVyZmFjZSBTU1RhYmxlUmVhZGVyRmFjdG9yeTxSIGV4dGVuZHMgU1NUYWJsZVJlYWRlciwgQiBleHRlbmRzIFNTVGFibGVSZWFkZXIuQnVpbGRlcjxSLCBCPj4KICAgICB7Ci0gICAgICAgIC8vVGhlIG9yaWdpbmFsIHNzdGFibGUgZm9ybWF0Ci0gICAgICAgIEJJRygiYmlnIiwgQmlnRm9ybWF0Lmluc3RhbmNlKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgc2ltcGxlIGJ1aWxkZXIgd2hpY2ggY3JlYXRlcyBhbiBpbnN0bmFjZSBvZiB7QGxpbmsgU1NUYWJsZVJlYWRlcn0gd2l0aCB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy4KKyAgICAgICAgICogSXQgZXhwZWN0cyB0aGF0IGFsbCB0aGUgcmVxdWlyZWQgcmVzb3VyY2VzIHRvIGJlIG9wZW5lZC9sb2FkZWQgZXh0ZXJuYWxseSBieSB0aGUgY2FsbGVyLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIGJ1aWxkZXIgaXMgZXhwZWN0ZWQgdG8gcGVyZm9ybSBiYXNpYyB2YWxpZGF0aW9uIG9mIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgU1NUYWJsZVJlYWRlci5CdWlsZGVyPFIsIEI+IGJ1aWxkZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yKTsKIAotICAgICAgICBwdWJsaWMgZmluYWwgU1NUYWJsZUZvcm1hdCBpbmZvOwotICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGJ1aWxkZXIgd2hpY2ggb3BlbnMvbG9hZHMgYWxsIHRoZSByZXF1aXJlZCByZXNvdXJjZXMgdXBvbiBleGVjdXRpb24gb2YKKyAgICAgICAgICoge0BsaW5rIFNTVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlciNidWlsZChTU1RhYmxlLk93bmVyLCBib29sZWFuLCBib29sZWFuKX0gYW5kIHBhc3NlZCB0aGVtIHRvIHRoZSBjcmVhdGVkCisgICAgICAgICAqIHJlYWRlciBpbnN0YW5jZS4gSWYgdGhlIGNyZWF0aW9uIG9mIHtAbGluayBTU1RhYmxlUmVhZGVyfSBmYWlscywgbm8gcmVzb3VyY2VzIHNob3VsZCBiZSBsZWZ0IG9wZW5lZC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBidWlsZGVyIGlzIGV4cGVjdGVkIHRvIHBlcmZvcm0gYmFzaWMgdmFsaWRhdGlvbiBvZiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycy4KKyAgICAgICAgICovCisgICAgICAgIFNTVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlcjxSLCBCPiBsb2FkaW5nQnVpbGRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFRhYmxlTWV0YWRhdGFSZWYgdGFibGVNZXRhZGF0YVJlZiwgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyk7CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBUeXBlIGN1cnJlbnQoKQorICAgICAgICAvKioKKyAgICAgICAgICogUmV0cmlldmVzIGEga2V5IHJhbmdlIGZvciB0aGUgZ2l2ZW4gc3N0YWJsZSBhdCB0aGUgbG93ZXN0IGNvc3QgLSB0aGF0IGlzLCB3aXRob3V0IG9wZW5pbmcgYWxsIHNzdGFibGVzIGZpbGVzCisgICAgICAgICAqIGlmIHBvc3NpYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgUGFpcjxEZWNvcmF0ZWRLZXksIERlY29yYXRlZEtleT4gcmVhZEtleVJhbmdlKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgQ2xhc3M8Uj4gZ2V0UmVhZGVyQ2xhc3MoKTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgU1NUYWJsZVdyaXRlckZhY3Rvcnk8VyBleHRlbmRzIFNTVGFibGVXcml0ZXIsIEIgZXh0ZW5kcyBTU1RhYmxlV3JpdGVyLkJ1aWxkZXI8VywgQj4+CisgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIG5ldyBidWlsZGVyIHdoaWNoIGNhbiBjcmVhdGUgaW5zdGFuY2Ugb2Yge0BsaW5rIFNTVGFibGVXcml0ZXJ9IHdpdGggdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuCisgICAgICAgICAqIFNpbWlsYXJseSB0byB0aGUgbG9hZGluZyBidWlsZGVyLCBpdCBzaG91bGQgb3BlbiB0aGUgcmVxdWlyZWQgcmVzb3VyY2VzIHdoZW4KKyAgICAgICAgICogdGhlIHtAbGluayBTU1RhYmxlV3JpdGVyLkJ1aWxkZXIjYnVpbGQoTGlmZWN5Y2xlTmV3VHJhY2tlciwgU1NUYWJsZS5Pd25lcil9IG1ldGhvZCBpcyBjYWxsZWQuCisgICAgICAgICAqIEl0IHNob3VsZCBub3QgbGV0IHRoZSBjYWxsZXIgcGFzc2luZyBhbnkgY2xvc2VhYmxlIHJlc291cmNlcyBkaXJlY3RseSwgdGhhdCBpcywgdmlhIHNldHRlcnMuCisgICAgICAgICAqIElmIGJ1aWxkaW5nIGZhaWxzLCBhbGwgdGhlIG9wZW5lZCByZXNvdXJjZXMgc2hvdWxkIGJlIHJlbGVhc2VkLgorICAgICAgICAgKi8KKyAgICAgICAgQiBidWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvcik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRyaWVzIHRvIGVzdGltYXRlIHRoZSBzaXplIG9mIGFsbCB0aGUgc3N0YWJsZSBmaWxlcyBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgbG9uZyBlc3RpbWF0ZVNpemUoU1NUYWJsZVdyaXRlci5TU1RhYmxlU2l6ZVBhcmFtZXRlcnMgcGFyYW1ldGVycyk7CisgICAgfQorCisgICAgY2xhc3MgQ29tcG9uZW50cworICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlcwogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQklHOworICAgICAgICAgICAgLy8gdGhlIGJhc2UgZGF0YSBmb3IgYW4gc3N0YWJsZTogdGhlIHJlbWFpbmluZyBjb21wb25lbnRzIGNhbiBiZSByZWdlbmVyYXRlZAorICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIGRhdGEgY29tcG9uZW50CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudC5UeXBlIERBVEEgPSBDb21wb25lbnQuVHlwZS5jcmVhdGVTaW5nbGV0b24oIkRBVEEiLCAiRGF0YS5kYiIsIG51bGwpOworICAgICAgICAgICAgLy8gZmlsZSB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHVuY29tcHJlc3NlZCBkYXRhIGxlbmd0aCwgY2h1bmsgb2Zmc2V0cyBldGMuCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudC5UeXBlIENPTVBSRVNTSU9OX0lORk8gPSBDb21wb25lbnQuVHlwZS5jcmVhdGVTaW5nbGV0b24oIkNPTVBSRVNTSU9OX0lORk8iLCAiQ29tcHJlc3Npb25JbmZvLmRiIiwgbnVsbCk7CisgICAgICAgICAgICAvLyBzdGF0aXN0aWNhbCBtZXRhZGF0YSBhYm91dCB0aGUgY29udGVudCBvZiB0aGUgc3N0YWJsZQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnQuVHlwZSBTVEFUUyA9IENvbXBvbmVudC5UeXBlLmNyZWF0ZVNpbmdsZXRvbigiU1RBVFMiLCAiU3RhdGlzdGljcy5kYiIsIG51bGwpOworICAgICAgICAgICAgLy8gc2VyaWFsaXplZCBibG9vbSBmaWx0ZXIgZm9yIHRoZSByb3cga2V5cyBpbiB0aGUgc3N0YWJsZQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnQuVHlwZSBGSUxURVIgPSBDb21wb25lbnQuVHlwZS5jcmVhdGVTaW5nbGV0b24oIkZJTFRFUiIsICJGaWx0ZXIuZGIiLCBudWxsKTsKKyAgICAgICAgICAgIC8vIGhvbGRzIENSQzMyIGNoZWNrc3VtIG9mIHRoZSBkYXRhIGZpbGUKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50LlR5cGUgRElHRVNUID0gQ29tcG9uZW50LlR5cGUuY3JlYXRlU2luZ2xldG9uKCJESUdFU1QiLCAiRGlnZXN0LmNyYzMyIiwgbnVsbCk7CisgICAgICAgICAgICAvLyBob2xkcyB0aGUgQ1JDMzIgZm9yIGNodW5rcyBpbiBhbiB1bmNvbXByZXNzZWQgZmlsZS4KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50LlR5cGUgQ1JDID0gQ29tcG9uZW50LlR5cGUuY3JlYXRlU2luZ2xldG9uKCJDUkMiLCAiQ1JDLmRiIiwgbnVsbCk7CisgICAgICAgICAgICAvLyB0YWJsZSBvZiBjb250ZW50cywgc3RvcmVzIHRoZSBsaXN0IG9mIGFsbCBjb21wb25lbnRzIGZvciB0aGUgc3N0YWJsZQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnQuVHlwZSBUT0MgPSBDb21wb25lbnQuVHlwZS5jcmVhdGVTaW5nbGV0b24oIlRPQyIsICJUT0MudHh0IiwgbnVsbCk7CisgICAgICAgICAgICAvLyBidWlsdC1pbiBzZWNvbmRhcnkgaW5kZXggKG1heSBleGlzdCBtdWx0aXBsZSBwZXIgc3N0YWJsZSkKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50LlR5cGUgU0VDT05EQVJZX0lOREVYID0gQ29tcG9uZW50LlR5cGUuY3JlYXRlKCJTRUNPTkRBUllfSU5ERVgiLCAiU0lfLiouZGIiLCBudWxsKTsKKyAgICAgICAgICAgIC8vIGN1c3RvbSBjb21wb25lbnQsIHVzZWQgYnkgZS5nLiBjdXN0b20gY29tcGFjdGlvbiBzdHJhdGVneQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnQuVHlwZSBDVVNUT00gPSBDb21wb25lbnQuVHlwZS5jcmVhdGUoIkNVU1RPTSIsIG51bGwsIG51bGwpOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBUeXBlKFN0cmluZyBuYW1lLCBTU1RhYmxlRm9ybWF0IGluZm8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vU2luY2UgZm9ybWF0IGNvbWVzIHJpZ2h0IGFmdGVyIGdlbmVyYXRpb24KLSAgICAgICAgICAgIC8vd2UgZGlzYWxsb3cgZm9ybWF0cyB3aXRoIG51bWVyaWMgbmFtZXMKLSAgICAgICAgICAgIGFzc2VydCAhQ2hhck1hdGNoZXIuZGlnaXQoKS5tYXRjaGVzQWxsT2YobmFtZSk7CisgICAgICAgIC8vIHNpbmdsZXRvbiBjb21wb25lbnRzIGZvciB0eXBlcyB0aGF0IGRvbid0IG5lZWQgaWRzCisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29tcG9uZW50IERBVEEgPSBUeXBlcy5EQVRBLmdldFNpbmdsZXRvbigpOworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIENvbXBvbmVudCBDT01QUkVTU0lPTl9JTkZPID0gVHlwZXMuQ09NUFJFU1NJT05fSU5GTy5nZXRTaW5nbGV0b24oKTsKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgU1RBVFMgPSBUeXBlcy5TVEFUUy5nZXRTaW5nbGV0b24oKTsKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgRklMVEVSID0gVHlwZXMuRklMVEVSLmdldFNpbmdsZXRvbigpOworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIENvbXBvbmVudCBESUdFU1QgPSBUeXBlcy5ESUdFU1QuZ2V0U2luZ2xldG9uKCk7CisgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ29tcG9uZW50IENSQyA9IFR5cGVzLkNSQy5nZXRTaW5nbGV0b24oKTsKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgVE9DID0gVHlwZXMuVE9DLmdldFNpbmdsZXRvbigpOworICAgIH0KIAotICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgICAgIHRoaXMuaW5mbyA9IGluZm87Ci0gICAgICAgIH0KKyAgICBpbnRlcmZhY2UgS2V5Q2FjaGVWYWx1ZVNlcmlhbGl6ZXI8UiBleHRlbmRzIFNTVGFibGVSZWFkZXIsIFQgZXh0ZW5kcyBBYnN0cmFjdFJvd0luZGV4RW50cnk+CisgICAgeworICAgICAgICB2b2lkIHNraXAoRGF0YUlucHV0UGx1cyBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVHlwZSB2YWxpZGF0ZShTdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChUeXBlIHZhbGlkIDogVHlwZS52YWx1ZXMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsaWQubmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWQ7Ci0gICAgICAgICAgICB9CisgICAgICAgIFQgZGVzZXJpYWxpemUoUiByZWFkZXIsIERhdGFJbnB1dFBsdXMgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gVHlwZSBjb25zdGFudCAiICsgbmFtZSk7Ci0gICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXJpYWxpemUoVCBlbnRyeSwgRGF0YU91dHB1dFBsdXMgb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgaW50ZXJmYWNlIEZhY3RvcnkKKyAgICB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGEgbmFtZSBvZiB0aGUgZm9ybWF0LiBGb3JtYXQgbmFtZSBtdXN0IG5vdCBiZSBlbXB0eSwgbXVzdCBiZSB1bmlxdWUgYW5kIG11c3QgY29uc2lzdCBvbmx5IG9mIGxvd2VyY2FzZSBsZXR0ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIG5hbWUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgc3N0YWJsZSBmb3JtYXQgY29uZmlndXJlZCB3aXRoIHRoZSBwcm92aWRlZCBvcHRpb25zLgorICAgICAgICAgKiA8cC8+CisgICAgICAgICAqIFRoZSBtZXRob2QgaXMgZXhwZWN0ZWQgdG8gdmFsaWRhdGUgdGhlIG9wdGlvbnMsIGFuZCB0aHJvdworICAgICAgICAgKiB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9ufSBpZiB0aGUgdmFsaWRhdGlvbiBmYWlscy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG9wdGlvbnMgICAgb3ZlcnJpZGVzIGZvciB0aGUgZGVmYXVsdCBvcHRpb25zLCBjYW4gYmUgZW1wdHksIGNhbm5vdCBiZSBudWxsCisgICAgICAgICAqLworICAgICAgICBTU1RhYmxlRm9ybWF0PD8sID8+IGdldEluc3RhbmNlKEBOb25udWxsIE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVJlYWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVJlYWRlci5qYXZhCmluZGV4IGYyNmNmNjUuLmZkMzRjMDIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVSZWFkZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlUmVhZGVyLmphdmEKQEAgLTIwLDEyMyArMjAsMTMzIEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk9yZGVyaW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuTG9uZ3M7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlJhdGVMaW1pdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvclBsdXM7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IGNvbS5jbGVhcnNwcmluZy5hbmFseXRpY3Muc3RyZWFtLmNhcmRpbmFsaXR5LkNhcmRpbmFsaXR5TWVyZ2VFeGNlcHRpb247Ci1pbXBvcnQgY29tLmNsZWFyc3ByaW5nLmFuYWx5dGljcy5zdHJlYW0uY2FyZGluYWxpdHkuSHlwZXJMb2dMb2dQbHVzOwogaW1wb3J0IGNvbS5jbGVhcnNwcmluZy5hbmFseXRpY3Muc3RyZWFtLmNhcmRpbmFsaXR5LklDYXJkaW5hbGl0eTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkluc3RydW1lbnRpbmdDYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5LZXlDYWNoZUtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlN5c3RlbUtleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkU291cmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQm91bmRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Vbmtub3duQ29sdW1uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNSZWFkRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JVmVyaWZpZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5LZXlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLktleVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlSWRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUlkZW50aXR5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5Db21wYWN0aW9uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQ2hhbm5lbFByb3h5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQ2hlY2tlZEZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUludGVncml0eU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuUmVzdG9yYWJsZU1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5DYWNoaW5nUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DYWNoZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50Lio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkV4ZWN1dG9yVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk5hdGl2ZUxpYnJhcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuT3BPcmRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlNlbGZSZWZDb3VudGVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuU2hhcmVkQ2xvc2VhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVW5jaGVja2VkSW50ZXJydXB0ZWRFeGNlcHRpb247CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXMuU0VDT05EQVJZX0lOREVYX05BTUVfU0VQQVJBVE9SOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkJsb2NraW5nUXVldWVzLm5ld0Jsb2NraW5nUXVldWU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuU2hhcmVkQ2xvc2VhYmxlLnNoYXJlZENvcHlPck51bGw7CiAKIC8qKgotICogQW4gU1NUYWJsZVJlYWRlciBjYW4gYmUgY29uc3RydWN0ZWQgaW4gYSBudW1iZXIgb2YgcGxhY2VzLCBidXQgdHlwaWNhbGx5IGlzIGVpdGhlcgotICogcmVhZCBmcm9tIGRpc2sgYXQgc3RhcnR1cCwgb3IgY29uc3RydWN0ZWQgZnJvbSBhIGZsdXNoZWQgbWVtdGFibGUsIG9yIGFmdGVyIGNvbXBhY3Rpb24KLSAqIHRvIHJlcGxhY2Ugc29tZSBleGlzdGluZyBzc3RhYmxlcy4gSG93ZXZlciBvbmNlIGNyZWF0ZWQsIGFuIHNzdGFibGVyZWFkZXIgbWF5IGFsc28gYmUgbW9kaWZpZWQuCi0gKgotICogQSByZWFkZXIncyBPcGVuUmVhc29uIGRlc2NyaWJlcyBpdHMgY3VycmVudCBzdGFnZSBpbiBpdHMgbGlmZWN5Y2xlLCBhcyBmb2xsb3dzOgotICoKLSAqCi0gKiA8cHJlPiB7QGNvZGUKLSAqIE5PUk1BTAotICogRnJvbTogICAgICAgTm9uZSAgICAgICAgPT4gUmVhZGVyIGhhcyBiZWVuIHJlYWQgZnJvbSBkaXNrLCBlaXRoZXIgYXQgc3RhcnR1cCBvciBmcm9tIGEgZmx1c2hlZCBtZW10YWJsZQotICogICAgICAgICAgICAgRUFSTFkgICAgICAgPT4gUmVhZGVyIGlzIHRoZSBmaW5hbCByZXN1bHQgb2YgYSBjb21wYWN0aW9uCi0gKiAgICAgICAgICAgICBNT1ZFRF9TVEFSVCA9PiBSZWFkZXIgV0FTIGJlaW5nIGNvbXBhY3RlZCwgYnV0IHRoaXMgZmFpbGVkIGFuZCBpdCBoYXMgYmVlbiByZXN0b3JlZCB0byBOT1JNQUwgc3RhdHVzCi0gKgotICogRUFSTFkKLSAqIEZyb206ICAgICAgIE5vbmUgICAgICAgID0+IFJlYWRlciBpcyBhIGNvbXBhY3Rpb24gcmVwbGFjZW1lbnQgdGhhdCBpcyBlaXRoZXIgaW5jb21wbGV0ZSBhbmQgaGFzIGJlZW4gb3BlbmVkCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byByZXByZXNlbnQgaXRzIHBhcnRpYWwgcmVzdWx0IHN0YXR1cywgb3IgaGFzIGJlZW4gZmluaXNoZWQgYnV0IHRoZSBjb21wYWN0aW9uCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyBhIHBhcnQgb2YgaGFzIG5vdCB5ZXQgY29tcGxldGVkIGZ1bGx5Ci0gKiAgICAgICAgICAgICBFQVJMWSAgICAgICA9PiBTYW1lIGFzIGZyb20gTm9uZSwgb25seSBpdCBpcyBub3QgdGhlIGZpcnN0IHRpbWUgaXQgaGFzIGJlZW4KLSAqCi0gKiBNT1ZFRF9TVEFSVAotICogRnJvbTogICAgICAgTk9STUFMICAgICAgPT4gUmVhZGVyIGlzIGJlaW5nIGNvbXBhY3RlZC4gVGhpcyBjb21wYWN0aW9uIGhhcyBub3QgZmluaXNoZWQsIGJ1dCB0aGUgY29tcGFjdGlvbiByZXN1bHQKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGVpdGhlciBwYXJ0aWFsbHkgb3IgZnVsbHkgb3BlbmVkLCB0byBlaXRoZXIgcGFydGlhbGx5IG9yIGZ1bGx5IHJlcGxhY2UgdGhpcyByZWFkZXIuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHJlYWRlcidzIHN0YXJ0IGtleSBoYXMgYmVlbiB1cGRhdGVkIHRvIHJlcHJlc2VudCB0aGlzLCBzbyB0aGF0IHJlYWRzIG9ubHkgaGl0Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgb3IgdGhlIG90aGVyIHJlYWRlci4KLSAqCi0gKiBNRVRBREFUQV9DSEFOR0UKLSAqIEZyb206ICAgICAgIE5PUk1BTCAgICAgID0+IFJlYWRlciBoYXMgc2VlbiBsb3cgdHJhZmZpYyBhbmQgdGhlIGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlIGZvciBpbmRleCBzdW1tYXJpZXMgaXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbmVkLCBzbyBpdHMgaW5kZXggc3VtbWFyeSBoYXMgYmVlbiBkb3duc2FtcGxlZC4KLSAqICAgICAgICAgTUVUQURBVEFfQ0hBTkdFID0+IFNhbWUKLSAqIH0gPC9wcmU+Ci0gKgotICogTm90ZSB0aGF0IGluIHBhcmFsbGVsIHRvIHRoaXMsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IERlc2NyaXB0b3IgdHlwZXM7IFRNUExJTksgYW5kIEZJTkFMOyB0aGUgbGF0dGVyIGNvcnJlc3BvbmRzCi0gKiB0byBOT1JNQUwgc3RhdGUgcmVhZGVycyBhbmQgYWxsIHJlYWRlcnMgdGhhdCByZXBsYWNlIGEgTk9STUFMIG9uZS4gVE1QTElOSyBpcyB1c2VkIGZvciBFQVJMWSBzdGF0ZSByZWFkZXJzIGFuZAotICogbm8gb3RoZXJzLgotICoKLSAqIFdoZW4gYSByZWFkZXIgaXMgYmVpbmcgY29tcGFjdGVkLCBpZiB0aGUgcmVzdWx0IGlzIGxhcmdlIGl0cyByZXBsYWNlbWVudCBtYXkgYmUgb3BlbmVkIGFzIEVBUkxZIGJlZm9yZSBjb21wYWN0aW9uCi0gKiBjb21wbGV0ZXMgaW4gb3JkZXIgdG8gcHJlc2VudCB0aGUgcmVzdWx0IHRvIGNvbnN1bWVycyBlYXJsaWVyLiBJbiB0aGlzIGNhc2UgdGhlIHJlYWRlciB3aWxsIGl0c2VsZiBiZSBjaGFuZ2VkIHRvCi0gKiBhIE1PVkVEX1NUQVJUIHN0YXRlLCB3aGVyZSBpdHMgc3RhcnQgbm8gbG9uZ2VyIHJlcHJlc2VudHMgaXRzIG9uLWRpc2sgbWluaW11bSBrZXkuIFRoaXMgaXMgdG8gcGVybWl0IHJlYWRzIHRvIGJlCi0gKiBkaXJlY3RlZCB0byBvbmx5IG9uZSByZWFkZXIgd2hlbiB0aGUgdHdvIHJlcHJlc2VudCB0aGUgc2FtZSBkYXRhLiBUaGUgRUFSTFkgZmlsZSBjYW4gcmVwcmVzZW50IGEgY29tcGFjdGlvbiByZXN1bHQKLSAqIHRoYXQgaXMgZWl0aGVyIHBhcnRpYWxseSBjb21wbGV0ZSBhbmQgc3RpbGwgaW4tcHJvZ3Jlc3MsIG9yIGEgY29tcGxldGUgYW5kIGltbXV0YWJsZSBzc3RhYmxlIHRoYXQgaXMgcGFydCBvZiBhIGxhcmdlcgotICogbWFjcm8gY29tcGFjdGlvbiBhY3Rpb24gdGhhdCBoYXMgbm90IHlldCBmdWxseSBjb21wbGV0ZWQuCi0gKgotICogQ3VycmVudGx5IEFMTCBjb21wYWN0aW9uIHJlc3VsdHMgYXQgbGVhc3QgYnJpZWZseSBnbyB0aHJvdWdoIGFuIEVBUkxZIG9wZW4gc3RhdGUgcHJpb3IgdG8gY29tcGxldGlvbiwgcmVnYXJkbGVzcwotICogb2YgaWYgZWFybHkgb3BlbmluZyBpcyBlbmFibGVkLgotICoKLSAqIFNpbmNlIGEgcmVhZGVyIGNhbiBiZSBjcmVhdGVkIG11bHRpcGxlIHRpbWVzIG92ZXIgdGhlIHNhbWUgc2hhcmVkIHVuZGVybHlpbmcgcmVzb3VyY2VzLCBhbmQgdGhlIGV4YWN0IHJlc291cmNlcwotICogaXQgc2hhcmVzIGJldHdlZW4gZWFjaCBpbnN0YW5jZSBkaWZmZXIgc3VidGx5LCB3ZSB0cmFjayB0aGUgbGlmZXRpbWUgb2YgYW55IHVuZGVybHlpbmcgcmVzb3VyY2Ugd2l0aCBpdHMgb3duCi0gKiByZWZlcmVuY2UgY291bnQsIHdoaWNoIGVhY2ggaW5zdGFuY2UgdGFrZXMgYSBSZWYgdG8uIEVhY2ggaW5zdGFuY2UgdGhlbiB0cmFja3MgcmVmZXJlbmNlcyB0byBpdHNlbGYsIGFuZCBvbmNlIHRoZXNlCi0gKiBhbGwgZXhwaXJlIGl0IHJlbGVhc2VzIGl0cyBSZWZzIHRvIHRoZXNlIHVuZGVybHlpbmcgcmVzb3VyY2VzLgotICoKLSAqIFRoZXJlIGlzIHNvbWUgc2hhcmVkIGNsZWFudXAgYmVoYXZpb3VyIG5lZWRlZCBvbmx5IG9uY2UgYWxsIHNzdGFibGVyZWFkZXJzIGluIGEgY2VydGFpbiBzdGFnZSBvZiB0aGVpciBsaWZlY3ljbGUKLSAqIChpLmUuIEVBUkxZIG9yIE5PUk1BTCBvcGVuaW5nKSwgYW5kIHNvbWUgdGhhdCBtdXN0IG9ubHkgb2NjdXIgb25jZSBhbGwgcmVhZGVycyBvZiBhbnkga2luZCBvdmVyIGEgc2luZ2xlIGxvZ2ljYWwKLSAqIHNzdGFibGUgaGF2ZSBleHBpcmVkLiBUaGVzZSBhcmUgbWFuYWdlZCBieSB0aGUgVHlwZVRpZHkgYW5kIEdsb2JhbFRpZHkgY2xhc3NlcyBhdCB0aGUgYm90dG9tLCBhbmQgYXJlIGVmZmVjdGl2ZWx5Ci0gKiBtYW5hZ2VkIGFzIGFub3RoZXIgcmVzb3VyY2UgZWFjaCBpbnN0YW5jZSB0cmFja3MgaXRzIG93biBSZWYgaW5zdGFuY2UgdG8sIHRvIGVuc3VyZSBhbGwgb2YgdGhlc2UgcmVzb3VyY2VzIGFyZQotICogY2xlYW5lZCB1cCBzYWZlbHkgYW5kIGNhbiBiZSBkZWJ1Z2dlZCBvdGhlcndpc2UuCi0gKgorICogQW4gU1NUYWJsZVJlYWRlciBjYW4gYmUgY29uc3RydWN0ZWQgaW4gYSBudW1iZXIgb2YgcGxhY2VzLCBidXQgdHlwaWNhbGx5IGlzIGVpdGhlciByZWFkIGZyb20gZGlzayBhdCBzdGFydHVwLCBvcgorICogY29uc3RydWN0ZWQgZnJvbSBhIGZsdXNoZWQgbWVtdGFibGUsIG9yIGFmdGVyIGNvbXBhY3Rpb24gdG8gcmVwbGFjZSBzb21lIGV4aXN0aW5nIHNzdGFibGVzLiBIb3dldmVyIG9uY2UgY3JlYXRlZCwKKyAqIGFuIHNzdGFibGVyZWFkZXIgbWF5IGFsc28gYmUgbW9kaWZpZWQuCisgKiA8cD4KKyAqIEEgcmVhZGVyJ3Mge0BsaW5rIE9wZW5SZWFzb259IGRlc2NyaWJlcyBpdHMgY3VycmVudCBzdGFnZSBpbiBpdHMgbGlmZWN5Y2xlLiBOb3RlIHRoYXQgaW4gcGFyYWxsZWwgdG8gdGhpcywgdGhlcmUgYXJlCisgKiB0d28gZGlmZmVyZW50IERlc2NyaXB0b3IgdHlwZXM7IFRNUExJTksgYW5kIEZJTkFMOyB0aGUgbGF0dGVyIGNvcnJlc3BvbmRzIHRvIHtAbGluayBPcGVuUmVhc29uI05PUk1BTH0gc3RhdGUgcmVhZGVycworICogYW5kIGFsbCByZWFkZXJzIHRoYXQgcmVwbGFjZSBhIHtAbGluayBPcGVuUmVhc29uI05PUk1BTH0gb25lLiBUTVBMSU5LIGlzIHVzZWQgZm9yIHtAbGluayBPcGVuUmVhc29uI0VBUkxZfSBzdGF0ZQorICogcmVhZGVycyBhbmQgbm8gb3RoZXJzLgorICogPHA+CisgKiBXaGVuIGEgcmVhZGVyIGlzIGJlaW5nIGNvbXBhY3RlZCwgaWYgdGhlIHJlc3VsdCBpcyBsYXJnZSBpdHMgcmVwbGFjZW1lbnQgbWF5IGJlIG9wZW5lZCBhcyB7QGxpbmsgT3BlblJlYXNvbiNFQVJMWX0KKyAqIGJlZm9yZSBjb21wYWN0aW9uIGNvbXBsZXRlcyBpbiBvcmRlciB0byBwcmVzZW50IHRoZSByZXN1bHQgdG8gY29uc3VtZXJzIGVhcmxpZXIuIEluIHRoaXMgY2FzZSB0aGUgcmVhZGVyIHdpbGwgaXRzZWxmCisgKiBiZSBjaGFuZ2VkIHRvIGEge0BsaW5rIE9wZW5SZWFzb24jTU9WRURfU1RBUlR9IHN0YXRlLCB3aGVyZSBpdHMgc3RhcnQgbm8gbG9uZ2VyIHJlcHJlc2VudHMgaXRzIG9uLWRpc2sgbWluaW11bSBrZXkuCisgKiBUaGlzIGlzIHRvIHBlcm1pdCByZWFkcyB0byBiZSBkaXJlY3RlZCB0byBvbmx5IG9uZSByZWFkZXIgd2hlbiB0aGUgdHdvIHJlcHJlc2VudCB0aGUgc2FtZSBkYXRhLgorICogVGhlIHtAbGluayBPcGVuUmVhc29uI0VBUkxZfSBmaWxlIGNhbiByZXByZXNlbnQgYSBjb21wYWN0aW9uIHJlc3VsdCB0aGF0IGlzIGVpdGhlciBwYXJ0aWFsbHkgY29tcGxldGUgYW5kIHN0aWxsCisgKiBpbi1wcm9ncmVzcywgb3IgYSBjb21wbGV0ZSBhbmQgaW1tdXRhYmxlIHNzdGFibGUgdGhhdCBpcyBwYXJ0IG9mIGEgbGFyZ2VyIG1hY3JvIGNvbXBhY3Rpb24gYWN0aW9uIHRoYXQgaGFzIG5vdCB5ZXQKKyAqIGZ1bGx5IGNvbXBsZXRlZC4KKyAqIDxwPgorICogQ3VycmVudGx5IEFMTCBjb21wYWN0aW9uIHJlc3VsdHMgYXQgbGVhc3QgYnJpZWZseSBnbyB0aHJvdWdoIGFuIHtAbGluayBPcGVuUmVhc29uI0VBUkxZfSBvcGVuIHN0YXRlIHByaW9yIHRvIGNvbXBsZXRpb24sCisgKiByZWdhcmRsZXNzIG9mIGlmIGVhcmx5IG9wZW5pbmcgaXMgZW5hYmxlZC4KKyAqIDxwPgorICogU2luY2UgYSByZWFkZXIgY2FuIGJlIGNyZWF0ZWQgbXVsdGlwbGUgdGltZXMgb3ZlciB0aGUgc2FtZSBzaGFyZWQgdW5kZXJseWluZyByZXNvdXJjZXMsIGFuZCB0aGUgZXhhY3QgcmVzb3VyY2VzIGl0CisgKiBzaGFyZXMgYmV0d2VlbiBlYWNoIGluc3RhbmNlIGRpZmZlciBzdWJ0bHksIHdlIHRyYWNrIHRoZSBsaWZldGltZSBvZiBhbnkgdW5kZXJseWluZyByZXNvdXJjZSB3aXRoIGl0cyBvd24gcmVmZXJlbmNlCisgKiBjb3VudCwgd2hpY2ggZWFjaCBpbnN0YW5jZSB0YWtlcyBhIHtAbGluayBSZWZ9IHRvLiBFYWNoIGluc3RhbmNlIHRoZW4gdHJhY2tzIHJlZmVyZW5jZXMgdG8gaXRzZWxmLCBhbmQgb25jZSB0aGVzZQorICogYWxsIGV4cGlyZSBpdCByZWxlYXNlcyBhbGwgaXRzIHtAbGluayBSZWZ9IHRvIHRoZXNlIHVuZGVybHlpbmcgcmVzb3VyY2VzLgorICogPHA+CisgKiBUaGVyZSBpcyBzb21lIHNoYXJlZCBjbGVhbnVwIGJlaGF2aW91ciBuZWVkZWQgb25seSBvbmNlIGFsbCByZWFkZXJzIGluIGEgY2VydGFpbiBzdGFnZSBvZiB0aGVpciBsaWZlY3ljbGUKKyAqIChpLmUuIHtAbGluayBPcGVuUmVhc29uI0VBUkxZfSBvciB7QGxpbmsgT3BlblJlYXNvbiNOT1JNQUx9IG9wZW5pbmcpLCBhbmQgc29tZSB0aGF0IG11c3Qgb25seSBvY2N1ciBvbmNlIGFsbCByZWFkZXJzCisgKiBvZiBhbnkga2luZCBvdmVyIGEgc2luZ2xlIGxvZ2ljYWwgc3N0YWJsZSBoYXZlIGV4cGlyZWQuIFRoZXNlIGFyZSBtYW5hZ2VkIGJ5IHRoZSB7QGxpbmsgSW5zdGFuY2VUaWRpZXJ9IGFuZAorICoge0BsaW5rIEdsb2JhbFRpZHl9IGNsYXNzZXMgYXQgdGhlIGJvdHRvbSwgYW5kIGFyZSBlZmZlY3RpdmVseSBtYW5hZ2VkIGFzIGFub3RoZXIgcmVzb3VyY2UgZWFjaCBpbnN0YW5jZSB0cmFja3MgaXRzCisgKiBvd24ge0BsaW5rIFJlZn0gaW5zdGFuY2UgdG8sIHRvIGVuc3VyZSBhbGwgb2YgdGhlc2UgcmVzb3VyY2VzIGFyZSBjbGVhbmVkIHVwIHNhZmVseSBhbmQgY2FuIGJlIGRlYnVnZ2VkIG90aGVyd2lzZS4KKyAqIDxwPgogICogVE9ETzogZmlsbCBpbiBkZXRhaWxzIGFib3V0IFRyYWNrZXIgYW5kIGxpZmVjeWNsZSBpbnRlcmFjdGlvbnMgZm9yIHRvb2xzLCBhbmQgZm9yIGNvbXBhY3Rpb24gc3RyYXRlZ2llcwogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU1NUYWJsZVJlYWRlciBleHRlbmRzIFNTVGFibGUgaW1wbGVtZW50cyBVbmZpbHRlcmVkU291cmNlLCBTZWxmUmVmQ291bnRlZDxTU1RhYmxlUmVhZGVyPgpAQCAtMTQ2LDYgKzE1Niw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBUUkFDS19BQ1RJVklUWSA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESVNBQkxFX1NTVEFCTEVfQUNUSVZJVFlfVFJBQ0tJTkcuZ2V0Qm9vbGVhbigpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JQbHVzIHN5bmNFeGVjdXRvciA9IGluaXRTeW5jRXhlY3V0b3IoKTsKKwogICAgIHByaXZhdGUgc3RhdGljIFNjaGVkdWxlZEV4ZWN1dG9yUGx1cyBpbml0U3luY0V4ZWN1dG9yKCkKICAgICB7CiAgICAgICAgIGlmIChEYXRhYmFzZURlc2NyaXB0b3IuaXNDbGllbnRPclRvb2xJbml0aWFsaXplZCgpKQpAQCAtMTU3LDgxICsxNjgsOTggQEAKICAgICAgICAgLy8gSW1tZWRpYXRlbHkgcmVtb3ZlIHJlYWRNZXRlciBzeW5jIHRhc2sgd2hlbiBjYW5jZWxsZWQuCiAgICAgICAgIC8vIFRPRE86IHNob3VsZCB3ZSBzZXQgdGhpcyBieSBkZWZhdWx0IG9uIGFsbCBzY2hlZHVsZWQgZXhlY3V0b3JzPwogICAgICAgICBpZiAoc3luY0V4ZWN1dG9yIGluc3RhbmNlb2YgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKQotICAgICAgICAgICAgKChTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3Ipc3luY0V4ZWN1dG9yKS5zZXRSZW1vdmVPbkNhbmNlbFBvbGljeSh0cnVlKTsKKyAgICAgICAgICAgICgoU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKSBzeW5jRXhlY3V0b3IpLnNldFJlbW92ZU9uQ2FuY2VsUG9saWN5KHRydWUpOwogICAgICAgICByZXR1cm4gc3luY0V4ZWN1dG9yOwogICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJhdGVMaW1pdGVyIG1ldGVyU3luY1Rocm90dGxlID0gUmF0ZUxpbWl0ZXIuY3JlYXRlKDEwMC4wKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxTU1RhYmxlUmVhZGVyPiBtYXhUaW1lc3RhbXBEZXNjZW5kaW5nID0gKG8xLCBvMikgLT4gTG9uZy5jb21wYXJlKG8yLmdldE1heFRpbWVzdGFtcCgpLCBvMS5nZXRNYXhUaW1lc3RhbXAoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFNTVGFibGVSZWFkZXI+IG1heFRpbWVzdGFtcEFzY2VuZGluZyA9IChvMSwgbzIpIC0+IExvbmcuY29tcGFyZShvMS5nZXRNYXhUaW1lc3RhbXAoKSwgbzIuZ2V0TWF4VGltZXN0YW1wKCkpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxTU1RhYmxlUmVhZGVyPiBtYXhUaW1lc3RhbXBBc2NlbmRpbmcgPSBDb21wYXJhdG9yLmNvbXBhcmluZ0xvbmcoU1NUYWJsZVJlYWRlcjo6Z2V0TWF4VGltZXN0YW1wKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8U1NUYWJsZVJlYWRlcj4gbWF4VGltZXN0YW1wRGVzY2VuZGluZyA9IG1heFRpbWVzdGFtcEFzY2VuZGluZy5yZXZlcnNlZCgpOwogCiAgICAgLy8gaXQncyBqdXN0IGFuIG9iamVjdCwgd2hpY2ggd2UgdXNlIHJlZ3VsYXIgT2JqZWN0IGVxdWFsaXR5IG9uOyB3ZSBpbnRyb2R1Y2UgYSBzcGVjaWFsIGNsYXNzIGp1c3QgZm9yIGVhc3kgcmVjb2duaXRpb24KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFVuaXF1ZUlkZW50aWZpZXIge30KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFVuaXF1ZUlkZW50aWZpZXIKKyAgICB7CisgICAgfQorICAgIHB1YmxpYyBmaW5hbCBVbmlxdWVJZGVudGlmaWVyIGluc3RhbmNlSWQgPSBuZXcgVW5pcXVlSWRlbnRpZmllcigpOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFNTVGFibGVSZWFkZXI+IHNzdGFibGVDb21wYXJhdG9yID0gKG8xLCBvMikgLT4gbzEuZmlyc3QuY29tcGFyZVRvKG8yLmZpcnN0KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZUNvbXBhcmF0b3IgPSBDb21wYXJhdG9yLmNvbXBhcmluZyhvIC0+IG8uZmlyc3QpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3JkZXJpbmc8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZU9yZGVyaW5nID0gT3JkZXJpbmcuZnJvbShzc3RhYmxlQ29tcGFyYXRvcik7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8U1NUYWJsZVJlYWRlcj4gaWRDb21wYXJhdG9yID0gQ29tcGFyYXRvci5jb21wYXJpbmcodCAtPiB0LmRlc2NyaXB0b3IuaWQsIFNTVGFibGVJZEZhY3RvcnkuQ09NUEFSQVRPUik7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFNTVGFibGVSZWFkZXI+IGlkUmV2ZXJzZUNvbXBhcmF0b3IgPSBpZENvbXBhcmF0b3IucmV2ZXJzZWQoKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT3JkZXJpbmc8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZU9yZGVyaW5nID0gT3JkZXJpbmcuZnJvbShzc3RhYmxlQ29tcGFyYXRvcik7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8U1NUYWJsZVJlYWRlcj4gc2l6ZUNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcjxTU1RhYmxlUmVhZGVyPigpCi0gICAgewotICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoU1NUYWJsZVJlYWRlciBvMSwgU1NUYWJsZVJlYWRlciBvMikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIExvbmdzLmNvbXBhcmUobzEub25EaXNrTGVuZ3RoKCksIG8yLm9uRGlza0xlbmd0aCgpKTsKLSAgICAgICAgfQotICAgIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFNTVGFibGVSZWFkZXI+IHNpemVDb21wYXJhdG9yID0gKG8xLCBvMikgLT4gTG9uZ3MuY29tcGFyZShvMS5vbkRpc2tMZW5ndGgoKSwgbzIub25EaXNrTGVuZ3RoKCkpOwogCiAgICAgLyoqCiAgICAgICogbWF4RGF0YUFnZSBpcyBhIHRpbWVzdGFtcCBpbiBsb2NhbCBzZXJ2ZXIgdGltZSAoZS5nLiBHbG9iYWwuY3VycmVudFRpbWVNaWxsaSkgd2hpY2ggcmVwcmVzZW50cyBhbiB1cHBlciBib3VuZAogICAgICAqIHRvIHRoZSBuZXdlc3QgcGllY2Ugb2YgZGF0YSBzdG9yZWQgaW4gdGhlIHNzdGFibGUuIEluIG90aGVyIHdvcmRzLCB0aGlzIHNzdGFibGUgZG9lcyBub3QgY29udGFpbiBpdGVtcyBjcmVhdGVkCiAgICAgICogbGF0ZXIgdGhhbiBtYXhEYXRhQWdlLgotICAgICAqCisgICAgICogPHA+CiAgICAgICogVGhlIGZpZWxkIGlzIG5vdCBzZXJpYWxpemVkIHRvIGRpc2ssIHNvIHJlbHlpbmcgb24gaXQgZm9yIG1vcmUgdGhhbiB3aGF0IHRydW5jYXRlIGRvZXMgaXMgbm90IGFkdmlzZWQuCi0gICAgICoKKyAgICAgKiA8cD4KICAgICAgKiBXaGVuIGEgbmV3IHNzdGFibGUgaXMgZmx1c2hlZCwgbWF4RGF0YUFnZSBpcyBzZXQgdG8gdGhlIHRpbWUgb2YgY3JlYXRpb24uCiAgICAgICogV2hlbiBhIHNzdGFibGUgaXMgY3JlYXRlZCBmcm9tIGNvbXBhY3Rpb24sIG1heERhdGFBZ2UgaXMgc2V0IHRvIG1heCBvZiBhbGwgbWVyZ2VkIHNzdGFibGVzLgotICAgICAqCisgICAgICogPHA+CiAgICAgICogVGhlIGFnZSBpcyBpbiBtaWxsaXNlY29uZHMgc2luY2UgZXBvYyBhbmQgaXMgbG9jYWwgdG8gdGhpcyBob3N0LgogICAgICAqLwogICAgIHB1YmxpYyBmaW5hbCBsb25nIG1heERhdGFBZ2U7CiAKICAgICBwdWJsaWMgZW51bSBPcGVuUmVhc29uCiAgICAgeworICAgICAgICAvKioKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+RnJvbSB7QGNvZGUgTm9uZX0gLSBSZWFkZXIgaGFzIGJlZW4gcmVhZCBmcm9tIGRpc2ssIGVpdGhlciBhdCBzdGFydHVwIG9yIGZyb20gYSBmbHVzaGVkIG1lbXRhYmxlPC9saT4KKyAgICAgICAgICogPGxpPkZyb20ge0BsaW5rICNFQVJMWX0gLSBSZWFkZXIgaXMgdGhlIGZpbmFsIHJlc3VsdCBvZiBhIGNvbXBhY3Rpb248L2xpPgorICAgICAgICAgKiA8bGk+RnJvbSB7QGxpbmsgI01PVkVEX1NUQVJUfSAtIFJlYWRlciBXQVMgYmVpbmcgY29tcGFjdGVkLCBidXQgdGhpcyBmYWlsZWQgYW5kIGl0IGhhcyBiZWVuIHJlc3RvcmVkCisgICAgICAgICAqICAgICB0byB7Y29kZSBOT1JNQUx9c3RhdHVzPC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICovCiAgICAgICAgIE5PUk1BTCwKKworICAgICAgICAvKioKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+RnJvbSB7QGNvZGUgTm9uZX0gLSBSZWFkZXIgaXMgYSBjb21wYWN0aW9uIHJlcGxhY2VtZW50IHRoYXQgaXMgZWl0aGVyIGluY29tcGxldGUgYW5kIGhhcyBiZWVuIG9wZW5lZAorICAgICAgICAgKiAgICAgdG8gcmVwcmVzZW50IGl0cyBwYXJ0aWFsIHJlc3VsdCBzdGF0dXMsIG9yIGhhcyBiZWVuIGZpbmlzaGVkIGJ1dCB0aGUgY29tcGFjdGlvbiBpdCBpcyBhIHBhcnQgb2YgaGFzIG5vdAorICAgICAgICAgKiAgICAgeWV0IGNvbXBsZXRlZCBmdWxseTwvbGk+CisgICAgICAgICAqIDxsaT5Gcm9tIHtAbGluayAjRUFSTFl9IC0gU2FtZSBhcyBmcm9tIHtAY29kZSBOb25lfSwgb25seSBpdCBpcyBub3QgdGhlIGZpcnN0IHRpbWUgaXQgaGFzIGJlZW4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICovCiAgICAgICAgIEVBUkxZLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGcm9tOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT5Gcm9tIHtAbGluayAjTk9STUFMfSAtIFJlYWRlciBoYXMgc2VlbiBsb3cgdHJhZmZpYyBhbmQgdGhlIGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlIGZvciBpbmRleCBzdW1tYXJpZXMKKyAgICAgICAgICogICAgIGlzIGNvbnN0cmFpbmVkLCBzbyBpdHMgaW5kZXggc3VtbWFyeSBoYXMgYmVlbiBkb3duc2FtcGxlZDwvbGk+CisgICAgICAgICAqIDxsaT5Gcm9tIHtAbGluayAjTUVUQURBVEFfQ0hBTkdFfSAtIFNhbWUKKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICovCiAgICAgICAgIE1FVEFEQVRBX0NIQU5HRSwKKworICAgICAgICAvKioKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+RnJvbSB7QGxpbmsgI05PUk1BTH0gLSBSZWFkZXIgaXMgYmVpbmcgY29tcGFjdGVkLiBUaGlzIGNvbXBhY3Rpb24gaGFzIG5vdCBmaW5pc2hlZCwgYnV0IHRoZSBjb21wYWN0aW9uCisgICAgICAgICAqICAgICByZXN1bHQgaXMgZWl0aGVyIHBhcnRpYWxseSBvciBmdWxseSBvcGVuZWQsIHRvIGVpdGhlciBwYXJ0aWFsbHkgb3IgZnVsbHkgcmVwbGFjZSB0aGlzIHJlYWRlci4gVGhpcyByZWFkZXIncworICAgICAgICAgKiAgICAgc3RhcnQga2V5IGhhcyBiZWVuIHVwZGF0ZWQgdG8gcmVwcmVzZW50IHRoaXMsIHNvIHRoYXQgcmVhZHMgb25seSBoaXQgb25lIG9yIHRoZSBvdGhlciByZWFkZXIuPC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICovCiAgICAgICAgIE1PVkVEX1NUQVJUCiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIE9wZW5SZWFzb24gb3BlblJlYXNvbjsKLSAgICBwdWJsaWMgZmluYWwgVW5pcXVlSWRlbnRpZmllciBpbnN0YW5jZUlkID0gbmV3IFVuaXF1ZUlkZW50aWZpZXIoKTsKIAotICAgIC8vIGluZGV4ZmlsZSBhbmQgZGF0YWZpbGU6IG1pZ2h0IGJlIG51bGwgYmVmb3JlIGEgY2FsbCB0byBsb2FkKCkKLSAgICBwcm90ZWN0ZWQgZmluYWwgRmlsZUhhbmRsZSBpZmlsZTsKICAgICBwcm90ZWN0ZWQgZmluYWwgRmlsZUhhbmRsZSBkZmlsZTsKLSAgICBwcm90ZWN0ZWQgZmluYWwgSUZpbHRlciBiZjsKLSAgICBwdWJsaWMgZmluYWwgSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeTsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplcjw/PiByb3dJbmRleEVudHJ5U2VyaWFsaXplcjsKLQotICAgIHByb3RlY3RlZCBJbnN0cnVtZW50aW5nQ2FjaGU8S2V5Q2FjaGVLZXksIFJvd0luZGV4RW50cnk+IGtleUNhY2hlOwotCi0gICAgcHJvdGVjdGVkIGZpbmFsIEJsb29tRmlsdGVyVHJhY2tlciBibG9vbUZpbHRlclRyYWNrZXIgPSBuZXcgQmxvb21GaWx0ZXJUcmFja2VyKCk7CiAKICAgICAvLyB0ZWNobmljYWxseSBpc0NvbXBhY3RlZCBpcyBub3QgbmVjZXNzYXJ5IHNpbmNlIGl0IHNob3VsZCBuZXZlciBiZSB1bnJlZmVyZW5jZWQgdW5sZXNzIGl0IGlzIGFsc28gY29tcGFjdGVkLAogICAgIC8vIGJ1dCBpdCBzZWVtcyBsaWtlIGEgZ29vZCBleHRyYSBsYXllciBvZiBwcm90ZWN0aW9uIGFnYWluc3QgcmVmZXJlbmNlIGNvdW50aW5nIGJ1Z3MgdG8gbm90IGRlbGV0ZSBkYXRhIGJhc2VkIG9uIHRoYXQgYWxvbmUKLSAgICBwcm90ZWN0ZWQgZmluYWwgQXRvbWljQm9vbGVhbiBpc1N1c3BlY3QgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgcHVibGljIGZpbmFsIEF0b21pY0Jvb2xlYW4gaXNTdXNwZWN0ID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOwogCiAgICAgLy8gbm90IGZpbmFsIHNpbmNlIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBjaGFuZ2UgbGV2ZWwgb24gYSBmaWxlLgogICAgIHByb3RlY3RlZCB2b2xhdGlsZSBTdGF0c01ldGFkYXRhIHNzdGFibGVNZXRhZGF0YTsKIAogICAgIHB1YmxpYyBmaW5hbCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcjsKIAotICAgIHByb3RlY3RlZCBmaW5hbCBBdG9taWNMb25nIGtleUNhY2hlSGl0ID0gbmV3IEF0b21pY0xvbmcoMCk7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIEF0b21pY0xvbmcga2V5Q2FjaGVSZXF1ZXN0ID0gbmV3IEF0b21pY0xvbmcoMCk7Ci0KICAgICBwcml2YXRlIGZpbmFsIEluc3RhbmNlVGlkaWVyIHRpZHk7CiAgICAgcHJpdmF0ZSBmaW5hbCBSZWY8U1NUYWJsZVJlYWRlcj4gc2VsZlJlZjsKIApAQCAtMjM5LDYgKzI2NywxMCBAQAogCiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBkb3VibGUgY3JjQ2hlY2tDaGFuY2U7CiAKKyAgICBwdWJsaWMgZmluYWwgRGVjb3JhdGVkS2V5IGZpcnN0OworICAgIHB1YmxpYyBmaW5hbCBEZWNvcmF0ZWRLZXkgbGFzdDsKKyAgICBwdWJsaWMgZmluYWwgQWJzdHJhY3RCb3VuZHM8VG9rZW4+IGJvdW5kczsKKwogICAgIC8qKgogICAgICAqIENhbGN1bGF0ZSBhcHByb3hpbWF0ZSBrZXkgY291bnQuCiAgICAgICogSWYgY2FyZGluYWxpdHkgZXN0aW1hdG9yIGlzIGF2YWlsYWJsZSBvbiBhbGwgZ2l2ZW4gc3N0YWJsZXMsIHRoZW4gdGhpcyBtZXRob2QgdXNlIHRoZW0gdG8gZXN0aW1hdGUKQEAgLTI2NCw3ICsyOTYsNyBAQAogCiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWV0YWRhdGEgbWV0YWRhdGEgPSAoQ29tcGFjdGlvbk1ldGFkYXRhKSBzc3RhYmxlLmRlc2NyaXB0b3IuZ2V0TWV0YWRhdGFTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoc3N0YWJsZS5kZXNjcmlwdG9yLCBNZXRhZGF0YVR5cGUuQ09NUEFDVElPTik7CisgICAgICAgICAgICAgICAgQ29tcGFjdGlvbk1ldGFkYXRhIG1ldGFkYXRhID0gU3RhdHNDb21wb25lbnQubG9hZChzc3RhYmxlLmRlc2NyaXB0b3IpLmNvbXBhY3Rpb25NZXRhZGF0YSgpOwogICAgICAgICAgICAgICAgIC8vIElmIHdlIGNhbid0IGxvYWQgdGhlIENvbXBhY3Rpb25NZXRhZGF0YSwgd2UgYXJlIGZvcmNlZCB0byBlc3RpbWF0ZSB0aGUga2V5cyB1c2luZyB0aGUgaW5kZXgKICAgICAgICAgICAgICAgICAvLyBzdW1tYXJ5LiAoQ0FTU0FORFJBLTEwNjc2KQogICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKQpAQCAtMzA1LDIzMyArMzM3LDY2IEBACiAgICAgICAgIHJldHVybiBjb3VudDsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBFc3RpbWF0ZXMgaG93IG11Y2ggb2YgdGhlIGtleXMgd2Ugd291bGQga2VlcCBpZiB0aGUgc3N0YWJsZXMgd2VyZSBjb21wYWN0ZWQgdG9nZXRoZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBlc3RpbWF0ZUNvbXBhY3Rpb25HYWluKFNldDxTU1RhYmxlUmVhZGVyPiBvdmVybGFwcGluZykKKyAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgb3BlbihTU1RhYmxlLk93bmVyIG93bmVyLCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCiAgICAgewotICAgICAgICBTZXQ8SUNhcmRpbmFsaXR5PiBjYXJkaW5hbGl0aWVzID0gbmV3IEhhc2hTZXQ8PihvdmVybGFwcGluZy5zaXplKCkpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IG92ZXJsYXBwaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJQ2FyZGluYWxpdHkgY2FyZGluYWxpdHkgPSAoKENvbXBhY3Rpb25NZXRhZGF0YSkgc3N0YWJsZS5kZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLmRlc2VyaWFsaXplKHNzdGFibGUuZGVzY3JpcHRvciwgTWV0YWRhdGFUeXBlLkNPTVBBQ1RJT04pKS5jYXJkaW5hbGl0eUVzdGltYXRvcjsKLSAgICAgICAgICAgICAgICBpZiAoY2FyZGluYWxpdHkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY2FyZGluYWxpdGllcy5hZGQoY2FyZGluYWxpdHkpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJHb3QgYSBudWxsIGNhcmRpbmFsaXR5IGVzdGltYXRvciBpbjoge30iLCBzc3RhYmxlLmdldEZpbGVuYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkNvdWxkIG5vdCByZWFkIHVwIGNvbXBhY3Rpb24gbWV0YWRhdGEgZm9yIHt9Iiwgc3N0YWJsZSwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbG9uZyB0b3RhbEtleUNvdW50QmVmb3JlID0gMDsKLSAgICAgICAgZm9yIChJQ2FyZGluYWxpdHkgY2FyZGluYWxpdHkgOiBjYXJkaW5hbGl0aWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0b3RhbEtleUNvdW50QmVmb3JlICs9IGNhcmRpbmFsaXR5LmNhcmRpbmFsaXR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRvdGFsS2V5Q291bnRCZWZvcmUgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgIGxvbmcgdG90YWxLZXlDb3VudEFmdGVyID0gbWVyZ2VDYXJkaW5hbGl0aWVzKGNhcmRpbmFsaXRpZXMpLmNhcmRpbmFsaXR5KCk7Ci0gICAgICAgIGxvZ2dlci50cmFjZSgiRXN0aW1hdGVkIGNvbXBhY3Rpb24gZ2Fpbjoge30ve309e30iLCB0b3RhbEtleUNvdW50QWZ0ZXIsIHRvdGFsS2V5Q291bnRCZWZvcmUsICgoZG91YmxlKXRvdGFsS2V5Q291bnRBZnRlcikvdG90YWxLZXlDb3VudEJlZm9yZSk7Ci0gICAgICAgIHJldHVybiAoKGRvdWJsZSl0b3RhbEtleUNvdW50QWZ0ZXIpL3RvdGFsS2V5Q291bnRCZWZvcmU7CisgICAgICAgIHJldHVybiBvcGVuKG93bmVyLCBkZXNjcmlwdG9yLCBudWxsKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBJQ2FyZGluYWxpdHkgbWVyZ2VDYXJkaW5hbGl0aWVzKENvbGxlY3Rpb248SUNhcmRpbmFsaXR5PiBjYXJkaW5hbGl0aWVzKQorICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBvcGVuKFNTVGFibGUuT3duZXIgb3duZXIsIERlc2NyaXB0b3IgZGVzYywgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSkKICAgICB7Ci0gICAgICAgIElDYXJkaW5hbGl0eSBiYXNlID0gbmV3IEh5cGVyTG9nTG9nUGx1cygxMywgMjUpOyAvLyBzZWUgTWV0YWRhdGFDb2xsZWN0b3IuY2FyZGluYWxpdHkKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGJhc2UgPSBiYXNlLm1lcmdlKGNhcmRpbmFsaXRpZXMudG9BcnJheShuZXcgSUNhcmRpbmFsaXR5W2NhcmRpbmFsaXRpZXMuc2l6ZSgpXSkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDYXJkaW5hbGl0eU1lcmdlRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJDb3VsZCBub3QgbWVyZ2UgY2FyZGluYWxpdGllcyIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiYXNlOworICAgICAgICByZXR1cm4gb3Blbihvd25lciwgZGVzYywgbnVsbCwgbWV0YWRhdGEpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBvcGVuKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgb3BlbihTU1RhYmxlLk93bmVyIG93bmVyLCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMsIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEpCiAgICAgewotICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhOwotICAgICAgICBpZiAoZGVzY3JpcHRvci5jZm5hbWUuY29udGFpbnMoU0VDT05EQVJZX0lOREVYX05BTUVfU0VQQVJBVE9SKSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGkgPSBkZXNjcmlwdG9yLmNmbmFtZS5pbmRleE9mKFNFQ09OREFSWV9JTkRFWF9OQU1FX1NFUEFSQVRPUik7Ci0gICAgICAgICAgICBTdHJpbmcgaW5kZXhOYW1lID0gZGVzY3JpcHRvci5jZm5hbWUuc3Vic3RyaW5nKGkgKyAxKTsKLSAgICAgICAgICAgIG1ldGFkYXRhID0gU2NoZW1hLmluc3RhbmNlLmdldEluZGV4VGFibGVNZXRhZGF0YVJlZihkZXNjcmlwdG9yLmtzbmFtZSwgaW5kZXhOYW1lKTsKLSAgICAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiQ291bGQgbm90IGZpbmQgaW5kZXggbWV0YWRhdGEgZm9yIGluZGV4IGNmICIgKyBpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhID0gU2NoZW1hLmluc3RhbmNlLmdldFRhYmxlTWV0YWRhdGFSZWYoZGVzY3JpcHRvci5rc25hbWUsIGRlc2NyaXB0b3IuY2ZuYW1lKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3BlbihkZXNjcmlwdG9yLCBtZXRhZGF0YSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTU1RhYmxlUmVhZGVyIG9wZW4oRGVzY3JpcHRvciBkZXNjLCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG9wZW4oZGVzYywgY29tcG9uZW50c0ZvcihkZXNjKSwgbWV0YWRhdGEpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBvcGVuKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cywgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvcGVuKGRlc2NyaXB0b3IsIGNvbXBvbmVudHMsIG1ldGFkYXRhLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBvcGVuKG93bmVyLCBkZXNjcmlwdG9yLCBjb21wb25lbnRzLCBtZXRhZGF0YSwgdHJ1ZSwgZmFsc2UpOwogICAgIH0KIAogICAgIC8vIHVzZSBvbmx5IGZvciBvZmZsaW5lIG9yICJTdGFuZGFsb25lIiBvcGVyYXRpb25zCiAgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlUmVhZGVyIG9wZW5Ob1ZhbGlkYXRpb24oRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzLCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMpCiAgICAgewotICAgICAgICByZXR1cm4gb3BlbihkZXNjcmlwdG9yLCBjb21wb25lbnRzLCBjZnMubWV0YWRhdGEsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIG9wZW4oY2ZzLCBkZXNjcmlwdG9yLCBjb21wb25lbnRzLCBjZnMubWV0YWRhdGEsIGZhbHNlLCB0cnVlKTsKICAgICB9CiAKICAgICAvLyB1c2Ugb25seSBmb3Igb2ZmbGluZSBvciAiU3RhbmRhbG9uZSIgb3BlcmF0aW9ucwotICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBvcGVuTm9WYWxpZGF0aW9uKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSkKKyAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgb3Blbk5vVmFsaWRhdGlvbihTU1RhYmxlLk93bmVyIG93bmVyLCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEpCiAgICAgewotICAgICAgICByZXR1cm4gb3BlbihkZXNjcmlwdG9yLCBjb21wb25lbnRzRm9yKGRlc2NyaXB0b3IpLCBtZXRhZGF0YSwgZmFsc2UsIHRydWUpOworICAgICAgICByZXR1cm4gb3Blbihvd25lciwgZGVzY3JpcHRvciwgbnVsbCwgbWV0YWRhdGEsIGZhbHNlLCB0cnVlKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBPcGVuIFNTVGFibGUgcmVhZGVyIHRvIGJlIHVzZWQgaW4gYmF0Y2ggbW9kZShzdWNoIGFzIHNzdGFibGVsb2FkZXIpLgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IKLSAgICAgKiBAcGFyYW0gY29tcG9uZW50cwotICAgICAqIEBwYXJhbSBtZXRhZGF0YQotICAgICAqIEByZXR1cm4gb3BlbmVkIFNTVGFibGVSZWFkZXIKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTU1RhYmxlUmVhZGVyIG9wZW5Gb3JCYXRjaChEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMsIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEpCisgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlUmVhZGVyIG9wZW5Gb3JCYXRjaChTU1RhYmxlLk93bmVyIG93bmVyLCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMsIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEpCiAgICAgewotICAgICAgICAvLyBNaW5pbXVtIGNvbXBvbmVudHMgd2l0aG91dCB3aGljaCB3ZSBjYW4ndCBkbyBhbnl0aGluZwotICAgICAgICBhc3NlcnQgY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuREFUQSkgOiAiRGF0YSBjb21wb25lbnQgaXMgbWlzc2luZyBmb3Igc3N0YWJsZSAiICsgZGVzY3JpcHRvcjsKLSAgICAgICAgYXNzZXJ0IGNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpIDogIlByaW1hcnkgaW5kZXggY29tcG9uZW50IGlzIG1pc3NpbmcgZm9yIHNzdGFibGUgIiArIGRlc2NyaXB0b3I7Ci0gICAgICAgIHZlcmlmeUNvbXByZXNzaW9uSW5mb0V4aXN0ZW5jZUlmQXBwbGljYWJsZShkZXNjcmlwdG9yLCBjb21wb25lbnRzKTsKLQotICAgICAgICBFbnVtU2V0PE1ldGFkYXRhVHlwZT4gdHlwZXMgPSBFbnVtU2V0Lm9mKE1ldGFkYXRhVHlwZS5WQUxJREFUSU9OLCBNZXRhZGF0YVR5cGUuU1RBVFMsIE1ldGFkYXRhVHlwZS5IRUFERVIpOwotICAgICAgICBNYXA8TWV0YWRhdGFUeXBlLCBNZXRhZGF0YUNvbXBvbmVudD4gc3N0YWJsZU1ldGFkYXRhOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgIHNzdGFibGVNZXRhZGF0YSA9IGRlc2NyaXB0b3IuZ2V0TWV0YWRhdGFTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoZGVzY3JpcHRvciwgdHlwZXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuU1RBVFMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFZhbGlkYXRpb25NZXRhZGF0YSB2YWxpZGF0aW9uTWV0YWRhdGEgPSAoVmFsaWRhdGlvbk1ldGFkYXRhKSBzc3RhYmxlTWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5WQUxJREFUSU9OKTsKLSAgICAgICAgU3RhdHNNZXRhZGF0YSBzdGF0c01ldGFkYXRhID0gKFN0YXRzTWV0YWRhdGEpIHNzdGFibGVNZXRhZGF0YS5nZXQoTWV0YWRhdGFUeXBlLlNUQVRTKTsKLSAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5Db21wb25lbnQgaGVhZGVyID0gKFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50KSBzc3RhYmxlTWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5IRUFERVIpOwotCi0gICAgICAgIC8vIENoZWNrIGlmIHNzdGFibGUgaXMgY3JlYXRlZCB1c2luZyBzYW1lIHBhcnRpdGlvbmVyLgotICAgICAgICAvLyBQYXJ0aXRpb25lciBjYW4gYmUgbnVsbCwgd2hpY2ggaW5kaWNhdGVzIG9sZGVyIHZlcnNpb24gb2Ygc3N0YWJsZSBvciBubyBzdGF0cyBhdmFpbGFibGUuCi0gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2Ugc2tpcCB0aGUgY2hlY2suCi0gICAgICAgIFN0cmluZyBwYXJ0aXRpb25lck5hbWUgPSBtZXRhZGF0YS5nZXQoKS5wYXJ0aXRpb25lci5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKTsKLSAgICAgICAgaWYgKHZhbGlkYXRpb25NZXRhZGF0YSAhPSBudWxsICYmICFwYXJ0aXRpb25lck5hbWUuZXF1YWxzKHZhbGlkYXRpb25NZXRhZGF0YS5wYXJ0aXRpb25lcikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiQ2Fubm90IG9wZW4ge307IHBhcnRpdGlvbmVyIHt9IGRvZXMgbm90IG1hdGNoIHN5c3RlbSBwYXJ0aXRpb25lciB7fS4gIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBwYXJ0aXRpb25lciBzdGFydGluZyB3aXRoIENhc3NhbmRyYSAxLjIgaXMgTXVybXVyM1BhcnRpdGlvbmVyLCBzbyB5b3Ugd2lsbCBuZWVkIHRvIGVkaXQgdGhhdCB0byBtYXRjaCB5b3VyIG9sZCBwYXJ0aXRpb25lciBpZiB1cGdyYWRpbmcuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLCB2YWxpZGF0aW9uTWV0YWRhdGEucGFydGl0aW9uZXIsIHBhcnRpdGlvbmVyTmFtZSk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFNTVGFibGVSZWFkZXJCdWlsZGVyLkZvckJhdGNoKGRlc2NyaXB0b3IsIG1ldGFkYXRhLCBjb21wb25lbnRzLCBzdGF0c01ldGFkYXRhLCBoZWFkZXIudG9IZWFkZXIobWV0YWRhdGEuZ2V0KCkpKS5idWlsZCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVbmtub3duQ29sdW1uRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9wZW4ob3duZXIsIGRlc2NyaXB0b3IsIGNvbXBvbmVudHMsIG1ldGFkYXRhLCB0cnVlLCB0cnVlKTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBPcGVuIGFuIFNTVGFibGUgZm9yIHJlYWRpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lciAgICAgIG93bmluZyBlbnRpdHkKICAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBTU1RhYmxlIHRvIG9wZW4KICAgICAgKiBAcGFyYW0gY29tcG9uZW50cyBDb21wb25lbnRzIGluY2x1ZGVkIHdpdGggdGhpcyBTU1RhYmxlCi0gICAgICogQHBhcmFtIG1ldGFkYXRhIGZvciB0aGlzIFNTVGFibGVzIENGCi0gICAgICogQHBhcmFtIHZhbGlkYXRlIENoZWNrIFNTVGFibGUgZm9yIGNvcnJ1cHRpb24gKGxpbWl0ZWQpCi0gICAgICogQHBhcmFtIGlzT2ZmbGluZSBXaGV0aGVyIHdlIGFyZSBvcGVuaW5nIHRoaXMgU1NUYWJsZSAib2ZmbGluZSIsIGZvciBleGFtcGxlIGZyb20gYW4gZXh0ZXJuYWwgdG9vbCBvciBub3QgZm9yIGluY2x1c2lvbiBpbiBxdWVyaWVzICh2YWxpZGF0aW9ucykKLSAgICAgKiAgICAgICAgICAgICAgICAgIFRoaXMgc3RvcHMgcmVnZW5lcmF0aW5nIEJGICsgU3VtbWFyaWVzIGFuZCBhbHNvIGRpc2FibGVzIHRyYWNraW5nIG9mIGhvdG5lc3MgZm9yIHRoZSBTU1RhYmxlLgorICAgICAqIEBwYXJhbSBtZXRhZGF0YSAgIGZvciB0aGlzIFNTVGFibGVzIENGCisgICAgICogQHBhcmFtIHZhbGlkYXRlICAgQ2hlY2sgU1NUYWJsZSBmb3IgY29ycnVwdGlvbiAobGltaXRlZCkKKyAgICAgKiBAcGFyYW0gaXNPZmZsaW5lICBXaGV0aGVyIHdlIGFyZSBvcGVuaW5nIHRoaXMgU1NUYWJsZSAib2ZmbGluZSIsIGZvciBleGFtcGxlIGZyb20gYW4gZXh0ZXJuYWwgdG9vbCBvciBub3QgZm9yIGluY2x1c2lvbiBpbiBxdWVyaWVzICh2YWxpZGF0aW9ucykKKyAgICAgKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0b3BzIHJlZ2VuZXJhdGluZyBCRiArIFN1bW1hcmllcyBhbmQgYWxzbyBkaXNhYmxlcyB0cmFja2luZyBvZiBob3RuZXNzIGZvciB0aGUgU1NUYWJsZS4KICAgICAgKiBAcmV0dXJuIHtAbGluayBTU1RhYmxlUmVhZGVyfQotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgb3BlbihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCisgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlUmVhZGVyIG9wZW4oT3duZXIgb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHZhbGlkYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPZmZsaW5lKQogICAgIHsKLSAgICAgICAgLy8gTWluaW11bSBjb21wb25lbnRzIHdpdGhvdXQgd2hpY2ggd2UgY2FuJ3QgZG8gYW55dGhpbmcKLSAgICAgICAgYXNzZXJ0IGNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LkRBVEEpIDogIkRhdGEgY29tcG9uZW50IGlzIG1pc3NpbmcgZm9yIHNzdGFibGUgIiArIGRlc2NyaXB0b3I7Ci0gICAgICAgIGFzc2VydCAhdmFsaWRhdGUgfHwgY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkgOiAiUHJpbWFyeSBpbmRleCBjb21wb25lbnQgaXMgbWlzc2luZyBmb3Igc3N0YWJsZSAiICsgZGVzY3JpcHRvcjsKKyAgICAgICAgU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyPD8sID8+IGJ1aWxkZXIgPSBkZXNjcmlwdG9yLmdldEZvcm1hdCgpLmdldFJlYWRlckZhY3RvcnkoKS5sb2FkaW5nQnVpbGRlcihkZXNjcmlwdG9yLCBtZXRhZGF0YSwgY29tcG9uZW50cyk7CiAKLSAgICAgICAgLy8gRm9yIHRoZSAzLjArIHNzdGFibGUgZm9ybWF0LCB0aGUgKG1pc25vbWVkKSBzdGF0cyBjb21wb25lbnQgaG9sZCB0aGUgc2VyaWFsaXphdGlvbiBoZWFkZXIgd2hpY2ggd2UgbmVlZCB0byBkZXNlcmlhbGl6ZSB0aGUgc3N0YWJsZSBjb250ZW50Ci0gICAgICAgIGFzc2VydCBjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5TVEFUUykgOiAiU3RhdHMgY29tcG9uZW50IGlzIG1pc3NpbmcgZm9yIHNzdGFibGUgIiArIGRlc2NyaXB0b3I7Ci0KLSAgICAgICAgdmVyaWZ5Q29tcHJlc3Npb25JbmZvRXhpc3RlbmNlSWZBcHBsaWNhYmxlKGRlc2NyaXB0b3IsIGNvbXBvbmVudHMpOwotCi0gICAgICAgIEVudW1TZXQ8TWV0YWRhdGFUeXBlPiB0eXBlcyA9IEVudW1TZXQub2YoTWV0YWRhdGFUeXBlLlZBTElEQVRJT04sIE1ldGFkYXRhVHlwZS5TVEFUUywgTWV0YWRhdGFUeXBlLkhFQURFUik7Ci0KLSAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IHNzdGFibGVNZXRhZGF0YTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGVNZXRhZGF0YSA9IGRlc2NyaXB0b3IuZ2V0TWV0YWRhdGFTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoZGVzY3JpcHRvciwgdHlwZXMpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKHQsIGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKSk7Ci0gICAgICAgIH0KLSAgICAgICAgVmFsaWRhdGlvbk1ldGFkYXRhIHZhbGlkYXRpb25NZXRhZGF0YSA9IChWYWxpZGF0aW9uTWV0YWRhdGEpIHNzdGFibGVNZXRhZGF0YS5nZXQoTWV0YWRhdGFUeXBlLlZBTElEQVRJT04pOwotICAgICAgICBTdGF0c01ldGFkYXRhIHN0YXRzTWV0YWRhdGEgPSAoU3RhdHNNZXRhZGF0YSkgc3N0YWJsZU1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuU1RBVFMpOwotICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyLkNvbXBvbmVudCBoZWFkZXIgPSAoU2VyaWFsaXphdGlvbkhlYWRlci5Db21wb25lbnQpIHNzdGFibGVNZXRhZGF0YS5nZXQoTWV0YWRhdGFUeXBlLkhFQURFUik7Ci0gICAgICAgIGFzc2VydCBoZWFkZXIgIT0gbnVsbDsKLQotICAgICAgICAvLyBDaGVjayBpZiBzc3RhYmxlIGlzIGNyZWF0ZWQgdXNpbmcgc2FtZSBwYXJ0aXRpb25lci4KLSAgICAgICAgLy8gUGFydGl0aW9uZXIgY2FuIGJlIG51bGwsIHdoaWNoIGluZGljYXRlcyBvbGRlciB2ZXJzaW9uIG9mIHNzdGFibGUgb3Igbm8gc3RhdHMgYXZhaWxhYmxlLgotICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHNraXAgdGhlIGNoZWNrLgotICAgICAgICBTdHJpbmcgcGFydGl0aW9uZXJOYW1lID0gbWV0YWRhdGEuZ2V0KCkucGFydGl0aW9uZXIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7Ci0gICAgICAgIGlmICh2YWxpZGF0aW9uTWV0YWRhdGEgIT0gbnVsbCAmJiAhcGFydGl0aW9uZXJOYW1lLmVxdWFscyh2YWxpZGF0aW9uTWV0YWRhdGEucGFydGl0aW9uZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkNhbm5vdCBvcGVuIHt9OyBwYXJ0aXRpb25lciB7fSBkb2VzIG5vdCBtYXRjaCBzeXN0ZW0gcGFydGl0aW9uZXIge30uICBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgcGFydGl0aW9uZXIgc3RhcnRpbmcgd2l0aCBDYXNzYW5kcmEgMS4yIGlzIE11cm11cjNQYXJ0aXRpb25lciwgc28geW91IHdpbGwgbmVlZCB0byBlZGl0IHRoYXQgdG8gbWF0Y2ggeW91ciBvbGQgcGFydGl0aW9uZXIgaWYgdXBncmFkaW5nLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciwgdmFsaWRhdGlvbk1ldGFkYXRhLnBhcnRpdGlvbmVyLCBwYXJ0aXRpb25lck5hbWUpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGU7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzc3RhYmxlID0gbmV3IFNTVGFibGVSZWFkZXJCdWlsZGVyLkZvclJlYWQoZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPZmZsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHNNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIudG9IZWFkZXIobWV0YWRhdGEuZ2V0KCkpKS5idWlsZCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChVbmtub3duQ29sdW1uRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbGlkYXRlKQotICAgICAgICAgICAgICAgIHNzdGFibGUudmFsaWRhdGUoKTsKLQotICAgICAgICAgICAgaWYgKHNzdGFibGUuZ2V0S2V5Q2FjaGUoKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgia2V5IGNhY2hlIGNvbnRhaW5zIHt9L3t9IGtleXMiLCBzc3RhYmxlLmdldEtleUNhY2hlKCkuc2l6ZSgpLCBzc3RhYmxlLmdldEtleUNhY2hlKCkuZ2V0Q2FwYWNpdHkoKSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzc3RhYmxlOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgc3N0YWJsZS5zZWxmUmVmKCkucmVsZWFzZSgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKHQsIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQob3duZXIsIHZhbGlkYXRlLCAhaXNPZmZsaW5lKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gb3BlbkFsbChTZXQ8TWFwLkVudHJ5PERlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+Pj4gZW50cmllcywKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gb3BlbkFsbChTU1RhYmxlLk93bmVyIG93bmVyLCBTZXQ8TWFwLkVudHJ5PERlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+Pj4gZW50cmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhKQogICAgIHsKICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ld0Jsb2NraW5nUXVldWUoKTsKQEAgLTU0MSwyOSArNDA2LDI1IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PERlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+PiBlbnRyeSA6IGVudHJpZXMpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKKyAgICAgICAgICAgICAgICBSdW5uYWJsZSBydW5uYWJsZSA9ICgpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlOworICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZSA9IG9wZW4oZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCksIG1ldGFkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKVk1TdGFiaWxpdHlJbnNwZWN0b3IuaW5zcGVjdFRocm93YWJsZShleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDb3JydXB0IHNzdGFibGUge307IHNraXBwaW5nIHRhYmxlIiwgZW50cnksIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRlNFcnJvciBleCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKVk1TdGFiaWxpdHlJbnNwZWN0b3IuaW5zcGVjdFRocm93YWJsZShleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDYW5ub3QgcmVhZCBzc3RhYmxlIHt9OyBmaWxlIHN5c3RlbSBlcnJvciwgc2tpcHBpbmcgdGFibGUiLCBlbnRyeSwgZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVzLmFkZChzc3RhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUgPSBvcGVuKG93bmVyLCBlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSwgbWV0YWRhdGEpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSlZNU3RhYmlsaXR5SW5zcGVjdG9yLmluc3BlY3RUaHJvd2FibGUoZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDb3JydXB0IHNzdGFibGUge307IHNraXBwaW5nIHRhYmxlIiwgZW50cnksIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRlNFcnJvciBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSlZNU3RhYmlsaXR5SW5zcGVjdG9yLmluc3BlY3RUaHJvd2FibGUoZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDYW5ub3QgcmVhZCBzc3RhYmxlIHt9OyBmaWxlIHN5c3RlbSBlcnJvciwgc2tpcHBpbmcgdGFibGUiLCBlbnRyeSwgZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNzdGFibGVzLmFkZChzc3RhYmxlKTsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdChydW5uYWJsZSk7CiAgICAgICAgICAgICB9CkBAIC01ODMsMTAyICs0NDQsNjIgQEAKICAgICAgICAgfQogCiAgICAgICAgIHJldHVybiBzc3RhYmxlczsKLQogICAgIH0KIAotICAgIC8qKgotICAgICAqIE9wZW4gYSBSb3dJbmRleGVkUmVhZGVyIHdoaWNoIGFscmVhZHkgaGFzIGl0cyBzdGF0ZSBpbml0aWFsaXplZCAoYnkgU1NUYWJsZVdyaXRlcikuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTU1RhYmxlUmVhZGVyIGludGVybmFsT3BlbihEZXNjcmlwdG9yIGRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUgaWZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGRmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhTdW1tYXJ5IHN1bW1hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRmlsdGVyIGJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBtYXhEYXRhQWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzc3RhYmxlTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuUmVhc29uIG9wZW5SZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcikKKyAgICBwcm90ZWN0ZWQgU1NUYWJsZVJlYWRlcihCdWlsZGVyPD8sID8+IGJ1aWxkZXIsIE93bmVyIG93bmVyKQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGRlc2MgIT0gbnVsbCAmJiBpZmlsZSAhPSBudWxsICYmIGRmaWxlICE9IG51bGwgJiYgc3VtbWFyeSAhPSBudWxsICYmIGJmICE9IG51bGwgJiYgc3N0YWJsZU1ldGFkYXRhICE9IG51bGw7CisgICAgICAgIHN1cGVyKGJ1aWxkZXIsIG93bmVyKTsKIAotICAgICAgICByZXR1cm4gbmV3IFNTVGFibGVSZWFkZXJCdWlsZGVyLkZvcldyaXRlcihkZXNjLCBtZXRhZGF0YSwgbWF4RGF0YUFnZSwgY29tcG9uZW50cywgc3N0YWJsZU1ldGFkYXRhLCBvcGVuUmVhc29uLCBoZWFkZXIpCi0gICAgICAgICAgICAgICAgLmJmKGJmKS5pZmlsZShpZmlsZSkuZGZpbGUoZGZpbGUpLnN1bW1hcnkoc3VtbWFyeSkuYnVpbGQoKTsKLSAgICB9CisgICAgICAgIHRoaXMuc3N0YWJsZU1ldGFkYXRhID0gYnVpbGRlci5nZXRTdGF0c01ldGFkYXRhKCk7CisgICAgICAgIHRoaXMuaGVhZGVyID0gYnVpbGRlci5nZXRTZXJpYWxpemF0aW9uSGVhZGVyKCk7CisgICAgICAgIHRoaXMuZGZpbGUgPSBidWlsZGVyLmdldERhdGFGaWxlKCk7CisgICAgICAgIHRoaXMubWF4RGF0YUFnZSA9IGJ1aWxkZXIuZ2V0TWF4RGF0YUFnZSgpOworICAgICAgICB0aGlzLm9wZW5SZWFzb24gPSBidWlsZGVyLmdldE9wZW5SZWFzb24oKTsKKyAgICAgICAgdGhpcy5maXJzdCA9IGJ1aWxkZXIuZ2V0Rmlyc3QoKTsKKyAgICAgICAgdGhpcy5sYXN0ID0gYnVpbGRlci5nZXRMYXN0KCk7CisgICAgICAgIHRoaXMuYm91bmRzID0gQWJzdHJhY3RCb3VuZHMuc3RyaWN0bHlXcmFwc0Fyb3VuZChmaXJzdC5nZXRUb2tlbigpLCBsYXN0LmdldFRva2VuKCkpCisgICAgICAgICAgICAgICAgICAgICAgPyBudWxsIC8vIHRoaXMgd2lsbCBjYXVzZSB0aGUgdmFsaWRhdGlvbiB0byBmYWlsLCBidXQgdGhlIHJlYWRlciBpcyBvcGVuZWQgd2l0aCBubyB2YWxpZGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlLmcuIGZvciBzY3J1YmJpbmcsIHdlIHNob3VsZCBhY2NlcHQgc2NyZXdlZCBib3VuZHMKKyAgICAgICAgICAgICAgICAgICAgICA6IEFic3RyYWN0Qm91bmRzLmJvdW5kcyhmaXJzdC5nZXRUb2tlbigpLCB0cnVlLCBsYXN0LmdldFRva2VuKCksIHRydWUpOwogCi0gICAgLyoqCi0gICAgICogQmVzdC1lZmZvcnQgY2hlY2tpbmcgdG8gdmVyaWZ5IHRoZSBleHBlY3RlZCBjb21wcmVzc2lvbiBpbmZvIGNvbXBvbmVudCBleGlzdHMsIGFjY29yZGluZyB0byB0aGUgVE9DIGZpbGUuCi0gICAgICogVGhlIHZlcmlmaWNhdGlvbiBkZXBlbmRzIG9uIHRoZSBleGlzdGVuY2Ugb2YgVE9DIGZpbGUuIElmIGFic2VudCwgdGhlIHZlcmlmaWNhdGlvbiBpcyBza2lwcGVkLgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yCi0gICAgICogQHBhcmFtIGFjdHVhbENvbXBvbmVudHMsIGFjdHVhbCBjb21wb25lbnRzIGxpc3RlZCBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KLSAgICAgKiBAdGhyb3dzIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uLCBpZiBUT0MgZXhwZWN0cyBjb21wcmVzc2lvbiBpbmZvIGJ1dCBub3QgZm91bmQgZnJvbSBkaXNrLgotICAgICAqIEB0aHJvd3MgRlNSZWFkRXJyb3IsIGlmIHVuYWJsZSB0byByZWFkIGZyb20gVE9DIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUNvbXByZXNzaW9uSW5mb0V4aXN0ZW5jZUlmQXBwbGljYWJsZShEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBhY3R1YWxDb21wb25lbnRzKQotICAgIHRocm93cyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiwgRlNSZWFkRXJyb3IKLSAgICB7Ci0gICAgICAgIEZpbGUgdG9jRmlsZSA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlRPQykpOwotICAgICAgICBpZiAodG9jRmlsZS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gZXhwZWN0ZWRDb21wb25lbnRzID0gcmVhZFRPQyhkZXNjcmlwdG9yLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkQ29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTykgJiYgIWFjdHVhbENvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LkNPTVBSRVNTSU9OX0lORk8pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXByZXNzaW9uSW5mb0ZpbGVOYW1lID0gZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTyk7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihuZXcgTm9TdWNoRmlsZUV4Y2VwdGlvbihjb21wcmVzc2lvbkluZm9GaWxlTmFtZSksIGNvbXByZXNzaW9uSW5mb0ZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlNSZWFkRXJyb3IoZSwgdG9jRmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU1NUYWJsZVJlYWRlcihTU1RhYmxlUmVhZGVyQnVpbGRlciBidWlsZGVyKQotICAgIHsKLSAgICAgICAgdGhpcyhidWlsZGVyLmRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgYnVpbGRlci5jb21wb25lbnRzLAotICAgICAgICAgICAgIGJ1aWxkZXIubWV0YWRhdGFSZWYsCi0gICAgICAgICAgICAgYnVpbGRlci5tYXhEYXRhQWdlLAotICAgICAgICAgICAgIGJ1aWxkZXIuc3RhdHNNZXRhZGF0YSwKLSAgICAgICAgICAgICBidWlsZGVyLm9wZW5SZWFzb24sCi0gICAgICAgICAgICAgYnVpbGRlci5oZWFkZXIsCi0gICAgICAgICAgICAgYnVpbGRlci5zdW1tYXJ5LAotICAgICAgICAgICAgIGJ1aWxkZXIuZGZpbGUsCi0gICAgICAgICAgICAgYnVpbGRlci5pZmlsZSwKLSAgICAgICAgICAgICBidWlsZGVyLmJmKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU1NUYWJsZVJlYWRlcihmaW5hbCBEZXNjcmlwdG9yIGRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbWF4RGF0YUFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0c01ldGFkYXRhIHNzdGFibGVNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuUmVhc29uIG9wZW5SZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhTdW1tYXJ5IHN1bW1hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUhhbmRsZSBkZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGlmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGaWx0ZXIgYmYpCi0gICAgewotICAgICAgICBzdXBlcihkZXNjLCBjb21wb25lbnRzLCBtZXRhZGF0YSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldERpc2tPcHRpbWl6YXRpb25TdHJhdGVneSgpKTsKLSAgICAgICAgdGhpcy5zc3RhYmxlTWV0YWRhdGEgPSBzc3RhYmxlTWV0YWRhdGE7Ci0gICAgICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyOwotICAgICAgICB0aGlzLmluZGV4U3VtbWFyeSA9IHN1bW1hcnk7Ci0gICAgICAgIHRoaXMuZGZpbGUgPSBkZmlsZTsKLSAgICAgICAgdGhpcy5pZmlsZSA9IGlmaWxlOwotICAgICAgICB0aGlzLmJmID0gYmY7Ci0gICAgICAgIHRoaXMubWF4RGF0YUFnZSA9IG1heERhdGFBZ2U7Ci0gICAgICAgIHRoaXMub3BlblJlYXNvbiA9IG9wZW5SZWFzb247Ci0gICAgICAgIHRoaXMucm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIgPSBkZXNjcmlwdG9yLnZlcnNpb24uZ2V0U1NUYWJsZUZvcm1hdCgpLmdldEluZGV4U2VyaWFsaXplcihtZXRhZGF0YS5nZXQoKSwgZGVzYy52ZXJzaW9uLCBoZWFkZXIpOwotICAgICAgICB0aWR5ID0gbmV3IEluc3RhbmNlVGlkaWVyKGRlc2NyaXB0b3IsIG1ldGFkYXRhLmlkKTsKKyAgICAgICAgdGlkeSA9IG5ldyBJbnN0YW5jZVRpZGllcihkZXNjcmlwdG9yLCBvd25lcik7CiAgICAgICAgIHNlbGZSZWYgPSBuZXcgUmVmPD4odGhpcywgdGlkeSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERlY29yYXRlZEtleSBnZXRGaXJzdCgpCisgICAgeworICAgICAgICByZXR1cm4gZmlyc3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERlY29yYXRlZEtleSBnZXRMYXN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBsYXN0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBYnN0cmFjdEJvdW5kczxUb2tlbj4gZ2V0Qm91bmRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGJvdW5kcywgIkJvdW5kcyB3ZXJlIG5vdCBjcmVhdGVkIGJlY2F1c2UgdGhlIHNzdGFibGUgaXMgb3V0IG9mIG9yZGVyIik7CisgICAgfQorCisgICAgcHVibGljIERhdGFJbnRlZ3JpdHlNZXRhZGF0YS5DaGVja3N1bVZhbGlkYXRvciBtYXliZUdldENoZWNrc3VtVmFsaWRhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuQ1JDKS5leGlzdHMoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YUludGVncml0eU1ldGFkYXRhLkNoZWNrc3VtVmFsaWRhdG9yKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLCBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5DUkMpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIERhdGFJbnRlZ3JpdHlNZXRhZGF0YS5GaWxlRGlnZXN0VmFsaWRhdG9yIG1heWJlR2V0RGlnZXN0VmFsaWRhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRElHRVNUKS5leGlzdHMoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YUludGVncml0eU1ldGFkYXRhLkZpbGVEaWdlc3RWYWxpZGF0b3IoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSksIGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRJR0VTVCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VG90YWxCeXRlcyhJdGVyYWJsZTxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcykKICAgICB7CiAgICAgICAgIGxvbmcgc3VtID0gMDsKQEAgLTcxMyw2MCArNTM0LDcgQEAKIAogICAgIHB1YmxpYyB2b2lkIHNldHVwT25saW5lKCkKICAgICB7Ci0gICAgICAgIC8vIHVuZGVyIG5vcm1hbCBvcGVyYXRpb24gd2UgY2FuIGRvIHRoaXMgYXQgYW55IHRpbWUsIGJ1dCBTU1RSIGlzIGFsc28gdXNlZCBvdXRzaWRlIEMqIHByb3BlciwKLSAgICAgICAgLy8gZS5nLiBieSBCdWxrTG9hZGVyLCB3aGljaCBkb2VzIG5vdCBpbml0aWFsaXplIHRoZSBjYWNoZS4gIEFzIGEga2x1ZGdlLCB3ZSBzZXQgdXAgdGhlIGNhY2hlCi0gICAgICAgIC8vIGhlcmUgd2hlbiB3ZSBrbm93IHdlJ3JlIGJlaW5nIHdpcmVkIGludG8gdGhlIHJlc3Qgb2YgdGhlIHNlcnZlciBpbmZyYXN0cnVjdHVyZS4KLSAgICAgICAgSW5zdHJ1bWVudGluZ0NhY2hlPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5PiBtYXliZUtleUNhY2hlID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlOwotICAgICAgICBpZiAobWF5YmVLZXlDYWNoZS5nZXRDYXBhY2l0eSgpID4gMCkKLSAgICAgICAgICAgIGtleUNhY2hlID0gbWF5YmVLZXlDYWNoZTsKLQotICAgICAgICBmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmVJbnN0YW5jZShtZXRhZGF0YSgpLmlkKTsKLSAgICAgICAgaWYgKGNmcyAhPSBudWxsKQotICAgICAgICAgICAgc2V0Q3JjQ2hlY2tDaGFuY2UoY2ZzLmdldENyY0NoZWNrQ2hhbmNlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNhdmUgaW5kZXggc3VtbWFyeSB0byBTdW1tYXJ5LmRiIGZpbGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNhdmVTdW1tYXJ5KERlc2NyaXB0b3IgZGVzY3JpcHRvciwgRGVjb3JhdGVkS2V5IGZpcnN0LCBEZWNvcmF0ZWRLZXkgbGFzdCwgSW5kZXhTdW1tYXJ5IHN1bW1hcnkpCi0gICAgewotICAgICAgICBGaWxlIHN1bW1hcmllc0ZpbGUgPSBuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVU1NQVJZKSk7Ci0gICAgICAgIGlmIChzdW1tYXJpZXNGaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVdpdGhDb25maXJtKHN1bW1hcmllc0ZpbGUpOwotCi0gICAgICAgIHRyeSAoRGF0YU91dHB1dFN0cmVhbVBsdXMgb1N0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtUGx1cyhzdW1tYXJpZXNGaWxlKSkKLSAgICAgICAgewotICAgICAgICAgICAgSW5kZXhTdW1tYXJ5LnNlcmlhbGl6ZXIuc2VyaWFsaXplKHN1bW1hcnksIG9TdHJlYW0pOwotICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoTGVuZ3RoKGZpcnN0LmdldEtleSgpLCBvU3RyZWFtKTsKLSAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aExlbmd0aChsYXN0LmdldEtleSgpLCBvU3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJDYW5ub3Qgc2F2ZSBTU1RhYmxlIFN1bW1hcnk6ICIsIGUpOwotCi0gICAgICAgICAgICAvLyBjb3JydXB0ZWQgaGVuY2UgZGVsZXRlIGl0IGFuZCBsZXQgaXQgbG9hZCBpdCBub3cuCi0gICAgICAgICAgICBpZiAoc3VtbWFyaWVzRmlsZS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlV2l0aENvbmZpcm0oc3VtbWFyaWVzRmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2F2ZUJsb29tRmlsdGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgSUZpbHRlciBmaWx0ZXIpCi0gICAgewotICAgICAgICBGaWxlIGZpbHRlckZpbGUgPSBuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5GSUxURVIpKTsKLSAgICAgICAgdHJ5IChEYXRhT3V0cHV0U3RyZWFtUGx1cyBzdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbVBsdXMoZmlsdGVyRmlsZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJsb29tRmlsdGVyU2VyaWFsaXplci5zZXJpYWxpemUoKEJsb29tRmlsdGVyKSBmaWx0ZXIsIHN0cmVhbSk7Ci0gICAgICAgICAgICBzdHJlYW0uZmx1c2goKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJDYW5ub3Qgc2F2ZSBTU1RhYmxlIGJsb29tZmlsdGVyOiAiLCBlKTsKLQotICAgICAgICAgICAgLy8gY29ycnVwdGVkIGhlbmNlIGRlbGV0ZSBpdCBhbmQgbGV0IGl0IGxvYWQgaXQgbm93LgotICAgICAgICAgICAgaWYgKGZpbHRlckZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVdpdGhDb25maXJtKGZpbHRlckZpbGUpOwotICAgICAgICB9Ci0KKyAgICAgICAgIG93bmVyKCkuaWZQcmVzZW50KG8gLT4gc2V0Q3JjQ2hlY2tDaGFuY2Uoby5nZXRDcmNDaGVja0NoYW5jZSgpKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC03NzQsNyArNTQyLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSB0YXNrIHRvIGJlIGd1YXJkZWQgYnkgc3N0YWJsZSBsb2NrCiAgICAgICovCi0gICAgcHVibGljIDxSPiBSIHJ1bldpdGhMb2NrKENoZWNrZWRGdW5jdGlvbjxEZXNjcmlwdG9yLCBSLCBJT0V4Y2VwdGlvbj4gdGFzaykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgcHVibGljIDxSLCBFIGV4dGVuZHMgRXhjZXB0aW9uPiBSIHJ1bldpdGhMb2NrKENoZWNrZWRGdW5jdGlvbjxEZXNjcmlwdG9yLCBSLCBFPiB0YXNrKSB0aHJvd3MgRQogICAgIHsKICAgICAgICAgc3luY2hyb25pemVkICh0aWR5Lmdsb2JhbCkKICAgICAgICAgewpAQCAtNzk5LDMxNyArNTY3LDExMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gVGhlc2UgcnVubmFibGVzIG11c3QgTk9UIGJlIGFuIGFub255bW91cyBvciBub24tc3RhdGljIGlubmVyIGNsYXNzLCBub3IgbXVzdCBpdCByZXRhaW4gYSByZWZlcmVuY2UgY2hhaW4gdG8gdGhpcyByZWFkZXIKKyAgICAvKioKKyAgICAgKiBUaGUgcnVubmFibGUgcGFzc2VkIHRvIHRoaXMgbWV0aG9kIG11c3Qgbm90IGJlIGFuIGFub255bW91cyBvciBub24tc3RhdGljIGlubmVyIGNsYXNzLiBJdCBjYW4gYmUgYSBsYW1iZGEgb3IgYQorICAgICAqIG1ldGhvZCByZWZlcmVuY2UgcHJvdmlkZWQgdGhhdCBpdCBkb2VzIG5vdCByZXRhaW4gYSByZWZlcmVuY2UgY2hhaW4gdG8gdGhpcyByZWFkZXIuCisgICAgICovCiAgICAgcHVibGljIHZvaWQgcnVuT25DbG9zZShmaW5hbCBSdW5uYWJsZSBydW5PbkNsb3NlKQogICAgIHsKKyAgICAgICAgaWYgKHJ1bk9uQ2xvc2UgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKwogICAgICAgICBzeW5jaHJvbml6ZWQgKHRpZHkuZ2xvYmFsKQogICAgICAgICB7CiAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBleGlzdGluZyA9IHRpZHkucnVuT25DbG9zZTsKLSAgICAgICAgICAgIHRpZHkucnVuT25DbG9zZSA9IEFuZFRoZW4uZ2V0KGV4aXN0aW5nLCBydW5PbkNsb3NlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFuZFRoZW4gaW1wbGVtZW50cyBSdW5uYWJsZQotICAgIHsKLSAgICAgICAgZmluYWwgUnVubmFibGUgcnVuRmlyc3Q7Ci0gICAgICAgIGZpbmFsIFJ1bm5hYmxlIHJ1blNlY29uZDsKLQotICAgICAgICBwcml2YXRlIEFuZFRoZW4oUnVubmFibGUgcnVuRmlyc3QsIFJ1bm5hYmxlIHJ1blNlY29uZCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5ydW5GaXJzdCA9IHJ1bkZpcnN0OwotICAgICAgICAgICAgdGhpcy5ydW5TZWNvbmQgPSBydW5TZWNvbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBydW5GaXJzdC5ydW4oKTsKLSAgICAgICAgICAgIHJ1blNlY29uZC5ydW4oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBSdW5uYWJsZSBnZXQoUnVubmFibGUgcnVuRmlyc3QsIFJ1bm5hYmxlIHJ1blNlY29uZCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHJ1bkZpcnN0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJ1blNlY29uZDsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQW5kVGhlbihydW5GaXJzdCwgcnVuU2Vjb25kKTsKKyAgICAgICAgICAgIGlmIChleGlzdGluZyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRpZHkucnVuT25DbG9zZSA9IHJ1bk9uQ2xvc2U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGlkeS5ydW5PbkNsb3NlID0gKCkgLT4geworICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5ydW4oKTsKKyAgICAgICAgICAgICAgICAgICAgcnVuT25DbG9zZS5ydW4oKTsKKyAgICAgICAgICAgICAgICB9OwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2xvbmUgdGhpcyByZWFkZXIgd2l0aCB0aGUgcHJvdmlkZWQgc3RhcnQgYW5kIG9wZW4gcmVhc29uLCBhbmQgc2V0IHRoZSBjbG9uZSBhcyByZXBsYWNlbWVudC4KKyAgICAgKiBUaGUgbWV0aG9kIHNldHMgZmllbGRzIHNwZWNpZmljIHRvIHRoaXMge0BsaW5rIFNTVGFibGVSZWFkZXJ9IGFuZCB0aGUgcGFyZW50IHtAbGluayBTU1RhYmxlfSBvbiB0aGUgcHJvdmlkZWQKKyAgICAgKiB7QGxpbmsgQnVpbGRlcn0uIFRoZSBtZXRob2QgaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gdGhlIG92ZXJsb2FkZWQge0Bjb2RlIHVuYnVpbGRUb30gbWV0aG9kIGluIHN1YmNsYXNzZXMuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gbmV3Rmlyc3QgdGhlIGZpcnN0IGtleSBmb3IgdGhlIHJlcGxhY2VtZW50ICh3aGljaCBjYW4gYmUgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIGR1ZSB0byB0aGUgcHJlLWVtcHRpdmUKLSAgICAgKiBvcGVuaW5nIG9mIGNvbXBhY3Rpb24gcmVzdWx0cykuCi0gICAgICogQHBhcmFtIHJlYXNvbiB0aGUge0Bjb2RlIE9wZW5SZWFzb259IGZvciB0aGUgcmVwbGFjZW1lbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjbG9uZWQgcmVhZGVyLiBUaGF0IHJlYWRlciBpcyBzZXQgYXMgYSByZXBsYWNlbWVudCBieSB0aGUgbWV0aG9kLgorICAgICAqIEBwYXJhbSBidWlsZGVyICAgIHRoZSBidWlsZGVyIG9uIHdoaWNoIHRoZSBmaWVsZHMgc2hvdWxkIGJlIHNldAorICAgICAqIEBwYXJhbSBzaGFyZWRDb3B5IHdoZXRoZXIgdGhlIHtAbGluayBTaGFyZWRDbG9zZWFibGV9IHJlc291cmNlcyBzaG91bGQgYmUgcGFzc2VkIGFzIHNoYXJlZCBjb3BpZXMgb3IgZGlyZWN0bHk7CisgICAgICogICAgICAgICAgICAgICAgICAgbm90ZSB0aGF0IHRoZSBtZXRob2Qgd2lsbCBvdmVyd3JpdGUgdGhlIGZpZWxkcyByZXByZXNlbnRpbmcge0BsaW5rIFNoYXJlZENsb3NlYWJsZX0gb25seSBpZgorICAgICAqICAgICAgICAgICAgICAgICAgIHRoZXkgYXJlIG5vdCBzZXQgaW4gdGhlIGJ1aWxkZXIgeWV0ICh0aGUgcmVsZXZhbnQgZmllbGRzIGluIHRoZSBidWlsZGVyIGFyZSB7QGNvZGUgbnVsbH0pLgorICAgICAqIEByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2Ugb2YgYnVpbGRlciBhcyBwcm92aWRlZAogICAgICAqLwotICAgIHByaXZhdGUgU1NUYWJsZVJlYWRlciBjbG9uZUFuZFJlcGxhY2UoRGVjb3JhdGVkS2V5IG5ld0ZpcnN0LCBPcGVuUmVhc29uIHJlYXNvbikKKyAgICBwcm90ZWN0ZWQgZmluYWwgPEIgZXh0ZW5kcyBCdWlsZGVyPD8sIEI+PiBCIHVuYnVpbGRUbyhCIGJ1aWxkZXIsIGJvb2xlYW4gc2hhcmVkQ29weSkKICAgICB7Ci0gICAgICAgIHJldHVybiBjbG9uZUFuZFJlcGxhY2UobmV3Rmlyc3QsIHJlYXNvbiwgaW5kZXhTdW1tYXJ5LnNoYXJlZENvcHkoKSk7CisgICAgICAgIEIgYiA9IHN1cGVyLnVuYnVpbGRUbyhidWlsZGVyLCBzaGFyZWRDb3B5KTsKKyAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0RGF0YUZpbGUoKSA9PSBudWxsKQorICAgICAgICAgICAgYi5zZXREYXRhRmlsZShzaGFyZWRDb3B5ID8gc2hhcmVkQ29weU9yTnVsbChkZmlsZSkgOiBkZmlsZSk7CisKKyAgICAgICAgYi5zZXRTdGF0c01ldGFkYXRhKHNzdGFibGVNZXRhZGF0YSk7CisgICAgICAgIGIuc2V0U2VyaWFsaXphdGlvbkhlYWRlcihoZWFkZXIpOworICAgICAgICBiLnNldE1heERhdGFBZ2UobWF4RGF0YUFnZSk7CisgICAgICAgIGIuc2V0T3BlblJlYXNvbihvcGVuUmVhc29uKTsKKyAgICAgICAgYi5zZXRGaXJzdChmaXJzdCk7CisgICAgICAgIGIuc2V0TGFzdChsYXN0KTsKKyAgICAgICAgYi5zZXRTdXNwZWN0ZWQoaXNTdXNwZWN0LmdldCgpKTsKKyAgICAgICAgcmV0dXJuIGI7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogQ2xvbmUgdGhpcyByZWFkZXIgd2l0aCB0aGUgbmV3IHZhbHVlcyBhbmQgc2V0IHRoZSBjbG9uZSBhcyByZXBsYWNlbWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuZXdGaXJzdCB0aGUgZmlyc3Qga2V5IGZvciB0aGUgcmVwbGFjZW1lbnQgKHdoaWNoIGNhbiBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgZHVlIHRvIHRoZSBwcmUtZW1wdGl2ZQotICAgICAqIG9wZW5pbmcgb2YgY29tcGFjdGlvbiByZXN1bHRzKS4KLSAgICAgKiBAcGFyYW0gcmVhc29uIHRoZSB7QGNvZGUgT3BlblJlYXNvbn0gZm9yIHRoZSByZXBsYWNlbWVudC4KLSAgICAgKiBAcGFyYW0gbmV3U3VtbWFyeSB0aGUgaW5kZXggc3VtbWFyeSBmb3IgdGhlIHJlcGxhY2VtZW50LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgY2xvbmVkIHJlYWRlci4gVGhhdCByZWFkZXIgaXMgc2V0IGFzIGEgcmVwbGFjZW1lbnQgYnkgdGhlIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNTVGFibGVSZWFkZXIgY2xvbmVBbmRSZXBsYWNlKERlY29yYXRlZEtleSBuZXdGaXJzdCwgT3BlblJlYXNvbiByZWFzb24sIEluZGV4U3VtbWFyeSBuZXdTdW1tYXJ5KQotICAgIHsKLSAgICAgICAgU1NUYWJsZVJlYWRlciByZXBsYWNlbWVudCA9IGludGVybmFsT3BlbihkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZpbGUgIT0gbnVsbCA/IGlmaWxlLnNoYXJlZENvcHkoKSA6IG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbGUuc2hhcmVkQ29weSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N1bW1hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmYuc2hhcmVkQ29weSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERhdGFBZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZU1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIpOworICAgIHB1YmxpYyBhYnN0cmFjdCBTU1RhYmxlUmVhZGVyIGNsb25lV2l0aFJlc3RvcmVkU3RhcnQoRGVjb3JhdGVkS2V5IHJlc3RvcmVkU3RhcnQpOwogCi0gICAgICAgIHJlcGxhY2VtZW50LmZpcnN0ID0gbmV3Rmlyc3Q7Ci0gICAgICAgIHJlcGxhY2VtZW50Lmxhc3QgPSBsYXN0OwotICAgICAgICByZXBsYWNlbWVudC5pc1N1c3BlY3Quc2V0KGlzU3VzcGVjdC5nZXQoKSk7Ci0gICAgICAgIHJldHVybiByZXBsYWNlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDbG9uZSB0aGlzIHJlYWRlciB3aXRoIHRoZSBuZXcgdmFsdWVzIGFuZCBzZXQgdGhlIGNsb25lIGFzIHJlcGxhY2VtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIG5ld0Jsb29tRmlsdGVyIGZvciB0aGUgcmVwbGFjZW1lbnQKLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCByZWFkZXIuIFRoYXQgcmVhZGVyIGlzIHNldCBhcyBhIHJlcGxhY2VtZW50IGJ5IHRoZSBtZXRob2QuCi0gICAgICovCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIFNTVGFibGVSZWFkZXIgY2xvbmVBbmRSZXBsYWNlKElGaWx0ZXIgbmV3Qmxvb21GaWx0ZXIpCi0gICAgewotICAgICAgICBTU1RhYmxlUmVhZGVyIHJlcGxhY2VtZW50ID0gaW50ZXJuYWxPcGVuKGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmlsZS5zaGFyZWRDb3B5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbGUuc2hhcmVkQ29weSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4U3VtbWFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdCbG9vbUZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhEYXRhQWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuUmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcik7Ci0KLSAgICAgICAgcmVwbGFjZW1lbnQuZmlyc3QgPSBmaXJzdDsKLSAgICAgICAgcmVwbGFjZW1lbnQubGFzdCA9IGxhc3Q7Ci0gICAgICAgIHJlcGxhY2VtZW50LmlzU3VzcGVjdC5zZXQoaXNTdXNwZWN0LmdldCgpKTsKLSAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIGNsb25lV2l0aFJlc3RvcmVkU3RhcnQoRGVjb3JhdGVkS2V5IHJlc3RvcmVkU3RhcnQpCi0gICAgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRpZHkuZ2xvYmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2xvbmVBbmRSZXBsYWNlKHJlc3RvcmVkU3RhcnQsIE9wZW5SZWFzb24uTk9STUFMKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHJ1bk9uQ2xvc2UgbXVzdCBOT1QgYmUgYW4gYW5vbnltb3VzIG9yIG5vbi1zdGF0aWMgaW5uZXIgY2xhc3MsIG5vciBtdXN0IGl0IHJldGFpbiBhIHJlZmVyZW5jZSBjaGFpbiB0byB0aGlzIHJlYWRlcgotICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIGNsb25lV2l0aE5ld1N0YXJ0KERlY29yYXRlZEtleSBuZXdTdGFydCwgZmluYWwgUnVubmFibGUgcnVuT25DbG9zZSkKLSAgICB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGlkeS5nbG9iYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydCBvcGVuUmVhc29uICE9IE9wZW5SZWFzb24uRUFSTFk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBtZXJnZSB3aXRoIGNhbGxlcidzIGZpcnN0S2V5QmV5b25kKCkgd29yayx0byBzYXZlIHRpbWUKLSAgICAgICAgICAgIGlmIChuZXdTdGFydC5jb21wYXJlVG8oZmlyc3QpID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGRhdGFTdGFydCA9IGdldFBvc2l0aW9uKG5ld1N0YXJ0LCBPcGVyYXRvci5FUSkucG9zaXRpb247Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBpbmRleFN0YXJ0ID0gZ2V0SW5kZXhTY2FuUG9zaXRpb24obmV3U3RhcnQpOwotICAgICAgICAgICAgICAgIHRoaXMudGlkeS5ydW5PbkNsb3NlID0gbmV3IERyb3BQYWdlQ2FjaGUoZGZpbGUsIGRhdGFTdGFydCwgaWZpbGUsIGluZGV4U3RhcnQsIHJ1bk9uQ2xvc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY2xvbmVBbmRSZXBsYWNlKG5ld1N0YXJ0LCBPcGVuUmVhc29uLk1PVkVEX1NUQVJUKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERyb3BQYWdlQ2FjaGUgaW1wbGVtZW50cyBSdW5uYWJsZQotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZUhhbmRsZSBkZmlsZTsKLSAgICAgICAgZmluYWwgbG9uZyBkZmlsZVBvc2l0aW9uOwotICAgICAgICBmaW5hbCBGaWxlSGFuZGxlIGlmaWxlOwotICAgICAgICBmaW5hbCBsb25nIGlmaWxlUG9zaXRpb247Ci0gICAgICAgIGZpbmFsIFJ1bm5hYmxlIGFuZFRoZW47Ci0KLSAgICAgICAgcHJpdmF0ZSBEcm9wUGFnZUNhY2hlKEZpbGVIYW5kbGUgZGZpbGUsIGxvbmcgZGZpbGVQb3NpdGlvbiwgRmlsZUhhbmRsZSBpZmlsZSwgbG9uZyBpZmlsZVBvc2l0aW9uLCBSdW5uYWJsZSBhbmRUaGVuKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmRmaWxlID0gZGZpbGU7Ci0gICAgICAgICAgICB0aGlzLmRmaWxlUG9zaXRpb24gPSBkZmlsZVBvc2l0aW9uOwotICAgICAgICAgICAgdGhpcy5pZmlsZSA9IGlmaWxlOwotICAgICAgICAgICAgdGhpcy5pZmlsZVBvc2l0aW9uID0gaWZpbGVQb3NpdGlvbjsKLSAgICAgICAgICAgIHRoaXMuYW5kVGhlbiA9IGFuZFRoZW47Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZmlsZS5kcm9wUGFnZUNhY2hlKGRmaWxlUG9zaXRpb24pOwotCi0gICAgICAgICAgICBpZiAoaWZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBpZmlsZS5kcm9wUGFnZUNhY2hlKGlmaWxlUG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKGFuZFRoZW4gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBhbmRUaGVuLnJ1bigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBTU1RhYmxlUmVhZGVyIHdpdGggdGhlIHNhbWUgcHJvcGVydGllcyBhcyB0aGlzIFNTVGFibGVSZWFkZXIgZXhjZXB0IHRoYXQgYSBuZXcgSW5kZXhTdW1tYXJ5IHdpbGwKLSAgICAgKiBiZSBidWlsdCBhdCB0aGUgdGFyZ2V0IHNhbXBsaW5nTGV2ZWwuICBUaGlzIChvcmlnaW5hbCkgU1NUYWJsZVJlYWRlciBpbnN0YW5jZSB3aWxsIGJlIG1hcmtlZCBhcyByZXBsYWNlZCwgaGF2ZQotICAgICAqIGl0cyBEZWxldGluZ1Rhc2sgcmVtb3ZlZCwgYW5kIGhhdmUgaXRzIHBlcmlvZGljIHJlYWQtbWV0ZXIgc3luYyB0YXNrIGNhbmNlbGxlZC4KLSAgICAgKiBAcGFyYW0gc2FtcGxpbmdMZXZlbCB0aGUgZGVzaXJlZCBzYW1wbGluZyBsZXZlbCBmb3IgdGhlIGluZGV4IHN1bW1hcnkgb24gdGhlIG5ldyBTU1RhYmxlUmVhZGVyCi0gICAgICogQHJldHVybiBhIG5ldyBTU1RhYmxlUmVhZGVyCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgcHVibGljIFNTVGFibGVSZWFkZXIgY2xvbmVXaXRoTmV3U3VtbWFyeVNhbXBsaW5nTGV2ZWwoQ29sdW1uRmFtaWx5U3RvcmUgcGFyZW50LCBpbnQgc2FtcGxpbmdMZXZlbCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhc3NlcnQgb3BlblJlYXNvbiAhPSBPcGVuUmVhc29uLkVBUkxZOwotCi0gICAgICAgIGludCBtaW5JbmRleEludGVydmFsID0gbWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsKLSAgICAgICAgaW50IG1heEluZGV4SW50ZXJ2YWwgPSBtZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsOwotICAgICAgICBkb3VibGUgZWZmZWN0aXZlSW50ZXJ2YWwgPSBpbmRleFN1bW1hcnkuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpOwotCi0gICAgICAgIEluZGV4U3VtbWFyeSBuZXdTdW1tYXJ5OwotCi0gICAgICAgIC8vIFdlIGhhdmUgdG8gcmVidWlsZCB0aGUgc3VtbWFyeSBmcm9tIHRoZSBvbi1kaXNrIHByaW1hcnkgaW5kZXggaW4gdGhyZWUgY2FzZXM6Ci0gICAgICAgIC8vIDEuIFRoZSBzYW1wbGluZyBsZXZlbCB3ZW50IHVwLCBzbyB3ZSBuZWVkIHRvIHJlYWQgbW9yZSBlbnRyaWVzIG9mZiBkaXNrCi0gICAgICAgIC8vIDIuIFRoZSBtaW5faW5kZXhfaW50ZXJ2YWwgY2hhbmdlZCAoaW4gZWl0aGVyIGRpcmVjdGlvbik7IHRoaXMgY2hhbmdlcyB3aGF0IGVudHJpZXMgd291bGQgYmUgaW4gdGhlIHN1bW1hcnkKLSAgICAgICAgLy8gICAgYXQgZnVsbCBzYW1wbGluZyAoYW5kIGNvbnNlcXVlbnRseSBhdCBhbnkgb3RoZXIgc2FtcGxpbmcgbGV2ZWwpCi0gICAgICAgIC8vIDMuIFRoZSBtYXhfaW5kZXhfaW50ZXJ2YWwgd2FzIGxvd2VyZWQsIGZvcmNpbmcgdXMgdG8gcmFpc2UgdGhlIHNhbXBsaW5nIGxldmVsCi0gICAgICAgIGlmIChzYW1wbGluZ0xldmVsID4gaW5kZXhTdW1tYXJ5LmdldFNhbXBsaW5nTGV2ZWwoKSB8fCBpbmRleFN1bW1hcnkuZ2V0TWluSW5kZXhJbnRlcnZhbCgpICE9IG1pbkluZGV4SW50ZXJ2YWwgfHwgZWZmZWN0aXZlSW50ZXJ2YWwgPiBtYXhJbmRleEludGVydmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXdTdW1tYXJ5ID0gYnVpbGRTdW1tYXJ5QXRMZXZlbChzYW1wbGluZ0xldmVsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzYW1wbGluZ0xldmVsIDwgaW5kZXhTdW1tYXJ5LmdldFNhbXBsaW5nTGV2ZWwoKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gd2UgY2FuIHVzZSB0aGUgZXhpc3RpbmcgaW5kZXggc3VtbWFyeSB0byBtYWtlIGEgc21hbGxlciBvbmUKLSAgICAgICAgICAgIG5ld1N1bW1hcnkgPSBJbmRleFN1bW1hcnlCdWlsZGVyLmRvd25zYW1wbGUoaW5kZXhTdW1tYXJ5LCBzYW1wbGluZ0xldmVsLCBtaW5JbmRleEludGVydmFsLCBnZXRQYXJ0aXRpb25lcigpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiQXR0ZW1wdGVkIHRvIGNsb25lIFNTVGFibGVSZWFkZXIgd2l0aCB0aGUgc2FtZSBpbmRleCBzdW1tYXJ5IHNhbXBsaW5nIGxldmVsIGFuZCAiICsKLSAgICAgICAgICAgICAgICAgICAgIm5vIGFkanVzdG1lbnRzIHRvIG1pbi9tYXhfaW5kZXhfaW50ZXJ2YWwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFsd2F5cyBzYXZlIHRoZSByZXNhbXBsZWQgaW5kZXggd2l0aCBsb2NrIHRvIGF2b2lkIHJhY2luZyB3aXRoIGVudGlyZS1zc3RhYmxlIHN0cmVhbWluZwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRpZHkuZ2xvYmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBzYXZlU3VtbWFyeShkZXNjcmlwdG9yLCBmaXJzdCwgbGFzdCwgbmV3U3VtbWFyeSk7Ci0gICAgICAgICAgICByZXR1cm4gY2xvbmVBbmRSZXBsYWNlKGZpcnN0LCBPcGVuUmVhc29uLk1FVEFEQVRBX0NIQU5HRSwgbmV3U3VtbWFyeSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEluZGV4U3VtbWFyeSBidWlsZFN1bW1hcnlBdExldmVsKGludCBuZXdTYW1wbGluZ0xldmVsKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIHdlIHJlYWQgdGhlIHBvc2l0aW9ucyBpbiBhIEJSQUYgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBhbiBlbnRyeSBzcGFubmluZyBhIG1tYXAgYm91bmRhcnkuCi0gICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciBwcmltYXJ5SW5kZXggPSBSYW5kb21BY2Nlc3NSZWFkZXIub3BlbihuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBpbmRleFNpemUgPSBwcmltYXJ5SW5kZXgubGVuZ3RoKCk7Ci0gICAgICAgICAgICB0cnkgKEluZGV4U3VtbWFyeUJ1aWxkZXIgc3VtbWFyeUJ1aWxkZXIgPSBuZXcgSW5kZXhTdW1tYXJ5QnVpbGRlcihlc3RpbWF0ZWRLZXlzKCksIG1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIG5ld1NhbXBsaW5nTGV2ZWwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgaW5kZXhQb3NpdGlvbjsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKGluZGV4UG9zaXRpb24gPSBwcmltYXJ5SW5kZXguZ2V0RmlsZVBvaW50ZXIoKSkgIT0gaW5kZXhTaXplKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3VtbWFyeUJ1aWxkZXIubWF5YmVBZGRFbnRyeShkZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKHByaW1hcnlJbmRleCkpLCBpbmRleFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyLnNraXAocHJpbWFyeUluZGV4LCBkZXNjcmlwdG9yLnZlcnNpb24pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBzdW1tYXJ5QnVpbGRlci5idWlsZChnZXRQYXJ0aXRpb25lcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkocHJpbWFyeUluZGV4KTsKLSAgICAgICAgfQotICAgIH0KKyAgICBwdWJsaWMgYWJzdHJhY3QgU1NUYWJsZVJlYWRlciBjbG9uZVdpdGhOZXdTdGFydChEZWNvcmF0ZWRLZXkgbmV3U3RhcnQpOwogCiAgICAgcHVibGljIFJlc3RvcmFibGVNZXRlciBnZXRSZWFkTWV0ZXIoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHJlYWRNZXRlcjsKICAgICB9CiAKLSAgICBwdWJsaWMgaW50IGdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKQorICAgIC8qKgorICAgICAqIEFsbCB0aGUgcmVzb3VyY2VzIHdoaWNoIHNob3VsZCBiZSByZWxlYXNlZCB1cG9uIGNsb3NpbmcgdGhpcyBzc3RhYmxlIHJlYWRlciBhcmUgcmVnaXN0ZXJlZCB3aXRoIGluCisgICAgICoge0BsaW5rIEdsb2JhbFRpZHl9LiBUaGlzIG1ldGhvZCBsZXRzIGNsb3NlIGEgcHJvdmlkZWQgcmVzb3VyY2UgZXhwbGljaXRseSBhbnkgdGltZSBhbmQgdW5yZWdpc3RlciBpdCBmcm9tCisgICAgICoge0BsaW5rIEdsb2JhbFRpZHl9IHNvIHRoYXQgaXQgaXMgbm90IHRyaWVkIHRvIGJlIHJlbGVhc2VkIHR3aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNsb3NlYWJsZSBhIHJlc291cmNlIHRvIGJlIGNsb3NlZAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlSW50ZXJuYWxDb21wb25lbnQoQXV0b0Nsb3NlYWJsZSBjbG9zZWFibGUpCiAgICAgewotICAgICAgICByZXR1cm4gaW5kZXhTdW1tYXJ5LmdldFNhbXBsaW5nTGV2ZWwoKTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aWR5Lmdsb2JhbCkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbGVhbiByZW1vdmVkID0gdGlkeS5jbG9zZWFibGVzLnJlbW92ZShjbG9zZWFibGUpOworICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlKHJlbW92ZWQpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xvc2VhYmxlLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gY2xvc2UgIiArIGNsb3NlYWJsZSwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIGxvbmcgZ2V0SW5kZXhTdW1tYXJ5T2ZmSGVhcFNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZGV4U3VtbWFyeS5nZXRPZmZIZWFwU2l6ZSgpOwotICAgIH0KKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBleHBlY3RlZCB0byBjbG9zZSB0aGUgY29tcG9uZW50cyB3aGljaCBvY2N1cHkgbWVtb3J5IGJ1dCBhcmUgbm90IG5lZWRlZCB3aGVuIHdlIGp1c3Qgd2FudCB0bworICAgICAqIHN0cmVhbSB0aGUgY29tcG9uZW50cyAoZm9yIGV4YW1wbGUsIHdoZW4gU1NUYWJsZSBpcyBvcGVuZWQgd2l0aCBTU1RhYmxlTG9hZGVyKS4gVGhlIG1ldGhvZCBzaG91bGQgY2FsbAorICAgICAqIHtAbGluayAjY2xvc2VJbnRlcm5hbENvbXBvbmVudChBdXRvQ2xvc2VhYmxlKX0gZm9yIGVhY2ggc3VjaCBjb21wb25lbnQuIExlYXZpbmcgdGhlIGltcGxlbWVudGF0aW9uIGVtcHR5IGlzCisgICAgICogdmFsaWQgZ2l2ZW4gdGhlcmUgYXJlIG5vdCBzdWNoIHJlc291cmNlcyB0byByZWxlYXNlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbGVhc2VJbk1lbW9yeUNvbXBvbmVudHMoKTsKIAotICAgIHB1YmxpYyBpbnQgZ2V0TWluSW5kZXhJbnRlcnZhbCgpCisgICAgLyoqCisgICAgICogUGVyZm9ybSBhbnkgdmFsaWRhdGlvbiBuZWVkZWQgZm9yIHRoZSByZWFkZXIgdXBvbiBjcmVhdGlvbiBiZWZvcmUgcmV0dXJuaW5nIGl0IGZyb20gdGhlIHtAbGluayBCdWlsZGVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpCiAgICAgewotICAgICAgICByZXR1cm4gaW5kZXhTdW1tYXJ5LmdldE1pbkluZGV4SW50ZXJ2YWwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZG91YmxlIGdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZGV4U3VtbWFyeS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZVN1bW1hcnkoKQotICAgIHsKLSAgICAgICAgdGlkeS5yZWxlYXNlU3VtbWFyeSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpCi0gICAgewotICAgICAgICBpZiAodGhpcy5maXJzdC5jb21wYXJlVG8odGhpcy5sYXN0KSA+IDApCisgICAgICAgIGlmICh0aGlzLmZpcnN0LmNvbXBhcmVUbyh0aGlzLmxhc3QpID4gMCB8fCBib3VuZHMgPT0gbnVsbCkKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiU1NUYWJsZSBmaXJzdCBrZXkgJXMgPiBsYXN0IGtleSAlcyIsIHRoaXMuZmlyc3QsIHRoaXMubGFzdCkpLCBnZXRGaWxlbmFtZSgpKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldHMgdGhlIHBvc2l0aW9uIGluIHRoZSBpbmRleCBmaWxlIHRvIHN0YXJ0IHNjYW5uaW5nIHRvIGZpbmQgdGhlIGdpdmVuIGtleSAoYXQgbW9zdCBpbmRleEludGVydmFsIGtleXMgYXdheSwKLSAgICAgKiBtb2R1bG8gZG93bnNhbXBsaW5nIG9mIHRoZSBpbmRleCBzdW1tYXJ5KS4gQWx3YXlzIHJldHVybnMgYSB7QGNvZGUgdmFsdWUgPj0gMH0KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRJbmRleFNjYW5Qb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbiBrZXkpCi0gICAgewotICAgICAgICBpZiAob3BlblJlYXNvbiA9PSBPcGVuUmVhc29uLk1PVkVEX1NUQVJUICYmIGtleS5jb21wYXJlVG8oZmlyc3QpIDwgMCkKLSAgICAgICAgICAgIGtleSA9IGZpcnN0OwotCi0gICAgICAgIHJldHVybiBnZXRJbmRleFNjYW5Qb3NpdGlvbkZyb21CaW5hcnlTZWFyY2hSZXN1bHQoaW5kZXhTdW1tYXJ5LmJpbmFyeVNlYXJjaChrZXkpLCBpbmRleFN1bW1hcnkpOwotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRJbmRleFNjYW5Qb3NpdGlvbkZyb21CaW5hcnlTZWFyY2hSZXN1bHQoaW50IGJpbmFyeVNlYXJjaFJlc3VsdCwgSW5kZXhTdW1tYXJ5IHJlZmVyZW5jZWRJbmRleFN1bW1hcnkpCi0gICAgewotICAgICAgICBpZiAoYmluYXJ5U2VhcmNoUmVzdWx0ID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2VkSW5kZXhTdW1tYXJ5LmdldFBvc2l0aW9uKGdldEluZGV4U3VtbWFyeUluZGV4RnJvbUJpbmFyeVNlYXJjaFJlc3VsdChiaW5hcnlTZWFyY2hSZXN1bHQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXRJbmRleFN1bW1hcnlJbmRleEZyb21CaW5hcnlTZWFyY2hSZXN1bHQoaW50IGJpbmFyeVNlYXJjaFJlc3VsdCkKLSAgICB7Ci0gICAgICAgIGlmIChiaW5hcnlTZWFyY2hSZXN1bHQgPCAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBiaW5hcnkgc2VhcmNoIGdpdmVzIHVzIHRoZSBmaXJzdCBpbmRleCBfZ3JlYXRlcl8gdGhhbiB0aGUga2V5IHNlYXJjaGVkIGZvciwKLSAgICAgICAgICAgIC8vIGkuZS4sIGl0cyBpbnNlcnRpb24gcG9zaXRpb24KLSAgICAgICAgICAgIGludCBncmVhdGVyVGhhbiA9IChiaW5hcnlTZWFyY2hSZXN1bHQgKyAxKSAqIC0xOwotICAgICAgICAgICAgaWYgKGdyZWF0ZXJUaGFuID09IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgcmV0dXJuIGdyZWF0ZXJUaGFuIC0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiaW5hcnlTZWFyY2hSZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb21wcmVzc2lvbiBtZXRhZGF0YSBmb3IgdGhpcyBzc3RhYmxlLgorICAgICAqIFJldHVybnMgdGhlIGNvbXByZXNzaW9uIG1ldGFkYXRhIGZvciB0aGlzIHNzdGFibGUuIE5vdGUgdGhhdCB0aGUgY29tcHJlc3Npb24gbWV0ZGF0YSBpcyBhIHJlc291cmNlIGFuZCBzaG91bGQgbm90CisgICAgICogYmUgY2xvc2VkIGJ5IHRoZSBjYWxsZXIuCisgICAgICogVE9ETyBkbyBub3QgcmV0dXJuIGEgY2xvc2VhYmxlIHJlc291cmNlIG9yIHJldHVybiBhIHNoYXJlZCBjb3B5CisgICAgICoKICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgc3N0YWJsZSBpcyBub3QgY29tcHJlc3NlZAogICAgICAqLwogICAgIHB1YmxpYyBDb21wcmVzc2lvbk1ldGFkYXRhIGdldENvbXByZXNzaW9uTWV0YWRhdGEoKQpAQCAtMTEyMiw2ICs2ODQsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgYW1vdW50IG9mIG1lbW9yeSBpbiBieXRlcyB1c2VkIG9mZiBoZWFwIGJ5IHRoZSBjb21wcmVzc2lvbiBtZXRhLWRhdGEuCisgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5IGluIGJ5dGVzIHVzZWQgb2ZmIGhlYXAgYnkgdGhlIGNvbXByZXNzaW9uIG1ldGEtZGF0YQogICAgICAqLwogICAgIHB1YmxpYyBsb25nIGdldENvbXByZXNzaW9uTWV0YWRhdGFPZmZIZWFwU2l6ZSgpCkBAIC0xMTMyLDE2NiArNjk1LDMwIEBACiAgICAgICAgIHJldHVybiBnZXRDb21wcmVzc2lvbk1ldGFkYXRhKCkub2ZmSGVhcFNpemUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgSUZpbHRlciBnZXRCbG9vbUZpbHRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gYmY7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0Qmxvb21GaWx0ZXJTZXJpYWxpemVkU2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gYmYuc2VyaWFsaXplZFNpemUoKTsKLSAgICB9CisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlcyBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGtleXMgaW4gdGhlIHNzdGFibGUgcmVwcmVzZW50ZWQgYnkgdGhpcyByZWFkZXIuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGxvbmcgZXN0aW1hdGVkS2V5cygpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYW1vdW50IG9mIG1lbW9yeSBpbiBieXRlcyB1c2VkIG9mZiBoZWFwIGJ5IHRoZSBibG9vbSBmaWx0ZXIuCi0gICAgICogQHJldHVybiB0aGUgYW1vdW50IG9mIG1lbW9yeSBpbiBieXRlcyB1c2VkIG9mZiBoZWFwIGJ5IHRoZSBibG9vbSBmaWx0ZXIKKyAgICAgKiBDYWxjdWxhdGVzIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2Yga2V5cyBmb3IgdGhlIGdpdmVuIHJhbmdlcyBpbiB0aGUgc3N0YWJsZSByZXByZXNlbnRlZCBieSB0aGlzIHJlYWRlci4KICAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRCbG9vbUZpbHRlck9mZkhlYXBTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiZi5vZmZIZWFwU2l6ZSgpOwotICAgIH0KKyAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyBlc3RpbWF0ZWRLZXlzRm9yUmFuZ2VzKENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiByYW5nZXMpOwogCiAgICAgLyoqCi0gICAgICogQHJldHVybiBBbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGtleXMgaW4gdGhpcyBTU1RhYmxlIGJhc2VkIG9uIHRoZSBpbmRleCBzdW1tYXJ5LgorICAgICAqIFJldHVybnMgd2hldGhlciBtZXRob2RzIGxpa2Uge0BsaW5rICNlc3RpbWF0ZWRLZXlzKCl9IG9yIHtAbGluayAjZXN0aW1hdGVkS2V5c0ZvclJhbmdlcyhDb2xsZWN0aW9uKX0gY2FuIHJldHVybgorICAgICAqIHNlbnNpYmxlIGVzdGltYXRpb25zLgogICAgICAqLwotICAgIHB1YmxpYyBsb25nIGVzdGltYXRlZEtleXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZGV4U3VtbWFyeS5nZXRFc3RpbWF0ZWRLZXlDb3VudCgpOwotICAgIH0KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0VzdGltYXRpb25JbmZvcm1hdGl2ZSgpOwogCiAgICAgLyoqCi0gICAgICogQHBhcmFtIHJhbmdlcwotICAgICAqIEByZXR1cm4gQW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBrZXlzIGZvciBnaXZlbiByYW5nZXMgaW4gdGhpcyBTU1RhYmxlLgorICAgICAqIFJldHVybnMgc2FtcGxlIGtleXMgZm9yIHRoZSBwcm92aWRlZCB0b2tlbiByYW5nZS4KICAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBlc3RpbWF0ZWRLZXlzRm9yUmFuZ2VzKENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiByYW5nZXMpCi0gICAgewotICAgICAgICBsb25nIHNhbXBsZUtleUNvdW50ID0gMDsKLSAgICAgICAgTGlzdDxJbmRleGVzQm91bmRzPiBzYW1wbGVJbmRleGVzID0gZ2V0U2FtcGxlSW5kZXhlc0ZvclJhbmdlcyhpbmRleFN1bW1hcnksIHJhbmdlcyk7Ci0gICAgICAgIGZvciAoSW5kZXhlc0JvdW5kcyBzYW1wbGVJbmRleFJhbmdlIDogc2FtcGxlSW5kZXhlcykKLSAgICAgICAgICAgIHNhbXBsZUtleUNvdW50ICs9IChzYW1wbGVJbmRleFJhbmdlLnVwcGVyUG9zaXRpb24gLSBzYW1wbGVJbmRleFJhbmdlLmxvd2VyUG9zaXRpb24gKyAxKTsKLQotICAgICAgICAvLyBhZGp1c3QgZm9yIHRoZSBjdXJyZW50IHNhbXBsaW5nIGxldmVsOiAoQlNMIC8gU0wpICogaW5kZXhfaW50ZXJ2YWxfYXRfZnVsbF9zYW1wbGluZwotICAgICAgICBsb25nIGVzdGltYXRlZEtleXMgPSBzYW1wbGVLZXlDb3VudCAqICgobG9uZykgRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUwgKiBpbmRleFN1bW1hcnkuZ2V0TWluSW5kZXhJbnRlcnZhbCgpKSAvIGluZGV4U3VtbWFyeS5nZXRTYW1wbGluZ0xldmVsKCk7Ci0gICAgICAgIHJldHVybiBNYXRoLm1heCgxLCBlc3RpbWF0ZWRLZXlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgSW5kZXhTdW1tYXJ5LiAgQXQgZnVsbCBzYW1wbGluZywgdGhpcyBpcyBhcHByb3hpbWF0ZWx5IDEvSU5ERVhfSU5URVJWQUx0aCBvZgotICAgICAqIHRoZSBrZXlzIGluIHRoaXMgU1NUYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEluZGV4U3VtbWFyeVNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZGV4U3VtbWFyeS5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgbnVtYmVyIG9mIGVudHJpZXMgdGhlIEluZGV4U3VtbWFyeSB3b3VsZCBjb250YWluIGlmIGl0IHdlcmUgYXQgZnVsbCBzYW1wbGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1heEluZGV4U3VtbWFyeVNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZGV4U3VtbWFyeS5nZXRNYXhOdW1iZXJPZkVudHJpZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoZSBpbmRleCBzdW1tYXJ5IGVudHJ5IGF0IGBpbmRleGAuCi0gICAgICovCi0gICAgcHVibGljIGJ5dGVbXSBnZXRJbmRleFN1bW1hcnlLZXkoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluZGV4U3VtbWFyeS5nZXRLZXkoaW5kZXgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8SW5kZXhlc0JvdW5kcz4gZ2V0U2FtcGxlSW5kZXhlc0ZvclJhbmdlcyhJbmRleFN1bW1hcnkgc3VtbWFyeSwgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+IHJhbmdlcykKLSAgICB7Ci0gICAgICAgIC8vIHVzZSB0aGUgaW5kZXggdG8gZGV0ZXJtaW5lIGEgbWluaW1hbCBzZWN0aW9uIGZvciBlYWNoIHJhbmdlCi0gICAgICAgIExpc3Q8SW5kZXhlc0JvdW5kcz4gcG9zaXRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAgICAgZm9yIChSYW5nZTxUb2tlbj4gcmFuZ2UgOiBSYW5nZS5ub3JtYWxpemUocmFuZ2VzKSkKLSAgICAgICAgewotICAgICAgICAgICAgUGFydGl0aW9uUG9zaXRpb24gbGVmdFBvc2l0aW9uID0gcmFuZ2UubGVmdC5tYXhLZXlCb3VuZCgpOwotICAgICAgICAgICAgUGFydGl0aW9uUG9zaXRpb24gcmlnaHRQb3NpdGlvbiA9IHJhbmdlLnJpZ2h0Lm1heEtleUJvdW5kKCk7Ci0KLSAgICAgICAgICAgIGludCBsZWZ0ID0gc3VtbWFyeS5iaW5hcnlTZWFyY2gobGVmdFBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmIChsZWZ0IDwgMCkKLSAgICAgICAgICAgICAgICBsZWZ0ID0gKGxlZnQgKyAxKSAqIC0xOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIC8vIGxlZnQgcmFuZ2UgYXJlIHN0YXJ0IGV4Y2x1c2l2ZQotICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0ICsgMTsKLSAgICAgICAgICAgIGlmIChsZWZ0ID09IHN1bW1hcnkuc2l6ZSgpKQotICAgICAgICAgICAgICAgIC8vIGxlZnQgaXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBzYW1wbGluZwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBpbnQgcmlnaHQgPSBSYW5nZS5pc1dyYXBBcm91bmQocmFuZ2UubGVmdCwgcmFuZ2UucmlnaHQpCi0gICAgICAgICAgICAgICAgICAgID8gc3VtbWFyeS5zaXplKCkgLSAxCi0gICAgICAgICAgICAgICAgICAgIDogc3VtbWFyeS5iaW5hcnlTZWFyY2gocmlnaHRQb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAocmlnaHQgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHJhbmdlIGFyZSBlbmQgaW5jbHVzaXZlIHNvIHdlIHVzZSB0aGUgcHJldmlvdXMgaW5kZXggZnJvbSB3aGF0IGJpbmFyeVNlYXJjaCBnaXZlIHVzCi0gICAgICAgICAgICAgICAgLy8gc2luY2UgdGhhdCB3aWxsIGJlIHRoZSBsYXN0IGluZGV4IHdlIHdpbGwgcmV0dXJuCi0gICAgICAgICAgICAgICAgcmlnaHQgPSAocmlnaHQgKyAxKSAqIC0xOwotICAgICAgICAgICAgICAgIGlmIChyaWdodCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAvLyBNZWFucyB0aGUgZmlyc3Qga2V5IGlzIGFscmVhZHkgc3RyaWNseSBncmVhdGVyIHRoYXQgdGhlIHJpZ2h0IGJvdW5kCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIHJpZ2h0LS07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChsZWZ0ID4gcmlnaHQpCi0gICAgICAgICAgICAgICAgLy8gZW1wdHkgcmFuZ2UKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHBvc2l0aW9ucy5hZGQobmV3IEluZGV4ZXNCb3VuZHMobGVmdCwgcmlnaHQpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcG9zaXRpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBJdGVyYWJsZTxEZWNvcmF0ZWRLZXk+IGdldEtleVNhbXBsZXMoZmluYWwgUmFuZ2U8VG9rZW4+IHJhbmdlKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdDxJbmRleGVzQm91bmRzPiBpbmRleFJhbmdlcyA9IGdldFNhbXBsZUluZGV4ZXNGb3JSYW5nZXMoaW5kZXhTdW1tYXJ5LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJhbmdlKSk7Ci0KLSAgICAgICAgaWYgKGluZGV4UmFuZ2VzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlPERlY29yYXRlZEtleT4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8RGVjb3JhdGVkS2V5PiBpdGVyYXRvcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcjxEZWNvcmF0ZWRLZXk+KCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8SW5kZXhlc0JvdW5kcz4gcmFuZ2VJdGVyID0gaW5kZXhSYW5nZXMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBJbmRleGVzQm91bmRzIGN1cnJlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHByaXZhdGUgaW50IGlkeDsKLQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCB8fCBpZHggPiBjdXJyZW50LnVwcGVyUG9zaXRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlSXRlci5oYXNOZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gcmFuZ2VJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gY3VycmVudC5sb3dlclBvc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgbmV4dCgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGluZGV4U3VtbWFyeS5nZXRLZXkoaWR4KyspOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRlS2V5KEJ5dGVCdWZmZXIud3JhcChieXRlcykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KKyAgICBwdWJsaWMgYWJzdHJhY3QgSXRlcmFibGU8RGVjb3JhdGVkS2V5PiBnZXRLZXlTYW1wbGVzKGZpbmFsIFJhbmdlPFRva2VuPiByYW5nZSk7CiAKICAgICAvKioKICAgICAgKiBEZXRlcm1pbmUgdGhlIG1pbmltYWwgc2V0IG9mIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIHRoaXMgU1NUYWJsZSB0byBjb3ZlciB0aGUgZ2l2ZW4gcmFuZ2VzLgorICAgICAqCiAgICAgICogQHJldHVybiBBIHNvcnRlZCBsaXN0IG9mIChvZmZzZXQsZW5kKSBwYWlycyB0aGF0IGNvdmVyIHRoZSBnaXZlbiByYW5nZXMgaW4gdGhlIGRhdGFmaWxlIGZvciB0aGlzIFNTVGFibGUuCiAgICAgICovCiAgICAgcHVibGljIExpc3Q8UGFydGl0aW9uUG9zaXRpb25Cb3VuZHM+IGdldFBvc2l0aW9uc0ZvclJhbmdlcyhDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gcmFuZ2VzKQpAQCAtMTMwOSwxMCArNzM2LDEwIEBACiAgICAgICAgICAgICBpZiAobGVmdEJvdW5kLmNvbXBhcmVUbyhsYXN0KSA+IDAgfHwgcmlnaHRCb3VuZC5jb21wYXJlVG8oZmlyc3QpIDwgMCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgbG9uZyBsZWZ0ID0gZ2V0UG9zaXRpb24obGVmdEJvdW5kLCBPcGVyYXRvci5HVCkucG9zaXRpb247CisgICAgICAgICAgICBsb25nIGxlZnQgPSBnZXRQb3NpdGlvbihsZWZ0Qm91bmQsIE9wZXJhdG9yLkdUKTsKICAgICAgICAgICAgIGxvbmcgcmlnaHQgPSAocmlnaHRCb3VuZC5jb21wYXJlVG8obGFzdCkgPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgID8gdW5jb21wcmVzc2VkTGVuZ3RoKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldFBvc2l0aW9uKHJpZ2h0Qm91bmQsIE9wZXJhdG9yLkdUKS5wb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldFBvc2l0aW9uKHJpZ2h0Qm91bmQsIE9wZXJhdG9yLkdUKTsKIAogICAgICAgICAgICAgaWYgKGxlZnQgPT0gcmlnaHQpCiAgICAgICAgICAgICAgICAgLy8gZW1wdHkgcmFuZ2UKQEAgLTEzMjQsMTQ2ICs3NTEsOTEgQEAKICAgICAgICAgcmV0dXJuIHBvc2l0aW9uczsKICAgICB9CiAKLSAgICBwdWJsaWMgS2V5Q2FjaGVLZXkgZ2V0Q2FjaGVLZXkoRGVjb3JhdGVkS2V5IGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgS2V5Q2FjaGVLZXkobWV0YWRhdGEoKSwgZGVzY3JpcHRvciwga2V5LmdldEtleSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjYWNoZUtleShEZWNvcmF0ZWRLZXkga2V5LCBSb3dJbmRleEVudHJ5IGluZm8pCi0gICAgewotICAgICAgICBDYWNoaW5nUGFyYW1zIGNhY2hpbmcgPSBtZXRhZGF0YSgpLnBhcmFtcy5jYWNoaW5nOwotCi0gICAgICAgIGlmICghY2FjaGluZy5jYWNoZUtleXMoKSB8fCBrZXlDYWNoZSA9PSBudWxsIHx8IGtleUNhY2hlLmdldENhcGFjaXR5KCkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBLZXlDYWNoZUtleSBjYWNoZUtleSA9IG5ldyBLZXlDYWNoZUtleShtZXRhZGF0YSgpLCBkZXNjcmlwdG9yLCBrZXkuZ2V0S2V5KCkpOwotICAgICAgICBsb2dnZXIudHJhY2UoIkFkZGluZyBjYWNoZSBlbnRyeSBmb3Ige30gLT4ge30iLCBjYWNoZUtleSwgaW5mbyk7Ci0gICAgICAgIGtleUNhY2hlLnB1dChjYWNoZUtleSwgaW5mbyk7Ci0gICAgfQotCi0gICAgcHVibGljIFJvd0luZGV4RW50cnkgZ2V0Q2FjaGVkUG9zaXRpb24oRGVjb3JhdGVkS2V5IGtleSwgYm9vbGVhbiB1cGRhdGVTdGF0cykKLSAgICB7Ci0gICAgICAgIGlmIChpc0tleUNhY2hlRW5hYmxlZCgpKQotICAgICAgICAgICAgcmV0dXJuIGdldENhY2hlZFBvc2l0aW9uKG5ldyBLZXlDYWNoZUtleShtZXRhZGF0YSgpLCBkZXNjcmlwdG9yLCBrZXkuZ2V0S2V5KCkpLCB1cGRhdGVTdGF0cyk7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBSb3dJbmRleEVudHJ5IGdldENhY2hlZFBvc2l0aW9uKEtleUNhY2hlS2V5IHVuaWZpZWRLZXksIGJvb2xlYW4gdXBkYXRlU3RhdHMpCi0gICAgewotICAgICAgICBpZiAoaXNLZXlDYWNoZUVuYWJsZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHVwZGF0ZVN0YXRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkgY2FjaGVkRW50cnkgPSBrZXlDYWNoZS5nZXQodW5pZmllZEtleSk7Ci0gICAgICAgICAgICAgICAga2V5Q2FjaGVSZXF1ZXN0LmluY3JlbWVudEFuZEdldCgpOwotICAgICAgICAgICAgICAgIGlmIChjYWNoZWRFbnRyeSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga2V5Q2FjaGVIaXQuaW5jcmVtZW50QW5kR2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJsb29tRmlsdGVyVHJhY2tlci5hZGRUcnVlUG9zaXRpdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEVudHJ5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBrZXlDYWNoZS5nZXRJbnRlcm5hbCh1bmlmaWVkS2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0tleUNhY2hlRW5hYmxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5Q2FjaGUgIT0gbnVsbCAmJiBtZXRhZGF0YSgpLnBhcmFtcy5jYWNoaW5nLmNhY2hlS2V5cygpOwotICAgIH0KLQogICAgIC8qKgogICAgICAqIFJldHJpZXZlcyB0aGUgcG9zaXRpb24gd2hpbGUgdXBkYXRpbmcgdGhlIGtleSBjYWNoZSBhbmQgdGhlIHN0YXRzLgorICAgICAqCiAgICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGFwcGx5IGFzIHRoZSByaHMgdG8gdGhlIGdpdmVuIE9wZXJhdG9yLiBBICdmYWtlJyBrZXkgaXMgYWxsb3dlZCB0bwotICAgICAqIGFsbG93IGtleSBzZWxlY3Rpb24gYnkgdG9rZW4gYm91bmRzIGJ1dCBvbmx5IGlmIG9wICE9ICogRVEKLSAgICAgKiBAcGFyYW0gb3AgVGhlIE9wZXJhdG9yIGRlZmluaW5nIG1hdGNoaW5nIGtleXM6IHRoZSBuZWFyZXN0IGtleSB0byB0aGUgdGFyZ2V0IG1hdGNoaW5nIHRoZSBvcGVyYXRvciB3aW5zLgorICAgICAqICAgICAgICAgICAgYWxsb3cga2V5IHNlbGVjdGlvbiBieSB0b2tlbiBib3VuZHMgYnV0IG9ubHkgaWYgb3AgIT0gKiBFUQorICAgICAqIEBwYXJhbSBvcCAgVGhlIE9wZXJhdG9yIGRlZmluaW5nIG1hdGNoaW5nIGtleXM6IHRoZSBuZWFyZXN0IGtleSB0byB0aGUgdGFyZ2V0IG1hdGNoaW5nIHRoZSBvcGVyYXRvciB3aW5zLgogICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBSb3dJbmRleEVudHJ5IGdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uIGtleSwgT3BlcmF0b3Igb3ApCisgICAgcHVibGljIGZpbmFsIGxvbmcgZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24ga2V5LCBPcGVyYXRvciBvcCkKICAgICB7CiAgICAgICAgIHJldHVybiBnZXRQb3NpdGlvbihrZXksIG9wLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5OT09QX0xJU1RFTkVSKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIHBvc2l0aW9uIHdoaWxlIHVwZGF0aW5nIHRoZSBrZXkgY2FjaGUgYW5kIHRoZSBzdGF0cy4KLSAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gYXBwbHkgYXMgdGhlIHJocyB0byB0aGUgZ2l2ZW4gT3BlcmF0b3IuIEEgJ2Zha2UnIGtleSBpcyBhbGxvd2VkIHRvCi0gICAgICogYWxsb3cga2V5IHNlbGVjdGlvbiBieSB0b2tlbiBib3VuZHMgYnV0IG9ubHkgaWYgb3AgIT0gKiBFUQotICAgICAqIEBwYXJhbSBvcCBUaGUgT3BlcmF0b3IgZGVmaW5pbmcgbWF0Y2hpbmcga2V5czogdGhlIG5lYXJlc3Qga2V5IHRvIHRoZSB0YXJnZXQgbWF0Y2hpbmcgdGhlIG9wZXJhdG9yIHdpbnMuCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSB7QGNvZGUgU1NUYWJsZVJlYWRlckxpc3RlbmVyfSB0aGF0IG11c3QgaGFuZGxlIHRoZSBub3RpZmljYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBSb3dJbmRleEVudHJ5IGdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uIGtleSwgT3BlcmF0b3Igb3AsIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQorICAgIHB1YmxpYyBmaW5hbCBsb25nIGdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uIGtleSwgT3BlcmF0b3Igb3AsIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFBvc2l0aW9uKGtleSwgb3AsIHRydWUsIGZhbHNlLCBsaXN0ZW5lcik7CisgICAgICAgIHJldHVybiBnZXRQb3NpdGlvbihrZXksIG9wLCB0cnVlLCBsaXN0ZW5lcik7CiAgICAgfQogCi0gICAgcHVibGljIGZpbmFsIFJvd0luZGV4RW50cnkgZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24ga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRlQ2FjaGVBbmRTdGF0cykKKyAgICBwdWJsaWMgZmluYWwgbG9uZyBnZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3Igb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1cGRhdGVTdGF0cykKICAgICB7Ci0gICAgICAgIHJldHVybiBnZXRQb3NpdGlvbihrZXksIG9wLCB1cGRhdGVDYWNoZUFuZFN0YXRzLCBmYWxzZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuTk9PUF9MSVNURU5FUik7CisgICAgICAgIHJldHVybiBnZXRQb3NpdGlvbihrZXksIG9wLCB1cGRhdGVTdGF0cywgU1NUYWJsZVJlYWRzTGlzdGVuZXIuTk9PUF9MSVNURU5FUik7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGFwcGx5IGFzIHRoZSByaHMgdG8gdGhlIGdpdmVuIE9wZXJhdG9yLiBBICdmYWtlJyBrZXkgaXMgYWxsb3dlZCB0bwotICAgICAqIGFsbG93IGtleSBzZWxlY3Rpb24gYnkgdG9rZW4gYm91bmRzIGJ1dCBvbmx5IGlmIG9wICE9ICogRVEKLSAgICAgKiBAcGFyYW0gb3AgVGhlIE9wZXJhdG9yIGRlZmluaW5nIG1hdGNoaW5nIGtleXM6IHRoZSBuZWFyZXN0IGtleSB0byB0aGUgdGFyZ2V0IG1hdGNoaW5nIHRoZSBvcGVyYXRvciB3aW5zLgotICAgICAqIEBwYXJhbSB1cGRhdGVDYWNoZUFuZFN0YXRzIHRydWUgaWYgdXBkYXRpbmcgc3RhdHMgYW5kIGNhY2hlCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIGEgbGlzdGVuZXIgdXNlZCB0byBoYW5kbGUgaW50ZXJuYWwgZXZlbnRzCisgICAgICogUmV0cmlldmUgYSBwb3NpdGlvbiBpbiBkYXRhIGZpbGUgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBrZXkgYW5kIG9wZXJhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSAgICAgICAgIFRoZSBrZXkgdG8gYXBwbHkgYXMgdGhlIHJocyB0byB0aGUgZ2l2ZW4gT3BlcmF0b3IuIEEgJ2Zha2UnIGtleSBpcyBhbGxvd2VkIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgIGFsbG93IGtleSBzZWxlY3Rpb24gYnkgdG9rZW4gYm91bmRzIGJ1dCBvbmx5IGlmIG9wICE9ICogRVEKKyAgICAgKiBAcGFyYW0gb3AgICAgICAgICAgVGhlIE9wZXJhdG9yIGRlZmluaW5nIG1hdGNoaW5nIGtleXM6IHRoZSBuZWFyZXN0IGtleSB0byB0aGUgdGFyZ2V0IG1hdGNoaW5nIHRoZSBvcGVyYXRvciB3aW5zLgorICAgICAqIEBwYXJhbSB1cGRhdGVTdGF0cyB0cnVlIGlmIHVwZGF0aW5nIHN0YXRzIGFuZCBjYWNoZQorICAgICAqIEBwYXJhbSBsaXN0ZW5lciAgICBhIGxpc3RlbmVyIHVzZWQgdG8gaGFuZGxlIGludGVybmFsIGV2ZW50cwogICAgICAqIEByZXR1cm4gVGhlIGluZGV4IGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtleSwgb3IgbnVsbCBpZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50CiAgICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFJvd0luZGV4RW50cnkgZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24ga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRlQ2FjaGVBbmRTdGF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBlcm1pdE1hdGNoUGFzdExhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpOworICAgIHByb3RlY3RlZCBsb25nIGdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRvciBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHVwZGF0ZVN0YXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQorICAgIHsKKyAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IHJpZSA9IGdldFJvd0luZGV4RW50cnkoa2V5LCBvcCwgdXBkYXRlU3RhdHMsIGxpc3RlbmVyKTsKKyAgICAgICAgcmV0dXJuIHJpZSAhPSBudWxsID8gcmllLnBvc2l0aW9uIDogLTE7CisgICAgfQogCi0gICAgcHVibGljIGFic3RyYWN0IFVuZmlsdGVyZWRSb3dJdGVyYXRvciByb3dJdGVyYXRvcihGaWxlRGF0YUlucHV0IGZpbGUsIERlY29yYXRlZEtleSBrZXksIFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwgU2xpY2VzIHNsaWNlcywgQ29sdW1uRmlsdGVyIHNlbGVjdGVkQ29sdW1ucywgYm9vbGVhbiByZXZlcnNlZCk7CisgICAgLyoqCisgICAgICogUmV0cmlldmUgYW4gaW5kZXggZW50cnkgZm9yIHRoZSBwYXJ0aXRpb24gZm91bmQgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBrZXkgYW5kIG9wZXJhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSAgICAgICAgIFRoZSBrZXkgdG8gYXBwbHkgYXMgdGhlIHJocyB0byB0aGUgZ2l2ZW4gT3BlcmF0b3IuIEEgJ2Zha2UnIGtleSBpcyBhbGxvd2VkIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgIGFsbG93IGtleSBzZWxlY3Rpb24gYnkgdG9rZW4gYm91bmRzIGJ1dCBvbmx5IGlmIG9wICE9ICogRVEKKyAgICAgKiBAcGFyYW0gb3AgICAgICAgICAgVGhlIE9wZXJhdG9yIGRlZmluaW5nIG1hdGNoaW5nIGtleXM6IHRoZSBuZWFyZXN0IGtleSB0byB0aGUgdGFyZ2V0IG1hdGNoaW5nIHRoZSBvcGVyYXRvciB3aW5zLgorICAgICAqIEBwYXJhbSB1cGRhdGVTdGF0cyB0cnVlIGlmIHVwZGF0aW5nIHN0YXRzIGFuZCBjYWNoZQorICAgICAqIEBwYXJhbSBsaXN0ZW5lciAgICBhIGxpc3RlbmVyIHVzZWQgdG8gaGFuZGxlIGludGVybmFsIGV2ZW50cworICAgICAqIEByZXR1cm4gVGhlIGluZGV4IGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtleSwgb3IgbnVsbCBpZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50CisgICAgICovCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0Um93SW5kZXhFbnRyeSBnZXRSb3dJbmRleEVudHJ5KFBhcnRpdGlvblBvc2l0aW9uIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3Igb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRlU3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKTsKIAotICAgIHB1YmxpYyBhYnN0cmFjdCBVbmZpbHRlcmVkUm93SXRlcmF0b3Igc2ltcGxlSXRlcmF0b3IoRmlsZURhdGFJbnB1dCBmaWxlLCBEZWNvcmF0ZWRLZXkga2V5LCBSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIGJvb2xlYW4gdG9tYnN0b25lT25seSk7CisgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBzaW1wbGVJdGVyYXRvcihGaWxlRGF0YUlucHV0IGZpbGUsIERlY29yYXRlZEtleSBrZXksIGxvbmcgZGF0YVBvc2l0aW9uLCBib29sZWFuIHRvbWJzdG9uZU9ubHkpCisgICAgeworICAgICAgICByZXR1cm4gU1NUYWJsZUlkZW50aXR5SXRlcmF0b3IuY3JlYXRlKHRoaXMsIGZpbGUsIGRhdGFQb3NpdGlvbiwga2V5LCB0b21ic3RvbmVPbmx5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIEtleVJlYWRlcn0gb3ZlciBhbGwga2V5cyBpbiB0aGUgc3N0YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgS2V5UmVhZGVyIGtleVJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgS2V5SXRlcmF0b3J9IG92ZXIgYWxsIGtleXMgaW4gdGhlIHNzdGFibGUuCisgICAgICovCisgICAgcHVibGljIEtleUl0ZXJhdG9yIGtleUl0ZXJhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEtleUl0ZXJhdG9yKGtleVJlYWRlcigpLCBnZXRQYXJ0aXRpb25lcigpLCB1bmNvbXByZXNzZWRMZW5ndGgoKSwgbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKSk7CisgICAgfQogCiAgICAgLyoqCiAgICAgICogRmluZHMgYW5kIHJldHVybnMgdGhlIGZpcnN0IGtleSBiZXlvbmQgYSBnaXZlbiB0b2tlbiBpbiB0aGlzIFNTVGFibGUgb3IgbnVsbCBpZiBubyBzdWNoIGtleSBleGlzdHMuCiAgICAgICovCi0gICAgcHVibGljIERlY29yYXRlZEtleSBmaXJzdEtleUJleW9uZChQYXJ0aXRpb25Qb3NpdGlvbiB0b2tlbikKLSAgICB7Ci0gICAgICAgIGlmICh0b2tlbi5jb21wYXJlVG8oZmlyc3QpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBmaXJzdDsKLQotICAgICAgICBsb25nIHNhbXBsZWRQb3NpdGlvbiA9IGdldEluZGV4U2NhblBvc2l0aW9uKHRva2VuKTsKLQotICAgICAgICBpZiAoaWZpbGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsKLSAgICAgICAgdHJ5IChGaWxlRGF0YUlucHV0IGluID0gaWZpbGUuY3JlYXRlUmVhZGVyKHNhbXBsZWRQb3NpdGlvbikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhdGggPSBpbi5nZXRQYXRoKCk7Ci0gICAgICAgICAgICB3aGlsZSAoIWluLmlzRU9GKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbmRleEtleSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW4pOwotICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBpbmRleERlY29yYXRlZEtleSA9IGRlY29yYXRlS2V5KGluZGV4S2V5KTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXhEZWNvcmF0ZWRLZXkuY29tcGFyZVRvKHRva2VuKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleERlY29yYXRlZEtleTsKLQotICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkuU2VyaWFsaXplci5za2lwKGluLCBkZXNjcmlwdG9yLnZlcnNpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBtYXJrU3VzcGVjdCgpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIHBhdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQorICAgIHB1YmxpYyBhYnN0cmFjdCBEZWNvcmF0ZWRLZXkgZmlyc3RLZXlCZXlvbmQoUGFydGl0aW9uUG9zaXRpb24gdG9rZW4pOwogCiAgICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBkYXRhIGZvciB0aGlzIFNTVGFibGUuIEZvcgotICAgICAqIGNvbXByZXNzZWQgZmlsZXMsIHRoaXMgaXMgbm90IHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBvbiBkaXNrIHNpemUgKHNlZQotICAgICAqIG9uRGlza0xlbmd0aCgpKQorICAgICAqIFJldHVybnMgdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgKHVuY29tcHJlc3NlZCkgZGF0YSBmb3IgdGhpcyBTU1RhYmxlLiBGb3IgY29tcHJlc3NlZCBmaWxlcywgdGhpcyBpcyBub3QKKyAgICAgKiB0aGUgc2FtZSB0aGluZyBhcyB0aGUgb24gZGlzayBzaXplIChzZWUge0BsaW5rICNvbkRpc2tMZW5ndGgoKX0pLgogICAgICAqLwogICAgIHB1YmxpYyBsb25nIHVuY29tcHJlc3NlZExlbmd0aCgpCiAgICAgewpAQCAtMTQ3MSw5ICs4NDMsOCBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgb24gZGlzayBzaXplIGZvciB0aGlzIFNTVGFibGUuIEZvcgotICAgICAqIGNvbXByZXNzZWQgZmlsZXMsIHRoaXMgaXMgbm90IHRoZSBzYW1lIHRoaW5nIGFzIHRoZSBkYXRhIGxlbmd0aCAoc2VlCi0gICAgICogbGVuZ3RoKCkpCisgICAgICogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgb24gZGlzayBzaXplIGZvciB0aGlzIFNTVGFibGUuIEZvciBjb21wcmVzc2VkIGZpbGVzLCB0aGlzIGlzIG5vdCB0aGUgc2FtZSB0aGluZworICAgICAqIGFzIHRoZSBkYXRhIGxlbmd0aCAoc2VlIHtAbGluayAjdW5jb21wcmVzc2VkTGVuZ3RoKCl9KS4KICAgICAgKi8KICAgICBwdWJsaWMgbG9uZyBvbkRpc2tMZW5ndGgoKQogICAgIHsKQEAgLTE0ODcsMTAgKzg1OCw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSB2YWx1ZSBvZiBDUkMgY2hlY2sgY2hhbmNlLiBUaGUgYXJndW1lbnQgc3VwcGxpZWQgaXMgb2J0YWluZWQKLSAgICAgKiBmcm9tIHRoZSB0aGUgcHJvcGVydHkgb2YgdGhlIG93bmluZyBDRlMuIENhbGxlZCB3aGVuIGVpdGhlciB0aGUgU1NUUgotICAgICAqIGlzIGluaXRpYWxpemVkLCBvciB0aGUgQ0ZTJ3MgcHJvcGVydHkgaXMgdXBkYXRlZCB2aWEgSk1YCi0gICAgICogQHBhcmFtIGNyY0NoZWNrQ2hhbmNlCisgICAgICogU2V0IHRoZSB2YWx1ZSBvZiBDUkMgY2hlY2sgY2hhbmNlLiBUaGUgYXJndW1lbnQgc3VwcGxpZWQgaXMgb2J0YWluZWQgZnJvbSB0aGUgcHJvcGVydHkgb2YgdGhlIG93bmluZyBDRlMuCisgICAgICogQ2FsbGVkIHdoZW4gZWl0aGVyIHRoZSBTU1RSIGlzIGluaXRpYWxpemVkLCBvciB0aGUgQ0ZTJ3MgcHJvcGVydHkgaXMgdXBkYXRlZCB2aWEgSk1YCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgc2V0Q3JjQ2hlY2tDaGFuY2UoZG91YmxlIGNyY0NoZWNrQ2hhbmNlKQogICAgIHsKQEAgLTE1MDAsMTEgKzg2OSwxMSBAQAogCiAgICAgLyoqCiAgICAgICogTWFyayB0aGUgc3N0YWJsZSBhcyBvYnNvbGV0ZSwgaS5lLiwgY29tcGFjdGVkIGludG8gbmV3ZXIgc3N0YWJsZXMuCi0gICAgICoKLSAgICAgKiBXaGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgdGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBTU1RhYmxlUmVhZGVyIGlzIG5vdCByZWZlcmVuY2VkIGFueXdoZXJlCi0gICAgICogZXhjZXB0IGZvciB0aHJlYWRzIGhvbGRpbmcgYSByZWZlcmVuY2UuCi0gICAgICoKLSAgICAgKiBtdWx0aXBsZSB0aW1lcyBpcyB1c3VhbGx5IGJ1Z2d5IChzZWUgZXhjZXB0aW9ucyBpbiBUcmFja2VyLnVubWFya0NvbXBhY3RpbmcgYW5kIHJlbW92ZU9sZFNTVGFibGVzU2l6ZSkuCisgICAgICogPHA+CisgICAgICogV2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sIHRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGUgU1NUYWJsZVJlYWRlciBpcyBub3QgcmVmZXJlbmNlZCBhbnl3aGVyZSBleGNlcHQgZm9yCisgICAgICogdGhyZWFkcyBob2xkaW5nIGEgcmVmZXJlbmNlLgorICAgICAqIDxwPgorICAgICAqIENhbGxpbmcgaXQgbXVsdGlwbGUgdGltZXMgaXMgdXN1YWxseSBidWdneS4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBtYXJrT2Jzb2xldGUoUnVubmFibGUgdGlkaWVyKQogICAgIHsKQEAgLTE1MTQsNyArODgzLDcgQEAKICAgICAgICAgc3luY2hyb25pemVkICh0aWR5Lmdsb2JhbCkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0ICF0aWR5LmlzUmVwbGFjZWQ7Ci0gICAgICAgICAgICBhc3NlcnQgdGlkeS5nbG9iYWwub2Jzb2xldGlvbiA9PSBudWxsOiB0aGlzICsgIiB3YXMgYWxyZWFkeSBtYXJrZWQgY29tcGFjdGVkIjsKKyAgICAgICAgICAgIGFzc2VydCB0aWR5Lmdsb2JhbC5vYnNvbGV0aW9uID09IG51bGwgOiB0aGlzICsgIiB3YXMgYWxyZWFkeSBtYXJrZWQgY29tcGFjdGVkIjsKIAogICAgICAgICAgICAgdGlkeS5nbG9iYWwub2Jzb2xldGlvbiA9IHRpZGllcjsKICAgICAgICAgICAgIHRpZHkuZ2xvYmFsLnN0b3BSZWFkTWV0ZXJQZXJzaXN0ZW5jZSgpOwpAQCAtMTU4MSwyMCArOTUwLDI3IEBACiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IElTU1RhYmxlU2Nhbm5lciBnZXRTY2FubmVyKEl0ZXJhdG9yPEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPj4gcmFuZ2VJdGVyYXRvcik7CiAKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgRmlsZURhdGFJbnB1dH0gZm9yIHRoZSBkYXRhIGZpbGUgb2YgdGhlIHNzdGFibGUgcmVwcmVzZW50ZWQgYnkgdGhpcyByZWFkZXIuIFRoaXMgbWV0aG9kIHJldHVybnMKKyAgICAgKiBhIG5ld2x5IG9wZW5lZCByZXNvdXJjZSB3aGljaCBtdXN0IGJlIGNsb3NlZCBieSB0aGUgY2FsbGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHBvc2l0aW9uIHRoZSBkYXRhIGlucHV0IHdpbGwgYmUgb3BlbmVkIGFuZCBzZWVrIHRvIHRoaXMgcG9zaXRpb24KKyAgICAgKi8KICAgICBwdWJsaWMgRmlsZURhdGFJbnB1dCBnZXRGaWxlRGF0YUlucHV0KGxvbmcgcG9zaXRpb24pCiAgICAgewogICAgICAgICByZXR1cm4gZGZpbGUuY3JlYXRlUmVhZGVyKHBvc2l0aW9uKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUZXN0cyBpZiB0aGUgc3N0YWJsZSBjb250YWlucyBkYXRhIG5ld2VyIHRoYW4gdGhlIGdpdmVuIGFnZSBwYXJhbSAoaW4gbG9jYWxob3N0IGN1cnJlbnRNaWxsaSB0aW1lKS4KLSAgICAgKiBUaGlzIHdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGggbWF4RGF0YUFnZSB3aGljaCBpcyBhbiB1cHBlciBib3VuZCBvbiB0aGUgY3JlYXRlIG9mIGRhdGEgaW4gdGhpcyBzc3RhYmxlLgotICAgICAqIEBwYXJhbSBhZ2UgVGhlIGFnZSB0byBjb21wYXJlIHRoZSBtYXhEYXRhQXJlIG9mIHRoaXMgc3N0YWJsZS4gTWVhc3VyZWQgaW4gbWlsbGlzZWMgc2luY2UgZXBvYyBvbiB0aGlzIGhvc3QKLSAgICAgKiBAcmV0dXJuIFRydWUgaWZmIHRoaXMgc3N0YWJsZSBjb250YWlucyBkYXRhIHRoYXQncyBuZXdlciB0aGFuIHRoZSBnaXZlbiBhZ2UgcGFyYW1ldGVyLgorICAgICAqIFRlc3RzIGlmIHRoZSBzc3RhYmxlIGNvbnRhaW5zIGRhdGEgbmV3ZXIgdGhhbiB0aGUgZ2l2ZW4gYWdlIHBhcmFtIChpbiBsb2NhbGhvc3QgY3VycmVudE1pbGxpcyB0aW1lKS4KKyAgICAgKiBUaGlzIHdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGggbWF4RGF0YUFnZSB3aGljaCBpcyBhbiB1cHBlciBib3VuZCBvbiB0aGUgZGF0YSBpbiB0aGUgc3N0YWJsZSByZXByZXNlbnRlZAorICAgICAqIGJ5IHRoaXMgcmVhZGVyLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWZmIHRoaXMgc3N0YWJsZSBjb250YWlucyBkYXRhIHRoYXQncyBuZXdlciB0aGFuIHRoZSBnaXZlbiB0aW1lc3RhbXAKICAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBuZXdTaW5jZShsb25nIGFnZSkKKyAgICBwdWJsaWMgYm9vbGVhbiBuZXdTaW5jZShsb25nIHRpbWVzdGFtcE1pbGxpcykKICAgICB7Ci0gICAgICAgIHJldHVybiBtYXhEYXRhQWdlID4gYWdlOworICAgICAgICByZXR1cm4gbWF4RGF0YUFnZSA+IHRpbWVzdGFtcE1pbGxpczsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBjcmVhdGVMaW5rcyhTdHJpbmcgc25hcHNob3REaXJlY3RvcnlQYXRoKQpAQCAtMTYxNiw3ICs5OTIsNyBAQAogICAgIHsKICAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKICAgICAgICAgewotICAgICAgICAgICAgRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb21wb25lbnQpKTsKKyAgICAgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpOwogICAgICAgICAgICAgaWYgKCFzb3VyY2VGaWxlLmV4aXN0cygpKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgaWYgKG51bGwgIT0gbGltaXRlcikKQEAgLTE2MzEsMjUgKzEwMDcsMTcgQEAKICAgICAgICAgcmV0dXJuIHNzdGFibGVNZXRhZGF0YS5yZXBhaXJlZEF0ICE9IEFjdGl2ZVJlcGFpclNlcnZpY2UuVU5SRVBBSVJFRF9TU1RBQkxFOwogICAgIH0KIAotICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkga2V5QXQobG9uZyBpbmRleFBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIERlY29yYXRlZEtleSBrZXk7Ci0gICAgICAgIHRyeSAoRmlsZURhdGFJbnB1dCBpbiA9IGlmaWxlLmNyZWF0ZVJlYWRlcihpbmRleFBvc2l0aW9uKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGluLmlzRU9GKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIGtleSA9IGRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW4pKTsKLQotICAgICAgICAgICAgLy8gaGludCByZWFkIHBhdGggYWJvdXQga2V5IGxvY2F0aW9uIGlmIGNhY2hpbmcgaXMgZW5hYmxlZAotICAgICAgICAgICAgLy8gdGhpcyBzYXZlcyBpbmRleCBzdW1tYXJ5IGxvb2t1cCBhbmQgaW5kZXggZmlsZSBpdGVyYXRpb24gd2hpY2ggd2hvdWxkIGJlIHByZXR0eSBjb3N0bHkKLSAgICAgICAgICAgIC8vIGVzcGVjaWFsbHkgaW4gcHJlc2VuY2Ugb2YgcHJvbW90ZWQgY29sdW1uIGluZGV4ZXMKLSAgICAgICAgICAgIGlmIChpc0tleUNhY2hlRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIGNhY2hlS2V5KGtleSwgcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4pKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBrZXk7Ci0gICAgfQorICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBrZXkgc3RvcmVkIGF0IHRoZSBwb3NpdGlvbiBzYXZlZCBpbiBTQVNJLgorICAgICAqIDxwPgorICAgICAqIFdoZW4gU0FTSSBpcyBjcmVhdGVkLCBpdCB1c2VzIGtleSBsb2NhdGlvbnMgcmV0cmlldmVkIGZyb20ge0BsaW5rIEtleVJlYWRlciNrZXlQb3NpdGlvbkZvclNlY29uZGFyeUluZGV4KCl9LgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHRvIHJlYWQgdGhlIGtleSBzdG9yZWQgYXQgc3VjaCBwb3NpdGlvbi4gSXQgaXMgdXAgdG8gdGhlIGNvbmNyZXRlIFNTVGFibGUgZm9ybWF0IGltcGxlbWVudGF0aW9uCisgICAgICogd2hhdCB0aGF0IHBvc2l0aW9uIG1lYW5zIGFuZCB3aGljaCBmaWxlIGl0IHJlZmVycy4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdCBpdCBpcyBjb25zaXN0ZW50IHdpdGggd2hhdAorICAgICAqIHtAbGluayBLZXlSZWFkZXIja2V5UG9zaXRpb25Gb3JTZWNvbmRhcnlJbmRleCgpfSByZXR1cm5zLgorICAgICAqCisgICAgICogQHJldHVybiBrZXkgaWYgZm91bmQsIHtAY29kZSBudWxsfSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgRGVjb3JhdGVkS2V5IGtleUF0UG9zaXRpb25Gcm9tU2Vjb25kYXJ5SW5kZXgobG9uZyBrZXlQb3NpdGlvbkZyb21TZWNvbmRhcnlJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgcHVibGljIGJvb2xlYW4gaXNQZW5kaW5nUmVwYWlyKCkKICAgICB7CkBAIC0xNjk0LDU1ICsxMDYyLDI5IEBACiAKICAgICAgICAgZmluYWwgc3RhdGljIGNsYXNzIEVxdWFscyBleHRlbmRzIE9wZXJhdG9yCiAgICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgYXBwbHkoaW50IGNvbXBhcmlzb24pIHsgcmV0dXJuIC1jb21wYXJpc29uOyB9CisgICAgICAgICAgICBwdWJsaWMgaW50IGFwcGx5KGludCBjb21wYXJpc29uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAtY29tcGFyaXNvbjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIHN0YXRpYyBjbGFzcyBHcmVhdGVyVGhhbk9yRXF1YWxUbyBleHRlbmRzIE9wZXJhdG9yCiAgICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgYXBwbHkoaW50IGNvbXBhcmlzb24pIHsgcmV0dXJuIGNvbXBhcmlzb24gPj0gMCA/IDAgOiAxOyB9CisgICAgICAgICAgICBwdWJsaWMgaW50IGFwcGx5KGludCBjb21wYXJpc29uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJpc29uID49IDAgPyAwIDogMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGZpbmFsIHN0YXRpYyBjbGFzcyBHcmVhdGVyVGhhbiBleHRlbmRzIE9wZXJhdG9yCiAgICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgYXBwbHkoaW50IGNvbXBhcmlzb24pIHsgcmV0dXJuIGNvbXBhcmlzb24gPiAwID8gMCA6IDE7IH0KKyAgICAgICAgICAgIHB1YmxpYyBpbnQgYXBwbHkoaW50IGNvbXBhcmlzb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmlzb24gPiAwID8gMCA6IDE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgbG9uZyBnZXRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmxvb21GaWx0ZXJUcmFja2VyLmdldEZhbHNlUG9zaXRpdmVDb3VudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBsb25nIGdldFJlY2VudEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZUNvdW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBibG9vbUZpbHRlclRyYWNrZXIuZ2V0UmVjZW50RmFsc2VQb3NpdGl2ZUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0Qmxvb21GaWx0ZXJUcnVlUG9zaXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmxvb21GaWx0ZXJUcmFja2VyLmdldFRydWVQb3NpdGl2ZUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0UmVjZW50Qmxvb21GaWx0ZXJUcnVlUG9zaXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmxvb21GaWx0ZXJUcmFja2VyLmdldFJlY2VudFRydWVQb3NpdGl2ZUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0Qmxvb21GaWx0ZXJUcnVlTmVnYXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmxvb21GaWx0ZXJUcmFja2VyLmdldFRydWVOZWdhdGl2ZUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0UmVjZW50Qmxvb21GaWx0ZXJUcnVlTmVnYXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gYmxvb21GaWx0ZXJUcmFja2VyLmdldFJlY2VudFRydWVOZWdhdGl2ZUNvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEluc3RydW1lbnRpbmdDYWNoZTxLZXlDYWNoZUtleSwgUm93SW5kZXhFbnRyeT4gZ2V0S2V5Q2FjaGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGtleUNhY2hlOwotICAgIH0KLQogICAgIHB1YmxpYyBFc3RpbWF0ZWRIaXN0b2dyYW0gZ2V0RXN0aW1hdGVkUGFydGl0aW9uU2l6ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gc3N0YWJsZU1ldGFkYXRhLmVzdGltYXRlZFBhcnRpdGlvblNpemU7CkBAIC0xODI1LDggKzExNjcsOCBAQAogICAgIHB1YmxpYyBpbnQgZ2V0QXZnQ29sdW1uU2V0UGVyUm93KCkKICAgICB7CiAgICAgICAgIHJldHVybiBzc3RhYmxlTWV0YWRhdGEudG90YWxSb3dzIDwgMAotICAgICAgICAgICAgID8gLTEKLSAgICAgICAgICAgICA6IChzc3RhYmxlTWV0YWRhdGEudG90YWxSb3dzID09IDAgPyAwIDogKGludCkoc3N0YWJsZU1ldGFkYXRhLnRvdGFsQ29sdW1uc1NldCAvIHNzdGFibGVNZXRhZGF0YS50b3RhbFJvd3MpKTsKKyAgICAgICAgICAgICAgID8gLTEKKyAgICAgICAgICAgICAgIDogKHNzdGFibGVNZXRhZGF0YS50b3RhbFJvd3MgPT0gMCA/IDAgOiAoaW50KSAoc3N0YWJsZU1ldGFkYXRhLnRvdGFsQ29sdW1uc1NldCAvIHNzdGFibGVNZXRhZGF0YS50b3RhbFJvd3MpKTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IGdldFNTVGFibGVMZXZlbCgpCkBAIC0xODYwLDE2ICsxMjAyLDE2IEBACiAKICAgICAvKioKICAgICAgKiBSZWxvYWRzIHRoZSBzc3RhYmxlIG1ldGFkYXRhIGZyb20gZGlzay4KLSAgICAgKgorICAgICAqIDxwPgogICAgICAqIENhbGxlZCBhZnRlciBsZXZlbCBpcyBjaGFuZ2VkIG9uIHNzdGFibGUsIGZvciBleGFtcGxlIGlmIHRoZSBzc3RhYmxlIGlzIGRyb3BwZWQgdG8gTDAKLSAgICAgKgorICAgICAqIDxwPgogICAgICAqIE1pZ2h0IGJlIHBvc3NpYmxlIHRvIHJlbW92ZSBpbiBmdXR1cmUgdmVyc2lvbnMKICAgICAgKgogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCByZWxvYWRTU1RhYmxlTWV0YWRhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHRoaXMuc3N0YWJsZU1ldGFkYXRhID0gKFN0YXRzTWV0YWRhdGEpIGRlc2NyaXB0b3IuZ2V0TWV0YWRhdGFTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoZGVzY3JpcHRvciwgTWV0YWRhdGFUeXBlLlNUQVRTKTsKKyAgICAgICAgdGhpcy5zc3RhYmxlTWV0YWRhdGEgPSBTdGF0c0NvbXBvbmVudC5sb2FkKGRlc2NyaXB0b3IpLnN0YXRzTWV0YWRhdGEoKTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RhdHNNZXRhZGF0YSBnZXRTU1RhYmxlTWV0YWRhdGEoKQpAQCAtMTg4OCwxMSArMTIzMCwxMCBAQAogICAgICAgICByZXR1cm4gZGZpbGUuY3JlYXRlUmVhZGVyKCk7CiAgICAgfQogCi0gICAgcHVibGljIFJhbmRvbUFjY2Vzc1JlYWRlciBvcGVuSW5kZXhSZWFkZXIoKQorICAgIHB1YmxpYyB2b2lkIHRyeVNraXBGaWxlQ2FjaGVCZWZvcmUoRGVjb3JhdGVkS2V5IGtleSkKICAgICB7Ci0gICAgICAgIGlmIChpZmlsZSAhPSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIGlmaWxlLmNyZWF0ZVJlYWRlcigpOwotICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgbG9uZyBwb3NpdGlvbiA9IGdldFBvc2l0aW9uKGtleSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5HRSk7CisgICAgICAgIE5hdGl2ZUxpYnJhcnkudHJ5U2tpcENhY2hlKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLmFic29sdXRlUGF0aCgpLCAwLCBwb3NpdGlvbiA8IDAgPyAwIDogcG9zaXRpb24pOwogICAgIH0KIAogICAgIHB1YmxpYyBDaGFubmVsUHJveHkgZ2V0RGF0YUNoYW5uZWwoKQpAQCAtMTkwMCwzOSArMTI0MSwxMiBAQAogICAgICAgICByZXR1cm4gZGZpbGUuY2hhbm5lbDsKICAgICB9CiAKLSAgICBwdWJsaWMgQ2hhbm5lbFByb3h5IGdldEluZGV4Q2hhbm5lbCgpCi0gICAgewotICAgICAgICByZXR1cm4gaWZpbGUuY2hhbm5lbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZUhhbmRsZSBnZXRJbmRleEZpbGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlmaWxlOwotICAgIH0KLQogICAgIC8qKgotICAgICAqIEBwYXJhbSBjb21wb25lbnQgY29tcG9uZW50IHRvIGdldCB0aW1lc3RhbXAuCi0gICAgICogQHJldHVybiBsYXN0IG1vZGlmaWVkIHRpbWUgZm9yIGdpdmVuIGNvbXBvbmVudC4gMCBpZiBnaXZlbiBjb21wb25lbnQgZG9lcyBub3QgZXhpc3Qgb3IgSU8gZXJyb3Igb2NjdXJzLgorICAgICAqIEByZXR1cm4gbGFzdCBtb2RpZmllZCB0aW1lIGZvciBkYXRhIGNvbXBvbmVudC4gMCBpZiBnaXZlbiBjb21wb25lbnQgZG9lcyBub3QgZXhpc3Qgb3IgSU8gZXJyb3Igb2NjdXJzLgogICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldENyZWF0aW9uVGltZUZvcihDb21wb25lbnQgY29tcG9uZW50KQorICAgIHB1YmxpYyBsb25nIGdldERhdGFDcmVhdGlvblRpbWUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoY29tcG9uZW50KSkubGFzdE1vZGlmaWVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBOdW1iZXIgb2Yga2V5IGNhY2hlIGhpdAotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldEtleUNhY2hlSGl0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBrZXlDYWNoZUhpdC5nZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBrZXkgY2FjaGUgcmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldEtleUNhY2hlUmVxdWVzdCgpCi0gICAgewotICAgICAgICByZXR1cm4ga2V5Q2FjaGVSZXF1ZXN0LmdldCgpOworICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkubGFzdE1vZGlmaWVkKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xOTY3LDkgKzEyODEsMTYgQEAKICAgICAgICAgcmV0dXJuIHNlbGZSZWYucmVmKCk7CiAgICAgfQogCi0gICAgdm9pZCBzZXR1cChib29sZWFuIHRyYWNrSG90bmVzcykKKyAgICBwcm90ZWN0ZWQgTGlzdDxBdXRvQ2xvc2VhYmxlPiBzZXR1cEluc3RhbmNlKGJvb2xlYW4gdHJhY2tIb3RuZXNzKQogICAgIHsKLSAgICAgICAgdGlkeS5zZXR1cCh0aGlzLCBUUkFDS19BQ1RJVklUWSAmJiB0cmFja0hvdG5lc3MpOworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChkZmlsZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0dXAoYm9vbGVhbiB0cmFja0hvdG5lc3MpCisgICAgeworICAgICAgICBhc3NlcnQgdGlkeS5jbG9zZWFibGVzID09IG51bGw7CisgICAgICAgIHRyYWNrSG90bmVzcyAmPSBUUkFDS19BQ1RJVklUWTsKKyAgICAgICAgdGlkeS5zZXR1cCh0aGlzLCB0cmFja0hvdG5lc3MsIHNldHVwSW5zdGFuY2UodHJhY2tIb3RuZXNzKSk7CiAgICAgICAgIHRoaXMucmVhZE1ldGVyID0gdGlkeS5nbG9iYWwucmVhZE1ldGVyOwogICAgIH0KIApAQCAtMTk4MywzOSArMTMwNCwzNSBAQAogICAgIHsKICAgICAgICAgaWRlbnRpdGllcy5hZGQodGhpcyk7CiAgICAgICAgIGlkZW50aXRpZXMuYWRkKHRpZHkuZ2xvYmFsUmVmKTsKLSAgICAgICAgZGZpbGUuYWRkVG8oaWRlbnRpdGllcyk7Ci0gICAgICAgIGlmaWxlLmFkZFRvKGlkZW50aXRpZXMpOwotICAgICAgICBiZi5hZGRUbyhpZGVudGl0aWVzKTsKLSAgICAgICAgaW5kZXhTdW1tYXJ5LmFkZFRvKGlkZW50aXRpZXMpOwotCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWF5YmVQcmVzZW50KERlY29yYXRlZEtleSBrZXkpCi0gICAgewotICAgICAgICAvLyBpZiB3ZSBkb24ndCBoYXZlIGJsb29tIGZpbHRlcihiZl9mcF9jaGFuY2U9MS4wIG9yIGZpbHRlciBmaWxlIGlzIG1pc3NpbmcpLAotICAgICAgICAvLyB3ZSBjaGVjayBpbmRleCBmaWxlIGluc3RlYWQuCi0gICAgICAgIHJldHVybiBiZiBpbnN0YW5jZW9mIEFsd2F5c1ByZXNlbnRGaWx0ZXIgJiYgZ2V0UG9zaXRpb24oa2V5LCBPcGVyYXRvci5FUSwgZmFsc2UpICE9IG51bGwgfHwgYmYuaXNQcmVzZW50KGtleSk7CisgICAgICAgIHRpZHkuY2xvc2VhYmxlcy5mb3JFYWNoKGMgLT4geworICAgICAgICAgICAgaWYgKGMgaW5zdGFuY2VvZiBTaGFyZWRDbG9zZWFibGUpCisgICAgICAgICAgICAgICAgKChTaGFyZWRDbG9zZWFibGUpIGMpLmFkZFRvKGlkZW50aXRpZXMpOworICAgICAgICB9KTsKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBUaGUgbWV0aG9kIHZlcmlmaWVzIHdoZXRoZXIgdGhlIHNzdGFibGUgbWF5IGNvbnRhaW4gdGhlIHByb3ZpZGVkIGtleS4gVGhlIG1ldGhvZCBkb2VzIGFwcHJveGltYXRpb24gdXNpbmcKKyAgICAgKiBCbG9vbSBmaWx0ZXIgaWYgaXQgaXMgcHJlc2VudCBhbmQgaWYgaXQgaXMgbm90LCBwZXJmb3JtcyBhY2N1cmF0ZSBjaGVjayBpbiB0aGUgaW5kZXguCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gbWF5Q29udGFpbkFzc3VtaW5nS2V5SXNJblJhbmdlKERlY29yYXRlZEtleSBrZXkpOworCisgICAgLyoqCiAgICAgICogT25lIGluc3RhbmNlIHBlciBTU1RhYmxlUmVhZGVyIHdlIGNyZWF0ZS4KLSAgICAgKgorICAgICAqIDxwPgogICAgICAqIFdlIGNhbiBjcmVhdGUgbWFueSBJbnN0YW5jZVRpZGllcnMgKG9uZSBmb3IgZXZlcnkgdGltZSB3ZSByZW9wZW4gYW4gc3N0YWJsZSB3aXRoIE1PVkVEX1NUQVJUIGZvciBleGFtcGxlKSwKICAgICAgKiBidXQgdGhlcmUgY2FuIG9ubHkgYmUgb25lIEdsb2JhbFRpZHkgZm9yIG9uZSBzaW5nbGUgbG9naWNhbCBzc3RhYmxlLgotICAgICAqCisgICAgICogPHA+CiAgICAgICogV2hlbiB0aGUgSW5zdGFuY2VUaWRpZXIgY2xlYW5zdXAsIGl0IHJlbGVhc2VzIGl0cyByZWZlcmVuY2UgdG8gaXRzIEdsb2JhbFRpZHk7IHdoZW4gYWxsIEluc3RhbmNlVGlkaWVycwogICAgICAqIGZvciB0aGF0IHR5cGUgaGF2ZSBydW4sIHRoZSBHbG9iYWxUaWR5IGNsZWFucyB1cC4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBJbnN0YW5jZVRpZGllciBpbXBsZW1lbnRzIFRpZHkKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIEluc3RhbmNlVGlkaWVyIGltcGxlbWVudHMgVGlkeQogICAgIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgVGFibGVJZCB0YWJsZUlkOwotICAgICAgICBwcml2YXRlIElGaWx0ZXIgYmY7Ci0gICAgICAgIHByaXZhdGUgSW5kZXhTdW1tYXJ5IHN1bW1hcnk7CisgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxPd25lcj4gb3duZXI7CiAKLSAgICAgICAgcHJpdmF0ZSBGaWxlSGFuZGxlIGRmaWxlOwotICAgICAgICBwcml2YXRlIEZpbGVIYW5kbGUgaWZpbGU7CisgICAgICAgIHByaXZhdGUgTGlzdDw/IGV4dGVuZHMgQXV0b0Nsb3NlYWJsZT4gY2xvc2VhYmxlczsKICAgICAgICAgcHJpdmF0ZSBSdW5uYWJsZSBydW5PbkNsb3NlOworCiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlcGxhY2VkID0gZmFsc2U7CiAKICAgICAgICAgLy8gYSByZWZlcmVuY2UgdG8gb3VyIHNoYXJlZCB0aWR5IGluc3RhbmNlLCB0aGF0CkBAIC0yMDI1LDI2ICsxMzQyLDI1IEBACiAKICAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHNldHVwOwogCi0gICAgICAgIHZvaWQgc2V0dXAoU1NUYWJsZVJlYWRlciByZWFkZXIsIGJvb2xlYW4gdHJhY2tIb3RuZXNzKQorICAgICAgICBwdWJsaWMgdm9pZCBzZXR1cChTU1RhYmxlUmVhZGVyIHJlYWRlciwgYm9vbGVhbiB0cmFja0hvdG5lc3MsIENvbGxlY3Rpb248PyBleHRlbmRzIEF1dG9DbG9zZWFibGU+IGNsb3NlYWJsZXMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc2V0dXAgPSB0cnVlOwotICAgICAgICAgICAgdGhpcy5iZiA9IHJlYWRlci5iZjsKLSAgICAgICAgICAgIHRoaXMuc3VtbWFyeSA9IHJlYWRlci5pbmRleFN1bW1hcnk7Ci0gICAgICAgICAgICB0aGlzLmRmaWxlID0gcmVhZGVyLmRmaWxlOwotICAgICAgICAgICAgdGhpcy5pZmlsZSA9IHJlYWRlci5pZmlsZTsKICAgICAgICAgICAgIC8vIGdldCBhIG5ldyByZWZlcmVuY2UgdG8gdGhlIHNoYXJlZCBkZXNjcmlwdG9yLXR5cGUgdGlkeQogICAgICAgICAgICAgdGhpcy5nbG9iYWxSZWYgPSBHbG9iYWxUaWR5LmdldChyZWFkZXIpOwogICAgICAgICAgICAgdGhpcy5nbG9iYWwgPSBnbG9iYWxSZWYuZ2V0KCk7CiAgICAgICAgICAgICBpZiAodHJhY2tIb3RuZXNzKQogICAgICAgICAgICAgICAgIGdsb2JhbC5lbnN1cmVSZWFkTWV0ZXIoKTsKKyAgICAgICAgICAgIHRoaXMuY2xvc2VhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PihjbG9zZWFibGVzKTsKKyAgICAgICAgICAgIC8vIHRvIGF2b2lkIHRpZHkgc2VlaW5nIHBhcnRpYWwgc3RhdGUsIHNldCBzZXR1cD10cnVlIGF0IHRoZSBlbmQKKyAgICAgICAgICAgIHRoaXMuc2V0dXAgPSB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgSW5zdGFuY2VUaWRpZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBUYWJsZUlkIHRhYmxlSWQpCisgICAgICAgIHByaXZhdGUgSW5zdGFuY2VUaWRpZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBPd25lciBvd25lcikKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgIHRoaXMudGFibGVJZCA9IHRhYmxlSWQ7CisgICAgICAgICAgICB0aGlzLm93bmVyID0gbmV3IFdlYWtSZWZlcmVuY2U8Pihvd25lcik7CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgdGlkeSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKQEAgLTIwNTQsMTUgKzEzNzAsMTcgQEAKICAgICAgICAgICAgIGlmICghc2V0dXApCiAgICAgICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgICAgICBmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmVJbnN0YW5jZSh0YWJsZUlkKTsKICAgICAgICAgICAgIGZpbmFsIE9wT3JkZXIuQmFycmllciBiYXJyaWVyOwotICAgICAgICAgICAgaWYgKGNmcyAhPSBudWxsKQorICAgICAgICAgICAgT3duZXIgb3duZXIgPSB0aGlzLm93bmVyLmdldCgpOworICAgICAgICAgICAgaWYgKG93bmVyICE9IG51bGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYmFycmllciA9IGNmcy5yZWFkT3JkZXJpbmcubmV3QmFycmllcigpOworICAgICAgICAgICAgICAgIGJhcnJpZXIgPSBvd25lci5uZXdSZWFkT3JkZXJpbmdCYXJyaWVyKCk7CiAgICAgICAgICAgICAgICAgYmFycmllci5pc3N1ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGJhcnJpZXIgPSBudWxsOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTY2hlZHVsZWRFeGVjdXRvcnMubm9uUGVyaW9kaWNUYXNrcy5leGVjdXRlKG5ldyBSdW5uYWJsZSgpCiAgICAgICAgICAgICB7CkBAIC0yMDc3LDE3ICsxMzk1LDM2IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiQXN5bmMgaW5zdGFuY2UgdGlkaWVyIGZvciB7fSwgYWZ0ZXIgYmFycmllciIsIGRlc2NyaXB0b3IpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChiZiAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgYmYuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1bW1hcnkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bk9uQ2xvc2UgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGV4Y2VwdGlvbnMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAocnVuT25DbG9zZSAhPSBudWxsKSB0cnkKKyAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgcnVuT25DbG9zZS5ydW4oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRmaWxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBkZmlsZS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaWZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmaWxlLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGdsb2JhbFJlZi5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gfCBFcnJvciBleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gcnVuIG9uLWNsb3NlIGxpc3RlbmVycyBmb3Igc3N0YWJsZSAiICsgZGVzY3JpcHRvci5iYXNlRmlsZSgpLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25zID0gZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgY2xvc2VFeGNlcHRpb25zID0gVGhyb3dhYmxlcy5jbG9zZShudWxsLCBJdGVyYWJsZXMuZmlsdGVyKGNsb3NlYWJsZXMsIE9iamVjdHM6Om5vbk51bGwpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsb3NlRXhjZXB0aW9ucyAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkZhaWxlZCB0byBjbG9zZSBzb21lIHNzdGFibGUgY29tcG9uZW50cyBvZiAiICsgZGVzY3JpcHRvci5iYXNlRmlsZSgpLCBjbG9zZUV4Y2VwdGlvbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9ucyA9IFRocm93YWJsZXMubWVyZ2UoZXhjZXB0aW9ucywgY2xvc2VFeGNlcHRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxSZWYucmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHwgRXJyb3IgZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIHJlbGVhc2UgdGhlIGdsb2JhbCByZWYgb2YgIiArIGRlc2NyaXB0b3IuYmFzZUZpbGUoKSwgZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9ucyA9IFRocm93YWJsZXMubWVyZ2UoZXhjZXB0aW9ucywgZXgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbnMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIEpWTVN0YWJpbGl0eUluc3BlY3Rvci5pbnNwZWN0VGhyb3dhYmxlKGV4Y2VwdGlvbnMpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiQXN5bmMgaW5zdGFuY2UgdGlkaWVyIGZvciB7fSwgY29tcGxldGVkIiwgZGVzY3JpcHRvcik7CkBAIC0yMTAxLDIzICsxNDM4LDE3IEBACiAgICAgICAgICAgICB9KTsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvci50b1N0cmluZygpOwogICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCByZWxlYXNlU3VtbWFyeSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1bW1hcnkuY2xvc2UoKTsKLSAgICAgICAgICAgIGFzc2VydCBzdW1tYXJ5LmlzQ2xlYW5lZFVwKCk7Ci0gICAgICAgICAgICBzdW1tYXJ5ID0gbnVsbDsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgogICAgICAqIE9uZSBpbnN0YW5jZSBwZXIgbG9naWNhbCBzc3RhYmxlLiBUaGlzIGJvdGggdHJhY2tzIHNoYXJlZCBjbGVhbnVwIGFuZCBzb21lIHNoYXJlZCBzdGF0ZSByZWxhdGVkCiAgICAgICogdG8gdGhlIHNzdGFibGUncyBsaWZlY3ljbGUuCi0gICAgICoKKyAgICAgKiA8cD4KICAgICAgKiBBbGwgSW5zdGFuY2VUaWRpZXJzLCBvbiBzZXR1cCgpLCBhc2sgdGhlIHN0YXRpYyBnZXQoKSBtZXRob2QgZm9yIHRoZWlyIHNoYXJlZCBzdGF0ZSwKICAgICAgKiBhbmQgc3Rhc2ggYSByZWZlcmVuY2UgdG8gaXQgdG8gYmUgcmVsZWFzZWQgd2hlbiB0aGV5IGFyZS4gT25jZSBhbGwgc3VjaCByZWZlcmVuY2VzIGFyZQogICAgICAqIHJlbGVhc2VkLCB0aGlzIHNoYXJlZCB0aWR5IHdpbGwgYmUgcGVyZm9ybWVkLgpAQCAtMjE2MCwxNyArMTQ5MSwxNiBAQAogCiAgICAgICAgICAgICByZWFkTWV0ZXIgPSBTeXN0ZW1LZXlzcGFjZS5nZXRTU1RhYmxlUmVhZE1ldGVyKGRlc2Mua3NuYW1lLCBkZXNjLmNmbmFtZSwgZGVzYy5pZCk7CiAgICAgICAgICAgICAvLyBzeW5jIHRoZSBhdmVyYWdlIHJlYWQgcmF0ZSB0byBzeXN0ZW0uc3N0YWJsZV9hY3Rpdml0eSBldmVyeSBmaXZlIG1pbnV0ZXMsIHN0YXJ0aW5nIG9uZSBtaW51dGUgZnJvbSBub3cKLSAgICAgICAgICAgIHJlYWRNZXRlclN5bmNGdXR1cmUgPSBuZXcgV2Vha1JlZmVyZW5jZTw+KHN5bmNFeGVjdXRvci5zY2hlZHVsZUF0Rml4ZWRSYXRlKG5ldyBSdW5uYWJsZSgpCisgICAgICAgICAgICByZWFkTWV0ZXJTeW5jRnV0dXJlID0gbmV3IFdlYWtSZWZlcmVuY2U8PihzeW5jRXhlY3V0b3Iuc2NoZWR1bGVBdEZpeGVkUmF0ZSh0aGlzOjptYXliZVBlcnNpc3RTU1RhYmxlUmVhZE1ldGVyLCAxLCA1LCBUaW1lVW5pdC5NSU5VVEVTKSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG1heWJlUGVyc2lzdFNTVGFibGVSZWFkTWV0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob2Jzb2xldGlvbiA9PSBudWxsICYmIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU3RhYmxlUmVhZFJhdGVQZXJzaXN0ZW5jZUVuYWJsZWQoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9ic29sZXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0ZXJTeW5jVGhyb3R0bGUuYWNxdWlyZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtS2V5c3BhY2UucGVyc2lzdFNTVGFibGVSZWFkTWV0ZXIoZGVzYy5rc25hbWUsIGRlc2MuY2ZuYW1lLCBkZXNjLmlkLCByZWFkTWV0ZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgMSwgNSwgVGltZVVuaXQuTUlOVVRFUykpOworICAgICAgICAgICAgICAgIG1ldGVyU3luY1Rocm90dGxlLmFjcXVpcmUoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5wZXJzaXN0U1NUYWJsZVJlYWRNZXRlcihkZXNjLmtzbmFtZSwgZGVzYy5jZm5hbWUsIGRlc2MuaWQsIHJlYWRNZXRlcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIHZvaWQgc3RvcFJlYWRNZXRlclBlcnNpc3RlbmNlKCkKQEAgLTIxOTEsOCArMTUyMSw4IEBACiAgICAgICAgICAgICAgICAgb2Jzb2xldGlvbi5ydW4oKTsKIAogICAgICAgICAgICAgLy8gZG9uJ3QgaWRlYWxseSB3YW50IHRvIGRyb3BQYWdlQ2FjaGUgZm9yIHRoZSBmaWxlIHVudGlsIGFsbCBpbnN0YW5jZXMgaGF2ZSBiZWVuIHJlbGVhc2VkCi0gICAgICAgICAgICBOYXRpdmVMaWJyYXJ5LnRyeVNraXBDYWNoZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSwgMCwgMCk7Ci0gICAgICAgICAgICBOYXRpdmVMaWJyYXJ5LnRyeVNraXBDYWNoZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSwgMCwgMCk7CisgICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjIDogZGVzYy5kaXNjb3ZlckNvbXBvbmVudHMoKSkKKyAgICAgICAgICAgICAgICBOYXRpdmVMaWJyYXJ5LnRyeVNraXBDYWNoZShkZXNjLmZpbGVGb3IoYykuYWJzb2x1dGVQYXRoKCksIDAsIDApOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFN0cmluZyBuYW1lKCkKQEAgLTIyMzUsMTEgKzE1NjUsNiBAQAogICAgICAgICBHbG9iYWxUaWR5Lmxvb2t1cC5jbGVhcigpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRmFjdG9yeQotICAgIHsKLSAgICAgICAgcHVibGljIGFic3RyYWN0IFNTVGFibGVSZWFkZXIgb3BlbihTU1RhYmxlUmVhZGVyQnVpbGRlciBidWlsZGVyKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcnRpdGlvblBvc2l0aW9uQm91bmRzCiAgICAgewogICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBsb3dlclBvc2l0aW9uOwpAQCAtMjI1NSwxNSArMTU4MCwxNSBAQAogICAgICAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkKICAgICAgICAgewogICAgICAgICAgICAgaW50IGhhc2hDb2RlID0gKGludCkgbG93ZXJQb3NpdGlvbiBeIChpbnQpIChsb3dlclBvc2l0aW9uID4+PiAzMik7Ci0gICAgICAgICAgICByZXR1cm4gMzEgKiAoaGFzaENvZGUgXiAoaW50KSAoKGludCkgdXBwZXJQb3NpdGlvbiBeICAodXBwZXJQb3NpdGlvbiA+Pj4gMzIpKSk7CisgICAgICAgICAgICByZXR1cm4gMzEgKiAoaGFzaENvZGUgXiAoaW50KSAoKGludCkgdXBwZXJQb3NpdGlvbiBeICh1cHBlclBvc2l0aW9uID4+PiAzMikpKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKCEobyBpbnN0YW5jZW9mIFBhcnRpdGlvblBvc2l0aW9uQm91bmRzKSkKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBQYXJ0aXRpb25Qb3NpdGlvbkJvdW5kcykpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgUGFydGl0aW9uUG9zaXRpb25Cb3VuZHMgdGhhdCA9IChQYXJ0aXRpb25Qb3NpdGlvbkJvdW5kcylvOworICAgICAgICAgICAgUGFydGl0aW9uUG9zaXRpb25Cb3VuZHMgdGhhdCA9IChQYXJ0aXRpb25Qb3NpdGlvbkJvdW5kcykgbzsKICAgICAgICAgICAgIHJldHVybiBsb3dlclBvc2l0aW9uID09IHRoYXQubG93ZXJQb3NpdGlvbiAmJiB1cHBlclBvc2l0aW9uID09IHRoYXQudXBwZXJQb3NpdGlvbjsKICAgICAgICAgfQogICAgIH0KQEAgLTIyOTcsNyArMTYyMiw3IEBACiAKICAgICAvKioKICAgICAgKiBNb3ZlcyB0aGUgc3N0YWJsZSBpbiBvbGREZXNjcmlwdG9yIHRvIGEgbmV3IHBsYWNlICh3aXRoIGdlbmVyYXRpb24gZXRjKSBpbiBuZXdEZXNjcmlwdG9yLgotICAgICAqCisgICAgICogPHA+CiAgICAgICogQWxsIGNvbXBvbmVudHMgZ2l2ZW4gd2lsbCBiZSBtb3ZlZC9yZW5hbWVkCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlUmVhZGVyIG1vdmVBbmRPcGVuU1NUYWJsZShDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIERlc2NyaXB0b3Igb2xkRGVzY3JpcHRvciwgRGVzY3JpcHRvciBuZXdEZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzLCBib29sZWFuIGNvcHlEYXRhKQpAQCAtMjMxNSw5ICsxNjQwLDkgQEAKICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlKTsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1lc3NhZ2UpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChuZXcgRmlsZShuZXdEZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSkuZXhpc3RzKCkpCisgICAgICAgIGlmIChuZXdEZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKS5leGlzdHMoKSkKICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIkZpbGUgJXMgYWxyZWFkeSBleGlzdHMsIGNhbid0IG1vdmUgdGhlIGZpbGUgdGhlcmUiLCBuZXdEZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7CisgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiRmlsZSAlcyBhbHJlYWR5IGV4aXN0cywgY2FuJ3QgbW92ZSB0aGUgZmlsZSB0aGVyZSIsIG5ld0Rlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpKTsKICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihtc2cpOwogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obXNnKTsKICAgICAgICAgfQpAQCAtMjMyNywyNCArMTY1MiwyNCBAQAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkhhcmRsaW5raW5nIG5ldyBTU1RhYmxlIHt9IHRvIHt9Iiwgb2xkRGVzY3JpcHRvciwgbmV3RGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgU1NUYWJsZVdyaXRlci5oYXJkbGluayhvbGREZXNjcmlwdG9yLCBuZXdEZXNjcmlwdG9yLCBjb21wb25lbnRzKTsKKyAgICAgICAgICAgICAgICBoYXJkbGluayhvbGREZXNjcmlwdG9yLCBuZXdEZXNjcmlwdG9yLCBjb21wb25lbnRzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChGU1dyaXRlRXJyb3IgZXgpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlVuYWJsZSB0byBoYXJkbGluayBuZXcgU1NUYWJsZSB7fSB0byB7fSwgZmFsbGluZyBiYWNrIHRvIGNvcHlpbmciLCBvbGREZXNjcmlwdG9yLCBuZXdEZXNjcmlwdG9yLCBleCk7Ci0gICAgICAgICAgICAgICAgU1NUYWJsZVdyaXRlci5jb3B5KG9sZERlc2NyaXB0b3IsIG5ld0Rlc2NyaXB0b3IsIGNvbXBvbmVudHMpOworICAgICAgICAgICAgICAgIGNvcHkob2xkRGVzY3JpcHRvciwgbmV3RGVzY3JpcHRvciwgY29tcG9uZW50cyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICBsb2dnZXIuaW5mbygiTW92aW5nIG5ldyBTU1RhYmxlIHt9IHRvIHt9Iiwgb2xkRGVzY3JpcHRvciwgbmV3RGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBTU1RhYmxlV3JpdGVyLnJlbmFtZShvbGREZXNjcmlwdG9yLCBuZXdEZXNjcmlwdG9yLCBjb21wb25lbnRzKTsKKyAgICAgICAgICAgIHJlbmFtZShvbGREZXNjcmlwdG9yLCBuZXdEZXNjcmlwdG9yLCBjb21wb25lbnRzKTsKICAgICAgICAgfQogCiAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyOwogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgcmVhZGVyID0gU1NUYWJsZVJlYWRlci5vcGVuKG5ld0Rlc2NyaXB0b3IsIGNvbXBvbmVudHMsIGNmcy5tZXRhZGF0YSk7CisgICAgICAgICAgICByZWFkZXIgPSBvcGVuKGNmcywgbmV3RGVzY3JpcHRvciwgY29tcG9uZW50cywgY2ZzLm1ldGFkYXRhKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCiAgICAgICAgIHsKQEAgLTIzNjAsNCArMTY4NSwyMTQgQEAKICAgICAgICAgRXhlY3V0b3JVdGlscy5zaHV0ZG93bk5vd0FuZFdhaXQodGltZW91dCwgdW5pdCwgc3luY0V4ZWN1dG9yKTsKICAgICAgICAgcmVzZXRUaWR5aW5nKCk7CiAgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgcGh5c2ljYWwgc2l6ZSBvbiBkaXNrIG9mIGFsbCBjb21wb25lbnRzIGZvciB0aGlzIFNTVGFibGUgaW4gYnl0ZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBieXRlc09uRGlzaygpCisgICAgeworICAgICAgICByZXR1cm4gYnl0ZXNPbkRpc2soZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHRvdGFsIGxvZ2ljYWwvdW5jb21wcmVzc2VkIHNpemUgaW4gYnl0ZXMgb2YgYWxsIGNvbXBvbmVudHMgZm9yIHRoaXMgU1NUYWJsZQorICAgICAqLworICAgIHB1YmxpYyBsb25nIGxvZ2ljYWxCeXRlc09uRGlzaygpCisgICAgeworICAgICAgICByZXR1cm4gYnl0ZXNPbkRpc2sodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGJ5dGVzT25EaXNrKGJvb2xlYW4gbG9naWNhbCkKKyAgICB7CisgICAgICAgIGxvbmcgYnl0ZXMgPSAwOworICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBPbmx5IHRoZSBkYXRhIGZpbGUgaXMgY29tcHJlc3NhYmxlLgorICAgICAgICAgICAgYnl0ZXMgKz0gbG9naWNhbCAmJiBjb21wb25lbnQgPT0gQ29tcG9uZW50cy5EQVRBICYmIGNvbXByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICA/IGdldENvbXByZXNzaW9uTWV0YWRhdGEoKS5kYXRhTGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICA6IGRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpLmxlbmd0aCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgdm9pZCBtYXliZVBlcnNpc3RTU1RhYmxlUmVhZE1ldGVyKCkKKyAgICB7CisgICAgICAgIHRpZHkuZ2xvYmFsLm1heWJlUGVyc2lzdFNTVGFibGVSZWFkTWV0ZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHZlcmlmaWVyIGZvciB0aGlzIHNzdGFibGUuIE5vdGUgdGhhdCB0aGUgcmVhZGVyIG11c3QgbWF0Y2ggdGhlIHByb3ZpZGVkIGNmcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgSVZlcmlmaWVyIGdldFZlcmlmaWVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNPZmZsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVZlcmlmaWVyLk9wdGlvbnMgb3B0aW9ucyk7CisKKyAgICAvKioKKyAgICAgKiBBIG1ldGhvZCB0byBiZSBjYWxsZWQgYnkge0BsaW5rICNnZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbiwgT3BlcmF0b3IsIGJvb2xlYW4sIFNTVGFibGVSZWFkc0xpc3RlbmVyKX0KKyAgICAgKiBhbmQge0BsaW5rICNnZXRSb3dJbmRleEVudHJ5KFBhcnRpdGlvblBvc2l0aW9uLCBPcGVyYXRvciwgYm9vbGVhbiwgU1NUYWJsZVJlYWRzTGlzdGVuZXIpfSBtZXRob2RzIHdoZW4KKyAgICAgKiBhIHNlYXJjaGVkIGtleSBpcyBmb3VuZC4gSXQgYWRkcyBhIHRyYWNlIG1lc3NhZ2UgYW5kIG5vdGlmeSB0aGUgcHJvdmlkZWQgbGlzdGVuZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5U2VsZWN0ZWQoU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2VsZWN0aW9uUmVhc29uIHJlYXNvbiwgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbG9jYWxMaXN0ZW5lciwgT3BlcmF0b3Igb3AsIGJvb2xlYW4gdXBkYXRlU3RhdHMsIEFic3RyYWN0Um93SW5kZXhFbnRyeSBlbnRyeSkKKyAgICB7CisgICAgICAgIHJlYXNvbi50cmFjZShkZXNjcmlwdG9yLCBlbnRyeSk7CisKKyAgICAgICAgaWYgKGxvY2FsTGlzdGVuZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGxvY2FsTGlzdGVuZXIub25TU1RhYmxlU2VsZWN0ZWQodGhpcywgcmVhc29uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG1ldGhvZCB0byBiZSBjYWxsZWQgYnkge0BsaW5rICNnZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbiwgT3BlcmF0b3IsIGJvb2xlYW4sIFNTVGFibGVSZWFkc0xpc3RlbmVyKX0KKyAgICAgKiBhbmQge0BsaW5rICNnZXRSb3dJbmRleEVudHJ5KFBhcnRpdGlvblBvc2l0aW9uLCBPcGVyYXRvciwgYm9vbGVhbiwgU1NUYWJsZVJlYWRzTGlzdGVuZXIpfSBtZXRob2RzIHdoZW4KKyAgICAgKiBhIHNlYXJjaGVkIGtleSBpcyBub3QgZm91bmQuIEl0IGFkZHMgYSB0cmFjZSBtZXNzYWdlIGFuZCBub3RpZnkgdGhlIHByb3ZpZGVkIGxpc3RlbmVyLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeVNraXBwZWQoU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2tpcHBpbmdSZWFzb24gcmVhc29uLCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsb2NhbExpc3RlbmVyLCBPcGVyYXRvciBvcCwgYm9vbGVhbiB1cGRhdGVTdGF0cykKKyAgICB7CisgICAgICAgIHJlYXNvbi50cmFjZShkZXNjcmlwdG9yKTsKKworICAgICAgICBpZiAobG9jYWxMaXN0ZW5lciAhPSBudWxsKQorICAgICAgICAgICAgbG9jYWxMaXN0ZW5lci5vblNTVGFibGVTa2lwcGVkKHRoaXMsIHJlYXNvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBidWlsZGVyIG9mIHRoaXMgc3N0YWJsZSByZWFkZXIuIEl0IHNob3VsZCBiZSBleHRlbmRlZCBmb3IgZWFjaCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU1NUYWJsZVJlYWRlcn0gd2l0aAorICAgICAqIHRoZSBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBmaWVsZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFI+IHR5cGUgb2YgdGhlIHJlYWRlciB0aGUgYnVpbGRlciBjcmVhdGVzCisgICAgICogQHBhcmFtIDxCPiB0eXBlIG9mIHRoaXMgYnVpbGRlcgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQnVpbGRlcjxSIGV4dGVuZHMgU1NUYWJsZVJlYWRlciwgQiBleHRlbmRzIEJ1aWxkZXI8UiwgQj4+IGV4dGVuZHMgU1NUYWJsZS5CdWlsZGVyPFIsIEI+CisgICAgeworICAgICAgICBwcml2YXRlIGxvbmcgbWF4RGF0YUFnZTsKKyAgICAgICAgcHJpdmF0ZSBTdGF0c01ldGFkYXRhIHN0YXRzTWV0YWRhdGE7CisgICAgICAgIHByaXZhdGUgT3BlblJlYXNvbiBvcGVuUmVhc29uOworICAgICAgICBwcml2YXRlIFNlcmlhbGl6YXRpb25IZWFkZXIgc2VyaWFsaXphdGlvbkhlYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBGaWxlSGFuZGxlIGRhdGFGaWxlOworICAgICAgICBwcml2YXRlIERlY29yYXRlZEtleSBmaXJzdDsKKyAgICAgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgbGFzdDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHN1c3BlY3RlZDsKKworICAgICAgICBwdWJsaWMgQnVpbGRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGRlc2NyaXB0b3IpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEIgc2V0TWF4RGF0YUFnZShsb25nIG1heERhdGFBZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChtYXhEYXRhQWdlID49IDApOworICAgICAgICAgICAgdGhpcy5tYXhEYXRhQWdlID0gbWF4RGF0YUFnZTsKKyAgICAgICAgICAgIHJldHVybiAoQikgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCIHNldFN0YXRzTWV0YWRhdGEoU3RhdHNNZXRhZGF0YSBzdGF0c01ldGFkYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChzdGF0c01ldGFkYXRhKTsKKyAgICAgICAgICAgIHRoaXMuc3RhdHNNZXRhZGF0YSA9IHN0YXRzTWV0YWRhdGE7CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQiBzZXRPcGVuUmVhc29uKE9wZW5SZWFzb24gb3BlblJlYXNvbikKKyAgICAgICAgeworICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwob3BlblJlYXNvbik7CisgICAgICAgICAgICB0aGlzLm9wZW5SZWFzb24gPSBvcGVuUmVhc29uOworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEIgc2V0U2VyaWFsaXphdGlvbkhlYWRlcihTZXJpYWxpemF0aW9uSGVhZGVyIHNlcmlhbGl6YXRpb25IZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc2VyaWFsaXphdGlvbkhlYWRlciA9IHNlcmlhbGl6YXRpb25IZWFkZXI7CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQiBzZXREYXRhRmlsZShGaWxlSGFuZGxlIGRhdGFGaWxlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmRhdGFGaWxlID0gZGF0YUZpbGU7CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQiBzZXRGaXJzdChEZWNvcmF0ZWRLZXkgZmlyc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZmlyc3QgPSBmaXJzdCAhPSBudWxsID8gZmlyc3QucmV0YWluYWJsZSgpIDogbnVsbDsKKyAgICAgICAgICAgIHJldHVybiAoQikgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCIHNldExhc3QoRGVjb3JhdGVkS2V5IGxhc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubGFzdCA9IGxhc3QgIT0gbnVsbCA/IGxhc3QucmV0YWluYWJsZSgpIDogbnVsbDsKKyAgICAgICAgICAgIHJldHVybiAoQikgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCIHNldFN1c3BlY3RlZChib29sZWFuIHN1c3BlY3RlZCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5zdXNwZWN0ZWQgPSBzdXNwZWN0ZWQ7CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBnZXRNYXhEYXRhQWdlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1heERhdGFBZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RhdHNNZXRhZGF0YSBnZXRTdGF0c01ldGFkYXRhKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0YXRzTWV0YWRhdGE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT3BlblJlYXNvbiBnZXRPcGVuUmVhc29uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG9wZW5SZWFzb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2VyaWFsaXphdGlvbkhlYWRlciBnZXRTZXJpYWxpemF0aW9uSGVhZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6YXRpb25IZWFkZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZUhhbmRsZSBnZXREYXRhRmlsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkYXRhRmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgZ2V0Rmlyc3QoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmlyc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IGdldExhc3QoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbGFzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3VzcGVjdGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN1c3BlY3RlZDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBSIGJ1aWxkSW50ZXJuYWwoT3duZXIgb3duZXIpOworCisgICAgICAgIHB1YmxpYyBSIGJ1aWxkKE93bmVyIG93bmVyLCBib29sZWFuIHZhbGlkYXRlLCBib29sZWFuIG9ubGluZSkKKyAgICAgICAgeworICAgICAgICAgICAgUiByZWFkZXIgPSBidWlsZEludGVybmFsKG93bmVyKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGlzU3VzcGVjdGVkKCkpCisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5tYXJrU3VzcGVjdCgpOworCisgICAgICAgICAgICAgICAgcmVhZGVyLnNldHVwKG9ubGluZSk7CisKKyAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGUpCisgICAgICAgICAgICAgICAgICAgIHJlYWRlci52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gfCBFcnJvciBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBKVk1TdGFiaWxpdHlJbnNwZWN0b3IuaW5zcGVjdFRocm93YWJsZShleCk7CisgICAgICAgICAgICAgICAgcmVhZGVyLnNlbGZSZWYoKS5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZWFkZXI7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlUmVhZGVyQnVpbGRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVJlYWRlckJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhNzRmMC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlUmVhZGVyQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5DaHVua0NhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93SW5kZXhFbnRyeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5WYWxpZGF0aW9uTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVJbnB1dFN0cmVhbVBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuKjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyLk9wZW5SZWFzb24uTk9STUFMOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNTVGFibGVSZWFkZXJCdWlsZGVyCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNTVGFibGVSZWFkZXJCdWlsZGVyLmNsYXNzKTsKLQotICAgIHByb3RlY3RlZCBmaW5hbCBTU1RhYmxlUmVhZGVyLkZhY3RvcnkgcmVhZGVyRmFjdG9yeTsKLSAgICBwcm90ZWN0ZWQgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotICAgIHByb3RlY3RlZCBmaW5hbCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhUmVmOwotICAgIHByb3RlY3RlZCBmaW5hbCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhOwotICAgIHByb3RlY3RlZCBmaW5hbCBsb25nIG1heERhdGFBZ2U7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHM7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFN0YXRzTWV0YWRhdGEgc3RhdHNNZXRhZGF0YTsKLSAgICBwcm90ZWN0ZWQgZmluYWwgU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uIG9wZW5SZWFzb247Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyOwotCi0gICAgcHJvdGVjdGVkIEluZGV4U3VtbWFyeSBzdW1tYXJ5OwotICAgIHByb3RlY3RlZCBEZWNvcmF0ZWRLZXkgZmlyc3Q7Ci0gICAgcHJvdGVjdGVkIERlY29yYXRlZEtleSBsYXN0OwotICAgIHByb3RlY3RlZCBJRmlsdGVyIGJmOwotICAgIHByb3RlY3RlZCBGaWxlSGFuZGxlIGlmaWxlOwotICAgIHByb3RlY3RlZCBGaWxlSGFuZGxlIGRmaWxlOwotCi0gICAgcHVibGljIFNTVGFibGVSZWFkZXJCdWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YVJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBtYXhEYXRhQWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0c01ldGFkYXRhIHN0YXRzTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbiBvcGVuUmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcikKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgIHRoaXMubWV0YWRhdGFSZWYgPSBtZXRhZGF0YVJlZjsKLSAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhUmVmLmdldCgpOwotICAgICAgICB0aGlzLm1heERhdGFBZ2UgPSBtYXhEYXRhQWdlOwotICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSBjb21wb25lbnRzOwotICAgICAgICB0aGlzLnN0YXRzTWV0YWRhdGEgPSBzdGF0c01ldGFkYXRhOwotICAgICAgICB0aGlzLm9wZW5SZWFzb24gPSBvcGVuUmVhc29uOwotICAgICAgICB0aGlzLmhlYWRlciA9IGhlYWRlcjsKLSAgICAgICAgdGhpcy5yZWFkZXJGYWN0b3J5ID0gZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5nZXRSZWFkZXJGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IFNTVGFibGVSZWFkZXIgYnVpbGQoKTsKLQotICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyQnVpbGRlciBkZmlsZShGaWxlSGFuZGxlIGRmaWxlKQotICAgIHsKLSAgICAgICAgdGhpcy5kZmlsZSA9IGRmaWxlOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU1NUYWJsZVJlYWRlckJ1aWxkZXIgaWZpbGUoRmlsZUhhbmRsZSBpZmlsZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuaWZpbGUgPSBpZmlsZTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFNTVGFibGVSZWFkZXJCdWlsZGVyIGJmKElGaWx0ZXIgYmYpCi0gICAgewotICAgICAgICB0aGlzLmJmID0gYmY7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyQnVpbGRlciBzdW1tYXJ5KEluZGV4U3VtbWFyeSBzdW1tYXJ5KQotICAgIHsKLSAgICAgICAgdGhpcy5zdW1tYXJ5ID0gc3VtbWFyeTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTG9hZCBpbmRleCBzdW1tYXJ5LCBmaXJzdCBrZXkgYW5kIGxhc3Qga2V5IGZyb20gU3VtbWFyeS5kYiBmaWxlIGlmIGl0IGV4aXN0cy4KLSAgICAgKgotICAgICAqIGlmIGxvYWRlZCBpbmRleCBzdW1tYXJ5IGhhcyBkaWZmZXJlbnQgaW5kZXggaW50ZXJ2YWwgZnJvbSBjdXJyZW50IHZhbHVlIHN0b3JlZCBpbiBzY2hlbWEsCi0gICAgICogdGhlbiBTdW1tYXJ5LmRiIGZpbGUgd2lsbCBiZSBkZWxldGVkIGFuZCBuZWVkIHRvIGJlIHJlYnVpbHQuCi0gICAgICovCi0gICAgdm9pZCBsb2FkU3VtbWFyeSgpCi0gICAgewotICAgICAgICBGaWxlIHN1bW1hcmllc0ZpbGUgPSBuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVU1NQVJZKSk7Ci0gICAgICAgIGlmICghc3VtbWFyaWVzRmlsZS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQotICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiU1NUYWJsZSBTdW1tYXJ5IEZpbGUge30gZG9lcyBub3QgZXhpc3QiLCBzdW1tYXJpZXNGaWxlLmFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIERhdGFJbnB1dFN0cmVhbSBpU3RyZWFtID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlTdHJlYW0gPSBuZXcgRGF0YUlucHV0U3RyZWFtKEZpbGVzLm5ld0lucHV0U3RyZWFtKHN1bW1hcmllc0ZpbGUudG9QYXRoKCkpKTsKLSAgICAgICAgICAgIHN1bW1hcnkgPSBJbmRleFN1bW1hcnkuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnBhcnRpdGlvbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnBhcmFtcy5taW5JbmRleEludGVydmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnBhcmFtcy5tYXhJbmRleEludGVydmFsKTsKLSAgICAgICAgICAgIGZpcnN0ID0gbWV0YWRhdGEucGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhMZW5ndGgoaVN0cmVhbSkpOwotICAgICAgICAgICAgbGFzdCA9IG1ldGFkYXRhLnBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoTGVuZ3RoKGlTdHJlYW0pKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN1bW1hcnkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzdW1tYXJ5LmNsb3NlKCk7Ci0gICAgICAgICAgICBsb2dnZXIudHJhY2UoIkNhbm5vdCBkZXNlcmlhbGl6ZSBTU1RhYmxlIFN1bW1hcnkgRmlsZSB7fToge30iLCBzdW1tYXJpZXNGaWxlLnBhdGgoKSwgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICAgICAgLy8gY29ycnVwdGVkOyBkZWxldGUgaXQgYW5kIGZhbGwgYmFjayB0byBjcmVhdGluZyBhIG5ldyBzdW1tYXJ5Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGlTdHJlYW0pOwotICAgICAgICAgICAgLy8gZGVsZXRlIGl0IGFuZCBmYWxsIGJhY2sgdG8gY3JlYXRpbmcgYSBuZXcgc3VtbWFyeQotICAgICAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVdpdGhDb25maXJtKHN1bW1hcmllc0ZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShpU3RyZWFtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIGluZGV4IHN1bW1hcnksIGZpcnN0IGtleSwgbGFzdCBrZXkgaWYge0Bjb2RlIHN1bW1hcnlMb2FkZWR9IGlzIGZhbHNlIGFuZCByZWNyZWF0ZSBibG9vbSBmaWx0ZXIgaWYKLSAgICAgKiB7QGNvZGUgcmVjcmV0ZUJsb29tRmlsdGVyfSBpcyB0cnVlIGJ5IHJlYWRpbmcgdGhyb3VnaCBJbmRleC5kYiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlY3JlYXRlQmxvb21GaWx0ZXIgdHJ1ZSBpZiByZWNyZWF0ZSBibG9vbSBmaWx0ZXIKLSAgICAgKiBAcGFyYW0gc3VtbWFyeUxvYWRlZCB0cnVlIGlmIGluZGV4IHN1bW1hcnksIGZpcnN0IGtleSBhbmQgbGFzdCBrZXkgYXJlIGFscmVhZHkgbG9hZGVkIGFuZCBub3QgbmVlZCB0byBidWlsZCBhZ2FpbgotICAgICAqLwotICAgIHZvaWQgYnVpbGRTdW1tYXJ5QW5kQmxvb21GaWx0ZXIoYm9vbGVhbiByZWNyZWF0ZUJsb29tRmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdW1tYXJ5TG9hZGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgc3RhdHNNZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiQXR0ZW1wdGluZyB0byBidWlsZCBzdW1tYXJ5IGZvciB7fSIsIGRlc2NyaXB0b3IpOwotCi0KLSAgICAgICAgLy8gd2UgcmVhZCB0aGUgcG9zaXRpb25zIGluIGEgQlJBRiBzbyB3ZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGFuIGVudHJ5IHNwYW5uaW5nIGEgbW1hcCBib3VuZGFyeS4KLSAgICAgICAgdHJ5IChSYW5kb21BY2Nlc3NSZWFkZXIgcHJpbWFyeUluZGV4ID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4obmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpKSkKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZyBpbmRleFNpemUgPSBwcmltYXJ5SW5kZXgubGVuZ3RoKCk7Ci0gICAgICAgICAgICBsb25nIGhpc3RvZ3JhbUNvdW50ID0gc3RhdHNNZXRhZGF0YS5lc3RpbWF0ZWRQYXJ0aXRpb25TaXplLmNvdW50KCk7Ci0gICAgICAgICAgICBsb25nIGVzdGltYXRlZEtleXMgPSBoaXN0b2dyYW1Db3VudCA+IDAgJiYgIXN0YXRzTWV0YWRhdGEuZXN0aW1hdGVkUGFydGl0aW9uU2l6ZS5pc092ZXJmbG93ZWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBoaXN0b2dyYW1Db3VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTU1RhYmxlLmVzdGltYXRlUm93c0Zyb21JbmRleChwcmltYXJ5SW5kZXgsIGRlc2NyaXB0b3IpOyAvLyBzdGF0aXN0aWNzIGlzIHN1cHBvc2VkIHRvIGJlIG9wdGlvbmFsCi0KLSAgICAgICAgICAgIGlmIChyZWNyZWF0ZUJsb29tRmlsdGVyKQotICAgICAgICAgICAgICAgIGJmID0gRmlsdGVyRmFjdG9yeS5nZXRGaWx0ZXIoZXN0aW1hdGVkS2V5cywgbWV0YWRhdGEucGFyYW1zLmJsb29tRmlsdGVyRnBDaGFuY2UpOwotCi0gICAgICAgICAgICB0cnkgKEluZGV4U3VtbWFyeUJ1aWxkZXIgc3VtbWFyeUJ1aWxkZXIgPSBzdW1tYXJ5TG9hZGVkID8gbnVsbCA6IG5ldyBJbmRleFN1bW1hcnlCdWlsZGVyKGVzdGltYXRlZEtleXMsIG1ldGFkYXRhLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBEb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBpbmRleFBvc2l0aW9uOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKChpbmRleFBvc2l0aW9uID0gcHJpbWFyeUluZGV4LmdldEZpbGVQb2ludGVyKCkpICE9IGluZGV4U2l6ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChwcmltYXJ5SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIuc2tpcChwcmltYXJ5SW5kZXgsIGRlc2NyaXB0b3IudmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBkZWNvcmF0ZWRLZXkgPSBtZXRhZGF0YS5wYXJ0aXRpb25lci5kZWNvcmF0ZUtleShrZXkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghc3VtbWFyeUxvYWRlZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBkZWNvcmF0ZWRLZXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gZGVjb3JhdGVkS2V5OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3JlYXRlQmxvb21GaWx0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICBiZi5hZGQoZGVjb3JhdGVkS2V5KTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBpZiBzdW1tYXJ5IHdhcyBhbHJlYWR5IHJlYWQgZnJvbSBkaXNrIHdlIGRvbid0IHdhbnQgdG8gcmUtcG9wdWxhdGUgaXQgdXNpbmcgcHJpbWFyeSBpbmRleAotICAgICAgICAgICAgICAgICAgICBpZiAoIXN1bW1hcnlMb2FkZWQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlCdWlsZGVyLm1heWJlQWRkRW50cnkoZGVjb3JhdGVkS2V5LCBpbmRleFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghc3VtbWFyeUxvYWRlZCkKLSAgICAgICAgICAgICAgICAgICAgc3VtbWFyeSA9IHN1bW1hcnlCdWlsZGVyLmJ1aWxkKG1ldGFkYXRhLnBhcnRpdGlvbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc3VtbWFyeUxvYWRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgZmlyc3QgPSBTU1RhYmxlLmdldE1pbmltYWxLZXkoZmlyc3QpOwotICAgICAgICAgICAgbGFzdCA9IFNTVGFibGUuZ2V0TWluaW1hbEtleShsYXN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvYWQgYmxvb20gZmlsdGVyIGZyb20gRmlsdGVyLmRiIGZpbGUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICovCi0gICAgSUZpbHRlciBsb2FkQmxvb21GaWx0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeSAoRmlsZUlucHV0U3RyZWFtUGx1cyBzdHJlYW0gPSBuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5GSUxURVIpKS5uZXdJbnB1dFN0cmVhbSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmRlc2VyaWFsaXplKHN0cmVhbSwgZGVzY3JpcHRvci52ZXJzaW9uLmhhc09sZEJmRm9ybWF0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JXcml0ZXIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyQnVpbGRlcgotICAgIHsKLSAgICAgICAgcHVibGljIEZvcldyaXRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YVJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG1heERhdGFBZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0c01ldGFkYXRhIHN0YXRzTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uIG9wZW5SZWFzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGRlc2NyaXB0b3IsIG1ldGFkYXRhUmVmLCBtYXhEYXRhQWdlLCBjb21wb25lbnRzLCBzdGF0c01ldGFkYXRhLCBvcGVuUmVhc29uLCBoZWFkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIGJ1aWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSByZWFkZXJGYWN0b3J5Lm9wZW4odGhpcyk7Ci0KLSAgICAgICAgICAgIHJlYWRlci5zZXR1cCh0cnVlKTsKLSAgICAgICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvckJhdGNoIGV4dGVuZHMgU1NUYWJsZVJlYWRlckJ1aWxkZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBGb3JCYXRjaChEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhUmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgc3RhdHNNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihkZXNjcmlwdG9yLCBtZXRhZGF0YVJlZiwgY3VycmVudFRpbWVNaWxsaXMoKSwgY29tcG9uZW50cywgc3RhdHNNZXRhZGF0YSwgTk9STUFMLCBoZWFkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIGJ1aWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGRhdGFGaWxlUGF0aCA9IGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpOwotICAgICAgICAgICAgbG9uZyBmaWxlTGVuZ3RoID0gbmV3IEZpbGUoZGF0YUZpbGVQYXRoKS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJPcGVuaW5nIHt9ICh7fSkiLCBkZXNjcmlwdG9yLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShmaWxlTGVuZ3RoKSk7Ci0KLSAgICAgICAgICAgIGluaXRTdW1tYXJ5KGRhdGFGaWxlUGF0aCwgY29tcG9uZW50cywgc3RhdHNNZXRhZGF0YSk7Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gY29tcHJlc3Npb24gPSBjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5DT01QUkVTU0lPTl9JTkZPKTsKLSAgICAgICAgICAgIHRyeSAoRmlsZUhhbmRsZS5CdWlsZGVyIGlidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkKLSAgICAgICAgICAgICAgICAgICAgLm1tYXBwZWQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluZGV4QWNjZXNzTW9kZSgpID09IENvbmZpZy5EaXNrQWNjZXNzTW9kZS5tbWFwKQotICAgICAgICAgICAgICAgICAgICAud2l0aENodW5rQ2FjaGUoQ2h1bmtDYWNoZS5pbnN0YW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUuQnVpbGRlciBkYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpLmNvbXByZXNzZWQoY29tcHJlc3Npb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1tYXBwZWQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldERpc2tBY2Nlc3NNb2RlKCkgPT0gQ29uZmlnLkRpc2tBY2Nlc3NNb2RlLm1tYXApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDaHVua0NhY2hlKENodW5rQ2FjaGUuaW5zdGFuY2UpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgaW5kZXhGaWxlTGVuZ3RoID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgIERpc2tPcHRpbWl6YXRpb25TdHJhdGVneSBvcHRpbWl6YXRpb25TdHJhdGVneSA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXREaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3koKTsKLSAgICAgICAgICAgICAgICBpbnQgZGF0YUJ1ZmZlclNpemUgPSBvcHRpbWl6YXRpb25TdHJhdGVneS5idWZmZXJTaXplKHN0YXRzTWV0YWRhdGEuZXN0aW1hdGVkUGFydGl0aW9uU2l6ZS5wZXJjZW50aWxlKERhdGFiYXNlRGVzY3JpcHRvci5nZXREaXNrT3B0aW1pemF0aW9uRXN0aW1hdGVQZXJjZW50aWxlKCkpKTsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXhCdWZmZXJTaXplID0gb3B0aW1pemF0aW9uU3RyYXRlZ3kuYnVmZmVyU2l6ZShpbmRleEZpbGVMZW5ndGggLyBzdW1tYXJ5LnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgaWZpbGUgPSBpYnVpbGRlci5idWZmZXJTaXplKGluZGV4QnVmZmVyU2l6ZSkuY29tcGxldGUoKTsKLSAgICAgICAgICAgICAgICBkZmlsZSA9IGRidWlsZGVyLmJ1ZmZlclNpemUoZGF0YUJ1ZmZlclNpemUpLmNvbXBsZXRlKCk7Ci0gICAgICAgICAgICAgICAgYmYgPSBGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQ7Ci0KLSAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSByZWFkZXJGYWN0b3J5Lm9wZW4odGhpcyk7Ci0KLSAgICAgICAgICAgICAgICBzc3RhYmxlLmZpcnN0ID0gZmlyc3Q7Ci0gICAgICAgICAgICAgICAgc3N0YWJsZS5sYXN0ID0gbGFzdDsKLQotICAgICAgICAgICAgICAgIHNzdGFibGUuc2V0dXAoZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBzc3RhYmxlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBpbml0U3VtbWFyeShTdHJpbmcgZGF0YUZpbGVQYXRoLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzLCBTdGF0c01ldGFkYXRhIHN0YXRzTWV0YWRhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvYWRTdW1tYXJ5KCk7Ci0gICAgICAgICAgICBpZiAoc3VtbWFyeSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRTdW1tYXJ5QW5kQmxvb21GaWx0ZXIoZmFsc2UsIGZhbHNlLCBjb21wb25lbnRzLCBzdGF0c01ldGFkYXRhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgZGF0YUZpbGVQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvclJlYWQgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyQnVpbGRlcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBWYWxpZGF0aW9uTWV0YWRhdGEgdmFsaWRhdGlvbk1ldGFkYXRhOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNPZmZsaW5lOwotCi0gICAgICAgIHB1YmxpYyBGb3JSZWFkKERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YVJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvbk1ldGFkYXRhIHZhbGlkYXRpb25NZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc09mZmxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgc3RhdHNNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGRlc2NyaXB0b3IsIG1ldGFkYXRhUmVmLCBjdXJyZW50VGltZU1pbGxpcygpLCBjb21wb25lbnRzLCBzdGF0c01ldGFkYXRhLCBOT1JNQUwsIGhlYWRlcik7Ci0gICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25NZXRhZGF0YSA9IHZhbGlkYXRpb25NZXRhZGF0YTsKLSAgICAgICAgICAgIHRoaXMuaXNPZmZsaW5lID0gaXNPZmZsaW5lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIGJ1aWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGRhdGFGaWxlUGF0aCA9IGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpOwotICAgICAgICAgICAgbG9uZyBmaWxlTGVuZ3RoID0gbmV3IEZpbGUoZGF0YUZpbGVQYXRoKS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJPcGVuaW5nIHt9ICh7fSkiLCBkZXNjcmlwdG9yLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShmaWxlTGVuZ3RoKSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGxvYWQgaW5kZXggYW5kIGZpbHRlcgotICAgICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBuYW5vVGltZSgpOwotICAgICAgICAgICAgICAgIGxvYWQodmFsaWRhdGlvbk1ldGFkYXRhLCBpc09mZmxpbmUsIGNvbXBvbmVudHMsIERhdGFiYXNlRGVzY3JpcHRvci5nZXREaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3koKSwgc3RhdHNNZXRhZGF0YSk7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJJTkRFWCBMT0FEIFRJTUUgZm9yIHt9OiB7fSBtcy4iLCBkZXNjcmlwdG9yLCBUaW1lVW5pdC5OQU5PU0VDT05EUy50b01pbGxpcyhuYW5vVGltZSgpIC0gc3RhcnQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbih0LCBkYXRhRmlsZVBhdGgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSByZWFkZXJGYWN0b3J5Lm9wZW4odGhpcyk7Ci0KLSAgICAgICAgICAgIHNzdGFibGUuZmlyc3QgPSBmaXJzdDsKLSAgICAgICAgICAgIHNzdGFibGUubGFzdCA9IGxhc3Q7Ci0KLSAgICAgICAgICAgIHNzdGFibGUuc2V0dXAoIWlzT2ZmbGluZSk7IC8vIERvbid0IHRyYWNrIGhvdG5lc3MgaWYgd2UncmUgb2ZmbGluZS4KLSAgICAgICAgICAgIHJldHVybiBzc3RhYmxlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEBwYXJhbSB2YWxpZGF0aW9uIE1ldGFkYXRhIGZvciBTU1RhYmxlIGJlaW5nIGxvYWRlZAotICAgICAgICAgKiBAcGFyYW0gaXNPZmZsaW5lIFdoZXRoZXIgdGhlIFNTVGFibGUgaXMgYmVpbmcgbG9hZGVkIGJ5IGFuIG9mZmxpbmUgdG9vbCAoc3N0YWJsZWR1bXAsIHNjcnViLCBldGMpCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIHZvaWQgbG9hZChWYWxpZGF0aW9uTWV0YWRhdGEgdmFsaWRhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc09mZmxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIERpc2tPcHRpbWl6YXRpb25TdHJhdGVneSBvcHRpbWl6YXRpb25TdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzdGF0c01ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1ldGFkYXRhLnBhcmFtcy5ibG9vbUZpbHRlckZwQ2hhbmNlID09IDEuMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBiZiBpcyBkaXNhYmxlZC4KLSAgICAgICAgICAgICAgICBsb2FkKGZhbHNlLCAhaXNPZmZsaW5lLCBvcHRpbWl6YXRpb25TdHJhdGVneSwgc3RhdHNNZXRhZGF0YSwgY29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgYmYgPSBGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICghY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpIC8vIFdoYXQgaGFwcGVucyBpZiBmaWx0ZXIgY29tcG9uZW50IGFuZCBwcmltYXJ5IGluZGV4IGlzIG1pc3Npbmc/Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gYXZvaWQgYW55IHJlYWRpbmcgb2YgdGhlIG1pc3NpbmcgcHJpbWFyeSBpbmRleCBjb21wb25lbnQuCi0gICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgb25seSBoYXBwZW4gZHVyaW5nIFN0YW5kYWxvbmVTY3J1YmJlcgotICAgICAgICAgICAgICAgIGxvYWQoZmFsc2UsICFpc09mZmxpbmUsIG9wdGltaXphdGlvblN0cmF0ZWd5LCBzdGF0c01ldGFkYXRhLCBjb21wb25lbnRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCFjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5GSUxURVIpIHx8IHZhbGlkYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBiZiBpcyBlbmFibGVkLCBidXQgZmlsdGVyIGNvbXBvbmVudCBpcyBtaXNzaW5nLgotICAgICAgICAgICAgICAgIGxvYWQoIWlzT2ZmbGluZSwgIWlzT2ZmbGluZSwgb3B0aW1pemF0aW9uU3RyYXRlZ3ksIHN0YXRzTWV0YWRhdGEsIGNvbXBvbmVudHMpOwotICAgICAgICAgICAgICAgIGlmIChpc09mZmxpbmUpCi0gICAgICAgICAgICAgICAgICAgIGJmID0gRmlsdGVyRmFjdG9yeS5BbHdheXNQcmVzZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGJmIGlzIGVuYWJsZWQgYW5kIGZwIGNoYW5jZSBtYXRjaGVzIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCB2YWx1ZS4KLSAgICAgICAgICAgICAgICBsb2FkKGZhbHNlLCAhaXNPZmZsaW5lLCBvcHRpbWl6YXRpb25TdHJhdGVneSwgc3RhdHNNZXRhZGF0YSwgY29tcG9uZW50cyk7Ci0gICAgICAgICAgICAgICAgYmYgPSBsb2FkQmxvb21GaWx0ZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBMb2FkcyBpZmlsZSwgZGZpbGUgYW5kIGluZGV4U3VtbWFyeSwgYW5kIG9wdGlvbmFsbHkgcmVjcmVhdGVzIGFuZCBwZXJzaXN0cyB0aGUgYmxvb20gZmlsdGVyLgotICAgICAgICAgKiBAcGFyYW0gcmVjcmVhdGVCbG9vbUZpbHRlciBSZWNyZWF0ZSB0aGUgYmxvb21maWx0ZXIuCi0gICAgICAgICAqIEBwYXJhbSBzYXZlU3VtbWFyeUlmQ3JlYXRlZCBmb3IgYnVsayBsb2FkaW5nIHB1cnBvc2VzLCBpZiB0aGUgc3VtbWFyeSB3YXMgYWJzZW50IGFuZCBuZWVkZWQgdG8gYmUgYnVpbHQsIHlvdSBjYW4KLSAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2b2lkIHBlcnNpc3RpbmcgaXQgdG8gZGlzayBieSBzZXR0aW5nIHRoaXMgdG8gZmFsc2UKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgbG9hZChib29sZWFuIHJlY3JlYXRlQmxvb21GaWx0ZXIsCi0gICAgICAgICAgICAgICAgICBib29sZWFuIHNhdmVTdW1tYXJ5SWZDcmVhdGVkLAotICAgICAgICAgICAgICAgICAgRGlza09wdGltaXphdGlvblN0cmF0ZWd5IG9wdGltaXphdGlvblN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzdGF0c01ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeShGaWxlSGFuZGxlLkJ1aWxkZXIgaWJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpKQotICAgICAgICAgICAgICAgICAgICAubW1hcHBlZChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW5kZXhBY2Nlc3NNb2RlKCkgPT0gQ29uZmlnLkRpc2tBY2Nlc3NNb2RlLm1tYXApCi0gICAgICAgICAgICAgICAgICAgIC53aXRoQ2h1bmtDYWNoZShDaHVua0NhY2hlLmluc3RhbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgRmlsZUhhbmRsZS5CdWlsZGVyIGRidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSkuY29tcHJlc3NlZChjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5DT01QUkVTU0lPTl9JTkZPKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubW1hcHBlZChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGlza0FjY2Vzc01vZGUoKSA9PSBDb25maWcuRGlza0FjY2Vzc01vZGUubW1hcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENodW5rQ2FjaGUoQ2h1bmtDYWNoZS5pbnN0YW5jZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9hZFN1bW1hcnkoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGJ1aWxkU3VtbWFyeSA9IHN1bW1hcnkgPT0gbnVsbCB8fCByZWNyZWF0ZUJsb29tRmlsdGVyOwotICAgICAgICAgICAgICAgIGlmIChidWlsZFN1bW1hcnkpCi0gICAgICAgICAgICAgICAgICAgIGJ1aWxkU3VtbWFyeUFuZEJsb29tRmlsdGVyKHJlY3JlYXRlQmxvb21GaWx0ZXIsIHN1bW1hcnkgIT0gbnVsbCwgY29tcG9uZW50cywgc3RhdHNNZXRhZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgZGF0YUJ1ZmZlclNpemUgPSBvcHRpbWl6YXRpb25TdHJhdGVneS5idWZmZXJTaXplKHN0YXRzTWV0YWRhdGEuZXN0aW1hdGVkUGFydGl0aW9uU2l6ZS5wZXJjZW50aWxlKERhdGFiYXNlRGVzY3JpcHRvci5nZXREaXNrT3B0aW1pemF0aW9uRXN0aW1hdGVQZXJjZW50aWxlKCkpKTsKLQotICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgaW5kZXhGaWxlTGVuZ3RoID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuUFJJTUFSWV9JTkRFWCkpLmxlbmd0aCgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhCdWZmZXJTaXplID0gb3B0aW1pemF0aW9uU3RyYXRlZ3kuYnVmZmVyU2l6ZShpbmRleEZpbGVMZW5ndGggLyBzdW1tYXJ5LnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmaWxlID0gaWJ1aWxkZXIuYnVmZmVyU2l6ZShpbmRleEJ1ZmZlclNpemUpLmNvbXBsZXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGZpbGUgPSBkYnVpbGRlci5idWZmZXJTaXplKGRhdGFCdWZmZXJTaXplKS5jb21wbGV0ZSgpOwotCi0gICAgICAgICAgICAgICAgaWYgKGJ1aWxkU3VtbWFyeSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzYXZlU3VtbWFyeUlmQ3JlYXRlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIuc2F2ZVN1bW1hcnkoZGVzY3JpcHRvciwgZmlyc3QsIGxhc3QsIHN1bW1hcnkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVjcmVhdGVCbG9vbUZpbHRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIuc2F2ZUJsb29tRmlsdGVyKGRlc2NyaXB0b3IsIGJmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCi0gICAgICAgICAgICB7IC8vIEJlY2F1c2UgdGhlIHRpZGllciBoYXMgbm90IGJlZW4gc2V0LXVwIHlldCBpbiBTU1RhYmxlUmVhZGVyLm9wZW4oKSwgd2UgbXVzdCByZWxlYXNlIHRoZSBmaWxlcyBpbiBjYXNlIG9mIGVycm9yCi0gICAgICAgICAgICAgICAgaWYgKGlmaWxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZmlsZS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChkZmlsZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGZpbGUuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3VtbWFyeSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3VtbWFyeS5jbG9zZSgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRocm93IHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZGQ4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQ2h1bmtDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklPT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLktleVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuVmFsaWRhdGlvbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuVGFibGVNZXRyaWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2s7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3Rvcmllcy5TRUNPTkRBUllfSU5ERVhfTkFNRV9TRVBBUkFUT1I7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXIuT3BlblJlYXNvbi5OT1JNQUw7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXI8UiBleHRlbmRzIFNTVGFibGVSZWFkZXIsIEIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyLkJ1aWxkZXI8UiwgQj4+Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNTVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlci5jbGFzcyk7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yOworICAgIHByb3RlY3RlZCBmaW5hbCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzOworICAgIHByb3RlY3RlZCBmaW5hbCBUYWJsZU1ldGFkYXRhUmVmIHRhYmxlTWV0YWRhdGFSZWY7CisgICAgcHJvdGVjdGVkIGZpbmFsIElPT3B0aW9ucyBpb09wdGlvbnM7CisgICAgcHJvdGVjdGVkIGZpbmFsIENodW5rQ2FjaGUgY2h1bmtDYWNoZTsKKworICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIoU1NUYWJsZS5CdWlsZGVyPD8sID8+IGJ1aWxkZXIpCisgICAgeworICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBidWlsZGVyLmRlc2NyaXB0b3I7CisgICAgICAgIHRoaXMuY29tcG9uZW50cyA9IGJ1aWxkZXIuZ2V0Q29tcG9uZW50cygpICE9IG51bGwgPyBJbW11dGFibGVTZXQuY29weU9mKGJ1aWxkZXIuZ2V0Q29tcG9uZW50cygpKSA6IFRPQ0NvbXBvbmVudC5sb2FkT3JDcmVhdGUodGhpcy5kZXNjcmlwdG9yKTsKKyAgICAgICAgdGhpcy50YWJsZU1ldGFkYXRhUmVmID0gYnVpbGRlci5nZXRUYWJsZU1ldGFkYXRhUmVmKCkgIT0gbnVsbCA/IGJ1aWxkZXIuZ2V0VGFibGVNZXRhZGF0YVJlZigpIDogcmVzb2x2ZVRhYmxlTWV0YWRhdGFSZWYoKTsKKyAgICAgICAgdGhpcy5pb09wdGlvbnMgPSBidWlsZGVyLmdldElPT3B0aW9ucygpICE9IG51bGwgPyBidWlsZGVyLmdldElPT3B0aW9ucygpIDogSU9PcHRpb25zLmZyb21EYXRhYmFzZURlc2NyaXB0b3IoKTsKKyAgICAgICAgdGhpcy5jaHVua0NhY2hlID0gYnVpbGRlci5nZXRDaHVua0NhY2hlKCkgIT0gbnVsbCA/IGJ1aWxkZXIuZ2V0Q2h1bmtDYWNoZSgpIDogQ2h1bmtDYWNoZS5pbnN0YW5jZTsKKworICAgICAgICBjaGVja05vdE51bGwodGhpcy5jb21wb25lbnRzKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHRoaXMudGFibGVNZXRhZGF0YVJlZik7CisgICAgfQorCisgICAgcHVibGljIFIgYnVpbGQoU1NUYWJsZS5Pd25lciBvd25lciwgYm9vbGVhbiB2YWxpZGF0ZSwgYm9vbGVhbiBvbmxpbmUpCisgICAgeworICAgICAgICBjaGVja0FyZ3VtZW50KGNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50cy5EQVRBKSwgIkRhdGEgY29tcG9uZW50IGlzIG1pc3NpbmcgZm9yIHNzdGFibGUgJXMiLCBkZXNjcmlwdG9yKTsKKyAgICAgICAgaWYgKHZhbGlkYXRlKQorICAgICAgICAgICAgY2hlY2tBcmd1bWVudCh0aGlzLmNvbXBvbmVudHMuY29udGFpbnNBbGwoZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5wcmltYXJ5Q29tcG9uZW50cygpKSwgIlNvbWUgcmVxdWlyZWQgY29tcG9uZW50cyAoJXMpIGFyZSBtaXNzaW5nIGZvciBzc3RhYmxlICVzIiwgU2V0cy5kaWZmZXJlbmNlKGRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkucHJpbWFyeUNvbXBvbmVudHMoKSwgdGhpcy5jb21wb25lbnRzKSwgZGVzY3JpcHRvcik7CisKKyAgICAgICAgQiBidWlsZGVyID0gKEIpIGRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuZ2V0UmVhZGVyRmFjdG9yeSgpLmJ1aWxkZXIoZGVzY3JpcHRvcik7CisgICAgICAgIGJ1aWxkZXIuc2V0T3BlblJlYXNvbihOT1JNQUwpOworICAgICAgICBidWlsZGVyLnNldE1heERhdGFBZ2UoQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBidWlsZGVyLnNldFRhYmxlTWV0YWRhdGFSZWYodGFibGVNZXRhZGF0YVJlZik7CisgICAgICAgIGJ1aWxkZXIuc2V0Q29tcG9uZW50cyhjb21wb25lbnRzKTsKKworICAgICAgICBSIHJlYWRlciA9IG51bGw7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIENvbXByZXNzaW9uSW5mb0NvbXBvbmVudC52ZXJpZnlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2VJZkFwcGxpY2FibGUoZGVzY3JpcHRvciwgYnVpbGRlci5nZXRDb21wb25lbnRzKCkpOworCisgICAgICAgICAgICBsb25nIHQwID0gQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgICAgIG9wZW5Db21wb25lbnRzKGJ1aWxkZXIsIG93bmVyLCB2YWxpZGF0ZSwgb25saW5lKTsKKworICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiU1NUYWJsZSB7fSBsb2FkZWQgaW4ge31tcyIsIGRlc2NyaXB0b3IsIENsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpcygpIC0gdDApOworCisgICAgICAgICAgICByZWFkZXIgPSBidWlsZGVyLmJ1aWxkKG93bmVyLCB2YWxpZGF0ZSwgb25saW5lKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlYWRlcjsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uIHwgRXJyb3IgZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZWFkZXIuc2VsZlJlZigpLnJlbGVhc2UoKTsKKworICAgICAgICAgICAgSlZNU3RhYmlsaXR5SW5zcGVjdG9yLmluc3BlY3RUaHJvd2FibGUoZXgpOworCisgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbikKKyAgICAgICAgICAgICAgICB0aHJvdyAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24pIGV4OworCisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZXgsIGRlc2NyaXB0b3IuYmFzZUZpbGUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgS2V5UmVhZGVyIGJ1aWxkS2V5UmVhZGVyKFRhYmxlTWV0cmljcyB0YWJsZU1ldHJpY3MpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIG9wZW5Db21wb25lbnRzKEIgYnVpbGRlciwgU1NUYWJsZS5Pd25lciBvd25lciwgYm9vbGVhbiB2YWxpZGF0ZSwgYm9vbGVhbiBvbmxpbmUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHNzdGFibGUgaXMgY3JlYXRlZCB1c2luZyBzYW1lIHBhcnRpdGlvbmVyLgorICAgICAqIFBhcnRpdGlvbmVyIGNhbiBiZSBudWxsLCB3aGljaCBpbmRpY2F0ZXMgb2xkZXIgdmVyc2lvbiBvZiBzc3RhYmxlIG9yIG5vIHN0YXRzIGF2YWlsYWJsZS4KKyAgICAgKiBJbiB0aGF0IGNhc2UsIHdlIHNraXAgdGhlIGNoZWNrLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFydGl0aW9uZXIoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgVmFsaWRhdGlvbk1ldGFkYXRhIHZhbGlkYXRpb25NZXRhZGF0YSkKKyAgICB7CisgICAgICAgIFN0cmluZyBwYXJ0aXRpb25lck5hbWUgPSBtZXRhZGF0YS5wYXJ0aXRpb25lci5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKTsKKyAgICAgICAgaWYgKHZhbGlkYXRpb25NZXRhZGF0YSAhPSBudWxsICYmICFwYXJ0aXRpb25lck5hbWUuZXF1YWxzKHZhbGlkYXRpb25NZXRhZGF0YS5wYXJ0aXRpb25lcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQ2Fubm90IG9wZW4gJXM7IHBhcnRpdGlvbmVyICVzIGRvZXMgbm90IG1hdGNoIHN5c3RlbSBwYXJ0aXRpb25lciAlcy4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdGUgdGhhdCB0aGUgZGVmYXVsdCBwYXJ0aXRpb25lciBzdGFydGluZyB3aXRoIENhc3NhbmRyYSAxLjIgaXMgTXVybXVyM1BhcnRpdGlvbmVyLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic28geW91IHdpbGwgbmVlZCB0byBlZGl0IHRoYXQgdG8gbWF0Y2ggeW91ciBvbGQgcGFydGl0aW9uZXIgaWYgdXBncmFkaW5nLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciwgdmFsaWRhdGlvbk1ldGFkYXRhLnBhcnRpdGlvbmVyLCBwYXJ0aXRpb25lck5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBUYWJsZU1ldGFkYXRhUmVmIHJlc29sdmVUYWJsZU1ldGFkYXRhUmVmKCkKKyAgICB7CisgICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGE7CisgICAgICAgIGlmIChkZXNjcmlwdG9yLmNmbmFtZS5jb250YWlucyhTRUNPTkRBUllfSU5ERVhfTkFNRV9TRVBBUkFUT1IpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaSA9IGRlc2NyaXB0b3IuY2ZuYW1lLmluZGV4T2YoU0VDT05EQVJZX0lOREVYX05BTUVfU0VQQVJBVE9SKTsKKyAgICAgICAgICAgIFN0cmluZyBpbmRleE5hbWUgPSBkZXNjcmlwdG9yLmNmbmFtZS5zdWJzdHJpbmcoaSArIDEpOworICAgICAgICAgICAgbWV0YWRhdGEgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0SW5kZXhUYWJsZU1ldGFkYXRhUmVmKGRlc2NyaXB0b3Iua3NuYW1lLCBpbmRleE5hbWUpOworICAgICAgICAgICAgaWYgKG1ldGFkYXRhID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJDb3VsZCBub3QgZmluZCBpbmRleCBtZXRhZGF0YSBmb3IgaW5kZXggY2YgIiArIGkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWV0YWRhdGEgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0VGFibGVNZXRhZGF0YVJlZihkZXNjcmlwdG9yLmtzbmFtZSwgZGVzY3JpcHRvci5jZm5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1ldGFkYXRhOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVSZWFkZXJXaXRoRmlsdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlUmVhZGVyV2l0aEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYWMxZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlUmVhZGVyV2l0aEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5maWx0ZXIuQmxvb21GaWx0ZXJUcmFja2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLklGaWx0ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5TaGFyZWRDbG9zZWFibGUuc2hhcmVkQ29weU9yTnVsbDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyIGV4dGVuZHMgU1NUYWJsZVJlYWRlcgoreworICAgIHByaXZhdGUgZmluYWwgSUZpbHRlciBmaWx0ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBCbG9vbUZpbHRlclRyYWNrZXIgZmlsdGVyVHJhY2tlcjsKKworICAgIHByb3RlY3RlZCBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlcihCdWlsZGVyPD8sID8+IGJ1aWxkZXIsIE93bmVyIG93bmVyKQorICAgIHsKKyAgICAgICAgc3VwZXIoYnVpbGRlciwgb3duZXIpOworICAgICAgICB0aGlzLmZpbHRlciA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwoYnVpbGRlci5nZXRGaWx0ZXIoKSk7CisgICAgICAgIHRoaXMuZmlsdGVyVHJhY2tlciA9IG5ldyBCbG9vbUZpbHRlclRyYWNrZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGlzdDxBdXRvQ2xvc2VhYmxlPiBzZXR1cEluc3RhbmNlKGJvb2xlYW4gdHJhY2tIb3RuZXNzKQorICAgIHsKKyAgICAgICAgQXJyYXlMaXN0PEF1dG9DbG9zZWFibGU+IGNsb3NlYWJsZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoZmlsdGVyKTsKKyAgICAgICAgY2xvc2VhYmxlcy5hZGRBbGwoc3VwZXIuc2V0dXBJbnN0YW5jZSh0cmFja0hvdG5lc3MpKTsKKyAgICAgICAgcmV0dXJuIGNsb3NlYWJsZXM7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIDxCIGV4dGVuZHMgQnVpbGRlcjw/LCBCPj4gQiB1bmJ1aWxkVG8oQiBidWlsZGVyLCBib29sZWFuIHNoYXJlZENvcHkpCisgICAgeworICAgICAgICBCIGIgPSBzdXBlci51bmJ1aWxkVG8oYnVpbGRlciwgc2hhcmVkQ29weSk7CisgICAgICAgIGlmIChidWlsZGVyLmdldEZpbHRlcigpID09IG51bGwpCisgICAgICAgICAgICBiLnNldEZpbHRlcihzaGFyZWRDb3B5ID8gc2hhcmVkQ29weU9yTnVsbChmaWx0ZXIpIDogZmlsdGVyKTsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNQcmVzZW50SW5GaWx0ZXIoSUZpbHRlci5GaWx0ZXJLZXkga2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlci5pc1ByZXNlbnQoa2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBtYXlDb250YWluQXNzdW1pbmdLZXlJc0luUmFuZ2UoRGVjb3JhdGVkS2V5IGtleSkKKyAgICB7CisgICAgICAgIC8vIGlmIHdlIGRvbid0IGhhdmUgYmxvb20gZmlsdGVyKGJmX2ZwX2NoYW5jZT0xLjAgb3IgZmlsdGVyIGZpbGUgaXMgbWlzc2luZyksCisgICAgICAgIC8vIHdlIGNoZWNrIGluZGV4IGZpbGUgaW5zdGVhZC4KKyAgICAgICAgcmV0dXJuICFmaWx0ZXIuaXNJbmZvcm1hdGl2ZSgpICYmIGdldFBvc2l0aW9uKGtleSwgT3BlcmF0b3IuRVEsIGZhbHNlKSA+PSAwIHx8IGZpbHRlci5pc1ByZXNlbnQoa2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlTZWxlY3RlZChTU1RhYmxlUmVhZHNMaXN0ZW5lci5TZWxlY3Rpb25SZWFzb24gcmVhc29uLCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsb2NhbExpc3RlbmVyLCBPcGVyYXRvciBvcCwgYm9vbGVhbiB1cGRhdGVTdGF0cywgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGVudHJ5KQorICAgIHsKKyAgICAgICAgc3VwZXIubm90aWZ5U2VsZWN0ZWQocmVhc29uLCBsb2NhbExpc3RlbmVyLCBvcCwgdXBkYXRlU3RhdHMsIGVudHJ5KTsKKworICAgICAgICBpZiAoISh1cGRhdGVTdGF0cyAmJiBvcCA9PSBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBmaWx0ZXJUcmFja2VyLmFkZFRydWVQb3NpdGl2ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG5vdGlmeVNraXBwZWQoU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2tpcHBpbmdSZWFzb24gcmVhc29uLCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsb2NhbExpc3RlbmVyLCBPcGVyYXRvciBvcCwgYm9vbGVhbiB1cGRhdGVTdGF0cykKKyAgICB7CisgICAgICAgIHN1cGVyLm5vdGlmeVNraXBwZWQocmVhc29uLCBsb2NhbExpc3RlbmVyLCBvcCwgdXBkYXRlU3RhdHMpOworCisgICAgICAgIGlmICghdXBkYXRlU3RhdHMpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgc3dpdGNoIChyZWFzb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgQkxPT01fRklMVEVSOgorICAgICAgICAgICAgICAgIGZpbHRlclRyYWNrZXIuYWRkVHJ1ZU5lZ2F0aXZlKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1JTl9NQVhfS0VZUzoKKyAgICAgICAgICAgICAgICAvLyBjaGVja2luZyBibG9vbSBmaWx0ZXIgYWdhaW5zdCBrZXlzIG91dHNpZGUgdGhlIHNzdGFibGUgcmFuZ2UgbWFrZSBubyBzZW5zZSBzbyBjb2xsZWN0aW5nCisgICAgICAgICAgICAgICAgLy8gc3RhdGlzdGljcyBvbiB0aGF0IG1ha2VzIG5vIHNlbnNlIGVpdGhlcgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAob3AgPT0gU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSkKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyVHJhY2tlci5hZGRGYWxzZVBvc2l0aXZlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQmxvb21GaWx0ZXJUcmFja2VyIGdldEZpbHRlclRyYWNrZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlclRyYWNrZXI7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0RmlsdGVyU2VyaWFsaXplZFNpemUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlci5zZXJpYWxpemVkU2l6ZShkZXNjcmlwdG9yLnZlcnNpb24uaGFzT2xkQmZGb3JtYXQoKSk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0RmlsdGVyT2ZmSGVhcFNpemUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlci5vZmZIZWFwU2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlciBjbG9uZUFuZFJlcGxhY2UoSUZpbHRlciBmaWx0ZXIpOworCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBCdWlsZGVyPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlciwgQiBleHRlbmRzIEJ1aWxkZXI8UiwgQj4+IGV4dGVuZHMgU1NUYWJsZVJlYWRlci5CdWlsZGVyPFIsIEI+CisgICAgeworICAgICAgICBwcml2YXRlIElGaWx0ZXIgZmlsdGVyOworCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQiBzZXRGaWx0ZXIoSUZpbHRlciBmaWx0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gZmlsdGVyOworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIElGaWx0ZXIgZ2V0RmlsdGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVJlYWRzTGlzdGVuZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVSZWFkc0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMzg0YmYuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVJlYWRzTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93SW5kZXhFbnRyeTsKLQotLyoqCi0gKiBMaXN0ZW5lciBmb3IgcmVjZWl2aW5nIG5vdGlmaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHJlYWRpbmcgU1NUYWJsZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU1NUYWJsZVJlYWRzTGlzdGVuZXIKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgcmVhc29ucyBmb3Igc2tpcHBpbmcgYW4gU1NUYWJsZQotICAgICAqLwotICAgIGVudW0gU2tpcHBpbmdSZWFzb24KLSAgICB7Ci0gICAgICAgIEJMT09NX0ZJTFRFUiwKLSAgICAgICAgTUlOX01BWF9LRVlTLAotICAgICAgICBQQVJUSVRJT05fSU5ERVhfTE9PS1VQLAotICAgICAgICBJTkRFWF9FTlRSWV9OT1RfRk9VTkQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhlIHJlYXNvbnMgZm9yIHNlbGVjdGluZyBhbiBTU1RhYmxlCi0gICAgICovCi0gICAgZW51bSBTZWxlY3Rpb25SZWFzb24KLSAgICB7Ci0gICAgICAgIEtFWV9DQUNIRV9ISVQsCi0gICAgICAgIElOREVYX0VOVFJZX0ZPVU5EOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpc3RlbmVyIHRoYXQgZG9lcyBub3RoaW5nLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBOT09QX0xJU1RFTkVSID0gbmV3IFNTVGFibGVSZWFkc0xpc3RlbmVyKCkge307Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGVzIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzcGVjaWZpZWQgU1NUYWJsZSBoYXMgYmVlbiBza2lwcGVkIGR1cmluZyBhIHNpbmdsZSBwYXJ0aXRpb24gcXVlcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc3N0YWJsZSB0aGUgU1NUYWJsZSByZWFkZXIKLSAgICAgKiBAcGFyYW0gcmVhc29uIHRoZSByZWFzb24gZm9yIHdoaWNoIHRoZSBTU1RhYmxlIGhhcyBiZWVuIHNraXBwZWQKLSAgICAgKi8KLSAgICBkZWZhdWx0IHZvaWQgb25TU1RhYmxlU2tpcHBlZChTU1RhYmxlUmVhZGVyIHNzdGFibGUsIFNraXBwaW5nUmVhc29uIHJlYXNvbikKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIFNTVGFibGUgaGFzIGJlZW4gc2VsZWN0ZWQgZHVyaW5nIGEgc2luZ2xlIHBhcnRpdGlvbiBxdWVyeS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzc3RhYmxlIHRoZSBTU1RhYmxlIHJlYWRlcgotICAgICAqIEBwYXJhbSBpbmRleEVudHJ5IHRoZSBpbmRleCBlbnRyeQotICAgICAqIEBwYXJhbSByZWFzb24gdGhlIHJlYXNvbiBmb3Igd2hpY2ggdGhlIFNTVGFibGUgaGFzIGJlZW4gc2VsZWN0ZWQKLSAgICAgKi8KLSAgICBkZWZhdWx0IHZvaWQgb25TU1RhYmxlU2VsZWN0ZWQoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBSb3dJbmRleEVudHJ5PD8+IGluZGV4RW50cnksIFNlbGVjdGlvblJlYXNvbiByZWFzb24pCi0gICAgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXMgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHNwZWNpZmllZCBTU1RhYmxlIGlzIGJlaW5nIHNjYW5uZWQgZHVyaW5nIGEgcGFydGl0aW9uIHJhbmdlIHF1ZXJ5LgotICAgICAqCi0gICAgICogQHBhcmFtIHNzdGFibGUgdGhlIFNTVGFibGUgcmVhZGVyIG9mIHRoZSBTU1RhYmxlIGJlaW5nIHNjYW5uZWQuCi0gICAgICovCi0gICAgZGVmYXVsdCB2b2lkIG9uU2Nhbm5pbmdTdGFydGVkKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkKLSAgICB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVNjYW5uZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVTY2FubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1YjJhNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVTY2FubmVyLmphdmEKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EYXRhUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5MYXppbHlJbml0aWFsaXplZFVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzLkJvdW5kYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Cb3VuZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNTVGFibGVTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQWJzdHJhY3RJdGVyYXRvcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHMuaXNFbXB0eTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzLm1heExlZnQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kcy5taW5SaWdodDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFNTVGFibGVTY2FubmVyPFMgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEUgZXh0ZW5kcyBBYnN0cmFjdFJvd0luZGV4RW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSBleHRlbmRzIFNTVGFibGVTY2FubmVyPFMsIEUsIEk+LkJhc2VLZXlTY2FubmluZ0l0ZXJhdG9yPgoraW1wbGVtZW50cyBJU1NUYWJsZVNjYW5uZXIKK3sKKyAgICBwcm90ZWN0ZWQgZmluYWwgQXRvbWljQm9vbGVhbiBpc0Nsb3NlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGRmaWxlOworICAgIHByb3RlY3RlZCBmaW5hbCBTIHNzdGFibGU7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgSXRlcmF0b3I8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiByYW5nZUl0ZXJhdG9yOworCisgICAgcHJvdGVjdGVkIGZpbmFsIENvbHVtbkZpbHRlciBjb2x1bW5zOworICAgIHByb3RlY3RlZCBmaW5hbCBEYXRhUmFuZ2UgZGF0YVJhbmdlOworICAgIHByaXZhdGUgZmluYWwgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXI7CisKKyAgICBwcm90ZWN0ZWQgSSBpdGVyYXRvcjsKKworICAgIHByb3RlY3RlZCBsb25nIHN0YXJ0U2NhbiA9IC0xOworICAgIHByb3RlY3RlZCBsb25nIGJ5dGVzU2Nhbm5lZCA9IDA7CisKKyAgICBwcm90ZWN0ZWQgU1NUYWJsZVNjYW5uZXIoUyBzc3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgY29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVJhbmdlIGRhdGFSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiByYW5nZUl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICB7CisgICAgICAgIGFzc2VydCBzc3RhYmxlICE9IG51bGw7CisKKyAgICAgICAgdGhpcy5kZmlsZSA9IHNzdGFibGUub3BlbkRhdGFSZWFkZXIoKTsKKyAgICAgICAgdGhpcy5zc3RhYmxlID0gc3N0YWJsZTsKKyAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1uczsKKyAgICAgICAgdGhpcy5kYXRhUmFuZ2UgPSBkYXRhUmFuZ2U7CisgICAgICAgIHRoaXMucmFuZ2VJdGVyYXRvciA9IHJhbmdlSXRlcmF0b3I7CisgICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIExpc3Q8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiBtYWtlQm91bmRzKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+IHRva2VuUmFuZ2VzKQorICAgIHsKKyAgICAgICAgTGlzdDxBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4+IGJvdW5kc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4odG9rZW5SYW5nZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChSYW5nZTxUb2tlbj4gcmFuZ2UgOiBSYW5nZS5ub3JtYWxpemUodG9rZW5SYW5nZXMpKQorICAgICAgICAgICAgYWRkUmFuZ2Uoc3N0YWJsZSwgUmFuZ2UubWFrZVJvd1JhbmdlKHJhbmdlKSwgYm91bmRzTGlzdCk7CisgICAgICAgIHJldHVybiBib3VuZHNMaXN0OworICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgTGlzdDxBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4+IG1ha2VCb3VuZHMoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBEYXRhUmFuZ2UgZGF0YVJhbmdlKQorICAgIHsKKyAgICAgICAgTGlzdDxBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4+IGJvdW5kc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oMik7CisgICAgICAgIGFkZFJhbmdlKHNzdGFibGUsIGRhdGFSYW5nZS5rZXlSYW5nZSgpLCBib3VuZHNMaXN0KTsKKyAgICAgICAgcmV0dXJuIGJvdW5kc0xpc3Q7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4gZnVsbFJhbmdlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQm91bmRzPD4oc3N0YWJsZS5maXJzdCwgc3N0YWJsZS5sYXN0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFJhbmdlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgQWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+IHJlcXVlc3RlZCwgTGlzdDxBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4+IGJvdW5kc0xpc3QpCisgICAgeworICAgICAgICBpZiAocmVxdWVzdGVkIGluc3RhbmNlb2YgUmFuZ2UgJiYgKChSYW5nZTw/PikgcmVxdWVzdGVkKS5pc1dyYXBBcm91bmQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJlcXVlc3RlZC5yaWdodC5jb21wYXJlVG8oc3N0YWJsZS5maXJzdCkgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSB3cmFwLCB3ZSBtdXN0IGNvbnRhaW4gdGhlIHdob2xlIHNzdGFibGUgcHJpb3IgdG8gc3RvcEtleSgpCisgICAgICAgICAgICAgICAgQm91bmRhcnk8UGFydGl0aW9uUG9zaXRpb24+IGxlZnQgPSBuZXcgQm91bmRhcnk8Pihzc3RhYmxlLmZpcnN0LCB0cnVlKTsKKyAgICAgICAgICAgICAgICBCb3VuZGFyeTxQYXJ0aXRpb25Qb3NpdGlvbj4gcmlnaHQ7CisgICAgICAgICAgICAgICAgcmlnaHQgPSByZXF1ZXN0ZWQucmlnaHRCb3VuZGFyeSgpOworICAgICAgICAgICAgICAgIHJpZ2h0ID0gbWluUmlnaHQocmlnaHQsIHNzdGFibGUubGFzdCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFpc0VtcHR5KGxlZnQsIHJpZ2h0KSkKKyAgICAgICAgICAgICAgICAgICAgYm91bmRzTGlzdC5hZGQoQWJzdHJhY3RCb3VuZHMuYm91bmRzKGxlZnQsIHJpZ2h0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVxdWVzdGVkLmxlZnQuY29tcGFyZVRvKHNzdGFibGUubGFzdCkgPD0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSB3cmFwLCB3ZSBtdXN0IGNvbnRhaW4gdGhlIHdob2xlIHNzdGFibGUgYWZ0ZXIgZGF0YVJhbmdlLnN0YXJ0S2V5KCkKKyAgICAgICAgICAgICAgICBCb3VuZGFyeTxQYXJ0aXRpb25Qb3NpdGlvbj4gcmlnaHQgPSBuZXcgQm91bmRhcnk8Pihzc3RhYmxlLmxhc3QsIHRydWUpOworICAgICAgICAgICAgICAgIEJvdW5kYXJ5PFBhcnRpdGlvblBvc2l0aW9uPiBsZWZ0OworICAgICAgICAgICAgICAgIGxlZnQgPSByZXF1ZXN0ZWQubGVmdEJvdW5kYXJ5KCk7CisgICAgICAgICAgICAgICAgbGVmdCA9IG1heExlZnQobGVmdCwgc3N0YWJsZS5maXJzdCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFpc0VtcHR5KGxlZnQsIHJpZ2h0KSkKKyAgICAgICAgICAgICAgICAgICAgYm91bmRzTGlzdC5hZGQoQWJzdHJhY3RCb3VuZHMuYm91bmRzKGxlZnQsIHJpZ2h0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgIUFic3RyYWN0Qm91bmRzLnN0cmljdGx5V3JhcHNBcm91bmQocmVxdWVzdGVkLmxlZnQsIHJlcXVlc3RlZC5yaWdodCk7CisgICAgICAgICAgICBCb3VuZGFyeTxQYXJ0aXRpb25Qb3NpdGlvbj4gbGVmdCwgcmlnaHQ7CisgICAgICAgICAgICBsZWZ0ID0gcmVxdWVzdGVkLmxlZnRCb3VuZGFyeSgpOworICAgICAgICAgICAgcmlnaHQgPSByZXF1ZXN0ZWQucmlnaHRCb3VuZGFyeSgpOworICAgICAgICAgICAgbGVmdCA9IG1heExlZnQobGVmdCwgc3N0YWJsZS5maXJzdCwgdHJ1ZSk7CisgICAgICAgICAgICAvLyBhcHBhcmVudGx5IGlzV3JhcEFyb3VuZCgpIGRvZXNuJ3QgY291bnQgQm91bmRzIHRoYXQgZXh0ZW5kIHRvIHRoZSBsaW1pdCAobWluKSBhcyB3cmFwcGluZworICAgICAgICAgICAgcmlnaHQgPSByZXF1ZXN0ZWQucmlnaHQuaXNNaW5pbXVtKCkgPyBuZXcgQm91bmRhcnk8Pihzc3RhYmxlLmxhc3QsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1pblJpZ2h0KHJpZ2h0LCBzc3RhYmxlLmxhc3QsIHRydWUpOworICAgICAgICAgICAgaWYgKCFpc0VtcHR5KGxlZnQsIHJpZ2h0KSkKKyAgICAgICAgICAgICAgICBib3VuZHNMaXN0LmFkZChBYnN0cmFjdEJvdW5kcy5ib3VuZHMobGVmdCwgcmlnaHQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNDbG9zZWQuY29tcGFyZUFuZFNldChmYWxzZSwgdHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFya1NjYW5uZWQoKTsKKyAgICAgICAgICAgICAgICBkb0Nsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNzdGFibGUubWFya1N1c3BlY3QoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCBzc3RhYmxlLmdldEZpbGVuYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZG9DbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldExlbmd0aEluQnl0ZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNzdGFibGUudW5jb21wcmVzc2VkTGVuZ3RoKCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgbG9uZyBnZXRDb21wcmVzc2VkTGVuZ3RoSW5CeXRlcygpCisgICAgeworICAgICAgICByZXR1cm4gc3N0YWJsZS5vbkRpc2tMZW5ndGgoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRmaWxlLmdldEZpbGVQb2ludGVyKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0Qnl0ZXNTY2FubmVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBieXRlc1NjYW5uZWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxTU1RhYmxlUmVhZGVyPiBnZXRCYWNraW5nU1NUYWJsZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5vZihzc3RhYmxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSgpCisgICAgeworICAgICAgICByZXR1cm4gc3N0YWJsZS5tZXRhZGF0YSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQorICAgIHsKKyAgICAgICAgaWYgKGl0ZXJhdG9yID09IG51bGwpCisgICAgICAgICAgICBpdGVyYXRvciA9IGNyZWF0ZUl0ZXJhdG9yKCk7CisgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7CisgICAgfQorCisgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBuZXh0KCkKKyAgICB7CisgICAgICAgIGlmIChpdGVyYXRvciA9PSBudWxsKQorICAgICAgICAgICAgaXRlcmF0b3IgPSBjcmVhdGVJdGVyYXRvcigpOworICAgICAgICByZXR1cm4gaXRlcmF0b3IubmV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEkgY3JlYXRlSXRlcmF0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5saXN0ZW5lci5vblNjYW5uaW5nU3RhcnRlZChzc3RhYmxlKTsKKyAgICAgICAgcmV0dXJuIGRvQ3JlYXRlSXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgSSBkb0NyZWF0ZUl0ZXJhdG9yKCk7CisKKyAgICBwcml2YXRlIHZvaWQgbWFya1NjYW5uZWQoKQorICAgIHsKKyAgICAgICAgaWYgKHN0YXJ0U2NhbiAhPSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZXNTY2FubmVkICs9IGRmaWxlLmdldEZpbGVQb2ludGVyKCkgLSBzdGFydFNjYW47CisgICAgICAgICAgICBzdGFydFNjYW4gPSAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzKGRmaWxlPSVzIHNzdGFibGU9JXMpIiwgZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksIGRmaWxlLCBzc3RhYmxlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUtleVNjYW5uaW5nSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEl0ZXJhdG9yPFVuZmlsdGVyZWRSb3dJdGVyYXRvcj4KKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBEZWNvcmF0ZWRLZXkgY3VycmVudEtleTsKKyAgICAgICAgcHJvdGVjdGVkIEUgY3VycmVudEVudHJ5OworICAgICAgICBwcml2YXRlIExhemlseUluaXRpYWxpemVkVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGN1cnJlbnRSb3dJdGVyYXRvcjsKKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBwcmVwYXJlVG9JdGVyYXRlUm93KCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgZ2V0Um93SXRlcmF0b3IoRSBpbmRleEVudHJ5LCBEZWNvcmF0ZWRLZXkga2V5KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBjb21wdXRlTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50Um93SXRlcmF0b3IgIT0gbnVsbCAmJiBjdXJyZW50Um93SXRlcmF0b3IuaXNPcGVuKCkgJiYgY3VycmVudFJvd0l0ZXJhdG9yLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJldHVybmVkIGJ5IHRoZSBsYXN0IGNhbGwgdG8gbmV4dCgpIHdhcyBpbml0aWFsaXplZDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXQgbXVzdCBiZSBjbG9zZWQgYmVmb3JlIGNhbGxpbmcgaGFzTmV4dCgpIG9yIG5leHQoKSBhZ2Fpbi4iKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFya1NjYW5uZWQoKTsKKworICAgICAgICAgICAgICAgIGlmICghcHJlcGFyZVRvSXRlcmF0ZVJvdygpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5kT2ZEYXRhKCk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEZvciBhIGdpdmVuIHBhcnRpdGlvbiBrZXksIHdlIHdhbnQgdG8gYXZvaWQgaGl0dGluZyB0aGUgZGF0YSBmaWxlIHVubGVzcyB3ZSdyZSBleHBsaWNpdGx5IGFza2VkLgorICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBQYXJ0aXRpb25SYW5nZVJlYWRDb21tYW5kI2NoZWNrQ2FjaGVGaWx0ZXIuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSb3dJdGVyYXRvciA9IG5ldyBMYXppbHlJbml0aWFsaXplZFVuZmlsdGVyZWRSb3dJdGVyYXRvcihjdXJyZW50S2V5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RvcmUgY3VycmVudEVudHJ5IHJlZmVyZW5jZSBkdXJpbmcgb2JqZWN0IGluc3RhbnRpYXRpb24gYXMgbGF0ZXIgKGR1cmluZyBpbml0aWFsaXplKSB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVmZXJlbmNlIG1heSBwb2ludCB0byBhIGRpZmZlcmVudCBlbnRyeS4KKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBFIHJvd0luZGV4RW50cnkgPSBjdXJyZW50RW50cnk7CisKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpbml0aWFsaXplSXRlcmF0b3IoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNjYW4gPSByb3dJbmRleEVudHJ5LnBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRSb3dJdGVyYXRvcihyb3dJbmRleEVudHJ5LCBwYXJ0aXRpb25LZXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUubWFya1N1c3BlY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgc3N0YWJsZS5nZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNzdGFibGUubWFya1N1c3BlY3QoKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgc3N0YWJsZS5nZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVXcml0ZXIuamF2YQppbmRleCBmODJhN2MyLi4yNTVlMWNkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TU1RhYmxlV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZVdyaXRlci5qYXZhCkBAIC0xOCw0OCArMTgsNDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKIAotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblB1cmdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dJbmRleEVudHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHMuR3VhcmRyYWlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlTmV3VHJhY2tlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNvbXBsZXhDb2x1bW5EYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LkluZGV4OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUZsdXNoT2JzZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlWmVyb0NvcHlXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLk1tYXBwZWRSZWdpb25zQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlRyYW5zYWN0aW9uYWw7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKwogLyoqCi0gKiBUaGlzIGlzIHRoZSBBUEkgYWxsIHRhYmxlIHdyaXRlcnMgbXVzdCBpbXBsZW1lbnQuCi0gKgotICogVGFibGVXcml0ZXIuY3JlYXRlKCkgaXMgdGhlIHByaW1hcnkgd2F5IHRvIGNyZWF0ZSBhIHdyaXRlciBmb3IgYSBwYXJ0aWN1bGFyIGZvcm1hdC4KLSAqIFRoZSBmb3JtYXQgaW5mb3JtYXRpb24gaXMgcGFydCBvZiB0aGUgRGVzY3JpcHRvci4KKyAqIEEgcm9vdCBjbGFzcyBmb3IgYSB3cml0ZXIgaW1wbGVtZW50YXRpb24uIEEgd3JpdGVyIG11c3QgYmUgY3JlYXRlZCBieSBwYXNzaW5nIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljCisgKiB7QGxpbmsgQnVpbGRlcn0sIGEge0BsaW5rIExpZmVjeWNsZU5ld1RyYWNrZXJ9IGFuZCB7QGxpbmsgU1NUYWJsZS5Pd25lcn0gaW5zdGFuY2VzLiBJbXBsZW1lbnRpbmcgY2xhc3NlcyBzaG91bGQKKyAqIG5vdCBleHRlbmQgdGhhdCBsaXN0IGFuZCBhbGwgdGhlIGFkZGl0aW9uYWwgcHJvcGVydGllcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkZXIuCiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTU1RhYmxlV3JpdGVyIGV4dGVuZHMgU1NUYWJsZSBpbXBsZW1lbnRzIFRyYW5zYWN0aW9uYWwKIHsKQEAgLTY5LDE0MyArNjgsNTcgQEAKICAgICBwcm90ZWN0ZWQgbG9uZyBtYXhEYXRhQWdlID0gLTE7CiAgICAgcHJvdGVjdGVkIGZpbmFsIGxvbmcga2V5Q291bnQ7CiAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGFkYXRhQ29sbGVjdG9yIG1ldGFkYXRhQ29sbGVjdG9yOwotICAgIHByb3RlY3RlZCBmaW5hbCBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplciByb3dJbmRleEVudHJ5U2VyaWFsaXplcjsKICAgICBwcm90ZWN0ZWQgZmluYWwgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFRyYW5zYWN0aW9uYWxQcm94eSB0eG5Qcm94eSA9IHR4blByb3h5KCk7CiAgICAgcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb248U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IG9ic2VydmVyczsKKyAgICBwcm90ZWN0ZWQgZmluYWwgTW1hcHBlZFJlZ2lvbnNDYWNoZSBtbWFwcGVkUmVnaW9uc0NhY2hlOworICAgIHByb3RlY3RlZCBmaW5hbCBUcmFuc2FjdGlvbmFsUHJveHkgdHhuUHJveHkgPSB0eG5Qcm94eSgpOworICAgIHByb3RlY3RlZCBmaW5hbCBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXI7CisgICAgcHJvdGVjdGVkIERlY29yYXRlZEtleSBmaXJzdDsKKyAgICBwcm90ZWN0ZWQgRGVjb3JhdGVkS2V5IGxhc3Q7CiAKKyAgICAvKioKKyAgICAgKiBUaGUgaW1wbGVtZW50aW5nIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGluc3RhbmNlIG9mIHtAbGluayBUcmFuc2FjdGlvbmFsUHJveHl9IGluaXRpYWxpemVkIHdpdGggYSBsaXN0IG9mIGFsbAorICAgICAqIHRyYW5zYWN0aW9uYWwgcmVzb3VyY2VzIGluY2x1ZGVkIGluIHRoaXMgd3JpdGVyLgorICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUcmFuc2FjdGlvbmFsUHJveHkgdHhuUHJveHkoKTsKIAotICAgIC8vIGR1ZSB0byBsYWNrIG9mIG11bHRpcGxlIGluaGVyaXRhbmNlLCB3ZSB1c2UgYW4gaW5uZXIgY2xhc3MgdG8gcHJveHkgb3VyIFRyYW5zYWN0aW9uYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBUcmFuc2FjdGlvbmFsUHJveHkgZXh0ZW5kcyBBYnN0cmFjdFRyYW5zYWN0aW9uYWwKKyAgICBwcm90ZWN0ZWQgU1NUYWJsZVdyaXRlcihCdWlsZGVyPD8sID8+IGJ1aWxkZXIsIExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlciwgU1NUYWJsZS5Pd25lciBvd25lcikKICAgICB7Ci0gICAgICAgIC8vIHNob3VsZCBiZSBzZXQgZHVyaW5nIGRvUHJlcGFyZSgpCi0gICAgICAgIHByb3RlY3RlZCBTU1RhYmxlUmVhZGVyIGZpbmFsUmVhZGVyOwotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBvcGVuUmVzdWx0OworICAgICAgICBzdXBlcihidWlsZGVyLCBvd25lcik7CisgICAgICAgIGNoZWNrTm90TnVsbChidWlsZGVyLmdldEZsdXNoT2JzZXJ2ZXJzKCkpOworICAgICAgICBjaGVja05vdE51bGwoYnVpbGRlci5nZXRNZXRhZGF0YUNvbGxlY3RvcigpKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGJ1aWxkZXIuZ2V0U2VyaWFsaXphdGlvbkhlYWRlcigpKTsKKworICAgICAgICB0aGlzLmtleUNvdW50ID0gYnVpbGRlci5nZXRLZXlDb3VudCgpOworICAgICAgICB0aGlzLnJlcGFpcmVkQXQgPSBidWlsZGVyLmdldFJlcGFpcmVkQXQoKTsKKyAgICAgICAgdGhpcy5wZW5kaW5nUmVwYWlyID0gYnVpbGRlci5nZXRQZW5kaW5nUmVwYWlyKCk7CisgICAgICAgIHRoaXMuaXNUcmFuc2llbnQgPSBidWlsZGVyLmlzVHJhbnNpZW50U1NUYWJsZSgpOworICAgICAgICB0aGlzLm1ldGFkYXRhQ29sbGVjdG9yID0gYnVpbGRlci5nZXRNZXRhZGF0YUNvbGxlY3RvcigpOworICAgICAgICB0aGlzLmhlYWRlciA9IGJ1aWxkZXIuZ2V0U2VyaWFsaXphdGlvbkhlYWRlcigpOworICAgICAgICB0aGlzLm9ic2VydmVycyA9IGJ1aWxkZXIuZ2V0Rmx1c2hPYnNlcnZlcnMoKTsKKyAgICAgICAgdGhpcy5tbWFwcGVkUmVnaW9uc0NhY2hlID0gYnVpbGRlci5nZXRNbWFwcGVkUmVnaW9uc0NhY2hlKCk7CisgICAgICAgIHRoaXMubGlmZWN5Y2xlTmV3VHJhY2tlciA9IGxpZmVjeWNsZU5ld1RyYWNrZXI7CisKKyAgICAgICAgbGlmZWN5Y2xlTmV3VHJhY2tlci50cmFja05ldyh0aGlzKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgU1NUYWJsZVdyaXRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBrZXlDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHJlcGFpcmVkQXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzVHJhbnNpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlRmx1c2hPYnNlcnZlcj4gb2JzZXJ2ZXJzKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkgZ2V0Rmlyc3QoKQogICAgIHsKLSAgICAgICAgc3VwZXIoZGVzY3JpcHRvciwgY29tcG9uZW50cyhtZXRhZGF0YS5nZXRMb2NhbCgpKSwgbWV0YWRhdGEsIERhdGFiYXNlRGVzY3JpcHRvci5nZXREaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3koKSk7Ci0gICAgICAgIHRoaXMua2V5Q291bnQgPSBrZXlDb3VudDsKLSAgICAgICAgdGhpcy5yZXBhaXJlZEF0ID0gcmVwYWlyZWRBdDsKLSAgICAgICAgdGhpcy5wZW5kaW5nUmVwYWlyID0gcGVuZGluZ1JlcGFpcjsKLSAgICAgICAgdGhpcy5pc1RyYW5zaWVudCA9IGlzVHJhbnNpZW50OwotICAgICAgICB0aGlzLm1ldGFkYXRhQ29sbGVjdG9yID0gbWV0YWRhdGFDb2xsZWN0b3I7Ci0gICAgICAgIHRoaXMuaGVhZGVyID0gaGVhZGVyOwotICAgICAgICB0aGlzLnJvd0luZGV4RW50cnlTZXJpYWxpemVyID0gZGVzY3JpcHRvci52ZXJzaW9uLmdldFNTVGFibGVGb3JtYXQoKS5nZXRJbmRleFNlcmlhbGl6ZXIobWV0YWRhdGEuZ2V0KCksIGRlc2NyaXB0b3IudmVyc2lvbiwgaGVhZGVyKTsKLSAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBvYnNlcnZlcnMgPT0gbnVsbCA/IENvbGxlY3Rpb25zLmVtcHR5U2V0KCkgOiBvYnNlcnZlcnM7CisgICAgICAgIHJldHVybiBmaXJzdDsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVXcml0ZXIgY3JlYXRlKERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcga2V5Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nIHJlcGFpcmVkQXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RyYW5zaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBtZXRhZGF0YUNvbGxlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJbmRleD4gaW5kZXhlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlcikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IGdldExhc3QoKQogICAgIHsKLSAgICAgICAgRmFjdG9yeSB3cml0ZXJGYWN0b3J5ID0gZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5nZXRXcml0ZXJGYWN0b3J5KCk7Ci0gICAgICAgIHJldHVybiB3cml0ZXJGYWN0b3J5Lm9wZW4oZGVzY3JpcHRvciwga2V5Q291bnQsIHJlcGFpcmVkQXQsIHBlbmRpbmdSZXBhaXIsIGlzVHJhbnNpZW50LCBtZXRhZGF0YSwgbWV0YWRhdGFDb2xsZWN0b3IsIGhlYWRlciwgb2JzZXJ2ZXJzKGRlc2NyaXB0b3IsIGluZGV4ZXMsIGxpZmVjeWNsZU5ld1RyYWNrZXIub3BUeXBlKCkpLCBsaWZlY3ljbGVOZXdUcmFja2VyKTsKKyAgICAgICAgcmV0dXJuIGxhc3Q7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBTU1RhYmxlV3JpdGVyIGNyZWF0ZShEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGtleUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZXBhaXJlZEF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNUcmFuc2llbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3N0YWJsZUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPEluZGV4PiBpbmRleGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBYnN0cmFjdEJvdW5kczxUb2tlbj4gZ2V0Qm91bmRzKCkKICAgICB7Ci0gICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0VGFibGVNZXRhZGF0YVJlZihkZXNjcmlwdG9yKTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZShtZXRhZGF0YSwgZGVzY3JpcHRvciwga2V5Q291bnQsIHJlcGFpcmVkQXQsIHBlbmRpbmdSZXBhaXIsIGlzVHJhbnNpZW50LCBzc3RhYmxlTGV2ZWwsIGhlYWRlciwgaW5kZXhlcywgbGlmZWN5Y2xlTmV3VHJhY2tlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTU1RhYmxlV3JpdGVyIGNyZWF0ZShUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBrZXlDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVwYWlyZWRBdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzVHJhbnNpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNzdGFibGVMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxJbmRleD4gaW5kZXhlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlcikKLSAgICB7Ci0gICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3RvcihtZXRhZGF0YS5nZXQoKS5jb21wYXJhdG9yKS5zc3RhYmxlTGV2ZWwoc3N0YWJsZUxldmVsKTsKLSAgICAgICAgcmV0dXJuIGNyZWF0ZShkZXNjcmlwdG9yLCBrZXlDb3VudCwgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgaXNUcmFuc2llbnQsIG1ldGFkYXRhLCBjb2xsZWN0b3IsIGhlYWRlciwgaW5kZXhlcywgbGlmZWN5Y2xlTmV3VHJhY2tlcik7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgcHVibGljIHN0YXRpYyBTU1RhYmxlV3JpdGVyIGNyZWF0ZShEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGtleUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZXBhaXJlZEF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNUcmFuc2llbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248SW5kZXg+IGluZGV4ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIpCi0gICAgewotICAgICAgICByZXR1cm4gY3JlYXRlKGRlc2NyaXB0b3IsIGtleUNvdW50LCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpc1RyYW5zaWVudCwgMCwgaGVhZGVyLCBpbmRleGVzLCBsaWZlY3ljbGVOZXdUcmFja2VyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpCi0gICAgewotICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gbmV3IEhhc2hTZXQ8Q29tcG9uZW50PihBcnJheXMuYXNMaXN0KENvbXBvbmVudC5EQVRBLAotICAgICAgICAgICAgICAgIENvbXBvbmVudC5QUklNQVJZX0lOREVYLAotICAgICAgICAgICAgICAgIENvbXBvbmVudC5TVEFUUywKLSAgICAgICAgICAgICAgICBDb21wb25lbnQuU1VNTUFSWSwKLSAgICAgICAgICAgICAgICBDb21wb25lbnQuVE9DLAotICAgICAgICAgICAgICAgIENvbXBvbmVudC5ESUdFU1QpKTsKLQotICAgICAgICBpZiAobWV0YWRhdGEucGFyYW1zLmJsb29tRmlsdGVyRnBDaGFuY2UgPCAxLjApCi0gICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnQuRklMVEVSKTsKLQotICAgICAgICBpZiAobWV0YWRhdGEucGFyYW1zLmNvbXByZXNzaW9uLmlzRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpdCB3b3VsZCBmZWVsIHNhZmVyIHRvIGFjdHVhbGx5IGFkZCB0aGlzIGNvbXBvbmVudCBsYXRlciBpbiBtYXliZVdyaXRlRGlnZXN0KCksCi0gICAgICAgICAgICAvLyBidXQgdGhlIGNvbXBvbmVudHMgYXJlIHVubW9kaWZpYWJsZSBhZnRlciBjb25zdHJ1Y3Rpb24KLSAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5DUkMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21wb25lbnRzOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IG9ic2VydmVycyhEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248SW5kZXg+IGluZGV4ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUgb3BlcmF0aW9uVHlwZSkKLSAgICB7Ci0gICAgICAgIGlmIChpbmRleGVzID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0KLSAgICAgICAgTGlzdDxTU1RhYmxlRmx1c2hPYnNlcnZlcj4gb2JzZXJ2ZXJzID0gbmV3IEFycmF5TGlzdDw+KGluZGV4ZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChJbmRleCBpbmRleCA6IGluZGV4ZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNTVGFibGVGbHVzaE9ic2VydmVyIG9ic2VydmVyID0gaW5kZXguZ2V0Rmx1c2hPYnNlcnZlcihkZXNjcmlwdG9yLCBvcGVyYXRpb25UeXBlKTsKLSAgICAgICAgICAgIGlmIChvYnNlcnZlciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9ic2VydmVyLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgb2JzZXJ2ZXJzLmFkZChvYnNlcnZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5jb3B5T2Yob2JzZXJ2ZXJzKTsKKyAgICAgICAgcmV0dXJuIChmaXJzdCAhPSBudWxsICYmIGxhc3QgIT0gbnVsbCkgPyBBYnN0cmFjdEJvdW5kcy5ib3VuZHMoZmlyc3QuZ2V0VG9rZW4oKSwgdHJ1ZSwgbGFzdC5nZXRUb2tlbigpLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7CiAgICAgfQogCiAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgbWFyaygpOwpAQCAtMjE3LDQ0ICsxMzAsNjIgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGluZGV4IGVudHJ5IGlmIHNvbWV0aGluZyB3YXMgd3JpdHRlbiwgdGhhdCBpcyBpZiB7QGNvZGUgaXRlcmF0b3J9CiAgICAgICogd2Fzbid0IGVtcHR5LCB7QGNvZGUgbnVsbH0gb3RoZXJ3aXNlLgogICAgICAqCi0gICAgICogQHRocm93cyBGU1dyaXRlRXJyb3IgaWYgYSB3cml0ZSB0byB0aGUgZGF0YUZpbGUgZmFpbHMKKyAgICAgKiBAdGhyb3dzIEZTV3JpdGVFcnJvciBpZiB3cml0aW5nIHRvIHRoZSBkYXRhRmlsZSBmYWlscwogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBSb3dJbmRleEVudHJ5IGFwcGVuZChVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IpOworICAgIHB1YmxpYyBhYnN0cmFjdCBBYnN0cmFjdFJvd0luZGV4RW50cnkgYXBwZW5kKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvcik7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcG9zaXRpb24gaW4gdGhlIHVuY29tcHJlc3NlZCBkYXRhIC0gZm9yIHVuY29tcHJlc3NlZCBmaWxlcyBpdCBpcyB0aGUgc2FtZSBhcyB7QGxpbmsgI2dldE9uRGlza0ZpbGVQb2ludGVyKCl9CisgICAgICogYnV0IGZvciBjb21wcmVzc2VkIGZpbGVzIGl0IHJldHVybnMgYSBwb3NpdGlvbiBpbiB0aGUgZGF0YSByYXRoZXIgdGhhbiBhIHBvc2l0aW9uIGluIHRoZSBmaWxlIG9uIGRpc2suCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGxvbmcgZ2V0RmlsZVBvaW50ZXIoKTsKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwb3NpdGlvbiBpbiB0aGUgKGNvbXByZXNzZWQpIGRhdGEgZmlsZSBvbiBkaXNrLiBTZWUge0BsaW5rICNnZXRGaWxlUG9pbnRlcigpfQorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCBsb25nIGdldE9uRGlza0ZpbGVQb2ludGVyKCk7CiAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbW91bnQgb2YgZGF0YSBhbHJlYWR5IHdyaXR0ZW4gdG8gZGlzayB0aGF0IG1heSBub3QgYmUgYWNjdXJhdGUgKGZvciBleGFtcGxlLCB0aGUgcG9zaXRpb24gYWZ0ZXIKKyAgICAgKiB0aGUgcmVjZW50bHkgZmx1c2hlZCBjaHVuaykuCisgICAgICovCiAgICAgcHVibGljIGxvbmcgZ2V0RXN0aW1hdGVkT25EaXNrQnl0ZXNXcml0dGVuKCkKICAgICB7CiAgICAgICAgIHJldHVybiBnZXRPbkRpc2tGaWxlUG9pbnRlcigpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSBkYXRhIGZpbGUgdG8gdGhlIG1hcmtlZCBwb3NpdGlvbiAoc2VlIHtAbGluayAjbWFyaygpfSkgYW5kIHRydW5jYXRlIHRoZSByZXN0IG9mIHRoZSBmaWxlLgorICAgICAqLwogICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlc2V0QW5kVHJ1bmNhdGUoKTsKIAotICAgIHB1YmxpYyBTU1RhYmxlV3JpdGVyIHNldFJlcGFpcmVkQXQobG9uZyByZXBhaXJlZEF0KQorICAgIHB1YmxpYyB2b2lkIHNldFJlcGFpcmVkQXQobG9uZyByZXBhaXJlZEF0KQogICAgIHsKICAgICAgICAgaWYgKHJlcGFpcmVkQXQgPiAwKQogICAgICAgICAgICAgdGhpcy5yZXBhaXJlZEF0ID0gcmVwYWlyZWRBdDsKLSAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0gICAgcHVibGljIFNTVGFibGVXcml0ZXIgc2V0TWF4RGF0YUFnZShsb25nIG1heERhdGFBZ2UpCisgICAgcHVibGljIHZvaWQgc2V0TWF4RGF0YUFnZShsb25nIG1heERhdGFBZ2UpCiAgICAgewogICAgICAgICB0aGlzLm1heERhdGFBZ2UgPSBtYXhEYXRhQWdlOwotICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKLSAgICBwdWJsaWMgU1NUYWJsZVdyaXRlciBzZXRPcGVuUmVzdWx0KGJvb2xlYW4gb3BlblJlc3VsdCkKKyAgICBwdWJsaWMgdm9pZCBzZXRPcGVuUmVzdWx0KGJvb2xlYW4gb3BlblJlc3VsdCkKICAgICB7CiAgICAgICAgIHR4blByb3h5Lm9wZW5SZXN1bHQgPSBvcGVuUmVzdWx0OwotICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBPcGVuIHRoZSByZXN1bHRhbnQgU1NUYWJsZVJlYWRlciBiZWZvcmUgaXQgaGFzIGJlZW4gZnVsbHkgd3JpdHRlbgorICAgICAqIE9wZW4gdGhlIHJlc3VsdGFudCBTU1RhYmxlUmVhZGVyIGJlZm9yZSBpdCBoYXMgYmVlbiBmdWxseSB3cml0dGVuLgorICAgICAqIDxwPgorICAgICAqIFRoZSBwYXNzZWQgY29uc3VtZXIgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbmVjZXNzYXJ5IGRhdGEgaGFzIGJlZW4gZmx1c2hlZCB0byBkaXNrL2NhY2hlLiBUaGlzIG1heSBuZXZlciBoYXBwZW4KKyAgICAgKiAoZS5nLiBpZiB0aGUgdGFibGUgd2FzIGZpbmlzaGVkIGJlZm9yZSB0aGUgZmx1c2hlcyBtYXRlcmlhbGl6ZWQsIG9yIGlmIHRoaXMgY2FsbCByZXR1cm5zIGZhbHNlIGUuZy4gaWYgYSB0YWJsZQorICAgICAqIHdhcyBhbHJlYWR5IHByZXBhcmVkIGJ1dCBoYXNuJ3QgcmVhY2hlZCByZWFkaW5lc3MgeWV0KS4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2VzIGNhbGxiYWNrIGluc3RlYWQgb2YgZnV0dXJlIGJlY2F1c2UgcHJlcGFyYXRpb24gYW5kIGNhbGxiYWNrIGhhcHBlbiBvbiB0aGUgc2FtZSB0aHJlYWQuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFNTVGFibGVSZWFkZXIgb3BlbkVhcmx5KCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvcGVuRWFybHkoQ29uc3VtZXI8U1NUYWJsZVJlYWRlcj4gZG9XaGVuUmVhZHkpOwogCiAgICAgLyoqCiAgICAgICogT3BlbiB0aGUgcmVzdWx0YW50IFNTVGFibGVSZWFkZXIgb25jZSBpdCBoYXMgYmVlbiBmdWxseSB3cml0dGVuLCBidXQgYmVmb3JlIHRoZQpAQCAtMjYyLDE3ICsxOTMsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgYWJzdHJhY3QgU1NUYWJsZVJlYWRlciBvcGVuRmluYWxFYXJseSgpOwogCi0gICAgcHVibGljIFNTVGFibGVSZWFkZXIgZmluaXNoKGxvbmcgcmVwYWlyZWRBdCwgbG9uZyBtYXhEYXRhQWdlLCBib29sZWFuIG9wZW5SZXN1bHQpCi0gICAgewotICAgICAgICBpZiAocmVwYWlyZWRBdCA+IDApCi0gICAgICAgICAgICB0aGlzLnJlcGFpcmVkQXQgPSByZXBhaXJlZEF0OwotICAgICAgICB0aGlzLm1heERhdGFBZ2UgPSBtYXhEYXRhQWdlOwotICAgICAgICByZXR1cm4gZmluaXNoKG9wZW5SZXN1bHQpOwotICAgIH0KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU1NUYWJsZVJlYWRlciBvcGVuRmluYWwoU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uIG9wZW5SZWFzb24pOwogCiAgICAgcHVibGljIFNTVGFibGVSZWFkZXIgZmluaXNoKGJvb2xlYW4gb3BlblJlc3VsdCkKICAgICB7Ci0gICAgICAgIHNldE9wZW5SZXN1bHQob3BlblJlc3VsdCk7CisgICAgICAgIHRoaXMuc2V0T3BlblJlc3VsdChvcGVuUmVzdWx0KTsKICAgICAgICAgdHhuUHJveHkuZmluaXNoKCk7CiAgICAgICAgIG9ic2VydmVycy5mb3JFYWNoKFNTVGFibGVGbHVzaE9ic2VydmVyOjpjb21wbGV0ZSk7CiAgICAgICAgIHJldHVybiBmaW5pc2hlZCgpOwpAQCAtMjg0LDYgKzIwOSw3IEBACiAgICAgICovCiAgICAgcHVibGljIFNTVGFibGVSZWFkZXIgZmluaXNoZWQoKQogICAgIHsKKyAgICAgICAgdHhuUHJveHkuZmluYWxSZWFkZXJBY2Nlc3NlZCA9IHRydWU7CiAgICAgICAgIHJldHVybiB0eG5Qcm94eS5maW5hbFJlYWRlcjsKICAgICB9CiAKQEAgLTMyNyw3ICsyNTMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBhaXJlZEF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUmVwYWlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdC5yZXRhaW5hYmxlKCkuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QucmV0YWluYWJsZSgpLmdldEtleSgpKTsKICAgICB9CiAKICAgICBwcm90ZWN0ZWQgU3RhdHNNZXRhZGF0YSBzdGF0c01ldGFkYXRhKCkKQEAgLTM0MCw1MCArMjY4LDggQEAKICAgICAgICAgbWV0YWRhdGFDb2xsZWN0b3IucmVsZWFzZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW5hbWUoRGVzY3JpcHRvciB0bXBkZXNjLCBEZXNjcmlwdG9yIG5ld2Rlc2MsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMpCi0gICAgewotICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBTZXRzLmRpZmZlcmVuY2UoY29tcG9uZW50cywgU2V0cy5uZXdIYXNoU2V0KENvbXBvbmVudC5EQVRBLCBDb21wb25lbnQuU1VNTUFSWSkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMucmVuYW1lV2l0aENvbmZpcm0odG1wZGVzYy5maWxlbmFtZUZvcihjb21wb25lbnQpLCBuZXdkZXNjLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG8gLURhdGEgbGFzdCBiZWNhdXNlIC1EYXRhIHByZXNlbnQgc2hvdWxkIG1lYW4gdGhlIHNzdGFibGUgd2FzIGNvbXBsZXRlbHkgcmVuYW1lZCBiZWZvcmUgY3Jhc2gKLSAgICAgICAgRmlsZVV0aWxzLnJlbmFtZVdpdGhDb25maXJtKHRtcGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpLCBuZXdkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7Ci0KLSAgICAgICAgLy8gcmVuYW1lIGl0IHdpdGhvdXQgY29uZmlybWF0aW9uIGJlY2F1c2Ugc3VtbWFyeSBjYW4gYmUgYXZhaWxhYmxlIGZvciBsb2FkTmV3U1NUYWJsZXMgYnV0IG5vdCBmb3IgY2xvc2VBbmRPcGVuUmVhZGVyCi0gICAgICAgIEZpbGVVdGlscy5yZW5hbWVXaXRoT3V0Q29uZmlybSh0bXBkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVU1NQVJZKSwgbmV3ZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuU1VNTUFSWSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KERlc2NyaXB0b3IgdG1wZGVzYywgRGVzY3JpcHRvciBuZXdkZXNjLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzKQotICAgIHsKLSAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogU2V0cy5kaWZmZXJlbmNlKGNvbXBvbmVudHMsIFNldHMubmV3SGFzaFNldChDb21wb25lbnQuREFUQSwgQ29tcG9uZW50LlNVTU1BUlkpKSkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNvcHlXaXRoQ29uZmlybSh0bXBkZXNjLmZpbGVuYW1lRm9yKGNvbXBvbmVudCksIG5ld2Rlc2MuZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkbyAtRGF0YSBsYXN0IGJlY2F1c2UgLURhdGEgcHJlc2VudCBzaG91bGQgbWVhbiB0aGUgc3N0YWJsZSB3YXMgY29tcGxldGVseSBjb3BpZWQgYmVmb3JlIGNyYXNoCi0gICAgICAgIEZpbGVVdGlscy5jb3B5V2l0aENvbmZpcm0odG1wZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSksIG5ld2Rlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKTsKLQotICAgICAgICAvLyBjb3B5IGl0IHdpdGhvdXQgY29uZmlybWF0aW9uIGJlY2F1c2Ugc3VtbWFyeSBjYW4gYmUgYXZhaWxhYmxlIGZvciBsb2FkTmV3U1NUYWJsZXMgYnV0IG5vdCBmb3IgY2xvc2VBbmRPcGVuUmVhZGVyCi0gICAgICAgIEZpbGVVdGlscy5jb3B5V2l0aE91dENvbmZpcm0odG1wZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuU1VNTUFSWSksIG5ld2Rlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNVTU1BUlkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaGFyZGxpbmsoRGVzY3JpcHRvciB0bXBkZXNjLCBEZXNjcmlwdG9yIG5ld2Rlc2MsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMpCi0gICAgewotICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBTZXRzLmRpZmZlcmVuY2UoY29tcG9uZW50cywgU2V0cy5uZXdIYXNoU2V0KENvbXBvbmVudC5EQVRBLCBDb21wb25lbnQuU1VNTUFSWSkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY3JlYXRlSGFyZExpbmtXaXRoQ29uZmlybSh0bXBkZXNjLmZpbGVuYW1lRm9yKGNvbXBvbmVudCksIG5ld2Rlc2MuZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBkbyAtRGF0YSBsYXN0IGJlY2F1c2UgLURhdGEgcHJlc2VudCBzaG91bGQgbWVhbiB0aGUgc3N0YWJsZSB3YXMgY29tcGxldGVseSBjb3BpZWQgYmVmb3JlIGNyYXNoCi0gICAgICAgIEZpbGVVdGlscy5jcmVhdGVIYXJkTGlua1dpdGhDb25maXJtKHRtcGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpLCBuZXdkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7Ci0KLSAgICAgICAgLy8gY29weSBpdCB3aXRob3V0IGNvbmZpcm1hdGlvbiBiZWNhdXNlIHN1bW1hcnkgY2FuIGJlIGF2YWlsYWJsZSBmb3IgbG9hZE5ld1NTVGFibGVzIGJ1dCBub3QgZm9yIGNsb3NlQW5kT3BlblJlYWRlcgotICAgICAgICBGaWxlVXRpbHMuY3JlYXRlSGFyZExpbmtXaXRob3V0Q29uZmlybSh0bXBkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVU1NQVJZKSwgbmV3ZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuU1VNTUFSWSkpOwotICAgIH0KLQogICAgIC8qKgotICAgICAqIFBhcmFtZXRlcnMgZm9yIGNhbGN1bGF0aW5nIHRoZSBleHBlY3RlZCBzaXplIG9mIGFuIHNzdGFibGUuIEV4cG9zZWQgb24gbWVtdGFibGUgZmx1c2ggc2V0cyAoaS5lLiBjb2xsZWN0ZWQKKyAgICAgKiBQYXJhbWV0ZXJzIGZvciBjYWxjdWxhdGluZyB0aGUgZXhwZWN0ZWQgc2l6ZSBvZiBhbiBTU1RhYmxlLiBFeHBvc2VkIG9uIG1lbXRhYmxlIGZsdXNoIHNldHMgKGkuZS4gY29sbGVjdGVkCiAgICAgICogc3Vic2V0cyBvZiBhIG1lbXRhYmxlIHRoYXQgd2lsbCBiZSB3cml0dGVuIHRvIHNzdGFibGVzKS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50ZXJmYWNlIFNTVGFibGVTaXplUGFyYW1ldGVycwpAQCAtMzkzLDU4ICsyNzksMjI1IEBACiAgICAgICAgIGxvbmcgZGF0YVNpemUoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEZhY3RvcnkKKyAgICAvLyBkdWUgdG8gbGFjayBvZiBtdWx0aXBsZSBpbmhlcml0YW5jZSwgd2UgdXNlIGFuIGlubmVyIGNsYXNzIHRvIHByb3h5IG91ciBUcmFuc2FjdGlvbmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAgICBwcm90ZWN0ZWQgY2xhc3MgVHJhbnNhY3Rpb25hbFByb3h5IGV4dGVuZHMgQWJzdHJhY3RUcmFuc2FjdGlvbmFsCiAgICAgewotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyBlc3RpbWF0ZVNpemUoU1NUYWJsZVNpemVQYXJhbWV0ZXJzIHBhcmFtZXRlcnMpOworICAgICAgICAvLyBzaG91bGQgYmUgc2V0IGR1cmluZyBkb1ByZXBhcmUoKQorICAgICAgICBwcml2YXRlIGZpbmFsIFN1cHBsaWVyPEltbXV0YWJsZUxpc3Q8VHJhbnNhY3Rpb25hbD4+IHRyYW5zYWN0aW9uYWxzOwogCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTU1RhYmxlV3JpdGVyIG9wZW4oRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcga2V5Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZXBhaXJlZEF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RyYW5zaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIG1ldGFkYXRhQ29sbGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IG9ic2VydmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIpOworICAgICAgICBwcml2YXRlIFNTVGFibGVSZWFkZXIgZmluYWxSZWFkZXI7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBvcGVuUmVzdWx0OworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZmluYWxSZWFkZXJBY2Nlc3NlZDsKKworICAgICAgICBwdWJsaWMgVHJhbnNhY3Rpb25hbFByb3h5KFN1cHBsaWVyPEltbXV0YWJsZUxpc3Q8VHJhbnNhY3Rpb25hbD4+IHRyYW5zYWN0aW9uYWxzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uYWxzID0gdHJhbnNhY3Rpb25hbHM7CisgICAgICAgIH0KKworICAgICAgICAvLyBmaW5hbGlzZSBvdXIgc3RhdGUgb24gZGlzaywgaW5jbHVkaW5nIHJlbmFtaW5nCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvUHJlcGFyZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uYWxzLmdldCgpLmZvckVhY2goVHJhbnNhY3Rpb25hbDo6cHJlcGFyZVRvQ29tbWl0KTsKKyAgICAgICAgICAgIG5ldyBTdGF0c0NvbXBvbmVudChmaW5hbGl6ZU1ldGFkYXRhKCkpLnNhdmUoZGVzY3JpcHRvcik7CisKKyAgICAgICAgICAgIC8vIHNhdmUgdGhlIHRhYmxlIG9mIGNvbXBvbmVudHMKKyAgICAgICAgICAgIFRPQ0NvbXBvbmVudC5hcHBlbmRUT0MoZGVzY3JpcHRvciwgY29tcG9uZW50cyk7CisKKyAgICAgICAgICAgIGlmIChvcGVuUmVzdWx0KQorICAgICAgICAgICAgICAgIGZpbmFsUmVhZGVyID0gb3BlbkZpbmFsKFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbi5OT1JNQUwpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb0NvbW1pdChUaHJvd2FibGUgYWNjdW11bGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChUcmFuc2FjdGlvbmFsIHQgOiB0cmFuc2FjdGlvbmFscy5nZXQoKS5yZXZlcnNlKCkpCisgICAgICAgICAgICAgICAgYWNjdW11bGF0ZSA9IHQuY29tbWl0KGFjY3VtdWxhdGUpOworCisgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBUaHJvd2FibGUgZG9BYm9ydChUaHJvd2FibGUgYWNjdW11bGF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChUcmFuc2FjdGlvbmFsIHQgOiB0cmFuc2FjdGlvbmFscy5nZXQoKSkKKyAgICAgICAgICAgICAgICBhY2N1bXVsYXRlID0gdC5hYm9ydChhY2N1bXVsYXRlKTsKKworICAgICAgICAgICAgaWYgKCFmaW5hbFJlYWRlckFjY2Vzc2VkICYmIGZpbmFsUmVhZGVyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWNjdW11bGF0ZSA9IFRocm93YWJsZXMucGVyZm9ybShhY2N1bXVsYXRlLCAoKSAtPiBmaW5hbFJlYWRlci5zZWxmUmVmKCkucmVsZWFzZSgpKTsKKyAgICAgICAgICAgICAgICBmaW5hbFJlYWRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgZmluYWxSZWFkZXJBY2Nlc3NlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVGhyb3dhYmxlIGRvUG9zdENsZWFudXAoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFjY3VtdWxhdGUgPSBzdXBlci5kb1Bvc3RDbGVhbnVwKGFjY3VtdWxhdGUpOworICAgICAgICAgICAgYWNjdW11bGF0ZSA9IFRocm93YWJsZXMuY2xvc2UoYWNjdW11bGF0ZSwgbW1hcHBlZFJlZ2lvbnNDYWNoZSk7CisgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBndWFyZENvbGxlY3Rpb25TaXplKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksIFVuZmlsdGVyZWQgdW5maWx0ZXJlZCkKKyAgICAvKioKKyAgICAgKiBBIGJ1aWxkZXIgb2YgdGhpcyBzc3RhYmxlIHdyaXRlci4gSXQgc2hvdWxkIGJlIGV4dGVuZGVkIGZvciBlYWNoIGltcGxlbWVudGF0aW9uIHdpdGggdGhlIHNwZWNpZmljIGZpZWxkcy4KKyAgICAgKgorICAgICAqIEFuIGltcGxlbWVudGF0aW9uIHNob3VsZCBvcGVuIGFsbCB0aGUgcmVzb3VyY2VzIHdoZW4ge0BsaW5rICNidWlsZChMaWZlY3ljbGVOZXdUcmFja2VyLCBPd25lcil9IGFuZCBwYXNzIHRoZW0KKyAgICAgKiBpbiBidWlsZGVyIGZpZWxkcyB0byB0aGUgd3JpdGVyLCBzbyB0aGF0IHRoZSB3cml0ZXIgY2FuIGFjY2VzcyB0aGVtIHZpYSBnZXR0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIDxXPiB0eXBlIG9mIHRoZSBzc3RhYmxlIHdyaXRlciB0byBiZSBidWlsZCB3aXRoIHRoaXMgYnVpbGRlcgorICAgICAqIEBwYXJhbSA8Qj4gdHlwZSBvZiB0aGlzIGJ1aWxkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEJ1aWxkZXI8VyBleHRlbmRzIFNTVGFibGVXcml0ZXIsIEIgZXh0ZW5kcyBCdWlsZGVyPFcsIEI+PiBleHRlbmRzIFNTVGFibGUuQnVpbGRlcjxXLCBCPgogICAgIHsKLSAgICAgICAgaWYgKCFHdWFyZHJhaWxzLmNvbGxlY3Rpb25TaXplLmVuYWJsZWQoKSAmJiAhR3VhcmRyYWlscy5pdGVtc1BlckNvbGxlY3Rpb24uZW5hYmxlZCgpKQotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBwcml2YXRlIE1ldGFkYXRhQ29sbGVjdG9yIG1ldGFkYXRhQ29sbGVjdG9yOworICAgICAgICBwcml2YXRlIGxvbmcga2V5Q291bnQ7CisgICAgICAgIHByaXZhdGUgbG9uZyByZXBhaXJlZEF0OworICAgICAgICBwcml2YXRlIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXI7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiB0cmFuc2llbnRTU1RhYmxlOworICAgICAgICBwcml2YXRlIFNlcmlhbGl6YXRpb25IZWFkZXIgc2VyaWFsaXphdGlvbkhlYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFNTVGFibGVGbHVzaE9ic2VydmVyPiBmbHVzaE9ic2VydmVyczsKIAotICAgICAgICBpZiAoIXVuZmlsdGVyZWQuaXNSb3coKSB8fCBTY2hlbWFDb25zdGFudHMuaXNTeXN0ZW1LZXlzcGFjZShtZXRhZGF0YS5rZXlzcGFjZSkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgUm93IHJvdyA9IChSb3cpIHVuZmlsdGVyZWQ7Ci0gICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgY29sdW1uIDogcm93LmNvbHVtbnMoKSkKKyAgICAgICAgcHVibGljIEIgc2V0TWV0YWRhdGFDb2xsZWN0b3IoTWV0YWRhdGFDb2xsZWN0b3IgbWV0YWRhdGFDb2xsZWN0b3IpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY29sdW1uLnR5cGUuaXNDb2xsZWN0aW9uKCkgfHwgIWNvbHVtbi50eXBlLmlzTXVsdGlDZWxsKCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB0aGlzLm1ldGFkYXRhQ29sbGVjdG9yID0gbWV0YWRhdGFDb2xsZWN0b3I7CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KIAotICAgICAgICAgICAgQ29tcGxleENvbHVtbkRhdGEgY2VsbHMgPSByb3cuZ2V0Q29tcGxleENvbHVtbkRhdGEoY29sdW1uKTsKLSAgICAgICAgICAgIGlmIChjZWxscyA9PSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBwdWJsaWMgQiBzZXRLZXlDb3VudChsb25nIGtleUNvdW50KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmtleUNvdW50ID0ga2V5Q291bnQ7CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KIAotICAgICAgICAgICAgQ29tcGxleENvbHVtbkRhdGEgbGl2ZUNlbGxzID0gY2VsbHMucHVyZ2UoRGVsZXRpb25QdXJnZXIuUFVSR0VfQUxMLCBGQlV0aWxpdGllcy5ub3dJblNlY29uZHMoKSk7Ci0gICAgICAgICAgICBpZiAobGl2ZUNlbGxzID09IG51bGwpCi0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHB1YmxpYyBCIHNldFJlcGFpcmVkQXQobG9uZyByZXBhaXJlZEF0KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnJlcGFpcmVkQXQgPSByZXBhaXJlZEF0OworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGludCBjZWxsc1NpemUgPSBsaXZlQ2VsbHMuZGF0YVNpemUoKTsKLSAgICAgICAgICAgIGludCBjZWxsc0NvdW50ID0gbGl2ZUNlbGxzLmNlbGxzQ291bnQoKTsKKyAgICAgICAgcHVibGljIEIgc2V0UGVuZGluZ1JlcGFpcihUaW1lVVVJRCBwZW5kaW5nUmVwYWlyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnBlbmRpbmdSZXBhaXIgPSBwZW5kaW5nUmVwYWlyOworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICghR3VhcmRyYWlscy5jb2xsZWN0aW9uU2l6ZS50cmlnZ2Vyc09uKGNlbGxzU2l6ZSwgbnVsbCkgJiYKLSAgICAgICAgICAgICAgICAhR3VhcmRyYWlscy5pdGVtc1BlckNvbGxlY3Rpb24udHJpZ2dlcnNPbihjZWxsc0NvdW50LCBudWxsKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcHVibGljIEIgc2V0VHJhbnNpZW50U1NUYWJsZShib29sZWFuIHRyYW5zaWVudFNTVGFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpZW50U1NUYWJsZSA9IHRyYW5zaWVudFNTVGFibGU7CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KIAotICAgICAgICAgICAgU3RyaW5nIGtleVN0cmluZyA9IG1ldGFkYXRhLnByaW1hcnlLZXlBc0NRTExpdGVyYWwocGFydGl0aW9uS2V5LmdldEtleSgpLCByb3cuY2x1c3RlcmluZygpKTsKLSAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCIlcyBpbiByb3cgJXMgaW4gdGFibGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLm5hbWUudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhKTsKLSAgICAgICAgICAgIEd1YXJkcmFpbHMuY29sbGVjdGlvblNpemUuZ3VhcmQoY2VsbHNTaXplLCBtc2csIHRydWUsIG51bGwpOwotICAgICAgICAgICAgR3VhcmRyYWlscy5pdGVtc1BlckNvbGxlY3Rpb24uZ3VhcmQoY2VsbHNDb3VudCwgbXNnLCB0cnVlLCBudWxsKTsKKyAgICAgICAgcHVibGljIEIgc2V0U2VyaWFsaXphdGlvbkhlYWRlcihTZXJpYWxpemF0aW9uSGVhZGVyIHNlcmlhbGl6YXRpb25IZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc2VyaWFsaXphdGlvbkhlYWRlciA9IHNlcmlhbGl6YXRpb25IZWFkZXI7CisgICAgICAgICAgICByZXR1cm4gKEIpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQiBzZXRGbHVzaE9ic2VydmVycyhDb2xsZWN0aW9uPFNTVGFibGVGbHVzaE9ic2VydmVyPiBmbHVzaE9ic2VydmVycykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5mbHVzaE9ic2VydmVycyA9IEltbXV0YWJsZUxpc3QuY29weU9mKGZsdXNoT2JzZXJ2ZXJzKTsKKyAgICAgICAgICAgIHJldHVybiAoQikgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCIGFkZERlZmF1bHRDb21wb25lbnRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2tOb3ROdWxsKGdldFRhYmxlTWV0YWRhdGFSZWYoKSk7CisKKyAgICAgICAgICAgIGFkZENvbXBvbmVudHMoSW1tdXRhYmxlU2V0Lm9mKENvbXBvbmVudHMuREFUQSwgQ29tcG9uZW50cy5TVEFUUywgQ29tcG9uZW50cy5ESUdFU1QsIENvbXBvbmVudHMuVE9DKSk7CisKKyAgICAgICAgICAgIGlmIChnZXRUYWJsZU1ldGFkYXRhUmVmKCkuZ2V0TG9jYWwoKS5wYXJhbXMuY29tcHJlc3Npb24uaXNFbmFibGVkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkQ29tcG9uZW50cyhJbW11dGFibGVTZXQub2YoQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaXQgd291bGQgZmVlbCBzYWZlciB0byBhY3R1YWxseSBhZGQgdGhpcyBjb21wb25lbnQgbGF0ZXIgaW4gbWF5YmVXcml0ZURpZ2VzdCgpLAorICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGUgY29tcG9uZW50cyBhcmUgdW5tb2RpZmlhYmxlIGFmdGVyIGNvbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgIGFkZENvbXBvbmVudHMoSW1tdXRhYmxlU2V0Lm9mKENvbXBvbmVudHMuQ1JDKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAoQikgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCIGFkZEZsdXNoT2JzZXJ2ZXJzRm9yU2Vjb25kYXJ5SW5kZXhlcyhDb2xsZWN0aW9uPEluZGV4PiBpbmRleGVzLCBPcGVyYXRpb25UeXBlIG9wZXJhdGlvblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmRleGVzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworCisgICAgICAgICAgICBDb2xsZWN0aW9uPFNTVGFibGVGbHVzaE9ic2VydmVyPiBjdXJyZW50ID0gdGhpcy5mbHVzaE9ic2VydmVycyAhPSBudWxsID8gdGhpcy5mbHVzaE9ic2VydmVycyA6IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICAgICAgTGlzdDxTU1RhYmxlRmx1c2hPYnNlcnZlcj4gb2JzZXJ2ZXJzID0gbmV3IEFycmF5TGlzdDw+KGluZGV4ZXMuc2l6ZSgpICsgY3VycmVudC5zaXplKCkpOworICAgICAgICAgICAgb2JzZXJ2ZXJzLmFkZEFsbChjdXJyZW50KTsKKworICAgICAgICAgICAgZm9yIChJbmRleCBpbmRleCA6IGluZGV4ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU1NUYWJsZUZsdXNoT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBpbmRleC5nZXRGbHVzaE9ic2VydmVyKGRlc2NyaXB0b3IsIG9wZXJhdGlvblR5cGUpOworICAgICAgICAgICAgICAgIGlmIChvYnNlcnZlciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXJzLmFkZChvYnNlcnZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc2V0Rmx1c2hPYnNlcnZlcnMob2JzZXJ2ZXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXRhZGF0YUNvbGxlY3RvciBnZXRNZXRhZGF0YUNvbGxlY3RvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YUNvbGxlY3RvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldEtleUNvdW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGtleUNvdW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0UmVwYWlyZWRBdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByZXBhaXJlZEF0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRpbWVVVUlEIGdldFBlbmRpbmdSZXBhaXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGVuZGluZ1JlcGFpcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50U1NUYWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2llbnRTU1RhYmxlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNlcmlhbGl6YXRpb25IZWFkZXIgZ2V0U2VyaWFsaXphdGlvbkhlYWRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemF0aW9uSGVhZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb248U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IGdldEZsdXNoT2JzZXJ2ZXJzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZsdXNoT2JzZXJ2ZXJzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IE1tYXBwZWRSZWdpb25zQ2FjaGUgZ2V0TW1hcHBlZFJlZ2lvbnNDYWNoZSgpOworCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVyBidWlsZChMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIsIE93bmVyIG93bmVyKQorICAgICAgICB7CisgICAgICAgICAgICBjaGVja05vdE51bGwoZ2V0Q29tcG9uZW50cygpKTsKKworICAgICAgICAgICAgdmFsaWRhdGVSZXBhaXJlZE1ldGFkYXRhKGdldFJlcGFpcmVkQXQoKSwgZ2V0UGVuZGluZ1JlcGFpcigpLCBpc1RyYW5zaWVudFNTVGFibGUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBidWlsZEludGVybmFsKGxpZmVjeWNsZU5ld1RyYWNrZXIsIG93bmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBXIGJ1aWxkSW50ZXJuYWwoTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyLCBPd25lciBvd25lcik7CisKKyAgICAgICAgcHVibGljIFNTVGFibGVaZXJvQ29weVdyaXRlciBjcmVhdGVaZXJvQ29weVdyaXRlcihMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIsIE93bmVyIG93bmVyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNTVGFibGVaZXJvQ29weVdyaXRlcih0aGlzLCBsaWZlY3ljbGVOZXdUcmFja2VyLCBvd25lcik7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9Tb3J0ZWRUYWJsZVBhcnRpdGlvbldyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU29ydGVkVGFibGVQYXJ0aXRpb25Xcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjM0YWYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU29ydGVkVGFibGVQYXJ0aXRpb25Xcml0ZXIuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJhbmdlVG9tYnN0b25lTWFya2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuU2VyaWFsaXphdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3J0ZWRUYWJsZVBhcnRpdGlvbldyaXRlciBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUKK3sKKyAgICBwcm90ZWN0ZWQgZmluYWwgVW5maWx0ZXJlZFNlcmlhbGl6ZXIgdW5maWx0ZXJlZFNlcmlhbGl6ZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyOworICAgIHByaXZhdGUgZmluYWwgU2VxdWVudGlhbFdyaXRlciB3cml0ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXJpYWxpemF0aW9uSGVscGVyIGhlbHBlcjsKKyAgICBwcml2YXRlIGZpbmFsIGludCB2ZXJzaW9uOworCisgICAgcHJpdmF0ZSBsb25nIHByZXZpb3VzUm93U3RhcnQ7CisgICAgcHJpdmF0ZSBsb25nIGluaXRpYWxQb3NpdGlvbjsKKyAgICBwcml2YXRlIGxvbmcgaGVhZGVyTGVuZ3RoOworCisgICAgcHJvdGVjdGVkIGxvbmcgc3RhcnRQb3NpdGlvbjsKKyAgICBwcm90ZWN0ZWQgaW50IHdyaXR0ZW47CisKKyAgICBwcm90ZWN0ZWQgQ2x1c3RlcmluZ1ByZWZpeDw/PiBmaXJzdENsdXN0ZXJpbmc7CisgICAgcHJvdGVjdGVkIENsdXN0ZXJpbmdQcmVmaXg8Pz4gbGFzdENsdXN0ZXJpbmc7CisKKyAgICBwcm90ZWN0ZWQgRGVsZXRpb25UaW1lIG9wZW5NYXJrZXIgPSBEZWxldGlvblRpbWUuTElWRTsKKyAgICBwcm90ZWN0ZWQgRGVsZXRpb25UaW1lIHN0YXJ0T3Blbk1hcmtlciA9IERlbGV0aW9uVGltZS5MSVZFOworCisgICAgLy8gU2VxdWVuY2UgY29udHJvbCwgYWxzbyB1c2VkIHRvIGFkZCBlbXB0eSBzdGF0aWMgcm93IGlmIGBhZGRTdGF0aWNSb3dgIGlzIG5vdCBjYWxsZWQuCisgICAgcHJpdmF0ZSBlbnVtIFN0YXRlCisgICAgeworICAgICAgICBBV0FJVElOR19QQVJUSVRJT05fSEVBREVSLAorICAgICAgICBBV0FJVElOR19TVEFUSUNfUk9XLAorICAgICAgICBBV0FJVElOR19ST1dTLAorICAgICAgICBDT01QTEVURUQKKyAgICB9CisKKyAgICBTdGF0ZSBzdGF0ZSA9IFN0YXRlLkFXQUlUSU5HX1BBUlRJVElPTl9IRUFERVI7CisKKyAgICBwcm90ZWN0ZWQgU29ydGVkVGFibGVQYXJ0aXRpb25Xcml0ZXIoU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIsIFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyLCBWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICB0aGlzLmhlYWRlciA9IGhlYWRlcjsKKyAgICAgICAgdGhpcy53cml0ZXIgPSB3cml0ZXI7CisgICAgICAgIHRoaXMudW5maWx0ZXJlZFNlcmlhbGl6ZXIgPSBVbmZpbHRlcmVkU2VyaWFsaXplci5zZXJpYWxpemVyOworICAgICAgICB0aGlzLmhlbHBlciA9IG5ldyBTZXJpYWxpemF0aW9uSGVscGVyKGhlYWRlcik7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb24uY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb24oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNldCgpCisgICAgeworICAgICAgICB0aGlzLmluaXRpYWxQb3NpdGlvbiA9IHdyaXRlci5wb3NpdGlvbigpOworICAgICAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPSAtMTsKKyAgICAgICAgdGhpcy5wcmV2aW91c1Jvd1N0YXJ0ID0gMDsKKyAgICAgICAgdGhpcy53cml0dGVuID0gMDsKKyAgICAgICAgdGhpcy5maXJzdENsdXN0ZXJpbmcgPSBudWxsOworICAgICAgICB0aGlzLmxhc3RDbHVzdGVyaW5nID0gbnVsbDsKKyAgICAgICAgdGhpcy5vcGVuTWFya2VyID0gRGVsZXRpb25UaW1lLkxJVkU7CisgICAgICAgIHRoaXMuaGVhZGVyTGVuZ3RoID0gLTE7CisgICAgICAgIHRoaXMuc3RhdGUgPSBTdGF0ZS5BV0FJVElOR19QQVJUSVRJT05fSEVBREVSOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEhlYWRlckxlbmd0aCgpCisgICAgeworICAgICAgICByZXR1cm4gaGVhZGVyTGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KERlY29yYXRlZEtleSBrZXksIERlbGV0aW9uVGltZSBwYXJ0aXRpb25MZXZlbERlbGV0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChzdGF0ZSA9PSBTdGF0ZS5DT01QTEVURUQpCisgICAgICAgICAgICByZXNldCgpOworCisgICAgICAgIGNoZWNrU3RhdGUoc3RhdGUgPT0gU3RhdGUuQVdBSVRJTkdfUEFSVElUSU9OX0hFQURFUik7CisKKyAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGgoa2V5LmdldEtleSgpLCB3cml0ZXIpOworICAgICAgICBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemUocGFydGl0aW9uTGV2ZWxEZWxldGlvbiwgd3JpdGVyKTsKKworICAgICAgICBpZiAoIWhlYWRlci5oYXNTdGF0aWMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSB3cml0ZXIucG9zaXRpb24oKSAtIGluaXRpYWxQb3NpdGlvbjsKKyAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuQVdBSVRJTkdfUk9XUzsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlID0gU3RhdGUuQVdBSVRJTkdfU1RBVElDX1JPVzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRTdGF0aWNSb3coUm93IHN0YXRpY1JvdykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBjaGVja1N0YXRlKHN0YXRlID09IFN0YXRlLkFXQUlUSU5HX1NUQVRJQ19ST1cpOworICAgICAgICBjaGVja1N0YXRlKHN0YXRpY1Jvdy5pc1N0YXRpYygpKTsKKworICAgICAgICBVbmZpbHRlcmVkU2VyaWFsaXplci5zZXJpYWxpemVyLnNlcmlhbGl6ZVN0YXRpY1JvdyhzdGF0aWNSb3csIGhlbHBlciwgd3JpdGVyLCB2ZXJzaW9uKTsKKworICAgICAgICB0aGlzLmhlYWRlckxlbmd0aCA9IHdyaXRlci5wb3NpdGlvbigpIC0gaW5pdGlhbFBvc2l0aW9uOworICAgICAgICBzdGF0ZSA9IFN0YXRlLkFXQUlUSU5HX1JPV1M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkVW5maWx0ZXJlZChVbmZpbHRlcmVkIHVuZmlsdGVyZWQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY2hlY2tTdGF0ZShzdGF0ZSA9PSBTdGF0ZS5BV0FJVElOR19ST1dTKTsKKworICAgICAgICBsb25nIHBvcyA9IGN1cnJlbnRQb3NpdGlvbigpOworCisgICAgICAgIGlmIChmaXJzdENsdXN0ZXJpbmcgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQmVnaW5uaW5nIG9mIGFuIGluZGV4IGJsb2NrLiBSZW1lbWJlciB0aGUgc3RhcnQgYW5kIHBvc2l0aW9uCisgICAgICAgICAgICBmaXJzdENsdXN0ZXJpbmcgPSB1bmZpbHRlcmVkLmNsdXN0ZXJpbmcoKTsKKyAgICAgICAgICAgIHN0YXJ0T3Blbk1hcmtlciA9IG9wZW5NYXJrZXI7CisgICAgICAgICAgICBzdGFydFBvc2l0aW9uID0gcG9zOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyB1bmZpbHRlcmVkUG9zaXRpb24gPSB3cml0ZXIucG9zaXRpb24oKTsKKyAgICAgICAgdW5maWx0ZXJlZFNlcmlhbGl6ZXIuc2VyaWFsaXplKHVuZmlsdGVyZWQsIGhlbHBlciwgd3JpdGVyLCBwb3MgLSBwcmV2aW91c1Jvd1N0YXJ0LCB2ZXJzaW9uKTsKKworICAgICAgICBsYXN0Q2x1c3RlcmluZyA9IHVuZmlsdGVyZWQuY2x1c3RlcmluZygpOworICAgICAgICBwcmV2aW91c1Jvd1N0YXJ0ID0gcG9zOworICAgICAgICArK3dyaXR0ZW47CisKKyAgICAgICAgaWYgKHVuZmlsdGVyZWQua2luZCgpID09IFVuZmlsdGVyZWQuS2luZC5SQU5HRV9UT01CU1RPTkVfTUFSS0VSKQorICAgICAgICB7CisgICAgICAgICAgICBSYW5nZVRvbWJzdG9uZU1hcmtlciBtYXJrZXIgPSAoUmFuZ2VUb21ic3RvbmVNYXJrZXIpIHVuZmlsdGVyZWQ7CisgICAgICAgICAgICBvcGVuTWFya2VyID0gbWFya2VyLmlzT3BlbihmYWxzZSkgPyBtYXJrZXIub3BlbkRlbGV0aW9uVGltZShmYWxzZSkgOiBEZWxldGlvblRpbWUuTElWRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBsb25nIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY2hlY2tTdGF0ZShzdGF0ZSA9PSBTdGF0ZS5BV0FJVElOR19ST1dTKTsKKworICAgICAgICBzdGF0ZSA9IFN0YXRlLkNPTVBMRVRFRDsKKworICAgICAgICBsb25nIGVuZFBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uKCk7CisgICAgICAgIHVuZmlsdGVyZWRTZXJpYWxpemVyLndyaXRlRW5kT2ZQYXJ0aXRpb24od3JpdGVyKTsKKworICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247CisgICAgfQorCisgICAgcHJvdGVjdGVkIGxvbmcgY3VycmVudFBvc2l0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiB3cml0ZXIucG9zaXRpb24oKSAtIGluaXRpYWxQb3NpdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRJbml0aWFsUG9zaXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGluaXRpYWxQb3NpdGlvbjsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU29ydGVkVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU29ydGVkVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNjQ3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9Tb3J0ZWRUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLkJ0aUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5WYWxpZGF0aW9uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLklGaWx0ZXI7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3J0ZWRUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyLCBCIGV4dGVuZHMgU1NUYWJsZVJlYWRlci5CdWlsZGVyPFIsIEI+PgorZXh0ZW5kcyBTU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXI8UiwgQj4KK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU29ydGVkVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlci5jbGFzcyk7CisgICAgcHJpdmF0ZSBGaWxlSGFuZGxlLkJ1aWxkZXIgZGF0YUZpbGVCdWlsZGVyOworCisgICAgcHVibGljIFNvcnRlZFRhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIoU1NUYWJsZS5CdWlsZGVyPD8sID8+IGJ1aWxkZXIpCisgICAgeworICAgICAgICBzdXBlcihidWlsZGVyKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgSUZpbHRlciBsb2FkRmlsdGVyKFZhbGlkYXRpb25NZXRhZGF0YSB2YWxpZGF0aW9uTWV0YWRhdGEpCisgICAgeworICAgICAgICByZXR1cm4gRmlsdGVyQ29tcG9uZW50Lm1heWJlTG9hZEJsb29tRmlsdGVyKGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU1ldGFkYXRhUmVmLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25NZXRhZGF0YSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEZpbGVIYW5kbGUuQnVpbGRlciBkYXRhRmlsZUJ1aWxkZXIoU3RhdHNNZXRhZGF0YSBzdGF0c01ldGFkYXRhKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHRoaXMuZGF0YUZpbGVCdWlsZGVyID09IG51bGwgfHwgdGhpcy5kYXRhRmlsZUJ1aWxkZXIuZmlsZS5lcXVhbHMoZGVzY3JpcHRvci5maWxlRm9yKEJ0aUZvcm1hdC5Db21wb25lbnRzLkRBVEEpKTsKKworICAgICAgICBsb2dnZXIuaW5mbygiT3BlbmluZyB7fSAoe30pIiwgZGVzY3JpcHRvciwgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoZGVzY3JpcHRvci5maWxlRm9yKEJ0aUZvcm1hdC5Db21wb25lbnRzLkRBVEEpLmxlbmd0aCgpKSk7CisKKyAgICAgICAgbG9uZyByZWNvcmRTaXplID0gc3RhdHNNZXRhZGF0YS5lc3RpbWF0ZWRQYXJ0aXRpb25TaXplLnBlcmNlbnRpbGUoaW9PcHRpb25zLmRpc2tPcHRpbWl6YXRpb25Fc3RpbWF0ZVBlcmNlbnRpbGUpOworICAgICAgICBpbnQgYnVmZmVyU2l6ZSA9IGlvT3B0aW9ucy5kaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3kuYnVmZmVyU2l6ZShyZWNvcmRTaXplKTsKKworICAgICAgICBpZiAoZGF0YUZpbGVCdWlsZGVyID09IG51bGwpCisgICAgICAgICAgICBkYXRhRmlsZUJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGRlc2NyaXB0b3IuZmlsZUZvcihCdGlGb3JtYXQuQ29tcG9uZW50cy5EQVRBKSk7CisKKyAgICAgICAgZGF0YUZpbGVCdWlsZGVyLmJ1ZmZlclNpemUoYnVmZmVyU2l6ZSk7CisgICAgICAgIGRhdGFGaWxlQnVpbGRlci53aXRoQ2h1bmtDYWNoZShjaHVua0NhY2hlKTsKKyAgICAgICAgZGF0YUZpbGVCdWlsZGVyLm1tYXBwZWQoaW9PcHRpb25zLmRlZmF1bHREaXNrQWNjZXNzTW9kZSk7CisKKyAgICAgICAgcmV0dXJuIGRhdGFGaWxlQnVpbGRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9Tb3J0ZWRUYWJsZVNjcnViYmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9Tb3J0ZWRUYWJsZVNjcnViYmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjOTEzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NvcnRlZFRhYmxlU2NydWJiZXIuamF2YQpAQCAtMCwwICsxLDYzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IGphdmEuaW8uSU9FcnJvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlYWRXcml0ZUxvY2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLmNvbmN1cnJlbnQuTm90VGhyZWFkU2FmZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0NvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkxpdmVuZXNzSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkltbXV0YWJsZUJUcmVlUGFydGl0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQWJzdHJhY3RDZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNvbHVtbkRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Db21wbGV4Q29sdW1uRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvd3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLldyYXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU2NydWJiZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlSWRlbnRpdHlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZXdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQWJzdHJhY3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuSGVhcENsb25lcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOworCitATm90VGhyZWFkU2FmZQorcHVibGljIGFic3RyYWN0IGNsYXNzIFNvcnRlZFRhYmxlU2NydWJiZXI8UiBleHRlbmRzIFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyPiBpbXBsZW1lbnRzIElTY3J1YmJlcgoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTb3J0ZWRUYWJsZVNjcnViYmVyLmNsYXNzKTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSBjZnM7CisgICAgcHJvdGVjdGVkIGZpbmFsIExpZmVjeWNsZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uOworICAgIHByb3RlY3RlZCBmaW5hbCBGaWxlIGRlc3RpbmF0aW9uOworICAgIHByb3RlY3RlZCBmaW5hbCBJU2NydWJiZXIuT3B0aW9ucyBvcHRpb25zOworICAgIHByb3RlY3RlZCBmaW5hbCBSIHNzdGFibGU7CisgICAgcHJvdGVjdGVkIGZpbmFsIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlcjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc0NvbW11dGF0aXZlOworICAgIHByb3RlY3RlZCBmaW5hbCBsb25nIGV4cGVjdGVkQmxvb21GaWx0ZXJTaXplOworICAgIHByb3RlY3RlZCBmaW5hbCBSZWFkV3JpdGVMb2NrIGZpbGVBY2Nlc3NMb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGRhdGFGaWxlOworICAgIHByb3RlY3RlZCBmaW5hbCBTY3J1YkluZm8gc2NydWJJbmZvOworCisgICAgcHJvdGVjdGVkIGZpbmFsIE5lZ2F0aXZlTG9jYWxEZWxldGlvbkluZm9NZXRyaWNzIG5lZ2F0aXZlTG9jYWxEZWxldGlvbkluZm9NZXRyaWNzID0gbmV3IE5lZ2F0aXZlTG9jYWxEZWxldGlvbkluZm9NZXRyaWNzKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFBhcnRpdGlvbj4gcGFydGl0aW9uQ29tcGFyYXRvciA9IENvbXBhcmF0b3IuY29tcGFyaW5nKFBhcnRpdGlvbjo6cGFydGl0aW9uS2V5KTsKKyAgICBwcm90ZWN0ZWQgZmluYWwgU29ydGVkU2V0PFBhcnRpdGlvbj4gb3V0T2ZPcmRlciA9IG5ldyBUcmVlU2V0PD4ocGFydGl0aW9uQ29tcGFyYXRvcik7CisKKworICAgIHByb3RlY3RlZCBpbnQgZ29vZFBhcnRpdGlvbnM7CisgICAgcHJvdGVjdGVkIGludCBiYWRQYXJ0aXRpb25zOworICAgIHByb3RlY3RlZCBpbnQgZW1wdHlQYXJ0aXRpb25zOworCisKKyAgICBwcm90ZWN0ZWQgU29ydGVkVGFibGVTY3J1YmJlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMgb3B0aW9ucykKKyAgICB7CisgICAgICAgIHRoaXMuc3N0YWJsZSA9IChSKSB0cmFuc2FjdGlvbi5vbmx5T25lKCk7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHNzdGFibGUubWV0YWRhdGEoKSk7CisgICAgICAgIGFzc2VydCBzc3RhYmxlLm1ldGFkYXRhKCkua2V5c3BhY2UuZXF1YWxzKGNmcy5rZXlzcGFjZS5nZXROYW1lKCkpOworICAgICAgICBpZiAoIXNzdGFibGUuZGVzY3JpcHRvci5jZm5hbWUuZXF1YWxzKGNmcy5tZXRhZGF0YSgpLm5hbWUpKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIud2FybigiRGVzY3JpcHRvciBwb2ludHMgdG8gYSBkaWZmZXJlbnQgdGFibGUge30gdGhhbiBtZXRhZGF0YSB7fSIsIHNzdGFibGUuZGVzY3JpcHRvci5jZm5hbWUsIGNmcy5tZXRhZGF0YSgpLm5hbWUpOworICAgICAgICB9CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBzc3RhYmxlLm1ldGFkYXRhKCkudmFsaWRhdGVDb21wYXRpYmlsaXR5KGNmcy5tZXRhZGF0YSgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkRlc2NyaXB0b3IgcG9pbnRzIHRvIGEgZGlmZmVyZW50IHRhYmxlIHt9IHRoYW4gbWV0YWRhdGEge30iLCBzc3RhYmxlLmRlc2NyaXB0b3IuY2ZuYW1lLCBjZnMubWV0YWRhdGEoKS5uYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuY2ZzID0gY2ZzOworICAgICAgICB0aGlzLnRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisgICAgICAgIHRoaXMub3V0cHV0SGFuZGxlciA9IG91dHB1dEhhbmRsZXI7CisgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2soY2ZzLmdldERpc2tCb3VuZGFyaWVzKCkuZ2V0Q29ycmVjdERpc2tGb3JTU1RhYmxlKHNzdGFibGUpKTsKKyAgICAgICAgdGhpcy5pc0NvbW11dGF0aXZlID0gY2ZzLm1ldGFkYXRhKCkuaXNDb3VudGVyKCk7CisKKyAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiB0b1NjcnViID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzc3RhYmxlKTsKKworICAgICAgICBsb25nIGFwcHJveGltYXRlS2V5Q291bnQ7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBhcHByb3hpbWF0ZUtleUNvdW50ID0gU1NUYWJsZVJlYWRlci5nZXRBcHByb3hpbWF0ZUtleUNvdW50KHRvU2NydWIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBhcHByb3hpbWF0ZUtleUNvdW50ID0gMDsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmV4cGVjdGVkQmxvb21GaWx0ZXJTaXplID0gTWF0aC5tYXgoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIGFwcHJveGltYXRlS2V5Q291bnQpOworCisgICAgICAgIC8vIGxvb3AgdGhyb3VnaCBlYWNoIHBhcnRpdGlvbiwgZGVzZXJpYWxpemluZyB0byBjaGVjayBmb3IgZGFtYWdlLgorICAgICAgICAvLyBXZSdsbCBhbHNvIGxvb3AgdGhyb3VnaCB0aGUgaW5kZXggYXQgdGhlIHNhbWUgdGltZSwgdXNpbmcgdGhlIHBvc2l0aW9uIGZyb20gdGhlIGluZGV4IHRvIHJlY292ZXIgaWYgdGhlCisgICAgICAgIC8vIHBhcnRpdGlvbiBoZWFkZXIgKGtleSBvciBkYXRhIHNpemUpIGlzIGNvcnJ1cHQuIChUaGlzIG1lYW5zIG91ciBwb3NpdGlvbiBpbiB0aGUgaW5kZXggZmlsZSB3aWxsIGJlIG9uZQorICAgICAgICAvLyBwYXJ0aXRpb24gImFoZWFkIiBvZiB0aGUgZGF0YSBmaWxlLikKKyAgICAgICAgdGhpcy5kYXRhRmlsZSA9IHRyYW5zYWN0aW9uLmlzT2ZmbGluZSgpCisgICAgICAgICAgICAgICAgICAgICAgICA/IHNzdGFibGUub3BlbkRhdGFSZWFkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBzc3RhYmxlLm9wZW5EYXRhUmVhZGVyKENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmdldFJhdGVMaW1pdGVyKCkpOworCisgICAgICAgIHRoaXMuc2NydWJJbmZvID0gbmV3IFNjcnViSW5mbyhkYXRhRmlsZSwgc3N0YWJsZSwgZmlsZUFjY2Vzc0xvY2sucmVhZExvY2soKSk7CisKKyAgICAgICAgaWYgKG9wdGlvbnMucmVpbnNlcnRPdmVyZmxvd2VkVFRMUm93cykKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJTdGFydGluZyBzY3J1YiB3aXRoIHJlaW5zZXJ0IG92ZXJmbG93ZWQgVFRMIG9wdGlvbiIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVPcnBoYW5lZENvbXBvbmVudHMoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzKQorICAgIHsKKyAgICAgICAgRmlsZSBkYXRhRmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpOworICAgICAgICBpZiAoY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnRzLkRBVEEpICYmIGRhdGFGaWxlLmxlbmd0aCgpID4gMCkKKyAgICAgICAgICAgIC8vIGV2ZXJ5dGhpbmcgYXBwZWFycyB0byBiZSBpbiBvcmRlci4uLiBtb3Zpbmcgb24uCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gbWlzc2luZyB0aGUgREFUQSBmaWxlISBhbGwgY29tcG9uZW50cyBhcmUgb3JwaGFuZWQKKyAgICAgICAgbG9nZ2VyLndhcm4oIlJlbW92aW5nIG9ycGhhbnMgZm9yIHt9OiB7fSIsIGRlc2NyaXB0b3IsIGNvbXBvbmVudHMpOworICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBkZXNjcmlwdG9yLmZpbGVGb3IoY29tcG9uZW50KTsKKyAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKQorICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpLmRlbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2NydWIoKQorICAgIHsKKyAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBmaW5pc2hlZCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiU2NydWJiaW5nICVzICglcykiLCBzc3RhYmxlLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShkYXRhRmlsZS5sZW5ndGgoKSkpOworICAgICAgICB0cnkgKFNTVGFibGVSZXdyaXRlciB3cml0ZXIgPSBTU1RhYmxlUmV3cml0ZXIuY29uc3RydWN0KGNmcywgdHJhbnNhY3Rpb24sIGZhbHNlLCBzc3RhYmxlLm1heERhdGFBZ2UpOworICAgICAgICAgICAgIFJlZnM8U1NUYWJsZVJlYWRlcj4gcmVmcyA9IFJlZnMucmVmKENvbGxlY3Rpb25zLnNpbmdsZXRvbihzc3RhYmxlKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgbWV0YWRhdGEgPSBzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpOworICAgICAgICAgICAgd3JpdGVyLnN3aXRjaFdyaXRlcihDb21wYWN0aW9uTWFuYWdlci5jcmVhdGVXcml0ZXIoY2ZzLCBkZXN0aW5hdGlvbiwgZXhwZWN0ZWRCbG9vbUZpbHRlclNpemUsIG1ldGFkYXRhLnJlcGFpcmVkQXQsIG1ldGFkYXRhLnBlbmRpbmdSZXBhaXIsIG1ldGFkYXRhLmlzVHJhbnNpZW50LCBzc3RhYmxlLCB0cmFuc2FjdGlvbikpOworCisgICAgICAgICAgICBzY3J1YkludGVybmFsKHdyaXRlcik7CisKKyAgICAgICAgICAgIGlmICghb3V0T2ZPcmRlci5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgZmluaXNoZWQuYWRkKHdyaXRlT3V0T2ZPcmRlclBhcnRpdGlvbnMobWV0YWRhdGEpKTsKKworICAgICAgICAgICAgLy8gZmluaXNoIG9ic29sZXRlcyB0aGUgb2xkIHNzdGFibGUKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uLm9ic29sZXRlT3JpZ2luYWxzKCk7CisgICAgICAgICAgICBmaW5pc2hlZC5hZGRBbGwod3JpdGVyLnNldFJlcGFpcmVkQXQoYmFkUGFydGl0aW9ucyA+IDAgPyBBY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRSA6IHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkucmVwYWlyZWRBdCkuZmluaXNoKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uLmlzT2ZmbGluZSgpKQorICAgICAgICAgICAgICAgIGZpbmlzaGVkLmZvckVhY2goc3N0YWJsZSAtPiBzc3RhYmxlLnNlbGZSZWYoKS5yZWxlYXNlKCkpOworICAgICAgICB9CisKKyAgICAgICAgb3V0cHV0U3VtbWFyeShmaW5pc2hlZCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2NydWJJbnRlcm5hbChTU1RhYmxlUmV3cml0ZXIgd3JpdGVyKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBwcml2YXRlIHZvaWQgb3V0cHV0U3VtbWFyeShMaXN0PFNTVGFibGVSZWFkZXI+IGZpbmlzaGVkKQorICAgIHsKKyAgICAgICAgaWYgKCFmaW5pc2hlZC5pc0VtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJTY3J1YiBvZiAlcyBjb21wbGV0ZTogJWQgcGFydGl0aW9ucyBpbiBuZXcgc3N0YWJsZSBhbmQgJWQgZW1wdHkgKHRvbWJzdG9uZWQpIHBhcnRpdGlvbnMgZHJvcHBlZCIsIHNzdGFibGUsIGdvb2RQYXJ0aXRpb25zLCBlbXB0eVBhcnRpdGlvbnMpOworICAgICAgICAgICAgaWYgKG5lZ2F0aXZlTG9jYWxEZWxldGlvbkluZm9NZXRyaWNzLmZpeGVkUm93cyA+IDApCisgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIkZpeGVkICVkIHJvd3Mgd2l0aCBvdmVyZmxvd2VkIGxvY2FsIGRlbGV0aW9uIHRpbWUuIiwgbmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3MuZml4ZWRSb3dzKTsKKyAgICAgICAgICAgIGlmIChiYWRQYXJ0aXRpb25zID4gMCkKKyAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIlVuYWJsZSB0byByZWNvdmVyICVkIHBhcnRpdGlvbnMgdGhhdCB3ZXJlIHNraXBwZWQuICBZb3UgY2FuIGF0dGVtcHQgbWFudWFsIHJlY292ZXJ5IGZyb20gdGhlIHByZS1zY3J1YiBzbmFwc2hvdC4gIFlvdSBjYW4gYWxzbyBydW4gbm9kZXRvb2wgcmVwYWlyIHRvIHRyYW5zZmVyIHRoZSBkYXRhIGZyb20gYSBoZWFsdGh5IHJlcGxpY2EsIGlmIGFueSIsIGJhZFBhcnRpdGlvbnMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJhZFBhcnRpdGlvbnMgPiAwKQorICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiTm8gdmFsaWQgcGFydGl0aW9ucyBmb3VuZCB3aGlsZSBzY3J1YmJpbmcgJXM7IGl0IGlzIG1hcmtlZCBmb3IgZGVsZXRpb24gbm93LiBJZiB5b3Ugd2FudCB0byBhdHRlbXB0IG1hbnVhbCByZWNvdmVyeSwgeW91IGNhbiBmaW5kIGEgY29weSBpbiB0aGUgcHJlLXNjcnViIHNuYXBzaG90Iiwgc3N0YWJsZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIlNjcnViIG9mICVzIGNvbXBsZXRlOyBsb29rcyBsaWtlIGFsbCAlZCBwYXJ0aXRpb25zIHdlcmUgdG9tYnN0b25lZCIsIHNzdGFibGUsIGVtcHR5UGFydGl0aW9ucyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFNTVGFibGVSZWFkZXIgd3JpdGVPdXRPZk9yZGVyUGFydGl0aW9ucyhTdGF0c01ldGFkYXRhIG1ldGFkYXRhKQorICAgIHsKKyAgICAgICAgLy8gb3V0IG9mIG9yZGVyIHBhcnRpdGlvbnMvcm93cywgYnV0IG5vIGJhZCBwYXJ0aXRpb24gZm91bmQgLSB3ZSBjYW4ga2VlcCBvdXIgcmVwYWlyZWRBdCB0aW1lCisgICAgICAgIGxvbmcgcmVwYWlyZWRBdCA9IGJhZFBhcnRpdGlvbnMgPiAwID8gQWN0aXZlUmVwYWlyU2VydmljZS5VTlJFUEFJUkVEX1NTVEFCTEUgOiBzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLnJlcGFpcmVkQXQ7CisgICAgICAgIFNTVGFibGVSZWFkZXIgbmV3SW5PcmRlclNzdGFibGU7CisgICAgICAgIHRyeSAoU1NUYWJsZVdyaXRlciBpbk9yZGVyV3JpdGVyID0gQ29tcGFjdGlvbk1hbmFnZXIuY3JlYXRlV3JpdGVyKGNmcywgZGVzdGluYXRpb24sIGV4cGVjdGVkQmxvb21GaWx0ZXJTaXplLCByZXBhaXJlZEF0LCBtZXRhZGF0YS5wZW5kaW5nUmVwYWlyLCBtZXRhZGF0YS5pc1RyYW5zaWVudCwgc3N0YWJsZSwgdHJhbnNhY3Rpb24pKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKFBhcnRpdGlvbiBwYXJ0aXRpb24gOiBvdXRPZk9yZGVyKQorICAgICAgICAgICAgICAgIGluT3JkZXJXcml0ZXIuYXBwZW5kKHBhcnRpdGlvbi51bmZpbHRlcmVkSXRlcmF0b3IoKSk7CisgICAgICAgICAgICBpbk9yZGVyV3JpdGVyLnNldFJlcGFpcmVkQXQoLTEpOworICAgICAgICAgICAgaW5PcmRlcldyaXRlci5zZXRNYXhEYXRhQWdlKHNzdGFibGUubWF4RGF0YUFnZSk7CisgICAgICAgICAgICBuZXdJbk9yZGVyU3N0YWJsZSA9IGluT3JkZXJXcml0ZXIuZmluaXNoKHRydWUpOworICAgICAgICB9CisgICAgICAgIHRyYW5zYWN0aW9uLnVwZGF0ZShuZXdJbk9yZGVyU3N0YWJsZSwgZmFsc2UpOworICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIiVkIG91dCBvZiBvcmRlciBwYXJ0aXRpb24gKG9yIHBhcnRpdGlvbnMgd2l0aG91dCBvZiBvcmRlciByb3dzKSBmb3VuZCB3aGlsZSBzY3J1YmJpbmcgJXM7ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRob3NlIGhhdmUgYmVlbiB3cml0dGVuIChpbiBvcmRlcikgdG8gYSBuZXcgc3N0YWJsZSAoJXMpIiwgb3V0T2ZPcmRlci5zaXplKCksIHNzdGFibGUsIG5ld0luT3JkZXJTc3RhYmxlKTsKKyAgICAgICAgcmV0dXJuIG5ld0luT3JkZXJTc3RhYmxlOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBVbmZpbHRlcmVkUm93SXRlcmF0b3Igd2l0aFZhbGlkYXRpb24oVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXIsIFN0cmluZyBmaWxlbmFtZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgU2NydWJSZXN1bHQgc2NydWJXaXRoUmVzdWx0KCkKKyAgICB7CisgICAgICAgIHNjcnViKCk7CisgICAgICAgIHJldHVybiBuZXcgU2NydWJSZXN1bHQoZ29vZFBhcnRpdGlvbnMsIGJhZFBhcnRpdGlvbnMsIGVtcHR5UGFydGl0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbXBhY3Rpb25JbmZvLkhvbGRlciBnZXRTY3J1YkluZm8oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNjcnViSW5mbzsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleVN0cmluZyhEZWNvcmF0ZWRLZXkga2V5KQorICAgIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuICIodW5rbm93bikiOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY2ZzLm1ldGFkYXRhKCkucGFydGl0aW9uS2V5VHlwZS5nZXRTdHJpbmcoa2V5LmdldEtleSgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIoY29ycnVwdGVkOyBoZXggdmFsdWU6ICVzKSIsIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoa2V5LmdldEtleSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiB0cnlBcHBlbmQoRGVjb3JhdGVkS2V5IHByZXZLZXksIERlY29yYXRlZEtleSBrZXksIFNTVGFibGVSZXdyaXRlciB3cml0ZXIpCisgICAgeworICAgICAgICAvLyBPcmRlckNoZWNrZXJJdGVyYXRvciB3aWxsIGNoZWNrLCBhdCBpdGVyYXRpb24gdGltZSwgdGhhdCB0aGUgcm93cyBhcmUgaW4gdGhlIHByb3BlciBvcmRlci4gSWYgaXQgZGV0ZWN0cworICAgICAgICAvLyB0aGF0IG9uZSByb3cgaXMgb3V0IG9mIG9yZGVyLCBpdCB3aWxsIHN0b3AgcmV0dXJuaW5nIHRoZW0uIFRoZSByZW1haW5pbmcgcm93cyB3aWxsIGJlIHNvcnRlZCBhbmQgYWRkZWQKKyAgICAgICAgLy8gdG8gdGhlIG91dE9mT3JkZXIgc2V0IHRoYXQgd2lsbCBiZSBsYXRlciB3cml0dGVuIHRvIGEgbmV3IFNTVGFibGUuCisgICAgICAgIHRyeSAoT3JkZXJDaGVja2VySXRlcmF0b3Igc3N0YWJsZUl0ZXJhdG9yID0gbmV3IE9yZGVyQ2hlY2tlckl0ZXJhdG9yKGdldEl0ZXJhdG9yKGtleSksIGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IpOworICAgICAgICAgICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvciA9IHdpdGhWYWxpZGF0aW9uKHNzdGFibGVJdGVyYXRvciwgZGF0YUZpbGUuZ2V0UGF0aCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHByZXZLZXkgIT0gbnVsbCAmJiBwcmV2S2V5LmNvbXBhcmVUbyhrZXkpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYXZlT3V0T2ZPcmRlclBhcnRpdGlvbihwcmV2S2V5LCBrZXksIGl0ZXJhdG9yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh3cml0ZXIudHJ5QXBwZW5kKGl0ZXJhdG9yKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGVtcHR5UGFydGl0aW9ucysrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGdvb2RQYXJ0aXRpb25zKys7CisKKyAgICAgICAgICAgIGlmIChzc3RhYmxlSXRlcmF0b3IuaGFzUm93c091dE9mT3JkZXIoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIk91dCBvZiBvcmRlciByb3dzIGZvdW5kIGluIHBhcnRpdGlvbjogJXMiLCBrZXlTdHJpbmcoa2V5KSk7CisgICAgICAgICAgICAgICAgb3V0T2ZPcmRlci5hZGQoc3N0YWJsZUl0ZXJhdG9yLmdldFJvd3NPdXRPZk9yZGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogT25seSB3cmFwIHdpdGgge0BsaW5rIEZpeE5lZ2F0aXZlTG9jYWxEZWxldGlvblRpbWVJdGVyYXRvcn0gaWYge0BsaW5rIElTY3J1YmJlci5PcHRpb25zI3JlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3N9IG9wdGlvbgorICAgICAqIGlzIHNwZWNpZmllZAorICAgICAqLworICAgIHByaXZhdGUgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGdldEl0ZXJhdG9yKERlY29yYXRlZEtleSBrZXkpCisgICAgeworICAgICAgICBSb3dNZXJnaW5nU1NUYWJsZUl0ZXJhdG9yIHJvd01lcmdpbmdJdGVyYXRvciA9IG5ldyBSb3dNZXJnaW5nU1NUYWJsZUl0ZXJhdG9yKFNTVGFibGVJZGVudGl0eUl0ZXJhdG9yLmNyZWF0ZShzc3RhYmxlLCBkYXRhRmlsZSwga2V5KSwgb3V0cHV0SGFuZGxlcik7CisgICAgICAgIGlmIChvcHRpb25zLnJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MpCisgICAgICAgICAgICByZXR1cm4gbmV3IEZpeE5lZ2F0aXZlTG9jYWxEZWxldGlvblRpbWVJdGVyYXRvcihyb3dNZXJnaW5nSXRlcmF0b3IsIG91dHB1dEhhbmRsZXIsIG5lZ2F0aXZlTG9jYWxEZWxldGlvbkluZm9NZXRyaWNzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHJvd01lcmdpbmdJdGVyYXRvcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2F2ZU91dE9mT3JkZXJQYXJ0aXRpb24oRGVjb3JhdGVkS2V5IHByZXZLZXksIERlY29yYXRlZEtleSBrZXksIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvcikKKyAgICB7CisgICAgICAgIC8vIFRPRE8gYml0Y2ggaWYgdGhlIHJvdyBpcyB0b28gbGFyZ2U/ICBpZiBpdCBpcyB0aGVyZSdzIG5vdCBtdWNoIHdlIGNhbiBkbyAuLi4KKyAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCJPdXQgb2Ygb3JkZXIgcGFydGl0aW9uIGRldGVjdGVkICglcyBmb3VuZCBhZnRlciAlcykiLCBrZXlTdHJpbmcoa2V5KSwga2V5U3RyaW5nKHByZXZLZXkpKTsKKyAgICAgICAgb3V0T2ZPcmRlci5hZGQoSW1tdXRhYmxlQlRyZWVQYXJ0aXRpb24uY3JlYXRlKGl0ZXJhdG9yKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHRocm93SWZGYXRhbChUaHJvd2FibGUgdGgpCisgICAgeworICAgICAgICBpZiAodGggaW5zdGFuY2VvZiBFcnJvciAmJiAhKHRoIGluc3RhbmNlb2YgQXNzZXJ0aW9uRXJyb3IgfHwgdGggaW5zdGFuY2VvZiBJT0Vycm9yKSkKKyAgICAgICAgICAgIHRocm93IChFcnJvcikgdGg7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdGhyb3dJZkNhbm5vdENvbnRpbnVlKERlY29yYXRlZEtleSBrZXksIFRocm93YWJsZSB0aCkKKyAgICB7CisgICAgICAgIGlmIChpc0NvbW11dGF0aXZlICYmICFvcHRpb25zLnNraXBDb3JydXB0ZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2NydWJiaW5nIHRoZSBwYXJ0aXRpb24gd2l0aCBrZXkgJyVzJy4gIFNraXBwaW5nIGNvcnJ1cHQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGEgaW4gY291bnRlciB0YWJsZXMgd2lsbCByZXN1bHQgaW4gdW5kZXJjb3VudHMgZm9yIHRoZSBhZmZlY3RlZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bnRlcnMgKHNlZSBDQVNTQU5EUkEtMjc1OSBmb3IgbW9yZSBkZXRhaWxzKSwgc28gYnkgZGVmYXVsdCB0aGUgc2NydWIgd2lsbCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RvcCBhdCB0aGlzIHBvaW50LiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gc2tpcCB0aGUgcm93IGFueXdheSBhbmQgY29udGludWUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNjcnViYmluZywgcmUtcnVuIHRoZSBzY3J1YiB3aXRoIHRoZSAtLXNraXAtY29ycnVwdGVkIG9wdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVN0cmluZyhrZXkpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0Vycm9yKHRoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTY3J1YkluZm8gZXh0ZW5kcyBDb21wYWN0aW9uSW5mby5Ib2xkZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGRhdGFGaWxlOworICAgICAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUaW1lVVVJRCBzY3J1YkNvbXBhY3Rpb25JZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb2NrIGZpbGVSZWFkTG9jazsKKworICAgICAgICBwdWJsaWMgU2NydWJJbmZvKFJhbmRvbUFjY2Vzc1JlYWRlciBkYXRhRmlsZSwgU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBMb2NrIGZpbGVSZWFkTG9jaykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5kYXRhRmlsZSA9IGRhdGFGaWxlOworICAgICAgICAgICAgdGhpcy5zc3RhYmxlID0gc3N0YWJsZTsKKyAgICAgICAgICAgIHRoaXMuZmlsZVJlYWRMb2NrID0gZmlsZVJlYWRMb2NrOworICAgICAgICAgICAgc2NydWJDb21wYWN0aW9uSWQgPSBuZXh0VGltZVVVSUQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21wYWN0aW9uSW5mbyBnZXRDb21wYWN0aW9uSW5mbygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGVSZWFkTG9jay5sb2NrKCk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKHNzdGFibGUubWV0YWRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuU0NSVUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhRmlsZS5nZXRGaWxlUG9pbnRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpbGUubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3J1YkNvbXBhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZVNldC5vZihzc3RhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUuZ2V0UGF0aChzc3RhYmxlLmdldEZpbGVuYW1lKCkpLmdldFBhcmVudCgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbGVSZWFkTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW4gc29tZSBjYXNlIGxpa2UgQ0FTU0FORFJBLTEyMTI3IHRoZSBjZWxscyBtaWdodCBoYXZlIGJlZW4gc3RvcmVkIGluIHRoZSB3cm9uZyBvcmRlci4gVGhpcyBkZWNvcmF0b3IgY2hlY2sgdGhlCisgICAgICogY2VsbHMgb3JkZXIgYW5kIGNvbGxlY3QgdGhlIG91dC1vZi1vcmRlciBjZWxscyB0byBjb3JyZWN0IHRoZSBwcm9ibGVtLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE9yZGVyQ2hlY2tlckl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvcjxVbmZpbHRlcmVkPiBpbXBsZW1lbnRzIFdyYXBwaW5nVW5maWx0ZXJlZFJvd0l0ZXJhdG9yCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yOworCisgICAgICAgIHByaXZhdGUgVW5maWx0ZXJlZCBwcmV2aW91czsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBhcnRpdGlvbiBjb250YWluaW5nIHRoZSByb3dzIHdoaWNoIGFyZSBvdXQgb2Ygb3JkZXIuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFBhcnRpdGlvbiByb3dzT3V0T2ZPcmRlcjsKKworICAgICAgICBwdWJsaWMgT3JkZXJDaGVja2VySXRlcmF0b3IoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yLCBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7CisgICAgICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3Igd3JhcHBlZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1Jvd3NPdXRPZk9yZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJvd3NPdXRPZk9yZGVyICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFydGl0aW9uIGdldFJvd3NPdXRPZk9yZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJvd3NPdXRPZk9yZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIGNvbXB1dGVOZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOworCisgICAgICAgICAgICBVbmZpbHRlcmVkIG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CisKKyAgICAgICAgICAgIC8vIElmIHdlIGRldGVjdCB0aGF0IHNvbWUgcm93cyBhcmUgb3V0IG9mIG9yZGVyIHdlIHdpbGwgc3RvcmUgYW5kIHNvcnQgdGhlIHJlbWFpbmluZyBvbmVzIHRvIGluc2VydCB0aGVtCisgICAgICAgICAgICAvLyBpbiBhIHNlcGFyYXRlIFNTVGFibGUuCisgICAgICAgICAgICBpZiAocHJldmlvdXMgIT0gbnVsbCAmJiBjb21wYXJhdG9yLmNvbXBhcmUobmV4dCwgcHJldmlvdXMpIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByb3dzT3V0T2ZPcmRlciA9IEltbXV0YWJsZUJUcmVlUGFydGl0aW9uLmNyZWF0ZShVbmZpbHRlcmVkUm93SXRlcmF0b3JzLmNvbmNhdChuZXh0LCBpdGVyYXRvciksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW5kT2ZEYXRhKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2aW91cyA9IG5leHQ7CisgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIER1cmluZyAyLnggbWlncmF0aW9uLCB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXMgcm93cyBtaWdodCBoYXZlIGdvdHRlbiBkdXBsaWNhdGVkLgorICAgICAqIE1lcmdpbmcgaXRlcmF0b3IgbWVyZ2VzIHJvd3Mgd2l0aCBzYW1lIGNsdXN0ZXJpbmcuCisgICAgICogPHA+CisgICAgICogRm9yIG1vcmUgZGV0YWlscywgcmVmZXIgdG8gQ0FTU0FORFJBLTEyMTQ0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJvd01lcmdpbmdTU1RhYmxlSXRlcmF0b3IgaW1wbGVtZW50cyBXcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvcgorICAgIHsKKyAgICAgICAgVW5maWx0ZXJlZCBuZXh0VG9PZmZlciA9IG51bGw7CisgICAgICAgIHByaXZhdGUgZmluYWwgT3V0cHV0SGFuZGxlciBvdXRwdXQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHdyYXBwZWQ7CisKKyAgICAgICAgUm93TWVyZ2luZ1NTVGFibGVJdGVyYXRvcihVbmZpbHRlcmVkUm93SXRlcmF0b3Igc291cmNlLCBPdXRwdXRIYW5kbGVyIG91dHB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gc291cmNlOworICAgICAgICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciB3cmFwcGVkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0VG9PZmZlciAhPSBudWxsIHx8IHdyYXBwZWQuaGFzTmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVbmZpbHRlcmVkIG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBVbmZpbHRlcmVkIG5leHQgPSBuZXh0VG9PZmZlciAhPSBudWxsID8gbmV4dFRvT2ZmZXIgOiB3cmFwcGVkLm5leHQoKTsKKworICAgICAgICAgICAgaWYgKG5leHQuaXNSb3coKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGxvZ2dlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHdoaWxlICh3cmFwcGVkLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWQgcGVlayA9IHdyYXBwZWQubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBlZWsuaXNSb3coKSB8fCAhbmV4dC5jbHVzdGVyaW5nKCkuZXF1YWxzKHBlZWsuY2x1c3RlcmluZygpKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFRvT2ZmZXIgPSBwZWVrOyAvLyBPZmZlciBwZWVrIGluIG5leHQgY2FsbAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBEdXBsaWNhdGUgcm93LCBtZXJnZSBpdC4KKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9IFJvd3MubWVyZ2UoKFJvdykgbmV4dCwgKFJvdykgcGVlayk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFsb2dnZWQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwYXJ0aXRpb25LZXkgPSBtZXRhZGF0YSgpLnBhcnRpdGlvbktleVR5cGUuZ2V0U3RyaW5nKHBhcnRpdGlvbktleSgpLmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53YXJuKCJEdXBsaWNhdGUgcm93IGRldGVjdGVkIGluICVzLiVzOiAlcyAlcyIsIG1ldGFkYXRhKCkua2V5c3BhY2UsIG1ldGFkYXRhKCkubmFtZSwgcGFydGl0aW9uS2V5LCBuZXh0LmNsdXN0ZXJpbmcoKS50b1N0cmluZyhtZXRhZGF0YSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXh0VG9PZmZlciA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXRlcmF0b3IgY29udmVydHMgbmVnYXRpdmUge0BsaW5rIEFic3RyYWN0Q2VsbCNsb2NhbERlbGV0aW9uVGltZSgpfSBpbnRvIHtAbGluayBBYnN0cmFjdENlbGwjTUFYX0RFTEVUSU9OX1RJTUV9CisgICAgICogPHA+CisgICAgICogVGhpcyBpcyB0byByZWNvdmVyIGVudHJpZXMgd2l0aCBvdmVyZmxvd2VkIGxvY2FsRXhwaXJhdGlvblRpbWUgZHVlIHRvIENBU1NBTkRSQS0xNDA5MgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEZpeE5lZ2F0aXZlTG9jYWxEZWxldGlvblRpbWVJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0SXRlcmF0b3I8VW5maWx0ZXJlZD4gaW1wbGVtZW50cyBXcmFwcGluZ1VuZmlsdGVyZWRSb3dJdGVyYXRvcgorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZWNvcmF0ZWQgaXRlcmF0b3IuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBOZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljcyBuZWdhdGl2ZUxvY2FsRXhwaXJhdGlvblRpbWVNZXRyaWNzOworCisgICAgICAgIHB1YmxpYyBGaXhOZWdhdGl2ZUxvY2FsRGVsZXRpb25UaW1lSXRlcmF0b3IoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yLCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3MgbmVnYXRpdmVMb2NhbERlbGV0aW9uSW5mb01ldHJpY3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKKyAgICAgICAgICAgIHRoaXMub3V0cHV0SGFuZGxlciA9IG91dHB1dEhhbmRsZXI7CisgICAgICAgICAgICB0aGlzLm5lZ2F0aXZlTG9jYWxFeHBpcmF0aW9uVGltZU1ldHJpY3MgPSBuZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHdyYXBwZWQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWQgY29tcHV0ZU5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWl0ZXJhdG9yLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZW5kT2ZEYXRhKCk7CisKKyAgICAgICAgICAgIFVuZmlsdGVyZWQgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGlmICghbmV4dC5pc1JvdygpKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OworCisgICAgICAgICAgICBpZiAoaGFzTmVnYXRpdmVMb2NhbEV4cGlyYXRpb25UaW1lKChSb3cpIG5leHQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIuZGVidWcoIkZvdW5kIHJvdyB3aXRoIG5lZ2F0aXZlIGxvY2FsIGV4cGlyYXRpb24gdGltZTogJXMiLCBuZXh0LnRvU3RyaW5nKG1ldGFkYXRhKCksIGZhbHNlKSk7CisgICAgICAgICAgICAgICAgbmVnYXRpdmVMb2NhbEV4cGlyYXRpb25UaW1lTWV0cmljcy5maXhlZFJvd3MrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gZml4TmVnYXRpdmVMb2NhbEV4cGlyYXRpb25UaW1lKChSb3cpIG5leHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNOZWdhdGl2ZUxvY2FsRXhwaXJhdGlvblRpbWUoUm93IG5leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvdyByb3cgPSBuZXh0OworICAgICAgICAgICAgaWYgKHJvdy5wcmltYXJ5S2V5TGl2ZW5lc3NJbmZvKCkuaXNFeHBpcmluZygpICYmIHJvdy5wcmltYXJ5S2V5TGl2ZW5lc3NJbmZvKCkubG9jYWxFeHBpcmF0aW9uVGltZSgpIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChDb2x1bW5EYXRhIGNkIDogcm93KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjZC5jb2x1bW4oKS5pc1NpbXBsZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ2VsbDw/PiBjZWxsID0gKENlbGw8Pz4pIGNkOworICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5pc0V4cGlyaW5nKCkgJiYgY2VsbC5sb2NhbERlbGV0aW9uVGltZSgpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDb21wbGV4Q29sdW1uRGF0YSBjb21wbGV4RGF0YSA9IChDb21wbGV4Q29sdW1uRGF0YSkgY2Q7CisgICAgICAgICAgICAgICAgICAgIGZvciAoQ2VsbDw/PiBjZWxsIDogY29tcGxleERhdGEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsLmlzRXhwaXJpbmcoKSAmJiBjZWxsLmxvY2FsRGVsZXRpb25UaW1lKCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFVuZmlsdGVyZWQgZml4TmVnYXRpdmVMb2NhbEV4cGlyYXRpb25UaW1lKFJvdyByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIExpdmVuZXNzSW5mbyBsaXZlbmVzc0luZm8gPSByb3cucHJpbWFyeUtleUxpdmVuZXNzSW5mbygpOworICAgICAgICAgICAgaWYgKGxpdmVuZXNzSW5mby5pc0V4cGlyaW5nKCkgJiYgbGl2ZW5lc3NJbmZvLmxvY2FsRXhwaXJhdGlvblRpbWUoKSA8IDApCisgICAgICAgICAgICAgICAgbGl2ZW5lc3NJbmZvID0gbGl2ZW5lc3NJbmZvLndpdGhVcGRhdGVkVGltZXN0YW1wQW5kTG9jYWxEZWxldGlvblRpbWUobGl2ZW5lc3NJbmZvLnRpbWVzdGFtcCgpICsgMSwgQWJzdHJhY3RDZWxsLk1BWF9ERUxFVElPTl9USU1FKTsKKworICAgICAgICAgICAgcmV0dXJuIHJvdy50cmFuc2Zvcm1BbmRGaWx0ZXIobGl2ZW5lc3NJbmZvLCByb3cuZGVsZXRpb24oKSwgY2QgLT4geworICAgICAgICAgICAgICAgIGlmIChjZC5jb2x1bW4oKS5pc1NpbXBsZSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ2VsbCBjZWxsID0gKENlbGwpIGNkOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2VsbC5pc0V4cGlyaW5nKCkgJiYgY2VsbC5sb2NhbERlbGV0aW9uVGltZSgpIDwgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjZWxsLndpdGhVcGRhdGVkVGltZXN0YW1wQW5kTG9jYWxEZWxldGlvblRpbWUoY2VsbC50aW1lc3RhbXAoKSArIDEsIEFic3RyYWN0Q2VsbC5NQVhfREVMRVRJT05fVElNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2VsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ29tcGxleENvbHVtbkRhdGEgY29tcGxleERhdGEgPSAoQ29tcGxleENvbHVtbkRhdGEpIGNkOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxleERhdGEudHJhbnNmb3JtQW5kRmlsdGVyKGNlbGwgLT4gY2VsbC5pc0V4cGlyaW5nKCkgJiYgY2VsbC5sb2NhbERlbGV0aW9uVGltZSgpIDwgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjZWxsLndpdGhVcGRhdGVkVGltZXN0YW1wQW5kTG9jYWxEZWxldGlvblRpbWUoY2VsbC50aW1lc3RhbXAoKSArIDEsIEFic3RyYWN0Q2VsbC5NQVhfREVMRVRJT05fVElNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2VsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuY2xvbmUoSGVhcENsb25lci5pbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOZWdhdGl2ZUxvY2FsRGVsZXRpb25JbmZvTWV0cmljcworICAgIHsKKyAgICAgICAgcHVibGljIHZvbGF0aWxlIGludCBmaXhlZFJvd3MgPSAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NvcnRlZFRhYmxlVmVyaWZpZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NvcnRlZFRhYmxlVmVyaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjNjYjRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU29ydGVkVGFibGVWZXJpZmllci5qYXZhCkBAIC0wLDAgKzEsNTI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlYWRXcml0ZUxvY2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkxvbmdQcmVkaWNhdGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25Db250cm9sbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkxvY2FsUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVZlcmlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuS2V5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5LZXlSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlSWRlbnRpdHlJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnRlZ3JpdHlNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5JRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3J0ZWRUYWJsZVZlcmlmaWVyPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlcj4gaW1wbGVtZW50cyBJVmVyaWZpZXIKK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU29ydGVkVGFibGVWZXJpZmllci5jbGFzcyk7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOworICAgIHByb3RlY3RlZCBmaW5hbCBSIHNzdGFibGU7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgUmVhZFdyaXRlTG9jayBmaWxlQWNjZXNzTG9jazsKKyAgICBwcm90ZWN0ZWQgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGRhdGFGaWxlOworICAgIHByb3RlY3RlZCBmaW5hbCBWZXJpZnlJbmZvIHZlcmlmeUluZm87CisgICAgcHJvdGVjdGVkIGZpbmFsIE9wdGlvbnMgb3B0aW9uczsKKyAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc09mZmxpbmU7CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIGtleXNwYWNlLCByZXR1cm4gdGhlIHNldCBvZiBsb2NhbCBhbmQgcGVuZGluZyB0b2tlbiByYW5nZXMuICBCeSBkZWZhdWx0IHtAbGluayBTdG9yYWdlU2VydmljZSNnZXRMb2NhbEFuZFBlbmRpbmdSYW5nZXMoU3RyaW5nKX0KKyAgICAgKiBpcyBleHBlY3RlZCwgYnV0IGZvciB0aGUgc3RhbmRhbG9uZSB2ZXJpZmllciBjYXNlIHdlIGNhbid0IHVzZSB0aGF0LCBzbyB0aGlzIGlzIGhlcmUgdG8gYWxsb3cgdGhlIENMSSB0byBwcm92aWRlCisgICAgICogdGhlIHRva2VuIHJhbmdlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgRnVuY3Rpb248U3RyaW5nLCA/IGV4dGVuZHMgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+PiB0b2tlbkxvb2t1cDsKKyAgICBwcm90ZWN0ZWQgaW50IGdvb2RSb3dzOworCisgICAgcHJvdGVjdGVkIGZpbmFsIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlcjsKKworICAgIHB1YmxpYyBTb3J0ZWRUYWJsZVZlcmlmaWVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywgUiBzc3RhYmxlLCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXIsIGJvb2xlYW4gaXNPZmZsaW5lLCBPcHRpb25zIG9wdGlvbnMpCisgICAgeworICAgICAgICB0aGlzLmNmcyA9IGNmczsKKyAgICAgICAgdGhpcy5zc3RhYmxlID0gc3N0YWJsZTsKKyAgICAgICAgdGhpcy5vdXRwdXRIYW5kbGVyID0gb3V0cHV0SGFuZGxlcjsKKworICAgICAgICB0aGlzLmZpbGVBY2Nlc3NMb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKKyAgICAgICAgdGhpcy5kYXRhRmlsZSA9IGlzT2ZmbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgPyBzc3RhYmxlLm9wZW5EYXRhUmVhZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogc3N0YWJsZS5vcGVuRGF0YVJlYWRlcihDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5nZXRSYXRlTGltaXRlcigpKTsKKyAgICAgICAgdGhpcy52ZXJpZnlJbmZvID0gbmV3IFZlcmlmeUluZm8oZGF0YUZpbGUsIHNzdGFibGUsIGZpbGVBY2Nlc3NMb2NrLnJlYWRMb2NrKCkpOworICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICB0aGlzLmlzT2ZmbGluZSA9IGlzT2ZmbGluZTsKKyAgICAgICAgdGhpcy50b2tlbkxvb2t1cCA9IG9wdGlvbnMudG9rZW5Mb29rdXA7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZGVzZXJpYWxpemVCbG9vbUZpbHRlcihTU1RhYmxlUmVhZGVyIHNzdGFibGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChJRmlsdGVyIGZpbHRlciA9IEZpbHRlckNvbXBvbmVudC5sb2FkKHNzdGFibGUuZGVzY3JpcHRvcikpIHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkZpbHRlciBsb2FkZWQgZm9yIHt9Iiwgc3N0YWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcGFjdGlvbkluZm8uSG9sZGVyIGdldFZlcmlmeUluZm8oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZlcmlmeUluZm87CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbWFya0FuZFRocm93KFRocm93YWJsZSBjYXVzZSkKKyAgICB7CisgICAgICAgIG1hcmtBbmRUaHJvdyhjYXVzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgbWFya0FuZFRocm93KFRocm93YWJsZSBjYXVzZSwgYm9vbGVhbiBtdXRhdGVSZXBhaXJlZCkKKyAgICB7CisgICAgICAgIGlmIChtdXRhdGVSZXBhaXJlZCAmJiBvcHRpb25zLm11dGF0ZVJlcGFpclN0YXR1cykgLy8gaWYgd2UgYXJlIGFibGUgdG8gbXV0YXRlIHJlcGFpcmVkIGZsYWcsIGFuIGluY3JlbWVudGFsIHJlcGFpciBzaG91bGQgYmUgZW5vdWdoCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNzdGFibGUubXV0YXRlUmVwYWlyZWRBbmRSZWxvYWQoQWN0aXZlUmVwYWlyU2VydmljZS5VTlJFUEFJUkVEX1NTVEFCTEUsIHNzdGFibGUuZ2V0UGVuZGluZ1JlcGFpcigpLCBzc3RhYmxlLmlzVHJhbnNpZW50KCkpOworICAgICAgICAgICAgICAgIGNmcy5nZXRUcmFja2VyKCkubm90aWZ5U1NUYWJsZVJlcGFpcmVkU3RhdHVzQ2hhbmdlZChDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3N0YWJsZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiRXJyb3IgbXV0YXRpbmcgcmVwYWlyZWRBdCBmb3IgU1NUYWJsZSAlcywgYXMgcGFydCBvZiBtYXJrQW5kVGhyb3ciLCBzc3RhYmxlLmdldEZpbGVuYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIFNTVGFibGUgJXMsIHBsZWFzZSBmb3JjZSAlc3JlcGFpciIsIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSwgKG11dGF0ZVJlcGFpcmVkICYmIG9wdGlvbnMubXV0YXRlUmVwYWlyU3RhdHVzKSA/ICIiIDogImEgZnVsbCAiKSwgY2F1c2UpOworICAgICAgICBpZiAob3B0aW9ucy5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSkKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCBzc3RhYmxlLmdldEZpbGVuYW1lKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoKQorICAgIHsKKyAgICAgICAgdmVyaWZ5U1NUYWJsZVZlcnNpb24oKTsKKworICAgICAgICB2ZXJpZnlTU1RhYmxlTWV0YWRhdGEoKTsKKworICAgICAgICB2ZXJpZnlJbmRleCgpOworCisgICAgICAgIHZlcmlmeUJsb29tRmlsdGVyKCk7CisKKyAgICAgICAgaWYgKG9wdGlvbnMuY2hlY2tPd25zVG9rZW5zICYmICFpc09mZmxpbmUgJiYgIShjZnMuZ2V0UGFydGl0aW9uZXIoKSBpbnN0YW5jZW9mIExvY2FsUGFydGl0aW9uZXIpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodmVyaWZ5T3duZWRSYW5nZXMoKSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvcHRpb25zLnF1aWNrKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICh2ZXJpZnlEaWdlc3QoKSAmJiAhb3B0aW9ucy5leHRlbmRlZFZlcmlmaWNhdGlvbikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB2ZXJpZnlTU1RhYmxlKCk7CisKKyAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIlZlcmlmeSBvZiAlcyBzdWNjZWVkZWQuIEFsbCAlZCByb3dzIHJlYWQgc3VjY2Vzc2Z1bGx5Iiwgc3N0YWJsZSwgZ29vZFJvd3MpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeUJsb29tRmlsdGVyKCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKCJEZXNlcmlhbGl6aW5nIGJsb29tIGZpbHRlciBmb3IgJXMiLCBzc3RhYmxlKTsKKyAgICAgICAgICAgIGRlc2VyaWFsaXplQmxvb21GaWx0ZXIoc3N0YWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4odCk7CisgICAgICAgICAgICBtYXJrQW5kVGhyb3codCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTU1RhYmxlTWV0YWRhdGEoKQorICAgIHsKKyAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIkRlc2VyaWFsaXppbmcgc3N0YWJsZSBtZXRhZGF0YSBmb3IgJXMgIiwgc3N0YWJsZSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBTdGF0c0NvbXBvbmVudCBzdGF0c0NvbXBvbmVudCA9IFN0YXRzQ29tcG9uZW50LmxvYWQoc3N0YWJsZS5kZXNjcmlwdG9yLCBNZXRhZGF0YVR5cGUuVkFMSURBVElPTiwgTWV0YWRhdGFUeXBlLlNUQVRTLCBNZXRhZGF0YVR5cGUuSEVBREVSKTsKKyAgICAgICAgICAgIGlmIChzdGF0c0NvbXBvbmVudC52YWxpZGF0aW9uTWV0YWRhdGEoKSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgIXN0YXRzQ29tcG9uZW50LnZhbGlkYXRpb25NZXRhZGF0YSgpLnBhcnRpdGlvbmVyLmVxdWFscyhzc3RhYmxlLmdldFBhcnRpdGlvbmVyKCkuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiUGFydGl0aW9uZXIgZG9lcyBub3QgbWF0Y2ggdmFsaWRhdGlvbiBtZXRhZGF0YSIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKHQpOworICAgICAgICAgICAgbWFya0FuZFRocm93KHQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeVNTVGFibGVWZXJzaW9uKCkKKyAgICB7CisgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJWZXJpZnlpbmcgJXMgKCVzKSIsIHNzdGFibGUsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGRhdGFGaWxlLmxlbmd0aCgpKSk7CisgICAgICAgIGlmIChvcHRpb25zLmNoZWNrVmVyc2lvbiAmJiAhc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24uaXNMYXRlc3RWZXJzaW9uKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCIlcyBpcyBub3QgdGhlIGxhdGVzdCB2ZXJzaW9uLCBydW4gdXBncmFkZXNzdGFibGVzIiwgc3N0YWJsZSk7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dChtc2cpOworICAgICAgICAgICAgLy8gZG9uJ3QgdXNlIG1hcmtBbmRUaHJvdyBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBhIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGZvciB0aGlzLgorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgdmVyaWZ5T3duZWRSYW5nZXMoKQorICAgIHsKKyAgICAgICAgTGlzdDxSYW5nZTxUb2tlbj4+IG93bmVkUmFuZ2VzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIG91dHB1dEhhbmRsZXIuZGVidWcoIkNoZWNraW5nIHRoYXQgYWxsIHRva2VucyBhcmUgb3duZWQgYnkgdGhlIGN1cnJlbnQgbm9kZSIpOworICAgICAgICB0cnkgKEtleUl0ZXJhdG9yIGl0ZXIgPSBzc3RhYmxlLmtleUl0ZXJhdG9yKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG93bmVkUmFuZ2VzID0gUmFuZ2Uubm9ybWFsaXplKHRva2VuTG9va3VwLmFwcGx5KGNmcy5tZXRhZGF0YS5rZXlzcGFjZSkpOworICAgICAgICAgICAgaWYgKG93bmVkUmFuZ2VzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIFJhbmdlT3duSGVscGVyIHJhbmdlT3duSGVscGVyID0gbmV3IFJhbmdlT3duSGVscGVyKG93bmVkUmFuZ2VzKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgcmFuZ2VPd25IZWxwZXIudmFsaWRhdGUoa2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0KTsKKyAgICAgICAgICAgIG1hcmtBbmRUaHJvdyh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvd25lZFJhbmdlcy5zaXplKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5RGlnZXN0KCkKKyAgICB7CisgICAgICAgIGJvb2xlYW4gcGFzc2VkID0gdHJ1ZTsKKyAgICAgICAgLy8gVmVyaWZ5IHdpbGwgdXNlIHRoZSBEaWdlc3QgZmlsZXMsIHdoaWNoIHdvcmtzIGZvciBib3RoIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBzc3RhYmxlcworICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiQ2hlY2tpbmcgY29tcHV0ZWQgaGFzaCBvZiAlcyAiLCBzc3RhYmxlKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFJbnRlZ3JpdHlNZXRhZGF0YS5GaWxlRGlnZXN0VmFsaWRhdG9yIHZhbGlkYXRvciA9IHNzdGFibGUubWF5YmVHZXREaWdlc3RWYWxpZGF0b3IoKTsKKworICAgICAgICAgICAgaWYgKHZhbGlkYXRvciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJEYXRhIGRpZ2VzdCBtaXNzaW5nLCBhc3N1bWluZyBleHRlbmRlZCB2ZXJpZmljYXRpb24gb2YgZGlzayB2YWx1ZXMiKTsKKyAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKGUpOworICAgICAgICAgICAgbWFya0FuZFRocm93KGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXNzZWQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdmVyaWZ5U1NUYWJsZSgpCisgICAgeworICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiRXh0ZW5kZWQgVmVyaWZ5IHJlcXVlc3RlZCwgcHJvY2VlZGluZyB0byBpbnNwZWN0IHZhbHVlcyIpOworCisgICAgICAgIHRyeSAoVmVyaWZ5Q29udHJvbGxlciB2ZXJpZnlDb250cm9sbGVyID0gbmV3IFZlcmlmeUNvbnRyb2xsZXIoY2ZzKTsKKyAgICAgICAgICAgICBLZXlSZWFkZXIgaW5kZXhJdGVyYXRvciA9IHNzdGFibGUua2V5UmVhZGVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmRleEl0ZXJhdG9yLmRhdGFQb3NpdGlvbigpICE9IDApCisgICAgICAgICAgICAgICAgbWFya0FuZFRocm93KG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGaXJzdCByb3cgcG9zaXRpb24gZnJvbSBpbmRleCAhPSAwOiAiICsgaW5kZXhJdGVyYXRvci5kYXRhUG9zaXRpb24oKSkpOworCisgICAgICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gb3duZWRSYW5nZXMgPSBpc09mZmxpbmUgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA6IFJhbmdlLm5vcm1hbGl6ZSh0b2tlbkxvb2t1cC5hcHBseShjZnMubWV0YWRhdGEoKS5rZXlzcGFjZSkpOworICAgICAgICAgICAgUmFuZ2VPd25IZWxwZXIgcmFuZ2VPd25IZWxwZXIgPSBuZXcgUmFuZ2VPd25IZWxwZXIob3duZWRSYW5nZXMpOworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IHByZXZLZXkgPSBudWxsOworCisgICAgICAgICAgICB3aGlsZSAoIWRhdGFGaWxlLmlzRU9GKCkpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBpZiAodmVyaWZ5SW5mby5pc1N0b3BSZXF1ZXN0ZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbih2ZXJpZnlJbmZvLmdldENvbXBhY3Rpb25JbmZvKCkpOworCisgICAgICAgICAgICAgICAgbG9uZyByb3dTdGFydCA9IGRhdGFGaWxlLmdldEZpbGVQb2ludGVyKCk7CisgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1ZygiUmVhZGluZyByb3cgYXQgJWQiLCByb3dTdGFydCk7CisKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGtleSA9IHNzdGFibGUuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChkYXRhRmlsZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWFya0FuZFRocm93KHRoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jaGVja093bnNUb2tlbnMgJiYgb3duZWRSYW5nZXMuc2l6ZSgpID4gMCAmJiAhKGNmcy5nZXRQYXJ0aXRpb25lcigpIGluc3RhbmNlb2YgTG9jYWxQYXJ0aXRpb25lcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VPd25IZWxwZXIudmFsaWRhdGUoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0LCAiS2V5ICVzIGluIHNzdGFibGUgJXMgbm90IG93bmVkIGJ5IGxvY2FsIHJhbmdlcyAlcyIsIGtleSwgc3N0YWJsZSwgb3duZWRSYW5nZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgbWFya0FuZFRocm93KHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBjdXJyZW50SW5kZXhLZXkgPSBpbmRleEl0ZXJhdG9yLmtleSgpOworICAgICAgICAgICAgICAgIGxvbmcgbmV4dFJvd1Bvc2l0aW9uRnJvbUluZGV4ID0gMDsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5leHRSb3dQb3NpdGlvbkZyb21JbmRleCA9IGluZGV4SXRlcmF0b3IuYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaW5kZXhJdGVyYXRvci5kYXRhUG9zaXRpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRhdGFGaWxlLmxlbmd0aCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWFya0FuZFRocm93KHRoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsb25nIGRhdGFTdGFydCA9IGRhdGFGaWxlLmdldEZpbGVQb2ludGVyKCk7CisgICAgICAgICAgICAgICAgbG9uZyBkYXRhU3RhcnRGcm9tSW5kZXggPSBjdXJyZW50SW5kZXhLZXkgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByb3dTdGFydCArIDIgKyBjdXJyZW50SW5kZXhLZXkucmVtYWluaW5nKCk7CisKKyAgICAgICAgICAgICAgICBsb25nIGRhdGFTaXplID0gbmV4dFJvd1Bvc2l0aW9uRnJvbUluZGV4IC0gZGF0YVN0YXJ0RnJvbUluZGV4OworICAgICAgICAgICAgICAgIC8vIGF2b2lkIGFuIE5QRSBpZiBrZXkgaXMgbnVsbAorICAgICAgICAgICAgICAgIFN0cmluZyBrZXlOYW1lID0ga2V5ID09IG51bGwgPyAiKHVucmVhZGFibGUga2V5KSIgOiBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGtleS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1Zygicm93ICVzIGlzICVzIiwga2V5TmFtZSwgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoZGF0YVNpemUpKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IGRhdGFTaXplID4gZGF0YUZpbGUubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBtYXJrQW5kVGhyb3cobmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgia2V5ID0gJXMsIGRhdGFTaXplPSVkLCBkYXRhRmlsZS5sZW5ndGgoKSA9ICVkIiwga2V5LCBkYXRhU2l6ZSwgZGF0YUZpbGUubGVuZ3RoKCkpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IChVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IgPSBTU1RhYmxlSWRlbnRpdHlJdGVyYXRvci5jcmVhdGUoc3N0YWJsZSwgZGF0YUZpbGUsIGtleSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlcmlmeVBhcnRpdGlvbihrZXksIGl0ZXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgocHJldktleSAhPSBudWxsICYmIHByZXZLZXkuY29tcGFyZVRvKGtleSkgPiAwKSB8fCAha2V5LmdldEtleSgpLmVxdWFscyhjdXJyZW50SW5kZXhLZXkpIHx8IGRhdGFTdGFydCAhPSBkYXRhU3RhcnRGcm9tSW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICBtYXJrQW5kVGhyb3cobmV3IFJ1bnRpbWVFeGNlcHRpb24oIktleSBvdXQgb2Ygb3JkZXI6IHByZXZpb3VzID0gIiArIHByZXZLZXkgKyAiIDogY3VycmVudCA9ICIgKyBrZXkpKTsKKworICAgICAgICAgICAgICAgICAgICBnb29kUm93cysrOworICAgICAgICAgICAgICAgICAgICBwcmV2S2V5ID0ga2V5OworCisKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1ZygiUm93ICVzIGF0ICVzIHZhbGlkLCBtb3ZpbmcgdG8gbmV4dCByb3cgYXQgJXMgIiwgZ29vZFJvd3MsIHJvd1N0YXJ0LCBuZXh0Um93UG9zaXRpb25Gcm9tSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBkYXRhRmlsZS5zZWVrKG5leHRSb3dQb3NpdGlvbkZyb21JbmRleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXJrQW5kVGhyb3codGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZlVuY2hlY2tlZCh0KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmVyaWZ5UGFydGl0aW9uKERlY29yYXRlZEtleSBrZXksIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvcik7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlJbmRleCgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1ZygiRGVzZXJpYWxpemluZyBpbmRleCBmb3IgJXMiLCBzc3RhYmxlKTsKKyAgICAgICAgICAgIGRlc2VyaWFsaXplSW5kZXgoc3N0YWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4odCk7CisgICAgICAgICAgICBtYXJrQW5kVGhyb3codCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVzZXJpYWxpemVJbmRleChTU1RhYmxlUmVhZGVyIHNzdGFibGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChLZXlSZWFkZXIgaXQgPSBzc3RhYmxlLmtleVJlYWRlcigpKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGxhc3QgPSBpdC5rZXkoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdC5hZHZhbmNlKCkpIGxhc3QgPSBpdC5rZXkoKTsgLy8gbm8tb3AsIGp1c3QgY2hlY2sgaWYgaW5kZXggaXMgcmVhZGFibGUKKyAgICAgICAgICAgIGlmICghT2JqZWN0cy5lcXVhbHMobGFzdCwgc3N0YWJsZS5sYXN0LmdldEtleSgpKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24obmV3IElPRXhjZXB0aW9uKCJGYWlsZWQgdG8gcmVhZCBwYXJ0aXRpb24gaW5kZXgiKSwgaXQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBmaWxlQWNjZXNzTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGRhdGFGaWxlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGVBY2Nlc3NMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlIHRoZSBmYWN0IHRoYXQgY2hlY2soLi4uKSBpcyBjYWxsZWQgd2l0aCBzb3J0ZWQgdG9rZW5zIC0gd2Uga2VlcCBhIHBvaW50ZXIgaW4gdG8gdGhlIG5vcm1hbGl6ZWQgcmFuZ2VzCisgICAgICogYW5kIG9ubHkgYnVtcCB0aGUgcG9pbnRlciBpZiB0aGUga2V5IGdpdmVuIGlzIG91dCBvZiByYW5nZS4gVGhpcyBpcyBkb25lIHRvIGF2b2lkIGNhbGxpbmcgLmNvbnRhaW5zKC4uKSBtYW55CisgICAgICogdGltZXMgZm9yIGVhY2gga2V5ICh3aXRoIHZub2RlcyBmb3IgZXhhbXBsZSkKKyAgICAgKi8KKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJhbmdlT3duSGVscGVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmFuZ2U8VG9rZW4+PiBub3JtYWxpemVkUmFuZ2VzOworICAgICAgICBwcml2YXRlIGludCByYW5nZUluZGV4ID0gMDsKKyAgICAgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgbGFzdEtleTsKKworICAgICAgICBwdWJsaWMgUmFuZ2VPd25IZWxwZXIoTGlzdDxSYW5nZTxUb2tlbj4+IG5vcm1hbGl6ZWRSYW5nZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZFJhbmdlcyA9IG5vcm1hbGl6ZWRSYW5nZXM7CisgICAgICAgICAgICBSYW5nZS5hc3NlcnROb3JtYWxpemVkKG5vcm1hbGl6ZWRSYW5nZXMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGNoZWNrIGlmIHRoZSBnaXZlbiBrZXkgaXMgY29udGFpbmVkIGluIGFueSBvZiB0aGUgZ2l2ZW4gcmFuZ2VzCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCBpbiBzb3J0ZWQgb3JkZXIgLSBrZXkgc2hvdWxkIGJlIGluY3JlYXNpbmcKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSB0aGUga2V5CisgICAgICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUga2V5IGlzIG5vdCBjb250YWluZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKERlY29yYXRlZEtleSBrZXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghY2hlY2soa2V5KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiS2V5ICIgKyBrZXkgKyAiIGlzIG5vdCBjb250YWluZWQgaW4gdGhlIGdpdmVuIHJhbmdlcyIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGNoZWNrIGlmIHRoZSBnaXZlbiBrZXkgaXMgY29udGFpbmVkIGluIGFueSBvZiB0aGUgZ2l2ZW4gcmFuZ2VzCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCBpbiBzb3J0ZWQgb3JkZXIgLSBrZXkgc2hvdWxkIGJlIGluY3JlYXNpbmcKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSB0aGUga2V5CisgICAgICAgICAqIEByZXR1cm4gYm9vbGVhbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2hlY2soRGVjb3JhdGVkS2V5IGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGxhc3RLZXkgPT0gbnVsbCB8fCBrZXkuY29tcGFyZVRvKGxhc3RLZXkpID4gMDsKKyAgICAgICAgICAgIGxhc3RLZXkgPSBrZXk7CisKKyAgICAgICAgICAgIGlmIChub3JtYWxpemVkUmFuZ2VzLmlzRW1wdHkoKSkgLy8gaGFuZGxlIHRlc3RzIGV0Yy4gd2hlcmUgd2UgZG9uJ3QgaGF2ZSBhbnkgcmFuZ2VzCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgIGlmIChyYW5nZUluZGV4ID4gbm9ybWFsaXplZFJhbmdlcy5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJhbmdlT3duSGVscGVyIGNhbiBvbmx5IGJlIHVzZWQgdG8gZmluZCB0aGUgZmlyc3Qgb3V0LW9mLXJhbmdlLXRva2VuIik7CisKKyAgICAgICAgICAgIHdoaWxlICghbm9ybWFsaXplZFJhbmdlcy5nZXQocmFuZ2VJbmRleCkuY29udGFpbnMoa2V5LmdldFRva2VuKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJhbmdlSW5kZXgrKzsKKyAgICAgICAgICAgICAgICBpZiAocmFuZ2VJbmRleCA+IG5vcm1hbGl6ZWRSYW5nZXMuc2l6ZSgpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVmVyaWZ5SW5mbyBleHRlbmRzIENvbXBhY3Rpb25JbmZvLkhvbGRlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSYW5kb21BY2Nlc3NSZWFkZXIgZGF0YUZpbGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgU1NUYWJsZVJlYWRlciBzc3RhYmxlOworICAgICAgICBwcml2YXRlIGZpbmFsIFRpbWVVVUlEIHZlcmlmaWNhdGlvbkNvbXBhY3Rpb25JZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb2NrIGZpbGVSZWFkTG9jazsKKworICAgICAgICBwdWJsaWMgVmVyaWZ5SW5mbyhSYW5kb21BY2Nlc3NSZWFkZXIgZGF0YUZpbGUsIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgTG9jayBmaWxlUmVhZExvY2spCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZGF0YUZpbGUgPSBkYXRhRmlsZTsKKyAgICAgICAgICAgIHRoaXMuc3N0YWJsZSA9IHNzdGFibGU7CisgICAgICAgICAgICB0aGlzLmZpbGVSZWFkTG9jayA9IGZpbGVSZWFkTG9jazsKKyAgICAgICAgICAgIHZlcmlmaWNhdGlvbkNvbXBhY3Rpb25JZCA9IFRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZVVVSUQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21wYWN0aW9uSW5mbyBnZXRDb21wYWN0aW9uSW5mbygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGVSZWFkTG9jay5sb2NrKCk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKHNzdGFibGUubWV0YWRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuVkVSSUZZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpbGUuZ2V0RmlsZVBvaW50ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWxlLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZpY2F0aW9uQ29tcGFjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlU2V0Lm9mKHNzdGFibGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbGVSZWFkTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBWZXJpZnlDb250cm9sbGVyIGV4dGVuZHMgQ29tcGFjdGlvbkNvbnRyb2xsZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBWZXJpZnlDb250cm9sbGVyKENvbHVtbkZhbWlseVN0b3JlIGNmcykKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoY2ZzLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExvbmdQcmVkaWNhdGUgZ2V0UHVyZ2VFdmFsdWF0b3IoRGVjb3JhdGVkS2V5IGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRpbWUgLT4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9Tb3J0ZWRUYWJsZVdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU29ydGVkVGFibGVXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzcxNjlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU29ydGVkVGFibGVXcml0ZXIuamF2YQpAQCAtMCwwICsxLDQ3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25QdXJnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHMuR3VhcmRyYWlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlTmV3VHJhY2tlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNvbXBsZXhDb2x1bW5EYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUGFydGl0aW9uU2VyaWFsaXphdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJhbmdlVG9tYnN0b25lQm91bmRNYXJrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5SYW5nZVRvbWJzdG9uZUJvdW5kYXJ5TWFya2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUmFuZ2VUb21ic3RvbmVNYXJrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3dzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQ29tcHJlc3Npb25NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUZsdXNoT2JzZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFQb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZpbHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVHJhbnNhY3Rpb25hbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCisvKioKKyAqIEEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiBhIHdyaXRlciB3aGljaCBhc3N1bWVzIHRoZSBleGlzdGVuY2Ugb2Ygc29tZSBwYXJ0aXRpb24gaW5kZXggYW5kIGJsb29tIGZpbHRlci4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFNvcnRlZFRhYmxlV3JpdGVyPFAgZXh0ZW5kcyBTb3J0ZWRUYWJsZVBhcnRpdGlvbldyaXRlcj4gZXh0ZW5kcyBTU1RhYmxlV3JpdGVyCit7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNvcnRlZFRhYmxlV3JpdGVyLmNsYXNzKTsKKworICAgIC8vIFRPRE8gZGF0YVdyaXRlciBpcyBub3QgbmVlZGVkIHRvIGJlIGRpcmVjdGx5IGFjY2Vzc2libGUgLSB3ZSBjYW4gYWNjZXNzIGV2ZXJ5dGhpbmcgd2UgbmVlZCBmb3IgdGhlIGRhdGFXcml0ZXIKKyAgICAvLyAgIGZyb20gYSBwYXJ0aXRpb24gd3JpdGVyCisgICAgcHJvdGVjdGVkIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXIgZGF0YVdyaXRlcjsKKyAgICBwcm90ZWN0ZWQgZmluYWwgUCBwYXJ0aXRpb25Xcml0ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlSGFuZGxlLkJ1aWxkZXIgZGF0YUZpbGVCdWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSk7CisgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgbGFzdFdyaXR0ZW5LZXk7CisgICAgcHJpdmF0ZSBEYXRhUG9zaXRpb24gZGF0YU1hcms7CisgICAgcHJpdmF0ZSBsb25nIGxhc3RFYXJseU9wZW5MZW5ndGg7CisKKyAgICBwdWJsaWMgU29ydGVkVGFibGVXcml0ZXIoQnVpbGRlcjxQLCA/LCA/PiBidWlsZGVyLCBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIsIFNTVGFibGUuT3duZXIgb3duZXIpCisgICAgeworICAgICAgICBzdXBlcihidWlsZGVyLCBsaWZlY3ljbGVOZXdUcmFja2VyLCBvd25lcik7CisgICAgICAgIGNoZWNrTm90TnVsbChidWlsZGVyLmdldERhdGFXcml0ZXIoKSk7CisgICAgICAgIGNoZWNrTm90TnVsbChidWlsZGVyLmdldFBhcnRpdGlvbldyaXRlcigpKTsKKworICAgICAgICB0aGlzLmRhdGFXcml0ZXIgPSBidWlsZGVyLmdldERhdGFXcml0ZXIoKTsKKyAgICAgICAgdGhpcy5wYXJ0aXRpb25Xcml0ZXIgPSBidWlsZGVyLmdldFBhcnRpdGlvbldyaXRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgcGFydGl0aW9uIGRhdGEgdG8gdGhpcyB3cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFydGl0aW9uIHRoZSBwYXJ0aXRpb24gdG8gd3JpdGUKKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGluZGV4IGVudHJ5IGlmIHNvbWV0aGluZyB3YXMgd3JpdHRlbiwgdGhhdCBpcyBpZiB7QGNvZGUgaXRlcmF0b3J9IHdhc24ndCBlbXB0eSwKKyAgICAgKiB7QGNvZGUgbnVsbH0gb3RoZXJ3aXNlLgorICAgICAqIEB0aHJvd3MgRlNXcml0ZUVycm9yIGlmIHdyaXRlIHRvIHRoZSBkYXRhRmlsZSBmYWlscworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBBYnN0cmFjdFJvd0luZGV4RW50cnkgYXBwZW5kKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pCisgICAgeworICAgICAgICBpZiAocGFydGl0aW9uLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIXZlcmlmeVBhcnRpdGlvbihwYXJ0aXRpb24ucGFydGl0aW9uS2V5KCkpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBzdGFydFBhcnRpdGlvbihwYXJ0aXRpb24ucGFydGl0aW9uS2V5KCksIHBhcnRpdGlvbi5wYXJ0aXRpb25MZXZlbERlbGV0aW9uKCkpOworCisgICAgICAgICAgICBBYnN0cmFjdFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeTsKKyAgICAgICAgICAgIGlmIChoZWFkZXIuaGFzU3RhdGljKCkpCisgICAgICAgICAgICAgICAgYWRkU3RhdGljUm93KHBhcnRpdGlvbi5wYXJ0aXRpb25LZXkoKSwgcGFydGl0aW9uLnN0YXRpY1JvdygpKTsKKworICAgICAgICAgICAgd2hpbGUgKHBhcnRpdGlvbi5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgYWRkVW5maWx0ZXJlZChwYXJ0aXRpb24ucGFydGl0aW9uS2V5KCksIHBhcnRpdGlvbi5uZXh0KCkpOworCisgICAgICAgICAgICBpbmRleEVudHJ5ID0gZW5kUGFydGl0aW9uKHBhcnRpdGlvbi5wYXJ0aXRpb25LZXkoKSwgcGFydGl0aW9uLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKSk7CisKKyAgICAgICAgICAgIHJldHVybiBpbmRleEVudHJ5OworICAgICAgICB9CisgICAgICAgIGNhdGNoIChCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbiBib2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJ0aXRpb25TZXJpYWxpemF0aW9uRXhjZXB0aW9uKHBhcnRpdGlvbiwgYm9lKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCBnZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJpZnlQYXJ0aXRpb24oRGVjb3JhdGVkS2V5IGtleSkKKyAgICB7CisgICAgICAgIGFzc2VydCBrZXkgIT0gbnVsbCA6ICJLZXlzIG11c3Qgbm90IGJlIG51bGwiOyAvLyBlbXB0eSBrZXlzIEFSRSBhbGxvd2VkIGIvYyBvZiBpbmRleGVkIGNvbHVtbiB2YWx1ZXMKKworICAgICAgICBpZiAoa2V5LmdldEtleSgpLnJlbWFpbmluZygpID4gRkJVdGlsaXRpZXMuTUFYX1VOU0lHTkVEX1NIT1JUKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIktleSBzaXplIHt9IGV4Y2VlZHMgbWF4aW11bSBvZiB7fSwgc2tpcHBpbmcgcm93Iiwga2V5LmdldEtleSgpLnJlbWFpbmluZygpLCBGQlV0aWxpdGllcy5NQVhfVU5TSUdORURfU0hPUlQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxhc3RXcml0dGVuS2V5ICE9IG51bGwgJiYgbGFzdFdyaXR0ZW5LZXkuY29tcGFyZVRvKGtleSkgPj0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkxhc3Qgd3JpdHRlbiBrZXkgJXMgPj0gY3VycmVudCBrZXkgJXMsIHdyaXRpbmcgaW50byAlcyIsIGxhc3RXcml0dGVuS2V5LCBrZXksIGdldEZpbGVuYW1lKCkpKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RhcnRQYXJ0aXRpb24oRGVjb3JhdGVkS2V5IGtleSwgRGVsZXRpb25UaW1lIHBhcnRpdGlvbkxldmVsRGVsZXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcGFydGl0aW9uV3JpdGVyLnN0YXJ0KGtleSwgcGFydGl0aW9uTGV2ZWxEZWxldGlvbik7CisgICAgICAgIG1ldGFkYXRhQ29sbGVjdG9yLnVwZGF0ZVBhcnRpdGlvbkRlbGV0aW9uKHBhcnRpdGlvbkxldmVsRGVsZXRpb24pOworCisgICAgICAgIG9uU3RhcnRQYXJ0aXRpb24oa2V5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkU3RhdGljUm93KERlY29yYXRlZEtleSBrZXksIFJvdyByb3cpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZ3VhcmRDb2xsZWN0aW9uU2l6ZShrZXksIHJvdyk7CisKKyAgICAgICAgcGFydGl0aW9uV3JpdGVyLmFkZFN0YXRpY1Jvdyhyb3cpOworICAgICAgICBpZiAoIXJvdy5pc0VtcHR5KCkpCisgICAgICAgICAgICBSb3dzLmNvbGxlY3RTdGF0cyhyb3csIG1ldGFkYXRhQ29sbGVjdG9yKTsKKworICAgICAgICBvblN0YXRpY1Jvdyhyb3cpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRVbmZpbHRlcmVkKERlY29yYXRlZEtleSBrZXksIFVuZmlsdGVyZWQgdW5maWx0ZXJlZCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAodW5maWx0ZXJlZC5pc1JvdygpKQorICAgICAgICAgICAgYWRkUm93KGtleSwgKFJvdykgdW5maWx0ZXJlZCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFkZFJhbmdlVG9tc3RvbmVNYXJrZXIoKFJhbmdlVG9tYnN0b25lTWFya2VyKSB1bmZpbHRlcmVkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkUm93KERlY29yYXRlZEtleSBrZXksIFJvdyByb3cpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZ3VhcmRDb2xsZWN0aW9uU2l6ZShrZXksIHJvdyk7CisKKyAgICAgICAgcGFydGl0aW9uV3JpdGVyLmFkZFVuZmlsdGVyZWQocm93KTsKKyAgICAgICAgbWV0YWRhdGFDb2xsZWN0b3IudXBkYXRlQ2x1c3RlcmluZ1ZhbHVlcyhyb3cuY2x1c3RlcmluZygpKTsKKyAgICAgICAgUm93cy5jb2xsZWN0U3RhdHMocm93LCBtZXRhZGF0YUNvbGxlY3Rvcik7CisKKyAgICAgICAgb25Sb3cocm93KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkUmFuZ2VUb21zdG9uZU1hcmtlcihSYW5nZVRvbWJzdG9uZU1hcmtlciBtYXJrZXIpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcGFydGl0aW9uV3JpdGVyLmFkZFVuZmlsdGVyZWQobWFya2VyKTsKKworICAgICAgICBtZXRhZGF0YUNvbGxlY3Rvci51cGRhdGVDbHVzdGVyaW5nVmFsdWVzQnlCb3VuZE9yQm91bmRhcnkobWFya2VyLmNsdXN0ZXJpbmcoKSk7CisgICAgICAgIGlmIChtYXJrZXIuaXNCb3VuZGFyeSgpKQorICAgICAgICB7CisgICAgICAgICAgICBSYW5nZVRvbWJzdG9uZUJvdW5kYXJ5TWFya2VyIGJtID0gKFJhbmdlVG9tYnN0b25lQm91bmRhcnlNYXJrZXIpIG1hcmtlcjsKKyAgICAgICAgICAgIG1ldGFkYXRhQ29sbGVjdG9yLnVwZGF0ZShibS5lbmREZWxldGlvblRpbWUoKSk7CisgICAgICAgICAgICBtZXRhZGF0YUNvbGxlY3Rvci51cGRhdGUoYm0uc3RhcnREZWxldGlvblRpbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBtZXRhZGF0YUNvbGxlY3Rvci51cGRhdGUoKChSYW5nZVRvbWJzdG9uZUJvdW5kTWFya2VyKSBtYXJrZXIpLmRlbGV0aW9uVGltZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIG9uUmFuZ2VUb21ic3RvbmVNYXJrZXIobWFya2VyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFic3RyYWN0Um93SW5kZXhFbnRyeSBlbmRQYXJ0aXRpb24oRGVjb3JhdGVkS2V5IGtleSwgRGVsZXRpb25UaW1lIHBhcnRpdGlvbkxldmVsRGVsZXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBmaW5pc2hSZXN1bHQgPSBwYXJ0aXRpb25Xcml0ZXIuZmluaXNoKCk7CisKKyAgICAgICAgbG9uZyBlbmRQb3NpdGlvbiA9IGRhdGFXcml0ZXIucG9zaXRpb24oKTsKKyAgICAgICAgbG9uZyByb3dTaXplID0gZW5kUG9zaXRpb24gLSBwYXJ0aXRpb25Xcml0ZXIuZ2V0SW5pdGlhbFBvc2l0aW9uKCk7CisgICAgICAgIGd1YXJkUGFydGl0aW9uU2l6ZShrZXksIHJvd1NpemUpOworICAgICAgICBtYXliZUxvZ0xhcmdlUGFydGl0aW9uV2FybmluZyhrZXksIHJvd1NpemUpOworICAgICAgICBtYXliZUxvZ01hbnlUb21ic3RvbmVzV2FybmluZyhrZXksIG1ldGFkYXRhQ29sbGVjdG9yLnRvdGFsVG9tYnN0b25lcyk7CisgICAgICAgIG1ldGFkYXRhQ29sbGVjdG9yLmFkZFBhcnRpdGlvblNpemVJbkJ5dGVzKHJvd1NpemUpOworICAgICAgICBtZXRhZGF0YUNvbGxlY3Rvci5hZGRLZXkoa2V5LmdldEtleSgpKTsKKyAgICAgICAgbWV0YWRhdGFDb2xsZWN0b3IuYWRkQ2VsbFBlclBhcnRpdGlvbkNvdW50KCk7CisKKyAgICAgICAgbGFzdFdyaXR0ZW5LZXkgPSBrZXk7CisgICAgICAgIGxhc3QgPSBsYXN0V3JpdHRlbktleTsKKyAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpCisgICAgICAgICAgICBmaXJzdCA9IGxhc3RXcml0dGVuS2V5OworCisgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgIGxvZ2dlci50cmFjZSgid3JvdGUge30gYXQge30iLCBrZXksIGVuZFBvc2l0aW9uKTsKKworICAgICAgICByZXR1cm4gY3JlYXRlUm93SW5kZXhFbnRyeShrZXksIHBhcnRpdGlvbkxldmVsRGVsZXRpb24sIGZpbmlzaFJlc3VsdCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdGFydFBhcnRpdGlvbihEZWNvcmF0ZWRLZXkga2V5KQorICAgIHsKKyAgICAgICAgbm90aWZ5T2JzZXJ2ZXJzKG8gLT4gby5zdGFydFBhcnRpdGlvbihrZXksIHBhcnRpdGlvbldyaXRlci5nZXRJbml0aWFsUG9zaXRpb24oKSwgcGFydGl0aW9uV3JpdGVyLmdldEluaXRpYWxQb3NpdGlvbigpKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdGF0aWNSb3coUm93IHJvdykKKyAgICB7CisgICAgICAgIG5vdGlmeU9ic2VydmVycyhvIC0+IG8uc3RhdGljUm93KHJvdykpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIG9uUm93KFJvdyByb3cpCisgICAgeworICAgICAgICBub3RpZnlPYnNlcnZlcnMobyAtPiBvLm5leHRVbmZpbHRlcmVkQ2x1c3Rlcihyb3cpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBvblJhbmdlVG9tYnN0b25lTWFya2VyKFJhbmdlVG9tYnN0b25lTWFya2VyIG1hcmtlcikKKyAgICB7CisgICAgICAgIG5vdGlmeU9ic2VydmVycyhvIC0+IG8ubmV4dFVuZmlsdGVyZWRDbHVzdGVyKG1hcmtlcikpOworICAgIH0KKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdFJvd0luZGV4RW50cnkgY3JlYXRlUm93SW5kZXhFbnRyeShEZWNvcmF0ZWRLZXkga2V5LCBEZWxldGlvblRpbWUgcGFydGl0aW9uTGV2ZWxEZWxldGlvbiwgbG9uZyBmaW5pc2hSZXN1bHQpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIG5vdGlmeU9ic2VydmVycyhDb25zdW1lcjxTU1RhYmxlRmx1c2hPYnNlcnZlcj4gYWN0aW9uKQorICAgIHsKKyAgICAgICAgaWYgKG9ic2VydmVycyAhPSBudWxsICYmICFvYnNlcnZlcnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgb2JzZXJ2ZXJzLmZvckVhY2goYWN0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBtYXJrKCkKKyAgICB7CisgICAgICAgIGRhdGFNYXJrID0gZGF0YVdyaXRlci5tYXJrKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzZXRBbmRUcnVuY2F0ZSgpCisgICAgeworICAgICAgICBkYXRhV3JpdGVyLnJlc2V0QW5kVHJ1bmNhdGUoZGF0YU1hcmspOworICAgICAgICBwYXJ0aXRpb25Xcml0ZXIucmVzZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRGaWxlUG9pbnRlcigpCisgICAgeworICAgICAgICByZXR1cm4gZGF0YVdyaXRlci5wb3NpdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldE9uRGlza0ZpbGVQb2ludGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkYXRhV3JpdGVyLmdldE9uRGlza0ZpbGVQb2ludGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0RXN0aW1hdGVkT25EaXNrQnl0ZXNXcml0dGVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkYXRhV3JpdGVyLmdldEVzdGltYXRlZE9uRGlza0J5dGVzV3JpdHRlbigpOworICAgIH0KKworICAgIHByb3RlY3RlZCBGaWxlSGFuZGxlIG9wZW5EYXRhRmlsZShsb25nIGxlbmd0aE92ZXJyaWRlLCBTdGF0c01ldGFkYXRhIHN0YXRzTWV0YWRhdGEpCisgICAgeworICAgICAgICBpbnQgZGF0YUJ1ZmZlclNpemUgPSBpb09wdGlvbnMuZGlza09wdGltaXphdGlvblN0cmF0ZWd5LmJ1ZmZlclNpemUoc3RhdHNNZXRhZGF0YS5lc3RpbWF0ZWRQYXJ0aXRpb25TaXplLnBlcmNlbnRpbGUoaW9PcHRpb25zLmRpc2tPcHRpbWl6YXRpb25Fc3RpbWF0ZVBlcmNlbnRpbGUpKTsKKworCisgICAgICAgIEZpbGVIYW5kbGUgZGF0YUZpbGU7CisgICAgICAgIHRyeSAoQ29tcHJlc3Npb25NZXRhZGF0YSBjb21wcmVzc2lvbk1ldGFkYXRhID0gY29tcHJlc3Npb24gPyAoKENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKSBkYXRhV3JpdGVyKS5vcGVuKGxlbmd0aE92ZXJyaWRlKSA6IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFGaWxlID0gZGF0YUZpbGVCdWlsZGVyLm1tYXBwZWQoaW9PcHRpb25zLmRlZmF1bHREaXNrQWNjZXNzTW9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhNbWFwcGVkUmVnaW9uc0NhY2hlKG1tYXBwZWRSZWdpb25zQ2FjaGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ2h1bmtDYWNoZShjaHVua0NhY2hlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbXByZXNzaW9uTWV0YWRhdGEoY29tcHJlc3Npb25NZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclNpemUoZGF0YUJ1ZmZlclNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoTGVuZ3RoT3ZlcnJpZGUobGVuZ3RoT3ZlcnJpZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb21wbGV0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaHVua0NhY2hlICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RFYXJseU9wZW5MZW5ndGggIT0gMCAmJiBkYXRhRmlsZS5kYXRhTGVuZ3RoKCkgPiBsYXN0RWFybHlPcGVuTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBjaHVua0NhY2hlLmludmFsaWRhdGVQb3NpdGlvbihkYXRhRmlsZSwgbGFzdEVhcmx5T3Blbkxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0RWFybHlPcGVuTGVuZ3RoID0gZGF0YUZpbGUuZGF0YUxlbmd0aCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHwgRXJyb3IgZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRocm93YWJsZXMuY2xvc2VOb25OdWxsQW5kQWRkU3VwcHJlc3NlZChleCwgZGF0YUZpbGUpOworICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGF0YUZpbGU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGd1YXJkUGFydGl0aW9uU2l6ZShEZWNvcmF0ZWRLZXkga2V5LCBsb25nIHJvd1NpemUpCisgICAgeworICAgICAgICBpZiAoR3VhcmRyYWlscy5wYXJ0aXRpb25TaXplLnRyaWdnZXJzT24ocm93U2l6ZSwgbnVsbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyB3aGF0ID0gU3RyaW5nLmZvcm1hdCgiJXMuJXM6JXMgb24gc3N0YWJsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEua2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSgpLnBhcnRpdGlvbktleVR5cGUuZ2V0U3RyaW5nKGtleS5nZXRLZXkoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgICAgICBHdWFyZHJhaWxzLnBhcnRpdGlvblNpemUuZ3VhcmQocm93U2l6ZSwgd2hhdCwgdHJ1ZSwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVMb2dMYXJnZVBhcnRpdGlvbldhcm5pbmcoRGVjb3JhdGVkS2V5IGtleSwgbG9uZyByb3dTaXplKQorICAgIHsKKyAgICAgICAgaWYgKHJvd1NpemUgPiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29tcGFjdGlvbkxhcmdlUGFydGl0aW9uV2FybmluZ1RocmVzaG9sZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcga2V5U3RyaW5nID0gbWV0YWRhdGEoKS5wYXJ0aXRpb25LZXlUeXBlLmdldFN0cmluZyhrZXkuZ2V0S2V5KCkpOworICAgICAgICAgICAgbG9nZ2VyLndhcm4oIldyaXRpbmcgbGFyZ2UgcGFydGl0aW9uIHt9L3t9Ont9ICh7fSkgdG8gc3N0YWJsZSB7fSIsIG1ldGFkYXRhLmtleXNwYWNlLCBtZXRhZGF0YS5uYW1lLCBrZXlTdHJpbmcsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KHJvd1NpemUpLCBnZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtYXliZUxvZ01hbnlUb21ic3RvbmVzV2FybmluZyhEZWNvcmF0ZWRLZXkga2V5LCBpbnQgdG9tYnN0b25lQ291bnQpCisgICAgeworICAgICAgICBpZiAodG9tYnN0b25lQ291bnQgPiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29tcGFjdGlvblRvbWJzdG9uZVdhcm5pbmdUaHJlc2hvbGQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGtleVN0cmluZyA9IG1ldGFkYXRhKCkucGFydGl0aW9uS2V5VHlwZS5nZXRTdHJpbmcoa2V5LmdldEtleSgpKTsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJXcml0aW5nIHt9IHRvbWJzdG9uZXMgdG8ge30ve306e30gaW4gc3N0YWJsZSB7fSIsIHRvbWJzdG9uZUNvdW50LCBtZXRhZGF0YS5rZXlzcGFjZSwgbWV0YWRhdGEubmFtZSwga2V5U3RyaW5nLCBnZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBndWFyZENvbGxlY3Rpb25TaXplKERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksIFJvdyByb3cpCisgICAgeworICAgICAgICBpZiAoIUd1YXJkcmFpbHMuY29sbGVjdGlvblNpemUuZW5hYmxlZCgpICYmICFHdWFyZHJhaWxzLml0ZW1zUGVyQ29sbGVjdGlvbi5lbmFibGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKHJvdy5pc0VtcHR5KCkgfHwgU2NoZW1hQ29uc3RhbnRzLmlzU3lzdGVtS2V5c3BhY2UobWV0YWRhdGEua2V5c3BhY2UpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgY29sdW1uIDogcm93LmNvbHVtbnMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjb2x1bW4udHlwZS5pc0NvbGxlY3Rpb24oKSB8fCAhY29sdW1uLnR5cGUuaXNNdWx0aUNlbGwoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgQ29tcGxleENvbHVtbkRhdGEgY2VsbHMgPSByb3cuZ2V0Q29tcGxleENvbHVtbkRhdGEoY29sdW1uKTsKKyAgICAgICAgICAgIGlmIChjZWxscyA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBDb21wbGV4Q29sdW1uRGF0YSBsaXZlQ2VsbHMgPSBjZWxscy5wdXJnZShEZWxldGlvblB1cmdlci5QVVJHRV9BTEwsIEZCVXRpbGl0aWVzLm5vd0luU2Vjb25kcygpKTsKKyAgICAgICAgICAgIGlmIChsaXZlQ2VsbHMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaW50IGNlbGxzU2l6ZSA9IGxpdmVDZWxscy5kYXRhU2l6ZSgpOworICAgICAgICAgICAgaW50IGNlbGxzQ291bnQgPSBsaXZlQ2VsbHMuY2VsbHNDb3VudCgpOworCisgICAgICAgICAgICBpZiAoIUd1YXJkcmFpbHMuY29sbGVjdGlvblNpemUudHJpZ2dlcnNPbihjZWxsc1NpemUsIG51bGwpICYmCisgICAgICAgICAgICAgICAgIUd1YXJkcmFpbHMuaXRlbXNQZXJDb2xsZWN0aW9uLnRyaWdnZXJzT24oY2VsbHNDb3VudCwgbnVsbCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIFN0cmluZyBrZXlTdHJpbmcgPSBtZXRhZGF0YS5nZXRMb2NhbCgpLnByaW1hcnlLZXlBc0NRTExpdGVyYWwocGFydGl0aW9uS2V5LmdldEtleSgpLCByb3cuY2x1c3RlcmluZygpKTsKKyAgICAgICAgICAgIFN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KCIlcyBpbiByb3cgJXMgaW4gdGFibGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLm5hbWUudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhKTsKKyAgICAgICAgICAgIEd1YXJkcmFpbHMuY29sbGVjdGlvblNpemUuZ3VhcmQoY2VsbHNTaXplLCBtc2csIHRydWUsIG51bGwpOworICAgICAgICAgICAgR3VhcmRyYWlscy5pdGVtc1BlckNvbGxlY3Rpb24uZ3VhcmQoY2VsbHNDb3VudCwgbXNnLCB0cnVlLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbmRleFdyaXRlciBleHRlbmRzIEFic3RyYWN0VHJhbnNhY3Rpb25hbCBpbXBsZW1lbnRzIFRyYW5zYWN0aW9uYWwKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhOworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PENvbXBvbmVudD4gY29tcG9uZW50czsKKworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgSUZpbHRlciBiZjsKKworICAgICAgICBwcm90ZWN0ZWQgQWJzdHJhY3RJbmRleFdyaXRlcihCdWlsZGVyPD8sID8sID8+IGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGIuZGVzY3JpcHRvcjsKKyAgICAgICAgICAgIHRoaXMubWV0YWRhdGEgPSBiLmdldFRhYmxlTWV0YWRhdGFSZWYoKTsKKyAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cyA9IGIuZ2V0Q29tcG9uZW50cygpOworCisgICAgICAgICAgICBiZiA9IEZpbHRlckZhY3RvcnkuZ2V0RmlsdGVyKGIuZ2V0S2V5Q291bnQoKSwgYi5nZXRUYWJsZU1ldGFkYXRhUmVmKCkuZ2V0TG9jYWwoKS5wYXJhbXMuYmxvb21GaWx0ZXJGcENoYW5jZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmbHVzaEJmKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50cy5GSUxURVIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsdGVyQ29tcG9uZW50LnNhdmUoYmYsIGRlc2NyaXB0b3IsIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGV4LCBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5GSUxURVIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb1ByZXBhcmUoKQorICAgICAgICB7CisgICAgICAgICAgICBmbHVzaEJmKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb1Bvc3RDbGVhbnVwKFRocm93YWJsZSBhY2N1bXVsYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBhY2N1bXVsYXRlID0gYmYuY2xvc2UoYWNjdW11bGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJRmlsdGVyIGdldEZpbHRlckNvcHkoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYmYuc2hhcmVkQ29weSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBCdWlsZGVyPFAgZXh0ZW5kcyBTb3J0ZWRUYWJsZVBhcnRpdGlvbldyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVyBleHRlbmRzIFNvcnRlZFRhYmxlV3JpdGVyPFA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCIGV4dGVuZHMgQnVpbGRlcjxQLCBXLCBCPj4gZXh0ZW5kcyBTU1RhYmxlV3JpdGVyLkJ1aWxkZXI8VywgQj4KKyAgICB7CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihkZXNjcmlwdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQiBhZGREZWZhdWx0Q29tcG9uZW50cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyLmFkZERlZmF1bHRDb21wb25lbnRzKCk7CisKKyAgICAgICAgICAgIGlmIChGaWx0ZXJDb21wb25lbnQuc2hvdWxkVXNlQmxvb21GaWx0ZXIoZ2V0VGFibGVNZXRhZGF0YVJlZigpLmdldExvY2FsKCkucGFyYW1zLmJsb29tRmlsdGVyRnBDaGFuY2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZENvbXBvbmVudHMoSW1tdXRhYmxlU2V0Lm9mKFNTVGFibGVGb3JtYXQuQ29tcG9uZW50cy5GSUxURVIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIChCKSB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFNlcXVlbnRpYWxXcml0ZXIgZ2V0RGF0YVdyaXRlcigpOworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBQIGdldFBhcnRpdGlvbldyaXRlcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1N0YXRzQ29tcG9uZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TdGF0c0NvbXBvbmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MDQyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9TdGF0c0NvbXBvbmVudC5qYXZhCkBAIC0wLDAgKzEsMTI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Vbmtub3duQ29sdW1uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5Db21wYWN0aW9uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5WYWxpZGF0aW9uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXJPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CisKK3B1YmxpYyBjbGFzcyBTdGF0c0NvbXBvbmVudAoreworICAgIHB1YmxpYyBmaW5hbCBNYXA8TWV0YWRhdGFUeXBlLCBNZXRhZGF0YUNvbXBvbmVudD4gbWV0YWRhdGE7CisKKyAgICBwdWJsaWMgU3RhdHNDb21wb25lbnQoTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IG1ldGFkYXRhKQorICAgIHsKKyAgICAgICAgdGhpcy5tZXRhZGF0YSA9IEltbXV0YWJsZU1hcC5jb3B5T2YobWV0YWRhdGEpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RhdHNDb21wb25lbnQgbG9hZChEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGxvYWQoZGVzY3JpcHRvciwgTWV0YWRhdGFUeXBlLnZhbHVlcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0YXRzQ29tcG9uZW50IGxvYWQoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBNZXRhZGF0YVR5cGUuLi4gdHlwZXMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IG1ldGFkYXRhOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgbWV0YWRhdGEgPSBkZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLmRlc2VyaWFsaXplKGRlc2NyaXB0b3IsIEVudW1TZXQuY29weU9mKEFycmF5cy5hc0xpc3QodHlwZXMpKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUykpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBTdGF0c0NvbXBvbmVudChtZXRhZGF0YSk7CisgICAgfQorCisgICAgcHVibGljIFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50IHNlcmlhbGl6YXRpb25IZWFkZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChTZXJpYWxpemF0aW9uSGVhZGVyLkNvbXBvbmVudCkgbWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5IRUFERVIpOworICAgIH0KKworICAgIHB1YmxpYyBTZXJpYWxpemF0aW9uSGVhZGVyIHNlcmlhbGl6YXRpb25IZWFkZXIoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSkKKyAgICB7CisgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50IGhlYWRlciA9IHNlcmlhbGl6YXRpb25IZWFkZXIoKTsKKyAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGVhZGVyLnRvSGVhZGVyKG1ldGFkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChVbmtub3duQ29sdW1uRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIENvbXBhY3Rpb25NZXRhZGF0YSBjb21wYWN0aW9uTWV0YWRhdGEoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChDb21wYWN0aW9uTWV0YWRhdGEpIG1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuQ09NUEFDVElPTik7CisgICAgfQorCisgICAgcHVibGljIFZhbGlkYXRpb25NZXRhZGF0YSB2YWxpZGF0aW9uTWV0YWRhdGEoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChWYWxpZGF0aW9uTWV0YWRhdGEpIG1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuVkFMSURBVElPTik7CisgICAgfQorCisgICAgcHVibGljIFN0YXRzTWV0YWRhdGEgc3RhdHNNZXRhZGF0YSgpCisgICAgeworICAgICAgICByZXR1cm4gKFN0YXRzTWV0YWRhdGEpIG1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuU1RBVFMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNhdmUoRGVzY3JpcHRvciBkZXNjKQorICAgIHsKKyAgICAgICAgRmlsZSBmaWxlID0gZGVzYy5maWxlRm9yKENvbXBvbmVudHMuU1RBVFMpOworICAgICAgICB0cnkgKFNlcXVlbnRpYWxXcml0ZXIgb3V0ID0gbmV3IFNlcXVlbnRpYWxXcml0ZXIoZmlsZSwgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxUKSkKKyAgICAgICAgeworICAgICAgICAgICAgZGVzYy5nZXRNZXRhZGF0YVNlcmlhbGl6ZXIoKS5zZXJpYWxpemUobWV0YWRhdGEsIG91dCwgZGVzYy52ZXJzaW9uKTsKKyAgICAgICAgICAgIG91dC5maW5pc2goKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCBmaWxlLnBhdGgoKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1RPQ0NvbXBvbmVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvVE9DQ29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkxNWQzNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1RPQ0NvbXBvbmVudC5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OworCitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0Vycm9yOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGUuV3JpdGVNb2RlLkFQUEVORDsKKworcHVibGljIGNsYXNzIFRPQ0NvbXBvbmVudAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUT0NDb21wb25lbnQuY2xhc3MpOworCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIGxpc3Qgb2YgY29tcG9uZW50cyBmcm9tIHRoZSBUT0MgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHJldHVybiBzZXQgb2YgY29tcG9uZW50cyBmb3VuZCBpbiB0aGUgVE9DCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXQ8Q29tcG9uZW50PiBsb2FkVE9DKERlc2NyaXB0b3IgZGVzY3JpcHRvcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbG9hZFRPQyhkZXNjcmlwdG9yLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgbGlzdCBvZiBjb21wb25lbnRzIGZyb20gdGhlIFRPQyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2tpcE1pc3NpbmcsIHNraXAgYWRkaW5nIHRoZSBjb21wb25lbnQgdG8gdGhlIHJldHVybmVkIHNldCBpZiB0aGUgY29ycmVzcG9uZGluZyBmaWxlIGlzIG1pc3NpbmcuCisgICAgICogQHJldHVybiBzZXQgb2YgY29tcG9uZW50cyBmb3VuZCBpbiB0aGUgVE9DCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXQ8Q29tcG9uZW50PiBsb2FkVE9DKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgYm9vbGVhbiBza2lwTWlzc2luZykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBGaWxlIHRvY0ZpbGUgPSBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5UT0MpOworICAgICAgICBMaXN0PFN0cmluZz4gY29tcG9uZW50TmFtZXMgPSBGaWxlcy5yZWFkQWxsTGluZXModG9jRmlsZS50b1BhdGgoKSk7CisgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBTZXRzLm5ld0hhc2hTZXRXaXRoRXhwZWN0ZWRTaXplKGNvbXBvbmVudE5hbWVzLnNpemUoKSk7CisgICAgICAgIGZvciAoU3RyaW5nIGNvbXBvbmVudE5hbWUgOiBjb21wb25lbnROYW1lcykKKyAgICAgICAgeworICAgICAgICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudC5wYXJzZShjb21wb25lbnROYW1lLCBkZXNjcmlwdG9yLnZlcnNpb24uZm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChza2lwTWlzc2luZyAmJiAhZGVzY3JpcHRvci5maWxlRm9yKGNvbXBvbmVudCkuZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJNaXNzaW5nIGNvbXBvbmVudDoge30iLCBkZXNjcmlwdG9yLmZpbGVGb3IoY29tcG9uZW50KSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoY29tcG9uZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29tcG9uZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIG5ldyBjb21wb25lbnQgbmFtZXMgdG8gdGhlIFRPQyBjb21wb25lbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZFRPQyhEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIENvbGxlY3Rpb248Q29tcG9uZW50PiBjb21wb25lbnRzKQorICAgIHsKKyAgICAgICAgRmlsZSB0b2NGaWxlID0gZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuVE9DKTsKKyAgICAgICAgdHJ5IChGaWxlT3V0cHV0U3RyZWFtUGx1cyBvdXQgPSB0b2NGaWxlLm5ld091dHB1dFN0cmVhbShBUFBFTkQpOworICAgICAgICAgICAgIFByaW50V3JpdGVyIHcgPSBuZXcgUHJpbnRXcml0ZXIob3V0KSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKKyAgICAgICAgICAgICAgICB3LnByaW50bG4oY29tcG9uZW50Lm5hbWUpOworICAgICAgICAgICAgdy5mbHVzaCgpOworICAgICAgICAgICAgb3V0LnN5bmMoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCB0b2NGaWxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2V0PENvbXBvbmVudD4gbG9hZE9yQ3JlYXRlKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVE9DQ29tcG9uZW50LmxvYWRUT0MoZGVzY3JpcHRvcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHwgTm9TdWNoRmlsZUV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBkZXNjcmlwdG9yLmRpc2NvdmVyQ29tcG9uZW50cygpOworICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7IC8vIHNzdGFibGUgZG9lc24ndCBleGlzdCB5ZXQKKworICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudHMuVE9DKTsKKyAgICAgICAgICAgICAgICBUT0NDb21wb25lbnQuYXBwZW5kVE9DKGRlc2NyaXB0b3IsIGNvbXBvbmVudHMpOworICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1ZlcnNpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1ZlcnNpb24uamF2YQppbmRleCBhYTQxYjE0Li4xMzc5NzlhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9WZXJzaW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvVmVyc2lvbi5qYXZhCkBAIC0xNywzMCArMTcsMzEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKIAoraW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiAKIC8qKgogICogQSBzZXQgb2YgZmVhdHVyZSBmbGFncyBhc3NvY2lhdGVkIHdpdGggYSBTU1RhYmxlIGZvcm1hdAotICoKKyAqIDxwPgogICogdmVyc2lvbnMgYXJlIGRlbm90ZWQgYXMgW21ham9yXVttaW5vcl0uICBNaW5vciB2ZXJzaW9ucyBtdXN0IGJlIGZvcndhcmQtY29tcGF0aWJsZToKICAqIG5ldyBmaWVsZHMgYXJlIGFsbG93ZWQgaW4gZS5nLiB0aGUgbWV0YWRhdGEgY29tcG9uZW50LCBidXQgZmllbGRzIGNhbid0IGJlIHJlbW92ZWQKICAqIG9yIGhhdmUgdGhlaXIgc2l6ZSBjaGFuZ2VkLgotICoKKyAqIDxwPgogICogTWlub3IgdmVyc2lvbnMgd2VyZSBpbnRyb2R1Y2VkIHdpdGggdmVyc2lvbiAiaGIiIGZvciBDYXNzYW5kcmEgMS4wLjM7IHByaW9yIHRvIHRoYXQsCiAgKiB3ZSBhbHdheXMgaW5jcmVtZW50ZWQgdGhlIG1ham9yIHZlcnNpb24uCi0gKgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmVyc2lvbgogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gVkFMSURBVElPTiA9IFBhdHRlcm4uY29tcGlsZSgiW2Etel0rIik7CiAKLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHZlcnNpb247Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFNTVGFibGVGb3JtYXQgZm9ybWF0OworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdmVyc2lvbjsKKyAgICBwdWJsaWMgZmluYWwgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQ7CisKICAgICBwcm90ZWN0ZWQgVmVyc2lvbihTU1RhYmxlRm9ybWF0IGZvcm1hdCwgU3RyaW5nIHZlcnNpb24pCiAgICAgewotICAgICAgICB0aGlzLmZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgdGhpcy5mb3JtYXQgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKGZvcm1hdCk7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwodmVyc2lvbik7CiAgICAgfQogCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNMYXRlc3RWZXJzaW9uKCk7CkBAIC02MiwyMSArNjMsMzAgQEAKICAgICAvKioKICAgICAgKiBUaGUgb2xkIGJsb29tZmlsdGVyIGZvcm1hdCBzZXJpYWxpemVzIHRoZSBkYXRhIGFzIEJJR19FTkRJQU4gbG9uZydzLCB0aGUgbmV3IG9uZSB1c2VzIHRoZQogICAgICAqIHNhbWUgZm9ybWF0IGFzIGluIG1lbW9yeSAoc2VyaWFsaXplcyBhcyBieXRlcykuCisgICAgICoKICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGJsb29tZmlsdGVyIGZpbGUgaXMgb2xkIHNlcmlhbGl6YXRpb24gZm9ybWF0CiAgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzT2xkQmZGb3JtYXQoKTsKIAorICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIGl0IGlzIHJlcGxhY2VkIGJ5IHtAbGluayAjaGFzSW1wcm92ZWRNaW5NYXgoKX0gc2luY2UgJ25jJyBhbmQgdG8gYmUgY29tcGxldGV0bHkgcmVtb3ZlZCBzaW5jZSAnb2EnCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNBY2N1cmF0ZU1pbk1heCgpOwogCi0gICAgcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgIH0KKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCBpdCBpcyByZXBsYWNlZCBieSB7QGxpbmsgI2hhc0ltcHJvdmVkTWluTWF4KCl9IHNpbmNlICduYycgYW5kIHRvIGJlIGNvbXBsZXRldGx5IHJlbW92ZWQgc2luY2UgJ29hJworICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzTGVnYWN5TWluTWF4KCk7CiAKLSAgICBwdWJsaWMgU1NUYWJsZUZvcm1hdCBnZXRTU1RhYmxlRm9ybWF0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmb3JtYXQ7Ci0gICAgfQorICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc09yaWdpbmF0aW5nSG9zdElkKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNJbXByb3ZlZE1pbk1heCgpOworCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnNQcmVzZW5jZU1hcmtlcigpOworCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzS2V5UmFuZ2UoKTsKIAogICAgIC8qKgogICAgICAqIEBwYXJhbSB2ZXIgU1NUYWJsZSB2ZXJzaW9uCkBAIC04OSw2ICs5OSw3IEBACiAgICAgfQogCiAgICAgYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlKCk7CisKICAgICBhYnN0cmFjdCBwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGVGb3JTdHJlYW1pbmcoKTsKIAogICAgIEBPdmVycmlkZQpAQCAtOTcsMjQgKzEwOCwyNCBAQAogICAgICAgICByZXR1cm4gdmVyc2lvbjsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCisgICAgcHVibGljIFN0cmluZyB0b0Zvcm1hdEFuZFZlcnNpb25TdHJpbmcoKQogICAgIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7Ci0gICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZvcm1hdC5uYW1lKCkgKyAnLScgKyB2ZXJzaW9uOworICAgIH0KIAotICAgICAgICBWZXJzaW9uIHZlcnNpb24xID0gKFZlcnNpb24pIG87CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG90aGVyID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvdGhlci5nZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgaWYgKHZlcnNpb24gIT0gbnVsbCA/ICF2ZXJzaW9uLmVxdWFscyh2ZXJzaW9uMS52ZXJzaW9uKSA6IHZlcnNpb24xLnZlcnNpb24gIT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBWZXJzaW9uIG90aGVyVmVyc2lvbiA9IChWZXJzaW9uKSBvdGhlcjsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKHZlcnNpb24sIG90aGVyVmVyc2lvbi52ZXJzaW9uKSAmJiBPYmplY3RzLmVxdWFscyhmb3JtYXQubmFtZSgpLCBvdGhlclZlcnNpb24uZm9ybWF0Lm5hbWUoKSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpCiAgICAgewotICAgICAgICByZXR1cm4gdmVyc2lvbiAhPSBudWxsID8gdmVyc2lvbi5oYXNoQ29kZSgpIDogMDsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaCh2ZXJzaW9uLCBmb3JtYXQubmFtZSgpKTsKICAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBoYXNPcmlnaW5hdGluZ0hvc3RJZCgpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvVmVyc2lvbkFuZFR5cGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1ZlcnNpb25BbmRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNjk4YTkuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvVmVyc2lvbkFuZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci0KLS8qKgotICogR3JvdXBzIGEgc3N0YWJsZSB7QGxpbmsgVmVyc2lvbn0gd2l0aCBhIHtAbGluayBTU1RhYmxlRm9ybWF0LlR5cGV9LgotICoKLSAqIDxwPk5vdGUgdGhhdCBib3RoIGluZm9ybWF0aW9uIGFyZSBjdXJyZW50bHkgbmVjZXNzYXJ5IHRvIGlkZW50aWZ5IHRoZSBleGFjdCAiZm9ybWF0IiBvZiBhbiBzc3RhYmxlICh3aXRob3V0IGhhdmluZwotICogaXRzIHtAbGluayBEZXNjcmlwdG9yfSkuIEluIHBhcnRpY3VsYXIsIHdoaWxlIHtAbGluayBWZXJzaW9ufSBjb250YWlucyBpdHMge3tAbGluayBTU1RhYmxlRm9ybWF0fX0sIHlvdSBjYW5ub3QgZ2V0Ci0gKiB0aGUge3tAbGluayBTU1RhYmxlRm9ybWF0LlR5cGV9fSBmcm9tIHRoYXQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWZXJzaW9uQW5kVHlwZQotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNwbGl0dGVyIHNwbGl0T25EYXNoID0gU3BsaXR0ZXIub24oJy0nKS5vbWl0RW1wdHlTdHJpbmdzKCkudHJpbVJlc3VsdHMoKTsKLQotICAgIHByaXZhdGUgZmluYWwgVmVyc2lvbiB2ZXJzaW9uOwotICAgIHByaXZhdGUgZmluYWwgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdFR5cGU7Ci0KLSAgICBwdWJsaWMgVmVyc2lvbkFuZFR5cGUoVmVyc2lvbiB2ZXJzaW9uLCBTU1RhYmxlRm9ybWF0LlR5cGUgZm9ybWF0VHlwZSkKLSAgICB7Ci0gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0gICAgICAgIHRoaXMuZm9ybWF0VHlwZSA9IGZvcm1hdFR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFZlcnNpb24gdmVyc2lvbigpCi0gICAgewotICAgICAgICByZXR1cm4gdmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdFR5cGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZvcm1hdFR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQotICAgIHsKLSAgICAgICAgaWYgKHRoaXMgPT0gbykKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIFZlcnNpb25BbmRUeXBlIHRoYXQgPSAoVmVyc2lvbkFuZFR5cGUpIG87Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFscyh2ZXJzaW9uLCB0aGF0LnZlcnNpb24pICYmCi0gICAgICAgICAgICAgICBmb3JtYXRUeXBlID09IHRoYXQuZm9ybWF0VHlwZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2godmVyc2lvbiwgZm9ybWF0VHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWZXJzaW9uQW5kVHlwZSBmcm9tU3RyaW5nKFN0cmluZyB2ZXJzaW9uQW5kVHlwZSkKLSAgICB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBjb21wb25lbnRzID0gc3BsaXRPbkRhc2guc3BsaXRUb0xpc3QodmVyc2lvbkFuZFR5cGUpOwotICAgICAgICBpZiAoY29tcG9uZW50cy5zaXplKCkgIT0gMikKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgVmVyc2lvbkFuZFR5cGUgc3RyaW5nOiAiICsgdmVyc2lvbkFuZFR5cGUgKyAiIChzaG91bGQgYmUgb2YgdGhlIGZvcm0gJ2JpZy1iYycpIik7Ci0KLSAgICAgICAgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdFR5cGUgPSBTU1RhYmxlRm9ybWF0LlR5cGUudmFsaWRhdGUoY29tcG9uZW50cy5nZXQoMCkpOwotICAgICAgICBWZXJzaW9uIHZlcnNpb24gPSBmb3JtYXRUeXBlLmluZm8uZ2V0VmVyc2lvbihjb21wb25lbnRzLmdldCgxKSk7Ci0gICAgICAgIHJldHVybiBuZXcgVmVyc2lvbkFuZFR5cGUodmVyc2lvbiwgZm9ybWF0VHlwZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gZm9ybWF0VHlwZS5uYW1lICsgJy0nICsgdmVyc2lvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnRm9ybWF0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnRm9ybWF0LmphdmEKaW5kZXggYzg0NzgyZi4uODhjYTE1YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ0Zvcm1hdC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdGb3JtYXQuamF2YQpAQCAtMTcsMzMgKzE3LDEzNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZzsKIAotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dJbmRleEVudHJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZU5ld1RyYWNrZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5LZXlDYWNoZUtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuR2F1Z2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTY3J1YmJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLk1ldHJpY3NQcm92aWRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZmlsdGVyLkJsb29tRmlsdGVyTWV0cmljczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5BYnN0cmFjdFNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Tb3J0ZWRUYWJsZVNjcnViYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5TWV0cmljczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmtleWNhY2hlLktleUNhY2hlTWV0cmljczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNhY2hlU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KVk1TdGFiaWxpdHlJbnNwZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50cy5EQVRBOwogCiAvKioKICAqIExlZ2FjeSBiaWd0YWJsZSBmb3JtYXQKICAqLwotcHVibGljIGNsYXNzIEJpZ0Zvcm1hdCBpbXBsZW1lbnRzIFNTVGFibGVGb3JtYXQKK3B1YmxpYyBjbGFzcyBCaWdGb3JtYXQgZXh0ZW5kcyBBYnN0cmFjdFNTVGFibGVGb3JtYXQ8QmlnVGFibGVSZWFkZXIsIEJpZ1RhYmxlV3JpdGVyPgogewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmlnRm9ybWF0IGluc3RhbmNlID0gbmV3IEJpZ0Zvcm1hdCgpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmVyc2lvbiBsYXRlc3RWZXJzaW9uID0gbmV3IEJpZ1ZlcnNpb24oQmlnVmVyc2lvbi5jdXJyZW50X3ZlcnNpb24pOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNTVGFibGVSZWFkZXIuRmFjdG9yeSByZWFkZXJGYWN0b3J5ID0gbmV3IFJlYWRlckZhY3RvcnkoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTU1RhYmxlV3JpdGVyLkZhY3Rvcnkgd3JpdGVyRmFjdG9yeSA9IG5ldyBXcml0ZXJGYWN0b3J5KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJpZ0Zvcm1hdC5jbGFzcyk7CiAKLSAgICBwcml2YXRlIEJpZ0Zvcm1hdCgpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJiaWciOworCisgICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uIGxhdGVzdFZlcnNpb24gPSBuZXcgQmlnVmVyc2lvbih0aGlzLCBCaWdWZXJzaW9uLmN1cnJlbnRfdmVyc2lvbik7CisgICAgcHJpdmF0ZSBmaW5hbCBCaWdUYWJsZVJlYWRlckZhY3RvcnkgcmVhZGVyRmFjdG9yeSA9IG5ldyBCaWdUYWJsZVJlYWRlckZhY3RvcnkoKTsKKyAgICBwcml2YXRlIGZpbmFsIEJpZ1RhYmxlV3JpdGVyRmFjdG9yeSB3cml0ZXJGYWN0b3J5ID0gbmV3IEJpZ1RhYmxlV3JpdGVyRmFjdG9yeSgpOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21wb25lbnRzIGV4dGVuZHMgU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzCiAgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVzIGV4dGVuZHMgU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzLlR5cGVzCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGluZGV4IG9mIHRoZSByb3cga2V5cyB3aXRoIHBvaW50ZXJzIHRvIHRoZWlyIHBvc2l0aW9ucyBpbiB0aGUgZGF0YSBmaWxlCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudC5UeXBlIFBSSU1BUllfSU5ERVggPSBDb21wb25lbnQuVHlwZS5jcmVhdGVTaW5nbGV0b24oIlBSSU1BUllfSU5ERVgiLCAiSW5kZXguZGIiLCBCaWdGb3JtYXQuY2xhc3MpOworICAgICAgICAgICAgLy8gaG9sZHMgU1NUYWJsZSBJbmRleCBTdW1tYXJ5IChzYW1wbGluZyBvZiBJbmRleCBjb21wb25lbnQpCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBvbmVudC5UeXBlIFNVTU1BUlkgPSBDb21wb25lbnQuVHlwZS5jcmVhdGVTaW5nbGV0b24oIlNVTU1BUlkiLCAiU3VtbWFyeS5kYiIsIEJpZ0Zvcm1hdC5jbGFzcyk7CisgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIENvbXBvbmVudCBQUklNQVJZX0lOREVYID0gVHlwZXMuUFJJTUFSWV9JTkRFWC5nZXRTaW5nbGV0b24oKTsKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgU1VNTUFSWSA9IFR5cGVzLlNVTU1BUlkuZ2V0U2luZ2xldG9uKCk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENvbXBvbmVudD4gQkFUQ0hfQ09NUE9ORU5UUyA9IEltbXV0YWJsZVNldC5vZihEQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU1BUllfSU5ERVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUFJFU1NJT05fSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVFMpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDb21wb25lbnQ+IFBSSU1BUllfQ09NUE9ORU5UUyA9IEltbXV0YWJsZVNldC5vZihEQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTUFSWV9JTkRFWCk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENvbXBvbmVudD4gR0VORVJBVEVEX09OX0xPQURfQ09NUE9ORU5UUyA9IEltbXV0YWJsZVNldC5vZihGSUxURVIsIFNVTU1BUlkpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDb21wb25lbnQ+IE1VVEFCTEVfQ09NUE9ORU5UUyA9IEltbXV0YWJsZVNldC5vZihTVEFUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BUlkpOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDb21wb25lbnQ+IFVQTE9BRF9DT01QT05FTlRTID0gSW1tdXRhYmxlU2V0Lm9mKERBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU1BUllfSU5ERVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBSRVNTSU9OX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRTKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Q29tcG9uZW50PiBTVFJFQU1fQ09NUE9ORU5UUyA9IEltbXV0YWJsZVNldC5vZihEQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklNQVJZX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUFJFU1NJT05fSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NQVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUdFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSQyk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENvbXBvbmVudD4gQUxMX0NPTVBPTkVOVFMgPSBJbW11dGFibGVTZXQub2YoREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTUFSWV9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBSRVNTSU9OX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElHRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPQyk7CisgICAgfQorCisgICAgcHVibGljIEJpZ0Zvcm1hdChNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpCisgICAgeworICAgICAgICBzdXBlcihOQU1FLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXMoU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQpCisgICAgeworICAgICAgICByZXR1cm4gZm9ybWF0Lm5hbWUoKS5lcXVhbHMoTkFNRSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCaWdGb3JtYXQgZ2V0SW5zdGFuY2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChCaWdGb3JtYXQpIE9iamVjdHMucmVxdWlyZU5vbk51bGwoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTVGFibGVGb3JtYXRzKCkuZ2V0KE5BTUUpLCAiVW5rbm93biBTU1RhYmxlIGZvcm1hdDogIiArIE5BTUUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpcyhEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNTUsMjggKzE1OSwxODAgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgVmVyc2lvbiBnZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCaWdWZXJzaW9uKHZlcnNpb24pOworICAgICAgICByZXR1cm4gbmV3IEJpZ1ZlcnNpb24odGhpcywgdmVyc2lvbik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNTVGFibGVXcml0ZXIuRmFjdG9yeSBnZXRXcml0ZXJGYWN0b3J5KCkKKyAgICBwdWJsaWMgQmlnVGFibGVXcml0ZXJGYWN0b3J5IGdldFdyaXRlckZhY3RvcnkoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHdyaXRlckZhY3Rvcnk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNTVGFibGVSZWFkZXIuRmFjdG9yeSBnZXRSZWFkZXJGYWN0b3J5KCkKKyAgICBwdWJsaWMgQmlnVGFibGVSZWFkZXJGYWN0b3J5IGdldFJlYWRlckZhY3RvcnkoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHJlYWRlckZhY3Rvcnk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyIGdldEluZGV4U2VyaWFsaXplcihUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBWZXJzaW9uIHZlcnNpb24sIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyKQorICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiBhbGxDb21wb25lbnRzKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyKHZlcnNpb24sIGhlYWRlcik7CisgICAgICAgIHJldHVybiBDb21wb25lbnRzLkFMTF9DT01QT05FTlRTOwogICAgIH0KIAotICAgIHN0YXRpYyBjbGFzcyBXcml0ZXJGYWN0b3J5IGV4dGVuZHMgU1NUYWJsZVdyaXRlci5GYWN0b3J5CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDb21wb25lbnQ+IHN0cmVhbWluZ0NvbXBvbmVudHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbXBvbmVudHMuU1RSRUFNX0NPTVBPTkVOVFM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDb21wb25lbnQ+IHByaW1hcnlDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDb21wb25lbnRzLlBSSU1BUllfQ09NUE9ORU5UUzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENvbXBvbmVudD4gYmF0Y2hDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDb21wb25lbnRzLkJBVENIX0NPTVBPTkVOVFM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDb21wb25lbnQ+IHVwbG9hZENvbXBvbmVudHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbXBvbmVudHMuVVBMT0FEX0NPTVBPTkVOVFM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDb21wb25lbnQ+IG11dGFibGVDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDb21wb25lbnRzLk1VVEFCTEVfQ09NUE9ORU5UUzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENvbXBvbmVudD4gZ2VuZXJhdGVkT25Mb2FkQ29tcG9uZW50cygpCisgICAgeworICAgICAgICByZXR1cm4gQ29tcG9uZW50cy5HRU5FUkFURURfT05fTE9BRF9DT01QT05FTlRTOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTU1RhYmxlRm9ybWF0LktleUNhY2hlVmFsdWVTZXJpYWxpemVyPEJpZ1RhYmxlUmVhZGVyLCBSb3dJbmRleEVudHJ5PiBnZXRLZXlDYWNoZVZhbHVlU2VyaWFsaXplcigpCisgICAgeworICAgICAgICByZXR1cm4gS2V5Q2FjaGVWYWx1ZVNlcmlhbGl6ZXIuaW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElTY3J1YmJlciBnZXRTY3J1YmJlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIExpZmVjeWNsZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uLCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXIsIElTY3J1YmJlci5PcHRpb25zIG9wdGlvbnMpCisgICAgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoY2ZzLm1ldGFkYXRhKCkuZXF1YWxzKHRyYW5zYWN0aW9uLm9ubHlPbmUoKS5tZXRhZGF0YSgpKSwgIlNTVGFibGUgbWV0YWRhdGEgZG9lcyBub3QgbWF0Y2ggY3VycmVudCBkZWZpbml0aW9uIik7CisgICAgICAgIHJldHVybiBuZXcgQmlnVGFibGVTY3J1YmJlcihjZnMsIHRyYW5zYWN0aW9uLCBvdXRwdXRIYW5kbGVyLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWV0cmljc1Byb3ZpZGVycyBnZXRGb3JtYXRTcGVjaWZpY01ldHJpY3NQcm92aWRlcnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJpZ1RhYmxlU3BlY2lmaWNNZXRyaWNzUHJvdmlkZXJzLmluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9ycGhhbmVkQ29tcG9uZW50cyhEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMpCisgICAgeworICAgICAgICBTb3J0ZWRUYWJsZVNjcnViYmVyLmRlbGV0ZU9ycGhhbmVkQ29tcG9uZW50cyhkZXNjcmlwdG9yLCBjb21wb25lbnRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlKERlc2NyaXB0b3IgZGVzYywgTGlzdDxDb21wb25lbnQ+IGNvbXBvbmVudHMpCisgICAgeworICAgICAgICBsb2dnZXIuaW5mbygiRGVsZXRpbmcgc3N0YWJsZToge30iLCBkZXNjKTsKKworICAgICAgICBpZiAoY29tcG9uZW50cy5yZW1vdmUoREFUQSkpCisgICAgICAgICAgICBjb21wb25lbnRzLmFkZCgwLCBEQVRBKTsgLy8gREFUQSBjb21wb25lbnQgc2hvdWxkIGJlIGZpcnN0CisgICAgICAgIGlmIChjb21wb25lbnRzLnJlbW92ZShDb21wb25lbnRzLlNVTU1BUlkpKQorICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50cy5TVU1NQVJZKTsgLy8gU1VNTUFSWSBjb21wb25lbnQgc2hvdWxkIGJlIGxhc3QgKElESyB3aHkpCisKKyAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJEZWxldGluZyBjb21wb25lbnQge30gb2Yge30iLCBjb21wb25lbnQsIGRlc2MpOworICAgICAgICAgICAgZGVzYy5maWxlRm9yKGNvbXBvbmVudCkuZGVsZXRlSWZFeGlzdHMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShEZXNjcmlwdG9yIGRlc2MpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGtleSBjYWNoZSBlbnRyaWVzIGZvciB0aGUgc3N0YWJsZSBiZWluZyBkZWxldGVkCisgICAgICAgICAgICBJdGVyYXRvcjxLZXlDYWNoZUtleT4gaXQgPSBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUua2V5SXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS2V5Q2FjaGVLZXkga2V5ID0gaXQubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChrZXkuZGVzYy5lcXVhbHMoZGVzYykpCisgICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWxldGUoZGVzYywgTGlzdHMubmV3QXJyYXlMaXN0KFNldHMuaW50ZXJzZWN0aW9uKGFsbENvbXBvbmVudHMoKSwgZGVzYy5kaXNjb3ZlckNvbXBvbmVudHMoKSkpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpWTVN0YWJpbGl0eUluc3BlY3Rvci5pbnNwZWN0VGhyb3dhYmxlKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEtleUNhY2hlVmFsdWVTZXJpYWxpemVyIGltcGxlbWVudHMgU1NUYWJsZUZvcm1hdC5LZXlDYWNoZVZhbHVlU2VyaWFsaXplcjxCaWdUYWJsZVJlYWRlciwgUm93SW5kZXhFbnRyeT4KKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEtleUNhY2hlVmFsdWVTZXJpYWxpemVyIGluc3RhbmNlID0gbmV3IEtleUNhY2hlVmFsdWVTZXJpYWxpemVyKCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNraXAoRGF0YUlucHV0UGx1cyBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvd0luZGV4RW50cnkuU2VyaWFsaXplci5za2lwRm9yQ2FjaGUoaW5wdXQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSb3dJbmRleEVudHJ5IGRlc2VyaWFsaXplKEJpZ1RhYmxlUmVhZGVyIHJlYWRlciwgRGF0YUlucHV0UGx1cyBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByZWFkZXIuZGVzZXJpYWxpemVLZXlDYWNoZVZhbHVlKGlucHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoUm93SW5kZXhFbnRyeSBlbnRyeSwgRGF0YU91dHB1dFBsdXMgb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZW50cnkuc2VyaWFsaXplRm9yQ2FjaGUob3V0cHV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCaWdUYWJsZVJlYWRlckZhY3RvcnkgaW1wbGVtZW50cyBTU1RhYmxlUmVhZGVyRmFjdG9yeTxCaWdUYWJsZVJlYWRlciwgQmlnVGFibGVSZWFkZXIuQnVpbGRlcj4KKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQmlnVGFibGVSZWFkZXIuQnVpbGRlciBidWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdUYWJsZVJlYWRlci5CdWlsZGVyKGRlc2NyaXB0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXI8QmlnVGFibGVSZWFkZXIsIEJpZ1RhYmxlUmVhZGVyLkJ1aWxkZXI+IGxvYWRpbmdCdWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVNZXRhZGF0YVJlZiB0YWJsZU1ldGFkYXRhUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ1NTVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlcihuZXcgU1NUYWJsZS5CdWlsZGVyPD4oZGVzY3JpcHRvcikuc2V0VGFibGVNZXRhZGF0YVJlZih0YWJsZU1ldGFkYXRhUmVmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbXBvbmVudHMoY29tcG9uZW50cykpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQYWlyPERlY29yYXRlZEtleSwgRGVjb3JhdGVkS2V5PiByZWFkS2V5UmFuZ2UoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW5kZXhTdW1tYXJ5Q29tcG9uZW50LmxvYWRGaXJzdEFuZExhc3RLZXkoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1VNTUFSWSksIHBhcnRpdGlvbmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2xhc3M8QmlnVGFibGVSZWFkZXI+IGdldFJlYWRlckNsYXNzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJpZ1RhYmxlUmVhZGVyLmNsYXNzOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpZ1RhYmxlV3JpdGVyRmFjdG9yeSBpbXBsZW1lbnRzIFNTVGFibGVXcml0ZXJGYWN0b3J5PEJpZ1RhYmxlV3JpdGVyLCBCaWdUYWJsZVdyaXRlci5CdWlsZGVyPgogICAgIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBsb25nIGVzdGltYXRlU2l6ZShTU1RhYmxlV3JpdGVyLlNTVGFibGVTaXplUGFyYW1ldGVycyBwYXJhbWV0ZXJzKQpAQCAtODgsNDAgKzM0NCwxNSBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTU1RhYmxlV3JpdGVyIG9wZW4oRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcga2V5Q291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZXBhaXJlZEF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RyYW5zaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIG1ldGFkYXRhQ29sbGVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IG9ic2VydmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIpCisgICAgICAgIHB1YmxpYyBCaWdUYWJsZVdyaXRlci5CdWlsZGVyIGJ1aWxkZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yKQogICAgICAgICB7Ci0gICAgICAgICAgICBTU1RhYmxlLnZhbGlkYXRlUmVwYWlyZWRNZXRhZGF0YShyZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpc1RyYW5zaWVudCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJpZ1RhYmxlV3JpdGVyKGRlc2NyaXB0b3IsIGtleUNvdW50LCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpc1RyYW5zaWVudCwgbWV0YWRhdGEsIG1ldGFkYXRhQ29sbGVjdG9yLCBoZWFkZXIsIG9ic2VydmVycywgbGlmZWN5Y2xlTmV3VHJhY2tlcik7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ1RhYmxlV3JpdGVyLkJ1aWxkZXIoZGVzY3JpcHRvcik7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGF0aWMgY2xhc3MgUmVhZGVyRmFjdG9yeSBleHRlbmRzIFNTVGFibGVSZWFkZXIuRmFjdG9yeQotICAgIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIG9wZW4oU1NUYWJsZVJlYWRlckJ1aWxkZXIgYnVpbGRlcikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdUYWJsZVJlYWRlcihidWlsZGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHZlcnNpb25zIGFyZSBkZW5vdGVkIGFzIFttYWpvcl1bbWlub3JdLiAgTWlub3IgdmVyc2lvbnMgbXVzdCBiZSBmb3J3YXJkLWNvbXBhdGlibGU6Ci0gICAgLy8gbmV3IGZpZWxkcyBhcmUgYWxsb3dlZCBpbiBlLmcuIHRoZSBtZXRhZGF0YSBjb21wb25lbnQsIGJ1dCBmaWVsZHMgY2FuJ3QgYmUgcmVtb3ZlZAotICAgIC8vIG9yIGhhdmUgdGhlaXIgc2l6ZSBjaGFuZ2VkLgotICAgIC8vCi0gICAgLy8gTWlub3IgdmVyc2lvbnMgd2VyZSBpbnRyb2R1Y2VkIHdpdGggdmVyc2lvbiAiaGIiIGZvciBDYXNzYW5kcmEgMS4wLjM7IHByaW9yIHRvIHRoYXQsCi0gICAgLy8gd2UgYWx3YXlzIGluY3JlbWVudGVkIHRoZSBtYWpvciB2ZXJzaW9uLgogICAgIHN0YXRpYyBjbGFzcyBCaWdWZXJzaW9uIGV4dGVuZHMgVmVyc2lvbgogICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY3VycmVudF92ZXJzaW9uID0gIm5iIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY3VycmVudF92ZXJzaW9uID0gIm5jIjsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZWFybGllc3Rfc3VwcG9ydGVkX3ZlcnNpb24gPSAibWEiOwogCiAgICAgICAgIC8vIG1hICgzLjAuMCk6IHN3YXAgYmYgaGFzaCBvcmRlcgpAQCAtMTMzLDE5ICszNjQsMjQgQEAKIAogICAgICAgICAvLyBuYSAoNC4wLXJjMSk6IHVuY29tcHJlc3NlZCBjaHVua3MsIHBlbmRpbmcgcmVwYWlyIHNlc3Npb24sIGlzVHJhbnNpZW50LCBjaGVja3N1bW1lZCBzc3RhYmxlIG1ldGFkYXRhIGZpbGUsIG5ldyBCbG9vbWZpbHRlciBmb3JtYXQKICAgICAgICAgLy8gbmIgKDQuMC4wKTogb3JpZ2luYXRpbmcgaG9zdCBpZAorICAgICAgICAvLyBuYyAoNC4xKTogaW1wcm92ZWQgbWluL21heCwgcGFydGl0aW9uIGxldmVsIGRlbGV0aW9uIHByZXNlbmNlIG1hcmtlciwga2V5IHJhbmdlIChDQVNTQU5EUkEtMTgxMzQpCiAgICAgICAgIC8vCiAgICAgICAgIC8vIE5PVEU6IHdoZW4gYWRkaW5nIGEgbmV3IHZlcnNpb24sIHBsZWFzZSBhZGQgdGhhdCB0byBMZWdhY3lTU1RhYmxlVGVzdCwgdG9vLgogCiAgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0xhdGVzdFZlcnNpb247Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uOwogICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzQ29tbWl0TG9nTG93ZXJCb3VuZDsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc0NvbW1pdExvZ0ludGVydmFsczsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc0FjY3VyYXRlTWluTWF4OworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzTGVnYWN5TWluTWF4OwogICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzT3JpZ2luYXRpbmdIb3N0SWQ7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01heENvbXByZXNzZWRMZW5ndGg7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNNYXhDb21wcmVzc2VkTGVuZ3RoOwogICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzUGVuZGluZ1JlcGFpcjsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc01ldGFkYXRhQ2hlY2tzdW07CiAgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBoYXNJc1RyYW5zaWVudDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc0ltcHJvdmVkTWluTWF4OworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvblByZXNlbmNlTWFya2VyOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzS2V5UmFuZ2U7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIENBU1NBTkRSQS05MDY3OiA0LjAgYmxvb20gZmlsdGVyIHJlcHJlc2VudGF0aW9uIGNoYW5nZWQgKHR3byBsb25ncyBqdXN0IHN3YXBwZWQpCkBAIC0xNTMsMjIgKzM4OSwyNiBAQAogICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGhhc09sZEJmRm9ybWF0OwogCi0gICAgICAgIEJpZ1ZlcnNpb24oU3RyaW5nIHZlcnNpb24pCisgICAgICAgIEJpZ1ZlcnNpb24oQmlnRm9ybWF0IGZvcm1hdCwgU3RyaW5nIHZlcnNpb24pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGluc3RhbmNlLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIHN1cGVyKGZvcm1hdCwgdmVyc2lvbik7CiAKICAgICAgICAgICAgIGlzTGF0ZXN0VmVyc2lvbiA9IHZlcnNpb24uY29tcGFyZVRvKGN1cnJlbnRfdmVyc2lvbikgPT0gMDsKICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uID0gTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzMwOwogCiAgICAgICAgICAgICBoYXNDb21taXRMb2dMb3dlckJvdW5kID0gdmVyc2lvbi5jb21wYXJlVG8oIm1iIikgPj0gMDsKICAgICAgICAgICAgIGhhc0NvbW1pdExvZ0ludGVydmFscyA9IHZlcnNpb24uY29tcGFyZVRvKCJtYyIpID49IDA7Ci0gICAgICAgICAgICBoYXNBY2N1cmF0ZU1pbk1heCA9IHZlcnNpb24uY29tcGFyZVRvKCJtZCIpID49IDA7Ci0gICAgICAgICAgICBoYXNPcmlnaW5hdGluZ0hvc3RJZCA9IHZlcnNpb24ubWF0Y2hlcygiKG1bZS16XSl8KG5bYi16XSkiKTsKKyAgICAgICAgICAgIGhhc0FjY3VyYXRlTWluTWF4ID0gdmVyc2lvbi5tYXRjaGVzKCIobVtkLXpdKXwoblthLXpdKSIpOyAvLyBkZXByZWNhdGVkIGluICduYycgYW5kIHRvIGJlIHJlbW92ZWQgaW4gJ29hJworICAgICAgICAgICAgaGFzTGVnYWN5TWluTWF4ID0gdmVyc2lvbi5tYXRjaGVzKCIobVthLXpdKXwoblthLXpdKSIpOyAvLyBkZXByZWNhdGVkIGluICduYycgYW5kIHRvIGJlIHJlbW92ZWQgaW4gJ29hJworICAgICAgICAgICAgaGFzT3JpZ2luYXRpbmdIb3N0SWQgPSB2ZXJzaW9uLm1hdGNoZXMoIihtW2Utel0pIikgfHwgdmVyc2lvbi5jb21wYXJlVG8oIm5iIikgPj0gMDsKICAgICAgICAgICAgIGhhc01heENvbXByZXNzZWRMZW5ndGggPSB2ZXJzaW9uLmNvbXBhcmVUbygibmEiKSA+PSAwOwogICAgICAgICAgICAgaGFzUGVuZGluZ1JlcGFpciA9IHZlcnNpb24uY29tcGFyZVRvKCJuYSIpID49IDA7CiAgICAgICAgICAgICBoYXNJc1RyYW5zaWVudCA9IHZlcnNpb24uY29tcGFyZVRvKCJuYSIpID49IDA7CiAgICAgICAgICAgICBoYXNNZXRhZGF0YUNoZWNrc3VtID0gdmVyc2lvbi5jb21wYXJlVG8oIm5hIikgPj0gMDsKICAgICAgICAgICAgIGhhc09sZEJmRm9ybWF0ID0gdmVyc2lvbi5jb21wYXJlVG8oIm5hIikgPCAwOworICAgICAgICAgICAgaGFzSW1wcm92ZWRNaW5NYXggPSB2ZXJzaW9uLmNvbXBhcmVUbygibmMiKSA+PSAwOworICAgICAgICAgICAgaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvblByZXNlbmNlTWFya2VyID0gdmVyc2lvbi5jb21wYXJlVG8oIm5jIikgPj0gMDsKKyAgICAgICAgICAgIGhhc0tleVJhbmdlID0gdmVyc2lvbi5jb21wYXJlVG8oIm5jIikgPj0gMDsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQpAQCAtMTc4LDYgKzQxOCwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb24oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ29tbWl0TG9nTG93ZXJCb3VuZCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBoYXNDb21taXRMb2dMb3dlckJvdW5kOwpAQCAtMTg5LDYgKzQzNSwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIGhhc0NvbW1pdExvZ0ludGVydmFsczsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNYXhDb21wcmVzc2VkTGVuZ3RoKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGhhc01heENvbXByZXNzZWRMZW5ndGg7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUGVuZGluZ1JlcGFpcigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBoYXNQZW5kaW5nUmVwYWlyOwpAQCAtMjAxLDIzICs0NTQsNTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01ldGFkYXRhQ2hlY2tzdW0oKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gaGFzTWV0YWRhdGFDaGVja3N1bTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNPbGRCZkZvcm1hdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBoYXNPbGRCZkZvcm1hdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNBY2N1cmF0ZU1pbk1heCgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBoYXNBY2N1cmF0ZU1pbk1heDsKICAgICAgICAgfQogCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNMZWdhY3lNaW5NYXgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaGFzTGVnYWN5TWluTWF4OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc09yaWdpbmF0aW5nSG9zdElkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGhhc09yaWdpbmF0aW5nSG9zdElkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0ltcHJvdmVkTWluTWF4KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGhhc0ltcHJvdmVkTWluTWF4OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zUHJlc2VuY2VNYXJrZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvblByZXNlbmNlTWFya2VyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0tleVJhbmdlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGhhc0tleVJhbmdlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uLmNvbXBhcmVUbyhlYXJsaWVzdF9zdXBwb3J0ZWRfdmVyc2lvbikgPj0gMCAmJiB2ZXJzaW9uLmNoYXJBdCgwKSA8PSBjdXJyZW50X3ZlcnNpb24uY2hhckF0KDApOwpAQCAtMjI4LDIyICs1MTIsMzYgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGlzQ29tcGF0aWJsZSgpICYmIHZlcnNpb24uY2hhckF0KDApID09IGN1cnJlbnRfdmVyc2lvbi5jaGFyQXQoMCk7CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzT3JpZ2luYXRpbmdIb3N0SWQoKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJpZ1RhYmxlU3BlY2lmaWNNZXRyaWNzUHJvdmlkZXJzIGltcGxlbWVudHMgTWV0cmljc1Byb3ZpZGVycworICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQmlnVGFibGVTcGVjaWZpY01ldHJpY3NQcm92aWRlcnMgaW5zdGFuY2UgPSBuZXcgQmlnVGFibGVTcGVjaWZpY01ldHJpY3NQcm92aWRlcnMoKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPEdhdWdlUHJvdmlkZXI8Pz4+IGdhdWdlUHJvdmlkZXJzID0gSXRlcmFibGVzLmNvbmNhdChCbG9vbUZpbHRlck1ldHJpY3MuaW5zdGFuY2UuZ2V0R2F1Z2VQcm92aWRlcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhTdW1tYXJ5TWV0cmljcy5pbnN0YW5jZS5nZXRHYXVnZVByb3ZpZGVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlDYWNoZU1ldHJpY3MuaW5zdGFuY2UuZ2V0R2F1Z2VQcm92aWRlcnMoKSk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJdGVyYWJsZTxHYXVnZVByb3ZpZGVyPD8+PiBnZXRHYXVnZVByb3ZpZGVycygpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBoYXNPcmlnaW5hdGluZ0hvc3RJZDsKKyAgICAgICAgICAgIHJldHVybiBnYXVnZVByb3ZpZGVyczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmlnRm9ybWF0RmFjdG9yeSBpbXBsZW1lbnRzIEZhY3RvcnkKKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTkFNRTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNYXhDb21wcmVzc2VkTGVuZ3RoKCkKKyAgICAgICAgcHVibGljIFNTVGFibGVGb3JtYXQ8PywgPz4gZ2V0SW5zdGFuY2UoTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaGFzTWF4Q29tcHJlc3NlZExlbmd0aDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNPbGRCZkZvcm1hdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBoYXNPbGRCZkZvcm1hdDsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmlnRm9ybWF0KG9wdGlvbnMpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ0Zvcm1hdFBhcnRpdGlvbldyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ0Zvcm1hdFBhcnRpdGlvbldyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMTk4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnRm9ybWF0UGFydGl0aW9uV3JpdGVyLmphdmEKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuSW50czsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNvcnRlZFRhYmxlUGFydGl0aW9uV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKKworLyoqCisgKiBDb2x1bW4gaW5kZXggYnVpbGRlciB1c2VkIGJ5IHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnVGFibGVXcml0ZXJ9LgorICogRm9yIGluZGV4IGVudHJpZXMgdGhhdCBleGNlZWQge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcjY29sdW1uX2luZGV4X2NhY2hlX3NpemV9LAorICogdGhpcyB1c2VzIHRoZSBzZXJpYWxpemF0aW9uIGxvZ2ljIGFzIGluIHtAbGluayBSb3dJbmRleEVudHJ5fS4KKyAqLworcHVibGljIGNsYXNzIEJpZ0Zvcm1hdFBhcnRpdGlvbldyaXRlciBleHRlbmRzIFNvcnRlZFRhYmxlUGFydGl0aW9uV3JpdGVyCit7CisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9HUkFOVUxBUklUWSA9IDY0ICogMTAyNDsKKworICAgIC8vIHVzZWQsIGlmIHRoZSByb3ctaW5kZXgtZW50cnkgcmVhY2hlcyBjb25maWcgY29sdW1uX2luZGV4X2NhY2hlX3NpemUKKyAgICBwcml2YXRlIERhdGFPdXRwdXRCdWZmZXIgYnVmZmVyOworICAgIC8vIHVzZWQgdG8gdHJhY2sgdGhlIHNpemUgb2YgdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiByb3ctaW5kZXgtZW50cnkgKHVudXNlZCBmb3IgYnVmZmVyKQorICAgIHByaXZhdGUgaW50IGluZGV4U2FtcGxlc1NlcmlhbGl6ZWRTaXplOworICAgIC8vIHVzZWQsIHVudGlsIHRoZSByb3ctaW5kZXgtZW50cnkgcmVhY2hlcyBjb25maWcgY29sdW1uX2luZGV4X2NhY2hlX3NpemUKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SW5kZXhJbmZvPiBpbmRleFNhbXBsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHByaXZhdGUgRGF0YU91dHB1dEJ1ZmZlciByZXVzYWJsZUJ1ZmZlcjsKKworICAgIHByaXZhdGUgaW50IGNvbHVtbkluZGV4Q291bnQ7CisgICAgcHJpdmF0ZSBpbnRbXSBpbmRleE9mZnNldHM7CisKKyAgICBwcml2YXRlIGZpbmFsIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4U2VyaWFsaXplcjsKKworICAgIHByaXZhdGUgZmluYWwgaW50IGNhY2hlU2l6ZVRocmVzaG9sZDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBpbmRleFNpemU7CisKKyAgICBCaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXIoU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaW5kZXhJbmZvU2VyaWFsaXplcikKKyAgICB7CisgICAgICAgIHRoaXMoaGVhZGVyLCB3cml0ZXIsIHZlcnNpb24sIGluZGV4SW5mb1NlcmlhbGl6ZXIsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleENhY2hlU2l6ZSgpLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplKERFRkFVTFRfR1JBTlVMQVJJVFkpKTsKKyAgICB9CisKKyAgICBCaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXIoU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaW5kZXhJbmZvU2VyaWFsaXplciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlU2l6ZVRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4U2l6ZSkKKyAgICB7CisgICAgICAgIHN1cGVyKGhlYWRlciwgd3JpdGVyLCB2ZXJzaW9uKTsKKyAgICAgICAgdGhpcy5pZHhTZXJpYWxpemVyID0gaW5kZXhJbmZvU2VyaWFsaXplcjsKKyAgICAgICAgdGhpcy5jYWNoZVNpemVUaHJlc2hvbGQgPSBjYWNoZVNpemVUaHJlc2hvbGQ7CisgICAgICAgIHRoaXMuaW5kZXhTaXplID0gaW5kZXhTaXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAgIHN1cGVyLnJlc2V0KCk7CisgICAgICAgIHRoaXMuY29sdW1uSW5kZXhDb3VudCA9IDA7CisgICAgICAgIHRoaXMuaW5kZXhTYW1wbGVzU2VyaWFsaXplZFNpemUgPSAwOworICAgICAgICB0aGlzLmluZGV4U2FtcGxlcy5jbGVhcigpOworCisgICAgICAgIGlmICh0aGlzLmJ1ZmZlciAhPSBudWxsKQorICAgICAgICAgICAgdGhpcy5yZXVzYWJsZUJ1ZmZlciA9IHRoaXMuYnVmZmVyOworICAgICAgICB0aGlzLmJ1ZmZlciA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRDb2x1bW5JbmRleENvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBjb2x1bW5JbmRleENvdW50OworICAgIH0KKworICAgIHB1YmxpYyBCeXRlQnVmZmVyIGJ1ZmZlcigpCisgICAgeworICAgICAgICByZXR1cm4gYnVmZmVyICE9IG51bGwgPyBidWZmZXIuYnVmZmVyKCkgOiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PEluZGV4SW5mbz4gaW5kZXhTYW1wbGVzKCkKKyAgICB7CisgICAgICAgIGlmIChpbmRleFNhbXBsZXNTZXJpYWxpemVkU2l6ZSArIGNvbHVtbkluZGV4Q291bnQgKiBUeXBlU2l6ZXMuc2l6ZW9mKDApIDw9IGNhY2hlU2l6ZVRocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGluZGV4U2FtcGxlczsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBpbnRbXSBvZmZzZXRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmRleE9mZnNldHMgIT0gbnVsbAorICAgICAgICAgICAgICAgPyBBcnJheXMuY29weU9mKGluZGV4T2Zmc2V0cywgY29sdW1uSW5kZXhDb3VudCkKKyAgICAgICAgICAgICAgIDogbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkSW5kZXhCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSW5kZXhJbmZvIGNJbmRleEluZm8gPSBuZXcgSW5kZXhJbmZvKGZpcnN0Q2x1c3RlcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDbHVzdGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbigpIC0gc3RhcnRQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFvcGVuTWFya2VyLmlzTGl2ZSgpID8gb3Blbk1hcmtlciA6IG51bGwpOworCisgICAgICAgIC8vIGluZGV4T2Zmc2V0cyBpcyB1c2VkIGZvciBib3RoIHNoYWxsb3cgKFNoYWxsb3dJbmRleGVkRW50cnkpIGFuZCBub24tc2hhbGxvdyBJbmRleGVkRW50cnkuCisgICAgICAgIC8vIEZvciBzaGFsbG93IG9uZXMsIHdlIG5lZWQgaXQgdG8gc2VyaWFsaXplIHRoZSBvZmZzdHMgaW4gZmluaXNoKCkuCisgICAgICAgIC8vIEZvciBub24tc2hhbGxvdyBvbmVzLCB0aGUgb2Zmc3RzIGFyZSBwYXNzZWQgaW50byBJbmRleGVkRW50cnksIHNvIHdlIGRvbid0IGhhdmUgdG8KKyAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBvZmZzZXRzIGFnYWluLgorCisgICAgICAgIC8vIGluZGV4T2Zmc2V0cyBjb250YWlucyB0aGUgb2Zmc2V0cyBvZiB0aGUgc2VyaWFsaXplZCBJbmRleEluZm8gb2JqZWN0cy4KKyAgICAgICAgLy8gSS5lLiBpbmRleE9mZnNldHNbMF0gaXMgYWx3YXlzIDAgc28gd2UgZG9uJ3QgaGF2ZSB0byBkZWFsIHdpdGggYSBzcGVjaWFsIGhhbmRsaW5nCisgICAgICAgIC8vIGZvciBpbmRleCAjMCBhbmQgYWx3YXlzIHN1YnRyYWN0aW5nIDEgZm9yIHRoZSBpbmRleCAod2hpY2ggY291bGQgYmUgZXJyb3ItcHJvbmUpLgorICAgICAgICBpZiAoaW5kZXhPZmZzZXRzID09IG51bGwpCisgICAgICAgICAgICBpbmRleE9mZnNldHMgPSBuZXcgaW50WzEwXTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29sdW1uSW5kZXhDb3VudCA+PSBpbmRleE9mZnNldHMubGVuZ3RoKQorICAgICAgICAgICAgICAgIGluZGV4T2Zmc2V0cyA9IEFycmF5cy5jb3B5T2YoaW5kZXhPZmZzZXRzLCBpbmRleE9mZnNldHMubGVuZ3RoICsgMTApOworCisgICAgICAgICAgICAvL3RoZSAwdGggZWxlbWVudCBpcyBhbHdheXMgMAorICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4Q291bnQgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleE9mZnNldHNbY29sdW1uSW5kZXhDb3VudF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGV4T2Zmc2V0c1tjb2x1bW5JbmRleENvdW50XSA9CisgICAgICAgICAgICAgICAgYnVmZmVyICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IEludHMuY2hlY2tlZENhc3QoYnVmZmVyLnBvc2l0aW9uKCkpCisgICAgICAgICAgICAgICAgOiBpbmRleFNhbXBsZXNTZXJpYWxpemVkU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb2x1bW5JbmRleENvdW50Kys7CisKKyAgICAgICAgLy8gRmlyc3QsIHdlIGNvbGxlY3QgdGhlIEluZGV4SW5mbyBvYmplY3RzIHVudGlsIHdlIHJlYWNoIENvbmZpZy5jb2x1bW5faW5kZXhfY2FjaGVfc2l6ZSBpbiBhbiBBcnJheUxpc3QuCisgICAgICAgIC8vIFdoZW4gY29sdW1uX2luZGV4X2NhY2hlX3NpemUgaXMgcmVhY2hlZCwgd2Ugc3dpdGNoIHRvIGJ5dGUtYnVmZmVyIG1vZGUuCisgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZXhTYW1wbGVzU2VyaWFsaXplZFNpemUgKz0gaWR4U2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShjSW5kZXhJbmZvKTsKKyAgICAgICAgICAgIGlmIChpbmRleFNhbXBsZXNTZXJpYWxpemVkU2l6ZSArIGNvbHVtbkluZGV4Q291bnQgKiBUeXBlU2l6ZXMuc2l6ZW9mKDApID4gY2FjaGVTaXplVGhyZXNob2xkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHJldXNlT3JBbGxvY2F0ZUJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGZvciAoSW5kZXhJbmZvIGluZGV4U2FtcGxlIDogaW5kZXhTYW1wbGVzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWR4U2VyaWFsaXplci5zZXJpYWxpemUoaW5kZXhTYW1wbGUsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluZGV4U2FtcGxlcy5hZGQoY0luZGV4SW5mbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZG9uJ3QgcHV0IGFuIGVsc2UgaGVyZSBzaW5jZSBidWZmZXIgbWF5IGJlIGFsbG9jYXRlZCBpbiBwcmVjZWRpbmcgaWYgYmxvY2sKKyAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBpZHhTZXJpYWxpemVyLnNlcmlhbGl6ZShjSW5kZXhJbmZvLCBidWZmZXIpOworICAgICAgICB9CisKKyAgICAgICAgZmlyc3RDbHVzdGVyaW5nID0gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIERhdGFPdXRwdXRCdWZmZXIgcmV1c2VPckFsbG9jYXRlQnVmZmVyKCkKKyAgICB7CisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYSByZXVzYWJsZSBEYXRhT3V0cHV0QnVmZmVyIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzCisgICAgICAgIC8vIENvbHVtbkluZGV4IGluc3RhbmNlIGFuZCByZXR1cm4gaXQuCisgICAgICAgIGlmIChyZXVzYWJsZUJ1ZmZlciAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGJ1ZmZlciA9IHJldXNhYmxlQnVmZmVyOworICAgICAgICAgICAgYnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyOworICAgICAgICB9CisgICAgICAgIC8vIGRvbid0IHVzZSB0aGUgc3RhbmRhcmQgUkVDWUNMRVIgYXMgdGhhdCBvbmx5IHJlY3ljbGVzIHVwIHRvIDFNQiBhbmQgcmVxdWlyZXMgcHJvcGVyIGNsZWFudXAKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRhT3V0cHV0QnVmZmVyKGNhY2hlU2l6ZVRocmVzaG9sZCAqIDIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZFVuZmlsdGVyZWQoVW5maWx0ZXJlZCB1bmZpbHRlcmVkKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHN1cGVyLmFkZFVuZmlsdGVyZWQodW5maWx0ZXJlZCk7CisKKyAgICAgICAgLy8gaWYgd2UgaGl0IHRoZSBjb2x1bW4gaW5kZXggc2l6ZSB0aGF0IHdlIGhhdmUgdG8gaW5kZXggYWZ0ZXIsIGdvIGFoZWFkIGFuZCBpbmRleCBpdC4KKyAgICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbigpIC0gc3RhcnRQb3NpdGlvbiA+PSBpbmRleFNpemUpCisgICAgICAgICAgICBhZGRJbmRleEJsb2NrKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZmluaXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIGVuZFBvc2l0aW9uID0gc3VwZXIuZmluaXNoKCk7CisKKyAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB3ZSBhZGQgbm8gcm93cywganVzdCBhIHRvcCBsZXZlbCBkZWxldGlvbgorICAgICAgICBpZiAod3JpdHRlbiA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGVuZFBvc2l0aW9uOworCisgICAgICAgIC8vIHRoZSBsYXN0IGNvbHVtbiBtYXkgaGF2ZSBmYWxsZW4gb24gYW4gaW5kZXggYm91bmRhcnkgYWxyZWFkeS4gIGlmIG5vdCwgaW5kZXggaXQgZXhwbGljaXRseS4KKyAgICAgICAgaWYgKGZpcnN0Q2x1c3RlcmluZyAhPSBudWxsKQorICAgICAgICAgICAgYWRkSW5kZXhCbG9jaygpOworCisgICAgICAgIC8vIElmIHdlIHNlcmlhbGl6ZSB0aGUgSW5kZXhJbmZvIG9iamVjdHMgZGlyZWN0bHkgaW4gdGhlIGNvZGUgYWJvdmUgaW50byAnYnVmZmVyJywKKyAgICAgICAgLy8gd2UgaGF2ZSB0byB3cml0ZSB0aGUgb2Zmc3RzIHRvIHRoZXNlIGhlcmUuIFRoZSBvZmZzZXRzIGhhdmUgYWxyZWFkeSBiZWVuIGNvbGxlY3RlZAorICAgICAgICAvLyBpbiBpbmRleE9mZnNldHNbXS4gYnVmZmVyIGlzICE9IG51bGwsIGlmIGl0IGV4Y2VlZHMgQ29uZmlnLmNvbHVtbl9pbmRleF9jYWNoZV9zaXplLgorICAgICAgICAvLyBJbiB0aGUgb3RoZXIgY2FzZSwgd2hlbiBidWZmZXI9PW51bGwsIHRoZSBvZmZzZXRzIGFyZSBzZXJpYWxpemVkIGluIFJvd0luZGV4RW50cnkuSW5kZXhlZEVudHJ5LnNlcmlhbGl6ZSgpLgorICAgICAgICBpZiAoYnVmZmVyICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uSW5kZXhDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIGJ1ZmZlci53cml0ZUludChpbmRleE9mZnNldHNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2Ugc2hvdWxkIGFsd2F5cyBoYXZlIGF0IGxlYXN0IG9uZSBjb21wdXRlZCBpbmRleCBibG9jaywgYnV0IHdlIG9ubHkgd3JpdGUgaXQgb3V0IGlmIHRoZXJlIGlzIG1vcmUgdGhhbiB0aGF0LgorICAgICAgICBhc3NlcnQgY29sdW1uSW5kZXhDb3VudCA+IDAgJiYgZ2V0SGVhZGVyTGVuZ3RoKCkgPj0gMDsKKworICAgICAgICByZXR1cm4gZW5kUG9zaXRpb247CisgICAgfQorCisgICAgcHVibGljIGludCBpbmRleEluZm9TZXJpYWxpemVkU2l6ZSgpCisgICAgeworICAgICAgICByZXR1cm4gYnVmZmVyICE9IG51bGwKKyAgICAgICAgICAgICAgID8gYnVmZmVyLmJ1ZmZlcigpLmxpbWl0KCkKKyAgICAgICAgICAgICAgIDogaW5kZXhTYW1wbGVzU2VyaWFsaXplZFNpemUgKyBjb2x1bW5JbmRleENvdW50ICogVHlwZVNpemVzLnNpemVvZigwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICAvLyBuby1vcAorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnU1NUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmNzIwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdTU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIuamF2YQpAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbEludDsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5Db21wcmVzc2lvbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRG93bnNhbXBsaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuS2V5UmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Db21wcmVzc2lvbkluZm9Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuRmlsdGVyQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkluZGV4Q29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNvcnRlZFRhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU3RhdHNDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5LkluZGV4U3VtbWFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5WYWxpZGF0aW9uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuVGFibGVNZXRyaWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2FjaGVTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZpbHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK3B1YmxpYyBjbGFzcyBCaWdTU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIgZXh0ZW5kcyBTb3J0ZWRUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyPEJpZ1RhYmxlUmVhZGVyLCBCaWdUYWJsZVJlYWRlci5CdWlsZGVyPgoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihCaWdTU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBGaWxlSGFuZGxlLkJ1aWxkZXIgaW5kZXhGaWxlQnVpbGRlcjsKKworICAgIHB1YmxpYyBCaWdTU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIoU1NUYWJsZS5CdWlsZGVyPD8sID8+IGRlc2NyaXB0b3IpCisgICAgeworICAgICAgICBzdXBlcihkZXNjcmlwdG9yKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvcGVuQ29tcG9uZW50cyhCaWdUYWJsZVJlYWRlci5CdWlsZGVyIGJ1aWxkZXIsIFNTVGFibGUuT3duZXIgb3duZXIsIGJvb2xlYW4gdmFsaWRhdGUsIGJvb2xlYW4gb25saW5lKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAob25saW5lICYmIGJ1aWxkZXIuZ2V0VGFibGVNZXRhZGF0YVJlZigpLmdldExvY2FsKCkucGFyYW1zLmNhY2hpbmcuY2FjaGVLZXlzKCkpCisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRLZXlDYWNoZShuZXcgS2V5Q2FjaGUoQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlKSk7CisKKyAgICAgICAgICAgIFN0YXRzQ29tcG9uZW50IHN0YXRzQ29tcG9uZW50ID0gU3RhdHNDb21wb25lbnQubG9hZChkZXNjcmlwdG9yLCBNZXRhZGF0YVR5cGUuU1RBVFMsIE1ldGFkYXRhVHlwZS5IRUFERVIsIE1ldGFkYXRhVHlwZS5WQUxJREFUSU9OKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0U2VyaWFsaXphdGlvbkhlYWRlcihzdGF0c0NvbXBvbmVudC5zZXJpYWxpemF0aW9uSGVhZGVyKGJ1aWxkZXIuZ2V0VGFibGVNZXRhZGF0YVJlZigpLmdldExvY2FsKCkpKTsKKyAgICAgICAgICAgIGNoZWNrQXJndW1lbnQoIW9ubGluZSB8fCBidWlsZGVyLmdldFNlcmlhbGl6YXRpb25IZWFkZXIoKSAhPSBudWxsKTsKKworICAgICAgICAgICAgYnVpbGRlci5zZXRTdGF0c01ldGFkYXRhKHN0YXRzQ29tcG9uZW50LnN0YXRzTWV0YWRhdGEoKSk7CisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci52ZXJzaW9uLmhhc0tleVJhbmdlKCkgJiYgc3RhdHNDb21wb25lbnQuc3RhdHNNZXRhZGF0YSgpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRGaXJzdCh0YWJsZU1ldGFkYXRhUmVmLmdldExvY2FsKCkucGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoc3RhdHNDb21wb25lbnQuc3RhdHNNZXRhZGF0YSgpLmZpcnN0S2V5KSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRMYXN0KHRhYmxlTWV0YWRhdGFSZWYuZ2V0TG9jYWwoKS5wYXJ0aXRpb25lci5kZWNvcmF0ZUtleShzdGF0c0NvbXBvbmVudC5zdGF0c01ldGFkYXRhKCkubGFzdEtleSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBWYWxpZGF0aW9uTWV0YWRhdGEgdmFsaWRhdGlvbk1ldGFkYXRhID0gc3RhdHNDb21wb25lbnQudmFsaWRhdGlvbk1ldGFkYXRhKCk7CisgICAgICAgICAgICB2YWxpZGF0ZVBhcnRpdGlvbmVyKGJ1aWxkZXIuZ2V0VGFibGVNZXRhZGF0YVJlZigpLmdldExvY2FsKCksIHZhbGlkYXRpb25NZXRhZGF0YSk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gZmlsdGVyTmVlZGVkID0gb25saW5lOworICAgICAgICAgICAgaWYgKGZpbHRlck5lZWRlZCkKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldEZpbHRlcihsb2FkRmlsdGVyKHZhbGlkYXRpb25NZXRhZGF0YSkpOworICAgICAgICAgICAgYm9vbGVhbiByZWJ1aWxkRmlsdGVyID0gZmlsdGVyTmVlZGVkICYmIGJ1aWxkZXIuZ2V0RmlsdGVyKCkgPT0gbnVsbDsKKworICAgICAgICAgICAgYm9vbGVhbiBzdW1tYXJ5TmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChzdW1tYXJ5TmVlZGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluZGV4U3VtbWFyeUNvbXBvbmVudCBzdW1tYXJ5Q29tcG9uZW50ID0gbG9hZFN1bW1hcnkoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3VtbWFyeUNvbXBvbmVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0Rmlyc3QoKSA9PSBudWxsIHx8IGJ1aWxkZXIuZ2V0TGFzdCgpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0Rmlyc3Qoc3VtbWFyeUNvbXBvbmVudC5maXJzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldExhc3Qoc3VtbWFyeUNvbXBvbmVudC5sYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldEluZGV4U3VtbWFyeShzdW1tYXJ5Q29tcG9uZW50LmluZGV4U3VtbWFyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiByZWJ1aWxkU3VtbWFyeSA9IHN1bW1hcnlOZWVkZWQgJiYgYnVpbGRlci5nZXRJbmRleFN1bW1hcnkoKSA9PSBudWxsOworCisgICAgICAgICAgICBpZiAoYnVpbGRlci5nZXRDb21wb25lbnRzKCkuY29udGFpbnMoQ29tcG9uZW50cy5QUklNQVJZX0lOREVYKSAmJiAocmVidWlsZEZpbHRlciB8fCByZWJ1aWxkU3VtbWFyeSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGluZGV4RmlsZSA9IGluZGV4RmlsZUJ1aWxkZXIoYnVpbGRlci5nZXRJbmRleFN1bW1hcnkoKSkuY29tcGxldGUoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFBhaXI8SUZpbHRlciwgSW5kZXhTdW1tYXJ5Q29tcG9uZW50PiBmaWx0ZXJBbmRTdW1tYXJ5ID0gYnVpbGRTdW1tYXJ5QW5kQmxvb21GaWx0ZXIoaW5kZXhGaWxlLCBidWlsZGVyLmdldFNlcmlhbGl6YXRpb25IZWFkZXIoKSwgcmVidWlsZEZpbHRlciwgcmVidWlsZFN1bW1hcnksIG93bmVyICE9IG51bGwgPyBvd25lci5nZXRNZXRyaWNzKCkgOiBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgSUZpbHRlciBmaWx0ZXIgPSBmaWx0ZXJBbmRTdW1tYXJ5LmxlZnQ7CisgICAgICAgICAgICAgICAgICAgIEluZGV4U3VtbWFyeUNvbXBvbmVudCBzdW1tYXJ5Q29tcG9uZW50ID0gZmlsdGVyQW5kU3VtbWFyeS5yaWdodDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc3VtbWFyeUNvbXBvbmVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldEZpcnN0KHN1bW1hcnlDb21wb25lbnQuZmlyc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRMYXN0KHN1bW1hcnlDb21wb25lbnQubGFzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNldEluZGV4U3VtbWFyeShzdW1tYXJ5Q29tcG9uZW50LmluZGV4U3VtbWFyeSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbmxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeUNvbXBvbmVudC5zYXZlKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlNVTU1BUlkpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0RmlsdGVyKGZpbHRlcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbmxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyQ29tcG9uZW50LnNhdmUoZmlsdGVyLCBkZXNjcmlwdG9yLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSAoQ29tcHJlc3Npb25NZXRhZGF0YSBjb21wcmVzc2lvbk1ldGFkYXRhID0gQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50Lm1heWJlTG9hZChkZXNjcmlwdG9yLCBjb21wb25lbnRzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldERhdGFGaWxlKGRhdGFGaWxlQnVpbGRlcihidWlsZGVyLmdldFN0YXRzTWV0YWRhdGEoKSkud2l0aENvbXByZXNzaW9uTWV0YWRhdGEoY29tcHJlc3Npb25NZXRhZGF0YSkuY29tcGxldGUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChidWlsZGVyLmdldEZpbHRlcigpID09IG51bGwpCisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRGaWx0ZXIoRmlsdGVyRmFjdG9yeS5BbHdheXNQcmVzZW50KTsKKworICAgICAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0Q29tcG9uZW50cygpLmNvbnRhaW5zKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCkpCisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRJbmRleEZpbGUoaW5kZXhGaWxlQnVpbGRlcihidWlsZGVyLmdldEluZGV4U3VtbWFyeSgpKS5jb21wbGV0ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gfCBSdW50aW1lRXhjZXB0aW9uIHwgRXJyb3IgZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRocm93YWJsZXMuY2xvc2VOb25OdWxsQW5kQWRkU3VwcHJlc3NlZChleCwgYnVpbGRlci5nZXREYXRhRmlsZSgpLCBidWlsZGVyLmdldEluZGV4RmlsZSgpLCBidWlsZGVyLmdldEZpbHRlcigpLCBidWlsZGVyLmdldEluZGV4U3VtbWFyeSgpKTsKKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEtleVJlYWRlciBidWlsZEtleVJlYWRlcihUYWJsZU1ldHJpY3MgdGFibGVNZXRyaWNzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0YXRzQ29tcG9uZW50IHN0YXRzQ29tcG9uZW50ID0gU3RhdHNDb21wb25lbnQubG9hZChkZXNjcmlwdG9yLCBNZXRhZGF0YVR5cGUuU1RBVFMsIE1ldGFkYXRhVHlwZS5IRUFERVIsIE1ldGFkYXRhVHlwZS5WQUxJREFUSU9OKTsKKyAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBzdGF0c0NvbXBvbmVudC5zZXJpYWxpemF0aW9uSGVhZGVyKHRhYmxlTWV0YWRhdGFSZWYuZ2V0TG9jYWwoKSk7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBpbmRleEZpbGUgPSBpbmRleEZpbGVCdWlsZGVyKG51bGwpLmNvbXBsZXRlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVLZXlSZWFkZXIoaW5kZXhGaWxlLCBoZWFkZXIsIHRhYmxlTWV0cmljcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEtleVJlYWRlciBjcmVhdGVLZXlSZWFkZXIoRmlsZUhhbmRsZSBpbmRleEZpbGUsIFNlcmlhbGl6YXRpb25IZWFkZXIgc2VyaWFsaXphdGlvbkhlYWRlciwgVGFibGVNZXRyaWNzIHRhYmxlTWV0cmljcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBjaGVja05vdE51bGwoaW5kZXhGaWxlKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHNlcmlhbGl6YXRpb25IZWFkZXIpOworCisgICAgICAgIFJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyKGRlc2NyaXB0b3IudmVyc2lvbiwgc2VyaWFsaXphdGlvbkhlYWRlciwgdGFibGVNZXRyaWNzKTsKKyAgICAgICAgcmV0dXJuIEJpZ1RhYmxlS2V5UmVhZGVyLmNyZWF0ZShpbmRleEZpbGUsIHNlcmlhbGl6ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdvIHRocm91Z2ggdGhlIGluZGV4IGFuZCBvcHRpb25hbGx5IHJlYnVpbGQgdGhlIGluZGV4IHN1bW1hcnkgYW5kIEJsb29tIGZpbHRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWJ1aWxkRmlsdGVyICB0cnVlIGlmIEJsb29tIGZpbHRlciBzaG91bGQgYmUgcmVidWlsdAorICAgICAqIEBwYXJhbSByZWJ1aWxkU3VtbWFyeSB0cnVlIGlmIGluZGV4IHN1bW1hcnksIGZpcnN0IGFuZCBsYXN0IGtleXMgc2hvdWxkIGJlIHJlYnVpbHQKKyAgICAgKiBAcmV0dXJuIGEgcGFpciBvZiBjcmVhdGVkIGZpbHRlciBhbmQgaW5kZXggc3VtbWFyeSBjb21wb25lbnQgKG9yIG51bGxzIGlmIHNvbWUgb2YgdGhlbSB3ZXJlIG5vdCBjcmVhdGVkKQorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgcHJpdmF0ZSBQYWlyPElGaWx0ZXIsIEluZGV4U3VtbWFyeUNvbXBvbmVudD4gYnVpbGRTdW1tYXJ5QW5kQmxvb21GaWx0ZXIoRmlsZUhhbmRsZSBpbmRleEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBzZXJpYWxpemF0aW9uSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVidWlsZEZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlYnVpbGRTdW1tYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0cmljcyB0YWJsZU1ldHJpY3MpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGluZGV4RmlsZSk7CisgICAgICAgIGNoZWNrTm90TnVsbChzZXJpYWxpemF0aW9uSGVhZGVyKTsKKworICAgICAgICBEZWNvcmF0ZWRLZXkgZmlyc3QgPSBudWxsLCBrZXkgPSBudWxsOworICAgICAgICBJRmlsdGVyIGJmID0gbnVsbDsKKyAgICAgICAgSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSA9IG51bGw7CisKKyAgICAgICAgLy8gd2UgcmVhZCB0aGUgcG9zaXRpb25zIGluIGEgQlJBRiwgc28gd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBhbiBlbnRyeSBzcGFubmluZyBhIG1tYXAgYm91bmRhcnkuCisgICAgICAgIHRyeSAoS2V5UmVhZGVyIGtleVJlYWRlciA9IGNyZWF0ZUtleVJlYWRlcihpbmRleEZpbGUsIHNlcmlhbGl6YXRpb25IZWFkZXIsIHRhYmxlTWV0cmljcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgZXN0aW1hdGVkUm93c051bWJlciA9IHJlYnVpbGRGaWx0ZXIgfHwgcmVidWlsZFN1bW1hcnkgPyBlc3RpbWF0ZVJvd3NGcm9tSW5kZXgoaW5kZXhGaWxlKSA6IDA7CisKKyAgICAgICAgICAgIGlmIChyZWJ1aWxkRmlsdGVyKQorICAgICAgICAgICAgICAgIGJmID0gRmlsdGVyRmFjdG9yeS5nZXRGaWx0ZXIoZXN0aW1hdGVkUm93c051bWJlciwgdGFibGVNZXRhZGF0YVJlZi5nZXRMb2NhbCgpLnBhcmFtcy5ibG9vbUZpbHRlckZwQ2hhbmNlKTsKKworICAgICAgICAgICAgdHJ5IChJbmRleFN1bW1hcnlCdWlsZGVyIHN1bW1hcnlCdWlsZGVyID0gIXJlYnVpbGRTdW1tYXJ5ID8gbnVsbCA6IG5ldyBJbmRleFN1bW1hcnlCdWlsZGVyKGVzdGltYXRlZFJvd3NOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVNZXRhZGF0YVJlZi5nZXRMb2NhbCgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvd25zYW1wbGluZy5CQVNFX1NBTVBMSU5HX0xFVkVMKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIWtleVJlYWRlci5pc0V4aGF1c3RlZCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gdGFibGVNZXRhZGF0YVJlZi5nZXRMb2NhbCgpLnBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KGtleVJlYWRlci5rZXkoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWJ1aWxkU3VtbWFyeSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBrZXk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5QnVpbGRlci5tYXliZUFkZEVudHJ5KGtleSwga2V5UmVhZGVyLmtleVBvc2l0aW9uRm9yU2Vjb25kYXJ5SW5kZXgoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocmVidWlsZEZpbHRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJmLmFkZChrZXkpOworCisgICAgICAgICAgICAgICAgICAgIGtleVJlYWRlci5hZHZhbmNlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHJlYnVpbGRTdW1tYXJ5KQorICAgICAgICAgICAgICAgICAgICBpbmRleFN1bW1hcnkgPSBzdW1tYXJ5QnVpbGRlci5idWlsZCh0YWJsZU1ldGFkYXRhUmVmLmdldExvY2FsKCkucGFydGl0aW9uZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiB8IFJ1bnRpbWVFeGNlcHRpb24gfCBFcnJvciBleCkKKyAgICAgICAgeworICAgICAgICAgICAgVGhyb3dhYmxlcy5jbG9zZU5vbk51bGxBbmRBZGRTdXBwcmVzc2VkKGV4LCBpbmRleFN1bW1hcnksIGJmKTsKKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IHJlYnVpbGRTdW1tYXJ5IHx8IGluZGV4U3VtbWFyeSA9PSBudWxsOworICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUoYmYsIHJlYnVpbGRTdW1tYXJ5ID8gbmV3IEluZGV4U3VtbWFyeUNvbXBvbmVudChpbmRleFN1bW1hcnksIGZpcnN0LCBrZXkpIDogbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCBpbmRleCBzdW1tYXJ5LCBmaXJzdCBrZXkgYW5kIGxhc3Qga2V5IGZyb20gU3VtbWFyeS5kYiBmaWxlIGlmIGl0IGV4aXN0cy4KKyAgICAgKiA8cD4KKyAgICAgKiBpZiBsb2FkZWQgaW5kZXggc3VtbWFyeSBoYXMgZGlmZmVyZW50IGluZGV4IGludGVydmFsIGZyb20gY3VycmVudCB2YWx1ZSBzdG9yZWQgaW4gc2NoZW1hLAorICAgICAqIHRoZW4gU3VtbWFyeS5kYiBmaWxlIHdpbGwgYmUgZGVsZXRlZCBhbmQgbmVlZCB0byBiZSByZWJ1aWx0LgorICAgICAqLworICAgIHByaXZhdGUgSW5kZXhTdW1tYXJ5Q29tcG9uZW50IGxvYWRTdW1tYXJ5KCkKKyAgICB7CisgICAgICAgIEluZGV4U3VtbWFyeUNvbXBvbmVudCBzdW1tYXJ5Q29tcG9uZW50ID0gbnVsbDsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudHMuU1VNTUFSWSkpCisgICAgICAgICAgICAgICAgc3VtbWFyeUNvbXBvbmVudCA9IEluZGV4U3VtbWFyeUNvbXBvbmVudC5sb2FkT3JEZWxldGVDb3JydXB0ZWQoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1VNTUFSWSksIHRhYmxlTWV0YWRhdGFSZWYuZ2V0KCkpOworCisgICAgICAgICAgICBpZiAoc3VtbWFyeUNvbXBvbmVudCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiSW5kZXggc3VtbWFyeSBmaWxlIGlzIG1pc3Npbmc6IHt9IiwgZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1VNTUFSWSkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJJbmRleCBzdW1tYXJ5IGZpbGUgaXMgY29ycnVwdGVkOiAiICsgZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1VNTUFSWSksIGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdW1tYXJ5Q29tcG9uZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gQW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBrZXlzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gaW5kZXggZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBlc3RpbWF0ZVJvd3NGcm9tSW5kZXgoRmlsZUhhbmRsZSBpbmRleEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGluZGV4RmlsZSk7CisKKyAgICAgICAgdHJ5IChSYW5kb21BY2Nlc3NSZWFkZXIgaW5kZXhSZWFkZXIgPSBpbmRleEZpbGUuY3JlYXRlUmVhZGVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNvbGxlY3Qgc2l6ZXMgZm9yIHRoZSBmaXJzdCAxMDAwMCBrZXlzLCBvciBmaXJzdCAxMCBtZWJpYnl0ZXMgb2YgZGF0YQorICAgICAgICAgICAgZmluYWwgaW50IHNhbXBsZXNDYXAgPSAxMDAwMDsKKyAgICAgICAgICAgIGZpbmFsIGludCBieXRlc0NhcCA9IChpbnQpIE1hdGgubWluKDEwMDAwMDAwLCBpbmRleFJlYWRlci5sZW5ndGgoKSk7CisgICAgICAgICAgICBpbnQga2V5cyA9IDA7CisgICAgICAgICAgICB3aGlsZSAoaW5kZXhSZWFkZXIuZ2V0RmlsZVBvaW50ZXIoKSA8IGJ5dGVzQ2FwICYmIGtleXMgPCBzYW1wbGVzQ2FwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLnNraXBTaG9ydExlbmd0aChpbmRleFJlYWRlcik7CisgICAgICAgICAgICAgICAgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyLnNraXAoaW5kZXhSZWFkZXIsIGRlc2NyaXB0b3IudmVyc2lvbik7CisgICAgICAgICAgICAgICAga2V5cysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0IGtleXMgPiAwICYmIGluZGV4UmVhZGVyLmdldEZpbGVQb2ludGVyKCkgPiAwICYmIGluZGV4UmVhZGVyLmxlbmd0aCgpID4gMCA6ICJVbmV4cGVjdGVkIGVtcHR5IGluZGV4IGZpbGU6ICIgKyBpbmRleFJlYWRlcjsKKyAgICAgICAgICAgIGxvbmcgZXN0aW1hdGVkUm93cyA9IGluZGV4UmVhZGVyLmxlbmd0aCgpIC8gKGluZGV4UmVhZGVyLmdldEZpbGVQb2ludGVyKCkgLyBrZXlzKTsKKyAgICAgICAgICAgIGluZGV4UmVhZGVyLnNlZWsoMCk7CisgICAgICAgICAgICByZXR1cm4gZXN0aW1hdGVkUm93czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRmlsZUhhbmRsZS5CdWlsZGVyIGluZGV4RmlsZUJ1aWxkZXIoSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSkKKyAgICB7CisgICAgICAgIGFzc2VydCB0aGlzLmluZGV4RmlsZUJ1aWxkZXIgPT0gbnVsbCB8fCB0aGlzLmluZGV4RmlsZUJ1aWxkZXIuZmlsZS5lcXVhbHMoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCkpOworCisgICAgICAgIGxvbmcgaW5kZXhGaWxlTGVuZ3RoID0gZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCkubGVuZ3RoKCk7CisgICAgICAgIE9wdGlvbmFsSW50IGluZGV4QnVmZmVyU2l6ZSA9IGluZGV4U3VtbWFyeSAhPSBudWxsID8gT3B0aW9uYWxJbnQub2YoaW9PcHRpb25zLmRpc2tPcHRpbWl6YXRpb25TdHJhdGVneS5idWZmZXJTaXplKGluZGV4RmlsZUxlbmd0aCAvIGluZGV4U3VtbWFyeS5zaXplKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE9wdGlvbmFsSW50LmVtcHR5KCk7CisKKyAgICAgICAgaWYgKGluZGV4RmlsZUJ1aWxkZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIGluZGV4RmlsZUJ1aWxkZXIgPSBJbmRleENvbXBvbmVudC5maWxlQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5QUklNQVJZX0lOREVYKSwgaW9PcHRpb25zLCBjaHVua0NhY2hlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclNpemUoaW5kZXhCdWZmZXJTaXplLm9yRWxzZShEaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3kuTUFYX0JVRkZFUl9TSVpFKSk7CisKKyAgICAgICAgaW5kZXhCdWZmZXJTaXplLmlmUHJlc2VudChpbmRleEZpbGVCdWlsZGVyOjpidWZmZXJTaXplKTsKKworICAgICAgICByZXR1cm4gaW5kZXhGaWxlQnVpbGRlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVLZXlSZWFkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZUtleVJlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YzRlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVLZXlSZWFkZXIuamF2YQpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uY29uY3VycmVudC5Ob3RUaHJlYWRTYWZlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5LZXlSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLlJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOworCitATm90VGhyZWFkU2FmZQorcHVibGljIGNsYXNzIEJpZ1RhYmxlS2V5UmVhZGVyIGltcGxlbWVudHMgS2V5UmVhZGVyCit7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlSGFuZGxlIGluZGV4RmlsZTsKKyAgICBwcml2YXRlIGZpbmFsIFJhbmRvbUFjY2Vzc1JlYWRlciBpbmRleEZpbGVSZWFkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBJbmRleFNlcmlhbGl6ZXIgcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGluaXRpYWxQb3NpdGlvbjsKKworICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBrZXk7CisgICAgcHJpdmF0ZSBsb25nIGRhdGFQb3NpdGlvbjsKKyAgICBwcml2YXRlIGxvbmcga2V5UG9zaXRpb247CisKKyAgICBwcml2YXRlIEJpZ1RhYmxlS2V5UmVhZGVyKEZpbGVIYW5kbGUgaW5kZXhGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIGluZGV4RmlsZVJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4U2VyaWFsaXplciByb3dJbmRleEVudHJ5U2VyaWFsaXplcikKKyAgICB7CisgICAgICAgIHRoaXMuaW5kZXhGaWxlID0gaW5kZXhGaWxlOworICAgICAgICB0aGlzLmluZGV4RmlsZVJlYWRlciA9IGluZGV4RmlsZVJlYWRlcjsKKyAgICAgICAgdGhpcy5yb3dJbmRleEVudHJ5U2VyaWFsaXplciA9IHJvd0luZGV4RW50cnlTZXJpYWxpemVyOworICAgICAgICB0aGlzLmluaXRpYWxQb3NpdGlvbiA9IGluZGV4RmlsZVJlYWRlci5nZXRGaWxlUG9pbnRlcigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQmlnVGFibGVLZXlSZWFkZXIgY3JlYXRlKFJhbmRvbUFjY2Vzc1JlYWRlciBpbmRleEZpbGVSZWFkZXIsIEluZGV4U2VyaWFsaXplciBzZXJpYWxpemVyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEJpZ1RhYmxlS2V5UmVhZGVyIGl0ZXJhdG9yID0gbmV3IEJpZ1RhYmxlS2V5UmVhZGVyKG51bGwsIGluZGV4RmlsZVJlYWRlciwgc2VyaWFsaXplcik7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpdGVyYXRvci5hZHZhbmNlKCk7CisgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIHwgUnVudGltZUV4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgaXRlcmF0b3IuY2xvc2UoKTsKKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmVzb3VyY2UiIH0pCisgICAgcHVibGljIHN0YXRpYyBCaWdUYWJsZUtleVJlYWRlciBjcmVhdGUoRmlsZUhhbmRsZSBpbmRleEZpbGUsIEluZGV4U2VyaWFsaXplciBzZXJpYWxpemVyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEZpbGVIYW5kbGUgaUZpbGUgPSBudWxsOworICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgQmlnVGFibGVLZXlSZWFkZXIgaXRlcmF0b3IgPSBudWxsOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaUZpbGUgPSBpbmRleEZpbGUuc2hhcmVkQ29weSgpOworICAgICAgICAgICAgcmVhZGVyID0gaUZpbGUuY3JlYXRlUmVhZGVyKCk7CisgICAgICAgICAgICBpdGVyYXRvciA9IG5ldyBCaWdUYWJsZUtleVJlYWRlcihpRmlsZSwgcmVhZGVyLCBzZXJpYWxpemVyKTsKKyAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gfCBSdW50aW1lRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXRlcmF0b3IgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpdGVyYXRvci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRocm93YWJsZXMuY2xvc2VOb25OdWxsQW5kQWRkU3VwcHJlc3NlZChleCwgcmVhZGVyLCBpRmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIGtleSA9IG51bGw7CisgICAgICAgIGRhdGFQb3NpdGlvbiA9IC0xOworICAgICAgICBrZXlQb3NpdGlvbiA9IC0xOworICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGluZGV4RmlsZVJlYWRlcik7CisgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkoaW5kZXhGaWxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBhZHZhbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoIWluZGV4RmlsZVJlYWRlci5pc0VPRigpKQorICAgICAgICB7CisgICAgICAgICAgICBrZXlQb3NpdGlvbiA9IGluZGV4RmlsZVJlYWRlci5nZXRGaWxlUG9pbnRlcigpOworICAgICAgICAgICAga2V5ID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbmRleEZpbGVSZWFkZXIpOworICAgICAgICAgICAgZGF0YVBvc2l0aW9uID0gcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuZGVzZXJpYWxpemVQb3NpdGlvbkFuZFNraXAoaW5kZXhGaWxlUmVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAga2V5UG9zaXRpb24gPSAtMTsKKyAgICAgICAgICAgIGRhdGFQb3NpdGlvbiA9IC0xOworICAgICAgICAgICAga2V5ID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRXhoYXVzdGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBrZXkgPT0gbnVsbCAmJiBkYXRhUG9zaXRpb24gPCAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGtleSgpCisgICAgeworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGtleVBvc2l0aW9uRm9yU2Vjb25kYXJ5SW5kZXgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGtleVBvc2l0aW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGRhdGFQb3NpdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gZGF0YVBvc2l0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGluZGV4UG9zaXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGluZGV4RmlsZVJlYWRlci5nZXRGaWxlUG9pbnRlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGluZGV4UG9zaXRpb24obG9uZyBwb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAocG9zaXRpb24gPiBpbmRleExlbmd0aCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIlRoZSByZXF1ZXN0ZWQgcG9zaXRpb24gZXhjZWVkcyB0aGUgaW5kZXggbGVuZ3RoIik7CisgICAgICAgIGluZGV4RmlsZVJlYWRlci5zZWVrKHBvc2l0aW9uKTsKKyAgICAgICAga2V5ID0gbnVsbDsKKyAgICAgICAga2V5UG9zaXRpb24gPSAwOworICAgICAgICBkYXRhUG9zaXRpb24gPSAwOworICAgICAgICBhZHZhbmNlKCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgaW5kZXhMZW5ndGgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGluZGV4RmlsZVJlYWRlci5sZW5ndGgoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW5kZXhGaWxlUmVhZGVyLnNlZWsoaW5pdGlhbFBvc2l0aW9uKTsKKyAgICAgICAga2V5ID0gbnVsbDsKKyAgICAgICAga2V5UG9zaXRpb24gPSAwOworICAgICAgICBkYXRhUG9zaXRpb24gPSAwOworICAgICAgICBhZHZhbmNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiQmlnVGFibGUtUGFydGl0aW9uSW5kZXhJdGVyYXRvciglcykiLCBpbmRleEZpbGUucGF0aCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVSZWFkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVJlYWRlci5qYXZhCmluZGV4IGUwZWRkN2EuLjA5ODRjYzkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVJlYWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVJlYWRlci5qYXZhCkBAIC0xOSw0MiArMTksMTEwIEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXJCdWlsZGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbHVtbml0ZXJhdG9yLlNTVGFibGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb2x1bW5pdGVyYXRvci5TU1RhYmxlUmV2ZXJzZWRJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQm91bmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGF0YVJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2VzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3dzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3JzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRvd25zYW1wbGluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklWZXJpZmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4SW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLktleVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyLlNlbGVjdGlvblJlYXNvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2VsZWN0aW9uUmVhc29uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXJXaXRoRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5QnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5rZXljYWNoZS5LZXlDYWNoZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFjaW5nLlRyYWNpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLklGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlNoYXJlZENsb3NlYWJsZS5zaGFyZWRDb3B5T3JOdWxsOwogCiAvKioKICAqIFNTVGFibGVSZWFkZXJzIGFyZSBvcGVuKCllZCBieSBLZXlzcGFjZS5vblN0YXJ0OyBhZnRlciB0aGF0IHRoZXkgYXJlIGNyZWF0ZWQgYnkgU1NUYWJsZVdyaXRlci5yZW5hbWVBbmRPcGVuLgogICogRG8gbm90IHJlLWNhbGwgb3BlbigpIG9uIGV4aXN0aW5nIFNTVGFibGUgZmlsZXM7IHVzZSB0aGUgcmVmZXJlbmNlcyBrZXB0IGJ5IENvbHVtbkZhbWlseVN0b3JlIHBvc3Qtc3RhcnQgaW5zdGVhZC4KICAqLwotcHVibGljIGNsYXNzIEJpZ1RhYmxlUmVhZGVyIGV4dGVuZHMgU1NUYWJsZVJlYWRlcgorcHVibGljIGNsYXNzIEJpZ1RhYmxlUmVhZGVyIGV4dGVuZHMgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIgaW1wbGVtZW50cyBJbmRleFN1bW1hcnlTdXBwb3J0PEJpZ1RhYmxlUmVhZGVyPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5Q2FjaGVTdXBwb3J0PEJpZ1RhYmxlUmVhZGVyPgogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihCaWdUYWJsZVJlYWRlci5jbGFzcyk7CiAKLSAgICBCaWdUYWJsZVJlYWRlcihTU1RhYmxlUmVhZGVyQnVpbGRlciBidWlsZGVyKQorICAgIHByaXZhdGUgZmluYWwgUm93SW5kZXhFbnRyeS5JbmRleFNlcmlhbGl6ZXIgcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBJbmRleFN1bW1hcnkgaW5kZXhTdW1tYXJ5OworICAgIHByaXZhdGUgZmluYWwgRmlsZUhhbmRsZSBpZmlsZTsKKworICAgIHByaXZhdGUgZmluYWwgS2V5Q2FjaGUga2V5Q2FjaGU7CisKKyAgICBwdWJsaWMgQmlnVGFibGVSZWFkZXIoQnVpbGRlciBidWlsZGVyLCBTU1RhYmxlLk93bmVyIG93bmVyKQogICAgIHsKLSAgICAgICAgc3VwZXIoYnVpbGRlcik7CisgICAgICAgIHN1cGVyKGJ1aWxkZXIsIG93bmVyKTsKKyAgICAgICAgdGhpcy5pZmlsZSA9IGJ1aWxkZXIuZ2V0SW5kZXhGaWxlKCk7CisgICAgICAgIHRoaXMuaW5kZXhTdW1tYXJ5ID0gYnVpbGRlci5nZXRJbmRleFN1bW1hcnkoKTsKKyAgICAgICAgdGhpcy5yb3dJbmRleEVudHJ5U2VyaWFsaXplciA9IG5ldyBSb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIoZGVzY3JpcHRvci52ZXJzaW9uLCBoZWFkZXIsIG93bmVyICE9IG51bGwgPyBvd25lci5nZXRNZXRyaWNzKCkgOiBudWxsKTsKKyAgICAgICAgdGhpcy5rZXlDYWNoZSA9IE9iamVjdHMucmVxdWlyZU5vbk51bGwoYnVpbGRlci5nZXRLZXlDYWNoZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgTGlzdDxBdXRvQ2xvc2VhYmxlPiBzZXR1cEluc3RhbmNlKGJvb2xlYW4gdHJhY2tIb3RuZXNzKQorICAgIHsKKyAgICAgICAgQXJyYXlMaXN0PEF1dG9DbG9zZWFibGU+IGNsb3NlYWJsZXMgPSBMaXN0cy5uZXdBcnJheUxpc3QoaW5kZXhTdW1tYXJ5LCBpZmlsZSk7CisgICAgICAgIGNsb3NlYWJsZXMuYWRkQWxsKHN1cGVyLnNldHVwSW5zdGFuY2UodHJhY2tIb3RuZXNzKSk7CisgICAgICAgIHJldHVybiBjbG9zZWFibGVzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VJbk1lbW9yeUNvbXBvbmVudHMoKQorICAgIHsKKyAgICAgICAgY2xvc2VJbnRlcm5hbENvbXBvbmVudChpbmRleFN1bW1hcnkpOworICAgICAgICBhc3NlcnQgaW5kZXhTdW1tYXJ5LmlzQ2xlYW5lZFVwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEluZGV4U3VtbWFyeSBnZXRJbmRleFN1bW1hcnkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGluZGV4U3VtbWFyeTsKICAgICB9CiAKICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd0l0ZXJhdG9yKERlY29yYXRlZEtleSBrZXksCkBAIC02MywxOCArMTMxLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJldmVyc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCiAgICAgewotICAgICAgICBSb3dJbmRleEVudHJ5IHJpZSA9IGdldFBvc2l0aW9uKGtleSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSwgbGlzdGVuZXIpOworICAgICAgICBSb3dJbmRleEVudHJ5IHJpZSA9IGdldFJvd0luZGV4RW50cnkoa2V5LCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRLCB0cnVlLCBsaXN0ZW5lcik7CiAgICAgICAgIHJldHVybiByb3dJdGVyYXRvcihudWxsLCBrZXksIHJpZSwgc2xpY2VzLCBzZWxlY3RlZENvbHVtbnMsIHJldmVyc2VkKTsKICAgICB9CiAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3Igcm93SXRlcmF0b3IoRmlsZURhdGFJbnB1dCBmaWxlLCBEZWNvcmF0ZWRLZXkga2V5LCBSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIFNsaWNlcyBzbGljZXMsIENvbHVtbkZpbHRlciBzZWxlY3RlZENvbHVtbnMsIGJvb2xlYW4gcmV2ZXJzZWQpCiAgICAgewogICAgICAgICBpZiAoaW5kZXhFbnRyeSA9PSBudWxsKQogICAgICAgICAgICAgcmV0dXJuIFVuZmlsdGVyZWRSb3dJdGVyYXRvcnMubm9Sb3dzSXRlcmF0b3IobWV0YWRhdGEoKSwga2V5LCBSb3dzLkVNUFRZX1NUQVRJQ19ST1csIERlbGV0aW9uVGltZS5MSVZFLCByZXZlcnNlZCk7Ci0gICAgICAgIHJldHVybiByZXZlcnNlZAotICAgICAgICAgICAgID8gbmV3IFNTVGFibGVSZXZlcnNlZEl0ZXJhdG9yKHRoaXMsIGZpbGUsIGtleSwgaW5kZXhFbnRyeSwgc2xpY2VzLCBzZWxlY3RlZENvbHVtbnMsIGlmaWxlKQotICAgICAgICAgICAgIDogbmV3IFNTVGFibGVJdGVyYXRvcih0aGlzLCBmaWxlLCBrZXksIGluZGV4RW50cnksIHNsaWNlcywgc2VsZWN0ZWRDb2x1bW5zLCBpZmlsZSk7CisgICAgICAgIGVsc2UgaWYgKHJldmVyc2VkKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTU1RhYmxlUmV2ZXJzZWRJdGVyYXRvcih0aGlzLCBmaWxlLCBrZXksIGluZGV4RW50cnksIHNsaWNlcywgc2VsZWN0ZWRDb2x1bW5zLCBpZmlsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgU1NUYWJsZUl0ZXJhdG9yKHRoaXMsIGZpbGUsIGtleSwgaW5kZXhFbnRyeSwgc2xpY2VzLCBzZWxlY3RlZENvbHVtbnMsIGlmaWxlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTgzLDYgKzE1MSwxMiBAQAogICAgICAgICByZXR1cm4gQmlnVGFibGVTY2FubmVyLmdldFNjYW5uZXIodGhpcywgY29sdW1ucywgZGF0YVJhbmdlLCBsaXN0ZW5lcik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEtleVJlYWRlciBrZXlSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBCaWdUYWJsZUtleVJlYWRlci5jcmVhdGUoaWZpbGUsIHJvd0luZGV4RW50cnlTZXJpYWxpemVyKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBEaXJlY3QgSS9PIFNTVGFibGVTY2FubmVyIG92ZXIgYW4gaXRlcmF0b3Igb2YgYm91bmRzLgogICAgICAqCkBAIC0xMTgsOTcgKzE5MiwxMzMgQEAKICAgICAgICAgICAgIHJldHVybiBnZXRTY2FubmVyKCk7CiAgICAgfQogCi0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBjYWxsZXIgdG8gY2xvc2UKKyAgICAvKioKKyAgICAgKiBGaW5kcyBhbmQgcmV0dXJucyB0aGUgZmlyc3Qga2V5IGJleW9uZCBhIGdpdmVuIHRva2VuIGluIHRoaXMgU1NUYWJsZSBvciBudWxsIGlmIG5vIHN1Y2gga2V5IGV4aXN0cy4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHNpbXBsZUl0ZXJhdG9yKEZpbGVEYXRhSW5wdXQgZGZpbGUsIERlY29yYXRlZEtleSBrZXksIFJvd0luZGV4RW50cnkgcG9zaXRpb24sIGJvb2xlYW4gdG9tYnN0b25lT25seSkKKyAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IGZpcnN0S2V5QmV5b25kKFBhcnRpdGlvblBvc2l0aW9uIHRva2VuKQogICAgIHsKLSAgICAgICAgcmV0dXJuIFNTVGFibGVJZGVudGl0eUl0ZXJhdG9yLmNyZWF0ZSh0aGlzLCBkZmlsZSwgcG9zaXRpb24sIGtleSwgdG9tYnN0b25lT25seSk7CisgICAgICAgIGlmICh0b2tlbi5jb21wYXJlVG8oZmlyc3QpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBmaXJzdDsKKworICAgICAgICBsb25nIHNhbXBsZWRQb3NpdGlvbiA9IGdldEluZGV4U2NhblBvc2l0aW9uKHRva2VuKTsKKworICAgICAgICBpZiAoaWZpbGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAgICAgdHJ5IChGaWxlRGF0YUlucHV0IGluID0gaWZpbGUuY3JlYXRlUmVhZGVyKHNhbXBsZWRQb3NpdGlvbikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhdGggPSBpbi5nZXRQYXRoKCk7CisgICAgICAgICAgICB3aGlsZSAoIWluLmlzRU9GKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbmRleEtleSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW4pOworICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBpbmRleERlY29yYXRlZEtleSA9IGRlY29yYXRlS2V5KGluZGV4S2V5KTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXhEZWNvcmF0ZWRLZXkuY29tcGFyZVRvKHRva2VuKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleERlY29yYXRlZEtleTsKKworICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkuU2VyaWFsaXplci5za2lwKGluLCBkZXNjcmlwdG9yLnZlcnNpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBtYXJrU3VzcGVjdCgpOworICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIHBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBwb3NpdGlvbiB3aGlsZSB1cGRhdGluZyB0aGUga2V5IGNhY2hlIGFuZCB0aGUgc3RhdHMuCisgICAgICoKICAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gYXBwbHkgYXMgdGhlIHJocyB0byB0aGUgZ2l2ZW4gT3BlcmF0b3IuIEEgJ2Zha2UnIGtleSBpcyBhbGxvd2VkIHRvCi0gICAgICogYWxsb3cga2V5IHNlbGVjdGlvbiBieSB0b2tlbiBib3VuZHMgYnV0IG9ubHkgaWYgb3AgIT0gKiBFUQotICAgICAqIEBwYXJhbSBvcCBUaGUgT3BlcmF0b3IgZGVmaW5pbmcgbWF0Y2hpbmcga2V5czogdGhlIG5lYXJlc3Qga2V5IHRvIHRoZSB0YXJnZXQgbWF0Y2hpbmcgdGhlIG9wZXJhdG9yIHdpbnMuCi0gICAgICogQHBhcmFtIHVwZGF0ZUNhY2hlQW5kU3RhdHMgdHJ1ZSBpZiB1cGRhdGluZyBzdGF0cyBhbmQgY2FjaGUKKyAgICAgKiAgICAgICAgICAgIGFsbG93IGtleSBzZWxlY3Rpb24gYnkgdG9rZW4gYm91bmRzIGJ1dCBvbmx5IGlmIG9wICE9ICogRVEKKyAgICAgKiBAcGFyYW0gb3AgIFRoZSBPcGVyYXRvciBkZWZpbmluZyBtYXRjaGluZyBrZXlzOiB0aGUgbmVhcmVzdCBrZXkgdG8gdGhlIHRhcmdldCBtYXRjaGluZyB0aGUgb3BlcmF0b3Igd2lucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUm93SW5kZXhFbnRyeSBnZXRSb3dJbmRleEVudHJ5KFBhcnRpdGlvblBvc2l0aW9uIGtleSwgT3BlcmF0b3Igb3ApCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Um93SW5kZXhFbnRyeShrZXksIG9wLCB0cnVlLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5OT09QX0xJU1RFTkVSKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgVGhlIGtleSB0byBhcHBseSBhcyB0aGUgcmhzIHRvIHRoZSBnaXZlbiBPcGVyYXRvci4gQSAnZmFrZScga2V5IGlzIGFsbG93ZWQgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgYWxsb3cga2V5IHNlbGVjdGlvbiBieSB0b2tlbiBib3VuZHMgYnV0IG9ubHkgaWYgb3AgIT0gKiBFUQorICAgICAqIEBwYXJhbSBvcGVyYXRvciAgICBUaGUgT3BlcmF0b3IgZGVmaW5pbmcgbWF0Y2hpbmcga2V5czogdGhlIG5lYXJlc3Qga2V5IHRvIHRoZSB0YXJnZXQgbWF0Y2hpbmcgdGhlIG9wZXJhdG9yIHdpbnMuCisgICAgICogQHBhcmFtIHVwZGF0ZVN0YXRzIHRydWUgaWYgdXBkYXRpbmcgc3RhdHMgYW5kIGNhY2hlCiAgICAgICogQHJldHVybiBUaGUgaW5kZXggZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGUga2V5LCBvciBudWxsIGlmIHRoZSBrZXkgaXMgbm90IHByZXNlbnQKICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgUm93SW5kZXhFbnRyeSBnZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3Igb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1cGRhdGVDYWNoZUFuZFN0YXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcGVybWl0TWF0Y2hQYXN0TGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUm93SW5kZXhFbnRyeSBnZXRSb3dJbmRleEVudHJ5KFBhcnRpdGlvblBvc2l0aW9uIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yIG9wZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1cGRhdGVTdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQogICAgIHsKICAgICAgICAgLy8gSGF2aW5nIG5vIGluZGV4IGZpbGUgaXMgaW1wb3NzaWJsZSBpbiBhIG5vcm1hbCBvcGVyYXRpb24uIFRoZSBvbmx5IHdheSBpdCBtaWdodCBoYXBwZW4gaXMgcnVubmluZwotICAgICAgICAvLyBTY3J1YmJlciB0aGF0IGRvZXMgbm90IHJlYWxseSByZWx5IG9udG8gdGhpcyBtZXRob2QuCisgICAgICAgIC8vIFNjcnViYmVyIHRoYXQgZG9lcyBub3QgcmVhbGx5IHJlbHkgb24gdGhpcyBtZXRob2QuCiAgICAgICAgIGlmIChpZmlsZSA9PSBudWxsKQotICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQogCi0gICAgICAgIGlmIChvcCA9PSBPcGVyYXRvci5FUSkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGtleSBpbnN0YW5jZW9mIERlY29yYXRlZEtleTsgLy8gRVEgb25seSBtYWtlIHNlbnNlIGlmIHRoZSBrZXkgaXMgYSB2YWxpZCByb3cga2V5Ci0gICAgICAgICAgICBpZiAoIWJmLmlzUHJlc2VudCgoRGVjb3JhdGVkS2V5KWtleSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXIub25TU1RhYmxlU2tpcHBlZCh0aGlzLCBTa2lwcGluZ1JlYXNvbi5CTE9PTV9GSUxURVIpOwotICAgICAgICAgICAgICAgIFRyYWNpbmcudHJhY2UoIkJsb29tIGZpbHRlciBhbGxvd3Mgc2tpcHBpbmcgc3N0YWJsZSB7fSIsIGRlc2NyaXB0b3IuaWQpOwotICAgICAgICAgICAgICAgIGJsb29tRmlsdGVyVHJhY2tlci5hZGRUcnVlTmVnYXRpdmUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIG5leHQsIHRoZSBrZXkgY2FjaGUgKG9ubHkgbWFrZSBzZW5zZSBmb3IgdmFsaWQgcm93IGtleSkKLSAgICAgICAgaWYgKChvcCA9PSBPcGVyYXRvci5FUSB8fCBvcCA9PSBPcGVyYXRvci5HRSkgJiYgKGtleSBpbnN0YW5jZW9mIERlY29yYXRlZEtleSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlY29yYXRlZEtleSBkZWNvcmF0ZWRLZXkgPSAoRGVjb3JhdGVkS2V5KSBrZXk7Ci0gICAgICAgICAgICBSb3dJbmRleEVudHJ5IGNhY2hlZFBvc2l0aW9uID0gZ2V0Q2FjaGVkUG9zaXRpb24oZGVjb3JhdGVkS2V5LCB1cGRhdGVDYWNoZUFuZFN0YXRzKTsKLSAgICAgICAgICAgIGlmIChjYWNoZWRQb3NpdGlvbiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBuZWVkIHRvIHRyYWNrICJ0cnVlIHBvc2l0aXZlIiBmb3IgQmxvb20gRmlsdGVyIGhlcmUgYmVjYXVzZSBpdCBoYXMgYmVlbiBhbHJlYWR5IHRyYWNrZWQKLSAgICAgICAgICAgICAgICAvLyBpbnNpZGUgZ2V0Q2FjaGVkUG9zaXRpb24gbWV0aG9kCi0gICAgICAgICAgICAgICAgbGlzdGVuZXIub25TU1RhYmxlU2VsZWN0ZWQodGhpcywgY2FjaGVkUG9zaXRpb24sIFNlbGVjdGlvblJlYXNvbi5LRVlfQ0FDSEVfSElUKTsKLSAgICAgICAgICAgICAgICBUcmFjaW5nLnRyYWNlKCJLZXkgY2FjaGUgaGl0IGZvciBzc3RhYmxlIHt9IiwgZGVzY3JpcHRvci5pZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFBvc2l0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIE9wZXJhdG9yIHNlYXJjaE9wID0gb3BlcmF0b3I7CiAKICAgICAgICAgLy8gY2hlY2sgdGhlIHNtYWxsZXN0IGFuZCBncmVhdGVzdCBrZXlzIGluIHRoZSBzc3RhYmxlIHRvIHNlZSBpZiBpdCBjYW4ndCBiZSBwcmVzZW50CiAgICAgICAgIGJvb2xlYW4gc2tpcCA9IGZhbHNlOwogICAgICAgICBpZiAoa2V5LmNvbXBhcmVUbyhmaXJzdCkgPCAwKQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob3AgPT0gT3BlcmF0b3IuRVEpCisgICAgICAgICAgICBpZiAoc2VhcmNoT3AgPT0gT3BlcmF0b3IuRVEpCisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgc2tpcCA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAga2V5ID0gZmlyc3Q7Ci0KLSAgICAgICAgICAgIG9wID0gT3BlcmF0b3IuRVE7CisgICAgICAgICAgICAgICAgc2VhcmNoT3AgPSBPcGVyYXRvci5HRTsgLy8gc2luY2Ugb3AgIT0gRVEsIGJsb29tIGZpbHRlciB3aWxsIGJlIHNraXBwZWQ7IGZpcnN0IGtleSBpcyBpbmNsdWRlZCBzbyBubyByZWFzb24gdG8gY2hlY2sgYmxvb20gZmlsdGVyCisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICBpbnQgbCA9IGxhc3QuY29tcGFyZVRvKGtleSk7Ci0gICAgICAgICAgICAvLyBsIDw9IDAgID0+IHdlIG1heSBiZSBsb29raW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZTsgd2UgdGhlbiBuYXJyb3cgb3VyIGJlaGF2aW91ciB0bzoKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgIDEpIHNraXBwaW5nIGlmIHN0cmljdGx5IGdyZWF0ZXIgZm9yIEdFIGFuZCBFUTsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgIDIpIHNraXBwaW5nIGlmIGVxdWFsIGFuZCBzZWFyY2hpbmcgR1QsIGFuZCB3ZSBhcmVuJ3QgcGVybWl0dGluZyBtYXRjaGluZyBwYXN0IGxhc3QKLSAgICAgICAgICAgIHNraXAgPSBsIDw9IDAgJiYgKGwgPCAwIHx8ICghcGVybWl0TWF0Y2hQYXN0TGFzdCAmJiBvcCA9PSBPcGVyYXRvci5HVCkpOworICAgICAgICAgICAgc2tpcCA9IGwgPCAwIC8vIG91dCBvZiByYW5nZSwgc2tpcAorICAgICAgICAgICAgICAgICAgIHx8IGwgPT0gMCAmJiBzZWFyY2hPcCA9PSBPcGVyYXRvci5HVDsgLy8gc2VhcmNoIGVudHJ5ID4ga2V5LCBidXQga2V5IGlzIHRoZSBsYXN0IGluIHJhbmdlLCBzbyBza2lwCisgICAgICAgICAgICBpZiAobCA9PSAwKQorICAgICAgICAgICAgICAgIHNlYXJjaE9wID0gT3BlcmF0b3IuR0U7IC8vIHNpbmNlIG9wICE9IEVRLCBibG9vbSBmaWx0ZXIgd2lsbCBiZSBza2lwcGVkLCBsYXN0IGtleSBpcyBpbmNsdWRlZCBzbyBubyByZWFzb24gdG8gY2hlY2sgYmxvb20gZmlsdGVyCiAgICAgICAgIH0KICAgICAgICAgaWYgKHNraXApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvcCA9PSBPcGVyYXRvci5FUSAmJiB1cGRhdGVDYWNoZUFuZFN0YXRzKQotICAgICAgICAgICAgICAgIGJsb29tRmlsdGVyVHJhY2tlci5hZGRGYWxzZVBvc2l0aXZlKCk7Ci0gICAgICAgICAgICBsaXN0ZW5lci5vblNTVGFibGVTa2lwcGVkKHRoaXMsIFNraXBwaW5nUmVhc29uLk1JTl9NQVhfS0VZUyk7Ci0gICAgICAgICAgICBUcmFjaW5nLnRyYWNlKCJDaGVjayBhZ2FpbnN0IG1pbiBhbmQgbWF4IGtleXMgYWxsb3dzIHNraXBwaW5nIHNzdGFibGUge30iLCBkZXNjcmlwdG9yLmlkKTsKKyAgICAgICAgICAgIG5vdGlmeVNraXBwZWQoU2tpcHBpbmdSZWFzb24uTUlOX01BWF9LRVlTLCBsaXN0ZW5lciwgb3BlcmF0b3IsIHVwZGF0ZVN0YXRzKTsKICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKHNlYXJjaE9wID09IE9wZXJhdG9yLkVRKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQga2V5IGluc3RhbmNlb2YgRGVjb3JhdGVkS2V5OyAvLyBFUSBvbmx5IG1ha2Ugc2Vuc2UgaWYgdGhlIGtleSBpcyBhIHZhbGlkIHJvdyBrZXkKKyAgICAgICAgICAgIGlmICghaXNQcmVzZW50SW5GaWx0ZXIoKElGaWx0ZXIuRmlsdGVyS2V5KSBrZXkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5vdGlmeVNraXBwZWQoU2tpcHBpbmdSZWFzb24uQkxPT01fRklMVEVSLCBsaXN0ZW5lciwgb3BlcmF0b3IsIHVwZGF0ZVN0YXRzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG5leHQsIHRoZSBrZXkgY2FjaGUgKG9ubHkgbWFrZSBzZW5zZSBmb3IgdmFsaWQgcm93IGtleSkKKyAgICAgICAgaWYgKChzZWFyY2hPcCA9PSBPcGVyYXRvci5FUSB8fCBzZWFyY2hPcCA9PSBPcGVyYXRvci5HRSkgJiYgKGtleSBpbnN0YW5jZW9mIERlY29yYXRlZEtleSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIERlY29yYXRlZEtleSBkZWNvcmF0ZWRLZXkgPSAoRGVjb3JhdGVkS2V5KSBrZXk7CisgICAgICAgICAgICBBYnN0cmFjdFJvd0luZGV4RW50cnkgY2FjaGVkUG9zaXRpb24gPSBnZXRDYWNoZWRQb3NpdGlvbihkZWNvcmF0ZWRLZXksIHVwZGF0ZVN0YXRzKTsKKyAgICAgICAgICAgIGlmIChjYWNoZWRQb3NpdGlvbiAhPSBudWxsICYmIGNhY2hlZFBvc2l0aW9uLmdldFNTVGFibGVGb3JtYXQoKSA9PSBkZXNjcmlwdG9yLmdldEZvcm1hdCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5vdGlmeVNlbGVjdGVkKFNlbGVjdGlvblJlYXNvbi5LRVlfQ0FDSEVfSElULCBsaXN0ZW5lciwgb3BlcmF0b3IsIHVwZGF0ZVN0YXRzLCBjYWNoZWRQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIChSb3dJbmRleEVudHJ5KSBjYWNoZWRQb3NpdGlvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGludCBiaW5hcnlTZWFyY2hSZXN1bHQgPSBpbmRleFN1bW1hcnkuYmluYXJ5U2VhcmNoKGtleSk7Ci0gICAgICAgIGxvbmcgc2FtcGxlZFBvc2l0aW9uID0gZ2V0SW5kZXhTY2FuUG9zaXRpb25Gcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGJpbmFyeVNlYXJjaFJlc3VsdCwgaW5kZXhTdW1tYXJ5KTsKLSAgICAgICAgaW50IHNhbXBsZWRJbmRleCA9IGdldEluZGV4U3VtbWFyeUluZGV4RnJvbUJpbmFyeVNlYXJjaFJlc3VsdChiaW5hcnlTZWFyY2hSZXN1bHQpOworICAgICAgICBsb25nIHNhbXBsZWRQb3NpdGlvbiA9IGluZGV4U3VtbWFyeS5nZXRTY2FuUG9zaXRpb25Gcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGJpbmFyeVNlYXJjaFJlc3VsdCk7CisgICAgICAgIGludCBzYW1wbGVkSW5kZXggPSBJbmRleFN1bW1hcnkuZ2V0SW5kZXhGcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGJpbmFyeVNlYXJjaFJlc3VsdCk7CiAKICAgICAgICAgaW50IGVmZmVjdGl2ZUludGVydmFsID0gaW5kZXhTdW1tYXJ5LmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KHNhbXBsZWRJbmRleCk7CiAKICAgICAgICAgLy8gc2NhbiB0aGUgb24tZGlzayBpbmRleCwgc3RhcnRpbmcgYXQgdGhlIG5lYXJlc3Qgc2FtcGxlZCBwb3NpdGlvbi4KLSAgICAgICAgLy8gVGhlIGNoZWNrIGFnYWluc3QgSW5kZXhJbnRlcnZhbCBpcyB0byBiZSBleGl0IHRoZSBsb29wIGluIHRoZSBFUSBjYXNlIHdoZW4gdGhlIGtleSBsb29rZWQgZm9yIGlzIG5vdCBwcmVzZW50CisgICAgICAgIC8vIFRoZSBjaGVjayBhZ2FpbnN0IEluZGV4SW50ZXJ2YWwgaXMgdG8gYmUgZXhpdGVkIHRoZSBsb29wIGluIHRoZSBFUSBjYXNlIHdoZW4gdGhlIGtleSBsb29rZWQgZm9yIGlzIG5vdCBwcmVzZW50CiAgICAgICAgIC8vIChibG9vbSBmaWx0ZXIgZmFsc2UgcG9zaXRpdmUpLiBCdXQgbm90ZSB0aGF0IGZvciBub24tRVEgY2FzZXMsIHdlIG1pZ2h0IG5lZWQgdG8gY2hlY2sgdGhlIGZpcnN0IGtleSBvZiB0aGUKICAgICAgICAgLy8gbmV4dCBpbmRleCBwb3NpdGlvbiBiZWNhdXNlIHRoZSBzZWFyY2hlZCBrZXkgY2FuIGJlIGdyZWF0ZXIgdGhlIGxhc3Qga2V5IG9mIHRoZSBpbmRleCBpbnRlcnZhbCBjaGVja2VkIGlmIGl0CiAgICAgICAgIC8vIGlzIGxlc3NlciB0aGFuIHRoZSBmaXJzdCBrZXkgb2YgbmV4dCBpbnRlcnZhbCAoYW5kIGluIHRoYXQgY2FzZSB3ZSBtdXN0IHJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGtleQpAQCAtMjI4LDcgKzMzOCw3IEBACiAgICAgICAgICAgICAgICAgYm9vbGVhbiBleGFjdE1hdGNoOyAvLyBpcyB0aGUgY3VycmVudCBwb3NpdGlvbiBhbiBleGFjdCBtYXRjaCBmb3IgdGhlIGtleSwgc3VpdGFibGUgZm9yIGNhY2hpbmcKIAogICAgICAgICAgICAgICAgIC8vIENvbXBhcmUgcmF3IGtleXMgaWYgcG9zc2libGUgZm9yIHBlcmZvcm1hbmNlLCBvdGhlcndpc2UgY29tcGFyZSBkZWNvcmF0ZWQga2V5cy4KLSAgICAgICAgICAgICAgICBpZiAob3AgPT0gT3BlcmF0b3IuRVEgJiYgaSA8PSBlZmZlY3RpdmVJbnRlcnZhbCkKKyAgICAgICAgICAgICAgICBpZiAoc2VhcmNoT3AgPT0gT3BlcmF0b3IuRVEgJiYgaSA8PSBlZmZlY3RpdmVJbnRlcnZhbCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG9wU2F0aXNmaWVkID0gZXhhY3RNYXRjaCA9IGluZGV4S2V5LmVxdWFscygoKERlY29yYXRlZEtleSkga2V5KS5nZXRLZXkoKSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjM2LDE1ICszNDYsMTIgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBpbmRleERlY29yYXRlZEtleSA9IGRlY29yYXRlS2V5KGluZGV4S2V5KTsKICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBhcmlzb24gPSBpbmRleERlY29yYXRlZEtleS5jb21wYXJlVG8oa2V5KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHYgPSBvcC5hcHBseShjb21wYXJpc29uKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHYgPSBzZWFyY2hPcC5hcHBseShjb21wYXJpc29uKTsKICAgICAgICAgICAgICAgICAgICAgb3BTYXRpc2ZpZWQgPSAodiA9PSAwKTsKICAgICAgICAgICAgICAgICAgICAgZXhhY3RNYXRjaCA9IChjb21wYXJpc29uID09IDApOwogICAgICAgICAgICAgICAgICAgICBpZiAodiA8IDApCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA9PSBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRICYmIHVwZGF0ZUNhY2hlQW5kU3RhdHMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvb21GaWx0ZXJUcmFja2VyLmFkZEZhbHNlUG9zaXRpdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uU1NUYWJsZVNraXBwZWQodGhpcywgU2tpcHBpbmdSZWFzb24uUEFSVElUSU9OX0lOREVYX0xPT0tVUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUcmFjaW5nLnRyYWNlKCJQYXJ0aXRpb24gaW5kZXggbG9va3VwIGFsbG93cyBza2lwcGluZyBzc3RhYmxlIHt9IiwgZGVzY3JpcHRvci5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlTa2lwcGVkKFNraXBwaW5nUmVhc29uLlBBUlRJVElPTl9JTkRFWF9MT09LVVAsIGxpc3RlbmVyLCBvcGVyYXRvciwgdXBkYXRlU3RhdHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0yNTMsMTAgKzM2MCwxMCBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCBkYXRhIHBvc2l0aW9uIGZyb20gaW5kZXggZW50cnkKICAgICAgICAgICAgICAgICAgICAgUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5ID0gcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4pOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXhhY3RNYXRjaCAmJiB1cGRhdGVDYWNoZUFuZFN0YXRzKQorICAgICAgICAgICAgICAgICAgICBpZiAoZXhhY3RNYXRjaCAmJiB1cGRhdGVTdGF0cykKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGtleSBpbnN0YW5jZW9mIERlY29yYXRlZEtleTsgLy8ga2V5IGNhbiBiZSA9PSB0byB0aGUgaW5kZXgga2V5IG9ubHkgaWYgaXQncyBhIHRydWUgcm93IGtleQotICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGRlY29yYXRlZEtleSA9IChEZWNvcmF0ZWRLZXkpa2V5OworICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGRlY29yYXRlZEtleSA9IChEZWNvcmF0ZWRLZXkpIGtleTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgewpAQCAtMjcyLDEwICszNzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgZXhhY3QgbWF0Y2ggZm9yIHRoZSBrZXkKICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlS2V5KGRlY29yYXRlZEtleSwgaW5kZXhFbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9wID09IE9wZXJhdG9yLkVRICYmIHVwZGF0ZUNhY2hlQW5kU3RhdHMpCi0gICAgICAgICAgICAgICAgICAgICAgICBibG9vbUZpbHRlclRyYWNrZXIuYWRkVHJ1ZVBvc2l0aXZlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uU1NUYWJsZVNlbGVjdGVkKHRoaXMsIGluZGV4RW50cnksIFNlbGVjdGlvblJlYXNvbi5JTkRFWF9FTlRSWV9GT1VORCk7Ci0gICAgICAgICAgICAgICAgICAgIFRyYWNpbmcudHJhY2UoIlBhcnRpdGlvbiBpbmRleCB3aXRoIHt9IGVudHJpZXMgZm91bmQgZm9yIHNzdGFibGUge30iLCBpbmRleEVudHJ5LmNvbHVtbnNJbmRleENvdW50KCksIGRlc2NyaXB0b3IuaWQpOworICAgICAgICAgICAgICAgICAgICBub3RpZnlTZWxlY3RlZChTZWxlY3Rpb25SZWFzb24uSU5ERVhfRU5UUllfRk9VTkQsIGxpc3RlbmVyLCBvcGVyYXRvciwgdXBkYXRlU3RhdHMsIGluZGV4RW50cnkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhFbnRyeTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTI4OCwxMiArMzkyLDM1NCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIHBhdGgpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG9wID09IFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEgJiYgdXBkYXRlQ2FjaGVBbmRTdGF0cykKLSAgICAgICAgICAgIGJsb29tRmlsdGVyVHJhY2tlci5hZGRGYWxzZVBvc2l0aXZlKCk7Ci0gICAgICAgIGxpc3RlbmVyLm9uU1NUYWJsZVNraXBwZWQodGhpcywgU2tpcHBpbmdSZWFzb24uSU5ERVhfRU5UUllfTk9UX0ZPVU5EKTsKLSAgICAgICAgVHJhY2luZy50cmFjZSgiUGFydGl0aW9uIGluZGV4IGxvb2t1cCBjb21wbGV0ZSAoYmxvb20gZmlsdGVyIGZhbHNlIHBvc2l0aXZlKSBmb3Igc3N0YWJsZSB7fSIsIGRlc2NyaXB0b3IuaWQpOworICAgICAgICBub3RpZnlTa2lwcGVkKFNraXBwaW5nUmVhc29uLklOREVYX0VOVFJZX05PVF9GT1VORCwgbGlzdGVuZXIsIG9wZXJhdG9yLCB1cGRhdGVTdGF0cyk7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgICAgIFRoZSBrZXkgdG8gYXBwbHkgYXMgdGhlIHJocyB0byB0aGUgZ2l2ZW4gT3BlcmF0b3IuIEEgJ2Zha2UnIGtleSBpcyBhbGxvd2VkIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3cga2V5IHNlbGVjdGlvbiBieSB0b2tlbiBib3VuZHMgYnV0IG9ubHkgaWYgb3AgIT0gKiBFUQorICAgICAqIEBwYXJhbSBvcCAgICAgICAgICAgICAgICAgIFRoZSBPcGVyYXRvciBkZWZpbmluZyBtYXRjaGluZyBrZXlzOiB0aGUgbmVhcmVzdCBrZXkgdG8gdGhlIHRhcmdldCBtYXRjaGluZyB0aGUgb3BlcmF0b3Igd2lucy4KKyAgICAgKiBAcGFyYW0gdXBkYXRlQ2FjaGVBbmRTdGF0cyB0cnVlIGlmIHVwZGF0aW5nIHN0YXRzIGFuZCBjYWNoZQorICAgICAqIEByZXR1cm4gVGhlIGluZGV4IGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtleSwgb3IgbnVsbCBpZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGxvbmcgZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24ga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXBkYXRlQ2FjaGVBbmRTdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICB7CisgICAgICAgIFJvd0luZGV4RW50cnkgcm93SW5kZXhFbnRyeSA9IGdldFJvd0luZGV4RW50cnkoa2V5LCBvcCwgdXBkYXRlQ2FjaGVBbmRTdGF0cywgbGlzdGVuZXIpOworICAgICAgICByZXR1cm4gcm93SW5kZXhFbnRyeSAhPSBudWxsID8gcm93SW5kZXhFbnRyeS5wb3NpdGlvbiA6IC0xOworICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkga2V5QXRQb3NpdGlvbkZyb21TZWNvbmRhcnlJbmRleChsb25nIGtleVBvc2l0aW9uRnJvbVNlY29uZGFyeUluZGV4KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIERlY29yYXRlZEtleSBrZXk7CisgICAgICAgIHRyeSAoRmlsZURhdGFJbnB1dCBpbiA9IGlmaWxlLmNyZWF0ZVJlYWRlcihrZXlQb3NpdGlvbkZyb21TZWNvbmRhcnlJbmRleCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbi5pc0VPRigpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICBrZXkgPSBkZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluKSk7CisKKyAgICAgICAgICAgIC8vIGhpbnQgcmVhZCBwYXRoIGFib3V0IGtleSBsb2NhdGlvbiBpZiBjYWNoaW5nIGlzIGVuYWJsZWQKKyAgICAgICAgICAgIC8vIHRoaXMgc2F2ZXMgaW5kZXggc3VtbWFyeSBsb29rdXAgYW5kIGluZGV4IGZpbGUgaXRlcmF0aW9uIHdoaWNoIHdob3VsZCBiZSBwcmV0dHkgY29zdGx5CisgICAgICAgICAgICAvLyBlc3BlY2lhbGx5IGluIHByZXNlbmNlIG9mIHByb21vdGVkIGNvbHVtbiBpbmRleGVzCisgICAgICAgICAgICBjYWNoZUtleShrZXksIHJvd0luZGV4RW50cnlTZXJpYWxpemVyLmRlc2VyaWFsaXplKGluKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSb3dJbmRleEVudHJ5IGRlc2VyaWFsaXplS2V5Q2FjaGVWYWx1ZShEYXRhSW5wdXRQbHVzIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiByb3dJbmRleEVudHJ5U2VyaWFsaXplci5kZXNlcmlhbGl6ZUZvckNhY2hlKGlucHV0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2x1c3RlcmluZ0JvdW5kPD8+IGdldExvd2VyQm91bmRQcmVmaXhGcm9tQ2FjaGUoRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSwgYm9vbGVhbiBpc1JldmVyc2VkKQorICAgIHsKKyAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IHJpZSA9IGdldENhY2hlZFBvc2l0aW9uKHBhcnRpdGlvbktleSwgZmFsc2UpOworICAgICAgICBpZiAoIShyaWUgaW5zdGFuY2VvZiBSb3dJbmRleEVudHJ5KSkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIFJvd0luZGV4RW50cnkgcm93SW5kZXhFbnRyeSA9IChSb3dJbmRleEVudHJ5KSByaWU7CisgICAgICAgIGlmICghcm93SW5kZXhFbnRyeS5pbmRleE9uSGVhcCgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgdHJ5IChSb3dJbmRleEVudHJ5LkluZGV4SW5mb1JldHJpZXZlciBvbkhlYXBSZXRyaWV2ZXIgPSByb3dJbmRleEVudHJ5Lm9wZW5XaXRoSW5kZXgobnVsbCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluZGV4SW5mbyBjb2x1bW5zID0gb25IZWFwUmV0cmlldmVyLmNvbHVtbnNJbmRleChpc1JldmVyc2VkID8gcm93SW5kZXhFbnRyeS5ibG9ja0NvdW50KCkgLSAxIDogMCk7CisgICAgICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gYm91bmQgPSBpc1JldmVyc2VkID8gY29sdW1ucy5sYXN0TmFtZS5hc0VuZEJvdW5kKCkgOiBjb2x1bW5zLmZpcnN0TmFtZS5hc1N0YXJ0Qm91bmQoKTsKKyAgICAgICAgICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvcldpdGhMb3dlckJvdW5kLmFzc2VydEJvdW5kU2l6ZShib3VuZCwgdGhpcyk7CisgICAgICAgICAgICByZXR1cm4gYm91bmQuYXJ0aWZpY2lhbExvd2VyQm91bmQoaXNSZXZlcnNlZCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJzaG91bGQgbmV2ZXIgb2NjdXIiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gQW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBrZXlzIGluIHRoaXMgU1NUYWJsZSBiYXNlZCBvbiB0aGUgaW5kZXggc3VtbWFyeS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBlc3RpbWF0ZWRLZXlzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmRleFN1bW1hcnkuZ2V0RXN0aW1hdGVkS2V5Q291bnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIEFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2Yga2V5cyBmb3IgZ2l2ZW4gcmFuZ2VzIGluIHRoaXMgU1NUYWJsZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBlc3RpbWF0ZWRLZXlzRm9yUmFuZ2VzKENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiByYW5nZXMpCisgICAgeworICAgICAgICBsb25nIHNhbXBsZUtleUNvdW50ID0gMDsKKyAgICAgICAgTGlzdDxJbmRleGVzQm91bmRzPiBzYW1wbGVJbmRleGVzID0gaW5kZXhTdW1tYXJ5LmdldFNhbXBsZUluZGV4ZXNGb3JSYW5nZXMocmFuZ2VzKTsKKyAgICAgICAgZm9yIChJbmRleGVzQm91bmRzIHNhbXBsZUluZGV4UmFuZ2UgOiBzYW1wbGVJbmRleGVzKQorICAgICAgICAgICAgc2FtcGxlS2V5Q291bnQgKz0gKHNhbXBsZUluZGV4UmFuZ2UudXBwZXJQb3NpdGlvbiAtIHNhbXBsZUluZGV4UmFuZ2UubG93ZXJQb3NpdGlvbiArIDEpOworCisgICAgICAgIC8vIGFkanVzdCBmb3IgdGhlIGN1cnJlbnQgc2FtcGxpbmcgbGV2ZWw6IChCU0wgLyBTTCkgKiBpbmRleF9pbnRlcnZhbF9hdF9mdWxsX3NhbXBsaW5nCisgICAgICAgIGxvbmcgZXN0aW1hdGVkS2V5cyA9IHNhbXBsZUtleUNvdW50ICogKChsb25nKSBEb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTCAqIGluZGV4U3VtbWFyeS5nZXRNaW5JbmRleEludGVydmFsKCkpIC8gaW5kZXhTdW1tYXJ5LmdldFNhbXBsaW5nTGV2ZWwoKTsKKyAgICAgICAgcmV0dXJuIE1hdGgubWF4KDEsIGVzdGltYXRlZEtleXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIEluZGV4U3VtbWFyeSA+IDIuICBBdCBmdWxsIHNhbXBsaW5nLCB0aGlzIGlzIGFwcHJveGltYXRlbHkKKyAgICAgKiAxL0lOREVYX0lOVEVSVkFMdGggb2YgdGhlIGtleXMgaW4gdGhpcyBTU1RhYmxlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRXN0aW1hdGlvbkluZm9ybWF0aXZlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmRleFN1bW1hcnkuc2l6ZSgpID4gMjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSXRlcmFibGU8RGVjb3JhdGVkS2V5PiBnZXRLZXlTYW1wbGVzKGZpbmFsIFJhbmdlPFRva2VuPiByYW5nZSkKKyAgICB7CisgICAgICAgIHJldHVybiBJdGVyYWJsZXMudHJhbnNmb3JtKGluZGV4U3VtbWFyeS5nZXRLZXlTYW1wbGVzKHJhbmdlKSwgYnl0ZXMgLT4gZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlci53cmFwKGJ5dGVzKSkpOworICAgIH0KKworICAgIHB1YmxpYyBSYW5kb21BY2Nlc3NSZWFkZXIgb3BlbkluZGV4UmVhZGVyKCkKKyAgICB7CisgICAgICAgIGlmIChpZmlsZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGlmaWxlLmNyZWF0ZVJlYWRlcigpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgRmlsZUhhbmRsZSBnZXRJbmRleEZpbGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlmaWxlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJVmVyaWZpZXIgZ2V0VmVyaWZpZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXIsIGJvb2xlYW4gaXNPZmZsaW5lLCBJVmVyaWZpZXIuT3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KGNmcy5tZXRhZGF0YSgpLmVxdWFscyhtZXRhZGF0YSgpKSk7CisgICAgICAgIHJldHVybiBuZXcgQmlnVGFibGVWZXJpZmllcihjZnMsIHRoaXMsIG91dHB1dEhhbmRsZXIsIGlzT2ZmbGluZSwgb3B0aW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcG9zaXRpb24gd2l0aCB0aGUgaW5kZXggZmlsZSB0byBzdGFydCBzY2FubmluZyB0byBmaW5kIHRoZSBnaXZlbiBrZXkgKGF0IG1vc3QgaW5kZXhJbnRlcnZhbCBrZXlzIGF3YXksCisgICAgICogbW9kdWxvIGRvd25zYW1wbGluZyBvZiB0aGUgaW5kZXggc3VtbWFyeSkuIEFsd2F5cyByZXR1cm5zIGEge0Bjb2RlIHZhbHVlID49IDB9CisgICAgICovCisgICAgbG9uZyBnZXRJbmRleFNjYW5Qb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbiBrZXkpCisgICAgeworICAgICAgICBpZiAob3BlblJlYXNvbiA9PSBPcGVuUmVhc29uLk1PVkVEX1NUQVJUICYmIGtleS5jb21wYXJlVG8oZmlyc3QpIDwgMCkKKyAgICAgICAgICAgIGtleSA9IGZpcnN0OworCisgICAgICAgIHJldHVybiBpbmRleFN1bW1hcnkuZ2V0U2NhblBvc2l0aW9uKGtleSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIEJ1aWxkZXIgdW5idWlsZFRvKEJ1aWxkZXIgYnVpbGRlciwgYm9vbGVhbiBzaGFyZWRDb3B5KQorICAgIHsKKyAgICAgICAgQnVpbGRlciBiID0gc3VwZXIudW5idWlsZFRvKGJ1aWxkZXIsIHNoYXJlZENvcHkpOworICAgICAgICBpZiAoYnVpbGRlci5nZXRJbmRleEZpbGUoKSA9PSBudWxsKQorICAgICAgICAgICAgYi5zZXRJbmRleEZpbGUoc2hhcmVkQ29weSA/IHNoYXJlZENvcHlPck51bGwoaWZpbGUpIDogaWZpbGUpOworICAgICAgICBpZiAoYnVpbGRlci5nZXRJbmRleFN1bW1hcnkoKSA9PSBudWxsKQorICAgICAgICAgICAgYi5zZXRJbmRleFN1bW1hcnkoc2hhcmVkQ29weSA/IHNoYXJlZENvcHlPck51bGwoaW5kZXhTdW1tYXJ5KSA6IGluZGV4U3VtbWFyeSk7CisKKyAgICAgICAgYi5zZXRLZXlDYWNoZShrZXlDYWNoZSk7CisKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyIGNsb25lQW5kUmVwbGFjZShJRmlsdGVyIGZpbHRlcikKKyAgICB7CisgICAgICAgIHJldHVybiB1bmJ1aWxkVG8obmV3IEJ1aWxkZXIoZGVzY3JpcHRvcikuc2V0RmlsdGVyKGZpbHRlciksIHRydWUpLmJ1aWxkKG93bmVyKCkub3JFbHNlKG51bGwpLCB0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9uZSB0aGlzIHJlYWRlciB3aXRoIHRoZSBwcm92aWRlZCBzdGFydCBhbmQgb3BlbiByZWFzb24sIGFuZCBzZXQgdGhlIGNsb25lIGFzIHJlcGxhY2VtZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG5ld0ZpcnN0IHRoZSBmaXJzdCBrZXkgZm9yIHRoZSByZXBsYWNlbWVudCAod2hpY2ggY2FuIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBkdWUgdG8gdGhlIHByZS1lbXB0aXZlCisgICAgICogICAgICAgICAgICAgICAgIG9wZW5pbmcgb2YgY29tcGFjdGlvbiByZXN1bHRzKS4KKyAgICAgKiBAcGFyYW0gcmVhc29uICAgdGhlIHtAY29kZSBPcGVuUmVhc29ufSBmb3IgdGhlIHJlcGxhY2VtZW50LgorICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCByZWFkZXIuIFRoYXQgcmVhZGVyIGlzIHNldCBhcyBhIHJlcGxhY2VtZW50IGJ5IHRoZSBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBTU1RhYmxlUmVhZGVyIGNsb25lQW5kUmVwbGFjZShEZWNvcmF0ZWRLZXkgbmV3Rmlyc3QsIE9wZW5SZWFzb24gcmVhc29uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuYnVpbGRUbyhuZXcgQnVpbGRlcihkZXNjcmlwdG9yKSwgdHJ1ZSkKKyAgICAgICAgICAgICAgIC5zZXRGaXJzdChuZXdGaXJzdCkKKyAgICAgICAgICAgICAgIC5zZXRPcGVuUmVhc29uKHJlYXNvbikKKyAgICAgICAgICAgICAgIC5idWlsZChvd25lcigpLm9yRWxzZShudWxsKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvbmUgdGhpcyByZWFkZXIgd2l0aCB0aGUgbmV3IHZhbHVlcyBhbmQgc2V0IHRoZSBjbG9uZSBhcyByZXBsYWNlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXdGaXJzdCAgIHRoZSBmaXJzdCBrZXkgZm9yIHRoZSByZXBsYWNlbWVudCAod2hpY2ggY2FuIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvcmlnaW5hbCBkdWUgdG8gdGhlIHByZS1lbXB0aXZlCisgICAgICogICAgICAgICAgICAgICAgICAgb3BlbmluZyBvZiBjb21wYWN0aW9uIHJlc3VsdHMpLgorICAgICAqIEBwYXJhbSByZWFzb24gICAgIHRoZSB7QGNvZGUgT3BlblJlYXNvbn0gZm9yIHRoZSByZXBsYWNlbWVudC4KKyAgICAgKiBAcGFyYW0gbmV3U3VtbWFyeSB0aGUgaW5kZXggc3VtbWFyeSBmb3IgdGhlIHJlcGxhY2VtZW50LgorICAgICAqIEByZXR1cm4gdGhlIGNsb25lZCByZWFkZXIuIFRoYXQgcmVhZGVyIGlzIHNldCBhcyBhIHJlcGxhY2VtZW50IGJ5IHRoZSBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBCaWdUYWJsZVJlYWRlciBjbG9uZUFuZFJlcGxhY2UoRGVjb3JhdGVkS2V5IG5ld0ZpcnN0LCBPcGVuUmVhc29uIHJlYXNvbiwgSW5kZXhTdW1tYXJ5IG5ld1N1bW1hcnkpCisgICAgeworICAgICAgICByZXR1cm4gdW5idWlsZFRvKG5ldyBCdWlsZGVyKGRlc2NyaXB0b3IpLnNldEluZGV4U3VtbWFyeShuZXdTdW1tYXJ5KSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEluZGV4U3VtbWFyeShuZXdTdW1tYXJ5KQorICAgICAgICAgICAgICAgICAgICAuc2V0Rmlyc3QobmV3Rmlyc3QpCisgICAgICAgICAgICAgICAgICAgIC5zZXRPcGVuUmVhc29uKHJlYXNvbikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKG93bmVyKCkub3JFbHNlKG51bGwpLCB0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU1NUYWJsZVJlYWRlciBjbG9uZVdpdGhSZXN0b3JlZFN0YXJ0KERlY29yYXRlZEtleSByZXN0b3JlZFN0YXJ0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJ1bldpdGhMb2NrKGlnbm9yZWQgLT4gY2xvbmVBbmRSZXBsYWNlKHJlc3RvcmVkU3RhcnQsIE9wZW5SZWFzb24uTk9STUFMKSk7CisgICAgfQorCisgICAgcHVibGljIFNTVGFibGVSZWFkZXIgY2xvbmVXaXRoTmV3U3RhcnQoRGVjb3JhdGVkS2V5IG5ld1N0YXJ0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJ1bldpdGhMb2NrKGlnbm9yZWQgLT4geworICAgICAgICAgICAgYXNzZXJ0IG9wZW5SZWFzb24gIT0gT3BlblJlYXNvbi5FQVJMWTsKKyAgICAgICAgICAgIC8vIFRPRE86IG1lcmdlIHdpdGggY2FsbGVyJ3MgZmlyc3RLZXlCZXlvbmQoKSB3b3JrLHRvIHNhdmUgdGltZQorICAgICAgICAgICAgaWYgKG5ld1N0YXJ0LmNvbXBhcmVUbyhmaXJzdCkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1hcDxGaWxlSGFuZGxlLCBMb25nPiBoYW5kbGVBbmRQb3NpdGlvbnMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KDIpOworICAgICAgICAgICAgICAgIGlmIChkZmlsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBoYW5kbGVBbmRQb3NpdGlvbnMucHV0KGRmaWxlLCBnZXRQb3NpdGlvbihuZXdTdGFydCwgT3BlcmF0b3IuRVEpKTsKKyAgICAgICAgICAgICAgICBpZiAoaWZpbGUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlQW5kUG9zaXRpb25zLnB1dChpZmlsZSwgZ2V0SW5kZXhTY2FuUG9zaXRpb24obmV3U3RhcnQpKTsKKyAgICAgICAgICAgICAgICBydW5PbkNsb3NlKCgpIC0+IGhhbmRsZUFuZFBvc2l0aW9ucy5mb3JFYWNoKEZpbGVIYW5kbGU6OmRyb3BQYWdlQ2FjaGUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNsb25lQW5kUmVwbGFjZShuZXdTdGFydCwgT3BlblJlYXNvbi5NT1ZFRF9TVEFSVCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgU1NUYWJsZVJlYWRlciB3aXRoIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgdGhpcyBTU1RhYmxlUmVhZGVyIGV4Y2VwdCB0aGF0IGEgbmV3IEluZGV4U3VtbWFyeSB3aWxsCisgICAgICogYmUgYnVpbHQgYXQgdGhlIHRhcmdldCBzYW1wbGluZ0xldmVsLiAgVGhpcyAob3JpZ2luYWwpIFNTVGFibGVSZWFkZXIgaW5zdGFuY2Ugd2lsbCBiZSBtYXJrZWQgYXMgcmVwbGFjZWQsIGhhdmUKKyAgICAgKiBpdHMgRGVsZXRpbmdUYXNrIHJlbW92ZWQsIGFuZCBoYXZlIGl0cyBwZXJpb2RpYyByZWFkLW1ldGVyIHN5bmMgdGFzayBjYW5jZWxsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2FtcGxpbmdMZXZlbCB0aGUgZGVzaXJlZCBzYW1wbGluZyBsZXZlbCBmb3IgdGhlIGluZGV4IHN1bW1hcnkgb24gdGhlIG5ldyBTU1RhYmxlUmVhZGVyCisgICAgICogQHJldHVybiBhIG5ldyBTU1RhYmxlUmVhZGVyCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICBwdWJsaWMgQmlnVGFibGVSZWFkZXIgY2xvbmVXaXRoTmV3U3VtbWFyeVNhbXBsaW5nTGV2ZWwoQ29sdW1uRmFtaWx5U3RvcmUgcGFyZW50LCBpbnQgc2FtcGxpbmdMZXZlbCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBhc3NlcnQgb3BlblJlYXNvbiAhPSBPcGVuUmVhc29uLkVBUkxZOworCisgICAgICAgIGludCBtaW5JbmRleEludGVydmFsID0gbWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsKKyAgICAgICAgaW50IG1heEluZGV4SW50ZXJ2YWwgPSBtZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsOworICAgICAgICBkb3VibGUgZWZmZWN0aXZlSW50ZXJ2YWwgPSBpbmRleFN1bW1hcnkuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpOworCisgICAgICAgIEluZGV4U3VtbWFyeSBuZXdTdW1tYXJ5OworCisgICAgICAgIC8vIFdlIGhhdmUgdG8gcmVidWlsZCB0aGUgc3VtbWFyeSBmcm9tIHRoZSBvbi1kaXNrIHByaW1hcnkgaW5kZXggaW4gdGhyZWUgY2FzZXM6CisgICAgICAgIC8vIDEuIFRoZSBzYW1wbGluZyBsZXZlbCB3ZW50IHVwLCBzbyB3ZSBuZWVkIHRvIHJlYWQgbW9yZSBlbnRyaWVzIG9mZiBkaXNrCisgICAgICAgIC8vIDIuIFRoZSBtaW5faW5kZXhfaW50ZXJ2YWwgY2hhbmdlZCAoaW4gZWl0aGVyIGRpcmVjdGlvbik7IHRoaXMgY2hhbmdlcyB3aGF0IGVudHJpZXMgd291bGQgYmUgaW4gdGhlIHN1bW1hcnkKKyAgICAgICAgLy8gICAgYXQgZnVsbCBzYW1wbGluZyAoYW5kIGNvbnNlcXVlbnRseSBhdCBhbnkgb3RoZXIgc2FtcGxpbmcgbGV2ZWwpCisgICAgICAgIC8vIDMuIFRoZSBtYXhfaW5kZXhfaW50ZXJ2YWwgd2FzIGxvd2VyZWQsIGZvcmNpbmcgdXMgdG8gcmFpc2UgdGhlIHNhbXBsaW5nIGxldmVsCisgICAgICAgIGlmIChzYW1wbGluZ0xldmVsID4gaW5kZXhTdW1tYXJ5LmdldFNhbXBsaW5nTGV2ZWwoKSB8fCBpbmRleFN1bW1hcnkuZ2V0TWluSW5kZXhJbnRlcnZhbCgpICE9IG1pbkluZGV4SW50ZXJ2YWwgfHwgZWZmZWN0aXZlSW50ZXJ2YWwgPiBtYXhJbmRleEludGVydmFsKQorICAgICAgICB7CisgICAgICAgICAgICBuZXdTdW1tYXJ5ID0gYnVpbGRTdW1tYXJ5QXRMZXZlbChzYW1wbGluZ0xldmVsKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzYW1wbGluZ0xldmVsIDwgaW5kZXhTdW1tYXJ5LmdldFNhbXBsaW5nTGV2ZWwoKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd2UgY2FuIHVzZSB0aGUgZXhpc3RpbmcgaW5kZXggc3VtbWFyeSB0byBtYWtlIGEgc21hbGxlciBvbmUKKyAgICAgICAgICAgIG5ld1N1bW1hcnkgPSBJbmRleFN1bW1hcnlCdWlsZGVyLmRvd25zYW1wbGUoaW5kZXhTdW1tYXJ5LCBzYW1wbGluZ0xldmVsLCBtaW5JbmRleEludGVydmFsLCBnZXRQYXJ0aXRpb25lcigpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiQXR0ZW1wdGVkIHRvIGNsb25lIFNTVGFibGVSZWFkZXIgd2l0aCB0aGUgc2FtZSBpbmRleCBzdW1tYXJ5IHNhbXBsaW5nIGxldmVsIGFuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gYWRqdXN0bWVudHMgdG8gbWluL21heF9pbmRleF9pbnRlcnZhbCIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWx3YXlzIHNhdmUgdGhlIHJlc2FtcGxlZCBpbmRleCB3aXRoIGxvY2sgdG8gYXZvaWQgcmFjaW5nIHdpdGggZW50aXJlLXNzdGFibGUgc3RyZWFtaW5nCisgICAgICAgIHJldHVybiBydW5XaXRoTG9jayhpZ25vcmVkIC0+IHsKKyAgICAgICAgICAgIG5ldyBJbmRleFN1bW1hcnlDb21wb25lbnQobmV3U3VtbWFyeSwgZmlyc3QsIGxhc3QpLnNhdmUoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1VNTUFSWSksIHRydWUpOworICAgICAgICAgICAgcmV0dXJuIGNsb25lQW5kUmVwbGFjZShmaXJzdCwgT3BlblJlYXNvbi5NRVRBREFUQV9DSEFOR0UsIG5ld1N1bW1hcnkpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIEluZGV4U3VtbWFyeSBidWlsZFN1bW1hcnlBdExldmVsKGludCBuZXdTYW1wbGluZ0xldmVsKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIHdlIHJlYWQgdGhlIHBvc2l0aW9ucyBpbiBhIEJSQUYsIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYW4gZW50cnkgc3Bhbm5pbmcgYSBtbWFwIGJvdW5kYXJ5LgorICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcHJpbWFyeUluZGV4ID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4oZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCkpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBpbmRleFNpemUgPSBwcmltYXJ5SW5kZXgubGVuZ3RoKCk7CisgICAgICAgICAgICB0cnkgKEluZGV4U3VtbWFyeUJ1aWxkZXIgc3VtbWFyeUJ1aWxkZXIgPSBuZXcgSW5kZXhTdW1tYXJ5QnVpbGRlcihlc3RpbWF0ZWRLZXlzKCksIG1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIG5ld1NhbXBsaW5nTGV2ZWwpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgaW5kZXhQb3NpdGlvbjsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGluZGV4UG9zaXRpb24gPSBwcmltYXJ5SW5kZXguZ2V0RmlsZVBvaW50ZXIoKSkgIT0gaW5kZXhTaXplKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3VtbWFyeUJ1aWxkZXIubWF5YmVBZGRFbnRyeShkZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKHByaW1hcnlJbmRleCkpLCBpbmRleFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyLnNraXAocHJpbWFyeUluZGV4LCBkZXNjcmlwdG9yLnZlcnNpb24pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBzdW1tYXJ5QnVpbGRlci5idWlsZChnZXRQYXJ0aXRpb25lcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkocHJpbWFyeUluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBLZXlDYWNoZSBnZXRLZXlDYWNoZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5rZXlDYWNoZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlci5CdWlsZGVyPEJpZ1RhYmxlUmVhZGVyLCBCdWlsZGVyPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJ1aWxkZXIuY2xhc3MpOworCisgICAgICAgIHByaXZhdGUgSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeTsKKyAgICAgICAgcHJpdmF0ZSBGaWxlSGFuZGxlIGluZGV4RmlsZTsKKyAgICAgICAgcHJpdmF0ZSBLZXlDYWNoZSBrZXlDYWNoZSA9IEtleUNhY2hlLk5PX0NBQ0hFOworCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRJbmRleEZpbGUoRmlsZUhhbmRsZSBpbmRleEZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW5kZXhGaWxlID0gaW5kZXhGaWxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRJbmRleFN1bW1hcnkoSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5pbmRleFN1bW1hcnkgPSBpbmRleFN1bW1hcnk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEtleUNhY2hlKEtleUNhY2hlIGtleUNhY2hlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmtleUNhY2hlID0ga2V5Q2FjaGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbmRleFN1bW1hcnkgZ2V0SW5kZXhTdW1tYXJ5KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGluZGV4U3VtbWFyeTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWxlSGFuZGxlIGdldEluZGV4RmlsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpbmRleEZpbGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgS2V5Q2FjaGUgZ2V0S2V5Q2FjaGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4ga2V5Q2FjaGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEJpZ1RhYmxlUmVhZGVyIGJ1aWxkSW50ZXJuYWwoT3duZXIgb3duZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmlnVGFibGVSZWFkZXIodGhpcywgb3duZXIpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlU2Nhbm5lci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlU2Nhbm5lci5qYXZhCmluZGV4IDIzNWI5YjEuLjg4N2Q5OTcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVNjYW5uZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVTY2FubmVyLmphdmEKQEAgLTE4LDYzICsxOCw0NSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWc7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkFic3RyYWN0SXRlcmF0b3I7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhdG9yczsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EYXRhUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5DbHVzdGVyaW5nSW5kZXhGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzLkJvdW5kYXJ5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Cb3VuZHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNTVGFibGVTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVJZGVudGl0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlU2Nhbm5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHMuaXNFbXB0eTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzLm1heExlZnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kcy5taW5SaWdodDsKLQotcHVibGljIGNsYXNzIEJpZ1RhYmxlU2Nhbm5lciBpbXBsZW1lbnRzIElTU1RhYmxlU2Nhbm5lcgorcHVibGljIGNsYXNzIEJpZ1RhYmxlU2Nhbm5lciBleHRlbmRzIFNTVGFibGVTY2FubmVyPEJpZ1RhYmxlUmVhZGVyLCBSb3dJbmRleEVudHJ5LCBCaWdUYWJsZVNjYW5uZXIuQmlnU2Nhbm5pbmdJdGVyYXRvcj4KIHsKLSAgICBwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gaXNDbG9zZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFJhbmRvbUFjY2Vzc1JlYWRlciBkZmlsZTsKICAgICBwcm90ZWN0ZWQgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGlmaWxlOwotICAgIHB1YmxpYyBmaW5hbCBTU1RhYmxlUmVhZGVyIHNzdGFibGU7CiAKLSAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPj4gcmFuZ2VJdGVyYXRvcjsKICAgICBwcml2YXRlIEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPiBjdXJyZW50UmFuZ2U7CiAKLSAgICBwcml2YXRlIGZpbmFsIENvbHVtbkZpbHRlciBjb2x1bW5zOwotICAgIHByaXZhdGUgZmluYWwgRGF0YVJhbmdlIGRhdGFSYW5nZTsKICAgICBwcml2YXRlIGZpbmFsIFJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyIHJvd0luZGV4RW50cnlTZXJpYWxpemVyOwotICAgIHByaXZhdGUgZmluYWwgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBsb25nIHN0YXJ0U2NhbiA9IC0xOwotICAgIHByaXZhdGUgbG9uZyBieXRlc1NjYW5uZWQgPSAwOwotCi0gICAgcHJvdGVjdGVkIEl0ZXJhdG9yPFVuZmlsdGVyZWRSb3dJdGVyYXRvcj4gaXRlcmF0b3I7CiAKICAgICAvLyBGdWxsIHNjYW4gb2YgdGhlIHNzdGFibGVzCi0gICAgcHVibGljIHN0YXRpYyBJU1NUYWJsZVNjYW5uZXIgZ2V0U2Nhbm5lcihTU1RhYmxlUmVhZGVyIHNzdGFibGUpCisgICAgcHVibGljIHN0YXRpYyBJU1NUYWJsZVNjYW5uZXIgZ2V0U2Nhbm5lcihCaWdUYWJsZVJlYWRlciBzc3RhYmxlKQogICAgIHsKICAgICAgICAgcmV0dXJuIGdldFNjYW5uZXIoc3N0YWJsZSwgSXRlcmF0b3JzLnNpbmdsZXRvbkl0ZXJhdG9yKGZ1bGxSYW5nZShzc3RhYmxlKSkpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgSVNTVGFibGVTY2FubmVyIGdldFNjYW5uZXIoU1NUYWJsZVJlYWRlciBzc3RhYmxlLAorICAgIHB1YmxpYyBzdGF0aWMgSVNTVGFibGVTY2FubmVyIGdldFNjYW5uZXIoQmlnVGFibGVSZWFkZXIgc3N0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlciBjb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVJhbmdlIGRhdGFSYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQpAQCAtODIsOTkgKzY0LDI1IEBACiAgICAgICAgIHJldHVybiBuZXcgQmlnVGFibGVTY2FubmVyKHNzdGFibGUsIGNvbHVtbnMsIGRhdGFSYW5nZSwgbWFrZUJvdW5kcyhzc3RhYmxlLCBkYXRhUmFuZ2UpLml0ZXJhdG9yKCksIGxpc3RlbmVyKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIElTU1RhYmxlU2Nhbm5lciBnZXRTY2FubmVyKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+IHRva2VuUmFuZ2VzKQorICAgIHB1YmxpYyBzdGF0aWMgSVNTVGFibGVTY2FubmVyIGdldFNjYW5uZXIoQmlnVGFibGVSZWFkZXIgc3N0YWJsZSwgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+IHRva2VuUmFuZ2VzKQogICAgIHsKLSAgICAgICAgLy8gV2Ugd2FudCB0byBhdm9pZCBhbGxvY2F0aW5nIGEgU1NUYWJsZVNjYW5uZXIgaWYgdGhlIHJhbmdlIGRvbid0IG92ZXJsYXAgdGhlIHNzdGFibGUgKCM1MjQ5KQotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXIuUGFydGl0aW9uUG9zaXRpb25Cb3VuZHM+IHBvc2l0aW9ucyA9IHNzdGFibGUuZ2V0UG9zaXRpb25zRm9yUmFuZ2VzKHRva2VuUmFuZ2VzKTsKLSAgICAgICAgaWYgKHBvc2l0aW9ucy5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gbmV3IEVtcHR5U1NUYWJsZVNjYW5uZXIoc3N0YWJsZSk7Ci0KICAgICAgICAgcmV0dXJuIGdldFNjYW5uZXIoc3N0YWJsZSwgbWFrZUJvdW5kcyhzc3RhYmxlLCB0b2tlblJhbmdlcykuaXRlcmF0b3IoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBJU1NUYWJsZVNjYW5uZXIgZ2V0U2Nhbm5lcihTU1RhYmxlUmVhZGVyIHNzdGFibGUsIEl0ZXJhdG9yPEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPj4gcmFuZ2VJdGVyYXRvcikKKyAgICBwdWJsaWMgc3RhdGljIElTU1RhYmxlU2Nhbm5lciBnZXRTY2FubmVyKEJpZ1RhYmxlUmVhZGVyIHNzdGFibGUsIEl0ZXJhdG9yPEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPj4gcmFuZ2VJdGVyYXRvcikKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgQmlnVGFibGVTY2FubmVyKHNzdGFibGUsIENvbHVtbkZpbHRlci5hbGwoc3N0YWJsZS5tZXRhZGF0YSgpKSwgbnVsbCwgcmFuZ2VJdGVyYXRvciwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuTk9PUF9MSVNURU5FUik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBCaWdUYWJsZVNjYW5uZXIoU1NUYWJsZVJlYWRlciBzc3RhYmxlLAorICAgIHByaXZhdGUgQmlnVGFibGVTY2FubmVyKEJpZ1RhYmxlUmVhZGVyIHNzdGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIGNvbHVtbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVJhbmdlIGRhdGFSYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4+IHJhbmdlSXRlcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCiAgICAgewotICAgICAgICBhc3NlcnQgc3N0YWJsZSAhPSBudWxsOwotCi0gICAgICAgIHRoaXMuZGZpbGUgPSBzc3RhYmxlLm9wZW5EYXRhUmVhZGVyKCk7CisgICAgICAgIHN1cGVyKHNzdGFibGUsIGNvbHVtbnMsIGRhdGFSYW5nZSwgcmFuZ2VJdGVyYXRvciwgbGlzdGVuZXIpOwogICAgICAgICB0aGlzLmlmaWxlID0gc3N0YWJsZS5vcGVuSW5kZXhSZWFkZXIoKTsKLSAgICAgICAgdGhpcy5zc3RhYmxlID0gc3N0YWJsZTsKLSAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1uczsKLSAgICAgICAgdGhpcy5kYXRhUmFuZ2UgPSBkYXRhUmFuZ2U7Ci0gICAgICAgIHRoaXMucm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIgPSBzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbi5nZXRTU1RhYmxlRm9ybWF0KCkuZ2V0SW5kZXhTZXJpYWxpemVyKHNzdGFibGUubWV0YWRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuaGVhZGVyKTsKLSAgICAgICAgdGhpcy5yYW5nZUl0ZXJhdG9yID0gcmFuZ2VJdGVyYXRvcjsKLSAgICAgICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiBtYWtlQm91bmRzKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+IHRva2VuUmFuZ2VzKQotICAgIHsKLSAgICAgICAgTGlzdDxBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4+IGJvdW5kc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4odG9rZW5SYW5nZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChSYW5nZTxUb2tlbj4gcmFuZ2UgOiBSYW5nZS5ub3JtYWxpemUodG9rZW5SYW5nZXMpKQotICAgICAgICAgICAgYWRkUmFuZ2Uoc3N0YWJsZSwgUmFuZ2UubWFrZVJvd1JhbmdlKHJhbmdlKSwgYm91bmRzTGlzdCk7Ci0gICAgICAgIHJldHVybiBib3VuZHNMaXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiBtYWtlQm91bmRzKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgRGF0YVJhbmdlIGRhdGFSYW5nZSkKLSAgICB7Ci0gICAgICAgIExpc3Q8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiBib3VuZHNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KDIpOwotICAgICAgICBhZGRSYW5nZShzc3RhYmxlLCBkYXRhUmFuZ2Uua2V5UmFuZ2UoKSwgYm91bmRzTGlzdCk7Ci0gICAgICAgIHJldHVybiBib3VuZHNMaXN0OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPiBmdWxsUmFuZ2UoU1NUYWJsZVJlYWRlciBzc3RhYmxlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+KHNzdGFibGUuZmlyc3QsIHNzdGFibGUubGFzdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRSYW5nZShTU1RhYmxlUmVhZGVyIHNzdGFibGUsIEFic3RyYWN0Qm91bmRzPFBhcnRpdGlvblBvc2l0aW9uPiByZXF1ZXN0ZWQsIExpc3Q8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiBib3VuZHNMaXN0KQotICAgIHsKLSAgICAgICAgaWYgKHJlcXVlc3RlZCBpbnN0YW5jZW9mIFJhbmdlICYmICgoUmFuZ2UpcmVxdWVzdGVkKS5pc1dyYXBBcm91bmQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlcXVlc3RlZC5yaWdodC5jb21wYXJlVG8oc3N0YWJsZS5maXJzdCkgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBzaW5jZSB3ZSB3cmFwLCB3ZSBtdXN0IGNvbnRhaW4gdGhlIHdob2xlIHNzdGFibGUgcHJpb3IgdG8gc3RvcEtleSgpCi0gICAgICAgICAgICAgICAgQm91bmRhcnk8UGFydGl0aW9uUG9zaXRpb24+IGxlZnQgPSBuZXcgQm91bmRhcnk8UGFydGl0aW9uUG9zaXRpb24+KHNzdGFibGUuZmlyc3QsIHRydWUpOwotICAgICAgICAgICAgICAgIEJvdW5kYXJ5PFBhcnRpdGlvblBvc2l0aW9uPiByaWdodDsKLSAgICAgICAgICAgICAgICByaWdodCA9IHJlcXVlc3RlZC5yaWdodEJvdW5kYXJ5KCk7Ci0gICAgICAgICAgICAgICAgcmlnaHQgPSBtaW5SaWdodChyaWdodCwgc3N0YWJsZS5sYXN0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICBpZiAoIWlzRW1wdHkobGVmdCwgcmlnaHQpKQotICAgICAgICAgICAgICAgICAgICBib3VuZHNMaXN0LmFkZChBYnN0cmFjdEJvdW5kcy5ib3VuZHMobGVmdCwgcmlnaHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWQubGVmdC5jb21wYXJlVG8oc3N0YWJsZS5sYXN0KSA8PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIHdyYXAsIHdlIG11c3QgY29udGFpbiB0aGUgd2hvbGUgc3N0YWJsZSBhZnRlciBkYXRhUmFuZ2Uuc3RhcnRLZXkoKQotICAgICAgICAgICAgICAgIEJvdW5kYXJ5PFBhcnRpdGlvblBvc2l0aW9uPiByaWdodCA9IG5ldyBCb3VuZGFyeTxQYXJ0aXRpb25Qb3NpdGlvbj4oc3N0YWJsZS5sYXN0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICBCb3VuZGFyeTxQYXJ0aXRpb25Qb3NpdGlvbj4gbGVmdDsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gcmVxdWVzdGVkLmxlZnRCb3VuZGFyeSgpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBtYXhMZWZ0KGxlZnQsIHNzdGFibGUuZmlyc3QsIHRydWUpOwotICAgICAgICAgICAgICAgIGlmICghaXNFbXB0eShsZWZ0LCByaWdodCkpCi0gICAgICAgICAgICAgICAgICAgIGJvdW5kc0xpc3QuYWRkKEFic3RyYWN0Qm91bmRzLmJvdW5kcyhsZWZ0LCByaWdodCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IHJlcXVlc3RlZC5sZWZ0LmNvbXBhcmVUbyhyZXF1ZXN0ZWQucmlnaHQpIDw9IDAgfHwgcmVxdWVzdGVkLnJpZ2h0LmlzTWluaW11bSgpOwotICAgICAgICAgICAgQm91bmRhcnk8UGFydGl0aW9uUG9zaXRpb24+IGxlZnQsIHJpZ2h0OwotICAgICAgICAgICAgbGVmdCA9IHJlcXVlc3RlZC5sZWZ0Qm91bmRhcnkoKTsKLSAgICAgICAgICAgIHJpZ2h0ID0gcmVxdWVzdGVkLnJpZ2h0Qm91bmRhcnkoKTsKLSAgICAgICAgICAgIGxlZnQgPSBtYXhMZWZ0KGxlZnQsIHNzdGFibGUuZmlyc3QsIHRydWUpOwotICAgICAgICAgICAgLy8gYXBwYXJlbnRseSBpc1dyYXBBcm91bmQoKSBkb2Vzbid0IGNvdW50IEJvdW5kcyB0aGF0IGV4dGVuZCB0byB0aGUgbGltaXQgKG1pbikgYXMgd3JhcHBpbmcKLSAgICAgICAgICAgIHJpZ2h0ID0gcmVxdWVzdGVkLnJpZ2h0LmlzTWluaW11bSgpID8gbmV3IEJvdW5kYXJ5PFBhcnRpdGlvblBvc2l0aW9uPihzc3RhYmxlLmxhc3QsIHRydWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtaW5SaWdodChyaWdodCwgc3N0YWJsZS5sYXN0LCB0cnVlKTsKLSAgICAgICAgICAgIGlmICghaXNFbXB0eShsZWZ0LCByaWdodCkpCi0gICAgICAgICAgICAgICAgYm91bmRzTGlzdC5hZGQoQWJzdHJhY3RCb3VuZHMuYm91bmRzKGxlZnQsIHJpZ2h0KSk7Ci0gICAgICAgIH0KKyAgICAgICAgdGhpcy5yb3dJbmRleEVudHJ5U2VyaWFsaXplciA9IG5ldyBSb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIoc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24sIHNzdGFibGUuaGVhZGVyLCBzc3RhYmxlLm93bmVyKCkubWFwKFNTVGFibGUuT3duZXI6OmdldE1ldHJpY3MpLm9yRWxzZShudWxsKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHNlZWtUb0N1cnJlbnRSYW5nZVN0YXJ0KCkKQEAgLTIwOSwxNzcgKzExNyw4OCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHByb3RlY3RlZCB2b2lkIGRvQ2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXNDbG9zZWQuY29tcGFyZUFuZFNldChmYWxzZSwgdHJ1ZSkpCi0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGRmaWxlLCBpZmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGUubWFya1N1c3BlY3QoKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCBzc3RhYmxlLmdldEZpbGVuYW1lKCkpOwotICAgICAgICB9CisgICAgICAgIEZpbGVVdGlscy5jbG9zZShkZmlsZSwgaWZpbGUpOwogICAgIH0KIAotICAgIHB1YmxpYyBsb25nIGdldExlbmd0aEluQnl0ZXMoKQorICAgIHByb3RlY3RlZCBCaWdTY2FubmluZ0l0ZXJhdG9yIGRvQ3JlYXRlSXRlcmF0b3IoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGRmaWxlLmxlbmd0aCgpOworICAgICAgICByZXR1cm4gbmV3IEJpZ1NjYW5uaW5nSXRlcmF0b3IoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRmaWxlLmdldEZpbGVQb2ludGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0Qnl0ZXNTY2FubmVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBieXRlc1NjYW5uZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgZ2V0Q29tcHJlc3NlZExlbmd0aEluQnl0ZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNzdGFibGUub25EaXNrTGVuZ3RoKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFNldDxTU1RhYmxlUmVhZGVyPiBnZXRCYWNraW5nU1NUYWJsZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5vZihzc3RhYmxlKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzc3RhYmxlLm1ldGFkYXRhKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0gICAgewotICAgICAgICBpZiAoaXRlcmF0b3IgPT0gbnVsbCkKLSAgICAgICAgICAgIGl0ZXJhdG9yID0gY3JlYXRlSXRlcmF0b3IoKTsKLSAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIG5leHQoKQotICAgIHsKLSAgICAgICAgaWYgKGl0ZXJhdG9yID09IG51bGwpCi0gICAgICAgICAgICBpdGVyYXRvciA9IGNyZWF0ZUl0ZXJhdG9yKCk7Ci0gICAgICAgIHJldHVybiBpdGVyYXRvci5uZXh0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgSXRlcmF0b3I8VW5maWx0ZXJlZFJvd0l0ZXJhdG9yPiBjcmVhdGVJdGVyYXRvcigpCi0gICAgewotICAgICAgICB0aGlzLmxpc3RlbmVyLm9uU2Nhbm5pbmdTdGFydGVkKHNzdGFibGUpOwotICAgICAgICByZXR1cm4gbmV3IEtleVNjYW5uaW5nSXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgY2xhc3MgS2V5U2Nhbm5pbmdJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0SXRlcmF0b3I8VW5maWx0ZXJlZFJvd0l0ZXJhdG9yPgorICAgIHByb3RlY3RlZCBjbGFzcyBCaWdTY2FubmluZ0l0ZXJhdG9yIGV4dGVuZHMgU1NUYWJsZVNjYW5uZXI8QmlnVGFibGVSZWFkZXIsIFJvd0luZGV4RW50cnksIEJpZ1RhYmxlU2Nhbm5lci5CaWdTY2FubmluZ0l0ZXJhdG9yPi5CYXNlS2V5U2Nhbm5pbmdJdGVyYXRvcgogICAgIHsKICAgICAgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgbmV4dEtleTsKICAgICAgICAgcHJpdmF0ZSBSb3dJbmRleEVudHJ5IG5leHRFbnRyeTsKLSAgICAgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgY3VycmVudEtleTsKLSAgICAgICAgcHJpdmF0ZSBSb3dJbmRleEVudHJ5IGN1cnJlbnRFbnRyeTsKIAotICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGNvbXB1dGVOZXh0KCkKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcHJlcGFyZVRvSXRlcmF0ZVJvdygpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIGlmIChuZXh0RW50cnkgPT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobmV4dEVudHJ5ID09IG51bGwpCisgICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFNjYW4gIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNTY2FubmVkICs9IGRmaWxlLmdldEZpbGVQb2ludGVyKCkgLSBzdGFydFNjYW47CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydFNjYW4gIT0gLTEpCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1NjYW5uZWQgKz0gZGZpbGUuZ2V0RmlsZVBvaW50ZXIoKSAtIHN0YXJ0U2NhbjsKIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgc3RhcnRpbmcgdGhlIGZpcnN0IHJhbmdlIG9yIHdlIGp1c3QgcGFzc2VkIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIHJhbmdlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJhbmdlSXRlcmF0b3IuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRPZkRhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgc3RhcnRpbmcgdGhlIGZpcnN0IHJhbmdlIG9yIHdlIGp1c3QgcGFzc2VkIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIHJhbmdlCisgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2VJdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSYW5nZSA9IHJhbmdlSXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2Vla1RvQ3VycmVudFJhbmdlU3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2NhbiA9IGRmaWxlLmdldEZpbGVQb2ludGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSYW5nZSA9IHJhbmdlSXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBzZWVrVG9DdXJyZW50UmFuZ2VTdGFydCgpOworICAgICAgICAgICAgICAgICAgICBzdGFydFNjYW4gPSBkZmlsZS5nZXRGaWxlUG9pbnRlcigpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWZpbGUuaXNFT0YoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5kT2ZEYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZmlsZS5pc0VPRigpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50S2V5ID0gc3N0YWJsZS5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGlmaWxlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RW50cnkgPSByb3dJbmRleEVudHJ5U2VyaWFsaXplci5kZXNlcmlhbGl6ZShpZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFjdXJyZW50UmFuZ2UuY29udGFpbnMoY3VycmVudEtleSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRLZXkgPSBzc3RhYmxlLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaWZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEVudHJ5ID0gcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaWZpbGUpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFjdXJyZW50UmFuZ2UuY29udGFpbnMoY3VycmVudEtleSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSByYW5nZQorICAgICAgICAgICAgICAgIGN1cnJlbnRLZXkgPSBuZXh0S2V5OworICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlmaWxlLmlzRU9GKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV4dEVudHJ5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBuZXh0S2V5ID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRoZSBwb3NpdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIG5leHQga2V5LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgZmFsbHMgaW4gdGhlIGN1cnJlbnQgcmFuZ2UKKyAgICAgICAgICAgICAgICBuZXh0S2V5ID0gc3N0YWJsZS5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGlmaWxlKSk7CisgICAgICAgICAgICAgICAgbmV4dEVudHJ5ID0gcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaWZpbGUpOworCisgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50UmFuZ2UuY29udGFpbnMobmV4dEtleSkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgcmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudEtleSA9IG5leHRLZXk7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRFbnRyeSA9IG5leHRFbnRyeTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaWZpbGUuaXNFT0YoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHRFbnRyeSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgIG5leHRLZXkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBuZXh0RW50cnkgPSBudWxsOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRoZSBwb3NpdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIG5leHQga2V5LCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgZmFsbHMgaW4gdGhlIGN1cnJlbnQgcmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgbmV4dEtleSA9IHNzdGFibGUuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpZmlsZSkpOwotICAgICAgICAgICAgICAgICAgICBuZXh0RW50cnkgPSByb3dJbmRleEVudHJ5U2VyaWFsaXplci5kZXNlcmlhbGl6ZShpZmlsZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJyZW50UmFuZ2UuY29udGFpbnMobmV4dEtleSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHRLZXkgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEVudHJ5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogRm9yIGEgZ2l2ZW4gcGFydGl0aW9uIGtleSwgd2Ugd2FudCB0byBhdm9pZCBoaXR0aW5nIHRoZSBkYXRhCi0gICAgICAgICAgICAgICAgICogZmlsZSB1bmxlc3Mgd2UncmUgZXhwbGljaXRlbHkgYXNrZWQgdG8uIFRoaXMgaXMgaW1wb3J0YW50Ci0gICAgICAgICAgICAgICAgICogZm9yIFBhcnRpdGlvblJhbmdlUmVhZENvbW1hbmQjY2hlY2tDYWNoZUZpbHRlci4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExhemlseUluaXRpYWxpemVkVW5maWx0ZXJlZFJvd0l0ZXJhdG9yKGN1cnJlbnRLZXkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGluaXRpYWxpemVJdGVyYXRvcigpCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0U2NhbiAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1NjYW5uZWQgKz0gZGZpbGUuZ2V0RmlsZVBvaW50ZXIoKSAtIHN0YXJ0U2NhbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFSYW5nZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZpbGUuc2VlayhjdXJyZW50RW50cnkucG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNjYW4gPSBkZmlsZS5nZXRGaWxlUG9pbnRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5za2lwU2hvcnRMZW5ndGgoZGZpbGUpOyAvLyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNTVGFibGVJZGVudGl0eUl0ZXJhdG9yLmNyZWF0ZShzc3RhYmxlLCBkZmlsZSwgcGFydGl0aW9uS2V5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNjYW4gPSBkZmlsZS5nZXRGaWxlUG9pbnRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdJbmRleEZpbHRlciBmaWx0ZXIgPSBkYXRhUmFuZ2UuY2x1c3RlcmluZ0luZGV4RmlsdGVyKHBhcnRpdGlvbktleSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3N0YWJsZS5yb3dJdGVyYXRvcihkZmlsZSwgcGFydGl0aW9uS2V5KCksIGN1cnJlbnRFbnRyeSwgZmlsdGVyLmdldFNsaWNlcyhCaWdUYWJsZVNjYW5uZXIudGhpcy5tZXRhZGF0YSgpKSwgY29sdW1ucywgZmlsdGVyLmlzUmV2ZXJzZWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUubWFya1N1c3BlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24oZSwgc3N0YWJsZS5nZXRGaWxlbmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGdldFJvd0l0ZXJhdG9yKFJvd0luZGV4RW50cnkgcm93SW5kZXhFbnRyeSwgRGVjb3JhdGVkS2V5IGtleSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkYXRhUmFuZ2UgPT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzc3RhYmxlLm1hcmtTdXNwZWN0KCk7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgICAgICAgICAgZGZpbGUuc2Vlayhyb3dJbmRleEVudHJ5LnBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBzdGFydFNjYW4gPSBkZmlsZS5nZXRGaWxlUG9pbnRlcigpOworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLnNraXBTaG9ydExlbmd0aChkZmlsZSk7IC8vIGtleQorICAgICAgICAgICAgICAgIHJldHVybiBTU1RhYmxlSWRlbnRpdHlJdGVyYXRvci5jcmVhdGUoc3N0YWJsZSwgZGZpbGUsIGtleSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhcnRTY2FuID0gZGZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ2x1c3RlcmluZ0luZGV4RmlsdGVyIGZpbHRlciA9IGRhdGFSYW5nZS5jbHVzdGVyaW5nSW5kZXhGaWx0ZXIoa2V5KTsKKyAgICAgICAgICAgIHJldHVybiBzc3RhYmxlLnJvd0l0ZXJhdG9yKGRmaWxlLCBrZXksIHJvd0luZGV4RW50cnksIGZpbHRlci5nZXRTbGljZXMoQmlnVGFibGVTY2FubmVyLnRoaXMubWV0YWRhdGEoKSksIGNvbHVtbnMsIGZpbHRlci5pc1JldmVyc2VkKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zOTIsNTkgKzIxMSw0IEBACiAgICAgICAgICAgICAgICAiIHNzdGFibGU9IiArIHNzdGFibGUgKwogICAgICAgICAgICAgICAgIikiOwogICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW1wdHlTU1RhYmxlU2Nhbm5lciBleHRlbmRzIEFic3RyYWN0VW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yIGltcGxlbWVudHMgSVNTVGFibGVTY2FubmVyCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKLQotICAgICAgICBwdWJsaWMgRW1wdHlTU1RhYmxlU2Nhbm5lcihTU1RhYmxlUmVhZGVyIHNzdGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc3N0YWJsZSA9IHNzdGFibGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRMZW5ndGhJbkJ5dGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEJ5dGVzU2Nhbm5lZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgZ2V0Q29tcHJlc3NlZExlbmd0aEluQnl0ZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTZXQ8U1NUYWJsZVJlYWRlcj4gZ2V0QmFja2luZ1NTVGFibGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5vZihzc3RhYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHNzdGFibGUubWV0YWRhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIG5leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0TWluTG9jYWxEZWxldGlvblRpbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRGVsZXRpb25UaW1lLkxJVkUubG9jYWxEZWxldGlvblRpbWUoKTsKLSAgICAgICAgfQotICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVNjcnViYmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVTY3J1YmJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOTkxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVTY3J1YmJlci5qYXZhCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXJyb3I7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU2NydWJiZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmV3cml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU29ydGVkVGFibGVTY3J1YmJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CisKK3B1YmxpYyBjbGFzcyBCaWdUYWJsZVNjcnViYmVyIGV4dGVuZHMgU29ydGVkVGFibGVTY3J1YmJlcjxCaWdUYWJsZVJlYWRlcj4gaW1wbGVtZW50cyBJU2NydWJiZXIKK3sKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNJbmRleDsKKworICAgIHByaXZhdGUgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGluZGV4RmlsZTsKKyAgICBwcml2YXRlIGZpbmFsIFJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyIHJvd0luZGV4RW50cnlTZXJpYWxpemVyOworCisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGN1cnJlbnRJbmRleEtleTsKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXIgbmV4dEluZGV4S2V5OworICAgIHByaXZhdGUgbG9uZyBjdXJyZW50UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXg7CisgICAgcHJpdmF0ZSBsb25nIG5leHRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleDsKKworICAgIHB1YmxpYyBCaWdUYWJsZVNjcnViYmVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgc3VwZXIoY2ZzLCB0cmFuc2FjdGlvbiwgb3V0cHV0SGFuZGxlciwgb3B0aW9ucyk7CisKKyAgICAgICAgdGhpcy5yb3dJbmRleEVudHJ5U2VyaWFsaXplciA9IG5ldyBSb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIoc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24sIHNzdGFibGUuaGVhZGVyLCBjZnMuZ2V0TWV0cmljcygpKTsKKworICAgICAgICBib29sZWFuIGhhc0luZGV4RmlsZSA9IHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCkuZXhpc3RzKCk7CisgICAgICAgIHRoaXMuaXNJbmRleCA9IGNmcy5pc0luZGV4KCk7CisgICAgICAgIGlmICghaGFzSW5kZXhGaWxlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZiB0aGVyZSdzIGFueSBjb3JydXB0aW9uIGluIHRoZSAtRGF0YS5kYiB0aGVuIHBhcnRpdGlvbnMgY2FuJ3QgYmUgc2tpcHBlZCBvdmVyLiBidXQgaXQncyB3b3J0aCBhIHNob3QuCisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIk1pc3NpbmcgY29tcG9uZW50OiAlcyIsIHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCkpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5pbmRleEZpbGUgPSBoYXNJbmRleEZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICA/IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsOworCisgICAgICAgIHRoaXMuY3VycmVudFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4ID0gMDsKKyAgICAgICAgdGhpcy5uZXh0UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXggPSAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkUm93SXRlcmF0b3Igd2l0aFZhbGlkYXRpb24oVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXIsIFN0cmluZyBmaWxlbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBvcHRpb25zLmNoZWNrRGF0YSAmJiAhaXNJbmRleCA/IFVuZmlsdGVyZWRSb3dJdGVyYXRvcnMud2l0aFZhbGlkYXRpb24oaXRlciwgZmlsZW5hbWUpIDogaXRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzY3J1YkludGVybmFsKFNTVGFibGVSZXdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIG5leHRJbmRleEtleSA9IGluZGV4QXZhaWxhYmxlKCkgPyBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluZGV4RmlsZSkgOiBudWxsOworICAgICAgICAgICAgaWYgKGluZGV4QXZhaWxhYmxlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gdGhyb3cgYXdheSB2YXJpYWJsZSwgc28gd2UgZG9uJ3QgaGF2ZSBhIHNpZGUgZWZmZWN0IGluIHRoZSBhc3NlcnRpb24KKyAgICAgICAgICAgICAgICBsb25nIGZpcnN0Um93UG9zaXRpb25Gcm9tSW5kZXggPSByb3dJbmRleEVudHJ5U2VyaWFsaXplci5kZXNlcmlhbGl6ZVBvc2l0aW9uQW5kU2tpcChpbmRleEZpbGUpOworICAgICAgICAgICAgICAgIGFzc2VydCBmaXJzdFJvd1Bvc2l0aW9uRnJvbUluZGV4ID09IDAgOiBmaXJzdFJvd1Bvc2l0aW9uRnJvbUluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93SWZGYXRhbChleCk7CisgICAgICAgICAgICBuZXh0SW5kZXhLZXkgPSBudWxsOworICAgICAgICAgICAgbmV4dFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4ID0gZGF0YUZpbGUubGVuZ3RoKCk7CisgICAgICAgICAgICBpZiAoaW5kZXhGaWxlICE9IG51bGwpCisgICAgICAgICAgICAgICAgaW5kZXhGaWxlLnNlZWsoaW5kZXhGaWxlLmxlbmd0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIERlY29yYXRlZEtleSBwcmV2S2V5ID0gbnVsbDsKKworICAgICAgICB3aGlsZSAoIWRhdGFGaWxlLmlzRU9GKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzY3J1YkluZm8uaXNTdG9wUmVxdWVzdGVkKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbihzY3J1YkluZm8uZ2V0Q29tcGFjdGlvbkluZm8oKSk7CisKKyAgICAgICAgICAgIGxvbmcgcGFydGl0aW9uU3RhcnQgPSBkYXRhRmlsZS5nZXRGaWxlUG9pbnRlcigpOworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1ZygiUmVhZGluZyByb3cgYXQgJWQiLCBwYXJ0aXRpb25TdGFydCk7CisKKyAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBudWxsOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciByYXcgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGRhdGFGaWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNmcy5tZXRhZGF0YS5nZXRMb2NhbCgpLmlzSW5kZXgoKSkKKyAgICAgICAgICAgICAgICAgICAgY2ZzLm1ldGFkYXRhLmdldExvY2FsKCkucGFydGl0aW9uS2V5VHlwZS52YWxpZGF0ZShyYXcpOworICAgICAgICAgICAgICAgIGtleSA9IHNzdGFibGUuZGVjb3JhdGVLZXkocmF3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3dJZkZhdGFsKHRoKTsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgbnVsbCBrZXkgYmVsb3cKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9uZyBkYXRhU3RhcnRGcm9tSW5kZXggPSAtMTsKKyAgICAgICAgICAgIGxvbmcgZGF0YVNpemVGcm9tSW5kZXggPSAtMTsKKyAgICAgICAgICAgIHVwZGF0ZUluZGV4S2V5KCk7CisKKyAgICAgICAgICAgIGlmIChpbmRleEF2YWlsYWJsZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXhLZXkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRhdGFTdGFydEZyb21JbmRleCA9IGN1cnJlbnRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCArIDIgKyBjdXJyZW50SW5kZXhLZXkucmVtYWluaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplRnJvbUluZGV4ID0gbmV4dFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4IC0gZGF0YVN0YXJ0RnJvbUluZGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9uZyBkYXRhU3RhcnQgPSBkYXRhRmlsZS5nZXRGaWxlUG9pbnRlcigpOworCisgICAgICAgICAgICBTdHJpbmcga2V5TmFtZSA9IGtleSA9PSBudWxsID8gIih1bnJlYWRhYmxlIGtleSkiIDoga2V5U3RyaW5nKGtleSk7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKCJwYXJ0aXRpb24gJXMgaXMgJXMiLCBrZXlOYW1lLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShkYXRhU2l6ZUZyb21JbmRleCkpOworICAgICAgICAgICAgYXNzZXJ0IGN1cnJlbnRJbmRleEtleSAhPSBudWxsIHx8ICFpbmRleEF2YWlsYWJsZSgpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0Vycm9yKG5ldyBJT0V4Y2VwdGlvbigiVW5hYmxlIHRvIHJlYWQgcGFydGl0aW9uIGtleSBmcm9tIGRhdGEgZmlsZSIpKTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXhLZXkgIT0gbnVsbCAmJiAha2V5LmdldEtleSgpLmVxdWFscyhjdXJyZW50SW5kZXhLZXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXJyb3IobmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIktleSBmcm9tIGRhdGEgZmlsZSAoJXMpIGRvZXMgbm90IG1hdGNoIGtleSBmcm9tIGluZGV4IGZpbGUgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChrZXkuZ2V0S2V5KCkpLCBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGN1cnJlbnRJbmRleEtleSkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfdG9vIGJpZ18iLCBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGN1cnJlbnRJbmRleEtleSkpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGluZGV4RmlsZSAhPSBudWxsICYmIGRhdGFTaXplRnJvbUluZGV4ID4gZGF0YUZpbGUubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0Vycm9yKG5ldyBJT0V4Y2VwdGlvbigiSW1wb3NzaWJsZSBwYXJ0aXRpb24gc2l6ZSAoZ3JlYXRlciB0aGFuIGZpbGUgbGVuZ3RoKTogIiArIGRhdGFTaXplRnJvbUluZGV4KSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXhGaWxlICE9IG51bGwgJiYgZGF0YVN0YXJ0ICE9IGRhdGFTdGFydEZyb21JbmRleCkKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCJEYXRhIGZpbGUgcGFydGl0aW9uIHBvc2l0aW9uICVkIGRpZmZlcnMgZnJvbSBpbmRleCBmaWxlIHJvdyBwb3NpdGlvbiAlZCIsIGRhdGFTdGFydCwgZGF0YVN0YXJ0RnJvbUluZGV4KTsKKworICAgICAgICAgICAgICAgIGlmICh0cnlBcHBlbmQocHJldktleSwga2V5LCB3cml0ZXIpKQorICAgICAgICAgICAgICAgICAgICBwcmV2S2V5ID0ga2V5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvd0lmRmF0YWwodGgpOworICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0aCwgIkVycm9yIHJlYWRpbmcgcGFydGl0aW9uICVzIChzdGFja3RyYWNlIGZvbGxvd3MpOiIsIGtleU5hbWUpOworCisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleEtleSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIChrZXkgPT0gbnVsbCB8fCAha2V5LmdldEtleSgpLmVxdWFscyhjdXJyZW50SW5kZXhLZXkpIHx8IGRhdGFTdGFydCAhPSBkYXRhU3RhcnRGcm9tSW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiUmV0cnlpbmcgZnJvbSBwYXJ0aXRpb24gaW5kZXg7IGRhdGEgaXMgJXMgYnl0ZXMgc3RhcnRpbmcgYXQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZUZyb21JbmRleCwgZGF0YVN0YXJ0RnJvbUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gc3N0YWJsZS5kZWNvcmF0ZUtleShjdXJyZW50SW5kZXhLZXkpOworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjZnMubWV0YWRhdGEuZ2V0TG9jYWwoKS5pc0luZGV4KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLm1ldGFkYXRhLmdldExvY2FsKCkucGFydGl0aW9uS2V5VHlwZS52YWxpZGF0ZShrZXkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUZpbGUuc2VlayhkYXRhU3RhcnRGcm9tSW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJ5QXBwZW5kKHByZXZLZXksIGtleSwgd3JpdGVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2S2V5ID0ga2V5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdGgyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0lmRmF0YWwodGgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93SWZDYW5ub3RDb250aW51ZShrZXksIHRoMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0aDIsICJSZXRyeSBmYWlsZWQgdG9vLiBTa2lwcGluZyB0byBuZXh0IHBhcnRpdGlvbiAocmV0cnkncyBzdGFja3RyYWNlIGZvbGxvd3MpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBiYWRQYXJ0aXRpb25zKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlZWtUb05leHRQYXJ0aXRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvd0lmQ2Fubm90Q29udGludWUoa2V5LCB0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCJQYXJ0aXRpb24gc3RhcnRpbmcgYXQgcG9zaXRpb24gJWQgaXMgdW5yZWFkYWJsZTsgc2tpcHBpbmcgdG8gbmV4dCIsIGRhdGFTdGFydCk7CisgICAgICAgICAgICAgICAgICAgIGJhZFBhcnRpdGlvbnMrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleEtleSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWVrVG9OZXh0UGFydGl0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUluZGV4S2V5KCkKKyAgICB7CisgICAgICAgIGN1cnJlbnRJbmRleEtleSA9IG5leHRJbmRleEtleTsKKyAgICAgICAgY3VycmVudFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4ID0gbmV4dFBhcnRpdGlvblBvc2l0aW9uRnJvbUluZGV4OworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgbmV4dEluZGV4S2V5ID0gIWluZGV4QXZhaWxhYmxlKCkgPyBudWxsIDogQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbmRleEZpbGUpOworCisgICAgICAgICAgICBuZXh0UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXggPSAhaW5kZXhBdmFpbGFibGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkYXRhRmlsZS5sZW5ndGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByb3dJbmRleEVudHJ5U2VyaWFsaXplci5kZXNlcmlhbGl6ZVBvc2l0aW9uQW5kU2tpcChpbmRleEZpbGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpWTVN0YWJpbGl0eUluc3BlY3Rvci5pbnNwZWN0VGhyb3dhYmxlKHRoKTsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0aCwgIkVycm9yIHJlYWRpbmcgaW5kZXggZmlsZSIpOworICAgICAgICAgICAgbmV4dEluZGV4S2V5ID0gbnVsbDsKKyAgICAgICAgICAgIG5leHRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCA9IGRhdGFGaWxlLmxlbmd0aCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGluZGV4QXZhaWxhYmxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmRleEZpbGUgIT0gbnVsbCAmJiAhaW5kZXhGaWxlLmlzRU9GKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNlZWtUb05leHRQYXJ0aXRpb24oKQorICAgIHsKKyAgICAgICAgd2hpbGUgKG5leHRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCA8IGRhdGFGaWxlLmxlbmd0aCgpKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYXRhRmlsZS5zZWVrKG5leHRQYXJ0aXRpb25Qb3NpdGlvbkZyb21JbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93SWZGYXRhbCh0aCk7CisgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKHRoLCAiRmFpbGVkIHRvIHNlZWsgdG8gbmV4dCBwYXJ0aXRpb24gcG9zaXRpb24gJWQiLCBuZXh0UGFydGl0aW9uUG9zaXRpb25Gcm9tSW5kZXgpOworICAgICAgICAgICAgICAgIGJhZFBhcnRpdGlvbnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdXBkYXRlSW5kZXhLZXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0aHJvd0lmQ2Fubm90Q29udGludWUoRGVjb3JhdGVkS2V5IGtleSwgVGhyb3dhYmxlIHRoKQorICAgIHsKKyAgICAgICAgaWYgKGlzSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgc2NydWJiaW5nIHRoZSBwYXJ0aXRpb24gd2l0aCBrZXkgJyVzJyBmb3IgYW4gaW5kZXggdGFibGUuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTY3J1YmJpbmcgd2lsbCBhYm9ydCBmb3IgdGhpcyB0YWJsZSBhbmQgdGhlIGluZGV4IHdpbGwgYmUgcmVidWlsdC4iLCBrZXlTdHJpbmcoa2V5KSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FcnJvcih0aCk7CisgICAgICAgIH0KKworICAgICAgICBzdXBlci50aHJvd0lmQ2Fubm90Q29udGludWUoa2V5LCB0aCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgZmlsZUFjY2Vzc0xvY2sud3JpdGVMb2NrKCkubG9jaygpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShkYXRhRmlsZSk7CisgICAgICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGluZGV4RmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBmaWxlQWNjZXNzTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVZlcmlmaWVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVWZXJpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZGYzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvQmlnVGFibGVWZXJpZmllci5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVZlcmlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU29ydGVkVGFibGVWZXJpZmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKKworcHVibGljIGNsYXNzIEJpZ1RhYmxlVmVyaWZpZXIgZXh0ZW5kcyBTb3J0ZWRUYWJsZVZlcmlmaWVyPEJpZ1RhYmxlUmVhZGVyPiBpbXBsZW1lbnRzIElWZXJpZmllcgoreworICAgIHB1YmxpYyBCaWdUYWJsZVZlcmlmaWVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywgQmlnVGFibGVSZWFkZXIgc3N0YWJsZSwgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyLCBib29sZWFuIGlzT2ZmbGluZSwgT3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgc3VwZXIoY2ZzLCBzc3RhYmxlLCBvdXRwdXRIYW5kbGVyLCBpc09mZmxpbmUsIG9wdGlvbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeVBhcnRpdGlvbihEZWNvcmF0ZWRLZXkga2V5LCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IpCisgICAgeworICAgICAgICBSb3cgZmlyc3QgPSBudWxsOworICAgICAgICBpbnQgZHVwbGljYXRlUm93cyA9IDA7CisgICAgICAgIGxvbmcgbWluVGltZXN0YW1wID0gTG9uZy5NQVhfVkFMVUU7CisgICAgICAgIGxvbmcgbWF4VGltZXN0YW1wID0gTG9uZy5NSU5fVkFMVUU7CisgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFVuZmlsdGVyZWQgdWYgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBpZiAodWYuaXNSb3coKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSb3cgcm93ID0gKFJvdykgdWY7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0ICE9IG51bGwgJiYgZmlyc3QuY2x1c3RlcmluZygpLmVxdWFscyhyb3cuY2x1c3RlcmluZygpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZVJvd3MrKzsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChDZWxsIGNlbGwgOiByb3cuY2VsbHMoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4VGltZXN0YW1wID0gTWF0aC5tYXgoY2VsbC50aW1lc3RhbXAoKSwgbWF4VGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pblRpbWVzdGFtcCA9IE1hdGgubWluKGNlbGwudGltZXN0YW1wKCksIG1pblRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGR1cGxpY2F0ZVJvd3MgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nRHVwbGljYXRlcyhrZXksIGZpcnN0LCBkdXBsaWNhdGVSb3dzLCBtaW5UaW1lc3RhbXAsIG1heFRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZVJvd3MgPSAwOworICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IHJvdzsKKyAgICAgICAgICAgICAgICAgICAgbWF4VGltZXN0YW1wID0gTG9uZy5NSU5fVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIG1pblRpbWVzdGFtcCA9IExvbmcuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZHVwbGljYXRlUm93cyA+IDApCisgICAgICAgICAgICBsb2dEdXBsaWNhdGVzKGtleSwgZmlyc3QsIGR1cGxpY2F0ZVJvd3MsIG1pblRpbWVzdGFtcCwgbWF4VGltZXN0YW1wKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5SW5kZXhTdW1tYXJ5KCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKCJEZXNlcmlhbGl6aW5nIGluZGV4IHN1bW1hcnkgZm9yICVzIiwgc3N0YWJsZSk7CisgICAgICAgICAgICBkZXNlcmlhbGl6ZUluZGV4U3VtbWFyeShzc3RhYmxlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIub3V0cHV0KCJJbmRleCBzdW1tYXJ5IGlzIGNvcnJ1cHQgLSBpZiBpdCBpcyByZW1vdmVkIGl0IHdpbGwgZ2V0IHJlYnVpbHQgb24gc3RhcnR1cCAlcyIsIHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1VNTUFSWSkpOworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKHQpOworICAgICAgICAgICAgbWFya0FuZFRocm93KHQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeUluZGV4KCkKKyAgICB7CisgICAgICAgIHZlcmlmeUluZGV4U3VtbWFyeSgpOworICAgICAgICBzdXBlci52ZXJpZnlJbmRleCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2dEdXBsaWNhdGVzKERlY29yYXRlZEtleSBrZXksIFJvdyBmaXJzdCwgaW50IGR1cGxpY2F0ZVJvd3MsIGxvbmcgbWluVGltZXN0YW1wLCBsb25nIG1heFRpbWVzdGFtcCkKKyAgICB7CisgICAgICAgIFN0cmluZyBrZXlTdHJpbmcgPSBzc3RhYmxlLm1ldGFkYXRhKCkucGFydGl0aW9uS2V5VHlwZS5nZXRTdHJpbmcoa2V5LmdldEtleSgpKTsKKyAgICAgICAgbG9uZyBmaXJzdE1heFRzID0gTG9uZy5NSU5fVkFMVUU7CisgICAgICAgIGxvbmcgZmlyc3RNaW5UcyA9IExvbmcuTUFYX1ZBTFVFOworICAgICAgICBmb3IgKENlbGwgY2VsbCA6IGZpcnN0LmNlbGxzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0TWF4VHMgPSBNYXRoLm1heChmaXJzdE1heFRzLCBjZWxsLnRpbWVzdGFtcCgpKTsKKyAgICAgICAgICAgIGZpcnN0TWluVHMgPSBNYXRoLm1pbihmaXJzdE1pblRzLCBjZWxsLnRpbWVzdGFtcCgpKTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXRIYW5kbGVyLm91dHB1dCgiJWQgZHVwbGljYXRlIHJvd3MgZm91bmQgZm9yIFslcyAlc10gaW4gJXMuJXMgKCVzKSwgdGltZXN0YW1wczogW2ZpcnN0IHJvdyAoJXMsICVzKV0sIFtkdXBsaWNhdGVzICglcywgJXMsIGVxOiViKV0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVSb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTdHJpbmcsIGZpcnN0LmNsdXN0ZXJpbmcoKS50b1N0cmluZyhzc3RhYmxlLm1ldGFkYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLm1ldGFkYXRhKCkua2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUubWV0YWRhdGEoKS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlU3RyaW5nKGZpcnN0TWluVHMpLCBkYXRlU3RyaW5nKGZpcnN0TWF4VHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlU3RyaW5nKG1pblRpbWVzdGFtcCksIGRhdGVTdHJpbmcobWF4VGltZXN0YW1wKSwgbWluVGltZXN0YW1wID09IG1heFRpbWVzdGFtcCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZGF0ZVN0cmluZyhsb25nIHRpbWUpCisgICAgeworICAgICAgICByZXR1cm4gSW5zdGFudC5vZkVwb2NoTWlsbGkoVGltZVVuaXQuTUlDUk9TRUNPTkRTLnRvTWlsbGlzKHRpbWUpKS50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZXNlcmlhbGl6ZUluZGV4U3VtbWFyeShTU1RhYmxlUmVhZGVyIHNzdGFibGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSW5kZXhTdW1tYXJ5Q29tcG9uZW50IHN1bW1hcnlDb21wb25lbnQgPSBJbmRleFN1bW1hcnlDb21wb25lbnQubG9hZChzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlNVTU1BUlkpLCBjZnMubWV0YWRhdGEoKSk7CisgICAgICAgIGlmIChzdW1tYXJ5Q29tcG9uZW50ID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRmlsZUV4Y2VwdGlvbigiSW5kZXggc3VtbWFyeSBjb21wb25lbnQgb2Ygc3N0YWJsZSAiICsgc3N0YWJsZS5kZXNjcmlwdG9yICsgIiBpcyBtaXNzaW5nIik7CisgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkoc3VtbWFyeUNvbXBvbmVudC5pbmRleFN1bW1hcnkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlV3JpdGVyLmphdmEKaW5kZXggZThkZmYzMi4uNWFlNTJjZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlV3JpdGVyLmphdmEKQEAgLTE3LDUzOSArMTcsMjY4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOwogCi0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZU5ld1RyYWNrZXI7Ci0KK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkNodW5rQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyYW5zZm9ybS5UcmFuc2Zvcm1hdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5JTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZU5ld1RyYWNrZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLklDb21wcmVzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRmx1c2hPYnNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Eb3duc2FtcGxpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkRhdGFDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuSW5kZXhDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuU2hhcmVkQ2xvc2VhYmxlSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlRyYW5zYWN0aW9uYWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU29ydGVkVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5LkluZGV4U3VtbWFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5rZXljYWNoZS5LZXlDYWNoZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuTW1hcHBlZFJlZ2lvbnNDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DYWNoZVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLklGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlLkJ1aWxkZXIuTk9fTEVOR1RIX09WRVJSSURFOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CiAKLXB1YmxpYyBjbGFzcyBCaWdUYWJsZVdyaXRlciBleHRlbmRzIFNTVGFibGVXcml0ZXIKK3B1YmxpYyBjbGFzcyBCaWdUYWJsZVdyaXRlciBleHRlbmRzIFNvcnRlZFRhYmxlV3JpdGVyPEJpZ0Zvcm1hdFBhcnRpdGlvbldyaXRlcj4KIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQmlnVGFibGVXcml0ZXIuY2xhc3MpOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBDb2x1bW5JbmRleCBjb2x1bW5JbmRleFdyaXRlcjsKLSAgICBwcml2YXRlIGZpbmFsIEluZGV4V3JpdGVyIGl3cml0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBGaWxlSGFuZGxlLkJ1aWxkZXIgZGJ1aWxkZXI7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXIgZGF0YUZpbGU7Ci0gICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgbGFzdFdyaXR0ZW5LZXk7Ci0gICAgcHJpdmF0ZSBEYXRhUG9zaXRpb24gZGF0YU1hcms7Ci0gICAgcHJpdmF0ZSBsb25nIGxhc3RFYXJseU9wZW5MZW5ndGggPSAwOwotICAgIHByaXZhdGUgZmluYWwgT3B0aW9uYWw8Q2h1bmtDYWNoZT4gY2h1bmtDYWNoZSA9IE9wdGlvbmFsLm9mTnVsbGFibGUoQ2h1bmtDYWNoZS5pbnN0YW5jZSk7CisgICAgcHJpdmF0ZSBmaW5hbCBJbmRleFdyaXRlciBpbmRleFdyaXRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyIHJvd0luZGV4RW50cnlTZXJpYWxpemVyOworICAgIHByaXZhdGUgZmluYWwgTWFwPERlY29yYXRlZEtleSwgQWJzdHJhY3RSb3dJbmRleEVudHJ5PiBjYWNoZWRLZXlzID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBzaG91bGRNaWdyYXRlS2V5Q2FjaGU7CiAKLSAgICBwcml2YXRlIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24gd3JpdGVyT3B0aW9uID0gU2VxdWVudGlhbFdyaXRlck9wdGlvbi5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyaWNrbGVGc3luYyhEYXRhYmFzZURlc2NyaXB0b3IuZ2V0VHJpY2tsZUZzeW5jKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmlja2xlRnN5bmNCeXRlSW50ZXJ2YWwoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFRyaWNrbGVGc3luY0ludGVydmFsSW5LaUIoKSAqIDEwMjQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgcHVibGljIEJpZ1RhYmxlV3JpdGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBrZXlDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyByZXBhaXJlZEF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzVHJhbnNpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBtZXRhZGF0YUNvbGxlY3RvciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFNTVGFibGVGbHVzaE9ic2VydmVyPiBvYnNlcnZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlcikKKyAgICBwdWJsaWMgQmlnVGFibGVXcml0ZXIoQnVpbGRlciBidWlsZGVyLCBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIsIFNTVGFibGUuT3duZXIgb3duZXIpCiAgICAgewotICAgICAgICBzdXBlcihkZXNjcmlwdG9yLCBrZXlDb3VudCwgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgaXNUcmFuc2llbnQsIG1ldGFkYXRhLCBtZXRhZGF0YUNvbGxlY3RvciwgaGVhZGVyLCBvYnNlcnZlcnMpOwotICAgICAgICBsaWZlY3ljbGVOZXdUcmFja2VyLnRyYWNrTmV3KHRoaXMpOyAvLyBtdXN0IHRyYWNrIGJlZm9yZSBhbnkgZmlsZXMgYXJlIGNyZWF0ZWQKKyAgICAgICAgc3VwZXIoYnVpbGRlciwgbGlmZWN5Y2xlTmV3VHJhY2tlciwgb3duZXIpOworICAgICAgICBjaGVja05vdE51bGwoYnVpbGRlci5nZXRSb3dJbmRleEVudHJ5U2VyaWFsaXplcigpKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGJ1aWxkZXIuZ2V0SW5kZXhXcml0ZXIoKSk7CiAKLSAgICAgICAgaWYgKGNvbXByZXNzaW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBDb21wcmVzc2lvblBhcmFtcyBjb21wcmVzc2lvblBhcmFtcyA9IGNvbXByZXNzaW9uRm9yKGxpZmVjeWNsZU5ld1RyYWNrZXIub3BUeXBlKCkpOwotCi0gICAgICAgICAgICBkYXRhRmlsZSA9IG5ldyBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcihuZXcgRmlsZShnZXRGaWxlbmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkNPTVBSRVNTSU9OX0lORk8pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuRElHRVNUKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXJPcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhQ29sbGVjdG9yKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRhdGFGaWxlID0gbmV3IENoZWNrc3VtbWVkU2VxdWVudGlhbFdyaXRlcihuZXcgRmlsZShnZXRGaWxlbmFtZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuQ1JDKSksCi0gICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRJR0VTVCkpLAotICAgICAgICAgICAgICAgICAgICB3cml0ZXJPcHRpb24pOwotICAgICAgICB9Ci0gICAgICAgIGRidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSkuY29tcHJlc3NlZChjb21wcmVzc2lvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubW1hcHBlZChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGlza0FjY2Vzc01vZGUoKSA9PSBDb25maWcuRGlza0FjY2Vzc01vZGUubW1hcCk7Ci0gICAgICAgIGNodW5rQ2FjaGUuaWZQcmVzZW50KGRidWlsZGVyOjp3aXRoQ2h1bmtDYWNoZSk7Ci0gICAgICAgIGl3cml0ZXIgPSBuZXcgSW5kZXhXcml0ZXIoa2V5Q291bnQpOwotCi0gICAgICAgIGNvbHVtbkluZGV4V3JpdGVyID0gbmV3IENvbHVtbkluZGV4KHRoaXMuaGVhZGVyLCBkYXRhRmlsZSwgZGVzY3JpcHRvci52ZXJzaW9uLCB0aGlzLm9ic2VydmVycywgZ2V0Um93SW5kZXhFbnRyeVNlcmlhbGl6ZXIoKS5pbmRleEluZm9TZXJpYWxpemVyKCkpOworICAgICAgICB0aGlzLnJvd0luZGV4RW50cnlTZXJpYWxpemVyID0gYnVpbGRlci5nZXRSb3dJbmRleEVudHJ5U2VyaWFsaXplcigpOworICAgICAgICB0aGlzLmluZGV4V3JpdGVyID0gYnVpbGRlci5nZXRJbmRleFdyaXRlcigpOworICAgICAgICB0aGlzLnNob3VsZE1pZ3JhdGVLZXlDYWNoZSA9IERhdGFiYXNlRGVzY3JpcHRvci5zaG91bGRNaWdyYXRlS2V5Y2FjaGVPbkNvbXBhY3Rpb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxpZmVjeWNsZU5ld1RyYWNrZXIgaW5zdGFuY2VvZiBJTGlmZWN5Y2xlVHJhbnNhY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhKChJTGlmZWN5Y2xlVHJhbnNhY3Rpb24pIGxpZmVjeWNsZU5ld1RyYWNrZXIpLmlzT2ZmbGluZSgpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEdpdmVuIGFuIE9wVHlwZSwgZGV0ZXJtaW5lIHRoZSBjb3JyZWN0IENvbXByZXNzaW9uIFBhcmFtZXRlcnMKLSAgICAgKiBAcGFyYW0gb3BUeXBlCi0gICAgICogQHJldHVybiB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXByZXNzaW9uUGFyYW1zfQotICAgICAqLwotICAgIHByaXZhdGUgQ29tcHJlc3Npb25QYXJhbXMgY29tcHJlc3Npb25Gb3IoZmluYWwgT3BlcmF0aW9uVHlwZSBvcFR5cGUpCi0gICAgewotICAgICAgICBDb21wcmVzc2lvblBhcmFtcyBjb21wcmVzc2lvblBhcmFtcyA9IG1ldGFkYXRhLmdldExvY2FsKCkucGFyYW1zLmNvbXByZXNzaW9uOwotICAgICAgICBmaW5hbCBJQ29tcHJlc3NvciBjb21wcmVzc29yID0gY29tcHJlc3Npb25QYXJhbXMuZ2V0U3N0YWJsZUNvbXByZXNzb3IoKTsKLQotICAgICAgICBpZiAobnVsbCAhPSBjb21wcmVzc29yICYmIG9wVHlwZSA9PSBPcGVyYXRpb25UeXBlLkZMVVNIKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBmbHVzaGluZyBvdXQgb2YgdGhlIG1lbXRhYmxlIHRocm91Z2hwdXQgb2YgdGhlIGNvbXByZXNzb3IgaXMgY3JpdGljYWwgYXMgZmx1c2hlcywKLSAgICAgICAgICAgIC8vIGVzcGVjaWFsbHkgb2YgbGFyZ2UgdGFibGVzLCBjYW4gcXVldWUgdXAgYW5kIHBvdGVudGlhbGx5IGJsb2NrIHdyaXRlcy4KLSAgICAgICAgICAgIC8vIFRoaXMgb3B0aW1pemF0aW9uIGFsbG93cyB1cyB0byBmYWxsIGJhY2sgdG8gYSBmYXN0ZXIgY29tcHJlc3NvciBpZiBhIHBhcnRpY3VsYXIKLSAgICAgICAgICAgIC8vIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbmRpY2F0ZXMgd2Ugc2hvdWxkLiBTZWUgQ0FTU0FORFJBLTE1Mzc5IGZvciBtb3JlIGRldGFpbHMuCi0gICAgICAgICAgICBzd2l0Y2ggKERhdGFiYXNlRGVzY3JpcHRvci5nZXRGbHVzaENvbXByZXNzaW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gSXQgaXMgcmVsYXRpdmVseSBlYXNpZXIgdG8gaW5zZXJ0IGEgTm9vcCBjb21wcmVzc29yIHRoYW4gdG8gZGlzYWJsZSBjb21wcmVzc2VkIHdyaXRpbmcKLSAgICAgICAgICAgICAgICAvLyBlbnRpcmVseSBhcyB0aGUgImNvbXByZXNzaW9uIiBtZW1iZXIgZmllbGQgaXMgcHJvdmlkZWQgb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyBjbGFzcy4KLSAgICAgICAgICAgICAgICAvLyBJdCBtYXkgbWFrZSBzZW5zZSBpbiB0aGUgZnV0dXJlIHRvIHJlZmFjdG9yIHRoZSBvd25lcnNoaXAgb2YgdGhlIGNvbXByZXNzaW9uIGZsYWcgc28gdGhhdAotICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBieXBhc3MgdGhlIENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyIGluIHRoaXMgY2FzZSBlbnRpcmVseS4KLSAgICAgICAgICAgICAgICBjYXNlIG5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uUGFyYW1zID0gQ29tcHJlc3Npb25QYXJhbXMuTk9PUDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBmYXN0OgotICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXByZXNzb3IucmVjb21tZW5kZWRVc2VzKCkuY29udGFpbnMoSUNvbXByZXNzb3IuVXNlcy5GQVNUX0NPTVBSRVNTSU9OKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgY29tcHJlc3NvciBpcyBnZW5lcmFsbHkgZmFzdCAoTFo0IHdpdGggMTZLaUIgYmxvY2sgc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uUGFyYW1zID0gQ29tcHJlc3Npb25QYXJhbXMuREVGQVVMVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSB0YWJsZToKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21wcmVzc2lvblBhcmFtczsKLSAgICB9Ci0KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBtYXJrKCkKICAgICB7Ci0gICAgICAgIGRhdGFNYXJrID0gZGF0YUZpbGUubWFyaygpOwotICAgICAgICBpd3JpdGVyLm1hcmsoKTsKKyAgICAgICAgc3VwZXIubWFyaygpOworICAgICAgICBpbmRleFdyaXRlci5tYXJrKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcmVzZXRBbmRUcnVuY2F0ZSgpCiAgICAgewotICAgICAgICBkYXRhRmlsZS5yZXNldEFuZFRydW5jYXRlKGRhdGFNYXJrKTsKLSAgICAgICAgaXdyaXRlci5yZXNldEFuZFRydW5jYXRlKCk7CisgICAgICAgIHN1cGVyLnJlc2V0QW5kVHJ1bmNhdGUoKTsKKyAgICAgICAgaW5kZXhXcml0ZXIucmVzZXRBbmRUcnVuY2F0ZSgpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFBlcmZvcm0gc2FuaXR5IGNoZWNrcyBvbiBAcGFyYW0gZGVjb3JhdGVkS2V5IGFuZCBAcmV0dXJuIHRoZSBwb3NpdGlvbiBpbiB0aGUgZGF0YSBmaWxlIGJlZm9yZSBhbnkgZGF0YSBpcyB3cml0dGVuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGxvbmcgYmVmb3JlQXBwZW5kKERlY29yYXRlZEtleSBkZWNvcmF0ZWRLZXkpCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25TdGFydFBhcnRpdGlvbihEZWNvcmF0ZWRLZXkga2V5KQogICAgIHsKLSAgICAgICAgYXNzZXJ0IGRlY29yYXRlZEtleSAhPSBudWxsIDogIktleXMgbXVzdCBub3QgYmUgbnVsbCI7IC8vIGVtcHR5IGtleXMgQVJFIGFsbG93ZWQgYi9jIG9mIGluZGV4ZWQgY29sdW1uIHZhbHVlcwotICAgICAgICBpZiAobGFzdFdyaXR0ZW5LZXkgIT0gbnVsbCAmJiBsYXN0V3JpdHRlbktleS5jb21wYXJlVG8oZGVjb3JhdGVkS2V5KSA+PSAwKQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkxhc3Qgd3JpdHRlbiBrZXkgIiArIGxhc3RXcml0dGVuS2V5ICsgIiA+PSBjdXJyZW50IGtleSAiICsgZGVjb3JhdGVkS2V5ICsgIiB3cml0aW5nIGludG8gIiArIGdldEZpbGVuYW1lKCkpOwotICAgICAgICByZXR1cm4gKGxhc3RXcml0dGVuS2V5ID09IG51bGwpID8gMCA6IGRhdGFGaWxlLnBvc2l0aW9uKCk7CisgICAgICAgIG5vdGlmeU9ic2VydmVycyhvIC0+IG8uc3RhcnRQYXJ0aXRpb24oa2V5LCBwYXJ0aXRpb25Xcml0ZXIuZ2V0SW5pdGlhbFBvc2l0aW9uKCksIGluZGV4V3JpdGVyLndyaXRlci5wb3NpdGlvbigpKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGFmdGVyQXBwZW5kKERlY29yYXRlZEtleSBkZWNvcmF0ZWRLZXksIGxvbmcgZGF0YUVuZCwgUm93SW5kZXhFbnRyeSBpbmRleCwgQnl0ZUJ1ZmZlciBpbmRleEluZm8pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSb3dJbmRleEVudHJ5IGNyZWF0ZVJvd0luZGV4RW50cnkoRGVjb3JhdGVkS2V5IGtleSwgRGVsZXRpb25UaW1lIHBhcnRpdGlvbkxldmVsRGVsZXRpb24sIGxvbmcgZmluaXNoUmVzdWx0KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIG1ldGFkYXRhQ29sbGVjdG9yLmFkZEtleShkZWNvcmF0ZWRLZXkuZ2V0S2V5KCkpOwotICAgICAgICBsYXN0V3JpdHRlbktleSA9IGRlY29yYXRlZEtleTsKLSAgICAgICAgbGFzdCA9IGxhc3RXcml0dGVuS2V5OwotICAgICAgICBpZiAoZmlyc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIGZpcnN0ID0gbGFzdFdyaXR0ZW5LZXk7CisgICAgICAgIC8vIGFmdGVyQXBwZW5kKCkgd3JpdGVzIHRoZSBwYXJ0aXRpb24ga2V5IGJlZm9yZSB0aGUgZmlyc3QgUm93SW5kZXhFbnRyeSAtIHNvIHdlIGhhdmUgdG8gYWRkIGl0J3MKKyAgICAgICAgLy8gc2VyaWFsaXplZCBzaXplIHRvIHRoZSBpbmRleC13cml0ZXIgcG9zaXRpb24KKyAgICAgICAgbG9uZyBpbmRleEZpbGVQb3NpdGlvbiA9IEJ5dGVCdWZmZXJVdGlsLnNlcmlhbGl6ZWRTaXplV2l0aFNob3J0TGVuZ3RoKGtleS5nZXRLZXkoKSkgKyBpbmRleFdyaXRlci53cml0ZXIucG9zaXRpb24oKTsKIAotICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkpCi0gICAgICAgICAgICBsb2dnZXIudHJhY2UoIndyb3RlIHt9IGF0IHt9IiwgZGVjb3JhdGVkS2V5LCBkYXRhRW5kKTsKLSAgICAgICAgaXdyaXRlci5hcHBlbmQoZGVjb3JhdGVkS2V5LCBpbmRleCwgZGF0YUVuZCwgaW5kZXhJbmZvKTsKLSAgICB9CisgICAgICAgIFJvd0luZGV4RW50cnkgZW50cnkgPSBSb3dJbmRleEVudHJ5LmNyZWF0ZShwYXJ0aXRpb25Xcml0ZXIuZ2V0SW5pdGlhbFBvc2l0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEZpbGVQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbkxldmVsRGVsZXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIuZ2V0SGVhZGVyTGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIuZ2V0Q29sdW1uSW5kZXhDb3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uV3JpdGVyLmluZGV4SW5mb1NlcmlhbGl6ZWRTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIuaW5kZXhTYW1wbGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIub2Zmc2V0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuaW5kZXhJbmZvU2VyaWFsaXplcigpKTsKIAotICAgIC8qKgotICAgICAqIEFwcGVuZHMgcGFydGl0aW9uIGRhdGEgdG8gdGhpcyB3cml0ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlcmF0b3IgdGhlIHBhcnRpdGlvbiB0byB3cml0ZQotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgaW5kZXggZW50cnkgaWYgc29tZXRoaW5nIHdhcyB3cml0dGVuLCB0aGF0IGlzIGlmIHtAY29kZSBpdGVyYXRvcn0KLSAgICAgKiB3YXNuJ3QgZW1wdHksIHtAY29kZSBudWxsfSBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIEZTV3JpdGVFcnJvciBpZiBhIHdyaXRlIHRvIHRoZSBkYXRhRmlsZSBmYWlscwotICAgICAqLwotICAgIHB1YmxpYyBSb3dJbmRleEVudHJ5IGFwcGVuZChVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IpCi0gICAgewotICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gaXRlcmF0b3IucGFydGl0aW9uS2V5KCk7CisgICAgICAgIGluZGV4V3JpdGVyLmFwcGVuZChrZXksIGVudHJ5LCBkYXRhV3JpdGVyLnBvc2l0aW9uKCksIHBhcnRpdGlvbldyaXRlci5idWZmZXIoKSk7CiAKLSAgICAgICAgaWYgKGtleS5nZXRLZXkoKS5yZW1haW5pbmcoKSA+IEZCVXRpbGl0aWVzLk1BWF9VTlNJR05FRF9TSE9SVCkKKyAgICAgICAgaWYgKHNob3VsZE1pZ3JhdGVLZXlDYWNoZSkKICAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJLZXkgc2l6ZSB7fSBleGNlZWRzIG1heGltdW0gb2Yge30sIHNraXBwaW5nIHJvdyIsIGtleS5nZXRLZXkoKS5yZW1haW5pbmcoKSwgRkJVdGlsaXRpZXMuTUFYX1VOU0lHTkVEX1NIT1JUKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGl0ZXJhdG9yLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotCi0gICAgICAgIGxvbmcgc3RhcnRQb3NpdGlvbiA9IGJlZm9yZUFwcGVuZChrZXkpOwotICAgICAgICBvYnNlcnZlcnMuZm9yRWFjaCgobykgLT4gby5zdGFydFBhcnRpdGlvbihrZXksIGl3cml0ZXIuaW5kZXhGaWxlLnBvc2l0aW9uKCkpKTsKLQotICAgICAgICAvL1JldXNlIHRoZSB3cml0ZXIgZm9yIGVhY2ggcm93Ci0gICAgICAgIGNvbHVtbkluZGV4V3JpdGVyLnJlc2V0KCk7Ci0KLSAgICAgICAgdHJ5IChVbmZpbHRlcmVkUm93SXRlcmF0b3IgY29sbGVjdGluZyA9IFRyYW5zZm9ybWF0aW9uLmFwcGx5KGl0ZXJhdG9yLCBuZXcgU3RhdHNDb2xsZWN0b3IobWV0YWRhdGFDb2xsZWN0b3IpKSkKLSAgICAgICAgewotICAgICAgICAgICAgY29sdW1uSW5kZXhXcml0ZXIuYnVpbGRSb3dJbmRleChjb2xsZWN0aW5nKTsKLQotICAgICAgICAgICAgLy8gYWZ0ZXJBcHBlbmQoKSB3cml0ZXMgdGhlIHBhcnRpdGlvbiBrZXkgYmVmb3JlIHRoZSBmaXJzdCBSb3dJbmRleEVudHJ5IC0gc28gd2UgaGF2ZSB0byBhZGQgaXQncwotICAgICAgICAgICAgLy8gc2VyaWFsaXplZCBzaXplIHRvIHRoZSBpbmRleC13cml0ZXIgcG9zaXRpb24KLSAgICAgICAgICAgIGxvbmcgaW5kZXhGaWxlUG9zaXRpb24gPSBCeXRlQnVmZmVyVXRpbC5zZXJpYWxpemVkU2l6ZVdpdGhTaG9ydExlbmd0aChrZXkuZ2V0S2V5KCkpICsgaXdyaXRlci5pbmRleEZpbGUucG9zaXRpb24oKTsKLQotICAgICAgICAgICAgUm93SW5kZXhFbnRyeSBlbnRyeSA9IFJvd0luZGV4RW50cnkuY3JlYXRlKHN0YXJ0UG9zaXRpb24sIGluZGV4RmlsZVBvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RpbmcucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4V3JpdGVyLmhlYWRlckxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5JbmRleFdyaXRlci5jb2x1bW5JbmRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4V3JpdGVyLmluZGV4SW5mb1NlcmlhbGl6ZWRTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXhXcml0ZXIuaW5kZXhTYW1wbGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXhXcml0ZXIub2Zmc2V0cygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJvd0luZGV4RW50cnlTZXJpYWxpemVyKCkuaW5kZXhJbmZvU2VyaWFsaXplcigpKTsKLQotICAgICAgICAgICAgbG9uZyBlbmRQb3NpdGlvbiA9IGRhdGFGaWxlLnBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBsb25nIHJvd1NpemUgPSBlbmRQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb247Ci0gICAgICAgICAgICBtYXliZUxvZ0xhcmdlUGFydGl0aW9uV2FybmluZyhrZXksIHJvd1NpemUpOwotICAgICAgICAgICAgbWF5YmVMb2dNYW55VG9tYnN0b25lc1dhcm5pbmcoa2V5LCBtZXRhZGF0YUNvbGxlY3Rvci50b3RhbFRvbWJzdG9uZXMpOwotICAgICAgICAgICAgbWV0YWRhdGFDb2xsZWN0b3IuYWRkUGFydGl0aW9uU2l6ZUluQnl0ZXMocm93U2l6ZSk7Ci0gICAgICAgICAgICBhZnRlckFwcGVuZChrZXksIGVuZFBvc2l0aW9uLCBlbnRyeSwgY29sdW1uSW5kZXhXcml0ZXIuYnVmZmVyKCkpOwotICAgICAgICAgICAgcmV0dXJuIGVudHJ5OwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbiBib2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJ0aXRpb25TZXJpYWxpemF0aW9uRXhjZXB0aW9uKGl0ZXJhdG9yLCBib2UpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIGRhdGFGaWxlLmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyPEluZGV4SW5mbz4gZ2V0Um93SW5kZXhFbnRyeVNlcmlhbGl6ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplcjxJbmRleEluZm8+KSByb3dJbmRleEVudHJ5U2VyaWFsaXplcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbWF5YmVMb2dMYXJnZVBhcnRpdGlvbldhcm5pbmcoRGVjb3JhdGVkS2V5IGtleSwgbG9uZyByb3dTaXplKQotICAgIHsKLSAgICAgICAgaWYgKHJvd1NpemUgPiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29tcGFjdGlvbkxhcmdlUGFydGl0aW9uV2FybmluZ1RocmVzaG9sZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5U3RyaW5nID0gbWV0YWRhdGEoKS5wYXJ0aXRpb25LZXlUeXBlLmdldFN0cmluZyhrZXkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIldyaXRpbmcgbGFyZ2UgcGFydGl0aW9uIHt9L3t9Ont9ICh7fSkgdG8gc3N0YWJsZSB7fSIsIG1ldGFkYXRhLmtleXNwYWNlLCBtZXRhZGF0YS5uYW1lLCBrZXlTdHJpbmcsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KHJvd1NpemUpLCBnZXRGaWxlbmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtYXliZUxvZ01hbnlUb21ic3RvbmVzV2FybmluZyhEZWNvcmF0ZWRLZXkga2V5LCBpbnQgdG9tYnN0b25lQ291bnQpCi0gICAgewotICAgICAgICBpZiAodG9tYnN0b25lQ291bnQgPiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29tcGFjdGlvblRvbWJzdG9uZVdhcm5pbmdUaHJlc2hvbGQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleVN0cmluZyA9IG1ldGFkYXRhKCkucGFydGl0aW9uS2V5VHlwZS5nZXRTdHJpbmcoa2V5LmdldEtleSgpKTsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCJXcml0aW5nIHt9IHRvbWJzdG9uZXMgdG8ge30ve306e30gaW4gc3N0YWJsZSB7fSIsIHRvbWJzdG9uZUNvdW50LCBtZXRhZGF0YS5rZXlzcGFjZSwgbWV0YWRhdGEubmFtZSwga2V5U3RyaW5nLCBnZXRGaWxlbmFtZSgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YXRzQ29sbGVjdG9yIGV4dGVuZHMgVHJhbnNmb3JtYXRpb24KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWV0YWRhdGFDb2xsZWN0b3IgY29sbGVjdG9yOwotICAgICAgICBwcml2YXRlIGludCBjZWxsQ291bnQ7Ci0KLSAgICAgICAgU3RhdHNDb2xsZWN0b3IoTWV0YWRhdGFDb2xsZWN0b3IgY29sbGVjdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNvbGxlY3RvciA9IGNvbGxlY3RvcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUm93IGFwcGx5VG9TdGF0aWMoUm93IHJvdykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFyb3cuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGNlbGxDb3VudCArPSBSb3dzLmNvbGxlY3RTdGF0cyhyb3csIGNvbGxlY3Rvcik7Ci0gICAgICAgICAgICByZXR1cm4gcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBSb3cgYXBwbHlUb1JvdyhSb3cgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2xsZWN0b3IudXBkYXRlQ2x1c3RlcmluZ1ZhbHVlcyhyb3cuY2x1c3RlcmluZygpKTsKLSAgICAgICAgICAgIGNlbGxDb3VudCArPSBSb3dzLmNvbGxlY3RTdGF0cyhyb3csIGNvbGxlY3Rvcik7Ci0gICAgICAgICAgICByZXR1cm4gcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBSYW5nZVRvbWJzdG9uZU1hcmtlciBhcHBseVRvTWFya2VyKFJhbmdlVG9tYnN0b25lTWFya2VyIG1hcmtlcikKLSAgICAgICAgewotICAgICAgICAgICAgY29sbGVjdG9yLnVwZGF0ZUNsdXN0ZXJpbmdWYWx1ZXMobWFya2VyLmNsdXN0ZXJpbmcoKSk7Ci0gICAgICAgICAgICBpZiAobWFya2VyLmlzQm91bmRhcnkoKSkKKyAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciByZWFkZXIgOiAoKElMaWZlY3ljbGVUcmFuc2FjdGlvbikgbGlmZWN5Y2xlTmV3VHJhY2tlcikub3JpZ2luYWxzKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUmFuZ2VUb21ic3RvbmVCb3VuZGFyeU1hcmtlciBibSA9IChSYW5nZVRvbWJzdG9uZUJvdW5kYXJ5TWFya2VyKW1hcmtlcjsKLSAgICAgICAgICAgICAgICBjb2xsZWN0b3IudXBkYXRlKGJtLmVuZERlbGV0aW9uVGltZSgpKTsKLSAgICAgICAgICAgICAgICBjb2xsZWN0b3IudXBkYXRlKGJtLnN0YXJ0RGVsZXRpb25UaW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChyZWFkZXIgaW5zdGFuY2VvZiBLZXlDYWNoZVN1cHBvcnQ8Pz4gJiYgKChLZXlDYWNoZVN1cHBvcnQ8Pz4pIHJlYWRlcikuZ2V0Q2FjaGVkUG9zaXRpb24oa2V5LCBmYWxzZSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlZEtleXMucHV0KGtleSwgZW50cnkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29sbGVjdG9yLnVwZGF0ZSgoKFJhbmdlVG9tYnN0b25lQm91bmRNYXJrZXIpbWFya2VyKS5kZWxldGlvblRpbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbWFya2VyOwogICAgICAgICB9CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGFydGl0aW9uQ2xvc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2xsZWN0b3IuYWRkQ2VsbFBlclBhcnRpdGlvbkNvdW50KGNlbGxDb3VudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERlbGV0aW9uVGltZSBhcHBseVRvRGVsZXRpb24oRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSkKLSAgICAgICAgewotICAgICAgICAgICAgY29sbGVjdG9yLnVwZGF0ZShkZWxldGlvblRpbWUpOwotICAgICAgICAgICAgcmV0dXJuIGRlbGV0aW9uVGltZTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgfQogCiAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKLSAgICBwdWJsaWMgU1NUYWJsZVJlYWRlciBvcGVuRWFybHkoKQorICAgIHByaXZhdGUgQmlnVGFibGVSZWFkZXIgb3BlbkludGVybmFsKEluZGV4U3VtbWFyeUJ1aWxkZXIuUmVhZGFibGVCb3VuZGFyeSBib3VuZGFyeSwgU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uIG9wZW5SZWFzb24pCiAgICAgewotICAgICAgICAvLyBmaW5kIHRoZSBtYXggKGV4Y2x1c2l2ZSkgcmVhZGFibGUga2V5Ci0gICAgICAgIEluZGV4U3VtbWFyeUJ1aWxkZXIuUmVhZGFibGVCb3VuZGFyeSBib3VuZGFyeSA9IGl3cml0ZXIuZ2V0TWF4UmVhZGFibGUoKTsKLSAgICAgICAgaWYgKGJvdW5kYXJ5ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgYXNzZXJ0IGJvdW5kYXJ5ID09IG51bGwgfHwgKGJvdW5kYXJ5LmluZGV4TGVuZ3RoID4gMCAmJiBib3VuZGFyeS5kYXRhTGVuZ3RoID4gMCk7CiAKKyAgICAgICAgSUZpbHRlciBmaWx0ZXIgPSBudWxsOwogICAgICAgICBJbmRleFN1bW1hcnkgaW5kZXhTdW1tYXJ5ID0gbnVsbDsKLSAgICAgICAgRmlsZUhhbmRsZSBpZmlsZSA9IG51bGw7Ci0gICAgICAgIEZpbGVIYW5kbGUgZGZpbGUgPSBudWxsOwotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBudWxsOworICAgICAgICBGaWxlSGFuZGxlIGRhdGFGaWxlID0gbnVsbDsKKyAgICAgICAgRmlsZUhhbmRsZSBpbmRleEZpbGUgPSBudWxsOwogCisgICAgICAgIEJpZ1RhYmxlUmVhZGVyLkJ1aWxkZXIgYnVpbGRlciA9IHVuYnVpbGRUbyhuZXcgQmlnVGFibGVSZWFkZXIuQnVpbGRlcihkZXNjcmlwdG9yKSwgdHJ1ZSkuc2V0TWF4RGF0YUFnZShtYXhEYXRhQWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoaGVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE9wZW5SZWFzb24ob3BlblJlYXNvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaXJzdChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXN0KGJvdW5kYXJ5ICE9IG51bGwgPyBib3VuZGFyeS5sYXN0S2V5IDogbGFzdCk7CisKKyAgICAgICAgQmlnVGFibGVSZWFkZXIgcmVhZGVyOwogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzdGF0cyA9IHN0YXRzTWV0YWRhdGEoKTsKLSAgICAgICAgICAgIGFzc2VydCBib3VuZGFyeS5pbmRleExlbmd0aCA+IDAgJiYgYm91bmRhcnkuZGF0YUxlbmd0aCA+IDA7Ci0gICAgICAgICAgICAvLyBvcGVuIHRoZSByZWFkZXIgZWFybHkKLSAgICAgICAgICAgIGluZGV4U3VtbWFyeSA9IGl3cml0ZXIuc3VtbWFyeS5idWlsZChtZXRhZGF0YSgpLnBhcnRpdGlvbmVyLCBib3VuZGFyeSk7Ci0gICAgICAgICAgICBsb25nIGluZGV4RmlsZUxlbmd0aCA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpKS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGludCBpbmRleEJ1ZmZlclNpemUgPSBvcHRpbWl6YXRpb25TdHJhdGVneS5idWZmZXJTaXplKGluZGV4RmlsZUxlbmd0aCAvIGluZGV4U3VtbWFyeS5zaXplKCkpOwotICAgICAgICAgICAgaWZpbGUgPSBpd3JpdGVyLmJ1aWxkZXIuYnVmZmVyU2l6ZShpbmRleEJ1ZmZlclNpemUpLmNvbXBsZXRlKGJvdW5kYXJ5LmluZGV4TGVuZ3RoKTsKLSAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbikKLSAgICAgICAgICAgICAgICBkYnVpbGRlci53aXRoQ29tcHJlc3Npb25NZXRhZGF0YSgoKENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKSBkYXRhRmlsZSkub3Blbihib3VuZGFyeS5kYXRhTGVuZ3RoKSk7Ci0gICAgICAgICAgICBpbnQgZGF0YUJ1ZmZlclNpemUgPSBvcHRpbWl6YXRpb25TdHJhdGVneS5idWZmZXJTaXplKHN0YXRzLmVzdGltYXRlZFBhcnRpdGlvblNpemUucGVyY2VudGlsZShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGlza09wdGltaXphdGlvbkVzdGltYXRlUGVyY2VudGlsZSgpKSk7Ci0gICAgICAgICAgICBkZmlsZSA9IGRidWlsZGVyLmJ1ZmZlclNpemUoZGF0YUJ1ZmZlclNpemUpLmNvbXBsZXRlKGJvdW5kYXJ5LmRhdGFMZW5ndGgpOwotICAgICAgICAgICAgaW52YWxpZGF0ZUNhY2hlQXRCb3VuZGFyeShkZmlsZSk7Ci0gICAgICAgICAgICBzc3RhYmxlID0gU1NUYWJsZVJlYWRlci5pbnRlcm5hbE9wZW4oZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLCBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmlsZSwgZGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTdW1tYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl3cml0ZXIuYmYuc2hhcmVkQ29weSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heERhdGFBZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uLkVBUkxZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcik7CiAKLSAgICAgICAgICAgIC8vIG5vdyBpdCdzIG9wZW4sIGZpbmQgdGhlIEFDVFVBTCBsYXN0IHJlYWRhYmxlIGtleSAoaS5lLiBmb3Igd2hpY2ggdGhlIGRhdGEgZmlsZSBoYXMgYWxzbyBiZWVuIGZsdXNoZWQpCi0gICAgICAgICAgICBzc3RhYmxlLmZpcnN0ID0gZ2V0TWluaW1hbEtleShmaXJzdCk7Ci0gICAgICAgICAgICBzc3RhYmxlLmxhc3QgPSBnZXRNaW5pbWFsS2V5KGJvdW5kYXJ5Lmxhc3RLZXkpOwotICAgICAgICAgICAgcmV0dXJuIHNzdGFibGU7CisgICAgICAgICAgICBidWlsZGVyLnNldFN0YXRzTWV0YWRhdGEoc3RhdHNNZXRhZGF0YSgpKTsKKworICAgICAgICAgICAgRXN0aW1hdGVkSGlzdG9ncmFtIHBhcnRpdGlvblNpemVIaXN0b2dyYW0gPSBidWlsZGVyLmdldFN0YXRzTWV0YWRhdGEoKS5lc3RpbWF0ZWRQYXJ0aXRpb25TaXplOworICAgICAgICAgICAgaWYgKGJvdW5kYXJ5ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBhcnRpdGlvblNpemVIaXN0b2dyYW0uaXNPdmVyZmxvd2VkKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiRXN0aW1hdGVkIHBhcnRpdGlvbiBzaXplIGhpc3RvZ3JhbSBmb3IgJ3t9JyBpcyBvdmVyZmxvd2VkICh7fSB2YWx1ZXMgZ3JlYXRlciB0aGFuIHt9KS4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDbGVhcmluZyB0aGUgb3ZlcmZsb3cgYnVja2V0IHRvIGFsbG93IGZvciBkZWdyYWRlZCBtZWFuIGFuZCBwZXJjZW50aWxlIGNhbGN1bGF0aW9ucy4uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IsIHBhcnRpdGlvblNpemVIaXN0b2dyYW0ub3ZlcmZsb3dDb3VudCgpLCBwYXJ0aXRpb25TaXplSGlzdG9ncmFtLmdldExhcmdlc3RCdWNrZXRPZmZzZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvblNpemVIaXN0b2dyYW0uY2xlYXJPdmVyZmxvdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlsdGVyID0gaW5kZXhXcml0ZXIuZ2V0RmlsdGVyQ29weSgpOworICAgICAgICAgICAgYnVpbGRlci5zZXRGaWx0ZXIoZmlsdGVyKTsKKyAgICAgICAgICAgIGluZGV4U3VtbWFyeSA9IGluZGV4V3JpdGVyLnN1bW1hcnkuYnVpbGQobWV0YWRhdGEoKS5wYXJ0aXRpb25lciwgYm91bmRhcnkpOworICAgICAgICAgICAgYnVpbGRlci5zZXRJbmRleFN1bW1hcnkoaW5kZXhTdW1tYXJ5KTsKKworICAgICAgICAgICAgbG9uZyBpbmRleEZpbGVMZW5ndGggPSBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5QUklNQVJZX0lOREVYKS5sZW5ndGgoKTsKKyAgICAgICAgICAgIGludCBpbmRleEJ1ZmZlclNpemUgPSBpb09wdGlvbnMuZGlza09wdGltaXphdGlvblN0cmF0ZWd5LmJ1ZmZlclNpemUoaW5kZXhGaWxlTGVuZ3RoIC8gYnVpbGRlci5nZXRJbmRleFN1bW1hcnkoKS5zaXplKCkpOworICAgICAgICAgICAgRmlsZUhhbmRsZS5CdWlsZGVyIGluZGV4RmlsZUJ1aWxkZXIgPSBpbmRleFdyaXRlci5idWlsZGVyOworICAgICAgICAgICAgaW5kZXhGaWxlID0gaW5kZXhGaWxlQnVpbGRlci5idWZmZXJTaXplKGluZGV4QnVmZmVyU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aExlbmd0aE92ZXJyaWRlKGJvdW5kYXJ5ICE9IG51bGwgPyBib3VuZGFyeS5pbmRleExlbmd0aCA6IE5PX0xFTkdUSF9PVkVSUklERSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcGxldGUoKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0SW5kZXhGaWxlKGluZGV4RmlsZSk7CisgICAgICAgICAgICBkYXRhRmlsZSA9IG9wZW5EYXRhRmlsZShib3VuZGFyeSAhPSBudWxsID8gYm91bmRhcnkuZGF0YUxlbmd0aCA6IE5PX0xFTkdUSF9PVkVSUklERSwgYnVpbGRlci5nZXRTdGF0c01ldGFkYXRhKCkpOworICAgICAgICAgICAgYnVpbGRlci5zZXREYXRhRmlsZShkYXRhRmlsZSk7CisgICAgICAgICAgICBidWlsZGVyLnNldEtleUNhY2hlKG1ldGFkYXRhKCkucGFyYW1zLmNhY2hpbmcuY2FjaGVLZXlzKCkgPyBuZXcgS2V5Q2FjaGUoQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlKSA6IEtleUNhY2hlLk5PX0NBQ0hFKTsKKworICAgICAgICAgICAgcmVhZGVyID0gYnVpbGRlci5idWlsZChvd25lcigpLm9yRWxzZShudWxsKSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICB7CiAgICAgICAgICAgICBKVk1TdGFiaWxpdHlJbnNwZWN0b3IuaW5zcGVjdFRocm93YWJsZSh0KTsKLSAgICAgICAgICAgIC8vIElmIHdlIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIG91ciBzc3RhYmxlLCB3ZSBjYW4gcmVseSBvbiBpdHMgSW5zdGFuY2VUaWRpZXIgdG8gY2xlYW4gdGhpbmdzIHVwIGZvciB1cwotICAgICAgICAgICAgaWYgKHNzdGFibGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzc3RhYmxlLnNlbGZSZWYoKS5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgU3RyZWFtLm9mKGluZGV4U3VtbWFyeSwgaWZpbGUsIGRmaWxlKS5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkuZm9yRWFjaChTaGFyZWRDbG9zZWFibGVJbXBsOjpjbG9zZSk7CisgICAgICAgICAgICBUaHJvd2FibGVzLmNsb3NlTm9uTnVsbEFuZEFkZFN1cHByZXNzZWQodCwgZGF0YUZpbGUsIGluZGV4RmlsZSwgaW5kZXhTdW1tYXJ5LCBmaWx0ZXIpOwogICAgICAgICAgICAgdGhyb3cgdDsKICAgICAgICAgfQorCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxEZWNvcmF0ZWRLZXksIEFic3RyYWN0Um93SW5kZXhFbnRyeT4gY2FjaGVkS2V5IDogY2FjaGVkS2V5cy5lbnRyeVNldCgpKQorICAgICAgICAgICAgICAgIHJlYWRlci5jYWNoZUtleShjYWNoZWRLZXkuZ2V0S2V5KCksIGNhY2hlZEtleS5nZXRWYWx1ZSgpKTsKKworICAgICAgICAgICAgLy8gY2xlYXJpbmcgdGhlIGNvbGxlY3RlZCBjYWNoZSBrZXlzIHNvIHRoYXQgd2Ugd2lsbCBub3QgaGF2ZSB0byBjYWNoZSB0aGVtIGFnYWluIHdoZW4gb3BlbmluZyBwYXJ0aWFsIG9yCisgICAgICAgICAgICAvLyBmaW5hbCBsYXRlciAtIGNhY2hlIGtleSByZWZlciBvbmx5IHRvIHRoZSBkZXNjcmlwdG9yLCBub3QgdG8gdGhlIHBhcnRpY3VsYXIgU1NUYWJsZVJlYWRlciBpbnN0YW5jZS4KKyAgICAgICAgICAgIGNhY2hlZEtleXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpWTVN0YWJpbGl0eUluc3BlY3Rvci5pbnNwZWN0VGhyb3dhYmxlKHQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlYWRlcjsKICAgICB9CiAKLSAgICB2b2lkIGludmFsaWRhdGVDYWNoZUF0Qm91bmRhcnkoRmlsZUhhbmRsZSBkZmlsZSkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvcGVuRWFybHkoQ29uc3VtZXI8U1NUYWJsZVJlYWRlcj4gZG9XaGVuUmVhZHkpCiAgICAgewotICAgICAgICBjaHVua0NhY2hlLmlmUHJlc2VudChjYWNoZSAtPiB7Ci0gICAgICAgICAgICBpZiAobGFzdEVhcmx5T3Blbkxlbmd0aCAhPSAwICYmIGRmaWxlLmRhdGFMZW5ndGgoKSA+IGxhc3RFYXJseU9wZW5MZW5ndGgpCi0gICAgICAgICAgICAgICAgY2FjaGUuaW52YWxpZGF0ZVBvc2l0aW9uKGRmaWxlLCBsYXN0RWFybHlPcGVuTGVuZ3RoKTsKLSAgICAgICAgfSk7Ci0gICAgICAgIGxhc3RFYXJseU9wZW5MZW5ndGggPSBkZmlsZS5kYXRhTGVuZ3RoKCk7CisgICAgICAgIC8vIGZpbmQgdGhlIG1heCAoZXhjbHVzaXZlKSByZWFkYWJsZSBrZXkKKyAgICAgICAgSW5kZXhTdW1tYXJ5QnVpbGRlci5SZWFkYWJsZUJvdW5kYXJ5IGJvdW5kYXJ5ID0gaW5kZXhXcml0ZXIuZ2V0TWF4UmVhZGFibGUoKTsKKyAgICAgICAgaWYgKGJvdW5kYXJ5ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZG9XaGVuUmVhZHkuYWNjZXB0KG9wZW5JbnRlcm5hbChib3VuZGFyeSwgU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uLkVBUkxZKSk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNTVGFibGVSZWFkZXIgb3BlbkZpbmFsRWFybHkoKQogICAgIHsKICAgICAgICAgLy8gd2UgbXVzdCBlbnN1cmUgdGhlIGRhdGEgaXMgY29tcGxldGVseSBmbHVzaGVkIHRvIGRpc2sKLSAgICAgICAgZGF0YUZpbGUuc3luYygpOwotICAgICAgICBpd3JpdGVyLmluZGV4RmlsZS5zeW5jKCk7CisgICAgICAgIGRhdGFXcml0ZXIuc3luYygpOworICAgICAgICBpbmRleFdyaXRlci53cml0ZXIuc3luYygpOwogCiAgICAgICAgIHJldHVybiBvcGVuRmluYWwoU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uLkVBUkxZKTsKICAgICB9CiAKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQotICAgIHByaXZhdGUgU1NUYWJsZVJlYWRlciBvcGVuRmluYWwoU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uIG9wZW5SZWFzb24pCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNTVGFibGVSZWFkZXIgb3BlbkZpbmFsKFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbiBvcGVuUmVhc29uKQogICAgIHsKICAgICAgICAgaWYgKG1heERhdGFBZ2UgPCAwKQogICAgICAgICAgICAgbWF4RGF0YUFnZSA9IGN1cnJlbnRUaW1lTWlsbGlzKCk7CiAKLSAgICAgICAgSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSA9IG51bGw7Ci0gICAgICAgIEZpbGVIYW5kbGUgaWZpbGUgPSBudWxsOwotICAgICAgICBGaWxlSGFuZGxlIGRmaWxlID0gbnVsbDsKLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gbnVsbDsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzdGF0cyA9IHN0YXRzTWV0YWRhdGEoKTsKLSAgICAgICAgICAgIC8vIGZpbmFsaXplIGluLW1lbW9yeSBzdGF0ZSBmb3IgdGhlIHJlYWRlcgotICAgICAgICAgICAgaW5kZXhTdW1tYXJ5ID0gaXdyaXRlci5zdW1tYXJ5LmJ1aWxkKG1ldGFkYXRhKCkucGFydGl0aW9uZXIpOwotICAgICAgICAgICAgbG9uZyBpbmRleEZpbGVMZW5ndGggPSBuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpbnQgZGF0YUJ1ZmZlclNpemUgPSBvcHRpbWl6YXRpb25TdHJhdGVneS5idWZmZXJTaXplKHN0YXRzLmVzdGltYXRlZFBhcnRpdGlvblNpemUucGVyY2VudGlsZShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RGlza09wdGltaXphdGlvbkVzdGltYXRlUGVyY2VudGlsZSgpKSk7Ci0gICAgICAgICAgICBpbnQgaW5kZXhCdWZmZXJTaXplID0gb3B0aW1pemF0aW9uU3RyYXRlZ3kuYnVmZmVyU2l6ZShpbmRleEZpbGVMZW5ndGggLyBpbmRleFN1bW1hcnkuc2l6ZSgpKTsKLSAgICAgICAgICAgIGlmaWxlID0gaXdyaXRlci5idWlsZGVyLmJ1ZmZlclNpemUoaW5kZXhCdWZmZXJTaXplKS5jb21wbGV0ZSgpOwotICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uKQotICAgICAgICAgICAgICAgIGRidWlsZGVyLndpdGhDb21wcmVzc2lvbk1ldGFkYXRhKCgoQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIpIGRhdGFGaWxlKS5vcGVuKDApKTsKLSAgICAgICAgICAgIGRmaWxlID0gZGJ1aWxkZXIuYnVmZmVyU2l6ZShkYXRhQnVmZmVyU2l6ZSkuY29tcGxldGUoKTsKLSAgICAgICAgICAgIGludmFsaWRhdGVDYWNoZUF0Qm91bmRhcnkoZGZpbGUpOwotICAgICAgICAgICAgc3N0YWJsZSA9IFNTVGFibGVSZWFkZXIuaW50ZXJuYWxPcGVuKGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFN1bW1hcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXdyaXRlci5iZi5zaGFyZWRDb3B5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RGF0YUFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuUmVhc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcik7Ci0gICAgICAgICAgICBzc3RhYmxlLmZpcnN0ID0gZ2V0TWluaW1hbEtleShmaXJzdCk7Ci0gICAgICAgICAgICBzc3RhYmxlLmxhc3QgPSBnZXRNaW5pbWFsS2V5KGxhc3QpOwotICAgICAgICAgICAgcmV0dXJuIHNzdGFibGU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICBKVk1TdGFiaWxpdHlJbnNwZWN0b3IuaW5zcGVjdFRocm93YWJsZSh0KTsKLSAgICAgICAgICAgIC8vIElmIHdlIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIG91ciBzc3RhYmxlLCB3ZSBjYW4gcmVseSBvbiBpdHMgSW5zdGFuY2VUaWRpZXIgdG8gY2xlYW4gdGhpbmdzIHVwIGZvciB1cwotICAgICAgICAgICAgaWYgKHNzdGFibGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzc3RhYmxlLnNlbGZSZWYoKS5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgU3RyZWFtLm9mKGluZGV4U3VtbWFyeSwgaWZpbGUsIGRmaWxlKS5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkuZm9yRWFjaChTaGFyZWRDbG9zZWFibGVJbXBsOjpjbG9zZSk7Ci0gICAgICAgICAgICB0aHJvdyB0OwotICAgICAgICB9CisgICAgICAgIHJldHVybiBvcGVuSW50ZXJuYWwobnVsbCwgb3BlblJlYXNvbik7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIFNTVGFibGVXcml0ZXIuVHJhbnNhY3Rpb25hbFByb3h5IHR4blByb3h5KCkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25hbFByb3h5KCk7Ci0gICAgfQotCi0gICAgY2xhc3MgVHJhbnNhY3Rpb25hbFByb3h5IGV4dGVuZHMgU1NUYWJsZVdyaXRlci5UcmFuc2FjdGlvbmFsUHJveHkKLSAgICB7Ci0gICAgICAgIC8vIGZpbmFsaXNlIG91ciBzdGF0ZSBvbiBkaXNrLCBpbmNsdWRpbmcgcmVuYW1pbmcKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9QcmVwYXJlKCkKLSAgICAgICAgewotICAgICAgICAgICAgaXdyaXRlci5wcmVwYXJlVG9Db21taXQoKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgc3N0YWJsZSBzdGF0aXN0aWNzCi0gICAgICAgICAgICBkYXRhRmlsZS5wcmVwYXJlVG9Db21taXQoKTsKLSAgICAgICAgICAgIHdyaXRlTWV0YWRhdGEoZGVzY3JpcHRvciwgZmluYWxpemVNZXRhZGF0YSgpKTsKLQotICAgICAgICAgICAgLy8gc2F2ZSB0aGUgdGFibGUgb2YgY29tcG9uZW50cwotICAgICAgICAgICAgU1NUYWJsZS5hcHBlbmRUT0MoZGVzY3JpcHRvciwgY29tcG9uZW50cyk7Ci0KLSAgICAgICAgICAgIGlmIChvcGVuUmVzdWx0KQotICAgICAgICAgICAgICAgIGZpbmFsUmVhZGVyID0gb3BlbkZpbmFsKFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbi5OT1JNQUwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb0NvbW1pdChUaHJvd2FibGUgYWNjdW11bGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgYWNjdW11bGF0ZSA9IGRhdGFGaWxlLmNvbW1pdChhY2N1bXVsYXRlKTsKLSAgICAgICAgICAgIGFjY3VtdWxhdGUgPSBpd3JpdGVyLmNvbW1pdChhY2N1bXVsYXRlKTsKLSAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBUaHJvd2FibGUgZG9Qb3N0Q2xlYW51cChUaHJvd2FibGUgYWNjdW11bGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgYWNjdW11bGF0ZSA9IGRidWlsZGVyLmNsb3NlKGFjY3VtdWxhdGUpOwotICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgVGhyb3dhYmxlIGRvQWJvcnQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFjY3VtdWxhdGUgPSBpd3JpdGVyLmFib3J0KGFjY3VtdWxhdGUpOwotICAgICAgICAgICAgYWNjdW11bGF0ZSA9IGRhdGFGaWxlLmFib3J0KGFjY3VtdWxhdGUpOwotICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVNZXRhZGF0YShEZXNjcmlwdG9yIGRlc2MsIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBjb21wb25lbnRzKQotICAgIHsKLSAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuU1RBVFMpKTsKLSAgICAgICAgdHJ5IChTZXF1ZW50aWFsV3JpdGVyIG91dCA9IG5ldyBTZXF1ZW50aWFsV3JpdGVyKGZpbGUsIHdyaXRlck9wdGlvbikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlc2MuZ2V0TWV0YWRhdGFTZXJpYWxpemVyKCkuc2VyaWFsaXplKGNvbXBvbmVudHMsIG91dCwgZGVzYy52ZXJzaW9uKTsKLSAgICAgICAgICAgIG91dC5maW5pc2goKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCBmaWxlLnBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRGaWxlUG9pbnRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gZGF0YUZpbGUucG9zaXRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRPbkRpc2tGaWxlUG9pbnRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gZGF0YUZpbGUuZ2V0T25EaXNrRmlsZVBvaW50ZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgbG9uZyBnZXRFc3RpbWF0ZWRPbkRpc2tCeXRlc1dyaXR0ZW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRhdGFGaWxlLmdldEVzdGltYXRlZE9uRGlza0J5dGVzV3JpdHRlbigpOworICAgICAgICByZXR1cm4gbmV3IFNTVGFibGVXcml0ZXIuVHJhbnNhY3Rpb25hbFByb3h5KCgpIC0+IEZCVXRpbGl0aWVzLmltbXV0YWJsZUxpc3RXaXRoRmlsdGVyZWROdWxscyhpbmRleFdyaXRlciwgZGF0YVdyaXRlcikpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIEVuY2Fwc3VsYXRlcyB3cml0aW5nIHRoZSBpbmRleCBhbmQgZmlsdGVyIGZvciBhbiBTU1RhYmxlLiBUaGUgc3RhdGUgb2YgdGhpcyBvYmplY3QgaXMgbm90IHZhbGlkIHVudGlsIGl0IGhhcyBiZWVuIGNsb3NlZC4KICAgICAgKi8KLSAgICBjbGFzcyBJbmRleFdyaXRlciBleHRlbmRzIEFic3RyYWN0VHJhbnNhY3Rpb25hbCBpbXBsZW1lbnRzIFRyYW5zYWN0aW9uYWwKKyAgICBzdGF0aWMgY2xhc3MgSW5kZXhXcml0ZXIgZXh0ZW5kcyBTb3J0ZWRUYWJsZVdyaXRlci5BYnN0cmFjdEluZGV4V3JpdGVyCiAgICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXIgaW5kZXhGaWxlOwotICAgICAgICBwdWJsaWMgZmluYWwgRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXI7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBJbmRleFN1bW1hcnlCdWlsZGVyIHN1bW1hcnk7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBJRmlsdGVyIGJmOwotICAgICAgICBwcml2YXRlIERhdGFQb3NpdGlvbiBtYXJrOworICAgICAgICBwcml2YXRlIGZpbmFsIFJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyIHJvd0luZGV4RW50cnlTZXJpYWxpemVyOwogCi0gICAgICAgIEluZGV4V3JpdGVyKGxvbmcga2V5Q291bnQpCisgICAgICAgIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyOworICAgICAgICBmaW5hbCBGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlcjsKKyAgICAgICAgZmluYWwgSW5kZXhTdW1tYXJ5QnVpbGRlciBzdW1tYXJ5OworICAgICAgICBwcml2YXRlIERhdGFQb3NpdGlvbiBtYXJrOworICAgICAgICBwcml2YXRlIERlY29yYXRlZEtleSBmaXJzdDsKKyAgICAgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgbGFzdDsKKworICAgICAgICBwcm90ZWN0ZWQgSW5kZXhXcml0ZXIoQnVpbGRlciBiKQogICAgICAgICB7Ci0gICAgICAgICAgICBpbmRleEZpbGUgPSBuZXcgU2VxdWVudGlhbFdyaXRlcihuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSksIHdyaXRlck9wdGlvbik7Ci0gICAgICAgICAgICBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkubW1hcHBlZChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW5kZXhBY2Nlc3NNb2RlKCkgPT0gQ29uZmlnLkRpc2tBY2Nlc3NNb2RlLm1tYXApOwotICAgICAgICAgICAgY2h1bmtDYWNoZS5pZlByZXNlbnQoYnVpbGRlcjo6d2l0aENodW5rQ2FjaGUpOwotICAgICAgICAgICAgc3VtbWFyeSA9IG5ldyBJbmRleFN1bW1hcnlCdWlsZGVyKGtleUNvdW50LCBtZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBEb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTCk7Ci0gICAgICAgICAgICBiZiA9IEZpbHRlckZhY3RvcnkuZ2V0RmlsdGVyKGtleUNvdW50LCBtZXRhZGF0YSgpLnBhcmFtcy5ibG9vbUZpbHRlckZwQ2hhbmNlKTsKKyAgICAgICAgICAgIHN1cGVyKGIpOworICAgICAgICAgICAgdGhpcy5yb3dJbmRleEVudHJ5U2VyaWFsaXplciA9IGIuZ2V0Um93SW5kZXhFbnRyeVNlcmlhbGl6ZXIoKTsKKyAgICAgICAgICAgIHdyaXRlciA9IG5ldyBTZXF1ZW50aWFsV3JpdGVyKGIuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCksIGIuZ2V0SU9PcHRpb25zKCkud3JpdGVyT3B0aW9ucyk7CisgICAgICAgICAgICBidWlsZGVyID0gSW5kZXhDb21wb25lbnQuZmlsZUJ1aWxkZXIoQ29tcG9uZW50cy5QUklNQVJZX0lOREVYLCBiKS53aXRoTW1hcHBlZFJlZ2lvbnNDYWNoZShiLmdldE1tYXBwZWRSZWdpb25zQ2FjaGUoKSk7CisgICAgICAgICAgICBzdW1tYXJ5ID0gbmV3IEluZGV4U3VtbWFyeUJ1aWxkZXIoYi5nZXRLZXlDb3VudCgpLCBiLmdldFRhYmxlTWV0YWRhdGFSZWYoKS5nZXRMb2NhbCgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBEb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTCk7CiAgICAgICAgICAgICAvLyByZWdpc3RlciBsaXN0ZW5lcnMgdG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGZpbGVzIGFyZSBmbHVzaGVkCi0gICAgICAgICAgICBpbmRleEZpbGUuc2V0UG9zdEZsdXNoTGlzdGVuZXIoKCkgLT4gc3VtbWFyeS5tYXJrSW5kZXhTeW5jZWQoaW5kZXhGaWxlLmdldExhc3RGbHVzaE9mZnNldCgpKSk7Ci0gICAgICAgICAgICBkYXRhRmlsZS5zZXRQb3N0Rmx1c2hMaXN0ZW5lcigoKSAtPiBzdW1tYXJ5Lm1hcmtEYXRhU3luY2VkKGRhdGFGaWxlLmdldExhc3RGbHVzaE9mZnNldCgpKSk7CisgICAgICAgICAgICB3cml0ZXIuc2V0UG9zdEZsdXNoTGlzdGVuZXIoKCkgLT4gc3VtbWFyeS5tYXJrSW5kZXhTeW5jZWQod3JpdGVyLmdldExhc3RGbHVzaE9mZnNldCgpKSk7CisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQorICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlciBkYXRhV3JpdGVyID0gYi5nZXREYXRhV3JpdGVyKCk7CisgICAgICAgICAgICBkYXRhV3JpdGVyLnNldFBvc3RGbHVzaExpc3RlbmVyKCgpIC0+IHN1bW1hcnkubWFya0RhdGFTeW5jZWQoZGF0YVdyaXRlci5nZXRMYXN0Rmx1c2hPZmZzZXQoKSkpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gZmluZHMgdGhlIGxhc3QgKC1vZmZzZXQpIGRlY29yYXRlZCBrZXkgdGhhdCBjYW4gYmUgZ3VhcmFudGVlZCB0byBvY2N1ciBmdWxseSBpbiB0aGUgZmx1c2hlZCBwb3J0aW9uIG9mIHRoZSBpbmRleCBmaWxlCkBAIC01NjEsMTcgKzI5MCwyMSBAQAogICAgICAgICBwdWJsaWMgdm9pZCBhcHBlbmQoRGVjb3JhdGVkS2V5IGtleSwgUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBsb25nIGRhdGFFbmQsIEJ5dGVCdWZmZXIgaW5kZXhJbmZvKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgYmYuYWRkKGtleSk7Ci0gICAgICAgICAgICBsb25nIGluZGV4U3RhcnQgPSBpbmRleEZpbGUucG9zaXRpb24oKTsKKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGZpcnN0ID0ga2V5OworICAgICAgICAgICAgbGFzdCA9IGtleTsKKworICAgICAgICAgICAgbG9uZyBpbmRleFN0YXJ0ID0gd3JpdGVyLnBvc2l0aW9uKCk7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhTaG9ydExlbmd0aChrZXkuZ2V0S2V5KCksIGluZGV4RmlsZSk7Ci0gICAgICAgICAgICAgICAgcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuc2VyaWFsaXplKGluZGV4RW50cnksIGluZGV4RmlsZSwgaW5kZXhJbmZvKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhTaG9ydExlbmd0aChrZXkuZ2V0S2V5KCksIHdyaXRlcik7CisgICAgICAgICAgICAgICAgcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIuc2VyaWFsaXplKGluZGV4RW50cnksIHdyaXRlciwgaW5kZXhJbmZvKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgaW5kZXhGaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCB3cml0ZXIuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvbmcgaW5kZXhFbmQgPSBpbmRleEZpbGUucG9zaXRpb24oKTsKKyAgICAgICAgICAgIGxvbmcgaW5kZXhFbmQgPSB3cml0ZXIucG9zaXRpb24oKTsKIAogICAgICAgICAgICAgaWYgKGxvZ2dlci5pc1RyYWNlRW5hYmxlZCgpKQogICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgid3JvdGUgaW5kZXggZW50cnk6IHt9IGF0IHt9IiwgaW5kZXhFbnRyeSwgaW5kZXhTdGFydCk7CkBAIC01NzksNzUgKzMxMiwxNTIgQEAKICAgICAgICAgICAgIHN1bW1hcnkubWF5YmVBZGRFbnRyeShrZXksIGluZGV4U3RhcnQsIGluZGV4RW5kLCBkYXRhRW5kKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDbG9zZXMgdGhlIGluZGV4IGFuZCBibG9vbWZpbHRlciwgbWFraW5nIHRoZSBwdWJsaWMgc3RhdGUgb2YgdGhpcyB3cml0ZXIgdmFsaWQgZm9yIGNvbnN1bXB0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBmbHVzaEJmKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LkZJTFRFUikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5GSUxURVIpOwotICAgICAgICAgICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbVBsdXMgc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW1QbHVzKHBhdGgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYmxvb20gZmlsdGVyCi0gICAgICAgICAgICAgICAgICAgIEJsb29tRmlsdGVyU2VyaWFsaXplci5zZXJpYWxpemUoKEJsb29tRmlsdGVyKSBiZiwgc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5zeW5jKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCBwYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQogICAgICAgICBwdWJsaWMgdm9pZCBtYXJrKCkKICAgICAgICAgewotICAgICAgICAgICAgbWFyayA9IGluZGV4RmlsZS5tYXJrKCk7CisgICAgICAgICAgICBtYXJrID0gd3JpdGVyLm1hcmsoKTsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0QW5kVHJ1bmNhdGUoKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyB3ZSBjYW4ndCB1bi1zZXQgdGhlIGJsb29tIGZpbHRlciBhZGRpdGlvbiwgYnV0IGV4dHJhIGtleXMgaW4gdGhlcmUgYXJlIGhhcm1sZXNzLgotICAgICAgICAgICAgLy8gd2UgY2FuJ3QgcmVzZXQgZGJ1aWxkZXIgZWl0aGVyLCBidXQgdGhhdCBpcyB0aGUgbGFzdCB0aGluZyBjYWxsZWQgaW4gYWZ0ZXJhcHBlbmQgc28KKyAgICAgICAgICAgIC8vIHdlIGNhbid0IHJlc2V0IGRidWlsZGVyIGVpdGhlciwgYnV0IHRoYXQgaXMgdGhlIGxhc3QgdGhpbmcgY2FsbGVkIGluIGFmdGVyYXBwZW5kLCBzbwogICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoYXQgaWYgdGhhdCB3b3JrZWQgdGhlbiB3ZSB3b24ndCBiZSB0cnlpbmcgdG8gcmVzZXQuCi0gICAgICAgICAgICBpbmRleEZpbGUucmVzZXRBbmRUcnVuY2F0ZShtYXJrKTsKKyAgICAgICAgICAgIHdyaXRlci5yZXNldEFuZFRydW5jYXRlKG1hcmspOwogICAgICAgICB9CiAKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9QcmVwYXJlKCkKICAgICAgICAgewotICAgICAgICAgICAgZmx1c2hCZigpOworICAgICAgICAgICAgY2hlY2tOb3ROdWxsKGZpcnN0KTsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbChsYXN0KTsKKworICAgICAgICAgICAgc3VwZXIuZG9QcmVwYXJlKCk7CiAKICAgICAgICAgICAgIC8vIHRydW5jYXRlIGluZGV4IGZpbGUKLSAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBpbmRleEZpbGUucG9zaXRpb24oKTsKLSAgICAgICAgICAgIGluZGV4RmlsZS5wcmVwYXJlVG9Db21taXQoKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy50cnVuY2F0ZShpbmRleEZpbGUuZ2V0UGF0aCgpLCBwb3NpdGlvbik7CisgICAgICAgICAgICBsb25nIHBvc2l0aW9uID0gd3JpdGVyLnBvc2l0aW9uKCk7CisgICAgICAgICAgICB3cml0ZXIucHJlcGFyZVRvQ29tbWl0KCk7CisgICAgICAgICAgICBGaWxlVXRpbHMudHJ1bmNhdGUod3JpdGVyLmdldFBhdGgoKSwgcG9zaXRpb24pOwogCiAgICAgICAgICAgICAvLyBzYXZlIHN1bW1hcnkKICAgICAgICAgICAgIHN1bW1hcnkucHJlcGFyZVRvQ29tbWl0KCk7Ci0gICAgICAgICAgICB0cnkgKEluZGV4U3VtbWFyeSBpbmRleFN1bW1hcnkgPSBzdW1tYXJ5LmJ1aWxkKGdldFBhcnRpdGlvbmVyKCkpKQorICAgICAgICAgICAgdHJ5IChJbmRleFN1bW1hcnkgaW5kZXhTdW1tYXJ5ID0gc3VtbWFyeS5idWlsZChtZXRhZGF0YS5nZXRMb2NhbCgpLnBhcnRpdGlvbmVyKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyLnNhdmVTdW1tYXJ5KGRlc2NyaXB0b3IsIGZpcnN0LCBsYXN0LCBpbmRleFN1bW1hcnkpOworICAgICAgICAgICAgICAgIG5ldyBJbmRleFN1bW1hcnlDb21wb25lbnQoaW5kZXhTdW1tYXJ5LCBmaXJzdCwgbGFzdCkuc2F2ZShkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVU1NQVJZKSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkZhaWxlZCB0byBzYXZlIGluZGV4IHN1bW1hcnkiLCBleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBwcm90ZWN0ZWQgVGhyb3dhYmxlIGRvQ29tbWl0KFRocm93YWJsZSBhY2N1bXVsYXRlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXhGaWxlLmNvbW1pdChhY2N1bXVsYXRlKTsKKyAgICAgICAgICAgIHJldHVybiB3cml0ZXIuY29tbWl0KGFjY3VtdWxhdGUpOwogICAgICAgICB9CiAKICAgICAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb0Fib3J0KFRocm93YWJsZSBhY2N1bXVsYXRlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3VtbWFyeS5jbG9zZShpbmRleEZpbGUuYWJvcnQoYWNjdW11bGF0ZSkpOworICAgICAgICAgICAgcmV0dXJuIHN1bW1hcnkuY2xvc2Uod3JpdGVyLmFib3J0KGFjY3VtdWxhdGUpKTsKICAgICAgICAgfQogCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwcm90ZWN0ZWQgVGhyb3dhYmxlIGRvUG9zdENsZWFudXAoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCiAgICAgICAgIHsKKyAgICAgICAgICAgIGFjY3VtdWxhdGUgPSBzdXBlci5kb1Bvc3RDbGVhbnVwKGFjY3VtdWxhdGUpOwogICAgICAgICAgICAgYWNjdW11bGF0ZSA9IHN1bW1hcnkuY2xvc2UoYWNjdW11bGF0ZSk7Ci0gICAgICAgICAgICBhY2N1bXVsYXRlID0gYmYuY2xvc2UoYWNjdW11bGF0ZSk7Ci0gICAgICAgICAgICBhY2N1bXVsYXRlID0gYnVpbGRlci5jbG9zZShhY2N1bXVsYXRlKTsKICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwogICAgICAgICB9CiAgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGV4dGVuZHMgU29ydGVkVGFibGVXcml0ZXIuQnVpbGRlcjxCaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXIsIEJpZ1RhYmxlV3JpdGVyLCBCdWlsZGVyPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplciByb3dJbmRleEVudHJ5U2VyaWFsaXplcjsKKyAgICAgICAgcHJpdmF0ZSBJbmRleFdyaXRlciBpbmRleFdyaXRlcjsKKyAgICAgICAgcHJpdmF0ZSBTZXF1ZW50aWFsV3JpdGVyIGRhdGFXcml0ZXI7CisgICAgICAgIHByaXZhdGUgQmlnRm9ybWF0UGFydGl0aW9uV3JpdGVyIHBhcnRpdGlvbldyaXRlcjsKKyAgICAgICAgcHJpdmF0ZSBNbWFwcGVkUmVnaW9uc0NhY2hlIG1tYXBwZWRSZWdpb25zQ2FjaGU7CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihkZXNjcmlwdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGREZWZhdWx0Q29tcG9uZW50cygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyLmFkZERlZmF1bHRDb21wb25lbnRzKCk7CisKKyAgICAgICAgICAgIGFkZENvbXBvbmVudHMoSW1tdXRhYmxlU2V0Lm9mKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCwgQ29tcG9uZW50cy5TVU1NQVJZKSk7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBnZXR0ZXJzIGZvciB0aGUgcmVzb3VyY2VzIG9wZW5lZCBieSBidWlsZEludGVybmFsIG1ldGhvZCBjYW4gYmUgb25seSB1c2VkIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YKKyAgICAgICAgLy8gdGhhdCBtZXRob2QgLSB0aGF0IGlzLCBkdXJpbmcgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGUgc3N0YWJsZS4KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1tYXBwZWRSZWdpb25zQ2FjaGUgZ2V0TW1hcHBlZFJlZ2lvbnNDYWNoZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbnN1cmluZ0luQnVpbGRJbnRlcm5hbENvbnRleHQobW1hcHBlZFJlZ2lvbnNDYWNoZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNlcXVlbnRpYWxXcml0ZXIgZ2V0RGF0YVdyaXRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbnN1cmluZ0luQnVpbGRJbnRlcm5hbENvbnRleHQoZGF0YVdyaXRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJpZ0Zvcm1hdFBhcnRpdGlvbldyaXRlciBnZXRQYXJ0aXRpb25Xcml0ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5zdXJpbmdJbkJ1aWxkSW50ZXJuYWxDb250ZXh0KHBhcnRpdGlvbldyaXRlcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUm93SW5kZXhFbnRyeS5JbmRleFNlcmlhbGl6ZXIgZ2V0Um93SW5kZXhFbnRyeVNlcmlhbGl6ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZW5zdXJpbmdJbkJ1aWxkSW50ZXJuYWxDb250ZXh0KHJvd0luZGV4RW50cnlTZXJpYWxpemVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbmRleFdyaXRlciBnZXRJbmRleFdyaXRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbnN1cmluZ0luQnVpbGRJbnRlcm5hbENvbnRleHQoaW5kZXhXcml0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSA8VD4gVCBlbnN1cmluZ0luQnVpbGRJbnRlcm5hbENvbnRleHQoVCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlKHZhbHVlICE9IG51bGwsICJUaGlzIGdldHRlciBjYW4gYmUgdXNlZCBvbmx5IGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIHNzdGFibGUgY29uc3RydWN0b3IuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHkuIik7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEJpZ1RhYmxlV3JpdGVyIGJ1aWxkSW50ZXJuYWwoTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyLCBPd25lciBvd25lcikKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbW1hcHBlZFJlZ2lvbnNDYWNoZSA9IG5ldyBNbWFwcGVkUmVnaW9uc0NhY2hlKCk7CisgICAgICAgICAgICAgICAgcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIgPSBuZXcgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyKGRlc2NyaXB0b3IudmVyc2lvbiwgZ2V0U2VyaWFsaXphdGlvbkhlYWRlcigpLCBvd25lciAhPSBudWxsID8gb3duZXIuZ2V0TWV0cmljcygpIDogbnVsbCk7CisgICAgICAgICAgICAgICAgZGF0YVdyaXRlciA9IERhdGFDb21wb25lbnQuYnVpbGRXcml0ZXIoZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUYWJsZU1ldGFkYXRhUmVmKCkuZ2V0TG9jYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJT09wdGlvbnMoKS53cml0ZXJPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1ldGFkYXRhQ29sbGVjdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlTmV3VHJhY2tlci5vcFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJT09wdGlvbnMoKS5mbHVzaENvbXByZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBpbmRleFdyaXRlciA9IG5ldyBJbmRleFdyaXRlcih0aGlzKTsKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIgPSBuZXcgQmlnRm9ybWF0UGFydGl0aW9uV3JpdGVyKGdldFNlcmlhbGl6YXRpb25IZWFkZXIoKSwgZGF0YVdyaXRlciwgZGVzY3JpcHRvci52ZXJzaW9uLCByb3dJbmRleEVudHJ5U2VyaWFsaXplci5pbmRleEluZm9TZXJpYWxpemVyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmlnVGFibGVXcml0ZXIodGhpcywgbGlmZWN5Y2xlTmV3VHJhY2tlciwgb3duZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gfCBFcnJvciBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGVzLmNsb3NlQW5kQWRkU3VwcHJlc3NlZChleCwgcGFydGl0aW9uV3JpdGVyLCBpbmRleFdyaXRlciwgZGF0YVdyaXRlciwgbW1hcHBlZFJlZ2lvbnNDYWNoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcm93SW5kZXhFbnRyeVNlcmlhbGl6ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIGluZGV4V3JpdGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBkYXRhV3JpdGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIgPSBudWxsOworICAgICAgICAgICAgICAgIG1tYXBwZWRSZWdpb25zQ2FjaGUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlWmVyb0NvcHlXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVplcm9Db3B5V3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NDAzNDkuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlWmVyb0NvcHlXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWc7Ci0KLWltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZU5ld1RyYWNrZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5CdWZmZXJUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlTXVsdGlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlck9wdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuQXN5bmNTdHJlYW1pbmdJbnB1dFBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5OwotCi1wdWJsaWMgY2xhc3MgQmlnVGFibGVaZXJvQ29weVdyaXRlciBleHRlbmRzIFNTVGFibGUgaW1wbGVtZW50cyBTU1RhYmxlTXVsdGlXcml0ZXIKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQmlnVGFibGVaZXJvQ29weVdyaXRlci5jbGFzcyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBTU1RhYmxlUmVhZGVyIGZpbmFsUmVhZGVyOwotICAgIHByaXZhdGUgZmluYWwgTWFwPENvbXBvbmVudC5UeXBlLCBTZXF1ZW50aWFsV3JpdGVyPiBjb21wb25lbnRXcml0ZXJzOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2VxdWVudGlhbFdyaXRlck9wdGlvbiBXUklURVJfT1BUSU9OID0KLSAgICAgICAgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmlja2xlRnN5bmMoZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVmZmVyU2l6ZSgyIDw8IDIwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclR5cGUoQnVmZmVyVHlwZS5PRkZfSEVBUCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1tdXRhYmxlU2V0PENvbXBvbmVudD4gU1VQUE9SVEVEX0NPTVBPTkVOVFMgPQotICAgICAgICBJbW11dGFibGVTZXQub2YoQ29tcG9uZW50LkRBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQuUFJJTUFSWV9JTkRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudC5TVU1NQVJZLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50LlNUQVRTLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50LkNPTVBSRVNTSU9OX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQuRklMVEVSLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50LkRJR0VTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudC5DUkMpOwotCi0gICAgcHVibGljIEJpZ1RhYmxlWmVyb0NvcHlXcml0ZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGFSZWYgbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248Q29tcG9uZW50PiBjb21wb25lbnRzKQotICAgIHsKLSAgICAgICAgc3VwZXIoZGVzY3JpcHRvciwgSW1tdXRhYmxlU2V0LmNvcHlPZihjb21wb25lbnRzKSwgbWV0YWRhdGEsIERhdGFiYXNlRGVzY3JpcHRvci5nZXREaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3koKSk7Ci0KLSAgICAgICAgbGlmZWN5Y2xlTmV3VHJhY2tlci50cmFja05ldyh0aGlzKTsKLSAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB0aGlzLmNvbXBvbmVudFdyaXRlcnMgPSBuZXcgRW51bU1hcDw+KENvbXBvbmVudC5UeXBlLmNsYXNzKTsKLQotICAgICAgICBpZiAoIVNVUFBPUlRFRF9DT01QT05FTlRTLmNvbnRhaW5zQWxsKGNvbXBvbmVudHMpKQotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGZvcm1hdCgiVW5zdXBwb3J0ZWQgc3RyZWFtaW5nIGNvbXBvbmVudCBkZXRlY3RlZCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHMuZGlmZmVyZW5jZShJbW11dGFibGVTZXQuY29weU9mKGNvbXBvbmVudHMpLCBTVVBQT1JURURfQ09NUE9ORU5UUykpKTsKLQotICAgICAgICBmb3IgKENvbXBvbmVudCBjIDogY29tcG9uZW50cykKLSAgICAgICAgICAgIGNvbXBvbmVudFdyaXRlcnMucHV0KGMudHlwZSwgbWFrZVdyaXRlcihkZXNjcmlwdG9yLCBjKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU2VxdWVudGlhbFdyaXRlciBtYWtlV3JpdGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU2VxdWVudGlhbFdyaXRlcihuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpLCBXUklURVJfT1BUSU9OLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlKERhdGFJbnB1dFBsdXMgaW4sIGxvbmcgc2l6ZSwgU2VxdWVudGlhbFdyaXRlciBvdXQpIHRocm93cyBGU1dyaXRlRXJyb3IKLSAgICB7Ci0gICAgICAgIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDEgPDwgMjA7Ci0gICAgICAgIGxvbmcgYnl0ZXNSZWFkID0gMDsKLSAgICAgICAgYnl0ZVtdIGJ1ZmYgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoYnl0ZXNSZWFkIDwgc2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgdG9SZWFkID0gKGludCkgTWF0aC5taW4oc2l6ZSAtIGJ5dGVzUmVhZCwgQlVGRkVSX1NJWkUpOwotICAgICAgICAgICAgICAgIGluLnJlYWRGdWxseShidWZmLCAwLCB0b1JlYWQpOwotICAgICAgICAgICAgICAgIGludCBjb3VudCA9IE1hdGgubWluKHRvUmVhZCwgQlVGRkVSX1NJWkUpOwotICAgICAgICAgICAgICAgIG91dC53cml0ZShidWZmLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgYnl0ZXNSZWFkICs9IGNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0LnN5bmMoKTsgLy8gZmluaXNoIHdpbGwgYWxzbyBjYWxsIHN5bmMoKS4gTGVhdmluZyBoZXJlIHRvIGdldCBzdHVmZiBmbHVzaGVkIGFzIGVhcmx5IGFzIHBvc3NpYmxlCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgb3V0LmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhcHBlbmQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbikKLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgYnkgQmlnVGFibGVCbG9ja1dyaXRlciIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IGZpbmlzaChsb25nIHJlcGFpcmVkQXQsIGxvbmcgbWF4RGF0YUFnZSwgYm9vbGVhbiBvcGVuUmVzdWx0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbmlzaChvcGVuUmVzdWx0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBmaW5pc2goYm9vbGVhbiBvcGVuUmVzdWx0KQotICAgIHsKLSAgICAgICAgc2V0T3BlblJlc3VsdChvcGVuUmVzdWx0KTsKLQotICAgICAgICBmb3IgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyIDogY29tcG9uZW50V3JpdGVycy52YWx1ZXMoKSkKLSAgICAgICAgICAgIHdyaXRlci5maW5pc2goKTsKLQotICAgICAgICByZXR1cm4gZmluaXNoZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBmaW5pc2hlZCgpCi0gICAgewotICAgICAgICBpZiAoZmluYWxSZWFkZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIGZpbmFsUmVhZGVyID0gU1NUYWJsZVJlYWRlci5vcGVuKGRlc2NyaXB0b3IsIGNvbXBvbmVudHMsIG1ldGFkYXRhKTsKLQotICAgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZihmaW5hbFJlYWRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNTVGFibGVNdWx0aVdyaXRlciBzZXRPcGVuUmVzdWx0KGJvb2xlYW4gb3BlblJlc3VsdCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEZpbGVQb2ludGVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUYWJsZUlkIGdldFRhYmxlSWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1ldGFkYXRhLmlkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUaHJvd2FibGUgY29tbWl0KFRocm93YWJsZSBhY2N1bXVsYXRlKQotICAgIHsKLSAgICAgICAgZm9yIChTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA6IGNvbXBvbmVudFdyaXRlcnMudmFsdWVzKCkpCi0gICAgICAgICAgICBhY2N1bXVsYXRlID0gd3JpdGVyLmNvbW1pdChhY2N1bXVsYXRlKTsKLSAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFRocm93YWJsZSBhYm9ydChUaHJvd2FibGUgYWNjdW11bGF0ZSkKLSAgICB7Ci0gICAgICAgIGZvciAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgOiBjb21wb25lbnRXcml0ZXJzLnZhbHVlcygpKQotICAgICAgICAgICAgYWNjdW11bGF0ZSA9IHdyaXRlci5hYm9ydChhY2N1bXVsYXRlKTsKLSAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZVRvQ29tbWl0KCkKLSAgICB7Ci0gICAgICAgIGZvciAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgOiBjb21wb25lbnRXcml0ZXJzLnZhbHVlcygpKQotICAgICAgICAgICAgd3JpdGVyLnByZXBhcmVUb0NvbW1pdCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICB7Ci0gICAgICAgIGZvciAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgOiBjb21wb25lbnRXcml0ZXJzLnZhbHVlcygpKQotICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd3JpdGVDb21wb25lbnQoQ29tcG9uZW50LlR5cGUgdHlwZSwgRGF0YUlucHV0UGx1cyBpbiwgbG9uZyBzaXplKSB0aHJvd3MgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbG9nZ2VyLmluZm8oIldyaXRpbmcgY29tcG9uZW50IHt9IHRvIHt9IGxlbmd0aCB7fSIsIHR5cGUsIGNvbXBvbmVudFdyaXRlcnMuZ2V0KHR5cGUpLmdldFBhdGgoKSwgcHJldHR5UHJpbnRNZW1vcnkoc2l6ZSkpOwotCi0gICAgICAgIGlmIChpbiBpbnN0YW5jZW9mIEFzeW5jU3RyZWFtaW5nSW5wdXRQbHVzKQotICAgICAgICAgICAgd3JpdGUoKEFzeW5jU3RyZWFtaW5nSW5wdXRQbHVzKSBpbiwgc2l6ZSwgY29tcG9uZW50V3JpdGVycy5nZXQodHlwZSkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB3cml0ZShpbiwgc2l6ZSwgY29tcG9uZW50V3JpdGVycy5nZXQodHlwZSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB3cml0ZShBc3luY1N0cmVhbWluZ0lucHV0UGx1cyBpbiwgbG9uZyBzaXplLCBTZXF1ZW50aWFsV3JpdGVyIHdyaXRlcikgdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJCbG9jayBXcml0aW5nIGNvbXBvbmVudCB0byB7fSBsZW5ndGgge30iLCB3cml0ZXIuZ2V0UGF0aCgpLCBwcmV0dHlQcmludE1lbW9yeShzaXplKSk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGluLmNvbnN1bWUod3JpdGVyOjp3cml0ZURpcmVjdGx5VG9DaGFubmVsLCBzaXplKTsKLSAgICAgICAgICAgIHdyaXRlci5zeW5jKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEVPRkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbi5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDbG9zZWRDaGFubmVsRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEZTV3JpdGVFcnJvciB0cmlnZ2VycyBkaXNrIGZhaWx1cmUgcG9saWN5LCBidXQgaWYgd2UgZ2V0IGEgY29ubmVjdGlvbiBpc3N1ZSB3ZSBkbyBub3Qgd2FudCB0byBkbyB0aGF0Ci0gICAgICAgICAgICAvLyBzbyByZXRocm93IHNvIHRoZSBlcnJvciBoYW5kbGluZyBsb2dpYyBoaWdoZXIgdXAgaXMgYWJsZSB0byBkZWFsIHdpdGggdGhpcwotICAgICAgICAgICAgLy8gc2VlIENBU1NBTkRSQS0xNzExNgotICAgICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCB3cml0ZXIuZ2V0UGF0aCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9JbmRleFN0YXRlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvSW5kZXhTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3Njk3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvSW5kZXhTdGF0ZS5qYXZhCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQm91bmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0NvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ1ByZWZpeDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0U1NUYWJsZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YVBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKKworLy8gVXNlZCBieSBpbmRleGVkIHJlYWRlcnMgdG8gc3RvcmUgd2hlcmUgdGhleSBhcmUgb2YgdGhlIGluZGV4LgorcHVibGljIGNsYXNzIEluZGV4U3RhdGUgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlCit7CisgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFNTVGFibGVJdGVyYXRvcjxSb3dJbmRleEVudHJ5Pi5BYnN0cmFjdFJlYWRlciByZWFkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yOworCisgICAgcHJpdmF0ZSBmaW5hbCBSb3dJbmRleEVudHJ5IGluZGV4RW50cnk7CisgICAgcHJpdmF0ZSBmaW5hbCBSb3dJbmRleEVudHJ5LkluZGV4SW5mb1JldHJpZXZlciBpbmRleEluZm9SZXRyaWV2ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJldmVyc2VkOworCisgICAgcHJpdmF0ZSBpbnQgY3VycmVudEluZGV4SWR4OworCisgICAgLy8gTWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2sgY29ycmVzcG9uZGluZyB0byBjdXJyZW50SW5kZXhJZHguCisgICAgcHJpdmF0ZSBEYXRhUG9zaXRpb24gbWFyazsKKworICAgIHB1YmxpYyBJbmRleFN0YXRlKEFic3RyYWN0U1NUYWJsZUl0ZXJhdG9yPFJvd0luZGV4RW50cnk+LkFic3RyYWN0UmVhZGVyIHJlYWRlciwgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwgUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBib29sZWFuIHJldmVyc2VkLCBGaWxlSGFuZGxlIGluZGV4RmlsZSkKKyAgICB7CisgICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyOworICAgICAgICB0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOworICAgICAgICB0aGlzLmluZGV4RW50cnkgPSBpbmRleEVudHJ5OworICAgICAgICB0aGlzLmluZGV4SW5mb1JldHJpZXZlciA9IGluZGV4RW50cnkub3BlbldpdGhJbmRleChpbmRleEZpbGUpOworICAgICAgICB0aGlzLnJldmVyc2VkID0gcmV2ZXJzZWQ7CisgICAgICAgIHRoaXMuY3VycmVudEluZGV4SWR4ID0gcmV2ZXJzZWQgPyBpbmRleEVudHJ5LmJsb2NrQ291bnQoKSA6IC0xOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRG9uZSgpCisgICAgeworICAgICAgICByZXR1cm4gcmV2ZXJzZWQgPyBjdXJyZW50SW5kZXhJZHggPCAwIDogY3VycmVudEluZGV4SWR4ID49IGluZGV4RW50cnkuYmxvY2tDb3VudCgpOworICAgIH0KKworICAgIC8vIFNldHMgdGhlIHJlYWRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGJsb2NrSWR4LgorICAgIHB1YmxpYyB2b2lkIHNldFRvQmxvY2soaW50IGJsb2NrSWR4KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChibG9ja0lkeCA+PSAwICYmIGJsb2NrSWR4IDwgaW5kZXhFbnRyeS5ibG9ja0NvdW50KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlYWRlci5zZWVrVG9Qb3NpdGlvbihjb2x1bW5PZmZzZXQoYmxvY2tJZHgpKTsKKyAgICAgICAgICAgIG1hcmsgPSByZWFkZXIuZmlsZS5tYXJrKCk7CisgICAgICAgICAgICByZWFkZXIuZGVzZXJpYWxpemVyLmNsZWFyU3RhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnRJbmRleElkeCA9IGJsb2NrSWR4OworICAgICAgICByZWFkZXIub3Blbk1hcmtlciA9IGJsb2NrSWR4ID4gMCA/IGluZGV4KGJsb2NrSWR4IC0gMSkuZW5kT3Blbk1hcmtlciA6IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGNvbHVtbk9mZnNldChpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gaW5kZXhFbnRyeS5wb3NpdGlvbiArIGluZGV4KGkpLm9mZnNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGJsb2Nrc0NvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmRleEVudHJ5LmJsb2NrQ291bnQoKTsKKyAgICB9CisKKyAgICAvLyBVcGRhdGUgdGhlIGJsb2NrIGlkeCBiYXNlZCBvbiB0aGUgY3VycmVudCByZWFkZXIgcG9zaXRpb24gaWYgd2UncmUgcGFzdCB0aGUgY3VycmVudCBibG9jay4KKyAgICAvLyBUaGlzIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIGZvcndhcmQgaXRlcmF0aW9uIChmb3IgcmV2ZXJzZSBvbmVzLCB3aGVuIHdlIHJlYWNoIHRoZSBlbmQgb2YgYSBibG9jayB3ZQorICAgIC8vIHNob3VsZCBzZWVrIHRvIHRoZSBwcmV2aW91cyBvbmUsIG5vdCB1cGRhdGUgdGhlIGluZGV4IHN0YXRlIGFuZCBjb250aW51ZSkuCisgICAgcHVibGljIHZvaWQgdXBkYXRlQmxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGFzc2VydCAhcmV2ZXJzZWQ7CisKKyAgICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBjdXJyZW50QmxvY2tJZHggPCAwLCBpdCBtZWFucyBzZXRUb0Jsb2NrKCkgaGFzIG5ldmVyIGJlZW4gY2FsbGVkLCBzbyBpdCBtZWFucworICAgICAgICAvLyB3ZSdyZSBhYm91dCB0byByZWFkIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFydGl0aW9uLCBidXQgaGF2ZW4ndCAicHJlcGFyZWQiIHRoZSBJbmRleFN0YXRlIHlldC4KKyAgICAgICAgLy8gRG8gc28gYnkgc2V0dGluZyB1cyBvbiB0aGUgZmlyc3QgYmxvY2suCisgICAgICAgIGlmIChjdXJyZW50SW5kZXhJZHggPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBzZXRUb0Jsb2NrKDApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGN1cnJlbnRJbmRleElkeCArIDEgPCBpbmRleEVudHJ5LmJsb2NrQ291bnQoKSAmJiBpc1Bhc3RDdXJyZW50QmxvY2soKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVhZGVyLm9wZW5NYXJrZXIgPSBjdXJyZW50SW5kZXgoKS5lbmRPcGVuTWFya2VyOworICAgICAgICAgICAgKytjdXJyZW50SW5kZXhJZHg7CisKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gc2V0IHRoZSBtYXJrLCBhbmQgd2UgaGF2ZSB0byBzZXQgaXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2suIFNvIGlmIHdlJ3JlIG5vdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBibG9jaywgdGhpcyBmb3JjZXMgdXMgdG8gYSB3ZWlyZCBzZWVrIGRhbmNlLgorICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gd2hlbiByZWFkaW5nIG9sZCBmaWxlIGhvd2V2ZXIuCisgICAgICAgICAgICBsb25nIHN0YXJ0T2ZCbG9jayA9IGNvbHVtbk9mZnNldChjdXJyZW50SW5kZXhJZHgpOworICAgICAgICAgICAgbG9uZyBjdXJyZW50RmlsZVBvaW50ZXIgPSByZWFkZXIuZmlsZS5nZXRGaWxlUG9pbnRlcigpOworICAgICAgICAgICAgaWYgKHN0YXJ0T2ZCbG9jayA9PSBjdXJyZW50RmlsZVBvaW50ZXIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFyayA9IHJlYWRlci5maWxlLm1hcmsoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWFkZXIuc2Vla1RvUG9zaXRpb24oc3RhcnRPZkJsb2NrKTsKKyAgICAgICAgICAgICAgICBtYXJrID0gcmVhZGVyLmZpbGUubWFyaygpOworICAgICAgICAgICAgICAgIHJlYWRlci5zZWVrVG9Qb3NpdGlvbihjdXJyZW50RmlsZVBvaW50ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgd2UndmUgY3Jvc3NlZCBhbiBpbmRleCBib3VuZGFyeSAoYmFzZWQgb24gdGhlIG1hcmsgb24gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5kZXggYmxvY2spLgorICAgIHB1YmxpYyBib29sZWFuIGlzUGFzdEN1cnJlbnRCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYXNzZXJ0IHJlYWRlci5kZXNlcmlhbGl6ZXIgIT0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5maWxlLmJ5dGVzUGFzdE1hcmsobWFyaykgPj0gY3VycmVudEluZGV4KCkud2lkdGg7CisgICAgfQorCisgICAgcHVibGljIGludCBjdXJyZW50QmxvY2tJZHgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRJbmRleElkeDsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5kZXhJbmZvIGN1cnJlbnRJbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGluZGV4KGN1cnJlbnRJbmRleElkeCk7CisgICAgfQorCisgICAgcHVibGljIEluZGV4SW5mbyBpbmRleChpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gaW5kZXhJbmZvUmV0cmlldmVyLmNvbHVtbnNJbmRleChpKTsKKyAgICB9CisKKyAgICAvLyBGaW5kcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGJsb2NrIGNvbnRhaW5pbmcgdGhlIHByb3ZpZGVkIGJvdW5kLCBzdGFydGluZyBhdCB0aGUgcHJvdmlkZWQgaW5kZXguCisgICAgLy8gV2lsbCBiZSAtMSBpZiB0aGUgYm91bmQgaXMgYmVmb3JlIGFueSBibG9jaywgYW5kIGJsb2Nrc0NvdW50KCkgaWYgaXQgaXMgYWZ0ZXIgZXZlcnkgYmxvY2suCisgICAgcHVibGljIGludCBmaW5kQmxvY2tJbmRleChDbHVzdGVyaW5nQm91bmQ8Pz4gYm91bmQsIGludCBmcm9tSWR4KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChib3VuZC5pc0JvdHRvbSgpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoYm91bmQuaXNUb3AoKSkKKyAgICAgICAgICAgIHJldHVybiBibG9ja3NDb3VudCgpOworCisgICAgICAgIHJldHVybiBpbmRleEZvcihib3VuZCwgZnJvbUlkeCk7CisgICAgfQorCisgICAgcHVibGljIGludCBpbmRleEZvcihDbHVzdGVyaW5nUHJlZml4PD8+IG5hbWUsIGludCBsYXN0SW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSW5kZXhJbmZvIHRhcmdldCA9IG5ldyBJbmRleEluZm8obmFtZSwgbmFtZSwgMCwgMCwgbnVsbCk7CisgICAgICAgIC8qCisgICAgICAgIFRha2UgdGhlIGV4YW1wbGUgZnJvbSB0aGUgdW5pdCB0ZXN0LCBhbmQgc2F5IHlvdXIgaW5kZXggbG9va3MgbGlrZSB0aGlzOgorICAgICAgICBbMC4uNV1bMTAuLjE1XVsyMC4uMjVdCisgICAgICAgIGFuZCB5b3UgbG9vayBmb3IgdGhlIHNsaWNlIFsxMy4uMTddLgorCisgICAgICAgIFdoZW4gZG9pbmcgZm9yd2FyZCBzbGljZSwgd2UgYXJlIGRvaW5nIGEgYmluYXJ5IHNlYXJjaCBjb21wYXJpbmcgMTMgKHRoZSBzdGFydCBvZiB0aGUgcXVlcnkpCisgICAgICAgIHRvIHRoZSBsYXN0TmFtZSBwYXJ0IG9mIHRoZSBpbmRleCBzbG90LiBZb3UnbGwgZW5kIHVwIHdpdGggdGhlICJmaXJzdCIgc2xvdCwgZ29pbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0LAorICAgICAgICB0aGF0IG1heSBjb250YWluIHRoZSBzdGFydC4KKworICAgICAgICBXaGVuIGRvaW5nIGEgcmV2ZXJzZSBzbGljZSwgd2UgZG8gdGhlIHNhbWUgdGhpbmcsIG9ubHkgdXNpbmcgYXMgYSBzdGFydCBjb2x1bW4gdGhlIGVuZCBvZiB0aGUgcXVlcnksCisgICAgICAgIGkuZS4gMTcgaW4gdGhpcyBleGFtcGxlLCBjb21wYXJlZCB0byB0aGUgZmlyc3ROYW1lIHBhcnQgb2YgdGhlIGluZGV4IHNsb3RzLiAgYnNlYXJjaCB3aWxsIGdpdmUgdXMgdGhlCisgICAgICAgIGZpcnN0IHNsb3Qgd2hlcmUgZmlyc3ROYW1lID4gc3RhcnQgKFsyMC4uMjVdIGhlcmUpLCBzbyB3ZSBzdWJ0cmFjdCBhbiBleHRyYSBvbmUgdG8gZ2V0IHRoZSBzbG90IGp1c3QgYmVmb3JlLgorICAgICAgICAqLworICAgICAgICBpbnQgc3RhcnRJZHggPSAwOworICAgICAgICBpbnQgZW5kSWR4ID0gaW5kZXhFbnRyeS5ibG9ja0NvdW50KCkgLSAxOworCisgICAgICAgIGlmIChyZXZlcnNlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxhc3RJbmRleCA8IGVuZElkeCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlbmRJZHggPSBsYXN0SW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobGFzdEluZGV4ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGFydElkeCA9IGxhc3RJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBpbmRleCA9IGJpbmFyeVNlYXJjaCh0YXJnZXQsIGNvbXBhcmF0b3IuaW5kZXhDb21wYXJhdG9yKHJldmVyc2VkKSwgc3RhcnRJZHgsIGVuZElkeCk7CisgICAgICAgIHJldHVybiAoaW5kZXggPCAwID8gLWluZGV4IC0gKHJldmVyc2VkID8gMiA6IDEpIDogaW5kZXgpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGJpbmFyeVNlYXJjaChJbmRleEluZm8ga2V5LCBDb21wYXJhdG9yPEluZGV4SW5mbz4gYywgaW50IGxvdywgaW50IGhpZ2gpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgd2hpbGUgKGxvdyA8PSBoaWdoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbWlkID0gKGxvdyArIGhpZ2gpID4+PiAxOworICAgICAgICAgICAgSW5kZXhJbmZvIG1pZFZhbCA9IGluZGV4KG1pZCk7CisgICAgICAgICAgICBpbnQgY21wID0gYy5jb21wYXJlKG1pZFZhbCwga2V5KTsKKworICAgICAgICAgICAgaWYgKGNtcCA8IDApCisgICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGNtcCA+IDApCisgICAgICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG1pZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLShsb3cgKyAxKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJJbmRleFN0YXRlKGluZGV4U2l6ZT0lZCwgY3VycmVudEJsb2NrPSVkLCByZXZlcnNlZD0lYikiLCBpbmRleEVudHJ5LmJsb2NrQ291bnQoKSwgY3VycmVudEluZGV4SWR4LCByZXZlcnNlZCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGluZGV4SW5mb1JldHJpZXZlci5jbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9JbmRleFN1bW1hcnlDb21wb25lbnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9JbmRleFN1bW1hcnlDb21wb25lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2E0MGNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0luZGV4U3VtbWFyeUNvbXBvbmVudC5qYXZhCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOworCitwdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5Q29tcG9uZW50Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEluZGV4U3VtbWFyeUNvbXBvbmVudC5jbGFzcyk7CisKKyAgICBwdWJsaWMgZmluYWwgSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeTsKKyAgICBwdWJsaWMgZmluYWwgRGVjb3JhdGVkS2V5IGZpcnN0OworICAgIHB1YmxpYyBmaW5hbCBEZWNvcmF0ZWRLZXkgbGFzdDsKKworICAgIHB1YmxpYyBJbmRleFN1bW1hcnlDb21wb25lbnQoSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSwgRGVjb3JhdGVkS2V5IGZpcnN0LCBEZWNvcmF0ZWRLZXkgbGFzdCkKKyAgICB7CisgICAgICAgIHRoaXMuaW5kZXhTdW1tYXJ5ID0gaW5kZXhTdW1tYXJ5OworICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7CisgICAgICAgIHRoaXMubGFzdCA9IGxhc3Q7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQYWlyPERlY29yYXRlZEtleSwgRGVjb3JhdGVkS2V5PiBsb2FkRmlyc3RBbmRMYXN0S2V5KEZpbGUgc3VtbWFyeUZpbGUsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoIXN1bW1hcnlGaWxlLmV4aXN0cygpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJJbmRleCBzdW1tYXJ5IHt9IGRvZXMgbm90IGV4aXN0Iiwgc3VtbWFyeUZpbGUuYWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbVBsdXMgaVN0cmVhbSA9IHN1bW1hcnlGaWxlLm5ld0lucHV0U3RyZWFtKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhTdW1tYXJ5LkluZGV4U3VtbWFyeVNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZUZpcnN0TGFzdEtleShpU3RyZWFtLCBwYXJ0aXRpb25lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGluZGV4IHN1bW1hcnksIGZpcnN0IGtleSBhbmQgbGFzdCBrZXkgZnJvbSBTdW1tYXJ5LmRiIGZpbGUgaWYgaXQgZXhpc3RzLgorICAgICAqIDxwPgorICAgICAqIGlmIGxvYWRlZCBpbmRleCBzdW1tYXJ5IGhhcyBkaWZmZXJlbnQgaW5kZXggaW50ZXJ2YWwgZnJvbSBjdXJyZW50IHZhbHVlIHN0b3JlZCBpbiBzY2hlbWEsCisgICAgICogdGhlbiBTdW1tYXJ5LmRiIGZpbGUgd2lsbCBiZSBkZWxldGVkIGFuZCBuZWVkIHRvIGJlIHJlYnVpbHQuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIEluZGV4U3VtbWFyeUNvbXBvbmVudCBsb2FkKEZpbGUgc3VtbWFyeUZpbGUsIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKCFzdW1tYXJ5RmlsZS5leGlzdHMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQorICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiSW5kZXggc3VtbWFyeSB7fSBkb2VzIG5vdCBleGlzdCIsIHN1bW1hcnlGaWxlLmFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgSW5kZXhTdW1tYXJ5IHN1bW1hcnkgPSBudWxsOworICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbVBsdXMgaVN0cmVhbSA9IHN1bW1hcnlGaWxlLm5ld0lucHV0U3RyZWFtKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1bW1hcnkgPSBJbmRleFN1bW1hcnkuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnBhcnRpdGlvbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnBhcmFtcy5taW5JbmRleEludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnBhcmFtcy5tYXhJbmRleEludGVydmFsKTsKKyAgICAgICAgICAgIERlY29yYXRlZEtleSBmaXJzdCA9IG1ldGFkYXRhLnBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoTGVuZ3RoKGlTdHJlYW0pKTsKKyAgICAgICAgICAgIERlY29yYXRlZEtleSBsYXN0ID0gbWV0YWRhdGEucGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhMZW5ndGgoaVN0cmVhbSkpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4U3VtbWFyeUNvbXBvbmVudChzdW1tYXJ5LCBmaXJzdCwgbGFzdCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3VtbWFyeSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHN1bW1hcnkuY2xvc2UoKTsKKworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNhbm5vdCBkZXNlcmlhbGl6ZSBpbmRleCBzdW1tYXJ5IGZyb20gJXMiLCBzdW1tYXJ5RmlsZSksIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSW5kZXhTdW1tYXJ5Q29tcG9uZW50IGxvYWRPckRlbGV0ZUNvcnJ1cHRlZChGaWxlIHN1bW1hcnlGaWxlLCBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbG9hZChzdW1tYXJ5RmlsZSwgbWV0YWRhdGEpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VtbWFyeUZpbGUuZGVsZXRlSWZFeGlzdHMoKTsKKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2F2ZSBpbmRleCBzdW1tYXJ5IHRvIFN1bW1hcnkuZGIgZmlsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzYXZlKEZpbGUgc3VtbWFyeUZpbGUsIGJvb2xlYW4gZGVsZXRlT25GYWlsdXJlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChzdW1tYXJ5RmlsZS5leGlzdHMoKSkKKyAgICAgICAgICAgIHN1bW1hcnlGaWxlLmRlbGV0ZSgpOworCisgICAgICAgIHRyeSAoRGF0YU91dHB1dFN0cmVhbVBsdXMgb1N0cmVhbSA9IHN1bW1hcnlGaWxlLm5ld091dHB1dFN0cmVhbShGaWxlLldyaXRlTW9kZS5PVkVSV1JJVEUpKQorICAgICAgICB7CisgICAgICAgICAgICBJbmRleFN1bW1hcnkuc2VyaWFsaXplci5zZXJpYWxpemUoaW5kZXhTdW1tYXJ5LCBvU3RyZWFtKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aExlbmd0aChmaXJzdC5nZXRLZXkoKSwgb1N0cmVhbSk7CisgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhMZW5ndGgobGFzdC5nZXRLZXkoKSwgb1N0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGVsZXRlT25GYWlsdXJlKQorICAgICAgICAgICAgICAgIHN1bW1hcnlGaWxlLmRlbGV0ZUlmRXhpc3RzKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWxlZCB0byBzYXZlIGluZGV4IHN1bW1hcnkgdG8gIiArIHN1bW1hcnlGaWxlLCBleCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvUm93SW5kZXhFbnRyeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL1Jvd0luZGV4RW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWJmZWUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL1Jvd0luZGV4RW50cnkuamF2YQpAQCAtMCwwICsxLDg4NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuSGlzdG9ncmFtOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5BcnJheUNsdXN0ZXJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLk1lc3NhZ2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVhZENvbW1hbmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVqZWN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RSb3dJbmRleEVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5UcmFja2VkRGF0YUlucHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkRlZmF1bHROYW1lRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLk1ldHJpY05hbWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuVGFibGVNZXRyaWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5QYXJhbVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PYmplY3RTaXplczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy52aW50LlZJbnRDb2Rpbmc7CitpbXBvcnQgb3JnLmdpdGh1Yi5qYW1tLlVubWV0ZXJlZDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNhc3NhbmRyYU1ldHJpY3NSZWdpc3RyeS5NZXRyaWNzOworCisvKioKKyAqIEJpbmFyeSBmb3JtYXQgb2Yge0Bjb2RlIFJvd0luZGV4RW50cnl9IGlzIGRlZmluZWQgYXMgZm9sbG93czoKKyAqIHtAY29kZQorICogKGxvbmcpIHBvc2l0aW9uICg2NCBiaXQgbG9uZywgdmludCBlbmNvZGVkKQorICogIChpbnQpIHNlcmlhbGl6ZWQgc2l6ZSBvZiBkYXRhIHRoYXQgZm9sbG93cyAoMzIgYml0IGludCwgdmludCBlbmNvZGVkKQorICogLS0gZm9sbG93aW5nIGZvciBpbmRleGVkIGVudHJpZXMgb25seSAoc28gc2VyaWFsaXplZCBzaXplID4gMCkKKyAqICAoaW50KSBEZWxldGlvblRpbWUubG9jYWxEZWxldGlvblRpbWUKKyAqIChsb25nKSBEZWxldGlvblRpbWUubWFya2VkRm9yRGVsZXRpb25BdAorICogIChpbnQpIG51bWJlciBvZiBJbmRleEluZm8gb2JqZWN0cyAoMzIgYml0IGludCwgdmludCBlbmNvZGVkKQorICogICAgKCopIHNlcmlhbGl6ZWQgSW5kZXhJbmZvIG9iamVjdHMsIHNlZSBiZWxvdworICogICAgKCopIG9mZnNldHMgb2Ygc2VyaWFsaXplZCBJbmRleEluZm8gb2JqZWN0cywgc2luY2UgdmVyc2lvbiAibWEiICgzLjApCisgKiAgICAgICAgRWFjaCBJbmRleEluZm8gb2JqZWN0J3Mgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBJbmRleEluZm8gb2JqZWN0LgorICogfQorICogPHA+CisgKiBTZWUge0BsaW5rIEluZGV4SW5mb30gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHNlcmlhbGl6ZWQgZm9ybWF0LgorICogPC9wPgorICoKKyAqIDxwPgorICogRm9yIGVhY2ggcGFydGl0aW9uLCB0aGUgbGF5b3V0IG9mIHRoZSBpbmRleCBmaWxlIGxvb2tzIGxpa2UgdGhpczoKKyAqIDwvcD4KKyAqIDxvbD4KKyAqICAgICA8bGk+cGFydGl0aW9uIGtleSAtIHByZWZpeGVkIHdpdGgge0Bjb2RlIHNob3J0fSBsZW5ndGg8L2xpPgorICogICAgIDxsaT5zZXJpYWxpemVkIHtAY29kZSBSb3dJbmRleEVudHJ5fSBvYmplY3RzPC9saT4KKyAqIDwvb2w+CisgKgorICogPHA+CisgKiAgICAgR2VuZXJhbGx5LCB3ZSBkaXN0aW5ndWlzaCBiZXR3ZWVuIGluZGV4IGVudHJpZXMgdGhhdCBoYXZlIDxpPmluZGV4CisgKiAgICAgc2FtcGxlczwvaT4gKGxpc3Qgb2Yge0BsaW5rIEluZGV4SW5mb30gb2JqZWN0cykgYW5kIHRob3NlIHdobyBkb24ndC4KKyAqICAgICBGb3IgZWFjaCA8aT5wb3J0aW9uPC9pPiBvZiBkYXRhIGZvciBhIHNpbmdsZSBwYXJ0aXRpb24gaW4gdGhlIGRhdGEgZmlsZSwKKyAqICAgICBhbiBpbmRleCBzYW1wbGUgaXMgY3JlYXRlZC4gVGhlIHNpemUgb2YgdGhhdCA8aT5wb3J0aW9uPC9pPiBpcyBkZWZpbmVkCisgKiAgICAgYnkge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcjY29sdW1uX2luZGV4X3NpemV9LgorICogPC9wPgorICogPHA+CisgKiAgICAgSW5kZXggZW50cmllcyB3aXRoIGxlc3MgdGhhbiAyIGluZGV4IHNhbXBsZXMsIHdpbGwganVzdCBzdG9yZSB0aGUKKyAqICAgICBwb3NpdGlvbiBpbiB0aGUgZGF0YSBmaWxlLgorICogPC9wPgorICogPHA+CisgKiAgICAgTm90ZTogbGVnYWN5IHNzdGFibGVzIGZvciBpbmRleCBlbnRyaWVzIGFyZSB0aG9zZSBzc3RhYmxlIGZvcm1hdHMgdGhhdAorICogICAgIGRvIDxpPm5vdDwvaT4gaGF2ZSBhbiBvZmZzZXRzIHRhYmxlIHRvIGluZGV4IHNhbXBsZXMgKHtAbGluayBJbmRleEluZm99CisgKiAgICAgb2JqZWN0cykuIFRoZXNlIGFyZSB0aG9zZSBzc3RhYmxlcyBjcmVhdGVkIG9uIENhc3NhbmRyYSB2ZXJzaW9ucworICogICAgIGVhcmxpZXIgdGhhbiAzLjAuCisgKiA8L3A+CisgKiA8cD4KKyAqICAgICBGb3IgaW5kZXggZW50cmllcyB3aXRoIGluZGV4IHNhbXBsZXMgd2Ugc3RvcmUgdGhlIGluZGV4IHNhbXBsZXMKKyAqICAgICAoe0BsaW5rIEluZGV4SW5mb30gb2JqZWN0cykuIFRoZSBiaWdnZXIgdGhlIHBhcnRpdGlvbiwgdGhlIG1vcmUKKyAqICAgICBpbmRleCBzYW1wbGVzIGFyZSBjcmVhdGVkLiBTaW5jZSBhIGh1Z2UgYW1vdW50IG9mIGluZGV4IHNhbXBsZXMKKyAqICAgICB3aWxsICJwb2xsdXRlIiB0aGUgaGVhcCBhbmQgY2F1c2UgaHVnZSBHQyBwcmVzc3VyZSwgQ2Fzc2FuZHJhIDMuNgorICogICAgIChDQVNTQU5EUkEtMTEyMDYpIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBpbmRleCBlbnRyaWVzIHdpdGggYW4KKyAqICAgICAiYWNjZXB0YWJsZSIgYW1vdW50IG9mIGluZGV4IHNhbXBsZXMgcGVyIHBhcnRpdGlvbiBhbmQgdGhvc2UKKyAqICAgICB3aXRoIGFuICJlbm9ybW91cyIgYW1vdW50IG9mIGluZGV4IHNhbXBsZXMuIFRoZSBiYXJyaWVyCisgKiAgICAgaXMgY29udHJvbGxlZCBieSB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKKyAqICAgICB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZyNjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZX0uCisgKiAgICAgSW5kZXggZW50cmllcyB3aXRoIGEgdG90YWwgc2VyaWFsaXplZCBzaXplIG9mIGluZGV4IHNhbXBsZXMgdXAgdG8KKyAqICAgICB7QGNvZGUgY29sdW1uX2luZGV4X2NhY2hlX3NpemV9IHdpbGwgYmUgaGVsZCBpbiBhbiBhcnJheS4KKyAqICAgICBJbmRleCBlbnRyaWVzIGV4Y2VlZGluZyB0aGF0IHZhbHVlIHdpbGwgYWx3YXlzIGJlIGFjY2Vzc2VkIGZyb20KKyAqICAgICBkaXNrLgorICogPC9wPgorICogPHA+CisgKiAgICAgVGhpcyByZXN1bHRzIGluIHRoZXNlIGNsYXNzZXM6CisgKiA8L3A+CisgKiA8dWw+CisgKiAgICAgPGxpPntAbGluayBSb3dJbmRleEVudHJ5fSBqdXN0IHN0b3JlcyB0aGUgb2Zmc2V0IGluIHRoZSBkYXRhIGZpbGUuPC9saT4KKyAqICAgICA8bGk+e0BsaW5rIEluZGV4ZWRFbnRyeX0gaXMgZm9yIGluZGV4IGVudHJpZXMgd2l0aCBpbmRleCBzYW1wbGVzCisgKiAgICAgYW5kIHVzZWQgZm9yIGJvdGggY3VycmVudCBhbmQgbGVnYWN5IHNzdGFibGVzLCB3aGljaCBkbyBub3QgZXhjZWVkCisgKiAgICAge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcjY29sdW1uX2luZGV4X2NhY2hlX3NpemV9LjwvbGk+CisgKiAgICAgPGxpPntAbGluayBTaGFsbG93SW5kZXhlZEVudHJ5fSBpcyBmb3IgaW5kZXggZW50cmllcyB3aXRoIGluZGV4IHNhbXBsZXMKKyAqICAgICB0aGF0IGV4Y2VlZCB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZyNjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZX0KKyAqICAgICBmb3Igc3N0YWJsZXMgd2l0aCBhbiBvZmZzZXQgdGFibGUgdG8gdGhlIGluZGV4IHNhbXBsZXMuPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqICAgICBTaW5jZSBhY2Nlc3MgdG8gaW5kZXggc2FtcGxlcyBvbiBkaXNrIChvYnZpb3VzbHkpIHJlcXVpcmVzIHNvbWUgZmlsZQorICogICAgIHJlYWRlciwgdGhhdCBmdW5jdGlvbmFsaXR5IGlzIGVuY2Fwc3VsYXRlZCBpbiBpbXBsZW1lbnRhdGlvbnMgb2YKKyAqICAgICB7QGxpbmsgSW5kZXhJbmZvUmV0cmlldmVyfS4gVGhlcmUgaXMgYW4gaW1wbGVtZW50YXRpb24gdG8gYWNjZXNzCisgKiAgICAgaW5kZXggc2FtcGxlcyBvZiBsZWdhY3kgc3N0YWJsZXMgKHdpdGhvdXQgdGhlIG9mZnNldHMgdGFibGUpLAorICogICAgIGFuIGltcGxlbWVudGF0aW9uIG9mIGFjY2VzcyBzc3RhYmxlcyB3aXRoIGFuIG9mZnNldHMgdGFibGUuCisgKiA8L3A+CisgKiA8cD4KKyAqICAgICBVbnRpbCBub3cgKENhc3NhbmRyYSAzLngpLCB3ZSBzdGlsbCBzdXBwb3J0IHJlYWRpbmcgZnJvbSA8aT5sZWdhY3k8L2k+IHNzdGFibGVzIC0KKyAqICAgICBpLmUuIHNzdGFibGVzIGNyZWF0ZWQgYnkgQ2Fzc2FuZHJhICZsdDsgMy4wIChzZWUge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXR9LgorICogPC9wPgorICoKKyAqLworcHVibGljIGNsYXNzIFJvd0luZGV4RW50cnkgZXh0ZW5kcyBBYnN0cmFjdFJvd0luZGV4RW50cnkKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdGb3JtYXQgRk9STUFUID0gQmlnRm9ybWF0LmdldEluc3RhbmNlKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBFTVBUWV9TSVpFID0gT2JqZWN0U2l6ZXMubWVhc3VyZShuZXcgUm93SW5kZXhFbnRyeSgwKSk7CisKKyAgICAvLyBjb25zdGFudHMgZm9yIHR5cGUgb2Ygcm93LWluZGV4LWVudHJ5IGFzIHNlcmlhbGl6ZWQgZm9yIHNhdmVkLWNhY2hlCisgICAgc3RhdGljIGZpbmFsIGludCBDQUNIRV9OT1RfSU5ERVhFRCA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBDQUNIRV9JTkRFWEVEID0gMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IENBQ0hFX0lOREVYRURfU0hBTExPVyA9IDI7CisKKyAgICBzdGF0aWMgZmluYWwgSGlzdG9ncmFtIGluZGV4RW50cnlTaXplSGlzdG9ncmFtOworICAgIHN0YXRpYyBmaW5hbCBIaXN0b2dyYW0gaW5kZXhJbmZvQ291bnRIaXN0b2dyYW07CisgICAgc3RhdGljIGZpbmFsIEhpc3RvZ3JhbSBpbmRleEluZm9HZXRzSGlzdG9ncmFtOworICAgIHN0YXRpYyBmaW5hbCBIaXN0b2dyYW0gaW5kZXhJbmZvUmVhZHNIaXN0b2dyYW07CisgICAgc3RhdGljCisgICAgeworICAgICAgICBNZXRyaWNOYW1lRmFjdG9yeSBmYWN0b3J5ID0gbmV3IERlZmF1bHROYW1lRmFjdG9yeSgiSW5kZXgiLCAiUm93SW5kZXhFbnRyeSIpOworICAgICAgICBpbmRleEVudHJ5U2l6ZUhpc3RvZ3JhbSA9IE1ldHJpY3MuaGlzdG9ncmFtKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZSgiSW5kZXhlZEVudHJ5U2l6ZSIpLCBmYWxzZSk7CisgICAgICAgIGluZGV4SW5mb0NvdW50SGlzdG9ncmFtID0gTWV0cmljcy5oaXN0b2dyYW0oZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKCJJbmRleEluZm9Db3VudCIpLCBmYWxzZSk7CisgICAgICAgIGluZGV4SW5mb0dldHNIaXN0b2dyYW0gPSBNZXRyaWNzLmhpc3RvZ3JhbShmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoIkluZGV4SW5mb0dldHMiKSwgZmFsc2UpOworICAgICAgICBpbmRleEluZm9SZWFkc0hpc3RvZ3JhbSA9IE1ldHJpY3MuaGlzdG9ncmFtKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZSgiSW5kZXhJbmZvUmVhZHMiKSwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBSb3dJbmRleEVudHJ5KGxvbmcgcG9zaXRpb24pCisgICAgeworICAgICAgICBzdXBlcihwb3NpdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaW5kZXggZW50cnkgY29udGFpbnMgdGhlIHJvdy1sZXZlbCB0b21ic3RvbmUgYW5kIGNvbHVtbiBzdW1tYXJ5LiAgT3RoZXJ3aXNlLAorICAgICAqIGNhbGxlciBzaG91bGQgZmV0Y2ggdGhlc2UgZnJvbSB0aGUgcm93IGhlYWRlci4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrQ291bnQoKSA+IDE7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaW5kZXhPbkhlYXAoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgYmxvY2tDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQmlnRm9ybWF0IGdldFNTVGFibGVGb3JtYXQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEZPUk1BVDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplKCkKKyAgICB7CisgICAgICAgIHJldHVybiBFTVBUWV9TSVpFOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBkYXRhRmlsZVBvc2l0aW9uICBwb3NpdGlvbiBvZiB0aGUgcGFydGl0aW9uIGluIHRoZSB7QGxpbmsgQ29tcG9uZW50cy5UeXBlcyNEQVRBfSBmaWxlCisgICAgICogQHBhcmFtIGluZGV4RmlsZVBvc2l0aW9uIHBvc2l0aW9uIGluIHRoZSB7QGxpbmsgQ29tcG9uZW50cy5UeXBlcyNQUklNQVJZX0lOREVYfSBvZiB0aGUge0BsaW5rIFJvd0luZGV4RW50cnl9CisgICAgICogQHBhcmFtIGRlbGV0aW9uVGltZSAgICAgIGRlbGV0aW9uIHRpbWUgb2Yge0BsaW5rIFJvd0luZGV4RW50cnl9CisgICAgICogQHBhcmFtIGhlYWRlckxlbmd0aCAgICAgIGRlbGV0aW9uIHRpbWUgb2Yge0BsaW5rIFJvd0luZGV4RW50cnl9CisgICAgICogQHBhcmFtIGNvbHVtbkluZGV4Q291bnQgIG51bWJlciBvZiB7QGxpbmsgSW5kZXhJbmZvfSBlbnRyaWVzIGluIHRoZSB7QGxpbmsgUm93SW5kZXhFbnRyeX0KKyAgICAgKiBAcGFyYW0gaW5kZXhlZFBhcnRTaXplICAgc2VyaWFsaXplZCBzaXplIG9mIGFsbCBzZXJpYWxpemVkIHtAbGluayBJbmRleEluZm99IG9iamVjdHMgYW5kIHRoZWlyIG9mZnNldHMKKyAgICAgKiBAcGFyYW0gaW5kZXhTYW1wbGVzICAgICAgbGlzdCB3aXRoIEluZGV4SW5mbyBvZmZzZXRzIChpZiB0b3RhbCBzZXJpYWxpemVkIHNpemUgaXMgbGVzcyB0aGFuIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnI2NvbHVtbl9pbmRleF9jYWNoZV9zaXplfQorICAgICAqIEBwYXJhbSBvZmZzZXRzICAgICAgICAgICBvZmZzZXRzIG9mIEluZGV4SW5mbyBvZmZzZXRzCisgICAgICogQHBhcmFtIGlkeEluZm9TZXJpYWxpemVyIHRoZSB7QGxpbmsgSW5kZXhJbmZvfSBzZXJpYWxpemVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSb3dJbmRleEVudHJ5IGNyZWF0ZShsb25nIGRhdGFGaWxlUG9zaXRpb24sIGxvbmcgaW5kZXhGaWxlUG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUsIGxvbmcgaGVhZGVyTGVuZ3RoLCBpbnQgY29sdW1uSW5kZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ZWRQYXJ0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxJbmRleEluZm8+IGluZGV4U2FtcGxlcywgaW50W10gb2Zmc2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNlcmlhbGl6ZXI8SW5kZXhJbmZvPiBpZHhJbmZvU2VyaWFsaXplcikKKyAgICB7CisgICAgICAgIC8vIElmIHRoZSAicGFydGl0aW9uIGJ1aWxkaW5nIGNvZGUiIGluIEJpZ1RhYmxlV3JpdGVyLmFwcGVuZCgpIHZpYSBDb2x1bW5JbmRleCByZXR1cm5zIGEgbGlzdAorICAgICAgICAvLyBvZiBJbmRleEluZm8gb2JqZWN0cywgd2hpY2ggaXMgdGhlIGNhc2UgaWYgdGhlIHNlcmlhbGl6ZWQgc2l6ZSBpcyBsZXNzIHRoYW4KKyAgICAgICAgLy8gQ29uZmlnLmNvbHVtbl9pbmRleF9jYWNoZV9zaXplLCBBTkQgd2UgaGF2ZSBtb3JlIHRoYW4gb25lIEluZGV4SW5mbyBvYmplY3QsIHdlCisgICAgICAgIC8vIGNvbnN0cnVjdCBhbiBJbmRleGVkRW50cnkgb2JqZWN0LiAobm90ZTogaW5kZXhTYW1wbGVzLnNpemUoKSBhbmQgY29sdW1uSW5kZXhDb3VudCBoYXZlIHRoZSBzYW1lIG1lYW5pbmcpCisgICAgICAgIGlmIChpbmRleFNhbXBsZXMgIT0gbnVsbCAmJiBpbmRleFNhbXBsZXMuc2l6ZSgpID4gMSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhlZEVudHJ5KGRhdGFGaWxlUG9zaXRpb24sIGRlbGV0aW9uVGltZSwgaGVhZGVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTYW1wbGVzLnRvQXJyYXkobmV3IEluZGV4SW5mb1tpbmRleFNhbXBsZXMuc2l6ZSgpXSksIG9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVkUGFydFNpemUsIGlkeEluZm9TZXJpYWxpemVyKTsKKyAgICAgICAgLy8gSGVyZSB3ZSBoYXZlIHRvIGRlY2lkZSB3aGV0aGVyIHdlIGhhdmUgc2VyaWFsaXplZCBJbmRleEluZm8gb2JqZWN0cyB0aGF0IGV4Y2VlZHMKKyAgICAgICAgLy8gQ29uZmlnLmNvbHVtbl9pbmRleF9jYWNoZV9zaXplIChub3QgZXhjZWVkaW5nIGNhc2UgY292ZXJlZCBhYm92ZSkuCisgICAgICAgIC8vIFN1Y2ggYSAiYmlnIiBpbmRleGVkLWVudHJ5IGlzIHJlcHJlc2VudGVkIGFzIGEgc2hhbGxvdyBvbmUuCisgICAgICAgIGlmIChjb2x1bW5JbmRleENvdW50ID4gMSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2hhbGxvd0luZGV4ZWRFbnRyeShkYXRhRmlsZVBvc2l0aW9uLCBpbmRleEZpbGVQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwgY29sdW1uSW5kZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVkUGFydFNpemUsIGlkeEluZm9TZXJpYWxpemVyKTsKKyAgICAgICAgLy8gTGFzdCBjYXNlIGlzIHRoYXQgdGhlcmUgYXJlIG5vIGluZGV4IHNhbXBsZXMuCisgICAgICAgIHJldHVybiBuZXcgUm93SW5kZXhFbnRyeShkYXRhRmlsZVBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5kZXhJbmZvUmV0cmlldmVyIG9wZW5XaXRoSW5kZXgoRmlsZUhhbmRsZSBpbmRleEZpbGUpCisgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIEluZGV4U2VyaWFsaXplcgorICAgIHsKKyAgICAgICAgdm9pZCBzZXJpYWxpemUoUm93SW5kZXhFbnRyeSByaWUsIERhdGFPdXRwdXRQbHVzIG91dCwgQnl0ZUJ1ZmZlciBpbmRleEluZm8pIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgICAgICBSb3dJbmRleEVudHJ5IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGxvbmcgaW5kZXhGaWxlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICAgICAgZGVmYXVsdCBSb3dJbmRleEVudHJ5IGRlc2VyaWFsaXplKFJhbmRvbUFjY2Vzc1JlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemUocmVhZGVyLCByZWFkZXIuZ2V0RmlsZVBvaW50ZXIoKSk7CisKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQgUm93SW5kZXhFbnRyeSBkZXNlcmlhbGl6ZShGaWxlRGF0YUlucHV0IGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplKGlucHV0LCBpbnB1dC5nZXRGaWxlUG9pbnRlcigpKTsKKworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXJpYWxpemVGb3JDYWNoZShSb3dJbmRleEVudHJ5IHJpZSwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAgICAgUm93SW5kZXhFbnRyeSBkZXNlcmlhbGl6ZUZvckNhY2hlKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgICAgICBsb25nIGRlc2VyaWFsaXplUG9zaXRpb25BbmRTa2lwKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgICAgICBJU2VyaWFsaXplciBpbmRleEluZm9TZXJpYWxpemVyKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTZXJpYWxpemVyIGltcGxlbWVudHMgSW5kZXhTZXJpYWxpemVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIEluZGV4SW5mby5TZXJpYWxpemVyIGlkeEluZm9TZXJpYWxpemVyOworICAgICAgICBwcml2YXRlIGZpbmFsIFZlcnNpb24gdmVyc2lvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUYWJsZU1ldHJpY3MgdGFibGVNZXRyaWNzOworCisgICAgICAgIHB1YmxpYyBTZXJpYWxpemVyKFZlcnNpb24gdmVyc2lvbiwgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIsIFRhYmxlTWV0cmljcyB0YWJsZU1ldHJpY3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaWR4SW5mb1NlcmlhbGl6ZXIgPSBJbmRleEluZm8uc2VyaWFsaXplcih2ZXJzaW9uLCBoZWFkZXIpOworICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgICAgIHRoaXMudGFibGVNZXRyaWNzID0gdGFibGVNZXRyaWNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbmRleEluZm8uU2VyaWFsaXplciBpbmRleEluZm9TZXJpYWxpemVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGlkeEluZm9TZXJpYWxpemVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShSb3dJbmRleEVudHJ5IHJpZSwgRGF0YU91dHB1dFBsdXMgb3V0LCBCeXRlQnVmZmVyIGluZGV4SW5mbykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHJpZS5zZXJpYWxpemUob3V0LCBpbmRleEluZm8pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZUZvckNhY2hlKFJvd0luZGV4RW50cnkgcmllLCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICByaWUuc2VyaWFsaXplRm9yQ2FjaGUob3V0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUm93SW5kZXhFbnRyeSBkZXNlcmlhbGl6ZUZvckNhY2hlKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHBvc2l0aW9uID0gaW4ucmVhZFVuc2lnbmVkVkludCgpOworCisgICAgICAgICAgICBzd2l0Y2ggKGluLnJlYWRCeXRlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBDQUNIRV9OT1RfSU5ERVhFRDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSb3dJbmRleEVudHJ5KHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBjYXNlIENBQ0hFX0lOREVYRUQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhlZEVudHJ5KHBvc2l0aW9uLCBpbiwgaWR4SW5mb1NlcmlhbGl6ZXIpOworICAgICAgICAgICAgICAgIGNhc2UgQ0FDSEVfSU5ERVhFRF9TSEFMTE9XOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNoYWxsb3dJbmRleGVkRW50cnkocG9zaXRpb24sIGluLCBpZHhJbmZvU2VyaWFsaXplcik7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2tpcEZvckNhY2hlKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICBzd2l0Y2ggKGluLnJlYWRCeXRlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBDQUNIRV9OT1RfSU5ERVhFRDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDQUNIRV9JTkRFWEVEOgorICAgICAgICAgICAgICAgICAgICBJbmRleGVkRW50cnkuc2tpcEZvckNhY2hlKGluKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDQUNIRV9JTkRFWEVEX1NIQUxMT1c6CisgICAgICAgICAgICAgICAgICAgIFNoYWxsb3dJbmRleGVkRW50cnkuc2tpcEZvckNhY2hlKGluKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSb3dJbmRleEVudHJ5IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGxvbmcgaW5kZXhGaWxlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHBvc2l0aW9uID0gaW4ucmVhZFVuc2lnbmVkVkludCgpOworCisgICAgICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworICAgICAgICAgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJvd0luZGV4RW50cnkocG9zaXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgaGVhZGVyTGVuZ3RoID0gaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUgPSBEZWxldGlvblRpbWUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbik7CisgICAgICAgICAgICAgICAgaW50IGNvbHVtbnNJbmRleENvdW50ID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CisKKyAgICAgICAgICAgICAgICBjaGVja1NpemUoY29sdW1uc0luZGV4Q291bnQsIHNpemUpOworCisgICAgICAgICAgICAgICAgaW50IGluZGV4ZWRQYXJ0U2l6ZSA9IHNpemUgLSBzZXJpYWxpemVkU2l6ZShkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwgY29sdW1uc0luZGV4Q291bnQpOworCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPD0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4Q2FjaGVTaXplKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEluZGV4ZWRFbnRyeShwb3NpdGlvbiwgaW4sIGRlbGV0aW9uVGltZSwgaGVhZGVyTGVuZ3RoLCBjb2x1bW5zSW5kZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4SW5mb1NlcmlhbGl6ZXIsIGluZGV4ZWRQYXJ0U2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGluLnNraXBCeXRlcyhpbmRleGVkUGFydFNpemUpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hhbGxvd0luZGV4ZWRFbnRyeShwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4RmlsZVBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpb25UaW1lLCBoZWFkZXJMZW5ndGgsIGNvbHVtbnNJbmRleENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhlZFBhcnRTaXplLCBpZHhJbmZvU2VyaWFsaXplcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrU2l6ZShpbnQgZW50cmllcywgaW50IGJ5dGVzKQorICAgICAgICB7CisgICAgICAgICAgICBSZWFkQ29tbWFuZCBjb21tYW5kID0gUmVhZENvbW1hbmQuZ2V0Q29tbWFuZCgpOworICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCB8fCBTY2hlbWFDb25zdGFudHMuaXNTeXN0ZW1LZXlzcGFjZShjb21tYW5kLm1ldGFkYXRhKCkua2V5c3BhY2UpIHx8ICFEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UmVhZFRocmVzaG9sZHNFbmFibGVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQgd2FyblRocmVzaG9sZCA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRSb3dJbmRleFJlYWRTaXplV2FyblRocmVzaG9sZCgpOworICAgICAgICAgICAgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kIGZhaWxUaHJlc2hvbGQgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Um93SW5kZXhSZWFkU2l6ZUZhaWxUaHJlc2hvbGQoKTsKKyAgICAgICAgICAgIGlmICh3YXJuVGhyZXNob2xkID09IG51bGwgJiYgZmFpbFRocmVzaG9sZCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgbG9uZyBlc3RpbWF0ZWRNZW1vcnkgPSBlc3RpbWF0ZU1hdGVyaWFsaXplZEluZGV4U2l6ZShlbnRyaWVzLCBieXRlcyk7CisgICAgICAgICAgICBpZiAodGFibGVNZXRyaWNzICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGFibGVNZXRyaWNzLnJvd0luZGV4U2l6ZS51cGRhdGUoZXN0aW1hdGVkTWVtb3J5KTsKKworICAgICAgICAgICAgaWYgKGZhaWxUaHJlc2hvbGQgIT0gbnVsbCAmJiBlc3RpbWF0ZWRNZW1vcnkgPiBmYWlsVGhyZXNob2xkLnRvQnl0ZXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiUXVlcnkgJXMgYXR0ZW1wdGVkIHRvIGFjY2VzcyBhIGxhcmdlIFJvd0luZGV4RW50cnkgZXN0aW1hdGVkIHRvIGJlICVkIGJ5dGVzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbi1tZW1vcnkgKHRvdGFsIGVudHJpZXM6ICVkLCB0b3RhbCBieXRlczogJWQpIGJ1dCB0aGUgbWF4IGFsbG93ZWQgaXMgJXM7IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBxdWVyeSBhYm9ydGVkICAoc2VlIHJvd19pbmRleF9yZWFkX3NpemVfZmFpbF90aHJlc2hvbGQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLnRvQ1FMU3RyaW5nKCksIGVzdGltYXRlZE1lbW9yeSwgZW50cmllcywgYnl0ZXMsIGZhaWxUaHJlc2hvbGQpOworICAgICAgICAgICAgICAgIE1lc3NhZ2VQYXJhbXMucmVtb3ZlKFBhcmFtVHlwZS5ST1dfSU5ERVhfUkVBRF9TSVpFX1dBUk4pOworICAgICAgICAgICAgICAgIE1lc3NhZ2VQYXJhbXMuYWRkKFBhcmFtVHlwZS5ST1dfSU5ERVhfUkVBRF9TSVpFX0ZBSUwsIGVzdGltYXRlZE1lbW9yeSk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUm93SW5kZXhFbnRyeVJlYWRTaXplVG9vTGFyZ2VFeGNlcHRpb24obXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHdhcm5UaHJlc2hvbGQgIT0gbnVsbCAmJiBlc3RpbWF0ZWRNZW1vcnkgPiB3YXJuVGhyZXNob2xkLnRvQnl0ZXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB1c2UgYWRkSWZMYXJnZXIgcmF0aGVyIHRoYW4gYWRkIGFzIGEgcHJldmlvdXMgcGFydGl0aW9uIG1heSBiZSBsYXJnZXIgdGhhbiB0aGlzIG9uZQorICAgICAgICAgICAgICAgIExvbmcgY3VycmVudCA9IE1lc3NhZ2VQYXJhbXMuZ2V0KFBhcmFtVHlwZS5ST1dfSU5ERVhfUkVBRF9TSVpFX1dBUk4pOworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwgfHwgY3VycmVudC5jb21wYXJlVG8oZXN0aW1hdGVkTWVtb3J5KSA8IDApCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VQYXJhbXMuYWRkKFBhcmFtVHlwZS5ST1dfSU5ERVhfUkVBRF9TSVpFX1dBUk4sIGVzdGltYXRlZE1lbW9yeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGVzdGltYXRlTWF0ZXJpYWxpemVkSW5kZXhTaXplKGludCBlbnRyaWVzLCBpbnQgYnl0ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgb3ZlcmhlYWQgPSBJbmRleEluZm8uRU1QVFlfU0laRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQXJyYXlDbHVzdGVyaW5nLkVNUFRZX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIERlbGV0aW9uVGltZS5FTVBUWV9TSVpFOworCisgICAgICAgICAgICByZXR1cm4gKG92ZXJoZWFkICogZW50cmllcykgKyBieXRlczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBkZXNlcmlhbGl6ZVBvc2l0aW9uQW5kU2tpcChEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKworICAgICAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChzaXplID4gMCkKKyAgICAgICAgICAgICAgICBpbi5za2lwQnl0ZXNGdWxseShzaXplKTsKKworICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlYWRzIG9ubHkgdGhlIGRhdGEgJ3Bvc2l0aW9uJyBvZiB0aGUgaW5kZXggZW50cnkgYW5kIHJldHVybnMgaXQuIE5vdGUgdGhhdCB0aGlzIGxlZnQgJ2luJyBpbiB0aGUgbWlkZGxlCisgICAgICAgICAqIG9mIHJlYWRpbmcgYW4gZW50cnksIHNvIHRoaXMgaXMgb25seSB1c2VmdWwgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIGFuZCBpbiBtb3N0IGNhc2UgJ2Rlc2VyaWFsaXplJworICAgICAgICAgKiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBsb25nIHJlYWRQb3NpdGlvbihEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBza2lwKERhdGFJbnB1dFBsdXMgaW4sIFZlcnNpb24gdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlYWRQb3NpdGlvbihpbik7CisgICAgICAgICAgICBza2lwUHJvbW90ZWRJbmRleChpbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNraXBQcm9tb3RlZEluZGV4KERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworICAgICAgICAgICAgaWYgKHNpemUgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGluLnNraXBCeXRlc0Z1bGx5KHNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNlcmlhbGl6ZWRTaXplKERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUsIGxvbmcgaGVhZGVyTGVuZ3RoLCBpbnQgY29sdW1uSW5kZXhDb3VudCkKKyAgICB7CisgICAgICAgIHJldHVybiBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KGhlYWRlckxlbmd0aCkKKyAgICAgICAgICAgICAgICsgKGludCkgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoZGVsZXRpb25UaW1lKQorICAgICAgICAgICAgICAgKyBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KGNvbHVtbkluZGV4Q291bnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBvdXQsIEJ5dGVCdWZmZXIgaW5kZXhJbmZvKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChwb3NpdGlvbik7CisKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VyaWFsaXplRm9yQ2FjaGUoRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChwb3NpdGlvbik7CisKKyAgICAgICAgb3V0LndyaXRlQnl0ZShDQUNIRV9OT1RfSU5ERVhFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gZW50cnkgaW4gdGhlIHJvdyBpbmRleCBmb3IgYSByb3cgd2hvc2UgY29sdW1ucyBhcmUgaW5kZXhlZCAtIHVzZWQgZm9yIGJvdGggbGVnYWN5IGFuZCBjdXJyZW50IGZvcm1hdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSW5kZXhlZEVudHJ5IGV4dGVuZHMgUm93SW5kZXhFbnRyeQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCQVNFX1NJWkU7CisKKyAgICAgICAgc3RhdGljCisgICAgICAgIHsKKyAgICAgICAgICAgIEJBU0VfU0laRSA9IE9iamVjdFNpemVzLm1lYXN1cmUobmV3IEluZGV4ZWRFbnRyeSgwLCBEZWxldGlvblRpbWUuTElWRSwgMCwgbnVsbCwgbnVsbCwgMCwgbnVsbCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgaGVhZGVyTGVuZ3RoOworCisgICAgICAgIHByaXZhdGUgZmluYWwgSW5kZXhJbmZvW10gY29sdW1uc0luZGV4OworICAgICAgICBwcml2YXRlIGZpbmFsIGludFtdIG9mZnNldHM7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGluZGV4ZWRQYXJ0U2l6ZTsKKyAgICAgICAgQFVubWV0ZXJlZAorICAgICAgICBwcml2YXRlIGZpbmFsIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4SW5mb1NlcmlhbGl6ZXI7CisKKyAgICAgICAgcHJpdmF0ZSBJbmRleGVkRW50cnkobG9uZyBkYXRhRmlsZVBvc2l0aW9uLCBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lLCBsb25nIGhlYWRlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhJbmZvW10gY29sdW1uc0luZGV4LCBpbnRbXSBvZmZzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhlZFBhcnRTaXplLCBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeEluZm9TZXJpYWxpemVyKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihkYXRhRmlsZVBvc2l0aW9uKTsKKworICAgICAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSBoZWFkZXJMZW5ndGg7CisgICAgICAgICAgICB0aGlzLmRlbGV0aW9uVGltZSA9IGRlbGV0aW9uVGltZTsKKworICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXggPSBjb2x1bW5zSW5kZXg7CisgICAgICAgICAgICB0aGlzLm9mZnNldHMgPSBvZmZzZXRzOworICAgICAgICAgICAgdGhpcy5pbmRleGVkUGFydFNpemUgPSBpbmRleGVkUGFydFNpemU7CisgICAgICAgICAgICB0aGlzLmlkeEluZm9TZXJpYWxpemVyID0gaWR4SW5mb1NlcmlhbGl6ZXI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEluZGV4ZWRFbnRyeShsb25nIGRhdGFGaWxlUG9zaXRpb24sIERhdGFJbnB1dFBsdXMgaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUsIGxvbmcgaGVhZGVyTGVuZ3RoLCBpbnQgY29sdW1uSW5kZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhJbmZvLlNlcmlhbGl6ZXIgaWR4SW5mb1NlcmlhbGl6ZXIsIGludCBpbmRleGVkUGFydFNpemUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihkYXRhRmlsZVBvc2l0aW9uKTsKKworICAgICAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSBoZWFkZXJMZW5ndGg7CisgICAgICAgICAgICB0aGlzLmRlbGV0aW9uVGltZSA9IGRlbGV0aW9uVGltZTsKKyAgICAgICAgICAgIGludCBjb2x1bW5zSW5kZXhDb3VudCA9IGNvbHVtbkluZGV4Q291bnQ7CisKKyAgICAgICAgICAgIHRoaXMuY29sdW1uc0luZGV4ID0gbmV3IEluZGV4SW5mb1tjb2x1bW5zSW5kZXhDb3VudF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnNJbmRleENvdW50OyBpKyspCisgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXhbaV0gPSBpZHhJbmZvU2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbik7CisKKyAgICAgICAgICAgIHRoaXMub2Zmc2V0cyA9IG5ldyBpbnRbdGhpcy5jb2x1bW5zSW5kZXgubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICBvZmZzZXRzW2ldID0gaW4ucmVhZEludCgpOworCisgICAgICAgICAgICB0aGlzLmluZGV4ZWRQYXJ0U2l6ZSA9IGluZGV4ZWRQYXJ0U2l6ZTsKKworICAgICAgICAgICAgdGhpcy5pZHhJbmZvU2VyaWFsaXplciA9IGlkeEluZm9TZXJpYWxpemVyOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yIGNhbGxlZCBmcm9tIHtAbGluayBTZXJpYWxpemVyI2Rlc2VyaWFsaXplRm9yQ2FjaGUob3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzKX0uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIEluZGV4ZWRFbnRyeShsb25nIGRhdGFGaWxlUG9zaXRpb24sIERhdGFJbnB1dFBsdXMgaW4sIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4SW5mb1NlcmlhbGl6ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihkYXRhRmlsZVBvc2l0aW9uKTsKKworICAgICAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICB0aGlzLmRlbGV0aW9uVGltZSA9IERlbGV0aW9uVGltZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluKTsKKyAgICAgICAgICAgIGludCBjb2x1bW5zSW5kZXhDb3VudCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworCisgICAgICAgICAgICBUcmFja2VkRGF0YUlucHV0UGx1cyB0cmFja2VkSW4gPSBuZXcgVHJhY2tlZERhdGFJbnB1dFBsdXMoaW4pOworCisgICAgICAgICAgICB0aGlzLmNvbHVtbnNJbmRleCA9IG5ldyBJbmRleEluZm9bY29sdW1uc0luZGV4Q291bnRdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zSW5kZXhDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uc0luZGV4W2ldID0gaWR4SW5mb1NlcmlhbGl6ZXIuZGVzZXJpYWxpemUodHJhY2tlZEluKTsKKworICAgICAgICAgICAgdGhpcy5vZmZzZXRzID0gbnVsbDsKKworICAgICAgICAgICAgdGhpcy5pbmRleGVkUGFydFNpemUgPSAoaW50KSB0cmFja2VkSW4uZ2V0Qnl0ZXNSZWFkKCk7CisKKyAgICAgICAgICAgIHRoaXMuaWR4SW5mb1NlcmlhbGl6ZXIgPSBpZHhJbmZvU2VyaWFsaXplcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbmRleE9uSGVhcCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgYmxvY2tDb3VudCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb2x1bW5zSW5kZXgubGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlbGV0aW9uVGltZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW5kZXhJbmZvUmV0cmlldmVyIG9wZW5XaXRoSW5kZXgoRmlsZUhhbmRsZSBpbmRleEZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluZGV4RW50cnlTaXplSGlzdG9ncmFtLnVwZGF0ZShzZXJpYWxpemVkU2l6ZShkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwgY29sdW1uc0luZGV4Lmxlbmd0aCkgKyBpbmRleGVkUGFydFNpemUpOworICAgICAgICAgICAgaW5kZXhJbmZvQ291bnRIaXN0b2dyYW0udXBkYXRlKGNvbHVtbnNJbmRleC5sZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmRleEluZm9SZXRyaWV2ZXIoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByaXZhdGUgaW50IHJldHJpZXZhbHM7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgSW5kZXhJbmZvIGNvbHVtbnNJbmRleChpbnQgaW5kZXgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXRyaWV2YWxzKys7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW5zSW5kZXhbaW5kZXhdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGluZGV4SW5mb0dldHNIaXN0b2dyYW0udXBkYXRlKHJldHJpZXZhbHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgdW5zaGFyZWRIZWFwU2l6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgZW50cnlTaXplID0gMDsKKyAgICAgICAgICAgIGZvciAoSW5kZXhJbmZvIGlkeCA6IGNvbHVtbnNJbmRleCkKKyAgICAgICAgICAgICAgICBlbnRyeVNpemUgKz0gaWR4LnVuc2hhcmVkSGVhcFNpemUoKTsKKyAgICAgICAgICAgIHJldHVybiBCQVNFX1NJWkUKKyAgICAgICAgICAgICAgICArIGVudHJ5U2l6ZQorICAgICAgICAgICAgICAgICsgT2JqZWN0U2l6ZXMuc2l6ZU9mUmVmZXJlbmNlQXJyYXkoY29sdW1uc0luZGV4Lmxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIG91dCwgQnl0ZUJ1ZmZlciBpbmRleEluZm8pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgaW5kZXhlZFBhcnRTaXplICE9IEludGVnZXIuTUlOX1ZBTFVFOworCisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocG9zaXRpb24pOworCisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihzZXJpYWxpemVkU2l6ZShkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwgY29sdW1uc0luZGV4Lmxlbmd0aCkgKyBpbmRleGVkUGFydFNpemUpOworCisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoaGVhZGVyTGVuZ3RoKTsKKyAgICAgICAgICAgIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNlcmlhbGl6ZShkZWxldGlvblRpbWUsIG91dCk7CisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihjb2x1bW5zSW5kZXgubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoSW5kZXhJbmZvIGluZm8gOiBjb2x1bW5zSW5kZXgpCisgICAgICAgICAgICAgICAgaWR4SW5mb1NlcmlhbGl6ZXIuc2VyaWFsaXplKGluZm8sIG91dCk7CisgICAgICAgICAgICBmb3IgKGludCBvZmZzZXQgOiBvZmZzZXRzKQorICAgICAgICAgICAgICAgIG91dC53cml0ZUludChvZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZUZvckNhY2hlKERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChwb3NpdGlvbik7CisgICAgICAgICAgICBvdXQud3JpdGVCeXRlKENBQ0hFX0lOREVYRUQpOworCisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoaGVhZGVyTGVuZ3RoKTsKKyAgICAgICAgICAgIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNlcmlhbGl6ZShkZWxldGlvblRpbWUsIG91dCk7CisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihibG9ja0NvdW50KCkpOworCisgICAgICAgICAgICBmb3IgKEluZGV4SW5mbyBpbmRleEluZm8gOiBjb2x1bW5zSW5kZXgpCisgICAgICAgICAgICAgICAgaWR4SW5mb1NlcmlhbGl6ZXIuc2VyaWFsaXplKGluZGV4SW5mbywgb3V0KTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIHNraXBGb3JDYWNoZShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2tpcChpbik7CisgICAgICAgICAgICBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisKKyAgICAgICAgICAgIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGVudHJ5IGluIHRoZSByb3cgaW5kZXggZm9yIGEgcm93IHdob3NlIGNvbHVtbnMgYXJlIGluZGV4ZWQgYW5kIHRoZSB7QGxpbmsgSW5kZXhJbmZvfSBvYmplY3RzCisgICAgICogYXJlIG5vdCByZWFkIGludG8gdGhlIGtleSBjYWNoZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTaGFsbG93SW5kZXhlZEVudHJ5IGV4dGVuZHMgUm93SW5kZXhFbnRyeQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCQVNFX1NJWkU7CisKKyAgICAgICAgc3RhdGljCisgICAgICAgIHsKKyAgICAgICAgICAgIEJBU0VfU0laRSA9IE9iamVjdFNpemVzLm1lYXN1cmUobmV3IFNoYWxsb3dJbmRleGVkRW50cnkoMCwgMCwgRGVsZXRpb25UaW1lLkxJVkUsIDAsIDEwLCAwLCBudWxsKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgaW5kZXhGaWxlUG9zaXRpb247CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgaGVhZGVyTGVuZ3RoOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBjb2x1bW5zSW5kZXhDb3VudDsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBpbmRleGVkUGFydFNpemU7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG9mZnNldHNPZmZzZXQ7CisgICAgICAgIEBVbm1ldGVyZWQKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJU2VyaWFsaXplcjxJbmRleEluZm8+IGlkeEluZm9TZXJpYWxpemVyOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBmaWVsZHNTZXJpYWxpemVkU2l6ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2VlIHtAbGluayAjY3JlYXRlKGxvbmcsIGxvbmcsIERlbGV0aW9uVGltZSwgbG9uZywgaW50LCBpbnQsIExpc3QsIGludFtdLCBJU2VyaWFsaXplcil9IGZvciBhIGRlc2NyaXB0aW9uCisgICAgICAgICAqIG9mIHRoZSBwYXJhbWV0ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTaGFsbG93SW5kZXhlZEVudHJ5KGxvbmcgZGF0YUZpbGVQb3NpdGlvbiwgbG9uZyBpbmRleEZpbGVQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUsIGxvbmcgaGVhZGVyTGVuZ3RoLCBpbnQgY29sdW1uSW5kZXhDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleGVkUGFydFNpemUsIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4SW5mb1NlcmlhbGl6ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGRhdGFGaWxlUG9zaXRpb24pOworCisgICAgICAgICAgICBhc3NlcnQgY29sdW1uSW5kZXhDb3VudCA+IDE7CisKKyAgICAgICAgICAgIHRoaXMuaW5kZXhGaWxlUG9zaXRpb24gPSBpbmRleEZpbGVQb3NpdGlvbjsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVyTGVuZ3RoID0gaGVhZGVyTGVuZ3RoOworICAgICAgICAgICAgdGhpcy5kZWxldGlvblRpbWUgPSBkZWxldGlvblRpbWU7CisgICAgICAgICAgICB0aGlzLmNvbHVtbnNJbmRleENvdW50ID0gY29sdW1uSW5kZXhDb3VudDsKKworICAgICAgICAgICAgdGhpcy5pbmRleGVkUGFydFNpemUgPSBpbmRleGVkUGFydFNpemU7CisgICAgICAgICAgICB0aGlzLmlkeEluZm9TZXJpYWxpemVyID0gaWR4SW5mb1NlcmlhbGl6ZXI7CisKKyAgICAgICAgICAgIHRoaXMuZmllbGRzU2VyaWFsaXplZFNpemUgPSBzZXJpYWxpemVkU2l6ZShkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwgY29sdW1uSW5kZXhDb3VudCk7CisgICAgICAgICAgICB0aGlzLm9mZnNldHNPZmZzZXQgPSBpbmRleGVkUGFydFNpemUgKyBmaWVsZHNTZXJpYWxpemVkU2l6ZSAtIGNvbHVtbnNJbmRleENvdW50ICogVHlwZVNpemVzLklOVF9TSVpFOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBrZXktY2FjaGUgZGVzZXJpYWxpemF0aW9uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFNoYWxsb3dJbmRleGVkRW50cnkobG9uZyBkYXRhRmlsZVBvc2l0aW9uLCBEYXRhSW5wdXRQbHVzIGluLCBJbmRleEluZm8uU2VyaWFsaXplciBpZHhJbmZvU2VyaWFsaXplcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGRhdGFGaWxlUG9zaXRpb24pOworCisgICAgICAgICAgICB0aGlzLmluZGV4RmlsZVBvc2l0aW9uID0gaW4ucmVhZFVuc2lnbmVkVkludCgpOworCisgICAgICAgICAgICB0aGlzLmhlYWRlckxlbmd0aCA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIHRoaXMuZGVsZXRpb25UaW1lID0gRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4pOworICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXhDb3VudCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworCisgICAgICAgICAgICB0aGlzLmluZGV4ZWRQYXJ0U2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworCisgICAgICAgICAgICB0aGlzLmlkeEluZm9TZXJpYWxpemVyID0gaWR4SW5mb1NlcmlhbGl6ZXI7CisKKyAgICAgICAgICAgIHRoaXMuZmllbGRzU2VyaWFsaXplZFNpemUgPSBzZXJpYWxpemVkU2l6ZShkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwgY29sdW1uc0luZGV4Q291bnQpOworICAgICAgICAgICAgdGhpcy5vZmZzZXRzT2Zmc2V0ID0gaW5kZXhlZFBhcnRTaXplICsgZmllbGRzU2VyaWFsaXplZFNpemUgLSBjb2x1bW5zSW5kZXhDb3VudCAqIFR5cGVTaXplcy5JTlRfU0laRTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGJsb2NrQ291bnQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY29sdW1uc0luZGV4Q291bnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZGVsZXRpb25UaW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbmRleEluZm9SZXRyaWV2ZXIgb3BlbldpdGhJbmRleChGaWxlSGFuZGxlIGluZGV4RmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW5kZXhFbnRyeVNpemVIaXN0b2dyYW0udXBkYXRlKGluZGV4ZWRQYXJ0U2l6ZSArIGZpZWxkc1NlcmlhbGl6ZWRTaXplKTsKKyAgICAgICAgICAgIGluZGV4SW5mb0NvdW50SGlzdG9ncmFtLnVwZGF0ZShjb2x1bW5zSW5kZXhDb3VudCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNoYWxsb3dJbmZvUmV0cmlldmVyKGluZGV4RmlsZVBvc2l0aW9uICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZShwb3NpdGlvbikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWSW50Q29kaW5nLmNvbXB1dGVVbnNpZ25lZFZJbnRTaXplKGluZGV4ZWRQYXJ0U2l6ZSArIGZpZWxkc1NlcmlhbGl6ZWRTaXplKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc1NlcmlhbGl6ZWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzT2Zmc2V0IC0gZmllbGRzU2VyaWFsaXplZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4RmlsZS5jcmVhdGVSZWFkZXIoKSwgaWR4SW5mb1NlcmlhbGl6ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHVuc2hhcmVkSGVhcFNpemUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQkFTRV9TSVpFOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBvdXQsIEJ5dGVCdWZmZXIgaW5kZXhJbmZvKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHBvc2l0aW9uKTsKKworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoZmllbGRzU2VyaWFsaXplZFNpemUgKyBpbmRleEluZm8ubGltaXQoKSk7CisKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChoZWFkZXJMZW5ndGgpOworICAgICAgICAgICAgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGRlbGV0aW9uVGltZSwgb3V0KTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGNvbHVtbnNJbmRleENvdW50KTsKKworICAgICAgICAgICAgb3V0LndyaXRlKGluZGV4SW5mbyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplRm9yQ2FjaGUoRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHBvc2l0aW9uKTsKKyAgICAgICAgICAgIG91dC53cml0ZUJ5dGUoQ0FDSEVfSU5ERVhFRF9TSEFMTE9XKTsKKworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGluZGV4RmlsZVBvc2l0aW9uKTsKKworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGhlYWRlckxlbmd0aCk7CisgICAgICAgICAgICBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemUoZGVsZXRpb25UaW1lLCBvdXQpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoY29sdW1uc0luZGV4Q291bnQpOworCisgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihpbmRleGVkUGFydFNpemUpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIHZvaWQgc2tpcEZvckNhY2hlKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisKKyAgICAgICAgICAgIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNraXAoaW4pOworICAgICAgICAgICAgaW4ucmVhZFVuc2lnbmVkVkludCgpOworCisgICAgICAgICAgICBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTaGFsbG93SW5mb1JldHJpZXZlciBleHRlbmRzIEZpbGVJbmRleEluZm9SZXRyaWV2ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG9mZnNldHNPZmZzZXQ7CisKKyAgICAgICAgcHJpdmF0ZSBTaGFsbG93SW5mb1JldHJpZXZlcihsb25nIGluZGV4SW5mb0ZpbGVQb3NpdGlvbiwgaW50IG9mZnNldHNPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURhdGFJbnB1dCBpbmRleFJlYWRlciwgSVNlcmlhbGl6ZXI8SW5kZXhJbmZvPiBpZHhJbmZvU2VyaWFsaXplcikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoaW5kZXhJbmZvRmlsZVBvc2l0aW9uLCBpbmRleFJlYWRlciwgaWR4SW5mb1NlcmlhbGl6ZXIpOworICAgICAgICAgICAgdGhpcy5vZmZzZXRzT2Zmc2V0ID0gb2Zmc2V0c09mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBJbmRleEluZm8gZmV0Y2hJbmRleChpbnQgaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICAvLyBzZWVrIHRvIHBvc2l0aW9uIGluICJvZmZzZXRzIHRvIEluZGV4SW5mbyIgdGFibGUKKyAgICAgICAgICAgIGluZGV4UmVhZGVyLnNlZWsoaW5kZXhJbmZvRmlsZVBvc2l0aW9uICsgb2Zmc2V0c09mZnNldCArIGluZGV4ICogVHlwZVNpemVzLklOVF9TSVpFKTsKKworICAgICAgICAgICAgLy8gcmVhZCBvZmZzZXQgb2YgSW5kZXhJbmZvCisgICAgICAgICAgICBpbnQgaW5kZXhJbmZvUG9zID0gaW5kZXhSZWFkZXIucmVhZEludCgpOworCisgICAgICAgICAgICAvLyBzZWVrIHRvIHBvc2lzaW9uIG9mIEluZGV4SW5mbworICAgICAgICAgICAgaW5kZXhSZWFkZXIuc2VlayhpbmRleEluZm9GaWxlUG9zaXRpb24gKyBpbmRleEluZm9Qb3MpOworCisgICAgICAgICAgICAvLyBmaW5hbGx5LCBkZXNlcmlhbGl6ZSBJbmRleEluZm8KKyAgICAgICAgICAgIHJldHVybiBpZHhJbmZvU2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbmRleFJlYWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNlIGNsYXNzIHRvIGFjY2VzcyB7QGxpbmsgSW5kZXhJbmZvfSBvYmplY3RzLgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgSW5kZXhJbmZvUmV0cmlldmVyIGV4dGVuZHMgQXV0b0Nsb3NlYWJsZQorICAgIHsKKyAgICAgICAgSW5kZXhJbmZvIGNvbHVtbnNJbmRleChpbnQgaW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgICAgICB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJhc2UgY2xhc3MgdG8gYWNjZXNzIHtAbGluayBJbmRleEluZm99IG9iamVjdHMgb24gZGlzayB0aGF0IGtlZXBzIGFscmVhZHkKKyAgICAgKiByZWFkIHtAbGluayBJbmRleEluZm99IG9uIGhlYXAuCisgICAgICovCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRmlsZUluZGV4SW5mb1JldHJpZXZlciBpbXBsZW1lbnRzIEluZGV4SW5mb1JldHJpZXZlcgorICAgIHsKKyAgICAgICAgZmluYWwgbG9uZyBpbmRleEluZm9GaWxlUG9zaXRpb247CisgICAgICAgIGZpbmFsIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4SW5mb1NlcmlhbGl6ZXI7CisgICAgICAgIGZpbmFsIEZpbGVEYXRhSW5wdXQgaW5kZXhSZWFkZXI7CisgICAgICAgIGludCByZXRyaWV2YWxzOworCisgICAgICAgIC8qKgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaW5kZXhJbmZvRmlsZVBvc2l0aW9uIG9mZnNldCBvZiBmaXJzdCBzZXJpYWxpemVkIHtAbGluayBJbmRleEluZm99IG9iamVjdAorICAgICAgICAgKiBAcGFyYW0gaW5kZXhSZWFkZXIgZmlsZSBkYXRhIGlucHV0IHRvIGFjY2VzcyB0aGUgaW5kZXggZmlsZSwgY2xvc2VkIGJ5IHRoaXMgaW5zdGFuY2UKKyAgICAgICAgICogQHBhcmFtIGlkeEluZm9TZXJpYWxpemVyIHRoZSBpbmRleCBzZXJpYWxpemVyIHRvIGRlc2VyaWFsaXplIHtAbGluayBJbmRleEluZm99IG9iamVjdHMKKyAgICAgICAgICovCisgICAgICAgIEZpbGVJbmRleEluZm9SZXRyaWV2ZXIobG9uZyBpbmRleEluZm9GaWxlUG9zaXRpb24sIEZpbGVEYXRhSW5wdXQgaW5kZXhSZWFkZXIsIElTZXJpYWxpemVyPEluZGV4SW5mbz4gaWR4SW5mb1NlcmlhbGl6ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW5kZXhJbmZvRmlsZVBvc2l0aW9uID0gaW5kZXhJbmZvRmlsZVBvc2l0aW9uOworICAgICAgICAgICAgdGhpcy5pZHhJbmZvU2VyaWFsaXplciA9IGlkeEluZm9TZXJpYWxpemVyOworICAgICAgICAgICAgdGhpcy5pbmRleFJlYWRlciA9IGluZGV4UmVhZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBmaW5hbCBJbmRleEluZm8gY29sdW1uc0luZGV4KGludCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHJpZXZhbHMrKzsKKyAgICAgICAgICAgIHJldHVybiBmZXRjaEluZGV4KGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIGFic3RyYWN0IEluZGV4SW5mbyBmZXRjaEluZGV4KGludCBpbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbmRleFJlYWRlci5jbG9zZSgpOworCisgICAgICAgICAgICBpbmRleEluZm9HZXRzSGlzdG9ncmFtLnVwZGF0ZShyZXRyaWV2YWxzKTsKKyAgICAgICAgICAgIGluZGV4SW5mb1JlYWRzSGlzdG9ncmFtLnVwZGF0ZShyZXRyaWV2YWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm93SW5kZXhFbnRyeVJlYWRTaXplVG9vTGFyZ2VFeGNlcHRpb24gZXh0ZW5kcyBSZWplY3RFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHB1YmxpYyBSb3dJbmRleEVudHJ5UmVhZFNpemVUb29MYXJnZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvU1NUYWJsZUl0ZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvU1NUYWJsZUl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxNWQwYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9TU1RhYmxlSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVW5maWx0ZXJlZFZhbGlkYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJhbmdlVG9tYnN0b25lTWFya2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0U1NUYWJsZUl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKKworLyoqCisgKiAgQSBDZWxsIEl0ZXJhdG9yIG92ZXIgU1NUYWJsZQorICovCitwdWJsaWMgY2xhc3MgU1NUYWJsZUl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3I8Um93SW5kZXhFbnRyeT4KK3sKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXggb2YgdGhlIHNsaWNlIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzbGljZTsKKworICAgIHB1YmxpYyBTU1RhYmxlSXRlcmF0b3IoU1NUYWJsZVJlYWRlciBzc3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURhdGFJbnB1dCBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsaWNlcyBzbGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgY29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUgaWZpbGUpCisgICAgeworICAgICAgICBzdXBlcihzc3RhYmxlLCBmaWxlLCBrZXksIGluZGV4RW50cnksIHNsaWNlcywgY29sdW1ucywgaWZpbGUpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIGNhbGxlciB0byBjbG9zZQorICAgIHByb3RlY3RlZCBSZWFkZXIgY3JlYXRlUmVhZGVySW50ZXJuYWwoUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGluZGV4RW50cnkuaXNJbmRleGVkKCkKKyAgICAgICAgICAgICA/IG5ldyBGb3J3YXJkSW5kZXhlZFJlYWRlcihpbmRleEVudHJ5LCBmaWxlLCBzaG91bGRDbG9zZUZpbGUpCisgICAgICAgICAgICAgOiBuZXcgRm9yd2FyZFJlYWRlcihmaWxlLCBzaG91bGRDbG9zZUZpbGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgbmV4dFNsaWNlSW5kZXgoKQorICAgIHsKKyAgICAgICAgaW50IG5leHQgPSBzbGljZTsKKyAgICAgICAgc2xpY2UrKzsKKyAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzTW9yZVNsaWNlcygpCisgICAgeworICAgICAgICByZXR1cm4gc2xpY2UgPCBzbGljZXMuc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmV2ZXJzZU9yZGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEZvcndhcmRJbmRleGVkUmVhZGVyIGV4dGVuZHMgRm9yd2FyZFJlYWRlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbmRleFN0YXRlIGluZGV4U3RhdGU7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgbGFzdEJsb2NrSWR4OyAvLyB0aGUgbGFzdCBpbmRleCBibG9jayB0aGF0IGhhcyBkYXRhIGZvciB0aGUgY3VycmVudCBxdWVyeQorCisgICAgICAgIHByaXZhdGUgRm9yd2FyZEluZGV4ZWRSZWFkZXIoUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihmaWxlLCBzaG91bGRDbG9zZUZpbGUpOworICAgICAgICAgICAgdGhpcy5pbmRleFN0YXRlID0gbmV3IEluZGV4U3RhdGUodGhpcywgbWV0YWRhdGEuY29tcGFyYXRvciwgaW5kZXhFbnRyeSwgZmFsc2UsIGlmaWxlKTsKKyAgICAgICAgICAgIHRoaXMubGFzdEJsb2NrSWR4ID0gaW5kZXhTdGF0ZS5ibG9ja3NDb3VudCgpOyAvLyBpZiB3ZSBuZXZlciBjYWxsIHNldEZvclNsaWNlLCB0aGF0J3Mgd2hlcmUgd2Ugd2FudCB0byBzdG9wCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHRoaXMuaW5kZXhTdGF0ZS5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZvclNsaWNlKFNsaWNlIHNsaWNlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIuc2V0Rm9yU2xpY2Uoc2xpY2UpOworCisgICAgICAgICAgICAvLyBpZiBvdXIgcHJldmlvdXMgc2xpY2luZyBhbHJlYWR5IGdvdCB1cyB0aGUgYmlnZ2VzdCByb3cgaW4gdGhlIHNzdGFibGUsIHdlJ3JlIGRvbmUKKyAgICAgICAgICAgIGlmIChpbmRleFN0YXRlLmlzRG9uZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNsaWNlRG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBpbmRleCBibG9jayB3ZSdsbCBuZWVkIHRvIHJlYWQgZm9yIHRoZSBzbGljZS4KKyAgICAgICAgICAgIGludCBzdGFydElkeCA9IGluZGV4U3RhdGUuZmluZEJsb2NrSW5kZXgoc2xpY2Uuc3RhcnQoKSwgaW5kZXhTdGF0ZS5jdXJyZW50QmxvY2tJZHgoKSk7CisgICAgICAgICAgICBpZiAoc3RhcnRJZHggPj0gaW5kZXhTdGF0ZS5ibG9ja3NDb3VudCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNsaWNlRG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaW5kIHRoZSBsYXN0IGluZGV4IGJsb2NrIHdlJ2xsIG5lZWQgdG8gcmVhZCBmb3IgdGhlIHNsaWNlLgorICAgICAgICAgICAgbGFzdEJsb2NrSWR4ID0gaW5kZXhTdGF0ZS5maW5kQmxvY2tJbmRleChzbGljZS5lbmQoKSwgc3RhcnRJZHgpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgc2xpY2UgZW5kIGlzIGJlZm9yZSB0aGUgdmVyeSBmaXJzdCBibG9jaywgd2UgaGF2ZSBub3RoaW5nIGZvciB0aGF0IHNsaWNlCisgICAgICAgICAgICBpZiAobGFzdEJsb2NrSWR4IDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgc3RhcnRJZHggPCAwOworICAgICAgICAgICAgICAgIHNsaWNlRG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB3ZSBzdGFydCBiZWZvcmUgdGhlIHZlcnkgZmlyc3QgYmxvY2ssIGp1c3QgcmVhZCBmcm9tIHRoZSBmaXJzdCBvbmUuCisgICAgICAgICAgICBpZiAoc3RhcnRJZHggPCAwKQorICAgICAgICAgICAgICAgIHN0YXJ0SWR4ID0gMDsKKworICAgICAgICAgICAgLy8gSWYgdGhhdCdzIHRoZSBsYXN0IGJsb2NrIHdlIHdlcmUgcmVhZGluZywgd2UncmUgYWxyZWFkeSB3aGVyZSB3ZSB3YW50IHRvIGJlLiBPdGhlcndpc2UsCisgICAgICAgICAgICAvLyBzZWVrIHRvIHRoYXQgZmlyc3QgYmxvY2sKKyAgICAgICAgICAgIGlmIChzdGFydElkeCAhPSBpbmRleFN0YXRlLmN1cnJlbnRCbG9ja0lkeCgpKQorICAgICAgICAgICAgICAgIGluZGV4U3RhdGUuc2V0VG9CbG9jayhzdGFydElkeCk7CisKKyAgICAgICAgICAgIC8vIFRoZSBpbmRleCBzZWFyY2ggaXMgYmFzZWQgb24gdGhlIGxhc3QgbmFtZSBvZiB0aGUgaW5kZXggYmxvY2tzLCBzbyBhdCB0aGF0IHBvaW50IHdlIGhhdmUgdGhhdDoKKyAgICAgICAgICAgIC8vICAgMSkgaW5kZXhlc1tjdXJyZW50SWR4IC0gMV0ubGFzdE5hbWUgPCBzbGljZS5zdGFydCA8PSBpbmRleGVzW2N1cnJlbnRJZHhdLmxhc3ROYW1lCisgICAgICAgICAgICAvLyAgIDIpIGluZGV4ZXNbbGFzdEJsb2NrSWR4IC0gMV0ubGFzdE5hbWUgPCBzbGljZS5lbmQgPD0gaW5kZXhlc1tsYXN0QmxvY2tJZHhdLmxhc3ROYW1lCisgICAgICAgICAgICAvLyBzbyBpZiBjdXJyZW50SWR4ID09IGxhc3RCbG9ja0lkeCBhbmQgc2xpY2UuZW5kIDwgaW5kZXhlc1tjdXJyZW50SWR4XS5maXJzdE5hbWUsIHdlJ3JlIGd1YXJhbnRlZWQgdGhhdCB0aGUKKyAgICAgICAgICAgIC8vIHdob2xlIHNsaWNlIGlzIGJldHdlZW4gdGhlIHByZXZpb3VzIGJsb2NrIGVuZCBhbmQgdGhpcyBibG9jayBzdGFydCwgYW5kIHRodXMgaGFzIG5vIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgIC8vIGRhdGEuIE9uZSBleGNlcHRpb24gaXMgaWYgdGhlIHByZXZpb3VzIGJsb2NrIGVuZHMgd2l0aCBhbiBvcGVuTWFya2VyIGFzIGl0IHdpbGwgY292ZXIgb3VyIHNsaWNlCisgICAgICAgICAgICAvLyBhbmQgd2UgbmVlZCB0byByZXR1cm4gaXQuCisgICAgICAgICAgICBpZiAoaW5kZXhTdGF0ZS5jdXJyZW50QmxvY2tJZHgoKSA9PSBsYXN0QmxvY2tJZHgKKyAgICAgICAgICAgICAgICAmJiBtZXRhZGF0YSgpLmNvbXBhcmF0b3IuY29tcGFyZShzbGljZS5lbmQoKSwgaW5kZXhTdGF0ZS5jdXJyZW50SW5kZXgoKS5maXJzdE5hbWUpIDwgMAorICAgICAgICAgICAgICAgICYmIG9wZW5NYXJrZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbGljZURvbmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIGNvbXB1dGVOZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIE91ciBwcmV2aW91cyByZWFkIG1pZ2h0IGhhdmUgbWFkZSB1cyBjcm9zcyBhbiBpbmRleCBibG9jayBib3VuZGFyeS4gSWYgc28sIHVwZGF0ZSBvdXIgaW5mb3JtYXRpb25zLgorICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYXJ0aXRpb24sIHRoaXMgaXMgYWxzbyB3aGF0IHdpbGwgaW5pdGlhbGl6ZSB0aGUgaW5kZXggc3RhdGUuCisgICAgICAgICAgICAgICAgaW5kZXhTdGF0ZS51cGRhdGVCbG9jaygpOworCisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBuZXh0IHVuZmlsdGVyZWQgdW5sZXNzIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCwgb3Igd2UncmUgYmV5b25kIG91ciBzbGljZQorICAgICAgICAgICAgICAgIC8vIGVuZCAobm90ZSB0aGF0IHVubGVzcyB3ZSdyZSBvbiB0aGUgbGFzdCBibG9jayBmb3IgdGhlIHNsaWNlLCB0aGVyZSBpcyBubyBwb2ludAorICAgICAgICAgICAgICAgIC8vIGluIGNoZWNraW5nIHRoZSBzbGljZSBlbmQpLgorICAgICAgICAgICAgICAgIGlmIChpbmRleFN0YXRlLmlzRG9uZSgpCisgICAgICAgICAgICAgICAgICAgIHx8IGluZGV4U3RhdGUuY3VycmVudEJsb2NrSWR4KCkgPiBsYXN0QmxvY2tJZHgKKyAgICAgICAgICAgICAgICAgICAgfHwgIWRlc2VyaWFsaXplci5oYXNOZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGluZGV4U3RhdGUuY3VycmVudEJsb2NrSWR4KCkgPT0gbGFzdEJsb2NrSWR4ICYmIGRlc2VyaWFsaXplci5jb21wYXJlTmV4dFRvKGVuZCkgPj0gMCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisKKyAgICAgICAgICAgICAgICBVbmZpbHRlcmVkIG5leHQgPSBkZXNlcmlhbGl6ZXIucmVhZE5leHQoKTsKKyAgICAgICAgICAgICAgICBVbmZpbHRlcmVkVmFsaWRhdGlvbi5tYXliZVZhbGlkYXRlVW5maWx0ZXJlZChuZXh0LCBtZXRhZGF0YSgpLCBrZXksIHNzdGFibGUpOworICAgICAgICAgICAgICAgIC8vIFdlIG1heSBnZXQgZW1wdHkgcm93IGZvciB0aGUgc2FtZSByZWFzb24gZXhwcmVzc2VkIG9uIFVuZmlsdGVyZWRTZXJpYWxpemVyLmRlc2VyaWFsaXplT25lLgorICAgICAgICAgICAgICAgIGlmIChuZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpZiAobmV4dC5raW5kKCkgPT0gVW5maWx0ZXJlZC5LaW5kLlJBTkdFX1RPTUJTVE9ORV9NQVJLRVIpCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9wZW5NYXJrZXIoKFJhbmdlVG9tYnN0b25lTWFya2VyKSBuZXh0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9TU1RhYmxlUmV2ZXJzZWRJdGVyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL1NTVGFibGVSZXZlcnNlZEl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlMjUzOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9TU1RhYmxlUmV2ZXJzZWRJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsNDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5CdWZmZXJDbHVzdGVyaW5nQm91bmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5NdXRhYmxlRGVsZXRpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5VbmZpbHRlcmVkVmFsaWRhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuSW1tdXRhYmxlQlRyZWVQYXJ0aXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUmFuZ2VUb21ic3RvbmVCb3VuZE1hcmtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJhbmdlVG9tYnN0b25lTWFya2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFNTVGFibGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQWJzdHJhY3RJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5idHJlZS5CVHJlZTsKKworLyoqCisgKiAgQSBDZWxsIEl0ZXJhdG9yIGluIHJldmVyc2VkIGNsdXN0ZXJpbmcgb3JkZXIgb3ZlciBTU1RhYmxlCisgKi8KK3B1YmxpYyBjbGFzcyBTU1RhYmxlUmV2ZXJzZWRJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0U1NUYWJsZUl0ZXJhdG9yPFJvd0luZGV4RW50cnk+Cit7CisgICAgLyoqCisgICAgICogVGhlIGluZGV4IG9mIHRoZSBzbGljZSBiZWluZyBwcm9jZXNzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2xpY2U7CisKKyAgICBwdWJsaWMgU1NUYWJsZVJldmVyc2VkSXRlcmF0b3IoU1NUYWJsZVJlYWRlciBzc3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGF0YUlucHV0IGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2VzIHNsaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIGNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUgaWZpbGUpCisgICAgeworICAgICAgICBzdXBlcihzc3RhYmxlLCBmaWxlLCBrZXksIGluZGV4RW50cnksIHNsaWNlcywgY29sdW1ucywgaWZpbGUpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIGNhbGxlciB0byBjbG9zZQorICAgIHByb3RlY3RlZCBSZWFkZXIgY3JlYXRlUmVhZGVySW50ZXJuYWwoUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGluZGV4RW50cnkuaXNJbmRleGVkKCkKKyAgICAgICAgICAgICA/IG5ldyBSZXZlcnNlSW5kZXhlZFJlYWRlcihpbmRleEVudHJ5LCBmaWxlLCBzaG91bGRDbG9zZUZpbGUpCisgICAgICAgICAgICAgOiBuZXcgUmV2ZXJzZVJlYWRlcihmaWxlLCBzaG91bGRDbG9zZUZpbGUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmV2ZXJzZU9yZGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgbmV4dFNsaWNlSW5kZXgoKQorICAgIHsKKyAgICAgICAgaW50IG5leHQgPSBzbGljZTsKKyAgICAgICAgc2xpY2UrKzsKKyAgICAgICAgcmV0dXJuIHNsaWNlcy5zaXplKCkgLSAobmV4dCArIDEpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc01vcmVTbGljZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNsaWNlIDwgc2xpY2VzLnNpemUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFJldmVyc2VSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdFJlYWRlcgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIFJldXNhYmxlUGFydGl0aW9uRGF0YSBidWZmZXI7CisgICAgICAgIHByb3RlY3RlZCBJdGVyYXRvcjxVbmZpbHRlcmVkPiBpdGVyYXRvcjsKKworICAgICAgICAvLyBTZXQgaW4gbG9hZEZyb21EaXNrICgpIGFuZCB1c2VkIGluIHNldEl0ZXJhdG9yIHRvIGhhbmRsZSByYW5nZSB0b21ic3RvbmUgZXh0ZW5kaW5nIG9uIG11bHRpcGxlIGluZGV4IGJsb2NrLiBTZWUKKyAgICAgICAgLy8gbG9hZEZyb21EaXNrIGZvciBkZXRhaWxzLiBOb3RlIHRoYXQgdGhvc2UgYXJlIGFsd2F5cyBmYWxzZSBmb3Igbm9uLWluZGV4ZWQgcmVhZGVycy4KKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc2tpcEZpcnN0SXRlcmF0ZWRJdGVtOworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBza2lwTGFzdEl0ZXJhdGVkSXRlbTsKKworICAgICAgICBwcml2YXRlIFJldmVyc2VSZWFkZXIoRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBSZXVzYWJsZVBhcnRpdGlvbkRhdGEgY3JlYXRlQnVmZmVyKGludCBibG9ja3NDb3VudCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGVzdGltYXRlZFJvd0NvdW50ID0gMTY7CisgICAgICAgICAgICBpbnQgY29sdW1uQ291bnQgPSBtZXRhZGF0YSgpLnJlZ3VsYXJDb2x1bW5zKCkuc2l6ZSgpOworICAgICAgICAgICAgaWYgKGNvbHVtbkNvdW50ID09IDAgfHwgbWV0YWRhdGEoKS5jbHVzdGVyaW5nQ29sdW1ucygpLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlc3RpbWF0ZWRSb3dDb3VudCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUbyBhdm9pZCB3YXN0ZWQgcmVzaXppbmcgd2UgZ3Vlc3MtZXN0aW1hdGUgdGhlIG51bWJlciBvZiByb3dzIHdlJ3JlIGxpa2VseSB0byByZWFkLiBGb3IgdGhhdAorICAgICAgICAgICAgICAgICAgICAvLyB3ZSB1c2UgdGhlIHN0YXRzIG9uIHRoZSBudW1iZXIgb2Ygcm93cyBwZXIgcGFydGl0aW9uIGZvciB0aGF0IHNzdGFibGUuCisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBzbyBmYXIgd2Ugb25seSBrZWVwIHN0YXRzIG9uIGNlbGxzLCBzbyB0byBnZXQgYSByb3VnaCBlc3RpbWF0ZSBvbiB0aGUgbnVtYmVyIG9mIHJvd3MsCisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRpdmlkZSBieSB0aGUgbnVtYmVyIG9mIHJlZ3VsYXIgY29sdW1ucyB0aGUgdGFibGUgaGFzLiBXZSBzaG91bGQgZml4IG9uY2Ugd2UgY29sbGVjdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RhdHMgb24gcm93cworICAgICAgICAgICAgICAgICAgICBpbnQgZXN0aW1hdGVkUm93c1BlclBhcnRpdGlvbiA9IChpbnQpKHNzdGFibGUuZ2V0RXN0aW1hdGVkQ2VsbFBlclBhcnRpdGlvbkNvdW50KCkucGVyY2VudGlsZSgwLjc1KSAvIGNvbHVtbkNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkUm93Q291bnQgPSBNYXRoLm1heChlc3RpbWF0ZWRSb3dzUGVyUGFydGl0aW9uIC8gYmxvY2tzQ291bnQsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGUgRXN0aW1hdGVkSGlzdG9ncmFtIG1lYW4oKSBtZXRob2QgY2FuIHRocm93IHRoaXMgKGlmIGl0IG92ZXJmbG93cykuIFdoaWxlIHN1Y2ggb3ZlcmZsb3cKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkbid0IGhhcHBlbiwgaXQncyBub3Qgd29ydGggdGFraW5nIHRoZSByaXNrIG9mIGxldHRpbmcgdGhlIGV4Y2VwdGlvbiBidWJibGUgdXAuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXVzYWJsZVBhcnRpdGlvbkRhdGEobWV0YWRhdGEoKSwgcGFydGl0aW9uS2V5KCksIGNvbHVtbnMoKSwgZXN0aW1hdGVkUm93Q291bnQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9yU2xpY2UoU2xpY2Ugc2xpY2UpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIHJlYWQgdGhlIGRhdGEsIGp1c3QgY3JlYXRlIHRoZSBpdGVyYXRvciBmb3IgdGhlIHNsaWNlLiBPdGhlcndpc2UsIHJlYWQgdGhlIGRhdGEuCisgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gY3JlYXRlQnVmZmVyKDEpOworICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4gcmV1c2UgdGhhdCBidWZmZXIgYmV0d2VlbiBzbGljZXMgKHdlIGNvdWxkIGFsdGVybmF0aXZlbHkgcmUtcmVhZCBmcm9tIGRpc2sKKyAgICAgICAgICAgICAgICAvLyBldmVyeSB0aW1lLCBidXQgdGhhdCBmZWVscyBtb3JlIHdhc3RlZnVsKSBzbyB3ZSB3YW50IHRvIGluY2x1ZGUgZXZlcnl0aGluZyBmcm9tIHRoZSBiZWdpbm5pbmcuCisgICAgICAgICAgICAgICAgLy8gV2UgY2FuIHN0b3AgYXQgdGhlIHNsaWNlIGVuZCBob3dldmVyIHNpbmNlIGFueSBmb2xsb3dpbmcgc2xpY2Ugd2lsbCBiZSBiZWZvcmUgdGhhdC4KKyAgICAgICAgICAgICAgICBsb2FkRnJvbURpc2sobnVsbCwgc2xpY2UuZW5kKCksIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRJdGVyYXRvcihzbGljZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRJdGVyYXRvcihTbGljZSBzbGljZSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGJ1ZmZlciAhPSBudWxsOworICAgICAgICAgICAgaXRlcmF0b3IgPSBidWZmZXIuYnVpbHQudW5maWx0ZXJlZEl0ZXJhdG9yKGNvbHVtbnMsIFNsaWNlcy53aXRoKG1ldGFkYXRhKCkuY29tcGFyYXRvciwgc2xpY2UpLCB0cnVlKTsKKworICAgICAgICAgICAgaWYgKCFpdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpZiAoc2tpcEZpcnN0SXRlcmF0ZWRJdGVtKQorICAgICAgICAgICAgICAgIGl0ZXJhdG9yLm5leHQoKTsKKworICAgICAgICAgICAgaWYgKHNraXBMYXN0SXRlcmF0ZWRJdGVtKQorICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gbmV3IFNraXBMYXN0SXRlcmF0b3IoaXRlcmF0b3IpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzTmV4dEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIElmIHdlJ3ZlIG5ldmVyIGNhbGxlZCBzZXRGb3JTbGljZSwgd2UncmUgcmVhZGluZyBldmVyeXRoaW5nCisgICAgICAgICAgICBpZiAoaXRlcmF0b3IgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzZXRGb3JTbGljZShTbGljZS5BTEwpOworCisgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWQgbmV4dEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IubmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RvcFJlYWRpbmdEaXNrKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlYWRzIHRoZSB1bmZpbHRlcmVkIGZyb20gZGlzayBhbmQgbG9hZCB0aGVtIGludG8gdGhlIHJlYWRlciBidWZmZXIuIEl0IHN0b3BzIHJlYWRpbmcgd2hlbiBlaXRoZXIgdGhlIHBhcnRpdGlvbgorICAgICAgICAvLyBpcyBmdWxseSByZWFkLCBvciB3aGVuIHN0b3BSZWFkaW5nRGlzaygpIHJldHVybnMgdHJ1ZS4KKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgbG9hZEZyb21EaXNrKENsdXN0ZXJpbmdCb3VuZDw/PiBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdCb3VuZDw/PiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc1ByZXZpb3VzQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc05leHRCbG9jaykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHN0YXJ0ICE9IG51bGwgbWVhbnMgaXQncyB0aGUgYmxvY2sgY292ZXJpbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUgc2xpY2UsIHNvIGl0IGhhcyB0byBiZSB0aGUgbGFzdCBibG9jayBmb3IgdGhpcyBzbGljZS4KKyAgICAgICAgICAgIGFzc2VydCBzdGFydCA9PSBudWxsIHx8ICFoYXNOZXh0QmxvY2s7CisKKyAgICAgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgICAgICAgICAgc2tpcEZpcnN0SXRlcmF0ZWRJdGVtID0gZmFsc2U7CisgICAgICAgICAgICBza2lwTGFzdEl0ZXJhdGVkSXRlbSA9IGZhbHNlOworCisgICAgICAgICAgICAvLyBJZiB0aGUgc3RhcnQgbWlnaHQgYmUgaW4gdGhpcyBibG9jaywgc2tpcCBldmVyeXRoaW5nIHRoYXQgY29tZXMgYmVmb3JlIGl0LgorICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGRlc2VyaWFsaXplci5oYXNOZXh0KCkgJiYgZGVzZXJpYWxpemVyLmNvbXBhcmVOZXh0VG8oc3RhcnQpIDw9IDAgJiYgIXN0b3BSZWFkaW5nRGlzaygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2VyaWFsaXplci5uZXh0SXNSb3coKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplci5za2lwTmV4dCgpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVPcGVuTWFya2VyKChSYW5nZVRvbWJzdG9uZU1hcmtlcilkZXNlcmlhbGl6ZXIucmVhZE5leHQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIG9wZW4gbWFya2VyLCBpdCdzIGVpdGhlciBvbmUgZnJvbSB3aGF0IHdlIGp1c3Qgc2tpcHBlZCBvciBpdCdzIG9uZSB0aGF0IG9wZW4gaW4gdGhlIG5leHQgKG9yCisgICAgICAgICAgICAvLyBvbmUgb2YgdGhlIG5leHQpIGluZGV4IGJsb2NrIChpZiBvcGVuTWFya2VyID09IG9wZW5NYXJrZXJBdFN0YXJ0T2ZCbG9jaykuCisgICAgICAgICAgICBpZiAob3Blbk1hcmtlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gZmVlZCBhIG1hcmtlciB0byB0aGUgYnVmZmVyLCBiZWNhdXNlIHRoYXQgbWFya2VyIGlzIGxpa2VseSB0byBiZSBjbG9zZSBsYXRlciBhbmQgSW1tdGFibGVCVHJlZVBhcnRpdGlvbgorICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgdGFrZSBraW5kbHkgdG8gbWFya2VyIHRoYXQgY29tZXMgd2l0aG91dCB0aGVpciBjb3VudGVycGFydC4gSWYgdGhhdCdzIHRoZSBsYXN0IGJsb2NrIHdlJ3JlIGdvbm5hIHJlYWQgKGZvcgorICAgICAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IHNsaWNlIGF0IGxlYXN0KSBpdCdzIGVhc3kgYmVjYXVzZSB3ZSdsbCB3YW50IHRvIHJldHVybiB0aGF0IG9wZW4gbWFya2VyIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEgaW4gdGhpcworICAgICAgICAgICAgICAgIC8vIGJsb2NrIGFueXdheSwgc28gd2UgaGF2ZSBub3RoaW5nIG1vcmUgdG8gZG8gdGhhbiBhZGRpbmcgaXQgdG8gdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCB0aGUgbGFzdCBibG9jayBob3dldmVyLCBpbiB3aGljaCBjYXNlIHdlIGtub3cgd2UnbGwgaGF2ZSBzdGFydCA9PSBudWxsLCBpdCBtZWFucyB0aGlzIG1hcmtlciBpcyByZWFsbHkKKyAgICAgICAgICAgICAgICAvLyBvcGVuIGluIGEgbmV4dCBibG9jayBhbmQgc28gd2hpbGUgd2UgZG8gbmVlZCB0byBhZGQgaXQgdGhlIGJ1ZmZlciBmb3IgdGhlIHJlYXNvbiBtZW50aW9uZWQgYWJvdmUsIHdlIGRvbid0CisgICAgICAgICAgICAgICAgLy8gd2FudCB0byAicmV0dXJuIiBpdCBqdXN0IHlldCwgd2UnbGwgd2FpdCB1bnRpbCB3ZSByZWFjaCBpdCBpbiB0aGUgbmV4dCBibG9ja3MuIFRoYXQncyB3aHkgd2UgdHJpZ2dlcgorICAgICAgICAgICAgICAgIC8vIHNraXBMYXN0SXRlcmF0ZWRJdGVtIGluIHRoYXQgY2FzZSAodGhpcyBpcyBmaXJzdCBpdGVtIG9mIHRoZSBibG9jaywgYnV0IHdlJ3JlIGl0ZXJhdGluZyBpbiByZXZlcnNlIG9yZGVyCisgICAgICAgICAgICAgICAgLy8gc28gaXQgd2lsbCBiZSBsYXN0IHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcikuCisgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IG1hcmtlclN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5CT1RUT00gOiBzdGFydDsKKyAgICAgICAgICAgICAgICBidWZmZXIuYWRkKG5ldyBSYW5nZVRvbWJzdG9uZUJvdW5kTWFya2VyKG1hcmtlclN0YXJ0LCBvcGVuTWFya2VyKSk7CisgICAgICAgICAgICAgICAgaWYgKGhhc05leHRCbG9jaykKKyAgICAgICAgICAgICAgICAgICAgc2tpcExhc3RJdGVyYXRlZEl0ZW0gPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBOb3cgZGVzZXJpYWxpemUgZXZlcnl0aGluZyB1bnRpbCB3ZSByZWFjaCBvdXIgcmVxdWVzdGVkIGVuZCAoaWYgd2UgaGF2ZSBvbmUpCisgICAgICAgICAgICAvLyBTZWUgU1NUYWJsZUl0ZXJhdG9yLkZvcndhcmRSZWFkLmNvbXB1dGVOZXh0KCkgZm9yIHdoeSB0aGlzIGlzIGEgc3RyaWN0IGluZXF1YWxpdHkgYmVsb3c6IHRoaXMgaXMgdGhlIHNhbWUKKyAgICAgICAgICAgIC8vIHJlYXNvbmluZyBoZXJlLgorICAgICAgICAgICAgd2hpbGUgKGRlc2VyaWFsaXplci5oYXNOZXh0KCkKKyAgICAgICAgICAgICAgICAgICAmJiAoZW5kID09IG51bGwgfHwgZGVzZXJpYWxpemVyLmNvbXBhcmVOZXh0VG8oZW5kKSA8IDApCisgICAgICAgICAgICAgICAgICAgJiYgIXN0b3BSZWFkaW5nRGlzaygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVuZmlsdGVyZWQgdW5maWx0ZXJlZCA9IGRlc2VyaWFsaXplci5yZWFkTmV4dCgpOworICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRWYWxpZGF0aW9uLm1heWJlVmFsaWRhdGVVbmZpbHRlcmVkKHVuZmlsdGVyZWQsIG1ldGFkYXRhKCksIGtleSwgc3N0YWJsZSk7CisgICAgICAgICAgICAgICAgLy8gV2UgbWF5IGdldCBlbXB0eSByb3cgZm9yIHRoZSBzYW1lIHJlYXNvbiBleHByZXNzZWQgb24gVW5maWx0ZXJlZFNlcmlhbGl6ZXIuZGVzZXJpYWxpemVPbmUuCisgICAgICAgICAgICAgICAgaWYgKCF1bmZpbHRlcmVkLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFkZCh1bmZpbHRlcmVkKTsKKworICAgICAgICAgICAgICAgIGlmICh1bmZpbHRlcmVkLmlzUmFuZ2VUb21ic3RvbmVNYXJrZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlT3Blbk1hcmtlcigoUmFuZ2VUb21ic3RvbmVNYXJrZXIpdW5maWx0ZXJlZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gb3BlbiBtYXJrZXIsIHdlIHNob3VsZCBjbG9zZSBpdCBiZWZvcmUgZmluaXNoaW5nCisgICAgICAgICAgICBpZiAob3Blbk1hcmtlciAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIHJldmVyc2UgcHJvYmxlbSB0aGFuIHRoZSBvbmUgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jay4gTmFtZWx5LCBpZiBpdCdzIHRoZSBmaXJzdCBibG9jaworICAgICAgICAgICAgICAgIC8vIHdlIGRlc2VyaWFsaXplIGZvciB0aGUgc2xpY2UgKHRoZSBvbmUgY292ZXJpbmcgdGhlIHNsaWNlIGVuZCBiYXNpY2FsbHkpLCB0aGVuIGl0J3MgZWFzeSwgd2UganVzdCB3YW50CisgICAgICAgICAgICAgICAgLy8gdG8gYWRkIHRoZSBjbG9zZSBtYXJrZXIgdG8gdGhlIGJ1ZmZlciBhbmQgcmV0dXJuIGl0IG5vcm1hbGx5LgorICAgICAgICAgICAgICAgIC8vIElmIGl0J3Mgbm90ZSBvdXIgZmlyc3QgYmxvY2sgKGZvciB0aGUgc2xpY2UpIGhvd2V2ZXIsIGl0IG1lYW5zIHRoYXQgbWFya2VyIGNsb3NlZCBpbiBhIHByZXZpb3VzbHkgcmVhZAorICAgICAgICAgICAgICAgIC8vIGJsb2NrIGFuZCB3ZSBoYXZlIGFscmVhZHkgcmV0dXJuZWQgaXQuIFNvIHdoaWxlIHdlIHNob3VsZCBzdGlsbCBhZGQgaXQgdG8gdGhlIGJ1ZmZlciBmb3IgdGhlIHNha2Ugb2YKKyAgICAgICAgICAgICAgICAvLyBub3QgYnJlYWtpbmcgSW1tdXRhYmxlQlRyZWVQYXJ0aXRpb24sIHdlIHNob3VsZCBza2lwIGl0IHdoZW4gcmV0dXJuaW5nIGZyb20gdGhlIGl0ZXJhdG9yLCBoZW5jZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBza2lwRmlyc3RJdGVyYXRlZEl0ZW0gKHRoaXMgaXMgdGhlIGxhc3QgaXRlbSBvZiB0aGUgYmxvY2ssIGJ1dCB3ZSdyZSBpdGVyYXRpbmcgaW4gcmV2ZXJzZSBvcmRlciBzbyBpdCB3aWxsCisgICAgICAgICAgICAgICAgLy8gYmUgdGhlIGZpcnN0IHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcikuCisgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IG1hcmtlckVuZCA9IGVuZCA9PSBudWxsID8gQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLlRPUCA6IGVuZDsKKyAgICAgICAgICAgICAgICBidWZmZXIuYWRkKG5ldyBSYW5nZVRvbWJzdG9uZUJvdW5kTWFya2VyKG1hcmtlckVuZCwgb3Blbk1hcmtlcikpOworICAgICAgICAgICAgICAgIGlmIChoYXNQcmV2aW91c0Jsb2NrKQorICAgICAgICAgICAgICAgICAgICBza2lwRmlyc3RJdGVyYXRlZEl0ZW0gPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidWZmZXIuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUmV2ZXJzZUluZGV4ZWRSZWFkZXIgZXh0ZW5kcyBSZXZlcnNlUmVhZGVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIEluZGV4U3RhdGUgaW5kZXhTdGF0ZTsKKworICAgICAgICAvLyBUaGUgc2xpY2Ugd2UncmUgY3VycmVudGx5IGl0ZXJhdGluZyBvdmVyCisgICAgICAgIHByaXZhdGUgU2xpY2Ugc2xpY2U7CisgICAgICAgIC8vIFRoZSBsYXN0IGluZGV4IGJsb2NrIHRvIGNvbnNpZGVyIGZvciB0aGUgc2xpY2UKKyAgICAgICAgcHJpdmF0ZSBpbnQgbGFzdEJsb2NrSWR4OworCisgICAgICAgIHByaXZhdGUgUmV2ZXJzZUluZGV4ZWRSZWFkZXIoUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihmaWxlLCBzaG91bGRDbG9zZUZpbGUpOworICAgICAgICAgICAgdGhpcy5pbmRleFN0YXRlID0gbmV3IEluZGV4U3RhdGUodGhpcywgbWV0YWRhdGEuY29tcGFyYXRvciwgaW5kZXhFbnRyeSwgdHJ1ZSwgaWZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgICAgICB0aGlzLmluZGV4U3RhdGUuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb3JTbGljZShTbGljZSBzbGljZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc2xpY2UgPSBzbGljZTsKKworICAgICAgICAgICAgLy8gaWYgb3VyIHByZXZpb3VzIHNsaWNpbmcgYWxyZWFkeSBnb3QgdXMgcGFzdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzc3RhYmxlLCB3ZSdyZSBkb25lCisgICAgICAgICAgICBpZiAoaW5kZXhTdGF0ZS5pc0RvbmUoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpdGVyYXRvciA9IENvbGxlY3Rpb25zLmVtcHR5SXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGluZGV4IGJsb2NrIHdlJ2xsIG5lZWQgdG8gcmVhZCBmb3IgdGhlIHNsaWNlLgorICAgICAgICAgICAgaW50IHN0YXJ0SWR4ID0gaW5kZXhTdGF0ZS5maW5kQmxvY2tJbmRleChzbGljZS5lbmQoKSwgaW5kZXhTdGF0ZS5jdXJyZW50QmxvY2tJZHgoKSk7CisgICAgICAgICAgICBpZiAoc3RhcnRJZHggPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gQ29sbGVjdGlvbnMuZW1wdHlJdGVyYXRvcigpOworICAgICAgICAgICAgICAgIGluZGV4U3RhdGUuc2V0VG9CbG9jayhzdGFydElkeCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsYXN0QmxvY2tJZHggPSBpbmRleFN0YXRlLmZpbmRCbG9ja0luZGV4KHNsaWNlLnN0YXJ0KCksIHN0YXJ0SWR4KTsKKworICAgICAgICAgICAgLy8gSWYgdGhlIGxhc3QgYmxvY2sgdG8gbG9vayAoaW4gcmV2ZXJzZSBvcmRlcikgaXMgYWZ0ZXIgdGhlIHZlcnkgbGFzdCBibG9jaywgd2UgaGF2ZSBub3RoaW5nIGZvciB0aGF0IHNsaWNlCisgICAgICAgICAgICBpZiAobGFzdEJsb2NrSWR4ID49IGluZGV4U3RhdGUuYmxvY2tzQ291bnQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgc3RhcnRJZHggPj0gaW5kZXhTdGF0ZS5ibG9ja3NDb3VudCgpOworICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gQ29sbGVjdGlvbnMuZW1wdHlJdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgd2Ugc3RhcnQgKGluIHJldmVyc2Ugb3JkZXIpIGFmdGVyIHRoZSB2ZXJ5IGxhc3QgYmxvY2ssIGp1c3QgcmVhZCBmcm9tIHRoZSBsYXN0IG9uZS4KKyAgICAgICAgICAgIGlmIChzdGFydElkeCA+PSBpbmRleFN0YXRlLmJsb2Nrc0NvdW50KCkpCisgICAgICAgICAgICAgICAgc3RhcnRJZHggPSBpbmRleFN0YXRlLmJsb2Nrc0NvdW50KCkgLSAxOworCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgZXZlbiBpZiB3ZSB3ZXJlIGFscmVhZHkgc2V0IG9uIHRoZSBwcm9wZXIgYmxvY2sgKHdoaWNoIHdvdWxkIGhhcHBlbiBpZiB0aGUgcHJldmlvdXMgc2xpY2UKKyAgICAgICAgICAgIC8vIHJlcXVlc3RlZCBlbmRlZCBvbiB0aGUgc2FtZSBibG9jayB0aGlzIG9uZSBzdGFydCksIHdlIGNhbid0IHJldXNlIGl0IGJlY2F1c2Ugd2hlbiByZWFkaW5nIHRoZSBwcmV2aW91cworICAgICAgICAgICAgLy8gc2xpY2Ugd2UndmUgb25seSByZWFkIHRoYXQgYmxvY2sgZnJvbSB0aGUgcHJldmlvdXMgc2xpY2Ugc3RhcnQuIFJlLXJlYWRpbmcgYWxzbyBoYW5kbGVzCisgICAgICAgICAgICAvLyBza2lwRmlyc3RJdGVyYXRlZEl0ZW0vc2tpcExhc3RJdGVyYXRlZEl0ZW0gdGhhdCB3ZSB3b3VsZCBuZWVkIHRvIGhhbmRsZSBvdGhlcndpc2UuCisgICAgICAgICAgICBpbmRleFN0YXRlLnNldFRvQmxvY2soc3RhcnRJZHgpOworCisgICAgICAgICAgICByZWFkQ3VycmVudEJsb2NrKGZhbHNlLCBzdGFydElkeCAhPSBsYXN0QmxvY2tJZHgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGhhc05leHRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3VwZXIuaGFzTmV4dEludGVybmFsKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgbm90aGluZyBtb3JlIGZvciBvdXIgY3VycmVudCBibG9jaywgbW92ZSB0aGUgbmV4dCBvbmUgKHNvIHRoZSBvbmUgYmVmb3JlIG9uIGRpc2spLgorICAgICAgICAgICAgICAgIGludCBuZXh0QmxvY2tJZHggPSBpbmRleFN0YXRlLmN1cnJlbnRCbG9ja0lkeCgpIC0gMTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dEJsb2NrSWR4IDwgMCB8fCBuZXh0QmxvY2tJZHggPCBsYXN0QmxvY2tJZHgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8vIFRoZSBzbGljZSBzdGFydCBjYW4gYmUgaW4KKyAgICAgICAgICAgICAgICBpbmRleFN0YXRlLnNldFRvQmxvY2sobmV4dEJsb2NrSWR4KTsKKyAgICAgICAgICAgICAgICByZWFkQ3VycmVudEJsb2NrKHRydWUsIG5leHRCbG9ja0lkeCAhPSBsYXN0QmxvY2tJZHgpOworCisgICAgICAgICAgICAgICAgLy8gSWYgYW4gaW5kZXhlZCBibG9jayBvbmx5IGNvbnRhaW5zIGRhdGEgZm9yIGEgZHJvcHBlZCBjb2x1bW4sIHRoZSBpdGVyYXRvciB3aWxsIGJlIGVtcHR5LCBldmVuCisgICAgICAgICAgICAgICAgLy8gdGhvdWdoIHdlIG1heSBzdGlsbCBoYXZlIGRhdGEgdG8gcmVhZCBpbiBzdWJzZXF1ZW50IGJsb2NrcworCisgICAgICAgICAgICAgICAgLy8gYWxzbywgZm9yIHByZS0zLjAgc3RvcmFnZSBmb3JtYXRzLCBpbmRleCBibG9ja3MgdGhhdCBvbmx5IGNvbnRhaW4gYSBzaW5nbGUgcm93IGFuZCB0aGF0IHJvdyBjcm9zc2VzCisgICAgICAgICAgICAgICAgLy8gaW5kZXggYm91bmRhcmllcywgdGhlIGl0ZXJhdG9yIHdpbGwgYmUgZW1wdHkgZXZlbiB0aG91Z2ggd2UgaGF2ZW4ndCByZWFkIGV2ZXJ5dGhpbmcgd2UncmUgaW50ZW5kaW5nCisgICAgICAgICAgICAgICAgLy8gdG8gcmVhZC4gSW4gdGhhdCBjYXNlLCB3ZSB3YW50IHRvIHJlYWQgdGhlIG5leHQgaW5kZXggYmxvY2suIFRoaXMgc2hvdWxkbid0IGJlIHBvc3NpYmxlIGluIDMuMCsKKyAgICAgICAgICAgICAgICAvLyBmb3JtYXRzIChzZWUgbmV4dCBjb21tZW50KQorICAgICAgICAgICAgICAgIGlmICghaXRlcmF0b3IuaGFzTmV4dCgpICYmIG5leHRCbG9ja0lkeCA+IGxhc3RCbG9ja0lkeCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVhZHMgdGhlIGN1cnJlbnQgYmxvY2ssIHRoZSBsYXN0IG9uZSB3ZSd2ZSBzZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBoYXNQcmV2aW91c0Jsb2NrIGlzIHdoZXRoZXIgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgYSBwcmV2aW91cyBibG9jayBmb3IgdGhlIGN1cnJlbnQgc2xpY2UuCisgICAgICAgICAqIEBwYXJhbSBoYXNOZXh0QmxvY2sgaXMgd2hldGhlciB3ZSBoYXZlIG1vcmUgYmxvY2tzIHRvIHJlYWQgZm9yIHRoZSBjdXJyZW50IHNsaWNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRDdXJyZW50QmxvY2soYm9vbGVhbiBoYXNQcmV2aW91c0Jsb2NrLCBib29sZWFuIGhhc05leHRCbG9jaykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBjcmVhdGVCdWZmZXIoaW5kZXhTdGF0ZS5ibG9ja3NDb3VudCgpKTsKKworICAgICAgICAgICAgLy8gVGhlIHNsaWNlIHN0YXJ0IChyZXNwLiBzbGljZSBlbmQpIGlzIG9ubHkgbWVhbmluZ2Z1bCBvbiB0aGUgbGFzdCAocmVzcC4gZmlyc3QpIGJsb2NrIHJlYWQgKHNpbmNlIGFnYWluLAorICAgICAgICAgICAgLy8gd2UgcmVhZCBibG9ja3MgaW4gcmV2ZXJzZSBvcmRlcikuCisgICAgICAgICAgICBib29sZWFuIGNhbkluY2x1ZGVTbGljZVN0YXJ0ID0gIWhhc05leHRCbG9jazsKKyAgICAgICAgICAgIGJvb2xlYW4gY2FuSW5jbHVkZVNsaWNlRW5kID0gIWhhc1ByZXZpb3VzQmxvY2s7CisKKyAgICAgICAgICAgIGxvYWRGcm9tRGlzayhjYW5JbmNsdWRlU2xpY2VTdGFydCA/IHNsaWNlLnN0YXJ0KCkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbkluY2x1ZGVTbGljZUVuZCA/IHNsaWNlLmVuZCgpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQcmV2aW91c0Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhc05leHRCbG9jayk7CisgICAgICAgICAgICBzZXRJdGVyYXRvcihzbGljZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gc3RvcFJlYWRpbmdEaXNrKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpbmRleFN0YXRlLmlzUGFzdEN1cnJlbnRCbG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZXVzYWJsZVBhcnRpdGlvbkRhdGEKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5OworICAgICAgICBwcml2YXRlIGZpbmFsIFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnM7CisKKyAgICAgICAgcHJpdmF0ZSBNdXRhYmxlRGVsZXRpb25JbmZvLkJ1aWxkZXIgZGVsZXRpb25CdWlsZGVyOworICAgICAgICBwcml2YXRlIE11dGFibGVEZWxldGlvbkluZm8gZGVsZXRpb25JbmZvOworICAgICAgICBwcml2YXRlIEJUcmVlLkJ1aWxkZXI8Um93PiByb3dCdWlsZGVyOworICAgICAgICBwcml2YXRlIEltbXV0YWJsZUJUcmVlUGFydGl0aW9uIGJ1aWx0OworCisgICAgICAgIHByaXZhdGUgUmV1c2FibGVQYXJ0aXRpb25EYXRhKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zIGNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbml0aWFsUm93Q2FwYWNpdHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgICAgICAgIHRoaXMucGFydGl0aW9uS2V5ID0gcGFydGl0aW9uS2V5OworICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1uczsKKyAgICAgICAgICAgIHRoaXMucm93QnVpbGRlciA9IEJUcmVlLmJ1aWxkZXIobWV0YWRhdGEuY29tcGFyYXRvciwgaW5pdGlhbFJvd0NhcGFjaXR5KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkKFVuZmlsdGVyZWQgdW5maWx0ZXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHVuZmlsdGVyZWQuaXNSb3coKSkKKyAgICAgICAgICAgICAgICByb3dCdWlsZGVyLmFkZCgoUm93KXVuZmlsdGVyZWQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRlbGV0aW9uQnVpbGRlci5hZGQoKFJhbmdlVG9tYnN0b25lTWFya2VyKXVuZmlsdGVyZWQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBidWlsdCA9IG51bGw7CisgICAgICAgICAgICByb3dCdWlsZGVyLnJldXNlKCk7CisgICAgICAgICAgICBkZWxldGlvbkJ1aWxkZXIgPSBNdXRhYmxlRGVsZXRpb25JbmZvLmJ1aWxkZXIocGFydGl0aW9uTGV2ZWxEZWxldGlvbiwgbWV0YWRhdGEoKS5jb21wYXJhdG9yLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBidWlsZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlbGV0aW9uSW5mbyA9IGRlbGV0aW9uQnVpbGRlci5idWlsZCgpOworICAgICAgICAgICAgYnVpbHQgPSBuZXcgSW1tdXRhYmxlQlRyZWVQYXJ0aXRpb24obWV0YWRhdGEsIHBhcnRpdGlvbktleSwgY29sdW1ucywgUm93cy5FTVBUWV9TVEFUSUNfUk9XLCByb3dCdWlsZGVyLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGlvbkluZm8sIEVuY29kaW5nU3RhdHMuTk9fU1RBVFMpOworICAgICAgICAgICAgZGVsZXRpb25CdWlsZGVyID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNraXBMYXN0SXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEl0ZXJhdG9yPFVuZmlsdGVyZWQ+CisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPFVuZmlsdGVyZWQ+IGl0ZXJhdG9yOworCisgICAgICAgIHByaXZhdGUgU2tpcExhc3RJdGVyYXRvcihJdGVyYXRvcjxVbmZpbHRlcmVkPiBpdGVyYXRvcikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWQgY29tcHV0ZU5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWl0ZXJhdG9yLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZW5kT2ZEYXRhKCk7CisKKyAgICAgICAgICAgIFVuZmlsdGVyZWQgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBuZXh0IDogZW5kT2ZEYXRhKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpRm9ybWF0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpRm9ybWF0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjYmE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlGb3JtYXQuamF2YQpAQCAtMCwwICsxLDQ1MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkdhdWdlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU2NydWJiZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5NZXRyaWNzUHJvdmlkZXJzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZpbHRlci5CbG9vbUZpbHRlck1ldHJpY3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuQWJzdHJhY3RTU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Tb3J0ZWRUYWJsZVNjcnViYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKKworLyoqCisgKiBCaWd0YWJsZSBmb3JtYXQgd2l0aCB0cmllIGluZGljZXMuIFNlZSBCVElGb3JtYXQubWQgZm9yIHRoZSBmb3JtYXQgZG9jdW1lbnRhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIEJ0aUZvcm1hdCBleHRlbmRzIEFic3RyYWN0U1NUYWJsZUZvcm1hdDxCdGlUYWJsZVJlYWRlciwgQnRpVGFibGVXcml0ZXI+Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJ0aUZvcm1hdC5jbGFzcyk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gImJ0aSI7CisKKyAgICBwcml2YXRlIGZpbmFsIFZlcnNpb24gbGF0ZXN0VmVyc2lvbiA9IG5ldyBCdGlWZXJzaW9uKHRoaXMsIEJ0aVZlcnNpb24uY3VycmVudF92ZXJzaW9uKTsKKyAgICBzdGF0aWMgZmluYWwgQnRpVGFibGVSZWFkZXJGYWN0b3J5IHJlYWRlckZhY3RvcnkgPSBuZXcgQnRpVGFibGVSZWFkZXJGYWN0b3J5KCk7CisgICAgc3RhdGljIGZpbmFsIEJ0aVRhYmxlV3JpdGVyRmFjdG9yeSB3cml0ZXJGYWN0b3J5ID0gbmV3IEJ0aVRhYmxlV3JpdGVyRmFjdG9yeSgpOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21wb25lbnRzIGV4dGVuZHMgU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVzIGV4dGVuZHMgQWJzdHJhY3RTU1RhYmxlRm9ybWF0LkNvbXBvbmVudHMuVHlwZXMKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wb25lbnQuVHlwZSBQQVJUSVRJT05fSU5ERVggPSBDb21wb25lbnQuVHlwZS5jcmVhdGVTaW5nbGV0b24oIlBBUlRJVElPTl9JTkRFWCIsICJQYXJ0aXRpb25zLmRiIiwgQnRpRm9ybWF0LmNsYXNzKTsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcG9uZW50LlR5cGUgUk9XX0lOREVYID0gQ29tcG9uZW50LlR5cGUuY3JlYXRlU2luZ2xldG9uKCJST1dfSU5ERVgiLCAiUm93cy5kYiIsIEJ0aUZvcm1hdC5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIENvbXBvbmVudCBQQVJUSVRJT05fSU5ERVggPSBUeXBlcy5QQVJUSVRJT05fSU5ERVguZ2V0U2luZ2xldG9uKCk7CisKKyAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBDb21wb25lbnQgUk9XX0lOREVYID0gVHlwZXMuUk9XX0lOREVYLmdldFNpbmdsZXRvbigpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFNldDxDb21wb25lbnQ+IFNUUkVBTUlOR19DT01QT05FTlRTID0gSW1tdXRhYmxlU2V0Lm9mKERBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBUlRJVElPTl9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9XX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUFJFU1NJT05fSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUdFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSQyk7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU2V0PENvbXBvbmVudD4gUFJJTUFSWV9DT01QT05FTlRTID0gSW1tdXRhYmxlU2V0Lm9mKERBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJUSVRJT05fSU5ERVgpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFNldDxDb21wb25lbnQ+IE1VVEFCTEVfQ09NUE9ORU5UUyA9IEltbXV0YWJsZVNldC5vZihTVEFUUyk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENvbXBvbmVudD4gVVBMT0FEX0NPTVBPTkVOVFMgPSBJbW11dGFibGVTZXQub2YoREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSVElUSU9OX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST1dfSU5ERVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBSRVNTSU9OX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRTKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Q29tcG9uZW50PiBCQVRDSF9DT01QT05FTlRTID0gSW1tdXRhYmxlU2V0Lm9mKERBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSVElUSU9OX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPV19JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QUkVTU0lPTl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFUUyk7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU2V0PENvbXBvbmVudD4gQUxMX0NPTVBPTkVOVFMgPSBJbW11dGFibGVTZXQub2YoREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSVElUSU9OX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST1dfSU5ERVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QUkVTU0lPTl9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJR0VTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT0MpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFNldDxDb21wb25lbnQ+IEdFTkVSQVRFRF9PTl9MT0FEX0NPTVBPTkVOVFMgPSBJbW11dGFibGVTZXQub2YoRklMVEVSKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBCdGlGb3JtYXQoTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zKQorICAgIHsKKyAgICAgICAgc3VwZXIoTkFNRSwgb3B0aW9ucyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzKFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZvcm1hdC5uYW1lKCkuZXF1YWxzKE5BTUUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpcyhEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWZXJzaW9uIGdldExhdGVzdFZlcnNpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxhdGVzdFZlcnNpb247CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZlcnNpb24gZ2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQnRpVmVyc2lvbih0aGlzLCB2ZXJzaW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnRpVGFibGVXcml0ZXJGYWN0b3J5IGdldFdyaXRlckZhY3RvcnkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyaXRlckZhY3Rvcnk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ0aVRhYmxlUmVhZGVyRmFjdG9yeSBnZXRSZWFkZXJGYWN0b3J5KCkKKyAgICB7CisgICAgICAgIHJldHVybiByZWFkZXJGYWN0b3J5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiBzdHJlYW1pbmdDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDb21wb25lbnRzLlNUUkVBTUlOR19DT01QT05FTlRTOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiBwcmltYXJ5Q29tcG9uZW50cygpCisgICAgeworICAgICAgICByZXR1cm4gQ29tcG9uZW50cy5QUklNQVJZX0NPTVBPTkVOVFM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDb21wb25lbnQ+IGJhdGNoQ29tcG9uZW50cygpCisgICAgeworICAgICAgICByZXR1cm4gQ29tcG9uZW50cy5CQVRDSF9DT01QT05FTlRTOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiB1cGxvYWRDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBDb21wb25lbnRzLlVQTE9BRF9DT01QT05FTlRTOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q29tcG9uZW50PiBtdXRhYmxlQ29tcG9uZW50cygpCisgICAgeworICAgICAgICByZXR1cm4gQ29tcG9uZW50cy5NVVRBQkxFX0NPTVBPTkVOVFM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDb21wb25lbnQ+IGFsbENvbXBvbmVudHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbXBvbmVudHMuQUxMX0NPTVBPTkVOVFM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDb21wb25lbnQ+IGdlbmVyYXRlZE9uTG9hZENvbXBvbmVudHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbXBvbmVudHMuR0VORVJBVEVEX09OX0xPQURfQ09NUE9ORU5UUzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1NUYWJsZUZvcm1hdC5LZXlDYWNoZVZhbHVlU2VyaWFsaXplcjxCdGlUYWJsZVJlYWRlciwgVHJpZUluZGV4RW50cnk+IGdldEtleUNhY2hlVmFsdWVTZXJpYWxpemVyKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiQlRJIHNzdGFibGVzIGRvIG5vdCB1c2Uga2V5IGNhY2hlIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElTY3J1YmJlciBnZXRTY3J1YmJlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIExpZmVjeWNsZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uLCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXIsIElTY3J1YmJlci5PcHRpb25zIG9wdGlvbnMpCisgICAgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoY2ZzLm1ldGFkYXRhKCkuZXF1YWxzKHRyYW5zYWN0aW9uLm9ubHlPbmUoKS5tZXRhZGF0YSgpKSwgIlNTVGFibGUgbWV0YWRhdGEgZG9lcyBub3QgbWF0Y2ggY3VycmVudCBkZWZpbml0aW9uIik7CisgICAgICAgIHJldHVybiBuZXcgQnRpVGFibGVTY3J1YmJlcihjZnMsIHRyYW5zYWN0aW9uLCBvdXRwdXRIYW5kbGVyLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWV0cmljc1Byb3ZpZGVycyBnZXRGb3JtYXRTcGVjaWZpY01ldHJpY3NQcm92aWRlcnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ0aVRhYmxlU3BlY2lmaWNNZXRyaWNzUHJvdmlkZXJzLmluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlbGV0ZU9ycGhhbmVkQ29tcG9uZW50cyhEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMpCisgICAgeworICAgICAgICBTb3J0ZWRUYWJsZVNjcnViYmVyLmRlbGV0ZU9ycGhhbmVkQ29tcG9uZW50cyhkZXNjcmlwdG9yLCBjb21wb25lbnRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZGVsZXRlKERlc2NyaXB0b3IgZGVzYywgTGlzdDxDb21wb25lbnQ+IGNvbXBvbmVudHMpCisgICAgeworICAgICAgICBsb2dnZXIuaW5mbygiRGVsZXRpbmcgc3N0YWJsZToge30iLCBkZXNjKTsKKworICAgICAgICBpZiAoY29tcG9uZW50cy5yZW1vdmUoU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzLkRBVEEpKQorICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoMCwgU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzLkRBVEEpOyAvLyBEQVRBIGNvbXBvbmVudCBzaG91bGQgYmUgZmlyc3QKKworICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkRlbGV0aW5nIGNvbXBvbmVudCB7fSBvZiB7fSIsIGNvbXBvbmVudCwgZGVzYyk7CisgICAgICAgICAgICBkZXNjLmZpbGVGb3IoY29tcG9uZW50KS5kZWxldGVJZkV4aXN0cygpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVsZXRlKERlc2NyaXB0b3IgZGVzYykKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBkZWxldGUoZGVzYywgTGlzdHMubmV3QXJyYXlMaXN0KFNldHMuaW50ZXJzZWN0aW9uKGFsbENvbXBvbmVudHMoKSwgZGVzYy5kaXNjb3ZlckNvbXBvbmVudHMoKSkpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEpWTVN0YWJpbGl0eUluc3BlY3Rvci5pbnNwZWN0VGhyb3dhYmxlKHQpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJ0aVRhYmxlUmVhZGVyRmFjdG9yeSBpbXBsZW1lbnRzIFNTVGFibGVSZWFkZXJGYWN0b3J5PEJ0aVRhYmxlUmVhZGVyLCBCdGlUYWJsZVJlYWRlci5CdWlsZGVyPgorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyLkJ1aWxkZXI8QnRpVGFibGVSZWFkZXIsIEJ0aVRhYmxlUmVhZGVyLkJ1aWxkZXI+IGJ1aWxkZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ0aVRhYmxlUmVhZGVyLkJ1aWxkZXIoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNTVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlcjxCdGlUYWJsZVJlYWRlciwgQnRpVGFibGVSZWFkZXIuQnVpbGRlcj4gbG9hZGluZ0J1aWxkZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBUYWJsZU1ldGFkYXRhUmVmIHRhYmxlTWV0YWRhdGFSZWYsIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnRpVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlcihuZXcgU1NUYWJsZS5CdWlsZGVyPD4oZGVzY3JpcHRvcikuc2V0VGFibGVNZXRhZGF0YVJlZih0YWJsZU1ldGFkYXRhUmVmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRDb21wb25lbnRzKGNvbXBvbmVudHMpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUGFpcjxEZWNvcmF0ZWRLZXksIERlY29yYXRlZEtleT4gcmVhZEtleVJhbmdlKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFBhcnRpdGlvbkluZGV4LnJlYWRGaXJzdEFuZExhc3RLZXkoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUEFSVElUSU9OX0lOREVYKSwgcGFydGl0aW9uZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGFzczxCdGlUYWJsZVJlYWRlcj4gZ2V0UmVhZGVyQ2xhc3MoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQnRpVGFibGVSZWFkZXIuY2xhc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQnRpVGFibGVXcml0ZXJGYWN0b3J5IGltcGxlbWVudHMgU1NUYWJsZVdyaXRlckZhY3Rvcnk8QnRpVGFibGVXcml0ZXIsIEJ0aVRhYmxlV3JpdGVyLkJ1aWxkZXI+CisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ0aVRhYmxlV3JpdGVyLkJ1aWxkZXIgYnVpbGRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnRpVGFibGVXcml0ZXIuQnVpbGRlcihkZXNjcmlwdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBlc3RpbWF0ZVNpemUoU1NUYWJsZVdyaXRlci5TU1RhYmxlU2l6ZVBhcmFtZXRlcnMgcGFyYW1ldGVycykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChsb25nKSAoKHBhcmFtZXRlcnMucGFydGl0aW9uQ291bnQoKSAqIDggLy8gaW5kZXggZW50cmllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcGFyYW1ldGVycy5wYXJ0aXRpb25LZXlzU2l6ZSgpIC8vIGtleXMgaW4gZGF0YSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXJhbWV0ZXJzLmRhdGFTaXplKCkpIC8vIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICogMS4yKTsgLy8gYmxvb20gZmlsdGVyIGFuZCByb3cgaW5kZXggb3ZlcmhlYWQKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCdGlWZXJzaW9uIGV4dGVuZHMgVmVyc2lvbgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY3VycmVudF92ZXJzaW9uID0gImRhIjsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZWFybGllc3Rfc3VwcG9ydGVkX3ZlcnNpb24gPSAiZGEiOworCisgICAgICAgIC8vIHZlcnNpb25zIGFhLWN6IGFyZSBub3Qgc3VwcG9ydGVkIGluIE9TUworICAgICAgICAvLyBkYSAoNS4wKTogaW5pdGlhbCB2ZXJzaW9uIG9mIHRoZSBCSVQgZm9ybWF0CisgICAgICAgIC8vIE5PVEU6IHdoZW4gYWRkaW5nIGEgbmV3IHZlcnNpb24sIHBsZWFzZSBhZGQgdGhhdCB0byBMZWdhY3lTU1RhYmxlVGVzdCwgdG9vLgorCisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0xhdGVzdFZlcnNpb247CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb247CisKKyAgICAgICAgQnRpVmVyc2lvbihCdGlGb3JtYXQgZm9ybWF0LCBTdHJpbmcgdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZm9ybWF0LCB2ZXJzaW9uKTsKKworICAgICAgICAgICAgaXNMYXRlc3RWZXJzaW9uID0gdmVyc2lvbi5jb21wYXJlVG8oY3VycmVudF92ZXJzaW9uKSA9PSAwOworICAgICAgICAgICAgY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb24gPSBNZXNzYWdpbmdTZXJ2aWNlLlZFUlNJT05fNDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMYXRlc3RWZXJzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGlzTGF0ZXN0VmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbW1pdExvZ0xvd2VyQm91bmQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21taXRMb2dJbnRlcnZhbHMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNYXhDb21wcmVzc2VkTGVuZ3RoKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUGVuZGluZ1JlcGFpcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0lzVHJhbnNpZW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTWV0YWRhdGFDaGVja3N1bSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc09sZEJmRm9ybWF0KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0FjY3VyYXRlTWluTWF4KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNMZWdhY3lNaW5NYXgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzT3JpZ2luYXRpbmdIb3N0SWQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNJbXByb3ZlZE1pbk1heCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zUHJlc2VuY2VNYXJrZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNLZXlSYW5nZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uLmNvbXBhcmVUbyhlYXJsaWVzdF9zdXBwb3J0ZWRfdmVyc2lvbikgPj0gMCAmJiB2ZXJzaW9uLmNoYXJBdCgwKSA8PSBjdXJyZW50X3ZlcnNpb24uY2hhckF0KDApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZUZvclN0cmVhbWluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpc0NvbXBhdGlibGUoKSAmJiB2ZXJzaW9uLmNoYXJBdCgwKSA9PSBjdXJyZW50X3ZlcnNpb24uY2hhckF0KDApOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCdGlUYWJsZVNwZWNpZmljTWV0cmljc1Byb3ZpZGVycyBpbXBsZW1lbnRzIE1ldHJpY3NQcm92aWRlcnMKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEJ0aVRhYmxlU3BlY2lmaWNNZXRyaWNzUHJvdmlkZXJzIGluc3RhbmNlID0gbmV3IEJ0aVRhYmxlU3BlY2lmaWNNZXRyaWNzUHJvdmlkZXJzKCk7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxHYXVnZVByb3ZpZGVyPD8+PiBnYXVnZVByb3ZpZGVycyA9IEJsb29tRmlsdGVyTWV0cmljcy5pbnN0YW5jZS5nZXRHYXVnZVByb3ZpZGVycygpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmFibGU8R2F1Z2VQcm92aWRlcjw/Pj4gZ2V0R2F1Z2VQcm92aWRlcnMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZ2F1Z2VQcm92aWRlcnM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ0aUZvcm1hdEZhY3RvcnkgaW1wbGVtZW50cyBGYWN0b3J5CisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBuYW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5BTUU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNTVGFibGVGb3JtYXQ8PywgPz4gZ2V0SW5zdGFuY2UoTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ0aUZvcm1hdChvcHRpb25zKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlGb3JtYXQubWQgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpRm9ybWF0Lm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Yzg4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpRm9ybWF0Lm1kCkBAIC0wLDAgKzEsMTAxMCBAQAorPCEtLS0KKyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIAorIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCisjIEJpZyBUcmllLUluZGV4ZWQgKEJUSSkgU1NUYWJsZSBmb3JtYXQKKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIEJUSSBTU1RhYmxlIGZvcm1hdCwgd2hpY2ggaXMgaW50cm9kdWNlZCB0bworQ2Fzc2FuZHJhIHdpdGggW0NFUC0yNV0oaHR0cHM6Ly9jd2lraS5hcGFjaGUub3JnL2NvbmZsdWVuY2UvZGlzcGxheS9DQVNTQU5EUkEvQ0VQLTI1JTNBK1RyaWUtaW5kZXhlZCtTU1RhYmxlK2Zvcm1hdCkuCisKK1RoZSBmb3JtYXQgaXMgY2FsbGVkIEJUSSwgd2hpY2ggc3RhbmRzIGZvciAiQmlnIFRyaWUtSW5kZXhlZCIsIGJlY2F1c2UgaXQgc2hhcmVzCit0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGV4aXN0aW5nIEJJRyBmb3JtYXQgYW5kIG9ubHkgY2hhbmdlcyB0aGUgcHJpbWFyeSBpbmRleGVzCitpbnNpZGUgU1NUYWJsZXMuIFRoZSBmb3JtYXQgcmVsaWVzIG9uIGJ5dGUgb3JkZXIgYW5kIHRyaWVzLCBhbmQgdXNlcyBhIGNvbWJpbmF0aW9uCitvZiBmZWF0dXJlcyB0byBtYWtlIHRoZSBpbmRleGluZyBzdHJ1Y3R1cmVzIGNvbXBhY3QgYW5kIGVmZmljaWVudC4gVGhlIHBhcmFncmFwaHMKK2JlbG93IGRlc2NyaWJlIHRoZSBmb3JtYXQncyBmZWF0dXJlcyBhbmQgbWVjaGFuaXNtcyB0b2dldGhlciB3aXRoIHRoZSBtb3RpdmF0aW9uIAorYmVoaW5kIHRoZW0sIGFuZCBjb25jbHVkZSB3aXRoIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBvbi1kaXNrIGZvcm1hdC4KKworIyBQcmVyZXF1aXNpdGVzCisKKyMjIEJ5dGUtY29tcGFyYWJsZSB0eXBlcworCitUaGUgcHJvcGVydHkgb2YgYmVpbmcgYnl0ZS1jb21wYXJhYmxlIChhbHNvIGNhbGxlZCBieXRlLW9yZGVyZWQpIGZvciBhCitrZXkgZGVub3RlcyB0aGF0IHRoZXJlIGlzIGEgc2VyaWFsaXNhdGlvbiBvZiB0aGF0IGtleSB0byBhIHNlcXVlbmNlIG9mCitieXRlcyB3aGVyZSB0aGUgbGV4aWNvZ3JhcGhpYyBjb21wYXJpc29uIG9mIHRoZSB1bnNpZ25lZCBieXRlcyBwcm9kdWNlcwordGhlIHNhbWUgcmVzdWx0IGFzIHBlcmZvcm1pbmcgYSB0eXBlZCBjb21wYXJpc29uIG9mIHRoZSBrZXkuCisKK0ZvciBDYXNzYW5kcmEsIHN1Y2ggYSByZXByZXNlbnRhdGlvbiBpcyBnaXZlbiBieQorW0NBU1NBTkRSQS02OTM2XShodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL0NBU1NBTkRSQS02OTM2KS4KK0RldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSBtZWNoYW5pY3Mgb2YgdGhlIHRyYW5zbGF0aW9uIGFyZSBwcm92aWRlZCBpbgordGhlIFtpbmNsdWRlZCBkb2N1bWVudGF0aW9uXSguLi8uLi8uLi8uLi91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlQ29tcGFyYWJsZS5tZCkuCisKKyMjIFRyaWVzCisKK0EgdHJpZSBpcyBhIGRhdGEgc3RydWN0dXJlIHRoYXQgZGVzY3JpYmVzIGEgbWFwcGluZyBiZXR3ZWVuIHNlcXVlbmNlcworYW5kIGFzc29jaWF0ZWQgdmFsdWVzLiBJdCBpcyB2ZXJ5IHNpbWlsYXIgdG8gYSBkZXRlcm1pbmlzdGljIGZpbml0ZQorc3RhdGUgYXV0b21hdG9uLCB3aXRoIHRoZSBtYWluIGRpZmZlcmVuY2UgdGhhdCBhbiBhdXRvbWF0b24gaXMgYWxsb3dlZAordG8gaGF2ZSBjeWNsZXMsIHdoaWxlIGEgdHJpZSBpcyBub3QuCisKK0JlY2F1c2UgdGhlIHRoZW9yeSBhbmQgbWFpbiB1c2FnZSBvZiB0aGUgc3RydWN0dXJlIGlzIGZvciBlbmNvZGluZyB3b3Jkcworb2YgYSBsYW5ndWFnZSwgdGhlIHRyaWUgdGVybWlub2xvZ3kgdGFsa3MgYWJvdXQgImNoYXJhY3RlcnMiLCAid29yZHMiCithbmQgImFscGhhYmV0Iiwgd2hpY2ggaW4gb3VyIGNhc2UgbWFwIHRvIGJ5dGVzIG9mIHRoZSBieXRlLW9yZGVyZWQKK3JlcHJlc2VudGF0aW9uLCB0aGUgc2VxdWVuY2UgdGhhdCBlbmNvZGVzIGl0LCBhbmQgdGhlIHBvc3NpYmxlIHZhbHVlcyBvZgorYSBieXRlW14xXS4KKworW14xXTogRm9yIHNpbXBsaWNpdHkgdGhpcyBkZXNjcmlwdGlvbiBhc3N1bWVzIHdlIGRpcmVjdGx5IG1hcCBhIGJ5dGUgdG8KK2EgY2hhcmFjdGVyLiBPdGhlciBvcHRpb25zIGFyZSBhbHNvIHBvc3NpYmxlIChlLmcuIHVzaW5nIGhleCBkaWdpdHMKK2FzIHRoZSBhbHBoYWJldCBhbmQgdHdvIHRyYW5zaXRpb25zIHBlciBieXRlKS4KKworQSB0cmllIGNhbiBiZSBkZWZpbmVkIGFzIGEgdHJlZSBncmFwaCBpbiB3aGljaCB2ZXJ0aWNlcyBhcmUgc3RhdGVzLCBzb21lCitvZiB3aGljaCBjYW4gYmUgZmluYWwgYW5kIGNvbnRhaW4gYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiwgYW5kIHdoZXJlCitlZGdlcyBhcmUgbGFiZWxsZWQgd2l0aCBjaGFyYWN0ZXJzLiBBIHZhbGlkIHdvcmQgaW4gdGhlIHRyaWUgaXMgZW5jb2RlZAorYnkgYSBwYXRoIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3Qgb2YgdGhlIHRyaWUgd2hlcmUgZWFjaCBlZGdlIGlzIGxhYmVsbGVkCit3aXRoIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgd29yZCwgYW5kIGVuZGluZyBpbiBhIGZpbmFsIHN0YXRlIHdoaWNoCitjb250YWlucyB0aGUgJ3BheWxvYWQnIGFzc29jaWF0ZWQgd2l0aCB0aGUgd29yZC4KKworYGBgbWVybWFpZAorZ3JhcGggVEQKKyAgTm9kZV8oKCApKQorICBzdHlsZSBOb2RlXyBmaWxsOmRhcmtncmV5CisgIE5vZGVfIC0tImEiLS0+IE5vZGVfYSgoKGEpKSkKKyAgICBOb2RlX2EgLS0ibCItLT4gTm9kZV9hbCgoICkpCisgICAgICBOb2RlX2FsIC0tImwiLS0+IE5vZGVfYWxsKCggKSkKKyAgICAgICAgTm9kZV9hbGwgLS0ibyItLT4gTm9kZV9hbGxvKCggKSkKKyAgICAgICAgICBOb2RlX2FsbG8gLS0idyItLT4gTm9kZV9hbGxvdygoKGFsbG93KSkpCisgICAgTm9kZV9hIC0tIm4iLS0+IE5vZGVfYW4oKChhbikpKQorICAgICAgTm9kZV9hbiAtLSJkIi0tPiBOb2RlX2FuZCgoKGFuZCkpKQorICAgICAgTm9kZV9hbiAtLSJ5Ii0tPiBOb2RlX2FueSgoKGFueSkpKQorICAgIE5vZGVfYSAtLSJyIi0tPiBOb2RlX2FyKCggKSkKKyAgICAgIE5vZGVfYXIgLS0iZSItLT4gTm9kZV9hcmUoKChhcmUpKSkKKyAgICBOb2RlX2EgLS0icyItLT4gTm9kZV9hcygoKGFzKSkpCisgIE5vZGVfIC0tIm4iLS0+IE5vZGVfbigoICkpCisgICAgTm9kZV9uIC0tIm8iLS0+IE5vZGVfbm8oKCApKQorICAgICAgTm9kZV9ubyAtLSJkIi0tPiBOb2RlX25vZCgoICkpCisgICAgICAgIE5vZGVfbm9kIC0tImUiLS0+IE5vZGVfbm9kZSgoKG5vZGUpKSkKKyAgTm9kZV8gLS0ibyItLT4gTm9kZV9vKCggKSkKKyAgICBOb2RlX28gLS0iZiItLT4gTm9kZV9vZigoKG9mKSkpCisgICAgTm9kZV9vIC0tIm4iLS0+IE5vZGVfb24oKChvbikpKQorICBOb2RlXyAtLSJ0Ii0tPiBOb2RlX3QoKCApKQorICAgIE5vZGVfdCAtLSJoIi0tPiBOb2RlX3RoKCggKSkKKyAgICAgIE5vZGVfdGggLS0iZSItLT4gTm9kZV90aGUoKCh0aGUpKSkKKyAgICAgIE5vZGVfdGggLS0iaSItLT4gTm9kZV90aGkoKCApKQorICAgICAgICBOb2RlX3RoaSAtLSJzIi0tPiBOb2RlX3RoaXMoKCh0aGlzKSkpCisgICAgTm9kZV90IC0tIm8iLS0+IE5vZGVfdG8oKCh0bykpKQorICAgIE5vZGVfdCAtLSJyIi0tPiBOb2RlX3RyKCggKSkKKyAgICAgIE5vZGVfdHIgLS0iaSItLT4gTm9kZV90cmkoKCApKQorICAgICAgICBOb2RlX3RyaSAtLSJlIi0tPiBOb2RlX3RyaWUoKCh0cmllKSkpCisgICAgTm9kZV90IC0tInkiLS0+IE5vZGVfdHkoKCApKQorICAgICAgTm9kZV90eSAtLSJwIi0tPiBOb2RlX3R5cCgoICkpCisgICAgICAgIE5vZGVfdHlwIC0tImUiLS0+IE5vZGVfdHlwZSgoICkpCisgICAgICAgICAgTm9kZV90eXBlIC0tInMiLS0+IE5vZGVfdHlwZXMoKCh0eXBlcykpKQorICBOb2RlXyAtLSJ3Ii0tPiBOb2RlX3coKCApKQorICAgIE5vZGVfdyAtLSJpIi0tPiBOb2RlX3dpKCggKSkKKyAgICAgIE5vZGVfd2kgLS0idCItLT4gTm9kZV93aXQoKCApKQorICAgICAgICBOb2RlX3dpdCAtLSJoIi0tPiBOb2RlX3dpdGgoKCh3aXRoKSkpCisgICAgICAgICAgTm9kZV93aXRoIC0tIm8iLS0+IE5vZGVfd2l0aG8oKCApKQorICAgICAgICAgICAgTm9kZV93aXRobyAtLSJ1Ii0tPiBOb2RlX3dpdGhvdSgoICkpCisgICAgICAgICAgICAgIE5vZGVfd2l0aG91IC0tInQiLS0+IE5vZGVfd2l0aG91dCgoKHdpdGhvdXQpKSkKK2BgYAorCitUaGlzIG1lYW5zIHRoYXQgaW4gYSBjb25zdHJ1Y3RlZCB0cmllIGZpbmRpbmcgdGhlIHBheWxvYWQgYXNzb2NpYXRlZAord2l0aCBhIHdvcmQgaXMgYSBtYXR0ZXIgb2YgZm9sbG93aW5nIHRoZSBlZGdlcyAoYWxzbyBjYWxsZWQKKyJ0cmFuc2l0aW9ucyIpIGZyb20gdGhlIGluaXRpYWwgc3RhdGUgbGFiZWxsZWQgd2l0aCB0aGUgY29uc2VjdXRpdmUKK2NoYXJhY3RlcnMgb2YgdGhlIHdvcmQsIGFuZCByZXRyaWV2aW5nIHRoZSBwYXlsb2FkIGFzc29jaWF0ZWQgd2l0aCB0aGUKK3N0YXRlIGF0IHdoaWNoIHdlIGVuZCB1cC4gSWYgdGhhdCdzIG5vdCBhIGZpbmFsIHN0YXRlLCBvciBpZiBhdCBhbnkKK3BvaW50IGluIHRoaXMgd2UgZGlkIG5vdCBmaW5kIGEgdHJhbnNpdGlvbiBpbiB0aGUgdHJpZSBtYXRjaGluZyB0aGUKK2NoYXJhY3RlciwgdGhlIHRyaWUgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGlvbiBmb3IgdGhlIHdvcmQuIFRoZQorY29tcGxleGl0eSBvZiBsb29rdXAgaXMgdGh1cyBfT18obGVuKHdvcmQpKSB0cmFuc2l0aW9ucywgd2hlcmUgdGhlIGNvc3Qgb2YKK3Rha2luZyBhIHRyYW5zaXRpb24gaXMgdXN1YWxseSBjb25zdGFudCwgdGh1cyB0aGlzIGNvbXBsZXhpdHkgaXMKK3RoZW9yZXRpY2FsbHkgb3B0aW1hbC4KKworRnJvbSBhIHN0b3JhZ2Ugc3BhY2UgcGVyc3BlY3RpdmUsIG9uZSBvZiB0aGUgbWFpbiBiZW5lZml0cyBvZiBhIHRyaWUgYXMKK2EgZGF0YSBzdHJ1Y3R1cmUgZm9yIHN0b3JpbmcgYSBtYXAgaXMgdGhlIGZhY3QgdGhhdCBpdCBjb21wbGV0ZWx5IGF2b2lkcworc3RvcmluZyByZWR1bmRhbnQgcHJlZml4ZXMuIEFsbCB3b3JkcyB0aGF0IHN0YXJ0IHdpdGggdGhlIHNhbWUgc2VxdWVuY2UKK3N0b3JlIGEgcmVwcmVzZW50YXRpb24gb2YgdGhhdCBzZXF1ZW5jZSBvbmx5IG9uY2UuIElmIHByZWZpeGVzIGFyZQorY29tbW9ubHkgc2hhcmVkLCB0aGlzIGNhbiBzYXZlIGEgZ3JlYXQgZGVhbCBvZiBzcGFjZS4KKworV2hlbiB0aGUgaXRlbXMgc3RvcmVkIGluIGEgdHJpZSBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkgKD1ieXRlKSBvcmRlcmVkLCBhCit0cmllIGlzIGFsc28gYW4gb3JkZXJlZCBzdHJ1Y3R1cmUuIEEgdHJpZSBjYW4gYmUgd2Fsa2VkIGluIG9yZGVyIGFuZCBpdAoraXMgYWxzbyBwb3NzaWJsZSB0byBlZmZpY2llbnRseSBsaXN0IHRoZSBpdGVtcyBiZXR3ZWVuIHR3byBnaXZlbiBrZXlzLgorCitJbiBmYWN0LCBvbmUgY2FuIGVmZmljaWVudGx5IChhbmQgbGF6aWx5KSBhcHBseSBzZXQgYWxnZWJyYSBvdmVyIHRyaWVzLAorYW5kIHNsaWNpbmcgY2FuIGJlIHNlZW4gYXMgYSBzaW1wbGUgYXBwbGljYXRpb24gb2YgaW50ZXJzZWN0aW9uLCB3aGVyZQordGhlIGludGVyc2VjdGluZyB0cmllIGlzIGdlbmVyYXRlZCBvbiB0aGUgZmx5LiBUaGUgc2V0IG9wZXJhdGlvbnMKK2JlbmVmaXQgZnJvbSB0aGUgc2FtZSBwcmVmaXgtc2hhcmluZyBlZmZlY3QgJm1kYXNoOyB3ZSBhcHBseSB1bmlvbiAvCitpbnRlcnNlY3Rpb24gLyBkaWZmZXJlbmNlIHRvIGEgc3RhdGUsIHdoaWNoIGhhcyB0aGUgZWZmZWN0IG9mIGFwcGx5aW5nCit0aGUgb3BlcmF0aW9uIHRvIGFsbCB3b3JkcyB0aGF0IHNoYXJlIHRoZSBwcmVmaXggZGVub3RlZCBieSB0aGF0IHN0YXRlLgorCitgYGBtZXJtYWlkCitncmFwaCBURAorICBOb2RlXygoICkpCisgIHN0eWxlIE5vZGVfIGZpbGw6ZGFya2dyZXkKKyAgTm9kZV8gLS0iYSItLT4gTm9kZV9hKCgoYSkpKQorICBzdHlsZSBOb2RlX2Egc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgbGlua1N0eWxlIDAgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICBOb2RlX2EgLS0ibCItLT4gTm9kZV9hbCgoICkpCisgICAgc3R5bGUgTm9kZV9hbCBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgIGxpbmtTdHlsZSAxIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICBOb2RlX2FsIC0tImwiLS0+IE5vZGVfYWxsKCggKSkKKyAgICAgIHN0eWxlIE5vZGVfYWxsIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICBsaW5rU3R5bGUgMiBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICBOb2RlX2FsbCAtLSJvIi0tPiBOb2RlX2FsbG8oKCApKQorICAgICAgICBzdHlsZSBOb2RlX2FsbG8gc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgbGlua1N0eWxlIDMgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBOb2RlX2FsbG8gLS0idyItLT4gTm9kZV9hbGxvdygoKGFsbG93KSkpCisgICAgICAgICAgc3R5bGUgTm9kZV9hbGxvdyBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSA0IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgTm9kZV9hIC0tIm4iLS0+IE5vZGVfYW4oKChhbikpKQorICAgICAgICAgIHN0eWxlIE5vZGVfYW4gc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgNSBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgTm9kZV9hbiAtLSJkIi0tPiBOb2RlX2FuZCgoKGFuZCkpKQorICAgICAgICAgIHN0eWxlIE5vZGVfYW5kIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDYgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgIE5vZGVfYW4gLS0ieSItLT4gTm9kZV9hbnkoKChhbnkpKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX2FueSBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSA3IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgTm9kZV9hIC0tInIiLS0+IE5vZGVfYXIoKCApKQorICAgICAgICAgIHN0eWxlIE5vZGVfYXIgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgOCBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgTm9kZV9hciAtLSJlIi0tPiBOb2RlX2FyZSgoKGFyZSkpKQorICAgICAgICAgIHN0eWxlIE5vZGVfYXJlIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDkgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICBOb2RlX2EgLS0icyItLT4gTm9kZV9hcygoKGFzKSkpCisgICAgICAgICAgc3R5bGUgTm9kZV9hcyBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSAxMCBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICBOb2RlXyAtLSJuIi0tPiBOb2RlX24oKCApKQorICAgIE5vZGVfbiAtLSJvIi0tPiBOb2RlX25vKCggKSkKKyAgICAgIE5vZGVfbm8gLS0iZCItLT4gTm9kZV9ub2QoKCApKQorICAgICAgICBOb2RlX25vZCAtLSJlIi0tPiBOb2RlX25vZGUoKChub2RlKSkpCisgIE5vZGVfIC0tIm8iLS0+IE5vZGVfbygoICkpCisgICAgTm9kZV9vIC0tImYiLS0+IE5vZGVfb2YoKChvZikpKQorICAgIE5vZGVfbyAtLSJuIi0tPiBOb2RlX29uKCgob24pKSkKKyAgTm9kZV8gLS0idCItLT4gTm9kZV90KCggKSkKKyAgICBOb2RlX3QgLS0iaCItLT4gTm9kZV90aCgoICkpCisgICAgICBOb2RlX3RoIC0tImUiLS0+IE5vZGVfdGhlKCgodGhlKSkpCisgICAgICBOb2RlX3RoIC0tImkiLS0+IE5vZGVfdGhpKCggKSkKKyAgICAgICAgTm9kZV90aGkgLS0icyItLT4gTm9kZV90aGlzKCgodGhpcykpKQorICAgICAgICAgIHN0eWxlIE5vZGVfdGhpcyBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSAyMiBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgIE5vZGVfdCAtLSJvIi0tPiBOb2RlX3RvKCgodG8pKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX3RvIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDIzIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgTm9kZV90IC0tInIiLS0+IE5vZGVfdHIoKCApKQorICAgICAgICAgIHN0eWxlIE5vZGVfdHIgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgMjQgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgIE5vZGVfdHIgLS0iaSItLT4gTm9kZV90cmkoKCApKQorICAgICAgICAgIHN0eWxlIE5vZGVfdHJpIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDI1IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgIE5vZGVfdHJpIC0tImUiLS0+IE5vZGVfdHJpZSgoKHRyaWUpKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX3RyaWUgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgMjYgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICBOb2RlX3QgLS0ieSItLT4gTm9kZV90eSgoICkpCisgICAgICAgICAgc3R5bGUgTm9kZV90eSBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSAyNyBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgTm9kZV90eSAtLSJwIi0tPiBOb2RlX3R5cCgoICkpCisgICAgICAgICAgc3R5bGUgTm9kZV90eXAgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgMjggc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgTm9kZV90eXAgLS0iZSItLT4gTm9kZV90eXBlKCggKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX3R5cGUgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgMjkgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBOb2RlX3R5cGUgLS0icyItLT4gTm9kZV90eXBlcygoKHR5cGVzKSkpCisgICAgICAgICAgc3R5bGUgTm9kZV90eXBlcyBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSAzMCBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICBOb2RlXyAtLSJ3Ii0tPiBOb2RlX3coKCApKQorICAgICAgICAgIHN0eWxlIE5vZGVfdyBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSAzMSBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgIE5vZGVfdyAtLSJpIi0tPiBOb2RlX3dpKCggKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX3dpIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDMyIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICBOb2RlX3dpIC0tInQiLS0+IE5vZGVfd2l0KCggKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX3dpdCBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICAgIGxpbmtTdHlsZSAzMyBzdHJva2U6bGlnaHRncmV5LGNvbG9yOmxpZ2h0Z3JleQorICAgICAgICBOb2RlX3dpdCAtLSJoIi0tPiBOb2RlX3dpdGgoKCh3aXRoKSkpCisgICAgICAgICAgc3R5bGUgTm9kZV93aXRoIHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDM0IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgTm9kZV93aXRoIC0tIm8iLS0+IE5vZGVfd2l0aG8oKCApKQorICAgICAgICAgIHN0eWxlIE5vZGVfd2l0aG8gc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgMzUgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICAgIE5vZGVfd2l0aG8gLS0idSItLT4gTm9kZV93aXRob3UoKCApKQorICAgICAgICAgIHN0eWxlIE5vZGVfd2l0aG91IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgbGlua1N0eWxlIDM2IHN0cm9rZTpsaWdodGdyZXksY29sb3I6bGlnaHRncmV5CisgICAgICAgICAgICAgIE5vZGVfd2l0aG91IC0tInQiLS0+IE5vZGVfd2l0aG91dCgoKHdpdGhvdXQpKSkKKyAgICAgICAgICBzdHlsZSBOb2RlX3dpdGhvdXQgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKyAgICAgICAgICBsaW5rU3R5bGUgMzcgc3Ryb2tlOmxpZ2h0Z3JleSxjb2xvcjpsaWdodGdyZXkKKworYGBgCisKKyhBbiBleGFtcGxlIG9mIHNsaWNpbmcgdGhlIHRyaWUgYWJvdmUgd2l0aCB0aGUgcmFuZ2UgImJpdCItInRoaW5nIi4KK1Byb2Nlc3Npbmcgb25seSBhcHBsaWVzIG9uIGJvdW5kYXJ5IG5vZGVzIChyb290LCAidCIsICJ0aCIsICJ0aGkiKSwKK3doZXJlIHdlIHRocm93IGF3YXkgdGhlIHRyYW5zaXRpb25zIG91dHNpZGUgdGhlIHJhbmdlLiBTdWJ0cmllcyBsaWtlIHRoZQorb25lcyBmb3IgIm4iIGFuZCAibyIgZmFsbCBjb21wbGV0ZWx5IGJldHdlZW4gImIiIGFuZCAidCIgdGh1cyBhcmUgZnVsbHkKK2luc2lkZSB0aGUgcmFuZ2UgYW5kIGNhbiBiZSBwcm9jZXNzZWQgd2l0aG91dCBhbnkgZnVydGhlciByZXN0cmljdGlvbnMuKQorCitBIHRyaWUgY2FuIGJlIHVzZWQgYXMgYSBtb2RpZmlhYmxlIGluLW1lbW9yeSBkYXRhIHN0cnVjdHVyZSB3aGVyZSBvbmUKK2NhbiBhZGQgYW5kIHJlbW92ZSBpbmRpdmlkdWFsIGVsZW1lbnRzLiBJdCBjYW4gYWxzbyBiZSBjb25zdHJ1Y3RlZCBmcm9tCitzb3J0ZWQgaW5wdXQsIGluY3JlbWVudGFsbHkgc3RvcmluZyB0aGUgZGF0YSBkaXJlY3RseSB0byBkaXNrIGFuZAorYnVpbGRpbmcgYW4gZWZmaWNpZW50IHJlYWQtb25seSBvbi1kaXNrIGRhdGEgc3RydWN0dXJlLgorCitGb3IgbW9yZSBmb3JtYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbmNlcHQgYW5kIGFwcGxpY2F0aW9ucyBvZiB0cmllcworYW5kIGZpbml0ZSBzdGF0ZSBhdXRvbWF0YSwgdHJ5IFtJbnRyb2R1Y3Rpb24gdG8gQXV0b21hdGEgVGhlb3J5LAorTGFuZ3VhZ2VzLCBhbmQgQ29tcHV0YXRpb25dKGh0dHBzOi8vYm9va3MuZ29vZ2xlLmNvbS9ib29rcz9pZD1kVmlwQndBQVFCQUopLgorVGhlcmUgYXJlIG1hbnkgdmFyaWF0aW9ucyBvZiB0aGUgY29uY2VwdCwgYW5kIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZgorc3RhdGVzIGFuZCB0cmFuc2l0aW9ucyB0aGF0IGNhbiBiZSBwdXQgdG8gdXNlIHRvIGFjaGlldmUgZXZlbiBmdXJ0aGVyCitlZmZpY2llbmN5IGdhaW5zOyBzb21lIG9mIHRoZXNlIHdpbGwgYmUgZGV0YWlsZWQgYmVsb3cuCisKKyMgSW5kZXhpbmcgd2l0aCB0cmllcworCitTaW5jZSBhIHRyaWUgaXMgZ2VuZXJhbGx5IGFuIG9yZGVyZWQgYnl0ZSBzb3VyY2UgdG8gcGF5bG9hZCBtYXAsIHdlIGNhbgorYXBwbHkgdGhlIGNvbmNlcHQgZGlyZWN0bHkgdG8gdGhlIGNvbXBvbmVudHMgb2YgQ2Fzc2FuZHJhIHRoYXQgYXJlIG1vc3QKK2FmZmVjdGVkIGJ5IHRoZSBpbmVmZmljaWVuY3kgb2YgdXNpbmcgY29tcGFyaXNvbi1iYXNlZCBzdHJ1Y3R1cmVzOiB0aGUKK2luZGljZXMuCisKK1RoaXMgY2FuIGJlIGRvbmUgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisKKy0gICBXaGVuIHdlIHdyaXRlIHRoZSBpbmRleCwgd2UgbWFwIGVhY2gga2V5IGludG8gaXRzIGJ5dGUtb3JkZXJlZAorICAgIHJlcHJlc2VudGF0aW9uIGFuZCBjcmVhdGUgYW4gb24tZGlzayB0cmllIG9mIGJ5dGUtb3JkZXJlZAorICAgIHJlcHJlc2VudGF0aW9ucyBvZiBrZXlzIG1hcHBpbmcgaW50byBwb3NpdGlvbnMgaW4gdGhlIGRhdGEgZmlsZS4KKworLSAgIFdoZW4gd2UgbmVlZCBhbiBleGFjdCBtYXRjaCBmb3IgYSBrZXksIHdlIGNyZWF0ZSBhIChsYXppbHkKKyAgICBnZW5lcmF0ZWQpIGJ5dGUtb3JkZXJlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUga2V5IGFuZCBsb29rIGZvciBpdAorICAgIGluIHRoZSB0cmllLgorCisgICAgLSAgIElmIHdlIGZpbmQgYSBtYXRjaCwgd2Uga25vdyB0aGUgZGF0YSBmaWxlIHBvc2l0aW9uLgorCisgICAgLSAgIElmIHRoZXJlIGlzIG5vIG1hdGNoLCB0aGVyZSBpcyBubyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LgorCistICAgV2hlbiB3ZSBuZWVkIGEgZ3JlYXRlci10aGFuL2dyZWF0ZXItb3ItZXF1YWwgbWF0Y2gsIHdlIHVzZSB0aGUKKyAgICBieXRlLW9yZGVyZWQgcmVwcmVzZW50YXRpb24gdG8gY3JlYXRlIGEgcGF0aCB0aGF0IGxlYWRzIHRvIHRoZQorICAgIGZpcnN0IG1hdGNoaW5nIGRhdGEgcG9zaXRpb24gaW4gdGhlIHNzdGFibGUuCisKKyAgICAtICAgV2UgY2FuIHRoZW4gdXNlIHRoaXMgcGF0aCB0byBpdGVyYXRlIHRoZSBncmVhdGVyIGtleXMgaW4gdGhlCisgICAgICAgIHNzdGFibGUuCisKK1RoaXMgd29ya3MsIGJ1dCBpc24ndCB2ZXJ5IGVmZmljaWVudC4gTG9va3VwIGluIGl0IGlzIF9PXyhsZW4oa2V5KSksIAord2hpY2ggY2FuIGV2ZW4gbWVhbiB0aGF0IG1hbnkgc2Vla3Mgb24gZGlzaywgYW5kIHdlIGhhdmUgdG8gc3RvcmUKK2EgdHJhbnNpdGlvbiAod2hpY2ggZGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgc3RydWN0dXJlKSBmb3IgZXZlcnkKK25vbi1wcmVmaXggY2hhcmFjdGVyIGluIHRoZSBkYXRhc2V0LgorCitXZSBjYW4gZG8gbXVjaCBiZXR0ZXIuCisKKyMjIFRyaW1taW5nIHRoZSBmYXQKKworVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGUgaW5kZXggaXMgdG8gZmluZCBhIHBvc2l0aW9uIGluIHRoZSBkYXRhIGZpbGUKK2ZvciB0aGUgZ2l2ZW4ga2V5LiBJdCBuZWVkcyB0byBiZSBhYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcG9zaXRpb24gZm9yCithbnkgZXhpc3Rpbmcga2V5LCBidXQgdGhlcmUgaXMgbm8gbmVlZCBmb3IgaXQgdG8gYmUgZXhhY3Qgb24ga2V5cyB0aGF0CithcmUgbm90IHByZXNlbnQgaW4gdGhlIGZpbGUgJm1kYXNoOyBzaW5jZSBvdXIgZGF0YSBmaWxlcyBjb250YWluIGEgY29weSBvZgordGhlIGtleSBhdCB0aGUgc3RhcnQgb2YgZWFjaCBwYXJ0aXRpb24sIHdlIGNhbiBzaW1wbHkgY2hlY2sgaWYgdGhlIGtleQord2UgYXJlIHNlYXJjaGluZyBmb3IgbWF0Y2hlcyB0aGUga2V5IGF0IHRoZSBwb3NpdGlvbiByZXR1cm5lZCBieSB0aGUKK2luZGV4LgorCitUaGlzIGFsbG93cyB1cyB0byB1c2UgYSBzaW1wbGUgb3B0aW1pemF0aW9uOiBpbnN0ZWFkIG9mIHN0b3JpbmcgdGhlIGZ1bGwKK2tleSBpbiB0aGUgaW5kZXggdHJpZSwgd2UgY2FuIHN0b3JlIG9ubHkgYSBwcmVmaXggb2YgdGhlIGtleSB0aGF0IGlzCit1bmlxdWUgYW1vbmcgYWxsIHBhcnRpdGlvbnMgaW4gdGhlIHRhYmxlLiBUaGlzIG1lYW5zIHRoYXQgd2UgaGF2ZQoraW50ZXJtZWRpYXRlIG5vZGVzIGluIHRoZSB0cmllIG9ubHkgaWYgYSBwcmVmaXggaXMgc2hhcmVkIGJ5IG11bHRpcGxlCitrZXlzLCB3aGljaCBub3JtYWxseSByZWR1Y2VzIHRoZSBudW1iZXIgb2Ygbm9kZXMgYW5kIHRyYW5zaXRpb25zIGluIHRoZQordHJpZSB0byBhYm91dCAyKm4qLgorCitgYGBtZXJtYWlkCitncmFwaCBURAorICBOb2RlXygoICkpCisgIHN0eWxlIE5vZGVfIGZpbGw6ZGFya2dyZXkKKyAgTm9kZV8gIC0tImEiLS0+IE5vZGVfYSgoKCApKSkKKyAgICBOb2RlX2EgLS0ibCItLT4gTm9kZV9hbCgoKCApKSkKKyAgICBOb2RlX2EgLS0ibiItLT4gTm9kZV9hbigoKCApKSkKKyAgICAgIE5vZGVfYW4gLS0iZCItLT4gTm9kZV9hbmQoKCggKSkpCisgICAgICBOb2RlX2FuIC0tInkiLS0+IE5vZGVfYW55KCgoICkpKQorICAgIE5vZGVfYSAtLSJyIi0tPiBOb2RlX2FyKCgoICkpKQorICAgIE5vZGVfYSAtLSJzIi0tPiBOb2RlX2FzKCgoICkpKQorICBOb2RlXyAgLS0ibiItLT4gTm9kZV9uKCgoICkpKQorICBOb2RlXyAgLS0ibyItLT4gTm9kZV9vKCggKSkKKyAgICBOb2RlX28gLS0iZiItLT4gTm9kZV9vZigoKCApKSkKKyAgICBOb2RlX28gLS0ibiItLT4gTm9kZV9vbigoKCApKSkKKyAgTm9kZV8gIC0tInQiLS0+IE5vZGVfdCgoICkpCisgICAgTm9kZV90IC0tImgiLS0+IE5vZGVfdGgoKCApKQorICAgICAgTm9kZV90aCAtLSJlIi0tPiBOb2RlX3RoZSgoKCApKSkKKyAgICAgIE5vZGVfdGggLS0iaSItLT4gTm9kZV90aGkoKCggKSkpCisgICAgTm9kZV90IC0tIm8iLS0+IE5vZGVfdG8oKCggKSkpCisgICAgTm9kZV90IC0tInIiLS0+IE5vZGVfdHIoKCggKSkpCisgICAgTm9kZV90IC0tInkiLS0+IE5vZGVfdHkoKCggKSkpCisgIE5vZGVfICAtLSJ3Ii0tPiBOb2RlX3coKCApKQorICAgIE5vZGVfdyAtLSJpdGgiLS0+IE5vZGVfd2l0aCgoKCApKSkKKyAgICAgICAgICBOb2RlX3dpdGggLS0ibyItLT4gTm9kZV93aXRob3V0KCgoICkpKQorYGBgCisKK1RoaXMgYWxzbyByZWR1Y2VzIHRoZSBudW1iZXIgb2Ygc3RlcHMgd2UgbmVlZCB0byB0YWtlIGluIHRoZSB0cmllLiBJbiBhCit3ZWxsLWJhbGFuY2VkIGtleSBzZXQgKHN1Y2ggYXMgdGhlIG9uZSB3aGVyZSB0aGUgYnl0ZS1vcmRlcmVkIGtleSBzdGFydHMKK3dpdGggYSBoYXNoIGFzIGluIE11cm11ciBvciBSYW5kb20tcGFydGl0aW9uZWQgcHJpbWFyeSBrZXlzKSB0aGUgbG9va3VwCitjb21wbGV4aXR5IGJlY29tZXMgX09fKGxvZyBfbl8pIHRyYW5zaXRpb25zW14yXS4KKworW14yXTogRm9yIGNvbXBhcmlzb24sIHRoZSBjb21wbGV4aXR5IG9mIGJpbmFyeSBzZWFyY2ggaW4gYSBzb3J0ZWQKK3ByaW1hcnkgaW5kZXggaXMgYWxzbyBfT18obG9nIF9uXyksIGJ1dCBpbiBrZXkgY29tcGFyaXNvbnMgd2hvc2UKK2NvbXBsZXhpdHkgb24gYXZlcmFnZSBpbiBhIHdlbGwtYmFsYW5jZWQga2V5IHNldCBpcyBhbm90aGVyIF9PXyhsb2cgX25fKQorZm9yIGEgdG90YWwgX09fKGxvZzxzdXA+Mjwvc3VwPiBfbl8pLgorCisjIyBUYWtpbmcgaGFyZHdhcmUgaW50byBhY2NvdW50CisKK1RoZSBwb2ludCBhYm92ZSBpbXByb3ZlcyB0aGUgbnVtYmVyIG9mIHRyYW5zaXRpb25zIHNpZ25pZmljYW50bHksIGJ1dAordGhlIG91dC1vZi1jYWNoZSBlZmZpY2llbmN5IGlzIHN0aWxsIHByZXR0eSBiYWQgaWYgd2UgaGF2ZSB0byByZWFkIGEgbmV3CitkaXNrIHBhZ2UgZXZlcnkgdGltZSB3ZSBleGFtaW5lIGEgbm9kZS4gRm9ydHVuYXRlbHkgd2UgY2FuIHRha2Ugc29tZQorZXh0cmEgY2FyZSBkdXJpbmcgY29uc3RydWN0aW9uIHRvIG1ha2Ugc3VyZSB3ZSBtYWtlIHRoZSBtb3N0IG9mIGV2ZXJ5CitkaXNrIHBhZ2UgYnJvdWdodCB1cCBkdXJpbmcgbG9va3VwLgorCitUaGUgaWRlYSBvZiB0aGlzIGlzIHRvIHBhY2sgd2lkZSBzZWN0aW9ucyBvZiB0aGUgdHJpZSBpbiBwYWdlcywgc28gdGhhdAorZXZlcnkgdGltZSB3ZSBvcGVuIGEgcGFnZSB3ZSBjYW4gYmUgY2VydGFpbiB0byBiZSBhYmxlIHRvIGZvbGxvdyBzZXZlcmFsCit0cmFuc2l0aW9ucyBiZWZvcmUgbGVhdmluZyB0aGF0IHBhZ2UuCisKK2BgYG1lcm1haWQKK2dyYXBoIFRECisgIHN1YmdyYXBoIHAxIFsgXQorICBOb2RlXygoICkpCisgIHN0eWxlIE5vZGVfIGZpbGw6ZGFya2dyZXkKKyAgICBOb2RlXyAgLS0iYSItLT4gTm9kZV9hKCgoICkpKQorICAgIE5vZGVfICAtLSJ0Ii0tPiBOb2RlX3QoKCApKQorICBlbmQKKyAgCisgIHN1YmdyYXBoIHAyIFsgXQorICAgIE5vZGVfYSAtLSJsIi0tPiBOb2RlX2FsKCgoICkpKQorICAgIE5vZGVfYSAtLSJuIi0tPiBOb2RlX2FuKCgoICkpKQorICAgICAgTm9kZV9hbiAtLSJkIi0tPiBOb2RlX2FuZCgoKCApKSkKKyAgICAgIE5vZGVfYW4gLS0ieSItLT4gTm9kZV9hbnkoKCggKSkpCisgIGVuZAorICAKKyAgc3ViZ3JhcGggcDMgWyBdCisgICAgTm9kZV9hIC0tInIiLS0+IE5vZGVfYXIoKCggKSkpCisgICAgTm9kZV9hIC0tInMiLS0+IE5vZGVfYXMoKCggKSkpCisgIE5vZGVfICAtLSJuIi0tPiBOb2RlX24oKCggKSkpCisgIGVuZAorCisgIHN1YmdyYXBoIHA0IFsgXQorICBOb2RlXyAgLS0ibyItLT4gTm9kZV9vKCggKSkKKyAgICBOb2RlX28gLS0iZiItLT4gTm9kZV9vZigoKCApKSkKKyAgICBOb2RlX28gLS0ibiItLT4gTm9kZV9vbigoKCApKSkKKyAgICBOb2RlX3QgLS0ibyItLT4gTm9kZV90bygoKCApKSkKKyAgZW5kCisgIAorICBzdWJncmFwaCBwNSBbIF0KKyAgICBOb2RlX3QgLS0iaCItLT4gTm9kZV90aCgoICkpCisgICAgICBOb2RlX3RoIC0tImUiLS0+IE5vZGVfdGhlKCgoICkpKQorICAgICAgTm9kZV90aCAtLSJpIi0tPiBOb2RlX3RoaSgoKCApKSkKKyAgICBOb2RlX3QgLS0iciItLT4gTm9kZV90cigoKCApKSkKKyAgZW5kCisgIAorICBzdWJncmFwaCBwNiBbIF0KKyAgICBOb2RlX3QgLS0ieSItLT4gTm9kZV90eSgoKCApKSkKKyAgTm9kZV8gIC0tInciLS0+IE5vZGVfdygoICkpCisgICAgTm9kZV93IC0tIml0aCItLT4gTm9kZV93aXRoKCgoICkpKQorICAgICAgICAgIE5vZGVfd2l0aCAtLSJvIi0tPiBOb2RlX3dpdGhvdXQoKCggKSkpCisgIGVuZAorICAKKyAgcDIgfn5+IHAzIH5+fiBwNCB+fn4gcDUgfn5+IHA2CitgYGAKKworT25lIHdheSB0byBnZW5lcmF0ZSBzb21ldGhpbmcgbGlrZSB0aGlzIGlzIHRvIHN0YXJ0IGZyb20gdGhlIHJvb3QgYW5kIGRvCithIGJyZWFkdGgtZmlyc3Qgd2FsaywgcGxhY2luZyB0aGUgZW5jb3VudGVyZWQgbm9kZXMgb24gZGlzayB1bnRpbCBhIHBhZ2UKK2lzIGZpbGxlZCBhbmQgdGhlaXIgdGFyZ2V0IHRyYW5zaXRpb25zIGluIGEgcXVldWUgZm9yIHdoaWNoIHRoZSBwcm9jZXNzCitpcyByZXBlYXRlZCB0byBmaWxsIG90aGVyIHBhZ2VzLgorCitBbm90aGVyIGFwcHJvYWNoLCBtb3JlIHN1aXRhYmxlIHRvIG91ciBhcHBsaWNhdGlvbiBiZWNhdXNlIGl0IGNhbiBiZQorZG9uZSBhcyBwYXJ0IG9mIHRoZSBpbmNyZW1lbnRhbCBjb25zdHJ1Y3Rpb24gcHJvY2VzcywgaXMgdG8gZG8gdGhlCitwYWNraW5nIGZyb20gdGhlIGJvdHRvbSB1cCAmbWRhc2g7IHdoZW4gdGhlIGluY3JlbWVudGFsIGNvbnN0cnVjdGlvbgorYWxnb3JpdGhtIGNvbXBsZXRlcyBhIG5vZGUgd2UgZG8gbm90IGltbWVkaWF0ZWx5IHdyaXRlIGl0LCBidXQgd2FpdAordW50aWwgd2UgaGF2ZSBmb3JtZWQgYSBicmFuY2ggdGhhdCBpcyBiaWdnZXIgdGhhbiBhIHBhZ2UuIFdoZW4gdGhpcworaGFwcGVucyB3ZSBsYXkgb3V0IHRoZSBub2RlJ3MgY2hpbGRyZW4gKGVhY2ggc21hbGxlciB0aGFuIGEgcGFnZSBidXQKK3Jvb3Qgb2YgYSBiaWdnZXN0IGJyYW5jaCB0aGF0IHdvdWxkIGZpdCkgYW5kIGxldCB0aGUgcGFyZW50IG5vZGUgYmUKK3RyZWF0ZWQgbGlrZSBhIGxlYWYgZnJvbSB0aGVyZSBvbi4gSW4gdHVybiBpdCB3aWxsIGJlY29tZSBwYXJ0IG9mIGEKK2JyYW5jaCB0aGF0IGlzIGJpZ2dlciB0aGFuIGEgcGFnZSBhbmQgd2lsbCBiZSBsYWlkIHBhY2thZ2VkIHRvZ2V0aGVyCit3aXRoIGl0cyByZWxhdGVkIG5vZGVzLCByZXN1bHRpbmcgaW4gYSBwaWN0dXJlIHNpbWlsYXIgdG8gdGhlIGFib3ZlLgorCitJbiBmYWN0IHRoZSBib3R0b20tdXAgcHJvY2VzcyBoYXMgYSBsaXR0bGUgcGVyZm9ybWFuY2UgYmVuZWZpdCBvdmVyIHRoZQordG9wLWRvd246IHdpdGggdGhlIHRvcC1kb3duIGNvbnN0cnVjdGlvbiB0aGUgcm9vdCBwYWdlIGlzIGZ1bGwgYW5kIGxlYWYKK3BhZ2VzIHRha2UgY29tYmluYXRpb25zIG9mIHVucmVsYXRlZCBzbWFsbGVyIGJyYW5jaGVzOyB3aXRoIHRoZQorYm90dG9tLXVwIHRoZSBsZWFmIHBhZ2VzIHRha2UgYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSBhYm91dCBhCiticmFuY2gsIHdoaWxlIHRoZSByb290IG9mdGVuIHJlbWFpbnMgdW5maWxsZWQuIEZvciB0aGUgYmVzdCBwb3NzaWJsZQorb3V0LW9mLWNhY2hlIGVmZmljaWVuY3kgd2Ugd291bGQgcHJlZmVyIHRoZSBzZXQgb2Ygbm9uLWxlYWYgcGFnZXMgdG8gYmUKK2FzIHNtYWxsIGFzIHBvc3NpYmxlLiBIYXZpbmcgbGFyZ2VyIGxlYWYgcGFnZSBicmFuY2hlcyBtZWFucyBtb3JlIG9mIHRoZQordHJpZSBkYXRhIGlzIGluIHRoZSBsZWFmIGJyYW5jaGVzIGFuZCB0aHVzIHRoZSBzaXplIG9mIHRoYXQgaW50ZXJtZWRpYXRlCitub2RlIHNldCBpcyBzbWFsbGVyLgorCitTZWUgW2BJbmNyZW1lbnRhbFRyaWVXcml0ZXJQYWdlQXdhcmVgXSguLi8uLi8uLi90cmllcy9JbmNyZW1lbnRhbERlZXBUcmllV3JpdGVyUGFnZUF3YXJlLmphdmEpIAorZm9yIGRldGFpbHMgb24gaG93IHRoZSBwYWdlLWF3YXJlCit0cmllIGNvbnN0cnVjdGlvbiBpcyBpbXBsZW1lbnRlZC4KKworIyMgU3RvcmluZyB0aGUgdHJpZQorCitBbm90aGVyIGludGVyZXN0aW5nIHF1ZXN0aW9uIGFib3V0IHRoZSBmb3JtYXQgb2YgdGhlIHRyaWUgaXMgaG93IG9uZQorc3RvcmVzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNpdGlvbnMgaW4gYSBub2RlLiBJZiB3ZSB3YW50IHRvCittYWludGFpbiB0aGF0IHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YKK292ZXJhbGwgdHJhbnNpdGlvbnMsIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBzdG9yZSBub2RlIHRyYW5zaXRpb25zCitzcGFyc2VseS4gVHlwaWNhbGx5IHRoaXMgaXMgZG9uZSB1c2luZyBhIGxpc3Qgb2YgdHJhbnNpdGlvbiBjaGFyYWN0ZXJzCithbmQgYmluYXJ5IHNlYXJjaGluZyBhbW9uZyB0aGVtIHRvIG1ha2UgYSB0cmFuc2l0aW9uLgorCitUaGlzIGJpbmFyeSBzZWFyY2ggY2FuIHRoZW9yZXRpY2FsbHkgYmUgdGFrZW4gdG8gdXNlIGNvbnN0YW50IHRpbWUKKyhzaW5jZSB0aGUgYWxwaGFiZXQgc2l6ZSBpcyBzbWFsbCBhbmQgcHJlZGVmaW5lZCksIGJ1dCBpc24ndCB0aGUgbW9zdAorZWZmaWNpZW50IG9wZXJhdGlvbiBpbiBwcmFjdGljZSBkdWUgdG8gdGhlIHVucHJlZGljdGFibGUgYnJhbmNoCitpbnN0cnVjdGlvbnMgbmVjZXNzYXJ5IGZvciBpdHMgaW1wbGVtZW50YXRpb24uIEl0IGlzIHByZWZlcmFibGUgdG8gYXZvaWQKK2l0IGFzIG11Y2ggYXMgcG9zc2libGUuCisKK1RvIGRvIHRoaXMsIGFuZCB0byBzaGF2ZSBhIGZldyBhZGRpdGlvbmFsIGJ5dGVzIGluIGNvbW1vbiBjYXNlcywgb3VyCitpbXBsZW1lbnRhdGlvbiBvZiBvbi1kaXNrIHRyaWVzIHVzZXMgdHlwZWQgbm9kZXMuIEEgbm9kZSBjYW4gYmU6CisKKy0gICBGaW5hbCB3aXRoIG5vIHRyYW5zaXRpb25zIChgUEFZTE9BRF9PTkxZYCkuCisKKy0gICBIYXZpbmcgb25lIHRyYW5zaXRpb24gKGBTSU5HTEVgKSwgd2hpY2ggaGFzIHRvIHN0b3JlIG9ubHkgdGhlCisgICAgY2hhcmFjdGVyIGFuZCB0YXJnZXQgZm9yIHRoYXQgdHJhbnNpdGlvbi4KKworLSAgIEhhdmluZyBhIGJpbmFyeS1zZWFyY2hlZCBsaXN0IG9mIHRyYW5zaXRpb25zIChgU1BBUlNFYCksIHdoZXJlIHRoZQorICAgIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBlYWNoIGNoYXJhY3RlciBhbmQgdGhlIHRhcmdldHMgYXJlIHN0b3JlZC4KKworLSAgIEhhdmluZyBhIGNvbnNlY3V0aXZlIHJhbmdlIG9mIHRyYW5zaXRpb25zIChgREVOU0VgKSwgd2hlcmUgdGhlIGZpcnN0CisgICAgYW5kIGxhc3QgY2hhcmFjdGVyIGFuZCB0YXJnZXRzIGFyZSBzdG9yZWQsIHBvc3NpYmx5IGluY2x1ZGluZyBzb21lCisgICAgbnVsbCB0cmFuc2l0aW9ucy4KKworV2UgdXNlIG9uZSBieXRlIHBlciBub2RlIHRvIHN0b3JlIGZvdXIgYml0cyBvZiBub2RlIHR5cGUgYXMgd2VsbCBhcyBmb3VyCitiaXRzIG9mIHBheWxvYWQgaW5mb3JtYXRpb24uCisKK0luIGEgd2VsbC1iYWxhbmNlZCBhbmQgcG9wdWxhdGVkIHRyaWUgdGhlIG5vZGVzIHdoZXJlIGxvb2t1cCBzcGVuZHMgbW9zdAordGltZSAodGhlIG5vZGVzIGNsb3Nlc3QgdG8gdGhlIHJvb3QpIGFyZSBgREVOU0VgIG5vZGVzLCB3aGVyZSBmaW5kaW5nIHRoZQordGFyZ2V0IGZvciB0aGUgdHJhbnNpdGlvbiBpcyBhIGRpcmVjdCBjYWxjdWxhdGlvbiBmcm9tIHRoZSBjb2RlIG9mIHRoZQorY2hhcmFjdGVyLiBPbiB0aGUgb3RoZXIgaGFuZCwgbW9zdCBvZiB0aGUgbm9kZXMgKHRoZSBvbmVzIGNsb3Nlc3QgdG8gdGhlCitsZWF2ZXMpIGFyZSBgUEFZTE9BRF9PTkxZYCwgYFNJTkdMRWAgb3IgYFNQQVJTRWAgdG8gYXZvaWQgdGFraW5nIGFueSBtb3JlCitzcGFjZSB0aGFuIG5lY2Vzc2FyeS4KKworVGhlIG1haW4gb2JqZWN0aXZlIGZvciB0aGUgdHJpZSBzdG9yYWdlIGZvcm1hdCBpcyB0byBhY2hpZXZlIHRoZQorc21hbGxlc3QgcG9zc2libGUgcGFja2luZyAoYW5kIHRodXMgc21hbGxlc3QgY2FjaGUgdXNhZ2UgYW5kIGZld2VzdCBkaXNrCityZWFkcyksIHRodXMgd2UgY2hvb3NlIHRoZSB0eXBlIHRoYXQgcmVzdWx0cyBpbiB0aGUgc21hbGxlc3QKK3JlcHJlc2VudGF0aW9uIG9mIHRoZSBub2RlLiBgREVOU0VgIHR5cGUgZ2V0cyBjaG9zZW4gbmF0dXJhbGx5IHdoZW4gaXRzCitlbmNvZGluZyAod2hpY2ggYXZvaWRzIHN0b3JpbmcgdGhlIGNoYXJhY3RlciBsaXN0IGJ1dCBtYXkgaW5jbHVkZSBudWxsCit0YXJnZXRzKSBpcyBzbWFsbGVyIHRoYW4gYFNQQVJTRWAuCisKKyMjIFBvaW50ZXIgU2l6ZXMKKworVGhlIG5leHQgb3B0aW1pemF0aW9uIHdlIG1ha2UgaW4gdGhlIHN0b3JhZ2UgZm9ybWF0IGlzIGJhc2VkIG9uIHRoZSBmYWN0Cit0aGF0IG1vc3Qgbm9kZXMgaW4gdGhlIHRyaWUgYXJlIGluIHRoZSBsb3dlciBsZXZlbHMgb2YgdGhlIHRyZWUgYW5kIHRodXMKK2Nsb3NlIHRvIGxlYXZlcy4gQXMgc3VjaCwgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIG5vZGUgYW5kIGl0cyB0YXJnZXQKK3RyYW5zaXRpb25zIHdoZW4gbGFpZCBvdXQgZHVyaW5nIHRoZSBjb25zdHJ1Y3Rpb24gcHJvY2VzcyBpcyBzbWFsbCBhbmQKK3RodXMgaXQgaXMgYSBodWdlIHdpbiB0byBzdG9yZSBwb2ludGVycyBhcyBkaXN0YW5jZXMgd2l0aCB2YXJpYWJsZSBzaXplLgorCitUaGlzIGlzIGV2ZW4gbW9yZSB0cnVlIGZvciB0aGUgcGFnZS1hd2FyZSBsYXlvdXQgd2UgdXNlICZtZGFzaDsgYWxsIGludGVybmFsCit0cmFuc2l0aW9ucyB3aXRoaW4gdGhlIHBhZ2UgKGkuZS4gPjk5JSBvZiBhbGwgdHJhbnNpdGlvbnMgaW4gdGhlIHRyaWUhKQorY2FuIGJlIHN0b3JlZCB1c2luZyBqdXN0IGFuIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2UsIHVzaW5nIGp1c3QgMTIgYml0cy4KKworVGhpcyBpcyBoZWF2aWx5IHVzZWQgdmlhIGZ1cnRoZXIgc3BlY2lhbGl6YXRpb24gb2YgdGhlIG5vZGUgdHlwZXM6IGUuZy4KK3dlIGhhdmUgYERFTlNFXzEyYCwgYERFTlNFXzE2YCB0byBgREVOU0VfNDBgIGFzIHdlbGwgYXMgYERFTlNFX0xPTkdgCitzdWJ0eXBlcyB3aGljaCBkaWZmZXIgaW4gdGhlIHNpemUgb2YgcG9pbnRlciB0aGV5IHVzZS4KKworIyBQcmltYXJ5IGluZGV4aW5nIGluIHRoZSBCVEkgZm9ybWF0CisKK1RoZSBwdXJwb3NlIG9mIHRoZSBwcmltYXJ5IGluZGV4IG9mIGFuIHNzdGFibGUgaXMgdG8gYmUgYWJsZSB0byBtYXAgYQora2V5IGNvbnRhaW5pbmcgcGFydGl0aW9uIGFuZCBjbHVzdGVyaW5nIGNvbXBvbmVudHMgdG8gYSBwb3NpdGlvbiBpbiB0aGUKK3NzdGFibGUgZGF0YSBmaWxlIHdoaWNoIGhvbGRzIHRoZSByZWxldmFudCByb3cgb3IgdGhlIGNsb3Nlc3Qgcm93IHdpdGggYQorZ3JlYXRlciBrZXkgYW5kIGVuYWJsZXMgaXRlcmF0aW9uIG9mIHJvd3MgZnJvbSB0aGF0IHBvaW50IG9uLgorCitQYXJ0aXRpb24ga2V5cyBhcmUgbm9ybWFsbHkgZnVsbHkgc3BlY2lmaWVkLCB3aGlsZSBjbHVzdGVyaW5nIGtleXMgYXJlCitvZnRlbiBnaXZlbiBwYXJ0aWFsbHkgb3IgdmlhIGEgY29tcGFyaXNvbiByZWxhdGlvbi4gVGhleSBhcmUgYWxzbwordHJlYXRlZCBkaWZmZXJlbnRseSBieSBhbGwgdGhlIGluZnJhc3RydWN0dXJlIGFuZCBoYXZlIGhpc3RvcmljYWxseSBoYWQKK2RpZmZlcmVudCBpbmRleCBzdHJ1Y3R1cmVzOyB3ZSBjaG9zZSB0byByZXRhaW4gdGhpcyBkaXN0aW5jdGlvbiBmb3IgdGhlCit0aW1lIGJlaW5nIGFuZCBpbXBsZW1lbnQgc2ltaWxhciByZXBsYWNlbWVudCBzdHJ1Y3R1cmVzIHVzaW5nIHRyaWVzLgorCisjIyBQYXJ0aXRpb24gaW5kZXggaW1wbGVtZW50YXRpb24gZGV0YWlscworCitUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoZSBwYXJ0aXRpb24gaW5kZXggaXMgdG8gbWFwIGEgc3BlY2lmaWVkCitwYXJ0aXRpb24ga2V5IHRvIGEgcm93IGluZGV4IGZvciB0aGUgcGFydGl0aW9uLiBJdCBhbHNvIG5lZWRzIHRvIHN1cHBvcnQKK2l0ZXJhdGlvbiBmcm9tIGEgKHBvc3NpYmx5IHBhcnRpYWxseSBzcGVjaWZpZWQpIHBhcnRpdGlvbiBwb3NpdGlvbi4gVGhlCitkZXNjcmlwdGlvbiBiZWxvdyBkZXRhaWxzIG1hcHBpbmcgb25seTsgaXRlcmF0aW9uIGlzIGEgdHJpdmlhbAorYXBwbGljYXRpb24gb2YgdGhlIHRyaWUgbWFjaGluZXJ5IHRvIHRoZSBkZXNjcmliZWQgc3RydWN0dXJlLgorCitJbiBhZGRpdGlvbiB0byB3aWRlIHBhcnRpdGlvbnMgd2hlcmUgYSByb3cgaW5kZXggaXMgbWFuZGF0b3J5LCBDYXNzYW5kcmEKK2lzIG9mdGVuIHVzZWQgZm9yIHRhYmxlcyB3aGVyZSB0aGUgcGFydGl0aW9ucyBoYXZlIG9ubHkgYQorY291cGxlIG9mIHJvd3MsIGluY2x1ZGluZyBhbHNvIG9uZXMgd2hlcmUgdGhlIHBhcnRpdGlvbiBrZXkgaXMgdGhlIG9ubHkKK2NvbXBvbmVudCBvZiB0aGUgcHJpbWFyeSBrZXksIGkuZS4gd2hlcmUgcm93IGFuZCBwYXJ0aXRpb24gYXJlIHRoZSBzYW1lCit0aGluZy4gRm9yIHRoZXNlIHNpdHVhdGlvbnMgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gYWN0dWFsbHkgaGF2ZSBhIHJvdworaW5kZXggYW5kIHRoZSBwYXJ0aXRpb24gaW5kZXggc2hvdWxkIHBvaW50IGRpcmVjdGx5IHRvIHRoZSBkYXRhLgorCitUaGUgYXBwbGljYXRpb24gb2YgdHJpZXMgdG8gQ2Fzc2FuZHJhJ3MgcGFydGl0aW9uIGluZGV4IHVzZXMgdGhlIHRyaWUKK2luZnJhc3RydWN0dXJlIGRlc2NyaWJlZCBhYm92ZSB0byBjcmVhdGUgYSB0cmllIG1hcHBpbmcgdW5pcXVlCitieXRlLW9yZGVyZWQgcGFydGl0aW9uIGtleSBwcmVmaXhlcyB0byBlaXRoZXI6CisKKy0gICBBIHBvc2l0aW9uIGluIHRoZSByb3cgaW5kZXggZmlsZSB3aGljaCBjb250YWlucyB0aGUgaW5kZXggb2YgdGhlCisgICAgcm93cyB3aXRoaW4gdGhhdCBwYXJ0aXRpb24sIG9yCisKKy0gICBBIHBvc2l0aW9uIGluIHRoZSBkYXRhIGZpbGUgY29udGFpbmluZyB0aGUgcmVsZXZhbnQgcGFydGl0aW9uIChpZiBhCisgICAgcm93IGluZGV4IGZvciBpdCBpcyBub3QgbmVjZXNzYXJ5KS4KKworQSBzaW5nbGUgdGFibGUgY2FuIGhhdmUgYm90aCBpbmRleGVkIGFuZCBub24taW5kZXhlZCByb3dzLiBGb3IKK2VmZmljaWVuY3kgdGhlIHBhcnRpdGlvbiBpbmRleCBzdG9yZXMgdGhlIHBvc2l0aW9uIGFzIGEgc2luZ2xlIGxvbmcsCit1c2luZyBpdHMgc2lnbiBiaXQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSB0d28gb3B0aW9uc1teM10uIFRoaXMKK3ZhbHVlIGlzIHN0b3JlZCB3aXRoIHZhcmlhYmxlIGxlbmd0aCAmbWRhc2g7IG1vcmUgcHJlY2lzZWx5LCB3ZSB1c2UgdGhlIGZvdXIKK2JpdHMgcHJvdmlkZWQgaW4gdGhlIG5vZGUgdHlwZSBieXRlIHRvIHN0b3JlIHRoZSBsZW5ndGggb2YgdGhlIHBvaW50ZXIuCisKK1teM106IEl0IG5lZWRzIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiAwIHdpdGggaW5kZXggYW5kIDAgd2l0aG91dAoraW5kZXgsIGhvd2V2ZXIsIHNvIHdlIHVzZSB+cG9zIGluc3RlYWQgb2YgLXBvcyB0byBlbmNvZGUKK2RpcmVjdC10by1kYXRhIG1hcHBpbmdzLiBUaGlzIHN0aWxsIGFsbG93cyBzaWduIGV4cGFuc2lvbgoraW5zdHJ1Y3Rpb25zIHRvIGJlIHVzZWQgdG8gY29udmVydCBlLmcuIGBpbnRgIHRvIGBsb25nYC4KKworTG9va3VwIGluIHRoaXMgaW5kZXggaXMgYWNjb21wbGlzaGVkIGJ5IGNvbnZlcnRpbmcgdGhlIGRlY29yYXRlZAorcGFydGl0aW9uIGtleSB0byBpdHMgYnl0ZS1vcmRlcmVkIHJlcHJlc2VudGF0aW9uIGFuZCBmb2xsb3dpbmcgdGhlCit0cmFuc2l0aW9ucyBmb3IgaXRzIGJ5dGVzIHdoaWxlIHRoZSB0cmllIGhhcyBhbnkuIElmIGF0IGFueSBwb2ludCB0aGUKK3RyaWUgZG9lcyBub3Qgb2ZmZXIgYSB0cmFuc2l0aW9uIGZvciB0aGUgbmV4dCBieXRlIGJ1dCBpcyBub3QgYSBsZWFmCitub2RlLCB0aGUgc3N0YWJsZSBkb2VzIG5vdCBjb250YWluIGEgbWFwcGluZyBmb3IgdGhlIGdpdmVuIGtleS4KKworSWYgYSBsZWFmIG9mIHRoZSB0cmllIGlzIHJlYWNoZWQsIHRoZW4gdGhlIHByZWZpeCBvZiB0aGUgcGFydGl0aW9uIGtleQorbWF0Y2hlcyBzb21lIGNvbnRlbnQgaW4gdGhlIGZpbGUsIGJ1dCB3ZSBhcmUgbm90IHlldCBzdXJlIGlmIGl0IGlzIGEKK2Z1bGwgbWF0Y2ggZm9yIHRoZSBwYXJ0aXRpb24ga2V5LiBUaGUgbGVhZiBub2RlIHBvaW50cyB0byBhIHBsYWNlIGluIHRoZQorcm93IGluZGV4IG9yIGRhdGEgZmlsZS4gSW4gZWl0aGVyIGNhc2UgdGhlIGZpcnN0IGJ5dGVzIGF0IHRoZSBzcGVjaWZpZWQKK3Bvc2l0aW9uIGNvbnRhaW4gYSBzZXJpYWxpemF0aW9uIG9mIHRoZSBwYXJ0aXRpb24ga2V5LCB3aGljaCB3ZSBjYW4KK2NvbXBhcmUgdG8gdGhlIGtleSBiZWluZyBtYXBwZWQuIElmIGl0IG1hdGNoZXMsIHdlIGhhdmUgZm91bmQgdGhlCitwYXJ0aXRpb24uIElmIG5vdCwgc2luY2UgdGhlIHN0b3JlZCBwcmVmaXhlcyBhcmUgdW5pcXVlLCBubyBkYXRhIGZvcgordGhpcyBwYXJ0aXRpb24gZXhpc3RzIGluIHRoaXMgc3N0YWJsZS4KKworIyMjIEVmZmljaWVuY3kKKworSWYgZXZlcnl0aGluZyBpcyBpbiBjYWNoZSB0aGlzIGxvb2t1cCBpcyBleHRyZW1lbHkgZWZmaWNpZW50OiBpdCBmb2xsb3dzCithIGZldyB0cmFuc2l0aW9ucyBpbiBgREVOU0VgIG5vZGVzIHBsdXMgb25lIG9yIHR3byBiaW5hcnkgc2VhcmNoZXMgaW4KK2BTUEFSU0VgIG9yIGBTSU5HTEVgLCBhbmQgZmluaXNoZXMgd2l0aCBhIGRpcmVjdCBjb21wYXJpc29uIG9mIGEgYnl0ZSBidWZmZXIKK3dpdGggY29udGVudHMgb2YgYSBmaWxlLiBObyBvYmplY3QgYWxsb2NhdGlvbiBvciBkZXNlcmlhbGl6YXRpb24gaXMKK25lY2Vzc2FyeS4KKworSWYgbm90IGFsbCBkYXRhIGlzIGluIGNhY2hlLCB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhpcyBsb29rdXAgbW9zdCBoZWF2aWx5CitkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgcGFnZXMgdGhhdCBtdXN0IGJlIGZldGNoZWQgZnJvbSBwZXJzaXN0ZW50CitzdG9yYWdlLiBUaGUgZXhwZWN0YXRpb24gb24gd2hpY2ggdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCwgaXMgdGhhdAoraWYgYW4gc3N0YWJsZSBpcyBpbiB1c2UgYWxsIG5vbi1sZWFmIHBhZ2VzIG9mIHRoZSBpbmRleCB3aWxsIHRlbmQgdG8KK3JlbWFpbiBjYWNoZWQuIElmIHRoYXQgZXhwZWN0YXRpb24gaXMgbWV0LCBsb29rdXAgd2lsbCBvbmx5IHJlcXVpcmUKK2ZldGNoaW5nIG9uZSBsZWFmIGluZGV4IHBhZ2UgYW5kIG9uZSBkYXRhL3JvdyBpbmRleCBwYWdlIGZvciB0aGUgZnVsbAora2V5IGNvbXBhcmlzb24uIE9uIGEgbWF0Y2ggdGhlIGxhdHRlciBmZXRjaCB3aWxsIGJlIHJlcXVpcmVkIGFueXdheSwKK3NpbmNlIHdlIHdvdWxkIHdhbnQgdG8gcmVhZCB0aGUgZGF0YSBhdCB0aGF0IHBvc2l0aW9uLgorCitBbiBpbXBvcnRhbnQgY29uc2lkZXJhdGlvbiBpbiB0aGUgZGVzaWduIG9mIHRoaXMgZmVhdHVyZSB3YXMgdG8gbWFrZQorc3VyZSB0aGVyZSBpcyBubyBzaXR1YXRpb24gaW4gd2hpY2ggdGhlIHRyaWUgaW5kaWNlcyBwZXJmb3JtIHdvcnNlIHRoYW4KK3RoZSBlYXJsaWVyIGNvZGUsIHRodXMgd2Ugc2hvdWxkIGFpbSB0byBkbyBhdCBtb3N0IGFzIG1hbnkgcmVhZHMuIFRoZQorbnVtYmVyIG9mIHJhbmRvbSBhY2Nlc3NlcyBmb3IgdGhlIGVhcmxpZXIgaW5kZXggaW1wbGVtZW50YXRpb24gd2hlcmUgYW4KK2luZGV4IHN1bW1hcnkgaXMgZm9yY2VkIGluIG1lbW9yeSBpcyBvbmUgX3NlZWtfIHJlcXVpcmVkIHRvIHN0YXJ0CityZWFkaW5nIGZyb20gdGhlIHBhcnRpdGlvbiBpbmRleCAodGhvdWdoIHVzdWFsbHkgbXVsdGlwbGUgY29uc2VjdXRpdmUKK3BhZ2VzIG5lZWQgdG8gYmUgcmVhZCksIGFuZCBvbmUgc2VlayBuZWVkZWQgdG8gc3RhcnQgcmVhZGluZyB0aGUgYWN0dWFsCitkYXRhLiBTaW5jZSB0aGUgaW5kZXggc3VtbWFyeSBlbmRzIHVwIGJlaW5nIG9mIHNpbWlsYXIgc2l6ZSB0byB0aGUKK25vbi1sZWFmIHBhZ2VzIG9mIHRoZSB0cmllIGluZGV4LCB0aGUgbWVtb3J5IHVzYWdlIGFuZCBudW1iZXIgb2Ygc2Vla3MKK2ZvciB0aGUgdHJpZSBpbmRleCBvbiBtYXRjaCBlbmRzIHVwIGJlaW5nIHRoZSBzYW1lIGJ1dCB3ZSByZWFkIGxlc3MgZGF0YQorYW5kIGRvIG11Y2ggbGVzcyBwcm9jZXNzaW5nLgorCitPbiBtaXNtYXRjaCwgdGhvdWdoLCB3ZSBtYXkgYmUgbWFraW5nIG9uZSBhZGRpdGlvbmFsIHNlZWsuIEhvd2V2ZXIsIHdlCitjYW4gZHJhc3RpY2FsbHkgcmVkdWNlIHRoZSBjaGFuY2Ugb2YgbWlzbWF0Y2gsIHdoaWNoIHdlIGN1cnJlbnRseSBkbyBpbgordHdvIHdheXM6CisKKy0gICBCeSB1c2luZyBhIGJsb29tIGZpbHRlciBiZWZvcmUgbG9va3VwLiBUaGUgY2hhbmNlIG9mIGdldHRpbmcgYSBibG9vbQorICAgIGZpbHRlciBoaXQgYXMgd2VsbCBhcyBhIHByZWZpeCBtYXRjaCBmb3IgdGhlIHdyb25nIGtleSBpcyBwcmV0dHkKKyAgICBsb3cgYW5kIGdldHMgbG93ZXIgd2l0aCBpbmNyZWFzaW5nIHNzdGFibGUgc2l6ZS4KKworLSAgIEJ5IHN0b3Jpbmcgc29tZSBvZiB0aGUga2V5IGhhc2ggYml0cyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgdG9rZW4KKyAgICBhdCB0aGUgcGF5bG9hZCBub2RlIGFuZCBjb21wYXJpbmcgdGhlbSB3aXRoIHRoZSBtYXBwZWQga2V5J3MgaGFzaAorICAgIGJpdHMuCisKK0N1cnJlbnRseSB3ZSB1c2UgYSBjb21iaW5hdGlvbiBvZiBib3RoIGJ5IGRlZmF1bHQgYXMgdGhlIGJlc3QgcGVyZm9ybWluZworb3B0aW9uLiBUaGUgdXNlciBjYW4gZGlzYWJsZSBvciBjaG9vc2UgdG8gaGF2ZSBhIHNtYWxsZXIgYmxvb20gZmlsdGVyLAorYW5kIHRoZSBjb2RlIGFsc28gc3VwcG9ydHMgaW5kaWNlcyB0aGF0IGRvIG5vdCBjb250YWluIGhhc2ggYml0cyAodGhvdWdoCit0byByZWR1Y2UgY29uZmlndXJhdGlvbiBjb21wbGV4aXR5IHdlIGRvIG5vdCBoYXZlIHBsYW5zIHRvIGV4cG9zZSB0aGF0CitvcHRpb24pLgorCitGb3IgZnVsbHkgY29sZCBzc3RhYmxlcyB3ZSBoYXZlIHRvIHBlcmZvcm0gbW9yZSByYW5kb20gZmV0Y2hlcyBmcm9tIGRpc2sKK3RoYW4gdGhlIGVhcmxpZXIgaW1wbGVtZW50YXRpb24sIGJ1dCB3ZSByZWFkIGxlc3MuIFRlc3Rpbmcgc2hvd2VkIHRoYXQKK2hhdmluZyBhIGJsb29tIGZpbHRlciBpcyBlbm91Z2ggdG8gbWFrZSB0aGUgdHJpZSBpbmRleCBmYXN0ZXI7IGlmIGEKK2Jsb29tIGZpbHRlciBpcyBub3QgcHJlc2VudCwgd2UgdHJ5IGdvaW5nIHRocm91Z2ggdGhlIGJ5dGUgY29udGVudHMgb2YKK3RoZSBpbmRleCBmaWxlIG9uIGJvb3QgdG8gcHJlZmV0Y2ggaXQgd2hpY2ggZW5kcyB1cCB0YWtpbmcgbm90IHRvbyBsb25nCisoc2luY2UgaXQgaXMgcmVhZCBzZXF1ZW50aWFsbHkgcmF0aGVyIHRoYW4gcmFuZG9tbHkpIGFuZCBib29zdGluZyBjb2xkCitwZXJmb3JtYW5jZSBkcmFtYXRpY2FsbHkuCisKKyMjIyBCdWlsZGluZyBhbmQgZWFybHkgb3BlbgorCitUaGUgcGFydGl0aW9uIGluZGV4IGlzIGJ1aWx0IHVzaW5nIHRoZSBwYWdlLWF3YXJlIGluY3JlbWVudGFsCitjb25zdHJ1Y3Rpb24gZGVzY3JpYmVkIGVhcmxpZXIsIHdoZXJlIHdlIGFsc28gZGVsYXkgd3JpdGluZyBlYWNoIGtleQordW50aWwgd2UgaGF2ZSBzZWVuIHRoZSBuZXh0IHNvIHRoYXQgd2UgY2FuIGZpbmQgdGhlIHNob3J0ZXN0IHByZWZpeCB0aGF0CitpcyBlbm91Z2ggdG8gZGlmZmVyZW50aWF0ZSBpdCBmcm9tIHRoZSBwcmV2aW91cyBhbmQgbmV4dCBrZXlzICh0aGlzIGFsc28KK2RpZmZlcmVudGlhdGVzIGl0IGZyb20gYWxsIG90aGVycyBpbiB0aGUgc3N0YWJsZSBiZWNhdXNlIHRoZSBjb250ZW50cworYXJlIHNvcnRlZCkuIE9ubHkgdGhhdCBwcmVmaXggaXMgd3JpdHRlbiB0byB0aGUgdHJpZS4KKworT25lIGxhc3QgY29tcGxpY2F0aW9uIGlzIHRoZSBzdXBwb3J0IGZvciBlYXJseSBvcGVuaW5nIG9mIHNzdGFibGVzIHdoaWNoCithbGxvd3MgbmV3bHktY29tcGFjdGVkIHRhYmxlcyB0byBncmFkdWFsbHkgb2NjdXB5IHRoZSBwYWdlIGNhY2hlLiBUaG91Z2gKK3RoZSBpbmRleCBidWlsZGluZyBpcyBpbmNyZW1lbnRhbCwgdGhlIHBhcnRpYWxseS13cml0dGVuIHRyaWUgaXMgbm90Cit1c2FibGUgZGlyZWN0bHkgYmVjYXVzZSB0aGUgcm9vdCBvZiB0aGUgdHJpZSBhcyB3ZWxsIGFzIHRoZSBwYXRoIGZyb20gaXQKK3RvIHRoZSBsYXN0IHdyaXR0ZW4gbm9kZXMgaXMgbm90IHlldCBwcmVzZW50IGluIHRoZSBmaWxlLgorCitUaGlzIHByb2JsZW0gY2FuIGJlIGVhc2lseSBvdmVyY29tZSwgdGhvdWdoLCBieSBkdW1waW5nIHRoZXNlCitpbnRlcm1lZGlhdGUgbm9kZXMgdG8gYW4gaW4tbWVtb3J5IGJ1ZmZlciAod2l0aG91dCB0aGUgbmVlZCBmb3IKK3BhZ2UtYXdhcmUgcGFja2luZykgYW5kIGZvcm1pbmcgYW4gaW5kZXggYnkgYXR0YWNoaW5nIHRoaXMgYnVmZmVyIGF0IHRoZQorZW5kIG9mIHRoZSBwYXJ0aWFsbHkgd3JpdHRlbiBmaWxlIHVzaW5nIAorW2BUYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXJgXSguLi8uLi8uLi91dGlsL1RhaWxPdmVycmlkaW5nUmVidWZmZXJlci5qYXZhKS4KKworIyMgUm93IGluZGV4IGltcGxlbWVudGF0aW9uIGRldGFpbHMKKworVW5saWtlIHRoZSBwYXJ0aXRpb24gaW5kZXgsIHRoZSBtYWluIHVzZSBvZiB0aGUgcm93IGluZGV4IGlzIHRvIGl0ZXJhdGUKK2Zyb20gYSBnaXZlbiBjbHVzdGVyaW5nIGtleSBpbiBmb3J3YXJkIG9yIHJldmVyc2UgZGlyZWN0aW9uICh3aGVyZSBleGFjdAora2V5IGxvb2t1cCBpcyBqdXN0IGEgc3BlY2lhbCBjYXNlKS4KKworUm93cyBhcmUgb2Z0ZW4gdmVyeSBzbWFsbCAodGhleSBjb3VsZCBjb250YWluIGEgc2luZ2xlIGludCBvciBubyBjb2x1bW5zCithdCBhbGwpIGFuZCB0aHVzIHRoZXJlIGlzIGEgcmVhbCBwb3NzaWJpbGl0eSBmb3IgdGhlIHJvdyBpbmRpY2VzIHRvCitiZWNvbWUgYmlnZ2VyIHRoYW4gdGhlIGRhdGEgdGhleSByZXByZXNlbnQuIFRoaXMgaXMgbm90IGEgZGVzaXJhYmxlCitvdXRjb21lLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSByZWFzb24gd2h5IENhc3NhbmRyYSdzIHJvdyBpbmRleCBoYXMKK2hpc3RvcmljYWxseSBvcGVyYXRlZCBvbiBibG9ja3Mgb2Ygcm93cyByYXRoZXIgdGhhbiBpbmRleGluZyBldmVyeSByb3cKK2luIHRoZSBwYXJ0aXRpb24uIFRoaXMgaXMgYSBjb25jZXJuIHdlIGFsc28gaGF2ZSB3aXRoIHRoZSB0cmllLWJhc2VkCitpbmRleCwgdGh1cyB3ZSBhbHNvIGluZGV4IGJsb2NrcyBvZiByb3dzIChieSBkZWZhdWx0LCBhIGJsb2NrIG9mIHJvd3MKK3RoYXQgaXMgYXQgbGVhc3QgMTZrYiBpbiBzaXplICZtZGFzaDsgdGhpcyB3aWxsIGJlIGNhbGxlZCB0aGUgaW5kZXgKK19ncmFudWxhcml0eV8gYmVsb3csIHNwZWNpZmllZCBieSB0aGUgYGNvbHVtbl9pbmRleF9zaXplYAorYGNhc3NhbmRyYS55YW1sYCBwYXJhbWV0ZXIpLgorCitPdXIgcm93IGluZGV4IGltcGxlbWVudGF0aW9uIHRodXMgY3JlYXRlcyBhIG1hcCBmcm9tIGNsdXN0ZXJpbmcga2V5cyBvcgorcHJlZml4ZXMgdG8gdGhlIGRhdGEgcG9zaXRpb24gYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbmRleCBibG9jayB3aGljaCBpcwordGhlIGVhcmxpZXN0IHRoYXQgY291bGQgY29udGFpbiBhIGtleSBlcXVhbCBvciBncmVhdGVyIHRoYW4gdGhlIGdpdmVuCitvbmUuIEFkZGl0aW9uYWxseSwgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRlbGV0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YKK3RoZSBibG9jaywgdGhlIGluZGV4IG11c3Qgc3BlY2lmeSBpdCBzbyB0aGF0IGl0IGNhbiBiZSB0YWtlbiBpbnRvCithY2NvdW50IHdoZW4gbWVyZ2luZyBkYXRhIGZyb20gbXVsdGlwbGUgc3N0YWJsZXMuCisKK0VhY2ggaW5kZXggYmxvY2sgd2lsbCBjb250YWluIGF0IGxlYXN0IG9uZSBrZXksIGJ1dCBnZW5lcmFsbHkgaXQgd2lsbAoraGF2ZSBkaWZmZXJlbnQgZmlyc3QgYW5kIGxhc3Qga2V5cy4gV2UgZG9uJ3Qgc3RvcmUgdGhlc2Uga2V5cywgYnV0CitpbnN0ZWFkIHdlIGluZGV4IHRoZSBwb3NpdGlvbnMgYmV0d2VlbiBibG9ja3MgYnkgc3RvcmluZyBhICJzZXBhcmF0b3IiLAorc29tZSBrZXkgdGhhdCBpcyBncmVhdGVyIHRoYW4gdGhlIGxhc3Qga2V5IG9mIHRoZSBwcmV2aW91cyBibG9jayBhbmQKK3NtYWxsZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZmlyc3Qga2V5IG9mIHRoZSBuZXh0W140XS4gVGhlbiwgd2hlbiB3ZQorbG9vayB1cCBhIGdpdmVuIGNsdXN0ZXJpbmcsIHdlIGZvbGxvdyBpdHMgYnl0ZXMgYXMgbG9uZyBhcyB3ZSBjYW4gaW4gdGhlCit0cmllIGFuZCB3ZSBjYW4gYmUgY2VydGFpbiB0aGF0IGFsbCBibG9ja3MgYmVmb3JlIHRoZSBjbG9zZXN0CitsZXNzLXRoYW4tb3ItZXF1YWwgZW50cnkgaW4gdGhlIHRyaWUgY2Fubm90IGNvbnRhaW4gYW55IGRhdGEgdGhhdCBpcworZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBrZXkuCisKK1teNF06IEFub3RoZXIgd2F5IHRvIGludGVycHJldCB0aGlzIGlzIHRoYXQgd2UgaW5kZXggdGhlIHN0YXJ0IG9mIGVhY2gKK2Jsb2NrIG9ubHksIGJ1dCBmb3IgZWZmaWNpZW5jeSB3ZSBkb24ndCB1c2UgdGhlIGZpcnN0IGtleSBvZiB0aGUKK2Jsb2NrIGFzIGl0cyBiZWdpbm5pbmcsIGJ1dCBpbnN0ZWFkIHNvbWV0aGluZyBjbG9zZXIgdG8gdGhlIGxhc3Qga2V5CitvZiB0aGUgcHJldmlvdXMgYmxvY2sgKGJ1dCBzdGlsbCBncmVhdGVyIHRoYW4gaXQpLgorCitJdCBtYXkgaGFwcGVuIHRoYXQgdGhlIGlkZW50aWZpZWQgYmxvY2sgYWN0dWFsbHkgZG9lc24ndCBjb250YWluIGFueQorbWF0Y2hpbmcgZGF0YSAoZS5nLiBiZWNhdXNlIHRoZSBsb29rZWQtdXAga2V5IGVuZHMgdXAgYmV0d2VlbiB0aGUgbGFzdAora2V5IGluIHRoZSBibG9jayBhbmQgdGhlIHNlcGFyYXRvciksIGJ1dCB0aGlzIG9ubHkgYWZmZWN0cyBlZmZpY2llbmN5IGFzCit0aGUgaXRlcmF0aW9uIG1lY2hhbmlzbSBkb2VzIG5vdCBleHBlY3QgdGhlIGRhdGEgcG9zaXRpb24gcmV0dXJuZWQgYnkKK3RoZSBpbmRleCB0byBiZSBndWFyYW50ZWVkIHRvIHN0YXJ0IHdpdGggZWxlbWVudHMgdGhhdCBmaXQgdGhlIGNyaXRlcmlhOworaXQgd291bGQgb25seSBoYXZlIHRvIHdhbGsgYSB3aG9sZSBibG9jayBmb3J3YXJkIHRvIGZpbmQgdGhlIG1hdGNoaW5nCitrZXkuCisKK0l0IGlzIGltcG9ydGFudCB0byBrZWVwIHRoZSBudW1iZXIgb2YgdGhlc2UgZmFsc2UgcG9zaXRpdmVzIGxvdywgYW5kIGF0Cit0aGUgc2FtZSB0aW1lIHdlIGFpbSBmb3IgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIHNpemUgb2YgdGhlIGluZGV4IGZvciBhCitnaXZlbiBncmFudWxhcml0eS4gVGhlIGNob2ljZSBvZiBzZXBhcmF0b3IgYWZmZWN0cyB0aGlzIGJhbGFuY2VbXjVdOyB0aGUKK29wdGlvbiB3ZSB1c2UsIGFzIGEgZ29vZCB0cmFkZW9mZiBpbiB0aGUgdmVpbiBvZiB0aGUgdW5pcXVlIHByZWZpeAorYXBwcm9hY2ggdXNlZCBpbiB0aGUgcGFydGl0aW9uIGluZGV4LCBpcyB0byB1c2UgdGhlIHNob3J0ZXN0IHByZWZpeCBvZgordGhlIG5leHQgYmxvY2sncyBiZWdpbm5pbmcga2V5IHRoYXQgc2VwYXJhdGVzIGl0IGZyb20gdGhlIHByZXZpb3VzCitibG9jaydzIGVuZCBrZXksIGFkanVzdGVkIHNvIHRoYXQgdGhlIGxhc3QgYnl0ZSBvZiBpdCBpcyAxIGdyZWF0ZXIgdGhhbgordGhhdCBlbmQga2V5LgorCitbXjVdOiBGb3IgZXhhbXBsZSwgdGhlIGJlc3Qgc2VwYXJhdG9yIGZvciBmYWxzZSBwb3NpdGl2ZXMgaXMgdGhlIG5leHQKK3Bvc3NpYmxlIGJ5dGUgc2VxdWVuY2UgYWZ0ZXIgdGhlIHByZXZpb3VzIGJsb2NrJ3MgZmluYWwga2V5LCB3aGljaAoraXMgb2J0YWluZWQgYnkgYWRkaW5nIGEgMDAgYnl0ZSB0byBpdHMgZW5kLiBUaGlzLCBob3dldmVyLCBtZWFucyBhbGwKK3RoZSBieXRlcyBvZiB0aGUgYnl0ZS1vcmRlcmVkIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMga2V5IG11c3QgYmUKK3ByZXNlbnQgaW4gdGhlIGluZGV4LCB3aGljaCBpbmZsYXRlcyB0aGUgaW5kZXgncyBzaXplIGFuZCBsb29rdXAKK2NvbXBsZXhpdHkuCisKK0ZvciBleGFtcGxlLCBpZiBibG9jayAyIGNvdmVycyAic29tZXRoaW5nIiB0byAic29tZXdoZXJlIiBhbmQgYmxvY2sgMworJm1kYXNoOyAic29ycnkiIHRvICJ0ZWFzZSIsIHRoZW4gdGhlIHNlcXVlbmNlICJzb24iIGlzIHVzZWQgYXMgdGhlIHNlcGFyYXRvcgorYmV0d2VlbiBibG9ja3MgMiBhbmQgMy4gVGhpcyBsZWF2ZXMgdGhpbmdzIGxpa2UgInNvbW1lbGllciIgaW4gdGhlIGFyZWEKK3RoYXQgdHJpZ2dlcnMgZmFsc2UgcG9zaXRpdmVzLCBidXQgc3RvcmVzIGFuZCBoYXMgdG8gd2FsayBqdXN0IHRocmVlCitieXRlcyB0byBmaW5kIHRoZSBzdGFydGluZyBwb2ludCBmb3IgaXRlcmF0aW9uLgorCisjIyMgRWZmaWNpZW5jeQorCitGaW5kaW5nIHRoZSBjYW5kaWRhdGUgYmxvY2sgaW4gdGhlIHRyaWUgaW52b2x2ZXMgd2Fsa2luZyB0aGUgYnl0ZQorb3JkZXJlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2x1c3RlcmluZyBrZXkgaW4gdGhlIHRyaWUgYW5kIGZpbmRpbmcgdGhlCitjbG9zZXN0IGxlc3MtdGhhbi1vci1lcXVhbCB2YWx1ZS4gVGhlIG51bWJlciBvZiBzdGVwcyBpcyBwcm9wb3J0aW9uYWwgdG8KK3RoZSBsZW5ndGggb2YgdGhlIHNlcGFyYXRvcnMgJm1kYXNoOyB0aGUgbG93ZXIgdGhlaXIgbnVtYmVyIHRoZSBzaG9ydGVyIHRoYXQKK3NlcXVlbmNlIGlzLCB0aG91Z2ggd2UgY2FuJ3QgZXhwZWN0IF9PXyhsb2cgX25fKSBjb21wbGV4aXR5IHNpbmNlIHRoZXJlIG1heQorYmUgbWFueSBpdGVtcyBzaGFyaW5nIHRoZSBzYW1lIGxvbmcgcHJlZml4ZXMgKGUuZy4gaWYgdGhlcmUgYXJlIGxvbmcKK3N0cmluZ3MgaW4gdGhlIGNvbXBvbmVudHMgb2YgdGhlIGNsdXN0ZXJpbmcga2V5cyBiZWZvcmUgdGhlIGxhc3QpLiBFdmVuCitzbywgc3VjaCByZXBlYXRpbmcgcHJlZml4ZXMgYXJlIGFkZHJlc3NlZCB2ZXJ5IHdlbGwgYnkgdGhlIHBhZ2UtcGFja2luZworYW5kIGBTSU5HTEVfTk9QQVlMT0FEXzRgIG5vZGUgdHlwZSwgcmVzdWx0aW5nIGluIHZlcnkgZWZmaWNpZW50IHdhbGtzLgorCitBZnRlciB0aGlzIHN0ZXAgd2UgYWxzbyBwZXJmb3JtIGEgbGluZWFyIHdhbGsgd2l0aGluIHRoZSBkYXRhIGZpbGUgdG8KK2ZpbmQgdGhlIGFjdHVhbCBzdGFydCBvZiB0aGUgbWF0Y2hpbmcgZGF0YS4gVGhpcyBpcyB1c3VhbGx5IGNvc3RsaWVyIGFuZAorbWF5IGludm9sdmUgb2JqZWN0IGFsbG9jYXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbi4KKworVGhlIHRyYWRlb2ZmIGJldHdlZW4gdGhlIHNpemUgb2YgdGhlIGluZGV4IGFuZCB0aGUgdGltZSBpdCB0YWtlcyB0byBmaW5kCit0aGUgcmVsZXZhbnQgcm93cyBpcyBjb250cm9sbGVkIGJ5IHRoZSBpbmRleCBncmFudWxhcml0eS4gVGhlIGxvd2VyIGl0CitpcywgdGhlIG1vcmUgZWZmaWNpZW50IGxvb2t1cCAoZXNwZWNpYWxseSBleGFjdCBtYXRjaCBsb29rdXApIGJlY29tZXMgYXQKK3RoZSBleHBlbnNlIG9mIGJpZ2dlciBpbmRleCBzaXplLiBUaGUgMTZrYiBkZWZhdWx0IGlzIGNob3NlbiBwcmV0dHkKK2NvbnNlcnZhdGl2ZWx5W142XTsgaWYgdXNlcnMgZG9uJ3QgbWluZCBiaWdnZXIgaW5kaWNlcyBzb21ldGhpbmcgbGlrZSA0LAorMiBvciAxa2IgZ3JhbnVsYXJpdHkgc2hvdWxkIGJlIHF1aXRlIGEgYml0IG1vcmUgZWZmaWNpZW50LiBJdCBpcyBhbHNvCitwb3NzaWJsZSB0byBpbmRleCBldmVyeSByb3cgYnkgY2hvb3NpbmcgYSBncmFudWxhcml0eSBvZiAwa2I7IGF0IHRoZXNlCitzZXR0aW5ncyBpbi1jYWNoZSB0cmllLWluZGV4ZWQgc3N0YWJsZXMgdGVuZCB0byBvdXRwZXJmb3JtCitgQ29uY3VycmVudFNraXBMaXN0TWFwYCBtZW10YWJsZXMgZm9yIHJlYWRzLgorCitbXjZdOiBUaGlzIHdhcyBjaG9zZW4gd2l0aCB0aGUgYWltIHRvIG1hdGNoIHRoZSBzaXplIG9mIHRoZSB0cmllIGluZGV4Citjb21wYXJlZCB0byB0aGUgZWFybGllciB2ZXJzaW9uIG9mIHRoZSByb3cgaW5kZXggYXQgaXRzIGRlZmF1bHQKK2dyYW51bGFyaXR5IG9mIDY0a2IuCisKKyMjIyBSZXZlcnNlIGxvb2t1cAorCitUbyBwZXJmb3JtIGEgcmV2ZXJzZSBsb29rdXAsIHdlIGNhbiB1c2UgdGhlIHNhbWUgbWVjaGFuaXNtIGFzIGFib3ZlCisod2l0aCBncmVhdGVyLXRoYW4tb3ItZXF1YWwpIHRvIGZpbmQgdGhlIGluaXRpYWwgYmxvY2sgZm9yIHRoZQoraXRlcmF0aW9uLiBIb3dldmVyLCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24gd2UgY291bGQgc2ltcGx5IHdhbGsgdGhlCitkYXRhIGZpbGUgdG8gZmluZCB0aGUgbmV4dCByb3dzLCBidXQgdGhpcyBpc24ndCBwb3NzaWJsZSBnb2luZworYmFja3dhcmRzLgorCitUbyBzb2x2ZSB0aGlzIHByb2JsZW0gdGhlIGluZGV4IGhlbHBzIHRoZSBpdGVyYXRpb24gbWFjaGluZXJ5IGJ5Citwcm92aWRpbmcgYW4gaXRlcmF0b3Igb2YgaW5kZXggYmxvY2tzIGluIHJldmVyc2Ugb3JkZXIuIEZvciBlYWNoIGluZGV4CitibG9jayB0aGUgaXRlcmF0aW9uIHdhbGtzIGl0IGZvcndhcmQgYW5kIGNyZWF0ZXMgYSBzdGFjayBvZiBhbGwgaXRzIHJvdworcG9zaXRpb25zLCB0aGVuIHN0YXJ0cyBpc3N1aW5nIHJvd3MgYnkgcG9wcGluZyBhbmQgZXhhbWluaW5nIHJvd3MgZnJvbQordGhhdCBzdGFjay4gV2hlbiB0aGUgc3RhY2sgaXMgZXhoYXVzdGVkIGl0IHJlcXVlc3RzIHRoZSBwcmV2aW91cyBibG9jaworZnJvbSB0aGUgaW5kZXggYW5kIGFwcGxpZXMgdGhlIHNhbWUgcHJvY2VkdXJlIHRoZXJlLgorCisjIENvZGUgc3RydWN0dXJlCisKK1RoZSBpbXBsZW1lbnRhdGlvbiBpcyBtb3N0bHkgaW4gdHdvIHBhY2thZ2VzLCBgby5hLmMuaW8udHJpZXNgIGNvbnRhaW5zCit0aGUgZ2VuZXJpYyBjb2RlIHRvIGNvbnN0cnVjdCBhbmQgcmVhZCBvbi1kaXNrIHRyaWVzLCBhbmQgCitgby5hLmMuaW8uc3N0YWJsZS5mb3JtYXQuYnRpYCwgd2hpY2ggaW1wbGVtZW50cyB0aGUgc3BlY2lmaWNzIG9mIHRoZQorZm9ybWF0IGFuZCB0aGUgdHdvIGluZGV4ZXMuCisKKyMjIEJ1aWxkaW5nIHRyaWVzCisKK1RyaWVzIGFyZSBidWlsdCBmcm9tIHNvcnRlZCBrZXlzIHVzaW5nIGFuIFtgSW5jcmVtZW50YWxUcmllV3JpdGVyYF0oLi4vLi4vLi4vdHJpZXMvSW5jcmVtZW50YWxUcmllV3JpdGVyLmphdmEpLiAKK1RoZSBjb2RlIGNvbnRhaW5zIHRocmVlIGltcGxlbWVudGF0aW9ucyB3aXRoIGluY3JlYXNpbmcgY29tcGxleGl0eToKKy0gW2BJbmNyZW1lbnRhbFRyaWVXcml0ZXJTaW1wbGVgXSguLi8uLi8uLi90cmllcy9JbmNyZW1lbnRhbFRyaWVXcml0ZXJTaW1wbGUuamF2YSkKKyAgaW1wbGVtZW50cyBzaW1wbGUgaW5jcmVtZW50YWwgY29uc3RydWN0aW9uIG9mIHRyaWVzIGZyb20gc29ydGVkIGlucHV0LAorLSBbYEluY3JlbWVudGFsVHJpZVdyaXRlclBhZ2VBd2FyZWBdKC4uLy4uLy4uL3RyaWVzL0luY3JlbWVudGFsVHJpZVdyaXRlclBhZ2VBd2FyZS5qYXZhKQorICBhZGRzIHBhY2tpbmcgb2Ygbm9kZXMgdG8gZGlzayBwYWdlcywKKy0gW2BJbmNyZW1lbnRhbERlZXBUcmllV3JpdGVyUGFnZUF3YXJlYF0oLi4vLi4vLi4vdHJpZXMvSW5jcmVtZW50YWxEZWVwVHJpZVdyaXRlclBhZ2VBd2FyZS5qYXZhKQorICBhZGRzIHRoZSBhYmlsaXR5IHRvIHRyYW5zaXRpb24gdG8gb24taGVhcCByZWN1cnNpb24gZm9yIGFsbCBzdGFnZXMgb2YgdGhlIGNvbnN0cnVjdGlvbgorICBwcm9jZXNzIHRvIGJlIGFibGUgdG8gaGFuZGxlIHZlcnkgbGFyZ2Uga2V5cy4KKworT25seSB0aGUgbGF0dGVyIGlzIHVzZWQsIGJ1dCB3ZSBwcm92aWRlIChhbmQgdGVzdCkgdGhlIG90aGVyIHR3byBhcyBhIGZvcm0gb2YKK2RvY3VtZW50YXRpb24uCisKK1RoZSBidWlsZGVycyB0YWtlIGEgYFRyaWVTZXJpYWxpemVyYCBhcyBwYXJhbWV0ZXIsIHdoaWNoIGRldGVybWluZXMgaG93IHRoZSBub2RlcworYXJlIHdyaXR0ZW4uIFRoZSBpbmRleGVzIGltcGxlbWVudCB0aGlzIHVzaW5nIGBUcmllTm9kZWAsIHdyaXRpbmcgYW55IHBheWxvYWQgdGhleQorbmVlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgbm9kZSBzZXJpYWxpemF0aW9uLgorCisjIyBSZWFkaW5nIHRyaWVzCisKK1RoZSBCVEkgZm9ybWF0IHRyaWVzIGFyZSB1c2VkIGRpcmVjdGx5IGluIHRoZWlyIG9uLWRpc2sgZm9ybWF0LiBUbyBhY2hpZXZlIHRoaXMsCithbGwgbm9kZSB0eXBlcyBhcmUgaW1wbGVtZW50ZWQgYXMgc3RhdGljIG9iamVjdHMgaW4gYFRyaWVOb2RlYC4gUmVhZGluZyBub2RlcyBpbgorYSBmaWxlIGlzIGVuY2Fwc3VsYXRlZCBpbiBbYFdhbGtlcmBdKC4uLy4uLy4uL3RyaWVzL1dhbGtlci5qYXZhKSwgCit3aGljaCBwcm92aWRlcyBhIG1ldGhvZCB0byBgZ29gIHRvIGEgc3BlY2lmaWMgbm9kZSBhbmQgdXNlIGl0LCBpLmUuIAorZ2V0IGFueSBhc3NvY2lhdGVkIGRhdGEsIHNlYXJjaCBpbiB0aGUgY2hpbGRyZW4gbGlzdCBhbmQKK2ZvbGxvdyB0cmFuc2l0aW9ucyB0byBjaGlsZHJlbi4gSXQgYWxzbyBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIGZpbmQgdGhlCittYXBwaW5nIGZvciBhIGdpdmVuIGtleSwgZmxvb3JzIGFuZCBjZWlsaW5ncyBhcyB3ZWxsIGFzIHNvbWUgY29tYmluYXRpb25zLgorSXRlcmF0aW5nIHRoZSBwYXlsb2FkcyBiZXR3ZWVuIHR3byBrZXkgYm91bmRzIGlzIGltcGxlbWVudGVkIGJ5IAorW2BWYWx1ZUl0ZXJhdG9yYF0oLi4vLi4vLi4vdHJpZXMvVmFsdWVJdGVyYXRvci5qYXZhKSwKK2FuZCBbYFJldmVyc2VWYWx1ZUl0ZXJhdG9yYF0oLi4vLi4vLi4vdHJpZXMvUmV2ZXJzZVZhbHVlSXRlcmF0b3IuamF2YSkuCisKK1NwZWNpYWwgY2FyZSBpcyBnaXZlbiB0byBwcmVmaXhlcyB0byBtYWtlIHN1cmUgdGhlIHNlbWFudGljcyBvZiBzZWFyY2hlcyBtYXRjaGVzCit3aGF0IHRoZSBmb3JtYXQgbmVlZHMuCisKKyMjIFNTVGFibGUgZm9ybWF0IGltcGxlbWVudGF0aW9uCisKK1RoZSB0d28gaW5kZXhlcyBhcmUgaW1wbGVtZW50ZWQsIHJlc3BlY3RpdmVseSwgYnkgW2BQYXJ0aXRpb25JbmRleGBdKFBhcnRpdGlvbkluZGV4LmphdmEpCisvW2BQYXJ0aXRpb25JbmRleEJ1aWxkZXJgXShQYXJ0aXRpb25JbmRleEJ1aWxkZXIuamF2YSkKK2FuZCBbYFJvd0luZGV4UmVhZGVyYF0oUm93SW5kZXhSZWFkZXIuamF2YSkvW2BSb3dJbmRleFdyaXRlcmBdKFJvd0luZGV4V3JpdGVyLmphdmEpLiAKK1RoZSBmb3JtYXQgaW1wbGVtZW50YXRpb24gZXh0ZW5kcyB0aGUgZmlsdGVyZWQKK2Jhc2UgY2xhc3MgYW5kIGZvbGxvd3MgdGhlIHN0cnVjdHVyZSBvZiB0aGUgQklHIGltcGxlbWVudGF0aW9uLCB3aGVyZQorYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHByaW1hcnkgaW5kZXggYXJlIHJlcGxhY2VkIHdpdGggY2FsbHMgdG8gdGhlc2UgdHdvIAorY2xhc3Nlcy4KKworIyBJbmRleCBmaWxlIGZvcm1hdCBpbiBCVEkKKworIyMgVHJpZSBub2RlcworSW1wbGVtZW50ZWQgaW4gW2BUcmllTm9kZS5qYXZhYF0oLi4vLi4vLi4vdHJpZXMvVHJpZU5vZGUuamF2YSkKKworTm9kZXMgc3RhcnQgd2l0aCBmb3VyIGJpdHMgb2Ygbm9kZSB0eXBlLCBmb2xsb3dlZCBieSA0IHBheWxvYWQgYml0cworKF9wYl8pLCB3aGljaCBhcmUgMCBpZiB0aGUgbm9kZSBoYXMgbm8gYXNzb2NpYXRlZCBwYXlsb2FkOyBvdGhlcndpc2UgdGhlCitub2RlIHR5cGUgZ2l2ZXMgYW4gb3B0aW9uIHRvIGNvbXB1dGUgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUKK3BheWxvYWQgKF9wcG9zXykgZnJvbSB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIG5vZGUgKF9ucG9zXykuCitUaGUgbGF5b3V0IG9mIHRoZSBub2RlIGRlcGVuZHMgb24gaXRzIHR5cGUuCisKK2BQQVlMT0FEX09OTFlgIG5vZGVzOgorCistICAgNCB0eXBlIGJpdHMsIDAKKworLSAgIDQgcGF5bG9hZCBiaXRzCisKKy0gICBwYXlsb2FkIGlmIF9wYl8gJm5lOyAwLCBfcHBvc18gaXMgX25wb3NfICsgMQorCitgU0lOR0xFX05PUEFZTE9BRF80YCBhbmQgYFNJTkdMRV9OT1BBWUxPQURfMTJgIG5vZGVzOgorCistICAgNCB0eXBlIGJpdHMKKworLSAgIDQgcG9pbnRlciBiaXRzCisKKy0gICA4IHBvaW50ZXIgYml0cyAoZm9yIGBTSU5HTEVfTk9QQVlMT0FEXzEyYCkKKworLSAgIDggYml0cyB0cmFuc2l0aW9uIGJ5dGUKKworLSAgIF9wYl8gaXMgYXNzdW1lZCAwCisKK2BTSU5HTEVfOC8xNmA6CisKKy0gICA0IHR5cGUgYml0cworCistICAgNCBwYXlsb2FkIGJpdHMKKworLSAgIDggYml0cyB0cmFuc2l0aW9uIGJ5dGUKKworLSAgIDgvMTYgcG9pbnRlciBiaXRzCisKKy0gICBwYXlsb2FkIGlmIF9wYl8gJm5lOyAwLCBfcHBvc18gaXMgX25wb3NfICsgMy80CisKK2BTUEFSU0VfOC8xMi8xNi8yNC80MGA6CisKKy0gICA0IHR5cGUgYml0cworCistICAgNCBwYXlsb2FkIGJpdHMKKworLSAgIDggYml0IGNoaWxkIGNvdW50CisKKy0gICA4IGJpdHMgcGVyIGNoaWxkLCB0aGUgdHJhbnNpdGlvbiBieXRlcworCistICAgOC8xMi8xNi8yNC80MCBiaXRzIHBlciBjaGlsZCwgdGhlIHBvaW50ZXJzCisKKy0gICBwYXlsb2FkIGlmIF9wYl8gJm5lOyAwLCBfcHBvc18gaXMgX25wb3NfICsgMiArICgyLzIuNS8zLzQvNikqKF9jaGlsZAorICAgIGNvdW50XykgKHJvdW5kZWQgdXApCisKK2BERU5TRV8xMi8xNi8yNC8zMi80MC9MT05HYDoKKworLSAgIDQgdHlwZSBiaXRzCisKKy0gICA0IHBheWxvYWQgYml0cworCistICAgOCBiaXQgc3RhcnQgYnl0ZSB2YWx1ZQorCistICAgOCBiaXQgX2xlbmd0aF8tMQorCistICAgX2xlbmd0aF8gKiAxMi8xNi8yNC8zMi80MC82NCBiaXRzIHBlciBjaGlsZCwgdGhlIHBvaW50ZXJzCisKKy0gICBwYXlsb2FkIGlmIF9wYl8gJm5lOyAwLCBfcHBvc18gaXMgX25wb3NfICsgMyArICgxLjUvMi8zLzQvNS84KSooX2xlbmd0aF8pCisgICAgKHJvdW5kZWQgdXApCisKK1RoaXMgaXMgdGhlIHNwYWNlIHRha2VuIGJ5IGVhY2ggbm9kZSB0eXBlIChfQ1NfIHN0YW5kcyBmb3IgY2hpbGQgc3BhbiwKK2kuZS4gbGFyZ2VzdCAtIHNtYWxsZXN0ICsgMSwgX0NDXyBpcyBjaGlsZCBjb3VudCk6CisKK3xUeXBlICAgICAgICAgICAgICAgICB8IFNpemUgaW4gYnl0ZXMgZXhjbC4gcGF5bG9hZCB8U2l6ZSBmb3IgMSBjaGlsZHxTaXplIGZvciA5IGRlbnNlIGNoaWxkcmVuICgwMS0wOCwgMTApfFNpemUgZm9yIDEwIHNwYXJzZSBjaGlsZHJlbiAoMDEgKyBpKjEwKXxXaHkgdGhlIHR5cGUgaXMgbmVlZGVkICAgICAgICAgIHwKK3w6LS0tLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tOnwtLS0tLS0tLS0tLS0tLS0tLS0tOnwtLS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3xgUEFZTE9BRF9PTkxZYCAgICAgICB8IDEgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0gICAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgIHwgIExlYXZlcyBkb21pbmF0ZSB0aGUgdHJpZSAgICAgIHwKK3xgU0lOR0xFX05PUEFZTE9BRF80YCB8IDIgICAgICAgICAgICAgICAgICAgICAgICAgICB8MiAgICAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgIHwgIFNpbmdsZS10cmFuc2l0aW9uIGNoYWlucyAgICAgIHwKK3xgU0lOR0xFXzhgICAgICAgICAgICB8IDMgICAgICAgICAgICAgICAgICAgICAgICAgICB8MyAgICAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgIHwgIFBheWxvYWQgd2l0aGluIGNoYWluICAgICAgICAgIHwKK3xgU1BBUlNFXzhgICAgICAgICAgICB8IDIgKyBfQ0NfICogMiAgICAgICAgICAgICAgICB8NCAgICAgICAgICAgICAgIHwgMjAgICAgICAgICAgICAgICAgIHwgMjIgICAgICAgICAgICAgICAgIHwgIE1vc3QgY29tbW9uIHR5cGUgYWZ0ZXIgbGVhdmVzIHwKK3xgU0lOR0xFX05PUEFZTE9BRF8xMmB8IDMgICAgICAgICAgICAgICAgICAgICAgICAgICB8MyAgICAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgIHwgIDEyIGJpdHMgY292ZXIgYWxsIGluLXBhZ2UgdHJhbnNpdGlvbnMgICAgfCAKK3xgU1BBUlNFXzEyYCAgICAgICAgICB8IDIgKyBfQ0NfICogMi41ICAgICAgICAgICAgICB8NSAgICAgICAgICAgICAgIHwgMjUgICAgICAgICAgICAgICAgIHwgMjcgICAgICAgICAgICAgICAgIHwgIFNpemUgb2Ygc3BhcnNlIGlzIHByb3BvcnRpb25hbCB0byBudW1iZXIgb2YgY2hpbGRyZW4gfAorfGBERU5TRV8xMmAgICAgICAgICAgIHwgMyArIF9DU18gKiAxLjUgICAgICAgICAgICAgIHw1ICAgICAgICAgICAgICAgfCAxOCAgICAgICAgICAgICAgICAgfCAxNDAgICAgICAgICAgICAgICAgfCAgTG9va3VwIGluIGRlbnNlIGlzIGZhc3Rlciwgc2l6ZSBzbWFsbGVyIGlmIGZldyBob2xlcyAgICB8IAorfGBTSU5HTEVfMTZgICAgICAgICAgIHwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgIHw0ICAgICAgICAgICAgICAgfCAtICAgICAgICAgICAgICAgICAgfCAtICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAKK3xgU1BBUlNFXzE2YCAgICAgICAgICB8IDIgKyBfQ0NfICogMyAgICAgICAgICAgICAgICB8NSAgICAgICAgICAgICAgIHwgMjkgICAgICAgICAgICAgICAgIHwgMzIgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIAorfGBERU5TRV8xNmAgICAgICAgICAgIHwgMyArIF9DU18gKiAyICAgICAgICAgICAgICAgIHw1ICAgICAgICAgICAgICAgfCAyMyAgICAgICAgICAgICAgICAgfCAxODUgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgCit8YFNQQVJTRV8yNGAgICAgICAgICAgfCAyICsgX0NDXyAqIDQgICAgICAgICAgICAgICAgfDYgICAgICAgICAgICAgICB8IDM4ICAgICAgICAgICAgICAgICB8IDQyICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAKK3xgREVOU0VfMjRgICAgICAgICAgICB8IDMgKyBfQ1NfICogMyAgICAgICAgICAgICAgICB8NiAgICAgICAgICAgICAgIHwgMzMgICAgICAgICAgICAgICAgIHwgMjc2ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIAorfGBERU5TRV8zMmAgICAgICAgICAgIHwgMyArIF9DU18gKiA0ICAgICAgICAgICAgICAgIHw3ICAgICAgICAgICAgICAgfCA0MyAgICAgICAgICAgICAgICAgfCAzNjcgICAgICAgICAgICAgICAgfCAgTm9kZXMgd2l0aCBiaWcgc3VidHJlZXMgYXJlIHVzdWFsbHkgZGVuc2UgICB8IAorfGBTUEFSU0VfNDBgICAgICAgICAgIHwgMiArIF9DQ18gKiA2ICAgICAgICAgICAgICAgIHw4ICAgICAgICAgICAgICAgfCA1NiAgICAgICAgICAgICAgICAgfCA2MiAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgCit8YERFTlNFXzQwYCAgICAgICAgICAgfCAzICsgX0NTXyAqIDUgICAgICAgICAgICAgICAgfDggICAgICAgICAgICAgICB8IDUzICAgICAgICAgICAgICAgICB8IDQ1OCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAKK3xgREVOU0VfTE9OR2AgICAgICAgICB8IDMgKyBfQ1NfICogOCAgICAgICAgICAgICAgICB8MTEgICAgICAgICAgICAgIHwgODMgICAgICAgICAgICAgICAgIHwgNzMxICAgICAgICAgICAgICAgIHwgIENhdGNoLWFsbCAgICAgICAgICAgICAgICAgICAgIHwKKworQWxsIHBvaW50ZXJzIGFyZSBzdG9yZWQgYXMgZGlzdGFuY2VzLCBhbmQgc2luY2UgYWxsIHRyaWVzIGFyZSB3cml0dGVuCitmcm9tIHRoZSBib3R0b20gdXAgKGFuZCBoZW5jZSBhIGNoaWxkIGlzIGFsd2F5cyBiZWZvcmUgdGhlIHBhcmVudCBpbiB0aGUKK2ZpbGUpLCB0aGUgZGlzdGFuY2UgaXMgc3VidHJhY3RlZCBmcm9tIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBub2RlCit0byBvYnRhaW4gdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGlsZCBub2RlLgorCitOb3RlOiBBbGwgbm9kZXMgYXJlIHBsYWNlZCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhleSBkbyBub3QgY3Jvc3MgYSBwYWdlCitib3VuZGFyeS4gSS5lLiBpZiBhIHJlYWRlciAoZS5nLiBbYFdhbGtlcmBdKC4uLy4uLy4uL3RyaWVzL1dhbGtlci5qYXZhKSkgCitpcyBwb3NpdGlvbmVkIGF0IGEgbm9kZSwgaXQgaXMKK2d1YXJhbnRlZWQgdGhhdCBhbGwgcmVhZHMgb2YgdGhlIG5vZGUncyBkYXRhIGNhbiBjb21wbGV0ZSB3aXRob3V0CityZXF1aXJpbmcgYSBkaWZmZXJlbnQgcGFnZSB0byBiZSBmZXRjaGVkIGZyb20gZGlzay4KKworIyMgUGFydGl0aW9uIGluZGV4CitJbXBsZW1lbnRlZCBpbiBbYFBhcnRpdGlvbkluZGV4LmphdmFgXShQYXJ0aXRpb25JbmRleC5qYXZhKQorCitMYXlvdXQ6CitgYGAKK1tub2RlcyBwYWdlLCA0MDk2IGJ5dGVzXQorLi4uCitbbm9kZXMgcGFnZSwgNDA5NiBieXRlc10KK1tub2RlcyBwYWdlIGluY2x1ZGluZyByb290IG5vZGUsIOKJpDQwOTYgYnl0ZXNdCitbc21hbGxlc3Qga2V5LCB3aXRoIHNob3J0IGxlbmd0aF0KK1tsYXJnZXN0IGtleSwgd2l0aCBzaG9ydCBsZW5ndGhdCitbc21hbGxlc3Qga2V5IHBvcywgbG9uZ10KK1trZXkgY291bnQsIGxvbmddCitbcm9vdCBwb3MsIGxvbmddCitgYGAKKworVGhlIFNTVGFibGUncyBwYXJ0aXRpb24gaW5kZXggaXMgc3RvcmVkIGluIHRoZSAtUGFydGl0aW9ucy5kYiBmaWxlLiBUaGUKK2ZpbGUgaXRzZWxmIGlzIHdyaXR0ZW4gZnJvbSB0aGUgYm90dG9tIHVwLCBhbmQgaXRzICJoZWFkZXIiIGlzIGF0IHRoZQorZW5kIG9mIHRoZSBmaWxlLgorCitNb3JlIHByZWNpc2VseSwgdGhlIGxhc3QgMyBsb25ncyBpbiB0aGUgZmlsZSBjb250YWluOgorCistICAgQSBmaWxlIHBvc2l0aW9uIHdoZXJlIHRoZSBzbWFsbGVzdCBhbmQgZ3JlYXRlc3Qga2V5IGFyZSB3cml0dGVuLgorCistICAgVGhlIGV4YWN0IG51bWJlciBvZiBrZXlzIGluIHRoZSBmaWxlLgorCistICAgQSBmaWxlIHBvc2l0aW9uIGZvciB0aGUgcm9vdCBub2RlIG9mIHRoZSBpbmRleC4KKworVGhlc2UgdGhyZWUgbG9uZ3MgYXJlIHByZWNlZGVkIGJ5IHRoZSBzZXJpYWxpemF0aW9uIG9mIHRoZSBmaXJzdCBhbmQKK2xhc3Qga2V5LCBhbmQgYmVmb3JlIHRoYXQgYXJlIHRoZSB0cmllIGNvbnRlbnRzLgorCitUbyBmaW5kIGEgbWF0Y2ggZm9yIHRoZSBrZXksIHN0YXJ0IGF0IHRoZSByb290IHBvc2l0aW9uLCBkZWNvZGUgdGhlIG5vZGUKKyhzZWUgdGhlICJUcmllIG5vZGVzIiBzZWN0aW9uIGFib3ZlKSBhbmQgZm9sbG93IHRoZSB0cmFuc2l0aW9ucworYWNjb3JkaW5nIHRvIHRoZSBieXRlcyBvZiB0aGUgYnl0ZS1vcmRlcmVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBrZXkKK3doaWxlIHRoZSBub2RlIGhhcyBjaGlsZHJlbiBhbmQgdGhlcmUgYXJlIGJ5dGVzIGxlZnQgaW4gdGhlIGtleS4KKworSWYgYSBsZWFmIG5vZGUgaXMgcmVhY2hlZCwgdGhhdCBub2RlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgcGF5bG9hZDoKKworLSAgIElmIF9wYl8gPCA4LCBsZXQKKworICAgIC0gICBfaWR4cG9zXyBiZSB0aGUgc2lnbi1leHRlbmRlZCBpbnRlZ2VyIHZhbHVlIG9mIGxlbmd0aCBfcGJfIGF0CisgICAgICAgIF9wcG9zXworCistICAgSWYgX3BiXyAmZ2U7IDggKGFsd2F5cyB0aGUgY2FzZSBpbiBDYXNzYW5kcmEgNSBmaWxlcyksIGxldAorCisgICAgLSAgIF9oYXNoXyBiZSB0aGUgYnl0ZSBhdCBfcHBvc18KKworICAgIC0gICBfaWR4cG9zXyBiZSB0aGUgc2lnbi1leHRlbmRlZCBpbnRlZ2VyIHZhbHVlIG9mIGxlbmd0aCBfcGItN18gYXQKKyAgICAgICAgX3Bwb3MrMV8KKworSWYgYXQgYW55IHN0ZXAgdGhlcmUgaXMgbm8gdHJhbnNpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBieXRlIG9mIHRoZQora2V5LCBvciBpZiBfaGFzaF8gaXMgcHJlc2VudCBhbmQgdGhlIGxvd2VzdC1vcmRlciBieXRlIG9mIHRoZSBrZXkncyBoYXNoCit2YWx1ZSBkb2VzIG5vdCBtYXRjaCBpdCwgdGhlIGluZGV4IGFuZCBzc3RhYmxlIGhhdmUgbm8gbWFwcGluZyBmb3IgdGhlCitnaXZlbiBrZXkuCisKK090aGVyd2lzZSBfaWR4cG9zXyBzcGVjaWZpZXM6CisKKy0gICBpZiBfaWR4cG9zXyAmZ2U7IDAsIHRoZSByb3cgaW5kZXggZmlsZSBjb250YWlucyBhbiBpbmRleCBmb3IgdGhlCisgICAgZ2l2ZW4ga2V5IChzZWUgcm93IGluZGV4IHNlY3Rpb24gYmVsb3cpIGF0IHBvc2l0aW9uIF9pZHhwb3NfCisKKy0gICBvdGhlcndpc2UsIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IHN0YXJ0cyBhdCBwb3NpdGlvbgorICAgIH5faWR4cG9zXyBpbiB0aGUgZGF0YSBmaWxlCisKK0luIGVpdGhlciBjYXNlIHRoZSBjb250ZW50IGluIHRoZSByZXNwZWN0aXZlIGZpbGUgc3RhcnRzIHdpdGggdGhlCitzZXJpYWxpemF0aW9uIG9mIHRoZSBwYXJ0aXRpb24ga2V5LCB3aGljaCBtdXN0IGJlIGNvbXBhcmVkIHdpdGggdGhlIGtleQorcmVxdWVzdGVkIHRvIGVuc3VyZSB0aGV5IG1hdGNoLgorCisjIyBSb3cgaW5kZXgKK0ltcGxlbWVudGVkIGluIFtgUm93SW5kZXhSZWFkZXIuamF2YWBdKFJvd0luZGV4UmVhZGVyLmphdmEpCisKK0xheW91dDoKK2BgYAorW3JvdyBpbmRleCwgcGFkZGVkIHRvIHBhZ2UgYm91bmRhcnldCisuLi4KK1tyb3cgaW5kZXgsIHBhZGRlZCB0byBwYWdlIGJvdW5kYXJ5XQorYGBgCitXaGVyZSBlYWNoIHJvdyBpbmRleCBjb250YWluczoKK2BgYAorW25vZGVzIHBhZ2UsIDQwOTYgYnl0ZXNdCisuLi4KK1tub2RlcyBwYWdlLCA0MDk2IGJ5dGVzXQorW25vZGVzIHBhZ2UgaW5jbHVkaW5nIHJvb3Qgbm9kZSwg4omkNDA5NiBieXRlc10KK1twYXJ0aXRpb24ga2V5LCB3aXRoIHNob3J0IGxlbmd0aF0KK1twb3NpdGlvbiBvZiB0aGUgcGFydGl0aW9uIGluIHRoZSBkYXRhIGZpbGUsIHVuc2lnbmVkIHZpbnRdCitbcG9zaXRpb24gb2YgdGhlIHJvb3Qgbm9kZSwgdmludCBlbmNvZGluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZQorc3RhcnQgb2YgdGhlIGRhdGEgZmlsZSBwb3NpdGlvbiBhbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSByb290IG5vZGVdCitbbnVtYmVyIG9mIHJvd3MgaW4gdGhlIHBhcnRpdGlvbiwgdW5zaWduZWQgdmludF0KK1twYXJ0aXRpb24gZGVsZXRpb24gdGltZSwgMTIgYnl0ZXNdCitgYGAKKworVGhlIGVudHJpZXMgaW4gdGhlIHBhcnRpdGlvbiBpbmRleCBwb2ludCB0byB0aGUgcG9zaXRpb24gYXQgdGhlIHN0YXJ0IG9mCit0aGUgcGFydGl0aW9uIGtleS4KKworVGhlIHBheWxvYWQgcmVhY2hhYmxlIGF0IHRoZSBlbmQgb2YgYSB0cmF2ZXJzYWwgY29udGFpbnM6CisKKy0gICBJbnRlZ2VyIG9mIF9wYl8mNyBieXRlcyBzcGVjaWZ5aW5nIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBwYXJ0aXRpb24KKyAgICB3aGVyZSB0aGUgcmVsZXZhbnQgcm93IGlzIGNvbnRhaW5lZAorCistICAgSWYgX3BiXyAmZ2U7IDgsIDEyIGJ5dGVzIG9mIGRlbGV0aW9uIHRpbWUgYWN0aXZlIGF0IHRoZSBzdGFydCBvZiB0aGUKKyAgICByb3cgaW5kZXggYmxvY2sKKwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aUZvcm1hdFBhcnRpdGlvbldyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aUZvcm1hdFBhcnRpdGlvbldyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NjgzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpRm9ybWF0UGFydGl0aW9uV3JpdGVyLmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0NvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU29ydGVkVGFibGVQYXJ0aXRpb25Xcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGkuUm93SW5kZXhSZWFkZXIuSW5kZXhJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKKworLyoqCisgKiBQYXJ0aXRpb24gd3JpdGVyIHVzZWQgYnkge0BsaW5rIEJ0aVRhYmxlV3JpdGVyfS4KKyAqIDxwPgorICogV3JpdGVzIGFsbCBwYXNzZWQgZGF0YSB0byB0aGUgZ2l2ZW4gU2VxdWVudGlhbFdyaXRlciBhbmQgaWYgbmVjZXNzYXJ5IGJ1aWxkcyBhIFJvd0luZGV4IGJ5IGNvbnN0cnVjdGluZyBhbiBlbnRyeQorICogZm9yIGVhY2ggcm93IHdpdGhpbiBhIHBhcnRpdGlvbiB0aGF0IGZvbGxvd3Mge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcjY29sdW1uX2luZGV4X3NpemV9IG9mIHdyaXR0ZW4KKyAqIGRhdGEuCisgKi8KK2NsYXNzIEJ0aUZvcm1hdFBhcnRpdGlvbldyaXRlciBleHRlbmRzIFNvcnRlZFRhYmxlUGFydGl0aW9uV3JpdGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfR1JBTlVMQVJJVFkgPSAxNiAqIDEwMjQ7CisgICAgcHJpdmF0ZSBmaW5hbCBSb3dJbmRleFdyaXRlciByb3dUcmllOworICAgIHByaXZhdGUgZmluYWwgaW50IHJvd0luZGV4QmxvY2tTaXplOworICAgIHByaXZhdGUgaW50IHJvd0luZGV4QmxvY2tDb3VudDsKKworICAgIEJ0aUZvcm1hdFBhcnRpdGlvbldyaXRlcihTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlciBkYXRhV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyIHJvd0luZGV4V3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICB0aGlzKGhlYWRlciwgY29tcGFyYXRvciwgZGF0YVdyaXRlciwgcm93SW5kZXhXcml0ZXIsIHZlcnNpb24sIERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleFNpemUoREVGQVVMVF9HUkFOVUxBUklUWSkpOworICAgIH0KKworCisgICAgQnRpRm9ybWF0UGFydGl0aW9uV3JpdGVyKFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wYXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyIGRhdGFXcml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbnRpYWxXcml0ZXIgcm93SW5kZXhXcml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd0luZGV4QmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgc3VwZXIoaGVhZGVyLCBkYXRhV3JpdGVyLCB2ZXJzaW9uKTsKKyAgICAgICAgdGhpcy5yb3dJbmRleEJsb2NrU2l6ZSA9IHJvd0luZGV4QmxvY2tTaXplOworICAgICAgICB0aGlzLnJvd1RyaWUgPSBuZXcgUm93SW5kZXhXcml0ZXIoY29tcGFyYXRvciwgcm93SW5kZXhXcml0ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAgIHN1cGVyLnJlc2V0KCk7CisgICAgICAgIHJvd1RyaWUucmVzZXQoKTsKKyAgICAgICAgcm93SW5kZXhCbG9ja0NvdW50ID0gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRVbmZpbHRlcmVkKFVuZmlsdGVyZWQgdW5maWx0ZXJlZCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdXBlci5hZGRVbmZpbHRlcmVkKHVuZmlsdGVyZWQpOworCisgICAgICAgIC8vIGlmIHdlIGhpdCB0aGUgY29sdW1uIGluZGV4IHNpemUgdGhhdCB3ZSBoYXZlIHRvIGluZGV4IGFmdGVyLCBnbyBhaGVhZCBhbmQgaW5kZXggaXQuCisgICAgICAgIGlmIChjdXJyZW50UG9zaXRpb24oKSAtIHN0YXJ0UG9zaXRpb24gPj0gcm93SW5kZXhCbG9ja1NpemUpCisgICAgICAgICAgICBhZGRJbmRleEJsb2NrKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgcm93VHJpZS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBlbmRQb3NpdGlvbiA9IHN1cGVyLmZpbmlzaCgpOworCisgICAgICAgIC8vIHRoZSBsYXN0IHJvdyBtYXkgaGF2ZSBmYWxsZW4gb24gYW4gaW5kZXggYm91bmRhcnkgYWxyZWFkeS4gIGlmIG5vdCwgaW5kZXggdGhlIGxhc3QgYmxvY2sgZXhwbGljaXRseS4KKyAgICAgICAgaWYgKHJvd0luZGV4QmxvY2tDb3VudCA+IDAgJiYgZmlyc3RDbHVzdGVyaW5nICE9IG51bGwpCisgICAgICAgICAgICBhZGRJbmRleEJsb2NrKCk7CisKKyAgICAgICAgaWYgKHJvd0luZGV4QmxvY2tDb3VudCA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByb3dUcmllLmNvbXBsZXRlKGVuZFBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBkb24ndCBjb21wbGV0ZSB0aGUgdHJpZSBhcyBhbiBpbmRleCBvZiBvbmUgYmxvY2sgYWRkcyBubyBpbmZvcm1hdGlvbiBhbmQgd2UgYXJlIGJldHRlciBvZmYKKyAgICAgICAgICAgIC8vIHdpdGhvdXQgYSByb3cgaW5kZXggZm9yIHN1Y2ggcGFydGl0aW9ucy4gRXZlbiBpZiB3ZSBkaWQgd3JpdGUgc29tZXRoaW5nIHRvIHRoZSBmaWxlICh3aGljaCBzaG91bGRuJ3QgYmUKKyAgICAgICAgICAgIC8vIHRoZSBjYXNlIGFzIHRoZSBmaXJzdCBlbnRyeSBoYXMgYW4gZW1wdHkga2V5IGFuZCByb290IGlzbid0IGZpbGxlZCksIHRoYXQncyBub3QgYSBwcm9ibGVtLgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkSW5kZXhCbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSW5kZXhJbmZvIGNJbmRleEluZm8gPSBuZXcgSW5kZXhJbmZvKHN0YXJ0UG9zaXRpb24sIHN0YXJ0T3Blbk1hcmtlcik7CisgICAgICAgIHJvd1RyaWUuYWRkKGZpcnN0Q2x1c3RlcmluZywgbGFzdENsdXN0ZXJpbmcsIGNJbmRleEluZm8pOworICAgICAgICBmaXJzdENsdXN0ZXJpbmcgPSBudWxsOworICAgICAgICArK3Jvd0luZGV4QmxvY2tDb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJvd0luZGV4QmxvY2tDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gcm93SW5kZXhCbG9ja0NvdW50OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlUYWJsZVJlYWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aVRhYmxlUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyZGNkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlUYWJsZVJlYWRlci5qYXZhCkBAIC0wLDAgKzEsNTM0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EYXRhUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvd3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3JzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNTVGFibGVTY2FubmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVZlcmlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2VsZWN0aW9uUmVhc29uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2tpcHBpbmdSZWFzb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5JRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlci5PcGVyYXRvci5HRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlci5PcGVyYXRvci5HVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5TaGFyZWRDbG9zZWFibGUuc2hhcmVkQ29weU9yTnVsbDsKKworLyoqCisgKiBSZWFkZXIgb2YgU1NUYWJsZSBmaWxlcyBpbiBCVEkgZm9ybWF0IChzZWUge0BsaW5rIEJ0aUZvcm1hdH0pLCB3cml0dGVuIGJ5IHtAbGluayBCdGlUYWJsZVdyaXRlcn0uCisgKiA8cD4KKyAqIFNTVGFibGVSZWFkZXJzIGFyZSBvcGVuKCllZCBieSBLZXlzcGFjZS5vblN0YXJ0OyBhZnRlciB0aGF0IHRoZXkgYXJlIGNyZWF0ZWQgYnkgU1NUYWJsZVdyaXRlci5yZW5hbWVBbmRPcGVuLgorICogRG8gbm90IHJlLWNhbGwgb3BlbigpIG9uIGV4aXN0aW5nIFNTVGFibGUgZmlsZXM7IHVzZSB0aGUgcmVmZXJlbmNlcyBrZXB0IGJ5IENvbHVtbkZhbWlseVN0b3JlIHBvc3Qtc3RhcnQgaW5zdGVhZC4KKyAqLworcHVibGljIGNsYXNzIEJ0aVRhYmxlUmVhZGVyIGV4dGVuZHMgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIKK3sKKyAgICBwcml2YXRlIGZpbmFsIEZpbGVIYW5kbGUgcm93SW5kZXhGaWxlOworICAgIHByaXZhdGUgZmluYWwgUGFydGl0aW9uSW5kZXggcGFydGl0aW9uSW5kZXg7CisKKyAgICBwdWJsaWMgQnRpVGFibGVSZWFkZXIoQnVpbGRlciBidWlsZGVyLCBTU1RhYmxlLk93bmVyIG93bmVyKQorICAgIHsKKyAgICAgICAgc3VwZXIoYnVpbGRlciwgb3duZXIpOworICAgICAgICB0aGlzLnJvd0luZGV4RmlsZSA9IGJ1aWxkZXIuZ2V0Um93SW5kZXhGaWxlKCk7CisgICAgICAgIHRoaXMucGFydGl0aW9uSW5kZXggPSBidWlsZGVyLmdldFBhcnRpdGlvbkluZGV4KCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIEJ1aWxkZXIgdW5idWlsZFRvKEJ1aWxkZXIgYnVpbGRlciwgYm9vbGVhbiBzaGFyZWRDb3B5KQorICAgIHsKKyAgICAgICAgQnVpbGRlciBiID0gc3VwZXIudW5idWlsZFRvKGJ1aWxkZXIsIHNoYXJlZENvcHkpOworICAgICAgICBpZiAoYnVpbGRlci5nZXRQYXJ0aXRpb25JbmRleCgpID09IG51bGwpCisgICAgICAgICAgICBiLnNldFBhcnRpdGlvbkluZGV4KHNoYXJlZENvcHkgPyBzaGFyZWRDb3B5T3JOdWxsKHBhcnRpdGlvbkluZGV4KSA6IHBhcnRpdGlvbkluZGV4KTsKKyAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0Um93SW5kZXhGaWxlKCkgPT0gbnVsbCkKKyAgICAgICAgICAgIGIuc2V0Um93SW5kZXhGaWxlKHNoYXJlZENvcHkgPyBzaGFyZWRDb3B5T3JOdWxsKHJvd0luZGV4RmlsZSkgOiByb3dJbmRleEZpbGUpOworCisgICAgICAgIHJldHVybiBiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBMaXN0PEF1dG9DbG9zZWFibGU+IHNldHVwSW5zdGFuY2UoYm9vbGVhbiB0cmFja0hvdG5lc3MpCisgICAgeworICAgICAgICBBcnJheUxpc3Q8QXV0b0Nsb3NlYWJsZT4gY2xvc2VhYmxlcyA9IExpc3RzLm5ld0FycmF5TGlzdChyb3dJbmRleEZpbGUsIHBhcnRpdGlvbkluZGV4KTsKKyAgICAgICAgY2xvc2VhYmxlcy5hZGRBbGwoc3VwZXIuc2V0dXBJbnN0YW5jZSh0cmFja0hvdG5lc3MpKTsKKyAgICAgICAgcmV0dXJuIGNsb3NlYWJsZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBmaWx0ZXIgb3V0IGRhdGEgYmVmb3JlIHtAbGluayAjZmlyc3R9LiBOZWVkZWQgZm9yIHNvdXJjZXMgb2YgZGF0YSBpbiBhIGNvbXBhY3Rpb24sIHdoZXJlIHRoZSByZWxldmFudAorICAgICAqIG91dHB1dCBpcyBvcGVuZWQgZWFybHkgLS0gaW4gdGhpcyBjYXNlIHRoZSBzc3RhYmxlJ3Mgc3RhcnQgaXMgY2hhbmdlZCwgYnV0IHRoZSBkYXRhIGNhbiBzdGlsbCBiZSBmb3VuZCBpbiB0aGUKKyAgICAgKiBmaWxlLiBSYW5nZSBhbmQgcG9pbnQgcXVlcmllcyBtdXN0IGZpbHRlciBpdCBvdXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsdGVyRmlyc3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9wZW5SZWFzb24gPT0gT3BlblJlYXNvbi5NT1ZFRF9TVEFSVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRvIGZpbHRlciBvdXQgZGF0YSBhZnRlciB7QGxpbmsgI2xhc3R9LiBFYXJseS1vcGVuIHNzdGFibGVzIG1heSBjb250YWluIGRhdGEgYmV5b25kIHRoZSBzd2l0Y2ggcG9pbnQKKyAgICAgKiAoYmVjYXVzZSBhbiBlYXJseS1vcGVuZWQgc3N0YWJsZSBpcyBub3QgcmVhZHkgdW50aWwgYnVmZmVycyBoYXZlIGJlZW4gZmx1c2hlZCksIGFuZCBsZWF2aW5nIHRoYXQgZGF0YSB2aXNpYmxlCisgICAgICogd2lsbCBnaXZlIGEgcmVkdW5kYW50IGNvcHkgd2l0aCBhbGwgYXNzb2NpYXRlZCBvdmVyaGVhZHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZmlsdGVyTGFzdCgpCisgICAgeworICAgICAgICByZXR1cm4gb3BlblJlYXNvbiA9PSBPcGVuUmVhc29uLkVBUkxZICYmIHBhcnRpdGlvbkluZGV4IGluc3RhbmNlb2YgUGFydGl0aW9uSW5kZXhFYXJseTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBlc3RpbWF0ZWRLZXlzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJ0aXRpb25JbmRleCA9PSBudWxsID8gMCA6IHBhcnRpdGlvbkluZGV4LnNpemUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVHJpZUluZGV4RW50cnkgZ2V0Um93SW5kZXhFbnRyeShQYXJ0aXRpb25Qb3NpdGlvbiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3Igb3BlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1cGRhdGVTdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICB7CisgICAgICAgIFBhcnRpdGlvblBvc2l0aW9uIHNlYXJjaEtleTsKKyAgICAgICAgT3BlcmF0b3Igc2VhcmNoT3A7CisKKyAgICAgICAgaWYgKG9wZXJhdG9yID09IEVRKQorICAgICAgICAgICAgcmV0dXJuIGdldEV4YWN0UG9zaXRpb24oKERlY29yYXRlZEtleSkga2V5LCBsaXN0ZW5lciwgdXBkYXRlU3RhdHMpOworCisgICAgICAgIGlmIChvcGVyYXRvciA9PSBHVCB8fCBvcGVyYXRvciA9PSBHRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZpbHRlckxhc3QoKSAmJiBsYXN0LmNvbXBhcmVUbyhrZXkpIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBub3RpZnlTa2lwcGVkKFNraXBwaW5nUmVhc29uLk1JTl9NQVhfS0VZUywgbGlzdGVuZXIsIG9wZXJhdG9yLCB1cGRhdGVTdGF0cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sZWFuIGZpbHRlcmVkTGVmdCA9IChmaWx0ZXJGaXJzdCgpICYmIGZpcnN0LmNvbXBhcmVUbyhrZXkpID4gMCk7CisgICAgICAgICAgICBzZWFyY2hLZXkgPSBmaWx0ZXJlZExlZnQgPyBmaXJzdCA6IGtleTsKKyAgICAgICAgICAgIHNlYXJjaE9wID0gZmlsdGVyZWRMZWZ0ID8gR0UgOiBvcGVyYXRvcjsKKworICAgICAgICAgICAgdHJ5IChQYXJ0aXRpb25JbmRleC5SZWFkZXIgcmVhZGVyID0gcGFydGl0aW9uSW5kZXgub3BlblJlYWRlcigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRyaWVJbmRleEVudHJ5IHJpZSA9IHJlYWRlci5jZWlsaW5nKHNlYXJjaEtleSwgKHBvcywgYXNzdW1lTm9NYXRjaCwgY29tcGFyZUtleSkgLT4gcmV0cmlldmVFbnRyeUlmQWNjZXB0YWJsZShzZWFyY2hPcCwgY29tcGFyZUtleSwgcG9zLCBhc3N1bWVOb01hdGNoKSk7CisgICAgICAgICAgICAgICAgaWYgKHJpZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBub3RpZnlTZWxlY3RlZChTZWxlY3Rpb25SZWFzb24uSU5ERVhfRU5UUllfRk9VTkQsIGxpc3RlbmVyLCBvcGVyYXRvciwgdXBkYXRlU3RhdHMsIHJpZSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBub3RpZnlTa2lwcGVkKFNraXBwaW5nUmVhc29uLklOREVYX0VOVFJZX05PVF9GT1VORCwgbGlzdGVuZXIsIG9wZXJhdG9yLCB1cGRhdGVTdGF0cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJpZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hcmtTdXNwZWN0KCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIHJvd0luZGV4RmlsZS5wYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBvcDogIiArIG9wZXJhdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkge0BsaW5rICNnZXRSb3dJbmRleEVudHJ5fSBhYm92ZSAodmlhIFJlYWRlci5jZWlsaW5nL2Zsb29yKSB0byBjaGVjayBpZiB0aGUgcG9zaXRpb24gc2F0aXNmaWVzIHRoZSBmdWxsCisgICAgICoga2V5IGNvbnN0cmFpbnQuIFRoaXMgaXMgY2FsbGVkIG9uY2UgaWYgdGhlcmUgaXMgYSBwcmVmaXggbWF0Y2ggKHdoaWNoIGNhbiBiZSBpbiBhbnkgcmVsYXRpb25zaGlwIHdpdGggdGhlIHNvdWdodAorICAgICAqIGtleSwgdGh1cyBhc3N1bWVOb01hdGNoOiBmYWxzZSksIGFuZCBpZiBpdCByZXR1cm5zIG51bGwgaXQgaXMgY2FsbGVkIGFnYWluIGZvciB0aGUgY2xvc2VzdCBncmVhdGVyIHBvc2l0aW9uCisgICAgICogKHdpdGggYXNzdW1lTm9NYXRjaDogdHJ1ZSkuCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggZW50cnkgYXQgdGhpcyBwb3NpdGlvbiwgb3IgbnVsbCBpZiB0aGUgc2VhcmNoIG9wIHJlamVjdHMgaXQuCisgICAgICovCisgICAgcHJpdmF0ZSBUcmllSW5kZXhFbnRyeSByZXRyaWV2ZUVudHJ5SWZBY2NlcHRhYmxlKE9wZXJhdG9yIHNlYXJjaE9wLCBQYXJ0aXRpb25Qb3NpdGlvbiBzZWFyY2hLZXksIGxvbmcgcG9zLCBib29sZWFuIGFzc3VtZU5vTWF0Y2gpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKHBvcyA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkgKEZpbGVEYXRhSW5wdXQgaW4gPSByb3dJbmRleEZpbGUuY3JlYXRlUmVhZGVyKHBvcykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGFzc3VtZU5vTWF0Y2gpCisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLnNraXBTaG9ydExlbmd0aChpbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbmRleEtleSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW4pOworICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkID0gZGVjb3JhdGVLZXkoaW5kZXhLZXkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoT3AuYXBwbHkoZGVjb3JhdGVkLmNvbXBhcmVUbyhzZWFyY2hLZXkpKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBUcmllSW5kZXhFbnRyeS5kZXNlcmlhbGl6ZShpbiwgaW4uZ2V0RmlsZVBvaW50ZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwb3MgPSB+cG9zOworICAgICAgICAgICAgaWYgKCFhc3N1bWVOb01hdGNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeSAoRmlsZURhdGFJbnB1dCBpbiA9IGRmaWxlLmNyZWF0ZVJlYWRlcihwb3MpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbmRleEtleSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW4pOworICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkID0gZGVjb3JhdGVLZXkoaW5kZXhLZXkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoT3AuYXBwbHkoZGVjb3JhdGVkLmNvbXBhcmVUbyhzZWFyY2hLZXkpKSAhPSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmllSW5kZXhFbnRyeShwb3MpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERlY29yYXRlZEtleSBrZXlBdFBvc2l0aW9uRnJvbVNlY29uZGFyeUluZGV4KGxvbmcga2V5UG9zaXRpb25Gcm9tU2Vjb25kYXJ5SW5kZXgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gb3BlbkRhdGFSZWFkZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVhZGVyLnNlZWsoa2V5UG9zaXRpb25Gcm9tU2Vjb25kYXJ5SW5kZXgpOworICAgICAgICAgICAgaWYgKHJlYWRlci5pc0VPRigpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgcmV0dXJuIGRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgocmVhZGVyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBUcmllSW5kZXhFbnRyeSBnZXRFeGFjdFBvc2l0aW9uKERlY29yYXRlZEtleSBkaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1cGRhdGVTdGF0cykKKyAgICB7CisgICAgICAgIGlmICgoZmlsdGVyRmlyc3QoKSAmJiBmaXJzdC5jb21wYXJlVG8oZGspID4gMCkgfHwgKGZpbHRlckxhc3QoKSAmJiBsYXN0LmNvbXBhcmVUbyhkaykgPCAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5U2tpcHBlZChTa2lwcGluZ1JlYXNvbi5NSU5fTUFYX0tFWVMsIGxpc3RlbmVyLCBFUSwgdXBkYXRlU3RhdHMpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzUHJlc2VudEluRmlsdGVyKGRrKSkKKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5U2tpcHBlZChTa2lwcGluZ1JlYXNvbi5CTE9PTV9GSUxURVIsIGxpc3RlbmVyLCBFUSwgdXBkYXRlU3RhdHMpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB0cnkgKFBhcnRpdGlvbkluZGV4LlJlYWRlciByZWFkZXIgPSBwYXJ0aXRpb25JbmRleC5vcGVuUmVhZGVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgaW5kZXhQb3MgPSByZWFkZXIuZXhhY3RDYW5kaWRhdGUoZGspOworICAgICAgICAgICAgaWYgKGluZGV4UG9zID09IFBhcnRpdGlvbkluZGV4Lk5PVF9GT1VORCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBub3RpZnlTa2lwcGVkKFNraXBwaW5nUmVhc29uLlBBUlRJVElPTl9JTkRFWF9MT09LVVAsIGxpc3RlbmVyLCBFUSwgdXBkYXRlU3RhdHMpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGaWxlSGFuZGxlIGZoOworICAgICAgICAgICAgbG9uZyBzZWVrUG9zaXRpb247CisgICAgICAgICAgICBpZiAoaW5kZXhQb3MgPj0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaCA9IHJvd0luZGV4RmlsZTsKKyAgICAgICAgICAgICAgICBzZWVrUG9zaXRpb24gPSBpbmRleFBvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaCA9IGRmaWxlOworICAgICAgICAgICAgICAgIHNlZWtQb3NpdGlvbiA9IH5pbmRleFBvczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IChGaWxlRGF0YUlucHV0IGluID0gZmguY3JlYXRlUmVhZGVyKHNlZWtQb3NpdGlvbikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEJ5dGVCdWZmZXJVdGlsLmVxdWFsc1dpdGhTaG9ydExlbmd0aChpbiwgZGsuZ2V0S2V5KCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVHJpZUluZGV4RW50cnkgcmllID0gaW5kZXhQb3MgPj0gMCA/IFRyaWVJbmRleEVudHJ5LmRlc2VyaWFsaXplKGluLCBpbi5nZXRGaWxlUG9pbnRlcigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFRyaWVJbmRleEVudHJ5KH5pbmRleFBvcyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeVNlbGVjdGVkKFNlbGVjdGlvblJlYXNvbi5JTkRFWF9FTlRSWV9GT1VORCwgbGlzdGVuZXIsIEVRLCB1cGRhdGVTdGF0cywgcmllKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJpZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5U2tpcHBlZChTa2lwcGluZ1JlYXNvbi5JTkRFWF9FTlRSWV9OT1RfRk9VTkQsIGxpc3RlbmVyLCBFUSwgdXBkYXRlU3RhdHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIHwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHwgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHwgQXNzZXJ0aW9uRXJyb3IgZSkKKyAgICAgICAgeworICAgICAgICAgICAgbWFya1N1c3BlY3QoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihlLCByb3dJbmRleEZpbGUucGF0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIFBhcnRpdGlvbkl0ZXJhdG9yIGxpc3RpbmcgYWxsIHBhcnRpdGlvbnMgd2l0aGluIHRoZSBnaXZlbiBib3VuZHMuCisgICAgICogVGhpcyBtZXRob2QgcmVsaWVzIG9uIGl0cyBjYWxsZXIgdG8gcHJlcGFyZSB0aGUgYm91bmRzIGNvcnJlY3RseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib3VuZHMgQSByYW5nZSBvZiBrZXlzLiBNdXN0IG5vdCBiZSBhIHdyYXBhcm91bmQgcmFuZ2UsIGFuZCB3aWxsIG5vdCBiZSBjaGVja2VkIGFnYWluc3QKKyAgICAgKiAgICAgICAgICAgICAgIHRoZSBzc3RhYmxlJ3MgYm91bmRzIChpLmUuIHRoaXMgd2lsbCByZXR1cm4gZGF0YSBiZWZvcmUgYSBtb3ZlZCBzdGFydCBvciBhZnRlciBhbiBlYXJseS1vcGVuIGxpbWl0KQorICAgICAqLworICAgIFBhcnRpdGlvbkl0ZXJhdG9yIGNvdmVyZWRLZXlzSXRlcmF0b3IoQWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+IGJvdW5kcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gUGFydGl0aW9uSXRlcmF0b3IuY3JlYXRlKHBhcnRpdGlvbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhKCkucGFydGl0aW9uZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXhGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5sZWZ0LCBib3VuZHMuaW5jbHVzaXZlTGVmdCgpID8gLTEgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kcy5yaWdodCwgYm91bmRzLmluY2x1c2l2ZVJpZ2h0KCkgPyAwIDogLTEpOworICAgIH0KKworICAgIHB1YmxpYyBTY3J1YlBhcnRpdGlvbkl0ZXJhdG9yIHNjcnViUGFydGl0aW9uc0l0ZXJhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFNjcnViSXRlcmF0b3IocGFydGl0aW9uSW5kZXgsIHJvd0luZGV4RmlsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhcnRpdGlvbkl0ZXJhdG9yIGtleVJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIFBhcnRpdGlvbkl0ZXJhdG9yLmNyZWF0ZShwYXJ0aXRpb25JbmRleCwgbWV0YWRhdGEoKS5wYXJ0aXRpb25lciwgcm93SW5kZXhGaWxlLCBkZmlsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhYmxlPERlY29yYXRlZEtleT4gZ2V0S2V5U2FtcGxlcyhmaW5hbCBSYW5nZTxUb2tlbj4gcmFuZ2UpCisgICAgeworICAgICAgICAvLyBCVEkgZG9lcyBub3Qgc3VwcG9ydCBrZXkgc2FtcGxpbmcgYXMgaXQgd291bGQgaW52b2x2ZSB3YWxraW5nIHRoZSBpbmRleCBvciBkYXRhIGZpbGUuCisgICAgICAgIC8vIFZhbGlkYXRvciBoYXMgYW4gYWx0ZXJuYXRlIHNvbHV0aW9uIGZvciBlbXB0eSBrZXkgc2FtcGxlIGxpc3RzLgorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZXN0aW1hdGVkS2V5c0ZvclJhbmdlcyhDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gcmFuZ2VzKQorICAgIHsKKyAgICAgICAgLy8gRXN0aW1hdGUgdGhlIG51bWJlciBvZiBwYXJ0aXRpb25zIGJ5IGNhbGN1bGF0aW5nIHRoZSBieXRlcyBvZiB0aGUgc3N0YWJsZSB0aGF0IGFyZSBjb3ZlcmVkIGJ5IHRoZSBzcGVjaWZpZWQKKyAgICAgICAgLy8gcmFuZ2VzIGFuZCB1c2luZyB0aGUgbWVhbiBwYXJ0aXRpb24gc2l6ZSB0byBvYnRhaW4gYSBudW1iZXIgb2YgcGFydGl0aW9ucyBmcm9tIHRoYXQuCisgICAgICAgIGxvbmcgc2VsZWN0ZWREYXRhU2l6ZSA9IDA7CisgICAgICAgIGZvciAoUmFuZ2U8VG9rZW4+IHJhbmdlIDogUmFuZ2Uubm9ybWFsaXplKHJhbmdlcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhcnRpdGlvblBvc2l0aW9uIGxlZnQgPSByYW5nZS5sZWZ0Lm1pbktleUJvdW5kKCk7CisgICAgICAgICAgICBpZiAobGVmdC5jb21wYXJlVG8oZmlyc3QpIDw9IDApCisgICAgICAgICAgICAgICAgbGVmdCA9IG51bGw7CisgICAgICAgICAgICBlbHNlIGlmIChsZWZ0LmNvbXBhcmVUbyhsYXN0KSA+IDApCisgICAgICAgICAgICAgICAgY29udGludWU7ICAgLy8gbm8gaW50ZXJzZWN0aW9uCisKKyAgICAgICAgICAgIFBhcnRpdGlvblBvc2l0aW9uIHJpZ2h0ID0gcmFuZ2UucmlnaHQubWluS2V5Qm91bmQoKTsKKyAgICAgICAgICAgIGlmIChyYW5nZS5yaWdodC5pc01pbmltdW0oKSB8fCByaWdodC5jb21wYXJlVG8obGFzdCkgPj0gMCkKKyAgICAgICAgICAgICAgICByaWdodCA9IG51bGw7CisgICAgICAgICAgICBlbHNlIGlmIChyaWdodC5jb21wYXJlVG8oZmlyc3QpIDwgMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgICAvLyBubyBpbnRlcnNlY3Rpb24KKworICAgICAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0aXRpb25JbmRleC5zaXplKCk7ICAgLy8gc3N0YWJsZSBpcyBmdWxseSBjb3ZlcmVkLCByZXR1cm4gZnVsbCBwYXJ0aXRpb24gY291bnQgdG8gYXZvaWQgcm91bmRpbmcgZXJyb3JzCisKKyAgICAgICAgICAgIGlmIChsZWZ0ID09IG51bGwgJiYgZmlsdGVyRmlyc3QoKSkKKyAgICAgICAgICAgICAgICBsZWZ0ID0gZmlyc3Q7CisgICAgICAgICAgICBpZiAocmlnaHQgPT0gbnVsbCAmJiBmaWx0ZXJMYXN0KCkpCisgICAgICAgICAgICAgICAgcmlnaHQgPSBsYXN0OworCisgICAgICAgICAgICBsb25nIHN0YXJ0UG9zID0gbGVmdCAhPSBudWxsID8gZ2V0UG9zaXRpb24obGVmdCwgR0UpIDogMDsKKyAgICAgICAgICAgIGxvbmcgZW5kUG9zID0gcmlnaHQgIT0gbnVsbCA/IGdldFBvc2l0aW9uKHJpZ2h0LCBHRSkgOiB1bmNvbXByZXNzZWRMZW5ndGgoKTsKKyAgICAgICAgICAgIHNlbGVjdGVkRGF0YVNpemUgKz0gZW5kUG9zIC0gc3RhcnRQb3M7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoc2VsZWN0ZWREYXRhU2l6ZSAvIHNzdGFibGVNZXRhZGF0YS5lc3RpbWF0ZWRQYXJ0aXRpb25TaXplLnJhd01lYW4oKSk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd0l0ZXJhdG9yKERlY29yYXRlZEtleSBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZXMgc2xpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmlsdGVyIHNlbGVjdGVkQ29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmV2ZXJzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICB7CisgICAgICAgIHJldHVybiByb3dJdGVyYXRvcihudWxsLCBrZXksIGdldEV4YWN0UG9zaXRpb24oa2V5LCBsaXN0ZW5lciwgdHJ1ZSksIHNsaWNlcywgc2VsZWN0ZWRDb2x1bW5zLCByZXZlcnNlZCk7CisgICAgfQorCisgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByb3dJdGVyYXRvcihGaWxlRGF0YUlucHV0IGRhdGFGaWxlSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpZUluZGV4RW50cnkgaW5kZXhFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsaWNlcyBzbGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgc2VsZWN0ZWRDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiByZXZlcnNlZCkKKyAgICB7CisgICAgICAgIGlmIChpbmRleEVudHJ5ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gVW5maWx0ZXJlZFJvd0l0ZXJhdG9ycy5ub1Jvd3NJdGVyYXRvcihtZXRhZGF0YSgpLCBrZXksIFJvd3MuRU1QVFlfU1RBVElDX1JPVywgRGVsZXRpb25UaW1lLkxJVkUsIHJldmVyc2VkKTsKKworICAgICAgICBpZiAocmV2ZXJzZWQpCisgICAgICAgICAgICByZXR1cm4gbmV3IFNTVGFibGVSZXZlcnNlZEl0ZXJhdG9yKHRoaXMsIGRhdGFGaWxlSW5wdXQsIGtleSwgaW5kZXhFbnRyeSwgc2xpY2VzLCBzZWxlY3RlZENvbHVtbnMsIHJvd0luZGV4RmlsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgU1NUYWJsZUl0ZXJhdG9yKHRoaXMsIGRhdGFGaWxlSW5wdXQsIGtleSwgaW5kZXhFbnRyeSwgc2xpY2VzLCBzZWxlY3RlZENvbHVtbnMsIHJvd0luZGV4RmlsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElTU1RhYmxlU2Nhbm5lciBnZXRTY2FubmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBCdGlUYWJsZVNjYW5uZXIuZ2V0U2Nhbm5lcih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVNTVGFibGVTY2FubmVyIGdldFNjYW5uZXIoQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+IHJhbmdlcykKKyAgICB7CisgICAgICAgIGlmIChyYW5nZXMgIT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBCdGlUYWJsZVNjYW5uZXIuZ2V0U2Nhbm5lcih0aGlzLCByYW5nZXMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gZ2V0U2Nhbm5lcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJU1NUYWJsZVNjYW5uZXIgZ2V0U2Nhbm5lcihJdGVyYXRvcjxBYnN0cmFjdEJvdW5kczxQYXJ0aXRpb25Qb3NpdGlvbj4+IHJhbmdlSXRlcmF0b3IpCisgICAgeworICAgICAgICByZXR1cm4gQnRpVGFibGVTY2FubmVyLmdldFNjYW5uZXIodGhpcywgcmFuZ2VJdGVyYXRvcik7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ0aVRhYmxlUmVhZGVyIGNsb25lQW5kUmVwbGFjZShJRmlsdGVyIGZpbHRlcikKKyAgICB7CisgICAgICAgIHJldHVybiB1bmJ1aWxkVG8obmV3IEJ1aWxkZXIoZGVzY3JpcHRvcikuc2V0RmlsdGVyKGZpbHRlciksIHRydWUpLmJ1aWxkKG93bmVyKCkub3JFbHNlKG51bGwpLCB0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnRpVGFibGVSZWFkZXIgY2xvbmVXaXRoUmVzdG9yZWRTdGFydChEZWNvcmF0ZWRLZXkgcmVzdG9yZWRTdGFydCkKKyAgICB7CisgICAgICAgIHJldHVybiBydW5XaXRoTG9jayhpZ25vcmVkIC0+IGNsb25lQW5kUmVwbGFjZShyZXN0b3JlZFN0YXJ0LCBPcGVuUmVhc29uLk5PUk1BTCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdGlUYWJsZVJlYWRlciBjbG9uZVdpdGhOZXdTdGFydChEZWNvcmF0ZWRLZXkgbmV3U3RhcnQpCisgICAgeworICAgICAgICByZXR1cm4gcnVuV2l0aExvY2soZCAtPiB7CisgICAgICAgICAgICBhc3NlcnQgb3BlblJlYXNvbiAhPSBPcGVuUmVhc29uLkVBUkxZIDogIkNhbm5vdCBvcGVuIGVhcmx5IGFuIGVhcmx5LW9wZW4gU1NUYWJsZSI7CisgICAgICAgICAgICBpZiAobmV3U3RhcnQuY29tcGFyZVRvKGZpcnN0KSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBkYXRhU3RhcnQgPSBnZXRQb3NpdGlvbihuZXdTdGFydCwgT3BlcmF0b3IuRVEpOworICAgICAgICAgICAgICAgIHJ1bk9uQ2xvc2UoKCkgLT4gZGZpbGUuZHJvcFBhZ2VDYWNoZShkYXRhU3RhcnQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNsb25lQW5kUmVwbGFjZShuZXdTdGFydCwgT3BlblJlYXNvbi5NT1ZFRF9TVEFSVCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb25lIHRoaXMgcmVhZGVyIHdpdGggdGhlIHByb3ZpZGVkIHN0YXJ0IGFuZCBvcGVuIHJlYXNvbiwgYW5kIHNldCB0aGUgY2xvbmUgYXMgcmVwbGFjZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV3Rmlyc3QgdGhlIGZpcnN0IGtleSBmb3IgdGhlIHJlcGxhY2VtZW50ICh3aGljaCBjYW4gYmUgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIGR1ZSB0byB0aGUgcHJlLWVtcHRpdmUKKyAgICAgKiAgICAgICAgICAgICAgICAgb3BlbmluZyBvZiBjb21wYWN0aW9uIHJlc3VsdHMpLgorICAgICAqIEBwYXJhbSByZWFzb24gICB0aGUge0Bjb2RlIE9wZW5SZWFzb259IGZvciB0aGUgcmVwbGFjZW1lbnQuCisgICAgICogQHJldHVybiB0aGUgY2xvbmVkIHJlYWRlci4gVGhhdCByZWFkZXIgaXMgc2V0IGFzIGEgcmVwbGFjZW1lbnQgYnkgdGhlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ0aVRhYmxlUmVhZGVyIGNsb25lQW5kUmVwbGFjZShEZWNvcmF0ZWRLZXkgbmV3Rmlyc3QsIE9wZW5SZWFzb24gcmVhc29uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVuYnVpbGRUbyhuZXcgQnVpbGRlcihkZXNjcmlwdG9yKSwgdHJ1ZSkKKyAgICAgICAgICAgICAgIC5zZXRGaXJzdChuZXdGaXJzdCkKKyAgICAgICAgICAgICAgIC5zZXRPcGVuUmVhc29uKHJlYXNvbikKKyAgICAgICAgICAgICAgIC5idWlsZChvd25lcigpLm9yRWxzZShudWxsKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERlY29yYXRlZEtleSBmaXJzdEtleUJleW9uZChQYXJ0aXRpb25Qb3NpdGlvbiB0b2tlbikKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBUcmllSW5kZXhFbnRyeSBwb3MgPSBnZXRSb3dJbmRleEVudHJ5KHRva2VuLCBPcGVyYXRvci5HVCwgdHJ1ZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuTk9PUF9MSVNURU5FUik7CisgICAgICAgICAgICBpZiAocG9zID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHRyeSAoRmlsZURhdGFJbnB1dCBpbiA9IGRmaWxlLmNyZWF0ZVJlYWRlcihwb3MucG9zaXRpb24pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgaW5kZXhLZXkgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVjb3JhdGVLZXkoaW5kZXhLZXkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBtYXJrU3VzcGVjdCgpOworICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKGUsIGRmaWxlLnBhdGgoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlSW5NZW1vcnlDb21wb25lbnRzKCkKKyAgICB7CisgICAgICAgIGNsb3NlSW50ZXJuYWxDb21wb25lbnQocGFydGl0aW9uSW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRXN0aW1hdGlvbkluZm9ybWF0aXZlKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3IgcGFydGl0aW9uSXRlcmF0b3IoQ29sdW1uRmlsdGVyIGNvbHVtbkZpbHRlciwgRGF0YVJhbmdlIGRhdGFSYW5nZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgeworICAgICAgICByZXR1cm4gQnRpVGFibGVTY2FubmVyLmdldFNjYW5uZXIodGhpcywgY29sdW1uRmlsdGVyLCBkYXRhUmFuZ2UsIGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSVZlcmlmaWVyIGdldFZlcmlmaWVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyLCBib29sZWFuIGlzT2ZmbGluZSwgSVZlcmlmaWVyLk9wdGlvbnMgb3B0aW9ucykKKyAgICB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChjZnMubWV0YWRhdGEoKS5lcXVhbHMobWV0YWRhdGEoKSkpOworICAgICAgICByZXR1cm4gbmV3IEJ0aVRhYmxlVmVyaWZpZXIoY2ZzLCB0aGlzLCBvdXRwdXRIYW5kbGVyLCBpc09mZmxpbmUsIG9wdGlvbnMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciBleHRlbmRzIFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyLkJ1aWxkZXI8QnRpVGFibGVSZWFkZXIsIEJ1aWxkZXI+CisgICAgeworICAgICAgICBwcml2YXRlIFBhcnRpdGlvbkluZGV4IHBhcnRpdGlvbkluZGV4OworICAgICAgICBwcml2YXRlIEZpbGVIYW5kbGUgcm93SW5kZXhGaWxlOworCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRSb3dJbmRleEZpbGUoRmlsZUhhbmRsZSByb3dJbmRleEZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucm93SW5kZXhGaWxlID0gcm93SW5kZXhGaWxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQYXJ0aXRpb25JbmRleChQYXJ0aXRpb25JbmRleCBwYXJ0aXRpb25JbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wYXJ0aXRpb25JbmRleCA9IHBhcnRpdGlvbkluZGV4OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFydGl0aW9uSW5kZXggZ2V0UGFydGl0aW9uSW5kZXgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcGFydGl0aW9uSW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRmlsZUhhbmRsZSBnZXRSb3dJbmRleEZpbGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcm93SW5kZXhGaWxlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBCdGlUYWJsZVJlYWRlciBidWlsZEludGVybmFsKE93bmVyIG93bmVyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ0aVRhYmxlUmVhZGVyKHRoaXMsIG93bmVyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTY5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQ29tcHJlc3Npb25NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLktleVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkZpbHRlckNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Tb3J0ZWRUYWJsZVJlYWRlckxvYWRpbmdCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlN0YXRzQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5CdGlGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5WYWxpZGF0aW9uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuVGFibGVNZXRyaWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZpbHRlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCitwdWJsaWMgY2xhc3MgQnRpVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlciBleHRlbmRzIFNvcnRlZFRhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXI8QnRpVGFibGVSZWFkZXIsIEJ0aVRhYmxlUmVhZGVyLkJ1aWxkZXI+Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJ0aVRhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBGaWxlSGFuZGxlLkJ1aWxkZXIgcGFydGl0aW9uSW5kZXhGaWxlQnVpbGRlcjsKKyAgICBwcml2YXRlIEZpbGVIYW5kbGUuQnVpbGRlciByb3dJbmRleEZpbGVCdWlsZGVyOworCisgICAgcHVibGljIEJ0aVRhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIoU1NUYWJsZS5CdWlsZGVyPD8sID8+IGJ1aWxkZXIpCisgICAgeworICAgICAgICBzdXBlcihidWlsZGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgS2V5UmVhZGVyIGJ1aWxkS2V5UmVhZGVyKFRhYmxlTWV0cmljcyB0YWJsZU1ldHJpY3MpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RhdHNDb21wb25lbnQgc3RhdHNDb21wb25lbnQgPSBTdGF0c0NvbXBvbmVudC5sb2FkKGRlc2NyaXB0b3IsIE1ldGFkYXRhVHlwZS5TVEFUUywgTWV0YWRhdGFUeXBlLkhFQURFUiwgTWV0YWRhdGFUeXBlLlZBTElEQVRJT04pOworICAgICAgICByZXR1cm4gY3JlYXRlS2V5UmVhZGVyKHN0YXRzQ29tcG9uZW50LnN0YXRzTWV0YWRhdGEoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBLZXlSZWFkZXIgY3JlYXRlS2V5UmVhZGVyKFN0YXRzTWV0YWRhdGEgc3RhdHNNZXRhZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBjaGVja05vdE51bGwoc3RhdHNNZXRhZGF0YSk7CisKKyAgICAgICAgdHJ5IChQYXJ0aXRpb25JbmRleCBpbmRleCA9IFBhcnRpdGlvbkluZGV4LmxvYWQocGFydGl0aW9uSW5kZXhGaWxlQnVpbGRlcigpLCB0YWJsZU1ldGFkYXRhUmVmLmdldExvY2FsKCkucGFydGl0aW9uZXIsIGZhbHNlKTsKKyAgICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXByZXNzaW9uTWV0YWRhdGEgPSBDb21wcmVzc2lvbkluZm9Db21wb25lbnQubWF5YmVMb2FkKGRlc2NyaXB0b3IsIGNvbXBvbmVudHMpOworICAgICAgICAgICAgIEZpbGVIYW5kbGUgZEZpbGUgPSBkYXRhRmlsZUJ1aWxkZXIoc3RhdHNNZXRhZGF0YSkud2l0aENvbXByZXNzaW9uTWV0YWRhdGEoY29tcHJlc3Npb25NZXRhZGF0YSkuY29tcGxldGUoKTsKKyAgICAgICAgICAgICBGaWxlSGFuZGxlIHJpRmlsZSA9IHJvd0luZGV4RmlsZUJ1aWxkZXIoKS5jb21wbGV0ZSgpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUGFydGl0aW9uSXRlcmF0b3IuY3JlYXRlKGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU1ldGFkYXRhUmVmLmdldExvY2FsKCkucGFydGl0aW9uZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZEZpbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb3BlbkNvbXBvbmVudHMoQnRpVGFibGVSZWFkZXIuQnVpbGRlciBidWlsZGVyLCBTU1RhYmxlLk93bmVyIG93bmVyLCBib29sZWFuIHZhbGlkYXRlLCBib29sZWFuIG9ubGluZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdHNDb21wb25lbnQgc3RhdHNDb21wb25lbnQgPSBTdGF0c0NvbXBvbmVudC5sb2FkKGRlc2NyaXB0b3IsIE1ldGFkYXRhVHlwZS5TVEFUUywgTWV0YWRhdGFUeXBlLlZBTElEQVRJT04sIE1ldGFkYXRhVHlwZS5IRUFERVIpOworICAgICAgICAgICAgYnVpbGRlci5zZXRTZXJpYWxpemF0aW9uSGVhZGVyKHN0YXRzQ29tcG9uZW50LnNlcmlhbGl6YXRpb25IZWFkZXIoYnVpbGRlci5nZXRUYWJsZU1ldGFkYXRhUmVmKCkuZ2V0TG9jYWwoKSkpOworICAgICAgICAgICAgY2hlY2tBcmd1bWVudCghb25saW5lIHx8IGJ1aWxkZXIuZ2V0U2VyaWFsaXphdGlvbkhlYWRlcigpICE9IG51bGwpOworCisgICAgICAgICAgICBidWlsZGVyLnNldFN0YXRzTWV0YWRhdGEoc3RhdHNDb21wb25lbnQuc3RhdHNNZXRhZGF0YSgpKTsKKyAgICAgICAgICAgIFZhbGlkYXRpb25NZXRhZGF0YSB2YWxpZGF0aW9uTWV0YWRhdGEgPSBzdGF0c0NvbXBvbmVudC52YWxpZGF0aW9uTWV0YWRhdGEoKTsKKyAgICAgICAgICAgIHZhbGlkYXRlUGFydGl0aW9uZXIoYnVpbGRlci5nZXRUYWJsZU1ldGFkYXRhUmVmKCkuZ2V0TG9jYWwoKSwgdmFsaWRhdGlvbk1ldGFkYXRhKTsKKworICAgICAgICAgICAgYm9vbGVhbiBmaWx0ZXJOZWVkZWQgPSBvbmxpbmU7CisgICAgICAgICAgICBpZiAoZmlsdGVyTmVlZGVkKQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0RmlsdGVyKGxvYWRGaWx0ZXIodmFsaWRhdGlvbk1ldGFkYXRhKSk7CisgICAgICAgICAgICBib29sZWFuIHJlYnVpbGRGaWx0ZXIgPSBmaWx0ZXJOZWVkZWQgJiYgYnVpbGRlci5nZXRGaWx0ZXIoKSA9PSBudWxsOworCisgICAgICAgICAgICBpZiAoYnVpbGRlci5nZXRDb21wb25lbnRzKCkuY29udGFpbnMoQ29tcG9uZW50cy5QQVJUSVRJT05fSU5ERVgpICYmIGJ1aWxkZXIuZ2V0Q29tcG9uZW50cygpLmNvbnRhaW5zKENvbXBvbmVudHMuUk9XX0lOREVYKSAmJiByZWJ1aWxkRmlsdGVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJlc291cmNlIiwgIlJlZHVuZGFudFN1cHByZXNzaW9uIiB9KQorICAgICAgICAgICAgICAgIElGaWx0ZXIgZmlsdGVyID0gYnVpbGRCbG9vbUZpbHRlcihzdGF0c0NvbXBvbmVudC5zdGF0c01ldGFkYXRhKCkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0RmlsdGVyKGZpbHRlcik7CisgICAgICAgICAgICAgICAgRmlsdGVyQ29tcG9uZW50LnNhdmUoZmlsdGVyLCBkZXNjcmlwdG9yLCBmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChidWlsZGVyLmdldEZpbHRlcigpID09IG51bGwpCisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRGaWx0ZXIoRmlsdGVyRmFjdG9yeS5BbHdheXNQcmVzZW50KTsKKworICAgICAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0Q29tcG9uZW50cygpLmNvbnRhaW5zKENvbXBvbmVudHMuUk9XX0lOREVYKSkKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFJvd0luZGV4RmlsZShyb3dJbmRleEZpbGVCdWlsZGVyKCkuY29tcGxldGUoKSk7CisKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLnZlcnNpb24uaGFzS2V5UmFuZ2UoKSAmJiBidWlsZGVyLmdldFN0YXRzTWV0YWRhdGEoKSAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IHRhYmxlTWV0YWRhdGFSZWYuZ2V0TG9jYWwoKS5wYXJ0aXRpb25lcjsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldEZpcnN0KHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KGJ1aWxkZXIuZ2V0U3RhdHNNZXRhZGF0YSgpLmZpcnN0S2V5KSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRMYXN0KHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KGJ1aWxkZXIuZ2V0U3RhdHNNZXRhZGF0YSgpLmxhc3RLZXkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0Q29tcG9uZW50cygpLmNvbnRhaW5zKENvbXBvbmVudHMuUEFSVElUSU9OX0lOREVYKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldFBhcnRpdGlvbkluZGV4KG9wZW5QYXJ0aXRpb25JbmRleChidWlsZGVyLmdldEZpbHRlcigpLmlzSW5mb3JtYXRpdmUoKSkpOworICAgICAgICAgICAgICAgIGlmIChidWlsZGVyLmdldEZpcnN0KCkgPT0gbnVsbCB8fCBidWlsZGVyLmdldExhc3QoKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRGaXJzdChidWlsZGVyLmdldFBhcnRpdGlvbkluZGV4KCkuZmlyc3RLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0TGFzdChidWlsZGVyLmdldFBhcnRpdGlvbkluZGV4KCkubGFzdEtleSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSAoQ29tcHJlc3Npb25NZXRhZGF0YSBjb21wcmVzc2lvbk1ldGFkYXRhID0gQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50Lm1heWJlTG9hZChkZXNjcmlwdG9yLCBjb21wb25lbnRzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLnNldERhdGFGaWxlKGRhdGFGaWxlQnVpbGRlcihidWlsZGVyLmdldFN0YXRzTWV0YWRhdGEoKSkud2l0aENvbXByZXNzaW9uTWV0YWRhdGEoY29tcHJlc3Npb25NZXRhZGF0YSkuY29tcGxldGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIHwgUnVudGltZUV4Y2VwdGlvbiB8IEVycm9yIGV4KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbiBjYXNlIG9mIGZhaWx1cmUsIGNsb3NlIG9ubHkgdGhvc2UgY29tcG9uZW50cyB3aGljaCBoYXZlIGJlZW4gb3BlbmVkIGluIHRoaXMgdHJ5LWNhdGNoIGJsb2NrCisgICAgICAgICAgICBUaHJvd2FibGVzLmNsb3NlQW5kQWRkU3VwcHJlc3NlZChleCwgYnVpbGRlci5nZXRQYXJ0aXRpb25JbmRleCgpLCBidWlsZGVyLmdldFJvd0luZGV4RmlsZSgpLCBidWlsZGVyLmdldERhdGFGaWxlKCksIGJ1aWxkZXIuZ2V0RmlsdGVyKCkpOworICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIElGaWx0ZXIgYnVpbGRCbG9vbUZpbHRlcihTdGF0c01ldGFkYXRhIHN0YXRzTWV0YWRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSUZpbHRlciBiZiA9IG51bGw7CisKKyAgICAgICAgdHJ5IChLZXlSZWFkZXIga2V5UmVhZGVyID0gY3JlYXRlS2V5UmVhZGVyKHN0YXRzTWV0YWRhdGEpKQorICAgICAgICB7CisgICAgICAgICAgICBiZiA9IEZpbHRlckZhY3RvcnkuZ2V0RmlsdGVyKHN0YXRzTWV0YWRhdGEudG90YWxSb3dzLCB0YWJsZU1ldGFkYXRhUmVmLmdldExvY2FsKCkucGFyYW1zLmJsb29tRmlsdGVyRnBDaGFuY2UpOworCisgICAgICAgICAgICB3aGlsZSAoIWtleVJlYWRlci5pc0V4aGF1c3RlZCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSB0YWJsZU1ldGFkYXRhUmVmLmdldExvY2FsKCkucGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoa2V5UmVhZGVyLmtleSgpKTsKKyAgICAgICAgICAgICAgICBiZi5hZGQoa2V5KTsKKworICAgICAgICAgICAgICAgIGtleVJlYWRlci5hZHZhbmNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIHwgUnVudGltZUV4Y2VwdGlvbiB8IEVycm9yIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBUaHJvd2FibGVzLmNsb3NlQW5kQWRkU3VwcHJlc3NlZChleCwgYmYpOworICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYmY7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYXJ0aXRpb25JbmRleCBvcGVuUGFydGl0aW9uSW5kZXgoYm9vbGVhbiBwcmVsb2FkKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBpbmRleEZpbGUgPSBwYXJ0aXRpb25JbmRleEZpbGVCdWlsZGVyKCkuY29tcGxldGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFBhcnRpdGlvbkluZGV4LmxvYWQoaW5kZXhGaWxlLCB0YWJsZU1ldGFkYXRhUmVmLmdldExvY2FsKCkucGFydGl0aW9uZXIsIHByZWxvYWQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJQYXJ0aXRpb24gaW5kZXggZmlsZSBpcyBjb3JydXB0ZWQ6ICIgKyBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5QQVJUSVRJT05fSU5ERVgpLCBleCk7CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRmlsZUhhbmRsZS5CdWlsZGVyIHJvd0luZGV4RmlsZUJ1aWxkZXIoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHJvd0luZGV4RmlsZUJ1aWxkZXIgPT0gbnVsbCB8fCByb3dJbmRleEZpbGVCdWlsZGVyLmZpbGUuZXF1YWxzKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlJPV19JTkRFWCkpOworCisgICAgICAgIGlmIChyb3dJbmRleEZpbGVCdWlsZGVyID09IG51bGwpCisgICAgICAgICAgICByb3dJbmRleEZpbGVCdWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5ST1dfSU5ERVgpKTsKKworICAgICAgICByb3dJbmRleEZpbGVCdWlsZGVyLndpdGhDaHVua0NhY2hlKGNodW5rQ2FjaGUpOworICAgICAgICByb3dJbmRleEZpbGVCdWlsZGVyLm1tYXBwZWQoaW9PcHRpb25zLmluZGV4RGlza0FjY2Vzc01vZGUpOworCisgICAgICAgIHJldHVybiByb3dJbmRleEZpbGVCdWlsZGVyOworICAgIH0KKworICAgIHByaXZhdGUgRmlsZUhhbmRsZS5CdWlsZGVyIHBhcnRpdGlvbkluZGV4RmlsZUJ1aWxkZXIoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHBhcnRpdGlvbkluZGV4RmlsZUJ1aWxkZXIgPT0gbnVsbCB8fCBwYXJ0aXRpb25JbmRleEZpbGVCdWlsZGVyLmZpbGUuZXF1YWxzKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlBBUlRJVElPTl9JTkRFWCkpOworCisgICAgICAgIGlmIChwYXJ0aXRpb25JbmRleEZpbGVCdWlsZGVyID09IG51bGwpCisgICAgICAgICAgICBwYXJ0aXRpb25JbmRleEZpbGVCdWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5QQVJUSVRJT05fSU5ERVgpKTsKKworICAgICAgICBwYXJ0aXRpb25JbmRleEZpbGVCdWlsZGVyLndpdGhDaHVua0NhY2hlKGNodW5rQ2FjaGUpOworICAgICAgICBwYXJ0aXRpb25JbmRleEZpbGVCdWlsZGVyLm1tYXBwZWQoaW9PcHRpb25zLmluZGV4RGlza0FjY2Vzc01vZGUpOworCisgICAgICAgIHJldHVybiBwYXJ0aXRpb25JbmRleEZpbGVCdWlsZGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlUYWJsZVNjYW5uZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlUYWJsZVNjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWY4NjJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aVRhYmxlU2Nhbm5lci5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGk7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmF0b3JzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGF0YVJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ2x1c3RlcmluZ0luZGV4RmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkFic3RyYWN0Qm91bmRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKKworcHVibGljIGNsYXNzIEJ0aVRhYmxlU2Nhbm5lciBleHRlbmRzIFNTVGFibGVTY2FubmVyPEJ0aVRhYmxlUmVhZGVyLCBUcmllSW5kZXhFbnRyeSwgQnRpVGFibGVTY2FubmVyLkJ0aVNjYW5uaW5nSXRlcmF0b3I+Cit7CisgICAgLy8gRnVsbCBzY2FuIG9mIHRoZSBzc3RhYmxlcworICAgIHB1YmxpYyBzdGF0aWMgQnRpVGFibGVTY2FubmVyIGdldFNjYW5uZXIoQnRpVGFibGVSZWFkZXIgc3N0YWJsZSkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRTY2FubmVyKHNzdGFibGUsIEl0ZXJhdG9ycy5zaW5nbGV0b25JdGVyYXRvcihmdWxsUmFuZ2Uoc3N0YWJsZSkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJ0aVRhYmxlU2Nhbm5lciBnZXRTY2FubmVyKEJ0aVRhYmxlUmVhZGVyIHNzdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgY29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFSYW5nZSBkYXRhUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQnRpVGFibGVTY2FubmVyKHNzdGFibGUsIGNvbHVtbnMsIGRhdGFSYW5nZSwgbWFrZUJvdW5kcyhzc3RhYmxlLCBkYXRhUmFuZ2UpLml0ZXJhdG9yKCksIGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJ0aVRhYmxlU2Nhbm5lciBnZXRTY2FubmVyKEJ0aVRhYmxlUmVhZGVyIHNzdGFibGUsIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiB0b2tlblJhbmdlcykKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRTY2FubmVyKHNzdGFibGUsIG1ha2VCb3VuZHMoc3N0YWJsZSwgdG9rZW5SYW5nZXMpLml0ZXJhdG9yKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQnRpVGFibGVTY2FubmVyIGdldFNjYW5uZXIoQnRpVGFibGVSZWFkZXIgc3N0YWJsZSwgSXRlcmF0b3I8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiByYW5nZUl0ZXJhdG9yKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdGlUYWJsZVNjYW5uZXIoc3N0YWJsZSwgQ29sdW1uRmlsdGVyLmFsbChzc3RhYmxlLm1ldGFkYXRhKCkpLCBudWxsLCByYW5nZUl0ZXJhdG9yLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5OT09QX0xJU1RFTkVSKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ0aVRhYmxlU2Nhbm5lcihCdGlUYWJsZVJlYWRlciBzc3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlciBjb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFSYW5nZSBkYXRhUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PiByYW5nZUl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQorICAgIHsKKyAgICAgICAgc3VwZXIoc3N0YWJsZSwgY29sdW1ucywgZGF0YVJhbmdlLCByYW5nZUl0ZXJhdG9yLCBsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgZG9DbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRmlsZVV0aWxzLmNsb3NlKGRmaWxlLCBpdGVyYXRvcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEJ0aVNjYW5uaW5nSXRlcmF0b3IgZG9DcmVhdGVJdGVyYXRvcigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEJ0aVNjYW5uaW5nSXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgY2xhc3MgQnRpU2Nhbm5pbmdJdGVyYXRvciBleHRlbmRzIFNTVGFibGVTY2FubmVyPEJ0aVRhYmxlUmVhZGVyLCBUcmllSW5kZXhFbnRyeSwgQnRpVGFibGVTY2FubmVyLkJ0aVNjYW5uaW5nSXRlcmF0b3I+LkJhc2VLZXlTY2FubmluZ0l0ZXJhdG9yIGltcGxlbWVudHMgQ2xvc2VhYmxlCisgICAgeworICAgICAgICBwcml2YXRlIFBhcnRpdGlvbkl0ZXJhdG9yIGl0ZXJhdG9yOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmVwYXJlVG9JdGVyYXRlUm93KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdGFydFNjYW4gIT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzU2Nhbm5lZCArPSBnZXRDdXJyZW50UG9zaXRpb24oKSAtIHN0YXJ0U2NhbjsKKworICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEVudHJ5ID0gaXRlcmF0b3IuZW50cnkoKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudEtleSA9IGl0ZXJhdG9yLmRlY29yYXRlZEtleSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEVudHJ5ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmFkdmFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyB0cnkgbmV4dCByYW5nZQorICAgICAgICAgICAgICAgIGlmICghcmFuZ2VJdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBpdGVyYXRvciA9IHNzdGFibGUuY292ZXJlZEtleXNJdGVyYXRvcihyYW5nZUl0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBnZXRSb3dJdGVyYXRvcihUcmllSW5kZXhFbnRyeSBpbmRleEVudHJ5LCBEZWNvcmF0ZWRLZXkga2V5KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGF0YVJhbmdlID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNzdGFibGUuc2ltcGxlSXRlcmF0b3IoZGZpbGUsIGtleSwgaW5kZXhFbnRyeS5wb3NpdGlvbiwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdJbmRleEZpbHRlciBmaWx0ZXIgPSBkYXRhUmFuZ2UuY2x1c3RlcmluZ0luZGV4RmlsdGVyKGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNzdGFibGUucm93SXRlcmF0b3IoZGZpbGUsIGtleSwgaW5kZXhFbnRyeSwgZmlsdGVyLmdldFNsaWNlcyhCdGlUYWJsZVNjYW5uZXIudGhpcy5tZXRhZGF0YSgpKSwgY29sdW1ucywgZmlsdGVyLmlzUmV2ZXJzZWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOyAgLy8gY2FuJ3QgdGhyb3cKKyAgICAgICAgICAgIGlmIChpdGVyYXRvciAhPSBudWxsKQorICAgICAgICAgICAgICAgIGl0ZXJhdG9yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpVGFibGVTY3J1YmJlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aVRhYmxlU2NydWJiZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzhlZDdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aVRhYmxlU2NydWJiZXIuamF2YQpAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5JT0Vycm9yOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTY3J1YmJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZXdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Tb3J0ZWRUYWJsZVNjcnViYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5CdGlGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CisKK3B1YmxpYyBjbGFzcyBCdGlUYWJsZVNjcnViYmVyIGV4dGVuZHMgU29ydGVkVGFibGVTY3J1YmJlcjxCdGlUYWJsZVJlYWRlcj4gaW1wbGVtZW50cyBJU2NydWJiZXIKK3sKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNJbmRleDsKKyAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0VHlwZTw/PiBwYXJ0aXRpb25LZXlUeXBlOworICAgIHByaXZhdGUgU2NydWJQYXJ0aXRpb25JdGVyYXRvciBpbmRleEl0ZXJhdG9yOworCisgICAgcHVibGljIEJ0aVRhYmxlU2NydWJiZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dEhhbmRsZXIgb3V0cHV0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU2NydWJiZXIuT3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgc3VwZXIoY2ZzLCB0cmFuc2FjdGlvbiwgb3V0cHV0SGFuZGxlciwgb3B0aW9ucyk7CisKKyAgICAgICAgYm9vbGVhbiBoYXNJbmRleEZpbGUgPSBzc3RhYmxlLmdldENvbXBvbmVudHMoKS5jb250YWlucyhDb21wb25lbnRzLlBBUlRJVElPTl9JTkRFWCk7CisgICAgICAgIHRoaXMuaXNJbmRleCA9IGNmcy5pc0luZGV4KCk7CisgICAgICAgIHRoaXMucGFydGl0aW9uS2V5VHlwZSA9IGNmcy5tZXRhZGF0YS5nZXQoKS5wYXJ0aXRpb25LZXlUeXBlOworICAgICAgICBpZiAoIWhhc0luZGV4RmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gaWYgdGhlcmUncyBhbnkgY29ycnVwdGlvbiBpbiB0aGUgLURhdGEuZGIgdGhlbiBwYXJ0aXRpb25zIGNhbid0IGJlIHNraXBwZWQgb3Zlci4gYnV0IGl0J3Mgd29ydGggYSBzaG90LgorICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCJNaXNzaW5nIGluZGV4IGNvbXBvbmVudCIpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW5kZXhJdGVyYXRvciA9IGhhc0luZGV4RmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBvcGVuSW5kZXhJdGVyYXRvcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiRGV0ZWN0ZWQgY29ycnVwdGlvbiBpbiB0aGUgaW5kZXggZmlsZSAtIGNhbm5vdCBvcGVuIGluZGV4IGl0ZXJhdG9yIiwgZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTY3J1YlBhcnRpdGlvbkl0ZXJhdG9yIG9wZW5JbmRleEl0ZXJhdG9yKCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3N0YWJsZS5zY3J1YlBhcnRpdGlvbnNJdGVyYXRvcigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKHQsICJJbmRleCBpcyB1bnJlYWRhYmxlLCBzY3J1YmJpbmcgd2lsbCBjb250aW51ZSB3aXRob3V0IGluZGV4LiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkUm93SXRlcmF0b3Igd2l0aFZhbGlkYXRpb24oVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXIsIFN0cmluZyBmaWxlbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBvcHRpb25zLmNoZWNrRGF0YSAmJiAhaXNJbmRleCA/IFVuZmlsdGVyZWRSb3dJdGVyYXRvcnMud2l0aFZhbGlkYXRpb24oaXRlciwgZmlsZW5hbWUpIDogaXRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzY3J1YkludGVybmFsKFNTVGFibGVSZXdyaXRlciB3cml0ZXIpCisgICAgeworICAgICAgICBpZiAoaW5kZXhBdmFpbGFibGUoKSAmJiBpbmRleEl0ZXJhdG9yLmRhdGFQb3NpdGlvbigpICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2FybigiRmlyc3QgcG9zaXRpb24gcmVwb3J0ZWQgYnkgaW5kZXggc2hvdWxkIGJlIDAsIHdhcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEl0ZXJhdG9yLmRhdGFQb3NpdGlvbigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBjb250aW51aW5nIHdpdGhvdXQgaW5kZXguIik7CisgICAgICAgICAgICBpbmRleEl0ZXJhdG9yLmNsb3NlKCk7CisgICAgICAgICAgICBpbmRleEl0ZXJhdG9yID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIERlY29yYXRlZEtleSBwcmV2S2V5ID0gbnVsbDsKKworICAgICAgICB3aGlsZSAoIWRhdGFGaWxlLmlzRU9GKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzY3J1YkluZm8uaXNTdG9wUmVxdWVzdGVkKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbihzY3J1YkluZm8uZ2V0Q29tcGFjdGlvbkluZm8oKSk7CisKKyAgICAgICAgICAgIC8vIHBvc2l0aW9uIGluIGEgZGF0YSBmaWxlIHdoZXJlIHRoZSBwYXJ0aXRpb24gc3RhcnRzCisgICAgICAgICAgICBsb25nIGRhdGFTdGFydCA9IGRhdGFGaWxlLmdldEZpbGVQb2ludGVyKCk7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLmRlYnVnKCJSZWFkaW5nIHJvdyBhdCAlZCIsIGRhdGFTdGFydCk7CisKKyAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBudWxsOworICAgICAgICAgICAgVGhyb3dhYmxlIGtleVJlYWRFcnJvciA9IG51bGw7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHJhdyA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoZGF0YUZpbGUpOworICAgICAgICAgICAgICAgIGlmICghaXNJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uS2V5VHlwZS52YWxpZGF0ZShyYXcpOworICAgICAgICAgICAgICAgIGtleSA9IHNzdGFibGUuZGVjb3JhdGVLZXkocmF3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga2V5UmVhZEVycm9yID0gdGg7CisgICAgICAgICAgICAgICAgdGhyb3dJZkZhdGFsKHRoKTsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgbnVsbCBrZXkgYmVsb3cKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcG9zaXRpb24gb2YgdGhlIHBhcnRpdGlvbiBpbiBhIGRhdGEgZmlsZSwgaXQgcG9pbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhcnRpdGlvbiBrZXkKKyAgICAgICAgICAgIGxvbmcgZGF0YVN0YXJ0RnJvbUluZGV4ID0gLTE7CisgICAgICAgICAgICAvLyBzaXplIG9mIHRoZSBwYXJ0aXRpb24gKGluY2x1ZGluZyBwYXJ0aXRpb24ga2V5KQorICAgICAgICAgICAgbG9uZyBkYXRhU2l6ZUZyb21JbmRleCA9IC0xOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBjdXJyZW50SW5kZXhLZXkgPSBudWxsOworICAgICAgICAgICAgaWYgKGluZGV4QXZhaWxhYmxlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VycmVudEluZGV4S2V5ID0gaW5kZXhJdGVyYXRvci5rZXkoKTsKKyAgICAgICAgICAgICAgICBkYXRhU3RhcnRGcm9tSW5kZXggPSBpbmRleEl0ZXJhdG9yLmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgICAgIGlmICghaW5kZXhJdGVyYXRvci5pc0V4aGF1c3RlZCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4SXRlcmF0b3IuYWR2YW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmRleEl0ZXJhdG9yLmlzRXhoYXVzdGVkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemVGcm9tSW5kZXggPSBpbmRleEl0ZXJhdG9yLmRhdGFQb3NpdGlvbigpIC0gZGF0YVN0YXJ0RnJvbUluZGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdGgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93SWZGYXRhbCh0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4odGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhZHZhbmNlIHRvIHRoZSBuZXh0IGluZGV4IHBvc2l0aW9uLiBJbmRleCBpcyBjb3JydXB0ZWQuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb250aW51aW5nIHdpdGhvdXQgdGhlIGluZGV4LiBMYXN0IHBvc2l0aW9uIHJlYWQgaXMgJWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEl0ZXJhdG9yLmRhdGFQb3NpdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4SXRlcmF0b3IuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4SXRlcmF0b3IgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEluZGV4S2V5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTdGFydEZyb21JbmRleCA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemVGcm9tSW5kZXggPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGtleU5hbWUgPSBrZXkgPT0gbnVsbCA/ICIodW5yZWFkYWJsZSBrZXkpIiA6IGtleVN0cmluZyhrZXkpOworICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5kZWJ1ZygicGFydGl0aW9uICVzIGlzICVzIiwga2V5TmFtZSwgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoZGF0YVNpemVGcm9tSW5kZXgpKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FcnJvcihuZXcgSU9FeGNlcHRpb24oIlVuYWJsZSB0byByZWFkIHBhcnRpdGlvbiBrZXkgZnJvbSBkYXRhIGZpbGUiLCBrZXlSZWFkRXJyb3IpKTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXhLZXkgIT0gbnVsbCAmJiAha2V5LmdldEtleSgpLmVxdWFscyhjdXJyZW50SW5kZXhLZXkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXJyb3IobmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIktleSBmcm9tIGRhdGEgZmlsZSAoJXMpIGRvZXMgbm90IG1hdGNoIGtleSBmcm9tIGluZGV4IGZpbGUgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoa2V5LmdldEtleSgpKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChjdXJyZW50SW5kZXhLZXkpKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbmRleEl0ZXJhdG9yICE9IG51bGwgJiYgZGF0YVNpemVGcm9tSW5kZXggPiBkYXRhRmlsZS5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXJyb3IobmV3IElPRXhjZXB0aW9uKCJJbXBvc3NpYmxlIHBhcnRpdGlvbiBzaXplIChncmVhdGVyIHRoYW4gZmlsZSBsZW5ndGgpOiAiICsgZGF0YVNpemVGcm9tSW5kZXgpKTsKKworICAgICAgICAgICAgICAgIGlmIChpbmRleEl0ZXJhdG9yICE9IG51bGwgJiYgZGF0YVN0YXJ0ICE9IGRhdGFTdGFydEZyb21JbmRleCkKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCJEYXRhIGZpbGUgcGFydGl0aW9uIHBvc2l0aW9uICVkIGRpZmZlcnMgZnJvbSBpbmRleCBmaWxlIHJvdyBwb3NpdGlvbiAlZCIsIGRhdGFTdGFydCwgZGF0YVN0YXJ0RnJvbUluZGV4KTsKKworICAgICAgICAgICAgICAgIGlmICh0cnlBcHBlbmQocHJldktleSwga2V5LCB3cml0ZXIpKQorICAgICAgICAgICAgICAgICAgICBwcmV2S2V5ID0ga2V5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvd0lmRmF0YWwodGgpOworICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0aCwgIkVycm9yIHJlYWRpbmcgcGFydGl0aW9uICVzIChzdGFja3RyYWNlIGZvbGxvd3MpOiIsIGtleU5hbWUpOworCisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleEtleSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIChrZXkgPT0gbnVsbCB8fCAha2V5LmdldEtleSgpLmVxdWFscyhjdXJyZW50SW5kZXhLZXkpIHx8IGRhdGFTdGFydCAhPSBkYXRhU3RhcnRGcm9tSW5kZXgpKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiB3aGVyZSB0aGUgcm93IHNob3VsZCBzdGFydCBpbiBhIGRhdGEgZmlsZSAocmlnaHQgYWZ0ZXIgdGhlIHBhcnRpdGlvbiBrZXkpCisgICAgICAgICAgICAgICAgICAgIGxvbmcgcm93U3RhcnRGcm9tSW5kZXggPSBkYXRhU3RhcnRGcm9tSW5kZXggKyBUeXBlU2l6ZXMuU0hPUlRfU0laRSArIGN1cnJlbnRJbmRleEtleS5yZW1haW5pbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci5vdXRwdXQoIlJldHJ5aW5nIGZyb20gcGFydGl0aW9uIGluZGV4OyBkYXRhIGlzICVzIGJ5dGVzIHN0YXJ0aW5nIGF0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemVGcm9tSW5kZXgsIHJvd1N0YXJ0RnJvbUluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gc3N0YWJsZS5kZWNvcmF0ZUtleShjdXJyZW50SW5kZXhLZXkpOworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0luZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbktleVR5cGUudmFsaWRhdGUoa2V5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWxlLnNlZWsocm93U3RhcnRGcm9tSW5kZXgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJ5QXBwZW5kKHByZXZLZXksIGtleSwgd3JpdGVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2S2V5ID0ga2V5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdGgyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd0lmRmF0YWwodGgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93SWZDYW5ub3RDb250aW51ZShrZXksIHRoMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0aDIsICJSZXRyeSBmYWlsZWQgdG9vLiBTa2lwcGluZyB0byBuZXh0IHBhcnRpdGlvbiAocmV0cnkncyBzdGFja3RyYWNlIGZvbGxvd3MpIik7CisgICAgICAgICAgICAgICAgICAgICAgICBiYWRQYXJ0aXRpb25zKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlZWtUb05leHRQYXJ0aXRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvd0lmQ2Fubm90Q29udGludWUoa2V5LCB0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgYmFkUGFydGl0aW9ucysrOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhJdGVyYXRvciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIlBhcnRpdGlvbiBzdGFydGluZyBhdCBwb3NpdGlvbiAlZCBpcyB1bnJlYWRhYmxlOyBza2lwcGluZyB0byBuZXh0IiwgZGF0YVN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2Vla1RvTmV4dFBhcnRpdGlvbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKCJVbnJlY292ZXJhYmxlIGVycm9yIHdoaWxlIHNjcnViYmluZyAlcy4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2NydWJiaW5nIGNhbm5vdCBjb250aW51ZS4gVGhlIHNzdGFibGUgd2lsbCBiZSBtYXJrZWQgZm9yIGRlbGV0aW9uLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91IGNhbiBhdHRlbXB0IG1hbnVhbCByZWNvdmVyeSBmcm9tIHRoZSBwcmUtc2NydWIgc25hcHNob3QuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgY2FuIGFsc28gcnVuIG5vZGV0b29sIHJlcGFpciB0byB0cmFuc2ZlciB0aGUgZGF0YSBmcm9tIGEgaGVhbHRoeSByZXBsaWNhLCBpZiBhbnkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gd2F5IHRvIHJlc3luYyBhbmQgY29udGludWUuIEdpdmUgdXAuCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBib29sZWFuIGluZGV4QXZhaWxhYmxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmRleEl0ZXJhdG9yICE9IG51bGwgJiYgIWluZGV4SXRlcmF0b3IuaXNFeGhhdXN0ZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gc2Vla1RvTmV4dFBhcnRpdGlvbigpCisgICAgeworICAgICAgICB3aGlsZSAoaW5kZXhBdmFpbGFibGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBuZXh0Um93UG9zaXRpb25Gcm9tSW5kZXggPSBpbmRleEl0ZXJhdG9yLmRhdGFQb3NpdGlvbigpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYXRhRmlsZS5zZWVrKG5leHRSb3dQb3NpdGlvbkZyb21JbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93SWZGYXRhbCh0aCk7CisgICAgICAgICAgICAgICAgb3V0cHV0SGFuZGxlci53YXJuKHRoLCAiRmFpbGVkIHRvIHNlZWsgdG8gbmV4dCByb3cgcG9zaXRpb24gJWQiLCBuZXh0Um93UG9zaXRpb25Gcm9tSW5kZXgpOworICAgICAgICAgICAgICAgIGJhZFBhcnRpdGlvbnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5kZXhJdGVyYXRvci5hZHZhbmNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dHB1dEhhbmRsZXIud2Fybih0aCwgIkZhaWxlZCB0byBnbyB0byB0aGUgbmV4dCBlbnRyeSBpbiBpbmRleCIpOworICAgICAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMuY2xlYW5lZCh0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGhyb3dJZkNhbm5vdENvbnRpbnVlKERlY29yYXRlZEtleSBrZXksIFRocm93YWJsZSB0aCkKKyAgICB7CisgICAgICAgIGlmIChpc0luZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRIYW5kbGVyLndhcm4oIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHNjcnViYmluZyB0aGUgcGFydGl0aW9uIHdpdGgga2V5ICclcycgZm9yIGFuIGluZGV4IHRhYmxlLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2NydWJiaW5nIHdpbGwgYWJvcnQgZm9yIHRoaXMgdGFibGUgYW5kIHRoZSBpbmRleCB3aWxsIGJlIHJlYnVpbHQuIiwga2V5U3RyaW5nKGtleSkpOworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXJyb3IodGgpOworICAgICAgICB9CisKKyAgICAgICAgc3VwZXIudGhyb3dJZkNhbm5vdENvbnRpbnVlKGtleSwgdGgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIGZpbGVBY2Nlc3NMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkoZGF0YUZpbGUpOworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShpbmRleEl0ZXJhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGVBY2Nlc3NMb2NrLndyaXRlTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aVRhYmxlVmVyaWZpZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlUYWJsZVZlcmlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyNWFmOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlUYWJsZVZlcmlmaWVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVZlcmlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNvcnRlZFRhYmxlVmVyaWZpZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKKworcHVibGljIGNsYXNzIEJ0aVRhYmxlVmVyaWZpZXIgZXh0ZW5kcyBTb3J0ZWRUYWJsZVZlcmlmaWVyPEJ0aVRhYmxlUmVhZGVyPiBpbXBsZW1lbnRzIElWZXJpZmllcgoreworICAgIHB1YmxpYyBCdGlUYWJsZVZlcmlmaWVyKENvbHVtbkZhbWlseVN0b3JlIGNmcywgQnRpVGFibGVSZWFkZXIgc3N0YWJsZSwgT3V0cHV0SGFuZGxlciBvdXRwdXRIYW5kbGVyLCBib29sZWFuIGlzT2ZmbGluZSwgT3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgc3VwZXIoY2ZzLCBzc3RhYmxlLCBvdXRwdXRIYW5kbGVyLCBpc09mZmxpbmUsIG9wdGlvbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeVBhcnRpdGlvbihEZWNvcmF0ZWRLZXkga2V5LCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IpCisgICAgeworICAgICAgICAvLyBUaGUgdHJpZSB3cml0ZXJzIGFib3J0IGlmIHN1cHBsaWVkIHdpdGggYmFkbHkgb3JkZXJlZCBvciBkdXBsaWNhdGUgcm93IGtleXMuIFZlcmlmaWNhdGlvbiBpcyBub3QgbmVjZXNzYXJ5LgorICAgICAgICAvLyBuby1vcCwganVzdCBvcGVuIGFuZCBjbG9zZSBwYXJ0aXRpb24uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aVRhYmxlV3JpdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvQnRpVGFibGVXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTM0M2ZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aVRhYmxlV3JpdGVyLmphdmEKQEAgLTAsMCArMSw0MjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZU5ld1RyYWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNSZWFkRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RSb3dJbmRleEVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuRGF0YUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5JbmRleENvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXIuT3BlblJlYXNvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Tb3J0ZWRUYWJsZVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGkuQnRpRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuTW1hcHBlZFJlZ2lvbnNDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2s7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KVk1TdGFiaWxpdHlJbnNwZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlRyYW5zYWN0aW9uYWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlLkJ1aWxkZXIuTk9fTEVOR1RIX09WRVJSSURFOworCisvKioKKyAqIFdyaXRlcyBTU1RhYmxlcyBpbiBCVEkgZm9ybWF0IChzZWUge0BsaW5rIEJ0aUZvcm1hdH0pLCB3aGljaCBjYW4gYmUgcmVhZCBieSB7QGxpbmsgQnRpVGFibGVSZWFkZXJ9LgorICovCitAVmlzaWJsZUZvclRlc3RpbmcKK3B1YmxpYyBjbGFzcyBCdGlUYWJsZVdyaXRlciBleHRlbmRzIFNvcnRlZFRhYmxlV3JpdGVyPEJ0aUZvcm1hdFBhcnRpdGlvbldyaXRlcj4KK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQnRpVGFibGVXcml0ZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBCdGlGb3JtYXRQYXJ0aXRpb25Xcml0ZXIgcGFydGl0aW9uV3JpdGVyOworICAgIHByaXZhdGUgZmluYWwgSW5kZXhXcml0ZXIgaXdyaXRlcjsKKworICAgIHB1YmxpYyBCdGlUYWJsZVdyaXRlcihCdWlsZGVyIGJ1aWxkZXIsIExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlciwgU1NUYWJsZS5Pd25lciBvd25lcikKKyAgICB7CisgICAgICAgIHN1cGVyKGJ1aWxkZXIsIGxpZmVjeWNsZU5ld1RyYWNrZXIsIG93bmVyKTsKKyAgICAgICAgdGhpcy5pd3JpdGVyID0gYnVpbGRlci5nZXRJbmRleFdyaXRlcigpOworICAgICAgICB0aGlzLnBhcnRpdGlvbldyaXRlciA9IGJ1aWxkZXIuZ2V0UGFydGl0aW9uV3JpdGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbWFyaygpCisgICAgeworICAgICAgICBzdXBlci5tYXJrKCk7CisgICAgICAgIGl3cml0ZXIubWFyaygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0QW5kVHJ1bmNhdGUoKQorICAgIHsKKyAgICAgICAgc3VwZXIucmVzZXRBbmRUcnVuY2F0ZSgpOworICAgICAgICBpd3JpdGVyLnJlc2V0QW5kVHJ1bmNhdGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVHJpZUluZGV4RW50cnkgY3JlYXRlUm93SW5kZXhFbnRyeShEZWNvcmF0ZWRLZXkga2V5LCBEZWxldGlvblRpbWUgcGFydGl0aW9uTGV2ZWxEZWxldGlvbiwgbG9uZyBmaW5pc2hSZXN1bHQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgVHJpZUluZGV4RW50cnkgZW50cnkgPSBUcmllSW5kZXhFbnRyeS5jcmVhdGUocGFydGl0aW9uV3JpdGVyLmdldEluaXRpYWxQb3NpdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbkxldmVsRGVsZXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbldyaXRlci5nZXRSb3dJbmRleEJsb2NrQ291bnQoKSk7CisgICAgICAgIGl3cml0ZXIuYXBwZW5kKGtleSwgZW50cnkpOworICAgICAgICByZXR1cm4gZW50cnk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJyZXNvdXJjZSIsICJSZWR1bmRhbnRTdXBwcmVzc2lvbiJ9KQorICAgIHByaXZhdGUgQnRpVGFibGVSZWFkZXIgb3BlbkludGVybmFsKE9wZW5SZWFzb24gb3BlblJlYXNvbiwgYm9vbGVhbiBpc0ZpbmFsLCBTdXBwbGllcjxQYXJ0aXRpb25JbmRleD4gcGFydGl0aW9uSW5kZXhTdXBwbGllcikKKyAgICB7CisgICAgICAgIElGaWx0ZXIgZmlsdGVyID0gbnVsbDsKKyAgICAgICAgRmlsZUhhbmRsZSBkYXRhRmlsZSA9IG51bGw7CisgICAgICAgIFBhcnRpdGlvbkluZGV4IHBhcnRpdGlvbkluZGV4ID0gbnVsbDsKKyAgICAgICAgRmlsZUhhbmRsZSByb3dJbmRleEZpbGUgPSBudWxsOworCisgICAgICAgIEJ0aVRhYmxlUmVhZGVyLkJ1aWxkZXIgYnVpbGRlciA9IHVuYnVpbGRUbyhuZXcgQnRpVGFibGVSZWFkZXIuQnVpbGRlcihkZXNjcmlwdG9yKSwgdHJ1ZSkuc2V0TWF4RGF0YUFnZShtYXhEYXRhQWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoaGVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE9wZW5SZWFzb24ob3BlblJlYXNvbik7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0U3RhdHNNZXRhZGF0YShzdGF0c01ldGFkYXRhKCkpOworCisgICAgICAgICAgICBwYXJ0aXRpb25JbmRleCA9IHBhcnRpdGlvbkluZGV4U3VwcGxpZXIuZ2V0KCk7CisgICAgICAgICAgICByb3dJbmRleEZpbGUgPSBpd3JpdGVyLnJvd0luZGV4RkhCdWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgICAgICBkYXRhRmlsZSA9IG9wZW5EYXRhRmlsZShpc0ZpbmFsID8gTk9fTEVOR1RIX09WRVJSSURFIDogZGF0YVdyaXRlci5nZXRMYXN0Rmx1c2hPZmZzZXQoKSwgYnVpbGRlci5nZXRTdGF0c01ldGFkYXRhKCkpOworICAgICAgICAgICAgZmlsdGVyID0gaXdyaXRlci5nZXRGaWx0ZXJDb3B5KCk7CisKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnNldFBhcnRpdGlvbkluZGV4KHBhcnRpdGlvbkluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Rmlyc3QocGFydGl0aW9uSW5kZXguZmlyc3RLZXkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhc3QocGFydGl0aW9uSW5kZXgubGFzdEtleSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Um93SW5kZXhGaWxlKHJvd0luZGV4RmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldERhdGFGaWxlKGRhdGFGaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmlsdGVyKGZpbHRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKG93bmVyKCkub3JFbHNlKG51bGwpLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB8IEVycm9yIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBKVk1TdGFiaWxpdHlJbnNwZWN0b3IuaW5zcGVjdFRocm93YWJsZShleCk7CisgICAgICAgICAgICBUaHJvd2FibGVzLmNsb3NlTm9uTnVsbEFuZEFkZFN1cHByZXNzZWQoZXgsIGZpbHRlciwgZGF0YUZpbGUsIHJvd0luZGV4RmlsZSwgcGFydGl0aW9uSW5kZXgpOworICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvcGVuRWFybHkoQ29uc3VtZXI8U1NUYWJsZVJlYWRlcj4gY2FsbFdoZW5SZWFkeSkKKyAgICB7CisgICAgICAgIGxvbmcgZGF0YUxlbmd0aCA9IGRhdGFXcml0ZXIucG9zaXRpb24oKTsKKyAgICAgICAgaXdyaXRlci5idWlsZFBhcnRpYWwoZGF0YUxlbmd0aCwgcGFydGl0aW9uSW5kZXggLT4KKyAgICAgICAgeworICAgICAgICAgICAgaXdyaXRlci5yb3dJbmRleEZIQnVpbGRlci53aXRoTGVuZ3RoT3ZlcnJpZGUoaXdyaXRlci5yb3dJbmRleFdyaXRlci5nZXRMYXN0Rmx1c2hPZmZzZXQoKSk7CisgICAgICAgICAgICBCdGlUYWJsZVJlYWRlciByZWFkZXIgPSBvcGVuSW50ZXJuYWwoT3BlblJlYXNvbi5FQVJMWSwgZmFsc2UsICgpIC0+IHBhcnRpdGlvbkluZGV4KTsKKyAgICAgICAgICAgIGNhbGxXaGVuUmVhZHkuYWNjZXB0KHJlYWRlcik7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIG9wZW5GaW5hbEVhcmx5KCkKKyAgICB7CisgICAgICAgIC8vIHdlIG11c3QgZW5zdXJlIHRoZSBkYXRhIGlzIGNvbXBsZXRlbHkgZmx1c2hlZCB0byBkaXNrCisgICAgICAgIGl3cml0ZXIuY29tcGxldGUoKTsgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBieSBjb21wbGV0ZWRQYXJ0aXRpb25JbmRleCgpIGJlbG93IHRvbywgYnV0IHdlIHdhbnQgaXQgZG9uZSBub3cgdG8KKyAgICAgICAgLy8gZW5zdXJlIG91dHN0YW5kaW5nIG9wZW5FYXJseSBhY3Rpb25zIGFyZSBub3QgdHJpZ2dlcmVkLgorICAgICAgICBkYXRhV3JpdGVyLnN5bmMoKTsKKyAgICAgICAgaXdyaXRlci5yb3dJbmRleFdyaXRlci5zeW5jKCk7CisgICAgICAgIC8vIE5vdGU6IE5vdGhpbmcgbXVzdCBiZSB3cml0dGVuIHRvIGFueSBvZiB0aGUgZmlsZXMgYWZ0ZXIgdGhpcyBwb2ludCwgYXMgdGhlIGNodW5rIGNhY2hlIGNvdWxkIHBpY2sgdXAgYW5kCisgICAgICAgIC8vIHJldGFpbiBhIHBhcnRpYWxseS13cml0dGVuIHBhZ2UuCisKKyAgICAgICAgcmV0dXJuIG9wZW5GaW5hbChPcGVuUmVhc29uLkVBUkxZKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InJlc291cmNlIiwgIlJlZHVuZGFudFN1cHByZXNzaW9uIn0pCisgICAgcHJvdGVjdGVkIFNTVGFibGVSZWFkZXIgb3BlbkZpbmFsKE9wZW5SZWFzb24gb3BlblJlYXNvbikKKyAgICB7CisKKyAgICAgICAgaWYgKG1heERhdGFBZ2UgPCAwKQorICAgICAgICAgICAgbWF4RGF0YUFnZSA9IENsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIHJldHVybiBvcGVuSW50ZXJuYWwob3BlblJlYXNvbiwgdHJ1ZSwgaXdyaXRlcjo6Y29tcGxldGVkUGFydGl0aW9uSW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUcmFuc2FjdGlvbmFsUHJveHkgdHhuUHJveHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbmFsUHJveHkoKCkgLT4gRkJVdGlsaXRpZXMuaW1tdXRhYmxlTGlzdFdpdGhGaWx0ZXJlZE51bGxzKGl3cml0ZXIsIGRhdGFXcml0ZXIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFRyYW5zYWN0aW9uYWxQcm94eSBleHRlbmRzIFNvcnRlZFRhYmxlV3JpdGVyPEJ0aUZvcm1hdFBhcnRpdGlvbldyaXRlcj4uVHJhbnNhY3Rpb25hbFByb3h5CisgICAgeworICAgICAgICBwdWJsaWMgVHJhbnNhY3Rpb25hbFByb3h5KFN1cHBsaWVyPEltbXV0YWJsZUxpc3Q8VHJhbnNhY3Rpb25hbD4+IHRyYW5zYWN0aW9uYWxzKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcih0cmFuc2FjdGlvbmFscyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRocm93YWJsZSBkb1Bvc3RDbGVhbnVwKFRocm93YWJsZSBhY2N1bXVsYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBhY2N1bXVsYXRlID0gVGhyb3dhYmxlcy5jbG9zZShhY2N1bXVsYXRlLCBwYXJ0aXRpb25Xcml0ZXIpOworICAgICAgICAgICAgYWNjdW11bGF0ZSA9IHN1cGVyLmRvUG9zdENsZWFudXAoYWNjdW11bGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gYWNjdW11bGF0ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY2Fwc3VsYXRlcyB3cml0aW5nIHRoZSBpbmRleCBhbmQgZmlsdGVyIGZvciBhbiBTU1RhYmxlLiBUaGUgc3RhdGUgb2YgdGhpcyBvYmplY3QgaXMgbm90IHZhbGlkIHVudGlsIGl0IGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgSW5kZXhXcml0ZXIgZXh0ZW5kcyBTb3J0ZWRUYWJsZVdyaXRlci5BYnN0cmFjdEluZGV4V3JpdGVyCisgICAgeworICAgICAgICBmaW5hbCBTZXF1ZW50aWFsV3JpdGVyIHJvd0luZGV4V3JpdGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIEZpbGVIYW5kbGUuQnVpbGRlciByb3dJbmRleEZIQnVpbGRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXF1ZW50aWFsV3JpdGVyIHBhcnRpdGlvbkluZGV4V3JpdGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIEZpbGVIYW5kbGUuQnVpbGRlciBwYXJ0aXRpb25JbmRleEZIQnVpbGRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXJ0aXRpb25JbmRleEJ1aWxkZXIgcGFydGl0aW9uSW5kZXg7CisgICAgICAgIGJvb2xlYW4gcGFydGl0aW9uSW5kZXhDb21wbGV0ZWQgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBEYXRhUG9zaXRpb24gcmlNYXJrOworICAgICAgICBwcml2YXRlIERhdGFQb3NpdGlvbiBwaU1hcms7CisKKyAgICAgICAgSW5kZXhXcml0ZXIoQnVpbGRlciBiKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihiKTsKKyAgICAgICAgICAgIHJvd0luZGV4V3JpdGVyID0gbmV3IFNlcXVlbnRpYWxXcml0ZXIoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUk9XX0lOREVYKSwgYi5nZXRJT09wdGlvbnMoKS53cml0ZXJPcHRpb25zKTsKKyAgICAgICAgICAgIHJvd0luZGV4RkhCdWlsZGVyID0gSW5kZXhDb21wb25lbnQuZmlsZUJ1aWxkZXIoQ29tcG9uZW50cy5ST1dfSU5ERVgsIGIpLndpdGhNbWFwcGVkUmVnaW9uc0NhY2hlKGIuZ2V0TW1hcHBlZFJlZ2lvbnNDYWNoZSgpKTsKKyAgICAgICAgICAgIHBhcnRpdGlvbkluZGV4V3JpdGVyID0gbmV3IFNlcXVlbnRpYWxXcml0ZXIoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuUEFSVElUSU9OX0lOREVYKSwgYi5nZXRJT09wdGlvbnMoKS53cml0ZXJPcHRpb25zKTsKKyAgICAgICAgICAgIHBhcnRpdGlvbkluZGV4RkhCdWlsZGVyID0gSW5kZXhDb21wb25lbnQuZmlsZUJ1aWxkZXIoQ29tcG9uZW50cy5QQVJUSVRJT05fSU5ERVgsIGIpLndpdGhNbWFwcGVkUmVnaW9uc0NhY2hlKGIuZ2V0TW1hcHBlZFJlZ2lvbnNDYWNoZSgpKTsKKyAgICAgICAgICAgIHBhcnRpdGlvbkluZGV4ID0gbmV3IFBhcnRpdGlvbkluZGV4QnVpbGRlcihwYXJ0aXRpb25JbmRleFdyaXRlciwgcGFydGl0aW9uSW5kZXhGSEJ1aWxkZXIpOworICAgICAgICAgICAgLy8gcmVnaXN0ZXIgbGlzdGVuZXJzIHRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBmaWxlcyBhcmUgZmx1c2hlZAorICAgICAgICAgICAgcGFydGl0aW9uSW5kZXhXcml0ZXIuc2V0UG9zdEZsdXNoTGlzdGVuZXIoKCkgLT4gcGFydGl0aW9uSW5kZXgubWFya1BhcnRpdGlvbkluZGV4U3luY2VkKHBhcnRpdGlvbkluZGV4V3JpdGVyLmdldExhc3RGbHVzaE9mZnNldCgpKSk7CisgICAgICAgICAgICByb3dJbmRleFdyaXRlci5zZXRQb3N0Rmx1c2hMaXN0ZW5lcigoKSAtPiBwYXJ0aXRpb25JbmRleC5tYXJrUm93SW5kZXhTeW5jZWQocm93SW5kZXhXcml0ZXIuZ2V0TGFzdEZsdXNoT2Zmc2V0KCkpKTsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsicmVzb3VyY2UiLCAiUmVkdW5kYW50U3VwcHJlc3Npb24ifSkKKyAgICAgICAgICAgIFNlcXVlbnRpYWxXcml0ZXIgZGF0YVdyaXRlciA9IGIuZ2V0RGF0YVdyaXRlcigpOworICAgICAgICAgICAgZGF0YVdyaXRlci5zZXRQb3N0Rmx1c2hMaXN0ZW5lcigoKSAtPiBwYXJ0aXRpb25JbmRleC5tYXJrRGF0YVN5bmNlZChkYXRhV3JpdGVyLmdldExhc3RGbHVzaE9mZnNldCgpKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBhcHBlbmQoRGVjb3JhdGVkS2V5IGtleSwgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGluZGV4RW50cnkpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBiZi5hZGQoa2V5KTsKKyAgICAgICAgICAgIGxvbmcgcG9zaXRpb247CisgICAgICAgICAgICBpZiAoaW5kZXhFbnRyeS5pc0luZGV4ZWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGluZGV4U3RhcnQgPSByb3dJbmRleFdyaXRlci5wb3NpdGlvbigpOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGgoa2V5LmdldEtleSgpLCByb3dJbmRleFdyaXRlcik7CisgICAgICAgICAgICAgICAgICAgICgoVHJpZUluZGV4RW50cnkpIGluZGV4RW50cnkpLnNlcmlhbGl6ZShyb3dJbmRleFdyaXRlciwgcm93SW5kZXhXcml0ZXIucG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCByb3dJbmRleFdyaXRlci5nZXRGaWxlKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJ3cm90ZSBpbmRleCBlbnRyeToge30gYXQge30iLCBpbmRleEVudHJ5LCBpbmRleFN0YXJ0KTsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGluZGV4U3RhcnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gV3JpdGUgZGF0YSBwb3NpdGlvbiBkaXJlY3RseSBpbiB0cmllLgorICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gfmluZGV4RW50cnkucG9zaXRpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJ0aXRpb25JbmRleC5hZGRFbnRyeShrZXksIHBvc2l0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJ1aWxkUGFydGlhbChsb25nIGRhdGFQb3NpdGlvbiwgQ29uc3VtZXI8UGFydGl0aW9uSW5kZXg+IGNhbGxXaGVuUmVhZHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJ0aXRpb25JbmRleC5idWlsZFBhcnRpYWwoY2FsbFdoZW5SZWFkeSwgcm93SW5kZXhXcml0ZXIucG9zaXRpb24oKSwgZGF0YVBvc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG1hcmsoKQorICAgICAgICB7CisgICAgICAgICAgICByaU1hcmsgPSByb3dJbmRleFdyaXRlci5tYXJrKCk7CisgICAgICAgICAgICBwaU1hcmsgPSBwYXJ0aXRpb25JbmRleFdyaXRlci5tYXJrKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXNldEFuZFRydW5jYXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd2UgY2FuJ3QgdW4tc2V0IHRoZSBibG9vbSBmaWx0ZXIgYWRkaXRpb24sIGJ1dCBleHRyYSBrZXlzIGluIHRoZXJlIGFyZSBoYXJtbGVzcy4KKyAgICAgICAgICAgIC8vIHdlIGNhbid0IHJlc2V0IGRidWlsZGVyIGVpdGhlciwgYnV0IHRoYXQgaXMgdGhlIGxhc3QgdGhpbmcgY2FsbGVkIGluIGFmdGVyIGFwcGVuZCwgc28KKyAgICAgICAgICAgIC8vIHdlIGFzc3VtZSB0aGF0IGlmIHRoYXQgd29ya2VkIHRoZW4gd2Ugd29uJ3QgYmUgdHJ5aW5nIHRvIHJlc2V0LgorICAgICAgICAgICAgcm93SW5kZXhXcml0ZXIucmVzZXRBbmRUcnVuY2F0ZShyaU1hcmspOworICAgICAgICAgICAgcGFydGl0aW9uSW5kZXhXcml0ZXIucmVzZXRBbmRUcnVuY2F0ZShwaU1hcmspOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZG9QcmVwYXJlKCkKKyAgICAgICAgeworICAgICAgICAgICAgZmx1c2hCZigpOworCisgICAgICAgICAgICAvLyB0cnVuY2F0ZSBpbmRleCBmaWxlCisgICAgICAgICAgICByb3dJbmRleFdyaXRlci5wcmVwYXJlVG9Db21taXQoKTsKKyAgICAgICAgICAgIHJvd0luZGV4RkhCdWlsZGVyLndpdGhMZW5ndGhPdmVycmlkZShyb3dJbmRleFdyaXRlci5nZXRMYXN0Rmx1c2hPZmZzZXQoKSk7CisKKyAgICAgICAgICAgIGNvbXBsZXRlKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGNvbXBsZXRlKCkgdGhyb3dzIEZTV3JpdGVFcnJvcgorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGFydGl0aW9uSW5kZXhDb21wbGV0ZWQpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb25JbmRleC5jb21wbGV0ZSgpOworICAgICAgICAgICAgICAgIHBhcnRpdGlvbkluZGV4Q29tcGxldGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgcGFydGl0aW9uSW5kZXhXcml0ZXIuZ2V0RmlsZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFBhcnRpdGlvbkluZGV4IGNvbXBsZXRlZFBhcnRpdGlvbkluZGV4KCkKKyAgICAgICAgeworICAgICAgICAgICAgY29tcGxldGUoKTsKKyAgICAgICAgICAgIHJvd0luZGV4RkhCdWlsZGVyLndpdGhMZW5ndGhPdmVycmlkZSgwKTsKKyAgICAgICAgICAgIHBhcnRpdGlvbkluZGV4RkhCdWlsZGVyLndpdGhMZW5ndGhPdmVycmlkZSgwKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBQYXJ0aXRpb25JbmRleC5sb2FkKHBhcnRpdGlvbkluZGV4RkhCdWlsZGVyLCBtZXRhZGF0YS5nZXRMb2NhbCgpLnBhcnRpdGlvbmVyLCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRlNSZWFkRXJyb3IoZSwgcGFydGl0aW9uSW5kZXhXcml0ZXIuZ2V0RmlsZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBUaHJvd2FibGUgZG9Db21taXQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByb3dJbmRleFdyaXRlci5jb21taXQoYWNjdW11bGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgVGhyb3dhYmxlIGRvQWJvcnQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByb3dJbmRleFdyaXRlci5hYm9ydChhY2N1bXVsYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVGhyb3dhYmxlIGRvUG9zdENsZWFudXAoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUaHJvd2FibGVzLmNsb3NlKGFjY3VtdWxhdGUsIGJmLCBwYXJ0aXRpb25JbmRleCwgcm93SW5kZXhXcml0ZXIsIHBhcnRpdGlvbkluZGV4V3JpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciBleHRlbmRzIFNvcnRlZFRhYmxlV3JpdGVyLkJ1aWxkZXI8QnRpRm9ybWF0UGFydGl0aW9uV3JpdGVyLCBCdGlUYWJsZVdyaXRlciwgQnVpbGRlcj4KKyAgICB7CisgICAgICAgIHByaXZhdGUgU2VxdWVudGlhbFdyaXRlciBkYXRhV3JpdGVyOworICAgICAgICBwcml2YXRlIEJ0aUZvcm1hdFBhcnRpdGlvbldyaXRlciBwYXJ0aXRpb25Xcml0ZXI7CisgICAgICAgIHByaXZhdGUgSW5kZXhXcml0ZXIgaW5kZXhXcml0ZXI7CisgICAgICAgIHByaXZhdGUgTW1hcHBlZFJlZ2lvbnNDYWNoZSBtbWFwcGVkUmVnaW9uc0NhY2hlOworCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKERlc2NyaXB0b3IgZGVzY3JpcHRvcikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGdldHRlcnMgZm9yIHRoZSByZXNvdXJjZXMgb3BlbmVkIGJ5IGJ1aWxkSW50ZXJuYWwgbWV0aG9kIGNhbiBiZSBvbmx5IHVzZWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZgorICAgICAgICAvLyB0aGF0IG1ldGhvZCAtIHRoYXQgaXMsIGR1cmluZyB0aGUgY29uc3RydWN0aW9uIG9mIHRoZSBzc3RhYmxlLgorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTW1hcHBlZFJlZ2lvbnNDYWNoZSBnZXRNbWFwcGVkUmVnaW9uc0NhY2hlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuc3VyaW5nSW5CdWlsZEludGVybmFsQ29udGV4dChtbWFwcGVkUmVnaW9uc0NhY2hlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2VxdWVudGlhbFdyaXRlciBnZXREYXRhV3JpdGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGVuc3VyaW5nSW5CdWlsZEludGVybmFsQ29udGV4dChkYXRhV3JpdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnRpRm9ybWF0UGFydGl0aW9uV3JpdGVyIGdldFBhcnRpdGlvbldyaXRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbnN1cmluZ0luQnVpbGRJbnRlcm5hbENvbnRleHQocGFydGl0aW9uV3JpdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbmRleFdyaXRlciBnZXRJbmRleFdyaXRlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlbnN1cmluZ0luQnVpbGRJbnRlcm5hbENvbnRleHQoaW5kZXhXcml0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSA8VD4gVCBlbnN1cmluZ0luQnVpbGRJbnRlcm5hbENvbnRleHQoVCB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlKHZhbHVlICE9IG51bGwsICJUaGlzIGdldHRlciBjYW4gYmUgdXNlZCBvbmx5IGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIHNzdGFibGUgY29uc3RydWN0b3IuIERvIG5vdCB1c2UgaXQgZGlyZWN0bHkuIik7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkRGVmYXVsdENvbXBvbmVudHMoKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5hZGREZWZhdWx0Q29tcG9uZW50cygpOworCisgICAgICAgICAgICBhZGRDb21wb25lbnRzKEltbXV0YWJsZVNldC5vZihDb21wb25lbnRzLlBBUlRJVElPTl9JTkRFWCwgQ29tcG9uZW50cy5ST1dfSU5ERVgpKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEJ0aVRhYmxlV3JpdGVyIGJ1aWxkSW50ZXJuYWwoTGlmZWN5Y2xlTmV3VHJhY2tlciBsaWZlY3ljbGVOZXdUcmFja2VyLCBPd25lciBvd25lcikKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbW1hcHBlZFJlZ2lvbnNDYWNoZSA9IG5ldyBNbWFwcGVkUmVnaW9uc0NhY2hlKCk7CisgICAgICAgICAgICAgICAgZGF0YVdyaXRlciA9IERhdGFDb21wb25lbnQuYnVpbGRXcml0ZXIoZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUYWJsZU1ldGFkYXRhUmVmKCkuZ2V0TG9jYWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJT09wdGlvbnMoKS53cml0ZXJPcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE1ldGFkYXRhQ29sbGVjdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlmZWN5Y2xlTmV3VHJhY2tlci5vcFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJT09wdGlvbnMoKS5mbHVzaENvbXByZXNzaW9uKTsKKworICAgICAgICAgICAgICAgIGluZGV4V3JpdGVyID0gbmV3IEluZGV4V3JpdGVyKHRoaXMpOworICAgICAgICAgICAgICAgIHBhcnRpdGlvbldyaXRlciA9IG5ldyBCdGlGb3JtYXRQYXJ0aXRpb25Xcml0ZXIoZ2V0U2VyaWFsaXphdGlvbkhlYWRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGFibGVNZXRhZGF0YVJlZigpLmdldExvY2FsKCkuY29tcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFXcml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFdyaXRlci5yb3dJbmRleFdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudmVyc2lvbik7CisKKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnRpVGFibGVXcml0ZXIodGhpcywgbGlmZWN5Y2xlTmV3VHJhY2tlciwgb3duZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gfCBFcnJvciBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGVzLmNsb3NlQW5kQWRkU3VwcHJlc3NlZChleCwgcGFydGl0aW9uV3JpdGVyLCBpbmRleFdyaXRlciwgZGF0YVdyaXRlciwgbW1hcHBlZFJlZ2lvbnNDYWNoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFydGl0aW9uV3JpdGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbmRleFdyaXRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgZGF0YVdyaXRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgbW1hcHBlZFJlZ2lvbnNDYWNoZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUGFydGl0aW9uSW5kZXguamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9QYXJ0aXRpb25JbmRleC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYTM0MzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUGFydGl0aW9uSW5kZXguamF2YQpAQCAtMCwwICsxLDQ1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXMuU2VyaWFsaXphdGlvbk5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXMuVHJpZU5vZGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXMuVHJpZVNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXMuVmFsdWVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllcy5XYWxrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlBhZ2VBd2FyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJlYnVmZmVyZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TaXplZEludHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuU2hhcmVkQ2xvc2VhYmxlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaG9sZHMgdGhlIHBhcnRpdGlvbiBpbmRleCBhcyBhbiBvbi1kaXNrIHRyaWUgbWFwcGluZyB1bmlxdWUgcHJlZml4ZXMgb2YgZGVjb3JhdGVkIGtleXMgdG86CisgKiA8dWw+CisgKiAgICAgPGxpPmRhdGEgZmlsZSBwb3NpdGlvbiBpZiB0aGUgcGFydGl0aW9uIGlzIHNtYWxsIGVub3VnaCB0byBub3QgbmVlZCBhbiBpbmRleAorICogICAgIDxsaT5yb3cgaW5kZXggZmlsZSBwb3NpdGlvbiBpZiB0aGUgcGFydGl0aW9uIGhhcyBhIHJvdyBpbmRleAorICogPC91bD5wbHVzPHVsPgorICogICAgIDxsaT50aGUgbGFzdCA4IGJpdHMgb2YgdGhlIGtleSdzIGZpbHRlciBoYXNoIHdoaWNoIGlzIHVzZWQgdG8gZmlsdGVyIG91dCBtaXNtYXRjaGVkIGtleXMgd2l0aG91dCByZWFkaW5nIHRoZSBrZXkKKyAqIDwvdWw+CisgKiBUbyBhdm9pZCBoYXZpbmcgdG8gY3JlYXRlIGFuIG9iamVjdCB0byBjYXJyeSB0aGUgcmVzdWx0LCB0aGUgdHdvIGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHNpZ24uIERpcmVjdC10by1kZmlsZSBlbnRyaWVzCisgKiBhcmUgcmVjb3JkZWQgYXMgfnBvc2l0aW9uICh+IGluc3RlYWQgb2YgLSB0byBkaWZmZXJlbnRpYXRlIDAgaW4gaWZpbGUgZnJvbSAwIGluIGRmaWxlKS4KKyAqIDxwPgorICogSW4gZWl0aGVyIGNhc2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0IHRoaXMgcG9zaXRpb24gc3RhcnQgd2l0aCBhIHNlcmlhbGl6YXRpb24gb2YgdGhlIGtleSB3aGljaCBjYW4gYmUgdXNlZAorICogdG8gdmVyaWZ5IHRoZSBjb3JyZWN0IGtleSBpcyBmb3VuZC4KKyAqIDxwPgorICogVGhlIGluZGV4ZXMgYXJlIGNyZWF0ZWQgYnkge0BsaW5rIFBhcnRpdGlvbkluZGV4QnVpbGRlcn0uIFRvIHJlYWQgdGhlIGluZGV4IG9uZSBtdXN0IG9idGFpbiBhIHRocmVhZC11bnNhZmUKKyAqIHtAbGluayBSZWFkZXJ9IG9yIHtAbGluayBJbmRleFBvc0l0ZXJhdG9yfS4KKyAqLworQFZpc2libGVGb3JUZXN0aW5nCitwdWJsaWMgY2xhc3MgUGFydGl0aW9uSW5kZXggaW1wbGVtZW50cyBTaGFyZWRDbG9zZWFibGUKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGFydGl0aW9uSW5kZXguY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlSGFuZGxlIGZoOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBrZXlDb3VudDsKKyAgICBwcml2YXRlIGZpbmFsIERlY29yYXRlZEtleSBmaXJzdDsKKyAgICBwcml2YXRlIGZpbmFsIERlY29yYXRlZEtleSBsYXN0OworICAgIHByaXZhdGUgZmluYWwgbG9uZyByb290OworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE5PVF9GT1VORCA9IExvbmcuTUlOX1ZBTFVFOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPT1RFUl9MRU5HVEggPSAzICogODsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19IQVNfSEFTSF9CWVRFID0gODsKKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBQYXJ0aXRpb25JbmRleChGaWxlSGFuZGxlIGZoLCBsb25nIHRyaWVSb290LCBsb25nIGtleUNvdW50LCBEZWNvcmF0ZWRLZXkgZmlyc3QsIERlY29yYXRlZEtleSBsYXN0KQorICAgIHsKKyAgICAgICAgdGhpcy5rZXlDb3VudCA9IGtleUNvdW50OworICAgICAgICB0aGlzLmZoID0gZmguc2hhcmVkQ29weSgpOworICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7CisgICAgICAgIHRoaXMubGFzdCA9IGxhc3Q7CisgICAgICAgIHRoaXMucm9vdCA9IHRyaWVSb290OworICAgIH0KKworICAgIHByaXZhdGUgUGFydGl0aW9uSW5kZXgoUGFydGl0aW9uSW5kZXggc3JjKQorICAgIHsKKyAgICAgICAgdGhpcyhzcmMuZmgsIHNyYy5yb290LCBzcmMua2V5Q291bnQsIHNyYy5maXJzdCwgc3JjLmxhc3QpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBQYXlsb2FkCisgICAgeworICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uOworICAgICAgICBmaW5hbCBzaG9ydCBoYXNoQml0czsKKworICAgICAgICBwdWJsaWMgUGF5bG9hZChsb25nIHBvc2l0aW9uLCBzaG9ydCBoYXNoQml0cykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICAgICAgYXNzZXJ0IHRoaXMucG9zaXRpb24gIT0gTk9UX0ZPVU5EIDogIlBhcnRpdGlvbiBwb3NpdGlvbiAiICsgTk9UX0ZPVU5EICsgIiBpcyBub3QgdmFsaWQuIjsKKyAgICAgICAgICAgIHRoaXMuaGFzaEJpdHMgPSBoYXNoQml0czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBQYXJ0aXRpb25JbmRleFNlcmlhbGl6ZXIgVFJJRV9TRVJJQUxJWkVSID0gbmV3IFBhcnRpdGlvbkluZGV4U2VyaWFsaXplcigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFydGl0aW9uSW5kZXhTZXJpYWxpemVyIGltcGxlbWVudHMgVHJpZVNlcmlhbGl6ZXI8UGF5bG9hZCwgRGF0YU91dHB1dFBsdXM+CisgICAgeworICAgICAgICBwdWJsaWMgaW50IHNpemVvZk5vZGUoU2VyaWFsaXphdGlvbk5vZGU8UGF5bG9hZD4gbm9kZSwgbG9uZyBub2RlUG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBUcmllTm9kZS50eXBlRm9yKG5vZGUsIG5vZGVQb3NpdGlvbikuc2l6ZW9mTm9kZShub2RlKSArCisgICAgICAgICAgICAgICAgICAgKG5vZGUucGF5bG9hZCgpICE9IG51bGwgPyAxICsgU2l6ZWRJbnRzLm5vblplcm9TaXplKG5vZGUucGF5bG9hZCgpLnBvc2l0aW9uKSA6IDApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKERhdGFPdXRwdXRQbHVzIGRlc3QsIFNlcmlhbGl6YXRpb25Ob2RlPFBheWxvYWQ+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGUoZGVzdCwgVHJpZU5vZGUudHlwZUZvcihub2RlLCBub2RlUG9zaXRpb24pLCBub2RlLCBub2RlUG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlKERhdGFPdXRwdXRQbHVzIGRlc3QsIFRyaWVOb2RlIHR5cGUsIFNlcmlhbGl6YXRpb25Ob2RlPFBheWxvYWQ+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgUGF5bG9hZCBwYXlsb2FkID0gbm9kZS5wYXlsb2FkKCk7CisgICAgICAgICAgICBpZiAocGF5bG9hZCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzaXplID0gU2l6ZWRJbnRzLm5vblplcm9TaXplKHBheWxvYWQucG9zaXRpb24pOworICAgICAgICAgICAgICAgIC8vIFRoZSByZWFkZXIgc3VwcG9ydHMgcGF5bG9hZHMgYm90aCB3aXRoIChwYXlsb2FkQml0cyBiZXR3ZWVuIDggYW5kIDE1KSBhbmQgd2l0aG91dCAocGF5bG9hZEJpdHMKKyAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuIDEgYW5kIDcpIGhhc2guIFRvIG5vdCBpbnRyb2R1Y2UgdW5kdWUgY29uZmlndXJhdGlvbiBjb21wbGV4aXR5LCB3ZSBhbHdheXMgd3JpdGUgYSBoYXNoLgorICAgICAgICAgICAgICAgIGludCBwYXlsb2FkQml0cyA9IEZMQUdfSEFTX0hBU0hfQllURSArIChzaXplIC0gMSk7CisgICAgICAgICAgICAgICAgdHlwZS5zZXJpYWxpemUoZGVzdCwgbm9kZSwgcGF5bG9hZEJpdHMsIG5vZGVQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUocGF5bG9hZC5oYXNoQml0cyk7CisgICAgICAgICAgICAgICAgU2l6ZWRJbnRzLndyaXRlKGRlc3QsIHBheWxvYWQucG9zaXRpb24sIHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHR5cGUuc2VyaWFsaXplKGRlc3QsIG5vZGUsIDAsIG5vZGVQb3NpdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBzaXplKCkKKyAgICB7CisgICAgICAgIHJldHVybiBrZXlDb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IGZpcnN0S2V5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBmaXJzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IGxhc3RLZXkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxhc3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhcnRpdGlvbkluZGV4IHNoYXJlZENvcHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25JbmRleCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRUbyhSZWYuSWRlbnRpdHlDb2xsZWN0aW9uIGlkZW50aXRpZXMpCisgICAgeworICAgICAgICBmaC5hZGRUbyhpZGVudGl0aWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFBhcnRpdGlvbkluZGV4IGxvYWQoRmlsZUhhbmRsZS5CdWlsZGVyIGZoQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHByZWxvYWQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gZmhCdWlsZGVyLmNvbXBsZXRlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsb2FkKGZoLCBwYXJ0aXRpb25lciwgcHJlbG9hZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFBhaXI8RGVjb3JhdGVkS2V5LCBEZWNvcmF0ZWRLZXk+IHJlYWRGaXJzdEFuZExhc3RLZXkoRmlsZSBmaWxlLCBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChQYXJ0aXRpb25JbmRleCBpbmRleCA9IGxvYWQobmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmaWxlKSwgcGFydGl0aW9uZXIsIGZhbHNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKGluZGV4LmZpcnN0S2V5KCksIGluZGV4Lmxhc3RLZXkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFBhcnRpdGlvbkluZGV4IGxvYWQoRmlsZUhhbmRsZSBmaCwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyLCBib29sZWFuIHByZWxvYWQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChGaWxlRGF0YUlucHV0IHJkciA9IGZoLmNyZWF0ZVJlYWRlcihmaC5kYXRhTGVuZ3RoKCkgLSBGT09URVJfTEVOR1RIKSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBmaXJzdFBvcyA9IHJkci5yZWFkTG9uZygpOworICAgICAgICAgICAgbG9uZyBrZXlDb3VudCA9IHJkci5yZWFkTG9uZygpOworICAgICAgICAgICAgbG9uZyByb290ID0gcmRyLnJlYWRMb25nKCk7CisgICAgICAgICAgICByZHIuc2VlayhmaXJzdFBvcyk7CisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZmlyc3QgPSBwYXJ0aXRpb25lciAhPSBudWxsID8gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChyZHIpKSA6IG51bGw7CisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgbGFzdCA9IHBhcnRpdGlvbmVyICE9IG51bGwgPyBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKHJkcikpIDogbnVsbDsKKyAgICAgICAgICAgIGlmIChwcmVsb2FkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjc3VtID0gMDsKKyAgICAgICAgICAgICAgICAvLyBmb3JjZSBhIHJlYWQgb2YgYWxsIHRoZSBwYWdlcyBvZiB0aGUgaW5kZXgKKyAgICAgICAgICAgICAgICBmb3IgKGxvbmcgcG9zID0gMDsgcG9zIDwgZmguZGF0YUxlbmd0aCgpOyBwb3MgKz0gUGFnZUF3YXJlLlBBR0VfU0laRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJkci5zZWVrKHBvcyk7CisgICAgICAgICAgICAgICAgICAgIGNzdW0gKz0gcmRyLnJlYWRCeXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiQ2hlY2tzdW0ge30iLCBjc3VtKTsgICAgICAvLyBOb3RlOiB0cmFjZSBpcyByZXF1aXJlZCBzbyB0aGF0IHJlYWRzIGFyZW4ndCBvcHRpbWl6ZWQgYXdheS4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25JbmRleChmaCwgcm9vdCwga2V5Q291bnQsIGZpcnN0LCBsYXN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIGZoLmNsb3NlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRocm93YWJsZSBjbG9zZShUaHJvd2FibGUgYWNjdW11bGF0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBmaC5jbG9zZShhY2N1bXVsYXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVhZGVyIG9wZW5SZWFkZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWFkZXIodGhpcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEluZGV4UG9zSXRlcmF0b3IgYWxsS2V5c0l0ZXJhdG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgSW5kZXhQb3NJdGVyYXRvcih0aGlzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmVidWZmZXJlciBpbnN0YW50aWF0ZVJlYnVmZmVyZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZoLmluc3RhbnRpYXRlUmVidWZmZXJlcihudWxsKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGZpbGUgaGFuZGxlIHRvIHRoZSBmaWxlIG9uIGRpc2suIFRoaXMgaXMgbmVlZGVkIGZvciBsb2NraW5nIHRoZSBpbmRleCBpbiBSQU0uCisgICAgICovCisgICAgRmlsZUhhbmRsZSBnZXRGaWxlSGFuZGxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmaDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldEluZGV4UG9zKEJ5dGVCdWZmZXIgY29udGVudHMsIGludCBwYXlsb2FkUG9zLCBpbnQgYnl0ZXMpCisgICAgeworICAgICAgICBpZiAoYnl0ZXMgPj0gRkxBR19IQVNfSEFTSF9CWVRFKQorICAgICAgICB7CisgICAgICAgICAgICArK3BheWxvYWRQb3M7CisgICAgICAgICAgICBieXRlcyAtPSBGTEFHX0hBU19IQVNIX0JZVEUgLSAxOworICAgICAgICB9CisgICAgICAgIGlmIChieXRlcyA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIE5PVF9GT1VORDsKKyAgICAgICAgcmV0dXJuIFNpemVkSW50cy5yZWFkKGNvbnRlbnRzLCBwYXlsb2FkUG9zLCBieXRlcyk7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBBY2NlcHRvcjxBcmdUeXBlLCBSZXN1bHRUeXBlPgorICAgIHsKKyAgICAgICAgUmVzdWx0VHlwZSBhY2NlcHQobG9uZyBwb3NpdGlvbiwgYm9vbGVhbiBhc3N1bWVOb01hdGNoLCBBcmdUeXBlIHYpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyBtZXRob2RzIHRvIHJlYWQgdGhlIHBhcnRpdGlvbiBpbmRleCB0cmllLgorICAgICAqIFRocmVhZC11bnNhZmUsIHVzZXMgY2xhc3MgbWVtYmVycyB0byBzdG9yZSBsb29rdXAgc3RhdGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWFkZXIgZXh0ZW5kcyBXYWxrZXI8UmVhZGVyPgorICAgIHsKKyAgICAgICAgcHJvdGVjdGVkIFJlYWRlcihQYXJ0aXRpb25JbmRleCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoaW5kZXguaW5zdGFudGlhdGVSZWJ1ZmZlcmVyKCksIGluZGV4LnJvb3QpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbmRzIGEgY2FuZGlkYXRlIGZvciBhbiBleGFjdCBrZXkgc2VhcmNoLiBSZXR1cm5zIGFuIGlmaWxlIChpZiBwb3NpdGl2ZSkgb3IgZGZpbGUgKGlmIG5lZ2F0aXZlLCB1c2luZyB+KQorICAgICAgICAgKiBwb3NpdGlvbi4gVGhlIHBvc2l0aW9uIHJldHVybmVkIGhhcyBhIGxvdyBjaGFuY2Ugb2YgYmVpbmcgYSBkaWZmZXJlbnQgZW50cnksIGJ1dCBvbmx5IGlmIHRoZSBzb3VnaHQga2V5CisgICAgICAgICAqIGlzIG5vdCBwcmVzZW50IGluIHRoZSBmaWxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGxvbmcgZXhhY3RDYW5kaWRhdGUoRGVjb3JhdGVkS2V5IGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQSBoaXQgbXVzdCBiZSBhIHByZWZpeCBvZiB0aGUgYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBrZXkuCisgICAgICAgICAgICBpbnQgYiA9IGZvbGxvdyhrZXkpOworICAgICAgICAgICAgLy8gSWYgdGhlIHByZWZpeCBlbmRlZCBpbiBhIG5vZGUgd2l0aCBjaGlsZHJlbiBpdCBpcyBvbmx5IGFjY2VwdGFibGUgaWYgaXQgaXMgYSBmdWxsIG1hdGNoLgorICAgICAgICAgICAgaWYgKGIgIT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNICYmIGhhc0NoaWxkcmVuKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5PVF9GT1VORDsKKyAgICAgICAgICAgIGlmICghY2hlY2tIYXNoQml0cyhrZXkuZmlsdGVySGFzaExvd2VyQml0cygpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9UX0ZPVU5EOworICAgICAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRJbmRleFBvcygpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBjaGVja0hhc2hCaXRzKHNob3J0IGhhc2hCaXRzKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYnl0ZXMgPSBwYXlsb2FkRmxhZ3MoKTsKKyAgICAgICAgICAgIGlmIChieXRlcyA8IEZMQUdfSEFTX0hBU0hfQllURSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXMgPiAwOworICAgICAgICAgICAgcmV0dXJuIChidWYuZ2V0KHBheWxvYWRQb3NpdGlvbigpKSA9PSAoYnl0ZSkgaGFzaEJpdHMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIDxSZXN1bHRUeXBlPiBSZXN1bHRUeXBlIGNlaWxpbmcoUGFydGl0aW9uUG9zaXRpb24ga2V5LCBBY2NlcHRvcjxQYXJ0aXRpb25Qb3NpdGlvbiwgUmVzdWx0VHlwZT4gYWNjZXB0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICAvLyBMb29rIGZvciBhIHByZWZpeCBvZiB0aGUga2V5LiBJZiB0aGVyZSBpcyBvbmUsIHRoZSBrZXkgaXQgc3RhbmRzIGZvciBjb3VsZCBiZSBsZXNzLCBlcXVhbCwgb3IgZ3JlYXRlcgorICAgICAgICAgICAgLy8gdGhhbiB0aGUgcmVxdWlyZWQgdmFsdWUgc28gdHJ5IHRoYXQgZmlyc3QuCisgICAgICAgICAgICBpbnQgYiA9IGZvbGxvd1dpdGhHcmVhdGVyKGtleSk7CisgICAgICAgICAgICAvLyBJZiB0aGUgcHJlZml4IGVuZGVkIGluIGEgbm9kZSB3aXRoIGNoaWxkcmVuIGl0IGlzIG9ubHkgYWNjZXB0YWJsZSBpZiBpdCBpcyBhIGZ1bGwgbWF0Y2guCisgICAgICAgICAgICBpZiAoIWhhc0NoaWxkcmVuKCkgfHwgYiA9PSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9uZyBpbmRleFBvcyA9IGdldEN1cnJlbnRJbmRleFBvcygpOworICAgICAgICAgICAgICAgIGlmIChpbmRleFBvcyAhPSBOT1RfRk9VTkQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSZXN1bHRUeXBlIHJlcyA9IGFjY2VwdG9yLmFjY2VwdChpbmRleFBvcywgZmFsc2UsIGtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gSWYgdGhhdCB3YXMgbm90IGZvdW5kLCB0aGUgY2xvc2VzdCBncmVhdGVyIHZhbHVlIGNhbiBiZSB1c2VkIGluc3RlYWQsIGFuZCB3ZSBrbm93IHRoYXQKKyAgICAgICAgICAgIC8vIGl0IHN0YW5kcyBmb3IgYSBrZXkgZ3JlYXRlciB0aGFuIHRoZSBhcmd1bWVudC4KKyAgICAgICAgICAgIGlmIChncmVhdGVyQnJhbmNoID09IE5PTkUpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICBnb01pbihncmVhdGVyQnJhbmNoKTsKKyAgICAgICAgICAgIGxvbmcgaW5kZXhQb3MgPSBnZXRDdXJyZW50SW5kZXhQb3MoKTsKKyAgICAgICAgICAgIGlmIChpbmRleFBvcyA9PSBOT1RfRk9VTkQpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiBhY2NlcHRvci5hY2NlcHQoaW5kZXhQb3MsIHRydWUsIGtleSk7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyA8UmVzdWx0VHlwZT4gUmVzdWx0VHlwZSBmbG9vcihQYXJ0aXRpb25Qb3NpdGlvbiBrZXksIEFjY2VwdG9yPFBhcnRpdGlvblBvc2l0aW9uLCBSZXN1bHRUeXBlPiBhY2NlcHRvcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBhIHByZWZpeCBhbmQgZmluZCBjbG9zZXN0IHNtYWxsZXIgYnJhbmNoLgorICAgICAgICAgICAgTG9uZyBpbmRleFBvcyA9IHByZWZpeEFuZE5laWdoYm91cnMoa2V5LCBSZWFkZXI6OmdldFNwZWNpZmljSW5kZXhQb3MpOworCisgICAgICAgICAgICBpZiAoaW5kZXhQb3MgIT0gbnVsbCAmJiBpbmRleFBvcyAhPSBOT1RfRk9VTkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVzdWx0VHlwZSByZXMgPSBhY2NlcHRvci5hY2NlcHQoaW5kZXhQb3MsIGZhbHNlLCBrZXkpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHJldHVybiB0aGUgSW5kZXhJbmZvIGZvciB0aGUgY2xvc2VzdCBlbnRyeSBvZiB0aGUgc21hbGxlciBicmFuY2ggKHdoaWNoIGlzIHRoZSBtYXggb2YgbGVzc2VyQnJhbmNoKS4KKyAgICAgICAgICAgIC8vIE5vdGUgKHNlZSBwcmVmaXhBbmROZWlnaGJvdXJzKTogc2luY2Ugd2UgYWNjZXB0IHByZWZpeCBtYXRjaGVzIGFib3ZlLCBhdCB0aGlzIHBvaW50IHRoZXJlIGNhbm5vdCBiZSBhbm90aGVyCisgICAgICAgICAgICAvLyBwcmVmaXggbWF0Y2ggdGhhdCBpcyBjbG9zZXIgdGhhbiBtYXgobGVzc2VyQnJhbmNoKS4KKyAgICAgICAgICAgIGlmIChsZXNzZXJCcmFuY2ggPT0gTk9ORSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIGdvTWF4KGxlc3NlckJyYW5jaCk7CisgICAgICAgICAgICBpbmRleFBvcyA9IGdldEN1cnJlbnRJbmRleFBvcygpOworICAgICAgICAgICAgaWYgKGluZGV4UG9zID09IE5PVF9GT1VORCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICAgICAgcmV0dXJuIGFjY2VwdG9yLmFjY2VwdChpbmRleFBvcywgdHJ1ZSwga2V5KTsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIExvbmcgZ2V0U3BlY2lmaWNJbmRleFBvcyhpbnQgcG9zLCBpbnQgYml0cykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGdldEluZGV4UG9zKGJ1ZiwgcG9zLCBiaXRzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldEN1cnJlbnRJbmRleFBvcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRJbmRleFBvcyhidWYsIHBheWxvYWRQb3NpdGlvbigpLCBwYXlsb2FkRmxhZ3MoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBnZXRMYXN0SW5kZXhQb3NpdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvTWF4KHJvb3QpOworICAgICAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRJbmRleFBvcygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRvIGJlIHVzZWQgb25seSBpbiBhbmFseXNpcy4KKyAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgICAgICBwcm90ZWN0ZWQgaW50IHBheWxvYWRTaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGJ5dGVzID0gcGF5bG9hZEZsYWdzKCk7CisgICAgICAgICAgICByZXR1cm4gYnl0ZXMgPiA3ID8gYnl0ZXMgLSA2IDogYnl0ZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJdGVyYXRvciBvZiBpbmRleCBwb3NpdGlvbnMgY292ZXJlZCBiZXR3ZWVuIHR3byBrZXlzLiBTaW5jZSB3ZSBzdG9yZSBwcmVmaXhlcyBvbmx5LCB0aGUgZmlyc3QgYW5kIGxhc3QgcmV0dXJuZWQKKyAgICAgKiB2YWx1ZXMgY2FuIGJlIG91dHNpZGUgdGhlIHNwYW4gKGFuZCBpbmNsdXNpdmVuZXNzIGlzIG5vdCBnaXZlbiBhcyB3ZSBjYW5ub3QgdmVyaWZ5IGl0KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluZGV4UG9zSXRlcmF0b3IgZXh0ZW5kcyBWYWx1ZUl0ZXJhdG9yPEluZGV4UG9zSXRlcmF0b3I+CisgICAgeworICAgICAgICBzdGF0aWMgZmluYWwgbG9uZyBJTlZBTElEID0gLTE7CisgICAgICAgIGxvbmcgcG9zID0gSU5WQUxJRDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGluZGV4IFBhcnRpdGlvbkluZGV4IHRvIHVzZSBmb3IgdGhlIGl0ZXJhdGlvbi4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIE5vdGU6IEZvciBwZXJmb3JtYW5jZSByZWFzb25zIHRoaXMgY2xhc3MgZG9lcyBub3Qga2VlcCBhIHJlZmVyZW5jZSBvZiB0aGUgaW5kZXguIENhbGxlciBtdXN0IGVuc3VyZSBhCisgICAgICAgICAqIHJlZmVyZW5jZSBpcyBoZWxkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhpcyBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSW5kZXhQb3NJdGVyYXRvcihQYXJ0aXRpb25JbmRleCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoaW5kZXguaW5zdGFudGlhdGVSZWJ1ZmZlcmVyKCksIGluZGV4LnJvb3QpOworICAgICAgICB9CisKKyAgICAgICAgSW5kZXhQb3NJdGVyYXRvcihQYXJ0aXRpb25JbmRleCBpbmRleCwgUGFydGl0aW9uUG9zaXRpb24gc3RhcnQsIFBhcnRpdGlvblBvc2l0aW9uIGVuZCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoaW5kZXguaW5zdGFudGlhdGVSZWJ1ZmZlcmVyKCksIGluZGV4LnJvb3QsIHN0YXJ0LCBlbmQsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIGluIHRoZSByb3cgaW5kZXggb3IgZGF0YSBmaWxlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGxvbmcgbmV4dEluZGV4UG9zKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd2l0aG91dCBtaXNzaW5nIHBvc2l0aW9ucywgd2Ugc2F2ZSBhbmQgcmV1c2UgdGhlIHVucmV0dXJuZWQgcG9zaXRpb24uCisgICAgICAgICAgICBpZiAocG9zID09IElOVkFMSUQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9zID0gbmV4dFBheWxvYWRlZE5vZGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocG9zID09IElOVkFMSUQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT1RfRk9VTkQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdvKHBvcyk7CisKKyAgICAgICAgICAgIHBvcyA9IElOVkFMSUQ7IC8vIG1ha2Ugc3VyZSBuZXh0IHRpbWUgd2UgY2FsbCBuZXh0UGF5bG9hZGVkTm9kZSgpIGFnYWluCisgICAgICAgICAgICByZXR1cm4gZ2V0SW5kZXhQb3MoYnVmLCBwYXlsb2FkUG9zaXRpb24oKSwgcGF5bG9hZEZsYWdzKCkpOyAvLyB0aGlzIHNob3VsZCBub3QgdGhyb3cKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGRlYnVnL3Rlc3QgY29kZQorICAgICAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyB2b2lkIGR1bXBUcmllKFN0cmluZyBmaWxlTmFtZSkKKyAgICB7CisgICAgICAgIHRyeShQcmludFN0cmVhbSBwcyA9IG5ldyBQcmludFN0cmVhbShmaWxlTmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGR1bXBUcmllKHBzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJGYWlsZWQgdG8gZHVtcCB0cmllIHRvIHt9IGR1ZSB0byBleGNlcHRpb24ge30iLCBmaWxlTmFtZSwgdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZHVtcFRyaWUoUHJpbnRTdHJlYW0gb3V0KQorICAgIHsKKyAgICAgICAgdHJ5IChSZWFkZXIgcmRyID0gb3BlblJlYWRlcigpKQorICAgICAgICB7CisgICAgICAgICAgICByZHIuZHVtcFRyaWUob3V0LCAoYnVmLCBwcG9zLCBwYml0cykgLT4gTG9uZy50b1N0cmluZyhnZXRJbmRleFBvcyhidWYsIHBwb3MsIHBiaXRzKSkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUGFydGl0aW9uSW5kZXhCdWlsZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUGFydGl0aW9uSW5kZXhCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmNDNjYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9QYXJ0aXRpb25JbmRleEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXMuSW5jcmVtZW50YWxUcmllV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzLldhbGtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworCisvKioKKyAqIFBhcnRpdGlvbiBpbmRleCBidWlsZGVyOiBzdG9yZXMgaW5kZXggb3IgZGF0YSBwb3NpdGlvbnMgaW4gYW4gaW5jcmVtZW50YWxseSBidWlsdCwgcGFnZSBhd2FyZSBvbi1kaXNrIHRyaWUuCisgKiA8cD4KKyAqIFRoZSBmaWxlcyBjcmVhdGVkIGJ5IHRoaXMgYnVpbGRlciBhcmUgcmVhZCBieSB7QGxpbmsgUGFydGl0aW9uSW5kZXh9LgorICovCitjbGFzcyBQYXJ0aXRpb25JbmRleEJ1aWxkZXIgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlCit7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXF1ZW50aWFsV3JpdGVyIHdyaXRlcjsKKyAgICBwcml2YXRlIGZpbmFsIEluY3JlbWVudGFsVHJpZVdyaXRlcjxQYXJ0aXRpb25JbmRleC5QYXlsb2FkPiB0cmllV3JpdGVyOworICAgIHByaXZhdGUgZmluYWwgRmlsZUhhbmRsZS5CdWlsZGVyIGZoQnVpbGRlcjsKKworICAgIC8vIHRoZSBsYXN0IHN5bmNlZCBkYXRhIGZpbGUgcG9zaXRpb24KKyAgICBwcml2YXRlIGxvbmcgZGF0YVN5bmNQb3NpdGlvbjsKKyAgICAvLyB0aGUgbGFzdCBzeW5jZWQgcm93IGluZGV4IGZpbGUgcG9zaXRpb24KKyAgICBwcml2YXRlIGxvbmcgcm93SW5kZXhTeW5jUG9zaXRpb247CisgICAgLy8gdGhlIGxhc3Qgc3luY2VkIHBhcnRpdGlvbiBpbmRleCBmaWxlIHBvc2l0aW9uCisgICAgcHJpdmF0ZSBsb25nIHBhcnRpdGlvbkluZGV4U3luY1Bvc2l0aW9uOworCisgICAgLy8gUGFydGlhbCBpbmRleCBjYW4gb25seSBiZSB1c2VkIGFmdGVyIGFsbCB0aHJlZSBmaWxlcyBoYXZlIGJlZW4gc3luY2VkIHRvIHRoZSByZXF1aXJlZCBwb3NpdGlvbnMuCisgICAgcHJpdmF0ZSBsb25nIHBhcnRpYWxJbmRleERhdGFFbmQ7CisgICAgcHJpdmF0ZSBsb25nIHBhcnRpYWxJbmRleFJvd0VuZDsKKyAgICBwcml2YXRlIGxvbmcgcGFydGlhbEluZGV4UGFydGl0aW9uRW5kOworICAgIHByaXZhdGUgSW5jcmVtZW50YWxUcmllV3JpdGVyLlBhcnRpYWxUYWlsIHBhcnRpYWxJbmRleFRhaWw7CisgICAgcHJpdmF0ZSBDb25zdW1lcjxQYXJ0aXRpb25JbmRleD4gcGFydGlhbEluZGV4Q29uc3VtZXI7CisgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgcGFydGlhbEluZGV4TGFzdEtleTsKKworICAgIHByaXZhdGUgaW50IGxhc3REaWZmUG9pbnQ7CisgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgZmlyc3RLZXk7CisgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgbGFzdEtleTsKKyAgICBwcml2YXRlIERlY29yYXRlZEtleSBsYXN0V3JpdHRlbktleTsKKyAgICBwcml2YXRlIFBhcnRpdGlvbkluZGV4LlBheWxvYWQgbGFzdFBheWxvYWQ7CisKKyAgICBwdWJsaWMgUGFydGl0aW9uSW5kZXhCdWlsZGVyKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyLCBGaWxlSGFuZGxlLkJ1aWxkZXIgZmhCdWlsZGVyKQorICAgIHsKKyAgICAgICAgdGhpcy53cml0ZXIgPSB3cml0ZXI7CisgICAgICAgIHRoaXMudHJpZVdyaXRlciA9IEluY3JlbWVudGFsVHJpZVdyaXRlci5vcGVuKFBhcnRpdGlvbkluZGV4LlRSSUVfU0VSSUFMSVpFUiwgd3JpdGVyKTsKKyAgICAgICAgdGhpcy5maEJ1aWxkZXIgPSBmaEJ1aWxkZXI7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxsZWQgd2hlbiBwYXJ0aXRpb24gaW5kZXggaGFzIGJlZW4gZmx1c2hlZCB0byB0aGUgZ2l2ZW4gcG9zaXRpb24uCisgICAgICogSWYgdGhpcyBtYWtlcyBhbGwgcmVxdWlyZWQgcG9zaXRpb25zIGZvciBhIHBhcnRpYWwgdmlldyBmbHVzaGVkLCB0aGlzIHdpbGwgY2FsbCB0aGUgcGFydGlhbEluZGV4Q29uc3VtZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWFya1BhcnRpdGlvbkluZGV4U3luY2VkKGxvbmcgdXBUb1Bvc2l0aW9uKQorICAgIHsKKyAgICAgICAgcGFydGl0aW9uSW5kZXhTeW5jUG9zaXRpb24gPSB1cFRvUG9zaXRpb247CisgICAgICAgIHJlZnJlc2hSZWFkYWJsZUJvdW5kYXJ5KCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxsZWQgd2hlbiByb3cgaW5kZXggaGFzIGJlZW4gZmx1c2hlZCB0byB0aGUgZ2l2ZW4gcG9zaXRpb24uCisgICAgICogSWYgdGhpcyBtYWtlcyBhbGwgcmVxdWlyZWQgcG9zaXRpb25zIGZvciBhIHBhcnRpYWwgdmlldyBmbHVzaGVkLCB0aGlzIHdpbGwgY2FsbCB0aGUgcGFydGlhbEluZGV4Q29uc3VtZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWFya1Jvd0luZGV4U3luY2VkKGxvbmcgdXBUb1Bvc2l0aW9uKQorICAgIHsKKyAgICAgICAgcm93SW5kZXhTeW5jUG9zaXRpb24gPSB1cFRvUG9zaXRpb247CisgICAgICAgIHJlZnJlc2hSZWFkYWJsZUJvdW5kYXJ5KCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxsZWQgd2hlbiBkYXRhIGZpbGUgaGFzIGJlZW4gZmx1c2hlZCB0byB0aGUgZ2l2ZW4gcG9zaXRpb24uCisgICAgICogSWYgdGhpcyBtYWtlcyBhbGwgcmVxdWlyZWQgcG9zaXRpb25zIGZvciBhIHBhcnRpYWwgdmlldyBmbHVzaGVkLCB0aGlzIHdpbGwgY2FsbCB0aGUgcGFydGlhbEluZGV4Q29uc3VtZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbWFya0RhdGFTeW5jZWQobG9uZyB1cFRvUG9zaXRpb24pCisgICAgeworICAgICAgICBkYXRhU3luY1Bvc2l0aW9uID0gdXBUb1Bvc2l0aW9uOworICAgICAgICByZWZyZXNoUmVhZGFibGVCb3VuZGFyeSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWZyZXNoUmVhZGFibGVCb3VuZGFyeSgpCisgICAgeworICAgICAgICBpZiAocGFydGlhbEluZGV4Q29uc3VtZXIgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKGRhdGFTeW5jUG9zaXRpb24gPCBwYXJ0aWFsSW5kZXhEYXRhRW5kKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAocm93SW5kZXhTeW5jUG9zaXRpb24gPCBwYXJ0aWFsSW5kZXhSb3dFbmQpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlmIChwYXJ0aXRpb25JbmRleFN5bmNQb3NpdGlvbiA8IHBhcnRpYWxJbmRleFBhcnRpdGlvbkVuZCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBmaEJ1aWxkZXIud2l0aExlbmd0aE92ZXJyaWRlKHdyaXRlci5nZXRMYXN0Rmx1c2hPZmZzZXQoKSkuY29tcGxldGUoKSkKKyAgICAgICAgeworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmVzb3VyY2UiLCAiUmVkdW5kYW50U3VwcHJlc3Npb24iIH0pCisgICAgICAgICAgICBQYXJ0aXRpb25JbmRleCBwaSA9IG5ldyBQYXJ0aXRpb25JbmRleEVhcmx5KGZoLCBwYXJ0aWFsSW5kZXhUYWlsLnJvb3QoKSwgcGFydGlhbEluZGV4VGFpbC5jb3VudCgpLCBmaXJzdEtleSwgcGFydGlhbEluZGV4TGFzdEtleSwgcGFydGlhbEluZGV4VGFpbC5jdXRvZmYoKSwgcGFydGlhbEluZGV4VGFpbC50YWlsKCkpOworICAgICAgICAgICAgcGFydGlhbEluZGV4Q29uc3VtZXIuYWNjZXB0KHBpKTsKKyAgICAgICAgICAgIHBhcnRpYWxJbmRleENvbnN1bWVyID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGZoQnVpbGRlci53aXRoTGVuZ3RoT3ZlcnJpZGUoLTEpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAqIEBwYXJhbSBkZWNvcmF0ZWRLZXkgdGhlIGtleSBmb3IgdGhpcyByZWNvcmQKKyAgICAqIEBwYXJhbSBwb3NpdGlvbiB0aGUgcG9zaXRpb24gdG8gd3JpdGUgd2l0aCB0aGUgcmVjb3JkOgorICAgICogICAgLSBwb3NpdGl2ZSBpZiBwb3NpdGlvbiBwb2ludHMgdG8gYW4gaW5kZXggZW50cnkgaW4gdGhlIGluZGV4IGZpbGUKKyAgICAqICAgIC0gbmVnYXRpdmUgaWYgfnBvc2l0aW9uIHBvaW50cyBkaXJlY3RseSB0byB0aGUga2V5IGluIHRoZSBkYXRhIGZpbGUKKyAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZEVudHJ5KERlY29yYXRlZEtleSBkZWNvcmF0ZWRLZXksIGxvbmcgcG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGxhc3RLZXkgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3RLZXkgPSBkZWNvcmF0ZWRLZXk7CisgICAgICAgICAgICBsYXN0RGlmZlBvaW50ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBkaWZmUG9pbnQgPSBCeXRlQ29tcGFyYWJsZS5kaWZmUG9pbnQobGFzdEtleSwgZGVjb3JhdGVkS2V5LCBXYWxrZXIuQllURV9DT01QQVJBQkxFX1ZFUlNJT04pOworICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgcHJldlByZWZpeCA9IEJ5dGVDb21wYXJhYmxlLmN1dChsYXN0S2V5LCBNYXRoLm1heChkaWZmUG9pbnQsIGxhc3REaWZmUG9pbnQpKTsKKyAgICAgICAgICAgIHRyaWVXcml0ZXIuYWRkKHByZXZQcmVmaXgsIGxhc3RQYXlsb2FkKTsKKyAgICAgICAgICAgIGxhc3RXcml0dGVuS2V5ID0gbGFzdEtleTsKKyAgICAgICAgICAgIGxhc3REaWZmUG9pbnQgPSBkaWZmUG9pbnQ7CisgICAgICAgIH0KKyAgICAgICAgbGFzdEtleSA9IGRlY29yYXRlZEtleTsKKyAgICAgICAgbGFzdFBheWxvYWQgPSBuZXcgUGFydGl0aW9uSW5kZXguUGF5bG9hZChwb3NpdGlvbiwgZGVjb3JhdGVkS2V5LmZpbHRlckhhc2hMb3dlckJpdHMoKSk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgY29tcGxldGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIERvIG5vdCB0cmlnZ2VyIHBlbmRpbmcgcGFydGlhbCBidWlsZHMuCisgICAgICAgIHBhcnRpYWxJbmRleENvbnN1bWVyID0gbnVsbDsKKworICAgICAgICBpZiAobGFzdEtleSAhPSBsYXN0V3JpdHRlbktleSkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgcHJldlByZWZpeCA9IEJ5dGVDb21wYXJhYmxlLmN1dChsYXN0S2V5LCBsYXN0RGlmZlBvaW50KTsKKyAgICAgICAgICAgIHRyaWVXcml0ZXIuYWRkKHByZXZQcmVmaXgsIGxhc3RQYXlsb2FkKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgcm9vdCA9IHRyaWVXcml0ZXIuY29tcGxldGUoKTsKKyAgICAgICAgbG9uZyBjb3VudCA9IHRyaWVXcml0ZXIuY291bnQoKTsKKyAgICAgICAgbG9uZyBmaXJzdEtleVBvcyA9IHdyaXRlci5wb3NpdGlvbigpOworICAgICAgICBpZiAoZmlyc3RLZXkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGgoZmlyc3RLZXkuZ2V0S2V5KCksIHdyaXRlcik7CisgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhTaG9ydExlbmd0aChsYXN0S2V5LmdldEtleSgpLCB3cml0ZXIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGxhc3RLZXkgPT0gbnVsbDsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZVNob3J0KDApOworICAgICAgICAgICAgd3JpdGVyLndyaXRlU2hvcnQoMCk7CisgICAgICAgIH0KKworICAgICAgICB3cml0ZXIud3JpdGVMb25nKGZpcnN0S2V5UG9zKTsKKyAgICAgICAgd3JpdGVyLndyaXRlTG9uZyhjb3VudCk7CisgICAgICAgIHdyaXRlci53cml0ZUxvbmcocm9vdCk7CisKKyAgICAgICAgd3JpdGVyLnN5bmMoKTsKKyAgICAgICAgZmhCdWlsZGVyLndpdGhMZW5ndGhPdmVycmlkZSh3cml0ZXIuZ2V0TGFzdEZsdXNoT2Zmc2V0KCkpOworCisgICAgICAgIHJldHVybiByb290OworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhIFBhcnRpdGlvbkluZGV4IHJlcHJlc2VudGluZyB0aGUgcmVjb3JkcyB3cml0dGVuIHVudGlsIHRoaXMgcG9pbnQgd2l0aG91dCBpbnRlcnJ1cHRpbmcgd3JpdGVzLiBCZWNhdXNlCisgICAgICogZGF0YSBpbiBidWZmZXJlZCB3cml0ZXJzIGRvZXMgbm90IGdldCBpbW1lZGlhdGVseSBmbHVzaGVkIHRvIHRoZSBmaWxlIHN5c3RlbSwgYW5kIHdlIGRvIG5vdCB3YW50IHRvIGZvcmNlIGZsdXNoaW5nCisgICAgICogb2YgdGhlIHJlbGV2YW50IGZpbGVzICh3aGljaCBlLmcuIGNvdWxkIGNhdXNlIGEgcHJvYmxlbSBmb3IgY29tcHJlc3NlZCBkYXRhIGZpbGVzKSwgdGhpcyBjYWxsIGNhbm5vdCByZXR1cm4KKyAgICAgKiBpbW1lZGlhdGVseS4gSW5zdGVhZCwgaXQgd2lsbCB0YWtlIGFuIGluZGV4IHNuYXBzaG90IGJ1dCB3YWl0IHdpdGggbWFraW5nIGl0IGFjdGl2ZSAoYnkgY2FsbGluZyB0aGUgcHJvdmlkZWQKKyAgICAgKiBjYWxsYmFjaykgdW50aWwgaXQgcmVnaXN0ZXJzIHRoYXQgYWxsIHJlbGV2YW50IGZpbGVzIChkYXRhLCByb3cgaW5kZXggYW5kIHBhcnRpdGlvbiBpbmRleCkgaGF2ZSBiZWVuIGZsdXNoZWQgYXQKKyAgICAgKiBsZWFzdCBhcyBmYXIgYXMgdGhlIHJlcXVpcmVkIHBvc2l0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWxsV2hlblJlYWR5IGNhbGxiYWNrIHRoYXQgaXMgZ2l2ZW4gdGhlIHByZXBhcmVkIHBhcnRpYWwgaW5kZXggd2hlbiBhbGwgcmVsZXZhbnQgZGF0YSBoYXMgYmVlbiBmbHVzaGVkCisgICAgICogQHBhcmFtIHJvd0luZGV4RW5kIHRoZSBwb3NpdGlvbiBpbiB0aGUgcm93IGluZGV4IGZpbGUgd2UgbmVlZCB0byBiZSBhYmxlIHRvIHJlYWQgdG8gKGV4Y2x1c2l2ZSkgdG8gcmVhZCBhbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgcmVjb3JkcyB3cml0dGVuIHNvIGZhcgorICAgICAqIEBwYXJhbSBkYXRhRW5kIHRoZSBwb3NpdGlvbiBpbiB0aGUgZGF0YSBmaWxlIHdlIG5lZWQgdG8gYmUgYWJsZSB0byByZWFkIHRvIChleGNsdXNpdmUpIHRvIHJlYWQgYWxsIHJlY29yZHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiBzbyBmYXIKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHJlcXVlc3Qgd2FzIGFjY2VwdGVkLCBmYWxzZSBpZiB0aGVyZSdzIG5vIHBvaW50IHRvIGRvIHRoaXMgYXQgdGhpcyB0aW1lIChlLmcuIGFub3RoZXIKKyAgICAgKiAgICAgICAgIHBhcnRpYWwgcmVwcmVzZW50YXRpb24gaXMgcHJlcGFyZWQgYnV0IHN0aWxsIGlzbid0IHVzYWJsZSkuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYnVpbGRQYXJ0aWFsKENvbnN1bWVyPFBhcnRpdGlvbkluZGV4PiBjYWxsV2hlblJlYWR5LCBsb25nIHJvd0luZGV4RW5kLCBsb25nIGRhdGFFbmQpCisgICAgeworICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGFkdmFuY2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgd2UgcHJlcGFyZWQsIHRoZXJlJ3Mgbm90aGluZyB0byBkby4KKyAgICAgICAgaWYgKGxhc3RXcml0dGVuS2V5ID09IHBhcnRpYWxJbmRleExhc3RLZXkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gRG9uJ3Qgd2FzdGUgdGltZSBpZiBhbiBpbmRleCB3YXMgYWxyZWFkeSBwcmVwYXJlZCBidXQgaGFzbid0IHJlYWNoZWQgdXNhYmlsaXR5IHlldC4KKyAgICAgICAgaWYgKHBhcnRpYWxJbmRleENvbnN1bWVyICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcnRpYWxJbmRleFRhaWwgPSB0cmllV3JpdGVyLm1ha2VQYXJ0aWFsUm9vdCgpOworICAgICAgICAgICAgcGFydGlhbEluZGV4RGF0YUVuZCA9IGRhdGFFbmQ7CisgICAgICAgICAgICBwYXJ0aWFsSW5kZXhSb3dFbmQgPSByb3dJbmRleEVuZDsKKyAgICAgICAgICAgIHBhcnRpYWxJbmRleFBhcnRpdGlvbkVuZCA9IHdyaXRlci5wb3NpdGlvbigpOworICAgICAgICAgICAgcGFydGlhbEluZGV4TGFzdEtleSA9IGxhc3RXcml0dGVuS2V5OworICAgICAgICAgICAgcGFydGlhbEluZGV4Q29uc3VtZXIgPSBjYWxsV2hlblJlYWR5OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEFzIHdyaXRlcyBoYXBwZW4gb24gaW4tbWVtb3J5IGJ1ZmZlcnMsIGZhaWx1cmUgaGVyZSBpcyBub3QgZXhwZWN0ZWQuCisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjbG9zZSB0aGUgYnVpbGRlciBhbmQgcmVsZWFzZSBhbnkgYXNzb2NpYXRlZCBtZW1vcnkKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICB0cmllV3JpdGVyLmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1BhcnRpdGlvbkluZGV4RWFybHkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9QYXJ0aXRpb25JbmRleEVhcmx5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4NmU4NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9QYXJ0aXRpb25JbmRleEVhcmx5LmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SZWJ1ZmZlcmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyOworCisvKioKKyAqIEVhcmx5LW9wZW5lZCBwYXJ0aXRpb24gaW5kZXguIFBhcnQgb2YgdGhlIGRhdGEgaXMgYWxyZWFkeSB3cml0dGVuIHRvIGZpbGUsIGJ1dCBzb21lIG5vZGVzLCBpbmNsdWRpbmcgdGhlIG9uZXMgaW4gdGhlCisgKiBjaGFpbiBsZWFkaW5nIHRvIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBpbmRleCwgYXJlIGluIHRoZSBzdXBwbGllZCBieXRlIGJ1ZmZlciBhbmQgYXJlIGF0dGFjaGVkIGFzIGEgdGFpbCBhdCB0aGUgZ2l2ZW4KKyAqIHBvc2l0aW9uIHRvIGZvcm0gYSB2aWV3IG92ZXIgdGhlIHBhcnRpYWxseS13cml0dGVuIGRhdGEuCisgKi8KK2NsYXNzIFBhcnRpdGlvbkluZGV4RWFybHkgZXh0ZW5kcyBQYXJ0aXRpb25JbmRleAoreworICAgIGZpbmFsIGxvbmcgY3V0b2ZmOworICAgIGZpbmFsIEJ5dGVCdWZmZXIgdGFpbDsKKworICAgIHB1YmxpYyBQYXJ0aXRpb25JbmRleEVhcmx5KEZpbGVIYW5kbGUgZmgsIGxvbmcgdHJpZVJvb3QsIGxvbmcga2V5Q291bnQsIERlY29yYXRlZEtleSBmaXJzdCwgRGVjb3JhdGVkS2V5IGxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBjdXRvZmYsIEJ5dGVCdWZmZXIgdGFpbCkKKyAgICB7CisgICAgICAgIHN1cGVyKGZoLCB0cmllUm9vdCwga2V5Q291bnQsIGZpcnN0LCBsYXN0KTsKKyAgICAgICAgdGhpcy5jdXRvZmYgPSBjdXRvZmY7CisgICAgICAgIHRoaXMudGFpbCA9IHRhaWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlYnVmZmVyZXIgaW5zdGFudGlhdGVSZWJ1ZmZlcmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyKHN1cGVyLmluc3RhbnRpYXRlUmVidWZmZXJlcigpLCBjdXRvZmYsIHRhaWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9QYXJ0aXRpb25JdGVyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1BhcnRpdGlvbkl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkOGZmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9QYXJ0aXRpb25JdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLktleVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXMuaW1tdXRhYmxlTGlzdFdpdGhGaWx0ZXJlZE51bGxzOworCisvKioKKyAqIFBhcnRpdGlvbiBpdGVyYXRvciBmb3IgdGhlIEJUSSBmb3JtYXQuCisgKiA8cD4KKyAqIEFzIHRoZSBpbmRleCBzdG9yZXMgcHJlZml4ZXMgb2Yga2V5cywgdGhlIHNsaWNlIHJldHVybmVkIGJ5IHRoZSB1bmRlcmx5aW5nIHtAbGluayBQYXJ0aXRpb25JbmRleC5JbmRleFBvc0l0ZXJhdG9yfQorICogbWF5IHN0YXJ0IGFuZCBlbmQgd2l0aCBlbnRyaWVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBwcmVmaXggYXMgdGhlIHByb3ZpZGVkIGJvdW5kcywgYnV0IGJlIGluIHRoZSB3cm9uZyByZWxhdGlvbnNoaXAKKyAqIHdpdGggdGhlbS4gVG8gZmlsdGVyIHRoZXNlIG91dCwgd2Ugc3RhcnQgYnkgY2hlY2tpbmcgdGhlIGZpcnN0IGl0ZW0gZHVyaW5nIGluaXRpYWxpemF0aW9uLCBhbmQgYnkgd29ya2luZyBvbmUgaXRlbQorICogYWhlYWQsIHNvIHRoYXQgd2UgY2FuIHJlY29nbml6ZSB0aGUgZW5kIG9mIHRoZSBzbGljZSBhbmQgY2hlY2sgdGhlIGxhc3QgaXRlbSBiZWZvcmUgd2UgcmV0dXJuIGl0LgorICovCitjbGFzcyBQYXJ0aXRpb25JdGVyYXRvciBleHRlbmRzIFBhcnRpdGlvbkluZGV4LkluZGV4UG9zSXRlcmF0b3IgaW1wbGVtZW50cyBLZXlSZWFkZXIKK3sKKyAgICBwcml2YXRlIGZpbmFsIFBhcnRpdGlvbkluZGV4IHBhcnRpdGlvbkluZGV4OworICAgIHByaXZhdGUgZmluYWwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyOworICAgIHByaXZhdGUgZmluYWwgUGFydGl0aW9uUG9zaXRpb24gbGltaXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZXhjbHVzaXZlTGltaXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlSGFuZGxlIGRhdGFGaWxlOworICAgIHByaXZhdGUgZmluYWwgRmlsZUhhbmRsZSByb3dJbmRleEZpbGU7CisKKyAgICBwcml2YXRlIEZpbGVEYXRhSW5wdXQgZGF0YUlucHV0OworICAgIHByaXZhdGUgRmlsZURhdGFJbnB1dCBpbmRleElucHV0OworCisgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgY3VycmVudEtleTsKKyAgICBwcml2YXRlIFRyaWVJbmRleEVudHJ5IGN1cnJlbnRFbnRyeTsKKyAgICBwcml2YXRlIERlY29yYXRlZEtleSBuZXh0S2V5OworICAgIHByaXZhdGUgVHJpZUluZGV4RW50cnkgbmV4dEVudHJ5OworCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmVzb3VyY2UiLCAiUmVkdW5kYW50U3VwcHJlc3Npb24iIH0pCisgICAgc3RhdGljIFBhcnRpdGlvbkl0ZXJhdG9yIGNyZWF0ZShQYXJ0aXRpb25JbmRleCBwYXJ0aXRpb25JbmRleCwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyLCBGaWxlSGFuZGxlIHJvd0luZGV4RmlsZSwgRmlsZUhhbmRsZSBkYXRhRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvblBvc2l0aW9uIGxlZnQsIGludCBpbmNsdXNpdmVMZWZ0LCBQYXJ0aXRpb25Qb3NpdGlvbiByaWdodCwgaW50IGV4Y2x1c2l2ZVJpZ2h0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFBhcnRpdGlvbkl0ZXJhdG9yIHBhcnRpdGlvbkl0ZXJhdG9yID0gbnVsbDsKKyAgICAgICAgUGFydGl0aW9uSW5kZXggcGFydGl0aW9uSW5kZXhDb3B5ID0gbnVsbDsKKyAgICAgICAgRmlsZUhhbmRsZSBkYXRhRmlsZUNvcHkgPSBudWxsOworICAgICAgICBGaWxlSGFuZGxlIHJvd0luZGV4RmlsZUNvcHkgPSBudWxsOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBwYXJ0aXRpb25JbmRleENvcHkgPSBwYXJ0aXRpb25JbmRleC5zaGFyZWRDb3B5KCk7CisgICAgICAgICAgICBkYXRhRmlsZUNvcHkgPSBkYXRhRmlsZS5zaGFyZWRDb3B5KCk7CisgICAgICAgICAgICByb3dJbmRleEZpbGVDb3B5ID0gcm93SW5kZXhGaWxlLnNoYXJlZENvcHkoKTsKKworICAgICAgICAgICAgcGFydGl0aW9uSXRlcmF0b3IgPSBuZXcgUGFydGl0aW9uSXRlcmF0b3IocGFydGl0aW9uSW5kZXhDb3B5LCBwYXJ0aXRpb25lciwgcm93SW5kZXhGaWxlQ29weSwgZGF0YUZpbGVDb3B5LCBsZWZ0LCByaWdodCwgZXhjbHVzaXZlUmlnaHQpOworCisgICAgICAgICAgICBwYXJ0aXRpb25JdGVyYXRvci5yZWFkTmV4dCgpOworICAgICAgICAgICAgLy8gQmVjYXVzZSB0aGUgaW5kZXggc3RvcmVzIHByZWZpeGVzLCB0aGUgZmlyc3QgdmFsdWUgY2FuIGJlIGluIGFueSByZWxhdGlvbnNoaXAgd2l0aCB0aGUgbGVmdCBib3VuZC4KKyAgICAgICAgICAgIGlmIChwYXJ0aXRpb25JdGVyYXRvci5uZXh0S2V5ICE9IG51bGwgJiYgIShwYXJ0aXRpb25JdGVyYXRvci5uZXh0S2V5LmNvbXBhcmVUbyhsZWZ0KSA+IGluY2x1c2l2ZUxlZnQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcnRpdGlvbkl0ZXJhdG9yLnJlYWROZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJ0aXRpb25JdGVyYXRvci5hZHZhbmNlKCk7CisgICAgICAgICAgICByZXR1cm4gcGFydGl0aW9uSXRlcmF0b3I7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIHwgUnVudGltZUV4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBhcnRpdGlvbkl0ZXJhdG9yICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGFydGl0aW9uSXRlcmF0b3IuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGVzLmNsb3NlTm9uTnVsbEFuZEFkZFN1cHByZXNzZWQoZXgsIHJvd0luZGV4RmlsZUNvcHksIGRhdGFGaWxlQ29weSwgcGFydGl0aW9uSW5kZXhDb3B5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIFBhcnRpdGlvbkl0ZXJhdG9yIGNyZWF0ZShQYXJ0aXRpb25JbmRleCBwYXJ0aXRpb25JbmRleCwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyLCBGaWxlSGFuZGxlIHJvd0luZGV4RmlsZSwgRmlsZUhhbmRsZSBkYXRhRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gY3JlYXRlKHBhcnRpdGlvbkluZGV4LCBwYXJ0aXRpb25lciwgcm93SW5kZXhGaWxlLCBkYXRhRmlsZSwgcGFydGl0aW9uSW5kZXguZmlyc3RLZXkoKSwgLTEsIHBhcnRpdGlvbkluZGV4Lmxhc3RLZXkoKSwgMCk7CisgICAgfQorCisgICAgc3RhdGljIFBhcnRpdGlvbkl0ZXJhdG9yIGVtcHR5KFBhcnRpdGlvbkluZGV4IHBhcnRpdGlvbkluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQYXJ0aXRpb25JdGVyYXRvcihwYXJ0aXRpb25JbmRleC5zaGFyZWRDb3B5KCkpOworICAgIH0KKworICAgIHByaXZhdGUgUGFydGl0aW9uSXRlcmF0b3IoUGFydGl0aW9uSW5kZXggcGFydGl0aW9uSW5kZXgsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciwgRmlsZUhhbmRsZSByb3dJbmRleEZpbGUsIEZpbGVIYW5kbGUgZGF0YUZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25Qb3NpdGlvbiBsZWZ0LCBQYXJ0aXRpb25Qb3NpdGlvbiByaWdodCwgaW50IGV4Y2x1c2l2ZVJpZ2h0KQorICAgIHsKKyAgICAgICAgc3VwZXIocGFydGl0aW9uSW5kZXgsIGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgdGhpcy5wYXJ0aXRpb25JbmRleCA9IHBhcnRpdGlvbkluZGV4OworICAgICAgICB0aGlzLnBhcnRpdGlvbmVyID0gcGFydGl0aW9uZXI7CisgICAgICAgIHRoaXMubGltaXQgPSByaWdodDsKKyAgICAgICAgdGhpcy5leGNsdXNpdmVMaW1pdCA9IGV4Y2x1c2l2ZVJpZ2h0OworICAgICAgICB0aGlzLnJvd0luZGV4RmlsZSA9IHJvd0luZGV4RmlsZTsKKyAgICAgICAgdGhpcy5kYXRhRmlsZSA9IGRhdGFGaWxlOworICAgIH0KKworICAgIHByaXZhdGUgUGFydGl0aW9uSXRlcmF0b3IoUGFydGl0aW9uSW5kZXggcGFydGl0aW9uSW5kZXgpCisgICAgeworICAgICAgICBzdXBlcihwYXJ0aXRpb25JbmRleCwgcGFydGl0aW9uSW5kZXguZmlyc3RLZXkoKSwgcGFydGl0aW9uSW5kZXguZmlyc3RLZXkoKSk7CisgICAgICAgIHRoaXMucGFydGl0aW9uSW5kZXggPSBwYXJ0aXRpb25JbmRleDsKKyAgICAgICAgdGhpcy5wYXJ0aXRpb25lciA9IG51bGw7CisgICAgICAgIHRoaXMubGltaXQgPSBwYXJ0aXRpb25JbmRleC5maXJzdEtleSgpOworICAgICAgICB0aGlzLmV4Y2x1c2l2ZUxpbWl0ID0gLTE7CisgICAgICAgIHRoaXMucm93SW5kZXhGaWxlID0gbnVsbDsKKyAgICAgICAgdGhpcy5kYXRhRmlsZSA9IG51bGw7CisKKyAgICAgICAgdGhpcy5jdXJyZW50RW50cnkgPSBudWxsOworICAgICAgICB0aGlzLmN1cnJlbnRLZXkgPSBudWxsOworICAgICAgICB0aGlzLm5leHRFbnRyeSA9IG51bGw7CisgICAgICAgIHRoaXMubmV4dEtleSA9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgVGhyb3dhYmxlIGFjY3VtID0gbnVsbDsKKyAgICAgICAgYWNjdW0gPSBUaHJvd2FibGVzLmNsb3NlKGFjY3VtLCBpbW11dGFibGVMaXN0V2l0aEZpbHRlcmVkTnVsbHMocGFydGl0aW9uSW5kZXgsIGRhdGFGaWxlLCByb3dJbmRleEZpbGUpKTsKKyAgICAgICAgYWNjdW0gPSBUaHJvd2FibGVzLmNsb3NlKGFjY3VtLCBpbW11dGFibGVMaXN0V2l0aEZpbHRlcmVkTnVsbHMoZGF0YUlucHV0LCBpbmRleElucHV0KSk7CisgICAgICAgIGFjY3VtID0gVGhyb3dhYmxlcy5wZXJmb3JtKGFjY3VtLCBzdXBlcjo6Y2xvc2UpOworICAgICAgICBUaHJvd2FibGVzLm1heWJlRmFpbChhY2N1bSk7CisgICAgfQorCisgICAgcHVibGljIERlY29yYXRlZEtleSBkZWNvcmF0ZWRLZXkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRLZXk7CisgICAgfQorCisgICAgcHVibGljIEJ5dGVCdWZmZXIga2V5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBjdXJyZW50S2V5LmdldEtleSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGRhdGFQb3NpdGlvbigpCisgICAgeworICAgICAgICByZXR1cm4gY3VycmVudEVudHJ5ICE9IG51bGwgPyBjdXJyZW50RW50cnkucG9zaXRpb24gOiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBrZXlQb3NpdGlvbkZvclNlY29uZGFyeUluZGV4KCkKKyAgICB7CisgICAgICAgIHJldHVybiBkYXRhUG9zaXRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVHJpZUluZGV4RW50cnkgZW50cnkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRFbnRyeTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBhZHZhbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBjdXJyZW50S2V5ID0gbmV4dEtleTsKKyAgICAgICAgY3VycmVudEVudHJ5ID0gbmV4dEVudHJ5OworICAgICAgICBpZiAoY3VycmVudEtleSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZWFkTmV4dCgpOworICAgICAgICAgICAgLy8gaWYgbmV4dEtleSBpcyBudWxsLCB0aGVuIGN1cnJlbnRLZXkgaXMgdGhlIGxhc3Qga2V5IHRvIGJlIHB1Ymxpc2hlZCwgdGhlcmVmb3JlIGNoZWNrIGFnYWluc3QgYW55IGxpbWl0CisgICAgICAgICAgICAvLyBhbmQgc3VwcHJlc3MgdGhlIHBhcnRpdGlvbiBpZiBpdCBpcyBiZXlvbmQgdGhlIGxpbWl0CisgICAgICAgICAgICBpZiAobmV4dEtleSA9PSBudWxsICYmIGxpbWl0ICE9IG51bGwgJiYgY3VycmVudEtleS5jb21wYXJlVG8obGltaXQpID4gZXhjbHVzaXZlTGltaXQpCisgICAgICAgICAgICB7ICAgLy8gZXhjbHVkZSBsYXN0IHBhcnRpdGlvbiBvdXRzaWRlIHJhbmdlCisgICAgICAgICAgICAgICAgY3VycmVudEtleSA9IG51bGw7CisgICAgICAgICAgICAgICAgY3VycmVudEVudHJ5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWROZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIHBvcyA9IG5leHRJbmRleFBvcygpOworICAgICAgICBpZiAocG9zICE9IFBhcnRpdGlvbkluZGV4Lk5PVF9GT1VORCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvcyA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlZWtJbmRleElucHV0KHBvcyk7CisgICAgICAgICAgICAgICAgbmV4dEtleSA9IHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW5kZXhJbnB1dCkpOworICAgICAgICAgICAgICAgIG5leHRFbnRyeSA9IFRyaWVJbmRleEVudHJ5LmRlc2VyaWFsaXplKGluZGV4SW5wdXQsIGluZGV4SW5wdXQuZ2V0RmlsZVBvaW50ZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG9zID0gfnBvczsKKyAgICAgICAgICAgICAgICBzZWVrRGF0YUlucHV0KHBvcyk7CisgICAgICAgICAgICAgICAgbmV4dEtleSA9IHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoZGF0YUlucHV0KSk7CisgICAgICAgICAgICAgICAgbmV4dEVudHJ5ID0gbmV3IFRyaWVJbmRleEVudHJ5KHBvcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBuZXh0S2V5ID0gbnVsbDsKKyAgICAgICAgICAgIG5leHRFbnRyeSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2Vla0luZGV4SW5wdXQobG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGluZGV4SW5wdXQgPT0gbnVsbCkKKyAgICAgICAgICAgIGluZGV4SW5wdXQgPSByb3dJbmRleEZpbGUuY3JlYXRlUmVhZGVyKHBvcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGluZGV4SW5wdXQuc2Vlayhwb3MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZWVrRGF0YUlucHV0KGxvbmcgcG9zKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChkYXRhSW5wdXQgPT0gbnVsbCkKKyAgICAgICAgICAgIGRhdGFJbnB1dCA9IGRhdGFGaWxlLmNyZWF0ZVJlYWRlcihwb3MpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkYXRhSW5wdXQuc2Vlayhwb3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRXhoYXVzdGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjdXJyZW50S2V5ID09IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzZXQoKQorICAgIHsKKyAgICAgICAgZ28ocm9vdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiQlRJLVBhcnRpdGlvbkl0ZXJhdG9yKCVzKSIsIHBhcnRpdGlvbkluZGV4LmdldEZpbGVIYW5kbGUoKS5wYXRoKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9Sb3dJbmRleFJlYWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1Jvd0luZGV4UmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2N2NmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9Sb3dJbmRleFJlYWRlci5qYXZhCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLmNvbmN1cnJlbnQuTm90VGhyZWFkU2FmZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllcy5TZXJpYWxpemF0aW9uTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllcy5UcmllTm9kZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllcy5UcmllU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllcy5XYWxrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TaXplZEludHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CisKKy8qKgorICogUmVhZGVyIGNsYXNzIGZvciByb3cgaW5kZXggZmlsZXMgY3JlYXRlZCBieSB7QGxpbmsgUm93SW5kZXhXcml0ZXJ9LgorICogPHA+CisgKiBSb3cgaW5kZXggInRyaWVzIiBkbyBub3QgbmVlZCB0byBzdG9yZSB3aG9sZSBrZXlzLCBhcyB3aGF0IHdlIG5lZWQgZnJvbSB0aGVtIGlzIHRvIGJlIGFibGUgdG8gdGVsbCB3aGVyZSBpbiB0aGUgZGF0YSBmaWxlCisgKiB0byBzdGFydCBsb29raW5nIGZvciBhIGdpdmVuIGtleS4gSW5zdGVhZCwgd2Ugc3RvcmUgc29tZSBwcmVmaXggdGhhdCBpcyBncmVhdGVyIHRoYW4gdGhlIGdyZWF0ZXN0IGtleSBvZiB0aGUgcHJldmlvdXMKKyAqIGluZGV4IHNlY3Rpb24gYW5kIHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc21hbGxlc3Qga2V5IG9mIHRoZSBuZXh0LiBTbyBmb3IgYSBnaXZlbiBrZXkgdGhlIGZpcnN0IGluZGV4IHNlY3Rpb24KKyAqIHRoYXQgY291bGQgcG90ZW50aWFsbHkgY29udGFpbiBpdCBpcyBnaXZlbiBieSB0aGUgdHJpZSdzIGZsb29yIGZvciB0aGF0IGtleS4KKyAqIDxwPgorICogVGhpcyBidWlsZHMgdXBvbiB0aGUgdHJpZSBXYWxrZXIgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYmFzaWMgdHJpZSB3YWxraW5nIGZ1bmN0aW9uYWxpdHkuIFRoZSBjbGFzcyBpcyB0aHJlYWQtdW5zYWZlCisgKiBhbmQgbXVzdCBiZSByZS1pbnN0YW50aWF0ZWQgZm9yIGV2ZXJ5IHRocmVhZCB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgdHJpZSAoaXRzIG92ZXJoZWFkIGlzIGJlbG93IHRoYXQgb2YgYQorICoge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyfSkuCisgKi8KK0BOb3RUaHJlYWRTYWZlCitwdWJsaWMgY2xhc3MgUm93SW5kZXhSZWFkZXIgZXh0ZW5kcyBXYWxrZXI8Um93SW5kZXhSZWFkZXI+Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfT1BFTl9NQVJLRVIgPSA4OworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmRleEluZm8KKyAgICB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIG9mZnNldDsKKyAgICAgICAgcHVibGljIGZpbmFsIERlbGV0aW9uVGltZSBvcGVuRGVsZXRpb247CisKKyAgICAgICAgSW5kZXhJbmZvKGxvbmcgb2Zmc2V0LCBEZWxldGlvblRpbWUgb3BlbkRlbGV0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICAgIHRoaXMub3BlbkRlbGV0aW9uID0gb3BlbkRlbGV0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFJvd0luZGV4UmVhZGVyKEZpbGVIYW5kbGUgZmlsZSwgbG9uZyByb290KQorICAgIHsKKyAgICAgICAgc3VwZXIoZmlsZS5pbnN0YW50aWF0ZVJlYnVmZmVyZXIobnVsbCksIHJvb3QpOworICAgIH0KKworICAgIHB1YmxpYyBSb3dJbmRleFJlYWRlcihGaWxlSGFuZGxlIGZpbGUsIFRyaWVJbmRleEVudHJ5IGVudHJ5KQorICAgIHsKKyAgICAgICAgdGhpcyhmaWxlLCBlbnRyeS5pbmRleFRyaWVSb290KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlcyB0aGUgZmxvb3IgZm9yIGEgZ2l2ZW4ga2V5LgorICAgICAqLworICAgIHB1YmxpYyBJbmRleEluZm8gc2VwYXJhdG9yRmxvb3IoQnl0ZUNvbXBhcmFibGUga2V5KQorICAgIHsKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgcHJlZml4IGFuZCBmaW5kIGNsb3Nlc3Qgc21hbGxlciBicmFuY2guCisgICAgICAgIEluZGV4SW5mbyByZXMgPSBwcmVmaXhBbmROZWlnaGJvdXJzKGtleSwgUm93SW5kZXhSZWFkZXI6OnJlYWRQYXlsb2FkKTsKKyAgICAgICAgLy8gSWYgdGhlcmUncyBhIHByZWZpeCwgaW4gYSBzZXBhcmF0b3IgdHJpZSBpdCBjb3VsZCBiZSBsZXNzIHRoYW4sIGVxdWFsLCBvciBncmVhdGVyIHRoYW4gc291Z2h0IHZhbHVlLgorICAgICAgICAvLyBTb3VnaHQgdmFsdWUgaXMgc3RpbGwgZ3JlYXRlciB0aGFuIG1heCBvZiBwcmV2aW91cyBzZWN0aW9uLgorICAgICAgICAvLyBPbiBtYXRjaCB0aGUgcHJlZml4IG11c3QgYmUgdXNlZCBhcyBhIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICBpZiAocmVzICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gcmVzOworCisgICAgICAgIC8vIE90aGVyd2lzZSByZXR1cm4gdGhlIEluZGV4SW5mbyBmb3IgdGhlIGNsb3Nlc3QgZW50cnkgb2YgdGhlIHNtYWxsZXIgYnJhbmNoICh3aGljaCBpcyB0aGUgbWF4IG9mIGxlc3NlckJyYW5jaCkuCisgICAgICAgIC8vIE5vdGUgKHNlZSBwcmVmaXhBbmROZWlnaGJvdXJzKTogc2luY2Ugd2UgYWNjZXB0IHByZWZpeCBtYXRjaGVzIGFib3ZlLCBhdCB0aGlzIHBvaW50IHRoZXJlIGNhbm5vdCBiZSBhbm90aGVyCisgICAgICAgIC8vIHByZWZpeCBtYXRjaCB0aGF0IGlzIGNsb3NlciB0aGFuIG1heChsZXNzZXJCcmFuY2gpLgorICAgICAgICBpZiAobGVzc2VyQnJhbmNoID09IE5PTkUpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgZ29NYXgobGVzc2VyQnJhbmNoKTsKKyAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRJbmRleEluZm8oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5kZXhJbmZvIG1pbigpCisgICAgeworICAgICAgICBnb01pbihyb290KTsKKyAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRJbmRleEluZm8oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgSW5kZXhJbmZvIGdldEN1cnJlbnRJbmRleEluZm8oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlYWRQYXlsb2FkKHBheWxvYWRQb3NpdGlvbigpLCBwYXlsb2FkRmxhZ3MoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEluZGV4SW5mbyByZWFkUGF5bG9hZChpbnQgcHBvcywgaW50IGJpdHMpCisgICAgeworICAgICAgICByZXR1cm4gcmVhZFBheWxvYWQoYnVmLCBwcG9zLCBiaXRzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgSW5kZXhJbmZvIHJlYWRQYXlsb2FkKEJ5dGVCdWZmZXIgYnVmLCBpbnQgcHBvcywgaW50IGJpdHMpCisgICAgeworICAgICAgICBsb25nIGRhdGFPZmZzZXQ7CisgICAgICAgIGlmIChiaXRzID09IDApCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaW50IGJ5dGVzID0gYml0cyAmIH5GTEFHX09QRU5fTUFSS0VSOworICAgICAgICBkYXRhT2Zmc2V0ID0gU2l6ZWRJbnRzLnJlYWQoYnVmLCBwcG9zLCBieXRlcyk7CisgICAgICAgIHBwb3MgKz0gYnl0ZXM7CisgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvbiA9IChiaXRzICYgRkxBR19PUEVOX01BUktFUikgIT0gMAorICAgICAgICAgICAgICAgID8gRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoYnVmLCBwcG9zKQorICAgICAgICAgICAgICAgIDogbnVsbDsKKyAgICAgICAgcmV0dXJuIG5ldyBJbmRleEluZm8oZGF0YU9mZnNldCwgZGVsZXRpb24pOworICAgIH0KKworICAgIC8vIFRoZSB0cmllIHNlcmlhbGl6ZXIgZGVzY3JpYmVzIGhvdyB0aGUgcGF5bG9hZHMgYXJlIHdyaXR0ZW4uIFBsYWNlZCBoZXJlIChpbnN0ZWFkIG9mIHdyaXRlcikgc28gdGhhdCByZWFkaW5nIGFuZAorICAgIC8vIHdyaXRpbmcgdGhlIHBheWxvYWQgYXJlIGNsb3NlIHRvZ2V0aGVyIHNob3VsZCB0aGV5IG5lZWQgdG8gYmUgY2hhbmdlZC4KKyAgICBzdGF0aWMgZmluYWwgVHJpZVNlcmlhbGl6ZXI8SW5kZXhJbmZvLCBEYXRhT3V0cHV0UGx1cz4gdHJpZVNlcmlhbGl6ZXIgPSBuZXcgVHJpZVNlcmlhbGl6ZXI8SW5kZXhJbmZvLCBEYXRhT3V0cHV0UGx1cz4oKQorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZW9mTm9kZShTZXJpYWxpemF0aW9uTm9kZTxJbmRleEluZm8+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVHJpZU5vZGUudHlwZUZvcihub2RlLCBub2RlUG9zaXRpb24pLnNpemVvZk5vZGUobm9kZSkgKyBzaXplb2Yobm9kZS5wYXlsb2FkKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKERhdGFPdXRwdXRQbHVzIGRlc3QsIFNlcmlhbGl6YXRpb25Ob2RlPEluZGV4SW5mbz4gbm9kZSwgbG9uZyBub2RlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZShkZXN0LCBUcmllTm9kZS50eXBlRm9yKG5vZGUsIG5vZGVQb3NpdGlvbiksIG5vZGUsIG5vZGVQb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBzaXplb2YoSW5kZXhJbmZvIHBheWxvYWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgICAgIGlmIChwYXlsb2FkICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZSArPSBTaXplZEludHMubm9uWmVyb1NpemUocGF5bG9hZC5vZmZzZXQpOworICAgICAgICAgICAgICAgIGlmICghcGF5bG9hZC5vcGVuRGVsZXRpb24uaXNMaXZlKCkpCisgICAgICAgICAgICAgICAgICAgIHNpemUgKz0gRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUocGF5bG9hZC5vcGVuRGVsZXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGUoRGF0YU91dHB1dFBsdXMgZGVzdCwgVHJpZU5vZGUgdHlwZSwgU2VyaWFsaXphdGlvbk5vZGU8SW5kZXhJbmZvPiBub2RlLCBsb25nIG5vZGVQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIEluZGV4SW5mbyBwYXlsb2FkID0gbm9kZS5wYXlsb2FkKCk7CisgICAgICAgICAgICBpbnQgYnl0ZXMgPSAwOworICAgICAgICAgICAgaW50IGhhc09wZW5NYXJrZXIgPSAwOworICAgICAgICAgICAgaWYgKHBheWxvYWQgIT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlcyA9IFNpemVkSW50cy5ub25aZXJvU2l6ZShwYXlsb2FkLm9mZnNldCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGJ5dGVzIDwgOCA6ICJSb3cgaW5kZXggZG9lcyBub3Qgc3VwcG9ydCByb3dzIGxhcmdlciB0aGFuIDMyIFBpQiI7CisgICAgICAgICAgICAgICAgaWYgKCFwYXlsb2FkLm9wZW5EZWxldGlvbi5pc0xpdmUoKSkKKyAgICAgICAgICAgICAgICAgICAgaGFzT3Blbk1hcmtlciA9IEZMQUdfT1BFTl9NQVJLRVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0eXBlLnNlcmlhbGl6ZShkZXN0LCBub2RlLCBieXRlcyB8IGhhc09wZW5NYXJrZXIsIG5vZGVQb3NpdGlvbik7CisgICAgICAgICAgICBpZiAocGF5bG9hZCAhPSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNpemVkSW50cy53cml0ZShkZXN0LCBwYXlsb2FkLm9mZnNldCwgYnl0ZXMpOworCisgICAgICAgICAgICAgICAgaWYgKGhhc09wZW5NYXJrZXIgPT0gRkxBR19PUEVOX01BUktFUikKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplKHBheWxvYWQub3BlbkRlbGV0aW9uLCBkZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfTsKKworICAgIC8vIGRlYnVnL3Rlc3QgY29kZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgIHB1YmxpYyB2b2lkIGR1bXBUcmllKFByaW50U3RyZWFtIG91dCkKKyAgICB7CisgICAgICAgIGR1bXBUcmllKG91dCwgUm93SW5kZXhSZWFkZXI6OmR1bXBSb3dJbmRleEVudHJ5KTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGR1bXBSb3dJbmRleEVudHJ5KEJ5dGVCdWZmZXIgYnVmLCBpbnQgcHBvcywgaW50IGJpdHMpCisgICAgeworICAgICAgICBJbmRleEluZm8gaWkgPSByZWFkUGF5bG9hZChidWYsIHBwb3MsIGJpdHMpOworCisgICAgICAgIHJldHVybiBpaSAhPSBudWxsCisgICAgICAgICAgICAgICA/IFN0cmluZy5mb3JtYXQoInBvcyAleCAlcyIsIGlpLm9mZnNldCwgaWkub3BlbkRlbGV0aW9uID09IG51bGwgPyAiIiA6IGlpLm9wZW5EZWxldGlvbikKKyAgICAgICAgICAgICAgIDogInBvcyBudWxsIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUm93SW5kZXhSZXZlcnNlSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9Sb3dJbmRleFJldmVyc2VJdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYjY2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUm93SW5kZXhSZXZlcnNlSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGk7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLlJvd0luZGV4UmVhZGVyLkluZGV4SW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllcy5SZXZlcnNlVmFsdWVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CisKKy8qKgorICogUmV2ZXJzZSBpdGVyYXRvciBvdmVyIHRoZSByb3cgaW5kZXguIE5lZWRlZCB0byBnZXQgcHJldmlvdXMgaW5kZXggYmxvY2tzIGZvciByZXZlcnNlIGl0ZXJhdGlvbi4KKyAqLworY2xhc3MgUm93SW5kZXhSZXZlcnNlSXRlcmF0b3IgZXh0ZW5kcyBSZXZlcnNlVmFsdWVJdGVyYXRvcjxSb3dJbmRleFJldmVyc2VJdGVyYXRvcj4KK3sKKyAgICBwcml2YXRlIGxvbmcgY3VycmVudE5vZGUgPSAtMTsKKworICAgIHB1YmxpYyBSb3dJbmRleFJldmVyc2VJdGVyYXRvcihGaWxlSGFuZGxlIGZpbGUsIGxvbmcgcm9vdCwgQnl0ZUNvbXBhcmFibGUgc3RhcnQsIEJ5dGVDb21wYXJhYmxlIGVuZCkKKyAgICB7CisgICAgICAgIHN1cGVyKGZpbGUuaW5zdGFudGlhdGVSZWJ1ZmZlcmVyKG51bGwpLCByb290LCBzdGFydCwgZW5kLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUm93SW5kZXhSZXZlcnNlSXRlcmF0b3IoRmlsZUhhbmRsZSBmaWxlLCBUcmllSW5kZXhFbnRyeSBlbnRyeSwgQnl0ZUNvbXBhcmFibGUgZW5kKQorICAgIHsKKyAgICAgICAgdGhpcyhmaWxlLCBlbnRyeS5pbmRleFRyaWVSb290LCBCeXRlQ29tcGFyYWJsZS5FTVBUWSwgZW5kKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5kZXhJbmZvIG5leHRJbmRleEluZm8oKQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJlbnROb2RlID09IC0xKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IG5leHRQYXlsb2FkZWROb2RlKCk7CisgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUgPT0gLTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBnbyhjdXJyZW50Tm9kZSk7CisgICAgICAgIEluZGV4SW5mbyBpbmZvID0gUm93SW5kZXhSZWFkZXIucmVhZFBheWxvYWQoYnVmLCBwYXlsb2FkUG9zaXRpb24oKSwgcGF5bG9hZEZsYWdzKCkpOworCisgICAgICAgIGN1cnJlbnROb2RlID0gLTE7CisgICAgICAgIHJldHVybiBpbmZvOworICAgIH0KKworICAgIC8vIGRlYnVnL3Rlc3QgY29kZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgIHB1YmxpYyB2b2lkIGR1bXBUcmllKFByaW50U3RyZWFtIG91dCkKKyAgICB7CisgICAgICAgIGR1bXBUcmllKG91dCwgUm93SW5kZXhSZWFkZXI6OmR1bXBSb3dJbmRleEVudHJ5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUm93SW5kZXhXcml0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9Sb3dJbmRleFdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYmFmMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUm93SW5kZXhXcml0ZXIuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdDb21wYXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdQcmVmaXg7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5Sb3dJbmRleFJlYWRlci5JbmRleEluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXMuSW5jcmVtZW50YWxUcmllV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzLldhbGtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CisKKy8qKgorICogUHJlcGFyZXIgLyB3cml0ZXIgb2Ygcm93IGluZGV4IHRyaWVzIHRoYXQgY2FuIGJlIHJlYWQgYnkge0BsaW5rIFJvd0luZGV4UmVhZGVyfSBhbmQgaXRlcmF0ZWQgYnkKKyAqIHtAbGluayBSb3dJbmRleFJldmVyc2VJdGVyYXRvcn0uCisgKiA8cD4KKyAqIFVzZXMge0BsaW5rIEluY3JlbWVudGFsVHJpZVdyaXRlcn0gdG8gYnVpbGQgYSB0cmllIG9mIGluZGV4IHNlY3Rpb24gc2VwYXJhdG9ycyBvZiB0aGUgc2hvcnRlc3QgcG9zc2libGUgbGVuZ3RoIHN1Y2gKKyAqIHRoYXQge0Bjb2RlIHByZXZNYXggPCBzZXBhcmF0b3IgPD0gbmV4dE1pbn0uCisgKi8KK2NsYXNzIFJvd0luZGV4V3JpdGVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQoreworICAgIHByaXZhdGUgZmluYWwgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvcjsKKyAgICBwcml2YXRlIGZpbmFsIEluY3JlbWVudGFsVHJpZVdyaXRlcjxJbmRleEluZm8+IHRyaWU7CisgICAgcHJpdmF0ZSBCeXRlQ29tcGFyYWJsZSBwcmV2TWF4ID0gbnVsbDsKKyAgICBwcml2YXRlIEJ5dGVDb21wYXJhYmxlIHByZXZTZXAgPSBudWxsOworCisgICAgUm93SW5kZXhXcml0ZXIoQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciwgRGF0YU91dHB1dFBsdXMgb3V0KQorICAgIHsKKyAgICAgICAgdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKKyAgICAgICAgdGhpcy50cmllID0gSW5jcmVtZW50YWxUcmllV3JpdGVyLm9wZW4oUm93SW5kZXhSZWFkZXIudHJpZVNlcmlhbGl6ZXIsIG91dCk7CisgICAgfQorCisgICAgdm9pZCByZXNldCgpCisgICAgeworICAgICAgICBwcmV2TWF4ID0gbnVsbDsKKyAgICAgICAgcHJldlNlcCA9IG51bGw7CisgICAgICAgIHRyaWUucmVzZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICB0cmllLmNsb3NlKCk7CisgICAgfQorCisgICAgdm9pZCBhZGQoQ2x1c3RlcmluZ1ByZWZpeDw/PiBmaXJzdE5hbWUsIENsdXN0ZXJpbmdQcmVmaXg8Pz4gbGFzdE5hbWUsIEluZGV4SW5mbyBpbmZvKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGFzc2VydCBpbmZvLm9wZW5EZWxldGlvbiAhPSBudWxsOworICAgICAgICBCeXRlQ29tcGFyYWJsZSBzZXAgPSBwcmV2TWF4ID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBCeXRlQ29tcGFyYWJsZS5FTVBUWQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEJ5dGVDb21wYXJhYmxlLnNlcGFyYXRvckd0KHByZXZNYXgsIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShmaXJzdE5hbWUpKTsKKyAgICAgICAgdHJpZS5hZGQoc2VwLCBpbmZvKTsKKyAgICAgICAgcHJldlNlcCA9IHNlcDsKKyAgICAgICAgcHJldk1heCA9IGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShsYXN0TmFtZSk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgY29tcGxldGUobG9uZyBlbmRQb3MpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gQWRkIGEgc2VwYXJhdG9yIGFmdGVyIHRoZSBsYXN0IHNlY3Rpb24sIHNvIHRoYXQgZ3JlYXRlciBpbnB1dHMgY2FuIGJlIHF1aWNrbHkgcmVqZWN0ZWQuCisgICAgICAgIC8vIFRvIG1heGltaXplIGl0cyBlZmZpY2llbmN5IHdlIGFkZCBpdCB3aXRoIHRoZSBsZW5ndGggb2YgdGhlIGxhc3QgYWRkZWQgc2VwYXJhdG9yLgorICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIEJ5dGVTb3VyY2UgbWF4ID0gcHJldk1heC5hc0NvbXBhcmFibGVCeXRlcyhXYWxrZXIuQllURV9DT01QQVJBQkxFX1ZFUlNJT04pOworICAgICAgICBCeXRlU291cmNlIHNlcCA9IHByZXZTZXAuYXNDb21wYXJhYmxlQnl0ZXMoV2Fsa2VyLkJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKTsKKyAgICAgICAgaW50IGM7CisgICAgICAgIHdoaWxlICgoYyA9IG1heC5uZXh0KCkpID09IHNlcC5uZXh0KCkgJiYgYyAhPSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICArK2k7CisgICAgICAgIGFzc2VydCBjICE9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSA6ICJDb3JydXB0ZWQgcm93IG9yZGVyLCBtYXg9IiArIHByZXZNYXg7CisKKyAgICAgICAgdHJpZS5hZGQobnVkZ2UocHJldk1heCwgaSksIG5ldyBJbmRleEluZm8oZW5kUG9zLCBEZWxldGlvblRpbWUuTElWRSkpOworCisgICAgICAgIHJldHVybiB0cmllLmNvbXBsZXRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvZHVjZXMgYSBzb3VyY2UgdGhhdCBpcyBzbGlnaHRseSBncmVhdGVyIHRoYW4gYXJndW1lbnQgd2l0aCBsZW5ndGggYXQgbGVhc3QgbnVkZ2VBdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ5dGVDb21wYXJhYmxlIG51ZGdlKEJ5dGVDb21wYXJhYmxlIHZhbHVlLCBpbnQgbnVkZ2VBdCkKKyAgICB7CisgICAgICAgIHJldHVybiB2ZXJzaW9uIC0+IG5ldyBCeXRlU291cmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBCeXRlU291cmNlIHYgPSB2YWx1ZS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IGN1ciA9IDA7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBuZXh0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYiA9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICBpZiAoY3VyIDw9IG51ZGdlQXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiID0gdi5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXIgPT0gbnVkZ2VBdCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGIgPCAweEZGKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYjsgIC8vIGNhbid0IG51ZGdlIGhlcmUsIGluY3JlYXNlIG5leHQgaW5zdGVhZCAoZXZlbnR1YWxseSB3aWxsIGJlIC0xKQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrY3VyOworICAgICAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9TU1RhYmxlSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9TU1RhYmxlSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTEzNzVjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1NTVGFibGVJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RSb3dJbmRleEVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLlJvd0luZGV4UmVhZGVyLkluZGV4SW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworCisvKioKKyAqICBVbmZpbHRlcmVkIHJvdyBpdGVyYXRvciBvdmVyIGEgQlRJIFNTVGFibGUuCisgKi8KK2NsYXNzIFNTVGFibGVJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0U1NUYWJsZUl0ZXJhdG9yPEFic3RyYWN0Um93SW5kZXhFbnRyeT4KK3sKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXggb2YgdGhlIHNsaWNlIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzbGljZTsKKworICAgIHB1YmxpYyBTU1RhYmxlSXRlcmF0b3IoQnRpVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEYXRhSW5wdXQgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsaWNlcyBzbGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgY29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUgaWZpbGUpCisgICAgeworICAgICAgICBzdXBlcihzc3RhYmxlLCBmaWxlLCBrZXksIGluZGV4RW50cnksIHNsaWNlcywgY29sdW1ucywgaWZpbGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBSZWFkZXIgY3JlYXRlUmVhZGVySW50ZXJuYWwoQWJzdHJhY3RSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIEZpbGVEYXRhSW5wdXQgZmlsZSwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUpCisgICAgeworICAgICAgICBpZiAoaW5kZXhFbnRyeS5pc0luZGV4ZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgRm9yd2FyZEluZGV4ZWRSZWFkZXIoaW5kZXhFbnRyeSwgZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3J3YXJkUmVhZGVyKGZpbGUsIHNob3VsZENsb3NlRmlsZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBuZXh0U2xpY2VJbmRleCgpCisgICAgeworICAgICAgICBpbnQgbmV4dCA9IHNsaWNlOworICAgICAgICBzbGljZSsrOworICAgICAgICByZXR1cm4gbmV4dDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNb3JlU2xpY2VzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzbGljZSA8IHNsaWNlcy5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXZlcnNlT3JkZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgRm9yd2FyZEluZGV4ZWRSZWFkZXIgZXh0ZW5kcyBGb3J3YXJkUmVhZGVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIFJvd0luZGV4UmVhZGVyIGluZGV4UmVhZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgYmFzZVBvc2l0aW9uOworCisgICAgICAgIHByaXZhdGUgRm9yd2FyZEluZGV4ZWRSZWFkZXIoQWJzdHJhY3RSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIEZpbGVEYXRhSW5wdXQgZmlsZSwgYm9vbGVhbiBzaG91bGRDbG9zZUZpbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGZpbGUsIHNob3VsZENsb3NlRmlsZSk7CisgICAgICAgICAgICBiYXNlUG9zaXRpb24gPSBpbmRleEVudHJ5LnBvc2l0aW9uOworICAgICAgICAgICAgaW5kZXhSZWFkZXIgPSBuZXcgUm93SW5kZXhSZWFkZXIoaWZpbGUsIChUcmllSW5kZXhFbnRyeSkgaW5kZXhFbnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaW5kZXhSZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9yU2xpY2UoU2xpY2Ugc2xpY2UpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5zZXRGb3JTbGljZShzbGljZSk7CisgICAgICAgICAgICBJbmRleEluZm8gaW5kZXhJbmZvID0gaW5kZXhSZWFkZXIuc2VwYXJhdG9yRmxvb3IobWV0YWRhdGEuY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKHNsaWNlLnN0YXJ0KCkpKTsKKyAgICAgICAgICAgIGFzc2VydCBpbmRleEluZm8gIT0gbnVsbDsKKyAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBiYXNlUG9zaXRpb24gKyBpbmRleEluZm8ub2Zmc2V0OworICAgICAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCB8fCBwb3NpdGlvbiA+IGZpbGUuZ2V0RmlsZVBvaW50ZXIoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcGVuTWFya2VyID0gaW5kZXhJbmZvLm9wZW5EZWxldGlvbjsKKyAgICAgICAgICAgICAgICBzZWVrVG9Qb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2UgYXJlIGFscmVhZHkgaW4gdGhlIHJlbGV2YW50IGluZGV4IGJsb2NrLCB0aGVyZSBpcyBubyBwb2ludCB0byBnbyBiYWNrIHRvIGl0cyBiZWdpbm5pbmcuCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvU1NUYWJsZVJldmVyc2VkSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9TU1RhYmxlUmV2ZXJzZWRJdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMWQ3MmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvU1NUYWJsZVJldmVyc2VkSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDI5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworaW1wb3J0IGNvbS5jYXJyb3RzZWFyY2guaHBwYy5Mb25nU3RhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdDb21wYXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVW5maWx0ZXJlZFZhbGlkYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJhbmdlVG9tYnN0b25lQm91bmRNYXJrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5SYW5nZVRvbWJzdG9uZU1hcmtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFNTVGFibGVJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGkuUm93SW5kZXhSZWFkZXIuSW5kZXhJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CisKKy8qKgorICogVW5maWx0ZXJlZCByb3cgaXRlcmF0b3Igb3ZlciBhIEJUSSBTU1RhYmxlIHRoYXQgcmV0dXJucyByb3dzIGluIHJldmVyc2Ugb3JkZXIuCisgKi8KK2NsYXNzIFNTVGFibGVSZXZlcnNlZEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3I8VHJpZUluZGV4RW50cnk+Cit7CisgICAgLyoqCisgICAgICogVGhlIGluZGV4IG9mIHRoZSBzbGljZSBiZWluZyBwcm9jZXNzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2xpY2U7CisKKyAgICBwdWJsaWMgU1NUYWJsZVJldmVyc2VkSXRlcmF0b3IoQnRpVGFibGVSZWFkZXIgc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURhdGFJbnB1dCBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmllSW5kZXhFbnRyeSBpbmRleEVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZXMgc2xpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgY29sdW1ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUhhbmRsZSBpZmlsZSkKKyAgICB7CisgICAgICAgIHN1cGVyKHNzdGFibGUsIGZpbGUsIGtleSwgaW5kZXhFbnRyeSwgc2xpY2VzLCBjb2x1bW5zLCBpZmlsZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJlYWRlciBjcmVhdGVSZWFkZXJJbnRlcm5hbChUcmllSW5kZXhFbnRyeSBpbmRleEVudHJ5LCBGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQorICAgIHsKKyAgICAgICAgaWYgKGluZGV4RW50cnkuaXNJbmRleGVkKCkpCisgICAgICAgICAgICByZXR1cm4gbmV3IFJldmVyc2VJbmRleGVkUmVhZGVyKGluZGV4RW50cnksIGZpbGUsIHNob3VsZENsb3NlRmlsZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmV2ZXJzZVJlYWRlcihmaWxlLCBzaG91bGRDbG9zZUZpbGUpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUmV2ZXJzZU9yZGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgbmV4dFNsaWNlSW5kZXgoKQorICAgIHsKKyAgICAgICAgaW50IG5leHQgPSBzbGljZTsKKyAgICAgICAgc2xpY2UrKzsKKyAgICAgICAgcmV0dXJuIHNsaWNlcy5zaXplKCkgLSAobmV4dCArIDEpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc01vcmVTbGljZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNsaWNlIDwgc2xpY2VzLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXZlcnNlIGl0ZXJhdGlvbiBpcyBwZXJmb3JtZWQgYnkgZ29pbmcgdGhyb3VnaCBhbiBpbmRleCBibG9jayAob3IgdGhlIHdob2xlIHBhcnRpdGlvbiBpZiBub3QgaW5kZXhlZCkgZm9yd2FyZHMKKyAgICAgKiBhbmQgc3RvcmluZyB0aGUgcG9zaXRpb25zIG9mIGVhY2ggZW50cnkgdGhhdCBmYWxscyB3aXRoaW4gdGhlIHNsaWNlIGluIGEgc3RhY2suIFJldmVyc2UgaXRlcmF0aW9uIHRoZW4gcG9wcyBvdXQKKyAgICAgKiBwb3NpdGlvbnMgYW5kIHJlYWRzIHRoZSBlbnRyaWVzLgorICAgICAqIDxwPgorICAgICAqIE5vdGU6IFRoZSBlYXJsaWVyIHZlcnNpb24gb2YgdGhpcyB3YXMgY29uc3RydWN0aW5nIGFuIGluLW1lbW9yeSB2aWV3IG9mIHRoZSBibG9jayBpbnN0ZWFkLCB3aGljaCBnaXZlcyBiZXR0ZXIKKyAgICAgKiBwZXJmb3JtYW5jZSBvbiBiaWdnZXIgcXVlcmllcyBhbmQgaW5kZXggYmxvY2tzIChkdWUgdG8gbm90IGhhdmluZyB0byByZWFkIGRpc2sgYWdhaW4pLiBXaXRoIHRoZSBsb3dlcgorICAgICAqIGdyYW51bGFyaXR5IG9mIHRoZSB0cmllcyBpdCBtYWtlcyBiZXR0ZXIgc2Vuc2UgdG8gc3RvcmUgYXMgbGl0dGxlIGFzIHBvc3NpYmxlIGFzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJsb2NrCisgICAgICogc2hvdWxkIHZlcnkgcmFyZWx5IGJlIGluIG90aGVyIHBhZ2UvY2h1bmsgY2FjaGUgbG9jYXRpb25zLiBUaGlzIGhhcyB0aGUgYmVuZWZpdCBvZiBiZWluZyBhYmxlIHRvIGFuc3dlciBzbWFsbAorICAgICAqIHF1ZXJpZXMgKGVzcC4gTElNSVQgMSkgZmFzdGVyIGFuZCB3aXRoIGxlc3MgR0MgY2h1cm4uCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBSZXZlcnNlUmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RSZWFkZXIKKyAgICB7CisgICAgICAgIGZpbmFsIExvbmdTdGFjayByb3dPZmZzZXRzID0gbmV3IExvbmdTdGFjaygpOworICAgICAgICBSYW5nZVRvbWJzdG9uZU1hcmtlciBibG9ja09wZW5NYXJrZXIsIGJsb2NrQ2xvc2VNYXJrZXI7CisgICAgICAgIHByaXZhdGUgVW5maWx0ZXJlZCBuZXh0ID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGZvdW5kTGVzc1RoYW47CisgICAgICAgIHByaXZhdGUgbG9uZyBzdGFydFBvcyA9IC0xOworCisgICAgICAgIHByaXZhdGUgUmV2ZXJzZVJlYWRlcihGaWxlRGF0YUlucHV0IGZpbGUsIGJvb2xlYW4gc2hvdWxkQ2xvc2VGaWxlKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihmaWxlLCBzaG91bGRDbG9zZUZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZvclNsaWNlKFNsaWNlIHNsaWNlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgLy8gcmVhZCBmdWxsIHJvdyBhbmQgZmlsdGVyCisgICAgICAgICAgICBpZiAoc3RhcnRQb3MgPT0gLTEpCisgICAgICAgICAgICAgICAgc3RhcnRQb3MgPSBmaWxlLmdldEZpbGVQb2ludGVyKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2Vla1RvUG9zaXRpb24oc3RhcnRQb3MpOworCisgICAgICAgICAgICBmaWxsT2Zmc2V0cyhzbGljZSwgdHJ1ZSwgdHJ1ZSwgTG9uZy5NQVhfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGhhc05leHRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAobmV4dCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgbmV4dCA9IGNvbXB1dGVOZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV4dCAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIG5leHRJbnRlcm5hbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWhhc05leHRJbnRlcm5hbCgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIFVuZmlsdGVyZWQgdG9SZXR1cm4gPSBuZXh0OworICAgICAgICAgICAgbmV4dCA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gdG9SZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFVuZmlsdGVyZWQgY29tcHV0ZU5leHQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgVW5maWx0ZXJlZCB0b1JldHVybjsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJsb2NrQ2xvc2VNYXJrZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRvUmV0dXJuID0gYmxvY2tDbG9zZU1hcmtlcjsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tDbG9zZU1hcmtlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b1JldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUgKCFyb3dPZmZzZXRzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNlZWtUb1Bvc2l0aW9uKHJvd09mZnNldHMucG9wKCkpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGhhc05leHQgPSBkZXNlcmlhbGl6ZXIuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaGFzTmV4dCA6ICJEYXRhIGZpbGUgY2hhbmdlZCBhZnRlciBvZmZzZXQgY29sbGVjdGlvbiBwYXNzIjsKKyAgICAgICAgICAgICAgICAgICAgdG9SZXR1cm4gPSBkZXNlcmlhbGl6ZXIucmVhZE5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgVW5maWx0ZXJlZFZhbGlkYXRpb24ubWF5YmVWYWxpZGF0ZVVuZmlsdGVyZWQodG9SZXR1cm4sIG1ldGFkYXRhKCksIGtleSwgc3N0YWJsZSk7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1heSBnZXQgZW1wdHkgcm93IGZvciB0aGUgc2FtZSByZWFzb24gZXhwcmVzc2VkIG9uIFVuZmlsdGVyZWRTZXJpYWxpemVyLmRlc2VyaWFsaXplT25lLgorICAgICAgICAgICAgICAgICAgICBpZiAoIXRvUmV0dXJuLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b1JldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoIWZvdW5kTGVzc1RoYW4gJiYgYWR2YW5jZUluZGV4QmxvY2soKSk7CisKKyAgICAgICAgICAgIC8vIG9wZW4gbWFya2VyIHRvIGJlIG91dHB1dCBvbmx5IGFzIHNsaWNlIGlzIGZpbmlzaGVkCisgICAgICAgICAgICBpZiAoYmxvY2tPcGVuTWFya2VyICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9SZXR1cm4gPSBibG9ja09wZW5NYXJrZXI7CisgICAgICAgICAgICAgICAgYmxvY2tPcGVuTWFya2VyID0gbnVsbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9SZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGFkdmFuY2VJbmRleEJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZmlsbE9mZnNldHMoU2xpY2Ugc2xpY2UsIGJvb2xlYW4gZmlsdGVyU3RhcnQsIGJvb2xlYW4gZmlsdGVyRW5kLCBsb25nIHN0b3BQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbHRlclN0YXJ0ICY9ICFzbGljZS5zdGFydCgpLmVxdWFscyhDbHVzdGVyaW5nQm91bmQuQk9UVE9NKTsKKyAgICAgICAgICAgIGZpbHRlckVuZCAmPSAhc2xpY2UuZW5kKCkuZXF1YWxzKENsdXN0ZXJpbmdCb3VuZC5UT1ApOworCisgICAgICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gc3RhcnQgPSBzbGljZS5zdGFydCgpOworICAgICAgICAgICAgbG9uZyBjdXJyZW50UG9zaXRpb24gPSBmaWxlLmdldEZpbGVQb2ludGVyKCk7CisgICAgICAgICAgICBmb3VuZExlc3NUaGFuID0gZmFsc2U7CisgICAgICAgICAgICAvLyBUaGlzIGlzIGEgY29weSBvZiBoYW5kbGVQcmVTbGljZURhdGEgd2hpY2ggYWxzbyBjaGVja3MgY3VycmVudFBvc2l0aW9uIDwgc3RvcFBvc2l0aW9uLgorICAgICAgICAgICAgLy8gTm90IGV4dHJhY3RlZCB0byBtZXRob2QgYXMgd2UgbmVlZCBib3RoIG1hcmtlciBhbmQgY3VycmVudFBvc2l0aW9uLgorICAgICAgICAgICAgaWYgKGZpbHRlclN0YXJ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50UG9zaXRpb24gPCBzdG9wUG9zaXRpb24gJiYgZGVzZXJpYWxpemVyLmhhc05leHQoKSAmJiBkZXNlcmlhbGl6ZXIuY29tcGFyZU5leHRUbyhzdGFydCkgPD0gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNlcmlhbGl6ZXIubmV4dElzUm93KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZXIuc2tpcE5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlT3Blbk1hcmtlcigoUmFuZ2VUb21ic3RvbmVNYXJrZXIpIGRlc2VyaWFsaXplci5yZWFkTmV4dCgpKTsKKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb24gPSBmaWxlLmdldEZpbGVQb2ludGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kTGVzc1RoYW4gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2UndmUgcmVhY2hlZCB0aGUgYmVnaW5uaW5nIG9mIG91ciBxdWVyaWVkIHNsaWNlLiBJZiB3ZSBoYXZlIGFuIG9wZW4gbWFya2VyCisgICAgICAgICAgICAvLyB3ZSBzaG91bGQgcmV0dXJuIHRoYXQgYXQgdGhlIGVuZCBvZiB0aGUgc2xpY2UgdG8gY2xvc2UgdGhlIGRlbGV0aW9uLgorICAgICAgICAgICAgaWYgKG9wZW5NYXJrZXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBibG9ja09wZW5NYXJrZXIgPSBuZXcgUmFuZ2VUb21ic3RvbmVCb3VuZE1hcmtlcihzdGFydCwgb3Blbk1hcmtlcik7CisKKworICAgICAgICAgICAgLy8gTm93IGRlc2VyaWFsaXplIGV2ZXJ5dGhpbmcgdW50aWwgd2UgcmVhY2ggb3VyIHJlcXVlc3RlZCBlbmQgKGlmIHdlIGhhdmUgb25lKQorICAgICAgICAgICAgLy8gU2VlIFNTVGFibGVJdGVyYXRvci5Gb3J3YXJkUmVhZC5jb21wdXRlTmV4dCgpIGZvciB3aHkgdGhpcyBpcyBhIHN0cmljdCBpbmVxdWFsaXR5IGJlbG93OiB0aGlzIGlzIHRoZSBzYW1lCisgICAgICAgICAgICAvLyByZWFzb25pbmcgaGVyZS4KKyAgICAgICAgICAgIHdoaWxlIChjdXJyZW50UG9zaXRpb24gPCBzdG9wUG9zaXRpb24gJiYgZGVzZXJpYWxpemVyLmhhc05leHQoKQorICAgICAgICAgICAgICAgICAgICYmICghZmlsdGVyRW5kIHx8IGRlc2VyaWFsaXplci5jb21wYXJlTmV4dFRvKHNsaWNlLmVuZCgpKSA8IDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvd09mZnNldHMucHVzaChjdXJyZW50UG9zaXRpb24pOworICAgICAgICAgICAgICAgIGlmIChkZXNlcmlhbGl6ZXIubmV4dElzUm93KCkpCisgICAgICAgICAgICAgICAgICAgIGRlc2VyaWFsaXplci5za2lwTmV4dCgpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlT3Blbk1hcmtlcigoUmFuZ2VUb21ic3RvbmVNYXJrZXIpIGRlc2VyaWFsaXplci5yZWFkTmV4dCgpKTsKKworICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IGZpbGUuZ2V0RmlsZVBvaW50ZXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBvcGVuIG1hcmtlciwgd2Ugc2hvdWxkIG91dHB1dCB0aGF0IGZpcnN0LCB1bmxlc3MgZW5kIGlzIG5vdCBiZWluZyBmaWx0ZXJlZAorICAgICAgICAgICAgLy8gKGkuZS4gaXQncyBlaXRoZXIgdG9wICh3aGVyZSBhIG1hcmtlciBjYW4ndCBiZSBvcGVuKSBvciB3ZSBwbGFjZWQgdGhhdCBtYXJrZXIgZHVyaW5nIHByZXZpb3VzIGJsb2NrKS4KKyAgICAgICAgICAgIGlmIChvcGVuTWFya2VyICE9IG51bGwgJiYgZmlsdGVyRW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgbm8gZW5kIGFuZCBzdGlsbCBhbiBvcGVuTWFya2VyLCB0aGlzIG1lYW5zIHdlJ3JlIGluZGV4ZWQgYW5kIHRoZSBtYXJrZXIgaXMgY2xvc2VkIGluIGEgZm9sbG93aW5nIGJsb2NrLgorICAgICAgICAgICAgICAgIGJsb2NrQ2xvc2VNYXJrZXIgPSBuZXcgUmFuZ2VUb21ic3RvbmVCb3VuZE1hcmtlcihzbGljZS5lbmQoKSwgb3Blbk1hcmtlcik7CisgICAgICAgICAgICAgICAgb3Blbk1hcmtlciA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFJldmVyc2VJbmRleGVkUmVhZGVyIGV4dGVuZHMgUmV2ZXJzZVJlYWRlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBSb3dJbmRleFJldmVyc2VJdGVyYXRvciBpbmRleFJlYWRlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUcmllSW5kZXhFbnRyeSBpbmRleEVudHJ5OworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgYmFzZVBvc2l0aW9uOworICAgICAgICBwcml2YXRlIFNsaWNlIGN1cnJlbnRTbGljZTsKKyAgICAgICAgcHJpdmF0ZSBsb25nIGN1cnJlbnRCbG9ja1N0YXJ0OworCisgICAgICAgIHB1YmxpYyBSZXZlcnNlSW5kZXhlZFJlYWRlcihBYnN0cmFjdFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSwgRmlsZURhdGFJbnB1dCBmaWxlLCBib29sZWFuIHNob3VsZENsb3NlRmlsZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZmlsZSwgc2hvdWxkQ2xvc2VGaWxlKTsKKyAgICAgICAgICAgIGJhc2VQb3NpdGlvbiA9IGluZGV4RW50cnkucG9zaXRpb247CisgICAgICAgICAgICB0aGlzLmluZGV4RW50cnkgPSAoVHJpZUluZGV4RW50cnkpIGluZGV4RW50cnk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGluZGV4UmVhZGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgaW5kZXhSZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9yU2xpY2UoU2xpY2Ugc2xpY2UpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBjdXJyZW50U2xpY2UgPSBzbGljZTsKKyAgICAgICAgICAgIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBtZXRhZGF0YS5jb21wYXJhdG9yOworICAgICAgICAgICAgaWYgKGluZGV4UmVhZGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgaW5kZXhSZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIGluZGV4UmVhZGVyID0gbmV3IFJvd0luZGV4UmV2ZXJzZUl0ZXJhdG9yKGlmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShzbGljZS5lbmQoKSkpOworICAgICAgICAgICAgZ290b0Jsb2NrKGluZGV4UmVhZGVyLm5leHRJbmRleEluZm8oKSwgdHJ1ZSwgTG9uZy5NQVhfVkFMVUUpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBnb3RvQmxvY2soSW5kZXhJbmZvIGluZGV4SW5mbywgYm9vbGVhbiBmaWx0ZXJFbmQsIGxvbmcgYmxvY2tFbmQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBibG9ja09wZW5NYXJrZXIgPSBudWxsOworICAgICAgICAgICAgYmxvY2tDbG9zZU1hcmtlciA9IG51bGw7CisgICAgICAgICAgICByb3dPZmZzZXRzLmNsZWFyKCk7CisgICAgICAgICAgICBpZiAoaW5kZXhJbmZvID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgY3VycmVudEJsb2NrU3RhcnQgPSBiYXNlUG9zaXRpb24gKyBpbmRleEluZm8ub2Zmc2V0OworICAgICAgICAgICAgb3Blbk1hcmtlciA9IGluZGV4SW5mby5vcGVuRGVsZXRpb247CisKKyAgICAgICAgICAgIHNlZWtUb1Bvc2l0aW9uKGN1cnJlbnRCbG9ja1N0YXJ0KTsKKyAgICAgICAgICAgIGZpbGxPZmZzZXRzKGN1cnJlbnRTbGljZSwgdHJ1ZSwgZmlsdGVyRW5kLCBibG9ja0VuZCk7CisgICAgICAgICAgICByZXR1cm4gIXJvd09mZnNldHMuaXNFbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGFkdmFuY2VJbmRleEJsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBnb3RvQmxvY2soaW5kZXhSZWFkZXIubmV4dEluZGV4SW5mbygpLCBmYWxzZSwgY3VycmVudEJsb2NrU3RhcnQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1NjcnViSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9TY3J1Ykl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5MWE2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9TY3J1Ykl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKKworcHVibGljIGNsYXNzIFNjcnViSXRlcmF0b3IgZXh0ZW5kcyBQYXJ0aXRpb25JbmRleC5JbmRleFBvc0l0ZXJhdG9yIGltcGxlbWVudHMgU2NydWJQYXJ0aXRpb25JdGVyYXRvcgoreworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYSEFVU1RFRCA9IC0xOworICAgIEJ5dGVCdWZmZXIga2V5OworICAgIGxvbmcgZGF0YVBvc2l0aW9uOworICAgIGZpbmFsIEZpbGVIYW5kbGUgcm93SW5kZXhGaWxlOworCisgICAgU2NydWJJdGVyYXRvcihQYXJ0aXRpb25JbmRleCBwYXJ0aXRpb25JbmRleCwgRmlsZUhhbmRsZSByb3dJbmRleEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3VwZXIocGFydGl0aW9uSW5kZXgpOworICAgICAgICB0aGlzLnJvd0luZGV4RmlsZSA9IHJvd0luZGV4RmlsZS5zaGFyZWRDb3B5KCk7CisgICAgICAgIGFkdmFuY2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICByb3dJbmRleEZpbGUuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBrZXkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBkYXRhUG9zaXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRhdGFQb3NpdGlvbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZHZhbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIHBvcyA9IG5leHRJbmRleFBvcygpOworICAgICAgICBpZiAocG9zICE9IFBhcnRpdGlvbkluZGV4Lk5PVF9GT1VORCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBvcyA+PSAwKSAvLyByb3cgaW5kZXggcG9zaXRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkgKEZpbGVEYXRhSW5wdXQgaW4gPSByb3dJbmRleEZpbGUuY3JlYXRlUmVhZGVyKHBvcykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrZXkgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVBvc2l0aW9uID0gVHJpZUluZGV4RW50cnkuZGVzZXJpYWxpemUoaW4sIGluLmdldEZpbGVQb2ludGVyKCkpLnBvc2l0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrZXkgPSBudWxsOworICAgICAgICAgICAgICAgIGRhdGFQb3NpdGlvbiA9IH5wb3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBrZXkgPSBudWxsOworICAgICAgICAgICAgZGF0YVBvc2l0aW9uID0gRVhIQVVTVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNFeGhhdXN0ZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRhdGFQb3NpdGlvbiA9PSBFWEhBVVNURUQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1NjcnViUGFydGl0aW9uSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9TY3J1YlBhcnRpdGlvbkl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmODhlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9TY3J1YlBhcnRpdGlvbkl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisvKioKKyAqIEl0ZXJhdG9yIG92ZXIgdGhlIHBhcnRpdGlvbnMgb2YgYW4gc3N0YWJsZSB1c2VkIGZvciBzY3J1YmJpbmcuCisgKiA8cD4KKyAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQge0BsaW5rIFBhcnRpdGlvbkl0ZXJhdG9yfSBpcyB0aGF0IHRoaXMgb25seSB1c2VzIGluZm9ybWF0aW9uIHByZXNlbnQgaW4gdGhlIGluZGV4IGZpbGUKKyAqIGFuZCBkb2VzIG5vdCB0cnkgdG8gcmVhZCBrZXlzIG9mIHRoZSBkYXRhIGZpbGUgKGZvciB0aGUgdHJpZSBpbmRleCBmb3JtYXQpLCB0aHVzIHtAbGluayAja2V5KCl9IGNhbiBiZSBudWxsLgorICogPHA+CisgKiBTdGFydHMgYWR2YW5jZWQgdG8gYSBwb3NpdGlvbiwge0BsaW5rICNhZHZhbmNlKCl9IGlzIHRvIGJlIHVzZWQgdG8gZ28gdG8gbmV4dCwgYW5kIGl0ZXJhdGlvbiBjb21wbGV0ZXMgd2hlbgorICoge0BsaW5rICNkYXRhUG9zaXRpb24oKX0gPT0gLTEuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2NydWJQYXJ0aXRpb25JdGVyYXRvciBleHRlbmRzIENsb3NlYWJsZQoreworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZWQgcGFydGl0aW9uIGtleSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGl0ZXJhdG9yIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW5kZXggb3IgaWYgdGhlIGtleSBtYXkgbm90CisgICAgICogYmUgZnVsbHkgcmV0cmlldmVkIGZyb20gdGhlIGluZGV4IGZpbGUuCisgICAgICovCisgICAgQnl0ZUJ1ZmZlciBrZXkoKTsKKworICAgIC8qKgorICAgICAqIEtleSBwb3NpdGlvbiBpbiBkYXRhIGZpbGUgb3IgLTEgaWYgdGhlIGl0ZXJhdG9yIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW5kZXguCisgICAgICovCisgICAgbG9uZyBkYXRhUG9zaXRpb24oKTsKKworICAgIC8qKgorICAgICAqIE1vdmUgdG8gdGhlIG5leHQgcG9zaXRpb24gaW4gdGhlIGluZGV4IGZpbGUuCisgICAgICovCisgICAgdm9pZCBhZHZhbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgYm9vbGVhbiBpc0V4aGF1c3RlZCgpOworCisgICAgdm9pZCBjbG9zZSgpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1RyaWVJbmRleEVudHJ5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvVHJpZUluZGV4RW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGI3NDNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1RyaWVJbmRleEVudHJ5LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKKworLyoqCisgKiBJbmRleCBlbnRyeSBmb3IgdGhlIEJUSSBwYXJ0aXRpb24gaW5kZXguIFRoaXMgY2FuIGJlIGEgc2ltcGxlIHBvc2l0aW9uIGluIHRoZSBkYXRhIGZpbGUsIG9yIGFuIGVudHJ5IGluIHRoZSByb3cKKyAqIGluZGV4IGZpbGUgd2hlcmUgdGhlIHJvd3MgYXJlIGluZGV4ZWQgaW4gYmxvY2tzIChzZWUge0BsaW5rIFJvd0luZGV4UmVhZGVyfSkuCisgKi8KK2ZpbmFsIGNsYXNzIFRyaWVJbmRleEVudHJ5IGV4dGVuZHMgQWJzdHJhY3RSb3dJbmRleEVudHJ5Cit7CisgICAgZmluYWwgbG9uZyBpbmRleFRyaWVSb290OworICAgIHByaXZhdGUgZmluYWwgaW50IHJvd0luZGV4QmxvY2tDb3VudDsKKyAgICBwcml2YXRlIGZpbmFsIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWU7CisKKyAgICBUcmllSW5kZXhFbnRyeShsb25nIGRhdGFGaWxlUG9zaXRpb24sIGxvbmcgaW5kZXhUcmllUm9vdCwgaW50IHJvd0luZGV4QmxvY2tDb3VudCwgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSkKKyAgICB7CisgICAgICAgIHN1cGVyKGRhdGFGaWxlUG9zaXRpb24pOworICAgICAgICB0aGlzLmluZGV4VHJpZVJvb3QgPSBpbmRleFRyaWVSb290OworICAgICAgICB0aGlzLnJvd0luZGV4QmxvY2tDb3VudCA9IHJvd0luZGV4QmxvY2tDb3VudDsKKyAgICAgICAgdGhpcy5kZWxldGlvblRpbWUgPSBkZWxldGlvblRpbWU7CisgICAgfQorCisgICAgcHVibGljIFRyaWVJbmRleEVudHJ5KGxvbmcgcG9zaXRpb24pCisgICAgeworICAgICAgICBzdXBlcihwb3NpdGlvbik7CisgICAgICAgIHRoaXMuaW5kZXhUcmllUm9vdCA9IC0xOworICAgICAgICB0aGlzLnJvd0luZGV4QmxvY2tDb3VudCA9IDA7CisgICAgICAgIHRoaXMuZGVsZXRpb25UaW1lID0gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGJsb2NrQ291bnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJvd0luZGV4QmxvY2tDb3VudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU1NUYWJsZUZvcm1hdDw/LCA/PiBnZXRTU1RhYmxlRm9ybWF0KCkKKyAgICB7CisgICAgICAgIHRocm93IG5vS2V5Q2FjaGVFcnJvcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZUZvckNhY2hlKERhdGFPdXRwdXRQbHVzIG91dCkKKyAgICB7CisgICAgICAgIHRocm93IG5vS2V5Q2FjaGVFcnJvcigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEFzc2VydGlvbkVycm9yIG5vS2V5Q2FjaGVFcnJvcigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFzc2VydGlvbkVycm9yKCJCVEkgU1NUYWJsZXMgc2hvdWxkIG5vdCB1c2Uga2V5IGNhY2hlIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGV0aW9uVGltZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiQlRJIFNTVGFibGVzIGluZGV4IGVudHJpZXMgc2hvdWxkIG5vdCBiZSBwZXJzaXN0ZWQgaW4gYW55IGluLW1lbW9yeSBzdHJ1Y3R1cmUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgaW5kZXhGaWxlLCBsb25nIGJhc2VQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBhc3NlcnQgaW5kZXhUcmllUm9vdCAhPSAtMSAmJiByb3dJbmRleEJsb2NrQ291bnQgPiAwICYmIGRlbGV0aW9uVGltZSAhPSBudWxsOworICAgICAgICBpbmRleEZpbGUud3JpdGVVbnNpZ25lZFZJbnQocG9zaXRpb24pOworICAgICAgICBpbmRleEZpbGUud3JpdGVWSW50KGluZGV4VHJpZVJvb3QgLSBiYXNlUG9zaXRpb24pOworICAgICAgICBpbmRleEZpbGUud3JpdGVVbnNpZ25lZFZJbnQzMihyb3dJbmRleEJsb2NrQ291bnQpOworICAgICAgICBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemUoZGVsZXRpb25UaW1lLCBpbmRleEZpbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbmRleCBlbnRyeS4gVGhlIHJvdyBpbmRleCB0cmllIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4gd3JpdHRlbiAoYnkgUm93SW5kZXhXcml0ZXIpIHRvIHRoZSByb3cgaW5kZXgKKyAgICAgKiBmaWxlIGFuZCBpdHMgcm9vdCBwb3NpdGlvbiBtdXN0IGJlIHNwZWNpZmllZCBpbiB0cmllUm9vdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRyaWVJbmRleEVudHJ5IGNyZWF0ZShsb25nIGRhdGFTdGFydFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdHJpZVJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRpb25UaW1lIHBhcnRpdGlvbkxldmVsRGVsZXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd0luZGV4QmxvY2tDb3VudCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVHJpZUluZGV4RW50cnkoZGF0YVN0YXJ0UG9zaXRpb24sIHRyaWVSb290LCB0cmllUm9vdCA9PSAtMSA/IDAgOiByb3dJbmRleEJsb2NrQ291bnQsIHBhcnRpdGlvbkxldmVsRGVsZXRpb24pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVHJpZUluZGV4RW50cnkgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgbG9uZyBiYXNlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBkYXRhRmlsZVBvc2l0aW9uID0gaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICBsb25nIGluZGV4VHJpZVJvb3QgPSBpbi5yZWFkVkludCgpICsgYmFzZVBvc2l0aW9uOworICAgICAgICBpbnQgcm93SW5kZXhCbG9ja0NvdW50ID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CisgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUgPSBEZWxldGlvblRpbWUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbik7CisgICAgICAgIHJldHVybiBuZXcgVHJpZUluZGV4RW50cnkoZGF0YUZpbGVQb3NpdGlvbiwgaW5kZXhUcmllUm9vdCwgcm93SW5kZXhCbG9ja0NvdW50LCBkZWxldGlvblRpbWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDVkMjM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5LmphdmEKQEAgLTAsMCArMSw0ODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRG93bnNhbXBsaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5NZW1vcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5NZW1vcnlPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LldyYXBwZWRTaGFyZWRDbG9zZWFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk1lbW9yeVV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Eb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTDsKKworLyoKKyAqIExheW91dCBvZiBNZW1vcnkgZm9yIGluZGV4IHN1bW1hcmllczoKKyAqCisgKiBUaGVyZSBhcmUgdHdvIHNlY3Rpb25zOgorICogIDEuIEEgImhlYWRlciIgY29udGFpbmluZyB0aGUgb2Zmc2V0IGludG8gYGJ5dGVzYCBvZiBlbnRyaWVzIGluIHRoZSBzdW1tYXJ5IHN1bW1hcnkgZGF0YSwgY29uc2lzdGluZyBvZgorICogICAgIG9uZSBmb3VyIGJ5dGUgcG9zaXRpb24gZm9yIGVhY2ggZW50cnkgaW4gdGhlIHN1bW1hcnkuICBUaGlzIGFsbG93cyB1cyBkbyBzaW1wbGUgbWF0aCBpbiBnZXRJbmRleCgpCisgKiAgICAgdG8gZmluZCB0aGUgcG9zaXRpb24gaW4gdGhlIE1lbW9yeSB0byBzdGFydCByZWFkaW5nIHRoZSBhY3R1YWwgaW5kZXggc3VtbWFyeSBlbnRyeS4KKyAqICAgICAoVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBrZXlzIGNhbiBoYXZlIGRpZmZlcmVudCBsZW5ndGhzLikKKyAqICAyLiAgQSBzZXF1ZW5jZSBvZiAoRGVjb3JhdGVkS2V5LCBwb3NpdGlvbikgcGFpcnMsIHdoZXJlIHBvc2l0aW9uIGlzIHRoZSBvZmZzZXQgaW50byB0aGUgYWN0dWFsIGluZGV4IGZpbGUuCisgKi8KK3B1YmxpYyBjbGFzcyBJbmRleFN1bW1hcnkgZXh0ZW5kcyBXcmFwcGVkU2hhcmVkQ2xvc2VhYmxlCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEluZGV4U3VtbWFyeS5jbGFzcyk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbmRleFN1bW1hcnlTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgSW5kZXhTdW1tYXJ5U2VyaWFsaXplcigpOworCisgICAgLyoqCisgICAgICogQSBsb3dlciBib3VuZCBmb3IgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHBhcnRpdGlvbnMgaW4gYmV0d2VlbiBlYWNoIGluZGV4IHN1bW1hcnkgZW50cnkuIEEgbG93ZXIgdmFsdWUgbWVhbnMKKyAgICAgKiB0aGF0IG1vcmUgcGFydGl0aW9ucyB3aWxsIGhhdmUgYW4gZW50cnkgaW4gdGhlIGluZGV4IHN1bW1hcnkgd2hlbiBhdCB0aGUgZnVsbCBzYW1wbGluZyBsZXZlbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBtaW5JbmRleEludGVydmFsOworCisgICAgcHJpdmF0ZSBmaW5hbCBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgc2l6ZUF0RnVsbFNhbXBsaW5nOworICAgIC8vIHdlIHBlcm1pdCB0aGUgbWVtb3J5IHRvIHNwYW4gYSByYW5nZSBsYXJnZXIgdGhhbiB3ZSB1c2UsCisgICAgLy8gc28gd2UgaGF2ZSBhbiBhY2NvbXBhbnlpbmcgY291bnQgYW5kIGxlbmd0aCBmb3IgZWFjaCBwYXJ0CisgICAgLy8gd2Ugc3BsaXQgb3VyIGRhdGEgaW50byB0d28gcmFuZ2VzOiBvZmZzZXRzIChpbmRleGluZyBpbnRvIGVudHJpZXMpLAorICAgIC8vIGFuZCBlbnRyaWVzIGNvbnRhaW5pbmcgdGhlIHN1bW1hcnkgZGF0YQorICAgIHByaXZhdGUgZmluYWwgTWVtb3J5IG9mZnNldHM7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgb2Zmc2V0Q291bnQ7CisgICAgLy8gZW50cmllcyBpcyBhIGxpc3Qgb2YgKHBhcnRpdGlvbiBrZXksIGluZGV4IGZpbGUgb2Zmc2V0KSBwYWlycworICAgIHByaXZhdGUgZmluYWwgTWVtb3J5IGVudHJpZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGVudHJpZXNMZW5ndGg7CisKKyAgICAvKioKKyAgICAgKiBBIHZhbHVlIGJldHdlZW4gMSBhbmQgQkFTRV9TQU1QTElOR19MRVZFTCB0aGF0IHJlcHJlc2VudHMgaG93IG1hbnkgb2YgdGhlIG9yaWdpbmFsCisgICAgICogaW5kZXggc3VtbWFyeSBlbnRyaWVzICgoMSAvIGluZGV4SW50ZXJ2YWwpICogbnVtS2V5cykgaGF2ZSBiZWVuIHJldGFpbmVkLgorICAgICAqCisgICAgICogVGh1cywgdGhpcyBzdW1tYXJ5IGNvbnRhaW5zIChzYW1wbGluZ0xldmVsIC8gQkFTRV9TQU1QTElOR19MRVZFTCkgKiAoKDEgLyBpbmRleEludGVydmFsKSAqIG51bUtleXMpKSBlbnRyaWVzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IHNhbXBsaW5nTGV2ZWw7CisKKyAgICBwdWJsaWMgSW5kZXhTdW1tYXJ5KElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciwgTWVtb3J5IG9mZnNldHMsIGludCBvZmZzZXRDb3VudCwgTWVtb3J5IGVudHJpZXMsIGxvbmcgZW50cmllc0xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplQXRGdWxsU2FtcGxpbmcsIGludCBtaW5JbmRleEludGVydmFsLCBpbnQgc2FtcGxpbmdMZXZlbCkKKyAgICB7CisgICAgICAgIHN1cGVyKG5ldyBNZW1vcnlbXSB7IG9mZnNldHMsIGVudHJpZXMgfSk7CisgICAgICAgIGFzc2VydCBvZmZzZXRzLmdldEludCgwKSA9PSAwOworICAgICAgICB0aGlzLnBhcnRpdGlvbmVyID0gcGFydGl0aW9uZXI7CisgICAgICAgIHRoaXMubWluSW5kZXhJbnRlcnZhbCA9IG1pbkluZGV4SW50ZXJ2YWw7CisgICAgICAgIHRoaXMub2Zmc2V0Q291bnQgPSBvZmZzZXRDb3VudDsKKyAgICAgICAgdGhpcy5lbnRyaWVzTGVuZ3RoID0gZW50cmllc0xlbmd0aDsKKyAgICAgICAgdGhpcy5zaXplQXRGdWxsU2FtcGxpbmcgPSBzaXplQXRGdWxsU2FtcGxpbmc7CisgICAgICAgIHRoaXMub2Zmc2V0cyA9IG9mZnNldHM7CisgICAgICAgIHRoaXMuZW50cmllcyA9IGVudHJpZXM7CisgICAgICAgIHRoaXMuc2FtcGxpbmdMZXZlbCA9IHNhbXBsaW5nTGV2ZWw7CisgICAgICAgIGFzc2VydCBzYW1wbGluZ0xldmVsID4gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIEluZGV4U3VtbWFyeShJbmRleFN1bW1hcnkgY29weSkKKyAgICB7CisgICAgICAgIHN1cGVyKGNvcHkpOworICAgICAgICB0aGlzLnBhcnRpdGlvbmVyID0gY29weS5wYXJ0aXRpb25lcjsKKyAgICAgICAgdGhpcy5taW5JbmRleEludGVydmFsID0gY29weS5taW5JbmRleEludGVydmFsOworICAgICAgICB0aGlzLm9mZnNldENvdW50ID0gY29weS5vZmZzZXRDb3VudDsKKyAgICAgICAgdGhpcy5lbnRyaWVzTGVuZ3RoID0gY29weS5lbnRyaWVzTGVuZ3RoOworICAgICAgICB0aGlzLnNpemVBdEZ1bGxTYW1wbGluZyA9IGNvcHkuc2l6ZUF0RnVsbFNhbXBsaW5nOworICAgICAgICB0aGlzLm9mZnNldHMgPSBjb3B5Lm9mZnNldHM7CisgICAgICAgIHRoaXMuZW50cmllcyA9IGNvcHkuZW50cmllczsKKyAgICAgICAgdGhpcy5zYW1wbGluZ0xldmVsID0gY29weS5zYW1wbGluZ0xldmVsOworICAgIH0KKworICAgIC8vIGJpbmFyeSBzZWFyY2ggaXMgbm90b3Jpb3VzbHkgbW9yZSBkaWZmaWN1bHQgdG8gZ2V0IHJpZ2h0IHRoYW4gaXQgbG9va3M7IHRoaXMgaXMgbGlmdGVkIGZyb20KKyAgICAvLyBIYXJtb255J3MgQ29sbGVjdGlvbnMgaW1wbGVtZW50YXRpb24KKyAgICBwdWJsaWMgaW50IGJpbmFyeVNlYXJjaChQYXJ0aXRpb25Qb3NpdGlvbiBrZXkpCisgICAgeworICAgICAgICAvLyBXZSB3aWxsIGJlIGNvbXBhcmluZyBub24tbmF0aXZlIEtleXMsIHNvIHVzZSBhIGJ1ZmZlciB3aXRoIGFwcHJvcHJpYXRlIGJ5dGUgb3JkZXIKKyAgICAgICAgQnl0ZUJ1ZmZlciBob2xsb3cgPSBNZW1vcnlVdGlsLmdldEhvbGxvd0RpcmVjdEJ5dGVCdWZmZXIoKS5vcmRlcihCeXRlT3JkZXIuQklHX0VORElBTik7CisgICAgICAgIGludCBsb3cgPSAwLCBtaWQgPSBvZmZzZXRDb3VudCwgaGlnaCA9IG1pZCAtIDEsIHJlc3VsdCA9IC0xOworICAgICAgICB3aGlsZSAobG93IDw9IGhpZ2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pZCA9IChsb3cgKyBoaWdoKSA+PiAxOworICAgICAgICAgICAgZmlsbFRlbXBvcmFyeUtleShtaWQsIGhvbGxvdyk7CisgICAgICAgICAgICByZXN1bHQgPSAtRGVjb3JhdGVkS2V5LmNvbXBhcmVUbyhwYXJ0aXRpb25lciwgaG9sbG93LCBrZXkpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtaWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gLW1pZCAtIChyZXN1bHQgPCAwID8gMSA6IDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBhY3R1YWwgaW5kZXggc3VtbWFyeSBlbnRyeSBpbiBvdXIgTWVtb3J5IGF0dHJpYnV0ZSwgJ2J5dGVzJy4KKyAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBlbnRyeSBvciBrZXkgdG8gZ2V0IHRoZSBwb3NpdGlvbiBmb3IKKyAgICAgKiBAcmV0dXJuIGFuIG9mZnNldCBpbnRvIG91ciBNZW1vcnkgYXR0cmlidXRlIHdoZXJlIHRoZSBhY3R1YWwgZW50cnkgcmVzaWRlcworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UG9zaXRpb25JblN1bW1hcnkoaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgLy8gVGhlIGZpcnN0IHNlY3Rpb24gb2YgYnl0ZXMgaG9sZHMgYSBmb3VyLWJ5dGUgcG9zaXRpb24gZm9yIGVhY2ggZW50cnkgaW4gdGhlIHN1bW1hcnksIHNvIGp1c3QgbXVsdGlwbHkgYnkgNC4KKyAgICAgICAgcmV0dXJuIG9mZnNldHMuZ2V0SW50KGluZGV4IDw8IDIpOworICAgIH0KKworICAgIHB1YmxpYyBieXRlW10gZ2V0S2V5KGludCBpbmRleCkKKyAgICB7CisgICAgICAgIGxvbmcgc3RhcnQgPSBnZXRQb3NpdGlvbkluU3VtbWFyeShpbmRleCk7CisgICAgICAgIGludCBrZXlTaXplID0gKGludCkgKGNhbGN1bGF0ZUVuZChpbmRleCkgLSBzdGFydCAtIDhMKTsKKyAgICAgICAgYnl0ZVtdIGtleSA9IG5ldyBieXRlW2tleVNpemVdOworICAgICAgICBlbnRyaWVzLmdldEJ5dGVzKHN0YXJ0LCBrZXksIDAsIGtleVNpemUpOworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaWxsVGVtcG9yYXJ5S2V5KGludCBpbmRleCwgQnl0ZUJ1ZmZlciBidWZmZXIpCisgICAgeworICAgICAgICBsb25nIHN0YXJ0ID0gZ2V0UG9zaXRpb25JblN1bW1hcnkoaW5kZXgpOworICAgICAgICBpbnQga2V5U2l6ZSA9IChpbnQpIChjYWxjdWxhdGVFbmQoaW5kZXgpIC0gc3RhcnQgLSA4TCk7CisgICAgICAgIGVudHJpZXMuc2V0Qnl0ZUJ1ZmZlcihidWZmZXIsIHN0YXJ0LCBrZXlTaXplKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRUbyhSZWYuSWRlbnRpdHlDb2xsZWN0aW9uIGlkZW50aXRpZXMpCisgICAgeworICAgICAgICBzdXBlci5hZGRUbyhpZGVudGl0aWVzKTsKKyAgICAgICAgaWRlbnRpdGllcy5hZGQob2Zmc2V0cyk7CisgICAgICAgIGlkZW50aXRpZXMuYWRkKGVudHJpZXMpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFBvc2l0aW9uKGludCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBlbnRyaWVzLmdldExvbmcoY2FsY3VsYXRlRW5kKGluZGV4KSAtIDgpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEVuZEluU3VtbWFyeShpbnQgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gY2FsY3VsYXRlRW5kKGluZGV4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgY2FsY3VsYXRlRW5kKGludCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiBpbmRleCA9PSAob2Zmc2V0Q291bnQgLSAxKSA/IGVudHJpZXNMZW5ndGggOiBnZXRQb3NpdGlvbkluU3VtbWFyeShpbmRleCArIDEpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TWluSW5kZXhJbnRlcnZhbCgpCisgICAgeworICAgICAgICByZXR1cm4gbWluSW5kZXhJbnRlcnZhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChCQVNFX1NBTVBMSU5HX0xFVkVMIC8gKGRvdWJsZSkgc2FtcGxpbmdMZXZlbCkgKiBtaW5JbmRleEludGVydmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIHRvdGFsIG51bWJlciBvZiBrZXlzIGluIHRoZSBTU1RhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEVzdGltYXRlZEtleUNvdW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiAoKGxvbmcpIGdldE1heE51bWJlck9mRW50cmllcygpICsgMSkgKiBtaW5JbmRleEludGVydmFsOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgc2l6ZSgpCisgICAgeworICAgICAgICByZXR1cm4gb2Zmc2V0Q291bnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTYW1wbGluZ0xldmVsKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzYW1wbGluZ0xldmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIHRoaXMgc3VtbWFyeSB3b3VsZCBoYXZlIGlmIGl0IHdlcmUgYXQgdGhlIGZ1bGwgc2FtcGxpbmcgbGV2ZWwsIHdoaWNoIGlzIGVxdWFsCisgICAgICogdG8gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBwcmltYXJ5IG9uLWRpc2sgaW5kZXggZGl2aWRlZCBieSB0aGUgbWluIGluZGV4IGludGVydmFsLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4TnVtYmVyT2ZFbnRyaWVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzaXplQXRGdWxsU2FtcGxpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYW1vdW50IG9mIG9mZi1oZWFwIG1lbW9yeSB1c2VkIGZvciB0aGUgZW50cmllcyBwb3J0aW9uIG9mIHRoaXMgc3VtbWFyeS4KKyAgICAgKiBAcmV0dXJuIHNpemUgaW4gYnl0ZXMKKyAgICAgKi8KKyAgICBsb25nIGdldEVudHJpZXNMZW5ndGgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVudHJpZXNMZW5ndGg7CisgICAgfQorCisgICAgTWVtb3J5IGdldE9mZnNldHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9mZnNldHM7CisgICAgfQorCisgICAgTWVtb3J5IGdldEVudHJpZXMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVudHJpZXM7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0T2ZmSGVhcFNpemUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9mZnNldENvdW50ICogNCArIGVudHJpZXNMZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHByaW1hcnkgKG9uLWRpc2spIGluZGV4IGVudHJpZXMgYmV0d2VlbiB0aGUgaW5kZXggc3VtbWFyeSBlbnRyeSBhdCBgaW5kZXhgIGFuZCB0aGUgbmV4dAorICAgICAqIGluZGV4IHN1bW1hcnkgZW50cnkgKGFzc3VtaW5nIHRoZXJlIGlzIG9uZSkuICBXaXRob3V0IGFueSBkb3duc2FtcGxpbmcsIHRoaXMgd2lsbCBhbHdheXMgYmUgZXF1aXZhbGVudCB0bworICAgICAqIHRoZSBpbmRleCBpbnRlcnZhbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgYW4gaW5kZXggc3VtbWFyeSBlbnRyeSAoYmV0d2VlbiB6ZXJvIGFuZCB0aGUgaW5kZXggZW50cnkgc2l6ZSkKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBwYXJ0aXRpb25zIGFmdGVyIGBpbmRleGAgdW50aWwgdGhlIG5leHQgcGFydGl0aW9uIHdpdGggYSBzdW1tYXJ5IGVudHJ5CisgICAgICovCisgICAgcHVibGljIGludCBnZXRFZmZlY3RpdmVJbmRleEludGVydmFsQWZ0ZXJJbmRleChpbnQgaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gRG93bnNhbXBsaW5nLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KGluZGV4LCBzYW1wbGluZ0xldmVsLCBtaW5JbmRleEludGVydmFsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxTU1RhYmxlUmVhZGVyLkluZGV4ZXNCb3VuZHM+IGdldFNhbXBsZUluZGV4ZXNGb3JSYW5nZXMoQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+IHJhbmdlcykKKyAgICB7CisgICAgICAgIC8vIHVzZSB0aGUgaW5kZXggdG8gZGV0ZXJtaW5lIGEgbWluaW1hbCBzZWN0aW9uIGZvciBlYWNoIHJhbmdlCisgICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlci5JbmRleGVzQm91bmRzPiBwb3NpdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBmb3IgKFJhbmdlPFRva2VuPiByYW5nZSA6IFJhbmdlLm5vcm1hbGl6ZShyYW5nZXMpKQorICAgICAgICB7CisgICAgICAgICAgICBQYXJ0aXRpb25Qb3NpdGlvbiBsZWZ0UG9zaXRpb24gPSByYW5nZS5sZWZ0Lm1heEtleUJvdW5kKCk7CisgICAgICAgICAgICBQYXJ0aXRpb25Qb3NpdGlvbiByaWdodFBvc2l0aW9uID0gcmFuZ2UucmlnaHQubWF4S2V5Qm91bmQoKTsKKworICAgICAgICAgICAgaW50IGxlZnQgPSBiaW5hcnlTZWFyY2gobGVmdFBvc2l0aW9uKTsKKyAgICAgICAgICAgIGlmIChsZWZ0IDwgMCkKKyAgICAgICAgICAgICAgICBsZWZ0ID0gKGxlZnQgKyAxKSAqIC0xOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC8vIGxlZnQgcmFuZ2UgYXJlIHN0YXJ0IGV4Y2x1c2l2ZQorICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0ICsgMTsKKyAgICAgICAgICAgIGlmIChsZWZ0ID09IHNpemUoKSkKKyAgICAgICAgICAgICAgICAvLyBsZWZ0IGlzIHBhc3QgdGhlIGVuZCBvZiB0aGUgc2FtcGxpbmcKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaW50IHJpZ2h0ID0gUmFuZ2UuaXNXcmFwQXJvdW5kKHJhbmdlLmxlZnQsIHJhbmdlLnJpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgPyBzaXplKCkgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICA6IGJpbmFyeVNlYXJjaChyaWdodFBvc2l0aW9uKTsKKyAgICAgICAgICAgIGlmIChyaWdodCA8IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gcmFuZ2UgYXJlIGVuZCBpbmNsdXNpdmUgc28gd2UgdXNlIHRoZSBwcmV2aW91cyBpbmRleCBmcm9tIHdoYXQgYmluYXJ5U2VhcmNoIGdpdmUgdXMKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGF0IHdpbGwgYmUgdGhlIGxhc3QgaW5kZXggd2Ugd2lsbCByZXR1cm4KKyAgICAgICAgICAgICAgICByaWdodCA9IChyaWdodCArIDEpICogLTE7CisgICAgICAgICAgICAgICAgaWYgKHJpZ2h0ID09IDApCisgICAgICAgICAgICAgICAgICAgIC8vIE1lYW5zIHRoZSBmaXJzdCBrZXkgaXMgYWxyZWFkeSBzdHJpY2x5IGdyZWF0ZXIgdGhhdCB0aGUgcmlnaHQgYm91bmQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgcmlnaHQtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxlZnQgPiByaWdodCkKKyAgICAgICAgICAgICAgICAvLyBlbXB0eSByYW5nZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcG9zaXRpb25zLmFkZChuZXcgU1NUYWJsZVJlYWRlci5JbmRleGVzQm91bmRzKGxlZnQsIHJpZ2h0KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvc2l0aW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmFibGU8Ynl0ZVtdPiBnZXRLZXlTYW1wbGVzKGZpbmFsIFJhbmdlPFRva2VuPiByYW5nZSkKKyAgICB7CisgICAgICAgIGZpbmFsIExpc3Q8U1NUYWJsZVJlYWRlci5JbmRleGVzQm91bmRzPiBpbmRleFJhbmdlcyA9IGdldFNhbXBsZUluZGV4ZXNGb3JSYW5nZXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyYW5nZSkpOworCisgICAgICAgIGlmIChpbmRleFJhbmdlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisKKyAgICAgICAgcmV0dXJuICgpIC0+IG5ldyBJdGVyYXRvcjxieXRlW10+KCkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxTU1RhYmxlUmVhZGVyLkluZGV4ZXNCb3VuZHM+IHJhbmdlSXRlciA9IGluZGV4UmFuZ2VzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBwcml2YXRlIFNTVGFibGVSZWFkZXIuSW5kZXhlc0JvdW5kcyBjdXJyZW50OworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgaWR4OworCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsIHx8IGlkeCA+IGN1cnJlbnQudXBwZXJQb3NpdGlvbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZUl0ZXIuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gcmFuZ2VJdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IGN1cnJlbnQubG93ZXJQb3NpdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJ5dGVbXSBuZXh0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0S2V5KGlkeCsrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRTY2FuUG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24ga2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldFNjYW5Qb3NpdGlvbkZyb21CaW5hcnlTZWFyY2hSZXN1bHQoYmluYXJ5U2VhcmNoKGtleSkpOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBsb25nIGdldFNjYW5Qb3NpdGlvbkZyb21CaW5hcnlTZWFyY2hSZXN1bHQoaW50IGJpbmFyeVNlYXJjaFJlc3VsdCkKKyAgICB7CisgICAgICAgIGlmIChiaW5hcnlTZWFyY2hSZXN1bHQgPT0gLTEpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGdldFBvc2l0aW9uKGdldEluZGV4RnJvbUJpbmFyeVNlYXJjaFJlc3VsdChiaW5hcnlTZWFyY2hSZXN1bHQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRJbmRleEZyb21CaW5hcnlTZWFyY2hSZXN1bHQoaW50IGJpbmFyeVNlYXJjaFJlc3VsdCkKKyAgICB7CisgICAgICAgIGlmIChiaW5hcnlTZWFyY2hSZXN1bHQgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBiaW5hcnkgc2VhcmNoIGdpdmVzIHVzIHRoZSBmaXJzdCBpbmRleCBfZ3JlYXRlcl8gdGhhbiB0aGUga2V5IHNlYXJjaGVkIGZvciwKKyAgICAgICAgICAgIC8vIGkuZS4sIGl0cyBpbnNlcnRpb24gcG9zaXRpb24KKyAgICAgICAgICAgIGludCBncmVhdGVyVGhhbiA9IChiaW5hcnlTZWFyY2hSZXN1bHQgKyAxKSAqIC0xOworICAgICAgICAgICAgaWYgKGdyZWF0ZXJUaGFuID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgcmV0dXJuIGdyZWF0ZXJUaGFuIC0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBiaW5hcnlTZWFyY2hSZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSW5kZXhTdW1tYXJ5IHNoYXJlZENvcHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbmRleFN1bW1hcnkodGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmRleFN1bW1hcnlTZXJpYWxpemVyCisgICAgeworICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoSW5kZXhTdW1tYXJ5IHQsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dC53cml0ZUludCh0Lm1pbkluZGV4SW50ZXJ2YWwpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KHQub2Zmc2V0Q291bnQpOworICAgICAgICAgICAgb3V0LndyaXRlTG9uZyh0LmdldE9mZkhlYXBTaXplKCkpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KHQuc2FtcGxpbmdMZXZlbCk7CisgICAgICAgICAgICBvdXQud3JpdGVJbnQodC5zaXplQXRGdWxsU2FtcGxpbmcpOworICAgICAgICAgICAgLy8gb3VyIG9uLWRpc2sgcmVwcmVzZW50YXRpb24gdHJlYXRzIHRoZSBvZmZzZXRzIGFuZCB0aGUgc3VtbWFyeSBkYXRhIGFzIG9uZSBjb250aWd1b3VzIHN0cnVjdHVyZSwKKyAgICAgICAgICAgIC8vIGluIHdoaWNoIHRoZSBvZmZzZXRzIGFyZSBiYXNlZCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc3RydWN0dXJlLiBpLmUuLCBpZiB0aGUgb2Zmc2V0cyBvY2N1cHkKKyAgICAgICAgICAgIC8vIFggYnl0ZXMsIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3Qgb2Zmc2V0IHdpbGwgYmUgWC4gSW4gbWVtb3J5IHdlIHNwbGl0IHRoZSB0d28gcmVnaW9ucyB1cCwgc28gdGhhdAorICAgICAgICAgICAgLy8gdGhlIHN1bW1hcnkgdmFsdWVzIGFyZSBpbmRleGVkIGZyb20gemVybywgc28gd2UgYXBwbHkgYSBjb3JyZWN0aW9uIHRvIHRoZSBvZmZzZXRzIHdoZW4gZGUvc2VyaWFsaXppbmcuCisgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UgYWRkaW5nIFggdG8gZWFjaCBvZiB0aGUgb2Zmc2V0cy4KKyAgICAgICAgICAgIGludCBiYXNlT2Zmc2V0ID0gdC5vZmZzZXRDb3VudCAqIDQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCB0Lm9mZnNldENvdW50IDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSB0Lm9mZnNldHMuZ2V0SW50KGkgKiA0KSArIGJhc2VPZmZzZXQ7CisgICAgICAgICAgICAgICAgLy8gb3VyIHNlcmlhbGl6YXRpb24gZm9ybWF0IGZvciB0aGlzIGZpbGUgdXNlcyBuYXRpdmUgYnl0ZSBvcmRlciwgc28gaWYgdGhpcyBpcyBkaWZmZXJlbnQgdG8gdGhlCisgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBKYXZhIHNlcmlhbGl6YXRpb24gb3JkZXIgKEJJR19FTkRJQU4pIHdlIGhhdmUgdG8gcmV2ZXJzZSBvdXIgYnl0ZXMKKyAgICAgICAgICAgICAgICBpZiAoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkgIT0gQnl0ZU9yZGVyLkJJR19FTkRJQU4pCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IEludGVnZXIucmV2ZXJzZUJ5dGVzKG9mZnNldCk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KG9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQud3JpdGUodC5lbnRyaWVzLCAwLCB0LmVudHJpZXNMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICAgICAgcHVibGljIDxUIGV4dGVuZHMgSW5wdXRTdHJlYW0gJiBEYXRhSW5wdXRQbHVzPiBJbmRleFN1bW1hcnkgZGVzZXJpYWxpemUoVCBpbiwgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyLCBpbnQgZXhwZWN0ZWRNaW5JbmRleEludGVydmFsLCBpbnQgbWF4SW5kZXhJbnRlcnZhbCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBtaW5JbmRleEludGVydmFsID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgaWYgKG1pbkluZGV4SW50ZXJ2YWwgIT0gZXhwZWN0ZWRNaW5JbmRleEludGVydmFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJDYW5ub3QgcmVhZCBpbmRleCBzdW1tYXJ5IGJlY2F1c2UgbWluX2luZGV4X2ludGVydmFsIGNoYW5nZWQgZnJvbSAlZCB0byAlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkluZGV4SW50ZXJ2YWwsIGV4cGVjdGVkTWluSW5kZXhJbnRlcnZhbCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgb2Zmc2V0Q291bnQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICBsb25nIG9mZmhlYXBTaXplID0gaW4ucmVhZExvbmcoKTsKKyAgICAgICAgICAgIGludCBzYW1wbGluZ0xldmVsID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgaW50IGZ1bGxTYW1wbGluZ1N1bW1hcnlTaXplID0gaW4ucmVhZEludCgpOworCisgICAgICAgICAgICBpbnQgZWZmZWN0aXZlSW5kZXhJbnRlcnZhbCA9IChpbnQpIE1hdGguY2VpbCgoQkFTRV9TQU1QTElOR19MRVZFTCAvIChkb3VibGUpIHNhbXBsaW5nTGV2ZWwpICogbWluSW5kZXhJbnRlcnZhbCk7CisgICAgICAgICAgICBpZiAoZWZmZWN0aXZlSW5kZXhJbnRlcnZhbCA+IG1heEluZGV4SW50ZXJ2YWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlJlYnVpbGRpbmcgaW5kZXggc3VtbWFyeSBiZWNhdXNlIHRoZSBlZmZlY3RpdmUgaW5kZXggaW50ZXJ2YWwgKCVkKSBpcyBoaWdoZXIgdGhhbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdGhlIGN1cnJlbnQgbWF4IGluZGV4IGludGVydmFsICglZCkiLCBlZmZlY3RpdmVJbmRleEludGVydmFsLCBtYXhJbmRleEludGVydmFsKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1lbW9yeSBvZmZzZXRzID0gTWVtb3J5LmFsbG9jYXRlKG9mZnNldENvdW50ICogNCk7CisgICAgICAgICAgICBNZW1vcnkgZW50cmllcyA9IE1lbW9yeS5hbGxvY2F0ZShvZmZoZWFwU2l6ZSAtIG9mZnNldHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLmNvcHkoaW4sIG5ldyBNZW1vcnlPdXRwdXRTdHJlYW0ob2Zmc2V0cyksIG9mZnNldHMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5jb3B5KGluLCBuZXcgTWVtb3J5T3V0cHV0U3RyZWFtKGVudHJpZXMpLCBlbnRyaWVzLnNpemUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mZnNldHMuZnJlZSgpOworICAgICAgICAgICAgICAgIGVudHJpZXMuZnJlZSgpOworICAgICAgICAgICAgICAgIHRocm93IGlvZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG91ciBvbi1kaXNrIHJlcHJlc2VudGF0aW9uIHRyZWF0cyB0aGUgb2Zmc2V0cyBhbmQgdGhlIHN1bW1hcnkgZGF0YSBhcyBvbmUgY29udGlndW91cyBzdHJ1Y3R1cmUsCisgICAgICAgICAgICAvLyBpbiB3aGljaCB0aGUgb2Zmc2V0cyBhcmUgYmFzZWQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHN0cnVjdHVyZS4gaS5lLiwgaWYgdGhlIG9mZnNldHMgb2NjdXB5CisgICAgICAgICAgICAvLyBYIGJ5dGVzLCB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IG9mZnNldCB3aWxsIGJlIFguIEluIG1lbW9yeSB3ZSBzcGxpdCB0aGUgdHdvIHJlZ2lvbnMgdXAsIHNvIHRoYXQKKyAgICAgICAgICAgIC8vIHRoZSBzdW1tYXJ5IHZhbHVlcyBhcmUgaW5kZXhlZCBmcm9tIHplcm8sIHNvIHdlIGFwcGx5IGEgY29ycmVjdGlvbiB0byB0aGUgb2Zmc2V0cyB3aGVuIGRlL3NlcmlhbGl6aW5nLgorICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHN1YnRyYWN0aW5nIFggZnJvbSBlYWNoIG9mIHRoZSBvZmZzZXRzLgorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgb2Zmc2V0cy5zaXplKCkgOyBpICs9IDQpCisgICAgICAgICAgICAgICAgb2Zmc2V0cy5zZXRJbnQoaSwgKGludCkgKG9mZnNldHMuZ2V0SW50KGkpIC0gb2Zmc2V0cy5zaXplKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhTdW1tYXJ5KHBhcnRpdGlvbmVyLCBvZmZzZXRzLCBvZmZzZXRDb3VudCwgZW50cmllcywgZW50cmllcy5zaXplKCksIGZ1bGxTYW1wbGluZ1N1bW1hcnlTaXplLCBtaW5JbmRleEludGVydmFsLCBzYW1wbGluZ0xldmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZXNlcmlhbGl6ZXMgdGhlIGZpcnN0IGFuZCBsYXN0IGtleSBzdG9yZWQgaW4gdGhlIHN1bW1hcnkKKyAgICAgICAgICogPHA+CisgICAgICAgICAqIE9ubHkgZm9yIHVzZSBieSBvZmZsaW5lIHRvb2xzIGxpa2UgU1NUYWJsZU1ldGFkYXRhVmlld2VyLCBvdGhlcndpc2UgU1NUYWJsZS5maXJzdC9sYXN0IHNob3VsZCBiZSB1c2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFBhaXI8RGVjb3JhdGVkS2V5LCBEZWNvcmF0ZWRLZXk+IGRlc2VyaWFsaXplRmlyc3RMYXN0S2V5KERhdGFJbnB1dFN0cmVhbVBsdXMgaW4sIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGluLnNraXBCeXRlcyg0KTsgLy8gbWluSW5kZXhJbnRlcnZhbAorICAgICAgICAgICAgaW50IG9mZnNldENvdW50ID0gaW4ucmVhZEludCgpOworICAgICAgICAgICAgbG9uZyBvZmZoZWFwU2l6ZSA9IGluLnJlYWRMb25nKCk7CisgICAgICAgICAgICBpbi5za2lwQnl0ZXMoOCk7IC8vIHNhbXBsaW5nTGV2ZWwsIGZ1bGxTYW1wbGluZ1N1bW1hcnlTaXplCisKKyAgICAgICAgICAgIGluLnNraXBCeXRlcyhvZmZzZXRDb3VudCAqIDQpOworICAgICAgICAgICAgaW4uc2tpcEJ5dGVzKChpbnQpIChvZmZoZWFwU2l6ZSAtIG9mZnNldENvdW50ICogNCkpOworCisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZmlyc3QgPSBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aExlbmd0aChpbikpOworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGxhc3QgPSBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aExlbmd0aChpbikpOworICAgICAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKGZpcnN0LCBsYXN0KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeUJ1aWxkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeUJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjM4ZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5QnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRG93bnNhbXBsaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuTWVtb3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2FmZU1lbW9yeVdyaXRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLklOREVYX1NVTU1BUllfRVhQRUNURURfS0VZX1NJWkU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUw7CisKK3B1YmxpYyBjbGFzcyBJbmRleFN1bW1hcnlCdWlsZGVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbmRleFN1bW1hcnlCdWlsZGVyLmNsYXNzKTsKKworICAgIHN0YXRpYyBsb25nIGRlZmF1bHRFeHBlY3RlZEtleVNpemUgPSBJTkRFWF9TVU1NQVJZX0VYUEVDVEVEX0tFWV9TSVpFLmdldExvbmcoKTsKKworICAgIC8vIHRoZSBvZmZzZXQgaW4gdGhlIGtleXMgbWVtb3J5IHJlZ2lvbiB0byBsb29rIGZvciBhIGdpdmVuIHN1bW1hcnkgYm91bmRhcnkKKyAgICBwcml2YXRlIGZpbmFsIFNhZmVNZW1vcnlXcml0ZXIgb2Zmc2V0czsKKyAgICBwcml2YXRlIGZpbmFsIFNhZmVNZW1vcnlXcml0ZXIgZW50cmllczsKKworICAgIHByaXZhdGUgZmluYWwgaW50IG1pbkluZGV4SW50ZXJ2YWw7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgc2FtcGxpbmdMZXZlbDsKKyAgICBwcml2YXRlIGZpbmFsIGludFtdIHN0YXJ0UG9pbnRzOworICAgIHByaXZhdGUgbG9uZyBrZXlzV3JpdHRlbiA9IDA7CisgICAgcHJpdmF0ZSBsb25nIGluZGV4SW50ZXJ2YWxNYXRjaGVzID0gMDsKKyAgICBwcml2YXRlIGxvbmcgbmV4dFNhbXBsZVBvc2l0aW9uOworCisgICAgLy8gZm9yIGVhY2ggUmVhZGFibGVCb3VuZGFyeSwgd2UgbWFwIGl0cyBkYXRhTGVuZ3RoIHByb3BlcnR5IHRvIGl0c2VsZiwgcGVybWl0dGluZyB1cyB0byBsb29rdXAgdGhlCisgICAgLy8gbGFzdCByZWFkYWJsZSBib3VuZGFyeSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgZGF0YSBmaWxlCisgICAgLy8gW2RhdGEgZmlsZSBwb3NpdGlvbiBsaW1pdF0gPT4gW1JlYWRhYmxlQm91bmRhcnldCisgICAgcHJpdmF0ZSBUcmVlTWFwPExvbmcsIFJlYWRhYmxlQm91bmRhcnk+IGxhc3RSZWFkYWJsZUJ5RGF0YSA9IG5ldyBUcmVlTWFwPD4oKTsKKyAgICAvLyBmb3IgZWFjaCBSZWFkYWJsZUJvdW5kYXJ5LCB3ZSBtYXAgaXRzIGluZGV4TGVuZ3RoIHByb3BlcnR5IHRvIGl0c2VsZiwgcGVybWl0dGluZyB1cyB0byBsb29rdXAgdGhlCisgICAgLy8gbGFzdCByZWFkYWJsZSBib3VuZGFyeSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgaW5kZXggZmlsZQorICAgIC8vIFtpbmRleCBmaWxlIHBvc2l0aW9uIGxpbWl0XSA9PiBbUmVhZGFibGVCb3VuZGFyeV0KKyAgICBwcml2YXRlIFRyZWVNYXA8TG9uZywgUmVhZGFibGVCb3VuZGFyeT4gbGFzdFJlYWRhYmxlQnlJbmRleCA9IG5ldyBUcmVlTWFwPD4oKTsKKyAgICAvLyB0aGUgbGFzdCBzeW5jZWQgZGF0YSBmaWxlIHBvc2l0aW9uCisgICAgcHJpdmF0ZSBsb25nIGRhdGFTeW5jUG9zaXRpb247CisgICAgLy8gdGhlIGxhc3Qgc3luY2VkIGluZGV4IGZpbGUgcG9zaXRpb24KKyAgICBwcml2YXRlIGxvbmcgaW5kZXhTeW5jUG9zaXRpb247CisKKyAgICAvLyB0aGUgbGFzdCBzdW1tYXJ5IGludGVydmFsIGJvdW5kYXJ5IHRoYXQgaXMgZnVsbHkgcmVhZGFibGUgaW4gYm90aCBkYXRhIGFuZCBpbmRleCBmaWxlcworICAgIHByaXZhdGUgUmVhZGFibGVCb3VuZGFyeSBsYXN0UmVhZGFibGVCb3VuZGFyeTsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBib3VuZGFyeSB0aGF0IGlzIGd1YXJhbnRlZWQgZnVsbHkgcmVhZGFibGUgaW4gdGhlIHN1bW1hcnksIGluZGV4IGZpbGUgYW5kIGRhdGEgZmlsZS4KKyAgICAgKiBUaGUga2V5IGNvbnRhaW5lZCBpcyB0aGUgbGFzdCBrZXkgcmVhZGFibGUgaWYgdGhlIGluZGV4IGFuZCBkYXRhIGZpbGVzIGhhdmUgYmVlbiBmbHVzaGVkIHRvIHRoZQorICAgICAqIHN0b3JlZCBsZW5ndGhzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVhZGFibGVCb3VuZGFyeQorICAgIHsKKyAgICAgICAgcHVibGljIGZpbmFsIERlY29yYXRlZEtleSBsYXN0S2V5OworICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBpbmRleExlbmd0aDsKKyAgICAgICAgcHVibGljIGZpbmFsIGxvbmcgZGF0YUxlbmd0aDsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBzdW1tYXJ5Q291bnQ7CisgICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIGVudHJpZXNMZW5ndGg7CisgICAgICAgIHB1YmxpYyBSZWFkYWJsZUJvdW5kYXJ5KERlY29yYXRlZEtleSBsYXN0S2V5LCBsb25nIGluZGV4TGVuZ3RoLCBsb25nIGRhdGFMZW5ndGgsIGludCBzdW1tYXJ5Q291bnQsIGxvbmcgZW50cmllc0xlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5sYXN0S2V5ID0gbGFzdEtleTsKKyAgICAgICAgICAgIHRoaXMuaW5kZXhMZW5ndGggPSBpbmRleExlbmd0aDsKKyAgICAgICAgICAgIHRoaXMuZGF0YUxlbmd0aCA9IGRhdGFMZW5ndGg7CisgICAgICAgICAgICB0aGlzLnN1bW1hcnlDb3VudCA9IHN1bW1hcnlDb3VudDsKKyAgICAgICAgICAgIHRoaXMuZW50cmllc0xlbmd0aCA9IGVudHJpZXNMZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZCBhbiBpbmRleCBzdW1tYXJ5IGJ1aWxkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRLZXlzIC0gdGhlIG51bWJlciBvZiBrZXlzIHdlIGV4cGVjdCBpbiB0aGUgc3N0YWJsZQorICAgICAqIEBwYXJhbSBtaW5JbmRleEludGVydmFsIC0gdGhlIG1pbmltdW0gaW50ZXJ2YWwgYmV0d2VlbiBlbnRyaWVzIHNlbGVjdGVkIGZvciBzYW1wbGluZworICAgICAqIEBwYXJhbSBzYW1wbGluZ0xldmVsIC0gdGhlIGxldmVsIGF0IHdoaWNoIGVudHJpZXMgYXJlIHNhbXBsZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5kZXhTdW1tYXJ5QnVpbGRlcihsb25nIGV4cGVjdGVkS2V5cywgaW50IG1pbkluZGV4SW50ZXJ2YWwsIGludCBzYW1wbGluZ0xldmVsKQorICAgIHsKKyAgICAgICAgdGhpcy5zYW1wbGluZ0xldmVsID0gc2FtcGxpbmdMZXZlbDsKKyAgICAgICAgdGhpcy5zdGFydFBvaW50cyA9IERvd25zYW1wbGluZy5nZXRTdGFydFBvaW50cyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzYW1wbGluZ0xldmVsKTsKKworICAgICAgICBsb25nIGV4cGVjdGVkRW50cnlTaXplID0gZ2V0RW50cnlTaXplKGRlZmF1bHRFeHBlY3RlZEtleVNpemUpOworICAgICAgICBsb25nIG1heEV4cGVjdGVkRW50cmllcyA9IGV4cGVjdGVkS2V5cyAvIG1pbkluZGV4SW50ZXJ2YWw7CisgICAgICAgIGxvbmcgbWF4RXhwZWN0ZWRFbnRyaWVzU2l6ZSA9IG1heEV4cGVjdGVkRW50cmllcyAqIGV4cGVjdGVkRW50cnlTaXplOworICAgICAgICBpZiAobWF4RXhwZWN0ZWRFbnRyaWVzU2l6ZSA+IEludGVnZXIuTUFYX1ZBTFVFKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGF0J3MgYSBfbG90XyBvZiBrZXlzLCBhbmQgYSB2ZXJ5IGxvdyBtaW4gaW5kZXggaW50ZXJ2YWwKKyAgICAgICAgICAgIGludCBlZmZlY3RpdmVNaW5JbnRlcnZhbCA9IChpbnQpIE1hdGguY2VpbCgoZG91YmxlKShleHBlY3RlZEtleXMgKiBleHBlY3RlZEVudHJ5U2l6ZSkgLyBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgICAgICBtYXhFeHBlY3RlZEVudHJpZXMgPSBleHBlY3RlZEtleXMgLyBlZmZlY3RpdmVNaW5JbnRlcnZhbDsKKyAgICAgICAgICAgIG1heEV4cGVjdGVkRW50cmllc1NpemUgPSBtYXhFeHBlY3RlZEVudHJpZXMgKiBleHBlY3RlZEVudHJ5U2l6ZTsKKyAgICAgICAgICAgIGFzc2VydCBtYXhFeHBlY3RlZEVudHJpZXNTaXplIDw9IEludGVnZXIuTUFYX1ZBTFVFIDogbWF4RXhwZWN0ZWRFbnRyaWVzU2l6ZTsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJtaW5faW5kZXhfaW50ZXJ2YWwgb2Yge30gaXMgdG9vIGxvdyBmb3Ige30gZXhwZWN0ZWQga2V5cyBvZiBhdmcgc2l6ZSB7fTsgdXNpbmcgaW50ZXJ2YWwgb2Yge30gaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtaW5JbmRleEludGVydmFsLCBleHBlY3RlZEtleXMsIGRlZmF1bHRFeHBlY3RlZEtleVNpemUsIGVmZmVjdGl2ZU1pbkludGVydmFsKTsKKyAgICAgICAgICAgIHRoaXMubWluSW5kZXhJbnRlcnZhbCA9IGVmZmVjdGl2ZU1pbkludGVydmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5taW5JbmRleEludGVydmFsID0gbWluSW5kZXhJbnRlcnZhbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZvciBpbml0aWFsaXppbmcgZGF0YSBzdHJ1Y3R1cmVzLCBhZGp1c3Qgb3VyIGVzdGltYXRlcyBiYXNlZCBvbiB0aGUgc2FtcGxpbmcgbGV2ZWwKKyAgICAgICAgbWF4RXhwZWN0ZWRFbnRyaWVzID0gTWF0aC5tYXgoMSwgKG1heEV4cGVjdGVkRW50cmllcyAqIHNhbXBsaW5nTGV2ZWwpIC8gQkFTRV9TQU1QTElOR19MRVZFTCk7CisgICAgICAgIG9mZnNldHMgPSBuZXcgU2FmZU1lbW9yeVdyaXRlcig0ICogbWF4RXhwZWN0ZWRFbnRyaWVzKS5vcmRlcihCeXRlT3JkZXIubmF0aXZlT3JkZXIoKSk7CisgICAgICAgIGVudHJpZXMgPSBuZXcgU2FmZU1lbW9yeVdyaXRlcihleHBlY3RlZEVudHJ5U2l6ZSAqIG1heEV4cGVjdGVkRW50cmllcykub3JkZXIoQnl0ZU9yZGVyLm5hdGl2ZU9yZGVyKCkpOworCisgICAgICAgIC8vIHRoZSBzdW1tYXJ5IHdpbGwgYWx3YXlzIGNvbnRhaW4gdGhlIGZpcnN0IGluZGV4IGVudHJ5IChkb3duc2FtcGxpbmcgd2lsbCBuZXZlciByZW1vdmUgaXQpCisgICAgICAgIG5leHRTYW1wbGVQb3NpdGlvbiA9IDA7CisgICAgICAgIGluZGV4SW50ZXJ2YWxNYXRjaGVzKys7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSBrZXksIHJldHVybiBob3cgbG9uZyB0aGUgc2VyaWFsaXplZCBpbmRleCBzdW1tYXJ5IGVudHJ5IHdpbGwgYmUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBnZXRFbnRyeVNpemUoRGVjb3JhdGVkS2V5IGtleSkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRFbnRyeVNpemUoa2V5LmdldEtleSgpLnJlbWFpbmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIGtleSBzaXplLCByZXR1cm4gaG93IGxvbmcgdGhlIHNlcmlhbGl6ZWQgaW5kZXggc3VtbWFyeSBlbnRyeSB3aWxsIGJlLCB0aGF0IGlzIGFkZCA4IGJ5dGVzIHRvCisgICAgICogYWNjb21vZGF0ZSBmb3IgdGhlIHNpemUgb2YgdGhlIHBvc2l0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZ2V0RW50cnlTaXplKGxvbmcga2V5U2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBrZXlTaXplICsgVHlwZVNpemVzLnNpemVvZigwTCk7CisgICAgfQorCisgICAgLy8gdGhlIGluZGV4IGZpbGUgaGFzIGJlZW4gZmx1c2hlZCB0byB0aGUgcHJvdmlkZWQgcG9zaXRpb247IHN0YXNoIGl0IGFuZCB1c2UgdGhhdCB0byByZWNhbGN1bGF0ZSBvdXIgbWF4IHJlYWRhYmxlIGJvdW5kYXJ5CisgICAgcHVibGljIHZvaWQgbWFya0luZGV4U3luY2VkKGxvbmcgdXBUb1Bvc2l0aW9uKQorICAgIHsKKyAgICAgICAgaW5kZXhTeW5jUG9zaXRpb24gPSB1cFRvUG9zaXRpb247CisgICAgICAgIHJlZnJlc2hSZWFkYWJsZUJvdW5kYXJ5KCk7CisgICAgfQorCisgICAgLy8gdGhlIGRhdGEgZmlsZSBoYXMgYmVlbiBmbHVzaGVkIHRvIHRoZSBwcm92aWRlZCBwb3NpdGlvbjsgc3Rhc2ggaXQgYW5kIHVzZSB0aGF0IHRvIHJlY2FsY3VsYXRlIG91ciBtYXggcmVhZGFibGUgYm91bmRhcnkKKyAgICBwdWJsaWMgdm9pZCBtYXJrRGF0YVN5bmNlZChsb25nIHVwVG9Qb3NpdGlvbikKKyAgICB7CisgICAgICAgIGRhdGFTeW5jUG9zaXRpb24gPSB1cFRvUG9zaXRpb247CisgICAgICAgIHJlZnJlc2hSZWFkYWJsZUJvdW5kYXJ5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hSZWFkYWJsZUJvdW5kYXJ5KCkKKyAgICB7CisgICAgICAgIC8vIGdyYWIgdGhlIHJlYWRhYmxlIGJvdW5kYXJ5IHByaW9yIHRvIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiBlaXRoZXIgdGhlIGRhdGEgb3IgaW5kZXggZmlsZQorICAgICAgICBNYXAuRW50cnk8PywgUmVhZGFibGVCb3VuZGFyeT4gYnlEYXRhID0gbGFzdFJlYWRhYmxlQnlEYXRhLmZsb29yRW50cnkoZGF0YVN5bmNQb3NpdGlvbik7CisgICAgICAgIE1hcC5FbnRyeTw/LCBSZWFkYWJsZUJvdW5kYXJ5PiBieUluZGV4ID0gbGFzdFJlYWRhYmxlQnlJbmRleC5mbG9vckVudHJ5KGluZGV4U3luY1Bvc2l0aW9uKTsKKyAgICAgICAgaWYgKGJ5RGF0YSA9PSBudWxsIHx8IGJ5SW5kZXggPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyB0YWtlIHRoZSBsb3dlc3Qgb2YgdGhlIHR3bywgYW5kIHN0YXNoIGl0CisgICAgICAgIGxhc3RSZWFkYWJsZUJvdW5kYXJ5ID0gYnlJbmRleC5nZXRWYWx1ZSgpLmluZGV4TGVuZ3RoIDwgYnlEYXRhLmdldFZhbHVlKCkuaW5kZXhMZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJ5SW5kZXguZ2V0VmFsdWUoKSA6IGJ5RGF0YS5nZXRWYWx1ZSgpOworCisgICAgICAgIC8vIGNsZWFyIG91ciBkYXRhIHByaW9yIHRvIHRoaXMsIHNpbmNlIHdlIG5vIGxvbmdlciBuZWVkIGl0CisgICAgICAgIGxhc3RSZWFkYWJsZUJ5RGF0YS5oZWFkTWFwKGxhc3RSZWFkYWJsZUJvdW5kYXJ5LmRhdGFMZW5ndGgsIGZhbHNlKS5jbGVhcigpOworICAgICAgICBsYXN0UmVhZGFibGVCeUluZGV4LmhlYWRNYXAobGFzdFJlYWRhYmxlQm91bmRhcnkuaW5kZXhMZW5ndGgsIGZhbHNlKS5jbGVhcigpOworICAgIH0KKworICAgIHB1YmxpYyBSZWFkYWJsZUJvdW5kYXJ5IGdldExhc3RSZWFkYWJsZUJvdW5kYXJ5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBsYXN0UmVhZGFibGVCb3VuZGFyeTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5kZXhTdW1tYXJ5QnVpbGRlciBtYXliZUFkZEVudHJ5KERlY29yYXRlZEtleSBkZWNvcmF0ZWRLZXksIGxvbmcgaW5kZXhTdGFydCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbWF5YmVBZGRFbnRyeShkZWNvcmF0ZWRLZXksIGluZGV4U3RhcnQsIDAsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIGRlY29yYXRlZEtleSB0aGUga2V5IGZvciB0aGlzIHJlY29yZAorICAgICAqIEBwYXJhbSBpbmRleFN0YXJ0IHRoZSBwb3NpdGlvbiBpbiB0aGUgaW5kZXggZmlsZSB0aGlzIHJlY29yZCBiZWdpbnMKKyAgICAgKiBAcGFyYW0gaW5kZXhFbmQgdGhlIHBvc2l0aW9uIGluIHRoZSBpbmRleCBmaWxlIHdlIG5lZWQgdG8gYmUgYWJsZSB0byByZWFkIHRvIChleGNsdXNpdmUpIHRvIHJlYWQgdGhpcyByZWNvcmQKKyAgICAgKiBAcGFyYW0gZGF0YUVuZCB0aGUgcG9zaXRpb24gaW4gdGhlIGRhdGEgZmlsZSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gcmVhZCB0byAoZXhjbHVzaXZlKSB0byByZWFkIHRoaXMgcmVjb3JkCisgICAgICogICAgICAgICAgICAgICAgYSB2YWx1ZSBvZiAwIGluZGljYXRlcyB3ZSBhcmUgbm90IHRyYWNraW5nIHJlYWRhYmxlIGJvdW5kYXJpZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5kZXhTdW1tYXJ5QnVpbGRlciBtYXliZUFkZEVudHJ5KERlY29yYXRlZEtleSBkZWNvcmF0ZWRLZXksIGxvbmcgaW5kZXhTdGFydCwgbG9uZyBpbmRleEVuZCwgbG9uZyBkYXRhRW5kKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChrZXlzV3JpdHRlbiA9PSBuZXh0U2FtcGxlUG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgoZW50cmllcy5sZW5ndGgoKSArIGdldEVudHJ5U2l6ZShkZWNvcmF0ZWRLZXkpKSA8PSBJbnRlZ2VyLk1BWF9WQUxVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRzLndyaXRlSW50KChpbnQpIGVudHJpZXMubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGVudHJpZXMud3JpdGUoZGVjb3JhdGVkS2V5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICBlbnRyaWVzLndyaXRlTG9uZyhpbmRleFN0YXJ0KTsKKyAgICAgICAgICAgICAgICBzZXROZXh0U2FtcGxlUG9zaXRpb24oa2V5c1dyaXR0ZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHdlIGNhbm5vdCBmdWxseSBzYW1wbGUgdGhpcyBzc3RhYmxlIGR1ZSB0byB0b28gbXVjaCBtZW1vcnkgaW4gdGhlIGluZGV4IHN1bW1hcnksIHNvIGxldCdzIHRlbGwgdGhlIHVzZXIKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIk1lbW9yeSBjYXBhY2l0eSBvZiBpbmRleCBzdW1tYXJ5IGV4Y2VlZGVkICgyR2lCKSwgaW5kZXggc3VtbWFyeSB3aWxsIG5vdCBjb3ZlciBmdWxsIHNzdGFibGUsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieW91IHNob3VsZCBpbmNyZWFzZSBtaW5fc2FtcGxpbmdfbGV2ZWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChkYXRhRW5kICE9IDAgJiYga2V5c1dyaXR0ZW4gKyAxID09IG5leHRTYW1wbGVQb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgbGFzdCBrZXkgaW4gdGhpcyBzdW1tYXJ5IGludGVydmFsLCBzbyBzdGFzaCBpdAorICAgICAgICAgICAgUmVhZGFibGVCb3VuZGFyeSBib3VuZGFyeSA9IG5ldyBSZWFkYWJsZUJvdW5kYXJ5KGRlY29yYXRlZEtleSwgaW5kZXhFbmQsIGRhdGFFbmQsIChpbnQpIChvZmZzZXRzLmxlbmd0aCgpIC8gNCksIGVudHJpZXMubGVuZ3RoKCkpOworICAgICAgICAgICAgbGFzdFJlYWRhYmxlQnlEYXRhLnB1dChkYXRhRW5kLCBib3VuZGFyeSk7CisgICAgICAgICAgICBsYXN0UmVhZGFibGVCeUluZGV4LnB1dChpbmRleEVuZCwgYm91bmRhcnkpOworICAgICAgICB9CisKKyAgICAgICAga2V5c1dyaXR0ZW4rKzsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLy8gY2FsY3VsYXRlIHRoZSBuZXh0IGtleSB3ZSB3aWxsIHN0b3JlIHRvIG91ciBzdW1tYXJ5CisgICAgcHJpdmF0ZSB2b2lkIHNldE5leHRTYW1wbGVQb3NpdGlvbihsb25nIHBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgdHJ5QWdhaW46IHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBwb3NpdGlvbiArPSBtaW5JbmRleEludGVydmFsOworICAgICAgICAgICAgbG9uZyB0ZXN0ID0gaW5kZXhJbnRlcnZhbE1hdGNoZXMrKzsKKyAgICAgICAgICAgIGZvciAoaW50IHN0YXJ0IDogc3RhcnRQb2ludHMpCisgICAgICAgICAgICAgICAgaWYgKCh0ZXN0IC0gc3RhcnQpICUgQkFTRV9TQU1QTElOR19MRVZFTCA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZSB0cnlBZ2FpbjsKKworICAgICAgICAgICAgbmV4dFNhbXBsZVBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwcmVwYXJlVG9Db21taXQoKQorICAgIHsKKyAgICAgICAgLy8gdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gd2UndmUgZmluaXNoZWQgYXBwZW5kaW5nIHJlY29yZHMsIHNvIHdlIHRydW5jYXRlIHRoZQorICAgICAgICAvLyBtZW1vcnkgd2UncmUgdXNpbmcgdG8gdGhlIGV4YWN0IGFtb3VudCByZXF1aXJlZCB0byByZXByZXNlbnQgaXQgYmVmb3JlIGJ1aWxkaW5nIG91ciBzdW1tYXJ5CisgICAgICAgIGVudHJpZXMudHJpbSgpOworICAgICAgICBvZmZzZXRzLnRyaW0oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5kZXhTdW1tYXJ5IGJ1aWxkKElQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikKKyAgICB7CisgICAgICAgIHJldHVybiBidWlsZChwYXJ0aXRpb25lciwgbnVsbCk7CisgICAgfQorCisgICAgLy8gYnVpbGQgdGhlIHN1bW1hcnkgdXAgdG8gdGhlIHByb3ZpZGVkIGJvdW5kYXJ5OyB0aGlzIGlzIGJhY2tlZCBieSBzaGFyZWQgbWVtb3J5IGJldHdlZW4KKyAgICAvLyBtdWx0aXBsZSBpbnZvY2F0aW9ucyBvZiB0aGlzIGJ1aWxkIG1ldGhvZAorICAgIHB1YmxpYyBJbmRleFN1bW1hcnkgYnVpbGQoSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyLCBSZWFkYWJsZUJvdW5kYXJ5IGJvdW5kYXJ5KQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGVudHJpZXMubGVuZ3RoKCkgPiAwOworCisgICAgICAgIGludCBjb3VudCA9IChpbnQpIChvZmZzZXRzLmxlbmd0aCgpIC8gNCk7CisgICAgICAgIGxvbmcgZW50cmllc0xlbmd0aCA9IGVudHJpZXMubGVuZ3RoKCk7CisgICAgICAgIGlmIChib3VuZGFyeSAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBjb3VudCA9IGJvdW5kYXJ5LnN1bW1hcnlDb3VudDsKKyAgICAgICAgICAgIGVudHJpZXNMZW5ndGggPSBib3VuZGFyeS5lbnRyaWVzTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgaW50IHNpemVBdEZ1bGxTYW1wbGluZyA9IChpbnQpIE1hdGguY2VpbChrZXlzV3JpdHRlbiAvIChkb3VibGUpIG1pbkluZGV4SW50ZXJ2YWwpOworICAgICAgICBhc3NlcnQgY291bnQgPiAwOworICAgICAgICByZXR1cm4gbmV3IEluZGV4U3VtbWFyeShwYXJ0aXRpb25lciwgb2Zmc2V0cy5jdXJyZW50QnVmZmVyKCkuc2hhcmVkQ29weSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCwgZW50cmllcy5jdXJyZW50QnVmZmVyKCkuc2hhcmVkQ29weSgpLCBlbnRyaWVzTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplQXRGdWxsU2FtcGxpbmcsIG1pbkluZGV4SW50ZXJ2YWwsIHNhbXBsaW5nTGV2ZWwpOworICAgIH0KKworICAgIC8vIGNsb3NlIHRoZSBidWlsZGVyIGFuZCByZWxlYXNlIGFueSBhc3NvY2lhdGVkIG1lbW9yeQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIGVudHJpZXMuY2xvc2UoKTsKKyAgICAgICAgb2Zmc2V0cy5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBUaHJvd2FibGUgY2xvc2UoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCisgICAgeworICAgICAgICBhY2N1bXVsYXRlID0gZW50cmllcy5jbG9zZShhY2N1bXVsYXRlKTsKKyAgICAgICAgYWNjdW11bGF0ZSA9IG9mZnNldHMuY2xvc2UoYWNjdW11bGF0ZSk7CisgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZW50cmllc0F0U2FtcGxpbmdMZXZlbChpbnQgc2FtcGxpbmdMZXZlbCwgaW50IG1heFN1bW1hcnlTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChpbnQpIE1hdGguY2VpbCgoc2FtcGxpbmdMZXZlbCAqIG1heFN1bW1hcnlTaXplKSAvIChkb3VibGUpIEJBU0VfU0FNUExJTkdfTEVWRUwpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgY2FsY3VsYXRlU2FtcGxpbmdMZXZlbChpbnQgY3VycmVudFNhbXBsaW5nTGV2ZWwsIGludCBjdXJyZW50TnVtRW50cmllcywgbG9uZyB0YXJnZXROdW1FbnRyaWVzLCBpbnQgbWluSW5kZXhJbnRlcnZhbCwgaW50IG1heEluZGV4SW50ZXJ2YWwpCisgICAgeworICAgICAgICAvLyBlZmZlY3RpdmUgaW5kZXggaW50ZXJ2YWwgPT0gKEJBU0VfU0FNUExJTkdfTEVWRUwgLyBzYW1wbGluZ0xldmVsKSAqIG1pbkluZGV4SW50ZXJ2YWwKKyAgICAgICAgLy8gc28gd2UgY2FuIGp1c3Qgc29sdmUgZm9yIG1pblNhbXBsaW5nTGV2ZWwgaGVyZToKKyAgICAgICAgLy8gbWF4SW5kZXhJbnRlcnZhbCA9PSAoQkFTRV9TQU1QTElOR19MRVZFTCAvIG1pblNhbXBsaW5nTGV2ZWwpICogbWluSW5kZXhJbnRlcnZhbAorICAgICAgICBpbnQgZWZmZWN0aXZlTWluU2FtcGxpbmdMZXZlbCA9IE1hdGgubWF4KDEsIChpbnQpIE1hdGguY2VpbCgoQkFTRV9TQU1QTElOR19MRVZFTCAqIG1pbkluZGV4SW50ZXJ2YWwpIC8gKGRvdWJsZSkgbWF4SW5kZXhJbnRlcnZhbCkpOworCisgICAgICAgIC8vIEFsZ2VicmFpYyBleHBsYW5hdGlvbiBmb3IgY2FsY3VsYXRpbmcgdGhlIG5ldyBzYW1wbGluZyBsZXZlbCAoc29sdmUgZm9yIG5ld1NhbXBsaW5nTGV2ZWwpOgorICAgICAgICAvLyBvcmlnaW5hbE51bUVudHJpZXMgPSAoYmFzZVNhbXBsaW5nTGV2ZWwgLyBjdXJyZW50U2FtcGxpbmdMZXZlbCkgKiBjdXJyZW50TnVtRW50cmllcworICAgICAgICAvLyBuZXdTcGFjZVVzZWQgPSAobmV3U2FtcGxpbmdMZXZlbCAvIGJhc2VTYW1wbGluZ0xldmVsKSAqIG9yaWdpbmFsTnVtRW50cmllcworICAgICAgICAvLyBuZXdTcGFjZVVzZWQgPSAobmV3U2FtcGxpbmdMZXZlbCAvIGJhc2VTYW1wbGluZ0xldmVsKSAqIChiYXNlU2FtcGxpbmdMZXZlbCAvIGN1cnJlbnRTYW1wbGluZ0xldmVsKSAqIGN1cnJlbnROdW1FbnRyaWVzCisgICAgICAgIC8vIG5ld1NwYWNlVXNlZCA9IChuZXdTYW1wbGluZ0xldmVsIC8gY3VycmVudFNhbXBsaW5nTGV2ZWwpICogY3VycmVudE51bUVudHJpZXMKKyAgICAgICAgLy8gKG5ld1NwYWNlVXNlZCAqIGN1cnJlbnRTYW1wbGluZ0xldmVsKSAvIGN1cnJlbnROdW1FbnRyaWVzID0gbmV3U2FtcGxpbmdMZXZlbAorICAgICAgICBpbnQgbmV3U2FtcGxpbmdMZXZlbCA9IChpbnQpICh0YXJnZXROdW1FbnRyaWVzICogY3VycmVudFNhbXBsaW5nTGV2ZWwpIC8gY3VycmVudE51bUVudHJpZXM7CisgICAgICAgIHJldHVybiBNYXRoLm1pbihCQVNFX1NBTVBMSU5HX0xFVkVMLCBNYXRoLm1heChlZmZlY3RpdmVNaW5TYW1wbGluZ0xldmVsLCBuZXdTYW1wbGluZ0xldmVsKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRG93bnNhbXBsZXMgYW4gZXhpc3RpbmcgaW5kZXggc3VtbWFyeSB0byBhIG5ldyBzYW1wbGluZyBsZXZlbC4KKyAgICAgKiBAcGFyYW0gZXhpc3RpbmcgYW4gZXhpc3RpbmcgSW5kZXhTdW1tYXJ5CisgICAgICogQHBhcmFtIG5ld1NhbXBsaW5nTGV2ZWwgdGhlIHRhcmdldCBsZXZlbCBmb3IgdGhlIG5ldyBJbmRleFN1bW1hcnkuICBUaGlzIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBjdXJyZW50IHNhbXBsaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgZm9yIGBleGlzdGluZ2AuCisgICAgICogQHBhcmFtIHBhcnRpdGlvbmVyIHRoZSBwYXJ0aXRpb25lciB1c2VkIGZvciB0aGUgaW5kZXggc3VtbWFyeQorICAgICAqIEByZXR1cm4gYSBuZXcgSW5kZXhTdW1tYXJ5CisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIEluZGV4U3VtbWFyeSBkb3duc2FtcGxlKEluZGV4U3VtbWFyeSBleGlzdGluZywgaW50IG5ld1NhbXBsaW5nTGV2ZWwsIGludCBtaW5JbmRleEludGVydmFsLCBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIpCisgICAgeworICAgICAgICAvLyBUbyBkb3duc2FtcGxlIHRoZSBvbGQgaW5kZXggc3VtbWFyeSwgd2UnbGwgZ28gdGhyb3VnaCAocG90ZW50aWFsbHkpIHNldmVyYWwgcm91bmRzIG9mIGRvd25zYW1wbGluZy4KKyAgICAgICAgLy8gQ29uY2VwdHVhbGx5LCBlYWNoIHJvdW5kIHN0YXJ0cyBhdCBwb3NpdGlvbiBYIGFuZCB0aGVuIHJlbW92ZXMgZXZlcnkgTnRoIGl0ZW0uICBUaGUgdmFsdWUgb2YgWCBmb2xsb3dzCisgICAgICAgIC8vIGEgcGFydGljdWxhciBwYXR0ZXJuIHRvIGV2ZW5seSBzcGFjZSBvdXQgdGhlIGl0ZW1zIHRoYXQgd2UgcmVtb3ZlLiAgVGhlIHZhbHVlIG9mIE4gZGVjcmVhc2VzIGJ5IG9uZSBlYWNoCisgICAgICAgIC8vIHJvdW5kLgorCisgICAgICAgIGludCBjdXJyZW50U2FtcGxpbmdMZXZlbCA9IGV4aXN0aW5nLmdldFNhbXBsaW5nTGV2ZWwoKTsKKyAgICAgICAgYXNzZXJ0IGN1cnJlbnRTYW1wbGluZ0xldmVsID4gbmV3U2FtcGxpbmdMZXZlbDsKKyAgICAgICAgYXNzZXJ0IG1pbkluZGV4SW50ZXJ2YWwgPT0gZXhpc3RpbmcuZ2V0TWluSW5kZXhJbnRlcnZhbCgpOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBzdGFydGluZyBpbmRleGVzIGZvciBkb3duc2FtcGxpbmcgcm91bmRzCisgICAgICAgIGludFtdIHN0YXJ0UG9pbnRzID0gRG93bnNhbXBsaW5nLmdldFN0YXJ0UG9pbnRzKGN1cnJlbnRTYW1wbGluZ0xldmVsLCBuZXdTYW1wbGluZ0xldmVsKTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgbmV3IG9mZi1oZWFwIHNpemUKKyAgICAgICAgaW50IG5ld0tleUNvdW50ID0gZXhpc3Rpbmcuc2l6ZSgpOworICAgICAgICBsb25nIG5ld0VudHJpZXNMZW5ndGggPSBleGlzdGluZy5nZXRFbnRyaWVzTGVuZ3RoKCk7CisgICAgICAgIGZvciAoaW50IHN0YXJ0IDogc3RhcnRQb2ludHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBzdGFydDsgaiA8IGV4aXN0aW5nLnNpemUoKTsgaiArPSBjdXJyZW50U2FtcGxpbmdMZXZlbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXdLZXlDb3VudC0tOworICAgICAgICAgICAgICAgIGxvbmcgbGVuZ3RoID0gZXhpc3RpbmcuZ2V0RW5kSW5TdW1tYXJ5KGopIC0gZXhpc3RpbmcuZ2V0UG9zaXRpb25JblN1bW1hcnkoaik7CisgICAgICAgICAgICAgICAgbmV3RW50cmllc0xlbmd0aCAtPSBsZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNZW1vcnkgb2xkRW50cmllcyA9IGV4aXN0aW5nLmdldEVudHJpZXMoKTsKKyAgICAgICAgTWVtb3J5IG5ld09mZnNldHMgPSBNZW1vcnkuYWxsb2NhdGUobmV3S2V5Q291bnQgKiA0KTsKKyAgICAgICAgTWVtb3J5IG5ld0VudHJpZXMgPSBNZW1vcnkuYWxsb2NhdGUobmV3RW50cmllc0xlbmd0aCk7CisKKyAgICAgICAgLy8gQ29weSBvbGQgZW50cmllcyB0byBvdXIgbmV3IE1lbW9yeS4KKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBpbnQgbmV3RW50cmllc09mZnNldCA9IDA7CisgICAgICAgIG91dGVyOgorICAgICAgICBmb3IgKGludCBvbGRTdW1tYXJ5SW5kZXggPSAwOyBvbGRTdW1tYXJ5SW5kZXggPCBleGlzdGluZy5zaXplKCk7IG9sZFN1bW1hcnlJbmRleCsrKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgaWYgd2UgY2FuIHNraXAgdGhpcyBlbnRyeSwgZ28gdGhyb3VnaCB0aGUgc3RhcnRpbmcgcG9pbnRzIGZvciBvdXIgZG93bnNhbXBsaW5nIHJvdW5kcworICAgICAgICAgICAgLy8gYW5kIHNlZSBpZiB0aGUgZW50cnkncyBpbmRleCBpcyBjb3ZlcmVkIGJ5IHRoYXQgcm91bmQKKyAgICAgICAgICAgIGZvciAoaW50IHN0YXJ0IDogc3RhcnRQb2ludHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKChvbGRTdW1tYXJ5SW5kZXggLSBzdGFydCkgJSBjdXJyZW50U2FtcGxpbmdMZXZlbCA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gd3JpdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBhY3R1YWwgZW50cnkgaW4gdGhlIGluZGV4IHN1bW1hcnkgKDQgYnl0ZXMpCisgICAgICAgICAgICBuZXdPZmZzZXRzLnNldEludChpICogNCwgbmV3RW50cmllc09mZnNldCk7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBsb25nIHN0YXJ0ID0gZXhpc3RpbmcuZ2V0UG9zaXRpb25JblN1bW1hcnkob2xkU3VtbWFyeUluZGV4KTsKKyAgICAgICAgICAgIGxvbmcgbGVuZ3RoID0gZXhpc3RpbmcuZ2V0RW5kSW5TdW1tYXJ5KG9sZFN1bW1hcnlJbmRleCkgLSBzdGFydDsKKyAgICAgICAgICAgIG5ld0VudHJpZXMucHV0KG5ld0VudHJpZXNPZmZzZXQsIG9sZEVudHJpZXMsIHN0YXJ0LCBsZW5ndGgpOworICAgICAgICAgICAgbmV3RW50cmllc09mZnNldCArPSBsZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IG5ld0VudHJpZXNPZmZzZXQgPT0gbmV3RW50cmllc0xlbmd0aDsKKyAgICAgICAgcmV0dXJuIG5ldyBJbmRleFN1bW1hcnkocGFydGl0aW9uZXIsIG5ld09mZnNldHMsIG5ld0tleUNvdW50LCBuZXdFbnRyaWVzLCBuZXdFbnRyaWVzTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5nZXRNYXhOdW1iZXJPZkVudHJpZXMoKSwgbWluSW5kZXhJbnRlcnZhbCwgbmV3U2FtcGxpbmdMZXZlbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5TWFuYWdlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5TWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZGMzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLlRpbWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5TU1RhYmxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5WaWV3OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRXhlY3V0b3JVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NQmVhbldyYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5XcmFwcGVkUnVubmFibGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKKy8qKgorICogTWFuYWdlcyB0aGUgZml4ZWQtc2l6ZSBtZW1vcnkgcG9vbCBmb3IgaW5kZXggc3VtbWFyaWVzLCBwZXJpb2RpY2FsbHkgcmVzaXppbmcgdGhlbQorICogaW4gb3JkZXIgdG8gZ2l2ZSBtb3JlIG1lbW9yeSB0byBob3Qgc3N0YWJsZXMgYW5kIGxlc3MgbWVtb3J5IHRvIGNvbGQgc3N0YWJsZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBJbmRleFN1bW1hcnlNYW5hZ2VyPFQgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgSW5kZXhTdW1tYXJ5U3VwcG9ydDxUPj4gaW1wbGVtZW50cyBJbmRleFN1bW1hcnlNYW5hZ2VyTUJlYW4KK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoSW5kZXhTdW1tYXJ5TWFuYWdlci5jbGFzcyk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUJFQU5fTkFNRSA9ICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPUluZGV4U3VtbWFyaWVzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEluZGV4U3VtbWFyeU1hbmFnZXI8Pz4gaW5zdGFuY2U7CisKKyAgICBwcml2YXRlIGxvbmcgbWVtb3J5UG9vbEJ5dGVzOworCisgICAgcHJpdmF0ZSBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclBsdXMgZXhlY3V0b3I7CisKKyAgICAvLyBvdXIgbmV4dCBzY2hlZHVsZWQgcmVzaXppbmcgcnVuCisgICAgcHJpdmF0ZSBTY2hlZHVsZWRGdXR1cmUgZnV0dXJlOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdXBwbGllcjxMaXN0PFQ+PiBpbmRleFN1bW1hcmllc1Byb3ZpZGVyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgSW5kZXhTdW1tYXJ5U3VwcG9ydD4gTGlzdDxUPiBnZXRBbGxTdXBwb3J0ZWRSZWFkZXJzKCkgeworICAgICAgICBMaXN0PFQ+IHJlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChLZXlzcGFjZSBrZXlzcGFjZSA6IEtleXNwYWNlLmFsbCgpKQorICAgICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZnMgOiBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZXMoKSkKKyAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0ciA6IGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNzdHIgaW5zdGFuY2VvZiBJbmRleFN1bW1hcnlTdXBwb3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVycy5hZGQoKChUKSBzc3RyKSk7CisgICAgICAgIHJldHVybiByZWFkZXJzOworICAgIH0KKworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgaW5zdGFuY2UgPSBuZXcgSW5kZXhTdW1tYXJ5TWFuYWdlcjw+KEluZGV4U3VtbWFyeU1hbmFnZXI6OmdldEFsbFN1cHBvcnRlZFJlYWRlcnMpOworICAgICAgICBNQmVhbldyYXBwZXIuaW5zdGFuY2UucmVnaXN0ZXJNQmVhbihpbnN0YW5jZSwgTUJFQU5fTkFNRSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbmRleFN1bW1hcnlNYW5hZ2VyKFN1cHBsaWVyPExpc3Q8VD4+IGluZGV4U3VtbWFyaWVzUHJvdmlkZXIpCisgICAgeworICAgICAgICB0aGlzLmluZGV4U3VtbWFyaWVzUHJvdmlkZXIgPSBpbmRleFN1bW1hcmllc1Byb3ZpZGVyOworCisgICAgICAgIGV4ZWN1dG9yID0gZXhlY3V0b3JGYWN0b3J5KCkuc2NoZWR1bGVkKGZhbHNlLCAiSW5kZXhTdW1tYXJ5TWFuYWdlciIsIFRocmVhZC5NSU5fUFJJT1JJVFkpOworCisgICAgICAgIGxvbmcgaW5kZXhTdW1tYXJ5U2l6ZUluTUIgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW5kZXhTdW1tYXJ5Q2FwYWNpdHlJbk1pQigpOworICAgICAgICBpbnQgaW50ZXJ2YWwgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW5kZXhTdW1tYXJ5UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIkluaXRpYWxpemluZyBpbmRleCBzdW1tYXJ5IG1hbmFnZXIgd2l0aCBhIG1lbW9yeSBwb29sIHNpemUgb2Yge30gTUIgYW5kIGEgcmVzaXplIGludGVydmFsIG9mIHt9IG1pbnV0ZXMiLAorICAgICAgICAgICAgICAgICAgICBpbmRleFN1bW1hcnlTaXplSW5NQiwgaW50ZXJ2YWwpOworCisgICAgICAgIHNldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluZGV4U3VtbWFyeUNhcGFjaXR5SW5NaUIoKSk7CisgICAgICAgIHNldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbmRleFN1bW1hcnlSZXNpemVJbnRlcnZhbEluTWludXRlcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW5kZXhTdW1tYXJ5UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNpemVJbnRlcnZhbEluTWludXRlcyhpbnQgcmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMpCisgICAgeworICAgICAgICBpbnQgb2xkSW50ZXJ2YWwgPSBnZXRSZXNpemVJbnRlcnZhbEluTWludXRlcygpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0SW5kZXhTdW1tYXJ5UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMocmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMpOworCisgICAgICAgIGxvbmcgaW5pdGlhbERlbGF5OworICAgICAgICBpZiAoZnV0dXJlICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGluaXRpYWxEZWxheSA9IG9sZEludGVydmFsIDwgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByZXNpemVJbnRlcnZhbEluTWludXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNYXRoLm1heCgwLCByZXNpemVJbnRlcnZhbEluTWludXRlcyAtIChvbGRJbnRlcnZhbCAtIGZ1dHVyZS5nZXREZWxheShUaW1lVW5pdC5NSU5VVEVTKSkpOworICAgICAgICAgICAgZnV0dXJlLmNhbmNlbChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbml0aWFsRGVsYXkgPSByZXNpemVJbnRlcnZhbEluTWludXRlczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXNpemVJbnRlcnZhbEluTWludXRlcyA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZ1dHVyZSA9IG51bGw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmdXR1cmUgPSBleGVjdXRvci5zY2hlZHVsZVdpdGhGaXhlZERlbGF5KG5ldyBXcmFwcGVkUnVubmFibGUoKQorICAgICAgICB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBydW5NYXlUaHJvdygpIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgaW5pdGlhbERlbGF5LCByZXNpemVJbnRlcnZhbEluTWludXRlcywgVGltZVVuaXQuTUlOVVRFUyk7CisgICAgfQorCisgICAgLy8gZm9yIHRlc3Rpbmcgb25seQorICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIExvbmcgZ2V0VGltZVRvTmV4dFJlc2l6ZShUaW1lVW5pdCB0aW1lVW5pdCkKKyAgICB7CisgICAgICAgIGlmIChmdXR1cmUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIHJldHVybiBmdXR1cmUuZ2V0RGVsYXkodGltZVVuaXQpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1lbW9yeVBvb2xCeXRlcyAvIDEwMjRMIC8gMTAyNEw7CisgICAgfQorCisgICAgcHVibGljIE1hcDxTdHJpbmcsIEludGVnZXI+IGdldEluZGV4SW50ZXJ2YWxzKCkKKyAgICB7CisgICAgICAgIExpc3Q8VD4gc3VtbWFyeVByb3ZpZGVycyA9IGluZGV4U3VtbWFyaWVzUHJvdmlkZXIuZ2V0KCk7CisgICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IGludGVydmFscyA9IG5ldyBIYXNoTWFwPD4oc3VtbWFyeVByb3ZpZGVycy5zaXplKCkpOworICAgICAgICBmb3IgKFQgc3VtbWFyeVByb3ZpZGVyIDogc3VtbWFyeVByb3ZpZGVycykKKyAgICAgICAgICAgIGludGVydmFscy5wdXQoc3VtbWFyeVByb3ZpZGVyLmdldEZpbGVuYW1lKCksIChpbnQpIE1hdGgucm91bmQoc3VtbWFyeVByb3ZpZGVyLmdldEluZGV4U3VtbWFyeSgpLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSkpOworCisgICAgICAgIHJldHVybiBpbnRlcnZhbHM7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRBdmVyYWdlSW5kZXhJbnRlcnZhbCgpCisgICAgeworICAgICAgICBMaXN0PFQ+IHN1bW1hcnlQcm92aWRlcnMgPSBpbmRleFN1bW1hcmllc1Byb3ZpZGVyLmdldCgpOworICAgICAgICBkb3VibGUgdG90YWwgPSAwLjA7CisgICAgICAgIGZvciAoSW5kZXhTdW1tYXJ5U3VwcG9ydCBzdW1tYXJ5UHJvdmlkZXIgOiBzdW1tYXJ5UHJvdmlkZXJzKQorICAgICAgICAgICAgdG90YWwgKz0gc3VtbWFyeVByb3ZpZGVyLmdldEluZGV4U3VtbWFyeSgpLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKTsKKyAgICAgICAgcmV0dXJuIHRvdGFsIC8gc3VtbWFyeVByb3ZpZGVycy5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWVtb3J5UG9vbENhcGFjaXR5SW5NQihsb25nIG1lbW9yeVBvb2xDYXBhY2l0eUluTUIpCisgICAgeworICAgICAgICB0aGlzLm1lbW9yeVBvb2xCeXRlcyA9IG1lbW9yeVBvb2xDYXBhY2l0eUluTUIgKiAxMDI0TCAqIDEwMjRMOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFjdHVhbCBzcGFjZSBjb25zdW1lZCBieSBpbmRleCBzdW1tYXJpZXMgZm9yIGFsbCBzc3RhYmxlcy4KKyAgICAgKiBAcmV0dXJuIHNwYWNlIGN1cnJlbnRseSB1c2VkIGluIE1CCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBnZXRNZW1vcnlQb29sU2l6ZUluTUIoKQorICAgIHsKKyAgICAgICAgbG9uZyB0b3RhbCA9IDA7CisgICAgICAgIGZvciAoSW5kZXhTdW1tYXJ5U3VwcG9ydCBzdW1tYXJ5UHJvdmlkZXIgOiBpbmRleFN1bW1hcmllc1Byb3ZpZGVyLmdldCgpKQorICAgICAgICAgICAgdG90YWwgKz0gc3VtbWFyeVByb3ZpZGVyLmdldEluZGV4U3VtbWFyeSgpLmdldE9mZkhlYXBTaXplKCk7CisgICAgICAgIHJldHVybiB0b3RhbCAvIDEwMjQuMCAvIDEwMjQuMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXJrcyB0aGUgbm9uLWNvbXBhY3Rpbmcgc3N0YWJsZXMgYXMgY29tcGFjdGluZyBmb3IgaW5kZXggc3VtbWFyeSByZWRpc3RyaWJ1dGlvbiBmb3IgYWxsIGtleXNwYWNlcy90YWJsZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFBhaXIgY29udGFpbmluZzoKKyAgICAgKiAgICAgICAgICBsZWZ0OiB0b3RhbCBzaXplIG9mIHRoZSBvZmYgaGVhcCBpbmRleCBzdW1tYXJpZXMgZm9yIHRoZSBzc3RhYmxlcyB3ZSB3ZXJlIHVuYWJsZSB0byBtYXJrIGNvbXBhY3RpbmcgKHRoZXkgd2VyZSBpbnZvbHZlZCBpbiBvdGhlciBjb21wYWN0aW9ucykKKyAgICAgKiAgICAgICAgICByaWdodDogdGhlIHRyYW5zYWN0aW9ucywga2V5ZWQgYnkgdGFibGUgaWQuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICBwcml2YXRlIFBhaXI8TG9uZywgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPj4gZ2V0UmVzdHJpYnV0aW9uVHJhbnNhY3Rpb25zKCkKKyAgICB7CisgICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gYWxsQ29tcGFjdGluZyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBNYXA8VGFibGVJZCwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24+IGFsbE5vbkNvbXBhY3RpbmcgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZvciAoS2V5c3BhY2Uga3MgOiBLZXlzcGFjZS5hbGwoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZlN0b3JlOiBrcy5nZXRDb2x1bW5GYW1pbHlTdG9yZXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gbm9uQ29tcGFjdGluZywgYWxsU1NUYWJsZXM7CisgICAgICAgICAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuOworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWaWV3IHZpZXcgPSBjZlN0b3JlLmdldFRyYWNrZXIoKS5nZXRWaWV3KCk7CisgICAgICAgICAgICAgICAgICAgIGFsbFNTVGFibGVzID0gSW1tdXRhYmxlU2V0LmNvcHlPZih2aWV3LnNlbGVjdChTU1RhYmxlU2V0LkNBTk9OSUNBTCkpOworICAgICAgICAgICAgICAgICAgICBub25Db21wYWN0aW5nID0gSW1tdXRhYmxlU2V0LmNvcHlPZih2aWV3LmdldFVuY29tcGFjdGluZyhhbGxTU1RhYmxlcykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAobnVsbCA9PSAodHhuID0gY2ZTdG9yZS5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KG5vbkNvbXBhY3RpbmcsIE9wZXJhdGlvblR5cGUuSU5ERVhfU1VNTUFSWSkpKTsKKworICAgICAgICAgICAgICAgIGFsbE5vbkNvbXBhY3RpbmcucHV0KGNmU3RvcmUubWV0YWRhdGEuaWQsIHR4bik7CisgICAgICAgICAgICAgICAgYWxsQ29tcGFjdGluZy5hZGRBbGwoU2V0cy5kaWZmZXJlbmNlKGFsbFNTVGFibGVzLCBub25Db21wYWN0aW5nKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9uZyBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplID0gYWxsQ29tcGFjdGluZy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihJbmRleFN1bW1hcnlTdXBwb3J0LmNsYXNzOjppc0luc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChJbmRleFN1bW1hcnlTdXBwb3J0LmNsYXNzOjpjYXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChJbmRleFN1bW1hcnlTdXBwb3J0OjpnZXRJbmRleFN1bW1hcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwVG9Mb25nKEluZGV4U3VtbWFyeTo6Z2V0T2ZmSGVhcFNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3VtKCk7CisgICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZShub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplLCBhbGxOb25Db21wYWN0aW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5pc0dsb2JhbENvbXBhY3Rpb25QYXVzZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgUGFpcjxMb25nLCBNYXA8VGFibGVJZCwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24+PiByZWRpc3RyaWJ1dGlvblRyYW5zYWN0aW9uSW5mbyA9IGdldFJlc3RyaWJ1dGlvblRyYW5zYWN0aW9ucygpOworICAgICAgICBNYXA8VGFibGVJZCwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9ucyA9IHJlZGlzdHJpYnV0aW9uVHJhbnNhY3Rpb25JbmZvLnJpZ2h0OworICAgICAgICBsb25nIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUgPSByZWRpc3RyaWJ1dGlvblRyYW5zYWN0aW9uSW5mby5sZWZ0OworICAgICAgICB0cnkgKFRpbWVyLkNvbnRleHQgY3R4ID0gQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZ2V0TWV0cmljcygpLmluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uVGltZS50aW1lKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhuZXcgSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24odHJhbnNhY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbW9yeVBvb2xCeXRlcykpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkluZGV4IHN1bW1hcnkgaW50ZXJydXB0ZWQ6IHt9IiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiR290IGV4Y2VwdGlvbiBkdXJpbmcgaW5kZXggc3VtbWFyeSByZWRpc3RyaWJ1dGlvbiIsIGUpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5jbG9zZUFsbCh0cmFuc2FjdGlvbnMudmFsdWVzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXR0ZW1wdHMgdG8gZmFpcmx5IGRpc3RyaWJ1dGUgYSBmaXhlZCBwb29sIG9mIG1lbW9yeSBmb3IgaW5kZXggc3VtbWFyaWVzIGFjcm9zcyBhIHNldCBvZiBTU1RhYmxlcyBiYXNlZCBvbgorICAgICAqIHRoZWlyIHJlY2VudCByZWFkIHJhdGVzLgorICAgICAqIEBwYXJhbSByZWRpc3RyaWJ1dGlvbiBlbmNhcHN1bGF0aW5nIHRoZSB0cmFuc2FjdGlvbnMgY29udGFpbmluZyB0aGUgc3N0YWJsZXMgd2UgYXJlIHRvIHJlZGlzdHJpYnV0ZSB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IHBvb2wgYWNyb3NzIGFuZCBhIHNpemUgKGluIGJ5dGVzKSB0aGF0IHRoZSB0b3RhbCBpbmRleCBzdW1tYXJ5IHNwYWNlIHVzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBzdGF5IGNsb3NlIHRvIG9yIHVuZGVyLCBpZiBwb3NzaWJsZQorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIG5ldyBTU1RhYmxlUmVhZGVyIGluc3RhbmNlcworICAgICAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgSW5kZXhTdW1tYXJ5U3VwcG9ydD4gTGlzdDxUPiByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24gcmVkaXN0cmlidXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnJ1bkFzQWN0aXZlQ29tcGFjdGlvbihyZWRpc3RyaWJ1dGlvbiwgcmVkaXN0cmlidXRpb246OnJlZGlzdHJpYnV0ZVN1bW1hcmllcyk7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHZvaWQgc2h1dGRvd25BbmRXYWl0KGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAoZnV0dXJlICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZ1dHVyZS5jYW5jZWwoZmFsc2UpOworICAgICAgICAgICAgZnV0dXJlID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBFeGVjdXRvclV0aWxzLnNodXRkb3duQW5kV2FpdCh0aW1lb3V0LCB1bml0LCBleGVjdXRvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5TWFuYWdlck1CZWFuLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlNYW5hZ2VyTUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTc5NTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5TWFuYWdlck1CZWFuLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBpbnRlcmZhY2UgSW5kZXhTdW1tYXJ5TWFuYWdlck1CZWFuCit7CisgICAgcHVibGljIGxvbmcgZ2V0TWVtb3J5UG9vbENhcGFjaXR5SW5NQigpOworICAgIHB1YmxpYyB2b2lkIHNldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIobG9uZyBtZW1vcnlQb29sQ2FwYWNpdHlJbk1CKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgYWN0dWFsIG9mZi1oZWFwIG1lbW9yeSB1c2FnZSBvZiB0aGUgaW5kZXggc3VtbWFyaWVzIGZvciBhbGwgbm9uLWNvbXBhY3Rpbmcgc3N0YWJsZXMuCisgICAgICogQHJldHVybiBUaGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkIGluIE1pQi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIGdldE1lbW9yeVBvb2xTaXplSW5NQigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG1hcCBvZiBTU1RhYmxlIGZpbGVuYW1lcyB0byB0aGVpciBjdXJyZW50IGVmZmVjdGl2ZSBpbmRleCBpbnRlcnZhbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgSW50ZWdlcj4gZ2V0SW5kZXhJbnRlcnZhbHMoKTsKKworICAgIHB1YmxpYyBkb3VibGUgZ2V0QXZlcmFnZUluZGV4SW50ZXJ2YWwoKTsKKworICAgIHB1YmxpYyB2b2lkIHJlZGlzdHJpYnV0ZVN1bW1hcmllcygpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBpbnQgZ2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKTsKKworICAgIC8qKgorICAgICAqIFNldCByZXNpemVJbnRlcnZhbEluTWludXRlcyA9IC0xIGZvciBkaXNhYmxlZDsgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBpbmRleF9zdW1tYXJ5X3Jlc2l6ZV9pbnRlcnZhbCBiZWluZworICAgICAqIHNldCB0byBudWxsIGluIGNhc3NhbmRyYS55YW1sCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoaW50IHJlc2l6ZUludGVydmFsSW5NaW51dGVzKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeU1ldHJpY3MuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeU1ldHJpY3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODU1ZTQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5TWV0cmljcy5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdE1ldHJpY3NQcm92aWRlcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5HYXVnZVByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CisKK3B1YmxpYyBjbGFzcyBJbmRleFN1bW1hcnlNZXRyaWNzPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgSW5kZXhTdW1tYXJ5U3VwcG9ydDxSPj4gZXh0ZW5kcyBBYnN0cmFjdE1ldHJpY3NQcm92aWRlcnM8Uj4KK3sKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIEluZGV4U3VtbWFyeU1ldHJpY3M8Pz4gaW5zdGFuY2UgPSBuZXcgSW5kZXhTdW1tYXJ5TWV0cmljczw+KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUiBtYXAoU1NUYWJsZVJlYWRlciByKQorICAgIHsKKyAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBJbmRleFN1bW1hcnlTdXBwb3J0PD8+KQorICAgICAgICAgICAgcmV0dXJuIChSKSByOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEdhdWdlUHJvdmlkZXI8TG9uZz4gaW5kZXhTdW1tYXJ5T2ZmSGVhcE1lbW9yeVVzZWQgPSBuZXdHYXVnZVByb3ZpZGVyKCJJbmRleFN1bW1hcnlPZmZIZWFwTWVtb3J5VXNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgLT4gci5nZXRJbmRleFN1bW1hcnkoKS5nZXRPZmZIZWFwU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZzo6c3VtKTsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxHYXVnZVByb3ZpZGVyPD8+PiBnYXVnZVByb3ZpZGVycyA9IEFycmF5cy5hc0xpc3QoaW5kZXhTdW1tYXJ5T2ZmSGVhcE1lbW9yeVVzZWQpOworCisgICAgcHVibGljIExpc3Q8R2F1Z2VQcm92aWRlcjw/Pj4gZ2V0R2F1Z2VQcm92aWRlcnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdhdWdlUHJvdmlkZXJzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDFmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbi5qYXZhCkBAIC0wLDAgKzEsNDA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW5mby5Vbml0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Eb3duc2FtcGxpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0b3JhZ2VNZXRyaWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWZzOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUw7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKKworcHVibGljIGNsYXNzIEluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uIGV4dGVuZHMgQ29tcGFjdGlvbkluZm8uSG9sZGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uLmNsYXNzKTsKKworICAgIC8vIFRoZSB0YXJnZXQgKG9yIGlkZWFsKSBudW1iZXIgb2YgaW5kZXggc3VtbWFyeSBlbnRyaWVzIG11c3QgZGlmZmVyIGZyb20gdGhlIGFjdHVhbCBudW1iZXIgb2YKKyAgICAvLyBlbnRyaWVzIGJ5IHRoaXMgcmF0aW8gaW4gb3JkZXIgdG8gdHJpZ2dlciBhbiB1cHNhbXBsZSBvciBkb3duc2FtcGxlIG9mIHRoZSBzdW1tYXJ5LiAgQmVjYXVzZQorICAgIC8vIHVwc2FtcGxpbmcgcmVxdWlyZXMgcmVhZGluZyB0aGUgcHJpbWFyeSBpbmRleCBpbiBvcmRlciB0byByZWJ1aWxkIHRoZSBzdW1tYXJ5LCB0aGUgdGhyZXNob2xkCisgICAgLy8gZm9yIHVwc2FtcGxpbmcgaXMgaXMgaGlnaGVyLgorICAgIHN0YXRpYyBmaW5hbCBkb3VibGUgVVBTQU1QTEVfVEhSRVNIT0xEID0gMS41OworICAgIHN0YXRpYyBmaW5hbCBkb3VibGUgRE9XTlNBTVBMRV9USEVTSE9MRCA9IDAuNzU7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxUYWJsZUlkLCBMaWZlY3ljbGVUcmFuc2FjdGlvbj4gdHJhbnNhY3Rpb25zOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBtZW1vcnlQb29sQnl0ZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBUaW1lVVVJRCBjb21wYWN0aW9uSWQ7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIHJlbWFpbmluZ1NwYWNlOworCisgICAgLyoqCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25zIHRoZSB0cmFuc2FjdGlvbnMgZm9yIHRoZSBkaWZmZXJlbnQga2V5c3BhY2VzL3RhYmxlcyB3ZSBhcmUgdG8gcmVkaXN0cmlidXRlCisgICAgICogQHBhcmFtIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUgdGhlIHRvdGFsIGluZGV4IHN1bW1hcnkgb2ZmIGhlYXAgc2l6ZSBmb3IgYWxsIHNzdGFibGVzIHdlIHdlcmUgbm90IGFibGUgdG8gbWFyayBjb21wYWN0aW5nIChkdWUgdG8gdGhlbSBiZWluZyBpbnZvbHZlZCBpbiBvdGhlciBjb21wYWN0aW9ucykKKyAgICAgKiBAcGFyYW0gbWVtb3J5UG9vbEJ5dGVzIHNpemUgb2YgdGhlIG1lbW9yeSBwb29sCisgICAgICovCisgICAgcHVibGljIEluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uKE1hcDxUYWJsZUlkLCBMaWZlY3ljbGVUcmFuc2FjdGlvbj4gdHJhbnNhY3Rpb25zLCBsb25nIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUsIGxvbmcgbWVtb3J5UG9vbEJ5dGVzKQorICAgIHsKKyAgICAgICAgdGhpcy50cmFuc2FjdGlvbnMgPSB0cmFuc2FjdGlvbnM7CisgICAgICAgIHRoaXMubm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSA9IG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemU7CisgICAgICAgIHRoaXMubWVtb3J5UG9vbEJ5dGVzID0gbWVtb3J5UG9vbEJ5dGVzOworICAgICAgICB0aGlzLmNvbXBhY3Rpb25JZCA9IG5leHRUaW1lVVVJRCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUIGV4dGVuZHMgU1NUYWJsZVJlYWRlciAmIEluZGV4U3VtbWFyeVN1cHBvcnQ8VD4+IExpc3Q8VD4gZ2V0SW5kZXhTdW1tYXJ5U3VwcG9ydGluZ0FuZENsb3NlT3RoZXJzKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4bikKKyAgICB7CisgICAgICAgIExpc3Q8VD4gZmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBjYW5jZWxzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogdHhuLm9yaWdpbmFscygpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3N0YWJsZSBpbnN0YW5jZW9mIEluZGV4U3VtbWFyeVN1cHBvcnQ8Pz4pCisgICAgICAgICAgICAgICAgZmlsdGVyZWQuYWRkKChUKSBzc3RhYmxlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjYW5jZWxzLmFkZChzc3RhYmxlKTsKKyAgICAgICAgfQorICAgICAgICB0eG4uY2FuY2VsKGNhbmNlbHMpOworICAgICAgICByZXR1cm4gZmlsdGVyZWQ7CisgICAgfQorCisgICAgcHVibGljIDxUIGV4dGVuZHMgU1NUYWJsZVJlYWRlciAmIEluZGV4U3VtbWFyeVN1cHBvcnQ8VD4+IExpc3Q8VD4gcmVkaXN0cmlidXRlU3VtbWFyaWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIHN0YXJ0ID0gbmFub1RpbWUoKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlJlZGlzdHJpYnV0aW5nIGluZGV4IHN1bW1hcmllcyIpOworICAgICAgICBMaXN0PFQ+IHJlZGlzdHJpYnV0ZSA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIGZvciAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuIDogdHJhbnNhY3Rpb25zLnZhbHVlcygpKQorICAgICAgICB7CisgICAgICAgICAgICByZWRpc3RyaWJ1dGUuYWRkQWxsKGdldEluZGV4U3VtbWFyeVN1cHBvcnRpbmdBbmRDbG9zZU90aGVycyh0eG4pKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgdG90YWwgPSBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplOworICAgICAgICBmb3IgKFQgc3N0YWJsZSA6IHJlZGlzdHJpYnV0ZSkKKyAgICAgICAgICAgIHRvdGFsICs9IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0T2ZmSGVhcFNpemUoKTsKKworICAgICAgICBsb2dnZXIuaW5mbygiQmVnaW5uaW5nIHJlZGlzdHJpYnV0aW9uIG9mIGluZGV4IHN1bW1hcmllcyBmb3Ige30gc3N0YWJsZXMgd2l0aCBtZW1vcnkgcG9vbCBzaXplIHt9IE1pQjsgY3VycmVudCBzcGFjZWQgdXNlZCBpcyB7fSBNaUIiLAorICAgICAgICAgICAgICAgICAgICAgcmVkaXN0cmlidXRlLnNpemUoKSwgbWVtb3J5UG9vbEJ5dGVzIC8gMTAyNEwgLyAxMDI0TCwgdG90YWwgLyAxMDI0LjAgLyAxMDI0LjApOworCisgICAgICAgIGZpbmFsIE1hcDxULCBEb3VibGU+IHJlYWRSYXRlcyA9IG5ldyBIYXNoTWFwPD4ocmVkaXN0cmlidXRlLnNpemUoKSk7CisgICAgICAgIGRvdWJsZSB0b3RhbFJlYWRzUGVyU2VjID0gMC4wOworICAgICAgICBmb3IgKFQgc3N0YWJsZSA6IHJlZGlzdHJpYnV0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlzU3RvcFJlcXVlc3RlZCgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24oZ2V0Q29tcGFjdGlvbkluZm8oKSk7CisKKyAgICAgICAgICAgIGlmIChzc3RhYmxlLmdldFJlYWRNZXRlcigpICE9IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRG91YmxlIHJlYWRSYXRlID0gc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKS5maWZ0ZWVuTWludXRlUmF0ZSgpOworICAgICAgICAgICAgICAgIHRvdGFsUmVhZHNQZXJTZWMgKz0gcmVhZFJhdGU7CisgICAgICAgICAgICAgICAgcmVhZFJhdGVzLnB1dChzc3RhYmxlLCByZWFkUmF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9nZ2VyLnRyYWNlKCJUb3RhbCByZWFkcy9zZWMgYWNyb3NzIGFsbCBzc3RhYmxlcyBpbiBpbmRleCBzdW1tYXJ5IHJlc2l6ZSBwcm9jZXNzOiB7fSIsIHRvdGFsUmVhZHNQZXJTZWMpOworCisgICAgICAgIC8vIGNvcHkgYW5kIHNvcnQgYnkgcmVhZCByYXRlcyAoYXNjZW5kaW5nKQorICAgICAgICBMaXN0PFQ+IHNzdGFibGVzQnlIb3RuZXNzID0gbmV3IEFycmF5TGlzdDw+KHJlZGlzdHJpYnV0ZSk7CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc3N0YWJsZXNCeUhvdG5lc3MsIG5ldyBSZWFkUmF0ZUNvbXBhcmF0b3IocmVhZFJhdGVzKSk7CisKKyAgICAgICAgbG9uZyByZW1haW5pbmdCeXRlcyA9IG1lbW9yeVBvb2xCeXRlcyAtIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemU7CisKKyAgICAgICAgbG9nZ2VyLnRyYWNlKCJJbmRleCBzdW1tYXJpZXMgZm9yIGNvbXBhY3RpbmcgU1NUYWJsZXMgYXJlIHVzaW5nIHt9IE1pQiBvZiBzcGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAobWVtb3J5UG9vbEJ5dGVzIC0gcmVtYWluaW5nQnl0ZXMpIC8gMTAyNC4wIC8gMTAyNC4wKTsKKyAgICAgICAgTGlzdDxUPiBuZXdTU1RhYmxlczsKKyAgICAgICAgdHJ5IChSZWZzPFNTVGFibGVSZWFkZXI+IHJlZnMgPSBSZWZzLnJlZihzc3RhYmxlc0J5SG90bmVzcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld1NTVGFibGVzID0gYWRqdXN0U2FtcGxpbmdMZXZlbHMoc3N0YWJsZXNCeUhvdG5lc3MsIHRyYW5zYWN0aW9ucywgdG90YWxSZWFkc1BlclNlYywgcmVtYWluaW5nQnl0ZXMpOworCisgICAgICAgICAgICBmb3IgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA6IHRyYW5zYWN0aW9ucy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICB0eG4uZmluaXNoKCk7CisgICAgICAgIH0KKyAgICAgICAgdG90YWwgPSBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplOworICAgICAgICBmb3IgKFQgc3N0YWJsZSA6IG5ld1NTVGFibGVzKQorICAgICAgICAgICAgdG90YWwgKz0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRPZmZIZWFwU2l6ZSgpOworCisgICAgICAgIGxvZ2dlci5pbmZvKCJDb21wbGV0ZWQgcmVzaXppbmcgb2YgaW5kZXggc3VtbWFyaWVzOyBjdXJyZW50IGFwcHJveGltYXRlIG1lbW9yeSB1c2VkOiB7fSBNaUIsIHRpbWUgc3BlbnQ6IHt9bXMiLAorICAgICAgICAgICAgICAgICAgICB0b3RhbCAvIDEwMjQuMCAvIDEwMjQuMCwgVGltZVVuaXQuTkFOT1NFQ09ORFMudG9NaWxsaXMobmFub1RpbWUoKSAtIHN0YXJ0KSk7CisKKyAgICAgICAgcmV0dXJuIG5ld1NTVGFibGVzOworICAgIH0KKworICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgSW5kZXhTdW1tYXJ5U3VwcG9ydDxUPj4gTGlzdDxUPiBhZGp1c3RTYW1wbGluZ0xldmVscyhMaXN0PFQ+IHNzdGFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8VGFibGVJZCwgTGlmZWN5Y2xlVHJhbnNhY3Rpb24+IHRyYW5zYWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvdGFsUmVhZHNQZXJTZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbWVtb3J5UG9vbENhcGFjaXR5KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIExpc3Q8UmVzYW1wbGVFbnRyeTxUPj4gdG9Eb3duc2FtcGxlID0gbmV3IEFycmF5TGlzdDw+KHNzdGFibGVzLnNpemUoKSAvIDQpOworICAgICAgICBMaXN0PFJlc2FtcGxlRW50cnk8VD4+IHRvVXBzYW1wbGUgPSBuZXcgQXJyYXlMaXN0PD4oc3N0YWJsZXMuc2l6ZSgpIC8gNCk7CisgICAgICAgIExpc3Q8UmVzYW1wbGVFbnRyeTxUPj4gZm9yY2VSZXNhbXBsZSA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFJlc2FtcGxlRW50cnk8VD4+IGZvcmNlVXBzYW1wbGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxUPiBuZXdTU1RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8Pihzc3RhYmxlcy5zaXplKCkpOworCisgICAgICAgIC8vIEdvaW5nIGZyb20gdGhlIGNvbGRlc3QgdG8gdGhlIGhvdHRlc3Qgc3N0YWJsZXMsIHRyeSB0byBnaXZlIGVhY2ggc3N0YWJsZSBhbiBhbW91bnQgb2Ygc3BhY2UgcHJvcG9ydGlvbmFsCisgICAgICAgIC8vIHRvIHRoZSBudW1iZXIgb2YgdG90YWwgcmVhZHMvc2VjIGl0IGhhbmRsZXMuCisgICAgICAgIHJlbWFpbmluZ1NwYWNlID0gbWVtb3J5UG9vbENhcGFjaXR5OworICAgICAgICBmb3IgKFQgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNTdG9wUmVxdWVzdGVkKCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbihnZXRDb21wYWN0aW9uSW5mbygpKTsKKworICAgICAgICAgICAgaW50IG1pbkluZGV4SW50ZXJ2YWwgPSBzc3RhYmxlLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWw7CisgICAgICAgICAgICBpbnQgbWF4SW5kZXhJbnRlcnZhbCA9IHNzdGFibGUubWV0YWRhdGEoKS5wYXJhbXMubWF4SW5kZXhJbnRlcnZhbDsKKworICAgICAgICAgICAgZG91YmxlIHJlYWRzUGVyU2VjID0gc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKSA9PSBudWxsID8gMC4wIDogc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKS5maWZ0ZWVuTWludXRlUmF0ZSgpOworICAgICAgICAgICAgbG9uZyBpZGVhbFNwYWNlID0gTWF0aC5yb3VuZChyZW1haW5pbmdTcGFjZSAqIChyZWFkc1BlclNlYyAvIHRvdGFsUmVhZHNQZXJTZWMpKTsKKworICAgICAgICAgICAgLy8gZmlndXJlIG91dCBob3cgbWFueSBlbnRyaWVzIG91ciBpZGVhbFNwYWNlIHdvdWxkIGJ1eSB1cywgYW5kIHBpY2sgYSBuZXcgc2FtcGxpbmcgbGV2ZWwgYmFzZWQgb24gdGhhdAorICAgICAgICAgICAgaW50IGN1cnJlbnROdW1FbnRyaWVzID0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5zaXplKCk7CisgICAgICAgICAgICBkb3VibGUgYXZnRW50cnlTaXplID0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRPZmZIZWFwU2l6ZSgpIC8gKGRvdWJsZSkgY3VycmVudE51bUVudHJpZXM7CisgICAgICAgICAgICBsb25nIHRhcmdldE51bUVudHJpZXMgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGlkZWFsU3BhY2UgLyBhdmdFbnRyeVNpemUpKTsKKyAgICAgICAgICAgIGludCBjdXJyZW50U2FtcGxpbmdMZXZlbCA9IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpOworICAgICAgICAgICAgaW50IG1heFN1bW1hcnlTaXplID0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRNYXhOdW1iZXJPZkVudHJpZXMoKTsKKworICAgICAgICAgICAgLy8gaWYgdGhlIG1pbl9pbmRleF9pbnRlcnZhbCBjaGFuZ2VkLCBjYWxjdWxhdGUgd2hhdCBvdXIgY3VycmVudCBzYW1wbGluZyBsZXZlbCB3b3VsZCBiZSB1bmRlciB0aGUgbmV3IG1pbgorICAgICAgICAgICAgaWYgKHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0TWluSW5kZXhJbnRlcnZhbCgpICE9IG1pbkluZGV4SW50ZXJ2YWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGVmZmVjdGl2ZVNhbXBsaW5nTGV2ZWwgPSAoaW50KSBNYXRoLnJvdW5kKGN1cnJlbnRTYW1wbGluZ0xldmVsICogKG1pbkluZGV4SW50ZXJ2YWwgLyAoZG91YmxlKSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldE1pbkluZGV4SW50ZXJ2YWwoKSkpOworICAgICAgICAgICAgICAgIG1heFN1bW1hcnlTaXplID0gKGludCkgTWF0aC5yb3VuZChtYXhTdW1tYXJ5U2l6ZSAqIChzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldE1pbkluZGV4SW50ZXJ2YWwoKSAvIChkb3VibGUpIG1pbkluZGV4SW50ZXJ2YWwpKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIm1pbl9pbmRleF9pbnRlcnZhbCBjaGFuZ2VkIGZyb20ge30gdG8ge30sIHNvIHRoZSBjdXJyZW50IHNhbXBsaW5nIGxldmVsIGZvciB7fSBpcyBlZmZlY3RpdmVseSBub3cge30gKHdhcyB7fSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldE1pbkluZGV4SW50ZXJ2YWwoKSwgbWluSW5kZXhJbnRlcnZhbCwgc3N0YWJsZSwgZWZmZWN0aXZlU2FtcGxpbmdMZXZlbCwgY3VycmVudFNhbXBsaW5nTGV2ZWwpOworICAgICAgICAgICAgICAgIGN1cnJlbnRTYW1wbGluZ0xldmVsID0gZWZmZWN0aXZlU2FtcGxpbmdMZXZlbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IG5ld1NhbXBsaW5nTGV2ZWwgPSBJbmRleFN1bW1hcnlCdWlsZGVyLmNhbGN1bGF0ZVNhbXBsaW5nTGV2ZWwoY3VycmVudFNhbXBsaW5nTGV2ZWwsIGN1cnJlbnROdW1FbnRyaWVzLCB0YXJnZXROdW1FbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICBtaW5JbmRleEludGVydmFsLCBtYXhJbmRleEludGVydmFsKTsKKyAgICAgICAgICAgIGludCBudW1FbnRyaWVzQXROZXdTYW1wbGluZ0xldmVsID0gSW5kZXhTdW1tYXJ5QnVpbGRlci5lbnRyaWVzQXRTYW1wbGluZ0xldmVsKG5ld1NhbXBsaW5nTGV2ZWwsIG1heFN1bW1hcnlTaXplKTsKKyAgICAgICAgICAgIGRvdWJsZSBlZmZlY3RpdmVJbmRleEludGVydmFsID0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCk7CisKKyAgICAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKKyAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoInt9IGhhcyB7fSByZWFkcy9zZWM7IGlkZWFsIHNwYWNlIGZvciBpbmRleCBzdW1tYXJ5OiB7fSAoe30gZW50cmllcyk7IGNvbnNpZGVyaW5nIG1vdmluZyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyb20gbGV2ZWwge30gKHt9IGVudHJpZXMsIHt9KSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIGxldmVsIHt9ICh7fSBlbnRyaWVzLCB7fSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldEZpbGVuYW1lKCksIHJlYWRzUGVyU2VjLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShpZGVhbFNwYWNlKSwgdGFyZ2V0TnVtRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFNhbXBsaW5nTGV2ZWwsIGN1cnJlbnROdW1FbnRyaWVzLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeSgobG9uZykgKGN1cnJlbnROdW1FbnRyaWVzICogYXZnRW50cnlTaXplKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1NhbXBsaW5nTGV2ZWwsIG51bUVudHJpZXNBdE5ld1NhbXBsaW5nTGV2ZWwsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KChsb25nKSAobnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbCAqIGF2Z0VudHJ5U2l6ZSkpKTsKKworICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwgPCBtaW5JbmRleEludGVydmFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRoZSBtaW5faW5kZXhfaW50ZXJ2YWwgd2FzIGNoYW5nZWQ7IHJlLXNhbXBsZSB0byBtYXRjaCBpdC4KKyAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkZvcmNpbmcgcmVzYW1wbGUgb2Yge30gYmVjYXVzZSB0aGUgY3VycmVudCBpbmRleCBpbnRlcnZhbCAoe30pIGlzIGJlbG93IG1pbl9pbmRleF9pbnRlcnZhbCAoe30pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUsIGVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwsIG1pbkluZGV4SW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIGxvbmcgc3BhY2VVc2VkID0gKGxvbmcpIE1hdGguY2VpbChhdmdFbnRyeVNpemUgKiBudW1FbnRyaWVzQXROZXdTYW1wbGluZ0xldmVsKTsKKyAgICAgICAgICAgICAgICBmb3JjZVJlc2FtcGxlLmFkZChuZXcgUmVzYW1wbGVFbnRyeTxUPihzc3RhYmxlLCBzcGFjZVVzZWQsIG5ld1NhbXBsaW5nTGV2ZWwpKTsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdTcGFjZSAtPSBzcGFjZVVzZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChlZmZlY3RpdmVJbmRleEludGVydmFsID4gbWF4SW5kZXhJbnRlcnZhbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbWF4X2luZGV4X2ludGVydmFsIHdhcyBsb3dlcmVkOyBmb3JjZSBhbiB1cHNhbXBsZSB0byB0aGUgZWZmZWN0aXZlIG1pbmltdW0gc2FtcGxpbmcgbGV2ZWwKKyAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIkZvcmNpbmcgdXBzYW1wbGUgb2Yge30gYmVjYXVzZSB0aGUgY3VycmVudCBpbmRleCBpbnRlcnZhbCAoe30pIGlzIGFib3ZlIG1heF9pbmRleF9pbnRlcnZhbCAoe30pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUsIGVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwsIG1heEluZGV4SW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIG5ld1NhbXBsaW5nTGV2ZWwgPSBNYXRoLm1heCgxLCAoQkFTRV9TQU1QTElOR19MRVZFTCAqIG1pbkluZGV4SW50ZXJ2YWwpIC8gbWF4SW5kZXhJbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgbnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbCA9IEluZGV4U3VtbWFyeUJ1aWxkZXIuZW50cmllc0F0U2FtcGxpbmdMZXZlbChuZXdTYW1wbGluZ0xldmVsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldE1heE51bWJlck9mRW50cmllcygpKTsKKyAgICAgICAgICAgICAgICBsb25nIHNwYWNlVXNlZCA9IChsb25nKSBNYXRoLmNlaWwoYXZnRW50cnlTaXplICogbnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbCk7CisgICAgICAgICAgICAgICAgZm9yY2VVcHNhbXBsZS5hZGQobmV3IFJlc2FtcGxlRW50cnk8VD4oc3N0YWJsZSwgc3BhY2VVc2VkLCBuZXdTYW1wbGluZ0xldmVsKSk7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nU3BhY2UgLT0gYXZnRW50cnlTaXplICogbnVtRW50cmllc0F0TmV3U2FtcGxpbmdMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHRhcmdldE51bUVudHJpZXMgPj0gY3VycmVudE51bUVudHJpZXMgKiBVUFNBTVBMRV9USFJFU0hPTEQgJiYgbmV3U2FtcGxpbmdMZXZlbCA+IGN1cnJlbnRTYW1wbGluZ0xldmVsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgc3BhY2VVc2VkID0gKGxvbmcpIE1hdGguY2VpbChhdmdFbnRyeVNpemUgKiBudW1FbnRyaWVzQXROZXdTYW1wbGluZ0xldmVsKTsKKyAgICAgICAgICAgICAgICB0b1Vwc2FtcGxlLmFkZChuZXcgUmVzYW1wbGVFbnRyeTxUPihzc3RhYmxlLCBzcGFjZVVzZWQsIG5ld1NhbXBsaW5nTGV2ZWwpKTsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdTcGFjZSAtPSBhdmdFbnRyeVNpemUgKiBudW1FbnRyaWVzQXROZXdTYW1wbGluZ0xldmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0TnVtRW50cmllcyA8IGN1cnJlbnROdW1FbnRyaWVzICogRE9XTlNBTVBMRV9USEVTSE9MRCAmJiBuZXdTYW1wbGluZ0xldmVsIDwgY3VycmVudFNhbXBsaW5nTGV2ZWwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9uZyBzcGFjZVVzZWQgPSAobG9uZykgTWF0aC5jZWlsKGF2Z0VudHJ5U2l6ZSAqIG51bUVudHJpZXNBdE5ld1NhbXBsaW5nTGV2ZWwpOworICAgICAgICAgICAgICAgIHRvRG93bnNhbXBsZS5hZGQobmV3IFJlc2FtcGxlRW50cnk8VD4oc3N0YWJsZSwgc3BhY2VVc2VkLCBuZXdTYW1wbGluZ0xldmVsKSk7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nU3BhY2UgLT0gc3BhY2VVc2VkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGtlZXAgdGhlIHNhbWUgc2FtcGxpbmcgbGV2ZWwKKyAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIlNTVGFibGUge30gaXMgd2l0aGluIHRocmVzaG9sZHMgb2YgaWRlYWwgc2FtcGxpbmciLCBzc3RhYmxlKTsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdTcGFjZSAtPSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldE9mZkhlYXBTaXplKCk7CisgICAgICAgICAgICAgICAgbmV3U1NUYWJsZXMuYWRkKHNzdGFibGUpOworICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucy5nZXQoc3N0YWJsZS5tZXRhZGF0YSgpLmlkKS5jYW5jZWwoc3N0YWJsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbFJlYWRzUGVyU2VjIC09IHJlYWRzUGVyU2VjOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlbWFpbmluZ1NwYWNlID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgUGFpcjxMaXN0PFQ+LCBMaXN0PFJlc2FtcGxlRW50cnk8VD4+PiByZXN1bHQgPSBkaXN0cmlidXRlUmVtYWluaW5nU3BhY2UodG9Eb3duc2FtcGxlLCByZW1haW5pbmdTcGFjZSk7CisgICAgICAgICAgICB0b0Rvd25zYW1wbGUgPSByZXN1bHQucmlnaHQ7CisgICAgICAgICAgICBuZXdTU1RhYmxlcy5hZGRBbGwocmVzdWx0LmxlZnQpOworICAgICAgICAgICAgZm9yIChUIHNzdGFibGUgOiByZXN1bHQubGVmdCkKKyAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbnMuZ2V0KHNzdGFibGUubWV0YWRhdGEoKS5pZCkuY2FuY2VsKHNzdGFibGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZG93bnNhbXBsZSBmaXJzdCwgdGhlbiB1cHNhbXBsZQorICAgICAgICBsb2dnZXIuaW5mbygiaW5kZXggc3VtbWFyaWVzOiBkb3duc2FtcGxlOiB7fSwgZm9yY2UgcmVzYW1wbGU6IHt9LCB1cHNhbXBsZToge30sIGZvcmNlIHVwc2FtcGxlOiB7fSIsIHRvRG93bnNhbXBsZS5zaXplKCksIGZvcmNlUmVzYW1wbGUuc2l6ZSgpLCB0b1Vwc2FtcGxlLnNpemUoKSwgZm9yY2VVcHNhbXBsZS5zaXplKCkpOworICAgICAgICB0b0Rvd25zYW1wbGUuYWRkQWxsKGZvcmNlUmVzYW1wbGUpOworICAgICAgICB0b0Rvd25zYW1wbGUuYWRkQWxsKHRvVXBzYW1wbGUpOworICAgICAgICB0b0Rvd25zYW1wbGUuYWRkQWxsKGZvcmNlVXBzYW1wbGUpOworICAgICAgICBmb3IgKFJlc2FtcGxlRW50cnk8VD4gZW50cnkgOiB0b0Rvd25zYW1wbGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpc1N0b3BSZXF1ZXN0ZWQoKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uKGdldENvbXBhY3Rpb25JbmZvKCkpOworCisgICAgICAgICAgICBUIHNzdGFibGUgPSBlbnRyeS5zc3RhYmxlOworICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJSZS1zYW1wbGluZyBpbmRleCBzdW1tYXJ5IGZvciB7fSBmcm9tIHt9L3t9IHRvIHt9L3t9IG9mIHRoZSBvcmlnaW5hbCBudW1iZXIgb2YgZW50cmllcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZSwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCksIERvd25zYW1wbGluZy5CQVNFX1NBTVBMSU5HX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lm5ld1NhbXBsaW5nTGV2ZWwsIERvd25zYW1wbGluZy5CQVNFX1NBTVBMSU5HX0xFVkVMKTsKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oc3N0YWJsZS5tZXRhZGF0YSgpLmtleXNwYWNlKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShzc3RhYmxlLm1ldGFkYXRhKCkuaWQpOworICAgICAgICAgICAgbG9uZyBvbGRTaXplID0gc3N0YWJsZS5ieXRlc09uRGlzaygpOworICAgICAgICAgICAgbG9uZyBvbGRTaXplVW5jb21wcmVzc2VkID0gc3N0YWJsZS5sb2dpY2FsQnl0ZXNPbkRpc2soKTsKKworICAgICAgICAgICAgVCByZXBsYWNlbWVudCA9IHNzdGFibGUuY2xvbmVXaXRoTmV3U3VtbWFyeVNhbXBsaW5nTGV2ZWwoY2ZzLCBlbnRyeS5uZXdTYW1wbGluZ0xldmVsKTsKKyAgICAgICAgICAgIGxvbmcgbmV3U2l6ZSA9IHJlcGxhY2VtZW50LmJ5dGVzT25EaXNrKCk7CisgICAgICAgICAgICBsb25nIG5ld1NpemVVbmNvbXByZXNzZWQgPSByZXBsYWNlbWVudC5sb2dpY2FsQnl0ZXNPbkRpc2soKTsKKworICAgICAgICAgICAgbmV3U1NUYWJsZXMuYWRkKHJlcGxhY2VtZW50KTsKKyAgICAgICAgICAgIHRyYW5zYWN0aW9ucy5nZXQoc3N0YWJsZS5tZXRhZGF0YSgpLmlkKS51cGRhdGUocmVwbGFjZW1lbnQsIHRydWUpOworICAgICAgICAgICAgYWRkSG9va3MoY2ZzLCB0cmFuc2FjdGlvbnMsIG9sZFNpemUsIG5ld1NpemUsIG9sZFNpemVVbmNvbXByZXNzZWQsIG5ld1NpemVVbmNvbXByZXNzZWQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ld1NTVGFibGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBob29rcyB0byBjb3JyZWN0bHkgdXBkYXRlIHRoZSBzdG9yYWdlIGxvYWQgbWV0cmljcyBvbmNlIHRoZSB0cmFuc2FjdGlvbiBpcyBjbG9zZWQvYWJvcnRlZAorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFRyYW5zYWN0aW9ucyBhcmUgY2xvc2VkIGluIGZpbmFsbHkgb3V0c2lkZSBvZiB0aGlzIG1ldGhvZAorICAgIHByaXZhdGUgdm9pZCBhZGRIb29rcyhDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIE1hcDxUYWJsZUlkLCBMaWZlY3ljbGVUcmFuc2FjdGlvbj4gdHJhbnNhY3Rpb25zLCBsb25nIG9sZFNpemUsIGxvbmcgbmV3U2l6ZSwgbG9uZyBvbGRTaXplVW5jb21wcmVzc2VkLCBsb25nIG5ld1NpemVVbmNvbXByZXNzZWQpCisgICAgeworICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSB0cmFuc2FjdGlvbnMuZ2V0KGNmcy5tZXRhZGF0YS5pZCk7CisgICAgICAgIHR4bi5ydW5PbkNvbW1pdCgoKSAtPiB7CisgICAgICAgICAgICAvLyBUaGUgbmV3IHNpemUgd2lsbCBiZSBhZGRlZCBpbiBUcmFuc2FjdGlvbmFsLmNvbW1pdCgpIGFzIGFuIHVwZGF0ZWQgU1NUYWJsZSwgbW9yZSBkZXRhaWxzOiBDQVNTQU5EUkEtMTM3MzgKKyAgICAgICAgICAgIFN0b3JhZ2VNZXRyaWNzLmxvYWQuZGVjKG9sZFNpemUpOworICAgICAgICAgICAgU3RvcmFnZU1ldHJpY3MudW5jb21wcmVzc2VkTG9hZC5kZWMob2xkU2l6ZVVuY29tcHJlc3NlZCk7CisKKyAgICAgICAgICAgIGNmcy5tZXRyaWMubGl2ZURpc2tTcGFjZVVzZWQuZGVjKG9sZFNpemUpOworICAgICAgICAgICAgY2ZzLm1ldHJpYy51bmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZC5kZWMob2xkU2l6ZVVuY29tcHJlc3NlZCk7CisgICAgICAgICAgICBjZnMubWV0cmljLnRvdGFsRGlza1NwYWNlVXNlZC5kZWMob2xkU2l6ZSk7CisgICAgICAgIH0pOworICAgICAgICB0eG4ucnVuT25BYm9ydCgoKSAtPiB7CisgICAgICAgICAgICAvLyB0aGUgbG9jYWwgZGlzayB3YXMgbW9kaWZpZWQgYnV0IGJvb2trZWVwaW5nIGNvdWxkbid0IGJlIGNvbW1pdGVkLCBhcHBseSB0aGUgZGVsdGEKKyAgICAgICAgICAgIGxvbmcgZGVsdGEgPSBvbGRTaXplIC0gbmV3U2l6ZTsgLy8gaWYgbmV3IGlzIGxhcmdlciB0aGlzIHdpbGwgYmUgbmVnYXRpdmUsIHNvIGRlYyB3aWxsIGJlY29tZSBhIGluYworICAgICAgICAgICAgbG9uZyBkZWx0YVVuY29tcHJlc3NlZCA9IG9sZFNpemVVbmNvbXByZXNzZWQgLSBuZXdTaXplVW5jb21wcmVzc2VkOworCisgICAgICAgICAgICBTdG9yYWdlTWV0cmljcy5sb2FkLmRlYyhkZWx0YSk7CisgICAgICAgICAgICBTdG9yYWdlTWV0cmljcy51bmNvbXByZXNzZWRMb2FkLmRlYyhkZWx0YVVuY29tcHJlc3NlZCk7CisKKyAgICAgICAgICAgIGNmcy5tZXRyaWMubGl2ZURpc2tTcGFjZVVzZWQuZGVjKGRlbHRhKTsKKyAgICAgICAgICAgIGNmcy5tZXRyaWMudW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQuZGVjKGRlbHRhVW5jb21wcmVzc2VkKTsKKyAgICAgICAgICAgIGNmcy5tZXRyaWMudG90YWxEaXNrU3BhY2VVc2VkLmRlYyhkZWx0YSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyA8VCBleHRlbmRzIFNTVGFibGVSZWFkZXIgJiBJbmRleFN1bW1hcnlTdXBwb3J0PFQ+PiBQYWlyPExpc3Q8VD4sIExpc3Q8UmVzYW1wbGVFbnRyeTxUPj4+IGRpc3RyaWJ1dGVSZW1haW5pbmdTcGFjZShMaXN0PFJlc2FtcGxlRW50cnk8VD4+IHRvRG93bnNhbXBsZSwgbG9uZyByZW1haW5pbmdTcGFjZSkKKyAgICB7CisgICAgICAgIC8vIHNvcnQgYnkgdGhlIGFtb3VudCBvZiBzcGFjZSByZWdhaW5lZCBieSBkb2luZyB0aGUgZG93bnNhbXBsZSBvcGVyYXRpb247IHdlIHdhbnQgdG8gdHJ5IHRvIGF2b2lkIG9wZXJhdGlvbnMKKyAgICAgICAgLy8gdGhhdCB3aWxsIG1ha2UgbGl0dGxlIGRpZmZlcmVuY2UuCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQodG9Eb3duc2FtcGxlLCBDb21wYXJhdG9yLmNvbXBhcmluZ0RvdWJsZShvIC0+IG8uc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRPZmZIZWFwU2l6ZSgpIC0gby5uZXdTcGFjZVVzZWQpKTsKKworICAgICAgICBpbnQgbm9Eb3duc2FtcGxlQ3V0b2ZmID0gMDsKKyAgICAgICAgTGlzdDxUPiB3aWxsTm90RG93bnNhbXBsZSA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB3aGlsZSAocmVtYWluaW5nU3BhY2UgPiAwICYmIG5vRG93bnNhbXBsZUN1dG9mZiA8IHRvRG93bnNhbXBsZS5zaXplKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlc2FtcGxlRW50cnk8VD4gZW50cnkgPSB0b0Rvd25zYW1wbGUuZ2V0KG5vRG93bnNhbXBsZUN1dG9mZik7CisKKyAgICAgICAgICAgIGxvbmcgZXh0cmFTcGFjZVJlcXVpcmVkID0gZW50cnkuc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRPZmZIZWFwU2l6ZSgpIC0gZW50cnkubmV3U3BhY2VVc2VkOworICAgICAgICAgICAgLy8gc2VlIGlmIHdlIGhhdmUgZW5vdWdoIGxlZnRvdmVyIHNwYWNlIHRvIGtlZXAgdGhlIGN1cnJlbnQgc2FtcGxpbmcgbGV2ZWwKKyAgICAgICAgICAgIGlmIChleHRyYVNwYWNlUmVxdWlyZWQgPD0gcmVtYWluaW5nU3BhY2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJVc2luZyBsZWZ0b3ZlciBzcGFjZSB0byBrZWVwIHt9IGF0IHRoZSBjdXJyZW50IHNhbXBsaW5nIGxldmVsICh7fSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zc3RhYmxlLCBlbnRyeS5zc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisgICAgICAgICAgICAgICAgd2lsbE5vdERvd25zYW1wbGUuYWRkKGVudHJ5LnNzdGFibGUpOworICAgICAgICAgICAgICAgIHJlbWFpbmluZ1NwYWNlIC09IGV4dHJhU3BhY2VSZXF1aXJlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbm9Eb3duc2FtcGxlQ3V0b2ZmKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKHdpbGxOb3REb3duc2FtcGxlLCB0b0Rvd25zYW1wbGUuc3ViTGlzdChub0Rvd25zYW1wbGVDdXRvZmYsIHRvRG93bnNhbXBsZS5zaXplKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcGFjdGlvbkluZm8gZ2V0Q29tcGFjdGlvbkluZm8oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbXBhY3Rpb25JbmZvLndpdGhvdXRTU1RhYmxlcyhudWxsLCBPcGVyYXRpb25UeXBlLklOREVYX1NVTU1BUlksIChtZW1vcnlQb29sQnl0ZXMgLSByZW1haW5pbmdTcGFjZSksIG1lbW9yeVBvb2xCeXRlcywgVW5pdC5CWVRFUywgY29tcGFjdGlvbklkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0dsb2JhbCgpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogVXRpbGl0eSBjbGFzcyBmb3Igc29ydGluZyBzc3RhYmxlcyBieSB0aGVpciByZWFkIHJhdGVzLiAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlYWRSYXRlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8U1NUYWJsZVJlYWRlcj4KKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPD8gZXh0ZW5kcyBTU1RhYmxlUmVhZGVyLCBEb3VibGU+IHJlYWRSYXRlczsKKworICAgICAgICBSZWFkUmF0ZUNvbXBhcmF0b3IoTWFwPD8gZXh0ZW5kcyBTU1RhYmxlUmVhZGVyLCBEb3VibGU+IHJlYWRSYXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5yZWFkUmF0ZXMgPSByZWFkUmF0ZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKFNTVGFibGVSZWFkZXIgbzEsIFNTVGFibGVSZWFkZXIgbzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIERvdWJsZSByZWFkUmF0ZTEgPSByZWFkUmF0ZXMuZ2V0KG8xKTsKKyAgICAgICAgICAgIERvdWJsZSByZWFkUmF0ZTIgPSByZWFkUmF0ZXMuZ2V0KG8yKTsKKyAgICAgICAgICAgIGlmIChyZWFkUmF0ZTEgPT0gbnVsbCAmJiByZWFkUmF0ZTIgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJlYWRSYXRlMSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJlYWRSYXRlMiA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBEb3VibGUuY29tcGFyZShyZWFkUmF0ZTEsIHJlYWRSYXRlMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXNhbXBsZUVudHJ5PFQgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgSW5kZXhTdW1tYXJ5U3VwcG9ydDxUPj4KKyAgICB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBUIHNzdGFibGU7CisgICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIG5ld1NwYWNlVXNlZDsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBuZXdTYW1wbGluZ0xldmVsOworCisgICAgICAgIFJlc2FtcGxlRW50cnkoVCBzc3RhYmxlLCBsb25nIG5ld1NwYWNlVXNlZCwgaW50IG5ld1NhbXBsaW5nTGV2ZWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc3N0YWJsZSA9IHNzdGFibGU7CisgICAgICAgICAgICB0aGlzLm5ld1NwYWNlVXNlZCA9IG5ld1NwYWNlVXNlZDsKKyAgICAgICAgICAgIHRoaXMubmV3U2FtcGxpbmdMZXZlbCA9IG5ld1NhbXBsaW5nTGV2ZWw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlTdXBwb3J0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhZDgzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeVN1cHBvcnQuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKKworcHVibGljIGludGVyZmFjZSBJbmRleFN1bW1hcnlTdXBwb3J0PFQgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgSW5kZXhTdW1tYXJ5U3VwcG9ydDxUPj4KK3sKKyAgICBJbmRleFN1bW1hcnkgZ2V0SW5kZXhTdW1tYXJ5KCk7CisKKyAgICBUIGNsb25lV2l0aE5ld1N1bW1hcnlTYW1wbGluZ0xldmVsKENvbHVtbkZhbWlseVN0b3JlIGNmcywgaW50IG5ld1NhbXBsaW5nTGV2ZWwpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIHN0YXRpYyBib29sZWFuIGlzU3VwcG9ydGVkQnkoU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQpCisgICAgeworICAgICAgICByZXR1cm4gSW5kZXhTdW1tYXJ5U3VwcG9ydC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGZvcm1hdC5nZXRSZWFkZXJGYWN0b3J5KCkuZ2V0UmVhZGVyQ2xhc3MoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9rZXljYWNoZS9LZXlDYWNoZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9rZXljYWNoZS9LZXlDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZDE5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2tleWNhY2hlL0tleUNhY2hlLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmtleWNhY2hlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkxvbmdBZGRlcjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk5vbm51bGw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5JbnN0cnVtZW50aW5nQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuS2V5Q2FjaGVLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CisKKy8qKgorICogQSBzaW1wbGUgd3JhcHBlciBvZiBwb3NzaWJseSBnbG9iYWwgY2FjaGUgd2l0aCBsb2NhbCBtZXRyaWNzLgorICovCitwdWJsaWMgY2xhc3MgS2V5Q2FjaGUKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEtleUNhY2hlIE5PX0NBQ0hFID0gbmV3IEtleUNhY2hlKG51bGwpOworCisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEtleUNhY2hlLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgSW5zdHJ1bWVudGluZ0NhY2hlPEtleUNhY2hlS2V5LCBBYnN0cmFjdFJvd0luZGV4RW50cnk+IGNhY2hlOworICAgIHByaXZhdGUgZmluYWwgTG9uZ0FkZGVyIGhpdHMgPSBuZXcgTG9uZ0FkZGVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMb25nQWRkZXIgcmVxdWVzdHMgPSBuZXcgTG9uZ0FkZGVyKCk7CisKKyAgICBwdWJsaWMgS2V5Q2FjaGUoQE51bGxhYmxlIEluc3RydW1lbnRpbmdDYWNoZTxLZXlDYWNoZUtleSwgQWJzdHJhY3RSb3dJbmRleEVudHJ5PiBjYWNoZSkKKyAgICB7CisgICAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRIaXRzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjYWNoZSAhPSBudWxsID8gaGl0cy5zdW0oKSA6IDA7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0UmVxdWVzdHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlICE9IG51bGwgPyByZXF1ZXN0cy5zdW0oKSA6IDA7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHV0KEBOb25udWxsIEtleUNhY2hlS2V5IGNhY2hlS2V5LCBATm9ubnVsbCBBYnN0cmFjdFJvd0luZGV4RW50cnkgaW5mbykKKyAgICB7CisgICAgICAgIGlmIChjYWNoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGxvZ2dlci50cmFjZSgiQWRkaW5nIGNhY2hlIGVudHJ5IGZvciB7fSAtPiB7fSIsIGNhY2hlS2V5LCBpbmZvKTsKKyAgICAgICAgY2FjaGUucHV0KGNhY2hlS2V5LCBpbmZvKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQE51bGxhYmxlIEFic3RyYWN0Um93SW5kZXhFbnRyeSBnZXQoS2V5Q2FjaGVLZXkga2V5LCBib29sZWFuIHVwZGF0ZVN0YXRzKQorICAgIHsKKyAgICAgICAgaWYgKGNhY2hlID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBpZiAodXBkYXRlU3RhdHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlcXVlc3RzLmluY3JlbWVudCgpOworICAgICAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IHIgPSBjYWNoZS5nZXQoa2V5KTsKKyAgICAgICAgICAgIGlmIChyICE9IG51bGwpCisgICAgICAgICAgICAgICAgaGl0cy5pbmNyZW1lbnQoKTsKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldEludGVybmFsKGtleSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlICE9IG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9rZXljYWNoZS9LZXlDYWNoZU1ldHJpY3MuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUva2V5Y2FjaGUvS2V5Q2FjaGVNZXRyaWNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhMWE2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUva2V5Y2FjaGUvS2V5Q2FjaGVNZXRyaWNzLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmtleWNhY2hlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RNZXRyaWNzUHJvdmlkZXJzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuR2F1Z2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworCitwdWJsaWMgY2xhc3MgS2V5Q2FjaGVNZXRyaWNzPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgS2V5Q2FjaGVTdXBwb3J0PFI+PiBleHRlbmRzIEFic3RyYWN0TWV0cmljc1Byb3ZpZGVyczxSPgoreworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgS2V5Q2FjaGVNZXRyaWNzPD8+IGluc3RhbmNlID0gbmV3IEtleUNhY2hlTWV0cmljczw+KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUiBtYXAoU1NUYWJsZVJlYWRlciByKQorICAgIHsKKyAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBLZXlDYWNoZVN1cHBvcnQ8Pz4pCisgICAgICAgICAgICByZXR1cm4gKFIpIHI7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKiBLZXkgY2FjaGUgaGl0IHJhdGUgIGZvciB0aGlzIENGICovCisgICAgcHJpdmF0ZSBmaW5hbCBHYXVnZVByb3ZpZGVyPERvdWJsZT4ga2V5Q2FjaGVIaXRSYXRlID0gbmV3R2F1Z2VQcm92aWRlcigiS2V5Q2FjaGVIaXRSYXRlIiwgcmVhZGVycyAtPiB7CisgICAgICAgIGxvbmcgaGl0cyA9IDBMOworICAgICAgICBsb25nIHJlcXVlc3RzID0gMEw7CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogcmVhZGVycykKKyAgICAgICAgeworICAgICAgICAgICAgaGl0cyArPSBzc3RhYmxlLmdldEtleUNhY2hlKCkuZ2V0SGl0cygpOworICAgICAgICAgICAgcmVxdWVzdHMgKz0gc3N0YWJsZS5nZXRLZXlDYWNoZSgpLmdldFJlcXVlc3RzKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGRvdWJsZSkgaGl0cyAvIChkb3VibGUpIE1hdGgubWF4KDEsIHJlcXVlc3RzKTsKKyAgICB9KTsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxHYXVnZVByb3ZpZGVyPD8+PiBnYXVnZVByb3ZpZGVycyA9IEFycmF5cy5hc0xpc3Qoa2V5Q2FjaGVIaXRSYXRlKTsKKworICAgIHB1YmxpYyBMaXN0PEdhdWdlUHJvdmlkZXI8Pz4+IGdldEdhdWdlUHJvdmlkZXJzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnYXVnZVByb3ZpZGVyczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2tleWNhY2hlL0tleUNhY2hlU3VwcG9ydC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9rZXljYWNoZS9LZXlDYWNoZVN1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDVkYjdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9rZXljYWNoZS9LZXlDYWNoZVN1cHBvcnQuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Ob25udWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5LZXlDYWNoZUtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQm91bmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RSb3dJbmRleEVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgS2V5Q2FjaGVTdXBwb3J0PFQgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgS2V5Q2FjaGVTdXBwb3J0PFQ+PgoreworICAgIEBOb25udWxsCisgICAgS2V5Q2FjaGUgZ2V0S2V5Q2FjaGUoKTsKKworICAgIC8qKgorICAgICAqIFNob3VsZCBxdWlja2x5IGdldCBhIGxvd2VyIGJvdW5kIHByZWZpeCBmcm9tIGNhY2hlIG9ubHkgaWYgZXZlcnl0aGluZyBpcyBhbHJlYWR5IGF2YWlsYWJlIGluIG1lbW9yeSBhbmQgZG9lcyBub3QKKyAgICAgKiBuZWVkIHRvIGJlIGxvYWRlZCBmcm9tIGRpc2suCisgICAgICovCisgICAgQE51bGxhYmxlCisgICAgQ2x1c3RlcmluZ0JvdW5kPD8+IGdldExvd2VyQm91bmRQcmVmaXhGcm9tQ2FjaGUoRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSwgYm9vbGVhbiBpc1JldmVyc2VkKTsKKworICAgIGRlZmF1bHQgQE5vbm51bGwgS2V5Q2FjaGVLZXkgZ2V0Q2FjaGVLZXkoQnl0ZUJ1ZmZlciBrZXkpCisgICAgeworICAgICAgICBUIHJlYWRlciA9IChUKSB0aGlzOworICAgICAgICByZXR1cm4gbmV3IEtleUNhY2hlS2V5KHJlYWRlci5tZXRhZGF0YSgpLCByZWFkZXIuZGVzY3JpcHRvciwga2V5KTsKKyAgICB9CisKKyAgICBkZWZhdWx0IEBOb25udWxsIEtleUNhY2hlS2V5IGdldENhY2hlS2V5KERlY29yYXRlZEtleSBrZXkpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0Q2FjaGVLZXkoa2V5LmdldEtleSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXaWxsIHJldHVybiBudWxsIGlmIGtleSBpcyBub3QgZm91bmQgb3IgY2FjaGUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBkZWZhdWx0IEBOdWxsYWJsZSBBYnN0cmFjdFJvd0luZGV4RW50cnkgZ2V0Q2FjaGVkUG9zaXRpb24oRGVjb3JhdGVkS2V5IGtleSwgYm9vbGVhbiB1cGRhdGVTdGF0cykKKyAgICB7CisgICAgICAgIHJldHVybiBnZXRDYWNoZWRQb3NpdGlvbihnZXRDYWNoZUtleShrZXkpLCB1cGRhdGVTdGF0cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2lsbCByZXR1cm4gbnVsbCBpZiBrZXkgaXMgbm90IGZvdW5kIG9yIGNhY2hlIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgZGVmYXVsdCBATnVsbGFibGUgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGdldENhY2hlZFBvc2l0aW9uKEtleUNhY2hlS2V5IGtleSwgYm9vbGVhbiB1cGRhdGVTdGF0cykKKyAgICB7CisgICAgICAgIEtleUNhY2hlIGtleUNhY2hlID0gZ2V0S2V5Q2FjaGUoKTsKKyAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGNhY2hlZEVudHJ5ID0ga2V5Q2FjaGUuZ2V0KGtleSwgdXBkYXRlU3RhdHMpOworICAgICAgICBhc3NlcnQgY2FjaGVkRW50cnkgPT0gbnVsbCB8fCBjYWNoZWRFbnRyeS5nZXRTU1RhYmxlRm9ybWF0KCkgPT0gKChUKSB0aGlzKS5kZXNjcmlwdG9yLnZlcnNpb24uZm9ybWF0OworCisgICAgICAgIHJldHVybiBjYWNoZWRFbnRyeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWNoZXMgYSBrZXkgb25seSBpZiBjYWNoZSBpcyBhdmFpbGFibGUuCisgICAgICovCisgICAgZGVmYXVsdCB2b2lkIGNhY2hlS2V5KEBOb25udWxsIERlY29yYXRlZEtleSBrZXksIEBOb25udWxsIEFic3RyYWN0Um93SW5kZXhFbnRyeSBpbmZvKQorICAgIHsKKyAgICAgICAgVCByZWFkZXIgPSAoVCkgdGhpczsKKyAgICAgICAgYXNzZXJ0IGluZm8uZ2V0U1NUYWJsZUZvcm1hdCgpID09IHJlYWRlci5kZXNjcmlwdG9yLnZlcnNpb24uZm9ybWF0OworCisgICAgICAgIEtleUNhY2hlS2V5IGNhY2hlS2V5ID0gZ2V0Q2FjaGVLZXkoa2V5KTsKKyAgICAgICAgZ2V0S2V5Q2FjaGUoKS5wdXQoY2FjaGVLZXksIGluZm8pOworICAgIH0KKworICAgIEBOb25udWxsCisgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGRlc2VyaWFsaXplS2V5Q2FjaGVWYWx1ZShATm9ubnVsbCBEYXRhSW5wdXRQbHVzIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICBzdGF0aWMgYm9vbGVhbiBpc1N1cHBvcnRlZEJ5KFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEtleUNhY2hlU3VwcG9ydC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGZvcm1hdC5nZXRSZWFkZXJGYWN0b3J5KCkuZ2V0UmVhZGVyQ2xhc3MoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL21ldGFkYXRhL01ldGFkYXRhQ29sbGVjdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL21ldGFkYXRhL01ldGFkYXRhQ29sbGVjdG9yLmphdmEKaW5kZXggMTM3NTMzMS4uZDE0ZWJiMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9tZXRhZGF0YS9NZXRhZGF0YUNvbGxlY3Rvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvbWV0YWRhdGEvTWV0YWRhdGFDb2xsZWN0b3IuamF2YQpAQCAtMTgsMzcgKzE4LDQ0IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGE7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7Ci0KIGltcG9ydCBjb20uY2xlYXJzcHJpbmcuYW5hbHl0aWNzLnN0cmVhbS5jYXJkaW5hbGl0eS5IeXBlckxvZ0xvZ1BsdXM7CiBpbXBvcnQgY29tLmNsZWFyc3ByaW5nLmFuYWx5dGljcy5zdHJlYW0uY2FyZGluYWxpdHkuSUNhcmRpbmFsaXR5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQm91bmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kT3JCb3VuZGFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5MaXZlbmVzc0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nUG9zaXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkludGVydmFsU2V0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uU3RhdGlzdGljc0NvbGxlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NdXJtdXJIYXNoOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnN0cmVhbWhpc3QuVG9tYnN0b25lSGlzdG9ncmFtOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnN0cmVhbWhpc3QuU3RyZWFtaW5nVG9tYnN0b25lSGlzdG9ncmFtQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5zdHJlYW1oaXN0LlRvbWJzdG9uZUhpc3RvZ3JhbTsKIAogcHVibGljIGNsYXNzIE1ldGFkYXRhQ29sbGVjdG9yIGltcGxlbWVudHMgUGFydGl0aW9uU3RhdGlzdGljc0NvbGxlY3RvcgogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgZG91YmxlIE5PX0NPTVBSRVNTSU9OX1JBVElPID0gLTEuMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyW10gRU1QVFlfQ0xVU1RFUklORyA9IG5ldyBCeXRlQnVmZmVyWzBdOworCisgICAgcHJpdmF0ZSBsb25nIGN1cnJlbnRQYXJ0aXRpb25DZWxscyA9IDA7CiAKICAgICBzdGF0aWMgRXN0aW1hdGVkSGlzdG9ncmFtIGRlZmF1bHRDZWxsUGVyUGFydGl0aW9uQ291bnRIaXN0b2dyYW0oKQogICAgIHsKQEAgLTU4LDggKzY1LDkgQEAKIAogICAgIHN0YXRpYyBFc3RpbWF0ZWRIaXN0b2dyYW0gZGVmYXVsdFBhcnRpdGlvblNpemVIaXN0b2dyYW0oKQogICAgIHsKLSAgICAgICAgLy8gRUggb2YgMTUwIGNhbiB0cmFjayBhIG1heCB2YWx1ZSBvZiAxNjk3ODA2NDk1MTgzLCBpLmUuLCA+IDEuNVBCCi0gICAgICAgIHJldHVybiBuZXcgRXN0aW1hdGVkSGlzdG9ncmFtKDE1MCk7CisgICAgICAgIC8vIEVIIG9mIDE1NSBjYW4gdHJhY2sgYSBtYXggdmFsdWUgb2YgMzUyMDU3MTU0ODQxMiBpLmUuIDMuNVRCCisgICAgICAgIHJldHVybiBuZXcgRXN0aW1hdGVkSGlzdG9ncmFtKDE1NSk7CisKICAgICB9CiAKICAgICBzdGF0aWMgVG9tYnN0b25lSGlzdG9ncmFtIGRlZmF1bHRUb21ic3RvbmVEcm9wVGltZUhpc3RvZ3JhbSgpCkBAIC04MSwxNSArODksMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PX0NPTVBSRVNTSU9OX1JBVElPLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFRvbWJzdG9uZURyb3BUaW1lSGlzdG9ncmFtKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuPEJ5dGVCdWZmZXI+ZW1wdHlMaXN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy48Qnl0ZUJ1ZmZlcj5lbXB0eUxpc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2UuQUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2ZVJlcGFpclNlcnZpY2UuVU5SRVBBSVJFRF9TU1RBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUik7CiAgICAgfQogCiAgICAgcHJvdGVjdGVkIEVzdGltYXRlZEhpc3RvZ3JhbSBlc3RpbWF0ZWRQYXJ0aXRpb25TaXplID0gZGVmYXVsdFBhcnRpdGlvblNpemVIaXN0b2dyYW0oKTsKQEAgLTEwMiw5ICsxMTMsMjUgQEAKICAgICBwcm90ZWN0ZWQgZG91YmxlIGNvbXByZXNzaW9uUmF0aW8gPSBOT19DT01QUkVTU0lPTl9SQVRJTzsKICAgICBwcm90ZWN0ZWQgU3RyZWFtaW5nVG9tYnN0b25lSGlzdG9ncmFtQnVpbGRlciBlc3RpbWF0ZWRUb21ic3RvbmVEcm9wVGltZSA9IG5ldyBTdHJlYW1pbmdUb21ic3RvbmVIaXN0b2dyYW1CdWlsZGVyKFNTVGFibGUuVE9NQlNUT05FX0hJU1RPR1JBTV9CSU5fU0laRSwgU1NUYWJsZS5UT01CU1RPTkVfSElTVE9HUkFNX1NQT09MX1NJWkUsIFNTVGFibGUuVE9NQlNUT05FX0hJU1RPR1JBTV9UVExfUk9VTkRfU0VDT05EUyk7CiAgICAgcHJvdGVjdGVkIGludCBzc3RhYmxlTGV2ZWw7Ci0gICAgcHJpdmF0ZSBDbHVzdGVyaW5nUHJlZml4PD8+IG1pbkNsdXN0ZXJpbmcgPSBudWxsOwotICAgIHByaXZhdGUgQ2x1c3RlcmluZ1ByZWZpeDw/PiBtYXhDbHVzdGVyaW5nID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIFRoZSBzbWFsbGVzdCBjbHVzdGVyaW5nIHByZWZpeCBmb3IgYW55IHtAbGluayBVbmZpbHRlcmVkfSBpbiB0aGUgc3N0YWJsZS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgaXMgYWx3YXlzIGVpdGhlciBhIENsdXN0ZXJpbmcsIG9yIGEgc3RhcnQgYm91bmQgKHNpbmNlIGZvciBhbnkgZW5kIHJhbmdlIHRvbWJzdG9uZSBib3VuZCwgdGhlcmUgc2hvdWxkCisgICAgICogYmUgYSBjb3JyZXNwb25kaW5nIHN0YXJ0IGJvdW5kIHRoYXQgaXMgc21hbGxlcikuCisgICAgICovCisgICAgcHJpdmF0ZSBDbHVzdGVyaW5nUHJlZml4PD8+IG1pbkNsdXN0ZXJpbmcgPSBDbHVzdGVyaW5nQm91bmQuTUFYX1NUQVJUOworICAgIC8qKgorICAgICAqIFRoZSBsYXJnZXN0IGNsdXN0ZXJpbmcgcHJlZml4IGZvciBhbnkge0BsaW5rIFVuZmlsdGVyZWR9IGluIHRoZSBzc3RhYmxlLgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBhbHdheXMgZWl0aGVyIGEgQ2x1c3RlcmluZywgb3IgYW4gZW5kIGJvdW5kIChzaW5jZSBmb3IgYW55IHN0YXJ0IHJhbmdlIHRvbWJzdG9uZSBib3VuZCwgdGhlcmUgc2hvdWxkCisgICAgICogYmUgYSBjb3JyZXNwb25kaW5nIGVuZCBib3VuZCB0aGF0IGlzIGJpZ2dlcikuCisgICAgICovCisgICAgcHJpdmF0ZSBDbHVzdGVyaW5nUHJlZml4PD8+IG1heENsdXN0ZXJpbmcgPSBDbHVzdGVyaW5nQm91bmQuTUlOX0VORDsKKyAgICBwcml2YXRlIGJvb2xlYW4gY2x1c3RlcmluZ0luaXRpYWxpemVkID0gZmFsc2U7CisKICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMZWdhY3lDb3VudGVyU2hhcmRzID0gZmFsc2U7CisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zID0gZmFsc2U7CiAgICAgcHJvdGVjdGVkIGxvbmcgdG90YWxDb2x1bW5zU2V0OwogICAgIHByb3RlY3RlZCBsb25nIHRvdGFsUm93czsKICAgICBwdWJsaWMgaW50IHRvdGFsVG9tYnN0b25lczsKQEAgLTE2OSw2ICsxOTYsMTMgQEAKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCisgICAgcHVibGljIE1ldGFkYXRhQ29sbGVjdG9yIGFkZENlbGxQZXJQYXJ0aXRpb25Db3VudCgpCisgICAgeworICAgICAgICBlc3RpbWF0ZWRDZWxsUGVyUGFydGl0aW9uQ291bnQuYWRkKGN1cnJlbnRQYXJ0aXRpb25DZWxscyk7CisgICAgICAgIGN1cnJlbnRQYXJ0aXRpb25DZWxscyA9IDA7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJhdGlvIGlzIGNvbXByZXNzZWQvdW5jb21wcmVzc2VkIGFuZCBpdCBpcwogICAgICAqIGlmIHlvdSBoYXZlIDEueCB0aGVuIGNvbXByZXNzaW9uIGlzbid0IGhlbHBpbmcKQEAgLTE5Myw2ICsyMjcsNyBAQAogCiAgICAgcHVibGljIHZvaWQgdXBkYXRlKENlbGw8Pz4gY2VsbCkKICAgICB7CisgICAgICAgICsrY3VycmVudFBhcnRpdGlvbkNlbGxzOwogICAgICAgICB1cGRhdGVUaW1lc3RhbXAoY2VsbC50aW1lc3RhbXAoKSk7CiAgICAgICAgIHVwZGF0ZVRUTChjZWxsLnR0bCgpKTsKICAgICAgICAgdXBkYXRlTG9jYWxEZWxldGlvblRpbWUoY2VsbC5sb2NhbERlbGV0aW9uVGltZSgpKTsKQEAgLTIwMCw2ICsyMzUsMTMgQEAKICAgICAgICAgICAgIHVwZGF0ZVRvbWJzdG9uZUNvdW50KCk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgdXBkYXRlUGFydGl0aW9uRGVsZXRpb24oRGVsZXRpb25UaW1lIGR0KQorICAgIHsKKyAgICAgICAgaWYgKCFkdC5pc0xpdmUoKSkKKyAgICAgICAgICAgIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zID0gdHJ1ZTsKKyAgICAgICAgdXBkYXRlKGR0KTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB1cGRhdGUoRGVsZXRpb25UaW1lIGR0KQogICAgIHsKICAgICAgICAgaWYgKCFkdC5pc0xpdmUoKSkKQEAgLTI1MCwxMSArMjkyLDU0IEBACiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAotICAgIHB1YmxpYyBNZXRhZGF0YUNvbGxlY3RvciB1cGRhdGVDbHVzdGVyaW5nVmFsdWVzKENsdXN0ZXJpbmdQcmVmaXg8Pz4gY2x1c3RlcmluZykKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVDbHVzdGVyaW5nVmFsdWVzKENsdXN0ZXJpbmc8Pz4gY2x1c3RlcmluZykKICAgICB7Ci0gICAgICAgIG1pbkNsdXN0ZXJpbmcgPSBtaW5DbHVzdGVyaW5nID09IG51bGwgfHwgY29tcGFyYXRvci5jb21wYXJlKGNsdXN0ZXJpbmcsIG1pbkNsdXN0ZXJpbmcpIDwgMCA/IGNsdXN0ZXJpbmcubWluaW1pemUoKSA6IG1pbkNsdXN0ZXJpbmc7Ci0gICAgICAgIG1heENsdXN0ZXJpbmcgPSBtYXhDbHVzdGVyaW5nID09IG51bGwgfHwgY29tcGFyYXRvci5jb21wYXJlKGNsdXN0ZXJpbmcsIG1heENsdXN0ZXJpbmcpID4gMCA/IGNsdXN0ZXJpbmcubWluaW1pemUoKSA6IG1heENsdXN0ZXJpbmc7Ci0gICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBpZiAoY2x1c3RlcmluZyA9PSBDbHVzdGVyaW5nLlNUQVRJQ19DTFVTVEVSSU5HKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIEluIGNhc2Ugb2YgbW9ub3RvbmljYWxseSBncm93aW5nIHN0cmVhbSBvZiBjbHVzdGVyaW5ncywgd2Ugd2lsbCB1c3VhbGx5IHJlcXVpcmUgb25seSBvbmUgY29tcGFyaXNvbgorICAgICAgICAvLyBiZWNhdXNlIGlmIHdlIGRldGVjdGVkIFggaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IE1BWCwgdGhlbiBpdCBjYW5ub3QgYmUgbG93ZXIgdGhhbiB0aGUgY3VycmVudCBNSU4KKyAgICAgICAgLy8gYXQgdGhlIHNhbWUgdGltZS4gVGhlIG9ubHkgY2FzZSB3aGVuIHdlIG5lZWQgdG8gdXBkYXRlIE1JTiB3aGVuIHRoZSBjdXJyZW50IE1BWCB3YXMgZGV0ZWN0ZWQgdG8gYmUgdXBkYXRlZAorICAgICAgICAvLyBpcyB0aGUgY2FzZSB3aGVuIE1JTiB3YXMgbm90IHlldCBpbml0aWFsaXplZCBhbmQgc3RpbGwgcG9pbnQgdGhlIENsdXN0ZXJpbmdCb3VuZC5NQVhfU1RBUlQKKyAgICAgICAgaWYgKGNvbXBhcmF0b3IuY29tcGFyZShjbHVzdGVyaW5nLCBtYXhDbHVzdGVyaW5nKSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heENsdXN0ZXJpbmcgPSBjbHVzdGVyaW5nOworICAgICAgICAgICAgaWYgKG1pbkNsdXN0ZXJpbmcgPT0gQ2x1c3RlcmluZ0JvdW5kLk1BWF9TVEFSVCkKKyAgICAgICAgICAgICAgICBtaW5DbHVzdGVyaW5nID0gY2x1c3RlcmluZzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjb21wYXJhdG9yLmNvbXBhcmUoY2x1c3RlcmluZywgbWluQ2x1c3RlcmluZykgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBtaW5DbHVzdGVyaW5nID0gY2x1c3RlcmluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNsdXN0ZXJpbmdWYWx1ZXNCeUJvdW5kT3JCb3VuZGFyeShDbHVzdGVyaW5nQm91bmRPckJvdW5kYXJ5PD8+IGNsdXN0ZXJpbmdCb3VuZE9yQm91bmRhcnkpCisgICAgeworICAgICAgICAvLyBJbiBhIFNTVGFibGUsIGV2ZXJ5IG9wZW5pbmcgbWFya2VyIHdpbGwgYmUgY2xvc2VkLCBzbyB0aGUgc3RhcnQgb2YgYSByYW5nZSB0b21ic3RvbmUgbWFya2VyIHdpbGwgbmV2ZXIgYmUKKyAgICAgICAgLy8gdGhlIG1heENsdXN0ZXJpbmcgKHRoZSBjb3JyZXNwb25kaW5nIGNsb3NlIG1pZ2h0IHRob3VnaCkgYW5kIHRoZXJlIGlzIG5vIHBvaW50IGluIGRvaW5nIHRoZSBjb21wYXJpc29uCisgICAgICAgIC8vIChhbmQgdmljZS12ZXJzYSBmb3IgdGhlIGNsb3NlKS4gQnkgdGhlIHNhbWUgcmVhc29uaW5nLCBhIGJvdW5kYXJ5IHdpbGwgbmV2ZXIgYmUgZWl0aGVyIHRoZSBtaW4gb3IgbWF4CisgICAgICAgIC8vIGNsdXN0ZXJpbmcsIGFuZCB3ZSBjYW4gc2F2ZSBvbiBjb21wYXJpc29ucy4KKyAgICAgICAgaWYgKGNsdXN0ZXJpbmdCb3VuZE9yQm91bmRhcnkuaXNCb3VuZGFyeSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIHNlZSB0aGUgY29tbWVudCBpbiB1cGRhdGVDbHVzdGVyaW5nVmFsdWVzKENsdXN0ZXJpbmcpCisgICAgICAgIGlmIChjb21wYXJhdG9yLmNvbXBhcmUoY2x1c3RlcmluZ0JvdW5kT3JCb3VuZGFyeSwgbWF4Q2x1c3RlcmluZykgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2x1c3RlcmluZ0JvdW5kT3JCb3VuZGFyeS5raW5kKCkuaXNFbmQoKSkKKyAgICAgICAgICAgICAgICBtYXhDbHVzdGVyaW5nID0gY2x1c3RlcmluZ0JvdW5kT3JCb3VuZGFyeTsKKworICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHNpbmNlIHdlIGV4Y2x1ZGVkIGJvdW5kYXJpZXMgYWJvdmUsIHRoZXJlIGlzIG5vIHdheSB0aGF0IHRoZSBwcm92aWRlZCBjbHVzdGVyaW5nIHByZWZpeCBpcworICAgICAgICAgICAgLy8gYSBzdGFydCBhbmQgZW4gZW5kIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAgICAgICAgIGVsc2UgaWYgKG1pbkNsdXN0ZXJpbmcgPT0gQ2x1c3RlcmluZ0JvdW5kLk1BWF9TVEFSVCkKKyAgICAgICAgICAgICAgICBtaW5DbHVzdGVyaW5nID0gY2x1c3RlcmluZ0JvdW5kT3JCb3VuZGFyeTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjb21wYXJhdG9yLmNvbXBhcmUoY2x1c3RlcmluZ0JvdW5kT3JCb3VuZGFyeSwgbWluQ2x1c3RlcmluZykgPCAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2x1c3RlcmluZ0JvdW5kT3JCb3VuZGFyeS5raW5kKCkuaXNTdGFydCgpKQorICAgICAgICAgICAgICAgIG1pbkNsdXN0ZXJpbmcgPSBjbHVzdGVyaW5nQm91bmRPckJvdW5kYXJ5OworICAgICAgICAgICAgZWxzZSBpZiAobWF4Q2x1c3RlcmluZyA9PSBDbHVzdGVyaW5nQm91bmQuTUlOX0VORCkKKyAgICAgICAgICAgICAgICBtYXhDbHVzdGVyaW5nID0gY2x1c3RlcmluZ0JvdW5kT3JCb3VuZGFyeTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUhhc0xlZ2FjeUNvdW50ZXJTaGFyZHMoYm9vbGVhbiBoYXNMZWdhY3lDb3VudGVyU2hhcmRzKQpAQCAtMjYyLDEyICszNDcsMTEgQEAKICAgICAgICAgdGhpcy5oYXNMZWdhY3lDb3VudGVyU2hhcmRzID0gdGhpcy5oYXNMZWdhY3lDb3VudGVyU2hhcmRzIHx8IGhhc0xlZ2FjeUNvdW50ZXJTaGFyZHM7CiAgICAgfQogCi0gICAgcHVibGljIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBmaW5hbGl6ZU1ldGFkYXRhKFN0cmluZyBwYXJ0aXRpb25lciwgZG91YmxlIGJsb29tRmlsdGVyRlBDaGFuY2UsIGxvbmcgcmVwYWlyZWRBdCwgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwgYm9vbGVhbiBpc1RyYW5zaWVudCwgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIpCisgICAgcHVibGljIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBmaW5hbGl6ZU1ldGFkYXRhKFN0cmluZyBwYXJ0aXRpb25lciwgZG91YmxlIGJsb29tRmlsdGVyRlBDaGFuY2UsIGxvbmcgcmVwYWlyZWRBdCwgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwgYm9vbGVhbiBpc1RyYW5zaWVudCwgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIsIEJ5dGVCdWZmZXIgZmlyc3RLZXksIEJ5dGVCdWZmZXIgbGFzdEtleSkKICAgICB7Ci0gICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZSgobWluQ2x1c3RlcmluZyA9PSBudWxsICYmIG1heENsdXN0ZXJpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNvbXBhcmF0b3IuY29tcGFyZShtYXhDbHVzdGVyaW5nLCBtaW5DbHVzdGVyaW5nKSA+PSAwKTsKLSAgICAgICAgQnl0ZUJ1ZmZlcltdIG1pblZhbHVlcyA9IG1pbkNsdXN0ZXJpbmcgIT0gbnVsbCA/IG1pbkNsdXN0ZXJpbmcuZ2V0QnVmZmVyQXJyYXkoKSA6IEVNUFRZX0NMVVNURVJJTkc7Ci0gICAgICAgIEJ5dGVCdWZmZXJbXSBtYXhWYWx1ZXMgPSBtYXhDbHVzdGVyaW5nICE9IG51bGwgPyBtYXhDbHVzdGVyaW5nLmdldEJ1ZmZlckFycmF5KCkgOiBFTVBUWV9DTFVTVEVSSU5HOworICAgICAgICBhc3NlcnQgbWluQ2x1c3RlcmluZy5raW5kKCkgPT0gQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkNMVVNURVJJTkcgfHwgbWluQ2x1c3RlcmluZy5raW5kKCkuaXNTdGFydCgpOworICAgICAgICBhc3NlcnQgbWF4Q2x1c3RlcmluZy5raW5kKCkgPT0gQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkNMVVNURVJJTkcgfHwgbWF4Q2x1c3RlcmluZy5raW5kKCkuaXNFbmQoKTsKKwogICAgICAgICBNYXA8TWV0YWRhdGFUeXBlLCBNZXRhZGF0YUNvbXBvbmVudD4gY29tcG9uZW50cyA9IG5ldyBFbnVtTWFwPD4oTWV0YWRhdGFUeXBlLmNsYXNzKTsKICAgICAgICAgY29tcG9uZW50cy5wdXQoTWV0YWRhdGFUeXBlLlZBTElEQVRJT04sIG5ldyBWYWxpZGF0aW9uTWV0YWRhdGEocGFydGl0aW9uZXIsIGJsb29tRmlsdGVyRlBDaGFuY2UpKTsKICAgICAgICAgY29tcG9uZW50cy5wdXQoTWV0YWRhdGFUeXBlLlNUQVRTLCBuZXcgU3RhdHNNZXRhZGF0YShlc3RpbWF0ZWRQYXJ0aXRpb25TaXplLApAQCAtMjgyLDE1ICszNjYsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblJhdGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZFRvbWJzdG9uZURyb3BUaW1lLmJ1aWxkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VMaXN0KG1pblZhbHVlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZUxpc3QobWF4VmFsdWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yLnN1YnR5cGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2UubWFrZShtaW5DbHVzdGVyaW5nLnJldGFpbmFibGUoKS5hc1N0YXJ0Qm91bmQoKSwgbWF4Q2x1c3RlcmluZy5yZXRhaW5hYmxlKCkuYXNFbmRCb3VuZCgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNMZWdhY3lDb3VudGVyU2hhcmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGFpcmVkQXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxDb2x1bW5zU2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUm93cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hdGluZ0hvc3RJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVHJhbnNpZW50KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNUcmFuc2llbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEtleSkpOwogICAgICAgICBjb21wb25lbnRzLnB1dChNZXRhZGF0YVR5cGUuQ09NUEFDVElPTiwgbmV3IENvbXBhY3Rpb25NZXRhZGF0YShjYXJkaW5hbGl0eSkpOwogICAgICAgICBjb21wb25lbnRzLnB1dChNZXRhZGF0YVR5cGUuSEVBREVSLCBoZWFkZXIudG9Db21wb25lbnQoKSk7CiAgICAgICAgIHJldHVybiBjb21wb25lbnRzOwpAQCAtMzA0LDE4ICszOTEsNiBAQAogICAgICAgICBlc3RpbWF0ZWRUb21ic3RvbmVEcm9wVGltZS5yZWxlYXNlQnVmZmVycygpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWFrZUxpc3QoQnl0ZUJ1ZmZlcltdIHZhbHVlcykKLSAgICB7Ci0gICAgICAgIC8vIEluIG1vc3QgY2FzZSwgbCB3aWxsIGJlIHRoZSBzYW1lIHNpemUgdGhhbiB2YWx1ZXMsIGJ1dCBpdCdzIHBvc3NpYmxlIGZvciBpdCB0byBiZSBzbWFsbGVyCi0gICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gbCA9IG5ldyBBcnJheUxpc3Q8Qnl0ZUJ1ZmZlcj4odmFsdWVzLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgaWYgKHZhbHVlc1tpXSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGwuYWRkKHZhbHVlc1tpXSk7Ci0gICAgICAgIHJldHVybiBsOwotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWluTWF4TG9uZ1RyYWNrZXIKICAgICB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBkZWZhdWx0TWluOwpAQCAtNDA5LDQgKzQ4NCw0IEBACiAgICAgICAgICAgICByZXR1cm4gaXNTZXQgPyBtYXggOiBkZWZhdWx0TWF4OwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvbWV0YWRhdGEvTWV0YWRhdGFTZXJpYWxpemVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL21ldGFkYXRhL01ldGFkYXRhU2VyaWFsaXplci5qYXZhCmluZGV4IGYxM2RhYTQuLjVlY2I1ODIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvbWV0YWRhdGEvTWV0YWRhdGFTZXJpYWxpemVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9tZXRhZGF0YS9NZXRhZGF0YVNlcmlhbGl6ZXIuamF2YQpAQCAtMTcsMjUgKzE3LDMzIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuKjsKLQogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlVuYXJ5T3BlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLnppcC5DUkMzMjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwotCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXMudXBkYXRlQ2hlY2tzdW1JbnQ7CkBAIC0xMTMsNyArMTIxLDcgQEAKICAgICB7CiAgICAgICAgIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBjb21wb25lbnRzOwogICAgICAgICBsb2dnZXIudHJhY2UoIkxvYWQgbWV0YWRhdGEgZm9yIHt9IiwgZGVzY3JpcHRvcik7Ci0gICAgICAgIEZpbGUgc3RhdHNGaWxlID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuU1RBVFMpKTsKKyAgICAgICAgRmlsZSBzdGF0c0ZpbGUgPSBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUyk7CiAgICAgICAgIGlmICghc3RhdHNGaWxlLmV4aXN0cygpKQogICAgICAgICB7CiAgICAgICAgICAgICBsb2dnZXIudHJhY2UoIk5vIHNzdGFibGUgc3RhdHMgZm9yIHt9IiwgZGVzY3JpcHRvcik7CkBAIC0yMTMsOCArMjIxLDggQEAKIAogICAgICAgICBpZiAoYWN0dWFsQ2hlY2tzdW0gIT0gZXhwZWN0ZWRDaGVja3N1bSkKICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuU1RBVFMpOwotICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKG5ldyBJT0V4Y2VwdGlvbigiQ2hlY2tzdW1zIGRvIG5vdCBtYXRjaCBmb3IgIiArIGZpbGVuYW1lKSwgZmlsZW5hbWUpOworICAgICAgICAgICAgRmlsZSBmaWxlID0gZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1RBVFMpOworICAgICAgICAgICAgdGhyb3cgbmV3IENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uKG5ldyBJT0V4Y2VwdGlvbigiQ2hlY2tzdW1zIGRvIG5vdCBtYXRjaCBmb3IgIiArIGZpbGUpLCBmaWxlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjIyLDcgKzIzMCw3IEBACiAgICAgcHVibGljIHZvaWQgbXV0YXRlKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgU3RyaW5nIGRlc2NyaXB0aW9uLCBVbmFyeU9wZXJhdG9yPFN0YXRzTWV0YWRhdGE+IHRyYW5zZm9ybSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpZiAobG9nZ2VyLmlzVHJhY2VFbmFibGVkKCkgKQotICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJNdXRhdGluZyB7fSB0byB7fSIsIGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKSwgZGVzY3JpcHRpb24pOworICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJNdXRhdGluZyB7fSB0byB7fSIsIGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlNUQVRTKSwgZGVzY3JpcHRpb24pOwogCiAgICAgICAgIG11dGF0ZShkZXNjcmlwdG9yLCB0cmFuc2Zvcm0pOwogICAgIH0KQEAgLTIzMSw3ICsyMzksNyBAQAogICAgIHB1YmxpYyB2b2lkIG11dGF0ZUxldmVsKERlc2NyaXB0b3IgZGVzY3JpcHRvciwgaW50IG5ld0xldmVsKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKLSAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiTXV0YXRpbmcge30gdG8gbGV2ZWwge30iLCBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVEFUUyksIG5ld0xldmVsKTsKKyAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiTXV0YXRpbmcge30gdG8gbGV2ZWwge30iLCBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUyksIG5ld0xldmVsKTsKIAogICAgICAgICBtdXRhdGUoZGVzY3JpcHRvciwgc3RhdHMgLT4gc3RhdHMubXV0YXRlTGV2ZWwobmV3TGV2ZWwpKTsKICAgICB9CkBAIC0yNDEsNyArMjQ5LDcgQEAKICAgICB7CiAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiTXV0YXRpbmcge30gdG8gcmVwYWlyZWRBdCB0aW1lIHt9IGFuZCBwZW5kaW5nUmVwYWlyIHt9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVEFUUyksIG5ld1JlcGFpcmVkQXQsIG5ld1BlbmRpbmdSZXBhaXIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlNUQVRTKSwgbmV3UmVwYWlyZWRBdCwgbmV3UGVuZGluZ1JlcGFpcik7CiAKICAgICAgICAgbXV0YXRlKGRlc2NyaXB0b3IsIHN0YXRzIC0+IHN0YXRzLm11dGF0ZVJlcGFpcmVkTWV0YWRhdGEobmV3UmVwYWlyZWRBdCwgbmV3UGVuZGluZ1JlcGFpciwgaXNUcmFuc2llbnQpKTsKICAgICB9CkBAIC0yNTcsOCArMjY1LDggQEAKIAogICAgIHB1YmxpYyB2b2lkIHJld3JpdGVTU1RhYmxlTWV0YWRhdGEoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBNYXA8TWV0YWRhdGFUeXBlLCBNZXRhZGF0YUNvbXBvbmVudD4gY3VycmVudENvbXBvbmVudHMpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gZGVzY3JpcHRvci50bXBGaWxlbmFtZUZvcihDb21wb25lbnQuU1RBVFMpOwotICAgICAgICB0cnkgKERhdGFPdXRwdXRTdHJlYW1QbHVzIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtUGx1cyhmaWxlUGF0aCkpCisgICAgICAgIEZpbGUgZmlsZSA9IGRlc2NyaXB0b3IudG1wRmlsZUZvcihDb21wb25lbnRzLlNUQVRTKTsKKyAgICAgICAgdHJ5IChEYXRhT3V0cHV0U3RyZWFtUGx1cyBvdXQgPSBmaWxlLm5ld091dHB1dFN0cmVhbShGaWxlLldyaXRlTW9kZS5PVkVSV1JJVEUpKQogICAgICAgICB7CiAgICAgICAgICAgICBzZXJpYWxpemUoY3VycmVudENvbXBvbmVudHMsIG91dCwgZGVzY3JpcHRvci52ZXJzaW9uKTsKICAgICAgICAgICAgIG91dC5mbHVzaCgpOwpAQCAtMjY2LDggKzI3NCw4IEBACiAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQogICAgICAgICB7CiAgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZJbnN0YW5jZU9mKGUsIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbi5jbGFzcyk7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIGZpbGVQYXRoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IoZSwgZmlsZSk7CiAgICAgICAgIH0KLSAgICAgICAgRmlsZVV0aWxzLnJlbmFtZVdpdGhDb25maXJtKGZpbGVQYXRoLCBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVEFUUykpOworICAgICAgICBmaWxlLm1vdmUoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1RBVFMpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL21ldGFkYXRhL1N0YXRzTWV0YWRhdGEuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvbWV0YWRhdGEvU3RhdHNNZXRhZGF0YS5qYXZhCmluZGV4IGVlNTUwNWYuLmRiODA3NmQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvbWV0YWRhdGEvU3RhdHNNZXRhZGF0YS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvbWV0YWRhdGEvU3RhdHNNZXRhZGF0YS5qYXZhCkBAIC0xOSwyOCArMTksMzQgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLkFycmF5VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuRXF1YWxzQnVpbGRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5IYXNoQ29kZUJ1aWxkZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRW5jb2RpbmdTdGF0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5CdWZmZXJDbHVzdGVyaW5nQm91bmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nUG9zaXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkludGVydmFsU2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ2VsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uSVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5BYnN0cmFjdFR5cGVTZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5zdHJlYW1oaXN0LlRvbWJzdG9uZUhpc3RvZ3JhbTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5VVUlEU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5zdHJlYW1oaXN0LlRvbWJzdG9uZUhpc3RvZ3JhbTsKIAogLyoqCiAgKiBTU1RhYmxlIG1ldGFkYXRhIHRoYXQgYWx3YXlzIHN0YXkgb24gaGVhcC4KQEAgLTYyLDggKzY4LDcgQEAKICAgICBwdWJsaWMgZmluYWwgZG91YmxlIGNvbXByZXNzaW9uUmF0aW87CiAgICAgcHVibGljIGZpbmFsIFRvbWJzdG9uZUhpc3RvZ3JhbSBlc3RpbWF0ZWRUb21ic3RvbmVEcm9wVGltZTsKICAgICBwdWJsaWMgZmluYWwgaW50IHNzdGFibGVMZXZlbDsKLSAgICBwdWJsaWMgZmluYWwgTGlzdDxCeXRlQnVmZmVyPiBtaW5DbHVzdGVyaW5nVmFsdWVzOwotICAgIHB1YmxpYyBmaW5hbCBMaXN0PEJ5dGVCdWZmZXI+IG1heENsdXN0ZXJpbmdWYWx1ZXM7CisgICAgcHVibGljIGZpbmFsIFNsaWNlIGNvdmVyZWRDbHVzdGVyaW5nOwogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0xlZ2FjeUNvdW50ZXJTaGFyZHM7CiAgICAgcHVibGljIGZpbmFsIGxvbmcgcmVwYWlyZWRBdDsKICAgICBwdWJsaWMgZmluYWwgbG9uZyB0b3RhbENvbHVtbnNTZXQ7CkBAIC03NCw2ICs3OSwyMyBAQAogICAgIC8vIGp1c3QgaG9sZHMgdGhlIGN1cnJlbnQgZW5jb2Rpbmcgc3RhdHMgdG8gYXZvaWQgYWxsb2NhdGluZyAtIGl0IGlzIG5vdCBzZXJpYWxpemVkCiAgICAgcHVibGljIGZpbmFsIEVuY29kaW5nU3RhdHMgZW5jb2RpbmdTdGF0czsKIAorICAgIC8vIFVzZWQgdG8gc2VyaWFsaXplIG1pbi9tYXggY2x1c3RlcmluZy4gQ2FuIGJlIG51bGwgaWYgdGhlIG1ldGFkYXRhIHdhcyBkZXNlcmlhbGl6ZWQgZnJvbSBhIGxlZ2FjeSB2ZXJzaW9uCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gY2x1c3RlcmluZ1R5cGVzOworCisgICAgLyoqCisgICAgICogVGhpcyBib29sZWFuIGlzIHVzZWQgYXMgYW4gYXBwcm94aW1hdGlvbiBvZiB3aGV0aGVyIGEgZ2l2ZW4ga2V5IGNhbiBiZSBndWFyYW50ZWVkIG5vdCB0byBoYXZlIHBhcnRpdGlvbgorICAgICAqIGRlbGV0aW9ucyBpbiB0aGlzIHNzdGFibGUuIE9idmlvdXNseSwgdGhpcyBpcyBwcmV0dHkgaW1wcmVjaXNlOiBhIHNpbmdsZSBwYXJ0aXRpb24gZGVsZXRpb24gaW4gdGhlIHNzdGFibGUKKyAgICAgKiBtZWFucyB3ZSBoYXZlIHRvIGFzc3VtZSBfYW55XyBrZXkgbWF5IGhhdmUgYSBwYXJ0aXRpb24gZGVsZXRpb24uIFRoaXMgaXMgc3RpbGwgbGlrZWx5IHVzZWZ1bCBhcyB3b3JrbG9hZHMgdGhhdAorICAgICAqIGRvZXMgbm90IHVzZSBwYXJ0aXRpb24gbGV2ZWwgZGVsZXRpb25zLCBvciBvbmx5IHZlcnkgcmFyZWx5LCBhcmUgcHJvYmFibHkgbm90IHRoYXQgcmFyZS4KKyAgICAgKiBUT0RPIHdlIGNvdWxkIHJlcGxhY2UgdGhpcyBieSBhIHNtYWxsIGJsb29tLWZpbHRlciBpbnN0ZWFkOyB0aGUgb25seSBkb3duc2lkZSBiZWluZyB0aGF0IHdlJ2QgaGF2ZSB0byBjYXJlIGFib3V0CisgICAgICogIHRoZSBzaXplIG9mIHRoaXMgYmxvb20gZmlsdGVycyBub3QgZ2V0dGluZyBvdXQgb2YgaGFuZHMsIGFuZCBpdCdzIGEgdGlueSBiaXQgdW5jbGVhciBpZiBpdCdzIHdvcnRoIHRoZSBhZGRlZAorICAgICAqICBjb21wbGV4aXR5LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zOworCisgICAgcHVibGljIGZpbmFsIEJ5dGVCdWZmZXIgZmlyc3RLZXk7CisgICAgcHVibGljIGZpbmFsIEJ5dGVCdWZmZXIgbGFzdEtleTsKKwogICAgIHB1YmxpYyBTdGF0c01ldGFkYXRhKEVzdGltYXRlZEhpc3RvZ3JhbSBlc3RpbWF0ZWRQYXJ0aXRpb25TaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgIEVzdGltYXRlZEhpc3RvZ3JhbSBlc3RpbWF0ZWRDZWxsUGVyUGFydGl0aW9uQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJ2YWxTZXQ8Q29tbWl0TG9nUG9zaXRpb24+IGNvbW1pdExvZ0ludGVydmFscywKQEAgLTg2LDE1ICsxMDgsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29tcHJlc3Npb25SYXRpbywKICAgICAgICAgICAgICAgICAgICAgICAgICBUb21ic3RvbmVIaXN0b2dyYW0gZXN0aW1hdGVkVG9tYnN0b25lRHJvcFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNzdGFibGVMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IG1pbkNsdXN0ZXJpbmdWYWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBtYXhDbHVzdGVyaW5nVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBjbHVzdGVyaW5nVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2UgY292ZXJlZENsdXN0ZXJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBoYXNMZWdhY3lDb3VudGVyU2hhcmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcmVwYWlyZWRBdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRvdGFsQ29sdW1uc1NldCwKICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHRvdGFsUm93cywKICAgICAgICAgICAgICAgICAgICAgICAgICBVVUlEIG9yaWdpbmF0aW5nSG9zdElkLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVVUlEIHBlbmRpbmdSZXBhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1RyYW5zaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzVHJhbnNpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBmaXJzdEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGxhc3RLZXkpCiAgICAgewogICAgICAgICB0aGlzLmVzdGltYXRlZFBhcnRpdGlvblNpemUgPSBlc3RpbWF0ZWRQYXJ0aXRpb25TaXplOwogICAgICAgICB0aGlzLmVzdGltYXRlZENlbGxQZXJQYXJ0aXRpb25Db3VudCA9IGVzdGltYXRlZENlbGxQZXJQYXJ0aXRpb25Db3VudDsKQEAgLTEwOCw4ICsxMzMsOCBAQAogICAgICAgICB0aGlzLmNvbXByZXNzaW9uUmF0aW8gPSBjb21wcmVzc2lvblJhdGlvOwogICAgICAgICB0aGlzLmVzdGltYXRlZFRvbWJzdG9uZURyb3BUaW1lID0gZXN0aW1hdGVkVG9tYnN0b25lRHJvcFRpbWU7CiAgICAgICAgIHRoaXMuc3N0YWJsZUxldmVsID0gc3N0YWJsZUxldmVsOwotICAgICAgICB0aGlzLm1pbkNsdXN0ZXJpbmdWYWx1ZXMgPSBtaW5DbHVzdGVyaW5nVmFsdWVzOwotICAgICAgICB0aGlzLm1heENsdXN0ZXJpbmdWYWx1ZXMgPSBtYXhDbHVzdGVyaW5nVmFsdWVzOworICAgICAgICB0aGlzLmNsdXN0ZXJpbmdUeXBlcyA9IGNsdXN0ZXJpbmdUeXBlczsKKyAgICAgICAgdGhpcy5jb3ZlcmVkQ2x1c3RlcmluZyA9IGNvdmVyZWRDbHVzdGVyaW5nOwogICAgICAgICB0aGlzLmhhc0xlZ2FjeUNvdW50ZXJTaGFyZHMgPSBoYXNMZWdhY3lDb3VudGVyU2hhcmRzOwogICAgICAgICB0aGlzLnJlcGFpcmVkQXQgPSByZXBhaXJlZEF0OwogICAgICAgICB0aGlzLnRvdGFsQ29sdW1uc1NldCA9IHRvdGFsQ29sdW1uc1NldDsKQEAgLTExOCw2ICsxNDMsOSBAQAogICAgICAgICB0aGlzLnBlbmRpbmdSZXBhaXIgPSBwZW5kaW5nUmVwYWlyOwogICAgICAgICB0aGlzLmlzVHJhbnNpZW50ID0gaXNUcmFuc2llbnQ7CiAgICAgICAgIHRoaXMuZW5jb2RpbmdTdGF0cyA9IG5ldyBFbmNvZGluZ1N0YXRzKG1pblRpbWVzdGFtcCwgbWluTG9jYWxEZWxldGlvblRpbWUsIG1pblRUTCk7CisgICAgICAgIHRoaXMuaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMgPSBoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9uczsKKyAgICAgICAgdGhpcy5maXJzdEtleSA9IGZpcnN0S2V5OworICAgICAgICB0aGlzLmxhc3RLZXkgPSBsYXN0S2V5OwogICAgIH0KIAogICAgIHB1YmxpYyBNZXRhZGF0YVR5cGUgZ2V0VHlwZSgpCkBAIC0xNjMsMTUgKzE5MSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25SYXRpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZFRvbWJzdG9uZURyb3BUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5DbHVzdGVyaW5nVmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q2x1c3RlcmluZ1ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyZWRDbHVzdGVyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTGVnYWN5Q291bnRlclNoYXJkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGFpcmVkQXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbENvbHVtbnNTZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFJvd3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hdGluZ0hvc3RJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdSZXBhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0S2V5KTsKICAgICB9CiAKICAgICBwdWJsaWMgU3RhdHNNZXRhZGF0YSBtdXRhdGVSZXBhaXJlZE1ldGFkYXRhKGxvbmcgbmV3UmVwYWlyZWRBdCwgVGltZVVVSUQgbmV3UGVuZGluZ1JlcGFpciwgYm9vbGVhbiBuZXdJc1RyYW5zaWVudCkKQEAgLTE4OCwxNSArMjE5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblJhdGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkVG9tYnN0b25lRHJvcFRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5DbHVzdGVyaW5nVmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q2x1c3RlcmluZ1ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyZWRDbHVzdGVyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzTGVnYWN5Q291bnRlclNoYXJkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JlcGFpcmVkQXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbENvbHVtbnNTZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFJvd3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hdGluZ0hvc3RJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BlbmRpbmdSZXBhaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJc1RyYW5zaWVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJc1RyYW5zaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1BhcnRpdGlvbkxldmVsRGVsZXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0S2V5KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTIyMCwxMyArMjU0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZXN0aW1hdGVkVG9tYnN0b25lRHJvcFRpbWUsIHRoYXQuZXN0aW1hdGVkVG9tYnN0b25lRHJvcFRpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoc3N0YWJsZUxldmVsLCB0aGF0LnNzdGFibGVMZXZlbCkKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChyZXBhaXJlZEF0LCB0aGF0LnJlcGFpcmVkQXQpCi0gICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobWF4Q2x1c3RlcmluZ1ZhbHVlcywgdGhhdC5tYXhDbHVzdGVyaW5nVmFsdWVzKQotICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG1pbkNsdXN0ZXJpbmdWYWx1ZXMsIHRoYXQubWluQ2x1c3RlcmluZ1ZhbHVlcykKKyAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjb3ZlcmVkQ2x1c3RlcmluZywgdGhhdC5jb3ZlcmVkQ2x1c3RlcmluZykKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChoYXNMZWdhY3lDb3VudGVyU2hhcmRzLCB0aGF0Lmhhc0xlZ2FjeUNvdW50ZXJTaGFyZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQodG90YWxDb2x1bW5zU2V0LCB0aGF0LnRvdGFsQ29sdW1uc1NldCkKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCh0b3RhbFJvd3MsIHRoYXQudG90YWxSb3dzKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9yaWdpbmF0aW5nSG9zdElkLCB0aGF0Lm9yaWdpbmF0aW5nSG9zdElkKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHBlbmRpbmdSZXBhaXIsIHRoYXQucGVuZGluZ1JlcGFpcikKKyAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9ucywgdGhhdC5oYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChmaXJzdEtleSwgdGhhdC5maXJzdEtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChsYXN0S2V5LCB0aGF0Lmxhc3RLZXkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgIH0KIApAQCAtMjQ3LDEzICsyODMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChlc3RpbWF0ZWRUb21ic3RvbmVEcm9wVGltZSkKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChzc3RhYmxlTGV2ZWwpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocmVwYWlyZWRBdCkKLSAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChtYXhDbHVzdGVyaW5nVmFsdWVzKQotICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG1pbkNsdXN0ZXJpbmdWYWx1ZXMpCisgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY292ZXJlZENsdXN0ZXJpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoaGFzTGVnYWN5Q291bnRlclNoYXJkcykKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCh0b3RhbENvbHVtbnNTZXQpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQodG90YWxSb3dzKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG9yaWdpbmF0aW5nSG9zdElkKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHBlbmRpbmdSZXBhaXIpCisgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMpCisgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZmlyc3RLZXkpCisgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobGFzdEtleSkKICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgfQogCkBAIC0yNjEsNiArMjk5LDggQEAKICAgICB7CiAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTdGF0c01ldGFkYXRhU2VyaWFsaXplci5jbGFzcyk7CiAKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFR5cGVTZXJpYWxpemVyIHR5cGVTZXJpYWxpemVyID0gbmV3IEFic3RyYWN0VHlwZVNlcmlhbGl6ZXIoKTsKKwogICAgICAgICBwdWJsaWMgaW50IHNlcmlhbGl6ZWRTaXplKFZlcnNpb24gdmVyc2lvbiwgU3RhdHNNZXRhZGF0YSBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CkBAIC0yNzAsMTQgKzMxMCwyMyBAQAogICAgICAgICAgICAgc2l6ZSArPSA4ICsgOCArIDQgKyA0ICsgNCArIDQgKyA4ICsgODsgLy8gbWl4L21heCB0aW1lc3RhbXAobG9uZyksIG1pbi9tYXhMb2NhbERlbGV0aW9uVGltZShpbnQpLCBtaW4vbWF4IFRUTCwgY29tcHJlc3Npb25SYXRpbyhkb3VibGUpLCByZXBhaXJlZEF0IChsb25nKQogICAgICAgICAgICAgc2l6ZSArPSBUb21ic3RvbmVIaXN0b2dyYW0uc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShjb21wb25lbnQuZXN0aW1hdGVkVG9tYnN0b25lRHJvcFRpbWUpOwogICAgICAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mKGNvbXBvbmVudC5zc3RhYmxlTGV2ZWwpOwotICAgICAgICAgICAgLy8gbWluIGNvbHVtbiBuYW1lcwotICAgICAgICAgICAgc2l6ZSArPSA0OwotICAgICAgICAgICAgZm9yIChCeXRlQnVmZmVyIHZhbHVlIDogY29tcG9uZW50Lm1pbkNsdXN0ZXJpbmdWYWx1ZXMpCi0gICAgICAgICAgICAgICAgc2l6ZSArPSAyICsgdmFsdWUucmVtYWluaW5nKCk7IC8vIHdpdGggc2hvcnQgbGVuZ3RoCi0gICAgICAgICAgICAvLyBtYXggY29sdW1uIG5hbWVzCi0gICAgICAgICAgICBzaXplICs9IDQ7Ci0gICAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgdmFsdWUgOiBjb21wb25lbnQubWF4Q2x1c3RlcmluZ1ZhbHVlcykKLSAgICAgICAgICAgICAgICBzaXplICs9IDIgKyB2YWx1ZS5yZW1haW5pbmcoKTsgLy8gd2l0aCBzaG9ydCBsZW5ndGgKKworICAgICAgICAgICAgaWYgKHZlcnNpb24uaGFzTGVnYWN5TWluTWF4KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbWluIGNvbHVtbiBuYW1lcworICAgICAgICAgICAgICAgIHNpemUgKz0gNDsKKyAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gbWluQ2x1c3RlcmluZ1ZhbHVlcyA9IGNvbXBvbmVudC5jb3ZlcmVkQ2x1c3RlcmluZy5zdGFydCgpOworICAgICAgICAgICAgICAgIHNpemUgKz0gbWluQ2x1c3RlcmluZ1ZhbHVlcy5zaXplKCkgKiAyIC8qIHNob3J0IGxlbmd0aCAqLyArIG1pbkNsdXN0ZXJpbmdWYWx1ZXMuZGF0YVNpemUoKTsKKyAgICAgICAgICAgICAgICAvLyBtYXggY29sdW1uIG5hbWVzCisgICAgICAgICAgICAgICAgc2l6ZSArPSA0OworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdCb3VuZDw/PiBtYXhDbHVzdGVyaW5nVmFsdWVzID0gY29tcG9uZW50LmNvdmVyZWRDbHVzdGVyaW5nLmVuZCgpOworICAgICAgICAgICAgICAgIHNpemUgKz0gbWF4Q2x1c3RlcmluZ1ZhbHVlcy5zaXplKCkgKiAyIC8qIHNob3J0IGxlbmd0aCAqLyArIG1heENsdXN0ZXJpbmdWYWx1ZXMuZGF0YVNpemUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZlcnNpb24uaGFzSW1wcm92ZWRNaW5NYXgoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplID0gaW1wcm92ZWRNaW5NYXhTaXplKHZlcnNpb24sIGNvbXBvbmVudCwgc2l6ZSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHNpemUgKz0gVHlwZVNpemVzLnNpemVvZihjb21wb25lbnQuaGFzTGVnYWN5Q291bnRlclNoYXJkcyk7CiAgICAgICAgICAgICBzaXplICs9IDggKyA4OyAvLyB0b3RhbENvbHVtbnNTZXQsIHRvdGFsUm93cwogICAgICAgICAgICAgaWYgKHZlcnNpb24uaGFzQ29tbWl0TG9nTG93ZXJCb3VuZCgpKQpAQCAtMzA0LDYgKzM1MywzMSBAQAogICAgICAgICAgICAgICAgICAgICBzaXplICs9IFVVSURTZXJpYWxpemVyLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoY29tcG9uZW50Lm9yaWdpbmF0aW5nSG9zdElkLCB2ZXJzaW9uLmNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCkpOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAodmVyc2lvbi5oYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9uc1ByZXNlbmNlTWFya2VyKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mKGNvbXBvbmVudC5oYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9ucyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uLmhhc0ltcHJvdmVkTWluTWF4KCkgJiYgdmVyc2lvbi5oYXNMZWdhY3lNaW5NYXgoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplID0gaW1wcm92ZWRNaW5NYXhTaXplKHZlcnNpb24sIGNvbXBvbmVudCwgc2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uLmhhc0tleVJhbmdlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZSArPSBCeXRlQnVmZmVyVXRpbC5zZXJpYWxpemVkU2l6ZVdpdGhWSW50TGVuZ3RoKGNvbXBvbmVudC5maXJzdEtleSk7CisgICAgICAgICAgICAgICAgc2l6ZSArPSBCeXRlQnVmZmVyVXRpbC5zZXJpYWxpemVkU2l6ZVdpdGhWSW50TGVuZ3RoKGNvbXBvbmVudC5sYXN0S2V5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBpbXByb3ZlZE1pbk1heFNpemUoVmVyc2lvbiB2ZXJzaW9uLCBTdGF0c01ldGFkYXRhIGNvbXBvbmVudCwgaW50IHNpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUgKz0gdHlwZVNlcmlhbGl6ZXIuc2VyaWFsaXplZExpc3RTaXplKGNvbXBvbmVudC5jbHVzdGVyaW5nVHlwZXMpOworICAgICAgICAgICAgc2l6ZSArPSBTbGljZS5zZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKGNvbXBvbmVudC5jb3ZlcmVkQ2x1c3RlcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLmNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmNsdXN0ZXJpbmdUeXBlcyk7CiAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKICAgICAgICAgfQogCkBAIC0zMjIsMTIgKzM5NiwzMSBAQAogICAgICAgICAgICAgVG9tYnN0b25lSGlzdG9ncmFtLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGNvbXBvbmVudC5lc3RpbWF0ZWRUb21ic3RvbmVEcm9wVGltZSwgb3V0KTsKICAgICAgICAgICAgIG91dC53cml0ZUludChjb21wb25lbnQuc3N0YWJsZUxldmVsKTsKICAgICAgICAgICAgIG91dC53cml0ZUxvbmcoY29tcG9uZW50LnJlcGFpcmVkQXQpOwotICAgICAgICAgICAgb3V0LndyaXRlSW50KGNvbXBvbmVudC5taW5DbHVzdGVyaW5nVmFsdWVzLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgdmFsdWUgOiBjb21wb25lbnQubWluQ2x1c3RlcmluZ1ZhbHVlcykKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhTaG9ydExlbmd0aCh2YWx1ZSwgb3V0KTsKLSAgICAgICAgICAgIG91dC53cml0ZUludChjb21wb25lbnQubWF4Q2x1c3RlcmluZ1ZhbHVlcy5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChCeXRlQnVmZmVyIHZhbHVlIDogY29tcG9uZW50Lm1heENsdXN0ZXJpbmdWYWx1ZXMpCi0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGgodmFsdWUsIG91dCk7CisKKyAgICAgICAgICAgIGlmICh2ZXJzaW9uLmhhc0xlZ2FjeU1pbk1heCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdCb3VuZDw/PiBtaW5DbHVzdGVyaW5nVmFsdWVzID0gY29tcG9uZW50LmNvdmVyZWRDbHVzdGVyaW5nLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KGNvdW50VW50aWxOdWxsKG1pbkNsdXN0ZXJpbmdWYWx1ZXMuZ2V0QnVmZmVyQXJyYXkoKSkpOworICAgICAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciB2YWx1ZSA6IG1pbkNsdXN0ZXJpbmdWYWx1ZXMuZ2V0QnVmZmVyQXJyYXkoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFNob3J0TGVuZ3RoKHZhbHVlLCBvdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQm91bmQ8Pz4gbWF4Q2x1c3RlcmluZ1ZhbHVlcyA9IGNvbXBvbmVudC5jb3ZlcmVkQ2x1c3RlcmluZy5lbmQoKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQoY291bnRVbnRpbE51bGwobWF4Q2x1c3RlcmluZ1ZhbHVlcy5nZXRCdWZmZXJBcnJheSgpKSk7CisgICAgICAgICAgICAgICAgZm9yIChCeXRlQnVmZmVyIHZhbHVlIDogbWF4Q2x1c3RlcmluZ1ZhbHVlcy5nZXRCdWZmZXJBcnJheSgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGgodmFsdWUsIG91dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodmVyc2lvbi5oYXNJbXByb3ZlZE1pbk1heCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUltcHJvdmVkTWluTWF4KHZlcnNpb24sIGNvbXBvbmVudCwgb3V0KTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihjb21wb25lbnQuaGFzTGVnYWN5Q291bnRlclNoYXJkcyk7CiAKICAgICAgICAgICAgIG91dC53cml0ZUxvbmcoY29tcG9uZW50LnRvdGFsQ29sdW1uc1NldCk7CkBAIC0zNjgsNiArNDYxLDMyIEBACiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUJ5dGUoMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmVyc2lvbi5oYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9uc1ByZXNlbmNlTWFya2VyKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlQm9vbGVhbihjb21wb25lbnQuaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmVyc2lvbi5oYXNJbXByb3ZlZE1pbk1heCgpICYmIHZlcnNpb24uaGFzTGVnYWN5TWluTWF4KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplSW1wcm92ZWRNaW5NYXgodmVyc2lvbiwgY29tcG9uZW50LCBvdXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmVyc2lvbi5oYXNLZXlSYW5nZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFZJbnRMZW5ndGgoY29tcG9uZW50LmZpcnN0S2V5LCBvdXQpOworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFZJbnRMZW5ndGgoY29tcG9uZW50Lmxhc3RLZXksIG91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplSW1wcm92ZWRNaW5NYXgoVmVyc2lvbiB2ZXJzaW9uLCBTdGF0c01ldGFkYXRhIGNvbXBvbmVudCwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGNvbXBvbmVudC5jbHVzdGVyaW5nVHlwZXMgIT0gbnVsbDsKKyAgICAgICAgICAgIHR5cGVTZXJpYWxpemVyLnNlcmlhbGl6ZUxpc3QoY29tcG9uZW50LmNsdXN0ZXJpbmdUeXBlcywgb3V0KTsKKyAgICAgICAgICAgIFNsaWNlLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGNvbXBvbmVudC5jb3ZlcmVkQ2x1c3RlcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24uY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5jbHVzdGVyaW5nVHlwZXMpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFN0YXRzTWV0YWRhdGEgZGVzZXJpYWxpemUoVmVyc2lvbiB2ZXJzaW9uLCBEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KQEAgLTQwNywyNCArNTI2LDMxIEBACiAgICAgICAgICAgICBpbnQgc3N0YWJsZUxldmVsID0gaW4ucmVhZEludCgpOwogICAgICAgICAgICAgbG9uZyByZXBhaXJlZEF0ID0gaW4ucmVhZExvbmcoKTsKIAotICAgICAgICAgICAgLy8gZm9yIGxlZ2FjeSBzc3RhYmxlcywgd2Ugc2tpcCBkZXNlcmlhbGl6aW5nIHRoZSBtaW4gYW5kIG1heCBjbHVzdGVyaW5nIHZhbHVlCi0gICAgICAgICAgICAvLyB0byBwcmV2ZW50IGVycm9uZW91c2x5IGV4Y2x1ZGluZyBzc3RhYmxlcyBmcm9tIHJlYWRzIChzZWUgQ0FTU0FORFJBLTE0ODYxKQotICAgICAgICAgICAgaW50IGNvbENvdW50ID0gaW4ucmVhZEludCgpOwotICAgICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBtaW5DbHVzdGVyaW5nVmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KGNvbENvdW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sQ291bnQ7IGkrKykKKyAgICAgICAgICAgIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBjbHVzdGVyaW5nVHlwZXMgPSBudWxsOworICAgICAgICAgICAgU2xpY2UgY292ZXJlZENsdXN0ZXJpbmcgPSBTbGljZS5BTEw7CisgICAgICAgICAgICBpZiAodmVyc2lvbi5oYXNMZWdhY3lNaW5NYXgoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbCA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW4pOwotICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uLmhhc0FjY3VyYXRlTWluTWF4KCkpCi0gICAgICAgICAgICAgICAgICAgIG1pbkNsdXN0ZXJpbmdWYWx1ZXMuYWRkKHZhbCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gV2UgYWx3YXlzIGRlc2VyaWFsaXplIHRoZSBtaW4vbWF4IGNsdXN0ZXJpbmcgdmFsdWVzIGlmIHRoZXkgYXJlIHRoZXJlLCBidXQgd2UgaWdub3JlIHRoZW0gZm9yCisgICAgICAgICAgICAgICAgLy8gbGVnYWN5IHNzdGFibGVzIHdoZXJlICFoYXNBY2N1cmF0ZU1pbk1heCBkdWUgdG8gQ0FTU0FORFJBLTE0ODYxLgorICAgICAgICAgICAgICAgIGludCBjb2xDb3VudCA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyW10gbWluQ2x1c3RlcmluZ1ZhbHVlcyA9IG5ldyBCeXRlQnVmZmVyW2NvbENvdW50XTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbENvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgIG1pbkNsdXN0ZXJpbmdWYWx1ZXNbaV0gPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluKTsKIAotICAgICAgICAgICAgY29sQ291bnQgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IG1heENsdXN0ZXJpbmdWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oY29sQ291bnQpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xDb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdmFsID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbik7CisgICAgICAgICAgICAgICAgY29sQ291bnQgPSBpbi5yZWFkSW50KCk7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlcltdIG1heENsdXN0ZXJpbmdWYWx1ZXMgPSBuZXcgQnl0ZUJ1ZmZlcltjb2xDb3VudF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xDb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBtYXhDbHVzdGVyaW5nVmFsdWVzW2ldID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChpbik7CisKICAgICAgICAgICAgICAgICBpZiAodmVyc2lvbi5oYXNBY2N1cmF0ZU1pbk1heCgpKQotICAgICAgICAgICAgICAgICAgICBtYXhDbHVzdGVyaW5nVmFsdWVzLmFkZCh2YWwpOworICAgICAgICAgICAgICAgICAgICBjb3ZlcmVkQ2x1c3RlcmluZyA9IFNsaWNlLm1ha2UoQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLmluY2x1c2l2ZVN0YXJ0T2YobWluQ2x1c3RlcmluZ1ZhbHVlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJDbHVzdGVyaW5nQm91bmQuaW5jbHVzaXZlRW5kT2YobWF4Q2x1c3RlcmluZ1ZhbHVlcykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodmVyc2lvbi5oYXNJbXByb3ZlZE1pbk1heCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGltcHJvdmVkTWluTWF4IHdpbGwgYmUgaW4gdGhpcyBwbGFjZSB3aGVuIGxlZ2FjeU1pbk1heCBpcyByZW1vdmVkCisgICAgICAgICAgICAgICAgY2x1c3RlcmluZ1R5cGVzID0gdHlwZVNlcmlhbGl6ZXIuZGVzZXJpYWxpemVMaXN0KGluKTsKKyAgICAgICAgICAgICAgICBjb3ZlcmVkQ2x1c3RlcmluZyA9IFNsaWNlLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24uY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb24oKSwgY2x1c3RlcmluZ1R5cGVzKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYm9vbGVhbiBoYXNMZWdhY3lDb3VudGVyU2hhcmRzID0gaW4ucmVhZEJvb2xlYW4oKTsKQEAgLTQzOCw3ICs1NjQsNyBAQAogICAgICAgICAgICAgaWYgKHZlcnNpb24uaGFzQ29tbWl0TG9nSW50ZXJ2YWxzKCkpCiAgICAgICAgICAgICAgICAgY29tbWl0TG9nSW50ZXJ2YWxzID0gY29tbWl0TG9nUG9zaXRpb25TZXRTZXJpYWxpemVyLmRlc2VyaWFsaXplKGluKTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjb21taXRMb2dJbnRlcnZhbHMgPSBuZXcgSW50ZXJ2YWxTZXQ8Q29tbWl0TG9nUG9zaXRpb24+KGNvbW1pdExvZ0xvd2VyQm91bmQsIGNvbW1pdExvZ1VwcGVyQm91bmQpOworICAgICAgICAgICAgICAgIGNvbW1pdExvZ0ludGVydmFscyA9IG5ldyBJbnRlcnZhbFNldDw+KGNvbW1pdExvZ0xvd2VyQm91bmQsIGNvbW1pdExvZ1VwcGVyQm91bmQpOwogCiAgICAgICAgICAgICBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyID0gbnVsbDsKICAgICAgICAgICAgIGlmICh2ZXJzaW9uLmhhc1BlbmRpbmdSZXBhaXIoKSAmJiBpbi5yZWFkQnl0ZSgpICE9IDApCkBAIC00NTIsNiArNTc4LDI5IEBACiAgICAgICAgICAgICBpZiAodmVyc2lvbi5oYXNPcmlnaW5hdGluZ0hvc3RJZCgpICYmIGluLnJlYWRCeXRlKCkgIT0gMCkKICAgICAgICAgICAgICAgICBvcmlnaW5hdGluZ0hvc3RJZCA9IFVVSURTZXJpYWxpemVyLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIDApOwogCisgICAgICAgICAgICAvLyBJZiBub3QgcmVjb3JkZWQsIHRoZSBvbmx5IHRpbWUgd2UgY2FuIGd1YXJhbnRlZSB0aGVyZSBpcyBubyBwYXJ0aXRpb24gbGV2ZWwgZGVsZXRpb24gaXMgaWYgdGhlcmUgaXMgbm8KKyAgICAgICAgICAgIC8vIGRlbGV0aW9uIGF0IGFsbC4gT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIGFzc3VtZSB0aGVyZSBtYXkgYmUgc29tZS4KKyAgICAgICAgICAgIGJvb2xlYW4gaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMgPSBtaW5Mb2NhbERlbGV0aW9uVGltZSAhPSBDZWxsLk5PX0RFTEVUSU9OX1RJTUU7CisgICAgICAgICAgICBpZiAodmVyc2lvbi5oYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9uc1ByZXNlbmNlTWFya2VyKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnMgPSBpbi5yZWFkQm9vbGVhbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmVyc2lvbi5oYXNJbXByb3ZlZE1pbk1heCgpICYmIHZlcnNpb24uaGFzTGVnYWN5TWluTWF4KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaW1wcm92ZWRNaW5NYXggd2lsbCBiZSBpbiB0aGlzIHBsYWNlIHVudGlsIGxlZ2FjeU1pbk1heCBpcyByZW1vdmVkCisgICAgICAgICAgICAgICAgY2x1c3RlcmluZ1R5cGVzID0gdHlwZVNlcmlhbGl6ZXIuZGVzZXJpYWxpemVMaXN0KGluKTsKKyAgICAgICAgICAgICAgICBjb3ZlcmVkQ2x1c3RlcmluZyA9IFNsaWNlLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24uY29ycmVzcG9uZGluZ01lc3NhZ2luZ1ZlcnNpb24oKSwgY2x1c3RlcmluZ1R5cGVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBmaXJzdEtleSA9IG51bGw7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGxhc3RLZXkgPSBudWxsOworICAgICAgICAgICAgaWYgKHZlcnNpb24uaGFzS2V5UmFuZ2UoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmaXJzdEtleSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoVkludExlbmd0aChpbik7CisgICAgICAgICAgICAgICAgbGFzdEtleSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoVkludExlbmd0aChpbik7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdHNNZXRhZGF0YShwYXJ0aXRpb25TaXplcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5Db3VudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0TG9nSW50ZXJ2YWxzLApAQCAtNDY0LDE1ICs2MTMsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblJhdGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvbWJzdG9uZUhpc3RvZ3JhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluQ2x1c3RlcmluZ1ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhDbHVzdGVyaW5nVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJpbmdUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmVkQ2x1c3RlcmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNMZWdhY3lDb3VudGVyU2hhcmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGFpcmVkQXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxDb2x1bW5zU2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUm93cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hdGluZ0hvc3RJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nUmVwYWlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzVHJhbnNpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RyYW5zaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQYXJ0aXRpb25MZXZlbERlbGV0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0S2V5KTsKICAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGNvdW50VW50aWxOdWxsKEJ5dGVCdWZmZXJbXSBidWZmZXJBcnJheSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGkgPSBBcnJheVV0aWxzLmluZGV4T2YoYnVmZmVyQXJyYXksIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIGkgPCAwID8gYnVmZmVyQXJyYXkubGVuZ3RoIDogaTsKKyAgICAgICAgfQorCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvSW5jcmVtZW50YWxEZWVwVHJpZVdyaXRlclBhZ2VBd2FyZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvSW5jcmVtZW50YWxEZWVwVHJpZVdyaXRlclBhZ2VBd2FyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YjU1MGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9JbmNyZW1lbnRhbERlZXBUcmllV3JpdGVyUGFnZUF3YXJlLmphdmEKQEAgLTAsMCArMSw0MTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50Lk5vdFRocmVhZFNhZmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYSB2YXJpYW50IG9mIHtAbGluayBJbmNyZW1lbnRhbFRyaWVXcml0ZXJQYWdlQXdhcmV9IHdoaWNoIGlzIGFibGUgdG8gYnVpbGQgZXZlbiB2ZXJ5IGRlZXAKKyAqIHRyaWVzLiBXaGlsZSB0aGUgcGFyZW50IGNsYXNzIHVzZXMgcmVjdXJzaW9uIGZvciBjbGFyaXR5LCBpdCBtYXkgZW5kIHVwIHdpdGggc3RhY2sgb3ZlcmZsb3cgZm9yIHRyaWVzIHdpdGgKKyAqIHZlcnkgbG9uZyBrZXlzLiBUaGlzIGltcGxlbWVudGF0aW9uIGNhbiBzd2l0Y2ggcHJvY2Vzc2luZyBmcm9tIHN0YWNrIHRvIGhlYXAgYXQgYSBjZXJ0YWluIGRlcHRoIChwcm92aWRlZAorICogYXMgYSBjb25zdHJ1Y3RvciBwYXJhbSkuCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaW50ZW50aW9uYWxseSByZXBlYXRzIGNvZGUgcHJlc2VudCBpbiB0aGUgcGFyZW50IGNsYXNzLCBib3RoIGluIHRoZSBpbi1zdGFjayBhbmQgb24taGVhcCB2ZXJzaW9ucworICogb2YgZWFjaCBvZiB0aGUgdGhyZWUgaW1wbGVtZW50ZWQgcmVjdXJzaXZlIG9wZXJhdGlvbnMuIFJlbW92aW5nIHRoaXMgcmVwZXRpdGlvbiBjYW4gY2F1c2UgaGlnaGVyIHN0YWNrIHVzYWdlCisgKiBhbmQgdGh1cyBzdGFjayBvdmVyZmxvdyBmYWlsdXJlcy4KKyAqLworQE5vdFRocmVhZFNhZmUKK3B1YmxpYyBjbGFzcyBJbmNyZW1lbnRhbERlZXBUcmllV3JpdGVyUGFnZUF3YXJlPFZBTFVFPiBleHRlbmRzIEluY3JlbWVudGFsVHJpZVdyaXRlclBhZ2VBd2FyZTxWQUxVRT4KK3sKKyAgICBwcml2YXRlIGZpbmFsIGludCBtYXhSZWN1cnNpb25EZXB0aDsKKworICAgIHB1YmxpYyBJbmNyZW1lbnRhbERlZXBUcmllV3JpdGVyUGFnZUF3YXJlKFRyaWVTZXJpYWxpemVyPFZBTFVFLCA/IHN1cGVyIERhdGFPdXRwdXRQbHVzPiB0cmllU2VyaWFsaXplciwgRGF0YU91dHB1dFBsdXMgZGVzdCwgaW50IG1heFJlY3Vyc2lvbkRlcHRoKQorICAgIHsKKyAgICAgICAgc3VwZXIodHJpZVNlcmlhbGl6ZXIsIGRlc3QpOworICAgICAgICB0aGlzLm1heFJlY3Vyc2lvbkRlcHRoID0gbWF4UmVjdXJzaW9uRGVwdGg7CisgICAgfQorCisgICAgcHVibGljIEluY3JlbWVudGFsRGVlcFRyaWVXcml0ZXJQYWdlQXdhcmUoVHJpZVNlcmlhbGl6ZXI8VkFMVUUsID8gc3VwZXIgRGF0YU91dHB1dFBsdXM+IHRyaWVTZXJpYWxpemVyLCBEYXRhT3V0cHV0UGx1cyBkZXN0KQorICAgIHsKKyAgICAgICAgdGhpcyh0cmllU2VyaWFsaXplciwgZGVzdCwgNjQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSBmcmFtZXdvcmsgZm9yIGV4ZWN1dGluZyByZWN1cnNpb24gdXNpbmcgb24taGVhcCBsaW5rZWQgdHJhY2UgdG8gYXZvaWQgc3RhY2sgb3ZlcnJ1bnMuCisgICAgICovCisgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIFJlY3Vyc2lvbjxOT0RFPgorICAgIHsKKyAgICAgICAgZmluYWwgUmVjdXJzaW9uPE5PREU+IHBhcmVudDsKKyAgICAgICAgZmluYWwgTk9ERSBub2RlOworICAgICAgICBmaW5hbCBJdGVyYXRvcjxOT0RFPiBjaGlsZEl0ZXJhdG9yOworCisgICAgICAgIFJlY3Vyc2lvbihOT0RFIG5vZGUsIEl0ZXJhdG9yPE5PREU+IGNoaWxkSXRlcmF0b3IsIFJlY3Vyc2lvbjxOT0RFPiBwYXJlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKKyAgICAgICAgICAgIHRoaXMuY2hpbGRJdGVyYXRvciA9IGNoaWxkSXRlcmF0b3I7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTWFrZSBhIGNoaWxkIFJlY3Vyc2lvbiBvYmplY3QgZm9yIHRoZSBnaXZlbiBub2RlIGFuZCBpbml0aWFsaXplIGl0IGFzIG5lY2Vzc2FyeSB0byBjb250aW51ZSBwcm9jZXNzaW5nCisgICAgICAgICAqIHdpdGggaXQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBNYXkgcmV0dXJuIG51bGwgaWYgdGhlIHJlY3Vyc2lvbiBkb2VzIG5vdCBuZWVkIHRvIGNvbnRpbnVlIGluc2lkZSB0aGUgY2hpbGQgYnJhbmNoLgorICAgICAgICAgKi8KKyAgICAgICAgYWJzdHJhY3QgUmVjdXJzaW9uPE5PREU+IG1ha2VDaGlsZChOT0RFIGNoaWxkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29tcGxldGUgdGhlIHByb2Nlc3NpbmcgdGhpcyBSZWN1cnNpb24gb2JqZWN0LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogTm90ZTogdGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZCBmb3IgdGhlIG5vZGVzIGZvciB3aGljaCBtYWtlQ2hpbGQoKSByZXR1cm5zIG51bGwuCisgICAgICAgICAqLworICAgICAgICBhYnN0cmFjdCB2b2lkIGNvbXBsZXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wbGV0ZSBwcm9jZXNzaW5nIG9mIHRoZSBnaXZlbiBjaGlsZCAocG9zc2libHkgcmV0cmlldmUgZGF0YSB0byBhcHBseSB0byBhbnkgYWNjdW11bGF0aW9uIHBlcmZvcm1lZAorICAgICAgICAgKiBpbiB0aGlzIFJlY3Vyc2lvbiBvYmplY3QpLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBwcm9jZXNzaW5nIGEgY2hpbGQgY29tcGxldGVzLCBpbmNsdWRpbmcgd2hlbiByZWN1cnNpb24gaW5zaWRlIHRoZSBjaGlsZCBicmFuY2gKKyAgICAgICAgICogaXMgc2tpcHBlZCBieSBtYWtlQ2hpbGQoKSByZXR1cm5pbmcgbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY29tcGxldGVDaGlsZChOT0RFIGNoaWxkKQorICAgICAgICB7fQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWN1cnNpdmUgcHJvY2VzcywgaW4gZGVwdGgtZmlyc3Qgb3JkZXIsIHRoZSBicmFuY2ggcm9vdGVkIGF0IHRoaXMgcmVjdXJzaW9uIG5vZGUuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBSZXR1cm5zIHRoaXMuCisgICAgICAgICAqLworICAgICAgICBSZWN1cnNpb248Tk9ERT4gcHJvY2VzcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBSZWN1cnNpb248Tk9ERT4gY3VyciA9IHRoaXM7CisKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjdXJyLmNoaWxkSXRlcmF0b3IuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTk9ERSBjaGlsZCA9IGN1cnIuY2hpbGRJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIFJlY3Vyc2lvbjxOT0RFPiBjaGlsZFJlYyA9IGN1cnIubWFrZUNoaWxkKGNoaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkUmVjICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyID0gY2hpbGRSZWM7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnIuY29tcGxldGVDaGlsZChjaGlsZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN1cnIuY29tcGxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgUmVjdXJzaW9uPE5PREU+IGN1cnJQYXJlbnQgPSBjdXJyLnBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJQYXJlbnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyOworICAgICAgICAgICAgICAgICAgICBjdXJyUGFyZW50LmNvbXBsZXRlQ2hpbGQoY3Vyci5ub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnJQYXJlbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCByZWNhbGNUb3RhbFNpemUoTm9kZTxWQUxVRT4gbm9kZSwgbG9uZyBub2RlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlY2FsY1RvdGFsU2l6ZVJlY3Vyc2l2ZU9uU3RhY2sobm9kZSwgbm9kZVBvc2l0aW9uLCAwKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiRHVwbGljYXRlZENvZGUiKSAvLyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZXMgSW5jcmVtZW50YWxUcmllV3JpdGVyUGFnZUF3YXJlCisgICAgcHJpdmF0ZSBpbnQgcmVjYWxjVG90YWxTaXplUmVjdXJzaXZlT25TdGFjayhOb2RlPFZBTFVFPiBub2RlLCBsb25nIG5vZGVQb3NpdGlvbiwgaW50IGRlcHRoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmIChub2RlLmhhc091dE9mUGFnZUluQnJhbmNoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc3ogPSAwOworICAgICAgICAgICAgZm9yIChOb2RlPFZBTFVFPiBjaGlsZCA6IG5vZGUuY2hpbGRyZW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRlcHRoIDwgbWF4UmVjdXJzaW9uRGVwdGgpCisgICAgICAgICAgICAgICAgICAgIHN6ICs9IHJlY2FsY1RvdGFsU2l6ZVJlY3Vyc2l2ZU9uU3RhY2soY2hpbGQsIG5vZGVQb3NpdGlvbiArIHN6LCBkZXB0aCArIDEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3ogKz0gcmVjYWxjVG90YWxTaXplUmVjdXJzaXZlT25IZWFwKGNoaWxkLCBub2RlUG9zaXRpb24gKyBzeik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlLmJyYW5jaFNpemUgPSBzejsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBzaXppbmcgYmVsb3cgd2lsbCB1c2UgdGhlIGJyYW5jaCBzaXplIGNhbGN1bGF0ZWQgYWJvdmUuIFNpbmNlIHRoYXQgY2FuIGNoYW5nZSBvbiBvdXQtb2YtcGFnZSBpbiBicmFuY2gsCisgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHNpemUgaWYgZWl0aGVyIGZsYWcgaXMgc2V0LgorICAgICAgICBpZiAobm9kZS5oYXNPdXRPZlBhZ2VDaGlsZHJlbiB8fCBub2RlLmhhc091dE9mUGFnZUluQnJhbmNoKQorICAgICAgICAgICAgbm9kZS5ub2RlU2l6ZSA9IHNlcmlhbGl6ZXIuc2l6ZW9mTm9kZShub2RlLCBub2RlUG9zaXRpb24gKyBub2RlLmJyYW5jaFNpemUpOworCisgICAgICAgIHJldHVybiBub2RlLmJyYW5jaFNpemUgKyBub2RlLm5vZGVTaXplOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHJlY2FsY1RvdGFsU2l6ZVJlY3Vyc2l2ZU9uSGVhcChOb2RlPFZBTFVFPiBub2RlLCBsb25nIG5vZGVQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpZiAobm9kZS5oYXNPdXRPZlBhZ2VJbkJyYW5jaCkKKyAgICAgICAgICAgIG5ldyBSZWNhbGNUb3RhbFNpemVSZWN1cnNpb24obm9kZSwgbnVsbCwgbm9kZVBvc2l0aW9uKS5wcm9jZXNzKCk7CisKKyAgICAgICAgaWYgKG5vZGUuaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gfHwgbm9kZS5oYXNPdXRPZlBhZ2VJbkJyYW5jaCkKKyAgICAgICAgICAgIG5vZGUubm9kZVNpemUgPSBzZXJpYWxpemVyLnNpemVvZk5vZGUobm9kZSwgbm9kZVBvc2l0aW9uICsgbm9kZS5icmFuY2hTaXplKTsKKworICAgICAgICByZXR1cm4gbm9kZS5icmFuY2hTaXplICsgbm9kZS5ub2RlU2l6ZTsKKyAgICB9CisKKyAgICBjbGFzcyBSZWNhbGNUb3RhbFNpemVSZWN1cnNpb24gZXh0ZW5kcyBSZWN1cnNpb248Tm9kZTxWQUxVRT4+CisgICAgeworICAgICAgICBmaW5hbCBsb25nIG5vZGVQb3NpdGlvbjsKKyAgICAgICAgaW50IHN6OworCisgICAgICAgIFJlY2FsY1RvdGFsU2l6ZVJlY3Vyc2lvbihOb2RlPFZBTFVFPiBub2RlLCBSZWN1cnNpb248Tm9kZTxWQUxVRT4+IHBhcmVudCwgbG9uZyBub2RlUG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG5vZGUsIG5vZGUuY2hpbGRyZW4uaXRlcmF0b3IoKSwgcGFyZW50KTsKKyAgICAgICAgICAgIHN6ID0gMDsKKyAgICAgICAgICAgIHRoaXMubm9kZVBvc2l0aW9uID0gbm9kZVBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFJlY3Vyc2lvbjxOb2RlPFZBTFVFPj4gbWFrZUNoaWxkKE5vZGU8VkFMVUU+IGNoaWxkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2hpbGQuaGFzT3V0T2ZQYWdlSW5CcmFuY2gpCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWNhbGNUb3RhbFNpemVSZWN1cnNpb24oY2hpbGQsIHRoaXMsIG5vZGVQb3NpdGlvbiArIHN6KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIGNvbXBsZXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgbm9kZS5icmFuY2hTaXplID0gc3o7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiRHVwbGljYXRlZENvZGUiKSAvLyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZXMgSW5jcmVtZW50YWxUcmllV3JpdGVyUGFnZUF3YXJlIGFuZCBvblN0YWNrIGNvZGUKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgY29tcGxldGVDaGlsZChOb2RlPFZBTFVFPiBjaGlsZCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBmb3Igbm9kZXMgdGhhdCB3ZXJlIHJlY3Vyc2l2ZWx5IHByb2Nlc3NlZCBhcyB3ZWxsIGFzIHRoZSBvbmVzIHRoYXQgd2VyZW4ndC4KKworICAgICAgICAgICAgLy8gVGhlIHNpemluZyBiZWxvdyB3aWxsIHVzZSB0aGUgYnJhbmNoIHNpemUgY2FsY3VsYXRlZCBhYm92ZS4gU2luY2UgdGhhdCBjYW4gY2hhbmdlIG9uIG91dC1vZi1wYWdlIGluIGJyYW5jaCwKKyAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGUgdGhlIHNpemUgaWYgZWl0aGVyIGZsYWcgaXMgc2V0LgorICAgICAgICAgICAgaWYgKGNoaWxkLmhhc091dE9mUGFnZUNoaWxkcmVuIHx8IGNoaWxkLmhhc091dE9mUGFnZUluQnJhbmNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgY2hpbGRQb3NpdGlvbiA9IHRoaXMubm9kZVBvc2l0aW9uICsgc3o7CisgICAgICAgICAgICAgICAgY2hpbGQubm9kZVNpemUgPSBzZXJpYWxpemVyLnNpemVvZk5vZGUoY2hpbGQsIGNoaWxkUG9zaXRpb24gKyBjaGlsZC5icmFuY2hTaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3ogKz0gY2hpbGQuYnJhbmNoU2l6ZSArIGNoaWxkLm5vZGVTaXplOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGxvbmcgd3JpdGUoTm9kZTxWQUxVRT4gbm9kZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gd3JpdGVSZWN1cnNpdmVPblN0YWNrKG5vZGUsIDApOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJEdXBsaWNhdGVkQ29kZSIpIC8vIGludGVudGlvbmFsbHkgZHVwbGljYXRlcyBJbmNyZW1lbnRhbFRyaWVXcml0ZXJQYWdlQXdhcmUKKyAgICBwcml2YXRlIGxvbmcgd3JpdGVSZWN1cnNpdmVPblN0YWNrKE5vZGU8VkFMVUU+IG5vZGUsIGludCBkZXB0aCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIG5vZGVQb3NpdGlvbiA9IGRlc3QucG9zaXRpb24oKTsKKyAgICAgICAgZm9yIChOb2RlPFZBTFVFPiBjaGlsZCA6IG5vZGUuY2hpbGRyZW4pCisgICAgICAgICAgICBpZiAoY2hpbGQuZmlsZVBvcyA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVwdGggPCBtYXhSZWN1cnNpb25EZXB0aCkKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuZmlsZVBvcyA9IHdyaXRlUmVjdXJzaXZlT25TdGFjayhjaGlsZCwgZGVwdGggKyAxKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNoaWxkLmZpbGVQb3MgPSB3cml0ZVJlY3Vyc2l2ZU9uSGVhcChjaGlsZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgbm9kZVBvc2l0aW9uICs9IG5vZGUuYnJhbmNoU2l6ZTsKKyAgICAgICAgYXNzZXJ0IGRlc3QucG9zaXRpb24oKSA9PSBub2RlUG9zaXRpb24KKyAgICAgICAgOiAiRXhwZWN0ZWQgbm9kZSBwb3NpdGlvbiB0byBiZSAiICsgbm9kZVBvc2l0aW9uICsgIiBidXQgZ290ICIgKyBkZXN0LnBvc2l0aW9uKCkgKyAiIGFmdGVyIHdyaXRpbmcgY2hpbGRyZW4uXG4iICsgZHVtcE5vZGUobm9kZSwgZGVzdC5wb3NpdGlvbigpKTsKKworICAgICAgICBzZXJpYWxpemVyLndyaXRlKGRlc3QsIG5vZGUsIG5vZGVQb3NpdGlvbik7CisKKyAgICAgICAgYXNzZXJ0IGRlc3QucG9zaXRpb24oKSA9PSBub2RlUG9zaXRpb24gKyBub2RlLm5vZGVTaXplCisgICAgICAgICAgICAgICB8fCBkZXN0LnBhZGRlZFBvc2l0aW9uKCkgPT0gZGVzdC5wb3NpdGlvbigpIC8vIEZvciBQYXJ0aXRpb25JbmRleFRlc3QudGVzdFBvaW50ZXJHcm93dGggd2hlcmUgcG9zaXRpb24gbWF5IGp1bXAgb24gcGFnZSBib3VuZGFyaWVzLgorICAgICAgICA6ICJFeHBlY3RlZCBub2RlIHBvc2l0aW9uIHRvIGJlICIgKyAobm9kZVBvc2l0aW9uICsgbm9kZS5ub2RlU2l6ZSkgKyAiIGJ1dCBnb3QgIiArIGRlc3QucG9zaXRpb24oKSArICIgYWZ0ZXIgd3JpdGluZyBub2RlLCBub2RlU2l6ZSAiICsgbm9kZS5ub2RlU2l6ZSArICIuXG4iICsgZHVtcE5vZGUobm9kZSwgbm9kZVBvc2l0aW9uKTsKKyAgICAgICAgcmV0dXJuIG5vZGVQb3NpdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgd3JpdGVSZWN1cnNpdmVPbkhlYXAoTm9kZTxWQUxVRT4gbm9kZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFdyaXRlUmVjdXJzaW9uKG5vZGUsIG51bGwpLnByb2Nlc3MoKS5ub2RlLmZpbGVQb3M7CisgICAgfQorCisgICAgY2xhc3MgV3JpdGVSZWN1cnNpb24gZXh0ZW5kcyBSZWN1cnNpb248Tm9kZTxWQUxVRT4+CisgICAgeworICAgICAgICBsb25nIG5vZGVQb3NpdGlvbjsKKworICAgICAgICBXcml0ZVJlY3Vyc2lvbihOb2RlPFZBTFVFPiBub2RlLCBSZWN1cnNpb248Tm9kZTxWQUxVRT4+IHBhcmVudCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIobm9kZSwgbm9kZS5jaGlsZHJlbi5pdGVyYXRvcigpLCBwYXJlbnQpOworICAgICAgICAgICAgbm9kZVBvc2l0aW9uID0gZGVzdC5wb3NpdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFJlY3Vyc2lvbjxOb2RlPFZBTFVFPj4gbWFrZUNoaWxkKE5vZGU8VkFMVUU+IGNoaWxkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2hpbGQuZmlsZVBvcyA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdyaXRlUmVjdXJzaW9uKGNoaWxkLCB0aGlzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJEdXBsaWNhdGVkQ29kZSIpIC8vIGludGVudGlvbmFsbHkgZHVwbGljYXRlcyBJbmNyZW1lbnRhbFRyaWVXcml0ZXJQYWdlQXdhcmUgYW5kIG9uU3RhY2sgY29kZQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBjb21wbGV0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBub2RlUG9zaXRpb24gPSBub2RlUG9zaXRpb24gKyBub2RlLmJyYW5jaFNpemU7CisgICAgICAgICAgICBhc3NlcnQgZGVzdC5wb3NpdGlvbigpID09IG5vZGVQb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICA6ICJFeHBlY3RlZCBub2RlIHBvc2l0aW9uIHRvIGJlICIgKyBub2RlUG9zaXRpb24gKyAiIGJ1dCBnb3QgIiArIGRlc3QucG9zaXRpb24oKSArICIgYWZ0ZXIgd3JpdGluZyBjaGlsZHJlbi5cbiIgKyBkdW1wTm9kZShub2RlLCBkZXN0LnBvc2l0aW9uKCkpOworCisgICAgICAgICAgICBzZXJpYWxpemVyLndyaXRlKGRlc3QsIG5vZGUsIG5vZGVQb3NpdGlvbik7CisKKyAgICAgICAgICAgIGFzc2VydCBkZXN0LnBvc2l0aW9uKCkgPT0gbm9kZVBvc2l0aW9uICsgbm9kZS5ub2RlU2l6ZQorICAgICAgICAgICAgICAgICAgIHx8IGRlc3QucGFkZGVkUG9zaXRpb24oKSA9PSBkZXN0LnBvc2l0aW9uKCkgLy8gRm9yIFBhcnRpdGlvbkluZGV4VGVzdC50ZXN0UG9pbnRlckdyb3d0aCB3aGVyZSBwb3NpdGlvbiBtYXkganVtcCBvbiBwYWdlIGJvdW5kYXJpZXMuCisgICAgICAgICAgICAgICAgICAgIDogIkV4cGVjdGVkIG5vZGUgcG9zaXRpb24gdG8gYmUgIiArIChub2RlUG9zaXRpb24gKyBub2RlLm5vZGVTaXplKSArICIgYnV0IGdvdCAiICsgZGVzdC5wb3NpdGlvbigpICsgIiBhZnRlciB3cml0aW5nIG5vZGUsIG5vZGVTaXplICIgKyBub2RlLm5vZGVTaXplICsgIi5cbiIgKyBkdW1wTm9kZShub2RlLCBub2RlUG9zaXRpb24pOworCisgICAgICAgICAgICBub2RlLmZpbGVQb3MgPSBub2RlUG9zaXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgbG9uZyB3cml0ZVBhcnRpYWwoTm9kZTxWQUxVRT4gbm9kZSwgRGF0YU91dHB1dFBsdXMgZGVzdCwgbG9uZyBiYXNlT2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiB3cml0ZVBhcnRpYWxSZWN1cnNpdmVPblN0YWNrKG5vZGUsIGRlc3QsIGJhc2VPZmZzZXQsIDApOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJEdXBsaWNhdGVkQ29kZSIpIC8vIGludGVudGlvbmFsbHkgZHVwbGljYXRlcyBJbmNyZW1lbnRhbFRyaWVXcml0ZXJQYWdlQXdhcmUKKyAgICBwcml2YXRlIGxvbmcgd3JpdGVQYXJ0aWFsUmVjdXJzaXZlT25TdGFjayhOb2RlPFZBTFVFPiBub2RlLCBEYXRhT3V0cHV0UGx1cyBkZXN0LCBsb25nIGJhc2VPZmZzZXQsIGludCBkZXB0aCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIHN0YXJ0UG9zaXRpb24gPSBkZXN0LnBvc2l0aW9uKCkgKyBiYXNlT2Zmc2V0OworCisgICAgICAgIExpc3Q8Tm9kZTxWQUxVRT4+IGNoaWxkcmVuVG9DbGVhciA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKE5vZGU8VkFMVUU+IGNoaWxkIDogbm9kZS5jaGlsZHJlbikKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNoaWxkLmZpbGVQb3MgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hpbGRyZW5Ub0NsZWFyLmFkZChjaGlsZCk7CisgICAgICAgICAgICAgICAgaWYgKGRlcHRoIDwgbWF4UmVjdXJzaW9uRGVwdGgpCisgICAgICAgICAgICAgICAgICAgIGNoaWxkLmZpbGVQb3MgPSB3cml0ZVBhcnRpYWxSZWN1cnNpdmVPblN0YWNrKGNoaWxkLCBkZXN0LCBiYXNlT2Zmc2V0LCBkZXB0aCArIDEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQuZmlsZVBvcyA9IHdyaXRlUGFydGlhbFJlY3Vyc2l2ZU9uSGVhcChjaGlsZCwgZGVzdCwgYmFzZU9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsb25nIG5vZGVQb3NpdGlvbiA9IGRlc3QucG9zaXRpb24oKSArIGJhc2VPZmZzZXQ7CisKKyAgICAgICAgaWYgKG5vZGUuaGFzT3V0T2ZQYWdlSW5CcmFuY2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgYnJhbmNoIHNpemUgd2l0aCB0aGUgc2l6ZSBvZiB3aGF0IHdlIGhhdmUganVzdCB3cml0dGVuLiBUaGlzIG1heSBiZSB1c2VkIGJ5IHRoZSBub2RlJ3MKKyAgICAgICAgICAgIC8vIG1heFBvc2l0aW9uRGVsdGEsIGFuZCBpdCdzIGEgYmV0dGVyIGFwcHJveGltYXRpb24gZm9yIGxhdGVyIGZpdHRpbmcgY2FsY3VsYXRpb25zLgorICAgICAgICAgICAgbm9kZS5icmFuY2hTaXplID0gKGludCkgKG5vZGVQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgc2VyaWFsaXplci53cml0ZShkZXN0LCBub2RlLCBub2RlUG9zaXRpb24pOworCisgICAgICAgIGlmIChub2RlLmhhc091dE9mUGFnZUNoaWxkcmVuIHx8IG5vZGUuaGFzT3V0T2ZQYWdlSW5CcmFuY2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbm9kZSBzaXplIHdpdGggd2hhdCB3ZSBoYXZlIGp1c3Qgc2Vlbi4gSXQncyBhIGJldHRlciBhcHByb3hpbWF0aW9uIGZvciBsYXRlciBmaXR0aW5nCisgICAgICAgICAgICAvLyBjYWxjdWxhdGlvbnMuCisgICAgICAgICAgICBsb25nIGVuZFBvc2l0aW9uID0gZGVzdC5wb3NpdGlvbigpICsgYmFzZU9mZnNldDsKKyAgICAgICAgICAgIG5vZGUubm9kZVNpemUgPSAoaW50KSAoZW5kUG9zaXRpb24gLSBub2RlUG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChOb2RlPFZBTFVFPiBjaGlsZCA6IGNoaWxkcmVuVG9DbGVhcikKKyAgICAgICAgICAgIGNoaWxkLmZpbGVQb3MgPSAtMTsKKyAgICAgICAgcmV0dXJuIG5vZGVQb3NpdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgd3JpdGVQYXJ0aWFsUmVjdXJzaXZlT25IZWFwKE5vZGU8VkFMVUU+IG5vZGUsIERhdGFPdXRwdXRQbHVzIGRlc3QsIGxvbmcgYmFzZU9mZnNldCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBuZXcgV3JpdGVQYXJ0aWFsUmVjdXJzaW9uKG5vZGUsIGRlc3QsIGJhc2VPZmZzZXQpLnByb2Nlc3MoKTsKKyAgICAgICAgbG9uZyBwb3MgPSBub2RlLmZpbGVQb3M7CisgICAgICAgIG5vZGUuZmlsZVBvcyA9IC0xOworICAgICAgICByZXR1cm4gcG9zOworICAgIH0KKworICAgIGNsYXNzIFdyaXRlUGFydGlhbFJlY3Vyc2lvbiBleHRlbmRzIFJlY3Vyc2lvbjxOb2RlPFZBTFVFPj4KKyAgICB7CisgICAgICAgIGZpbmFsIERhdGFPdXRwdXRQbHVzIGRlc3Q7CisgICAgICAgIGZpbmFsIGxvbmcgYmFzZU9mZnNldDsKKyAgICAgICAgZmluYWwgbG9uZyBzdGFydFBvc2l0aW9uOworICAgICAgICBmaW5hbCBMaXN0PE5vZGU8VkFMVUU+PiBjaGlsZHJlblRvQ2xlYXI7CisKKyAgICAgICAgV3JpdGVQYXJ0aWFsUmVjdXJzaW9uKE5vZGU8VkFMVUU+IG5vZGUsIFdyaXRlUGFydGlhbFJlY3Vyc2lvbiBwYXJlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG5vZGUsIG5vZGUuY2hpbGRyZW4uaXRlcmF0b3IoKSwgcGFyZW50KTsKKyAgICAgICAgICAgIHRoaXMuZGVzdCA9IHBhcmVudC5kZXN0OworICAgICAgICAgICAgdGhpcy5iYXNlT2Zmc2V0ID0gcGFyZW50LmJhc2VPZmZzZXQ7CisgICAgICAgICAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPSBkZXN0LnBvc2l0aW9uKCkgKyBiYXNlT2Zmc2V0OworICAgICAgICAgICAgY2hpbGRyZW5Ub0NsZWFyID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKworICAgICAgICBXcml0ZVBhcnRpYWxSZWN1cnNpb24oTm9kZTxWQUxVRT4gbm9kZSwgRGF0YU91dHB1dFBsdXMgZGVzdCwgbG9uZyBiYXNlT2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihub2RlLCBub2RlLmNoaWxkcmVuLml0ZXJhdG9yKCksIG51bGwpOworICAgICAgICAgICAgdGhpcy5kZXN0ID0gZGVzdDsKKyAgICAgICAgICAgIHRoaXMuYmFzZU9mZnNldCA9IGJhc2VPZmZzZXQ7CisgICAgICAgICAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPSBkZXN0LnBvc2l0aW9uKCkgKyBiYXNlT2Zmc2V0OworICAgICAgICAgICAgY2hpbGRyZW5Ub0NsZWFyID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiRHVwbGljYXRlZENvZGUiKSAvLyBpbnRlbnRpb25hbGx5IGR1cGxpY2F0ZXMgSW5jcmVtZW50YWxUcmllV3JpdGVyUGFnZUF3YXJlIGFuZCBvblN0YWNrIGNvZGUKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFJlY3Vyc2lvbjxOb2RlPFZBTFVFPj4gbWFrZUNoaWxkKE5vZGU8VkFMVUU+IGNoaWxkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2hpbGQuZmlsZVBvcyA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGlsZHJlblRvQ2xlYXIuYWRkKGNoaWxkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdyaXRlUGFydGlhbFJlY3Vyc2lvbihjaGlsZCwgdGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBjb21wbGV0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBsb25nIG5vZGVQb3NpdGlvbiA9IGRlc3QucG9zaXRpb24oKSArIGJhc2VPZmZzZXQ7CisKKyAgICAgICAgICAgIGlmIChub2RlLmhhc091dE9mUGFnZUluQnJhbmNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgYnJhbmNoIHNpemUgd2l0aCB0aGUgc2l6ZSBvZiB3aGF0IHdlIGhhdmUganVzdCB3cml0dGVuLiBUaGlzIG1heSBiZSB1c2VkIGJ5IHRoZSBub2RlJ3MKKyAgICAgICAgICAgICAgICAvLyBtYXhQb3NpdGlvbkRlbHRhLCBhbmQgaXQncyBhIGJldHRlciBhcHByb3hpbWF0aW9uIGZvciBsYXRlciBmaXR0aW5nIGNhbGN1bGF0aW9ucy4KKyAgICAgICAgICAgICAgICBub2RlLmJyYW5jaFNpemUgPSAoaW50KSAobm9kZVBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlcmlhbGl6ZXIud3JpdGUoZGVzdCwgbm9kZSwgbm9kZVBvc2l0aW9uKTsKKworICAgICAgICAgICAgaWYgKG5vZGUuaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gfHwgbm9kZS5oYXNPdXRPZlBhZ2VJbkJyYW5jaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG5vZGUgc2l6ZSB3aXRoIHdoYXQgd2UgaGF2ZSBqdXN0IHNlZW4uIEl0J3MgYSBiZXR0ZXIgYXBwcm94aW1hdGlvbiBmb3IgbGF0ZXIgZml0dGluZworICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0aW9ucy4KKyAgICAgICAgICAgICAgICBsb25nIGVuZFBvc2l0aW9uID0gZGVzdC5wb3NpdGlvbigpICsgYmFzZU9mZnNldDsKKyAgICAgICAgICAgICAgICBub2RlLm5vZGVTaXplID0gKGludCkgKGVuZFBvc2l0aW9uIC0gbm9kZVBvc2l0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChOb2RlPFZBTFVFPiBjaGlsZCA6IGNoaWxkcmVuVG9DbGVhcikKKyAgICAgICAgICAgICAgICBjaGlsZC5maWxlUG9zID0gLTE7CisKKyAgICAgICAgICAgIG5vZGUuZmlsZVBvcyA9IG5vZGVQb3NpdGlvbjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL0luY3JlbWVudGFsVHJpZVdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvSW5jcmVtZW50YWxUcmllV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjMWU0YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL0luY3JlbWVudGFsVHJpZVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKKworLyoqCisgKiBDb21tb24gaW50ZXJmYWNlIGZvciBpbmNyZW1lbnRhbCB0cmllIHdyaXRlcnMuIEluY3JlbWVudGFsIHdyaXRlcnMgdGFrZSBzb3J0ZWQgaW5wdXQgdG8gY29uc3RydWN0IGEgdHJpZSBmaWxlIHdoaWxlCisgKiBidWZmZXJpbmcgb25seSBsaW1pdGVkIGFtb3VudCBvZiBkYXRhLgorICogVGhlIHdyaXRpbmcgaXRzZWxmIGlzIGRvbmUgYnkgc29tZSBub2RlIHNlcmlhbGl6ZXIgcGFzc2VkIG9uIGNvbnN0cnVjdGlvbiB0aW1lLgorICogPHA+CisgKiBTZWUge0Bjb2RlIG9yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlGb3JtYXQubWR9IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBtZWNoYW5pc21zIG9mIHdyaXRpbmcKKyAqIGFuZCByZWFkaW5nIGFuIG9uLWRpc2sgdHJpZS4KKyAqLworcHVibGljIGludGVyZmFjZSBJbmNyZW1lbnRhbFRyaWVXcml0ZXI8VkFMVUU+IGV4dGVuZHMgQXV0b0Nsb3NlYWJsZQoreworICAgIC8qKgorICAgICAqIEFkZCBhbiBlbnRyeSB0byB0aGUgdHJpZSB3aXRoIHRoZSBhc3NvY2lhdGVkIHZhbHVlLgorICAgICAqLworICAgIHZvaWQgYWRkKEJ5dGVDb21wYXJhYmxlIG5leHQsIFZBTFVFIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhZGRlZCBlbnRyaWVzLgorICAgICAqLworICAgIGxvbmcgY291bnQoKTsKKworICAgIC8qKgorICAgICAqIENvbXBsZXRlIHRoZSBwcm9jZXNzIGFuZCByZXR1cm4gdGhlIHBvc2l0aW9uIGluIHRoZSBmaWxlIG9mIHRoZSByb290IG5vZGUuCisgICAgICovCisgICAgbG9uZyBjb21wbGV0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIHZvaWQgY2xvc2UoKTsKKworICAgIC8qKgorICAgICAqIE1ha2UgYSB0ZW1wb3JhcnkgaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bndyaXR0ZW4gbm9kZXMgdGhhdCBjb3ZlcnMgZXZlcnl0aGluZyBhZGRlZCB0byB0aGUgdHJpZSB1bnRpbAorICAgICAqIHRoaXMgcG9pbnQuIFRoZSBvYmplY3QgcmV0dXJuZWQgcmVwcmVzZW50cyBhICJ0YWlsIiBmb3IgdGhlIGZpbGUgdGhhdCBuZWVkcyB0byBiZSBhdHRhY2hlZCBhdCB0aGUgImN1dG9mZiIgcG9pbnQKKyAgICAgKiB0byB0aGUgZmlsZSAodXNpbmcgZS5nLiBUYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXIpLgorICAgICAqLworICAgIFBhcnRpYWxUYWlsIG1ha2VQYXJ0aWFsUm9vdCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworCisgICAgaW50ZXJmYWNlIFBhcnRpYWxUYWlsCisgICAgeworICAgICAgICAvKiogUG9zaXRpb24gb2YgdGhlIHJvb3Qgb2YgdGhlIHBhcnRpYWwgcmVwcmVzZW50YXRpb24uIFJlc2lkZXMgaW4gdGhlIHRhaWwgYnVmZmVyLiAqLyAKKyAgICAgICAgbG9uZyByb290KCk7CisgICAgICAgIC8qKiBOdW1iZXIgb2Yga2V5cyB3cml0dGVuICovCisgICAgICAgIGxvbmcgY291bnQoKTsKKyAgICAgICAgLyoqIEN1dG9mZiBwb2ludC4gUG9zaXRpb25zIGxvd2VyIHRoYXQgdGhpcyBhcmUgdG8gYmUgcmVhZCBmcm9tIHRoZSBmaWxlOyBoaWdoZXIgb25lcyBmcm9tIHRoZSB0YWlsIGJ1ZmZlci4gKi8KKyAgICAgICAgbG9uZyBjdXRvZmYoKTsKKyAgICAgICAgLyoqIEJ1ZmZlciBjb250YWluaW5nIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGFpbC4gKi8KKyAgICAgICAgQnl0ZUJ1ZmZlciB0YWlsKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgc3VpdGFibGUgdHJpZSB3cml0ZXIuCisgICAgICovCisgICAgc3RhdGljIDxWQUxVRT4gSW5jcmVtZW50YWxUcmllV3JpdGVyPFZBTFVFPiBvcGVuKFRyaWVTZXJpYWxpemVyPFZBTFVFLCA/IHN1cGVyIERhdGFPdXRwdXRQbHVzPiB0cmllU2VyaWFsaXplciwgRGF0YU91dHB1dFBsdXMgZGVzdCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgSW5jcmVtZW50YWxEZWVwVHJpZVdyaXRlclBhZ2VBd2FyZTw+KHRyaWVTZXJpYWxpemVyLCBkZXN0KTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvSW5jcmVtZW50YWxUcmllV3JpdGVyQmFzZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvSW5jcmVtZW50YWxUcmllV3JpdGVyQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NjA5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9JbmNyZW1lbnRhbFRyaWVXcml0ZXJCYXNlLmphdmEKQEAgLTAsMCArMSwyNjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheURlcXVlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkRlcXVlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZVNvdXJjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkxpZ2h0d2VpZ2h0UmVjeWNsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5UaHJlYWRMb2NhbHM7CisKKy8qKgorICogSGVscGVyIGJhc2UgY2xhc3MgZm9yIGluY3JlbWVudGFsIHRyaWUgYnVpbGRlcnMuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbmNyZW1lbnRhbFRyaWVXcml0ZXJCYXNlPFZBTFVFLCBERVNULCBOT0RFIGV4dGVuZHMgSW5jcmVtZW50YWxUcmllV3JpdGVyQmFzZS5CYXNlTm9kZTxWQUxVRSwgTk9ERT4+CitpbXBsZW1lbnRzIEluY3JlbWVudGFsVHJpZVdyaXRlcjxWQUxVRT4KK3sKKyAgICBwcm90ZWN0ZWQgZmluYWwgRGVxdWU8Tk9ERT4gc3RhY2sgPSBuZXcgQXJyYXlEZXF1ZTw+KCk7CisgICAgcHJvdGVjdGVkIGZpbmFsIFRyaWVTZXJpYWxpemVyPFZBTFVFLCA/IHN1cGVyIERFU1Q+IHNlcmlhbGl6ZXI7CisgICAgcHJvdGVjdGVkIGZpbmFsIERFU1QgZGVzdDsKKyAgICBwcm90ZWN0ZWQgQnl0ZUNvbXBhcmFibGUgcHJldiA9IG51bGw7CisgICAgbG9uZyBjb3VudCA9IDA7CisKKyAgICBwcm90ZWN0ZWQgSW5jcmVtZW50YWxUcmllV3JpdGVyQmFzZShUcmllU2VyaWFsaXplcjxWQUxVRSwgPyBzdXBlciBERVNUPiBzZXJpYWxpemVyLCBERVNUIGRlc3QsIE5PREUgcm9vdCkKKyAgICB7CisgICAgICAgIHRoaXMuc2VyaWFsaXplciA9IHNlcmlhbGl6ZXI7CisgICAgICAgIHRoaXMuZGVzdCA9IGRlc3Q7CisgICAgICAgIHRoaXMuc3RhY2suYWRkTGFzdChyb290KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNldChOT0RFIHJvb3QpCisgICAgeworICAgICAgICB0aGlzLnByZXYgPSBudWxsOworICAgICAgICB0aGlzLmNvdW50ID0gMDsKKyAgICAgICAgdGhpcy5zdGFjay5jbGVhcigpOworICAgICAgICB0aGlzLnN0YWNrLmFkZExhc3Qocm9vdCk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICB0aGlzLnByZXYgPSBudWxsOworICAgICAgICB0aGlzLmNvdW50ID0gMDsKKyAgICAgICAgdGhpcy5zdGFjay5jbGVhcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZChCeXRlQ29tcGFyYWJsZSBuZXh0LCBWQUxVRSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICArK2NvdW50OworICAgICAgICBpbnQgc3RhY2twb3MgPSAwOworICAgICAgICBCeXRlU291cmNlIHNuID0gbmV4dC5hc0NvbXBhcmFibGVCeXRlcyhXYWxrZXIuQllURV9DT01QQVJBQkxFX1ZFUlNJT04pOworICAgICAgICBpbnQgbiA9IHNuLm5leHQoKTsKKworICAgICAgICBpZiAocHJldiAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlU291cmNlIHNwID0gcHJldi5hc0NvbXBhcmFibGVCeXRlcyhXYWxrZXIuQllURV9DT01QQVJBQkxFX1ZFUlNJT04pOworICAgICAgICAgICAgaW50IHAgPSBzcC5uZXh0KCk7CisgICAgICAgICAgICB3aGlsZSAoIG4gPT0gcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IG4gIT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNIDogU3RyaW5nLmZvcm1hdCgiSW5jcmVtZW50YWwgdHJpZSByZXF1aXJlcyB1bmlxdWUgc29ydGVkIGtleXMsIGdvdCBlcXVhbCAlcyglcykgYWZ0ZXIgJXMoJXMpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dC5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFdhbGtlci5CWVRFX0NPTVBBUkFCTEVfVkVSU0lPTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFdhbGtlci5CWVRFX0NPTVBBUkFCTEVfVkVSU0lPTikpOworCisgICAgICAgICAgICAgICAgKytzdGFja3BvczsKKyAgICAgICAgICAgICAgICBuID0gc24ubmV4dCgpOworICAgICAgICAgICAgICAgIHAgPSBzcC5uZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQgcCA8IG4gOiBTdHJpbmcuZm9ybWF0KCJJbmNyZW1lbnRhbCB0cmllIHJlcXVpcmVzIHNvcnRlZCBrZXlzLCBnb3QgJXMoJXMpIGFmdGVyICVzKCVzKS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0LmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoV2Fsa2VyLkJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFdhbGtlci5CWVRFX0NPTVBBUkFCTEVfVkVSU0lPTikpOworICAgICAgICB9CisgICAgICAgIHByZXYgPSBuZXh0OworCisgICAgICAgIHdoaWxlIChzdGFjay5zaXplKCkgPiBzdGFja3BvcyArIDEpCisgICAgICAgICAgICBjb21wbGV0ZUxhc3QoKTsKKworICAgICAgICBOT0RFIG5vZGUgPSBzdGFjay5nZXRMYXN0KCk7CisgICAgICAgIHdoaWxlIChuICE9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSkKKyAgICAgICAgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUuYWRkQ2hpbGQoKGJ5dGUpIG4pOworICAgICAgICAgICAgc3RhY2suYWRkTGFzdChub2RlKTsKKyAgICAgICAgICAgICsrc3RhY2twb3M7CisgICAgICAgICAgICBuID0gc24ubmV4dCgpOworICAgICAgICB9CisKKyAgICAgICAgVkFMVUUgZXhpc3RpbmdQYXlsb2FkID0gbm9kZS5zZXRQYXlsb2FkKHZhbHVlKTsKKyAgICAgICAgYXNzZXJ0IGV4aXN0aW5nUGF5bG9hZCA9PSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGNvbXBsZXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBOT0RFIHJvb3QgPSBzdGFjay5nZXRGaXJzdCgpOworICAgICAgICBpZiAocm9vdC5maWxlUG9zICE9IC0xKQorICAgICAgICAgICAgcmV0dXJuIHJvb3QuZmlsZVBvczsKKworICAgICAgICByZXR1cm4gcGVyZm9ybUNvbXBsZXRpb24oKS5maWxlUG9zOworICAgIH0KKworICAgIE5PREUgcGVyZm9ybUNvbXBsZXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIE5PREUgcm9vdCA9IG51bGw7CisgICAgICAgIHdoaWxlICghc3RhY2suaXNFbXB0eSgpKQorICAgICAgICAgICAgcm9vdCA9IGNvbXBsZXRlTGFzdCgpOworICAgICAgICBzdGFjay5hZGRMYXN0KHJvb3QpOworICAgICAgICByZXR1cm4gcm9vdDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBjb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIE5PREUgY29tcGxldGVMYXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBOT0RFIG5vZGUgPSBzdGFjay5yZW1vdmVMYXN0KCk7CisgICAgICAgIGNvbXBsZXRlKG5vZGUpOworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICBhYnN0cmFjdCB2b2lkIGNvbXBsZXRlKE5PREUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICBhYnN0cmFjdCBwdWJsaWMgUGFydGlhbFRhaWwgbWFrZVBhcnRpYWxSb290KCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgc3RhdGljIGNsYXNzIFBUYWlsIGltcGxlbWVudHMgUGFydGlhbFRhaWwKKyAgICB7CisgICAgICAgIGxvbmcgcm9vdDsKKyAgICAgICAgbG9uZyBjdXRvZmY7CisgICAgICAgIGxvbmcgY291bnQ7CisgICAgICAgIEJ5dGVCdWZmZXIgdGFpbDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgcm9vdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByb290OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGN1dG9mZigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjdXRvZmY7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgdGFpbCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0YWlsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGNvdW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEJhc2VOb2RlPFZBTFVFLCBOT0RFIGV4dGVuZHMgQmFzZU5vZGU8VkFMVUUsIE5PREU+PiBpbXBsZW1lbnRzIFNlcmlhbGl6YXRpb25Ob2RlPFZBTFVFPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENISUxEUkVOX0xJU1RfUkVDWUNMRVJfTElNSVQgPSAxMDI0OworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaWdodHdlaWdodFJlY3ljbGVyPEFycmF5TGlzdD4gQ0hJTERSRU5fTElTVF9SRUNZQ0xFUiA9IFRocmVhZExvY2Fscy5jcmVhdGVMaWdodHdlaWdodFJlY3ljbGVyKENISUxEUkVOX0xJU1RfUkVDWUNMRVJfTElNSVQpOworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3QgRU1QVFlfTElTVCA9IG5ldyBBcnJheUxpc3Q8PigwKTsKKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAicmF3dHlwZXMiIH0pCisgICAgICAgIHByaXZhdGUgc3RhdGljIDxOT0RFPiBBcnJheUxpc3Q8Tk9ERT4gYWxsb2NhdGVDaGlsZHJlbkxpc3QoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ0hJTERSRU5fTElTVF9SRUNZQ0xFUi5yZXVzZU9yQWxsb2NhdGUoKCkgLT4gbmV3IEFycmF5TGlzdCg0KSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyA8Tk9ERT4gdm9pZCByZWN5Y2xlQ2hpbGRyZW5MaXN0KEFycmF5TGlzdDxOT0RFPiBjaGlsZHJlbikKKyAgICAgICAgeworICAgICAgICAgICAgQ0hJTERSRU5fTElTVF9SRUNZQ0xFUi50cnlSZWN5Y2xlKGNoaWxkcmVuKTsKKyAgICAgICAgfQorCisgICAgICAgIFZBTFVFIHBheWxvYWQ7CisgICAgICAgIEFycmF5TGlzdDxOT0RFPiBjaGlsZHJlbjsKKyAgICAgICAgZmluYWwgaW50IHRyYW5zaXRpb247CisgICAgICAgIGxvbmcgZmlsZVBvcyA9IC0xOworCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBCYXNlTm9kZShpbnQgdHJhbnNpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgY2hpbGRyZW4gPSBFTVBUWV9MSVNUOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gdHJhbnNpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBWQUxVRSBwYXlsb2FkKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVkFMVUUgc2V0UGF5bG9hZChWQUxVRSBuZXdQYXlsb2FkKQorICAgICAgICB7CisgICAgICAgICAgICBWQUxVRSBwID0gcGF5bG9hZDsKKyAgICAgICAgICAgIHBheWxvYWQgPSBuZXdQYXlsb2FkOworICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTk9ERSBhZGRDaGlsZChieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBjaGlsZHJlbi5pc0VtcHR5KCkgfHwgKGNoaWxkcmVuLmdldChjaGlsZHJlbi5zaXplKCkgLSAxKS50cmFuc2l0aW9uICYgMHhGRikgPCAoYiAmIDB4RkYpOworICAgICAgICAgICAgTk9ERSBub2RlID0gbmV3Tm9kZShiKTsKKyAgICAgICAgICAgIGlmIChjaGlsZHJlbiA9PSBFTVBUWV9MSVNUKQorICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gYWxsb2NhdGVDaGlsZHJlbkxpc3QoKTsKKworICAgICAgICAgICAgY2hpbGRyZW4uYWRkKG5vZGUpOworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGNoaWxkQ291bnQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4uc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBmaW5hbGl6ZVdpdGhQb3NpdGlvbihsb25nIHBvc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmZpbGVQb3MgPSBwb3NpdGlvbjsKKworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBub3QgaG9sZGluZyBvbiB0byBwb2ludGVycyB0byBkYXRhIHdlIG5vIGxvbmdlciBuZWVkCisgICAgICAgICAgICAvLyAob3RoZXJ3aXNlIHdlIGtlZXAgdGhlIHdob2xlIHRyaWUgaW4gbWVtb3J5KS4KKyAgICAgICAgICAgIGlmIChjaGlsZHJlbiAhPSBFTVBUWV9MSVNUKQorICAgICAgICAgICAgICAgIC8vIHRoZSByZWN5Y2xlciB3aWxsIGFsc28gY2xlYXIgdGhlIGNvbGxlY3Rpb24gYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgcG9vbAorICAgICAgICAgICAgICAgIHJlY3ljbGVDaGlsZHJlbkxpc3QoY2hpbGRyZW4pOworCisgICAgICAgICAgICBjaGlsZHJlbiA9IG51bGw7CisgICAgICAgICAgICBwYXlsb2FkID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNpdGlvbihpbnQgaSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuLmdldChpKS50cmFuc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTAyeCIsIHRyYW5zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgYWJzdHJhY3QgTk9ERSBuZXdOb2RlKGJ5dGUgdHJhbnNpdGlvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvSW5jcmVtZW50YWxUcmllV3JpdGVyUGFnZUF3YXJlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9JbmNyZW1lbnRhbFRyaWVXcml0ZXJQYWdlQXdhcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjc0OTc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvSW5jcmVtZW50YWxUcmllV3JpdGVyUGFnZUF3YXJlLmphdmEKQEAgLTAsMCArMSw0NjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5OYXZpZ2FibGVTZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLmNvbmN1cnJlbnQuTm90VGhyZWFkU2FmZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworCisvKioKKyAqIEluY3JlbWVudGFsIGJ1aWxkZXJzIG9mIG9uLWRpc2sgdHJpZXMgd2hpY2ggcGFja3MgdHJpZSBzdGFnZXMgaW50byBkaXNrIGNhY2hlIHBhZ2VzLgorICoKKyAqIFRoZSBpbmNyZW1lbnRhbCBjb3JlIGlzIGFzIGluIHtAbGluayBJbmNyZW1lbnRhbFRyaWVXcml0ZXJTaW1wbGV9LCB3aGljaCB0aGlzIGF1Z21lbnRzIGJ5OgorICogPHVsPgorICogICA8bGk+IGNhbGN1bGF0aW5nIGJyYW5jaCBzaXplcyByZWZsZWN0aW5nIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gc3RvcmUgdGhlIHRyaWUKKyAqICAgICBicmFuY2ggcm9vdGVkIGF0IGVhY2ggbm9kZQorICogICA8bGk+IGRlbGF5aW5nIHdyaXRpbmcgYW55IHBhcnQgb2YgYSBjb21wbGV0ZWQgbm9kZSB1bnRpbCBpdHMgYnJhbmNoIHNpemUgaXMgYWJvdmUgdGhlIHBhZ2Ugc2l6ZQorICogICA8bGk+IGxheWluZyBvdXQgKHNvbWUgb2YpIGl0cyBjaGlsZHJlbiBicmFuY2hlcyAoZWFjaCBzbWFsbGVyIHRoYW4gYSBwYWdlKSB0byBiZSBjb250YWluZWQgd2l0aGluIGEgcGFnZQorICogICA8bGk+IGFkanVzdGluZyB0aGUgYnJhbmNoIHNpemUgdG8gcmVmbGVjdCB0aGUgZmFjdCB0aGF0IHRoZSBjaGlsZHJlbiBhcmUgbm93IHdyaXR0ZW4gKGkuZS4gcmVtb3ZpbmcgdGhlaXIgc2l6ZSkKKyAqIDwvdWw+CisgKiA8cD4KKyAqIFRoZSBwcm9jZXNzIGlzIGJvdHRvbS11cCwgaS5lLiBwYWdlcyBhcmUgcGFja2VkIGF0IHRoZSBib3R0b20gYW5kIHRoZSByb290IHBhZ2UgaXMgdXN1YWxseSBzbWFsbGVyLgorICogVGhpcyBtYXkgYXBwZWFyIGxlc3MgZWZmaWNpZW50IHRoYW4gYSB0b3AtZG93biBwcm9jZXNzIHdoaWNoIHB1dHMgbW9yZSBpbmZvcm1hdGlvbiBpbiB0aGUgdG9wIHBhZ2VzIHRoYXQKKyAqIHRlbmQgdG8gc3RheSBpbiBjYWNoZSwgYnV0IGluIGJvdGggY2FzZXMgcGVyZm9ybWluZyBhIHNlYXJjaCB3aWxsIHVzdWFsbHkgcmVxdWlyZSBhbiBhZGRpdGlvbmFsIGRpc2sgcmVhZAorICogZm9yIHRoZSBsZWFmIHBhZ2UuIFdoZW4gd2UgbWF4aW1pemUgdGhlIGFtb3VudCBvZiByZWxldmFudCBkYXRhIHRoYXQgcmVhZCBicmluZ3MgYnkgdXNpbmcgdGhlIGJvdHRvbS11cAorICogcHJvY2Vzcywgd2UgaGF2ZSBwcmFjdGljYWxseSB0aGUgc2FtZSBlZmZpY2llbmN5IHdpdGggc21hbGxlciBpbnRlcm1lZGlhdGUgcGFnZSBmb290cHJpbnQsIGkuZS4gZmV3ZXIgZGF0YQorICogdG8ga2VlcCBpbiBjYWNoZS4KKyAqIDxwPgorICogQXMgYW4gZXhhbXBsZSwgdGFraW5nIGEgc2FtcGxlIHBhZ2Ugc2l6ZSBmaXR0aW5nIDQgbm9kZXMsIGEgc2ltcGxlIHRyaWUgd291bGQgYmUgc3BsaXQgbGlrZSB0aGlzOgorICogPHByZT4KKyAqIE5vZGUgMCB8CisgKiAgIC1hLT4gfCBOb2RlIDEKKyAqICAgICAgICB8ICAgLXMtPiBOb2RlIDIKKyAqICAgICAgICB8ICAgICAgICAgIC1rLT4gTm9kZSAzIChwYXlsb2FkIDEpCisgKiAgICAgICAgfCAgICAgICAgICAtcy0+IE5vZGUgNCAocGF5bG9hZCAyKQorICogICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgIC1iLT4gTm9kZSA1IHwKKyAqICAgICAgICAgIC1hLT4gfE5vZGUgNgorICogICAgICAgICAgICAgICB8ICAtbi0+IE5vZGUgNworICogICAgICAgICAgICAgICB8ICAgICAgICAgLWstPiBOb2RlIDggKHBheWxvYWQgMykKKyAqICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAtcy0+IE5vZGUgOSAocGF5bG9hZCA0KQorICogPC9wcmU+CisgKiB3aGVyZSBsaW5lcyBkZW5vdGUgcGFnZSBib3VuZGFyaWVzLgorICogPHA+CisgKiBUaGUgcHJvY2VzcyBpdHNlbGYgd2lsbCBzdGFydCBieSBhZGRpbmcgImFzayIgd2hpY2ggYWRkcyB0aHJlZSBub2RlcyBhZnRlciB0aGUgcm9vdCB0byB0aGUgc3RhY2suIEFkZGluZyAiYXNzIgorICogY29tcGxldGVzIE5vZGUgMywgc2V0dGluZyBpdHMgYnJhbmNoIGEgc2l6ZSBvZiAxIGFuZCByZXBsYWNlcyBpdCBvbiB0aGUgc3RhY2sgd2l0aCBOb2RlIDQuCisgKiBUaGUgc3RlcCBvZiBhZGRpbmcgImJhbmsiIHN0YXJ0cyBieSBjb21wbGV0aW5nIE5vZGUgNCAoc2l6ZSAxKSwgTm9kZSAyIChzaXplIDMpLCBOb2RlIDEgKHNpemUgNCksIHRoZW4gYWRkcyA0IG1vcmUKKyAqIG5vZGVzIHRvIHRoZSBzdGFjay4gQWRkaW5nICJiYW5rcyIgZGVzY2VuZHMgb25lIG1vcmUgbm9kZS4KKyAqIDxwPgorICogVGhlIHRyaWUgY29tcGxldGlvbiBzdGVwIGNvbXBsZXRlcyBub2RlcyA5IChzaXplIDEpLCA4IChzaXplIDIpLCA3IChzaXplIDMpLCA2IChzaXplIDQpLCA1IChzaXplIDUpLiBTaW5jZSB0aGUgc2l6ZQorICogb2Ygbm9kZSA1IGlzIGFib3ZlIHRoZSBwYWdlIHNpemUsIHRoZSBhbGdvcml0aG0gbGF5cyBvdXQgaXRzIGNoaWxkcmVuLiBOb2RlcyA2LCA3LCA4LCA5IGFyZSB3cml0dGVuIGluIG9yZGVyLiBUaGUKKyAqIHNpemUgb2Ygbm9kZSA1IGlzIG5vdyBqdXN0IHRoZSBzaXplIG9mIGl0IGluZGl2aWR1YWxseSwgMS4gVGhlIHByb2Nlc3MgY29udGludWVzIHdpdGggY29tcGxldGluZyBOb2RlIDAgKHNpemUgNikuCisgKiBUaGlzIGlzIGJpZ2dlciB0aGFuIHRoZSBwYWdlIHNpemUsIHNvIHNvbWUgb2YgaXRzIGNoaWxkcmVuIG5lZWQgdG8gYmUgd3JpdHRlbi4gVGhlIGFsZ29yaXRobSB0YWtlcyB0aGUgbGFyZ2VzdCwKKyAqIE5vZGUgMSwgYW5kIGxheXMgaXQgb3V0IHdpdGggaXRzIGNoaWxkcmVuIGluIHRoZSBmaWxlLiBOb2RlIDAgbm93IGhhcyBhbiBhZGp1c3RlZCBzaXplIG9mIDIgd2hpY2ggaXMgYmVsb3cgdGhlCisgKiBwYWdlIHNpemUsIGFuZCB3ZSBjYW4gY29udGludWUgdGhlIHByb2Nlc3MuCisgKiA8cD4KKyAqIFNpbmNlIHRoaXMgd2FzIHRoZSByb290IG9mIHRoZSB0cmllLCB0aGUgY3VycmVudCBwYWdlIGlzIHBhZGRlZCBhbmQgdGhlIHJlbWFpbmluZyBub2RlcyAwLCA1IGFyZSB3cml0dGVuLgorICovCitATm90VGhyZWFkU2FmZQorcHVibGljIGNsYXNzIEluY3JlbWVudGFsVHJpZVdyaXRlclBhZ2VBd2FyZTxWQUxVRT4KK2V4dGVuZHMgSW5jcmVtZW50YWxUcmllV3JpdGVyQmFzZTxWQUxVRSwgRGF0YU91dHB1dFBsdXMsIEluY3JlbWVudGFsVHJpZVdyaXRlclBhZ2VBd2FyZS5Ob2RlPFZBTFVFPj4KK2ltcGxlbWVudHMgSW5jcmVtZW50YWxUcmllV3JpdGVyPFZBTFVFPgoreworICAgIGZpbmFsIGludCBtYXhCeXRlc1BlclBhZ2U7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBDb21wYXJhdG9yPE5vZGU8Pz4+IEJSQU5DSF9TSVpFX0NPTVBBUkFUT1IgPSAobCwgcikgLT4KKyAgICB7CisgICAgICAgIC8vIFNtYWxsZXIgYnJhbmNoZXMgZmlyc3QuCisgICAgICAgIGludCBjID0gSW50ZWdlci5jb21wYXJlKGwuYnJhbmNoU2l6ZSArIGwubm9kZVNpemUsIHIuYnJhbmNoU2l6ZSArIHIubm9kZVNpemUpOworICAgICAgICBpZiAoYyAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIGM7CisKKyAgICAgICAgLy8gVGhlbiBvcmRlciBieSBjaGFyYWN0ZXIsIHdoaWNoIHNlcnZlcyBzZXZlcmFsIHB1cnBvc2VzOgorICAgICAgICAvLyAtIGVuZm9yY2VzIGluZXF1YWxpdHkgdG8gbWFrZSBzdXJlIGVxdWFsIHNpemVzIGFyZW4ndCB0cmVhdGVkIGFzIGR1cGxpY2F0ZXMsCisgICAgICAgIC8vIC0gbWFrZXMgc3VyZSB0aGUgaXRlbSB3ZSB1c2UgZm9yIGNvbXBhcmlzb24ga2V5IGNvbWVzIGdyZWF0ZXIgdGhhbiBhbGwgZXF1YWwtc2l6ZWQgbm9kZXMsCisgICAgICAgIC8vIC0gb3JkZXJzIGVxdWFsIHNpemVkIGl0ZW1zIHNvIHRoYXQgbW9zdCByZWNlbnRseSBwcm9jZXNzZWQgKGFuZCBwb3RlbnRpYWxseSBoYXZpbmcgY2xvc2VyIGNoaWxkcmVuKSBjb21lcworICAgICAgICAvLyAgIGxhc3QgYW5kIGlzIHRodXMgdGhlIGZpcnN0IG9uZSBwaWNrZWQgZm9yIGxheW91dC4KKyAgICAgICAgYyA9IEludGVnZXIuY29tcGFyZShsLnRyYW5zaXRpb24sIHIudHJhbnNpdGlvbik7CisKKyAgICAgICAgYXNzZXJ0IGMgIT0gMCB8fCBsID09IHI7CisgICAgICAgIHJldHVybiBjOworICAgIH07CisKKyAgICBJbmNyZW1lbnRhbFRyaWVXcml0ZXJQYWdlQXdhcmUoVHJpZVNlcmlhbGl6ZXI8VkFMVUUsID8gc3VwZXIgRGF0YU91dHB1dFBsdXM+IHRyaWVTZXJpYWxpemVyLCBEYXRhT3V0cHV0UGx1cyBkZXN0KQorICAgIHsKKyAgICAgICAgc3VwZXIodHJpZVNlcmlhbGl6ZXIsIGRlc3QsIG5ldyBOb2RlPD4oKGJ5dGUpIDApKTsKKyAgICAgICAgdGhpcy5tYXhCeXRlc1BlclBhZ2UgPSBkZXN0Lm1heEJ5dGVzSW5QYWdlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzZXQoKQorICAgIHsKKyAgICAgICAgcmVzZXQobmV3IE5vZGU8PigoYnl0ZSkgMCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIE5vZGU8VkFMVUU+IHBlcmZvcm1Db21wbGV0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBOb2RlPFZBTFVFPiByb290ID0gc3VwZXIucGVyZm9ybUNvbXBsZXRpb24oKTsKKworICAgICAgICBpbnQgYWN0dWFsU2l6ZSA9IHJlY2FsY1RvdGFsU2l6ZShyb290LCBkZXN0LnBvc2l0aW9uKCkpOworICAgICAgICBpbnQgYnl0ZXNMZWZ0ID0gZGVzdC5ieXRlc0xlZnRJblBhZ2UoKTsKKyAgICAgICAgaWYgKGFjdHVhbFNpemUgPiBieXRlc0xlZnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChhY3R1YWxTaXplIDw9IG1heEJ5dGVzUGVyUGFnZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZXN0LnBhZFRvUGFnZUJvdW5kYXJ5KCk7CisgICAgICAgICAgICAgICAgYnl0ZXNMZWZ0ID0gbWF4Qnl0ZXNQZXJQYWdlOworICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIGNoYW5nZWQsIHJlY2FsY3VsYXRlIGFnYWluCisgICAgICAgICAgICAgICAgYWN0dWFsU2l6ZSA9IHJlY2FsY1RvdGFsU2l6ZShyb290LCBkZXN0LnBvc2l0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYWN0dWFsU2l6ZSA+IGJ5dGVzTGVmdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBTdGlsbCBncmVhdGVyLiBMYXkgb3V0IGNoaWxkcmVuIHNlcGFyYXRlbHkuCisgICAgICAgICAgICAgICAgbGF5b3V0Q2hpbGRyZW4ocm9vdCk7CisKKyAgICAgICAgICAgICAgICAvLyBQYWQgaWYgbmVlZGVkIGFuZCBwbGFjZS4KKyAgICAgICAgICAgICAgICBpZiAocm9vdC5ub2RlU2l6ZSA+IGRlc3QuYnl0ZXNMZWZ0SW5QYWdlKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkZXN0LnBhZFRvUGFnZUJvdW5kYXJ5KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIGFnYWluIGFzIHBvaW50ZXIgc2l6ZSBtYXkgaGF2ZSBjaGFuZ2VkLCB0cmlnZ2VyaW5nIGFzc2VydGlvbiBpbiB3cml0ZVJlY3Vyc2l2ZS4KKyAgICAgICAgICAgICAgICAgICAgcmVjYWxjVG90YWxTaXplKHJvb3QsIGRlc3QucG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICByb290LmZpbmFsaXplV2l0aFBvc2l0aW9uKHdyaXRlKHJvb3QpKTsKKyAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBjb21wbGV0ZShOb2RlPFZBTFVFPiBub2RlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGFzc2VydCBub2RlLmZpbGVQb3MgPT0gLTE7CisKKyAgICAgICAgaW50IGJyYW5jaFNpemUgPSAwOworICAgICAgICBmb3IgKE5vZGU8VkFMVUU+IGNoaWxkIDogbm9kZS5jaGlsZHJlbikKKyAgICAgICAgICAgIGJyYW5jaFNpemUgKz0gY2hpbGQuYnJhbmNoU2l6ZSArIGNoaWxkLm5vZGVTaXplOworCisgICAgICAgIG5vZGUuYnJhbmNoU2l6ZSA9IGJyYW5jaFNpemU7CisKKyAgICAgICAgaW50IG5vZGVTaXplID0gc2VyaWFsaXplci5zaXplb2ZOb2RlKG5vZGUsIGRlc3QucG9zaXRpb24oKSk7CisgICAgICAgIGlmIChub2RlU2l6ZSArIGJyYW5jaFNpemUgPCBtYXhCeXRlc1BlclBhZ2UpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEdvb2QuIFRoaXMgbm9kZSBhbmQgYWxsIGNoaWxkcmVuIHdpbGwgKG1vc3QgcHJvYmFibHkpIGZpdCBwYWdlLgorICAgICAgICAgICAgbm9kZS5ub2RlU2l6ZSA9IG5vZGVTaXplOworICAgICAgICAgICAgbm9kZS5oYXNPdXRPZlBhZ2VDaGlsZHJlbiA9IGZhbHNlOworICAgICAgICAgICAgbm9kZS5oYXNPdXRPZlBhZ2VJbkJyYW5jaCA9IGZhbHNlOworCisgICAgICAgICAgICBmb3IgKE5vZGU8VkFMVUU+IGNoaWxkIDogbm9kZS5jaGlsZHJlbikKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZmlsZVBvcyAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5oYXNPdXRPZlBhZ2VDaGlsZHJlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGQuaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gfHwgY2hpbGQuaGFzT3V0T2ZQYWdlSW5CcmFuY2gpCisgICAgICAgICAgICAgICAgICAgIG5vZGUuaGFzT3V0T2ZQYWdlSW5CcmFuY2ggPSB0cnVlOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBDYW5ub3QgZml0LiBMYXkgb3V0IGNoaWxkcmVuOyBUaGUgY3VycmVudCBub2RlIHdpbGwgYmUgbWFya2VkIGFzIG9uZSB3aXRoIG91dC1vZi1wYWdlIGNoaWxkcmVuLgorICAgICAgICBsYXlvdXRDaGlsZHJlbihub2RlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbGF5b3V0Q2hpbGRyZW4oTm9kZTxWQUxVRT4gbm9kZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBhc3NlcnQgbm9kZS5maWxlUG9zID09IC0xOworCisgICAgICAgIE5hdmlnYWJsZVNldDxOb2RlPFZBTFVFPj4gY2hpbGRyZW4gPSBub2RlLmdldENoaWxkcmVuV2l0aFVuc2V0UG9zaXRpb24oKTsKKworICAgICAgICBpbnQgYnl0ZXNMZWZ0ID0gZGVzdC5ieXRlc0xlZnRJblBhZ2UoKTsKKyAgICAgICAgTm9kZTxWQUxVRT4gY21wID0gbmV3IE5vZGU8PigyNTYpOyAvLyBnb2VzIGFmdGVyIGFsbCBlcXVhbC1zaXplZCB1bnBsYWNlZCBub2RlcyAod2hvc2UgdHJhbnNpdGlvbiBjaGFyYWN0ZXIgaXMgMC0yNTUpCisgICAgICAgIGNtcC5ub2RlU2l6ZSA9IDA7CisgICAgICAgIHdoaWxlICghY2hpbGRyZW4uaXNFbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjbXAuYnJhbmNoU2l6ZSA9IGJ5dGVzTGVmdDsKKyAgICAgICAgICAgIE5vZGU8VkFMVUU+IGNoaWxkID0gY2hpbGRyZW4uaGVhZFNldChjbXAsIHRydWUpLnBvbGxMYXN0KCk7ICAgIC8vIGdyYWIgYmlnZ2VzdCB0aGF0IGNvdWxkIGZpdAorICAgICAgICAgICAgaWYgKGNoaWxkID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVzdC5wYWRUb1BhZ2VCb3VuZGFyeSgpOworICAgICAgICAgICAgICAgIGJ5dGVzTGVmdCA9IG1heEJ5dGVzUGVyUGFnZTsKKyAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkcmVuLnBvbGxMYXN0KCk7ICAgICAgIC8vIGp1c3QgYmlnZ2VzdAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnQgY2hpbGQgIT0gbnVsbDsKKyAgICAgICAgICAgIGlmIChjaGlsZC5oYXNPdXRPZlBhZ2VDaGlsZHJlbiB8fCBjaGlsZC5oYXNPdXRPZlBhZ2VJbkJyYW5jaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBkaWRuJ3Qga25vdyB3aGF0IHNpemUgdGhpcyBicmFuY2ggd2lsbCBhY3R1YWxseSBuZWVkIHRvIGJlLCBub2RlJ3MgY2hpbGRyZW4gbWF5IGJlIGZhci4KKyAgICAgICAgICAgICAgICAvLyBXZSBub3cga25vdyB3aGVyZSB3ZSB3b3VsZCBwbGFjZSBpdCwgc28gbGV0J3MgcmVldmFsdWF0ZSBzaXplLgorICAgICAgICAgICAgICAgIGludCBhY3R1YWxTaXplID0gcmVjYWxjVG90YWxTaXplKGNoaWxkLCBkZXN0LnBvc2l0aW9uKCkpOworICAgICAgICAgICAgICAgIGlmIChhY3R1YWxTaXplID4gYnl0ZXNMZWZ0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzTGVmdCA9PSBtYXhCeXRlc1BlclBhZ2UpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJyYW5jaCBkb2Vzbid0IGV2ZW4gZml0IGluIGEgcGFnZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogSW4gdGhpcyBzaXR1YXRpb24gd2UgYXJlbid0IGFjdHVhbGx5IG1ha2luZyB0aGUgYmVzdCBjaG9pY2UgYXMgdGhlIGxheW91dCBzaG91bGQgaGF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZW4gcGxhY2UgYXQgdGhlIGNoaWxkICh3aGljaCBjb3VsZCBoYXZlIG1hZGUgdGhlIGN1cnJlbnQgcGFyZW50IHNtYWxsIGVub3VnaCB0byBmaXQpLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBub3QgdHJpdmlhbCB0byBmaXggYnV0IHNob3VsZCBiZSB2ZXJ5IHJhcmUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dENoaWxkcmVuKGNoaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzTGVmdCA9IGRlc3QuYnl0ZXNMZWZ0SW5QYWdlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCAoY2hpbGQuZmlsZVBvcyA9PSAtMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGZpdCwgYnV0IHRoYXQncyBwcm9iYWJseSBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYSBmdWxsIHBhZ2UuIFB1dCBpdCBiYWNrIHdpdGggdGhlIG5ldworICAgICAgICAgICAgICAgICAgICAvLyBzaXplIGFuZCByZXRyeSB3aGVuIHdlIGRvIGhhdmUgZW5vdWdoIHNwYWNlLgorICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5hZGQoY2hpbGQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNoaWxkLmZpbmFsaXplV2l0aFBvc2l0aW9uKHdyaXRlKGNoaWxkKSk7CisgICAgICAgICAgICBieXRlc0xlZnQgPSBkZXN0LmJ5dGVzTGVmdEluUGFnZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIHNpemluZyBiZWxvdyB3aWxsIHVzZSB0aGUgYnJhbmNoIHNpemUsIHNvIG1ha2Ugc3VyZSBpdCdzIHNldC4KKyAgICAgICAgbm9kZS5icmFuY2hTaXplID0gMDsKKyAgICAgICAgbm9kZS5oYXNPdXRPZlBhZ2VDaGlsZHJlbiA9IHRydWU7CisgICAgICAgIG5vZGUuaGFzT3V0T2ZQYWdlSW5CcmFuY2ggPSBmYWxzZTsKKyAgICAgICAgbm9kZS5ub2RlU2l6ZSA9IHNlcmlhbGl6ZXIuc2l6ZW9mTm9kZShub2RlLCBkZXN0LnBvc2l0aW9uKCkpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJEdXBsaWNhdGVkQ29kZSIpIC8vIGludGVudGlvbmFsbHkgZHVwbGljYXRlZCBpbiBJbmNyZW1lbnRhbERlZXBUcmllV3JpdGVyUGFnZUF3YXJlCisgICAgcHJvdGVjdGVkIGludCByZWNhbGNUb3RhbFNpemUoTm9kZTxWQUxVRT4gbm9kZSwgbG9uZyBub2RlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKG5vZGUuaGFzT3V0T2ZQYWdlSW5CcmFuY2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzeiA9IDA7CisgICAgICAgICAgICBmb3IgKE5vZGU8VkFMVUU+IGNoaWxkIDogbm9kZS5jaGlsZHJlbikKKyAgICAgICAgICAgICAgICBzeiArPSByZWNhbGNUb3RhbFNpemUoY2hpbGQsIG5vZGVQb3NpdGlvbiArIHN6KTsKKyAgICAgICAgICAgIG5vZGUuYnJhbmNoU2l6ZSA9IHN6OworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIHNpemluZyBiZWxvdyB3aWxsIHVzZSB0aGUgYnJhbmNoIHNpemUgY2FsY3VsYXRlZCBhYm92ZS4gU2luY2UgdGhhdCBjYW4gY2hhbmdlIG9uIG91dC1vZi1wYWdlIGluIGJyYW5jaCwKKyAgICAgICAgLy8gd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgc2l6ZSBpZiBlaXRoZXIgZmxhZyBpcyBzZXQuCisgICAgICAgIGlmIChub2RlLmhhc091dE9mUGFnZUNoaWxkcmVuIHx8IG5vZGUuaGFzT3V0T2ZQYWdlSW5CcmFuY2gpCisgICAgICAgICAgICBub2RlLm5vZGVTaXplID0gc2VyaWFsaXplci5zaXplb2ZOb2RlKG5vZGUsIG5vZGVQb3NpdGlvbiArIG5vZGUuYnJhbmNoU2l6ZSk7CisKKyAgICAgICAgcmV0dXJuIG5vZGUuYnJhbmNoU2l6ZSArIG5vZGUubm9kZVNpemU7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkR1cGxpY2F0ZWRDb2RlIikgLy8gaW50ZW50aW9uYWxseSBkdXBsaWNhdGVkIGluIEluY3JlbWVudGFsRGVlcFRyaWVXcml0ZXJQYWdlQXdhcmUKKyAgICBwcm90ZWN0ZWQgbG9uZyB3cml0ZShOb2RlPFZBTFVFPiBub2RlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgbm9kZVBvc2l0aW9uID0gZGVzdC5wb3NpdGlvbigpOworICAgICAgICBmb3IgKE5vZGU8VkFMVUU+IGNoaWxkIDogbm9kZS5jaGlsZHJlbikKKyAgICAgICAgICAgIGlmIChjaGlsZC5maWxlUG9zID09IC0xKQorICAgICAgICAgICAgICAgIGNoaWxkLmZpbGVQb3MgPSB3cml0ZShjaGlsZCk7CisKKyAgICAgICAgbm9kZVBvc2l0aW9uICs9IG5vZGUuYnJhbmNoU2l6ZTsKKyAgICAgICAgYXNzZXJ0IGRlc3QucG9zaXRpb24oKSA9PSBub2RlUG9zaXRpb24KKyAgICAgICAgICAgICAgICA6ICJFeHBlY3RlZCBub2RlIHBvc2l0aW9uIHRvIGJlICIgKyBub2RlUG9zaXRpb24gKyAiIGJ1dCBnb3QgIiArIGRlc3QucG9zaXRpb24oKSArICIgYWZ0ZXIgd3JpdGluZyBjaGlsZHJlbi5cbiIgKyBkdW1wTm9kZShub2RlLCBkZXN0LnBvc2l0aW9uKCkpOworCisgICAgICAgIHNlcmlhbGl6ZXIud3JpdGUoZGVzdCwgbm9kZSwgbm9kZVBvc2l0aW9uKTsKKworICAgICAgICBhc3NlcnQgZGVzdC5wb3NpdGlvbigpID09IG5vZGVQb3NpdGlvbiArIG5vZGUubm9kZVNpemUKKyAgICAgICAgICAgICAgICB8fCBkZXN0LnBhZGRlZFBvc2l0aW9uKCkgPT0gZGVzdC5wb3NpdGlvbigpIC8vIEZvciBQYXJ0aXRpb25JbmRleFRlc3QudGVzdFBvaW50ZXJHcm93dGggd2hlcmUgcG9zaXRpb24gbWF5IGp1bXAgb24gcGFnZSBib3VuZGFyaWVzLgorICAgICAgICAgICAgICAgIDogIkV4cGVjdGVkIG5vZGUgcG9zaXRpb24gdG8gYmUgIiArIChub2RlUG9zaXRpb24gKyBub2RlLm5vZGVTaXplKSArICIgYnV0IGdvdCAiICsgZGVzdC5wb3NpdGlvbigpICsgIiBhZnRlciB3cml0aW5nIG5vZGUsIG5vZGVTaXplICIgKyBub2RlLm5vZGVTaXplICsgIi5cbiIgKyBkdW1wTm9kZShub2RlLCBub2RlUG9zaXRpb24pOworICAgICAgICByZXR1cm4gbm9kZVBvc2l0aW9uOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZHVtcE5vZGUoTm9kZTxWQUxVRT4gbm9kZSwgbG9uZyBub2RlUG9zaXRpb24pCisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKFN0cmluZy5mb3JtYXQoIkF0ICUsZCgleCkgdHlwZSAlcyBjaGlsZCBjb3VudCAlcyBub2RlU2l6ZSAlLGQgYnJhbmNoU2l6ZSAlLGQgJXMlcyVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVQb3NpdGlvbiwgbm9kZVBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpZU5vZGUudHlwZUZvcihub2RlLCBub2RlUG9zaXRpb24pLCBub2RlLmNoaWxkQ291bnQoKSwgbm9kZS5ub2RlU2l6ZSwgbm9kZS5icmFuY2hTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5oYXNPdXRPZlBhZ2VDaGlsZHJlbiA/ICJDIiA6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5oYXNPdXRPZlBhZ2VJbkJyYW5jaCA/ICJCIiA6ICIiKSk7CisgICAgICAgIGZvciAoTm9kZTxWQUxVRT4gY2hpbGQgOiBub2RlLmNoaWxkcmVuKQorICAgICAgICAgICAgcmVzLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJDaGlsZCAlMnggYXQgJSxkKCV4KSB0eXBlICVzIGNoaWxkIGNvdW50ICVzIHNpemUgJXMgbm9kZVNpemUgJSxkIGJyYW5jaFNpemUgJSxkICVzJXMlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQudHJhbnNpdGlvbiAmIDB4RkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZmlsZVBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5maWxlUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmNoaWxkcmVuICE9IG51bGwgPyBUcmllTm9kZS50eXBlRm9yKGNoaWxkLCBjaGlsZC5maWxlUG9zKSA6ICJuL2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmNoaWxkcmVuICE9IG51bGwgPyBjaGlsZC5jaGlsZENvdW50KCkgOiAibi9hIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5jaGlsZHJlbiAhPSBudWxsID8gc2VyaWFsaXplci5zaXplb2ZOb2RlKGNoaWxkLCBjaGlsZC5maWxlUG9zKSA6ICJuL2EiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm5vZGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmJyYW5jaFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gPyAiQyIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5oYXNPdXRPZlBhZ2VJbkJyYW5jaCA/ICJCIiA6ICIiKSk7CisKKyAgICAgICAgcmV0dXJuIHJlcy50b1N0cmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXJ0aWFsVGFpbCBtYWtlUGFydGlhbFJvb3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0IHRoZSBwYXJ0aWFsIHRhaWwgd2lsbCBiZSBpbiBtZW1vcnksIHNvIHdlIGRvbid0IGJvdGhlciB3aXRoIHBhZ2UtZml0dGluZy4KKyAgICAgICAgLy8gV2UgY291bGQgYWxzbyBzZW5kIHNvbWUgY29tcGxldGVkIGNoaWxkcmVuIHRvIGRpc2ssIGJ1dCB0aGF0IGNvdWxkIG1ha2Ugc3Vib3B0aW1hbCBsYXlvdXQgY2hvaWNlcywgc28gd2UnZAorICAgICAgICAvLyByYXRoZXIgbm90LiBKdXN0IHdyaXRlIGFueXRoaW5nIG5vdCB3cml0dGVuIHlldCB0byBhIGJ1ZmZlciwgZnJvbSBib3R0b20gdG8gdG9wLCBhbmQgd2UncmUgZG9uZS4KKyAgICAgICAgdHJ5IChEYXRhT3V0cHV0QnVmZmVyIGJ1ZiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBUYWlsIHRhaWwgPSBuZXcgUFRhaWwoKTsKKyAgICAgICAgICAgIC8vIFJlYWRlcnMgYXNrIHJlYnVmZmVyZXJzIGZvciBwYWdlLWFsaWduZWQgcG9zaXRpb25zLCBzbyBtYWtlIHN1cmUgdGFpbCBzdGFydHMgYXQgb25lLgorICAgICAgICAgICAgLy8gIlBhZGRpbmciIG9mIHRoZSBjdXRvZmYgcG9pbnQgbWF5IGxlYXZlIHNvbWUgdW5hZGRyZXNzYWJsZSBzcGFjZSBpbiB0aGUgY29uc3RydWN0ZWQgZmlsZSB2aWV3LgorICAgICAgICAgICAgLy8gTm90aGluZyB3aWxsIHBvaW50IHRvIGl0LCB0aG91Z2gsIHNvIHRoYXQncyBmaW5lLgorICAgICAgICAgICAgdGFpbC5jdXRvZmYgPSBkZXN0LnBhZGRlZFBvc2l0aW9uKCk7CisgICAgICAgICAgICB0YWlsLmNvdW50ID0gY291bnQ7CisgICAgICAgICAgICB0YWlsLnJvb3QgPSB3cml0ZVBhcnRpYWwoc3RhY2suZ2V0Rmlyc3QoKSwgYnVmLCB0YWlsLmN1dG9mZik7CisgICAgICAgICAgICB0YWlsLnRhaWwgPSBidWYuYXNOZXdCdWZmZXIoKTsKKyAgICAgICAgICAgIHJldHVybiB0YWlsOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkR1cGxpY2F0ZWRDb2RlIikgLy8gaW50ZW50aW9uYWxseSBkdXBsaWNhdGVkIGluIEluY3JlbWVudGFsRGVlcFRyaWVXcml0ZXJQYWdlQXdhcmUKKyAgICBwcm90ZWN0ZWQgbG9uZyB3cml0ZVBhcnRpYWwoTm9kZTxWQUxVRT4gbm9kZSwgRGF0YU91dHB1dFBsdXMgZGVzdCwgbG9uZyBiYXNlT2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgc3RhcnRQb3NpdGlvbiA9IGRlc3QucG9zaXRpb24oKSArIGJhc2VPZmZzZXQ7CisKKyAgICAgICAgTGlzdDxOb2RlPFZBTFVFPj4gY2hpbGRyZW5Ub0NsZWFyID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoTm9kZTxWQUxVRT4gY2hpbGQgOiBub2RlLmNoaWxkcmVuKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2hpbGQuZmlsZVBvcyA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGlsZHJlblRvQ2xlYXIuYWRkKGNoaWxkKTsKKyAgICAgICAgICAgICAgICBjaGlsZC5maWxlUG9zID0gd3JpdGVQYXJ0aWFsKGNoaWxkLCBkZXN0LCBiYXNlT2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgbm9kZVBvc2l0aW9uID0gZGVzdC5wb3NpdGlvbigpICsgYmFzZU9mZnNldDsKKworICAgICAgICBpZiAobm9kZS5oYXNPdXRPZlBhZ2VJbkJyYW5jaCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBicmFuY2ggc2l6ZSB3aXRoIHRoZSBzaXplIG9mIHdoYXQgd2UgaGF2ZSBqdXN0IHdyaXR0ZW4uIFRoaXMgbWF5IGJlIHVzZWQgYnkgdGhlIG5vZGUncworICAgICAgICAgICAgLy8gbWF4UG9zaXRpb25EZWx0YSwgYW5kIGl0J3MgYSBiZXR0ZXIgYXBwcm94aW1hdGlvbiBmb3IgbGF0ZXIgZml0dGluZyBjYWxjdWxhdGlvbnMuCisgICAgICAgICAgICBub2RlLmJyYW5jaFNpemUgPSAoaW50KSAobm9kZVBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBzZXJpYWxpemVyLndyaXRlKGRlc3QsIG5vZGUsIG5vZGVQb3NpdGlvbik7CisKKyAgICAgICAgaWYgKG5vZGUuaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gfHwgbm9kZS5oYXNPdXRPZlBhZ2VJbkJyYW5jaCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBub2RlIHNpemUgd2l0aCB3aGF0IHdlIGhhdmUganVzdCBzZWVuLiBJdCdzIGEgYmV0dGVyIGFwcHJveGltYXRpb24gZm9yIGxhdGVyIGZpdHRpbmcKKyAgICAgICAgICAgIC8vIGNhbGN1bGF0aW9ucy4KKyAgICAgICAgICAgIGxvbmcgZW5kUG9zaXRpb24gPSBkZXN0LnBvc2l0aW9uKCkgKyBiYXNlT2Zmc2V0OworICAgICAgICAgICAgbm9kZS5ub2RlU2l6ZSA9IChpbnQpIChlbmRQb3NpdGlvbiAtIG5vZGVQb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKE5vZGU8VkFMVUU+IGNoaWxkIDogY2hpbGRyZW5Ub0NsZWFyKQorICAgICAgICAgICAgY2hpbGQuZmlsZVBvcyA9IC0xOworICAgICAgICByZXR1cm4gbm9kZVBvc2l0aW9uOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBOb2RlPFZhbHVlPiBleHRlbmRzIEluY3JlbWVudGFsVHJpZVdyaXRlckJhc2UuQmFzZU5vZGU8VmFsdWUsIE5vZGU8VmFsdWU+PgorICAgIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEN1cnJlbnRseSBjYWxjdWxhdGVkIHNpemUgb2YgdGhlIGJyYW5jaCBiZWxvdyB0aGlzIG5vZGUsIG5vdCBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLgorICAgICAgICAgKiBJZiBoYXNPdXRPZlBhZ2VJbkJyYW5jaCBpcyB0cnVlLCB0aGlzIG1heSBiZSB1bmRlcmVzdGltYXRlZCBhcyB0aGUgc2l6ZQorICAgICAgICAgKiBkZXBlbmRzIG9uIHRoZSBwb3NpdGlvbiB0aGUgYnJhbmNoIGlzIHdyaXR0ZW4uCisgICAgICAgICAqLworICAgICAgICBpbnQgYnJhbmNoU2l6ZSA9IC0xOworICAgICAgICAvKioKKyAgICAgICAgICogQ3VycmVudGx5IGNhbGN1bGF0ZWQgbm9kZSBzaXplLiBJZiBoYXNPdXRPZlBhZ2VDaGlsZHJlbiBpcyB0cnVlLCB0aGlzIG1heSBiZSB1bmRlcmVzdGltYXRlZCBhcyB0aGUgc2l6ZQorICAgICAgICAgKiBkZXBlbmRzIG9uIHRoZSBwb3NpdGlvbiB0aGUgbm9kZSBpcyB3cml0dGVuLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IG5vZGVTaXplID0gLTE7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdoZXRoZXIgdGhlcmUgaXMgYW4gb3V0LW9mLXBhZ2UsIGFscmVhZHkgd3JpdHRlbiBub2RlIGluIHRoZSBicmFuY2hlcyBiZWxvdyB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZQorICAgICAgICAgKiBub2RlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBoYXNPdXRPZlBhZ2VJbkJyYW5jaCA9IGZhbHNlOworICAgICAgICAvKioKKyAgICAgICAgICogV2hldGhlciBhIGNoaWxkIG9mIHRoZSBub2RlIGlzIG91dCBvZiBwYWdlLCBhbHJlYWR5IHdyaXR0ZW4uCisgICAgICAgICAqIEZvcmNlZCB0byB0cnVlIGJlZm9yZSBiZWluZyBzZXQgdG8gbWFrZSBzdXJlIG1heFBvc2l0aW9uRGVsdGEgcGVyZm9ybXMgaXRzIGV2YWx1YXRpb24gb24gbm9uLWNvbXBsZXRlZAorICAgICAgICAgKiBub2RlcyBmb3IgbWFrZVBhcnRpYWxSb290LgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBoYXNPdXRPZlBhZ2VDaGlsZHJlbiA9IHRydWU7CisKKyAgICAgICAgTm9kZShpbnQgdHJhbnNpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIodHJhbnNpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgTm9kZTxWYWx1ZT4gbmV3Tm9kZShieXRlIHRyYW5zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZTw+KHRyYW5zaXRpb24gJiAweEZGKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHNlcmlhbGl6ZWRQb3NpdGlvbkRlbHRhKGludCBpLCBsb25nIG5vZGVQb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IChjaGlsZHJlbi5nZXQoaSkuZmlsZVBvcyAhPSAtMSk7CisgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW4uZ2V0KGkpLmZpbGVQb3MgLSBub2RlUG9zaXRpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1heCBkZWx0YSBpcyB0aGUgZGVsdGEgd2l0aCBlaXRoZXI6CisgICAgICAgICAqIC0gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBmaXJzdCBjaGlsZCBub3QteWV0LXBsYWNlZCBjaGlsZCB3aWxsIGJlIGxhaWQgb3V0LgorICAgICAgICAgKiAtIHRoZSBwb3NpdGlvbiBvZiB0aGUgZnVydGhlc3QgY2hpbGQgdGhhdCBpcyBhbHJlYWR5IHBsYWNlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBtZXRob2QgYXNzdW1lcyBhbGwgY2hpbGRyZW4ncyBicmFuY2ggYW5kIG5vZGUgc2l6ZXMsIGFzIHdlbGwgYXMgdGhpcyBub2RlJ3MgYnJhbmNoU2l6ZSwgYXJlIGFscmVhZHkKKyAgICAgICAgICogY2FsY3VsYXRlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBsb25nIG1heFBvc2l0aW9uRGVsdGEobG9uZyBub2RlUG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoZSBtYXggZGVsdGEgaXMgdGhlIHBvc2l0aW9uIHRoZSBmaXJzdCBjaGlsZCB3b3VsZCBiZSBsYWlkIG91dC4KKyAgICAgICAgICAgIGFzc2VydCAoY2hpbGRDb3VudCgpID4gMCk7CisKKyAgICAgICAgICAgIGlmICghaGFzT3V0T2ZQYWdlQ2hpbGRyZW4pCisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBiZSBhYmxlIHRvIGFkZHJlc3MgdGhlIGZpcnN0IGNoaWxkLiBXZSBkb24ndCBuZWVkIHRvIGNvdmVyIGl0cyBicmFuY2gsIHRob3VnaC4KKyAgICAgICAgICAgICAgICByZXR1cm4gLShicmFuY2hTaXplIC0gY2hpbGRyZW4uZ2V0KDApLmJyYW5jaFNpemUpOworCisgICAgICAgICAgICBsb25nIG1pblBsYWNlZCA9IDA7CisgICAgICAgICAgICBsb25nIG1pblVucGxhY2VkID0gMTsKKyAgICAgICAgICAgIGZvciAoTm9kZTxWYWx1ZT4gY2hpbGQgOiBjaGlsZHJlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZmlsZVBvcyAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgbWluUGxhY2VkID0gTWF0aC5taW4obWluUGxhY2VkLCBjaGlsZC5maWxlUG9zIC0gbm9kZVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtaW5VbnBsYWNlZCA+IDApICAgLy8gdHJpZ2dlcnMgb25jZQorICAgICAgICAgICAgICAgICAgICBtaW5VbnBsYWNlZCA9IC0oYnJhbmNoU2l6ZSAtIGNoaWxkLmJyYW5jaFNpemUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4obWluUGxhY2VkLCBtaW5VbnBsYWNlZCk7CisgICAgICAgIH0KKworICAgICAgICBOYXZpZ2FibGVTZXQ8Tm9kZTxWYWx1ZT4+IGdldENoaWxkcmVuV2l0aFVuc2V0UG9zaXRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICBOYXZpZ2FibGVTZXQ8Tm9kZTxWYWx1ZT4+IHJlc3VsdCA9IG5ldyBUcmVlU2V0PD4oQlJBTkNIX1NJWkVfQ09NUEFSQVRPUik7CisgICAgICAgICAgICBmb3IgKE5vZGU8VmFsdWU+IGNoaWxkIDogY2hpbGRyZW4pCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLmZpbGVQb3MgPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoY2hpbGQpOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgZmluYWxpemVXaXRoUG9zaXRpb24obG9uZyBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5icmFuY2hTaXplID0gMDsgICAgICAgICAgICAgICAgLy8gdGFrZXMgbm8gc3BhY2UgaW4gY3VycmVudCBwYWdlCisgICAgICAgICAgICB0aGlzLm5vZGVTaXplID0gMDsKKyAgICAgICAgICAgIHRoaXMuaGFzT3V0T2ZQYWdlSW5CcmFuY2ggPSBmYWxzZTsgIC8vIGl0cyBzaXplIG5vIGxvbmdlciBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQKKyAgICAgICAgICAgIHRoaXMuaGFzT3V0T2ZQYWdlQ2hpbGRyZW4gPSBmYWxzZTsKKyAgICAgICAgICAgIHN1cGVyLmZpbmFsaXplV2l0aFBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiUwMnggYnJhbmNoU2l6ZT0lMDR4IG5vZGVTaXplPSUwNHggJXMlcyIsIHRyYW5zaXRpb24sIGJyYW5jaFNpemUsIG5vZGVTaXplLCBoYXNPdXRPZlBhZ2VJbkJyYW5jaCA/ICJCIiA6ICIiLCBoYXNPdXRPZlBhZ2VDaGlsZHJlbiA/ICJDIiA6ICIiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL0luY3JlbWVudGFsVHJpZVdyaXRlclNpbXBsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvSW5jcmVtZW50YWxUcmllV3JpdGVyU2ltcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyMGIyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL0luY3JlbWVudGFsVHJpZVdyaXRlclNpbXBsZS5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLmNvbmN1cnJlbnQuTm90VGhyZWFkU2FmZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworCisvKioKKyAqIEluY3JlbWVudGFsIGJ1aWxkZXIgb2Ygb24tZGlzayB0cmllcy4gVGFrZXMgc29ydGVkIGlucHV0LgorICogPHA+CisgKiBJbmNyZW1lbnRhbCBidWlsZGluZyBpcyBkb25lIGJ5IG1haW50YWluaW5nIGEgc3RhY2sgb2Ygbm9kZXMgaW4gcHJvZ3Jlc3Mgd2hpY2ggZm9sbG93cyB0aGUgcGF0aCB0byByZWFjaCB0aGUgbGFzdAorICogYWRkZWQgZW50cnkuIFdoZW4gYSBuZXcgZW50cnkgaXMgbmVlZGVkLCBjb21wYXJpc29uIHdpdGggdGhlIHByZXZpb3VzIGNhbiB0ZWxsIHVzIGhvdyBtdWNoIG9mIHRoZSBwYXJlbnRzIHN0YWNrCisgKiByZW1haW5zIHRoZSBzYW1lLiBUaGUgcmVzdCBvZiB0aGUgc3RhY2sgaXMgY29tcGxldGUgYXMgbm8gbmV3IGVudHJ5IGNhbiBhZmZlY3QgdGhlbSBkdWUgdG8gdGhlIGlucHV0IHNvcnRpbmcuCisgKiBUaGUgY29tcGxldGVkIG5vZGVzIGNhbiBiZSB3cml0dGVuIHRvIGRpc2sgYW5kIGRpc2NhcmRlZCwga2VlcGluZyBvbmx5IGEgcG9pbnRlciB0byB0aGVpciBsb2NhdGlvbiBpbiB0aGUgZmlsZQorICogKHRoaXMgcG9pbnRlciB3aWxsIGJlIGRpc2NhcmRlZCB0b28gd2hlbiB0aGUgcGFyZW50IG5vZGUgaXMgY29tcGxldGVkKS4gVGhpcyBlbnN1cmVzIHRoYXQgYSB2ZXJ5IGxpbWl0ZWQgYW1vdW50IG9mCisgKiBkYXRhIGlzIGtlcHQgaW4gbWVtb3J5IGF0IGFsbCB0aW1lcy4KKyAqIDxwPgorICogTm90ZTogVGhpcyBjbGFzcyBpcyBjdXJyZW50bHkgdW51c2VkIChidXQgdGVzdGVkKSBhbmQgc3RhbmRzIG9ubHkgYXMgZm9ybSBvZiBkb2N1bWVudGF0aW9uIGZvcgorICoge0BsaW5rIEluY3JlbWVudGFsVHJpZVdyaXRlclBhZ2VBd2FyZX0uCisgKi8KK0BOb3RUaHJlYWRTYWZlCitwdWJsaWMgY2xhc3MgSW5jcmVtZW50YWxUcmllV3JpdGVyU2ltcGxlPFZBTFVFPgorICAgICAgICBleHRlbmRzIEluY3JlbWVudGFsVHJpZVdyaXRlckJhc2U8VkFMVUUsIERhdGFPdXRwdXRQbHVzLCBJbmNyZW1lbnRhbFRyaWVXcml0ZXJTaW1wbGUuTm9kZTxWQUxVRT4+CisgICAgICAgIGltcGxlbWVudHMgSW5jcmVtZW50YWxUcmllV3JpdGVyPFZBTFVFPgoreworICAgIHByaXZhdGUgbG9uZyBwb3NpdGlvbiA9IDA7CisKKyAgICBwdWJsaWMgSW5jcmVtZW50YWxUcmllV3JpdGVyU2ltcGxlKFRyaWVTZXJpYWxpemVyPFZBTFVFLCA/IHN1cGVyIERhdGFPdXRwdXRQbHVzPiB0cmllU2VyaWFsaXplciwgRGF0YU91dHB1dFBsdXMgZGVzdCkKKyAgICB7CisgICAgICAgIHN1cGVyKHRyaWVTZXJpYWxpemVyLCBkZXN0LCBuZXcgTm9kZTw+KChieXRlKSAwKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29tcGxldGUoTm9kZTxWQUxVRT4gbm9kZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIG5vZGVQb3MgPSBwb3NpdGlvbjsKKyAgICAgICAgcG9zaXRpb24gKz0gd3JpdGUobm9kZSwgZGVzdCwgcG9zaXRpb24pOworICAgICAgICBub2RlLmZpbmFsaXplV2l0aFBvc2l0aW9uKG5vZGVQb3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAgIHJlc2V0KG5ldyBOb2RlPD4oKGJ5dGUpIDApKTsKKyAgICAgICAgcG9zaXRpb24gPSAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXJ0aWFsVGFpbCBtYWtlUGFydGlhbFJvb3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoRGF0YU91dHB1dEJ1ZmZlciBidWYgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigpKQorICAgICAgICB7CisgICAgICAgICAgICBQVGFpbCB0YWlsID0gbmV3IFBUYWlsKCk7CisgICAgICAgICAgICB0YWlsLmN1dG9mZiA9IHBvc2l0aW9uOworICAgICAgICAgICAgdGFpbC5jb3VudCA9IGNvdW50OworICAgICAgICAgICAgbG9uZyBub2RlUG9zID0gcG9zaXRpb247CisgICAgICAgICAgICBmb3IgKE5vZGU8VkFMVUU+IG5vZGUgOiAoSXRlcmFibGU8Tm9kZTxWQUxVRT4+KSBzdGFjazo6ZGVzY2VuZGluZ0l0ZXJhdG9yKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5vZGUuZmlsZVBvcyA9IG5vZGVQb3M7CisgICAgICAgICAgICAgICAgbm9kZVBvcyArPSB3cml0ZShub2RlLCBidWYsIG5vZGVQb3MpOworICAgICAgICAgICAgICAgIC8vIEhhY2t5IGJ1dCB3b3JrczogdGVtcG9yYXJpbHkgd3JpdGUgbm9kZSdzIHBvc2l0aW9uLiBXaWxsIGJlIG92ZXJ3cml0dGVuIHdoZW4gd2UgZmluYWxpemUgbm9kZS4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGFpbC50YWlsID0gYnVmLmFzTmV3QnVmZmVyKCk7CisgICAgICAgICAgICB0YWlsLnJvb3QgPSBzdGFjay5nZXRGaXJzdCgpLmZpbGVQb3M7CisKKyAgICAgICAgICAgIGZvciAoTm9kZTxWQUxVRT4gbm9kZSA6IChJdGVyYWJsZTxOb2RlPFZBTFVFPj4pIHN0YWNrOjpkZXNjZW5kaW5nSXRlcmF0b3IpCisgICAgICAgICAgICAgICAgbm9kZS5maWxlUG9zID0gLTE7CisKKyAgICAgICAgICAgIHJldHVybiB0YWlsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIHdyaXRlKE5vZGU8VkFMVUU+IG5vZGUsIERhdGFPdXRwdXRQbHVzIGRlc3QsIGxvbmcgbm9kZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgc2l6ZSA9IHNlcmlhbGl6ZXIuc2l6ZW9mTm9kZShub2RlLCBub2RlUG9zaXRpb24pOworICAgICAgICBzZXJpYWxpemVyLndyaXRlKGRlc3QsIG5vZGUsIG5vZGVQb3NpdGlvbik7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBOb2RlPFZhbHVlPiBleHRlbmRzIEluY3JlbWVudGFsVHJpZVdyaXRlckJhc2UuQmFzZU5vZGU8VmFsdWUsIE5vZGU8VmFsdWU+PgorICAgIHsKKyAgICAgICAgTm9kZShpbnQgdHJhbnNpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIodHJhbnNpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgTm9kZTxWYWx1ZT4gbmV3Tm9kZShieXRlIHRyYW5zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZTw+KHRyYW5zaXRpb24gJiAweEZGKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHNlcmlhbGl6ZWRQb3NpdGlvbkRlbHRhKGludCBpLCBsb25nIG5vZGVQb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGNoaWxkcmVuLmdldChpKS5maWxlUG9zICE9IC0xOworICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuLmdldChpKS5maWxlUG9zIC0gbm9kZVBvc2l0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgbWF4UG9zaXRpb25EZWx0YShsb25nIG5vZGVQb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBtaW4gPSAwOworICAgICAgICAgICAgZm9yIChOb2RlPFZhbHVlPiBjaGlsZCA6IGNoaWxkcmVuKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjaGlsZC5maWxlUG9zICE9IC0xKQorICAgICAgICAgICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihtaW4sIGNoaWxkLmZpbGVQb3MgLSBub2RlUG9zaXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1pbjsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9SZXZlcnNlVmFsdWVJdGVyYXRvci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvUmV2ZXJzZVZhbHVlSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2MxOTlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvUmV2ZXJzZVZhbHVlSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXM7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLmNvbmN1cnJlbnQuTm90VGhyZWFkU2FmZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmVidWZmZXJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworCisvKioKKyAqIFRocmVhZC11bnNhZmUgcmV2ZXJzZSB2YWx1ZSBpdGVyYXRvciBmb3Igb24tZGlzayB0cmllcy4gVXNlcyB0aGUgYXNzdW1wdGlvbnMgb2Yge0BsaW5rIFdhbGtlcn0uCisgKiA8cD4KKyAqIFRoZSBtYWluIHV0aWxpdHkgb2YgdGhpcyBjbGFzcyBpcyB0aGUge0BsaW5rICNuZXh0UGF5bG9hZGVkTm9kZSgpfSBtZXRob2QsIHdoaWNoIGxpc3RzIGFsbCBub2RlcyB0aGF0IGNvbnRhaW4gYQorICogcGF5bG9hZCB3aXRoaW4gdGhlIHJlcXVlc3RlZCBib3VuZHMuIFRoZSB0cmVhdG1lbnQgb2YgdGhlIGJvdW5kcyBpcyBub24tc3RhbmRhcmQgKHNlZQorICoge0BsaW5rICNSZXZlcnNlVmFsdWVJdGVyYXRvcihSZWJ1ZmZlcmVyLCBsb25nLCBCeXRlQ29tcGFyYWJsZSwgQnl0ZUNvbXBhcmFibGUsIGJvb2xlYW4pfSksIG5lY2Vzc2FyeSB0byBwcm9wZXJseSB3YWxrCisgKiB0cmllcyBvZiBwcmVmaXhlcyBhbmQgc2VwYXJhdG9ycy4KKyAqLworQE5vdFRocmVhZFNhZmUKK3B1YmxpYyBjbGFzcyBSZXZlcnNlVmFsdWVJdGVyYXRvcjxDb25jcmV0ZSBleHRlbmRzIFJldmVyc2VWYWx1ZUl0ZXJhdG9yPENvbmNyZXRlPj4gZXh0ZW5kcyBXYWxrZXI8Q29uY3JldGU+Cit7CisgICAgc3RhdGljIGZpbmFsIGludCBOT1RfQVRfTElNSVQgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKyAgICBwcml2YXRlIGZpbmFsIEJ5dGVTb3VyY2UgbGltaXQ7CisgICAgcHJpdmF0ZSBJdGVyYXRpb25Qb3NpdGlvbiBzdGFjazsKKyAgICBwcml2YXRlIGxvbmcgbmV4dDsKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVwb3J0aW5nUHJlZml4ZXM7CisKKyAgICBzdGF0aWMgY2xhc3MgSXRlcmF0aW9uUG9zaXRpb24KKyAgICB7CisgICAgICAgIGZpbmFsIGxvbmcgbm9kZTsKKyAgICAgICAgZmluYWwgaW50IGxpbWl0OworICAgICAgICBmaW5hbCBJdGVyYXRpb25Qb3NpdGlvbiBwcmV2OworICAgICAgICBpbnQgY2hpbGRJbmRleDsKKworICAgICAgICBwdWJsaWMgSXRlcmF0aW9uUG9zaXRpb24obG9uZyBub2RlLCBpbnQgY2hpbGRJbmRleCwgaW50IGxpbWl0LCBJdGVyYXRpb25Qb3NpdGlvbiBwcmV2KQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKKyAgICAgICAgICAgIHRoaXMuY2hpbGRJbmRleCA9IGNoaWxkSW5kZXg7CisgICAgICAgICAgICB0aGlzLmxpbWl0ID0gbGltaXQ7CisgICAgICAgICAgICB0aGlzLnByZXYgPSBwcmV2OworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIFJldmVyc2VWYWx1ZUl0ZXJhdG9yKFJlYnVmZmVyZXIgc291cmNlLCBsb25nIHJvb3QpCisgICAgeworICAgICAgICBzdXBlcihzb3VyY2UsIHJvb3QpOworICAgICAgICBsaW1pdCA9IG51bGw7CisgICAgICAgIGluaXRpYWxpemVOb1JpZ2h0Qm91bmQocm9vdCwgTk9UX0FUX0xJTUlULCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RyYWluZWQgaXRlcmF0b3IuIFRoZSBlbmQgcG9zaXRpb24gaXMgYWx3YXlzIHRyZWF0ZWQgYXMgaW5jbHVzaXZlLCBhbmQgd2UgaGF2ZSB0d28gcG9zc2libGUgdHJlYXRtZW50cyBmb3IKKyAgICAgKiB0aGUgc3RhcnQ6CisgICAgICogPHVsPgorICAgICAqICAgPGxpPiBXaGVuIHtAY29kZSBhZG1pdFByZWZpeD1mYWxzZX0sIGV4YWN0IG1hdGNoZXMgYW5kIGFueSBwcmVmaXhlcyBvZiB0aGUgc3RhcnQgYXJlIGV4Y2x1ZGVkLgorICAgICAqICAgPGxpPiBXaGVuIHtAY29kZSBhZG1pdFByZWZpeD10cnVlfSwgdGhlIGxvbmdlc3QgcHJlZml4IG9mIHRoZSBzdGFydCBwcmVzZW50IGluIHRoZSB0cmllIGlzIGFsc28gaW5jbHVkZWQsCisgICAgICogICAgICAgIHByb3ZpZGVkIHRoYXQgdGhlcmUgaXMgbm8gZW50cnkgaW4gdGhlIHRyaWUgYmV0d2VlbiB0aGF0IHByZWZpeCBhbmQgdGhlIHN0YXJ0LiBBbiBleGFjdCBtYXRjaCBhbHNvCisgICAgICogICAgICAgIHNhdGlzZmllcyB0aGlzIGFuZCBpcyBpbmNsdWRlZC4KKyAgICAgKiA8L3VsPgorICAgICAqIFRoaXMgYmVoYXZpb3VyIGlzIHNoYXJlZCB3aXRoIHRoZSBmb3J3YXJkIGNvdW50ZXJwYXJ0IHtAbGluayBWYWx1ZUl0ZXJhdG9yfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmV2ZXJzZVZhbHVlSXRlcmF0b3IoUmVidWZmZXJlciBzb3VyY2UsIGxvbmcgcm9vdCwgQnl0ZUNvbXBhcmFibGUgc3RhcnQsIEJ5dGVDb21wYXJhYmxlIGVuZCwgYm9vbGVhbiBhZG1pdFByZWZpeCkKKyAgICB7CisgICAgICAgIHN1cGVyKHNvdXJjZSwgcm9vdCk7CisgICAgICAgIGxpbWl0ID0gc3RhcnQgIT0gbnVsbCA/IHN0YXJ0LmFzQ29tcGFyYWJsZUJ5dGVzKEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKSA6IG51bGw7CisKKyAgICAgICAgaWYgKGVuZCAhPSBudWxsKQorICAgICAgICAgICAgaW5pdGlhbGl6ZVdpdGhSaWdodEJvdW5kKHJvb3QsIGVuZC5hc0NvbXBhcmFibGVCeXRlcyhCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTiksIGFkbWl0UHJlZml4LCBsaW1pdCAhPSBudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5pdGlhbGl6ZU5vUmlnaHRCb3VuZChyb290LCBsaW1pdCAhPSBudWxsID8gbGltaXQubmV4dCgpIDogTk9UX0FUX0xJTUlULCBhZG1pdFByZWZpeCk7CisgICAgfQorCisgICAgdm9pZCBpbml0aWFsaXplV2l0aFJpZ2h0Qm91bmQobG9uZyByb290LCBCeXRlU291cmNlIGVuZFN0cmVhbSwgYm9vbGVhbiBhZG1pdFByZWZpeCwgYm9vbGVhbiBoYXNMaW1pdCkKKyAgICB7CisgICAgICAgIEl0ZXJhdGlvblBvc2l0aW9uIHByZXYgPSBudWxsOworICAgICAgICBib29sZWFuIGF0TGltaXQgPSBoYXNMaW1pdDsKKyAgICAgICAgaW50IGNoaWxkSW5kZXg7CisgICAgICAgIGludCBsaW1pdEJ5dGU7CisgICAgICAgIHJlcG9ydGluZ1ByZWZpeGVzID0gYWRtaXRQcmVmaXg7CisKKyAgICAgICAgLy8gRm9sbG93IGVuZCBwb3NpdGlvbiB3aGlsZSB3ZSBzdGlsbCBoYXZlIGEgcHJlZml4LCBzdGFja2luZyBwYXRoLgorICAgICAgICBnbyhyb290KTsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzID0gZW5kU3RyZWFtLm5leHQoKTsKKyAgICAgICAgICAgIGNoaWxkSW5kZXggPSBzZWFyY2gocyk7CisKKyAgICAgICAgICAgIGxpbWl0Qnl0ZSA9IE5PVF9BVF9MSU1JVDsKKyAgICAgICAgICAgIGlmIChhdExpbWl0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxpbWl0Qnl0ZSA9IGxpbWl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAocyA+IGxpbWl0Qnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgYXRMaW1pdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoaWxkSW5kZXggPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBwcmV2ID0gbmV3IEl0ZXJhdGlvblBvc2l0aW9uKHBvc2l0aW9uLCBjaGlsZEluZGV4LCBsaW1pdEJ5dGUsIHByZXYpOworICAgICAgICAgICAgZ28odHJhbnNpdGlvbihjaGlsZEluZGV4KSk7IC8vIGNoaWxkSW5kZXggaXMgcG9zaXRpdmUsIHRoaXMgdHJhbnNpdGlvbiBtdXN0IGV4aXN0CisgICAgICAgIH0KKworICAgICAgICAvLyBBZHZhbmNpbmcgbm93IGdpdmVzIHVzIGZpcnN0IG1hdGNoLgorICAgICAgICBjaGlsZEluZGV4ID0gLTEgLSBjaGlsZEluZGV4OworICAgICAgICBzdGFjayA9IG5ldyBJdGVyYXRpb25Qb3NpdGlvbihwb3NpdGlvbiwgY2hpbGRJbmRleCwgbGltaXRCeXRlLCBwcmV2KTsKKyAgICAgICAgbmV4dCA9IGFkdmFuY2VOb2RlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVOb1JpZ2h0Qm91bmQobG9uZyByb290LCBpbnQgbGltaXRCeXRlLCBib29sZWFuIGFkbWl0UHJlZml4KQorICAgIHsKKyAgICAgICAgZ28ocm9vdCk7CisgICAgICAgIHN0YWNrID0gbmV3IEl0ZXJhdGlvblBvc2l0aW9uKHJvb3QsIC0xIC0gc2VhcmNoKDI1NiksIGxpbWl0Qnl0ZSwgbnVsbCk7CisgICAgICAgIG5leHQgPSBhZHZhbmNlTm9kZSgpOworICAgICAgICByZXBvcnRpbmdQcmVmaXhlcyA9IGFkbWl0UHJlZml4OworICAgIH0KKworCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCBub2RlIHdpdGggcGF5bG9hZCBjb250YWluZWQgaW4gdGhlIGl0ZXJhdGVkIHNwYW4uCisgICAgICovCisgICAgcHJvdGVjdGVkIGxvbmcgbmV4dFBheWxvYWRlZE5vZGUoKQorICAgIHsKKyAgICAgICAgbG9uZyB0b1JldHVybiA9IG5leHQ7CisgICAgICAgIGlmIChuZXh0ICE9IC0xKQorICAgICAgICAgICAgbmV4dCA9IGFkdmFuY2VOb2RlKCk7CisgICAgICAgIHJldHVybiB0b1JldHVybjsKKyAgICB9CisKKyAgICBsb25nIGFkdmFuY2VOb2RlKCkKKyAgICB7CisgICAgICAgIGlmIChzdGFjayA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGxvbmcgY2hpbGQ7CisgICAgICAgIGludCB0cmFuc2l0aW9uQnl0ZTsKKworICAgICAgICBnbyhzdGFjay5ub2RlKTsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGFkdmFuY2UgcG9zaXRpb24gaW4gbm9kZQorICAgICAgICAgICAgaW50IGNoaWxkSWR4ID0gc3RhY2suY2hpbGRJbmRleCAtIDE7CisgICAgICAgICAgICBib29sZWFuIGJleW9uZExpbWl0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChjaGlsZElkeCA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyYW5zaXRpb25CeXRlID0gdHJhbnNpdGlvbkJ5dGUoY2hpbGRJZHgpOworICAgICAgICAgICAgICAgIGJleW9uZExpbWl0ID0gdHJhbnNpdGlvbkJ5dGUgPCBzdGFjay5saW1pdDsKKyAgICAgICAgICAgICAgICBpZiAoYmV5b25kTGltaXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgc3RhY2subGltaXQgPj0gMDsgICAgLy8gd2UgYXJlIGF0IGEgbGltaXQgcG9zaXRpb24gKG5vdCBpbiBhIG5vZGUgdGhhdCdzIGNvbXBsZXRlbHkgd2l0aGluIHRoZSBzcGFuKQorICAgICAgICAgICAgICAgICAgICByZXBvcnRpbmdQcmVmaXhlcyA9IGZhbHNlOyAgLy8gdGhlcmUgZXhpc3RzIGEgc21hbGxlciBjaGlsZCB0aGFuIGxpbWl0LCBubyBsb25nZXIgc2hvdWxkIHJlcG9ydCBwcmVmaXhlcworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0cmFuc2l0aW9uQnl0ZSA9IEludGVnZXIuTUlOX1ZBTFVFOworCisgICAgICAgICAgICBpZiAoYmV5b25kTGltaXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gYXNjZW5kIHRvIHBhcmVudCwgcmVtb3ZlIGZyb20gc3RhY2sKKyAgICAgICAgICAgICAgICBJdGVyYXRpb25Qb3NpdGlvbiBzdGFja1RvcCA9IHN0YWNrOworICAgICAgICAgICAgICAgIHN0YWNrID0gc3RhY2sucHJldjsKKworICAgICAgICAgICAgICAgIC8vIFJlcG9ydCBwYXlsb2FkcyBvbiB0aGUgd2F5IHVwCisgICAgICAgICAgICAgICAgLy8gdW5sZXNzIHdlIGFyZSBhdCBsaW1pdCBhbmQgdGhlcmUgaGFzIGJlZW4gYSBzbWFsbGVyIGNoaWxkCisgICAgICAgICAgICAgICAgaWYgKHBheWxvYWRGbGFncygpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgZnVsbHkgaW5zaWRlIHRoZSBjb3ZlcmVkIHNwYWNlLCByZXBvcnQuCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBvbiB0aGUgZXhhY3QgbWF0Y2ggb2YgdGhlIGxpbWl0LCBzdGFja1RvcC5saW1pdCB3b3VsZCBiZSBFTkRfT0ZfU1RSRUFNLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNvbXBhcmlzb24gcmVqZWN0cyB0aGUgZXhhY3QgbWF0Y2g7IGlmIHdlIHdhbnRlZCB0byBpbmNsdWRlIGl0LCB3ZSBjb3VsZCB0ZXN0IDwgMCBpbnN0ZWFkLgorICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tUb3AubGltaXQgPT0gTk9UX0FUX0xJTUlUKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrVG9wLm5vZGU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcG9ydGluZ1ByZWZpeGVzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRpbmdQcmVmaXhlcyA9IGZhbHNlOyAvLyBpZiB3ZSBhcmUgYXQgbGltaXQgcG9zaXRpb24gb25seSByZXBvcnQgb25lIHByZWZpeCwgdGhlIGNsb3Nlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFja1RvcC5ub2RlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGVsc2Ugc2tpcCB0aGlzIHBheWxvYWQKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhY2sgPT0gbnVsbCkgICAgICAgIC8vIGV4aGF1c3RlZCB3aG9sZSB0cmllCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT05FOworICAgICAgICAgICAgICAgIGdvKHN0YWNrLm5vZGUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGlsZCA9IHRyYW5zaXRpb24oY2hpbGRJZHgpOworICAgICAgICAgICAgaWYgKGNoaWxkICE9IE5PTkUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ28oY2hpbGQpOworCisgICAgICAgICAgICAgICAgc3RhY2suY2hpbGRJbmRleCA9IGNoaWxkSWR4OworCisgICAgICAgICAgICAgICAgLy8gZGVzY2VuZCwgc3RhY2sgdXAgcG9zaXRpb24KKyAgICAgICAgICAgICAgICBpbnQgbCA9IE5PVF9BVF9MSU1JVDsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNpdGlvbkJ5dGUgPT0gc3RhY2subGltaXQpCisgICAgICAgICAgICAgICAgICAgIGwgPSBsaW1pdC5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICBzdGFjayA9IG5ldyBJdGVyYXRpb25Qb3NpdGlvbihjaGlsZCwgdHJhbnNpdGlvblJhbmdlKCksIGwsIHN0YWNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGFjay5jaGlsZEluZGV4ID0gY2hpbGRJZHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9TZXJpYWxpemF0aW9uTm9kZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvU2VyaWFsaXphdGlvbk5vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWU3YTRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvU2VyaWFsaXphdGlvbk5vZGUuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllczsKKworLyoqCisgKiBBbiBhYnN0cmFjdGlvbiBvZiBhIG5vZGUgZ2l2ZW4gdG8gdGhlIHRyaWUgc2VyaWFsaXplciB0byB3cml0ZS4KKyAqLworcHVibGljIGludGVyZmFjZSBTZXJpYWxpemF0aW9uTm9kZTxWQUxVRT4KK3sKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9mIHRoZSBub2RlLgorICAgICAqLworICAgIGludCBjaGlsZENvdW50KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGF5bG9hZCBvZiB0aGUgbm9kZSBpZiB0aGUgbm9kZSBoYXMgYW55IGFzc29jaWF0ZWQsIG90aGVyd2lzZSBudWxsLgorICAgICAqLworICAgIFZBTFVFIHBheWxvYWQoKTsKKworICAgIC8qKgorICAgICAqIFRoZSB0cmFuc2l0aW9uIGNoYXJhY3RlciBmb3IgdGhlIGNoaWxkIGF0IHBvc2l0aW9uIGkuIE11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDI1NS4KKyAgICAgKi8KKyAgICBpbnQgdHJhbnNpdGlvbihpbnQgaSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgbm9kZSdzIHBvc2l0aW9uIGFuZCB0aGUgY2hpbGQgYXQgaW5kZXggaS4KKyAgICAgKiBHaXZlbiBhcyBhIGRpZmZlcmVuY2UgY2FsY3VsYXRpb24gdG8gYmUgYWJsZSB0byBoYW5kbGUgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBjYWxsczoKKyAgICAgKiAtIHdyaXRpbmcgbm9kZXMgd2hlcmUgYWxsIGNoaWxkcmVuJ3MgcG9zaXRpb25zIGFyZSBhbHJlYWR5IGNvbXBsZXRlbHkgZGV0ZXJtaW5lZAorICAgICAqIC0gc2l6aW5nIGFuZCB3cml0aW5nIGJyYW5jaGVzIHdpdGhpbiBhIHBhZ2Ugd2hlcmUgd2UgZG9uJ3Qga25vdyB3aGVyZSB3ZSdsbCBhY3R1YWxseSBwbGFjZQorICAgICAqICAgdGhlIG5vZGVzLCBidXQgd2Uga25vdyBob3cgZmFyIGJhY2t3YXJkIHRoZSBjaGlsZCBub2RlcyB3aWxsIGVuZCB1cAorICAgICAqLworICAgIGxvbmcgc2VyaWFsaXplZFBvc2l0aW9uRGVsdGEoaW50IGksIGxvbmcgbm9kZVBvc2l0aW9uKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZ1cnRoZXN0IGRpc3RhbmNlIHRoYXQgbmVlZHMgdG8gYmUgd3JpdHRlbiB0byBzdG9yZSB0aGlzIG5vZGUsIGkuZS4KKyAgICAgKiAgIG1pbihzZXJpYWxpemVkUG9zaXRpb25EZWx0YShpLCBub2RlUG9zaXRpb24pIGZvciAwIDw9IGkgPCBjaGlsZENvdW50KCkpCisgICAgICogR2l2ZW4gc2VwYXJhdGVseSBhcyB0aGUgbG9vcCBhYm92ZSBjYW4gYmUgaW5lZmZpY2llbnQgKGUuZy4gd2hlbiBjaGlsZHJlbiBhcmUgbm90IHlldCB3cml0dGVuKS4KKyAgICAgKi8KKyAgICBsb25nIG1heFBvc2l0aW9uRGVsdGEobG9uZyBub2RlUG9zaXRpb24pOworfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvVHJpZU5vZGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1RyaWVOb2RlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhNGVlMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1RyaWVOb2RlLmphdmEKQEAgLTAsMCArMSw5ODcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzOworCitpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0OworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TaXplZEludHM7CisKKy8qKgorICogVHJpZSBub2RlIHR5cGVzIGFuZCBtYW5pcHVsYXRpb24gbWVjaGFuaXNtcy4gVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGlzIHRvIGFsbG93IGZvciBoYW5kbGluZyB0cmllcyBkaXJlY3RseSBhcworICogdGhleSBhcmUgb24gZGlzayB3aXRob3V0IGFueSBzZXJpYWxpemF0aW9uLCBhbmQgdG8gZW5hYmxlIHRoZSBjcmVhdGlvbiBvZiBzdWNoIGZpbGVzLgorICogPHA+CisgKiBUaGUgc2VyaWFsaXphdGlvbiBtZXRob2RzIHRha2UgYXMgYXJndW1lbnQgYSBnZW5lcmljIHtAY29kZSBTZXJpYWxpemF0aW9uTm9kZX0gYW5kIHByb3ZpZGUgYSBtZXRob2Qge0Bjb2RlIHR5cGVGb3J9CisgKiBmb3IgY2hvb3NpbmcgYSBzdWl0YWJsZSB0eXBlIHRvIHJlcHJlc2VudCBpdCwgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgc2l6ZSBhbmQgd3JpdGUgdGhlIG5vZGUuCisgKiA8cD4KKyAqIFRvIHJlYWQgYSBmaWxlIGNvbnRhaW5pbmcgdHJpZSBub2Rlcywgb25lIHdvdWxkIHVzZSB7QGNvZGUgYXR9IHRvIGlkZW50aWZ5IHRoZSBub2RlIHR5cGUgYW5kIHRoZW4gdGhlIHZhcmlvdXMKKyAqIHJlYWQgbWV0aG9kcyB0byByZXRyaWV2ZSB0aGUgZGF0YS4gVGhleSBhbGwgdGFrZSBhIGJ1ZmZlciAodXN1YWxseSBtZW1vcnktbWFwcGVkKSBjb250YWluaW5nIHRoZSBkYXRhLCBhbmQgYSBwb3NpdGlvbgorICogaW4gaXQgdGhhdCBpZGVudGlmaWVzIHRoZSBub2RlLgorICogPHA+CisgKiBUaGVzZSBub2RlIHR5cGVzIGRvIG5vdCBzcGVjaWZ5IGFueSB0cmVhdG1lbnQgb2YgcGF5bG9hZHMuIFRoZXkgYXJlIG9ubHkgY29uY2VybmVkIHdpdGggcHJvdmlkaW5nIDQgYml0cyBvZgorICogc3BhY2UgZm9yIHtAY29kZSBwYXlsb2FkRmxhZ3N9LCBhbmQgYSB3YXkgb2YgY2FsY3VsYXRpbmcgdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSBub2RlLiBVc2VycyBvZiB0aGlzIGNsYXNzIGJ5IGNvbnZlbnRpb24KKyAqIHVzZSBub24temVybyBwYXlsb2FkRmxhZ3MgdG8gaW5kaWNhdGUgYSBwYXlsb2FkIGV4aXN0cywgd3JpdGUgaXQgKHBvc3NpYmx5IGluIGZsYWctZGVwZW5kZW50IGZvcm1hdCkgYXQgc2VyaWFsaXphdGlvbgorICogdGltZSBhZnRlciB0aGUgbm9kZSBpdHNlbGYgaXMgd3JpdHRlbiwgYW5kIHJlYWQgaXQgdXNpbmcgdGhlIHtAY29kZSBwYXlsb2FkUG9zaXRpb259IHZhbHVlLgorICogPHA+CisgKiBUbyBpbXByb3ZlIGVmZmljaWVuY3ksIG11bHRpcGxlIG5vZGUgdHlwZXMgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgdHJhbnNpdGlvbnMgYXJlIHByb3ZpZGVkOgorICogLS0gcGF5bG9hZCBvbmx5LCB3aGljaCBoYXMgbm8gb3V0Z29pbmcgdHJhbnNpdGlvbnMKKyAqIC0tIHNpbmdsZSBvdXRnb2luZyB0cmFuc2l0aW9uCisgKiAtLSBzcGFyc2UsIHdoaWNoIHByb3ZpZGVzIGEgbGlzdCBvZiB0cmFuc2l0aW9uIGJ5dGVzIHdpdGggY29ycmVzcG9uZGluZyB0YXJnZXRzCisgKiAtLSBkZW5zZSwgd2hlcmUgdGhlIHRyYW5zaXRpb25zIHNwYW4gYSByYW5nZSBvZiB2YWx1ZXMgYW5kIGhhdmluZyB0aGUgbGlzdCAoYW5kIHRoZSBzZWFyY2ggaW4gaXQpIGNhbiBiZSBhdm9pZGVkCisgKiA8cD4KKyAqIEZvciBlYWNoIG9mIHRoZSB0cmFuc2l0aW9uLWNhcnJ5aW5nIHR5cGVzIHdlIGFsc28gaGF2ZSAiaW4tcGFnZSIgdmVyc2lvbnMgd2hlcmUgdHJhbnNpdGlvbiB0YXJnZXRzIGFyZSB0aGUgNCwgOCBvciAxMgorICogbG93ZXN0IGJpdHMgb2YgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgc2FtZSBwYWdlLiBUbyBzYXZlIG9uZSBmdXJ0aGVyIGJ5dGUsIHRoZSBzaW5nbGUgaW4tcGFnZSB2ZXJzaW9ucyB1c2luZyA0IG9yIDEyCisgKiBiaXRzIGNhbm5vdCBjYXJyeSBhIHBheWxvYWQuCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaXMgZWZmZWN0aXZlbHkgYW4gZW51bWVyYXRpb247IGFic3RyYWN0IGNsYXNzIHBlcm1pdHMgaW5zdGFuY2VzIHRvIGV4dGVuZCBlYWNoIG90aGVyIGFuZCByZXVzZSBjb2RlLgorICogPHA+CisgKiBTZWUge0Bjb2RlIG9yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9CdGlGb3JtYXQubWR9IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBtZWNoYW5pc21zIG9mIHdyaXRpbmcKKyAqIGFuZCByZWFkaW5nIGFuIG9uLWRpc2sgdHJpZS4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyAiU2FtZVBhcmFtZXRlclZhbHVlIiB9KQorcHVibGljIGFic3RyYWN0IGNsYXNzIFRyaWVOb2RlCit7CisgICAgLyoqIFZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgYSBicmFuY2ggKGUuZy4gZm9yIHRyYW5zaXRpb24gYW5kIGxhc3RUcmFuc2l0aW9uKSBkb2VzIG5vdCBleGlzdC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBOT05FID0gLTE7CisKKyAgICAvLyBDb25zdW1wdGlvbiAocmVhZCkgbWV0aG9kcworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiBub2RlIHN0b3JlZCBhdCB0aGlzIHBvc2l0aW9uLiBJdCBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgdGhlIG1ldGhvZHMgYmVsb3cuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUcmllTm9kZSBhdChCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFR5cGVzLnZhbHVlc1soc3JjLmdldChwb3NpdGlvbikgPj4gNCkgJiAweEZdOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIDQgcGF5bG9hZCBmbGFnIGJpdHMuIE5vZGUgdHlwZXMgdGhhdCBjYW5ub3QgY2FycnkgYSBwYXlsb2FkIHJldHVybiAwLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgcGF5bG9hZEZsYWdzKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pCisgICAgeworICAgICAgICByZXR1cm4gc3JjLmdldChwb3NpdGlvbikgJiAweDBGOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgcG9zaXRpb24ganVzdCBhZnRlciB0aGUgbm9kZSwgd2hlcmUgdGhlIHBheWxvYWQgaXMgdXN1YWxseSBzdG9yZWQuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGludCBwYXlsb2FkUG9zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHNlYXJjaCBpbmRleCBmb3IgdGhlIGdpdmVuIGJ5dGUgaW4gdGhlIG5vZGUuIElmIGV4YWN0IG1hdGNoIGlzIHByZXNlbnQsIHRoaXMgaXMgPj0gMCwgb3RoZXJ3aXNlIGFzIGluCisgICAgICogYmluYXJ5IHNlYXJjaC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwdWJsaWMgaW50IHNlYXJjaChCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBpbnQgdHJhbnNpdGlvbkJ5dGUpOyAgICAgICAvLyByZXR1cm5zIGFzIGJpbmFyeVNlYXJjaAorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdXBwZXIgY2hpbGRJbmRleCBsaW1pdC4gQ2FsbGluZyB0cmFuc2l0aW9uIHdpdGggdmFsdWVzIDAuLi50cmFuc2l0aW9uUmFuZ2UgLSAxIGlzIHZhbGlkLgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBpbnQgdHJhbnNpdGlvblJhbmdlKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYnl0ZSB2YWx1ZSBmb3IgdGhpcyBjaGlsZCBpbmRleCwgb3IgSW50ZWdlci5NQVhfVkFMVUUgaWYgdGhlcmUgYXJlIG5vIHRyYW5zaXRpb25zIHdpdGggdGhpcyBpbmRleCBvcgorICAgICAqIGhpZ2hlciB0byBwZXJtaXQgbGlzdGluZyB0aGUgY2hpbGRyZW4gd2l0aG91dCBuZWVkaW5nIHRvIGNhbGwgdHJhbnNpdGlvblJhbmdlLgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkSW5kZXggbXVzdCBiZSA+PSAwLCB0aG91Z2ggaXQgaXMgYWxsb3dlZCB0byBwYXNzIGEgdmFsdWUgZ3JlYXRlciB0aGFuIHtAY29kZSB0cmFuc2l0aW9uUmFuZ2UgLSAxfQorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBpbnQgdHJhbnNpdGlvbkJ5dGUoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IGNoaWxkSW5kZXgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVsdGEgYmV0d2VlbiB0aGUgcG9zaXRpb24gb2YgdGhpcyBub2RlIGFuZCB0aGUgcG9zaXRpb24gb2YgdGhlIHRhcmdldCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zaXRpb24uCisgICAgICogVGhpcyBpcyBhbHdheXMgYSBuZWdhdGl2ZSBudW1iZXIuIERlbnNlIG5vZGVzIHVzZSAwIHRvIHNwZWNpZnkgIm5vIHRyYW5zaXRpb24iLgorICAgICAqCisgICAgICogQHBhcmFtIGNoaWxkSW5kZXggbXVzdCBiZSA+PSAwIGFuZCA8IHtAbGluayAjdHJhbnNpdGlvblJhbmdlKEJ5dGVCdWZmZXIsIGludCl9IC0gbm90ZSB0aGF0IHRoaXMgaXMgbm90IHZhbGlkYXRlZAorICAgICAqICAgICAgICAgICAgICAgICAgIGFuZCBiZWhhdmlvdXIgb2YgdGhpcyBtZXRob2QgaXMgdW5kZWZpbmVkIGZvciB2YWx1ZXMgb3V0c2lkZSBvZiB0aGF0IHJhbmdlCisgICAgICovCisgICAgYWJzdHJhY3QgbG9uZyB0cmFuc2l0aW9uRGVsdGEoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IGNoaWxkSW5kZXgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBwb3NpdGlvbiBvZiBub2RlIHRvIHRyYW5zaXRpb24gdG8gZm9yIHRoZSBnaXZlbiBzZWFyY2ggaW5kZXguIEFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUuIE1heSByZXR1cm4gTk9ORQorICAgICAqIGlmIGEgdHJhbnNpdGlvbiB3aXRoIHRoYXQgaW5kZXggZG9lcyBub3QgZXhpc3QgKERFTlNFIG5vZGVzKS4KKyAgICAgKiBQb3NpdGlvbiBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBub2RlIHdpdGhpbiB0aGUgQnl0ZUJ1ZmZlci4gcG9zaXRpb25Mb25nIGlzIGl0cyBnbG9iYWwgcGxhY2VtZW50LCB3aGljaCBpcyB0aGUKKyAgICAgKiBiYXNlIGZvciBhbnkgb2Zmc2V0IGNhbGN1bGF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbkxvbmcgYWx0aG91Z2ggaXQgc2VlbXMgdG8gYmUgb2J2aW91cywgdGhpcyBhcmd1bWVudCBtdXN0IGJlICJyZWFsIiwgdGhhdCBpcywgZWFjaCBjaGlsZCBtdXN0IGhhdmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBjYWxjdWxhdGVkIGFic29sdXRlIHBvc2l0aW9uID49IDAsIG90aGVyd2lzZSB0aGUgYmVoYXZpb3VyIG9mIHRoaXMgbWV0aG9kIGlzIHVuZGVmaW5lZAorICAgICAqIEBwYXJhbSBjaGlsZEluZGV4ICAgbXVzdCBiZSA+PSAwIGFuZCA8IHtAbGluayAjdHJhbnNpdGlvblJhbmdlKEJ5dGVCdWZmZXIsIGludCl9IC0gbm90ZSB0aGF0IHRoaXMgaXMgbm90IHZhbGlkYXRlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgYW5kIGJlaGF2aW91ciBvZiB0aGlzIG1ldGhvZCBpcyB1bmRlZmluZWQgZm9yIHZhbHVlcyBvdXRzaWRlIG9mIHRoYXQgcmFuZ2UKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyB0cmFuc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGxvbmcgcG9zaXRpb25Mb25nLCBpbnQgY2hpbGRJbmRleCkKKyAgICB7CisgICAgICAgIC8vIG5vdGU6IHRoaXMgaXMgbm90IHZhbGlkIGZvciBkZW5zZSBub2RlcworICAgICAgICByZXR1cm4gcG9zaXRpb25Mb25nICsgdHJhbnNpdGlvbkRlbHRhKHNyYywgcG9zaXRpb24sIGNoaWxkSW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGhpZ2hlc3QgdHJhbnNpdGlvbiBmb3IgdGhpcyBub2RlLCBvciBOT05FIGlmIG5vbmUgZXhpc3QgKFBBWUxPQURfT05MWSBub2RlcykuCisgICAgICovCisgICAgcHVibGljIGxvbmcgbGFzdFRyYW5zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgbG9uZyBwb3NpdGlvbkxvbmcpCisgICAgeworICAgICAgICByZXR1cm4gdHJhbnNpdGlvbihzcmMsIHBvc2l0aW9uLCBwb3NpdGlvbkxvbmcsIHRyYW5zaXRpb25SYW5nZShzcmMsIHBvc2l0aW9uKSAtIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB0cmFuc2l0aW9uIHRoYXQgaXMgaGlnaGVyIHRoYW4gdGhlIGluZGV4IHJldHVybmVkIGJ5IHtAY29kZSBzZWFyY2h9LiBUaGlzIG1heSBub3QgZXhpc3QgKGlmIHRoZQorICAgICAqIGFyZ3VtZW50IHdhcyBoaWdoZXIgdGhhbiB0aGUgbGFzdCB0cmFuc2l0aW9uIGJ5dGUpLCBpbiB3aGljaCBjYXNlIHRoaXMgcmV0dXJucyB0aGUgZ2l2ZW4ge0Bjb2RlIGRlZmF1bHRWYWx1ZX0uCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIGxvbmcgZ3JlYXRlclRyYW5zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgbG9uZyBwb3NpdGlvbkxvbmcsIGludCBzZWFyY2hJbmRleCwgbG9uZyBkZWZhdWx0VmFsdWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHRyYW5zaXRpb24gdGhhdCBpcyBsb3dlciB0aGFuIHRoZSBpbmRleCByZXR1cm5lZCBieSB7QGNvZGUgc2VhcmNofS4gUmV0dXJucyB7QGNvZGUgZGVmYXVsdFZhbHVlfSBmb3IKKyAgICAgKiB7QGNvZGUgc2VhcmNoSW5kZXh9IGVxdWFscyAwIG9yIC0xIGFzIGxlc3NlciB0cmFuc2l0aW9uIGZvciB0aG9zZSBpbmRleGVzIGRvZXMgbm90IGV4aXN0LgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBsb25nIGxlc3NlclRyYW5zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgbG9uZyBwb3NpdGlvbkxvbmcsIGludCBzZWFyY2hJbmRleCwgbG9uZyBkZWZhdWx0VmFsdWUpOworCisgICAgLy8gQ29uc3RydWN0aW9uIChzZXJpYWxpemF0aW9uKSBtZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbm9kZSB0eXBlIHRoYXQgaXMgc3VpdGFibGUgdG8gc3RvcmUgdGhlIG5vZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUcmllTm9kZSB0eXBlRm9yKFNlcmlhbGl6YXRpb25Ob2RlPD8+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKQorICAgIHsKKyAgICAgICAgaW50IGMgPSBub2RlLmNoaWxkQ291bnQoKTsKKyAgICAgICAgaWYgKGMgPT0gMCkKKyAgICAgICAgICAgIHJldHVybiBUeXBlcy5QQVlMT0FEX09OTFk7CisKKyAgICAgICAgaW50IGJpdHNQZXJQb2ludGVySW5kZXggPSAwOworICAgICAgICBsb25nIGRlbHRhID0gbm9kZS5tYXhQb3NpdGlvbkRlbHRhKG5vZGVQb3NpdGlvbik7CisgICAgICAgIGFzc2VydCBkZWx0YSA8IDA7CisgICAgICAgIHdoaWxlICghVHlwZXMuc2luZ2xlc1tiaXRzUGVyUG9pbnRlckluZGV4XS5maXRzKC1kZWx0YSkpCisgICAgICAgICAgICArK2JpdHNQZXJQb2ludGVySW5kZXg7CisKKyAgICAgICAgaWYgKGMgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5vZGUucGF5bG9hZCgpICE9IG51bGwgJiYgVHlwZXMuc2luZ2xlc1tiaXRzUGVyUG9pbnRlckluZGV4XS5ieXRlc1BlclBvaW50ZXIgPT0gRlJBQ1RJT05BTF9CWVRFUykKKyAgICAgICAgICAgICAgICArK2JpdHNQZXJQb2ludGVySW5kZXg7IC8vIG5leHQgaW5kZXggd2lsbCBwZXJtaXQgcGF5bG9hZAorCisgICAgICAgICAgICByZXR1cm4gVHlwZXMuc2luZ2xlc1tiaXRzUGVyUG9pbnRlckluZGV4XTsKKyAgICAgICAgfQorCisgICAgICAgIFRyaWVOb2RlIHNwYXJzZSA9IFR5cGVzLnNwYXJzZXNbYml0c1BlclBvaW50ZXJJbmRleF07CisgICAgICAgIFRyaWVOb2RlIGRlbnNlID0gVHlwZXMuZGVuc2VzW2JpdHNQZXJQb2ludGVySW5kZXhdOworICAgICAgICByZXR1cm4gKHNwYXJzZS5zaXplb2ZOb2RlKG5vZGUpIDwgZGVuc2Uuc2l6ZW9mTm9kZShub2RlKSkgPyBzcGFyc2UgOiBkZW5zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG5lZWRlZCB0byBzZXJpYWxpemUgdGhpcyBub2RlLgorICAgICAqLworICAgIGFic3RyYWN0IHB1YmxpYyBpbnQgc2l6ZW9mTm9kZShTZXJpYWxpemF0aW9uTm9kZTw/PiBub2RlKTsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6ZXMgdGhlIG5vZGUuIEFsbCB0cmFuc2l0aW9uIHRhcmdldCBwb3NpdGlvbnMgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBkZWZpbmVkLiB7QGNvZGUgcGF5bG9hZEJpdHN9IG11c3QKKyAgICAgKiBiZSBmb3VyIGJpdHMuCisgICAgICovCisgICAgYWJzdHJhY3QgcHVibGljIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIG91dCwgU2VyaWFsaXphdGlvbk5vZGU8Pz4gbm9kZSwgaW50IHBheWxvYWRCaXRzLCBsb25nIG5vZGVQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLy8gSW1wbGVtZW50YXRpb25zCisKKyAgICBmaW5hbCBpbnQgYnl0ZXNQZXJQb2ludGVyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRlJBQ1RJT05BTF9CWVRFUyA9IDA7CisKKyAgICBUcmllTm9kZShpbnQgb3JkaW5hbCwgaW50IGJ5dGVzUGVyUG9pbnRlcikKKyAgICB7CisgICAgICAgIHRoaXMub3JkaW5hbCA9IG9yZGluYWw7CisgICAgICAgIHRoaXMuYnl0ZXNQZXJQb2ludGVyID0gYnl0ZXNQZXJQb2ludGVyOworICAgIH0KKworICAgIGZpbmFsIGludCBvcmRpbmFsOworCisgICAgc3RhdGljIHByaXZhdGUgY2xhc3MgUGF5bG9hZE9ubHkgZXh0ZW5kcyBUcmllTm9kZQorICAgIHsKKyAgICAgICAgLy8gYnl0ZSBmbGFncworICAgICAgICAvLyB2YXIgcGF5bG9hZAorICAgICAgICBQYXlsb2FkT25seShpbnQgb3JkaW5hbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIob3JkaW5hbCwgRlJBQ1RJT05BTF9CWVRFUyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBwYXlsb2FkUG9zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNlYXJjaChCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBpbnQgdHJhbnNpdGlvbkJ5dGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyB0cmFuc2l0aW9uRGVsdGEoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IGNoaWxkSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHRyYW5zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgbG9uZyBwb3NpdGlvbkxvbmcsIGludCBjaGlsZEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTk9ORTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBsYXN0VHJhbnNpdGlvbihCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBsb25nIHBvc2l0aW9uTG9uZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE5PTkU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ3JlYXRlclRyYW5zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgbG9uZyBwb3NpdGlvbkxvbmcsIGludCBzZWFyY2hJbmRleCwgbG9uZyBkZWZhdWx0VmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgbGVzc2VyVHJhbnNpdGlvbihCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBsb25nIHBvc2l0aW9uTG9uZywgaW50IHNlYXJjaEluZGV4LCBsb25nIGRlZmF1bHRWYWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHRyYW5zaXRpb25CeXRlKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBjaGlsZEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB0cmFuc2l0aW9uUmFuZ2UoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHNpemVvZk5vZGUoU2VyaWFsaXphdGlvbk5vZGU8Pz4gbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIGRlc3QsIFNlcmlhbGl6YXRpb25Ob2RlPD8+IG5vZGUsIGludCBwYXlsb2FkQml0cywgbG9uZyBub2RlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgob3JkaW5hbCA8PCA0KSArIChwYXlsb2FkQml0cyAmIDB4MEYpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIFNpbmdsZSBleHRlbmRzIFRyaWVOb2RlCisgICAgeworICAgICAgICAvLyBieXRlIGZsYWdzCisgICAgICAgIC8vIGJ5dGUgdHJhbnNpdGlvbgorICAgICAgICAvLyBieXRlc1BlclBvaW50ZXIgYnl0ZXMgdHJhbnNpdGlvbiB0YXJnZXQKKyAgICAgICAgLy8gdmFyIHBheWxvYWQKKworICAgICAgICBTaW5nbGUoaW50IG9yZGluYWwsIGludCBieXRlc1BlclBvaW50ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG9yZGluYWwsIGJ5dGVzUGVyUG9pbnRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBwYXlsb2FkUG9zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uICsgMiArIGJ5dGVzUGVyUG9pbnRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNlYXJjaChCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBpbnQgdHJhbnNpdGlvbkJ5dGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjID0gc3JjLmdldChwb3NpdGlvbiArIDEpICYgMHhGRjsKKyAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uQnl0ZSA9PSBjKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuIHRyYW5zaXRpb25CeXRlIDwgYyA/IC0xIDogLTI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyB0cmFuc2l0aW9uRGVsdGEoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IGNoaWxkSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAtcmVhZEJ5dGVzKHNyYywgcG9zaXRpb24gKyAyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBsYXN0VHJhbnNpdGlvbihCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBsb25nIHBvc2l0aW9uTG9uZykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zaXRpb24oc3JjLCBwb3NpdGlvbiwgcG9zaXRpb25Mb25nLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBncmVhdGVyVHJhbnNpdGlvbihCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBsb25nIHBvc2l0aW9uTG9uZywgaW50IHNlYXJjaEluZGV4LCBsb25nIGRlZmF1bHRWYWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChzZWFyY2hJbmRleCA9PSAtMSkgPyB0cmFuc2l0aW9uKHNyYywgcG9zaXRpb24sIHBvc2l0aW9uTG9uZywgMCkgOiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgbGVzc2VyVHJhbnNpdGlvbihCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBsb25nIHBvc2l0aW9uTG9uZywgaW50IHNlYXJjaEluZGV4LCBsb25nIGRlZmF1bHRWYWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNlYXJjaEluZGV4ID09IDAgfHwgc2VhcmNoSW5kZXggPT0gLTEgPyBkZWZhdWx0VmFsdWUgOiB0cmFuc2l0aW9uKHNyYywgcG9zaXRpb24sIHBvc2l0aW9uTG9uZywgMCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB0cmFuc2l0aW9uQnl0ZShCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBpbnQgY2hpbGRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNoaWxkSW5kZXggPT0gMCA/IHNyYy5nZXQocG9zaXRpb24gKyAxKSAmIDB4RkYgOiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHRyYW5zaXRpb25SYW5nZShCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZW9mTm9kZShTZXJpYWxpemF0aW9uTm9kZTw/PiBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMiArIGJ5dGVzUGVyUG9pbnRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgZGVzdCwgU2VyaWFsaXphdGlvbk5vZGU8Pz4gbm9kZSwgaW50IHBheWxvYWRCaXRzLCBsb25nIG5vZGVQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjaGlsZENvdW50ID0gbm9kZS5jaGlsZENvdW50KCk7CisgICAgICAgICAgICBhc3NlcnQgY2hpbGRDb3VudCA9PSAxOworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKG9yZGluYWwgPDwgNCkgKyAocGF5bG9hZEJpdHMgJiAweDBGKSk7CisKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKG5vZGUudHJhbnNpdGlvbigwKSk7CisgICAgICAgICAgICB3cml0ZUJ5dGVzKGRlc3QsIC1ub2RlLnNlcmlhbGl6ZWRQb3NpdGlvbkRlbHRhKDAsIG5vZGVQb3NpdGlvbikpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHByaXZhdGUgY2xhc3MgU2luZ2xlTm9QYXlsb2FkNCBleHRlbmRzIFNpbmdsZQorICAgIHsKKyAgICAgICAgLy8gNC1iaXQgdHlwZSBvcmRpbmFsCisgICAgICAgIC8vIDQtYml0IHRhcmdldCBkZWx0YQorICAgICAgICAvLyBieXRlIHRyYW5zaXRpb24KKyAgICAgICAgLy8gbm8gcGF5bG9hZCEKKyAgICAgICAgU2luZ2xlTm9QYXlsb2FkNChpbnQgb3JkaW5hbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIob3JkaW5hbCwgRlJBQ1RJT05BTF9CWVRFUyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBwYXlsb2FkRmxhZ3MoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBBbHRob3VnaCB3ZSBkb24ndCBoYXZlIGEgcGF5bG9hZCBwb3NpdGlvbiwgcHJvdmlkZSBvbmUgZm9yIGNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIHRoZSBub2RlLgorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBwYXlsb2FkUG9zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uICsgMjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyB0cmFuc2l0aW9uRGVsdGEoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IGNoaWxkSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAtKHNyYy5nZXQocG9zaXRpb24pICYgMHhGKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBib29sZWFuIGZpdHMobG9uZyBkZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDAgPD0gZGVsdGEgJiYgZGVsdGEgPD0gMHhGOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBkZXN0LCBTZXJpYWxpemF0aW9uTm9kZTw/PiBub2RlLCBpbnQgcGF5bG9hZEJpdHMsIGxvbmcgbm9kZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IHBheWxvYWRCaXRzID09IDA7CisgICAgICAgICAgICBpbnQgY2hpbGRDb3VudCA9IG5vZGUuY2hpbGRDb3VudCgpOworICAgICAgICAgICAgYXNzZXJ0IGNoaWxkQ291bnQgPT0gMTsKKyAgICAgICAgICAgIGxvbmcgcGQgPSAtbm9kZS5zZXJpYWxpemVkUG9zaXRpb25EZWx0YSgwLCBub2RlUG9zaXRpb24pOworICAgICAgICAgICAgYXNzZXJ0IHBkID4gMCAmJiBwZCA8IDB4MTA7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgob3JkaW5hbCA8PCA0KSArIChpbnQpIChwZCAmIDB4MEYpKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKG5vZGUudHJhbnNpdGlvbigwKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzaXplb2ZOb2RlKFNlcmlhbGl6YXRpb25Ob2RlPD8+IG5vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHByaXZhdGUgY2xhc3MgU2luZ2xlTm9QYXlsb2FkMTIgZXh0ZW5kcyBTaW5nbGUKKyAgICB7CisgICAgICAgIC8vIDQtYml0IHR5cGUgb3JkaW5hbAorICAgICAgICAvLyAxMi1iaXQgdGFyZ2V0IGRlbHRhCisgICAgICAgIC8vIGJ5dGUgdHJhbnNpdGlvbgorICAgICAgICAvLyBubyBwYXlsb2FkIQorICAgICAgICBTaW5nbGVOb1BheWxvYWQxMihpbnQgb3JkaW5hbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIob3JkaW5hbCwgRlJBQ1RJT05BTF9CWVRFUyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBwYXlsb2FkRmxhZ3MoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBBbHRob3VnaCB3ZSBkb24ndCBoYXZlIGEgcGF5bG9hZCBwb3NpdGlvbiwgcHJvdmlkZSBvbmUgZm9yIGNhbGN1bGF0aW5nIHRoZSBzaXplIG9mIHRoZSBub2RlLgorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBwYXlsb2FkUG9zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uICsgMzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNlYXJjaChCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBpbnQgdHJhbnNpdGlvbkJ5dGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjID0gc3JjLmdldChwb3NpdGlvbiArIDIpICYgMHhGRjsKKyAgICAgICAgICAgIGlmICh0cmFuc2l0aW9uQnl0ZSA9PSBjKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuIHRyYW5zaXRpb25CeXRlIDwgYyA/IC0xIDogLTI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgdHJhbnNpdGlvbkRlbHRhKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBjaGlsZEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gLShzcmMuZ2V0U2hvcnQocG9zaXRpb24pICYgMHhGRkYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNpdGlvbkJ5dGUoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IGNoaWxkSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjaGlsZEluZGV4ID09IDAgPyBzcmMuZ2V0KHBvc2l0aW9uICsgMikgJiAweEZGIDogSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgYm9vbGVhbiBmaXRzKGxvbmcgZGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwIDw9IGRlbHRhICYmIGRlbHRhIDw9IDB4RkZGOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShEYXRhT3V0cHV0UGx1cyBkZXN0LCBTZXJpYWxpemF0aW9uTm9kZTw/PiBub2RlLCBpbnQgcGF5bG9hZEJpdHMsIGxvbmcgbm9kZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IHBheWxvYWRCaXRzID09IDA7CisgICAgICAgICAgICBpbnQgY2hpbGRDb3VudCA9IG5vZGUuY2hpbGRDb3VudCgpOworICAgICAgICAgICAgYXNzZXJ0IGNoaWxkQ291bnQgPT0gMTsKKyAgICAgICAgICAgIGxvbmcgcGQgPSAtbm9kZS5zZXJpYWxpemVkUG9zaXRpb25EZWx0YSgwLCBub2RlUG9zaXRpb24pOworICAgICAgICAgICAgYXNzZXJ0IHBkID4gMCAmJiBwZCA8IDB4MTAwMDsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChvcmRpbmFsIDw8IDQpICsgKGludCkgKChwZCA+PiA4KSAmIDB4MEYpKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChieXRlKSBwZCk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZShub2RlLnRyYW5zaXRpb24oMCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZW9mTm9kZShTZXJpYWxpemF0aW9uTm9kZTw/PiBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIFNwYXJzZSBleHRlbmRzIFRyaWVOb2RlCisgICAgeworICAgICAgICAvLyBieXRlIGZsYWdzCisgICAgICAgIC8vIGJ5dGUgY291bnQgKDw9IDI1NSkKKyAgICAgICAgLy8gY291bnQgYnl0ZXMgdHJhbnNpdGlvbnMKKyAgICAgICAgLy8gY291bnQgaW50cyB0cmFuc2l0aW9uIHRhcmdldHMKKyAgICAgICAgLy8gdmFyIHBheWxvYWQKKworICAgICAgICBTcGFyc2UoaW50IG9yZGluYWwsIGludCBieXRlc1BlclBvaW50ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG9yZGluYWwsIGJ5dGVzUGVyUG9pbnRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB0cmFuc2l0aW9uUmFuZ2UoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHNyYy5nZXQocG9zaXRpb24gKyAxKSAmIDB4RkY7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBwYXlsb2FkUG9zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvdW50ID0gdHJhbnNpdGlvblJhbmdlKHNyYywgcG9zaXRpb24pOworICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uICsgMiArIChieXRlc1BlclBvaW50ZXIgKyAxKSAqIGNvdW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2VhcmNoKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBrZXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsID0gLTE7IC8vIGtub3duIDwga2V5CisgICAgICAgICAgICBpbnQgciA9IHRyYW5zaXRpb25SYW5nZShzcmMsIHBvc2l0aW9uKTsgICAvLyBrbm93biA+IGtleQorICAgICAgICAgICAgcG9zaXRpb24gKz0gMjsKKworICAgICAgICAgICAgd2hpbGUgKGwgKyAxIDwgcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbSA9IChsICsgciArIDEpIC8gMjsKKyAgICAgICAgICAgICAgICBpbnQgY2hpbGRUcmFuc2l0aW9uID0gc3JjLmdldChwb3NpdGlvbiArIG0pICYgMHhGRjsKKyAgICAgICAgICAgICAgICBpbnQgY21wID0gSW50ZWdlci5jb21wYXJlKGtleSwgY2hpbGRUcmFuc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgciA9IG07CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY21wID4gMCkKKyAgICAgICAgICAgICAgICAgICAgbCA9IG07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIC1yIC0gMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyB0cmFuc2l0aW9uRGVsdGEoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IGNoaWxkSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBjaGlsZEluZGV4ID49IDA7CisgICAgICAgICAgICBpbnQgcmFuZ2UgPSB0cmFuc2l0aW9uUmFuZ2Uoc3JjLCBwb3NpdGlvbik7CisgICAgICAgICAgICBhc3NlcnQgY2hpbGRJbmRleCA8IHJhbmdlOworICAgICAgICAgICAgcmV0dXJuIC1yZWFkQnl0ZXMoc3JjLCBwb3NpdGlvbiArIDIgKyByYW5nZSArIGJ5dGVzUGVyUG9pbnRlciAqIGNoaWxkSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdyZWF0ZXJUcmFuc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGxvbmcgcG9zaXRpb25Mb25nLCBpbnQgc2VhcmNoSW5kZXgsIGxvbmcgZGVmYXVsdFZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2VhcmNoSW5kZXggPCAwKQorICAgICAgICAgICAgICAgIHNlYXJjaEluZGV4ID0gLTEgLSBzZWFyY2hJbmRleDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICArK3NlYXJjaEluZGV4OworICAgICAgICAgICAgaWYgKHNlYXJjaEluZGV4ID49IHRyYW5zaXRpb25SYW5nZShzcmMsIHBvc2l0aW9uKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgcmV0dXJuIHRyYW5zaXRpb24oc3JjLCBwb3NpdGlvbiwgcG9zaXRpb25Mb25nLCBzZWFyY2hJbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBsZXNzZXJUcmFuc2l0aW9uKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGxvbmcgcG9zaXRpb25Mb25nLCBpbnQgc2VhcmNoSW5kZXgsIGxvbmcgZGVmYXVsdFZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc2VhcmNoSW5kZXggPT0gMCB8fCBzZWFyY2hJbmRleCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgaWYgKHNlYXJjaEluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICBzZWFyY2hJbmRleCA9IC0yIC0gc2VhcmNoSW5kZXg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgLS1zZWFyY2hJbmRleDsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2l0aW9uKHNyYywgcG9zaXRpb24sIHBvc2l0aW9uTG9uZywgc2VhcmNoSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgdHJhbnNpdGlvbkJ5dGUoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgaW50IGNoaWxkSW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjaGlsZEluZGV4IDwgdHJhbnNpdGlvblJhbmdlKHNyYywgcG9zaXRpb24pID8gc3JjLmdldChwb3NpdGlvbiArIDIgKyBjaGlsZEluZGV4KSAmIDB4RkYgOiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNpemVvZk5vZGUoU2VyaWFsaXphdGlvbk5vZGU8Pz4gbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDIgKyBub2RlLmNoaWxkQ291bnQoKSAqICgxICsgYnl0ZXNQZXJQb2ludGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgZGVzdCwgU2VyaWFsaXphdGlvbk5vZGU8Pz4gbm9kZSwgaW50IHBheWxvYWRCaXRzLCBsb25nIG5vZGVQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjaGlsZENvdW50ID0gbm9kZS5jaGlsZENvdW50KCk7CisgICAgICAgICAgICBhc3NlcnQgY2hpbGRDb3VudCA+IDA7CisgICAgICAgICAgICBhc3NlcnQgY2hpbGRDb3VudCA8IDI1NjsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKChvcmRpbmFsIDw8IDQpICsgKHBheWxvYWRCaXRzICYgMHgwRikpOworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoY2hpbGRDb3VudCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRDb3VudDsgKytpKQorICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKG5vZGUudHJhbnNpdGlvbihpKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7ICsraSkKKyAgICAgICAgICAgICAgICB3cml0ZUJ5dGVzKGRlc3QsIC1ub2RlLnNlcmlhbGl6ZWRQb3NpdGlvbkRlbHRhKGksIG5vZGVQb3NpdGlvbikpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHByaXZhdGUgY2xhc3MgU3BhcnNlMTIgZXh0ZW5kcyBTcGFyc2UKKyAgICB7CisgICAgICAgIC8vIGJ5dGUgZmxhZ3MKKyAgICAgICAgLy8gYnl0ZSBjb3VudCAoPD0gMjU1KQorICAgICAgICAvLyBjb3VudCBieXRlcyB0cmFuc2l0aW9ucworICAgICAgICAvLyBjb3VudCAxMi1iaXRzIHRyYW5zaXRpb24gdGFyZ2V0cworICAgICAgICAvLyB2YXIgcGF5bG9hZAorICAgICAgICBTcGFyc2UxMihpbnQgb3JkaW5hbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIob3JkaW5hbCwgRlJBQ1RJT05BTF9CWVRFUyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBwYXlsb2FkUG9zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvdW50ID0gdHJhbnNpdGlvblJhbmdlKHNyYywgcG9zaXRpb24pOworICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uICsgMiArICg1ICogY291bnQgKyAxKSAvIDI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgdHJhbnNpdGlvbkRlbHRhKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBjaGlsZEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gLXJlYWQxMkJpdHMoc3JjLCBwb3NpdGlvbiArIDIgKyB0cmFuc2l0aW9uUmFuZ2Uoc3JjLCBwb3NpdGlvbiksIGNoaWxkSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZW9mTm9kZShTZXJpYWxpemF0aW9uTm9kZTw/PiBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMiArIChub2RlLmNoaWxkQ291bnQoKSAqIDUgKyAxKSAvIDI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIGRlc3QsIFNlcmlhbGl6YXRpb25Ob2RlPD8+IG5vZGUsIGludCBwYXlsb2FkQml0cywgbG9uZyBub2RlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY2hpbGRDb3VudCA9IG5vZGUuY2hpbGRDb3VudCgpOworICAgICAgICAgICAgYXNzZXJ0IGNoaWxkQ291bnQgPCAyNTY7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgob3JkaW5hbCA8PCA0KSArIChwYXlsb2FkQml0cyAmIDB4MEYpKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKGNoaWxkQ291bnQpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7ICsraSkKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZShub2RlLnRyYW5zaXRpb24oaSkpOworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpICsgMiA8PSBjaGlsZENvdW50OyBpICs9IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHAwID0gKGludCkgLW5vZGUuc2VyaWFsaXplZFBvc2l0aW9uRGVsdGEoaSwgbm9kZVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBpbnQgcDEgPSAoaW50KSAtbm9kZS5zZXJpYWxpemVkUG9zaXRpb25EZWx0YShpICsgMSwgbm9kZVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgcDAgPiAwICYmIHAwIDwgKDEgPDwgMTIpOworICAgICAgICAgICAgICAgIGFzc2VydCBwMSA+IDAgJiYgcDEgPCAoMSA8PCAxMik7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUocDAgPj4gNCk7CisgICAgICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKHAwIDw8IDQpIHwgKHAxID4+IDgpKTsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZShwMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA8IGNoaWxkQ291bnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9uZyBwZCA9IC1ub2RlLnNlcmlhbGl6ZWRQb3NpdGlvbkRlbHRhKGksIG5vZGVQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgYXNzZXJ0IHBkID4gMCAmJiBwZCA8ICgxIDw8IDEyKTsKKyAgICAgICAgICAgICAgICBkZXN0LndyaXRlU2hvcnQoKHNob3J0KSAocGQgPDwgNCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJvb2xlYW4gZml0cyhsb25nIGRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMCA8PSBkZWx0YSAmJiBkZWx0YSA8PSAweEZGRjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBwcml2YXRlIGNsYXNzIERlbnNlIGV4dGVuZHMgVHJpZU5vZGUKKyAgICB7CisgICAgICAgIC8vIGJ5dGUgZmxhZ3MKKyAgICAgICAgLy8gYnl0ZSBzdGFydAorICAgICAgICAvLyBieXRlIGxlbmd0aC0xCisgICAgICAgIC8vIGxlbmd0aCBpbnRzIHRyYW5zaXRpb24gdGFyZ2V0cyAoLTEgZm9yIG5vdCBwcmVzZW50KQorICAgICAgICAvLyB2YXIgcGF5bG9hZAorCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgTlVMTF9WQUxVRSA9IDA7CisKKyAgICAgICAgRGVuc2UoaW50IG9yZGluYWwsIGludCBieXRlc1BlclBvaW50ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG9yZGluYWwsIGJ5dGVzUGVyUG9pbnRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB0cmFuc2l0aW9uUmFuZ2UoQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDEgKyAoc3JjLmdldChwb3NpdGlvbiArIDIpICYgMHhGRik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBwYXlsb2FkUG9zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uICsgMyArIHRyYW5zaXRpb25SYW5nZShzcmMsIHBvc2l0aW9uKSAqIGJ5dGVzUGVyUG9pbnRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNlYXJjaChCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBpbnQgdHJhbnNpdGlvbkJ5dGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsID0gc3JjLmdldChwb3NpdGlvbiArIDEpICYgMHhGRjsKKyAgICAgICAgICAgIGludCBpID0gdHJhbnNpdGlvbkJ5dGUgLSBsOworICAgICAgICAgICAgaWYgKGkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGludCBsZW4gPSB0cmFuc2l0aW9uUmFuZ2Uoc3JjLCBwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAoaSA+PSBsZW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIC1sZW4gLSAxOworICAgICAgICAgICAgbG9uZyB0ID0gdHJhbnNpdGlvbihzcmMsIHBvc2l0aW9uLCAwTCwgaSk7CisgICAgICAgICAgICByZXR1cm4gdCAhPSAtMSA/IGkgOiAtaSAtIDE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgdHJhbnNpdGlvbkRlbHRhKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBjaGlsZEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gLXJlYWRCeXRlcyhzcmMsIHBvc2l0aW9uICsgMyArIGNoaWxkSW5kZXggKiBieXRlc1BlclBvaW50ZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHRyYW5zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgbG9uZyBwb3NpdGlvbkxvbmcsIGludCBjaGlsZEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHYgPSB0cmFuc2l0aW9uRGVsdGEoc3JjLCBwb3NpdGlvbiwgY2hpbGRJbmRleCk7CisgICAgICAgICAgICByZXR1cm4gdiAhPSBOVUxMX1ZBTFVFID8gdiArIHBvc2l0aW9uTG9uZyA6IE5PTkU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ3JlYXRlclRyYW5zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgbG9uZyBwb3NpdGlvbkxvbmcsIGludCBzZWFyY2hJbmRleCwgbG9uZyBkZWZhdWx0VmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzZWFyY2hJbmRleCA8IDApCisgICAgICAgICAgICAgICAgc2VhcmNoSW5kZXggPSAtMSAtIHNlYXJjaEluZGV4OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICsrc2VhcmNoSW5kZXg7CisgICAgICAgICAgICBpbnQgbGVuID0gdHJhbnNpdGlvblJhbmdlKHNyYywgcG9zaXRpb24pOworICAgICAgICAgICAgZm9yICg7IHNlYXJjaEluZGV4IDwgbGVuOyArK3NlYXJjaEluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgdCA9IHRyYW5zaXRpb24oc3JjLCBwb3NpdGlvbiwgcG9zaXRpb25Mb25nLCBzZWFyY2hJbmRleCk7CisgICAgICAgICAgICAgICAgaWYgKHQgIT0gTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGxlc3NlclRyYW5zaXRpb24oQnl0ZUJ1ZmZlciBzcmMsIGludCBwb3NpdGlvbiwgbG9uZyBwb3NpdGlvbkxvbmcsIGludCBzZWFyY2hJbmRleCwgbG9uZyBkZWZhdWx0VmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzZWFyY2hJbmRleCA9PSAwIHx8IHNlYXJjaEluZGV4ID09IC0xKQorICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisKKyAgICAgICAgICAgIGlmIChzZWFyY2hJbmRleCA8IDApCisgICAgICAgICAgICAgICAgc2VhcmNoSW5kZXggPSAtMiAtIHNlYXJjaEluZGV4OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIC0tc2VhcmNoSW5kZXg7CisgICAgICAgICAgICBmb3IgKDsgc2VhcmNoSW5kZXggPj0gMDsgLS1zZWFyY2hJbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIHQgPSB0cmFuc2l0aW9uKHNyYywgcG9zaXRpb24sIHBvc2l0aW9uTG9uZywgc2VhcmNoSW5kZXgpOworICAgICAgICAgICAgICAgIGlmICh0ICE9IC0xKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydCBmYWxzZSA6ICJ0cmFuc2l0aW9uIG11c3QgYWx3YXlzIGV4aXN0IGF0IDAsIGFuZCB3ZSBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgbGVzcyBvZiB0aGF0IjsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB0cmFuc2l0aW9uQnl0ZShCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uLCBpbnQgY2hpbGRJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNoaWxkSW5kZXggPj0gdHJhbnNpdGlvblJhbmdlKHNyYywgcG9zaXRpb24pKQorICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGludCBsID0gc3JjLmdldChwb3NpdGlvbiArIDEpICYgMHhGRjsKKyAgICAgICAgICAgIHJldHVybiBsICsgY2hpbGRJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNpemVvZk5vZGUoU2VyaWFsaXphdGlvbk5vZGU8Pz4gbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGwgPSBub2RlLnRyYW5zaXRpb24oMCk7CisgICAgICAgICAgICBpbnQgciA9IG5vZGUudHJhbnNpdGlvbihub2RlLmNoaWxkQ291bnQoKSAtIDEpOworICAgICAgICAgICAgcmV0dXJuIDMgKyAociAtIGwgKyAxKSAqIGJ5dGVzUGVyUG9pbnRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFBsdXMgZGVzdCwgU2VyaWFsaXphdGlvbk5vZGU8Pz4gbm9kZSwgaW50IHBheWxvYWRCaXRzLCBsb25nIG5vZGVQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjaGlsZENvdW50ID0gbm9kZS5jaGlsZENvdW50KCk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSgob3JkaW5hbCA8PCA0KSArIChwYXlsb2FkQml0cyAmIDB4MEYpKTsKKyAgICAgICAgICAgIGludCBsID0gbm9kZS50cmFuc2l0aW9uKDApOworICAgICAgICAgICAgaW50IHIgPSBub2RlLnRyYW5zaXRpb24oY2hpbGRDb3VudCAtIDEpOworICAgICAgICAgICAgYXNzZXJ0IDAgPD0gbCAmJiBsIDw9IHIgJiYgciA8PSAyNTU7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZShsKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKHIgLSBsKTsgICAgICAvLyByIGlzIGluY2x1ZGVkLCBpLmUuIHRoaXMgaXMgbGVuIC0gMQorCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV4dCA9IG5vZGUudHJhbnNpdGlvbihpKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobCA8IG5leHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3cml0ZUJ5dGVzKGRlc3QsIE5VTExfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICArK2w7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlQnl0ZXMoZGVzdCwgLW5vZGUuc2VyaWFsaXplZFBvc2l0aW9uRGVsdGEoaSwgbm9kZVBvc2l0aW9uKSk7CisgICAgICAgICAgICAgICAgKytsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHByaXZhdGUgY2xhc3MgRGVuc2UxMiBleHRlbmRzIERlbnNlCisgICAgeworICAgICAgICAvLyBieXRlIGZsYWdzCisgICAgICAgIC8vIGJ5dGUgc3RhcnQKKyAgICAgICAgLy8gYnl0ZSBsZW5ndGgtMQorICAgICAgICAvLyBsZW5ndGggMTItYml0cyB0cmFuc2l0aW9uIHRhcmdldHMgKC0xIGZvciBub3QgcHJlc2VudCkKKyAgICAgICAgLy8gdmFyIHBheWxvYWQKKworICAgICAgICBEZW5zZTEyKGludCBvcmRpbmFsKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihvcmRpbmFsLCBGUkFDVElPTkFMX0JZVEVTKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHBheWxvYWRQb3NpdGlvbihCeXRlQnVmZmVyIHNyYywgaW50IHBvc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcG9zaXRpb24gKyAzICsgKHRyYW5zaXRpb25SYW5nZShzcmMsIHBvc2l0aW9uKSAqIDMgKyAxKSAvIDI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgdHJhbnNpdGlvbkRlbHRhKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBjaGlsZEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gLXJlYWQxMkJpdHMoc3JjLCBwb3NpdGlvbiArIDMsIGNoaWxkSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZW9mTm9kZShTZXJpYWxpemF0aW9uTm9kZTw/PiBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbCA9IG5vZGUudHJhbnNpdGlvbigwKTsKKyAgICAgICAgICAgIGludCByID0gbm9kZS50cmFuc2l0aW9uKG5vZGUuY2hpbGRDb3VudCgpIC0gMSk7CisgICAgICAgICAgICByZXR1cm4gMyArICgociAtIGwgKyAxKSAqIDMgKyAxKSAvIDI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRQbHVzIGRlc3QsIFNlcmlhbGl6YXRpb25Ob2RlPD8+IG5vZGUsIGludCBwYXlsb2FkQml0cywgbG9uZyBub2RlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY2hpbGRDb3VudCA9IG5vZGUuY2hpbGRDb3VudCgpOworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUoKG9yZGluYWwgPDwgNCkgKyAocGF5bG9hZEJpdHMgJiAweDBGKSk7CisgICAgICAgICAgICBpbnQgbCA9IG5vZGUudHJhbnNpdGlvbigwKTsKKyAgICAgICAgICAgIGludCByID0gbm9kZS50cmFuc2l0aW9uKGNoaWxkQ291bnQgLSAxKTsKKyAgICAgICAgICAgIGFzc2VydCAwIDw9IGwgJiYgbCA8PSByICYmIHIgPD0gMjU1OworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGUobCk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZShyIC0gbCk7ICAgICAgLy8gciBpcyBpbmNsdWRlZCwgaS5lLiB0aGlzIGlzIGxlbiAtIDEKKworICAgICAgICAgICAgaW50IGNhcnJ5ID0gMDsKKyAgICAgICAgICAgIGludCBzdGFydCA9IGw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkQ291bnQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV4dCA9IG5vZGUudHJhbnNpdGlvbihpKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobCA8IG5leHQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjYXJyeSA9IHdyaXRlMTJCaXRzKGRlc3QsIE5VTExfVkFMVUUsIGwgLSBzdGFydCwgY2FycnkpOworICAgICAgICAgICAgICAgICAgICArK2w7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvbmcgcGQgPSBub2RlLnNlcmlhbGl6ZWRQb3NpdGlvbkRlbHRhKGksIG5vZGVQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgY2FycnkgPSB3cml0ZTEyQml0cyhkZXN0LCAoaW50KSAtcGQsIGwgLSBzdGFydCwgY2FycnkpOworICAgICAgICAgICAgICAgICsrbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoKGwgLSBzdGFydCkgJiAxKSA9PSAxKQorICAgICAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKGNhcnJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBib29sZWFuIGZpdHMobG9uZyBkZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDAgPD0gZGVsdGEgJiYgZGVsdGEgPD0gMHhGRkY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgcHJpdmF0ZSBjbGFzcyBMb25nRGVuc2UgZXh0ZW5kcyBEZW5zZQorICAgIHsKKyAgICAgICAgLy8gYnl0ZSBmbGFncworICAgICAgICAvLyBieXRlIHN0YXJ0CisgICAgICAgIC8vIGJ5dGUgbGVuZ3RoLTEKKyAgICAgICAgLy8gbGVuZ3RoIGxvbmcgdHJhbnNpdGlvbiB0YXJnZXRzICgtMSBmb3Igbm90IHByZXNlbnQpCisgICAgICAgIC8vIHZhciBwYXlsb2FkCisgICAgICAgIExvbmdEZW5zZShpbnQgb3JkaW5hbCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIob3JkaW5hbCwgOCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgdHJhbnNpdGlvbkRlbHRhKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24sIGludCBjaGlsZEluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gLXNyYy5nZXRMb25nKHBvc2l0aW9uICsgMyArIGNoaWxkSW5kZXggKiA4KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVzKERhdGFPdXRwdXRQbHVzIGRlc3QsIGxvbmcgb2ZzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC53cml0ZUxvbmcob2ZzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBib29sZWFuIGZpdHMobG9uZyBkZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHN0YXRpYyBpbnQgcmVhZDEyQml0cyhCeXRlQnVmZmVyIHNyYywgaW50IGJhc2UsIGludCBzZWFyY2hJbmRleCkKKyAgICB7CisgICAgICAgIGludCB3b3JkID0gc3JjLmdldFNob3J0KGJhc2UgKyAoMyAqIHNlYXJjaEluZGV4KSAvIDIpOworICAgICAgICBpZiAoKHNlYXJjaEluZGV4ICYgMSkgPT0gMCkKKyAgICAgICAgICAgIHdvcmQgPSAod29yZCA+PiA0KTsKKyAgICAgICAgcmV0dXJuIHdvcmQgJiAweEZGRjsKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IHdyaXRlMTJCaXRzKERhdGFPdXRwdXQgZGVzdCwgaW50IHZhbHVlLCBpbnQgaW5kZXgsIGludCBjYXJyeSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBhc3NlcnQgMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAweEZGRjsKKyAgICAgICAgaWYgKChpbmRleCAmIDEpID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlKHZhbHVlID4+IDQpOworICAgICAgICAgICAgcmV0dXJuIHZhbHVlIDw8IDQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZShjYXJyeSB8ICh2YWx1ZSA+PiA4KSk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZSh2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxvbmcgcmVhZEJ5dGVzKEJ5dGVCdWZmZXIgc3JjLCBpbnQgcG9zaXRpb24pCisgICAgeworICAgICAgICByZXR1cm4gU2l6ZWRJbnRzLnJlYWRVbnNpZ25lZChzcmMsIHBvc2l0aW9uLCBieXRlc1BlclBvaW50ZXIpOworICAgIH0KKworICAgIHZvaWQgd3JpdGVCeXRlcyhEYXRhT3V0cHV0UGx1cyBkZXN0LCBsb25nIG9mcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBhc3NlcnQgZml0cyhvZnMpOworICAgICAgICBTaXplZEludHMud3JpdGUoZGVzdCwgb2ZzLCBieXRlc1BlclBvaW50ZXIpOworICAgIH0KKworICAgIGJvb2xlYW4gZml0cyhsb25nIGRlbHRhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDAgPD0gZGVsdGEgJiYgZGVsdGEgPCAoMUwgPDwgKGJ5dGVzUGVyUG9pbnRlciAqIDgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIFN0cmluZyByZXMgPSBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgaWYgKGJ5dGVzUGVyUG9pbnRlciA+PSAxKQorICAgICAgICAgICAgcmVzICs9IChieXRlc1BlclBvaW50ZXIgKiA4KTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgVHlwZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZSBQQVlMT0FEX09OTFkgPSBuZXcgUGF5bG9hZE9ubHkoMCk7CisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZSBTSU5HTEVfTk9QQVlMT0FEXzQgPSBuZXcgU2luZ2xlTm9QYXlsb2FkNCgxKTsKKyAgICAgICAgc3RhdGljIGZpbmFsIFRyaWVOb2RlIFNJTkdMRV84ID0gbmV3IFNpbmdsZSgyLCAxKTsKKyAgICAgICAgc3RhdGljIGZpbmFsIFRyaWVOb2RlIFNJTkdMRV9OT1BBWUxPQURfMTIgPSBuZXcgU2luZ2xlTm9QYXlsb2FkMTIoMyk7CisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZSBTSU5HTEVfMTYgPSBuZXcgU2luZ2xlKDQsIDIpOworICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGUgU1BBUlNFXzggPSBuZXcgU3BhcnNlKDUsIDEpOworICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGUgU1BBUlNFXzEyID0gbmV3IFNwYXJzZTEyKDYpOworICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGUgU1BBUlNFXzE2ID0gbmV3IFNwYXJzZSg3LCAyKTsKKyAgICAgICAgc3RhdGljIGZpbmFsIFRyaWVOb2RlIFNQQVJTRV8yNCA9IG5ldyBTcGFyc2UoOCwgMyk7CisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZSBTUEFSU0VfNDAgPSBuZXcgU3BhcnNlKDksIDUpOworICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGUgREVOU0VfMTIgPSBuZXcgRGVuc2UxMigxMCk7CisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZSBERU5TRV8xNiA9IG5ldyBEZW5zZSgxMSwgMik7CisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZSBERU5TRV8yNCA9IG5ldyBEZW5zZSgxMiwgMyk7CisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZSBERU5TRV8zMiA9IG5ldyBEZW5zZSgxMywgNCk7CisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZSBERU5TRV80MCA9IG5ldyBEZW5zZSgxNCwgNSk7CisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZSBMT05HX0RFTlNFID0gbmV3IExvbmdEZW5zZSgxNSk7CisKKyAgICAgICAgLy8gVGhlIHBvc2l0aW9uIG9mIGVhY2ggdHlwZSBpbiB0aGlzIGxpc3QgbXVzdCBtYXRjaCBpdHMgb3JkaW5hbCB2YWx1ZS4gQ2hlY2tlZCBieSB0aGUgc3RhdGljIGJsb2NrIGJlbG93LgorICAgICAgICBzdGF0aWMgZmluYWwgVHJpZU5vZGVbXSB2YWx1ZXMgPSBuZXcgVHJpZU5vZGVbXXsgUEFZTE9BRF9PTkxZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lOR0xFX05PUEFZTE9BRF80LCBTSU5HTEVfOCwgU0lOR0xFX05PUEFZTE9BRF8xMiwgU0lOR0xFXzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBUlNFXzgsIFNQQVJTRV8xMiwgU1BBUlNFXzE2LCBTUEFSU0VfMjQsIFNQQVJTRV80MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFTlNFXzEyLCBERU5TRV8xNiwgREVOU0VfMjQsIERFTlNFXzMyLCBERU5TRV80MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPTkdfREVOU0UgfTsgLy8gQ2F0Y2gtYWxsCisKKyAgICAgICAgLy8gV2UgY2FuJ3QgZml0IGFsbCB0eXBlcyAqIGFsbCBzaXplcyBpbiA0IGJpdHMsIHNvIHdlIHVzZSBhIHNlbGVjdGlvbi4gV2hlbiB3ZSBkb24ndCBoYXZlIGEgbWF0Y2hpbmcgaW5zdGFuY2UKKyAgICAgICAgLy8gd2UganVzdCB1c2Ugc29tZXRoaW5nIG1vcmUgZ2VuZXJhbCB0aGF0IGNhbiBkbyBpdHMgam9iLgorICAgICAgICAvLyBUaGUgYXJyYXlzIGJlbG93IG11c3QgaGF2ZSBjb3JyZXNwb25kaW5nIHR5cGVzIGZvciBhbGwgc2l6ZXMgc3BlY2lmaWVkIGJ5IHRoZSBzaW5nbGVzIHJvdy4KKyAgICAgICAgLy8gTm90ZTogMTIgYml0IHNpemVzIGFyZSBpbXBvcnRhbnQsIGJlY2F1c2UgdGhhdCBzaXplIHdpbGwgZml0IGFueSBwb2ludGVyIHdpdGhpbiBhIHBhZ2UtcGFja2VkIGJyYW5jaC4KKyAgICAgICAgc3RhdGljIGZpbmFsIFRyaWVOb2RlW10gc2luZ2xlcyA9IG5ldyBUcmllTm9kZVtdeyBTSU5HTEVfTk9QQVlMT0FEXzQsIFNJTkdMRV84LCBTSU5HTEVfTk9QQVlMT0FEXzEyLCBTSU5HTEVfMTYsIERFTlNFXzI0LCBERU5TRV8zMiwgREVOU0VfNDAsIExPTkdfREVOU0UgfTsKKyAgICAgICAgc3RhdGljIGZpbmFsIFRyaWVOb2RlW10gc3BhcnNlcyA9IG5ldyBUcmllTm9kZVtdeyBTUEFSU0VfOCwgU1BBUlNFXzgsIFNQQVJTRV8xMiwgU1BBUlNFXzE2LCBTUEFSU0VfMjQsIFNQQVJTRV80MCwgU1BBUlNFXzQwLCBMT05HX0RFTlNFIH07CisgICAgICAgIHN0YXRpYyBmaW5hbCBUcmllTm9kZVtdIGRlbnNlcyA9IG5ldyBUcmllTm9kZVtdeyBERU5TRV8xMiwgREVOU0VfMTIsIERFTlNFXzEyLCBERU5TRV8xNiwgREVOU0VfMjQsIERFTlNFXzMyLCBERU5TRV80MCwgTE9OR19ERU5TRSB9OworCisgICAgICAgIHN0YXRpYworICAgICAgICB7CisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudENvbmRpdGlvbnMKKyAgICAgICAgICAgIGFzc2VydCBzcGFyc2VzLmxlbmd0aCA9PSBzaW5nbGVzLmxlbmd0aCAmJiBkZW5zZXMubGVuZ3RoID09IHNpbmdsZXMubGVuZ3RoICYmIHZhbHVlcy5sZW5ndGggPD0gMTY7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICBhc3NlcnQgdmFsdWVzW2ldLm9yZGluYWwgPT0gaTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1RyaWVTZXJpYWxpemVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9UcmllU2VyaWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMDEwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9UcmllU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGludGVyZmFjZSBUcmllU2VyaWFsaXplcjxWQUxVRSwgREVTVD4KK3sKKyAgICBpbnQgc2l6ZW9mTm9kZShTZXJpYWxpemF0aW9uTm9kZTxWQUxVRT4gbm9kZSwgbG9uZyBub2RlUG9zaXRpb24pOworCisgICAgLy8gT25seSBjYWxsZWQgYWZ0ZXIgYWxsIGNoaWxkcmVuJ3Mgc2VyaWFsaXplZFBvc2l0aW9ucyBoYXZlIGJlZW4gc2V0LgorICAgIHZvaWQgd3JpdGUoREVTVCBkZXN0LCBTZXJpYWxpemF0aW9uTm9kZTxWQUxVRT4gbm9kZSwgbG9uZyBub2RlUG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1ZhbHVlSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1ZhbHVlSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmUwY2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvVmFsdWVJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllczsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uY29uY3VycmVudC5Ob3RUaHJlYWRTYWZlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SZWJ1ZmZlcmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CisKKy8qKgorICogVGhyZWFkLXVuc2FmZSB2YWx1ZSBpdGVyYXRvciBmb3Igb24tZGlzayB0cmllcy4gVXNlcyB0aGUgYXNzdW1wdGlvbnMgb2Yge0BsaW5rIFdhbGtlcn0uCisgKiA8cD4KKyAqIFRoZSBtYWluIHV0aWxpdHkgb2YgdGhpcyBjbGFzcyBpcyB0aGUge0BsaW5rICNuZXh0UGF5bG9hZGVkTm9kZSgpfSBtZXRob2QsIHdoaWNoIGxpc3RzIGFsbCBub2RlcyB0aGF0IGNvbnRhaW4gYQorICogcGF5bG9hZCB3aXRoaW4gdGhlIHJlcXVlc3RlZCBib3VuZHMuIFRoZSB0cmVhdG1lbnQgb2YgdGhlIGJvdW5kcyBpcyBub24tc3RhbmRhcmQgKHNlZQorICoge0BsaW5rICNWYWx1ZUl0ZXJhdG9yKFJlYnVmZmVyZXIsIGxvbmcsIEJ5dGVDb21wYXJhYmxlLCBCeXRlQ29tcGFyYWJsZSwgYm9vbGVhbil9KSwgbmVjZXNzYXJ5IHRvIHByb3Blcmx5IHdhbGsKKyAqIHRyaWVzIG9mIHByZWZpeGVzIGFuZCBzZXBhcmF0b3JzLgorICovCitATm90VGhyZWFkU2FmZQorcHVibGljIGNsYXNzIFZhbHVlSXRlcmF0b3I8Q09OQ1JFVEUgZXh0ZW5kcyBWYWx1ZUl0ZXJhdG9yPENPTkNSRVRFPj4gZXh0ZW5kcyBXYWxrZXI8Q09OQ1JFVEU+Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBCeXRlU291cmNlIGxpbWl0OworICAgIHByaXZhdGUgSXRlcmF0aW9uUG9zaXRpb24gc3RhY2s7CisgICAgcHJpdmF0ZSBsb25nIG5leHQ7CisKKyAgICBzdGF0aWMgY2xhc3MgSXRlcmF0aW9uUG9zaXRpb24KKyAgICB7CisgICAgICAgIGZpbmFsIGxvbmcgbm9kZTsKKyAgICAgICAgZmluYWwgaW50IGxpbWl0OworICAgICAgICBmaW5hbCBJdGVyYXRpb25Qb3NpdGlvbiBwcmV2OworICAgICAgICBpbnQgY2hpbGRJbmRleDsKKworICAgICAgICBJdGVyYXRpb25Qb3NpdGlvbihsb25nIG5vZGUsIGludCBjaGlsZEluZGV4LCBpbnQgbGltaXQsIEl0ZXJhdGlvblBvc2l0aW9uIHByZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgICAgICB0aGlzLm5vZGUgPSBub2RlOworICAgICAgICAgICAgdGhpcy5jaGlsZEluZGV4ID0gY2hpbGRJbmRleDsKKyAgICAgICAgICAgIHRoaXMubGltaXQgPSBsaW1pdDsKKyAgICAgICAgICAgIHRoaXMucHJldiA9IHByZXY7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbTm9kZSAlZCwgY2hpbGQgJWQsIGxpbWl0ICVkXSIsIG5vZGUsIGNoaWxkSW5kZXgsIGxpbWl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBWYWx1ZUl0ZXJhdG9yKFJlYnVmZmVyZXIgc291cmNlLCBsb25nIHJvb3QpCisgICAgeworICAgICAgICBzdXBlcihzb3VyY2UsIHJvb3QpOworICAgICAgICBsaW1pdCA9IG51bGw7CisgICAgICAgIGluaXRpYWxpemVOb0xlZnRCb3VuZChyb290LCAyNTYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cmFpbmVkIGl0ZXJhdG9yLiBUaGUgZW5kIHBvc2l0aW9uIGlzIGFsd2F5cyB0cmVhdGVkIGFzIGluY2x1c2l2ZSwgYW5kIHdlIGhhdmUgdHdvIHBvc3NpYmxlIHRyZWF0bWVudHMgZm9yCisgICAgICogdGhlIHN0YXJ0OgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT4gV2hlbiB7QGNvZGUgYWRtaXRQcmVmaXg9ZmFsc2V9LCBleGFjdCBtYXRjaGVzIGFuZCBhbnkgcHJlZml4ZXMgb2YgdGhlIHN0YXJ0IGFyZSBleGNsdWRlZC4KKyAgICAgKiAgIDxsaT4gV2hlbiB7QGNvZGUgYWRtaXRQcmVmaXg9dHJ1ZX0sIHRoZSBsb25nZXN0IHByZWZpeCBvZiB0aGUgc3RhcnQgcHJlc2VudCBpbiB0aGUgdHJpZSBpcyBhbHNvIGluY2x1ZGVkLAorICAgICAqICAgICAgICBwcm92aWRlZCB0aGF0IHRoZXJlIGlzIG5vIGVudHJ5IGluIHRoZSB0cmllIGJldHdlZW4gdGhhdCBwcmVmaXggYW5kIHRoZSBzdGFydC4gQW4gZXhhY3QgbWF0Y2ggYWxzbworICAgICAqICAgICAgICBzYXRpc2ZpZXMgdGhpcyBhbmQgaXMgaW5jbHVkZWQuCisgICAgICogPC91bD4KKyAgICAgKiBUaGlzIGJlaGF2aW91ciBpcyBzaGFyZWQgd2l0aCB0aGUgcmV2ZXJzZSBjb3VudGVycGFydCB7QGxpbmsgUmV2ZXJzZVZhbHVlSXRlcmF0b3J9LgorICAgICAqLworICAgIHByb3RlY3RlZCBWYWx1ZUl0ZXJhdG9yKFJlYnVmZmVyZXIgc291cmNlLCBsb25nIHJvb3QsIEJ5dGVDb21wYXJhYmxlIHN0YXJ0LCBCeXRlQ29tcGFyYWJsZSBlbmQsIGJvb2xlYW4gYWRtaXRQcmVmaXgpCisgICAgeworICAgICAgICBzdXBlcihzb3VyY2UsIHJvb3QpOworICAgICAgICBsaW1pdCA9IGVuZCAhPSBudWxsID8gZW5kLmFzQ29tcGFyYWJsZUJ5dGVzKEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKSA6IG51bGw7CisKKyAgICAgICAgaWYgKHN0YXJ0ICE9IG51bGwpCisgICAgICAgICAgICBpbml0aWFsaXplV2l0aExlZnRCb3VuZChyb290LCBzdGFydC5hc0NvbXBhcmFibGVCeXRlcyhCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTiksIGFkbWl0UHJlZml4LCBsaW1pdCAhPSBudWxsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5pdGlhbGl6ZU5vTGVmdEJvdW5kKHJvb3QsIGxpbWl0ICE9IG51bGwgPyBsaW1pdC5uZXh0KCkgOiAyNTYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplV2l0aExlZnRCb3VuZChsb25nIHJvb3QsIEJ5dGVTb3VyY2Ugc3RhcnRTdHJlYW0sIGJvb2xlYW4gYWRtaXRQcmVmaXgsIGJvb2xlYW4gYXRMaW1pdCkKKyAgICB7CisgICAgICAgIEl0ZXJhdGlvblBvc2l0aW9uIHByZXYgPSBudWxsOworICAgICAgICBpbnQgY2hpbGRJbmRleDsKKyAgICAgICAgaW50IGxpbWl0Qnl0ZTsKKyAgICAgICAgbG9uZyBwYXlsb2FkZWROb2RlID0gLTE7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEZvbGxvdyBzdGFydCBwb3NpdGlvbiB3aGlsZSB3ZSBzdGlsbCBoYXZlIGEgcHJlZml4LCBzdGFja2luZyBwYXRoIGFuZCBzYXZpbmcgcHJlZml4ZXMuCisgICAgICAgICAgICBnbyhyb290KTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzID0gc3RhcnRTdHJlYW0ubmV4dCgpOworICAgICAgICAgICAgICAgIGNoaWxkSW5kZXggPSBzZWFyY2gocyk7CisKKyAgICAgICAgICAgICAgICAvLyBGb3IgYSBzZXBhcmF0b3IgdHJpZSB0aGUgbGF0ZXN0IHBheWxvYWQgbWV0IGFsb25nIHRoZSBwcmVmaXggaXMgYSBwb3RlbnRpYWwgbWF0Y2ggZm9yIHN0YXJ0CisgICAgICAgICAgICAgICAgaWYgKGFkbWl0UHJlZml4KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkSW5kZXggPT0gMCB8fCBjaGlsZEluZGV4ID09IC0xKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZEZsYWdzKCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkZWROb2RlID0gcG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkZWROb2RlID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsaW1pdEJ5dGUgPSAyNTY7CisgICAgICAgICAgICAgICAgaWYgKGF0TGltaXQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsaW1pdEJ5dGUgPSBsaW1pdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzIDwgbGltaXRCeXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgYXRMaW1pdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA8IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgcHJldiA9IG5ldyBJdGVyYXRpb25Qb3NpdGlvbihwb3NpdGlvbiwgY2hpbGRJbmRleCwgbGltaXRCeXRlLCBwcmV2KTsKKyAgICAgICAgICAgICAgICBnbyh0cmFuc2l0aW9uKGNoaWxkSW5kZXgpKTsgLy8gY2hpbGQgaW5kZXggaXMgcG9zaXRpdmUsIHRyYW5zaXRpb24gbXVzdCBleGlzdAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGlsZEluZGV4ID0gLTEgLSBjaGlsZEluZGV4IC0gMTsKKyAgICAgICAgICAgIHN0YWNrID0gbmV3IEl0ZXJhdGlvblBvc2l0aW9uKHBvc2l0aW9uLCBjaGlsZEluZGV4LCBsaW1pdEJ5dGUsIHByZXYpOworCisgICAgICAgICAgICAvLyBBZHZhbmNpbmcgbm93IGdpdmVzIHVzIGZpcnN0IG1hdGNoIGlmIHdlIGRpZG4ndCBmaW5kIG9uZSBhbHJlYWR5LgorICAgICAgICAgICAgaWYgKHBheWxvYWRlZE5vZGUgIT0gLTEpCisgICAgICAgICAgICAgICAgbmV4dCA9IHBheWxvYWRlZE5vZGU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmV4dCA9IGFkdmFuY2VOb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICAgICAgdGhyb3cgdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplTm9MZWZ0Qm91bmQobG9uZyByb290LCBpbnQgbGltaXRCeXRlKQorICAgIHsKKyAgICAgICAgc3RhY2sgPSBuZXcgSXRlcmF0aW9uUG9zaXRpb24ocm9vdCwgLTEsIGxpbWl0Qnl0ZSwgbnVsbCk7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdvKHJvb3QpOworICAgICAgICAgICAgaWYgKHBheWxvYWRGbGFncygpICE9IDApCisgICAgICAgICAgICAgICAgbmV4dCA9IHJvb3Q7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmV4dCA9IGFkdmFuY2VOb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICAgICAgdGhyb3cgdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBuZXh0IG5vZGUgd2l0aCBwYXlsb2FkIGNvbnRhaW5lZCBpbiB0aGUgaXRlcmF0ZWQgc3Bhbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBuZXh0UGF5bG9hZGVkTm9kZSgpCisgICAgeworICAgICAgICBsb25nIHRvUmV0dXJuID0gbmV4dDsKKyAgICAgICAgaWYgKG5leHQgIT0gLTEpCisgICAgICAgICAgICBuZXh0ID0gYWR2YW5jZU5vZGUoKTsKKyAgICAgICAgcmV0dXJuIHRvUmV0dXJuOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBhZHZhbmNlTm9kZSgpCisgICAgeworICAgICAgICBsb25nIGNoaWxkOworICAgICAgICBpbnQgdHJhbnNpdGlvbkJ5dGU7CisKKyAgICAgICAgZ28oc3RhY2subm9kZSk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY2hpbGRJbmRleCA9IHN0YWNrLmNoaWxkSW5kZXggKyAxOworICAgICAgICAgICAgdHJhbnNpdGlvbkJ5dGUgPSB0cmFuc2l0aW9uQnl0ZShjaGlsZEluZGV4KTsKKworICAgICAgICAgICAgaWYgKHRyYW5zaXRpb25CeXRlID4gc3RhY2subGltaXQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gYXNjZW5kCisgICAgICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5wcmV2OworICAgICAgICAgICAgICAgIGlmIChzdGFjayA9PSBudWxsKSAgICAgICAgLy8gZXhoYXVzdGVkIHdob2xlIHRyaWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGdvKHN0YWNrLm5vZGUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGlsZCA9IHRyYW5zaXRpb24oY2hpbGRJbmRleCk7CisKKyAgICAgICAgICAgIGlmIChjaGlsZCAhPSBOT05FKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydCBjaGlsZCA+PSAwIDogU3RyaW5nLmZvcm1hdCgiRXhwZWN0ZWQgdmFsdWUgPj0gMCBidXQgZ290ICVkIC0gJXMiLCBjaGlsZCwgdGhpcyk7CisKKyAgICAgICAgICAgICAgICAvLyBkZXNjZW5kCisgICAgICAgICAgICAgICAgZ28oY2hpbGQpOworCisgICAgICAgICAgICAgICAgaW50IGwgPSAyNTY7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zaXRpb25CeXRlID09IHN0YWNrLmxpbWl0KQorICAgICAgICAgICAgICAgICAgICBsID0gbGltaXQubmV4dCgpOworCisgICAgICAgICAgICAgICAgc3RhY2suY2hpbGRJbmRleCA9IGNoaWxkSW5kZXg7CisgICAgICAgICAgICAgICAgc3RhY2sgPSBuZXcgSXRlcmF0aW9uUG9zaXRpb24oY2hpbGQsIC0xLCBsLCBzdGFjayk7CisKKyAgICAgICAgICAgICAgICBpZiAocGF5bG9hZEZsYWdzKCkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YWNrLmNoaWxkSW5kZXggPSBjaGlsZEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9XYWxrZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1dhbGtlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzBjZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9XYWxrZXIuamF2YQpAQCAtMCwwICsxLDM5MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXM7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLmNvbmN1cnJlbnQuTm90VGhyZWFkU2FmZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUGFnZUF3YXJlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmVidWZmZXJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJlYnVmZmVyZXIuQnVmZmVySG9sZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CisKKy8qKgorICogVGhyZWFkLXVuc2FmZSB0cmllIHdhbGtpbmcgaGVscGVyLiBUaGlzIGlzIGFuYWxvZ291cyB0byB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXJ9IGZvcgorICogdHJpZXMgLS0gdGFrZXMgYW4gb24tZGlzayB0cmllIGFjY2Vzc2libGUgdmlhIGEgc3VwcGxpZWQgUmVidWZmZXJlciBhbmQgbGV0cyB1c2VyIHNlZWsgdG8gbm9kZXMgYW5kIHdvcmsgd2l0aCB0aGVtLgorICogPHA+CisgKiBBc3N1bWVzIGRhdGEgd2FzIHdyaXR0ZW4gdXNpbmcgcGFnZS1hd2FyZSBidWlsZGVyIGFuZCB0aHVzIG5vIG5vZGUgY3Jvc3NlcyBhIHBhZ2UgYW5kIHRodXMgYSBidWZmZXIgYm91bmRhcnkuCisgKiA8cD4KKyAqIFNlZSB7QGNvZGUgb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL0J0aUZvcm1hdC5tZH0gZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIG1lY2hhbmlzbXMgb2Ygd3JpdGluZworICogYW5kIHJlYWRpbmcgYW4gb24tZGlzayB0cmllLgorICovCitATm90VGhyZWFkU2FmZQorcHVibGljIGNsYXNzIFdhbGtlcjxDT05DUkVURSBleHRlbmRzIFdhbGtlcjxDT05DUkVURT4+IGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQoreworICAgIC8qKiBWYWx1ZSB1c2VkIHRvIGluZGljYXRlIGEgYnJhbmNoIChlLmcuIGxlc3Nlci9ncmVhdGVyQnJhbmNoKSBkb2VzIG5vdCBleGlzdC4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBOT05FID0gVHJpZU5vZGUuTk9ORTsKKworICAgIHByaXZhdGUgZmluYWwgUmVidWZmZXJlciBzb3VyY2U7CisgICAgcHJvdGVjdGVkIGZpbmFsIGxvbmcgcm9vdDsKKworICAgIC8vIFN0YXRlIHJlbGF0aW5nIHRvIGN1cnJlbnQgbm9kZS4KKyAgICBwcml2YXRlIEJ1ZmZlckhvbGRlciBiaDsgICAgLy8gZnJvbSBSZWJ1ZmZlcmVyCisgICAgcHJpdmF0ZSBpbnQgb2Zmc2V0OyAgICAgICAgIC8vIG9mZnNldCBvZiBjdXJyZW50IG5vZGUgd2l0aGluIGJ1ZgorICAgIHByb3RlY3RlZCBUcmllTm9kZSBub2RlVHlwZTsgIC8vIHR5cGUgb2YgY3VycmVudCBub2RlCisgICAgcHJvdGVjdGVkIEJ5dGVCdWZmZXIgYnVmOyAgIC8vIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhCisgICAgcHJvdGVjdGVkIGxvbmcgcG9zaXRpb247ICAgIC8vIGZpbGUgcG9zaXRpb24gb2YgY3VycmVudCBub2RlCisKKyAgICAvLyBTdGF0ZSByZWxhdGluZyB0byBzZWFyY2hlcy4KKyAgICBwcm90ZWN0ZWQgbG9uZyBncmVhdGVyQnJhbmNoOworICAgIHByb3RlY3RlZCBsb25nIGxlc3NlckJyYW5jaDsKKworICAgIC8vIFZlcnNpb24gb2YgdGhlIGJ5dGUgY29tcGFyYWJsZSBjb252ZXJzaW9uIHRvIHVzZQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiBCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTiA9IEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uT1NTNTA7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgd2Fsa2VyLiBSZWJ1ZmZlcmVyIG11c3QgYmUgYWxpZ25lZCBhbmQgd2l0aCBhIGJ1ZmZlciBzaXplIHRoYXQgaXMgYXQgbGVhc3QgNGsuCisgICAgICovCisgICAgcHVibGljIFdhbGtlcihSZWJ1ZmZlcmVyIHNvdXJjZSwgbG9uZyByb290KQorICAgIHsKKyAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgICAgIHRoaXMucm9vdCA9IHJvb3Q7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBiaCA9IHNvdXJjZS5yZWJ1ZmZlcihyb290KTsKKyAgICAgICAgICAgIGJ1ZiA9IGJoLmJ1ZmZlcigpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYmggIT0gbnVsbCkgYmgucmVsZWFzZSgpOworICAgICAgICAgICAgc291cmNlLmNsb3NlUmVhZGVyKCk7CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIGJoLnJlbGVhc2UoKTsKKyAgICAgICAgc291cmNlLmNsb3NlUmVhZGVyKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZ28obG9uZyBwb3NpdGlvbikKKyAgICB7CisgICAgICAgIGxvbmcgY3VyT2Zmc2V0ID0gcG9zaXRpb24gLSBiaC5vZmZzZXQoKTsKKyAgICAgICAgaWYgKGN1ck9mZnNldCA8IDAgfHwgY3VyT2Zmc2V0ID49IGJ1Zi5saW1pdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBiaC5yZWxlYXNlKCk7CisgICAgICAgICAgICBiaCA9IFJlYnVmZmVyZXIuRU1QVFk7IC8vIHByZXZlbnRzIGRvdWJsZSByZWxlYXNlIGlmIHRoZSBjYWxsIGJlbG93IGZhaWxzCisgICAgICAgICAgICBiaCA9IHNvdXJjZS5yZWJ1ZmZlcihwb3NpdGlvbik7CisgICAgICAgICAgICBidWYgPSBiaC5idWZmZXIoKTsKKyAgICAgICAgICAgIGN1ck9mZnNldCA9IHBvc2l0aW9uIC0gYmgub2Zmc2V0KCk7CisgICAgICAgICAgICBhc3NlcnQgY3VyT2Zmc2V0ID49IDAgJiYgY3VyT2Zmc2V0IDwgYnVmLmxpbWl0KCkgOiBTdHJpbmcuZm9ybWF0KCJJbnZhbGlkIG9mZnNldDogJWQsIGJ1ZjogJXMsIGJoOiAlcyIsIGN1ck9mZnNldCwgYnVmLCBiaCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5vZmZzZXQgPSAoaW50KSBjdXJPZmZzZXQ7CisgICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgbm9kZVR5cGUgPSBUcmllTm9kZS5hdChidWYsIChpbnQpIGN1ck9mZnNldCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIGludCBwYXlsb2FkRmxhZ3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGVUeXBlLnBheWxvYWRGbGFncyhidWYsIG9mZnNldCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIGludCBwYXlsb2FkUG9zaXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGVUeXBlLnBheWxvYWRQb3NpdGlvbihidWYsIG9mZnNldCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIGludCBzZWFyY2goaW50IHRyYW5zaXRpb25CeXRlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGVUeXBlLnNlYXJjaChidWYsIG9mZnNldCwgdHJhbnNpdGlvbkJ5dGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBsb25nIHRyYW5zaXRpb24oaW50IGNoaWxkSW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZVR5cGUudHJhbnNpdGlvbihidWYsIG9mZnNldCwgcG9zaXRpb24sIGNoaWxkSW5kZXgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBsb25nIGxhc3RUcmFuc2l0aW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlVHlwZS5sYXN0VHJhbnNpdGlvbihidWYsIG9mZnNldCwgcG9zaXRpb24pOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBsb25nIGdyZWF0ZXJUcmFuc2l0aW9uKGludCBzZWFyY2hJbmRleCwgbG9uZyBkZWZhdWx0VmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZVR5cGUuZ3JlYXRlclRyYW5zaXRpb24oYnVmLCBvZmZzZXQsIHBvc2l0aW9uLCBzZWFyY2hJbmRleCwgZGVmYXVsdFZhbHVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgbG9uZyBsZXNzZXJUcmFuc2l0aW9uKGludCBzZWFyY2hJbmRleCwgbG9uZyBkZWZhdWx0VmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZVR5cGUubGVzc2VyVHJhbnNpdGlvbihidWYsIG9mZnNldCwgcG9zaXRpb24sIHNlYXJjaEluZGV4LCBkZWZhdWx0VmFsdWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgdHJhbnNpdGlvbkJ5dGUoaW50IGNoaWxkSW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZVR5cGUudHJhbnNpdGlvbkJ5dGUoYnVmLCBvZmZzZXQsIGNoaWxkSW5kZXgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgdHJhbnNpdGlvblJhbmdlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlVHlwZS50cmFuc2l0aW9uUmFuZ2UoYnVmLCBvZmZzZXQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc0NoaWxkcmVuKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cmFuc2l0aW9uUmFuZ2UoKSA+IDA7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZ29NYXgobG9uZyBwb3MpCisgICAgeworICAgICAgICBnbyhwb3MpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBsYXN0Q2hpbGQgPSBsYXN0VHJhbnNpdGlvbigpOworICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCA9PSBOT05FKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGdvKGxhc3RDaGlsZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBnb01pbihsb25nIHBvcykKKyAgICB7CisgICAgICAgIGdvKHBvcyk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcGF5bG9hZEJpdHMgPSBwYXlsb2FkRmxhZ3MoKTsKKyAgICAgICAgICAgIGlmIChwYXlsb2FkQml0cyA+IDApCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBsb25nIGZpcnN0Q2hpbGQgPSB0cmFuc2l0aW9uKDApOworICAgICAgICAgICAgaWYgKGZpcnN0Q2hpbGQgPT0gTk9ORSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBnbyhmaXJzdENoaWxkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgRXh0cmFjdG9yPFJFU1VMVCwgVkFMVUU+CisgICAgeworICAgICAgICBSRVNVTFQgZXh0cmFjdChWQUxVRSB3YWxrZXIsIGludCBwYXlsb2FkUG9zaXRpb24sIGludCBwYXlsb2FkRmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvbGxvd3MgdGhlIGdpdmVuIGtleSB3aGlsZSB0aGVyZSBhcmUgdHJhbnNpdGlvbnMgaW4gdGhlIHRyaWUgZm9yIGl0LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZmlyc3QgdW5tYXRjaGVkIGJ5dGUgb2YgdGhlIGtleSwgbWF5IGJlIHtAbGluayBCeXRlU291cmNlI0VORF9PRl9TVFJFQU19CisgICAgICovCisgICAgcHVibGljIGludCBmb2xsb3coQnl0ZUNvbXBhcmFibGUga2V5KQorICAgIHsKKyAgICAgICAgQnl0ZVNvdXJjZSBzdHJlYW0gPSBrZXkuYXNDb21wYXJhYmxlQnl0ZXMoQllURV9DT01QQVJBQkxFX1ZFUlNJT04pOworICAgICAgICBnbyhyb290KTsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBiID0gc3RyZWFtLm5leHQoKTsKKyAgICAgICAgICAgIGludCBjaGlsZEluZGV4ID0gc2VhcmNoKGIpOworCisgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGI7CisKKyAgICAgICAgICAgIGdvKHRyYW5zaXRpb24oY2hpbGRJbmRleCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9sbG93cyB0aGUgdHJpZSBmb3IgYSBnaXZlbiBrZXksIHJlbWVtYmVyaW5nIHRoZSBjbG9zZXN0IGdyZWF0ZXIgYnJhbmNoLgorICAgICAqIE9uIHJldHVybiB0aGUgd2Fsa2VyIGlzIHBvc2l0aW9uZWQgYXQgdGhlIGxvbmdlc3QgcHJlZml4IHRoYXQgbWF0Y2hlcyB0aGUgaW5wdXQgKHdpdGggb3Igd2l0aG91dCBwYXlsb2FkKSwgYW5kCisgICAgICogbWluKGdyZWF0ZXJCcmFuY2gpIGlzIHRoZSBpbW1lZGlhdGUgZ3JlYXRlciBuZWlnaGJvdXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCB1bm1hdGNoZWQgYnl0ZSBvZiB0aGUga2V5LCBtYXkgYmUge0BsaW5rIEJ5dGVTb3VyY2UjRU5EX09GX1NUUkVBTX0KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGZvbGxvd1dpdGhHcmVhdGVyKEJ5dGVDb21wYXJhYmxlIGtleSkKKyAgICB7CisgICAgICAgIGdyZWF0ZXJCcmFuY2ggPSBOT05FOworCisgICAgICAgIEJ5dGVTb3VyY2Ugc3RyZWFtID0ga2V5LmFzQ29tcGFyYWJsZUJ5dGVzKEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKTsKKyAgICAgICAgZ28ocm9vdCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYiA9IHN0cmVhbS5uZXh0KCk7CisgICAgICAgICAgICBpbnQgc2VhcmNoSW5kZXggPSBzZWFyY2goYik7CisKKyAgICAgICAgICAgIGdyZWF0ZXJCcmFuY2ggPSBncmVhdGVyVHJhbnNpdGlvbihzZWFyY2hJbmRleCwgZ3JlYXRlckJyYW5jaCk7CisgICAgICAgICAgICBpZiAoc2VhcmNoSW5kZXggPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBiOworCisgICAgICAgICAgICBnbyh0cmFuc2l0aW9uKHNlYXJjaEluZGV4KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb2xsb3dzIHRoZSB0cmllIGZvciBhIGdpdmVuIGtleSwgcmVtZW1iZXJpbmcgdGhlIGNsb3Nlc3QgbGVzc2VyIGJyYW5jaC4KKyAgICAgKiBPbiByZXR1cm4gdGhlIHdhbGtlciBpcyBwb3NpdGlvbmVkIGF0IHRoZSBsb25nZXN0IHByZWZpeCB0aGF0IG1hdGNoZXMgdGhlIGlucHV0ICh3aXRoIG9yIHdpdGhvdXQgcGF5bG9hZCksIGFuZAorICAgICAqIG1heChsZXNzZXJCcmFuY2gpIGlzIHRoZSBpbW1lZGlhdGUgbGVzc2VyIG5laWdoYm91ci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHVubWF0Y2hlZCBieXRlIG9mIHRoZSBrZXksIG1heSBiZSB7QGxpbmsgQnl0ZVNvdXJjZSNFTkRfT0ZfU1RSRUFNfQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZm9sbG93V2l0aExlc3NlcihCeXRlQ29tcGFyYWJsZSBrZXkpCisgICAgeworICAgICAgICBsZXNzZXJCcmFuY2ggPSBOT05FOworCisgICAgICAgIEJ5dGVTb3VyY2Ugc3RyZWFtID0ga2V5LmFzQ29tcGFyYWJsZUJ5dGVzKEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKTsKKyAgICAgICAgZ28ocm9vdCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYiA9IHN0cmVhbS5uZXh0KCk7CisgICAgICAgICAgICBpbnQgc2VhcmNoSW5kZXggPSBzZWFyY2goYik7CisKKyAgICAgICAgICAgIGxlc3NlckJyYW5jaCA9IGxlc3NlclRyYW5zaXRpb24oc2VhcmNoSW5kZXgsIGxlc3NlckJyYW5jaCk7CisKKyAgICAgICAgICAgIGlmIChzZWFyY2hJbmRleCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGI7CisKKyAgICAgICAgICAgIGdvKHRyYW5zaXRpb24oc2VhcmNoSW5kZXgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyoqCisgICAgICogVGFrZXMgYSBwcmVmaXggb2YgdGhlIGdpdmVuIGtleS4gVGhlIHByZWZpeCBpcyBpbiB0aGUgc2Vuc2Ugb2YgYSBzZXBhcmF0b3Iga2V5IG1hdGNoLCBpLmUuIGl0IGlzIG9ubHkKKyAgICAgKiB1bmRlcnN0b29kIGFzIHZhbGlkIGlmIHRoZXJlIGFyZSBubyBncmVhdGVyIGVudHJpZXMgaW4gdGhlIHRyaWUgKGUuZy4gZGF0YSBhdCAnYScgaXMgaWdub3JlZCBpZiAnYWInIG9yICdhYmJhJworICAgICAqIGlzIGluIHRoZSB0cmllIHdoZW4gbG9va2luZyBmb3IgJ2FiYycgb3IgJ2FjJywgYnV0IGFjY2VwdGVkIHdoZW4gbG9va2luZyBmb3IgJ2FhJykuCisgICAgICogSW4gb3JkZXIgdG8gbm90IGhhdmUgdG8gZ28gYmFjayB0byBkYXRhIHRoYXQgbWF5IGhhdmUgZXhpdGVkIGNhY2hlLCBwYXlsb2FkcyBhcmUgZXh0cmFjdGVkIHdoZW4gdGhlIG5vZGUgaXMKKyAgICAgKiB2aXNpdGVkIChpbnN0ZWFkIG9mIHNhdmluZyB0aGUgbm9kZSdzIHBvc2l0aW9uKSwgd2hpY2ggcmVxdWlyZXMgYW4gZXh0cmFjdG9yIHRvIGJlIHBhc3NlZCBhcyBwYXJhbWV0ZXIuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIDxSRVNVTFQ+IFJFU1VMVCBwcmVmaXgoQnl0ZUNvbXBhcmFibGUga2V5LCBFeHRyYWN0b3I8UkVTVUxULCBDT05DUkVURT4gZXh0cmFjdG9yKQorICAgIHsKKyAgICAgICAgUkVTVUxUIHBheWxvYWQgPSBudWxsOworCisgICAgICAgIEJ5dGVTb3VyY2Ugc3RyZWFtID0ga2V5LmFzQ29tcGFyYWJsZUJ5dGVzKEJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKTsKKyAgICAgICAgZ28ocm9vdCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYiA9IHN0cmVhbS5uZXh0KCk7CisgICAgICAgICAgICBpbnQgY2hpbGRJbmRleCA9IHNlYXJjaChiKTsKKworICAgICAgICAgICAgaWYgKGNoaWxkSW5kZXggPiAwKQorICAgICAgICAgICAgICAgIHBheWxvYWQgPSBudWxsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBwYXlsb2FkQml0cyA9IHBheWxvYWRGbGFncygpOworICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkQml0cyA+IDApCisgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBleHRyYWN0b3IuZXh0cmFjdCgoQ09OQ1JFVEUpIHRoaXMsIHBheWxvYWRQb3NpdGlvbigpLCBwYXlsb2FkQml0cyk7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkSW5kZXggPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZ28odHJhbnNpdGlvbihjaGlsZEluZGV4KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGb2xsb3dzIHRoZSB0cmllIGZvciBhIGdpdmVuIGtleSwgdGFraW5nIGEgcHJlZml4IChpbiB0aGUgc2Vuc2UgYWJvdmUpIGFuZCBzZWFyY2hpbmcgZm9yIG5laWdoYm9yaW5nIHZhbHVlcy4KKyAgICAgKiBPbiByZXR1cm4gbWluKGdyZWF0ZXJCcmFuY2gpIGFuZCBtYXgobGVzc2VyQnJhbmNoKSBhcmUgdGhlIGltbWVkaWF0ZSBub24tcHJlZml4IG5laWdoYm91cnMgZm9yIHRoZSBzb3VnaHQgdmFsdWUuCisgICAgICogPHA+CisgICAgICogTm90ZTogaW4gYSBzZXBhcmF0b3IgdHJpZSB0aGUgY2xvc2VzdCBzbWFsbGVyIG5laWdoYm91ciBjYW4gYmUgYW5vdGhlciBwcmVmaXggb2YgdGhlIGdpdmVuIGtleS4gVGhpcyBtZXRob2QKKyAgICAgKiBkb2VzIG5vdCB0YWtlIHRoYXQgaW50byBhY2NvdW50LiBFLmcuIGlmIHRyaWUgY29udGFpbnMgImFiYmEiLCAiYXMiIGFuZCAiYXNrIiwgbG9va2luZyBmb3IgImFza2luZyIgd2lsbCBmaW5kCisgICAgICogImFzayIgYXMgdGhlIG1hdGNoLCBidXQgbWF4KGxlc3NlckJyYW5jaCkgd2lsbCBwb2ludCB0byAiYWJiYSIgaW5zdGVhZCBvZiB0aGUgY29ycmVjdCAiYXMiLiBUaGlzIHByb2JsZW0gY2FuCisgICAgICogb25seSBvY2N1ciBpZiB0aGVyZSBpcyBhIHZhbGlkIHByZWZpeCBtYXRjaC4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgPFJFU1VMVD4gUkVTVUxUIHByZWZpeEFuZE5laWdoYm91cnMoQnl0ZUNvbXBhcmFibGUga2V5LCBFeHRyYWN0b3I8UkVTVUxULCBDT05DUkVURT4gZXh0cmFjdG9yKQorICAgIHsKKyAgICAgICAgUkVTVUxUIHBheWxvYWQgPSBudWxsOworICAgICAgICBncmVhdGVyQnJhbmNoID0gTk9ORTsKKyAgICAgICAgbGVzc2VyQnJhbmNoID0gTk9ORTsKKworICAgICAgICBCeXRlU291cmNlIHN0cmVhbSA9IGtleS5hc0NvbXBhcmFibGVCeXRlcyhCWVRFX0NPTVBBUkFCTEVfVkVSU0lPTik7CisgICAgICAgIGdvKHJvb3QpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGIgPSBzdHJlYW0ubmV4dCgpOworICAgICAgICAgICAgaW50IHNlYXJjaEluZGV4ID0gc2VhcmNoKGIpOworCisgICAgICAgICAgICBncmVhdGVyQnJhbmNoID0gZ3JlYXRlclRyYW5zaXRpb24oc2VhcmNoSW5kZXgsIGdyZWF0ZXJCcmFuY2gpOworCisgICAgICAgICAgICBpZiAoc2VhcmNoSW5kZXggPT0gLTEgfHwgc2VhcmNoSW5kZXggPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcGF5bG9hZEJpdHMgPSBwYXlsb2FkRmxhZ3MoKTsKKyAgICAgICAgICAgICAgICBpZiAocGF5bG9hZEJpdHMgPiAwKQorICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gZXh0cmFjdG9yLmV4dHJhY3QoKENPTkNSRVRFKSB0aGlzLCBwYXlsb2FkUG9zaXRpb24oKSwgcGF5bG9hZEJpdHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxlc3NlckJyYW5jaCA9IGxlc3NlclRyYW5zaXRpb24oc2VhcmNoSW5kZXgsIGxlc3NlckJyYW5jaCk7CisgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzZWFyY2hJbmRleCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQ7CisKKyAgICAgICAgICAgIGdvKHRyYW5zaXRpb24oc2VhcmNoSW5kZXgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRvIGJlIHVzZWQgb25seSBpbiBhbmFseXNpcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IG5vZGVUeXBlT3JkaW5hbCgpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZVR5cGUub3JkaW5hbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUbyBiZSB1c2VkIG9ubHkgaW4gYW5hbHlzaXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBub2RlU2l6ZSgpCisgICAgeworICAgICAgICByZXR1cm4gcGF5bG9hZFBvc2l0aW9uKCkgLSBvZmZzZXQ7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBQYXlsb2FkVG9TdHJpbmcKKyAgICB7CisgICAgICAgIFN0cmluZyBwYXlsb2FkQXNTdHJpbmcoQnl0ZUJ1ZmZlciBidWYsIGludCBwYXlsb2FkUG9zLCBpbnQgcGF5bG9hZEZsYWdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBkdW1wVHJpZShQcmludFN0cmVhbSBvdXQsIFBheWxvYWRUb1N0cmluZyBwYXlsb2FkUmVhZGVyKQorICAgIHsKKyAgICAgICAgb3V0LnByaW50KCJST09UIik7CisgICAgICAgIGR1bXBUcmllKG91dCwgcGF5bG9hZFJlYWRlciwgcm9vdCwgIiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkdW1wVHJpZShQcmludFN0cmVhbSBvdXQsIFBheWxvYWRUb1N0cmluZyBwYXlsb2FkUmVhZGVyLCBsb25nIG5vZGUsIFN0cmluZyBpbmRlbnQpCisgICAgeworICAgICAgICBnbyhub2RlKTsKKyAgICAgICAgaW50IGJpdHMgPSBwYXlsb2FkRmxhZ3MoKTsKKyAgICAgICAgb3V0LmZvcm1hdCgiICVzQCV4ICVzJW4iLCBub2RlVHlwZS50b1N0cmluZygpLCBub2RlLCBiaXRzID09IDAgPyAiIiA6IHBheWxvYWRSZWFkZXIucGF5bG9hZEFzU3RyaW5nKGJ1ZiwgcGF5bG9hZFBvc2l0aW9uKCksIGJpdHMpKTsKKyAgICAgICAgaW50IHJhbmdlID0gdHJhbnNpdGlvblJhbmdlKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmFuZ2U7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBjaGlsZCA9IHRyYW5zaXRpb24oaSk7CisgICAgICAgICAgICBpZiAoY2hpbGQgPT0gTk9ORSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG91dC5mb3JtYXQoIiVzJTAyeCAlcz4iLCBpbmRlbnQsIHRyYW5zaXRpb25CeXRlKGkpLCBQYWdlQXdhcmUucGFnZVN0YXJ0KHBvc2l0aW9uKSA9PSBQYWdlQXdhcmUucGFnZVN0YXJ0KGNoaWxkKSA/ICItLSIgOiAiPT0iKTsKKyAgICAgICAgICAgIGR1bXBUcmllKG91dCwgcGF5bG9hZFJlYWRlciwgY2hpbGQsIGluZGVudCArICIgICIpOworICAgICAgICAgICAgZ28obm9kZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbVHJpZSBXYWxrZXIgLSBOb2RlVHlwZTogJXMsIHNvdXJjZTogJXMsIGJ1ZmZlcjogJXMsIGJ1ZmZlciBmaWxlIG9mZnNldDogJWQsIE5vZGUgYnVmZmVyIG9mZnNldDogJWQsIE5vZGUgZmlsZSBwb3NpdGlvbjogJWRdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVR5cGUsIHNvdXJjZSwgYnVmLCBiaC5vZmZzZXQoKSwgb2Zmc2V0LCBwb3NpdGlvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9CdWZmZXJlZERhdGFPdXRwdXRTdHJlYW1QbHVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0J1ZmZlcmVkRGF0YU91dHB1dFN0cmVhbVBsdXMuamF2YQppbmRleCA0ZTliYmI1Li5hNzEyYmE2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0J1ZmZlcmVkRGF0YU91dHB1dFN0cmVhbVBsdXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0J1ZmZlcmVkRGF0YU91dHB1dFN0cmVhbVBsdXMuamF2YQpAQCAtMjYsOSArMjYsMTAgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CiAKIGltcG9ydCBuZXQubmljb3VsYWouY29tcGlsZWNvbW1hbmQuYW5ub3RhdGlvbnMuRG9udElubGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZhc3RCeXRlT3BlcmF0aW9uczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk5JT19EQVRBX09VVFBVVF9TVFJFQU1fUExVU19CVUZGRVJfU0laRTsKKwogLyoqCiAgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRGF0YU91dHB1dFN0cmVhbVBsdXMgaW50ZXJmYWNlIHVzaW5nIGEgQnl0ZUJ1ZmZlciB0byBzdGFnZSB3cml0ZXMKICAqIGJlZm9yZSBmbHVzaGluZyB0aGVtIHRvIGFuIHVuZGVybHlpbmcgY2hhbm5lbC4KQEAgLTM3LDcgKzM4LDcgQEAKICAqLwogcHVibGljIGNsYXNzIEJ1ZmZlcmVkRGF0YU91dHB1dFN0cmVhbVBsdXMgZXh0ZW5kcyBEYXRhT3V0cHV0U3RyZWFtUGx1cwogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gSW50ZWdlci5nZXRJbnRlZ2VyKENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAibmlvX2RhdGFfb3V0cHV0X3N0cmVhbV9wbHVzX2J1ZmZlcl9zaXplIiwgMTAyNCAqIDMyKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IE5JT19EQVRBX09VVFBVVF9TVFJFQU1fUExVU19CVUZGRVJfU0laRS5nZXRJbnQoKTsKIAogICAgIHByb3RlY3RlZCBCeXRlQnVmZmVyIGJ1ZmZlcjsKIApAQCAtNjYsNiArNjcsMTYgQEAKICAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIEJ1ZmZlcmVkRGF0YU91dHB1dFN0cmVhbVBsdXMoaW50IHNpemUpCisgICAgeworICAgICAgICB0aGlzLmJ1ZmZlciA9IGFsbG9jYXRlKHNpemUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBCeXRlQnVmZmVyIGFsbG9jYXRlKGludCBzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIuYWxsb2NhdGUoc2l6ZSk7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKQEAgLTc1LDYgKzg2LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgeworICAgICAgICBhc3NlcnQgYnVmZmVyICE9IG51bGwgOiAiQXR0ZW1wdCB0byB1c2UgYSBjbG9zZWQgZGF0YSBvdXRwdXQiOwogICAgICAgICBpZiAoYiA9PSBudWxsKQogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CiAKQEAgLTExMSw2ICsxMjMsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlKEJ5dGVCdWZmZXIgc3JjKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CisgICAgICAgIGFzc2VydCBidWZmZXIgIT0gbnVsbCA6ICJBdHRlbXB0IHRvIHVzZSBhIGNsb3NlZCBkYXRhIG91dHB1dCI7CiAgICAgICAgIGludCBzcmNQb3MgPSBzcmMucG9zaXRpb24oKTsKICAgICAgICAgaW50IHNyY0NvdW50OwogICAgICAgICBpbnQgdHJnQXZhaWxhYmxlOwpAQCAtMTI4LDYgKzE0MSw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgYXNzZXJ0IGJ1ZmZlciAhPSBudWxsIDogIkF0dGVtcHQgdG8gdXNlIGEgY2xvc2VkIGRhdGEgb3V0cHV0IjsKICAgICAgICAgaWYgKCFidWZmZXIuaGFzUmVtYWluaW5nKCkpCiAgICAgICAgICAgICBkb0ZsdXNoKDEpOwogICAgICAgICBidWZmZXIucHV0KChieXRlKSAoYiAmIDB4RkYpKTsKQEAgLTEzNiw2ICsxNTAsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlQm9vbGVhbihib29sZWFuIHYpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgYXNzZXJ0IGJ1ZmZlciAhPSBudWxsIDogIkF0dGVtcHQgdG8gdXNlIGEgY2xvc2VkIGRhdGEgb3V0cHV0IjsKICAgICAgICAgaWYgKCFidWZmZXIuaGFzUmVtYWluaW5nKCkpCiAgICAgICAgICAgICBkb0ZsdXNoKDEpOwogICAgICAgICBidWZmZXIucHV0KHYgPyAoYnl0ZSkxIDogKGJ5dGUpMCk7CkBAIC0xNDgsMTEgKzE2MywxMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZXMobG9uZyByZWdpc3RlciwgaW50IGJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgdm9pZCB3cml0ZU1vc3RTaWduaWZpY2FudEJ5dGVzKGxvbmcgcmVnaXN0ZXIsIGludCBieXRlcykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgeworICAgICAgICBhc3NlcnQgYnVmZmVyICE9IG51bGwgOiAiQXR0ZW1wdCB0byB1c2UgYSBjbG9zZWQgZGF0YSBvdXRwdXQiOwogICAgICAgICBpZiAoYnVmZmVyLnJlbWFpbmluZygpIDwgTG9uZy5CWVRFUykKICAgICAgICAgewotICAgICAgICAgICAgc3VwZXIud3JpdGVCeXRlcyhyZWdpc3RlciwgYnl0ZXMpOworICAgICAgICAgICAgc3VwZXIud3JpdGVNb3N0U2lnbmlmaWNhbnRCeXRlcyhyZWdpc3RlciwgYnl0ZXMpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtMTcxLDYgKzE4Nyw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGVDaGFyKGludCB2KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CisgICAgICAgIGFzc2VydCBidWZmZXIgIT0gbnVsbCA6ICJBdHRlbXB0IHRvIHVzZSBhIGNsb3NlZCBkYXRhIG91dHB1dCI7CiAgICAgICAgIGlmIChidWZmZXIucmVtYWluaW5nKCkgPCAyKQogICAgICAgICAgICAgd3JpdGVTbG93KHYsIDIpOwogICAgICAgICBlbHNlCkBAIC0xODAsNiArMTk3LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCB3cml0ZUludChpbnQgdikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgeworICAgICAgICBhc3NlcnQgYnVmZmVyICE9IG51bGwgOiAiQXR0ZW1wdCB0byB1c2UgYSBjbG9zZWQgZGF0YSBvdXRwdXQiOwogICAgICAgICBpZiAoYnVmZmVyLnJlbWFpbmluZygpIDwgNCkKICAgICAgICAgICAgIHdyaXRlU2xvdyh2LCA0KTsKICAgICAgICAgZWxzZQpAQCAtMTg5LDYgKzIwNyw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgd3JpdGVMb25nKGxvbmcgdikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgeworICAgICAgICBhc3NlcnQgYnVmZmVyICE9IG51bGwgOiAiQXR0ZW1wdCB0byB1c2UgYSBjbG9zZWQgZGF0YSBvdXRwdXQiOwogICAgICAgICBpZiAoYnVmZmVyLnJlbWFpbmluZygpIDwgOCkKICAgICAgICAgICAgIHdyaXRlU2xvdyh2LCA4KTsKICAgICAgICAgZWxzZQpAQCAtMjEwLDYgKzIyOSw3IEBACiAgICAgQERvbnRJbmxpbmUKICAgICBwcml2YXRlIHZvaWQgd3JpdGVTbG93KGxvbmcgYnl0ZXMsIGludCBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgeworICAgICAgICBhc3NlcnQgYnVmZmVyICE9IG51bGwgOiAiQXR0ZW1wdCB0byB1c2UgYSBjbG9zZWQgZGF0YSBvdXRwdXQiOwogICAgICAgICBpbnQgb3JpZ0NvdW50ID0gY291bnQ7CiAgICAgICAgIGlmIChCeXRlT3JkZXIuQklHX0VORElBTiA9PSBidWZmZXIub3JkZXIoKSkKICAgICAgICAgICAgIHdoaWxlIChjb3VudCA+IDApIHdyaXRlQnl0ZSgoaW50KSAoYnl0ZXMgPj4+ICg4ICogLS1jb3VudCkpKTsKQEAgLTIzNCw2ICsyNTQsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHdyaXRlVVRGKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CisgICAgICAgIGFzc2VydCBidWZmZXIgIT0gbnVsbCA6ICJBdHRlbXB0IHRvIHVzZSBhIGNsb3NlZCBkYXRhIG91dHB1dCI7CiAgICAgICAgIFVuYnVmZmVyZWREYXRhT3V0cHV0U3RyZWFtUGx1cy53cml0ZVVURihzLCB0aGlzKTsKICAgICB9CiAKQEAgLTI0Myw2ICsyNjQsNyBAQAogICAgIEBEb250SW5saW5lCiAgICAgcHJvdGVjdGVkIHZvaWQgZG9GbHVzaChpbnQgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgYXNzZXJ0IGJ1ZmZlciAhPSBudWxsIDogIkF0dGVtcHQgdG8gdXNlIGEgY2xvc2VkIGRhdGEgb3V0cHV0IjsKICAgICAgICAgYnVmZmVyLmZsaXAoKTsKIAogICAgICAgICB3aGlsZSAoYnVmZmVyLmhhc1JlbWFpbmluZygpKQpAQCAtMjcxLDcgKzI5Myw4IEBACiAKICAgICBwdWJsaWMgQnVmZmVyZWREYXRhT3V0cHV0U3RyZWFtUGx1cyBvcmRlcihCeXRlT3JkZXIgb3JkZXIpCiAgICAgeworICAgICAgICBhc3NlcnQgYnVmZmVyICE9IG51bGwgOiAiQXR0ZW1wdCB0byB1c2UgYSBjbG9zZWQgZGF0YSBvdXRwdXQiOwogICAgICAgICB0aGlzLmJ1ZmZlci5vcmRlcihvcmRlcik7CiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0NoYW5uZWxQcm94eS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9DaGFubmVsUHJveHkuamF2YQppbmRleCA3MTdkZWY3Li44MTY2NWJlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0NoYW5uZWxQcm94eS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvQ2hhbm5lbFByb3h5LmphdmEKQEAgLTQwLDYgKzQwLDcgQEAKICAqLwogcHVibGljIGZpbmFsIGNsYXNzIENoYW5uZWxQcm94eSBleHRlbmRzIFNoYXJlZENsb3NlYWJsZUltcGwKIHsKKyAgICBwcml2YXRlIGZpbmFsIEZpbGUgZmlsZTsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlUGF0aDsKICAgICBwcml2YXRlIGZpbmFsIEZpbGVDaGFubmVsIGNoYW5uZWw7CiAKQEAgLTYyLDE0ICs2MywxNSBAQAogCiAgICAgcHVibGljIENoYW5uZWxQcm94eShGaWxlIGZpbGUpCiAgICAgewotICAgICAgICB0aGlzKGZpbGUucGF0aCgpLCBvcGVuQ2hhbm5lbChmaWxlKSk7CisgICAgICAgIHRoaXMoZmlsZSwgb3BlbkNoYW5uZWwoZmlsZSkpOwogICAgIH0KIAotICAgIHB1YmxpYyBDaGFubmVsUHJveHkoU3RyaW5nIGZpbGVQYXRoLCBGaWxlQ2hhbm5lbCBjaGFubmVsKQorICAgIHB1YmxpYyBDaGFubmVsUHJveHkoRmlsZSBmaWxlLCBGaWxlQ2hhbm5lbCBjaGFubmVsKQogICAgIHsKLSAgICAgICAgc3VwZXIobmV3IENsZWFudXAoZmlsZVBhdGgsIGNoYW5uZWwpKTsKKyAgICAgICAgc3VwZXIobmV3IENsZWFudXAoZmlsZS5wYXRoKCksIGNoYW5uZWwpKTsKIAotICAgICAgICB0aGlzLmZpbGVQYXRoID0gZmlsZVBhdGg7CisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgICAgIHRoaXMuZmlsZVBhdGggPSBmaWxlLnBhdGgoKTsKICAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKICAgICB9CiAKQEAgLTc3LDYgKzc5LDcgQEAKICAgICB7CiAgICAgICAgIHN1cGVyKGNvcHkpOwogCisgICAgICAgIHRoaXMuZmlsZSA9IGNvcHkuZmlsZTsKICAgICAgICAgdGhpcy5maWxlUGF0aCA9IGNvcHkuZmlsZVBhdGg7CiAgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNvcHkuY2hhbm5lbDsKICAgICB9CkBAIC0xMzAsNiArMTMzLDExIEBACiAgICAgICAgIHJldHVybiBmaWxlUGF0aDsKICAgICB9CiAKKyAgICBwdWJsaWMgRmlsZSBmaWxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmaWxlOworICAgIH0KKwogICAgIHB1YmxpYyBpbnQgcmVhZChCeXRlQnVmZmVyIGJ1ZmZlciwgbG9uZyBwb3NpdGlvbikKICAgICB7CiAgICAgICAgIHRyeQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhSW5wdXRQbHVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFJbnB1dFBsdXMuamF2YQppbmRleCBiZGE4NDYxLi5kMTE3YzdmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFJbnB1dFBsdXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFJbnB1dFBsdXMuamF2YQpAQCAtMTcsMTAgKzE3LDE0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbDsKIAotaW1wb3J0IGphdmEuaW8uKjsKK2ltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dDsKK2ltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TaGFyZWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZy5WSW50T3V0T2ZSYW5nZUV4Y2VwdGlvbjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TaGFyZWQuU2NvcGUuU0lNVUxBVElPTjsKIApAQCAtMzAsMTIgKzM0LDMxIEBACiBAU2hhcmVkKHNjb3BlID0gU0lNVUxBVElPTikKIHB1YmxpYyBpbnRlcmZhY2UgRGF0YUlucHV0UGx1cyBleHRlbmRzIERhdGFJbnB1dAogeworICAgIC8qKgorICAgICAqIFJlYWQgYSA2NC1iaXQgaW50ZWdlciBiYWNrLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgYXNzdW1lcyBpdCB3YXMgb3JpZ2luYWxseSB3cml0dGVuIHVzaW5nCisgICAgICoge0BsaW5rIERhdGFPdXRwdXRQbHVzI3dyaXRlVkludChsb25nKX0gb3Igc2ltaWxhciB0aGF0IHppZ3phZyBlbmNvZGVzIHRoZSB2aW50LgorICAgICAqLwogICAgIGRlZmF1bHQgbG9uZyByZWFkVkludCgpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgcmV0dXJuIFZJbnRDb2RpbmcucmVhZFZJbnQodGhpcyk7CiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmVhZCB1cCB0byBhIDMyLWJpdCBpbnRlZ2VyIGJhY2suCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZSBpbnRlZ2VyIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gdXNpbmcKKyAgICAgKiB7QGxpbmsgRGF0YU91dHB1dFBsdXMjd3JpdGVWSW50MzIoaW50KX0gb3Igc2ltaWxhciB0aGF0IHppZ3phZyBlbmNvZGVzIHRoZSB2aW50LgorICAgICAqCisgICAgICogQHRocm93cyBWSW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiBJZiB0aGUgdmludCBkb2Vzbid0IGZpdCBpbnRvIGEgMzItYml0IGludGVnZXIKKyAgICAgKi8KKyAgICBkZWZhdWx0IGludCByZWFkVkludDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gVkludENvZGluZy5yZWFkVkludDMyKHRoaXMpOworICAgIH0KKworICAgIC8qKgogICAgICAqIFRoaW5rIGhhcmQgYmVmb3JlIG9wdGluZyBmb3IgYW4gdW5zaWduZWQgZW5jb2RpbmcuIElzIHRoaXMgZ29pbmcgdG8gYml0ZSBzb21lb25lIGJlY2F1c2Ugc29tZSBkYXkKICAgICAgKiB0aGV5IG1pZ2h0IG5lZWQgdG8gcGFzcyBpbiBhIHNlbnRpbmVsIHZhbHVlIHVzaW5nIG5lZ2F0aXZlIG51bWJlcnM/IElzIHRoZSByaXNrIHdvcnRoIGl0CiAgICAgICogdG8gc2F2ZSBhIGZldyBieXRlcz8KQEAgLTQ4LDYgKzcxLDE5IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmVhZCB1cCB0byBhIDMyLWJpdCBpbnRlZ2VyIGJhY2suCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZSBvcmlnaW5hbCBpbnRlZ2VyIHdhcyB3cml0dGVuIHVzaW5nIHtAbGluayBEYXRhT3V0cHV0UGx1cyN3cml0ZVVuc2lnbmVkVkludDMyKGludCl9CisgICAgICogb3Igc2ltaWxhciB0aGF0IGRvZXNuJ3QgemlnemFnIGVuY29kZXMgdGhlIHZpbnQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFZJbnRPdXRPZlJhbmdlRXhjZXB0aW9uIElmIHRoZSB2aW50IGRvZXNuJ3QgZml0IGludG8gYSAzMi1iaXQgaW50ZWdlcgorICAgICAqLworICAgIGRlZmF1bHQgaW50IHJlYWRVbnNpZ25lZFZJbnQzMigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIFZJbnRDb2RpbmcucmVhZFVuc2lnbmVkVkludDMyKHRoaXMpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEFsd2F5cyBza2lwcyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcywgdW5sZXNzIEVPRiBpcyByZWFjaGVkCiAgICAgICoKICAgICAgKiBAcGFyYW0gbiBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcApAQCAtNjQsMTQgKzEwMCw4IEBACiAKICAgICAvKioKICAgICAgKiBXcmFwcGVyIGFyb3VuZCBhbiBJbnB1dFN0cmVhbSB0aGF0IHByb3ZpZGVzIG5vIGJ1ZmZlcmluZyBidXQgY2FuIGRlY29kZSB2YXJpbnRzCi0gICAgICoKLSAgICAgKiBUT0RPOiBwcm9iYWJseSBzaG91bGRuJ3QgdXNlIERhdGFJbnB1dFN0cmVhbSBhcyBhIHBhcmVudAogICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBEYXRhSW5wdXRTdHJlYW1QbHVzIGV4dGVuZHMgRGF0YUlucHV0U3RyZWFtIGltcGxlbWVudHMgRGF0YUlucHV0UGx1cworICAgIGFic3RyYWN0IGNsYXNzIERhdGFJbnB1dFN0cmVhbVBsdXMgZXh0ZW5kcyBJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIERhdGFJbnB1dFBsdXMKICAgICB7Ci0gICAgICAgIHB1YmxpYyBEYXRhSW5wdXRTdHJlYW1QbHVzKElucHV0U3RyZWFtIGlzKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihpcyk7Ci0gICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFJbnRlZ3JpdHlNZXRhZGF0YS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhSW50ZWdyaXR5TWV0YWRhdGEuamF2YQppbmRleCA2NWQ0ZTU4Li5hZWYzNjE0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFJbnRlZ3JpdHlNZXRhZGF0YS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YUludGVncml0eU1ldGFkYXRhLmphdmEKQEAgLTIzLDUxICsyMywzMCBAQAogaW1wb3J0IGphdmEudXRpbC56aXAuQ2hlY2tlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC56aXAuQ2hlY2tzdW07CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DaGVja3N1bVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKIAogcHVibGljIGNsYXNzIERhdGFJbnRlZ3JpdHlNZXRhZGF0YQogewotICAgIHB1YmxpYyBzdGF0aWMgQ2hlY2tzdW1WYWxpZGF0b3IgY2hlY2tzdW1WYWxpZGF0b3IoRGVzY3JpcHRvciBkZXNjKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2hlY2tzdW1WYWxpZGF0b3IoZGVzYyk7Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGVja3N1bVZhbGlkYXRvciBpbXBsZW1lbnRzIENsb3NlYWJsZQogICAgIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDaGVja3N1bVR5cGUgY2hlY2tzdW1UeXBlOwogICAgICAgICBwcml2YXRlIGZpbmFsIFJhbmRvbUFjY2Vzc1JlYWRlciByZWFkZXI7CiAgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgY2h1bmtTaXplOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkYXRhRmlsZW5hbWU7CiAKLSAgICAgICAgcHVibGljIENoZWNrc3VtVmFsaWRhdG9yKERlc2NyaXB0b3IgZGVzY3JpcHRvcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHB1YmxpYyBDaGVja3N1bVZhbGlkYXRvcihGaWxlIGRhdGFGaWxlLCBGaWxlIGNyY0ZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzKENoZWNrc3VtVHlwZS5DUkMzMiwKLSAgICAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4obmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuQ1JDKSkpLAotICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7CisgICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKGNyY0ZpbGUpLAorICAgICAgICAgICAgICAgICBkYXRhRmlsZS5hYnNvbHV0ZVBhdGgoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgQ2hlY2tzdW1WYWxpZGF0b3IoQ2hlY2tzdW1UeXBlIGNoZWNrc3VtVHlwZSwgUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciwgU3RyaW5nIGRhdGFGaWxlbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMuY2hlY2tzdW1UeXBlID0gY2hlY2tzdW1UeXBlOwogICAgICAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7Ci0gICAgICAgICAgICB0aGlzLmRhdGFGaWxlbmFtZSA9IGRhdGFGaWxlbmFtZTsKICAgICAgICAgICAgIGNodW5rU2l6ZSA9IHJlYWRlci5yZWFkSW50KCk7CiAgICAgICAgIH0KIAotICAgICAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICAgICAgcHJvdGVjdGVkIENoZWNrc3VtVmFsaWRhdG9yKENoZWNrc3VtVHlwZSBjaGVja3N1bVR5cGUsIFJhbmRvbUFjY2Vzc1JlYWRlciByZWFkZXIsIGludCBjaHVua1NpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY2hlY2tzdW1UeXBlID0gY2hlY2tzdW1UeXBlOwotICAgICAgICAgICAgdGhpcy5yZWFkZXIgPSByZWFkZXI7Ci0gICAgICAgICAgICB0aGlzLmRhdGFGaWxlbmFtZSA9IG51bGw7Ci0gICAgICAgICAgICB0aGlzLmNodW5rU2l6ZSA9IGNodW5rU2l6ZTsKLSAgICAgICAgfQotCiAgICAgICAgIHB1YmxpYyB2b2lkIHNlZWsobG9uZyBvZmZzZXQpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxvbmcgc3RhcnQgPSBjaHVua1N0YXJ0KG9mZnNldCk7CkBAIC04MiwxMCArNjEsMTAgQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShieXRlW10gYnl0ZXMsIGludCBzdGFydCwgaW50IGVuZCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBjdXJyZW50ID0gKGludCkgY2hlY2tzdW1UeXBlLm9mKGJ5dGVzLCBzdGFydCwgZW5kKTsKLSAgICAgICAgICAgIGludCBhY3R1YWwgPSByZWFkZXIucmVhZEludCgpOwotICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT0gYWN0dWFsKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ29ycnVwdGVkIEZpbGUgOiAiICsgZGF0YUZpbGVuYW1lKTsKKyAgICAgICAgICAgIGludCBjYWxjdWxhdGVkVmFsdWUgPSAoaW50KSBjaGVja3N1bVR5cGUub2YoYnl0ZXMsIHN0YXJ0LCBlbmQpOworICAgICAgICAgICAgaW50IHN0b3JlZFZhbHVlID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGlmIChjYWxjdWxhdGVkVmFsdWUgIT0gc3RvcmVkVmFsdWUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNvcnJ1cHRlZCBmaWxlOiBpbnRlZ3JpdHkgY2hlY2sgKCVzKSBmYWlsZWQgZm9yICVzOiAlZCAhPSAlZCIsIGNoZWNrc3VtVHlwZS5uYW1lKCksIHJlYWRlci5nZXRQYXRoKCksIHN0b3JlZFZhbHVlLCBjYWxjdWxhdGVkVmFsdWUpKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qKgpAQCAtOTYsMTAgKzc1LDEwIEBACiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShCeXRlQnVmZmVyIGJ1ZmZlcikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBjdXJyZW50ID0gKGludCkgY2hlY2tzdW1UeXBlLm9mKGJ1ZmZlcik7Ci0gICAgICAgICAgICBpbnQgYWN0dWFsID0gcmVhZGVyLnJlYWRJbnQoKTsKLSAgICAgICAgICAgIGlmIChjdXJyZW50ICE9IGFjdHVhbCkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvcnJ1cHRlZCBGaWxlIDogIiArIGRhdGFGaWxlbmFtZSk7CisgICAgICAgICAgICBpbnQgY2FsY3VsYXRlZFZhbHVlID0gKGludCkgY2hlY2tzdW1UeXBlLm9mKGJ1ZmZlcik7CisgICAgICAgICAgICBpbnQgc3RvcmVkVmFsdWUgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgaWYgKGNhbGN1bGF0ZWRWYWx1ZSAhPSBzdG9yZWRWYWx1ZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQ29ycnVwdGVkIGZpbGU6IGludGVncml0eSBjaGVjayAoJXMpIGZhaWxlZCBmb3IgJXM6ICVkICE9ICVkIiwgY2hlY2tzdW1UeXBlLm5hbWUoKSwgcmVhZGVyLmdldFBhdGgoKSwgc3RvcmVkVmFsdWUsIGNhbGN1bGF0ZWRWYWx1ZSkpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQpAQCAtMTA4LDU1ICs4NywzMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBGaWxlRGlnZXN0VmFsaWRhdG9yIGZpbGVEaWdlc3RWYWxpZGF0b3IoRGVzY3JpcHRvciBkZXNjKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZURpZ2VzdFZhbGlkYXRvcihkZXNjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbGVEaWdlc3RWYWxpZGF0b3IgaW1wbGVtZW50cyBDbG9zZWFibGUKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbGVEaWdlc3RWYWxpZGF0b3IKICAgICB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgQ2hlY2tzdW0gY2hlY2tzdW07Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUmFuZG9tQWNjZXNzUmVhZGVyIGRpZ2VzdFJlYWRlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSYW5kb21BY2Nlc3NSZWFkZXIgZGF0YVJlYWRlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBzdG9yZWREaWdlc3RWYWx1ZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGRhdGFGaWxlOworICAgICAgICBwcml2YXRlIGZpbmFsIEZpbGUgZGlnZXN0RmlsZTsKIAotICAgICAgICBwdWJsaWMgRmlsZURpZ2VzdFZhbGlkYXRvcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgRmlsZURpZ2VzdFZhbGlkYXRvcihGaWxlIGRhdGFGaWxlLCBGaWxlIGRpZ2VzdEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICAgICAgY2hlY2tzdW0gPSBDaGVja3N1bVR5cGUuQ1JDMzIubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGRpZ2VzdFJlYWRlciA9IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRJR0VTVCkpKTsKLSAgICAgICAgICAgIGRhdGFSZWFkZXIgPSBSYW5kb21BY2Nlc3NSZWFkZXIub3BlbihuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSkpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RvcmVkRGlnZXN0VmFsdWUgPSBMb25nLnBhcnNlTG9uZyhkaWdlc3RSZWFkZXIucmVhZExpbmUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAvLyBBdHRlbXB0aW5nIHRvIGNyZWF0ZSBhIEZpbGVEaWdlc3RWYWxpZGF0b3Igd2l0aG91dCBhIERJR0VTVCBmaWxlIHdpbGwgZmFpbAotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ29ycnVwdGVkIFNTVGFibGUgOiAiICsgZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5kYXRhRmlsZSA9IGRhdGFGaWxlOworICAgICAgICAgICAgdGhpcy5kaWdlc3RGaWxlID0gZGlnZXN0RmlsZTsKKyAgICAgICAgICAgIHRoaXMuY2hlY2tzdW0gPSBDaGVja3N1bVR5cGUuQ1JDMzIubmV3SW5zdGFuY2UoKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFZhbGlkYXRlIHRoZSBlbnRpcmUgZmlsZQogICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBDaGVja2VkSW5wdXRTdHJlYW0gY2hlY2tlZElucHV0U3RyZWFtID0gbmV3IENoZWNrZWRJbnB1dFN0cmVhbShkYXRhUmVhZGVyLCBjaGVja3N1bSk7Ci0gICAgICAgICAgICBieXRlW10gY2h1bmsgPSBuZXcgYnl0ZVs2NCAqIDEwMjRdOwotCi0gICAgICAgICAgICB3aGlsZSggY2hlY2tlZElucHV0U3RyZWFtLnJlYWQoY2h1bmspID4gMCApIHsgfQotICAgICAgICAgICAgbG9uZyBjYWxjdWxhdGVkRGlnZXN0VmFsdWUgPSBjaGVja2VkSW5wdXRTdHJlYW0uZ2V0Q2hlY2tzdW0oKS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgaWYgKHN0b3JlZERpZ2VzdFZhbHVlICE9IGNhbGN1bGF0ZWREaWdlc3RWYWx1ZSkKKyAgICAgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGRpZ2VzdFJlYWRlciA9IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKGRpZ2VzdEZpbGUpOworICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgZGF0YVJlYWRlciA9IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKGRhdGFGaWxlKTsKKyAgICAgICAgICAgICAgICAgQ2hlY2tlZElucHV0U3RyZWFtIGNoZWNrZWRJbnB1dFN0cmVhbSA9IG5ldyBDaGVja2VkSW5wdXRTdHJlYW0oZGF0YVJlYWRlciwgY2hlY2tzdW0pOykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvcnJ1cHRlZCBTU1RhYmxlIDogIiArIGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKTsKKyAgICAgICAgICAgICAgICBsb25nIHN0b3JlZERpZ2VzdFZhbHVlID0gTG9uZy5wYXJzZUxvbmcoZGlnZXN0UmVhZGVyLnJlYWRMaW5lKCkpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBjaHVuayA9IG5ldyBieXRlWzY0ICogMTAyNF07CisgICAgICAgICAgICAgICAgd2hpbGUgKGNoZWNrZWRJbnB1dFN0cmVhbS5yZWFkKGNodW5rKSA+IDApIDsKKyAgICAgICAgICAgICAgICBsb25nIGNhbGN1bGF0ZWREaWdlc3RWYWx1ZSA9IGNoZWNrZWRJbnB1dFN0cmVhbS5nZXRDaGVja3N1bSgpLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0b3JlZERpZ2VzdFZhbHVlICE9IGNhbGN1bGF0ZWREaWdlc3RWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkNvcnJ1cHRlZCBmaWxlOiBpbnRlZ3JpdHkgY2hlY2sgKGRpZ2VzdCkgZmFpbGVkIGZvciAlczogJWQgIT0gJWQiLCBkYXRhRmlsZSwgc3RvcmVkRGlnZXN0VmFsdWUsIGNhbGN1bGF0ZWREaWdlc3RWYWx1ZSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBUaHJvd2FibGVzLnBlcmZvcm0oZGlnZXN0UmVhZGVyOjpjbG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUmVhZGVyOjpjbG9zZSk7Ci0gICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFPdXRwdXRCdWZmZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YU91dHB1dEJ1ZmZlci5qYXZhCmluZGV4IGQ2ZjNhNGEuLmQyN2E5MzUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YU91dHB1dEJ1ZmZlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YU91dHB1dEJ1ZmZlci5qYXZhCkBAIC0yNiw3ICsyNiwxMCBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKIAogaW1wb3J0IGlvLm5ldHR5LnV0aWwuY29uY3VycmVudC5GYXN0VGhyZWFkTG9jYWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkRBVEFfT1VUUFVUX0JVRkZFUl9BTExPQ0FURV9UWVBFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkRPQl9ET1VCTElOR19USFJFU0hPTERfTUI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRE9CX01BWF9SRUNZQ0xFX0JZVEVTOwogCiAvKioKICAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEYXRhT3V0cHV0U3RyZWFtIGludGVyZmFjZSB1c2luZyBhIEZhc3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYW5kIGV4cG9zaW5nCkBAIC0zOSwxNyArNDIsMTkgQEAKICAgICAvKgogICAgICAqIFRocmVzaG9sZCBhdCB3aGljaCByZXNpemluZyB0cmFuc2l0aW9ucyBmcm9tIGRvdWJsaW5nIHRvIGluY3JlYXNpbmcgYnkgNTAlCiAgICAgICovCi0gICAgc3RhdGljIGZpbmFsIGxvbmcgRE9VQkxJTkdfVEhSRVNIT0xEID0gTG9uZy5nZXRMb25nKENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiRE9CX0RPVUJMSU5HX1RIUkVTSE9MRF9NQiIsIDY0KTsKKyAgICBzdGF0aWMgZmluYWwgbG9uZyBET1VCTElOR19USFJFU0hPTEQgPSBET0JfRE9VQkxJTkdfVEhSRVNIT0xEX01CLmdldExvbmcoKTsKIAogICAgIC8qCiAgICAgICogT25seSByZWN5Y2xlIE91dHB1dEJ1ZmZlcnMgdXAgdG8gMU1iLiBMYXJnZXIgYnVmZmVycyB3aWxsIGJlIHRyaW1tZWQgYmFjayB0byB0aGlzIHNpemUuCiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9SRUNZQ0xFX0JVRkZFUl9TSVpFID0gSW50ZWdlci5nZXRJbnRlZ2VyKENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiZG9iX21heF9yZWN5Y2xlX2J5dGVzIiwgMTAyNCAqIDEwMjQpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVDWUNMRV9CVUZGRVJfU0laRSA9IERPQl9NQVhfUkVDWUNMRV9CWVRFUy5nZXRJbnQoKTsKKyAgICBwcml2YXRlIGVudW0gQWxsb2NhdGlvblR5cGUgeyBESVJFQ1QsIE9OSEVBUCB9CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWxsb2NhdGlvblR5cGUgQUxMT0NBVElPTl9UWVBFID0gREFUQV9PVVRQVVRfQlVGRkVSX0FMTE9DQVRFX1RZUEUuZ2V0RW51bShBbGxvY2F0aW9uVHlwZS5ESVJFQ1QpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSA9IDEyODsKIAogICAgIC8qKgotICAgICAqIFNjcmF0Y2ggYnVmZmVycyB1c2VkIG1vc3RseSBmb3Igc2VyaWFsaXppbmcgaW4gbWVtb3J5LiBJdCdzIGltcG9ydGFudCB0byBjYWxsICNyZWN5Y2xlKCkgd2hlbiBmaW5pc2hlZAorICAgICAqIFNjcmF0Y2ggYnVmZmVycyB1c2VkIG1vc3RseSBmb3Igc2VyaWFsaXppbmcgaW4gbWVtb3J5LiBJdCdzIGltcG9ydGFudCB0byBjYWxsICNjbG9zZSgpIHdoZW4gZmluaXNoZWQKICAgICAgKiB0byBrZWVwIHRoZSBtZW1vcnkgb3ZlcmhlYWQgZnJvbSBiZWluZyB0b28gbGFyZ2UgaW4gdGhlIHN5c3RlbS4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEZhc3RUaHJlYWRMb2NhbDxEYXRhT3V0cHV0QnVmZmVyPiBzY3JhdGNoQnVmZmVyID0gbmV3IEZhc3RUaHJlYWRMb2NhbDxEYXRhT3V0cHV0QnVmZmVyPigpCkBAIC01OSwyOSArNjQsMzggQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhT3V0cHV0QnVmZmVyKCkKICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLmNhcGFjaXR5KCkgPD0gTUFYX1JFQ1lDTEVfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gbnVsbCAmJiBidWZmZXIuY2FwYWNpdHkoKSA8PSBNQVhfUkVDWUNMRV9CVUZGRVJfU0laRSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKERFRkFVTFRfSU5JVElBTF9CVUZGRVJfU0laRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRCdWZmZXIoYWxsb2NhdGUoREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBhbGxvY2F0ZShpbnQgc2l6ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTExPQ0FUSU9OX1RZUEUgPT0gQWxsb2NhdGlvblR5cGUuRElSRUNUID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3Qoc2l6ZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlci5hbGxvY2F0ZShzaXplKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9OwogICAgICAgICB9CiAgICAgfTsKIAogICAgIHB1YmxpYyBEYXRhT3V0cHV0QnVmZmVyKCkKICAgICB7Ci0gICAgICAgIHRoaXMoREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFKTsKKyAgICAgICAgc3VwZXIoREVGQVVMVF9JTklUSUFMX0JVRkZFUl9TSVpFKTsKICAgICB9CiAKICAgICBwdWJsaWMgRGF0YU91dHB1dEJ1ZmZlcihpbnQgc2l6ZSkKICAgICB7Ci0gICAgICAgIHN1cGVyKEJ5dGVCdWZmZXIuYWxsb2NhdGUoc2l6ZSkpOworICAgICAgICBzdXBlcihzaXplKTsKICAgICB9CiAKICAgICBwdWJsaWMgRGF0YU91dHB1dEJ1ZmZlcihCeXRlQnVmZmVyIGJ1ZmZlcikKQEAgLTE1OCw5ICsxNzIsMTUgQEAKICAgICB7CiAgICAgICAgIGlmIChjb3VudCA8PSAwKQogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBCeXRlQnVmZmVyIG5ld0J1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoY2hlY2tlZEFycmF5U2l6ZUNhc3QoY2FsY3VsYXRlTmV3U2l6ZShjb3VudCkpKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBuZXdCdWZmZXIgPSBhbGxvY2F0ZShjaGVja2VkQXJyYXlTaXplQ2FzdChjYWxjdWxhdGVOZXdTaXplKGNvdW50KSkpOwogICAgICAgICBidWZmZXIuZmxpcCgpOwogICAgICAgICBuZXdCdWZmZXIucHV0KGJ1ZmZlcik7CisgICAgICAgIHNldEJ1ZmZlcihuZXdCdWZmZXIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIHNldEJ1ZmZlcihCeXRlQnVmZmVyIG5ld0J1ZmZlcikKKyAgICB7CisgICAgICAgIEZpbGVVdGlscy5jbGVhbihidWZmZXIpOyAvLyBmcmVlIGlmIGRpcmVjdAogICAgICAgICBidWZmZXIgPSBuZXdCdWZmZXI7CiAgICAgfQogCkBAIC0yMjEsNiArMjQxLDE4IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdW5kZXJseWluZyBCeXRlQnVmZmVyIGFuZCBjYWxscyB7QGxpbmsgQnl0ZUJ1ZmZlciNmbGlwKCl9LiAgVGhpcyBtZXRob2QgaXMgInVuc2FmZSIgaW4gdGhlIHNlbnNlIHRoYXQKKyAgICAgKiBpdCByZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciwgd2hpY2ggbWF5IGJlIG1vZGlmaWVkIGJ5IG90aGVyIG1ldGhvZHMgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCAob3IgY2xlYXJlZCBvbgorICAgICAqIHtAbGluayAjY2xvc2UoKX0pLiBJZiB0aGUgY2FsbGluZyBsb2dpYyBrbm93cyB0aGF0IG5vIG5ldyBjYWxscyB0byB0aGlzIG9iamVjdCB3aWxsIGhhcHBlbiBhZnRlciBjYWxsaW5nIHRoaXMKKyAgICAgKiBtZXRob2QsIHRoZW4gdGhpcyBtZXRob2QgY2FuIGF2b2lkIHRoZSBjb3B5aW5nIGRvbmUgaW4ge0BsaW5rICNhc05ld0J1ZmZlcigpfSwgYW5kIHtAbGluayAjYnVmZmVyKCl9LgorICAgICAqLworICAgIHB1YmxpYyBCeXRlQnVmZmVyIHVuc2FmZUdldEJ1ZmZlckFuZEZsaXAoKQorICAgIHsKKyAgICAgICAgYnVmZmVyLmZsaXAoKTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICB9CisKICAgICBwdWJsaWMgYnl0ZVtdIGdldERhdGEoKQogICAgIHsKICAgICAgICAgYXNzZXJ0IGJ1ZmZlci5hcnJheU9mZnNldCgpID09IDA7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFPdXRwdXRQbHVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFPdXRwdXRQbHVzLmphdmEKaW5kZXggMjA1ZGFiNy4uOGIzYjQ5ZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhT3V0cHV0UGx1cy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YU91dHB1dFBsdXMuamF2YQpAQCAtMTcsMTMgKzE3LDEzIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlNoYXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy52aW50LlZJbnRDb2Rpbmc7CisKIGltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXQ7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZzsKLQogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5TaGFyZWQuU2NvcGUuU0lNVUxBVElPTjsKIAogLyoqCkBAIC00Nyw2ICs0NywxNyBAQAogICAgICAgICBWSW50Q29kaW5nLndyaXRlVkludChpLCB0aGlzKTsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAorICAgIGRlZmF1bHQgdm9pZCB3cml0ZVZJbnQoaW50IGkpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVzZSB3cml0ZVZJbnQzMi9yZWFkVkludDMyIik7CisgICAgfQorCisgICAgZGVmYXVsdCB2b2lkIHdyaXRlVkludDMyKGludCBpKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVWSW50MzIoaSwgdGhpcyk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGhpcyBpcyBtb3JlIGVmZmljaWVudCBmb3Igc3RvcmluZyB1bnNpZ25lZCB2YWx1ZXMsIGJvdGggaW4gc3RvcmFnZSBhbmQgQ1BVIGJ1cmRlbi4KICAgICAgKgpAQCAtNTksNiArNzAsMTcgQEAKICAgICAgICAgVkludENvZGluZy53cml0ZVVuc2lnbmVkVkludChpLCB0aGlzKTsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAorICAgIGRlZmF1bHQgdm9pZCB3cml0ZVVuc2lnbmVkVkludChpbnQgaSkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVXNlIHdyaXRlVW5zaWduZWRWSW50MzIvcmVhZFVuc2lnbmVkVkludDMyIik7CisgICAgfQorCisgICAgZGVmYXVsdCB2b2lkIHdyaXRlVW5zaWduZWRWSW50MzIoaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgVkludENvZGluZy53cml0ZVVuc2lnbmVkVkludDMyKGksIHRoaXMpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEFuIGVmZmljaWVudCB3YXkgdG8gd3JpdGUgdGhlIHR5cGUge0Bjb2RlIGJ5dGVzfSBvZiBhIGxvbmcKICAgICAgKgpAQCAtNjYsNyArODgsNyBAQAogICAgICAqIEBwYXJhbSBieXRlcyAtIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIHJlZ2lzdGVyIG9jY3VwaWVzLiBWYWxpZCB2YWx1ZXMgYXJlIGJldHdlZW4gMSBhbmQgOCBpbmNsdXNpdmUuCiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqLwotICAgIGRlZmF1bHQgdm9pZCB3cml0ZUJ5dGVzKGxvbmcgcmVnaXN0ZXIsIGludCBieXRlcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgZGVmYXVsdCB2b2lkIHdyaXRlTW9zdFNpZ25pZmljYW50Qnl0ZXMobG9uZyByZWdpc3RlciwgaW50IGJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIHN3aXRjaCAoYnl0ZXMpCiAgICAgICAgIHsKQEAgLTEyOSw0ICsxNTEsNDAgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci19CisKKyAgICAvLyBUaGUgbWV0aG9kcyBiZWxvdyBzdXBwb3J0IHBhZ2UtYXdhcmUgbGF5b3V0IGZvciB3cml0aW5nLiBUaGVzZSB3b3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGlmIHBvc2l0aW9uKCkgaXMKKyAgICAvLyBhbHNvIHN1cHBvcnRlZC4KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGEgcGFnZSBjYW4gdGFrZSBhdCBtYXhpbXVtLgorICAgICAqLworICAgIGRlZmF1bHQgaW50IG1heEJ5dGVzSW5QYWdlKCkKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhZCB0aGlzIHBhZ2Ugd2l0aCAwcyB0byBtb3ZlIG9uIHRvIHRoZSBuZXh0LgorICAgICAqLworICAgIGRlZmF1bHQgdm9pZCBwYWRUb1BhZ2VCb3VuZGFyeSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBob3cgbWFueSBieXRlcyBhcmUgbGVmdCBpbiB0aGUgcGFnZS4KKyAgICAgKi8KKyAgICBkZWZhdWx0IGludCBieXRlc0xlZnRJblBhZ2UoKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBwYWRkZWQgcG9zaXRpb24uIFRoaXMgaXMgZWl0aGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uIChpZiBhbHJlYWR5IHBhZGRlZCksIG9yIHRoZSBzdGFydCBvZiBuZXh0CisgICAgICogcGFnZS4KKyAgICAgKi8KKyAgICBkZWZhdWx0IGxvbmcgcGFkZGVkUG9zaXRpb24oKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YU91dHB1dFN0cmVhbVBsdXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YU91dHB1dFN0cmVhbVBsdXMuamF2YQppbmRleCBlOTMxODk5Li43ZGQyMzQxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFPdXRwdXRTdHJlYW1QbHVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhT3V0cHV0U3RyZWFtUGx1cy5qYXZhCkBAIC0yMyw5ICsyMywxMCBAQAogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWw7CiAKIGltcG9ydCBpby5uZXR0eS51dGlsLmNvbmN1cnJlbnQuRmFzdFRocmVhZExvY2FsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5EQVRBX09VVFBVVF9TVFJFQU1fUExVU19URU1QX0JVRkZFUl9TSVpFOworCiAvKioKICAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIERhdGFPdXRwdXRTdHJlYW1zIHRoYXQgYWNjZXB0IHdyaXRlcyBmcm9tIEJ5dGVCdWZmZXIgb3IgTWVtb3J5IGFuZCBhbHNvIHByb3ZpZGUKICAqIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBXcml0YWJsZUJ5dGVDaGFubmVsIGFzc29jaWF0ZWQgd2l0aCB0aGVpciBvdXRwdXQgc3RyZWFtLgpAQCAtNDcsOCArNDgsNyBAQAogICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGludCBNQVhfQlVGRkVSX1NJWkUgPQotICAgICAgICAgICAgSW50ZWdlci5nZXRJbnRlZ2VyKENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiZGF0YV9vdXRwdXRfc3RyZWFtX3BsdXNfdGVtcF9idWZmZXJfc2l6ZSIsIDgxOTIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQlVGRkVSX1NJWkUgPSBEQVRBX09VVFBVVF9TVFJFQU1fUExVU19URU1QX0JVRkZFUl9TSVpFLmdldEludCgpOwogCiAgICAgLyoKICAgICAgKiBGYWN0b3JlZCBvdXQgaW50byBzZXBhcmF0ZSBtZXRob2QgdG8gY3JlYXRlIG1vcmUgZmxleGliaWxpdHkgYXJvdW5kIGlubGluaW5nCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0VtcHR5UmVidWZmZXJlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9FbXB0eVJlYnVmZmVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYThlN2UwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9FbXB0eVJlYnVmZmVyZXIuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWw7CisKK3B1YmxpYyBjbGFzcyBFbXB0eVJlYnVmZmVyZXIgaW1wbGVtZW50cyBSZWJ1ZmZlcmVyLCBSZWJ1ZmZlcmVyRmFjdG9yeQoreworICAgIHByaXZhdGUgZmluYWwgQ2hhbm5lbFByb3h5IGNoYW5uZWw7CisKKyAgICBwdWJsaWMgRW1wdHlSZWJ1ZmZlcmVyKENoYW5uZWxQcm94eSBjaGFubmVsKQorICAgIHsKKyAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYW5uZWxQcm94eSBjaGFubmVsKCkKKyAgICB7CisgICAgICAgIHJldHVybiBjaGFubmVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGZpbGVMZW5ndGgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGRvdWJsZSBnZXRDcmNDaGVja0NoYW5jZSgpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQnVmZmVySG9sZGVyIHJlYnVmZmVyKGxvbmcgcG9zaXRpb24pCisgICAgeworICAgICAgICByZXR1cm4gRU1QVFk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2VSZWFkZXIoKQorICAgIHsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZWJ1ZmZlcmVyIGluc3RhbnRpYXRlUmVidWZmZXJlcigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRmlsZS5qYXZhCmluZGV4IDFmNDg3MDcuLmRlNDE1MzggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRmlsZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRmlsZS5qYXZhCkBAIC0yMyw3ICsyMywxMiBAQAogaW1wb3J0IGphdmEuaW8uVW5jaGVja2VkSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJJOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwotaW1wb3J0IGphdmEubmlvLmZpbGUuKjsgLy8gY2hlY2tzdHlsZTogcGVybWl0IHRoaXMgaW1wb3J0CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3lzdGVtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN5c3RlbXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLk5vU3VjaEZpbGVFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7IC8vIGNoZWNrc3R5bGU6IHBlcm1pdCB0aGlzIGltcG9ydAogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaVByZWRpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CkBAIC0zMSw5ICszNiw5IEBACiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkludEZ1bmN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07Ci0KIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlJhdGVMaW1pdGVyOwogCiBpbXBvcnQgbmV0Lm9wZW5oZnQuY2hyb25pY2xlLmNvcmUudXRpbC5UaHJvd2luZ0Z1bmN0aW9uOwpAQCAtMTIyLDE3ICsxMjcsMjggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBVbnNhZmUgY29uc3RydWN0b3IgdGhhdCBhbGxvd3MgYSBGaWxlIHRvIHVzZSBhIGRpZmZlcmV0IHtAbGluayBGaWxlU3lzdGVtfSB0aGFuIHtAbGluayBGaWxlI2ZpbGVzeXN0ZW19LgorICAgICAqCisgICAgICogVGhlIG1haW4gY2FsbGVyIG9mIHN1Y2ggYSBtZXRob2QgYXJlIGNhc2VzIHN1Y2ggYXMgSlZNIER0ZXN0IGZ1bmN0aW9ucyB0aGF0IG5lZWQgYWNjZXNzIHRvIHRoZSBsb2dnaW5nIGZyYW13b3JrCisgICAgICogZmlsZXMsIHdoaWNoIGV4aXN0cyBvbiBpbiB7QGxpbmsgRmlsZVN5c3RlbXMjZ2V0RGVmYXVsdCgpfS4KKyAgICAgKi8KKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgRmlsZShGaWxlU3lzdGVtIGZzLCBTdHJpbmcgZmlyc3QsIFN0cmluZy4uLiBtb3JlKQorICAgIHsKKyAgICAgICAgdGhpcy5wYXRoID0gZnMuZ2V0UGF0aChmaXJzdCwgbW9yZSk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQHBhcmFtIHBhdGggdGhlIHBhdGggdG8gd3JhcAogICAgICAqLwogICAgIHB1YmxpYyBGaWxlKFBhdGggcGF0aCkKICAgICB7CiAgICAgICAgIGlmIChwYXRoICE9IG51bGwgJiYgcGF0aC5nZXRGaWxlU3lzdGVtKCkgIT0gZmlsZXN5c3RlbSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkluY29tcGF0aWJsZSBmaWxlIHN5c3RlbSIpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5jb21wYXRpYmxlIGZpbGUgc3lzdGVtOyBwYXRoIEZpbGVTeXN0ZW0gKCIgKyBwYXRoLmdldEZpbGVTeXN0ZW0oKSArICIpIGlzIG5vdCB0aGUgc2FtZSByZWZlcmVuY2UgKCIgKyBmaWxlc3lzdGVtICsgIikiKTsKIAogICAgICAgICB0aGlzLnBhdGggPSBwYXRoOwogICAgIH0KIAotCiAgICAgcHVibGljIHN0YXRpYyBQYXRoIGdldFBhdGgoU3RyaW5nIGZpcnN0LCBTdHJpbmcuLi4gbW9yZSkKICAgICB7CiAgICAgICAgIHJldHVybiBmaWxlc3lzdGVtLmdldFBhdGgoZmlyc3QsIG1vcmUpOwpAQCAtNzUzLDYgKzc2OSwxMyBAQAogICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbVBsdXModGhpcyk7CiAgICAgfQogCisgICAgcHVibGljIEZpbGUgd2l0aFN1ZmZpeChTdHJpbmcgc3VmZml4KQorICAgIHsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBzdWZmaXggYW4gZW1wdHkgcGF0aCIpOworICAgICAgICByZXR1cm4gbmV3IEZpbGUocGF0aC5nZXRQYXJlbnQoKS5yZXNvbHZlKHBhdGguZ2V0RmlsZU5hbWUoKS50b1N0cmluZygpICsgc3VmZml4KSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBQYXRoIHRvUGF0aEZvcldyaXRlKCkKICAgICB7CiAgICAgICAgIGlmIChwYXRoID09IG51bGwpCkBAIC03NjcsNiArNzkwLDEyIEBACiAgICAgICAgIHJldHVybiBwYXRoOwogICAgIH0KIAorICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgRmlsZVN5c3RlbSB1bnNhZmVHZXRGaWxlc3lzdGVtKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmaWxlc3lzdGVtOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bnNhZmVTZXRGaWxlc3lzdGVtKEZpbGVTeXN0ZW0gZnMpCiAgICAgewogICAgICAgICBmaWxlc3lzdGVtID0gZnM7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGVIYW5kbGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRmlsZUhhbmRsZS5qYXZhCmluZGV4IDZiYWI0NjAuLjVjNGJkNzIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRmlsZUhhbmRsZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRmlsZUhhbmRsZS5qYXZhCkBAIC0xNywzMSArMTcsMjkgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOwogCi1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5SYXRlTGltaXRlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQ2h1bmtDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkJ1ZmZlclR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQ29tcHJlc3Npb25NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5OYXRpdmVMaWJyYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWY7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWZDb3VudGVkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuU2hhcmVkQ2xvc2VhYmxlSW1wbDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzLm1heWJlRmFpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwotCiAvKioKICAqIHtAbGluayBGaWxlSGFuZGxlfSBwcm92aWRlcyBhY2Nlc3MgdG8gYSBmaWxlIGZvciByZWFkaW5nLCBpbmNsdWRpbmcgdGhlIG9uZXMgd3JpdHRlbiBieSB2YXJpb3VzIHtAbGluayBTZXF1ZW50aWFsV3JpdGVyfQogICogaW5zdGFuY2VzLCBhbmQgaXQgaXMgdHlwaWNhbGx5IHVzZWQgYnkge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXJ9LgotICoKKyAqIDxwPgogICogVXNlIHtAbGluayBGaWxlSGFuZGxlLkJ1aWxkZXJ9IHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSwgYW5kIGNhbGwge0BsaW5rICNjcmVhdGVSZWFkZXIoKX0gKGFuZCBpdHMgdmFyaWFudHMpIHRvCiAgKiBhY2Nlc3MgdGhlIHJlYWRlcnMgZm9yIHRoZSB1bmRlcmx5aW5nIGZpbGUuCi0gKgorICogPHA+CiAgKiBZb3UgY2FuIHVzZSB7QGxpbmsgQnVpbGRlciNjb21wbGV0ZSgpfSBzZXZlcmFsIHRpbWVzIGR1cmluZyBpdHMgbGlmZWN5Y2xlIHdpdGggZGlmZmVyZW50IHtAY29kZSBvdmVycmlkZUxlbmd0aH0oaS5lLiBlYXJseSBvcGVuaW5nIGZpbGUpLgogICogRm9yIHRoYXQgcmVhc29uLCB0aGUgYnVpbGRlciBrZWVwcyBhIHJlZmVyZW5jZSB0byB0aGUgZmlsZSBjaGFubmVsIGFuZCBtYWtlcyBhIGNvcHkgZm9yIGVhY2gge0BsaW5rIEJ1aWxkZXIjY29tcGxldGUoKX0gY2FsbC4KICAqIFRoZXJlZm9yZSwgaXQgaXMgaW1wb3J0YW50IHRvIGNsb3NlIHRoZSB7QGxpbmsgQnVpbGRlcn0gd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLCBhcyB3ZWxsIGFzIGFueSB7QGxpbmsgRmlsZUhhbmRsZX0KQEAgLTQ5LDggKzQ3LDYgQEAKICAqLwogcHVibGljIGNsYXNzIEZpbGVIYW5kbGUgZXh0ZW5kcyBTaGFyZWRDbG9zZWFibGVJbXBsCiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEZpbGVIYW5kbGUuY2xhc3MpOwotCiAgICAgcHVibGljIGZpbmFsIENoYW5uZWxQcm94eSBjaGFubmVsOwogCiAgICAgcHVibGljIGZpbmFsIGxvbmcgb25EaXNrTGVuZ3RoOwpAQCAtODgsOCArODQsMTMgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBAcmV0dXJuIFBhdGggdG8gdGhlIGZpbGUgdGhpcyBmYWN0b3J5IGlzIHJlZmVyZW5jaW5nCisgICAgICogQHJldHVybiBmaWxlIHRoaXMgZmFjdG9yeSBpcyByZWZlcmVuY2luZwogICAgICAqLworICAgIHB1YmxpYyBGaWxlIGZpbGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGNoYW5uZWwuZmlsZVBhdGgoKSk7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyBwYXRoKCkKICAgICB7CiAgICAgICAgIHJldHVybiBjaGFubmVsLmZpbGVQYXRoKCk7CkBAIC0xMTQsNyArMTE1LDYgQEAKICAgICBwdWJsaWMgdm9pZCBhZGRUbyhSZWYuSWRlbnRpdHlDb2xsZWN0aW9uIGlkZW50aXRpZXMpCiAgICAgewogICAgICAgICBzdXBlci5hZGRUbyhpZGVudGl0aWVzKTsKLSAgICAgICAgY29tcHJlc3Npb25NZXRhZGF0YS5pZlByZXNlbnQobWV0YWRhdGEgLT4gbWV0YWRhdGEuYWRkVG8oaWRlbnRpdGllcykpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTU1LDcgKzE1NSwxNCBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKICAgICAgICAgewotICAgICAgICAgICAgdHJ5IHsgcmVhZGVyLmNsb3NlKCk7IH0gY2F0Y2ggKFRocm93YWJsZSB0MikgeyB0LmFkZFN1cHByZXNzZWQodDIpOyB9CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdC5hZGRTdXBwcmVzc2VkKHQyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRocm93IHQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzMsMTAgKzE4MCwxMCBAQAogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5jaHVua0ZvcihiZWZvcmUpLm9mZnNldDsKICAgICAgICAgfSkub3JFbHNlKGJlZm9yZSk7Ci0gICAgICAgIE5hdGl2ZUxpYnJhcnkudHJ5U2tpcENhY2hlKGNoYW5uZWwuZ2V0RmlsZURlc2NyaXB0b3IoKSwgMCwgcG9zaXRpb24sIHBhdGgoKSk7CisgICAgICAgIE5hdGl2ZUxpYnJhcnkudHJ5U2tpcENhY2hlKGNoYW5uZWwuZ2V0RmlsZURlc2NyaXB0b3IoKSwgMCwgcG9zaXRpb24sIGZpbGUoKS5hYnNvbHV0ZVBhdGgoKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBSZWJ1ZmZlcmVyIGluc3RhbnRpYXRlUmVidWZmZXJlcihSYXRlTGltaXRlciBsaW1pdGVyKQorICAgIHB1YmxpYyBSZWJ1ZmZlcmVyIGluc3RhbnRpYXRlUmVidWZmZXJlcihSYXRlTGltaXRlciBsaW1pdGVyKQogICAgIHsKICAgICAgICAgUmVidWZmZXJlciByZWJ1ZmZlcmVyID0gcmVidWZmZXJlckZhY3RvcnkuaW5zdGFudGlhdGVSZWJ1ZmZlcmVyKCk7CiAKQEAgLTIzOCwzNSArMjQ1LDIzIEBACiAgICAgLyoqCiAgICAgICogQ29uZmlndXJlcyBob3cgdGhlIGZpbGUgd2lsbCBiZSByZWFkIChjb21wcmVzc2VkLCBtbWFwcGVkLCB1c2UgY2FjaGUgZXRjLikKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyCiAgICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwYXRoOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgTk9fTEVOR1RIX09WRVJSSURFID0gLTE7CiAKLSAgICAgICAgcHJpdmF0ZSBDaGFubmVsUHJveHkgY2hhbm5lbDsKKyAgICAgICAgcHVibGljIGZpbmFsIEZpbGUgZmlsZTsKKwogICAgICAgICBwcml2YXRlIENvbXByZXNzaW9uTWV0YWRhdGEgY29tcHJlc3Npb25NZXRhZGF0YTsKLSAgICAgICAgcHJpdmF0ZSBNbWFwcGVkUmVnaW9ucyByZWdpb25zOwogICAgICAgICBwcml2YXRlIENodW5rQ2FjaGUgY2h1bmtDYWNoZTsKICAgICAgICAgcHJpdmF0ZSBpbnQgYnVmZmVyU2l6ZSA9IFJhbmRvbUFjY2Vzc1JlYWRlci5ERUZBVUxUX0JVRkZFUl9TSVpFOwogICAgICAgICBwcml2YXRlIEJ1ZmZlclR5cGUgYnVmZmVyVHlwZSA9IEJ1ZmZlclR5cGUuT0ZGX0hFQVA7Ci0KICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1tYXBwZWQgPSBmYWxzZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNvbXByZXNzZWQgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBsb25nIGxlbmd0aE92ZXJyaWRlID0gLTE7CisgICAgICAgIHByaXZhdGUgTW1hcHBlZFJlZ2lvbnNDYWNoZSBtbWFwcGVkUmVnaW9uc0NhY2hlOwogCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKFN0cmluZyBwYXRoKQorICAgICAgICBwdWJsaWMgQnVpbGRlcihGaWxlIGZpbGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQnVpbGRlcihDaGFubmVsUHJveHkgY2hhbm5lbCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKLSAgICAgICAgICAgIHRoaXMucGF0aCA9IGNoYW5uZWwuZmlsZVBhdGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGNvbXByZXNzZWQoYm9vbGVhbiBjb21wcmVzc2VkKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmNvbXByZXNzZWQgPSBjb21wcmVzc2VkOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwogICAgICAgICB9CiAKICAgICAgICAgLyoqCkBAIC0yODMsMTMgKzI3OCwxNSBAQAogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBQcm92aWRlIHtAbGluayBDb21wcmVzc2lvbk1ldGFkYXRhfSB0byB1c2Ugd2hlbiByZWFkaW5nIGNvbXByZXNzZWQgZmlsZS4KKyAgICAgICAgICogVXBvbiBjb21wbGV0aW9uLCBidWlsZGVyIHdpbGwgY3JlYXRlIGEgc2hhcmVkIGNvcHkgb2YgdGhpcyBvYmplY3QgYW5kIHRoYXQgY29weSB3aWxsIGJlIHVzZWQgaW4gdGhlIGNyZWF0ZWQKKyAgICAgICAgICogaW5zdGFuY2Ugb2Yge0BsaW5rIEZpbGVIYW5kbGV9LiBUaGVyZWZvcmUsIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlIGluc3RhbmNlIG9mCisgICAgICAgICAqIHtAbGluayBDb21wcmVzc2lvbk1ldGFkYXRhfSBwYXNzZWQgdG8gdGhpcyBtZXRob2QgYWZ0ZXIgYnVpbGRlciBjb21wbGV0aW9uLgogICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gbWV0YWRhdGEgQ29tcHJlc3Npb25NZXRhZGF0YSB0byB1c2UKKyAgICAgICAgICogQHBhcmFtIG1ldGFkYXRhIENvbXByZXNzaW9uTWV0YWRhdGEgdG8gdXNlLCBjYW4gYmUge0Bjb2RlIG51bGx9IGlmIG5vIGNvbXByZXNzaW9uIGlzIHVzZWQKICAgICAgICAgICogQHJldHVybiB0aGlzIG9iamVjdAogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIEJ1aWxkZXIgd2l0aENvbXByZXNzaW9uTWV0YWRhdGEoQ29tcHJlc3Npb25NZXRhZGF0YSBtZXRhZGF0YSkKICAgICAgICAgewotICAgICAgICAgICAgdGhpcy5jb21wcmVzc2VkID0gT2JqZWN0cy5ub25OdWxsKG1ldGFkYXRhKTsKICAgICAgICAgICAgIHRoaXMuY29tcHJlc3Npb25NZXRhZGF0YSA9IG1ldGFkYXRhOwogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KQEAgLTMwNiw2ICszMDMsMTggQEAKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgbW1hcHBlZChDb25maWcuRGlza0FjY2Vzc01vZGUgZGlza0FjY2Vzc01vZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubW1hcHBlZCA9IGRpc2tBY2Nlc3NNb2RlID09IENvbmZpZy5EaXNrQWNjZXNzTW9kZS5tbWFwOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciB3aXRoTW1hcHBlZFJlZ2lvbnNDYWNoZShNbWFwcGVkUmVnaW9uc0NhY2hlIG1tYXBwZWRSZWdpb25zQ2FjaGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubW1hcHBlZFJlZ2lvbnNDYWNoZSA9IG1tYXBwZWRSZWdpb25zQ2FjaGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCiAgICAgICAgIC8qKgogICAgICAgICAgKiBTZXQgdGhlIGJ1ZmZlciBzaXplIHRvIHVzZSAoaWYgYXBwcm9wcmlhdGUpLgogICAgICAgICAgKgpAQCAtMzMxLDEyOCArMzQwLDk3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogQ29tcGxldGUgYnVpbGRpbmcge0BsaW5rIEZpbGVIYW5kbGV9IHdpdGhvdXQgb3ZlcnJpZGluZyBmaWxlIGxlbmd0aC4KKyAgICAgICAgICogT3ZlcnJpZGUgdGhlIGZpbGUgbGVuZ3RoLgogICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNjb21wbGV0ZShsb25nKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEZpbGVIYW5kbGUgY29tcGxldGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcGxldGUoLTFMKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb21wbGV0ZSBidWlsZGluZyB7QGxpbmsgRmlsZUhhbmRsZX0gd2l0aCB0aGUgZ2l2ZW4gbGVuZ3RoLCB3aGljaCBvdmVycmlkZXMgdGhlIGZpbGUgbGVuZ3RoLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gb3ZlcnJpZGVMZW5ndGggT3ZlcnJpZGUgZmlsZSBsZW5ndGggKGluIGJ5dGVzKSBzbyB0aGF0IHJlYWQgY2Fubm90IGdvIGZ1cnRoZXIgdGhhbiB0aGlzIHZhbHVlLgorICAgICAgICAgKiBAcGFyYW0gbGVuZ3RoT3ZlcnJpZGUgT3ZlcnJpZGUgZmlsZSBsZW5ndGggKGluIGJ5dGVzKSBzbyB0aGF0IHJlYWQgY2Fubm90IGdvIGZ1cnRoZXIgdGhhbiB0aGlzIHZhbHVlLgogICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAwLCB0aGVuIHRoZSB2YWx1ZSBpcyBpZ25vcmVkLgogICAgICAgICAgKiBAcmV0dXJuIEJ1aWx0IGZpbGUKICAgICAgICAgICovCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgICAgIHB1YmxpYyBGaWxlSGFuZGxlIGNvbXBsZXRlKGxvbmcgb3ZlcnJpZGVMZW5ndGgpCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHdpdGhMZW5ndGhPdmVycmlkZShsb25nIGxlbmd0aE92ZXJyaWRlKQogICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGNoYW5uZWxPcGVuZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChjaGFubmVsID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkocGF0aCk7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbE9wZW5lZCA9IHRydWU7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmxlbmd0aE92ZXJyaWRlID0gbGVuZ3RoT3ZlcnJpZGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBDaGFubmVsUHJveHkgY2hhbm5lbENvcHkgPSBjaGFubmVsLnNoYXJlZENvcHkoKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbXBsZXRlIGJ1aWxkaW5nIHtAbGluayBGaWxlSGFuZGxlfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBGaWxlSGFuZGxlIGNvbXBsZXRlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlKENoYW5uZWxQcm94eTo6bmV3KTsKKyAgICAgICAgfQorCisgICAgICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQorICAgICAgICBwdWJsaWMgRmlsZUhhbmRsZSBjb21wbGV0ZShGdW5jdGlvbjxGaWxlLCBDaGFubmVsUHJveHk+IGNoYW5uZWxQcm94eUZhY3RvcnkpCisgICAgICAgIHsKKyAgICAgICAgICAgIENoYW5uZWxQcm94eSBjaGFubmVsID0gbnVsbDsKKyAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBudWxsOworICAgICAgICAgICAgQ29tcHJlc3Npb25NZXRhZGF0YSBjb21wcmVzc2lvbk1ldGFkYXRhID0gbnVsbDsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjb21wcmVzc2VkICYmIGNvbXByZXNzaW9uTWV0YWRhdGEgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25NZXRhZGF0YSA9IENvbXByZXNzaW9uTWV0YWRhdGEuY3JlYXRlKGNoYW5uZWxDb3B5LmZpbGVQYXRoKCkpOworICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uTWV0YWRhdGEgPSB0aGlzLmNvbXByZXNzaW9uTWV0YWRhdGEgIT0gbnVsbCA/IHRoaXMuY29tcHJlc3Npb25NZXRhZGF0YS5zaGFyZWRDb3B5KCkgOiBudWxsOworICAgICAgICAgICAgICAgIGNoYW5uZWwgPSBjaGFubmVsUHJveHlGYWN0b3J5LmFwcGx5KGZpbGUpOwogCi0gICAgICAgICAgICAgICAgbG9uZyBsZW5ndGggPSBvdmVycmlkZUxlbmd0aCA+IDAgPyBvdmVycmlkZUxlbmd0aCA6IGNvbXByZXNzZWQgPyBjb21wcmVzc2lvbk1ldGFkYXRhLmNvbXByZXNzZWRGaWxlTGVuZ3RoIDogY2hhbm5lbENvcHkuc2l6ZSgpOworICAgICAgICAgICAgICAgIGxvbmcgZmlsZUxlbmd0aCA9IChjb21wcmVzc2lvbk1ldGFkYXRhICE9IG51bGwpID8gY29tcHJlc3Npb25NZXRhZGF0YS5jb21wcmVzc2VkRmlsZUxlbmd0aCA6IGNoYW5uZWwuc2l6ZSgpOworICAgICAgICAgICAgICAgIGxvbmcgbGVuZ3RoID0gbGVuZ3RoT3ZlcnJpZGUgPiAwID8gbGVuZ3RoT3ZlcnJpZGUgOiBmaWxlTGVuZ3RoOwogCiAgICAgICAgICAgICAgICAgUmVidWZmZXJlckZhY3RvcnkgcmVidWZmZXJlckZhY3Rvcnk7Ci0gICAgICAgICAgICAgICAgaWYgKG1tYXBwZWQpCisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXByZXNzZWQpCisgICAgICAgICAgICAgICAgICAgIHJlYnVmZmVyZXJGYWN0b3J5ID0gbmV3IEVtcHR5UmVidWZmZXJlcihjaGFubmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobW1hcHBlZCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wcmVzc2lvbk1ldGFkYXRhICE9IG51bGwpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5tYXAoY2hhbm5lbENvcHksIGNvbXByZXNzaW9uTWV0YWRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVidWZmZXJlckZhY3RvcnkgPSBtYXliZUNhY2hlZChuZXcgQ29tcHJlc3NlZENodW5rUmVhZGVyLk1tYXAoY2hhbm5lbENvcHksIGNvbXByZXNzaW9uTWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25zKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25zID0gbW1hcHBlZFJlZ2lvbnNDYWNoZSAhPSBudWxsID8gbW1hcHBlZFJlZ2lvbnNDYWNoZS5nZXRPckNyZWF0ZShjaGFubmVsLCBjb21wcmVzc2lvbk1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1tYXBwZWRSZWdpb25zLm1hcChjaGFubmVsLCBjb21wcmVzc2lvbk1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVmZmVyZXJGYWN0b3J5ID0gbWF5YmVDYWNoZWQobmV3IENvbXByZXNzZWRDaHVua1JlYWRlci5NbWFwKGNoYW5uZWwsIGNvbXByZXNzaW9uTWV0YWRhdGEsIHJlZ2lvbnMpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJlZ2lvbnMoY2hhbm5lbENvcHksIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWJ1ZmZlcmVyRmFjdG9yeSA9IG5ldyBNbWFwUmVidWZmZXJlcihjaGFubmVsQ29weSwgbGVuZ3RoLCByZWdpb25zLnNoYXJlZENvcHkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25zID0gbW1hcHBlZFJlZ2lvbnNDYWNoZSAhPSBudWxsID8gbW1hcHBlZFJlZ2lvbnNDYWNoZS5nZXRPckNyZWF0ZShjaGFubmVsLCBsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTW1hcHBlZFJlZ2lvbnMubWFwKGNoYW5uZWwsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWJ1ZmZlcmVyRmFjdG9yeSA9IG5ldyBNbWFwUmVidWZmZXJlcihjaGFubmVsLCBsZW5ndGgsIHJlZ2lvbnMpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlZ2lvbnMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcHJlc3NlZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uTWV0YWRhdGEgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVidWZmZXJlckZhY3RvcnkgPSBtYXliZUNhY2hlZChuZXcgQ29tcHJlc3NlZENodW5rUmVhZGVyLlN0YW5kYXJkKGNoYW5uZWxDb3B5LCBjb21wcmVzc2lvbk1ldGFkYXRhKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWJ1ZmZlcmVyRmFjdG9yeSA9IG1heWJlQ2FjaGVkKG5ldyBDb21wcmVzc2VkQ2h1bmtSZWFkZXIuU3RhbmRhcmQoY2hhbm5lbCwgY29tcHJlc3Npb25NZXRhZGF0YSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNodW5rU2l6ZSA9IERpc2tPcHRpbWl6YXRpb25TdHJhdGVneS5yb3VuZEZvckNhY2hpbmcoYnVmZmVyU2l6ZSwgQ2h1bmtDYWNoZS5yb3VuZFVwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYnVmZmVyZXJGYWN0b3J5ID0gbWF5YmVDYWNoZWQobmV3IFNpbXBsZUNodW5rUmVhZGVyKGNoYW5uZWxDb3B5LCBsZW5ndGgsIGJ1ZmZlclR5cGUsIGNodW5rU2l6ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVidWZmZXJlckZhY3RvcnkgPSBtYXliZUNhY2hlZChuZXcgU2ltcGxlQ2h1bmtSZWFkZXIoY2hhbm5lbCwgbGVuZ3RoLCBidWZmZXJUeXBlLCBjaHVua1NpemUpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBDbGVhbnVwIGNsZWFudXAgPSBuZXcgQ2xlYW51cChjaGFubmVsQ29weSwgcmVidWZmZXJlckZhY3RvcnksIGNvbXByZXNzaW9uTWV0YWRhdGEsIGNodW5rQ2FjaGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmlsZUhhbmRsZShjbGVhbnVwLCBjaGFubmVsQ29weSwgcmVidWZmZXJlckZhY3RvcnksIGNvbXByZXNzaW9uTWV0YWRhdGEsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgQ2xlYW51cCBjbGVhbnVwID0gbmV3IENsZWFudXAoY2hhbm5lbCwgcmVidWZmZXJlckZhY3RvcnksIGNvbXByZXNzaW9uTWV0YWRhdGEsIGNodW5rQ2FjaGUpOworCisgICAgICAgICAgICAgICAgRmlsZUhhbmRsZSBmaWxlSGFuZGxlID0gbmV3IEZpbGVIYW5kbGUoY2xlYW51cCwgY2hhbm5lbCwgcmVidWZmZXJlckZhY3RvcnksIGNvbXByZXNzaW9uTWV0YWRhdGEsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVIYW5kbGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbENvcHkuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbE9wZW5lZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENoYW5uZWxQcm94eSBjID0gY2hhbm5lbDsKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMuY2xlYW5lZChjLmNsb3NlKHQpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgVGhyb3dhYmxlcy5jbG9zZU5vbk51bGxBbmRBZGRTdXBwcmVzc2VkKHQsIHJlZ2lvbnMsIGNoYW5uZWwsIGNvbXByZXNzaW9uTWV0YWRhdGEpOwogICAgICAgICAgICAgICAgIHRocm93IHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgVGhyb3dhYmxlIGNsb3NlKFRocm93YWJsZSBhY2N1bXVsYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWNvbXByZXNzZWQgJiYgcmVnaW9ucyAhPSBudWxsKQotICAgICAgICAgICAgICAgIGFjY3VtdWxhdGUgPSByZWdpb25zLmNsb3NlKGFjY3VtdWxhdGUpOwotICAgICAgICAgICAgaWYgKGNoYW5uZWwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXR1cm4gY2hhbm5lbC5jbG9zZShhY2N1bXVsYXRlKTsKLQotICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heWJlRmFpbChjbG9zZShudWxsKSk7Ci0gICAgICAgIH0KLQogICAgICAgICBwcml2YXRlIFJlYnVmZmVyZXJGYWN0b3J5IG1heWJlQ2FjaGVkKENodW5rUmVhZGVyIHJlYWRlcikKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGNodW5rQ2FjaGUgIT0gbnVsbCAmJiBjaHVua0NhY2hlLmNhcGFjaXR5KCkgPiAwKQotICAgICAgICAgICAgICAgIHJldHVybiBjaHVua0NhY2hlLm1heWJlV3JhcChyZWFkZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBjaHVua0NhY2hlLndyYXAocmVhZGVyKTsKICAgICAgICAgICAgIHJldHVybiByZWFkZXI7CiAgICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlUmVnaW9ucyhDaGFubmVsUHJveHkgY2hhbm5lbCwgbG9uZyBsZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChyZWdpb25zICE9IG51bGwgJiYgIXJlZ2lvbnMuaXNWYWxpZChjaGFubmVsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUaHJvd2FibGUgZXJyID0gcmVnaW9ucy5jbG9zZShudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIGNsb3NlIG1hcHBlZCByZWdpb25zIiwgZXJyKTsKLQotICAgICAgICAgICAgICAgIHJlZ2lvbnMgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocmVnaW9ucyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5tYXAoY2hhbm5lbCwgbGVuZ3RoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZWdpb25zLmV4dGVuZChsZW5ndGgpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgewotICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiKHBhdGg9JyIgKyBwYXRoKCkgKyAnXCcnICsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIihwYXRoPSciICsgZmlsZSgpICsgJ1wnJyArCiAgICAgICAgICAgICAgICAiLCBsZW5ndGg9IiArIHJlYnVmZmVyZXJGYWN0b3J5LmZpbGVMZW5ndGgoKSArCiAgICAgICAgICAgICAgICAnKSc7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9GaWxlSW5wdXRTdHJlYW1QbHVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGVJbnB1dFN0cmVhbVBsdXMuamF2YQppbmRleCA3OWU4NDM4Li4yYmQ1N2E5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGVJbnB1dFN0cmVhbVBsdXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGVJbnB1dFN0cmVhbVBsdXMuamF2YQpAQCAtMjcsMzcgKzI3LDI5IEBACiBwdWJsaWMgY2xhc3MgRmlsZUlucHV0U3RyZWFtUGx1cyBleHRlbmRzIFJlYnVmZmVyaW5nSW5wdXRTdHJlYW0KIHsKICAgICBmaW5hbCBGaWxlQ2hhbm5lbCBjaGFubmVsOworICAgIHB1YmxpYyBmaW5hbCBGaWxlIGZpbGU7CiAKICAgICBwdWJsaWMgRmlsZUlucHV0U3RyZWFtUGx1cyhTdHJpbmcgZmlsZSkgdGhyb3dzIE5vU3VjaEZpbGVFeGNlcHRpb24KICAgICB7CiAgICAgICAgIHRoaXMobmV3IEZpbGUoZmlsZSkpOwogICAgIH0KIAotICAgIHB1YmxpYyBGaWxlSW5wdXRTdHJlYW1QbHVzKEZpbGUgZmlsZSkgdGhyb3dzIE5vU3VjaEZpbGVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRoaXMoZmlsZS5uZXdSZWFkQ2hhbm5lbCgpKTsKLSAgICB9Ci0KICAgICBwdWJsaWMgRmlsZUlucHV0U3RyZWFtUGx1cyhQYXRoIHBhdGgpIHRocm93cyBOb1N1Y2hGaWxlRXhjZXB0aW9uCiAgICAgewotICAgICAgICB0aGlzKFBhdGhVdGlscy5uZXdSZWFkQ2hhbm5lbChwYXRoKSk7CisgICAgICAgIHRoaXMobmV3IEZpbGUocGF0aCkpOwogICAgIH0KIAotICAgIHB1YmxpYyBGaWxlSW5wdXRTdHJlYW1QbHVzKFBhdGggcGF0aCwgaW50IGJ1ZmZlclNpemUpIHRocm93cyBOb1N1Y2hGaWxlRXhjZXB0aW9uCisgICAgcHVibGljIEZpbGVJbnB1dFN0cmVhbVBsdXMoRmlsZSBmaWxlKSB0aHJvd3MgTm9TdWNoRmlsZUV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgdGhpcyhQYXRoVXRpbHMubmV3UmVhZENoYW5uZWwocGF0aCksIGJ1ZmZlclNpemUpOworICAgICAgICB0aGlzKGZpbGUsIDEgPDwgMTQpOwogICAgIH0KIAotICAgIHByaXZhdGUgRmlsZUlucHV0U3RyZWFtUGx1cyhGaWxlQ2hhbm5lbCBjaGFubmVsKQotICAgIHsKLSAgICAgICAgdGhpcyhjaGFubmVsLCAxIDw8IDE0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGVJbnB1dFN0cmVhbVBsdXMoRmlsZUNoYW5uZWwgY2hhbm5lbCwgaW50IGJ1ZmZlclNpemUpCisgICAgcHVibGljIEZpbGVJbnB1dFN0cmVhbVBsdXMoRmlsZSBmaWxlLCBpbnQgYnVmZmVyU2l6ZSkgdGhyb3dzIE5vU3VjaEZpbGVFeGNlcHRpb24KICAgICB7CiAgICAgICAgIHN1cGVyKEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoYnVmZmVyU2l6ZSkpOwotICAgICAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsOworICAgICAgICB0aGlzLmNoYW5uZWwgPSBmaWxlLm5ld1JlYWRDaGFubmVsKCk7CiAgICAgICAgIHRoaXMuYnVmZmVyLmxpbWl0KDApOworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9GaWxlU3RvcmVVdGlscy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9GaWxlU3RvcmVVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDU1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGVTdG9yZVV0aWxzLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTdG9yZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKK3B1YmxpYyBjbGFzcyBGaWxlU3RvcmVVdGlscworeworICAgIC8qKgorICAgICAqIFRyeSBhbmQgZ2V0IHRoZSB0b3RhbCBzcGFjZSBvZiB0aGUgZ2l2ZW4gZmlsZXN0b3JlCisgICAgICogQHJldHVybiBsb25nIHZhbHVlIG9mIGF2YWlsYWJsZSBzcGFjZSBpZiBubyBlcnJvcnMKKyAgICAgKiAgICAgICAgIExvbmcuTUFYX1ZBTFVFIGlmIG9uIGEgbGFyZ2UgZmlsZSBzeXN0ZW0gdGhhdCBvdmVyZmxvd3MKKyAgICAgKiAgICAgICAgIDAgb24gZXhjZXB0aW9uIGR1cmluZyBJT1RvTG9uZ0Z1bmN0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIHRyeUdldFNwYWNlKEZpbGVTdG9yZSBmaWxlc3RvcmUsIFBhdGhVdGlscy5JT1RvTG9uZ0Z1bmN0aW9uPEZpbGVTdG9yZT4gZ2V0U3BhY2UpCisgICAgeworICAgICAgICByZXR1cm4gdHJ5R2V0U3BhY2UoZmlsZXN0b3JlLCBnZXRTcGFjZSwgaWdub3JlIC0+IHt9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgdHJ5R2V0U3BhY2UoRmlsZVN0b3JlIGZpbGVzdG9yZSwgUGF0aFV0aWxzLklPVG9Mb25nRnVuY3Rpb248RmlsZVN0b3JlPiBnZXRTcGFjZSwgQ29uc3VtZXI8SU9FeGNlcHRpb24+IG9yRWxzZSkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlTGFyZ2VGaWxlU3lzdGVtKGdldFNwYWNlLmFwcGx5KGZpbGVzdG9yZSkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBvckVsc2UuYWNjZXB0KGUpOworICAgICAgICAgICAgcmV0dXJuIDBMOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciBhcyB0aGUgY2xhc3MgY29udGFpbnMgb25seSBzdGF0aWMgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbGVTdG9yZVV0aWxzKCkKKyAgICB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFuZGxlIGxhcmdlIGZpbGUgc3lzdGVtIGJ5IHJldHVybmluZyB7QGNvZGUgTG9uZy5NQVhfVkFMVUV9IHdoZW4gdGhlIHNpemUgb3ZlcmZsb3dzLgorICAgICAqIEBwYXJhbSBzaXplIHJldHVybmVkIGJ5IHRoZSBKYXZhJ3MgRmlsZVN0b3JlIG1ldGhvZHMKKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9yIHtAY29kZSBMb25nLk1BWF9WQUxVRX0gaWYgdGhlIHNpemUgd2FzIGJpZ2dlciB0aGFuIHtAY29kZSBMb25nLk1BWF9WQUxVRX0KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIGhhbmRsZUxhcmdlRmlsZVN5c3RlbShsb25nIHNpemUpCisgICAgeworICAgICAgICByZXR1cm4gc2l6ZSA8IDAgPyBMb25nLk1BWF9WQUxVRSA6IHNpemU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9GaWxlVXRpbHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRmlsZVV0aWxzLmphdmEKaW5kZXggMDFmMWYxOC4uOWQ4ZWZjNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9GaWxlVXRpbHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGVVdGlscy5qYXZhCkBAIC01MSw5ICs1MSw4IEBACiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlJhdGVMaW1pdGVyOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKLQoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5SYXRlTGltaXRlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC02NCw3ICs2Myw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlN5bmNVdGlsOwogCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlcy5wcm9wYWdhdGU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSkFWQV9JT19UTVBESVI7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXMubWF5YmVGYWlsOwogCkBAIC0yMTAsOSArMjA4LDE0IEBACiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlSGFyZExpbmtXaXRob3V0Q29uZmlybShTdHJpbmcgZnJvbSwgU3RyaW5nIHRvKQogICAgIHsKKyAgICAgICAgY3JlYXRlSGFyZExpbmtXaXRob3V0Q29uZmlybShuZXcgRmlsZShmcm9tKSwgbmV3IEZpbGUodG8pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlSGFyZExpbmtXaXRob3V0Q29uZmlybShGaWxlIGZyb20sIEZpbGUgdG8pCisgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgY3JlYXRlSGFyZExpbmsobmV3IEZpbGUoZnJvbSksIG5ldyBGaWxlKHRvKSk7CisgICAgICAgICAgICBjcmVhdGVIYXJkTGluayhmcm9tLCB0byk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEZTV3JpdGVFcnJvciBmc2UpCiAgICAgICAgIHsKQEAgLTIyMyw5ICsyMjYsMTQgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5V2l0aE91dENvbmZpcm0oU3RyaW5nIGZyb20sIFN0cmluZyB0bykKICAgICB7CisgICAgICAgIGNvcHlXaXRoT3V0Q29uZmlybShuZXcgRmlsZShmcm9tKSwgbmV3IEZpbGUodG8pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29weVdpdGhPdXRDb25maXJtKEZpbGUgZnJvbSwgRmlsZSB0bykKKyAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlcy5jb3B5KEZpbGUuZ2V0UGF0aChmcm9tKSwgRmlsZS5nZXRQYXRoKHRvKSk7CisgICAgICAgICAgICBGaWxlcy5jb3B5KGZyb20udG9QYXRoKCksIHRvLnRvUGF0aCgpKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgICAgICAgewpAQCAtNDc4LDcgKzQ4Niw3IEBACiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZUZTRXJyb3JBbmRQcm9wYWdhdGUoRlNFcnJvciBlKQogICAgIHsKICAgICAgICAgSlZNU3RhYmlsaXR5SW5zcGVjdG9yLmluc3BlY3RUaHJvd2FibGUoZSk7Ci0gICAgICAgIHRocm93IHByb3BhZ2F0ZShlKTsKKyAgICAgICAgdGhyb3cgZTsKICAgICB9CiAKICAgICAvKioKQEAgLTc5MCw0ICs3OTgsNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvTGltaXRpbmdSZWJ1ZmZlcmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0xpbWl0aW5nUmVidWZmZXJlci5qYXZhCmluZGV4IGI1YzdmMzQuLmJjYmYyZWYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvTGltaXRpbmdSZWJ1ZmZlcmVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9MaW1pdGluZ1JlYnVmZmVyZXIuamF2YQpAQCAtMjAsMzAgKzIwLDI4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbDsKIAotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50Lk5vdFRocmVhZFNhZmU7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkludHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlJhdGVMaW1pdGVyOwogCiAvKioKICAqIFJlYnVmZmVyZXIgd3JhcHBlciB0aGF0IGFwcGxpZXMgcmF0ZSBsaW1pdGluZy4KLSAqCisgKiA8cD4KICAqIEluc3RhbnRpYXRlZCBvbmNlIHBlciBSYW5kb21BY2Nlc3NSZWFkZXIsIHRocmVhZC11bnNhZmUuCiAgKiBUaGUgaW5zdGFuY2VzIHJldXNlIHRoZW1zZWx2ZXMgYXMgdGhlIEJ1ZmZlckhvbGRlciB0byBhdm9pZCBoYXZpbmcgdG8gcmV0dXJuIGEgbmV3IG9iamVjdCBmb3IgZWFjaCByZWJ1ZmZlciBjYWxsLgorICogT25seSBvbmUgQnVmZmVySG9sZGVyIGNhbiBiZSBhY3RpdmUgYXQgYSB0aW1lLiBDYWxsaW5nIHtAbGluayAjcmVidWZmZXIobG9uZyl9IGJlZm9yZSB0aGUgcHJldmlvdXNseSBvYnRhaW5lZAorICogYnVmZmVyIGhvbGRlciBpcyByZWxlYXNlZCB3aWxsIHRocm93IHtAbGluayBBc3NlcnRpb25FcnJvcn0uCiAgKi8KLXB1YmxpYyBjbGFzcyBMaW1pdGluZ1JlYnVmZmVyZXIgaW1wbGVtZW50cyBSZWJ1ZmZlcmVyLCBSZWJ1ZmZlcmVyLkJ1ZmZlckhvbGRlcgorQE5vdFRocmVhZFNhZmUKK3B1YmxpYyBjbGFzcyBMaW1pdGluZ1JlYnVmZmVyZXIgZXh0ZW5kcyBXcmFwcGluZ1JlYnVmZmVyZXIKIHsKLSAgICBmaW5hbCBwcml2YXRlIFJlYnVmZmVyZXIgd3JhcHBlZDsKICAgICBmaW5hbCBwcml2YXRlIFJhdGVMaW1pdGVyIGxpbWl0ZXI7CiAgICAgZmluYWwgcHJpdmF0ZSBpbnQgbGltaXRRdWFudDsKIAotICAgIHByaXZhdGUgQnVmZmVySG9sZGVyIGJ1ZmZlckhvbGRlcjsKLSAgICBwcml2YXRlIEJ5dGVCdWZmZXIgYnVmZmVyOwotICAgIHByaXZhdGUgbG9uZyBvZmZzZXQ7Ci0KICAgICBwdWJsaWMgTGltaXRpbmdSZWJ1ZmZlcmVyKFJlYnVmZmVyZXIgd3JhcHBlZCwgUmF0ZUxpbWl0ZXIgbGltaXRlciwgaW50IGxpbWl0UXVhbnQpCiAgICAgewotICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOworICAgICAgICBzdXBlcih3cmFwcGVkKTsKICAgICAgICAgdGhpcy5saW1pdGVyID0gbGltaXRlcjsKICAgICAgICAgdGhpcy5saW1pdFF1YW50ID0gbGltaXRRdWFudDsKICAgICB9CkBAIC01MSw5ICs0OSw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEJ1ZmZlckhvbGRlciByZWJ1ZmZlcihsb25nIHBvc2l0aW9uKQogICAgIHsKLSAgICAgICAgYnVmZmVySG9sZGVyID0gd3JhcHBlZC5yZWJ1ZmZlcihwb3NpdGlvbik7Ci0gICAgICAgIGJ1ZmZlciA9IGJ1ZmZlckhvbGRlci5idWZmZXIoKTsKLSAgICAgICAgb2Zmc2V0ID0gYnVmZmVySG9sZGVyLm9mZnNldCgpOworICAgICAgICBzdXBlci5yZWJ1ZmZlcihwb3NpdGlvbik7CiAgICAgICAgIGludCBwb3NJbkJ1ZmZlciA9IEludHMuY2hlY2tlZENhc3QocG9zaXRpb24gLSBvZmZzZXQpOwogICAgICAgICBpbnQgcmVtYWluaW5nID0gYnVmZmVyLmxpbWl0KCkgLSBwb3NJbkJ1ZmZlcjsKICAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwKQpAQCAtNjksNTggKzY1LDggQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhbm5lbFByb3h5IGNoYW5uZWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuY2hhbm5lbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGZpbGVMZW5ndGgoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZmlsZUxlbmd0aCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBkb3VibGUgZ2V0Q3JjQ2hlY2tDaGFuY2UoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0Q3JjQ2hlY2tDaGFuY2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgewotICAgICAgICB3cmFwcGVkLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xvc2VSZWFkZXIoKQotICAgIHsKLSAgICAgICAgd3JhcHBlZC5jbG9zZVJlYWRlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgIHsKICAgICAgICAgcmV0dXJuICJMaW1pdGluZ1JlYnVmZmVyZXJbIiArIGxpbWl0ZXIgKyAiXToiICsgd3JhcHBlZDsKICAgICB9Ci0KLSAgICAvLyBCdWZmZXJIb2xkZXIgbWV0aG9kcwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ5dGVCdWZmZXIgYnVmZmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBidWZmZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgb2Zmc2V0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvZmZzZXQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpCi0gICAgewotICAgICAgICBidWZmZXJIb2xkZXIucmVsZWFzZSgpOwotICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL01tYXBwZWRSZWdpb25zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL01tYXBwZWRSZWdpb25zLmphdmEKaW5kZXggMGI3ZGQzOS4uYmU2NDY1NCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9NbWFwcGVkUmVnaW9ucy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvTW1hcHBlZFJlZ2lvbnMuamF2YQpAQCAtMzYsMTggKzM2LDI1IEBACiAKIHB1YmxpYyBjbGFzcyBNbWFwcGVkUmVnaW9ucyBleHRlbmRzIFNoYXJlZENsb3NlYWJsZUltcGwKIHsKLSAgICAvKiogSW4gYSBwZXJmZWN0IHdvcmxkLCBNQVhfU0VHTUVOVF9TSVpFIHdvdWxkIGJlIGZpbmFsLCBidXQgd2UgbmVlZCB0byB0ZXN0IHdpdGggYSBzbWFsbGVyIHNpemUgKi8KKyAgICAvKioKKyAgICAgKiBJbiBhIHBlcmZlY3Qgd29ybGQsIE1BWF9TRUdNRU5UX1NJWkUgd291bGQgYmUgZmluYWwsIGJ1dCB3ZSBuZWVkIHRvIHRlc3Qgd2l0aCBhIHNtYWxsZXIgc2l6ZQorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgaW50IE1BWF9TRUdNRU5UX1NJWkUgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKIAotICAgIC8qKiBXaGVuIHdlIG5lZWQgdG8gZ3JvdyB0aGUgYXJyYXlzLCB3ZSBhZGQgdGhpcyBudW1iZXIgb2YgcmVnaW9uIHNsb3RzICovCisgICAgLyoqCisgICAgICogV2hlbiB3ZSBuZWVkIHRvIGdyb3cgdGhlIGFycmF5cywgd2UgYWRkIHRoaXMgbnVtYmVyIG9mIHJlZ2lvbiBzbG90cworICAgICAqLwogICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVHSU9OX0FMTE9DX1NJWkUgPSAxNTsKIAotICAgIC8qKiBUaGUgb3JpZ2luYWwgc3RhdGUsIHdoaWNoIGlzIHNoYXJlZCB3aXRoIHRoZSB0aWRpZXIgYW5kCisgICAgLyoqCisgICAgICogVGhlIG9yaWdpbmFsIHN0YXRlLCB3aGljaCBpcyBzaGFyZWQgd2l0aCB0aGUgdGlkaWVyIGFuZAogICAgICAqIGNvbnRhaW5zIGFsbCB0aGUgcmVnaW9ucyBtYXBwZWQgc28gZmFyLiBJdCBhbHNvCi0gICAgICogZG9lcyB0aGUgYWN0dWFsIG1hcHBpbmcuICovCisgICAgICogZG9lcyB0aGUgYWN0dWFsIG1hcHBpbmcuCisgICAgICovCiAgICAgcHJpdmF0ZSBmaW5hbCBTdGF0ZSBzdGF0ZTsKIAotICAgIC8qKiBBIGNvcHkgb2YgdGhlIGxhdGVzdCBzdGF0ZS4gV2UgdXBkYXRlIHRoaXMgZWFjaCB0aW1lIHRoZSBvcmlnaW5hbCBzdGF0ZSBpcworICAgIC8qKgorICAgICAqIEEgY29weSBvZiB0aGUgbGF0ZXN0IHN0YXRlLiBXZSB1cGRhdGUgdGhpcyBlYWNoIHRpbWUgdGhlIG9yaWdpbmFsIHN0YXRlIGlzCiAgICAgICogdXBkYXRlZCBhbmQgd2Ugc2hhcmUgdGhpcyB3aXRoIGNvcGllcy4gSWYgd2UgYXJlIGEgY29weSwgdGhlbiB0aGlzCiAgICAgICogaXMgbnVsbC4gQ29waWVzIGNhbiBvbmx5IGFjY2VzcyBleGlzdGluZyByZWdpb25zLCB0aGV5IGNhbm5vdCBjcmVhdGUKICAgICAgKiBuZXcgb25lcy4gVGhpcyBpcyBmb3IgdGhyZWFkIHNhZmV0eSBhbmQgYmVjYXVzZSBNbWFwcGVkUmVnaW9ucyBpcwpAQCAtOTIsNyArOTksNyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEBwYXJhbSBjaGFubmVsIGZpbGUgdG8gbWFwLiB0aGUgTW1hcHBlZFJlZ2lvbnMgaW5zdGFuY2Ugd2lsbCBob2xkIHNoYXJlZCBjb3B5IG9mIGdpdmVuIGNoYW5uZWwuCisgICAgICogQHBhcmFtIGNoYW5uZWwgIGZpbGUgdG8gbWFwLiB0aGUgTW1hcHBlZFJlZ2lvbnMgaW5zdGFuY2Ugd2lsbCBob2xkIHNoYXJlZCBjb3B5IG9mIGdpdmVuIGNoYW5uZWwuCiAgICAgICogQHBhcmFtIG1ldGFkYXRhCiAgICAgICogQHJldHVybiBuZXcgaW5zdGFuY2UKICAgICAgKi8KQEAgLTEyNiw3ICsxMzMsMTIgQEAKICAgICAgICAgcmV0dXJuIGNvcHkgPT0gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBleHRlbmQobG9uZyBsZW5ndGgpCisgICAgLyoqCisgICAgICogRXh0ZW5kcyB0aGlzIGNvbGxlY3Rpb24gb2YgbW1hcHBlZCByZWdpb25zIHVwIHRvIHRoZSBwcm92aWRlZCB0b3RhbCBsZW5ndGguCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBuZXcgcmVnaW9ucyBoYXZlIGJlZW4gY3JlYXRlZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGV4dGVuZChsb25nIGxlbmd0aCkKICAgICB7CiAgICAgICAgIGlmIChsZW5ndGggPCAwKQogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGVuZ3RoIG11c3Qgbm90IGJlIG5lZ2F0aXZlIik7CkBAIC0xMzQsMTIgKzE0Niw0MSBAQAogICAgICAgICBhc3NlcnQgIWlzQ29weSgpIDogIkNvcGllcyBjYW5ub3QgYmUgZXh0ZW5kZWQiOwogCiAgICAgICAgIGlmIChsZW5ndGggPD0gc3RhdGUubGVuZ3RoKQotICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCisgICAgICAgIGludCBpbml0aWFsUmVnaW9ucyA9IHN0YXRlLmxhc3Q7CiAgICAgICAgIHVwZGF0ZVN0YXRlKGxlbmd0aCk7CiAgICAgICAgIGNvcHkgPSBuZXcgU3RhdGUoc3RhdGUpOworICAgICAgICByZXR1cm4gc3RhdGUubGFzdCA+IGluaXRpYWxSZWdpb25zOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEV4dGVuZHMgdGhpcyBjb2xsZWN0aW9uIG9mIG1tYXBwZWQgcmVnaW9ucyB1cCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkIGZpbGUgZGVzY3JpYmVkIGJ5IHRoZSBwcm92aWRlZAorICAgICAqIG1ldGFkYXRhLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgbmV3IHJlZ2lvbnMgaGF2ZSBiZWVuIGNyZWF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBleHRlbmQoQ29tcHJlc3Npb25NZXRhZGF0YSBjb21wcmVzc2lvbk1ldGFkYXRhKQorICAgIHsKKyAgICAgICAgYXNzZXJ0ICFpc0NvcHkoKSA6ICJDb3BpZXMgY2Fubm90IGJlIGV4dGVuZGVkIjsKKworICAgICAgICBpZiAoY29tcHJlc3Npb25NZXRhZGF0YS5jb21wcmVzc2VkRmlsZUxlbmd0aCA8PSBzdGF0ZS5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaW50IGluaXRpYWxSZWdpb25zID0gc3RhdGUubGFzdDsKKyAgICAgICAgaWYgKGNvbXByZXNzaW9uTWV0YWRhdGEuY29tcHJlc3NlZEZpbGVMZW5ndGggLSBzdGF0ZS5sZW5ndGggPD0gTUFYX1NFR01FTlRfU0laRSkKKyAgICAgICAgICAgIHVwZGF0ZVN0YXRlKGNvbXByZXNzaW9uTWV0YWRhdGEuY29tcHJlc3NlZEZpbGVMZW5ndGgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB1cGRhdGVTdGF0ZShjb21wcmVzc2lvbk1ldGFkYXRhKTsKKworICAgICAgICBjb3B5ID0gbmV3IFN0YXRlKHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmxhc3QgPiBpbml0aWFsUmVnaW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHN0YXRlIGJ5IGFkZGluZyB0aGUgcmVtYWluaW5nIHNlZ21lbnRzLiBJdCBzdGFydHMgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBsYXN0IHNlZ21lbnQgZW5kIHBvc2l0aW9uIGFuZAorICAgICAqIHN1YnNlcXVlbnRseSBhZGQgbmV3IHNlZ21lbnRzIHVudGlsIGFsbCBkYXRhIHVwIHRvIHRoZSBwcm92aWRlZCBsZW5ndGggYXJlIG1hcHBlZC4KKyAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3RhdGUobG9uZyBsZW5ndGgpCiAgICAgewogICAgICAgICBzdGF0ZS5sZW5ndGggPSBsZW5ndGg7CkBAIC0xNTQsOCArMTk1LDggQEAKIAogICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTdGF0ZShDb21wcmVzc2lvbk1ldGFkYXRhIG1ldGFkYXRhKQogICAgIHsKLSAgICAgICAgbG9uZyBvZmZzZXQgPSAwOwotICAgICAgICBsb25nIGxhc3RTZWdtZW50T2Zmc2V0ID0gMDsKKyAgICAgICAgbG9uZyBsYXN0U2VnbWVudE9mZnNldCA9IHN0YXRlLmdldFBvc2l0aW9uKCk7CisgICAgICAgIGxvbmcgb2Zmc2V0ID0gbWV0YWRhdGEuZ2V0RGF0YU9mZnNldEZvckNodW5rT2Zmc2V0KGxhc3RTZWdtZW50T2Zmc2V0KTsKICAgICAgICAgbG9uZyBzZWdtZW50U2l6ZSA9IDA7CiAKICAgICAgICAgd2hpbGUgKG9mZnNldCA8IG1ldGFkYXRhLmRhdGFMZW5ndGgpCkBAIC0xOTgsNyArMjM5LDcgQEAKICAgICAgICAgYXNzZXJ0ICFpc0NsZWFuZWRVcCgpIDogIkF0dGVtcHRlZCB0byB1c2UgY2xvc2VkIHJlZ2lvbiI7CiAgICAgICAgIHJldHVybiBzdGF0ZS5mbG9vcihwb3NpdGlvbik7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHZvaWQgY2xvc2VRdWlldGx5KCkKICAgICB7CiAgICAgICAgIFRocm93YWJsZSBlcnIgPSBjbG9zZShudWxsKTsKQEAgLTI0NSwxOSArMjg2LDI5IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBTdGF0ZQogICAgIHsKLSAgICAgICAgLyoqIFRoZSBmaWxlIGNoYW5uZWwgKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBmaWxlIGNoYW5uZWwKKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgZmluYWwgQ2hhbm5lbFByb3h5IGNoYW5uZWw7CiAKLSAgICAgICAgLyoqIEFuIGFycmF5IG9mIHJlZ2lvbiBidWZmZXJzLCBzeW5jaHJvbml6ZWQgd2l0aCBvZmZzZXRzICovCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBhcnJheSBvZiByZWdpb24gYnVmZmVycywgc3luY2hyb25pemVkIHdpdGggb2Zmc2V0cworICAgICAgICAgKi8KICAgICAgICAgcHJpdmF0ZSBCeXRlQnVmZmVyW10gYnVmZmVyczsKIAotICAgICAgICAvKiogQW4gYXJyYXkgb2YgcmVnaW9uIG9mZnNldHMsIHN5bmNocm9uaXplZCB3aXRoIGJ1ZmZlcnMgKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGFycmF5IG9mIHJlZ2lvbiBvZmZzZXRzLCBzeW5jaHJvbml6ZWQgd2l0aCBidWZmZXJzCisgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIGxvbmdbXSBvZmZzZXRzOwogCi0gICAgICAgIC8qKiBUaGUgbWF4aW11bSBmaWxlIGxlbmd0aCB3ZSBoYXZlIG1hcHBlZCAqLworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1heGltdW0gZmlsZSBsZW5ndGggd2UgaGF2ZSBtYXBwZWQKKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgbG9uZyBsZW5ndGg7CiAKLSAgICAgICAgLyoqIFRoZSBpbmRleCB0byB0aGUgbGFzdCByZWdpb24gYWRkZWQgKi8KKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBpbmRleCB0byB0aGUgbGFzdCByZWdpb24gYWRkZWQKKyAgICAgICAgICovCiAgICAgICAgIHByaXZhdGUgaW50IGxhc3Q7CiAKICAgICAgICAgcHJpdmF0ZSBTdGF0ZShDaGFubmVsUHJveHkgY2hhbm5lbCkKQEAgLTI5Miw3ICszNDMsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBhc3NlcnQgMCA8PSBwb3NpdGlvbiAmJiBwb3NpdGlvbiA8PSBsZW5ndGggOiBTdHJpbmcuZm9ybWF0KCIlZCA+ICVkIiwgcG9zaXRpb24sIGxlbmd0aCk7CiAKLSAgICAgICAgICAgIGludCBpZHggPSBBcnJheXMuYmluYXJ5U2VhcmNoKG9mZnNldHMsIDAsIGxhc3QgKzEsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCBpZHggPSBBcnJheXMuYmluYXJ5U2VhcmNoKG9mZnNldHMsIDAsIGxhc3QgKyAxLCBwb3NpdGlvbik7CiAgICAgICAgICAgICBhc3NlcnQgaWR4ICE9IC0xIDogU3RyaW5nLmZvcm1hdCgiQmFkIHBvc2l0aW9uICVkIGZvciByZWdpb25zICVzLCBsYXN0ICVkIGluICVzIiwgcG9zaXRpb24sIEFycmF5cy50b1N0cmluZyhvZmZzZXRzKSwgbGFzdCwgY2hhbm5lbCk7CiAgICAgICAgICAgICBpZiAoaWR4IDwgMCkKICAgICAgICAgICAgICAgICBpZHggPSAtKGlkeCArIDIpOyAvLyByb3VuZCBkb3duIHRvIGVudHJ5IGF0IGluc2VydGlvbiBwb2ludApAQCAtMzYyLDUgKzQxMyw0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvTW1hcHBlZFJlZ2lvbnNDYWNoZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9NbWFwcGVkUmVnaW9uc0NhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2ODdhYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvTW1hcHBlZFJlZ2lvbnNDYWNoZS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uY29uY3VycmVudC5Ob3RUaHJlYWRTYWZlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQ29tcHJlc3Npb25NZXRhZGF0YTsKKworLyoqCisgKiBJdCBpcyBhIHV0aWxpdHkgY2xhc3MgZm9yIGNhY2hpbmcge0BsaW5rIE1tYXBwZWRSZWdpb25zfSBwcmltYXJpbHkgdXNlZCBieSBhIHtAbGluayBGaWxlSGFuZGxlLkJ1aWxkZXJ9IHdoZW4gYSBoYW5kbGUKKyAqIHRvIHRoZSBzYW1lIGZpbGUgaXMgY3JlYXRlZCBtdWx0aXBsZSB0aW1lcyAoYXMgd2hlbiBhbiBzc3RhYmxlIGlzIG9wZW5lZCBlYXJseSkuCisgKi8KK0BOb3RUaHJlYWRTYWZlCitwdWJsaWMgY2xhc3MgTW1hcHBlZFJlZ2lvbnNDYWNoZSBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUKK3sKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxGaWxlLCBNbWFwcGVkUmVnaW9ucz4gY2FjaGUgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogTG9va3MgZm9yIG1tYXBwZWQgcmVnaW9ucyBpbiBjYWNoZS4gSWYgZm91bmQsIGEgc2hhcmVkIGNvcHkgaXMgY3JlYXRlZCBhbmQgZXh0ZW5kZWQgdG8gdGhlIHByb3ZpZGVkIGxlbmd0aC4KKyAgICAgKiBJZiBtbWFwcGVkIHJlZ2lvbnMgZG8gbm90IGV4aXN0IHlldCBmb3IgdGhlIHByb3ZpZGVkIGtleSwgdGhleSBhcmUgY3JlYXRlZCBhbmQgYSBzaGFyZWQgY29weSBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGFubmVsIGNoYW5uZWwgZm9yIHdoaWNoIHRoZSBtbWFwcGVkIHJlZ2lvbnMgYXJlIHJlcXVlc3RlZAorICAgICAqIEBwYXJhbSBsZW5ndGggIGxlbmd0aCBvZiB0aGUgZmlsZQorICAgICAqIEByZXR1cm4gYSBzaGFyZWQgY29weSBvZiB0aGUgY2FjaGVkIG1tYXBwZWQgcmVnaW9ucworICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgcHVibGljIE1tYXBwZWRSZWdpb25zIGdldE9yQ3JlYXRlKENoYW5uZWxQcm94eSBjaGFubmVsLCBsb25nIGxlbmd0aCkKKyAgICB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZSghY2xvc2VkKTsKKyAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucyA9IGNhY2hlLmNvbXB1dGVJZkFic2VudChjaGFubmVsLmZpbGUoKSwgaWdub3JlZCAtPiBNbWFwcGVkUmVnaW9ucy5tYXAoY2hhbm5lbCwgbGVuZ3RoKSk7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChyZWdpb25zLmlzVmFsaWQoY2hhbm5lbCkpOworICAgICAgICByZWdpb25zLmV4dGVuZChsZW5ndGgpOworICAgICAgICByZXR1cm4gcmVnaW9ucy5zaGFyZWRDb3B5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9va3MgZm9yIG1tYXBwZWQgcmVnaW9ucyBpbiBjYWNoZS4gSWYgZm91bmQsIGEgc2hhcmVkIGNvcHkgaXMgY3JlYXRlZCBhbmQgZXh0ZW5kZWQgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBtZXRhZGF0YS4KKyAgICAgKiBJZiBtbWFwcGVkIHJlZ2lvbnMgZG8gbm90IGV4aXN0IHlldCBmb3IgdGhlIHByb3ZpZGVkIGtleSwgdGhleSBhcmUgY3JlYXRlZCBhbmQgYSBzaGFyZWQgY29weSBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaGFubmVsIGNoYW5uZWwgZm9yIHdoaWNoIHRoZSBtbWFwcGVkIHJlZ2lvbnMgYXJlIHJlcXVlc3RlZAorICAgICAqIEBwYXJhbSBtZXRhZGF0YSBjb21wcmVzc2lvbiBtZXRhZGF0YSBvZiB0aGUgZmlsZQorICAgICAqIEByZXR1cm4gYSBzaGFyZWQgY29weSBvZiB0aGUgY2FjaGVkIG1tYXBwZWQgcmVnaW9ucworICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgcHVibGljIE1tYXBwZWRSZWdpb25zIGdldE9yQ3JlYXRlKENoYW5uZWxQcm94eSBjaGFubmVsLCBDb21wcmVzc2lvbk1ldGFkYXRhIG1ldGFkYXRhKQorICAgIHsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlKCFjbG9zZWQpOworICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gY2FjaGUuY29tcHV0ZUlmQWJzZW50KGNoYW5uZWwuZmlsZSgpLCBpZ25vcmVkIC0+IE1tYXBwZWRSZWdpb25zLm1hcChjaGFubmVsLCBtZXRhZGF0YSkpOworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQocmVnaW9ucy5pc1ZhbGlkKGNoYW5uZWwpKTsKKyAgICAgICAgcmVnaW9ucy5leHRlbmQobWV0YWRhdGEpOworICAgICAgICByZXR1cm4gcmVnaW9ucy5zaGFyZWRDb3B5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBjbG9zZWQgPSB0cnVlOworICAgICAgICBJdGVyYXRvcjxNbWFwcGVkUmVnaW9ucz4gaXQgPSBjYWNoZS52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKQorICAgICAgICB7CisgICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb24gPSBpdC5uZXh0KCk7CisgICAgICAgICAgICByZWdpb24uY2xvc2VRdWlldGx5KCk7CisgICAgICAgICAgICBpdC5yZW1vdmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvUGFnZUF3YXJlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1BhZ2VBd2FyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYmE4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1BhZ2VBd2FyZS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworcHVibGljIGZpbmFsIGNsYXNzIFBhZ2VBd2FyZQoreworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBBR0VfU0laRSA9IDQwOTY7IC8vIG11c3QgYmUgYSBwb3dlciBvZiB0d28KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQUdFX1NJWkVfU0hJRlQgPSBJbnRlZ2VyLm51bWJlck9mVHJhaWxpbmdaZXJvcyhQQUdFX1NJWkUpOworCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBlbmQgb2YgdGhlIHBhZ2UgaWRlbnRpZmllZCBieSB0aGUgZ2l2ZW4gcG9zaXRpb24uCisgICAgICogRXF1aXZhbGVudCB0byBmbG9vcihkc3RQb3MgLyBQQUdFX1NJWkUgKyAxKSAqIFBBR0VfU0laRS4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHRoZSBhcmd1bWVudCBpcyBlcXVhbCB0byB0aGUgcGFnZSBib3VuZGFyeSwgcmV0dXJucyB0aGUgbmV4dCBwYWdlIGJvdW5kYXJ5LiBFLmcuIHBhZ2VMaW1pdCgwKSA9PSBQQUdFX1NJWkUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIHBhZ2VMaW1pdChsb25nIGRzdFBvcykKKyAgICB7CisgICAgICAgIHJldHVybiAoZHN0UG9zIHwgKFBBR0VfU0laRSAtIDEpKSArIDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBzdGFydCBvZiB0aGUgcGFnZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBwb3NpdGlvbi4KKyAgICAgKiBFcXVpdmFsZW50IHRvIGZsb29yKGRzdFBvcyAvIFBBR0VfU0laRSkgKiBQQUdFX1NJWkUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIHBhZ2VTdGFydChsb25nIGRzdFBvcykKKyAgICB7CisgICAgICAgIHJldHVybiBkc3RQb3MgJiAtUEFHRV9TSVpFOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGN1bGF0ZSB0aGUgZWFybGllc3QgcGFnZSBib3VuZGFyeSBmb3IgdGhlIGdpdmVuIHBvc2l0aW9uLgorICAgICAqIEVxdWl2YWxlbnQgdG8gY2VpbChkc3RQb3MgLyBQQUdFX1NJWkUpICogUEFHRV9TSVpFLgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhlIGFyZ3VtZW50IGlzIGVxdWFsIHRvIGEgcGFnZSBib3VuZGFyeSwgcmV0dXJucyB0aGUgYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIHBhZGRlZChsb25nIGRzdFBvcykKKyAgICB7CisgICAgICAgIHJldHVybiBwYWdlU3RhcnQoZHN0UG9zICsgUEFHRV9TSVpFIC0gMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCBpbiB0aGlzIHBhZ2UuCisgICAgICogRXF1aXZhbGVudCB0byBwYWdlTGltaXQocG9zaXRpb24pIC0gcG9zaXRpb24uCisgICAgICogPHA+CisgICAgICogV2hlbiB0aGUgYXJndW1lbnQgaXMgZXF1YWwgdG8gYSBwYWdlIGJvdW5kYXJ5LCByZXR1cm5zIFBBR0VfU0laRS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBieXRlc0xlZnRJblBhZ2UobG9uZyBkc3RQb3MpCisgICAgeworICAgICAgICByZXR1cm4gUEFHRV9TSVpFIC0gKGludCkgKGRzdFBvcyAmIChQQUdFX1NJWkUgLSAxKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgcGFnZXMgdGhhdCBmaXQgaW4gdGhlIGdpdmVuIHNpemUsIHJvdW5kZWQgdXAgdG8gYSBwYWdlIGlmIHRoZSBzaXplIGlzIG5vdCBhbiBleGFjdCBtdWx0aXBsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIHRoYXQgbmVlZHMgdG8gY292ZXIgYSBudW1iZXIgb2YgcGFnZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgcGFnZXMsIHJvdW5kZWQgdXAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBudW1QYWdlcyhpbnQgc2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiAoc2l6ZSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0laRV9TSElGVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiBhIG51bWJlciBvZiBwYWdlcywgZGV0ZXJtaW5lIHRoZSBleGFjdCBwYWdlIG51bWJlciB0aGlzCisgICAgICogcG9zaXRpb24gZmFsbHMgaW50by4gRm9yIGV4YW1wbGUsIHBvc2l0aW9ucyBmcm9tIDAgdG8ge0BsaW5rICNQQUdFX1NJWkV9IC0xIHdpbGwgZmFsbCBpbnRvIHBhZ2UgemVybworICAgICAqIGFuZCBzbyBmb3J0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkc3RQb3MgdGhlIHBvc2l0aW9uCisgICAgICogQHJldHVybiB0aGUgcGFnZSBudW1iZXIsIGluZGV4ZWQgYXQgemVybworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHBhZ2VOdW0obG9uZyBkc3RQb3MpCisgICAgeworICAgICAgICByZXR1cm4gTWF0aC50b0ludEV4YWN0KGRzdFBvcyA+PiBQQUdFX1NJWkVfU0hJRlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhZCB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbSB3aXRoIHplcm9lcyB1bnRpbCB0aGUgbmV4dCBwYWdlIGJvdW5kYXJ5LgorICAgICAqIElmIHRoZSBkZXN0aW5hdGlvbiBwb3NpdGlvbiBpcyBhbHJlYWR5IGF0IGEgcGFnZSBib3VuZGFyeSwgZG8gbm90IGRvIGFueXRoaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwYWQoRGF0YU91dHB1dFBsdXMgZGVzdCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIHBvc2l0aW9uID0gZGVzdC5wb3NpdGlvbigpOworICAgICAgICBsb25nIGJ5dGVzTGVmdCA9IHBhZGRlZChwb3NpdGlvbikgLSBwb3NpdGlvbjsKKyAgICAgICAgLy8gYnl0ZXNMZWZ0IGlzIHByb3ZhYmx5IHdpdGhpbiBbMCwgcGFnZVNpemUgLSAxXQorICAgICAgICBkZXN0LndyaXRlKEVtcHR5UGFnZS5FTVBUWV9QQUdFLCAwLCAoaW50KSBieXRlc0xlZnQpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBFbXB0eVBhZ2UKKyAgICB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBieXRlW10gRU1QVFlfUEFHRSA9IG5ldyBieXRlW1BBR0VfU0laRV07CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvUGF0aFV0aWxzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1BhdGhVdGlscy5qYXZhCmluZGV4IDRiM2VmZGIuLjAyNzc0MmYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvUGF0aFV0aWxzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9QYXRoVXRpbHMuamF2YQpAQCAtNTgsNyArNTgsNyBAQAogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgUGF0aFV0aWxzCiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBjb25zaXN0ZW50RGlyZWN0b3J5TGlzdGluZ3MgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuREVURVJNSU5JU01fQ09OU0lTVEVOVF9ESVJFQ1RPUllfTElTVElOR1MuZ2V0Qm9vbGVhbigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gY29uc2lzdGVudERpcmVjdG9yeUxpc3RpbmdzID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNPTlNJU1RFTlRfRElSRUNUT1JZX0xJU1RJTkdTLmdldEJvb2xlYW4oKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdGFuZGFyZE9wZW5PcHRpb24+IFJFQURfT1BUSU9OUyA9IHVubW9kaWZpYWJsZVNldChFbnVtU2V0Lm9mKFJFQUQpKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RhbmRhcmRPcGVuT3B0aW9uPiBXUklURV9PUFRJT05TID0gdW5tb2RpZmlhYmxlU2V0KEVudW1TZXQub2YoV1JJVEUsIENSRUFURSwgVFJVTkNBVEVfRVhJU1RJTkcpKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvUmVidWZmZXJpbmdJbnB1dFN0cmVhbS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9SZWJ1ZmZlcmluZ0lucHV0U3RyZWFtLmphdmEKaW5kZXggMThjYWJkMy4uYjdhZTIwNSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9SZWJ1ZmZlcmluZ0lucHV0U3RyZWFtLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9SZWJ1ZmZlcmluZ0lucHV0U3RyZWFtLmphdmEKQEAgLTIxLDEzICsyMSwxMyBAQAogaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKIAogaW1wb3J0IG5ldC5uaWNvdWxhai5jb21waWxlY29tbWFuZC5hbm5vdGF0aW9ucy5Eb250SW5saW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZhc3RCeXRlT3BlcmF0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy52aW50LlZJbnRDb2Rpbmc7CiAKQEAgLTM2LDEwICszNiwxMCBAQAogLyoqCiAgKiBSb3VnaCBlcXVpdmFsZW50IG9mIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYW5kIERhdGFJbnB1dFN0cmVhbSB3cmFwcGluZyBhIEJ5dGVCdWZmZXIgdGhhdCBjYW4gYmUgcmVmaWxsZWQKICAqIHZpYSByZWJ1ZmZlci4gSW1wbGVtZW50YXRpb25zIHByb3ZpZGUgdGhpcyBidWZmZXIgZnJvbSB2YXJpb3VzIGNoYW5uZWxzIChzb2NrZXQsIGZpbGUsIG1lbW9yeSwgZXRjKS4KLSAqCisgKiA8cD4KICAqIFJlYnVmZmVyaW5nSW5wdXRTdHJlYW0gaXMgbm90IHRocmVhZCBzYWZlLgogICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVidWZmZXJpbmdJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIGltcGxlbWVudHMgRGF0YUlucHV0UGx1cywgQ2xvc2VhYmxlCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVidWZmZXJpbmdJbnB1dFN0cmVhbSBleHRlbmRzIERhdGFJbnB1dFN0cmVhbVBsdXMgaW1wbGVtZW50cyBEYXRhSW5wdXRQbHVzLCBDbG9zZWFibGUKIHsKICAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBidWZmZXI7CiAKQEAgLTIzMSwxMSArMjMxLDE5IEBACiAgICAgICAgICAgICByZXR1cm4gcmVhZFByaW1pdGl2ZVNsb3dseSg4KTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyByZWFkVkludCgpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgcmV0dXJuIFZJbnRDb2RpbmcuZGVjb2RlWmlnWmFnNjQocmVhZFVuc2lnbmVkVkludCgpKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWRWSW50MzIoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBWSW50Q29kaW5nLmNoZWNrZWRDYXN0KFZJbnRDb2RpbmcuZGVjb2RlWmlnWmFnNjQocmVhZFVuc2lnbmVkVkludCgpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGxvbmcgcmVhZFVuc2lnbmVkVkludCgpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgLy9JZiA5IGJ5dGVzIGFyZW4ndCBhdmFpbGFibGUgdXNlIHRoZSBzbG93IHBhdGggaW4gVkludENvZGluZwpAQCAtMjY4LDYgKzI3NiwxMiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZFVuc2lnbmVkVkludDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gVkludENvZGluZy5jaGVja2VkQ2FzdChyZWFkVW5zaWduZWRWSW50KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmbG9hdCByZWFkRmxvYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGlmIChidWZmZXIucmVtYWluaW5nKCkgPj0gNCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvU2VxdWVudGlhbFdyaXRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9TZXF1ZW50aWFsV3JpdGVyLmphdmEKaW5kZXggNDMxZWNlMy4uY2I3MGFhYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9TZXF1ZW50aWFsV3JpdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9TZXF1ZW50aWFsV3JpdGVyLmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIHsKICAgICAvLyBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBnaXZlbiBmaWxlCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZVBhdGg7CisgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGZpbGU7CiAKICAgICAvLyBPZmZzZXQgZm9yIHN0YXJ0IG9mIGJ1ZmZlciByZWxhdGl2ZSB0byB1bmRlcmx5aW5nIGZpbGUKICAgICBwcm90ZWN0ZWQgbG9uZyBidWZmZXJPZmZzZXQ7CkBAIC04MywxNiArODQsMTkgQEAKICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIGRvUHJlcGFyZSgpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN5bmNJbnRlcm5hbCgpOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCBUaHJvd2FibGUgZG9Db21taXQoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwogICAgICAgICB9CiAKKyAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCBUaHJvd2FibGUgZG9BYm9ydChUaHJvd2FibGUgYWNjdW11bGF0ZSkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGU7CkBAIC0xNjIsMTIgKzE2NiwxMyBAQAogICAgICAgICB0aGlzLnN0cmljdEZsdXNoaW5nID0gc3RyaWN0Rmx1c2hpbmc7CiAgICAgICAgIHRoaXMuZmNoYW5uZWwgPSAoRmlsZUNoYW5uZWwpY2hhbm5lbDsKIAorICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwogICAgICAgICB0aGlzLmZpbGVQYXRoID0gZmlsZS5hYnNvbHV0ZVBhdGgoKTsKIAogICAgICAgICB0aGlzLm9wdGlvbiA9IG9wdGlvbjsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBza2lwQnl0ZXMoaW50IG51bUJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgdm9pZCBza2lwQnl0ZXMobG9uZyBudW1CeXRlcykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBmbHVzaCgpOwogICAgICAgICBmY2hhbm5lbC5wb3NpdGlvbihmY2hhbm5lbC5wb3NpdGlvbigpICsgbnVtQnl0ZXMpOwpAQCAtMjUwLDE2ICsyNTUsNDIgQEAKICAgICAgICAgICAgIHJ1blBvc3RGbHVzaC5ydW4oKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQb3NpdGlvbigpCiAgICAgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBwb3NpdGlvbigpCiAgICAgewogICAgICAgICByZXR1cm4gY3VycmVudCgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgbWF4Qnl0ZXNJblBhZ2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFBhZ2VBd2FyZS5QQUdFX1NJWkU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcGFkVG9QYWdlQm91bmRhcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFBhZ2VBd2FyZS5wYWQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBieXRlc0xlZnRJblBhZ2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFBhZ2VBd2FyZS5ieXRlc0xlZnRJblBhZ2UocG9zaXRpb24oKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgcGFkZGVkUG9zaXRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFBhZ2VBd2FyZS5wYWRkZWQocG9zaXRpb24oKSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBmaWxlIHBvaW50ZXIgb2YgdGhlIHVuZGVybHlpbmcgb24tZGlzayBmaWxlLgogICAgICAqIE5vdGUgdGhhdCBzaW5jZSB3cml0ZSB3b3JrcyBieSBidWZmZXJpbmcgZGF0YSwgdGhlIHZhbHVlIG9mIHRoaXMgd2lsbCBpbmNyZWFzZSBieSBidWZmZXIKQEAgLTI5Niw2ICszMjcsMTEgQEAKICAgICAgICAgcmV0dXJuIGZpbGVQYXRoOwogICAgIH0KIAorICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZpbGU7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIHZvaWQgcmVzZXRCdWZmZXIoKQogICAgIHsKICAgICAgICAgYnVmZmVyT2Zmc2V0ID0gY3VycmVudCgpOwpAQCAtMzczLDE2ICs0MDksMTkgQEAKICAgICAgICAgcmV0dXJuIGNoYW5uZWwuaXNPcGVuKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGZpbmFsIHZvaWQgcHJlcGFyZVRvQ29tbWl0KCkKICAgICB7CiAgICAgICAgIHR4blByb3h5LnByZXBhcmVUb0NvbW1pdCgpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBUaHJvd2FibGUgY29tbWl0KFRocm93YWJsZSBhY2N1bXVsYXRlKQogICAgIHsKICAgICAgICAgcmV0dXJuIHR4blByb3h5LmNvbW1pdChhY2N1bXVsYXRlKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgZmluYWwgVGhyb3dhYmxlIGFib3J0KFRocm93YWJsZSBhY2N1bXVsYXRlKQogICAgIHsKICAgICAgICAgcmV0dXJuIHR4blByb3h5LmFib3J0KGFjY3VtdWxhdGUpOwpAQCAtNDI4LDQgKzQ2Nyw0IEBACiAgICAgICAgICAgICB0aGlzLnBvaW50ZXIgPSBwb2ludGVyOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvU2ltcGxlQ2h1bmtSZWFkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvU2ltcGxlQ2h1bmtSZWFkZXIuamF2YQppbmRleCAwNWZkYjZiLi44ZDAwY2U1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1NpbXBsZUNodW5rUmVhZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9TaW1wbGVDaHVua1JlYWRlci5qYXZhCkBAIC01Nyw3ICs1NywxMCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBSZWJ1ZmZlcmVyIGluc3RhbnRpYXRlUmVidWZmZXJlcigpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlck1hbmFnaW5nUmVidWZmZXJlci5VbmFsaWduZWQodGhpcyk7CisgICAgICAgIGlmIChJbnRlZ2VyLmJpdENvdW50KGJ1ZmZlclNpemUpID09IDEpCisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlck1hbmFnaW5nUmVidWZmZXJlci5BbGlnbmVkKHRoaXMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlck1hbmFnaW5nUmVidWZmZXJlci5VbmFsaWduZWQodGhpcyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC02OSw0ICs3Miw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVMZW5ndGgoKSk7CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvU2l6ZWRJbnRzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1NpemVkSW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOGUxZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1NpemVkSW50cy5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2l6aW5nLCB3cml0aW5nIGFuZCByZWFkaW5nIGludHMgd2l0aCBsZW5ndGggc3RvcmVkIHNlcGFyYXRlbHkuCisgKiBVc2VkIGZvciB0cmllIHBheWxvYWRzLgorICovCitwdWJsaWMgY2xhc3MgU2l6ZWRJbnRzCit7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIG5lZWQgdG8gc3RvcmUgdGhlIGdpdmVuIHBvc2l0aW9uLgorICAgICAqIFRoaXMgbWV0aG9kIHVuZGVyc3RhbmRzIDAgdG8gbmVlZCAxIGJ5dGUuCisgICAgICogPHA+CisgICAgICogSWYgeW91ciB1c2UgY2FzZSBwZXJtaXRzIDAgdG8gYmUgZW5jb2RlZCBpbiAwIGxlbmd0aCwgdXNlIHtAbGluayAjc2l6ZUFsbG93aW5nWmVyb30gYmVsb3cuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgbm9uWmVyb1NpemUobG9uZyB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSA8IDApCisgICAgICAgICAgICB2YWx1ZSA9IH52YWx1ZTsKKyAgICAgICAgaW50IGx6ID0gTG9uZy5udW1iZXJPZkxlYWRpbmdaZXJvcyh2YWx1ZSk7ICAgICAgIC8vIDEgPD0gbHogPD0gNjQKKyAgICAgICAgcmV0dXJuICg2NCAtIGx6ICsgMSArIDcpIC8gODsgICAvLyBzaWduaWZpY2FudCBiaXRzLCArMSBmb3Igc2lnbiwgcm91bmRlZCB1cC4gQXQgbGVhc3QgMSwgYXQgbW9zdCA4LgorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3ZSBuZWVkIHRvIHN0b3JlIHRoZSBnaXZlbiBwb3NpdGlvbi4gUmV0dXJucyAwIGZvciAwIGFyZ3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHNpemVBbGxvd2luZ1plcm8obG9uZyB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBub25aZXJvU2l6ZSh2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIHJlYWQoQnl0ZUJ1ZmZlciBzcmMsIGludCBzdGFydFBvcywgaW50IGJ5dGVzKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChieXRlcykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHJldHVybiBzcmMuZ2V0KHN0YXJ0UG9zKTsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3JjLmdldFNob3J0KHN0YXJ0UG9zKTsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGhpZ2ggPSBzcmMuZ2V0KHN0YXJ0UG9zKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGhpZ2ggPDwgMTZMKSB8IChzcmMuZ2V0U2hvcnQoc3RhcnRQb3MgKyAxKSAmIDB4RkZGRkwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIHJldHVybiBzcmMuZ2V0SW50KHN0YXJ0UG9zKTsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGhpZ2ggPSBzcmMuZ2V0KHN0YXJ0UG9zKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGhpZ2ggPDwgMzJMKSB8IChzcmMuZ2V0SW50KHN0YXJ0UG9zICsgMSkgJiAweEZGRkZGRkZGTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9uZyBoaWdoID0gc3JjLmdldFNob3J0KHN0YXJ0UG9zKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGhpZ2ggPDwgMzJMKSB8IChzcmMuZ2V0SW50KHN0YXJ0UG9zICsgMikgJiAweEZGRkZGRkZGTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9uZyBoaWdoID0gc3JjLmdldChzdGFydFBvcyk7CisgICAgICAgICAgICAgICAgaGlnaCA9IChoaWdoIDw8IDE2TCkgfCAoc3JjLmdldFNob3J0KHN0YXJ0UG9zICsgMSkgJiAweEZGRkZMKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGhpZ2ggPDwgMzJMKSB8IChzcmMuZ2V0SW50KHN0YXJ0UG9zICsgMykgJiAweEZGRkZGRkZGTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNyYy5nZXRMb25nKHN0YXJ0UG9zKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgcmVhZFVuc2lnbmVkKEJ5dGVCdWZmZXIgc3JjLCBpbnQgc3RhcnRQb3MsIGludCBieXRlcykKKyAgICB7CisgICAgICAgIGlmIChieXRlcyA9PSA4KQorICAgICAgICAgICAgcmV0dXJuIHNyYy5nZXRMb25nKHN0YXJ0UG9zKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIHJlYWQoc3JjLCBzdGFydFBvcywgYnl0ZXMpICYgKCgxTCA8PCAoYnl0ZXMgKiA4KSkgLSAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGUoRGF0YU91dHB1dFBsdXMgZGVzdCwgbG9uZyB2YWx1ZSwgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZGVzdC53cml0ZU1vc3RTaWduaWZpY2FudEJ5dGVzKHZhbHVlIDw8ICgoOCAtIHNpemUpICogOCksIHNpemUpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1RhaWxPdmVycmlkaW5nUmVidWZmZXJlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9UYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmI3ZWQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9UYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLmNvbmN1cnJlbnQuTm90VGhyZWFkU2FmZTsKKworLyoqCisgKiBTcGVjaWFsIHJlYnVmZmVyZXIgdGhhdCByZXBsYWNlcyB0aGUgdGFpbCBvZiB0aGUgZmlsZSAoZnJvbSB0aGUgc3BlY2lmaWVkIGN1dG9mZiBwb2ludCkgd2l0aCB0aGUgZ2l2ZW4gYnVmZmVyLgorICogPHA+CisgKiBJbnN0YW50aWF0ZWQgb25jZSBwZXIgUmFuZG9tQWNjZXNzUmVhZGVyLCB0aHJlYWQtdW5zYWZlLgorICogVGhlIGluc3RhbmNlcyByZXVzZSB0aGVtc2VsdmVzIGFzIHRoZSBCdWZmZXJIb2xkZXIgdG8gYXZvaWQgaGF2aW5nIHRvIHJldHVybiBhIG5ldyBvYmplY3QgZm9yIGVhY2ggcmVidWZmZXIgY2FsbC4KKyAqIE9ubHkgb25lIEJ1ZmZlckhvbGRlciBjYW4gYmUgYWN0aXZlIGF0IGEgdGltZS4gQ2FsbGluZyB7QGxpbmsgI3JlYnVmZmVyKGxvbmcpfSBiZWZvcmUgdGhlIHByZXZpb3VzbHkgb2J0YWluZWQKKyAqIGJ1ZmZlciBob2xkZXIgaXMgcmVsZWFzZWQgd2lsbCB0aHJvdyB7QGxpbmsgQXNzZXJ0aW9uRXJyb3J9LgorICovCitATm90VGhyZWFkU2FmZQorcHVibGljIGNsYXNzIFRhaWxPdmVycmlkaW5nUmVidWZmZXJlciBleHRlbmRzIFdyYXBwaW5nUmVidWZmZXJlcgoreworICAgIHByaXZhdGUgZmluYWwgbG9uZyBjdXRvZmY7CisgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIHRhaWw7CisKKyAgICBwdWJsaWMgVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyKFJlYnVmZmVyZXIgc291cmNlLCBsb25nIGN1dG9mZiwgQnl0ZUJ1ZmZlciB0YWlsKQorICAgIHsKKyAgICAgICAgc3VwZXIoc291cmNlKTsKKyAgICAgICAgdGhpcy5jdXRvZmYgPSBjdXRvZmY7CisgICAgICAgIHRoaXMudGFpbCA9IHRhaWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlYnVmZmVyZXIuQnVmZmVySG9sZGVyIHJlYnVmZmVyKGxvbmcgcG9zaXRpb24pCisgICAgeworICAgICAgICBhc3NlcnQgYnVmZmVyID09IG51bGwgOiAiQnVmZmVyIGhvbGRlciBoYXMgYmVlbiBhbHJlYWR5IGFjcXVpcmVkIGFuZCBoYXMgYmVlbiBub3QgcmVsZWFzZWQgeWV0IjsKKyAgICAgICAgaWYgKHBvc2l0aW9uIDwgY3V0b2ZmKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5yZWJ1ZmZlcihwb3NpdGlvbik7CisgICAgICAgICAgICBpZiAob2Zmc2V0ICsgYnVmZmVyLmxpbWl0KCkgPiBjdXRvZmYpCisgICAgICAgICAgICAgICAgYnVmZmVyLmxpbWl0KChpbnQpIChjdXRvZmYgLSBvZmZzZXQpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IHRhaWwuZHVwbGljYXRlKCk7CisgICAgICAgICAgICBvZmZzZXQgPSBjdXRvZmY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZmlsZUxlbmd0aCgpCisgICAgeworICAgICAgICByZXR1cm4gY3V0b2ZmICsgdGFpbC5saW1pdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzWyslZEAlZF06JXMiLCBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgdGFpbC5saW1pdCgpLCBjdXRvZmYsIHdyYXBwZWQudG9TdHJpbmcoKSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvVGVlRGF0YUlucHV0UGx1cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9UZWVEYXRhSW5wdXRQbHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE2YzFjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvVGVlRGF0YUlucHV0UGx1cy5qYXZhCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CisKKy8qKgorICogRGF0YUlucHV0IHRoYXQgYWxzbyBzdG9yZXMgdGhlIHJhdyBpbnB1dHMgaW50byBhbiBvdXRwdXQgYnVmZmVyCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3Igc3RvcmluZyBzZXJpYWxpemVkIGJ1ZmZlcnMgYXMgdGhleSBhcmUgZGVzZXJpYWxpemVkLgorICoKKyAqIE5vdGU6IElmIGEgbm9uLXplcm8gbGltaXQgaXMgaW5jbHVkZWQgaXQgaXMgaW1wb3J0YW50IHRvIGZvciBjYWxsZXJzIHRvIGNoZWNrIHtAbGluayAjaXNMaW1pdFJlYWNoZWQoKX0KKyAqIGJlZm9yZSB1c2luZyB0aGUgdGVlIGJ1ZmZlciBhcyBpdCBjb3VsZCBiZSBjcm9wcGVkLgorICovCitwdWJsaWMgY2xhc3MgVGVlRGF0YUlucHV0UGx1cyBpbXBsZW1lbnRzIERhdGFJbnB1dFBsdXMKK3sKKyAgICBwcml2YXRlIGZpbmFsIERhdGFJbnB1dFBsdXMgc291cmNlOworICAgIHByaXZhdGUgZmluYWwgRGF0YU91dHB1dFBsdXMgdGVlQnVmZmVyOworCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGxpbWl0OworICAgIHByaXZhdGUgYm9vbGVhbiBsaW1pdFJlYWNoZWQ7CisKKyAgICBwdWJsaWMgVGVlRGF0YUlucHV0UGx1cyhEYXRhSW5wdXRQbHVzIHNvdXJjZSwgRGF0YU91dHB1dFBsdXMgdGVlQnVmZmVyKQorICAgIHsKKyAgICAgICAgdGhpcyhzb3VyY2UsIHRlZUJ1ZmZlciwgMCk7CisgICAgfQorCisgICAgcHVibGljIFRlZURhdGFJbnB1dFBsdXMoRGF0YUlucHV0UGx1cyBzb3VyY2UsIERhdGFPdXRwdXRQbHVzIHRlZUJ1ZmZlciwgbG9uZyBsaW1pdCkKKyAgICB7CisgICAgICAgIGFzc2VydCBzb3VyY2UgIT0gbnVsbCAmJiB0ZWVCdWZmZXIgIT0gbnVsbDsKKyAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgICAgIHRoaXMudGVlQnVmZmVyID0gdGVlQnVmZmVyOworICAgICAgICB0aGlzLmxpbWl0ID0gbGltaXQ7CisgICAgICAgIHRoaXMubGltaXRSZWFjaGVkID0gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1heWJlV3JpdGUoaW50IGxlbmd0aCwgVGhyb3dhYmxlcy5EaXNjcmV0ZUFjdGlvbjxJT0V4Y2VwdGlvbj4gd3JpdGVBY3Rpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKGxpbWl0IDw9IDAgfHwgKCFsaW1pdFJlYWNoZWQgJiYgKHRlZUJ1ZmZlci5wb3NpdGlvbigpICsgbGVuZ3RoKSA8IGxpbWl0KSkKKyAgICAgICAgICAgIHdyaXRlQWN0aW9uLnBlcmZvcm0oKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGltaXRSZWFjaGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWFkRnVsbHkoYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHNvdXJjZS5yZWFkRnVsbHkoYnl0ZXMpOworICAgICAgICBtYXliZVdyaXRlKGJ5dGVzLmxlbmd0aCwgKCkgLT4gdGVlQnVmZmVyLndyaXRlKGJ5dGVzKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVhZEZ1bGx5KGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBzb3VyY2UucmVhZEZ1bGx5KGJ5dGVzLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIG1heWJlV3JpdGUobGVuZ3RoLCAoKSAtPiB0ZWVCdWZmZXIud3JpdGUoYnl0ZXMsIG9mZnNldCwgbGVuZ3RoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBza2lwQnl0ZXMoaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGUgdiA9IHNvdXJjZS5yZWFkQnl0ZSgpOworICAgICAgICAgICAgICAgIG1heWJlV3JpdGUoVHlwZVNpemVzLkJZVEVfU0laRSwgKCkgLT4gdGVlQnVmZmVyLndyaXRlQnl0ZSh2KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRU9GRXhjZXB0aW9uIGVvZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiByZWFkQm9vbGVhbigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYm9vbGVhbiB2ID0gc291cmNlLnJlYWRCb29sZWFuKCk7CisgICAgICAgIG1heWJlV3JpdGUoVHlwZVNpemVzLkJPT0xfU0laRSwgKCkgLT4gdGVlQnVmZmVyLndyaXRlQm9vbGVhbih2KSk7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBieXRlIHJlYWRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBieXRlIHYgPSBzb3VyY2UucmVhZEJ5dGUoKTsKKyAgICAgICAgbWF5YmVXcml0ZShUeXBlU2l6ZXMuQllURV9TSVpFLCAoKSAtPiB0ZWVCdWZmZXIud3JpdGVCeXRlKHYpKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkVW5zaWduZWRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBpbnQgdiA9IHNvdXJjZS5yZWFkVW5zaWduZWRCeXRlKCk7CisgICAgICAgIG1heWJlV3JpdGUoVHlwZVNpemVzLkJZVEVfU0laRSwgKCkgLT4gdGVlQnVmZmVyLndyaXRlQnl0ZSh2KSk7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzaG9ydCByZWFkU2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHNob3J0IHYgPSBzb3VyY2UucmVhZFNob3J0KCk7CisgICAgICAgIG1heWJlV3JpdGUoVHlwZVNpemVzLlNIT1JUX1NJWkUsICgpIC0+IHRlZUJ1ZmZlci53cml0ZVNob3J0KHYpKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkVW5zaWduZWRTaG9ydCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IHYgPSBzb3VyY2UucmVhZFVuc2lnbmVkU2hvcnQoKTsKKyAgICAgICAgbWF5YmVXcml0ZShUeXBlU2l6ZXMuU0hPUlRfU0laRSwgKCkgLT4gdGVlQnVmZmVyLndyaXRlU2hvcnQodikpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgY2hhciByZWFkQ2hhcigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY2hhciB2ID0gc291cmNlLnJlYWRDaGFyKCk7CisgICAgICAgIG1heWJlV3JpdGUoVHlwZVNpemVzLkJZVEVfU0laRSwgKCkgLT4gdGVlQnVmZmVyLndyaXRlQ2hhcih2KSk7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZEludCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IHYgPSBzb3VyY2UucmVhZEludCgpOworICAgICAgICBtYXliZVdyaXRlKFR5cGVTaXplcy5JTlRfU0laRSwgKCkgLT4gdGVlQnVmZmVyLndyaXRlSW50KHYpKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgcmVhZExvbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgdiA9IHNvdXJjZS5yZWFkTG9uZygpOworICAgICAgICBtYXliZVdyaXRlKFR5cGVTaXplcy5MT05HX1NJWkUsICgpIC0+IHRlZUJ1ZmZlci53cml0ZUxvbmcodikpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmxvYXQgcmVhZEZsb2F0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBmbG9hdCB2ID0gc291cmNlLnJlYWRGbG9hdCgpOworICAgICAgICBtYXliZVdyaXRlKFR5cGVTaXplcy5GTE9BVF9TSVpFLCAoKSAtPiB0ZWVCdWZmZXIud3JpdGVGbG9hdCh2KSk7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBkb3VibGUgcmVhZERvdWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZG91YmxlIHYgPSBzb3VyY2UucmVhZERvdWJsZSgpOworICAgICAgICBtYXliZVdyaXRlKFR5cGVTaXplcy5ET1VCTEVfU0laRSwgKCkgLT4gdGVlQnVmZmVyLndyaXRlRG91YmxlKHYpKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyByZWFkTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy9UaGlzIG9uZSBpc24ndCBzYWZlIHNpbmNlIHdlIGtub3cgdGhlIGFjdHVhbCBsaW5lIHRlcm1pbmF0aW9uIHR5cGUKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyByZWFkVVRGKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmcgdiA9IHNvdXJjZS5yZWFkVVRGKCk7CisgICAgICAgIG1heWJlV3JpdGUoVHlwZVNpemVzLnNpemVvZih2KSwgKCkgLT4gdGVlQnVmZmVyLndyaXRlVVRGKHYpKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgcmVhZFZJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgdiA9IHNvdXJjZS5yZWFkVkludCgpOworICAgICAgICBtYXliZVdyaXRlKFR5cGVTaXplcy5zaXplb2ZWSW50KHYpLCAoKSAtPiB0ZWVCdWZmZXIud3JpdGVWSW50KHYpKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgcmVhZFVuc2lnbmVkVkludCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyB2ID0gc291cmNlLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgbWF5YmVXcml0ZShUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KHYpLCAoKSAtPiB0ZWVCdWZmZXIud3JpdGVVbnNpZ25lZFZJbnQodikpOworICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBza2lwQnl0ZXNGdWxseShpbnQgbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBzb3VyY2Uuc2tpcEJ5dGVzRnVsbHkobik7CisgICAgICAgIG1heWJlV3JpdGUobiwgKCkgLT4geworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgICAgICAgICAgdGVlQnVmZmVyLndyaXRlQnl0ZSgwKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBkZXRlY3QgaWYgdGhlIHRlZUJ1ZmZlciBoaXQgdGhlIHN1cHBsaWVkIGxpbWl0LgorICAgICAqIElmIHRydWUgdGhpcyBtZWFucyB0aGUgdGVlQnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gdGhlIGZ1bGwgaW5wdXQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNMaW1pdFJlYWNoZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0UmVhY2hlZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1dyYXBwaW5nUmVidWZmZXJlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9XcmFwcGluZ1JlYnVmZmVyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmJlNWVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9XcmFwcGluZ1JlYnVmZmVyZXIuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5jb25jdXJyZW50Lk5vdFRocmVhZFNhZmU7CisKKy8qKgorICogSW5zdGFudGlhdGVkIG9uY2UgcGVyIFJhbmRvbUFjY2Vzc1JlYWRlciwgdGhyZWFkLXVuc2FmZS4KKyAqIFRoZSBpbnN0YW5jZXMgcmV1c2UgdGhlbXNlbHZlcyBhcyB0aGUgQnVmZmVySG9sZGVyIHRvIGF2b2lkIGhhdmluZyB0byByZXR1cm4gYSBuZXcgb2JqZWN0IGZvciBlYWNoIHJlYnVmZmVyIGNhbGwuCisgKiBPbmx5IG9uZSBidWZmZXIgaG9sZGVyIGNhbiBiZSBhY3RpdmUgYXQgYSB0aW1lLiBDYWxsaW5nIHtAbGluayAjcmVidWZmZXIobG9uZyl9IGJlZm9yZSB0aGUgcHJldmlvdXNseSBvYnRhaW5lZAorICogYnVmZmVyIGhvbGRlciBpcyByZWxlYXNlZCB3aWxsIHRocm93IHtAbGluayBBc3NlcnRpb25FcnJvcn0uIFdlIHdpbGwgZ2V0IHRoYXQgZXhjZXB0aW9uIGFsc28gaW4gY2FzZSB3ZSB0cnkgdG8gY2xvc2UKKyAqIHRoZSByZWJ1ZmZlcmVyIHdpdGhvdXQgY2xvc2luZyB0aGUgcmVjZW50bHkgb2J0YWluZWQgYnVmZmVyIGhvbGRlci4KKyAqIDxwPgorICogQ2FsbGluZyBtZXRob2RzIG9mIHtAbGluayBCdWZmZXJIb2xkZXJ9IHdpbGwgYWxzbyBwcm9kdWNlIHtAbGluayBBc3NlcnRpb25FcnJvcn0gaWYgYnVmZmVyIGhvbGRlciBpcyBub3QgYWNxdWlyZWQuCisgKiA8cD4KKyAqIFRoZSBvdmVycmlkaW5nIGNsYXNzZXMgbXVzdCBjb25mb3JtIHRvIHRoZSBhZm9yZW1lbnRpb25lZCBydWxlcy4KKyAqLworQE5vdFRocmVhZFNhZmUKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBXcmFwcGluZ1JlYnVmZmVyZXIgaW1wbGVtZW50cyBSZWJ1ZmZlcmVyLCBSZWJ1ZmZlcmVyLkJ1ZmZlckhvbGRlcgoreworICAgIHByb3RlY3RlZCBmaW5hbCBSZWJ1ZmZlcmVyIHdyYXBwZWQ7CisKKyAgICBwcm90ZWN0ZWQgQnVmZmVySG9sZGVyIGJ1ZmZlckhvbGRlcjsKKyAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBidWZmZXI7CisgICAgcHJvdGVjdGVkIGxvbmcgb2Zmc2V0OworCisgICAgcHVibGljIFdyYXBwaW5nUmVidWZmZXJlcihSZWJ1ZmZlcmVyIHdyYXBwZWQpCisgICAgeworICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCdWZmZXJIb2xkZXIgcmVidWZmZXIobG9uZyBwb3NpdGlvbikKKyAgICB7CisgICAgICAgIGFzc2VydCBidWZmZXIgPT0gbnVsbDsKKyAgICAgICAgYnVmZmVySG9sZGVyID0gd3JhcHBlZC5yZWJ1ZmZlcihwb3NpdGlvbik7CisgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlckhvbGRlci5idWZmZXIoKTsKKyAgICAgICAgb2Zmc2V0ID0gYnVmZmVySG9sZGVyLm9mZnNldCgpOworCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDaGFubmVsUHJveHkgY2hhbm5lbCgpCisgICAgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5jaGFubmVsKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZmlsZUxlbmd0aCgpCisgICAgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5maWxlTGVuZ3RoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGRvdWJsZSBnZXRDcmNDaGVja0NoYW5jZSgpCisgICAgeworICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRDcmNDaGVja0NoYW5jZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIGFzc2VydCBidWZmZXIgPT0gbnVsbCA6ICJSZWJ1ZmZlcmVyIGlzIGF0dGVtcHRlZCB0byBiZSBjbG9zZWQgYnV0IHRoZSBidWZmZXIgaG9sZGVyIGhhcyBub3QgYmVlbiByZWxlYXNlZCI7CisgICAgICAgIHdyYXBwZWQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZVJlYWRlcigpCisgICAgeworICAgICAgICB3cmFwcGVkLmNsb3NlUmVhZGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXNbXTolcyIsIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCB3cmFwcGVkLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGJ1ZmZlcigpCisgICAgeworICAgICAgICBhc3NlcnQgYnVmZmVyICE9IG51bGwgOiAiQnVmZmVyIGhvbGRlciBoYXMgbm90IGJlZW4gYWNxdWlyZWQiOworICAgICAgICByZXR1cm4gYnVmZmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIG9mZnNldCgpCisgICAgeworICAgICAgICBhc3NlcnQgYnVmZmVyICE9IG51bGwgOiAiQnVmZmVyIGhvbGRlciBoYXMgbm90IGJlZW4gYWNxdWlyZWQiOworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IGJ1ZmZlciAhPSBudWxsOworICAgICAgICBpZiAoYnVmZmVySG9sZGVyICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZmZlckhvbGRlci5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXJIb2xkZXIgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlciA9IG51bGw7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvRHluYW1pY0VuZHBvaW50U25pdGNoLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL0R5bmFtaWNFbmRwb2ludFNuaXRjaC5qYXZhCmluZGV4IDIyNDgyNDguLjc3ZTA0ZTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvRHluYW1pY0VuZHBvaW50U25pdGNoLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9EeW5hbWljRW5kcG9pbnRTbml0Y2guamF2YQpAQCAtMjYsNiArMjYsOCBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworCiBpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuRXhwb25lbnRpYWxseURlY2F5aW5nUmVzZXJ2b2lyOwogCiBpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuU25hcHNob3Q7CkBAIC00MSwxMiArNDMsMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NQmVhbldyYXBwZXI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JR05PUkVfRFlOQU1JQ19TTklUQ0hfU0VWRVJJVFk7CisKIC8qKgogICogQSBkeW5hbWljIHNuaXRjaCB0aGF0IHNvcnRzIGVuZHBvaW50cyBieSBsYXRlbmN5IHdpdGggYW4gYWRhcHRlZCBwaGkgZmFpbHVyZSBkZXRlY3RvcgogICovCiBwdWJsaWMgY2xhc3MgRHluYW1pY0VuZHBvaW50U25pdGNoIGV4dGVuZHMgQWJzdHJhY3RFbmRwb2ludFNuaXRjaCBpbXBsZW1lbnRzIExhdGVuY3lTdWJzY3JpYmVycy5TdWJzY3JpYmVyLCBEeW5hbWljRW5kcG9pbnRTbml0Y2hNQmVhbgogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX1NFVkVSSVRZID0gIUJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLmlnbm9yZV9keW5hbWljX3NuaXRjaF9zZXZlcml0eSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX1NFVkVSSVRZID0gIUlHTk9SRV9EWU5BTUlDX1NOSVRDSF9TRVZFUklUWS5nZXRCb29sZWFuKCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgQUxQSEEgPSAwLjc1OyAvLyBzZXQgdG8gMC43NSB0byBtYWtlIEVEUyBtb3JlIGJpYXNlZCB0byB0b3dhcmRzIHRoZSBuZXdlciB2YWx1ZXMKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lORE9XX1NJWkUgPSAxMDA7CkBAIC0yMDAsNyArMjA0LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgRG91YmxlIHNjb3JlID0gc2NvcmVzLmdldChyZXBsaWNhLmVuZHBvaW50KCkpOwogICAgICAgICAgICAgaWYgKHNjb3JlID09IG51bGwpCi0gICAgICAgICAgICAgICAgc2NvcmUgPSAwLjA7CisgICAgICAgICAgICAgICAgc2NvcmUgPSBkZWZhdWx0U3RvcmUocmVwbGljYS5lbmRwb2ludCgpKTsKICAgICAgICAgICAgIHN1YnNuaXRjaE9yZGVyZWRTY29yZXMuYWRkKHNjb3JlKTsKICAgICAgICAgfQogCkBAIC0yMjQsNiArMjI4LDExIEBACiAgICAgICAgIHJldHVybiByZXBsaWNhczsKICAgICB9CiAKKyAgICBwcml2YXRlIHN0YXRpYyBkb3VibGUgZGVmYXVsdFN0b3JlKEluZXRBZGRyZXNzQW5kUG9ydCB0YXJnZXQpCisgICAgeworICAgICAgICByZXR1cm4gVVNFX1NFVkVSSVRZID8gZ2V0U2V2ZXJpdHkodGFyZ2V0KSA6IDAuMDsKKyAgICB9CisKICAgICAvLyBDb21wYXJlIGVuZHBvaW50cyBnaXZlbiBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgdGhlIHNjb3JlcwogICAgIHByaXZhdGUgaW50IGNvbXBhcmVFbmRwb2ludHMoSW5ldEFkZHJlc3NBbmRQb3J0IHRhcmdldCwgUmVwbGljYSBhMSwgUmVwbGljYSBhMiwgTWFwPEluZXRBZGRyZXNzQW5kUG9ydCwgRG91YmxlPiBzY29yZXMpCiAgICAgewpAQCAtMjMyLDEyICsyNDEsMTIgQEAKICAgICAgICAgCiAgICAgICAgIGlmIChzY29yZWQxID09IG51bGwpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHNjb3JlZDEgPSAwLjA7CisgICAgICAgICAgICBzY29yZWQxID0gZGVmYXVsdFN0b3JlKGExLmVuZHBvaW50KCkpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHNjb3JlZDIgPT0gbnVsbCkKICAgICAgICAgewotICAgICAgICAgICAgc2NvcmVkMiA9IDAuMDsKKyAgICAgICAgICAgIHNjb3JlZDIgPSBkZWZhdWx0U3RvcmUoYTIuZW5kcG9pbnQoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc2NvcmVkMS5lcXVhbHMoc2NvcmVkMikpCkBAIC0yNjksNyArMjc4LDggQEAKICAgICAgICAgc2FtcGxlLnVwZGF0ZSh1bml0LnRvTWlsbGlzKGxhdGVuY3kpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2NvcmVzKCkgLy8gdGhpcyBpcyBleHBlbnNpdmUKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVTY29yZXMoKSAvLyB0aGlzIGlzIGV4cGVuc2l2ZQogICAgIHsKICAgICAgICAgaWYgKCFTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5pc0luaXRpYWxpemVkKCkpCiAgICAgICAgICAgICByZXR1cm47CkBAIC0zNTksMTIgKzM2OSwxOSBAQAogICAgICAgICByZXR1cm4gdGltaW5nczsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShkb3VibGUgc2V2ZXJpdHkpCiAgICAgeworICAgICAgICBhZGRTZXZlcml0eShzZXZlcml0eSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFNldmVyaXR5KGRvdWJsZSBzZXZlcml0eSkKKyAgICB7CiAgICAgICAgIEdvc3NpcGVyLmluc3RhbmNlLmFkZExvY2FsQXBwbGljYXRpb25TdGF0ZShBcHBsaWNhdGlvblN0YXRlLlNFVkVSSVRZLCBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS52YWx1ZUZhY3Rvcnkuc2V2ZXJpdHkoc2V2ZXJpdHkpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGRvdWJsZSBnZXRTZXZlcml0eShJbmV0QWRkcmVzc0FuZFBvcnQgZW5kcG9pbnQpCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgcHVibGljIHN0YXRpYyBkb3VibGUgZ2V0U2V2ZXJpdHkoSW5ldEFkZHJlc3NBbmRQb3J0IGVuZHBvaW50KQogICAgIHsKICAgICAgICAgRW5kcG9pbnRTdGF0ZSBzdGF0ZSA9IEdvc3NpcGVyLmluc3RhbmNlLmdldEVuZHBvaW50U3RhdGVGb3JFbmRwb2ludChlbmRwb2ludCk7CiAgICAgICAgIGlmIChzdGF0ZSA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9JbmV0QWRkcmVzc0FuZFBvcnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvSW5ldEFkZHJlc3NBbmRQb3J0LmphdmEKaW5kZXggZTZhOTIwYi4uNzg2MjdlNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9JbmV0QWRkcmVzc0FuZFBvcnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL0luZXRBZGRyZXNzQW5kUG9ydC5qYXZhCkBAIC0yNiw3ICsyNiwxMSBAQAogaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLm5ldC5Ib3N0QW5kUG9ydDsKIApAQCAtNjQsNyArNjgsOCBAQAogCiAgICAgcHVibGljIGZpbmFsIGJ5dGVbXSBhZGRyZXNzQnl0ZXM7CiAKLSAgICBwcml2YXRlIEluZXRBZGRyZXNzQW5kUG9ydChJbmV0QWRkcmVzcyBhZGRyZXNzLCBieXRlW10gYWRkcmVzc0J5dGVzLCBpbnQgcG9ydCkKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBJbmV0QWRkcmVzc0FuZFBvcnQoSW5ldEFkZHJlc3MgYWRkcmVzcywgYnl0ZVtdIGFkZHJlc3NCeXRlcywgaW50IHBvcnQpCiAgICAgewogICAgICAgICBzdXBlcihhZGRyZXNzLCBwb3J0KTsKICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoYWRkcmVzcyk7CkBAIC0yMTUsNiArMjIwLDMxIEBACiAgICAgICAgIHJldHVybiBnZXRCeU5hbWVPdmVycmlkZURlZmF1bHRzKG5hbWUsIG51bGwpOwogICAgIH0KIAorCisgICAgcHVibGljIHN0YXRpYyBMaXN0PEluZXRBZGRyZXNzQW5kUG9ydD4gZ2V0QWxsQnlOYW1lKFN0cmluZyBuYW1lKSB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBnZXRBbGxCeU5hbWVPdmVycmlkZURlZmF1bHRzKG5hbWUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgSG9zdG5hbWUgKyBvcHRpb25hbCBwb3J0cyBzdHJpbmcKKyAgICAgKiBAcGFyYW0gcG9ydCBQb3J0IHRvIGNvbm5lY3Qgb24sIG92ZXJyaWRkZW4gYnkgdmFsdWVzIGluIGhvc3RuYW1lIHN0cmluZywgZGVmYXVsdHMgdG8gRGF0YWJhc2VEZXNjcmlwdG9yIGRlZmF1bHQgaWYgbm90IHNwZWNpZmllZCBhbnl3aGVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8SW5ldEFkZHJlc3NBbmRQb3J0PiBnZXRBbGxCeU5hbWVPdmVycmlkZURlZmF1bHRzKFN0cmluZyBuYW1lLCBJbnRlZ2VyIHBvcnQpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSG9zdEFuZFBvcnQgaGFwID0gSG9zdEFuZFBvcnQuZnJvbVN0cmluZyhuYW1lKTsKKyAgICAgICAgaWYgKGhhcC5oYXNQb3J0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcnQgPSBoYXAuZ2V0UG9ydCgpOworICAgICAgICB9CisgICAgICAgIEludGVnZXIgZmluYWxQb3J0ID0gcG9ydDsKKworICAgICAgICByZXR1cm4gU3RyZWFtLm9mKEluZXRBZGRyZXNzLmdldEFsbEJ5TmFtZShoYXAuZ2V0SG9zdCgpKSkKKyAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGFkZHJlc3MpIC0+IGdldEJ5QWRkcmVzc092ZXJyaWRlRGVmYXVsdHMoYWRkcmVzcywgZmluYWxQb3J0KSkKKyAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKwogICAgIC8qKgogICAgICAqCiAgICAgICogQHBhcmFtIG5hbWUgSG9zdG5hbWUgKyBvcHRpb25hbCBwb3J0cyBzdHJpbmcKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3kuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3kuamF2YQppbmRleCAxZDM5YmJlLi45ZDE5ODllIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9OZXR3b3JrVG9wb2xvZ3lTdHJhdGVneS5qYXZhCkBAIC0zNTAsNiArMzUwLDcgQEAKICAgICAgICAgICAgICAgICBTdHJpbmcgZGMgPSBlLmdldEtleSgpOwogICAgICAgICAgICAgICAgIFJlcGxpY2F0aW9uRmFjdG9yIHJmID0gZ2V0UmVwbGljYXRpb25GYWN0b3IoZGMpOwogICAgICAgICAgICAgICAgIEd1YXJkcmFpbHMubWluaW11bVJlcGxpY2F0aW9uRmFjdG9yLmd1YXJkKHJmLmZ1bGxSZXBsaWNhcywga2V5c3BhY2VOYW1lLCBmYWxzZSwgc3RhdGUpOworICAgICAgICAgICAgICAgIEd1YXJkcmFpbHMubWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yLmd1YXJkKHJmLmZ1bGxSZXBsaWNhcywga2V5c3BhY2VOYW1lLCBmYWxzZSwgc3RhdGUpOwogICAgICAgICAgICAgICAgIGludCBub2RlQ291bnQgPSBkY3NOb2Rlcy5nZXQoZGMpLnNpemUoKTsKICAgICAgICAgICAgICAgICAvLyBub2RlQ291bnQ9PTAgb24gbWFueSB0ZXN0cwogICAgICAgICAgICAgICAgIGlmIChyZi5mdWxsUmVwbGljYXMgPiBub2RlQ291bnQgJiYgbm9kZUNvdW50ICE9IDApCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1JlY29ubmVjdGFibGVTbml0Y2hIZWxwZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvUmVjb25uZWN0YWJsZVNuaXRjaEhlbHBlci5qYXZhCmluZGV4IGQ4Y2E5ZTQuLjllNWJhMjMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvUmVjb25uZWN0YWJsZVNuaXRjaEhlbHBlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvUmVjb25uZWN0YWJsZVNuaXRjaEhlbHBlci5qYXZhCkBAIC0zMCw2ICszMCw4IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLklJbnRlcm5vZGVBdXRoZW50aWNhdG9yLkludGVybm9kZUNvbm5lY3Rpb25EaXJlY3Rpb24uT1VUQk9VTkRfUFJFQ09OTkVDVDsKKwogLyoqCiAgKiBTaWRla2ljayBoZWxwZXIgZm9yIHNuaXRjaGVzIHRoYXQgd2FudCB0byByZWNvbm5lY3QgZnJvbSBvbmUgSVAgYWRkciBmb3IgYSBub2RlIHRvIGFub3RoZXIuCiAgKiBUeXBpY2FsbHksIHRoaXMgaXMgZm9yIHNpdHVhdGlvbnMgbGlrZSBFQzIgd2hlcmUgYSBub2RlIHdpbGwgaGF2ZSBhIHB1YmxpYyBhZGRyZXNzIGFuZCBhIHByaXZhdGUgYWRkcmVzcywKQEAgLTY0LDcgKzY2LDggQEAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBzdGF0aWMgdm9pZCByZWNvbm5lY3QoSW5ldEFkZHJlc3NBbmRQb3J0IHB1YmxpY0FkZHJlc3MsIEluZXRBZGRyZXNzQW5kUG9ydCBsb2NhbEFkZHJlc3MsIElFbmRwb2ludFNuaXRjaCBzbml0Y2gsIFN0cmluZyBsb2NhbERjKQogICAgIHsKLSAgICAgICAgaWYgKCFuZXcgT3V0Ym91bmRDb25uZWN0aW9uU2V0dGluZ3MocHVibGljQWRkcmVzcywgbG9jYWxBZGRyZXNzKS53aXRoRGVmYXVsdHMoQ29ubmVjdGlvbkNhdGVnb3J5Lk1FU1NBR0lORykuYXV0aGVudGljYXRlKCkpCisgICAgICAgIGZpbmFsIE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzIHNldHRpbmdzID0gbmV3IE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzKHB1YmxpY0FkZHJlc3MsIGxvY2FsQWRkcmVzcykud2l0aERlZmF1bHRzKENvbm5lY3Rpb25DYXRlZ29yeS5NRVNTQUdJTkcpOworICAgICAgICBpZiAoIXNldHRpbmdzLmF1dGhlbnRpY2F0b3IoKS5hdXRoZW50aWNhdGUoc2V0dGluZ3MudG8uZ2V0QWRkcmVzcygpLCBzZXR0aW5ncy50by5nZXRQb3J0KCksIG51bGwsIE9VVEJPVU5EX1BSRUNPTk5FQ1QpKQogICAgICAgICB7CiAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIkludGVybm9kZUF1dGhlbnRpY2F0b3Igc2FpZCBkb24ndCByZWNvbm5lY3QgdG8ge30gb24ge30iLCBwdWJsaWNBZGRyZXNzLCBsb2NhbEFkZHJlc3MpOwogICAgICAgICAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9SZXBsaWNhLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1JlcGxpY2EuamF2YQppbmRleCA0YzVmN2M2Li40YzU4ZTY0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1JlcGxpY2EuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1JlcGxpY2EuamF2YQpAQCAtMTkxLDYgKzE5MSw1IEBACiAgICAgewogICAgICAgICByZXR1cm4gdHJhbnNpZW50UmVwbGljYShlbmRwb2ludCwgbmV3IFJhbmdlPD4oc3RhcnQsIGVuZCkpOwogICAgIH0KLQogfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1NpbXBsZVNlZWRQcm92aWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9TaW1wbGVTZWVkUHJvdmlkZXIuamF2YQppbmRleCBmZTUwMGI0Li5iNmNjYWVjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1NpbXBsZVNlZWRQcm92aWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvU2ltcGxlU2VlZFByb3ZpZGVyLmphdmEKQEAgLTIzLDggKzIzLDEyIEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwpAQCAtMzIsOCArMzYsMTggQEAKIHB1YmxpYyBjbGFzcyBTaW1wbGVTZWVkUHJvdmlkZXIgaW1wbGVtZW50cyBTZWVkUHJvdmlkZXIKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU2ltcGxlU2VlZFByb3ZpZGVyLmNsYXNzKTsKKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUVEU19LRVkgPSAic2VlZHMiOworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09MVkVfTVVMVElQTEVfSVBfQUREUkVTU0VTX1BFUl9ETlNfUkVDT1JEX0tFWSA9ICJyZXNvbHZlX211bHRpcGxlX2lwX2FkZHJlc3Nlc19wZXJfZG5zX3JlY29yZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFRURfQ09VTlRfV0FSTl9USFJFU0hPTEQgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU0VFRF9DT1VOVF9XQVJOX1RIUkVTSE9MRC5nZXRJbnQoMjApOwogCi0gICAgcHVibGljIFNpbXBsZVNlZWRQcm92aWRlcihNYXA8U3RyaW5nLCBTdHJpbmc+IGFyZ3MpIHt9CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBkZWZhdWx0U2VlZHM7CisKKyAgICBwdWJsaWMgU2ltcGxlU2VlZFByb3ZpZGVyKE1hcDxTdHJpbmcsIFN0cmluZz4gYXJncykKKyAgICB7CisgICAgICAgIGRlZmF1bHRTZWVkcyA9IG5ldyBTdHJpbmdbXSB7IEZCVXRpbGl0aWVzLmdldExvY2FsQWRkcmVzc0FuZFBvcnQoKS5nZXRIb3N0QWRkcmVzcyh0cnVlKSB9OworICAgIH0KIAogICAgIHB1YmxpYyBMaXN0PEluZXRBZGRyZXNzQW5kUG9ydD4gZ2V0U2VlZHMoKQogICAgIHsKQEAgLTQ2LDE0ICs2MCw0NCBAQAogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZSk7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nW10gaG9zdHMgPSBjb25mLnNlZWRfcHJvdmlkZXIucGFyYW1ldGVycy5nZXQoInNlZWRzIikuc3BsaXQoIiwiLCAtMSk7CisKKyAgICAgICAgYXNzZXJ0IGNvbmYuc2VlZF9wcm92aWRlciAhPSBudWxsIDogImNvbmYuc2VlZF9wcm92aWRlciBpcyBudWxsISI7CisKKyAgICAgICAgYm9vbGVhbiByZXNvbHZlTXVsdGlwbGVJcHM7CisgICAgICAgIFN0cmluZ1tdIGhvc3RzOworCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IGNvbmYuc2VlZF9wcm92aWRlci5wYXJhbWV0ZXJzOworICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICByZXNvbHZlTXVsdGlwbGVJcHMgPSBmYWxzZTsKKyAgICAgICAgICAgIGhvc3RzID0gZGVmYXVsdFNlZWRzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaG9zdHMgPSBwYXJhbWV0ZXJzLmdldE9yRGVmYXVsdChTRUVEU19LRVksIGRlZmF1bHRTZWVkc1swXSkuc3BsaXQoIiwiLCAtMSk7CisgICAgICAgICAgICByZXNvbHZlTXVsdGlwbGVJcHMgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihwYXJhbWV0ZXJzLmdldE9yRGVmYXVsdChSRVNPTFZFX01VTFRJUExFX0lQX0FERFJFU1NFU19QRVJfRE5TX1JFQ09SRF9LRVksIEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSkpOworICAgICAgICB9CisKICAgICAgICAgTGlzdDxJbmV0QWRkcmVzc0FuZFBvcnQ+IHNlZWRzID0gbmV3IEFycmF5TGlzdDw+KGhvc3RzLmxlbmd0aCk7CisKICAgICAgICAgZm9yIChTdHJpbmcgaG9zdCA6IGhvc3RzKQogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZighaG9zdC50cmltKCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlZWRzLmFkZChJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKGhvc3QudHJpbSgpKSk7CisgICAgICAgICAgICAgICAgaWYgKCFob3N0LnRyaW0oKS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZU11bHRpcGxlSXBzKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PEluZXRBZGRyZXNzQW5kUG9ydD4gcmVzb2x2ZWRTZWVkcyA9IEluZXRBZGRyZXNzQW5kUG9ydC5nZXRBbGxCeU5hbWUoaG9zdC50cmltKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VlZHMuYWRkQWxsKHJlc29sdmVkU2VlZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJ7fSByZXNvbHZlcyB0byB7fSIsIGhvc3QsIHJlc29sdmVkU2VlZHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IGFkZHJlc3NBbmRQb3J0ID0gSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZShob3N0LnRyaW0oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWVkcy5hZGQoYWRkcmVzc0FuZFBvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJPbmx5IHJlc29sdmluZyBvbmUgSVAgcGVyIEROUyByZWNvcmQgLSB7fSByZXNvbHZlcyB0byB7fSIsIGhvc3QsIGFkZHJlc3NBbmRQb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBleCkKQEAgLTYyLDYgKzEwNiwxMiBAQAogICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJTZWVkIHByb3ZpZGVyIGNvdWxkbid0IGxvb2t1cCBob3N0IHt9IiwgaG9zdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBpZiAoc2VlZHMuc2l6ZSgpID4gU0VFRF9DT1VOVF9XQVJOX1RIUkVTSE9MRCkKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJTZWVkIHByb3ZpZGVyIHJldHVybmVkIG1vcmUgdGhhbiB7fSBzZWVkcy4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiQSBsYXJnZSBzZWVkIGxpc3QgbWF5IGltcGFjdCBlZmZlY3RpdmVuZXNzIG9mIHRoZSB0aGlyZCBnb3NzaXAgcm91bmQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFRURfQ09VTlRfV0FSTl9USFJFU0hPTEQpOworCiAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHNlZWRzKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1NpbXBsZVN0cmF0ZWd5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1NpbXBsZVN0cmF0ZWd5LmphdmEKaW5kZXggZTViOTIxMC4uNDg4YjYwMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9TaW1wbGVTdHJhdGVneS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvU2ltcGxlU3RyYXRlZ3kuamF2YQpAQCAtMTA5LDYgKzEwOSw3IEBACiAgICAgICAgICAgICBpbnQgbm9kZUNvdW50ID0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuZ2V0SG9zdElkVG9FbmRwb2ludCgpLnNpemUoKTsKICAgICAgICAgICAgIC8vIG5vZGVDb3VudD09MCBvbiBtYW55IHRlc3RzCiAgICAgICAgICAgICBHdWFyZHJhaWxzLm1pbmltdW1SZXBsaWNhdGlvbkZhY3Rvci5ndWFyZChyZi5mdWxsUmVwbGljYXMsIGtleXNwYWNlTmFtZSwgZmFsc2UsIHN0YXRlKTsKKyAgICAgICAgICAgIEd1YXJkcmFpbHMubWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yLmd1YXJkKHJmLmZ1bGxSZXBsaWNhcywga2V5c3BhY2VOYW1lLCBmYWxzZSwgc3RhdGUpOwogICAgICAgICAgICAgaWYgKHJmLmZ1bGxSZXBsaWNhcyA+IG5vZGVDb3VudCAmJiBub2RlQ291bnQgIT0gMCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gIllvdXIgcmVwbGljYXRpb24gZmFjdG9yICIgKyByZi5mdWxsUmVwbGljYXMKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvU25pdGNoUHJvcGVydGllcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9Tbml0Y2hQcm9wZXJ0aWVzLmphdmEKaW5kZXggYWZiNjgwNC4uYjBiZmU0YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9Tbml0Y2hQcm9wZXJ0aWVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9Tbml0Y2hQcm9wZXJ0aWVzLmphdmEKQEAgLTI1LDEwICsyNSwxMiBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfUkFDS0RDX1BST1BFUlRJRVM7CisKIHB1YmxpYyBjbGFzcyBTbml0Y2hQcm9wZXJ0aWVzCiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNuaXRjaFByb3BlcnRpZXMuY2xhc3MpOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBQ0tEQ19QUk9QRVJUWV9GSUxFTkFNRSA9ICJjYXNzYW5kcmEtcmFja2RjLnByb3BlcnRpZXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBQ0tEQ19QUk9QRVJUWV9GSUxFTkFNRSA9IENBU1NBTkRSQV9SQUNLRENfUFJPUEVSVElFUy5nZXRLZXkoKTsKIAogICAgIHByaXZhdGUgZmluYWwgUHJvcGVydGllcyBwcm9wZXJ0aWVzOwogCkBAIC0zNiw3ICszOCw3IEBACiAgICAgewogICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGNvbmZpZ1VSTCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShSQUNLRENfUFJPUEVSVFlfRklMRU5BTUUpOworICAgICAgICBTdHJpbmcgY29uZmlnVVJMID0gQ0FTU0FORFJBX1JBQ0tEQ19QUk9QRVJUSUVTLmdldFN0cmluZygpOwogICAgICAgICB0cnkKICAgICAgICAgewogICAgICAgICAgICAgVVJMIHVybDsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL0NsaWVudFJlcXVlc3RTaXplTWV0cmljcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZWY4N2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL0NsaWVudFJlcXVlc3RTaXplTWV0cmljcy5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuQ291bnRlcjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5yZXN0cmljdGlvbnMuU3RhdGVtZW50UmVzdHJpY3Rpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc2VsZWN0aW9uLlNlbGVjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5JTXV0YXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25VcGRhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5tZXNzYWdlcy5SZXN1bHRNZXNzYWdlOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2Fzc2FuZHJhTWV0cmljc1JlZ2lzdHJ5Lk1ldHJpY3M7CisKK3B1YmxpYyBjbGFzcyBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJDbGllbnRSZXF1ZXN0U2l6ZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvdW50ZXIgdG90YWxDb2x1bW5zUmVhZCA9IE1ldHJpY3MuY291bnRlcihEZWZhdWx0TmFtZUZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZShUWVBFLCAiQ29sdW1uc1JlYWQiLCBudWxsKSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb3VudGVyIHRvdGFsUm93c1JlYWQgPSBNZXRyaWNzLmNvdW50ZXIoRGVmYXVsdE5hbWVGYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoVFlQRSwgIlJvd3NSZWFkIiwgbnVsbCkpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ291bnRlciB0b3RhbENvbHVtbnNXcml0dGVuID0gTWV0cmljcy5jb3VudGVyKERlZmF1bHROYW1lRmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKFRZUEUsICJDb2x1bW5zV3JpdHRlbiIsIG51bGwpKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvdW50ZXIgdG90YWxSb3dzV3JpdHRlbiA9IE1ldHJpY3MuY291bnRlcihEZWZhdWx0TmFtZUZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZShUWVBFLCAiUm93c1dyaXR0ZW4iLCBudWxsKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVjb3JkUmVhZFJlc3BvbnNlTWV0cmljcyhSZXN1bHRNZXNzYWdlLlJvd3Mgcm93cywgU3RhdGVtZW50UmVzdHJpY3Rpb25zIHJlc3RyaWN0aW9ucywgU2VsZWN0aW9uIHNlbGVjdGlvbikKKyAgICB7CisgICAgICAgIGlmICghRGF0YWJhc2VEZXNjcmlwdG9yLmdldENsaWVudFJlcXVlc3RTaXplTWV0cmljc0VuYWJsZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpbnQgcm93Q291bnQgPSByb3dzLnJlc3VsdC5zaXplKCk7CisgICAgICAgIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmluYyhyb3dDb3VudCk7CisgICAgICAgIAorICAgICAgICBpbnQgbm9uUmVzdHJpY3RlZENvbHVtbnMgPSBzZWxlY3Rpb24uZ2V0Q29sdW1ucygpLnNpemUoKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgY29sdW1uIDogc2VsZWN0aW9uLmdldENvbHVtbnMoKSkKKyAgICAgICAgICAgIGlmIChyZXN0cmljdGlvbnMuaXNFcXVhbGl0eVJlc3RyaWN0ZWQoY29sdW1uKSkKKyAgICAgICAgICAgICAgICBub25SZXN0cmljdGVkQ29sdW1ucy0tOworICAgICAgICAgICAgCisgICAgICAgIGxvbmcgY29sdW1uQ291bnQgPSAobG9uZykgcm93Q291bnQgKiBub25SZXN0cmljdGVkQ29sdW1uczsKKyAgICAgICAgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1JlYWQuaW5jKGNvbHVtbkNvdW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVjb3JkUm93QW5kQ29sdW1uQ291bnRNZXRyaWNzKENvbGxlY3Rpb248PyBleHRlbmRzIElNdXRhdGlvbj4gbXV0YXRpb25zKQorICAgIHsKKyAgICAgICAgaWYgKCFEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q2xpZW50UmVxdWVzdFNpemVNZXRyaWNzRW5hYmxlZCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGludCByb3dDb3VudCA9IDA7CisgICAgICAgIGludCBjb2x1bW5Db3VudCA9IDA7CisKKyAgICAgICAgZm9yIChJTXV0YXRpb24gbXV0YXRpb24gOiBtdXRhdGlvbnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSA6IG11dGF0aW9uLmdldFBhcnRpdGlvblVwZGF0ZXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb2x1bW5Db3VudCArPSB1cGRhdGUuYWZmZWN0ZWRDb2x1bW5Db3VudCgpOworICAgICAgICAgICAgICAgIHJvd0NvdW50ICs9IHVwZGF0ZS5hZmZlY3RlZFJvd0NvdW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zV3JpdHRlbi5pbmMoY29sdW1uQ291bnQpOworICAgICAgICBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5pbmMocm93Q291bnQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWNvcmRSb3dBbmRDb2x1bW5Db3VudE1ldHJpY3MoUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSkKKyAgICB7CisgICAgICAgIGlmICghRGF0YWJhc2VEZXNjcmlwdG9yLmdldENsaWVudFJlcXVlc3RTaXplTWV0cmljc0VuYWJsZWQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zV3JpdHRlbi5pbmModXBkYXRlLmFmZmVjdGVkQ29sdW1uQ291bnQoKSk7CisgICAgICAgIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NXcml0dGVuLmluYyh1cGRhdGUuYWZmZWN0ZWRSb3dDb3VudCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL0RlY2F5aW5nRXN0aW1hdGVkSGlzdG9ncmFtUmVzZXJ2b2lyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL0RlY2F5aW5nRXN0aW1hdGVkSGlzdG9ncmFtUmVzZXJ2b2lyLmphdmEKaW5kZXggMzA4MDIzZS4uNTY1ZTMzZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9EZWNheWluZ0VzdGltYXRlZEhpc3RvZ3JhbVJlc2Vydm9pci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvRGVjYXlpbmdFc3RpbWF0ZWRIaXN0b2dyYW1SZXNlcnZvaXIuamF2YQpAQCAtNDIsNiArNDIsNyBAQAogCiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5NYXRoLm1heDsKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLk1hdGgubWluOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkRFQ0FZSU5HX0VTVElNQVRFRF9ISVNUT0dSQU1fUkVTRVJWT0lSX1NUUklQRV9DT1VOVDsKIAogLyoqCiAgKiBBIGRlY2F5aW5nIGhpc3RvZ3JhbSByZXNlcnZvaXIgd2hlcmUgdmFsdWVzIGNvbGxlY3RlZCBkdXJpbmcgZWFjaCBtaW51dGUgd2lsbCBiZSB0d2ljZSBhcyBzaWduaWZpY2FudCBhcyB0aGUgdmFsdWVzCkBAIC05MSw3ICs5Miw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUNLRVRfQ09VTlQgPSAxNjQ7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9XX0JVQ0tFVF9DT1VOVCA9IDEyNzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NUUklQRV9DT1VOVCA9IEludGVnZXIucGFyc2VJbnQoU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEuZGVocl9zdHJpcGVfY291bnQiLCAiMiIpKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1NUUklQRV9DT1VOVCA9IERFQ0FZSU5HX0VTVElNQVRFRF9ISVNUT0dSQU1fUkVTRVJWT0lSX1NUUklQRV9DT1VOVC5nZXRJbnQoKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQlVDS0VUX0NPVU5UID0gMjM3OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUZBVUxUX1pFUk9fQ09OU0lERVJBVElPTiA9IGZhbHNlOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL0ZyZXF1ZW5jeVNhbXBsZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvRnJlcXVlbmN5U2FtcGxlci5qYXZhCmluZGV4IDhhODkxOGIuLmQ0ZGZlODYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvRnJlcXVlbmN5U2FtcGxlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvRnJlcXVlbmN5U2FtcGxlci5qYXZhCkBAIC0zMywzMyArMzMsMzEgQEAKICAqIDxwPmFkZCgieCIsIDEwKTsgYW5kIGFkZCgieCIsIDIwKTsgd2lsbCByZXN1bHQgaW4gIngiID0gMzA8L3A+IFRoaXMgdXNlcyBTdHJlYW1TdW1tYXJ5IHRvIG9ubHkgc3RvcmUgdGhlCiAgKiBhcHByb3hpbWF0ZSBjYXJkaW5hbGl0eSAoY2FwYWNpdHkpIG9mIGtleXMuIElmIHRoZSBudW1iZXIgb2YgZGlzdGluY3Qga2V5cyBleGNlZWQgdGhlIGNhcGFjaXR5LCB0aGUgZXJyb3Igb2YgdGhlCiAgKiBzYW1wbGUgbWF5IGluY3JlYXNlIGRlcGVuZGluZyBvbiBkaXN0cmlidXRpb24gb2Yga2V5cyBhbW9uZyB0aGUgdG90YWwgc2V0LgorICoKKyAqIE5vdGU6IHtAbGluayBTYW1wbGVyI3NhbXBsZXJFeGVjdXRvcn0gaXMgc2luZ2xlIHRocmVhZGVkIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHN5bmNocm9uaXplIGFzIHdlIGhhdmUgYWNjZXNzCisgKiBmcm9tIGJvdGggaW50ZXJuYWwgYW5kIHRoZSBleHRlcm5hbCBKTVggY29udGV4dCB0aGF0IGNhbiBjYXVzZSByYWNlcy4KICAqIAogICogQHBhcmFtIDxUPgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRnJlcXVlbmN5U2FtcGxlcjxUPiBleHRlbmRzIFNhbXBsZXI8VD4KIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRnJlcXVlbmN5U2FtcGxlci5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBsb25nIGVuZFRpbWVOYW5vcyA9IC0xOwogCiAgICAgcHJpdmF0ZSBTdHJlYW1TdW1tYXJ5PFQ+IHN1bW1hcnk7CiAKICAgICAvKioKICAgICAgKiBTdGFydCB0byByZWNvcmQgc2FtcGxlcwogICAgICAqCi0gICAgICogQHBhcmFtIGNhcGFjaXR5Ci0gICAgICogICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlIGl0ZW1zIHRvIGtlZXAgaW4gbWVtb3J5LCB0aGUgbG93ZXIgdGhpcyBpcwotICAgICAqICAgICAgICAgICAgdGhlIGxlc3MgYWNjdXJhdGUgcmVzdWx0cyBhcmUuIEZvciBiZXN0IHJlc3VsdHMgdXNlIHZhbHVlCi0gICAgICogICAgICAgICAgICBjbG9zZSB0byBjYXJkaW5hbGl0eSwgYnV0IHVuZGVyc3RhbmQgdGhlIG1lbW9yeSB0cmFkZSBvZmZzLgorICAgICAqIEBwYXJhbSBjYXBhY2l0eSBOdW1iZXIgb2Ygc2FtcGxlIGl0ZW1zIHRvIGtlZXAgaW4gbWVtb3J5LCB0aGUgbG93ZXIgdGhpcyBpcworICAgICAqICAgICAgICAgICAgICAgICB0aGUgbGVzcyBhY2N1cmF0ZSByZXN1bHRzIGFyZS4gRm9yIGJlc3QgcmVzdWx0cyB1c2UgdmFsdWUKKyAgICAgKiAgICAgICAgICAgICAgICAgY2xvc2UgdG8gY2FyZGluYWxpdHksIGJ1dCB1bmRlcnN0YW5kIHRoZSBtZW1vcnkgdHJhZGUgb2Zmcy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYmVnaW5TYW1wbGluZyhpbnQgY2FwYWNpdHksIGludCBkdXJhdGlvbk1pbGxpcykKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYmVnaW5TYW1wbGluZyhpbnQgY2FwYWNpdHksIGxvbmcgZHVyYXRpb25NaWxsaXMpCiAgICAgewotICAgICAgICBpZiAoZW5kVGltZU5hbm9zID09IC0xIHx8IGNsb2NrLm5vdygpID4gZW5kVGltZU5hbm9zKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdW1tYXJ5ID0gbmV3IFN0cmVhbVN1bW1hcnk8PihjYXBhY2l0eSk7Ci0gICAgICAgICAgICBlbmRUaW1lTmFub3MgPSBjbG9jay5ub3coKSArIE1JTExJU0VDT05EUy50b05hbm9zKGR1cmF0aW9uTWlsbGlzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCisgICAgICAgIGlmIChpc0FjdGl2ZSgpKQogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNhbXBsaW5nIGFscmVhZHkgaW4gcHJvZ3Jlc3MiKTsKKyAgICAgICAgdXBkYXRlRW5kVGltZShjbG9jay5ub3coKSArIE1JTExJU0VDT05EUy50b05hbm9zKGR1cmF0aW9uTWlsbGlzKSk7CisgICAgICAgIHN1bW1hcnkgPSBuZXcgU3RyZWFtU3VtbWFyeTw+KGNhcGFjaXR5KTsKICAgICB9CiAKICAgICAvKioKQEAgLTY5LDEyICs2NywxMiBAQAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxTYW1wbGU8VD4+IGZpbmlzaFNhbXBsaW5nKGludCBjb3VudCkKICAgICB7CiAgICAgICAgIExpc3Q8U2FtcGxlPFQ+PiByZXN1bHRzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIGlmIChlbmRUaW1lTmFub3MgIT0gLTEpCisgICAgICAgIGlmIChpc0VuYWJsZWQoKSkKICAgICAgICAgewotICAgICAgICAgICAgZW5kVGltZU5hbm9zID0gLTE7CisgICAgICAgICAgICBkaXNhYmxlKCk7CiAgICAgICAgICAgICByZXN1bHRzID0gc3VtbWFyeS50b3BLKGNvdW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChjIC0+IG5ldyBTYW1wbGU8VD4oYy5nZXRJdGVtKCksIGMuZ2V0Q291bnQoKSwgYy5nZXRFcnJvcigpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChjIC0+IG5ldyBTYW1wbGU8PihjLmdldEl0ZW0oKSwgYy5nZXRDb3VudCgpLCBjLmdldEVycm9yKCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0czsKQEAgLTgyLDI0ICs4MCwxNiBAQAogCiAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGluc2VydChmaW5hbCBUIGl0ZW0sIGZpbmFsIGxvbmcgdmFsdWUpCiAgICAgewotICAgICAgICAvLyBzYW1wbGVyRXhlY3V0b3IgaXMgc2luZ2xlIHRocmVhZGVkIGJ1dCBzdGlsbCBuZWVkCi0gICAgICAgIC8vIHN5bmNocm9uaXphdGlvbiBhZ2FpbnN0IGpteCBjYWxscyB0byBmaW5pc2hTYW1wbGluZwotICAgICAgICBpZiAodmFsdWUgPiAwICYmIGNsb2NrLm5vdygpIDw9IGVuZFRpbWVOYW5vcykKKyAgICAgICAgaWYgKHZhbHVlID4gMCAmJiBpc0FjdGl2ZSgpKQogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBzdW1tYXJ5Lm9mZmVyKGl0ZW0sIChpbnQpIE1hdGgubWluKHZhbHVlLCBJbnRlZ2VyLk1BWF9WQUxVRSkpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJGYWlsdXJlIHRvIG9mZmVyIHNhbXBsZSIsIGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmRUaW1lTmFub3MgIT0gLTEgJiYgY2xvY2subm93KCkgPD0gZW5kVGltZU5hbm9zOwotICAgIH0KLQogfQotCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL0tleXNwYWNlTWV0cmljcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9LZXlzcGFjZU1ldHJpY3MuamF2YQppbmRleCA3NzYwMjdlLi43MDdjY2EyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL0tleXNwYWNlTWV0cmljcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvS2V5c3BhY2VNZXRyaWNzLmphdmEKQEAgLTIwLDE4ICsyMCwyMiBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlRvTG9uZ0Z1bmN0aW9uOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworCiBpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuQ291bnRlcjsKIGltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5HYXVnZTsKIGltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5IaXN0b2dyYW07CiBpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuTWV0ZXI7CiBpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuVGltZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkdhdWdlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNhc3NhbmRyYU1ldHJpY3NSZWdpc3RyeS5NZXRyaWNOYW1lOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuVGFibGVNZXRyaWNzLlJlbGVhc2FibGVNZXRyaWM7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7Ci0KIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DYXNzYW5kcmFNZXRyaWNzUmVnaXN0cnkuTWV0cmljczsKIAogLyoqCkBAIC01OSwxNiArNjMsMTUgQEAKICAgICBwdWJsaWMgZmluYWwgR2F1Z2U8TG9uZz4gcGVuZGluZ0ZsdXNoZXM7CiAgICAgLyoqIEVzdGltYXRlIG9mIG51bWJlciBvZiBwZW5kaW5nIGNvbXBhY3Rpb3MgZm9yIHRoaXMgQ0YgKi8KICAgICBwdWJsaWMgZmluYWwgR2F1Z2U8TG9uZz4gcGVuZGluZ0NvbXBhY3Rpb25zOwotICAgIC8qKiBEaXNrIHNwYWNlIHVzZWQgYnkgU1NUYWJsZXMgYmVsb25naW5nIHRvIHRoaXMgQ0YgKi8KKyAgICAvKiogRGlzayBzcGFjZSB1c2VkIGJ5IFNTVGFibGVzIGJlbG9uZ2luZyB0byB0YWJsZXMgaW4gdGhpcyBrZXlzcGFjZSAqLwogICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiBsaXZlRGlza1NwYWNlVXNlZDsKLSAgICAvKiogVG90YWwgZGlzayBzcGFjZSB1c2VkIGJ5IFNTVGFibGVzIGJlbG9uZ2luZyB0byB0aGlzIENGLCBpbmNsdWRpbmcgb2Jzb2xldGUgb25lcyB3YWl0aW5nIHRvIGJlIEdDJ2QgKi8KKyAgICAvKiogRGlzayBzcGFjZSB1c2VkIGJ5IFNTVGFibGVzIGJlbG9uZ2luZyB0byB0YWJsZXMgaW4gdGhpcyBrZXlzcGFjZSwgc2NhbGVkIGRvd24gYnkgcmVwbGljYXRpb24gZmFjdG9yICovCisgICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IHVucmVwbGljYXRlZExpdmVEaXNrU3BhY2VVc2VkOworICAgIC8qKiBVbmNvbXByZXNzZWQvbG9naWNhbCBzaXplIG9mIFNTVGFibGVzIGJlbG9uZ2luZyB0byB0YWJsZXMgaW4gdGhpcyBrZXlzcGFjZSAqLworICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiB1bmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZDsKKyAgICAvKiogVW5jb21wcmVzc2VkL2xvZ2ljYWwgc2l6ZSBvZiBTU1RhYmxlcyBiZWxvbmdpbmcgdG8gdGFibGVzIGluIHRoaXMga2V5c3BhY2UsIHNjYWxlZCBkb3duIGJ5IHJlcGxpY2F0aW9uIGZhY3RvciAqLworICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxMb25nPiB1bnJlcGxpY2F0ZWRVbmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZDsKICAgICBwdWJsaWMgZmluYWwgR2F1Z2U8TG9uZz4gdG90YWxEaXNrU3BhY2VVc2VkOwotICAgIC8qKiBEaXNrIHNwYWNlIHVzZWQgYnkgYmxvb20gZmlsdGVyICovCi0gICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IGJsb29tRmlsdGVyRGlza1NwYWNlVXNlZDsKLSAgICAvKiogT2ZmIGhlYXAgbWVtb3J5IHVzZWQgYnkgYmxvb20gZmlsdGVyICovCi0gICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IGJsb29tRmlsdGVyT2ZmSGVhcE1lbW9yeVVzZWQ7Ci0gICAgLyoqIE9mZiBoZWFwIG1lbW9yeSB1c2VkIGJ5IGluZGV4IHN1bW1hcnkgKi8KLSAgICBwdWJsaWMgZmluYWwgR2F1Z2U8TG9uZz4gaW5kZXhTdW1tYXJ5T2ZmSGVhcE1lbW9yeVVzZWQ7CiAgICAgLyoqIE9mZiBoZWFwIG1lbW9yeSB1c2VkIGJ5IGNvbXByZXNzaW9uIG1ldGEgZGF0YSovCiAgICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IGNvbXByZXNzaW9uTWV0YWRhdGFPZmZIZWFwTWVtb3J5VXNlZDsKICAgICAvKiogKExvY2FsKSByZWFkIG1ldHJpY3MgKi8KQEAgLTc3LDggKzgwLDEwIEBACiAgICAgcHVibGljIGZpbmFsIExhdGVuY3lNZXRyaWNzIHJhbmdlTGF0ZW5jeTsKICAgICAvKiogKExvY2FsKSB3cml0ZSBtZXRyaWNzICovCiAgICAgcHVibGljIGZpbmFsIExhdGVuY3lNZXRyaWNzIHdyaXRlTGF0ZW5jeTsKLSAgICAvKiogSGlzdG9ncmFtIG9mIHRoZSBudW1iZXIgb2Ygc3N0YWJsZSBkYXRhIGZpbGVzIGFjY2Vzc2VkIHBlciByZWFkICovCisgICAgLyoqIEhpc3RvZ3JhbSBvZiB0aGUgbnVtYmVyIG9mIHNzdGFibGUgZGF0YSBmaWxlcyBhY2Nlc3NlZCBwZXIgc2luZ2xlIHBhcnRpdGlvbiByZWFkICovCiAgICAgcHVibGljIGZpbmFsIEhpc3RvZ3JhbSBzc3RhYmxlc1BlclJlYWRIaXN0b2dyYW07CisgICAgLyoqIEhpc3RvZ3JhbSBvZiB0aGUgbnVtYmVyIG9mIHNzdGFibGUgZGF0YSBmaWxlcyBhY2Nlc3NlZCBwZXIgcGFydGl0aW9uIHJhbmdlIHJlYWQgKi8KKyAgICBwdWJsaWMgZmluYWwgSGlzdG9ncmFtIHNzdGFibGVzUGVyUmFuZ2VSZWFkSGlzdG9ncmFtOwogICAgIC8qKiBUb21ic3RvbmVzIHNjYW5uZWQgaW4gcXVlcmllcyBvbiB0aGlzIEtleXNwYWNlICovCiAgICAgcHVibGljIGZpbmFsIEhpc3RvZ3JhbSB0b21ic3RvbmVTY2FubmVkSGlzdG9ncmFtOwogICAgIC8qKiBMaXZlIGNlbGxzIHNjYW5uZWQgaW4gcXVlcmllcyBvbiB0aGlzIEtleXNwYWNlICovCkBAIC0xNjgsOCArMTczLDEwIEBACiAgICAgcHVibGljIGZpbmFsIE1ldGVyIHJvd0luZGV4U2l6ZUFib3J0czsKICAgICBwdWJsaWMgZmluYWwgSGlzdG9ncmFtIHJvd0luZGV4U2l6ZTsKIAorICAgIHB1YmxpYyBmaW5hbCBJbW11dGFibGVNYXA8U1NUYWJsZUZvcm1hdDw/LCA/PiwgSW1tdXRhYmxlTWFwPFN0cmluZywgR2F1Z2U8PyBleHRlbmRzIE51bWJlcj4+PiBmb3JtYXRTcGVjaWZpY0dhdWdlczsKKwogICAgIHB1YmxpYyBmaW5hbCBNZXRyaWNOYW1lRmFjdG9yeSBmYWN0b3J5OwotICAgIHByaXZhdGUgS2V5c3BhY2Uga2V5c3BhY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBLZXlzcGFjZSBrZXlzcGFjZTsKIAogICAgIC8qKiBzZXQgY29udGFpbmluZyBuYW1lcyBvZiBhbGwgdGhlIG1ldHJpY3Mgc3RvcmVkIGhlcmUsIGZvciByZWxlYXNpbmcgbGF0ZXIgKi8KICAgICBwcml2YXRlIFNldDxSZWxlYXNhYmxlTWV0cmljPiBhbGxNZXRyaWNzID0gU2V0cy5uZXdIYXNoU2V0KCk7CkBAIC0yMDEsMTQgKzIwOCwxNSBAQAogICAgICAgICAgICAgICAgIG1ldHJpYyAtPiBtZXRyaWMubWVtdGFibGVTd2l0Y2hDb3VudC5nZXRDb3VudCgpKTsKICAgICAgICAgcGVuZGluZ0NvbXBhY3Rpb25zID0gY3JlYXRlS2V5c3BhY2VHYXVnZSgiUGVuZGluZ0NvbXBhY3Rpb25zIiwgbWV0cmljIC0+IG1ldHJpYy5wZW5kaW5nQ29tcGFjdGlvbnMuZ2V0VmFsdWUoKSk7CiAgICAgICAgIHBlbmRpbmdGbHVzaGVzID0gY3JlYXRlS2V5c3BhY2VHYXVnZSgiUGVuZGluZ0ZsdXNoZXMiLCBtZXRyaWMgLT4gbWV0cmljLnBlbmRpbmdGbHVzaGVzLmdldENvdW50KCkpOworCiAgICAgICAgIGxpdmVEaXNrU3BhY2VVc2VkID0gY3JlYXRlS2V5c3BhY2VHYXVnZSgiTGl2ZURpc2tTcGFjZVVzZWQiLCBtZXRyaWMgLT4gbWV0cmljLmxpdmVEaXNrU3BhY2VVc2VkLmdldENvdW50KCkpOworICAgICAgICB1bmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZCA9IGNyZWF0ZUtleXNwYWNlR2F1Z2UoIlVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkIiwgbWV0cmljIC0+IG1ldHJpYy51bmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZC5nZXRDb3VudCgpKTsKKyAgICAgICAgdW5yZXBsaWNhdGVkTGl2ZURpc2tTcGFjZVVzZWQgPSBjcmVhdGVLZXlzcGFjZUdhdWdlKCJVbnJlcGxpY2F0ZWRMaXZlRGlza1NwYWNlVXNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWMgLT4gbWV0cmljLmxpdmVEaXNrU3BhY2VVc2VkLmdldENvdW50KCkgLyBrZXlzcGFjZS5nZXRSZXBsaWNhdGlvblN0cmF0ZWd5KCkuZ2V0UmVwbGljYXRpb25GYWN0b3IoKS5mdWxsUmVwbGljYXMpOworICAgICAgICB1bnJlcGxpY2F0ZWRVbmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZCA9IGNyZWF0ZUtleXNwYWNlR2F1Z2UoIlVucmVwbGljYXRlZFVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpYyAtPiBtZXRyaWMudW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQuZ2V0Q291bnQoKSAvIGtleXNwYWNlLmdldFJlcGxpY2F0aW9uU3RyYXRlZ3koKS5nZXRSZXBsaWNhdGlvbkZhY3RvcigpLmZ1bGxSZXBsaWNhcyk7CiAgICAgICAgIHRvdGFsRGlza1NwYWNlVXNlZCA9IGNyZWF0ZUtleXNwYWNlR2F1Z2UoIlRvdGFsRGlza1NwYWNlVXNlZCIsIG1ldHJpYyAtPiBtZXRyaWMudG90YWxEaXNrU3BhY2VVc2VkLmdldENvdW50KCkpOwotICAgICAgICBibG9vbUZpbHRlckRpc2tTcGFjZVVzZWQgPSBjcmVhdGVLZXlzcGFjZUdhdWdlKCJCbG9vbUZpbHRlckRpc2tTcGFjZVVzZWQiLAotICAgICAgICAgICAgICAgIG1ldHJpYyAtPiBtZXRyaWMuYmxvb21GaWx0ZXJEaXNrU3BhY2VVc2VkLmdldFZhbHVlKCkpOwotICAgICAgICBibG9vbUZpbHRlck9mZkhlYXBNZW1vcnlVc2VkID0gY3JlYXRlS2V5c3BhY2VHYXVnZSgiQmxvb21GaWx0ZXJPZmZIZWFwTWVtb3J5VXNlZCIsCi0gICAgICAgICAgICAgICAgbWV0cmljIC0+IG1ldHJpYy5ibG9vbUZpbHRlck9mZkhlYXBNZW1vcnlVc2VkLmdldFZhbHVlKCkpOwotICAgICAgICBpbmRleFN1bW1hcnlPZmZIZWFwTWVtb3J5VXNlZCA9IGNyZWF0ZUtleXNwYWNlR2F1Z2UoIkluZGV4U3VtbWFyeU9mZkhlYXBNZW1vcnlVc2VkIiwKLSAgICAgICAgICAgICAgICBtZXRyaWMgLT4gbWV0cmljLmluZGV4U3VtbWFyeU9mZkhlYXBNZW1vcnlVc2VkLmdldFZhbHVlKCkpOworCiAgICAgICAgIGNvbXByZXNzaW9uTWV0YWRhdGFPZmZIZWFwTWVtb3J5VXNlZCA9IGNyZWF0ZUtleXNwYWNlR2F1Z2UoIkNvbXByZXNzaW9uTWV0YWRhdGFPZmZIZWFwTWVtb3J5VXNlZCIsCiAgICAgICAgICAgICAgICAgbWV0cmljIC0+IG1ldHJpYy5jb21wcmVzc2lvbk1ldGFkYXRhT2ZmSGVhcE1lbW9yeVVzZWQuZ2V0VmFsdWUoKSk7CiAKQEAgLTIxOSw2ICsyMjcsNyBAQAogCiAgICAgICAgIC8vIGNyZWF0ZSBoaXN0b2dyYW1zIGZvciBUYWJsZU1ldHJpY3MgdG8gcmVwbGljYXRlIHVwZGF0ZXMgdG8KICAgICAgICAgc3N0YWJsZXNQZXJSZWFkSGlzdG9ncmFtID0gY3JlYXRlS2V5c3BhY2VIaXN0b2dyYW0oIlNTVGFibGVzUGVyUmVhZEhpc3RvZ3JhbSIsIHRydWUpOworICAgICAgICBzc3RhYmxlc1BlclJhbmdlUmVhZEhpc3RvZ3JhbSA9IGNyZWF0ZUtleXNwYWNlSGlzdG9ncmFtKCJTU1RhYmxlc1BlclJhbmdlUmVhZEhpc3RvZ3JhbSIsIHRydWUpOwogICAgICAgICB0b21ic3RvbmVTY2FubmVkSGlzdG9ncmFtID0gY3JlYXRlS2V5c3BhY2VIaXN0b2dyYW0oIlRvbWJzdG9uZVNjYW5uZWRIaXN0b2dyYW0iLCBmYWxzZSk7CiAgICAgICAgIGxpdmVTY2FubmVkSGlzdG9ncmFtID0gY3JlYXRlS2V5c3BhY2VIaXN0b2dyYW0oIkxpdmVTY2FubmVkSGlzdG9ncmFtIiwgZmFsc2UpOwogICAgICAgICBjb2xVcGRhdGVUaW1lRGVsdGFIaXN0b2dyYW0gPSBjcmVhdGVLZXlzcGFjZUhpc3RvZ3JhbSgiQ29sVXBkYXRlVGltZURlbHRhSGlzdG9ncmFtIiwgZmFsc2UpOwpAQCAtMjY1LDYgKzI3NCw4IEBACiAgICAgICAgIHJvd0luZGV4U2l6ZVdhcm5pbmdzID0gY3JlYXRlS2V5c3BhY2VNZXRlcigiUm93SW5kZXhTaXplV2FybmluZ3MiKTsKICAgICAgICAgcm93SW5kZXhTaXplQWJvcnRzID0gY3JlYXRlS2V5c3BhY2VNZXRlcigiUm93SW5kZXhTaXplQWJvcnRzIik7CiAgICAgICAgIHJvd0luZGV4U2l6ZSA9IGNyZWF0ZUtleXNwYWNlSGlzdG9ncmFtKCJSb3dJbmRleFNpemUiLCBmYWxzZSk7CisKKyAgICAgICAgZm9ybWF0U3BlY2lmaWNHYXVnZXMgPSBjcmVhdGVGb3JtYXRTcGVjaWZpY0dhdWdlcyhrZXlzcGFjZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yNzgsMTAgKzI4OSwzMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBJbW11dGFibGVNYXA8U1NUYWJsZUZvcm1hdDw/LCA/PiwgSW1tdXRhYmxlTWFwPFN0cmluZywgR2F1Z2U8PyBleHRlbmRzIE51bWJlcj4+PiBjcmVhdGVGb3JtYXRTcGVjaWZpY0dhdWdlcyhLZXlzcGFjZSBrZXlzcGFjZSkKKyAgICB7CisgICAgICAgIEltbXV0YWJsZU1hcC5CdWlsZGVyPFNTVGFibGVGb3JtYXQ8PyAsPz4sIEltbXV0YWJsZU1hcDxTdHJpbmcsIEdhdWdlPD8gZXh0ZW5kcyBOdW1iZXI+Pj4gYnVpbGRlciA9IEltbXV0YWJsZU1hcC5idWlsZGVyKCk7CisgICAgICAgIGZvciAoU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQgOiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1NUYWJsZUZvcm1hdHMoKS52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgSW1tdXRhYmxlTWFwLkJ1aWxkZXI8U3RyaW5nLCBHYXVnZTw/IGV4dGVuZHMgTnVtYmVyPj4gZ2F1Z2VzID0gSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoR2F1Z2VQcm92aWRlcjw/PiBnYXVnZVByb3ZpZGVyIDogZm9ybWF0LmdldEZvcm1hdFNwZWNpZmljTWV0cmljc1Byb3ZpZGVycygpLmdldEdhdWdlUHJvdmlkZXJzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpbmFsTmFtZSA9IGdhdWdlUHJvdmlkZXIubmFtZTsKKyAgICAgICAgICAgICAgICBhbGxNZXRyaWNzLmFkZCgoKSAtPiByZWxlYXNlTWV0cmljKGZpbmFsTmFtZSkpOworICAgICAgICAgICAgICAgIEdhdWdlPD8gZXh0ZW5kcyBOdW1iZXI+IGdhdWdlID0gTWV0cmljcy5yZWdpc3RlcihmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoZmluYWxOYW1lKSwgZ2F1Z2VQcm92aWRlci5nZXRLZXlzcGFjZUdhdWdlKGtleXNwYWNlKSk7CisgICAgICAgICAgICAgICAgZ2F1Z2VzLnB1dChnYXVnZVByb3ZpZGVyLm5hbWUsIGdhdWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXIucHV0KGZvcm1hdCwgZ2F1Z2VzLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQ3JlYXRlcyBhIGdhdWdlIHRoYXQgd2lsbCBzdW0gdGhlIGN1cnJlbnQgdmFsdWUgb2YgYSBtZXRyaWMgZm9yIGFsbCBjb2x1bW4gZmFtaWxpZXMgaW4gdGhpcyBrZXlzcGFjZQotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHBhcmFtIGV4dHJhY3RvcgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG1ldHJpYyBiZWluZyBjcmVhdGVkCisgICAgICogQHBhcmFtIGV4dHJhY3RvciBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYSBzcGVjaWZpZWQgbWV0cmljIHZhbHVlIGZvciBhIGdpdmVuIHRhYmxlCisgICAgICoKICAgICAgKiBAcmV0dXJuIEdhdWdlJmd0O0xvbmc+IHRoYXQgY29tcHV0ZXMgc3VtIG9mIE1ldHJpY1ZhbHVlLmdldFZhbHVlKCkKICAgICAgKi8KICAgICBwcml2YXRlIEdhdWdlPExvbmc+IGNyZWF0ZUtleXNwYWNlR2F1Z2UoU3RyaW5nIG5hbWUsIGZpbmFsIFRvTG9uZ0Z1bmN0aW9uPFRhYmxlTWV0cmljcz4gZXh0cmFjdG9yKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9NYXhTYW1wbGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL01heFNhbXBsZXIuamF2YQppbmRleCBkZjI0YmI5Li4wNTkzZTM0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL01heFNhbXBsZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL01heFNhbXBsZXIuamF2YQpAQCAtMjYsMzkgKzI2LDM1IEBACiAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlMTElTRUNPTkRTOwogCisvKioKKyAqIE5vdGU6IHtAbGluayBTYW1wbGVyI3NhbXBsZXJFeGVjdXRvcn0gaXMgc2luZ2xlIHRocmVhZGVkIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHN5bmNocm9uaXplIGFzIHdlIGhhdmUgYWNjZXNzCisgKiBmcm9tIGJvdGggaW50ZXJuYWwgYW5kIHRoZSBleHRlcm5hbCBKTVggY29udGV4dCB0aGF0IGNhbiBjYXVzZSByYWNlcy4KKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIE1heFNhbXBsZXI8VD4gZXh0ZW5kcyBTYW1wbGVyPFQ+CiB7CiAgICAgcHJpdmF0ZSBpbnQgY2FwYWNpdHk7CiAgICAgcHJpdmF0ZSBNaW5NYXhQcmlvcml0eVF1ZXVlPFNhbXBsZTxUPj4gcXVldWU7Ci0gICAgcHJpdmF0ZSBsb25nIGVuZFRpbWVOYW5vcyA9IC0xOwogICAgIHByaXZhdGUgZmluYWwgQ29tcGFyYXRvcjxTYW1wbGU8VD4+IGNvbXAgPSBDb2xsZWN0aW9ucy5yZXZlcnNlT3JkZXIoQ29tcGFyYXRvci5jb21wYXJpbmcocCAtPiBwLmNvdW50KSk7CiAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBiZWdpblNhbXBsaW5nKGludCBjYXBhY2l0eSwgbG9uZyBkdXJhdGlvbk1pbGxpcykKICAgICB7Ci0gICAgICAgIHJldHVybiBlbmRUaW1lTmFub3MgIT0gLTEgJiYgY2xvY2subm93KCkgPD0gZW5kVGltZU5hbm9zOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBiZWdpblNhbXBsaW5nKGludCBjYXBhY2l0eSwgaW50IGR1cmF0aW9uTWlsbGlzKQotICAgIHsKLSAgICAgICAgaWYgKGVuZFRpbWVOYW5vcyA9PSAtMSB8fCBjbG9jay5ub3coKSA+IGVuZFRpbWVOYW5vcykKLSAgICAgICAgewotICAgICAgICAgICAgZW5kVGltZU5hbm9zID0gY2xvY2subm93KCkgKyBNSUxMSVNFQ09ORFMudG9OYW5vcyhkdXJhdGlvbk1pbGxpcyk7Ci0gICAgICAgICAgICBxdWV1ZSA9IE1pbk1heFByaW9yaXR5UXVldWUKLSAgICAgICAgICAgICAgICAgICAgLm9yZGVyZWRCeShjb21wKQotICAgICAgICAgICAgICAgICAgICAubWF4aW11bVNpemUoTWF0aC5tYXgoMSwgY2FwYWNpdHkpKQotICAgICAgICAgICAgICAgICAgICAuY3JlYXRlKCk7Ci0gICAgICAgICAgICB0aGlzLmNhcGFjaXR5ID0gY2FwYWNpdHk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQorICAgICAgICBpZiAoaXNBY3RpdmUoKSkKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTYW1wbGluZyBhbHJlYWR5IGluIHByb2dyZXNzIik7CisgICAgICAgIHVwZGF0ZUVuZFRpbWUoY2xvY2subm93KCkgKyBNSUxMSVNFQ09ORFMudG9OYW5vcyhkdXJhdGlvbk1pbGxpcykpOworICAgICAgICBxdWV1ZSA9IE1pbk1heFByaW9yaXR5UXVldWUub3JkZXJlZEJ5KGNvbXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhpbXVtU2l6ZShNYXRoLm1heCgxLCBjYXBhY2l0eSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGUoKTsKKyAgICAgICAgdGhpcy5jYXBhY2l0eSA9IGNhcGFjaXR5OwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdDxTYW1wbGU8VD4+IGZpbmlzaFNhbXBsaW5nKGludCBjb3VudCkKICAgICB7CiAgICAgICAgIExpc3Q8U2FtcGxlPFQ+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oY291bnQpOwotICAgICAgICBpZiAoZW5kVGltZU5hbm9zICE9IC0xKQorICAgICAgICBpZiAoaXNFbmFibGVkKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGVuZFRpbWVOYW5vcyA9IC0xOworICAgICAgICAgICAgZGlzYWJsZSgpOwogICAgICAgICAgICAgU2FtcGxlPFQ+IG5leHQ7CiAgICAgICAgICAgICB3aGlsZSAoKG5leHQgPSBxdWV1ZS5wb2xsKCkpICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA8PSBjb3VudCkKICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG5leHQpOwpAQCAtNjksOSArNjUsMTIgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgaW5zZXJ0KFQgaXRlbSwgbG9uZyB2YWx1ZSkKICAgICB7Ci0gICAgICAgIGlmICh2YWx1ZSA+IDAgJiYgY2xvY2subm93KCkgPD0gZW5kVGltZU5hbm9zCi0gICAgICAgICAgICAgICAgJiYgKHF1ZXVlLmlzRW1wdHkoKSB8fCBxdWV1ZS5zaXplKCkgPCBjYXBhY2l0eSB8fCBxdWV1ZS5wZWVrTGFzdCgpLmNvdW50IDwgdmFsdWUpKQorICAgICAgICBpZiAoaXNBY3RpdmUoKSAmJiBwZXJtaXRzVmFsdWUodmFsdWUpKQogICAgICAgICAgICAgcXVldWUuYWRkKG5ldyBTYW1wbGU8VD4oaXRlbSwgdmFsdWUsIDApKTsKICAgICB9CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gcGVybWl0c1ZhbHVlKGxvbmcgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gdmFsdWUgPiAwICYmIChxdWV1ZS5pc0VtcHR5KCkgfHwgcXVldWUuc2l6ZSgpIDwgY2FwYWNpdHkgfHwgcXVldWUucGVla0xhc3QoKS5jb3VudCA8IHZhbHVlKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL01pbk1heEF2Z01ldHJpYy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9NaW5NYXhBdmdNZXRyaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjVmNTJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9NaW5NYXhBdmdNZXRyaWMuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOworCitpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuR2F1Z2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DYXNzYW5kcmFNZXRyaWNzUmVnaXN0cnkuTWV0cmljczsKKworcHVibGljIGNsYXNzIE1pbk1heEF2Z01ldHJpYworeworICAgIHByaXZhdGUgZmluYWwgTWV0cmljTmFtZUZhY3RvcnkgZmFjdG9yeTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lUHJlZml4OworCisgICAgZmluYWwgR2F1Z2U8TG9uZz4gbWluR2F1Z2U7CisgICAgZmluYWwgR2F1Z2U8TG9uZz4gbWF4R2F1Z2U7CisgICAgZmluYWwgR2F1Z2U8RG91YmxlPiBhdmdHYXVnZTsKKyAgICBmaW5hbCBHYXVnZTxEb3VibGU+IHN0ZGRldkdhdWdlOworICAgIGZpbmFsIEdhdWdlPEludGVnZXI+IG51bVNhbXBsZXNHYXVnZTsKKworICAgIHByaXZhdGUgbG9uZyBtaW47CisgICAgcHJpdmF0ZSBsb25nIG1heDsKKyAgICBwcml2YXRlIGxvbmcgc3VtOworICAgIHByaXZhdGUgbG9uZyBzdW1TcXVhcmVzOworICAgIHByaXZhdGUgaW50IG51bVNhbXBsZXM7CisKKyAgICBwdWJsaWMgTWluTWF4QXZnTWV0cmljKE1ldHJpY05hbWVGYWN0b3J5IGZhY3RvcnksIFN0cmluZyBuYW1lUHJlZml4KQorICAgIHsKKyAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKKyAgICAgICAgdGhpcy5uYW1lUHJlZml4ID0gbmFtZVByZWZpeDsKKworICAgICAgICBtaW5HYXVnZSA9IE1ldHJpY3MucmVnaXN0ZXIoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKG5hbWVQcmVmaXggKyAiTWluIiksICgpIC0+IG1pbik7CisgICAgICAgIG1heEdhdWdlID0gTWV0cmljcy5yZWdpc3RlcihmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUobmFtZVByZWZpeCArICJNYXgiKSwgKCkgLT4gbWF4KTsKKyAgICAgICAgYXZnR2F1Z2UgPSBNZXRyaWNzLnJlZ2lzdGVyKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZShuYW1lUHJlZml4ICsgIkF2ZyIpLCAoKSAtPiBudW1TYW1wbGVzID4gMCA/ICgoZG91YmxlKSBzdW0pIC8gbnVtU2FtcGxlcyA6IDApOworICAgICAgICBzdGRkZXZHYXVnZSA9IE1ldHJpY3MucmVnaXN0ZXIoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKG5hbWVQcmVmaXggKyAiU3RkRGV2IiksICgpIC0+IHN0ZGRldigpKTsKKyAgICAgICAgbnVtU2FtcGxlc0dhdWdlID0gTWV0cmljcy5yZWdpc3RlcihmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUobmFtZVByZWZpeCArICJOdW1TYW1wbGVzIiksICgpIC0+IG51bVNhbXBsZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKQorICAgIHsKKyAgICAgICAgTWV0cmljcy5yZW1vdmUoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKG5hbWVQcmVmaXggKyAiTWluIikpOworICAgICAgICBNZXRyaWNzLnJlbW92ZShmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUobmFtZVByZWZpeCArICJNYXgiKSk7CisgICAgICAgIE1ldHJpY3MucmVtb3ZlKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZShuYW1lUHJlZml4ICsgIkF2ZyIpKTsKKyAgICAgICAgTWV0cmljcy5yZW1vdmUoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKG5hbWVQcmVmaXggKyAiU3RkRGV2IikpOworICAgICAgICBNZXRyaWNzLnJlbW92ZShmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUobmFtZVByZWZpeCArICJOdW1TYW1wbGVzIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAgIHN1bSA9IDA7CisgICAgICAgIHN1bVNxdWFyZXMgPSAwOworICAgICAgICBtYXggPSBMb25nLk1JTl9WQUxVRTsKKyAgICAgICAgbWluID0gTG9uZy5NQVhfVkFMVUU7CisgICAgICAgIG51bVNhbXBsZXMgPSAwOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShsb25nIHZhbHVlKQorICAgIHsKKyAgICAgICAgbWF4ID0gbWF4ID4gdmFsdWUgPyBtYXggOiB2YWx1ZTsKKyAgICAgICAgbWluID0gbWluIDwgdmFsdWUgPyBtaW4gOiB2YWx1ZTsKKyAgICAgICAgc3VtICs9IHZhbHVlOworICAgICAgICBzdW1TcXVhcmVzICs9IHZhbHVlICogdmFsdWU7CisgICAgICAgIG51bVNhbXBsZXMrKzsKKyAgICB9CisKKyAgICBwcml2YXRlIERvdWJsZSBzdGRkZXYoKQorICAgIHsKKyAgICAgICAgaWYgKG51bVNhbXBsZXMgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgYXZnU3F1YXJlID0gKChkb3VibGUpIHN1bVNxdWFyZXMpIC8gbnVtU2FtcGxlczsKKyAgICAgICAgICAgIGRvdWJsZSBhdmcgPSAoKGRvdWJsZSkgc3VtKSAvIG51bVNhbXBsZXM7CisgICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KGF2Z1NxdWFyZSAtIGF2ZyAqIGF2Zyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMC4wOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gInsiICsKKyAgICAgICAgICAgICAgICJtaW49IiArIG1pbiArCisgICAgICAgICAgICAgICAiLCBtYXg9IiArIG1heCArCisgICAgICAgICAgICAgICAiLCBhdmc9IiArIChzdW0gKiAxLjAgLyBudW1TYW1wbGVzKSArCisgICAgICAgICAgICAgICAiLCBzdGREZXY9IiArIHN0ZGRldigpICsKKyAgICAgICAgICAgICAgICIsIG51bVNhbXBsZXM9IiArIG51bVNhbXBsZXMgKworICAgICAgICAgICAgICAgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvU2FtcGxlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9TYW1wbGVyLmphdmEKaW5kZXggYjNkMGYyMS4uNmViODUwOCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9TYW1wbGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9TYW1wbGVyLmphdmEKQEAgLTE3LDEwICsxNywxMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M7CiAKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKQEAgLTM0LDkgKzM2LDYxIEBACiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTYW1wbGVyPFQ+CiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBESVNBQkxFRCA9IC0xTDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpRnVuY3Rpb248U2FtcGxlclR5cGUsIFNhbXBsaW5nTWFuYWdlci5SZXN1bHRCdWlsZGVyLCBTYW1wbGluZ01hbmFnZXIuUmVzdWx0QnVpbGRlcj4KKyAgICAgICAgRnJlcXVlbmN5U2FtcGxlckZvbWF0dGVyID0gKHR5cGUsIHJlc3VsdEJ1aWxkZXIpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1aWxkZXIuZm9yVHlwZSh0eXBlLCB0eXBlLmRlc2NyaXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbigiVGFibGUiLCAidGFibGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbigiUGFydGl0aW9uIiwgInZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oIkNvdW50IiwgImNvdW50IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oIisvLSIsICJlcnJvciIpOworCiAgICAgcHVibGljIGVudW0gU2FtcGxlclR5cGUKICAgICB7Ci0gICAgICAgIFJFQURTLCBXUklURVMsIExPQ0FMX1JFQURfVElNRSwgV1JJVEVfU0laRSwgQ0FTX0NPTlRFTlRJT05TCisgICAgICAgIFJFQURTKCJGcmVxdWVuY3kgb2YgcmVhZHMgYnkgcGFydGl0aW9uIiwgRnJlcXVlbmN5U2FtcGxlckZvbWF0dGVyKSwKKyAgICAgICAgV1JJVEVTKCJGcmVxdWVuY3kgb2Ygd3JpdGVzIGJ5IHBhcnRpdGlvbiIsIEZyZXF1ZW5jeVNhbXBsZXJGb21hdHRlciksCisgICAgICAgIExPQ0FMX1JFQURfVElNRSgiTG9uZ2VzdCByZWFkIHF1ZXJ5IHRpbWVzIiwgKChzYW1wbGVyVHlwZSwgcmVzdWx0QnVpbGRlcikgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVpbGRlci5mb3JUeXBlKHNhbXBsZXJUeXBlLCBzYW1wbGVyVHlwZS5kZXNjcmlwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oIlF1ZXJ5IiwgInZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oIk1pY3Jvc2Vjb25kcyIsICJjb3VudCIpKSksCisgICAgICAgIFJFQURfUk9XX0NPVU5UKCJQYXJ0aXRpb25zIHJlYWQgd2l0aCB0aGUgbW9zdCByb3dzIiwgKChzYW1wbGVyVHlwZSwgcmVzdWx0QnVpbGRlcikgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1aWxkZXIuZm9yVHlwZShzYW1wbGVyVHlwZSwgc2FtcGxlclR5cGUuZGVzY3JpcHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCJUYWJsZSIsICJ0YWJsZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCJQYXJ0aXRpb24iLCAidmFsdWUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbigiUm93cyIsICJjb3VudCIpKSksCisKKyAgICAgICAgUkVBRF9UT01CU1RPTkVfQ09VTlQoIlBhcnRpdGlvbnMgcmVhZCB3aXRoIHRoZSBtb3N0IHRvbWJzdG9uZXMiLCAoKHNhbXBsZXJUeXBlLCByZXN1bHRCdWlsZGVyKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QnVpbGRlci5mb3JUeXBlKHNhbXBsZXJUeXBlLCBzYW1wbGVyVHlwZS5kZXNjcmlwdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCJUYWJsZSIsICJ0YWJsZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbigiUGFydGl0aW9uIiwgInZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCJUb21ic3RvbmVzIiwgImNvdW50IikpKSwKKworICAgICAgICBSRUFEX1NTVEFCTEVfQ09VTlQoIlBhcnRpdGlvbnMgcmVhZCB3aXRoIHRoZSBtb3N0IHNzdGFibGVzIiwgKChzYW1wbGVyVHlwZSwgcmVzdWx0QnVpbGRlcikgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRCdWlsZGVyLmZvclR5cGUoc2FtcGxlclR5cGUsIHNhbXBsZXJUeXBlLmRlc2NyaXB0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1uKCJUYWJsZSIsICJ0YWJsZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oIlBhcnRpdGlvbiIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oIlNTVGFibGVzIiwgImNvdW50IikpKSwKKyAgICAgICAgV1JJVEVfU0laRSgiTWF4IG11dGF0aW9uIHNpemUgYnkgcGFydGl0aW9uIiwgKChzYW1wbGVyVHlwZSwgcmVzdWx0QnVpbGRlcikgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEJ1aWxkZXIuZm9yVHlwZShzYW1wbGVyVHlwZSwgc2FtcGxlclR5cGUuZGVzY3JpcHRpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbigiVGFibGUiLCAidGFibGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb2x1bW4oIlBhcnRpdGlvbiIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbHVtbigiQnl0ZXMiLCAiY291bnQiKSkpLAorICAgICAgICBDQVNfQ09OVEVOVElPTlMoIkZyZXF1ZW5jeSBvZiBDQVMgY29udGVudGlvbiBieSBwYXJ0aXRpb24iLCBGcmVxdWVuY3lTYW1wbGVyRm9tYXR0ZXIpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIEJpRnVuY3Rpb248U2FtcGxlclR5cGUsIFNhbXBsaW5nTWFuYWdlci5SZXN1bHRCdWlsZGVyLCBTYW1wbGluZ01hbmFnZXIuUmVzdWx0QnVpbGRlcj4gZm9ybWF0dGVyOworCisgICAgICAgIFNhbXBsZXJUeXBlKFN0cmluZyBkZXNjcmlwdGlvbiwgQmlGdW5jdGlvbjxTYW1wbGVyVHlwZSwgU2FtcGxpbmdNYW5hZ2VyLlJlc3VsdEJ1aWxkZXIsIFNhbXBsaW5nTWFuYWdlci5SZXN1bHRCdWlsZGVyPiBmb3JtYXR0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIHRoaXMuZm9ybWF0dGVyID0gZm9ybWF0dGVyOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBmb3JtYXQoU2FtcGxpbmdNYW5hZ2VyLlJlc3VsdEJ1aWxkZXIgcmVzdWx0QnVpbGRlciwgUHJpbnRTdHJlYW0gcHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcm1hdHRlci5hcHBseSh0aGlzLCByZXN1bHRCdWlsZGVyKS5wcmludChwcyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKQEAgLTUwLDYgKzEwNCw4IEBACiAgICAgICAgICAgICAud2l0aFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlcigocnVubmFibGUsIGV4ZWN1dG9yKSAtPiBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCkubWV0cmljcy5yZWNvcmRTZWxmRHJvcHBlZE1lc3NhZ2UoVmVyYi5fU0FNUExFKSkKICAgICAgICAgICAgIC5idWlsZCgpOwogCisgICAgcHJpdmF0ZSBsb25nIGVuZFRpbWVOYW5vcyA9IC0xOworCiAgICAgcHVibGljIHZvaWQgYWRkU2FtcGxlKGZpbmFsIFQgaXRlbSwgZmluYWwgaW50IHZhbHVlKQogICAgIHsKICAgICAgICAgaWYgKGlzRW5hYmxlZCgpKQpAQCAtNTgsMTAgKzExNCw1MyBAQAogCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5zZXJ0KFQgaXRlbSwgbG9uZyB2YWx1ZSk7CiAKLSAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0VuYWJsZWQoKTsKKyAgICAvKioKKyAgICAgKiBBIHNhbXBsZXIgaXMgZW5hYmxlZCBiZXR3ZWVuIHtAbGluayB0aGlzI2JlZ2luU2FtcGxpbmd9IGFuZCB7QGxpbmsgdGhpcyNmaW5pc2hTYW1wbGluZ30KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNhbXBsZXIgaXMgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVuZFRpbWVOYW5vcyAhPSBESVNBQkxFRDsKKyAgICB9CiAKLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBiZWdpblNhbXBsaW5nKGludCBjYXBhY2l0eSwgaW50IGR1cmF0aW9uTWlsbGlzKTsKKyAgICBwdWJsaWMgdm9pZCBkaXNhYmxlKCkKKyAgICB7CisgICAgICAgIGVuZFRpbWVOYW5vcyA9IERJU0FCTEVEOworICAgIH0KIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2FtcGxlciBpcyBhY3RpdmUuCisgICAgICogQSBzYW1wbGVyIGlzIGFjdGl2ZSBvbmx5IGlmIGl0IGlzIGVuYWJsZWQgYW5kIHRoZSBjdXJyZW50IHRpbWUgaXMgd2l0aGluIHRoZSBgZHVyYXRpb25NaWxsaXNgIHdoZW4gYmVnaW5uaW5nIHNhbXBsaW5nLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBpc0VuYWJsZWQoKSAmJiBjbG9jay5ub3coKSA8PSBlbmRUaW1lTmFub3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBlbmQgdGltZSBmb3IgdGhlIHNhbXBsZXIuIEltcGxpY2l0bHksIGNhbGxpbmcgdGhpcyBtZXRob2QgZW5hYmxlcyB0aGUgc2FtcGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVFbmRUaW1lKGxvbmcgZW5kVGltZU1pbGxpcykKKyAgICB7CisgICAgICAgIHRoaXMuZW5kVGltZU5hbm9zID0gZW5kVGltZU1pbGxpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCZWdpbiBzYW1wbGluZyB3aXRoIHRoZSBjb25maWd1cmVkIGNhcGFjaXR5IGFuZCBkdXJhdGlvbgorICAgICAqIEBwYXJhbSBjYXBhY2l0eSBOdW1iZXIgb2Ygc2FtcGxlIGl0ZW1zIHRvIGtlZXAgaW4gbWVtb3J5LCB0aGUgbG93ZXIgdGhpcyBpcworICAgICAqICAgICAgICAgICAgICAgICB0aGUgbGVzcyBhY2N1cmF0ZSByZXN1bHRzIGFyZS4gRm9yIGJlc3QgcmVzdWx0cyB1c2UgdmFsdWUKKyAgICAgKiAgICAgICAgICAgICAgICAgY2xvc2UgdG8gY2FyZGluYWxpdHksIGJ1dCB1bmRlcnN0YW5kIHRoZSBtZW1vcnkgdHJhZGUgb2Zmcy4KKyAgICAgKiBAcGFyYW0gZHVyYXRpb25NaWxsaXMgVXBwZXJib3VuZCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgZm9yIHNhbXBsaW5nLiBUaGUgc2FtcGxlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBzdG9wcyBhY2NlcHRpbmcgbmV3IHNhbXBsZXMgYWZ0ZXIgZXhjZWVkaW5nIHRoZSBkdXJhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBldmVuIGlmIHtAbGluayAjZmluaXNoU2FtcGxpbmcoaW50KX19IGlzIG5vdCBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgYmVnaW5TYW1wbGluZyhpbnQgY2FwYWNpdHksIGxvbmcgZHVyYXRpb25NaWxsaXMpOworCisgICAgLyoqCisgICAgICogU3RvcCBzYW1wbGluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHRzCisgICAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgdGhlIHNhbXBsZXMgcmVxdWVzdGVkIHRvIHJldHJpZXZlIGZyb20gdGhlIHNhbXBsZXIKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBzYW1wbGVzLCB0aGUgc2l6ZSBpcyB0aGUgbWluaW11bSBvZiB0aGUgdG90YWwgc2FtcGxlcyBhbmQge0BwYXJhbSBjb3VudH0uCisgICAgICovCiAgICAgcHVibGljIGFic3RyYWN0IExpc3Q8U2FtcGxlPFQ+PiBmaW5pc2hTYW1wbGluZyhpbnQgY291bnQpOwogCiAgICAgcHVibGljIGFic3RyYWN0IFN0cmluZyB0b1N0cmluZyhUIHZhbHVlKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvU2FtcGxpbmdNYW5hZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1NhbXBsaW5nTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZDhkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1NhbXBsaW5nTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMzkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVEYXRhOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLk9wZW5EYXRhRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLm5vZGV0b29sLlByb2ZpbGVMb2FkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLm5vZGV0b29sLmZvcm1hdHRlci5UYWJsZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKKworcHVibGljIGNsYXNzIFNhbXBsaW5nTWFuYWdlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTYW1wbGluZ01hbmFnZXIuY2xhc3MpOworCisgICAgLyoqCisgICAgICogVHJhY2tzIHRoZSBhY3RpdmUgc2NoZWR1bGVkIHNhbXBsaW5nIHRhc2tzLgorICAgICAqIFRoZSBrZXkgb2YgdGhlIG1hcCBpcyBhIHtAbGluayBKb2JJZH0sIHdoaWNoIGlzIGVmZmVjdGl2ZWx5IGEga2V5c3BhY2UgKyB0YWJsZSBhYnN0cmFjdGVkIGJlaGluZCBzb21lIHN5bnRhY3RpYworICAgICAqIHN1Z2FyIHNvIHdlIGNhbiB1c2UgdGhlbSB3aXRob3V0IHBlcHBlcmluZyBQYWlycyB0aHJvdWdob3V0IHRoaXMgY2xhc3MuIEJvdGgga2V5c3BhY2UgYW5kIHRhYmxlIGFyZSBudWxsYWJsZSwKKyAgICAgKiBhIHBhcmFkaWdtIHdlIGluaGVyaXQgZnJvbSB7QGxpbmsgUHJvZmlsZUxvYWR9IHNvIG5lZWQgdG8gYWNjb21tb2RhdGUgaGVyZS4KKyAgICAgKgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgbWFwIGlzIHRoZSBjdXJyZW50IHNjaGVkdWxlZCB0YXNrLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8Sm9iSWQsIEZ1dHVyZTw/Pj4gYWN0aXZlU2FtcGxpbmdUYXNrcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisKKyAgICAvKiogVGFza3MgdGhhdCBhcmUgYWN0aXZlbHkgYmVpbmcgY2FuY2VsbGVkICovCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Sm9iSWQ+IGNhbmNlbGluZ1Rhc2tzID0gQ29uY3VycmVudEhhc2hNYXAubmV3S2V5U2V0KCk7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRSZXN1bHQoUmVzdWx0QnVpbGRlciByZXN1bHRCdWlsZGVyKQorICAgIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHRyeSAoUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0oYmFvcykpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoU2FtcGxlci5TYW1wbGVyVHlwZSBzYW1wbGVyVHlwZSA6IFNhbXBsZXIuU2FtcGxlclR5cGUudmFsdWVzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2FtcGxlclR5cGUuZm9ybWF0KHJlc3VsdEJ1aWxkZXIsIHBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBiYW9zLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPENvbHVtbkZhbWlseVN0b3JlPiBnZXRUYWJsZXMoU3RyaW5nIGtzLCBTdHJpbmcgdGFibGUpCisgICAgeworICAgICAgICAvLyBudWxsIEtFWVNQQUNFID09IGFsbCB0aGUgdGFibGVzCisgICAgICAgIGlmIChrcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIENvbHVtbkZhbWlseVN0b3JlLmFsbCgpOworCisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrcyk7CisKKyAgICAgICAgLy8gS0VZU1BBQ0UgZGVmaW5lZCB3L251bGwgdGFibGUgPT0gYWxsIHRoZSB0YWJsZXMgb24gdGhhdCBLRVlTUEFDRQorICAgICAgICBpZiAodGFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZXMoKTsKKyAgICAgICAgLy8gT3Igd2UganVzdCBoYXZlIGEgc3BlY2lmaWMga3MrdGFibGUgY29tYm8gd2UncmUgbG9va2luZyB0byBwcm9maWxlCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKHRhYmxlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgdGhlIHNhbXBsZXJzIGZvciB0aGUga2V5c3BhY2UgYW5kIHRhYmxlLgorICAgICAqIEBwYXJhbSBrcyBLZXlzcGFjZS4gTnVsbGFibGUuIElmIG51bGwsIHRoZSBzY2hlZHVsZWQgc2FtcGxpbmcgaXMgb24gYWxsIGtleXNwYWNlcyBhbmQgdGFibGVzCisgICAgICogQHBhcmFtIHRhYmxlIE51bGxhYmxlLiBJZiBudWxsLCB0aGUgc2NoZWR1bGVkIHNhbXBsaW5nIGlzIG9uIGFsbCB0YWJsZXMgb2YgdGhlIHNwZWNpZmllZCBrZXlzcGFjZQorICAgICAqIEBwYXJhbSBkdXJhdGlvbiBEdXJhdGlvbiBvZiBlYWNoIHNjaGVkdWxlZCBzYW1wbGluZyBqb2IgaW4gbWlsbGlzZWNvbmRzCisgICAgICogQHBhcmFtIGludGVydmFsIEludGVydmFsIG9mIGVhY2ggc2NoZWR1bGVkIHNhbXBsaW5nIGpvYiBpbiBtaWxsaXNlY29uZHMKKyAgICAgKiBAcGFyYW0gY2FwYWNpdHkgQ2FwYWNpdHkgb2YgdGhlIHNhbXBsZXIsIGhpZ2hlciBmb3IgbW9yZSBhY2N1cmFjeQorICAgICAqIEBwYXJhbSBjb3VudCBOdW1iZXIgb2YgdGhlIHRvcCBzYW1wbGVzIHRvIGxpc3QKKyAgICAgKiBAcGFyYW0gc2FtcGxlcnMgYSBsaXN0IG9mIHNhbXBsZXJzIHRvIGVuYWJsZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2NoZWR1bGVkIHNhbXBsaW5nIGlzIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LiBPdGhlcndpc2UgcmV0dXJuIGZhc2xlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoU3RyaW5nIGtzLCBTdHJpbmcgdGFibGUsIGludCBkdXJhdGlvbiwgaW50IGludGVydmFsLCBpbnQgY2FwYWNpdHksIGludCBjb3VudCwgTGlzdDxTdHJpbmc+IHNhbXBsZXJzKQorICAgIHsKKyAgICAgICAgSm9iSWQgam9iSWQgPSBuZXcgSm9iSWQoa3MsIHRhYmxlKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlJlZ2lzdGVyaW5nIHNhbXBsZXJzIHt9IGZvciB7fSIsIHNhbXBsZXJzLCBqb2JJZCk7CisKKyAgICAgICAgaWYgKCFjYW5TY2hlZHVsZShqb2JJZCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJVbmFibGUgdG8gcmVnaXN0ZXIge30gZHVlIHRvIGV4aXN0aW5nIG9uZ29pbmcgc2FtcGxpbmcuIiwgam9iSWQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gJ2JlZ2luJyB0YXNrcyBhcmUgY2hhaW5lZCB0byBmaW5pc2ggYmVmb3JlIHRoZWlyIHBhaXJlZCAnZmluaXNoJworICAgICAgICBhY3RpdmVTYW1wbGluZ1Rhc2tzLnB1dChqb2JJZCwgU2NoZWR1bGVkRXhlY3V0b3JzLm9wdGlvbmFsVGFza3Muc3VibWl0KAorICAgICAgICBjcmVhdGVTYW1wbGluZ0JlZ2luUnVubmFibGUoam9iSWQsIGdldFRhYmxlcyhrcywgdGFibGUpLCBkdXJhdGlvbiwgaW50ZXJ2YWwsIGNhcGFjaXR5LCBjb3VudCwgc2FtcGxlcnMpCisgICAgICAgICkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB1bnJlZ2lzdGVyKFN0cmluZyBrcywgU3RyaW5nIHRhYmxlKQorICAgIHsKKyAgICAgICAgLy8gdW5yZWdpc3RlciBhbGwKKyAgICAgICAgLy8gcmV0dXJuIHRydWUgd2hlbiBhbGwgdGFza3MgYXJlIGNhbmNlbGxlZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgaWYgKGtzID09IG51bGwgJiYgdGFibGUgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbGVhbiByZXMgPSB0cnVlOworICAgICAgICAgICAgZm9yIChKb2JJZCBpZCA6IGFjdGl2ZVNhbXBsaW5nVGFza3Mua2V5U2V0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzID0gY2FuY2VsVGFzayhpZCkgJiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNhbmNlbFRhc2sobmV3IEpvYklkKGtzLCB0YWJsZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBhbGxKb2JzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBqb2JJZHMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAubWFwKEpvYklkOjp0b1N0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZXQ8Sm9iSWQ+IGpvYklkcygpCisgICAgeworICAgICAgICBTZXQ8Sm9iSWQ+IGFsbCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgYWxsLmFkZEFsbChhY3RpdmVTYW1wbGluZ1Rhc2tzLmtleVNldCgpKTsKKyAgICAgICAgYWxsLmFkZEFsbChjYW5jZWxpbmdUYXNrcyk7CisgICAgICAgIHJldHVybiBhbGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgaWYgYSBzY2hlZHVsZSBvbiB0aGUga2V5c3BhY2UgYW5kIHRhYmxlIGlzIHBlcm1pdHRlZAorICAgICAqIEBwYXJhbSBqb2JJZAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBwb3NzaWJsZSwgZmFsc2UgaWYgdGhlcmUgYXJlIG92ZXJsYXBwaW5nIHRhYmxlcyBhbHJlYWR5IGJlaW5nIHNhbXBsZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY2FuU2NoZWR1bGUoSm9iSWQgam9iSWQpCisgICAgeworICAgICAgICBTZXQ8Sm9iSWQ+IGFsbEpvYklkcyA9IGpvYklkcygpOworICAgICAgICAvLyBUaGVyZSBpcyBhIHNjaGVkdWxlIHRoYXQgd29ya3Mgb24gYWxsIHRhYmxlcy4gT3ZlcmxhcHBpbmcgZ3VhcmFudGVlZC4KKyAgICAgICAgaWYgKGFsbEpvYklkcy5jb250YWlucyhKb2JJZC5BTExfS1NfQU5EX1RBQkxFUykgfHwgKCFhbGxKb2JJZHMuaXNFbXB0eSgpICYmIGpvYklkLmVxdWFscyhKb2JJZC5BTExfS1NfQU5EX1RBQkxFUykpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAvLyB0aGVyZSBpcyBhbiBleGFjdGx5IGR1cGxpY2F0ZWQgc2NoZWR1bGUKKyAgICAgICAgZWxzZSBpZiAoYWxsSm9iSWRzLmNvbnRhaW5zKGpvYklkKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGhhcyBubyBvdmVybGFwcGluZyB0YWJsZXMgdW5kZXIgdGhlIGtleXNwYWNlCisgICAgICAgICAgICByZXR1cm4gIWFsbEpvYklkcy5jb250YWlucyhKb2JJZC5jcmVhdGVGb3JBbGxUYWJsZXMoam9iSWQua2V5c3BhY2UpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgYSB0YXNrIGJ5IGl0cyBpZC4gVGhlIGNvcnJlc3BvbmRpbmcgdGFzayB3aWxsIGJlIHN0b3BwZWQgb25jZSBpdHMgZmluYWwgc2FtcGxpbmcgY29tcGxldGVzLgorICAgICAqIEBwYXJhbSBqb2JJZAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdGFzayBleGlzdHMsIGZhbHNlIGlmIG5vdCBmb3VuZAorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjYW5jZWxUYXNrKEpvYklkIGpvYklkKQorICAgIHsKKyAgICAgICAgRnV0dXJlPD8+IHRhc2sgPSBhY3RpdmVTYW1wbGluZ1Rhc2tzLnJlbW92ZShqb2JJZCk7CisgICAgICAgIGlmICh0YXNrICE9IG51bGwpCisgICAgICAgICAgICBjYW5jZWxpbmdUYXNrcy5hZGQoam9iSWQpOworICAgICAgICByZXR1cm4gdGFzayAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlZ2luIHNhbXBsaW5nIGFuZCBzY2hlZHVsZSBhIGZ1dHVyZSB0YXNrIHRvIGVuZCB0aGUgc2FtcGxpbmcgdGFzaworICAgICAqLworICAgIHByaXZhdGUgUnVubmFibGUgY3JlYXRlU2FtcGxpbmdCZWdpblJ1bm5hYmxlKEpvYklkIGpvYklkLCBJdGVyYWJsZTxDb2x1bW5GYW1pbHlTdG9yZT4gdGFibGVzLCBpbnQgZHVyYXRpb24sIGludCBpbnRlcnZhbCwgaW50IGNhcGFjaXR5LCBpbnQgY291bnQsIExpc3Q8U3RyaW5nPiBzYW1wbGVycykKKyAgICB7CisgICAgICAgIHJldHVybiAoKSAtPgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY2FuY2VsaW5nVGFza3MuY29udGFpbnMoam9iSWQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiVGhlIHNhbXBsaW5nIGpvYiBvZiB7fSBpcyBjdXJyZW50bHkgY2FuY2VsaW5nLiBOb3QgaXNzdWluZyBhIG5ldyBydW4uIiwgam9iSWQpOworICAgICAgICAgICAgICAgIGFjdGl2ZVNhbXBsaW5nVGFza3MucmVtb3ZlKGpvYklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gdGFibGVOYW1lcyA9IFN0cmVhbVN1cHBvcnQuc3RyZWFtKHRhYmxlcy5zcGxpdGVyYXRvcigpLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoY2ZzIC0+IFN0cmluZy5mb3JtYXQoIiVzLiVzIiwgY2ZzLmtleXNwYWNlLCBjZnMubmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTdGFydGluZyB0byBzYW1wbGUgdGFibGVzIHt9IHdpdGggdGhlIHNhbXBsZXJzIHt9IGZvciB7fSBtcyIsIHRhYmxlTmFtZXMsIHNhbXBsZXJzLCBkdXJhdGlvbik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBzYW1wbGVyIDogc2FtcGxlcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZnMgOiB0YWJsZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjZnMuYmVnaW5Mb2NhbFNhbXBsaW5nKHNhbXBsZXIsIGNhcGFjaXR5LCBkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgRnV0dXJlPD8+IGZ1dCA9IFNjaGVkdWxlZEV4ZWN1dG9ycy5vcHRpb25hbFRhc2tzLnNjaGVkdWxlKAorICAgICAgICAgICAgICAgIGNyZWF0ZVNhbXBsaW5nRW5kUnVubmFibGUoam9iSWQsIHRhYmxlcywgZHVyYXRpb24sIGludGVydmFsLCBjYXBhY2l0eSwgY291bnQsIHNhbXBsZXJzKSwKKyAgICAgICAgICAgICAgICBpbnRlcnZhbCwKKyAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgLy8gcmVhY2hlZCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJ1bm5hYmxlCisgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHJlZmVyZW5jZWQgZnV0dXJlIHRvIFNhbXBsaW5nRmluaXNoCisgICAgICAgICAgICBhY3RpdmVTYW1wbGluZ1Rhc2tzLnB1dChqb2JJZCwgZnV0KTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5pc2ggdGhlIHNhbXBsaW5nIGFuZCBiZWdpbiBhIG5ldyBvbmUgaW1tZWRpYXRlbHkgYWZ0ZXIuCisgICAgICoKKyAgICAgKiBOT1RFOiBEbyBub3QgY2FsbCB0aGlzIG91dHNpZGUgdGhlIGNvbnRleHQgb2Yge0BsaW5rIHRoaXMjY3JlYXRlU2FtcGxpbmdCZWdpblJ1bm5hYmxlfSwgYXMgd2UgbmVlZCB0byBwcmVzZXJ2ZQorICAgICAqIG9yZGVyaW5nIGJldHdlZW4gYSAic3RhcnQiIGFuZCAiZW5kIiBydW5uYWJsZQorICAgICAqLworICAgIHByaXZhdGUgUnVubmFibGUgY3JlYXRlU2FtcGxpbmdFbmRSdW5uYWJsZShKb2JJZCBqb2JJZCwgSXRlcmFibGU8Q29sdW1uRmFtaWx5U3RvcmU+IHRhYmxlcywgaW50IGR1cmF0aW9uLCBpbnQgaW50ZXJ2YWwsIGludCBjYXBhY2l0eSwgaW50IGNvdW50LCBMaXN0PFN0cmluZz4gc2FtcGxlcnMpCisgICAgeworICAgICAgICByZXR1cm4gKCkgLT4KKyAgICAgICAgeworICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxDb21wb3NpdGVEYXRhPj4gcmVzdWx0cyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHNhbXBsZXIgOiBzYW1wbGVycykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMaXN0PENvbXBvc2l0ZURhdGE+IHRvcGsgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmcyA6IHRhYmxlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3BrLmFkZEFsbChjZnMuZmluaXNoTG9jYWxTYW1wbGluZyhzYW1wbGVyLCBjb3VudCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiRmFpbGVkIHRvIHJldHJpZXZlIHRoZSBzYW1wbGVkIGRhdGEuIEFib3J0IHRoZSBiYWNrZ3JvdW5kIHNhbXBsaW5nIGpvYjoge30uIiwgam9iSWQsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU2FtcGxpbmdUYXNrcy5yZW1vdmUoam9iSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsaW5nVGFza3MucmVtb3ZlKGpvYklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRvcGsuc29ydCgobGVmdCwgcmlnaHQpIC0+IExvbmcuY29tcGFyZSgobG9uZykgcmlnaHQuZ2V0KCJjb3VudCIpLCAobG9uZykgbGVmdC5nZXQoImNvdW50IikpKTsKKyAgICAgICAgICAgICAgICAvLyBzdWJsaXN0IGlzIG5vdCBzZXJpYWxpemFibGUgZm9yIGpteAorICAgICAgICAgICAgICAgIHRvcGsgPSBuZXcgQXJyYXlMaXN0PD4odG9way5zdWJMaXN0KDAsIE1hdGgubWluKHRvcGsuc2l6ZSgpLCBjb3VudCkpKTsKKyAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChzYW1wbGVyLCB0b3BrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF0b21pY0Jvb2xlYW4gZmlyc3QgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgICAgICAgICBSZXN1bHRCdWlsZGVyIHJiID0gbmV3IFJlc3VsdEJ1aWxkZXIoZmlyc3QsIHJlc3VsdHMsIHNhbXBsZXJzKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKGZvcm1hdFJlc3VsdChyYikpOworCisgICAgICAgICAgICAvLyBJZiBub2JvZHkgaGFzIGNhbmNlbGVkIHVzLCB3ZSBwaW5nLXBvbmcgYmFjayB0byBhICJiZWdpbiIgcnVubmFibGUgdG8gcnVuIGFub3RoZXIgcHJvZmlsZSBsb2FkCisgICAgICAgICAgICBpZiAoIWNhbmNlbGluZ1Rhc2tzLmNvbnRhaW5zKGpvYklkKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGdXR1cmU8Pz4gZnV0ID0gU2NoZWR1bGVkRXhlY3V0b3JzLm9wdGlvbmFsVGFza3Muc3VibWl0KAorICAgICAgICAgICAgICAgICAgICBjcmVhdGVTYW1wbGluZ0JlZ2luUnVubmFibGUoam9iSWQsIHRhYmxlcywgZHVyYXRpb24sIGludGVydmFsLCBjYXBhY2l0eSwgY291bnQsIHNhbXBsZXJzKSk7CisgICAgICAgICAgICAgICAgYWN0aXZlU2FtcGxpbmdUYXNrcy5wdXQoam9iSWQsIGZ1dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJZiBzb21lb25lICpoYXMqIGNhbmNlbGVkIHVzLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgcnVubmFibGUgZnJvbSBhY3RpdmVTYW1wbGluZyBhbmQgYWxzbyByZW1vdmUgdGhlCisgICAgICAgICAgICAvLyBjYW5jZWxsYXRpb24gc2VudGluZWwgc28gc3Vic2VxdWVudCByZS1zdWJtaXRzIG9mIHByb2ZpbGluZyBkb24ndCBnZXQgYmxvY2tlZCBpbW1lZGlhdGVseQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJUaGUgc2FtcGxpbmcgam9iIHt9IGhhcyBiZWVuIGNhbmNlbGxlZC4iLCBqb2JJZCk7CisgICAgICAgICAgICAgICAgYWN0aXZlU2FtcGxpbmdUYXNrcy5yZW1vdmUoam9iSWQpOworICAgICAgICAgICAgICAgIGNhbmNlbGluZ1Rhc2tzLnJlbW92ZShqb2JJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSm9iSWQKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSm9iSWQgQUxMX0tTX0FORF9UQUJMRVMgPSBuZXcgSm9iSWQobnVsbCwgbnVsbCk7CisKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBrZXlzcGFjZTsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyB0YWJsZTsKKworICAgICAgICBwdWJsaWMgSm9iSWQoU3RyaW5nIGtzLCBTdHJpbmcgdGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGtleXNwYWNlID0ga3M7CisgICAgICAgICAgICB0YWJsZSA9IHRiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBKb2JJZCBjcmVhdGVGb3JBbGxUYWJsZXMoU3RyaW5nIGtleXNwYWNlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpvYklkKGtleXNwYWNlLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1heWJlV2lsZENhcmQoa2V5c3BhY2UpICsgJy4nICsgbWF5YmVXaWxkQ2FyZCh0YWJsZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBtYXliZVdpbGRDYXJkKFN0cmluZyBpbnB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyAiKiIgOiBpbnB1dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgSm9iSWQgam9iSWQgPSAoSm9iSWQpIG87CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoa2V5c3BhY2UsIGpvYklkLmtleXNwYWNlKSAmJiBPYmplY3RzLmVxdWFscyh0YWJsZSwgam9iSWQudGFibGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKGtleXNwYWNlLCB0YWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3VsdEJ1aWxkZXIKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBTYW1wbGVyLlNhbXBsZXJUeXBlIHR5cGU7CisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247CisgICAgICAgIHByb3RlY3RlZCBBdG9taWNCb29sZWFuIGZpcnN0OworICAgICAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgTGlzdDxDb21wb3NpdGVEYXRhPj4gcmVzdWx0czsKKyAgICAgICAgcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiB0YXJnZXRzOworICAgICAgICBwcm90ZWN0ZWQgTGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gZGF0YUtleXM7CisKKyAgICAgICAgcHVibGljIFJlc3VsdEJ1aWxkZXIoQXRvbWljQm9vbGVhbiBmaXJzdCwgTWFwPFN0cmluZywgTGlzdDxDb21wb3NpdGVEYXRhPj4gcmVzdWx0cywgTGlzdDxTdHJpbmc+IHRhcmdldHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZmlyc3QgPSBmaXJzdDsKKyAgICAgICAgICAgIHRoaXMucmVzdWx0cyA9IHJlc3VsdHM7CisgICAgICAgICAgICB0aGlzLnRhcmdldHMgPSB0YXJnZXRzOworICAgICAgICAgICAgdGhpcy5kYXRhS2V5cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgdGhpcy5kYXRhS2V5cy5hZGQoUGFpci5jcmVhdGUoIiAgIiwgIiAgIikpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNhbXBsaW5nTWFuYWdlci5SZXN1bHRCdWlsZGVyIGZvclR5cGUoU2FtcGxlci5TYW1wbGVyVHlwZSB0eXBlLCBTdHJpbmcgZGVzY3JpcHRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIFNhbXBsaW5nTWFuYWdlci5SZXN1bHRCdWlsZGVyIHJiID0gbmV3IFNhbXBsaW5nTWFuYWdlci5SZXN1bHRCdWlsZGVyKGZpcnN0LCByZXN1bHRzLCB0YXJnZXRzKTsKKyAgICAgICAgICAgIHJiLnR5cGUgPSB0eXBlOworICAgICAgICAgICAgcmIuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICAgICAgICAgIHJldHVybiByYjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTYW1wbGluZ01hbmFnZXIuUmVzdWx0QnVpbGRlciBhZGRDb2x1bW4oU3RyaW5nIHRpdGxlLCBTdHJpbmcga2V5KQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmRhdGFLZXlzLmFkZChQYWlyLmNyZWF0ZSh0aXRsZSwga2V5KSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0KENvbXBvc2l0ZURhdGEgY2QsIFN0cmluZyBrZXkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjZC5jb250YWluc0tleShrZXkpKQorICAgICAgICAgICAgICAgIHJldHVybiBjZC5nZXQoa2V5KS50b1N0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByaW50KFByaW50U3RyZWFtIHBzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodGFyZ2V0cy5jb250YWlucyh0eXBlLnRvU3RyaW5nKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghZmlyc3QuZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgIHBzLnByaW50bG4oKTsKKyAgICAgICAgICAgICAgICBmaXJzdC5zZXQoZmFsc2UpOworICAgICAgICAgICAgICAgIHBzLnByaW50bG4oZGVzY3JpcHRpb24gKyAnOicpOworICAgICAgICAgICAgICAgIFRhYmxlQnVpbGRlciBvdXQgPSBuZXcgVGFibGVCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgb3V0LmFkZChkYXRhS2V5cy5zdHJlYW0oKS5tYXAocCAtPiBwLmxlZnQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkudG9BcnJheShuZXcgU3RyaW5nW10ge30pKTsKKyAgICAgICAgICAgICAgICBMaXN0PENvbXBvc2l0ZURhdGE+IHRvcGsgPSByZXN1bHRzLmdldCh0eXBlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGZvciAoQ29tcG9zaXRlRGF0YSBjZCA6IHRvcGspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQuYWRkKGRhdGFLZXlzLnN0cmVhbSgpLm1hcChwIC0+IGdldChjZCwgcC5yaWdodCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkudG9BcnJheShuZXcgU3RyaW5nW10ge30pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHRvcGsuc2l6ZSgpID09IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcy5wcmludGxuKCIgICBOb3RoaW5nIHJlY29yZGVkIGR1cmluZyBzYW1wbGluZyBwZXJpb2QuLi4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50VG8ocHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvU3RvcmFnZU1ldHJpY3MuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvU3RvcmFnZU1ldHJpY3MuamF2YQppbmRleCA5Mzk5YmE2Li5kODZhMjE0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1N0b3JhZ2VNZXRyaWNzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9TdG9yYWdlTWV0cmljcy5qYXZhCkBAIC0xNyw3ICsxNywxMiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M7CiAKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uVG9Mb25nRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OworCiBpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuQ291bnRlcjsKK2ltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5HYXVnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNhc3NhbmRyYU1ldHJpY3NSZWdpc3RyeS5NZXRyaWNzOwogCkBAIC0yOSw4ICszNCwyMyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1ldHJpY05hbWVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgRGVmYXVsdE5hbWVGYWN0b3J5KCJTdG9yYWdlIik7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvdW50ZXIgbG9hZCA9IE1ldHJpY3MuY291bnRlcihmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoIkxvYWQiKSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb3VudGVyIHVuY29tcHJlc3NlZExvYWQgPSBNZXRyaWNzLmNvdW50ZXIoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKCJVbmNvbXByZXNzZWRMb2FkIikpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBHYXVnZTxMb25nPiB1bnJlcGxpY2F0ZWRMb2FkID0KKyAgICAgICAgY3JlYXRlU3VtbWluZ0dhdWdlKCJVbnJlcGxpY2F0ZWRMb2FkIiwgbWV0cmljIC0+IG1ldHJpYy51bnJlcGxpY2F0ZWRMaXZlRGlza1NwYWNlVXNlZC5nZXRWYWx1ZSgpKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEdhdWdlPExvbmc+IHVucmVwbGljYXRlZFVuY29tcHJlc3NlZExvYWQgPQorICAgICAgICBjcmVhdGVTdW1taW5nR2F1Z2UoIlVucmVwbGljYXRlZFVuY29tcHJlc3NlZExvYWQiLCBtZXRyaWMgLT4gbWV0cmljLnVucmVwbGljYXRlZFVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkLmdldFZhbHVlKCkpOworCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb3VudGVyIHVuY2F1Z2h0RXhjZXB0aW9ucyA9IE1ldHJpY3MuY291bnRlcihmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoIkV4Y2VwdGlvbnMiKSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb3VudGVyIHRvdGFsSGludHNJblByb2dyZXNzICA9IE1ldHJpY3MuY291bnRlcihmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoIlRvdGFsSGludHNJblByb2dyZXNzIikpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ291bnRlciB0b3RhbEhpbnRzID0gTWV0cmljcy5jb3VudGVyKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZSgiVG90YWxIaW50cyIpKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvdW50ZXIgcmVwYWlyRXhjZXB0aW9ucyA9IE1ldHJpY3MuY291bnRlcihmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoIlJlcGFpckV4Y2VwdGlvbnMiKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBHYXVnZTxMb25nPiBjcmVhdGVTdW1taW5nR2F1Z2UoU3RyaW5nIG5hbWUsIFRvTG9uZ0Z1bmN0aW9uPEtleXNwYWNlTWV0cmljcz4gZXh0cmFjdG9yKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE1ldHJpY3MucmVnaXN0ZXIoZmFjdG9yeS5jcmVhdGVNZXRyaWNOYW1lKG5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBTdHJlYW1TdXBwb3J0LnN0cmVhbShLZXlzcGFjZS5hbGwoKS5zcGxpdGVyYXRvcigpLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBUb0xvbmcoa2V5c3BhY2UgLT4gZXh0cmFjdG9yLmFwcGx5QXNMb25nKGtleXNwYWNlLm1ldHJpYykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3VtKCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvVGFibGVNZXRyaWNzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1RhYmxlTWV0cmljcy5qYXZhCmluZGV4IDVlN2FiNzguLmY0YjkyMjEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvVGFibGVNZXRyaWNzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9UYWJsZU1ldHJpY3MuamF2YQpAQCAtMTcsMzMgKzE3LDQxIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUNST1NFQ09ORFM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2Fzc2FuZHJhTWV0cmljc1JlZ2lzdHJ5Lk1ldHJpY3M7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKLQogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7Ci1pbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuVGltZXI7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5BcnJheVV0aWxzOwogCitpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuQ291bnRlcjsKK2ltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5HYXVnZTsKK2ltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5IaXN0b2dyYW07CitpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuTWV0ZXI7CitpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuTWV0cmljOworaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLlRpbWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuTWVtdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlNTVGFibGVTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlZpZXc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuTWVtdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguU2Vjb25kYXJ5SW5kZXhNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5HYXVnZVByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuU2FtcGxlci5TYW1wbGVyVHlwZTsKQEAgLTUyLDEyICs2MCw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKLWltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5Db3VudGVyOwotaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkdhdWdlOwotaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkhpc3RvZ3JhbTsKLWltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5NZXRlcjsKLWltcG9ydCBjb20uY29kYWhhbGUubWV0cmljcy5NZXRyaWM7Ci1pbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuUmF0aW9HYXVnZTsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlDUk9TRUNPTkRTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNhc3NhbmRyYU1ldHJpY3NSZWdpc3RyeS5NZXRyaWNzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7CiAKIC8qKgogICogTWV0cmljcyBmb3Ige0BsaW5rIENvbHVtbkZhbWlseVN0b3JlfS4KQEAgLTEwMCw4ICsxMDUsMTAgQEAKICAgICBwdWJsaWMgZmluYWwgR2F1Z2U8TG9uZz4gZXN0aW1hdGVkUGFydGl0aW9uQ291bnQ7CiAgICAgLyoqIEhpc3RvZ3JhbSBvZiBlc3RpbWF0ZWQgbnVtYmVyIG9mIGNvbHVtbnMuICovCiAgICAgcHVibGljIGZpbmFsIEdhdWdlPGxvbmdbXT4gZXN0aW1hdGVkQ29sdW1uQ291bnRIaXN0b2dyYW07Ci0gICAgLyoqIEhpc3RvZ3JhbSBvZiB0aGUgbnVtYmVyIG9mIHNzdGFibGUgZGF0YSBmaWxlcyBhY2Nlc3NlZCBwZXIgcmVhZCAqLworICAgIC8qKiBIaXN0b2dyYW0gb2YgdGhlIG51bWJlciBvZiBzc3RhYmxlIGRhdGEgZmlsZXMgYWNjZXNzZWQgcGVyIHNpbmdsZSBwYXJ0aXRpb24gcmVhZCAqLwogICAgIHB1YmxpYyBmaW5hbCBUYWJsZUhpc3RvZ3JhbSBzc3RhYmxlc1BlclJlYWRIaXN0b2dyYW07CisgICAgLyoqIEhpc3RvZ3JhbSBvZiB0aGUgbnVtYmVyIG9mIHNzdGFibGUgZGF0YSBmaWxlcyBhY2Nlc3NlZCBwZXIgcGFydGl0aW9uIHJhbmdlIHJlYWQgKi8KKyAgICBwdWJsaWMgZmluYWwgVGFibGVIaXN0b2dyYW0gc3N0YWJsZXNQZXJSYW5nZVJlYWRIaXN0b2dyYW07CiAgICAgLyoqIChMb2NhbCkgcmVhZCBtZXRyaWNzICovCiAgICAgcHVibGljIGZpbmFsIExhdGVuY3lNZXRyaWNzIHJlYWRMYXRlbmN5OwogICAgIC8qKiAoTG9jYWwpIHJhbmdlIHNsaWNlIG1ldHJpY3MgKi8KQEAgLTEyMCw4ICsxMjcsMTQgQEAKICAgICBwdWJsaWMgZmluYWwgR2F1Z2U8SW50ZWdlcj4gbGl2ZVNTVGFibGVDb3VudDsKICAgICAvKiogTnVtYmVyIG9mIFNTVGFibGVzIHdpdGggb2xkIHZlcnNpb24gb24gZGlzayBmb3IgdGhpcyBDRiAqLwogICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxJbnRlZ2VyPiBvbGRWZXJzaW9uU1NUYWJsZUNvdW50OworICAgIC8qKiBNYXhpbXVtIGR1cmF0aW9uIG9mIGFuIFNTVGFibGUgZm9yIHRoaXMgdGFibGUsIGNvbXB1dGVkIGFzIG1heFRpbWVzdGFtcCAtIG1pblRpbWVzdGFtcCovCisgICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IG1heFNTVGFibGVEdXJhdGlvbjsKKyAgICAvKiogTWF4aW11bSBzaXplIG9mIFNTVGFibGUgb2YgdGhpcyB0YWJsZSAtIHRoZSBwaHlzaWNhbCBzaXplIG9uIGRpc2sgb2YgYWxsIGNvbXBvbmVudHMgZm9yIHN1Y2ggU1NUYWJsZSBpbiBieXRlcyovCisgICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IG1heFNTVGFibGVTaXplOwogICAgIC8qKiBEaXNrIHNwYWNlIHVzZWQgYnkgU1NUYWJsZXMgYmVsb25naW5nIHRvIHRoaXMgdGFibGUgKi8KICAgICBwdWJsaWMgZmluYWwgQ291bnRlciBsaXZlRGlza1NwYWNlVXNlZDsKKyAgICAvKiogVW5jb21wcmVzc2VkL2xvZ2ljYWwgZGlzayBzcGFjZSB1c2VkIGJ5IFNTVGFibGVzIGJlbG9uZ2luZyB0byB0aGlzIHRhYmxlICovCisgICAgcHVibGljIGZpbmFsIENvdW50ZXIgdW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQ7CiAgICAgLyoqIFRvdGFsIGRpc2sgc3BhY2UgdXNlZCBieSBTU1RhYmxlcyBiZWxvbmdpbmcgdG8gdGhpcyB0YWJsZSwgaW5jbHVkaW5nIG9ic29sZXRlIG9uZXMgd2FpdGluZyB0byBiZSBHQydkICovCiAgICAgcHVibGljIGZpbmFsIENvdW50ZXIgdG90YWxEaXNrU3BhY2VVc2VkOwogICAgIC8qKiBTaXplIG9mIHRoZSBzbWFsbGVzdCBjb21wYWN0ZWQgcGFydGl0aW9uICovCkBAIC0xMzAsMjQgKzE0Myw4IEBACiAgICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IG1heFBhcnRpdGlvblNpemU7CiAgICAgLyoqIFNpemUgb2YgdGhlIHNtYWxsZXN0IGNvbXBhY3RlZCBwYXJ0aXRpb24gKi8KICAgICBwdWJsaWMgZmluYWwgR2F1Z2U8TG9uZz4gbWVhblBhcnRpdGlvblNpemU7Ci0gICAgLyoqIE51bWJlciBvZiBmYWxzZSBwb3NpdGl2ZXMgaW4gYmxvb20gZmlsdGVyICovCi0gICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IGJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXM7Ci0gICAgLyoqIE51bWJlciBvZiBmYWxzZSBwb3NpdGl2ZXMgaW4gYmxvb20gZmlsdGVyIGZyb20gbGFzdCByZWFkICovCi0gICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IHJlY2VudEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXM7Ci0gICAgLyoqIEZhbHNlIHBvc2l0aXZlIHJhdGlvIG9mIGJsb29tIGZpbHRlciAqLwotICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxEb3VibGU+IGJsb29tRmlsdGVyRmFsc2VSYXRpbzsKLSAgICAvKiogRmFsc2UgcG9zaXRpdmUgcmF0aW8gb2YgYmxvb20gZmlsdGVyIGZyb20gbGFzdCByZWFkICovCi0gICAgcHVibGljIGZpbmFsIEdhdWdlPERvdWJsZT4gcmVjZW50Qmxvb21GaWx0ZXJGYWxzZVJhdGlvOwotICAgIC8qKiBEaXNrIHNwYWNlIHVzZWQgYnkgYmxvb20gZmlsdGVyICovCi0gICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IGJsb29tRmlsdGVyRGlza1NwYWNlVXNlZDsKLSAgICAvKiogT2ZmIGhlYXAgbWVtb3J5IHVzZWQgYnkgYmxvb20gZmlsdGVyICovCi0gICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IGJsb29tRmlsdGVyT2ZmSGVhcE1lbW9yeVVzZWQ7Ci0gICAgLyoqIE9mZiBoZWFwIG1lbW9yeSB1c2VkIGJ5IGluZGV4IHN1bW1hcnkgKi8KLSAgICBwdWJsaWMgZmluYWwgR2F1Z2U8TG9uZz4gaW5kZXhTdW1tYXJ5T2ZmSGVhcE1lbW9yeVVzZWQ7CiAgICAgLyoqIE9mZiBoZWFwIG1lbW9yeSB1c2VkIGJ5IGNvbXByZXNzaW9uIG1ldGEgZGF0YSovCiAgICAgcHVibGljIGZpbmFsIEdhdWdlPExvbmc+IGNvbXByZXNzaW9uTWV0YWRhdGFPZmZIZWFwTWVtb3J5VXNlZDsKLSAgICAvKiogS2V5IGNhY2hlIGhpdCByYXRlICBmb3IgdGhpcyBDRiAqLwotICAgIHB1YmxpYyBmaW5hbCBHYXVnZTxEb3VibGU+IGtleUNhY2hlSGl0UmF0ZTsKICAgICAvKiogVG9tYnN0b25lcyBzY2FubmVkIGluIHF1ZXJpZXMgb24gdGhpcyBDRiAqLwogICAgIHB1YmxpYyBmaW5hbCBUYWJsZUhpc3RvZ3JhbSB0b21ic3RvbmVTY2FubmVkSGlzdG9ncmFtOwogICAgIC8qKiBMaXZlIHJvd3Mgc2Nhbm5lZCBpbiBxdWVyaWVzIG9uIHRoaXMgQ0YgKi8KQEAgLTI2MCw2ICsyNTcsMTIgQEAKICAgICBwdWJsaWMgZmluYWwgU2FtcGxlcjxCeXRlQnVmZmVyPiB0b3BDYXNQYXJ0aXRpb25Db250ZW50aW9uOwogICAgIC8qKiBXaGVuIHNhbXBsZXIgYWN0aXZhdGVkLCB3aWxsIHRyYWNrIHRoZSBzbG93ZXN0IGxvY2FsIHJlYWRzICoqLwogICAgIHB1YmxpYyBmaW5hbCBTYW1wbGVyPFN0cmluZz4gdG9wTG9jYWxSZWFkUXVlcnlUaW1lOworICAgIC8qKiBXaGVuIHNhbXBsZXIgYWN0aXZhdGVkLCB3aWxsIHRyYWNrIHBhcnRpdGlvbnMgcmVhZCB3aXRoIHRoZSBtb3N0IHJvd3MgKiovCisgICAgcHVibGljIGZpbmFsIFNhbXBsZXI8Qnl0ZUJ1ZmZlcj4gdG9wUmVhZFBhcnRpdGlvblJvd0NvdW50OworICAgIC8qKiBXaGVuIHNhbXBsZXIgYWN0aXZhdGVkLCB3aWxsIHRyYWNrIHBhcnRpdGlvbnMgcmVhZCB3aXRoIHRoZSBtb3N0IHRvbWJzdG9uZXMgKiovCisgICAgcHVibGljIGZpbmFsIFNhbXBsZXI8Qnl0ZUJ1ZmZlcj4gdG9wUmVhZFBhcnRpdGlvblRvbWJzdG9uZUNvdW50OworICAgIC8qKiBXaGVuIHNhbXBsZSBhY3RpdmF0ZWQsIHdpbGwgdHJhY2sgcGFydGl0aW9ucyByZWFkIHdpdGggdGhlIG1vc3QgbWVyZ2VkIHNzdGFibGVzICoqLworICAgIHB1YmxpYyBmaW5hbCBTYW1wbGVyPEJ5dGVCdWZmZXI+IHRvcFJlYWRQYXJ0aXRpb25TU1RhYmxlQ291bnQ7CiAKICAgICBwdWJsaWMgZmluYWwgVGFibGVNZXRlciBjbGllbnRUb21ic3RvbmVXYXJuaW5nczsKICAgICBwdWJsaWMgZmluYWwgVGFibGVNZXRlciBjbGllbnRUb21ic3RvbmVBYm9ydHM7CkBAIC0yNzYsNiArMjc5LDggQEAKICAgICBwdWJsaWMgZmluYWwgVGFibGVNZXRlciByb3dJbmRleFNpemVBYm9ydHM7CiAgICAgcHVibGljIGZpbmFsIFRhYmxlSGlzdG9ncmFtIHJvd0luZGV4U2l6ZTsKIAorICAgIHB1YmxpYyBmaW5hbCBJbW11dGFibGVNYXA8U1NUYWJsZUZvcm1hdDw/LCA/PiwgSW1tdXRhYmxlTWFwPFN0cmluZywgR2F1Z2U8PyBleHRlbmRzIE51bWJlcj4+PiBmb3JtYXRTcGVjaWZpY0dhdWdlczsKKwogICAgIHByaXZhdGUgc3RhdGljIFBhaXI8TG9uZywgTG9uZz4gdG90YWxOb25TeXN0ZW1UYWJsZXNTaXplKFByZWRpY2F0ZTxTU1RhYmxlUmVhZGVyPiBwcmVkaWNhdGUpCiAgICAgewogICAgICAgICBsb25nIHRvdGFsID0gMDsKQEAgLTQ0MCwxMSArNDQ1LDM5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAKKyAgICAgICAgdG9wUmVhZFBhcnRpdGlvblJvd0NvdW50ID0gbmV3IE1heFNhbXBsZXI8Qnl0ZUJ1ZmZlcj4oKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKEJ5dGVCdWZmZXIgdmFsdWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNmcy5tZXRhZGF0YSgpLnBhcnRpdGlvbktleVR5cGUuZ2V0U3RyaW5nKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB0b3BSZWFkUGFydGl0aW9uVG9tYnN0b25lQ291bnQgPSBuZXcgTWF4U2FtcGxlcjxCeXRlQnVmZmVyPigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoQnl0ZUJ1ZmZlciB2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2ZzLm1ldGFkYXRhKCkucGFydGl0aW9uS2V5VHlwZS5nZXRTdHJpbmcodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHRvcFJlYWRQYXJ0aXRpb25TU1RhYmxlQ291bnQgPSBuZXcgTWF4U2FtcGxlcjxCeXRlQnVmZmVyPigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhCeXRlQnVmZmVyIHZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBjZnMubWV0YWRhdGEoKS5wYXJ0aXRpb25LZXlUeXBlLmdldFN0cmluZyh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKICAgICAgICAgc2FtcGxlcnMucHV0KFNhbXBsZXJUeXBlLlJFQURTLCB0b3BSZWFkUGFydGl0aW9uRnJlcXVlbmN5KTsKICAgICAgICAgc2FtcGxlcnMucHV0KFNhbXBsZXJUeXBlLldSSVRFUywgdG9wV3JpdGVQYXJ0aXRpb25GcmVxdWVuY3kpOwogICAgICAgICBzYW1wbGVycy5wdXQoU2FtcGxlclR5cGUuV1JJVEVfU0laRSwgdG9wV3JpdGVQYXJ0aXRpb25TaXplKTsKICAgICAgICAgc2FtcGxlcnMucHV0KFNhbXBsZXJUeXBlLkNBU19DT05URU5USU9OUywgdG9wQ2FzUGFydGl0aW9uQ29udGVudGlvbik7CiAgICAgICAgIHNhbXBsZXJzLnB1dChTYW1wbGVyVHlwZS5MT0NBTF9SRUFEX1RJTUUsIHRvcExvY2FsUmVhZFF1ZXJ5VGltZSk7CisgICAgICAgIHNhbXBsZXJzLnB1dChTYW1wbGVyVHlwZS5SRUFEX1JPV19DT1VOVCwgdG9wUmVhZFBhcnRpdGlvblJvd0NvdW50KTsKKyAgICAgICAgc2FtcGxlcnMucHV0KFNhbXBsZXJUeXBlLlJFQURfVE9NQlNUT05FX0NPVU5ULCB0b3BSZWFkUGFydGl0aW9uVG9tYnN0b25lQ291bnQpOworICAgICAgICBzYW1wbGVycy5wdXQoU2FtcGxlclR5cGUuUkVBRF9TU1RBQkxFX0NPVU5ULCB0b3BSZWFkUGFydGl0aW9uU1NUYWJsZUNvdW50KTsKIAogICAgICAgICBtZW10YWJsZUNvbHVtbnNDb3VudCA9IGNyZWF0ZVRhYmxlR2F1Z2UoIk1lbXRhYmxlQ29sdW1uc0NvdW50IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBjZnMuZ2V0VHJhY2tlcigpLmdldFZpZXcoKS5nZXRDdXJyZW50TWVtdGFibGUoKS5vcGVyYXRpb25Db3VudCgpKTsKQEAgLTUxMiw2ICs1NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlcjo6Z2V0RXN0aW1hdGVkQ2VsbFBlclBhcnRpdGlvbkNvdW50KSwgbnVsbCk7CiAgICAgICAgIAogICAgICAgICBzc3RhYmxlc1BlclJlYWRIaXN0b2dyYW0gPSBjcmVhdGVUYWJsZUhpc3RvZ3JhbSgiU1NUYWJsZXNQZXJSZWFkSGlzdG9ncmFtIiwgY2ZzLmtleXNwYWNlLm1ldHJpYy5zc3RhYmxlc1BlclJlYWRIaXN0b2dyYW0sIHRydWUpOworICAgICAgICBzc3RhYmxlc1BlclJhbmdlUmVhZEhpc3RvZ3JhbSA9IGNyZWF0ZVRhYmxlSGlzdG9ncmFtKCJTU1RhYmxlc1BlclJhbmdlUmVhZEhpc3RvZ3JhbSIsIGNmcy5rZXlzcGFjZS5tZXRyaWMuc3N0YWJsZXNQZXJSYW5nZVJlYWRIaXN0b2dyYW0sIHRydWUpOwogICAgICAgICBjb21wcmVzc2lvblJhdGlvID0gY3JlYXRlVGFibGVHYXVnZSgiQ29tcHJlc3Npb25SYXRpbyIsIG5ldyBHYXVnZTxEb3VibGU+KCkKICAgICAgICAgewogICAgICAgICAgICAgcHVibGljIERvdWJsZSBnZXRWYWx1ZSgpCkBAIC02MDQsNyArNjM4LDM3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgICAgICAgICAgfQogICAgICAgICB9KTsKKyAgICAgICAgbWF4U1NUYWJsZUR1cmF0aW9uID0gY3JlYXRlVGFibGVHYXVnZSgiTWF4U1NUYWJsZUR1cmF0aW9uIiwgbmV3IEdhdWdlPExvbmc+KCkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTG9uZyBnZXRWYWx1ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNmcy5nZXRUcmFja2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZpZXcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAubGl2ZVNTVGFibGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoc3N0YWJsZSAtPiBzc3RhYmxlLmdldE1pblRpbWVzdGFtcCgpICE9IExvbmcuTUFYX1ZBTFVFICYmIHNzdGFibGUuZ2V0TWF4VGltZXN0YW1wKCkgIT0gTG9uZy5NQVhfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoc3NUYWJsZVJlYWRlciAtPiBzc1RhYmxlUmVhZGVyLmdldE1heFRpbWVzdGFtcCgpIC0gc3NUYWJsZVJlYWRlci5nZXRNaW5UaW1lc3RhbXAoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heChMb25nOjpjb21wYXJlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAub3JFbHNlKDBMKSAvIDEwMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtYXhTU1RhYmxlU2l6ZSA9IGNyZWF0ZVRhYmxlR2F1Z2UoIk1heFNTVGFibGVTaXplIiwgbmV3IEdhdWdlPExvbmc+KCkKKyAgICAgICAgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTG9uZyBnZXRWYWx1ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNmcy5nZXRUcmFja2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZpZXcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAubGl2ZVNTVGFibGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoU1NUYWJsZVJlYWRlcjo6Ynl0ZXNPbkRpc2spCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXgoTG9uZzo6Y29tcGFyZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLm9yRWxzZSgwTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogICAgICAgICBsaXZlRGlza1NwYWNlVXNlZCA9IGNyZWF0ZVRhYmxlQ291bnRlcigiTGl2ZURpc2tTcGFjZVVzZWQiKTsKKyAgICAgICAgdW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQgPSBjcmVhdGVUYWJsZUNvdW50ZXIoIlVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkIik7CiAgICAgICAgIHRvdGFsRGlza1NwYWNlVXNlZCA9IGNyZWF0ZVRhYmxlQ291bnRlcigiVG90YWxEaXNrU3BhY2VVc2VkIik7CiAgICAgICAgIG1pblBhcnRpdGlvblNpemUgPSBjcmVhdGVUYWJsZUdhdWdlKCJNaW5QYXJ0aXRpb25TaXplIiwgIk1pblJvd1NpemUiLCBuZXcgR2F1Z2U8TG9uZz4oKQogICAgICAgICB7CkBAIC02ODYsMTMyICs3NTAsNiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBjb3VudCA+IDAgPyBzdW0gLyBjb3VudCA6IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwotICAgICAgICBibG9vbUZpbHRlckZhbHNlUG9zaXRpdmVzID0gY3JlYXRlVGFibGVHYXVnZSgiQmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlcyIsIG5ldyBHYXVnZTxMb25nPigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBMb25nIGdldFZhbHVlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIGNvdW50ID0gMEw7Ci0gICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGU6IGNmcy5nZXRTU1RhYmxlcyhTU1RhYmxlU2V0LkxJVkUpKQotICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBzc3RhYmxlLmdldEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmVjZW50Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlcyA9IGNyZWF0ZVRhYmxlR2F1Z2UoIlJlY2VudEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXMiLCBuZXcgR2F1Z2U8TG9uZz4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgTG9uZyBnZXRWYWx1ZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBjb3VudCA9IDBMOwotICAgICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogY2ZzLmdldFNTVGFibGVzKFNTVGFibGVTZXQuTElWRSkpCi0gICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IHNzdGFibGUuZ2V0UmVjZW50Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlQ291bnQoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBibG9vbUZpbHRlckZhbHNlUmF0aW8gPSBjcmVhdGVUYWJsZUdhdWdlKCJCbG9vbUZpbHRlckZhbHNlUmF0aW8iLCBuZXcgR2F1Z2U8RG91YmxlPigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBEb3VibGUgZ2V0VmFsdWUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgZmFsc2VQb3NpdGl2ZUNvdW50ID0gMEw7Ci0gICAgICAgICAgICAgICAgbG9uZyB0cnVlUG9zaXRpdmVDb3VudCA9IDBMOwotICAgICAgICAgICAgICAgIGxvbmcgdHJ1ZU5lZ2F0aXZlQ291bnQgPSAwTDsKLSAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRTU1RhYmxlcyhTU1RhYmxlU2V0LkxJVkUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmFsc2VQb3NpdGl2ZUNvdW50ICs9IHNzdGFibGUuZ2V0Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlQ291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZVBvc2l0aXZlQ291bnQgKz0gc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIHRydWVOZWdhdGl2ZUNvdW50ICs9IHNzdGFibGUuZ2V0Qmxvb21GaWx0ZXJUcnVlTmVnYXRpdmVDb3VudCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZmFsc2VQb3NpdGl2ZUNvdW50ID09IDBMICYmIHRydWVQb3NpdGl2ZUNvdW50ID09IDBMKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMGQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUpIGZhbHNlUG9zaXRpdmVDb3VudCAvICh0cnVlUG9zaXRpdmVDb3VudCArIGZhbHNlUG9zaXRpdmVDb3VudCArIHRydWVOZWdhdGl2ZUNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgbmV3IEdhdWdlPERvdWJsZT4oKSAvLyBnbG9iYWwgZ2F1Z2UKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIERvdWJsZSBnZXRWYWx1ZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBmYWxzZVBvc2l0aXZlQ291bnQgPSAwTDsKLSAgICAgICAgICAgICAgICBsb25nIHRydWVQb3NpdGl2ZUNvdW50ID0gMEw7Ci0gICAgICAgICAgICAgICAgbG9uZyB0cnVlTmVnYXRpdmVDb3VudCA9IDBMOwotICAgICAgICAgICAgICAgIGZvciAoS2V5c3BhY2Uga2V5c3BhY2UgOiBLZXlzcGFjZS5hbGwoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDoga2V5c3BhY2UuZ2V0QWxsU1NUYWJsZXMoU1NUYWJsZVNldC5MSVZFKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VQb3NpdGl2ZUNvdW50ICs9IHNzdGFibGUuZ2V0Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlQ291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRydWVQb3NpdGl2ZUNvdW50ICs9IHNzdGFibGUuZ2V0Qmxvb21GaWx0ZXJUcnVlUG9zaXRpdmVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZU5lZ2F0aXZlQ291bnQgKz0gc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVOZWdhdGl2ZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZhbHNlUG9zaXRpdmVDb3VudCA9PSAwTCAmJiB0cnVlUG9zaXRpdmVDb3VudCA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBkOwotICAgICAgICAgICAgICAgIHJldHVybiAoZG91YmxlKSBmYWxzZVBvc2l0aXZlQ291bnQgLyAodHJ1ZVBvc2l0aXZlQ291bnQgKyBmYWxzZVBvc2l0aXZlQ291bnQgKyB0cnVlTmVnYXRpdmVDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZWNlbnRCbG9vbUZpbHRlckZhbHNlUmF0aW8gPSBjcmVhdGVUYWJsZUdhdWdlKCJSZWNlbnRCbG9vbUZpbHRlckZhbHNlUmF0aW8iLCBuZXcgR2F1Z2U8RG91YmxlPigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBEb3VibGUgZ2V0VmFsdWUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgZmFsc2VQb3NpdGl2ZUNvdW50ID0gMEw7Ci0gICAgICAgICAgICAgICAgbG9uZyB0cnVlUG9zaXRpdmVDb3VudCA9IDBMOwotICAgICAgICAgICAgICAgIGxvbmcgdHJ1ZU5lZ2F0aXZlQ291bnQgPSAwTDsKLSAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZTogY2ZzLmdldFNTVGFibGVzKFNTVGFibGVTZXQuTElWRSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmYWxzZVBvc2l0aXZlQ291bnQgKz0gc3N0YWJsZS5nZXRSZWNlbnRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICB0cnVlUG9zaXRpdmVDb3VudCArPSBzc3RhYmxlLmdldFJlY2VudEJsb29tRmlsdGVyVHJ1ZVBvc2l0aXZlQ291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgdHJ1ZU5lZ2F0aXZlQ291bnQgKz0gc3N0YWJsZS5nZXRSZWNlbnRCbG9vbUZpbHRlclRydWVOZWdhdGl2ZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmYWxzZVBvc2l0aXZlQ291bnQgPT0gMEwgJiYgdHJ1ZVBvc2l0aXZlQ291bnQgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGRvdWJsZSkgZmFsc2VQb3NpdGl2ZUNvdW50IC8gKHRydWVQb3NpdGl2ZUNvdW50ICsgZmFsc2VQb3NpdGl2ZUNvdW50ICsgdHJ1ZU5lZ2F0aXZlQ291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9LCBuZXcgR2F1Z2U8RG91YmxlPigpIC8vIGdsb2JhbCBnYXVnZQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgRG91YmxlIGdldFZhbHVlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIGZhbHNlUG9zaXRpdmVDb3VudCA9IDBMOwotICAgICAgICAgICAgICAgIGxvbmcgdHJ1ZVBvc2l0aXZlQ291bnQgPSAwTDsKLSAgICAgICAgICAgICAgICBsb25nIHRydWVOZWdhdGl2ZUNvdW50ID0gMEw7Ci0gICAgICAgICAgICAgICAgZm9yIChLZXlzcGFjZSBrZXlzcGFjZSA6IEtleXNwYWNlLmFsbCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBrZXlzcGFjZS5nZXRBbGxTU1RhYmxlcyhTU1RhYmxlU2V0LkxJVkUpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZVBvc2l0aXZlQ291bnQgKz0gc3N0YWJsZS5nZXRSZWNlbnRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZVBvc2l0aXZlQ291bnQgKz0gc3N0YWJsZS5nZXRSZWNlbnRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnVlTmVnYXRpdmVDb3VudCArPSBzc3RhYmxlLmdldFJlY2VudEJsb29tRmlsdGVyVHJ1ZU5lZ2F0aXZlQ291bnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZmFsc2VQb3NpdGl2ZUNvdW50ID09IDBMICYmIHRydWVQb3NpdGl2ZUNvdW50ID09IDBMKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMGQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUpIGZhbHNlUG9zaXRpdmVDb3VudCAvICh0cnVlUG9zaXRpdmVDb3VudCArIGZhbHNlUG9zaXRpdmVDb3VudCArIHRydWVOZWdhdGl2ZUNvdW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIGJsb29tRmlsdGVyRGlza1NwYWNlVXNlZCA9IGNyZWF0ZVRhYmxlR2F1Z2UoIkJsb29tRmlsdGVyRGlza1NwYWNlVXNlZCIsIG5ldyBHYXVnZTxMb25nPigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBMb25nIGdldFZhbHVlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIHRvdGFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0IDogY2ZzLmdldFNTVGFibGVzKFNTVGFibGVTZXQuQ0FOT05JQ0FMKSkKLSAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gc3N0LmdldEJsb29tRmlsdGVyU2VyaWFsaXplZFNpemUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdG90YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBibG9vbUZpbHRlck9mZkhlYXBNZW1vcnlVc2VkID0gY3JlYXRlVGFibGVHYXVnZSgiQmxvb21GaWx0ZXJPZmZIZWFwTWVtb3J5VXNlZCIsIG5ldyBHYXVnZTxMb25nPigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBMb25nIGdldFZhbHVlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIHRvdGFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0IDogY2ZzLmdldFNTVGFibGVzKFNTVGFibGVTZXQuTElWRSkpCi0gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHNzdC5nZXRCbG9vbUZpbHRlck9mZkhlYXBTaXplKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRvdGFsOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaW5kZXhTdW1tYXJ5T2ZmSGVhcE1lbW9yeVVzZWQgPSBjcmVhdGVUYWJsZUdhdWdlKCJJbmRleFN1bW1hcnlPZmZIZWFwTWVtb3J5VXNlZCIsIG5ldyBHYXVnZTxMb25nPigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBMb25nIGdldFZhbHVlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIHRvdGFsID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0IDogY2ZzLmdldFNTVGFibGVzKFNTVGFibGVTZXQuTElWRSkpCi0gICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHNzdC5nZXRJbmRleFN1bW1hcnlPZmZIZWFwU2l6ZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0b3RhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7CiAgICAgICAgIGNvbXByZXNzaW9uTWV0YWRhdGFPZmZIZWFwTWVtb3J5VXNlZCA9IGNyZWF0ZVRhYmxlR2F1Z2UoIkNvbXByZXNzaW9uTWV0YWRhdGFPZmZIZWFwTWVtb3J5VXNlZCIsIG5ldyBHYXVnZTxMb25nPigpCiAgICAgICAgIHsKICAgICAgICAgICAgIHB1YmxpYyBMb25nIGdldFZhbHVlKCkKQEAgLTgzMCwzMCArNzY4LDYgQEAKICAgICAgICAgYWRkaXRpb25hbFdyaXRlcyA9IGNyZWF0ZVRhYmxlQ291bnRlcigiQWRkaXRpb25hbFdyaXRlcyIpOwogICAgICAgICBhZGRpdGlvbmFsV3JpdGVMYXRlbmN5TmFub3MgPSBjcmVhdGVUYWJsZUdhdWdlKCJBZGRpdGlvbmFsV3JpdGVMYXRlbmN5TmFub3MiLCAoKSAtPiBNSUNST1NFQ09ORFMudG9OYW5vcyhjZnMuYWRkaXRpb25hbFdyaXRlTGF0ZW5jeU1pY3JvcykpOwogCi0gICAgICAgIGtleUNhY2hlSGl0UmF0ZSA9IGNyZWF0ZVRhYmxlR2F1Z2UoIktleUNhY2hlSGl0UmF0ZSIsICJLZXlDYWNoZUhpdFJhdGUiLCBuZXcgUmF0aW9HYXVnZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFJhdGlvIGdldFJhdGlvKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmF0aW8ub2YoZ2V0TnVtZXJhdG9yKCksIGdldERlbm9taW5hdG9yKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm90ZWN0ZWQgZG91YmxlIGdldE51bWVyYXRvcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBoaXRzID0gMEw7Ci0gICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0U1NUYWJsZXMoU1NUYWJsZVNldC5MSVZFKSkKLSAgICAgICAgICAgICAgICAgICAgaGl0cyArPSBzc3RhYmxlLmdldEtleUNhY2hlSGl0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGhpdHM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByb3RlY3RlZCBkb3VibGUgZ2V0RGVub21pbmF0b3IoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgcmVxdWVzdHMgPSAwTDsKLSAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRTU1RhYmxlcyhTU1RhYmxlU2V0LkxJVkUpKQotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cyArPSBzc3RhYmxlLmdldEtleUNhY2hlUmVxdWVzdCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChyZXF1ZXN0cywgMSk7IC8vIHRvIGF2b2lkIE5hTi4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgbnVsbCk7CiAgICAgICAgIHRvbWJzdG9uZVNjYW5uZWRIaXN0b2dyYW0gPSBjcmVhdGVUYWJsZUhpc3RvZ3JhbSgiVG9tYnN0b25lU2Nhbm5lZEhpc3RvZ3JhbSIsIGNmcy5rZXlzcGFjZS5tZXRyaWMudG9tYnN0b25lU2Nhbm5lZEhpc3RvZ3JhbSwgZmFsc2UpOwogICAgICAgICBsaXZlU2Nhbm5lZEhpc3RvZ3JhbSA9IGNyZWF0ZVRhYmxlSGlzdG9ncmFtKCJMaXZlU2Nhbm5lZEhpc3RvZ3JhbSIsIGNmcy5rZXlzcGFjZS5tZXRyaWMubGl2ZVNjYW5uZWRIaXN0b2dyYW0sIGZhbHNlKTsKICAgICAgICAgY29sVXBkYXRlVGltZURlbHRhSGlzdG9ncmFtID0gY3JlYXRlVGFibGVIaXN0b2dyYW0oIkNvbFVwZGF0ZVRpbWVEZWx0YUhpc3RvZ3JhbSIsIGNmcy5rZXlzcGFjZS5tZXRyaWMuY29sVXBkYXRlVGltZURlbHRhSGlzdG9ncmFtLCBmYWxzZSk7CkBAIC05NDQsNiArODU4LDggQEAKICAgICAgICAgcm93SW5kZXhTaXplV2FybmluZ3MgPSBjcmVhdGVUYWJsZU1ldGVyKCJSb3dJbmRleFNpemVXYXJuaW5ncyIsIGNmcy5rZXlzcGFjZS5tZXRyaWMucm93SW5kZXhTaXplV2FybmluZ3MpOwogICAgICAgICByb3dJbmRleFNpemVBYm9ydHMgPSBjcmVhdGVUYWJsZU1ldGVyKCJSb3dJbmRleFNpemVBYm9ydHMiLCBjZnMua2V5c3BhY2UubWV0cmljLnJvd0luZGV4U2l6ZUFib3J0cyk7CiAgICAgICAgIHJvd0luZGV4U2l6ZSA9IGNyZWF0ZVRhYmxlSGlzdG9ncmFtKCJSb3dJbmRleFNpemUiLCBjZnMua2V5c3BhY2UubWV0cmljLnJvd0luZGV4U2l6ZSwgZmFsc2UpOworCisgICAgICAgIGZvcm1hdFNwZWNpZmljR2F1Z2VzID0gY3JlYXRlRm9ybWF0U3BlY2lmaWNHYXVnZXMoY2ZzKTsKICAgICB9CiAKICAgICBwcml2YXRlIE1lbXRhYmxlLk1lbW9yeVVzYWdlIGdldE1lbW9yeVVzYWdlV2l0aEluZGV4ZXMoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQpAQCAtOTYwLDYgKzg3NiwxMSBAQAogICAgICAgICBzc3RhYmxlc1BlclJlYWRIaXN0b2dyYW0udXBkYXRlKGNvdW50KTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVTU1RhYmxlSXRlcmF0ZWRJblJhbmdlUmVhZChpbnQgY291bnQpCisgICAgeworICAgICAgICBzc3RhYmxlc1BlclJhbmdlUmVhZEhpc3RvZ3JhbS51cGRhdGUoY291bnQpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFJlbGVhc2UgYWxsIGFzc29jaWF0ZWQgbWV0cmljcy4KICAgICAgKi8KQEAgLTk3MSw2ICs4OTIsMjIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgSW1tdXRhYmxlTWFwPFNTVGFibGVGb3JtYXQ8PywgPz4sIEltbXV0YWJsZU1hcDxTdHJpbmcsIEdhdWdlPD8gZXh0ZW5kcyBOdW1iZXI+Pj4gY3JlYXRlRm9ybWF0U3BlY2lmaWNHYXVnZXMoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQorICAgIHsKKyAgICAgICAgSW1tdXRhYmxlTWFwLkJ1aWxkZXI8U1NUYWJsZUZvcm1hdDw/LCA/PiwgSW1tdXRhYmxlTWFwPFN0cmluZywgR2F1Z2U8PyBleHRlbmRzIE51bWJlcj4+PiBidWlsZGVyID0gSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKTsKKyAgICAgICAgZm9yIChTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCA6IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpLnZhbHVlcygpKQorICAgICAgICB7CisgICAgICAgICAgICBJbW11dGFibGVNYXAuQnVpbGRlcjxTdHJpbmcsIEdhdWdlPD8gZXh0ZW5kcyBOdW1iZXI+PiBnYXVnZXMgPSBJbW11dGFibGVNYXAuYnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChHYXVnZVByb3ZpZGVyPD8+IGdhdWdlUHJvdmlkZXIgOiBmb3JtYXQuZ2V0Rm9ybWF0U3BlY2lmaWNNZXRyaWNzUHJvdmlkZXJzKCkuZ2V0R2F1Z2VQcm92aWRlcnMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHYXVnZTw/IGV4dGVuZHMgTnVtYmVyPiBnYXVnZSA9IGNyZWF0ZVRhYmxlR2F1Z2UoZ2F1Z2VQcm92aWRlci5uYW1lLCBnYXVnZVByb3ZpZGVyLmdldFRhYmxlR2F1Z2UoY2ZzKSwgZ2F1Z2VQcm92aWRlci5nZXRHbG9iYWxHYXVnZSgpKTsKKyAgICAgICAgICAgICAgICBnYXVnZXMucHV0KGdhdWdlUHJvdmlkZXIubmFtZSwgZ2F1Z2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVpbGRlci5wdXQoZm9ybWF0LCBnYXVnZXMuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDcmVhdGUgYSBnYXVnZSB0aGF0IHdpbGwgYmUgcGFydCBvZiBhIG1lcmdlZCB2ZXJzaW9uIG9mIGFsbCBjb2x1bW4gZmFtaWxpZXMuICBUaGUgZ2xvYmFsIGdhdWdlCiAgICAgICogd2lsbCBtZXJnZSBlYWNoIENGIGdhdWdlIGJ5IGFkZGluZyB0aGVpciB2YWx1ZXMKQEAgLTEwOTcsNiArMTAzNCw3IEBACiAgICAgICAgICAgICAgICAgLy8gdXNpbmcgU1NUYWJsZVNldC5DQU5PTklDQUwuCiAgICAgICAgICAgICAgICAgYXNzZXJ0IHNzdGFibGUub3BlblJlYXNvbiAhPSBTU1RhYmxlUmVhZGVyLk9wZW5SZWFzb24uRUFSTFk7CiAKKyAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQogICAgICAgICAgICAgICAgIENvbXByZXNzaW9uTWV0YWRhdGEgY29tcHJlc3Npb25NZXRhZGF0YSA9IHNzdGFibGUuZ2V0Q29tcHJlc3Npb25NZXRhZGF0YSgpOwogICAgICAgICAgICAgICAgIGNvbXByZXNzZWRMZW5ndGhTdW0gKz0gY29tcHJlc3Npb25NZXRhZGF0YS5jb21wcmVzc2VkRmlsZUxlbmd0aDsKICAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoU3VtICs9IGNvbXByZXNzaW9uTWV0YWRhdGEuZGF0YUxlbmd0aDsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvVG9wUGFydGl0aW9uVHJhY2tlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9Ub3BQYXJ0aXRpb25UcmFja2VyLmphdmEKaW5kZXggNTZhODYwYS4uNmVjMGM0MSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9Ub3BQYXJ0aXRpb25UcmFja2VyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9Ub3BQYXJ0aXRpb25UcmFja2VyLmphdmEKQEAgLTQ1LDcgKzQ1LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uVHJhbnNmb3JtYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIApAQCAtMjM4LDcgKzIzNyw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgICAgICBpZiAodG9wLnNpemUoKSA8IG1heFRvcFBhcnRpdGlvbkNvdW50IHx8IHZhbHVlID4gY3VycmVudE1pblZhbHVlKQotICAgICAgICAgICAgICAgIHRyYWNrKG5ldyBUb3BQYXJ0aXRpb24oU1NUYWJsZS5nZXRNaW5pbWFsS2V5KGtleSksIHZhbHVlKSk7CisgICAgICAgICAgICAgICAgdHJhY2sobmV3IFRvcFBhcnRpdGlvbihrZXkucmV0YWluYWJsZSgpLCB2YWx1ZSkpOwogICAgICAgICB9CiAKICAgICAgICAgcHJpdmF0ZSB2b2lkIHRyYWNrKFRvcFBhcnRpdGlvbiB0cCkKQEAgLTQwNCw0ICs0MDMsNCBAQAogICAgICAgICAgICAgdGhpcy5sYXN0VXBkYXRlZCA9IGxhc3RVcGRhdGVkOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvVHJpZU1lbXRhYmxlTWV0cmljc1ZpZXcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvVHJpZU1lbXRhYmxlTWV0cmljc1ZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzQzNTAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9UcmllTWVtdGFibGVNZXRyaWNzVmlldy5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczsKKworaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkNvdW50ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DYXNzYW5kcmFNZXRyaWNzUmVnaXN0cnkuTWV0cmljczsKKworcHVibGljIGNsYXNzIFRyaWVNZW10YWJsZU1ldHJpY3NWaWV3Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOQ09OVEVOREVEX1BVVFMgPSAiVW5jb250ZW5kZWQgbWVtdGFibGUgcHV0cyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTkRFRF9QVVRTID0gIkNvbnRlbmRlZCBtZW10YWJsZSBwdXRzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVElPTl9USU1FID0gIkNvbnRlbnRpb24gdGltZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfRkxVU0hfU0hBUkRfU0laRVMgPSAiU2hhcmQgc2l6ZXMgZHVyaW5nIGxhc3QgZmx1c2giOworCisgICAgLy8gdGhlIG51bWJlciBvZiBtZW10YWJsZSBwdXRzIHRoYXQgZGlkIG5vdCBuZWVkIHRvIHdhaXQgb24gd3JpdGUgbG9jaworICAgIHB1YmxpYyBmaW5hbCBDb3VudGVyIHVuY29udGVuZGVkUHV0czsKKworICAgIC8vIHRoZSBudW1iZXIgb2YgbWVtdGFibGUgcHV0cyB0aGF0IG5lZWRlZCB0byB3YWl0IG9uIHdyaXRlIGxvY2sKKyAgICBwdWJsaWMgZmluYWwgQ291bnRlciBjb250ZW5kZWRQdXRzOworCisgICAgLy8gc2hhcmQgcHV0IGNvbnRlbnRpb24gbWVhc3VyZW1lbnRzCisgICAgcHVibGljIGZpbmFsIExhdGVuY3lNZXRyaWNzIGNvbnRlbnRpb25UaW1lOworCisgICAgLy8gc2hhcmQgc2l6ZXMgZGlzdHJpYnV0aW9uCisgICAgcHVibGljIGZpbmFsIE1pbk1heEF2Z01ldHJpYyBsYXN0Rmx1c2hTaGFyZERhdGFTaXplczsKKworICAgIHByaXZhdGUgZmluYWwgVHJpZU1lbXRhYmxlTWV0cmljTmFtZUZhY3RvcnkgZmFjdG9yeTsKKworICAgIHB1YmxpYyBUcmllTWVtdGFibGVNZXRyaWNzVmlldyhTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSkKKyAgICB7CisgICAgICAgIGZhY3RvcnkgPSBuZXcgVHJpZU1lbXRhYmxlTWV0cmljTmFtZUZhY3Rvcnkoa2V5c3BhY2UsIHRhYmxlKTsKKyAgICAgICAgCisgICAgICAgIHVuY29udGVuZGVkUHV0cyA9IE1ldHJpY3MuY291bnRlcihmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoVU5DT05URU5ERURfUFVUUykpOworICAgICAgICBjb250ZW5kZWRQdXRzID0gTWV0cmljcy5jb3VudGVyKGZhY3RvcnkuY3JlYXRlTWV0cmljTmFtZShDT05URU5ERURfUFVUUykpOworICAgICAgICBjb250ZW50aW9uVGltZSA9IG5ldyBMYXRlbmN5TWV0cmljcyhmYWN0b3J5LCBDT05URU5USU9OX1RJTUUpOworICAgICAgICBsYXN0Rmx1c2hTaGFyZERhdGFTaXplcyA9IG5ldyBNaW5NYXhBdmdNZXRyaWMoZmFjdG9yeSwgTEFTVF9GTFVTSF9TSEFSRF9TSVpFUyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpCisgICAgeworICAgICAgICBNZXRyaWNzLnJlbW92ZShmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoVU5DT05URU5ERURfUFVUUykpOworICAgICAgICBNZXRyaWNzLnJlbW92ZShmYWN0b3J5LmNyZWF0ZU1ldHJpY05hbWUoQ09OVEVOREVEX1BVVFMpKTsKKyAgICAgICAgY29udGVudGlvblRpbWUucmVsZWFzZSgpOworICAgICAgICBsYXN0Rmx1c2hTaGFyZERhdGFTaXplcy5yZWxlYXNlKCk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFRyaWVNZW10YWJsZU1ldHJpY05hbWVGYWN0b3J5IGltcGxlbWVudHMgTWV0cmljTmFtZUZhY3RvcnkKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGtleXNwYWNlOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0YWJsZTsKKworICAgICAgICBUcmllTWVtdGFibGVNZXRyaWNOYW1lRmFjdG9yeShTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5rZXlzcGFjZSA9IGtleXNwYWNlOworICAgICAgICAgICAgdGhpcy50YWJsZSA9IHRhYmxlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENhc3NhbmRyYU1ldHJpY3NSZWdpc3RyeS5NZXRyaWNOYW1lIGNyZWF0ZU1ldHJpY05hbWUoU3RyaW5nIG1ldHJpY05hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBncm91cE5hbWUgPSBUYWJsZU1ldHJpY3MuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgIFN0cmluZyB0eXBlID0gIlRyaWVNZW10YWJsZSI7CisKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbWJlYW5OYW1lID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIG1iZWFuTmFtZS5hcHBlbmQoZ3JvdXBOYW1lKS5hcHBlbmQoIjoiKTsKKyAgICAgICAgICAgIG1iZWFuTmFtZS5hcHBlbmQoInR5cGU9IikuYXBwZW5kKHR5cGUpOworICAgICAgICAgICAgbWJlYW5OYW1lLmFwcGVuZCgiLGtleXNwYWNlPSIpLmFwcGVuZChrZXlzcGFjZSk7CisgICAgICAgICAgICBtYmVhbk5hbWUuYXBwZW5kKCIsc2NvcGU9IikuYXBwZW5kKHRhYmxlKTsKKyAgICAgICAgICAgIG1iZWFuTmFtZS5hcHBlbmQoIixuYW1lPSIpLmFwcGVuZChtZXRyaWNOYW1lKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBDYXNzYW5kcmFNZXRyaWNzUmVnaXN0cnkuTWV0cmljTmFtZShncm91cE5hbWUsIHR5cGUsIG1ldHJpY05hbWUsIGtleXNwYWNlICsgIi4iICsgdGFibGUsIG1iZWFuTmFtZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9DdXN0b21QYXJhbXNTZXJpYWxpemVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvQ3VzdG9tUGFyYW1zU2VyaWFsaXplci5qYXZhCmluZGV4IGE4NjY2NTEuLmM2YzcyZmUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9DdXN0b21QYXJhbXNTZXJpYWxpemVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0N1c3RvbVBhcmFtc1NlcmlhbGl6ZXIuamF2YQpAQCAtMzgsNyArMzgsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShNYXA8U3RyaW5nLCBieXRlW10+IHQsIERhdGFPdXRwdXRQbHVzIG91dCwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHQuc2l6ZSgpKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIodC5zaXplKCkpOwogICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIGJ5dGVbXT4gZSA6IHQuZW50cnlTZXQoKSkKICAgICAgICAgewogICAgICAgICAgICAgb3V0LndyaXRlVVRGKGUuZ2V0S2V5KCkpOwpAQCAtNjEsNyArNjEsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBieXRlW10+IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIGludCBlbnRyaWVzID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICBpbnQgZW50cmllcyA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICBNYXA8U3RyaW5nLCBieXRlW10+IGN1c3RvbVBhcmFtcyA9IE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoZW50cmllcyk7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZW50cmllcyA7ICsraSkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9Gb3J3YXJkaW5nSW5mby5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0ZvcndhcmRpbmdJbmZvLmphdmEKaW5kZXggNzZlMmE3NS4uMmVlMTk5YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0ZvcndhcmRpbmdJbmZvLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0ZvcndhcmRpbmdJbmZvLmphdmEKQEAgLTE3LDIxICsxNywyMCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldDsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlDb25zdW1lcjsKLQogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkludHM7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uSVZlcnNpb25lZFNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpQ29uc3VtZXI7CisKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQuU2VyaWFsaXplci5pbmV0QWRkcmVzc0FuZFBvcnRTZXJpYWxpemVyOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzQwOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy52aW50LlZJbnRDb2RpbmcuY29tcHV0ZVVuc2lnbmVkVkludFNpemU7CkBAIC04NSw3ICs4NCw3IEBACiAKICAgICAgICAgICAgIGludCBjb3VudCA9IGlkcy5sZW5ndGg7CiAgICAgICAgICAgICBpZiAodmVyc2lvbiA+PSBWRVJTSU9OXzQwKQotICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChjb3VudCk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoY291bnQpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIG91dC53cml0ZUludChjb3VudCk7CiAKQEAgLTExOCw3ICsxMTcsNyBAQAogCiAgICAgICAgIHB1YmxpYyBGb3J3YXJkaW5nSW5mbyBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IHZlcnNpb24gPj0gVkVSU0lPTl80MCA/IEludHMuY2hlY2tlZENhc3QoaW4ucmVhZFVuc2lnbmVkVkludCgpKSA6IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHZlcnNpb24gPj0gVkVSU0lPTl80MCA/IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpIDogaW4ucmVhZEludCgpOwogCiAgICAgICAgICAgICBsb25nW10gaWRzID0gbmV3IGxvbmdbY291bnRdOwogICAgICAgICAgICAgTGlzdDxJbmV0QWRkcmVzc0FuZFBvcnQ+IHRhcmdldHMgPSBuZXcgQXJyYXlMaXN0PD4oY291bnQpOwpAQCAtMTI2LDcgKzEyNSw3IEBACiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdGFyZ2V0cy5hZGQoaW5ldEFkZHJlc3NBbmRQb3J0U2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgdmVyc2lvbikpOwotICAgICAgICAgICAgICAgIGlkc1tpXSA9IHZlcnNpb24gPj0gVkVSU0lPTl80MCA/IEludHMuY2hlY2tlZENhc3QoaW4ucmVhZFVuc2lnbmVkVkludCgpKSA6IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgICAgICBpZHNbaV0gPSB2ZXJzaW9uID49IFZFUlNJT05fNDAgPyBpbi5yZWFkVW5zaWduZWRWSW50MzIoKSA6IGluLnJlYWRJbnQoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3J3YXJkaW5nSW5mbyh0YXJnZXRzLCBpZHMpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0luYm91bmRDb25uZWN0aW9uSW5pdGlhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvSW5ib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuamF2YQppbmRleCA4MDdkMDI2Li5lNGRlNTI3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvSW5ib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvSW5ib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwpAQCAtNDYsNiArNDcsNyBAQAogaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIubG9nZ2luZy5Mb2dnaW5nSGFuZGxlcjsKIGltcG9ydCBpby5uZXR0eS5oYW5kbGVyLnNzbC5Tc2xDb250ZXh0OwogaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuc3NsLlNzbEhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JSW50ZXJub2RlQXV0aGVudGljYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5FbmNyeXB0aW9uT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CkBAIC02MCw3ICs2MiwxMSBAQAogCiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5NYXRoLio7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JSW50ZXJub2RlQXV0aGVudGljYXRvci5JbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uLklOQk9VTkQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5JbnRlcm5vZGVDb25uZWN0aW9uVXRpbHMuRElTQ0FSRF9IQU5ETEVSX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5JbnRlcm5vZGVDb25uZWN0aW9uVXRpbHMuU1NMX0hBTkRMRVJfTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LkludGVybm9kZUNvbm5lY3Rpb25VdGlscy5jZXJ0aWZpY2F0ZXM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlLio7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5Tb2NrZXRGYWN0b3J5LldJUkVUUkFDRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlNvY2tldEZhY3RvcnkubmV3U3NsSGFuZGxlcjsKQEAgLTEwMiw3ICsxMDgsNyBAQAogCiAgICAgICAgICAgICBwaXBlbGluZUluamVjdG9yLmFjY2VwdChwaXBlbGluZSk7CiAKLSAgICAgICAgICAgIC8vIG9yZGVyIG9mIGhhbmRsZXJzOiBzc2wgLT4gbG9nZ2VyIC0+IGhhbmRzaGFrZUhhbmRsZXIKKyAgICAgICAgICAgIC8vIG9yZGVyIG9mIGhhbmRsZXJzOiBzc2wgLT4gY2xpZW50LWF1dGhlbnRpY2F0aW9uIC0+IGxvZ2dlciAtPiBoYW5kc2hha2VIYW5kbGVyCiAgICAgICAgICAgICAvLyBGb3IgZWl0aGVyIHVuZW5jcnlwdGVkIG9yIHRyYW5zaXRpb25hbCBtb2RlcywgYWxsb3cgU3NsIG9wdGlvbmFsbHkuCiAgICAgICAgICAgICBzd2l0Y2goc2V0dGluZ3MuZW5jcnlwdGlvbi50bHNFbmNyeXB0aW9uUG9saWN5KCkpCiAgICAgICAgICAgICB7CkBAIC0xMTEsMTQgKzExNywxNyBAQAogICAgICAgICAgICAgICAgICAgICBwaXBlbGluZS5hZGRBZnRlcihQSVBFTElORV9JTlRFUk5PREVfRVJST1JfRVhDTFVTSU9OUywgInJlamVjdHNzbCIsIG5ldyBSZWplY3RTc2xIYW5kbGVyKCkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIE9QVElPTkFMOgotICAgICAgICAgICAgICAgICAgICBwaXBlbGluZS5hZGRBZnRlcihQSVBFTElORV9JTlRFUk5PREVfRVJST1JfRVhDTFVTSU9OUywgInNzbCIsIG5ldyBPcHRpb25hbFNzbEhhbmRsZXIoc2V0dGluZ3MuZW5jcnlwdGlvbikpOworICAgICAgICAgICAgICAgICAgICBwaXBlbGluZS5hZGRBZnRlcihQSVBFTElORV9JTlRFUk5PREVfRVJST1JfRVhDTFVTSU9OUywgU1NMX0hBTkRMRVJfTkFNRSwgbmV3IE9wdGlvbmFsU3NsSGFuZGxlcihzZXR0aW5ncy5lbmNyeXB0aW9uKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRU5DUllQVEVEOgogICAgICAgICAgICAgICAgICAgICBTc2xIYW5kbGVyIHNzbEhhbmRsZXIgPSBnZXRTc2xIYW5kbGVyKCJjcmVhdGluZyIsIGNoYW5uZWwsIHNldHRpbmdzLmVuY3J5cHRpb24pOwotICAgICAgICAgICAgICAgICAgICBwaXBlbGluZS5hZGRBZnRlcihQSVBFTElORV9JTlRFUk5PREVfRVJST1JfRVhDTFVTSU9OUywgInNzbCIsIHNzbEhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICBwaXBlbGluZS5hZGRBZnRlcihQSVBFTElORV9JTlRFUk5PREVfRVJST1JfRVhDTFVTSU9OUywgU1NMX0hBTkRMRVJfTkFNRSwgc3NsSGFuZGxlcik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBQaXBlbGluZSBmb3IgcGVyZm9ybWluZyBjbGllbnQgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgIHBpcGVsaW5lLmFkZExhc3QoImNsaWVudC1hdXRoZW50aWNhdGlvbiIsIG5ldyBDbGllbnRBdXRoZW50aWNhdGlvbkhhbmRsZXIoc2V0dGluZ3MuYXV0aGVudGljYXRvcikpOworCiAgICAgICAgICAgICBpZiAoV0lSRVRSQUNFKQogICAgICAgICAgICAgICAgIHBpcGVsaW5lLmFkZExhc3QoImxvZ2dlciIsIG5ldyBMb2dnaW5nSGFuZGxlcihMb2dMZXZlbC5JTkZPKSk7CiAKQEAgLTE5OSw2ICsyMDgsNjEgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBIYW5kbGVyIHRvIHBlcmZvcm0gYXV0aGVudGljYXRpb24gZm9yIGludGVybm9kZSBpbmJvdW5kIGNvbm5lY3Rpb25zLgorICAgICAqIFRoaXMgaGFuZGxlciBpcyBjYWxsZWQgZXZlbiBiZWZvcmUgbWVzc2FnaW5nIGhhbmRzaGFrZSBzdGFydHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xpZW50QXV0aGVudGljYXRpb25IYW5kbGVyIGV4dGVuZHMgQnl0ZVRvTWVzc2FnZURlY29kZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSUludGVybm9kZUF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRvcjsKKworICAgICAgICBwdWJsaWMgQ2xpZW50QXV0aGVudGljYXRpb25IYW5kbGVyKElJbnRlcm5vZGVBdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRvciA9IGF1dGhlbnRpY2F0b3I7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZGVjb2RlKENoYW5uZWxIYW5kbGVyQ29udGV4dCBjaGFubmVsSGFuZGxlckNvbnRleHQsIEJ5dGVCdWYgYnl0ZUJ1ZiwgTGlzdDxPYmplY3Q+IGxpc3QpIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgLy8gRXh0cmFjdCBjZXJ0aWZpY2F0ZXMgZnJvbSBTU0wgaGFuZGxlcihoYW5kbGVyIHdpdGggbmFtZSAic3NsIikuCisgICAgICAgICAgICBmaW5hbCBDZXJ0aWZpY2F0ZVtdIGNlcnRpZmljYXRlcyA9IGNlcnRpZmljYXRlcyhjaGFubmVsSGFuZGxlckNvbnRleHQuY2hhbm5lbCgpKTsKKyAgICAgICAgICAgIGlmICghYXV0aGVudGljYXRlKGNoYW5uZWxIYW5kbGVyQ29udGV4dC5jaGFubmVsKCkucmVtb3RlQWRkcmVzcygpLCBjZXJ0aWZpY2F0ZXMpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBwZWVyIHt9IGZvciBpbnRlcm5vZGUgYXV0aGVudGljYXRpb24iLCBjaGFubmVsSGFuZGxlckNvbnRleHQuY2hhbm5lbCgpKTsKKworICAgICAgICAgICAgICAgIC8vIFRvIHJlbGVhc2UgYWxsIHRoZSBwZW5kaW5nIGJ1ZmZlcmVkIGRhdGEsIHJlcGxhY2UgYXV0aGVudGljYXRpb24gaGFuZGxlciB3aXRoIGRpc2NhcmQgaGFuZGxlci4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGF2b2lkcyBwZW5kaW5nIGluYm91bmQgZGF0YSB0byBiZSBmaXJlZCB0aHJvdWdoIHRoZSBwaXBlbGluZQorICAgICAgICAgICAgICAgIGNoYW5uZWxIYW5kbGVyQ29udGV4dC5waXBlbGluZSgpLnJlcGxhY2UodGhpcywgRElTQ0FSRF9IQU5ETEVSX05BTUUsIG5ldyBJbnRlcm5vZGVDb25uZWN0aW9uVXRpbHMuQnl0ZUJ1ZkRpc2NhcmRIYW5kbGVyKCkpOworICAgICAgICAgICAgICAgIGNoYW5uZWxIYW5kbGVyQ29udGV4dC5waXBlbGluZSgpLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhbm5lbEhhbmRsZXJDb250ZXh0LnBpcGVsaW5lKCkucmVtb3ZlKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGF1dGhlbnRpY2F0ZShTb2NrZXRBZGRyZXNzIHNvY2tldEFkZHJlc3MsIGZpbmFsIENlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNvY2tldEFkZHJlc3MuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKCJFbWJlZGRlZFNvY2tldEFkZHJlc3MiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKCEoc29ja2V0QWRkcmVzcyBpbnN0YW5jZW9mIEluZXRTb2NrZXRBZGRyZXNzKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVW5leHBlY3RlZCBTb2NrZXRBZGRyZXNzIHR5cGU6ICVzLCAlcyIsIHNvY2tldEFkZHJlc3MuZ2V0Q2xhc3MoKSwgc29ja2V0QWRkcmVzcykpOworCisgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBhZGRyID0gKEluZXRTb2NrZXRBZGRyZXNzKSBzb2NrZXRBZGRyZXNzOworICAgICAgICAgICAgaWYgKCFhdXRoZW50aWNhdG9yLmF1dGhlbnRpY2F0ZShhZGRyLmdldEFkZHJlc3MoKSwgYWRkci5nZXRQb3J0KCksIGNlcnRpZmljYXRlcywgSU5CT1VORCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gTG9nIGF0IGluZm8gbGV2ZWwgYXMgYW55dGhpbmcgdGhhdCBjYW4gcmVhY2ggdGhlIGluYm91bmQgcG9ydCBjb3VsZCBoaXQgdGhpcworICAgICAgICAgICAgICAgIC8vIGFuZCB0cmlnZ2VyIGEgbG9nIG9mIG5vaXNlLiAgRmFpbGVkIG91dGJvdW5kIGNvbm5lY3Rpb25zIHRvIGtub3duIGNsdXN0ZXIgZW5kcG9pbnRzCisgICAgICAgICAgICAgICAgLy8gc3RpbGwgZmFpbCB3aXRoIGFuIEVSUk9SIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbiB0byBhbGVydCBvcGVyYXRvcnMgdGhhdCBhcmVuJ3Qgd2F0Y2hpbmcgbG9ncyBjbG9zZWx5LgorICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJBdXRoZW50aWNhdGUgcmVqZWN0ZWQgaW5ib3VuZCBpbnRlcm5vZGUgY29ubmVjdGlvbiBmcm9tIHt9IiwgYWRkcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgogICAgICAqICdTZXJ2ZXItc2lkZScgY29tcG9uZW50IHRoYXQgbmVnb3RpYXRlcyB0aGUgaW50ZXJub2RlIGhhbmRzaGFrZSB3aGVuIGVzdGFibGlzaGluZyBhIG5ldyBjb25uZWN0aW9uLgogICAgICAqIFRoaXMgaGFuZGxlciB3aWxsIGJlIHRoZSBmaXJzdCBpbiB0aGUgbmV0dHkgY2hhbm5lbCBmb3IgZWFjaCBpbmNvbWluZyBjb25uZWN0aW9uIChzZWN1cmUgc29ja2V0IChUTFMpIG5vdHdpdGhzdGFuZGluZyksCiAgICAgICogYW5kIG9uY2UgdGhlIGhhbmRzaGFrZSBpcyBzdWNjZXNzZnVsLCBpdCB3aWxsIGNvbmZpZ3VyZSB0aGUgcHJvcGVyIGhhbmRsZXJzICh7QGxpbmsgSW5ib3VuZE1lc3NhZ2VIYW5kbGVyfQpAQCAtMjIzLDggKzI4Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvKioKLSAgICAgICAgICogT24gcmVnaXN0cmF0aW9uLCBpbW1lZGlhdGVseSBzY2hlZHVsZSBhIHRpbWVvdXQgdG8ga2lsbCB0aGlzIGNvbm5lY3Rpb24gaWYgaXQgZG9lcyBub3QgaGFuZHNoYWtlIHByb21wdGx5LAotICAgICAgICAgKiBhbmQgYXV0aGVudGljYXRlIHRoZSByZW1vdGUgYWRkcmVzcy4KKyAgICAgICAgICogT24gcmVnaXN0cmF0aW9uLCBpbW1lZGlhdGVseSBzY2hlZHVsZSBhIHRpbWVvdXQgdG8ga2lsbCB0aGlzIGNvbm5lY3Rpb24gaWYgaXQgZG9lcyBub3QgaGFuZHNoYWtlIHByb21wdGx5LgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlckFkZGVkKENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHgpIHRocm93cyBFeGNlcHRpb24KICAgICAgICAgewpAQCAtMjMyLDMxICsyOTUsNiBAQAogICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVGltZW91dCBoYW5kc2hha2luZyB3aXRoIHt9IChvbiB7fSkiLCBTb2NrZXRGYWN0b3J5LmFkZHJlc3NJZChpbml0aWF0ZS5mcm9tLCAoSW5ldFNvY2tldEFkZHJlc3MpIGN0eC5jaGFubmVsKCkucmVtb3RlQWRkcmVzcygpKSwgc2V0dGluZ3MuYmluZEFkZHJlc3MpOwogICAgICAgICAgICAgICAgIGZhaWxIYW5kc2hha2UoY3R4KTsKICAgICAgICAgICAgIH0sIEhhbmRzaGFrZVByb3RvY29sLlRJTUVPVVRfTUlMTElTLCBNSUxMSVNFQ09ORFMpOwotCi0gICAgICAgICAgICBpZiAoIWF1dGhlbnRpY2F0ZShjdHguY2hhbm5lbCgpLnJlbW90ZUFkZHJlc3MoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmFpbEhhbmRzaGFrZShjdHgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGF1dGhlbnRpY2F0ZShTb2NrZXRBZGRyZXNzIHNvY2tldEFkZHJlc3MpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc29ja2V0QWRkcmVzcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKS5lcXVhbHMoIkVtYmVkZGVkU29ja2V0QWRkcmVzcyIpKQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICBpZiAoIShzb2NrZXRBZGRyZXNzIGluc3RhbmNlb2YgSW5ldFNvY2tldEFkZHJlc3MpKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJVbmV4cGVjdGVkIFNvY2tldEFkZHJlc3MgdHlwZTogJXMsICVzIiwgc29ja2V0QWRkcmVzcy5nZXRDbGFzcygpLCBzb2NrZXRBZGRyZXNzKSk7Ci0KLSAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGFkZHIgPSAoSW5ldFNvY2tldEFkZHJlc3Mpc29ja2V0QWRkcmVzczsKLSAgICAgICAgICAgIGlmICghc2V0dGluZ3MuYXV0aGVudGljYXRlKGFkZHIuZ2V0QWRkcmVzcygpLCBhZGRyLmdldFBvcnQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gTG9nIGF0IGluZm8gbGV2ZWwgYXMgYW55dGhpbmcgdGhhdCBjYW4gcmVhY2ggdGhlIGluYm91bmQgcG9ydCBjb3VsZCBoaXQgdGhpcwotICAgICAgICAgICAgICAgIC8vIGFuZCB0cmlnZ2VyIGEgbG9nIG9mIG5vaXNlLiAgRmFpbGVkIG91dGJvdW5kIGNvbm5lY3Rpb25zIHRvIGtub3duIGNsdXN0ZXIgZW5kcG9pbnRzCi0gICAgICAgICAgICAgICAgLy8gc3RpbGwgZmFpbCB3aXRoIGFuIEVSUk9SIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbiB0byBhbGVydCBvcGVyYXRvcnMgdGhhdCBhcmVuJ3Qgd2F0Y2hpbmcgbG9ncyBjbG9zZWx5LgotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJBdXRoZW50aWNhdGUgcmVqZWN0ZWQgaW5ib3VuZCBpbnRlcm5vZGUgY29ubmVjdGlvbiBmcm9tIHt9IiwgYWRkcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKQEAgLTU3OCw3ICs2MTYsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIENvbm5lY3Rpb24gdXNlcyBTU0wvVExTLCByZXBsYWNlIHRoZSBkZXRlY3Rpb24gaGFuZGxlciB3aXRoIGEgU3NsSGFuZGxlciBhbmQgc28gdXNlIGVuY3J5cHRpb24uCiAgICAgICAgICAgICAgICAgU3NsSGFuZGxlciBzc2xIYW5kbGVyID0gZ2V0U3NsSGFuZGxlcigicmVwbGFjaW5nIG9wdGlvbmFsIiwgY3R4LmNoYW5uZWwoKSwgZW5jcnlwdGlvbk9wdGlvbnMpOwotICAgICAgICAgICAgICAgIGN0eC5waXBlbGluZSgpLnJlcGxhY2UodGhpcywgInNzbCIsIHNzbEhhbmRsZXIpOworICAgICAgICAgICAgICAgIGN0eC5waXBlbGluZSgpLnJlcGxhY2UodGhpcywgU1NMX0hBTkRMRVJfTkFNRSwgc3NsSGFuZGxlcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvSW5ib3VuZENvbm5lY3Rpb25TZXR0aW5ncy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0luYm91bmRDb25uZWN0aW9uU2V0dGluZ3MuamF2YQppbmRleCAyZWFiOWJjLi40NDhkYTYyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvSW5ib3VuZENvbm5lY3Rpb25TZXR0aW5ncy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9JbmJvdW5kQ29ubmVjdGlvblNldHRpbmdzLmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQ7CiAKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CkBAIC03MSwxNiArNzAsNiBAQAogICAgICAgICB0aGlzKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOwogICAgIH0KIAotICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShJbmV0QWRkcmVzc0FuZFBvcnQgZW5kcG9pbnQpCi0gICAgewotICAgICAgICByZXR1cm4gYXV0aGVudGljYXRvci5hdXRoZW50aWNhdGUoZW5kcG9pbnQuZ2V0QWRkcmVzcygpLCBlbmRwb2ludC5nZXRQb3J0KCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShJbmV0QWRkcmVzcyBhZGRyZXNzLCBpbnQgcG9ydCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhdXRoZW50aWNhdG9yLmF1dGhlbnRpY2F0ZShhZGRyZXNzLCBwb3J0KTsKLSAgICB9Ci0KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICB7CiAgICAgICAgIHJldHVybiBmb3JtYXQoImFkZHJlc3M6ICglcyksIG5pYzogJXMsIGVuY3J5cHRpb246ICVzIiwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9JbnRlcm5vZGVDb25uZWN0aW9uVXRpbHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9JbnRlcm5vZGVDb25uZWN0aW9uVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDNkMWJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0ludGVybm9kZUNvbm5lY3Rpb25VdGlscy5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0OworCitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBpby5uZXR0eS5idWZmZXIuQnl0ZUJ1ZjsKK2ltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWw7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSGFuZGxlckNvbnRleHQ7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSW5ib3VuZEhhbmRsZXJBZGFwdGVyOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuc3NsLlNzbEhhbmRsZXI7CisKKy8qKgorICogQ2xhc3MgdGhhdCBjb250YWlucyBjZXJ0aWZpY2F0ZSB1dGlsaXR5IG1ldGhvZHMuCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlcm5vZGVDb25uZWN0aW9uVXRpbHMKK3sKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTU0xfSEFORExFUl9OQU1FID0gInNzbCI7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRElTQ0FSRF9IQU5ETEVSX05BTUUgPSAiZGlzY2FyZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEludGVybm9kZUNvbm5lY3Rpb25VdGlscy5jbGFzcyk7CisKKyAgICBwdWJsaWMgc3RhdGljIENlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzKENoYW5uZWwgY2hhbm5lbCkKKyAgICB7CisgICAgICAgIGZpbmFsIFNzbEhhbmRsZXIgc3NsSGFuZGxlciA9IChTc2xIYW5kbGVyKSBjaGFubmVsLnBpcGVsaW5lKCkuZ2V0KFNTTF9IQU5ETEVSX05BTUUpOworICAgICAgICBDZXJ0aWZpY2F0ZVtdIGNlcnRpZmljYXRlcyA9IG51bGw7CisgICAgICAgIGlmIChzc2xIYW5kbGVyICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlcyA9IHNzbEhhbmRsZXIuZW5naW5lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlc3Npb24oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGVlckNlcnRpZmljYXRlcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFNTTFBlZXJVbnZlcmlmaWVkRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJGYWlsZWQgdG8gZ2V0IHBlZXIgY2VydGlmaWNhdGVzIGZvciBwZWVyIHt9IiwgY2hhbm5lbC5yZW1vdGVBZGRyZXNzKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjZXJ0aWZpY2F0ZXM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU1NMRXJyb3IoZmluYWwgVGhyb3dhYmxlIGNhdXNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChjYXVzZSBpbnN0YW5jZW9mIENsb3NlZENoYW5uZWxFeGNlcHRpb24pCisgICAgICAgICAgICAgICAmJiBjYXVzZS5nZXRDYXVzZSgpID09IG51bGwKKyAgICAgICAgICAgICAgICYmIGNhdXNlLmdldFN0YWNrVHJhY2UoKVswXS5nZXRDbGFzc05hbWUoKS5jb250YWlucygiU3NsSGFuZGxlciIpCisgICAgICAgICAgICAgICAmJiBjYXVzZS5nZXRTdGFja1RyYWNlKClbMF0uZ2V0TWV0aG9kTmFtZSgpLmNvbnRhaW5zKCJjaGFubmVsSW5hY3RpdmUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNjYXJkIGhhbmRsZXIgcmVsZWFzZXMgdGhlIHJlY2VpdmVkIGRhdGEgc2lsZW50bHkuIHdoZW4gaW50ZXJub2RlIGF1dGhlbnRpY2F0aW9uIGZhaWxzLCB0aGUgY2hhbm5lbCBpcyBjbG9zZWQsCisgICAgICogYnV0IHRoZSBwZW5kaW5nIGJ1ZmZlcmVkIGRhdGEgbWF5IHN0aWxsIGJlIGZpcmVkIHRocm91Z2ggdGhlIHBpcGVsaW5lLiBUbyBhdm9pZCB0aGF0LCBhdXRoZW50aWNhdGlvbiBoYW5kbGVyIGlzCisgICAgICogcmVwbGFjZWQgd2l0aCB0aGlzIERpc2NhcmRIYW5kbGVyIHRvIHJlbGVhc2UgYWxsIHRoZSBidWZmZXJlZCBkYXRhLCB0byBhdm9pZCBoYW5kbGluZyB1bmF1dGhlbnRpY2F0ZWQgZGF0YSBpbiB0aGUKKyAgICAgKiBmb2xsb3dpbmcgaGFuZGxlcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCeXRlQnVmRGlzY2FyZEhhbmRsZXIgZXh0ZW5kcyBDaGFubmVsSW5ib3VuZEhhbmRsZXJBZGFwdGVyCisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2hhbm5lbFJlYWQoQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgT2JqZWN0IG1zZykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1zZyBpbnN0YW5jZW9mIEJ5dGVCdWYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKChCeXRlQnVmKSBtc2cpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdHguZmlyZUNoYW5uZWxSZWFkKG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvTWVzc2FnZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L01lc3NhZ2UuamF2YQppbmRleCAwOWU0YmEzLi5mYTE0MTM0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvTWVzc2FnZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdlLmphdmEKQEAgLTI2LDE0ICsyNiwxMiBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKLQogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuSW50czsKLQogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5SZXF1ZXN0RmFpbHVyZVJlYXNvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5JVmVyc2lvbmVkQXN5bW1ldHJpY1NlcmlhbGl6ZXI7CkBAIC01MCwxOSArNDgsMTMgQEAKIAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSU5VVEVTOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5OQU5PU0VDT05EUzsKLQogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXMuc2l6ZW9mOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydC5TZXJpYWxpemVyLmluZXRBZGRyZXNzQW5kUG9ydFNlcmlhbGl6ZXI7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlLlZFUlNJT05fMzAxNDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2UuVkVSU0lPTl8zMDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2UuVkVSU0lPTl80MDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2U7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlLio7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Nb25vdG9uaWNDbG9jay5HbG9iYWwuYXBwcm94VGltZTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nLmNvbXB1dGVVbnNpZ25lZFZJbnRTaXplOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy52aW50LlZJbnRDb2RpbmcuZ2V0VW5zaWduZWRWSW50OwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy52aW50LlZJbnRDb2Rpbmcuc2tpcFVuc2lnbmVkVkludDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nLio7CiAKIC8qKgogICogSW1tdXRhYmxlIG1haW4gdW5pdCBvZiBpbnRlcm5vZGUgY29tbXVuaWNhdGlvbiAtIHdoYXQgdXNlZCB0byBiZSB7QGNvZGUgTWVzc2FnZUlufSBhbmQge0Bjb2RlIE1lc3NhZ2VPdXR9IGZ1c2VkCkBAIC03ODUsOCArNzc3LDggQEAKICAgICAgICAgICAgIC8vIHRoZSBzYW1lIGJldHdlZW4gbm93IGFuZCB3aGVuIHRoZSByZWNpcGllbnQgcmVjb25zdHJ1Y3RzIGl0LgogICAgICAgICAgICAgb3V0LndyaXRlSW50KChpbnQpIGFwcHJveFRpbWUudHJhbnNsYXRlKCkudG9NaWxsaXNTaW5jZUVwb2NoKGhlYWRlci5jcmVhdGVkQXROYW5vcykpOwogICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KE5BTk9TRUNPTkRTLnRvTWlsbGlzKGhlYWRlci5leHBpcmVzQXROYW5vcyAtIGhlYWRlci5jcmVhdGVkQXROYW5vcykpOwotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGhlYWRlci52ZXJiLmlkKTsKLSAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChoZWFkZXIuZmxhZ3MpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoaGVhZGVyLnZlcmIuaWQpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoaGVhZGVyLmZsYWdzKTsKICAgICAgICAgICAgIHNlcmlhbGl6ZVBhcmFtcyhoZWFkZXIucGFyYW1zLCBvdXQsIHZlcnNpb24pOwogICAgICAgICB9CiAKQEAgLTc5Nyw4ICs3ODksOCBAQAogICAgICAgICAgICAgTW9ub3RvbmljQ2xvY2tUcmFuc2xhdGlvbiB0aW1lU25hcHNob3QgPSBhcHByb3hUaW1lLnRyYW5zbGF0ZSgpOwogICAgICAgICAgICAgbG9uZyBjcmVhdGlvblRpbWVOYW5vcyA9IGNhbGN1bGF0ZUNyZWF0aW9uVGltZU5hbm9zKGluLnJlYWRJbnQoKSwgdGltZVNuYXBzaG90LCBjdXJyZW50VGltZU5hbm9zKTsKICAgICAgICAgICAgIGxvbmcgZXhwaXJlc0F0TmFub3MgPSBnZXRFeHBpcmVzQXROYW5vcyhjcmVhdGlvblRpbWVOYW5vcywgY3VycmVudFRpbWVOYW5vcywgVGltZVVuaXQuTUlMTElTRUNPTkRTLnRvTmFub3MoaW4ucmVhZFVuc2lnbmVkVkludCgpKSk7Ci0gICAgICAgICAgICBWZXJiIHZlcmIgPSBWZXJiLmZyb21JZChJbnRzLmNoZWNrZWRDYXN0KGluLnJlYWRVbnNpZ25lZFZJbnQoKSkpOwotICAgICAgICAgICAgaW50IGZsYWdzID0gSW50cy5jaGVja2VkQ2FzdChpbi5yZWFkVW5zaWduZWRWSW50KCkpOworICAgICAgICAgICAgVmVyYiB2ZXJiID0gVmVyYi5mcm9tSWQoaW4ucmVhZFVuc2lnbmVkVkludDMyKCkpOworICAgICAgICAgICAgaW50IGZsYWdzID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICBNYXA8UGFyYW1UeXBlLCBPYmplY3Q+IHBhcmFtcyA9IGRlc2VyaWFsaXplUGFyYW1zKGluLCB2ZXJzaW9uKTsKICAgICAgICAgICAgIHJldHVybiBuZXcgSGVhZGVyKGlkLCB2ZXJiLCBwZWVyLCBjcmVhdGlvblRpbWVOYW5vcywgZXhwaXJlc0F0TmFub3MsIGZsYWdzLCBwYXJhbXMpOwogICAgICAgICB9CkBAIC04NDAsMTAgKzgzMiwxMCBAQAogICAgICAgICAgICAgbG9uZyBleHBpcmVzSW5NaWxsaXMgPSBnZXRVbnNpZ25lZFZJbnQoYnVmLCBpbmRleCk7CiAgICAgICAgICAgICBpbmRleCArPSBjb21wdXRlVW5zaWduZWRWSW50U2l6ZShleHBpcmVzSW5NaWxsaXMpOwogCi0gICAgICAgICAgICBWZXJiIHZlcmIgPSBWZXJiLmZyb21JZChJbnRzLmNoZWNrZWRDYXN0KGdldFVuc2lnbmVkVkludChidWYsIGluZGV4KSkpOworICAgICAgICAgICAgVmVyYiB2ZXJiID0gVmVyYi5mcm9tSWQoZ2V0VW5zaWduZWRWSW50MzIoYnVmLCBpbmRleCkpOwogICAgICAgICAgICAgaW5kZXggKz0gY29tcHV0ZVVuc2lnbmVkVkludFNpemUodmVyYi5pZCk7CiAKLSAgICAgICAgICAgIGludCBmbGFncyA9IEludHMuY2hlY2tlZENhc3QoZ2V0VW5zaWduZWRWSW50KGJ1ZiwgaW5kZXgpKTsKKyAgICAgICAgICAgIGludCBmbGFncyA9IGdldFVuc2lnbmVkVkludDMyKGJ1ZiwgaW5kZXgpOwogICAgICAgICAgICAgaW5kZXggKz0gY29tcHV0ZVVuc2lnbmVkVkludFNpemUoZmxhZ3MpOwogCiAgICAgICAgICAgICBNYXA8UGFyYW1UeXBlLCBPYmplY3Q+IHBhcmFtcyA9IGV4dHJhY3RQYXJhbXMoYnVmLCBpbmRleCwgdmVyc2lvbik7CkBAIC04NTcsNyArODQ5LDcgQEAKICAgICAgICAgcHJpdmF0ZSA8VD4gdm9pZCBzZXJpYWxpemVQb3N0NDAoTWVzc2FnZTxUPiBtZXNzYWdlLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgc2VyaWFsaXplSGVhZGVyUG9zdDQwKG1lc3NhZ2UuaGVhZGVyLCBvdXQsIHZlcnNpb24pOwotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KG1lc3NhZ2UucGF5bG9hZFNpemUodmVyc2lvbikpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIobWVzc2FnZS5wYXlsb2FkU2l6ZSh2ZXJzaW9uKSk7CiAgICAgICAgICAgICBtZXNzYWdlLnZlcmIoKS5zZXJpYWxpemVyKCkuc2VyaWFsaXplKG1lc3NhZ2UucGF5bG9hZCwgb3V0LCB2ZXJzaW9uKTsKICAgICAgICAgfQogCkBAIC0xMjIxLDcgKzEyMTMsNyBAQAogICAgICAgICBwcml2YXRlIHZvaWQgc2VyaWFsaXplUGFyYW1zKE1hcDxQYXJhbVR5cGUsIE9iamVjdD4gcGFyYW1zLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgaWYgKHZlcnNpb24gPj0gVkVSU0lPTl80MCkKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIocGFyYW1zLnNpemUoKSk7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KHBhcmFtcy5zaXplKCkpOwogCkBAIC0xMjI5LDcgKzEyMjEsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFBhcmFtVHlwZSB0eXBlID0ga3YuZ2V0S2V5KCk7CiAgICAgICAgICAgICAgICAgaWYgKHZlcnNpb24gPj0gVkVSU0lPTl80MCkKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHR5cGUuaWQpOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMih0eXBlLmlkKTsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVURih0eXBlLmxlZ2FjeUFsaWFzKTsKIApAQCAtMTIzOCw3ICsxMjMwLDcgQEAKIAogICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBJbnRzLmNoZWNrZWRDYXN0KHNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUodmFsdWUsIHZlcnNpb24pKTsKICAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA+PSBWRVJTSU9OXzQwKQotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQobGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIobGVuZ3RoKTsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUludChsZW5ndGgpOwogCkBAIC0xMjQ4LDcgKzEyNDAsNyBAQAogCiAgICAgICAgIHByaXZhdGUgTWFwPFBhcmFtVHlwZSwgT2JqZWN0PiBkZXNlcmlhbGl6ZVBhcmFtcyhEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IHZlcnNpb24gPj0gVkVSU0lPTl80MCA/IEludHMuY2hlY2tlZENhc3QoaW4ucmVhZFVuc2lnbmVkVkludCgpKSA6IGluLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IHZlcnNpb24gPj0gVkVSU0lPTl80MCA/IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpIDogaW4ucmVhZEludCgpOwogCiAgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fUEFSQU1TOwpAQCAtMTI1OCwxMSArMTI1MCwxMSBAQAogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFBhcmFtVHlwZSB0eXBlID0gdmVyc2lvbiA+PSBWRVJTSU9OXzQwCi0gICAgICAgICAgICAgICAgICAgID8gUGFyYW1UeXBlLmxvb2tVcEJ5SWQoSW50cy5jaGVja2VkQ2FzdChpbi5yZWFkVW5zaWduZWRWSW50KCkpKQorICAgICAgICAgICAgICAgICAgICA/IFBhcmFtVHlwZS5sb29rVXBCeUlkKGluLnJlYWRVbnNpZ25lZFZJbnQzMigpKQogICAgICAgICAgICAgICAgICAgICA6IFBhcmFtVHlwZS5sb29rVXBCeUFsaWFzKGluLnJlYWRVVEYoKSk7CiAKICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gdmVyc2lvbiA+PSBWRVJTSU9OXzQwCi0gICAgICAgICAgICAgICAgICAgID8gSW50cy5jaGVja2VkQ2FzdChpbi5yZWFkVW5zaWduZWRWSW50KCkpCisgICAgICAgICAgICAgICAgICAgID8gaW4ucmVhZFVuc2lnbmVkVkludDMyKCkKICAgICAgICAgICAgICAgICAgICAgOiBpbi5yZWFkSW50KCk7CiAKICAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSB0eXBlKQpAQCAtMTMxMSwxMiArMTMwMywxMiBAQAogCiAgICAgICAgIHByaXZhdGUgdm9pZCBza2lwUGFyYW1zUG9zdDQwKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBJbnRzLmNoZWNrZWRDYXN0KGluLnJlYWRVbnNpZ25lZFZJbnQoKSk7CisgICAgICAgICAgICBpbnQgY291bnQgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKIAogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHNraXBVbnNpZ25lZFZJbnQoaW4pOwotICAgICAgICAgICAgICAgIGluLnNraXBCeXRlc0Z1bGx5KEludHMuY2hlY2tlZENhc3QoaW4ucmVhZFVuc2lnbmVkVkludCgpKSk7CisgICAgICAgICAgICAgICAgaW4uc2tpcEJ5dGVzRnVsbHkoaW4ucmVhZFVuc2lnbmVkVkludDMyKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdpbmdTZXJ2aWNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvTWVzc2FnaW5nU2VydmljZS5qYXZhCmluZGV4IGJjMzkwNTYuLmMyM2M2YWYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdpbmdTZXJ2aWNlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L01lc3NhZ2luZ1NlcnZpY2UuamF2YQpAQCAtMjAsMTAgKzIwLDEzIEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRDaGFubmVsRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogCkBAIC0yMDgsMTEgKzIxMSwyNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMzAgPSAxMDsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzMwMTQgPSAxMTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzQwID0gMTI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl80MSA9IDEzOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1pbmltdW1fdmVyc2lvbiA9IFZFUlNJT05fMzA7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgY3VycmVudF92ZXJzaW9uID0gVkVSU0lPTl80MDsKICAgICBzdGF0aWMgQWNjZXB0VmVyc2lvbnMgYWNjZXB0X21lc3NhZ2luZyA9IG5ldyBBY2NlcHRWZXJzaW9ucyhtaW5pbXVtX3ZlcnNpb24sIGN1cnJlbnRfdmVyc2lvbik7CiAgICAgc3RhdGljIEFjY2VwdFZlcnNpb25zIGFjY2VwdF9zdHJlYW1pbmcgPSBuZXcgQWNjZXB0VmVyc2lvbnMoY3VycmVudF92ZXJzaW9uLCBjdXJyZW50X3ZlcnNpb24pOworICAgIHN0YXRpYyBNYXA8SW50ZWdlciwgSW50ZWdlcj4gdmVyc2lvbk9yZGluYWxNYXAgPSBBcnJheXMuc3RyZWFtKFZlcnNpb24udmFsdWVzKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcCh2IC0+IHYudmFsdWUsIHYgLT4gdi5vcmRpbmFsKCkpKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgYW4gb3B0aW1pc2F0aW9uIHRvIHNwZWVkIHVwIHRoZSB0cmFuc2xhdGlvbiBvZiB0aGUgc2VyaWFsaXphdGlvbgorICAgICAqIHZlcnNpb24gdG8gdGhlIHtAbGluayBWZXJzaW9ufSBlbnVtIG9yZGluYWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmVyc2lvbiB0aGUgc2VyaWFsaXphdGlvbiB2ZXJzaW9uCisgICAgICogQHJldHVybiBhIHtAbGluayBWZXJzaW9ufSBvcmRpbmFsIHZhbHVlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VmVyc2lvbk9yZGluYWwoaW50IHZlcnNpb24pCisgICAgeworICAgICAgICBJbnRlZ2VyIG9yZGluYWwgPSB2ZXJzaW9uT3JkaW5hbE1hcC5nZXQodmVyc2lvbik7CisgICAgICAgIGlmIChvcmRpbmFsID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmtvd24gc2VyaWFsaXphdGlvbiB2ZXJzaW9uOiAiICsgdmVyc2lvbik7CisKKyAgICAgICAgcmV0dXJuIG9yZGluYWw7CisgICAgfQogCiAgICAgcHVibGljIGVudW0gVmVyc2lvbgogICAgIHsKQEAgLTQ4Myw3ICs1MDIsMTAgQEAKICAgICB7CiAgICAgICAgIE91dGJvdW5kQ29ubmVjdGlvbnMgcG9vbCA9IGNoYW5uZWxNYW5hZ2Vycy5nZXQodG8pOwogICAgICAgICBpZiAocG9vbCAhPSBudWxsKQorICAgICAgICB7CiAgICAgICAgICAgICBwb29sLmludGVycnVwdCgpOworICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkludGVycnVwdGVkIG91dGJvdW5kIGNvbm5lY3Rpb25zIHRvIHt9IiwgdG8pOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvT3V0Ym91bmRDb25uZWN0aW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvT3V0Ym91bmRDb25uZWN0aW9uLmphdmEKaW5kZXggODIxNTIxYi4uMmFmNmQzYiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L091dGJvdW5kQ29ubmVjdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9PdXRib3VuZENvbm5lY3Rpb24uamF2YQpAQCAtNjEsNiArNjEsNyBAQAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTWF0aC5tYXg7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5NYXRoLm1pbjsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlMTElTRUNPTkRTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuSW50ZXJub2RlQ29ubmVjdGlvblV0aWxzLmlzU1NMRXJyb3I7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlLmN1cnJlbnRfdmVyc2lvbjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk91dGJvdW5kQ29ubmVjdGlvbkluaXRpYXRvci4qOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuT3V0Ym91bmRDb25uZWN0aW9ucy5MQVJHRV9NRVNTQUdFX1RIUkVTSE9MRDsKQEAgLTExMDAsOCArMTEwMSw5IEBACiAKICAgICAgICAgICAgICAgICBpZiAoaGFzUGVuZGluZygpKQogICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1NTTEZhaWx1cmUgPSBpc1NTTEVycm9yKGNhdXNlKTsKICAgICAgICAgICAgICAgICAgICAgUHJvbWlzZTxSZXN1bHQ8TWVzc2FnaW5nU3VjY2Vzcz4+IHJlc3VsdCA9IEFzeW5jUHJvbWlzZS53aXRoRXhlY3V0b3IoZXZlbnRMb29wKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBuZXcgQ29ubmVjdGluZyhzdGF0ZS5kaXNjb25uZWN0ZWQoKSwgcmVzdWx0LCBldmVudExvb3Auc2NoZWR1bGUoKCkgLT4gYXR0ZW1wdChyZXN1bHQpLCBtYXgoMTAwLCByZXRyeVJhdGVNaWxsaXMpLCBNSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBuZXcgQ29ubmVjdGluZyhzdGF0ZS5kaXNjb25uZWN0ZWQoKSwgcmVzdWx0LCBldmVudExvb3Auc2NoZWR1bGUoKCkgLT4gYXR0ZW1wdChyZXN1bHQsIGlzU1NMRmFpbHVyZSksIG1heCgxMDAsIHJldHJ5UmF0ZU1pbGxpcyksIE1JTExJU0VDT05EUykpOwogICAgICAgICAgICAgICAgICAgICByZXRyeVJhdGVNaWxsaXMgPSBtaW4oMTAwMCwgcmV0cnlSYXRlTWlsbGlzICogMik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVsc2UKQEAgLTExODksNyArMTE5MSw3IEBACiAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICogTm90ZTogdGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkIG9uIHRoZSBldmVudCBsb29wLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgYXR0ZW1wdChQcm9taXNlPFJlc3VsdDxNZXNzYWdpbmdTdWNjZXNzPj4gcmVzdWx0KQorICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGF0dGVtcHQoUHJvbWlzZTxSZXN1bHQ8TWVzc2FnaW5nU3VjY2Vzcz4+IHJlc3VsdCwgYm9vbGVhbiBzc2xGYWxsYmFja0VuYWJsZWQpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgKytjb25uZWN0aW9uQXR0ZW1wdHM7CiAKQEAgLTEyMTYsNyArMTIxOCwyMCBAQAogICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB3ZSBjb25uZWN0IHRvIHRoZSBjb3JyZWN0IFNTTCBwb3J0CiAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSBzZXR0aW5ncy53aXRoTGVnYWN5UG9ydElmTmVjZXNzYXJ5KG1lc3NhZ2luZ1ZlcnNpb24pOwogCi0gICAgICAgICAgICAgICAgaW5pdGlhdGVNZXNzYWdpbmcoZXZlbnRMb29wLCB0eXBlLCBzZXR0aW5ncywgbWVzc2FnaW5nVmVyc2lvbiwgcmVzdWx0KQorICAgICAgICAgICAgICAgIC8vIEluIG1peGVkIG1vZGUgb3BlcmF0aW9uLCBzb21lIG5vZGVzIG1pZ2h0IGJlIGNvbmZpZ3VyZWQgdG8gdXNlIFNTTCBmb3IgaW50ZXJub2RlIGNvbm5lY3Rpb25zIGFuZAorICAgICAgICAgICAgICAgIC8vIG90aGVycyBtaWdodCBiZSBjb25maWd1cmVkIHRvIG5vdCB1c2UgU1NMLiBXaGVuIGEgbm9kZSBpcyBjb25maWd1cmVkIGluIG9wdGlvbmFsIFNTTCBtb2RlLCBJdCBzaG91bGQKKyAgICAgICAgICAgICAgICAvLyBiZSBhYmxlIHRvIGhhbmRsZSBTU0wgYW5kIE5vbi1TU0wgaW50ZXJub2RlIGNvbm5lY3Rpb25zLiBXZSB0YWtlIGNhcmUgb2YgdGhpcyB3aGVuIGFjY2VwdGluZyBOT04tU1NMCisgICAgICAgICAgICAgICAgLy8gY29ubmVjdGlvbiBpbiBJbmJvdW5kIGNvbm5lY3Rpb24gYnkgaGF2aW5nIG9wdGlvbmFsIFNTTCBoYW5kbGVyIGZvciBpbmJvdW5kIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgICAgIC8vIEZvciBvdXRib3VuZCBjb25uZWN0aW9ucywgaWYgdGhlIGF1dGhlbnRpY2F0aW9uIGZhaWxzLCB3ZSBzaG91bGQgZmFsbCBiYWNrIHRvIG90aGVyIFNTTCBzdHJhdGVnaWVzCisgICAgICAgICAgICAgICAgLy8gd2hpbGUgdGFsa2luZyB0byBvbGRlciBub2RlcyBpbiB0aGUgY2x1c3RlciB3aGljaCBhcmUgY29uZmlndXJlZCB0byBtYWtlIE5PTi1TU0wgY29ubmVjdGlvbnMKKyAgICAgICAgICAgICAgICBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlW10gZmFsbEJhY2tTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlcyA9IFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUudmFsdWVzKCk7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gc3NsRmFsbGJhY2tFbmFibGVkICYmIHNldHRpbmdzLndpdGhFbmNyeXB0aW9uKCkgJiYgc2V0dGluZ3MuZW5jcnlwdGlvbi5nZXRPcHRpb25hbCgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSAoY29ubmVjdGlvbkF0dGVtcHRzIC0gMSkgJSBmYWxsQmFja1NzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGVzLmxlbmd0aCA6IDA7CisgICAgICAgICAgICAgICAgaWYgKGZhbGxCYWNrU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZXNbaW5kZXhdICE9IFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuU0VSVkVSX0NPTkZJRykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJDb25uZWN0aW9uSWQge30gaXMgZmFsbGluZyBiYWNrIHRvIHt9IHJlY29ubmVjdCBzdHJhdGVneSBmb3IgcmV0cnkiLCBpZCgpLCBmYWxsQmFja1NzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGVzW2luZGV4XSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluaXRpYXRlTWVzc2FnaW5nKGV2ZW50TG9vcCwgdHlwZSwgZmFsbEJhY2tTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlc1tpbmRleF0sIHNldHRpbmdzLCBtZXNzYWdpbmdWZXJzaW9uLCByZXN1bHQpCiAgICAgICAgICAgICAgICAgLmFkZExpc3RlbmVyKGZ1dHVyZSAtPiB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChmdXR1cmUuaXNDYW5jZWxsZWQoKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTEyMzEsNyArMTI0Niw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgUHJvbWlzZTxSZXN1bHQ8TWVzc2FnaW5nU3VjY2Vzcz4+IHJlc3VsdCA9IEFzeW5jUHJvbWlzZS53aXRoRXhlY3V0b3IoZXZlbnRMb29wKTsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IG5ldyBDb25uZWN0aW5nKHN0YXRlLmRpc2Nvbm5lY3RlZCgpLCByZXN1bHQpOwotICAgICAgICAgICAgICAgIGF0dGVtcHQocmVzdWx0KTsKKyAgICAgICAgICAgICAgICBhdHRlbXB0KHJlc3VsdCwgZmFsc2UpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9PdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9PdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuamF2YQppbmRleCBhMTg3MDY4Li5lYmQzMGY1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvT3V0Ym91bmRDb25uZWN0aW9uSW5pdGlhdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L091dGJvdW5kQ29ubmVjdGlvbkluaXRpYXRvci5qYXZhCkBAIC0yMSwxMyArMjEsMTYgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CisKIGltcG9ydCBpby5uZXR0eS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOyAvL2NoZWNrc3R5bGU6IHBlcm1pdCB0aGlzIGltcG9ydAogaW1wb3J0IGlvLm5ldHR5LnV0aWwuY29uY3VycmVudC5Qcm9taXNlOyAvL2NoZWNrc3R5bGU6IHBlcm1pdCB0aGlzIGltcG9ydAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQXN5bmNQcm9taXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuSW1tZWRpYXRlRnV0dXJlOworCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIApAQCAtNTYsOSArNTksMTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5JU3NsQ29udGV4dEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuU1NMRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KVk1TdGFiaWxpdHlJbnNwZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5JbW1lZGlhdGVGdXR1cmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5LkJ1ZmZlclBvb2xzOwogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lio7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSUludGVybm9kZUF1dGhlbnRpY2F0b3IuSW50ZXJub2RlQ29ubmVjdGlvbkRpcmVjdGlvbi5PVVRCT1VORDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JSW50ZXJub2RlQXV0aGVudGljYXRvci5JbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uLk9VVEJPVU5EX1BSRUNPTk5FQ1Q7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5JbnRlcm5vZGVDb25uZWN0aW9uVXRpbHMuRElTQ0FSRF9IQU5ETEVSX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5JbnRlcm5vZGVDb25uZWN0aW9uVXRpbHMuU1NMX0hBTkRMRVJfTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LkludGVybm9kZUNvbm5lY3Rpb25VdGlscy5jZXJ0aWZpY2F0ZXM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlLlZFUlNJT05fNDA7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5IYW5kc2hha2VQcm90b2NvbC4qOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuQ29ubmVjdGlvblR5cGUuU1RSRUFNSU5HOwpAQCAtODUsMTUgKzk0LDE3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE91dGJvdW5kQ29ubmVjdGlvbkluaXRpYXRvci5jbGFzcyk7CiAKICAgICBwcml2YXRlIGZpbmFsIENvbm5lY3Rpb25UeXBlIHR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlIHNzbENvbm5lY3Rpb25UeXBlOwogICAgIHByaXZhdGUgZmluYWwgT3V0Ym91bmRDb25uZWN0aW9uU2V0dGluZ3Mgc2V0dGluZ3M7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgcmVxdWVzdE1lc3NhZ2luZ1ZlcnNpb247IC8vIGZvciBwcmU0MCBub2RlcwogICAgIHByaXZhdGUgZmluYWwgUHJvbWlzZTxSZXN1bHQ8U3VjY2Vzc1R5cGU+PiByZXN1bHRQcm9taXNlOwogICAgIHByaXZhdGUgYm9vbGVhbiBpc0Nsb3NlZDsKIAotICAgIHByaXZhdGUgT3V0Ym91bmRDb25uZWN0aW9uSW5pdGlhdG9yKENvbm5lY3Rpb25UeXBlIHR5cGUsIE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzIHNldHRpbmdzLAorICAgIHByaXZhdGUgT3V0Ym91bmRDb25uZWN0aW9uSW5pdGlhdG9yKENvbm5lY3Rpb25UeXBlIHR5cGUsIFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUgc3NsQ29ubmVjdGlvblR5cGUsIE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzIHNldHRpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXF1ZXN0TWVzc2FnaW5nVmVyc2lvbiwgUHJvbWlzZTxSZXN1bHQ8U3VjY2Vzc1R5cGU+PiByZXN1bHRQcm9taXNlKQogICAgIHsKICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5zc2xDb25uZWN0aW9uVHlwZSA9IHNzbENvbm5lY3Rpb25UeXBlOwogICAgICAgICB0aGlzLnJlcXVlc3RNZXNzYWdpbmdWZXJzaW9uID0gcmVxdWVzdE1lc3NhZ2luZ1ZlcnNpb247CiAgICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5nczsKICAgICAgICAgdGhpcy5yZXN1bHRQcm9taXNlID0gcmVzdWx0UHJvbWlzZTsKQEAgLTEwNiw5ICsxMTcsMTAgQEAKICAgICAgKgogICAgICAqIFRoZSByZXR1cm5lZCB7QGNvZGUgRnV0dXJlfSBpcyBndWFyYW50ZWVkIHRvIGJlIGNvbXBsZXRlZCBvbiB0aGUgc3VwcGxpZWQgZXZlbnRMb29wLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgRnV0dXJlPFJlc3VsdDxTdHJlYW1pbmdTdWNjZXNzPj4gaW5pdGlhdGVTdHJlYW1pbmcoRXZlbnRMb29wIGV2ZW50TG9vcCwgT3V0Ym91bmRDb25uZWN0aW9uU2V0dGluZ3Mgc2V0dGluZ3MsIGludCByZXF1ZXN0TWVzc2FnaW5nVmVyc2lvbikKKyAgICBwdWJsaWMgc3RhdGljIEZ1dHVyZTxSZXN1bHQ8U3RyZWFtaW5nU3VjY2Vzcz4+IGluaXRpYXRlU3RyZWFtaW5nKEV2ZW50TG9vcCBldmVudExvb3AsIE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZSBzc2xDb25uZWN0aW9uVHlwZSwgaW50IHJlcXVlc3RNZXNzYWdpbmdWZXJzaW9uKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBPdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3I8U3RyZWFtaW5nU3VjY2Vzcz4oU1RSRUFNSU5HLCBzZXR0aW5ncywgcmVxdWVzdE1lc3NhZ2luZ1ZlcnNpb24sIEFzeW5jUHJvbWlzZS53aXRoRXhlY3V0b3IoZXZlbnRMb29wKSkKKyAgICAgICAgcmV0dXJuIG5ldyBPdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3I8U3RyZWFtaW5nU3VjY2Vzcz4oU1RSRUFNSU5HLCBzc2xDb25uZWN0aW9uVHlwZSwgc2V0dGluZ3MsIHJlcXVlc3RNZXNzYWdpbmdWZXJzaW9uLCBBc3luY1Byb21pc2Uud2l0aEV4ZWN1dG9yKGV2ZW50TG9vcCkpCiAgICAgICAgICAgICAgICAuaW5pdGlhdGUoZXZlbnRMb29wKTsKICAgICB9CiAKQEAgLTExOSw5ICsxMzEsMTAgQEAKICAgICAgKgogICAgICAqIFRoZSByZXR1cm5lZCB7QGNvZGUgRnV0dXJlfSBpcyBndWFyYW50ZWVkIHRvIGJlIGNvbXBsZXRlZCBvbiB0aGUgc3VwcGxpZWQgZXZlbnRMb29wLgogICAgICAqLwotICAgIHN0YXRpYyBGdXR1cmU8UmVzdWx0PE1lc3NhZ2luZ1N1Y2Nlc3M+PiBpbml0aWF0ZU1lc3NhZ2luZyhFdmVudExvb3AgZXZlbnRMb29wLCBDb25uZWN0aW9uVHlwZSB0eXBlLCBPdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncyBzZXR0aW5ncywgaW50IHJlcXVlc3RNZXNzYWdpbmdWZXJzaW9uLCBQcm9taXNlPFJlc3VsdDxNZXNzYWdpbmdTdWNjZXNzPj4gcmVzdWx0KQorICAgIHN0YXRpYyBGdXR1cmU8UmVzdWx0PE1lc3NhZ2luZ1N1Y2Nlc3M+PiBpbml0aWF0ZU1lc3NhZ2luZyhFdmVudExvb3AgZXZlbnRMb29wLCBDb25uZWN0aW9uVHlwZSB0eXBlLCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlIHNzbENvbm5lY3Rpb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncyBzZXR0aW5ncywgaW50IHJlcXVlc3RNZXNzYWdpbmdWZXJzaW9uLCBQcm9taXNlPFJlc3VsdDxNZXNzYWdpbmdTdWNjZXNzPj4gcmVzdWx0KQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBPdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3I8Pih0eXBlLCBzZXR0aW5ncywgcmVxdWVzdE1lc3NhZ2luZ1ZlcnNpb24sIHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIG5ldyBPdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3I8Pih0eXBlLCBzc2xDb25uZWN0aW9uVHlwZSwgc2V0dGluZ3MsIHJlcXVlc3RNZXNzYWdpbmdWZXJzaW9uLCByZXN1bHQpCiAgICAgICAgICAgICAgICAuaW5pdGlhdGUoZXZlbnRMb29wKTsKICAgICB9CiAKQEAgLTEzMCwxMyArMTQzLDE1IEBACiAgICAgICAgIGlmIChsb2dnZXIuaXNUcmFjZUVuYWJsZWQoKSkKICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiY3JlYXRpbmcgb3V0Ym91bmQgYm9vdHN0cmFwIHRvIHt9LCByZXF1ZXN0VmVyc2lvbjoge30iLCBzZXR0aW5ncywgcmVxdWVzdE1lc3NhZ2luZ1ZlcnNpb24pOwogCi0gICAgICAgIGlmICghc2V0dGluZ3MuYXV0aGVudGljYXRlKCkpCisgICAgICAgIGlmICghc2V0dGluZ3MuYXV0aGVudGljYXRvci5hdXRoZW50aWNhdGUoc2V0dGluZ3MudG8uZ2V0QWRkcmVzcygpLCBzZXR0aW5ncy50by5nZXRQb3J0KCksIG51bGwsIE9VVEJPVU5EX1BSRUNPTk5FQ1QpKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyBpbnRlcnJ1cHQgb3RoZXIgY29ubmVjdGlvbnMsIHNvIHRoZXkgbXVzdCBhdHRlbXB0IHRvIHJlLWF1dGhlbnRpY2F0ZQogICAgICAgICAgICAgTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLmludGVycnVwdE91dGJvdW5kKHNldHRpbmdzLnRvKTsKLSAgICAgICAgICAgIHJldHVybiBJbW1lZGlhdGVGdXR1cmUuZmFpbHVyZShuZXcgSU9FeGNlcHRpb24oImF1dGhlbnRpY2F0aW9uIGZhaWxlZCB0byAiICsgc2V0dGluZ3MuY29ubmVjdFRvSWQoKSkpOworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJBdXRoZW50aWNhdGlvbiBmYWlsZWQgdG8gIiArIHNldHRpbmdzLmNvbm5lY3RUb0lkKCkpOworICAgICAgICAgICAgcmV0dXJuIEltbWVkaWF0ZUZ1dHVyZS5mYWlsdXJlKG5ldyBJT0V4Y2VwdGlvbigiQXV0aGVudGljYXRpb24gZmFpbGVkIHRvICIgKyBzZXR0aW5ncy5jb25uZWN0VG9JZCgpKSk7CiAgICAgICAgIH0KIAorCiAgICAgICAgIC8vIHRoaXMgaXMgYSBiaXQgdWdseSwgYnV0IGlzIHRoZSBlYXNpZXN0IHdheSB0byBlbnN1cmUgdGhhdCBpZiB3ZSB0aW1lb3V0IHdlIGNhbiBwcm9wYWdhdGUgYSBzdWl0YWJsZSBlcnJvciBtZXNzYWdlCiAgICAgICAgIC8vIGFuZCBzdGlsbCBndWFyYW50ZWUgdGhhdCwgaWYgb24gdGltaW5nIG91dCB3ZSByYWNlZCB3aXRoIHN1Y2Nlc3MsIHRoZSBzdWNjZXNzZnVsbHkgY3JlYXRlZCBjaGFubmVsIGlzIGhhbmRsZWQKICAgICAgICAgQXRvbWljQm9vbGVhbiB0aW1lZG91dCA9IG5ldyBBdG9taWNCb29sZWFuKCk7CkBAIC0xOTIsMjUgKzIwNywzMyBAQAogICAgICAgICByZXR1cm4gYm9vdHN0cmFwOwogICAgIH0KIAorICAgIHB1YmxpYyBlbnVtIFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUKKyAgICB7CisgICAgICAgIFNFUlZFUl9DT05GSUcsIC8vIE9yaWdpbmFsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNlcnZlcgorICAgICAgICBNVExTLAorICAgICAgICBTU0wsCisgICAgICAgIE5PX1NTTAorICAgIH0KKwogICAgIHByaXZhdGUgY2xhc3MgSW5pdGlhbGl6ZXIgZXh0ZW5kcyBDaGFubmVsSW5pdGlhbGl6ZXI8U29ja2V0Q2hhbm5lbD4KICAgICB7CiAgICAgICAgIHB1YmxpYyB2b2lkIGluaXRDaGFubmVsKFNvY2tldENoYW5uZWwgY2hhbm5lbCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgICAgICB7CiAgICAgICAgICAgICBDaGFubmVsUGlwZWxpbmUgcGlwZWxpbmUgPSBjaGFubmVsLnBpcGVsaW5lKCk7CiAKLSAgICAgICAgICAgIC8vIG9yZGVyIG9mIGhhbmRsZXJzOiBzc2wgLT4gbG9nZ2VyIC0+IGhhbmRzaGFrZUhhbmRsZXIKLSAgICAgICAgICAgIGlmIChzZXR0aW5ncy53aXRoRW5jcnlwdGlvbigpKQorICAgICAgICAgICAgLy8gb3JkZXIgb2YgaGFuZGxlcnM6IHNzbCAtPiBzZXJ2ZXItYXV0aGVudGljYXRpb24gLT4gbG9nZ2VyIC0+IGhhbmRzaGFrZUhhbmRsZXIKKyAgICAgICAgICAgIGlmICgoc3NsQ29ubmVjdGlvblR5cGUgPT0gU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5TRVJWRVJfQ09ORklHICYmIHNldHRpbmdzLndpdGhFbmNyeXB0aW9uKCkpCisgICAgICAgICAgICAgICAgfHwgc3NsQ29ubmVjdGlvblR5cGUgPT0gU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5TU0wgfHwgc3NsQ29ubmVjdGlvblR5cGUgPT0gU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5NVExTKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIHNob3VsZCBhY3R1YWxseSBlbmNyeXB0IHRoaXMgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgIFNzbENvbnRleHQgc3NsQ29udGV4dCA9IFNTTEZhY3RvcnkuZ2V0T3JDcmVhdGVTc2xDb250ZXh0KHNldHRpbmdzLmVuY3J5cHRpb24sIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNzbENvbnRleHRGYWN0b3J5LlNvY2tldFR5cGUuQ0xJRU5UKTsKKyAgICAgICAgICAgICAgICBTc2xDb250ZXh0IHNzbENvbnRleHQgPSBnZXRTc2xDb250ZXh0KHNzbENvbm5lY3Rpb25UeXBlKTsKICAgICAgICAgICAgICAgICAvLyBmb3Igc29tZSByZWFzb24gY2hhbm5lbC5yZW1vdGVBZGRyZXNzKCkgd2lsbCByZXR1cm4gbnVsbAogICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBhZGRyZXNzID0gc2V0dGluZ3MudG87CiAgICAgICAgICAgICAgICAgSW5ldFNvY2tldEFkZHJlc3MgcGVlciA9IHNldHRpbmdzLmVuY3J5cHRpb24ucmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24gPyBuZXcgSW5ldFNvY2tldEFkZHJlc3MoYWRkcmVzcy5nZXRBZGRyZXNzKCksIGFkZHJlc3MuZ2V0UG9ydCgpKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgU3NsSGFuZGxlciBzc2xIYW5kbGVyID0gbmV3U3NsSGFuZGxlcihjaGFubmVsLCBzc2xDb250ZXh0LCBwZWVyKTsKICAgICAgICAgICAgICAgICBsb2dnZXIudHJhY2UoImNyZWF0aW5nIG91dGJvdW5kIG5ldHR5IFNzbENvbnRleHQ6IGNvbnRleHQ9e30sIGVuZ2luZT17fSIsIHNzbENvbnRleHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIHNzbEhhbmRsZXIuZW5naW5lKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgIHBpcGVsaW5lLmFkZEZpcnN0KCJzc2wiLCBzc2xIYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBwaXBlbGluZS5hZGRGaXJzdChTU0xfSEFORExFUl9OQU1FLCBzc2xIYW5kbGVyKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBpcGVsaW5lLmFkZExhc3QoInNlcnZlci1hdXRoZW50aWNhdGlvbiIsIG5ldyBTZXJ2ZXJBdXRoZW50aWNhdGlvbkhhbmRsZXIoc2V0dGluZ3MpKTsKIAogICAgICAgICAgICAgaWYgKFdJUkVUUkFDRSkKICAgICAgICAgICAgICAgICBwaXBlbGluZS5hZGRMYXN0KCJsb2dnZXIiLCBuZXcgTG9nZ2luZ0hhbmRsZXIoTG9nTGV2ZWwuSU5GTykpOwpAQCAtMjE4LDYgKzI0MSw1OSBAQAogICAgICAgICAgICAgcGlwZWxpbmUuYWRkTGFzdCgiaGFuZHNoYWtlIiwgbmV3IEhhbmRsZXIoKSk7CiAgICAgICAgIH0KIAorICAgICAgICBwcml2YXRlIFNzbENvbnRleHQgZ2V0U3NsQ29udGV4dChTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlIGNvbm5lY3Rpb25UeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYm9vbGVhbiByZXF1aXJlQ2xpZW50QXV0aCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25UeXBlID09IFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuTVRMUyB8fCBjb25uZWN0aW9uVHlwZSA9PSBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNTTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXF1aXJlQ2xpZW50QXV0aCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChjb25uZWN0aW9uVHlwZSA9PSBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNFUlZFUl9DT05GSUcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVxdWlyZUNsaWVudEF1dGggPSBzZXR0aW5ncy53aXRoRW5jcnlwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFNTTEZhY3RvcnkuZ2V0T3JDcmVhdGVTc2xDb250ZXh0KHNldHRpbmdzLmVuY3J5cHRpb24sIHJlcXVpcmVDbGllbnRBdXRoLCBJU3NsQ29udGV4dEZhY3RvcnkuU29ja2V0VHlwZS5DTElFTlQpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBdXRoZW50aWNhdGVzIHRoZSBzZXJ2ZXIgYmVmb3JlIGFuIG91dGJvdW5kIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQuIElmIGEgY29ubmVjdGlvbiBpcyBTU0wgYmFzZWQgY29ubmVjdGlvbgorICAgICAqIFNlcnZlcidzIGlkZW50aXR5IGlzIHZlcmlmaWVkIGR1cmluZyBzc2wgaGFuZHNoYWtlIHVzaW5nIHJvb3QgY2VydGlmaWNhdGUgaW4gdHJ1c3RzdG9yZS4gT25lIG1heSBjaG9vc2UgdG8gaWdub3JlCisgICAgICogb3V0Ym91bmQgYXV0aGVudGljYXRpb24gb3IgcGVyZm9ybSByZXF1aXJlZCBhdXRoZW50aWNhdGlvbiBmb3Igb3V0Ym91bmQgY29ubmVjdGlvbnMgaW4gdGhlIGltcGxlbWVudGF0aW9uCisgICAgICogb2YgSUludGVybm9kZUF1dGhlbnRpY2F0b3IgaW50ZXJmYWNlLgorICAgICAqLworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyBjbGFzcyBTZXJ2ZXJBdXRoZW50aWNhdGlvbkhhbmRsZXIgZXh0ZW5kcyBCeXRlVG9NZXNzYWdlRGVjb2RlcgorICAgIHsKKyAgICAgICAgZmluYWwgT3V0Ym91bmRDb25uZWN0aW9uU2V0dGluZ3Mgc2V0dGluZ3M7CisKKyAgICAgICAgU2VydmVyQXV0aGVudGljYXRpb25IYW5kbGVyKE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzIHNldHRpbmdzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgZGVjb2RlKENoYW5uZWxIYW5kbGVyQ29udGV4dCBjaGFubmVsSGFuZGxlckNvbnRleHQsIEJ5dGVCdWYgYnl0ZUJ1ZiwgTGlzdDxPYmplY3Q+IGxpc3QpIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgLy8gRXh0cmFjdCBjZXJ0aWZpY2F0ZXMgZnJvbSBTU0wgaGFuZGxlcihoYW5kbGVyIHdpdGggbmFtZSAic3NsIikuCisgICAgICAgICAgICBmaW5hbCBDZXJ0aWZpY2F0ZVtdIGNlcnRpZmljYXRlcyA9IGNlcnRpZmljYXRlcyhjaGFubmVsSGFuZGxlckNvbnRleHQuY2hhbm5lbCgpKTsKKyAgICAgICAgICAgIGlmICghc2V0dGluZ3MuYXV0aGVudGljYXRvci5hdXRoZW50aWNhdGUoc2V0dGluZ3MudG8uZ2V0QWRkcmVzcygpLCBzZXR0aW5ncy50by5nZXRQb3J0KCksIGNlcnRpZmljYXRlcywgT1VUQk9VTkQpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGludGVycnVwdCBvdGhlciBjb25uZWN0aW9ucywgc28gdGhleSBtdXN0IGF0dGVtcHQgdG8gcmUtYXV0aGVudGljYXRlCisgICAgICAgICAgICAgICAgTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLmludGVycnVwdE91dGJvdW5kKHNldHRpbmdzLnRvKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCB0byAiICsgc2V0dGluZ3MuY29ubmVjdFRvSWQoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBUbyByZWxlYXNlIGFsbCB0aGUgcGVuZGluZyBidWZmZXJlZCBkYXRhLCByZXBsYWNlIGF1dGhlbnRpY2F0aW9uIGhhbmRsZXIgd2l0aCBkaXNjYXJkIGhhbmRsZXIuCisgICAgICAgICAgICAgICAgLy8gVGhpcyBhdm9pZHMgcGVuZGluZyBpbmJvdW5kIGRhdGEgdG8gYmUgZmlyZWQgdGhyb3VnaCB0aGUgcGlwZWxpbmUKKyAgICAgICAgICAgICAgICBjaGFubmVsSGFuZGxlckNvbnRleHQucGlwZWxpbmUoKS5yZXBsYWNlKHRoaXMsIERJU0NBUkRfSEFORExFUl9OQU1FLCBuZXcgSW50ZXJub2RlQ29ubmVjdGlvblV0aWxzLkJ5dGVCdWZEaXNjYXJkSGFuZGxlcigpKTsKKyAgICAgICAgICAgICAgICBjaGFubmVsSGFuZGxlckNvbnRleHQucGlwZWxpbmUoKS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYW5uZWxIYW5kbGVyQ29udGV4dC5waXBlbGluZSgpLnJlbW92ZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgY2xhc3MgSGFuZGxlciBleHRlbmRzIEJ5dGVUb01lc3NhZ2VEZWNvZGVyCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvT3V0Ym91bmRDb25uZWN0aW9uU2V0dGluZ3MuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9PdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncy5qYXZhCmluZGV4IDViMjQ2ZTMuLjQ3MjFlNjEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9PdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9PdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncy5qYXZhCkBAIC0yMyw5ICsyMyw5IEBACiAKIGltcG9ydCBpby5uZXR0eS5jaGFubmVsLldyaXRlQnVmZmVyV2F0ZXJNYXJrOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSUludGVybm9kZUF1dGhlbnRpY2F0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5FbmNyeXB0aW9uT3B0aW9ucy5TZXJ2ZXJFbmNyeXB0aW9uT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXMuR29zc2lwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JRW5kcG9pbnRTbml0Y2g7CkBAIC00MywxMSArNDMsMTAgQEAKIEBTdXBwcmVzc1dhcm5pbmdzKHsgIldlYWtlckFjY2VzcyIsICJ1bnVzZWQiIH0pCiBwdWJsaWMgY2xhc3MgT3V0Ym91bmRDb25uZWN0aW9uU2V0dGluZ3MKIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5UUkFEQ19UQ1BfTk9ERUxBWV9QUk9QRVJUWSA9IENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAib3RjX2ludHJhZGNfdGNwX25vZGVsYXkiOwogICAgIC8qKgogICAgICAqIEVuYWJsZWQvZGlzYWJsZSBUQ1BfTk9ERUxBWSBmb3IgaW50cmFkYyBjb25uZWN0aW9ucy4gRGVmYXVsdHMgdG8gZW5hYmxlZC4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIElOVFJBRENfVENQX05PREVMQVkgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkoSU5UUkFEQ19UQ1BfTk9ERUxBWV9QUk9QRVJUWSwgInRydWUiKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTlRSQURDX1RDUF9OT0RFTEFZID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk9UQ19JTlRSQURDX1RDUF9OT0RFTEFZLmdldEJvb2xlYW4oKTsKIAogICAgIHB1YmxpYyBlbnVtIEZyYW1pbmcKICAgICB7CkBAIC04Miw3ICs4MSw3IEBACiAgICAgcHVibGljIGZpbmFsIElJbnRlcm5vZGVBdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0b3I7CiAgICAgcHVibGljIGZpbmFsIEluZXRBZGRyZXNzQW5kUG9ydCB0bzsKICAgICBwdWJsaWMgZmluYWwgSW5ldEFkZHJlc3NBbmRQb3J0IGNvbm5lY3RUbzsgLy8gbWF5IGJlIHJlcHJlc2VudGVkIGJ5IGEgZGlmZmVyZW50IElQIGFkZHJlc3Mgb24gdGhpcyBub2RlJ3MgbG9jYWwgbmV0d29yawotICAgIHB1YmxpYyBmaW5hbCBFbmNyeXB0aW9uT3B0aW9ucyBlbmNyeXB0aW9uOworICAgIHB1YmxpYyBmaW5hbCBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyBlbmNyeXB0aW9uOwogICAgIHB1YmxpYyBmaW5hbCBGcmFtaW5nIGZyYW1pbmc7CiAgICAgcHVibGljIGZpbmFsIEludGVnZXIgc29ja2V0U2VuZEJ1ZmZlclNpemVJbkJ5dGVzOwogICAgIHB1YmxpYyBmaW5hbCBJbnRlZ2VyIGFwcGxpY2F0aW9uU2VuZFF1ZXVlQ2FwYWNpdHlJbkJ5dGVzOwpAQCAtMTEyLDcgKzExMSw3IEBACiAgICAgcHJpdmF0ZSBPdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncyhJSW50ZXJub2RlQXV0aGVudGljYXRvciBhdXRoZW50aWNhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IHRvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IGNvbm5lY3RUbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY3J5cHRpb25PcHRpb25zIGVuY3J5cHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyBlbmNyeXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWluZyBmcmFtaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBzb2NrZXRTZW5kQnVmZmVyU2l6ZUluQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGFwcGxpY2F0aW9uU2VuZFF1ZXVlQ2FwYWNpdHlJbkJ5dGVzLApAQCAtMTU3LDExICsxNTYsNiBAQAogICAgICAgICB0aGlzLmVuZHBvaW50VG9WZXJzaW9uID0gZW5kcG9pbnRUb1ZlcnNpb247CiAgICAgfQogCi0gICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhdXRoZW50aWNhdG9yLmF1dGhlbnRpY2F0ZSh0by5nZXRBZGRyZXNzKCksIHRvLmdldFBvcnQoKSk7Ci0gICAgfQotCiAgICAgcHVibGljIGJvb2xlYW4gd2l0aEVuY3J5cHRpb24oKQogICAgIHsKICAgICAgICAgcmV0dXJuIGVuY3J5cHRpb24gIT0gbnVsbDsKQEAgLTM2NSw3ICszNTksNyBAQAogICAgICAgICByZXR1cm4gZGVidWcgIT0gbnVsbCA/IGRlYnVnIDogT3V0Ym91bmREZWJ1Z0NhbGxiYWNrcy5OT05FOwogICAgIH0KIAotICAgIHB1YmxpYyBFbmNyeXB0aW9uT3B0aW9ucyBlbmNyeXB0aW9uKCkKKyAgICBwdWJsaWMgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgZW5jcnlwdGlvbigpCiAgICAgewogICAgICAgICByZXR1cm4gZW5jcnlwdGlvbiAhPSBudWxsID8gZW5jcnlwdGlvbiA6IGRlZmF1bHRFbmNyeXB0aW9uT3B0aW9ucyh0byk7CiAgICAgfQpAQCAtNTAxLDcgKzQ5NSw3IEBACiAgICAgfQogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIEVuY3J5cHRpb25PcHRpb25zIGRlZmF1bHRFbmNyeXB0aW9uT3B0aW9ucyhJbmV0QWRkcmVzc0FuZFBvcnQgZW5kcG9pbnQpCisgICAgc3RhdGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIGRlZmF1bHRFbmNyeXB0aW9uT3B0aW9ucyhJbmV0QWRkcmVzc0FuZFBvcnQgZW5kcG9pbnQpCiAgICAgewogICAgICAgICBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyBvcHRpb25zID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldEludGVybm9kZU1lc3NhZ2luZ0VuY3lwdGlvbk9wdGlvbnMoKTsKICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc2hvdWxkRW5jcnlwdChlbmRwb2ludCkgPyBvcHRpb25zIDogbnVsbDsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9PdXRib3VuZENvbm5lY3Rpb25zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvT3V0Ym91bmRDb25uZWN0aW9ucy5qYXZhCmluZGV4IGFkODdlYzUuLjA3MjkxOTQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9PdXRib3VuZENvbm5lY3Rpb25zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L091dGJvdW5kQ29ubmVjdGlvbnMuamF2YQpAQCAtMzksOSArMzksOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk5vU3BhbUxvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uOwogCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5JbnRlZ2VyLmdldEludGVnZXI7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5NYXRoLm1heDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZy5QUk9QRVJUWV9QUkVGSVg7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuT1RDUF9MQVJHRV9NRVNTQUdFX1RIUkVTSE9MRDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLkdvc3NpcGVyLmluc3RhbmNlOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuRnJhbWVFbmNvZGVyQ3JjLkhFQURFUl9BTkRfVFJBSUxFUl9MRU5HVEg7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5MZWdhY3lMWjRDb25zdGFudHMuSEVBREVSX0xFTkdUSDsKQEAgLTYyLDcgKzYxLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoT3V0Ym91bmRDb25uZWN0aW9ucy5jbGFzcyk7CiAKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVJHRV9NRVNTQUdFX1RIUkVTSE9MRCA9IGdldEludGVnZXIoUFJPUEVSVFlfUFJFRklYICsgIm90Y3BfbGFyZ2VfbWVzc2FnZV90aHJlc2hvbGQiLCAxMDI0ICogNjQpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEFSR0VfTUVTU0FHRV9USFJFU0hPTEQgPSBPVENQX0xBUkdFX01FU1NBR0VfVEhSRVNIT0xELmdldEludCgpCiAgICAgLSBtYXgobWF4KEhFQURFUl9MRU5HVEgsIEhFQURFUl9BTkRfVFJBSUxFUl9MRU5HVEgpLCBGcmFtZUVuY29kZXJMWjQuSEVBREVSX0FORF9UUkFJTEVSX0xFTkdUSCk7CiAKICAgICBwcml2YXRlIGZpbmFsIENvbmRpdGlvbiBtZXRyaWNzUmVhZHkgPSBuZXdPbmVUaW1lQ29uZGl0aW9uKCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvUGFyYW1UeXBlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvUGFyYW1UeXBlLmphdmEKaW5kZXggMzdmNGJmOC4uNmNiOGZiNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L1BhcmFtVHlwZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9QYXJhbVR5cGUuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYWNpbmcuVHJhY2luZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5JbnQzMlNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSW50NjRTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlJhbmdlc1NlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLk1hdGgubWF4OwpAQCAtNDIsMzAgKzQzLDMwIEBACiAgKi8KIHB1YmxpYyBlbnVtIFBhcmFtVHlwZQogewotICAgIEZPUldBUkRfVE8gICAgICAgICAgKDAsICJGV0RfVE8iLCAgICAgICAgRm9yd2FyZGluZ0luZm8uc2VyaWFsaXplciksCi0gICAgUkVTUE9ORF9UTyAgICAgICAgICAoMSwgIkZXRF9GUk0iLCAgICAgICBmd2RGcm1TZXJpYWxpemVyKSwKKyAgICBGT1JXQVJEX1RPICAgICAgICAgICAgICAgICAgKDAsICAiRldEX1RPIiwgICAgICAgICAgRm9yd2FyZGluZ0luZm8uc2VyaWFsaXplciksCisgICAgUkVTUE9ORF9UTyAgICAgICAgICAgICAgICAgICgxLCAgIkZXRF9GUk0iLCAgICAgICAgIGZ3ZEZybVNlcmlhbGl6ZXIpLAogCiAgICAgQERlcHJlY2F0ZWQKLSAgICBGQUlMVVJFX1JFU1BPTlNFICAgICgyLCAiRkFJTCIsICAgICAgICAgIExlZ2FjeUZsYWcuc2VyaWFsaXplciksCisgICAgRkFJTFVSRV9SRVNQT05TRSAgICAgICAgICAgICgyLCAgIkZBSUwiLCAgICAgICAgICAgIExlZ2FjeUZsYWcuc2VyaWFsaXplciksCiAgICAgQERlcHJlY2F0ZWQKLSAgICBGQUlMVVJFX1JFQVNPTiAgICAgICgzLCAiRkFJTF9SRUFTT04iLCAgIFJlcXVlc3RGYWlsdXJlUmVhc29uLnNlcmlhbGl6ZXIpLAorICAgIEZBSUxVUkVfUkVBU09OICAgICAgICAgICAgICAoMywgICJGQUlMX1JFQVNPTiIsICAgICBSZXF1ZXN0RmFpbHVyZVJlYXNvbi5zZXJpYWxpemVyKSwKICAgICBARGVwcmVjYXRlZAotICAgIEZBSUxVUkVfQ0FMTEJBQ0sgICAgKDQsICJDQUxfQkFDIiwgICAgICAgTGVnYWN5RmxhZy5zZXJpYWxpemVyKSwKKyAgICBGQUlMVVJFX0NBTExCQUNLICAgICAgICAgICAgKDQsICAiQ0FMX0JBQyIsICAgICAgICAgTGVnYWN5RmxhZy5zZXJpYWxpemVyKSwKIAotICAgIFRSQUNFX1NFU1NJT04gICAgICAgKDUsICJUcmFjZVNlc3Npb24iLCAgVGltZVVVSUQuU2VyaWFsaXplci5pbnN0YW5jZSksCi0gICAgVFJBQ0VfVFlQRSAgICAgICAgICAoNiwgIlRyYWNlVHlwZSIsICAgICBUcmFjaW5nLnRyYWNlVHlwZVNlcmlhbGl6ZXIpLAorICAgIFRSQUNFX1NFU1NJT04gICAgICAgICAgICAgICAoNSwgICJUcmFjZVNlc3Npb24iLCAgICBUaW1lVVVJRC5TZXJpYWxpemVyLmluc3RhbmNlKSwKKyAgICBUUkFDRV9UWVBFICAgICAgICAgICAgICAgICAgKDYsICAiVHJhY2VUeXBlIiwgICAgICAgVHJhY2luZy50cmFjZVR5cGVTZXJpYWxpemVyKSwKIAogICAgIEBEZXByZWNhdGVkCi0gICAgVFJBQ0tfUkVQQUlSRURfREFUQSAoNywgIlRyYWNrUmVwYWlyZWQiLCBMZWdhY3lGbGFnLnNlcmlhbGl6ZXIpLAorICAgIFRSQUNLX1JFUEFJUkVEX0RBVEEgICAgICAgICAoNywgICJUcmFja1JlcGFpcmVkIiwgICBMZWdhY3lGbGFnLnNlcmlhbGl6ZXIpLAogCi0gICAgVE9NQlNUT05FX0ZBSUwoOCwgIlRTRiIsIEludDMyU2VyaWFsaXplci5zZXJpYWxpemVyKSwKLSAgICBUT01CU1RPTkVfV0FSTklORyg5LCAiVFNXIiwgSW50MzJTZXJpYWxpemVyLnNlcmlhbGl6ZXIpLAotICAgIExPQ0FMX1JFQURfU0laRV9GQUlMKDEwLCAiTFJTRiIsIEludDY0U2VyaWFsaXplci5zZXJpYWxpemVyKSwKLSAgICBMT0NBTF9SRUFEX1NJWkVfV0FSTigxMSwgIkxSU1ciLCBJbnQ2NFNlcmlhbGl6ZXIuc2VyaWFsaXplciksCi0gICAgUk9XX0lOREVYX1JFQURfU0laRV9GQUlMKDEyLCAiUklSU0YiLCBJbnQ2NFNlcmlhbGl6ZXIuc2VyaWFsaXplciksCi0gICAgUk9XX0lOREVYX1JFQURfU0laRV9XQVJOKDEzLCAiUklSU1ciLCBJbnQ2NFNlcmlhbGl6ZXIuc2VyaWFsaXplciksCi0KLSAgICBDVVNUT01fTUFQICAgICAgICAgICgxNCwgIkNVU1RPTSIsICAgICAgIEN1c3RvbVBhcmFtc1NlcmlhbGl6ZXIuc2VyaWFsaXplcik7CisgICAgVE9NQlNUT05FX0ZBSUwgICAgICAgICAgICAgICg4LCAgIlRTRiIsICAgICAgICAgICAgIEludDMyU2VyaWFsaXplci5zZXJpYWxpemVyKSwKKyAgICBUT01CU1RPTkVfV0FSTklORyAgICAgICAgICAgKDksICAiVFNXIiwgICAgICAgICAgICAgSW50MzJTZXJpYWxpemVyLnNlcmlhbGl6ZXIpLAorICAgIExPQ0FMX1JFQURfU0laRV9GQUlMICAgICAgICAoMTAsICJMUlNGIiwgICAgICAgICAgICBJbnQ2NFNlcmlhbGl6ZXIuc2VyaWFsaXplciksCisgICAgTE9DQUxfUkVBRF9TSVpFX1dBUk4gICAgICAgICgxMSwgIkxSU1ciLCAgICAgICAgICAgIEludDY0U2VyaWFsaXplci5zZXJpYWxpemVyKSwKKyAgICBST1dfSU5ERVhfUkVBRF9TSVpFX0ZBSUwgICAgKDEyLCAiUklSU0YiLCAgICAgICAgICAgSW50NjRTZXJpYWxpemVyLnNlcmlhbGl6ZXIpLAorICAgIFJPV19JTkRFWF9SRUFEX1NJWkVfV0FSTiAgICAoMTMsICJSSVJTVyIsICAgICAgICAgICBJbnQ2NFNlcmlhbGl6ZXIuc2VyaWFsaXplciksCisgICAgQ1VTVE9NX01BUCAgICAgICAgICAgICAgICAgICgxNCwgIkNVU1RPTSIsICAgICAgICAgIEN1c3RvbVBhcmFtc1NlcmlhbGl6ZXIuc2VyaWFsaXplciksCisgICAgU05BUFNIT1RfUkFOR0VTICAgICAgICAgICAgICgxNSwgIlNOQVBTSE9UX1JBTkdFUyIsIFJhbmdlc1NlcmlhbGl6ZXIuc2VyaWFsaXplcik7CiAKICAgICBmaW5hbCBpbnQgaWQ7CiAgICAgQERlcHJlY2F0ZWQgZmluYWwgU3RyaW5nIGxlZ2FjeUFsaWFzOyAvLyBwcmUtNC4wIHdlIHVzZWQgdG8gc2VyaWFsaXplIGVudGlyZSBwYXJhbSBuYW1lIHN0cmluZwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L1JlcXVlc3RDYWxsYmFjay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L1JlcXVlc3RDYWxsYmFjay5qYXZhCmluZGV4IGJkMTRjYWUuLjE0ZTAxNjkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9SZXF1ZXN0Q2FsbGJhY2suamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvUmVxdWVzdENhbGxiYWNrLmphdmEKQEAgLTE3LDYgKzE3LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5SZXF1ZXN0RmFpbHVyZVJlYXNvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKIApAQCAtNjMsNCArNjUsMTkgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIHN0YXRpYyBib29sZWFuIGlzVGltZW91dChNYXA8SW5ldEFkZHJlc3NBbmRQb3J0LCBSZXF1ZXN0RmFpbHVyZVJlYXNvbj4gZmFpbHVyZVJlYXNvbkJ5RW5kcG9pbnQpCisgICAgeworICAgICAgICAvLyBUaGUgcmVhc29uIHRoYXQgYWxsIG11c3QgYmUgdGltZW91dCB0byBiZSBjYWxsZWQgYSB0aW1lb3V0IGlzIGFzIGZvbGxvd3MKKyAgICAgICAgLy8gQXNzdW1lIFJGPTYsIFFVT1JVTSwgYW5kIGZhaWx1cmVSZWFzb25CeUVuZHBvaW50LnNpemUoKSA9PSAzCisgICAgICAgIC8vIFIxIC0+IFRJTUVPVVQKKyAgICAgICAgLy8gUjIgLT4gVElNRU9VVAorICAgICAgICAvLyBSMyAtPiBSRUFEX1RPT19NQU5ZX1RPTUJTVE9ORVMKKyAgICAgICAgLy8gU2luY2Ugd2UgZ290IGEgcmVwbHkgYmFjaywgYW5kIHRoYXQgd2FzIGEgZmFpbHVyZSwgd2Ugc2hvdWxkIHJldHVybiBhIGZhaWx1cmUgbGV0dGluZyB0aGUgdXNlciBrbm93LgorICAgICAgICAvLyBXaGVuIGFsbCBmYWlsdXJlcyBhcmUgYSB0aW1lb3V0LCB0aGVuIHRoaXMgaXMgYSByYWNlIGNvbmRpdGlvbiB3aXRoCisgICAgICAgIC8vIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQXdhaXRhYmxlLmF3YWl0KGxvbmcsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KQorICAgICAgICAvLyBUaGUgcmFjZSBpcyB0aGF0IHRoZSBtZXNzYWdlIGV4cGlyZSBwYXRoIHJ1bnMgYW5kIGV4cGlyZXMgYWxsIG1lc3NhZ2VzLCB0aGlzIHRoZW4gY2FzdWVzIHRoZSBjb25kaXRpb24KKyAgICAgICAgLy8gdG8gc2lnbmFsIHRlbGxpbmcgdGhlIGNhbGxlciAiZ290IGFsbCByZXBsaWVzISIuCisgICAgICAgIHJldHVybiBmYWlsdXJlUmVhc29uQnlFbmRwb2ludC52YWx1ZXMoKS5zdHJlYW0oKS5hbGxNYXRjaChSZXF1ZXN0RmFpbHVyZVJlYXNvbi5USU1FT1VUOjplcXVhbHMpOworICAgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L1NvY2tldEZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9Tb2NrZXRGYWN0b3J5LmphdmEKaW5kZXggMzNmZmY2Yi4uNzgyNTYyNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L1NvY2tldEZhY3RvcnkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvU29ja2V0RmFjdG9yeS5qYXZhCkBAIC02MSw3ICs2MSw2IEBACiBpbXBvcnQgaW8ubmV0dHkudXRpbC5pbnRlcm5hbC5sb2dnaW5nLkludGVybmFsTG9nZ2VyRmFjdG9yeTsKIGltcG9ydCBpby5uZXR0eS51dGlsLmludGVybmFsLmxvZ2dpbmcuU2xmNEpMb2dnZXJGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuTmFtZWRUaHJlYWRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LlNTTEZhY3Rvcnk7CkBAIC03Myw2ICs3Miw3IEBACiBpbXBvcnQgc3RhdGljIGlvLm5ldHR5LmNoYW5uZWwudW5peC5FcnJvcnMuRVJST1JfRUNPTk5SRUZVU0VEX05FR0FUSVZFOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5TRUNPTkRTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LkV4ZWN1dG9yRmFjdG9yeS5HbG9iYWwuZXhlY3V0b3JGYWN0b3J5OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLklOVEVSTk9ERV9FVkVOVF9USFJFQURTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzLmlzQ2F1c2VkQnk7CiAKIC8qKgpAQCAtODMsNyArODMsNyBAQAogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTb2NrZXRGYWN0b3J5LmNsYXNzKTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9USFJFQURTID0gSW50ZWdlci5nZXRJbnRlZ2VyKENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiaW50ZXJub2RlLWV2ZW50LXRocmVhZHMiLCBGQlV0aWxpdGllcy5nZXRBdmFpbGFibGVQcm9jZXNzb3JzKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVkVOVF9USFJFQURTID0gSU5URVJOT0RFX0VWRU5UX1RIUkVBRFMuZ2V0SW50KEZCVXRpbGl0aWVzLmdldEF2YWlsYWJsZVByb2Nlc3NvcnMoKSk7CiAKICAgICAvKioKICAgICAgKiBUaGUgZGVmYXVsdCB0YXNrIHF1ZXVlIHVzZWQgYnkge0Bjb2RlIE5pb0V2ZW50TG9vcH0gYW5kIHtAY29kZSBFcG9sbEV2ZW50TG9vcH0gaXMge0Bjb2RlIE1wc2NVbmJvdW5kZWRBcnJheVF1ZXVlfSwKQEAgLTIxNSw3ICsyMTUsNyBAQAogICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFNzbEhhbmRsZXJ9IGZyb20gcHJvdmlkZWQgU3NsQ29udGV4dC4KICAgICAgKiBAcGFyYW0gcGVlciBlbmFibGVzIGVuZHBvaW50IHZlcmlmaWNhdGlvbiBmb3IgcmVtb3RlIGFkZHJlc3Mgd2hlbiBub3QgbnVsbAogICAgICAqLwotICAgIHN0YXRpYyBTc2xIYW5kbGVyIG5ld1NzbEhhbmRsZXIoQ2hhbm5lbCBjaGFubmVsLCBTc2xDb250ZXh0IHNzbENvbnRleHQsIEBOdWxsYWJsZSBJbmV0U29ja2V0QWRkcmVzcyBwZWVyKQorICAgIHB1YmxpYyBzdGF0aWMgU3NsSGFuZGxlciBuZXdTc2xIYW5kbGVyKENoYW5uZWwgY2hhbm5lbCwgU3NsQ29udGV4dCBzc2xDb250ZXh0LCBATnVsbGFibGUgSW5ldFNvY2tldEFkZHJlc3MgcGVlcikKICAgICB7CiAgICAgICAgIGlmIChwZWVyID09IG51bGwpCiAgICAgICAgICAgICByZXR1cm4gc3NsQ29udGV4dC5uZXdIYW5kbGVyKGNoYW5uZWwuYWxsb2MoKSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvVmVyYi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L1ZlcmIuamF2YQppbmRleCBkNTBhMTg3Li5kNTJmMTRjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvVmVyYi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9WZXJiLmphdmEKQEAgLTk2LDYgKzk2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLnYxLlByZXBhcmVWZXJiSGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLnYxLlByb3Bvc2VWZXJiSGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuUmVwbGljYXRpb25Eb25lVmVyYkhhbmRsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUmVmbGVjdGlvblV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlVVSURTZXJpYWxpemVyOwogCkBAIC0zNTEsNyArMzUyLDcgQEAKICAgICAgICAgU3VwcGxpZXI8PyBleHRlbmRzIElWZXJiSGFuZGxlcjw/Pj4gb3JpZ2luYWwgPSB0aGlzLmhhbmRsZXI7CiAgICAgICAgIEZpZWxkIGZpZWxkID0gVmVyYi5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJoYW5kbGVyIik7CiAgICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIEZpZWxkIG1vZGlmaWVycyA9IEZpZWxkLmNsYXNzLmdldERlY2xhcmVkRmllbGQoIm1vZGlmaWVycyIpOworICAgICAgICBGaWVsZCBtb2RpZmllcnMgPSBSZWZsZWN0aW9uVXRpbHMuZ2V0TW9kaWZpZXJzRmllbGQoKTsKICAgICAgICAgbW9kaWZpZXJzLnNldEFjY2Vzc2libGUodHJ1ZSk7CiAgICAgICAgIG1vZGlmaWVycy5zZXRJbnQoZmllbGQsIGZpZWxkLmdldE1vZGlmaWVycygpICYgfk1vZGlmaWVyLkZJTkFMKTsKICAgICAgICAgZmllbGQuc2V0KHRoaXMsIGhhbmRsZXIpOwpAQCAtMzY0LDcgKzM2NSw3IEBACiAgICAgICAgIFN1cHBsaWVyPD8gZXh0ZW5kcyBJVmVyc2lvbmVkQXN5bW1ldHJpY1NlcmlhbGl6ZXI8PywgPz4+IG9yaWdpbmFsID0gdGhpcy5zZXJpYWxpemVyOwogICAgICAgICBGaWVsZCBmaWVsZCA9IFZlcmIuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgic2VyaWFsaXplciIpOwogICAgICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICBGaWVsZCBtb2RpZmllcnMgPSBGaWVsZC5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJtb2RpZmllcnMiKTsKKyAgICAgICAgRmllbGQgbW9kaWZpZXJzID0gUmVmbGVjdGlvblV0aWxzLmdldE1vZGlmaWVyc0ZpZWxkKCk7CiAgICAgICAgIG1vZGlmaWVycy5zZXRBY2Nlc3NpYmxlKHRydWUpOwogICAgICAgICBtb2RpZmllcnMuc2V0SW50KGZpZWxkLCBmaWVsZC5nZXRNb2RpZmllcnMoKSAmIH5Nb2RpZmllci5GSU5BTCk7CiAgICAgICAgIGZpZWxkLnNldCh0aGlzLCBzZXJpYWxpemVyKTsKQEAgLTM3Nyw3ICszNzgsNyBAQAogICAgICAgICBUb0xvbmdGdW5jdGlvbjxUaW1lVW5pdD4gb3JpZ2luYWwgPSB0aGlzLmV4cGlyYXRpb247CiAgICAgICAgIEZpZWxkIGZpZWxkID0gVmVyYi5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJleHBpcmF0aW9uIik7CiAgICAgICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIEZpZWxkIG1vZGlmaWVycyA9IEZpZWxkLmNsYXNzLmdldERlY2xhcmVkRmllbGQoIm1vZGlmaWVycyIpOworICAgICAgICBGaWVsZCBtb2RpZmllcnMgPSBSZWZsZWN0aW9uVXRpbHMuZ2V0TW9kaWZpZXJzRmllbGQoKTsKICAgICAgICAgbW9kaWZpZXJzLnNldEFjY2Vzc2libGUodHJ1ZSk7CiAgICAgICAgIG1vZGlmaWVycy5zZXRJbnQoZmllbGQsIGZpZWxkLmdldE1vZGlmaWVycygpICYgfk1vZGlmaWVyLkZJTkFMKTsKICAgICAgICAgZmllbGQuc2V0KHRoaXMsIGV4cGlyYXRpb24pOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL0xvY2FsU3luY1Rhc2suamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9Mb2NhbFN5bmNUYXNrLmphdmEKaW5kZXggMjhhNmFjYy4uNWRmMDVjNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL0xvY2FsU3luY1Rhc2suamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvTG9jYWxTeW5jVGFzay5qYXZhCkBAIC0xNDksNyArMTQ5LDcgQEAKICAgICAgICAgICAgICAgICBzdGF0ZS50cmFjZSgie30ve30gKHt9JSkge30gaWR4Ont9e30iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KHBpLmN1cnJlbnRCeXRlcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkocGkudG90YWxCeXRlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkuY3VycmVudEJ5dGVzICogMTAwIC8gcGkudG90YWxCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaS5wcm9ncmVzc1BlcmNlbnRhZ2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaS5kaXJlY3Rpb24gPT0gUHJvZ3Jlc3NJbmZvLkRpcmVjdGlvbi5PVVQgPyAic2VudCB0byIgOiAicmVjZWl2ZWQgZnJvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkuc2Vzc2lvbkluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLnBlZXIgfSk7CkBAIC0yMDEsNCArMjAxLDQgQEAKICAgICAgICAgICAgIHBsYW4uZ2V0Q29vcmRpbmF0b3IoKS5nZXRBbGxTdHJlYW1TZXNzaW9ucygpLmZvckVhY2goU3RyZWFtU2Vzc2lvbjo6YWJvcnQpOwogICAgICAgICB9KTsKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1ByZXZpZXdSZXBhaXJUYXNrLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvUHJldmlld1JlcGFpclRhc2suamF2YQppbmRleCA3Y2U3ZDFmLi43MjhhODEzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvUHJldmlld1JlcGFpclRhc2suamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvUHJldmlld1JlcGFpclRhc2suamF2YQpAQCAtMjcsNiArMjcsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlJlcGFpck1ldHJpY3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEucmVwYWlyLmNvbnNpc3RlbnQuU3luY1N0YXRTdW1tYXJ5OwpAQCAtMTA0LDE0ICsxMDYsMTggQEAKICAgICAgICAgewogICAgICAgICAgICAgU2V0PFN0cmluZz4gbWlzbWF0Y2hpbmdUYWJsZXMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgICAgICBTZXQ8SW5ldEFkZHJlc3NBbmRQb3J0PiBub2RlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgIFNldDxSYW5nZTxUb2tlbj4+IHJhbmdlcyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgICAgIGZvciAoUmVwYWlyU2Vzc2lvblJlc3VsdCBzZXNzaW9uUmVzdWx0IDogcmVzdWx0cykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBmb3IgKFJlcGFpclJlc3VsdCByZXBhaXJSZXN1bHQgOiBlbXB0eUlmTnVsbChzZXNzaW9uUmVzdWx0LnJlcGFpckpvYlJlc3VsdHMpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChTeW5jU3RhdCBzdGF0IDogZW1wdHlJZk51bGwocmVwYWlyUmVzdWx0LnN0YXRzKSkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXQubnVtYmVyT2ZEaWZmZXJlbmNlcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YXQuZGlmZmVyZW5jZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc21hdGNoaW5nVGFibGVzLmFkZChyZXBhaXJSZXN1bHQuZGVzYy5jb2x1bW5GYW1pbHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlcy5hZGRBbGwoc3RhdC5kaWZmZXJlbmNlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbmFwc2hvdCBhbGwgcmVwbGljYXMsIGV2ZW4gaWYgdGhleSBkb24ndCBoYXZlIGFueSBkaWZmZXJlbmNlcwogICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuYWRkKHN0YXQubm9kZXMuY29vcmRpbmF0b3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMuYWRkKHN0YXQubm9kZXMucGVlcik7CkBAIC0xMjUsMTAgKzEzMSwxMyBAQAogICAgICAgICAgICAgICAgIC8vIHdlIGNhbiBqdXN0IGNoZWNrIHNuYXBzaG90IGV4aXN0ZW5jZSBsb2NhbGx5IHNpbmNlIHRoZSByZXBhaXIgY29vcmRpbmF0b3IgaXMgYWx3YXlzIGEgcmVwbGljYSAodW5saWtlIGluIHRoZSByZWFkIGNhc2UpCiAgICAgICAgICAgICAgICAgaWYgKCFLZXlzcGFjZS5vcGVuKGtleXNwYWNlKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSh0YWJsZSkuc25hcHNob3RFeGlzdHMoc25hcHNob3ROYW1lKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJ7fSBTbmFwc2hvdHRpbmcge30ue30gZm9yIHByZXZpZXcgcmVwYWlyIG1pc21hdGNoIHdpdGggdGFnIHt9IG9uIGluc3RhbmNlcyB7fSIsCisgICAgICAgICAgICAgICAgICAgIExpc3Q8UmFuZ2U8VG9rZW4+PiBub3JtYWxpemVkUmFuZ2VzID0gUmFuZ2Uubm9ybWFsaXplKHJhbmdlcyk7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJ7fSBTbmFwc2hvdHRpbmcge30ue30gZm9yIHByZXZpZXcgcmVwYWlyIG1pc21hdGNoIGZvciByYW5nZXMge30gd2l0aCB0YWcge30gb24gaW5zdGFuY2VzIHt9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5nZXRQcmV2aWV3S2luZCgpLmxvZ1ByZWZpeChwYXJlbnRTZXNzaW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c3BhY2UsIHRhYmxlLCBzbmFwc2hvdE5hbWUsIG5vZGVzKTsKLSAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY1NuYXBzaG90U2VydmljZS5yZXBhaXJlZERhdGFNaXNtYXRjaChLZXlzcGFjZS5vcGVuKGtleXNwYWNlKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSh0YWJsZSkubWV0YWRhdGEoKSwgbm9kZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzcGFjZSwgdGFibGUsIG5vcm1hbGl6ZWRSYW5nZXMsIHNuYXBzaG90TmFtZSwgbm9kZXMpOworICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljU25hcHNob3RTZXJ2aWNlLnJlcGFpcmVkRGF0YU1pc21hdGNoKEtleXNwYWNlLm9wZW4oa2V5c3BhY2UpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhYmxlKS5tZXRhZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRSYW5nZXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1N5bmNTdGF0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvU3luY1N0YXQuamF2YQppbmRleCA3YmI1MDNmLi4yMjQxOTE1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvU3luY1N0YXQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvU3luY1N0YXQuamF2YQpAQCAtMTcsOCArMTcsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5yZXBhaXI7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlNlc3Npb25TdW1tYXJ5OwogCiAvKioKQEAgLTI3LDIzICszMCwyMyBAQAogcHVibGljIGNsYXNzIFN5bmNTdGF0CiB7CiAgICAgcHVibGljIGZpbmFsIFN5bmNOb2RlUGFpciBub2RlczsKLSAgICBwdWJsaWMgZmluYWwgbG9uZyBudW1iZXJPZkRpZmZlcmVuY2VzOyAvLyBUT0RPOiByZXZlcnQgdG8gUmFuZ2U8VG9rZW4+CisgICAgcHVibGljIGZpbmFsIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiBkaWZmZXJlbmNlczsKICAgICBwdWJsaWMgZmluYWwgTGlzdDxTZXNzaW9uU3VtbWFyeT4gc3VtbWFyaWVzOwogCi0gICAgcHVibGljIFN5bmNTdGF0KFN5bmNOb2RlUGFpciBub2RlcywgbG9uZyBudW1iZXJPZkRpZmZlcmVuY2VzKQorICAgIHB1YmxpYyBTeW5jU3RhdChTeW5jTm9kZVBhaXIgbm9kZXMsIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiBkaWZmZXJlbmNlcykKICAgICB7Ci0gICAgICAgIHRoaXMobm9kZXMsIG51bWJlck9mRGlmZmVyZW5jZXMsIG51bGwpOworICAgICAgICB0aGlzKG5vZGVzLCBkaWZmZXJlbmNlcywgbnVsbCk7CiAgICAgfQogCi0gICAgcHVibGljIFN5bmNTdGF0KFN5bmNOb2RlUGFpciBub2RlcywgbG9uZyBudW1iZXJPZkRpZmZlcmVuY2VzLCBMaXN0PFNlc3Npb25TdW1tYXJ5PiBzdW1tYXJpZXMpCisgICAgcHVibGljIFN5bmNTdGF0KFN5bmNOb2RlUGFpciBub2RlcywgIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiBkaWZmZXJlbmNlcywgTGlzdDxTZXNzaW9uU3VtbWFyeT4gc3VtbWFyaWVzKQogICAgIHsKICAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzOwotICAgICAgICB0aGlzLm51bWJlck9mRGlmZmVyZW5jZXMgPSBudW1iZXJPZkRpZmZlcmVuY2VzOwogICAgICAgICB0aGlzLnN1bW1hcmllcyA9IHN1bW1hcmllczsKKyAgICAgICAgdGhpcy5kaWZmZXJlbmNlcyA9IGRpZmZlcmVuY2VzOwogICAgIH0KIAogICAgIHB1YmxpYyBTeW5jU3RhdCB3aXRoU3VtbWFyaWVzKExpc3Q8U2Vzc2lvblN1bW1hcnk+IHN1bW1hcmllcykKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgU3luY1N0YXQobm9kZXMsIG51bWJlck9mRGlmZmVyZW5jZXMsIHN1bW1hcmllcyk7CisgICAgICAgIHJldHVybiBuZXcgU3luY1N0YXQobm9kZXMsIGRpZmZlcmVuY2VzLCBzdW1tYXJpZXMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9TeW5jVGFzay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1N5bmNUYXNrLmphdmEKaW5kZXggYjMyNWViNC4uNzM5M2VmZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1N5bmNUYXNrLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1N5bmNUYXNrLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAKICAgICAgICAgdGhpcy5yYW5nZXNUb1N5bmMgPSByYW5nZXNUb1N5bmM7CiAgICAgICAgIHRoaXMubm9kZVBhaXIgPSBuZXcgU3luY05vZGVQYWlyKHByaW1hcnlFbmRwb2ludCwgcGVlcik7CiAgICAgICAgIHRoaXMucHJldmlld0tpbmQgPSBwcmV2aWV3S2luZDsKLSAgICAgICAgdGhpcy5zdGF0ID0gbmV3IFN5bmNTdGF0KG5vZGVQYWlyLCByYW5nZXNUb1N5bmMuc2l6ZSgpKTsKKyAgICAgICAgdGhpcy5zdGF0ID0gbmV3IFN5bmNTdGF0KG5vZGVQYWlyLCByYW5nZXNUb1N5bmMpOwogICAgIH0KIAogICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHN0YXJ0U3luYygpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvTG9jYWxTZXNzaW9ucy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvTG9jYWxTZXNzaW9ucy5qYXZhCmluZGV4IGVkMmJmMGIuLmVkMWUzN2EgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9jb25zaXN0ZW50L0xvY2FsU2Vzc2lvbnMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9Mb2NhbFNlc3Npb25zLmphdmEKQEAgLTk4LDYgKzk4LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5GdXR1cmU7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVBBSVJfQ0xFQU5VUF9JTlRFUlZBTF9TRUNPTkRTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFUEFJUl9ERUxFVEVfVElNRU9VVF9TRUNPTkRTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFUEFJUl9GQUlMX1RJTUVPVVRfU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVBBSVJfU1RBVFVTX0NIRUNLX1RJTUVPVVRfU0VDT05EUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmIuRkFJTEVEX1NFU1NJT05fTVNHOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi5GSU5BTElaRV9QUk9NSVNFX01TRzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmIuUFJFUEFSRV9DT05TSVNURU5UX1JTUDsKQEAgLTEyMSwyNiArMTI1LDIyIEBACiAgICAgICogQW1vdW50IG9mIHRpbWUgYSBzZXNzaW9uIGNhbiBnbyB3aXRob3V0IGFueSBhY3Rpdml0eSBiZWZvcmUgd2Ugc3RhcnQgY2hlY2tpbmcgdGhlIHN0YXR1cyBvZiBvdGhlcgogICAgICAqIHBhcnRpY2lwYW50cyB0byBzZWUgaWYgd2UndmUgbWlzc2VkIGEgbWVzc2FnZQogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tfU1RBVFVTX1RJTUVPVVQgPSBJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS5yZXBhaXJfc3RhdHVzX2NoZWNrX3RpbWVvdXRfc2Vjb25kcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRzLmNoZWNrZWRDYXN0KFRpbWVVbml0LkhPVVJTLnRvU2Vjb25kcygxKSkpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hFQ0tfU1RBVFVTX1RJTUVPVVQgPSBSRVBBSVJfU1RBVFVTX0NIRUNLX1RJTUVPVVRfU0VDT05EUy5nZXRJbnQoKTsKIAogICAgIC8qKgogICAgICAqIEFtb3VudCBvZiB0aW1lIGEgc2Vzc2lvbiBjYW4gZ28gd2l0aG91dCBhbnkgYWN0aXZpdHkgYmVmb3JlIGJlaW5nIGF1dG9tYXRpY2FsbHkgc2V0IHRvIEZBSUxFRAogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19GQUlMX1RJTUVPVVQgPSBJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS5yZXBhaXJfZmFpbF90aW1lb3V0X3NlY29uZHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cy5jaGVja2VkQ2FzdChUaW1lVW5pdC5EQVlTLnRvU2Vjb25kcygxKSkpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19GQUlMX1RJTUVPVVQgPSBSRVBBSVJfRkFJTF9USU1FT1VUX1NFQ09ORFMuZ2V0SW50KCk7CiAKICAgICAvKioKICAgICAgKiBBbW91bnQgb2YgdGltZSBhIGNvbXBsZXRlZCBzZXNzaW9uIGlzIGtlcHQgYXJvdW5kIGFmdGVyIGNvbXBsZXRpb24gYmVmb3JlIGJlaW5nIGRlbGV0ZWQsIHRoaXMgZ2l2ZXMKICAgICAgKiBjb21wYWN0aW9uIHBsZW50eSBvZiB0aW1lIHRvIG1vdmUgc3N0YWJsZXMgZnJvbSBzdWNjZXNzZnVsIHNlc3Npb25zIGludG8gdGhlIHJlcGFpcmVkIGJ1Y2tldAogICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19ERUxFVEVfVElNRU9VVCA9IEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLnJlcGFpcl9kZWxldGVfdGltZW91dF9zZWNvbmRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cy5jaGVja2VkQ2FzdChUaW1lVW5pdC5EQVlTLnRvU2Vjb25kcygxKSkpOworICAgIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19ERUxFVEVfVElNRU9VVCA9IFJFUEFJUl9ERUxFVEVfVElNRU9VVF9TRUNPTkRTLmdldEludCgpOwogICAgIC8qKgogICAgICAqIEhvdyBvZnRlbiBMb2NhbFNlc3Npb25zLmNsZWFudXAgaXMgcnVuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xFQU5VUF9JTlRFUlZBTCA9IEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLnJlcGFpcl9jbGVhbnVwX2ludGVydmFsX3NlY29uZHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cy5jaGVja2VkQ2FzdChUaW1lVW5pdC5NSU5VVEVTLnRvU2Vjb25kcygxMCkpKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTEVBTlVQX0lOVEVSVkFMID0gUkVQQUlSX0NMRUFOVVBfSU5URVJWQUxfU0VDT05EUy5nZXRJbnQoKTsKIAogICAgIHByaXZhdGUgc3RhdGljIFNldDxUYWJsZUlkPiB1dWlkVG9UYWJsZUlkKFNldDxVVUlEPiBzcmMpCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvU3luY1N0YXRTdW1tYXJ5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9TeW5jU3RhdFN1bW1hcnkuamF2YQppbmRleCAzZDIxNzAyLi44NTVhZDRiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9TeW5jU3RhdFN1bW1hcnkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9TeW5jU3RhdFN1bW1hcnkuamF2YQpAQCAtMjEsMTMgKzIxLDE4IEBACiBpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5yZXBhaXIuUmVwYWlyUmVzdWx0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcGFpci5SZXBhaXJTZXNzaW9uUmVzdWx0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcGFpci5TeW5jU3RhdDsKQEAgLTUwLDcgKzU1LDcgQEAKIAogICAgICAgICBpbnQgZmlsZXMgPSAwOwogICAgICAgICBsb25nIGJ5dGVzID0gMDsKLSAgICAgICAgbG9uZyByYW5nZXMgPSAwOworICAgICAgICBTZXQ8UmFuZ2U8VG9rZW4+PiByYW5nZXMgPSBuZXcgSGFzaFNldDw+KCk7CiAKICAgICAgICAgU2Vzc2lvbihJbmV0U29ja2V0QWRkcmVzcyBzcmMsIEluZXRTb2NrZXRBZGRyZXNzIGRzdCkKICAgICAgICAgewpAQCAtNjQsMTUgKzY5LDE1IEBACiAgICAgICAgICAgICBieXRlcyArPSBzdW1tYXJ5LnRvdGFsU2l6ZTsKICAgICAgICAgfQogCi0gICAgICAgIHZvaWQgY29uc3VtZVN1bW1hcmllcyhDb2xsZWN0aW9uPFN0cmVhbVN1bW1hcnk+IHN1bW1hcmllcywgbG9uZyBudW1SYW5nZXMpCisgICAgICAgIHZvaWQgY29uc3VtZVN1bW1hcmllcyhDb2xsZWN0aW9uPFN0cmVhbVN1bW1hcnk+IHN1bW1hcmllcywgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+IHJhbmdlcykKICAgICAgICAgewogICAgICAgICAgICAgc3VtbWFyaWVzLmZvckVhY2godGhpczo6Y29uc3VtZVN1bW1hcnkpOwotICAgICAgICAgICAgcmFuZ2VzICs9IG51bVJhbmdlczsKKyAgICAgICAgICAgIHRoaXMucmFuZ2VzLmFkZEFsbChyYW5nZXMpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcyAtPiAlczogJXMgcmFuZ2VzLCAlcyBzc3RhYmxlcywgJXMgYnl0ZXMiLCBzcmMsIGRzdCwgcmFuZ2VzLCBmaWxlcywgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoYnl0ZXMpKTsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcyAtPiAlczogJXMgcmFuZ2VzLCAlcyBzc3RhYmxlcywgJXMgYnl0ZXMiLCBzcmMsIGRzdCwgcmFuZ2VzLnNpemUoKSwgZmlsZXMsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGJ5dGVzKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTg0LDcgKzg5LDcgQEAKIAogICAgICAgICBpbnQgZmlsZXMgPSAtMTsKICAgICAgICAgbG9uZyBieXRlcyA9IC0xOwotICAgICAgICBpbnQgcmFuZ2VzID0gLTE7CisgICAgICAgIENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiByYW5nZXMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgIGJvb2xlYW4gdG90YWxzQ2FsY3VsYXRlZCA9IGZhbHNlOwogCiAgICAgICAgIGZpbmFsIE1hcDxQYWlyPEluZXRTb2NrZXRBZGRyZXNzLCBJbmV0U29ja2V0QWRkcmVzcz4sIFNlc3Npb24+IHNlc3Npb25zID0gbmV3IEhhc2hNYXA8PigpOwpAQCAtMTA5LDggKzExNCw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGZvciAoU2Vzc2lvblN1bW1hcnkgc3VtbWFyeTogc3RhdC5zdW1tYXJpZXMpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0T3JDcmVhdGUoc3VtbWFyeS5jb29yZGluYXRvciwgc3VtbWFyeS5wZWVyKS5jb25zdW1lU3VtbWFyaWVzKHN1bW1hcnkuc2VuZGluZ1N1bW1hcmllcywgc3RhdC5udW1iZXJPZkRpZmZlcmVuY2VzKTsKLSAgICAgICAgICAgICAgICBnZXRPckNyZWF0ZShzdW1tYXJ5LnBlZXIsIHN1bW1hcnkuY29vcmRpbmF0b3IpLmNvbnN1bWVTdW1tYXJpZXMoc3VtbWFyeS5yZWNlaXZpbmdTdW1tYXJpZXMsIHN0YXQubnVtYmVyT2ZEaWZmZXJlbmNlcyk7CisgICAgICAgICAgICAgICAgZ2V0T3JDcmVhdGUoc3VtbWFyeS5jb29yZGluYXRvciwgc3VtbWFyeS5wZWVyKS5jb25zdW1lU3VtbWFyaWVzKHN1bW1hcnkuc2VuZGluZ1N1bW1hcmllcywgc3RhdC5kaWZmZXJlbmNlcyk7CisgICAgICAgICAgICAgICAgZ2V0T3JDcmVhdGUoc3VtbWFyeS5wZWVyLCBzdW1tYXJ5LmNvb3JkaW5hdG9yKS5jb25zdW1lU3VtbWFyaWVzKHN1bW1hcnkucmVjZWl2aW5nU3VtbWFyaWVzLCBzdGF0LmRpZmZlcmVuY2VzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xMjMsMTIgKzEyOCwxMiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBmaWxlcyA9IDA7CiAgICAgICAgICAgICBieXRlcyA9IDA7Ci0gICAgICAgICAgICByYW5nZXMgPSAwOworICAgICAgICAgICAgcmFuZ2VzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICAgICAgZm9yIChTZXNzaW9uIHNlc3Npb246IHNlc3Npb25zLnZhbHVlcygpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZpbGVzICs9IHNlc3Npb24uZmlsZXM7CiAgICAgICAgICAgICAgICAgYnl0ZXMgKz0gc2Vzc2lvbi5ieXRlczsKLSAgICAgICAgICAgICAgICByYW5nZXMgKz0gc2Vzc2lvbi5yYW5nZXM7CisgICAgICAgICAgICAgICAgcmFuZ2VzLmFkZEFsbChzZXNzaW9uLnJhbmdlcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0b3RhbHNDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICAgICAgfQpAQCAtMTQ3LDIxICsxNTIsMzYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAotICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlcy4lcyAtICVzIHJhbmdlcywgJXMgc3N0YWJsZXMsICVzIGJ5dGVzXG4iLCBrZXlzcGFjZSwgdGFibGUsIHJhbmdlcywgZmlsZXMsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGJ5dGVzKSkpOworICAgICAgICAgICAgb3V0cHV0LmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlcy4lcyAtICVzIHJhbmdlcywgJXMgc3N0YWJsZXMsICVzIGJ5dGVzXG4iLCBrZXlzcGFjZSwgdGFibGUsIHJhbmdlcy5zaXplKCksIGZpbGVzLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShieXRlcykpKTsKKyAgICAgICAgICAgIGlmIChyYW5nZXMuc2l6ZSgpID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIgICAgTWlzbWF0Y2hpbmcgcmFuZ2VzOiAiKTsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgSXRlcmF0b3I8UmFuZ2U8VG9rZW4+PiByYW5nZUl0ZXJhdG9yID0gcmFuZ2VzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHJhbmdlSXRlcmF0b3IuaGFzTmV4dCgpICYmIGkgPCAzMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFJhbmdlPFRva2VuPiByID0gcmFuZ2VJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoJygnKS5hcHBlbmQoci5sZWZ0KS5hcHBlbmQoJywnKS5hcHBlbmQoci5yaWdodCkuYXBwZW5kKCJdLCIpOworICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpID09IDMwKQorICAgICAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCIuLi4iKTsKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZm9yIChTZXNzaW9uIHNlc3Npb246IHNlc3Npb25zLnZhbHVlcygpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIiAgICAiKS5hcHBlbmQoc2Vzc2lvbi50b1N0cmluZygpKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiICAgICIpLmFwcGVuZChzZXNzaW9uLnRvU3RyaW5nKCkpLmFwcGVuZChTeXN0ZW0ubGluZVNlcGFyYXRvcigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgTWFwPFBhaXI8U3RyaW5nLCBTdHJpbmc+LCBUYWJsZT4gc3VtbWFyaWVzID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFBhaXI8U3RyaW5nLCBTdHJpbmc+LCBUYWJsZT4gc3VtbWFyaWVzID0gbmV3IEhhc2hNYXA8PigpOwogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0VzdGltYXRlOwogCiAgICAgcHJpdmF0ZSBpbnQgZmlsZXMgPSAtMTsKICAgICBwcml2YXRlIGxvbmcgYnl0ZXMgPSAtMTsKLSAgICBwcml2YXRlIGludCByYW5nZXMgPSAtMTsKKyAgICBwcml2YXRlIFNldDxSYW5nZTxUb2tlbj4+IHJhbmdlcyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICBwcml2YXRlIGJvb2xlYW4gdG90YWxzQ2FsY3VsYXRlZCA9IGZhbHNlOwogCiAgICAgcHVibGljIFN5bmNTdGF0U3VtbWFyeShib29sZWFuIGlzRXN0aW1hdGUpCkBAIC0xOTAsMTQgKzIxMCwxNCBAQAogICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQogICAgIHsKICAgICAgICAgY2FsY3VsYXRlVG90YWxzKCk7Ci0gICAgICAgIHJldHVybiBmaWxlcyA9PSAwICYmIGJ5dGVzID09IDAgJiYgcmFuZ2VzID09IDA7CisgICAgICAgIHJldHVybiBmaWxlcyA9PSAwICYmIGJ5dGVzID09IDAgJiYgcmFuZ2VzLmlzRW1wdHkoKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2FsY3VsYXRlVG90YWxzKCkKICAgICB7CiAgICAgICAgIGZpbGVzID0gMDsKICAgICAgICAgYnl0ZXMgPSAwOwotICAgICAgICByYW5nZXMgPSAwOworICAgICAgICByYW5nZXMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgIHN1bW1hcmllcy52YWx1ZXMoKS5mb3JFYWNoKFRhYmxlOjpjYWxjdWxhdGVUb3RhbHMpOwogICAgICAgICBmb3IgKFRhYmxlIHRhYmxlOiBzdW1tYXJpZXMudmFsdWVzKCkpCiAgICAgICAgIHsKQEAgLTIwOCw3ICsyMjgsNyBAQAogICAgICAgICAgICAgdGFibGUuY2FsY3VsYXRlVG90YWxzKCk7CiAgICAgICAgICAgICBmaWxlcyArPSB0YWJsZS5maWxlczsKICAgICAgICAgICAgIGJ5dGVzICs9IHRhYmxlLmJ5dGVzOwotICAgICAgICAgICAgcmFuZ2VzICs9IHRhYmxlLnJhbmdlczsKKyAgICAgICAgICAgIHJhbmdlcy5hZGRBbGwodGFibGUucmFuZ2VzKTsKICAgICAgICAgfQogICAgICAgICB0b3RhbHNDYWxjdWxhdGVkID0gdHJ1ZTsKICAgICB9CkBAIC0yMjgsMTEgKzI0OCwxMSBAQAogCiAgICAgICAgIGlmIChpc0VzdGltYXRlKQogICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXQuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlRvdGFsIGVzdGltYXRlZCBzdHJlYW1pbmc6ICVzIHJhbmdlcywgJXMgc3N0YWJsZXMsICVzIGJ5dGVzXG4iLCByYW5nZXMsIGZpbGVzLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShieXRlcykpKTsKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiVG90YWwgZXN0aW1hdGVkIHN0cmVhbWluZzogJXMgcmFuZ2VzLCAlcyBzc3RhYmxlcywgJXMgYnl0ZXNcbiIsIHJhbmdlcy5zaXplKCksIGZpbGVzLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShieXRlcykpKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiVG90YWwgc3RyZWFtaW5nOiAlcyByYW5nZXMsICVzIHNzdGFibGVzLCAlcyBieXRlc1xuIiwgcmFuZ2VzLCBmaWxlcywgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoYnl0ZXMpKSk7CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlRvdGFsIHN0cmVhbWluZzogJXMgcmFuZ2VzLCAlcyBzc3RhYmxlcywgJXMgYnl0ZXNcbiIsIHJhbmdlcy5zaXplKCksIGZpbGVzLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShieXRlcykpKTsKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoUGFpcjxTdHJpbmcsIFN0cmluZz4gdGFibGVOYW1lOiB0YWJsZXMpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9hZG1pbi9DbGVhbnVwU3VtbWFyeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvYWRtaW4vQ2xlYW51cFN1bW1hcnkuamF2YQppbmRleCAyZDIxZGViLi44OWIxZWVjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9hZG1pbi9DbGVhbnVwU3VtbWFyeS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9jb25zaXN0ZW50L2FkbWluL0NsZWFudXBTdW1tYXJ5LmphdmEKQEAgLTMyLDcgKzMyLDYgQEAKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5TaW1wbGVUeXBlOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKQEAgLTU3LDcgKzU2LDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTI2LDcgKzEyNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKE9wZW5EYXRhRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9jb25zaXN0ZW50L2FkbWluL1BlbmRpbmdTdGF0LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9hZG1pbi9QZW5kaW5nU3RhdC5qYXZhCmluZGV4IGI3ZDRmZWEuLjBmNTBlMGUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9jb25zaXN0ZW50L2FkbWluL1BlbmRpbmdTdGF0LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvYWRtaW4vUGVuZGluZ1N0YXQuamF2YQpAQCAtMzIsNyArMzIsNiBAQAogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLlNpbXBsZVR5cGU7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKQEAgLTU1LDcgKzU0LDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtOTQsNyArOTMsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9hZG1pbi9QZW5kaW5nU3RhdHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9jb25zaXN0ZW50L2FkbWluL1BlbmRpbmdTdGF0cy5qYXZhCmluZGV4IGYxYjUxNWUuLmUyNTNhMGUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9jb25zaXN0ZW50L2FkbWluL1BlbmRpbmdTdGF0cy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9jb25zaXN0ZW50L2FkbWluL1BlbmRpbmdTdGF0cy5qYXZhCkBAIC0yOCw3ICsyOCw2IEBACiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uU2ltcGxlVHlwZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CiAKIHB1YmxpYyBjbGFzcyBQZW5kaW5nU3RhdHMKIHsKQEAgLTUxLDcgKzUwLDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtODcsNyArODYsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9hZG1pbi9SZXBhaXJTdGF0cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL2NvbnNpc3RlbnQvYWRtaW4vUmVwYWlyU3RhdHMuamF2YQppbmRleCBiYmI0Nzc4Li42ZDNlNDI0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvY29uc2lzdGVudC9hZG1pbi9SZXBhaXJTdGF0cy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9jb25zaXN0ZW50L2FkbWluL1JlcGFpclN0YXRzLmphdmEKQEAgLTI1LDcgKzI1LDYgQEAKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi4qOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcGFpci5jb25zaXN0ZW50LlJlcGFpcmVkU3RhdGU7CiAKQEAgLTQ3LDcgKzQ2LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTc1LDcgKzc0LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTExMiw3ICsxMTEsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNjUsNyArMTY0LDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL21lc3NhZ2VzL1JlcGFpck9wdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL21lc3NhZ2VzL1JlcGFpck9wdGlvbi5qYXZhCmluZGV4IDZiYjdmZGIuLmYwNTA4YTMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9tZXNzYWdlcy9SZXBhaXJPcHRpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvbWVzc2FnZXMvUmVwYWlyT3B0aW9uLmphdmEKQEAgLTM5NSwyMiArMzk1LDIwIEBACiAKICAgICBwdWJsaWMgYm9vbGVhbiBvcHRpbWlzZVN0cmVhbXMoKQogICAgIHsKLSAgICAgICAgaWYob3B0aW1pc2VTdHJlYW1zKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgaWYgKGlzUHVsbFJlcGFpcigpIHx8IGlzRm9yY2VkUmVwYWlyKCkpCisgICAgICAgIGlmIChpc1B1bGxSZXBhaXIoKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICBpZiAoaXNJbmNyZW1lbnRhbCgpICYmIERhdGFiYXNlRGVzY3JpcHRvci5hdXRvT3B0aW1pc2VJbmNSZXBhaXJTdHJlYW1zKCkpCisgICAgICAgIGlmIChpc1ByZXZpZXcoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKERhdGFiYXNlRGVzY3JpcHRvci5hdXRvT3B0aW1pc2VQcmV2aWV3UmVwYWlyU3RyZWFtcygpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGlzSW5jcmVtZW50YWwoKSAmJiBEYXRhYmFzZURlc2NyaXB0b3IuYXV0b09wdGltaXNlSW5jUmVwYWlyU3RyZWFtcygpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGVsc2UgaWYgKCFpc0luY3JlbWVudGFsKCkgJiYgRGF0YWJhc2VEZXNjcmlwdG9yLmF1dG9PcHRpbWlzZUZ1bGxSZXBhaXJTdHJlYW1zKCkpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgICAgICBpZiAoaXNQcmV2aWV3KCkgJiYgRGF0YWJhc2VEZXNjcmlwdG9yLmF1dG9PcHRpbWlzZVByZXZpZXdSZXBhaXJTdHJlYW1zKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICBpZiAoIWlzSW5jcmVtZW50YWwoKSAmJiBEYXRhYmFzZURlc2NyaXB0b3IuYXV0b09wdGltaXNlRnVsbFJlcGFpclN0cmVhbXMoKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIG9wdGltaXNlU3RyZWFtczsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpZ25vcmVVbnJlcGxpY2F0ZWRLZXlzcGFjZXMoKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL0NvbHVtbk1ldGFkYXRhLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvQ29sdW1uTWV0YWRhdGEuamF2YQppbmRleCBmZGJkMTY2Li5mNjhhN2I1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvQ29sdW1uTWV0YWRhdGEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvQ29sdW1uTWV0YWRhdGEuamF2YQpAQCAtMjEsMTEgKzIxLDE0IEBACiBpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKIAoraW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk1vcmVPYmplY3RzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQ29sbGVjdGlvbnMyOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmcuQ29sdW1uTWFzazsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnNlbGVjdGlvbi5TZWxlY3RhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc2VsZWN0aW9uLlNlbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc2VsZWN0aW9uLlNpbXBsZVNlbGVjdG9yOwpAQCAtOTUsNiArOTgsMTIgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIGxvbmcgY29tcGFyaXNvbk9yZGVyOwogCisgICAgLyoqCisgICAgICogTWFza2luZyBmdW5jdGlvbiB1c2VkIHRvIGR5bmFtaWNhbGx5IG1hc2sgdGhlIGNvbnRlbnRzIG9mIHRoaXMgY29sdW1uLgorICAgICAqLworICAgIEBOdWxsYWJsZQorICAgIHByaXZhdGUgZmluYWwgQ29sdW1uTWFzayBtYXNrOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBjb21wYXJpc29uT3JkZXIoS2luZCBraW5kLCBib29sZWFuIGlzQ29tcGxleCwgbG9uZyBwb3NpdGlvbiwgQ29sdW1uSWRlbnRpZmllciBuYW1lKQogICAgIHsKICAgICAgICAgYXNzZXJ0IHBvc2l0aW9uID49IDAgJiYgcG9zaXRpb24gPCAxIDw8IDEyOwpAQCAtMTA2LDUyICsxMTUsNTggQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uTWV0YWRhdGEgcGFydGl0aW9uS2V5Q29sdW1uKFRhYmxlTWV0YWRhdGEgdGFibGUsIEJ5dGVCdWZmZXIgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUsIGludCBwb3NpdGlvbikKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEodGFibGUsIG5hbWUsIHR5cGUsIHBvc2l0aW9uLCBLaW5kLlBBUlRJVElPTl9LRVkpOworICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKHRhYmxlLCBuYW1lLCB0eXBlLCBwb3NpdGlvbiwgS2luZC5QQVJUSVRJT05fS0VZLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIENvbHVtbk1ldGFkYXRhIHBhcnRpdGlvbktleUNvbHVtbihTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSwgU3RyaW5nIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlLCBpbnQgcG9zaXRpb24pCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKGtleXNwYWNlLCB0YWJsZSwgQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZChuYW1lLCB0cnVlKSwgdHlwZSwgcG9zaXRpb24sIEtpbmQuUEFSVElUSU9OX0tFWSk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRhYmxlLCBDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKG5hbWUsIHRydWUpLCB0eXBlLCBwb3NpdGlvbiwgS2luZC5QQVJUSVRJT05fS0VZLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIENvbHVtbk1ldGFkYXRhIGNsdXN0ZXJpbmdDb2x1bW4oVGFibGVNZXRhZGF0YSB0YWJsZSwgQnl0ZUJ1ZmZlciBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSwgaW50IHBvc2l0aW9uKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YSh0YWJsZSwgbmFtZSwgdHlwZSwgcG9zaXRpb24sIEtpbmQuQ0xVU1RFUklORyk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEodGFibGUsIG5hbWUsIHR5cGUsIHBvc2l0aW9uLCBLaW5kLkNMVVNURVJJTkcsIG51bGwpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uTWV0YWRhdGEgY2x1c3RlcmluZ0NvbHVtbihTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSwgU3RyaW5nIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlLCBpbnQgcG9zaXRpb24pCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKGtleXNwYWNlLCB0YWJsZSwgQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZChuYW1lLCB0cnVlKSwgdHlwZSwgcG9zaXRpb24sIEtpbmQuQ0xVU1RFUklORyk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRhYmxlLCBDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKG5hbWUsIHRydWUpLCB0eXBlLCBwb3NpdGlvbiwgS2luZC5DTFVTVEVSSU5HLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIENvbHVtbk1ldGFkYXRhIHJlZ3VsYXJDb2x1bW4oVGFibGVNZXRhZGF0YSB0YWJsZSwgQnl0ZUJ1ZmZlciBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEodGFibGUsIG5hbWUsIHR5cGUsIE5PX1BPU0lUSU9OLCBLaW5kLlJFR1VMQVIpOworICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKHRhYmxlLCBuYW1lLCB0eXBlLCBOT19QT1NJVElPTiwgS2luZC5SRUdVTEFSLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIENvbHVtbk1ldGFkYXRhIHJlZ3VsYXJDb2x1bW4oU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUsIFN0cmluZyBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRhYmxlLCBDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKG5hbWUsIHRydWUpLCB0eXBlLCBOT19QT1NJVElPTiwgS2luZC5SRUdVTEFSKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGFibGUsIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgdHJ1ZSksIHR5cGUsIE5PX1BPU0lUSU9OLCBLaW5kLlJFR1VMQVIsIG51bGwpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uTWV0YWRhdGEgc3RhdGljQ29sdW1uKFRhYmxlTWV0YWRhdGEgdGFibGUsIEJ5dGVCdWZmZXIgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKHRhYmxlLCBuYW1lLCB0eXBlLCBOT19QT1NJVElPTiwgS2luZC5TVEFUSUMpOworICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKHRhYmxlLCBuYW1lLCB0eXBlLCBOT19QT1NJVElPTiwgS2luZC5TVEFUSUMsIG51bGwpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uTWV0YWRhdGEgc3RhdGljQ29sdW1uKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBTdHJpbmcgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKGtleXNwYWNlLCB0YWJsZSwgQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZChuYW1lLCB0cnVlKSwgdHlwZSwgTk9fUE9TSVRJT04sIEtpbmQuU1RBVElDKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGFibGUsIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgdHJ1ZSksIHR5cGUsIE5PX1BPU0lUSU9OLCBLaW5kLlNUQVRJQywgbnVsbCk7CiAgICAgfQogCi0gICAgcHVibGljIENvbHVtbk1ldGFkYXRhKFRhYmxlTWV0YWRhdGEgdGFibGUsIEJ5dGVCdWZmZXIgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUsIGludCBwb3NpdGlvbiwgS2luZCBraW5kKQorICAgIHB1YmxpYyBDb2x1bW5NZXRhZGF0YShUYWJsZU1ldGFkYXRhIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEtpbmQga2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIENvbHVtbk1hc2sgbWFzaykKICAgICB7CiAgICAgICAgIHRoaXModGFibGUua2V5c3BhY2UsCiAgICAgICAgICAgICAgdGFibGUubmFtZSwKICAgICAgICAgICAgICBDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKG5hbWUsIFVURjhUeXBlLmluc3RhbmNlKSwKICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgIHBvc2l0aW9uLAotICAgICAgICAgICAgIGtpbmQpOworICAgICAgICAgICAgIGtpbmQsCisgICAgICAgICAgICAgbWFzayk7CiAgICAgfQogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCkBAIC0xNjAsMTggKzE3NSwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5JZGVudGlmaWVyIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEtpbmQga2luZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS2luZCBraW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgQ29sdW1uTWFzayBtYXNrKQogICAgIHsKICAgICAgICAgc3VwZXIoa3NOYW1lLCBjZk5hbWUsIG5hbWUsIHR5cGUpOwogICAgICAgICBhc3NlcnQgbmFtZSAhPSBudWxsICYmIHR5cGUgIT0gbnVsbCAmJiBraW5kICE9IG51bGw7CiAgICAgICAgIGFzc2VydCAocG9zaXRpb24gPT0gTk9fUE9TSVRJT04pID09ICFraW5kLmlzUHJpbWFyeUtleUtpbmQoKTsgLy8gVGhlIHBvc2l0aW9uIHJlYWxseSBvbmx5IG1ha2Ugc2Vuc2UgZm9yIHBhcnRpdGlvbiBhbmQgY2x1c3RlcmluZyBjb2x1bW5zIChhbmQgdGhvc2UgbXVzdCBoYXZlIG9uZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gbWFrZSBzdXJlIHdlIGRvbid0IHNuZWFrIGl0IGZvciBzb21ldGhpbmcgZWxzZSBzaW5jZSBpdCdkIGJyZWFrcyBlcXVhbHMoKQorCisgICAgICAgIC8vIFRoZSBwcm9wYWdhdGlvbiBvZiBzeXN0ZW0gZGlzdHJpYnV0ZWQga2V5c3BhY2VzIGF0IHN0YXJ0dXAgY2FuIGJlIHByb2JsZW1hdGljIGZvciBvbGQgbm9kZXMgd2l0aG91dCBERE0sCisgICAgICAgIC8vIHNpbmNlIHRob3NlIHdvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIHRoZSBtYXNrIG11dGF0aW9ucy4gVGh1cywgd2UgZG9uJ3Qgc3VwcG9ydCBERE0gb24gdGhvc2Uga2V5c3BhY2VzLgorICAgICAgICBpZiAobWFzayAhPSBudWxsICYmIFNjaGVtYUNvbnN0YW50cy5pc1JlcGxpY2F0ZWRTeXN0ZW1LZXlzcGFjZShrc05hbWUpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJERE0gaXMgbm90IHN1cHBvcnRlZCBvbiBzeXN0ZW0gZGlzdHJpYnV0ZWQga2V5c3BhY2VzIik7CisKICAgICAgICAgdGhpcy5raW5kID0ga2luZDsKICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOwogICAgICAgICB0aGlzLmNlbGxQYXRoQ29tcGFyYXRvciA9IG1ha2VDZWxsUGF0aENvbXBhcmF0b3Ioa2luZCwgdHlwZSk7CiAgICAgICAgIHRoaXMuY2VsbENvbXBhcmF0b3IgPSBjZWxsUGF0aENvbXBhcmF0b3IgPT0gbnVsbCA/IENvbHVtbkRhdGEuY29tcGFyYXRvciA6IChhLCBiKSAtPiBjZWxsUGF0aENvbXBhcmF0b3IuY29tcGFyZShhLnBhdGgoKSwgYi5wYXRoKCkpOwogICAgICAgICB0aGlzLmFzeW1tZXRyaWNDZWxsUGF0aENvbXBhcmF0b3IgPSBjZWxsUGF0aENvbXBhcmF0b3IgPT0gbnVsbCA/IG51bGwgOiAoYSwgYikgLT4gY2VsbFBhdGhDb21wYXJhdG9yLmNvbXBhcmUoKChDZWxsPD8+KWEpLnBhdGgoKSwgKENlbGxQYXRoKSBiKTsKICAgICAgICAgdGhpcy5jb21wYXJpc29uT3JkZXIgPSBjb21wYXJpc29uT3JkZXIoa2luZCwgaXNDb21wbGV4KCksIE1hdGgubWF4KDAsIHBvc2l0aW9uKSwgbmFtZSk7CisgICAgICAgIHRoaXMubWFzayA9IG1hc2s7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ29tcGFyYXRvcjxDZWxsUGF0aD4gbWFrZUNlbGxQYXRoQ29tcGFyYXRvcihLaW5kIGtpbmQsIEFic3RyYWN0VHlwZTw/PiB0eXBlKQpAQCAtMjAzLDE3ICsyMjYsMjIgQEAKIAogICAgIHB1YmxpYyBDb2x1bW5NZXRhZGF0YSBjb3B5KCkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa3NOYW1lLCBjZk5hbWUsIG5hbWUsIHR5cGUsIHBvc2l0aW9uLCBraW5kKTsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YShrc05hbWUsIGNmTmFtZSwgbmFtZSwgdHlwZSwgcG9zaXRpb24sIGtpbmQsIG1hc2spOwogICAgIH0KIAogICAgIHB1YmxpYyBDb2x1bW5NZXRhZGF0YSB3aXRoTmV3TmFtZShDb2x1bW5JZGVudGlmaWVyIG5ld05hbWUpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKGtzTmFtZSwgY2ZOYW1lLCBuZXdOYW1lLCB0eXBlLCBwb3NpdGlvbiwga2luZCk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa3NOYW1lLCBjZk5hbWUsIG5ld05hbWUsIHR5cGUsIHBvc2l0aW9uLCBraW5kLCBtYXNrKTsKICAgICB9CiAKICAgICBwdWJsaWMgQ29sdW1uTWV0YWRhdGEgd2l0aE5ld1R5cGUoQWJzdHJhY3RUeXBlPD8+IG5ld1R5cGUpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKGtzTmFtZSwgY2ZOYW1lLCBuYW1lLCBuZXdUeXBlLCBwb3NpdGlvbiwga2luZCk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa3NOYW1lLCBjZk5hbWUsIG5hbWUsIG5ld1R5cGUsIHBvc2l0aW9uLCBraW5kLCBtYXNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sdW1uTWV0YWRhdGEgd2l0aE5ld01hc2soQE51bGxhYmxlIENvbHVtbk1hc2sgbmV3TWFzaykKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa3NOYW1lLCBjZk5hbWUsIG5hbWUsIHR5cGUsIHBvc2l0aW9uLCBraW5kLCBuZXdNYXNrKTsKICAgICB9CiAKICAgICBwdWJsaWMgYm9vbGVhbiBpc1BhcnRpdGlvbktleSgpCkBAIC0yMzEsNiArMjU5LDExIEBACiAgICAgICAgIHJldHVybiBraW5kID09IEtpbmQuU1RBVElDOwogICAgIH0KIAorICAgIHB1YmxpYyBib29sZWFuIGlzTWFza2VkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtYXNrICE9IG51bGw7CisgICAgfQorCiAgICAgcHVibGljIGJvb2xlYW4gaXNSZWd1bGFyKCkKICAgICB7CiAgICAgICAgIHJldHVybiBraW5kID09IEtpbmQuUkVHVUxBUjsKQEAgLTI0OSw2ICsyODIsMTIgQEAKICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgIH0KIAorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBDb2x1bW5NYXNrIGdldE1hc2soKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1hc2s7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQogICAgIHsKQEAgLTI2OSw3ICszMDgsOCBAQAogICAgICAgICAgICAgJiYga2luZCA9PSBvdGhlci5raW5kCiAgICAgICAgICAgICAmJiBwb3NpdGlvbiA9PSBvdGhlci5wb3NpdGlvbgogICAgICAgICAgICAgJiYga3NOYW1lLmVxdWFscyhvdGhlci5rc05hbWUpCi0gICAgICAgICAgICAmJiBjZk5hbWUuZXF1YWxzKG90aGVyLmNmTmFtZSk7CisgICAgICAgICAgICAmJiBjZk5hbWUuZXF1YWxzKG90aGVyLmNmTmFtZSkKKyAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWxzKG1hc2ssIG90aGVyLm1hc2spOwogICAgIH0KIAogICAgIE9wdGlvbmFsPERpZmZlcmVuY2U+IGNvbXBhcmUoQ29sdW1uTWV0YWRhdGEgb3RoZXIpCkBAIC0yOTksNiArMzM5LDcgQEAKICAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHR5cGUgPT0gbnVsbCA/IDAgOiB0eXBlLmhhc2hDb2RlKCkpOwogICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoa2luZCA9PSBudWxsID8gMCA6IGtpbmQuaGFzaENvZGUoKSk7CiAgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHBvc2l0aW9uOworICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAobWFzayA9PSBudWxsID8gMCA6IG1hc2suaGFzaENvZGUoKSk7CiAgICAgICAgICAgICBoYXNoID0gcmVzdWx0OwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0zMzQsNyArMzc1LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBwcm9jZXNzZXNTZWxlY3Rpb24oKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gaXNNYXNrZWQoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTQzMyw2ICs0NzQsOSBAQAogCiAgICAgICAgIGlmIChpc1N0YXRpYygpKQogICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBzdGF0aWMiKTsKKworICAgICAgICBpZiAoaXNNYXNrZWQoKSkKKyAgICAgICAgICAgIG1hc2suYXBwZW5kQ3FsVG8oYnVpbGRlcik7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9DUUxTdHJpbmcoSXRlcmFibGU8Q29sdW1uTWV0YWRhdGE+IGRlZnMpCkBAIC00ODgsNyArNTMyLDcgQEAKIAogICAgIHB1YmxpYyBTZWxlY3Rvci5GYWN0b3J5IG5ld1NlbGVjdG9yRmFjdG9yeShUYWJsZU1ldGFkYXRhIHRhYmxlLCBBYnN0cmFjdFR5cGU8Pz4gZXhwZWN0ZWRUeXBlLCBMaXN0PENvbHVtbk1ldGFkYXRhPiBkZWZzLCBWYXJpYWJsZVNwZWNpZmljYXRpb25zIGJvdW5kTmFtZXMpIHRocm93cyBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgcmV0dXJuIFNpbXBsZVNlbGVjdG9yLm5ld0ZhY3RvcnkodGhpcywgYWRkQW5kR2V0SW5kZXgodGhpcywgZGVmcykpOworICAgICAgICByZXR1cm4gU2ltcGxlU2VsZWN0b3IubmV3RmFjdG9yeSh0aGlzLCBhZGRBbmRHZXRJbmRleCh0aGlzLCBkZWZzKSwgZmFsc2UpOwogICAgIH0KIAogICAgIHB1YmxpYyBBYnN0cmFjdFR5cGU8Pz4gZ2V0RXhhY3RUeXBlSWZLbm93bihTdHJpbmcga2V5c3BhY2UpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvQ29tcGFjdGlvblBhcmFtcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL0NvbXBhY3Rpb25QYXJhbXMuamF2YQppbmRleCA0ODU5NDY4Li5lZmY2MzRmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvQ29tcGFjdGlvblBhcmFtcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9Db21wYWN0aW9uUGFyYW1zLmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ERUZBVUxUX1BST1ZJREVfT1ZFUkxBUFBJTkdfVE9NQlNUT05FUzsKIAogcHVibGljIGZpbmFsIGNsYXNzIENvbXBhY3Rpb25QYXJhbXMKIHsKQEAgLTc2LDE1ICs3NywxNSBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX1RIUkVTSE9MRCA9IDMyOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFRkFVTFRfRU5BQkxFRCA9IHRydWU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBUb21ic3RvbmVPcHRpb24gREVGQVVMVF9QUk9WSURFX09WRVJMQVBQSU5HX1RPTUJTVE9ORVMgPQotICAgICAgICAgICAgVG9tYnN0b25lT3B0aW9uLnZhbHVlT2YoU3lzdGVtLmdldFByb3BlcnR5KCJkZWZhdWx0LnByb3ZpZGUub3ZlcmxhcHBpbmcudG9tYnN0b25lcyIsIFRvbWJzdG9uZU9wdGlvbi5OT05FLnRvU3RyaW5nKCkpLnRvVXBwZXJDYXNlKCkpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9tYnN0b25lT3B0aW9uIERFRkFVTFRfUFJPVklERV9PVkVSTEFQUElOR19UT01CU1RPTkVTX1BST1BFUlRZX1ZBTFVFID0KKyAgICAgICAgREVGQVVMVF9QUk9WSURFX09WRVJMQVBQSU5HX1RPTUJTVE9ORVMuZ2V0RW51bShUb21ic3RvbmVPcHRpb24uTk9ORSk7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gREVGQVVMVF9USFJFU0hPTERTID0KICAgICAgICAgSW1tdXRhYmxlTWFwLm9mKE9wdGlvbi5NSU5fVEhSRVNIT0xELnRvU3RyaW5nKCksIEludGVnZXIudG9TdHJpbmcoREVGQVVMVF9NSU5fVEhSRVNIT0xEKSwKICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbi5NQVhfVEhSRVNIT0xELnRvU3RyaW5nKCksIEludGVnZXIudG9TdHJpbmcoREVGQVVMVF9NQVhfVEhSRVNIT0xEKSk7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhY3Rpb25QYXJhbXMgREVGQVVMVCA9Ci0gICAgICAgIG5ldyBDb21wYWN0aW9uUGFyYW1zKFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kuY2xhc3MsIERFRkFVTFRfVEhSRVNIT0xEUywgREVGQVVMVF9FTkFCTEVELCBERUZBVUxUX1BST1ZJREVfT1ZFUkxBUFBJTkdfVE9NQlNUT05FUyk7CisgICAgICAgIG5ldyBDb21wYWN0aW9uUGFyYW1zKFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kuY2xhc3MsIERFRkFVTFRfVEhSRVNIT0xEUywgREVGQVVMVF9FTkFCTEVELCBERUZBVUxUX1BST1ZJREVfT1ZFUkxBUFBJTkdfVE9NQlNUT05FU19QUk9QRVJUWV9WQUxVRSk7CiAKICAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneT4ga2xhc3M7CiAgICAgcHJpdmF0ZSBmaW5hbCBJbW11dGFibGVNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnM7CkBAIC0xMDUsNyArMTA2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBCb29sZWFuLnBhcnNlQm9vbGVhbihvcHRpb25zLmdldChPcHRpb24uRU5BQkxFRC50b1N0cmluZygpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBERUZBVUxUX0VOQUJMRUQ7CiAgICAgICAgIFN0cmluZyBvdmVybGFwcGluZ1RvbWJzdG9uZVBhcm0gPSBvcHRpb25zLmdldE9yRGVmYXVsdChPcHRpb24uUFJPVklERV9PVkVSTEFQUElOR19UT01CU1RPTkVTLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BST1ZJREVfT1ZFUkxBUFBJTkdfVE9NQlNUT05FUy50b1N0cmluZygpKS50b1VwcGVyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QUk9WSURFX09WRVJMQVBQSU5HX1RPTUJTVE9ORVNfUFJPUEVSVFlfVkFMVUUudG9TdHJpbmcoKSkudG9VcHBlckNhc2UoKTsKICAgICAgICAgT3B0aW9uYWw8VG9tYnN0b25lT3B0aW9uPiB0b21ic3RvbmVPcHRpb25hbCA9IFRvbWJzdG9uZU9wdGlvbi5mb3JOYW1lKG92ZXJsYXBwaW5nVG9tYnN0b25lUGFybSk7CiAgICAgICAgIGlmICghdG9tYnN0b25lT3B0aW9uYWwuaXNQcmVzZW50KCkpCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9EZWZhdWx0U2NoZW1hVXBkYXRlSGFuZGxlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL0RlZmF1bHRTY2hlbWFVcGRhdGVIYW5kbGVyLmphdmEKaW5kZXggMGYwYzNlOS4uMGJlYTU3NyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL0RlZmF1bHRTY2hlbWFVcGRhdGVIYW5kbGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL0RlZmF1bHRTY2hlbWFVcGRhdGVIYW5kbGVyLmphdmEKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAgICAgbG9nZ2VyLndhcm4oIlRoZXJlIGFyZSBub2RlcyBpbiB0aGUgY2x1c3RlciB3aXRoIGEgZGlmZmVyZW50IHNjaGVtYSB2ZXJzaW9uIHRoYW4gdXMsIGZyb20gd2hpY2ggd2UgZGlkIG5vdCBtZXJnZSBzY2hlbWFzOiAiICsKLSAgICAgICAgICAgICAgICAgICAgIm91ciB2ZXJzaW9uOiAoe30pLCBvdXRzdGFuZGluZyB2ZXJzaW9ucyAtPiBlbmRwb2ludHM6IHt9LiBVc2UgLUR7fX09dHJ1ZSB0byBpZ25vcmUgdGhpcywgIiArCisgICAgICAgICAgICAgICAgICAgICJvdXIgdmVyc2lvbjogKHt9KSwgb3V0c3RhbmRpbmcgdmVyc2lvbnMgLT4gZW5kcG9pbnRzOiB7fS4gVXNlIC1Ee309dHJ1ZSB0byBpZ25vcmUgdGhpcywgIiArCiAgICAgICAgICAgICAgICAgICAgICItRHt9PTxlcDFbLGVwTl0+IHRvIHNraXAgc3BlY2lmaWMgZW5kcG9pbnRzLCBvciAtRHt9PTx2ZXIxWyx2ZXJOXT4gdG8gc2tpcCBzcGVjaWZpYyBzY2hlbWEgdmVyc2lvbnMiLAogICAgICAgICAgICAgICAgICAgICBTY2hlbWEuaW5zdGFuY2UuZ2V0VmVyc2lvbigpLAogICAgICAgICAgICAgICAgICAgICBtaWdyYXRpb25Db29yZGluYXRvci5vdXRzdGFuZGluZ1ZlcnNpb25zKCksCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvRGlzdHJpYnV0ZWRTY2hlbWEuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9EaXN0cmlidXRlZFNjaGVtYS5qYXZhCmluZGV4IDRmZWQ5YmIuLmQyZjMwYWEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9EaXN0cmlidXRlZFNjaGVtYS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9EaXN0cmlidXRlZFNjaGVtYS5qYXZhCkBAIC05MSw3ICs5MSw3IEBACiAgICAgICAgICAgICBrc20udGFibGVzLmZvckVhY2godG0gLT4gUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KHRtLmtleXNwYWNlLmVxdWFscyhrc20ubmFtZSksICJUYWJsZSAlcyBtZXRhZGF0YSBwb2ludHMgdG8ga2V5c3BhY2UgJXMgd2hpbGUgZGVmaW5lZCBpbiBrZXlzcGFjZSAlcyIsIHRtLm5hbWUsIHRtLmtleXNwYWNlLCBrc20ubmFtZSkpOwogICAgICAgICAgICAga3NtLnZpZXdzLmZvckVhY2godm0gLT4gUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KHZtLmtleXNwYWNlKCkuZXF1YWxzKGtzbS5uYW1lKSwgIlZpZXcgJXMgbWV0YWRhdGEgcG9pbnRzIHRvIGtleXNwYWNlICVzIHdoaWxlIGRlZmluZWQgaW4ga2V5c3BhY2UgJXMiLCB2bS5uYW1lKCksIHZtLmtleXNwYWNlKCksIGtzbS5uYW1lKSk7CiAgICAgICAgICAgICBrc20udHlwZXMuZm9yRWFjaCh1dCAtPiBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQodXQua2V5c3BhY2UuZXF1YWxzKGtzbS5uYW1lKSwgIlR5cGUgJXMgcG9pbnRzIHRvIGtleXNwYWNlICVzIHdoaWxlIGRlZmluZWQgaW4ga2V5c3BhY2UgJXMiLCB1dC5uYW1lLCB1dC5rZXlzcGFjZSwga3NtLm5hbWUpKTsKLSAgICAgICAgICAgIGtzbS5mdW5jdGlvbnMuZm9yRWFjaChmIC0+IFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChmLm5hbWUoKS5rZXlzcGFjZS5lcXVhbHMoa3NtLm5hbWUpLCAiRnVuY3Rpb24gJXMgcG9pbnRzIHRvIGtleXNwYWNlICVzIHdoaWxlIGRlZmluZWQgaW4ga2V5c3BhY2UgJXMiLCBmLm5hbWUoKS5uYW1lLCBmLm5hbWUoKS5rZXlzcGFjZSwga3NtLm5hbWUpKTsKKyAgICAgICAgICAgIGtzbS51c2VyRnVuY3Rpb25zLmZvckVhY2goZiAtPiBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoZi5uYW1lKCkua2V5c3BhY2UuZXF1YWxzKGtzbS5uYW1lKSwgIkZ1bmN0aW9uICVzIHBvaW50cyB0byBrZXlzcGFjZSAlcyB3aGlsZSBkZWZpbmVkIGluIGtleXNwYWNlICVzIiwgZi5uYW1lKCkubmFtZSwgZi5uYW1lKCkua2V5c3BhY2UsIGtzbS5uYW1lKSk7CiAgICAgICAgIH0pOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9GdW5jdGlvbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9GdW5jdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkZTNiOC4uMDAwMDAwMAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvRnVuY3Rpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hOwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOwotaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKLWltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuKjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Vc2VyVHlwZTsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0OwotCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmFueTsKLQotLyoqCi0gKiBBbiBpbW11dGFibGUgY29udGFpbmVyIGZvciBhIGtleXNwYWNlJ3MgVURBcyBhbmQgVURGcyAoYW5kLCBpbiBjYXNlIG9mIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TeXN0ZW1LZXlzcGFjZX0sCi0gKiBuYXRpdmUgZnVuY3Rpb25zIGFuZCBhZ2dyZWdhdGVzKS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZ1bmN0aW9ucyBpbXBsZW1lbnRzIEl0ZXJhYmxlPEZ1bmN0aW9uPgotewotICAgIHB1YmxpYyBlbnVtIEZpbHRlciBpbXBsZW1lbnRzIFByZWRpY2F0ZTxGdW5jdGlvbj4KLSAgICB7Ci0gICAgICAgIEFMTCwgVURGLCBVREE7Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdGVzdChGdW5jdGlvbiBmdW5jdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICh0aGlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgVURGOiByZXR1cm4gZnVuY3Rpb24gaW5zdGFuY2VvZiBVREZ1bmN0aW9uOwotICAgICAgICAgICAgICAgIGNhc2UgVURBOiByZXR1cm4gZnVuY3Rpb24gaW5zdGFuY2VvZiBVREFnZ3JlZ2F0ZTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZU11bHRpbWFwPEZ1bmN0aW9uTmFtZSwgRnVuY3Rpb24+IGZ1bmN0aW9uczsKLQotICAgIHByaXZhdGUgRnVuY3Rpb25zKEJ1aWxkZXIgYnVpbGRlcikKLSAgICB7Ci0gICAgICAgIGZ1bmN0aW9ucyA9IGJ1aWxkZXIuZnVuY3Rpb25zLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIGJ1aWxkZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGdW5jdGlvbnMgbm9uZSgpCi0gICAgewotICAgICAgICByZXR1cm4gYnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGdW5jdGlvbnMgb2YoRnVuY3Rpb24uLi4gZnVucykKLSAgICB7Ci0gICAgICAgIHJldHVybiBidWlsZGVyKCkuYWRkKGZ1bnMpLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhdG9yPEZ1bmN0aW9uPiBpdGVyYXRvcigpCi0gICAgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmVhbTxGdW5jdGlvbj4gc3RyZWFtKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMudmFsdWVzKCkuc3RyZWFtKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmdW5jdGlvbnMuc2l6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSBzdHJlYW0gb2Yga2V5c3BhY2UncyBVREZzCi0gICAgICovCi0gICAgcHVibGljIFN0cmVhbTxVREZ1bmN0aW9uPiB1ZGZzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdHJlYW0oKS5maWx0ZXIoRmlsdGVyLlVERikubWFwKGYgLT4gKFVERnVuY3Rpb24pIGYpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSBzdHJlYW0gb2Yga2V5c3BhY2UncyBVREFzCi0gICAgICovCi0gICAgcHVibGljIFN0cmVhbTxVREFnZ3JlZ2F0ZT4gdWRhcygpCi0gICAgewotICAgICAgICByZXR1cm4gc3RyZWFtKCkuZmlsdGVyKEZpbHRlci5VREEpLm1hcChmIC0+IChVREFnZ3JlZ2F0ZSkgZik7Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZXJhYmxlPEZ1bmN0aW9uPiByZWZlcmVuY2luZ1VzZXJUeXBlKEJ5dGVCdWZmZXIgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBJdGVyYWJsZXMuZmlsdGVyKHRoaXMsIGYgLT4gZi5yZWZlcmVuY2VzVXNlclR5cGUobmFtZSkpOwotICAgIH0KLQotICAgIHB1YmxpYyBGdW5jdGlvbnMgd2l0aFVwZGF0ZWRVc2VyVHlwZShVc2VyVHlwZSB1ZHQpCi0gICAgewotICAgICAgICBpZiAoIWFueSh0aGlzLCBmIC0+IGYucmVmZXJlbmNlc1VzZXJUeXBlKHVkdC5uYW1lKSkpCi0gICAgICAgICAgICByZXR1cm4gdGhpczsKLQotICAgICAgICBDb2xsZWN0aW9uPFVERnVuY3Rpb24+ICB1ZGZzID0gdWRmcygpLm1hcChmIC0+IGYud2l0aFVwZGF0ZWRVc2VyVHlwZSh1ZHQpKS5jb2xsZWN0KHRvTGlzdCgpKTsKLSAgICAgICAgQ29sbGVjdGlvbjxVREFnZ3JlZ2F0ZT4gdWRhcyA9IHVkYXMoKS5tYXAoZiAtPiBmLndpdGhVcGRhdGVkVXNlclR5cGUodWRmcywgdWR0KSkuY29sbGVjdCh0b0xpc3QoKSk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIoKS5hZGQodWRmcykuYWRkKHVkYXMpLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhIHN0cmVhbSBvZiBhZ2dyZWdhdGVzIHRoYXQgdXNlIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBhcyBlaXRoZXIgYSBzdGF0ZSBvciBhIGZpbmFsIGZ1bmN0aW9uCi0gICAgICogQHBhcmFtIGZ1bmN0aW9uIHRoZSByZWZlcnJlZSBmdW5jdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBTdHJlYW08VURBZ2dyZWdhdGU+IGFnZ3JlZ2F0ZXNVc2luZ0Z1bmN0aW9uKEZ1bmN0aW9uIGZ1bmN0aW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVkYXMoKS5maWx0ZXIodWRhIC0+IHVkYS5oYXNSZWZlcmVuY2VUbyhmdW5jdGlvbikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBhbGwgZnVuY3Rpb24gb3ZlcmxvYWRzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBmdWxseSBxdWFsaWZpZWQgZnVuY3Rpb24gbmFtZQotICAgICAqIEByZXR1cm4gYW4gZW1wdHkgbGlzdCBpZiB0aGUgZnVuY3Rpb24gbmFtZSBpcyBub3QgZm91bmQ7IGEgbm9uLWVtcHR5IGNvbGxlY3Rpb24gb2Yge0BsaW5rIEZ1bmN0aW9ufSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxGdW5jdGlvbj4gZ2V0KEZ1bmN0aW9uTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy5nZXQobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCBVREZzIG92ZXJsb2FkcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgZnVsbHkgcXVhbGlmaWVkIGZ1bmN0aW9uIG5hbWUKLSAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IGxpc3QgaWYgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgbm90IGZvdW5kOyBhIG5vbi1lbXB0eSBjb2xsZWN0aW9uIG9mIHtAbGluayBVREZ1bmN0aW9ufSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxVREZ1bmN0aW9uPiBnZXRVZGZzKEZ1bmN0aW9uTmFtZSBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy5nZXQobmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihGaWx0ZXIuVURGKQotICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChmIC0+IChVREZ1bmN0aW9uKSBmKQotICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCBVREFzIG92ZXJsb2FkcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgZnVsbHkgcXVhbGlmaWVkIGZ1bmN0aW9uIG5hbWUKLSAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IGxpc3QgaWYgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgbm90IGZvdW5kOyBhIG5vbi1lbXB0eSBjb2xsZWN0aW9uIG9mIHtAbGluayBVREFnZ3JlZ2F0ZX0gb3RoZXJ3aXNlCi0gICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb248VURBZ2dyZWdhdGU+IGdldFVkYXMoRnVuY3Rpb25OYW1lIG5hbWUpCi0gICAgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLmdldChuYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEZpbHRlci5VREEpCi0gICAgICAgICAgICAgICAgICAgICAgICAubWFwKGYgLT4gKFVEQWdncmVnYXRlKSBmKQotICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIE9wdGlvbmFsPEZ1bmN0aW9uPiBmaW5kKEZ1bmN0aW9uTmFtZSBuYW1lLCBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMpCi0gICAgewotICAgICAgICByZXR1cm4gZmluZChuYW1lLCBhcmdUeXBlcywgRmlsdGVyLkFMTCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIGZ1bGx5IHF1YWxpZmllZCBmdW5jdGlvbiBuYW1lCi0gICAgICogQHBhcmFtIGFyZ1R5cGVzIGZ1bmN0aW9uIGFyZ3VtZW50IHR5cGVzCi0gICAgICogQHJldHVybiBhbiBlbXB0eSB7QGxpbmsgT3B0aW9uYWx9IGlmIHRoZSBmdW5jdGlvbiBuYW1lIGlzIG5vdCBmb3VuZDsgYSBub24tZW1wdHkgb3B0aW9uYWwgb2Yge0BsaW5rIEZ1bmN0aW9ufSBvdGhlcndpc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgT3B0aW9uYWw8RnVuY3Rpb24+IGZpbmQoRnVuY3Rpb25OYW1lIG5hbWUsIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcywgRmlsdGVyIGZpbHRlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXQobmFtZSkuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZmlsdGVyLmFuZChmdW4gLT4gdHlwZXNNYXRjaChmdW4uYXJnVHlwZXMoKSwgYXJnVHlwZXMpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kQW55KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpCi0gICAgewotICAgICAgICByZXR1cm4gZnVuY3Rpb25zLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFdlIG5lZWQgdG8gY29tcGFyZSB0aGUgQ1FMMyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdHlwZSBiZWNhdXNlIGNvbXBhcmluZwotICAgICAqIHRoZSBBYnN0cmFjdFR5cGUgd2lsbCBmYWlsIGZvciBleGFtcGxlIGlmIGEgVURUIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgICogUmVhc29uIGlzIHRoYXQgVXNlclR5cGUuZXF1YWxzKCkgdGFrZXMgdGhlIGZpZWxkIG5hbWVzIGFuZCB0eXBlcyBpbnRvIGFjY291bnQuCi0gICAgICogRXhhbXBsZSBDUUwgc2VxdWVuY2UgdGhhdCB3b3VsZCBmYWlsIHdoZW4gY29tcGFyaW5nIEFic3RyYWN0VHlwZToKLSAgICAgKiAgICBDUkVBVEUgVFlQRSBmb28gLi4uCi0gICAgICogICAgQ1JFQVRFIEZVTkNUSU9OIGJhciAoIHBhciBmb28gKSBSRVRVUk5TIGZvbyAuLi4KLSAgICAgKiAgICBBTFRFUiBUWVBFIGZvbyBBREQgLi4uCi0gICAgICogb3IKLSAgICAgKiAgICBBTFRFUiBUWVBFIGZvbyBBTFRFUiAuLi4KLSAgICAgKiBvcgotICAgICAqICAgIEFMVEVSIFRZUEUgZm9vIFJFTkFNRSAuLi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHR5cGVzTWF0Y2goQWJzdHJhY3RUeXBlPD8+IHQxLCBBYnN0cmFjdFR5cGU8Pz4gdDIpCi0gICAgewotICAgICAgICByZXR1cm4gdDEuZnJlZXplKCkuYXNDUUwzVHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKHQyLmZyZWV6ZSgpLmFzQ1FMM1R5cGUoKS50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZXNNYXRjaChMaXN0PEFic3RyYWN0VHlwZTw/Pj4gdDEsIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiB0MikKLSAgICB7Ci0gICAgICAgIGlmICh0MS5zaXplKCkgIT0gdDIuc2l6ZSgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdDEuc2l6ZSgpOyBpKyspCi0gICAgICAgICAgICBpZiAoIXR5cGVzTWF0Y2godDEuZ2V0KGkpLCB0Mi5nZXQoaSkpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCB0eXBlSGFzaENvZGUoQWJzdHJhY3RUeXBlPD8+IHQpCi0gICAgewotICAgICAgICByZXR1cm4gdC5hc0NRTDNUeXBlKCkudG9TdHJpbmcoKS5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IHR5cGVIYXNoQ29kZShMaXN0PEFic3RyYWN0VHlwZTw/Pj4gdHlwZXMpCi0gICAgewotICAgICAgICBpbnQgaCA9IDA7Ci0gICAgICAgIGZvciAoQWJzdHJhY3RUeXBlPD8+IHR5cGUgOiB0eXBlcykKLSAgICAgICAgICAgIGggPSBoICogMzEgKyB0eXBlSGFzaENvZGUodHlwZSk7Ci0gICAgICAgIHJldHVybiBoOwotICAgIH0KLQotICAgIHB1YmxpYyBGdW5jdGlvbnMgZmlsdGVyKFByZWRpY2F0ZTxGdW5jdGlvbj4gcHJlZGljYXRlKQotICAgIHsKLSAgICAgICAgQnVpbGRlciBidWlsZGVyID0gYnVpbGRlcigpOwotICAgICAgICBzdHJlYW0oKS5maWx0ZXIocHJlZGljYXRlKS5mb3JFYWNoKGJ1aWxkZXI6OmFkZCk7Ci0gICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgRnVuY3Rpb25zIGluc3RhbmNlIHdpdGggdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGFkZGVkCi0gICAgICovCi0gICAgcHVibGljIEZ1bmN0aW9ucyB3aXRoKEZ1bmN0aW9uIGZ1bikKLSAgICB7Ci0gICAgICAgIGlmIChmaW5kKGZ1bi5uYW1lKCksIGZ1bi5hcmdUeXBlcygpKS5pc1ByZXNlbnQoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiRnVuY3Rpb24gJXMgYWxyZWFkeSBleGlzdHMiLCBmdW4ubmFtZSgpKSk7Ci0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIoKS5hZGQodGhpcykuYWRkKGZ1bikuYnVpbGQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgRnVuY3Rpb25zIGluc3RhbmNlIHdpdGggdGhlIGZ1bmN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUgYW5kIGFyZ3VtZW50IHR5cGVzIHJlbW92ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgRnVuY3Rpb25zIHdpdGhvdXQoRnVuY3Rpb25OYW1lIG5hbWUsIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcykKLSAgICB7Ci0gICAgICAgIEZ1bmN0aW9uIGZ1biA9Ci0gICAgICAgICAgICBmaW5kKG5hbWUsIGFyZ1R5cGVzKS5vckVsc2VUaHJvdygoKSAtPiBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkZ1bmN0aW9uICVzIGRvZXNuJ3QgZXhpc3RzIiwgbmFtZSkpKTsKLQotICAgICAgICByZXR1cm4gd2l0aG91dChmdW4pOwotICAgIH0KLQotICAgIHB1YmxpYyBGdW5jdGlvbnMgd2l0aG91dChGdW5jdGlvbiBmdW5jdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBidWlsZGVyKCkuYWRkKEl0ZXJhYmxlcy5maWx0ZXIodGhpcywgZiAtPiBmICE9IGZ1bmN0aW9uKSkuYnVpbGQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRnVuY3Rpb25zIHdpdGhBZGRlZE9yVXBkYXRlZChGdW5jdGlvbiBmdW5jdGlvbikKLSAgICB7Ci0gICAgICAgIHJldHVybiBidWlsZGVyKCkuYWRkKEl0ZXJhYmxlcy5maWx0ZXIodGhpcywgZiAtPiAhKGYubmFtZSgpLmVxdWFscyhmdW5jdGlvbi5uYW1lKCkpICYmIEZ1bmN0aW9ucy50eXBlc01hdGNoKGYuYXJnVHlwZXMoKSwgZnVuY3Rpb24uYXJnVHlwZXMoKSkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoZnVuY3Rpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcyA9PSBvIHx8IChvIGluc3RhbmNlb2YgRnVuY3Rpb25zICYmIGZ1bmN0aW9ucy5lcXVhbHMoKChGdW5jdGlvbnMpIG8pLmZ1bmN0aW9ucykpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy52YWx1ZXMoKS50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlcgotICAgIHsKLSAgICAgICAgZmluYWwgSW1tdXRhYmxlTXVsdGltYXAuQnVpbGRlcjxGdW5jdGlvbk5hbWUsIEZ1bmN0aW9uPiBmdW5jdGlvbnMgPSBuZXcgSW1tdXRhYmxlTXVsdGltYXAuQnVpbGRlcjw+KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBCdWlsZGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gd2UgbmVlZCBkZXRlcm1pbmlzdGljIGl0ZXJhdGlvbiBvcmRlcjsgb3RoZXJ3aXNlIEZ1bmN0aW9ucy5lcXVhbHMoKSBicmVha3MgZG93bgotICAgICAgICAgICAgZnVuY3Rpb25zLm9yZGVyVmFsdWVzQnkoQ29tcGFyYXRvci5jb21wYXJpbmdJbnQoT2JqZWN0OjpoYXNoQ29kZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZ1bmN0aW9ucyBidWlsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25zKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkKEZ1bmN0aW9uIGZ1bikKLSAgICAgICAgewotICAgICAgICAgICAgZnVuY3Rpb25zLnB1dChmdW4ubmFtZSgpLCBmdW4pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGQoRnVuY3Rpb24uLi4gZnVucykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChGdW5jdGlvbiBmdW4gOiBmdW5zKQotICAgICAgICAgICAgICAgIGFkZChmdW4pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGQoSXRlcmFibGU8PyBleHRlbmRzIEZ1bmN0aW9uPiBmdW5zKQotICAgICAgICB7Ci0gICAgICAgICAgICBmdW5zLmZvckVhY2godGhpczo6YWRkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgc3RhdGljIEZ1bmN0aW9uc0RpZmY8VURGdW5jdGlvbj4gdWRmc0RpZmYoRnVuY3Rpb25zIGJlZm9yZSwgRnVuY3Rpb25zIGFmdGVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChGdW5jdGlvbnNEaWZmPFVERnVuY3Rpb24+KSBGdW5jdGlvbnNEaWZmLmRpZmYoYmVmb3JlLCBhZnRlciwgRmlsdGVyLlVERik7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgc3RhdGljIEZ1bmN0aW9uc0RpZmY8VURBZ2dyZWdhdGU+IHVkYXNEaWZmKEZ1bmN0aW9ucyBiZWZvcmUsIEZ1bmN0aW9ucyBhZnRlcikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoRnVuY3Rpb25zRGlmZjxVREFnZ3JlZ2F0ZT4pIEZ1bmN0aW9uc0RpZmYuZGlmZihiZWZvcmUsIGFmdGVyLCBGaWx0ZXIuVURBKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZ1bmN0aW9uc0RpZmY8VCBleHRlbmRzIEZ1bmN0aW9uPiBleHRlbmRzIERpZmY8RnVuY3Rpb25zLCBUPgotICAgIHsKLSAgICAgICAgc3RhdGljIGZpbmFsIEZ1bmN0aW9uc0RpZmYgTk9ORSA9IG5ldyBGdW5jdGlvbnNEaWZmPD4oRnVuY3Rpb25zLm5vbmUoKSwgRnVuY3Rpb25zLm5vbmUoKSwgSW1tdXRhYmxlTGlzdC5vZigpKTsKLQotICAgICAgICBwcml2YXRlIEZ1bmN0aW9uc0RpZmYoRnVuY3Rpb25zIGNyZWF0ZWQsIEZ1bmN0aW9ucyBkcm9wcGVkLCBJbW11dGFibGVDb2xsZWN0aW9uPEFsdGVyZWQ8VD4+IGFsdGVyZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGNyZWF0ZWQsIGRyb3BwZWQsIGFsdGVyZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRnVuY3Rpb25zRGlmZiBkaWZmKEZ1bmN0aW9ucyBiZWZvcmUsIEZ1bmN0aW9ucyBhZnRlciwgRmlsdGVyIGZpbHRlcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJlZm9yZSA9PSBhZnRlcikKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9ORTsKLQotICAgICAgICAgICAgRnVuY3Rpb25zIGNyZWF0ZWQgPSBhZnRlci5maWx0ZXIoZmlsdGVyLmFuZChrIC0+ICFiZWZvcmUuZmluZChrLm5hbWUoKSwgay5hcmdUeXBlcygpLCBmaWx0ZXIpLmlzUHJlc2VudCgpKSk7Ci0gICAgICAgICAgICBGdW5jdGlvbnMgZHJvcHBlZCA9IGJlZm9yZS5maWx0ZXIoZmlsdGVyLmFuZChrIC0+ICFhZnRlci5maW5kKGsubmFtZSgpLCBrLmFyZ1R5cGVzKCksIGZpbHRlcikuaXNQcmVzZW50KCkpKTsKLQotICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5CdWlsZGVyPEFsdGVyZWQ8RnVuY3Rpb24+PiBhbHRlcmVkID0gSW1tdXRhYmxlTGlzdC5idWlsZGVyKCk7Ci0gICAgICAgICAgICBiZWZvcmUuc3RyZWFtKCkuZmlsdGVyKGZpbHRlcikuZm9yRWFjaChmdW5jdGlvbkJlZm9yZSAtPgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFmdGVyLmZpbmQoZnVuY3Rpb25CZWZvcmUubmFtZSgpLCBmdW5jdGlvbkJlZm9yZS5hcmdUeXBlcygpLCBmaWx0ZXIpLmlmUHJlc2VudChmdW5jdGlvbkFmdGVyIC0+Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkJlZm9yZS5jb21wYXJlKGZ1bmN0aW9uQWZ0ZXIpLmlmUHJlc2VudChraW5kIC0+IGFsdGVyZWQuYWRkKG5ldyBBbHRlcmVkPD4oZnVuY3Rpb25CZWZvcmUsIGZ1bmN0aW9uQWZ0ZXIsIGtpbmQpKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbnNEaWZmPD4oY3JlYXRlZCwgZHJvcHBlZCwgYWx0ZXJlZC5idWlsZCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9LZXlzcGFjZU1ldGFkYXRhLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvS2V5c3BhY2VNZXRhZGF0YS5qYXZhCmluZGV4IDZkODUzOTEuLmZiMmVmYzggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9LZXlzcGFjZU1ldGFkYXRhLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL0tleXNwYWNlTWV0YWRhdGEuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIApAQCAtMzAsMTIgKzMxLDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNxbEJ1aWxkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5TY2hlbWFFbGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlVEQWdncmVnYXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlVERnVuY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Vc2VyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5BYnN0cmFjdFJlcGxpY2F0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkZ1bmN0aW9ucy5GdW5jdGlvbnNEaWZmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Vc2VyRnVuY3Rpb25zLkZ1bmN0aW9uc0RpZmY7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlcy5UYWJsZXNEaWZmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UeXBlcy5UeXBlc0RpZmY7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlZpZXdzLlZpZXdzRGlmZjsKQEAgLTYxLDkgKzYzLDkgQEAKICAgICBwdWJsaWMgZmluYWwgVGFibGVzIHRhYmxlczsKICAgICBwdWJsaWMgZmluYWwgVmlld3Mgdmlld3M7CiAgICAgcHVibGljIGZpbmFsIFR5cGVzIHR5cGVzOwotICAgIHB1YmxpYyBmaW5hbCBGdW5jdGlvbnMgZnVuY3Rpb25zOworICAgIHB1YmxpYyBmaW5hbCBVc2VyRnVuY3Rpb25zIHVzZXJGdW5jdGlvbnM7CiAKLSAgICBwcml2YXRlIEtleXNwYWNlTWV0YWRhdGEoU3RyaW5nIG5hbWUsIEtpbmQga2luZCwgS2V5c3BhY2VQYXJhbXMgcGFyYW1zLCBUYWJsZXMgdGFibGVzLCBWaWV3cyB2aWV3cywgVHlwZXMgdHlwZXMsIEZ1bmN0aW9ucyBmdW5jdGlvbnMpCisgICAgcHJpdmF0ZSBLZXlzcGFjZU1ldGFkYXRhKFN0cmluZyBuYW1lLCBLaW5kIGtpbmQsIEtleXNwYWNlUGFyYW1zIHBhcmFtcywgVGFibGVzIHRhYmxlcywgVmlld3Mgdmlld3MsIFR5cGVzIHR5cGVzLCBVc2VyRnVuY3Rpb25zIGZ1bmN0aW9ucykKICAgICB7CiAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgIHRoaXMua2luZCA9IGtpbmQ7CkBAIC03MSw1NyArNzMsNTcgQEAKICAgICAgICAgdGhpcy50YWJsZXMgPSB0YWJsZXM7CiAgICAgICAgIHRoaXMudmlld3MgPSB2aWV3czsKICAgICAgICAgdGhpcy50eXBlcyA9IHR5cGVzOwotICAgICAgICB0aGlzLmZ1bmN0aW9ucyA9IGZ1bmN0aW9uczsKKyAgICAgICAgdGhpcy51c2VyRnVuY3Rpb25zID0gZnVuY3Rpb25zOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgS2V5c3BhY2VNZXRhZGF0YSBjcmVhdGUoU3RyaW5nIG5hbWUsIEtleXNwYWNlUGFyYW1zIHBhcmFtcykKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgS2V5c3BhY2VNZXRhZGF0YShuYW1lLCBLaW5kLlJFR1VMQVIsIHBhcmFtcywgVGFibGVzLm5vbmUoKSwgVmlld3Mubm9uZSgpLCBUeXBlcy5ub25lKCksIEZ1bmN0aW9ucy5ub25lKCkpOworICAgICAgICByZXR1cm4gbmV3IEtleXNwYWNlTWV0YWRhdGEobmFtZSwgS2luZC5SRUdVTEFSLCBwYXJhbXMsIFRhYmxlcy5ub25lKCksIFZpZXdzLm5vbmUoKSwgVHlwZXMubm9uZSgpLCBVc2VyRnVuY3Rpb25zLm5vbmUoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBLZXlzcGFjZU1ldGFkYXRhIGNyZWF0ZShTdHJpbmcgbmFtZSwgS2V5c3BhY2VQYXJhbXMgcGFyYW1zLCBUYWJsZXMgdGFibGVzKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBLZXlzcGFjZU1ldGFkYXRhKG5hbWUsIEtpbmQuUkVHVUxBUiwgcGFyYW1zLCB0YWJsZXMsIFZpZXdzLm5vbmUoKSwgVHlwZXMubm9uZSgpLCBGdW5jdGlvbnMubm9uZSgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlzcGFjZU1ldGFkYXRhKG5hbWUsIEtpbmQuUkVHVUxBUiwgcGFyYW1zLCB0YWJsZXMsIFZpZXdzLm5vbmUoKSwgVHlwZXMubm9uZSgpLCBVc2VyRnVuY3Rpb25zLm5vbmUoKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBLZXlzcGFjZU1ldGFkYXRhIGNyZWF0ZShTdHJpbmcgbmFtZSwgS2V5c3BhY2VQYXJhbXMgcGFyYW1zLCBUYWJsZXMgdGFibGVzLCBWaWV3cyB2aWV3cywgVHlwZXMgdHlwZXMsIEZ1bmN0aW9ucyBmdW5jdGlvbnMpCisgICAgcHVibGljIHN0YXRpYyBLZXlzcGFjZU1ldGFkYXRhIGNyZWF0ZShTdHJpbmcgbmFtZSwgS2V5c3BhY2VQYXJhbXMgcGFyYW1zLCBUYWJsZXMgdGFibGVzLCBWaWV3cyB2aWV3cywgVHlwZXMgdHlwZXMsIFVzZXJGdW5jdGlvbnMgZnVuY3Rpb25zKQogICAgIHsKICAgICAgICAgcmV0dXJuIG5ldyBLZXlzcGFjZU1ldGFkYXRhKG5hbWUsIEtpbmQuUkVHVUxBUiwgcGFyYW1zLCB0YWJsZXMsIHZpZXdzLCB0eXBlcywgZnVuY3Rpb25zKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIEtleXNwYWNlTWV0YWRhdGEgdmlydHVhbChTdHJpbmcgbmFtZSwgVGFibGVzIHRhYmxlcykKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgS2V5c3BhY2VNZXRhZGF0YShuYW1lLCBLaW5kLlZJUlRVQUwsIEtleXNwYWNlUGFyYW1zLmxvY2FsKCksIHRhYmxlcywgVmlld3Mubm9uZSgpLCBUeXBlcy5ub25lKCksIEZ1bmN0aW9ucy5ub25lKCkpOworICAgICAgICByZXR1cm4gbmV3IEtleXNwYWNlTWV0YWRhdGEobmFtZSwgS2luZC5WSVJUVUFMLCBLZXlzcGFjZVBhcmFtcy5sb2NhbCgpLCB0YWJsZXMsIFZpZXdzLm5vbmUoKSwgVHlwZXMubm9uZSgpLCBVc2VyRnVuY3Rpb25zLm5vbmUoKSk7CiAgICAgfQogCiAgICAgcHVibGljIEtleXNwYWNlTWV0YWRhdGEgd2l0aFN3YXBwZWQoS2V5c3BhY2VQYXJhbXMgcGFyYW1zKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBLZXlzcGFjZU1ldGFkYXRhKG5hbWUsIGtpbmQsIHBhcmFtcywgdGFibGVzLCB2aWV3cywgdHlwZXMsIGZ1bmN0aW9ucyk7CisgICAgICAgIHJldHVybiBuZXcgS2V5c3BhY2VNZXRhZGF0YShuYW1lLCBraW5kLCBwYXJhbXMsIHRhYmxlcywgdmlld3MsIHR5cGVzLCB1c2VyRnVuY3Rpb25zKTsKICAgICB9CiAKICAgICBwdWJsaWMgS2V5c3BhY2VNZXRhZGF0YSB3aXRoU3dhcHBlZChUYWJsZXMgcmVndWxhcikKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgS2V5c3BhY2VNZXRhZGF0YShuYW1lLCBraW5kLCBwYXJhbXMsIHJlZ3VsYXIsIHZpZXdzLCB0eXBlcywgZnVuY3Rpb25zKTsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlzcGFjZU1ldGFkYXRhKG5hbWUsIGtpbmQsIHBhcmFtcywgcmVndWxhciwgdmlld3MsIHR5cGVzLCB1c2VyRnVuY3Rpb25zKTsKICAgICB9CiAKICAgICBwdWJsaWMgS2V5c3BhY2VNZXRhZGF0YSB3aXRoU3dhcHBlZChWaWV3cyB2aWV3cykKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgS2V5c3BhY2VNZXRhZGF0YShuYW1lLCBraW5kLCBwYXJhbXMsIHRhYmxlcywgdmlld3MsIHR5cGVzLCBmdW5jdGlvbnMpOworICAgICAgICByZXR1cm4gbmV3IEtleXNwYWNlTWV0YWRhdGEobmFtZSwga2luZCwgcGFyYW1zLCB0YWJsZXMsIHZpZXdzLCB0eXBlcywgdXNlckZ1bmN0aW9ucyk7CiAgICAgfQogCiAgICAgcHVibGljIEtleXNwYWNlTWV0YWRhdGEgd2l0aFN3YXBwZWQoVHlwZXMgdHlwZXMpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IEtleXNwYWNlTWV0YWRhdGEobmFtZSwga2luZCwgcGFyYW1zLCB0YWJsZXMsIHZpZXdzLCB0eXBlcywgZnVuY3Rpb25zKTsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlzcGFjZU1ldGFkYXRhKG5hbWUsIGtpbmQsIHBhcmFtcywgdGFibGVzLCB2aWV3cywgdHlwZXMsIHVzZXJGdW5jdGlvbnMpOwogICAgIH0KIAotICAgIHB1YmxpYyBLZXlzcGFjZU1ldGFkYXRhIHdpdGhTd2FwcGVkKEZ1bmN0aW9ucyBmdW5jdGlvbnMpCisgICAgcHVibGljIEtleXNwYWNlTWV0YWRhdGEgd2l0aFN3YXBwZWQoVXNlckZ1bmN0aW9ucyBmdW5jdGlvbnMpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IEtleXNwYWNlTWV0YWRhdGEobmFtZSwga2luZCwgcGFyYW1zLCB0YWJsZXMsIHZpZXdzLCB0eXBlcywgZnVuY3Rpb25zKTsKICAgICB9CiAKICAgICBwdWJsaWMgS2V5c3BhY2VNZXRhZGF0YSBlbXB0eSgpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IEtleXNwYWNlTWV0YWRhdGEodGhpcy5uYW1lLCB0aGlzLmtpbmQsIHRoaXMucGFyYW1zLCBUYWJsZXMubm9uZSgpLCBWaWV3cy5ub25lKCksIFR5cGVzLm5vbmUoKSwgRnVuY3Rpb25zLm5vbmUoKSk7CisgICAgICAgIHJldHVybiBuZXcgS2V5c3BhY2VNZXRhZGF0YSh0aGlzLm5hbWUsIHRoaXMua2luZCwgdGhpcy5wYXJhbXMsIFRhYmxlcy5ub25lKCksIFZpZXdzLm5vbmUoKSwgVHlwZXMubm9uZSgpLCBVc2VyRnVuY3Rpb25zLm5vbmUoKSk7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkKQEAgLTE0MSw3ICsxNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVzLndpdGhVcGRhdGVkVXNlclR5cGUodWR0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdzLndpdGhVcGRhdGVkVXNlclR5cGVzKHVkdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcy53aXRoVXBkYXRlZFVzZXJUeXBlKHVkdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbnMud2l0aFVwZGF0ZWRVc2VyVHlwZSh1ZHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJGdW5jdGlvbnMud2l0aFVwZGF0ZWRVc2VyVHlwZSh1ZHQpKTsKICAgICB9CiAKICAgICBwdWJsaWMgSXRlcmFibGU8VGFibGVNZXRhZGF0YT4gdGFibGVzQW5kVmlld3MoKQpAQCAtMTczLDYgKzE3NSwxNSBAQAogICAgICAgICByZXR1cm4gYW55KHRhYmxlcywgdCAtPiB0LmluZGV4ZXMuaGFzKGluZGV4TmFtZSkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBwYXJhbSBmdW5jdGlvbiBhIHVzZXIgZnVuY3Rpb24KKyAgICAgKiBAcmV0dXJuIGEgc3RyZWFtIG9mIHRhYmxlcyB3aXRoaW4gdGhpcyBrZXlzcGFjZSB0aGF0IGhhdmUgY29sdW1uIG1hc2tzIHVzaW5nIHRoZSBzcGVjaWZpZWQgdXNlciBmdW5jdGlvbgorICAgICAqLworICAgIHB1YmxpYyBTdHJlYW08VGFibGVNZXRhZGF0YT4gdGFibGVzVXNpbmdGdW5jdGlvbihGdW5jdGlvbiBmdW5jdGlvbikKKyAgICB7CisgICAgICAgIHJldHVybiB0YWJsZXMuc3RyZWFtKCkuZmlsdGVyKHRhYmxlIC0+IHRhYmxlLmRlcGVuZHNPbihmdW5jdGlvbikpOworICAgIH0KKwogICAgIHB1YmxpYyBTdHJpbmcgZmluZEF2YWlsYWJsZUluZGV4TmFtZShTdHJpbmcgYmFzZU5hbWUpCiAgICAgewogICAgICAgICBpZiAoIWhhc0luZGV4KGJhc2VOYW1lKSkKQEAgLTIwMCw3ICsyMTEsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUobmFtZSwga2luZCwgcGFyYW1zLCB0YWJsZXMsIHZpZXdzLCBmdW5jdGlvbnMsIHR5cGVzKTsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaENvZGUobmFtZSwga2luZCwgcGFyYW1zLCB0YWJsZXMsIHZpZXdzLCB1c2VyRnVuY3Rpb25zLCB0eXBlcyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yMTUsMTIgKzIyNiwxMiBAQAogICAgICAgICBLZXlzcGFjZU1ldGFkYXRhIG90aGVyID0gKEtleXNwYWNlTWV0YWRhdGEpIG87CiAKICAgICAgICAgcmV0dXJuIG5hbWUuZXF1YWxzKG90aGVyLm5hbWUpCi0gICAgICAgICAgICAmJiBraW5kID09IG90aGVyLmtpbmQKLSAgICAgICAgICAgICYmIHBhcmFtcy5lcXVhbHMob3RoZXIucGFyYW1zKQotICAgICAgICAgICAgJiYgdGFibGVzLmVxdWFscyhvdGhlci50YWJsZXMpCi0gICAgICAgICAgICAmJiB2aWV3cy5lcXVhbHMob3RoZXIudmlld3MpCi0gICAgICAgICAgICAmJiBmdW5jdGlvbnMuZXF1YWxzKG90aGVyLmZ1bmN0aW9ucykKLSAgICAgICAgICAgICYmIHR5cGVzLmVxdWFscyhvdGhlci50eXBlcyk7CisgICAgICAgICAgICAgICAmJiBraW5kID09IG90aGVyLmtpbmQKKyAgICAgICAgICAgICAgICYmIHBhcmFtcy5lcXVhbHMob3RoZXIucGFyYW1zKQorICAgICAgICAgICAgICAgJiYgdGFibGVzLmVxdWFscyhvdGhlci50YWJsZXMpCisgICAgICAgICAgICAgICAmJiB2aWV3cy5lcXVhbHMob3RoZXIudmlld3MpCisgICAgICAgICAgICAgICAmJiB1c2VyRnVuY3Rpb25zLmVxdWFscyhvdGhlci51c2VyRnVuY3Rpb25zKQorICAgICAgICAgICAgICAgJiYgdHlwZXMuZXF1YWxzKG90aGVyLnR5cGVzKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTIzMiw3ICsyNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCJwYXJhbXMiLCBwYXJhbXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoInRhYmxlcyIsIHRhYmxlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCgidmlld3MiLCB2aWV3cykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCgiZnVuY3Rpb25zIiwgZnVuY3Rpb25zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCJmdW5jdGlvbnMiLCB1c2VyRnVuY3Rpb25zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCJ0eXBlcyIsIHR5cGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKTsKICAgICB9CkBAIC0zODUsMTAgKzM5NiwxMCBAQAogCiAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgRnVuY3Rpb25zRGlmZjxVREZ1bmN0aW9uPiAgdWRmcyA9IEZ1bmN0aW9uc0RpZmYuTk9ORTsKICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBGdW5jdGlvbnNEaWZmPFVEQWdncmVnYXRlPiB1ZGFzID0gRnVuY3Rpb25zRGlmZi5OT05FOwotICAgICAgICAgICAgaWYgKGJlZm9yZS5mdW5jdGlvbnMgIT0gYWZ0ZXIuZnVuY3Rpb25zKQorICAgICAgICAgICAgaWYgKGJlZm9yZS51c2VyRnVuY3Rpb25zICE9IGFmdGVyLnVzZXJGdW5jdGlvbnMpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdWRmcyA9IEZ1bmN0aW9ucy51ZGZzRGlmZihiZWZvcmUuZnVuY3Rpb25zLCBhZnRlci5mdW5jdGlvbnMpOwotICAgICAgICAgICAgICAgIHVkYXMgPSBGdW5jdGlvbnMudWRhc0RpZmYoYmVmb3JlLmZ1bmN0aW9ucywgYWZ0ZXIuZnVuY3Rpb25zKTsKKyAgICAgICAgICAgICAgICB1ZGZzID0gVXNlckZ1bmN0aW9ucy51ZGZzRGlmZihiZWZvcmUudXNlckZ1bmN0aW9ucywgYWZ0ZXIudXNlckZ1bmN0aW9ucyk7CisgICAgICAgICAgICAgICAgdWRhcyA9IFVzZXJGdW5jdGlvbnMudWRhc0RpZmYoYmVmb3JlLnVzZXJGdW5jdGlvbnMsIGFmdGVyLnVzZXJGdW5jdGlvbnMpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoYmVmb3JlLnBhcmFtcy5lcXVhbHMoYWZ0ZXIucGFyYW1zKSAmJiB0YWJsZXMuaXNFbXB0eSgpICYmIHZpZXdzLmlzRW1wdHkoKSAmJiB0eXBlcy5pc0VtcHR5KCkgJiYgdWRmcy5pc0VtcHR5KCkgJiYgdWRhcy5pc0VtcHR5KCkpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvTWlncmF0aW9uQ29vcmRpbmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9NaWdyYXRpb25Db29yZGluYXRvci5qYXZhCmluZGV4IDYxZWY0YzguLjU2MjQ4OTkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9NaWdyYXRpb25Db29yZGluYXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9NaWdyYXRpb25Db29yZGluYXRvci5qYXZhCkBAIC00Niw3ICs0Niw2IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Ob1NwYW1Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIApAQCAtNjgsNiArNjcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTm9TcGFtTG9nZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2ltdWxhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5GdXR1cmU7CkBAIC0yNTQsMTAgKzI1NCwxMSBAQAogCiAgICAgdm9pZCBzdGFydCgpCiAgICAgewotICAgICAgICBsb2dnZXIuaW5mbygiU3RhcnRpbmcgbWlncmF0aW9uIGNvb3JkaW5hdG9yIGFuZCBzY2hlZHVsaW5nIHB1bGxpbmcgc2NoZW1hIHZlcnNpb25zIGV2ZXJ5IHt9IiwgRHVyYXRpb24ub2ZNaWxsaXMoU0NIRU1BX1BVTExfSU5URVJWQUxfTVMuZ2V0TG9uZygpKSk7CisgICAgICAgIGxvbmcgaW50ZXJ2YWwgPSBTQ0hFTUFfUFVMTF9JTlRFUlZBTF9NUy5nZXRMb25nKCk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJTdGFydGluZyBtaWdyYXRpb24gY29vcmRpbmF0b3IgYW5kIHNjaGVkdWxpbmcgcHVsbGluZyBzY2hlbWEgdmVyc2lvbnMgZXZlcnkge30iLCBEdXJhdGlvbi5vZk1pbGxpcyhpbnRlcnZhbCkpOwogICAgICAgICBhbm5vdW5jZShzY2hlbWFWZXJzaW9uLmdldCgpKTsKICAgICAgICAgcGVyaW9kaWNQdWxsVGFzay51cGRhdGVBbmRHZXQoY3VyVGFzayAtPiBjdXJUYXNrID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBlcmlvZGljQ2hlY2tFeGVjdXRvci5zY2hlZHVsZVdpdGhGaXhlZERlbGF5KHRoaXM6OnB1bGxVbnJlY2VpdmVkU2NoZW1hVmVyc2lvbnMsIFNDSEVNQV9QVUxMX0lOVEVSVkFMX01TLmdldExvbmcoKSwgU0NIRU1BX1BVTExfSU5URVJWQUxfTVMuZ2V0TG9uZygpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwZXJpb2RpY0NoZWNrRXhlY3V0b3Iuc2NoZWR1bGVXaXRoRml4ZWREZWxheSh0aGlzOjpwdWxsVW5yZWNlaXZlZFNjaGVtYVZlcnNpb25zLCBpbnRlcnZhbCwgaW50ZXJ2YWwsIFRpbWVVbml0Lk1JTExJU0VDT05EUykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGN1clRhc2spOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYS5qYXZhCmluZGV4IDBkYmExNjcuLjNjZjE4MTQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hLmphdmEKQEAgLTE4LDcgKzE4LDE0IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYTsKIAogaW1wb3J0IGphdmEudGltZS5EdXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOwpAQCAtMjgsMTAgKzM1LDE3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBEaWZmZXJlbmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5PYmplY3RVdGlsczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25OYW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlVzZXJGdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZU5vdERlZmluZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU3lzdGVtS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5WaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CkBAIC00OSw5ICs2Myw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Bd2FpdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Mb2FkaW5nTWFwOwogCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQogaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5zaXplOwogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvci5pc0RhZW1vbkluaXRpYWxpemVkOwpAQCAtMjEzLDYgKzIyNCwxMiBAQAogICAgICAgICByZXR1cm4ga2V5c3BhY2VJbnN0YW5jZXMuZ2V0SWZSZWFkeShrZXlzcGFjZU5hbWUpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJldHVybnMge0BsaW5rIENvbHVtbkZhbWlseVN0b3JlfSBieSB0aGUgdGFibGUgaWRlbnRpZmllci4gTm90ZSB0aGF0IHRob3VnaCwgaWYgY2FsbGVkIGZvciB7QGxpbmsgVGFibGVNZXRhZGF0YSNpZH0sCisgICAgICogd2hlbiBtZXRhZGF0YSBwb2ludHMgdG8gYSBzZWNvbmRhcnkgaW5kZXggdGFibGUsIHRoZSB7QGxpbmsgVGFibGVNZXRhZGF0YSNpZH0gZGVub3RlcyB0aGUgaWRlbnRpZmllciBvZiB0aGUgbWFpbgorICAgICAqIHRhYmxlLCBub3QgdGhlIGluZGV4IHRhYmxlLiBUaHVzLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBDRlMgb2YgdGhlIG1haW4gdGFibGUgcmF0aGVyIHRoYW4sIHByb2JhYmx5IGV4cGVjdGVkLAorICAgICAqIENGUyBmb3IgdGhlIGluZGV4IGJhY2tpbmcgdGFibGUuCisgICAgICovCiAgICAgcHVibGljIENvbHVtbkZhbWlseVN0b3JlIGdldENvbHVtbkZhbWlseVN0b3JlSW5zdGFuY2UoVGFibGVJZCBpZCkKICAgICB7CiAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBnZXRUYWJsZU1ldGFkYXRhKGlkKTsKQEAgLTQ1NywxMyArNDc0LDEzIEBACiAgICAgLyogRnVuY3Rpb24gaGVscGVycyAqLwogCiAgICAgLyoqCi0gICAgICogR2V0IGFsbCBmdW5jdGlvbiBvdmVybG9hZHMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKiBHZXQgYWxsIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvdmVybG9hZHMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbmFtZSBmdWxseSBxdWFsaWZpZWQgZnVuY3Rpb24gbmFtZQogICAgICAqIEByZXR1cm4gYW4gZW1wdHkgbGlzdCBpZiB0aGUga2V5c3BhY2Ugb3IgdGhlIGZ1bmN0aW9uIG5hbWUgYXJlIG5vdCBmb3VuZDsKLSAgICAgKiAgICAgICAgIGEgbm9uLWVtcHR5IGNvbGxlY3Rpb24gb2Yge0BsaW5rIEZ1bmN0aW9ufSBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgIGEgbm9uLWVtcHR5IGNvbGxlY3Rpb24gb2Yge0BsaW5rIFVzZXJGdW5jdGlvbn0gb3RoZXJ3aXNlCiAgICAgICovCi0gICAgcHVibGljIENvbGxlY3Rpb248RnVuY3Rpb24+IGdldEZ1bmN0aW9ucyhGdW5jdGlvbk5hbWUgbmFtZSkKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxVc2VyRnVuY3Rpb24+IGdldFVzZXJGdW5jdGlvbnMoRnVuY3Rpb25OYW1lIG5hbWUpCiAgICAgewogICAgICAgICBpZiAoIW5hbWUuaGFzS2V5c3BhY2UoKSkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiRnVuY3Rpb24gbmFtZSBtdXN0IGJlIGZ1bGx5IHF1YWxpZmllZDogZ290ICVzIiwgbmFtZSkpOwpAQCAtNDcxLDI2ICs0ODgsMjQgQEAKICAgICAgICAgS2V5c3BhY2VNZXRhZGF0YSBrc20gPSBnZXRLZXlzcGFjZU1ldGFkYXRhKG5hbWUua2V5c3BhY2UpOwogICAgICAgICByZXR1cm4ga3NtID09IG51bGwKICAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkKLSAgICAgICAgICAgICAgIDoga3NtLmZ1bmN0aW9ucy5nZXQobmFtZSk7CisgICAgICAgICAgICAgICA6IGtzbS51c2VyRnVuY3Rpb25zLmdldChuYW1lKTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBGaW5kIHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQorICAgICAqIEZpbmQgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcmd1bWVudHMuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbmFtZSAgICAgZnVsbHkgcXVhbGlmaWVkIGZ1bmN0aW9uIG5hbWUKICAgICAgKiBAcGFyYW0gYXJnVHlwZXMgZnVuY3Rpb24gYXJndW1lbnQgdHlwZXMKICAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IHtAbGluayBPcHRpb25hbH0gaWYgdGhlIGtleXNwYWNlIG9yIHRoZSBmdW5jdGlvbiBuYW1lIGFyZSBub3QgZm91bmQ7CiAgICAgICogICAgICAgICBhIG5vbi1lbXB0eSBvcHRpb25hbCBvZiB7QGxpbmsgRnVuY3Rpb259IG90aGVyd2lzZQogICAgICAqLwotICAgIHB1YmxpYyBPcHRpb25hbDxGdW5jdGlvbj4gZmluZEZ1bmN0aW9uKEZ1bmN0aW9uTmFtZSBuYW1lLCBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMpCisgICAgcHVibGljIE9wdGlvbmFsPFVzZXJGdW5jdGlvbj4gZmluZFVzZXJGdW5jdGlvbihGdW5jdGlvbk5hbWUgbmFtZSwgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGFyZ1R5cGVzKQogICAgIHsKICAgICAgICAgaWYgKCFuYW1lLmhhc0tleXNwYWNlKCkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBmdWxseSBxdWFsbGlmaWVkOiBnb3QgJXMiLCBuYW1lKSk7CiAKLSAgICAgICAgS2V5c3BhY2VNZXRhZGF0YSBrc20gPSBnZXRLZXlzcGFjZU1ldGFkYXRhKG5hbWUua2V5c3BhY2UpOwotICAgICAgICByZXR1cm4ga3NtID09IG51bGwKLSAgICAgICAgICAgICAgID8gT3B0aW9uYWwuZW1wdHkoKQotICAgICAgICAgICAgICAgOiBrc20uZnVuY3Rpb25zLmZpbmQobmFtZSwgYXJnVHlwZXMpOworICAgICAgICByZXR1cm4gT3B0aW9uYWwub2ZOdWxsYWJsZShnZXRLZXlzcGFjZU1ldGFkYXRhKG5hbWUua2V5c3BhY2UpKQorICAgICAgICAgICAgICAgICAgICAgICAuZmxhdE1hcChrc20gLT4ga3NtLnVzZXJGdW5jdGlvbnMuZmluZChuYW1lLCBhcmdUeXBlcykpOwogICAgIH0KIAogICAgIC8qIFZlcnNpb24gY29udHJvbCAqLwpAQCAtNzc3LDQgKzc5Miw0IEBACiAgICAgICAgICAgICAgICA6IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CiAgICAgfQogCi19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUNoYW5nZU5vdGlmaWVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hQ2hhbmdlTm90aWZpZXIuamF2YQppbmRleCBjNDUzN2UxLi40NDllOTliIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hQ2hhbmdlTm90aWZpZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hQ2hhbmdlTm90aWZpZXIuamF2YQpAQCAtNTIsOCArNTIsOCBAQAogICAgICAgICBrZXlzcGFjZS50eXBlcy5mb3JFYWNoKHRoaXM6Om5vdGlmeUNyZWF0ZVR5cGUpOwogICAgICAgICBrZXlzcGFjZS50YWJsZXMuZm9yRWFjaCh0aGlzOjpub3RpZnlDcmVhdGVUYWJsZSk7CiAgICAgICAgIGtleXNwYWNlLnZpZXdzLmZvckVhY2godGhpczo6bm90aWZ5Q3JlYXRlVmlldyk7Ci0gICAgICAgIGtleXNwYWNlLmZ1bmN0aW9ucy51ZGZzKCkuZm9yRWFjaCh0aGlzOjpub3RpZnlDcmVhdGVGdW5jdGlvbik7Ci0gICAgICAgIGtleXNwYWNlLmZ1bmN0aW9ucy51ZGFzKCkuZm9yRWFjaCh0aGlzOjpub3RpZnlDcmVhdGVBZ2dyZWdhdGUpOworICAgICAgICBrZXlzcGFjZS51c2VyRnVuY3Rpb25zLnVkZnMoKS5mb3JFYWNoKHRoaXM6Om5vdGlmeUNyZWF0ZUZ1bmN0aW9uKTsKKyAgICAgICAga2V5c3BhY2UudXNlckZ1bmN0aW9ucy51ZGFzKCkuZm9yRWFjaCh0aGlzOjpub3RpZnlDcmVhdGVBZ2dyZWdhdGUpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUtleXNwYWNlQWx0ZXJlZChLZXlzcGFjZU1ldGFkYXRhLktleXNwYWNlRGlmZiBkZWx0YSwgYm9vbGVhbiBkcm9wRGF0YSkKQEAgLTg0LDggKzg0LDggQEAKIAogICAgIHB1YmxpYyB2b2lkIG5vdGlmeUtleXNwYWNlRHJvcHBlZChLZXlzcGFjZU1ldGFkYXRhIGtleXNwYWNlLCBib29sZWFuIGRyb3BEYXRhKQogICAgIHsKLSAgICAgICAga2V5c3BhY2UuZnVuY3Rpb25zLnVkYXMoKS5mb3JFYWNoKHRoaXM6Om5vdGlmeURyb3BBZ2dyZWdhdGUpOwotICAgICAgICBrZXlzcGFjZS5mdW5jdGlvbnMudWRmcygpLmZvckVhY2godGhpczo6bm90aWZ5RHJvcEZ1bmN0aW9uKTsKKyAgICAgICAga2V5c3BhY2UudXNlckZ1bmN0aW9ucy51ZGFzKCkuZm9yRWFjaCh0aGlzOjpub3RpZnlEcm9wQWdncmVnYXRlKTsKKyAgICAgICAga2V5c3BhY2UudXNlckZ1bmN0aW9ucy51ZGZzKCkuZm9yRWFjaCh0aGlzOjpub3RpZnlEcm9wRnVuY3Rpb24pOwogICAgICAgICBrZXlzcGFjZS52aWV3cy5mb3JFYWNoKHZpZXcgLT4gbm90aWZ5RHJvcFZpZXcodmlldywgZHJvcERhdGEpKTsKICAgICAgICAga2V5c3BhY2UudGFibGVzLmZvckVhY2gobWV0YWRhdGEgLT4gbm90aWZ5RHJvcFRhYmxlKG1ldGFkYXRhLCBkcm9wRGF0YSkpOwogICAgICAgICBrZXlzcGFjZS50eXBlcy5mb3JFYWNoKHRoaXM6Om5vdGlmeURyb3BUeXBlKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWFFdmVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUV2ZW50LmphdmEKaW5kZXggNTcwM2ZlMi4uOGNkZDBjOCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUV2ZW50LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUV2ZW50LmphdmEKQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgICAgICBpZiAoa3NtLnBhcmFtcyAhPSBudWxsKSByZXQucHV0KCJwYXJhbXMiLCBrc20ucGFyYW1zLnRvU3RyaW5nKCkpOwogICAgICAgICBpZiAoa3NtLnRhYmxlcyAhPSBudWxsKSByZXQucHV0KCJ0YWJsZXMiLCBrc20udGFibGVzLnRvU3RyaW5nKCkpOwogICAgICAgICBpZiAoa3NtLnZpZXdzICE9IG51bGwpIHJldC5wdXQoInZpZXdzIiwga3NtLnZpZXdzLnRvU3RyaW5nKCkpOwotICAgICAgICBpZiAoa3NtLmZ1bmN0aW9ucyAhPSBudWxsKSByZXQucHV0KCJmdW5jdGlvbnMiLCBrc20uZnVuY3Rpb25zLnRvU3RyaW5nKCkpOworICAgICAgICBpZiAoa3NtLnVzZXJGdW5jdGlvbnMgIT0gbnVsbCkgcmV0LnB1dCgiZnVuY3Rpb25zIiwga3NtLnVzZXJGdW5jdGlvbnMudG9TdHJpbmcoKSk7CiAgICAgICAgIGlmIChrc20udHlwZXMgIT0gbnVsbCkgcmV0LnB1dCgidHlwZXMiLCBrc20udHlwZXMudG9TdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUtleXNwYWNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hS2V5c3BhY2UuamF2YQppbmRleCAzZjIyM2RkLi5kMTFmODcwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hS2V5c3BhY2UuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hS2V5c3BhY2UuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmcuQ29sdW1uTWFzazsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVRhYmxlU3RhdGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKQEAgLTU2LDYgKzU3LDggQEAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdDsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvU2V0OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSUdOT1JFX0NPUlJVUFRFRF9TQ0hFTUFfVEFCTEVTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfRkxVU0hfTE9DQUxfU0NIRU1BX0NIQU5HRVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVPbmNlSW50ZXJuYWw7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFLZXlzcGFjZVRhYmxlcy4qOwpAQCAtNjMsNyArNjYsNyBAQAogCiAvKioKICAqIHN5c3RlbV9zY2hlbWEuKiB0YWJsZXMgYW5kIG1ldGhvZHMgZm9yIG1hbmlwdWxhdGluZyB0aGVtLgotICogCisgKgogICogUGxlYXNlIG5vdGljZSB0aGlzIGNsYXNzIGlzIF9ub3RfIHRocmVhZCBzYWZlIGFuZCBhbGwgbWV0aG9kcyB3aGljaCByZWFkcyBvciB1cGRhdGVzIHRoZSBkYXRhIGluIHNjaGVtYSBrZXlzcGFjZQogICogc2hvdWxkIGJlIGFjY2Vzc2VkIG9ubHkgZnJvbSB0aGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFNjaGVtYVVwZGF0ZUhhbmRsZXJ9IGluIHN5bmNocm9uaXplZCBibG9ja3MuCiAgKi8KQEAgLTc2LDggKzc5LDggQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTY2hlbWFLZXlzcGFjZS5jbGFzcyk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEZMVVNIX1NDSEVNQV9UQUJMRVMgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRkxVU0hfTE9DQUxfU0NIRU1BX0NIQU5HRVMuZ2V0Qm9vbGVhbigpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSUdOT1JFX0NPUlJVUFRFRF9TQ0hFTUFfVEFCTEVTID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEuaWdub3JlX2NvcnJ1cHRlZF9zY2hlbWFfdGFibGVzIiwgImZhbHNlIikpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gRkxVU0hfU0NIRU1BX1RBQkxFUyA9IFRFU1RfRkxVU0hfTE9DQUxfU0NIRU1BX0NIQU5HRVMuZ2V0Qm9vbGVhbigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSUdOT1JFX0NPUlJVUFRFRF9TQ0hFTUFfVEFCTEVTX1BST1BFUlRZX1ZBTFVFID0gSUdOT1JFX0NPUlJVUFRFRF9TQ0hFTUFfVEFCTEVTLmdldEJvb2xlYW4oKTsKIAogICAgIC8qKgogICAgICAqIFRoZSB0YWJsZXMgdG8gd2hpY2ggd2UgYWRkZWQgdGhlIGNkYyBjb2x1bW4uIFRoaXMgaXMgdXNlZCBpbiB7QGxpbmsgI21ha2VVcGRhdGVGb3JTY2hlbWF9IGJlbG93IHRvIG1ha2Ugc3VyZSB3ZSBza2lwIHRoYXQKQEAgLTEwMCw2ICsxMDMsNyBAQAogICAgICAgICAgICAgICAiQ1JFQVRFIFRBQkxFICVzICgiCiAgICAgICAgICAgICAgICsgImtleXNwYWNlX25hbWUgdGV4dCwiCiAgICAgICAgICAgICAgICsgInRhYmxlX25hbWUgdGV4dCwiCisgICAgICAgICAgICAgICsgImFsbG93X2F1dG9fc25hcHNob3QgYm9vbGVhbiwiCiAgICAgICAgICAgICAgICsgImJsb29tX2ZpbHRlcl9mcF9jaGFuY2UgZG91YmxlLCIKICAgICAgICAgICAgICAgKyAiY2FjaGluZyBmcm96ZW48bWFwPHRleHQsIHRleHQ+PiwiCiAgICAgICAgICAgICAgICsgImNvbW1lbnQgdGV4dCwiCkBAIC0xMTIsNiArMTE2LDcgQEAKICAgICAgICAgICAgICAgKyAiZXh0ZW5zaW9ucyBmcm96ZW48bWFwPHRleHQsIGJsb2I+PiwiCiAgICAgICAgICAgICAgICsgImZsYWdzIGZyb3plbjxzZXQ8dGV4dD4+LCIgLy8gU1VQRVIsIENPVU5URVIsIERFTlNFLCBDT01QT1VORAogICAgICAgICAgICAgICArICJnY19ncmFjZV9zZWNvbmRzIGludCwiCisgICAgICAgICAgICAgICsgImluY3JlbWVudGFsX2JhY2t1cHMgYm9vbGVhbiwiCiAgICAgICAgICAgICAgICsgImlkIHV1aWQsIgogICAgICAgICAgICAgICArICJtYXhfaW5kZXhfaW50ZXJ2YWwgaW50LCIKICAgICAgICAgICAgICAgKyAibWVtdGFibGVfZmx1c2hfcGVyaW9kX2luX21zIGludCwiCkBAIC0xMzcsNiArMTQyLDIwIEBACiAgICAgICAgICAgICAgICsgInR5cGUgdGV4dCwiCiAgICAgICAgICAgICAgICsgIlBSSU1BUlkgS0VZICgoa2V5c3BhY2VfbmFtZSksIHRhYmxlX25hbWUsIGNvbHVtbl9uYW1lKSkiKTsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRhYmxlTWV0YWRhdGEgQ29sdW1uTWFza3MgPQorICAgIHBhcnNlKENPTFVNTl9NQVNLUywKKyAgICAgICAgICAiY29sdW1uIGR5bmFtaWMgZGF0YSBtYXNrcyIsCisgICAgICAgICAgIkNSRUFURSBUQUJMRSAlcyAoIgorICAgICAgICAgICsgImtleXNwYWNlX25hbWUgdGV4dCwiCisgICAgICAgICAgKyAidGFibGVfbmFtZSB0ZXh0LCIKKyAgICAgICAgICArICJjb2x1bW5fbmFtZSB0ZXh0LCIKKyAgICAgICAgICArICJmdW5jdGlvbl9rZXlzcGFjZSB0ZXh0LCIKKyAgICAgICAgICArICJmdW5jdGlvbl9uYW1lIHRleHQsIgorICAgICAgICAgICsgImZ1bmN0aW9uX2FyZ3VtZW50X3R5cGVzIGZyb3plbjxsaXN0PHRleHQ+PiwiCisgICAgICAgICAgKyAiZnVuY3Rpb25fYXJndW1lbnRfdmFsdWVzIGZyb3plbjxsaXN0PHRleHQ+PiwiCisgICAgICAgICAgKyAiZnVuY3Rpb25fYXJndW1lbnRfbnVsbHMgZnJvemVuPGxpc3Q8Ym9vbGVhbj4+LCIgLy8gYXJndW1lbnRzIHRoYXQgYXJlIG51bGwKKyAgICAgICAgICArICJQUklNQVJZIEtFWSAoKGtleXNwYWNlX25hbWUpLCB0YWJsZV9uYW1lLCBjb2x1bW5fbmFtZSkpIik7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUYWJsZU1ldGFkYXRhIERyb3BwZWRDb2x1bW5zID0KICAgICAgICAgcGFyc2UoRFJPUFBFRF9DT0xVTU5TLAogICAgICAgICAgICAgICAiZHJvcHBlZCBjb2x1bW4gcmVnaXN0cnkiLApAQCAtMTY4LDYgKzE4Nyw3IEBACiAgICAgICAgICAgICAgICsgImJhc2VfdGFibGVfaWQgdXVpZCwiCiAgICAgICAgICAgICAgICsgImJhc2VfdGFibGVfbmFtZSB0ZXh0LCIKICAgICAgICAgICAgICAgKyAid2hlcmVfY2xhdXNlIHRleHQsIgorICAgICAgICAgICAgICArICJhbGxvd19hdXRvX3NuYXBzaG90IGJvb2xlYW4sIgogICAgICAgICAgICAgICArICJibG9vbV9maWx0ZXJfZnBfY2hhbmNlIGRvdWJsZSwiCiAgICAgICAgICAgICAgICsgImNhY2hpbmcgZnJvemVuPG1hcDx0ZXh0LCB0ZXh0Pj4sIgogICAgICAgICAgICAgICArICJjb21tZW50IHRleHQsIgpAQCAtMTc5LDYgKzE5OSw3IEBACiAgICAgICAgICAgICAgICsgImRlZmF1bHRfdGltZV90b19saXZlIGludCwiCiAgICAgICAgICAgICAgICsgImV4dGVuc2lvbnMgZnJvemVuPG1hcDx0ZXh0LCBibG9iPj4sIgogICAgICAgICAgICAgICArICJnY19ncmFjZV9zZWNvbmRzIGludCwiCisgICAgICAgICAgICAgICsgImluY3JlbWVudGFsX2JhY2t1cHMgYm9vbGVhbiwiCiAgICAgICAgICAgICAgICsgImlkIHV1aWQsIgogICAgICAgICAgICAgICArICJpbmNsdWRlX2FsbF9jb2x1bW5zIGJvb2xlYW4sIgogICAgICAgICAgICAgICArICJtYXhfaW5kZXhfaW50ZXJ2YWwgaW50LCIKQEAgLTI0MCw4ICsyNjEsMTcgQEAKICAgICAgICAgICAgICAgKyAic3RhdGVfdHlwZSB0ZXh0LCIKICAgICAgICAgICAgICAgKyAiUFJJTUFSWSBLRVkgKChrZXlzcGFjZV9uYW1lKSwgYWdncmVnYXRlX25hbWUsIGFyZ3VtZW50X3R5cGVzKSkiKTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8VGFibGVNZXRhZGF0YT4gQUxMX1RBQkxFX01FVEFEQVRBID0KLSAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihLZXlzcGFjZXMsIFRhYmxlcywgQ29sdW1ucywgVHJpZ2dlcnMsIERyb3BwZWRDb2x1bW5zLCBWaWV3cywgVHlwZXMsIEZ1bmN0aW9ucywgQWdncmVnYXRlcywgSW5kZXhlcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxUYWJsZU1ldGFkYXRhPiBBTExfVEFCTEVfTUVUQURBVEEgPSBJbW11dGFibGVMaXN0Lm9mKEtleXNwYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5NYXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpZ2dlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyb3BwZWRDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWdncmVnYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhlcyk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBUYWJsZU1ldGFkYXRhIHBhcnNlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyBjcWwpCiAgICAgewpAQCAtNDY5LDggKzQ5OSw4IEBACiAgICAgICAgIGtleXNwYWNlLnRhYmxlcy5mb3JFYWNoKHRhYmxlIC0+IGFkZFRhYmxlVG9TY2hlbWFNdXRhdGlvbih0YWJsZSwgdHJ1ZSwgYnVpbGRlcikpOwogICAgICAgICBrZXlzcGFjZS52aWV3cy5mb3JFYWNoKHZpZXcgLT4gYWRkVmlld1RvU2NoZW1hTXV0YXRpb24odmlldywgdHJ1ZSwgYnVpbGRlcikpOwogICAgICAgICBrZXlzcGFjZS50eXBlcy5mb3JFYWNoKHR5cGUgLT4gYWRkVHlwZVRvU2NoZW1hTXV0YXRpb24odHlwZSwgYnVpbGRlcikpOwotICAgICAgICBrZXlzcGFjZS5mdW5jdGlvbnMudWRmcygpLmZvckVhY2godWRmIC0+IGFkZEZ1bmN0aW9uVG9TY2hlbWFNdXRhdGlvbih1ZGYsIGJ1aWxkZXIpKTsKLSAgICAgICAga2V5c3BhY2UuZnVuY3Rpb25zLnVkYXMoKS5mb3JFYWNoKHVkYSAtPiBhZGRBZ2dyZWdhdGVUb1NjaGVtYU11dGF0aW9uKHVkYSwgYnVpbGRlcikpOworICAgICAgICBrZXlzcGFjZS51c2VyRnVuY3Rpb25zLnVkZnMoKS5mb3JFYWNoKHVkZiAtPiBhZGRGdW5jdGlvblRvU2NoZW1hTXV0YXRpb24odWRmLCBidWlsZGVyKSk7CisgICAgICAgIGtleXNwYWNlLnVzZXJGdW5jdGlvbnMudWRhcygpLmZvckVhY2godWRhIC0+IGFkZEFnZ3JlZ2F0ZVRvU2NoZW1hTXV0YXRpb24odWRhLCBidWlsZGVyKSk7CiAKICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CiAgICAgfQpAQCAtNTYzLDYgKzU5MywxNiBAQAogICAgICAgICAvLyBpbiBtaXhlZCBvcGVyYXRpb24gd2l0aCBwcmUtNC4xIHZlcnNpb25lZCBub2RlIGR1cmluZyB1cGdyYWRlcy4KICAgICAgICAgaWYgKHBhcmFtcy5tZW10YWJsZSAhPSBNZW10YWJsZVBhcmFtcy5ERUZBVUxUKQogICAgICAgICAgICAgYnVpbGRlci5hZGQoIm1lbXRhYmxlIiwgcGFyYW1zLm1lbXRhYmxlLmNvbmZpZ3VyYXRpb25LZXkoKSk7CisKKyAgICAgICAgLy8gQXMgYWJvdmUsIG9ubHkgYWRkIHRoZSBhbGxvd19hdXRvX3NuYXBzaG90IGNvbHVtbiBpZiB0aGUgdmFsdWUgaXMgbm90IGRlZmF1bHQgKHRydWUpIGFuZAorICAgICAgICAvLyBhdXRvLXNuYXBzaG90dGluZyBpcyBlbmFibGVkLCB0byBhdm9pZCBSVEUgaW4gcHJlLTQuMiB2ZXJzaW9uZWQgbm9kZSBkdXJpbmcgdXBncmFkZXMKKyAgICAgICAgaWYgKCFwYXJhbXMuYWxsb3dBdXRvU25hcHNob3QpCisgICAgICAgICAgICBidWlsZGVyLmFkZCgiYWxsb3dfYXV0b19zbmFwc2hvdCIsIGZhbHNlKTsKKworICAgICAgICAvLyBBcyBhYm92ZSwgb25seSBhZGQgdGhlIGluY3JlbWVudGFsX2JhY2t1cHMgY29sdW1uIGlmIHRoZSB2YWx1ZSBpcyBub3QgZGVmYXVsdCAodHJ1ZSkgYW5kCisgICAgICAgIC8vIGluY3JlbWVudGFsX2JhY2t1cHMgaXMgZW5hYmxlZCwgdG8gYXZvaWQgUlRFIGluIHByZS00LjIgdmVyc2lvbmVkIG5vZGUgZHVyaW5nIHVwZ3JhZGVzCisgICAgICAgIGlmICghcGFyYW1zLmluY3JlbWVudGFsQmFja3VwcykKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkKCJpbmNyZW1lbnRhbF9iYWNrdXBzIiwgZmFsc2UpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkQWx0ZXJUYWJsZVRvU2NoZW1hTXV0YXRpb24oVGFibGVNZXRhZGF0YSBvbGRUYWJsZSwgVGFibGVNZXRhZGF0YSBuZXdUYWJsZSwgTXV0YXRpb24uU2ltcGxlQnVpbGRlciBidWlsZGVyKQpAQCAtNjc0LDcgKzcxNCw3IEBACiAgICAgewogICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IGNvbHVtbi50eXBlOwogICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFJldmVyc2VkVHlwZSkKLSAgICAgICAgICAgIHR5cGUgPSAoKFJldmVyc2VkVHlwZSkgdHlwZSkuYmFzZVR5cGU7CisgICAgICAgICAgICB0eXBlID0gKChSZXZlcnNlZFR5cGU8Pz4pIHR5cGUpLmJhc2VUeXBlOwogCiAgICAgICAgIGJ1aWxkZXIudXBkYXRlKENvbHVtbnMpCiAgICAgICAgICAgICAgICAucm93KHRhYmxlLm5hbWUsIGNvbHVtbi5uYW1lLnRvU3RyaW5nKCkpCkBAIC02ODMsNiArNzIzLDUyIEBACiAgICAgICAgICAgICAgICAuYWRkKCJwb3NpdGlvbiIsIGNvbHVtbi5wb3NpdGlvbigpKQogICAgICAgICAgICAgICAgLmFkZCgiY2x1c3RlcmluZ19vcmRlciIsIGNvbHVtbi5jbHVzdGVyaW5nT3JkZXIoKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkpCiAgICAgICAgICAgICAgICAuYWRkKCJ0eXBlIiwgdHlwZS5hc0NRTDNUeXBlKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgQ29sdW1uTWFzayBtYXNrID0gY29sdW1uLmdldE1hc2soKTsKKyAgICAgICAgaWYgKFNjaGVtYUNvbnN0YW50cy5pc1JlcGxpY2F0ZWRTeXN0ZW1LZXlzcGFjZSh0YWJsZS5rZXlzcGFjZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoZSBwcm9wYWdhdGlvbiBvZiBzeXN0ZW0gZGlzdHJpYnV0ZWQga2V5c3BhY2VzIGF0IHN0YXJ0dXAgY2FuIGJlIHByb2JsZW1hdGljIGZvciBvbGQgbm9kZXMgd2l0aG91dCBERE0sCisgICAgICAgICAgICAvLyBzaW5jZSB0aG9zZSB3b24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCB0aGUgbWFzayBtdXRhdGlvbnMuIFRodXMsIHdlIGRvbid0IHN1cHBvcnQgRERNIG9uIHRob3NlIGtleXNwYWNlcy4KKyAgICAgICAgICAgIGFzc2VydCBtYXNrID09IG51bGwgOiAiRHluYW1pYyBkYXRhIG1hc2tpbmcgc2hvdWxkbid0IGJlIHVzZWQgb24gc3lzdGVtIGRpc3RyaWJ1dGVkIGtleXNwYWNlcyI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBSb3cuU2ltcGxlQnVpbGRlciBtYXNrQnVpbGRlciA9IGJ1aWxkZXIudXBkYXRlKENvbHVtbk1hc2tzKS5yb3codGFibGUubmFtZSwgY29sdW1uLm5hbWUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIGlmIChtYXNrID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFza0J1aWxkZXIuZGVsZXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lIG1hc2tGdW5jdGlvbk5hbWUgPSBtYXNrLmZ1bmN0aW9uLm5hbWUoKTsKKworICAgICAgICAgICAgICAgIC8vIFNvbWUgYXJndW1lbnRzIG9mIHRoZSBtYXNraW5nIGZ1bmN0aW9uIGNhbiBiZSBudWxsLCBidXQgdGhlIENRTCdzIGxpc3QgdHlwZSB0aGF0IHN0b3JlcyB0aGVtIGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAvLyBhY2NlcHQgbnVsbHMsIHNvIHdlIHVzZSBhIHBhcmFsbGVsIGxpc3Qgb2YgYm9vbGVhbnMgdG8gc3RvcmUgd2hhdCBhcmd1bWVudHMgYXJlIG51bGwuCisgICAgICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHBhcnRpYWxUeXBlcyA9IG1hc2sucGFydGlhbEFyZ3VtZW50VHlwZXMoKTsKKyAgICAgICAgICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHBhcnRpYWxWYWx1ZXMgPSBtYXNrLnBhcnRpYWxBcmd1bWVudFZhbHVlcygpOworICAgICAgICAgICAgICAgIGludCBudW1BcmdzID0gcGFydGlhbFR5cGVzLnNpemUoKTsKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PD4obnVtQXJncyk7CisgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8PihudW1BcmdzKTsKKyAgICAgICAgICAgICAgICBMaXN0PEJvb2xlYW4+IG51bGxzID0gbmV3IEFycmF5TGlzdDw+KG51bUFyZ3MpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJnczsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGFyZ1R5cGUgPSBwYXJ0aWFsVHlwZXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICB0eXBlcy5hZGQoYXJnVHlwZS5hc0NRTDNUeXBlKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBhcmdWYWx1ZSA9IHBhcnRpYWxWYWx1ZXMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzTnVsbCA9IGFyZ1ZhbHVlID09IG51bGw7CisgICAgICAgICAgICAgICAgICAgIG51bGxzLmFkZChpc051bGwpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKGlzTnVsbCA/ICIiIDogYXJnVHlwZS5nZXRTdHJpbmcoYXJnVmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtYXNrQnVpbGRlci5hZGQoImZ1bmN0aW9uX2tleXNwYWNlIiwgbWFza0Z1bmN0aW9uTmFtZS5rZXlzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoImZ1bmN0aW9uX25hbWUiLCBtYXNrRnVuY3Rpb25OYW1lLm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCJmdW5jdGlvbl9hcmd1bWVudF90eXBlcyIsIHR5cGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCgiZnVuY3Rpb25fYXJndW1lbnRfdmFsdWVzIiwgdmFsdWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCgiZnVuY3Rpb25fYXJndW1lbnRfbnVsbHMiLCBudWxscyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRyb3BDb2x1bW5Gcm9tU2NoZW1hTXV0YXRpb24oVGFibGVNZXRhZGF0YSB0YWJsZSwgQ29sdW1uTWV0YWRhdGEgY29sdW1uLCBNdXRhdGlvbi5TaW1wbGVCdWlsZGVyIGJ1aWxkZXIpCkBAIC04NjIsOSArOTQ4LDkgQEAKICAgICB7CiAgICAgICAgIEtleXNwYWNlUGFyYW1zIHBhcmFtcyA9IGZldGNoS2V5c3BhY2VQYXJhbXMoa2V5c3BhY2VOYW1lKTsKICAgICAgICAgVHlwZXMgdHlwZXMgPSBmZXRjaFR5cGVzKGtleXNwYWNlTmFtZSk7Ci0gICAgICAgIFRhYmxlcyB0YWJsZXMgPSBmZXRjaFRhYmxlcyhrZXlzcGFjZU5hbWUsIHR5cGVzKTsKLSAgICAgICAgVmlld3Mgdmlld3MgPSBmZXRjaFZpZXdzKGtleXNwYWNlTmFtZSwgdHlwZXMpOwotICAgICAgICBGdW5jdGlvbnMgZnVuY3Rpb25zID0gZmV0Y2hGdW5jdGlvbnMoa2V5c3BhY2VOYW1lLCB0eXBlcyk7CisgICAgICAgIFVzZXJGdW5jdGlvbnMgZnVuY3Rpb25zID0gZmV0Y2hGdW5jdGlvbnMoa2V5c3BhY2VOYW1lLCB0eXBlcyk7CisgICAgICAgIFRhYmxlcyB0YWJsZXMgPSBmZXRjaFRhYmxlcyhrZXlzcGFjZU5hbWUsIHR5cGVzLCBmdW5jdGlvbnMpOworICAgICAgICBWaWV3cyB2aWV3cyA9IGZldGNoVmlld3Moa2V5c3BhY2VOYW1lLCB0eXBlcywgZnVuY3Rpb25zKTsKICAgICAgICAgcmV0dXJuIEtleXNwYWNlTWV0YWRhdGEuY3JlYXRlKGtleXNwYWNlTmFtZSwgcGFyYW1zLCB0YWJsZXMsIHZpZXdzLCB0eXBlcywgZnVuY3Rpb25zKTsKICAgICB9CiAKQEAgLTg5Myw3ICs5NzksNyBAQAogICAgICAgICByZXR1cm4gdHlwZXMuYnVpbGQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBUYWJsZXMgZmV0Y2hUYWJsZXMoU3RyaW5nIGtleXNwYWNlTmFtZSwgVHlwZXMgdHlwZXMpCisgICAgcHJpdmF0ZSBzdGF0aWMgVGFibGVzIGZldGNoVGFibGVzKFN0cmluZyBrZXlzcGFjZU5hbWUsIFR5cGVzIHR5cGVzLCBVc2VyRnVuY3Rpb25zIGZ1bmN0aW9ucykKICAgICB7CiAgICAgICAgIFN0cmluZyBxdWVyeSA9IGZvcm1hdCgiU0VMRUNUIHRhYmxlX25hbWUgRlJPTSAlcy4lcyBXSEVSRSBrZXlzcGFjZV9uYW1lID0gPyIsIFNjaGVtYUNvbnN0YW50cy5TQ0hFTUFfS0VZU1BBQ0VfTkFNRSwgVEFCTEVTKTsKIApAQCAtOTAzLDcgKzk4OSw3IEBACiAgICAgICAgICAgICBTdHJpbmcgdGFibGVOYW1lID0gcm93LmdldFN0cmluZygidGFibGVfbmFtZSIpOwogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFibGVzLmFkZChmZXRjaFRhYmxlKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCB0eXBlcykpOworICAgICAgICAgICAgICAgIHRhYmxlcy5hZGQoZmV0Y2hUYWJsZShrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgdHlwZXMsIGZ1bmN0aW9ucykpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKE1pc3NpbmdDb2x1bW5zIGV4YykKICAgICAgICAgICAgIHsKQEAgLTkxOCwxMyArMTAwNCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hQ29uc3RhbnRzLlNDSEVNQV9LRVlTUEFDRV9OQU1FLCBDT0xVTU5TLCBrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5TQ0hFTUFfS0VZU1BBQ0VfTkFNRSwgQ09MVU1OUyk7CiAKLSAgICAgICAgICAgICAgICBpZiAoSUdOT1JFX0NPUlJVUFRFRF9TQ0hFTUFfVEFCTEVTKQorICAgICAgICAgICAgICAgIGlmIChJR05PUkVfQ09SUlVQVEVEX1NDSEVNQV9UQUJMRVNfUFJPUEVSVFlfVkFMVUUpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNc2csICIiLCBleGMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNc2csICJyZXN0YXJ0IGNhc3NhbmRyYSB3aXRoIC1EY2Fzc2FuZHJhLmlnbm9yZV9jb3JydXB0ZWRfc2NoZW1hX3RhYmxlcz10cnVlIGFuZCAiKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTXNnLCAicmVzdGFydCBjYXNzYW5kcmEgd2l0aCAtRHt9PXRydWUgYW5kICIsIElHTk9SRV9DT1JSVVBURURfU0NIRU1BX1RBQkxFUy5nZXRLZXkoKSk7CiAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4YzsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC05MzIsNyArMTAxOCw3IEBACiAgICAgICAgIHJldHVybiB0YWJsZXMuYnVpbGQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBUYWJsZU1ldGFkYXRhIGZldGNoVGFibGUoU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwgVHlwZXMgdHlwZXMpCisgICAgcHJpdmF0ZSBzdGF0aWMgVGFibGVNZXRhZGF0YSBmZXRjaFRhYmxlKFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyB0YWJsZU5hbWUsIFR5cGVzIHR5cGVzLCBVc2VyRnVuY3Rpb25zIGZ1bmN0aW9ucykKICAgICB7CiAgICAgICAgIFN0cmluZyBxdWVyeSA9IFN0cmluZy5mb3JtYXQoIlNFTEVDVCAqIEZST00gJXMuJXMgV0hFUkUga2V5c3BhY2VfbmFtZSA9ID8gQU5EIHRhYmxlX25hbWUgPSA/IiwgU2NoZW1hQ29uc3RhbnRzLlNDSEVNQV9LRVlTUEFDRV9OQU1FLCBUQUJMRVMpOwogICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJvd3MgPSBxdWVyeShxdWVyeSwga2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUpOwpAQCAtOTQ0LDcgKzEwMzAsNyBAQAogICAgICAgICByZXR1cm4gVGFibGVNZXRhZGF0YS5idWlsZGVyKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCBUYWJsZUlkLmZyb21VVUlEKHJvdy5nZXRVVUlEKCJpZCIpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmxhZ3MoZmxhZ3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBhcmFtcyhjcmVhdGVUYWJsZVBhcmFtc0Zyb21Sb3cocm93KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1ucyhmZXRjaENvbHVtbnMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsIHR5cGVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29sdW1ucyhmZXRjaENvbHVtbnMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsIHR5cGVzLCBmdW5jdGlvbnMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kcm9wcGVkQ29sdW1ucyhmZXRjaERyb3BwZWRDb2x1bW5zKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXhlcyhmZXRjaEluZGV4ZXMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50cmlnZ2VycyhmZXRjaFRyaWdnZXJzKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lKSkKQEAgLTk1NCwzMiArMTA0MCw0MSBAQAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgIHN0YXRpYyBUYWJsZVBhcmFtcyBjcmVhdGVUYWJsZVBhcmFtc0Zyb21Sb3coVW50eXBlZFJlc3VsdFNldC5Sb3cgcm93KQogICAgIHsKLSAgICAgICAgcmV0dXJuIFRhYmxlUGFyYW1zLmJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYmxvb21GaWx0ZXJGcENoYW5jZShyb3cuZ2V0RG91YmxlKCJibG9vbV9maWx0ZXJfZnBfY2hhbmNlIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWNoaW5nKENhY2hpbmdQYXJhbXMuZnJvbU1hcChyb3cuZ2V0RnJvemVuVGV4dE1hcCgiY2FjaGluZyIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbW1lbnQocm93LmdldFN0cmluZygiY29tbWVudCIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcGFjdGlvbihDb21wYWN0aW9uUGFyYW1zLmZyb21NYXAocm93LmdldEZyb3plblRleHRNYXAoImNvbXBhY3Rpb24iKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5jb21wcmVzc2lvbihDb21wcmVzc2lvblBhcmFtcy5mcm9tTWFwKHJvdy5nZXRGcm96ZW5UZXh0TWFwKCJjb21wcmVzc2lvbiIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLm1lbXRhYmxlKE1lbXRhYmxlUGFyYW1zLmdldFdpdGhGYWxsYmFjayhyb3cuaGFzKCJtZW10YWJsZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByb3cuZ2V0U3RyaW5nKCJtZW10YWJsZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsKSkgLy8gbWVtdGFibGUgY29sdW1uIHdhcyBpbnRyb2R1Y2VkIGluIDQuMQotICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdFRpbWVUb0xpdmUocm93LmdldEludCgiZGVmYXVsdF90aW1lX3RvX2xpdmUiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4dGVuc2lvbnMocm93LmdldEZyb3plbk1hcCgiZXh0ZW5zaW9ucyIsIFVURjhUeXBlLmluc3RhbmNlLCBCeXRlc1R5cGUuaW5zdGFuY2UpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2NHcmFjZVNlY29uZHMocm93LmdldEludCgiZ2NfZ3JhY2Vfc2Vjb25kcyIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4SW5kZXhJbnRlcnZhbChyb3cuZ2V0SW50KCJtYXhfaW5kZXhfaW50ZXJ2YWwiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLm1lbXRhYmxlRmx1c2hQZXJpb2RJbk1zKHJvdy5nZXRJbnQoIm1lbXRhYmxlX2ZsdXNoX3BlcmlvZF9pbl9tcyIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAubWluSW5kZXhJbnRlcnZhbChyb3cuZ2V0SW50KCJtaW5faW5kZXhfaW50ZXJ2YWwiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyY0NoZWNrQ2hhbmNlKHJvdy5nZXREb3VibGUoImNyY19jaGVja19jaGFuY2UiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLnNwZWN1bGF0aXZlUmV0cnkoU3BlY3VsYXRpdmVSZXRyeVBvbGljeS5mcm9tU3RyaW5nKHJvdy5nZXRTdHJpbmcoInNwZWN1bGF0aXZlX3JldHJ5IikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkaXRpb25hbFdyaXRlUG9saWN5KHJvdy5oYXMoImFkZGl0aW9uYWxfd3JpdGVfcG9saWN5IikgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjdWxhdGl2ZVJldHJ5UG9saWN5LmZyb21TdHJpbmcocm93LmdldFN0cmluZygiYWRkaXRpb25hbF93cml0ZV9wb2xpY3kiKSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjdWxhdGl2ZVJldHJ5UG9saWN5LmZyb21TdHJpbmcoIjk5UEVSQ0VOVElMRSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuY2RjKHJvdy5oYXMoImNkYyIpICYmIHJvdy5nZXRCb29sZWFuKCJjZGMiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlYWRSZXBhaXIoZ2V0UmVhZFJlcGFpclN0cmF0ZWd5KHJvdykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBUYWJsZVBhcmFtcy5CdWlsZGVyIGJ1aWxkZXIgPSBUYWJsZVBhcmFtcy5idWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmxvb21GaWx0ZXJGcENoYW5jZShyb3cuZ2V0RG91YmxlKCJibG9vbV9maWx0ZXJfZnBfY2hhbmNlIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhY2hpbmcoQ2FjaGluZ1BhcmFtcy5mcm9tTWFwKHJvdy5nZXRGcm96ZW5UZXh0TWFwKCJjYWNoaW5nIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb21tZW50KHJvdy5nZXRTdHJpbmcoImNvbW1lbnQiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcGFjdGlvbihDb21wYWN0aW9uUGFyYW1zLmZyb21NYXAocm93LmdldEZyb3plblRleHRNYXAoImNvbXBhY3Rpb24iKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXByZXNzaW9uKENvbXByZXNzaW9uUGFyYW1zLmZyb21NYXAocm93LmdldEZyb3plblRleHRNYXAoImNvbXByZXNzaW9uIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZW10YWJsZShNZW10YWJsZVBhcmFtcy5nZXRXaXRoRmFsbGJhY2socm93LmhhcygibWVtdGFibGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByb3cuZ2V0U3RyaW5nKCJtZW10YWJsZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwpKSAvLyBtZW10YWJsZSBjb2x1bW4gd2FzIGludHJvZHVjZWQgaW4gNC4xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRUaW1lVG9MaXZlKHJvdy5nZXRJbnQoImRlZmF1bHRfdGltZV90b19saXZlIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4dGVuc2lvbnMocm93LmdldEZyb3plbk1hcCgiZXh0ZW5zaW9ucyIsIFVURjhUeXBlLmluc3RhbmNlLCBCeXRlc1R5cGUuaW5zdGFuY2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nY0dyYWNlU2Vjb25kcyhyb3cuZ2V0SW50KCJnY19ncmFjZV9zZWNvbmRzIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heEluZGV4SW50ZXJ2YWwocm93LmdldEludCgibWF4X2luZGV4X2ludGVydmFsIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1lbXRhYmxlRmx1c2hQZXJpb2RJbk1zKHJvdy5nZXRJbnQoIm1lbXRhYmxlX2ZsdXNoX3BlcmlvZF9pbl9tcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taW5JbmRleEludGVydmFsKHJvdy5nZXRJbnQoIm1pbl9pbmRleF9pbnRlcnZhbCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmNDaGVja0NoYW5jZShyb3cuZ2V0RG91YmxlKCJjcmNfY2hlY2tfY2hhbmNlIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNwZWN1bGF0aXZlUmV0cnkoU3BlY3VsYXRpdmVSZXRyeVBvbGljeS5mcm9tU3RyaW5nKHJvdy5nZXRTdHJpbmcoInNwZWN1bGF0aXZlX3JldHJ5IikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRpdGlvbmFsV3JpdGVQb2xpY3kocm93LmhhcygiYWRkaXRpb25hbF93cml0ZV9wb2xpY3kiKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjdWxhdGl2ZVJldHJ5UG9saWN5LmZyb21TdHJpbmcocm93LmdldFN0cmluZygiYWRkaXRpb25hbF93cml0ZV9wb2xpY3kiKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BlY3VsYXRpdmVSZXRyeVBvbGljeS5mcm9tU3RyaW5nKCI5OVBFUkNFTlRJTEUiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2RjKHJvdy5oYXMoImNkYyIpICYmIHJvdy5nZXRCb29sZWFuKCJjZGMiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVhZFJlcGFpcihnZXRSZWFkUmVwYWlyU3RyYXRlZ3kocm93KSk7CisKKyAgICAgICAgLy8gYWxsb3dfYXV0b19zbmFwc2hvdCBjb2x1bW4gd2FzIGludHJvZHVjZWQgaW4gNC4yCisgICAgICAgIGlmIChyb3cuaGFzKCJhbGxvd19hdXRvX3NuYXBzaG90IikpCisgICAgICAgICAgICBidWlsZGVyLmFsbG93QXV0b1NuYXBzaG90KHJvdy5nZXRCb29sZWFuKCJhbGxvd19hdXRvX3NuYXBzaG90IikpOworCisgICAgICAgIC8vIGluY3JlbWVudGFsX2JhY2t1cHMgY29sdW1uIHdhcyBpbnRyb2R1Y2VkIGluIDQuMgorICAgICAgICBpZiAocm93LmhhcygiaW5jcmVtZW50YWxfYmFja3VwcyIpKQorICAgICAgICAgICAgYnVpbGRlci5pbmNyZW1lbnRhbEJhY2t1cHMocm93LmdldEJvb2xlYW4oImluY3JlbWVudGFsX2JhY2t1cHMiKSk7CisKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PENvbHVtbk1ldGFkYXRhPiBmZXRjaENvbHVtbnMoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUsIFR5cGVzIHR5cGVzKQorICAgIHByaXZhdGUgc3RhdGljIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGZldGNoQ29sdW1ucyhTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSwgVHlwZXMgdHlwZXMsIFVzZXJGdW5jdGlvbnMgZnVuY3Rpb25zKQogICAgIHsKICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gZm9ybWF0KCJTRUxFQ1QgKiBGUk9NICVzLiVzIFdIRVJFIGtleXNwYWNlX25hbWUgPSA/IEFORCB0YWJsZV9uYW1lID0gPyIsIFNjaGVtYUNvbnN0YW50cy5TQ0hFTUFfS0VZU1BBQ0VfTkFNRSwgQ09MVU1OUyk7CiAgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgY29sdW1uUm93cyA9IHF1ZXJ5KHF1ZXJ5LCBrZXlzcGFjZSwgdGFibGUpOwpAQCAtOTg3LDcgKzEwODIsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdDb2x1bW5zKCJDb2x1bW5zIG5vdCBmb3VuZCBpbiBzY2hlbWEgdGFibGUgZm9yICIgKyBrZXlzcGFjZSArICcuJyArIHRhYmxlKTsKIAogICAgICAgICBMaXN0PENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGNvbHVtblJvd3MuZm9yRWFjaChyb3cgLT4gY29sdW1ucy5hZGQoY3JlYXRlQ29sdW1uRnJvbVJvdyhyb3csIHR5cGVzKSkpOworICAgICAgICBjb2x1bW5Sb3dzLmZvckVhY2gocm93IC0+IGNvbHVtbnMuYWRkKGNyZWF0ZUNvbHVtbkZyb21Sb3cocm93LCB0eXBlcywgZnVuY3Rpb25zKSkpOwogCiAgICAgICAgIGlmIChjb2x1bW5zLnN0cmVhbSgpLm5vbmVNYXRjaChDb2x1bW5NZXRhZGF0YTo6aXNQYXJ0aXRpb25LZXkpKQogICAgICAgICAgICAgdGhyb3cgbmV3IE1pc3NpbmdDb2x1bW5zKCJObyBwYXJ0aXRpb24ga2V5IGNvbHVtbnMgZm91bmQgaW4gc2NoZW1hIHRhYmxlIGZvciAiICsga2V5c3BhY2UgKyAiLiIgKyB0YWJsZSk7CkBAIC05OTYsNyArMTA5MSw3IEBACiAgICAgfQogCiAgICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIENvbHVtbk1ldGFkYXRhIGNyZWF0ZUNvbHVtbkZyb21Sb3coVW50eXBlZFJlc3VsdFNldC5Sb3cgcm93LCBUeXBlcyB0eXBlcykKKyAgICBwdWJsaWMgc3RhdGljIENvbHVtbk1ldGFkYXRhIGNyZWF0ZUNvbHVtbkZyb21Sb3coVW50eXBlZFJlc3VsdFNldC5Sb3cgcm93LCBUeXBlcyB0eXBlcywgVXNlckZ1bmN0aW9ucyBmdW5jdGlvbnMpCiAgICAgewogICAgICAgICBTdHJpbmcga2V5c3BhY2UgPSByb3cuZ2V0U3RyaW5nKCJrZXlzcGFjZV9uYW1lIik7CiAgICAgICAgIFN0cmluZyB0YWJsZSA9IHJvdy5nZXRTdHJpbmcoInRhYmxlX25hbWUiKTsKQEAgLTEwMTIsNyArMTEwNyw1MyBAQAogCiAgICAgICAgIENvbHVtbklkZW50aWZpZXIgbmFtZSA9IG5ldyBDb2x1bW5JZGVudGlmaWVyKHJvdy5nZXRCeXRlcygiY29sdW1uX25hbWVfYnl0ZXMiKSwgcm93LmdldFN0cmluZygiY29sdW1uX25hbWUiKSk7CiAKLSAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGFibGUsIG5hbWUsIHR5cGUsIHBvc2l0aW9uLCBraW5kKTsKKyAgICAgICAgQ29sdW1uTWFzayBtYXNrID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gZm9ybWF0KCJTRUxFQ1QgKiBGUk9NICVzLiVzIFdIRVJFIGtleXNwYWNlX25hbWUgPSA/IEFORCB0YWJsZV9uYW1lID0gPyBBTkQgY29sdW1uX25hbWUgPSA/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUNvbnN0YW50cy5TQ0hFTUFfS0VZU1BBQ0VfTkFNRSwgQ09MVU1OX01BU0tTKTsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBjb2x1bW5NYXNrcyA9IHF1ZXJ5KHF1ZXJ5LCBrZXlzcGFjZSwgdGFibGUsIG5hbWUudG9TdHJpbmcoKSk7CisgICAgICAgIGlmICghY29sdW1uTWFza3MuaXNFbXB0eSgpKQorICAgICAgICB7CisgICAgICAgICAgICBVbnR5cGVkUmVzdWx0U2V0LlJvdyBtYXNrUm93ID0gY29sdW1uTWFza3Mub25lKCk7CisgICAgICAgICAgICBGdW5jdGlvbk5hbWUgZnVuY3Rpb25OYW1lID0gbmV3IEZ1bmN0aW9uTmFtZShtYXNrUm93LmdldFN0cmluZygiZnVuY3Rpb25fa2V5c3BhY2UiKSwgbWFza1Jvdy5nZXRTdHJpbmcoImZ1bmN0aW9uX25hbWUiKSk7CisKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwYXJ0aWFsQXJndW1lbnRUeXBlcyA9IG1hc2tSb3cuZ2V0RnJvemVuTGlzdCgiZnVuY3Rpb25fYXJndW1lbnRfdHlwZXMiLCBVVEY4VHlwZS5pbnN0YW5jZSk7CisgICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJndW1lbnRUeXBlcyA9IG5ldyBBcnJheUxpc3Q8PigxICsgcGFydGlhbEFyZ3VtZW50VHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFyZ3VtZW50VHlwZXMuYWRkKHR5cGUpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgYXJndW1lbnRUeXBlIDogcGFydGlhbEFyZ3VtZW50VHlwZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXJndW1lbnRUeXBlcy5hZGQoQ1FMVHlwZVBhcnNlci5wYXJzZShrZXlzcGFjZSwgYXJndW1lbnRUeXBlLCB0eXBlcykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGdW5jdGlvbiBmdW5jdGlvbiA9IEZ1bmN0aW9uUmVzb2x2ZXIuZ2V0KGtleXNwYWNlLCBmdW5jdGlvbk5hbWUsIGFyZ3VtZW50VHlwZXMsIG51bGwsIG51bGwsIG51bGwsIGZ1bmN0aW9ucyk7CisgICAgICAgICAgICBpZiAoZnVuY3Rpb24gPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZm9ybWF0KCJVbmFibGUgdG8gZmluZCBtYXNraW5nIGZ1bmN0aW9uICVzKCVzKSBmb3IgY29sdW1uICVzLiVzLiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSwgYXJndW1lbnRUeXBlcywga2V5c3BhY2UsIHRhYmxlLCBuYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghKGZ1bmN0aW9uIGluc3RhbmNlb2YgU2NhbGFyRnVuY3Rpb24pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihmb3JtYXQoIkNvbHVtbiAlcy4lcy4lcyBpcyB1bmV4cGVjdGVkbHkgbWFza2VkIHdpdGggZnVuY3Rpb24gJXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggaXMgbm90IGEgc2NhbGFyIG1hc2tpbmcgZnVuY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5c3BhY2UsIHRhYmxlLCBuYW1lLCBmdW5jdGlvbikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTb21lIGFyZ3VtZW50cyBvZiB0aGUgbWFza2luZyBmdW5jdGlvbiBjYW4gYmUgbnVsbCwgYnV0IHRoZSBDUUwncyBsaXN0IHR5cGUgdGhhdCBzdG9yZXMgdGhlbSBkb2Vzbid0CisgICAgICAgICAgICAvLyBhY2NlcHQgbnVsbHMsIHNvIHdlIHVzZSBhIHBhcmFsbGVsIGxpc3Qgb2YgYm9vbGVhbnMgdG8gc3RvcmUgd2hhdCBhcmd1bWVudHMgYXJlIG51bGwuCisgICAgICAgICAgICBMaXN0PEJvb2xlYW4+IG51bGxzID0gbWFza1Jvdy5nZXRGcm96ZW5MaXN0KCJmdW5jdGlvbl9hcmd1bWVudF9udWxscyIsIEJvb2xlYW5UeXBlLmluc3RhbmNlKTsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXNBc0NRTCA9IG1hc2tSb3cuZ2V0RnJvemVuTGlzdCgiZnVuY3Rpb25fYXJndW1lbnRfdmFsdWVzIiwgVVRGOFR5cGUuaW5zdGFuY2UpOworICAgICAgICAgICAgQnl0ZUJ1ZmZlcltdIHZhbHVlcyA9IG5ldyBCeXRlQnVmZmVyW3ZhbHVlc0FzQ1FMLnNpemUoKV07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlc0FzQ1FMLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChudWxscy5nZXQoaSkpCisgICAgICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IG51bGw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBhcmd1bWVudFR5cGVzLmdldChpICsgMSkuZnJvbVN0cmluZyh2YWx1ZXNBc0NRTC5nZXQoaSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYXNrID0gQ29sdW1uTWFzay5idWlsZCgoU2NhbGFyRnVuY3Rpb24pIGZ1bmN0aW9uLCB2YWx1ZXMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGFibGUsIG5hbWUsIHR5cGUsIHBvc2l0aW9uLCBraW5kLCBtYXNrKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBNYXA8Qnl0ZUJ1ZmZlciwgRHJvcHBlZENvbHVtbj4gZmV0Y2hEcm9wcGVkQ29sdW1ucyhTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSkKQEAgLTEwNDQsNyArMTE4NSw3IEBACiAgICAgICAgIGFzc2VydCBraW5kID09IENvbHVtbk1ldGFkYXRhLktpbmQuUkVHVUxBUiB8fCBraW5kID09IENvbHVtbk1ldGFkYXRhLktpbmQuU1RBVElDCiAgICAgICAgICAgICA6ICJVbmV4cGVjdGVkIGRyb3BwZWQgY29sdW1uIGtpbmQ6ICIgKyBraW5kOwogCi0gICAgICAgIENvbHVtbk1ldGFkYXRhIGNvbHVtbiA9IG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGFibGUsIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgdHJ1ZSksIHR5cGUsIENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLCBraW5kKTsKKyAgICAgICAgQ29sdW1uTWV0YWRhdGEgY29sdW1uID0gbmV3IENvbHVtbk1ldGFkYXRhKGtleXNwYWNlLCB0YWJsZSwgQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZChuYW1lLCB0cnVlKSwgdHlwZSwgQ29sdW1uTWV0YWRhdGEuTk9fUE9TSVRJT04sIGtpbmQsIG51bGwpOwogICAgICAgICBsb25nIGRyb3BwZWRUaW1lID0gVGltZVVuaXQuTUlMTElTRUNPTkRTLnRvTWljcm9zKHJvdy5nZXRMb25nKCJkcm9wcGVkX3RpbWUiKSk7CiAgICAgICAgIHJldHVybiBuZXcgRHJvcHBlZENvbHVtbihjb2x1bW4sIGRyb3BwZWRUaW1lKTsKICAgICB9CkBAIC0xMDgwLDE3ICsxMjIxLDE3IEBACiAgICAgICAgIHJldHVybiBuZXcgVHJpZ2dlck1ldGFkYXRhKG5hbWUsIGNsYXNzT3B0aW9uKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBWaWV3cyBmZXRjaFZpZXdzKFN0cmluZyBrZXlzcGFjZU5hbWUsIFR5cGVzIHR5cGVzKQorICAgIHByaXZhdGUgc3RhdGljIFZpZXdzIGZldGNoVmlld3MoU3RyaW5nIGtleXNwYWNlTmFtZSwgVHlwZXMgdHlwZXMsIFVzZXJGdW5jdGlvbnMgZnVuY3Rpb25zKQogICAgIHsKICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gZm9ybWF0KCJTRUxFQ1Qgdmlld19uYW1lIEZST00gJXMuJXMgV0hFUkUga2V5c3BhY2VfbmFtZSA9ID8iLCBTY2hlbWFDb25zdGFudHMuU0NIRU1BX0tFWVNQQUNFX05BTUUsIFZJRVdTKTsKIAogICAgICAgICBWaWV3cy5CdWlsZGVyIHZpZXdzID0gb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlZpZXdzLmJ1aWxkZXIoKTsKICAgICAgICAgZm9yIChVbnR5cGVkUmVzdWx0U2V0LlJvdyByb3cgOiBxdWVyeShxdWVyeSwga2V5c3BhY2VOYW1lKSkKLSAgICAgICAgICAgIHZpZXdzLnB1dChmZXRjaFZpZXcoa2V5c3BhY2VOYW1lLCByb3cuZ2V0U3RyaW5nKCJ2aWV3X25hbWUiKSwgdHlwZXMpKTsKKyAgICAgICAgICAgIHZpZXdzLnB1dChmZXRjaFZpZXcoa2V5c3BhY2VOYW1lLCByb3cuZ2V0U3RyaW5nKCJ2aWV3X25hbWUiKSwgdHlwZXMsIGZ1bmN0aW9ucykpOwogICAgICAgICByZXR1cm4gdmlld3MuYnVpbGQoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBWaWV3TWV0YWRhdGEgZmV0Y2hWaWV3KFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyB2aWV3TmFtZSwgVHlwZXMgdHlwZXMpCisgICAgcHJpdmF0ZSBzdGF0aWMgVmlld01ldGFkYXRhIGZldGNoVmlldyhTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcgdmlld05hbWUsIFR5cGVzIHR5cGVzLCBVc2VyRnVuY3Rpb25zIGZ1bmN0aW9ucykKICAgICB7CiAgICAgICAgIFN0cmluZyBxdWVyeSA9IFN0cmluZy5mb3JtYXQoIlNFTEVDVCAqIEZST00gJXMuJXMgV0hFUkUga2V5c3BhY2VfbmFtZSA9ID8gQU5EIHZpZXdfbmFtZSA9ID8iLCBTY2hlbWFDb25zdGFudHMuU0NIRU1BX0tFWVNQQUNFX05BTUUsIFZJRVdTKTsKICAgICAgICAgVW50eXBlZFJlc3VsdFNldCByb3dzID0gcXVlcnkocXVlcnksIGtleXNwYWNlTmFtZSwgdmlld05hbWUpOwpAQCAtMTEwMyw3ICsxMjQ0LDcgQEAKICAgICAgICAgYm9vbGVhbiBpbmNsdWRlQWxsID0gcm93LmdldEJvb2xlYW4oImluY2x1ZGVfYWxsX2NvbHVtbnMiKTsKICAgICAgICAgU3RyaW5nIHdoZXJlQ2xhdXNlU3RyaW5nID0gcm93LmdldFN0cmluZygid2hlcmVfY2xhdXNlIik7CiAKLSAgICAgICAgTGlzdDxDb2x1bW5NZXRhZGF0YT4gY29sdW1ucyA9IGZldGNoQ29sdW1ucyhrZXlzcGFjZU5hbWUsIHZpZXdOYW1lLCB0eXBlcyk7CisgICAgICAgIExpc3Q8Q29sdW1uTWV0YWRhdGE+IGNvbHVtbnMgPSBmZXRjaENvbHVtbnMoa2V5c3BhY2VOYW1lLCB2aWV3TmFtZSwgdHlwZXMsIGZ1bmN0aW9ucyk7CiAKICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9CiAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhLmJ1aWxkZXIoa2V5c3BhY2VOYW1lLCB2aWV3TmFtZSwgVGFibGVJZC5mcm9tVVVJRChyb3cuZ2V0VVVJRCgiaWQiKSkpCkBAIC0xMTI3LDEyICsxMjY4LDEyIEBACiAgICAgICAgIHJldHVybiBuZXcgVmlld01ldGFkYXRhKGJhc2VUYWJsZUlkLCBiYXNlVGFibGVOYW1lLCBpbmNsdWRlQWxsLCB3aGVyZUNsYXVzZSwgbWV0YWRhdGEpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIEZ1bmN0aW9ucyBmZXRjaEZ1bmN0aW9ucyhTdHJpbmcga2V5c3BhY2VOYW1lLCBUeXBlcyB0eXBlcykKKyAgICBwcml2YXRlIHN0YXRpYyBVc2VyRnVuY3Rpb25zIGZldGNoRnVuY3Rpb25zKFN0cmluZyBrZXlzcGFjZU5hbWUsIFR5cGVzIHR5cGVzKQogICAgIHsKICAgICAgICAgQ29sbGVjdGlvbjxVREZ1bmN0aW9uPiB1ZGZzID0gZmV0Y2hVREZzKGtleXNwYWNlTmFtZSwgdHlwZXMpOwogICAgICAgICBDb2xsZWN0aW9uPFVEQWdncmVnYXRlPiB1ZGFzID0gZmV0Y2hVREFzKGtleXNwYWNlTmFtZSwgdWRmcywgdHlwZXMpOwogCi0gICAgICAgIHJldHVybiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuRnVuY3Rpb25zLmJ1aWxkZXIoKS5hZGQodWRmcykuYWRkKHVkYXMpLmJ1aWxkKCk7CisgICAgICAgIHJldHVybiBVc2VyRnVuY3Rpb25zLmJ1aWxkZXIoKS5hZGQodWRmcykuYWRkKHVkYXMpLmJ1aWxkKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxVREZ1bmN0aW9uPiBmZXRjaFVERnMoU3RyaW5nIGtleXNwYWNlTmFtZSwgVHlwZXMgdHlwZXMpCkBAIC0xMTY5LDcgKzEzMTAsNyBAQAogICAgICAgICAgKiBUT0RPOiBmaW5kIGEgd2F5IHRvIGdldCByaWQgb2YgU2NoZW1hLmluc3RhbmNlIGRlcGVuZGVuY3k7IGV2YWx1YXRlIGlmIHRoZSBvcGltaXNhdGlvbiBiZWxvdyBtYWtlcyBhIGRpZmZlcmVuY2UKICAgICAgICAgICogaW4gdGhlIGZpcnN0IHBsYWNlLiBSZW1vdmUgaWYgaXQgaXNuJ3QuCiAgICAgICAgICAqLwotICAgICAgICBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbiBleGlzdGluZyA9IFNjaGVtYS5pbnN0YW5jZS5maW5kRnVuY3Rpb24obmFtZSwgYXJnVHlwZXMpLm9yRWxzZShudWxsKTsKKyAgICAgICAgVXNlckZ1bmN0aW9uIGV4aXN0aW5nID0gU2NoZW1hLmluc3RhbmNlLmZpbmRVc2VyRnVuY3Rpb24obmFtZSwgYXJnVHlwZXMpLm9yRWxzZShudWxsKTsKICAgICAgICAgaWYgKGV4aXN0aW5nIGluc3RhbmNlb2YgVURGdW5jdGlvbikKICAgICAgICAgewogICAgICAgICAgICAgLy8gVGhpcyBjaGVjayBwcmV2ZW50cyBkdXBsaWNhdGUgY29tcGlsYXRpb24gb2YgZWZmZWN0aXZlbHkgdGhlIHNhbWUgVURGLgpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUtleXNwYWNlVGFibGVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hS2V5c3BhY2VUYWJsZXMuamF2YQppbmRleCBjMDBhNGY3Li4zZmM5YzhiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hS2V5c3BhY2VUYWJsZXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hS2V5c3BhY2VUYWJsZXMuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFUyA9ICJrZXlzcGFjZXMiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFUyA9ICJ0YWJsZXMiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTlMgPSAiY29sdW1ucyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX01BU0tTID0gImNvbHVtbl9tYXNrcyI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUFBFRF9DT0xVTU5TID0gImRyb3BwZWRfY29sdW1ucyI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJJR0dFUlMgPSAidHJpZ2dlcnMiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJRVdTID0gInZpZXdzIjsKQEAgLTQ1LDcgKzQ2LDggQEAKICAgICAgKgogICAgICAqIFNlZSBDQVNTQU5EUkEtMTIyMTMgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEltbXV0YWJsZUxpc3Q8U3RyaW5nPiBBTEwgPSBJbW11dGFibGVMaXN0Lm9mKENPTFVNTlMsCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbW11dGFibGVMaXN0PFN0cmluZz4gQUxMID0gSW1tdXRhYmxlTGlzdC5vZihDT0xVTU5fTUFTS1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU5TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPUFBFRF9DT0xVTU5TLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJJR0dFUlMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFUywKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWFVcGRhdGVIYW5kbGVyRmFjdG9yeVByb3ZpZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hVXBkYXRlSGFuZGxlckZhY3RvcnlQcm92aWRlci5qYXZhCmluZGV4IDk0MTFhOTIuLjYzZDE3MGEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWFVcGRhdGVIYW5kbGVyRmFjdG9yeVByb3ZpZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYVVwZGF0ZUhhbmRsZXJGYWN0b3J5UHJvdmlkZXIuamF2YQpAQCAtMjUsMTIgKzI1LDE3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU0NIRU1BX1VQREFURV9IQU5ETEVSX0ZBQ1RPUllfQ0xBU1M7CisKIC8qKgotICogUHJvdmlkZXMgdGhlIGluc3RhbmNlIG9mIFNjaGVtYVVwZGF0ZUhhbmRsZXIgZmFjdG9yeSBwb2ludGVkIGJ5IHtAbGluayAjU1VIX0ZBQ1RPUllfQ0xBU1NfUFJPUEVSVFl9IHN5c3RlbSBwcm9wZXJ0eS4KKyAqIFByb3ZpZGVzIHRoZSBpbnN0YW5jZSBvZiBTY2hlbWFVcGRhdGVIYW5kbGVyIGZhY3RvcnkgcG9pbnRlZCBieQorICoge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMjU0NIRU1BX1VQREFURV9IQU5ETEVSX0ZBQ1RPUllfQ0xBU1N9IHN5c3RlbSBwcm9wZXJ0eS4KICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZCwgdGhlIGRlZmF1bHQgZmFjdG9yeSB7QGxpbmsgRGVmYXVsdFNjaGVtYVVwZGF0ZUhhbmRsZXJ9IGluc3RhbmNlIGlzIHJldHVybmVkLgogICovCiBwdWJsaWMgY2xhc3MgU2NoZW1hVXBkYXRlSGFuZGxlckZhY3RvcnlQcm92aWRlciBpbXBsZW1lbnRzIFByb3ZpZGVyPFNjaGVtYVVwZGF0ZUhhbmRsZXJGYWN0b3J5PgogeworICAgIC8qKiBAZGVwcmVjYXRlZCBVc2UgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNDSEVNQV9VUERBVEVfSEFORExFUl9GQUNUT1JZX0NMQVNTIGluc3RlYWQuICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUhfRkFDVE9SWV9DTEFTU19QUk9QRVJUWSA9ICJjYXNzYW5kcmEuc2NoZW1hLnVwZGF0ZV9oYW5kbGVyX2ZhY3RvcnkuY2xhc3MiOwogCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTY2hlbWFVcGRhdGVIYW5kbGVyRmFjdG9yeVByb3ZpZGVyIGluc3RhbmNlID0gbmV3IFNjaGVtYVVwZGF0ZUhhbmRsZXJGYWN0b3J5UHJvdmlkZXIoKTsKQEAgLTM4LDcgKzQzLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU2NoZW1hVXBkYXRlSGFuZGxlckZhY3RvcnkgZ2V0KCkKICAgICB7Ci0gICAgICAgIFN0cmluZyBzdWhGYWN0b3J5Q2xhc3NOYW1lID0gU3RyaW5nVXRpbHMudHJpbVRvTnVsbChTeXN0ZW0uZ2V0UHJvcGVydHkoU1VIX0ZBQ1RPUllfQ0xBU1NfUFJPUEVSVFkpKTsKKyAgICAgICAgU3RyaW5nIHN1aEZhY3RvcnlDbGFzc05hbWUgPSBTdHJpbmdVdGlscy50cmltVG9OdWxsKFNDSEVNQV9VUERBVEVfSEFORExFUl9GQUNUT1JZX0NMQVNTLmdldFN0cmluZygpKTsKICAgICAgICAgaWYgKHN1aEZhY3RvcnlDbGFzc05hbWUgPT0gbnVsbCkKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRTY2hlbWFVcGRhdGVIYW5kbGVyRmFjdG9yeS5pbnN0YW5jZTsKQEAgLTUzLDcgKzU4LDcgQEAKICAgICAgICAgICAgIGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBzY2hlbWEgdXBkYXRlIGhhbmRsZXIgZmFjdG9yeSBjbGFzcyAlcyBkZWZpbmVkIGluICVzIHN5c3RlbSBwcm9wZXJ0eS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VoRmFjdG9yeUNsYXNzTmFtZSwgU1VIX0ZBQ1RPUllfQ0xBU1NfUFJPUEVSVFkpLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWhGYWN0b3J5Q2xhc3NOYW1lLCBTQ0hFTUFfVVBEQVRFX0hBTkRMRVJfRkFDVE9SWV9DTEFTUy5nZXRLZXkoKSksIGV4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TeXN0ZW1EaXN0cmlidXRlZEtleXNwYWNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU3lzdGVtRGlzdHJpYnV0ZWRLZXlzcGFjZS5qYXZhCmluZGV4IGRjNDAwOTMuLmMxMWIyYzQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TeXN0ZW1EaXN0cmlidXRlZEtleXNwYWNlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1N5c3RlbURpc3RyaWJ1dGVkS2V5c3BhY2UuamF2YQpAQCAtMTc0LDcgKzE3NCw3IEBACiAgICAgewogICAgICAgICBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gcmFuZ2VzID0gb3B0aW9ucy5nZXRSYW5nZXMoKTsKICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gIklOU0VSVCBJTlRPICVzLiVzIChwYXJlbnRfaWQsIGtleXNwYWNlX25hbWUsIGNvbHVtbmZhbWlseV9uYW1lcywgcmVxdWVzdGVkX3Jhbmdlcywgc3RhcnRlZF9hdCwgICAgICAgICAgb3B0aW9ucykiKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBWQUxVRVMgKCVzLCAgICAgICAgJyVzJywgICAgICAgICAgeyAnJXMnIH0sICAgICAgICAgICB7ICclcycgfSwgICAgICAgICAgdG9UaW1lc3RhbXAobm93KCkpLCB7ICVzIH0pIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVkFMVUVTICglcywgICAgICAgICclcycsICAgICAgICAgIHsgJyVzJyB9LCAgICAgICAgICAgeyAnJXMnIH0sICAgICAgICAgIHRvX3RpbWVzdGFtcChub3coKSksIHsgJXMgfSkiOwogICAgICAgICBTdHJpbmcgZm10UXJ5ID0gZm9ybWF0KHF1ZXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuRElTVFJJQlVURURfS0VZU1BBQ0VfTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSRU5UX1JFUEFJUl9ISVNUT1JZLApAQCAtMjA2LDcgKzIwNiw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZmFpbFBhcmVudFJlcGFpcihUaW1lVVVJRCBwYXJlbnRfaWQsIFRocm93YWJsZSB0KQogICAgIHsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gIlVQREFURSAlcy4lcyBTRVQgZmluaXNoZWRfYXQgPSB0b1RpbWVzdGFtcChub3coKSksIGV4Y2VwdGlvbl9tZXNzYWdlPT8sIGV4Y2VwdGlvbl9zdGFja3RyYWNlPT8gV0hFUkUgcGFyZW50X2lkPSVzIjsKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gIlVQREFURSAlcy4lcyBTRVQgZmluaXNoZWRfYXQgPSB0b190aW1lc3RhbXAobm93KCkpLCBleGNlcHRpb25fbWVzc2FnZT0/LCBleGNlcHRpb25fc3RhY2t0cmFjZT0/IFdIRVJFIHBhcmVudF9pZD0lcyI7CiAKICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwogICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7CkBAIC0yMTgsNyArMjE4LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdWNjZXNzZnVsUGFyZW50UmVwYWlyKFRpbWVVVUlEIHBhcmVudF9pZCwgQ29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+IHN1Y2Nlc3NmdWxSYW5nZXMpCiAgICAgewotICAgICAgICBTdHJpbmcgcXVlcnkgPSAiVVBEQVRFICVzLiVzIFNFVCBmaW5pc2hlZF9hdCA9IHRvVGltZXN0YW1wKG5vdygpKSwgc3VjY2Vzc2Z1bF9yYW5nZXMgPSB7JyVzJ30gV0hFUkUgcGFyZW50X2lkPSVzIjsKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gIlVQREFURSAlcy4lcyBTRVQgZmluaXNoZWRfYXQgPSB0b190aW1lc3RhbXAobm93KCkpLCBzdWNjZXNzZnVsX3JhbmdlcyA9IHsnJXMnfSBXSEVSRSBwYXJlbnRfaWQ9JXMiOwogICAgICAgICBTdHJpbmcgZm10UXVlcnkgPSBmb3JtYXQocXVlcnksIFNjaGVtYUNvbnN0YW50cy5ESVNUUklCVVRFRF9LRVlTUEFDRV9OQU1FLCBQQVJFTlRfUkVQQUlSX0hJU1RPUlksIEpvaW5lci5vbigiJywnIikuam9pbihzdWNjZXNzZnVsUmFuZ2VzKSwgcGFyZW50X2lkLnRvU3RyaW5nKCkpOwogICAgICAgICBwcm9jZXNzU2lsZW50KGZtdFF1ZXJ5KTsKICAgICB9CkBAIC0yNDEsMTAgKzI0MSwxMCBAQAogCiAgICAgICAgIFN0cmluZyBxdWVyeSA9CiAgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzLiVzIChrZXlzcGFjZV9uYW1lLCBjb2x1bW5mYW1pbHlfbmFtZSwgaWQsIHBhcmVudF9pZCwgcmFuZ2VfYmVnaW4sIHJhbmdlX2VuZCwgY29vcmRpbmF0b3IsIGNvb3JkaW5hdG9yX3BvcnQsIHBhcnRpY2lwYW50cywgcGFydGljaXBhbnRzX3YyLCBzdGF0dXMsIHN0YXJ0ZWRfYXQpICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlZBTFVFUyAoICAgJyVzJywgICAgICAgICAgJyVzJywgICAgICAgICAgICAgICVzLCAlcywgICAgICAgICclcycsICAgICAgICAnJXMnLCAgICAgICclcycsICAgICAgICAlZCwgICAgICAgICAgICAgICB7ICclcycgfSwgICAgIHsgJyVzJyB9LCAgICAgICAgJyVzJywgICB0b1RpbWVzdGFtcChub3coKSkpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICJWQUxVRVMgKCAgICclcycsICAgICAgICAgICclcycsICAgICAgICAgICAgICAlcywgJXMsICAgICAgICAnJXMnLCAgICAgICAgJyVzJywgICAgICAnJXMnLCAgICAgICAgJWQsICAgICAgICAgICAgICAgeyAnJXMnIH0sICAgICB7ICclcycgfSwgICAgICAgICclcycsICAgdG9fdGltZXN0YW1wKG5vdygpKSkiOwogICAgICAgICBTdHJpbmcgcXVlcnlXaXRob3V0TmV3Q29sdW1ucyA9CiAgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzLiVzIChrZXlzcGFjZV9uYW1lLCBjb2x1bW5mYW1pbHlfbmFtZSwgaWQsIHBhcmVudF9pZCwgcmFuZ2VfYmVnaW4sIHJhbmdlX2VuZCwgY29vcmRpbmF0b3IsIHBhcnRpY2lwYW50cywgc3RhdHVzLCBzdGFydGVkX2F0KSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJWQUxVRVMgKCAgICclcycsICAgICAgICAgICclcycsICAgICAgICAgICAgICAlcywgJXMsICAgICAgICAnJXMnLCAgICAgICAgJyVzJywgICAgICAnJXMnLCAgICAgICAgICAgICAgIHsgJyVzJyB9LCAgICAgICAgJyVzJywgICB0b1RpbWVzdGFtcChub3coKSkpIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICJWQUxVRVMgKCAgICclcycsICAgICAgICAgICclcycsICAgICAgICAgICAgICAlcywgJXMsICAgICAgICAnJXMnLCAgICAgICAgJyVzJywgICAgICAnJXMnLCAgICAgICAgICAgICAgIHsgJyVzJyB9LCAgICAgICAgJyVzJywgICB0b190aW1lc3RhbXAobm93KCkpKSI7CiAKICAgICAgICAgZm9yIChTdHJpbmcgY2ZuYW1lIDogY2ZuYW1lcykKICAgICAgICAgewpAQCAtMjkyLDcgKzI5Miw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3VjY2Vzc2Z1bFJlcGFpckpvYihUaW1lVVVJRCBpZCwgU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nIGNmbmFtZSkKICAgICB7Ci0gICAgICAgIFN0cmluZyBxdWVyeSA9ICJVUERBVEUgJXMuJXMgU0VUIHN0YXR1cyA9ICclcycsIGZpbmlzaGVkX2F0ID0gdG9UaW1lc3RhbXAobm93KCkpIFdIRVJFIGtleXNwYWNlX25hbWUgPSAnJXMnIEFORCBjb2x1bW5mYW1pbHlfbmFtZSA9ICclcycgQU5EIGlkID0gJXMiOworICAgICAgICBTdHJpbmcgcXVlcnkgPSAiVVBEQVRFICVzLiVzIFNFVCBzdGF0dXMgPSAnJXMnLCBmaW5pc2hlZF9hdCA9IHRvX3RpbWVzdGFtcChub3coKSkgV0hFUkUga2V5c3BhY2VfbmFtZSA9ICclcycgQU5EIGNvbHVtbmZhbWlseV9uYW1lID0gJyVzJyBBTkQgaWQgPSAlcyI7CiAgICAgICAgIFN0cmluZyBmbXRRdWVyeSA9IGZvcm1hdChxdWVyeSwgU2NoZW1hQ29uc3RhbnRzLkRJU1RSSUJVVEVEX0tFWVNQQUNFX05BTUUsIFJFUEFJUl9ISVNUT1JZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGFpclN0YXRlLlNVQ0NFU1MudG9TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzcGFjZU5hbWUsCkBAIC0zMDMsNyArMzAzLDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmYWlsZWRSZXBhaXJKb2IoVGltZVVVSUQgaWQsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyBjZm5hbWUsIFRocm93YWJsZSB0KQogICAgIHsKLSAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gIlVQREFURSAlcy4lcyBTRVQgc3RhdHVzID0gJyVzJywgZmluaXNoZWRfYXQgPSB0b1RpbWVzdGFtcChub3coKSksIGV4Y2VwdGlvbl9tZXNzYWdlPT8sIGV4Y2VwdGlvbl9zdGFja3RyYWNlPT8gV0hFUkUga2V5c3BhY2VfbmFtZSA9ICclcycgQU5EIGNvbHVtbmZhbWlseV9uYW1lID0gJyVzJyBBTkQgaWQgPSAlcyI7CisgICAgICAgIFN0cmluZyBxdWVyeSA9ICJVUERBVEUgJXMuJXMgU0VUIHN0YXR1cyA9ICclcycsIGZpbmlzaGVkX2F0ID0gdG9fdGltZXN0YW1wKG5vdygpKSwgZXhjZXB0aW9uX21lc3NhZ2U9PywgZXhjZXB0aW9uX3N0YWNrdHJhY2U9PyBXSEVSRSBrZXlzcGFjZV9uYW1lID0gJyVzJyBBTkQgY29sdW1uZmFtaWx5X25hbWUgPSAnJXMnIEFORCBpZCA9ICVzIjsKICAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwogICAgICAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihzdyk7CiAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKHB3KTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9UYWJsZUlkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvVGFibGVJZC5qYXZhCmluZGV4IGZkNDdhNDcuLmNlZWVlYzMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9UYWJsZUlkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1RhYmxlSWQuamF2YQpAQCAtMjAsMTEgKzIwLDE1IEBACiBpbXBvcnQgamF2YS5pby5EYXRhSW5wdXQ7CiBpbXBvcnQgamF2YS5pby5EYXRhT3V0cHV0OwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAoraW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7CisKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuQXJyYXlVdGlsczsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKIApAQCAtNjIsNiArNjYsMjcgQEAKICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUlkKFVVSUQuZnJvbVN0cmluZyhpZFN0cmluZykpOwogICAgIH0KIAorICAgIEBOdWxsYWJsZQorICAgIHB1YmxpYyBzdGF0aWMgUGFpcjxTdHJpbmcsIFRhYmxlSWQ+IHRhYmxlTmFtZUFuZElkRnJvbUZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSkKKyAgICB7CisgICAgICAgIGludCBkYXNoID0gZmlsZW5hbWUubGFzdEluZGV4T2YoJy0nKTsKKyAgICAgICAgaWYgKGRhc2ggPD0gMCB8fCBkYXNoICE9IGZpbGVuYW1lLmxlbmd0aCgpIC0gMzIgLSAxKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgVGFibGVJZCBpZCA9IGZyb21IZXhTdHJpbmcoZmlsZW5hbWUuc3Vic3RyaW5nKGRhc2ggKyAxKSk7CisgICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZGFzaCk7CisKKyAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKHRhYmxlTmFtZSwgaWQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFRhYmxlSWQgZnJvbUhleFN0cmluZyhTdHJpbmcgbm9uRGFzaFVVSUQpCisgICAgeworICAgICAgICBCeXRlQnVmZmVyIGJ5dGVzID0gQnl0ZUJ1ZmZlclV0aWwuaGV4VG9CeXRlcyhub25EYXNoVVVJRCk7CisgICAgICAgIGxvbmcgbXNiID0gYnl0ZXMuZ2V0TG9uZygwKTsKKyAgICAgICAgbG9uZyBsc2IgPSBieXRlcy5nZXRMb25nKDgpOworICAgICAgICByZXR1cm4gZnJvbVVVSUQobmV3IFVVSUQobXNiLCBsc2IpKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDcmVhdGVzIHRoZSBVVUlEIG9mIGEgc3lzdGVtIHRhYmxlLgogICAgICAqCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvVGFibGVNZXRhZGF0YS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1RhYmxlTWV0YWRhdGEuamF2YQppbmRleCAyZTlkNTA3Li41M2EyMmFiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvVGFibGVNZXRhZGF0YS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9UYWJsZU1ldGFkYXRhLmphdmEKQEAgLTE4LDE0ICsxOCwyNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWE7CiAKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Nb3JlT2JqZWN0czsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lio7Ci0KK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUNvbGxlY3Rpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC0zNCw4ICs0NywyMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29sdW1uSWRlbnRpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNxbEJ1aWxkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5TY2hlbWFFbGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmcuQ29sdW1uTWFzazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdDb21wYXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVndWxhckFuZFN0YXRpY0NvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlc1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Db21wb3NpdGVUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuRW1wdHlUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Vc2VyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwpAQCAtMjYzLDYgKzI4OCwxMSBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luY3JlbWVudGFsQmFja3Vwc0VuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtcy5pbmNyZW1lbnRhbEJhY2t1cHM7CisgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWNDb21wYWN0VGFibGUoKQogICAgIHsKQEAgLTQxNCw2ICs0NDQsMzUgQEAKICAgICAgICAgcmV0dXJuICFzdGF0aWNDb2x1bW5zKCkuaXNFbXB0eSgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB0YWJsZSBoYXMgYW55IG1hc2tlZCBjb2x1bW4sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc01hc2tlZENvbHVtbnMoKQorICAgIHsKKyAgICAgICAgZm9yIChDb2x1bW5NZXRhZGF0YSBjb2x1bW4gOiBjb2x1bW5zLnZhbHVlcygpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29sdW1uLmlzTWFza2VkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBmdW5jdGlvbiBhIHVzZXIgZnVuY3Rpb24KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgdGFibGUgaGFzIGFueSBtYXNrZWQgY29sdW1uIGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWVkIHVzZXIgZnVuY3Rpb24sCisgICAgICoge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZGVwZW5kc09uKEZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgIHsKKyAgICAgICAgZm9yIChDb2x1bW5NZXRhZGF0YSBjb2x1bW4gOiBjb2x1bW5zLnZhbHVlcygpKQorICAgICAgICB7CisgICAgICAgICAgICBDb2x1bW5NYXNrIG1hc2sgPSBjb2x1bW4uZ2V0TWFzaygpOworICAgICAgICAgICAgaWYgKG1hc2sgIT0gbnVsbCAmJiBtYXNrLmZ1bmN0aW9uLm5hbWUoKS5lcXVhbHMoZnVuY3Rpb24ubmFtZSgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKQogICAgIHsKICAgICAgICAgaWYgKCFpc05hbWVWYWxpZChrZXlzcGFjZSkpCkBAIC00NjksNyArNTI4LDcgQEAKICAgICAgICAgcmV0dXJuICFjb2x1bW5OYW1lLmJ5dGVzLmhhc1JlbWFpbmluZygpOwogICAgIH0KIAotICAgIHZvaWQgdmFsaWRhdGVDb21wYXRpYmlsaXR5KFRhYmxlTWV0YWRhdGEgcHJldmlvdXMpCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVDb21wYXRpYmlsaXR5KFRhYmxlTWV0YWRhdGEgcHJldmlvdXMpCiAgICAgewogICAgICAgICBpZiAoaXNJbmRleCgpKQogICAgICAgICAgICAgcmV0dXJuOwpAQCAtNzc3LDYgKzgzNiwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgQnVpbGRlciBhbGxvd0F1dG9TbmFwc2hvdChib29sZWFuIHZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgcGFyYW1zLmFsbG93QXV0b1NuYXBzaG90KHZhbCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBCdWlsZGVyIGJsb29tRmlsdGVyRnBDaGFuY2UoZG91YmxlIHZhbCkKICAgICAgICAgewogICAgICAgICAgICAgcGFyYW1zLmJsb29tRmlsdGVyRnBDaGFuY2UodmFsKTsKQEAgLTg5Nyw0NCArOTYyLDg0IEBACiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFBhcnRpdGlvbktleUNvbHVtbihTdHJpbmcgbmFtZSwgQWJzdHJhY3RUeXBlIHR5cGUpCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFBhcnRpdGlvbktleUNvbHVtbihTdHJpbmcgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRQYXJ0aXRpb25LZXlDb2x1bW4oQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZChuYW1lLCBmYWxzZSksIHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZFBhcnRpdGlvbktleUNvbHVtbihuYW1lLCB0eXBlLCBudWxsKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFBhcnRpdGlvbktleUNvbHVtbihDb2x1bW5JZGVudGlmaWVyIG5hbWUsIEFic3RyYWN0VHlwZSB0eXBlKQorICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRQYXJ0aXRpb25LZXlDb2x1bW4oU3RyaW5nIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlLCBATnVsbGFibGUgQ29sdW1uTWFzayBtYXNrKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkQ29sdW1uKG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGhpcy5uYW1lLCBuYW1lLCB0eXBlLCBwYXJ0aXRpb25LZXlDb2x1bW5zLnNpemUoKSwgQ29sdW1uTWV0YWRhdGEuS2luZC5QQVJUSVRJT05fS0VZKSk7CisgICAgICAgICAgICByZXR1cm4gYWRkUGFydGl0aW9uS2V5Q29sdW1uKENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgZmFsc2UpLCB0eXBlLCBtYXNrKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENsdXN0ZXJpbmdDb2x1bW4oU3RyaW5nIG5hbWUsIEFic3RyYWN0VHlwZSB0eXBlKQorICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRQYXJ0aXRpb25LZXlDb2x1bW4oQ29sdW1uSWRlbnRpZmllciBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGFkZENsdXN0ZXJpbmdDb2x1bW4oQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZChuYW1lLCBmYWxzZSksIHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIGFkZFBhcnRpdGlvbktleUNvbHVtbihuYW1lLCB0eXBlLCBudWxsKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENsdXN0ZXJpbmdDb2x1bW4oQ29sdW1uSWRlbnRpZmllciBuYW1lLCBBYnN0cmFjdFR5cGUgdHlwZSkKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUGFydGl0aW9uS2V5Q29sdW1uKENvbHVtbklkZW50aWZpZXIgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUsIEBOdWxsYWJsZSBDb2x1bW5NYXNrIG1hc2spCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRDb2x1bW4obmV3IENvbHVtbk1ldGFkYXRhKGtleXNwYWNlLCB0aGlzLm5hbWUsIG5hbWUsIHR5cGUsIGNsdXN0ZXJpbmdDb2x1bW5zLnNpemUoKSwgQ29sdW1uTWV0YWRhdGEuS2luZC5DTFVTVEVSSU5HKSk7CisgICAgICAgICAgICByZXR1cm4gYWRkQ29sdW1uKG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGhpcy5uYW1lLCBuYW1lLCB0eXBlLCBwYXJ0aXRpb25LZXlDb2x1bW5zLnNpemUoKSwgQ29sdW1uTWV0YWRhdGEuS2luZC5QQVJUSVRJT05fS0VZLCBtYXNrKSk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRSZWd1bGFyQ29sdW1uKFN0cmluZyBuYW1lLCBBYnN0cmFjdFR5cGUgdHlwZSkKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ2x1c3RlcmluZ0NvbHVtbihTdHJpbmcgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBhZGRSZWd1bGFyQ29sdW1uKENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgZmFsc2UpLCB0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRDbHVzdGVyaW5nQ29sdW1uKG5hbWUsIHR5cGUsIG51bGwpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUmVndWxhckNvbHVtbihDb2x1bW5JZGVudGlmaWVyIG5hbWUsIEFic3RyYWN0VHlwZSB0eXBlKQorICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDbHVzdGVyaW5nQ29sdW1uKFN0cmluZyBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSwgQE51bGxhYmxlIENvbHVtbk1hc2sgbWFzaykKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGFkZENvbHVtbihuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRoaXMubmFtZSwgbmFtZSwgdHlwZSwgQ29sdW1uTWV0YWRhdGEuTk9fUE9TSVRJT04sIENvbHVtbk1ldGFkYXRhLktpbmQuUkVHVUxBUikpOworICAgICAgICAgICAgcmV0dXJuIGFkZENsdXN0ZXJpbmdDb2x1bW4oQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZChuYW1lLCBmYWxzZSksIHR5cGUsIG1hc2spOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkU3RhdGljQ29sdW1uKFN0cmluZyBuYW1lLCBBYnN0cmFjdFR5cGUgdHlwZSkKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ2x1c3RlcmluZ0NvbHVtbihDb2x1bW5JZGVudGlmaWVyIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlKQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYWRkU3RhdGljQ29sdW1uKENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgZmFsc2UpLCB0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBhZGRDbHVzdGVyaW5nQ29sdW1uKG5hbWUsIHR5cGUsIG51bGwpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkU3RhdGljQ29sdW1uKENvbHVtbklkZW50aWZpZXIgbmFtZSwgQWJzdHJhY3RUeXBlIHR5cGUpCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENsdXN0ZXJpbmdDb2x1bW4oQ29sdW1uSWRlbnRpZmllciBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSwgQE51bGxhYmxlIENvbHVtbk1hc2sgbWFzaykKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGFkZENvbHVtbihuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRoaXMubmFtZSwgbmFtZSwgdHlwZSwgQ29sdW1uTWV0YWRhdGEuTk9fUE9TSVRJT04sIENvbHVtbk1ldGFkYXRhLktpbmQuU1RBVElDKSk7CisgICAgICAgICAgICByZXR1cm4gYWRkQ29sdW1uKG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGhpcy5uYW1lLCBuYW1lLCB0eXBlLCBjbHVzdGVyaW5nQ29sdW1ucy5zaXplKCksIENvbHVtbk1ldGFkYXRhLktpbmQuQ0xVU1RFUklORywgbWFzaykpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUmVndWxhckNvbHVtbihTdHJpbmcgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRSZWd1bGFyQ29sdW1uKG5hbWUsIHR5cGUsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUmVndWxhckNvbHVtbihTdHJpbmcgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUsIEBOdWxsYWJsZSBDb2x1bW5NYXNrIG1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRSZWd1bGFyQ29sdW1uKENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgZmFsc2UpLCB0eXBlLCBtYXNrKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFJlZ3VsYXJDb2x1bW4oQ29sdW1uSWRlbnRpZmllciBuYW1lLCBBYnN0cmFjdFR5cGU8Pz4gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFkZFJlZ3VsYXJDb2x1bW4obmFtZSwgdHlwZSwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRSZWd1bGFyQ29sdW1uKENvbHVtbklkZW50aWZpZXIgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUsIEBOdWxsYWJsZSBDb2x1bW5NYXNrIG1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRDb2x1bW4obmV3IENvbHVtbk1ldGFkYXRhKGtleXNwYWNlLCB0aGlzLm5hbWUsIG5hbWUsIHR5cGUsIENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLCBDb2x1bW5NZXRhZGF0YS5LaW5kLlJFR1VMQVIsIG1hc2spKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFN0YXRpY0NvbHVtbihTdHJpbmcgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRTdGF0aWNDb2x1bW4obmFtZSwgdHlwZSwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRTdGF0aWNDb2x1bW4oU3RyaW5nIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlLCBATnVsbGFibGUgQ29sdW1uTWFzayBtYXNrKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWRkU3RhdGljQ29sdW1uKENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgZmFsc2UpLCB0eXBlLCBtYXNrKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFN0YXRpY0NvbHVtbihDb2x1bW5JZGVudGlmaWVyIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWRkU3RhdGljQ29sdW1uKG5hbWUsIHR5cGUsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkU3RhdGljQ29sdW1uKENvbHVtbklkZW50aWZpZXIgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUsIEBOdWxsYWJsZSBDb2x1bW5NYXNrIG1hc2spCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRDb2x1bW4obmV3IENvbHVtbk1ldGFkYXRhKGtleXNwYWNlLCB0aGlzLm5hbWUsIG5hbWUsIHR5cGUsIENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLCBDb2x1bW5NZXRhZGF0YS5LaW5kLlNUQVRJQywgbWFzaykpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29sdW1uKENvbHVtbk1ldGFkYXRhIGNvbHVtbikKQEAgLTEwNTksNiArMTE2NCwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAorICAgICAgICBwdWJsaWMgQnVpbGRlciBhbHRlckNvbHVtbk1hc2soQ29sdW1uSWRlbnRpZmllciBuYW1lLCBATnVsbGFibGUgQ29sdW1uTWFzayBtYXNrKQorICAgICAgICB7CisgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW4gPSBjb2x1bW5zLmdldChuYW1lLmJ5dGVzKTsKKyAgICAgICAgICAgIGlmIChjb2x1bW4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisKKyAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhIG5ld0NvbHVtbiA9IGNvbHVtbi53aXRoTmV3TWFzayhtYXNrKTsKKworICAgICAgICAgICAgdXBkYXRlQ29sdW1uKGNvbHVtbiwgbmV3Q29sdW1uKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKwogICAgICAgICBCdWlsZGVyIGFsdGVyQ29sdW1uVHlwZShDb2x1bW5JZGVudGlmaWVyIG5hbWUsIEFic3RyYWN0VHlwZTw/PiB0eXBlKQogICAgICAgICB7CiAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW4gPSBjb2x1bW5zLmdldChuYW1lLmJ5dGVzKTsKQEAgLTEwNjcsNiArMTE4NSwxMyBAQAogCiAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YSBuZXdDb2x1bW4gPSBjb2x1bW4ud2l0aE5ld1R5cGUodHlwZSk7CiAKKyAgICAgICAgICAgIHVwZGF0ZUNvbHVtbihjb2x1bW4sIG5ld0NvbHVtbik7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbHVtbihDb2x1bW5NZXRhZGF0YSBjb2x1bW4sIENvbHVtbk1ldGFkYXRhIG5ld0NvbHVtbikKKyAgICAgICAgewogICAgICAgICAgICAgc3dpdGNoIChjb2x1bW4ua2luZCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjYXNlIFBBUlRJVElPTl9LRVk6CkBAIC0xMDgzLDggKzEyMDgsNiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjb2x1bW5zLnB1dChjb2x1bW4ubmFtZS5ieXRlcywgbmV3Q29sdW1uKTsKLQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KICAgICB9CiAgICAgCkBAIC0xNTA5LDcgKzE2MzIsNyBAQAogICAgICAgICAgICAgICAgIGZvciAoQ29sdW1uTWV0YWRhdGEgYyA6IHJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGMuaXNTdGF0aWMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnMuYWRkKG5ldyBDb2x1bW5NZXRhZGF0YShjLmtzTmFtZSwgYy5jZk5hbWUsIGMubmFtZSwgYy50eXBlLCAtMSwgQ29sdW1uTWV0YWRhdGEuS2luZC5SRUdVTEFSKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zLmFkZChuZXcgQ29sdW1uTWV0YWRhdGEoYy5rc05hbWUsIGMuY2ZOYW1lLCBjLm5hbWUsIGMudHlwZSwgLTEsIENvbHVtbk1ldGFkYXRhLktpbmQuUkVHVUxBUiwgYy5nZXRNYXNrKCkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgb3RoZXJDb2x1bW5zID0gY29sdW1ucy5pdGVyYXRvcigpOwogICAgICAgICAgICAgfQpAQCAtMTU5Niw0ICsxNzE5LDQgQEAKIAogICAgIH0KIAotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9UYWJsZVBhcmFtcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1RhYmxlUGFyYW1zLmphdmEKaW5kZXggNDQwNzI5Yy4uOGY4ODNmOCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1RhYmxlUGFyYW1zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1RhYmxlUGFyYW1zLmphdmEKQEAgLTM2LDExICszNiwxMyBAQAogCiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9NYXA7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZVBhcmFtcy5PcHRpb24uKjsKIAogcHVibGljIGZpbmFsIGNsYXNzIFRhYmxlUGFyYW1zCiB7CiAgICAgcHVibGljIGVudW0gT3B0aW9uCiAgICAgeworICAgICAgICBBTExPV19BVVRPX1NOQVBTSE9ULAogICAgICAgICBCTE9PTV9GSUxURVJfRlBfQ0hBTkNFLAogICAgICAgICBDQUNISU5HLAogICAgICAgICBDT01NRU5ULApAQCAtNTAsNiArNTIsNyBAQAogICAgICAgICBERUZBVUxUX1RJTUVfVE9fTElWRSwKICAgICAgICAgRVhURU5TSU9OUywKICAgICAgICAgR0NfR1JBQ0VfU0VDT05EUywKKyAgICAgICAgSU5DUkVNRU5UQUxfQkFDS1VQUywKICAgICAgICAgTUFYX0lOREVYX0lOVEVSVkFMLAogICAgICAgICBNRU1UQUJMRV9GTFVTSF9QRVJJT0RfSU5fTVMsCiAgICAgICAgIE1JTl9JTkRFWF9JTlRFUlZBTCwKQEAgLTY3LDkgKzcwLDExIEBACiAgICAgfQogCiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBjb21tZW50OworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGFsbG93QXV0b1NuYXBzaG90OwogICAgIHB1YmxpYyBmaW5hbCBkb3VibGUgYmxvb21GaWx0ZXJGcENoYW5jZTsKICAgICBwdWJsaWMgZmluYWwgZG91YmxlIGNyY0NoZWNrQ2hhbmNlOwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2NHcmFjZVNlY29uZHM7CisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaW5jcmVtZW50YWxCYWNrdXBzOwogICAgIHB1YmxpYyBmaW5hbCBpbnQgZGVmYXVsdFRpbWVUb0xpdmU7CiAgICAgcHVibGljIGZpbmFsIGludCBtZW10YWJsZUZsdXNoUGVyaW9kSW5NczsKICAgICBwdWJsaWMgZmluYWwgaW50IG1pbkluZGV4SW50ZXJ2YWw7CkBAIC04NywxMSArOTIsMTMgQEAKICAgICBwcml2YXRlIFRhYmxlUGFyYW1zKEJ1aWxkZXIgYnVpbGRlcikKICAgICB7CiAgICAgICAgIGNvbW1lbnQgPSBidWlsZGVyLmNvbW1lbnQ7Ci0gICAgICAgIGJsb29tRmlsdGVyRnBDaGFuY2UgPSBidWlsZGVyLmJsb29tRmlsdGVyRnBDaGFuY2UgPT0gbnVsbAorICAgICAgICBhbGxvd0F1dG9TbmFwc2hvdCA9IGJ1aWxkZXIuYWxsb3dBdXRvU25hcHNob3Q7CisgICAgICAgIGJsb29tRmlsdGVyRnBDaGFuY2UgPSBidWlsZGVyLmJsb29tRmlsdGVyRnBDaGFuY2UgPT0gLTEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJ1aWxkZXIuY29tcGFjdGlvbi5kZWZhdWx0Qmxvb21GaWx0ZXJGYkNoYW5jZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBidWlsZGVyLmJsb29tRmlsdGVyRnBDaGFuY2U7CiAgICAgICAgIGNyY0NoZWNrQ2hhbmNlID0gYnVpbGRlci5jcmNDaGVja0NoYW5jZTsKICAgICAgICAgZ2NHcmFjZVNlY29uZHMgPSBidWlsZGVyLmdjR3JhY2VTZWNvbmRzOworICAgICAgICBpbmNyZW1lbnRhbEJhY2t1cHMgPSBidWlsZGVyLmluY3JlbWVudGFsQmFja3VwczsKICAgICAgICAgZGVmYXVsdFRpbWVUb0xpdmUgPSBidWlsZGVyLmRlZmF1bHRUaW1lVG9MaXZlOwogICAgICAgICBtZW10YWJsZUZsdXNoUGVyaW9kSW5NcyA9IGJ1aWxkZXIubWVtdGFibGVGbHVzaFBlcmlvZEluTXM7CiAgICAgICAgIG1pbkluZGV4SW50ZXJ2YWwgPSBidWlsZGVyLm1pbkluZGV4SW50ZXJ2YWw7CkBAIC0xMTQsNyArMTIxLDggQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBidWlsZGVyKFRhYmxlUGFyYW1zIHBhcmFtcykKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLmJsb29tRmlsdGVyRnBDaGFuY2UocGFyYW1zLmJsb29tRmlsdGVyRnBDaGFuY2UpCisgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLmFsbG93QXV0b1NuYXBzaG90KHBhcmFtcy5hbGxvd0F1dG9TbmFwc2hvdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmxvb21GaWx0ZXJGcENoYW5jZShwYXJhbXMuYmxvb21GaWx0ZXJGcENoYW5jZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FjaGluZyhwYXJhbXMuY2FjaGluZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tbWVudChwYXJhbXMuY29tbWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcGFjdGlvbihwYXJhbXMuY29tcGFjdGlvbikKQEAgLTEyMyw2ICsxMzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmNDaGVja0NoYW5jZShwYXJhbXMuY3JjQ2hlY2tDaGFuY2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRUaW1lVG9MaXZlKHBhcmFtcy5kZWZhdWx0VGltZVRvTGl2ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2NHcmFjZVNlY29uZHMocGFyYW1zLmdjR3JhY2VTZWNvbmRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbmNyZW1lbnRhbEJhY2t1cHMocGFyYW1zLmluY3JlbWVudGFsQmFja3VwcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4SW5kZXhJbnRlcnZhbChwYXJhbXMubWF4SW5kZXhJbnRlcnZhbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWVtdGFibGVGbHVzaFBlcmlvZEluTXMocGFyYW1zLm1lbXRhYmxlRmx1c2hQZXJpb2RJbk1zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taW5JbmRleEludGVydmFsKHBhcmFtcy5taW5JbmRleEludGVydmFsKQpAQCAtMTQ3LDcgKzE1Niw3IEBACiAgICAgICAgIGlmIChibG9vbUZpbHRlckZwQ2hhbmNlIDw9ICBtaW5CbG9vbUZpbHRlckZwQ2hhbmNlVmFsdWUgfHwgYmxvb21GaWx0ZXJGcENoYW5jZSA+IDEpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZhaWwoIiVzIG11c3QgYmUgbGFyZ2VyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxLjAgKGdvdCAlcykiLAotICAgICAgICAgICAgICAgICBPcHRpb24uQkxPT01fRklMVEVSX0ZQX0NIQU5DRSwKKyAgICAgICAgICAgICAgICAgQkxPT01fRklMVEVSX0ZQX0NIQU5DRSwKICAgICAgICAgICAgICAgICAgbWluQmxvb21GaWx0ZXJGcENoYW5jZVZhbHVlLAogICAgICAgICAgICAgICAgICBibG9vbUZpbHRlckZwQ2hhbmNlKTsKICAgICAgICAgfQpAQCAtMTU1LDMzICsxNjQsMzMgQEAKICAgICAgICAgaWYgKGNyY0NoZWNrQ2hhbmNlIDwgMCB8fCBjcmNDaGVja0NoYW5jZSA+IDEuMCkKICAgICAgICAgewogICAgICAgICAgICAgZmFpbCgiJXMgbXVzdCBiZSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byAwIGFuZCBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4wIChnb3QgJXMpIiwKLSAgICAgICAgICAgICAgICAgT3B0aW9uLkNSQ19DSEVDS19DSEFOQ0UsCisgICAgICAgICAgICAgICAgIENSQ19DSEVDS19DSEFOQ0UsCiAgICAgICAgICAgICAgICAgIGNyY0NoZWNrQ2hhbmNlKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChkZWZhdWx0VGltZVRvTGl2ZSA8IDApCi0gICAgICAgICAgICBmYWlsKCIlcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIChnb3QgJXMpIiwgT3B0aW9uLkRFRkFVTFRfVElNRV9UT19MSVZFLCBkZWZhdWx0VGltZVRvTGl2ZSk7CisgICAgICAgICAgICBmYWlsKCIlcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIChnb3QgJXMpIiwgREVGQVVMVF9USU1FX1RPX0xJVkUsIGRlZmF1bHRUaW1lVG9MaXZlKTsKIAogICAgICAgICBpZiAoZGVmYXVsdFRpbWVUb0xpdmUgPiBBdHRyaWJ1dGVzLk1BWF9UVEwpCi0gICAgICAgICAgICBmYWlsKCIlcyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlZCAoZ290ICVzKSIsIE9wdGlvbi5ERUZBVUxUX1RJTUVfVE9fTElWRSwgQXR0cmlidXRlcy5NQVhfVFRMLCBkZWZhdWx0VGltZVRvTGl2ZSk7CisgICAgICAgICAgICBmYWlsKCIlcyBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlZCAoZ290ICVzKSIsIERFRkFVTFRfVElNRV9UT19MSVZFLCBBdHRyaWJ1dGVzLk1BWF9UVEwsIGRlZmF1bHRUaW1lVG9MaXZlKTsKIAogICAgICAgICBpZiAoZ2NHcmFjZVNlY29uZHMgPCAwKQotICAgICAgICAgICAgZmFpbCgiJXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCAoZ290ICVzKSIsIE9wdGlvbi5HQ19HUkFDRV9TRUNPTkRTLCBnY0dyYWNlU2Vjb25kcyk7CisgICAgICAgICAgICBmYWlsKCIlcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIChnb3QgJXMpIiwgR0NfR1JBQ0VfU0VDT05EUywgZ2NHcmFjZVNlY29uZHMpOwogCiAgICAgICAgIGlmIChtaW5JbmRleEludGVydmFsIDwgMSkKLSAgICAgICAgICAgIGZhaWwoIiVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEgKGdvdCAlcykiLCBPcHRpb24uTUlOX0lOREVYX0lOVEVSVkFMLCBtaW5JbmRleEludGVydmFsKTsKKyAgICAgICAgICAgIGZhaWwoIiVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEgKGdvdCAlcykiLCBNSU5fSU5ERVhfSU5URVJWQUwsIG1pbkluZGV4SW50ZXJ2YWwpOwogCiAgICAgICAgIGlmIChtYXhJbmRleEludGVydmFsIDwgbWluSW5kZXhJbnRlcnZhbCkKICAgICAgICAgewogICAgICAgICAgICAgZmFpbCgiJXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgKCVzKSAoZ290ICVzKSIsCi0gICAgICAgICAgICAgICAgIE9wdGlvbi5NQVhfSU5ERVhfSU5URVJWQUwsCi0gICAgICAgICAgICAgICAgIE9wdGlvbi5NSU5fSU5ERVhfSU5URVJWQUwsCisgICAgICAgICAgICAgICAgIE1BWF9JTkRFWF9JTlRFUlZBTCwKKyAgICAgICAgICAgICAgICAgTUlOX0lOREVYX0lOVEVSVkFMLAogICAgICAgICAgICAgICAgICBtaW5JbmRleEludGVydmFsLAogICAgICAgICAgICAgICAgICBtYXhJbmRleEludGVydmFsKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtZW10YWJsZUZsdXNoUGVyaW9kSW5NcyA8IDApCi0gICAgICAgICAgICBmYWlsKCIlcyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwIChnb3QgJXMpIiwgT3B0aW9uLk1FTVRBQkxFX0ZMVVNIX1BFUklPRF9JTl9NUywgbWVtdGFibGVGbHVzaFBlcmlvZEluTXMpOworICAgICAgICAgICAgZmFpbCgiJXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMCAoZ290ICVzKSIsIE1FTVRBQkxFX0ZMVVNIX1BFUklPRF9JTl9NUywgbWVtdGFibGVGbHVzaFBlcmlvZEluTXMpOwogCiAgICAgICAgIGlmIChjZGMgJiYgbWVtdGFibGUuZmFjdG9yeSgpLndyaXRlc1Nob3VsZFNraXBDb21taXRMb2coKSkKICAgICAgICAgICAgIGZhaWwoIkNEQyBjYW5ub3Qgd29yayBpZiB3cml0ZXMgc2tpcCB0aGUgY29tbWl0IGxvZy4gQ2hlY2sgeW91ciBtZW10YWJsZSBjb25maWd1cmF0aW9uLiIpOwpAQCAtMjA0LDkgKzIxMywxMiBAQAogICAgICAgICBUYWJsZVBhcmFtcyBwID0gKFRhYmxlUGFyYW1zKSBvOwogCiAgICAgICAgIHJldHVybiBjb21tZW50LmVxdWFscyhwLmNvbW1lbnQpCisgICAgICAgICAgICAmJiBhZGRpdGlvbmFsV3JpdGVQb2xpY3kuZXF1YWxzKHAuYWRkaXRpb25hbFdyaXRlUG9saWN5KQorICAgICAgICAgICAgJiYgYWxsb3dBdXRvU25hcHNob3QgPT0gcC5hbGxvd0F1dG9TbmFwc2hvdAogICAgICAgICAgICAgJiYgYmxvb21GaWx0ZXJGcENoYW5jZSA9PSBwLmJsb29tRmlsdGVyRnBDaGFuY2UKICAgICAgICAgICAgICYmIGNyY0NoZWNrQ2hhbmNlID09IHAuY3JjQ2hlY2tDaGFuY2UKLSAgICAgICAgICAgICYmIGdjR3JhY2VTZWNvbmRzID09IHAuZ2NHcmFjZVNlY29uZHMKKyAgICAgICAgICAgICYmIGdjR3JhY2VTZWNvbmRzID09IHAuZ2NHcmFjZVNlY29uZHMgCisgICAgICAgICAgICAmJiBpbmNyZW1lbnRhbEJhY2t1cHMgPT0gcC5pbmNyZW1lbnRhbEJhY2t1cHMKICAgICAgICAgICAgICYmIGRlZmF1bHRUaW1lVG9MaXZlID09IHAuZGVmYXVsdFRpbWVUb0xpdmUKICAgICAgICAgICAgICYmIG1lbXRhYmxlRmx1c2hQZXJpb2RJbk1zID09IHAubWVtdGFibGVGbHVzaFBlcmlvZEluTXMKICAgICAgICAgICAgICYmIG1pbkluZGV4SW50ZXJ2YWwgPT0gcC5taW5JbmRleEludGVydmFsCkBAIC0yMjUsOSArMjM3LDEyIEBACiAgICAgcHVibGljIGludCBoYXNoQ29kZSgpCiAgICAgewogICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoQ29kZShjb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsV3JpdGVQb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93QXV0b1NuYXBzaG90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9vbUZpbHRlckZwQ2hhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmNDaGVja0NoYW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2NHcmFjZVNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JlbWVudGFsQmFja3VwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFRpbWVUb0xpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXRhYmxlRmx1c2hQZXJpb2RJbk1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5JbmRleEludGVydmFsLApAQCAtMjQ2LDIyICsyNjEsMjUgQEAKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICB7CiAgICAgICAgIHJldHVybiBNb3JlT2JqZWN0cy50b1N0cmluZ0hlbHBlcih0aGlzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE9wdGlvbi5DT01NRU5ULnRvU3RyaW5nKCksIGNvbW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoT3B0aW9uLkJMT09NX0ZJTFRFUl9GUF9DSEFOQ0UudG9TdHJpbmcoKSwgYmxvb21GaWx0ZXJGcENoYW5jZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChPcHRpb24uQ1JDX0NIRUNLX0NIQU5DRS50b1N0cmluZygpLCBjcmNDaGVja0NoYW5jZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChPcHRpb24uR0NfR1JBQ0VfU0VDT05EUy50b1N0cmluZygpLCBnY0dyYWNlU2Vjb25kcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChPcHRpb24uREVGQVVMVF9USU1FX1RPX0xJVkUudG9TdHJpbmcoKSwgZGVmYXVsdFRpbWVUb0xpdmUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoT3B0aW9uLk1FTVRBQkxFX0ZMVVNIX1BFUklPRF9JTl9NUy50b1N0cmluZygpLCBtZW10YWJsZUZsdXNoUGVyaW9kSW5NcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChPcHRpb24uTUlOX0lOREVYX0lOVEVSVkFMLnRvU3RyaW5nKCksIG1pbkluZGV4SW50ZXJ2YWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoT3B0aW9uLk1BWF9JTkRFWF9JTlRFUlZBTC50b1N0cmluZygpLCBtYXhJbmRleEludGVydmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE9wdGlvbi5TUEVDVUxBVElWRV9SRVRSWS50b1N0cmluZygpLCBzcGVjdWxhdGl2ZVJldHJ5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE9wdGlvbi5DQUNISU5HLnRvU3RyaW5nKCksIGNhY2hpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoT3B0aW9uLkNPTVBBQ1RJT04udG9TdHJpbmcoKSwgY29tcGFjdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChPcHRpb24uQ09NUFJFU1NJT04udG9TdHJpbmcoKSwgY29tcHJlc3Npb24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoT3B0aW9uLk1FTVRBQkxFLnRvU3RyaW5nKCksIG1lbXRhYmxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE9wdGlvbi5FWFRFTlNJT05TLnRvU3RyaW5nKCksIGV4dGVuc2lvbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoT3B0aW9uLkNEQy50b1N0cmluZygpLCBjZGMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoT3B0aW9uLlJFQURfUkVQQUlSLnRvU3RyaW5nKCksIHJlYWRSZXBhaXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoQ09NTUVOVC50b1N0cmluZygpLCBjb21tZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKEFERElUSU9OQUxfV1JJVEVfUE9MSUNZLnRvU3RyaW5nKCksIGFkZGl0aW9uYWxXcml0ZVBvbGljeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChBTExPV19BVVRPX1NOQVBTSE9ULnRvU3RyaW5nKCksIGFsbG93QXV0b1NuYXBzaG90KQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKEJMT09NX0ZJTFRFUl9GUF9DSEFOQ0UudG9TdHJpbmcoKSwgYmxvb21GaWx0ZXJGcENoYW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChDUkNfQ0hFQ0tfQ0hBTkNFLnRvU3RyaW5nKCksIGNyY0NoZWNrQ2hhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKEdDX0dSQUNFX1NFQ09ORFMudG9TdHJpbmcoKSwgZ2NHcmFjZVNlY29uZHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoREVGQVVMVF9USU1FX1RPX0xJVkUudG9TdHJpbmcoKSwgZGVmYXVsdFRpbWVUb0xpdmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoSU5DUkVNRU5UQUxfQkFDS1VQUy50b1N0cmluZygpLCBpbmNyZW1lbnRhbEJhY2t1cHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoTUVNVEFCTEVfRkxVU0hfUEVSSU9EX0lOX01TLnRvU3RyaW5nKCksIG1lbXRhYmxlRmx1c2hQZXJpb2RJbk1zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE1JTl9JTkRFWF9JTlRFUlZBTC50b1N0cmluZygpLCBtaW5JbmRleEludGVydmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE1BWF9JTkRFWF9JTlRFUlZBTC50b1N0cmluZygpLCBtYXhJbmRleEludGVydmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKFNQRUNVTEFUSVZFX1JFVFJZLnRvU3RyaW5nKCksIHNwZWN1bGF0aXZlUmV0cnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoQ0FDSElORy50b1N0cmluZygpLCBjYWNoaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKENPTVBBQ1RJT04udG9TdHJpbmcoKSwgY29tcGFjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChDT01QUkVTU0lPTi50b1N0cmluZygpLCBjb21wcmVzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChNRU1UQUJMRS50b1N0cmluZygpLCBtZW10YWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChFWFRFTlNJT05TLnRvU3RyaW5nKCksIGV4dGVuc2lvbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoQ0RDLnRvU3RyaW5nKCksIGNkYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChSRUFEX1JFUEFJUi50b1N0cmluZygpLCByZWFkUmVwYWlyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKTsKICAgICB9CiAKQEAgLTI3MCw2ICsyODgsOCBAQAogICAgICAgICAvLyBvcHRpb24gbmFtZXMgc2hvdWxkIGJlIGluIGFscGhhYmV0aWNhbCBvcmRlcgogICAgICAgICBidWlsZGVyLmFwcGVuZCgiYWRkaXRpb25hbF93cml0ZV9wb2xpY3kgPSAiKS5hcHBlbmRXaXRoU2luZ2xlUXVvdGVzKGFkZGl0aW9uYWxXcml0ZVBvbGljeS50b1N0cmluZygpKQogICAgICAgICAgICAgICAgLm5ld0xpbmUoKQorICAgICAgICAgICAgICAgLmFwcGVuZCgiQU5EIGFsbG93X2F1dG9fc25hcHNob3QgPSAiKS5hcHBlbmQoYWxsb3dBdXRvU25hcHNob3QpCisgICAgICAgICAgICAgICAubmV3TGluZSgpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCJBTkQgYmxvb21fZmlsdGVyX2ZwX2NoYW5jZSA9ICIpLmFwcGVuZChibG9vbUZpbHRlckZwQ2hhbmNlKQogICAgICAgICAgICAgICAgLm5ld0xpbmUoKQogICAgICAgICAgICAgICAgLmFwcGVuZCgiQU5EIGNhY2hpbmcgPSAiKS5hcHBlbmQoY2FjaGluZy5hc01hcCgpKQpAQCAtMzAxLDYgKzMyMSw4IEBACiAgICAgICAgICAgICAgICAubmV3TGluZSgpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCJBTkQgZ2NfZ3JhY2Vfc2Vjb25kcyA9ICIpLmFwcGVuZChnY0dyYWNlU2Vjb25kcykKICAgICAgICAgICAgICAgIC5uZXdMaW5lKCkKKyAgICAgICAgICAgICAgIC5hcHBlbmQoIkFORCBpbmNyZW1lbnRhbF9iYWNrdXBzID0gIikuYXBwZW5kKGluY3JlbWVudGFsQmFja3VwcykKKyAgICAgICAgICAgICAgIC5uZXdMaW5lKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoIkFORCBtYXhfaW5kZXhfaW50ZXJ2YWwgPSAiKS5hcHBlbmQobWF4SW5kZXhJbnRlcnZhbCkKICAgICAgICAgICAgICAgIC5uZXdMaW5lKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoIkFORCBtZW10YWJsZV9mbHVzaF9wZXJpb2RfaW5fbXMgPSAiKS5hcHBlbmQobWVtdGFibGVGbHVzaFBlcmlvZEluTXMpCkBAIC0zMTUsOSArMzM3LDExIEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyCiAgICAgewogICAgICAgICBwcml2YXRlIFN0cmluZyBjb21tZW50ID0gIiI7Ci0gICAgICAgIHByaXZhdGUgRG91YmxlIGJsb29tRmlsdGVyRnBDaGFuY2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBhbGxvd0F1dG9TbmFwc2hvdCA9IHRydWU7CisgICAgICAgIHByaXZhdGUgZG91YmxlIGJsb29tRmlsdGVyRnBDaGFuY2UgPSAtMTsKICAgICAgICAgcHJpdmF0ZSBkb3VibGUgY3JjQ2hlY2tDaGFuY2UgPSAxLjA7CiAgICAgICAgIHByaXZhdGUgaW50IGdjR3JhY2VTZWNvbmRzID0gODY0MDAwOyAvLyAxMCBkYXlzCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpbmNyZW1lbnRhbEJhY2t1cHMgPSB0cnVlOwogICAgICAgICBwcml2YXRlIGludCBkZWZhdWx0VGltZVRvTGl2ZSA9IDA7CiAgICAgICAgIHByaXZhdGUgaW50IG1lbXRhYmxlRmx1c2hQZXJpb2RJbk1zID0gMDsKICAgICAgICAgcHJpdmF0ZSBpbnQgbWluSW5kZXhJbnRlcnZhbCA9IDEyODsKQEAgLTM0Nyw2ICszNzEsMTIgQEAKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWxsb3dBdXRvU25hcHNob3QoYm9vbGVhbiB2YWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFsbG93QXV0b1NuYXBzaG90ID0gdmFsOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgQnVpbGRlciBibG9vbUZpbHRlckZwQ2hhbmNlKGRvdWJsZSB2YWwpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJsb29tRmlsdGVyRnBDaGFuY2UgPSB2YWw7CkBAIC0zNjUsNiArMzk1LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGluY3JlbWVudGFsQmFja3Vwcyhib29sZWFuIHZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgaW5jcmVtZW50YWxCYWNrdXBzID0gdmFsOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgQnVpbGRlciBkZWZhdWx0VGltZVRvTGl2ZShpbnQgdmFsKQogICAgICAgICB7CiAgICAgICAgICAgICBkZWZhdWx0VGltZVRvTGl2ZSA9IHZhbDsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9Vc2VyRnVuY3Rpb25zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvVXNlckZ1bmN0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MGM3MDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvVXNlckZ1bmN0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWE7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC4qOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVzZXJUeXBlOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b0xpc3Q7CisKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMuYW55OworCisvKioKKyAqIEFuIGltbXV0YWJsZSBjb250YWluZXIgZm9yIGEga2V5c3BhY2UncyBVREFzIGFuZCBVREZzLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVXNlckZ1bmN0aW9ucyBpbXBsZW1lbnRzIEl0ZXJhYmxlPFVzZXJGdW5jdGlvbj4KK3sKKyAgICBwdWJsaWMgZW51bSBGaWx0ZXIgaW1wbGVtZW50cyBQcmVkaWNhdGU8VXNlckZ1bmN0aW9uPgorICAgIHsKKyAgICAgICAgQUxMLCBVREYsIFVEQTsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0KFVzZXJGdW5jdGlvbiBmdW5jdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0aGlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgVURGOiByZXR1cm4gZnVuY3Rpb24gaW5zdGFuY2VvZiBVREZ1bmN0aW9uOworICAgICAgICAgICAgICAgIGNhc2UgVURBOiByZXR1cm4gZnVuY3Rpb24gaW5zdGFuY2VvZiBVREFnZ3JlZ2F0ZTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZU11bHRpbWFwPEZ1bmN0aW9uTmFtZSwgVXNlckZ1bmN0aW9uPiBmdW5jdGlvbnM7CisKKyAgICBwcml2YXRlIFVzZXJGdW5jdGlvbnMoQnVpbGRlciBidWlsZGVyKQorICAgIHsKKyAgICAgICAgZnVuY3Rpb25zID0gYnVpbGRlci5mdW5jdGlvbnMuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgYnVpbGRlcigpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFVzZXJGdW5jdGlvbnMgbm9uZSgpCisgICAgeworICAgICAgICByZXR1cm4gYnVpbGRlcigpLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHVibGljIEl0ZXJhdG9yPFVzZXJGdW5jdGlvbj4gaXRlcmF0b3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJlYW08VXNlckZ1bmN0aW9uPiBzdHJlYW0oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy52YWx1ZXMoKS5zdHJlYW0oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHNpemUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy5zaXplKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIHN0cmVhbSBvZiBrZXlzcGFjZSdzIFVERnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyZWFtPFVERnVuY3Rpb24+IHVkZnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0cmVhbSgpLmZpbHRlcihGaWx0ZXIuVURGKS5tYXAoZiAtPiAoVURGdW5jdGlvbikgZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIHN0cmVhbSBvZiBrZXlzcGFjZSdzIFVEQXMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyZWFtPFVEQWdncmVnYXRlPiB1ZGFzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdHJlYW0oKS5maWx0ZXIoRmlsdGVyLlVEQSkubWFwKGYgLT4gKFVEQWdncmVnYXRlKSBmKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmFibGU8VXNlckZ1bmN0aW9uPiByZWZlcmVuY2luZ1VzZXJUeXBlKEJ5dGVCdWZmZXIgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBJdGVyYWJsZXMuZmlsdGVyKHRoaXMsIGYgLT4gZi5yZWZlcmVuY2VzVXNlclR5cGUobmFtZSkpOworICAgIH0KKworICAgIHB1YmxpYyBVc2VyRnVuY3Rpb25zIHdpdGhVcGRhdGVkVXNlclR5cGUoVXNlclR5cGUgdWR0KQorICAgIHsKKyAgICAgICAgaWYgKCFhbnkodGhpcywgZiAtPiBmLnJlZmVyZW5jZXNVc2VyVHlwZSh1ZHQubmFtZSkpKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICAgICAgQ29sbGVjdGlvbjxVREZ1bmN0aW9uPiAgdWRmcyA9IHVkZnMoKS5tYXAoZiAtPiBmLndpdGhVcGRhdGVkVXNlclR5cGUodWR0KSkuY29sbGVjdCh0b0xpc3QoKSk7CisgICAgICAgIENvbGxlY3Rpb248VURBZ2dyZWdhdGU+IHVkYXMgPSB1ZGFzKCkubWFwKGYgLT4gZi53aXRoVXBkYXRlZFVzZXJUeXBlKHVkZnMsIHVkdCkpLmNvbGxlY3QodG9MaXN0KCkpOworCisgICAgICAgIHJldHVybiBidWlsZGVyKCkuYWRkKHVkZnMpLmFkZCh1ZGFzKS5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBzdHJlYW0gb2YgYWdncmVnYXRlcyB0aGF0IHVzZSB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gYXMgZWl0aGVyIGEgc3RhdGUgb3IgYSBmaW5hbCBmdW5jdGlvbgorICAgICAqIEBwYXJhbSBmdW5jdGlvbiB0aGUgcmVmZXJyZWUgZnVuY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyZWFtPFVEQWdncmVnYXRlPiBhZ2dyZWdhdGVzVXNpbmdGdW5jdGlvbihGdW5jdGlvbiBmdW5jdGlvbikKKyAgICB7CisgICAgICAgIHJldHVybiB1ZGFzKCkuZmlsdGVyKHVkYSAtPiB1ZGEuaGFzUmVmZXJlbmNlVG8oZnVuY3Rpb24pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIGZ1bmN0aW9uIG92ZXJsb2FkcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgZnVsbHkgcXVhbGlmaWVkIGZ1bmN0aW9uIG5hbWUKKyAgICAgKiBAcmV0dXJuIGFuIGVtcHR5IGxpc3QgaWYgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgbm90IGZvdW5kOyBhIG5vbi1lbXB0eSBjb2xsZWN0aW9uIG9mIHtAbGluayBGdW5jdGlvbn0gb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb248VXNlckZ1bmN0aW9uPiBnZXQoRnVuY3Rpb25OYW1lIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gZnVuY3Rpb25zLmdldChuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIFVERnMgb3ZlcmxvYWRzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBmdWxseSBxdWFsaWZpZWQgZnVuY3Rpb24gbmFtZQorICAgICAqIEByZXR1cm4gYW4gZW1wdHkgbGlzdCBpZiB0aGUgZnVuY3Rpb24gbmFtZSBpcyBub3QgZm91bmQ7IGEgbm9uLWVtcHR5IGNvbGxlY3Rpb24gb2Yge0BsaW5rIFVERnVuY3Rpb259IG90aGVyd2lzZQorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uPFVERnVuY3Rpb24+IGdldFVkZnMoRnVuY3Rpb25OYW1lIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gZnVuY3Rpb25zLmdldChuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEZpbHRlci5VREYpCisgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGYgLT4gKFVERnVuY3Rpb24pIGYpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIFVEQXMgb3ZlcmxvYWRzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBmdWxseSBxdWFsaWZpZWQgZnVuY3Rpb24gbmFtZQorICAgICAqIEByZXR1cm4gYW4gZW1wdHkgbGlzdCBpZiB0aGUgZnVuY3Rpb24gbmFtZSBpcyBub3QgZm91bmQ7IGEgbm9uLWVtcHR5IGNvbGxlY3Rpb24gb2Yge0BsaW5rIFVEQWdncmVnYXRlfSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxVREFnZ3JlZ2F0ZT4gZ2V0VWRhcyhGdW5jdGlvbk5hbWUgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbnMuZ2V0KG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoRmlsdGVyLlVEQSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZiAtPiAoVURBZ2dyZWdhdGUpIGYpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgT3B0aW9uYWw8VXNlckZ1bmN0aW9uPiBmaW5kKEZ1bmN0aW9uTmFtZSBuYW1lLCBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMpCisgICAgeworICAgICAgICByZXR1cm4gZmluZChuYW1lLCBhcmdUeXBlcywgRmlsdGVyLkFMTCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIGZ1bGx5IHF1YWxpZmllZCBmdW5jdGlvbiBuYW1lCisgICAgICogQHBhcmFtIGFyZ1R5cGVzIGZ1bmN0aW9uIGFyZ3VtZW50IHR5cGVzCisgICAgICogQHJldHVybiBhbiBlbXB0eSB7QGxpbmsgT3B0aW9uYWx9IGlmIHRoZSBmdW5jdGlvbiBuYW1lIGlzIG5vdCBmb3VuZDsgYSBub24tZW1wdHkgb3B0aW9uYWwgb2Yge0BsaW5rIEZ1bmN0aW9ufSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgT3B0aW9uYWw8VXNlckZ1bmN0aW9uPiBmaW5kKEZ1bmN0aW9uTmFtZSBuYW1lLCBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEZpbHRlciBmaWx0ZXIpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0KG5hbWUpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGZpbHRlci5hbmQoZnVuIC0+IGZ1bi50eXBlc01hdGNoKGFyZ1R5cGVzKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmluZEFueSgpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZ1bmN0aW9ucy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgdHlwZUhhc2hDb2RlKEFic3RyYWN0VHlwZTw/PiB0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHQuYXNDUUwzVHlwZSgpLnRvU3RyaW5nKCkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCB0eXBlSGFzaENvZGUoTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzKQorICAgIHsKKyAgICAgICAgaW50IGggPSAwOworICAgICAgICBmb3IgKEFic3RyYWN0VHlwZTw/PiB0eXBlIDogdHlwZXMpCisgICAgICAgICAgICBoID0gaCAqIDMxICsgdHlwZUhhc2hDb2RlKHR5cGUpOworICAgICAgICByZXR1cm4gaDsKKyAgICB9CisKKyAgICBwdWJsaWMgVXNlckZ1bmN0aW9ucyBmaWx0ZXIoUHJlZGljYXRlPFVzZXJGdW5jdGlvbj4gcHJlZGljYXRlKQorICAgIHsKKyAgICAgICAgQnVpbGRlciBidWlsZGVyID0gYnVpbGRlcigpOworICAgICAgICBzdHJlYW0oKS5maWx0ZXIocHJlZGljYXRlKS5mb3JFYWNoKGJ1aWxkZXI6OmFkZCk7CisgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgRnVuY3Rpb25zIGluc3RhbmNlIHdpdGggdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGFkZGVkCisgICAgICovCisgICAgcHVibGljIFVzZXJGdW5jdGlvbnMgd2l0aChVc2VyRnVuY3Rpb24gZnVuKQorICAgIHsKKyAgICAgICAgaWYgKGZpbmQoZnVuLm5hbWUoKSwgZnVuLmFyZ1R5cGVzKCkpLmlzUHJlc2VudCgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJGdW5jdGlvbiAlcyBhbHJlYWR5IGV4aXN0cyIsIGZ1bi5uYW1lKCkpKTsKKworICAgICAgICByZXR1cm4gYnVpbGRlcigpLmFkZCh0aGlzKS5hZGQoZnVuKS5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBGdW5jdGlvbnMgaW5zdGFuY2Ugd2l0aCB0aGUgZnVuY3Rpb24gd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSBhbmQgYXJndW1lbnQgdHlwZXMgcmVtb3ZlZAorICAgICAqLworICAgIHB1YmxpYyBVc2VyRnVuY3Rpb25zIHdpdGhvdXQoRnVuY3Rpb25OYW1lIG5hbWUsIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcykKKyAgICB7CisgICAgICAgIEZ1bmN0aW9uIGZ1biA9CisgICAgICAgICAgICBmaW5kKG5hbWUsIGFyZ1R5cGVzKS5vckVsc2VUaHJvdygoKSAtPiBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkZ1bmN0aW9uICVzIGRvZXNuJ3QgZXhpc3RzIiwgbmFtZSkpKTsKKworICAgICAgICByZXR1cm4gd2l0aG91dChmdW4pOworICAgIH0KKworICAgIHB1YmxpYyBVc2VyRnVuY3Rpb25zIHdpdGhvdXQoRnVuY3Rpb24gZnVuY3Rpb24pCisgICAgeworICAgICAgICByZXR1cm4gYnVpbGRlcigpLmFkZChJdGVyYWJsZXMuZmlsdGVyKHRoaXMsIGYgLT4gZiAhPSBmdW5jdGlvbikpLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHVibGljIFVzZXJGdW5jdGlvbnMgd2l0aEFkZGVkT3JVcGRhdGVkKFVzZXJGdW5jdGlvbiBmdW5jdGlvbikKKyAgICB7CisgICAgICAgIHJldHVybiBidWlsZGVyKCkuYWRkKEl0ZXJhYmxlcy5maWx0ZXIodGhpcywgZiAtPiAhKGYubmFtZSgpLmVxdWFscyhmdW5jdGlvbi5uYW1lKCkpICYmIGYudHlwZXNNYXRjaChmdW5jdGlvbi5hcmdUeXBlcygpKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChmdW5jdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzID09IG8gfHwgKG8gaW5zdGFuY2VvZiBVc2VyRnVuY3Rpb25zICYmIGZ1bmN0aW9ucy5lcXVhbHMoKChVc2VyRnVuY3Rpb25zKSBvKS5mdW5jdGlvbnMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbnMuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmdW5jdGlvbnMudmFsdWVzKCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIKKyAgICB7CisgICAgICAgIGZpbmFsIEltbXV0YWJsZU11bHRpbWFwLkJ1aWxkZXI8RnVuY3Rpb25OYW1lLCBVc2VyRnVuY3Rpb24+IGZ1bmN0aW9ucyA9IG5ldyBJbW11dGFibGVNdWx0aW1hcC5CdWlsZGVyPD4oKTsKKworICAgICAgICBwcml2YXRlIEJ1aWxkZXIoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB3ZSBuZWVkIGRldGVybWluaXN0aWMgaXRlcmF0aW9uIG9yZGVyOyBvdGhlcndpc2UgRnVuY3Rpb25zLmVxdWFscygpIGJyZWFrcyBkb3duCisgICAgICAgICAgICBmdW5jdGlvbnMub3JkZXJWYWx1ZXNCeShDb21wYXJhdG9yLmNvbXBhcmluZ0ludChPYmplY3Q6Omhhc2hDb2RlKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVXNlckZ1bmN0aW9ucyBidWlsZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVXNlckZ1bmN0aW9ucyh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZChVc2VyRnVuY3Rpb24gZnVuKQorICAgICAgICB7CisgICAgICAgICAgICBmdW5jdGlvbnMucHV0KGZ1bi5uYW1lKCksIGZ1bik7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZChVc2VyRnVuY3Rpb24uLi4gZnVucykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChVc2VyRnVuY3Rpb24gZnVuIDogZnVucykKKyAgICAgICAgICAgICAgICBhZGQoZnVuKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkKEl0ZXJhYmxlPD8gZXh0ZW5kcyBVc2VyRnVuY3Rpb24+IGZ1bnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZ1bnMuZm9yRWFjaCh0aGlzOjphZGQpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBzdGF0aWMgRnVuY3Rpb25zRGlmZjxVREZ1bmN0aW9uPiB1ZGZzRGlmZihVc2VyRnVuY3Rpb25zIGJlZm9yZSwgVXNlckZ1bmN0aW9ucyBhZnRlcikKKyAgICB7CisgICAgICAgIHJldHVybiAoRnVuY3Rpb25zRGlmZjxVREZ1bmN0aW9uPikgRnVuY3Rpb25zRGlmZi5kaWZmKGJlZm9yZSwgYWZ0ZXIsIEZpbHRlci5VREYpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHN0YXRpYyBGdW5jdGlvbnNEaWZmPFVEQWdncmVnYXRlPiB1ZGFzRGlmZihVc2VyRnVuY3Rpb25zIGJlZm9yZSwgVXNlckZ1bmN0aW9ucyBhZnRlcikKKyAgICB7CisgICAgICAgIHJldHVybiAoRnVuY3Rpb25zRGlmZjxVREFnZ3JlZ2F0ZT4pIEZ1bmN0aW9uc0RpZmYuZGlmZihiZWZvcmUsIGFmdGVyLCBGaWx0ZXIuVURBKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZ1bmN0aW9uc0RpZmY8VCBleHRlbmRzIEZ1bmN0aW9uPiBleHRlbmRzIERpZmY8VXNlckZ1bmN0aW9ucywgVD4KKyAgICB7CisgICAgICAgIHN0YXRpYyBmaW5hbCBGdW5jdGlvbnNEaWZmIE5PTkUgPSBuZXcgRnVuY3Rpb25zRGlmZjw+KFVzZXJGdW5jdGlvbnMubm9uZSgpLCBVc2VyRnVuY3Rpb25zLm5vbmUoKSwgSW1tdXRhYmxlTGlzdC5vZigpKTsKKworICAgICAgICBwcml2YXRlIEZ1bmN0aW9uc0RpZmYoVXNlckZ1bmN0aW9ucyBjcmVhdGVkLCBVc2VyRnVuY3Rpb25zIGRyb3BwZWQsIEltbXV0YWJsZUNvbGxlY3Rpb248QWx0ZXJlZDxUPj4gYWx0ZXJlZCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoY3JlYXRlZCwgZHJvcHBlZCwgYWx0ZXJlZCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBGdW5jdGlvbnNEaWZmIGRpZmYoVXNlckZ1bmN0aW9ucyBiZWZvcmUsIFVzZXJGdW5jdGlvbnMgYWZ0ZXIsIEZpbHRlciBmaWx0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiZWZvcmUgPT0gYWZ0ZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5PTkU7CisKKyAgICAgICAgICAgIFVzZXJGdW5jdGlvbnMgY3JlYXRlZCA9IGFmdGVyLmZpbHRlcihmaWx0ZXIuYW5kKGsgLT4gIWJlZm9yZS5maW5kKGsubmFtZSgpLCBrLmFyZ1R5cGVzKCksIGZpbHRlcikuaXNQcmVzZW50KCkpKTsKKyAgICAgICAgICAgIFVzZXJGdW5jdGlvbnMgZHJvcHBlZCA9IGJlZm9yZS5maWx0ZXIoZmlsdGVyLmFuZChrIC0+ICFhZnRlci5maW5kKGsubmFtZSgpLCBrLmFyZ1R5cGVzKCksIGZpbHRlcikuaXNQcmVzZW50KCkpKTsKKworICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5CdWlsZGVyPEFsdGVyZWQ8VXNlckZ1bmN0aW9uPj4gYWx0ZXJlZCA9IEltbXV0YWJsZUxpc3QuYnVpbGRlcigpOworICAgICAgICAgICAgYmVmb3JlLnN0cmVhbSgpLmZpbHRlcihmaWx0ZXIpLmZvckVhY2goZnVuY3Rpb25CZWZvcmUgLT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhZnRlci5maW5kKGZ1bmN0aW9uQmVmb3JlLm5hbWUoKSwgZnVuY3Rpb25CZWZvcmUuYXJnVHlwZXMoKSwgZmlsdGVyKS5pZlByZXNlbnQoZnVuY3Rpb25BZnRlciAtPgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25CZWZvcmUuY29tcGFyZShmdW5jdGlvbkFmdGVyKS5pZlByZXNlbnQoa2luZCAtPiBhbHRlcmVkLmFkZChuZXcgQWx0ZXJlZDw+KGZ1bmN0aW9uQmVmb3JlLCBmdW5jdGlvbkFmdGVyLCBraW5kKSkpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25zRGlmZjw+KGNyZWF0ZWQsIGRyb3BwZWQsIGFsdGVyZWQuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvVmlld01ldGFkYXRhLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvVmlld01ldGFkYXRhLmphdmEKaW5kZXggMDA1MzI0OS4uZGYyNmExMyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1ZpZXdNZXRhZGF0YS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9WaWV3TWV0YWRhdGEuamF2YQpAQCAtMjAsMTAgKzIwLDEzIEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiAKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworCiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLmJ1aWxkZXIuSGFzaENvZGVCdWlsZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlRvU3RyaW5nQnVpbGRlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nLkNvbHVtbk1hc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Vc2VyVHlwZTsKIAogcHVibGljIGZpbmFsIGNsYXNzIFZpZXdNZXRhZGF0YSBpbXBsZW1lbnRzIFNjaGVtYUVsZW1lbnQKQEAgLTE1OCw2ICsxNjEsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEudW5idWlsZCgpLmFkZENvbHVtbihjb2x1bW4pLmJ1aWxkKCkpOwogICAgIH0KIAorICAgIHB1YmxpYyBWaWV3TWV0YWRhdGEgd2l0aE5ld0NvbHVtbk1hc2soQ29sdW1uSWRlbnRpZmllciBuYW1lLCBATnVsbGFibGUgQ29sdW1uTWFzayBtYXNrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBWaWV3TWV0YWRhdGEoYmFzZVRhYmxlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VUYWJsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVBbGxDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUNsYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEudW5idWlsZCgpLmFsdGVyQ29sdW1uTWFzayhuYW1lLCBtYXNrKS5idWlsZCgpKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBhcHBlbmRDcWxUbyhDcWxCdWlsZGVyIGJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbnRlcm5hbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpZk5vdEV4aXN0cykKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0Fic3RyYWN0U3NsQ29udGV4dEZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0Fic3RyYWN0U3NsQ29udGV4dEZhY3RvcnkuamF2YQppbmRleCBjMmVmODUxLi40MDZjNDcyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9BYnN0cmFjdFNzbENvbnRleHRGYWN0b3J5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvQWJzdHJhY3RTc2xDb250ZXh0RmFjdG9yeS5qYXZhCkBAIC0zNSw3ICszNSw4IEBACiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuU3NsQ29udGV4dDsKIGltcG9ydCBpby5uZXR0eS5oYW5kbGVyLnNzbC5Tc2xDb250ZXh0QnVpbGRlcjsKIGltcG9ydCBpby5uZXR0eS5oYW5kbGVyLnNzbC5Tc2xQcm92aWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRElTQUJMRV9UQ0FDVElWRV9PUEVOU1NMOwogCiAvKioKICAqIEFic3RyYWN0IGNsYXNzIGltcGxlbWVudGluZyB7QGNvZGUgSVNzbENvbnRleHRGYWNvdHJ5fSB0byBwcm92aWRlIG1vc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgdGhhdCBhbnkKQEAgLTEwOSwxMiArMTEwLDEzIEBACiAKICAgICAvKioKICAgICAgKiBEZXJ2aWVzIGlmIHtAY29kZSBPcGVuU1NMfSBpcyBhdmFpbGFibGUuIEl0IGFsbG93cyBpbi1qdm0gZHRlc3RzIHRvIGRpc2FibGUgdGNuYXRpdmUgb3BlbnNzbCBzdXBwb3J0IGJ5Ci0gICAgICogc2V0dGluZyB7QGNvZGUgY2Fzc2FuZHJhLmRpc2FibGVfdGNhY3RpdmVfb3BlbnNzbH0gc3lzdGVtIHByb3BlcnR5IGFzIHtAY29kZSB0cnVlfS4gT3RoZXJ3aXNlLCBpdCBjcmVhdGVzIGEKLSAgICAgKiBjaXJjdWxhciByZWZlcmVuY2UgdGhhdCBwcmV2ZW50cyB0aGUgaW5zdGFuY2UgY2xhc3MgbG9hZGVyIGZyb20gYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgICAgICogc2V0dGluZyB7QGxpbmsgIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMjRElTQUJMRV9UQ0FDVElWRV9PUEVOU1NMfQorICAgICAqIHN5c3RlbSBwcm9wZXJ0eSBhcyB7QGNvZGUgdHJ1ZX0uIE90aGVyd2lzZSwgaXQgY3JlYXRlcyBhIGNpcmN1bGFyIHJlZmVyZW5jZSB0aGF0IHByZXZlbnRzIHRoZSBpbnN0YW5jZQorICAgICAqIGNsYXNzIGxvYWRlciBmcm9tIGJlaW5nIGdhcmJhZ2UgY29sbGVjdGVkLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGRlcml2ZUlmT3BlblNzbEF2YWlsYWJsZSgpCiAgICAgewotICAgICAgICBpZiAoQm9vbGVhbi5nZXRCb29sZWFuKENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiZGlzYWJsZV90Y2FjdGl2ZV9vcGVuc3NsIikpCisgICAgICAgIGlmIChESVNBQkxFX1RDQUNUSVZFX09QRU5TU0wuZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgb3BlblNzbElzQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIG9wZW5Tc2xJc0F2YWlsYWJsZSA9IE9wZW5Tc2wuaXNBdmFpbGFibGUoKTsKQEAgLTE3OCwxNSArMTgwLDE2IEBACiAgICAgICAgICAgICBrZXkgZmlsZSBpbiBQRU0gZm9ybWF0IChzZWUge0BsaW5rIFNzbENvbnRleHRCdWlsZGVyI2ZvclNlcnZlcihGaWxlLCBGaWxlLCBTdHJpbmcpfSkuIEhvd2V2ZXIsIHdlIGFyZQogICAgICAgICAgICAgbm90IHN1cHBvcnRpbmcgdGhhdCBub3cgdG8ga2VlcCB0aGUgY29uZmlnL3lhbWwgQVBJIHNpbXBsZS4KICAgICAgICAgICovCi0gICAgICAgIEtleU1hbmFnZXJGYWN0b3J5IGttZiA9IGJ1aWxkS2V5TWFuYWdlckZhY3RvcnkoKTsKICAgICAgICAgU3NsQ29udGV4dEJ1aWxkZXIgYnVpbGRlcjsKICAgICAgICAgaWYgKHNvY2tldFR5cGUgPT0gU29ja2V0VHlwZS5TRVJWRVIpCiAgICAgICAgIHsKKyAgICAgICAgICAgIEtleU1hbmFnZXJGYWN0b3J5IGttZiA9IGJ1aWxkS2V5TWFuYWdlckZhY3RvcnkoKTsKICAgICAgICAgICAgIGJ1aWxkZXIgPSBTc2xDb250ZXh0QnVpbGRlci5mb3JTZXJ2ZXIoa21mKS5jbGllbnRBdXRoKHRoaXMucmVxdWlyZV9jbGllbnRfYXV0aCA/IENsaWVudEF1dGguUkVRVUlSRSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRBdXRoLk5PTkUpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgeworICAgICAgICAgICAgS2V5TWFuYWdlckZhY3Rvcnkga21mID0gYnVpbGRPdXRib3VuZEtleU1hbmFnZXJGYWN0b3J5KCk7CiAgICAgICAgICAgICBidWlsZGVyID0gU3NsQ29udGV4dEJ1aWxkZXIuZm9yQ2xpZW50KCkua2V5TWFuYWdlcihrbWYpOwogICAgICAgICB9CiAKQEAgLTI2Myw0ICsyNjYsMTIgQEAKICAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgS2V5TWFuYWdlckZhY3RvcnkgYnVpbGRLZXlNYW5hZ2VyRmFjdG9yeSgpIHRocm93cyBTU0xFeGNlcHRpb247CiAKICAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgVHJ1c3RNYW5hZ2VyRmFjdG9yeSBidWlsZFRydXN0TWFuYWdlckZhY3RvcnkoKSB0aHJvd3MgU1NMRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0Bjb2RlIEtleU1hbmFnZXJGYWN0b3J5fSBmb3Igb3V0Ym91bmQgY29ubmVjdGlvbnMuCisgICAgICogSXQgcHJvdmlkZXMgYSBzZXBlcmF0ZSBrZXlzdG9yZSBmb3IgaW50ZXJub2RlIG1UTFMgb3V0Ym91bmQgY29ubmVjdGlvbnMuCisgICAgICogQHJldHVybiB7QGNvZGUgS2V5TWFuYWdlckZhY3Rvcnl9CisgICAgICogQHRocm93cyBTU0xFeGNlcHRpb24KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBwcm90ZWN0ZWQgS2V5TWFuYWdlckZhY3RvcnkgYnVpbGRPdXRib3VuZEtleU1hbmFnZXJGYWN0b3J5KCkgdGhyb3dzIFNTTEV4Y2VwdGlvbjsKIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0Rpc2FibGVTc2xDb250ZXh0RmFjdG9yeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvRGlzYWJsZVNzbENvbnRleHRGYWN0b3J5LmphdmEKaW5kZXggOWRhYjA2Mi4uODA1OGQwYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvRGlzYWJsZVNzbENvbnRleHRGYWN0b3J5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvRGlzYWJsZVNzbENvbnRleHRGYWN0b3J5LmphdmEKQEAgLTM3LDEyICszNywyNCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBLZXlNYW5hZ2VyRmFjdG9yeSBidWlsZE91dGJvdW5kS2V5TWFuYWdlckZhY3RvcnkoKSB0aHJvd3MgU1NMRXhjZXB0aW9uCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBoYXNLZXlzdG9yZSgpCiAgICAgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzT3V0Ym91bmRLZXlzdG9yZSgpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgaW5pdEhvdFJlbG9hZGluZygpIHRocm93cyBTU0xFeGNlcHRpb24KICAgICB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvRmlsZUJhc2VkU3NsQ29udGV4dEZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0ZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5LmphdmEKaW5kZXggOTg3NmViNC4uZmRmNjY5NiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvRmlsZUJhc2VkU3NsQ29udGV4dEZhY3RvcnkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9GaWxlQmFzZWRTc2xDb250ZXh0RmFjdG9yeS5qYXZhCkBAIC0zMiw3ICszMiw2IEBACiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xFeGNlcHRpb247CiBpbXBvcnQgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5OwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CkBAIC00NywzOCArNDYsMzIgQEAKICAqIHtAY29kZSBDQVVUSU9OOn0gV2hpbGUgdGhpcyBpcyBhIHVzZWZ1bCBhYnN0cmFjdGlvbiwgcGxlYXNlIGJlIGNhcmVmdWwgaWYgeW91IG5lZWQgdG8gbW9kaWZ5IHRoaXMgY2xhc3MKICAqIGdpdmVuIHBvc3NpYmxlIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgb3V0IHRoZXJlIQogICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgRmlsZUJhc2VkU3NsQ29udGV4dEZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNzbENvbnRleHRGYWN0b3J5CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRmlsZUJhc2VkU3NsQ29udGV4dEZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdFNzbENvbnRleHRGYWN0b3J5CiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5LmNsYXNzKTsKLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHByb3RlY3RlZCB2b2xhdGlsZSBib29sZWFuIGNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICBwcm90ZWN0ZWQgRmlsZUJhc2VkU3RvcmVDb250ZXh0IGtleXN0b3JlQ29udGV4dDsKKyAgICBwcm90ZWN0ZWQgRmlsZUJhc2VkU3RvcmVDb250ZXh0IG91dGJvdW5kS2V5c3RvcmVDb250ZXh0OworICAgIHByb3RlY3RlZCBGaWxlQmFzZWRTdG9yZUNvbnRleHQgdHJ1c3RTdG9yZUNvbnRleHQ7CiAKICAgICAvKioKICAgICAgKiBMaXN0IG9mIGZpbGVzIHRoYXQgdHJpZ2dlciBob3QgcmVsb2FkaW5nIG9mIFNTTCBjZXJ0aWZpY2F0ZXMKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9sYXRpbGUgTGlzdDxIb3RSZWxvYWRhYmxlRmlsZT4gaG90UmVsb2FkYWJsZUZpbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleXN0b3JlOwotICAgIHByb3RlY3RlZCBTdHJpbmcga2V5c3RvcmVfcGFzc3dvcmQ7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyB0cnVzdHN0b3JlOwotICAgIHByb3RlY3RlZCBTdHJpbmcgdHJ1c3RzdG9yZV9wYXNzd29yZDsKLQogICAgIHB1YmxpYyBGaWxlQmFzZWRTc2xDb250ZXh0RmFjdG9yeSgpCiAgICAgewotICAgICAgICBrZXlzdG9yZSA9ICJjb25mLy5rZXlzdG9yZSI7Ci0gICAgICAgIGtleXN0b3JlX3Bhc3N3b3JkID0gImNhc3NhbmRyYSI7Ci0gICAgICAgIHRydXN0c3RvcmUgPSAiY29uZi8udHJ1c3RzdG9yZSI7Ci0gICAgICAgIHRydXN0c3RvcmVfcGFzc3dvcmQgPSAiY2Fzc2FuZHJhIjsKKyAgICAgICAga2V5c3RvcmVDb250ZXh0ID0gbmV3IEZpbGVCYXNlZFN0b3JlQ29udGV4dCgiY29uZi8ua2V5c3RvcmUiLCAiY2Fzc2FuZHJhIik7CisgICAgICAgIG91dGJvdW5kS2V5c3RvcmVDb250ZXh0ID0gbmV3IEZpbGVCYXNlZFN0b3JlQ29udGV4dCgiY29uZi8ua2V5c3RvcmUiLCAiY2Fzc2FuZHJhIik7CisgICAgICAgIHRydXN0U3RvcmVDb250ZXh0ID0gbmV3IEZpbGVCYXNlZFN0b3JlQ29udGV4dCgiY29uZi8udHJ1c3RzdG9yZSIsICJjYXNzYW5kcmEiKTsKICAgICB9CiAKICAgICBwdWJsaWMgRmlsZUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzKQogICAgIHsKICAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7Ci0gICAgICAgIGtleXN0b3JlID0gZ2V0U3RyaW5nKCJrZXlzdG9yZSIpOwotICAgICAgICBrZXlzdG9yZV9wYXNzd29yZCA9IGdldFN0cmluZygia2V5c3RvcmVfcGFzc3dvcmQiKTsKLSAgICAgICAgdHJ1c3RzdG9yZSA9IGdldFN0cmluZygidHJ1c3RzdG9yZSIpOwotICAgICAgICB0cnVzdHN0b3JlX3Bhc3N3b3JkID0gZ2V0U3RyaW5nKCJ0cnVzdHN0b3JlX3Bhc3N3b3JkIik7CisgICAgICAgIGtleXN0b3JlQ29udGV4dCA9IG5ldyBGaWxlQmFzZWRTdG9yZUNvbnRleHQoZ2V0U3RyaW5nKCJrZXlzdG9yZSIpLCBnZXRTdHJpbmcoImtleXN0b3JlX3Bhc3N3b3JkIikpOworICAgICAgICBvdXRib3VuZEtleXN0b3JlQ29udGV4dCA9IG5ldyBGaWxlQmFzZWRTdG9yZUNvbnRleHQoU3RyaW5nVXRpbHMuZGVmYXVsdFN0cmluZyhnZXRTdHJpbmcoIm91dGJvdW5kX2tleXN0b3JlIiksIGtleXN0b3JlQ29udGV4dC5maWxlUGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdVdGlscy5kZWZhdWx0U3RyaW5nKGdldFN0cmluZygib3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQiKSwga2V5c3RvcmVDb250ZXh0LnBhc3N3b3JkKSk7CisgICAgICAgIHRydXN0U3RvcmVDb250ZXh0ID0gbmV3IEZpbGVCYXNlZFN0b3JlQ29udGV4dChnZXRTdHJpbmcoInRydXN0c3RvcmUiKSwgZ2V0U3RyaW5nKCJ0cnVzdHN0b3JlX3Bhc3N3b3JkIikpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtOTAsMzAgKzgzLDQxIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaGFzS2V5c3RvcmUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGtleXN0b3JlICE9IG51bGwgJiYgbmV3IEZpbGUoa2V5c3RvcmUpLmV4aXN0cygpOworICAgICAgICByZXR1cm4ga2V5c3RvcmVDb250ZXh0Lmhhc0tleXN0b3JlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzT3V0Ym91bmRLZXlzdG9yZSgpCisgICAgeworICAgICAgICByZXR1cm4gb3V0Ym91bmRLZXlzdG9yZUNvbnRleHQuaGFzS2V5c3RvcmUoKTsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gaGFzVHJ1c3RzdG9yZSgpCiAgICAgewotICAgICAgICByZXR1cm4gdHJ1c3RzdG9yZSAhPSBudWxsICYmIG5ldyBGaWxlKHRydXN0c3RvcmUpLmV4aXN0cygpOworICAgICAgICByZXR1cm4gdHJ1c3RTdG9yZUNvbnRleHQuZmlsZVBhdGggIT0gbnVsbCAmJiBuZXcgRmlsZSh0cnVzdFN0b3JlQ29udGV4dC5maWxlUGF0aCkuZXhpc3RzKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluaXRIb3RSZWxvYWRpbmcoKQogICAgIHsKICAgICAgICAgYm9vbGVhbiBoYXNLZXlzdG9yZSA9IGhhc0tleXN0b3JlKCk7CisgICAgICAgIGJvb2xlYW4gaGFzT3V0Ym91bmRLZXlzdG9yZSA9IGhhc091dGJvdW5kS2V5c3RvcmUoKTsKICAgICAgICAgYm9vbGVhbiBoYXNUcnVzdHN0b3JlID0gaGFzVHJ1c3RzdG9yZSgpOwogCi0gICAgICAgIGlmIChoYXNLZXlzdG9yZSB8fCBoYXNUcnVzdHN0b3JlKQorICAgICAgICBpZiAoaGFzS2V5c3RvcmUgfHwgaGFzT3V0Ym91bmRLZXlzdG9yZSB8fCBoYXNUcnVzdHN0b3JlKQogICAgICAgICB7CiAgICAgICAgICAgICBMaXN0PEhvdFJlbG9hZGFibGVGaWxlPiBmaWxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAgICAgaWYgKGhhc0tleXN0b3JlKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGVMaXN0LmFkZChuZXcgSG90UmVsb2FkYWJsZUZpbGUoa2V5c3RvcmUpKTsKKyAgICAgICAgICAgICAgICBmaWxlTGlzdC5hZGQobmV3IEhvdFJlbG9hZGFibGVGaWxlKGtleXN0b3JlQ29udGV4dC5maWxlUGF0aCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhc091dGJvdW5kS2V5c3RvcmUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsZUxpc3QuYWRkKG5ldyBIb3RSZWxvYWRhYmxlRmlsZShvdXRib3VuZEtleXN0b3JlQ29udGV4dC5maWxlUGF0aCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGhhc1RydXN0c3RvcmUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmlsZUxpc3QuYWRkKG5ldyBIb3RSZWxvYWRhYmxlRmlsZSh0cnVzdHN0b3JlKSk7CisgICAgICAgICAgICAgICAgZmlsZUxpc3QuYWRkKG5ldyBIb3RSZWxvYWRhYmxlRmlsZSh0cnVzdFN0b3JlQ29udGV4dC5maWxlUGF0aCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaG90UmVsb2FkYWJsZUZpbGVzID0gZmlsZUxpc3Q7CiAgICAgICAgIH0KQEAgLTEyMiwxNSArMTI2LDE4IEBACiAgICAgLyoqCiAgICAgICogVmFsaWRhdGVzIHRoZSBnaXZlbiBrZXlzdG9yZSBwYXNzd29yZC4KICAgICAgKgorICAgICAqIEBwYXJhbSBpc091dGJvdW5kS2V5c3RvcmUge0Bjb2RlIHRydWV9IGZvciB0aGUge0Bjb2RlIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkfTt7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQogICAgICAqIEBwYXJhbSBwYXNzd29yZCAgICAgICAgICAgdmFsdWUKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUge0Bjb2RlIHBhc3N3b3JkfSBpcyBlbXB0eSBhcyBwZXIgdGhlIGRlZmluaXRpb24gb2Yge0BsaW5rIFN0cmluZ1V0aWxzI2lzRW1wdHkoQ2hhclNlcXVlbmNlKX0KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkKKyAgICBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBhc3N3b3JkKGJvb2xlYW4gaXNPdXRib3VuZEtleXN0b3JlLCBTdHJpbmcgcGFzc3dvcmQpCiAgICAgewogICAgICAgICBib29sZWFuIGtleXN0b3JlUGFzc3dvcmRFbXB0eSA9IFN0cmluZ1V0aWxzLmlzRW1wdHkocGFzc3dvcmQpOwogICAgICAgICBpZiAoa2V5c3RvcmVQYXNzd29yZEVtcHR5KQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIna2V5c3RvcmVfcGFzc3dvcmQnIG11c3QgYmUgc3BlY2lmaWVkIik7CisgICAgICAgICAgICBTdHJpbmcga2V5TmFtZSA9IGlzT3V0Ym91bmRLZXlzdG9yZSA/ICJvdXRib3VuZF8iIDogIiI7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiJyVza2V5c3RvcmVfcGFzc3dvcmQnIG11c3QgYmUgc3BlY2lmaWVkIiwga2V5TmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1zZyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0MCw2ICsxNDcsOCBAQAogICAgICAqCiAgICAgICogQHJldHVybiBLZXlNYW5hZ2VyRmFjdG9yeSBidWlsdCBmcm9tIHRoZSBmaWxlIGJhc2VkIGtleXN0b3JlLgogICAgICAqIEB0aHJvd3MgU1NMRXhjZXB0aW9uIGlmIGFueSBpc3N1ZXMgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHZhbGlkYXRpb24gZm9yIHRoZSB7QGNvZGUga2V5c3RvcmVfcGFzc3dvcmR9IGZhaWxzCisgICAgICogQHNlZSAjdmFsaWRhdGVQYXNzd29yZChib29sZWFuLCBTdHJpbmcpCiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIEtleU1hbmFnZXJGYWN0b3J5IGJ1aWxkS2V5TWFuYWdlckZhY3RvcnkoKSB0aHJvd3MgU1NMRXhjZXB0aW9uCkBAIC0xNDgsMjYgKzE1NywxOSBAQAogICAgICAgICAgKiBWYWxpZGF0aW9uIG9mIHRoZSBwYXNzd29yZCBpcyBkZWxheWVkIHVudGlsIHRoaXMgcG9pbnQgdG8gYWxsb3cgbnVsbGFibGUga2V5c3RvcmUgcGFzc3dvcmRzCiAgICAgICAgICAqIGZvciBvdGhlciB1c2UtY2FzZXMgKENBU1NBTkRSQS0xODEyNCkuCiAgICAgICAgICAqLwotICAgICAgICB2YWxpZGF0ZVBhc3N3b3JkKGtleXN0b3JlX3Bhc3N3b3JkKTsKKyAgICAgICAgdmFsaWRhdGVQYXNzd29yZChmYWxzZSwga2V5c3RvcmVDb250ZXh0LnBhc3N3b3JkKTsKKyAgICAgICAgcmV0dXJuIGdldEtleU1hbmFnZXJGYWN0b3J5KGtleXN0b3JlQ29udGV4dCk7CisgICAgfQogCi0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0ga3NmID0gRmlsZXMubmV3SW5wdXRTdHJlYW0oRmlsZS5nZXRQYXRoKGtleXN0b3JlKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhbGdvcml0aG0gPSB0aGlzLmFsZ29yaXRobSA9PSBudWxsID8gS2V5TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpIDogdGhpcy5hbGdvcml0aG07Ci0gICAgICAgICAgICBLZXlNYW5hZ2VyRmFjdG9yeSBrbWYgPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShhbGdvcml0aG0pOwotICAgICAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShzdG9yZV90eXBlKTsKLSAgICAgICAgICAgIGtzLmxvYWQoa3NmLCBrZXlzdG9yZV9wYXNzd29yZC50b0NoYXJBcnJheSgpKTsKLSAgICAgICAgICAgIGlmICghY2hlY2tlZEV4cGlyeSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGVja0V4cGlyZWRDZXJ0cyhrcyk7Ci0gICAgICAgICAgICAgICAgY2hlY2tlZEV4cGlyeSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBrbWYuaW5pdChrcywga2V5c3RvcmVfcGFzc3dvcmQudG9DaGFyQXJyYXkoKSk7Ci0gICAgICAgICAgICByZXR1cm4ga21mOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFNTTEV4Y2VwdGlvbigiZmFpbGVkIHRvIGJ1aWxkIGtleSBtYW5hZ2VyIHN0b3JlIGZvciBzZWN1cmUgY29ubmVjdGlvbnMiLCBlKTsKLSAgICAgICAgfQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBLZXlNYW5hZ2VyRmFjdG9yeSBidWlsZE91dGJvdW5kS2V5TWFuYWdlckZhY3RvcnkoKSB0aHJvd3MgU1NMRXhjZXB0aW9uCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBWYWxpZGF0aW9uIG9mIHRoZSBwYXNzd29yZCBpcyBkZWxheWVkIHVudGlsIHRoaXMgcG9pbnQgdG8gYWxsb3cgbnVsbGFibGUga2V5c3RvcmUgcGFzc3dvcmRzCisgICAgICAgICAqIGZvciBvdGhlciB1c2UtY2FzZXMgKENBU1NBTkRSQS0xODEyNCkuCisgICAgICAgICAqLworICAgICAgICB2YWxpZGF0ZVBhc3N3b3JkKHRydWUsIG91dGJvdW5kS2V5c3RvcmVDb250ZXh0LnBhc3N3b3JkKTsKKyAgICAgICAgcmV0dXJuIGdldEtleU1hbmFnZXJGYWN0b3J5KG91dGJvdW5kS2V5c3RvcmVDb250ZXh0KTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3OSwxMyArMTgxLDEzIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIFRydXN0TWFuYWdlckZhY3RvcnkgYnVpbGRUcnVzdE1hbmFnZXJGYWN0b3J5KCkgdGhyb3dzIFNTTEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSB0c2YgPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShGaWxlLmdldFBhdGgodHJ1c3RzdG9yZSkpKQorICAgICAgICB0cnkgKElucHV0U3RyZWFtIHRzZiA9IEZpbGVzLm5ld0lucHV0U3RyZWFtKEZpbGUuZ2V0UGF0aCh0cnVzdFN0b3JlQ29udGV4dC5maWxlUGF0aCkpKQogICAgICAgICB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWxnb3JpdGhtID0gdGhpcy5hbGdvcml0aG0gPT0gbnVsbCA/IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0RGVmYXVsdEFsZ29yaXRobSgpIDogdGhpcy5hbGdvcml0aG07CiAgICAgICAgICAgICBUcnVzdE1hbmFnZXJGYWN0b3J5IHRtZiA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtKTsKICAgICAgICAgICAgIEtleVN0b3JlIHRzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2Uoc3RvcmVfdHlwZSk7CiAKLSAgICAgICAgICAgIGZpbmFsIGNoYXJbXSB0cnVzdHN0b3JlUGFzc3dvcmQgPSBTdHJpbmdVdGlscy5pc0VtcHR5KHRydXN0c3RvcmVfcGFzc3dvcmQpID8gbnVsbCA6IHRydXN0c3RvcmVfcGFzc3dvcmQudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgICAgIGZpbmFsIGNoYXJbXSB0cnVzdHN0b3JlUGFzc3dvcmQgPSBTdHJpbmdVdGlscy5pc0VtcHR5KHRydXN0U3RvcmVDb250ZXh0LnBhc3N3b3JkKSA/IG51bGwgOiB0cnVzdFN0b3JlQ29udGV4dC5wYXNzd29yZC50b0NoYXJBcnJheSgpOwogICAgICAgICAgICAgdHMubG9hZCh0c2YsIHRydXN0c3RvcmVQYXNzd29yZCk7CiAgICAgICAgICAgICB0bWYuaW5pdCh0cyk7CiAgICAgICAgICAgICByZXR1cm4gdG1mOwpAQCAtMTk2LDYgKzE5OCwyOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSBLZXlNYW5hZ2VyRmFjdG9yeSBnZXRLZXlNYW5hZ2VyRmFjdG9yeShmaW5hbCBGaWxlQmFzZWRTdG9yZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIFNTTEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBrc2YgPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShGaWxlLmdldFBhdGgoY29udGV4dC5maWxlUGF0aCkpKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWxnb3JpdGhtID0gdGhpcy5hbGdvcml0aG0gPT0gbnVsbCA/IEtleU1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKSA6IHRoaXMuYWxnb3JpdGhtOworICAgICAgICAgICAgS2V5TWFuYWdlckZhY3Rvcnkga21mID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtKTsKKyAgICAgICAgICAgIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2Uoc3RvcmVfdHlwZSk7CisgICAgICAgICAgICBrcy5sb2FkKGtzZiwgY29udGV4dC5wYXNzd29yZC50b0NoYXJBcnJheSgpKTsKKworICAgICAgICAgICAgaWYgKCFjb250ZXh0LmNoZWNrZWRFeHBpcnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hlY2tFeHBpcmVkQ2VydHMoa3MpOworICAgICAgICAgICAgICAgIGNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrbWYuaW5pdChrcywgY29udGV4dC5wYXNzd29yZC50b0NoYXJBcnJheSgpKTsKKyAgICAgICAgICAgIHJldHVybiBrbWY7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU1NMRXhjZXB0aW9uKCJmYWlsZWQgdG8gYnVpbGQga2V5IG1hbmFnZXIgc3RvcmUgZm9yIHNlY3VyZSBjb25uZWN0aW9ucyIsIGUpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tFeHBpcmVkQ2VydHMoS2V5U3RvcmUga3MpIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgYm9vbGVhbiBoYXNFeHBpcmVkQ2VydHMgPSBmYWxzZTsKQEAgLTI0Nyw0ICsyNzIsMjcgQEAKICAgICAgICAgICAgICAgICAgICAnfSc7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEZpbGVCYXNlZFN0b3JlQ29udGV4dAorICAgIHsKKyAgICAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBwdWJsaWMgU3RyaW5nIGZpbGVQYXRoOworICAgICAgICBwdWJsaWMgU3RyaW5nIHBhc3N3b3JkOworCisgICAgICAgIHB1YmxpYyBGaWxlQmFzZWRTdG9yZUNvbnRleHQoU3RyaW5nIGtleXN0b3JlLCBTdHJpbmcga2V5c3RvcmVQYXNzd29yZCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5maWxlUGF0aCA9IGtleXN0b3JlOworICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IGtleXN0b3JlUGFzc3dvcmQ7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNLZXlzdG9yZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmaWxlUGF0aCAhPSBudWxsICYmIG5ldyBGaWxlKGZpbGVQYXRoKS5leGlzdHMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHBhc3N3b3JkTWF0Y2hlc0lmUHJlc2VudChTdHJpbmcga2V5UGFzc3dvcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5pc0VtcHR5KHBhc3N3b3JkKSB8fCBrZXlQYXNzd29yZC5lcXVhbHMocGFzc3dvcmQpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvSVNzbENvbnRleHRGYWN0b3J5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9JU3NsQ29udGV4dEZhY3RvcnkuamF2YQppbmRleCA1NzljOTVlLi4xMWM0NzE3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9JU3NsQ29udGV4dEZhY3RvcnkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9JU3NsQ29udGV4dEZhY3RvcnkuamF2YQpAQCAtMTAwLDYgKzEwMCwxNiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFJldHVybnMgaWYgdGhpcyBmYWN0b3J5IHVzZXMgb3V0Ym91bmQga2V5c3RvcmUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBieSBkZWZhdWx0IHVubGVzcyB0aGUgaW1wbGVtZW50YXRpb24gb3ZlcnJpZGVzIHRoaXMKKyAgICAgKi8KKyAgICBkZWZhdWx0IGJvb2xlYW4gaGFzT3V0Ym91bmRLZXlzdG9yZSgpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgcHJlcGFyZWQgbGlzdCBvZiBhY2NlcHRlZCBwcm90b2NvbHMuCiAgICAgICoKICAgICAgKiBAcmV0dXJuIGFycmF5IG9mIHByb3RvY29sIG5hbWVzIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIE5ldHR5J3MgU3NsQ29udGV4dEJ1aWxkZXIucHJvdG9jb2xzLCBvciBudWxsIGlmIHRoZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeS5qYXZhCmluZGV4IGQ2MmFlZjUuLjYyZTJkNGMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5LmphdmEKQEAgLTg5LDQyICs4OSw1MCBAQAogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVEFSR0VUX1NUT1JFVFlQRSA9ICJQS0NTMTIiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5LmNsYXNzKTsKLSAgICBwcml2YXRlIFN0cmluZyBwZW1FbmNvZGVkS2V5OwotICAgIHByaXZhdGUgU3RyaW5nIGtleVBhc3N3b3JkOwotICAgIHByaXZhdGUgU3RyaW5nIHBlbUVuY29kZWRDZXJ0aWZpY2F0ZXM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1heWJlRmlsZUJhc2VkUHJpdmF0ZUtleTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbWF5YmVGaWxlQmFzZWRUcnVzdGVkQ2VydGlmaWNhdGVzOworICAgIHByaXZhdGUgUEVNQmFzZWRLZXlTdG9yZUNvbnRleHQgcGVtRW5jb2RlZFRydXN0Q2VydGlmaWNhdGVzOworICAgIHByaXZhdGUgUEVNQmFzZWRLZXlTdG9yZUNvbnRleHQgcGVtRW5jb2RlZEtleUNvbnRleHQ7CisgICAgcHJpdmF0ZSBQRU1CYXNlZEtleVN0b3JlQ29udGV4dCBwZW1FbmNvZGVkT3V0Ym91bmRLZXlDb250ZXh0OwogCiAgICAgcHVibGljIFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoKQogICAgIHsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVQYXNzd29yZHMoKQorICAgIHsKKyAgICAgICAgYm9vbGVhbiBzaG91bGRUaHJvdyA9ICFrZXlzdG9yZUNvbnRleHQucGFzc3dvcmRNYXRjaGVzSWZQcmVzZW50KHBlbUVuY29kZWRLZXlDb250ZXh0LnBhc3N3b3JkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW91dGJvdW5kS2V5c3RvcmVDb250ZXh0LnBhc3N3b3JkTWF0Y2hlc0lmUHJlc2VudChwZW1FbmNvZGVkT3V0Ym91bmRLZXlDb250ZXh0LnBhc3N3b3JkKTsKKyAgICAgICAgYm9vbGVhbiBvdXRib3VuZFBhc3N3b3JkTWlzbWF0Y2ggPSAhb3V0Ym91bmRLZXlzdG9yZUNvbnRleHQucGFzc3dvcmRNYXRjaGVzSWZQcmVzZW50KHBlbUVuY29kZWRPdXRib3VuZEtleUNvbnRleHQucGFzc3dvcmQpOworICAgICAgICBTdHJpbmcga2V5TmFtZSA9IG91dGJvdW5kUGFzc3dvcmRNaXNtYXRjaCA/ICJvdXRib3VuZF8iIDogIiI7CisKKyAgICAgICAgaWYgKHNob3VsZFRocm93KQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdCgiJyVza2V5c3RvcmVfcGFzc3dvcmQnIGFuZCAnJXNrZXlfcGFzc3dvcmQnIGJvdGggY29uZmlndXJhdGlvbnMgYXJlIGdpdmVuIGFuZCB0aGUgdmFsdWVzIGRvIG5vdCBtYXRjaCIsIGtleU5hbWUsIGtleU5hbWUpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtc2cpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzKQogICAgIHsKICAgICAgICAgc3VwZXIocGFyYW1ldGVycyk7Ci0gICAgICAgIHBlbUVuY29kZWRLZXkgPSBnZXRTdHJpbmcoQ29uZmlnS2V5LkVOQ09ERURfS0VZLmdldEtleU5hbWUoKSk7Ci0gICAgICAgIGtleVBhc3N3b3JkID0gZ2V0U3RyaW5nKENvbmZpZ0tleS5LRVlfUEFTU1dPUkQuZ2V0S2V5TmFtZSgpKTsKLSAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHkoa2V5UGFzc3dvcmQpKQotICAgICAgICB7Ci0gICAgICAgICAgICBrZXlQYXNzd29yZCA9IGtleXN0b3JlX3Bhc3N3b3JkOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFTdHJpbmdVdGlscy5pc0VtcHR5KGtleXN0b3JlX3Bhc3N3b3JkKSAmJiAha2V5UGFzc3dvcmQuZXF1YWxzKGtleXN0b3JlX3Bhc3N3b3JkKSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJ2tleXN0b3JlX3Bhc3N3b3JkJyBhbmQgJ2tleV9wYXNzd29yZCcgYm90aCBjb25maWd1cmF0aW9ucyBhcmUgZ2l2ZW4gYW5kIHRoZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlcyBkbyBub3QgbWF0Y2giKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgcGVtRW5jb2RlZEtleSA9IGdldFN0cmluZyhDb25maWdLZXkuRU5DT0RFRF9LRVkuZ2V0S2V5TmFtZSgpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBlbUVuY29kZWRLZXlQYXNzd29yZCA9IFN0cmluZ1V0aWxzLmRlZmF1bHRTdHJpbmcoZ2V0U3RyaW5nKENvbmZpZ0tleS5LRVlfUEFTU1dPUkQuZ2V0S2V5TmFtZSgpKSwga2V5c3RvcmVDb250ZXh0LnBhc3N3b3JkKTsKKyAgICAgICAgcGVtRW5jb2RlZEtleUNvbnRleHQgPSBuZXcgUEVNQmFzZWRLZXlTdG9yZUNvbnRleHQocGVtRW5jb2RlZEtleSwgcGVtRW5jb2RlZEtleVBhc3N3b3JkLCBTdHJpbmdVdGlscy5pc0VtcHR5KHBlbUVuY29kZWRLZXkpLCBrZXlzdG9yZUNvbnRleHQpOwogCi0gICAgICAgIGlmICghU3RyaW5nVXRpbHMuaXNFbXB0eSh0cnVzdHN0b3JlX3Bhc3N3b3JkKSkKKyAgICAgICAgZmluYWwgU3RyaW5nIHBlbUVuY29kZWRPdXRib3VuZEtleSA9IFN0cmluZ1V0aWxzLmRlZmF1bHRTdHJpbmcoZ2V0U3RyaW5nKENvbmZpZ0tleS5PVVRCT1VORF9FTkNPREVEX0tFWS5nZXRLZXlOYW1lKCkpLCBwZW1FbmNvZGVkS2V5KTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG91dGJvdW5kS2V5UGFzc3dvcmQgPSBTdHJpbmdVdGlscy5kZWZhdWx0U3RyaW5nKFN0cmluZ1V0aWxzLmRlZmF1bHRTdHJpbmcoZ2V0U3RyaW5nKENvbmZpZ0tleS5PVVRCT1VORF9FTkNPREVEX0tFWV9QQVNTV09SRC5nZXRLZXlOYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRib3VuZEtleXN0b3JlQ29udGV4dC5wYXNzd29yZCksIHBlbUVuY29kZWRLZXlQYXNzd29yZCk7CisgICAgICAgIHBlbUVuY29kZWRPdXRib3VuZEtleUNvbnRleHQgPSBuZXcgUEVNQmFzZWRLZXlTdG9yZUNvbnRleHQocGVtRW5jb2RlZEtleSwgb3V0Ym91bmRLZXlQYXNzd29yZCwgU3RyaW5nVXRpbHMuaXNFbXB0eShwZW1FbmNvZGVkT3V0Ym91bmRLZXkpLCBvdXRib3VuZEtleXN0b3JlQ29udGV4dCk7CisKKyAgICAgICAgdmFsaWRhdGVQYXNzd29yZHMoKTsKKworICAgICAgICBpZiAoIVN0cmluZ1V0aWxzLmlzRW1wdHkodHJ1c3RTdG9yZUNvbnRleHQucGFzc3dvcmQpKQogICAgICAgICB7CiAgICAgICAgICAgICBsb2dnZXIud2FybigiUEVNIGJhc2VkIHRydXN0c3RvcmUgc2hvdWxkIG5vdCBiZSB1c2luZyBwYXNzd29yZC4gSWdub3JpbmcgdGhlIGdpdmVuIHZhbHVlIGluICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIid0cnVzdHN0b3JlX3Bhc3N3b3JkJyBjb25maWd1cmF0aW9uLiIpOwogICAgICAgICB9CiAKLSAgICAgICAgcGVtRW5jb2RlZENlcnRpZmljYXRlcyA9IGdldFN0cmluZyhDb25maWdLZXkuRU5DT0RFRF9DRVJUSUZJQ0FURVMuZ2V0S2V5TmFtZSgpKTsKLQotICAgICAgICBtYXliZUZpbGVCYXNlZFByaXZhdGVLZXkgPSBTdHJpbmdVdGlscy5pc0VtcHR5KHBlbUVuY29kZWRLZXkpOwotICAgICAgICBtYXliZUZpbGVCYXNlZFRydXN0ZWRDZXJ0aWZpY2F0ZXMgPSBTdHJpbmdVdGlscy5pc0VtcHR5KHBlbUVuY29kZWRDZXJ0aWZpY2F0ZXMpOwotCisgICAgICAgIGZpbmFsIFN0cmluZyBwZW1FbmNvZGVkQ2VydHMgPSBnZXRTdHJpbmcoQ29uZmlnS2V5LkVOQ09ERURfQ0VSVElGSUNBVEVTLmdldEtleU5hbWUoKSk7CisgICAgICAgIHBlbUVuY29kZWRUcnVzdENlcnRpZmljYXRlcyA9IG5ldyBQRU1CYXNlZEtleVN0b3JlQ29udGV4dChwZW1FbmNvZGVkQ2VydHMsIG51bGwsIFN0cmluZ1V0aWxzLmlzRW1wdHkocGVtRW5jb2RlZENlcnRzKSwgdHJ1c3RTdG9yZUNvbnRleHQpOwogICAgICAgICBlbmZvcmNlU2luZ2xlUHJpdmF0ZUtleVNvdXJjZSgpOwogICAgICAgICBlbmZvcmNlU2luZ2xlVHVyc3RlZENlcnRpZmljYXRlc1NvdXJjZSgpOwogICAgIH0KQEAgLTEzNywxOCArMTQ1LDIyIEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaGFzS2V5c3RvcmUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG1heWJlRmlsZUJhc2VkUHJpdmF0ZUtleSA/IGtleXN0b3JlRmlsZUV4aXN0cygpIDoKLSAgICAgICAgICAgICAgICFTdHJpbmdVdGlscy5pc0VtcHR5KHBlbUVuY29kZWRLZXkpOworICAgICAgICByZXR1cm4gcGVtRW5jb2RlZEtleUNvbnRleHQubWF5YmVGaWxlYmFzZWRLZXkKKyAgICAgICAgICAgICAgID8ga2V5c3RvcmVDb250ZXh0Lmhhc0tleXN0b3JlKCkKKyAgICAgICAgICAgICAgIDogIVN0cmluZ1V0aWxzLmlzRW1wdHkocGVtRW5jb2RlZEtleUNvbnRleHQua2V5KTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBDaGVja3MgaWYgdGhlIGtleXN0b3JlIGZpbGUgZXhpc3RzLgorICAgICAqIERlY2lkZXMgaWYgdGhpcyBmYWN0b3J5IGhhcyBhbiBvdXRib3VuZCBrZXlzdG9yZSBkZWZpbmVkIC0ga2V5IG1hdGVyaWFsIHNwZWNpZmllZCBpbiBmaWxlcyBvciBpbmxpbmUgdG8gdGhlIGNvbmZpZ3VyYXRpb24uCiAgICAgICoKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBrZXlzdG9yZSBmaWxlIGV4aXN0czsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGVyZSBpcyBhbiBvdXRib3VuZCBrZXlzdG9yZSBkZWZpbmVkOyB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZQogICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBrZXlzdG9yZUZpbGVFeGlzdHMoKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc091dGJvdW5kS2V5c3RvcmUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGtleXN0b3JlICE9IG51bGwgJiYgbmV3IEZpbGUoa2V5c3RvcmUpLmV4aXN0cygpOworICAgICAgICByZXR1cm4gcGVtRW5jb2RlZE91dGJvdW5kS2V5Q29udGV4dC5tYXliZUZpbGViYXNlZEtleQorICAgICAgICAgICAgICAgPyBvdXRib3VuZEtleXN0b3JlQ29udGV4dC5oYXNLZXlzdG9yZSgpCisgICAgICAgICAgICAgICA6ICFTdHJpbmdVdGlscy5pc0VtcHR5KHBlbUVuY29kZWRPdXRib3VuZEtleUNvbnRleHQua2V5KTsKICAgICB9CiAKICAgICAvKioKQEAgLTE1OSw4ICsxNzEsOCBAQAogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiBoYXNUcnVzdHN0b3JlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBtYXliZUZpbGVCYXNlZFRydXN0ZWRDZXJ0aWZpY2F0ZXMgPyB0cnVzdHN0b3JlRmlsZUV4aXN0cygpIDoKLSAgICAgICAgICAgICAgICFTdHJpbmdVdGlscy5pc0VtcHR5KHBlbUVuY29kZWRDZXJ0aWZpY2F0ZXMpOworICAgICAgICByZXR1cm4gcGVtRW5jb2RlZFRydXN0Q2VydGlmaWNhdGVzLm1heWJlRmlsZWJhc2VkS2V5ID8gdHJ1c3RzdG9yZUZpbGVFeGlzdHMoKSA6CisgICAgICAgICAgICAgICAhU3RyaW5nVXRpbHMuaXNFbXB0eShwZW1FbmNvZGVkVHJ1c3RDZXJ0aWZpY2F0ZXMua2V5KTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3MCw3ICsxODIsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgYm9vbGVhbiB0cnVzdHN0b3JlRmlsZUV4aXN0cygpCiAgICAgewotICAgICAgICByZXR1cm4gdHJ1c3RzdG9yZSAhPSBudWxsICYmIG5ldyBGaWxlKHRydXN0c3RvcmUpLmV4aXN0cygpOworICAgICAgICByZXR1cm4gdHJ1c3RTdG9yZUNvbnRleHQuZmlsZVBhdGggIT0gbnVsbCAmJiBuZXcgRmlsZSh0cnVzdFN0b3JlQ29udGV4dC5maWxlUGF0aCkuZXhpc3RzKCk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xODAsMTMgKzE5MiwxNyBAQAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbml0SG90UmVsb2FkaW5nKCkKICAgICB7CiAgICAgICAgIExpc3Q8SG90UmVsb2FkYWJsZUZpbGU+IGZpbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGlmIChtYXliZUZpbGVCYXNlZFByaXZhdGVLZXkgJiYgaGFzS2V5c3RvcmUoKSkKKyAgICAgICAgaWYgKHBlbUVuY29kZWRLZXlDb250ZXh0Lm1heWJlRmlsZWJhc2VkS2V5ICYmIGhhc0tleXN0b3JlKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVMaXN0LmFkZChuZXcgSG90UmVsb2FkYWJsZUZpbGUoa2V5c3RvcmUpKTsKKyAgICAgICAgICAgIGZpbGVMaXN0LmFkZChuZXcgSG90UmVsb2FkYWJsZUZpbGUoa2V5c3RvcmVDb250ZXh0LmZpbGVQYXRoKSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1heWJlRmlsZUJhc2VkVHJ1c3RlZENlcnRpZmljYXRlcyAmJiBoYXNUcnVzdHN0b3JlKCkpCisgICAgICAgIGlmIChwZW1FbmNvZGVkT3V0Ym91bmRLZXlDb250ZXh0Lm1heWJlRmlsZWJhc2VkS2V5ICYmIGhhc091dGJvdW5kS2V5c3RvcmUoKSkKICAgICAgICAgewotICAgICAgICAgICAgZmlsZUxpc3QuYWRkKG5ldyBIb3RSZWxvYWRhYmxlRmlsZSh0cnVzdHN0b3JlKSk7CisgICAgICAgICAgICBmaWxlTGlzdC5hZGQobmV3IEhvdFJlbG9hZGFibGVGaWxlKG91dGJvdW5kS2V5c3RvcmVDb250ZXh0LmZpbGVQYXRoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBlbUVuY29kZWRUcnVzdENlcnRpZmljYXRlcy5tYXliZUZpbGViYXNlZEtleSAmJiBoYXNUcnVzdHN0b3JlKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGVMaXN0LmFkZChuZXcgSG90UmVsb2FkYWJsZUZpbGUodHJ1c3RTdG9yZUNvbnRleHQuZmlsZVBhdGgpKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWZpbGVMaXN0LmlzRW1wdHkoKSkKICAgICAgICAgewpAQCAtMjA0LDI5ICsyMjAsNDAgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgS2V5TWFuYWdlckZhY3RvcnkgYnVpbGRLZXlNYW5hZ2VyRmFjdG9yeSgpIHRocm93cyBTU0xFeGNlcHRpb24KICAgICB7CisgICAgICAgIHJldHVybiBidWlsZEtleU1hbmFnZXJGYWN0b3J5KHBlbUVuY29kZWRLZXlDb250ZXh0LCBrZXlzdG9yZUNvbnRleHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBLZXlNYW5hZ2VyRmFjdG9yeSBidWlsZE91dGJvdW5kS2V5TWFuYWdlckZhY3RvcnkoKSB0aHJvd3MgU1NMRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gYnVpbGRLZXlNYW5hZ2VyRmFjdG9yeShwZW1FbmNvZGVkT3V0Ym91bmRLZXlDb250ZXh0LCBvdXRib3VuZEtleXN0b3JlQ29udGV4dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBLZXlNYW5hZ2VyRmFjdG9yeSBidWlsZEtleU1hbmFnZXJGYWN0b3J5KFBFTUJhc2VkS2V5U3RvcmVDb250ZXh0IHBlbUJhc2VkS2V5U3RvcmVDb250ZXh0LCBGaWxlQmFzZWRTdG9yZUNvbnRleHQga2V5U3RvcmVDb250ZXh0KSB0aHJvd3MgU1NMRXhjZXB0aW9uCisgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGhhc0tleXN0b3JlKCkpCisgICAgICAgICAgICBpZiAocGVtQmFzZWRLZXlTdG9yZUNvbnRleHQuaGFzS2V5KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1heWJlRmlsZUJhc2VkUHJpdmF0ZUtleSkKKyAgICAgICAgICAgICAgICBpZiAocGVtQmFzZWRLZXlTdG9yZUNvbnRleHQubWF5YmVGaWxlYmFzZWRLZXkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwZW1FbmNvZGVkS2V5ID0gcmVhZFBFTUZpbGUoa2V5c3RvcmUpOyAvLyByZWFkIFBFTSBmcm9tIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgICAgIHBlbUJhc2VkS2V5U3RvcmVDb250ZXh0LmtleSA9IHJlYWRQRU1GaWxlKGtleVN0b3JlQ29udGV4dC5maWxlUGF0aCk7IC8vIHJlYWQgUEVNIGZyb20gdGhlIGZpbGUKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBLZXlNYW5hZ2VyRmFjdG9yeSBrbWYgPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgKICAgICAgICAgICAgICAgICBhbGdvcml0aG0gPT0gbnVsbCA/IEtleU1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKSA6IGFsZ29yaXRobSk7Ci0gICAgICAgICAgICAgICAgS2V5U3RvcmUga3MgPSBidWlsZEtleVN0b3JlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFjaGVja2VkRXhwaXJ5KQorICAgICAgICAgICAgICAgIEtleVN0b3JlIGtzID0gYnVpbGRLZXlTdG9yZShwZW1CYXNlZEtleVN0b3JlQ29udGV4dC5rZXksIHBlbUJhc2VkS2V5U3RvcmVDb250ZXh0LnBhc3N3b3JkKTsKKyAgICAgICAgICAgICAgICBpZiAoIWtleVN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgY2hlY2tFeHBpcmVkQ2VydHMoa3MpOwotICAgICAgICAgICAgICAgICAgICBjaGVja2VkRXhwaXJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAga2V5U3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBrbWYuaW5pdChrcywga2V5UGFzc3dvcmQgIT0gbnVsbCA/IGtleVBhc3N3b3JkLnRvQ2hhckFycmF5KCkgOiBudWxsKTsKKyAgICAgICAgICAgICAgICBrbWYuaW5pdChrcywgcGVtQmFzZWRLZXlTdG9yZUNvbnRleHQucGFzc3dvcmQgIT0gbnVsbCA/IHBlbUJhc2VkS2V5U3RvcmVDb250ZXh0LnBhc3N3b3JkLnRvQ2hhckFycmF5KCkgOiBudWxsKTsKICAgICAgICAgICAgICAgICByZXR1cm4ga21mOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBTU0xFeGNlcHRpb24oIk11c3QgcHJvdmlkZSBrZXlzdG9yZSBvciBwcml2YXRlX2tleSBpbiBjb25maWd1cmF0aW9uIGZvciBQRU1CYXNlZFNTbENvbnRleHRGYWN0b3J5Iik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNTTEV4Y2VwdGlvbigiTXVzdCBwcm92aWRlIG91dGJvdW5kX2tleXN0b3JlIG9yIG91dGJvdW5kX3ByaXZhdGVfa2V5IGluIGNvbmZpZ3VyYXRpb24gZm9yIFBFTUJhc2VkU1NsQ29udGV4dEZhY3RvcnkiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCkBAIC0yNDgsOSArMjc1LDkgQEAKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGhhc1RydXN0c3RvcmUoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobWF5YmVGaWxlQmFzZWRUcnVzdGVkQ2VydGlmaWNhdGVzKQorICAgICAgICAgICAgICAgIGlmIChwZW1FbmNvZGVkVHJ1c3RDZXJ0aWZpY2F0ZXMubWF5YmVGaWxlYmFzZWRLZXkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwZW1FbmNvZGVkQ2VydGlmaWNhdGVzID0gcmVhZFBFTUZpbGUodHJ1c3RzdG9yZSk7IC8vIHJlYWQgUEVNIGZyb20gdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgcGVtRW5jb2RlZFRydXN0Q2VydGlmaWNhdGVzLmtleSA9IHJlYWRQRU1GaWxlKHRydXN0U3RvcmVDb250ZXh0LmZpbGVQYXRoKTsgLy8gcmVhZCBQRU0gZnJvbSB0aGUgZmlsZQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIFRydXN0TWFuYWdlckZhY3RvcnkgdG1mID0gVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZSgKQEAgLTI4MCw3ICszMDcsNyBAQAogICAgICAqIEJ1aWxkcyBLZXlTdG9yZSBvYmplY3QgZ2l2ZW4gdGhlIHtAbGluayAjREVGQVVMVF9UQVJHRVRfU1RPUkVUWVBFfSBvdXQgb2YgdGhlIFBFTSBmb3JtYXR0ZWQgcHJpdmF0ZSBrZXkgbWF0ZXJpYWwuCiAgICAgICogSXQgdXNlcyB7QGNvZGUgY2Fzc2FuZHJhLXNzbC1rZXlzdG9yZX0gYXMgdGhlIGFsaWFzIGZvciB0aGUgY3JlYXRlZCBrZXktZW50cnkuCiAgICAgICovCi0gICAgcHJpdmF0ZSBLZXlTdG9yZSBidWlsZEtleVN0b3JlKCkgdGhyb3dzIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBLZXlTdG9yZSBidWlsZEtleVN0b3JlKGZpbmFsIFN0cmluZyBwZW1FbmNvZGVkS2V5LCBmaW5hbCBTdHJpbmcga2V5UGFzc3dvcmQpIHRocm93cyBHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24sIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBjaGFyW10ga2V5UGFzc3dvcmRBcnJheSA9IGtleVBhc3N3b3JkICE9IG51bGwgPyBrZXlQYXNzd29yZC50b0NoYXJBcnJheSgpIDogbnVsbDsKICAgICAgICAgUHJpdmF0ZUtleSBwcml2YXRlS2V5ID0gUEVNUmVhZGVyLmV4dHJhY3RQcml2YXRlS2V5KHBlbUVuY29kZWRLZXksIGtleVBhc3N3b3JkKTsKQEAgLTMwNCw3ICszMzEsNyBAQAogICAgICAqLwogICAgIHByaXZhdGUgS2V5U3RvcmUgYnVpbGRUcnVzdFN0b3JlKCkgdGhyb3dzIEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIENlcnRpZmljYXRlW10gY2VydENoYWluQXJyYXkgPSBQRU1SZWFkZXIuZXh0cmFjdENlcnRpZmljYXRlcyhwZW1FbmNvZGVkQ2VydGlmaWNhdGVzKTsKKyAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0Q2hhaW5BcnJheSA9IFBFTVJlYWRlci5leHRyYWN0Q2VydGlmaWNhdGVzKHBlbUVuY29kZWRUcnVzdENlcnRpZmljYXRlcy5rZXkpOwogICAgICAgICBpZiAoY2VydENoYWluQXJyYXkgPT0gbnVsbCB8fCBjZXJ0Q2hhaW5BcnJheS5sZW5ndGggPT0gMCkKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IFNTTEV4Y2VwdGlvbigiQ291bGQgbm90IHJlYWQgYW55IGNlcnRpZmljYXRlcyBmcm9tIHRoZSBnaXZlbiBQRU0iKTsKQEAgLTMyNSwxMSArMzUyLDE2IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIGVuZm9yY2VTaW5nbGVQcml2YXRlS2V5U291cmNlKCkKICAgICB7Ci0gICAgICAgIGlmIChrZXlzdG9yZUZpbGVFeGlzdHMoKSAmJiAhU3RyaW5nVXRpbHMuaXNFbXB0eShwZW1FbmNvZGVkS2V5KSkKKyAgICAgICAgaWYgKGtleXN0b3JlQ29udGV4dC5oYXNLZXlzdG9yZSgpICYmICFTdHJpbmdVdGlscy5pc0VtcHR5KHBlbUVuY29kZWRLZXlDb250ZXh0LmtleSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbmZpZ3VyYXRpb24gbXVzdCBzcGVjaWZ5IHZhbHVlIGZvciBlaXRoZXIga2V5c3RvcmUgb3IgcHJpdmF0ZV9rZXksICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGJvdGggZm9yIFBFTUJhc2VkU1NsQ29udGV4dEZhY3RvcnkiKTsKICAgICAgICAgfQorICAgICAgICBpZiAob3V0Ym91bmRLZXlzdG9yZUNvbnRleHQuaGFzS2V5c3RvcmUoKSAmJiAhU3RyaW5nVXRpbHMuaXNFbXB0eShwZW1FbmNvZGVkT3V0Ym91bmRLZXlDb250ZXh0LmtleSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbmZpZ3VyYXRpb24gbXVzdCBzcGVjaWZ5IHZhbHVlIGZvciBlaXRoZXIgb3V0Ym91bmRfa2V5c3RvcmUgb3Igb3V0Ym91bmRfcHJpdmF0ZV9rZXksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGJvdGggZm9yIFBFTUJhc2VkU1NsQ29udGV4dEZhY3RvcnkiKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8qKgpAQCAtMzM4LDE3ICszNzAsNDMgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgZW5mb3JjZVNpbmdsZVR1cnN0ZWRDZXJ0aWZpY2F0ZXNTb3VyY2UoKQogICAgIHsKLSAgICAgICAgaWYgKHRydXN0c3RvcmVGaWxlRXhpc3RzKCkgJiYgIVN0cmluZ1V0aWxzLmlzRW1wdHkocGVtRW5jb2RlZENlcnRpZmljYXRlcykpCisgICAgICAgIGlmICh0cnVzdHN0b3JlRmlsZUV4aXN0cygpICYmICFTdHJpbmdVdGlscy5pc0VtcHR5KHBlbUVuY29kZWRUcnVzdENlcnRpZmljYXRlcy5rZXkpKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb25maWd1cmF0aW9uIG11c3Qgc3BlY2lmeSB2YWx1ZSBmb3IgZWl0aGVyIHRydXN0c3RvcmUgb3IgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnVzdGVkX2NlcnRpZmljYXRlcywgbm90IGJvdGggZm9yIFBFTUJhc2VkU1NsQ29udGV4dEZhY3RvcnkiKTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUEVNQmFzZWRLZXlTdG9yZUNvbnRleHQKKyAgICB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcga2V5OworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHBhc3N3b3JkOworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBtYXliZUZpbGViYXNlZEtleTsKKyAgICAgICAgcHVibGljIGZpbmFsIEZpbGVCYXNlZFN0b3JlQ29udGV4dCBmaWxlYmFzZWRLZXlzdG9yZUNvbnRleHQ7CisKKyAgICAgICAgcHVibGljIFBFTUJhc2VkS2V5U3RvcmVDb250ZXh0KGZpbmFsIFN0cmluZyBlbmNvZGVkS2V5LCBmaW5hbCBTdHJpbmcgZ2V0RW5jb2RlZEtleVBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBtYXliZUZpbGViYXNlZEtleSwgZmluYWwgRmlsZUJhc2VkU3RvcmVDb250ZXh0IGZpbGViYXNlZEtleXN0b3JlQ29udGV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5rZXkgPSBlbmNvZGVkS2V5OworICAgICAgICAgICAgdGhpcy5wYXNzd29yZCA9IGdldEVuY29kZWRLZXlQYXNzd29yZDsKKyAgICAgICAgICAgIHRoaXMubWF5YmVGaWxlYmFzZWRLZXkgPSBtYXliZUZpbGViYXNlZEtleTsKKyAgICAgICAgICAgIHRoaXMuZmlsZWJhc2VkS2V5c3RvcmVDb250ZXh0ID0gZmlsZWJhc2VkS2V5c3RvcmVDb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzS2V5KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1heWJlRmlsZWJhc2VkS2V5CisgICAgICAgICAgICAgICAgICAgPyBmaWxlYmFzZWRLZXlzdG9yZUNvbnRleHQuaGFzS2V5c3RvcmUoKQorICAgICAgICAgICAgICAgICAgIDogIVN0cmluZ1V0aWxzLmlzRW1wdHkoa2V5KTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBlbnVtIENvbmZpZ0tleQogICAgIHsKICAgICAgICAgRU5DT0RFRF9LRVkoInByaXZhdGVfa2V5IiksCiAgICAgICAgIEtFWV9QQVNTV09SRCgicHJpdmF0ZV9rZXlfcGFzc3dvcmQiKSwKKyAgICAgICAgT1VUQk9VTkRfRU5DT0RFRF9LRVkoIm91dGJvdW5kX3ByaXZhdGVfa2V5IiksCisgICAgICAgIE9VVEJPVU5EX0VOQ09ERURfS0VZX1BBU1NXT1JEKCJvdXRib3VuZF9wcml2YXRlX2tleV9wYXNzd29yZCIpLAogICAgICAgICBFTkNPREVEX0NFUlRJRklDQVRFUygidHJ1c3RlZF9jZXJ0aWZpY2F0ZXMiKTsKIAogICAgICAgICBmaW5hbCBTdHJpbmcga2V5TmFtZTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1NTTEZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1NTTEZhY3RvcnkuamF2YQppbmRleCBlMDZkYTFmLi5lNmRhNTc3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9TU0xGYWN0b3J5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvU1NMRmFjdG9yeS5qYXZhCkBAIC00MSwxMSArNDEsMTIgQEAKIGltcG9ydCBpby5uZXR0eS5oYW5kbGVyLnNzbC5Tc2xDb250ZXh0OwogaW1wb3J0IGlvLm5ldHR5LnV0aWwuUmVmZXJlbmNlQ291bnRVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuSVNzbENvbnRleHRGYWN0b3J5LlNvY2tldFR5cGU7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESVNBQkxFX1RDQUNUSVZFX09QRU5TU0w7CisKIC8qKgogICogQSBGYWN0b3J5IGZvciBwcm92aWRpbmcgYW5kIHNldHRpbmcgdXAgY2xpZW50IHtAbGluayBTU0xTb2NrZXR9cy4gQWxzbyBwcm92aWRlcwogICogbWV0aG9kcyBmb3IgY3JlYXRpbmcgYm90aCBKU1NFIHtAbGluayBTU0xDb250ZXh0fSBpbnN0YW5jZXMgYXMgd2VsbCBhcyBuZXR0eSB7QGxpbmsgU3NsQ29udGV4dH0gaW5zdGFuY2VzLgpAQCAtNjQsNyArNjUsNyBAQAogICAgIHN0YXRpYyBwcml2YXRlIGZpbmFsIGJvb2xlYW4gb3BlblNzbElzQXZhaWxhYmxlOwogICAgIHN0YXRpYwogICAgIHsKLSAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbihDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImRpc2FibGVfdGNhY3RpdmVfb3BlbnNzbCIpKQorICAgICAgICBpZiAoRElTQUJMRV9UQ0FDVElWRV9PUEVOU1NMLmdldEJvb2xlYW4oKSkKICAgICAgICAgewogICAgICAgICAgICAgb3BlblNzbElzQXZhaWxhYmxlID0gZmFsc2U7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0Fic3RyYWN0TWFwU2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvQWJzdHJhY3RNYXBTZXJpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiYWU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0Fic3RyYWN0TWFwU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzOworCitpbXBvcnQgamF2YS5uaW8uQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlJhbmdlOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CisKKy8qKgorICogQ29tbW9uIHN1cGVyY2xhc3MgZm9yIHtAbGluayBTZXRTZXJpYWxpemVyfSBhbmQge0BsaW5rIE1hcFNlcmlhbGl6ZXJ9LCBjb25zaWRlcmluZyBhIHNldCBhcyBhIG1hcCB3aXRob3V0IHZhbHVlcy4KKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNYXBTZXJpYWxpemVyPFQ+IGV4dGVuZHMgQ29sbGVjdGlvblNlcmlhbGl6ZXI8VD4KK3sKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaGFzVmFsdWVzOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RNYXBTZXJpYWxpemVyKGJvb2xlYW4gaGFzVmFsdWVzKQorICAgIHsKKyAgICAgICAgdGhpcy5oYXNWYWx1ZXMgPSBoYXNWYWx1ZXM7CisgICAgICAgIG5hbWUgPSBoYXNWYWx1ZXMgPyAibWFwIiA6ICJzZXQiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldFNsaWNlRnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBjb21wYXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmcm96ZW4pCisgICAgeworICAgICAgICBpZiAoZnJvbSA9PSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUiAmJiB0byA9PSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUikKKyAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGlucHV0ID0gY29sbGVjdGlvbi5kdXBsaWNhdGUoKTsKKyAgICAgICAgICAgIGludCBuID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOworICAgICAgICAgICAgaW5wdXQucG9zaXRpb24oaW5wdXQucG9zaXRpb24oKSArIHNpemVPZkNvbGxlY3Rpb25TaXplKCkpOworICAgICAgICAgICAgaW50IHN0YXJ0UG9zID0gaW5wdXQucG9zaXRpb24oKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBib29sZWFuIGluU2xpY2UgPSBmcm9tID09IEJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcG9zID0gaW5wdXQucG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGtleSA9IHJlYWRWYWx1ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCAwKTsKKyAgICAgICAgICAgICAgICBpbnB1dC5wb3NpdGlvbihpbnB1dC5wb3NpdGlvbigpICsgc2l6ZU9mVmFsdWUoa2V5LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgcGFzc2VkIHRoZSBzdGFydCBhbHJlYWR5LCBjaGVjayBpZiB3ZSBoYXZlIG5vdworICAgICAgICAgICAgICAgIGlmICghaW5TbGljZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb21wYXJpc29uID0gY29tcGFyYXRvci5jb21wYXJlRm9yQ1FMKGZyb20sIGtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJpc29uIDw9IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdyB3aXRoaW4gdGhlIHNsaWNlCisgICAgICAgICAgICAgICAgICAgICAgICBpblNsaWNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gcG9zOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgYmVmb3JlIHRoZSBzbGljZSwgc28gd2Uga25vdyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgZWxlbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgc2tpcE1hcFZhbHVlKGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gTm93IGNoZWNrIGlmIHdlJ3JlIGRvbmUKKyAgICAgICAgICAgICAgICBpbnQgY29tcGFyaXNvbiA9IHRvID09IEJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSID8gLTEgOiBjb21wYXJhdG9yLmNvbXBhcmVGb3JDUUwoa2V5LCB0byk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmlzb24gPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgZG9uZSBhbmQgc2hvdWxkbid0IGluY2x1ZGUgdGhlIGtleSB3ZSBqdXN0IHJlYWQKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQucG9zaXRpb24ocG9zKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSdsbCBpbmNsdWRlIHRoYXQgZWxlbWVudAorICAgICAgICAgICAgICAgIHNraXBNYXBWYWx1ZShpbnB1dCk7IC8vIHZhbHVlCisgICAgICAgICAgICAgICAgKytjb3VudDsKKworICAgICAgICAgICAgICAgIC8vIEJ1dCBpZiB3ZSBrbm93IGl0IHdhcyB0aGUgbGFzdCBvZiB0aGUgc2xpY2UsIHdlIGJyZWFrIGVhcmx5CisgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmlzb24gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb3VudCA9PSAwICYmICFmcm96ZW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgIHJldHVybiBjb3B5QXNOZXdDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIGNvdW50LCBzdGFydFBvcywgaW5wdXQucG9zaXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiB8IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIk5vdCBlbm91Z2ggYnl0ZXMgdG8gcmVhZCBhICIgKyBuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXhGcm9tU2VyaWFsaXplZChCeXRlQnVmZmVyIGNvbGxlY3Rpb24sIEJ5dGVCdWZmZXIga2V5LCBBYnN0cmFjdFR5cGU8Pz4gY29tcGFyYXRvcikKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGlucHV0ID0gY29sbGVjdGlvbi5kdXBsaWNhdGUoKTsKKyAgICAgICAgICAgIGludCBuID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGtiYiA9IHJlYWRWYWx1ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBzaXplT2ZWYWx1ZShrYmIsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgaW50IGNvbXBhcmlzb24gPSBjb21wYXJhdG9yLmNvbXBhcmVGb3JDUUwoa2JiLCBrZXkpOworCisgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmlzb24gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisKKyAgICAgICAgICAgICAgICBpZiAoY29tcGFyaXNvbiA+IDApCisgICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBzZXQgaXMgaW4gc29ydGVkIG9yZGVyLCB3ZSBrbm93IHdlJ3ZlIGdvbmUgdG9vIGZhciBhbmQgdGhlIGVsZW1lbnQgZG9lc24ndCBleGlzdAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgICAgICAgICAvLyBjb21wYXJpc29uIDwgMAorICAgICAgICAgICAgICAgIGlmIChoYXNWYWx1ZXMpCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBza2lwVmFsdWUoaW5wdXQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgYSAiICsgbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmFuZ2U8SW50ZWdlcj4gZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBjb21wYXJhdG9yKQorICAgIHsKKyAgICAgICAgaWYgKGZyb20gPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIgJiYgdG8gPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIpCisgICAgICAgICAgICByZXR1cm4gUmFuZ2UuY2xvc2VkKDAsIEludGVnZXIuTUFYX1ZBTFVFKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCA9IGNvbGxlY3Rpb24uZHVwbGljYXRlKCk7CisgICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKKyAgICAgICAgICAgIGlucHV0LnBvc2l0aW9uKGlucHV0LnBvc2l0aW9uKCkgKyBzaXplT2ZDb2xsZWN0aW9uU2l6ZSgpKTsKKyAgICAgICAgICAgIGludCBzdGFydCA9IGZyb20gPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIgPyAwIDogLTE7CisgICAgICAgICAgICBpbnQgZW5kID0gdG8gPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIgPyBuIDogLTE7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChzdGFydCA+PSAwICYmIGVuZCA+PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgc2tpcE1hcFZhbHVlKGlucHV0KTsKKworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gcmVhZFZhbHVlKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIDApOworICAgICAgICAgICAgICAgIGlucHV0LnBvc2l0aW9uKGlucHV0LnBvc2l0aW9uKCkgKyBzaXplT2ZWYWx1ZShrZXksIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSkpOworCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb21wYXJpc29uID0gY29tcGFyYXRvci5jb21wYXJlRm9yQ1FMKGZyb20sIGtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJpc29uIDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChlbmQgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBhcmlzb24gPSBjb21wYXJhdG9yLmNvbXBhcmVGb3JDUUwoa2V5LCB0byk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJpc29uID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZS5jbG9zZWRPcGVuKDAsIDApOworCisgICAgICAgICAgICBpZiAoZW5kIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuY2xvc2VkT3BlbihzdGFydCwgbik7CisKKyAgICAgICAgICAgIHJldHVybiBSYW5nZS5jbG9zZWRPcGVuKHN0YXJ0LCBlbmQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIk5vdCBlbm91Z2ggYnl0ZXMgdG8gcmVhZCBhICIgKyBuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBza2lwTWFwVmFsdWUoQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIGlmIChoYXNWYWx1ZXMpCisgICAgICAgICAgICBza2lwVmFsdWUoaW5wdXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0Fic3RyYWN0VHlwZVNlcmlhbGl6ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0Fic3RyYWN0VHlwZVNlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmU0ZDYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvQWJzdHJhY3RUeXBlU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlR5cGVQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKKworcHVibGljIGNsYXNzIEFic3RyYWN0VHlwZVNlcmlhbGl6ZXIKK3sKKyAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoQWJzdHJhY3RUeXBlPD8+IHR5cGUsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhWSW50TGVuZ3RoKFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSh0eXBlLnRvU3RyaW5nKCkpLCBvdXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZUxpc3QoTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzLCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIodHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChBYnN0cmFjdFR5cGU8Pz4gdHlwZSA6IHR5cGVzKQorICAgICAgICAgICAgc2VyaWFsaXplKHR5cGUsIG91dCk7CisgICAgfQorCisgICAgcHVibGljIEFic3RyYWN0VHlwZTw/PiBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgcmF3ID0gQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhWSW50TGVuZ3RoKGluKTsKKyAgICAgICAgcmV0dXJuIFR5cGVQYXJzZXIucGFyc2UoVVRGOFR5cGUuaW5zdGFuY2UuY29tcG9zZShyYXcpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGRlc2VyaWFsaXplTGlzdChEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCBzaXplID0gKGludCkgaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PD4oc2l6ZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgdHlwZXMuYWRkKGRlc2VyaWFsaXplKGluKSk7CisgICAgICAgIHJldHVybiB0eXBlczsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBzZXJpYWxpemVkU2l6ZShBYnN0cmFjdFR5cGU8Pz4gdHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5zZXJpYWxpemVkU2l6ZVdpdGhWSW50TGVuZ3RoKFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSh0eXBlLnRvU3RyaW5nKCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBzZXJpYWxpemVkTGlzdFNpemUoTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHR5cGVzKQorICAgIHsKKyAgICAgICAgbG9uZyBzaXplID0gVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludCh0eXBlcy5zaXplKCkpOworICAgICAgICBmb3IgKEFic3RyYWN0VHlwZTw/PiB0eXBlIDogdHlwZXMpCisgICAgICAgICAgICBzaXplICs9IHNlcmlhbGl6ZWRTaXplKHR5cGUpOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvQm9vbGVhblNlcmlhbGl6ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0Jvb2xlYW5TZXJpYWxpemVyLmphdmEKaW5kZXggZDM3MmEyYS4uNDAzZTZiNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvQm9vbGVhblNlcmlhbGl6ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9Cb29sZWFuU2VyaWFsaXplci5qYXZhCkBAIC0yNCw4ICsyNCw4IEBACiAKIHB1YmxpYyBjbGFzcyBCb29sZWFuU2VyaWFsaXplciBleHRlbmRzIFR5cGVTZXJpYWxpemVyPEJvb2xlYW4+CiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBUUlVFID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW10gezF9KTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIEZBTFNFID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW10gezB9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgVFJVRSA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdIHsxfSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIEZBTFNFID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW10gezB9KTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhblNlcmlhbGl6ZXIgaW5zdGFuY2UgPSBuZXcgQm9vbGVhblNlcmlhbGl6ZXIoKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvQ29sbGVjdGlvblNlcmlhbGl6ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0NvbGxlY3Rpb25TZXJpYWxpemVyLmphdmEKaW5kZXggMTcyMmMzZC4uYjUxNGQyNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvQ29sbGVjdGlvblNlcmlhbGl6ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9Db2xsZWN0aW9uU2VyaWFsaXplci5qYXZhCkBAIC0xOCwxNCArMTgsMTcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVyczsKIAoraW1wb3J0IGphdmEubmlvLkJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuUmFuZ2U7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5UeXBlU2l6ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5WYWx1ZUFjY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKQEAgLTM0LDc5ICszNyw0OSBAQAogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBMaXN0PEJ5dGVCdWZmZXI+IHNlcmlhbGl6ZVZhbHVlcyhUIHZhbHVlKTsKICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGdldEVsZW1lbnRDb3VudChUIHZhbHVlKTsKIAotICAgIHB1YmxpYyBhYnN0cmFjdCA8Vj4gVCBkZXNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKFYgdmFsdWUsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKTsKLQotICAgIHB1YmxpYyBUIGRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woQnl0ZUJ1ZmZlciB2YWx1ZSwgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCi0gICAgewotICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbCh2YWx1ZSwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB2ZXJzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYWJzdHJhY3QgPFY+IHZvaWQgdmFsaWRhdGVGb3JOYXRpdmVQcm90b2NvbChWIHZhbHVlLCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbik7Ci0KKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBzZXJpYWxpemUoVCBpbnB1dCkKICAgICB7CiAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gdmFsdWVzID0gc2VyaWFsaXplVmFsdWVzKGlucHV0KTsKLSAgICAgICAgLy8gU2VlIGRlc2VyaWFsaXplKCkgZm9yIHdoeSB1c2luZyB0aGUgcHJvdG9jb2wgdjMgdmFyaWFudCBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uCi0gICAgICAgIHJldHVybiBwYWNrKHZhbHVlcywgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBnZXRFbGVtZW50Q291bnQoaW5wdXQpLCBQcm90b2NvbFZlcnNpb24uVjMpOworICAgICAgICByZXR1cm4gcGFjayh2YWx1ZXMsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgZ2V0RWxlbWVudENvdW50KGlucHV0KSk7CiAgICAgfQogCi0gICAgcHVibGljIDxWPiBUIGRlc2VyaWFsaXplKFYgdmFsdWUsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IpCisgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIHBhY2soQ29sbGVjdGlvbjxCeXRlQnVmZmVyPiB2YWx1ZXMsIGludCBlbGVtZW50cykKICAgICB7Ci0gICAgICAgIC8vIFRoZSBvbmx5IGNhc2VzIHdlIHNlcmlhbGl6ZS9kZXNlcmlhbGl6ZSBjb2xsZWN0aW9ucyBpbnRlcm5hbGx5IChpLmUuIG5vdCBmb3IgdGhlIHByb3RvY29sIHNha2UpLAotICAgICAgICAvLyBpczoKLSAgICAgICAgLy8gIDEpIHdoZW4gY29sbGVjdGlvbnMgYXJlIGZyb3plbgotICAgICAgICAvLyAgMikgZm9yIGludGVybmFsIGNhbGxzLgotICAgICAgICAvLyBJbiBib3RoIGNhc2UsIHVzaW5nIHRoZSBwcm90b2NvbCAzIHZlcnNpb24gdmFyaWFudCBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uCi0gICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKHZhbHVlLCBhY2Nlc3NvciwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKKyAgICAgICAgcmV0dXJuIHBhY2sodmFsdWVzLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGVsZW1lbnRzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgPFQxPiB2b2lkIHZhbGlkYXRlKFQxIHZhbHVlLCBWYWx1ZUFjY2Vzc29yPFQxPiBhY2Nlc3NvcikgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIFNhbWUgdGhpbmcgYXMgYWJvdmUKLSAgICAgICAgdmFsaWRhdGVGb3JOYXRpdmVQcm90b2NvbCh2YWx1ZSwgYWNjZXNzb3IsIFByb3RvY29sVmVyc2lvbi5WMyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIHBhY2soQ29sbGVjdGlvbjxCeXRlQnVmZmVyPiB2YWx1ZXMsIGludCBlbGVtZW50cywgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCi0gICAgewotICAgICAgICByZXR1cm4gcGFjayh2YWx1ZXMsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgZWxlbWVudHMsIHZlcnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgPFY+IFYgcGFjayhDb2xsZWN0aW9uPFY+IHZhbHVlcywgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgaW50IGVsZW1lbnRzLCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKKyAgICBwdWJsaWMgc3RhdGljIDxWPiBWIHBhY2soQ29sbGVjdGlvbjxWPiB2YWx1ZXMsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIGludCBlbGVtZW50cykKICAgICB7CiAgICAgICAgIGludCBzaXplID0gMDsKICAgICAgICAgZm9yIChWIHZhbHVlIDogdmFsdWVzKQotICAgICAgICAgICAgc2l6ZSArPSBzaXplT2ZWYWx1ZSh2YWx1ZSwgYWNjZXNzb3IsIHZlcnNpb24pOworICAgICAgICAgICAgc2l6ZSArPSBzaXplT2ZWYWx1ZSh2YWx1ZSwgYWNjZXNzb3IpOwogCi0gICAgICAgIEJ5dGVCdWZmZXIgcmVzdWx0ID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShzaXplT2ZDb2xsZWN0aW9uU2l6ZShlbGVtZW50cywgdmVyc2lvbikgKyBzaXplKTsKLSAgICAgICAgd3JpdGVDb2xsZWN0aW9uU2l6ZShyZXN1bHQsIGVsZW1lbnRzLCB2ZXJzaW9uKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciByZXN1bHQgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHNpemVPZkNvbGxlY3Rpb25TaXplKCkgKyBzaXplKTsKKyAgICAgICAgd3JpdGVDb2xsZWN0aW9uU2l6ZShyZXN1bHQsIGVsZW1lbnRzKTsKICAgICAgICAgZm9yIChWIHZhbHVlIDogdmFsdWVzKQogICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVZhbHVlKHJlc3VsdCwgdmFsdWUsIGFjY2Vzc29yLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIHdyaXRlVmFsdWUocmVzdWx0LCB2YWx1ZSwgYWNjZXNzb3IpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBhY2Nlc3Nvci52YWx1ZU9mKChCeXRlQnVmZmVyKSByZXN1bHQuZmxpcCgpKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgd3JpdGVDb2xsZWN0aW9uU2l6ZShCeXRlQnVmZmVyIG91dHB1dCwgaW50IGVsZW1lbnRzLCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgd3JpdGVDb2xsZWN0aW9uU2l6ZShCeXRlQnVmZmVyIG91dHB1dCwgaW50IGVsZW1lbnRzKQogICAgIHsKICAgICAgICAgb3V0cHV0LnB1dEludChlbGVtZW50cyk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZENvbGxlY3Rpb25TaXplKEJ5dGVCdWZmZXIgaW5wdXQsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB2ZXJzaW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIDxWPiBpbnQgcmVhZENvbGxlY3Rpb25TaXplKFYgdmFsdWUsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQorICAgIHB1YmxpYyBzdGF0aWMgPFY+IGludCByZWFkQ29sbGVjdGlvblNpemUoViB2YWx1ZSwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvcikKICAgICB7CiAgICAgICAgIHJldHVybiBhY2Nlc3Nvci50b0ludCh2YWx1ZSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBpbnQgc2l6ZU9mQ29sbGVjdGlvblNpemUoaW50IGVsZW1lbnRzLCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKKyAgICBwdWJsaWMgc3RhdGljIGludCBzaXplT2ZDb2xsZWN0aW9uU2l6ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gVHlwZVNpemVzLklOVF9TSVpFOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgPFY+IHZvaWQgd3JpdGVWYWx1ZShCeXRlQnVmZmVyIG91dHB1dCwgViB2YWx1ZSwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCisgICAgcHVibGljIHN0YXRpYyA8Vj4gdm9pZCB3cml0ZVZhbHVlKEJ5dGVCdWZmZXIgb3V0cHV0LCBWIHZhbHVlLCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yKQogICAgIHsKICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCiAgICAgICAgIHsKQEAgLTExOCw3ICs5MSw3IEBACiAgICAgICAgIGFjY2Vzc29yLndyaXRlKHZhbHVlLCBvdXRwdXQpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgPFY+IFYgcmVhZFZhbHVlKFYgaW5wdXQsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIGludCBvZmZzZXQsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQorICAgIHB1YmxpYyBzdGF0aWMgPFY+IFYgcmVhZFZhbHVlKFYgaW5wdXQsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIGludCBvZmZzZXQpCiAgICAgewogICAgICAgICBpbnQgc2l6ZSA9IGFjY2Vzc29yLmdldEludChpbnB1dCwgb2Zmc2V0KTsKICAgICAgICAgaWYgKHNpemUgPCAwKQpAQCAtMTI3LDI3ICsxMDAsMjcgQEAKICAgICAgICAgcmV0dXJuIGFjY2Vzc29yLnNsaWNlKGlucHV0LCBvZmZzZXQgKyBUeXBlU2l6ZXMuSU5UX1NJWkUsIHNpemUpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgPFY+IFYgcmVhZE5vbk51bGxWYWx1ZShWIGlucHV0LCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBpbnQgb2Zmc2V0LCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKKyAgICBwdWJsaWMgc3RhdGljIDxWPiBWIHJlYWROb25OdWxsVmFsdWUoViBpbnB1dCwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgaW50IG9mZnNldCkKICAgICB7Ci0gICAgICAgIFYgdmFsdWUgPSByZWFkVmFsdWUoaW5wdXQsIGFjY2Vzc29yLCBvZmZzZXQsIHZlcnNpb24pOworICAgICAgICBWIHZhbHVlID0gcmVhZFZhbHVlKGlucHV0LCBhY2Nlc3Nvciwgb2Zmc2V0KTsKICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCiAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiTnVsbCB2YWx1ZSByZWFkIHdoZW4gbm90IGFsbG93ZWQiKTsKICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBza2lwVmFsdWUoQnl0ZUJ1ZmZlciBpbnB1dCwgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNraXBWYWx1ZShCeXRlQnVmZmVyIGlucHV0KQogICAgIHsKICAgICAgICAgaW50IHNpemUgPSBpbnB1dC5nZXRJbnQoKTsKICAgICAgICAgaW5wdXQucG9zaXRpb24oaW5wdXQucG9zaXRpb24oKSArIHNpemUpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgPFY+IGludCBza2lwVmFsdWUoViBpbnB1dCwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgaW50IG9mZnNldCwgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCisgICAgcHVibGljIHN0YXRpYyA8Vj4gaW50IHNraXBWYWx1ZShWIGlucHV0LCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBpbnQgb2Zmc2V0KQogICAgIHsKICAgICAgICAgaW50IHNpemUgPSBhY2Nlc3Nvci5nZXRJbnQoaW5wdXQsIG9mZnNldCk7CiAgICAgICAgIHJldHVybiBUeXBlU2l6ZXMuc2l6ZW9mKHNpemUpICsgc2l6ZTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIDxWPiBpbnQgc2l6ZU9mVmFsdWUoViB2YWx1ZSwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCisgICAgcHVibGljIHN0YXRpYyA8Vj4gaW50IHNpemVPZlZhbHVlKFYgdmFsdWUsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IpCiAgICAgewogICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IDQgOiA0ICsgYWNjZXNzb3Iuc2l6ZSh2YWx1ZSk7CiAgICAgfQpAQCAtMTg4LDIwICsxNjEsNzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZnJvemVuKTsKIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIGFuIGVsZW1lbnQgaW4gYSBzZXJpYWxpemVkIGNvbGxlY3Rpb24uCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgc2V0cyBhbmQgbWFwcywgYnV0IG5vdCBieSBsaXN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2xsZWN0aW9uIFRoZSBzZXJpYWxpemVkIGNvbGxlY3Rpb24uIFRoaXMgY2Fubm90IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHdoaWNoIHRoZSBpbmRleCBtdXN0IGJlIGZvdW5kLiBUaGlzIGNhbm5vdCBiZSB7QGNvZGUgbnVsbH0gbm9yCisgICAgICoge0BsaW5rIEJ5dGVCdWZmZXJVdGlsI1VOU0VUX0JZVEVfQlVGRkVSfSkuCisgICAgICogQHBhcmFtIGNvbXBhcmF0b3IgVGhlIHR5cGUgdG8gdXNlIHRvIGNvbXBhcmUgdGhlIHtAY29kZSBrZXl9IHZhbHVlIHRvIHRob3NlIGluIHRoZSBjb2xsZWN0aW9uLgorICAgICAqIEByZXR1cm4gVGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCB7QGNvZGUga2V5fSBpZiBvbmUgZXhpc3RzLCB7QGNvZGUgLTF9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEluZGV4RnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciBjb2xsZWN0aW9uLCBCeXRlQnVmZmVyIGtleSwgQWJzdHJhY3RUeXBlPD8+IGNvbXBhcmF0b3IpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmFuZ2Ugb2YgaW5kZXhlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNlcmlhbGl6ZWQgY29sbGVjdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHN1cHBvcnRlZCBieSBzZXRzIGFuZCBtYXBzLCBidXQgbm90IGJ5IGxpc3RzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbGxlY3Rpb24gVGhlIHNlcmlhbGl6ZWQgY29sbGVjdGlvbi4gVGhpcyBjYW5ub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBwYXJhbSBmcm9tICBUaGUgbGVmdCBib3VuZCBvZiB0aGUgc2xpY2UgdG8gZXh0cmFjdC4gVGhpcyBjYW5ub3QgYmUge0Bjb2RlIG51bGx9IGJ1dCBpZiB0aGlzIGlzCisgICAgICoge0BsaW5rIEJ5dGVCdWZmZXJVdGlsI1VOU0VUX0JZVEVfQlVGRkVSfSwgdGhlbiB0aGUgcmV0dXJuZWQgc2xpY2Ugc3RhcnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbGxlY3Rpb24uCisgICAgICogQHBhcmFtIHRvIFRoZSBsZWZ0IGJvdW5kIG9mIHRoZSBzbGljZSB0byBleHRyYWN0LiBUaGlzIGNhbm5vdCBiZSB7QGNvZGUgbnVsbH0gYnV0IGlmIHRoaXMgaXMKKyAgICAgKiB7QGxpbmsgQnl0ZUJ1ZmZlclV0aWwjVU5TRVRfQllURV9CVUZGRVJ9LCB0aGVuIHRoZSByZXR1cm5lZCBzbGljZSBlbmRzIGF0IHRoZSBlbmQgb2YgdGhlIGNvbGxlY3Rpb24uCisgICAgICogQHBhcmFtIGNvbXBhcmF0b3IgVGhlIHR5cGUgdG8gdXNlIHRvIGNvbXBhcmUgdGhlIHtAY29kZSBmcm9tfSBhbmQge0Bjb2RlIHRvfSB2YWx1ZXMgdG8gdGhvc2UgaW4gdGhlIGNvbGxlY3Rpb24uCisgICAgICogQHJldHVybiBUaGUgcmFuZ2Ugb2YgaW5kZXhlcyBjb3JyZXNwb25kaW5nIHRvIHNwZWNpZmllZCByYW5nZSBvZiBlbGVtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgUmFuZ2U8SW50ZWdlcj4gZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBjb21wYXJhdG9yKTsKKworICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgc2VyaWFsaXplZCBtYXAgY29tcG9zZWQgZnJvbSB0aGUgZGF0YSBmcm9tIHtAY29kZSBpbnB1dH0gYmV0d2VlbiB7QGNvZGUgc3RhcnRQb3N9CiAgICAgICogKGluY2x1c2l2ZSkgYW5kIHtAY29kZSBlbmRQb3N9IChleGNsdXNpdmUpLCBhc3N1bWluZyB0aGF0IGRhdGEgaG9sZHMge0Bjb2RlIGNvdW50fSBlbGVtZW50cy4KICAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBjb3B5QXNOZXdDb2xsZWN0aW9uKEJ5dGVCdWZmZXIgaW5wdXQsIGludCBjb3VudCwgaW50IHN0YXJ0UG9zLCBpbnQgZW5kUG9zLCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKKyAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBjb3B5QXNOZXdDb2xsZWN0aW9uKEJ5dGVCdWZmZXIgaW5wdXQsIGludCBjb3VudCwgaW50IHN0YXJ0UG9zLCBpbnQgZW5kUG9zKQogICAgIHsKLSAgICAgICAgaW50IHNpemVMZW4gPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZShjb3VudCwgdmVyc2lvbik7CisgICAgICAgIGludCBzaXplTGVuID0gc2l6ZU9mQ29sbGVjdGlvblNpemUoKTsKICAgICAgICAgaWYgKGNvdW50ID09IDApCiAgICAgICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShzaXplTGVuKTsKIAogICAgICAgICBpbnQgYm9keUxlbiA9IGVuZFBvcyAtIHN0YXJ0UG9zOwogICAgICAgICBCeXRlQnVmZmVyIG91dHB1dCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoc2l6ZUxlbiArIGJvZHlMZW4pOwotICAgICAgICB3cml0ZUNvbGxlY3Rpb25TaXplKG91dHB1dCwgY291bnQsIHZlcnNpb24pOworICAgICAgICB3cml0ZUNvbGxlY3Rpb25TaXplKG91dHB1dCwgY291bnQpOwogICAgICAgICBvdXRwdXQucG9zaXRpb24oMCk7CiAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmNvcHlCeXRlcyhpbnB1dCwgc3RhcnRQb3MsIG91dHB1dCwgc2l6ZUxlbiwgYm9keUxlbik7CiAgICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgZm9yRWFjaChCeXRlQnVmZmVyIGlucHV0LCBDb25zdW1lcjxCeXRlQnVmZmVyPiBhY3Rpb24pCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvbGxlY3Rpb25TaXplID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sbGVjdGlvblNpemU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gcmVhZFZhbHVlKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOworCisgICAgICAgICAgICAgICAgYWN0aW9uLmFjY2VwdCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEJ1ZmZlclVuZGVyZmxvd0V4Y2VwdGlvbiB8IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIk5vdCBlbm91Z2ggYnl0ZXMgdG8gcmVhZCBhIHNldCIpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvRHVyYXRpb25TZXJpYWxpemVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9EdXJhdGlvblNlcmlhbGl6ZXIuamF2YQppbmRleCAyNTRiMmIwLi43ODMyNmUxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9EdXJhdGlvblNlcmlhbGl6ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9EdXJhdGlvblNlcmlhbGl6ZXIuamF2YQpAQCAtMTcsOSArMTcsNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzOwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5EdXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlZhbHVlQWNjZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRCdWZmZXI7CkBAIC0yNyw2ICsyNCw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCiBwdWJsaWMgZmluYWwgY2xhc3MgRHVyYXRpb25TZXJpYWxpemVyIGV4dGVuZHMgVHlwZVNlcmlhbGl6ZXI8RHVyYXRpb24+CiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBEdXJhdGlvblNlcmlhbGl6ZXIgaW5zdGFuY2UgPSBuZXcgRHVyYXRpb25TZXJpYWxpemVyKCk7CkBAIC02NSw4ICs2NSw4IEBACiAKICAgICAgICAgdHJ5IChEYXRhSW5wdXRCdWZmZXIgaW4gPSBuZXcgRGF0YUlucHV0QnVmZmVyKGFjY2Vzc29yLnRvQnVmZmVyKHZhbHVlKSwgdHJ1ZSkpICAvLyBUT0RPOiBtYWtlIGEgdmFsdWUgaW5wdXQgYnVmZmVyCiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBtb250aHMgPSAoaW50KSBpbi5yZWFkVkludCgpOwotICAgICAgICAgICAgaW50IGRheXMgPSAoaW50KSBpbi5yZWFkVkludCgpOworICAgICAgICAgICAgaW50IG1vbnRocyA9IGluLnJlYWRWSW50MzIoKTsKKyAgICAgICAgICAgIGludCBkYXlzID0gaW4ucmVhZFZJbnQzMigpOwogICAgICAgICAgICAgbG9uZyBuYW5vc2Vjb25kcyA9IGluLnJlYWRWSW50KCk7CiAgICAgICAgICAgICByZXR1cm4gRHVyYXRpb24ubmV3SW5zdGFuY2UobW9udGhzLCBkYXlzLCBuYW5vc2Vjb25kcyk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0xpc3RTZXJpYWxpemVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9MaXN0U2VyaWFsaXplci5qYXZhCmluZGV4IDdhMmY2MzQuLmYxMGU4ZjcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL0xpc3RTZXJpYWxpemVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvTGlzdFNlcmlhbGl6ZXIuamF2YQpAQCAtMjUsMjQgKzI1LDI3IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5SYW5nZTsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVCdWZmZXJBY2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlZhbHVlQWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIAogcHVibGljIGNsYXNzIExpc3RTZXJpYWxpemVyPFQ+IGV4dGVuZHMgQ29sbGVjdGlvblNlcmlhbGl6ZXI8TGlzdDxUPj4KIHsKICAgICAvLyBpbnRlcm5pbmcgaW5zdGFuY2VzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudE1hcDxUeXBlU2VyaWFsaXplcjw/PiwgTGlzdFNlcmlhbGl6ZXI+IGluc3RhbmNlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxUeXBlU2VyaWFsaXplcjw/PiwgTGlzdFNlcmlhbGl6ZXI+KCk7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25jdXJyZW50TWFwPFR5cGVTZXJpYWxpemVyPD8+LCBMaXN0U2VyaWFsaXplcj4gaW5zdGFuY2VzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKIAogICAgIHB1YmxpYyBmaW5hbCBUeXBlU2VyaWFsaXplcjxUPiBlbGVtZW50czsKIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogICAgIHB1YmxpYyBzdGF0aWMgPFQ+IExpc3RTZXJpYWxpemVyPFQ+IGdldEluc3RhbmNlKFR5cGVTZXJpYWxpemVyPFQ+IGVsZW1lbnRzKQogICAgIHsKICAgICAgICAgTGlzdFNlcmlhbGl6ZXI8VD4gdCA9IGluc3RhbmNlcy5nZXQoZWxlbWVudHMpOwogICAgICAgICBpZiAodCA9PSBudWxsKQotICAgICAgICAgICAgdCA9IGluc3RhbmNlcy5jb21wdXRlSWZBYnNlbnQoZWxlbWVudHMsIGsgLT4gbmV3IExpc3RTZXJpYWxpemVyPD4oaykgKTsKKyAgICAgICAgICAgIHQgPSBpbnN0YW5jZXMuY29tcHV0ZUlmQWJzZW50KGVsZW1lbnRzLCBMaXN0U2VyaWFsaXplcjo6bmV3KTsKICAgICAgICAgcmV0dXJuIHQ7CiAgICAgfQogCkBAIC01MSw2ICs1NCw3IEBACiAgICAgICAgIHRoaXMuZWxlbWVudHMgPSBlbGVtZW50czsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgTGlzdDxCeXRlQnVmZmVyPiBzZXJpYWxpemVWYWx1ZXMoTGlzdDxUPiB2YWx1ZXMpCiAgICAgewogICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IG91dHB1dCA9IG5ldyBBcnJheUxpc3Q8Pih2YWx1ZXMuc2l6ZSgpKTsKQEAgLTU5LDIxICs2MywyMyBAQAogICAgICAgICByZXR1cm4gb3V0cHV0OwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0RWxlbWVudENvdW50KExpc3Q8VD4gdmFsdWUpCiAgICAgewogICAgICAgICByZXR1cm4gdmFsdWUuc2l6ZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyA8Vj4gdm9pZCB2YWxpZGF0ZUZvck5hdGl2ZVByb3RvY29sKFYgaW5wdXQsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Vj4gdm9pZCB2YWxpZGF0ZShWIGlucHV0LCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yKQogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBuID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBhY2Nlc3NvciwgdmVyc2lvbik7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc2l6ZU9mQ29sbGVjdGlvblNpemUobiwgdmVyc2lvbik7CisgICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgYWNjZXNzb3IpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWIHZhbHVlID0gcmVhZE5vbk51bGxWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKHZhbHVlLCBhY2Nlc3NvciwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgViB2YWx1ZSA9IHJlYWROb25OdWxsVmFsdWUoaW5wdXQsIGFjY2Vzc29yLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIG9mZnNldCArPSBzaXplT2ZWYWx1ZSh2YWx1ZSwgYWNjZXNzb3IpOwogICAgICAgICAgICAgICAgIGVsZW1lbnRzLnZhbGlkYXRlKHZhbHVlLCBhY2Nlc3Nvcik7CiAgICAgICAgICAgICB9CiAKQEAgLTg2LDEyICs5MiwxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIDxWPiBMaXN0PFQ+IGRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woViBpbnB1dCwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiBMaXN0PFQ+IGRlc2VyaWFsaXplKFYgaW5wdXQsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IpCiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIGFjY2Vzc29yLCB2ZXJzaW9uKTsKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZShuLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIGludCBuID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBhY2Nlc3Nvcik7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc2l6ZU9mQ29sbGVjdGlvblNpemUoKTsKIAogICAgICAgICAgICAgaWYgKG4gPCAwKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJUaGUgZGF0YSBjYW5ub3QgYmUgZGVzZXJpYWxpemVkIGFzIGEgbGlzdCIpOwpAQCAtMTAwLDcgKzEwNyw3IEBACiAgICAgICAgICAgICAvLyBJbiBzdWNoIGEgY2FzZSB3ZSBkbyBub3Qgd2FudCB0byBpbml0aWFsaXplIHRoZSBsaXN0IHdpdGggdGhhdCBzaXplIGFzIGl0IGNhbiByZXN1bHQKICAgICAgICAgICAgIC8vIGluIGFuIE9PTSAoc2VlIENBU1NBTkRSQS0xMjYxOCkuIE9uIHRoZSBvdGhlciBoYW5kIHdlIGRvIG5vdCB3YW50IHRvIGhhdmUgdG8gcmVzaXplIHRoZSBsaXN0CiAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gYXZvaWQgaXQsIHNvIHdlIHB1dCBhIHJlYXNvbmFibGUgbGltaXQgb24gdGhlIGluaXRpYWxDYXBhY2l0eS4KLSAgICAgICAgICAgIExpc3Q8VD4gbCA9IG5ldyBBcnJheUxpc3Q8VD4oTWF0aC5taW4obiwgMjU2KSk7CisgICAgICAgICAgICBMaXN0PFQ+IGwgPSBuZXcgQXJyYXlMaXN0PD4oTWF0aC5taW4obiwgMjU2KSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBDQVNTQU5EUkEtNjgzOTogIldlIGNhbiBoYXZlIG51bGxzIGluIGxpc3RzIHRoYXQgYXJlIHVzZWQgZm9yIElOIHZhbHVlcyIKQEAgLTEwOSw4ICsxMTYsOCBAQAogICAgICAgICAgICAgICAgIC8vIGZvciBpdCwgYnV0IHNob3VsZCBsaWtlbHkgYmUgY2hhbmdlZCB0byByZWFkTm9uTnVsbC4gVmFsaWRhdGUgaGFzIGJlZW4KICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VkIHRvIHRocm93IG9uIG51bGwgZWxlbWVudHMgYXMgb3RoZXJ3aXNlIGl0IHdvdWxkIE5QRSwgYW5kIGl0J3MgdW5jbGVhcgogICAgICAgICAgICAgICAgIC8vIGlmIGNhbGxlcnMgY291bGQgaGFuZGxlIG51bGwgZWxlbWVudHMuCi0gICAgICAgICAgICAgICAgViBkYXRhYmIgPSByZWFkVmFsdWUoaW5wdXQsIGFjY2Vzc29yLCBvZmZzZXQsIHZlcnNpb24pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSBzaXplT2ZWYWx1ZShkYXRhYmIsIGFjY2Vzc29yLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBWIGRhdGFiYiA9IHJlYWRWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKGRhdGFiYiwgYWNjZXNzb3IpOwogICAgICAgICAgICAgICAgIGlmIChkYXRhYmIgIT0gbnVsbCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnZhbGlkYXRlKGRhdGFiYiwgYWNjZXNzb3IpOwpAQCAtMTQyLDggKzE0OSw4IEBACiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgaW50IHMgPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIGFjY2Vzc29yLCBQcm90b2NvbFZlcnNpb24uVjMpOwotICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKHMsIFByb3RvY29sVmVyc2lvbi5WMyk7CisgICAgICAgICAgICBpbnQgcyA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgYWNjZXNzb3IpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKCk7CiAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKQogICAgICAgICAgICAgewpAQCAtMTc4LDggKzE4NSw4IEBACiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIGFjY2Vzc29yLCBQcm90b2NvbFZlcnNpb24uVjMpOwotICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKG4sIFByb3RvY29sVmVyc2lvbi5WMyk7CisgICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgYWNjZXNzb3IpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKCk7CiAgICAgICAgICAgICBpZiAobiA8PSBpbmRleCkKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKIApAQCAtMTg4LDcgKzE5NSw3IEBACiAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IGFjY2Vzc29yLmdldEludChpbnB1dCwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gVHlwZVNpemVzLklOVF9TSVpFICsgbGVuZ3RoOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlYWRWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKKyAgICAgICAgICAgIHJldHVybiByZWFkVmFsdWUoaW5wdXQsIGFjY2Vzc29yLCBvZmZzZXQpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChCdWZmZXJVbmRlcmZsb3dFeGNlcHRpb24gfCBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKQEAgLTIwMSw2ICsyMDgsNyBAQAogICAgICAgICByZXR1cm4gZ2V0RWxlbWVudChpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBpbmRleCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhMaXN0PFQ+IHZhbHVlKQogICAgIHsKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CkBAIC0yMTgsNiArMjI2LDggQEAKICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQogICAgIHB1YmxpYyBDbGFzczxMaXN0PFQ+PiBnZXRUeXBlKCkKICAgICB7CiAgICAgICAgIHJldHVybiAoQ2xhc3MpIExpc3QuY2xhc3M7CkBAIC0yMjYsNyArMjM2LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRTZXJpYWxpemVkVmFsdWUoQnl0ZUJ1ZmZlciBjb2xsZWN0aW9uLCBCeXRlQnVmZmVyIGtleSwgQWJzdHJhY3RUeXBlPD8+IGNvbXBhcmF0b3IpCiAgICAgewotICAgICAgICAvLyBXZSBkb24ndCBhbGxvdyBzZWxlY3RpbmcgYW4gZWxlbWVudCBvZiBhIGxpc3Qgc28gd2UgZG9uJ3QgbmVlZCB0aGlzLgorICAgICAgICAvLyBXZSBkb24ndCBhbGxvdyBzZWxlY3RpbmcgYW4gZWxlbWVudCBvZiBhIGxpc3QsIHNvIHdlIGRvbid0IG5lZWQgdGhpcy4KICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgfQogCkBAIC0yMzcsNyArMjQ3LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gY29tcGFyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZnJvemVuKQogICAgIHsKLSAgICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgc2xpY2luZyBvZiBsaXN0IHNvIHdlIGRvbid0IG5lZWQgdGhpcy4KKyAgICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgc2xpY2luZyBvZiBsaXN0cywgc28gd2UgZG9uJ3QgbmVlZCB0aGlzLgorICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEluZGV4RnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciBjb2xsZWN0aW9uLCBCeXRlQnVmZmVyIGtleSwgQWJzdHJhY3RUeXBlPD8+IGNvbXBhcmF0b3IpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmFuZ2U8SW50ZWdlcj4gZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciBjb2xsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBjb21wYXJhdG9yKQorICAgIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvTWFwU2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvTWFwU2VyaWFsaXplci5qYXZhCmluZGV4IDJlMzYzYjQuLjllYjA2NDIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL01hcFNlcmlhbGl6ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9NYXBTZXJpYWxpemVyLmphdmEKQEAgLTIwLDQ5ICsyMCw1NSBAQAogCiBpbXBvcnQgamF2YS5uaW8uQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5WYWx1ZUNvbXBhcmF0b3JzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVmFsdWVBY2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVmFsdWVDb21wYXJhdG9yczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogCi1wdWJsaWMgY2xhc3MgTWFwU2VyaWFsaXplcjxLLCBWPiBleHRlbmRzIENvbGxlY3Rpb25TZXJpYWxpemVyPE1hcDxLLCBWPj4KK3B1YmxpYyBjbGFzcyBNYXBTZXJpYWxpemVyPEssIFY+IGV4dGVuZHMgQWJzdHJhY3RNYXBTZXJpYWxpemVyPE1hcDxLLCBWPj4KIHsKICAgICAvLyBpbnRlcm5pbmcgaW5zdGFuY2VzCisgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25jdXJyZW50TWFwPFBhaXI8VHlwZVNlcmlhbGl6ZXI8Pz4sIFR5cGVTZXJpYWxpemVyPD8+PiwgTWFwU2VyaWFsaXplcj4gaW5zdGFuY2VzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKIAogICAgIHB1YmxpYyBmaW5hbCBUeXBlU2VyaWFsaXplcjxLPiBrZXlzOwogICAgIHB1YmxpYyBmaW5hbCBUeXBlU2VyaWFsaXplcjxWPiB2YWx1ZXM7CiAgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZUNvbXBhcmF0b3JzIGNvbXBhcmF0b3JzOwogCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgcHVibGljIHN0YXRpYyA8SywgVj4gTWFwU2VyaWFsaXplcjxLLCBWPiBnZXRJbnN0YW5jZShUeXBlU2VyaWFsaXplcjxLPiBrZXlzLCBUeXBlU2VyaWFsaXplcjxWPiB2YWx1ZXMsIFZhbHVlQ29tcGFyYXRvcnMgY29tcGFyYXRvcnMpCiAgICAgewogICAgICAgICBQYWlyPFR5cGVTZXJpYWxpemVyPD8+LCBUeXBlU2VyaWFsaXplcjw/Pj4gcCA9IFBhaXIuY3JlYXRlKGtleXMsIHZhbHVlcyk7CiAgICAgICAgIE1hcFNlcmlhbGl6ZXI8SywgVj4gdCA9IGluc3RhbmNlcy5nZXQocCk7CiAgICAgICAgIGlmICh0ID09IG51bGwpCi0gICAgICAgICAgICB0ID0gaW5zdGFuY2VzLmNvbXB1dGVJZkFic2VudChwLCBrIC0+IG5ldyBNYXBTZXJpYWxpemVyPD4oay5sZWZ0LCBrLnJpZ2h0LCBjb21wYXJhdG9ycykgKTsKKyAgICAgICAgICAgIHQgPSBpbnN0YW5jZXMuY29tcHV0ZUlmQWJzZW50KHAsIGsgLT4gbmV3IE1hcFNlcmlhbGl6ZXI8PihrLmxlZnQsIGsucmlnaHQsIGNvbXBhcmF0b3JzKSk7CiAgICAgICAgIHJldHVybiB0OwogICAgIH0KIAogICAgIHByaXZhdGUgTWFwU2VyaWFsaXplcihUeXBlU2VyaWFsaXplcjxLPiBrZXlzLCBUeXBlU2VyaWFsaXplcjxWPiB2YWx1ZXMsIFZhbHVlQ29tcGFyYXRvcnMgY29tcGFyYXRvcnMpCiAgICAgeworICAgICAgICBzdXBlcih0cnVlKTsKICAgICAgICAgdGhpcy5rZXlzID0ga2V5czsKICAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CiAgICAgICAgIHRoaXMuY29tcGFyYXRvcnMgPSBjb21wYXJhdG9yczsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTGlzdDxCeXRlQnVmZmVyPiBzZXJpYWxpemVWYWx1ZXMoTWFwPEssIFY+IG1hcCkKICAgICB7CiAgICAgICAgIExpc3Q8UGFpcjxCeXRlQnVmZmVyLCBCeXRlQnVmZmVyPj4gcGFpcnMgPSBuZXcgQXJyYXlMaXN0PD4obWFwLnNpemUoKSk7CiAgICAgICAgIGZvciAoTWFwLkVudHJ5PEssIFY+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICBwYWlycy5hZGQoUGFpci5jcmVhdGUoa2V5cy5zZXJpYWxpemUoZW50cnkuZ2V0S2V5KCkpLCB2YWx1ZXMuc2VyaWFsaXplKGVudHJ5LmdldFZhbHVlKCkpKSk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQocGFpcnMsIChsLCByKSAtPiBjb21wYXJhdG9ycy5idWZmZXIuY29tcGFyZShsLmxlZnQsIHIubGVmdCkpOworICAgICAgICBwYWlycy5zb3J0KChsLCByKSAtPiBjb21wYXJhdG9ycy5idWZmZXIuY29tcGFyZShsLmxlZnQsIHIubGVmdCkpOwogICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IGJ1ZmZlcnMgPSBuZXcgQXJyYXlMaXN0PD4ocGFpcnMuc2l6ZSgpICogMik7CiAgICAgICAgIGZvciAoUGFpcjxCeXRlQnVmZmVyLCBCeXRlQnVmZmVyPiBwIDogcGFpcnMpCiAgICAgICAgIHsKQEAgLTcyLDI4ICs3OCwzMCBAQAogICAgICAgICByZXR1cm4gYnVmZmVyczsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldEVsZW1lbnRDb3VudChNYXA8SywgVj4gdmFsdWUpCiAgICAgewogICAgICAgICByZXR1cm4gdmFsdWUuc2l6ZSgpOwogICAgIH0KIAotICAgIHB1YmxpYyA8VD4gdm9pZCB2YWxpZGF0ZUZvck5hdGl2ZVByb3RvY29sKFQgaW5wdXQsIFZhbHVlQWNjZXNzb3I8VD4gYWNjZXNzb3IsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gdm9pZCB2YWxpZGF0ZShUIGlucHV0LCBWYWx1ZUFjY2Vzc29yPFQ+IGFjY2Vzc29yKQogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIEVtcHR5IHZhbHVlcyBhcmUgc3RpbGwgdmFsaWQuCiAgICAgICAgICAgICBpZiAoYWNjZXNzb3IuaXNFbXB0eShpbnB1dCkpIHJldHVybjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIGFjY2Vzc29yLCB2ZXJzaW9uKTsKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZShuLCB2ZXJzaW9uKTsKKworICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIGFjY2Vzc29yKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZSgpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVCBrZXkgPSByZWFkTm9uTnVsbFZhbHVlKGlucHV0LCBhY2Nlc3Nvciwgb2Zmc2V0LCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUoa2V5LCBhY2Nlc3NvciwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgVCBrZXkgPSByZWFkTm9uTnVsbFZhbHVlKGlucHV0LCBhY2Nlc3Nvciwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUoa2V5LCBhY2Nlc3Nvcik7CiAgICAgICAgICAgICAgICAga2V5cy52YWxpZGF0ZShrZXksIGFjY2Vzc29yKTsKIAotICAgICAgICAgICAgICAgIFQgdmFsdWUgPSByZWFkTm9uTnVsbFZhbHVlKGlucHV0LCBhY2Nlc3Nvciwgb2Zmc2V0LCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUodmFsdWUsIGFjY2Vzc29yLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBUIHZhbHVlID0gcmVhZE5vbk51bGxWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKHZhbHVlLCBhY2Nlc3Nvcik7CiAgICAgICAgICAgICAgICAgdmFsdWVzLnZhbGlkYXRlKHZhbHVlLCBhY2Nlc3Nvcik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIWFjY2Vzc29yLmlzRW1wdHlGcm9tT2Zmc2V0KGlucHV0LCBvZmZzZXQpKQpAQCAtMTA1LDEyICsxMTMsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyA8ST4gTWFwPEssIFY+IGRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woSSBpbnB1dCwgVmFsdWVBY2Nlc3NvcjxJPiBhY2Nlc3NvciwgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxJPiBNYXA8SywgVj4gZGVzZXJpYWxpemUoSSBpbnB1dCwgVmFsdWVBY2Nlc3NvcjxJPiBhY2Nlc3NvcikKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgYWNjZXNzb3IsIHZlcnNpb24pOwotICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKG4sIHZlcnNpb24pOworICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIGFjY2Vzc29yKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZSgpOwogCiAgICAgICAgICAgICBpZiAobiA8IDApCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIlRoZSBkYXRhIGNhbm5vdCBiZSBkZXNlcmlhbGl6ZWQgYXMgYSBtYXAiKTsKQEAgLTExOSwxNSArMTI4LDE1IEBACiAgICAgICAgICAgICAvLyBJbiBzdWNoIGEgY2FzZSB3ZSBkbyBub3Qgd2FudCB0byBpbml0aWFsaXplIHRoZSBtYXAgd2l0aCB0aGF0IGluaXRpYWxDYXBhY2l0eSBhcyBpdCBjYW4gcmVzdWx0CiAgICAgICAgICAgICAvLyBpbiBhbiBPT00gd2hlbiBwdXQgaXMgY2FsbGVkIChzZWUgQ0FTU0FORFJBLTEyNjE4KS4gT24gdGhlIG90aGVyIGhhbmQgd2UgZG8gbm90IHdhbnQgdG8gaGF2ZSB0byByZXNpemUKICAgICAgICAgICAgIC8vIHRoZSBtYXAgaWYgd2UgY2FuIGF2b2lkIGl0LCBzbyB3ZSBwdXQgYSByZWFzb25hYmxlIGxpbWl0IG9uIHRoZSBpbml0aWFsQ2FwYWNpdHkuCi0gICAgICAgICAgICBNYXA8SywgVj4gbSA9IG5ldyBMaW5rZWRIYXNoTWFwPEssIFY+KE1hdGgubWluKG4sIDI1NikpOworICAgICAgICAgICAgTWFwPEssIFY+IG0gPSBuZXcgTGlua2VkSGFzaE1hcDw+KE1hdGgubWluKG4sIDI1NikpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSSBrZXkgPSByZWFkTm9uTnVsbFZhbHVlKGlucHV0LCBhY2Nlc3Nvciwgb2Zmc2V0LCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUoa2V5LCBhY2Nlc3NvciwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgSSBrZXkgPSByZWFkTm9uTnVsbFZhbHVlKGlucHV0LCBhY2Nlc3Nvciwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUoa2V5LCBhY2Nlc3Nvcik7CiAgICAgICAgICAgICAgICAga2V5cy52YWxpZGF0ZShrZXksIGFjY2Vzc29yKTsKIAotICAgICAgICAgICAgICAgIEkgdmFsdWUgPSByZWFkTm9uTnVsbFZhbHVlKGlucHV0LCBhY2Nlc3Nvciwgb2Zmc2V0LCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUodmFsdWUsIGFjY2Vzc29yLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBJIHZhbHVlID0gcmVhZE5vbk51bGxWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKHZhbHVlLCBhY2Nlc3Nvcik7CiAgICAgICAgICAgICAgICAgdmFsdWVzLnZhbGlkYXRlKHZhbHVlLCBhY2Nlc3Nvcik7CiAKICAgICAgICAgICAgICAgICBtLnB1dChrZXlzLmRlc2VyaWFsaXplKGtleSwgYWNjZXNzb3IpLCB2YWx1ZXMuZGVzZXJpYWxpemUodmFsdWUsIGFjY2Vzc29yKSk7CkBAIC0xNDgsMjAgKzE1NywyMCBAQAogICAgICAgICB0cnkKICAgICAgICAgewogICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCA9IGNvbGxlY3Rpb24uZHVwbGljYXRlKCk7Ci0gICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZShuLCBQcm90b2NvbFZlcnNpb24uVjMpOworICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSk7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc2l6ZU9mQ29sbGVjdGlvblNpemUoKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIga2JiID0gcmVhZFZhbHVlKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUoa2JiLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIFByb3RvY29sVmVyc2lvbi5WMyk7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBrYmIgPSByZWFkVmFsdWUoaW5wdXQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUoa2JiLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgIGludCBjb21wYXJpc29uID0gY29tcGFyYXRvci5jb21wYXJlRm9yQ1FMKGtiYiwga2V5KTsKICAgICAgICAgICAgICAgICBpZiAoY29tcGFyaXNvbiA9PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhZFZhbHVlKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRWYWx1ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQpOwogICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBhcmlzb24gPiAwKQogICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSB0aGUgbWFwIGlzIGluIHNvcnRlZCBvcmRlciwgd2Uga25vdyB3ZSd2ZSBnb25lIHRvbyBmYXIgYW5kIHRoZSBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgZWxzZSAvLyBjb21wYXJpc29uIDwgMAotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2tpcFZhbHVlKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNraXBWYWx1ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBvZmZzZXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KQEAgLTE3Miw3NyArMTgxLDYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRTbGljZUZyb21TZXJpYWxpemVkKEJ5dGVCdWZmZXIgY29sbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gY29tcGFyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZnJvemVuKQotICAgIHsKLSAgICAgICAgaWYgKGZyb20gPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIgJiYgdG8gPT0gQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVIpCi0gICAgICAgICAgICByZXR1cm4gY29sbGVjdGlvbjsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCA9IGNvbGxlY3Rpb24uZHVwbGljYXRlKCk7Ci0gICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgICAgIGlucHV0LnBvc2l0aW9uKGlucHV0LnBvc2l0aW9uKCkgKyBzaXplT2ZDb2xsZWN0aW9uU2l6ZShuLCBQcm90b2NvbFZlcnNpb24uVjMpKTsKLSAgICAgICAgICAgIGludCBzdGFydFBvcyA9IGlucHV0LnBvc2l0aW9uKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgYm9vbGVhbiBpblNsaWNlID0gZnJvbSA9PSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUjsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHBvcyA9IGlucHV0LnBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBrYmIgPSByZWFkVmFsdWUoaW5wdXQsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgMCwgUHJvdG9jb2xWZXJzaW9uLlYzKTsgLy8ga2V5Ci0gICAgICAgICAgICAgICAgaW5wdXQucG9zaXRpb24oaW5wdXQucG9zaXRpb24oKSArIHNpemVPZlZhbHVlKGtiYiwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBQcm90b2NvbFZlcnNpb24uVjMpKTsKLQotICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmVuJ3QgcGFzc2VkIHRoZSBzdGFydCBhbHJlYWR5LCBjaGVjayBpZiB3ZSBoYXZlIG5vdwotICAgICAgICAgICAgICAgIGlmICghaW5TbGljZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjb21wYXJpc29uID0gY29tcGFyYXRvci5jb21wYXJlRm9yQ1FMKGZyb20sIGtiYik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJpc29uIDw9IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdyB3aXRoaW4gdGhlIHNsaWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpblNsaWNlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gcG9zOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgYmVmb3JlIHRoZSBzbGljZSBzbyB3ZSBrbm93IHdlIGRvbid0IGNhcmUgYWJvdXQgdGhpcyBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICBza2lwVmFsdWUoaW5wdXQsIFByb3RvY29sVmVyc2lvbi5WMyk7IC8vIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE5vdyBjaGVjayBpZiB3ZSdyZSBkb25lCi0gICAgICAgICAgICAgICAgaW50IGNvbXBhcmlzb24gPSB0byA9PSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUiA/IC0xIDogY29tcGFyYXRvci5jb21wYXJlRm9yQ1FMKGtiYiwgdG8pOwotICAgICAgICAgICAgICAgIGlmIChjb21wYXJpc29uID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUgYW5kIHNob3VsZG4ndCBpbmNsdWRlIHRoZSBrZXkgd2UganVzdCByZWFkCi0gICAgICAgICAgICAgICAgICAgIGlucHV0LnBvc2l0aW9uKHBvcyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UnbGwgaW5jbHVkZSB0aGF0IGVsZW1lbnQKLSAgICAgICAgICAgICAgICBza2lwVmFsdWUoaW5wdXQsIFByb3RvY29sVmVyc2lvbi5WMyk7IC8vIHZhbHVlCi0gICAgICAgICAgICAgICAgKytjb3VudDsKLQotICAgICAgICAgICAgICAgIC8vIEJ1dCBpZiB3ZSBrbm93IGlmIHdhcyB0aGUgbGFzdCBvZiB0aGUgc2xpY2UsIHdlIGJyZWFrIGVhcmx5Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmlzb24gPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwICYmICFmcm96ZW4pCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIHJldHVybiBjb3B5QXNOZXdDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIGNvdW50LCBzdGFydFBvcywgaW5wdXQucG9zaXRpb24oKSwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIHwgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiTm90IGVub3VnaCBieXRlcyB0byByZWFkIGEgbWFwIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKE1hcDxLLCBWPiB2YWx1ZSkKICAgICB7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwpAQCAtMjYyLDggKzIwMCwxNiBAQAogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCiAgICAgcHVibGljIENsYXNzPE1hcDxLLCBWPj4gZ2V0VHlwZSgpCiAgICAgewotICAgICAgICByZXR1cm4gKENsYXNzKU1hcC5jbGFzczsKKyAgICAgICAgcmV0dXJuIChDbGFzcykgTWFwLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZvckVhY2goQnl0ZUJ1ZmZlciBpbnB1dCwgQ29uc3VtZXI8Qnl0ZUJ1ZmZlcj4gYWN0aW9uKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvU2V0U2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvU2V0U2VyaWFsaXplci5qYXZhCmluZGV4IGJmNTY1YmUuLjU5OWMyYTggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL1NldFNlcmlhbGl6ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9TZXRTZXJpYWxpemVyLmphdmEKQEAgLTIwLDI2ICsyMCwyOCBAQAogCiBpbXBvcnQgamF2YS5uaW8uQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVCdWZmZXJBY2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlZhbHVlQ29tcGFyYXRvcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5WYWx1ZUFjY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVCdWZmZXJBY2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlZhbHVlQWNjZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5WYWx1ZUNvbXBhcmF0b3JzOwogCi1wdWJsaWMgY2xhc3MgU2V0U2VyaWFsaXplcjxUPiBleHRlbmRzIENvbGxlY3Rpb25TZXJpYWxpemVyPFNldDxUPj4KK3B1YmxpYyBjbGFzcyBTZXRTZXJpYWxpemVyPFQ+IGV4dGVuZHMgQWJzdHJhY3RNYXBTZXJpYWxpemVyPFNldDxUPj4KIHsKICAgICAvLyBpbnRlcm5pbmcgaW5zdGFuY2VzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudE1hcDxUeXBlU2VyaWFsaXplcjw/PiwgU2V0U2VyaWFsaXplcj4gaW5zdGFuY2VzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFR5cGVTZXJpYWxpemVyPD8+LCBTZXRTZXJpYWxpemVyPigpOworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudE1hcDxUeXBlU2VyaWFsaXplcjw/PiwgU2V0U2VyaWFsaXplcj4gaW5zdGFuY2VzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKIAogICAgIHB1YmxpYyBmaW5hbCBUeXBlU2VyaWFsaXplcjxUPiBlbGVtZW50czsKICAgICBwcml2YXRlIGZpbmFsIFZhbHVlQ29tcGFyYXRvcnMgY29tcGFyYXRvcnM7CiAKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKICAgICBwdWJsaWMgc3RhdGljIDxUPiBTZXRTZXJpYWxpemVyPFQ+IGdldEluc3RhbmNlKFR5cGVTZXJpYWxpemVyPFQ+IGVsZW1lbnRzLCBWYWx1ZUNvbXBhcmF0b3JzIGNvbXBhcmF0b3JzKQogICAgIHsKICAgICAgICAgU2V0U2VyaWFsaXplcjxUPiB0ID0gaW5zdGFuY2VzLmdldChlbGVtZW50cyk7CkBAIC01MCwzNyArNTIsNDEgQEAKIAogICAgIHB1YmxpYyBTZXRTZXJpYWxpemVyKFR5cGVTZXJpYWxpemVyPFQ+IGVsZW1lbnRzLCBWYWx1ZUNvbXBhcmF0b3JzIGNvbXBhcmF0b3JzKQogICAgIHsKKyAgICAgICAgc3VwZXIoZmFsc2UpOwogICAgICAgICB0aGlzLmVsZW1lbnRzID0gZWxlbWVudHM7CiAgICAgICAgIHRoaXMuY29tcGFyYXRvcnMgPSBjb21wYXJhdG9yczsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgTGlzdDxCeXRlQnVmZmVyPiBzZXJpYWxpemVWYWx1ZXMoU2V0PFQ+IHZhbHVlcykKICAgICB7CiAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gYnVmZmVycyA9IG5ldyBBcnJheUxpc3Q8Pih2YWx1ZXMuc2l6ZSgpKTsKICAgICAgICAgZm9yIChUIHZhbHVlIDogdmFsdWVzKQogICAgICAgICAgICAgYnVmZmVycy5hZGQoZWxlbWVudHMuc2VyaWFsaXplKHZhbHVlKSk7Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoYnVmZmVycywgY29tcGFyYXRvcnMuYnVmZmVyKTsKKyAgICAgICAgYnVmZmVycy5zb3J0KGNvbXBhcmF0b3JzLmJ1ZmZlcik7CiAgICAgICAgIHJldHVybiBidWZmZXJzOwogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0RWxlbWVudENvdW50KFNldDxUPiB2YWx1ZSkKICAgICB7CiAgICAgICAgIHJldHVybiB2YWx1ZS5zaXplKCk7CiAgICAgfQogCi0gICAgcHVibGljIDxWPiB2b2lkIHZhbGlkYXRlRm9yTmF0aXZlUHJvdG9jb2woViBpbnB1dCwgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWPiB2b2lkIHZhbGlkYXRlKFYgaW5wdXQsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IpCiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewogICAgICAgICAgICAgLy8gRW1wdHkgdmFsdWVzIGFyZSBzdGlsbCB2YWxpZC4KICAgICAgICAgICAgIGlmIChhY2Nlc3Nvci5pc0VtcHR5KGlucHV0KSkgcmV0dXJuOwogICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgYWNjZXNzb3IsIHZlcnNpb24pOwotICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKG4sIHZlcnNpb24pOworICAgICAgICAgICAgaW50IG4gPSByZWFkQ29sbGVjdGlvblNpemUoaW5wdXQsIGFjY2Vzc29yKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZSgpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgViB2YWx1ZSA9IHJlYWROb25OdWxsVmFsdWUoaW5wdXQsIGFjY2Vzc29yLCBvZmZzZXQsIHZlcnNpb24pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSBzaXplT2ZWYWx1ZSh2YWx1ZSwgYWNjZXNzb3IsIHZlcnNpb24pOworICAgICAgICAgICAgICAgIFYgdmFsdWUgPSByZWFkTm9uTnVsbFZhbHVlKGlucHV0LCBhY2Nlc3Nvciwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUodmFsdWUsIGFjY2Vzc29yKTsKICAgICAgICAgICAgICAgICBlbGVtZW50cy52YWxpZGF0ZSh2YWx1ZSwgYWNjZXNzb3IpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFhY2Nlc3Nvci5pc0VtcHR5RnJvbU9mZnNldChpbnB1dCwgb2Zmc2V0KSkKQEAgLTkyLDEyICs5OCwxMyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIDxWPiBTZXQ8VD4gZGVzZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChWIGlucHV0LCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFY+IFNldDxUPiBkZXNlcmlhbGl6ZShWIGlucHV0LCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yKQogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBuID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBhY2Nlc3NvciwgdmVyc2lvbik7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gc2l6ZU9mQ29sbGVjdGlvblNpemUobiwgdmVyc2lvbik7CisgICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgYWNjZXNzb3IpOworICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKCk7CiAKICAgICAgICAgICAgIGlmIChuIDwgMCkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiVGhlIGRhdGEgY2Fubm90IGJlIGRlc2VyaWFsaXplZCBhcyBhIHNldCIpOwpAQCAtMTA2LDEyICsxMTMsMTIgQEAKICAgICAgICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlIHdlIGRvIG5vdCB3YW50IHRvIGluaXRpYWxpemUgdGhlIHNldCB3aXRoIHRoYXQgaW5pdGlhbENhcGFjaXR5IGFzIGl0IGNhbiByZXN1bHQKICAgICAgICAgICAgIC8vIGluIGFuIE9PTSB3aGVuIGFkZCBpcyBjYWxsZWQgKHNlZSBDQVNTQU5EUkEtMTI2MTgpLiBPbiB0aGUgb3RoZXIgaGFuZCB3ZSBkbyBub3Qgd2FudCB0byBoYXZlIHRvIHJlc2l6ZQogICAgICAgICAgICAgLy8gdGhlIHNldCBpZiB3ZSBjYW4gYXZvaWQgaXQsIHNvIHdlIHB1dCBhIHJlYXNvbmFibGUgbGltaXQgb24gdGhlIGluaXRpYWxDYXBhY2l0eS4KLSAgICAgICAgICAgIFNldDxUPiBsID0gbmV3IExpbmtlZEhhc2hTZXQ8VD4oTWF0aC5taW4obiwgMjU2KSk7CisgICAgICAgICAgICBTZXQ8VD4gbCA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oTWF0aC5taW4obiwgMjU2KSk7CiAKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFYgdmFsdWUgPSByZWFkTm9uTnVsbFZhbHVlKGlucHV0LCBhY2Nlc3Nvciwgb2Zmc2V0LCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUodmFsdWUsIGFjY2Vzc29yLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBWIHZhbHVlID0gcmVhZE5vbk51bGxWYWx1ZShpbnB1dCwgYWNjZXNzb3IsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKHZhbHVlLCBhY2Nlc3Nvcik7CiAgICAgICAgICAgICAgICAgZWxlbWVudHMudmFsaWRhdGUodmFsdWUsIGFjY2Vzc29yKTsKICAgICAgICAgICAgICAgICBsLmFkZChlbGVtZW50cy5kZXNlcmlhbGl6ZSh2YWx1ZSwgYWNjZXNzb3IpKTsKICAgICAgICAgICAgIH0KQEAgLTEyNSw2ICsxMzIsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhTZXQ8VD4gdmFsdWUpCiAgICAgewogICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKQEAgLTE0Niw2ICsxNTQsOCBAQAogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCiAgICAgcHVibGljIENsYXNzPFNldDxUPj4gZ2V0VHlwZSgpCiAgICAgewogICAgICAgICByZXR1cm4gKENsYXNzKSBTZXQuY2xhc3M7CkBAIC0xNTYsMTMgKzE2NiwxMyBAQAogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBuID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBQcm90b2NvbFZlcnNpb24uVjMpOwotICAgICAgICAgICAgaW50IG9mZnNldCA9IHNpemVPZkNvbGxlY3Rpb25TaXplKG4sIFByb3RvY29sVmVyc2lvbi5WMyk7CisgICAgICAgICAgICBpbnQgbiA9IHJlYWRDb2xsZWN0aW9uU2l6ZShpbnB1dCwgQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKTsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSBzaXplT2ZDb2xsZWN0aW9uU2l6ZSgpOwogCiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gcmVhZFZhbHVlKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZU9mVmFsdWUodmFsdWUsIEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gcmVhZFZhbHVlKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemVPZlZhbHVlKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpOwogICAgICAgICAgICAgICAgIGludCBjb21wYXJpc29uID0gY29tcGFyYXRvci5jb21wYXJlRm9yQ1FMKHZhbHVlLCBrZXkpOwogICAgICAgICAgICAgICAgIGlmIChjb21wYXJpc29uID09IDApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKQEAgLTE3OCw3NCArMTg4LDQgQEAKICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgYSBzZXQiKTsKICAgICAgICAgfQogICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCeXRlQnVmZmVyIGdldFNsaWNlRnJvbVNlcmlhbGl6ZWQoQnl0ZUJ1ZmZlciBjb2xsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBmcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBjb21wYXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmcm96ZW4pCi0gICAgewotICAgICAgICBpZiAoZnJvbSA9PSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUiAmJiB0byA9PSBCeXRlQnVmZmVyVXRpbC5VTlNFVF9CWVRFX0JVRkZFUikKLSAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBCeXRlQnVmZmVyIGlucHV0ID0gY29sbGVjdGlvbi5kdXBsaWNhdGUoKTsKLSAgICAgICAgICAgIGludCBuID0gcmVhZENvbGxlY3Rpb25TaXplKGlucHV0LCBQcm90b2NvbFZlcnNpb24uVjMpOwotICAgICAgICAgICAgaW5wdXQucG9zaXRpb24oaW5wdXQucG9zaXRpb24oKSArIHNpemVPZkNvbGxlY3Rpb25TaXplKG4sIFByb3RvY29sVmVyc2lvbi5WMykpOwotICAgICAgICAgICAgaW50IHN0YXJ0UG9zID0gaW5wdXQucG9zaXRpb24oKTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBib29sZWFuIGluU2xpY2UgPSBmcm9tID09IEJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgcG9zID0gaW5wdXQucG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gcmVhZFZhbHVlKGlucHV0LCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIDAsIFByb3RvY29sVmVyc2lvbi5WMyk7Ci0gICAgICAgICAgICAgICAgaW5wdXQucG9zaXRpb24oaW5wdXQucG9zaXRpb24oKSArIHNpemVPZlZhbHVlKHZhbHVlLCBCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIFByb3RvY29sVmVyc2lvbi5WMykpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBwYXNzZWQgdGhlIHN0YXJ0IGFscmVhZHksIGNoZWNrIGlmIHdlIGhhdmUgbm93Ci0gICAgICAgICAgICAgICAgaWYgKCFpblNsaWNlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBhcmlzb24gPSBjb21wYXJhdG9yLmNvbXBhcmVGb3JDUUwoZnJvbSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyaXNvbiA8PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3cgd2l0aGluIHRoZSBzbGljZQotICAgICAgICAgICAgICAgICAgICAgICAgaW5TbGljZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvcyA9IHBvczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGJlZm9yZSB0aGUgc2xpY2Ugc28gd2Uga25vdyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTm93IGNoZWNrIGlmIHdlJ3JlIGRvbmUKLSAgICAgICAgICAgICAgICBpbnQgY29tcGFyaXNvbiA9IHRvID09IEJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSID8gLTEgOiBjb21wYXJhdG9yLmNvbXBhcmVGb3JDUUwodmFsdWUsIHRvKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcGFyaXNvbiA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBkb25lIGFuZCBzaG91bGRuJ3QgaW5jbHVkZSB0aGUgdmFsdWUgd2UganVzdCByZWFkCi0gICAgICAgICAgICAgICAgICAgIGlucHV0LnBvc2l0aW9uKHBvcyk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UnbGwgaW5jbHVkZSB0aGF0IHZhbHVlCi0gICAgICAgICAgICAgICAgKytjb3VudDsKLQotICAgICAgICAgICAgICAgIC8vIEJ1dCBpZiB3ZSBrbm93IGlmIHdhcyB0aGUgbGFzdCBvZiB0aGUgc2xpY2UsIHdlIGJyZWFrIGVhcmx5Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBhcmlzb24gPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwICYmICFmcm96ZW4pCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgICAgIHJldHVybiBjb3B5QXNOZXdDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIGNvdW50LCBzdGFydFBvcywgaW5wdXQucG9zaXRpb24oKSwgUHJvdG9jb2xWZXJzaW9uLlYzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQnVmZmVyVW5kZXJmbG93RXhjZXB0aW9uIHwgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiTm90IGVub3VnaCBieXRlcyB0byByZWFkIGEgc2V0Iik7Ci0gICAgICAgIH0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0Fic3RyYWN0V3JpdGVSZXNwb25zZUhhbmRsZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQWJzdHJhY3RXcml0ZVJlc3BvbnNlSGFuZGxlci5qYXZhCmluZGV4IGNlMjgyNjYuLmQyYzU0ZjkgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQWJzdHJhY3RXcml0ZVJlc3BvbnNlSGFuZGxlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQWJzdHJhY3RXcml0ZVJlc3BvbnNlSGFuZGxlci5qYXZhCkBAIC0yMiw3ICsyMiw5IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXJGaWVsZFVwZGF0ZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCkBAIC0xMTQsMzQgKzExNiw0MiBAQAogICAgIHsKICAgICAgICAgbG9uZyB0aW1lb3V0TmFub3MgPSBjdXJyZW50VGltZW91dE5hbm9zKCk7CiAKLSAgICAgICAgYm9vbGVhbiBzdWNjZXNzOworICAgICAgICBib29sZWFuIHNpZ25hbGVkOwogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgc3VjY2VzcyA9IGNvbmRpdGlvbi5hd2FpdCh0aW1lb3V0TmFub3MsIE5BTk9TRUNPTkRTKTsKKyAgICAgICAgICAgIHNpZ25hbGVkID0gY29uZGl0aW9uLmF3YWl0KHRpbWVvdXROYW5vcywgTkFOT1NFQ09ORFMpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5jaGVja2VkSW50ZXJydXB0ZWRFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIXN1Y2Nlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBibG9ja2VkRm9yID0gYmxvY2tGb3IoKTsKLSAgICAgICAgICAgIGludCBhY2tzID0gYWNrQ291bnQoKTsKLSAgICAgICAgICAgIC8vIEl0J3MgcHJldHR5IHVubGlrZWx5LCBidXQgd2UgY2FuIHJhY2UgYmV0d2VlbiBleGl0aW5nIGF3YWl0IGFib3ZlIGFuZCBoZXJlLCBzbwotICAgICAgICAgICAgLy8gdGhhdCB3ZSBjb3VsZCBub3cgaGF2ZSBlbm91Z2ggYWNrcy4gSW4gdGhhdCBjYXNlLCB3ZSAibGllIiBvbiB0aGUgYWNrcyBjb3VudCB0bwotICAgICAgICAgICAgLy8gYXZvaWQgc2VuZGluZyBjb25mdXNpbmcgaW5mbyB0byB0aGUgdXNlciAoc2VlIENBU1NBTkRSQS02NDkxKS4KLSAgICAgICAgICAgIGlmIChhY2tzID49IGJsb2NrZWRGb3IpCi0gICAgICAgICAgICAgICAgYWNrcyA9IGJsb2NrZWRGb3IgLSAxOwotICAgICAgICAgICAgdGhyb3cgbmV3IFdyaXRlVGltZW91dEV4Y2VwdGlvbih3cml0ZVR5cGUsIHJlcGxpY2FQbGFuLmNvbnNpc3RlbmN5TGV2ZWwoKSwgYWNrcywgYmxvY2tlZEZvcik7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKCFzaWduYWxlZCkKKyAgICAgICAgICAgIHRocm93VGltZW91dCgpOwogCiAgICAgICAgIGlmIChibG9ja0ZvcigpICsgZmFpbHVyZXMgPiBjYW5kaWRhdGVSZXBsaWNhQ291bnQoKSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdyaXRlRmFpbHVyZUV4Y2VwdGlvbihyZXBsaWNhUGxhbi5jb25zaXN0ZW5jeUxldmVsKCksIGFja0NvdW50KCksIGJsb2NrRm9yKCksIHdyaXRlVHlwZSwgZmFpbHVyZVJlYXNvbkJ5RW5kcG9pbnQpOworICAgICAgICAgICAgaWYgKFJlcXVlc3RDYWxsYmFjay5pc1RpbWVvdXQodGhpcy5mYWlsdXJlUmVhc29uQnlFbmRwb2ludC5rZXlTZXQoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodGhpczo6d2FpdGluZ0ZvcikgLy8gRGF0YWNlbnRlcldyaXRlUmVzcG9uc2VIYW5kbGVyIGZpbHRlcnMgZXJyb3JzIGZyb20gcmVtb3RlIERDcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoRnVuY3Rpb24uaWRlbnRpdHkoKSwgdGhpcy5mYWlsdXJlUmVhc29uQnlFbmRwb2ludDo6Z2V0KSkpKQorICAgICAgICAgICAgICAgIHRocm93VGltZW91dCgpOworCisgICAgICAgICAgICB0aHJvdyBuZXcgV3JpdGVGYWlsdXJlRXhjZXB0aW9uKHJlcGxpY2FQbGFuLmNvbnNpc3RlbmN5TGV2ZWwoKSwgYWNrQ291bnQoKSwgYmxvY2tGb3IoKSwgd3JpdGVUeXBlLCB0aGlzLmZhaWx1cmVSZWFzb25CeUVuZHBvaW50KTsKICAgICAgICAgfQogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCB0aHJvd1RpbWVvdXQoKQorICAgIHsKKyAgICAgICAgaW50IGJsb2NrZWRGb3IgPSBibG9ja0ZvcigpOworICAgICAgICBpbnQgYWNrcyA9IGFja0NvdW50KCk7CisgICAgICAgIC8vIEl0J3MgcHJldHR5IHVubGlrZWx5LCBidXQgd2UgY2FuIHJhY2UgYmV0d2VlbiBleGl0aW5nIGF3YWl0IGFib3ZlIGFuZCBoZXJlLCBzbworICAgICAgICAvLyB0aGF0IHdlIGNvdWxkIG5vdyBoYXZlIGVub3VnaCBhY2tzLiBJbiB0aGF0IGNhc2UsIHdlICJsaWUiIG9uIHRoZSBhY2tzIGNvdW50IHRvCisgICAgICAgIC8vIGF2b2lkIHNlbmRpbmcgY29uZnVzaW5nIGluZm8gdG8gdGhlIHVzZXIgKHNlZSBDQVNTQU5EUkEtNjQ5MSkuCisgICAgICAgIGlmIChhY2tzID49IGJsb2NrZWRGb3IpCisgICAgICAgICAgICBhY2tzID0gYmxvY2tlZEZvciAtIDE7CisgICAgICAgIHRocm93IG5ldyBXcml0ZVRpbWVvdXRFeGNlcHRpb24od3JpdGVUeXBlLCByZXBsaWNhUGxhbi5jb25zaXN0ZW5jeUxldmVsKCksIGFja3MsIGJsb2NrZWRGb3IpOworICAgIH0KKwogICAgIHB1YmxpYyBmaW5hbCBsb25nIGN1cnJlbnRUaW1lb3V0TmFub3MoKQogICAgIHsKICAgICAgICAgbG9uZyByZXF1ZXN0VGltZW91dCA9IHdyaXRlVHlwZSA9PSBDT1VOVEVSCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0FjdGl2ZVJlcGFpclNlcnZpY2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQWN0aXZlUmVwYWlyU2VydmljZS5qYXZhCmluZGV4IGEwNzE2YjEuLjVkNjk1MDcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQWN0aXZlUmVwYWlyU2VydmljZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQWN0aXZlUmVwYWlyU2VydmljZS5qYXZhCkBAIC00NSw2ICs0NSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRHVyYXRpb25TcGVjOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuQWJzdHJhY3RSZXBsaWNhdGlvblN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuRW5kcG9pbnRzQnlSYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkVuZHBvaW50c0ZvclJhbmdlOwpAQCAtMTE4LDYgKzExOSwxMSBAQAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0OwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFSRU5UX1JFUEFJUl9TVEFUVVNfQ0FDSEVfU0laRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5QQVJFTlRfUkVQQUlSX1NUQVRVU19FWFBJUllfU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5QQVhPU19SRVBBSVJfQUxMT1dfTVVMVElQTEVfUEVORElOR19VTlNBRkU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU0tJUF9QQVhPU19SRVBBSVJfT05fVE9QT0xPR1lfQ0hBTkdFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNLSVBfUEFYT1NfUkVQQUlSX09OX1RPUE9MT0dZX0NIQU5HRV9LRVlTUEFDRVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcuUmVwYWlyQ29tbWFuZFBvb2xGdWxsU3RyYXRlZ3kucmVqZWN0OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yLio7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdlLm91dDsKQEAgLTIyMCwxMyArMjI2LDExIEBACiAgICAgICAgIHRoaXMuZmFpbHVyZURldGVjdG9yID0gZmFpbHVyZURldGVjdG9yOwogICAgICAgICB0aGlzLmdvc3NpcGVyID0gZ29zc2lwZXI7CiAgICAgICAgIHRoaXMucmVwYWlyU3RhdHVzQnlDbWQgPSBDYWNoZUJ1aWxkZXIubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhwaXJlQWZ0ZXJXcml0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcuZ2V0TG9uZygiY2Fzc2FuZHJhLnBhcmVudF9yZXBhaXJfc3RhdHVzX2V4cGlyeV9zZWNvbmRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTLmNvbnZlcnQoMSwgVGltZVVuaXQuREFZUykpLCBUaW1lVW5pdC5TRUNPTkRTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4cGlyZUFmdGVyV3JpdGUoUEFSRU5UX1JFUEFJUl9TVEFUVVNfRVhQSVJZX1NFQ09ORFMuZ2V0TG9uZygpLCBUaW1lVW5pdC5TRUNPTkRTKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNpbmcgd2VpZ2h0IHdvdWxkbid0IHdvcmsgc28gd2VsbCwgc2luY2UgaXQgZG9lc24ndCByZWZsZWN0IG11dGF0aW9uIG9mIGNhY2hlZCBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9ndWF2YS93aWtpL0NhY2hlc0V4cGxhaW5lZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXNzdW1lIGVhY2ggZW50cnkgaXMgdW5saWtlbHkgdG8gYmUgbXVjaCBtb3JlIHRoYW4gMTAwIGJ5dGVzLCBzbyBib3VuZGluZyB0aGUgc2l6ZSBzaG91bGQgYmUgc3VmZmljaWVudC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhpbXVtU2l6ZShMb25nLmdldExvbmcoImNhc3NhbmRyYS5wYXJlbnRfcmVwYWlyX3N0YXR1c19jYWNoZV9zaXplIiwgMTAwXzAwMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4aW11bVNpemUoUEFSRU5UX1JFUEFJUl9TVEFUVVNfQ0FDSEVfU0laRS5nZXRMb25nKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKIAogICAgICAgICBEdXJhdGlvblNwZWMuTG9uZ05hbm9zZWNvbmRzQm91bmQgZHVyYXRpb24gPSBnZXRSZXBhaXJTdGF0ZUV4cGlyZXMoKTsKQEAgLTI5NCwxOCArMjk4LDQ0IEBACiAgICAgICAgIHJldHVybiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUIoKTsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFJlcGFpclNlc3Npb25TcGFjZUluTWViaWJ5dGVzKGludCBzaXplSW5NZWJpYnl0ZXMpCiAgICAgewogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUIoc2l6ZUluTWViaWJ5dGVzKTsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NZWJpYnl0ZXMoKQogICAgIHsKICAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQigpOwogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFJlcGFpclNlc3Npb25TcGFjZUluTWlCKGludCBzaXplSW5NZWJpYnl0ZXMpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFJlcGFpclNlc3Npb25TcGFjZUluTWlCKHNpemVJbk1lYmlieXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEluIENBU1NBTkRSQS0xNzY2OCwgSk1YIHNldHRlcnMgdGhhdCBkaWQgbm90IHRocm93IHN0YW5kYXJkIGV4Y2VwdGlvbnMgd2VyZSBkZXByZWNhdGVkIGluIGZhdm9yIG9mIG9uZXMgdGhhdCBkby4KKyAgICAgKiBGb3IgY29uc2lzdGVuY3kgcHVycG9zZXMsIHRoZSByZXNwZWN0aXZlIGdldHRlciAiZ2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NZWJpYnl0ZXMiIHdhcyBhbHNvIGRlcHJlY2F0ZWQgYW5kCisgICAgICogcmVwbGFjZWQgYnkgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQigpCisgICAgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJlcGFpclNlc3Npb25TcGFjZUluTWlCKCk7CisgICAgfQorCiAgICAgcHVibGljIExpc3Q8Q29tcG9zaXRlRGF0YT4gZ2V0UmVwYWlyU3RhdHMoTGlzdDxTdHJpbmc+IHNjaGVtYUFyZ3MsIFN0cmluZyByYW5nZVN0cmluZykKICAgICB7CiAgICAgICAgIExpc3Q8Q29tcG9zaXRlRGF0YT4gc3RhdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKQEAgLTEwMjgsMjEgKzEwNTgsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSW5zdWZmaWNpZW50IGxpdmUgbm9kZXMgdG8gcmVwYWlyIHBheG9zIGZvciAlcyBpbiAlcyBmb3IgJXMuXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgbXVzdCBiZSBlbm91Z2ggbGl2ZSBub2RlcyB0byBzYXRpc2Z5IEVBQ0hfUVVPUlVNLCBidXQgdGhlIGZvbGxvd2luZyBub2RlcyBhcmUgZG93bjogJXNcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGNoZWNrIGNhbiBiZSBza2lwcGVkIGJ5IHNldHRpbmcgZWl0aGVyIHRoZSB5YW1sIHByb3BlcnR5IHNraXBfcGF4b3NfcmVwYWlyX29uX3RvcG9sb2d5X2NoYW5nZSBvciAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHN5c3RlbSBwcm9wZXJ0eSBjYXNzYW5kcmEuc2tpcF9wYXhvc19yZXBhaXJfb25fdG9wb2xvZ3lfY2hhbmdlIHRvIGZhbHNlLiBUaGUgam14IHByb3BlcnR5ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgc3lzdGVtIHByb3BlcnR5ICVzIHRvIGZhbHNlLiBUaGUgam14IHByb3BlcnR5ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdG9yYWdlU2VydmljZS5Ta2lwUGF4b3NSZXBhaXJPblRvcG9sb2d5Q2hhbmdlIGNhbiBhbHNvIGJlIHNldCB0byBmYWxzZSB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIHdpdGhvdXQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlc3RhcnRpbmcgdGhlIG5vZGVcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmRpdmlkdWFsIGtleXNwYWNlcyBjYW4gYmUgc2tpcHBlZCB3aXRoIHRoZSB5YW1sIHByb3BlcnR5IHNraXBfcGF4b3NfcmVwYWlyX29uX3RvcG9sb2d5X2NoYW5nZV9rZXlzcGFjZXMsIHRoZSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0gcHJvcGVydHkgY2Fzc2FuZHJhLnNraXBfcGF4b3NfcmVwYWlyX29uX3RvcG9sb2d5X2NoYW5nZV9rZXlzcGFjZXMsIG9yIHRlbXBvcmFyaWx5IHdpdGggdGhlIGpteCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0gcHJvcGVydHkgJXMsIG9yIHRlbXBvcmFyaWx5IHdpdGggdGhlIGpteCIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eSBTdG9yYWdlU2VydmljZS5Ta2lwUGF4b3NSZXBhaXJPblRvcG9sb2d5Q2hhbmdlS2V5c3BhY2VzXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgdGhpcyBjaGVjayBjYW4gbGVhZCB0byBwYXhvcyBjb3JyZWN0bmVzcyBpc3N1ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLCBrc05hbWUsIHJlYXNvbiwgZG93bkVuZHBvaW50cykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLCBrc05hbWUsIHJlYXNvbiwgZG93bkVuZHBvaW50cywgU0tJUF9QQVhPU19SRVBBSVJfT05fVE9QT0xPR1lfQ0hBTkdFLmdldEtleSgpLCBTS0lQX1BBWE9TX1JFUEFJUl9PTl9UT1BPTE9HWV9DSEFOR0VfS0VZU1BBQ0VTLmdldEtleSgpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEVuZHBvaW50c0ZvclRva2VuIHBlbmRpbmcgPSBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5nZXRUb2tlbk1ldGFkYXRhKCkucGVuZGluZ0VuZHBvaW50c0ZvclRva2VuKHJhbmdlLnJpZ2h0LCBrc05hbWUpOwotICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nLnNpemUoKSA+IDEgJiYgIUJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLnBheG9zX3JlcGFpcl9hbGxvd19tdWx0aXBsZV9wZW5kaW5nX3Vuc2FmZSIpKQorICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nLnNpemUoKSA+IDEgJiYgIVBBWE9TX1JFUEFJUl9BTExPV19NVUxUSVBMRV9QRU5ESU5HX1VOU0FGRS5nZXRCb29sZWFuKCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJDYW5ub3QgYmVnaW4gcGF4b3MgYXV0byByZXBhaXIgZm9yICVzIGluICVzLiVzLCBtdWx0aXBsZSBwZW5kaW5nIGVuZHBvaW50cyBleGlzdCBmb3IgcmFuZ2UgKCVzKS4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNldCAtRGNhc3NhbmRyYS5wYXhvc19yZXBhaXJfYWxsb3dfbXVsdGlwbGVfcGVuZGluZ191bnNhZmU9dHJ1ZSB0byBza2lwIHRoaXMgY2hlY2siLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlLCB0YWJsZS5rZXlzcGFjZSwgdGFibGUubmFtZSwgcGVuZGluZykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgLUQlcz10cnVlIHRvIHNraXAgdGhpcyBjaGVjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UsIHRhYmxlLmtleXNwYWNlLCB0YWJsZS5uYW1lLCBwZW5kaW5nLCBQQVhPU19SRVBBSVJfQUxMT1dfTVVMVElQTEVfUEVORElOR19VTlNBRkUuZ2V0S2V5KCkpKTsKIAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBGdXR1cmU8Vm9pZD4gZnV0dXJlID0gUGF4b3NDbGVhbnVwLmNsZWFudXAoZW5kcG9pbnRzLCB0YWJsZSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHJhbmdlKSwgZmFsc2UsIHJlcGFpckNvbW1hbmRFeGVjdXRvcigpKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQWN0aXZlUmVwYWlyU2VydmljZU1CZWFuLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0FjdGl2ZVJlcGFpclNlcnZpY2VNQmVhbi5qYXZhCmluZGV4IDAwOWFkNTYuLjlhNjA2NjMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQWN0aXZlUmVwYWlyU2VydmljZU1CZWFuLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9BY3RpdmVSZXBhaXJTZXJ2aWNlTUJlYW4uamF2YQpAQCAtMzQsOSArMzQsMjAgQEAKICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBpbnQgZ2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NZWdhYnl0ZXMoKTsKIAorICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSBzZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQiBpbnN0ZWFkIGFzIGl0IHdpbGwgbm90IHRocm93IG5vbi1zdGFuZGFyZCBleGNlcHRpb25zCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgdm9pZCBzZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1lYmlieXRlcyhpbnQgc2l6ZUluTWViaWJ5dGVzKTsKKyAgICAvKioKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUIgaW5zdGVhZAorICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGludCBnZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1lYmlieXRlcygpOwogCisgICAgcHVibGljIHZvaWQgc2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUIoaW50IHNpemVJbk1lYmlieXRlcyk7CisgICAgcHVibGljIGludCBnZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQigpOworCiAgICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlT2ZmaGVhcE1lcmtsZVRyZWVzKCk7CiAgICAgcHVibGljIHZvaWQgc2V0VXNlT2ZmaGVhcE1lcmtsZVRyZWVzKGJvb2xlYW4gdmFsdWUpOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0NhY2hlU2VydmljZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9DYWNoZVNlcnZpY2UuamF2YQppbmRleCA5YzIzZTcxLi4wZGMzMTEwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0NhY2hlU2VydmljZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2FjaGVTZXJ2aWNlLmphdmEKQEAgLTE5LDMxICsxOSw1MSBAQAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuSW1tdXRhYmxlVHJpcGxlOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkF1dG9TYXZpbmdDYWNoZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5BdXRvU2F2aW5nQ2FjaGUuQ2FjaGVTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkNhY2hlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQ2FmZmVpbmVDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5Db3VudGVyQ2FjaGVLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuSUNhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLklSb3dDYWNoZUVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLktleUNhY2hlS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLlJvd0NhY2hlS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU3RhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsb2NrQW5kQ291bnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlYWRFeGVjdXRpb25Db250cm9sbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNpbmdsZVBhcnRpdGlvblJlYWRDb21tYW5kOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbnRleHQuQ291bnRlckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlNTVGFibGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkRhdGFMaW1pdHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5DYWNoZWRCVHJlZVBhcnRpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkNhY2hlZFBhcnRpdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUlkRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNlcXVlbmNlQmFzZWRTU1RhYmxlSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGVTdXBwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVBcnJheVV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CkBAIC04MCw3ICsxMDAsNyBAQAogCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBDYWNoZVNlcnZpY2UgaW5zdGFuY2UgPSBuZXcgQ2FjaGVTZXJ2aWNlKCk7CiAKLSAgICBwdWJsaWMgZmluYWwgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5PiBrZXlDYWNoZTsKKyAgICBwdWJsaWMgZmluYWwgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBBYnN0cmFjdFJvd0luZGV4RW50cnk+IGtleUNhY2hlOwogICAgIHB1YmxpYyBmaW5hbCBBdXRvU2F2aW5nQ2FjaGU8Um93Q2FjaGVLZXksIElSb3dDYWNoZUVudHJ5PiByb3dDYWNoZTsKICAgICBwdWJsaWMgZmluYWwgQXV0b1NhdmluZ0NhY2hlPENvdW50ZXJDYWNoZUtleSwgQ2xvY2tBbmRDb3VudD4gY291bnRlckNhY2hlOwogCkBAIC05Niw3ICsxMTYsNyBAQAogICAgIC8qKgogICAgICAqIEByZXR1cm4gYXV0byBzYXZpbmcgY2FjaGUgb2JqZWN0CiAgICAgICovCi0gICAgcHJpdmF0ZSBBdXRvU2F2aW5nQ2FjaGU8S2V5Q2FjaGVLZXksIFJvd0luZGV4RW50cnk+IGluaXRLZXlDYWNoZSgpCisgICAgcHJpdmF0ZSBBdXRvU2F2aW5nQ2FjaGU8S2V5Q2FjaGVLZXksIEFic3RyYWN0Um93SW5kZXhFbnRyeT4gaW5pdEtleUNhY2hlKCkKICAgICB7CiAgICAgICAgIGxvZ2dlci5pbmZvKCJJbml0aWFsaXppbmcga2V5IGNhY2hlIHdpdGggY2FwYWNpdHkgb2Yge30gTWlCcy4iLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0S2V5Q2FjaGVTaXplSW5NaUIoKSk7CiAKQEAgLTEwNCw5ICsxMjQsOSBAQAogCiAgICAgICAgIC8vIGFzIHZhbHVlcyBhcmUgY29uc3RhbnQgc2l6ZSB3ZSBjYW4gdXNlIHNpbmdsZXRvbiB3ZWlnaGVyCiAgICAgICAgIC8vIHdoZXJlIDQ4ID0gNDAgYnl0ZXMgKGF2ZXJhZ2Ugc2l6ZSBvZiB0aGUga2V5KSArIDggYnl0ZXMgKHNpemUgb2YgdmFsdWUpCi0gICAgICAgIElDYWNoZTxLZXlDYWNoZUtleSwgUm93SW5kZXhFbnRyeT4ga2M7CisgICAgICAgIElDYWNoZTxLZXlDYWNoZUtleSwgQWJzdHJhY3RSb3dJbmRleEVudHJ5PiBrYzsKICAgICAgICAga2MgPSBDYWZmZWluZUNhY2hlLmNyZWF0ZShrZXlDYWNoZUluTWVtb3J5Q2FwYWNpdHkpOwotICAgICAgICBBdXRvU2F2aW5nQ2FjaGU8S2V5Q2FjaGVLZXksIFJvd0luZGV4RW50cnk+IGtleUNhY2hlID0gbmV3IEF1dG9TYXZpbmdDYWNoZTw+KGtjLCBDYWNoZVR5cGUuS0VZX0NBQ0hFLCBuZXcgS2V5Q2FjaGVTZXJpYWxpemVyKCkpOworICAgICAgICBBdXRvU2F2aW5nQ2FjaGU8S2V5Q2FjaGVLZXksIEFic3RyYWN0Um93SW5kZXhFbnRyeT4ga2V5Q2FjaGUgPSBuZXcgQXV0b1NhdmluZ0NhY2hlPD4oa2MsIENhY2hlVHlwZS5LRVlfQ0FDSEUsIG5ldyBLZXlDYWNoZVNlcmlhbGl6ZXIoKSk7CiAKICAgICAgICAgaW50IGtleUNhY2hlS2V5c1RvU2F2ZSA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRLZXlDYWNoZUtleXNUb1NhdmUoKTsKIApAQCAtMzQwLDE2NiArMzYwLDIwMSBAQAogICAgICAgICBsb2dnZXIuZGVidWcoImNhY2hlIHNhdmVzIGNvbXBsZXRlZCIpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ291bnRlckNhY2hlU2VyaWFsaXplciBpbXBsZW1lbnRzIENhY2hlU2VyaWFsaXplcjxDb3VudGVyQ2FjaGVLZXksIENsb2NrQW5kQ291bnQ+CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb3VudGVyQ2FjaGVTZXJpYWxpemVyIGV4dGVuZHMgQ2FjaGVTZXJpYWxpemVyPENvdW50ZXJDYWNoZUtleSwgQ2xvY2tBbmRDb3VudD4KICAgICB7CiAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShDb3VudGVyQ2FjaGVLZXkga2V5LCBEYXRhT3V0cHV0UGx1cyBvdXQsIENvbHVtbkZhbWlseVN0b3JlIGNmcykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydChjZnMubWV0YWRhdGEoKS5pc0NvdW50ZXIoKSk7Ci0gICAgICAgICAgICBUYWJsZU1ldGFkYXRhIHRhYmxlTWV0YWRhdGEgPSBjZnMubWV0YWRhdGEoKTsKLSAgICAgICAgICAgIHRhYmxlTWV0YWRhdGEuaWQuc2VyaWFsaXplKG91dCk7Ci0gICAgICAgICAgICBvdXQud3JpdGVVVEYodGFibGVNZXRhZGF0YS5pbmRleE5hbWUoKS5vckVsc2UoIiIpKTsKKyAgICAgICAgICAgIHdyaXRlQ0ZTKG91dCwgY2ZzKTsKICAgICAgICAgICAgIGtleS53cml0ZShvdXQpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEZ1dHVyZTxQYWlyPENvdW50ZXJDYWNoZUtleSwgQ2xvY2tBbmRDb3VudD4+IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGZpbmFsIENvbHVtbkZhbWlseVN0b3JlIGNmcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHB1YmxpYyBGdXR1cmU8UGFpcjxDb3VudGVyQ2FjaGVLZXksIENsb2NrQW5kQ291bnQ+PiBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgLy9LZXlzcGFjZSBhbmQgQ0YgbmFtZSBhcmUgZGVzZXJpYWxpemVkIGJ5IEF1dG9TYXZpbmcgY2FjaGUgYW5kIHVzZWQgdG8gZmV0Y2ggdGhlIENGUyBwcm92aWRlZCBhcyBhCiAgICAgICAgICAgICAvL3BhcmFtZXRlciBzbyB0aGV5IGFyZW4ndCBkZXNlcmlhbGl6ZWQgaGVyZSwgZXZlbiB0aG91Z2ggdGhleSBhcmUgc2VyaWFsaXplZCBieSB0aGlzIHNlcmlhbGl6ZXIKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IHJlYWRDRlMoaW4pOwogICAgICAgICAgICAgaWYgKGNmcyA9PSBudWxsKQogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgZmluYWwgQ291bnRlckNhY2hlS2V5IGNhY2hlS2V5ID0gQ291bnRlckNhY2hlS2V5LnJlYWQoY2ZzLm1ldGFkYXRhKCksIGluKTsKICAgICAgICAgICAgIGlmICghY2ZzLm1ldGFkYXRhKCkuaXNDb3VudGVyKCkgfHwgIWNmcy5pc0NvdW50ZXJDYWNoZUVuYWJsZWQoKSkKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKIAotICAgICAgICAgICAgcmV0dXJuIFN0YWdlLlJFQUQuc3VibWl0KG5ldyBDYWxsYWJsZTxQYWlyPENvdW50ZXJDYWNoZUtleSwgQ2xvY2tBbmRDb3VudD4+KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgUGFpcjxDb3VudGVyQ2FjaGVLZXksIENsb2NrQW5kQ291bnQ+IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gY2FjaGVLZXkucmVhZENvdW50ZXJWYWx1ZShjZnMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgIDogUGFpci5jcmVhdGUoY2FjaGVLZXksIENvdW50ZXJDb250ZXh0Lmluc3RhbmNlKCkuZ2V0TG9jYWxDbG9ja0FuZENvdW50KHZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFN0YWdlLlJFQUQuc3VibWl0KCgpIC0+IHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gY2FjaGVLZXkucmVhZENvdW50ZXJWYWx1ZShjZnMpOworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICA/IG51bGwKKyAgICAgICAgICAgICAgICAgICAgIDogUGFpci5jcmVhdGUoY2FjaGVLZXksIENvdW50ZXJDb250ZXh0Lmluc3RhbmNlKCkuZ2V0TG9jYWxDbG9ja0FuZENvdW50KHZhbHVlKSk7CiAgICAgICAgICAgICB9KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm93Q2FjaGVTZXJpYWxpemVyIGltcGxlbWVudHMgQ2FjaGVTZXJpYWxpemVyPFJvd0NhY2hlS2V5LCBJUm93Q2FjaGVFbnRyeT4KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvd0NhY2hlU2VyaWFsaXplciBleHRlbmRzIENhY2hlU2VyaWFsaXplcjxSb3dDYWNoZUtleSwgSVJvd0NhY2hlRW50cnk+CiAgICAgewogICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoUm93Q2FjaGVLZXkga2V5LCBEYXRhT3V0cHV0UGx1cyBvdXQsIENvbHVtbkZhbWlseVN0b3JlIGNmcykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydCghY2ZzLmlzSW5kZXgoKSk7Ly9TaG91bGRuJ3QgaGF2ZSByb3cgY2FjaGUgZW50cmllcyBmb3IgaW5kZXhlcwotICAgICAgICAgICAgVGFibGVNZXRhZGF0YSB0YWJsZU1ldGFkYXRhID0gY2ZzLm1ldGFkYXRhKCk7Ci0gICAgICAgICAgICB0YWJsZU1ldGFkYXRhLmlkLnNlcmlhbGl6ZShvdXQpOwotICAgICAgICAgICAgb3V0LndyaXRlVVRGKHRhYmxlTWV0YWRhdGEuaW5kZXhOYW1lKCkub3JFbHNlKCIiKSk7CisgICAgICAgICAgICB3cml0ZUNGUyhvdXQsIGNmcyk7CiAgICAgICAgICAgICBCeXRlQXJyYXlVdGlsLndyaXRlV2l0aExlbmd0aChrZXkua2V5LCBvdXQpOwogICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIEZ1dHVyZTxQYWlyPFJvd0NhY2hlS2V5LCBJUm93Q2FjaGVFbnRyeT4+IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGZpbmFsIENvbHVtbkZhbWlseVN0b3JlIGNmcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHB1YmxpYyBGdXR1cmU8UGFpcjxSb3dDYWNoZUtleSwgSVJvd0NhY2hlRW50cnk+PiBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewogICAgICAgICAgICAgLy9LZXlzcGFjZSBhbmQgQ0YgbmFtZSBhcmUgZGVzZXJpYWxpemVkIGJ5IEF1dG9TYXZpbmcgY2FjaGUgYW5kIHVzZWQgdG8gZmV0Y2ggdGhlIENGUyBwcm92aWRlZCBhcyBhCiAgICAgICAgICAgICAvL3BhcmFtZXRlciBzbyB0aGV5IGFyZW4ndCBkZXNlcmlhbGl6ZWQgaGVyZSwgZXZlbiB0aG91Z2ggdGhleSBhcmUgc2VyaWFsaXplZCBieSB0aGlzIHNlcmlhbGl6ZXIKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IHJlYWRDRlMoaW4pOwogICAgICAgICAgICAgZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aExlbmd0aChpbik7CiAgICAgICAgICAgICBpZiAoY2ZzID09IG51bGwgIHx8ICFjZnMuaXNSb3dDYWNoZUVuYWJsZWQoKSkKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIGZpbmFsIGludCByb3dzVG9DYWNoZSA9IGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5jYWNoaW5nLnJvd3NQZXJQYXJ0aXRpb25Ub0NhY2hlKCk7CiAgICAgICAgICAgICBhc3NlcnQoIWNmcy5pc0luZGV4KCkpOy8vU2hvdWxkbid0IGhhdmUgcm93IGNhY2hlIGVudHJpZXMgZm9yIGluZGV4ZXMKIAotICAgICAgICAgICAgcmV0dXJuIFN0YWdlLlJFQUQuc3VibWl0KG5ldyBDYWxsYWJsZTxQYWlyPFJvd0NhY2hlS2V5LCBJUm93Q2FjaGVFbnRyeT4+KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgUGFpcjxSb3dDYWNoZUtleSwgSVJvd0NhY2hlRW50cnk+IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgICAgICByZXR1cm4gU3RhZ2UuUkVBRC5zdWJtaXQoKCkgLT4geworICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBjZnMuZGVjb3JhdGVLZXkoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpbnQgbm93SW5TZWMgPSBGQlV0aWxpdGllcy5ub3dJblNlY29uZHMoKTsKKyAgICAgICAgICAgICAgICBTaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZCBjbWQgPSBTaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZC5mdWxsUGFydGl0aW9uUmVhZChjZnMubWV0YWRhdGEoKSwgbm93SW5TZWMsIGtleSk7CisgICAgICAgICAgICAgICAgdHJ5IChSZWFkRXhlY3V0aW9uQ29udHJvbGxlciBjb250cm9sbGVyID0gY21kLmV4ZWN1dGlvbkNvbnRyb2xsZXIoKTsgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXIgPSBjbWQucXVlcnlNZW10YWJsZUFuZERpc2soY2ZzLCBjb250cm9sbGVyKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBjZnMuZGVjb3JhdGVLZXkoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5vd0luU2VjID0gRkJVdGlsaXRpZXMubm93SW5TZWNvbmRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIFNpbmdsZVBhcnRpdGlvblJlYWRDb21tYW5kIGNtZCA9IFNpbmdsZVBhcnRpdGlvblJlYWRDb21tYW5kLmZ1bGxQYXJ0aXRpb25SZWFkKGNmcy5tZXRhZGF0YSgpLCBub3dJblNlYywga2V5KTsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IChSZWFkRXhlY3V0aW9uQ29udHJvbGxlciBjb250cm9sbGVyID0gY21kLmV4ZWN1dGlvbkNvbnRyb2xsZXIoKTsgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXIgPSBjbWQucXVlcnlNZW10YWJsZUFuZERpc2soY2ZzLCBjb250cm9sbGVyKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVkUGFydGl0aW9uIHRvQ2FjaGUgPSBDYWNoZWRCVHJlZVBhcnRpdGlvbi5jcmVhdGUoRGF0YUxpbWl0cy5jcWxMaW1pdHMocm93c1RvQ2FjaGUpLmZpbHRlcihpdGVyLCBub3dJblNlYywgdHJ1ZSksIG5vd0luU2VjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZShuZXcgUm93Q2FjaGVLZXkoY2ZzLm1ldGFkYXRhKCksIGtleSksIHRvQ2FjaGUpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENhY2hlZFBhcnRpdGlvbiB0b0NhY2hlID0gQ2FjaGVkQlRyZWVQYXJ0aXRpb24uY3JlYXRlKERhdGFMaW1pdHMuY3FsTGltaXRzKHJvd3NUb0NhY2hlKS5maWx0ZXIoaXRlciwgbm93SW5TZWMsIHRydWUpLCBub3dJblNlYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZShuZXcgUm93Q2FjaGVLZXkoY2ZzLm1ldGFkYXRhKCksIGtleSksIHRvQ2FjaGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBLZXlDYWNoZVNlcmlhbGl6ZXIgaW1wbGVtZW50cyBDYWNoZVNlcmlhbGl6ZXI8S2V5Q2FjaGVLZXksIFJvd0luZGV4RW50cnk+CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBLZXlDYWNoZVNlcmlhbGl6ZXIgZXh0ZW5kcyBDYWNoZVNlcmlhbGl6ZXI8S2V5Q2FjaGVLZXksIEFic3RyYWN0Um93SW5kZXhFbnRyeT4KICAgICB7Ci0gICAgICAgIC8vIEZvciBjb2x1bW4gZmFtaWxpZXMgd2l0aCBtYW55IFNTVGFibGVzIHRoZSBsaW5lYXIgbmF0dXJlIG9mIGdldFNTVGFibGVzIHNsb3dlZCBkb3duIEtleUNhY2hlIGxvYWRpbmcKLSAgICAgICAgLy8gYnkgb3JkZXJzIG9mIG1hZ25pdHVkZS4gU28gd2UgY2FjaGUgdGhlIHNzdGFibGVzIG9uY2UgYW5kIHJlbHkgb24gY2xlYW51cEFmdGVyRGVzZXJpYWxpemUgdG8gY2xlYW51cCBhbnkKLSAgICAgICAgLy8gY2FjaGVkIHN0YXRlIHdlIG1heSBoYXZlIGFjY3VtdWxhdGVkIGR1cmluZyB0aGUgbG9hZC4KLSAgICAgICAgTWFwPFBhaXI8U3RyaW5nLCBTdHJpbmc+LCBNYXA8U1NUYWJsZUlkLCBTU1RhYmxlUmVhZGVyPj4gY2FjaGVkU1NUYWJsZVJlYWRlcnMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQYWlyPEtleUNhY2hlU3VwcG9ydDw/PiwgU1NUYWJsZUZvcm1hdDw/LCA/Pj4+IHJlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRIYXNoTWFwPERlc2NyaXB0b3IsIFBhaXI8SW50ZWdlciwgQ29sdW1uRmFtaWx5U3RvcmU+PiByZWFkZXJPcmRpbmFscyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplTWV0YWRhdGEoRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIuc2VyaWFsaXplTWV0YWRhdGEob3V0KTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHJlYWRlck9yZGluYWxzLnNpemUoKSk7CisgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2M7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxEZXNjcmlwdG9yLCBQYWlyPEludGVnZXIsIENvbHVtbkZhbWlseVN0b3JlPj4gdGFibGUgOiByZWFkZXJPcmRpbmFscy5lbnRyeVNldCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlc2MgPSB0YWJsZS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSB0YWJsZS5nZXRWYWx1ZSgpLnJpZ2h0OworICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlQ0ZTKG91dCwgY2ZzKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYoZGVzYy52ZXJzaW9uLmZvcm1hdC5uYW1lKCkpOworICAgICAgICAgICAgICAgIG91dC53cml0ZVVURihkZXNjLnZlcnNpb24udG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGgoZGVzYy5pZC5hc0J5dGVzKCksIG91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGVzZXJpYWxpemVNZXRhZGF0YShEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIuZGVzZXJpYWxpemVNZXRhZGF0YShpbik7CisgICAgICAgICAgICBNYXA8Q29sdW1uRmFtaWx5U3RvcmUsIE1hcDxJbW11dGFibGVUcmlwbGU8U1NUYWJsZUlkLCBTdHJpbmcsIFNTVGFibGVGb3JtYXQ8PywgPz4+LCBTU1RhYmxlUmVhZGVyPj4gdG1wUmVhZGVycyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIGludCBzc3RhYmxlc051bSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworICAgICAgICAgICAgcmVhZGVycy5jbGVhcigpOworICAgICAgICAgICAgcmVhZGVycy5lbnN1cmVDYXBhY2l0eShzc3RhYmxlc051bSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNzdGFibGVzTnVtOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gcmVhZENGUyhpbik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdE5hbWUgPSBpbi5yZWFkVVRGKCk7CisgICAgICAgICAgICAgICAgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQgPSBPYmplY3RzLnJlcXVpcmVOb25OdWxsKERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpLmdldChmb3JtYXROYW1lKSwgIlVua25vd24gU1NUYWJsZSBmb3JtYXQ6ICIgKyBmb3JtYXROYW1lKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IGluLnJlYWRVVEYoKTsKKyAgICAgICAgICAgICAgICBTU1RhYmxlSWQgaWQgPSBTU1RhYmxlSWRGYWN0b3J5Lmluc3RhbmNlLmZyb21CeXRlcyhCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGluKSk7CisKKyAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHJlYWRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKGNmcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWFwPEltbXV0YWJsZVRyaXBsZTxTU1RhYmxlSWQsIFN0cmluZywgU1NUYWJsZUZvcm1hdDw/LCA/Pj4sIFNTVGFibGVSZWFkZXI+IHJlYWRlcnNNYXAgPSB0bXBSZWFkZXJzLmdldChjZnMpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVhZGVyc01hcCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gbGl2ZVJlYWRlcnMgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJzTWFwID0gbmV3IEhhc2hNYXA8PihsaXZlUmVhZGVycy5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHIgOiBsaXZlUmVhZGVycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJzTWFwLnB1dChJbW11dGFibGVUcmlwbGUub2Yoci5kZXNjcmlwdG9yLmlkLCByLmRlc2NyaXB0b3IudmVyc2lvbi50b1N0cmluZygpLCByLmRlc2NyaXB0b3IudmVyc2lvbi5mb3JtYXQpLCByKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcFJlYWRlcnMucHV0KGNmcywgcmVhZGVyc01hcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyID0gcmVhZGVyc01hcC5nZXQoSW1tdXRhYmxlVHJpcGxlLm9mKGlkLCB2ZXJzaW9uLCBmb3JtYXQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlYWRlciBpbnN0YW5jZW9mIEtleUNhY2hlU3VwcG9ydDw/PikKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVycy5hZGQoUGFpci5jcmVhdGUoKEtleUNhY2hlU3VwcG9ydDw/PikgcmVhZGVyLCBmb3JtYXQpKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlYWRlcnMuYWRkKFBhaXIuY3JlYXRlKG51bGwsIGZvcm1hdCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKEtleUNhY2hlS2V5IGtleSwgRGF0YU91dHB1dFBsdXMgb3V0LCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBSb3dJbmRleEVudHJ5IGVudHJ5ID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmdldEludGVybmFsKGtleSk7CisgICAgICAgICAgICBBYnN0cmFjdFJvd0luZGV4RW50cnkgZW50cnkgPSBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUuZ2V0SW50ZXJuYWwoa2V5KTsKICAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsKQogICAgICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICAgICAgVGFibGVNZXRhZGF0YSB0YWJsZU1ldGFkYXRhID0gY2ZzLm1ldGFkYXRhKCk7Ci0gICAgICAgICAgICB0YWJsZU1ldGFkYXRhLmlkLnNlcmlhbGl6ZShvdXQpOwotICAgICAgICAgICAgb3V0LndyaXRlVVRGKHRhYmxlTWV0YWRhdGEuaW5kZXhOYW1lKCkub3JFbHNlKCIiKSk7Ci0gICAgICAgICAgICBCeXRlQXJyYXlVdGlsLndyaXRlV2l0aExlbmd0aChrZXkua2V5LCBvdXQpOwotICAgICAgICAgICAgaWYgKGtleS5kZXNjLmlkIGluc3RhbmNlb2YgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQoKChTZXF1ZW5jZUJhc2VkU1NUYWJsZUlkKSBrZXkuZGVzYy5pZCkuZ2VuZXJhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlSW50KEludGVnZXIuTUlOX1ZBTFVFKTsgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yICJpbnQgYmFzZWQgZ2VuZXJhdGlvbiBvbmx5IgotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFNob3J0TGVuZ3RoKGtleS5kZXNjLmlkLmFzQnl0ZXMoKSwgb3V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC53cml0ZUJvb2xlYW4odHJ1ZSk7Ci0KLSAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyID0gbmV3IFNlcmlhbGl6YXRpb25IZWFkZXIoZmFsc2UsIGNmcy5tZXRhZGF0YSgpLCBjZnMubWV0YWRhdGEoKS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKLSAgICAgICAgICAgIGtleS5kZXNjLmdldEZvcm1hdCgpLmdldEluZGV4U2VyaWFsaXplcihjZnMubWV0YWRhdGEoKSwga2V5LmRlc2MudmVyc2lvbiwgaGVhZGVyKS5zZXJpYWxpemVGb3JDYWNoZShlbnRyeSwgb3V0KTsKKyAgICAgICAgICAgIHdyaXRlU1NUYWJsZShjZnMsIGtleS5kZXNjLCBvdXQpOworICAgICAgICAgICAgb3V0LndyaXRlSW50KGtleS5rZXkubGVuZ3RoKTsKKyAgICAgICAgICAgIG91dC53cml0ZShrZXkua2V5KTsKKyAgICAgICAgICAgIGVudHJ5LnNlcmlhbGl6ZUZvckNhY2hlKG91dCk7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgRnV0dXJlPFBhaXI8S2V5Q2FjaGVLZXksIFJvd0luZGV4RW50cnk+PiBkZXNlcmlhbGl6ZShEYXRhSW5wdXRQbHVzIGlucHV0LCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICBwdWJsaWMgRnV0dXJlPFBhaXI8S2V5Q2FjaGVLZXksIEFic3RyYWN0Um93SW5kZXhFbnRyeT4+IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIHNraXBFbnRyeSA9IGNmcyA9PSBudWxsIHx8ICFjZnMuaXNLZXlDYWNoZUVuYWJsZWQoKTsKKyAgICAgICAgICAgIFBhaXI8S2V5Q2FjaGVTdXBwb3J0PD8+LCBTU1RhYmxlRm9ybWF0PD8sID8+PiByZWFkZXIgPSByZWFkU1NUYWJsZShpbnB1dCk7CisgICAgICAgICAgICBib29sZWFuIHNraXBFbnRyeSA9IHJlYWRlci5sZWZ0ID09IG51bGwgfHwgIXJlYWRlci5sZWZ0LmdldEtleUNhY2hlKCkuaXNFbmFibGVkKCk7CiAKLSAgICAgICAgICAgIC8vS2V5c3BhY2UgYW5kIENGIG5hbWUgYXJlIGRlc2VyaWFsaXplZCBieSBBdXRvU2F2aW5nIGNhY2hlIGFuZCB1c2VkIHRvIGZldGNoIHRoZSBDRlMgcHJvdmlkZWQgYXMgYQotICAgICAgICAgICAgLy9wYXJhbWV0ZXIgc28gdGhleSBhcmVuJ3QgZGVzZXJpYWxpemVkIGhlcmUsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHNlcmlhbGl6ZWQgYnkgdGhpcyBzZXJpYWxpemVyCiAgICAgICAgICAgICBpbnQga2V5TGVuZ3RoID0gaW5wdXQucmVhZEludCgpOwogICAgICAgICAgICAgaWYgKGtleUxlbmd0aCA+IEZCVXRpbGl0aWVzLk1BWF9VTlNJR05FRF9TSE9SVCkKLSAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiQ29ycnVwdGVkIGtleSBjYWNoZS4gS2V5IGxlbmd0aCBvZiAlZCBpcyBsb25nZXIgdGhhbiBtYXhpbXVtIG9mICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlMZW5ndGgsIEZCVXRpbGl0aWVzLk1BWF9VTlNJR05FRF9TSE9SVCkpOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgQnl0ZUJ1ZmZlciBrZXkgPSBCeXRlQnVmZmVyVXRpbC5yZWFkKGlucHV0LCBrZXlMZW5ndGgpOwotICAgICAgICAgICAgaW50IGdlbmVyYXRpb24gPSBpbnB1dC5yZWFkSW50KCk7Ci0gICAgICAgICAgICBTU1RhYmxlSWQgZ2VuZXJhdGlvbklkID0gZ2VuZXJhdGlvbiA9PSBJbnRlZ2VyLk1JTl9WQUxVRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTU1RhYmxlSWRGYWN0b3J5Lmluc3RhbmNlLmZyb21CeXRlcyhCeXRlQnVmZmVyVXRpbC5yZWFkV2l0aFNob3J0TGVuZ3RoKGlucHV0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoZ2VuZXJhdGlvbik7IC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciAiaW50IGJhc2VkIGdlbmVyYXRpb24gc3N0YWJsZXMiCi0gICAgICAgICAgICBpbnB1dC5yZWFkQm9vbGVhbigpOyAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgInByb21vdGVkIGluZGV4ZXMiIGJvb2xlYW4KLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIGlmICghc2tpcEVudHJ5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmc+IHF1YWxpZmllZE5hbWUgPSBQYWlyLmNyZWF0ZShjZnMubWV0YWRhdGEua2V5c3BhY2UsIGNmcy5tZXRhZGF0YS5uYW1lKTsKLSAgICAgICAgICAgICAgICBNYXA8U1NUYWJsZUlkLCBTU1RhYmxlUmVhZGVyPiBnZW5lcmF0aW9uVG9TU1RhYmxlUmVhZGVyID0gY2FjaGVkU1NUYWJsZVJlYWRlcnMuZ2V0KHF1YWxpZmllZE5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uVG9TU1RhYmxlUmVhZGVyID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uVG9TU1RhYmxlUmVhZGVyID0gbmV3IEhhc2hNYXA8PihjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzVGFibGVSZWFkZXIgOiBjZnMuZ2V0U1NUYWJsZXMoU1NUYWJsZVNldC5DQU5PTklDQUwpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uVG9TU1RhYmxlUmVhZGVyLnB1dChzc1RhYmxlUmVhZGVyLmRlc2NyaXB0b3IuaWQsIHNzVGFibGVSZWFkZXIpOwotICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVkU1NUYWJsZVJlYWRlcnMucHV0SWZBYnNlbnQocXVhbGlmaWVkTmFtZSwgZ2VuZXJhdGlvblRvU1NUYWJsZVJlYWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlYWRlciA9IGdlbmVyYXRpb25Ub1NTVGFibGVSZWFkZXIuZ2V0KGdlbmVyYXRpb25JZCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChza2lwRW50cnkgfHwgcmVhZGVyID09IG51bGwpCisgICAgICAgICAgICBpZiAoc2tpcEVudHJ5KQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIFRoZSBzc3RhYmxlIGRvZXNuJ3QgZXhpc3QgYW55bW9yZSwgc28gd2UgY2FuJ3QgYmUgc3VyZSBvZiB0aGUgZXhhY3QgdmVyc2lvbiBhbmQgYXNzdW1lIGl0cyB0aGUgY3VycmVudCB2ZXJzaW9uLiBUaGUgb25seSBjYXNlIHdoZXJlIHdlJ2xsIGJlCiAgICAgICAgICAgICAgICAgLy8gd3JvbmcgaXMgZHVyaW5nIHVwZ3JhZGUsIGluIHdoaWNoIGNhc2Ugd2UgZmFpbCBhdCBkZXNlcmlhbGl6YXRpb24uIFRoaXMgaXMgbm90IGEgaHVnZSBkZWFsIGhvd2V2ZXIgc2luY2UgMSkgdGhpcyBpcyB1bmxpa2VseSBlbm91Z2ggdGhhdAogICAgICAgICAgICAgICAgIC8vIHRoaXMgd29uJ3QgYWZmZWN0IG1hbnkgdXNlcnMgKGlmIGFueSkgYW5kIG9ubHkgb25jZSwgMikgdGhpcyBkb2Vzbid0IHByZXZlbnQgdGhlIG5vZGUgZnJvbSBzdGFydGluZyBhbmQgMykgQ0FTU0FORFJBLTEwMjE5IHNob3dzIHRoYXQgdGhpcwogICAgICAgICAgICAgICAgIC8vIHBhcnQgb2YgdGhlIGNvZGUgaGFzIGJlZW4gYnJva2VuIGZvciBhIHdoaWxlIHdpdGhvdXQgYW55b25lIG5vdGljaW5nIChpdCBpcywgYnR3LCBzdGlsbCBicm9rZW4gdW50aWwgQ0FTU0FORFJBLTEwMjE5IGlzIGZpeGVkKS4KLSAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIuc2tpcEZvckNhY2hlKGlucHV0KTsKKyAgICAgICAgICAgICAgICBTU1RhYmxlRm9ybWF0LktleUNhY2hlVmFsdWVTZXJpYWxpemVyPD8sID8+IHNlcmlhbGl6ZXIgPSByZWFkZXIucmlnaHQuZ2V0S2V5Q2FjaGVWYWx1ZVNlcmlhbGl6ZXIoKTsKKworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2tpcChpbnB1dCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBsb25nIHBvcyA9ICgoUmFuZG9tQWNjZXNzUmVhZGVyKSBpbnB1dCkuZ2V0UG9zaXRpb24oKTsKKyAgICAgICAgICAgIEFic3RyYWN0Um93SW5kZXhFbnRyeSBjYWNoZVZhbHVlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FjaGVWYWx1ZSA9IHJlYWRlci5sZWZ0LmRlc2VyaWFsaXplS2V5Q2FjaGVWYWx1ZShpbnB1dCk7CisgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHwgRXJyb3IgZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJEZXNlcmlhbGl6aW5nIGtleSBjYWNoZSBlbnRyeSBhdCB7fSBmb3Ige30iLCBwb3MsIHJlYWRlci5sZWZ0KTsKKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtleUNhY2hlS2V5IGNhY2hlS2V5ID0gcmVhZGVyLmxlZnQuZ2V0Q2FjaGVLZXkoa2V5KTsKKyAgICAgICAgICAgIHJldHVybiBJbW1lZGlhdGVGdXR1cmUuc3VjY2VzcyhQYWlyLmNyZWF0ZShjYWNoZUtleSwgY2FjaGVWYWx1ZSkpOworICAgICAgICB9CiAKLSAgICAgICAgICAgIFJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyPD8+IGluZGV4U2VyaWFsaXplciA9IHJlYWRlci5kZXNjcmlwdG9yLmdldEZvcm1hdCgpLmdldEluZGV4U2VyaWFsaXplcihyZWFkZXIubWV0YWRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuZGVzY3JpcHRvci52ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5oZWFkZXIpOwotICAgICAgICAgICAgUm93SW5kZXhFbnRyeTw/PiBlbnRyeSA9IGluZGV4U2VyaWFsaXplci5kZXNlcmlhbGl6ZUZvckNhY2hlKGlucHV0KTsKLSAgICAgICAgICAgIHJldHVybiBJbW1lZGlhdGVGdXR1cmUuc3VjY2VzcyhQYWlyLmNyZWF0ZShuZXcgS2V5Q2FjaGVLZXkoY2ZzLm1ldGFkYXRhKCksIHJlYWRlci5kZXNjcmlwdG9yLCBrZXkpLCBlbnRyeSkpOworICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVTU1RhYmxlKENvbHVtbkZhbWlseVN0b3JlIGNmcywgRGVzY3JpcHRvciBkZXNjLCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBnZXRPckNyZWF0ZUNGU09yZGluYWwoY2ZzKTsKKyAgICAgICAgICAgIFBhaXI8SW50ZWdlciwgQ29sdW1uRmFtaWx5U3RvcmU+IGV4aXN0aW5nID0gcmVhZGVyT3JkaW5hbHMucHV0SWZBYnNlbnQoZGVzYywgUGFpci5jcmVhdGUocmVhZGVyT3JkaW5hbHMuc2l6ZSgpLCBjZnMpKTsKKyAgICAgICAgICAgIGludCBvcmRpbmFsID0gZXhpc3RpbmcgPT0gbnVsbCA/IHJlYWRlck9yZGluYWxzLnNpemUoKSAtIDEgOiBleGlzdGluZy5sZWZ0OworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIob3JkaW5hbCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFBhaXI8S2V5Q2FjaGVTdXBwb3J0PD8+LCBTU1RhYmxlRm9ybWF0PD8sID8+PiByZWFkU1NUYWJsZShEYXRhSW5wdXRQbHVzIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaW50IG9yZGluYWwgPSBpbnB1dC5yZWFkVW5zaWduZWRWSW50MzIoKTsKKyAgICAgICAgICAgIGlmIChvcmRpbmFsID49IHJlYWRlcnMuc2l6ZSgpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ29ycnVwdGVkIGtleSBjYWNoZS4gRmFpbGVkIHRvIGRlc2VyaWFsaXplIGtleSBvZiBrZXkgY2FjaGUgLSBpbnZhbGlkIHNzdGFibGUgb3JkaW5hbCAiICsgb3JkaW5hbCk7CisgICAgICAgICAgICByZXR1cm4gcmVhZGVycy5nZXQob3JkaW5hbCk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgdm9pZCBjbGVhbnVwQWZ0ZXJEZXNlcmlhbGl6ZSgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGNhY2hlZFNTVGFibGVSZWFkZXJzLmNsZWFyKCk7CisgICAgICAgICAgICBzdXBlci5jbGVhbnVwQWZ0ZXJEZXNlcmlhbGl6ZSgpOworICAgICAgICAgICAgcmVhZGVycy5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYW51cEFmdGVyU2VyaWFsaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIuY2xlYW51cEFmdGVyU2VyaWFsaXplKCk7CisgICAgICAgICAgICByZWFkZXJPcmRpbmFscy5jbGVhcigpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9DYXNzYW5kcmFEYWVtb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2Fzc2FuZHJhRGFlbW9uLmphdmEKaW5kZXggZjFiY2E2Ni4uODRmYzViMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9DYXNzYW5kcmFEYWVtb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0Nhc3NhbmRyYURhZW1vbi5qYXZhCkBAIC04NywxNSArODcsMjIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5OYXRpdmVMaWJyYXJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuRnV0dXJlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuRnV0dXJlQ29tYmluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubG9nZ2luZy5Mb2dnaW5nU3VwcG9ydEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubG9nZ2luZy5WaXJ0dWFsVGFibGVBcHBlbmRlcjsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5OQU5PU0VDT05EUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfRk9SRUdST1VORDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfSk1YX0xPQ0FMX1BPUlQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0pNWF9SRU1PVEVfUE9SVDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfUElEX0ZJTEU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9QT1JUOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpBVkFfQ0xBU1NfUEFUSDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5KQVZBX1JNSV9TRVJWRVJfUkFORE9NX0lEOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpBVkFfVkVSU0lPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5KQVZBX1ZNX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTUVUUklDU19SRVBPUlRFUl9DT05GSUdfRklMRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TSVpFX1JFQ09SREVSX0lOVEVSVkFMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNUQVJUX05BVElWRV9UUkFOU1BPUlQ7CiAKIC8qKgogICogVGhlIDxjb2RlPkNhc3NhbmRyYURhZW1vbjwvY29kZT4gaXMgYW4gYWJzdHJhY3Rpb24gZm9yIGEgQ2Fzc2FuZHJhIGRhZW1vbgpAQCAtMTQ5LDcgKzE1Niw3IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmEucm1pLnNlcnZlci5yYW5kb21JRHMiLCAidHJ1ZSIpOworICAgICAgICBKQVZBX1JNSV9TRVJWRVJfUkFORE9NX0lELnNldEJvb2xlYW4odHJ1ZSk7CiAKICAgICAgICAgLy8gSWYgYSByZW1vdGUgcG9ydCBoYXMgYmVlbiBzcGVjaWZpZWQgdGhlbiB1c2UgdGhhdCB0byBzZXQgdXAgYSBKTVgKICAgICAgICAgLy8gY29ubmVjdG9yIHNlcnZlciB3aGljaCBjYW4gYmUgYWNjZXNzZWQgcmVtb3RlbHkuIE90aGVyd2lzZSwgbG9vawpAQCAtMTY1LDcgKzE3Miw3IEBACiAgICAgICAgIGlmIChqbXhQb3J0ID09IG51bGwpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxvY2FsT25seSA9IHRydWU7Ci0gICAgICAgICAgICBqbXhQb3J0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEuam14LmxvY2FsLnBvcnQiKTsKKyAgICAgICAgICAgIGpteFBvcnQgPSBDQVNTQU5EUkFfSk1YX0xPQ0FMX1BPUlQuZ2V0U3RyaW5nKCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoam14UG9ydCA9PSBudWxsKQpAQCAtMjQ3LDcgKzI1NCw3IEBACiAKICAgICAgICAgVGhyZWFkQXdhcmVTZWN1cml0eU1hbmFnZXIuaW5zdGFsbCgpOwogCi0gICAgICAgIGxvZ1N5c3RlbUluZm8oKTsKKyAgICAgICAgbG9nU3lzdGVtSW5mbyhsb2dnZXIpOwogCiAgICAgICAgIE5hdGl2ZUxpYnJhcnkudHJ5TWxvY2thbGwoKTsKIApAQCAtMjkwLDI0ICsyOTcsMTMgQEAKIAogICAgICAgICBTU1RhYmxlSGVhZGVyRml4LmZpeE5vbkZyb3plblVEVElmVXBncmFkZUZyb20zMCgpOwogCi0gICAgICAgIC8vIGNsZWFuIHVwIGRlYnJpcyBpbiB0aGUgcmVzdCBvZiB0aGUga2V5c3BhY2VzCi0gICAgICAgIGZvciAoU3RyaW5nIGtleXNwYWNlTmFtZSA6IFNjaGVtYS5pbnN0YW5jZS5nZXRLZXlzcGFjZXMoKSkKKyAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFNraXAgc3lzdGVtIGFzIHdlJ3ZlIGFscmVhZHkgY2xlYW5lZCBpdAotICAgICAgICAgICAgaWYgKGtleXNwYWNlTmFtZS5lcXVhbHMoU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgZm9yIChUYWJsZU1ldGFkYXRhIGNmbSA6IFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZXNBbmRWaWV3cyhrZXlzcGFjZU5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUuc2NydWJEYXRhRGlyZWN0b3JpZXMoY2ZtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKFN0YXJ0dXBFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGV4aXRPckZhaWwoZS5yZXR1cm5Db2RlLCBlLmdldE1lc3NhZ2UoKSwgZS5nZXRDYXVzZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBzY3J1YkRhdGFEaXJlY3RvcmllcygpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChTdGFydHVwRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4aXRPckZhaWwoZS5yZXR1cm5Db2RlLCBlLmdldE1lc3NhZ2UoKSwgZS5nZXRDYXVzZSgpKTsKICAgICAgICAgfQogCiAgICAgICAgIEtleXNwYWNlLnNldEluaXRpYWxpemVkKCk7CkBAIC0zNzcsNyArMzczLDcgQEAKIAogICAgICAgICAvLyBzY2hlZHVsZSBwZXJpb2RpYyBkdW1wcyBvZiB0YWJsZSBzaXplIGVzdGltYXRlcyBpbnRvIFN5c3RlbUtleXNwYWNlLlNJWkVfRVNUSU1BVEVTX0NGCiAgICAgICAgIC8vIHNldCBjYXNzYW5kcmEuc2l6ZV9yZWNvcmRlcl9pbnRlcnZhbCB0byAwIHRvIGRpc2FibGUKLSAgICAgICAgaW50IHNpemVSZWNvcmRlckludGVydmFsID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEuc2l6ZV9yZWNvcmRlcl9pbnRlcnZhbCIsIDUgKiA2MCk7CisgICAgICAgIGludCBzaXplUmVjb3JkZXJJbnRlcnZhbCA9IFNJWkVfUkVDT1JERVJfSU5URVJWQUwuZ2V0SW50KCk7CiAgICAgICAgIGlmIChzaXplUmVjb3JkZXJJbnRlcnZhbCA+IDApCiAgICAgICAgICAgICBTY2hlZHVsZWRFeGVjdXRvcnMub3B0aW9uYWxUYXNrcy5zY2hlZHVsZVdpdGhGaXhlZERlbGF5KFNpemVFc3RpbWF0ZXNSZWNvcmRlci5pbnN0YW5jZSwgMzAsIHNpemVSZWNvcmRlckludGVydmFsLCBUaW1lVW5pdC5TRUNPTkRTKTsKIApAQCAtMzg4LDcgKzM4NCw3IEBACiAgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmluc3RhbmNlLnByZWxvYWRQcmVwYXJlZFN0YXRlbWVudHMoKTsKIAogICAgICAgICAvLyBNZXRyaWNzCi0gICAgICAgIFN0cmluZyBtZXRyaWNzUmVwb3J0ZXJDb25maWdGaWxlID0gU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEubWV0cmljc1JlcG9ydGVyQ29uZmlnRmlsZSIpOworICAgICAgICBTdHJpbmcgbWV0cmljc1JlcG9ydGVyQ29uZmlnRmlsZSA9IE1FVFJJQ1NfUkVQT1JURVJfQ09ORklHX0ZJTEUuZ2V0U3RyaW5nKCk7CiAgICAgICAgIGlmIChtZXRyaWNzUmVwb3J0ZXJDb25maWdGaWxlICE9IG51bGwpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJUcnlpbmcgdG8gbG9hZCBtZXRyaWNzLXJlcG9ydGVyLWNvbmZpZyBmcm9tIGZpbGU6IHt9IiwgbWV0cmljc1JlcG9ydGVyQ29uZmlnRmlsZSk7CkBAIC01NzgsNiArNTc0LDI4IEBACiAgICAgewogICAgICAgICBWaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeS5pbnN0YW5jZS5yZWdpc3RlcihWaXJ0dWFsU2NoZW1hS2V5c3BhY2UuaW5zdGFuY2UpOwogICAgICAgICBWaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeS5pbnN0YW5jZS5yZWdpc3RlcihTeXN0ZW1WaWV3c0tleXNwYWNlLmluc3RhbmNlKTsKKworICAgICAgICAvLyBmbHVzaCBsb2cgbWVzc2FnZXMgdG8gc3lzdGVtX3ZpZXdzLnN5c3RlbV9sb2dzIHZpcnR1YWwgdGFibGUgYXMgdGhlcmUgd2VyZSBtZXNzYWdlcyBhbHJlYWR5IGxvZ2dlZAorICAgICAgICAvLyBiZWZvcmUgdGhhdCB2aXJ0dWFsIHRhYmxlIHdhcyBpbnN0YW50aWF0ZWQKKyAgICAgICAgTG9nZ2luZ1N1cHBvcnRGYWN0b3J5LmdldExvZ2dpbmdTdXBwb3J0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFwcGVuZGVyKFZpcnR1YWxUYWJsZUFwcGVuZGVyLmNsYXNzLCBWaXJ0dWFsVGFibGVBcHBlbmRlci5BUFBFTkRFUl9OQU1FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaWZQcmVzZW50KGFwcGVuZGVyIC0+ICgoVmlydHVhbFRhYmxlQXBwZW5kZXIpIGFwcGVuZGVyKS5mbHVzaEJ1ZmZlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzY3J1YkRhdGFEaXJlY3RvcmllcygpIHRocm93cyBTdGFydHVwRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBjbGVhbiB1cCBkZWJyaXMgaW4gdGhlIHJlc3Qgb2YgdGhlIGtleXNwYWNlcworICAgICAgICBmb3IgKFN0cmluZyBrZXlzcGFjZU5hbWUgOiBTY2hlbWEuaW5zdGFuY2UuZ2V0S2V5c3BhY2VzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFNraXAgc3lzdGVtIGFzIHdlJ3ZlIGFscmVhZHkgY2xlYW5lZCBpdAorICAgICAgICAgICAgaWYgKGtleXNwYWNlTmFtZS5lcXVhbHMoU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgZm9yIChUYWJsZU1ldGFkYXRhIGNmbSA6IFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZXNBbmRWaWV3cyhrZXlzcGFjZU5hbWUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlLnNjcnViRGF0YURpcmVjdG9yaWVzKGNmbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgaW5pdGlhbGl6ZUNsaWVudFRyYW5zcG9ydHMoKQpAQCAtNjE0LDcgKzYzMiw3IEBACiAgICAgICAgIHJldHVybiBzZXR1cENvbXBsZXRlZDsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgbG9nU3lzdGVtSW5mbygpCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvZ1N5c3RlbUluZm8oTG9nZ2VyIGxvZ2dlcikKICAgICB7CiAgICAgCWlmIChsb2dnZXIuaXNJbmZvRW5hYmxlZCgpKQogICAgIAl7CkBAIC02ODUsOCArNzAzLDggQEAKIAogICAgIHByaXZhdGUgdm9pZCBzdGFydENsaWVudFRyYW5zcG9ydHMoKQogICAgIHsKLSAgICAgICAgU3RyaW5nIG5hdGl2ZUZsYWcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5zdGFydF9uYXRpdmVfdHJhbnNwb3J0Iik7Ci0gICAgICAgIGlmICgobmF0aXZlRmxhZyAhPSBudWxsICYmIEJvb2xlYW4ucGFyc2VCb29sZWFuKG5hdGl2ZUZsYWcpKSB8fCAobmF0aXZlRmxhZyA9PSBudWxsICYmIERhdGFiYXNlRGVzY3JpcHRvci5zdGFydE5hdGl2ZVRyYW5zcG9ydCgpKSkKKyAgICAgICAgU3RyaW5nIG5hdGl2ZUZsYWcgPSBTVEFSVF9OQVRJVkVfVFJBTlNQT1JULmdldFN0cmluZygpOworICAgICAgICBpZiAoU1RBUlRfTkFUSVZFX1RSQU5TUE9SVC5nZXRCb29sZWFuKCkgfHwgKG5hdGl2ZUZsYWcgPT0gbnVsbCAmJiBEYXRhYmFzZURlc2NyaXB0b3Iuc3RhcnROYXRpdmVUcmFuc3BvcnQoKSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHN0YXJ0TmF0aXZlVHJhbnNwb3J0KCk7CiAgICAgICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5zZXRScGNSZWFkeSh0cnVlKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2xpZW50U3RhdGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2xpZW50U3RhdGUuamF2YQppbmRleCA5ZTM1YzdmLi5mMDNhOTcxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0NsaWVudFN0YXRlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9DbGllbnRTdGF0ZS5qYXZhCkBAIC01OCw2ICs1OCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1ENURpZ2VzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNVU1RPTV9RVUVSWV9IQU5ETEVSX0NMQVNTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CiAKIC8qKgpAQCAtMTAxLDEzICsxMDIsMTQgQEAKICAgICBzdGF0aWMKICAgICB7CiAgICAgICAgIFF1ZXJ5SGFuZGxlciBoYW5kbGVyID0gUXVlcnlQcm9jZXNzb3IuaW5zdGFuY2U7Ci0gICAgICAgIFN0cmluZyBjdXN0b21IYW5kbGVyQ2xhc3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5jdXN0b21fcXVlcnlfaGFuZGxlcl9jbGFzcyIpOworICAgICAgICBTdHJpbmcgY3VzdG9tSGFuZGxlckNsYXNzID0gQ1VTVE9NX1FVRVJZX0hBTkRMRVJfQ0xBU1MuZ2V0U3RyaW5nKCk7CiAgICAgICAgIGlmIChjdXN0b21IYW5kbGVyQ2xhc3MgIT0gbnVsbCkKICAgICAgICAgewogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaGFuZGxlciA9IEZCVXRpbGl0aWVzLmNvbnN0cnVjdChjdXN0b21IYW5kbGVyQ2xhc3MsICJRdWVyeUhhbmRsZXIiKTsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiVXNpbmcge30gYXMgcXVlcnkgaGFuZGxlciBmb3IgbmF0aXZlIHByb3RvY29sIHF1ZXJpZXMgKGFzIHJlcXVlc3RlZCB3aXRoIC1EY2Fzc2FuZHJhLmN1c3RvbV9xdWVyeV9oYW5kbGVyX2NsYXNzKSIsIGN1c3RvbUhhbmRsZXJDbGFzcyk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlVzaW5nIHt9IGFzIGEgcXVlcnkgaGFuZGxlciBmb3IgbmF0aXZlIHByb3RvY29sIHF1ZXJpZXMgKGFzIHJlcXVlc3RlZCBieSB0aGUge30gc3lzdGVtIHByb3BlcnR5KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tSGFuZGxlckNsYXNzLCBDVVNUT01fUVVFUllfSEFORExFUl9DTEFTUy5nZXRLZXkoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICB7CkBAIC00MTQsNiArNDE2LDI3IEBACiAgICAgICAgIGVuc3VyZVBlcm1pc3Npb24odGFibGUua2V5c3BhY2UsIHBlcm0sIHRhYmxlLnJlc291cmNlKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNUYWJsZVBlcm1pc3Npb24oVGFibGVNZXRhZGF0YSB0YWJsZSwgUGVybWlzc2lvbiBwZXJtKQorICAgIHsKKyAgICAgICAgaWYgKGlzSW50ZXJuYWwpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICB2YWxpZGF0ZUxvZ2luKCk7CisKKyAgICAgICAgaWYgKCFEYXRhYmFzZURlc2NyaXB0b3IuZ2V0QXV0aG9yaXplcigpLnJlcXVpcmVBdXRob3JpemF0aW9uKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBMaXN0PD8gZXh0ZW5kcyBJUmVzb3VyY2U+IHJlc291cmNlcyA9IFJlc291cmNlcy5jaGFpbih0YWJsZS5yZXNvdXJjZSk7CisgICAgICAgIGlmIChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0QXV0aEZyb21Sb290KCkpCisgICAgICAgICAgICByZXNvdXJjZXMgPSBMaXN0cy5yZXZlcnNlKHJlc291cmNlcyk7CisKKyAgICAgICAgZm9yIChJUmVzb3VyY2UgciA6IHJlc291cmNlcykKKyAgICAgICAgICAgIGlmIChhdXRob3JpemUocikuY29udGFpbnMocGVybSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBlbnN1cmVQZXJtaXNzaW9uKFN0cmluZyBrZXlzcGFjZSwgUGVybWlzc2lvbiBwZXJtLCBEYXRhUmVzb3VyY2UgcmVzb3VyY2UpCiAgICAgewogICAgICAgICB2YWxpZGF0ZUtleXNwYWNlKGtleXNwYWNlKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvRGF0YVJlc3VycmVjdGlvbkNoZWNrLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0RhdGFSZXN1cnJlY3Rpb25DaGVjay5qYXZhCmluZGV4IDJjM2IwMzUuLjRjZjMyNzggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvRGF0YVJlc3VycmVjdGlvbkNoZWNrLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9EYXRhUmVzdXJyZWN0aW9uQ2hlY2suamF2YQpAQCAtNDUsNyArNDUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFLZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jazsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKQEAgLTg2LDEyICs4NiwxMiBAQAogCiAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZVRvSnNvbkZpbGUoRmlsZSBvdXRwdXRGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgRkJVdGlsaXRpZXMuc2VyaWFsaXplVG9Kc29uRmlsZSh0aGlzLCBvdXRwdXRGaWxlKTsKKyAgICAgICAgICAgIEpzb25VdGlscy5zZXJpYWxpemVUb0pzb25GaWxlKHRoaXMsIG91dHB1dEZpbGUpOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIHN0YXRpYyBIZWFydGJlYXQgZGVzZXJpYWxpemVGcm9tSnNvbkZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEZCVXRpbGl0aWVzLmRlc2VyaWFsaXplRnJvbUpzb25GaWxlKEhlYXJ0YmVhdC5jbGFzcywgZmlsZSk7CisgICAgICAgICAgICByZXR1cm4gSnNvblV0aWxzLmRlc2VyaWFsaXplRnJvbUpzb25GaWxlKEhlYXJ0YmVhdC5jbGFzcywgZmlsZSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvTG9hZEJyb2FkY2FzdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0xvYWRCcm9hZGNhc3Rlci5qYXZhCmluZGV4IGViZGEzY2QuLmRhOTNlYmQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvTG9hZEJyb2FkY2FzdGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9Mb2FkQnJvYWRjYXN0ZXIuamF2YQpAQCAtMzAsOSArMzAsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXMuKjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkJST0FEQ0FTVF9JTlRFUlZBTF9NUzsKKwogcHVibGljIGNsYXNzIExvYWRCcm9hZGNhc3RlciBpbXBsZW1lbnRzIElFbmRwb2ludFN0YXRlQ2hhbmdlU3Vic2NyaWJlcgogewotICAgIHN0YXRpYyBmaW5hbCBpbnQgQlJPQURDQVNUX0lOVEVSVkFMID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEuYnJvYWRjYXN0X2ludGVydmFsX21zIiwgNjAgKiAxMDAwKTsKKyAgICBzdGF0aWMgZmluYWwgaW50IEJST0FEQ0FTVF9JTlRFUlZBTCA9IEJST0FEQ0FTVF9JTlRFUlZBTF9NUy5nZXRJbnQoKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9hZEJyb2FkY2FzdGVyIGluc3RhbmNlID0gbmV3IExvYWRCcm9hZGNhc3RlcigpOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL05hdGl2ZVRyYW5zcG9ydFNlcnZpY2UuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvTmF0aXZlVHJhbnNwb3J0U2VydmljZS5qYXZhCmluZGV4IGYxMzFkNzQuLmNjNmVlMzcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvTmF0aXZlVHJhbnNwb3J0U2VydmljZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvTmF0aXZlVHJhbnNwb3J0U2VydmljZS5qYXZhCkBAIC00MCw2ICs0MCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlNlcnZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5OYXRpdmVMaWJyYXJ5OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTkFUSVZFX0VQT0xMX0VOQUJMRUQ7CisKIC8qKgogICogSGFuZGxlcyBuYXRpdmUgdHJhbnNwb3J0IHNlcnZlciBsaWZlY3ljbGUgYW5kIGFzc29jaWF0ZWQgcmVzb3VyY2VzLiBMYXppbHkgaW5pdGlhbGl6ZWQuCiAgKi8KQEAgLTE2MCw3ICsxNjIsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1c2VFcG9sbCgpCiAgICAgewotICAgICAgICBmaW5hbCBib29sZWFuIGVuYWJsZUVwb2xsID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEubmF0aXZlLmVwb2xsLmVuYWJsZWQiLCAidHJ1ZSIpKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBlbmFibGVFcG9sbCA9IE5BVElWRV9FUE9MTF9FTkFCTEVELmdldEJvb2xlYW4oKTsKIAogICAgICAgICBpZiAoZW5hYmxlRXBvbGwgJiYgIUVwb2xsLmlzQXZhaWxhYmxlKCkgJiYgTmF0aXZlTGlicmFyeS5vc1R5cGUgPT0gTmF0aXZlTGlicmFyeS5PU1R5cGUuTElOVVgpCiAgICAgICAgICAgICBsb2dnZXIud2FybigiZXBvbGwgbm90IGF2YWlsYWJsZSIsIEVwb2xsLnVuYXZhaWxhYmlsaXR5Q2F1c2UoKSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1NTVGFibGVzR2xvYmFsVHJhY2tlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TU1RhYmxlc0dsb2JhbFRyYWNrZXIuamF2YQppbmRleCBkZTc4ODkyLi42YTdiYWYzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1NTVGFibGVzR2xvYmFsVHJhY2tlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU1NUYWJsZXNHbG9iYWxUcmFja2VyLmphdmEKQEAgLTM2LDcgKzM2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuVHJhY2tlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uQW5kVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuSU5vdGlmaWNhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLklOb3RpZmljYXRpb25Db25zdW1lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLkluaXRpYWxTU1RhYmxlQWRkZWROb3RpZmljYXRpb247CkBAIC03OCwyMyArNzgsMjMgQEAKIAogICAgIHByaXZhdGUgZmluYWwgU2V0PERlc2NyaXB0b3I+IGFsbFNTVGFibGVzID0gQ29uY3VycmVudEhhc2hNYXAubmV3S2V5U2V0KCk7CiAKLSAgICBwcml2YXRlIGZpbmFsIFZlcnNpb25BbmRUeXBlIGN1cnJlbnRWZXJzaW9uOworICAgIHByaXZhdGUgZmluYWwgVmVyc2lvbiBjdXJyZW50VmVyc2lvbjsKICAgICBwcml2YXRlIGludCBzc3RhYmxlc0ZvckN1cnJlbnRWZXJzaW9uOwotICAgIHByaXZhdGUgZmluYWwgTWFwPFZlcnNpb25BbmRUeXBlLCBJbnRlZ2VyPiBzc3RhYmxlc0Zvck90aGVyVmVyc2lvbnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8VmVyc2lvbiwgSW50ZWdlcj4gc3N0YWJsZXNGb3JPdGhlclZlcnNpb25zID0gbmV3IEhhc2hNYXA8PigpOwogCi0gICAgcHJpdmF0ZSB2b2xhdGlsZSBJbW11dGFibGVTZXQ8VmVyc2lvbkFuZFR5cGU+IHZlcnNpb25zSW5Vc2UgPSBJbW11dGFibGVTZXQub2YoKTsKKyAgICBwcml2YXRlIHZvbGF0aWxlIEltbXV0YWJsZVNldDxWZXJzaW9uPiB2ZXJzaW9uc0luVXNlID0gSW1tdXRhYmxlU2V0Lm9mKCk7CiAKICAgICBwcml2YXRlIGZpbmFsIFNldDxJTm90aWZpY2F0aW9uQ29uc3VtZXI+IHN1YnNjcmliZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlTZXQ8PigpOwogCi0gICAgcHVibGljIFNTVGFibGVzR2xvYmFsVHJhY2tlcihTU1RhYmxlRm9ybWF0LlR5cGUgY3VycmVudFNTVGFibGVGb3JtYXQpCisgICAgcHVibGljIFNTVGFibGVzR2xvYmFsVHJhY2tlcihTU1RhYmxlRm9ybWF0PD8sID8+IGN1cnJlbnRTU1RhYmxlRm9ybWF0KQogICAgIHsKLSAgICAgICAgdGhpcy5jdXJyZW50VmVyc2lvbiA9IG5ldyBWZXJzaW9uQW5kVHlwZShjdXJyZW50U1NUYWJsZUZvcm1hdC5pbmZvLmdldExhdGVzdFZlcnNpb24oKSwgY3VycmVudFNTVGFibGVGb3JtYXQpOworICAgICAgICB0aGlzLmN1cnJlbnRWZXJzaW9uID0gY3VycmVudFNTVGFibGVGb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRoZSBzZXQgb2YgYWxsIHNzdGFibGUgdmVyc2lvbnMgY3VycmVudGx5IGluIHVzZSBvbiB0aGlzIG5vZGUuCiAgICAgICovCi0gICAgcHVibGljIFNldDxWZXJzaW9uQW5kVHlwZT4gdmVyc2lvbnNJblVzZSgpCisgICAgcHVibGljIFNldDxWZXJzaW9uPiB2ZXJzaW9uc0luVXNlKCkKICAgICB7CiAgICAgICAgIHJldHVybiB2ZXJzaW9uc0luVXNlOwogICAgIH0KQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgICAgICAgc3luY2hyb25pemVkIGJsb2NrLgogICAgICAgICAqLwogICAgICAgICBpbnQgY3VycmVudERlbHRhID0gMDsKLSAgICAgICAgTWFwPFZlcnNpb25BbmRUeXBlLCBJbnRlZ2VyPiBvdGhlcnNEZWx0YSA9IG51bGw7CisgICAgICAgIE1hcDxWZXJzaW9uLCBJbnRlZ2VyPiBvdGhlcnNEZWx0YSA9IG51bGw7CiAgICAgICAgIC8qCiAgICAgICAgICBOb3RlOiB3ZSBkZWFsIHdpdGggcmVtb3ZlcyBmaXJzdCBhcyBpZiBhIG5vdGlmaWNhdGlvbiBib3RoIHJlbW92ZXMgYW5kIGFkZHMsIGl0J3MgYSBjb21wYWN0aW9uIGFuZCB3aGlsZQogICAgICAgICAgaXQgc2hvdWxkIG5ldmVyIHJlbW92ZSBhbmQgYWRkIHRoZSBzYW1lIGRlc2NyaXB0b3IgaW4gcHJhY3RpY2UsIGRvaW5nIHRoZSByZW1vdmUgZmlyc3QgaXMgbW9yZSBsb2dpY2FsLgpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICAgICAgICBpZiAoIWFsbFNTVGFibGVzLnJlbW92ZShkZXNjKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgVmVyc2lvbkFuZFR5cGUgdmVyc2lvbiA9IHZlcnNpb24oZGVzYyk7CisgICAgICAgICAgICBWZXJzaW9uIHZlcnNpb24gPSBkZXNjLnZlcnNpb247CiAgICAgICAgICAgICBpZiAoY3VycmVudFZlcnNpb24uZXF1YWxzKHZlcnNpb24pKQogICAgICAgICAgICAgICAgIC0tY3VycmVudERlbHRhOwogICAgICAgICAgICAgZWxzZQpAQCAtMTcyLDcgKzE3Miw3IEBACiAgICAgICAgICAgICBpZiAoIWFsbFNTVGFibGVzLmFkZChkZXNjKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgVmVyc2lvbkFuZFR5cGUgdmVyc2lvbiA9IHZlcnNpb24oZGVzYyk7CisgICAgICAgICAgICBWZXJzaW9uIHZlcnNpb24gPSBkZXNjLnZlcnNpb247CiAgICAgICAgICAgICBpZiAoY3VycmVudFZlcnNpb24uZXF1YWxzKHZlcnNpb24pKQogICAgICAgICAgICAgICAgICsrY3VycmVudERlbHRhOwogICAgICAgICAgICAgZWxzZQpAQCAtMTk2LDkgKzE5Niw5IEBACiAKICAgICAgICAgICAgIGlmIChvdGhlcnNEZWx0YSAhPSBudWxsKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFZlcnNpb25BbmRUeXBlLCBJbnRlZ2VyPiBlbnRyeSA6IG90aGVyc0RlbHRhLmVudHJ5U2V0KCkpCisgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8VmVyc2lvbiwgSW50ZWdlcj4gZW50cnkgOiBvdGhlcnNEZWx0YS5lbnRyeVNldCgpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVmVyc2lvbkFuZFR5cGUgdmVyc2lvbiA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIHZlcnNpb24gPSBlbnRyeS5nZXRLZXkoKTsKICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gZW50cnkuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZXMgdGhlIGNvdW50LCByZW1vdmluZyB0aGUgdmVyc2lvbiBpZiBpdCByZWFjaGVzIDAgKG5vdGU6IHdlIGNvdWxkIHVzZSBNYXAjY29tcHV0ZSBmb3IgdGhpcywKQEAgLTIyMSwxNiArMjIxLDE2IEBACiAgICAgICAgIHJldHVybiB0cmlnZ2VyVXBkYXRlOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIEltbXV0YWJsZVNldDxWZXJzaW9uQW5kVHlwZT4gY29tcHV0ZVZlcnNpb25zSW5Vc2UoaW50IHNzdGFibGVzRm9yQ3VycmVudFZlcnNpb24sIFZlcnNpb25BbmRUeXBlIGN1cnJlbnRWZXJzaW9uLCBNYXA8VmVyc2lvbkFuZFR5cGUsIEludGVnZXI+IHNzdGFibGVzRm9yT3RoZXJWZXJzaW9ucykKKyAgICBwcml2YXRlIHN0YXRpYyBJbW11dGFibGVTZXQ8VmVyc2lvbj4gY29tcHV0ZVZlcnNpb25zSW5Vc2UoaW50IHNzdGFibGVzRm9yQ3VycmVudFZlcnNpb24sIFZlcnNpb24gY3VycmVudFZlcnNpb24sIE1hcDxWZXJzaW9uLCBJbnRlZ2VyPiBzc3RhYmxlc0Zvck90aGVyVmVyc2lvbnMpCiAgICAgewotICAgICAgICBJbW11dGFibGVTZXQuQnVpbGRlcjxWZXJzaW9uQW5kVHlwZT4gYnVpbGRlciA9IEltbXV0YWJsZVNldC5idWlsZGVyKCk7CisgICAgICAgIEltbXV0YWJsZVNldC5CdWlsZGVyPFZlcnNpb24+IGJ1aWxkZXIgPSBJbW11dGFibGVTZXQuYnVpbGRlcigpOwogICAgICAgICBpZiAoc3N0YWJsZXNGb3JDdXJyZW50VmVyc2lvbiA+IDApCiAgICAgICAgICAgICBidWlsZGVyLmFkZChjdXJyZW50VmVyc2lvbik7CiAgICAgICAgIGJ1aWxkZXIuYWRkQWxsKHNzdGFibGVzRm9yT3RoZXJWZXJzaW9ucy5rZXlTZXQoKSk7CiAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNhbml0aXplU1NUYWJsZXNDb3VudChpbnQgc3N0YWJsZUNvdW50LCBWZXJzaW9uQW5kVHlwZSB2ZXJzaW9uKQorICAgIHByaXZhdGUgc3RhdGljIGludCBzYW5pdGl6ZVNTVGFibGVzQ291bnQoaW50IHNzdGFibGVDb3VudCwgVmVyc2lvbiB2ZXJzaW9uKQogICAgIHsKICAgICAgICAgaWYgKHNzdGFibGVDb3VudCA+PSAwKQogICAgICAgICAgICAgcmV0dXJuIHNzdGFibGVDb3VudDsKQEAgLTI0MSw3ICsyNDEsNyBAQAogICAgICAgICAqLwogICAgICAgICBub1NwYW1Mb2dnZXIuZXJyb3IoIkludmFsaWQgc3RhdGUgd2hpbGUgaGFuZGxpbmcgc3N0YWJsZXMgY2hhbmdlIG5vdGlmaWNhdGlvbjogdGhlIG51bWJlciBvZiBzc3RhYmxlcyBmb3IgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiB7fSB3YXMgY29tcHV0ZWQgdG8ge30uIFRoaXMgaW5kaWNhdGUgYSBidWcgYW5kIHBsZWFzZSByZXBvcnQgaXQsIGJ1dCBpdCBzaG91bGQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGhhdmUgYWR2ZXJzZSBjb25zZXF1ZW5jZXMuIiwgdmVyc2lvbiwgc3N0YWJsZUNvdW50LCBuZXcgUnVudGltZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgaGF2ZSBhZHZlcnNlIGNvbnNlcXVlbmNlcy4iLCB2ZXJzaW9uLnRvRm9ybWF0QW5kVmVyc2lvblN0cmluZygpLCBzc3RhYmxlQ291bnQsIG5ldyBSdW50aW1lRXhjZXB0aW9uKCkpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTI2NywxOCArMjY3LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFZlcnNpb25BbmRUeXBlLCBJbnRlZ2VyPiB1cGRhdGUoTWFwPFZlcnNpb25BbmRUeXBlLCBJbnRlZ2VyPiBjb3VudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbkFuZFR5cGUgdG9VcGRhdGUsCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFZlcnNpb24sIEludGVnZXI+IHVwZGF0ZShNYXA8VmVyc2lvbiwgSW50ZWdlcj4gY291bnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gdG9VcGRhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhKQogICAgIHsKLSAgICAgICAgTWFwPFZlcnNpb25BbmRUeXBlLCBJbnRlZ2VyPiBtID0gY291bnRzID09IG51bGwgPyBuZXcgSGFzaE1hcDw+KCkgOiBjb3VudHM7CisgICAgICAgIE1hcDxWZXJzaW9uLCBJbnRlZ2VyPiBtID0gY291bnRzID09IG51bGwgPyBuZXcgSGFzaE1hcDw+KCkgOiBjb3VudHM7CiAgICAgICAgIG0ubWVyZ2UodG9VcGRhdGUsIGRlbHRhLCAoYSwgYikgLT4gKGEgKyBiID09IDApID8gbnVsbCA6IChhICsgYikpOwogICAgICAgICByZXR1cm4gbTsKICAgICB9CiAKLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgVmVyc2lvbkFuZFR5cGUgdmVyc2lvbihEZXNjcmlwdG9yIHNzdGFibGUpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFZlcnNpb25BbmRUeXBlKHNzdGFibGUudmVyc2lvbiwgc3N0YWJsZS5mb3JtYXRUeXBlKTsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1NTVGFibGVzVmVyc2lvbnNJblVzZUNoYW5nZU5vdGlmaWNhdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TU1RhYmxlc1ZlcnNpb25zSW5Vc2VDaGFuZ2VOb3RpZmljYXRpb24uamF2YQppbmRleCAzNTJiZWM3Li4wOGY2N2E0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1NTVGFibGVzVmVyc2lvbnNJblVzZUNoYW5nZU5vdGlmaWNhdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU1NUYWJsZXNWZXJzaW9uc0luVXNlQ2hhbmdlTm90aWZpY2F0aW9uLmphdmEKQEAgLTE4LDkgKzE4LDExIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZTsKIAoraW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbkFuZFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLklOb3RpZmljYXRpb247CiAKIC8qKgpAQCAtMzUsOSArMzcsOSBAQAogICAgIC8qKgogICAgICAqIFRoZSBzZXQgb2YgYWxsIHNzdGFibGUgdmVyc2lvbnMgaW4gdXNlIG9uIHRoaXMgbm9kZSBhdCB0aGUgdGltZSBvZiB0aGlzIG5vdGlmaWNhdGlvbi4KICAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSW1tdXRhYmxlU2V0PFZlcnNpb25BbmRUeXBlPiB2ZXJzaW9uc0luVXNlOworICAgIHB1YmxpYyBmaW5hbCBJbW11dGFibGVTZXQ8VmVyc2lvbj4gdmVyc2lvbnNJblVzZTsKIAotICAgIFNTVGFibGVzVmVyc2lvbnNJblVzZUNoYW5nZU5vdGlmaWNhdGlvbihJbW11dGFibGVTZXQ8VmVyc2lvbkFuZFR5cGU+IHZlcnNpb25zSW5Vc2UpCisgICAgU1NUYWJsZXNWZXJzaW9uc0luVXNlQ2hhbmdlTm90aWZpY2F0aW9uKEltbXV0YWJsZVNldDxWZXJzaW9uPiB2ZXJzaW9uc0luVXNlKQogICAgIHsKICAgICAgICAgdGhpcy52ZXJzaW9uc0luVXNlID0gdmVyc2lvbnNJblVzZTsKICAgICB9CkBAIC00NSw2ICs0Nyw2IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgewotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiU1NUYWJsZXNJblVzZUNoYW5nZU5vdGlmaWNhdGlvbiglcykiLCB2ZXJzaW9uc0luVXNlKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlNTVGFibGVzSW5Vc2VDaGFuZ2VOb3RpZmljYXRpb24oJXMpIiwgdmVyc2lvbnNJblVzZS5zdHJlYW0oKS5tYXAoVmVyc2lvbjo6dG9Gb3JtYXRBbmRWZXJzaW9uU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1NuYXBzaG90VmVyYkhhbmRsZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU25hcHNob3RWZXJiSGFuZGxlci5qYXZhCmluZGV4IDg1MGM5ODIuLjk5YjUxMDUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU25hcHNob3RWZXJiSGFuZGxlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU25hcHNob3RWZXJiSGFuZGxlci5qYXZhCkBAIC0xNywxNiArMTcsMjMgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlOwogCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNuYXBzaG90Q29tbWFuZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbmFwc2hvdENvbW1hbmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuSVZlcmJIYW5kbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkRpYWdub3N0aWNTbmFwc2hvdFNlcnZpY2U7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlBhcmFtVHlwZS5TTkFQU0hPVF9SQU5HRVM7CisKIHB1YmxpYyBjbGFzcyBTbmFwc2hvdFZlcmJIYW5kbGVyIGltcGxlbWVudHMgSVZlcmJIYW5kbGVyPFNuYXBzaG90Q29tbWFuZD4KIHsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNuYXBzaG90VmVyYkhhbmRsZXIgaW5zdGFuY2UgPSBuZXcgU25hcHNob3RWZXJiSGFuZGxlcigpOwpAQCAtMzcsMTEgKzQ0LDE0IEBACiAgICAgICAgIFNuYXBzaG90Q29tbWFuZCBjb21tYW5kID0gbWVzc2FnZS5wYXlsb2FkOwogICAgICAgICBpZiAoY29tbWFuZC5jbGVhcl9zbmFwc2hvdCkKICAgICAgICAgewotICAgICAgICAgICAgS2V5c3BhY2UuY2xlYXJTbmFwc2hvdChjb21tYW5kLnNuYXBzaG90X25hbWUsIGNvbW1hbmQua2V5c3BhY2UpOworICAgICAgICAgICAgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuY2xlYXJTbmFwc2hvdChjb21tYW5kLnNuYXBzaG90X25hbWUsIGNvbW1hbmQua2V5c3BhY2UpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKERpYWdub3N0aWNTbmFwc2hvdFNlcnZpY2UuaXNEaWFnbm9zdGljU25hcHNob3RSZXF1ZXN0KGNvbW1hbmQpKQogICAgICAgICB7Ci0gICAgICAgICAgICBEaWFnbm9zdGljU25hcHNob3RTZXJ2aWNlLnNuYXBzaG90KGNvbW1hbmQsIG1lc3NhZ2UuZnJvbSgpKTsKKyAgICAgICAgICAgIExpc3Q8UmFuZ2U8VG9rZW4+PiByYW5nZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlLmhlYWRlci5wYXJhbXMoKS5jb250YWluc0tleShTTkFQU0hPVF9SQU5HRVMpKQorICAgICAgICAgICAgICAgIHJhbmdlcyA9IChMaXN0PFJhbmdlPFRva2VuPj4pIG1lc3NhZ2UuaGVhZGVyLnBhcmFtcygpLmdldChTTkFQU0hPVF9SQU5HRVMpOworICAgICAgICAgICAgRGlhZ25vc3RpY1NuYXBzaG90U2VydmljZS5zbmFwc2hvdChjb21tYW5kLCByYW5nZXMsIG1lc3NhZ2UuZnJvbSgpKTsKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RhcnR1cENoZWNrLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0YXJ0dXBDaGVjay5qYXZhCmluZGV4IDMzMWIzODEuLmMzNzkwZTggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RhcnR1cENoZWNrLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdGFydHVwQ2hlY2suamF2YQpAQCAtMzEsNyArMzEsNyBAQAogICogbWlzY29uZmlndXJhdGlvbiBvZiBjbHVzdGVyX25hbWUgaW4gY2Fzc2FuZHJhLnlhbWwuCiAgKgogICogVGhlIFN0YXJ0dXBDaGVja3MgY2xhc3MgbWFuYWdlcyBhIGNvbGxlY3Rpb24gb2YgdGhlc2UgdGVzdHMsIHdoaWNoIGl0IGV4ZWN1dGVzCi0gKiByaWdodCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZXJ2ZXIgc2V0dHVwIHByb2Nlc3MuCisgKiByaWdodCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZXJ2ZXIgc2V0dXAgcHJvY2Vzcy4KICAqLwogcHVibGljIGludGVyZmFjZSBTdGFydHVwQ2hlY2sKIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RhcnR1cENoZWNrcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdGFydHVwQ2hlY2tzLmphdmEKaW5kZXggMGFhY2MwMi4uZDA0ZDU1OSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdGFydHVwQ2hlY2tzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdGFydHVwQ2hlY2tzLmphdmEKQEAgLTczLDYgKzczLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5OYXRpdmVMaWJyYXJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlNpZ2FyTGlicmFyeTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9KTVhfTE9DQUxfUE9SVDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1BPUlQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSkFWQV9WRVJTSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpBVkFfVk1fTkFNRTsKQEAgLTE2NCw3ICsxNjUsNyBAQAogCiAgICAgLyoqCiAgICAgICogUnVuIHRoZSBjb25maWd1cmVkIHRlc3RzIGFuZCByZXR1cm4gYSByZXBvcnQgZGV0YWlsaW5nIHRoZSByZXN1bHRzLgotICAgICAqIEB0aHJvd3Mgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5TdGFydHVwRXhjZXB0aW9uIGlmIGFueSB0ZXN0IGRldGVybWluZXMgdGhhdCB0aGUKKyAgICAgKiBAdGhyb3dzIFN0YXJ0dXBFeGNlcHRpb24gaWYgYW55IHRlc3QgZGV0ZXJtaW5lcyB0aGF0IHRoZQogICAgICAqIHN5c3RlbSBpcyBub3QgaW4gYW4gdmFsaWQgc3RhdGUgdG8gc3RhcnR1cAogICAgICAqIEBwYXJhbSBvcHRpb25zIG9wdGlvbnMgdG8gcGFzcyB0byByZXNwZWN0aXZlIGNoZWNrcyBmb3IgdGhlaXIgY29uZmlncmF0aW9uCiAgICAgICovCkBAIC0yNTcsNyArMjU4LDcgQEAKICAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiSk1YIGlzIG5vdCBlbmFibGVkIHRvIHJlY2VpdmUgcmVtb3RlIGNvbm5lY3Rpb25zLiBQbGVhc2Ugc2VlIGNhc3NhbmRyYS1lbnYuc2ggZm9yIG1vcmUgaW5mby4iKTsKICAgICAgICAgICAgICAgICBqbXhQb3J0ID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9KTVhfTE9DQUxfUE9SVC50b1N0cmluZygpOwogICAgICAgICAgICAgICAgIGlmIChqbXhQb3J0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiY2Fzc2FuZHJhLmpteC5sb2NhbC5wb3J0IG1pc3NpbmcgZnJvbSBjYXNzYW5kcmEtZW52LnNoLCB1bmFibGUgdG8gc3RhcnQgbG9jYWwgSk1YIHNlcnZpY2UuIik7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihDQVNTQU5EUkFfSk1YX0xPQ0FMX1BPUlQuZ2V0S2V5KCkgKyAiIG1pc3NpbmcgZnJvbSBjYXNzYW5kcmEtZW52LnNoLCB1bmFibGUgdG8gc3RhcnQgbG9jYWwgSk1YIHNlcnZpY2UuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7CkBAIC01NTQsNyArNTU1LDcgQEAKIAogICAgICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBEZXNjcmlwdG9yLmZyb21GaWxlV2l0aENvbXBvbmVudChmaWxlLCBmYWxzZSkubGVmdDsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVzYy5pc0NvbXBhdGlibGUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkLmFkZChmaWxlLnRvU3RyaW5nKCkpOwogCkBAIC01NzAsNiArNTcxLDQwIEBACiAKICAgICAgICAgICAgICAgICBwdWJsaWMgRmlsZVZpc2l0UmVzdWx0IHByZVZpc2l0RGlyZWN0b3J5KFBhdGggZGlyLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzIGF0dHJzKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIG5hbWVQYXJ0cyA9IEZpbGVVdGlscy5nZXRDYW5vbmljYWxQYXRoKG5ldyBGaWxlKGRpcikpLnNwbGl0KGphdmEuaW8uRmlsZS5zZXBhcmF0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAobmFtZVBhcnRzLmxlbmd0aCA+PSAyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFibGVQYXJ0ID0gbmFtZVBhcnRzW25hbWVQYXJ0cy5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrc1BhcnQgPSBuYW1lUGFydHNbbmFtZVBhcnRzLmxlbmd0aCAtIDJdOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVQYXJ0LmNvbnRhaW5zKCItIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVQYXJ0ID0gdGFibGVQYXJ0LnNwbGl0KCItIilbMF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIHZlcnkgb2xkIHZlcnNpb25zIG9mIENhc3NhbmRyYSwgd2Ugd291bGRuJ3QgbmVjZXNzYXJpbHkgZGVsZXRlIHNzdGFibGVzIGZyb20gZHJvcHBlZCBzeXN0ZW0gdGFibGVzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCB3ZXJlIHJlbW92ZWQgaW4gdmFyaW91cyBtYWpvciB2ZXJzaW9uIHVwZ3JhZGVzIChlLmcgc3lzdGVtLlZlcnNpb25zIGluIDEuMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrc1BhcnQuZXF1YWxzKFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSkgJiYgIVN5c3RlbUtleXNwYWNlLkFMTF9UQUJMRV9OQU1FUy5jb250YWlucyh0YWJsZVBhcnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYW5vbmljYWxQYXRoID0gRmlsZVV0aWxzLmdldENhbm9uaWNhbFBhdGgobmV3IEZpbGUoZGlyKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW4gaGF2ZSBzbmFwc2hvdHMgb2Ygb3VyIHN5c3RlbSB0YWJsZXMgb3Igc25hcHNob3RzIGNyZWF0ZWQgd2l0aCBhIC10IHRhZyBvZiAic3lzdGVtIiB0aGF0IHdvdWxkIHRyaWdnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHBvdGVudGlhbCB3YXJuaW5nLCBzbyB3ZSB3YXJuIG1vcmUgc29mdGx5IGluIHRoZSBjYXNlIHRoYXQgaXQncyBwcm9iYWJseSBhIHNuYXBzaG90LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5vbmljYWxQYXRoLmNvbnRhaW5zKCJzbmFwc2hvdCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkZvdW5kIHVua25vd24gc3lzdGVtIGRpcmVjdG9yeSB7fS57fSBhdCB7fSB0aGF0IGNvbnRhaW5zIHRoZSB3b3JkIHNuYXBzaG90LiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgbWF5IGJlIGxlZnQgb3ZlciBmcm9tIGEgcHJldmlvdXMgdmVyc2lvbiBvZiBDYXNzYW5kcmEgb3IgbWF5IGJlIG5vcm1hbC4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQ29uc2lkZXIgcmVtb3ZpbmcgYWZ0ZXIgaW5zcGVjdGlvbiBpZiBkZXRlcm1pbmVkIHRvIGJlIHVubmVjZXNzYXJ5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzUGFydCwgdGFibGVQYXJ0LCBjYW5vbmljYWxQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIkZvdW5kIHVua25vd24gc3lzdGVtIGRpcmVjdG9yeSB7fS57fSBhdCB7fSAtIHRoaXMgaXMgbGlrZWx5IGxlZnQgb3ZlciBmcm9tIGEgcHJldmlvdXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIG9mIENhc3NhbmRyYSBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIgaW5zcGVjdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrc1BhcnQsIHRhYmxlUGFydCwgY2Fub25pY2FsUGF0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWxlVmlzaXRSZXN1bHQuU0tJUF9TVUJUUkVFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBkaXIuZ2V0RmlsZU5hbWUoKS50b1N0cmluZygpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5hbWUuZXF1YWxzKERpcmVjdG9yaWVzLlNOQVBTSE9UX1NVQkRJUikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBuYW1lLmVxdWFscyhEaXJlY3Rvcmllcy5CQUNLVVBTX1NVQkRJUikKQEAgLTY0Nyw3ICs2ODIsNyBAQAogICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFN0cmluZy5mb3JtYXQoIkNhc3NhbmRyYSBzeXN0ZW0gcHJvcGVydHkgZmxhZyAlcyBpcyBkZXByZWNhdGVkIGFuZCB5b3Ugc2hvdWxkICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZSBzdGFydHVwIGNoZWNrIGNvbmZpZ3VyYXRpb24gaW4gY2Fzc2FuZHJhLnlhbWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLklHTk9SRV9EQy5nZXRLZXkoKSkpOwotICAgICAgICAgICAgICAgIGVuYWJsZWQgPSAhQm9vbGVhbi5nZXRCb29sZWFuKENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JR05PUkVfREMuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIGVuYWJsZWQgPSAhQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLklHTk9SRV9EQy5nZXRCb29sZWFuKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZW5hYmxlZCkKICAgICAgICAgICAgIHsKQEAgLTY4NCw3ICs3MTksNyBAQAogICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFN0cmluZy5mb3JtYXQoIkNhc3NhbmRyYSBzeXN0ZW0gcHJvcGVydHkgZmxhZyAlcyBpcyBkZXByZWNhdGVkIGFuZCB5b3Ugc2hvdWxkICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZSBzdGFydHVwIGNoZWNrIGNvbmZpZ3VyYXRpb24gaW4gY2Fzc2FuZHJhLnlhbWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLklHTk9SRV9SQUNLLmdldEtleSgpKSk7Ci0gICAgICAgICAgICAgICAgZW5hYmxlZCA9ICFCb29sZWFuLmdldEJvb2xlYW4oQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLklHTk9SRV9SQUNLLmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICBlbmFibGVkID0gIUNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JR05PUkVfUkFDSy5nZXRCb29sZWFuKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZW5hYmxlZCkKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVByb3h5LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VQcm94eS5qYXZhCmluZGV4IDJhMGNjYWIuLjFiYjQwYWQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVByb3h5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlUHJveHkuamF2YQpAQCAtNDQsMTkgKzQ0LDE1IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLlBheG9zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7Ci0KIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYmF0Y2hsb2cuQmF0Y2g7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYmF0Y2hsb2cuQmF0Y2hsb2dNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRGVidWdnYWJsZVRhc2suUnVubmFibGVEZWJ1Z2dhYmxlVGFzazsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlN0YWdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbnNpc3RlbmN5TGV2ZWw7CkBAIC04OCw2ICs4NCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLklzQm9vdHN0cmFwcGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLk92ZXJsb2FkZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5RdWVyeUNhbmNlbGxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlYWRBYm9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlYWRGYWlsdXJlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUmVhZFRpbWVvdXRFeGNlcHRpb247CkBAIC0xMDIsNiArOTksNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmhpbnRzLkhpbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGludHMuSGludHNTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuQWJzdHJhY3RSZXBsaWNhdGlvblN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuRHluYW1pY0VuZHBvaW50U25pdGNoOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuRW5kcG9pbnRzRm9yVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JRW5kcG9pbnRTbml0Y2g7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CkBAIC0xMTEsNiArMTA5LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlJlcGxpY2FQbGFuczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlJlcGxpY2FzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ0FTQ2xpZW50UmVxdWVzdE1ldHJpY3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5EZW55bGlzdE1ldHJpY3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5SZWFkUmVwYWlyTWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0b3JhZ2VNZXRyaWNzOwpAQCAtMTI1LDYgKzEyNCwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5CYWxsb3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5Db21taXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5Db250ZW50aW9uU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5QYXhvczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLlBheG9zU3RhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy52MS5QcmVwYXJlQ2FsbGJhY2s7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy52MS5Qcm9wb3NlQ2FsbGJhY2s7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5yZWFkcy5BYnN0cmFjdFJlYWRFeGVjdXRvcjsKQEAgLTEzOSwxMyArMTQzLDE3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTW9ub3RvbmljQ2xvY2s7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTm9TcGFtTG9nZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uOwogCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmNvbmNhdDsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlMTElTRUNPTkRTOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5OQU5PU0VDT05EUzsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5jb25jYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlscy5qb2luOworCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbnNpc3RlbmN5TGV2ZWwuU0VSSUFMOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnZS5vdXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2xpZW50UmVxdWVzdHNNZXRyaWNzSG9sZGVyLmNhc1JlYWRNZXRyaWNzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudFJlcXVlc3RzTWV0cmljc0hvbGRlci5jYXNXcml0ZU1ldHJpY3M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2xpZW50UmVxdWVzdHNNZXRyaWNzSG9sZGVyLnJlYWRNZXRyaWNzOwpAQCAtMTUzLDggKzE2MSwxNSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudFJlcXVlc3RzTWV0cmljc0hvbGRlci52aWV3V3JpdGVNZXRyaWNzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudFJlcXVlc3RzTWV0cmljc0hvbGRlci53cml0ZU1ldHJpY3M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2xpZW50UmVxdWVzdHNNZXRyaWNzSG9sZGVyLndyaXRlTWV0cmljc0ZvckxldmVsOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnZS5vdXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5Ob1BheWxvYWQubm9QYXlsb2FkOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi4qOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi5CQVRDSF9TVE9SRV9SRVE7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiLk1VVEFUSU9OX1JFUTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmIuUEFYT1NfQ09NTUlUX1JFUTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmIuUEFYT1NfUFJFUEFSRV9SRVE7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiLlBBWE9TX1BST1BPU0VfUkVROworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi5TQ0hFTUFfVkVSU0lPTl9SRVE7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiLlRSVU5DQVRFX1JFUTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5CYXRjaGxvZ1Jlc3BvbnNlSGFuZGxlci5CYXRjaGxvZ0NsZWFudXA7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuQmFsbG90LkZsYWcuR0xPQkFMOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLkJhbGxvdC5GbGFnLkxPQ0FMOwpAQCAtMTY1LDcgKzE4MCw2IEBACiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Db3VudERvd25MYXRjaC5uZXdDb3VudERvd25MYXRjaDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzLmpvaW47CiAKIHB1YmxpYyBjbGFzcyBTdG9yYWdlUHJveHkgaW1wbGVtZW50cyBTdG9yYWdlUHJveHlNQmVhbgogewpAQCAtMzUwLDYgKzM2NCw5IEBACiAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBkZXNpcmVkIHVwZGF0ZXMKICAgICAgICAgICAgICAgICBQYXJ0aXRpb25VcGRhdGUgdXBkYXRlcyA9IHJlcXVlc3QubWFrZVVwZGF0ZXMoY3VycmVudCwgY2xpZW50U3RhdGUsIGJhbGxvdCk7CiAKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG1ldHJpY3MgYmVmb3JlIHRyaWdnZXJzIHBvdGVudGlhbGx5IGFkZCBtdXRhdGlvbnMuCisgICAgICAgICAgICAgICAgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnJlY29yZFJvd0FuZENvbHVtbkNvdW50TWV0cmljcyh1cGRhdGVzKTsKKwogICAgICAgICAgICAgICAgIGxvbmcgc2l6ZSA9IHVwZGF0ZXMuZGF0YVNpemUoKTsKICAgICAgICAgICAgICAgICBjYXNXcml0ZU1ldHJpY3MubXV0YXRpb25TaXplLnVwZGF0ZShzaXplKTsKICAgICAgICAgICAgICAgICB3cml0ZU1ldHJpY3NGb3JMZXZlbChjb25zaXN0ZW5jeUZvclBheG9zKS5tdXRhdGlvblNpemUudXBkYXRlKHNpemUpOwpAQCAtODI5LDYgKzg0NiwxMiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAiUGF4b3MgIiArIG1lc3NhZ2UucGF5bG9hZC50b1N0cmluZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHByb3RlY3RlZCBWZXJiIHZlcmIoKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHJldHVybiBQQVhPU19DT01NSVRfUkVROwpAQCAtMTI2Myw3ICsxMjg2LDcgQEAKICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiU2VuZGluZyBiYXRjaGxvZyBzdG9yZSByZXF1ZXN0IHt9IHRvIHt9IGZvciB7fSBtdXRhdGlvbnMiLCBiYXRjaC5pZCwgcmVwbGljYSwgYmF0Y2guc2l6ZSgpKTsKIAogICAgICAgICAgICAgaWYgKHJlcGxpY2EuaXNTZWxmKCkpCi0gICAgICAgICAgICAgICAgcGVyZm9ybUxvY2FsbHkoU3RhZ2UuTVVUQVRJT04sIHJlcGxpY2EsICgpIC0+IEJhdGNobG9nTWFuYWdlci5zdG9yZShiYXRjaCksIGhhbmRsZXIpOworICAgICAgICAgICAgICAgIHBlcmZvcm1Mb2NhbGx5KFN0YWdlLk1VVEFUSU9OLCByZXBsaWNhLCAoKSAtPiBCYXRjaGxvZ01hbmFnZXIuc3RvcmUoYmF0Y2gpLCBoYW5kbGVyLCAiQmF0Y2hsb2cgc3RvcmUiKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCkuc2VuZFdpdGhDYWxsYmFjayhtZXNzYWdlLCByZXBsaWNhLmVuZHBvaW50KCksIGhhbmRsZXIpOwogICAgICAgICB9CkBAIC0xMjc5LDcgKzEzMDIsNyBAQAogICAgICAgICAgICAgICAgIGxvZ2dlci50cmFjZSgiU2VuZGluZyBiYXRjaGxvZyByZW1vdmUgcmVxdWVzdCB7fSB0byB7fSIsIHV1aWQsIHRhcmdldCk7CiAKICAgICAgICAgICAgIGlmICh0YXJnZXQuaXNTZWxmKCkpCi0gICAgICAgICAgICAgICAgcGVyZm9ybUxvY2FsbHkoU3RhZ2UuTVVUQVRJT04sIHRhcmdldCwgKCkgLT4gQmF0Y2hsb2dNYW5hZ2VyLnJlbW92ZSh1dWlkKSk7CisgICAgICAgICAgICAgICAgcGVyZm9ybUxvY2FsbHkoU3RhZ2UuTVVUQVRJT04sIHRhcmdldCwgKCkgLT4gQmF0Y2hsb2dNYW5hZ2VyLnJlbW92ZSh1dWlkKSwgIkJhdGNobG9nIHJlbW92ZSIpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5zZW5kKG1lc3NhZ2UsIHRhcmdldC5lbmRwb2ludCgpKTsKICAgICAgICAgfQpAQCAtMTQ1Nyw2ICsxNDgwLDE1IEBACiAKICAgICAgICAgTGlzdDxJbmV0QWRkcmVzc0FuZFBvcnQ+IGJhY2tQcmVzc3VyZUhvc3RzID0gbnVsbDsKIAorICAgICAgICAvLyBGb3IgcGVyZm9ybWFuY2UsIE11dGF0aW9uIGNhY2hlcyBzZXJpYWxpemVkIGJ1ZmZlcnMgdGhhdCBhcmUgY29tcHV0ZWQgbGF6aWx5IGluIHNlcmlhbGl6ZWRCdWZmZXIoKS4gVGhhdAorICAgICAgICAvLyBjb21wdXRhdGlvbiBpcyBub3Qgc3luY2hyb25pemVkIGhvd2V2ZXIgYW5kIHdlIHdpbGwgcG90ZW50aWFsbHkgY2FsbCB0aGF0IG1ldGhvZCBjb25jdXJyZW50bHkgZm9yIGVhY2gKKyAgICAgICAgLy8gZGlzcGF0Y2hlZCBtZXNzYWdlIChub3QgdGhhdCBjb25jdXJyZW50IGNhbGxzIHRvIHNlcmlhbGl6ZWRCdWZmZXIoKSBhcmUgInVuc2FmZSIgcGVyIHNlLCBqdXN0IHRoYXQgdGhleQorICAgICAgICAvLyBtYXkgcmVzdWx0IGluIG11bHRpcGxlIGNvbXB1dGF0aW9ucywgbWFraW5nIHRoZSBjYWNoaW5nIG9wdGltaXphdGlvbiBtb290KS4gU28gZm9yY2luZyB0aGUgc2VyaWFsaXphdGlvbgorICAgICAgICAvLyBoZXJlIHRvIG1ha2Ugc3VyZSBpdCdzIGFscmVhZHkgY2FjaGVkL2NvbXB1dGVkIHdoZW4gaXQncyBjb25jdXJyZW50bHkgdXNlZCBsYXRlci4KKyAgICAgICAgLy8gU2lkZSBub3RlOiB3ZSBoYXZlIG9uZSBjYWNoZWQgYnVmZmVycyBmb3IgZWFjaCB1c2VkIEVuY29kaW5nVmVyc2lvbiBhbmQgdGhpcyBvbmx5IHByZS1jb21wdXRlIHRoZSBvbmUgZm9yCisgICAgICAgIC8vIHRoZSBjdXJyZW50IHZlcnNpb24sIGJ1dCBpdCdzIGp1c3QgYW4gb3B0aW1pemF0aW9uIGFuZCB3ZSdyZSBvayBub3Qgb3B0aW1pemluZyBmb3IgbWl4ZWQtdmVyc2lvbiBjbHVzdGVycy4KKyAgICAgICAgTXV0YXRpb24uc2VyaWFsaXplci5wcmVwYXJlU2VyaWFsaXplZEJ1ZmZlcihtdXRhdGlvbiwgTWVzc2FnaW5nU2VydmljZS5jdXJyZW50X3ZlcnNpb24pOworCiAgICAgICAgIGZvciAoUmVwbGljYSBkZXN0aW5hdGlvbiA6IHBsYW4uY29udGFjdHMoKSkKICAgICAgICAgewogICAgICAgICAgICAgY2hlY2tIaW50T3ZlcmxvYWQoZGVzdGluYXRpb24pOwpAQCAtMTUyMyw3ICsxNTU1LDcgQEAKICAgICAgICAgaWYgKGluc2VydExvY2FsKQogICAgICAgICB7CiAgICAgICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChsb2NhbFJlcGxpY2EpOwotICAgICAgICAgICAgcGVyZm9ybUxvY2FsbHkoc3RhZ2UsIGxvY2FsUmVwbGljYSwgbXV0YXRpb246OmFwcGx5LCByZXNwb25zZUhhbmRsZXIpOworICAgICAgICAgICAgcGVyZm9ybUxvY2FsbHkoc3RhZ2UsIGxvY2FsUmVwbGljYSwgbXV0YXRpb246OmFwcGx5LCByZXNwb25zZUhhbmRsZXIsIG11dGF0aW9uKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChsb2NhbERjICE9IG51bGwpCkBAIC0xNTY2LDcgKzE1OTgsNyBAQAogCiAgICAgICAgIGlmICh0YXJnZXRzLnNpemUoKSA+IDEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldHMuZ2V0KFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKS5uZXh0SW50KDAsIHRhcmdldHMuc2l6ZSgpKSk7CisgICAgICAgICAgICB0YXJnZXQgPSBwaWNrUmVwbGljYSh0YXJnZXRzKTsKICAgICAgICAgICAgIEVuZHBvaW50c0ZvclRva2VuIGZvcndhcmRUb1JlcGxpY2FzID0gdGFyZ2V0cy5maWx0ZXIociAtPiByICE9IHRhcmdldCwgdGFyZ2V0cy5zaXplKCkpOwogCiAgICAgICAgICAgICBmb3IgKFJlcGxpY2EgcmVwbGljYSA6IGZvcndhcmRUb1JlcGxpY2FzKQpAQCAtMTU4NiwxMSArMTYxOCwxOSBAQAogICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0cy5nZXQoMCk7CiAgICAgICAgIH0KIAorICAgICAgICBUcmFjaW5nLnRyYWNlKCJTZW5kaW5nIG11dGF0aW9uIHRvIHJlbW90ZSByZXBsaWNhIHt9IiwgdGFyZ2V0KTsKICAgICAgICAgTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLnNlbmRXcml0ZVdpdGhDYWxsYmFjayhtZXNzYWdlLCB0YXJnZXQsIGhhbmRsZXIpOwogICAgICAgICBsb2dnZXIudHJhY2UoIlNlbmRpbmcgbWVzc2FnZSB0byB7fUB7fSIsIG1lc3NhZ2UuaWQoKSwgdGFyZ2V0KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBlcmZvcm1Mb2NhbGx5KFN0YWdlIHN0YWdlLCBSZXBsaWNhIGxvY2FsUmVwbGljYSwgZmluYWwgUnVubmFibGUgcnVubmFibGUpCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVwbGljYSBwaWNrUmVwbGljYShFbmRwb2ludHNGb3JUb2tlbiB0YXJnZXRzKQorICAgIHsKKyAgICAgICAgRW5kcG9pbnRzRm9yVG9rZW4gaGVhbHRoeSA9IHRhcmdldHMuZmlsdGVyKHIgLT4gRHluYW1pY0VuZHBvaW50U25pdGNoLmdldFNldmVyaXR5KHIuZW5kcG9pbnQoKSkgPT0gMCk7CisgICAgICAgIEVuZHBvaW50c0ZvclRva2VuIHNlbGVjdCA9IGhlYWx0aHkuaXNFbXB0eSgpID8gdGFyZ2V0cyA6IGhlYWx0aHk7CisgICAgICAgIHJldHVybiBzZWxlY3QuZ2V0KFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKS5uZXh0SW50KDAsIHNlbGVjdC5zaXplKCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBlcmZvcm1Mb2NhbGx5KFN0YWdlIHN0YWdlLCBSZXBsaWNhIGxvY2FsUmVwbGljYSwgZmluYWwgUnVubmFibGUgcnVubmFibGUsIFN0cmluZyBkZXNjcmlwdGlvbikKICAgICB7CiAgICAgICAgIHN0YWdlLm1heWJlRXhlY3V0ZUltbWVkaWF0ZWx5KG5ldyBMb2NhbE11dGF0aW9uUnVubmFibGUobG9jYWxSZXBsaWNhKQogICAgICAgICB7CkBAIC0xNjA3LDYgKzE2NDcsMTIgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHJvdGVjdGVkIFZlcmIgdmVyYigpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFZlcmIuTVVUQVRJT05fUkVROwpAQCAtMTYxNCw3ICsxNjYwLDcgQEAKICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwZXJmb3JtTG9jYWxseShTdGFnZSBzdGFnZSwgUmVwbGljYSBsb2NhbFJlcGxpY2EsIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlLCBmaW5hbCBSZXF1ZXN0Q2FsbGJhY2s8Pz4gaGFuZGxlcikKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBlcmZvcm1Mb2NhbGx5KFN0YWdlIHN0YWdlLCBSZXBsaWNhIGxvY2FsUmVwbGljYSwgZmluYWwgUnVubmFibGUgcnVubmFibGUsIGZpbmFsIFJlcXVlc3RDYWxsYmFjazw/PiBoYW5kbGVyLCBPYmplY3QgZGVzY3JpcHRpb24pCiAgICAgewogICAgICAgICBzdGFnZS5tYXliZUV4ZWN1dGVJbW1lZGlhdGVseShuZXcgTG9jYWxNdXRhdGlvblJ1bm5hYmxlKGxvY2FsUmVwbGljYSkKICAgICAgICAgewpAQCAtMTYzNCw2ICsxNjgwLDE0IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRpb24gaXMgYW4gT2JqZWN0IGFuZCB0b1N0cmluZygpIGNhbGxlZCBzbyB3ZSBkbyBub3QgaGF2ZSB0byBldmFsdWF0ZSB0aGUgTXV0YXRpb24udG9TdHJpbmcoKQorICAgICAgICAgICAgICAgIC8vIHVubGVzcyBleHBsaWNsaXRseSBjaGVja2VkCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHJvdGVjdGVkIFZlcmIgdmVyYigpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFZlcmIuTVVUQVRJT05fUkVROwpAQCAtMTY3Myw4ICsxNzI3LDggQEAKICAgICAgICAgICAgIC8vIHdlIGJ1aWxkIHRoaXMgT05MWSB0byBwZXJmb3JtIHRoZSBzdWZmaWNpZW5jeSBjaGVjayB0aGF0IGhhcHBlbnMgb24gY29uc3RydWN0aW9uCiAgICAgICAgICAgICBSZXBsaWNhUGxhbnMuZm9yV3JpdGUoa2V5c3BhY2UsIGNtLmNvbnNpc3RlbmN5KCksIHRrLCBSZXBsaWNhUGxhbnMud3JpdGVBbGwpOwogCi0gICAgICAgICAgICAvLyBUaGlzIGhvc3QgaXNuJ3QgYSByZXBsaWNhLCBzbyBtYXJrIHRoZSByZXF1ZXN0IGFzIGJlaW5nIHJlbW90ZS4gSWYgdGhpcyBob3N0IGlzIGEgCi0gICAgICAgICAgICAvLyByZXBsaWNhLCBhcHBseUNvdW50ZXJNdXRhdGlvbk9uQ29vcmRpbmF0b3IoKSBpbiB0aGUgYnJhbmNoIGFib3ZlIHdpbGwgY2FsbCBwZXJmb3JtV3JpdGUoKSwgYW5kIAorICAgICAgICAgICAgLy8gVGhpcyBob3N0IGlzbid0IGEgcmVwbGljYSwgc28gbWFyayB0aGUgcmVxdWVzdCBhcyBiZWluZyByZW1vdGUuIElmIHRoaXMgaG9zdCBpcyBhCisgICAgICAgICAgICAvLyByZXBsaWNhLCBhcHBseUNvdW50ZXJNdXRhdGlvbk9uQ29vcmRpbmF0b3IoKSBpbiB0aGUgYnJhbmNoIGFib3ZlIHdpbGwgY2FsbCBwZXJmb3JtV3JpdGUoKSwgYW5kCiAgICAgICAgICAgICAvLyB0aGVyZSB3ZSdsbCBtYXJrIGEgbG9jYWwgcmVxdWVzdCBhZ2FpbnN0IHRoZSBtZXRyaWNzLgogICAgICAgICAgICAgd3JpdGVNZXRyaWNzLnJlbW90ZVJlcXVlc3RzLm1hcmsoKTsKIApAQCAtMTc5Miw3ICsxODQ2LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIFBhcnRpdGlvbkl0ZXJhdG9yIHJlYWQoU2luZ2xlUGFydGl0aW9uUmVhZENvbW1hbmQuR3JvdXAgZ3JvdXAsIENvbnNpc3RlbmN5TGV2ZWwgY29uc2lzdGVuY3lMZXZlbCwgbG9uZyBxdWVyeVN0YXJ0TmFub1RpbWUpCiAgICAgdGhyb3dzIFVuYXZhaWxhYmxlRXhjZXB0aW9uLCBJc0Jvb3RzdHJhcHBpbmdFeGNlcHRpb24sIFJlYWRGYWlsdXJlRXhjZXB0aW9uLCBSZWFkVGltZW91dEV4Y2VwdGlvbiwgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIGlmIChTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5pc0Jvb3RzdHJhcE1vZGUoKSAmJiAhc3lzdGVtS2V5c3BhY2VRdWVyeShncm91cC5xdWVyaWVzKSkKKyAgICAgICAgaWYgKCFpc1NhZmVUb1BlcmZvcm1SZWFkKGdyb3VwLnF1ZXJpZXMpKQogICAgICAgICB7CiAgICAgICAgICAgICByZWFkTWV0cmljcy51bmF2YWlsYWJsZXMubWFyaygpOwogICAgICAgICAgICAgcmVhZE1ldHJpY3NGb3JMZXZlbChjb25zaXN0ZW5jeUxldmVsKS51bmF2YWlsYWJsZXMubWFyaygpOwpAQCAtMTgxOSw2ICsxODczLDE2IEBACiAgICAgICAgICAgICAgOiByZWFkUmVndWxhcihncm91cCwgY29uc2lzdGVuY3lMZXZlbCwgcXVlcnlTdGFydE5hbm9UaW1lKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTYWZlVG9QZXJmb3JtUmVhZChMaXN0PFNpbmdsZVBhcnRpdGlvblJlYWRDb21tYW5kPiBxdWVyaWVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlzU2FmZVRvUGVyZm9ybVJlYWQoKSB8fCBzeXN0ZW1LZXlzcGFjZVF1ZXJ5KHF1ZXJpZXMpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NhZmVUb1BlcmZvcm1SZWFkKCkKKyAgICB7CisgICAgICAgIHJldHVybiAhU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaXNCb290c3RyYXBNb2RlKCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgUGFydGl0aW9uSXRlcmF0b3IgcmVhZFdpdGhQYXhvcyhTaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZC5Hcm91cCBncm91cCwgQ29uc2lzdGVuY3lMZXZlbCBjb25zaXN0ZW5jeUxldmVsLCBsb25nIHF1ZXJ5U3RhcnROYW5vVGltZSkKICAgICB0aHJvd3MgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24sIFVuYXZhaWxhYmxlRXhjZXB0aW9uLCBSZWFkRmFpbHVyZUV4Y2VwdGlvbiwgUmVhZFRpbWVvdXRFeGNlcHRpb24KICAgICB7CkBAIC0yMDg3LDcgKzIxNTEsNyBAQAogICAgICAgICByZXR1cm4gY29uY2F0QW5kQmxvY2tPblJlcGFpcihyZXN1bHRzLCByZXBhaXJzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExvY2FsUmVhZFJ1bm5hYmxlIGV4dGVuZHMgRHJvcHBhYmxlUnVubmFibGUKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExvY2FsUmVhZFJ1bm5hYmxlIGV4dGVuZHMgRHJvcHBhYmxlUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZURlYnVnZ2FibGVUYXNrCiAgICAgewogICAgICAgICBwcml2YXRlIGZpbmFsIFJlYWRDb21tYW5kIGNvbW1hbmQ7CiAgICAgICAgIHByaXZhdGUgZmluYWwgUmVhZENhbGxiYWNrIGhhbmRsZXI7CkBAIC0yMTI5LDYgKzIxOTMsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBjb21tYW5kLmNyZWF0ZUVtcHR5UmVzcG9uc2UoKTsKICAgICAgICAgICAgICAgICAgICAgcmVhZFJlamVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFF1ZXJ5Q2FuY2VsbGVkRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIlF1ZXJ5IGNhbmNlbGxlZCAodGltZW91dCkiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQgIWNvbW1hbmQuaXNDb21wbGV0ZWQoKSA6ICJMb2NhbCByZWFkIG1hcmtlZCBhcyBjb21wbGV0ZWQgZGVzcGl0ZSBiZWluZyBhYm9ydGVkIGJ5IHRpbWVvdXQgdG8gdGFibGUgIiArIGNvbW1hbmQubWV0YWRhdGEoKTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoY29tbWFuZC5jb21wbGV0ZSgpKQogICAgICAgICAgICAgICAgIHsKQEAgLTIxNTcsNiArMjIyNywyNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBjcmVhdGlvblRpbWVOYW5vcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhcHByb3hDcmVhdGlvblRpbWVOYW5vczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBzdGFydFRpbWVOYW5vcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhcHByb3hTdGFydFRpbWVOYW5vczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmQudG9DUUxTdHJpbmcoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgUGFydGl0aW9uSXRlcmF0b3IgZ2V0UmFuZ2VTbGljZShQYXJ0aXRpb25SYW5nZVJlYWRDb21tYW5kIGNvbW1hbmQsCkBAIC0yNDY3LDcgKzI1NTUsOSBAQAogICAgICAqLwogICAgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIERyb3BwYWJsZVJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUKICAgICB7Ci0gICAgICAgIGZpbmFsIGxvbmcgYXBwcm94Q3JlYXRpb25UaW1lTmFub3M7CisgICAgICAgIHByb3RlY3RlZCBmaW5hbCBsb25nIGFwcHJveENyZWF0aW9uVGltZU5hbm9zOworICAgICAgICBwcm90ZWN0ZWQgdm9sYXRpbGUgbG9uZyBhcHByb3hTdGFydFRpbWVOYW5vczsKKyAgICAgICAgCiAgICAgICAgIGZpbmFsIFZlcmIgdmVyYjsKIAogICAgICAgICBwdWJsaWMgRHJvcHBhYmxlUnVubmFibGUoVmVyYiB2ZXJiKQpAQCAtMjQ3OCwxMSArMjU2OCwxMSBAQAogCiAgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bigpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgYXBwcm94Q3VycmVudFRpbWVOYW5vcyA9IE1vbm90b25pY0Nsb2NrLkdsb2JhbC5hcHByb3hUaW1lLm5vdygpOworICAgICAgICAgICAgYXBwcm94U3RhcnRUaW1lTmFub3MgPSBNb25vdG9uaWNDbG9jay5HbG9iYWwuYXBwcm94VGltZS5ub3coKTsKICAgICAgICAgICAgIGxvbmcgZXhwaXJhdGlvblRpbWVOYW5vcyA9IHZlcmIuZXhwaXJlc0F0TmFub3MoYXBwcm94Q3JlYXRpb25UaW1lTmFub3MpOwotICAgICAgICAgICAgaWYgKGFwcHJveEN1cnJlbnRUaW1lTmFub3MgPiBleHBpcmF0aW9uVGltZU5hbm9zKQorICAgICAgICAgICAgaWYgKGFwcHJveFN0YXJ0VGltZU5hbm9zID4gZXhwaXJhdGlvblRpbWVOYW5vcykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIHRpbWVUYWtlbk5hbm9zID0gYXBwcm94Q3VycmVudFRpbWVOYW5vcyAtIGFwcHJveENyZWF0aW9uVGltZU5hbm9zOworICAgICAgICAgICAgICAgIGxvbmcgdGltZVRha2VuTmFub3MgPSBhcHByb3hTdGFydFRpbWVOYW5vcyAtIGFwcHJveENyZWF0aW9uVGltZU5hbm9zOwogICAgICAgICAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5tZXRyaWNzLnJlY29yZFNlbGZEcm9wcGVkTWVzc2FnZSh2ZXJiLCB0aW1lVGFrZW5OYW5vcywgTkFOT1NFQ09ORFMpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KQEAgLTI1MDMsOSArMjU5MywxMCBAQAogICAgICAqIExpa2UgRHJvcHBhYmxlUnVubmFibGUsIGJ1dCBpZiBpdCBhYm9ydHMsIGl0IHdpbGwgcmVydW4gKG9uIHRoZSBtdXRhdGlvbiBzdGFnZSkgYWZ0ZXIKICAgICAgKiBtYXJraW5nIGl0c2VsZiBhcyBhIGhpbnQgaW4gcHJvZ3Jlc3Mgc28gdGhhdCB0aGUgaGludCBiYWNrcHJlc3N1cmUgbWVjaGFuaXNtIGNhbiBmdW5jdGlvbi4KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBMb2NhbE11dGF0aW9uUnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZQorICAgIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIExvY2FsTXV0YXRpb25SdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlRGVidWdnYWJsZVRhc2sKICAgICB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBhcHByb3hDcmVhdGlvblRpbWVOYW5vcyA9IE1vbm90b25pY0Nsb2NrLkdsb2JhbC5hcHByb3hUaW1lLm5vdygpOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGxvbmcgYXBwcm94U3RhcnRUaW1lTmFub3M7CiAKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXBsaWNhIGxvY2FsUmVwbGljYTsKIApAQCAtMjUxNywxMSArMjYwOCwxMiBAQAogICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBydW4oKQogICAgICAgICB7CiAgICAgICAgICAgICBmaW5hbCBWZXJiIHZlcmIgPSB2ZXJiKCk7Ci0gICAgICAgICAgICBsb25nIG5vd05hbm9zID0gTW9ub3RvbmljQ2xvY2suR2xvYmFsLmFwcHJveFRpbWUubm93KCk7CisgICAgICAgICAgICBhcHByb3hTdGFydFRpbWVOYW5vcyA9IE1vbm90b25pY0Nsb2NrLkdsb2JhbC5hcHByb3hUaW1lLm5vdygpOwogICAgICAgICAgICAgbG9uZyBleHBpcmF0aW9uVGltZU5hbm9zID0gdmVyYi5leHBpcmVzQXROYW5vcyhhcHByb3hDcmVhdGlvblRpbWVOYW5vcyk7Ci0gICAgICAgICAgICBpZiAobm93TmFub3MgPiBleHBpcmF0aW9uVGltZU5hbm9zKQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYXBwcm94U3RhcnRUaW1lTmFub3MgPiBleHBpcmF0aW9uVGltZU5hbm9zKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgdGltZVRha2VuTmFub3MgPSBub3dOYW5vcyAtIGFwcHJveENyZWF0aW9uVGltZU5hbm9zOworICAgICAgICAgICAgICAgIGxvbmcgdGltZVRha2VuTmFub3MgPSBhcHByb3hTdGFydFRpbWVOYW5vcyAtIGFwcHJveENyZWF0aW9uVGltZU5hbm9zOwogICAgICAgICAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5tZXRyaWNzLnJlY29yZFNlbGZEcm9wcGVkTWVzc2FnZShWZXJiLk1VVEFUSU9OX1JFUSwgdGltZVRha2VuTmFub3MsIE5BTk9TRUNPTkRTKTsKIAogICAgICAgICAgICAgICAgIEhpbnRSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBIaW50UnVubmFibGUoRW5kcG9pbnRzRm9yVG9rZW4ub2YobG9jYWxSZXBsaWNhLnJhbmdlKCkucmlnaHQsIGxvY2FsUmVwbGljYSkpCkBAIC0yNTQ1LDE0ICsyNjM3LDM0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgY3JlYXRpb25UaW1lTmFub3MoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXBwcm94Q3JlYXRpb25UaW1lTmFub3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgc3RhcnRUaW1lTmFub3MoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYXBwcm94U3RhcnRUaW1lTmFub3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgYWJzdHJhY3QgcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpOworCiAgICAgICAgIGFic3RyYWN0IHByb3RlY3RlZCBWZXJiIHZlcmIoKTsKICAgICAgICAgYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgcnVuTWF5VGhyb3coKSB0aHJvd3MgRXhjZXB0aW9uOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2dSZXF1ZXN0RXhjZXB0aW9uKEV4Y2VwdGlvbiBleGNlcHRpb24sIENvbGxlY3Rpb248PyBleHRlbmRzIFJlYWRDb21tYW5kPiBjb21tYW5kcykKICAgICB7CisgICAgICAgIC8vIE11bHRpcGxlIGRpZmZlcmVudCB0eXBlcyBvZiBlcnJvcnMgY2FuIGhhcHBlbiwgc28gYnkgZGVkdXBwaW5nIG9uIHRoZSBlcnJvciB0eXBlIHdlIGNhbiBzZWUgZWFjaCBlcnJvcgorICAgICAgICAvLyBjYXNlIHJhdGhlciB0aGFuIGp1c3QgZXhwb3NpbmcgdGhlIGZpcnN0IGVycm9yIHNlZW47IHRoaXMgc2hvdWxkIG1ha2Ugc3VyZSBtb3JlIHJhcmUgaXNzdWVzIGFyZSBleHBvc2VkCisgICAgICAgIC8vIHJhdGhlciB0aGFuIGJlaW5nIGhpZGRlbiBieSBtb3JlIGNvbW1vbiBlcnJvcnMgc3VjaCBhcyB0aW1lb3V0IG9yIHVuYXZhaWxhYmxlCisgICAgICAgIC8vIHNlZSBDQVNTQU5EUkEtMTc3NTQKKyAgICAgICAgU3RyaW5nIG1zZyA9IGV4Y2VwdGlvbi5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIgXCJ7fVwiIHdoaWxlIGV4ZWN1dGluZyB7fSI7CiAgICAgICAgIE5vU3BhbUxvZ2dlci5sb2cobG9nZ2VyLCBOb1NwYW1Mb2dnZXIuTGV2ZWwuSU5GTywgRkFJTFVSRV9MT0dHSU5HX0lOVEVSVkFMX1NFQ09ORFMsIFRpbWVVbml0LlNFQ09ORFMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIlwie31cIiB3aGlsZSBleGVjdXRpbmcge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBuZXcgT2JqZWN0W10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksCkBAIC0zMDg0LDQgKzMxOTYsNDAgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBQYXhvc1N0YXRlLmdldERpc2FibGVDb29yZGluYXRvckxvY2tpbmcoKTsKICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXREdW1wSGVhcE9uVW5jYXVnaHRFeGNlcHRpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXREdW1wSGVhcE9uVW5jYXVnaHRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXREdW1wSGVhcE9uVW5jYXVnaHRFeGNlcHRpb24oYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldER1bXBIZWFwT25VbmNhdWdodEV4Y2VwdGlvbihlbmFibGVkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTU3RhYmxlUmVhZFJhdGVQZXJzaXN0ZW5jZUVuYWJsZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU3RhYmxlUmVhZFJhdGVQZXJzaXN0ZW5jZUVuYWJsZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTU3RhYmxlUmVhZFJhdGVQZXJzaXN0ZW5jZUVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFNTdGFibGVSZWFkUmF0ZVBlcnNpc3RlbmNlRW5hYmxlZChlbmFibGVkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3NFbmFibGVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q2xpZW50UmVxdWVzdFNpemVNZXRyaWNzRW5hYmxlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldENsaWVudFJlcXVlc3RTaXplTWV0cmljc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENsaWVudFJlcXVlc3RTaXplTWV0cmljc0VuYWJsZWQoZW5hYmxlZCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlUHJveHlNQmVhbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlUHJveHlNQmVhbi5qYXZhCmluZGV4IDU0NjE0M2QuLjRiYTQxZDYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVByb3h5TUJlYW4uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VQcm94eU1CZWFuLmphdmEKQEAgLTEzNSw0ICsxMzUsMTMgQEAKIAogICAgIHZvaWQgc2V0UGF4b3NDb29yZGluYXRvckxvY2tpbmdEaXNhYmxlZChib29sZWFuIGRpc2FibGVkKTsKICAgICBib29sZWFuIGdldFBheG9zQ29vcmRpbmF0b3JMb2NraW5nRGlzYWJsZWQoKTsKKworICAgIHB1YmxpYyBib29sZWFuIGdldER1bXBIZWFwT25VbmNhdWdodEV4Y2VwdGlvbigpOworICAgIHB1YmxpYyB2b2lkIHNldER1bXBIZWFwT25VbmNhdWdodEV4Y2VwdGlvbihib29sZWFuIGVuYWJsZWQpOworCisgICAgYm9vbGVhbiBnZXRTU3RhYmxlUmVhZFJhdGVQZXJzaXN0ZW5jZUVuYWJsZWQoKTsKKyAgICB2b2lkIHNldFNTdGFibGVSZWFkUmF0ZVBlcnNpc3RlbmNlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpOworCisgICAgYm9vbGVhbiBnZXRDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3NFbmFibGVkKCk7CisgICAgdm9pZCBzZXRDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3NFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlLmphdmEKaW5kZXggZWQxMGYwNC4uMWQ0YTBiMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVNlcnZpY2UuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2U7CiAKLQogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0Vycm9yOwpAQCAtMjcsMTEgKzI2LDEzIEBACiBpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKK2ltcG9ydCBqYXZhLnRpbWUuZm9ybWF0LkRhdGVUaW1lUGFyc2VFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CkBAIC02MSw3ICs2MiwxMCBAQAogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtU3VwcG9ydDsKIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTGlzdGVuZXJOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkJyb2FkY2FzdGVyU3VwcG9ydDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkZpbHRlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk5vdGlmaWNhdGlvbkxpc3RlbmVyOwogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGE7CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uT3BlbkRhdGFFeGNlcHRpb247CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uVGFidWxhckRhdGE7CkBAIC0xMTYsNyArMTIwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TeXN0ZW1LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5WZXJpZmllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuVmlydHVhbEtleXNwYWNlUmVnaXN0cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJvb3RTdHJhcHBlcjsKQEAgLTE0Miw5ICsxNDYsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXMuVG9rZW5TZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5WZXJzaW9uZWRWYWx1ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oaW50cy5IaW50c1NlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU2NydWJiZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JVmVyaWZpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbkFuZFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5QYXRoVXRpbHM7CkBAIC0xNjUsNiArMTcwLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlJlcGxpY2FzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU3lzdGVtUmVwbGljYXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5Ub2tlbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuU2FtcGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlNhbXBsaW5nTWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0b3JhZ2VNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5Bc3luY09uZVJlc3BvbnNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdlOwpAQCAtMjAwLDYgKzIwNyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhY2luZy5UcmFjZUtleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5DbGllbnRSZXNvdXJjZUxpbWl0czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkV4ZWN1dG9yVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOwpAQCAtMjIwLDYgKzIyOCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMucHJvZ3Jlc3Muam14LkpNWEJyb2FkY2FzdEV4ZWN1dG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnByb2dyZXNzLmpteC5KTVhQcm9ncmVzc1N1cHBvcnQ7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLnRyYW5zZm9ybTsKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXMudHJ5RmluZDsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLkFycmF5cy5hc0xpc3Q7CkBAIC0yMzAsMTAgKzIzOSwyNCBAQAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5TRUNPTkRTOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9MaXN0OwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9NYXA7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQUxMT1dfVU5TQUZFX0pPSU47CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQUxMT1dfVU5TQUZFX1JFUExBQ0U7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQk9PVFNUUkFQX1NDSEVNQV9ERUxBWV9NUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5CT09UU1RSQVBfU0tJUF9TQ0hFTUFfQ0hFQ0s7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09OU0lTVEVOVF9SQU5HRV9NT1ZFTUVOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT05TSVNURU5UX1NJTVVMVEFORU9VU19NT1ZFU19BTExPVzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5EUkFJTl9FWEVDVVRPUl9USU1FT1VUX01TOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpPSU5fUklORzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5MT0FEX1JJTkdfU1RBVEU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuT1ZFUlJJREVfREVDT01NSVNTSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBWE9TX1JFUEFJUl9PTl9UT1BPTE9HWV9DSEFOR0VfUkVUUklFUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5QQVhPU19SRVBBSVJfT05fVE9QT0xPR1lfQ0hBTkdFX1JFVFJZX0RFTEFZX1NFQ09ORFM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUkVQTEFDRU1FTlRfQUxMT1dfRU1QVFk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUkVQTEFDRV9BRERSRVNTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFUExBQ0VfQUREUkVTU19GSVJTVF9CT09UOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFU0VUX0JPT1RTVFJBUF9QUk9HUkVTUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVEFSVF9HT1NTSVA7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9XUklURV9TVVJWRVk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LlNlY29uZGFyeUluZGV4TWFuYWdlci5nZXRJbmRleE5hbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LlNlY29uZGFyeUluZGV4TWFuYWdlci5pc0luZGV4Q29sdW1uRmFtaWx5OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTm9QYXlsb2FkLm5vUGF5bG9hZDsKQEAgLTMwMSwxMCArMzI0LDE1IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJ1bm5hYmxlPiBwcmVTaHV0ZG93bkhvb2tzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJ1bm5hYmxlPiBwb3N0U2h1dGRvd25Ib29rcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCi0gICAgcHJpdmF0ZSBmaW5hbCBTbmFwc2hvdE1hbmFnZXIgc25hcHNob3RNYW5hZ2VyID0gbmV3IFNuYXBzaG90TWFuYWdlcigpOworICAgIHB1YmxpYyBmaW5hbCBTbmFwc2hvdE1hbmFnZXIgc25hcHNob3RNYW5hZ2VyID0gbmV3IFNuYXBzaG90TWFuYWdlcigpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdG9yYWdlU2VydmljZSBpbnN0YW5jZSA9IG5ldyBTdG9yYWdlU2VydmljZSgpOwogCisgICAgcHJpdmF0ZSBmaW5hbCBTYW1wbGluZ01hbmFnZXIgc2FtcGxpbmdNYW5hZ2VyID0gbmV3IFNhbXBsaW5nTWFuYWdlcigpOworCisgICAgQFZpc2libGVGb3JUZXN0aW5nIC8vIHRoaXMgaXMgdXNlZCBmb3IgZHRlc3RzIG9ubHksIHNlZSBDQVNTQU5EUkEtMTgxNTIKKyAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBza2lwTm90aWZpY2F0aW9uTGlzdGVuZXJzID0gZmFsc2U7CisKICAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBib29sZWFuIGlzSW5TaHV0ZG93bkhvb2soKQogICAgIHsKQEAgLTM3Miw4ICs0MDAsNyBAQAogICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBpc0Jvb3RzdHJhcE1vZGU7CiAKICAgICAvKiB3ZSBib290c3RyYXAgYnV0IGRvIE5PVCBqb2luIHRoZSByaW5nIHVubGVzcyB0b2xkIHRvIGRvIHNvICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3VydmV5TW9kZSA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eQotICAgICAgICAgICAgKCJjYXNzYW5kcmEud3JpdGVfc3VydmV5IiwgImZhbHNlIikpOworICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1cnZleU1vZGUgPSBURVNUX1dSSVRFX1NVUlZFWS5nZXRCb29sZWFuKGZhbHNlKTsKICAgICAvKiB0cnVlIGlmIG5vZGUgaXMgcmVidWlsZGluZyBhbmQgcmVjZWl2aW5nIGRhdGEgKi8KICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gaXNSZWJ1aWxkaW5nID0gbmV3IEF0b21pY0Jvb2xlYW4oKTsKICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gaXNEZWNvbW1pc3Npb25pbmcgPSBuZXcgQXRvbWljQm9vbGVhbigpOwpAQCAtMzg3LDcgKzQxNCw3IEBACiAgICAgLyogdGhlIHByb2JhYmlsaXR5IGZvciB0cmFjaW5nIGFueSBwYXJ0aWN1bGFyIHJlcXVlc3QsIDAgZGlzYWJsZXMgdHJhY2luZyBhbmQgMSBlbmFibGVzIGZvciBhbGwgKi8KICAgICBwcml2YXRlIGRvdWJsZSB0cmFjZVByb2JhYmlsaXR5ID0gMC4wOwogCi0gICAgcHJpdmF0ZSBlbnVtIE1vZGUgeyBTVEFSVElORywgTk9STUFMLCBKT0lOSU5HLCBMRUFWSU5HLCBERUNPTU1JU1NJT05FRCwgTU9WSU5HLCBEUkFJTklORywgRFJBSU5FRCB9CisgICAgcHVibGljIGVudW0gTW9kZSB7IFNUQVJUSU5HLCBOT1JNQUwsIEpPSU5JTkcsIExFQVZJTkcsIERFQ09NTUlTU0lPTkVELCBNT1ZJTkcsIERSQUlOSU5HLCBEUkFJTkVEIH0KICAgICBwcml2YXRlIHZvbGF0aWxlIE1vZGUgb3BlcmF0aW9uTW9kZSA9IE1vZGUuU1RBUlRJTkc7CiAKICAgICAvKiBVc2VkIGZvciB0cmFja2luZyBkcmFpbiBwcm9ncmVzcyAqLwpAQCAtNDAyLDkgKzQyOSw5IEBACiAgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFRva2VuPiBib290c3RyYXBUb2tlbnMgPSBudWxsOwogCiAgICAgLy8gdHJ1ZSB3aGVuIGtlZXBpbmcgc3RyaWN0IGNvbnNpc3RlbmN5IHdoaWxlIGJvb3RzdHJhcHBpbmcKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNlU3RyaWN0Q29uc2lzdGVuY3kgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25zaXN0ZW50LnJhbmdlbW92ZW1lbnQiLCAidHJ1ZSIpKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGFsbG93U2ltdWx0YW5lb3VzTW92ZXMgPSBCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25zaXN0ZW50LnNpbXVsdGFuZW91c21vdmVzLmFsbG93IiwiZmFsc2UiKSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBqb2luUmluZyA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmpvaW5fcmluZyIsICJ0cnVlIikpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VTdHJpY3RDb25zaXN0ZW5jeSA9IENPTlNJU1RFTlRfUkFOR0VfTU9WRU1FTlQuZ2V0Qm9vbGVhbigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gYWxsb3dTaW11bHRhbmVvdXNNb3ZlcyA9IENPTlNJU1RFTlRfU0lNVUxUQU5FT1VTX01PVkVTX0FMTE9XLmdldEJvb2xlYW4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGpvaW5SaW5nID0gSk9JTl9SSU5HLmdldEJvb2xlYW4oKTsKICAgICBwcml2YXRlIGJvb2xlYW4gcmVwbGFjaW5nOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJlYW1TdGF0ZVN0b3JlIHN0cmVhbVN0YXRlU3RvcmUgPSBuZXcgU3RyZWFtU3RhdGVTdG9yZSgpOwpAQCAtNDUyLDEwICs0NzksMTQgQEAKICAgICAgICAgc3VwZXIoSk1YQnJvYWRjYXN0RXhlY3V0b3IuZXhlY3V0b3IpOwogCiAgICAgICAgIGpteE9iamVjdE5hbWUgPSAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI6dHlwZT1TdG9yYWdlU2VydmljZSI7CisKKyAgICAgICAgc3N0YWJsZXNUcmFja2VyID0gbmV3IFNTVGFibGVzR2xvYmFsVHJhY2tlcihEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3Rlck1CZWFucygpCisgICAgewogICAgICAgICBNQmVhbldyYXBwZXIuaW5zdGFuY2UucmVnaXN0ZXJNQmVhbih0aGlzLCBqbXhPYmplY3ROYW1lKTsKICAgICAgICAgTUJlYW5XcmFwcGVyLmluc3RhbmNlLnJlZ2lzdGVyTUJlYW4oU3RyZWFtTWFuYWdlci5pbnN0YW5jZSwgU3RyZWFtTWFuYWdlci5PQkpFQ1RfTkFNRSk7Ci0KLSAgICAgICAgc3N0YWJsZXNUcmFja2VyID0gbmV3IFNTVGFibGVzR2xvYmFsVHJhY2tlcihTU1RhYmxlRm9ybWF0LlR5cGUuY3VycmVudCgpKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZWdpc3RlckRhZW1vbihDYXNzYW5kcmFEYWVtb24gZGFlbW9uKQpAQCAtNjQzLDExICs2NzQsMTEgQEAKICAgICAgICAgaWYgKCFqb2luUmluZykKICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IGJvdGggam9pbl9yaW5nPWZhbHNlIGFuZCBhdHRlbXB0IHRvIHJlcGxhY2UgYSBub2RlIik7CiAKLSAgICAgICAgaWYgKCFzaG91bGRCb290c3RyYXAoKSAmJiAhQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEuYWxsb3dfdW5zYWZlX3JlcGxhY2UiKSkKKyAgICAgICAgaWYgKCFzaG91bGRCb290c3RyYXAoKSAmJiAhQUxMT1dfVU5TQUZFX1JFUExBQ0UuZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlcGxhY2luZyBhIG5vZGUgd2l0aG91dCBib290c3RyYXBwaW5nIHJpc2tzIGludmFsaWRhdGluZyBjb25zaXN0ZW5jeSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJndWFyYW50ZWVzIGFzIHRoZSBleHBlY3RlZCBkYXRhIG1heSBub3QgYmUgcHJlc2VudCB1bnRpbCByZXBhaXIgaXMgcnVuLiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUbyBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLCBwbGVhc2UgcmVzdGFydCB3aXRoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1EY2Fzc2FuZHJhLmFsbG93X3Vuc2FmZV9yZXBsYWNlPXRydWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItRCIgKyBBTExPV19VTlNBRkVfUkVQTEFDRS5nZXRLZXkoKSArICI9dHJ1ZSIpOwogCiAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCByZXBsYWNlQWRkcmVzcyA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRSZXBsYWNlQWRkcmVzcygpOwogICAgICAgICBsb2dnZXIuaW5mbygiR2F0aGVyaW5nIG5vZGUgcmVwbGFjZW1lbnQgaW5mb3JtYXRpb24gZm9yIHt9IiwgcmVwbGFjZUFkZHJlc3MpOwpAQCAtNzYzLDkgKzc5NCw5IEBACiAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2hlY2tGb3JFbmRwb2ludENvbGxpc2lvbihVVUlEIGxvY2FsSG9zdElkLCBTZXQ8SW5ldEFkZHJlc3NBbmRQb3J0PiBwZWVycykgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5hbGxvd191bnNhZmVfam9pbiIpKQorICAgICAgICBpZiAoQUxMT1dfVU5TQUZFX0pPSU4uZ2V0Qm9vbGVhbigpKQogICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIud2FybigiU2tpcHBpbmcgZW5kcG9pbnQgY29sbGlzaW9uIGNoZWNrIGFzIGNhc3NhbmRyYS5hbGxvd191bnNhZmVfam9pbj10cnVlIik7CisgICAgICAgICAgICBsb2dnZXIud2FybigiU2tpcHBpbmcgZW5kcG9pbnQgY29sbGlzaW9uIGNoZWNrIGFzICIgKyBBTExPV19VTlNBRkVfSk9JTi5nZXRLZXkoKSArICI9dHJ1ZSIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKQEAgLTc4Miw4ICs4MTMsOCBAQAogICAgICAgICBpZiAoIUdvc3NpcGVyLmluc3RhbmNlLmlzU2FmZUZvclN0YXJ0dXAoRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSwgbG9jYWxIb3N0SWQsIHNob3VsZEJvb3RzdHJhcCgpLCBlcFN0YXRlcykpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIkEgbm9kZSB3aXRoIGFkZHJlc3MgJXMgYWxyZWFkeSBleGlzdHMsIGNhbmNlbGxpbmcgam9pbi4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgY2Fzc2FuZHJhLnJlcGxhY2VfYWRkcmVzcyBpZiB5b3Ugd2FudCB0byByZXBsYWNlIHRoaXMgbm9kZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgJXMgaWYgeW91IHdhbnQgdG8gcmVwbGFjZSB0aGlzIG5vZGUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSwgUkVQTEFDRV9BRERSRVNTLmdldEtleSgpKSk7CiAgICAgICAgIH0KIAogICAgICAgICB2YWxpZGF0ZUVuZHBvaW50U25pdGNoKGVwU3RhdGVzLnZhbHVlcygpLml0ZXJhdG9yKCkpOwpAQCAtODA2LDcgKzgzNyw3IEBACiAgICAgICAgICAgICAgICAgYXNzZXJ0IChwaWVjZXMubGVuZ3RoID4gMCk7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXRlID0gcGllY2VzWzBdOwogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5lcXVhbHMoVmVyc2lvbmVkVmFsdWUuU1RBVFVTX0JPT1RTVFJBUFBJTkcpIHx8IHN0YXRlLmVxdWFscyhWZXJzaW9uZWRWYWx1ZS5TVEFUVVNfTEVBVklORykgfHwgc3RhdGUuZXF1YWxzKFZlcnNpb25lZFZhbHVlLlNUQVRVU19NT1ZJTkcpKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk90aGVyIGJvb3RzdHJhcHBpbmcvbGVhdmluZy9tb3Zpbmcgbm9kZXMgZGV0ZWN0ZWQsIGNhbm5vdCBib290c3RyYXAgd2hpbGUgY2Fzc2FuZHJhLmNvbnNpc3RlbnQucmFuZ2Vtb3ZlbWVudCBpcyB0cnVlIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiT3RoZXIgYm9vdHN0cmFwcGluZy9sZWF2aW5nL21vdmluZyBub2RlcyBkZXRlY3RlZCwgY2Fubm90IGJvb3RzdHJhcCB3aGlsZSAiICsgQ09OU0lTVEVOVF9SQU5HRV9NT1ZFTUVOVC5nZXRLZXkoKSArICIgaXMgdHJ1ZSIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtODYyLDYgKzg5Myw3IEBACiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluaXRTZXJ2ZXIoaW50IHNjaGVtYVRpbWVvdXRNaWxsaXMsIGludCByaW5nVGltZW91dE1pbGxpcykgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGxvZ2dlci5pbmZvKCJDYXNzYW5kcmEgdmVyc2lvbjoge30iLCBGQlV0aWxpdGllcy5nZXRSZWxlYXNlVmVyc2lvblN0cmluZygpKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIkdpdCBTSEE6IHt9IiwgRkJVdGlsaXRpZXMuZ2V0R2l0U0hBKCkpOwogICAgICAgICBsb2dnZXIuaW5mbygiQ1FMIHZlcnNpb246IHt9IiwgUXVlcnlQcm9jZXNzb3IuQ1FMX1ZFUlNJT04pOwogICAgICAgICBsb2dnZXIuaW5mbygiTmF0aXZlIHByb3RvY29sIHN1cHBvcnRlZCB2ZXJzaW9uczoge30gKGRlZmF1bHQ6IHt9KSIsCiAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1V0aWxzLmpvaW4oUHJvdG9jb2xWZXJzaW9uLnN1cHBvcnRlZFZlcnNpb25zKCksICIsICIpLCBQcm90b2NvbFZlcnNpb24uQ1VSUkVOVCk7CkBAIC04NzEsMTQgKzkwMywxNCBAQAogICAgICAgICAgICAgLy8gRW5zdXJlIFN0b3JhZ2VQcm94eSBpcyBpbml0aWFsaXplZCBvbiBzdGFydC11cDsgc2VlIENBU1NBTkRSQS0zNzk3LgogICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlUHJveHkiKTsKICAgICAgICAgICAgIC8vIGFsc28gSW5kZXhTdW1tYXJ5TWFuYWdlciwgd2hpY2ggaXMgb3RoZXJ3aXNlIHVucmVmZXJlbmNlZAotICAgICAgICAgICAgQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleFN1bW1hcnlNYW5hZ2VyIik7CisgICAgICAgICAgICBDbGFzcy5mb3JOYW1lKCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlNYW5hZ2VyIik7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmxvYWRfcmluZ19zdGF0ZSIsICJ0cnVlIikpKQorICAgICAgICBpZiAoTE9BRF9SSU5HX1NUQVRFLmdldEJvb2xlYW4oKSkKICAgICAgICAgewogICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkxvYWRpbmcgcGVyc2lzdGVkIHJpbmcgc3RhdGUiKTsKICAgICAgICAgICAgIHBvcHVsYXRlUGVlclRva2VuTWV0YWRhdGEoKTsKQEAgLTkxMSwxMCArOTQzLDEwIEBACiAKICAgICAgICAgcmVwbGFjaW5nID0gaXNSZXBsYWNpbmcoKTsKIAotICAgICAgICBpZiAoIUJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN0YXJ0X2dvc3NpcCIsICJ0cnVlIikpKQorICAgICAgICBpZiAoIVNUQVJUX0dPU1NJUC5nZXRCb29sZWFuKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJOb3Qgc3RhcnRpbmcgZ29zc2lwIGFzIHJlcXVlc3RlZC4iKTsKLSAgICAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGNvbXBsZXRlSW5pdGlhbGl6YXRpb24oKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCkBAIC05NTIsMTIgKzk4NCwxOSBAQAogICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk5vdCBqb2luaW5nIHJpbmcgYXMgcmVxdWVzdGVkLiBVc2UgSk1YIChTdG9yYWdlU2VydmljZS0+am9pblJpbmcoKSkgdG8gaW5pdGlhdGUgcmluZyBqb2luaW5nIik7CiAgICAgICAgIH0KIAorICAgICAgICBjb21wbGV0ZUluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbXBsZXRlSW5pdGlhbGl6YXRpb24oKQorICAgIHsKKyAgICAgICAgaWYgKCFpbml0aWFsaXplZCkKKyAgICAgICAgICAgIHJlZ2lzdGVyTUJlYW5zKCk7CiAgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZVRva2VuTWV0YWRhdGEoKQogICAgIHsKLSAgICAgICAgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmxvYWRfcmluZ19zdGF0ZSIsICJ0cnVlIikpKQorICAgICAgICBpZiAoTE9BRF9SSU5HX1NUQVRFLmdldEJvb2xlYW4oKSkKICAgICAgICAgewogICAgICAgICAgICAgcG9wdWxhdGVQZWVyVG9rZW5NZXRhZGF0YSgpOwogICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBub3QgY29tcGxldGVkIGJvb3RzdHJhcHBpbmcsIHdlIHNob3VsZCBub3QgYWRkIG91cnNlbHZlcyBhcyBhIG5vcm1hbCB0b2tlbgpAQCAtOTk0LDkgKzEwMzMsOSBAQAogICAgICAgICBpZiAocmVwbGFjaW5nKQogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnJlcGxhY2VfYWRkcmVzc19maXJzdF9ib290IiwgbnVsbCkgIT0gbnVsbCAmJiBTeXN0ZW1LZXlzcGFjZS5ib290c3RyYXBDb21wbGV0ZSgpKQorICAgICAgICBpZiAoUkVQTEFDRV9BRERSRVNTX0ZJUlNUX0JPT1QuZ2V0U3RyaW5nKCkgIT0gbnVsbCAmJiBTeXN0ZW1LZXlzcGFjZS5ib290c3RyYXBDb21wbGV0ZSgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygiUmVwbGFjZSBhZGRyZXNzIG9uIGZpcnN0IGJvb3QgcmVxdWVzdGVkOyB0aGlzIG5vZGUgaXMgYWxyZWFkeSBib290c3RyYXBwZWQiKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJSZXBsYWNlIGFkZHJlc3Mgb24gdGhlIGZpcnN0IGJvb3QgcmVxdWVzdGVkOyB0aGlzIG5vZGUgaXMgYWxyZWFkeSBib290c3RyYXBwZWQiKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCkBAIC0xMDMyLDE3ICsxMDcxLDIwIEBACiAKICAgICAgICAgICAgIGlmIChTeXN0ZW1LZXlzcGFjZS53YXNEZWNvbW1pc3Npb25lZCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5vdmVycmlkZV9kZWNvbW1pc3Npb24iKSkKKyAgICAgICAgICAgICAgICBpZiAoT1ZFUlJJREVfREVDT01NSVNTSU9OLmdldEJvb2xlYW4oKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJUaGlzIG5vZGUgd2FzIGRlY29tbWlzc2lvbmVkLCBidXQgb3ZlcnJpZGluZyBieSBvcGVyYXRvciByZXF1ZXN0LiIpOwogICAgICAgICAgICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5zZXRCb290c3RyYXBTdGF0ZShTeXN0ZW1LZXlzcGFjZS5Cb290c3RyYXBTdGF0ZS5DT01QTEVURUQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJUaGlzIG5vZGUgd2FzIGRlY29tbWlzc2lvbmVkIGFuZCB3aWxsIG5vdCByZWpvaW4gdGhlIHJpbmcgdW5sZXNzIGNhc3NhbmRyYS5vdmVycmlkZV9kZWNvbW1pc3Npb249dHJ1ZSBoYXMgYmVlbiBzZXQsIG9yIGFsbCBleGlzdGluZyBkYXRhIGlzIHJlbW92ZWQgYW5kIHRoZSBub2RlIGlzIGJvb3RzdHJhcHBlZCBhZ2FpbiIpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FeGNlcHRpb24oIlRoaXMgbm9kZSB3YXMgZGVjb21taXNzaW9uZWQgYW5kIHdpbGwgbm90IHJlam9pbiB0aGUgcmluZyB1bmxlc3MgLUQiICsgT1ZFUlJJREVfREVDT01NSVNTSU9OLmdldEtleSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj10cnVlIGhhcyBiZWVuIHNldCwgb3IgYWxsIGV4aXN0aW5nIGRhdGEgaXMgcmVtb3ZlZCBhbmQgdGhlIG5vZGUgaXMgYm9vdHN0cmFwcGVkIGFnYWluIik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJlcGxhY2VUb2tlbnMoKS5zaXplKCkgPiAwIHx8IERhdGFiYXNlRGVzY3JpcHRvci5nZXRSZXBsYWNlTm9kZSgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlcGxhY2UgbWV0aG9kIHJlbW92ZWQ7IHVzZSBjYXNzYW5kcmEucmVwbGFjZV9hZGRyZXNzIGluc3RlYWQiKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUmVwbGFjZSBtZXRob2QgcmVtb3ZlZDsgdXNlICIgKyBSRVBMQUNFX0FERFJFU1MuZ2V0S2V5KCkgKyAiIHN5c3RlbSBwcm9wZXJ0eSBpbnN0ZWFkLiIpOwogCiAgICAgICAgICAgICBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCkubGlzdGVuKCk7CiAKQEAgLTExMDUsNyArMTE0Nyw3IEBACiAgICAgICAgICAgICAgICAgaWYgKCEobm90aWZpY2F0aW9uIGluc3RhbmNlb2YgU1NUYWJsZXNWZXJzaW9uc0luVXNlQ2hhbmdlTm90aWZpY2F0aW9uKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgICAgICAgICAgU2V0PFZlcnNpb25BbmRUeXBlPiB2ZXJzaW9ucyA9ICgoU1NUYWJsZXNWZXJzaW9uc0luVXNlQ2hhbmdlTm90aWZpY2F0aW9uKW5vdGlmaWNhdGlvbikudmVyc2lvbnNJblVzZTsKKyAgICAgICAgICAgICAgICBTZXQ8VmVyc2lvbj4gdmVyc2lvbnMgPSAoKFNTVGFibGVzVmVyc2lvbnNJblVzZUNoYW5nZU5vdGlmaWNhdGlvbilub3RpZmljYXRpb24pLnZlcnNpb25zSW5Vc2U7CiAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJVcGRhdGluZyBsb2NhbCBzc3RhYmxlcyB2ZXJzaW9uIGluIEdvc3NpcCB0byB7fSIsIHZlcnNpb25zKTsKIAogICAgICAgICAgICAgICAgIEdvc3NpcGVyLmluc3RhbmNlLmFkZExvY2FsQXBwbGljYXRpb25TdGF0ZShBcHBsaWNhdGlvblN0YXRlLlNTVEFCTEVfVkVSU0lPTlMsCkBAIC0xMzIzLDYgKzEzNjUsNyBAQAogCiAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Um9sZU1hbmFnZXIoKS5zZXR1cCgpOwogICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEF1dGhlbnRpY2F0b3IoKS5zZXR1cCgpOworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEludGVybm9kZUF1dGhlbnRpY2F0b3IoKS5zZXR1cEludGVybm9kZSgpOwogICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEF1dGhvcml6ZXIoKS5zZXR1cCgpOwogICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldE5ldHdvcmtBdXRob3JpemVyKCkuc2V0dXAoKTsKICAgICAgICAgICAgIEF1dGhDYWNoZVNlcnZpY2UuaW5pdGlhbGl6ZUFuZFJlZ2lzdGVyQ2FjaGVzKCk7CkBAIC0xMzU4LDExICsxNDAxLDE2IEBACiAKICAgICBwdWJsaWMgdm9pZCByZWJ1aWxkKFN0cmluZyBzb3VyY2VEYykKICAgICB7Ci0gICAgICAgIHJlYnVpbGQoc291cmNlRGMsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICByZWJ1aWxkKHNvdXJjZURjLCBudWxsLCBudWxsLCBudWxsLCBmYWxzZSk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcmVidWlsZChTdHJpbmcgc291cmNlRGMsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRva2VucywgU3RyaW5nIHNwZWNpZmljU291cmNlcykKICAgICB7CisgICAgICAgIHJlYnVpbGQoc291cmNlRGMsIGtleXNwYWNlLCB0b2tlbnMsIHNwZWNpZmljU291cmNlcywgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYnVpbGQoU3RyaW5nIHNvdXJjZURjLCBTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0b2tlbnMsIFN0cmluZyBzcGVjaWZpY1NvdXJjZXMsIGJvb2xlYW4gZXhjbHVkZUxvY2FsRGF0YWNlbnRlck5vZGVzKQorICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIGNoZWNrIG9uZ29pbmcgcmVidWlsZApAQCAtMTM3MSw2ICsxNDE5LDEyIEBACiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm9kZSBpcyBzdGlsbCByZWJ1aWxkaW5nLiBDaGVjayBub2RldG9vbCBuZXRzdGF0cy4iKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLy8gZmFpbCBpZiBzb3VyY2UgREMgaXMgbG9jYWwgYW5kIC0tZXhjbHVkZS1sb2NhbC1kYyBpcyBzZXQKKyAgICAgICAgICAgIGlmIChzb3VyY2VEYyAhPSBudWxsICYmIHNvdXJjZURjLmVxdWFscyhEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TG9jYWxEYXRhQ2VudGVyKCkpICYmIGV4Y2x1ZGVMb2NhbERhdGFjZW50ZXJOb2RlcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc2V0IHNvdXJjZSBkYXRhIGNlbnRlciB0byBiZSBsb2NhbCBkYXRhIGNlbnRlciwgd2hlbiBleGNsdWRlTG9jYWxEYXRhQ2VudGVyIGZsYWcgaXMgc2V0Iik7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChzb3VyY2VEYyAhPSBudWxsKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFRva2VuTWV0YWRhdGEuVG9wb2xvZ3kgdG9wb2xvZ3kgPSBnZXRUb2tlbk1ldGFkYXRhKCkuY2xvbmVPbmx5VG9rZW5NYXAoKS5nZXRUb3BvbG9neSgpOwpAQCAtMTQxNCw2ICsxNDY4LDkgQEAKICAgICAgICAgICAgIGlmIChzb3VyY2VEYyAhPSBudWxsKQogICAgICAgICAgICAgICAgIHN0cmVhbWVyLmFkZFNvdXJjZUZpbHRlcihuZXcgUmFuZ2VTdHJlYW1lci5TaW5nbGVEYXRhY2VudGVyRmlsdGVyKERhdGFiYXNlRGVzY3JpcHRvci5nZXRFbmRwb2ludFNuaXRjaCgpLCBzb3VyY2VEYykpOwogCisgICAgICAgICAgICBpZiAoZXhjbHVkZUxvY2FsRGF0YWNlbnRlck5vZGVzKQorICAgICAgICAgICAgICAgIHN0cmVhbWVyLmFkZFNvdXJjZUZpbHRlcihuZXcgUmFuZ2VTdHJlYW1lci5FeGNsdWRlTG9jYWxEYXRhY2VudGVyRmlsdGVyKERhdGFiYXNlRGVzY3JpcHRvci5nZXRFbmRwb2ludFNuaXRjaCgpKSk7CisKICAgICAgICAgICAgIGlmIChrZXlzcGFjZSA9PSBudWxsKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleXNwYWNlTmFtZSA6IFNjaGVtYS5pbnN0YW5jZS5nZXROb25Mb2NhbFN0cmF0ZWd5S2V5c3BhY2VzKCkubmFtZXMoKSkKQEAgLTE5MjIsNyArMTk3OSw4IEBACiAgICAgICAgICAgICBTdHJpbmcgYm9vdHN0cmFwVG9rZW5zID0gU3RyaW5nVXRpbHMuam9pbih0b2tlbk1ldGFkYXRhLmdldEJvb3RzdHJhcFRva2VucygpLnZhbHVlU2V0KCksICcsJyk7CiAgICAgICAgICAgICBTdHJpbmcgbGVhdmluZ1Rva2VucyA9IFN0cmluZ1V0aWxzLmpvaW4odG9rZW5NZXRhZGF0YS5nZXRMZWF2aW5nRW5kcG9pbnRzKCksICcsJyk7CiAgICAgICAgICAgICBTdHJpbmcgbW92aW5nVG9rZW5zID0gU3RyaW5nVXRpbHMuam9pbih0b2tlbk1ldGFkYXRhLmdldE1vdmluZ0VuZHBvaW50cygpLnN0cmVhbSgpLm1hcChlIC0+IGUucmlnaHQpLnRvQXJyYXkoKSwgJywnKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJPdGhlciBib290c3RyYXBwaW5nL2xlYXZpbmcvbW92aW5nIG5vZGVzIGRldGVjdGVkLCBjYW5ub3QgYm9vdHN0cmFwIHdoaWxlIGNhc3NhbmRyYS5jb25zaXN0ZW50LnJhbmdlbW92ZW1lbnQgaXMgdHJ1ZS4gTm9kZXMgZGV0ZWN0ZWQsIGJvb3RzdHJhcHBpbmc6ICVzOyBsZWF2aW5nOiAlczsgbW92aW5nOiAlczsiLCBib290c3RyYXBUb2tlbnMsIGxlYXZpbmdUb2tlbnMsIG1vdmluZ1Rva2VucykpOworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIk90aGVyIGJvb3RzdHJhcHBpbmcvbGVhdmluZy9tb3Zpbmcgbm9kZXMgZGV0ZWN0ZWQsIGNhbm5vdCBib290c3RyYXAgd2hpbGUgJXMgaXMgdHJ1ZS4gTm9kZXMgZGV0ZWN0ZWQsIGJvb3RzdHJhcHBpbmc6ICVzOyBsZWF2aW5nOiAlczsgbW92aW5nOiAlczsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OU0lTVEVOVF9SQU5HRV9NT1ZFTUVOVC5nZXRLZXkoKSwgYm9vdHN0cmFwVG9rZW5zLCBsZWF2aW5nVG9rZW5zLCBtb3ZpbmdUb2tlbnMpKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGdldCBib290c3RyYXAgdG9rZW5zCkBAIC0xOTQwLDExICsxOTk4LDE4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghaXNSZXBsYWNpbmdTYW1lQWRkcmVzcygpKQogICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEhpc3RvcmljYWxseSBCUk9BRENBU1RfSU5URVJWQUwgd2FzIHVzZWQsIGJ1dCB0aGlzIGlzIHVucmVsYXRlZCB0byByaW5nX2RlbGF5LCBzbyB1c2luZyBpdCB0byBrbm93CisgICAgICAgICAgICAgICAgLy8gaG93IGxvbmcgdG8gc2xlZXAgb25seSB3b3JrcyB3aXRoIHRoZSBkZWZhdWx0IHNldHRpbmdzIChyaW5nX2RlbGF5PTMwcywgYnJvYWRjYXN0PTYwcykuICBGb3IgdXNlcnMKKyAgICAgICAgICAgICAgICAvLyB3aG8gYXJlIGF3YXJlIG9mIHRoaXMgcmVsYXRpb25zaGlwLCB0aGlzIGNvdXBsaW5nIHNob3VsZCBub3QgYmUgYnJva2VuLCBidXQgZm9yIG1vc3QgdXNlcnMgdGhpcworICAgICAgICAgICAgICAgIC8vIHJlbGF0aW9uc2hpcCBpc24ndCBrbm93biBhbmQgaW5zdGVhZCB3ZSBzaG91bGQgcmVseSBvbiB0aGUgcmluZ19kZWxheS4KKyAgICAgICAgICAgICAgICAvLyBTZWUgQ0FTU0FORFJBLTE3Nzc2CisgICAgICAgICAgICAgICAgbG9uZyBzbGVlcERlbGF5TWlsbGlzID0gTWF0aC5tYXgoTG9hZEJyb2FkY2FzdGVyLkJST0FEQ0FTVF9JTlRFUlZBTCwgcmluZ1RpbWVvdXRNaWxsaXMgKiAyKTsKICAgICAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFNsZWVwIGFkZGl0aW9uYWxseSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc2VydmVyIGFjdHVhbGx5IGlzIG5vdCBhbGl2ZQogICAgICAgICAgICAgICAgICAgICAvLyBhbmQgZ2l2aW5nIGl0IG1vcmUgdGltZSB0byBnb3NzaXAgaWYgYWxpdmUuCi0gICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChMb2FkQnJvYWRjYXN0ZXIuQlJPQURDQVNUX0lOVEVSVkFMKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlNsZWVwaW5nIGZvciB7fW1zIHdhaXRpbmcgdG8gbWFrZSBzdXJlIG5vIG5ldyBnb3NzaXAgdXBkYXRlcyBoYXBwZW4gZm9yIHt9Iiwgc2xlZXBEZWxheU1pbGxpcywgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJlcGxhY2VBZGRyZXNzKCkpOworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoc2xlZXBEZWxheU1pbGxpcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgICAgIHsKQEAgLTE5NTIsMTQgKzIwMTcsMjMgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3Igb3BlcmF0b3IgZXJyb3JzLi4uCisgICAgICAgICAgICAgICAgbG9uZyBuYW5vRGVsYXkgPSBNSUxMSVNFQ09ORFMudG9OYW5vcyhyaW5nVGltZW91dE1pbGxpcyk7CiAgICAgICAgICAgICAgICAgZm9yIChUb2tlbiB0b2tlbiA6IGJvb3RzdHJhcFRva2VucykKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBleGlzdGluZyA9IHRva2VuTWV0YWRhdGEuZ2V0RW5kcG9pbnQodG9rZW4pOwogICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBuYW5vRGVsYXkgPSByaW5nVGltZW91dE1pbGxpcyAqIDEwMDAwMDBMOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEdvc3NpcGVyLmluc3RhbmNlLmdldEVuZHBvaW50U3RhdGVGb3JFbmRwb2ludChleGlzdGluZykuZ2V0VXBkYXRlVGltZXN0YW1wKCkgPiAobmFub1RpbWUoKSAtIG5hbm9EZWxheSkpCisgICAgICAgICAgICAgICAgICAgICAgICBFbmRwb2ludFN0YXRlIGVuZHBvaW50U3RhdGVGb3JFeGlzdGluZyA9IEdvc3NpcGVyLmluc3RhbmNlLmdldEVuZHBvaW50U3RhdGVGb3JFbmRwb2ludChleGlzdGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHVwZGF0ZVRpbWVzdGFtcCA9IGVuZHBvaW50U3RhdGVGb3JFeGlzdGluZy5nZXRVcGRhdGVUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYWxsb3dlZERlbGF5ID0gbmFub1RpbWUoKSAtIG5hbm9EZWxheTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIG5vZGUgd2FzIHVwZGF0ZWQgd2l0aGluIHRoZSByaW5nIGRlbGF5IG9yIHRoZSBub2RlIGlzIGFsaXZlLCB3ZSBzaG91bGQgZmFpbAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVRpbWVzdGFtcCA+IGFsbG93ZWREZWxheSB8fCBlbmRwb2ludFN0YXRlRm9yRXhpc3RpbmcuaXNBbGl2ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5hYmxlIHRvIHJlcGxhY2Ugbm9kZSBmb3IgdG9rZW49e30uIFRoZSBub2RlIGlzIHJlcG9ydGluZyBhcyB7fWFsaXZlIHdpdGggdXBkYXRlVGltZXN0YW1wPXt9LCBhbGxvd2VkRGVsYXk9e30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiwgZW5kcG9pbnRTdGF0ZUZvckV4aXN0aW5nLmlzQWxpdmUoKSA/ICIiIDogIm5vdCAiLCB1cGRhdGVUaW1lc3RhbXAsIGFsbG93ZWREZWxheSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW5ub3QgcmVwbGFjZSBhIGxpdmUgbm9kZS4uLiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxpc2lvbnMuYWRkKGV4aXN0aW5nKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlbHNlCkBAIC0yMDI0LDEwICsyMDk4LDEwIEBACiAgICAgICAgIGlmICghR29zc2lwZXIuaW5zdGFuY2Uuc2VlbkFueVNlZWQoKSkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byBjb250YWN0IGFueSBzZWVkczogIiArIEdvc3NpcGVyLmluc3RhbmNlLmdldFNlZWRzKCkpOwogCi0gICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5yZXNldF9ib290c3RyYXBfcHJvZ3Jlc3MiKSkKKyAgICAgICAgaWYgKFJFU0VUX0JPT1RTVFJBUF9QUk9HUkVTUy5nZXRCb29sZWFuKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJSZXNldHRpbmcgYm9vdHN0cmFwIHByb2dyZXNzIHRvIHN0YXJ0IGZyZXNoIik7Ci0gICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5yZXNldEF2YWlsYWJsZVJhbmdlcygpOworICAgICAgICAgICAgU3lzdGVtS2V5c3BhY2UucmVzZXRBdmFpbGFibGVTdHJlYW1lZFJhbmdlcygpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gRm9yY2UgZGlzayBib3VuZGFyeSBpbnZhbGlkYXRpb24gbm93IHRoYXQgbG9jYWwgdG9rZW5zIGFyZSBzZXQKQEAgLTM2NjYsMTIgKzM3NDAsMTggQEAKICAgICAgICAgICAgIHVwZGF0ZU5ldFZlcnNpb24oZW5kcG9pbnQsIG5ldFZlcnNpb24pOwogICAgIH0KIAotCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyBnZXRMb2FkU3RyaW5nKCkKICAgICB7CiAgICAgICAgIHJldHVybiBGaWxlVXRpbHMuc3RyaW5naWZ5RmlsZVNpemUoU3RvcmFnZU1ldHJpY3MubG9hZC5nZXRDb3VudCgpKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVuY29tcHJlc3NlZExvYWRTdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEZpbGVVdGlscy5zdHJpbmdpZnlGaWxlU2l6ZShTdG9yYWdlTWV0cmljcy51bmNvbXByZXNzZWRMb2FkLmdldENvdW50KCkpOworICAgIH0KKwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldExvYWRNYXBXaXRoUG9ydCgpCiAgICAgewogICAgICAgICByZXR1cm4gZ2V0TG9hZE1hcCh0cnVlKTsKQEAgLTM3NDQsNiArMzgyNCwxMiBAQAogICAgICAgICByZXR1cm4gRkJVdGlsaXRpZXMuZ2V0UmVsZWFzZVZlcnNpb25TdHJpbmcoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEdpdFNIQSgpCisgICAgeworICAgICAgICByZXR1cm4gRkJVdGlsaXRpZXMuZ2V0R2l0U0hBKCk7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWFWZXJzaW9uKCkKICAgICB7CiAgICAgICAgIHJldHVybiBTY2hlbWEuaW5zdGFuY2UuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7CkBAIC0zOTA4LDcgKzM5OTQsNyBAQAogICAgICAgICByZXR1cm4gZm9yY2VLZXlzcGFjZUNsZWFudXAoMCwga2V5c3BhY2VOYW1lLCB0YWJsZXMpOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgZm9yY2VLZXlzcGFjZUNsZWFudXAoaW50IGpvYnMsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiB0YWJsZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyBpbnQgZm9yY2VLZXlzcGFjZUNsZWFudXAoaW50IGpvYnMsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiB0YWJsZU5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGlmIChTY2hlbWFDb25zdGFudHMuaXNMb2NhbFN5c3RlbUtleXNwYWNlKGtleXNwYWNlTmFtZSkpCiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2xlYW51cCBvZiB0aGUgc3lzdGVtIGtleXNwYWNlIGlzIG5laXRoZXIgbmVjZXNzYXJ5IG5vciB3aXNlIik7CkBAIC0zOTE3LDM5ICs0MDAzLDM4IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm9kZSBpcyBpbnZvbHZlZCBpbiBjbHVzdGVyIG1lbWJlcnNoaXAgY2hhbmdlcy4gTm90IHNhZmUgdG8gcnVuIGNsZWFudXAuIik7CiAKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIHN0YXR1cyA9IENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMOwotICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmU3RvcmUgOiBnZXRWYWxpZENvbHVtbkZhbWlsaWVzKGZhbHNlLCBmYWxzZSwga2V5c3BhY2VOYW1lLCB0YWJsZXMpKQorICAgICAgICBsb2dnZXIuaW5mbygiU3RhcnRpbmcge30gb24ge30ue30iLCBPcGVyYXRpb25UeXBlLkNMRUFOVVAsIGtleXNwYWNlTmFtZSwgQXJyYXlzLnRvU3RyaW5nKHRhYmxlTmFtZXMpKTsKKyAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZlN0b3JlIDogZ2V0VmFsaWRDb2x1bW5GYW1pbGllcyhmYWxzZSwgZmFsc2UsIGtleXNwYWNlTmFtZSwgdGFibGVOYW1lcykpCiAgICAgICAgIHsKICAgICAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cyBvbmVTdGF0dXMgPSBjZlN0b3JlLmZvcmNlQ2xlYW51cChqb2JzKTsKICAgICAgICAgICAgIGlmIChvbmVTdGF0dXMgIT0gQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzLlNVQ0NFU1NGVUwpCiAgICAgICAgICAgICAgICAgc3RhdHVzID0gb25lU3RhdHVzOwogICAgICAgICB9CisgICAgICAgIGxvZ2dlci5pbmZvKCJDb21wbGV0ZWQge30gd2l0aCBzdGF0dXMge30iLCBPcGVyYXRpb25UeXBlLkNMRUFOVVAsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXMuc3RhdHVzQ29kZTsKICAgICB9CiAKLSAgICBwdWJsaWMgaW50IHNjcnViKGJvb2xlYW4gZGlzYWJsZVNuYXBzaG90LCBib29sZWFuIHNraXBDb3JydXB0ZWQsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiB0YWJsZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyBpbnQgc2NydWIoYm9vbGVhbiBkaXNhYmxlU25hcHNob3QsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgYm9vbGVhbiBjaGVja0RhdGEsIGJvb2xlYW4gcmVpbnNlcnRPdmVyZmxvd2VkVFRMLCBpbnQgam9icywgU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nLi4uIHRhYmxlTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgcmV0dXJuIHNjcnViKGRpc2FibGVTbmFwc2hvdCwgc2tpcENvcnJ1cHRlZCwgdHJ1ZSwgMCwga2V5c3BhY2VOYW1lLCB0YWJsZXMpOworICAgICAgICBJU2NydWJiZXIuT3B0aW9ucyBvcHRpb25zID0gSVNjcnViYmVyLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNraXBDb3JydXB0ZWQoc2tpcENvcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGVja0RhdGEoY2hlY2tEYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MocmVpbnNlcnRPdmVyZmxvd2VkVFRMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIHJldHVybiBzY3J1YihkaXNhYmxlU25hcHNob3QsIG9wdGlvbnMsIGpvYnMsIGtleXNwYWNlTmFtZSwgdGFibGVOYW1lcyk7CiAgICAgfQogCi0gICAgcHVibGljIGludCBzY3J1Yihib29sZWFuIGRpc2FibGVTbmFwc2hvdCwgYm9vbGVhbiBza2lwQ29ycnVwdGVkLCBib29sZWFuIGNoZWNrRGF0YSwgU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nLi4uIHRhYmxlcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gc2NydWIoZGlzYWJsZVNuYXBzaG90LCBza2lwQ29ycnVwdGVkLCBjaGVja0RhdGEsIDAsIGtleXNwYWNlTmFtZSwgdGFibGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHNjcnViKGJvb2xlYW4gZGlzYWJsZVNuYXBzaG90LCBib29sZWFuIHNraXBDb3JydXB0ZWQsIGJvb2xlYW4gY2hlY2tEYXRhLCBpbnQgam9icywgU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nLi4uIHRhYmxlcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gc2NydWIoZGlzYWJsZVNuYXBzaG90LCBza2lwQ29ycnVwdGVkLCBjaGVja0RhdGEsIGZhbHNlLCBqb2JzLCBrZXlzcGFjZU5hbWUsIHRhYmxlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzY3J1Yihib29sZWFuIGRpc2FibGVTbmFwc2hvdCwgYm9vbGVhbiBza2lwQ29ycnVwdGVkLCBib29sZWFuIGNoZWNrRGF0YSwgYm9vbGVhbiByZWluc2VydE92ZXJmbG93ZWRUVEwsIGludCBqb2JzLCBTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcuLi4gdGFibGVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICBwdWJsaWMgaW50IHNjcnViKGJvb2xlYW4gZGlzYWJsZVNuYXBzaG90LCBJU2NydWJiZXIuT3B0aW9ucyBvcHRpb25zLCBpbnQgam9icywgU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nLi4uIHRhYmxlTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIHN0YXR1cyA9IENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMOwotICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmU3RvcmUgOiBnZXRWYWxpZENvbHVtbkZhbWlsaWVzKHRydWUsIGZhbHNlLCBrZXlzcGFjZU5hbWUsIHRhYmxlcykpCisgICAgICAgIGxvZ2dlci5pbmZvKCJTdGFydGluZyB7fSBvbiB7fS57fSIsIE9wZXJhdGlvblR5cGUuU0NSVUIsIGtleXNwYWNlTmFtZSwgQXJyYXlzLnRvU3RyaW5nKHRhYmxlTmFtZXMpKTsKKyAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZlN0b3JlIDogZ2V0VmFsaWRDb2x1bW5GYW1pbGllcyh0cnVlLCBmYWxzZSwga2V5c3BhY2VOYW1lLCB0YWJsZU5hbWVzKSkKICAgICAgICAgewotICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIG9uZVN0YXR1cyA9IGNmU3RvcmUuc2NydWIoZGlzYWJsZVNuYXBzaG90LCBza2lwQ29ycnVwdGVkLCByZWluc2VydE92ZXJmbG93ZWRUVEwsIGNoZWNrRGF0YSwgam9icyk7CisgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgb25lU3RhdHVzID0gY2ZTdG9yZS5zY3J1YihkaXNhYmxlU25hcHNob3QsIG9wdGlvbnMsIGpvYnMpOwogICAgICAgICAgICAgaWYgKG9uZVN0YXR1cyAhPSBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMuU1VDQ0VTU0ZVTCkKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBvbmVTdGF0dXM7CiAgICAgICAgIH0KKyAgICAgICAgbG9nZ2VyLmluZm8oIkNvbXBsZXRlZCB7fSB3aXRoIHN0YXR1cyB7fSIsIE9wZXJhdGlvblR5cGUuU0NSVUIsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXMuc3RhdHVzQ29kZTsKICAgICB9CiAKQEAgLTM5NjIsMTkgKzQwNDcsMjAgQEAKICAgICBwdWJsaWMgaW50IHZlcmlmeShib29sZWFuIGV4dGVuZGVkVmVyaWZ5LCBib29sZWFuIGNoZWNrVmVyc2lvbiwgYm9vbGVhbiBkaXNrRmFpbHVyZVBvbGljeSwgYm9vbGVhbiBtdXRhdGVSZXBhaXJTdGF0dXMsIGJvb2xlYW4gY2hlY2tPd25zVG9rZW5zLCBib29sZWFuIHF1aWNrLCBTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcuLi4gdGFibGVOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgewogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgc3RhdHVzID0gQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzLlNVQ0NFU1NGVUw7Ci0gICAgICAgIFZlcmlmaWVyLk9wdGlvbnMgb3B0aW9ucyA9IFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeShkaXNrRmFpbHVyZVBvbGljeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4dGVuZGVkVmVyaWZpY2F0aW9uKGV4dGVuZGVkVmVyaWZ5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hlY2tWZXJzaW9uKGNoZWNrVmVyc2lvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm11dGF0ZVJlcGFpclN0YXR1cyhtdXRhdGVSZXBhaXJTdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGVja093bnNUb2tlbnMoY2hlY2tPd25zVG9rZW5zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVpY2socXVpY2spLmJ1aWxkKCk7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJWZXJpZnlpbmcge30ue30gd2l0aCBvcHRpb25zID0ge30iLCBrZXlzcGFjZU5hbWUsIEFycmF5cy50b1N0cmluZyh0YWJsZU5hbWVzKSwgb3B0aW9ucyk7CisgICAgICAgIElWZXJpZmllci5PcHRpb25zIG9wdGlvbnMgPSBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KGRpc2tGYWlsdXJlUG9saWN5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4dGVuZGVkVmVyaWZpY2F0aW9uKGV4dGVuZGVkVmVyaWZ5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNoZWNrVmVyc2lvbihjaGVja1ZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubXV0YXRlUmVwYWlyU3RhdHVzKG11dGF0ZVJlcGFpclN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGVja093bnNUb2tlbnMoY2hlY2tPd25zVG9rZW5zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1aWNrKHF1aWNrKS5idWlsZCgpOworICAgICAgICBsb2dnZXIuaW5mbygiU3RhcmluZyB7fSBvbiB7fS57fSB3aXRoIG9wdGlvbnMgPSB7fSIsIE9wZXJhdGlvblR5cGUuVkVSSUZZLCBrZXlzcGFjZU5hbWUsIEFycmF5cy50b1N0cmluZyh0YWJsZU5hbWVzKSwgb3B0aW9ucyk7CiAgICAgICAgIGZvciAoQ29sdW1uRmFtaWx5U3RvcmUgY2ZTdG9yZSA6IGdldFZhbGlkQ29sdW1uRmFtaWxpZXMoZmFsc2UsIGZhbHNlLCBrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZXMpKQogICAgICAgICB7CiAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgb25lU3RhdHVzID0gY2ZTdG9yZS52ZXJpZnkob3B0aW9ucyk7CiAgICAgICAgICAgICBpZiAob25lU3RhdHVzICE9IENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMKQogICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9uZVN0YXR1czsKICAgICAgICAgfQorICAgICAgICBsb2dnZXIuaW5mbygiQ29tcGxldGVkIHt9IHdpdGggc3RhdHVzIHt9IiwgT3BlcmF0aW9uVHlwZS5WRVJJRlksIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXMuc3RhdHVzQ29kZTsKICAgICB9CiAKQEAgLTQwMDgsMTIgKzQwOTQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuLi4gdGFibGVOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgewogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgc3RhdHVzID0gQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzLlNVQ0NFU1NGVUw7CisgICAgICAgIGxvZ2dlci5pbmZvKCJTdGFydGluZyB7fSBvbiB7fS57fSIsIE9wZXJhdGlvblR5cGUuVVBHUkFERV9TU1RBQkxFUywga2V5c3BhY2VOYW1lLCBBcnJheXMudG9TdHJpbmcodGFibGVOYW1lcykpOwogICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmU3RvcmUgOiBnZXRWYWxpZENvbHVtbkZhbWlsaWVzKHRydWUsIHRydWUsIGtleXNwYWNlTmFtZSwgdGFibGVOYW1lcykpCiAgICAgICAgIHsKICAgICAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cyBvbmVTdGF0dXMgPSBjZlN0b3JlLnNzdGFibGVzUmV3cml0ZShza2lwSWZDdXJyZW50VmVyc2lvbiwgc2tpcElmTmV3ZXJUaGFuVGltZXN0YW1wLCBza2lwSWZDb21wcmVzc2lvbk1hdGNoZXMsIGpvYnMpOwogICAgICAgICAgICAgaWYgKG9uZVN0YXR1cyAhPSBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMuU1VDQ0VTU0ZVTCkKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBvbmVTdGF0dXM7CiAgICAgICAgIH0KKyAgICAgICAgbG9nZ2VyLmluZm8oIkNvbXBsZXRlZCB7fSB3aXRoIHN0YXR1cyB7fSIsIE9wZXJhdGlvblR5cGUuVVBHUkFERV9TU1RBQkxFUywgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1cy5zdGF0dXNDb2RlOwogICAgIH0KIApAQCAtNDAzOSwzMyArNDEyNywzNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIGludCByZWxvY2F0ZVNTVGFibGVzKFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyAuLi4gY29sdW1uRmFtaWxpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyBpbnQgcmVsb2NhdGVTU1RhYmxlcyhTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcuLi4gdGFibGVOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgewotICAgICAgICByZXR1cm4gcmVsb2NhdGVTU1RhYmxlcygwLCBrZXlzcGFjZU5hbWUsIGNvbHVtbkZhbWlsaWVzKTsKKyAgICAgICAgcmV0dXJuIHJlbG9jYXRlU1NUYWJsZXMoMCwga2V5c3BhY2VOYW1lLCB0YWJsZU5hbWVzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgaW50IHJlbG9jYXRlU1NUYWJsZXMoaW50IGpvYnMsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyAuLi4gY29sdW1uRmFtaWxpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyBpbnQgcmVsb2NhdGVTU1RhYmxlcyhpbnQgam9icywgU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nLi4uIHRhYmxlTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIHN0YXR1cyA9IENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMOwotICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmcyA6IGdldFZhbGlkQ29sdW1uRmFtaWxpZXMoZmFsc2UsIGZhbHNlLCBrZXlzcGFjZU5hbWUsIGNvbHVtbkZhbWlsaWVzKSkKKyAgICAgICAgbG9nZ2VyLmluZm8oIlN0YXJ0aW5nIHt9IG9uIHt9Lnt9IiwgT3BlcmF0aW9uVHlwZS5SRUxPQ0FURSwga2V5c3BhY2VOYW1lLCBBcnJheXMudG9TdHJpbmcodGFibGVOYW1lcykpOworICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmcyA6IGdldFZhbGlkQ29sdW1uRmFtaWxpZXMoZmFsc2UsIGZhbHNlLCBrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZXMpKQogICAgICAgICB7CiAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgb25lU3RhdHVzID0gY2ZzLnJlbG9jYXRlU1NUYWJsZXMoam9icyk7CiAgICAgICAgICAgICBpZiAob25lU3RhdHVzICE9IENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMKQogICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9uZVN0YXR1czsKICAgICAgICAgfQorICAgICAgICBsb2dnZXIuaW5mbygiQ29tcGxldGVkIHt9IHdpdGggc3RhdHVzIHt9IiwgT3BlcmF0aW9uVHlwZS5SRUxPQ0FURSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1cy5zdGF0dXNDb2RlOwogICAgIH0KIAotICAgIHB1YmxpYyBpbnQgZ2FyYmFnZUNvbGxlY3QoU3RyaW5nIHRvbWJzdG9uZU9wdGlvblN0cmluZywgaW50IGpvYnMsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyAuLi4gY29sdW1uRmFtaWxpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyBpbnQgZ2FyYmFnZUNvbGxlY3QoU3RyaW5nIHRvbWJzdG9uZU9wdGlvblN0cmluZywgaW50IGpvYnMsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiB0YWJsZU5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KICAgICB7CiAgICAgICAgIFRvbWJzdG9uZU9wdGlvbiB0b21ic3RvbmVPcHRpb24gPSBUb21ic3RvbmVPcHRpb24udmFsdWVPZih0b21ic3RvbmVPcHRpb25TdHJpbmcpOwogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgc3RhdHVzID0gQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzLlNVQ0NFU1NGVUw7Ci0gICAgICAgIGZvciAoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzIDogZ2V0VmFsaWRDb2x1bW5GYW1pbGllcyhmYWxzZSwgZmFsc2UsIGtleXNwYWNlTmFtZSwgY29sdW1uRmFtaWxpZXMpKQorICAgICAgICBsb2dnZXIuaW5mbygiU3RhcnRpbmcge30gb24ge30ue30iLCBPcGVyYXRpb25UeXBlLkdBUkJBR0VfQ09MTEVDVCwga2V5c3BhY2VOYW1lLCBBcnJheXMudG9TdHJpbmcodGFibGVOYW1lcykpOworICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIGNmcyA6IGdldFZhbGlkQ29sdW1uRmFtaWxpZXMoZmFsc2UsIGZhbHNlLCBrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZXMpKQogICAgICAgICB7CiAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgb25lU3RhdHVzID0gY2ZzLmdhcmJhZ2VDb2xsZWN0KHRvbWJzdG9uZU9wdGlvbiwgam9icyk7CiAgICAgICAgICAgICBpZiAob25lU3RhdHVzICE9IENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMKQogICAgICAgICAgICAgICAgIHN0YXR1cyA9IG9uZVN0YXR1czsKICAgICAgICAgfQorICAgICAgICBsb2dnZXIuaW5mbygiQ29tcGxldGVkIHt9IHdpdGggc3RhdHVzIHt9IiwgT3BlcmF0aW9uVHlwZS5HQVJCQUdFX0NPTExFQ1QsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXMuc3RhdHVzQ29kZTsKICAgICB9CiAKQEAgLTQxNTMsNiArNDI0NSwyNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqKgorICAgICAqIEZvcmNlcyBjb21wYWN0aW9uIGZvciBhIGxpc3Qgb2YgcGFydGl0aW9uIGtleXMgaW4gYSB0YWJsZQorICAgICAqIFRoZSBtZXRob2Qgd2lsbCBpZ25vcmUgdGhlIGdjX2dyYWNlX3NlY29uZHMgZm9yIHRoZSBwYXJ0aXRpb25LZXlzSWdub3JlR2NHcmFjZSBkdXJpbmcgdGhlIGNvbWFwY3Rpb24sCisgICAgICogaW4gb3JkZXIgdG8gcHVyZ2UgdGhlIHRvbWJzdG9uZXMgYW5kIGZyZWUgdXAgc3BhY2UgcXVpY2tlci4KKyAgICAgKiBAcGFyYW0ga2V5c3BhY2VOYW1lIGtleXNwYWNlIG5hbWUKKyAgICAgKiBAcGFyYW0gdGFibGVOYW1lIHRhYmxlIG5hbWUKKyAgICAgKiBAcGFyYW0gcGFydGl0aW9uS2V5c0lnbm9yZUdjR3JhY2UgcGFydGl0aW9uIGtleXMgaWdub3JpbmcgdGhlIGdjX2dyYWNlX3NlY29uZHMKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIG9uIGFueSBJL08gb3BlcmF0aW9uIGVycm9yCisgICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gd2hlbiBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIHRoZSByZXN1bHQgb2YgYSB0YXNrIHRoYXQgYWJvcnRlZCBieSB0aHJvd2luZyBhbiBleGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHdoZW4gYSB0aHJlYWQgaXMgd2FpdGluZywgc2xlZXBpbmcsIG9yIG90aGVyd2lzZSBvY2N1cGllZCwgYW5kIHRoZSB0aHJlYWQgaXMgaW50ZXJydXB0ZWQsIGVpdGhlciBiZWZvcmUgb3IgZHVyaW5nIHRoZSBhY3Rpdml0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZvcmNlQ29tcGFjdGlvbktleXNJZ25vcmluZ0djR3JhY2UoU3RyaW5nIGtleXNwYWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZy4uLiBwYXJ0aXRpb25LZXlzSWdub3JlR2NHcmFjZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZlN0b3JlID0gZ2V0VmFsaWRLZXlzcGFjZShrZXlzcGFjZU5hbWUpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhYmxlTmFtZSk7CisgICAgICAgIGNmU3RvcmUuZm9yY2VDb21wYWN0aW9uS2V5c0lnbm9yaW5nR2NHcmFjZShwYXJ0aXRpb25LZXlzSWdub3JlR2NHcmFjZSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogVGFrZXMgdGhlIHNuYXBzaG90IGZvciB0aGUgZ2l2ZW4ga2V5c3BhY2VzLiBBIHNuYXBzaG90IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuCiAgICAgICoKQEAgLTQzMDYsMTUgKzQ0MTYsMjMgQEAKICAgICAgKiBSZW1vdmUgdGhlIHNuYXBzaG90IHdpdGggdGhlIGdpdmVuIG5hbWUgZnJvbSB0aGUgZ2l2ZW4ga2V5c3BhY2VzLgogICAgICAqIElmIG5vIHRhZyBpcyBzcGVjaWZpZWQgd2Ugd2lsbCByZW1vdmUgYWxsIHNuYXBzaG90cy4KICAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjbGVhclNuYXBzaG90KFN0cmluZyB0YWcsIFN0cmluZy4uLiBrZXlzcGFjZU5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgdm9pZCBjbGVhclNuYXBzaG90KFN0cmluZyB0YWcsIFN0cmluZy4uLiBrZXlzcGFjZU5hbWVzKQogICAgIHsKLSAgICAgICAgaWYodGFnID09IG51bGwpCisgICAgICAgIGNsZWFyU25hcHNob3QoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwgdGFnLCBrZXlzcGFjZU5hbWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhclNuYXBzaG90KE1hcDxTdHJpbmcsIE9iamVjdD4gb3B0aW9ucywgU3RyaW5nIHRhZywgU3RyaW5nLi4uIGtleXNwYWNlTmFtZXMpCisgICAgeworICAgICAgICBpZiAodGFnID09IG51bGwpCiAgICAgICAgICAgICB0YWcgPSAiIjsKIAorICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKQorICAgICAgICAgICAgb3B0aW9ucyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisKICAgICAgICAgU2V0PFN0cmluZz4ga2V5c3BhY2VzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICBmb3IgKFN0cmluZyBkYXRhRGlyIDogRGF0YWJhc2VEZXNjcmlwdG9yLmdldEFsbERhdGFGaWxlTG9jYXRpb25zKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvcihTdHJpbmcga2V5c3BhY2VEaXIgOiBuZXcgRmlsZShkYXRhRGlyKS50cnlMaXN0TmFtZXMoKSkKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleXNwYWNlRGlyIDogbmV3IEZpbGUoZGF0YURpcikudHJ5TGlzdE5hbWVzKCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gT25seSBhZGQgYSBrcyBpZiBpdCBoYXMgYmVlbiBzcGVjaWZpZWQgYXMgYSBwYXJhbSwgYXNzdW1pbmcgcGFyYW1zIHdlcmUgYWN0dWFsbHkgcHJvdmlkZWQuCiAgICAgICAgICAgICAgICAgaWYgKGtleXNwYWNlTmFtZXMubGVuZ3RoID4gMCAmJiAhQXJyYXlzLmFzTGlzdChrZXlzcGFjZU5hbWVzKS5jb250YWlucyhrZXlzcGFjZURpcikpCkBAIC00MzIzLDE2ICs0NDQxLDU4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBPYmplY3Qgb2xkZXJUaGFuID0gb3B0aW9ucy5nZXQoIm9sZGVyX3RoYW4iKTsKKyAgICAgICAgT2JqZWN0IG9sZGVyVGhhblRpbWVzdGFtcCA9IG9wdGlvbnMuZ2V0KCJvbGRlcl90aGFuX3RpbWVzdGFtcCIpOworCisgICAgICAgIGZpbmFsIGxvbmcgY2xlYXJPbGRlclRoYW5UaW1lc3RhbXA7CisgICAgICAgIGlmIChvbGRlclRoYW4gIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IG9sZGVyVGhhbiBpbnN0YW5jZW9mIFN0cmluZyA6ICJpdCBpcyBleHBlY3RlZCB0aGF0IG9sZGVyX3RoYW4gaXMgYW4gaW5zdGFuY2Ugb2YgamF2YS5sYW5nLlN0cmluZyI7CisgICAgICAgICAgICBjbGVhck9sZGVyVGhhblRpbWVzdGFtcCA9IENsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpcygpIC0gbmV3IER1cmF0aW9uU3BlYy5Mb25nU2Vjb25kc0JvdW5kKChTdHJpbmcpIG9sZGVyVGhhbikudG9NaWxsaXNlY29uZHMoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChvbGRlclRoYW5UaW1lc3RhbXAgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IG9sZGVyVGhhblRpbWVzdGFtcCBpbnN0YW5jZW9mIFN0cmluZyA6ICJpdCBpcyBleHBlY3RlZCB0aGF0IG9sZGVyX3RoYW5fdGltZXN0YW1wIGlzIGFuIGluc3RhbmNlIG9mIGphdmEubGFuZy5TdHJpbmciOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xlYXJPbGRlclRoYW5UaW1lc3RhbXAgPSBJbnN0YW50LnBhcnNlKChTdHJpbmcpIG9sZGVyVGhhblRpbWVzdGFtcCkudG9FcG9jaE1pbGxpKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRGF0ZVRpbWVQYXJzZUV4Y2VwdGlvbiBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUGFyYW1ldGVyIG9sZGVyX3RoYW5fdGltZXN0YW1wIGhhcyB0byBiZSBhIHZhbGlkIGluc3RhbnQgaW4gSVNPIGZvcm1hdC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBjbGVhck9sZGVyVGhhblRpbWVzdGFtcCA9IDBMOworCiAgICAgICAgIGZvciAoU3RyaW5nIGtleXNwYWNlIDoga2V5c3BhY2VzKQotICAgICAgICAgICAgS2V5c3BhY2UuY2xlYXJTbmFwc2hvdCh0YWcsIGtleXNwYWNlKTsKKyAgICAgICAgICAgIGNsZWFyS2V5c3BhY2VTbmFwc2hvdChrZXlzcGFjZSwgdGFnLCBjbGVhck9sZGVyVGhhblRpbWVzdGFtcCk7CiAKICAgICAgICAgaWYgKGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKQogICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJDbGVhcmVkIG91dCBzbmFwc2hvdCBkaXJlY3RvcmllcyIpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENsZWFyIHNuYXBzaG90cyBmb3IgYSBnaXZlbiBrZXlzcGFjZS4KKyAgICAgKiBAcGFyYW0ga2V5c3BhY2Uga2V5c3BhY2UgdG8gcmVtb3ZlIHNuYXBzaG90cyBmb3IKKyAgICAgKiBAcGFyYW0gdGFnIHRoZSB1c2VyIHN1cHBsaWVkIHNuYXBzaG90IG5hbWUuIElmIGVtcHR5IG9yIG51bGwsIGFsbCB0aGUgc25hcHNob3RzIHdpbGwgYmUgY2xlYW5lZAorICAgICAqIEBwYXJhbSBvbGRlclRoYW5UaW1lc3RhbXAgaWYgYSBzbmFwc2hvdCB3YXMgY3JlYXRlZCBiZWZvcmUgdGhpcyB0aW1lc3RhbXAsIGl0IHdpbGwgYmUgY2xlYXJlZCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0cyB2YWx1ZSBpcyAwLCB0aGlzIHBhcmFtZXRlciBpcyBlZmZlY3RpdmVseSBpZ25vcmVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjbGVhcktleXNwYWNlU25hcHNob3QoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFnLCBsb25nIG9sZGVyVGhhblRpbWVzdGFtcCkKKyAgICB7CisgICAgICAgIFNldDxUYWJsZVNuYXBzaG90PiBzbmFwc2hvdHNUb0NsZWFyID0gc25hcHNob3RNYW5hZ2VyLmxvYWRTbmFwc2hvdHMoa2V5c3BhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihUYWJsZVNuYXBzaG90LnNob3VsZENsZWFyU25hcHNob3QodGFnLCBvbGRlclRoYW5UaW1lc3RhbXApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgIGZvciAoVGFibGVTbmFwc2hvdCBzbmFwc2hvdCA6IHNuYXBzaG90c1RvQ2xlYXIpCisgICAgICAgICAgICBzbmFwc2hvdE1hbmFnZXIuY2xlYXJTbmFwc2hvdChzbmFwc2hvdCk7CisgICAgfQorCiAgICAgcHVibGljIE1hcDxTdHJpbmcsIFRhYnVsYXJEYXRhPiBnZXRTbmFwc2hvdERldGFpbHMoTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zKQogICAgIHsKICAgICAgICAgYm9vbGVhbiBza2lwRXhwaXJpbmcgPSBvcHRpb25zICE9IG51bGwgJiYgQm9vbGVhbi5wYXJzZUJvb2xlYW4ob3B0aW9ucy5nZXRPckRlZmF1bHQoIm5vX3R0bCIsICJmYWxzZSIpKTsKKyAgICAgICAgYm9vbGVhbiBpbmNsdWRlRXBoZW1lcmFsID0gb3B0aW9ucyAhPSBudWxsICYmIEJvb2xlYW4ucGFyc2VCb29sZWFuKG9wdGlvbnMuZ2V0T3JEZWZhdWx0KCJpbmNsdWRlX2VwaGVtZXJhbCIsICJmYWxzZSIpKTsKIAogICAgICAgICBNYXA8U3RyaW5nLCBUYWJ1bGFyRGF0YT4gc25hcHNob3RNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CiAKQEAgLTQzNDAsNiArNDUwMCw4IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChza2lwRXhwaXJpbmcgJiYgc25hcHNob3QuaXNFeHBpcmluZygpKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCFpbmNsdWRlRXBoZW1lcmFsICYmIHNuYXBzaG90LmlzRXBoZW1lcmFsKCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgICAgIFRhYnVsYXJEYXRhU3VwcG9ydCBkYXRhID0gKFRhYnVsYXJEYXRhU3VwcG9ydCkgc25hcHNob3RNYXAuZ2V0KHNuYXBzaG90LmdldFRhZygpKTsKICAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpCkBAIC00NTc2LDggKzQ3MzgsOCBAQAogICAgICAgICBsb2dnZXIuaW5mbygicmVwYWlyaW5nIHBheG9zIGZvciB7fSIsIHJlYXNvbik7CiAKICAgICAgICAgaW50IHJldHJpZXMgPSAwOwotICAgICAgICBpbnQgbWF4UmV0cmllcyA9IEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLnBheG9zX3JlcGFpcl9vbl90b3BvbG9neV9jaGFuZ2VfcmV0cmllcyIsIDEwKTsKLSAgICAgICAgaW50IGRlbGF5U2VjID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEucGF4b3NfcmVwYWlyX29uX3RvcG9sb2d5X2NoYW5nZV9yZXRyeV9kZWxheV9zZWNvbmRzIiwgMTApOworICAgICAgICBpbnQgbWF4UmV0cmllcyA9IFBBWE9TX1JFUEFJUl9PTl9UT1BPTE9HWV9DSEFOR0VfUkVUUklFUy5nZXRJbnQoKTsKKyAgICAgICAgaW50IGRlbGF5U2VjID0gUEFYT1NfUkVQQUlSX09OX1RPUE9MT0dZX0NIQU5HRV9SRVRSWV9ERUxBWV9TRUNPTkRTLmdldEludCgpOwogCiAgICAgICAgIGJvb2xlYW4gY29tcGxldGVkID0gZmFsc2U7CiAgICAgICAgIHdoaWxlICghY29tcGxldGVkKQpAQCAtNDY1MSwxNiArNDgxMyw0NCBAQAogICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC48U3RyaW5nPmJ1aWxkZXIoKS5hZGQocGFpci5sZWZ0Lm5hbWUoKSkuYWRkQWxsKHBhaXIucmlnaHQpLmJ1aWxkKCk7CiAgICAgfQogCisgICAgQERlcHJlY2F0ZWQKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZXRSZXBhaXJTZXNzaW9uTWF4VHJlZURlcHRoKGludCBkZXB0aCkKICAgICB7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRSZXBhaXJTZXNzaW9uTWF4VHJlZURlcHRoKGRlcHRoKTsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZ2V0UmVwYWlyU2Vzc2lvbk1heFRyZWVEZXB0aCgpCiAgICAgewogICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJlcGFpclNlc3Npb25NYXhUcmVlRGVwdGgoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aChpbnQgZGVwdGgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFJlcGFpclNlc3Npb25NYXhUcmVlRGVwdGgoZGVwdGgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJbiBDQVNTQU5EUkEtMTc2NjgsIEpNWCBzZXR0ZXJzIHRoYXQgZGlkIG5vdCB0aHJvdyBzdGFuZGFyZCBleGNlcHRpb25zIHdlcmUgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBvbmVzIHRoYXQgZG8uCisgICAgICogRm9yIGNvbnNpc3RlbmN5IHB1cnBvc2VzLCB0aGUgcmVzcGVjdGl2ZSBnZXR0ZXIgImdldFJlcGFpclNlc3Npb25NYXhUcmVlRGVwdGgiIHdhcyBhbHNvIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkCisgICAgICogYnkgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aCgpCisgICAgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJlcGFpclNlc3Npb25NYXhUcmVlRGVwdGgoKTsKKyAgICB9CisKICAgICAvKiBFbmQgb2YgTUJlYW4gaW50ZXJmYWNlIG1ldGhvZHMgKi8KIAogICAgIC8qKgpAQCAtNDkyOCw2ICs1MTE4LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgc3RhcnRMZWF2aW5nKCkKICAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZXZlcml0eUR1cmluZ0RlY29tbWlzc2lvbigpLmlmUHJlc2VudChEeW5hbWljRW5kcG9pbnRTbml0Y2g6OmFkZFNldmVyaXR5KTsKICAgICAgICAgR29zc2lwZXIuaW5zdGFuY2UuYWRkTG9jYWxBcHBsaWNhdGlvblN0YXRlKEFwcGxpY2F0aW9uU3RhdGUuU1RBVFVTX1dJVEhfUE9SVCwgdmFsdWVGYWN0b3J5LmxlYXZpbmcoZ2V0TG9jYWxUb2tlbnMoKSkpOwogICAgICAgICBHb3NzaXBlci5pbnN0YW5jZS5hZGRMb2NhbEFwcGxpY2F0aW9uU3RhdGUoQXBwbGljYXRpb25TdGF0ZS5TVEFUVVMsIHZhbHVlRmFjdG9yeS5sZWF2aW5nKGdldExvY2FsVG9rZW5zKCkpKTsKICAgICAgICAgdG9rZW5NZXRhZGF0YS5hZGRMZWF2aW5nRW5kcG9pbnQoRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSk7CkBAIC01MDc3LDkgKzUyNjgsMjAgQEAKICAgICAgICAgbG9nZ2VyLmRlYnVnKCJ3YWl0aW5nIGZvciBiYXRjaCBsb2cgcHJvY2Vzc2luZy4iKTsKICAgICAgICAgYmF0Y2hsb2dSZXBsYXkuZ2V0KCk7CiAKLSAgICAgICAgc2V0TW9kZShNb2RlLkxFQVZJTkcsICJzdHJlYW1pbmcgaGludHMgdG8gb3RoZXIgbm9kZXMiLCB0cnVlKTsKKyAgICAgICAgRnV0dXJlPD8+IGhpbnRzU3VjY2VzcyA9IEltbWVkaWF0ZUZ1dHVyZS5zdWNjZXNzKG51bGwpOwogCi0gICAgICAgIEZ1dHVyZSBoaW50c1N1Y2Nlc3MgPSBzdHJlYW1IaW50cygpOworICAgICAgICBpZiAoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFRyYW5zZmVySGludHNPbkRlY29tbWlzc2lvbigpKSAKKyAgICAgICAgeworICAgICAgICAgICAgc2V0TW9kZShNb2RlLkxFQVZJTkcsICJzdHJlYW1pbmcgaGludHMgdG8gb3RoZXIgbm9kZXMiLCB0cnVlKTsKKyAgICAgICAgICAgIGhpbnRzU3VjY2VzcyA9IHN0cmVhbUhpbnRzKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzZXRNb2RlKE1vZGUuTEVBVklORywgInBhdXNpbmcgZGlzcGF0Y2ggYW5kIGRlbGV0aW5nIGhpbnRzIiwgdHJ1ZSk7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0SGludGVkSGFuZG9mZkVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgSGludHNTZXJ2aWNlLmluc3RhbmNlLnBhdXNlRGlzcGF0Y2goKTsKKyAgICAgICAgICAgIEhpbnRzU2VydmljZS5pbnN0YW5jZS5kZWxldGVBbGxIaW50cygpOworICAgICAgICB9CiAKICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIHRyYW5zZmVyIHJ1bm5hYmxlcyB0byBzaWduYWwgdGhlIGxhdGNoLgogICAgICAgICBsb2dnZXIuZGVidWcoIndhaXRpbmcgZm9yIHN0cmVhbSBhY2tzLiIpOwpAQCAtNjA5NSwxNyArNjI5NywyMyBAQAogICAgICAgICByZXR1cm4gc2FtcGxlZEtleXM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9zaXRlRGF0YT4+IHNhbXBsZVBhcnRpdGlvbnMoaW50IGR1cmF0aW9uLCBpbnQgY2FwYWNpdHksIGludCBjb3VudCwgTGlzdDxTdHJpbmc+IHNhbXBsZXJzKSB0aHJvd3MgT3BlbkRhdGFFeGNlcHRpb24geworICAgICAgICByZXR1cm4gc2FtcGxlUGFydGl0aW9ucyhudWxsLCBkdXJhdGlvbiwgY2FwYWNpdHksIGNvdW50LCBzYW1wbGVycyk7CisgICAgfQorCiAgICAgLyoKICAgICAgKiB7ICJzYW1wbGVyX25hbWUiOiBbIHt0YWJsZTogIiIsIGNvdW50OiBpLCBlcnJvcjogaSwgdmFsdWU6ICIifSwgLi4uIF0gfQogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PENvbXBvc2l0ZURhdGE+PiBzYW1wbGVQYXJ0aXRpb25zKGludCBkdXJhdGlvbk1pbGxpcywgaW50IGNhcGFjaXR5LCBpbnQgY291bnQsCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gc2FtcGxlcnMpIHRocm93cyBPcGVuRGF0YUV4Y2VwdGlvbgorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PENvbXBvc2l0ZURhdGE+PiBzYW1wbGVQYXJ0aXRpb25zKFN0cmluZyBrZXlzcGFjZSwgaW50IGR1cmF0aW9uTWlsbGlzLCBpbnQgY2FwYWNpdHksIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gc2FtcGxlcnMpIHRocm93cyBPcGVuRGF0YUV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBMaXN0PENvbXBvc2l0ZURhdGE+PiByZXN1bHQgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgICAgICBJdGVyYWJsZTxDb2x1bW5GYW1pbHlTdG9yZT4gdGFibGVzID0gU2FtcGxpbmdNYW5hZ2VyLmdldFRhYmxlcyhrZXlzcGFjZSwgbnVsbCk7CiAgICAgICAgIGZvciAoU3RyaW5nIHNhbXBsZXIgOiBzYW1wbGVycykKICAgICAgICAgewotICAgICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSB0YWJsZSA6IENvbHVtbkZhbWlseVN0b3JlLmFsbCgpKQorICAgICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSB0YWJsZSA6IHRhYmxlcykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0YWJsZS5iZWdpbkxvY2FsU2FtcGxpbmcoc2FtcGxlciwgY2FwYWNpdHksIGR1cmF0aW9uTWlsbGlzKTsKICAgICAgICAgICAgIH0KQEAgLTYxMTUsNyArNjMyMyw3IEBACiAgICAgICAgIGZvciAoU3RyaW5nIHNhbXBsZXIgOiBzYW1wbGVycykKICAgICAgICAgewogICAgICAgICAgICAgTGlzdDxDb21wb3NpdGVEYXRhPiB0b3BrID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIHRhYmxlIDogQ29sdW1uRmFtaWx5U3RvcmUuYWxsKCkpCisgICAgICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIHRhYmxlIDogdGFibGVzKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRvcGsuYWRkQWxsKHRhYmxlLmZpbmlzaExvY2FsU2FtcGxpbmcoc2FtcGxlciwgY291bnQpKTsKICAgICAgICAgICAgIH0KQEAgLTYxMzMsNiArNjM0MSw0NCBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAorICAgIEBPdmVycmlkZSAvLyBOb3RlIGZyb20gcGFyZW50IGphdmFkb2M6IGtzIGFuZCB0YWJsZSBhcmUgbnVsbGFibGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzdGFydFNhbXBsaW5nUGFydGl0aW9ucyhTdHJpbmcga3MsIFN0cmluZyB0YWJsZSwgaW50IGR1cmF0aW9uLCBpbnQgaW50ZXJ2YWwsIGludCBjYXBhY2l0eSwgaW50IGNvdW50LCBMaXN0PFN0cmluZz4gc2FtcGxlcnMpCisgICAgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoZHVyYXRpb24gPiAwLCAiU2FtcGxpbmcgZHVyYXRpb24gJXMgbXVzdCBiZSBwb3NpdGl2ZS4iLCBkdXJhdGlvbik7CisKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KGludGVydmFsIDw9IDAgfHwgaW50ZXJ2YWwgPj0gZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2FtcGxpbmcgaW50ZXJ2YWwgJXMgc2hvdWxkIGJlIGdyZWF0ZXIgdGhlbiBvciBlcXVhbHMgdG8gZHVyYXRpb24gJXMgaWYgZGVmaW5lZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwsIGR1cmF0aW9uKTsKKworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoY2FwYWNpdHkgPiAwICYmIGNhcGFjaXR5IDw9IDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2FtcGxpbmcgY2FwYWNpdHkgJXMgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgdGhlIG1heCB2YWx1ZSBpcyAxMDI0IChpbmNsdXNpdmUpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSk7CisKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KGNvdW50ID4gMCAmJiBjb3VudCA8IGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhbXBsaW5nIGNvdW50ICVzIG11c3QgYmUgcG9zaXRpdmUgYW5kIHNtYWxsZXIgdGhhbiBjYXBhY2l0eSAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGNhcGFjaXR5KTsKKworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoIXNhbXBsZXJzLmlzRW1wdHkoKSwgIlNhbXBsZXJzIGNhbm5vdCBiZSBlbXB0eS4iKTsKKworICAgICAgICBTZXQ8U2FtcGxlci5TYW1wbGVyVHlwZT4gYXZhaWxhYmxlID0gRW51bVNldC5hbGxPZihTYW1wbGVyLlNhbXBsZXJUeXBlLmNsYXNzKTsKKyAgICAgICAgc2FtcGxlcnMuZm9yRWFjaCgoeCkgLT4gY2hlY2tBcmd1bWVudChhdmFpbGFibGUuY29udGFpbnMoU2FtcGxlci5TYW1wbGVyVHlwZS52YWx1ZU9mKHgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBzYW1wbGVyIGlzIG5vdCBhdmFpbGFibGUgZnJvbTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIEFycmF5cy50b1N0cmluZyhTYW1wbGVyLlNhbXBsZXJUeXBlLnZhbHVlcygpKSkpOworICAgICAgICByZXR1cm4gc2FtcGxpbmdNYW5hZ2VyLnJlZ2lzdGVyKGtzLCB0YWJsZSwgZHVyYXRpb24sIGludGVydmFsLCBjYXBhY2l0eSwgY291bnQsIHNhbXBsZXJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzdG9wU2FtcGxpbmdQYXJ0aXRpb25zKFN0cmluZyBrcywgU3RyaW5nIHRhYmxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNhbXBsaW5nTWFuYWdlci51bnJlZ2lzdGVyKGtzLCB0YWJsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRTYW1wbGVUYXNrcygpCisgICAgeworICAgICAgICByZXR1cm4gc2FtcGxpbmdNYW5hZ2VyLmFsbEpvYnMoKTsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCByZWJ1aWxkU2Vjb25kYXJ5SW5kZXgoU3RyaW5nIGtzTmFtZSwgU3RyaW5nIGNmTmFtZSwgU3RyaW5nLi4uIGlkeE5hbWVzKQogICAgIHsKICAgICAgICAgU3RyaW5nW10gaW5kaWNlcyA9IGFzTGlzdChpZHhOYW1lcykuc3RyZWFtKCkKQEAgLTYyNzIsMjkgKzY1MTgsNzYgQEAKICAgICAgICAgbG9nZ2VyLmluZm8oInVwZGF0ZWQgcmVwbGljYV9maWx0ZXJpbmdfcHJvdGVjdGlvbi5jYWNoZWRfcm93c19mYWlsX3RocmVzaG9sZCB0byB7fSIsIHRocmVzaG9sZCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRDb2x1bW5JbmRleFNpemVJbktpQigpCiAgICAgewogICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZUluS2lCKCk7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoaW50IGNvbHVtbkluZGV4U2l6ZUluS2lCKQorICAgIHsKKyAgICAgICAgaW50IG9sZFZhbHVlSW5LaUIgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemVJbktpQihjb2x1bW5JbmRleFNpemVJbktpQik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgbG9nZ2VyLmluZm8oIlVwZGF0ZWQgY29sdW1uX2luZGV4X3NpemUgdG8ge30gS2lCICh3YXMge30gS2lCKSIsIGNvbHVtbkluZGV4U2l6ZUluS2lCLCBvbGRWYWx1ZUluS2lCKTsKKyAgICB9CisKKyAgICBARGVwcmVjYXRlZAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4U2l6ZShpbnQgY29sdW1uSW5kZXhTaXplSW5LQikKICAgICB7CiAgICAgICAgIGludCBvbGRWYWx1ZUluS2lCID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZUluS2lCKCk7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemUoY29sdW1uSW5kZXhTaXplSW5LQik7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemVJbktpQihjb2x1bW5JbmRleFNpemVJbktCKTsKICAgICAgICAgbG9nZ2VyLmluZm8oIlVwZGF0ZWQgY29sdW1uX2luZGV4X3NpemUgdG8ge30gS2lCICh3YXMge30gS2lCKSIsIGNvbHVtbkluZGV4U2l6ZUluS0IsIG9sZFZhbHVlSW5LaUIpOwogICAgIH0KIAorICAgIEBEZXByZWNhdGVkCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGludCBnZXRDb2x1bW5JbmRleENhY2hlU2l6ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4Q2FjaGVTaXplSW5LaUIoKTsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4Q2FjaGVTaXplKGludCBjYWNoZVNpemVJbktCKQogICAgIHsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKGNhY2hlU2l6ZUluS0IpOwogICAgICAgICBsb2dnZXIuaW5mbygiVXBkYXRlZCBjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZSB0byB7fSIsIGNhY2hlU2l6ZUluS0IpOwogICAgIH0KIAorICAgIC8qCisgICAgICogSW4gQ0FTU0FORFJBLTE3NjY4LCBKTVggc2V0dGVycyB0aGF0IGRpZCBub3QgdGhyb3cgc3RhbmRhcmQgZXhjZXB0aW9ucyB3ZXJlIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2Ygb25lcyB0aGF0IGRvLgorICAgICAqIEZvciBjb25zaXN0ZW5jeSBwdXJwb3NlcywgdGhlIHJlc3BlY3RpdmUgZ2V0dGVyICJnZXRDb2x1bW5JbmRleENhY2hlU2l6ZSIgd2FzIGFsc28gZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQgYnkKKyAgICAgKiB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldENvbHVtbkluZGV4Q2FjaGVTaXplSW5LaUIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleENhY2hlU2l6ZUluS2lCKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQihpbnQgY2FjaGVTaXplSW5LaUIpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKGNhY2hlU2l6ZUluS2lCKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBsb2dnZXIuaW5mbygiVXBkYXRlZCBjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZSB0byB7fSIsIGNhY2hlU2l6ZUluS2lCKTsKKyAgICB9CisKICAgICBwdWJsaWMgaW50IGdldEJhdGNoU2l6ZUZhaWx1cmVUaHJlc2hvbGQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRCYXRjaFNpemVGYWlsVGhyZXNob2xkSW5LaUIoKTsKQEAgLTYzMDYsMTcgKzY1OTksNDcgQEAKICAgICAgICAgbG9nZ2VyLmluZm8oInVwZGF0ZWQgYmF0Y2hfc2l6ZV9mYWlsX3RocmVzaG9sZCB0byB7fSIsIHRocmVzaG9sZCk7CiAgICAgfQogCisgICAgQERlcHJlY2F0ZWQKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGdldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGQoKQogICAgIHsKICAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIoKTsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGQoaW50IHRocmVzaG9sZCkKICAgICB7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIodGhyZXNob2xkKTsKICAgICAgICAgbG9nZ2VyLmluZm8oIlVwZGF0ZWQgYmF0Y2hfc2l6ZV93YXJuX3RocmVzaG9sZCB0byB7fSIsIHRocmVzaG9sZCk7CiAgICAgfQogCisgICAgLyoKKyAgICAgKiBJbiBDQVNTQU5EUkEtMTc2NjgsIEpNWCBzZXR0ZXJzIHRoYXQgZGlkIG5vdCB0aHJvdyBzdGFuZGFyZCBleGNlcHRpb25zIHdlcmUgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBvbmVzIHRoYXQgZG8uCisgICAgICogRm9yIGNvbnNpc3RlbmN5IHB1cnBvc2VzLCB0aGUgcmVzcGVjdGl2ZSBnZXR0ZXIgImdldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGQiIHdhcyBhbHNvIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIGJ5CisgICAgICogdGhpcyBtZXRob2QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIoaW50IHRocmVzaG9sZEluS2lCKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIodGhyZXNob2xkSW5LaUIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgbG9nZ2VyLmluZm8oIlVwZGF0ZWQgYmF0Y2hfc2l6ZV93YXJuX3RocmVzaG9sZCB0byB7fSIsIHRocmVzaG9sZEluS2lCKTsKKyAgICB9CisKICAgICBwdWJsaWMgaW50IGdldEluaXRpYWxSYW5nZVRvbWJzdG9uZUxpc3RBbGxvY2F0aW9uU2l6ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluaXRpYWxSYW5nZVRvbWJzdG9uZUxpc3RBbGxvY2F0aW9uU2l6ZSgpOwpAQCAtNjM1OCw2ICs2NjgxLDE3IEBACiAgICAgICAgIGxvZ2dlci5pbmZvKCJ1cGRhdGVkIGhpbnRlZF9oYW5kb2ZmX3Rocm90dGxlIHRvIHt9IEtpQiIsIHRocm90dGxlSW5LQik7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gZ2V0VHJhbnNmZXJIaW50c09uRGVjb21taXNzaW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0VHJhbnNmZXJIaW50c09uRGVjb21taXNzaW9uKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHJhbnNmZXJIaW50c09uRGVjb21taXNzaW9uKGJvb2xlYW4gZW5hYmxlZCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRUcmFuc2ZlckhpbnRzT25EZWNvbW1pc3Npb24oZW5hYmxlZCk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJ1cGRhdGVkIHRyYW5zZmVyX2hpbnRzX29uX2RlY29tbWlzc2lvbiB0byB7fSIsIGVuYWJsZWQpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsZWFyQ29ubmVjdGlvbkhpc3RvcnkoKQogICAgIHsKQEAgLTY5NTMsNCArNzI4NywzOSBAQAogICAgIHsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE1pblRyYWNrZWRQYXJ0aXRpb25Ub21ic3RvbmVDb3VudCh2YWx1ZSk7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2tpcFN0cmVhbURpc2tTcGFjZUNoZWNrKGJvb2xlYW4gdmFsdWUpCisgICAgeworICAgICAgICBpZiAodmFsdWUgIT0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNraXBTdHJlYW1EaXNrU3BhY2VDaGVjaygpKQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkNoYW5naW5nIHNraXBfc3RyZWFtX2Rpc2tfc3BhY2VfY2hlY2sgZnJvbSB7fSB0byB7fSIsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTa2lwU3RyZWFtRGlza1NwYWNlQ2hlY2soKSwgdmFsdWUpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0U2tpcFN0cmVhbURpc2tTcGFjZUNoZWNrKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRTa2lwU3RyZWFtRGlza1NwYWNlQ2hlY2soKQorICAgIHsKKyAgICAgICAgcmV0dXJuIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTa2lwU3RyZWFtRGlza1NwYWNlQ2hlY2soKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihOb3RpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikgdGhyb3dzIExpc3RlbmVyTm90Rm91bmRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGlmICghc2tpcE5vdGlmaWNhdGlvbkxpc3RlbmVycykKKyAgICAgICAgICAgIHN1cGVyLnJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihOb3RpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lciwgTm90aWZpY2F0aW9uRmlsdGVyIGZpbHRlciwgT2JqZWN0IGhhbmRiYWNrKSB0aHJvd3MgTGlzdGVuZXJOb3RGb3VuZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKCFza2lwTm90aWZpY2F0aW9uTGlzdGVuZXJzKQorICAgICAgICAgICAgc3VwZXIucmVtb3ZlTm90aWZpY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIsIGZpbHRlciwgaGFuZGJhY2spOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZE5vdGlmaWNhdGlvbkxpc3RlbmVyKE5vdGlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkZpbHRlciBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGhhbmRiYWNrKSB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKCFza2lwTm90aWZpY2F0aW9uTGlzdGVuZXJzKQorICAgICAgICAgICAgc3VwZXIuYWRkTm90aWZpY2F0aW9uTGlzdGVuZXIobGlzdGVuZXIsIGZpbHRlciwgaGFuZGJhY2spOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVNlcnZpY2VNQmVhbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZU1CZWFuLmphdmEKaW5kZXggYWMyZmY2OC4uNTg5N2FmYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZU1CZWFuLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZU1CZWFuLmphdmEKQEAgLTEwMyw2ICsxMDMsMTIgQEAKICAgICBwdWJsaWMgU3RyaW5nIGdldFJlbGVhc2VWZXJzaW9uKCk7CiAKICAgICAvKioKKyAgICAgKiBGZXRjaCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQ2Fzc2FuZHJhIGdpdCBTSEEuCisgICAgICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgQ2Fzc2FuZHJhIGdpdCBTSEEuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRHaXRTSEEoKTsKKworICAgIC8qKgogICAgICAqIEZldGNoIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IFNjaGVtYSB2ZXJzaW9uLgogICAgICAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIFNjaGVtYSB2ZXJzaW9uLgogICAgICAqLwpAQCAtMjA5LDYgKzIxNSw5IEBACiAgICAgLyoqIEh1bWFuLXJlYWRhYmxlIGxvYWQgdmFsdWUgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldExvYWRTdHJpbmcoKTsKIAorICAgIC8qKiBIdW1hbi1yZWFkYWJsZSB1bmNvbXByZXNzZWQgbG9hZCB2YWx1ZSAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5jb21wcmVzc2VkTG9hZFN0cmluZygpOworCiAgICAgLyoqIEh1bWFuLXJlYWRhYmxlIGxvYWQgdmFsdWUuICBLZXlzIGFyZSBJUCBhZGRyZXNzZXMuICovCiAgICAgQERlcHJlY2F0ZWQgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0TG9hZE1hcCgpOwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldExvYWRNYXBXaXRoUG9ydCgpOwpAQCAtMjY3LDEwICsyNzYsMjQgQEAKICAgICAvKioKICAgICAgKiBSZW1vdmUgdGhlIHNuYXBzaG90IHdpdGggdGhlIGdpdmVuIG5hbWUgZnJvbSB0aGUgZ2l2ZW4ga2V5c3BhY2VzLgogICAgICAqIElmIG5vIHRhZyBpcyBzcGVjaWZpZWQgd2Ugd2lsbCByZW1vdmUgYWxsIHNuYXBzaG90cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWcgbmFtZSBvZiBzbmFwc2hvdCB0byBjbGVhciwgaWYgbnVsbCBvciBlbXB0eSBzdHJpbmcsIGFsbCBzbmFwc2hvdHMgb2YgZ2l2ZW4ga2V5c3BhY2Ugd2lsbCBiZSBjbGVhcmVkCisgICAgICogQHBhcmFtIGtleXNwYWNlTmFtZXMgbmFtZSBvZiBrZXlzcGFjZXMgdG8gY2xlYXIgc25hcHNob3RzIGZvcgogICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgY2xlYXJTbmFwc2hvdChTdHJpbmcgdGFnLCBTdHJpbmcuLi4ga2V5c3BhY2VOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uOwogCiAgICAgLyoqCisgICAgICogUmVtb3ZlIHRoZSBzbmFwc2hvdCB3aXRoIHRoZSBnaXZlbiBuYW1lIGZyb20gdGhlIGdpdmVuIGtleXNwYWNlcy4KKyAgICAgKiBJZiBubyB0YWcgaXMgc3BlY2lmaWVkIHdlIHdpbGwgcmVtb3ZlIGFsbCBzbmFwc2hvdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBtYXAgb2Ygb3B0aW9ucyBmb3IgY2xlYW51cCBvcGVyYXRpb24sIGNvbnN1bHQgbm9kZXRvb2wncyBDbGVhclNuYXBzaG90CisgICAgICogQHBhcmFtIHRhZyBuYW1lIG9mIHNuYXBzaG90IHRvIGNsZWFyLCBpZiBudWxsIG9yIGVtcHR5IHN0cmluZywgYWxsIHNuYXBzaG90cyBvZiBnaXZlbiBrZXlzcGFjZSB3aWxsIGJlIGNsZWFyZWQKKyAgICAgKiBAcGFyYW0ga2V5c3BhY2VOYW1lcyBuYW1lIG9mIGtleXNwYWNlcyB0byBjbGVhciBzbmFwc2hvdHMgZm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJTbmFwc2hvdChNYXA8U3RyaW5nLCBPYmplY3Q+IG9wdGlvbnMsIFN0cmluZyB0YWcsIFN0cmluZy4uLiBrZXlzcGFjZU5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKICAgICAgKiBHZXQgdGhlIGRldGFpbHMgb2YgYWxsIHRoZSBzbmFwc2hvdAogICAgICAqIEByZXR1cm4gQSBtYXAgb2Ygc25hcHNob3ROYW1lIHRvIGFsbCBpdHMgZGV0YWlscyBpbiBUYWJ1bGFyIGZvcm0uCiAgICAgICovCkBAIC0zNDIsNiArMzY1LDEzIEBACiAgICAgcHVibGljIHZvaWQgZm9yY2VLZXlzcGFjZUNvbXBhY3Rpb25Gb3JQYXJ0aXRpb25LZXkoU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nIHBhcnRpdGlvbktleSwgU3RyaW5nLi4uIHRhYmxlTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKIAogICAgIC8qKgorICAgICAqIEZvcmNlcyBjb21wYWN0aW9uIGZvciBhIGxpc3Qgb2YgcGFydGl0aW9uIGtleXMgb24gYSB0YWJsZS4KKyAgICAgKiBUaGUgbWV0aG9kIHdpbGwgaWdub3JlIHRoZSBnY19ncmFjZV9zZWNvbmRzIGZvciB0aGUgcGFydGl0aW9uS2V5c0lnbm9yZUdjR3JhY2UgZHVyaW5nIHRoZSBjb21hcGN0aW9uLAorICAgICAqIGluIG9yZGVyIHRvIHB1cmdlIHRoZSB0b21ic3RvbmVzIGFuZCBmcmVlIHVwIHNwYWNlIHF1aWNrZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0aW9uS2V5c0lnbm9yaW5nR2NHcmFjZShTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcuLi4gcGFydGl0aW9uS2V5c0lnbm9yZUdjR3JhY2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKKworICAgIC8qKgogICAgICAqIFRyaWdnZXIgYSBjbGVhbnVwIG9mIGtleXMgb24gYSBzaW5nbGUga2V5c3BhY2UKICAgICAgKi8KICAgICBARGVwcmVjYXRlZApAQCAtMzU1LDExICszODUsMjIgQEAKICAgICAgKiBTY3J1YmJlZCBDRnMgd2lsbCBiZSBzbmFwc2hvdHRlZCBmaXJzdCwgaWYgZGlzYWJsZVNuYXBzaG90IGlzIGZhbHNlCiAgICAgICovCiAgICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgaW50IHNjcnViKGJvb2xlYW4gZGlzYWJsZVNuYXBzaG90LCBib29sZWFuIHNraXBDb3JydXB0ZWQsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiB0YWJsZU5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb247CisgICAgZGVmYXVsdCBpbnQgc2NydWIoYm9vbGVhbiBkaXNhYmxlU25hcHNob3QsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nLi4uIHRhYmxlTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIHNjcnViKGRpc2FibGVTbmFwc2hvdCwgc2tpcENvcnJ1cHRlZCwgdHJ1ZSwga2V5c3BhY2VOYW1lLCB0YWJsZU5hbWVzKTsKKyAgICB9CisKICAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBpbnQgc2NydWIoYm9vbGVhbiBkaXNhYmxlU25hcHNob3QsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgYm9vbGVhbiBjaGVja0RhdGEsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiB0YWJsZU5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb247CisgICAgZGVmYXVsdCBpbnQgc2NydWIoYm9vbGVhbiBkaXNhYmxlU25hcHNob3QsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgYm9vbGVhbiBjaGVja0RhdGEsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiB0YWJsZU5hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBzY3J1YihkaXNhYmxlU25hcHNob3QsIHNraXBDb3JydXB0ZWQsIGNoZWNrRGF0YSwgMCwga2V5c3BhY2VOYW1lLCB0YWJsZU5hbWVzKTsKKyAgICB9CisKICAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBpbnQgc2NydWIoYm9vbGVhbiBkaXNhYmxlU25hcHNob3QsIGJvb2xlYW4gc2tpcENvcnJ1cHRlZCwgYm9vbGVhbiBjaGVja0RhdGEsIGludCBqb2JzLCBTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcuLi4gY29sdW1uRmFtaWxpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKKyAgICBkZWZhdWx0IGludCBzY3J1Yihib29sZWFuIGRpc2FibGVTbmFwc2hvdCwgYm9vbGVhbiBza2lwQ29ycnVwdGVkLCBib29sZWFuIGNoZWNrRGF0YSwgaW50IGpvYnMsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiBjb2x1bW5GYW1pbGllcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gc2NydWIoZGlzYWJsZVNuYXBzaG90LCBza2lwQ29ycnVwdGVkLCBjaGVja0RhdGEsIGZhbHNlLCBqb2JzLCBrZXlzcGFjZU5hbWUsIGNvbHVtbkZhbWlsaWVzKTsKKyAgICB9CiAKICAgICBwdWJsaWMgaW50IHNjcnViKGJvb2xlYW4gZGlzYWJsZVNuYXBzaG90LCBib29sZWFuIHNraXBDb3JydXB0ZWQsIGJvb2xlYW4gY2hlY2tEYXRhLCBib29sZWFuIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTCwgaW50IGpvYnMsIFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZy4uLiBjb2x1bW5GYW1pbGllcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uOwogCkBAIC00MTcsMTAgKzQ1OCwyMiBAQAogCiAgICAgcHVibGljIHZvaWQgZm9yY2VUZXJtaW5hdGVBbGxSZXBhaXJTZXNzaW9ucygpOwogCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHNldFJlcGFpclNlc3Npb25NYXhpbXVtVHJlZURlcHRoIGluc3RlYWQgYXMgaXQgd2lsbCBub3QgdGhyb3cgbm9uLXN0YW5kYXJkIGV4Y2VwdGlvbnMKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldFJlcGFpclNlc3Npb25NYXhUcmVlRGVwdGgoaW50IGRlcHRoKTsKIAorICAgIC8qKgorICAgICAqIEBkZXByZWNhdGVkIHVzZSBnZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aCBpbnN0ZWFkCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgaW50IGdldFJlcGFpclNlc3Npb25NYXhUcmVlRGVwdGgoKTsKIAorICAgIHB1YmxpYyB2b2lkIHNldFJlcGFpclNlc3Npb25NYXhpbXVtVHJlZURlcHRoKGludCBkZXB0aCk7CisKKyAgICBwdWJsaWMgaW50IGdldFJlcGFpclNlc3Npb25NYXhpbXVtVHJlZURlcHRoKCk7CisKICAgICAvKioKICAgICAgKiBHZXQgdGhlIHN0YXR1cyBvZiBhIGdpdmVuIHBhcmVudCByZXBhaXIgc2Vzc2lvbi4KICAgICAgKiBAcGFyYW0gY21kIHRoZSBpbnQgcmVmZXJlbmNlIHJldHVybmVkIHdoZW4gaXNzdWluZyB0aGUgcmVwYWlyCkBAIC03NDAsOSArNzkzLDIzIEBACiAgICAgICogQHBhcmFtIGtleXNwYWNlIE5hbWUgb2YgdGhlIGtleXNwYWNlIHdoaWNoIHRvIHJlYnVpbGQgb3IgbnVsbCB0byByZWJ1aWxkIGFsbCBrZXlzcGFjZXMuCiAgICAgICogQHBhcmFtIHRva2VucyBSYW5nZSBvZiB0b2tlbnMgdG8gcmVidWlsZCBvciBudWxsIHRvIHJlYnVpbGQgYWxsIHRva2VuIHJhbmdlcy4gSW4gdGhlIGZvcm1hdCBvZjoKICAgICAgKiAgICAgICAgICAgICAgICIoc3RhcnRfdG9rZW5fMSxlbmRfdG9rZW5fMV0sKHN0YXJ0X3Rva2VuXzIsZW5kX3Rva2VuXzJdLC4uLihzdGFydF90b2tlbl9uLGVuZF90b2tlbl9uXSIKKyAgICAgKiBAcGFyYW0gc3BlY2lmaWNTb3VyY2VzIGxpc3Qgb2Ygc291cmNlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciByZWJ1aWxkaW5nLiBNdXN0IGJlIG90aGVyIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvcm1hdCBvZiB0aGUgc3RyaW5nIGlzIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZXMuCiAgICAgICovCiAgICAgcHVibGljIHZvaWQgcmVidWlsZChTdHJpbmcgc291cmNlRGMsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRva2VucywgU3RyaW5nIHNwZWNpZmljU291cmNlcyk7CiAKKyAgICAvKioKKyAgICAqIFNhbWUgYXMge0BsaW5rICNyZWJ1aWxkKFN0cmluZyl9LCBidXQgb25seSBmb3Igc3BlY2lmaWVkIGtleXNwYWNlIGFuZCByYW5nZXMuIEl0IGV4Y2x1ZGVzIGxvY2FsIGRhdGEgY2VudGVyIG5vZGVzCisgICAgKgorICAgICogQHBhcmFtIHNvdXJjZURjIE5hbWUgb2YgREMgZnJvbSB3aGljaCB0byBzZWxlY3Qgc291cmNlcyBmb3Igc3RyZWFtaW5nIG9yIG51bGwgdG8gcGljayBhbnkgbm9kZQorICAgICogQHBhcmFtIGtleXNwYWNlIE5hbWUgb2YgdGhlIGtleXNwYWNlIHdoaWNoIHRvIHJlYnVpbGQgb3IgbnVsbCB0byByZWJ1aWxkIGFsbCBrZXlzcGFjZXMuCisgICAgKiBAcGFyYW0gdG9rZW5zIFJhbmdlIG9mIHRva2VucyB0byByZWJ1aWxkIG9yIG51bGwgdG8gcmVidWlsZCBhbGwgdG9rZW4gcmFuZ2VzLiBJbiB0aGUgZm9ybWF0IG9mOgorICAgICogICAgICAgICAgICAgICAiKHN0YXJ0X3Rva2VuXzEsZW5kX3Rva2VuXzFdLChzdGFydF90b2tlbl8yLGVuZF90b2tlbl8yXSwuLi4oc3RhcnRfdG9rZW5fbixlbmRfdG9rZW5fbl0iCisgICAgKiBAcGFyYW0gc3BlY2lmaWNTb3VyY2VzIGxpc3Qgb2Ygc291cmNlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciByZWJ1aWxkaW5nLiBNb3N0bHkgb3RoZXIgbm9kZXMgaW4gdGhlIGNsdXN0ZXIuCisgICAgKiBAcGFyYW0gZXhjbHVkZUxvY2FsRGF0YWNlbnRlck5vZGVzIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBsb2NhbCBkYXRhIGNlbnRlciBub2RlcyBzaG91bGQgYmUgZXhjbHVkZWQgYXMgc291cmNlcyBmb3Igc3RyZWFtaW5nLgorICAgICovCisgICAgcHVibGljIHZvaWQgcmVidWlsZChTdHJpbmcgc291cmNlRGMsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRva2VucywgU3RyaW5nIHNwZWNpZmljU291cmNlcywgYm9vbGVhbiBleGNsdWRlTG9jYWxEYXRhY2VudGVyTm9kZXMpOworCiAgICAgLyoqIFN0YXJ0cyBhIGJ1bGsgbG9hZCBhbmQgYmxvY2tzIHVudGlsIGl0IGNvbXBsZXRlcy4gKi8KICAgICBwdWJsaWMgdm9pZCBidWxrTG9hZChTdHJpbmcgZGlyZWN0b3J5KTsKIApAQCAtNzk1LDYgKzg2MiwzNiBAQAogCiAgICAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9zaXRlRGF0YT4+IHNhbXBsZVBhcnRpdGlvbnMoaW50IGR1cmF0aW9uLCBpbnQgY2FwYWNpdHksIGludCBjb3VudCwgTGlzdDxTdHJpbmc+IHNhbXBsZXJzKSB0aHJvd3MgT3BlbkRhdGFFeGNlcHRpb247CiAKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxDb21wb3NpdGVEYXRhPj4gc2FtcGxlUGFydGl0aW9ucyhTdHJpbmcga2V5c3BhY2UsIGludCBkdXJhdGlvbiwgaW50IGNhcGFjaXR5LCBpbnQgY291bnQsIExpc3Q8U3RyaW5nPiBzYW1wbGVycykgdGhyb3dzIE9wZW5EYXRhRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU3RhcnQgYSBzY2hlZHVsZWQgc2FtcGxpbmcKKyAgICAgKiBAcGFyYW0ga3MgS2V5c3BhY2UuIE51bGxhYmxlLiBJZiBudWxsLCB0aGUgc2NoZWR1bGVkIHNhbXBsaW5nIGlzIG9uIGFsbCBrZXlzcGFjZXMgYW5kIHRhYmxlcworICAgICAqIEBwYXJhbSB0YWJsZSBOdWxsYWJsZS4gSWYgbnVsbCwgdGhlIHNjaGVkdWxlZCBzYW1wbGluZyBpcyBvbiBhbGwgdGFibGVzIG9mIHRoZSBzcGVjaWZpZWQga2V5c3BhY2UKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gRHVyYXRpb24gb2YgZWFjaCBzY2hlZHVsZWQgc2FtcGxpbmcgam9iIGluIG1pbGxpc2Vjb25kcworICAgICAqIEBwYXJhbSBpbnRlcnZhbCBJbnRlcnZhbCBvZiBlYWNoIHNjaGVkdWxlZCBzYW1wbGluZyBqb2IgaW4gbWlsbGlzZWNvbmRzCisgICAgICogQHBhcmFtIGNhcGFjaXR5IENhcGFjaXR5IG9mIHRoZSBzYW1wbGVyLCBoaWdoZXIgZm9yIG1vcmUgYWNjdXJhY3kKKyAgICAgKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIHRoZSB0b3Agc2FtcGxlcyB0byBsaXN0CisgICAgICogQHBhcmFtIHNhbXBsZXJzIGEgbGlzdCBvZiBzYW1wbGVycyB0byBlbmFibGUKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNjaGVkdWxlZCBzYW1wbGluZyBpcyBzdGFydGVkIHN1Y2Nlc3NmdWxseS4gT3RoZXJ3aXNlIHJldHVybiBmYWxzZQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0U2FtcGxpbmdQYXJ0aXRpb25zKFN0cmluZyBrcywgU3RyaW5nIHRhYmxlLCBpbnQgZHVyYXRpb24sIGludCBpbnRlcnZhbCwgaW50IGNhcGFjaXR5LCBpbnQgY291bnQsIExpc3Q8U3RyaW5nPiBzYW1wbGVycykgdGhyb3dzIE9wZW5EYXRhRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU3RvcCBhIHNjaGVkdWxlZCBzYW1wbGluZworICAgICAqIEBwYXJhbSBrcyBLZXlzcGFjZS4gTnVsbGFibGUuIElmIG51bGwsIHRoZSBzY2hlZHVsZWQgc2FtcGxpbmcgaXMgb24gYWxsIGtleXNhcGNlcyBhbmQgdGFibGVzCisgICAgICogQHBhcmFtIHRhYmxlIE51bGxhYmxlLiBJZiBudWxsLCB0aGUgc2NoZWR1bGVkIHNhbXBsaW5nIGlzIG9uIGFsbCB0YWJsZXMgb2YgdGhlIHNwZWNpZmllZCBrZXlzcGFjZQorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2NoZWR1bGVkIHNhbXBsaW5nIGlzIHN0b3BwZWQuIEZhbHNlIGlzIHJldHVybmVkIGlmIHRoZSBzYW1wbGluZyB0YXNrIGlzIG5vdCBmb3VuZAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN0b3BTYW1wbGluZ1BhcnRpdGlvbnMoU3RyaW5nIGtzLCBTdHJpbmcgdGFibGUpIHRocm93cyBPcGVuRGF0YUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHF1YWxpZmllZCB0YWJsZSBuYW1lcyB0aGF0IGhhdmUgYWN0aXZlIHNjaGVkdWxlZCBzYW1wbGluZyB0YXNrcy4gVGhlIGZvcm1hdCBvZiB0aGUgbmFtZSBpcyBgS0VZU1BBQ0UuVEFCTEVgCisgICAgICogVGhlIHdpbGQgY2FyZCBzeW1ib2wgKCopIGluZGljYXRlcyBhbGwga2V5c3BhY2UvdGFibGUuIEZvciBleGFtcGxlLCAiKi4qIiBpbmRpY2F0ZXMgYWxsIHRhYmxlcyBpbiBhbGwga2V5c3BhY2VzLiAiZm9vLioiIGluZGljYXRlcworICAgICAqIGFsbCB0YWJsZXMgdW5kZXIga2V5c3BhY2UgJ2ZvbycuICJmb28uYmFyIiBpbmRpY2F0ZXMgdGhlIHNjaGVkdWxlZCBzYW1wbGluZyBpcyBlbmFibGVkIGZvciB0aGUgdGFibGUgJ2JhcicKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFNhbXBsZVRhc2tzKCk7CisKICAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmVkIHRyYWNpbmcgcHJvYmFiaWxpdHkuCiAgICAgICovCkBAIC04MzMsMjkgKzkzMCw3NCBAQAogICAgIC8qKiBTZXRzIHRoZSBudW1iZXIgb2Ygcm93cyBjYWNoZWQgYXQgdGhlIGNvb3JkaW5hdG9yIGJlZm9yZSBmaWx0ZXJpbmcvaW5kZXggcXVlcmllcyBmYWlsIG91dHJpZ2h0LiAqLwogICAgIHB1YmxpYyB2b2lkIHNldENhY2hlZFJlcGxpY2FSb3dzRmFpbFRocmVzaG9sZChpbnQgdGhyZXNob2xkKTsKIAotICAgIC8qKiBSZXR1cm5zIHRoZSBncmFudWxhcml0eSBvZiB0aGUgY29sbGF0aW9uIGluZGV4IG9mIHJvd3Mgd2l0aGluIGEgcGFydGl0aW9uICoqLworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGdyYW51bGFyaXR5IG9mIHRoZSBjb2xsYXRpb24gaW5kZXggb2Ygcm93cyB3aXRoaW4gYSBwYXJ0aXRpb24uCisgICAgICogLTEgc3RhbmRzIGZvciB0aGUgU1NUYWJsZSBmb3JtYXQncyBkZWZhdWx0LgorICAgICAqKi8KICAgICBwdWJsaWMgaW50IGdldENvbHVtbkluZGV4U2l6ZUluS2lCKCk7Ci0gICAgLyoqIFNldHMgdGhlIGdyYW51bGFyaXR5IG9mIHRoZSBjb2xsYXRpb24gaW5kZXggb2Ygcm93cyB3aXRoaW4gYSBwYXJ0aXRpb24gKiovCisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBncmFudWxhcml0eSBvZiB0aGUgY29sbGF0aW9uIGluZGV4IG9mIHJvd3Mgd2l0aGluIGEgcGFydGl0aW9uLgorICAgICAqIFVzZSAtMSB0byBzZWxlY3QgdGhlIFNTVGFibGUgZm9ybWF0J3MgZGVmYXVsdC4KKyAgICAgKiovCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoaW50IGNvbHVtbkluZGV4U2l6ZUluS2lCKTsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGdyYW51bGFyaXR5IG9mIHRoZSBjb2xsYXRpb24gaW5kZXggb2Ygcm93cyB3aXRoaW4gYSBwYXJ0aXRpb24KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIgaW5zdGVhZCBhcyBpdCB3aWxsIG5vdCB0aHJvdyBub24tc3RhbmRhcmQgZXhjZXB0aW9ucworICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhTaXplKGludCBjb2x1bW5JbmRleFNpemVJbktCKTsKIAotICAgIC8qKiBSZXR1cm5zIHRoZSB0aHJlc2hvbGQgZm9yIHNraXBwaW5nIHRoZSBjb2x1bW4gaW5kZXggd2hlbiBjYWNoaW5nIHBhcnRpdGlvbiBpbmZvICoqLworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRocmVzaG9sZCBmb3Igc2tpcHBpbmcgdGhlIGNvbHVtbiBpbmRleCB3aGVuIGNhY2hpbmcgcGFydGl0aW9uIGluZm8KKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQgorICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIGludCBnZXRDb2x1bW5JbmRleENhY2hlU2l6ZSgpOwotICAgIC8qKiBTZXRzIHRoZSB0aHJlc2hvbGQgZm9yIHNraXBwaW5nIHRoZSBjb2x1bW4gaW5kZXggd2hlbiBjYWNoaW5nIHBhcnRpdGlvbiBpbmZvICoqLworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGhyZXNob2xkIGZvciBza2lwcGluZyB0aGUgY29sdW1uIGluZGV4IHdoZW4gY2FjaGluZyBwYXJ0aXRpb24gaW5mbworICAgICAqIEBkZXByZWNhdGVkIHVzZSBzZXRDb2x1bW5JbmRleENhY2hlU2l6ZUluS2lCIGluc3RlYWQgYXMgaXQgd2lsbCBub3QgdGhyb3cgbm9uLXN0YW5kYXJkIGV4Y2VwdGlvbnMKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIHNldENvbHVtbkluZGV4Q2FjaGVTaXplKGludCBjYWNoZVNpemVJbktCKTsKIAorICAgIC8qKiBSZXR1cm5zIHRoZSB0aHJlc2hvbGQgZm9yIHNraXBwaW5nIHRoZSBjb2x1bW4gaW5kZXggd2hlbiBjYWNoaW5nIHBhcnRpdGlvbiBpbmZvICoqLworICAgIHB1YmxpYyBpbnQgZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQigpOworCisgICAgLyoqIFNldHMgdGhlIHRocmVzaG9sZCBmb3Igc2tpcHBpbmcgdGhlIGNvbHVtbiBpbmRleCB3aGVuIGNhY2hpbmcgcGFydGl0aW9uIGluZm8gKiovCisgICAgcHVibGljIHZvaWQgc2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQihpbnQgY2FjaGVTaXplSW5LaUIpOworCiAgICAgLyoqIFJldHVybnMgdGhlIHRocmVzaG9sZCBmb3IgcmVqZWN0aW5nIHF1ZXJpZXMgZHVlIHRvIGEgbGFyZ2UgYmF0Y2ggc2l6ZSAqLwogICAgIHB1YmxpYyBpbnQgZ2V0QmF0Y2hTaXplRmFpbHVyZVRocmVzaG9sZCgpOwogICAgIC8qKiBTZXRzIHRoZSB0aHJlc2hvbGQgZm9yIHJlamVjdGluZyBxdWVyaWVzIGR1ZSB0byBhIGxhcmdlIGJhdGNoIHNpemUgKi8KICAgICBwdWJsaWMgdm9pZCBzZXRCYXRjaFNpemVGYWlsdXJlVGhyZXNob2xkKGludCBiYXRjaFNpemVEZWJ1Z1RocmVzaG9sZCk7CiAKLSAgICAvKiogUmV0dXJucyB0aGUgdGhyZXNob2xkIGZvciB3YXJuaW5nIHF1ZXJpZXMgZHVlIHRvIGEgbGFyZ2UgYmF0Y2ggc2l6ZSAqLworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRocmVzaG9sZCBmb3Igd2FybmluZyBxdWVyaWVzIGR1ZSB0byBhIGxhcmdlIGJhdGNoIHNpemUKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZEluS2lCIGluc3RlYWQKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBpbnQgZ2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZCgpOwotICAgIC8qKiBTZXRzIHRoZSB0aHJlc2hvbGQgZm9yIHdhcm5pbmcgcXVlcmllcyBkdWUgdG8gYSBsYXJnZSBiYXRjaCBzaXplICovCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGhyZXNob2xkIGZvciB3YXJuaW5nIHF1ZXJpZXMgZHVlIHRvIGEgbGFyZ2UgYmF0Y2ggc2l6ZQorICAgICAqIEBkZXByZWNhdGVkIHVzZSBzZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIgaW5zdGVhZCBhcyBpdCB3aWxsIG5vdCB0aHJvdyBub24tc3RhbmRhcmQgZXhjZXB0aW9ucworICAgICAqLworICAgIEBEZXByZWNhdGVkCiAgICAgcHVibGljIHZvaWQgc2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZChpbnQgYmF0Y2hTaXplRGVidWdUaHJlc2hvbGQpOwogCisgICAgLyoqIFJldHVybnMgdGhlIHRocmVzaG9sZCBmb3Igd2FybmluZyBxdWVyaWVzIGR1ZSB0byBhIGxhcmdlIGJhdGNoIHNpemUgKi8KKyAgICBwdWJsaWMgaW50IGdldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGRJbktpQigpOworICAgIC8qKiBTZXRzIHRoZSB0aHJlc2hvbGQgZm9yIHdhcm5pbmcgcXVlcmllcyBkdWUgdG8gYSBsYXJnZSBiYXRjaCBzaXplICoqLworICAgIHB1YmxpYyB2b2lkIHNldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGRJbktpQihpbnQgYmF0Y2hTaXplRGVidWdUaHJlc2hvbGQpOworCiAgICAgLyoqIFNldHMgdGhlIGhpbnRlZCBoYW5kb2ZmIHRocm90dGxlIGluIEtpQiBwZXIgc2Vjb25kLCBwZXIgZGVsaXZlcnkgdGhyZWFkLiAqLwogICAgIHB1YmxpYyB2b2lkIHNldEhpbnRlZEhhbmRvZmZUaHJvdHRsZUluS0IoaW50IHRocm90dGxlSW5LQik7CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRUcmFuc2ZlckhpbnRzT25EZWNvbW1pc3Npb24oKTsKKyAgICBwdWJsaWMgdm9pZCBzZXRUcmFuc2ZlckhpbnRzT25EZWNvbW1pc3Npb24oYm9vbGVhbiBlbmFibGVkKTsKKwogICAgIC8qKgogICAgICAqIFJlc3VtZSBib290c3RyYXAgc3RyZWFtaW5nIHdoZW4gdGhlcmUgaXMgZmFpbGVkIGRhdGEgc3RyZWFtaW5nLgogICAgICAqCkBAIC0xMDQ2LDQgKzExODgsNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldE1pblRyYWNrZWRQYXJ0aXRpb25TaXplKFN0cmluZyB2YWx1ZSk7CiAgICAgcHVibGljIGxvbmcgZ2V0TWluVHJhY2tlZFBhcnRpdGlvblRvbWJzdG9uZUNvdW50KCk7CiAgICAgcHVibGljIHZvaWQgc2V0TWluVHJhY2tlZFBhcnRpdGlvblRvbWJzdG9uZUNvdW50KGxvbmcgdmFsdWUpOwotfQorCisgICAgcHVibGljIHZvaWQgc2V0U2tpcFN0cmVhbURpc2tTcGFjZUNoZWNrKGJvb2xlYW4gdmFsdWUpOworICAgIHB1YmxpYyBib29sZWFuIGdldFNraXBTdHJlYW1EaXNrU3BhY2VDaGVjaygpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvVHJ1bmNhdGVSZXNwb25zZUhhbmRsZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvVHJ1bmNhdGVSZXNwb25zZUhhbmRsZXIuamF2YQppbmRleCA5ODRiYTVhLi41NGIxMjQxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1RydW5jYXRlUmVzcG9uc2VIYW5kbGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9UcnVuY2F0ZVJlc3BvbnNlSGFuZGxlci5qYXZhCkBAIC0xNyw3ICsxNyw5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZTsKIAotaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIApAQCAtNDYsNyArNDgsNyBAQAogICAgIHByaXZhdGUgZmluYWwgaW50IHJlc3BvbnNlQ291bnQ7CiAgICAgcHJvdGVjdGVkIGZpbmFsIEF0b21pY0ludGVnZXIgcmVzcG9uc2VzID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHN0YXJ0OwotICAgIHByaXZhdGUgdm9sYXRpbGUgSW5ldEFkZHJlc3MgdHJ1bmNhdGVGYWlsaW5nUmVwbGljYTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIFJlcXVlc3RGYWlsdXJlUmVhc29uPiBmYWlsdXJlUmVhc29uQnlFbmRwb2ludCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CiAKICAgICBwdWJsaWMgVHJ1bmNhdGVSZXNwb25zZUhhbmRsZXIoaW50IHJlc3BvbnNlQ291bnQpCiAgICAgewpAQCAtNjEsMjQgKzYzLDMxIEBACiAgICAgcHVibGljIHZvaWQgZ2V0KCkgdGhyb3dzIFRpbWVvdXRFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGxvbmcgdGltZW91dE5hbm9zID0gZ2V0VHJ1bmNhdGVScGNUaW1lb3V0KE5BTk9TRUNPTkRTKSAtIChuYW5vVGltZSgpIC0gc3RhcnQpOwotICAgICAgICBib29sZWFuIGNvbXBsZXRlZEluVGltZTsKKyAgICAgICAgYm9vbGVhbiBzaWduYWxlZDsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbXBsZXRlZEluVGltZSA9IGNvbmRpdGlvbi5hd2FpdCh0aW1lb3V0TmFub3MsIE5BTk9TRUNPTkRTKTsgLy8gVE9ETyB0cnVuY2F0ZSBuZWVkcyBhIG11Y2ggbG9uZ2VyIHRpbWVvdXQKKyAgICAgICAgICAgIHNpZ25hbGVkID0gY29uZGl0aW9uLmF3YWl0KHRpbWVvdXROYW5vcywgTkFOT1NFQ09ORFMpOyAvLyBUT0RPIHRydW5jYXRlIG5lZWRzIGEgbXVjaCBsb25nZXIgdGltZW91dAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgVW5jaGVja2VkSW50ZXJydXB0ZWRFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWNvbXBsZXRlZEluVGltZSkKLSAgICAgICAgeworICAgICAgICBpZiAoIXNpZ25hbGVkKQogICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIlRydW5jYXRlIHRpbWVkIG91dCAtIHJlY2VpdmVkIG9ubHkgIiArIHJlc3BvbnNlcy5nZXQoKSArICIgcmVzcG9uc2VzIik7Ci0gICAgICAgIH0KIAotICAgICAgICBpZiAodHJ1bmNhdGVGYWlsaW5nUmVwbGljYSAhPSBudWxsKQorICAgICAgICBpZiAoIWZhaWx1cmVSZWFzb25CeUVuZHBvaW50LmlzRW1wdHkoKSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRydW5jYXRlRXhjZXB0aW9uKCJUcnVuY2F0ZSBmYWlsZWQgb24gcmVwbGljYSAiICsgdHJ1bmNhdGVGYWlsaW5nUmVwbGljYSk7CisgICAgICAgICAgICAvLyBjbG9uZSB0byBtYWtlIHN1cmUgbm8gcmFjZSBjb25kaXRpb24gaGFwcGVucworICAgICAgICAgICAgTWFwPEluZXRBZGRyZXNzQW5kUG9ydCwgUmVxdWVzdEZhaWx1cmVSZWFzb24+IGZhaWx1cmVSZWFzb25CeUVuZHBvaW50ID0gbmV3IEhhc2hNYXA8Pih0aGlzLmZhaWx1cmVSZWFzb25CeUVuZHBvaW50KTsKKyAgICAgICAgICAgIGlmIChSZXF1ZXN0Q2FsbGJhY2suaXNUaW1lb3V0KGZhaWx1cmVSZWFzb25CeUVuZHBvaW50KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigiVHJ1bmNhdGUgdGltZWQgb3V0IC0gcmVjZWl2ZWQgb25seSAiICsgcmVzcG9uc2VzLmdldCgpICsgIiByZXNwb25zZXMiKTsKKworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJUcnVuY2F0ZSBmYWlsZWQgb24gIik7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbmV0QWRkcmVzc0FuZFBvcnQsIFJlcXVlc3RGYWlsdXJlUmVhc29uPiBlIDogZmFpbHVyZVJlYXNvbkJ5RW5kcG9pbnQuZW50cnlTZXQoKSkKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoInJlcGxpY2EgIikuYXBwZW5kKGUuZ2V0S2V5KCkpLmFwcGVuZCgiIC0+ICIpLmFwcGVuZChlLmdldFZhbHVlKCkpLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIHNiLnNldExlbmd0aChzYi5sZW5ndGgoKSAtIDIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFRydW5jYXRlRXhjZXB0aW9uKHNiLnRvU3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05NCw3ICsxMDMsNyBAQAogICAgIHB1YmxpYyB2b2lkIG9uRmFpbHVyZShJbmV0QWRkcmVzc0FuZFBvcnQgZnJvbSwgUmVxdWVzdEZhaWx1cmVSZWFzb24gZmFpbHVyZVJlYXNvbikKICAgICB7CiAgICAgICAgIC8vIElmIHRoZSB0cnVuY2F0aW9uIGhhc24ndCBzdWNjZWVkZWQgb24gc29tZSByZXBsaWNhLCBhYm9ydCBhbmQgaW5kaWNhdGUgdGhpcyBiYWNrIHRvIHRoZSBjbGllbnQuCi0gICAgICAgIHRydW5jYXRlRmFpbGluZ1JlcGxpY2EgPSBmcm9tLmdldEFkZHJlc3MoKTsKKyAgICAgICAgZmFpbHVyZVJlYXNvbkJ5RW5kcG9pbnQucHV0KGZyb20sIGZhaWx1cmVSZWFzb24pOwogICAgICAgICBjb25kaXRpb24uc2lnbmFsQWxsKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BhZ2VyL1BhZ2luZ1N0YXRlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BhZ2VyL1BhZ2luZ1N0YXRlLmphdmEKaW5kZXggNmUxYTUyZi4uMzY5MWQxNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYWdlci9QYWdpbmdTdGF0ZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGFnZXIvUGFnaW5nU3RhdGUuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IGphdmEudXRpbC4qOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKQEAgLTEzMCw4ICsxMjksOCBAQAogICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIG91dCA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyRml4ZWQobW9kZXJuU2VyaWFsaXplZFNpemUoKSk7CiAgICAgICAgIHdyaXRlV2l0aFZJbnRMZW5ndGgobnVsbCA9PSBwYXJ0aXRpb25LZXkgPyBFTVBUWV9CWVRFX0JVRkZFUiA6IHBhcnRpdGlvbktleSwgb3V0KTsKICAgICAgICAgd3JpdGVXaXRoVkludExlbmd0aChudWxsID09IHJvd01hcmsgPyBFTVBUWV9CWVRFX0JVRkZFUiA6IHJvd01hcmsubWFyaywgb3V0KTsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHJlbWFpbmluZyk7Ci0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChyZW1haW5pbmdJblBhcnRpdGlvbik7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHJlbWFpbmluZyk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHJlbWFpbmluZ0luUGFydGl0aW9uKTsKICAgICAgICAgcmV0dXJuIG91dC5idWZmZXIoZmFsc2UpOwogICAgIH0KIApAQCAtMjA3LDggKzIwNiw4IEBACiAKICAgICAgICAgQnl0ZUJ1ZmZlciBwYXJ0aXRpb25LZXkgPSByZWFkV2l0aFZJbnRMZW5ndGgoaW4pOwogICAgICAgICBCeXRlQnVmZmVyIHJhd01hcmsgPSByZWFkV2l0aFZJbnRMZW5ndGgoaW4pOwotICAgICAgICBpbnQgcmVtYWluaW5nID0gSW50cy5jaGVja2VkQ2FzdChpbi5yZWFkVW5zaWduZWRWSW50KCkpOwotICAgICAgICBpbnQgcmVtYWluaW5nSW5QYXJ0aXRpb24gPSBJbnRzLmNoZWNrZWRDYXN0KGluLnJlYWRVbnNpZ25lZFZJbnQoKSk7CisgICAgICAgIGludCByZW1haW5pbmcgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKyAgICAgICAgaW50IHJlbWFpbmluZ0luUGFydGl0aW9uID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAKICAgICAgICAgcmV0dXJuIG5ldyBQYWdpbmdTdGF0ZShwYXJ0aXRpb25LZXkuaGFzUmVtYWluaW5nKCkgPyBwYXJ0aXRpb25LZXkgOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd01hcmsuaGFzUmVtYWluaW5nKCkgPyBuZXcgUm93TWFyayhyYXdNYXJrLCBwcm90b2NvbFZlcnNpb24pIDogbnVsbCwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3MuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3MuamF2YQppbmRleCBiZjVmOTBlLi5hY2M2MjY3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL1BheG9zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvcy5qYXZhCkBAIC00OCw2ICs0OCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhTGF5b3V0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYUxheW91dC5Gb3JUb2tlbldyaXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYVBsYW4uRm9yUmVhZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudFJlcXVlc3RTaXplTWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CkBAIC05OSw2ICsxMDAsOCBAQAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlNYXA7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk5BTk9TRUNPTkRTOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5TRUNPTkRTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBWE9TX0xPR19UVExfTElORUFSSVpBQklMSVRZX1ZJT0xBVElPTlM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfTU9ERVJOX1JFTEVBU0U7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcuUGF4b3NWYXJpYW50LnYyX3dpdGhvdXRfbGluZWFyaXphYmxlX3JlYWRzX29yX3JlamVjdGVkX3dyaXRlczsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2Uub3BlbkFuZEdldFN0b3JlOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlcXVlc3RGYWlsdXJlUmVhc29uLlRJTUVPVVQ7CkBAIC0yMTMsOCArMjE2LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGF4b3MuY2xhc3MpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgQ29uZmlnLlBheG9zVmFyaWFudCBQQVhPU19WQVJJQU5UID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBheG9zVmFyaWFudCgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENhc3NhbmRyYVZlcnNpb24gTU9ERVJOX1BBWE9TX1JFTEVBU0UgPSBuZXcgQ2Fzc2FuZHJhVmVyc2lvbihTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5wYXhvcy5tb2Rlcm5fcmVsZWFzZSIsICI0LjEiKSk7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9HX1RUTF9MSU5FQVJJWkFCSUxJVFlfVklPTEFUSU9OUyA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnBheG9zLmxvZ190dGxfbGluZWFyaXphYmlsaXR5X3Zpb2xhdGlvbnMiLCAidHJ1ZSIpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDYXNzYW5kcmFWZXJzaW9uIE1PREVSTl9QQVhPU19SRUxFQVNFID0gbmV3IENhc3NhbmRyYVZlcnNpb24oUEFYT1NfTU9ERVJOX1JFTEVBU0UuZ2V0U3RyaW5nKCkpOworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIExPR19UVExfTElORUFSSVpBQklMSVRZX1ZJT0xBVElPTlMgPSBQQVhPU19MT0dfVFRMX0xJTkVBUklaQUJJTElUWV9WSU9MQVRJT05TLmdldEJvb2xlYW4oKTsKIAogICAgIHN0YXRpYyBjbGFzcyBFbGVjdG9yYXRlIGltcGxlbWVudHMgSXRlcmFibGU8SW5ldEFkZHJlc3NBbmRQb3J0PgogICAgIHsKQEAgLTcwOSw2ICs3MTIsOSBAQAogICAgICAgICAgICAgICAgICAgICAvLyBUT0RPICJ0dXJuIG51bGwgdXBkYXRlcyBpbnRvIGRlbGV0ZT8iIC0gd2hhdCBkb2VzIHRoaXMgVE9ETyBldmVuIG1lYW4/CiAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvblVwZGF0ZSB1cGRhdGVzID0gcmVxdWVzdC5tYWtlVXBkYXRlcyhjdXJyZW50LCBjbGllbnRTdGF0ZSwgYmVnaW4uYmFsbG90KTsKIAorICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG1ldHJpY3MgYmVmb3JlIHRyaWdnZXJzIHBvdGVudGlhbGx5IGFkZCBtdXRhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy5yZWNvcmRSb3dBbmRDb2x1bW5Db3VudE1ldHJpY3ModXBkYXRlcyk7CisKICAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgdHJpZ2dlcnMgdG8gY2FzIHVwZGF0ZXMuIEEgY29uc2lkZXJhdGlvbiBoZXJlIGlzIHRoYXQKICAgICAgICAgICAgICAgICAgICAgLy8gdHJpZ2dlcnMgZW1pdCBNdXRhdGlvbnMsIGFuZCBzbyBhIGdpdmVuIHRyaWdnZXIgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgICAgICAgICAgLy8gbWF5IGdlbmVyYXRlIG11dGF0aW9ucyBmb3IgcGFydGl0aW9ucyBvdGhlciB0aGFuIHRoZSBvbmUgdGhpcwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc0NvbW1pdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc0NvbW1pdC5qYXZhCmluZGV4IDQzMjFmYzkuLjQzZjlkZDEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3NDb21taXQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL1BheG9zQ29tbWl0LmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db25zaXN0ZW5jeUxldmVsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLk11dGF0aW9uOwpAQCAtNTcsNyArNTgsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUmVxdWVzdEhhbmRsZXIgcmVxdWVzdEhhbmRsZXIgPSBuZXcgUmVxdWVzdEhhbmRsZXIoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGF4b3NDb21taXQuY2xhc3MpOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBFTkFCTEVfRENfTE9DQUxfQ09NTUlUID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEuZW5hYmxlX2RjX2xvY2FsX2NvbW1pdCIsICJ0cnVlIikpOworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gRU5BQkxFX0RDX0xPQ0FMX0NPTU1JVCA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5FTkFCTEVfRENfTE9DQUxfQ09NTUlULmdldEJvb2xlYW4oKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRFbmFibGVEY0xvY2FsQ29tbWl0KCkKICAgICB7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL1BheG9zUmVwYWlyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL1BheG9zUmVwYWlyLmphdmEKaW5kZXggZDg4MzIzYy4uOGFlOGViZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1JlcGFpci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3NSZXBhaXIuamF2YQpAQCAtNjUsNiArNjUsNyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfUkVQQUlSX1JFVFJZX1RJTUVPVVRfSU5fTVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU0tJUF9QQVhPU19SRVBBSVJfVkVSU0lPTl9WQUxJREFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlcXVlc3RGYWlsdXJlUmVhc29uLlVOS05PV047CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiLlBBWE9TMl9SRVBBSVJfUkVROwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5OQU5PU0VDT05EUzsKQEAgLTYzNCw3ICs2MzUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBTS0lQX1ZFUlNJT05fVkFMSURBVElPTiA9IEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLnNraXBfcGF4b3NfcmVwYWlyX3ZlcnNpb25fdmFsaWRhdGlvbiIpOworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gU0tJUF9WRVJTSU9OX1ZBTElEQVRJT04gPSBTS0lQX1BBWE9TX1JFUEFJUl9WRVJTSU9OX1ZBTElEQVRJT04uZ2V0Qm9vbGVhbigpOwogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFNraXBQYXhvc1JlcGFpckNvbXBhdGliaWxpdHlDaGVjayhib29sZWFuIHYpCiAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1JlcGFpckhpc3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3NSZXBhaXJIaXN0b3J5LmphdmEKaW5kZXggMTYyN2ZkYi4uZDk1NDZkNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1JlcGFpckhpc3RvcnkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL1BheG9zUmVwYWlySGlzdG9yeS5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVCdWZmZXJBY2Nlc3NvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlR1cGxlVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CkBAIC0xODAsNyArMTgxLDcgQEAKICAgICAgICAgQmFsbG90W10gYmFsbG90TG93Qm91bmRzID0gbmV3IEJhbGxvdFt0dXBsZXMuc2l6ZSgpXTsKICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgdHVwbGVzLnNpemUoKSA7ICsraSkKICAgICAgICAgewotICAgICAgICAgICAgQnl0ZUJ1ZmZlcltdIHNwbGl0ID0gVFlQRS5zcGxpdCh0dXBsZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSBzcGxpdCA9IFRZUEUuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB0dXBsZXMuZ2V0KGkpKTsKICAgICAgICAgICAgIGlmIChpIDwgdG9rZW5JbmNsdXNpdmVVcHBlckJvdW5kcy5sZW5ndGgpCiAgICAgICAgICAgICAgICAgdG9rZW5JbmNsdXNpdmVVcHBlckJvdW5kc1tpXSA9IFRPS0VOX0ZBQ1RPUlkuZnJvbUJ5dGVBcnJheShzcGxpdFswXSk7CiAgICAgICAgICAgICBiYWxsb3RMb3dCb3VuZHNbaV0gPSBCYWxsb3QuZGVzZXJpYWxpemUoc3BsaXRbMV0pOwpAQCAtMzE0LDcgKzMxNSw3IEBACiAgICAgewogICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoUGF4b3NSZXBhaXJIaXN0b3J5IGhpc3RvcnksIERhdGFPdXRwdXRQbHVzIG91dCwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoaGlzdG9yeS5zaXplKCkpOworICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoaGlzdG9yeS5zaXplKCkpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoaXN0b3J5LnNpemUoKSA7ICsraSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBUb2tlbi5zZXJpYWxpemVyLnNlcmlhbGl6ZShoaXN0b3J5LnRva2VuSW5jbHVzaXZlVXBwZXJCb3VuZFtpXSwgb3V0LCB2ZXJzaW9uKTsKQEAgLTMyNSw3ICszMjYsNyBAQAogCiAgICAgICAgIHB1YmxpYyBQYXhvc1JlcGFpckhpc3RvcnkgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBzaXplID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgICAgICBUb2tlbltdIHRva2VuSW5jbHVzaXZlVXBwZXJCb3VuZHMgPSBuZXcgVG9rZW5bc2l6ZV07CiAgICAgICAgICAgICBCYWxsb3RbXSBiYWxsb3RMb3dCb3VuZHMgPSBuZXcgQmFsbG90W3NpemUgKyAxXTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1JlcXVlc3RDYWxsYmFjay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1JlcXVlc3RDYWxsYmFjay5qYXZhCmluZGV4IDI4MmFlYjIuLmFhZDMyYWMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3NSZXF1ZXN0Q2FsbGJhY2suamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL1BheG9zUmVxdWVzdENhbGxiYWNrLmphdmEKQEAgLTM3LDcgKzM3LDcgQEAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYXhvc1JlcXVlc3RDYWxsYmFjazxUPiBleHRlbmRzIEZhaWx1cmVSZWNvcmRpbmdDYWxsYmFjazxUPgogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQYXhvc1JlcXVlc3RDYWxsYmFjay5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBVU0VfU0VMRl9FWEVDVVRJT04gPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfRVhFQ1VURV9PTl9TRUxGLmdldEJvb2xlYW4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9TRUxGX0VYRUNVVElPTiA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5QQVhPU19VU0VfU0VMRl9FWEVDVVRJT04uZ2V0Qm9vbGVhbigpOwogCiAgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25SZXNwb25zZShUIHJlc3BvbnNlLCBJbmV0QWRkcmVzc0FuZFBvcnQgZnJvbSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3NTdGF0ZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1N0YXRlLmphdmEKaW5kZXggZTgwMmNkMC4uMjJmMDY0ZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1N0YXRlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1N0YXRlLmphdmEKQEAgLTUwLDYgKzUwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5OZW1lc2lzOwogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0LlNFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfRElTQUJMRV9DT09SRElOQVRPUl9MT0NLSU5HOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcuUGF4b3NTdGF0ZVB1cmdpbmcuZ2NfZ3JhY2U7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcuUGF4b3NTdGF0ZVB1cmdpbmcubGVnYWN5OwpAQCAtNjYsNyArNjcsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgUGF4b3NTdGF0ZSBpbXBsZW1lbnRzIFBheG9zT3BlcmF0aW9uTG9jawogewotICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gRElTQUJMRV9DT09SRElOQVRPUl9MT0NLSU5HID0gQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEucGF4b3MuZGlzYWJsZV9jb29yZGluYXRvcl9sb2NraW5nIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBESVNBQkxFX0NPT1JESU5BVE9SX0xPQ0tJTkcgPSBQQVhPU19ESVNBQkxFX0NPT1JESU5BVE9SX0xPQ0tJTkcuZ2V0Qm9vbGVhbigpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8S2V5LCBQYXhvc1N0YXRlPiBBQ1RJVkUgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPEtleSwgU25hcHNob3Q+IFJFQ0VOVCA9IENhZmZlaW5lLm5ld0J1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heGltdW1XZWlnaHQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBheG9zQ2FjaGVTaXplSW5NaUIoKSA8PCAyMCkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvY2xlYW51cC9QYXhvc0NsZWFudXBTZXNzaW9uLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL2NsZWFudXAvUGF4b3NDbGVhbnVwU2Vzc2lvbi5qYXZhCmluZGV4IDNkNzY1ZWEuLjVmMWVlYTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvY2xlYW51cC9QYXhvc0NsZWFudXBTZXNzaW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9jbGVhbnVwL1BheG9zQ2xlYW51cFNlc3Npb24uamF2YQpAQCAtNDMsNiArNDMsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQXN5bmNGdXR1cmU7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5QQVhPU19DTEVBTlVQX1NFU1NJT05fVElNRU9VVF9TRUNPTkRTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi5QQVhPUzJfQ0xFQU5VUF9SRVE7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIApAQCAtNTYsNyArNTcsNyBAQAogICAgIHN0YXRpYyBmaW5hbCBsb25nIFRJTUVPVVRfTkFOT1M7CiAgICAgc3RhdGljCiAgICAgewotICAgICAgICBsb25nIHRpbWVvdXRTZWNvbmRzID0gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEucGF4b3NfY2xlYW51cF9zZXNzaW9uX3RpbWVvdXRfc2Vjb25kcyIsIChpbnQpIFRpbWVVbml0LkhPVVJTLnRvU2Vjb25kcygyKSk7CisgICAgICAgIGxvbmcgdGltZW91dFNlY29uZHMgPSBQQVhPU19DTEVBTlVQX1NFU1NJT05fVElNRU9VVF9TRUNPTkRTLmdldExvbmcoKTsKICAgICAgICAgVElNRU9VVF9OQU5PUyA9IFRpbWVVbml0LlNFQ09ORFMudG9OYW5vcyh0aW1lb3V0U2Vjb25kcyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL3VuY29tbWl0dGVkL1BheG9zU3RhdGVUcmFja2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL3VuY29tbWl0dGVkL1BheG9zU3RhdGVUcmFja2VyLmphdmEKaW5kZXggZDM1OTRiMy4uNTE0Y2UxNSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy91bmNvbW1pdHRlZC9QYXhvc1N0YXRlVHJhY2tlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvdW5jb21taXR0ZWQvUGF4b3NTdGF0ZVRyYWNrZXIuamF2YQpAQCAtNTMsNiArNTMsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb3NlYWJsZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRk9SQ0VfUEFYT1NfU1RBVEVfUkVCVUlMRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TS0lQX1BBWE9TX1NUQVRFX1JFQlVJTEQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVFJVTkNBVEVfQkFMTE9UX01FVEFEQVRBOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TeXN0ZW1LZXlzcGFjZS5QQVhPU19SRVBBSVJfSElTVE9SWTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRTsKIApAQCAtNjMsMjcgKzY2LDIzIEBACiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFBheG9zU3RhdGVUcmFja2VyLmNsYXNzKTsKIAotICAgIC8vIHdoZW4gc3RhcnRpbmcgd2l0aCBubyBkYXRhLCBza2lwIHJlYnVpbGRpbmcgdW5jb21taXR0ZWQgZGF0YSBmcm9tIHRoZSBwYXhvcyB0YWJsZQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9SRUJVSUxEX1BST1AgPSAiY2Fzc2FuZHJhLnNraXBfcGF4b3Nfc3RhdGVfcmVidWlsZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JDRV9SRUJVSUxEX1BST1AgPSAiY2Fzc2FuZHJhLmZvcmNlX3BheG9zX3N0YXRlX3JlYnVpbGQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVTkNBVEVfQkFMTE9UX01FVEFEQVRBX1BST1AgPSAiY2Fzc2FuZHJhLnRydW5jYXRlX2JhbGxvdF9tZXRhZGF0YSI7Ci0KKyAgICAvKiogd2hlbiBzdGFydGluZyB3aXRoIG5vIGRhdGEsIHNraXAgcmVidWlsZGluZyB1bmNvbW1pdHRlZCBkYXRhIGZyb20gdGhlIHBheG9zIHRhYmxlLiAqLwogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2tpcFJlYnVpbGQoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIEJvb2xlYW4uZ2V0Qm9vbGVhbihTS0lQX1JFQlVJTERfUFJPUCk7CisgICAgICAgIHJldHVybiBTS0lQX1BBWE9TX1NUQVRFX1JFQlVJTEQuZ2V0Qm9vbGVhbigpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZm9yY2VSZWJ1aWxkKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBCb29sZWFuLmdldEJvb2xlYW4oRk9SQ0VfUkVCVUlMRF9QUk9QKTsKKyAgICAgICAgcmV0dXJuIEZPUkNFX1BBWE9TX1NUQVRFX1JFQlVJTEQuZ2V0Qm9vbGVhbigpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHJ1bmNhdGVCYWxsb3RNZXRhZGF0YSgpCiAgICAgewotICAgICAgICByZXR1cm4gQm9vbGVhbi5nZXRCb29sZWFuKFRSVU5DQVRFX0JBTExPVF9NRVRBREFUQV9QUk9QKTsKKyAgICAgICAgcmV0dXJuIFRSVU5DQVRFX0JBTExPVF9NRVRBREFUQS5nZXRCb29sZWFuKCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVE9SWSA9ICJzeXN0ZW0vX3BheG9zX3JlcGFpcl9zdGF0ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVE9SWSA9ICJzeXN0ZW0vIiArIFN5c3RlbUtleXNwYWNlLlBBWE9TX1JFUEFJUl9TVEFURTsKIAogICAgIHByaXZhdGUgZmluYWwgUGF4b3NVbmNvbW1pdHRlZFRyYWNrZXIgdW5jb21taXR0ZWQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBQYXhvc0JhbGxvdFRyYWNrZXIgYmFsbG90czsKQEAgLTEzMCw4ICsxMjksOCBAQAogICAgICAgICBib29sZWFuIHJlYnVpbGROZWVkZWQgPSAhaGFzRXhpc3RpbmdEYXRhIHx8IGZvcmNlUmVidWlsZCgpOwogCiAgICAgICAgIGlmICh0cnVuY2F0ZUJhbGxvdE1ldGFkYXRhKCkgJiYgIXJlYnVpbGROZWVkZWQpCi0gICAgICAgICAgICBsb2dnZXIud2Fybigie30gd2FzIHNldCwgYnV0IHt9IHdhcyBub3QgYW5kIG5vIHJlYnVpbGQgaXMgcmVxdWlyZWQuIEJhbGxvdCBkYXRhIHdpbGwgbm90IGJlIHRydW5jYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBUUlVOQ0FURV9CQUxMT1RfTUVUQURBVEFfUFJPUCwgRk9SQ0VfUkVCVUlMRF9QUk9QKTsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJ7fSB3YXMgc2V0IHRvIHRydWUsIGJ1dCB7fSB3YXMgbm90IGFuZCBubyByZWJ1aWxkIGlzIHJlcXVpcmVkLiBCYWxsb3QgZGF0YSB3aWxsIG5vdCBiZSB0cnVuY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgVFJVTkNBVEVfQkFMTE9UX01FVEFEQVRBLmdldEtleSgpLCBGT1JDRV9QQVhPU19TVEFURV9SRUJVSUxELmdldEtleSgpKTsKIAogICAgICAgICBpZiAocmVidWlsZE5lZWRlZCkKICAgICAgICAgewpAQCAtMTY0LDcgKzE2Myw3IEBACiAgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKICAgICBwcml2YXRlIHZvaWQgcmVidWlsZFVuY29tbWl0dGVkRGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgbG9nZ2VyLmluZm8oIkJlZ2lubmluZyB1bmNvbW1pdHRlZCBwYXhvcyBkYXRhIHJlYnVpbGQuIFNldCAtRGNhc3NhbmRyYS5za2lwX3BheG9zX3N0YXRlX3JlYnVpbGQ9dHJ1ZSBhbmQgcmVzdGFydCB0byBza2lwIik7CisgICAgICAgIGxvZ2dlci5pbmZvKCJCZWdpbm5pbmcgdW5jb21taXR0ZWQgcGF4b3MgZGF0YSByZWJ1aWxkLiBTZXQgLUR7fT10cnVlIGFuZCByZXN0YXJ0IHRvIHNraXAiLCBTS0lQX1BBWE9TX1NUQVRFX1JFQlVJTEQuZ2V0S2V5KCkpOwogCiAgICAgICAgIFN0cmluZyBxdWVyeVN0ciA9ICJTRUxFQ1QgKiBGUk9NICIgKyBTWVNURU1fS0VZU1BBQ0VfTkFNRSArICcuJyArIFN5c3RlbUtleXNwYWNlLlBBWE9TOwogICAgICAgICBTZWxlY3RTdGF0ZW1lbnQgc3RtdCA9IChTZWxlY3RTdGF0ZW1lbnQpIFF1ZXJ5UHJvY2Vzc29yLnBhcnNlU3RhdGVtZW50KHF1ZXJ5U3RyKS5wcmVwYXJlKENsaWVudFN0YXRlLmZvckludGVybmFsQ2FsbHMoKSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL3VuY29tbWl0dGVkL1BheG9zVW5jb21taXR0ZWRJbmRleC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy91bmNvbW1pdHRlZC9QYXhvc1VuY29tbWl0dGVkSW5kZXguamF2YQppbmRleCA1ZTNiNTQwLi5iMDM3MDFkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL3VuY29tbWl0dGVkL1BheG9zVW5jb21taXR0ZWRJbmRleC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvdW5jb21taXR0ZWQvUGF4b3NVbmNvbW1pdHRlZEluZGV4LmphdmEKQEAgLTE4LDcgKzE4LDEyIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy51bmNvbW1pdHRlZDsKIAotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwpAQCAtMjksMTMgKzM0LDI0IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuT3BlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EYXRhUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SYW5nZVRvbWJzdG9uZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWFkQ29tbWFuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWd1bGFyQW5kU3RhdGljQ29sdW1uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TeXN0ZW1LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Xcml0ZUNvbnRleHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuUm93RmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5WaWV3OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlBhcnRpdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uVXBkYXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwpAQCAtNDMsMTQgKzU5LDE0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXg7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXhSZWdpc3RyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC50cmFuc2FjdGlvbnMuSW5kZXhUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuSW5kZXhNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuSW5kZXhlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9zZWFibGVJdGVyYXRvcjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuKjsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Q7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuUGF4b3NTdGF0ZS5iYWxsb3RUcmFja2VyOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLlBheG9zU3RhdGUudW5jb21taXR0ZWRUcmFja2VyOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy91bmNvbW1pdHRlZC9QYXhvc1VuY29tbWl0dGVkVHJhY2tlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy91bmNvbW1pdHRlZC9QYXhvc1VuY29tbWl0dGVkVHJhY2tlci5qYXZhCmluZGV4IDc3MTJjNzkuLmFlNDY2MmYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvdW5jb21taXR0ZWQvUGF4b3NVbmNvbW1pdHRlZFRyYWNrZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL3VuY29tbWl0dGVkL1BheG9zVW5jb21taXR0ZWRUcmFja2VyLmphdmEKQEAgLTQ5LDYgKzQ5LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLmNsZWFudXAuUGF4b3NUYWJsZVJlcGFpcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvc2VhYmxlSXRlcmF0b3I7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BVVRPX1JFUEFJUl9GUkVRVUVOQ1lfU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESVNBQkxFX1BBWE9TX0FVVE9fUkVQQUlSUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESVNBQkxFX1BBWE9TX1NUQVRFX0ZMVVNIOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yLnBheG9zUmVwYWlyRW5hYmxlZDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy51bmNvbW1pdHRlZC5QYXhvc0tleVN0YXRlLm1lcmdlVW5jb21taXR0ZWQ7CiAKQEAgLTY5LDggKzcyLDggQEAKIAogICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIFVwZGF0ZVN1cHBsaWVyIHVwZGF0ZVN1cHBsaWVyOwogCi0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGF1dG9SZXBhaXJzRW5hYmxlZCA9ICFCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5kaXNhYmxlX3BheG9zX2F1dG9fcmVwYWlycyIpOwotICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzdGF0ZUZsdXNoRW5hYmxlZCA9ICFCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5kaXNhYmxlX3BheG9zX3N0YXRlX2ZsdXNoIik7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGF1dG9SZXBhaXJzRW5hYmxlZCA9ICFESVNBQkxFX1BBWE9TX0FVVE9fUkVQQUlSUy5nZXRCb29sZWFuKCk7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHN0YXRlRmx1c2hFbmFibGVkID0gIURJU0FCTEVfUEFYT1NfU1RBVEVfRkxVU0guZ2V0Qm9vbGVhbigpOwogCiAgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0ZWQgPSBmYWxzZTsKICAgICBwcml2YXRlIGJvb2xlYW4gYXV0b1JlcGFpclN0YXJ0ZWQgPSBmYWxzZTsKQEAgLTMyNyw3ICszMzAsNyBAQAogICAgIHsKICAgICAgICAgaWYgKGF1dG9SZXBhaXJTdGFydGVkKQogICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpbnQgc2Vjb25kcyA9IEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLmF1dG9fcmVwYWlyX2ZyZXF1ZW5jeV9zZWNvbmRzIiwgKGludCkgVGltZVVuaXQuTUlOVVRFUy50b1NlY29uZHMoNSkpOworICAgICAgICBpbnQgc2Vjb25kcyA9IEFVVE9fUkVQQUlSX0ZSRVFVRU5DWV9TRUNPTkRTLmdldEludCgpOwogICAgICAgICBTY2hlZHVsZWRFeGVjdXRvcnMuc2NoZWR1bGVkVGFza3Muc2NoZWR1bGVBdEZpeGVkUmF0ZSh0aGlzOjptYWludGVuYW5jZSwgc2Vjb25kcywgc2Vjb25kcywgVGltZVVuaXQuU0VDT05EUyk7CiAgICAgICAgIGF1dG9SZXBhaXJTdGFydGVkID0gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL1JlYWRDYWxsYmFjay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9yZWFkcy9SZWFkQ2FsbGJhY2suamF2YQppbmRleCBlNjllNmJkLi5jMjViMWYwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL1JlYWRDYWxsYmFjay5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcmVhZHMvUmVhZENhbGxiYWNrLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnJlYWRzOwogCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKQEAgLTEyMCw2ICsxMjEsMTIgQEAKICAgICAgICAgICovCiAgICAgICAgIGludCByZWNlaXZlZCA9IHJlc29sdmVyLnJlc3BvbnNlcy5zaXplKCk7CiAgICAgICAgIGJvb2xlYW4gZmFpbGVkID0gZmFpbHVyZXMgPiAwICYmIChibG9ja0ZvciA+IHJlY2VpdmVkIHx8ICFyZXNvbHZlci5pc0RhdGFQcmVzZW50KCkpOworICAgICAgICAvLyBJZiBhbGwgbWVzc2FnZXMgY2FtZSBiYWNrIGFzIGEgVElNRU9VVCB0aGVuIHNpZ25hbGVkPXRydWUgYW5kIGZhaWxlZD10cnVlLgorICAgICAgICAvLyBOZWVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gYSB0aW1lb3V0IGFuZCBhIGZhaWx1cmUgKG5ldHdvcmssIGJhZCBkYXRhLCBldGMuKSwgc28gc3RvcmUgYW4gZXh0cmEgZmllbGQuCisgICAgICAgIC8vIHNlZSBDQVNTQU5EUkEtMTc4MjgKKyAgICAgICAgYm9vbGVhbiB0aW1lZG91dCA9ICFzaWduYWxlZDsKKyAgICAgICAgaWYgKGZhaWxlZCkKKyAgICAgICAgICAgIHRpbWVkb3V0ID0gUmVxdWVzdENhbGxiYWNrLmlzVGltZW91dChuZXcgSGFzaE1hcDw+KGZhaWx1cmVSZWFzb25CeUVuZHBvaW50KSk7CiAgICAgICAgIFdhcm5pbmdDb250ZXh0IHdhcm5pbmdzID0gd2FybmluZ0NvbnRleHQ7CiAgICAgICAgIC8vIHNhdmUgdGhlIHNuYXBzaG90IHNvIGFib3J0IHN0YXRlIGlzIG5vdCBjaGFuZ2VkIGJldHdlZW4gbm93IGFuZCB3aGVuIG1heUFib3J0IGdldHMgY2FsbGVkCiAgICAgICAgIFdhcm5pbmdzU25hcHNob3Qgc25hcHNob3QgPSBudWxsOwpAQCAtMTM4LDE5ICsxNDUsMTkgQEAKICAgICAgICAgaWYgKGlzVHJhY2luZygpKQogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmcgZ290RGF0YSA9IHJlY2VpdmVkID4gMCA/IChyZXNvbHZlci5pc0RhdGFQcmVzZW50KCkgPyAiIChpbmNsdWRpbmcgZGF0YSkiIDogIiAob25seSBkaWdlc3RzKSIpIDogIiI7Ci0gICAgICAgICAgICBUcmFjaW5nLnRyYWNlKCJ7fTsgcmVjZWl2ZWQge30gb2Yge30gcmVzcG9uc2Vze30iLCBmYWlsZWQgPyAiRmFpbGVkIiA6ICJUaW1lZCBvdXQiLCByZWNlaXZlZCwgYmxvY2tGb3IsIGdvdERhdGEpOworICAgICAgICAgICAgVHJhY2luZy50cmFjZSgie307IHJlY2VpdmVkIHt9IG9mIHt9IHJlc3BvbnNlc3t9IiwgIXRpbWVkb3V0ID8gIkZhaWxlZCIgOiAiVGltZWQgb3V0IiwgcmVjZWl2ZWQsIGJsb2NrRm9yLCBnb3REYXRhKTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChsb2dnZXIuaXNEZWJ1Z0VuYWJsZWQoKSkKICAgICAgICAgewogICAgICAgICAgICAgU3RyaW5nIGdvdERhdGEgPSByZWNlaXZlZCA+IDAgPyAocmVzb2x2ZXIuaXNEYXRhUHJlc2VudCgpID8gIiAoaW5jbHVkaW5nIGRhdGEpIiA6ICIgKG9ubHkgZGlnZXN0cykiKSA6ICIiOwotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJ7fTsgcmVjZWl2ZWQge30gb2Yge30gcmVzcG9uc2Vze30iLCBmYWlsZWQgPyAiRmFpbGVkIiA6ICJUaW1lZCBvdXQiLCByZWNlaXZlZCwgYmxvY2tGb3IsIGdvdERhdGEpOworICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJ7fTsgcmVjZWl2ZWQge30gb2Yge30gcmVzcG9uc2Vze30iLCAhdGltZWRvdXQgPyAiRmFpbGVkIiA6ICJUaW1lZCBvdXQiLCByZWNlaXZlZCwgYmxvY2tGb3IsIGdvdERhdGEpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHNuYXBzaG90ICE9IG51bGwpCiAgICAgICAgICAgICBzbmFwc2hvdC5tYXliZUFib3J0KGNvbW1hbmQsIHJlcGxpY2FQbGFuKCkuY29uc2lzdGVuY3lMZXZlbCgpLCByZWNlaXZlZCwgYmxvY2tGb3IsIHJlc29sdmVyLmlzRGF0YVByZXNlbnQoKSwgZmFpbHVyZVJlYXNvbkJ5RW5kcG9pbnQpOwogCiAgICAgICAgIC8vIFNhbWUgYXMgZm9yIHdyaXRlcywgc2VlIEFic3RyYWN0V3JpdGVSZXNwb25zZUhhbmRsZXIKLSAgICAgICAgdGhyb3cgZmFpbGVkCisgICAgICAgIHRocm93ICF0aW1lZG91dAogICAgICAgICAgICAgPyBuZXcgUmVhZEZhaWx1cmVFeGNlcHRpb24ocmVwbGljYVBsYW4oKS5jb25zaXN0ZW5jeUxldmVsKCksIHJlY2VpdmVkLCBibG9ja0ZvciwgcmVzb2x2ZXIuaXNEYXRhUHJlc2VudCgpLCBmYWlsdXJlUmVhc29uQnlFbmRwb2ludCkKICAgICAgICAgICAgIDogbmV3IFJlYWRUaW1lb3V0RXhjZXB0aW9uKHJlcGxpY2FQbGFuKCkuY29uc2lzdGVuY3lMZXZlbCgpLCByZWNlaXZlZCwgYmxvY2tGb3IsIHJlc29sdmVyLmlzRGF0YVByZXNlbnQoKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9yZWFkcy9yYW5nZS9SYW5nZUNvbW1hbmRzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL3JhbmdlL1JhbmdlQ29tbWFuZHMuamF2YQppbmRleCA1YjY1NmQ3Li4xYzVjZTdmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL3JhbmdlL1JhbmdlQ29tbWFuZHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL3JhbmdlL1JhbmdlQ29tbWFuZHMuamF2YQpAQCAtMjEsNiArMjEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29uc2lzdGVuY3lMZXZlbDsKQEAgLTQ5LDggKzUwLDcgQEAKICAgICAgKiBkb24ndCB3YW50IGEgYnVyc3Qgb2YgcmFuZ2UgcmVxdWVzdHMgdGhhdCB3aWxsIGJhY2sgdXAsIGh1cnRpbmcgYWxsIG90aGVyIHF1ZXJpZXMuIEF0IHRoZSBzYW1lIHRpbWUsCiAgICAgICogd2Ugd2FudCB0byBnaXZlIHJhbmdlIHF1ZXJpZXMgYSBjaGFuY2UgdG8gcnVuIGlmIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQ09OQ1VSUkVOVF9SQU5HRV9SRVFVRVNUUyA9IE1hdGgubWF4KDEsIEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLm1heF9jb25jdXJyZW50X3JhbmdlX3JlcXVlc3RzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMuZ2V0QXZhaWxhYmxlUHJvY2Vzc29ycygpICogMTApKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPTkNVUlJFTlRfUkFOR0VfUkVRVUVTVFMgPSBNYXRoLm1heCgxLCBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTUFYX0NPTkNVUlJFTlRfUkFOR0VfUkVRVUVTVFMuZ2V0SW50KEZCVXRpbGl0aWVzLmdldEF2YWlsYWJsZVByb2Nlc3NvcnMoKSAqIDEwKSk7CiAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBjcmVhdGVkIGl0ZXJhdG9ycyB3aWxsIGJlIGNsb3NlZCBpbiBDUUwgbGF5ZXIgdGhyb3VnaCB0aGUgY2hhaW4gb2YgdHJhbnNmb3JtYXRpb25zCiAgICAgcHVibGljIHN0YXRpYyBQYXJ0aXRpb25JdGVyYXRvciBwYXJ0aXRpb25zKFBhcnRpdGlvblJhbmdlUmVhZENvbW1hbmQgY29tbWFuZCwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcmVhZHMvcmVwYWlyL0Jsb2NraW5nUmVhZFJlcGFpcnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcmVhZHMvcmVwYWlyL0Jsb2NraW5nUmVhZFJlcGFpcnMuamF2YQppbmRleCA3YTQ4ODJiLi5kZTQ5ZjVhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL3JlcGFpci9CbG9ja2luZ1JlYWRSZXBhaXJzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9yZWFkcy9yZXBhaXIvQmxvY2tpbmdSZWFkUmVwYWlycy5qYXZhCkBAIC0zMywxNCArMzMsMTQgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFjaW5nLlRyYWNpbmc7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5EUk9QX09WRVJTSVpFRF9SRUFEX1JFUEFJUl9NVVRBVElPTlM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLklNdXRhdGlvbi5NQVhfTVVUQVRJT05fU0laRTsKIAogcHVibGljIGNsYXNzIEJsb2NraW5nUmVhZFJlcGFpcnMKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQmxvY2tpbmdSZWFkUmVwYWlycy5jbGFzcyk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERST1BfT1ZFUlNJWkVEX1JFQURfUkVQQUlSX01VVEFUSU9OUyA9Ci0gICAgICAgIEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLmRyb3Bfb3ZlcnNpemVkX3JlYWRyZXBhaXJfbXV0YXRpb25zIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSE9VTERfRFJPUF9PVkVSU0laRURfUkVBRF9SRVBBSVJfTVVUQVRJT05TID0gRFJPUF9PVkVSU0laRURfUkVBRF9SRVBBSVJfTVVUQVRJT05TLmdldEJvb2xlYW4oKTsKIAogICAgIC8qKgogICAgICAqIENyZWF0ZSBhIHJlYWQgcmVwYWlyIG11dGF0aW9uIGZyb20gdGhlIGdpdmVuIHVwZGF0ZSwgaWYgdGhlIG11dGF0aW9uIGlzIG5vdCBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bQpAQCAtNjUsNyArNjUsNyBAQAogICAgICAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKG11dGF0aW9uLmdldEtleXNwYWNlTmFtZSgpKTsKICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSB1cGRhdGUubWV0YWRhdGEoKTsKIAotICAgICAgICAgICAgaWYgKERST1BfT1ZFUlNJWkVEX1JFQURfUkVQQUlSX01VVEFUSU9OUykKKyAgICAgICAgICAgIGlmIChTSE9VTERfRFJPUF9PVkVSU0laRURfUkVBRF9SRVBBSVJfTVVUQVRJT05TKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiRW5jb3VudGVyZWQgYW4gb3ZlcnNpemVkICh7fS97fSkgcmVhZCByZXBhaXIgbXV0YXRpb24gZm9yIHRhYmxlIHt9LCBrZXkge30sIG5vZGUge30iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm11dGF0aW9uU2l6ZSwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcmVhZHMvdGhyZXNob2xkcy9Db29yZGluYXRvcldhcm5pbmdzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL3RocmVzaG9sZHMvQ29vcmRpbmF0b3JXYXJuaW5ncy5qYXZhCmluZGV4IGZmNWJkNzguLjFiMzE3ZGIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcmVhZHMvdGhyZXNob2xkcy9Db29yZGluYXRvcldhcm5pbmdzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9yZWFkcy90aHJlc2hvbGRzL0Nvb3JkaW5hdG9yV2FybmluZ3MuamF2YQpAQCAtMzMsMTAgKzMzLDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFdhcm47CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRUFEU19USFJFU0hPTERTX0NPT1JESU5BVE9SX0RFRkVOU0lWRV9DSEVDS1NfRU5BQkxFRDsKKwogcHVibGljIGNsYXNzIENvb3JkaW5hdG9yV2FybmluZ3MKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ29vcmRpbmF0b3JXYXJuaW5ncy5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTkFCTEVfREVGRU5TSVZFX0NIRUNLUyA9IEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLnJlYWRzLnRocmVzaG9sZHMuY29vcmRpbmF0b3IuZGVmZW5zaXZlX2NoZWNrc19lbmFibGVkIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBFTkFCTEVfREVGRU5TSVZFX0NIRUNLUyA9IFJFQURTX1RIUkVTSE9MRFNfQ09PUkRJTkFUT1JfREVGRU5TSVZFX0NIRUNLU19FTkFCTEVELmdldEJvb2xlYW4oKTsKIAogICAgIC8vIHdoZW4gLmluaXQoKSBpcyBjYWxsZWQgc2V0IHRoZSBTVEFURSB0byBiZSBJTklUOyB0aGlzIGlzIHRvIGxhenkgYWxsb2NhdGUgdGhlIG1hcCBvbmx5IHdoZW4gd2FybmluZ3MgYXJlIGdlbmVyYXRlZAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxSZWFkQ29tbWFuZCwgV2FybmluZ3NTbmFwc2hvdD4gSU5JVCA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TG9hZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TG9hZGVyLmphdmEKaW5kZXggNTIzZTFlNS4uZDMxZGYzNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9zbmFwc2hvdC9TbmFwc2hvdExvYWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RMb2FkZXIuamF2YQpAQCAtNzMsNiArNzMsMTEgQEAKICAgICAgICAgdGhpcy5kYXRhRGlyZWN0b3JpZXMgPSBkYXRhRGlyczsKICAgICB9CiAKKyAgICBwdWJsaWMgU25hcHNob3RMb2FkZXIoRGlyZWN0b3JpZXMgZGlyZWN0b3JpZXMpCisgICAgeworICAgICAgICB0aGlzKGRpcmVjdG9yaWVzLmdldENGRGlyZWN0b3JpZXMoKS5zdHJlYW0oKS5tYXAoRmlsZTo6dG9QYXRoKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICB9CisKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKICAgICBzdGF0aWMgY2xhc3MgVmlzaXRvciBleHRlbmRzIFNpbXBsZUZpbGVWaXNpdG9yPFBhdGg+CiAgICAgewpAQCAtMTUyLDE3ICsxNTcsMjQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBTZXQ8VGFibGVTbmFwc2hvdD4gbG9hZFNuYXBzaG90cygpCisgICAgcHVibGljIFNldDxUYWJsZVNuYXBzaG90PiBsb2FkU25hcHNob3RzKFN0cmluZyBrZXlzcGFjZSkKICAgICB7CisgICAgICAgIC8vIGlmIHdlIHN1cHBseSBhIGtleXNwYWNlLCB0aGUgd2Fsa2luZyBtYXggZGVwdGggd2lsbCBiZSBzdWRkZW5seSBzaG9ydGhlcgorICAgICAgICAvLyBiZWNhdXNlIHdlIGFyZSBvbmUgbGV2ZWwgZG93biBpbiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZQorICAgICAgICBpbnQgbWF4RGVwdGggPSBrZXlzcGFjZSA9PSBudWxsID8gNSA6IDQ7CisKICAgICAgICAgTWFwPFN0cmluZywgVGFibGVTbmFwc2hvdC5CdWlsZGVyPiBzbmFwc2hvdHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIFZpc2l0b3IgdmlzaXRvciA9IG5ldyBWaXNpdG9yKHNuYXBzaG90cyk7CiAKICAgICAgICAgZm9yIChQYXRoIGRhdGFEaXIgOiBkYXRhRGlyZWN0b3JpZXMpCiAgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChrZXlzcGFjZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGRhdGFEaXIgPSBkYXRhRGlyLnJlc29sdmUoa2V5c3BhY2UpOworCiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAobmV3IEZpbGUoZGF0YURpcikuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgICAgIEZpbGVzLndhbGtGaWxlVHJlZShkYXRhRGlyLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCA1LCB2aXNpdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgRmlsZXMud2Fsa0ZpbGVUcmVlKGRhdGFEaXIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCksIG1heERlcHRoLCB2aXNpdG9yKTsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiU2tpcHBpbmcgbm9uLWV4aXN0aW5nIGRhdGEgZGlyZWN0b3J5IHt9IiwgZGF0YURpcik7CiAgICAgICAgICAgICB9CkBAIC0xNzQsNCArMTg2LDkgQEAKIAogICAgICAgICByZXR1cm4gc25hcHNob3RzLnZhbHVlcygpLnN0cmVhbSgpLm1hcChUYWJsZVNuYXBzaG90LkJ1aWxkZXI6OmJ1aWxkKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CiAgICAgfQorCisgICAgcHVibGljIFNldDxUYWJsZVNuYXBzaG90PiBsb2FkU25hcHNob3RzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBsb2FkU25hcHNob3RzKG51bGwpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RNYW5hZ2VyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TWFuYWdlci5qYXZhCmluZGV4IDhlNjMwYzcuLjM5MjVmM2YgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RNYW5hZ2VyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9zbmFwc2hvdC9TbmFwc2hvdE1hbmFnZXIuamF2YQpAQCAtMTA5LDYgKzEwOSwxMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHN5bmNocm9uaXplZCBTZXQ8VGFibGVTbmFwc2hvdD4gbG9hZFNuYXBzaG90cyhTdHJpbmcga2V5c3BhY2UpCisgICAgeworICAgICAgICByZXR1cm4gc25hcHNob3RMb2FkZXIubG9hZFNuYXBzaG90cyhrZXlzcGFjZSk7CisgICAgfQorCiAgICAgcHVibGljIHN5bmNocm9uaXplZCBTZXQ8VGFibGVTbmFwc2hvdD4gbG9hZFNuYXBzaG90cygpCiAgICAgewogICAgICAgICByZXR1cm4gc25hcHNob3RMb2FkZXIubG9hZFNuYXBzaG90cygpOwpAQCAtMTQ4LDYgKzE1Myw5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBEZWxldGVzIHNuYXBzaG90IGFuZCByZW1vdmUgaXQgZnJvbSBtYW5hZ2VyCisgICAgICovCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyU25hcHNob3QoVGFibGVTbmFwc2hvdCBzbmFwc2hvdCkKICAgICB7CiAgICAgICAgIGZvciAoRmlsZSBzbmFwc2hvdERpciA6IHNuYXBzaG90LmdldERpcmVjdG9yaWVzKCkpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TWFuaWZlc3QuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RNYW5pZmVzdC5qYXZhCmluZGV4IGJhODQwZWYuLjhlZTczN2MgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RNYW5pZmVzdC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RNYW5pZmVzdC5qYXZhCkBAIC0yOCw3ICsyOCw3IEBACiBpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblByb3BlcnR5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKIAogLy8gT25seSBzZXJpYWxpemUgZmllbGRzCiBASnNvbkF1dG9EZXRlY3QoZmllbGRWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlksCkBAIC00NiwxOSArNDYsMjUgQEAKICAgICBASnNvblByb3BlcnR5KCJleHBpcmVzX2F0IikKICAgICBwdWJsaWMgZmluYWwgSW5zdGFudCBleHBpcmVzQXQ7CiAKKyAgICBASnNvblByb3BlcnR5KCJlcGhlbWVyYWwiKQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVwaGVtZXJhbDsKKwogICAgIC8qKiBuZWVkZWQgZm9yIGphY2tzb24gc2VyaWFsaXphdGlvbiAqLwogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotICAgIHByaXZhdGUgU25hcHNob3RNYW5pZmVzdCgpIHsKKyAgICBwcml2YXRlIFNuYXBzaG90TWFuaWZlc3QoKQorICAgIHsKICAgICAgICAgdGhpcy5maWxlcyA9IG51bGw7CiAgICAgICAgIHRoaXMuY3JlYXRlZEF0ID0gbnVsbDsKICAgICAgICAgdGhpcy5leHBpcmVzQXQgPSBudWxsOworICAgICAgICB0aGlzLmVwaGVtZXJhbCA9IGZhbHNlOwogICAgIH0KIAotICAgIHB1YmxpYyBTbmFwc2hvdE1hbmlmZXN0KExpc3Q8U3RyaW5nPiBmaWxlcywgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZCB0dGwsIEluc3RhbnQgY3JlYXRpb25UaW1lKQorICAgIHB1YmxpYyBTbmFwc2hvdE1hbmlmZXN0KExpc3Q8U3RyaW5nPiBmaWxlcywgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZCB0dGwsIEluc3RhbnQgY3JlYXRpb25UaW1lLCBib29sZWFuIGVwaGVtZXJhbCkKICAgICB7CiAgICAgICAgIHRoaXMuZmlsZXMgPSBmaWxlczsKICAgICAgICAgdGhpcy5jcmVhdGVkQXQgPSBjcmVhdGlvblRpbWU7CiAgICAgICAgIHRoaXMuZXhwaXJlc0F0ID0gdHRsID09IG51bGwgPyBudWxsIDogY3JlYXRlZEF0LnBsdXNTZWNvbmRzKHR0bC50b1NlY29uZHMoKSk7CisgICAgICAgIHRoaXMuZXBoZW1lcmFsID0gZXBoZW1lcmFsOwogICAgIH0KIAogICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RmlsZXMoKQpAQCAtNzYsMTQgKzgyLDE5IEBACiAgICAgICAgIHJldHVybiBleHBpcmVzQXQ7CiAgICAgfQogCisgICAgcHVibGljIGJvb2xlYW4gaXNFcGhlbWVyYWwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVwaGVtZXJhbDsKKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemVUb0pzb25GaWxlKEZpbGUgb3V0cHV0RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBGQlV0aWxpdGllcy5zZXJpYWxpemVUb0pzb25GaWxlKHRoaXMsIG91dHB1dEZpbGUpOworICAgICAgICBKc29uVXRpbHMuc2VyaWFsaXplVG9Kc29uRmlsZSh0aGlzLCBvdXRwdXRGaWxlKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFNuYXBzaG90TWFuaWZlc3QgZGVzZXJpYWxpemVGcm9tSnNvbkZpbGUoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHJldHVybiBGQlV0aWxpdGllcy5kZXNlcmlhbGl6ZUZyb21Kc29uRmlsZShTbmFwc2hvdE1hbmlmZXN0LmNsYXNzLCBmaWxlKTsKKyAgICAgICAgcmV0dXJuIEpzb25VdGlscy5kZXNlcmlhbGl6ZUZyb21Kc29uRmlsZShTbmFwc2hvdE1hbmlmZXN0LmNsYXNzLCBmaWxlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTkyLDEyICsxMDMsMTUgQEAKICAgICAgICAgaWYgKHRoaXMgPT0gbykgcmV0dXJuIHRydWU7CiAgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKICAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IChTbmFwc2hvdE1hbmlmZXN0KSBvOwotICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoZmlsZXMsIG1hbmlmZXN0LmZpbGVzKSAmJiBPYmplY3RzLmVxdWFscyhjcmVhdGVkQXQsIG1hbmlmZXN0LmNyZWF0ZWRBdCkgJiYgT2JqZWN0cy5lcXVhbHMoZXhwaXJlc0F0LCBtYW5pZmVzdC5leHBpcmVzQXQpOworICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoZmlsZXMsIG1hbmlmZXN0LmZpbGVzKQorICAgICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbHMoY3JlYXRlZEF0LCBtYW5pZmVzdC5jcmVhdGVkQXQpCisgICAgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFscyhleHBpcmVzQXQsIG1hbmlmZXN0LmV4cGlyZXNBdCkKKyAgICAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWxzKGVwaGVtZXJhbCwgbWFuaWZlc3QuZXBoZW1lcmFsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2goZmlsZXMsIGNyZWF0ZWRBdCwgZXhwaXJlc0F0KTsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChmaWxlcywgY3JlYXRlZEF0LCBleHBpcmVzQXQsIGVwaGVtZXJhbCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9zbmFwc2hvdC9UYWJsZVNuYXBzaG90LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1RhYmxlU25hcHNob3QuamF2YQppbmRleCAwY2ZjZmVhLi5kMTAwOTJhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1RhYmxlU25hcHNob3QuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1RhYmxlU25hcHNob3QuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwpAQCAtNDQsNiArNDUsNyBAQAogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRhYmxlTmFtZTsKICAgICBwcml2YXRlIGZpbmFsIFVVSUQgdGFibGVJZDsKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB0YWc7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGVwaGVtZXJhbDsKIAogICAgIHByaXZhdGUgZmluYWwgSW5zdGFudCBjcmVhdGVkQXQ7CiAgICAgcHJpdmF0ZSBmaW5hbCBJbnN0YW50IGV4cGlyZXNBdDsKQEAgLTUyLDcgKzU0LDcgQEAKIAogICAgIHB1YmxpYyBUYWJsZVNuYXBzaG90KFN0cmluZyBrZXlzcGFjZU5hbWUsIFN0cmluZyB0YWJsZU5hbWUsIFVVSUQgdGFibGVJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFnLCBJbnN0YW50IGNyZWF0ZWRBdCwgSW5zdGFudCBleHBpcmVzQXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU2V0PEZpbGU+IHNuYXBzaG90RGlycykKKyAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8RmlsZT4gc25hcHNob3REaXJzLCBib29sZWFuIGVwaGVtZXJhbCkKICAgICB7CiAgICAgICAgIHRoaXMua2V5c3BhY2VOYW1lID0ga2V5c3BhY2VOYW1lOwogICAgICAgICB0aGlzLnRhYmxlTmFtZSA9IHRhYmxlTmFtZTsKQEAgLTYxLDYgKzYzLDcgQEAKICAgICAgICAgdGhpcy5jcmVhdGVkQXQgPSBjcmVhdGVkQXQ7CiAgICAgICAgIHRoaXMuZXhwaXJlc0F0ID0gZXhwaXJlc0F0OwogICAgICAgICB0aGlzLnNuYXBzaG90RGlycyA9IHNuYXBzaG90RGlyczsKKyAgICAgICAgdGhpcy5lcGhlbWVyYWwgPSBlcGhlbWVyYWw7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMjMsNiArMTI2LDExIEBACiAgICAgICAgIHJldHVybiBzbmFwc2hvdERpcnMuc3RyZWFtKCkuYW55TWF0Y2goRmlsZTo6ZXhpc3RzKTsKICAgICB9CiAKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VwaGVtZXJhbCgpCisgICAgeworICAgICAgICByZXR1cm4gZXBoZW1lcmFsOworICAgIH0KKwogICAgIHB1YmxpYyBib29sZWFuIGlzRXhwaXJpbmcoKQogICAgIHsKICAgICAgICAgcmV0dXJuIGV4cGlyZXNBdCAhPSBudWxsOwpAQCAtMTkyLDEzICsyMDAsMTMgQEAKICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKGtleXNwYWNlTmFtZSwgc25hcHNob3Qua2V5c3BhY2VOYW1lKSAmJiBPYmplY3RzLmVxdWFscyh0YWJsZU5hbWUsIHNuYXBzaG90LnRhYmxlTmFtZSkgJiYKICAgICAgICAgICAgICAgIE9iamVjdHMuZXF1YWxzKHRhYmxlSWQsIHNuYXBzaG90LnRhYmxlSWQpICYmIE9iamVjdHMuZXF1YWxzKHRhZywgc25hcHNob3QudGFnKSAmJgogICAgICAgICAgICAgICAgT2JqZWN0cy5lcXVhbHMoY3JlYXRlZEF0LCBzbmFwc2hvdC5jcmVhdGVkQXQpICYmIE9iamVjdHMuZXF1YWxzKGV4cGlyZXNBdCwgc25hcHNob3QuZXhwaXJlc0F0KSAmJgotICAgICAgICAgICAgICAgT2JqZWN0cy5lcXVhbHMoc25hcHNob3REaXJzLCBzbmFwc2hvdC5zbmFwc2hvdERpcnMpOworICAgICAgICAgICAgICAgT2JqZWN0cy5lcXVhbHMoc25hcHNob3REaXJzLCBzbmFwc2hvdC5zbmFwc2hvdERpcnMpICYmIE9iamVjdHMuZXF1YWxzKGVwaGVtZXJhbCwgc25hcHNob3QuZXBoZW1lcmFsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2goa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsIHRhYmxlSWQsIHRhZywgY3JlYXRlZEF0LCBleHBpcmVzQXQsIHNuYXBzaG90RGlycyk7CisgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2goa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsIHRhYmxlSWQsIHRhZywgY3JlYXRlZEF0LCBleHBpcmVzQXQsIHNuYXBzaG90RGlycywgZXBoZW1lcmFsKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTIxMiw2ICsyMjAsNyBAQAogICAgICAgICAgICAgICAgIiwgY3JlYXRlZEF0PSIgKyBjcmVhdGVkQXQgKwogICAgICAgICAgICAgICAgIiwgZXhwaXJlc0F0PSIgKyBleHBpcmVzQXQgKwogICAgICAgICAgICAgICAgIiwgc25hcHNob3REaXJzPSIgKyBzbmFwc2hvdERpcnMgKworICAgICAgICAgICAgICAgIiwgZXBoZW1lcmFsPSIgKyBlcGhlbWVyYWwgKwogICAgICAgICAgICAgICAgJ30nOwogICAgIH0KIApAQCAtMjIzLDYgKzIzMiw3IEBACiAKICAgICAgICAgcHJpdmF0ZSBJbnN0YW50IGNyZWF0ZWRBdCA9IG51bGw7CiAgICAgICAgIHByaXZhdGUgSW5zdGFudCBleHBpcmVzQXQgPSBudWxsOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZXBoZW1lcmFsOwogCiAgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PEZpbGU+IHNuYXBzaG90RGlycyA9IG5ldyBIYXNoU2V0PD4oKTsKIApAQCAtMjM4LDEyICsyNDgsMTcgQEAKICAgICAgICAgewogICAgICAgICAgICAgc25hcHNob3REaXJzLmFkZChzbmFwc2hvdERpcik7CiAgICAgICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKHNuYXBzaG90RGlyLCAibWFuaWZlc3QuanNvbiIpOwotICAgICAgICAgICAgaWYgKG1hbmlmZXN0RmlsZS5leGlzdHMoKSAmJiBjcmVhdGVkQXQgPT0gbnVsbCAmJiBleHBpcmVzQXQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGxvYWRUaW1lc3RhbXBzRnJvbU1hbmlmZXN0KG1hbmlmZXN0RmlsZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWFuaWZlc3RGaWxlLmV4aXN0cygpICYmIGNyZWF0ZWRBdCA9PSBudWxsICYmIGV4cGlyZXNBdCA9PSBudWxsKQorICAgICAgICAgICAgICAgIGxvYWRNZXRhZGF0YUZyb21NYW5pZmVzdChtYW5pZmVzdEZpbGUpOworCisgICAgICAgICAgICAvLyBjaGVjayBpZiBhbiBlcGhlbWVyYWwgbWFya2VyIGZpbGUgZXhpc3RzIG9ubHkgaW4gY2FzZSBpdCBpcyBub3QgYWxyZWFkeSBlcGhlbWVyYWwKKyAgICAgICAgICAgIC8vIGJ5IHJlYWRpbmcgaXQgZnJvbSBtYW5pZmVzdAorICAgICAgICAgICAgLy8gVE9ETyByZW1vdmUgdGhpcyBvbiBDYXNzYW5kcmEgNC4zIHJlbGVhc2UsIHNlZSBDQVNTQU5EUkEtMTY5MTEKKyAgICAgICAgICAgIGlmICghZXBoZW1lcmFsICYmIG5ldyBGaWxlKHNuYXBzaG90RGlyLCAiZXBoZW1lcmFsLnNuYXBzaG90IikuZXhpc3RzKCkpCisgICAgICAgICAgICAgICAgZXBoZW1lcmFsID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBsb2FkVGltZXN0YW1wc0Zyb21NYW5pZmVzdChGaWxlIG1hbmlmZXN0RmlsZSkKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGxvYWRNZXRhZGF0YUZyb21NYW5pZmVzdChGaWxlIG1hbmlmZXN0RmlsZSkKICAgICAgICAgewogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CkBAIC0yNTEsNiArMjY2LDkgQEAKICAgICAgICAgICAgICAgICBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0ID0gU25hcHNob3RNYW5pZmVzdC5kZXNlcmlhbGl6ZUZyb21Kc29uRmlsZShtYW5pZmVzdEZpbGUpOwogICAgICAgICAgICAgICAgIGNyZWF0ZWRBdCA9IG1hbmlmZXN0LmNyZWF0ZWRBdDsKICAgICAgICAgICAgICAgICBleHBpcmVzQXQgPSBtYW5pZmVzdC5leHBpcmVzQXQ7CisgICAgICAgICAgICAgICAgLy8gYSBzbmFwc2hvdCBtYXkgYmUgZXBoZW1lcmFsIHdoZW4gaXQgaGFzIGEgbWFya2VyIGZpbGUgKG9sZCB3YXkpIG9yIGZsYWcgaW4gbWFuaWZlc3QgKG5ldyB3YXkpCisgICAgICAgICAgICAgICAgaWYgKCFlcGhlbWVyYWwpCisgICAgICAgICAgICAgICAgICAgIGVwaGVtZXJhbCA9IG1hbmlmZXN0LmVwaGVtZXJhbDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQogICAgICAgICAgICAgewpAQCAtMjYwLDcgKzI3OCw3IEBACiAKICAgICAgICAgVGFibGVTbmFwc2hvdCBidWlsZCgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVTbmFwc2hvdChrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgdGFibGVJZCwgdGFnLCBjcmVhdGVkQXQsIGV4cGlyZXNBdCwgc25hcHNob3REaXJzKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVTbmFwc2hvdChrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgdGFibGVJZCwgdGFnLCBjcmVhdGVkQXQsIGV4cGlyZXNBdCwgc25hcHNob3REaXJzLCBlcGhlbWVyYWwpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMDUsNCArMzIzLDMwIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGxpdmVEaXIudG9TdHJpbmcoKSwgc25hcHNob3RGaWxlUGF0aC5nZXRGaWxlTmFtZSgpLnRvU3RyaW5nKCkpOwogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJlZGljYXRlPFRhYmxlU25hcHNob3Q+IHNob3VsZENsZWFyU25hcHNob3QoU3RyaW5nIHRhZywgbG9uZyBvbGRlclRoYW5UaW1lc3RhbXApCisgICAgeworICAgICAgICByZXR1cm4gdHMgLT4KKyAgICAgICAgeworICAgICAgICAgICAgLy8gV2hlbiBubyB0YWcgaXMgc3VwcGxpZWQsIGFsbCBzbmFwc2hvdHMgbXVzdCBiZSBjbGVhcmVkCisgICAgICAgICAgICBib29sZWFuIGNsZWFyQWxsID0gdGFnID09IG51bGwgfHwgdGFnLmlzRW1wdHkoKTsKKyAgICAgICAgICAgIGlmICghY2xlYXJBbGwgJiYgdHMuaXNFcGhlbWVyYWwoKSkKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiU2tpcHBpbmcgZGVsZXRpb24gb2YgZXBoZW1lcmFsIHNuYXBzaG90ICd7fScgaW4ga2V5c3BhY2Uge30uICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcGhlbWVyYWwgc25hcHNob3RzIGFyZSBub3QgcmVtb3ZhYmxlIGJ5IGEgdXNlci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZywgdHMua2V5c3BhY2VOYW1lKTsKKyAgICAgICAgICAgIGJvb2xlYW4gbm90RXBoZW1lcmFsID0gIXRzLmlzRXBoZW1lcmFsKCk7CisgICAgICAgICAgICBib29sZWFuIHNob3VsZENsZWFyVGFnID0gY2xlYXJBbGwgfHwgdHMudGFnLmVxdWFscyh0YWcpOworICAgICAgICAgICAgYm9vbGVhbiBieVRpbWVzdGFtcCA9IHRydWU7CisKKyAgICAgICAgICAgIGlmIChvbGRlclRoYW5UaW1lc3RhbXAgPiAwTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbnN0YW50IGNyZWF0ZWRBdCA9IHRzLmdldENyZWF0ZWRBdCgpOworICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkQXQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYnlUaW1lc3RhbXAgPSBjcmVhdGVkQXQuaXNCZWZvcmUoSW5zdGFudC5vZkVwb2NoTWlsbGkob2xkZXJUaGFuVGltZXN0YW1wKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBub3RFcGhlbWVyYWwgJiYgc2hvdWxkQ2xlYXJUYWcgJiYgYnlUaW1lc3RhbXA7CisgICAgICAgIH07CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvUHJvZ3Jlc3NJbmZvLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvUHJvZ3Jlc3NJbmZvLmphdmEKaW5kZXggMmVkNzhhYy4uMTU5Nzc1YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1Byb2dyZXNzSW5mby5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9Qcm9ncmVzc0luZm8uamF2YQpAQCAtNjAsNyArNjAsNiBAQAogICAgIHB1YmxpYyBQcm9ncmVzc0luZm8oSW5ldEFkZHJlc3NBbmRQb3J0IHBlZXIsIGludCBzZXNzaW9uSW5kZXgsIFN0cmluZyBmaWxlTmFtZSwgRGlyZWN0aW9uIGRpcmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgY3VycmVudEJ5dGVzLCAgbG9uZyBkZWx0YUJ5dGVzLCBsb25nIHRvdGFsQnl0ZXMpCiAgICAgewotICAgICAgICBhc3NlcnQgdG90YWxCeXRlcyA+IDA7CiAKICAgICAgICAgdGhpcy5wZWVyID0gcGVlcjsKICAgICAgICAgdGhpcy5zZXNzaW9uSW5kZXggPSBzZXNzaW9uSW5kZXg7CkBAIC03OSw2ICs3OCwxMSBAQAogICAgICAgICByZXR1cm4gY3VycmVudEJ5dGVzID49IHRvdGFsQnl0ZXM7CiAgICAgfQogCisgICAgcHVibGljIGludCBwcm9ncmVzc1BlcmNlbnRhZ2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRvdGFsQnl0ZXMgPT0gMCA/IDEwMCA6IChpbnQpICgoMTAwICogY3VycmVudEJ5dGVzKSAvIHRvdGFsQnl0ZXMpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIFByb2dyZXNzSW5mbyBpcyBjb25zaWRlcmVkIHRvIGJlIGVxdWFsIG9ubHkgd2hlbiBhbGwgYXR0cmlidXRlcyBleGNlcHQgY3VycmVudEJ5dGVzIGFyZSBlcXVhbC4KICAgICAgKi8KQEAgLTExNCwxMCArMTE4LDEwIEBACiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihmaWxlTmFtZSk7CiAgICAgICAgIHNiLmFwcGVuZCgiICIpLmFwcGVuZChjdXJyZW50Qnl0ZXMpOwogICAgICAgICBzYi5hcHBlbmQoIi8iKS5hcHBlbmQodG90YWxCeXRlcykuYXBwZW5kKCIgYnl0ZXMgIik7Ci0gICAgICAgIHNiLmFwcGVuZCgiKCIpLmFwcGVuZChjdXJyZW50Qnl0ZXMqMTAwL3RvdGFsQnl0ZXMpLmFwcGVuZCgiJSkgIik7CisgICAgICAgIHNiLmFwcGVuZCgiKCIpLmFwcGVuZChwcm9ncmVzc1BlcmNlbnRhZ2UoKSkuYXBwZW5kKCIlKSAiKTsKICAgICAgICAgc2IuYXBwZW5kKGRpcmVjdGlvbiA9PSBEaXJlY3Rpb24uT1VUID8gInNlbnQgdG8gIiA6ICJyZWNlaXZlZCBmcm9tICIpOwogICAgICAgICBzYi5hcHBlbmQoImlkeDoiKS5hcHBlbmQoc2Vzc2lvbkluZGV4KTsKICAgICAgICAgc2IuYXBwZW5kKHBlZXIudG9TdHJpbmcod2l0aFBvcnRzKSk7CiAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU2Vzc2lvbkluZm8uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TZXNzaW9uSW5mby5qYXZhCmluZGV4IGQ5NWQ4NWIuLjkyYWYyNDUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TZXNzaW9uSW5mby5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TZXNzaW9uSW5mby5qYXZhCkBAIC00NywxMiArNDcsMTUgQEAKICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFByb2dyZXNzSW5mbz4gcmVjZWl2aW5nRmlsZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUHJvZ3Jlc3NJbmZvPiBzZW5kaW5nRmlsZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwogCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBmYWlsdXJlUmVhc29uOworCiAgICAgcHVibGljIFNlc3Npb25JbmZvKEluZXRTb2NrZXRBZGRyZXNzIHBlZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIGNvbm5lY3RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248U3RyZWFtU3VtbWFyeT4gcmVjZWl2aW5nU3VtbWFyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmVhbVN1bW1hcnk+IHNlbmRpbmdTdW1tYXJpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVNlc3Npb24uU3RhdGUgc3RhdGUpCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVNlc3Npb24uU3RhdGUgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmYWlsdXJlUmVhc29uKQogICAgIHsKICAgICAgICAgdGhpcy5wZWVyID0gcGVlcjsKICAgICAgICAgdGhpcy5zZXNzaW9uSW5kZXggPSBzZXNzaW9uSW5kZXg7CkBAIC02MCwxMSArNjMsMTIgQEAKICAgICAgICAgdGhpcy5yZWNlaXZpbmdTdW1tYXJpZXMgPSBJbW11dGFibGVTZXQuY29weU9mKHJlY2VpdmluZ1N1bW1hcmllcyk7CiAgICAgICAgIHRoaXMuc2VuZGluZ1N1bW1hcmllcyA9IEltbXV0YWJsZVNldC5jb3B5T2Yoc2VuZGluZ1N1bW1hcmllcyk7CiAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgdGhpcy5mYWlsdXJlUmVhc29uID0gIGZhaWx1cmVSZWFzb247CiAgICAgfQogCiAgICAgcHVibGljIFNlc3Npb25JbmZvKFNlc3Npb25JbmZvIG90aGVyKQogICAgIHsKLSAgICAgICAgdGhpcyhvdGhlci5wZWVyLCBvdGhlci5zZXNzaW9uSW5kZXgsIG90aGVyLmNvbm5lY3RpbmcsIG90aGVyLnJlY2VpdmluZ1N1bW1hcmllcywgb3RoZXIuc2VuZGluZ1N1bW1hcmllcywgb3RoZXIuc3RhdGUpOworICAgICAgICB0aGlzKG90aGVyLnBlZXIsIG90aGVyLnNlc3Npb25JbmRleCwgb3RoZXIuY29ubmVjdGluZywgb3RoZXIucmVjZWl2aW5nU3VtbWFyaWVzLCBvdGhlci5zZW5kaW5nU3VtbWFyaWVzLCBvdGhlci5zdGF0ZSwgb3RoZXIuZmFpbHVyZVJlYXNvbik7CiAgICAgfQogCiAgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsZWQoKQpAQCAtMjA1LDQgKzIwOSw5IEBACiAgICAgewogICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25TdW1tYXJ5KEZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0KCksIHBlZXIsIHJlY2VpdmluZ1N1bW1hcmllcywgc2VuZGluZ1N1bW1hcmllcyk7CiAgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGYWlsdXJlUmVhc29uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWlsdXJlUmVhc29uOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1Ib29rLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtSG9vay5qYXZhCmluZGV4IDg2YjUxODIuLjg0ZGI0MjAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1Ib29rLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbUhvb2suamF2YQpAQCAtMjIsNiArMjIsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5tZXNzYWdlcy5PdXRnb2luZ1N0cmVhbU1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVFJFQU1fSE9PSzsKKwogcHVibGljIGludGVyZmFjZSBTdHJlYW1Ib29rCiB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJlYW1Ib29rIGluc3RhbmNlID0gY3JlYXRlSG9vaygpOwpAQCAtMzIsNyArMzQsNyBAQAogCiAgICAgc3RhdGljIFN0cmVhbUhvb2sgY3JlYXRlSG9vaygpCiAgICAgewotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gIFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN0cmVhbV9ob29rIik7CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBTVFJFQU1fSE9PSy5nZXRTdHJpbmcoKTsKICAgICAgICAgaWYgKGNsYXNzTmFtZSAhPSBudWxsKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gRkJVdGlsaXRpZXMuY29uc3RydWN0KGNsYXNzTmFtZSwgU3RyZWFtSG9vay5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbU1hbmFnZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1NYW5hZ2VyLmphdmEKaW5kZXggNDA4YjZmNC4uZmVjOGIyZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbU1hbmFnZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtTWFuYWdlci5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jYWNoZS5DYWNoZTsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jYWNoZS5DYWNoZUJ1aWxkZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY2FjaGUuV2VpZ2hlcjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlJhdGVMaW1pdGVyOwpAQCAtMjUyLDE4ICsyNTMsMzUgQEAKICAgICAgICAgfQogICAgIH07CiAKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRTdHJlYW1pbmdTdGF0ZUFnYWluKFN0cmVhbWluZ1N0YXRlIHN0YXRlKQorICAgIHsKKyAgICAgICAgaWYgKCFEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U3RyZWFtaW5nU3RhdHNFbmFibGVkKCkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0YXRlcy5wdXQoc3RhdGUuaWQoKSwgc3RhdGUpOworICAgIH0KKwogICAgIHB1YmxpYyBTdHJlYW1NYW5hZ2VyKCkKICAgICB7CiAgICAgICAgIER1cmF0aW9uU3BlYy5Mb25nTmFub3NlY29uZHNCb3VuZCBkdXJhdGlvbiA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTdHJlYW1pbmdTdGF0ZUV4cGlyZXMoKTsKICAgICAgICAgbG9uZyBzaXplQnl0ZXMgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U3RyZWFtaW5nU3RhdGVTaXplKCkudG9CeXRlcygpOwotICAgICAgICBsb25nIG51bUVsZW1lbnRzID0gc2l6ZUJ5dGVzIC8gU3RyZWFtaW5nU3RhdGUuRUxFTUVOVF9TSVpFOwotICAgICAgICBsb2dnZXIuaW5mbygiU3RvcmluZyBzdHJlYW1pbmcgc3RhdGUgZm9yIHt9IG9yIGZvciB7fSBlbGVtZW50cyIsIGR1cmF0aW9uLCBudW1FbGVtZW50cyk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJTdG9yaW5nIHN0cmVhbWluZyBzdGF0ZSBmb3Ige30gb3IgZm9yIHNpemUge30iLCBkdXJhdGlvbiwgc2l6ZUJ5dGVzKTsKICAgICAgICAgc3RhdGVzID0gQ2FjaGVCdWlsZGVyLm5ld0J1aWxkZXIoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhwaXJlQWZ0ZXJXcml0ZShkdXJhdGlvbi5xdWFudGl0eSgpLCBkdXJhdGlvbi51bml0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhpbXVtU2l6ZShudW1FbGVtZW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heGltdW1XZWlnaHQoc2l6ZUJ5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2VpZ2hlcihuZXcgU3RyZWFtaW5nU3RhdGVXZWlnaGVyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmVhbWluZ1N0YXRlV2VpZ2hlciBpbXBsZW1lbnRzIFdlaWdoZXI8VGltZVVVSUQsU3RyZWFtaW5nU3RhdGU+CisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCB3ZWlnaChUaW1lVVVJRCBrZXksIFN0cmVhbWluZ1N0YXRlIHZhbCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBjb3N0T2ZTdHJlYW1pbmdTdGF0ZSA9IHZhbC51bnNoYXJlZEhlYXBTaXplKCkgKyBUaW1lVVVJRC5USU1FVVVJRF9TSVpFOworICAgICAgICAgICAgcmV0dXJuIE1hdGgudG9JbnRFeGFjdChjb3N0T2ZTdHJlYW1pbmdTdGF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBzdGFydCgpCiAgICAgewogICAgICAgICBhZGRMaXN0ZW5lcihsaXN0ZW5lcik7CkBAIC00NDcsNiArNDY1LDE3IEBACiAgICAgICAgIHJldHVybiBzdHJlYW1SZXN1bHRGdXR1cmUuZ2V0U2Vzc2lvbihwZWVyLCBzZXNzaW9uSW5kZXgpOwogICAgIH0KIAorICAgIHB1YmxpYyBsb25nIGdldFRvdGFsUmVtYWluaW5nT25nb2luZ0J5dGVzKCkKKyAgICB7CisgICAgICAgIGxvbmcgdG90YWwgPSAwOworICAgICAgICBmb3IgKFN0cmVhbVJlc3VsdEZ1dHVyZSBmdXQgOiBJdGVyYWJsZXMuY29uY2F0KGluaXRpYXRvclN0cmVhbXMudmFsdWVzKCksIGZvbGxvd2VyU3RyZWFtcy52YWx1ZXMoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoU2Vzc2lvbkluZm8gc2Vzc2lvbkluZm8gOiBmdXQuZ2V0Q3VycmVudFN0YXRlKCkuc2Vzc2lvbnMpCisgICAgICAgICAgICAgICAgdG90YWwgKz0gc2Vzc2lvbkluZm8uZ2V0VG90YWxTaXplVG9SZWNlaXZlKCkgLSBzZXNzaW9uSW5mby5nZXRUb3RhbFNpemVSZWNlaXZlZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKICAgICBwdWJsaWMgaW50ZXJmYWNlIFN0cmVhbUxpc3RlbmVyCiAgICAgewogICAgICAgICBkZWZhdWx0IHZvaWQgb25SZWdpc3RlcihTdHJlYW1SZXN1bHRGdXR1cmUgcmVzdWx0KSB7fQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbU9wZXJhdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbU9wZXJhdGlvbi5qYXZhCmluZGV4IDgxNTFiNDcuLjk4YTQwNzAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1PcGVyYXRpb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtT3BlcmF0aW9uLmphdmEKQEAgLTE5LDQzICsxOSw0MyBAQAogCiBwdWJsaWMgZW51bSBTdHJlYW1PcGVyYXRpb24KIHsKLSAgICBPVEhFUigiT3RoZXIiKSwgLy8gRmFsbGJhY2sgdG8gYXZvaWQgbnVsbCB0eXBlcyB3aGVuIGRlc2VyaWFsaXppbmcgZnJvbSBzdHJpbmcKLSAgICBSRVNUT1JFX1JFUExJQ0FfQ09VTlQoIlJlc3RvcmUgcmVwbGljYSBjb3VudCIsIGZhbHNlKSwgLy8gSGFuZGxlcyByZW1vdmVOb2RlCi0gICAgREVDT01NSVNTSU9OKCJVbmJvb3RzdHJhcCIsIGZhbHNlKSwKLSAgICBSRUxPQ0FUSU9OKCJSZWxvY2F0aW9uIiwgZmFsc2UpLAotICAgIEJPT1RTVFJBUCgiQm9vdHN0cmFwIiwgZmFsc2UpLAotICAgIFJFQlVJTEQoIlJlYnVpbGQiLCBmYWxzZSksCi0gICAgQlVMS19MT0FEKCJCdWxrIExvYWQiKSwKLSAgICBSRVBBSVIoIlJlcGFpciIpOworICAgIE9USEVSKCJPdGhlciIsIHRydWUsIGZhbHNlKSwgLy8gRmFsbGJhY2sgdG8gYXZvaWQgbnVsbCB0eXBlcyB3aGVuIGRlc2VyaWFsaXppbmcgZnJvbSBzdHJpbmcKKyAgICBSRVNUT1JFX1JFUExJQ0FfQ09VTlQoIlJlc3RvcmUgcmVwbGljYSBjb3VudCIsIGZhbHNlLCBmYWxzZSksIC8vIEhhbmRsZXMgcmVtb3ZlTm9kZQorICAgIERFQ09NTUlTU0lPTigiVW5ib290c3RyYXAiLCBmYWxzZSwgdHJ1ZSksCisgICAgUkVMT0NBVElPTigiUmVsb2NhdGlvbiIsIGZhbHNlLCB0cnVlKSwKKyAgICBCT09UU1RSQVAoIkJvb3RzdHJhcCIsIGZhbHNlLCB0cnVlKSwKKyAgICBSRUJVSUxEKCJSZWJ1aWxkIiwgZmFsc2UsIHRydWUpLAorICAgIEJVTEtfTE9BRCgiQnVsayBMb2FkIiwgdHJ1ZSwgZmFsc2UpLAorICAgIFJFUEFJUigiUmVwYWlyIiwgdHJ1ZSwgZmFsc2UpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247CiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcXVpcmVzVmlld0J1aWxkOwotCi0KLSAgICBTdHJlYW1PcGVyYXRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgIHRoaXMoZGVzY3JpcHRpb24sIHRydWUpOwotICAgIH0KKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4ga2VlcFNTVGFibGVMZXZlbDsKIAogICAgIC8qKgogICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgb3BlcmF0aW9uIGRlc2NyaXB0aW9uCiAgICAgICogQHBhcmFtIHJlcXVpcmVzVmlld0J1aWxkIFdoZXRoZXIgdGhpcyBvcGVyYXRpb24gcmVxdWlyZXMgdmlld3MgdG8gYmUgdXBkYXRlZCBpZiBpdCBpbnZvbHZlcyBhIGJhc2UgdGFibGUKICAgICAgKi8KLSAgICBTdHJlYW1PcGVyYXRpb24oU3RyaW5nIGRlc2NyaXB0aW9uLCBib29sZWFuIHJlcXVpcmVzVmlld0J1aWxkKSB7CisgICAgU3RyZWFtT3BlcmF0aW9uKFN0cmluZyBkZXNjcmlwdGlvbiwgYm9vbGVhbiByZXF1aXJlc1ZpZXdCdWlsZCwgYm9vbGVhbiBrZWVwU1NUYWJsZUxldmVsKQorICAgIHsKICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwogICAgICAgICB0aGlzLnJlcXVpcmVzVmlld0J1aWxkID0gcmVxdWlyZXNWaWV3QnVpbGQ7CisgICAgICAgIHRoaXMua2VlcFNTVGFibGVMZXZlbCA9IGtlZXBTU1RhYmxlTGV2ZWw7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBTdHJlYW1PcGVyYXRpb24gZnJvbVN0cmluZyhTdHJpbmcgdGV4dCkgewotICAgICAgICBmb3IgKFN0cmVhbU9wZXJhdGlvbiBiIDogU3RyZWFtT3BlcmF0aW9uLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBpZiAoYi5kZXNjcmlwdGlvbi5lcXVhbHNJZ25vcmVDYXNlKHRleHQpKSB7CisgICAgcHVibGljIHN0YXRpYyBTdHJlYW1PcGVyYXRpb24gZnJvbVN0cmluZyhTdHJpbmcgdGV4dCkKKyAgICB7CisgICAgICAgIGZvciAoU3RyZWFtT3BlcmF0aW9uIGIgOiBTdHJlYW1PcGVyYXRpb24udmFsdWVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChiLmRlc2NyaXB0aW9uLmVxdWFsc0lnbm9yZUNhc2UodGV4dCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGI7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gT1RIRVI7CiAgICAgfQogCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKKyAgICB7CiAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKICAgICB9CiAKQEAgLTY2LDQgKzY2LDkgQEAKICAgICB7CiAgICAgICAgIHJldHVybiB0aGlzLnJlcXVpcmVzVmlld0J1aWxkOwogICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGtlZXBTU1RhYmxlTGV2ZWwoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGtlZXBTU1RhYmxlTGV2ZWw7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVJlc3VsdEZ1dHVyZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVJlc3VsdEZ1dHVyZS5qYXZhCmluZGV4IGI0MzIwM2QuLjUyNzdiOWQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1SZXN1bHRGdXR1cmUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtUmVzdWx0RnV0dXJlLmphdmEKQEAgLTIzOSw4ICsyMzksMTYgQEAKICAgICAgICAgICAgIFN0cmVhbVN0YXRlIGZpbmFsU3RhdGUgPSBnZXRDdXJyZW50U3RhdGUoKTsKICAgICAgICAgICAgIGlmIChmaW5hbFN0YXRlLmhhc0ZhaWxlZFNlc3Npb24oKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiW1N0cmVhbSAje31dIFN0cmVhbSBmYWlsZWQiLCBwbGFuSWQpOwotICAgICAgICAgICAgICAgIHRyeUZhaWx1cmUobmV3IFN0cmVhbUV4Y2VwdGlvbihmaW5hbFN0YXRlLCAiU3RyZWFtIGZhaWxlZCIpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJTdHJlYW0gZmFpbGVkOiAiKTsKKyAgICAgICAgICAgICAgICBmb3IgKFNlc3Npb25JbmZvIGluZm8gOiBmaW5hbFN0YXRlLnNlc3Npb25zKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby5pc0ZhaWxlZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIlxuU2Vzc2lvbiBwZWVyICIpLmFwcGVuZChpbmZvLnBlZXIpLmFwcGVuZCgnICcpLmFwcGVuZChpbmZvLmZhaWx1cmVSZWFzb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIud2FybigiW1N0cmVhbSAje31dIHt9IiwgcGxhbklkLCBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICB0cnlGYWlsdXJlKG5ldyBTdHJlYW1FeGNlcHRpb24oZmluYWxTdGF0ZSwgbWVzc2FnZSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSBpZiAoZmluYWxTdGF0ZS5oYXNBYm9ydGVkU2Vzc2lvbigpKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVNlc3Npb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1TZXNzaW9uLmphdmEKaW5kZXggODExNzE3Zi4uZTE3MGNhNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVNlc3Npb24uamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtU2Vzc2lvbi5qYXZhCkBAIC0yMCwxNiArMjAsMjIgQEAKIGltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXRUaW1lb3V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3RvcmU7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIApAQCAtNDAsMzEgKzQ2LDM2IEBACiAKIGltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWw7CiBpbXBvcnQgaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsgLy9jaGVja3N0eWxlOiBwZXJtaXQgdGhpcyBpbXBvcnQKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmFuZ2VzQXRFbmRwb2ludDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuRnV0dXJlQ29tYmluZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SYW5nZXNBdEVuZHBvaW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0cmVhbWluZ01ldHJpY3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5hc3luYy5TdHJlYW1pbmdNdWx0aXBsZXhlZENoYW5uZWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLm1lc3NhZ2VzLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk5vU3BhbUxvZ2dlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkZ1dHVyZUNvbWJpbmVyOwogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmFsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfU1RSRUFNSU5HX0RFQlVHX1NUQUNLVFJBQ0VfTElNSVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQuaG9zdEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydDsKQEAgLTE0NCw5ICsxNTUsMTAgQEAKICAqICh2aWEge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlfSwgd2hpbGUgdGhlIGFjdHVhbCBmaWxlcyB0aGVtc2VsdmVzIGFyZSBzZW50IGJ5IGEgc3BlY2lhbAogICogInN0cmVhbWluZyIgY29ubmVjdGlvbiB0eXBlLiBTZWUge0BsaW5rIFN0cmVhbWluZ011bHRpcGxleGVkQ2hhbm5lbH0gZm9yIGRldGFpbHMuIEJlY2F1c2Ugb2YgdGhlIGFzeW5jaHJvbm91cwogICovCi1wdWJsaWMgY2xhc3MgU3RyZWFtU2Vzc2lvbiBpbXBsZW1lbnRzIElFbmRwb2ludFN0YXRlQ2hhbmdlU3Vic2NyaWJlcgorcHVibGljIGNsYXNzIFN0cmVhbVNlc3Npb24KIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU3RyZWFtU2Vzc2lvbi5jbGFzcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFQlVHX1NUQUNLVFJBQ0VfTElNSVQgPSBDQVNTQU5EUkFfU1RSRUFNSU5HX0RFQlVHX1NUQUNLVFJBQ0VfTElNSVQuZ2V0SW50KCk7CiAKICAgICBwdWJsaWMgZW51bSBQcmVwYXJlRGlyZWN0aW9uIHsgU0VORCwgQUNLIH0KIApAQCAtMTkzLDYgKzIwNSw4IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBUaW1lVVVJRCBwZW5kaW5nUmVwYWlyOwogICAgIHByaXZhdGUgZmluYWwgUHJldmlld0tpbmQgcHJldmlld0tpbmQ7CiAKKyAgICBwdWJsaWMgU3RyaW5nIGZhaWx1cmVSZWFzb247CisKIC8qKgogICogU3RhdGUgVHJhbnNpdGlvbjoKICAqCkBAIC0yNzUsNyArMjg5LDE1IEBACiAKICAgICBwdWJsaWMgU3RyZWFtT3BlcmF0aW9uIHN0cmVhbU9wZXJhdGlvbigpCiAgICAgewotICAgICAgICByZXR1cm4gc3RyZWFtUmVzdWx0ID09IG51bGwgPyBudWxsIDogc3RyZWFtUmVzdWx0LnN0cmVhbU9wZXJhdGlvbjsKKyAgICAgICAgaWYgKHN0cmVhbVJlc3VsdCA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIud2FybigiU3RyZWFtUmVzdWx0RnV0dXJlIG5vdCBpbml0aWFsaXplZCB7fSB7fSIsIGNoYW5uZWwuY29ubmVjdGVkVG8oKSwgaXNGb2xsb3dlciA/ICJmb2xsb3dlciIgOiAiaW5pdGlhdG9yIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJlYW1SZXN1bHQuc3RyZWFtT3BlcmF0aW9uOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIFN0cmVhbU9wZXJhdGlvbiBnZXRTdHJlYW1PcGVyYXRpb24oKQpAQCAtNDk2LDEzICs1MTgsMjAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgc3luY2hyb25pemVkIEZ1dHVyZTw/PiBjbG9zZVNlc3Npb24oU3RhdGUgZmluYWxTdGF0ZSkKKyAgICBwcml2YXRlIEZ1dHVyZTw/PiBjbG9zZVNlc3Npb24oU3RhdGUgZmluYWxTdGF0ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBjbG9zZVNlc3Npb24oZmluYWxTdGF0ZSwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRnV0dXJlPD8+IGNsb3NlU2Vzc2lvbihTdGF0ZSBmaW5hbFN0YXRlLCBTdHJpbmcgZmFpbHVyZVJlYXNvbikKICAgICB7CiAgICAgICAgIC8vIGl0J3Mgc2Vzc2lvbiBpcyBhbHJlYWR5IGNsb3NlZAogICAgICAgICBpZiAoY2xvc2VGdXR1cmUgIT0gbnVsbCkKICAgICAgICAgICAgIHJldHVybiBjbG9zZUZ1dHVyZTsKIAogICAgICAgICBzdGF0ZShmaW5hbFN0YXRlKTsKKyAgICAgICAgLy90aGlzIHJlZmVycyB0byBTdHJlYW1JbmZvCisgICAgICAgIHRoaXMuZmFpbHVyZVJlYXNvbiA9IGZhaWx1cmVSZWFzb247CiAKICAgICAgICAgTGlzdDxGdXR1cmU8Pz4+IGZ1dHVyZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIApAQCAtNjU1LDcgKzY4NCw2IEBACiAgICAgICAgICAgICBpZiAoc3RhdGUuZmluYWxTdGF0ZSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoIltTdHJlYW0gI3t9XSBTb2NrZXQgY2xvc2VkIGFmdGVyIHNlc3Npb24gY29tcGxldGVkIHdpdGggc3RhdGUge30iLCBwbGFuSWQoKSwgc3RhdGUpOwotCiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCkBAIC02NjQsOCArNjkyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbklkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZXIuZ2V0SG9zdEFkZHJlc3NBbmRQb3J0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNsb3NlU2Vzc2lvbihTdGF0ZS5GQUlMRUQpOworICAgICAgICAgICAgICAgIHJldHVybiBjbG9zZVNlc3Npb24oU3RhdGUuRkFJTEVELCAiRmFpbGVkIGJlY2F1c2UgdGhlcmUgd2FzIGFuICIgKyBlLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpICsgIiB3aXRoIHN0YXRlPSIgKyBzdGF0ZS5uYW1lKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTY3Niw4ICs3MDMsOSBAQAogICAgICAgICAgICAgc3RhdGUoU3RhdGUuRkFJTEVEKTsgLy8gbWFrZSBzdXJlIHN1YnNlcXVlbnQgZXJyb3IgaGFuZGxpbmcgc2VlcyB0aGUgc2Vzc2lvbiBpbiBhIGZpbmFsIHN0YXRlIAogICAgICAgICAgICAgY2hhbm5lbC5zZW5kQ29udHJvbE1lc3NhZ2UobmV3IFNlc3Npb25GYWlsZWRNZXNzYWdlKCkpLmF3YWl0VW5pbnRlcnJ1cHRpYmx5KCk7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY2xvc2VTZXNzaW9uKFN0YXRlLkZBSUxFRCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgZmFpbHVyZVJlYXNvbiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJGYWlsZWQgYmVjYXVzZSBvZiBhbiB1bmtub3duIGV4Y2VwdGlvblxuIik7CisgICAgICAgIGJvdW5kU3RhY2tUcmFjZShlLCBERUJVR19TVEFDS1RSQUNFX0xJTUlULCBmYWlsdXJlUmVhc29uKTsKKyAgICAgICAgcmV0dXJuIGNsb3NlU2Vzc2lvbihTdGF0ZS5GQUlMRUQsIGZhaWx1cmVSZWFzb24udG9TdHJpbmcoKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGxvZ0Vycm9yKFRocm93YWJsZSBlKQpAQCAtNzMwLDYgKzc1OCw4IEBACiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVBc3luYyhDb2xsZWN0aW9uPFN0cmVhbVJlcXVlc3Q+IHJlcXVlc3RzLCBDb2xsZWN0aW9uPFN0cmVhbVN1bW1hcnk+IHN1bW1hcmllcykKICAgICB7CisgICAgICAgIGlmIChTdHJlYW1PcGVyYXRpb24uUkVQQUlSID09IHN0cmVhbU9wZXJhdGlvbigpKQorICAgICAgICAgICAgY2hlY2tBdmFpbGFibGVEaXNrU3BhY2VBbmRDb21wYWN0aW9ucyhzdW1tYXJpZXMpOwogICAgICAgICBmb3IgKFN0cmVhbVJlcXVlc3QgcmVxdWVzdCA6IHJlcXVlc3RzKQogICAgICAgICAgICAgYWRkVHJhbnNmZXJSYW5nZXMocmVxdWVzdC5rZXlzcGFjZSwgUmFuZ2VzQXRFbmRwb2ludC5jb25jYXQocmVxdWVzdC5mdWxsLCByZXF1ZXN0LnRyYW5zaWVudFJlcGxpY2FzKSwgcmVxdWVzdC5jb2x1bW5GYW1pbGllcywgdHJ1ZSk7IC8vIGFsd2F5cyBmbHVzaCBvbiBzdHJlYW0gcmVxdWVzdAogICAgICAgICBmb3IgKFN0cmVhbVN1bW1hcnkgc3VtbWFyeSA6IHN1bW1hcmllcykKQEAgLTc1OCw2ICs3ODgsOCBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVTeW5BY2soUHJlcGFyZVN5bkFja01lc3NhZ2UgbXNnKQogICAgIHsKKyAgICAgICAgaWYgKFN0cmVhbU9wZXJhdGlvbi5SRVBBSVIgPT0gc3RyZWFtT3BlcmF0aW9uKCkpCisgICAgICAgICAgICBjaGVja0F2YWlsYWJsZURpc2tTcGFjZUFuZENvbXBhY3Rpb25zKG1zZy5zdW1tYXJpZXMpOwogICAgICAgICBpZiAoIW1zZy5zdW1tYXJpZXMuaXNFbXB0eSgpKQogICAgICAgICB7CiAgICAgICAgICAgICBmb3IgKFN0cmVhbVN1bW1hcnkgc3VtbWFyeSA6IG1zZy5zdW1tYXJpZXMpCkBAIC03ODIsNiArODE0LDE2MyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEluIHRoZSBjYXNlIHdoZXJlIHdlIGhhdmUgYW4gZXJyb3IgY2hlY2tpbmcgZGlzayBzcGFjZSB3ZSBhbGxvdyB0aGUgT3BlcmF0aW9uIHRvIGNvbnRpbnVlLgorICAgICAqIEluIHRoZSBjYXNlIHdoZXJlIHdlIGRvIF9ub3RfIGhhdmUgYXZhaWxhYmxlIHNwYWNlLCB0aGlzIG1ldGhvZCByYWlzZXMgYSBSVEUuCisgICAgICogVE9ETzogQ29uc2lkZXIgcmV2aXNpbmcgdGhpcyB0byByZXR1cm5pbmcgYSBib29sZWFuIGFuZCBhbGxvd2luZyBjYWxsZXJzIHVwc3RyZWFtIHRvIGhhbmRsZSB0aGF0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja0F2YWlsYWJsZURpc2tTcGFjZUFuZENvbXBhY3Rpb25zKENvbGxlY3Rpb248U3RyZWFtU3VtbWFyeT4gc3VtbWFyaWVzKQorICAgIHsKKyAgICAgICAgaWYgKERhdGFiYXNlRGVzY3JpcHRvci5nZXRTa2lwU3RyZWFtRGlza1NwYWNlQ2hlY2soKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBib29sZWFuIGhhc0F2YWlsYWJsZVNwYWNlID0gdHJ1ZTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgaGFzQXZhaWxhYmxlU3BhY2UgPSBjaGVja0F2YWlsYWJsZURpc2tTcGFjZUFuZENvbXBhY3Rpb25zKHN1bW1hcmllcywgcGxhbklkKCksIHBlZXIuZ2V0SG9zdEFkZHJlc3ModHJ1ZSksIHBlbmRpbmdSZXBhaXIgIT0gbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIltTdHJlYW0gI3t9XSBDb3VsZCBub3QgY2hlY2sgYXZhaWxhYmxlIGRpc2sgc3BhY2UgYW5kIGNvbXBhY3Rpb25zIGZvciB7fSwgc3VtbWFyaWVzID0ge30iLCBwbGFuSWQoKSwgdGhpcywgc3VtbWFyaWVzLCBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWhhc0F2YWlsYWJsZVNwYWNlKQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiTm90IGVub3VnaCBkaXNrIHNwYWNlIGZvciBzdHJlYW0gJXMpLCBzdW1tYXJpZXM9JXMiLCB0aGlzLCBzdW1tYXJpZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlcyBzdXJlIHRoYXQgd2UgZXhwZWN0IHRvIGhhdmUgZW5vdWdoIGRpc2sgc3BhY2UgYXZhaWxhYmxlIGZvciB0aGUgbmV3IHN0cmVhbXMsIHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24KKyAgICAgKiB0aGUgb25nb2luZyBjb21wYWN0aW9ucyBhbmQgc3RyZWFtcy4KKyAgICAgKi8KKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tBdmFpbGFibGVEaXNrU3BhY2VBbmRDb21wYWN0aW9ucyhDb2xsZWN0aW9uPFN0cmVhbVN1bW1hcnk+IHN1bW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATnVsbGFibGUgVGltZVVVSUQgcGxhbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgcmVtb3RlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzRm9ySW5jcmVtZW50YWwpCisgICAgeworICAgICAgICBNYXA8VGFibGVJZCwgTG9uZz4gcGVyVGFibGVJZEluY29taW5nQnl0ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIE1hcDxUYWJsZUlkLCBJbnRlZ2VyPiBwZXJUYWJsZUlkSW5jb21pbmdGaWxlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgbG9uZyBuZXdTdHJlYW1Ub3RhbCA9IDA7CisgICAgICAgIGZvciAoU3RyZWFtU3VtbWFyeSBzdW1tYXJ5IDogc3VtbWFyaWVzKQorICAgICAgICB7CisgICAgICAgICAgICBwZXJUYWJsZUlkSW5jb21pbmdGaWxlcy5tZXJnZShzdW1tYXJ5LnRhYmxlSWQsIHN1bW1hcnkuZmlsZXMsIEludGVnZXI6OnN1bSk7CisgICAgICAgICAgICBwZXJUYWJsZUlkSW5jb21pbmdCeXRlcy5tZXJnZShzdW1tYXJ5LnRhYmxlSWQsIHN1bW1hcnkudG90YWxTaXplLCBMb25nOjpzdW0pOworICAgICAgICAgICAgbmV3U3RyZWFtVG90YWwgKz0gc3VtbWFyeS50b3RhbFNpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLmlzRW1wdHkoKSB8fCBuZXdTdHJlYW1Ub3RhbCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgcmV0dXJuIGNoZWNrRGlza1NwYWNlKHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLCBwbGFuSWQsIERpcmVjdG9yaWVzOjpnZXRGaWxlU3RvcmUpICYmCisgICAgICAgICAgICAgICBjaGVja1BlbmRpbmdDb21wYWN0aW9ucyhwZXJUYWJsZUlkSW5jb21pbmdCeXRlcywgcGVyVGFibGVJZEluY29taW5nRmlsZXMsIHBsYW5JZCwgcmVtb3RlQWRkcmVzcywgaXNGb3JJbmNyZW1lbnRhbCwgbmV3U3RyZWFtVG90YWwpOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyBib29sZWFuIGNoZWNrRGlza1NwYWNlKE1hcDxUYWJsZUlkLCBMb25nPiBwZXJUYWJsZUlkSW5jb21pbmdCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVVVJRCBwbGFuSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248RmlsZSwgRmlsZVN0b3JlPiBmaWxlU3RvcmVNYXBwZXIpCisgICAgeworICAgICAgICBNYXA8RmlsZVN0b3JlLCBMb25nPiBuZXdTdHJlYW1CeXRlc1RvV3JpdGVQZXJGaWxlU3RvcmUgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIFNldDxGaWxlU3RvcmU+IGFsbEZpbGVTdG9yZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIC8vIFN1bSB1cCB0aGUgaW5jb21pbmcgYnl0ZXMgcGVyIGZpbGUgc3RvcmUgLSB3ZSBhc3N1bWUgdGhhdCB0aGUgc3RyZWFtIGlzIGV2ZW5seSBkaXN0cmlidXRlZCBvdmVyIHRoZSB3cml0YWJsZQorICAgICAgICAvLyBmaWxlIHN0b3JlcyBmb3IgdGhlIHRhYmxlLgorICAgICAgICBmb3IgKE1hcC5FbnRyeTxUYWJsZUlkLCBMb25nPiBlbnRyeSA6IHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLmVudHJ5U2V0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IENvbHVtbkZhbWlseVN0b3JlLmdldElmRXhpc3RzKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgIGlmIChjZnMgPT0gbnVsbCB8fCBwZXJUYWJsZUlkSW5jb21pbmdCeXRlcy5nZXQoZW50cnkuZ2V0S2V5KCkpID09IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIFNldDxGaWxlU3RvcmU+IGFsbFdyaXRlYWJsZUZpbGVTdG9yZXMgPSBjZnMuZ2V0RGlyZWN0b3JpZXMoKS5hbGxGaWxlU3RvcmVzKGZpbGVTdG9yZU1hcHBlcik7CisgICAgICAgICAgICBpZiAoYWxsV3JpdGVhYmxlRmlsZVN0b3Jlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJbU3RyZWFtICN7fV0gQ291bGQgbm90IGdldCBhbnkgd3JpdGVhYmxlIEZpbGVTdG9yZXMgZm9yIHt9Lnt9IiwgcGxhbklkLCBjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMuZ2V0VGFibGVOYW1lKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWxsRmlsZVN0b3Jlcy5hZGRBbGwoYWxsV3JpdGVhYmxlRmlsZVN0b3Jlcyk7CisgICAgICAgICAgICBsb25nIHRvdGFsQnl0ZXNJblBlckZpbGVTdG9yZSA9IGVudHJ5LmdldFZhbHVlKCkgLyBhbGxXcml0ZWFibGVGaWxlU3RvcmVzLnNpemUoKTsKKyAgICAgICAgICAgIGZvciAoRmlsZVN0b3JlIGZzIDogYWxsV3JpdGVhYmxlRmlsZVN0b3JlcykKKyAgICAgICAgICAgICAgICBuZXdTdHJlYW1CeXRlc1RvV3JpdGVQZXJGaWxlU3RvcmUubWVyZ2UoZnMsIHRvdGFsQnl0ZXNJblBlckZpbGVTdG9yZSwgTG9uZzo6c3VtKTsKKyAgICAgICAgfQorICAgICAgICBNYXA8RmlsZVN0b3JlLCBMb25nPiB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZyA9IERpcmVjdG9yaWVzLnBlckZpbGVTdG9yZShDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZXN0aW1hdGVkUmVtYWluaW5nV3JpdGVCeXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlU3RvcmVNYXBwZXIpOworICAgICAgICBsb25nIHRvdGFsU3RyZWFtUmVtYWluaW5nID0gU3RyZWFtTWFuYWdlci5pbnN0YW5jZS5nZXRUb3RhbFJlbWFpbmluZ09uZ29pbmdCeXRlcygpOworICAgICAgICBsb25nIHRvdGFsQnl0ZXNTdHJlYW1SZW1haW5pbmdQZXJGaWxlU3RvcmUgPSB0b3RhbFN0cmVhbVJlbWFpbmluZyAvIE1hdGgubWF4KDEsIGFsbEZpbGVTdG9yZXMuc2l6ZSgpKTsKKyAgICAgICAgTWFwPEZpbGVTdG9yZSwgTG9uZz4gYWxsV3JpdGVEYXRhID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxGaWxlU3RvcmUsIExvbmc+IGZzQnl0ZXMgOiBuZXdTdHJlYW1CeXRlc1RvV3JpdGVQZXJGaWxlU3RvcmUuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIGFsbFdyaXRlRGF0YS5wdXQoZnNCeXRlcy5nZXRLZXkoKSwgZnNCeXRlcy5nZXRWYWx1ZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxCeXRlc1N0cmVhbVJlbWFpbmluZ1BlckZpbGVTdG9yZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nLmdldE9yRGVmYXVsdChmc0J5dGVzLmdldEtleSgpLCAwTCkpOworCisgICAgICAgIGlmICghRGlyZWN0b3JpZXMuaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKGFsbFdyaXRlRGF0YSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiW1N0cmVhbSAje31dIE5vdCBlbm91Z2ggZGlzayBzcGFjZSB0byBzdHJlYW0ge30gdG8ge30gKHN0cmVhbSBvbmdvaW5nIHJlbWFpbmluZz17fSwgY29tcGFjdGlvbiBvbmdvaW5nIHJlbWFpbmluZz17fSwgYWxsIG9uZ29pbmcgd3JpdGVzPXt9KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0cmVhbUJ5dGVzVG9Xcml0ZVBlckZpbGVTdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwZXJUYWJsZUlkSW5jb21pbmdCeXRlcy5rZXlTZXQoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChDb2x1bW5GYW1pbHlTdG9yZTo6Z2V0SWZFeGlzdHMpLmZpbHRlcihPYmplY3RzOjpub25OdWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChjZnMgLT4gY2ZzLmtleXNwYWNlLmdldE5hbWUoKSArICcuJyArIGNmcy5uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RyZWFtUmVtYWluaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsbFdyaXRlRGF0YSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQFZpc2libGVGb3JUZXN0aW5nCisgICAgc3RhdGljIGJvb2xlYW4gY2hlY2tQZW5kaW5nQ29tcGFjdGlvbnMoTWFwPFRhYmxlSWQsIExvbmc+IHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxUYWJsZUlkLCBJbnRlZ2VyPiBwZXJUYWJsZUlkSW5jb21pbmdGaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVVVJRCBwbGFuSWQsIFN0cmluZyByZW1vdGVBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNGb3JJbmNyZW1lbnRhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG5ld1N0cmVhbVRvdGFsKQorICAgIHsKKworICAgICAgICBpbnQgcGVuZGluZ0NvbXBhY3Rpb25zQmVmb3JlU3RyZWFtaW5nID0gMDsKKyAgICAgICAgaW50IHBlbmRpbmdDb21wYWN0aW9uc0FmdGVyU3RyZWFtaW5nID0gMDsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHRhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PihwZXJUYWJsZUlkSW5jb21pbmdGaWxlcy5zaXplKCkpOworICAgICAgICBmb3IgKEtleXNwYWNlIGtzIDogS2V5c3BhY2UuYWxsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1hcDxDb2x1bW5GYW1pbHlTdG9yZSwgVGFibGVJZD4gY2ZTdHJlYW1lZCA9IHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLmtleVNldCgpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoa3M6Omhhc0NvbHVtbkZhbWlseVN0b3JlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKGtzOjpnZXRDb2x1bW5GYW1pbHlTdG9yZSwgRnVuY3Rpb24uaWRlbnRpdHkoKSkpOworICAgICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZnMgOiBrcy5nZXRDb2x1bW5GYW1pbHlTdG9yZXMoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyIGNzbSA9IGNmcy5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCk7CisgICAgICAgICAgICAgICAgaW50IHRhc2tzT3RoZXIgPSBjc20uZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoKTsKKyAgICAgICAgICAgICAgICBpbnQgdGFza3NTdHJlYW1lZCA9IHRhc2tzT3RoZXI7CisgICAgICAgICAgICAgICAgaWYgKGNmU3RyZWFtZWQuY29udGFpbnNLZXkoY2ZzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRhYmxlSWQgdGFibGVJZCA9IGNmU3RyZWFtZWQuZ2V0KGNmcyk7CisgICAgICAgICAgICAgICAgICAgIHRhc2tzU3RyZWFtZWQgPSBjc20uZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MocGVyVGFibGVJZEluY29taW5nRmlsZXMuZ2V0KHRhYmxlSWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLmdldCh0YWJsZUlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0ZvckluY3JlbWVudGFsKTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGVzLmFkZChTdHJpbmcuZm9ybWF0KCIlcy4lcyIsIGNmcy5rZXlzcGFjZS5nZXROYW1lKCksIGNmcy5uYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlbmRpbmdDb21wYWN0aW9uc0JlZm9yZVN0cmVhbWluZyArPSB0YXNrc090aGVyOworICAgICAgICAgICAgICAgIHBlbmRpbmdDb21wYWN0aW9uc0FmdGVyU3RyZWFtaW5nICs9IHRhc2tzU3RyZWFtZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh0YWJsZXMpOworICAgICAgICBpbnQgcGVuZGluZ1RocmVzaG9sZCA9IEFjdGl2ZVJlcGFpclNlcnZpY2UuaW5zdGFuY2UuZ2V0UmVwYWlyUGVuZGluZ0NvbXBhY3Rpb25SZWplY3RUaHJlc2hvbGQoKTsKKyAgICAgICAgaWYgKHBlbmRpbmdDb21wYWN0aW9uc0FmdGVyU3RyZWFtaW5nID4gcGVuZGluZ1RocmVzaG9sZCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJbU3RyZWFtICN7fV0gUmVqZWN0aW5nIGluY29taW5nIGZpbGVzIGJhc2VkIG9uIHBlbmRpbmcgY29tcGFjdGlvbnMgY2FsY3VsYXRpb24gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgInBlbmRpbmdDb21wYWN0aW9uc0JlZm9yZVN0cmVhbWluZz17fSBwZW5kaW5nQ29tcGFjdGlvbnNBZnRlclN0cmVhbWluZz17fSBwZW5kaW5nVGhyZXNob2xkPXt9IHJlbW90ZUFkZHJlc3M9e30iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5JZCwgcGVuZGluZ0NvbXBhY3Rpb25zQmVmb3JlU3RyZWFtaW5nLCBwZW5kaW5nQ29tcGFjdGlvbnNBZnRlclN0cmVhbWluZywgcGVuZGluZ1RocmVzaG9sZCwgcmVtb3RlQWRkcmVzcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBsb25nIG5ld1N0cmVhbUZpbGVzID0gcGVyVGFibGVJZEluY29taW5nRmlsZXMudmFsdWVzKCkuc3RyZWFtKCkubWFwVG9JbnQoaSAtPiBpKS5zdW0oKTsKKworICAgICAgICBsb2dnZXIuaW5mbygiW1N0cmVhbSAje31dIEFjY2VwdGluZyBpbmNvbWluZyBmaWxlcyBuZXdTdHJlYW1Ub3RhbFNTVGFibGVzPXt9IG5ld1N0cmVhbVRvdGFsQnl0ZXM9e30gIiArCisgICAgICAgICAgICAgICAgICAgICJwZW5kaW5nQ29tcGFjdGlvbnNCZWZvcmVTdHJlYW1pbmc9e30gcGVuZGluZ0NvbXBhY3Rpb25zQWZ0ZXJTdHJlYW1pbmc9e30gcGVuZGluZ1RocmVzaG9sZD17fSByZW1vdGVBZGRyZXNzPXt9ICIgKworICAgICAgICAgICAgICAgICAgICAic3RyZWFtZWRUYWJsZXM9XCJ7fVwiIiwKKyAgICAgICAgICAgICAgICAgICAgcGxhbklkLCBuZXdTdHJlYW1GaWxlcywgbmV3U3RyZWFtVG90YWwsCisgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdDb21wYWN0aW9uc0JlZm9yZVN0cmVhbWluZywgcGVuZGluZ0NvbXBhY3Rpb25zQWZ0ZXJTdHJlYW1pbmcsIHBlbmRpbmdUaHJlc2hvbGQsIHJlbW90ZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5qb2luKCIsIiwgdGFibGVzKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgogICAgICAqIENhbGwgYmFjayBhZnRlciBzZW5kaW5nIFN0cmVhbU1lc3NhZ2VIZWFkZXIuCiAgICAgICoKICAgICAgKiBAcGFyYW0gbWVzc2FnZSBzZW50IHN0cmVhbSBtZXNzYWdlCkBAIC04MDIsNyArOTkxLDcgQEAKICAgICAgICAgU3RyZWFtVHJhbnNmZXJUYXNrIHRhc2sgPSB0cmFuc2ZlcnMuZ2V0KG1lc3NhZ2UuaGVhZGVyLnRhYmxlSWQpOwogICAgICAgICBpZiAodGFzayAhPSBudWxsKQogICAgICAgICB7Ci0gICAgICAgICAgICB0YXNrLnNjaGVkdWxlVGltZW91dChtZXNzYWdlLmhlYWRlci5zZXF1ZW5jZU51bWJlciwgMTIsIFRpbWVVbml0LkhPVVJTKTsKKyAgICAgICAgICAgIHRhc2suc2NoZWR1bGVUaW1lb3V0KG1lc3NhZ2UuaGVhZGVyLnNlcXVlbmNlTnVtYmVyLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U3RyZWFtVHJhbnNmZXJUYXNrVGltZW91dCgpLnRvTWlsbGlzZWNvbmRzKCksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTkyOCw3ICsxMTE3LDkgQEAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2Vzc2lvbkZhaWxlZCgpCiAgICAgewogICAgICAgICBsb2dnZXIuZXJyb3IoIltTdHJlYW0gI3t9XSBSZW1vdGUgcGVlciB7fSBmYWlsZWQgc3RyZWFtIHNlc3Npb24uIiwgcGxhbklkKCksIHBlZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIGNsb3NlU2Vzc2lvbihTdGF0ZS5GQUlMRUQpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHN0cmluZ0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgiUmVtb3RlIHBlZXIgIikuYXBwZW5kKHBlZXIpLmFwcGVuZCgiIGZhaWxlZCBzdHJlYW0gc2Vzc2lvbiIpOworICAgICAgICBjbG9zZVNlc3Npb24oU3RhdGUuRkFJTEVELCBzdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCkpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTM3LDcgKzExMjgsNyBAQAogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXNzaW9uVGltZW91dCgpCiAgICAgewogICAgICAgICBsb2dnZXIuZXJyb3IoIltTdHJlYW0gI3t9XSB0aW1lb3V0IHdpdGgge30uIiwgcGxhbklkKCksIHBlZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIGNsb3NlU2Vzc2lvbihTdGF0ZS5GQUlMRUQpOworICAgICAgICBjbG9zZVNlc3Npb24oU3RhdGUuRkFJTEVELCAiU2Vzc2lvbiB0aW1lZCBvdXQiKTsKICAgICB9CiAKICAgICAvKioKQEAgLTk1MSw3ICsxMTQyLDcgQEAKICAgICAgICAgTGlzdDxTdHJlYW1TdW1tYXJ5PiB0cmFuc2ZlclN1bW1hcmllcyA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwogICAgICAgICBmb3IgKFN0cmVhbVRhc2sgdHJhbnNmZXIgOiB0cmFuc2ZlcnMudmFsdWVzKCkpCiAgICAgICAgICAgICB0cmFuc2ZlclN1bW1hcmllcy5hZGQodHJhbnNmZXIuZ2V0U3VtbWFyeSgpKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uSW5mbyhjaGFubmVsLnBlZXIoKSwgaW5kZXgsIGNoYW5uZWwuY29ubmVjdGVkVG8oKSwgcmVjZWl2aW5nU3VtbWFyaWVzLCB0cmFuc2ZlclN1bW1hcmllcywgc3RhdGUpOworICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25JbmZvKGNoYW5uZWwucGVlcigpLCBpbmRleCwgY2hhbm5lbC5jb25uZWN0ZWRUbygpLCByZWNlaXZpbmdTdW1tYXJpZXMsIHRyYW5zZmVyU3VtbWFyaWVzLCBzdGF0ZSwgZmFpbHVyZVJlYXNvbik7CiAgICAgfQogCiAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHRhc2tDb21wbGV0ZWQoU3RyZWFtUmVjZWl2ZVRhc2sgY29tcGxldGVkVGFzaykKQEAgLTk2NiwxOCArMTE1Nyw2IEBACiAgICAgICAgIG1heWJlQ29tcGxldGVkKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgb25SZW1vdmUoSW5ldEFkZHJlc3NBbmRQb3J0IGVuZHBvaW50KQotICAgIHsKLSAgICAgICAgbG9nZ2VyLmVycm9yKCJbU3RyZWFtICN7fV0gU2Vzc2lvbiBmYWlsZWQgYmVjYXVzZSByZW1vdGUgcGVlciB7fSBoYXMgbGVmdC4iLCBwbGFuSWQoKSwgcGVlci50b1N0cmluZygpKTsKLSAgICAgICAgY2xvc2VTZXNzaW9uKFN0YXRlLkZBSUxFRCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25SZXN0YXJ0KEluZXRBZGRyZXNzQW5kUG9ydCBlbmRwb2ludCwgRW5kcG9pbnRTdGF0ZSBlcFN0YXRlKQotICAgIHsKLSAgICAgICAgbG9nZ2VyLmVycm9yKCJbU3RyZWFtICN7fV0gU2Vzc2lvbiBmYWlsZWQgYmVjYXVzZSByZW1vdGUgcGVlciB7fSB3YXMgcmVzdGFydGVkLiIsIHBsYW5JZCgpLCBwZWVyLnRvU3RyaW5nKCkpOwotICAgICAgICBjbG9zZVNlc3Npb24oU3RhdGUuRkFJTEVEKTsKLSAgICB9Ci0KICAgICBwcml2YXRlIHZvaWQgY29tcGxldGVQcmV2aWV3KCkKICAgICB7CiAgICAgICAgIHRyeQpAQCAtMTEzMCw3ICsxMzA5LDcgQEAKICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiW1N0cmVhbSAje31dIFN0cmVhbSBzZXNzaW9uIHdpdGggcGVlciB7fSBpcyBhbHJlYWR5IGluIGEgZmluYWwgc3RhdGUgb24gYWJvcnQuIiwgcGxhbklkKCksIHBlZXIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0KKyAgICAgICAgICAgIAogICAgICAgICBsb2dnZXIuaW5mbygiW1N0cmVhbSAje31dIEFib3J0aW5nIHN0cmVhbSBzZXNzaW9uIHdpdGggcGVlciB7fS4uLiIsIHBsYW5JZCgpLCBwZWVyKTsKIAogICAgICAgICBpZiAoY2hhbm5lbC5jb25uZWN0ZWQoKSkKQEAgLTExNDUsNCArMTMyNCw1MyBAQAogICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJbU3RyZWFtICN7fV0gRXJyb3IgYWJvcnRpbmcgc3RyZWFtIHNlc3Npb24gd2l0aCBwZWVyIHt9IiwgcGxhbklkKCksIHBlZXIpOwogICAgICAgICB9CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIlN0cmVhbVNlc3Npb257IiArCisgICAgICAgICAgICAgICAic3RyZWFtT3BlcmF0aW9uPSIgKyBzdHJlYW1PcGVyYXRpb24gKworICAgICAgICAgICAgICAgIiwgcGVlcj0iICsgcGVlciArCisgICAgICAgICAgICAgICAiLCBjaGFubmVsPSIgKyBjaGFubmVsICsKKyAgICAgICAgICAgICAgICIsIHJlcXVlc3RzPSIgKyByZXF1ZXN0cyArCisgICAgICAgICAgICAgICAiLCB0cmFuc2ZlcnM9IiArIHRyYW5zZmVycyArCisgICAgICAgICAgICAgICAiLCBpc0ZvbGxvd2VyPSIgKyBpc0ZvbGxvd2VyICsKKyAgICAgICAgICAgICAgICIsIHBlbmRpbmdSZXBhaXI9IiArIHBlbmRpbmdSZXBhaXIgKworICAgICAgICAgICAgICAgIiwgcHJldmlld0tpbmQ9IiArIHByZXZpZXdLaW5kICsKKyAgICAgICAgICAgICAgICIsIHN0YXRlPSIgKyBzdGF0ZSArCisgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdCdWlsZGVyIGJvdW5kU3RhY2tUcmFjZShUaHJvd2FibGUgZSwgaW50IGxpbWl0LCBTdHJpbmdCdWlsZGVyIG91dCkKKyAgICB7CisgICAgICAgIFNldDxUaHJvd2FibGU+IHZpc2l0ZWQgPSBDb2xsZWN0aW9ucy5uZXdTZXRGcm9tTWFwKG5ldyBJZGVudGl0eUhhc2hNYXA8PigpKTsKKyAgICAgICAgcmV0dXJuIGJvdW5kU3RhY2tUcmFjZShlLCBsaW1pdCwgbGltaXQsIHZpc2l0ZWQsIG91dCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdCdWlsZGVyIGJvdW5kU3RhY2tUcmFjZShUaHJvd2FibGUgZSwgaW50IGxpbWl0LCBpbnQgY291bnRlciwgU2V0PFRocm93YWJsZT4gdmlzaXRlZCwgU3RyaW5nQnVpbGRlciBvdXQpCisgICAgeworICAgICAgICBpZiAoZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG91dDsKKworICAgICAgICBpZiAoIXZpc2l0ZWQuYWRkKGUpKQorICAgICAgICAgICAgcmV0dXJuIG91dC5hcHBlbmQoIltDSVJDVUxBUiBSRUZFUkVOQ0U6ICIpLmFwcGVuZChlLmdldENsYXNzKCkuZ2V0TmFtZSgpKS5hcHBlbmQoIjogIikuYXBwZW5kKGUuZ2V0TWVzc2FnZSgpKS5hcHBlbmQoIl0iKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgIHZpc2l0ZWQuYWRkKGUpOworCisgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50W10gc3RhY2tUcmFjZSA9IGUuZ2V0U3RhY2tUcmFjZSgpOworICAgICAgICBvdXQuYXBwZW5kKGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiAiICsgZS5nZXRNZXNzYWdlKCkpLmFwcGVuZCgnXG4nKTsKKworICAgICAgICAvLyBXaGVuIGRlYWxpbmcgd2l0aCB0aGUgbGVhZiwgaWdub3JlIGhvdyBtYW55IHN0YWNrIHRyYWNlcyB3ZXJlIGFscmVhZHkgd3JpdHRlbiwgYW5kIGFsbG93IHRoZSBtYXguCisgICAgICAgIC8vIFRoaXMgaXMgaGVyZSBhcyB0aGUgbGVhZiB0ZW5kcyB0byBzaG93IHdoZXJlIHRoZSBpc3N1ZSBzdGFydGVkLCBzbyB0ZW5kcyB0byBiZSBpbXBhY3RmdWwgZm9yIGRlYnVnZ2luZworICAgICAgICBpZiAoZS5nZXRDYXVzZSgpID09IG51bGwpCisgICAgICAgICAgICBjb3VudGVyID0gbGltaXQ7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBNYXRoLm1pbihlLmdldFN0YWNrVHJhY2UoKS5sZW5ndGgsIGxpbWl0KTsgaSA8IHNpemUgJiYgY291bnRlciA+IDA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgb3V0LmFwcGVuZCgnXHQnKS5hcHBlbmQoc3RhY2tUcmFjZVtpXSkuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgY291bnRlci0tOworICAgICAgICB9CisKKyAgICAgICAgYm91bmRTdGFja1RyYWNlKGUuZ2V0Q2F1c2UoKSwgbGltaXQsIGNvdW50ZXIsIHZpc2l0ZWQsIG91dCk7CisgICAgICAgIHJldHVybiBvdXQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVN0YXRlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtU3RhdGUuamF2YQppbmRleCA4OGViNzZkLi42OWJhNjk4IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtU3RhdGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtU3RhdGUuamF2YQpAQCAtNTYsNCArNTYsOCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIExpc3RzLm5ld0FycmF5TGlzdChJdGVyYWJsZXMudHJhbnNmb3JtKHNlc3Npb25zLCBTZXNzaW9uSW5mbzo6Y3JlYXRlU3VtbWFyeSkpOwogICAgIH0KKworICAgIHB1YmxpYyBTZXQ8U2Vzc2lvbkluZm8+IHNlc3Npb25zKCkgeworICAgICAgICByZXR1cm4gc2Vzc2lvbnM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVRyYW5zZmVyVGFzay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVRyYW5zZmVyVGFzay5qYXZhCmluZGV4IDQ1ZmJjYzYuLjA3MjEzMTYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1UcmFuc2ZlclRhc2suamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtVHJhbnNmZXJUYXNrLmphdmEKQEAgLTE0Myw4ICsxNDMsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzdHJlYW1zLmNsZWFyKCk7Ci0gICAgICAgIGlmIChmYWlsICE9IG51bGwpCi0gICAgICAgICAgICBUaHJvd2FibGVzLnByb3BhZ2F0ZShmYWlsKTsKKyAgICAgICAgaWYgKGZhaWwgIT0gbnVsbCkgeworICAgICAgICAgICAgVGhyb3dhYmxlcy50aHJvd0lmVW5jaGVja2VkKGZhaWwpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZmFpbCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBnZXRUb3RhbE51bWJlck9mRmlsZXMoKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbWluZ1N0YXRlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtaW5nU3RhdGUuamF2YQppbmRleCBjMmVlZDFlLi5hYWVjZWIyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtaW5nU3RhdGUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtaW5nU3RhdGUuamF2YQpAQCAtMzQsNiArMzQsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5JTWVhc3VyYWJsZU1lbW9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLlNpbXBsZURhdGFTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMubm9kZXRvb2wuZm9ybWF0dGVyLlRhYmxlQnVpbGRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jazsKQEAgLTQzLDExICs0NCwxMSBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZVVVSUQ7CiAKLXB1YmxpYyBjbGFzcyBTdHJlYW1pbmdTdGF0ZSBpbXBsZW1lbnRzIFN0cmVhbUV2ZW50SGFuZGxlcgorcHVibGljIGNsYXNzIFN0cmVhbWluZ1N0YXRlIGltcGxlbWVudHMgU3RyZWFtRXZlbnRIYW5kbGVyLCBJTWVhc3VyYWJsZU1lbW9yeQogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTdHJlYW1pbmdTdGF0ZS5jbGFzcyk7CiAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgRUxFTUVOVF9TSVpFID0gT2JqZWN0U2l6ZXMubWVhc3VyZURlZXAobmV3IFN0cmVhbWluZ1N0YXRlKG5leHRUaW1lVVVJRCgpLCBTdHJlYW1PcGVyYXRpb24uT1RIRVIsIGZhbHNlKSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVNUFRZID0gT2JqZWN0U2l6ZXMubWVhc3VyZURlZXAobmV3IFN0cmVhbWluZ1N0YXRlKG5leHRUaW1lVVVJRCgpLCBTdHJlYW1PcGVyYXRpb24uT1RIRVIsIGZhbHNlKSk7CiAKICAgICBwdWJsaWMgZW51bSBTdGF0dXMKICAgICB7SU5JVCwgU1RBUlQsIFNVQ0NFU1MsIEZBSUxVUkV9CkBAIC03MCw2ICs3MSwxNCBAQAogICAgIC8vIEFQSSBmb3Igc3RhdGUgY2hhbmdlcwogICAgIHB1YmxpYyBmaW5hbCBQaGFzZSBwaGFzZSA9IG5ldyBQaGFzZSgpOwogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgdW5zaGFyZWRIZWFwU2l6ZSgpCisgICAgeworICAgICAgICBsb25nIGNvc3RPZlBlZXJzID0gcGVlcnMoKS5zaXplKCkgKiAoT2JqZWN0U2l6ZXMuSVBWNl9TT0NLRVRfQUREUkVTU19TSVpFICsgNDgpOyAvLyA0OCByZXByZXNlbnRzIHRoZSBkYXRhc3RydWN0dXJlIGNvc3QgY29tcHV0ZWQgYnkgdGhlIEpPTAorICAgICAgICBsb25nIGNvc3RPZkNvbXBsZXRlTWVzc2FnZSA9IE9iamVjdFNpemVzLnNpemVPZihjb21wbGV0ZU1lc3NhZ2UoKSk7CisgICAgICAgIHJldHVybiBjb3N0T2ZQZWVycyArIGNvc3RPZkNvbXBsZXRlTWVzc2FnZSArIEVNUFRZOworICAgIH0KKwogICAgIHB1YmxpYyBTdHJlYW1pbmdTdGF0ZShTdHJlYW1SZXN1bHRGdXR1cmUgcmVzdWx0KQogICAgIHsKICAgICAgICAgdGhpcyhyZXN1bHQucGxhbklkLCByZXN1bHQuc3RyZWFtT3BlcmF0aW9uLCByZXN1bHQuZ2V0Q29vcmRpbmF0b3IoKS5pc0ZvbGxvd2VyKCkpOwpAQCAtMTA0LDYgKzExMywxMSBAQAogICAgICAgICByZXR1cm4gdGhpcy5wZWVyczsKICAgICB9CiAKKyAgICBwdWJsaWMgU3RyaW5nIGNvbXBsZXRlTWVzc2FnZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZU1lc3NhZ2U7CisgICAgfQorCiAgICAgcHVibGljIFN0YXR1cyBzdGF0dXMoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTI4Myw2ICsyOTcsOCBAQAogICAgIHsKICAgICAgICAgY29tcGxldGVNZXNzYWdlID0gVGhyb3dhYmxlcy5nZXRTdGFja1RyYWNlQXNTdHJpbmcodGhyb3dhYmxlKTsKICAgICAgICAgdXBkYXRlU3RhdGUoU3RhdHVzLkZBSUxVUkUpOworICAgICAgICAvL3dlIGtub3cgdGhlIHNpemUgaXMgbm93IHZlcnkgZGlmZmVyZW50IGZyb20gdGhlIGVzdGltYXRlIHNvIHJlY29tcHV0ZSBieSBhZGRpbmcgYWdhaW4KKyAgICAgICAgU3RyZWFtTWFuYWdlci5pbnN0YW5jZS5hZGRTdHJlYW1pbmdTdGF0ZUFnYWluKHRoaXMpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgdXBkYXRlU3RhdGUoU3RhdHVzIHN0YXRlKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL2FzeW5jL05ldHR5U3RyZWFtaW5nQ29ubmVjdGlvbkZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9hc3luYy9OZXR0eVN0cmVhbWluZ0Nvbm5lY3Rpb25GYWN0b3J5LmphdmEKaW5kZXggNmE1N2UzOS4uNTI5YjM5NiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL2FzeW5jL05ldHR5U3RyZWFtaW5nQ29ubmVjdGlvbkZhY3RvcnkuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvYXN5bmMvTmV0dHlTdHJlYW1pbmdDb25uZWN0aW9uRmFjdG9yeS5qYXZhCkBAIC0yMCw2ICsyMCw5IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiAKQEAgLTM1LDcgKzM4LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbWluZ0NoYW5uZWw7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlBZGRyZXNzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuSW50ZXJub2RlQ29ubmVjdGlvblV0aWxzLmlzU1NMRXJyb3I7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5PdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuaW5pdGlhdGVTdHJlYW1pbmc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5PdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk91dGJvdW5kQ29ubmVjdGlvbkluaXRpYXRvci5Tc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNFUlZFUl9DT05GSUc7CiAKIHB1YmxpYyBjbGFzcyBOZXR0eVN0cmVhbWluZ0Nvbm5lY3Rpb25GYWN0b3J5IGltcGxlbWVudHMgU3RyZWFtaW5nQ2hhbm5lbC5GYWN0b3J5CiB7CkBAIC00NSwyNyArNTEsMzggQEAKICAgICBwdWJsaWMgc3RhdGljIE5ldHR5U3RyZWFtaW5nQ2hhbm5lbCBjb25uZWN0KE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzIHRlbXBsYXRlLCBpbnQgbWVzc2FnaW5nVmVyc2lvbiwgU3RyZWFtaW5nQ2hhbm5lbC5LaW5kIGtpbmQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgRXZlbnRMb29wIGV2ZW50TG9vcCA9IE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5zb2NrZXRGYWN0b3J5Lm91dGJvdW5kU3RyZWFtaW5nR3JvdXAoKS5uZXh0KCk7CisgICAgICAgIE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzIHNldHRpbmdzID0gdGVtcGxhdGUud2l0aERlZmF1bHRzKENvbm5lY3Rpb25DYXRlZ29yeS5TVFJFQU1JTkcpOworICAgICAgICBMaXN0PFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGU+IHNzbEZhbGxiYWNrcyA9IHNldHRpbmdzLndpdGhFbmNyeXB0aW9uKCkgJiYgc2V0dGluZ3MuZW5jcnlwdGlvbi5nZXRPcHRpb25hbCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheXMuYXNMaXN0KFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUudmFsdWVzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFNFUlZFUl9DT05GSUcpOwogCi0gICAgICAgIGludCBhdHRlbXB0cyA9IDA7Ci0gICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBudWxsOworICAgICAgICBmb3IgKGZpbmFsIFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUgc3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZSA6IHNzbEZhbGxiYWNrcykKICAgICAgICAgewotICAgICAgICAgICAgRnV0dXJlPFJlc3VsdDxTdHJlYW1pbmdTdWNjZXNzPj4gcmVzdWx0ID0gaW5pdGlhdGVTdHJlYW1pbmcoZXZlbnRMb29wLCB0ZW1wbGF0ZS53aXRoRGVmYXVsdHMoQ29ubmVjdGlvbkNhdGVnb3J5LlNUUkVBTUlORyksIG1lc3NhZ2luZ1ZlcnNpb24pOwotICAgICAgICAgICAgcmVzdWx0LmF3YWl0VW5pbnRlcnJ1cHRpYmx5KCk7IC8vIGluaXRpYXRlIGhhcyBpdHMgb3duIHRpbWVvdXQsIHNvIHRoaXMgaXMgImd1YXJhbnRlZWQiIHRvIHJldHVybiByZWxhdGl2ZWx5IHByb21wdGx5Ci0gICAgICAgICAgICBpZiAocmVzdWx0LmlzU3VjY2VzcygpKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ09OTkVDVF9BVFRFTVBUUzsgaSsrKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IHJlc3VsdC5nZXROb3coKS5zdWNjZXNzKCkuY2hhbm5lbDsKLSAgICAgICAgICAgICAgICBOZXR0eVN0cmVhbWluZ0NoYW5uZWwgc3RyZWFtaW5nQ2hhbm5lbCA9IG5ldyBOZXR0eVN0cmVhbWluZ0NoYW5uZWwobWVzc2FnaW5nVmVyc2lvbiwgY2hhbm5lbCwga2luZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gU3RyZWFtaW5nQ2hhbm5lbC5LaW5kLkNPTlRST0wpCisgICAgICAgICAgICAgICAgRnV0dXJlPFJlc3VsdDxTdHJlYW1pbmdTdWNjZXNzPj4gcmVzdWx0ID0gaW5pdGlhdGVTdHJlYW1pbmcoZXZlbnRMb29wLCBzZXR0aW5ncywgc3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZSwgbWVzc2FnaW5nVmVyc2lvbik7CisgICAgICAgICAgICAgICAgcmVzdWx0LmF3YWl0VW5pbnRlcnJ1cHRpYmx5KCk7IC8vIGluaXRpYXRlIGhhcyBpdHMgb3duIHRpbWVvdXQsIHNvIHRoaXMgaXMgImd1YXJhbnRlZWQiIHRvIHJldHVybiByZWxhdGl2ZWx5IHByb21wdGx5CisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5pc1N1Y2Nlc3MoKSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENoYW5uZWxQaXBlbGluZSBwaXBlbGluZSA9IGNoYW5uZWwucGlwZWxpbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUuYWRkTGFzdCgic3RyZWFtIiwgc3RyZWFtaW5nQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IHJlc3VsdC5nZXROb3coKS5zdWNjZXNzKCkuY2hhbm5lbDsKKyAgICAgICAgICAgICAgICAgICAgTmV0dHlTdHJlYW1pbmdDaGFubmVsIHN0cmVhbWluZ0NoYW5uZWwgPSBuZXcgTmV0dHlTdHJlYW1pbmdDaGFubmVsKG1lc3NhZ2luZ1ZlcnNpb24sIGNoYW5uZWwsIGtpbmQpOworICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBTdHJlYW1pbmdDaGFubmVsLktpbmQuQ09OVFJPTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbFBpcGVsaW5lIHBpcGVsaW5lID0gY2hhbm5lbC5waXBlbGluZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUuYWRkTGFzdCgic3RyZWFtIiwgc3RyZWFtaW5nQ2hhbm5lbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbWluZ0NoYW5uZWw7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzdHJlYW1pbmdDaGFubmVsOworICAgICAgICAgICAgICAgIGNhdXNlID0gcmVzdWx0LmNhdXNlKCk7CiAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICgrK2F0dGVtcHRzID09IE1BWF9DT05ORUNUX0FUVEVNUFRTKQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiZmFpbGVkIHRvIGNvbm5lY3QgdG8gIiArIHRlbXBsYXRlLnRvICsgIiBmb3Igc3RyZWFtaW5nIGRhdGEiLCByZXN1bHQuY2F1c2UoKSk7CisgICAgICAgICAgICBpZiAoIWlzU1NMRXJyb3IoY2F1c2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrIG9ubHkgd2hlbiB0aGUgZXJyb3IgaXMgU1NMIHJlbGF0ZWQsIG90aGVyd2lzZSByZXRyaWVzIGFyZSBleGhhdXN0ZWQsIHNvIGZhaWwKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImZhaWxlZCB0byBjb25uZWN0IHRvICIgKyB0ZW1wbGF0ZS50byArICIgZm9yIHN0cmVhbWluZyBkYXRhIiwgY2F1c2UpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL2FzeW5jL1N0cmVhbWluZ011bHRpcGxleGVkQ2hhbm5lbC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL2FzeW5jL1N0cmVhbWluZ011bHRpcGxleGVkQ2hhbm5lbC5qYXZhCmluZGV4IDU2MGZlZTkuLjRlYmIzOTEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9hc3luYy9TdHJlYW1pbmdNdWx0aXBsZXhlZENoYW5uZWwuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvYXN5bmMvU3RyZWFtaW5nTXVsdGlwbGV4ZWRDaGFubmVsLmphdmEKQEAgLTUzLDE0ICs1MywxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVW5jaGVja2VkSW50ZXJydXB0ZWRFeGNlcHRpb247CiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzLmdldFJvb3RDYXVzZTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkludGVnZXIucGFyc2VJbnQ7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3lzdGVtLmdldFByb3BlcnR5OwogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuVGhyZWFkLmN1cnJlbnRUaHJlYWQ7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lio7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZy5QUk9QRVJUWV9QUkVGSVg7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1RSRUFNSU5HX1NFU1NJT05fUEFSQUxMRUxUUkFOU0ZFUlM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1TZXNzaW9uLmNyZWF0ZUxvZ1RhZzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLm1lc3NhZ2VzLlN0cmVhbU1lc3NhZ2Uuc2VyaWFsaXplOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcubWVzc2FnZXMuU3RyZWFtTWVzc2FnZS5zZXJpYWxpemVkU2l6ZTsKQEAgLTkxLDcgKzg5LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU3RyZWFtaW5nTXVsdGlwbGV4ZWRDaGFubmVsLmNsYXNzKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9QQVJBTExFTF9UUkFOU0ZFUlMgPSBnZXRBdmFpbGFibGVQcm9jZXNzb3JzKCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9QQVJBTExFTF9UUkFOU0ZFUlMgPSBwYXJzZUludChnZXRQcm9wZXJ0eShQUk9QRVJUWV9QUkVGSVggKyAic3RyZWFtaW5nLnNlc3Npb24ucGFyYWxsZWxUcmFuc2ZlcnMiLCBJbnRlZ2VyLnRvU3RyaW5nKERFRkFVTFRfTUFYX1BBUkFMTEVMX1RSQU5TRkVSUykpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BBUkFMTEVMX1RSQU5TRkVSUyA9IFNUUkVBTUlOR19TRVNTSU9OX1BBUkFMTEVMVFJBTlNGRVJTLmdldEludChERUZBVUxUX01BWF9QQVJBTExFTF9UUkFOU0ZFUlMpOwogCiAgICAgLy8gYSBzaW1wbGUgbWVjaGFuc2ltIGZvciBhbGxvd2luZyBhIGRlZ3JlZSBvZiBmYWlybmVzcyBhY3Jvc3MgbXVsdGlwbGUgc2Vzc2lvbnMKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZW1hcGhvcmUgZmlsZVRyYW5zZmVyU2VtYXBob3JlID0gbmV3RmFpclNlbWFwaG9yZShERUZBVUxUX01BWF9QQVJBTExFTF9UUkFOU0ZFUlMpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL21hbmFnZW1lbnQvUHJvZ3Jlc3NJbmZvQ29tcG9zaXRlRGF0YS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL21hbmFnZW1lbnQvUHJvZ3Jlc3NJbmZvQ29tcG9zaXRlRGF0YS5qYXZhCmluZGV4IDcyYWI4NDQuLjM4ZmYzMWUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1Byb2dyZXNzSW5mb0NvbXBvc2l0ZURhdGEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvbWFuYWdlbWVudC9Qcm9ncmVzc0luZm9Db21wb3NpdGVEYXRhLmphdmEKQEAgLTIyLDggKzIyLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLio7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuUHJvZ3Jlc3NJbmZvOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwpAQCAtNjgsNyArNjYsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05MSw3ICs4OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKE9wZW5EYXRhRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExMCw3ICsxMDgsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL21hbmFnZW1lbnQvU2Vzc2lvbkNvbXBsZXRlRXZlbnRDb21wb3NpdGVEYXRhLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvbWFuYWdlbWVudC9TZXNzaW9uQ29tcGxldGVFdmVudENvbXBvc2l0ZURhdGEuamF2YQppbmRleCA2NjViNGNkLi4xYTZmZWE1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvbWFuYWdlbWVudC9TZXNzaW9uQ29tcGxldGVFdmVudENvbXBvc2l0ZURhdGEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvbWFuYWdlbWVudC9TZXNzaW9uQ29tcGxldGVFdmVudENvbXBvc2l0ZURhdGEuamF2YQpAQCAtMjEsOCArMjEsNiBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uKjsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKLQogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1FdmVudDsKIAogcHVibGljIGNsYXNzIFNlc3Npb25Db21wbGV0ZUV2ZW50Q29tcG9zaXRlRGF0YQpAQCAtNTMsNyArNTEsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MCw3ICs2OCw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKE9wZW5EYXRhRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvbWFuYWdlbWVudC9TZXNzaW9uSW5mb0NvbXBvc2l0ZURhdGEuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1Nlc3Npb25JbmZvQ29tcG9zaXRlRGF0YS5qYXZhCmluZGV4IGYzOWIzMjEuLmVhYTM3YmIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1Nlc3Npb25JbmZvQ29tcG9zaXRlRGF0YS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1Nlc3Npb25JbmZvQ29tcG9zaXRlRGF0YS5qYXZhCkBAIC0yMiw3ICsyMiw2IEBACiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uKjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiAKQEAgLTgzLDcgKzgyLDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTIxLDcgKzEyMCw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKE9wZW5EYXRhRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTEzOCw3ICsxMzcsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgICAgIEZ1bmN0aW9uPENvbXBvc2l0ZURhdGEsIFN0cmVhbVN1bW1hcnk+IHRvU3RyZWFtU3VtbWFyeSA9IG5ldyBGdW5jdGlvbjxDb21wb3NpdGVEYXRhLCBTdHJlYW1TdW1tYXJ5PigpCiAgICAgICAgIHsKQEAgLTE1Miw3ICsxNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbUFycmF5T2ZDb21wb3NpdGVEYXRhKChDb21wb3NpdGVEYXRhW10pIHZhbHVlc1s1XSwgdG9TdHJlYW1TdW1tYXJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tQXJyYXlPZkNvbXBvc2l0ZURhdGEoKENvbXBvc2l0ZURhdGFbXSkgdmFsdWVzWzZdLCB0b1N0cmVhbVN1bW1hcnkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVNlc3Npb24uU3RhdGUudmFsdWVPZigoU3RyaW5nKSB2YWx1ZXNbN10pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1TZXNzaW9uLlN0YXRlLnZhbHVlT2YoKFN0cmluZykgdmFsdWVzWzddKSwgbnVsbCk7IC8vIG51bGwgaXMgaGVyZSB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICAgICAgICBGdW5jdGlvbjxDb21wb3NpdGVEYXRhLCBQcm9ncmVzc0luZm8+IHRvUHJvZ3Jlc3NJbmZvID0gbmV3IEZ1bmN0aW9uPENvbXBvc2l0ZURhdGEsIFByb2dyZXNzSW5mbz4oKQogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgUHJvZ3Jlc3NJbmZvIGFwcGx5KENvbXBvc2l0ZURhdGEgaW5wdXQpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvbWFuYWdlbWVudC9TdHJlYW1TdGF0ZUNvbXBvc2l0ZURhdGEuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1N0cmVhbVN0YXRlQ29tcG9zaXRlRGF0YS5qYXZhCmluZGV4IDVlZTRmMzIuLmMwNDIwNWYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1N0cmVhbVN0YXRlQ29tcG9zaXRlRGF0YS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1N0cmVhbVN0YXRlQ29tcG9zaXRlRGF0YS5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uKjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwpAQCAtNjcsNyArNjYsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMTQsNyArMTEzLDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL21hbmFnZW1lbnQvU3RyZWFtU3VtbWFyeUNvbXBvc2l0ZURhdGEuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9tYW5hZ2VtZW50L1N0cmVhbVN1bW1hcnlDb21wb3NpdGVEYXRhLmphdmEKaW5kZXggYTFmMjQ5Ni4uMDVhMGFmYyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL21hbmFnZW1lbnQvU3RyZWFtU3VtbWFyeUNvbXBvc2l0ZURhdGEuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvbWFuYWdlbWVudC9TdHJlYW1TdW1tYXJ5Q29tcG9zaXRlRGF0YS5qYXZhCkBAIC0yMSw4ICsyMSw2IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi4qOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVN1bW1hcnk7CiAKQEAgLTUzLDcgKzUxLDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjksNyArNjcsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Cb290c3RyYXBNb25pdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Cb290c3RyYXBNb25pdG9yLmphdmEKaW5kZXggNGQ1ODYzOC4uMTJkYTU2ZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvQm9vdHN0cmFwTW9uaXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0Jvb3RzdHJhcE1vbml0b3IuamF2YQpAQCAtMzQsNiArMzQsNyBAQAogICAgIHByaXZhdGUgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS1NTS1kZCBISDptbTpzcyxTU1MiKTsKICAgICBwcml2YXRlIGZpbmFsIFByaW50U3RyZWFtIG91dDsKICAgICBwcml2YXRlIGZpbmFsIENvbmRpdGlvbiBjb25kaXRpb24gPSBuZXdPbmVUaW1lQ29uZGl0aW9uKCk7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBFeGNlcHRpb24gZXJyb3I7CiAKICAgICBwdWJsaWMgQm9vdHN0cmFwTW9uaXRvcihQcmludFN0cmVhbSBvdXQpCiAgICAgewpAQCAtNjYsNyArNjcsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGhhbmRsZUNvbm5lY3Rpb25GYWlsZWQobG9uZyB0aW1lc3RhbXAsIFN0cmluZyBtZXNzYWdlKQogICAgIHsKLSAgICAgICAgRXhjZXB0aW9uIGVycm9yID0gbmV3IElPRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlslc10gSk1YIGNvbm5lY3Rpb24gY2xvc2VkLiAoJXMpIiwKKyAgICAgICAgZXJyb3IgPSBuZXcgSU9FeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiWyVzXSBKTVggY29ubmVjdGlvbiBjbG9zZWQuICglcykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC5mb3JtYXQodGltZXN0YW1wKSwgbWVzc2FnZSkpOwogICAgICAgICBvdXQucHJpbnRsbihlcnJvci5nZXRNZXNzYWdlKCkpOwogICAgICAgICBjb25kaXRpb24uc2lnbmFsQWxsKCk7CkBAIC04Miw5ICs4MywxOSBAQAogICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UgKyAiIChwcm9ncmVzczogIiArIChpbnQpZXZlbnQuZ2V0UHJvZ3Jlc3NQZXJjZW50YWdlKCkgKyAiJSkiOwogICAgICAgICB9CiAgICAgICAgIG91dC5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICBpZiAodHlwZSA9PSBQcm9ncmVzc0V2ZW50VHlwZS5FUlJPUikKKyAgICAgICAgeworICAgICAgICAgICAgZXJyb3IgPSBuZXcgUnVudGltZUV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJCb290c3RyYXAgcmVzdW1lIGhhcyBmYWlsZWQgd2l0aCBlcnJvcjogJXMiLCBtZXNzYWdlKSk7CisgICAgICAgICAgICBjb25kaXRpb24uc2lnbmFsQWxsKCk7CisgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgPT0gUHJvZ3Jlc3NFdmVudFR5cGUuQ09NUExFVEUpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbmRpdGlvbi5zaWduYWxBbGwoKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyBFeGNlcHRpb24gZ2V0RXJyb3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0J1bGtMb2FkQ29ubmVjdGlvbkZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0J1bGtMb2FkQ29ubmVjdGlvbkZhY3RvcnkuamF2YQppbmRleCBlZWYwZWY0Li5iMjgyOTMyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9CdWxrTG9hZENvbm5lY3Rpb25GYWN0b3J5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvQnVsa0xvYWRDb25uZWN0aW9uRmFjdG9yeS5qYXZhCkBAIC01Myw3ICs1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdpbmdWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1pbmdDaGFubmVsLktpbmQga2luZCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICAvLyBUaGUgcHJlZmVycmVkIGFkZHJlc3MgaXMgYWx3YXlzIG92ZXJ3cml0dGVuIGluIGNyZWF0ZSgpLiBUaGlzIG1ldGhvZCBvdmVycmlkZSBvbmx5IGV4aXN0cyBzbyB3ZSBjYW4gYXZvaWQgCisgICAgICAgIC8vIFRoZSBwcmVmZXJyZWQgYWRkcmVzcyBpcyBhbHdheXMgb3ZlcndyaXR0ZW4gaW4gY3JlYXRlKCkuIFRoaXMgbWV0aG9kIG92ZXJyaWRlIG9ubHkgZXhpc3RzIHNvIHdlIGNhbiBhdm9pZAogICAgICAgICAvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIE5ldHR5U3RyZWFtaW5nQ29ubmVjdGlvbkZhY3RvcnkgaW1wbGVtZW50YXRpb24uCiAgICAgICAgIE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzIHRlbXBsYXRlID0gbmV3IE91dGJvdW5kQ29ubmVjdGlvblNldHRpbmdzKGdldEJ5QWRkcmVzcyh0byksIGdldEJ5QWRkcmVzcyhwcmVmZXJyZWQpKTsKICAgICAgICAgcmV0dXJuIGNyZWF0ZSh0ZW1wbGF0ZSwgbWVzc2FnaW5nVmVyc2lvbiwga2luZCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9CdWxrTG9hZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9CdWxrTG9hZGVyLmphdmEKaW5kZXggZWJkZDA3Mi4uOGQ1YTFkNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvQnVsa0xvYWRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0J1bGtMb2FkZXIuamF2YQpAQCAtNzIsNyArNzIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRTU0xPcHRpb25zKG9wdGlvbnMuY2xpZW50RW5jT3B0aW9ucykpLAogICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciwKICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY29ubmVjdGlvbnNQZXJIb3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50YXJnZXRLZXlzcGFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnRhcmdldEtleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50YXJnZXRUYWJsZSk7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRTdHJlYW1UaHJvdWdocHV0T3V0Ym91bmRCeXRlc1BlclNlYyhvcHRpb25zLnRocm90dGxlQnl0ZXMpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0SW50ZXJEQ1N0cmVhbVRocm91Z2hwdXRPdXRib3VuZEJ5dGVzUGVyU2VjKG9wdGlvbnMuaW50ZXJEY1Rocm90dGxlQnl0ZXMpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RW50aXJlU1NUYWJsZVN0cmVhbVRocm91Z2hwdXRPdXRib3VuZE1lYmlieXRlc1BlclNlYyhvcHRpb25zLmVudGlyZVNTVGFibGVUaHJvdHRsZU1lYmlieXRlcyk7CkBAIC05MCw3ICs5MSw2IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgZnV0dXJlID0gbG9hZGVyLnN0cmVhbShvcHRpb25zLmlnbm9yZXMsIGluZGljYXRvcik7CiAgICAgICAgICAgICB9Ci0KICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0dlbmVyYXRlVG9rZW5zLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9HZW5lcmF0ZVRva2Vucy5qYXZhCmluZGV4IGE2ODg4ZDcuLjU2MGE1M2YgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0dlbmVyYXRlVG9rZW5zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvR2VuZXJhdGVUb2tlbnMuamF2YQpAQCAtMjYsNyArMjYsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuT3B0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLlBhcnNlRXhjZXB0aW9uOwotCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBjaC5xb3MubG9nYmFjay5jbGFzc2ljLkxldmVsOwpAQCAtMTA3LDcgKzEwNiw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIud2FybigiRXJyb3IgcnVubmluZyB0b29sLiIsIHQpOworICAgICAgICAgICAgbG9nZ2VyLndhcm4odCwgIkVycm9yIHJ1bm5pbmcgdG9vbC4iKTsKICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTUyLDUgKzE1MSw0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiT3B0aW9ucyBhcmU6IjsKICAgICAgICAgbmV3IEhlbHBGb3JtYXR0ZXIoKS5wcmludEhlbHAodXNhZ2UsIGhlYWRlciwgb3B0aW9ucywgIiIpOwogICAgIH0KLX0KLQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0hhc2hQYXNzd29yZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvSGFzaFBhc3N3b3JkLmphdmEKaW5kZXggZGRjMGE3Mi4uZjIyOTg1OCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvSGFzaFBhc3N3b3JkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvSGFzaFBhc3N3b3JkLmphdmEKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IG51bGw7CiAgICAgICAgICAgICBpZiAoY21kLmhhc09wdGlvbihFTlZfVkFSKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXNzd29yZCA9IFN5c3RlbS5nZXRlbnYoY21kLmdldE9wdGlvblZhbHVlKEVOVl9WQVIpKTsKKyAgICAgICAgICAgICAgICBwYXNzd29yZCA9IFN5c3RlbS5nZXRlbnYoY21kLmdldE9wdGlvblZhbHVlKEVOVl9WQVIpKTsgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdibG9ja1N5c3RlbVByb3BlcnR5VXNhZ2UnCiAgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkID09IG51bGwpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oU3RyaW5nLmZvcm1hdCgiRW52aXJvbm1lbnQgdmFyaWFibGUgJyVzJyBpcyB1bmRlZmluZWQuIiwgY21kLmdldE9wdGlvblZhbHVlKEVOVl9WQVIpKSk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9KTVhUb29sLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9KTVhUb29sLmphdmEKaW5kZXggZDA1NDcxNi4uZGNjOWY2YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvSk1YVG9vbC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0pNWFRvb2wuamF2YQpAQCAtNjIsNyArNjIsNiBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0cy5TZXRWaWV3OwogCiBpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUudHlwZS5UeXBlUmVmZXJlbmNlOwotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CiBpbXBvcnQgaW8uYWlybGlmdC5haXJsaW5lLkFyZ3VtZW50czsKIGltcG9ydCBpby5haXJsaWZ0LmFpcmxpbmUuQ2xpOwogaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5Db21tYW5kOwpAQCAtNzEsNiArNzAsNyBAQAogaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5PcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiBpbXBvcnQgb3JnLnlhbWwuc25ha2V5YW1sLlR5cGVEZXNjcmlwdGlvbjsKIGltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuWWFtbDsKIGltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuY29uc3RydWN0b3IuQ29uc3RydWN0b3I7CkBAIC0xNTcsOCArMTU3LDcgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB2b2lkIGR1bXAoT3V0cHV0U3RyZWFtIG91dHB1dCwgTWFwPFN0cmluZywgSW5mbz4gbWFwKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcHBlci53cml0ZVZhbHVlKG91dHB1dCwgbWFwKTsKKyAgICAgICAgICAgICAgICAgICAgSnNvblV0aWxzLkpTT05fT0JKRUNUX1BSRVRUWV9XUklURVIud3JpdGVWYWx1ZShvdXRwdXQsIG1hcCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIHlhbWwKQEAgLTM3Myw4ICszNzIsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEluZm8+IGxvYWQoSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcHBlci5yZWFkVmFsdWUoaW5wdXQsIG5ldyBUeXBlUmVmZXJlbmNlPE1hcDxTdHJpbmcsIEluZm8+PigpIHt9KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKGlucHV0LCBuZXcgVHlwZVJlZmVyZW5jZTxNYXA8U3RyaW5nLCBJbmZvPj4oKSB7fSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIHlhbWwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0xvYWRlck9wdGlvbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0xvYWRlck9wdGlvbnMuamF2YQppbmRleCA3NzI5OTU1Li5lOWExZjhiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Mb2FkZXJPcHRpb25zLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvTG9hZGVyT3B0aW9ucy5qYXZhCkBAIC0yOSw3ICsyOSw2IEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5uZXQuSG9zdEFuZFBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Db21tYW5kTGluZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkNvbW1hbmRMaW5lUGFyc2VyOwpAQCAtOTMsNiArOTIsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElSRV9TU1RBQkxFX0lOVEVSX0RDX1RIUk9UVExFX01FQklCWVRFUyA9ICJlbnRpcmUtc3N0YWJsZS1pbnRlci1kYy10aHJvdHRsZS1taWIiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPT0xfTkFNRSA9ICJzc3RhYmxlbG9hZGVyIjsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfS0VZU1BBQ0UgPSAidGFyZ2V0LWtleXNwYWNlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfVEFCTEUgPSAidGFyZ2V0LXRhYmxlIjsKIAogICAgIC8qIGNsaWVudCBlbmNyeXB0aW9uIG9wdGlvbnMgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0xfVFJVU1RTVE9SRSA9ICJ0cnVzdHN0b3JlIjsKQEAgLTEyNCw2ICsxMjQsNyBAQAogICAgIHB1YmxpYyBmaW5hbCBTZXQ8SW5ldFNvY2tldEFkZHJlc3M+IGhvc3RzOwogICAgIHB1YmxpYyBmaW5hbCBTZXQ8SW5ldEFkZHJlc3NBbmRQb3J0PiBpZ25vcmVzOwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdGFyZ2V0S2V5c3BhY2U7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0YXJnZXRUYWJsZTsKIAogICAgIExvYWRlck9wdGlvbnMoQnVpbGRlciBidWlsZGVyKQogICAgIHsKQEAgLTE0Nyw2ICsxNDgsNyBAQAogICAgICAgICBob3N0cyA9IGJ1aWxkZXIuaG9zdHM7CiAgICAgICAgIGlnbm9yZXMgPSBidWlsZGVyLmlnbm9yZXM7CiAgICAgICAgIHRhcmdldEtleXNwYWNlID0gYnVpbGRlci50YXJnZXRLZXlzcGFjZTsKKyAgICAgICAgdGFyZ2V0VGFibGUgPSBidWlsZGVyLnRhcmdldFRhYmxlOwogICAgIH0KIAogICAgIHN0YXRpYyBjbGFzcyBCdWlsZGVyCkBAIC0xNzUsNiArMTc3LDcgQEAKICAgICAgICAgU2V0PEluZXRTb2NrZXRBZGRyZXNzPiBob3N0cyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgU2V0PEluZXRBZGRyZXNzQW5kUG9ydD4gaWdub3JlcyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgU3RyaW5nIHRhcmdldEtleXNwYWNlOworICAgICAgICBTdHJpbmcgdGFyZ2V0VGFibGU7CiAKICAgICAgICAgQnVpbGRlcigpCiAgICAgICAgIHsKQEAgLTE5OCw3ICsyMDEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBuZXcgTG9hZGVyT3B0aW9ucyh0aGlzKTsKQEAgLTM4OSw2ICszOTIsMTggQEAKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgdGFyZ2V0S2V5c3BhY2UoU3RyaW5nIGtleXNwYWNlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnRhcmdldEtleXNwYWNlID0ga2V5c3BhY2U7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHRhcmdldFRhYmxlKFN0cmluZyB0YWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50YXJnZXRLZXlzcGFjZSA9IHRhYmxlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgQnVpbGRlciBwYXJzZUFyZ3MoU3RyaW5nIGNtZEFyZ3NbXSkKICAgICAgICAgewogICAgICAgICAgICAgQ29tbWFuZExpbmVQYXJzZXIgcGFyc2VyID0gbmV3IEdudVBhcnNlcigpOwpAQCAtNjU3LDEwICs2NzIsMTYgQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHRhcmdldEtleXNwYWNlID0gY21kLmdldE9wdGlvblZhbHVlKFRBUkdFVF9LRVlTUEFDRSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChTdHJpbmdVdGlscy5pc0JsYW5rKHRhcmdldEtleXNwYWNlKSkKLSAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNc2coIkVtcHR5IGtleXNwYWNlIGlzIG5vdCBzdXBwb3J0ZWQuIiwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY21kLmhhc09wdGlvbihUQVJHRVRfVEFCTEUpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VGFibGUgPSBjbWQuZ2V0T3B0aW9uVmFsdWUoVEFSR0VUX1RBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFN0cmluZ1V0aWxzLmlzQmxhbmsodGFyZ2V0VGFibGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNc2coIkVtcHR5IHRhYmxlIGlzIG5vdCBzdXBwb3J0ZWQuIiwgb3B0aW9ucyk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoUGFyc2VFeGNlcHRpb24gfCBDb25maWd1cmF0aW9uRXhjZXB0aW9uIHwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCkBAIC03NzEsNiArNzkyLDcgQEAKICAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oImNpcGhlcnMiLCBTU0xfQ0lQSEVSX1NVSVRFUywgIkNJUEhFUi1TVUlURVMiLCAiQ2xpZW50IFNTTDogY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZW5jcnlwdGlvbiBzdWl0ZXMgdG8gdXNlIik7CiAgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKCJmIiwgQ09ORklHX1BBVEgsICJwYXRoIHRvIGNvbmZpZyBmaWxlIiwgImNhc3NhbmRyYS55YW1sIGZpbGUgcGF0aCBmb3Igc3RyZWFtaW5nIHRocm91Z2hwdXQgYW5kIGNsaWVudC9zZXJ2ZXIgU1NMLiIpOwogICAgICAgICBvcHRpb25zLmFkZE9wdGlvbigiayIsIFRBUkdFVF9LRVlTUEFDRSwgInRhcmdldCBrZXlzcGFjZSBuYW1lIiwgInRhcmdldCBrZXlzcGFjZSBuYW1lIik7CisgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKCJ0YiIsIFRBUkdFVF9UQUJMRSwgInRhcmdldCB0YWJsZSBuYW1lIiwgInRhcmdldCB0YWJsZSBuYW1lIik7CiAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvTm9kZVByb2JlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Ob2RlUHJvYmUuamF2YQppbmRleCA0YTJmNDNkLi5lMzBlYmQ1IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Ob2RlUHJvYmUuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Ob2RlUHJvYmUuamF2YQpAQCAtMTE1LDYgKzExNSw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMubm9kZXRvb2wuR2V0VGltZW91dDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5OYXRpdmVMaWJyYXJ5OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTk9ERVRPT0xfSk1YX05PVElGSUNBVElPTl9QT0xMX0lOVEVSVkFMX1NFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1NMX0VOQUJMRTsKKwogLyoqCiAgKiBKTVggY2xpZW50IG9wZXJhdGlvbnMgZm9yIENhc3NhbmRyYS4KICAqLwpAQCAtMTI0LDcgKzEyNyw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHNzT2JqTmFtZSA9ICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPVN0b3JhZ2VTZXJ2aWNlIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZGVmYXVsdFBvcnQgPSA3MTk5OwogCi0gICAgc3RhdGljIGxvbmcgSk1YX05PVElGSUNBVElPTl9QT0xMX0lOVEVSVkFMX1NFQ09ORFMgPSBMb25nLmdldExvbmcoImNhc3NhbmRyYS5ub2RldG9vbC5qbXhfbm90aWZpY2F0aW9uX3BvbGxfaW50ZXJ2YWxfc2Vjb25kcyIsIFRpbWVVbml0LlNFQ09ORFMuY29udmVydCg1LCBUaW1lVW5pdC5NSU5VVEVTKSk7CisgICAgc3RhdGljIGxvbmcgSk1YX05PVElGSUNBVElPTl9QT0xMX0lOVEVSVkFMX1NFQ09ORFMgPSBOT0RFVE9PTF9KTVhfTk9USUZJQ0FUSU9OX1BPTExfSU5URVJWQUxfU0VDT05EUy5nZXRMb25nKCk7CiAKICAgICBmaW5hbCBTdHJpbmcgaG9zdDsKICAgICBmaW5hbCBpbnQgcG9ydDsKQEAgLTI5Myw3ICsyOTYsNyBAQAogCiAgICAgcHJpdmF0ZSBSTUlDbGllbnRTb2NrZXRGYWN0b3J5IGdldFJNSUNsaWVudFNvY2tldEZhY3RvcnkoKQogICAgIHsKLSAgICAgICAgaWYgKEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgic3NsLmVuYWJsZSIpKSkKKyAgICAgICAgaWYgKFNTTF9FTkFCTEUuZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgcmV0dXJuIG5ldyBTc2xSTUlDbGllbnRTb2NrZXRGYWN0b3J5KCk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHJldHVybiBSTUlTb2NrZXRGYWN0b3J5LmdldERlZmF1bHRTb2NrZXRGYWN0b3J5KCk7CkBAIC00NjAsNiArNDYzLDExIEBACiAgICAgICAgIHNzUHJveHkuZm9yY2VLZXlzcGFjZUNvbXBhY3Rpb25Gb3JQYXJ0aXRpb25LZXkoa2V5c3BhY2VOYW1lLCBwYXJ0aXRpb25LZXksIHRhYmxlTmFtZXMpOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGZvcmNlQ29tcGFjdGlvbktleXNJZ25vcmluZ0djR3JhY2UoU3RyaW5nIGtleXNwYWNlTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSwgU3RyaW5nLi4uIHBhcnRpdGlvbktleXNJZ25vcmVHY0dyYWNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHNzUHJveHkuZm9yY2VDb21wYWN0aW9uS2V5c0lnbm9yaW5nR2NHcmFjZShrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgcGFydGl0aW9uS2V5c0lnbm9yZUdjR3JhY2UpOworICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGZvcmNlS2V5c3BhY2VGbHVzaChTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcuLi4gdGFibGVOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgewogICAgICAgICBzc1Byb3h5LmZvcmNlS2V5c3BhY2VGbHVzaChrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZXMpOwpAQCAtNDk4LDkgKzUwNiwyOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PENvbXBvc2l0ZURhdGE+PiBnZXRQYXJ0aXRpb25TYW1wbGUoaW50IGNhcGFjaXR5LCBpbnQgZHVyYXRpb25NaWxsaXMsIGludCBjb3VudCwgTGlzdDxTdHJpbmc+IHNhbXBsZXJzKSB0aHJvd3MgT3BlbkRhdGFFeGNlcHRpb24KKworICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZVNjaGVkdWxlZFNhbXBsaW5nKFN0cmluZyBrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHVyYXRpb25NaWxsaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludGVydmFsTWlsbGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBzYW1wbGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNob3VsZFN0b3ApIHRocm93cyBPcGVuRGF0YUV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgcmV0dXJuIHNzUHJveHkuc2FtcGxlUGFydGl0aW9ucyhkdXJhdGlvbk1pbGxpcywgY2FwYWNpdHksIGNvdW50LCBzYW1wbGVycyk7CisgICAgICAgIHJldHVybiBzaG91bGRTdG9wID8KKyAgICAgICAgICAgICAgIHNzUHJveHkuc3RvcFNhbXBsaW5nUGFydGl0aW9ucyhrcywgdGFibGUpIDoKKyAgICAgICAgICAgICAgIHNzUHJveHkuc3RhcnRTYW1wbGluZ1BhcnRpdGlvbnMoa3MsIHRhYmxlLCBkdXJhdGlvbk1pbGxpcywgaW50ZXJ2YWxNaWxsaXMsIGNhcGFjaXR5LCBjb3VudCwgc2FtcGxlcnMpOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0U2FtcGxlVGFza3MoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNzUHJveHkuZ2V0U2FtcGxlVGFza3MoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxDb21wb3NpdGVEYXRhPj4gZ2V0UGFydGl0aW9uU2FtcGxlKFN0cmluZyBrcywgaW50IGNhcGFjaXR5LCBpbnQgZHVyYXRpb25NaWxsaXMsIGludCBjb3VudCwgTGlzdDxTdHJpbmc+IHNhbXBsZXJzKSB0aHJvd3MgT3BlbkRhdGFFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBzc1Byb3h5LnNhbXBsZVBhcnRpdGlvbnMoa3MsIGR1cmF0aW9uTWlsbGlzLCBjYXBhY2l0eSwgY291bnQsIHNhbXBsZXJzKTsKICAgICB9CiAKICAgICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxDb21wb3NpdGVEYXRhPj4gZ2V0UGFydGl0aW9uU2FtcGxlKFN0cmluZyBrcywgU3RyaW5nIGNmLCBpbnQgY2FwYWNpdHksIGludCBkdXJhdGlvbk1pbGxpcywgaW50IGNvdW50LCBMaXN0PFN0cmluZz4gc2FtcGxlcnMpIHRocm93cyBPcGVuRGF0YUV4Y2VwdGlvbgpAQCAtNzUwLDExICs3NzgsMjEgQEAKICAgICAgICAgcmV0dXJuIHNzUHJveHkuZ2V0TG9hZFN0cmluZygpOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5jb21wcmVzc2VkTG9hZFN0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gc3NQcm94eS5nZXRVbmNvbXByZXNzZWRMb2FkU3RyaW5nKCk7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyBnZXRSZWxlYXNlVmVyc2lvbigpCiAgICAgewogICAgICAgICByZXR1cm4gc3NQcm94eS5nZXRSZWxlYXNlVmVyc2lvbigpOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0R2l0U0hBKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzc1Byb3h5LmdldEdpdFNIQSgpOworICAgIH0KKwogICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudEdlbmVyYXRpb25OdW1iZXIoKQogICAgIHsKICAgICAgICAgcmV0dXJuIHNzUHJveHkuZ2V0Q3VycmVudEdlbmVyYXRpb25OdW1iZXIoKTsKQEAgLTgyNywxMSArODY1LDMxIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmVtb3ZlIGFsbCB0aGUgZXhpc3Rpbmcgc25hcHNob3RzLgorICAgICAqIFJlbW92ZSBhbGwgdGhlIGV4aXN0aW5nIHNuYXBzaG90cyBvZiBnaXZlbiB0YWcgZm9yIHByb3ZpZGVkIGtleXNwYWNlcy4KKyAgICAgKiBXaGVuIG5vIGtleXNwYWNlcyBhcmUgc3BlY2lmaWVkLCB0YWtlIGFsbCBrZXlzcGFjZXMgaW50byBhY2NvdW50LiBXaGVuIHRhZyBpcyBub3Qgc3BlY2lmaWVkIChudWxsIG9yIGVtcHR5IHN0cmluZyksCisgICAgICogdGFrZSBhbGwgdGFncyBpbnRvIGFjY291bnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnIHRhZyBvZiBzbmFwc2hvdCB0byBjbGVhcgorICAgICAqIEBwYXJhbSBrZXlzcGFjZXMga2V5c3BhY2VzIHRvIGNsZWFyIHNuYXBzaG90cyBmb3IKICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyB2b2lkIGNsZWFyU25hcHNob3QoU3RyaW5nIHRhZywgU3RyaW5nLi4uIGtleXNwYWNlcykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBzc1Byb3h5LmNsZWFyU25hcHNob3QodGFnLCBrZXlzcGFjZXMpOworICAgICAgICBjbGVhclNuYXBzaG90KENvbGxlY3Rpb25zLmVtcHR5TWFwKCksIHRhZywga2V5c3BhY2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYWxsIHRoZSBleGlzdGluZyBzbmFwc2hvdHMgb2YgZ2l2ZW4gdGFnIGZvciBwcm92aWRlZCBrZXlzcGFjZXMuCisgICAgICogV2hlbiBubyBrZXlzcGFjZXMgYXJlIHNwZWNpZmllZCwgdGFrZSBhbGwga2V5c3BhY2VzIGludG8gYWNjb3VudC4gV2hlbiB0YWcgaXMgbm90IHNwZWNpZmllZCAobnVsbCBvciBlbXB0eSBzdHJpbmcpLAorICAgICAqIHRha2UgYWxsIHRhZ3MgaW50byBhY2NvdW50LgorICAgICAqCisgICAgICogQHBhcmFtIG9wdGlvbnMgb3B0aW9ucyB0byBzdXBwbHkgZm9yIHNuYXBzaG90IGNsZWFyaW5nCisgICAgICogQHBhcmFtIHRhZyB0YWcgb2Ygc25hcHNob3QgdG8gY2xlYXIKKyAgICAgKiBAcGFyYW0ga2V5c3BhY2VzIGtleXNwYWNlcyB0byBjbGVhciBzbmFwc2hvdHMgZm9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXJTbmFwc2hvdChNYXA8U3RyaW5nLCBPYmplY3Q+IG9wdGlvbnMsIFN0cmluZyB0YWcsIFN0cmluZy4uLiBrZXlzcGFjZXMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3NQcm94eS5jbGVhclNuYXBzaG90KG9wdGlvbnMsIHRhZywga2V5c3BhY2VzKTsKICAgICB9CiAKICAgICBwdWJsaWMgTWFwPFN0cmluZywgVGFidWxhckRhdGE+IGdldFNuYXBzaG90RGV0YWlscyhNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpCkBAIC05ODksNiArMTA0NywxOCBAQAogICAgICAgICByZXR1cm4gY2ZzUHJveHkuZ2V0U1NUYWJsZXNGb3JLZXkoa2V5LCBoZXhGb3JtYXQpOwogICAgIH0KIAorICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgU2V0PFN0cmluZz4+IGdldFNTVGFibGVzV2l0aExldmVsKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIGNmLCBTdHJpbmcga2V5LCBib29sZWFuIGhleEZvcm1hdCkKKyAgICB7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlTUJlYW4gY2ZzUHJveHkgPSBnZXRDZnNQcm94eShrZXlzcGFjZSwgY2YpOworICAgICAgICByZXR1cm4gY2ZzUHJveHkuZ2V0U1NUYWJsZXNGb3JLZXlXaXRoTGV2ZWwoa2V5LCBoZXhGb3JtYXQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTGV2ZWxlZENvbXBhY3Rpb24oU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgY2YpCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZU1CZWFuIGNmc1Byb3h5ID0gZ2V0Q2ZzUHJveHkoa2V5c3BhY2UsIGNmKTsKKyAgICAgICAgcmV0dXJuIGNmc1Byb3h5LmlzTGV2ZWxlZENvbXBhY3Rpb24oKTsKKyAgICB9CisKICAgICBwdWJsaWMgU2V0PFN0cmVhbVN0YXRlPiBnZXRTdHJlYW1TdGF0dXMoKQogICAgIHsKICAgICAgICAgcmV0dXJuIFNldHMubmV3SGFzaFNldChJdGVyYWJsZXMudHJhbnNmb3JtKHN0cmVhbVByb3h5LmdldEN1cnJlbnRTdHJlYW1zKCksIG5ldyBGdW5jdGlvbjxDb21wb3NpdGVEYXRhLCBTdHJlYW1TdGF0ZT4oKQpAQCAtMTUzNCw5ICsxNjA0LDkgQEAKICAgICAgICAgcmV0dXJuIHdpdGhQb3J0ID8gc3NQcm94eS5kZXNjcmliZVJpbmdXaXRoUG9ydEpNWChrZXlzcGFjZU5hbWUpIDogc3NQcm94eS5kZXNjcmliZVJpbmdKTVgoa2V5c3BhY2VOYW1lKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCByZWJ1aWxkKFN0cmluZyBzb3VyY2VEYywgU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdG9rZW5zLCBTdHJpbmcgc3BlY2lmaWNTb3VyY2VzKQorICAgIHB1YmxpYyB2b2lkIHJlYnVpbGQoU3RyaW5nIHNvdXJjZURjLCBTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0b2tlbnMsIFN0cmluZyBzcGVjaWZpY1NvdXJjZXMsIGJvb2xlYW4gZXhjbHVkZUxvY2FsRGF0YWNlbnRlck5vZGVzKQogICAgIHsKLSAgICAgICAgc3NQcm94eS5yZWJ1aWxkKHNvdXJjZURjLCBrZXlzcGFjZSwgdG9rZW5zLCBzcGVjaWZpY1NvdXJjZXMpOworICAgICAgICBzc1Byb3h5LnJlYnVpbGQoc291cmNlRGMsIGtleXNwYWNlLCB0b2tlbnMsIHNwZWNpZmljU291cmNlcywgZXhjbHVkZUxvY2FsRGF0YWNlbnRlck5vZGVzKTsKICAgICB9CiAKICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHNhbXBsZUtleVJhbmdlKCkKQEAgLTE3NjksNiArMTgzOSw4IEBACiAgICAgICAgICAgICAgICAgY2FzZSAiRXN0aW1hdGVkUGFydGl0aW9uQ291bnQiOgogICAgICAgICAgICAgICAgIGNhc2UgIktleUNhY2hlSGl0UmF0ZSI6CiAgICAgICAgICAgICAgICAgY2FzZSAiTGl2ZVNTVGFibGVDb3VudCI6CisgICAgICAgICAgICAgICAgY2FzZSAiTWF4U1NUYWJsZUR1cmF0aW9uIjoKKyAgICAgICAgICAgICAgICBjYXNlICJNYXhTU1RhYmxlU2l6ZSI6CiAgICAgICAgICAgICAgICAgY2FzZSAiT2xkVmVyc2lvblNTVGFibGVDb3VudCI6CiAgICAgICAgICAgICAgICAgY2FzZSAiTWF4UGFydGl0aW9uU2l6ZSI6CiAgICAgICAgICAgICAgICAgY2FzZSAiTWVhblBhcnRpdGlvblNpemUiOgpAQCAtMTk4OSw2ICsyMDYxLDggQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiUmVzdW1pbmcgYm9vdHN0cmFwIik7CiAgICAgICAgICAgICAgICAgbW9uaXRvci5hd2FpdENvbXBsZXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAobW9uaXRvci5nZXRFcnJvcigpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG1vbml0b3IuZ2V0RXJyb3IoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL05vZGVUb29sLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Ob2RlVG9vbC5qYXZhCmluZGV4IDhkODdjODguLjU1MDAyNDAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL05vZGVUb29sLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvTm9kZVRvb2wuamF2YQpAQCAtNDUsNiArNDUsOCBAQAogaW1wb3J0IGphdmEudXRpbC5TY2FubmVyOwogaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CiAKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkluc3RhbmNlTm90Rm91bmRFeGNlcHRpb247CisKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CiAKQEAgLTIyNSw3ICsyMjcsOCBAQAogICAgICAgICAgICAgICAgIFVwZ3JhZGVTU1RhYmxlLmNsYXNzLAogICAgICAgICAgICAgICAgIFZlcmlmeS5jbGFzcywKICAgICAgICAgICAgICAgICBWZXJzaW9uLmNsYXNzLAotICAgICAgICAgICAgICAgIFZpZXdCdWlsZFN0YXR1cy5jbGFzcworICAgICAgICAgICAgICAgIFZpZXdCdWlsZFN0YXR1cy5jbGFzcywKKyAgICAgICAgICAgICAgICBGb3JjZUNvbXBhY3QuY2xhc3MKICAgICAgICAgKTsKIAogICAgICAgICBDbGkuQ2xpQnVpbGRlcjxOb2RlVG9vbENtZFJ1bm5hYmxlPiBidWlsZGVyID0gQ2xpLmJ1aWxkZXIoIm5vZGV0b29sIik7CkBAIC0zMDYsNiArMzA5LDEwIEBACiAKICAgICBwcm90ZWN0ZWQgdm9pZCBlcnIoVGhyb3dhYmxlIGUpCiAgICAgeworICAgICAgICAvLyBDQVNTQU5EUkEtMTE1Mzc6IGZyaWVuZGx5IGVycm9yIG1lc3NhZ2Ugd2hlbiBzZXJ2ZXIgaXMgbm90IHJlYWR5CisgICAgICAgIGlmIChlIGluc3RhbmNlb2YgSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbikKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNlcnZlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LCBjYW5ub3QgcnVuIG5vZGV0b29sLiIpOworCiAgICAgICAgIG91dHB1dC5lcnIucHJpbnRsbigiZXJyb3I6ICIgKyBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIG91dHB1dC5lcnIucHJpbnRsbigiLS0gU3RhY2tUcmFjZSAtLSIpOwogICAgICAgICBvdXRwdXQuZXJyLnByaW50bG4oZ2V0U3RhY2tUcmFjZUFzU3RyaW5nKGUpKTsKQEAgLTQ4NCw2ICs0OTEsMTEgQEAKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIGNtZEFyZ3Muc2l6ZSgpIDw9IDEgPyBFTVBUWV9TVFJJTkdfQVJSQVkgOiB0b0FycmF5KGNtZEFyZ3Muc3ViTGlzdCgxLCBjbWRBcmdzLnNpemUoKSksIFN0cmluZy5jbGFzcyk7CiAgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nW10gcGFyc2VQYXJ0aXRpb25LZXlzKExpc3Q8U3RyaW5nPiBjbWRBcmdzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY21kQXJncy5zaXplKCkgPD0gMiA/IEVNUFRZX1NUUklOR19BUlJBWSA6IHRvQXJyYXkoY21kQXJncy5zdWJMaXN0KDIsIGNtZEFyZ3Muc2l6ZSgpKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkTWFwPFN0cmluZywgU2V0SG9zdFN0YXRXaXRoUG9ydD4gZ2V0T3duZXJzaGlwQnlEY1dpdGhQb3J0KE5vZGVQcm9iZSBwcm9iZSwgYm9vbGVhbiByZXNvbHZlSXAsCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwaXJlZEJsb2NrZXJzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwaXJlZEJsb2NrZXJzLmphdmEKaW5kZXggZjVkMjRlZC4uMDRkNzdhOSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cGlyZWRCbG9ja2Vycy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVFeHBpcmVkQmxvY2tlcnMuamF2YQpAQCAtMjYsMTQgKzI2LDE1IEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5BcnJheUxpc3RNdWx0aW1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lk11bHRpbWFwOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CiAKQEAgLTc0LDEyICs3NSwxMiBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBTU1RhYmxlUmVhZGVyLm9wZW4oc3N0YWJsZS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gU1NUYWJsZVJlYWRlci5vcGVuKGNmcywgc3N0YWJsZS5nZXRLZXkoKSk7CiAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVzLmFkZChyZWFkZXIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ291bGRuJ3Qgb3BlbiBzc3RhYmxlOiAiICsgc3N0YWJsZS5nZXRLZXkoKS5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkrIiAoIit0LmdldE1lc3NhZ2UoKSsiKSIpOworICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ291bGRuJ3Qgb3BlbiBzc3RhYmxlOiAiICsgc3N0YWJsZS5nZXRLZXkoKS5maWxlRm9yKENvbXBvbmVudHMuREFUQSkgKyAiICgiICsgdC5nZXRNZXNzYWdlKCkgKyAiKSIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cG9ydC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cG9ydC5qYXZhCmluZGV4IDc3MTM4MGIuLmRhOTI5OGEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVFeHBvcnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwb3J0LmphdmEKQEAgLTI1LDggKzI1LDE0IEBACiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuQ29tbWFuZExpbmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Db21tYW5kTGluZVBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkhlbHBGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5PcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Qb3NpeFBhcnNlcjsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOwpAQCAtMzksMTMgKzQ1LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLktleUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Db21tYW5kTGluZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkNvbW1hbmRMaW5lUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuSGVscEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLk9wdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLlBvc2l4UGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIApAQCAtNzEsNyArNzIsNyBAQAogCiAgICAgc3RhdGljCiAgICAgewotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuY2xpZW50SW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnRvb2xJbml0aWFsaXphdGlvbigpOwogCiAgICAgICAgIE9wdGlvbiBvcHRLZXkgPSBuZXcgT3B0aW9uKEtFWV9PUFRJT04sIHRydWUsICJMaXN0IG9mIGluY2x1ZGVkIHBhcnRpdGlvbiBrZXlzIik7CiAgICAgICAgIC8vIE51bWJlciBvZiB0aW1lcyAtayA8a2V5PiBjYW4gYmUgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuCkBAIC0xMzUsMjAgKzEzNiwyMSBAQAogICAgICAgICAgICAgcHJpbnRVc2FnZSgpOwogICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nIHNzVGFibGVGaWxlTmFtZSA9IG5ldyBGaWxlKGNtZC5nZXRBcmdzKClbMF0pLmFic29sdXRlUGF0aCgpOworICAgICAgICBGaWxlIHNzVGFibGVGaWxlID0gbmV3IEZpbGUoY21kLmdldEFyZ3MoKVswXSk7CiAKLSAgICAgICAgaWYgKCFuZXcgRmlsZShzc1RhYmxlRmlsZU5hbWUpLmV4aXN0cygpKQorICAgICAgICBpZiAoIXNzVGFibGVGaWxlLmV4aXN0cygpKQogICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCBmaW5kIGZpbGUgIiArIHNzVGFibGVGaWxlTmFtZSk7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkNhbm5vdCBmaW5kIGZpbGUgIiArIHNzVGFibGVGaWxlLmFic29sdXRlUGF0aCgpKTsKICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwogICAgICAgICB9Ci0gICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IERlc2NyaXB0b3IuZnJvbUZpbGVuYW1lKHNzVGFibGVGaWxlTmFtZSk7CisgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IERlc2NyaXB0b3IuZnJvbUZpbGVXaXRoQ29tcG9uZW50KHNzVGFibGVGaWxlLCBmYWxzZSkubGVmdDsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBVdGlsLm1ldGFkYXRhRnJvbVNTVGFibGUoZGVzYyk7CisgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24obnVsbCwgZGVzYywgVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHMobWV0YWRhdGEpKTsKICAgICAgICAgICAgIGlmIChjbWQuaGFzT3B0aW9uKEVOVU1FUkFURV9LRVlTX09QVElPTikpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5IChLZXlJdGVyYXRvciBpdGVyID0gbmV3IEtleUl0ZXJhdG9yKGRlc2MsIG1ldGFkYXRhKSkKKyAgICAgICAgICAgICAgICB0cnkgKEtleUl0ZXJhdG9yIGl0ZXIgPSBzc3RhYmxlLmtleUl0ZXJhdG9yKCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBKc29uVHJhbnNmb3JtZXIua2V5c1RvSnNvbihudWxsLCBVdGlsLml0ZXJUb1N0cmVhbShpdGVyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLmhhc09wdGlvbihSQVdfVElNRVNUQU1QUyksCkBAIC0xNTgsNyArMTYwLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24oZGVzYywgVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHMobWV0YWRhdGEpKTsKICAgICAgICAgICAgICAgICBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBzc3RhYmxlLmdldFBhcnRpdGlvbmVyKCk7CiAgICAgICAgICAgICAgICAgZmluYWwgSVNTVGFibGVTY2FubmVyIGN1cnJlbnRTY2FubmVyOwogICAgICAgICAgICAgICAgIGlmICgoa2V5cyAhPSBudWxsKSAmJiAoa2V5cy5sZW5ndGggPiAwKSkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVMZXZlbFJlc2V0dGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlTGV2ZWxSZXNldHRlci5qYXZhCmluZGV4IDk2MThkMzYyLi4wYWE5ZTEwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlTGV2ZWxSZXNldHRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVMZXZlbFJlc2V0dGVyLmphdmEKQEAgLTIxLDE1ICsyMSwxNiBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlN0YXRzQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKIAogLyoqCkBAIC05MCwxOSArOTEsMTkgQEAKICAgICAgICAgICAgIGJvb2xlYW4gZm91bmRTU1RhYmxlID0gZmFsc2U7CiAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxEZXNjcmlwdG9yLCBTZXQ8Q29tcG9uZW50Pj4gc3N0YWJsZSA6IGxpc3Rlci5saXN0KCkuZW50cnlTZXQoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc3N0YWJsZS5nZXRWYWx1ZSgpLmNvbnRhaW5zKENvbXBvbmVudC5TVEFUUykpCisgICAgICAgICAgICAgICAgaWYgKHNzdGFibGUuZ2V0VmFsdWUoKS5jb250YWlucyhDb21wb25lbnRzLlNUQVRTKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGZvdW5kU1NUYWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHNzdGFibGUuZ2V0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgbWV0YWRhdGEgPSAoU3RhdHNNZXRhZGF0YSkgZGVzY3JpcHRvci5nZXRNZXRhZGF0YVNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZShkZXNjcmlwdG9yLCBNZXRhZGF0YVR5cGUuU1RBVFMpOworICAgICAgICAgICAgICAgICAgICBTdGF0c01ldGFkYXRhIG1ldGFkYXRhID0gU3RhdHNDb21wb25lbnQubG9hZChkZXNjcmlwdG9yKS5zdGF0c01ldGFkYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5zc3RhYmxlTGV2ZWwgPiAwKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ2hhbmdpbmcgbGV2ZWwgZnJvbSAiICsgbWV0YWRhdGEuc3N0YWJsZUxldmVsICsgIiB0byAwIG9uICIgKyBkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ2hhbmdpbmcgbGV2ZWwgZnJvbSAiICsgbWV0YWRhdGEuc3N0YWJsZUxldmVsICsgIiB0byAwIG9uICIgKyBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLm11dGF0ZUxldmVsKGRlc2NyaXB0b3IsIDApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlNraXBwZWQgIiArIGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpICsgIiBzaW5jZSBpdCBpcyBhbHJlYWR5IG9uIGxldmVsIDAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJTa2lwcGVkICIgKyBkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSArICIgc2luY2UgaXQgaXMgYWxyZWFkeSBvbiBsZXZlbCAwIik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlTWV0YWRhdGFWaWV3ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVNZXRhZGF0YVZpZXdlci5qYXZhCmluZGV4IGM0YmVmMzUuLjFkOWRkOTEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVNZXRhZGF0YVZpZXdlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVNZXRhZGF0YVZpZXdlci5qYXZhCkBAIC0xNywxNSArMTcsMTEgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29sczsKIAotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CkBAIC00MSw2ICszNyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Qb3NpeFBhcnNlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0NvbXBhcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CkBAIC01MSwxNCArNDgsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuSUNvbXByZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNTVGFibGVTY2FubmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhTdW1tYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkNvbXByZXNzaW9uSW5mb0NvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlN0YXRzQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuQ29tcGFjdGlvbk1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuVmFsaWRhdGlvbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKQEAgLTkxLDcgKzg3LDcgQEAKIAogICAgIHN0YXRpYwogICAgIHsKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmNsaWVudEluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci50b29sSW5pdGlhbGl6YXRpb24oKTsKICAgICB9CiAKICAgICBib29sZWFuIGNvbG9yOwpAQCAtMTc1LDcgKzE3MSw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIHByaW50U2Nhbm5lZE92ZXJ2aWV3KERlc2NyaXB0b3IgZGVzY3JpcHRvciwgU3RhdHNNZXRhZGF0YSBzdGF0cykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBUYWJsZU1ldGFkYXRhIGNmbSA9IFV0aWwubWV0YWRhdGFGcm9tU1NUYWJsZShkZXNjcmlwdG9yKTsKLSAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24oZGVzY3JpcHRvciwgVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHMoY2ZtKSk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gU1NUYWJsZVJlYWRlci5vcGVuTm9WYWxpZGF0aW9uKG51bGwsIGRlc2NyaXB0b3IsIFRhYmxlTWV0YWRhdGFSZWYuZm9yT2ZmbGluZVRvb2xzKGNmbSkpOwogICAgICAgICB0cnkgKElTU1RhYmxlU2Nhbm5lciBzY2FubmVyID0gcmVhZGVyLmdldFNjYW5uZXIoKSkKICAgICAgICAgewogICAgICAgICAgICAgbG9uZyBieXRlcyA9IHNjYW5uZXIuZ2V0TGVuZ3RoSW5CeXRlcygpOwpAQCAtMzE2LDIzICszMTIsMjIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBwcmludFNTdGFibGVNZXRhZGF0YShTdHJpbmcgZm5hbWUsIGJvb2xlYW4gc2NhbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgcHJpdmF0ZSB2b2lkIHByaW50U1N0YWJsZU1ldGFkYXRhKEZpbGUgZmlsZSwgYm9vbGVhbiBzY2FuKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IERlc2NyaXB0b3IuZnJvbUZpbGVuYW1lKGZuYW1lKTsKLSAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IG1ldGFkYXRhID0gZGVzY3JpcHRvci5nZXRNZXRhZGF0YVNlcmlhbGl6ZXIoKQotICAgICAgICAgICAgICAgIC5kZXNlcmlhbGl6ZShkZXNjcmlwdG9yLCBFbnVtU2V0LmFsbE9mKE1ldGFkYXRhVHlwZS5jbGFzcykpOwotICAgICAgICBWYWxpZGF0aW9uTWV0YWRhdGEgdmFsaWRhdGlvbiA9IChWYWxpZGF0aW9uTWV0YWRhdGEpIG1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuVkFMSURBVElPTik7Ci0gICAgICAgIFN0YXRzTWV0YWRhdGEgc3RhdHMgPSAoU3RhdHNNZXRhZGF0YSkgbWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5TVEFUUyk7Ci0gICAgICAgIENvbXBhY3Rpb25NZXRhZGF0YSBjb21wYWN0aW9uID0gKENvbXBhY3Rpb25NZXRhZGF0YSkgbWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5DT01QQUNUSU9OKTsKLSAgICAgICAgQ29tcHJlc3Npb25NZXRhZGF0YSBjb21wcmVzc2lvbiA9IG51bGw7Ci0gICAgICAgIEZpbGUgY29tcHJlc3Npb25GaWxlID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTykpOwotICAgICAgICBpZiAoY29tcHJlc3Npb25GaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgY29tcHJlc3Npb24gPSBDb21wcmVzc2lvbk1ldGFkYXRhLmNyZWF0ZShmbmFtZSk7Ci0gICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50IGhlYWRlciA9IChTZXJpYWxpemF0aW9uSGVhZGVyLkNvbXBvbmVudCkgbWV0YWRhdGEKLSAgICAgICAgICAgICAgICAuZ2V0KE1ldGFkYXRhVHlwZS5IRUFERVIpOworICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLmZyb21GaWxlV2l0aENvbXBvbmVudChmaWxlLCBmYWxzZSkubGVmdDsKKyAgICAgICAgU3RhdHNDb21wb25lbnQgc3RhdHNDb21wb25lbnQgPSBTdGF0c0NvbXBvbmVudC5sb2FkKGRlc2NyaXB0b3IpOworICAgICAgICBWYWxpZGF0aW9uTWV0YWRhdGEgdmFsaWRhdGlvbiA9IHN0YXRzQ29tcG9uZW50LnZhbGlkYXRpb25NZXRhZGF0YSgpOworICAgICAgICBTdGF0c01ldGFkYXRhIHN0YXRzID0gc3RhdHNDb21wb25lbnQuc3RhdHNNZXRhZGF0YSgpOworICAgICAgICBDb21wYWN0aW9uTWV0YWRhdGEgY29tcGFjdGlvbiA9IHN0YXRzQ29tcG9uZW50LmNvbXBhY3Rpb25NZXRhZGF0YSgpOworICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyLkNvbXBvbmVudCBoZWFkZXIgPSBzdGF0c0NvbXBvbmVudC5zZXJpYWxpemF0aW9uSGVhZGVyKCk7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBJQ29tcHJlc3Nvcj4gY29tcHJlc3NvckNsYXNzID0gbnVsbDsKKyAgICAgICAgdHJ5IChDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXByZXNzaW9uID0gQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50LmxvYWRJZkV4aXN0cyhkZXNjcmlwdG9yKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29tcHJlc3NvckNsYXNzID0gY29tcHJlc3Npb24gIT0gbnVsbCA/IGNvbXByZXNzaW9uLmNvbXByZXNzb3IoKS5nZXRDbGFzcygpIDogbnVsbDsKKyAgICAgICAgfQogCiAgICAgICAgIGZpZWxkKCJTU1RhYmxlIiwgZGVzY3JpcHRvcik7Ci0gICAgICAgIGlmIChzY2FuICYmIGRlc2NyaXB0b3IudmVyc2lvbi5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKCJtYSIpID49IDApCisgICAgICAgIGlmIChzY2FuICYmIGRlc2NyaXB0b3IudmVyc2lvbi52ZXJzaW9uLmNvbXBhcmVUbygibWEiKSA+PSAwKQogICAgICAgICB7CiAgICAgICAgICAgICBwcmludFNjYW5uZWRPdmVydmlldyhkZXNjcmlwdG9yLCBzdGF0cyk7CiAgICAgICAgIH0KQEAgLTM0NywyOSArMzQyLDE5IEBACiAgICAgICAgICAgICBmaWVsZCgiTWF4aW11bSB0aW1lc3RhbXAiLCBzdGF0cy5tYXhUaW1lc3RhbXAsIHRvRGF0ZVN0cmluZyhzdGF0cy5tYXhUaW1lc3RhbXAsIHRzVW5pdCkpOwogICAgICAgICAgICAgZmllbGQoIlNTVGFibGUgbWluIGxvY2FsIGRlbGV0aW9uIHRpbWUiLCBzdGF0cy5taW5Mb2NhbERlbGV0aW9uVGltZSwgZGVsZXRpb24oc3RhdHMubWluTG9jYWxEZWxldGlvblRpbWUpKTsKICAgICAgICAgICAgIGZpZWxkKCJTU1RhYmxlIG1heCBsb2NhbCBkZWxldGlvbiB0aW1lIiwgc3RhdHMubWF4TG9jYWxEZWxldGlvblRpbWUsIGRlbGV0aW9uKHN0YXRzLm1heExvY2FsRGVsZXRpb25UaW1lKSk7Ci0gICAgICAgICAgICBmaWVsZCgiQ29tcHJlc3NvciIsIGNvbXByZXNzaW9uICE9IG51bGwgPyBjb21wcmVzc2lvbi5jb21wcmVzc29yKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgOiAiLSIpOwotICAgICAgICAgICAgaWYgKGNvbXByZXNzaW9uICE9IG51bGwpCisgICAgICAgICAgICBmaWVsZCgiQ29tcHJlc3NvciIsIGNvbXByZXNzb3JDbGFzcyAhPSBudWxsID8gY29tcHJlc3NvckNsYXNzLmdldE5hbWUoKSA6ICItIik7CisgICAgICAgICAgICBpZiAoY29tcHJlc3NvckNsYXNzICE9IG51bGwpCiAgICAgICAgICAgICAgICAgZmllbGQoIkNvbXByZXNzaW9uIHJhdGlvIiwgc3RhdHMuY29tcHJlc3Npb25SYXRpbyk7CiAgICAgICAgICAgICBmaWVsZCgiVFRMIG1pbiIsIHN0YXRzLm1pblRUTCwgdG9EdXJhdGlvblN0cmluZyhzdGF0cy5taW5UVEwsIFRpbWVVbml0LlNFQ09ORFMpKTsKICAgICAgICAgICAgIGZpZWxkKCJUVEwgbWF4Iiwgc3RhdHMubWF4VFRMLCB0b0R1cmF0aW9uU3RyaW5nKHN0YXRzLm1heFRUTCwgVGltZVVuaXQuU0VDT05EUykpOwogCiAgICAgICAgICAgICBpZiAodmFsaWRhdGlvbiAhPSBudWxsICYmIGhlYWRlciAhPSBudWxsKQotICAgICAgICAgICAgICAgIHByaW50TWluTWF4VG9rZW4oZGVzY3JpcHRvciwgRkJVdGlsaXRpZXMubmV3UGFydGl0aW9uZXIoZGVzY3JpcHRvciksIGhlYWRlci5nZXRLZXlUeXBlKCkpOworICAgICAgICAgICAgICAgIHByaW50TWluTWF4VG9rZW4oZGVzY3JpcHRvciwgRkJVdGlsaXRpZXMubmV3UGFydGl0aW9uZXIoZGVzY3JpcHRvciksIGhlYWRlci5nZXRLZXlUeXBlKCksIHN0YXRzKTsKIAotICAgICAgICAgICAgaWYgKGhlYWRlciAhPSBudWxsICYmIGhlYWRlci5nZXRDbHVzdGVyaW5nVHlwZXMoKS5zaXplKCkgPT0gc3RhdHMubWluQ2x1c3RlcmluZ1ZhbHVlcy5zaXplKCkpCisgICAgICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGNsdXN0ZXJpbmdUeXBlcyA9IGhlYWRlci5nZXRDbHVzdGVyaW5nVHlwZXMoKTsKLSAgICAgICAgICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IG1pbkNsdXN0ZXJpbmdWYWx1ZXMgPSBzdGF0cy5taW5DbHVzdGVyaW5nVmFsdWVzOwotICAgICAgICAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWF4Q2x1c3RlcmluZ1ZhbHVlcyA9IHN0YXRzLm1heENsdXN0ZXJpbmdWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gbWluVmFsdWVzID0gbmV3IFN0cmluZ1tjbHVzdGVyaW5nVHlwZXMuc2l6ZSgpXTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBtYXhWYWx1ZXMgPSBuZXcgU3RyaW5nW2NsdXN0ZXJpbmdUeXBlcy5zaXplKCldOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2x1c3RlcmluZ1R5cGVzLnNpemUoKTsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWluVmFsdWVzW2ldID0gY2x1c3RlcmluZ1R5cGVzLmdldChpKS5nZXRTdHJpbmcobWluQ2x1c3RlcmluZ1ZhbHVlcy5nZXQoaSkpOwotICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZXNbaV0gPSBjbHVzdGVyaW5nVHlwZXMuZ2V0KGkpLmdldFN0cmluZyhtYXhDbHVzdGVyaW5nVmFsdWVzLmdldChpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpZWxkKCJtaW5DbHVzdGVyaW5nVmFsdWVzIiwgQXJyYXlzLnRvU3RyaW5nKG1pblZhbHVlcykpOwotICAgICAgICAgICAgICAgIGZpZWxkKCJtYXhDbHVzdGVyaW5nVmFsdWVzIiwgQXJyYXlzLnRvU3RyaW5nKG1heFZhbHVlcykpOworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ2x1c3RlcmluZ0NvbXBhcmF0b3IoaGVhZGVyLmdldENsdXN0ZXJpbmdUeXBlcygpKTsKKyAgICAgICAgICAgICAgICBmaWVsZCgiQ292ZXJlZCBjbHVzdGVyaW5ncyIsIHN0YXRzLmNvdmVyZWRDbHVzdGVyaW5nLnRvU3RyaW5nKGNvbXBhcmF0b3IpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpZWxkKCJFc3RpbWF0ZWQgZHJvcHBhYmxlIHRvbWJzdG9uZXMiLAogICAgICAgICAgICAgICAgICAgc3RhdHMuZ2V0RXN0aW1hdGVkRHJvcHBhYmxlVG9tYnN0b25lUmF0aW8oKGludCkgKGN1cnJlbnRUaW1lTWlsbGlzKCkgLyAxMDAwKSAtIHRoaXMuZ2MpKTsKQEAgLTQ3NSwxNyArNDYwLDIzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgcHJpbnRNaW5NYXhUb2tlbihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciwgQWJzdHJhY3RUeXBlPD8+IGtleVR5cGUpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwcml2YXRlIHZvaWQgcHJpbnRNaW5NYXhUb2tlbihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciwgQWJzdHJhY3RUeXBlPD8+IGtleVR5cGUsIFN0YXRzTWV0YWRhdGEgc3RhdHNNZXRhZGF0YSkKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIEZpbGUgc3VtbWFyaWVzRmlsZSA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNVTU1BUlkpKTsKLSAgICAgICAgaWYgKCFzdW1tYXJpZXNGaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgIHRyeSAoRGF0YUlucHV0U3RyZWFtIGlTdHJlYW0gPSBuZXcgRGF0YUlucHV0U3RyZWFtKEZpbGVzLm5ld0lucHV0U3RyZWFtKHN1bW1hcmllc0ZpbGUudG9QYXRoKCkpKSkKKyAgICAgICAgaWYgKGRlc2NyaXB0b3IudmVyc2lvbi5oYXNLZXlSYW5nZSgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBQYWlyPERlY29yYXRlZEtleSwgRGVjb3JhdGVkS2V5PiBmaXJzdExhc3QgPSBuZXcgSW5kZXhTdW1tYXJ5LkluZGV4U3VtbWFyeVNlcmlhbGl6ZXIoKQotICAgICAgICAgICAgICAgICAgICAuZGVzZXJpYWxpemVGaXJzdExhc3RLZXkoaVN0cmVhbSwgcGFydGl0aW9uZXIpOworICAgICAgICAgICAgaWYgKHN0YXRzTWV0YWRhdGEuZmlyc3RLZXkgPT0gbnVsbCB8fCBzdGF0c01ldGFkYXRhLmxhc3RLZXkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGZpZWxkKCJGaXJzdCB0b2tlbiIsIHBhcnRpdGlvbmVyLmdldFRva2VuKHN0YXRzTWV0YWRhdGEuZmlyc3RLZXkpLCBrZXlUeXBlLmdldFN0cmluZyhzdGF0c01ldGFkYXRhLmZpcnN0S2V5KSk7CisgICAgICAgICAgICBmaWVsZCgiTGFzdCB0b2tlbiIsIHBhcnRpdGlvbmVyLmdldFRva2VuKHN0YXRzTWV0YWRhdGEubGFzdEtleSksIGtleVR5cGUuZ2V0U3RyaW5nKHN0YXRzTWV0YWRhdGEubGFzdEtleSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUGFpcjxEZWNvcmF0ZWRLZXksIERlY29yYXRlZEtleT4gZmlyc3RMYXN0ID0gZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5nZXRSZWFkZXJGYWN0b3J5KCkucmVhZEtleVJhbmdlKGRlc2NyaXB0b3IsIHBhcnRpdGlvbmVyKTsKKyAgICAgICAgICAgIGlmIChmaXJzdExhc3QgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisKICAgICAgICAgICAgIGZpZWxkKCJGaXJzdCB0b2tlbiIsIGZpcnN0TGFzdC5sZWZ0LmdldFRva2VuKCksIGtleVR5cGUuZ2V0U3RyaW5nKGZpcnN0TGFzdC5sZWZ0LmdldEtleSgpKSk7CiAgICAgICAgICAgICBmaWVsZCgiTGFzdCB0b2tlbiIsIGZpcnN0TGFzdC5yaWdodC5nZXRUb2tlbigpLCBrZXlUeXBlLmdldFN0cmluZyhmaXJzdExhc3QucmlnaHQuZ2V0S2V5KCkpKTsKICAgICAgICAgfQpAQCAtNTQ1LDcgKzUzNiw3IEBACiAgICAgICAgICAgICBGaWxlIHNzdGFibGUgPSBuZXcgRmlsZShmbmFtZSk7CiAgICAgICAgICAgICBpZiAoc3N0YWJsZS5leGlzdHMoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRhd3JpdGVyLnByaW50U1N0YWJsZU1ldGFkYXRhKHNzdGFibGUuYWJzb2x1dGVQYXRoKCksIGZ1bGxTY2FuKTsKKyAgICAgICAgICAgICAgICBtZXRhd3JpdGVyLnByaW50U1N0YWJsZU1ldGFkYXRhKHNzdGFibGUsIGZ1bGxTY2FuKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVPZmZsaW5lUmVsZXZlbC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZU9mZmxpbmVSZWxldmVsLmphdmEKaW5kZXggZTRlMzQzZi4uMTZmYWE5MiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZU9mZmxpbmVSZWxldmVsLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZU9mZmxpbmVSZWxldmVsLmphdmEKQEAgLTMzLDE2ICszMywxNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRNdWx0aW1hcDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIAogLyoqCiAgKiBDcmVhdGUgYSBkZWNlbnQgbGV2ZWxpbmcgZm9yIHRoZSBnaXZlbiBrZXlzcGFjZS9jb2x1bW4gZmFtaWx5CkBAIC0xMTYsMTMgKzExNywxNCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBTU1RhYmxlUmVhZGVyLm9wZW4oc3N0YWJsZS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gU1NUYWJsZVJlYWRlci5vcGVuKGNmcywgc3N0YWJsZS5nZXRLZXkoKSk7CiAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVNdWx0aW1hcC5wdXQocmVhZGVyLmRlc2NyaXB0b3IuZGlyZWN0b3J5LCByZWFkZXIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiQ291bGRuJ3Qgb3BlbiBzc3RhYmxlOiAiK3NzdGFibGUuZ2V0S2V5KCkuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKTsKLSAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlcy5wcm9wYWdhdGUodCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJDb3VsZG4ndCBvcGVuIHNzdGFibGU6ICIrc3N0YWJsZS5nZXRLZXkoKS5maWxlRm9yKENvbXBvbmVudHMuREFUQSkpOworICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQodCk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZVBhcnRpdGlvbnMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVQYXJ0aXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUxMzg1MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVQYXJ0aXRpb25zLmphdmEKQEAgLTAsMCArMSw4ODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Ub0xvbmdGdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkNvbW1hbmRMaW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuQ29tbWFuZExpbmVQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5IZWxwRm9ybWF0dGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuUG9zaXhQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5tYXRoLk51bWJlclV0aWxzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5MaXZlbmVzc0luZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ29sdW1uRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNvbXBsZXhDb2x1bW5EYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUmFuZ2VUb21ic3RvbmVNYXJrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5BYnN0cmFjdEJvdW5kczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQm91bmRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKKworcHVibGljIGNsYXNzIFNTVGFibGVQYXJ0aXRpb25zCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PUFRJT04gPSAiayI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xVREVfS0VZX09QVElPTiA9ICJ4IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDVVJTSVZFX09QVElPTiA9ICJyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05BUFNIT1RTX09QVElPTiA9ICJzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS1VQU19PUFRJT04gPSAiYiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlRJVElPTlNfT05MWV9PUFRJT04gPSAieSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJWkVfVEhSRVNIT0xEX09QVElPTiA9ICJ0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9NQlNUT05FX1RIUkVTSE9MRF9PUFRJT04gPSAibyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENFTExfVEhSRVNIT0xEX09QVElPTiA9ICJjIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9XX1RIUkVTSE9MRF9PUFRJT04gPSAidyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENTVl9PUFRJT04gPSAibSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfVElNRVNUQU1QX09QVElPTiA9ICJ1IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUYWJsZUlkIEVNUFRZX1RBQkxFX0lEID0gVGFibGVJZC5mcm9tVVVJRChuZXcgVVVJRCgwTCwgMEwpKTsKKworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmNsaWVudEluaXRpYWxpemF0aW9uKCk7CisKKyAgICAgICAgT3B0aW9uIG9wdEtleSA9IG5ldyBPcHRpb24oS0VZX09QVElPTiwgImtleSIsIHRydWUsICJQYXJ0aXRpb24ga2V5cyB0byBpbmNsdWRlIik7CisgICAgICAgIC8vIE51bWJlciBvZiB0aW1lcyAtayA8a2V5PiBjYW4gYmUgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICAgIG9wdEtleS5zZXRBcmdzKE9wdGlvbi5VTkxJTUlURURfVkFMVUVTKTsKKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24ob3B0S2V5KTsKKworICAgICAgICBPcHRpb24gZXhjbHVkZUtleSA9IG5ldyBPcHRpb24oRVhDTFVERV9LRVlfT1BUSU9OLCAiZXhjbHVkZS1rZXkiLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4Y2x1ZGVkIHBhcnRpdGlvbiBrZXkocykgZnJvbSBwYXJ0aXRpb24gZGV0YWlsZWQgcm93L2NlbGwvdG9tYnN0b25lICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZm9ybWF0aW9uIChpcnJlbGV2YW50LCBpZiAtLXBhcnRpdGlvbnMtb25seSBpcyBnaXZlbikiKTsKKyAgICAgICAgZXhjbHVkZUtleS5zZXRBcmdzKE9wdGlvbi5VTkxJTUlURURfVkFMVUVTKTsgLy8gTnVtYmVyIG9mIHRpbWVzIC14IDxrZXk+IGNhbiBiZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oZXhjbHVkZUtleSk7CisKKyAgICAgICAgT3B0aW9uIHRocmVzaG9sZEtleSA9IG5ldyBPcHRpb24oU0laRV9USFJFU0hPTERfT1BUSU9OLCAibWluLXNpemUiLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFydGl0aW9uIHNpemUgdGhyZXNob2xkLCBleHByZXNzZWQgYXMgZWl0aGVyIHRoZSBudW1iZXIgb2YgYnl0ZXMgb3IgYSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgd2l0aCB1bml0IG9mIHRoZSBmb3JtIDEwS2lCLCAyME1pQiwgMzBHaUIsIGV0Yy4iKTsKKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24odGhyZXNob2xkS2V5KTsKKworICAgICAgICBPcHRpb24gdG9tYnN0b25lS2V5ID0gbmV3IE9wdGlvbihUT01CU1RPTkVfVEhSRVNIT0xEX09QVElPTiwgIm1pbi10b21ic3RvbmVzIiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRpdGlvbiB0b21ic3RvbmUgY291bnQgdGhyZXNob2xkIik7CisgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKHRvbWJzdG9uZUtleSk7CisKKyAgICAgICAgT3B0aW9uIGNlbGxLZXkgPSBuZXcgT3B0aW9uKENFTExfVEhSRVNIT0xEX09QVElPTiwgIm1pbi1jZWxscyIsIHRydWUsICJwYXJ0aXRpb24gY2VsbCBjb3VudCB0aHJlc2hvbGQiKTsKKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oY2VsbEtleSk7CisKKyAgICAgICAgT3B0aW9uIHJvd0tleSA9IG5ldyBPcHRpb24oUk9XX1RIUkVTSE9MRF9PUFRJT04sICJtaW4tcm93cyIsIHRydWUsICJwYXJ0aXRpb24gcm93IGNvdW50IHRocmVzaG9sZCIpOworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihyb3dLZXkpOworCisgICAgICAgIE9wdGlvbiBjdXJyZW50VGltZXN0YW1wS2V5ID0gbmV3IE9wdGlvbihDVVJSRU5UX1RJTUVTVEFNUF9PUFRJT04sICJjdXJyZW50LXRpbWVzdGFtcCIsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIChzZWNvbmRzIHNpbmNlIGVwb2NoLCB1bml0IHRpbWUpIGZvciBUVEwgZXhwaXJlZCBjYWxjdWxhdGlvbiIpOworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihjdXJyZW50VGltZXN0YW1wS2V5KTsKKworICAgICAgICBPcHRpb24gcmVjdXJzaXZlS2V5ID0gbmV3IE9wdGlvbihSRUNVUlNJVkVfT1BUSU9OLCAicmVjdXJzaXZlIiwgZmFsc2UsICJzY2FuIGZvciBzc3RhYmxlcyByZWN1cnNpdmVseSIpOworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihyZWN1cnNpdmVLZXkpOworCisgICAgICAgIE9wdGlvbiBzbmFwc2hvdHNLZXkgPSBuZXcgT3B0aW9uKFNOQVBTSE9UU19PUFRJT04sICJzbmFwc2hvdHMiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUgc25hcHNob3RzIHByZXNlbnQgaW4gZGF0YSBkaXJlY3RvcmllcyAocmVjdXJzaXZlIHNjYW5zKSIpOworICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihzbmFwc2hvdHNLZXkpOworCisgICAgICAgIE9wdGlvbiBiYWNrdXBzS2V5ID0gbmV3IE9wdGlvbihCQUNLVVBTX09QVElPTiwgImJhY2t1cHMiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNsdWRlIGJhY2t1cHMgcHJlc2VudCBpbiBkYXRhIGRpcmVjdG9yaWVzIChyZWN1cnNpdmUgc2NhbnMpIik7CisgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKGJhY2t1cHNLZXkpOworCisgICAgICAgIE9wdGlvbiBwYXJ0aXRpb25zT25seUtleSA9IG5ldyBPcHRpb24oUEFSVElUSU9OU19PTkxZX09QVElPTiwgInBhcnRpdGlvbnMtb25seSIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEbyBub3QgcHJvY2VzcyBwZXItcGFydGl0aW9uIGRldGFpbGVkIHJvdy9jZWxsL3RvbWJzdG9uZSBpbmZvcm1hdGlvbiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9ubHkgYnJpZWYgaW5mb3JtYXRpb24iKTsKKyAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24ocGFydGl0aW9uc09ubHlLZXkpOworCisgICAgICAgIE9wdGlvbiBjc3ZLZXkgPSBuZXcgT3B0aW9uKENTVl9PUFRJT04sICJjc3YiLCBmYWxzZSwgIkNTViBvdXRwdXQgKG1hY2hpbmUgcmVhZGFibGUpIik7CisgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKGNzdktleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYXJndW1lbnRzIHNwZWNpZnlpbmcgYSBsaXN0IG9mIFNTVGFibGVzIG9yIGRpcmVjdG9yaWVzLCBwcmludCBpbmZvcm1hdGlvbiBhYm91dCBTU1RhYmxlIHBhcnRpdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyBjb21tYW5kIGxpbmVzIGFyZ3VtZW50cworICAgICAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBvbiBjb25maWd1cmF0aW9uIGZhaWx1cmUgKHdyb25nIHBhcmFtcyBnaXZlbikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbW1hbmRMaW5lUGFyc2VyIHBhcnNlciA9IG5ldyBQb3NpeFBhcnNlcigpOworICAgICAgICBDb21tYW5kTGluZSBjbWQ7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBjbWQgPSBwYXJzZXIucGFyc2Uob3B0aW9ucywgYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbWQuZ2V0QXJncygpLmxlbmd0aCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIllvdSBtdXN0IHN1cHBseSBhdCBsZWFzdCBvbmUgc3N0YWJsZSBvciBkaXJlY3RvcnkiKTsKKyAgICAgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgaW50IGVjID0gcHJvY2Vzc0FyZ3VtZW50cyhjbWQpOworCisgICAgICAgIFN5c3RlbS5leGl0KGVjKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHVzYWdlID0gU3RyaW5nLmZvcm1hdCgic3N0YWJsZXBhcnRpdGlvbnMgPG9wdGlvbnM+IDxzc3RhYmxlIGZpbGVzIG9yIGRpcmVjdG9yaWVzPiVuIik7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAiUHJpbnQgcGFydGl0aW9uIHN0YXRpc3RpY3Mgb2Ygb25lIG9yIG1vcmUgc3N0YWJsZXMuIjsKKyAgICAgICAgbmV3IEhlbHBGb3JtYXR0ZXIoKS5wcmludEhlbHAodXNhZ2UsIGhlYWRlciwgb3B0aW9ucywgIiIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBwcm9jZXNzQXJndW1lbnRzKENvbW1hbmRMaW5lIGNtZCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBTdHJpbmdbXSBrZXlzID0gY21kLmdldE9wdGlvblZhbHVlcyhLRVlfT1BUSU9OKTsKKyAgICAgICAgU2V0PFN0cmluZz4gZXhjbHVkZXMgPSBjbWQuZ2V0T3B0aW9uVmFsdWVzKEVYQ0xVREVfS0VZX09QVElPTikgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSW1tdXRhYmxlU2V0LmNvcHlPZihjbWQuZ2V0T3B0aW9uVmFsdWVzKEVYQ0xVREVfS0VZX09QVElPTikpOworCisgICAgICAgIGJvb2xlYW4gc2NhblJlY3Vyc2l2ZSA9IGNtZC5oYXNPcHRpb24oUkVDVVJTSVZFX09QVElPTik7CisgICAgICAgIGJvb2xlYW4gd2l0aFNuYXBzaG90cyA9IGNtZC5oYXNPcHRpb24oU05BUFNIT1RTX09QVElPTik7CisgICAgICAgIGJvb2xlYW4gd2l0aEJhY2t1cHMgPSBjbWQuaGFzT3B0aW9uKEJBQ0tVUFNfT1BUSU9OKTsKKyAgICAgICAgYm9vbGVhbiBjc3YgPSBjbWQuaGFzT3B0aW9uKENTVl9PUFRJT04pOworICAgICAgICBib29sZWFuIHBhcnRpdGlvbnNPbmx5ID0gY21kLmhhc09wdGlvbihQQVJUSVRJT05TX09OTFlfT1BUSU9OKTsKKworICAgICAgICBsb25nIHNpemVUaHJlc2hvbGQgPSBMb25nLk1BWF9WQUxVRTsKKyAgICAgICAgaW50IGNlbGxDb3VudFRocmVzaG9sZCA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICBpbnQgcm93Q291bnRUaHJlc2hvbGQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgaW50IHRvbWJzdG9uZUNvdW50VGhyZXNob2xkID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSBDbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXMoKSAvIDEwMDBMOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY21kLmhhc09wdGlvbihTSVpFX1RIUkVTSE9MRF9PUFRJT04pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0cmluZyB0aHJlc2hvbGQgPSBjbWQuZ2V0T3B0aW9uVmFsdWUoU0laRV9USFJFU0hPTERfT1BUSU9OKTsKKyAgICAgICAgICAgICAgICBzaXplVGhyZXNob2xkID0gTnVtYmVyVXRpbHMuaXNQYXJzYWJsZSh0aHJlc2hvbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTG9uZy5wYXJzZUxvbmcodGhyZXNob2xkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQodGhyZXNob2xkKS50b0J5dGVzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY21kLmhhc09wdGlvbihDRUxMX1RIUkVTSE9MRF9PUFRJT04pKQorICAgICAgICAgICAgICAgIGNlbGxDb3VudFRocmVzaG9sZCA9IEludGVnZXIucGFyc2VJbnQoY21kLmdldE9wdGlvblZhbHVlKENFTExfVEhSRVNIT0xEX09QVElPTikpOworICAgICAgICAgICAgaWYgKGNtZC5oYXNPcHRpb24oUk9XX1RIUkVTSE9MRF9PUFRJT04pKQorICAgICAgICAgICAgICAgIHJvd0NvdW50VGhyZXNob2xkID0gSW50ZWdlci5wYXJzZUludChjbWQuZ2V0T3B0aW9uVmFsdWUoUk9XX1RIUkVTSE9MRF9PUFRJT04pKTsKKyAgICAgICAgICAgIGlmIChjbWQuaGFzT3B0aW9uKFRPTUJTVE9ORV9USFJFU0hPTERfT1BUSU9OKSkKKyAgICAgICAgICAgICAgICB0b21ic3RvbmVDb3VudFRocmVzaG9sZCA9IEludGVnZXIucGFyc2VJbnQoY21kLmdldE9wdGlvblZhbHVlKFRPTUJTVE9ORV9USFJFU0hPTERfT1BUSU9OKSk7CisgICAgICAgICAgICBpZiAoY21kLmhhc09wdGlvbihDVVJSRU5UX1RJTUVTVEFNUF9PUFRJT04pKQorICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lID0gSW50ZWdlci5wYXJzZUludChjbWQuZ2V0T3B0aW9uVmFsdWUoQ1VSUkVOVF9USU1FU1RBTVBfT1BUSU9OKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiSW52YWxpZCB0aHJlc2hvbGQgYXJndW1lbnQ6ICVzJW4iLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaXplVGhyZXNob2xkIDwgMCB8fCBjZWxsQ291bnRUaHJlc2hvbGQgPCAwIHx8IHRvbWJzdG9uZUNvdW50VGhyZXNob2xkIDwgMCB8fCBjdXJyZW50VGltZSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiTmVnYXRpdmUgdmFsdWVzIGFyZSBub3QgYWxsb3dlZCIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBMaXN0PEZpbGU+IGRpcmVjdG9yaWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8RXh0ZW5kZWREZXNjcmlwdG9yPiBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIGlmICghYXJndW1lbnRzVG9GaWxlcyhjbWQuZ2V0QXJncygpLCBkZXNjcmlwdG9ycywgZGlyZWN0b3JpZXMpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgZm9yIChGaWxlIGRpcmVjdG9yeSA6IGRpcmVjdG9yaWVzKQorICAgICAgICB7CisgICAgICAgICAgICBwcm9jZXNzRGlyZWN0b3J5KHNjYW5SZWN1cnNpdmUsIHdpdGhTbmFwc2hvdHMsIHdpdGhCYWNrdXBzLCBkaXJlY3RvcnksIGRlc2NyaXB0b3JzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjc3YpCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImtleSxrZXlCaW5hcnksbGl2ZSxvZmZzZXQsc2l6ZSxyb3dDb3VudCxjZWxsQ291bnQsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvbWJzdG9uZUNvdW50LHJvd1RvbWJzdG9uZUNvdW50LHJhbmdlVG9tYnN0b25lQ291bnQsY29tcGxleFRvbWJzdG9uZUNvdW50LCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjZWxsVG9tYnN0b25lQ291bnQscm93VHRsRXhwaXJlZCxjZWxsVHRsRXhwaXJlZCwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5LGtleXNwYWNlLHRhYmxlLGluZGV4LCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzbmFwc2hvdCxiYWNrdXAsZ2VuZXJhdGlvbixmb3JtYXQsdmVyc2lvbiIpOworCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZGVzY3JpcHRvcnMpOworCisgICAgICAgIGZvciAoRXh0ZW5kZWREZXNjcmlwdG9yIGRlc2MgOiBkZXNjcmlwdG9ycykKKyAgICAgICAgeworICAgICAgICAgICAgcHJvY2Vzc1NTVGFibGUoa2V5cywgZXhjbHVkZXMsIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplVGhyZXNob2xkLCBjZWxsQ291bnRUaHJlc2hvbGQsIHJvd0NvdW50VGhyZXNob2xkLCB0b21ic3RvbmVDb3VudFRocmVzaG9sZCwgcGFydGl0aW9uc09ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3YsIGN1cnJlbnRUaW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc0RpcmVjdG9yeShib29sZWFuIHNjYW5SZWN1cnNpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gd2l0aFNuYXBzaG90cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB3aXRoQmFja3VwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8RXh0ZW5kZWREZXNjcmlwdG9yPiBkZXNjcmlwdG9ycykKKyAgICB7CisgICAgICAgIEZpbGVbXSBmaWxlcyA9IGRpci50cnlMaXN0KCk7CisgICAgICAgIGlmIChmaWxlcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAoRmlsZSBmaWxlIDogZmlsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmaWxlLmlzRmlsZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERlc2NyaXB0b3IuY29tcG9uZW50RnJvbUZpbGUoZmlsZSkgIT0gQmlnRm9ybWF0LkNvbXBvbmVudHMuREFUQSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkRGVzY3JpcHRvciBkZXNjID0gRXh0ZW5kZWREZXNjcmlwdG9yLmd1ZXNzRnJvbUZpbGUoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLnNuYXBzaG90ICE9IG51bGwgJiYgIXdpdGhTbmFwc2hvdHMpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2MuYmFja3VwICE9IG51bGwgJiYgIXdpdGhCYWNrdXBzKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMuYWRkKGRlc2MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhhdCBlcnJvciB3aGVuIHNjYW5uaW5nIGRpcmVjdG9yaWVzCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNjYW5SZWN1cnNpdmUgJiYgZmlsZS5pc0RpcmVjdG9yeSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb2Nlc3NEaXJlY3RvcnkodHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhTbmFwc2hvdHMsIHdpdGhCYWNrdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gYXJndW1lbnRzVG9GaWxlcyhTdHJpbmdbXSBhcmdzLCBMaXN0PEV4dGVuZGVkRGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMsIExpc3Q8RmlsZT4gZGlyZWN0b3JpZXMpCisgICAgeworICAgICAgICBib29sZWFuIGVyciA9IGZhbHNlOworICAgICAgICBmb3IgKFN0cmluZyBhcmcgOiBhcmdzKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShhcmcpOworICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRmKCJBcmd1bWVudCAnJXMnIGRvZXMgbm90IHJlc29sdmUgdG8gYSBmaWxlIG9yIGRpcmVjdG9yeSVuIiwgYXJnKTsKKyAgICAgICAgICAgICAgICBlcnIgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWZpbGUuaXNSZWFkYWJsZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRmKCJBcmd1bWVudCAnJXMnIGlzIG5vdCBhIHJlYWRhYmxlIGZpbGUgb3IgZGlyZWN0b3J5IChjaGVjayBwZXJtaXNzaW9ucyklbiIsIGFyZyk7CisgICAgICAgICAgICAgICAgZXJyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZpbGUuaXNGaWxlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9ycy5hZGQoRXh0ZW5kZWREZXNjcmlwdG9yLmd1ZXNzRnJvbUZpbGUoZmlsZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiQXJndW1lbnQgJyVzJyBpcyBub3QgYW4gc3N0YWJsZSVuIiwgYXJnKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKQorICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzLmFkZChmaWxlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIWVycjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByb2Nlc3NTU1RhYmxlKFN0cmluZ1tdIGtleXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBleGNsdWRlZEtleXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZERlc2NyaXB0b3IgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgc2l6ZVRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjZWxsQ291bnRUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93Q291bnRUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9tYnN0b25lQ291bnRUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBhcnRpdGlvbnNPbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjc3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGN1cnJlbnRUaW1lKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBVdGlsLm1ldGFkYXRhRnJvbVNTVGFibGUoZGVzYy5kZXNjcmlwdG9yKTsKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gU1NUYWJsZVJlYWRlci5vcGVuTm9WYWxpZGF0aW9uKG51bGwsIGRlc2MuZGVzY3JpcHRvciwgVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHMobWV0YWRhdGEpKTsKKworICAgICAgICBpZiAoIWNzdikKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIlblByb2Nlc3NpbmcgJXMgKCVzIHVuY29tcHJlc3NlZCwgJXMgb24gZGlzayklbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldHR5UHJpbnRNZW1vcnkoc3N0YWJsZS51bmNvbXByZXNzZWRMZW5ndGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV0dHlQcmludE1lbW9yeShzc3RhYmxlLm9uRGlza0xlbmd0aCgpKSk7CisKKyAgICAgICAgTGlzdDxQYXJ0aXRpb25TdGF0cz4gbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBTU1RhYmxlU3RhdHMgc3N0YWJsZVN0YXRzID0gbmV3IFNTVGFibGVTdGF0cygpOworCisgICAgICAgIHRyeSAoSVNTVGFibGVTY2FubmVyIHNjYW5uZXIgPSBidWlsZFNjYW5uZXIoc3N0YWJsZSwgbWV0YWRhdGEsIGtleXMsIGV4Y2x1ZGVkS2V5cykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChzY2FubmVyLmhhc05leHQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkgKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24gPSBzY2FubmVyLm5leHQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gcGFydGl0aW9uLnBhcnRpdGlvbktleSgpLmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzRXhjbHVkZWQgPSBleGNsdWRlZEtleXMuY29udGFpbnMobWV0YWRhdGEucGFydGl0aW9uS2V5VHlwZS5nZXRTdHJpbmcoa2V5KSk7CisKKyAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU3RhdHMgcGFydGl0aW9uU3RhdHMgPSBuZXcgUGFydGl0aW9uU3RhdHMoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVyLmdldEN1cnJlbnRQb3NpdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24ucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLmlzTGl2ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBDb25zdW1lIHRoZSBwYXJ0aXRpb24gdG8gcG9wdWxhdGUgdGhlIHN0YXRzLgorICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFydGl0aW9uLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVW5maWx0ZXJlZCB1bmZpbHRlcmVkID0gcGFydGl0aW9uLm5leHQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBhbnkgZGV0YWlscyBpZiB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIG9uIGl0cyBzaXplIG9yIGlmIGl0J3MgZXhjbHVkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnRpdGlvbnNPbmx5ICYmICFpc0V4Y2x1ZGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvblN0YXRzLmFkZFVuZmlsdGVyZWQoZGVzYywgY3VycmVudFRpbWUsIHVuZmlsdGVyZWQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVjb3JkIHRoZSBwYXJ0aXRvbiBzaXplCisgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvblN0YXRzLmVuZE9mUGFydGl0aW9uKHNjYW5uZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpc0V4Y2x1ZGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgc3N0YWJsZVN0YXRzLmFkZFBhcnRpdGlvbihwYXJ0aXRpb25TdGF0cyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpdGlvblN0YXRzLnNpemUgPCBzaXplVGhyZXNob2xkICYmCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25TdGF0cy5yb3dDb3VudCA8IHJvd0NvdW50VGhyZXNob2xkICYmCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25TdGF0cy5jZWxsQ291bnQgPCBjZWxsQ291bnRUaHJlc2hvbGQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvblN0YXRzLnRvbWJzdG9uZUNvdW50KCkgPCB0b21ic3RvbmVDb3VudFRocmVzaG9sZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMuYWRkKHBhcnRpdGlvblN0YXRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNzdikKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvblN0YXRzLnByaW50UGFydGl0aW9uSW5mb0NTVihtZXRhZGF0YSwgZGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvblN0YXRzLnByaW50UGFydGl0aW9uSW5mbyhtZXRhZGF0YSwgcGFydGl0aW9uc09ubHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiRmFpbHVyZSBwcm9jZXNzaW5nIHNzdGFibGUgJXM6ICVzJW4iLCBkZXNjLmRlc2NyaXB0b3IsIGUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgc3N0YWJsZS5zZWxmUmVmKCkucmVsZWFzZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjc3YpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50U3VtbWFyeShtZXRhZGF0YSwgZGVzYywgc3N0YWJsZVN0YXRzLCBtYXRjaGVzLCBwYXJ0aXRpb25zT25seSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcHJldHR5UHJpbnRNZW1vcnkobG9uZyBieXRlcykKKyAgICB7CisgICAgICAgIHJldHVybiBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShieXRlcywgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSVNTVGFibGVTY2FubmVyIGJ1aWxkU2Nhbm5lcihTU1RhYmxlUmVhZGVyIHNzdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10ga2V5cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGV4Y2x1ZGVkS2V5cykKKyAgICB7CisgICAgICAgIGlmIChrZXlzICE9IG51bGwgJiYga2V5cy5sZW5ndGggPiAwKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3N0YWJsZS5nZXRTY2FubmVyKEFycmF5cy5zdHJlYW0oa2V5cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoa2V5IC0+ICFleGNsdWRlZEtleXMuY29udGFpbnMoa2V5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAobWV0YWRhdGEucGFydGl0aW9uS2V5VHlwZTo6ZnJvbVN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoayAtPiBzc3RhYmxlLmdldFBhcnRpdGlvbmVyKCkuZGVjb3JhdGVLZXkoaykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoRGVjb3JhdGVkS2V5OjpnZXRUb2tlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodG9rZW4gLT4gbmV3IEJvdW5kczw+KHRva2VuLm1pbktleUJvdW5kKCksIHRva2VuLm1heEtleUJvdW5kKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy48QWJzdHJhY3RCb3VuZHM8UGFydGl0aW9uUG9zaXRpb24+PnRvTGlzdCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLml0ZXJhdG9yKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50ZigiQ2Fubm90IHVzZSBvbmUgb3IgbW9yZSBwYXJ0aXRpb24ga2V5cyBpbiAlcyBmb3IgdGhlIHBhcnRpdGlvbiBrZXkgdHlwZSAoJyVzJykgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIHRoZSB1bmRlcmx5aW5nIHRhYmxlOiAlcyVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoa2V5cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucGFydGl0aW9uS2V5VHlwZS5hc0NRTDNUeXBlKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzc3RhYmxlLmdldFNjYW5uZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50U3VtbWFyeShUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkRGVzY3JpcHRvciBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVTdGF0cyBzdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBhcnRpdGlvblN0YXRzPiBtYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcGFydGl0aW9uc09ubHkpCisgICAgeworICAgICAgICAvLyBQcmludCBoZWFkZXIKKyAgICAgICAgaWYgKCFtYXRjaGVzLmlzRW1wdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlN1bW1hcnkgb2YgJXM6JW4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICVzJW4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICVkIHBhcnRpdGlvbnMgbWF0Y2glbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgS2V5czoiLCBkZXNjLCBkZXNjLmRlc2NyaXB0b3IuZmlsZUZvcihCaWdGb3JtYXQuQ29tcG9uZW50cy5EQVRBKSwgbWF0Y2hlcy5zaXplKCkpOworCisgICAgICAgICAgICBmb3IgKFBhcnRpdGlvblN0YXRzIG1hdGNoIDogbWF0Y2hlcykKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIgIiArIG1heWJlRXNjYXBlS2V5Rm9yU3VtbWFyeShtZXRhZGF0YSwgbWF0Y2gua2V5KSk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJpbnQgc3RhdHMgdGFibGUgY29sdW1ucworICAgICAgICBTdHJpbmcgZm9ybWF0OworICAgICAgICBpZiAocGFydGl0aW9uc09ubHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgICAgICAgICAlMjBzJW4iLCAiUGFydGl0aW9uIHNpemUiKTsKKyAgICAgICAgICAgIGZvcm1hdCA9ICIgICUtNXMgICUyMHMlbiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICAgICAgICAgJTIwcyAlMjBzICUyMHMgJTIwcyVuIiwgIlBhcnRpdGlvbiBzaXplIiwgIlJvdyBjb3VudCIsICJDZWxsIGNvdW50IiwgIlRvbWJzdG9uZSBjb3VudCIpOworICAgICAgICAgICAgZm9ybWF0ID0gIiAgJS01cyAgJTIwcyAlMjBkICUyMGQgJTIwZCVuIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByaW50IGFwcHJveGltYXRlIHBlcmNlbnRpbGVzIGZyb20gdGhlIGhpc3RvZ3JhbXMKKyAgICAgICAgcHJpbnRQZXJjZW50aWxlKHBhcnRpdGlvbnNPbmx5LCBzdGF0cywgZm9ybWF0LCAifnA1MCIsIGggLT4gaC5wZXJjZW50aWxlKC41ZCkpOworICAgICAgICBwcmludFBlcmNlbnRpbGUocGFydGl0aW9uc09ubHksIHN0YXRzLCBmb3JtYXQsICJ+cDc1IiwgaCAtPiBoLnBlcmNlbnRpbGUoLjc1ZCkpOworICAgICAgICBwcmludFBlcmNlbnRpbGUocGFydGl0aW9uc09ubHksIHN0YXRzLCBmb3JtYXQsICJ+cDkwIiwgaCAtPiBoLnBlcmNlbnRpbGUoLjkwZCkpOworICAgICAgICBwcmludFBlcmNlbnRpbGUocGFydGl0aW9uc09ubHksIHN0YXRzLCBmb3JtYXQsICJ+cDk1IiwgaCAtPiBoLnBlcmNlbnRpbGUoLjk1ZCkpOworICAgICAgICBwcmludFBlcmNlbnRpbGUocGFydGl0aW9uc09ubHksIHN0YXRzLCBmb3JtYXQsICJ+cDk5IiwgaCAtPiBoLnBlcmNlbnRpbGUoLjk5ZCkpOworICAgICAgICBwcmludFBlcmNlbnRpbGUocGFydGl0aW9uc09ubHksIHN0YXRzLCBmb3JtYXQsICJ+cDk5OSIsIGggLT4gaC5wZXJjZW50aWxlKC45OTlkKSk7CisKKyAgICAgICAgLy8gUHJpbnQgYWNjdXJhdGUgbWV0cmljcyAobWluL21heC9jb3VudCkKKyAgICAgICAgaWYgKHBhcnRpdGlvbnNPbmx5KQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zihmb3JtYXQsICJtaW4iLCBwcmV0dHlQcmludE1lbW9yeShzdGF0cy5taW5TaXplKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zihmb3JtYXQsICJtYXgiLCBwcmV0dHlQcmludE1lbW9yeShzdGF0cy5tYXhTaXplKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zihmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50TWVtb3J5KHN0YXRzLm1pblNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMubWluUm93Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5taW5DZWxsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5taW5Ub21ic3RvbmVDb3VudCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zihmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50TWVtb3J5KHN0YXRzLm1heFNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMubWF4Um93Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5tYXhDZWxsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy5tYXhUb21ic3RvbmVDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIiAgY291bnQgICUyMGQlbiIsIHN0YXRzLnBhcnRpdGlvblNpemVIaXN0b2dyYW0uY291bnQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFBlcmNlbnRpbGUoYm9vbGVhbiBwYXJ0aXRpb25zT25seSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlU3RhdHMgc3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvTG9uZ0Z1bmN0aW9uPEVzdGltYXRlZEhpc3RvZ3JhbT4gdmFsdWUpCisgICAgeworICAgICAgICBpZiAocGFydGl0aW9uc09ubHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50TWVtb3J5KHZhbHVlLmFwcGx5QXNMb25nKHN0YXRzLnBhcnRpdGlvblNpemVIaXN0b2dyYW0pKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zihmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV0dHlQcmludE1lbW9yeSh2YWx1ZS5hcHBseUFzTG9uZyhzdGF0cy5wYXJ0aXRpb25TaXplSGlzdG9ncmFtKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hcHBseUFzTG9uZyhzdGF0cy5yb3dDb3VudEhpc3RvZ3JhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hcHBseUFzTG9uZyhzdGF0cy5jZWxsQ291bnRIaXN0b2dyYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuYXBwbHlBc0xvbmcoc3RhdHMudG9tYnN0b25lQ291bnRIaXN0b2dyYW0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtYXliZUVzY2FwZUtleUZvclN1bW1hcnkoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgQnl0ZUJ1ZmZlciBrZXkpCisgICAgeworICAgICAgICBTdHJpbmcgcyA9IG1ldGFkYXRhLnBhcnRpdGlvbktleVR5cGUuZ2V0U3RyaW5nKGtleSk7CisgICAgICAgIGlmIChzLmluZGV4T2YoJyAnKSA9PSAtMSkKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICByZXR1cm4gIlwiIiArIFN0cmluZ1V0aWxzLnJlcGxhY2UocywgIlwiIiwgIlwiXCIiKSArICJcIiI7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFNTVGFibGVTdGF0cworICAgIHsKKyAgICAgICAgLy8gRUggb2YgMTU1IGNhbiB0cmFjayBhIG1heCB2YWx1ZSBvZiAzNTIwNTcxNTQ4NDEyIGkuZS4gMy41VEIKKyAgICAgICAgRXN0aW1hdGVkSGlzdG9ncmFtIHBhcnRpdGlvblNpemVIaXN0b2dyYW0gPSBuZXcgRXN0aW1hdGVkSGlzdG9ncmFtKDE1NSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gRUggb2YgMTE4IGNhbiB0cmFjayBhIG1heCB2YWx1ZSBvZiA0MTM5MTEwOTgxLCBpLmUuLCA+IDRCIHJvd3MsIGNlbGxzIG9yIHRvbWJzdG9uZXMKKyAgICAgICAgRXN0aW1hdGVkSGlzdG9ncmFtIHJvd0NvdW50SGlzdG9ncmFtID0gbmV3IEVzdGltYXRlZEhpc3RvZ3JhbSgxMTgsIHRydWUpOworICAgICAgICBFc3RpbWF0ZWRIaXN0b2dyYW0gY2VsbENvdW50SGlzdG9ncmFtID0gbmV3IEVzdGltYXRlZEhpc3RvZ3JhbSgxMTgsIHRydWUpOworICAgICAgICBFc3RpbWF0ZWRIaXN0b2dyYW0gdG9tYnN0b25lQ291bnRIaXN0b2dyYW0gPSBuZXcgRXN0aW1hdGVkSGlzdG9ncmFtKDExOCwgdHJ1ZSk7CisKKyAgICAgICAgbG9uZyBtaW5TaXplID0gMDsKKyAgICAgICAgbG9uZyBtYXhTaXplID0gMDsKKworICAgICAgICBpbnQgbWluUm93Q291bnQgPSAwOworICAgICAgICBpbnQgbWF4Um93Q291bnQgPSAwOworCisgICAgICAgIGludCBtaW5DZWxsQ291bnQgPSAwOworICAgICAgICBpbnQgbWF4Q2VsbENvdW50ID0gMDsKKworICAgICAgICBpbnQgbWluVG9tYnN0b25lQ291bnQgPSAwOworICAgICAgICBpbnQgbWF4VG9tYnN0b25lQ291bnQgPSAwOworCisgICAgICAgIHZvaWQgYWRkUGFydGl0aW9uKFBhcnRpdGlvblN0YXRzIHN0YXRzKQorICAgICAgICB7CisgICAgICAgICAgICBwYXJ0aXRpb25TaXplSGlzdG9ncmFtLmFkZChzdGF0cy5zaXplKTsKKyAgICAgICAgICAgIHJvd0NvdW50SGlzdG9ncmFtLmFkZChzdGF0cy5yb3dDb3VudCk7CisgICAgICAgICAgICBjZWxsQ291bnRIaXN0b2dyYW0uYWRkKHN0YXRzLmNlbGxDb3VudCk7CisgICAgICAgICAgICB0b21ic3RvbmVDb3VudEhpc3RvZ3JhbS5hZGQoc3RhdHMudG9tYnN0b25lQ291bnQoKSk7CisKKyAgICAgICAgICAgIGlmIChtaW5TaXplID09IDAgfHwgc3RhdHMuc2l6ZSA8IG1pblNpemUpCisgICAgICAgICAgICAgICAgbWluU2l6ZSA9IHN0YXRzLnNpemU7CisgICAgICAgICAgICBpZiAoc3RhdHMuc2l6ZSA+IG1heFNpemUpCisgICAgICAgICAgICAgICAgbWF4U2l6ZSA9IHN0YXRzLnNpemU7CisKKyAgICAgICAgICAgIGlmIChtaW5Sb3dDb3VudCA9PSAwIHx8IHN0YXRzLnJvd0NvdW50IDwgbWluUm93Q291bnQpCisgICAgICAgICAgICAgICAgbWluUm93Q291bnQgPSBzdGF0cy5yb3dDb3VudDsKKyAgICAgICAgICAgIGlmIChzdGF0cy5yb3dDb3VudCA+IG1heFJvd0NvdW50KQorICAgICAgICAgICAgICAgIG1heFJvd0NvdW50ID0gc3RhdHMucm93Q291bnQ7CisKKyAgICAgICAgICAgIGlmIChtaW5DZWxsQ291bnQgPT0gMCB8fCBzdGF0cy5jZWxsQ291bnQgPCBtaW5DZWxsQ291bnQpCisgICAgICAgICAgICAgICAgbWluQ2VsbENvdW50ID0gc3RhdHMuY2VsbENvdW50OworICAgICAgICAgICAgaWYgKHN0YXRzLmNlbGxDb3VudCA+IG1heENlbGxDb3VudCkKKyAgICAgICAgICAgICAgICBtYXhDZWxsQ291bnQgPSBzdGF0cy5jZWxsQ291bnQ7CisKKyAgICAgICAgICAgIGlmIChtaW5Ub21ic3RvbmVDb3VudCA9PSAwIHx8IHN0YXRzLnRvbWJzdG9uZUNvdW50KCkgPCBtaW5Ub21ic3RvbmVDb3VudCkKKyAgICAgICAgICAgICAgICBtaW5Ub21ic3RvbmVDb3VudCA9IHN0YXRzLnRvbWJzdG9uZUNvdW50KCk7CisgICAgICAgICAgICBpZiAoc3RhdHMudG9tYnN0b25lQ291bnQoKSA+IG1heFRvbWJzdG9uZUNvdW50KQorICAgICAgICAgICAgICAgIG1heFRvbWJzdG9uZUNvdW50ID0gc3RhdHMudG9tYnN0b25lQ291bnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBQYXJ0aXRpb25TdGF0cworICAgIHsKKyAgICAgICAgZmluYWwgQnl0ZUJ1ZmZlciBrZXk7CisgICAgICAgIGZpbmFsIGxvbmcgb2Zmc2V0OworICAgICAgICBmaW5hbCBib29sZWFuIGxpdmU7CisKKyAgICAgICAgbG9uZyBzaXplID0gLTE7CisgICAgICAgIGludCByb3dDb3VudCA9IDA7CisgICAgICAgIGludCBjZWxsQ291bnQgPSAwOworICAgICAgICBpbnQgcm93VG9tYnN0b25lQ291bnQgPSAwOworICAgICAgICBpbnQgcmFuZ2VUb21ic3RvbmVDb3VudCA9IDA7CisgICAgICAgIGludCBjb21wbGV4VG9tYnN0b25lQ291bnQgPSAwOworICAgICAgICBpbnQgY2VsbFRvbWJzdG9uZUNvdW50ID0gMDsKKyAgICAgICAgaW50IHJvd1R0bEV4cGlyZWQgPSAwOworICAgICAgICBpbnQgY2VsbFR0bEV4cGlyZWQgPSAwOworCisgICAgICAgIFBhcnRpdGlvblN0YXRzKEJ5dGVCdWZmZXIga2V5LCBsb25nIG9mZnNldCwgYm9vbGVhbiBsaXZlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgdGhpcy5saXZlID0gbGl2ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZW5kT2ZQYXJ0aXRpb24obG9uZyBwb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZSA9IHBvc2l0aW9uIC0gb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgaW50IHRvbWJzdG9uZUNvdW50KCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHJvd1RvbWJzdG9uZUNvdW50ICsgcmFuZ2VUb21ic3RvbmVDb3VudCArIGNvbXBsZXhUb21ic3RvbmVDb3VudCArIGNlbGxUb21ic3RvbmVDb3VudCArIHJvd1R0bEV4cGlyZWQgKyBjZWxsVHRsRXhwaXJlZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYWRkVW5maWx0ZXJlZChFeHRlbmRlZERlc2NyaXB0b3IgZGVzYywgbG9uZyBjdXJyZW50VGltZSwgVW5maWx0ZXJlZCB1bmZpbHRlcmVkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAodW5maWx0ZXJlZCBpbnN0YW5jZW9mIFJvdykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSb3cgcm93ID0gKFJvdykgdW5maWx0ZXJlZDsKKyAgICAgICAgICAgICAgICByb3dDb3VudCsrOworCisgICAgICAgICAgICAgICAgaWYgKCFyb3cuZGVsZXRpb24oKS5pc0xpdmUoKSkKKyAgICAgICAgICAgICAgICAgICAgcm93VG9tYnN0b25lQ291bnQrKzsKKworICAgICAgICAgICAgICAgIExpdmVuZXNzSW5mbyBsaXZlSW5mbyA9IHJvdy5wcmltYXJ5S2V5TGl2ZW5lc3NJbmZvKCk7CisgICAgICAgICAgICAgICAgaWYgKCFsaXZlSW5mby5pc0VtcHR5KCkgJiYgbGl2ZUluZm8uaXNFeHBpcmluZygpICYmIGxpdmVJbmZvLmxvY2FsRXhwaXJhdGlvblRpbWUoKSA8IGN1cnJlbnRUaW1lKQorICAgICAgICAgICAgICAgICAgICByb3dUdGxFeHBpcmVkKys7CisKKyAgICAgICAgICAgICAgICBmb3IgKENvbHVtbkRhdGEgY2QgOiByb3cpCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIGlmIChjZC5jb2x1bW4oKS5pc1NpbXBsZSgpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRDZWxsKChpbnQpIGN1cnJlbnRUaW1lLCBsaXZlSW5mbywgKENlbGw8Pz4pIGNkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXhDb2x1bW5EYXRhIGNvbXBsZXhEYXRhID0gKENvbXBsZXhDb2x1bW5EYXRhKSBjZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29tcGxleERhdGEuY29tcGxleERlbGV0aW9uKCkuaXNMaXZlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleFRvbWJzdG9uZUNvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQ2VsbDw/PiBjZWxsIDogY29tcGxleERhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQ2VsbCgoaW50KSBjdXJyZW50VGltZSwgbGl2ZUluZm8sIGNlbGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodW5maWx0ZXJlZCBpbnN0YW5jZW9mIFJhbmdlVG9tYnN0b25lTWFya2VyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJhbmdlVG9tYnN0b25lQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVua25vd24ga2luZCAiICsgdW5maWx0ZXJlZC5raW5kKCkgKyAiIGluIHNzdGFibGUgIiArIGRlc2MuZGVzY3JpcHRvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYWRkQ2VsbChpbnQgY3VycmVudFRpbWUsIExpdmVuZXNzSW5mbyBsaXZlSW5mbywgQ2VsbDw/PiBjZWxsKQorICAgICAgICB7CisgICAgICAgICAgICBjZWxsQ291bnQrKzsKKyAgICAgICAgICAgIGlmIChjZWxsLmlzVG9tYnN0b25lKCkpCisgICAgICAgICAgICAgICAgY2VsbFRvbWJzdG9uZUNvdW50Kys7CisgICAgICAgICAgICBpZiAoY2VsbC5pc0V4cGlyaW5nKCkgJiYgKGxpdmVJbmZvLmlzRW1wdHkoKSB8fCBjZWxsLnR0bCgpICE9IGxpdmVJbmZvLnR0bCgpKSAmJiAhY2VsbC5pc0xpdmUoY3VycmVudFRpbWUpKQorICAgICAgICAgICAgICAgIGNlbGxUdGxFeHBpcmVkKys7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHByaW50UGFydGl0aW9uSW5mbyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBib29sZWFuIHBhcnRpdGlvbnNPbmx5KQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gbWV0YWRhdGEucGFydGl0aW9uS2V5VHlwZS5nZXRTdHJpbmcodGhpcy5rZXkpOworICAgICAgICAgICAgaWYgKHBhcnRpdGlvbnNPbmx5KQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCIgIFBhcnRpdGlvbjogJyVzJyAoJXMpICVzLCBzaXplOiAlcyVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleCh0aGlzLmtleSksIGxpdmUgPyAibGl2ZSIgOiAibm90IGxpdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50TWVtb3J5KHNpemUpKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiICBQYXJ0aXRpb246ICclcycgKCVzKSAlcywgc2l6ZTogJXMsIHJvd3M6ICVkLCBjZWxsczogJWQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b21ic3RvbmVzOiAlZCAocm93OiVkLCByYW5nZTolZCwgY29tcGxleDolZCwgY2VsbDolZCwgcm93LVRUTGQ6JWQsIGNlbGwtVFRMZDolZCklbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgodGhpcy5rZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmUgPyAibGl2ZSIgOiAibm90IGxpdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50TWVtb3J5KHNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b21ic3RvbmVDb3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1RvbWJzdG9uZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlVG9tYnN0b25lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleFRvbWJzdG9uZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxUb21ic3RvbmVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dUdGxFeHBpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxUdGxFeHBpcmVkKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcHJpbnRQYXJ0aXRpb25JbmZvQ1NWKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIEV4dGVuZGVkRGVzY3JpcHRvciBkZXNjKQorICAgICAgICB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiXCIlc1wiLCVzLCVzLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVkLCVzLCVzLCVzLCVzLCVzLCVzLCVzLCVzLCVzJW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmVFc2NhcGVLZXlGb3JTdW1tYXJ5KG1ldGFkYXRhLCBrZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChrZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZSA/ICJ0cnVlIiA6ICJmYWxzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dDb3VudCwgY2VsbENvdW50LCB0b21ic3RvbmVDb3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93VG9tYnN0b25lQ291bnQsIHJhbmdlVG9tYnN0b25lQ291bnQsIGNvbXBsZXhUb21ic3RvbmVDb3VudCwgY2VsbFRvbWJzdG9uZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93VHRsRXhwaXJlZCwgY2VsbFR0bEV4cGlyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLmRlc2NyaXB0b3IuZmlsZUZvcihCaWdGb3JtYXQuQ29tcG9uZW50cy5EQVRBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdE51bGwoZGVzYy5rZXlzcGFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3ROdWxsKGRlc2MudGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90TnVsbChkZXNjLmluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdE51bGwoZGVzYy5zbmFwc2hvdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3ROdWxsKGRlc2MuYmFja3VwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MuZGVzY3JpcHRvci5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MuZGVzY3JpcHRvci52ZXJzaW9uLmZvcm1hdC5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLmRlc2NyaXB0b3IudmVyc2lvbi52ZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBFeHRlbmRlZERlc2NyaXB0b3IgaW1wbGVtZW50cyBDb21wYXJhYmxlPEV4dGVuZGVkRGVzY3JpcHRvcj4KKyAgICB7CisgICAgICAgIGZpbmFsIFN0cmluZyBrZXlzcGFjZTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRhYmxlOworICAgICAgICBmaW5hbCBTdHJpbmcgaW5kZXg7CisgICAgICAgIGZpbmFsIFN0cmluZyBzbmFwc2hvdDsKKyAgICAgICAgZmluYWwgU3RyaW5nIGJhY2t1cDsKKyAgICAgICAgZmluYWwgVGFibGVJZCB0YWJsZUlkOworICAgICAgICBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3I7CisKKyAgICAgICAgRXh0ZW5kZWREZXNjcmlwdG9yKFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBUYWJsZUlkIHRhYmxlSWQsIFN0cmluZyBpbmRleCwgU3RyaW5nIHNuYXBzaG90LCBTdHJpbmcgYmFja3VwLCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMua2V5c3BhY2UgPSBrZXlzcGFjZTsKKyAgICAgICAgICAgIHRoaXMudGFibGUgPSB0YWJsZTsKKyAgICAgICAgICAgIHRoaXMudGFibGVJZCA9IHRhYmxlSWQ7CisgICAgICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICB0aGlzLnNuYXBzaG90ID0gc25hcHNob3Q7CisgICAgICAgICAgICB0aGlzLmJhY2t1cCA9IGJhY2t1cDsKKyAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgaWYgKGJhY2t1cCAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiQmFja3VwOiIpLmFwcGVuZChiYWNrdXApLmFwcGVuZCgnICcpOworICAgICAgICAgICAgaWYgKHNuYXBzaG90ICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJTbmFwc2hvdDoiKS5hcHBlbmQoc25hcHNob3QpLmFwcGVuZCgnICcpOworICAgICAgICAgICAgaWYgKGtleXNwYWNlICE9IG51bGwpCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGtleXNwYWNlKS5hcHBlbmQoJy4nKTsKKyAgICAgICAgICAgIGlmICh0YWJsZSAhPSBudWxsKQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0YWJsZSk7CisgICAgICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy4nKS5hcHBlbmQoaW5kZXgpOworICAgICAgICAgICAgaWYgKHRhYmxlSWQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJy0nKS5hcHBlbmQodGFibGVJZC50b0hleFN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBzYi5hcHBlbmQoIiAjIikKKyAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZGVzY3JpcHRvci5pZCkKKyAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAoIikKKyAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZGVzY3JpcHRvci52ZXJzaW9uLmZvcm1hdC5uYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCctJykKKyAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZGVzY3JpcHRvci52ZXJzaW9uLnZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCcpJykKKyAgICAgICAgICAgICAgICAgICAgIC50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIEV4dGVuZGVkRGVzY3JpcHRvciBndWVzc0Zyb21GaWxlKEZpbGUgZkFyZykKKyAgICAgICAgeworICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZShmQXJnKTsKKworICAgICAgICAgICAgU3RyaW5nIHNuYXBzaG90ID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBiYWNrdXAgPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIGluZGV4ID0gbnVsbDsKKworICAgICAgICAgICAgRmlsZSBwYXJlbnQgPSBmQXJnLnBhcmVudCgpOworICAgICAgICAgICAgRmlsZSBncmFuZHBhcmVudCA9IHBhcmVudC5wYXJlbnQoKTsKKworICAgICAgICAgICAgaWYgKHBhcmVudC5uYW1lKCkubGVuZ3RoKCkgPiAxICYmIHBhcmVudC5uYW1lKCkuc3RhcnRzV2l0aCgiLiIpICYmIHBhcmVudC5uYW1lKCkuY2hhckF0KDEpICE9ICcuJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbmRleCA9IHBhcmVudC5uYW1lKCkuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBncmFuZHBhcmVudCA9IHBhcmVudC5wYXJlbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmVudC5uYW1lKCkuZXF1YWxzKERpcmVjdG9yaWVzLkJBQ0tVUFNfU1VCRElSKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiYWNrdXAgPSBwYXJlbnQubmFtZSgpOworICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQoKTsKKyAgICAgICAgICAgICAgICBncmFuZHBhcmVudCA9IHBhcmVudC5wYXJlbnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGdyYW5kcGFyZW50Lm5hbWUoKS5lcXVhbHMoRGlyZWN0b3JpZXMuU05BUFNIT1RfU1VCRElSKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbmFwc2hvdCA9IHBhcmVudC5uYW1lKCk7CisgICAgICAgICAgICAgICAgcGFyZW50ID0gZ3JhbmRwYXJlbnQucGFyZW50KCk7CisgICAgICAgICAgICAgICAgZ3JhbmRwYXJlbnQgPSBwYXJlbnQucGFyZW50KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBUYWJsZUlkPiB0YWJsZU5hbWVBbmRJZCA9IFRhYmxlSWQudGFibGVOYW1lQW5kSWRGcm9tRmlsZW5hbWUocGFyZW50Lm5hbWUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHRhYmxlTmFtZUFuZElkICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4dGVuZGVkRGVzY3JpcHRvcihncmFuZHBhcmVudC5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZUFuZElkLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZUFuZElkLnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hcHNob3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBub24tcGFyc2VhYmxlIHRhYmxlLUlEcworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IEV4dGVuZGVkRGVzY3JpcHRvcihudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYXBzaG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oRXh0ZW5kZWREZXNjcmlwdG9yIG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjID0gZGVzY3JpcHRvci5kaXJlY3RvcnkudG9TdHJpbmcoKS5jb21wYXJlVG8oby5kZXNjcmlwdG9yLmRpcmVjdG9yeS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmIChjICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICBjID0gbm90TnVsbChrZXlzcGFjZSkuY29tcGFyZVRvKG5vdE51bGwoby5rZXlzcGFjZSkpOworICAgICAgICAgICAgaWYgKGMgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgIGMgPSBub3ROdWxsKHRhYmxlKS5jb21wYXJlVG8obm90TnVsbChvLnRhYmxlKSk7CisgICAgICAgICAgICBpZiAoYyAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgYyA9IG5vdE51bGwodGFibGVJZCkudG9TdHJpbmcoKS5jb21wYXJlVG8obm90TnVsbChvLnRhYmxlSWQpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKGMgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgIGMgPSBub3ROdWxsKGluZGV4KS5jb21wYXJlVG8obm90TnVsbChvLmluZGV4KSk7CisgICAgICAgICAgICBpZiAoYyAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgYyA9IG5vdE51bGwoc25hcHNob3QpLmNvbXBhcmVUbyhub3ROdWxsKG8uc25hcHNob3QpKTsKKyAgICAgICAgICAgIGlmIChjICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICBjID0gbm90TnVsbChiYWNrdXApLmNvbXBhcmVUbyhub3ROdWxsKG8uYmFja3VwKSk7CisgICAgICAgICAgICBpZiAoYyAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgYyA9IG5vdE51bGwoZGVzY3JpcHRvci5pZC50b1N0cmluZygpKS5jb21wYXJlVG8obm90TnVsbChvLmRlc2NyaXB0b3IuaWQudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgaWYgKGMgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLmNvbXBhcmUoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcyksIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG8pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBub3ROdWxsKFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHMgIT0gbnVsbCA/IHMgOiAiIjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBUYWJsZUlkIG5vdE51bGwoVGFibGVJZCBzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHMgIT0gbnVsbCA/IHMgOiBFTVBUWV9UQUJMRV9JRDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlUmVwYWlyZWRBdFNldHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZVJlcGFpcmVkQXRTZXR0ZXIuamF2YQppbmRleCAxMjg5ZTdlLi5mNWVlM2RmIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlUmVwYWlyZWRBdFNldHRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVSZXBhaXJlZEF0U2V0dGVyLmphdmEKQEAgLTI2LDIwICsyNiw4IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKLQotLyoqCi0gKiBTZXQgcmVwYWlyZWRBdCBzdGF0dXMgb24gYSBnaXZlbiBzZXQgb2Ygc3N0YWJsZXMuCi0gKgotICogSWYgeW91IHBhc3MgLS1pcy1yZXBhaXJlZCwgaXQgd2lsbCBzZXQgdGhlIHJlcGFpcmVkQXQgdGltZSB0byB0aGUgbGFzdCBtb2RpZmllZCB0aW1lLgotICoKLSAqIElmIHlvdSBrbm93IHlvdSByYW4gcmVwYWlyIDIgd2Vla3MgYWdvLCB5b3UgY2FuIGRvIHNvbWV0aGluZyBsaWtlCi0gKgotICoge0Bjb2RlCi0gKiBzc3RhYmxlcmVwYWlyc2V0IC0taXMtcmVwYWlyZWQgLWYgPChmaW5kIC92YXIvbGliL2Nhc3NhbmRyYS9kYXRhLy4uLi8gLWluYW1lICIqRGF0YS5kYioiIC1tdGltZSArMTQpCi0gKiB9Ci0gKi8KK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogCiBwdWJsaWMgY2xhc3MgU1NUYWJsZVJlcGFpcmVkQXRTZXR0ZXIKQEAgLTgxLDcgKzY5LDcgQEAKIAogICAgICAgICBmb3IgKFN0cmluZyBmbmFtZTogZmlsZU5hbWVzKQogICAgICAgICB7Ci0gICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShmbmFtZSk7CisgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLmZyb21GaWxlV2l0aENvbXBvbmVudChuZXcgRmlsZShmbmFtZSksIGZhbHNlKS5sZWZ0OwogICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yLnZlcnNpb24uaXNDb21wYXRpYmxlKCkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTU1RhYmxlICIgKyBmbmFtZSArICIgaXMgaW4gYSBvbGQgYW5kIHVuc3VwcG9ydGVkIGZvcm1hdCIpOwpAQCAtOTAsNyArNzgsNyBAQAogCiAgICAgICAgICAgICBpZiAoc2V0SXNSZXBhaXJlZCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlVGltZSBmID0gRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSkudG9QYXRoKCkpOworICAgICAgICAgICAgICAgIEZpbGVUaW1lIGYgPSBGaWxlcy5nZXRMYXN0TW9kaWZpZWRUaW1lKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLnRvUGF0aCgpKTsKICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLm11dGF0ZVJlcGFpck1ldGFkYXRhKGRlc2NyaXB0b3IsIGYudG9NaWxsaXMoKSwgbnVsbCwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNjcnViYmVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lU2NydWJiZXIuamF2YQppbmRleCA0NDg0YjY5Li4yNmNjMzYzIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lU2NydWJiZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lU2NydWJiZXIuamF2YQpAQCAtMjUsNyArMjUsNiBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Db21tYW5kTGluZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkNvbW1hbmRMaW5lUGFyc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuR251UGFyc2VyOwpAQCAtNDIsMTggKzQxLDIyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5MZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uTGV2ZWxlZE1hbmlmZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlNjcnViYmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU2NydWJiZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlSGVhZGVyRml4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuQnVsa0xvYWRlci5DbWRMaW5lT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KVk1TdGFiaWxpdHlJbnNwZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9VVElMX0FMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNUOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CiAKIHB1YmxpYyBjbGFzcyBTdGFuZGFsb25lU2NydWJiZXIKQEAgLTc4LDcgKzgxLDcgQEAKICAgICB7CiAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnMucGFyc2VBcmdzKGFyZ3MpOwogCi0gICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oVXRpbC5BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVCkpCisgICAgICAgIGlmIChURVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QuZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnRvb2xJbml0aWFsaXphdGlvbihmYWxzZSk7IC8vTmVjZXNzYXJ5IGZvciB0ZXN0aW5nCiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIFV0aWwuaW5pdERhdGFiYXNlRGVzY3JpcHRvcigpOwpAQCAtMTIwLDcgKzEyMyw3IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZW50cnkuZ2V0S2V5KCk7CiAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5EQVRBKSkKKyAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50cy5EQVRBKSkKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgICAgICAgICBsaXN0UmVzdWx0LmFkZChQYWlyLmNyZWF0ZShkZXNjcmlwdG9yLCBjb21wb25lbnRzKSk7CkBAIC0xNDMsNyArMTQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaGVhZGVyRml4QnVpbGRlciA9IGhlYWRlckZpeEJ1aWxkZXIuZHJ5UnVuKCk7CiAKICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8RGVzY3JpcHRvciwgU2V0PENvbXBvbmVudD4+IHAgOiBsaXN0UmVzdWx0KQotICAgICAgICAgICAgICAgICAgICBoZWFkZXJGaXhCdWlsZGVyLndpdGhQYXRoKEZpbGUuZ2V0UGF0aChwLmxlZnQuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKSk7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlckZpeEJ1aWxkZXIud2l0aFBhdGgocC5sZWZ0LmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKS50b1BhdGgoKSk7CiAKICAgICAgICAgICAgICAgICBTU1RhYmxlSGVhZGVyRml4IGhlYWRlckZpeCA9IGhlYWRlckZpeEJ1aWxkZXIuYnVpbGQoKTsKICAgICAgICAgICAgICAgICB0cnkKQEAgLTE5Nyw3ICsyMDAsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHBhaXIubGVmdDsKICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gcGFpci5yaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LkRBVEEpKQorICAgICAgICAgICAgICAgIGlmICghY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnRzLkRBVEEpKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAgICAgICAgIHRyeQpAQCAtMjIxLDcgKzIyNCw5IEBACiAgICAgICAgICAgICAgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gTGlmZWN5Y2xlVHJhbnNhY3Rpb24ub2ZmbGluZShPcGVyYXRpb25UeXBlLlNDUlVCLCBzc3RhYmxlKSkKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgdHhuLm9ic29sZXRlT3JpZ2luYWxzKCk7IC8vIG1ha2Ugc3VyZSBvcmlnaW5hbHMgYXJlIGRlbGV0ZWQgYW5kIGF2b2lkIE5QRSBpZiBpbmRleCBpcyBtaXNzaW5nLCBDQVNTQU5EUkEtOTU5MQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IChTY3J1YmJlciBzY3J1YmJlciA9IG5ldyBTY3J1YmJlcihjZnMsIHR4biwgb3B0aW9ucy5za2lwQ29ycnVwdGVkLCBoYW5kbGVyLCAhb3B0aW9ucy5ub1ZhbGlkYXRlLCBvcHRpb25zLnJlaW5zZXJPdmVyZmxvd2VkVFRMKSkKKworICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZUZvcm1hdCBmb3JtYXQgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgKElTY3J1YmJlciBzY3J1YmJlciA9IGZvcm1hdC5nZXRTY3J1YmJlcihjZnMsIHR4biwgaGFuZGxlciwgb3B0aW9ucy5idWlsZCgpKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3J1YmJlci5zY3J1YigpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMjc1LDcgKzI4MCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBPcHRpb25zCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT3B0aW9ucyBleHRlbmRzIElTY3J1YmJlci5PcHRpb25zLkJ1aWxkZXIKICAgICB7CiAgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcga2V5c3BhY2VOYW1lOwogICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNmTmFtZTsKQEAgLTI4Myw5ICsyODgsNiBAQAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBkZWJ1ZzsKICAgICAgICAgcHVibGljIGJvb2xlYW4gdmVyYm9zZTsKICAgICAgICAgcHVibGljIGJvb2xlYW4gbWFuaWZlc3RDaGVja09ubHk7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIHNraXBDb3JydXB0ZWQ7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIG5vVmFsaWRhdGU7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlaW5zZXJPdmVyZmxvd2VkVFRMOwogICAgICAgICBwdWJsaWMgSGVhZGVyRml4TW9kZSBoZWFkZXJGaXhNb2RlID0gSGVhZGVyRml4TW9kZS5WQUxJREFURTsKIAogICAgICAgICBlbnVtIEhlYWRlckZpeE1vZGUKQEAgLTM0NCw5ICszNDYsOSBAQAogICAgICAgICAgICAgICAgIG9wdHMuZGVidWcgPSBjbWQuaGFzT3B0aW9uKERFQlVHX09QVElPTik7CiAgICAgICAgICAgICAgICAgb3B0cy52ZXJib3NlID0gY21kLmhhc09wdGlvbihWRVJCT1NFX09QVElPTik7CiAgICAgICAgICAgICAgICAgb3B0cy5tYW5pZmVzdENoZWNrT25seSA9IGNtZC5oYXNPcHRpb24oTUFOSUZFU1RfQ0hFQ0tfT1BUSU9OKTsKLSAgICAgICAgICAgICAgICBvcHRzLnNraXBDb3JydXB0ZWQgPSBjbWQuaGFzT3B0aW9uKFNLSVBfQ09SUlVQVEVEX09QVElPTik7Ci0gICAgICAgICAgICAgICAgb3B0cy5ub1ZhbGlkYXRlID0gY21kLmhhc09wdGlvbihOT19WQUxJREFURV9PUFRJT04pOwotICAgICAgICAgICAgICAgIG9wdHMucmVpbnNlck92ZXJmbG93ZWRUVEwgPSBjbWQuaGFzT3B0aW9uKFJFSU5TRVJUX09WRVJGTE9XRURfVFRMX09QVElPTik7CisgICAgICAgICAgICAgICAgb3B0cy5za2lwQ29ycnVwdGVkKGNtZC5oYXNPcHRpb24oU0tJUF9DT1JSVVBURURfT1BUSU9OKSk7CisgICAgICAgICAgICAgICAgb3B0cy5jaGVja0RhdGEoIWNtZC5oYXNPcHRpb24oTk9fVkFMSURBVEVfT1BUSU9OKSk7CisgICAgICAgICAgICAgICAgb3B0cy5yZWluc2VydE92ZXJmbG93ZWRUVExSb3dzKGNtZC5oYXNPcHRpb24oUkVJTlNFUlRfT1ZFUkZMT1dFRF9UVExfT1BUSU9OKSk7CiAgICAgICAgICAgICAgICAgaWYgKGNtZC5oYXNPcHRpb24oSEVBREVSRklYX09QVElPTikpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB0cnkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVTcGxpdHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNwbGl0dGVyLmphdmEKaW5kZXggZWZhZGI1Ni4uZjlmMjQ4YSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNwbGl0dGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNwbGl0dGVyLmphdmEKQEAgLTE4LDI1ICsxOCwzOCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkNvbW1hbmRMaW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuQ29tbWFuZExpbmVQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5HbnVQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5IZWxwRm9ybWF0dGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuUGFyc2VFeGNlcHRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlNTVGFibGVTcGxpdHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KVk1TdGFiaWxpdHlJbnNwZWN0b3I7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1Q7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLkJ1bGtMb2FkZXIuQ21kTGluZU9wdGlvbnM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKIApAQCAtNTAsMTAgKzYzLDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1NOQVBTSE9UX09QVElPTiA9ICJuby1zbmFwc2hvdCI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJWkVfT1BUSU9OID0gInNpemUiOwogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQogICAgIHsKICAgICAgICAgT3B0aW9ucyBvcHRpb25zID0gT3B0aW9ucy5wYXJzZUFyZ3MoYXJncyk7Ci0gICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oVXRpbC5BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVCkpCisgICAgICAgIGlmIChURVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QuZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnRvb2xJbml0aWFsaXphdGlvbihmYWxzZSk7IC8vTmVjZXNzYXJ5IGZvciB0ZXN0aW5nCiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIFV0aWwuaW5pdERhdGFiYXNlRGVzY3JpcHRvcigpOwpAQCAtNzQsNyArODcsNyBAQAogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBTU1RhYmxlLnRyeURlc2NyaXB0b3JGcm9tRmlsZW5hbWUoZmlsZSk7CisgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gU1NUYWJsZS50cnlEZXNjcmlwdG9yRnJvbUZpbGUoZmlsZSk7CiAgICAgICAgICAgICAgICAgaWYgKGRlc2MgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwaW5nIG5vbiBzc3RhYmxlIGZpbGUgIiArIGZpbGUpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTkwLDIxICsxMDMsNyBAQAogICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFjZk5hbWUuZXF1YWxzKGRlc2MuY2ZuYW1lKSkKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQWxsIHNzdGFibGVzIG11c3QgYmUgcGFydCBvZiB0aGUgc2FtZSB0YWJsZSIpOwogCi0gICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IG5ldyBIYXNoU2V0PENvbXBvbmVudD4oQXJyYXlzLmFzTGlzdChuZXcgQ29tcG9uZW50W117Ci0gICAgICAgICAgICAgICAgICAgIENvbXBvbmVudC5EQVRBLAotICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQuUFJJTUFSWV9JTkRFWCwKLSAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50LkZJTFRFUiwKLSAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50LkNPTVBSRVNTSU9OX0lORk8sCi0gICAgICAgICAgICAgICAgICAgIENvbXBvbmVudC5TVEFUUwotICAgICAgICAgICAgICAgIH0pKTsKLQotICAgICAgICAgICAgICAgIEl0ZXJhdG9yPENvbXBvbmVudD4gaXRlciA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50IGNvbXBvbmVudCA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIShuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpLmV4aXN0cygpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhcnNlZEZpbGVuYW1lcy5wdXQoZGVzYywgY29tcG9uZW50cyk7CisgICAgICAgICAgICAgICAgcGFyc2VkRmlsZW5hbWVzLnB1dChkZXNjLCBkZXNjLmdldENvbXBvbmVudHMoQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSwgZGVzYy5nZXRGb3JtYXQoKS5iYXRjaENvbXBvbmVudHMoKSkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoa3NOYW1lID09IG51bGwgfHwgY2ZOYW1lID09IG51bGwpCkBAIC0xMjUsOCArMTI0LDggQEAKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IFNTVGFibGVSZWFkZXIub3Blbk5vVmFsaWRhdGlvbihmbi5nZXRLZXkoKSwgZm4uZ2V0VmFsdWUoKSwgY2ZzKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NTVGFibGVMYXJnZXJFbm91Z2goc3N0YWJsZSwgb3B0aW9ucy5zaXplSW5NQikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJTa2lwcGluZyAlczogaXQncyBzaXplICglLjNmIE1CKSBpcyBsZXNzIHRoYW4gdGhlIHNwbGl0IHNpemUgKCVkIE1CKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0RmlsZW5hbWUoKSwgKChzc3RhYmxlLm9uRGlza0xlbmd0aCgpICogMS4wZCkgLyAxMDI0TCkgLyAxMDI0TCwgb3B0aW9ucy5zaXplSW5NQikpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlNraXBwaW5nICVzOiBpdCdzIHNpemUgKCUuM2YgTUIpIGlzIGxlc3MgdGhhbiB0aGUgc3BsaXQgc2l6ZSAoJWQgTUIpJW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRGaWxlbmFtZSgpLCAoKHNzdGFibGUub25EaXNrTGVuZ3RoKCkgKiAxLjBkKSAvIDEwMjRMKSAvIDEwMjRMLCBvcHRpb25zLnNpemVJbk1CKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVzLmFkZChzc3RhYmxlKTsKQEAgLTE0MCw3ICsxMzksNyBAQAogICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEpWTVN0YWJpbGl0eUluc3BlY3Rvci5pbnNwZWN0VGhyb3dhYmxlKGUpOwotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oU3RyaW5nLmZvcm1hdCgiRXJyb3IgTG9hZGluZyAlczogJXMiLCBmbi5nZXRLZXkoKSwgZS5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGYoIkVycm9yIExvYWRpbmcgJXM6ICVzJW4iLCBmbi5nZXRLZXkoKSwgZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5kZWJ1ZykKICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwogICAgICAgICAgICAgICAgIH0KQEAgLTE1MCw3ICsxNDksNyBAQAogICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG9wdGlvbnMuc25hcHNob3QpCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIlByZS1zcGxpdCBzc3RhYmxlcyBzbmFwc2hvdHRlZCBpbnRvIHNuYXBzaG90ICVzIiwgc25hcHNob3ROYW1lKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIlByZS1zcGxpdCBzc3RhYmxlcyBzbmFwc2hvdHRlZCBpbnRvIHNuYXBzaG90ICVzJW4iLCBzbmFwc2hvdE5hbWUpOwogCiAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQogICAgICAgICAgICAgewpAQCAtMTYwLDcgKzE1OSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJFcnJvciBzcGxpdHRpbmcgJXM6ICVzIiwgc3N0YWJsZSwgZS5nZXRNZXNzYWdlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGYoIkVycm9yIHNwbGl0dGluZyAlczogJXMlbiIsIHNzdGFibGUsIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVidWcpCiAgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKIApAQCAtMjAwLDcgKzE5OSw3IEBACiAgICAgICAgICAgICB0aGlzLmZpbGVuYW1lcyA9IGZpbGVuYW1lczsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9ucyBwYXJzZUFyZ3MoU3RyaW5nIGNtZEFyZ3NbXSkKKyAgICAgICAgcHVibGljIHN0YXRpYyBPcHRpb25zIHBhcnNlQXJncyhTdHJpbmdbXSBjbWRBcmdzKQogICAgICAgICB7CiAgICAgICAgICAgICBDb21tYW5kTGluZVBhcnNlciBwYXJzZXIgPSBuZXcgR251UGFyc2VyKCk7CiAgICAgICAgICAgICBDbWRMaW5lT3B0aW9ucyBvcHRpb25zID0gZ2V0Q21kTGluZU9wdGlvbnMoKTsKQEAgLTI1MSwxOSArMjUwLDE4IEBACiAgICAgICAgICAgICBvcHRpb25zLmFkZE9wdGlvbihudWxsLCBERUJVR19PUFRJT04sICAgICAgICAgICJkaXNwbGF5IHN0YWNrIHRyYWNlcyIpOwogICAgICAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24oImgiLCAgSEVMUF9PUFRJT04sICAgICAgICAgICAiZGlzcGxheSB0aGlzIGhlbHAgbWVzc2FnZSIpOwogICAgICAgICAgICAgb3B0aW9ucy5hZGRPcHRpb24obnVsbCwgTk9fU05BUFNIT1RfT1BUSU9OLCAgICAiZG9uJ3Qgc25hcHNob3QgdGhlIHNzdGFibGVzIGJlZm9yZSBzcGxpdHRpbmciKTsKLSAgICAgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKCJzIiwgIFNJWkVfT1BUSU9OLCAic2l6ZSIsICAgIm1heGltdW0gc2l6ZSBpbiBNQiBmb3IgdGhlIG91dHB1dCBzc3RhYmxlcyAoZGVmYXVsdDogIiArIERFRkFVTFRfU1NUQUJMRV9TSVpFICsgIikiKTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkT3B0aW9uKCJzIiwgIFNJWkVfT1BUSU9OLCAic2l6ZSIsICJtYXhpbXVtIHNpemUgaW4gTUIgZm9yIHRoZSBvdXRwdXQgc3N0YWJsZXMgKGRlZmF1bHQ6ICIgKyBERUZBVUxUX1NTVEFCTEVfU0laRSArICcpJyk7CiAgICAgICAgICAgICByZXR1cm4gb3B0aW9uczsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFVzYWdlKENtZExpbmVPcHRpb25zIG9wdGlvbnMpCiAgICAgICAgIHsKICAgICAgICAgICAgIFN0cmluZyB1c2FnZSA9IFN0cmluZy5mb3JtYXQoIiVzIFtvcHRpb25zXSA8ZmlsZW5hbWU+IFs8ZmlsZW5hbWU+XSoiLCBUT09MX05BTUUpOwotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBoZWFkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgaGVhZGVyLmFwcGVuZCgiLS1cbiIpOwotICAgICAgICAgICAgaGVhZGVyLmFwcGVuZCgiU3BsaXQgdGhlIHByb3ZpZGVkIHNzdGFibGVzIGZpbGVzIGluIHNzdGFibGVzIG9mIG1heGltdW0gcHJvdmlkZWQgZmlsZSBzaXplIChzZWUgb3B0aW9uIC0tIiArIFNJWkVfT1BUSU9OICsgIikuIiApOwotICAgICAgICAgICAgaGVhZGVyLmFwcGVuZCgiXG4tLVxuIik7Ci0gICAgICAgICAgICBoZWFkZXIuYXBwZW5kKCJPcHRpb25zIGFyZToiKTsKLSAgICAgICAgICAgIG5ldyBIZWxwRm9ybWF0dGVyKCkucHJpbnRIZWxwKHVzYWdlLCBoZWFkZXIudG9TdHJpbmcoKSwgb3B0aW9ucywgIiIpOworICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9ICItLVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNwbGl0IHRoZSBwcm92aWRlZCBzc3RhYmxlcyBmaWxlcyBpbiBzc3RhYmxlcyBvZiBtYXhpbXVtIHByb3ZpZGVkIGZpbGUgc2l6ZSAoc2VlIG9wdGlvbiAtLSIgKyBTSVpFX09QVElPTiArICIpLiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbi0tXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3B0aW9ucyBhcmU6IjsKKyAgICAgICAgICAgIG5ldyBIZWxwRm9ybWF0dGVyKCkucHJpbnRIZWxwKHVzYWdlLCBoZWFkZXIsIG9wdGlvbnMsICIiKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVVcGdyYWRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVVwZ3JhZGVyLmphdmEKaW5kZXggYTdjMDk5Yy4uMTAwOWMzZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVVwZ3JhZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVVwZ3JhZGVyLmphdmEKQEAgLTE3LDEwICsxNywxNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzOwogCi1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNsaS5Db21tYW5kTGluZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLkNvbW1hbmRMaW5lUGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuR251UGFyc2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jbGkuSGVscEZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLlBhcnNlRXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKQEAgLTMwLDEzICszNywxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlVwZ3JhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9VVElMX0FMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNUOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5CdWxrTG9hZGVyLkNtZExpbmVPcHRpb25zOwogCiBwdWJsaWMgY2xhc3MgU3RhbmRhbG9uZVVwZ3JhZGVyCkBAIC00OSw3ICs1Nyw3IEBACiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkKICAgICB7CiAgICAgICAgIE9wdGlvbnMgb3B0aW9ucyA9IE9wdGlvbnMucGFyc2VBcmdzKGFyZ3MpOwotICAgICAgICBpZiAoQm9vbGVhbi5nZXRCb29sZWFuKFV0aWwuQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QpKQorICAgICAgICBpZiAoVEVTVF9VVElMX0FMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNULmdldEJvb2xlYW4oKSkKICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci50b29sSW5pdGlhbGl6YXRpb24oZmFsc2UpOyAvL05lY2Vzc2FyeSBmb3IgdGVzdGluZwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBVdGlsLmluaXREYXRhYmFzZURlc2NyaXB0b3IoKTsKQEAgLTgwLDEzICs4OCwxMyBAQAogICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8RGVzY3JpcHRvciwgU2V0PENvbXBvbmVudD4+IGVudHJ5IDogbGlzdGVyLnNvcnRlZExpc3QoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LkRBVEEpIHx8ICFjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkKKyAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnNBbGwoZW50cnkuZ2V0S2V5KCkuZ2V0Rm9ybWF0KCkucHJpbWFyeUNvbXBvbmVudHMoKSkpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24oZW50cnkuZ2V0S2V5KCksIGNvbXBvbmVudHMsIGNmcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbi5lcXVhbHMoU1NUYWJsZUZvcm1hdC5UeXBlLmN1cnJlbnQoKS5pbmZvLmdldExhdGVzdFZlcnNpb24oKSkpCisgICAgICAgICAgICAgICAgICAgIGlmIChzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbi5lcXVhbHMoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpLmdldExhdGVzdFZlcnNpb24oKSkpCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuc2VsZlJlZigpLnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVZlcmlmaWVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lVmVyaWZpZXIuamF2YQppbmRleCBkNzU1NGRkLi41NDdhMWUwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lVmVyaWZpZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lVmVyaWZpZXIuamF2YQpAQCAtMzksMTcgKzM5LDE5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlZlcmlmaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JVmVyaWZpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpWTVN0YWJpbGl0eUluc3BlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1Q7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLkJ1bGtMb2FkZXIuQ21kTGluZU9wdGlvbnM7CiAKIHB1YmxpYyBjbGFzcyBTdGFuZGFsb25lVmVyaWZpZXIKQEAgLTc4LDYgKzgwLDggQEAKIAogICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInNzdGFibGV2ZXJpZnkgdXNpbmcgdGhlIGZvbGxvd2luZyBvcHRpb25zOiAiICsgb3B0aW9ucyk7CiAKKyAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBpbnQgZXhpdENvZGUgPSAwOwogICAgICAgICB0cnkKICAgICAgICAgewogICAgICAgICAgICAgLy8gbG9hZCBrZXlzcGFjZSBkZXNjcmlwdGlvbnMuCkBAIC05NywxMyArMTAxLDExIEBACiAgICAgICAgICAgICBPdXRwdXRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgT3V0cHV0SGFuZGxlci5TeXN0ZW1PdXRwdXQob3B0aW9ucy52ZXJib3NlLCBvcHRpb25zLmRlYnVnKTsKICAgICAgICAgICAgIERpcmVjdG9yaWVzLlNTVGFibGVMaXN0ZXIgbGlzdGVyID0gY2ZzLmdldERpcmVjdG9yaWVzKCkuc3N0YWJsZUxpc3RlcihEaXJlY3Rvcmllcy5PblR4bkVyci5USFJPVykuc2tpcFRlbXBvcmFyeSh0cnVlKTsKIAotICAgICAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCiAgICAgICAgICAgICAvLyBWZXJpZnkgc3N0YWJsZXMKICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PERlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+PiBlbnRyeSA6IGxpc3Rlci5saXN0KCkuZW50cnlTZXQoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LkRBVEEpIHx8ICFjb21wb25lbnRzLmNvbnRhaW5zKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkKKyAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnNBbGwoZW50cnkuZ2V0S2V5KCkuZ2V0Rm9ybWF0KCkucHJpbWFyeUNvbXBvbmVudHMoKSkpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgICAgICAgICAgdHJ5CkBAIC0xMTcsNDUgKzExOSw1NiBAQAogICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oU3RyaW5nLmZvcm1hdCgiRXJyb3IgTG9hZGluZyAlczogJXMiLCBlbnRyeS5nZXRLZXkoKSwgZS5nZXRNZXNzYWdlKCkpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVidWcpCiAgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIGV4aXRDb2RlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFZlcmlmaWVyLk9wdGlvbnMgdmVyaWZ5T3B0aW9ucyA9IFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeShmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leHRlbmRlZFZlcmlmaWNhdGlvbihvcHRpb25zLmV4dGVuZGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNoZWNrVmVyc2lvbihvcHRpb25zLmNoZWNrVmVyc2lvbikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tdXRhdGVSZXBhaXJTdGF0dXMob3B0aW9ucy5tdXRhdGVSZXBhaXJTdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hlY2tPd25zVG9rZW5zKCFvcHRpb25zLnRva2Vucy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9rZW5Mb29rdXAoaWdub3JlIC0+IG9wdGlvbnMudG9rZW5zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICBJVmVyaWZpZXIuT3B0aW9ucyB2ZXJpZnlPcHRpb25zID0gSVZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeShmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0ZW5kZWRWZXJpZmljYXRpb24ob3B0aW9ucy5leHRlbmRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2hlY2tWZXJzaW9uKG9wdGlvbnMuY2hlY2tWZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tdXRhdGVSZXBhaXJTdGF0dXMob3B0aW9ucy5tdXRhdGVSZXBhaXJTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNoZWNrT3duc1Rva2Vucyghb3B0aW9ucy50b2tlbnMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b2tlbkxvb2t1cChpZ25vcmUgLT4gb3B0aW9ucy50b2tlbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgICAgICAgICBoYW5kbGVyLm91dHB1dCgiUnVubmluZyB2ZXJpZmllciB3aXRoIHRoZSBmb2xsb3dpbmcgb3B0aW9uczogIiArIHZlcmlmeU9wdGlvbnMpOwogICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgaGFuZGxlciwgdHJ1ZSwgdmVyaWZ5T3B0aW9ucykpCisgICAgICAgICAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgaGFuZGxlciwgdHJ1ZSwgdmVyaWZ5T3B0aW9ucykpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlci53YXJuKFN0cmluZy5mb3JtYXQoIkVycm9yIHZlcmlmeWluZyAlczogJXMiLCBzc3RhYmxlLCBlLmdldE1lc3NhZ2UoKSksIGUpOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLndhcm4oZSwgU3RyaW5nLmZvcm1hdCgiRXJyb3IgdmVyaWZ5aW5nICVzOiAlcyIsIHNzdGFibGUsIGUuZ2V0TWVzc2FnZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIGhhc0ZhaWxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5maW5pc2hDb21wYWN0aW9uc0FuZFNodXRkb3duKDUsIFRpbWVVbml0Lk1JTlVURVMpOwogCi0gICAgICAgICAgICBTeXN0ZW0uZXhpdCggaGFzRmFpbGVkID8gMSA6IDAgKTsgLy8gV2UgbmVlZCB0aGF0IHRvIHN0b3Agbm9uIGRhZW1vbml6ZWQgdGhyZWFkcworICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHJlYWRlciA6IHNzdGFibGVzKQorICAgICAgICAgICAgICAgIFRocm93YWJsZXMucGVyZm9ybSgoVGhyb3dhYmxlKSBudWxsLCAoKSAtPiByZWFkZXIuc2VsZlJlZigpLmNsb3NlKCkpOworCisgICAgICAgICAgICBleGl0Q29kZSA9IGhhc0ZhaWxlZCA/IDEgOiAwOyAvLyBXZSBuZWVkIHRoYXQgdG8gc3RvcCBub24gZGFlbW9uaXplZCB0aHJlYWRzCiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICB7CiAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVidWcpCiAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgIGV4aXRDb2RlID0gMTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciByZWFkZXIgOiBzc3RhYmxlcykKKyAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnBlcmZvcm0oKFRocm93YWJsZSkgbnVsbCwgKCkgLT4gcmVhZGVyLnNlbGZSZWYoKS5jbG9zZSgpKTsKKworICAgICAgICAgICAgU3lzdGVtLmV4aXQoZXhpdENvZGUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0RGF0YWJhc2VEZXNjcmlwdG9yRm9yVG9vbCgpIHsKLSAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbihVdGlsLkFMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNUKSkKKyAgICAgICAgaWYgKFRFU1RfVVRJTF9BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVC5nZXRCb29sZWFuKCkpCiAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IudG9vbEluaXRpYWxpemF0aW9uKGZhbHNlKTsgLy9OZWNlc3NhcnkgZm9yIHRlc3RpbmcKICAgICAgICAgZWxzZQogICAgICAgICAgICAgVXRpbC5pbml0RGF0YWJhc2VEZXNjcmlwdG9yKCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9VdGlsLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9VdGlsLmphdmEKaW5kZXggMzc1Nzc1NC4uOGEyNTRlMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVXRpbC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1V0aWwuamF2YQpAQCAtMTgsMjIgKzE4LDIyIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKIGltcG9ydCBqYXZhLnV0aWwuU3BsaXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLlNwbGl0ZXJhdG9yczsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Mb25nRnVuY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CisKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29sdW1uSWRlbnRpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwpAQCAtNDEsMjAgKzQxLDE4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU3RhdHNDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnN0cmVhbWhpc3QuVG9tYnN0b25lSGlzdG9ncmFtOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5TdHJpbmdzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OwogCiBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKIHB1YmxpYyBmaW5hbCBjbGFzcyBVdGlsCiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QgPSBVdGlsLmNsYXNzLmdldE5hbWUoKSArICJBTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVCI7IC8vIE5lY2Vzc2FyeSBmb3IgdGVzdGluZwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTRVQgPSAiXHUwMDFCWzBtIjsKICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEJMVUUgPSAiXHUwMDFCWzM0bSI7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDWUFOID0gIlx1MDAxQlszNm0iOwpAQCAtMzEwLDEyICszMDgsMTEgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGFGcm9tU1NUYWJsZShEZXNjcmlwdG9yIGRlc2MpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgaWYgKGRlc2MudmVyc2lvbi5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKCJtYSIpIDwgMCkKLSAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigicHJlLTMuMCBTU1RhYmxlIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgIGlmICghZGVzYy52ZXJzaW9uLmlzQ29tcGF0aWJsZSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBTU1RhYmxlIHZlcnNpb24gIiArIGRlc2MuZ2V0Rm9ybWF0KCkubmFtZSgpICsgIi8iICsgZGVzYy52ZXJzaW9uKTsKIAotICAgICAgICBFbnVtU2V0PE1ldGFkYXRhVHlwZT4gdHlwZXMgPSBFbnVtU2V0Lm9mKE1ldGFkYXRhVHlwZS5TVEFUUywgTWV0YWRhdGFUeXBlLkhFQURFUik7Ci0gICAgICAgIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBzc3RhYmxlTWV0YWRhdGEgPSBkZXNjLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLmRlc2VyaWFsaXplKGRlc2MsIHR5cGVzKTsKLSAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5Db21wb25lbnQgaGVhZGVyID0gKFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50KSBzc3RhYmxlTWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5IRUFERVIpOworICAgICAgICBTdGF0c0NvbXBvbmVudCBzdGF0c0NvbXBvbmVudCA9IFN0YXRzQ29tcG9uZW50LmxvYWQoZGVzYywgTWV0YWRhdGFUeXBlLlNUQVRTLCBNZXRhZGF0YVR5cGUuSEVBREVSKTsKKyAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5Db21wb25lbnQgaGVhZGVyID0gc3RhdHNDb21wb25lbnQuc2VyaWFsaXphdGlvbkhlYWRlcigpOwogCiAgICAgICAgIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IEZCVXRpbGl0aWVzLm5ld1BhcnRpdGlvbmVyKGRlc2MpOwogCkBAIC0zMzcsNCArMzM0LDQgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9Cb290c3RyYXBSZXN1bWUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0Jvb3RzdHJhcFJlc3VtZS5qYXZhCmluZGV4IGIwMDU4MTguLmE1NWNkZWQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0Jvb3RzdHJhcFJlc3VtZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0Jvb3RzdHJhcFJlc3VtZS5qYXZhCkBAIC0yMiwxNyArMjIsMjcgQEAKIGltcG9ydCBqYXZhLmlvLklPRXJyb3I7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAoraW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5PcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuTm9kZVByb2JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLk5vZGVUb29sLk5vZGVUb29sQ21kOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTOworCiBAQ29tbWFuZChuYW1lID0gInJlc3VtZSIsIGRlc2NyaXB0aW9uID0gIlJlc3VtZSBib290c3RyYXAgc3RyZWFtaW5nIikKIHB1YmxpYyBjbGFzcyBCb290c3RyYXBSZXN1bWUgZXh0ZW5kcyBOb2RlVG9vbENtZAogeworICAgIEBPcHRpb24odGl0bGUgPSAiZm9yY2UiLAorICAgICAgICAgICAgbmFtZSA9IHsgIi1mIiwgIi0tZm9yY2UifSwKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIlVzZSAtLWZvcmNlIHRvIHJlc3VtZSBib290c3RyYXAgcmVnYXJkbGVzcyBvZiBjYXNzYW5kcmEucmVzZXRfYm9vdHN0cmFwX3Byb2dyZXNzIGVudmlyb25tZW50IHZhcmlhYmxlLiBXQVJOSU5HOiBUaGlzIGlzIHBvdGVudGlhbGx5IGRhbmdlcm91cywgc2VlIENBU1NBTkRSQS0xNzY3OSIpCisgICAgYm9vbGVhbiBmb3JjZSA9IGZhbHNlOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShOb2RlUHJvYmUgcHJvYmUpCiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgeworICAgICAgICAgICAgaWYgKCghUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTLmlzUHJlc2VudCgpIHx8IFJFU0VUX0JPT1RTVFJBUF9QUk9HUkVTUy5nZXRCb29sZWFuKCkpICYmICFmb3JjZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiJ25vZGV0b29sIGJvb3RzdHJhcCByZXN1bWUnIGlzIGRpc2FibGVkLiIpOwogICAgICAgICAgICAgcHJvYmUucmVzdW1lQm9vdHN0cmFwKHByb2JlLm91dHB1dCgpLm91dCk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9DbGVhclNuYXBzaG90LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9DbGVhclNuYXBzaG90LmphdmEKaW5kZXggZmI2OWIyNS4uODY2Yjg1ZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ2xlYXJTbmFwc2hvdC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0NsZWFyU25hcHNob3QuamF2YQpAQCAtMjUsOSArMjUsMTQgQEAKIGltcG9ydCBpby5haXJsaWZ0LmFpcmxpbmUuT3B0aW9uOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKK2ltcG9ydCBqYXZhLnRpbWUuZm9ybWF0LkRhdGVUaW1lUGFyc2VFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ob2RlUHJvYmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuTm9kZVRvb2wuTm9kZVRvb2xDbWQ7CiAKQEAgLTQzLDE0ICs0OCw0NSBAQAogICAgIEBPcHRpb24odGl0bGUgPSAiY2xlYXJfYWxsX3NuYXBzaG90cyIsIG5hbWUgPSAiLS1hbGwiLCBkZXNjcmlwdGlvbiA9ICJSZW1vdmVzIGFsbCBzbmFwc2hvdHMiKQogICAgIHByaXZhdGUgYm9vbGVhbiBjbGVhckFsbFNuYXBzaG90cyA9IGZhbHNlOwogCisgICAgQE9wdGlvbih0aXRsZSA9ICJvbGRlcl90aGFuIiwgbmFtZSA9ICItLW9sZGVyLXRoYW4iLCBkZXNjcmlwdGlvbiA9ICJDbGVhciBzbmFwc2hvdHMgb2xkZXIgdGhhbiBzcGVjaWZpZWQgdGltZSBwZXJpb2QuIikKKyAgICBwcml2YXRlIFN0cmluZyBvbGRlclRoYW47CisKKyAgICBAT3B0aW9uKHRpdGxlID0gIm9sZGVyX3RoYW5fdGltZXN0YW1wIiwgbmFtZSA9ICItLW9sZGVyLXRoYW4tdGltZXN0YW1wIiwKKyAgICBkZXNjcmlwdGlvbiA9ICJDbGVhciBzbmFwc2hvdHMgb2xkZXIgdGhhbiBzcGVjaWZpZWQgdGltZXN0YW1wLiBJdCBoYXMgdG8gYmUgYSBzdHJpbmcgaW4gSVNPIGZvcm1hdCwgZm9yIGV4YW1wbGUgJzIwMjItMTItMDNUMTA6MTU6MzBaJyIpCisgICAgcHJpdmF0ZSBTdHJpbmcgb2xkZXJUaGFuVGltZXN0YW1wOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShOb2RlUHJvYmUgcHJvYmUpCiAgICAgewotICAgICAgICBpZihzbmFwc2hvdE5hbWUuaXNFbXB0eSgpICYmICFjbGVhckFsbFNuYXBzaG90cykKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTcGVjaWZ5IHNuYXBzaG90IG5hbWUgb3IgLS1hbGwiKTsKKyAgICAgICAgaWYgKHNuYXBzaG90TmFtZS5pc0VtcHR5KCkgJiYgIWNsZWFyQWxsU25hcHNob3RzKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3BlY2lmeSBzbmFwc2hvdCBuYW1lIG9yIC0tYWxsIik7CiAKLSAgICAgICAgaWYoIXNuYXBzaG90TmFtZS5pc0VtcHR5KCkgJiYgY2xlYXJBbGxTbmFwc2hvdHMpCi0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU3BlY2lmeSBvbmx5IG9uZSBvZiBzbmFwc2hvdCBuYW1lIG9yIC0tYWxsIik7CisgICAgICAgIGlmICghc25hcHNob3ROYW1lLmlzRW1wdHkoKSAmJiBjbGVhckFsbFNuYXBzaG90cykKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNwZWNpZnkgb25seSBvbmUgb2Ygc25hcHNob3QgbmFtZSBvciAtLWFsbCIpOworCisgICAgICAgIGlmIChvbGRlclRoYW4gIT0gbnVsbCAmJiBvbGRlclRoYW5UaW1lc3RhbXAgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNwZWNpZnkgb25seSBvbmUgb2YgLS1vbGRlci10aGFuIG9yIC0tb2xkZXItdGhhbi10aW1lc3RhbXAiKTsKKworICAgICAgICBpZiAoIXNuYXBzaG90TmFtZS5pc0VtcHR5KCkgJiYgb2xkZXJUaGFuICE9IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTcGVjaWZ5aW5nIHNuYXBzaG90IG5hbWUgdG9nZXRoZXIgd2l0aCAtLW9sZGVyLXRoYW4gZmxhZyBpcyBub3QgYWxsb3dlZCIpOworCisgICAgICAgIGlmICghc25hcHNob3ROYW1lLmlzRW1wdHkoKSAmJiBvbGRlclRoYW5UaW1lc3RhbXAgIT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNwZWNpZnlpbmcgc25hcHNob3QgbmFtZSB0b2dldGhlciB3aXRoIC0tb2xkZXItdGhhbi10aW1lc3RhbXAgZmxhZyBpcyBub3QgYWxsb3dlZCIpOworCisgICAgICAgIGlmIChvbGRlclRoYW5UaW1lc3RhbXAgIT0gbnVsbCkKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluc3RhbnQucGFyc2Uob2xkZXJUaGFuVGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChEYXRlVGltZVBhcnNlRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhcmFtZXRlciAtLW9sZGVyLXRoYW4tdGltZXN0YW1wIGhhcyB0byBiZSBhIHZhbGlkIGluc3RhbnQgaW4gSVNPIGZvcm1hdC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBMb25nIG9sZGVyVGhhbkluU2Vjb25kcyA9IG51bGw7CisgICAgICAgIGlmIChvbGRlclRoYW4gIT0gbnVsbCkKKyAgICAgICAgICAgIC8vIGZhaWwgZmFzdCB3aGVuIGl0IGlzIG5vdCB2YWxpZAorICAgICAgICAgICAgb2xkZXJUaGFuSW5TZWNvbmRzID0gbmV3IER1cmF0aW9uU3BlYy5Mb25nU2Vjb25kc0JvdW5kKG9sZGVyVGhhbikudG9TZWNvbmRzKCk7CiAKICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAKQEAgLTU5LDE4ICs5NSwzMiBAQAogICAgICAgICBpZiAoa2V5c3BhY2VzLmlzRW1wdHkoKSkKICAgICAgICAgICAgIHNiLmFwcGVuZCgiW2FsbCBrZXlzcGFjZXNdIik7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiWyIpLmFwcGVuZChqb2luKGtleXNwYWNlcywgIiwgIikpLmFwcGVuZCgiXSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKCdbJykuYXBwZW5kKGpvaW4oa2V5c3BhY2VzLCAiLCAiKSkuYXBwZW5kKCddJyk7CiAKICAgICAgICAgaWYgKHNuYXBzaG90TmFtZS5pc0VtcHR5KCkpCiAgICAgICAgICAgICBzYi5hcHBlbmQoIiB3aXRoIFthbGwgc25hcHNob3RzXSIpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICBzYi5hcHBlbmQoIiB3aXRoIHNuYXBzaG90IG5hbWUgWyIpLmFwcGVuZChzbmFwc2hvdE5hbWUpLmFwcGVuZCgiXSIpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgd2l0aCBzbmFwc2hvdCBuYW1lIFsiKS5hcHBlbmQoc25hcHNob3ROYW1lKS5hcHBlbmQoJ10nKTsKIAotICAgICAgICBwcm9iZS5vdXRwdXQoKS5vdXQucHJpbnRsbihzYi50b1N0cmluZygpKTsKKyAgICAgICAgaWYgKG9sZGVyVGhhbkluU2Vjb25kcyAhPSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgb2xkZXIgdGhhbiAiKQorICAgICAgICAgICAgICAuYXBwZW5kKG9sZGVyVGhhbkluU2Vjb25kcykKKyAgICAgICAgICAgICAgLmFwcGVuZCgiIHNlY29uZHMuIik7CisKKyAgICAgICAgaWYgKG9sZGVyVGhhblRpbWVzdGFtcCAhPSBudWxsKQorICAgICAgICAgICAgc2IuYXBwZW5kKCIgb2xkZXIgdGhhbiB0aW1lc3RhbXAgIikuYXBwZW5kKG9sZGVyVGhhblRpbWVzdGFtcCk7CisKKyAgICAgICAgcHJvYmUub3V0cHV0KCkub3V0LnByaW50bG4oc2IpOwogCiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBwcm9iZS5jbGVhclNuYXBzaG90KHNuYXBzaG90TmFtZSwgdG9BcnJheShrZXlzcGFjZXMsIFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgaWYgKG9sZGVyVGhhbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KCJvbGRlcl90aGFuIiwgb2xkZXJUaGFuKTsKKyAgICAgICAgICAgIGlmIChvbGRlclRoYW5UaW1lc3RhbXAgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dCgib2xkZXJfdGhhbl90aW1lc3RhbXAiLCBvbGRlclRoYW5UaW1lc3RhbXApOworCisgICAgICAgICAgICBwcm9iZS5jbGVhclNuYXBzaG90KHBhcmFtZXRlcnMsIHNuYXBzaG90TmFtZSwgdG9BcnJheShrZXlzcGFjZXMsIFN0cmluZy5jbGFzcykpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKQogICAgICAgICB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGNsZWFyaW5nIHNuYXBzaG90cyIsIGUpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ29tcGFjdGlvblN0YXRzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9Db21wYWN0aW9uU3RhdHMuamF2YQppbmRleCA3OTllZjU2Li5hZWRjOGYyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9Db21wYWN0aW9uU3RhdHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9Db21wYWN0aW9uU3RhdHMuamF2YQpAQCAtOTEsNyArOTEsNyBAQAogICAgICAgICAgICAgVGFibGVCdWlsZGVyIHRhYmxlID0gbmV3IFRhYmxlQnVpbGRlcigpOwogCiAgICAgICAgICAgICBpZiAodnRhYmxlT3V0cHV0KQotICAgICAgICAgICAgICAgIHRhYmxlLmFkZCgia2V5c3BhY2UiLCAidGFibGUiLCAidGFzayBpZCIsICJjb21wbGV0aW9uIHJhdGlvIiwgImtpbmQiLCAicHJvZ3Jlc3MiLCAic3N0YWJsZXMiLCAidG90YWwiLCAidW5pdCIpOworICAgICAgICAgICAgICAgIHRhYmxlLmFkZCgia2V5c3BhY2UiLCAidGFibGUiLCAidGFzayBpZCIsICJjb21wbGV0aW9uIHJhdGlvIiwgImtpbmQiLCAicHJvZ3Jlc3MiLCAic3N0YWJsZXMiLCAidG90YWwiLCAidW5pdCIsICJ0YXJnZXQgZGlyZWN0b3J5Iik7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgdGFibGUuYWRkKCJpZCIsICJjb21wYWN0aW9uIHR5cGUiLCAia2V5c3BhY2UiLCAidGFibGUiLCAiY29tcGxldGVkIiwgInRvdGFsIiwgInVuaXQiLCAicHJvZ3Jlc3MiKTsKIApAQCAtMTEwLDcgKzExMCwxMCBAQAogICAgICAgICAgICAgICAgIFN0cmluZyBwZXJjZW50Q29tcGxldGUgPSB0b3RhbCA9PSAwID8gIm4vYSIgOiBuZXcgRGVjaW1hbEZvcm1hdCgiMC4wMCIpLmZvcm1hdCgoZG91YmxlKSBjb21wbGV0ZWQgLyB0b3RhbCAqIDEwMCkgKyAiJSI7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gYy5nZXQoQ29tcGFjdGlvbkluZm8uQ09NUEFDVElPTl9JRCk7CiAgICAgICAgICAgICAgICAgaWYgKHZ0YWJsZU91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgdGFibGUuYWRkKGtleXNwYWNlLCBjb2x1bW5GYW1pbHksIGlkLCBwZXJjZW50Q29tcGxldGUsIHRhc2tUeXBlLCBwcm9ncmVzc1N0ciwgU3RyaW5nLnZhbHVlT2YodGFibGVzLmxlbmd0aCksIHRvdGFsU3RyLCB1bml0KTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXJnZXREaXJlY3RvcnkgPSBjLmdldChDb21wYWN0aW9uSW5mby5UQVJHRVRfRElSRUNUT1JZKTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuYWRkKGtleXNwYWNlLCBjb2x1bW5GYW1pbHksIGlkLCBwZXJjZW50Q29tcGxldGUsIHRhc2tUeXBlLCBwcm9ncmVzc1N0ciwgU3RyaW5nLnZhbHVlT2YodGFibGVzLmxlbmd0aCksIHRvdGFsU3RyLCB1bml0LCB0YXJnZXREaXJlY3RvcnkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmFkZChpZCwgdGFza1R5cGUsIGtleXNwYWNlLCBjb2x1bW5GYW1pbHksIHByb2dyZXNzU3RyLCB0b3RhbFN0ciwgdW5pdCwgcGVyY2VudENvbXBsZXRlKTsKIApAQCAtMTI4LDQgKzEzMSw0IEBACiAgICAgICAgIH0KICAgICB9CiAKLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9EZXNjcmliZUNsdXN0ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0Rlc2NyaWJlQ2x1c3Rlci5qYXZhCmluZGV4IDMzYTBhNGQuLmY4NTVlNjIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0Rlc2NyaWJlQ2x1c3Rlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0Rlc2NyaWJlQ2x1c3Rlci5qYXZhCkBAIC0zMiw4ICszMiw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuTm9kZVRvb2w7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuTm9kZVRvb2wuTm9kZVRvb2xDbWQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7Ci0KIEBDb21tYW5kKG5hbWUgPSAiZGVzY3JpYmVjbHVzdGVyIiwgZGVzY3JpcHRpb24gPSAiUHJpbnQgdGhlIG5hbWUsIHNuaXRjaCwgcGFydGl0aW9uZXIgYW5kIHNjaGVtYSB2ZXJzaW9uIG9mIGEgY2x1c3RlciIpCiBwdWJsaWMgY2xhc3MgRGVzY3JpYmVDbHVzdGVyIGV4dGVuZHMgTm9kZVRvb2xDbWQKIHsKQEAgLTYyLDkgKzYwLDkgQEAKICAgICAgICAgLy8gZGlzcGxheSBzY2hlbWEgdmVyc2lvbiBmb3IgZWFjaCBub2RlCiAgICAgICAgIG91dC5wcmludGxuKCJcdFNjaGVtYSB2ZXJzaW9uczoiKTsKICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBzY2hlbWFWZXJzaW9ucyA9IHByaW50UG9ydCA/IHByb2JlLmdldFNwUHJveHkoKS5nZXRTY2hlbWFWZXJzaW9uc1dpdGhQb3J0KCkgOiBwcm9iZS5nZXRTcFByb3h5KCkuZ2V0U2NoZW1hVmVyc2lvbnMoKTsKLSAgICAgICAgZm9yIChTdHJpbmcgdmVyc2lvbiA6IHNjaGVtYVZlcnNpb25zLmtleVNldCgpKQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBzY2hlbWFWZXJzaW9ucy5lbnRyeVNldCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihmb3JtYXQoIlx0XHQlczogJXMlbiIsIHZlcnNpb24sIHNjaGVtYVZlcnNpb25zLmdldCh2ZXJzaW9uKSkpOworICAgICAgICAgICAgb3V0LnByaW50ZigiXHRcdCVzOiAlcyVuJW4iLCBlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBDb2xsZWN0IHN0YXR1cyBpbmZvcm1hdGlvbiBvZiBhbGwgbm9kZXMKQEAgLTg2LDYgKzg0LDcgQEAKICAgICAgICAgb3V0LnByaW50bG4oIlx0VW5yZWFjaGFibGU6ICIgKyB1bnJlYWNoYWJsZU5vZGVzLnNpemUoKSk7CiAKICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiB0b2tlbnNUb0VuZHBvaW50cyA9IHByb2JlLmdldFRva2VuVG9FbmRwb2ludE1hcCh3aXRoUG9ydCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgZXJyb3JzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgTWFwPFN0cmluZywgRmxvYXQ+IG93bmVyc2hpcHMgPSBudWxsOwogICAgICAgICB0cnkKICAgICAgICAgewpAQCAtOTMsMTIgKzkyLDIwIEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkKICAgICAgICAgewotICAgICAgICAgICAgb3duZXJzaGlwcyA9IHByb2JlLmdldE93bmVyc2hpcFdpdGhQb3J0KCk7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigiRXJyb3I6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3duZXJzaGlwcyA9IHByb2JlLmdldE93bmVyc2hpcFdpdGhQb3J0KCk7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiTm90ZTogIikuYXBwZW5kKGV4LmdldE1lc3NhZ2UoKSkuYXBwZW5kKCIlbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG91dC5wcmludGYoIiVuRXJyb3I6ICVzJW4iLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkKICAgICAgICAgewotICAgICAgICAgICAgb3V0LnByaW50bG4oIiVuRXJyb3I6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgb3V0LnByaW50ZigiJW5FcnJvcjogJXMlbiIsIGV4LmdldE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKICAgICAgICAgfQogCkBAIC0xMDcsNyArMTE0LDcgQEAKICAgICAgICAgb3V0LnByaW50bG4oIlxuRGF0YSBDZW50ZXJzOiAiKTsKICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTZXRIb3N0U3RhdFdpdGhQb3J0PiBkYyA6IGRjcy5lbnRyeVNldCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnQoIlx0IiArIGRjLmdldEtleSgpKTsKKyAgICAgICAgICAgIG91dC5wcmludCgnXHQnICsgZGMuZ2V0S2V5KCkpOwogCiAgICAgICAgICAgICBBcnJheUxpc3RNdWx0aW1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIEhvc3RTdGF0V2l0aFBvcnQ+IGhvc3RUb1Rva2VucyA9IEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZSgpOwogICAgICAgICAgICAgZm9yIChIb3N0U3RhdFdpdGhQb3J0IHN0YXQgOiBkYy5nZXRWYWx1ZSgpKQpAQCAtMTI5LDkgKzEzNiw5IEBACiAgICAgICAgIC8vIGRpc3BsYXkgZGF0YWJhc2UgdmVyc2lvbiBmb3IgZWFjaCBub2RlCiAgICAgICAgIG91dC5wcmludGxuKCJcbkRhdGFiYXNlIHZlcnNpb25zOiIpOwogICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGRhdGFiYXNlVmVyc2lvbnMgPSBwcm9iZS5nZXRHb3NzUHJveHkoKS5nZXRSZWxlYXNlVmVyc2lvbnNXaXRoUG9ydCgpOwotICAgICAgICBmb3IgKFN0cmluZyB2ZXJzaW9uIDogZGF0YWJhc2VWZXJzaW9ucy5rZXlTZXQoKSkKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogZGF0YWJhc2VWZXJzaW9ucy5lbnRyeVNldCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihmb3JtYXQoIlx0JXM6ICVzJW4iLCB2ZXJzaW9uLCBkYXRhYmFzZVZlcnNpb25zLmdldCh2ZXJzaW9uKSkpOworICAgICAgICAgICAgb3V0LnByaW50ZigiXHQlczogJXMlbiVuIiwgZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwogICAgICAgICB9CiAKICAgICAgICAgb3V0LnByaW50bG4oIktleXNwYWNlczoiKTsKQEAgLTE0Miw3ICsxNDksMTAgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigic29tZXRoaW5nIHdlbnQgd3JvbmcgZm9yIGtleXNwYWNlOiAiICsga2V5c3BhY2VOYW1lKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dC5wcmludGxuKCJcdCIgKyBrZXlzcGFjZU5hbWUgKyAiIC0+IFJlcGxpY2F0aW9uIGNsYXNzOiAiICsgcmVwbGljYXRpb25JbmZvKTsKKyAgICAgICAgICAgIG91dC5wcmludGYoIlx0JXMgLT4gUmVwbGljYXRpb24gY2xhc3M6ICVzJW4iLCBrZXlzcGFjZU5hbWUsIHJlcGxpY2F0aW9uSW5mbyk7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCgpICE9IDApCisgICAgICAgICAgICBvdXQucHJpbnRmKCIlbiIgKyBlcnJvcnMpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ZvcmNlQ29tcGFjdC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvRm9yY2VDb21wYWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkyNjVlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ZvcmNlQ29tcGFjdC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMubm9kZXRvb2w7CisKK2ltcG9ydCBpby5haXJsaWZ0LmFpcmxpbmUuQXJndW1lbnRzOworaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5Db21tYW5kOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLk5vZGVQcm9iZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ob2RlVG9vbC5Ob2RlVG9vbENtZDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudDsKKworQENvbW1hbmQobmFtZSA9ICJmb3JjZWNvbXBhY3QiLCBkZXNjcmlwdGlvbiA9ICJGb3JjZSBhIChtYWpvcikgY29tcGFjdGlvbiBvbiBhIHRhYmxlIikKK3B1YmxpYyBjbGFzcyBGb3JjZUNvbXBhY3QgZXh0ZW5kcyBOb2RlVG9vbENtZAoreworICAgIEBBcmd1bWVudHModXNhZ2UgPSAiWzxrZXlzcGFjZT4gPHRhYmxlPiA8a2V5cz5dIiwgZGVzY3JpcHRpb24gPSAiVGhlIGtleXNwYWNlLCB0YWJsZSwgYW5kIGEgbGlzdCBvZiBwYXJ0aXRpb24ga2V5cyBpZ25vcmluZyB0aGUgZ2NfZ3JhY2Vfc2Vjb25kcyIpCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShOb2RlUHJvYmUgcHJvYmUpCisgICAgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgaW5wdXQgaGFzIHZhbGlkIHNpemUKKyAgICAgICAgY2hlY2tBcmd1bWVudChhcmdzLnNpemUoKSA+PSAzLCAiZm9yY2Vjb21wYWN0IHJlcXVpcmVzIGtleXNwYWNlLCB0YWJsZSBhbmQga2V5cyBhcmdzIik7CisKKyAgICAgICAgLy8gV2UgcmVseSBvbiBsb3dlci1sZXZlbCBBUElzIHRvIGNoZWNrIGFuZCB0aHJvdyBleGNlcHRpb25zIGlmIHRoZSBpbnB1dCBrZXlzcGFjZSBvciB0YWJsZSBuYW1lIGFyZSBpbnZhbGlkCisgICAgICAgIFN0cmluZyBrZXlzcGFjZU5hbWUgPSBhcmdzLmdldCgwKTsKKyAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSA9IGFyZ3MuZ2V0KDEpOworICAgICAgICBTdHJpbmdbXSBwYXJ0aXRpb25LZXlzSWdub3JlR2NHcmFjZSA9IHBhcnNlUGFydGl0aW9uS2V5cyhhcmdzKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcHJvYmUuZm9yY2VDb21wYWN0aW9uS2V5c0lnbm9yaW5nR2NHcmFjZShrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSwgcGFydGl0aW9uS2V5c0lnbm9yZUdjR3JhY2UpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIG9jY3VycmVkIGR1cmluZyBjb21wYWN0aW9uIGtleXMiLCBlKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9HZXRTU1RhYmxlcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvR2V0U1NUYWJsZXMuamF2YQppbmRleCBmMWUyMTE3Li42NTdlMGVjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9HZXRTU1RhYmxlcy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0dldFNTVGFibGVzLmphdmEKQEAgLTIzLDYgKzIzLDggQEAKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgaW8uYWlybGlmdC5haXJsaW5lLk9wdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ob2RlUHJvYmU7CkBAIC0zNiw2ICszOCw5IEBACiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIlNwZWNpZnkgdGhlIGtleSBpbiBoZXhhZGVjaW1hbCBzdHJpbmcgZm9ybWF0IikKICAgICBwcml2YXRlIGJvb2xlYW4gaGV4Rm9ybWF0ID0gZmFsc2U7CiAKKyAgICBAT3B0aW9uKG5hbWU9eyItbCIsICItLXNob3ctbGV2ZWxzIn0sIGRlc2NyaXB0aW9uPSJJZiB0aGUgdGFibGUgaXMgdXNpbmcgbGV2ZWxlZCBjb21wYWN0aW9uIHRoZSBsZXZlbCBvZiBlYWNoIHNzdGFibGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IChEZWZhdWx0OiBmYWxzZSkiKQorICAgIHByaXZhdGUgYm9vbGVhbiBzaG93TGV2ZWxzID0gZmFsc2U7CisKICAgICBAQXJndW1lbnRzKHVzYWdlID0gIjxrZXlzcGFjZT4gPGNmbmFtZT4gPGtleT4iLCBkZXNjcmlwdGlvbiA9ICJUaGUga2V5c3BhY2UsIHRoZSBjb2x1bW4gZmFtaWx5LCBhbmQgdGhlIGtleSIpCiAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCkBAIC00NywxMCArNTIsMTkgQEAKICAgICAgICAgU3RyaW5nIGNmID0gYXJncy5nZXQoMSk7CiAgICAgICAgIFN0cmluZyBrZXkgPSBhcmdzLmdldCgyKTsKIAotICAgICAgICBMaXN0PFN0cmluZz4gc3N0YWJsZXMgPSBwcm9iZS5nZXRTU1RhYmxlcyhrcywgY2YsIGtleSwgaGV4Rm9ybWF0KTsKLSAgICAgICAgZm9yIChTdHJpbmcgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICBpZiAoc2hvd0xldmVscyAmJiBwcm9iZS5pc0xldmVsZWRDb21wYWN0aW9uKGtzLCBjZikpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHByb2JlLm91dHB1dCgpLm91dC5wcmludGxuKHNzdGFibGUpOworICAgICAgICAgICAgTWFwPEludGVnZXIsIFNldDxTdHJpbmc+PiBzc3RhYmxlcyA9IHByb2JlLmdldFNTVGFibGVzV2l0aExldmVsKGtzLCBjZiwga2V5LCBoZXhGb3JtYXQpOworICAgICAgICAgICAgZm9yIChJbnRlZ2VyIGxldmVsIDogc3N0YWJsZXMua2V5U2V0KCkpCisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgc3N0YWJsZSA6IHNzdGFibGVzLmdldChsZXZlbCkpCisgICAgICAgICAgICAgICAgICAgIHByb2JlLm91dHB1dCgpLm91dC5wcmludGxuKGxldmVsICsgIjogIiArIHNzdGFibGUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHNzdGFibGVzID0gcHJvYmUuZ2V0U1NUYWJsZXMoa3MsIGNmLCBrZXksIGhleEZvcm1hdCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJvYmUub3V0cHV0KCkub3V0LnByaW50bG4oc3N0YWJsZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbmZvLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbmZvLmphdmEKaW5kZXggZGI3Mjc3ZS4uNWUwZDg3YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvSW5mby5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0luZm8uamF2YQpAQCAtNTEsNiArNTEsOCBAQAogICAgICAgICBvdXQucHJpbnRmKCIlLTIzczogJXMlbiIsICJHb3NzaXAgYWN0aXZlIiwgZ29zc2lwSW5pdGlhbGl6ZWQpOwogICAgICAgICBvdXQucHJpbnRmKCIlLTIzczogJXMlbiIsICJOYXRpdmUgVHJhbnNwb3J0IGFjdGl2ZSIsIHByb2JlLmlzTmF0aXZlVHJhbnNwb3J0UnVubmluZygpKTsKICAgICAgICAgb3V0LnByaW50ZigiJS0yM3M6ICVzJW4iLCAiTG9hZCIsIHByb2JlLmdldExvYWRTdHJpbmcoKSk7CisgICAgICAgIG91dC5wcmludGYoIiUtMjNzOiAlcyVuIiwgIlVuY29tcHJlc3NlZCBsb2FkIiwgcHJvYmUuZ2V0VW5jb21wcmVzc2VkTG9hZFN0cmluZygpKTsKKwogICAgICAgICBpZiAoZ29zc2lwSW5pdGlhbGl6ZWQpCiAgICAgICAgICAgICBvdXQucHJpbnRmKCIlLTIzczogJXMlbiIsICJHZW5lcmF0aW9uIE5vIiwgcHJvYmUuZ2V0Q3VycmVudEdlbmVyYXRpb25OdW1iZXIoKSk7CiAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0xpc3RTbmFwc2hvdHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0xpc3RTbmFwc2hvdHMuamF2YQppbmRleCBiNzBhN2E5Li44MDNmZTVhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9MaXN0U25hcHNob3RzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvTGlzdFNuYXBzaG90cy5qYXZhCkBAIC00MCw2ICs0MCwxMSBAQAogICAgIGRlc2NyaXB0aW9uID0gIlNraXAgc25hcHNob3RzIHdpdGggVFRMIikKICAgICBwcml2YXRlIGJvb2xlYW4gbm9UVEwgPSBmYWxzZTsKIAorICAgIEBPcHRpb24odGl0bGUgPSAiZXBoZW1lcmFsIiwKKyAgICBuYW1lID0geyAiLWUiLCAiLS1lcGhlbWVyYWwiIH0sCisgICAgZGVzY3JpcHRpb24gPSAiSW5jbHVkZSBlcGhlbWVtZXJhbCBzbmFwc2hvdHMiKQorICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlRXBoZW1lcmFsID0gZmFsc2U7CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKE5vZGVQcm9iZSBwcm9iZSkKICAgICB7CkBAIC01MCw2ICs1NSw3IEBACiAKICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgICAgIG9wdGlvbnMucHV0KCJub190dGwiLCBCb29sZWFuLnRvU3RyaW5nKG5vVFRMKSk7CisgICAgICAgICAgICBvcHRpb25zLnB1dCgiaW5jbHVkZV9lcGhlbWVyYWwiLCBCb29sZWFuLnRvU3RyaW5nKGluY2x1ZGVFcGhlbWVyYWwpKTsKIAogICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgVGFidWxhckRhdGE+IHNuYXBzaG90RGV0YWlscyA9IHByb2JlLmdldFNuYXBzaG90RGV0YWlscyhvcHRpb25zKTsKICAgICAgICAgICAgIGlmIChzbmFwc2hvdERldGFpbHMuaXNFbXB0eSgpKQpAQCAtNjIsNyArNjgsMTEgQEAKICAgICAgICAgICAgIFRhYmxlQnVpbGRlciB0YWJsZSA9IG5ldyBUYWJsZUJ1aWxkZXIoKTsKICAgICAgICAgICAgIC8vIGRpc3BsYXkgY29sdW1uIG5hbWVzIG9ubHkgb25jZQogICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGluZGV4TmFtZXMgPSBzbmFwc2hvdERldGFpbHMuZW50cnlTZXQoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRWYWx1ZSgpLmdldFRhYnVsYXJUeXBlKCkuZ2V0SW5kZXhOYW1lcygpOwotICAgICAgICAgICAgdGFibGUuYWRkKGluZGV4TmFtZXMudG9BcnJheShuZXcgU3RyaW5nW2luZGV4TmFtZXMuc2l6ZSgpXSkpOworCisgICAgICAgICAgICBpZiAoaW5jbHVkZUVwaGVtZXJhbCkKKyAgICAgICAgICAgICAgICB0YWJsZS5hZGQoaW5kZXhOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbaW5kZXhOYW1lcy5zaXplKCldKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGFibGUuYWRkKGluZGV4TmFtZXMuc3ViTGlzdCgwLCBpbmRleE5hbWVzLnNpemUoKSAtIDEpLnRvQXJyYXkobmV3IFN0cmluZ1tpbmRleE5hbWVzLnNpemUoKSAtIDFdKSk7CiAKICAgICAgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgVGFidWxhckRhdGE+IHNuYXBzaG90RGV0YWlsIDogc25hcHNob3REZXRhaWxzLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICB7CkBAIC03MCwxMiArODAsMTUgQEAKICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBlYWNoVmFsdWUgOiB2YWx1ZXMpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PD8+IHZhbHVlID0gKExpc3Q8Pz4pIGVhY2hWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgdGFibGUuYWRkKHZhbHVlLnRvQXJyYXkobmV3IFN0cmluZ1t2YWx1ZS5zaXplKCldKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRXBoZW1lcmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuYWRkKHZhbHVlLnRvQXJyYXkobmV3IFN0cmluZ1t2YWx1ZS5zaXplKCldKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLmFkZCh2YWx1ZS5zdWJMaXN0KDAsIHZhbHVlLnNpemUoKSAtIDEpLnRvQXJyYXkobmV3IFN0cmluZ1t2YWx1ZS5zaXplKCkgLSAxXSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRhYmxlLnByaW50VG8ob3V0KTsKIAotICAgICAgICAgICAgb3V0LnByaW50bG4oIlxuVG90YWwgVHJ1ZURpc2tTcGFjZVVzZWQ6ICIgKyBGaWxlVXRpbHMuc3RyaW5naWZ5RmlsZVNpemUodHJ1ZVNuYXBzaG90c1NpemUpICsgIlxuIik7CisgICAgICAgICAgICBvdXQucHJpbnRsbigiXG5Ub3RhbCBUcnVlRGlza1NwYWNlVXNlZDogIiArIEZpbGVVdGlscy5zdHJpbmdpZnlGaWxlU2l6ZSh0cnVlU25hcHNob3RzU2l6ZSkgKyAnXG4nKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1Byb2ZpbGVMb2FkLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9Qcm9maWxlTG9hZC5qYXZhCmluZGV4IDQ4N2YxNGEuLjQ1Y2FkZTcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1Byb2ZpbGVMb2FkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvUHJvZmlsZUxvYWQuamF2YQpAQCAtMTcsMzYgKzE3LDM2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMubm9kZXRvb2w7CiAKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlscy5qb2luOwotCiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKLQogaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuLkNvbXBvc2l0ZURhdGE7CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4uT3BlbkRhdGFFeGNlcHRpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlNhbXBsZXIuU2FtcGxlclR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuTm9kZVByb2JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLk5vZGVUb29sLk5vZGVUb29sQ21kOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLm5vZGV0b29sLmZvcm1hdHRlci5UYWJsZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKLQogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiAKIGltcG9ydCBpby5haXJsaWZ0LmFpcmxpbmUuQXJndW1lbnRzOwogaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5Db21tYW5kOwogaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5PcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TYW1wbGVyLlNhbXBsZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuU2FtcGxpbmdNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLk5vZGVQcm9iZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ob2RlVG9vbC5Ob2RlVG9vbENtZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzLmpvaW47CiAKIEBDb21tYW5kKG5hbWUgPSAicHJvZmlsZWxvYWQiLCBkZXNjcmlwdGlvbiA9ICJMb3cgZm9vdHByaW50IHByb2ZpbGluZyBvZiBhY3Rpdml0eSBmb3IgYSBwZXJpb2Qgb2YgdGltZSIpCiBwdWJsaWMgY2xhc3MgUHJvZmlsZUxvYWQgZXh0ZW5kcyBOb2RlVG9vbENtZAogewotICAgIEBBcmd1bWVudHModXNhZ2UgPSAiPGtleXNwYWNlPiA8Y2ZuYW1lPiA8ZHVyYXRpb24+IiwgZGVzY3JpcHRpb24gPSAiVGhlIGtleXNwYWNlLCBjb2x1bW4gZmFtaWx5IG5hbWUsIGFuZCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMiKQorICAgIEBBcmd1bWVudHModXNhZ2UgPSAiPGtleXNwYWNlPiA8Y2ZuYW1lPiA8ZHVyYXRpb24+IiwgZGVzY3JpcHRpb24gPSAiVGhlIGtleXNwYWNlLCBjb2x1bW4gZmFtaWx5IG5hbWUsIGFuZCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgKERlZmF1bHQ6IDEwMDAwKSIpCiAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAgICAgQE9wdGlvbihuYW1lID0gIi1zIiwgZGVzY3JpcHRpb24gPSAiQ2FwYWNpdHkgb2YgdGhlIHNhbXBsZXIsIGhpZ2hlciBmb3IgbW9yZSBhY2N1cmFjeSAoRGVmYXVsdDogMjU2KSIpCkBAIC01OCwyNyArNTgsNTkgQEAKICAgICBAT3B0aW9uKG5hbWUgPSAiLWEiLCBkZXNjcmlwdGlvbiA9ICJDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBzYW1wbGVycyB0byB1c2UgKERlZmF1bHQ6IGFsbCkiKQogICAgIHByaXZhdGUgU3RyaW5nIHNhbXBsZXJzID0gam9pbihTYW1wbGVyVHlwZS52YWx1ZXMoKSwgJywnKTsKIAorICAgIEBPcHRpb24obmFtZSA9IHsiLWkiLCAiLS1pbnRlcnZhbCJ9LCBkZXNjcmlwdGlvbiA9ICJTY2hlZHVsZSBhIG5ldyBqb2IgdGhhdCBzYW1wbGVzIGV2ZXJ5IGludGVydmFsIG1pbGxpc2Vjb25kcyAoRGVmYXVsdDogZGlzYWJsZWQpIGluIHRoZSBiYWNrZ3JvdW5kIikKKyAgICBwcml2YXRlIGludCBpbnRlcnZhbE1pbGxpcyA9IC0xOyAvLyAtMSBmb3IgZGlzYWJsZWQuCisKKyAgICBAT3B0aW9uKG5hbWUgPSB7Ii10IiwgIi0tc3RvcCJ9LCBkZXNjcmlwdGlvbiA9ICJTdG9wIHRoZSBzY2hlZHVsZWQgc2FtcGxpbmcgam9iIGlkZW50aWZpZWQgYnkgPGtleXNwYWNlPiBhbmQgPGNmbmFtZT4uIEpvYnMgYXJlIHN0b3BwZWQgdW50aWwgdGhlIGxhc3Qgc2NoZWR1bGVzIGNvbXBsZXRlLiIpCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFN0b3AgPSBmYWxzZTsKKworICAgIEBPcHRpb24obmFtZSA9IHsiLWwiLCAiLS1saXN0In0sIGRlc2NyaXB0aW9uID0gIkxpc3QgdGhlIHNjaGVkdWxlZCBzYW1wbGluZyBqb2JzIikKKyAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkTGlzdCA9IGZhbHNlOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShOb2RlUHJvYmUgcHJvYmUpCiAgICAgewotICAgICAgICBjaGVja0FyZ3VtZW50KGFyZ3Muc2l6ZSgpID09IDMgfHwgYXJncy5zaXplKCkgPT0gMSB8fCBhcmdzLnNpemUoKSA9PSAwLCAiSW52YWxpZCBhcmd1bWVudHMsIGVpdGhlciBba2V5c3BhY2UgdGFibGUgZHVyYXRpb25dIG9yIFtkdXJhdGlvbl0gb3Igbm8gYXJncyIpOwotICAgICAgICBjaGVja0FyZ3VtZW50KHRvcENvdW50IDwgY2FwYWNpdHksICJUb3BLIGNvdW50ICgtaykgb3B0aW9uIG11c3QgYmUgc21hbGxlciB0aGVuIHRoZSBzdW1tYXJ5IGNhcGFjaXR5ICgtcykiKTsKKyAgICAgICAgY2hlY2tBcmd1bWVudChhcmdzLnNpemUoKSA9PSAzIHx8IGFyZ3Muc2l6ZSgpID09IDIgfHwgYXJncy5zaXplKCkgPT0gMSB8fCBhcmdzLnNpemUoKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50cywgZWl0aGVyIFtrZXlzcGFjZSB0YWJsZS8qIGR1cmF0aW9uXSBvciBba2V5c3BhY2UgdGFibGUvKl0gb3IgW2R1cmF0aW9uXSBvciBubyBhcmdzLlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgIk9wdGlvbmFsbHksIHVzZSAqIHRvIHJlcHJlc2VudCBhbGwgdGFibGVzIHVuZGVyIHRoZSBrZXlzcGFjZS4iKTsKKyAgICAgICAgY2hlY2tBcmd1bWVudCh0b3BDb3VudCA+IDAsICJUb3BLIGNvdW50ICgtaykgb3B0aW9uIG11c3QgaGF2ZSBwb3NpdGl2ZSB2YWx1ZSIpOworICAgICAgICBjaGVja0FyZ3VtZW50KHRvcENvdW50IDwgY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgIlRvcEsgY291bnQgKC1rKSBvcHRpb24gbXVzdCBiZSBzbWFsbGVyIHRoZW4gdGhlIHN1bW1hcnkgY2FwYWNpdHkgKC1zKSIpOworICAgICAgICBjaGVja0FyZ3VtZW50KGNhcGFjaXR5IDw9IDEwMjQsICJDYXBhY2l0eSAoLXMpIGNhbm5vdCBleGNlZWQgMTAyNC4iKTsKICAgICAgICAgU3RyaW5nIGtleXNwYWNlID0gbnVsbDsKICAgICAgICAgU3RyaW5nIHRhYmxlID0gbnVsbDsKLSAgICAgICAgSW50ZWdlciBkdXJhdGlvbk1pbGxpcyA9IDEwMDAwOwotICAgICAgICBpZihhcmdzLnNpemUoKSA9PSAzKQorICAgICAgICBpbnQgZHVyYXRpb25NaWxsaXMgPSAxMDAwMDsKKyAgICAgICAgLyogVGhlcmUgYXJlIDMgcG9zc2libGUgb3V0Y29tZXMgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgYXJncy4KKyAgICAgICAgICogLSBrZXlzcGFjZSA9PSBudWxsICYmIHRhYmxlID09IG51bGwuIFdlIG5lZWQgdG8gc2FtcGxlIGFsbCB0YWJsZXMKKyAgICAgICAgICogLSBrZXlzcGFjZSA9PSBLRVlTUEFDRSAmJiB0YWJsZSA9PSAqLiBXZSBuZWVkIHRvIHNhbXBsZSBhbGwgdGFibGVzIHVuZGVyIHRoZSBzcGVjaWZpZWQgS0VZU1BBQ0UKKyAgICAgICAgICogLSBrZXlzcGFjZSA9IEtFWVNQQUNFICYmIHRhYmxlID09IFRBQkxFLiBTYW1wbGUgdGhlIHNwZWNpZmljIEtFWVNQQUNFLnRhYmxlIGNvbWJpbmF0aW9uCisgICAgICAgICAqLworICAgICAgICBpZiAoYXJncy5zaXplKCkgPT0gMykKICAgICAgICAgewogICAgICAgICAgICAga2V5c3BhY2UgPSBhcmdzLmdldCgwKTsKICAgICAgICAgICAgIHRhYmxlID0gYXJncy5nZXQoMSk7Ci0gICAgICAgICAgICBkdXJhdGlvbk1pbGxpcyA9IEludGVnZXIudmFsdWVPZihhcmdzLmdldCgyKSk7CisgICAgICAgICAgICBkdXJhdGlvbk1pbGxpcyA9IEludGVnZXIucGFyc2VJbnQoYXJncy5nZXQoMikpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGtleXNwYWNlID0gYXJncy5nZXQoMCk7CisgICAgICAgICAgICB0YWJsZSA9IGFyZ3MuZ2V0KDEpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGR1cmF0aW9uTWlsbGlzID0gSW50ZWdlci52YWx1ZU9mKGFyZ3MuZ2V0KDApKTsKKyAgICAgICAgICAgIGR1cmF0aW9uTWlsbGlzID0gSW50ZWdlci5wYXJzZUludChhcmdzLmdldCgwKSk7CiAgICAgICAgIH0KKyAgICAgICAga2V5c3BhY2UgPSBudWxsaWZ5V2lsZGNhcmQoa2V5c3BhY2UpOworICAgICAgICB0YWJsZSA9IG51bGxpZnlXaWxkY2FyZCh0YWJsZSk7CisKKyAgICAgICAgY2hlY2tBcmd1bWVudChkdXJhdGlvbk1pbGxpcyA+IDAsICJEdXJhdGlvbjogJXMgbXVzdCBiZSBwb3NpdGl2ZSIsIGR1cmF0aW9uTWlsbGlzKTsKKworICAgICAgICBjaGVja0FyZ3VtZW50KCFoYXNJbnRlcnZhbCgpIHx8IGludGVydmFsTWlsbGlzID49IGR1cmF0aW9uTWlsbGlzLAorICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHNjaGVkdWxlZCBzYW1wbGluZyBpbnRlcnZhbC4gRXhwZWN0aW5nIGludGVydmFsID49IGR1cmF0aW9uLCBidXQgaW50ZXJ2YWw6ICVzIG1zOyBkdXJhdGlvbjogJXMgbXMiLAorICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsTWlsbGlzLCBkdXJhdGlvbk1pbGxpcyk7CiAgICAgICAgIC8vIGdlbmVyYXRlIHRoZSBsaXN0IG9mIHNhbXBsZXJzCiAgICAgICAgIExpc3Q8U3RyaW5nPiB0YXJnZXRzID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBhdmFpbGFibGUgPSBBcnJheXMuc3RyZWFtKFNhbXBsZXJUeXBlLnZhbHVlcygpKS5tYXAoRW51bTo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIFNldDxTdHJpbmc+IGF2YWlsYWJsZSA9IEFycmF5cy5zdHJlYW0oU2FtcGxlclR5cGUudmFsdWVzKCkpLm1hcChFbnVtOjp0b1N0cmluZykuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOwogICAgICAgICBmb3IgKFN0cmluZyBzIDogc2FtcGxlcnMuc3BsaXQoIiwiKSkKICAgICAgICAgewogICAgICAgICAgICAgU3RyaW5nIHNhbXBsZXIgPSBzLnRyaW0oKS50b1VwcGVyQ2FzZSgpOwpAQCAtODYsMTA4ICsxMTgsNzAgQEAKICAgICAgICAgICAgIHRhcmdldHMuYWRkKHNhbXBsZXIpOwogICAgICAgICB9CiAKKyAgICAgICAgUHJpbnRTdHJlYW0gb3V0ID0gcHJvYmUub3V0cHV0KCkub3V0OworCiAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9zaXRlRGF0YT4+IHJlc3VsdHM7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoa2V5c3BhY2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICByZXN1bHRzID0gcHJvYmUuZ2V0UGFydGl0aW9uU2FtcGxlKGNhcGFjaXR5LCBkdXJhdGlvbk1pbGxpcywgdG9wQ291bnQsIHRhcmdldHMpOworICAgICAgICAgICAgLy8gaGFuZGxlIHNjaGVkdWxlZCBzYW1wbGluZ3MsIGkuZS4gc3RhcnQgb3Igc3RvcAorICAgICAgICAgICAgaWYgKGhhc0ludGVydmFsKCkgfHwgc2hvdWxkU3RvcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBrZXlzcGFjZSBhbmQgdGFibGUgYXJlIG51bGxhYmxlCisgICAgICAgICAgICAgICAgYm9vbGVhbiBvcFN1Y2Nlc3MgPSBwcm9iZS5oYW5kbGVTY2hlZHVsZWRTYW1wbGluZyhrZXlzcGFjZSwgdGFibGUsIGNhcGFjaXR5LCB0b3BDb3VudCwgZHVyYXRpb25NaWxsaXMsIGludGVydmFsTWlsbGlzLCB0YXJnZXRzLCBzaG91bGRTdG9wKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9wU3VjY2VzcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTdG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50ZigiVW5hYmxlIHRvIHN0b3AgdGhlIG5vbi1leGlzdGVudCBzY2hlZHVsZWQgc2FtcGxpbmcgZm9yIGtleXNwYWNlOiAlcywgdGFibGU6ICVzJW4iLCBrZXlzcGFjZSwgdGFibGUpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBvdXQucHJpbnRmKCJVbmFibGUgdG8gc2NoZWR1bGUgc2FtcGxpbmcgZm9yIGtleXNwYWNlOiAlcywgdGFibGU6ICVzIGR1ZSB0byBleGlzdGluZyBzYW1wbGluZ3MuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RvcCB0aGUgZXhpc3Rpbmcgc2FtcGxpbmcgam9icyBmaXJzdC4lbiIsIGtleXNwYWNlLCB0YWJsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNob3VsZExpc3QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gc2FtcGxlVGFza3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICBpbnQgbWF4S3NMZW5ndGggPSAiS0VZU1BBQ0UiLmxlbmd0aCgpOworICAgICAgICAgICAgICAgIGludCBtYXhUYmxMZW5ndGggPSAiVEFCTEUiLmxlbmd0aCgpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGZ1bGxUYWJsZU5hbWUgOiBwcm9iZS5nZXRTYW1wbGVUYXNrcygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcGFydHMgPSBmdWxsVGFibGVOYW1lLnNwbGl0KCJcXC4iKTsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tTdGF0ZShwYXJ0cy5sZW5ndGggPT0gMiwgIlVuYWJsZSB0byBwYXJzZSB0aGUgZnVsbCB0YWJsZSBuYW1lOiAlcyIsIGZ1bGxUYWJsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICBzYW1wbGVUYXNrcy5hZGQoUGFpci5jcmVhdGUocGFydHNbMF0sIHBhcnRzWzFdKSk7CisgICAgICAgICAgICAgICAgICAgIG1heEtzTGVuZ3RoID0gTWF0aC5tYXgobWF4S3NMZW5ndGgsIHBhcnRzWzBdLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gcHJpbnQgdGhlIGhlYWRlciBsaW5lIGFuZCBwdXQgZW5vdWdoIHNwYWNlIGJldHdlZW4gS0VZU1BBQ0UgQU5EIFRBQkxFLgorICAgICAgICAgICAgICAgIFN0cmluZyBsaW5lRm9ybWF0ID0gIiUiICsgbWF4S3NMZW5ndGggKyAicyAlIiArIG1heFRibExlbmd0aCArICJzJW4iOworICAgICAgICAgICAgICAgIG91dC5wcmludGYobGluZUZvcm1hdCwgIktFWVNQQUNFIiwgIlRBQkxFIik7CisgICAgICAgICAgICAgICAgc2FtcGxlVGFza3MuZm9yRWFjaChwYWlyIC0+IG91dC5wcmludGYobGluZUZvcm1hdCwgcGFpci5sZWZ0LCBwYWlyLnJpZ2h0KSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBwcm9iZS5nZXRQYXJ0aXRpb25TYW1wbGUoa2V5c3BhY2UsIHRhYmxlLCBjYXBhY2l0eSwgZHVyYXRpb25NaWxsaXMsIHRvcENvdW50LCB0YXJnZXRzKTsKLQotICAgICAgICB9IGNhdGNoIChPcGVuRGF0YUV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGJsb2NraW5nIHNhbXBsZSBhbGwgdGhlIHRhYmxlcyBvciBhbGwgdGhlIHRhYmxlcyB1bmRlciBhIGtleXNwYWNlCisgICAgICAgICAgICAgICAgaWYgKGtleXNwYWNlID09IG51bGwgfHwgdGFibGUgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHByb2JlLmdldFBhcnRpdGlvblNhbXBsZShrZXlzcGFjZSwgY2FwYWNpdHksIGR1cmF0aW9uTWlsbGlzLCB0b3BDb3VudCwgdGFyZ2V0cyk7CisgICAgICAgICAgICAgICAgZWxzZSAvLyBibG9ja2luZyBzYW1wbGUgdGhlIHNwZWNpZmljIHRhYmxlCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBwcm9iZS5nZXRQYXJ0aXRpb25TYW1wbGUoa2V5c3BhY2UsIHRhYmxlLCBjYXBhY2l0eSwgZHVyYXRpb25NaWxsaXMsIHRvcENvdW50LCB0YXJnZXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoT3BlbkRhdGFFeGNlcHRpb24gZSkKICAgICAgICAgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KIAogICAgICAgICBBdG9taWNCb29sZWFuIGZpcnN0ID0gbmV3IEF0b21pY0Jvb2xlYW4odHJ1ZSk7Ci0gICAgICAgIFJlc3VsdEJ1aWxkZXIgcmIgPSBuZXcgUmVzdWx0QnVpbGRlcihmaXJzdCwgcmVzdWx0cywgdGFyZ2V0cyk7Ci0KLSAgICAgICAgZm9yKFN0cmluZyBzYW1wbGVyIDogTGlzdHMubmV3QXJyYXlMaXN0KCJSRUFEUyIsICJXUklURVMiLCAiQ0FTX0NPTlRFTlRJT05TIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJiLmZvclR5cGUoU2FtcGxlclR5cGUudmFsdWVPZihzYW1wbGVyKSwgIkZyZXF1ZW5jeSBvZiAiICsgc2FtcGxlci50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoIl8iLCAiICIpICsgIiBieSBwYXJ0aXRpb24iKQotICAgICAgICAgICAgLmFkZENvbHVtbigiVGFibGUiLCAidGFibGUiKQotICAgICAgICAgICAgLmFkZENvbHVtbigiUGFydGl0aW9uIiwgInZhbHVlIikKLSAgICAgICAgICAgIC5hZGRDb2x1bW4oIkNvdW50IiwgImNvdW50IikKLSAgICAgICAgICAgIC5hZGRDb2x1bW4oIisvLSIsICJlcnJvciIpCi0gICAgICAgICAgICAucHJpbnQocHJvYmUub3V0cHV0KCkub3V0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJiLmZvclR5cGUoU2FtcGxlclR5cGUuV1JJVEVfU0laRSwgIk1heCBtdXRhdGlvbiBzaXplIGJ5IHBhcnRpdGlvbiIpCi0gICAgICAgICAgICAuYWRkQ29sdW1uKCJUYWJsZSIsICJ0YWJsZSIpCi0gICAgICAgICAgICAuYWRkQ29sdW1uKCJQYXJ0aXRpb24iLCAidmFsdWUiKQotICAgICAgICAgICAgLmFkZENvbHVtbigiQnl0ZXMiLCAiY291bnQiKQotICAgICAgICAgICAgLnByaW50KHByb2JlLm91dHB1dCgpLm91dCk7Ci0KLSAgICAgICAgcmIuZm9yVHlwZShTYW1wbGVyVHlwZS5MT0NBTF9SRUFEX1RJTUUsICJMb25nZXN0IHJlYWQgcXVlcnkgdGltZXMiKQotICAgICAgICAgICAgLmFkZENvbHVtbigiUXVlcnkiLCAidmFsdWUiKQotICAgICAgICAgICAgLmFkZENvbHVtbigiTWljcm9zZWNvbmRzIiwgImNvdW50IikKLSAgICAgICAgICAgIC5wcmludChwcm9iZS5vdXRwdXQoKS5vdXQpOworICAgICAgICBTYW1wbGluZ01hbmFnZXIuUmVzdWx0QnVpbGRlciByYiA9IG5ldyBTYW1wbGluZ01hbmFnZXIuUmVzdWx0QnVpbGRlcihmaXJzdCwgcmVzdWx0cywgdGFyZ2V0cyk7CisgICAgICAgIG91dC5wcmludGxuKFNhbXBsaW5nTWFuYWdlci5mb3JtYXRSZXN1bHQocmIpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIGNsYXNzIFJlc3VsdEJ1aWxkZXIKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzSW50ZXJ2YWwoKQogICAgIHsKLSAgICAgICAgcHJpdmF0ZSBTYW1wbGVyVHlwZSB0eXBlOwotICAgICAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBBdG9taWNCb29sZWFuIGZpcnN0OwotICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8Q29tcG9zaXRlRGF0YT4+IHJlc3VsdHM7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHRhcmdldHM7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gZGF0YUtleXM7CisgICAgICAgIHJldHVybiBpbnRlcnZhbE1pbGxpcyAhPSAtMTsKKyAgICB9CiAKLSAgICAgICAgcHVibGljIFJlc3VsdEJ1aWxkZXIoQXRvbWljQm9vbGVhbiBmaXJzdCwgTWFwPFN0cmluZywgTGlzdDxDb21wb3NpdGVEYXRhPj4gcmVzdWx0cywgTGlzdDxTdHJpbmc+IHRhcmdldHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgICAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7Ci0gICAgICAgICAgICB0aGlzLnJlc3VsdHMgPSByZXN1bHRzOwotICAgICAgICAgICAgdGhpcy50YXJnZXRzID0gdGFyZ2V0czsKLSAgICAgICAgICAgIHRoaXMuZGF0YUtleXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIHRoaXMuZGF0YUtleXMuYWRkKFBhaXIuY3JlYXRlKCIgICIsICIgICIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBSZXN1bHRCdWlsZGVyIGZvclR5cGUoU2FtcGxlclR5cGUgdHlwZSwgU3RyaW5nIGRlc2NyaXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXN1bHRCdWlsZGVyIHJiID0gbmV3IFJlc3VsdEJ1aWxkZXIoZmlyc3QsIHJlc3VsdHMsIHRhcmdldHMpOwotICAgICAgICAgICAgcmIudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICByYi5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICAgICAgcmV0dXJuIHJiOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJlc3VsdEJ1aWxkZXIgYWRkQ29sdW1uKFN0cmluZyB0aXRsZSwgU3RyaW5nIGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5kYXRhS2V5cy5hZGQoUGFpci5jcmVhdGUodGl0bGUsIGtleSkpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXQoQ29tcG9zaXRlRGF0YSBjZCwgU3RyaW5nIGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNkLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNkLmdldChrZXkpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4ga2V5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcHJpbnQoUHJpbnRTdHJlYW0gb3V0U3RyZWFtKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0cy5jb250YWlucyh0eXBlLnRvU3RyaW5nKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghZmlyc3QuZ2V0KCkpCi0gICAgICAgICAgICAgICAgICAgIG91dFN0cmVhbS5wcmludGxuKCk7Ci0gICAgICAgICAgICAgICAgZmlyc3Quc2V0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBvdXRTdHJlYW0ucHJpbnRsbihkZXNjcmlwdGlvbiArICc6Jyk7Ci0gICAgICAgICAgICAgICAgVGFibGVCdWlsZGVyIG91dCA9IG5ldyBUYWJsZUJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBvdXQuYWRkKGRhdGFLZXlzLnN0cmVhbSgpLm1hcChwIC0+IHAubGVmdCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKS50b0FycmF5KG5ldyBTdHJpbmdbXSB7fSkpOwotICAgICAgICAgICAgICAgIExpc3Q8Q29tcG9zaXRlRGF0YT4gdG9wayA9IHJlc3VsdHMuZ2V0KHR5cGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChDb21wb3NpdGVEYXRhIGNkIDogdG9waykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC5hZGQoZGF0YUtleXMuc3RyZWFtKCkubWFwKHAgLT4gZ2V0KGNkLCBwLnJpZ2h0KSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKS50b0FycmF5KG5ldyBTdHJpbmdbXSB7fSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodG9way5zaXplKCkgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG91dFN0cmVhbS5wcmludGxuKCIgICBOb3RoaW5nIHJlY29yZGVkIGR1cmluZyBzYW1wbGluZyBwZXJpb2QuLi4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LnByaW50VG8ob3V0U3RyZWFtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBwcml2YXRlIFN0cmluZyBudWxsaWZ5V2lsZGNhcmQoU3RyaW5nIGlucHV0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZXF1YWxzKCIqIikgPyBudWxsIDogaW5wdXQ7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvUmVidWlsZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvUmVidWlsZC5qYXZhCmluZGV4IGExNmU4ZjIuLmVkNGU5N2MgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1JlYnVpbGQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9SZWJ1aWxkLmphdmEKQEAgLTI4LDcgKzI4LDcgQEAKIHB1YmxpYyBjbGFzcyBSZWJ1aWxkIGV4dGVuZHMgTm9kZVRvb2xDbWQKIHsKICAgICBAQXJndW1lbnRzKHVzYWdlID0gIjxzcmMtZGMtbmFtZT4iLAotICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiTmFtZSBvZiBEQyBmcm9tIHdoaWNoIHRvIHNlbGVjdCBzb3VyY2VzIGZvciBzdHJlYW1pbmcuIEJ5IGRlZmF1bHQsIHBpY2sgYW55IERDIikKKyAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIk5hbWUgb2YgREMgZnJvbSB3aGljaCB0byBzZWxlY3Qgc291cmNlcyBmb3Igc3RyZWFtaW5nLiBCeSBkZWZhdWx0LCBwaWNrIGFueSBEQyAoZXhjZXB0IGxvY2FsIERDIHdoZW4gLS1leGNsdWRlLWxvY2FsLWRjIGlzIHNldCkiKQogICAgIHByaXZhdGUgU3RyaW5nIHNvdXJjZURhdGFDZW50ZXJOYW1lID0gbnVsbDsKIAogICAgIEBPcHRpb24odGl0bGUgPSAic3BlY2lmaWNfa2V5c3BhY2UiLApAQCAtNDYsNiArNDYsMTEgQEAKICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIlVzZSAtcyB0byBzcGVjaWZ5IGhvc3RzIHRoYXQgdGhpcyBub2RlIHNob3VsZCBzdHJlYW0gZnJvbSB3aGVuIC10cyBpcyB1c2VkLiBNdWx0aXBsZSBob3N0cyBzaG91bGQgYmUgc2VwYXJhdGVkIHVzaW5nIGNvbW1hcyAoZS5nLiAxMjcuMC4wLjEsMTI3LjAuMC4yLC4uLikiKQogICAgIHByaXZhdGUgU3RyaW5nIHNwZWNpZmljU291cmNlcyA9IG51bGw7CiAKKyAgICBAT3B0aW9uKHRpdGxlID0gImV4Y2x1ZGVfbG9jYWxfZGMiLAorICAgICAgICAgICAgbmFtZSA9IHsiLS1leGNsdWRlLWxvY2FsLWRjIn0sCisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICJVc2UgLS1leGNsdWRlLWxvY2FsLWRjIHRvIGV4Y2x1ZGUgbm9kZXMgaW4gbG9jYWwgZGF0YSBjZW50ZXIgYXMgc291cmNlIGZvciBzdHJlYW1pbmcuIikKKyAgICBwcml2YXRlIGJvb2xlYW4gZXhjbHVkZUxvY2FsRGF0YWNlbnRlck5vZGVzID0gZmFsc2U7CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKE5vZGVQcm9iZSBwcm9iZSkKICAgICB7CkBAIC01NSw2ICs2MCw2IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW5ub3Qgc3BlY2lmeSB0b2tlbnMgd2l0aG91dCBrZXlzcGFjZS4iKTsKICAgICAgICAgfQogCi0gICAgICAgIHByb2JlLnJlYnVpbGQoc291cmNlRGF0YUNlbnRlck5hbWUsIGtleXNwYWNlLCB0b2tlbnMsIHNwZWNpZmljU291cmNlcyk7CisgICAgICAgIHByb2JlLnJlYnVpbGQoc291cmNlRGF0YUNlbnRlck5hbWUsIGtleXNwYWNlLCB0b2tlbnMsIHNwZWNpZmljU291cmNlcywgZXhjbHVkZUxvY2FsRGF0YWNlbnRlck5vZGVzKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9SaW5nLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9SaW5nLmphdmEKaW5kZXggY2NjNzkxMi4uZWI3NjQ1ZDYgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1JpbmcuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9SaW5nLmphdmEKQEAgLTg1LDIxICs4NSwyOSBAQAogICAgICAgICBib29sZWFuIHNob3dFZmZlY3RpdmVPd25lcnNoaXAgPSB0cnVlOwogCiAgICAgICAgIC8vIENhbGN1bGF0ZSBwZXItdG9rZW4gb3duZXJzaGlwIG9mIHRoZSByaW5nCi0gICAgICAgIE1hcDxTdHJpbmcsIEZsb2F0PiBvd25lcnNoaXBzOworICAgICAgICBNYXA8U3RyaW5nLCBGbG9hdD4gb3duZXJzaGlwcyA9IG51bGw7CiAgICAgICAgIHRyeQogICAgICAgICB7CiAgICAgICAgICAgICBvd25lcnNoaXBzID0gcHJvYmUuZWZmZWN0aXZlT3duZXJzaGlwV2l0aFBvcnQoa2V5c3BhY2UpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG93bmVyc2hpcHMgPSBwcm9iZS5nZXRPd25lcnNoaXBXaXRoUG9ydCgpOwotICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiTm90ZTogIikuYXBwZW5kKGV4LmdldE1lc3NhZ2UoKSkuYXBwZW5kKCIlbiIpOwotICAgICAgICAgICAgc2hvd0VmZmVjdGl2ZU93bmVyc2hpcCA9IGZhbHNlOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3duZXJzaGlwcyA9IHByb2JlLmdldE93bmVyc2hpcFdpdGhQb3J0KCk7CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiTm90ZTogIikuYXBwZW5kKGV4LmdldE1lc3NhZ2UoKSkuYXBwZW5kKCIlbiIpOworICAgICAgICAgICAgICAgIHNob3dFZmZlY3RpdmVPd25lcnNoaXAgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQucHJpbnRmKCIlbkVycm9yOiAlcyVuIiwgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KQogICAgICAgICB7CiAgICAgICAgICAgICBvdXQucHJpbnRmKCIlbkVycm9yOiAlcyVuIiwgZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwogICAgICAgICB9CiAKICAgICAgICAgb3V0LnByaW50bG4oKTsKQEAgLTExMiw3ICsxMjAsNyBAQAogICAgICAgICAgICAgb3V0LnByaW50bG4oIiAgVG8gdmlldyBzdGF0dXMgcmVsYXRlZCBpbmZvIG9mIGEgbm9kZSB1c2UgXCJub2RldG9vbCBzdGF0dXNcIiBpbnN0ZWFkLlxuIik7CiAgICAgICAgIH0KIAotICAgICAgICBvdXQucHJpbnRmKCIlbiAgIiArIGVycm9ycy50b1N0cmluZygpKTsKKyAgICAgICAgb3V0LnByaW50ZigiJW4gICIgKyBlcnJvcnMpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBwcmludERjKFN0cmluZyBmb3JtYXQsIFN0cmluZyBkYywKQEAgLTE2Nyw5ICsxNzUsNyBAQAogICAgICAgICAgICAgZWxzZSBpZiAobW92aW5nTm9kZXMuY29udGFpbnMoZW5kcG9pbnQpKQogICAgICAgICAgICAgICAgIHN0YXRlID0gIk1vdmluZyI7CiAKLSAgICAgICAgICAgIFN0cmluZyBsb2FkID0gbG9hZE1hcC5jb250YWluc0tleShlbmRwb2ludCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsb2FkTWFwLmdldChlbmRwb2ludCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPyI7CisgICAgICAgICAgICBTdHJpbmcgbG9hZCA9IGxvYWRNYXAuZ2V0T3JEZWZhdWx0KGVuZHBvaW50LCAiPyIpOwogICAgICAgICAgICAgU3RyaW5nIG93bnMgPSBzdGF0Lm93bnMgIT0gbnVsbCAmJiBzaG93RWZmZWN0aXZlT3duZXJzaGlwPyBuZXcgRGVjaW1hbEZvcm1hdCgiIyMwLjAwJSIpLmZvcm1hdChzdGF0Lm93bnMpIDogIj8iOwogICAgICAgICAgICAgb3V0LnByaW50Zihmb3JtYXQsIHN0YXQuaXBPckRucyhwcmludFBvcnQpLCByYWNrLCBzdGF0dXMsIHN0YXRlLCBsb2FkLCBvd25zLCBzdGF0LnRva2VuKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU3RhdHVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TdGF0dXMuamF2YQppbmRleCAzNjlhZmZjLi5hODljYTY0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TdGF0dXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TdGF0dXMuamF2YQpAQCAtNzksOCArNzksMTYgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIG93bmVyc2hpcHMgPSBwcm9iZS5nZXRPd25lcnNoaXBXaXRoUG9ydCgpOwotICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiTm90ZTogIikuYXBwZW5kKGUuZ2V0TWVzc2FnZSgpKS5hcHBlbmQoIiVuIik7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvd25lcnNoaXBzID0gcHJvYmUuZ2V0T3duZXJzaGlwV2l0aFBvcnQoKTsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJOb3RlOiAiKS5hcHBlbmQoZS5nZXRNZXNzYWdlKCkpLmFwcGVuZCgiJW4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0LnByaW50ZigiJW5FcnJvcjogJXMlbiIsIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvVGFibGVTdGF0cy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvVGFibGVTdGF0cy5qYXZhCmluZGV4IDRhMzNjNjQuLmMxYTc2YTAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1RhYmxlU3RhdHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9UYWJsZVN0YXRzLmphdmEKQEAgLTYwLDcgKzYwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1lbXRhYmxlX29mZl9oZWFwX21lbW9yeV91c2VkLCBtZW10YWJsZV9zd2l0Y2hfY291bnQsIG51bWJlcl9vZl9wYXJ0aXRpb25zX2VzdGltYXRlLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICArICJvZmZfaGVhcF9tZW1vcnlfdXNlZF90b3RhbCwgcGVuZGluZ19mbHVzaGVzLCBwZXJjZW50X3JlcGFpcmVkLCByZWFkX2xhdGVuY3ksIHJlYWRzLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICArICJzcGFjZV91c2VkX2J5X3NuYXBzaG90c190b3RhbCwgc3BhY2VfdXNlZF9saXZlLCBzcGFjZV91c2VkX3RvdGFsLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJzc3RhYmxlX2NvbXByZXNzaW9uX3JhdGlvLCBzc3RhYmxlX2NvdW50LCB0YWJsZV9uYW1lLCB3cml0ZV9sYXRlbmN5LCB3cml0ZXMpIikKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInNzdGFibGVfY29tcHJlc3Npb25fcmF0aW8sIHNzdGFibGVfY291bnQsIHRhYmxlX25hbWUsIHdyaXRlX2xhdGVuY3ksIHdyaXRlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXhfc3N0YWJsZV9zaXplLCBsb2NhbF9yZWFkX3dyaXRlX3JhdGlvLCB0d2NzX21heF9kdXJhdGlvbikiKQogICAgIHByaXZhdGUgU3RyaW5nIHNvcnRLZXkgPSAiIjsKIAogICAgIEBPcHRpb24odGl0bGUgPSAidG9wIiwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1ZlcnNpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1ZlcnNpb24uamF2YQppbmRleCBmOTU5MDdhLi42NTU2YTA0IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9WZXJzaW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvVmVyc2lvbi5qYXZhCkBAIC0xOCwxNiArMTgsMjMgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMubm9kZXRvb2w7CiAKIGltcG9ydCBpby5haXJsaWZ0LmFpcmxpbmUuQ29tbWFuZDsKLQoraW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5PcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuTm9kZVByb2JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLk5vZGVUb29sLk5vZGVUb29sQ21kOwogCiBAQ29tbWFuZChuYW1lID0gInZlcnNpb24iLCBkZXNjcmlwdGlvbiA9ICJQcmludCBjYXNzYW5kcmEgdmVyc2lvbiIpCiBwdWJsaWMgY2xhc3MgVmVyc2lvbiBleHRlbmRzIE5vZGVUb29sQ21kCiB7CisgICAgQE9wdGlvbih0aXRsZSA9ICJ2ZXJib3NlIiwKKyAgICAgICAgICAgIG5hbWUgPSB7Ii12IiwgIi0tdmVyYm9zZSJ9LAorICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiSW5jbHVkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIikKKyAgICBwcml2YXRlIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOworCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShOb2RlUHJvYmUgcHJvYmUpCiAgICAgewogICAgICAgICBwcm9iZS5vdXRwdXQoKS5vdXQucHJpbnRsbigiUmVsZWFzZVZlcnNpb246ICIgKyBwcm9iZS5nZXRSZWxlYXNlVmVyc2lvbigpKTsKKyAgICAgICAgaWYgKHZlcmJvc2UpCisgICAgICAgICAgICBwcm9iZS5vdXRwdXQoKS5vdXQucHJpbnRsbigiR2l0U0hBOiAiICsgcHJvYmUuZ2V0R2l0U0hBKCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL0NvbXBhY3Rpb25IaXN0b3J5SG9sZGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9Db21wYWN0aW9uSGlzdG9yeUhvbGRlci5qYXZhCmluZGV4IDg3OTlmZmIuLjM2MmJjNjcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL0NvbXBhY3Rpb25IaXN0b3J5SG9sZGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvQ29tcGFjdGlvbkhpc3RvcnlIb2xkZXIuamF2YQpAQCAtNTQsOCArNTQsOSBAQAogICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgYnl0ZXNJbjsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGJ5dGVzT3V0OwogICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByb3dNZXJnZWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbXBhY3Rpb25Qcm9wZXJ0aWVzOwogCi0gICAgICAgIENvbXBhY3Rpb25IaXN0b3J5Um93KFN0cmluZyBpZCwgU3RyaW5nIGtzTmFtZSwgU3RyaW5nIGNmTmFtZSwgbG9uZyBjb21wYWN0ZWRBdCwgbG9uZyBieXRlc0luLCBsb25nIGJ5dGVzT3V0LCBTdHJpbmcgcm93TWVyZ2VkKQorICAgICAgICBDb21wYWN0aW9uSGlzdG9yeVJvdyhTdHJpbmcgaWQsIFN0cmluZyBrc05hbWUsIFN0cmluZyBjZk5hbWUsIGxvbmcgY29tcGFjdGVkQXQsIGxvbmcgYnl0ZXNJbiwgbG9uZyBieXRlc091dCwgU3RyaW5nIHJvd01lcmdlZCwgU3RyaW5nIGNvbXBhY3Rpb25Qcm9wZXJ0aWVzKQogICAgICAgICB7CiAgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgICAgICB0aGlzLmtzTmFtZSA9IGtzTmFtZTsKQEAgLTY0LDYgKzY1LDcgQEAKICAgICAgICAgICAgIHRoaXMuYnl0ZXNJbiA9IGJ5dGVzSW47CiAgICAgICAgICAgICB0aGlzLmJ5dGVzT3V0ID0gYnl0ZXNPdXQ7CiAgICAgICAgICAgICB0aGlzLnJvd01lcmdlZCA9IHJvd01lcmdlZDsKKyAgICAgICAgICAgIHRoaXMuY29tcGFjdGlvblByb3BlcnRpZXMgPSBjb21wYWN0aW9uUHJvcGVydGllczsKICAgICAgICAgfQogCiAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKENvbXBhY3Rpb25IaXN0b3J5SG9sZGVyLkNvbXBhY3Rpb25IaXN0b3J5Um93IGNocikKQEAgLTgzLDYgKzg1LDcgQEAKICAgICAgICAgICAgIGNvbXBhY3Rpb24ucHV0KCJieXRlc19pbiIsIHRoaXMuYnl0ZXNJbik7CiAgICAgICAgICAgICBjb21wYWN0aW9uLnB1dCgiYnl0ZXNfb3V0IiwgdGhpcy5ieXRlc091dCk7CiAgICAgICAgICAgICBjb21wYWN0aW9uLnB1dCgicm93c19tZXJnZWQiLCB0aGlzLnJvd01lcmdlZCk7CisgICAgICAgICAgICBjb21wYWN0aW9uLnB1dCgiY29tcGFjdGlvbl9wcm9wZXJ0aWVzIiwgdGhpcy5jb21wYWN0aW9uUHJvcGVydGllcyk7CiAgICAgICAgICAgICByZXR1cm4gY29tcGFjdGlvbjsKICAgICAgICAgfQogICAgIH0KQEAgLTExMCw3ICsxMTMsOCBAQAogICAgICAgICAgICAgICAgIChMb25nKXZhbHVlLmdldCgzKSwKICAgICAgICAgICAgICAgICAoTG9uZyl2YWx1ZS5nZXQoNCksCiAgICAgICAgICAgICAgICAgKExvbmcpdmFsdWUuZ2V0KDUpLAotICAgICAgICAgICAgICAgIChTdHJpbmcpdmFsdWUuZ2V0KDYpCisgICAgICAgICAgICAgICAgKFN0cmluZyl2YWx1ZS5nZXQoNiksCisgICAgICAgICAgICAgICAgKFN0cmluZyl2YWx1ZS5nZXQoNykKICAgICAgICAgICAgICk7CiAgICAgICAgICAgICBjaHJMaXN0LmFkZChjaHIpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9Db21wYWN0aW9uSGlzdG9yeVByaW50ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL0NvbXBhY3Rpb25IaXN0b3J5UHJpbnRlci5qYXZhCmluZGV4IDk3ZWQxYzQuLmMyYjYyZWUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL0NvbXBhY3Rpb25IaXN0b3J5UHJpbnRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL0NvbXBhY3Rpb25IaXN0b3J5UHJpbnRlci5qYXZhCkBAIC02NSw3ICs2NSw3IEBACiAgICAgICAgICAgICBmb3IgKE9iamVjdCBjaHIgOiBjb21wYWN0aW9uSGlzdG9yaWVzKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIE1hcCB2YWx1ZSA9IGNociBpbnN0YW5jZW9mIE1hcDw/LCA/PiA/IChNYXApY2hyIDogQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBvYmogPSBuZXcgU3RyaW5nWzddOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIG9iaiA9IG5ldyBTdHJpbmdbOF07CiAgICAgICAgICAgICAgICAgb2JqWzBdID0gKFN0cmluZyl2YWx1ZS5nZXQoImlkIik7CiAgICAgICAgICAgICAgICAgb2JqWzFdID0gKFN0cmluZyl2YWx1ZS5nZXQoImtleXNwYWNlX25hbWUiKTsKICAgICAgICAgICAgICAgICBvYmpbMl0gPSAoU3RyaW5nKXZhbHVlLmdldCgiY29sdW1uZmFtaWx5X25hbWUiKTsKQEAgLTczLDYgKzczLDcgQEAKICAgICAgICAgICAgICAgICBvYmpbNF0gPSB2YWx1ZS5nZXQoImJ5dGVzX2luIikudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICBvYmpbNV0gPSB2YWx1ZS5nZXQoImJ5dGVzX291dCIpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgb2JqWzZdID0gKFN0cmluZyl2YWx1ZS5nZXQoInJvd3NfbWVyZ2VkIik7CisgICAgICAgICAgICAgICAgb2JqWzddID0gKFN0cmluZyl2YWx1ZS5nZXQoImNvbXBhY3Rpb25fcHJvcGVydGllcyIpOwogICAgICAgICAgICAgICAgIHRhYmxlLmFkZChvYmopOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdGFibGUucHJpbnRUbyhvdXQpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvU3RhdHNQcmludGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9TdGF0c1ByaW50ZXIuamF2YQppbmRleCAwMzcyMjdiLi44NmQ3YWY3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9TdGF0c1ByaW50ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9TdGF0c1ByaW50ZXIuamF2YQpAQCAtMTgsMTAgKzE4LDEwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMubm9kZXRvb2wuc3RhdHM7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5EdW1wZXJPcHRpb25zOwogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ZYW1sOwogCkBAIC00MCwxNyArNDAsMTcgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHByaW50KFQgZGF0YSwgUHJpbnRTdHJlYW0gb3V0KQogICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGpzb24gPSBtYXBwZXIud3JpdGVyV2l0aERlZmF1bHRQcmV0dHlQcmludGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53cml0ZVZhbHVlQXNTdHJpbmcoZGF0YS5jb252ZXJ0Mk1hcCgpKTsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihqc29uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRmlyc3QgbmVlZCB0byBnZXQgYSBNYXAgcmVwcmVzZW50YXRpb24gb2Ygc3RhdHMKKyAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gc3RhdHMgPSBkYXRhLmNvbnZlcnQyTWFwKCk7CisgICAgICAgICAgICAvLyBidXQgdGhlbiBhbHNvIG5lZWQgc2xpZ2h0IG1hc3NhZ2luZyB0byBjb2VyY2UgTmFOIHZhbHVlcyBpbnRvIG51bGxzCisgICAgICAgICAgICBmb3IgKE9iamVjdCBzdGF0RW50cnkgOiBzdGF0cy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICBpZiAoc3RhdEVudHJ5IGluc3RhbmNlb2YgTWFwPD8sPz4pCisgICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBlbnRyeSA6ICgoTWFwPFN0cmluZywgT2JqZWN0Pikgc3RhdEVudHJ5KS5lbnRyeVNldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBEb3VibGUgJiYgIURvdWJsZS5pc0Zpbml0ZSgoRG91YmxlKSBlbnRyeS5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShudWxsKTsKKworICAgICAgICAgICAgLy8gYW5kIHRoZW4gd2UgY2FuIHNlcmlhbGl6ZQorICAgICAgICAgICAgb3V0LnByaW50bG4oSnNvblV0aWxzLndyaXRlQXNQcmV0dHlKc29uU3RyaW5nKHN0YXRzKSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1N0YXRzVGFibGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1N0YXRzVGFibGUuamF2YQppbmRleCA4YjUwOTBiLi4yNDg0NTcwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9TdGF0c1RhYmxlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvU3RhdHNUYWJsZS5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiAgICAgcHVibGljIGJvb2xlYW4gaXNMZXZlbGVkU3N0YWJsZSA9IGZhbHNlOwogICAgIHB1YmxpYyBPYmplY3Qgc3N0YWJsZUNvdW50OwogICAgIHB1YmxpYyBPYmplY3Qgb2xkU1NUYWJsZUNvdW50OworICAgIHB1YmxpYyBMb25nIG1heFNTVGFibGVTaXplOwogICAgIHB1YmxpYyBTdHJpbmcgc3BhY2VVc2VkTGl2ZTsKICAgICBwdWJsaWMgU3RyaW5nIHNwYWNlVXNlZFRvdGFsOwogICAgIHB1YmxpYyBTdHJpbmcgc3BhY2VVc2VkQnlTbmFwc2hvdHNUb3RhbDsKQEAgLTcxLDEwICs3MiwxNCBAQAogICAgIHB1YmxpYyBTdHJpbmcgZHJvcHBlZE11dGF0aW9uczsKICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHNzdGFibGVzSW5FYWNoTGV2ZWwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHNzdGFibGVCeXRlc0luRWFjaExldmVsID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgcHVibGljIGludFtdIHNzdGFibGVDb3VudFBlclRXQ1NCdWNrZXQgPSBudWxsOwogICAgIHB1YmxpYyBCb29sZWFuIGlzSW5Db3JyZWN0TG9jYXRpb24gPSBudWxsOyAvLyBudWxsOiBvcHRpb24gbm90IGFjdGl2ZQogICAgIHB1YmxpYyBkb3VibGUgZHJvcHBhYmxlVG9tYnN0b25lUmF0aW87CiAgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gdG9wU2l6ZVBhcnRpdGlvbnM7CiAgICAgcHVibGljIE1hcDxTdHJpbmcsIExvbmc+IHRvcFRvbWJzdG9uZVBhcnRpdGlvbnM7CiAgICAgcHVibGljIFN0cmluZyB0b3BTaXplUGFydGl0aW9uc0xhc3RVcGRhdGU7CiAgICAgcHVibGljIFN0cmluZyB0b3BUb21ic3RvbmVQYXJ0aXRpb25zTGFzdFVwZGF0ZTsKKyAgICBwdWJsaWMgZG91YmxlIGxvY2FsUmVhZFdyaXRlUmF0aW87CisgICAgcHVibGljIExvbmcgdHdjc0R1cmF0aW9uSW5NaWxsaXM7CisgICAgcHVibGljIFN0cmluZyB0d2NzOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvU3RhdHNUYWJsZUNvbXBhcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1N0YXRzVGFibGVDb21wYXJhdG9yLmphdmEKaW5kZXggMTdiNWM2MS4uYTdkYWJiMiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvU3RhdHNUYWJsZUNvbXBhcmF0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9TdGF0c1RhYmxlQ29tcGFyYXRvci5qYXZhCkBAIC02NSw3ICs2NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlbmRpbmdfZmx1c2hlcyIsICJwZXJjZW50X3JlcGFpcmVkIiwgInJlYWRfbGF0ZW5jeSIsICJyZWFkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwYWNlX3VzZWRfYnlfc25hcHNob3RzX3RvdGFsIiwgInNwYWNlX3VzZWRfbGl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwYWNlX3VzZWRfdG90YWwiLCAic3N0YWJsZV9jb21wcmVzc2lvbl9yYXRpbyIsICJzc3RhYmxlX2NvdW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFibGVfbmFtZSIsICJ3cml0ZV9sYXRlbmN5IiwgIndyaXRlcyIgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFibGVfbmFtZSIsICJ3cml0ZV9sYXRlbmN5IiwgIndyaXRlcyIsICJtYXhfc3N0YWJsZV9zaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYWxfcmVhZF93cml0ZV9yYXRpbyIsICJ0d2NzX21heF9kdXJhdGlvbiJ9OwogCiAgICAgcHVibGljIFN0YXRzVGFibGVDb21wYXJhdG9yKFN0cmluZyBzb3J0S2V5LCBib29sZWFuIGh1bWFuUmVhZGFibGUpCiAgICAgewpAQCAtMjI5LDYgKzIzMCwxMCBAQAogICAgICAgICB7CiAgICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlRG91YmxlcyhzdHgubG9jYWxXcml0ZUxhdGVuY3lNcywgc3R5LmxvY2FsV3JpdGVMYXRlbmN5TXMpOwogICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNvcnRLZXkuZXF1YWxzKCJsb2NhbF9yZWFkX3dyaXRlX3JhdGlvIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmVEb3VibGVzKHN0eC5sb2NhbFJlYWRXcml0ZVJhdGlvLCBzdHkubG9jYWxSZWFkV3JpdGVSYXRpbyk7CisgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoc29ydEtleS5lcXVhbHMoIm1heGltdW1fbGl2ZV9jZWxsc19wZXJfc2xpY2VfbGFzdF9maXZlX21pbnV0ZXMiKSkKICAgICAgICAgewogICAgICAgICAgICAgcmVzdWx0ID0gc2lnbiAqIExvbmcudmFsdWVPZihzdHgubWF4aW11bUxpdmVDZWxsc1BlclNsaWNlTGFzdEZpdmVNaW51dGVzKQpAQCAtMjk1LDYgKzMwMCwyMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICByZXN1bHQgPSBjb21wYXJlRG91YmxlcyhzdHgucGVyY2VudFJlcGFpcmVkLCBzdHkucGVyY2VudFJlcGFpcmVkKTsKICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzb3J0S2V5LmVxdWFscygibWF4X3NzdGFibGVfc2l6ZSIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBzaWduICogc3R4Lm1heFNTVGFibGVTaXplLmNvbXBhcmVUbyhzdHkubWF4U1NUYWJsZVNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHNvcnRLZXkuZXF1YWxzKCJ0d2NzX21heF9kdXJhdGlvbiIpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3R4LnR3Y3NEdXJhdGlvbkluTWlsbGlzICE9IG51bGwgJiYgc3R5LnR3Y3NEdXJhdGlvbkluTWlsbGlzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ247CisgICAgICAgICAgICBlbHNlIGlmIChzdHgudHdjc0R1cmF0aW9uSW5NaWxsaXMgPT0gbnVsbCAmJiBzdHkudHdjc0R1cmF0aW9uSW5NaWxsaXMgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2lnbiAqIC0xOworICAgICAgICAgICAgZWxzZSBpZiAoc3R4LnR3Y3NEdXJhdGlvbkluTWlsbGlzID09IG51bGwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2lnbiAqIHN0eC50d2NzRHVyYXRpb25Jbk1pbGxpcy5jb21wYXJlVG8oc3R5LnR3Y3NEdXJhdGlvbkluTWlsbGlzKTsKKyAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChzb3J0S2V5LmVxdWFscygic3BhY2VfdXNlZF9ieV9zbmFwc2hvdHNfdG90YWwiKSkKICAgICAgICAgewogICAgICAgICAgICAgcmVzdWx0ID0gY29tcGFyZUZpbGVTaXplcyhzdHguc3BhY2VVc2VkQnlTbmFwc2hvdHNUb3RhbCwKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNIb2xkZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNIb2xkZXIuamF2YQppbmRleCA2MDEzMmQxLi44MDY2MDYxMSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvVGFibGVTdGF0c0hvbGRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNIb2xkZXIuamF2YQpAQCAtMjUsNyArMjUsMTIgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkFycmF5TGlzdE11bHRpbWFwOwogCiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnRpbWUuRHVyYXRpb25Gb3JtYXRVdGlsczsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5UaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy4qOwpAQCAtMzMsNyArMzgsNyBAQAogcHVibGljIGNsYXNzIFRhYmxlU3RhdHNIb2xkZXIgaW1wbGVtZW50cyBTdGF0c0hvbGRlcgogewogICAgIHB1YmxpYyBmaW5hbCBMaXN0PFN0YXRzS2V5c3BhY2U+IGtleXNwYWNlczsKLSAgICBwdWJsaWMgZmluYWwgaW50IG51bWJlck9mVGFibGVzOworICAgIHB1YmxpYyBpbnQgbnVtYmVyT2ZUYWJsZXMgPSAwOwogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGh1bWFuUmVhZGFibGU7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBzb3J0S2V5OwogICAgIHB1YmxpYyBmaW5hbCBpbnQgdG9wOwpAQCAtNDgsMTQgKzUzLDcgQEAKICAgICAgICAgdGhpcy5sb2NhdGlvbkNoZWNrID0gbG9jYXRpb25DaGVjazsKIAogICAgICAgICBpZiAoIXRoaXMuaXNUZXN0VGFibGVTdGF0c0hvbGRlcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm51bWJlck9mVGFibGVzID0gcHJvYmUuZ2V0TnVtYmVyT2ZUYWJsZXMoKTsKICAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZUtleXNwYWNlcyhwcm9iZSwgaWdub3JlLCB0YWJsZU5hbWVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMubnVtYmVyT2ZUYWJsZXMgPSAwOwotICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMjMsNiArMTIxLDggQEAKICAgICAgICAgbXBUYWJsZS5wdXQoIm9sZF9zc3RhYmxlX2NvdW50IiwgdGFibGUub2xkU1NUYWJsZUNvdW50KTsKICAgICAgICAgbXBUYWJsZS5wdXQoInNzdGFibGVzX2luX2VhY2hfbGV2ZWwiLCB0YWJsZS5zc3RhYmxlc0luRWFjaExldmVsKTsKICAgICAgICAgbXBUYWJsZS5wdXQoInNzdGFibGVfYnl0ZXNfaW5fZWFjaF9sZXZlbCIsIHRhYmxlLnNzdGFibGVCeXRlc0luRWFjaExldmVsKTsKKyAgICAgICAgbXBUYWJsZS5wdXQoIm1heF9zc3RhYmxlX3NpemUiLCB0YWJsZS5tYXhTU1RhYmxlU2l6ZSk7CisgICAgICAgIG1wVGFibGUucHV0KCJ0d2NzIiwgdGFibGUudHdjcyk7CiAgICAgICAgIG1wVGFibGUucHV0KCJzcGFjZV91c2VkX2xpdmUiLCB0YWJsZS5zcGFjZVVzZWRMaXZlKTsKICAgICAgICAgbXBUYWJsZS5wdXQoInNwYWNlX3VzZWRfdG90YWwiLCB0YWJsZS5zcGFjZVVzZWRUb3RhbCk7CiAgICAgICAgIG1wVGFibGUucHV0KCJzcGFjZV91c2VkX2J5X3NuYXBzaG90c190b3RhbCIsIHRhYmxlLnNwYWNlVXNlZEJ5U25hcHNob3RzVG90YWwpOwpAQCAtMTM5LDYgKzEzOSw3IEBACiAgICAgICAgIG1wVGFibGUucHV0KCJsb2NhbF9yZWFkX2xhdGVuY3lfbXMiLCBTdHJpbmcuZm9ybWF0KCIlMDEuM2YiLCB0YWJsZS5sb2NhbFJlYWRMYXRlbmN5TXMpKTsKICAgICAgICAgbXBUYWJsZS5wdXQoImxvY2FsX3dyaXRlX2NvdW50IiwgdGFibGUubG9jYWxXcml0ZUNvdW50KTsKICAgICAgICAgbXBUYWJsZS5wdXQoImxvY2FsX3dyaXRlX2xhdGVuY3lfbXMiLCBTdHJpbmcuZm9ybWF0KCIlMDEuM2YiLCB0YWJsZS5sb2NhbFdyaXRlTGF0ZW5jeU1zKSk7CisgICAgICAgIG1wVGFibGUucHV0KCJsb2NhbF9yZWFkX3dyaXRlX3JhdGlvIiwgU3RyaW5nLmZvcm1hdCgiJTAxLjVmIiwgdGFibGUubG9jYWxSZWFkV3JpdGVSYXRpbykpOwogICAgICAgICBtcFRhYmxlLnB1dCgicGVuZGluZ19mbHVzaGVzIiwgdGFibGUucGVuZGluZ0ZsdXNoZXMpOwogICAgICAgICBtcFRhYmxlLnB1dCgicGVyY2VudF9yZXBhaXJlZCIsIHRhYmxlLnBlcmNlbnRSZXBhaXJlZCk7CiAgICAgICAgIG1wVGFibGUucHV0KCJieXRlc19yZXBhaXJlZCIsIHRhYmxlLmJ5dGVzUmVwYWlyZWQpOwpAQCAtMjA1LDYgKzIwNiw4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBudW1iZXJPZlRhYmxlcyA9IHNlbGVjdGVkVGFibGVNYmVhbnMuc2l6ZSgpOworCiAgICAgICAgIC8vIG1ha2Ugc3VyZSBhbGwgc3BlY2lmaWVkIGtleXNwYWNlIGFuZCB0YWJsZXMgZXhpc3QKICAgICAgICAgZmlsdGVyLnZlcmlmeUtleXNwYWNlcyhwcm9iZS5nZXRLZXlzcGFjZXMoKSk7CiAgICAgICAgIGZpbHRlci52ZXJpZnlUYWJsZXMoKTsKQEAgLTIyNyw2ICsyMzAsOCBAQAogICAgICAgICAgICAgICAgIHN0YXRzVGFibGUuaXNJbmRleCA9IHRhYmxlTmFtZS5jb250YWlucygiLiIpOwogICAgICAgICAgICAgICAgIHN0YXRzVGFibGUuc3N0YWJsZUNvdW50ID0gcHJvYmUuZ2V0Q29sdW1uRmFtaWx5TWV0cmljKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCAiTGl2ZVNTVGFibGVDb3VudCIpOwogICAgICAgICAgICAgICAgIHN0YXRzVGFibGUub2xkU1NUYWJsZUNvdW50ID0gcHJvYmUuZ2V0Q29sdW1uRmFtaWx5TWV0cmljKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCAiT2xkVmVyc2lvblNTVGFibGVDb3VudCIpOworICAgICAgICAgICAgICAgIExvbmcgc3N0YWJsZVNpemUgPSAoTG9uZykgcHJvYmUuZ2V0Q29sdW1uRmFtaWx5TWV0cmljKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lLCAiTWF4U1NUYWJsZVNpemUiKTsKKyAgICAgICAgICAgICAgICBzdGF0c1RhYmxlLm1heFNTVGFibGVTaXplID0gc3N0YWJsZVNpemUgPT0gbnVsbCA/IDAgOiBzc3RhYmxlU2l6ZTsKIAogICAgICAgICAgICAgICAgIGludFtdIGxldmVsZWRTU3RhYmxlcyA9IHRhYmxlLmdldFNTVGFibGVDb3VudFBlckxldmVsKCk7CiAgICAgICAgICAgICAgICAgaWYgKGxldmVsZWRTU3RhYmxlcyAhPSBudWxsKQpAQCAtMjQzLDYgKzI0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0c1RhYmxlLnNzdGFibGVzSW5FYWNoTGV2ZWwuYWRkKGNvdW50ICsgKChjb3VudCA+IG1heENvdW50KSA/ICIvIiArIG1heENvdW50IDogIiIpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0c1RhYmxlLnNzdGFibGVDb3VudFBlclRXQ1NCdWNrZXQgPSB0YWJsZS5nZXRTU1RhYmxlQ291bnRQZXJUV0NTQnVja2V0KCk7CiAKICAgICAgICAgICAgICAgICBsb25nW10gbGV2ZWxlZFNTVGFibGVzQnl0ZXMgPSB0YWJsZS5nZXRQZXJMZXZlbFNpemVCeXRlcygpOwogICAgICAgICAgICAgICAgIGlmIChsZXZlbGVkU1NUYWJsZXNCeXRlcyAhPSBudWxsKQpAQCAtMjkwLDYgKzI5Niw5IEBACiAgICAgICAgICAgICAgICAgc3RhdHNUYWJsZS5zcGFjZVVzZWRMaXZlID0gZm9ybWF0KChMb25nKSBwcm9iZS5nZXRDb2x1bW5GYW1pbHlNZXRyaWMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsICJMaXZlRGlza1NwYWNlVXNlZCIpLCBodW1hblJlYWRhYmxlKTsKICAgICAgICAgICAgICAgICBzdGF0c1RhYmxlLnNwYWNlVXNlZFRvdGFsID0gZm9ybWF0KChMb25nKSBwcm9iZS5nZXRDb2x1bW5GYW1pbHlNZXRyaWMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsICJUb3RhbERpc2tTcGFjZVVzZWQiKSwgaHVtYW5SZWFkYWJsZSk7CiAgICAgICAgICAgICAgICAgc3RhdHNUYWJsZS5zcGFjZVVzZWRCeVNuYXBzaG90c1RvdGFsID0gZm9ybWF0KChMb25nKSBwcm9iZS5nZXRDb2x1bW5GYW1pbHlNZXRyaWMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsICJTbmFwc2hvdHNTaXplIiksIGh1bWFuUmVhZGFibGUpOworCisgICAgICAgICAgICAgICAgbWF5YmVBZGRUV0NTV2luZG93V2l0aE1heER1cmF0aW9uKHN0YXRzVGFibGUsIHByb2JlLCBrZXlzcGFjZU5hbWUsIHRhYmxlTmFtZSk7CisKICAgICAgICAgICAgICAgICBpZiAob2ZmSGVhcFNpemUgIT0gbnVsbCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRzVGFibGUub2ZmSGVhcFVzZWQgPSB0cnVlOwpAQCAtMzMwLDYgKzMzOSw5IEBACiAKICAgICAgICAgICAgICAgICBkb3VibGUgbG9jYWxXcml0ZUxhdGVuY3kgPSAoKENhc3NhbmRyYU1ldHJpY3NSZWdpc3RyeS5KbXhUaW1lck1CZWFuKSBwcm9iZS5nZXRDb2x1bW5GYW1pbHlNZXRyaWMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsICJXcml0ZUxhdGVuY3kiKSkuZ2V0TWVhbigpIC8gMTAwMDsKICAgICAgICAgICAgICAgICBkb3VibGUgbG9jYWxXTGF0ZW5jeSA9IGxvY2FsV3JpdGVMYXRlbmN5ID4gMCA/IGxvY2FsV3JpdGVMYXRlbmN5IDogRG91YmxlLk5hTjsKKworICAgICAgICAgICAgICAgIHN0YXRzVGFibGUubG9jYWxSZWFkV3JpdGVSYXRpbyA9IHN0YXRzVGFibGUubG9jYWxXcml0ZUNvdW50ID4gMCA/IHN0YXRzVGFibGUubG9jYWxSZWFkQ291bnQgLyAoZG91YmxlKSBzdGF0c1RhYmxlLmxvY2FsV3JpdGVDb3VudCA6IDA7CisKICAgICAgICAgICAgICAgICBzdGF0c1RhYmxlLmxvY2FsV3JpdGVMYXRlbmN5TXMgPSBsb2NhbFdMYXRlbmN5OwogICAgICAgICAgICAgICAgIHN0YXRzVGFibGUucGVuZGluZ0ZsdXNoZXMgPSBwcm9iZS5nZXRDb2x1bW5GYW1pbHlNZXRyaWMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsICJQZW5kaW5nRmx1c2hlcyIpOwogCkBAIC0zNzksNiArMzkxLDI3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVBZGRUV0NTV2luZG93V2l0aE1heER1cmF0aW9uKFN0YXRzVGFibGUgc3RhdHNUYWJsZSwgTm9kZVByb2JlIHByb2JlLCBTdHJpbmcga2V5c3BhY2VOYW1lLCBTdHJpbmcgdGFibGVOYW1lKQorICAgIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBjb21wYWN0aW9uUGFyYW1ldGVycyA9IHByb2JlLmdldENmc1Byb3h5KHN0YXRzVGFibGUua2V5c3BhY2VOYW1lLCBzdGF0c1RhYmxlLnRhYmxlTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENvbXBhY3Rpb25QYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgaWYgKGNvbXBhY3Rpb25QYXJhbWV0ZXJzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU3RyaW5nIGNvbXBhY3RvciA9IGNvbXBhY3Rpb25QYXJhbWV0ZXJzLmdldCgiY2xhc3MiKTsKKworICAgICAgICBpZiAoY29tcGFjdG9yID09IG51bGwgfHwgIWNvbXBhY3Rvci5lbmRzV2l0aChUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgU3RyaW5nIHVuaXQgPSBjb21wYWN0aW9uUGFyYW1ldGVycy5nZXQoVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuQ09NUEFDVElPTl9XSU5ET1dfVU5JVF9LRVkpOworICAgICAgICBTdHJpbmcgc2l6ZSA9IGNvbXBhY3Rpb25QYXJhbWV0ZXJzLmdldChUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5DT01QQUNUSU9OX1dJTkRPV19TSVpFX0tFWSk7CisKKyAgICAgICAgc3RhdHNUYWJsZS50d2NzRHVyYXRpb25Jbk1pbGxpcyA9IChMb25nKSBwcm9iZS5nZXRDb2x1bW5GYW1pbHlNZXRyaWMoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUsICJNYXhTU1RhYmxlRHVyYXRpb24iKTsKKyAgICAgICAgU3RyaW5nIG1heER1cmF0aW9uID0gbWlsbGlzVG9EdXJhdGlvbihzdGF0c1RhYmxlLnR3Y3NEdXJhdGlvbkluTWlsbGlzKTsKKyAgICAgICAgc3RhdHNUYWJsZS50d2NzID0gU3RyaW5nLmZvcm1hdCgiJXMgJXMsIG1heCBkdXJhdGlvbjogJXMiLCBzaXplLCB1bml0LCBtYXhEdXJhdGlvbik7CisgICAgfQorCiAgICAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0KGxvbmcgYnl0ZXMsIGJvb2xlYW4gaHVtYW5SZWFkYWJsZSkKICAgICB7CiAgICAgICAgIHJldHVybiBodW1hblJlYWRhYmxlID8gRmlsZVV0aWxzLnN0cmluZ2lmeUZpbGVTaXplKGJ5dGVzKSA6IExvbmcudG9TdHJpbmcoYnl0ZXMpOwpAQCAtNDAwLDYgKzQzMywxMSBAQAogICAgICAgICByZXR1cm4gZGYuZm9ybWF0KG5ldyBEYXRlKG1pbGxpcykpOwogICAgIH0KIAorICAgIHByaXZhdGUgU3RyaW5nIG1pbGxpc1RvRHVyYXRpb24obG9uZyBtaWxsaXMpCisgICAgeworICAgICAgICByZXR1cm4gRHVyYXRpb25Gb3JtYXRVdGlscy5mb3JtYXREdXJhdGlvbldvcmRzKG1pbGxpcywgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU29ydCBhbmQgZmlsdGVyIHRoaXMgVGFibGVTdGF0SG9sZGVyJ3MgdGFibGVzIGFzIHNwZWNpZmllZCBieSBpdHMgc29ydEtleSBhbmQgdG9wIGF0dHJpYnV0ZXMuCiAgICAgICovCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9UYWJsZVN0YXRzUHJpbnRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvVGFibGVTdGF0c1ByaW50ZXIuamF2YQppbmRleCA3ZjE3YzIxLi5jMzBhYjZkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9UYWJsZVN0YXRzUHJpbnRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNQcmludGVyLmphdmEKQEAgLTUwLDYgKzUwLDkgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHByaW50KFRhYmxlU3RhdHNIb2xkZXIgZGF0YSwgUHJpbnRTdHJlYW0gb3V0KQogICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGF0YS5udW1iZXJPZlRhYmxlcyA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKwogICAgICAgICAgICAgb3V0LnByaW50bG4oIlRvdGFsIG51bWJlciBvZiB0YWJsZXM6ICIgKyBkYXRhLm51bWJlck9mVGFibGVzKTsKICAgICAgICAgICAgIG91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tIik7CiAKQEAgLTU3LDcgKzYwLDcgQEAKICAgICAgICAgICAgIGZvciAoU3RhdHNLZXlzcGFjZSBrZXlzcGFjZSA6IGtleXNwYWNlcykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBwcmludCBlYWNoIGtleXNwYWNlJ3MgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiS2V5c3BhY2UgOiAiICsga2V5c3BhY2UubmFtZSk7CisgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIktleXNwYWNlOiAiICsga2V5c3BhY2UubmFtZSk7CiAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlx0UmVhZCBDb3VudDogIiArIGtleXNwYWNlLnJlYWRDb3VudCk7CiAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIlx0UmVhZCBMYXRlbmN5OiAiICsga2V5c3BhY2UucmVhZExhdGVuY3koKSArICIgbXMiKTsKICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiXHRXcml0ZSBDb3VudDogIiArIGtleXNwYWNlLndyaXRlQ291bnQpOwpAQCAtNjYsNiArNjksOSBAQAogCiAgICAgICAgICAgICAgICAgLy8gcHJpbnQgZWFjaCB0YWJsZSdzIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgTGlzdDxTdGF0c1RhYmxlPiB0YWJsZXMgPSBrZXlzcGFjZS50YWJsZXM7CisgICAgICAgICAgICAgICAgaWYgKHRhYmxlcy5zaXplKCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKICAgICAgICAgICAgICAgICBmb3IgKFN0YXRzVGFibGUgdGFibGUgOiB0YWJsZXMpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBwcmludFN0YXRzVGFibGUodGFibGUsIHRhYmxlLnRhYmxlTmFtZSwgIlx0XHQiLCBvdXQpOwpAQCAtNzksNiArODUsOSBAQAogICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIlRhYmxlIiArICh0YWJsZS5pc0luZGV4ID8gIiAoaW5kZXgpOiAiIDogIjogIikgKyB0YWJsZURpc3BsYXlOYW1lKTsKICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJTU1RhYmxlIGNvdW50OiAiICsgdGFibGUuc3N0YWJsZUNvdW50KTsKICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJPbGQgU1NUYWJsZSBjb3VudDogIiArIHRhYmxlLm9sZFNTVGFibGVDb3VudCk7CisgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiTWF4IFNTVGFibGUgc2l6ZTogIiArIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KHRhYmxlLm1heFNTVGFibGVTaXplKSk7CisgICAgICAgICAgICBpZiAodGFibGUudHdjcyAhPSBudWxsKQorICAgICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJTU1RhYmxlcyBUaW1lIFdpbmRvdzogIiArIHRhYmxlLnR3Y3MpOwogICAgICAgICAgICAgaWYgKHRhYmxlLmlzTGV2ZWxlZFNzdGFibGUpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIlNTVGFibGVzIGluIGVhY2ggbGV2ZWw6IFsiICsgU3RyaW5nLmpvaW4oIiwgIiwKQEAgLTkzLDcgKzEwMiw3IEBACiAKICAgICAgICAgICAgIGlmICh0YWJsZS5vZmZIZWFwVXNlZCkKICAgICAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiT2ZmIGhlYXAgbWVtb3J5IHVzZWQgKHRvdGFsKTogIiArIHRhYmxlLm9mZkhlYXBNZW1vcnlVc2VkVG90YWwpOwotICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIlNTVGFibGUgQ29tcHJlc3Npb24gUmF0aW86ICIgKyB0YWJsZS5zc3RhYmxlQ29tcHJlc3Npb25SYXRpbyk7CisgICAgICAgICAgICBvdXQucHJpbnRmKGluZGVudCArICJTU1RhYmxlIENvbXByZXNzaW9uIFJhdGlvOiAlMDEuNWYlbiIsIHRhYmxlLnNzdGFibGVDb21wcmVzc2lvblJhdGlvKTsKICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJOdW1iZXIgb2YgcGFydGl0aW9ucyAoZXN0aW1hdGUpOiAiICsgdGFibGUubnVtYmVyT2ZQYXJ0aXRpb25zRXN0aW1hdGUpOwogICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIk1lbXRhYmxlIGNlbGwgY291bnQ6ICIgKyB0YWJsZS5tZW10YWJsZUNlbGxDb3VudCk7CiAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiTWVtdGFibGUgZGF0YSBzaXplOiAiICsgdGFibGUubWVtdGFibGVEYXRhU2l6ZSk7CkBAIC0xMDUsNiArMTE0LDkgQEAKICAgICAgICAgICAgIG91dC5wcmludGYoaW5kZW50ICsgIkxvY2FsIHJlYWQgbGF0ZW5jeTogJTAxLjNmIG1zJW4iLCB0YWJsZS5sb2NhbFJlYWRMYXRlbmN5TXMpOwogICAgICAgICAgICAgb3V0LnByaW50bG4oaW5kZW50ICsgIkxvY2FsIHdyaXRlIGNvdW50OiAiICsgdGFibGUubG9jYWxXcml0ZUNvdW50KTsKICAgICAgICAgICAgIG91dC5wcmludGYoaW5kZW50ICsgIkxvY2FsIHdyaXRlIGxhdGVuY3k6ICUwMS4zZiBtcyVuIiwgdGFibGUubG9jYWxXcml0ZUxhdGVuY3lNcyk7CisKKyAgICAgICAgICAgIG91dC5wcmludGYoaW5kZW50ICsgIkxvY2FsIHJlYWQvd3JpdGUgcmF0aW86ICUwMS41ZiVuIiwgdGFibGUubG9jYWxSZWFkV3JpdGVSYXRpbyk7CisKICAgICAgICAgICAgIG91dC5wcmludGxuKGluZGVudCArICJQZW5kaW5nIGZsdXNoZXM6ICIgKyB0YWJsZS5wZW5kaW5nRmx1c2hlcyk7CiAgICAgICAgICAgICBvdXQucHJpbnRsbihpbmRlbnQgKyAiUGVyY2VudCByZXBhaXJlZDogIiArIHRhYmxlLnBlcmNlbnRSZXBhaXJlZCk7CiAKQEAgLTE2NCw2ICsxNzYsMTAgQEAKICAgICAgICAgcHVibGljIHZvaWQgcHJpbnQoVGFibGVTdGF0c0hvbGRlciBkYXRhLCBQcmludFN0cmVhbSBvdXQpCiAgICAgICAgIHsKICAgICAgICAgICAgIExpc3Q8U3RhdHNUYWJsZT4gdGFibGVzID0gZGF0YS5nZXRTb3J0ZWRGaWx0ZXJlZFRhYmxlcygpOworCisgICAgICAgICAgICBpZiAodGFibGVzLnNpemUoKSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybjsKKwogICAgICAgICAgICAgU3RyaW5nIHRvdGFsVGFibGVzU3VtbWFyeSA9IFN0cmluZy5mb3JtYXQoIlRvdGFsIG51bWJlciBvZiB0YWJsZXM6ICVkIiwgZGF0YS5udW1iZXJPZlRhYmxlcyk7CiAgICAgICAgICAgICBpZiAoZGF0YS50b3AgPiAwKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhY2luZy9UcmFjZVN0YXRlSW1wbC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhY2luZy9UcmFjZVN0YXRlSW1wbC5qYXZhCmluZGV4IGY4NjkxZWUuLjExMzQyMGQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYWNpbmcvVHJhY2VTdGF0ZUltcGwuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFjaW5nL1RyYWNlU3RhdGVJbXBsLmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU3RhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5NdXRhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLk92ZXJsb2FkZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CkBAIC01MCw4ICs1MSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRyYWNlU3RhdGVJbXBsLmNsYXNzKTsKIAogICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHB1YmxpYyBzdGF0aWMgaW50IFdBSVRfRk9SX1BFTkRJTkdfRVZFTlRTX1RJTUVPVVRfU0VDUyA9Ci0gICAgICBJbnRlZ2VyLnBhcnNlSW50KFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLndhaXRfZm9yX3RyYWNpbmdfZXZlbnRzX3RpbWVvdXRfc2VjcyIsICIwIikpOworICAgIHB1YmxpYyBzdGF0aWMgaW50IFdBSVRfRk9SX1BFTkRJTkdfRVZFTlRTX1RJTUVPVVRfU0VDUyA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5XQUlUX0ZPUl9UUkFDSU5HX0VWRU5UU19USU1FT1VUX1NFQ1MuZ2V0SW50KCk7CiAKICAgICBwcml2YXRlIGZpbmFsIFNldDxGdXR1cmU8Pz4+IHBlbmRpbmdGdXR1cmVzID0gQ29uY3VycmVudEhhc2hNYXAubmV3S2V5U2V0KCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYWNpbmcvVHJhY2luZy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhY2luZy9UcmFjaW5nLmphdmEKaW5kZXggNWM4MjBkYi4uNzNjZjJlYiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhY2luZy9UcmFjaW5nLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhY2luZy9UcmFjaW5nLmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KVk1TdGFiaWxpdHlJbnNwZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DVVNUT01fVFJBQ0lOR19DTEFTUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKIAogLyoqCkBAIC0xMTAsMTMgKzExMSwxNCBAQAogICAgIHN0YXRpYwogICAgIHsKICAgICAgICAgVHJhY2luZyB0cmFjaW5nID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIGN1c3RvbVRyYWNpbmdDbGFzcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmN1c3RvbV90cmFjaW5nX2NsYXNzIik7CisgICAgICAgIFN0cmluZyBjdXN0b21UcmFjaW5nQ2xhc3MgPSBDVVNUT01fVFJBQ0lOR19DTEFTUy5nZXRTdHJpbmcoKTsKICAgICAgICAgaWYgKG51bGwgIT0gY3VzdG9tVHJhY2luZ0NsYXNzKQogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB0cmFjaW5nID0gRkJVdGlsaXRpZXMuY29uc3RydWN0KGN1c3RvbVRyYWNpbmdDbGFzcywgIlRyYWNpbmciKTsKLSAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiVXNpbmcge30gYXMgdHJhY2luZyBxdWVyaWVzIChhcyByZXF1ZXN0ZWQgd2l0aCAtRGNhc3NhbmRyYS5jdXN0b21fdHJhY2luZ19jbGFzcykiLCBjdXN0b21UcmFjaW5nQ2xhc3MpOworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJVc2luZyB0aGUge30gY2xhc3MgdG8gdHJhY2UgcXVlcmllcyAoYXMgcmVxdWVzdGVkIGJ5IHRoZSB7fSBzeXN0ZW0gcHJvcGVydHkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21UcmFjaW5nQ2xhc3MsIENVU1RPTV9UUkFDSU5HX0NMQVNTLmdldEtleSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9DQlV0aWwuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9DQlV0aWwuamF2YQppbmRleCA2Y2FiNjM4Li5kNDdmMGNlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvQ0JVdGlsLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L0NCVXRpbC5qYXZhCkBAIC0zMiwyMCArMzIsMjEgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwotCiBpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWY7CiBpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWZBbGxvY2F0b3I7CiBpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWZVdGlsOwogaW1wb3J0IGlvLm5ldHR5LmJ1ZmZlci5Qb29sZWRCeXRlQnVmQWxsb2NhdG9yOwogaW1wb3J0IGlvLm5ldHR5LmJ1ZmZlci5VbnBvb2xlZEJ5dGVCdWZBbGxvY2F0b3I7CiBpbXBvcnQgaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZhc3RUaHJlYWRMb2NhbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbnNpc3RlbmN5TGV2ZWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVVVJREdlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTWVtb3J5VXRpbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9ORVRUWV9VU0VfSEVBUF9BTExPQ0FUT1I7CiAKIC8qKgogICogQnl0ZUJ1ZiB1dGlsaXR5IG1ldGhvZHMuCkBAIC01Niw3ICs1Nyw3IEBACiAgKi8KIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDQlV0aWwKIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX0hFQVBfQUxMT0NBVE9SID0gQm9vbGVhbi5nZXRCb29sZWFuKENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAibmV0dHlfdXNlX2hlYXBfYWxsb2NhdG9yIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9IRUFQX0FMTE9DQVRPUiA9IENBU1NBTkRSQV9ORVRUWV9VU0VfSEVBUF9BTExPQ0FUT1IuZ2V0Qm9vbGVhbigpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQnl0ZUJ1ZkFsbG9jYXRvciBhbGxvY2F0b3IgPSBVU0VfSEVBUF9BTExPQ0FUT1IgPyBuZXcgVW5wb29sZWRCeXRlQnVmQWxsb2NhdG9yKGZhbHNlKSA6IG5ldyBQb29sZWRCeXRlQnVmQWxsb2NhdG9yKHRydWUpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVVUlEX1NJWkUgPSAxNjsKIApAQCAtNjksNiArNzAsMTUgQEAKICAgICAgICAgfQogICAgIH07CiAKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBGYXN0VGhyZWFkTG9jYWw8Qnl0ZUJ1ZmZlcj4gbG9jYWxEaXJlY3RCdWZmZXIgPSBuZXcgRmFzdFRocmVhZExvY2FsPEJ5dGVCdWZmZXI+KCkKKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBpbml0aWFsVmFsdWUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTWVtb3J5VXRpbC5nZXRIb2xsb3dEaXJlY3RCeXRlQnVmZmVyKCk7CisgICAgICAgIH0KKyAgICB9OworCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgRmFzdFRocmVhZExvY2FsPENoYXJCdWZmZXI+IFRMX0NIQVJfQlVGRkVSID0gbmV3IEZhc3RUaHJlYWRMb2NhbDw+KCk7CiAKICAgICBwcml2YXRlIENCVXRpbCgpIHt9CkBAIC00NzgsNyArNDg4LDM1IEBACiAgICAgICAgIGNiLndyaXRlSW50KHJlbWFpbmluZyk7CiAKICAgICAgICAgaWYgKHJlbWFpbmluZyA+IDApCi0gICAgICAgICAgICBjYi53cml0ZUJ5dGVzKGJ5dGVzLmR1cGxpY2F0ZSgpKTsKKyAgICAgICAgICAgIGFkZEJ5dGVzKGJ5dGVzLCBjYik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZEJ5dGVzKEJ5dGVCdWZmZXIgc3JjLCBCeXRlQnVmIGRlc3QpCisgICAgeworICAgICAgICBpZiAoc3JjLnJlbWFpbmluZygpID09IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaW50IGxlbmd0aCA9IHNyYy5yZW1haW5pbmcoKTsKKworICAgICAgICBpZiAoc3JjLmhhc0FycmF5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEhlYXAgYnVmZmVycyBhcmUgY29waWVkIHVzaW5nIGEgcmF3IGFycmF5IGluc3RlYWQgb2Ygc2hhcmVkIGhlYXAgYnVmZmVyIGFuZCBNZW1vcnlVdGlsLnVuc2FmZSB0byBhdm9pZCBhIENNUyBidWcsIHdoaWNoIGNhdXNlcyB0aGUgSlZNIHRvIGNyYXNoIHdpdGggdGhlIGZvbGx3aW5nOgorICAgICAgICAgICAgLy8gIyBQcm9ibGVtYXRpYyBmcmFtZToKKyAgICAgICAgICAgIC8vICMgViAgW2xpYmp2bS5keWxpYisweDYzZTg1OF0gIHZvaWQgUGFyU2NhbkNsb3N1cmU6OmRvX29vcF93b3JrPHVuc2lnbmVkIGludD4odW5zaWduZWQgaW50KiwgYm9vbCwgYm9vbCkrMHg5NAorICAgICAgICAgICAgLy8gTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBoZXJlOiBodHRwczovL2J1Z3Mub3Blbmpkay5vcmcvYnJvd3NlL0pESy04MjIyNzk4CisgICAgICAgICAgICBieXRlW10gYXJyYXkgPSBzcmMuYXJyYXkoKTsKKyAgICAgICAgICAgIGRlc3Qud3JpdGVCeXRlcyhhcnJheSwgc3JjLmFycmF5T2Zmc2V0KCkgKyBzcmMucG9zaXRpb24oKSwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzcmMuaXNEaXJlY3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBsb2NhbCA9IGdldExvY2FsRGlyZWN0QnVmZmVyKCk7CisgICAgICAgICAgICBNZW1vcnlVdGlsLmR1cGxpY2F0ZURpcmVjdEJ5dGVCdWZmZXIoc3JjLCBsb2NhbCk7CisgICAgICAgICAgICBkZXN0LndyaXRlQnl0ZXMobG9jYWwpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGVzdC53cml0ZUJ5dGVzKHNyYy5kdXBsaWNhdGUoKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGludCBzaXplT2ZWYWx1ZShieXRlW10gYnl0ZXMpCkBAIC02MTQsNCArNjUyLDggQEAKICAgICAgICAgcmV0dXJuIGJ5dGVzOwogICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIEJ5dGVCdWZmZXIgZ2V0TG9jYWxEaXJlY3RCdWZmZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsRGlyZWN0QnVmZmVyLmdldCgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9EaXNwYXRjaGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvRGlzcGF0Y2hlci5qYXZhCmluZGV4IGRhNzljM2QuLmYyMWFjYzIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9EaXNwYXRjaGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L0Rpc3BhdGNoZXIuamF2YQpAQCAtMjMsMTYgKzIzLDE4IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYW5ub3RhdGlvbnMuVmlzaWJsZUZvclRlc3Rpbmc7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVkaWNhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGllbnRNZXRyaWNzOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWw7CiBpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5FdmVudExvb3A7CiBpbXBvcnQgaW8ubmV0dHkudXRpbC5BdHRyaWJ1dGVLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5EZWJ1Z2dhYmxlVGFzay5SdW5uYWJsZURlYnVnZ2FibGVUYXNrOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuTG9jYWxBd2FyZUV4ZWN1dG9yUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2xpZW50TWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuRnJhbWVFbmNvZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50V2FybjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlF1ZXJ5U3RhdGU7CkBAIC00MiwxOSArNDQsMzkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuRXJyb3JNZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5tZXNzYWdlcy5FdmVudE1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1vbm90b25pY0Nsb2NrOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk5vU3BhbUxvZ2dlcjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25jdXJyZW50LlNoYXJlZEV4ZWN1dG9yUG9vbC5TSEFSRUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIAogcHVibGljIGNsYXNzIERpc3BhdGNoZXIKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRGlzcGF0Y2hlci5jbGFzcyk7Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxBd2FyZUV4ZWN1dG9yUGx1cyByZXF1ZXN0RXhlY3V0b3IgPSBTSEFSRUQubmV3RXhlY3V0b3IoRGF0YWJhc2VEZXNjcmlwdG9yLmdldE5hdGl2ZVRyYW5zcG9ydE1heFRocmVhZHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3I6OnNldE5hdGl2ZVRyYW5zcG9ydE1heFRocmVhZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hdGl2ZS1UcmFuc3BvcnQtUmVxdWVzdHMiKTsKKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHN0YXRpYyBmaW5hbCBMb2NhbEF3YXJlRXhlY3V0b3JQbHVzIHJlcXVlc3RFeGVjdXRvciA9IFNIQVJFRC5uZXdFeGVjdXRvcihEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TmF0aXZlVHJhbnNwb3J0TWF4VGhyZWFkcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3I6OnNldE5hdGl2ZVRyYW5zcG9ydE1heFRocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc3BvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0aXZlLVRyYW5zcG9ydC1SZXF1ZXN0cyIpOworCisgICAgLyoqIENBU1NBTkRSQS0xNzgxMjogUmF0ZS1saW1pdCBuZXcgY2xpZW50IGNvbm5lY3Rpb24gc2V0dXAgdG8gYXZvaWQgb3ZlcndoZWxtaW5nIGR1cmluZyBiY3J5cHQKKyAgICAgKgorICAgICAqIGF1dGhFeGVjdXRvciBpcyBhIHNlcGFyYXRlIHRocmVhZCBwb29sIGZvciBoYW5kbGluZyByZXF1ZXN0cyBvbiBjb25uZWN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgYXV0aGVudGljYXRlZC4KKyAgICAgKiBDYWxscyB0byBBVVRIRU5USUNBVEUgY2FuIGJlIGV4cGVuc2l2ZSBpZiB0aGUgbnVtYmVyIG9mIHJvdW5kcyBmb3IgYmNyeXB0IGlzIGNvbmZpZ3VyZWQgdG8gYSBoaWdoIHZhbHVlLAorICAgICAqIHNvIGR1cmluZyBhIGNvbm5lY3Rpb24gc3Rvcm0gY2hlY2tpbmcgdGhlIHBhc3N3b3JkIGhhc2ggd291bGQgc3RhcnZlIGV4aXN0aW5nIGNvbm5lY3RlZCBjbGllbnRzIGZvciBDUFUgYW5kCisgICAgICogdHJpZ2dlciB0aW1lb3V0cyBpZiBvbiB0aGUgc2FtZSB0aHJlYWQgcG9vbCBhcyBzdGFuZGFyZCByZXF1ZXN0cy4KKyAgICAgKgorICAgICAqIE1vdmluZyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0cyB0byBhIHNtYWxsLCBzZXBhcmF0ZSBwb29sIHByZXZlbnRzIHN0YXJ2YXRpb24gaGFuZGxpbmcgYWxsIG90aGVyCisgICAgICogcmVxdWVzdHMuIElmIHRoZSBhdXRoRXhlY3V0b3IgcG9vbCBiYWNrcyB1cCwgaXQgbWF5IGNhdXNlIGF1dGhlbnRpY2F0aW9uIHRpbWVvdXRzIGJ1dCB0aGUgY2xpZW50cyBzaG91bGQKKyAgICAgKiBiYWNrIG9mZiBhbmQgcmV0cnkgd2hpbGUgdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbSBjb250aW51ZXMgdG8gbWFrZSBwcm9ncmVzcy4KKyAgICAgKgorICAgICAqIFNldHRpbmcgbGVzcyB0aGFuIDEgd2lsbCBzZXJ2aWNlIGF1dGggcmVxdWVzdHMgb24gdGhlIHN0YW5kYXJkIHtAbGluayBEaXNwYXRjaGVyI3JlcXVlc3RFeGVjdXRvcn0KKyAgICAgKi8KKyAgICBAVmlzaWJsZUZvclRlc3RpbmcKKyAgICBzdGF0aWMgZmluYWwgTG9jYWxBd2FyZUV4ZWN1dG9yUGx1cyBhdXRoRXhlY3V0b3IgPSBTSEFSRUQubmV3RXhlY3V0b3IoTWF0aC5tYXgoMSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldE5hdGl2ZVRyYW5zcG9ydE1heEF1dGhUaHJlYWRzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3I6OnNldE5hdGl2ZVRyYW5zcG9ydE1heEF1dGhUaHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hdGl2ZS1UcmFuc3BvcnQtQXV0aC1SZXF1ZXN0cyIpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudE1hcDxFdmVudExvb3AsIEZsdXNoZXI+IGZsdXNoZXJMb29rdXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwogICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiB1c2VMZWdhY3lGbHVzaGVyOwpAQCAtNzksMTcgKzEwMSw2NyBAQAogCiAgICAgcHVibGljIHZvaWQgZGlzcGF0Y2goQ2hhbm5lbCBjaGFubmVsLCBNZXNzYWdlLlJlcXVlc3QgcmVxdWVzdCwgRmx1c2hJdGVtQ29udmVydGVyIGZvckZsdXNoZXIsIE92ZXJsb2FkIGJhY2twcmVzc3VyZSkKICAgICB7Ci0gICAgICAgIHJlcXVlc3RFeGVjdXRvci5zdWJtaXQoKCkgLT4gcHJvY2Vzc1JlcXVlc3QoY2hhbm5lbCwgcmVxdWVzdCwgZm9yRmx1c2hlciwgYmFja3ByZXNzdXJlKSk7CisgICAgICAgIC8vIGlmIG5hdGl2ZV90cmFuc3BvcnRfbWF4X2F1dGhfdGhyZWFkcyBpcyA8IDEsIGRvbid0IGRlbGVnYXRlIHRvIG5ldyBwb29sIG9uIGF1dGggbWVzc2FnZXMKKyAgICAgICAgYm9vbGVhbiBpc0F1dGhRdWVyeSA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXROYXRpdmVUcmFuc3BvcnRNYXhBdXRoVGhyZWFkcygpID4gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcXVlc3QudHlwZSA9PSBNZXNzYWdlLlR5cGUuQVVUSF9SRVNQT05TRSB8fCByZXF1ZXN0LnR5cGUgPT0gTWVzc2FnZS5UeXBlLkNSRURFTlRJQUxTKTsKKworICAgICAgICAvLyBJbXBvcnRhbnRseSwgdGhlIGF1dGhFeGVjdXRvciB3aWxsIGhhbmRsZSB0aGUgQVVUSEVOVElDQVRFIG1lc3NhZ2Ugd2hpY2ggbWF5IGJlIENQVSBpbnRlbnNpdmUuCisgICAgICAgIExvY2FsQXdhcmVFeGVjdXRvclBsdXMgZXhlY3V0b3IgPSBpc0F1dGhRdWVyeSA/IGF1dGhFeGVjdXRvciA6IHJlcXVlc3RFeGVjdXRvcjsKKworICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJlcXVlc3RQcm9jZXNzb3IoY2hhbm5lbCwgcmVxdWVzdCwgZm9yRmx1c2hlciwgYmFja3ByZXNzdXJlKSk7CiAgICAgICAgIENsaWVudE1ldHJpY3MuaW5zdGFuY2UubWFya1JlcXVlc3REaXNwYXRjaGVkKCk7CiAgICAgfQogCisgICAgcHVibGljIGNsYXNzIFJlcXVlc3RQcm9jZXNzb3IgaW1wbGVtZW50cyBSdW5uYWJsZURlYnVnZ2FibGVUYXNrCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIENoYW5uZWwgY2hhbm5lbDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlLlJlcXVlc3QgcmVxdWVzdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGbHVzaEl0ZW1Db252ZXJ0ZXIgZm9yRmx1c2hlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPdmVybG9hZCBiYWNrcHJlc3N1cmU7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgYXBwcm94Q3JlYXRpb25UaW1lTmFub3MgPSBNb25vdG9uaWNDbG9jay5HbG9iYWwuYXBwcm94VGltZS5ub3coKTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIGFwcHJveFN0YXJ0VGltZU5hbm9zOworICAgICAgICAKKyAgICAgICAgcHVibGljIFJlcXVlc3RQcm9jZXNzb3IoQ2hhbm5lbCBjaGFubmVsLCBNZXNzYWdlLlJlcXVlc3QgcmVxdWVzdCwgRmx1c2hJdGVtQ29udmVydGVyIGZvckZsdXNoZXIsIE92ZXJsb2FkIGJhY2twcmVzc3VyZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgICAgICB0aGlzLmZvckZsdXNoZXIgPSBmb3JGbHVzaGVyOworICAgICAgICAgICAgdGhpcy5iYWNrcHJlc3N1cmUgPSBiYWNrcHJlc3N1cmU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKKyAgICAgICAgeworICAgICAgICAgICAgYXBwcm94U3RhcnRUaW1lTmFub3MgPSBNb25vdG9uaWNDbG9jay5HbG9iYWwuYXBwcm94VGltZS5ub3coKTsKKyAgICAgICAgICAgIHByb2Nlc3NSZXF1ZXN0KGNoYW5uZWwsIHJlcXVlc3QsIGZvckZsdXNoZXIsIGJhY2twcmVzc3VyZSwgYXBwcm94U3RhcnRUaW1lTmFub3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGNyZWF0aW9uVGltZU5hbm9zKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFwcHJveENyZWF0aW9uVGltZU5hbm9zOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHN0YXJ0VGltZU5hbm9zKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGFwcHJveFN0YXJ0VGltZU5hbm9zOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVzY3JpcHRpb24oKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTm90ZTogdGhpcyBtZXRob2QgbWF5IGJlIGV4ZWN1dGVkIG9uIHRoZSBuZXR0eSBldmVudCBsb29wLCBkdXJpbmcgaW5pdGlhbCBwcm90b2NvbCBuZWdvdGlhdGlvbjsgdGhlIGNhbGxlciBpcwogICAgICAqIHJlc3BvbnNpYmxlIGZvciBjbGVhbmluZyB1cCBhbnkgZ2xvYmFsIG9yIHRocmVhZC1sb2NhbCBzdGF0ZS4gKGV4LiB0cmFjaW5nLCBjbGllbnQgd2FybmluZ3MsIGV0Yy4pLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE1lc3NhZ2UuUmVzcG9uc2UgcHJvY2Vzc1JlcXVlc3QoU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBNZXNzYWdlLlJlcXVlc3QgcmVxdWVzdCwgT3ZlcmxvYWQgYmFja3ByZXNzdXJlKQorICAgIHByaXZhdGUgc3RhdGljIE1lc3NhZ2UuUmVzcG9uc2UgcHJvY2Vzc1JlcXVlc3QoU2VydmVyQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBNZXNzYWdlLlJlcXVlc3QgcmVxdWVzdCwgT3ZlcmxvYWQgYmFja3ByZXNzdXJlLCBsb25nIHN0YXJ0VGltZU5hbm9zKQogICAgIHsKLSAgICAgICAgbG9uZyBxdWVyeVN0YXJ0TmFub1RpbWUgPSBuYW5vVGltZSgpOwogICAgICAgICBpZiAoY29ubmVjdGlvbi5nZXRWZXJzaW9uKCkuaXNHcmVhdGVyT3JFcXVhbFRvKFByb3RvY29sVmVyc2lvbi5WNCkpCiAgICAgICAgICAgICBDbGllbnRXYXJuLmluc3RhbmNlLmNhcHR1cmVXYXJuaW5ncygpOwogCkBAIC0xMTksNyArMTkxLDcgQEAKIAogICAgICAgICBNZXNzYWdlLmxvZ2dlci50cmFjZSgiUmVjZWl2ZWQ6IHt9LCB2PXt9IiwgcmVxdWVzdCwgY29ubmVjdGlvbi5nZXRWZXJzaW9uKCkpOwogICAgICAgICBjb25uZWN0aW9uLnJlcXVlc3RzLmluYygpOwotICAgICAgICBNZXNzYWdlLlJlc3BvbnNlIHJlc3BvbnNlID0gcmVxdWVzdC5leGVjdXRlKHFzdGF0ZSwgcXVlcnlTdGFydE5hbm9UaW1lKTsKKyAgICAgICAgTWVzc2FnZS5SZXNwb25zZSByZXNwb25zZSA9IHJlcXVlc3QuZXhlY3V0ZShxc3RhdGUsIHN0YXJ0VGltZU5hbm9zKTsKIAogICAgICAgICBpZiAocmVxdWVzdC5pc1RyYWNrYWJsZSgpKQogICAgICAgICAgICAgQ29vcmRpbmF0b3JXYXJuaW5ncy5kb25lKCk7CkBAIC0xMzAsMTUgKzIwMiwxNSBAQAogICAgICAgICBjb25uZWN0aW9uLmFwcGx5U3RhdGVUcmFuc2l0aW9uKHJlcXVlc3QudHlwZSwgcmVzcG9uc2UudHlwZSk7CiAgICAgICAgIHJldHVybiByZXNwb25zZTsKICAgICB9Ci0KKyAgICAKICAgICAvKioKICAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCBtYXkgYmUgZXhlY3V0ZWQgb24gdGhlIG5ldHR5IGV2ZW50IGxvb3AuCiAgICAgICovCi0gICAgc3RhdGljIE1lc3NhZ2UuUmVzcG9uc2UgcHJvY2Vzc1JlcXVlc3QoQ2hhbm5lbCBjaGFubmVsLCBNZXNzYWdlLlJlcXVlc3QgcmVxdWVzdCwgT3ZlcmxvYWQgYmFja3ByZXNzdXJlKQorICAgIHN0YXRpYyBNZXNzYWdlLlJlc3BvbnNlIHByb2Nlc3NSZXF1ZXN0KENoYW5uZWwgY2hhbm5lbCwgTWVzc2FnZS5SZXF1ZXN0IHJlcXVlc3QsIE92ZXJsb2FkIGJhY2twcmVzc3VyZSwgbG9uZyBhcHByb3hTdGFydFRpbWVOYW5vcykKICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcHJvY2Vzc1JlcXVlc3QoKFNlcnZlckNvbm5lY3Rpb24pIHJlcXVlc3QuY29ubmVjdGlvbigpLCByZXF1ZXN0LCBiYWNrcHJlc3N1cmUpOworICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXF1ZXN0KChTZXJ2ZXJDb25uZWN0aW9uKSByZXF1ZXN0LmNvbm5lY3Rpb24oKSwgcmVxdWVzdCwgYmFja3ByZXNzdXJlLCBhcHByb3hTdGFydFRpbWVOYW5vcyk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICB7CkBAIC0xNjMsOSArMjM1LDkgQEAKICAgICAvKioKICAgICAgKiBOb3RlOiB0aGlzIG1ldGhvZCBpcyBub3QgZXhwZWN0ZWQgdG8gZXhlY3V0ZSBvbiB0aGUgbmV0dHkgZXZlbnQgbG9vcC4KICAgICAgKi8KLSAgICB2b2lkIHByb2Nlc3NSZXF1ZXN0KENoYW5uZWwgY2hhbm5lbCwgTWVzc2FnZS5SZXF1ZXN0IHJlcXVlc3QsIEZsdXNoSXRlbUNvbnZlcnRlciBmb3JGbHVzaGVyLCBPdmVybG9hZCBiYWNrcHJlc3N1cmUpCisgICAgdm9pZCBwcm9jZXNzUmVxdWVzdChDaGFubmVsIGNoYW5uZWwsIE1lc3NhZ2UuUmVxdWVzdCByZXF1ZXN0LCBGbHVzaEl0ZW1Db252ZXJ0ZXIgZm9yRmx1c2hlciwgT3ZlcmxvYWQgYmFja3ByZXNzdXJlLCBsb25nIGFwcHJveFN0YXJ0VGltZU5hbm9zKQogICAgIHsKLSAgICAgICAgTWVzc2FnZS5SZXNwb25zZSByZXNwb25zZSA9IHByb2Nlc3NSZXF1ZXN0KGNoYW5uZWwsIHJlcXVlc3QsIGJhY2twcmVzc3VyZSk7CisgICAgICAgIE1lc3NhZ2UuUmVzcG9uc2UgcmVzcG9uc2UgPSBwcm9jZXNzUmVxdWVzdChjaGFubmVsLCByZXF1ZXN0LCBiYWNrcHJlc3N1cmUsIGFwcHJveFN0YXJ0VGltZU5hbm9zKTsKICAgICAgICAgRmx1c2hJdGVtPD8+IHRvRmx1c2ggPSBmb3JGbHVzaGVyLnRvRmx1c2hJdGVtKGNoYW5uZWwsIHJlcXVlc3QsIHJlc3BvbnNlKTsKICAgICAgICAgTWVzc2FnZS5sb2dnZXIudHJhY2UoIlJlc3BvbmRpbmc6IHt9LCB2PXt9IiwgcmVzcG9uc2UsIHJlcXVlc3QuY29ubmVjdGlvbigpLmdldFZlcnNpb24oKSk7CiAgICAgICAgIGZsdXNoKHRvRmx1c2gpOwpAQCAtMTg5LDE5ICsyNjEsMTYgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzaHV0ZG93bigpCiAgICAgewotICAgICAgICBpZiAocmVxdWVzdEV4ZWN1dG9yICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcXVlc3RFeGVjdXRvci5zaHV0ZG93bigpOwotICAgICAgICB9CisgICAgICAgIHJlcXVlc3RFeGVjdXRvci5zaHV0ZG93bigpOworICAgICAgICBhdXRoRXhlY3V0b3Iuc2h1dGRvd24oKTsKICAgICB9CiAKLQogICAgIC8qKgogICAgICAqIERpc3BhdGNoZXIgZm9yIEV2ZW50TWVzc2FnZXMuIEluIHtAbGluayBTZXJ2ZXIuQ29ubmVjdGlvblRyYWNrZXIjc2VuZChFdmVudCl9LCB0aGUgc3RyYXRlZ3kKICAgICAgKiBmb3IgZGVsaXZlcmluZyBldmVudHMgdG8gcmVnaXN0ZXJlZCBjbGllbnRzIGlzIGRlcGVuZGVudCBvbiBwcm90b2NvbCB2ZXJzaW9uIGFuZCB0aGUgY29uZmlndXJhdGlvbgogICAgICAqIG9mIHRoZSBwaXBlbGluZS4gRm9yIHY1IGFuZCBuZXdlciBjb25uZWN0aW9ucywgdGhlIGV2ZW50IG1lc3NhZ2UgaXMgZW5jb2RlZCBpbnRvIGFuIEVudmVsb3BlLAogICAgICAqIHdyYXBwZWQgaW4gYSBGbHVzaEl0ZW0gYW5kIHRoZW4gZGVsaXZlcmVkIHZpYSB0aGUgcGlwZWxpbmUncyBmbHVzaGVyLCBpbiBhIHNpbWlsYXIgd2F5IHRvCi0gICAgICogYSBSZXNwb25zZSByZXR1cm5lZCBmcm9tIHtAbGluayAjcHJvY2Vzc1JlcXVlc3QoQ2hhbm5lbCwgTWVzc2FnZS5SZXF1ZXN0LCBGbHVzaEl0ZW1Db252ZXJ0ZXIsIE92ZXJsb2FkKX0uCisgICAgICogYSBSZXNwb25zZSByZXR1cm5lZCBmcm9tIHtAbGluayAjcHJvY2Vzc1JlcXVlc3QoQ2hhbm5lbCwgTWVzc2FnZS5SZXF1ZXN0LCBGbHVzaEl0ZW1Db252ZXJ0ZXIsIE92ZXJsb2FkLCBsb25nKX0uCiAgICAgICogSXQncyB3b3J0aCBub3RpbmcgdGhhdCBldmVudHMgYXJlIG5vdCBnZW5lcmFsbHkgZmlyZWQgYXMgYSBkaXJlY3QgcmVzcG9uc2UgdG8gYSBjbGllbnQgcmVxdWVzdCwKICAgICAgKiBzbyB0aGlzIGZsdXNoIGl0ZW0gaGFzIGEgbnVsbCByZXF1ZXN0IGF0dHJpYnV0ZS4gVGhlIGRpc3BhdGNoZXIgaXRzZWxmIGlzIGNyZWF0ZWQgd2hlbiB0aGUKICAgICAgKiBwaXBlbGluZSBpcyBmaXJzdCBjb25maWd1cmVkIGR1cmluZyBwcm90b2NvbCBuZWdvdGlhdGlvbiBhbmQgaXMgYXR0YWNoZWQgdG8gdGhlIGNoYW5uZWwgZm9yCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvSW5pdGlhbENvbm5lY3Rpb25IYW5kbGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvSW5pdGlhbENvbm5lY3Rpb25IYW5kbGVyLmphdmEKaW5kZXggNzVjYjcyZS4uZTRjZmY5OSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L0luaXRpYWxDb25uZWN0aW9uSGFuZGxlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9Jbml0aWFsQ29ubmVjdGlvbkhhbmRsZXIuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuQ2xpZW50UmVzb3VyY2VMaW1pdHMuT3ZlcmxvYWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTW9ub3RvbmljQ2xvY2s7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIApAQCAtMTQ4LDcgKzE0OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gbmV3IFZvaWRDaGFubmVsUHJvbWlzZShjdHguY2hhbm5lbCgpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlLlJlc3BvbnNlIHJlc3BvbnNlID0gRGlzcGF0Y2hlci5wcm9jZXNzUmVxdWVzdChjdHguY2hhbm5lbCgpLCBzdGFydHVwLCBPdmVybG9hZC5OT05FKTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBhcHByb3hTdGFydFRpbWVOYW5vcyA9IE1vbm90b25pY0Nsb2NrLkdsb2JhbC5hcHByb3hUaW1lLm5vdygpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlLlJlc3BvbnNlIHJlc3BvbnNlID0gRGlzcGF0Y2hlci5wcm9jZXNzUmVxdWVzdChjdHguY2hhbm5lbCgpLCBzdGFydHVwLCBPdmVybG9hZC5OT05FLCBhcHByb3hTdGFydFRpbWVOYW5vcyk7CisKICAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmQgPSByZXNwb25zZS5lbmNvZGUoaW5ib3VuZC5oZWFkZXIudmVyc2lvbik7CiAgICAgICAgICAgICAgICAgICAgIGN0eC53cml0ZUFuZEZsdXNoKG91dGJvdW5kLCBwcm9taXNlKTsKICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnRyYWNlKCJDb25maWd1cmVkIHBpcGVsaW5lOiB7fSIsIGN0eC5waXBlbGluZSgpKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9NZXNzYWdlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvTWVzc2FnZS5qYXZhCmluZGV4IDc1Yzk5N2UuLjgyMDE1YzEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9NZXNzYWdlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L01lc3NhZ2UuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYWNpbmcuVHJhY2luZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlF1ZXJ5U3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUmVmbGVjdGlvblV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZVVVSUQ7CkBAIC0xMzIsNyArMTMzLDcgQEAKICAgICAgICAgICAgIENvZGVjPD8+IG9yaWdpbmFsID0gdGhpcy5jb2RlYzsKICAgICAgICAgICAgIEZpZWxkIGZpZWxkID0gVHlwZS5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJjb2RlYyIpOwogICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIEZpZWxkIG1vZGlmaWVycyA9IEZpZWxkLmNsYXNzLmdldERlY2xhcmVkRmllbGQoIm1vZGlmaWVycyIpOworICAgICAgICAgICAgRmllbGQgbW9kaWZpZXJzID0gUmVmbGVjdGlvblV0aWxzLmdldE1vZGlmaWVyc0ZpZWxkKCk7CiAgICAgICAgICAgICBtb2RpZmllcnMuc2V0QWNjZXNzaWJsZSh0cnVlKTsKICAgICAgICAgICAgIG1vZGlmaWVycy5zZXRJbnQoZmllbGQsIGZpZWxkLmdldE1vZGlmaWVycygpICYgfk1vZGlmaWVyLkZJTkFMKTsKICAgICAgICAgICAgIGZpZWxkLnNldCh0aGlzLCBjb2RlYyk7CkBAIC0xOTMsNyArMTk0LDggQEAKICAgICAgICAgdGhpcy5jdXN0b21QYXlsb2FkID0gY3VzdG9tUGF5bG9hZDsKICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIGRlYnVnU3RyaW5nKCkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICB7CiAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIoJXM6JXM6JXMpIiwgdHlwZSwgc3RyZWFtSWQsIGNvbm5lY3Rpb24gPT0gbnVsbCA/ICJudWxsIiA6ICBjb25uZWN0aW9uLmdldFZlcnNpb24oKS5hc0ludCgpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvUGlwZWxpbmVDb25maWd1cmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9QaXBlbGluZUNvbmZpZ3VyYXRvci5qYXZhCmluZGV4IDgxZmYxMzYuLmZmNTI0NzggMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9QaXBlbGluZUNvbmZpZ3VyYXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9QaXBlbGluZUNvbmZpZ3VyYXRvci5qYXZhCkBAIC00OCw2ICs0OCw5IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuU1NMRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuU3RhcnR1cE1lc3NhZ2U7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1VOU0FGRV9WRVJCT1NFX0RFQlVHX0NMSUVOVF9QUk9UT0NPTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlNvY2tldEZhY3RvcnkubmV3U3NsSGFuZGxlcjsKKwogLyoqCiAgKiBUYWtlcyBjYXJlIG9mIGludGlhbGl6aW5nIGEgTmV0dHkgQ2hhbm5lbCBhbmQgUGlwZWxpbmUgZm9yIGNsaWVudCBwcm90b2NvbCBjb25uZWN0aW9ucy4KICAqIFRoZSBwaXBlbGluZSBpcyBmaXJzdCBzZXQgdXAgd2l0aCBzb21lIGNvbW1vbiBoYW5kbGVycyBmb3IgY29ubmVjdGlvbiBsaW1pdGluZywgZHJvcHBpbmcKQEAgLTYxLDcgKzY0LDcgQEAKIAogICAgIC8vIE5vdCB0byBiZSB1c2VkIGluIHByb2R1Y3Rpb24sIHRoaXMgY2F1c2VzIGEgTmV0dHkgbG9nZ2luZyBoYW5kbGVyIHRvIGJlIGFkZGVkIHRvIHRoZSBwaXBlbGluZSwKICAgICAvLyB3aGljaCB3aWxsIHRocm90dGxlIGEgc3lzdGVtIHVuZGVyIGFueSBub3JtYWwgbG9hZC4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEudW5zYWZlX3ZlcmJvc2VfZGVidWdfY2xpZW50X3Byb3RvY29sIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFRFU1RfVU5TQUZFX1ZFUkJPU0VfREVCVUdfQ0xJRU5UX1BST1RPQ09MLmdldEJvb2xlYW4oKTsKIAogICAgIC8vIFN0YXRlbGVzcyBoYW5kbGVycwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbm5lY3Rpb25MaW1pdEhhbmRsZXIgY29ubmVjdGlvbkxpbWl0SGFuZGxlciA9IG5ldyBDb25uZWN0aW9uTGltaXRIYW5kbGVyKCk7CkBAIC0xODEsNyArMTg0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbm5lY3Rpb24gdXNlcyBTU0wvVExTLCByZXBsYWNlIHRoZSBkZXRlY3Rpb24gaGFuZGxlciB3aXRoIGEgU3NsSGFuZGxlciBhbmQgc28gdXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY3J5cHRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNzbEhhbmRsZXIgc3NsSGFuZGxlciA9IHNzbENvbnRleHQubmV3SGFuZGxlcihjaGFubmVsLmFsbG9jKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBwZWVyID0gZW5jcnlwdGlvbk9wdGlvbnMucmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24gPyAoSW5ldFNvY2tldEFkZHJlc3MpIGNoYW5uZWwucmVtb3RlQWRkcmVzcygpIDogbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NsSGFuZGxlciBzc2xIYW5kbGVyID0gbmV3U3NsSGFuZGxlcihjaGFubmVsLCBzc2xDb250ZXh0LCBwZWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEhhbmRsZXJDb250ZXh0LnBpcGVsaW5lKCkucmVwbGFjZShTU0xfSEFORExFUiwgU1NMX0hBTkRMRVIsIHNzbEhhbmRsZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCkBAIC0xOTksNyArMjAzLDggQEAKICAgICAgICAgICAgICAgICAgICAgU3NsQ29udGV4dCBzc2xDb250ZXh0ID0gU1NMRmFjdG9yeS5nZXRPckNyZWF0ZVNzbENvbnRleHQoZW5jcnlwdGlvbk9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25PcHRpb25zLnJlcXVpcmVfY2xpZW50X2F1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTc2xDb250ZXh0RmFjdG9yeS5Tb2NrZXRUeXBlLlNFUlZFUik7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwucGlwZWxpbmUoKS5hZGRGaXJzdChTU0xfSEFORExFUiwgc3NsQ29udGV4dC5uZXdIYW5kbGVyKGNoYW5uZWwuYWxsb2MoKSkpOworICAgICAgICAgICAgICAgICAgICBJbmV0U29ja2V0QWRkcmVzcyBwZWVyID0gZW5jcnlwdGlvbk9wdGlvbnMucmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24gPyAoSW5ldFNvY2tldEFkZHJlc3MpIGNoYW5uZWwucmVtb3RlQWRkcmVzcygpIDogbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC5waXBlbGluZSgpLmFkZEZpcnN0KFNTTF9IQU5ETEVSLCBuZXdTc2xIYW5kbGVyKGNoYW5uZWwsIHNzbENvbnRleHQsIHBlZXIpKTsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgVExTIGVuY3J5cHRpb24gcG9saWN5OiAiICsgdGhpcy50bHNFbmNyeXB0aW9uUG9saWN5KTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9Qcm90b2NvbFZlcnNpb24uamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9Qcm90b2NvbFZlcnNpb24uamF2YQppbmRleCBmYzk3Y2M4Li42MDc4ZmIyIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvUHJvdG9jb2xWZXJzaW9uLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1Byb3RvY29sVmVyc2lvbi5qYXZhCkBAIC03NSw3ICs3NSwxMCBAQAogICAgIC8qKiBPbGQgdW5zdXBwb3J0ZWQgdmVyc2lvbnMsIHRoaXMgaXMgT0sgYXMgbG9uZyBhcyB3ZSBuZXZlciBhZGQgbmV3ZXIgdW5zdXBwb3J0ZWQgdmVyc2lvbnMgKi8KICAgICBwdWJsaWMgZmluYWwgc3RhdGljIEVudW1TZXQ8UHJvdG9jb2xWZXJzaW9uPiBVTlNVUFBPUlRFRCA9IEVudW1TZXQuY29tcGxlbWVudE9mKFNVUFBPUlRFRCk7CiAKLSAgICAvKiogVGhlIHByZWZlcnJlZCB2ZXJzaW9ucyAqLworICAgIC8qKiBUaGUgcHJlZmVycmVkIHZlcnNpb24uCisgICAgICoKKyAgICAgKiBXaGVuIHVwZGF0aW5nIHRoaXMgcmVtZW1iZXIgdG8gYWxzbyB1cGRhdGUgdGhlIE1VTFRJX1VQR1JBREVTIGluIGNhc3NhbmRyYS1kdGVzdC91cGdyYWRlX3Rlc3RzL3VwZ3JhZGVfdGhyb3VnaF92ZXJzaW9uc190ZXN0LnB5CisgICAgICovCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBQcm90b2NvbFZlcnNpb24gQ1VSUkVOVCA9IFY1OwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgT3B0aW9uYWw8UHJvdG9jb2xWZXJzaW9uPiBCRVRBID0gT3B0aW9uYWwub2YoVjYpOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvU2VydmVyQ29ubmVjdGlvbi5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1NlcnZlckNvbm5lY3Rpb24uamF2YQppbmRleCAwNmU3ODQyLi5kZDZmYTMxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvU2VydmVyQ29ubmVjdGlvbi5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9TZXJ2ZXJDb25uZWN0aW9uLmphdmEKQEAgLTE3LDggKzE3LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQ7CiAKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CiBpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKIAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CkBAIC0xMjEsMTEgKzEyMSwxMSBAQAogICAgICAgICByZXR1cm4gc2FzbE5lZ290aWF0b3I7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBYNTA5Q2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMoKQorICAgIHByaXZhdGUgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMoKQogICAgIHsKICAgICAgICAgU3NsSGFuZGxlciBzc2xIYW5kbGVyID0gKFNzbEhhbmRsZXIpIGNoYW5uZWwoKS5waXBlbGluZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KCJzc2wiKTsKLSAgICAgICAgWDUwOUNlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzID0gbnVsbDsKKyAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMgPSBudWxsOwogCiAgICAgICAgIGlmIChzc2xIYW5kbGVyICE9IG51bGwpCiAgICAgICAgIHsKQEAgLTEzMyw3ICsxMzMsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlcyA9IHNzbEhhbmRsZXIuZW5naW5lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNlc3Npb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UGVlckNlcnRpZmljYXRlQ2hhaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBlZXJDZXJ0aWZpY2F0ZXMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiBlKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1NpbXBsZUNsaWVudC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1NpbXBsZUNsaWVudC5qYXZhCmluZGV4IDQzYmI4YWQuLjJiNTdkMTAgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9TaW1wbGVDbGllbnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvU2ltcGxlQ2xpZW50LmphdmEKQEAgLTUyLDYgKzUyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5Tb2NrZXRGYWN0b3J5Lm5ld1NzbEhhbmRsZXI7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5DUUxNZXNzYWdlSGFuZGxlci5lbnZlbG9wZVNpemU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5GbHVzaGVyLk1BWF9GUkFNRURfUEFZTE9BRF9TSVpFOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50Lk5vbkJsb2NraW5nUmF0ZUxpbWl0ZXIuTk9fT1BfTElNSVRFUjsKQEAgLTYyNCw3ICs2MjUsOCBAQAogICAgICAgICAgICAgc3VwZXIuaW5pdENoYW5uZWwoY2hhbm5lbCk7CiAgICAgICAgICAgICBTc2xDb250ZXh0IHNzbENvbnRleHQgPSBTU0xGYWN0b3J5LmdldE9yQ3JlYXRlU3NsQ29udGV4dChlbmNyeXB0aW9uT3B0aW9ucywgZW5jcnlwdGlvbk9wdGlvbnMucmVxdWlyZV9jbGllbnRfYXV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTc2xDb250ZXh0RmFjdG9yeS5Tb2NrZXRUeXBlLkNMSUVOVCk7Ci0gICAgICAgICAgICBjaGFubmVsLnBpcGVsaW5lKCkuYWRkRmlyc3QoInNzbCIsIHNzbENvbnRleHQubmV3SGFuZGxlcihjaGFubmVsLmFsbG9jKCkpKTsKKyAgICAgICAgICAgIEluZXRTb2NrZXRBZGRyZXNzIHBlZXIgPSBlbmNyeXB0aW9uT3B0aW9ucy5yZXF1aXJlX2VuZHBvaW50X3ZlcmlmaWNhdGlvbiA/IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0LCBwb3J0KSA6IG51bGw7CisgICAgICAgICAgICBjaGFubmVsLnBpcGVsaW5lKCkuYWRkRmlyc3QoInNzbCIsIG5ld1NzbEhhbmRsZXIoY2hhbm5lbCwgc3NsQ29udGV4dCwgcGVlcikpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvbWVzc2FnZXMvUXVlcnlNZXNzYWdlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvbWVzc2FnZXMvUXVlcnlNZXNzYWdlLmphdmEKaW5kZXggOWEyOTZlNC4uYzI5NTIxNiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L21lc3NhZ2VzL1F1ZXJ5TWVzc2FnZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9tZXNzYWdlcy9RdWVyeU1lc3NhZ2UuamF2YQpAQCAtMTQ4LDYgKzE0OCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgewotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiUVVFUlkgJXMgW3BhZ2VTaXplID0gJWRdIiwgcXVlcnksIG9wdGlvbnMuZ2V0UGFnZVNpemUoKSk7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJRVUVSWSAlcyBbcGFnZVNpemUgPSAlZF0gYXQgY29uc2lzdGVuY3kgJXMiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnksIG9wdGlvbnMuZ2V0UGFnZVNpemUoKSwgb3B0aW9ucy5nZXRDb25zaXN0ZW5jeSgpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9BbHdheXNQcmVzZW50RmlsdGVyLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9BbHdheXNQcmVzZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNDZlODQuLjAwMDAwMDAKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQWx3YXlzUHJlc2VudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZjsKLQotcHVibGljIGNsYXNzIEFsd2F5c1ByZXNlbnRGaWx0ZXIgaW1wbGVtZW50cyBJRmlsdGVyCi17Ci0gICAgcHVibGljIGJvb2xlYW4gaXNQcmVzZW50KEZpbHRlcktleSBrZXkpCi0gICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGQoRmlsdGVyS2V5IGtleSkgeyB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsgfQotCi0gICAgcHVibGljIHZvaWQgY2xvc2UoKSB7IH0KLQotICAgIHB1YmxpYyBJRmlsdGVyIHNoYXJlZENvcHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIFRocm93YWJsZSBjbG9zZShUaHJvd2FibGUgYWNjdW11bGF0ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhY2N1bXVsYXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZFRvKFJlZi5JZGVudGl0eUNvbGxlY3Rpb24gaWRlbnRpdGllcykKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIGxvbmcgc2VyaWFsaXplZFNpemUoKSB7IHJldHVybiAwOyB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBvZmZIZWFwU2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CbG9vbUZpbHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQmxvb21GaWx0ZXIuamF2YQppbmRleCBiZjQ4ZDQzLi5hOTVkMTMxIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CbG9vbUZpbHRlci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0Jsb29tRmlsdGVyLmphdmEKQEAgLTE3LDEwICsxNywxMyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogCiBpbXBvcnQgaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZhc3RUaHJlYWRMb2NhbDsKIGltcG9ydCBuZXQubmljb3VsYWouY29tcGlsZWNvbW1hbmQuYW5ub3RhdGlvbnMuSW5saW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFN0cmVhbVBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWY7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5XcmFwcGVkU2hhcmVkQ2xvc2VhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm9icy5JQml0U2V0OwpAQCAtMjksNiArMzIsNyBAQAogewogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEZhc3RUaHJlYWRMb2NhbDxsb25nW10+IHJldXNhYmxlSW5kZXhlcyA9IG5ldyBGYXN0VGhyZWFkTG9jYWw8bG9uZ1tdPigpCiAgICAgeworICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIGxvbmdbXSBpbml0aWFsVmFsdWUoKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IGxvbmdbMjFdOwpAQCAtNTIsOSArNTYsMTUgQEAKICAgICAgICAgdGhpcy5iaXRzZXQgPSBjb3B5LmJpdHNldDsKICAgICB9CiAKLSAgICBwdWJsaWMgbG9uZyBzZXJpYWxpemVkU2l6ZSgpCisgICAgcHVibGljIGxvbmcgc2VyaWFsaXplZFNpemUoYm9vbGVhbiBvbGQpCiAgICAgewotICAgICAgICByZXR1cm4gQmxvb21GaWx0ZXJTZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKHRoaXMpOworICAgICAgICByZXR1cm4gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmZvclZlcnNpb24ob2xkKS5zZXJpYWxpemVkU2l6ZSh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFN0cmVhbVBsdXMgb3V0LCBib29sZWFuIG9sZCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZm9yVmVyc2lvbihvbGQpLnNlcmlhbGl6ZSh0aGlzLCBvdXQpOwogICAgIH0KIAogICAgIC8vIE11cm11ciBpcyBmYXN0ZXIgdGhhbiBhbiBTSEEtYmFzZWQgYXBwcm9hY2ggYW5kIHByb3ZpZGVzIGFzLWdvb2QgY29sbGlzaW9uCkBAIC0xMDEsNiArMTExLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGFkZChGaWx0ZXJLZXkga2V5KQogICAgIHsKICAgICAgICAgbG9uZ1tdIGluZGV4ZXMgPSBpbmRleGVzKGtleSk7CkBAIC0xMTAsNiArMTIxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzUHJlc2VudChGaWx0ZXJLZXkga2V5KQogICAgIHsKICAgICAgICAgbG9uZ1tdIGluZGV4ZXMgPSBpbmRleGVzKGtleSk7CkBAIC0xMjMsMTIgKzEzNSwxNCBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbGVhcigpCiAgICAgewogICAgICAgICBiaXRzZXQuY2xlYXIoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgSUZpbHRlciBzaGFyZWRDb3B5KCkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQmxvb21GaWx0ZXIgc2hhcmVkQ29weSgpCiAgICAgewogICAgICAgICByZXR1cm4gbmV3IEJsb29tRmlsdGVyKHRoaXMpOwogICAgIH0KQEAgLTEzOSwxMSArMTUzLDE5IEBACiAgICAgICAgIHJldHVybiBiaXRzZXQub2ZmSGVhcFNpemUoKTsKICAgICB9CiAKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0luZm9ybWF0aXZlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBiaXRzZXQub2ZmSGVhcFNpemUoKSA+IDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICAgewogICAgICAgICByZXR1cm4gIkJsb29tRmlsdGVyW2hhc2hDb3VudD0iICsgaGFzaENvdW50ICsgIjtjYXBhY2l0eT0iICsgYml0c2V0LmNhcGFjaXR5KCkgKyAnXSc7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgYWRkVG8oUmVmLklkZW50aXR5Q29sbGVjdGlvbiBpZGVudGl0aWVzKQogICAgIHsKICAgICAgICAgc3VwZXIuYWRkVG8oaWRlbnRpdGllcyk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CbG9vbUZpbHRlclNlcmlhbGl6ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0Jsb29tRmlsdGVyU2VyaWFsaXplci5qYXZhCmluZGV4IDNkZjQzMTQuLmU0YjM0YTQgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0Jsb29tRmlsdGVyU2VyaWFsaXplci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0Jsb29tRmlsdGVyU2VyaWFsaXplci5qYXZhCkBAIC0xNyw0NyArMTcsNjUgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKIAotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0OwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklHZW5lcmljU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRTdHJlYW1QbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm9icy5JQml0U2V0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm9icy5PZmZIZWFwQml0U2V0OwogCi1wdWJsaWMgZmluYWwgY2xhc3MgQmxvb21GaWx0ZXJTZXJpYWxpemVyCitwdWJsaWMgZmluYWwgY2xhc3MgQmxvb21GaWx0ZXJTZXJpYWxpemVyIGltcGxlbWVudHMgSUdlbmVyaWNTZXJpYWxpemVyPEJsb29tRmlsdGVyLCBEYXRhSW5wdXRTdHJlYW1QbHVzLCBEYXRhT3V0cHV0U3RyZWFtUGx1cz4KIHsKLSAgICBwcml2YXRlIEJsb29tRmlsdGVyU2VyaWFsaXplcigpCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBCbG9vbUZpbHRlclNlcmlhbGl6ZXIgbmV3Rm9ybWF0SW5zdGFuY2UgPSBuZXcgQmxvb21GaWx0ZXJTZXJpYWxpemVyKGZhbHNlKTsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIEJsb29tRmlsdGVyU2VyaWFsaXplciBvbGRGb3JtYXRJbnN0YW5jZSA9IG5ldyBCbG9vbUZpbHRlclNlcmlhbGl6ZXIodHJ1ZSk7CisKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gb2xkRm9ybWF0OworCisgICAgcHJpdmF0ZSA8VD4gQmxvb21GaWx0ZXJTZXJpYWxpemVyKGJvb2xlYW4gb2xkRm9ybWF0KQogICAgIHsKKyAgICAgICAgdGhpcy5vbGRGb3JtYXQgPSBvbGRGb3JtYXQ7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShCbG9vbUZpbHRlciBiZiwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgc3RhdGljIEJsb29tRmlsdGVyU2VyaWFsaXplciBmb3JWZXJzaW9uKGJvb2xlYW4gb2xkU2VyaWFsaXphdGlvbkZvcm1hdCkKICAgICB7CisgICAgICAgIGlmIChvbGRTZXJpYWxpemF0aW9uRm9ybWF0KQorICAgICAgICAgICAgcmV0dXJuIG9sZEZvcm1hdEluc3RhbmNlOworCisgICAgICAgIHJldHVybiBuZXdGb3JtYXRJbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemUoQmxvb21GaWx0ZXIgYmYsIERhdGFPdXRwdXRTdHJlYW1QbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBhc3NlcnQgIW9sZEZvcm1hdCA6ICJGaWx0ZXIgc2hvdWxkIG5vdCBiZSBzZXJpYWxpemVkIGluIG9sZCBmb3JtYXQiOwogICAgICAgICBvdXQud3JpdGVJbnQoYmYuaGFzaENvdW50KTsKICAgICAgICAgYmYuYml0c2V0LnNlcmlhbGl6ZShvdXQpOwogICAgIH0KIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCi0gICAgcHVibGljIHN0YXRpYyA8SSBleHRlbmRzIElucHV0U3RyZWFtICYgRGF0YUlucHV0PiBCbG9vbUZpbHRlciBkZXNlcmlhbGl6ZShJIGluLCBib29sZWFuIG9sZEJmRm9ybWF0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGludCBoYXNoZXMgPSBpbi5yZWFkSW50KCk7Ci0gICAgICAgIElCaXRTZXQgYnMgPSBPZmZIZWFwQml0U2V0LmRlc2VyaWFsaXplKGluLCBvbGRCZkZvcm1hdCk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBCbG9vbUZpbHRlcihoYXNoZXMsIGJzKTsKLSAgICB9Ci0KICAgICAvKioKICAgICAgKiBDYWxjdWxhdGVzIGEgc2VyaWFsaXplZCBzaXplIG9mIHRoZSBnaXZlbiBCbG9vbSBGaWx0ZXIKLSAgICAgKiBAcGFyYW0gYmYgQmxvb20gZmlsdGVyIHRvIGNhbGN1bGF0ZSBzZXJpYWxpemVkIHNpemUKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklTZXJpYWxpemVyI3NlcmlhbGl6ZShPYmplY3QsIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXMpCiAgICAgICoKKyAgICAgKiBAcGFyYW0gYmYgQmxvb20gZmlsdGVyIHRvIGNhbGN1bGF0ZSBzZXJpYWxpemVkIHNpemUKICAgICAgKiBAcmV0dXJuIHNlcmlhbGl6ZWQgc2l6ZSBvZiB0aGUgZ2l2ZW4gYmxvb20gZmlsdGVyCisgICAgICogQHNlZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5JU2VyaWFsaXplciNzZXJpYWxpemUoT2JqZWN0LCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzKQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBzZXJpYWxpemVkU2l6ZShCbG9vbUZpbHRlciBiZikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBzZXJpYWxpemVkU2l6ZShCbG9vbUZpbHRlciBiZikKICAgICB7CiAgICAgICAgIGludCBzaXplID0gVHlwZVNpemVzLnNpemVvZihiZi5oYXNoQ291bnQpOyAvLyBoYXNoIGNvdW50CiAgICAgICAgIHNpemUgKz0gYmYuYml0c2V0LnNlcmlhbGl6ZWRTaXplKCk7CiAgICAgICAgIHJldHVybiBzaXplOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCisgICAgcHVibGljIEJsb29tRmlsdGVyIGRlc2VyaWFsaXplKERhdGFJbnB1dFN0cmVhbVBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IGhhc2hlcyA9IGluLnJlYWRJbnQoKTsKKyAgICAgICAgSUJpdFNldCBicyA9IE9mZkhlYXBCaXRTZXQuZGVzZXJpYWxpemUoaW4sIG9sZEZvcm1hdCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBCbG9vbUZpbHRlcihoYXNoZXMsIGJzKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CeXRlQXJyYXlVdGlsLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CeXRlQXJyYXlVdGlsLmphdmEKaW5kZXggOGM4NGVlNS4uZjBlNzk3YyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQnl0ZUFycmF5VXRpbC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0J5dGVBcnJheVV0aWwuamF2YQpAQCAtMjM0LDcgKzIzNCw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVXaXRoVkludExlbmd0aChieXRlW10gYnl0ZXMsIERhdGFPdXRwdXRQbHVzIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoYnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoYnl0ZXMubGVuZ3RoKTsKICAgICAgICAgb3V0LndyaXRlKGJ5dGVzKTsKICAgICB9CiAKQEAgLTI1OSw3ICsyNTksNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBieXRlW10gcmVhZFdpdGhWSW50TGVuZ3RoKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICBpbnQgbGVuZ3RoID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgIGlmIChsZW5ndGggPCAwKQogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3JydXB0IChuZWdhdGl2ZSkgdmFsdWUgbGVuZ3RoIGVuY291bnRlcmVkIik7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0J5dGVCdWZmZXJVdGlsLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CeXRlQnVmZmVyVXRpbC5qYXZhCmluZGV4IGJhN2QxYmUuLjc5MGZmMmEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0J5dGVCdWZmZXJVdGlsLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQnl0ZUJ1ZmZlclV0aWwuamF2YQpAQCAtMjMsOSArMjMsMTMgQEAKICAqIGFmdGVyd2FyZCwgYW5kIGVuc3VyZSB0aGUgdGVzdHMgc3RpbGwgcGFzcy4KICAqLwogCi1pbXBvcnQgamF2YS5pby4qOworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0OworaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CkBAIC0zNCw4ICszOCw4IEBACiAKIGltcG9ydCBuZXQubmljb3VsYWouY29tcGlsZWNvbW1hbmQuYW5ub3RhdGlvbnMuSW5saW5lOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQnVmZmVyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIApAQCAtMzM4LDcgKzM0Miw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVXaXRoVkludExlbmd0aChCeXRlQnVmZmVyIGJ5dGVzLCBEYXRhT3V0cHV0UGx1cyBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KGJ5dGVzLnJlbWFpbmluZygpKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIoYnl0ZXMucmVtYWluaW5nKCkpOwogICAgICAgICBvdXQud3JpdGUoYnl0ZXMpOwogICAgIH0KIApAQCAtMzY0LDcgKzM2OCw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgcmVhZFdpdGhWSW50TGVuZ3RoKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgaW50IGxlbmd0aCA9IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICBpbnQgbGVuZ3RoID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgIGlmIChsZW5ndGggPCAwKQogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3JydXB0IChuZWdhdGl2ZSkgdmFsdWUgbGVuZ3RoIGVuY291bnRlcmVkIik7CiAKQEAgLTM4NSw3ICszODksNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNraXBXaXRoVkludExlbmd0aChEYXRhSW5wdXRQbHVzIGluKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIGludCBsZW5ndGggPSAoaW50KWluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICBpZiAobGVuZ3RoIDwgMCkKICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ29ycnVwdCAobmVnYXRpdmUpIHZhbHVlIGxlbmd0aCBlbmNvdW50ZXJlZCIpOwogCkBAIC02ODEsMTMgKzY4NSwxNCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNhbk1pbmltaXplKEJ5dGVCdWZmZXIgYnVmKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGJ1ZiAhPSBudWxsICYmIChidWYuY2FwYWNpdHkoKSA+IGJ1Zi5yZW1haW5pbmcoKSB8fCAhYnVmLmhhc0FycmF5KCkpOworICAgICAgICByZXR1cm4gYnVmICE9IG51bGwgJiYgKCFidWYuaGFzQXJyYXkoKSB8fCBidWYuYXJyYXkoKS5sZW5ndGggPiBidWYucmVtYWluaW5nKCkpOworICAgICAgICAvLyBOb3RlOiBidWYuYXJyYXkoKS5sZW5ndGggaXMgZGlmZmVyZW50IGZyb20gYnVmLmNhcGFjaXR5KCkgZm9yIHNsaWNlZCBidWZmZXJzLgogICAgIH0KIAogICAgIC8qKiB0cmltcyBzaXplIG9mIGJ5dGVidWZmZXIgdG8gZXhhY3RseSBudW1iZXIgb2YgYnl0ZXMgaW4gaXQsIHRvIGRvIG5vdCBob2xkIHRvbyBtdWNoIG1lbW9yeSAqLwogICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBtaW5pbWFsQnVmZmVyRm9yKEJ5dGVCdWZmZXIgYnVmKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGJ1Zi5jYXBhY2l0eSgpID4gYnVmLnJlbWFpbmluZygpIHx8ICFidWYuaGFzQXJyYXkoKSA/IEJ5dGVCdWZmZXIud3JhcChnZXRBcnJheShidWYpKSA6IGJ1ZjsKKyAgICAgICAgcmV0dXJuICFidWYuaGFzQXJyYXkoKSB8fCBidWYuYXJyYXkoKS5sZW5ndGggPiBidWYucmVtYWluaW5nKCkgPyBCeXRlQnVmZmVyLndyYXAoZ2V0QXJyYXkoYnVmKSkgOiBidWY7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyW10gbWluaW1pemVCdWZmZXJzKEJ5dGVCdWZmZXJbXSBzcmMpCkBAIC04NjUsNCArODcwLDM1IEBACiAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXIgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGlucHV0IG1hdGNoZXMgZ2l2ZW4gYnVmZmVyLgorICAgICAqIElmIHRydWUsIHRoZSBpbnB1dCBpcyBwb3NpdGlvbmVkIGF0IHRoZSBlbmQgb2YgdGhlIGNvbnN1bWVkIGJ1ZmZlci4KKyAgICAgKiBJZiBmYWxzZSwgdGhlIHBvc2l0aW9uIG9mIHRoZSBpbnB1dCBpcyB1bmRlZmluZWQuCisgICAgICogPHA+CisgICAgICogVGhlIG1hdGNoZWQgYnVmZmVyIGlzIHVuY2hhbmdlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHNXaXRoU2hvcnRMZW5ndGgoRGF0YUlucHV0IGluLCBCeXRlQnVmZmVyIHRvTWF0Y2gpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IHJlYWRTaG9ydExlbmd0aChpbik7CisgICAgICAgIGlmIChsZW5ndGggIT0gdG9NYXRjaC5yZW1haW5pbmcoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaW50IGxpbWl0ID0gdG9NYXRjaC5saW1pdCgpOworICAgICAgICBmb3IgKGludCBpID0gdG9NYXRjaC5wb3NpdGlvbigpOyBpIDwgbGltaXQ7ICsraSkKKyAgICAgICAgICAgIGlmICh0b01hdGNoLmdldChpKSAhPSBpbi5yZWFkQnl0ZSgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVhZEZ1bGx5KEZpbGVDaGFubmVsIGNoYW5uZWwsIEJ5dGVCdWZmZXIgZHN0LCBsb25nIHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHdoaWxlIChkc3QuaGFzUmVtYWluaW5nKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByZWFkID0gY2hhbm5lbC5yZWFkKGRzdCwgcG9zaXRpb24pOworICAgICAgICAgICAgaWYgKHJlYWQgPT0gLTEpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigpOworICAgICAgICAgICAgcG9zaXRpb24gKz0gcmVhZDsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9Db2xsZWN0aW9uU2VyaWFsaXplci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQ29sbGVjdGlvblNlcmlhbGl6ZXIuamF2YQppbmRleCA0ZjhlOGIwLi45ZGU2NDUwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9Db2xsZWN0aW9uU2VyaWFsaXplci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0NvbGxlY3Rpb25TZXJpYWxpemVyLmphdmEKQEAgLTQwLDcgKzQwLDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgPFY+IHZvaWQgc2VyaWFsaXplQ29sbGVjdGlvbihJVmVyc2lvbmVkU2VyaWFsaXplcjxWPiB2YWx1ZVNlcmlhbGl6ZXIsIENvbGxlY3Rpb248Vj4gdmFsdWVzLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludCh2YWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIodmFsdWVzLnNpemUoKSk7CiAgICAgICAgIGZvciAoViB2YWx1ZSA6IHZhbHVlcykKICAgICAgICAgICAgIHZhbHVlU2VyaWFsaXplci5zZXJpYWxpemUodmFsdWUsIG91dCwgdmVyc2lvbik7CiAgICAgfQpAQCAtNDgsMTQgKzQ4LDE0IEBACiAgICAgcHVibGljIHN0YXRpYyA8ViwgTCBleHRlbmRzIExpc3Q8Vj4gJiBSYW5kb21BY2Nlc3M+IHZvaWQgc2VyaWFsaXplTGlzdChJVmVyc2lvbmVkU2VyaWFsaXplcjxWPiB2YWx1ZVNlcmlhbGl6ZXIsIEwgdmFsdWVzLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGludCBzaXplID0gdmFsdWVzLnNpemUoKTsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHNpemUpOworICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihzaXplKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgc2l6ZSA7ICsraSkKICAgICAgICAgICAgIHZhbHVlU2VyaWFsaXplci5zZXJpYWxpemUodmFsdWVzLmdldChpKSwgb3V0LCB2ZXJzaW9uKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIDxLLCBWPiB2b2lkIHNlcmlhbGl6ZU1hcChJVmVyc2lvbmVkU2VyaWFsaXplcjxLPiBrZXlTZXJpYWxpemVyLCBJVmVyc2lvbmVkU2VyaWFsaXplcjxWPiB2YWx1ZVNlcmlhbGl6ZXIsIE1hcDxLLCBWPiBtYXAsIERhdGFPdXRwdXRQbHVzIG91dCwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KG1hcC5zaXplKCkpOworICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihtYXAuc2l6ZSgpKTsKICAgICAgICAgZm9yIChNYXAuRW50cnk8SywgVj4gZSA6IG1hcC5lbnRyeVNldCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBrZXlTZXJpYWxpemVyLnNlcmlhbGl6ZShlLmdldEtleSgpLCBvdXQsIHZlcnNpb24pOwpAQCAtNjUsNyArNjUsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyA8ViwgQyBleHRlbmRzIENvbGxlY3Rpb248PyBzdXBlciBWPj4gQyBkZXNlcmlhbGl6ZUNvbGxlY3Rpb24oSVZlcnNpb25lZFNlcmlhbGl6ZXI8Vj4gc2VyaWFsaXplciwgSW50RnVuY3Rpb248Qz4gZmFjdG9yeSwgRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgaW50IHNpemUgPSAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgIGludCBzaXplID0gaW4ucmVhZFVuc2lnbmVkVkludDMyKCk7CiAgICAgICAgIEMgcmVzdWx0ID0gZmFjdG9yeS5hcHBseShzaXplKTsKICAgICAgICAgd2hpbGUgKHNpemUtLSA+IDApCiAgICAgICAgICAgICByZXN1bHQuYWRkKHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHZlcnNpb24pKTsKQEAgLTc0LDcgKzc0LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgPEssIFYsIE0gZXh0ZW5kcyBNYXA8SywgVj4+IE0gZGVzZXJpYWxpemVNYXAoSVZlcnNpb25lZFNlcmlhbGl6ZXI8Sz4ga2V5U2VyaWFsaXplciwgSVZlcnNpb25lZFNlcmlhbGl6ZXI8Vj4gdmFsdWVTZXJpYWxpemVyLCBJbnRGdW5jdGlvbjxNPiBmYWN0b3J5LCBEYXRhSW5wdXRQbHVzIGluLCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBpbnQgc2l6ZSA9IChpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKICAgICAgICAgTSByZXN1bHQgPSBmYWN0b3J5LmFwcGx5KHNpemUpOwogICAgICAgICB3aGlsZSAoc2l6ZS0tID4gMCkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQ29tcGFyYWJsZXMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0NvbXBhcmFibGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyYWRlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0NvbXBhcmFibGVzLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworLyoqCisgKiBVdGlsaXR5IG1ldGhvZHMgbGlua2VkIHRvIGNvbXBhcmluZyBjb21wYXJhYmxlIHZhbHVlcy4KKyAqLworcHVibGljIGNsYXNzIENvbXBhcmFibGVzCit7CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiAyIGNvbXBhcmFibGUgdmFsdWVzLiBPbiB0aWVzLCByZXR1cm5zIHRoZSBmaXJzdCBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIFQ+PiBUIG1heChUIGEsIFQgYikKKyAgICB7CisgICAgICAgIHJldHVybiBhLmNvbXBhcmVUbyhiKSA8IDAgPyBiIDogYTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIDIgdmFsdWVzIGdpdmVuIGEgY29tcGFyYXRvciBvZiB0aG9zZSB2YWx1ZXMuIE9uIHRpZXMsIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEMsIFQgZXh0ZW5kcyBDPiBUIG1heChUIGEsIFQgYiwgQ29tcGFyYXRvcjxDPiBjb21wYXJhdG9yKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IuY29tcGFyZShhLCBiKSA8IDAgPyBiIDogYTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIDIgY29tcGFyYWJsZSB2YWx1ZXMuIE9uIHRpZXMsIHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgVD4+IFQgbWluKFQgYSwgVCBiKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGEuY29tcGFyZVRvKGIpID4gMCA/IGIgOiBhOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgMiB2YWx1ZXMgZ2l2ZW4gYSBjb21wYXJhdG9yIG9mIHRob3NlIHZhbHVlcy4gT24gdGllcywgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8QywgVCBleHRlbmRzIEM+IFQgbWluKFQgYSwgVCBiLCBDb21wYXJhdG9yPEM+IGNvbXBhcmF0b3IpCisgICAgeworICAgICAgICByZXR1cm4gY29tcGFyYXRvci5jb21wYXJlKGEsIGIpID4gMCA/IGIgOiBhOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9EaWFnbm9zdGljU25hcHNob3RTZXJ2aWNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9EaWFnbm9zdGljU25hcHNob3RTZXJ2aWNlLmphdmEKaW5kZXggYWIyZDY3ZS4uMTY4Mjg1ZCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvRGlhZ25vc3RpY1NuYXBzaG90U2VydmljZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0RpYWdub3N0aWNTbmFwc2hvdFNlcnZpY2UuamF2YQpAQCAtMjAsNiArMjAsOCBAQAogCiBpbXBvcnQgamF2YS50aW1lLkxvY2FsRGF0ZTsKIGltcG9ydCBqYXZhLnRpbWUuZm9ybWF0LkRhdGVUaW1lRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOwogCkBAIC0yOSw2ICszMSw5IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Cb3VuZHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKQEAgLTM2LDggKzQxLDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESUFHTk9TVElDX1NOQVBTSE9UX0lOVEVSVkFMX05BTk9TOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5QYXJhbVR5cGUuU05BUFNIT1RfUkFOR0VTOwogCiAvKioKICAqIFByb3ZpZGVzIGEgbWVhbnMgdG8gdGFrZSBzbmFwc2hvdHMgd2hlbiB0cmlnZ2VyZWQgYnkgYW5vbWFsb3VzIGV2ZW50cyBvciB3aGVuIHRoZSBicmVha2luZyBvZiBpbnZhcmlhbnRzIGlzCkBAIC02OCw2ICs3NSw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBBSVJFRF9EQVRBX01JU01BVENIX1NOQVBTSE9UX1BSRUZJWCA9ICJSZXBhaXJlZERhdGFNaXNtYXRjaC0iOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERVUExJQ0FURV9ST1dTX0RFVEVDVEVEX1NOQVBTSE9UX1BSRUZJWCA9ICJEdXBsaWNhdGVSb3dzLSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TTkFQU0hPVF9SQU5HRV9DT1VOVCA9IDEwMDsgLy8gb3RoZXJ3aXNlLCBzbmFwc2hvdCBldmVyeXRoaW5nCiAKICAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yOwogCkBAIC03NiwzNCArODQsMzQgQEAKICAgICAgICAgdGhpcy5leGVjdXRvciA9IGV4ZWN1dG9yOwogICAgIH0KIAotICAgIC8vIElzc3VlIGF0IG1vc3QgMSBzbmFwc2hvdCByZXF1ZXN0IHBlciBtaW51dGUgZm9yIGFueSBnaXZlbiB0YWJsZS4KLSAgICAvLyBSZXBsaWNhcyB3aWxsIG9ubHkgY3JlYXRlIG9uZSBzbmFwc2hvdCBwZXIgZGF5LCBidXQgdGhpcyBzdG9wcyB1cwotICAgIC8vIGZyb20gc3dhbXBpbmcgdGhlIG5ldHdvcmsuCi0gICAgLy8gT3ZlcnJpZGFibGUgdmlhIHN5c3RlbSBwcm9wZXJ0eSBmb3IgdGVzdGluZy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNOQVBTSE9UX0lOVEVSVkFMX05BTk9TID0gVGltZVVuaXQuTUlOVVRFUy50b05hbm9zKDEpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERhdGVUaW1lRm9ybWF0dGVyIERBVEVfRk9STUFUID0gRGF0ZVRpbWVGb3JtYXR0ZXIuQkFTSUNfSVNPX0RBVEU7CiAgICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50SGFzaE1hcDxUYWJsZUlkLCBBdG9taWNMb25nPiBsYXN0U25hcHNob3RUaW1lcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CiAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVwYWlyZWREYXRhTWlzbWF0Y2goVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgSXRlcmFibGU8SW5ldEFkZHJlc3NBbmRQb3J0PiByZXBsaWNhcykKKyAgICB7CisgICAgICAgIHJlcGFpcmVkRGF0YU1pc21hdGNoKG1ldGFkYXRhLCByZXBsaWNhcywgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBhaXJlZERhdGFNaXNtYXRjaChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBJdGVyYWJsZTxJbmV0QWRkcmVzc0FuZFBvcnQ+IHJlcGxpY2FzLCBMaXN0PFJhbmdlPFRva2VuPj4gcmFuZ2VzKQorICAgIHsKKyAgICAgICAgaW5zdGFuY2UubWF5YmVUcmlnZ2VyU25hcHNob3QobWV0YWRhdGEsIFJFUEFJUkVEX0RBVEFfTUlTTUFUQ0hfU05BUFNIT1RfUFJFRklYLCByZXBsaWNhcywgcmFuZ2VzKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZHVwbGljYXRlUm93cyhUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBJdGVyYWJsZTxJbmV0QWRkcmVzc0FuZFBvcnQ+IHJlcGxpY2FzKQogICAgIHsKICAgICAgICAgaW5zdGFuY2UubWF5YmVUcmlnZ2VyU25hcHNob3QobWV0YWRhdGEsIERVUExJQ0FURV9ST1dTX0RFVEVDVEVEX1NOQVBTSE9UX1BSRUZJWCwgcmVwbGljYXMpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBhaXJlZERhdGFNaXNtYXRjaChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBJdGVyYWJsZTxJbmV0QWRkcmVzc0FuZFBvcnQ+IHJlcGxpY2FzKQotICAgIHsKLSAgICAgICAgaW5zdGFuY2UubWF5YmVUcmlnZ2VyU25hcHNob3QobWV0YWRhdGEsIFJFUEFJUkVEX0RBVEFfTUlTTUFUQ0hfU05BUFNIT1RfUFJFRklYLCByZXBsaWNhcyk7Ci0gICAgfQotCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGlhZ25vc3RpY1NuYXBzaG90UmVxdWVzdChTbmFwc2hvdENvbW1hbmQgY29tbWFuZCkKICAgICB7CiAgICAgICAgIHJldHVybiBjb21tYW5kLnNuYXBzaG90X25hbWUuc3RhcnRzV2l0aChSRVBBSVJFRF9EQVRBX01JU01BVENIX1NOQVBTSE9UX1BSRUZJWCkKICAgICAgICAgICAgIHx8IGNvbW1hbmQuc25hcHNob3RfbmFtZS5zdGFydHNXaXRoKERVUExJQ0FURV9ST1dTX0RFVEVDVEVEX1NOQVBTSE9UX1BSRUZJWCk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNuYXBzaG90KFNuYXBzaG90Q29tbWFuZCBjb21tYW5kLCBJbmV0QWRkcmVzc0FuZFBvcnQgaW5pdGlhdG9yKQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzbmFwc2hvdChTbmFwc2hvdENvbW1hbmQgY29tbWFuZCwgTGlzdDxSYW5nZTxUb2tlbj4+IHJhbmdlcywgSW5ldEFkZHJlc3NBbmRQb3J0IGluaXRpYXRvcikKICAgICB7CiAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChpc0RpYWdub3N0aWNTbmFwc2hvdFJlcXVlc3QoY29tbWFuZCkpOwotICAgICAgICBpbnN0YW5jZS5tYXliZVNuYXBzaG90KGNvbW1hbmQsIGluaXRpYXRvcik7CisgICAgICAgIGluc3RhbmNlLm1heWJlU25hcHNob3QoY29tbWFuZCwgcmFuZ2VzLCBpbml0aWF0b3IpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNuYXBzaG90TmFtZShTdHJpbmcgcHJlZml4KQpAQCAtMTE5LDEwICsxMjcsMTUgQEAKIAogICAgIHByaXZhdGUgdm9pZCBtYXliZVRyaWdnZXJTbmFwc2hvdChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBTdHJpbmcgcHJlZml4LCBJdGVyYWJsZTxJbmV0QWRkcmVzc0FuZFBvcnQ+IGVuZHBvaW50cykKICAgICB7CisgICAgICAgIG1heWJlVHJpZ2dlclNuYXBzaG90KG1ldGFkYXRhLCBwcmVmaXgsIGVuZHBvaW50cywgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtYXliZVRyaWdnZXJTbmFwc2hvdChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBTdHJpbmcgcHJlZml4LCBJdGVyYWJsZTxJbmV0QWRkcmVzc0FuZFBvcnQ+IGVuZHBvaW50cywgTGlzdDxSYW5nZTxUb2tlbj4+IHJhbmdlcykKKyAgICB7CiAgICAgICAgIGxvbmcgbm93ID0gbmFub1RpbWUoKTsKICAgICAgICAgQXRvbWljTG9uZyBjYWNoZWQgPSBsYXN0U25hcHNob3RUaW1lcy5jb21wdXRlSWZBYnNlbnQobWV0YWRhdGEuaWQsIHUgLT4gbmV3IEF0b21pY0xvbmcoMCkpOwogICAgICAgICBsb25nIGxhc3QgPSBjYWNoZWQuZ2V0KCk7Ci0gICAgICAgIGxvbmcgaW50ZXJ2YWwgPSBMb25nLmdldExvbmcoImNhc3NhbmRyYS5kaWFnbm9zdGljX3NuYXBzaG90X2ludGVydmFsX25hbm9zIiwgU05BUFNIT1RfSU5URVJWQUxfTkFOT1MpOworICAgICAgICBsb25nIGludGVydmFsID0gRElBR05PU1RJQ19TTkFQU0hPVF9JTlRFUlZBTF9OQU5PUy5nZXRMb25nKCk7CiAgICAgICAgIGlmIChub3cgLSBsYXN0ID4gaW50ZXJ2YWwgJiYgY2FjaGVkLmNvbXBhcmVBbmRTZXQobGFzdCwgbm93KSkKICAgICAgICAgewogICAgICAgICAgICAgTWVzc2FnZTxTbmFwc2hvdENvbW1hbmQ+IG1zZyA9IE1lc3NhZ2Uub3V0KFZlcmIuU05BUFNIT1RfUkVRLApAQCAtMTMwLDYgKzE0Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U25hcHNob3ROYW1lKHByZWZpeCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpOworCisgICAgICAgICAgICBpZiAoIXJhbmdlcy5pc0VtcHR5KCkgJiYgcmFuZ2VzLnNpemUoKSA8IE1BWF9TTkFQU0hPVF9SQU5HRV9DT1VOVCkKKyAgICAgICAgICAgICAgICBtc2cgPSBtc2cud2l0aFBhcmFtKFNOQVBTSE9UX1JBTkdFUywgcmFuZ2VzKTsKICAgICAgICAgICAgIGZvciAoSW5ldEFkZHJlc3NBbmRQb3J0IHJlcGxpY2EgOiBlbmRwb2ludHMpCiAgICAgICAgICAgICAgICAgTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLnNlbmQobXNnLCByZXBsaWNhKTsKICAgICAgICAgfQpAQCAtMTM5LDE5ICsxNTUsMjEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBtYXliZVNuYXBzaG90KFNuYXBzaG90Q29tbWFuZCBjb21tYW5kLCBJbmV0QWRkcmVzc0FuZFBvcnQgaW5pdGlhdG9yKQorICAgIHByaXZhdGUgdm9pZCBtYXliZVNuYXBzaG90KFNuYXBzaG90Q29tbWFuZCBjb21tYW5kLCBMaXN0PFJhbmdlPFRva2VuPj4gcmFuZ2VzLCBJbmV0QWRkcmVzc0FuZFBvcnQgaW5pdGlhdG9yKQogICAgIHsKLSAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZShuZXcgRGlhZ25vc3RpY1NuYXBzaG90VGFzayhjb21tYW5kLCBpbml0aWF0b3IpKTsKKyAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZShuZXcgRGlhZ25vc3RpY1NuYXBzaG90VGFzayhjb21tYW5kLCByYW5nZXMsIGluaXRpYXRvcikpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERpYWdub3N0aWNTbmFwc2hvdFRhc2sgaW1wbGVtZW50cyBSdW5uYWJsZQogICAgIHsKICAgICAgICAgZmluYWwgU25hcHNob3RDb21tYW5kIGNvbW1hbmQ7CiAgICAgICAgIGZpbmFsIEluZXRBZGRyZXNzQW5kUG9ydCBmcm9tOworICAgICAgICBmaW5hbCBMaXN0PFJhbmdlPFRva2VuPj4gcmFuZ2VzOwogCi0gICAgICAgIERpYWdub3N0aWNTbmFwc2hvdFRhc2soU25hcHNob3RDb21tYW5kIGNvbW1hbmQsIEluZXRBZGRyZXNzQW5kUG9ydCBmcm9tKQorICAgICAgICBEaWFnbm9zdGljU25hcHNob3RUYXNrKFNuYXBzaG90Q29tbWFuZCBjb21tYW5kLCBMaXN0PFJhbmdlPFRva2VuPj4gcmFuZ2VzLCBJbmV0QWRkcmVzc0FuZFBvcnQgZnJvbSkKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5jb21tYW5kID0gY29tbWFuZDsKKyAgICAgICAgICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzOwogICAgICAgICAgICAgdGhpcy5mcm9tID0gZnJvbTsKICAgICAgICAgfQogCkBAIC0xODUsNyArMjAzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC5rZXlzcGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLmNvbHVtbl9mYW1pbHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC5zbmFwc2hvdF9uYW1lKTsKLSAgICAgICAgICAgICAgICBjZnMuc25hcHNob3QoY29tbWFuZC5zbmFwc2hvdF9uYW1lKTsKKworICAgICAgICAgICAgICAgIGlmIChyYW5nZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICBjZnMuc25hcHNob3QoY29tbWFuZC5zbmFwc2hvdF9uYW1lKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjZnMuc25hcHNob3QoY29tbWFuZC5zbmFwc2hvdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNzdGFibGUpIC0+IGNoZWNrSW50ZXJzZWN0aW9uKHJhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmZpcnN0LmdldFRva2VuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5sYXN0LmdldFRva2VuKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCiAgICAgICAgICAgICB7CkBAIC0xOTYsNCArMjI0LDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNoZWNrSW50ZXJzZWN0aW9uKExpc3Q8UmFuZ2U8VG9rZW4+PiBub3JtYWxpemVkUmFuZ2VzLCBUb2tlbiBmaXJzdCwgVG9rZW4gbGFzdCkKKyAgICB7CisgICAgICAgIEJvdW5kczxUb2tlbj4gYm91bmRzID0gbmV3IEJvdW5kczw+KGZpcnN0LCBsYXN0KTsKKyAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRSYW5nZXMuc3RyZWFtKCkuYW55TWF0Y2gocmFuZ2UgLT4gcmFuZ2UuaW50ZXJzZWN0cyhib3VuZHMpKTsKKyAgICB9CisKIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0ZCVXRpbGl0aWVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9GQlV0aWxpdGllcy5qYXZhCmluZGV4IDZkMjEwY2UuLjkwODZkNmIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0ZCVXRpbGl0aWVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvRkJVdGlsaXRpZXMuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzOwogCi0KIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKQEAgLTI3LDM3ICsyNiw0MiBAQAogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwogaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEubmV0Lio7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuTmV0d29ya0ludGVyZmFjZTsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGltZS5JbnN0YW50OwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5OYXZpZ2FibGVTZXQ7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwogaW1wb3J0IGphdmEudXRpbC56aXAuQ2hlY2tzdW07Ci0KIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk5vbm51bGw7CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOwotCi1pbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLlNlcmlhbGl6YXRpb25GZWF0dXJlOwotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhdHlwZS5qc3IzMTAuSmF2YVRpbWVNb2R1bGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVPdXRwdXRTdHJlYW1QbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZS5Kc29uRmFjdG9yeTsKLWltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0TWFwcGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1ZGl0LklBdWRpdExvZ2dlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkFsbG93QWxsTmV0d29ya0F1dGhvcml6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JQXV0aGVudGljYXRvcjsKQEAgLTY2LDcgKzcwLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLklSb2xlTWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkxvY2FsUGFydGl0aW9uZXI7CkBAIC03NSw0MSArNzgsNDMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uSVZlcnNpb25lZFNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU3RhdHNDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5WYWxpZGF0aW9uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlckZpeGVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5JU3NsQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5GdXR1cmVDb21iaW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5vYmplY3R3ZWIuYXNtLk9wY29kZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfQVZBSUxBQkxFX1BST0NFU1NPUlM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuR0lUX1NIQTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5MSU5FX1NFUEFSQVRPUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5PU19OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFTEVBU0VfVkVSU0lPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5UUklHR0VSU19ESVI7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVVNFUl9IT01FOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGUuV3JpdGVNb2RlLk9WRVJXUklURTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7CiAKLQogcHVibGljIGNsYXNzIEZCVXRpbGl0aWVzCiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0TWFwcGVyIGpzb25NYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKG5ldyBKc29uRmFjdG9yeSgpKTsKLQogICAgIHN0YXRpYwogICAgIHsKICAgICAgICAgcHJldmVudElsbGVnYWxBY2Nlc3NXYXJuaW5ncygpOwotICAgICAgICBqc29uTWFwcGVyLnJlZ2lzdGVyTW9kdWxlKG5ldyBKYXZhVGltZU1vZHVsZSgpKTsKLSAgICAgICAganNvbk1hcHBlci5kaXNhYmxlKFNlcmlhbGl6YXRpb25GZWF0dXJlLldSSVRFX0RBVEVTX0FTX1RJTUVTVEFNUFMpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihGQlV0aWxpdGllcy5jbGFzcyk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9SRUxFQVNFX1ZFUlNJT04gPSAiVW5rbm93biI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5LTk9XTl9HSVRfU0hBID0gIlVua25vd24iOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCaWdJbnRlZ2VyIFRXTyA9IG5ldyBCaWdJbnRlZ2VyKCIyIik7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVFJJR0dFUl9ESVIgPSAidHJpZ2dlcnMiOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRVJBVElOR19TWVNURU0gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS50b0xvd2VyQ2FzZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUEVSQVRJTkdfU1lTVEVNID0gT1NfTkFNRS5nZXRTdHJpbmcoKS50b0xvd2VyQ2FzZSgpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0xpbnV4ID0gT1BFUkFUSU5HX1NZU1RFTS5jb250YWlucygibGludXgiKTsKIAogICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIEluZXRBZGRyZXNzIGxvY2FsSW5ldEFkZHJlc3M7CkBAIC0xMjEsNyArMTI2LDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIFN0cmluZyBwcmV2aW91c1JlbGVhc2VWZXJzaW9uU3RyaW5nOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGF2YWlsYWJsZVByb2Nlc3NvcnMgPSBJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS5hdmFpbGFibGVfcHJvY2Vzc29ycyIsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRBdmFpbGFibGVQcm9jZXNzb3JzKCkpOworICAgIHByaXZhdGUgc3RhdGljIGludCBhdmFpbGFibGVQcm9jZXNzb3JzID0gQ0FTU0FORFJBX0FWQUlMQUJMRV9QUk9DRVNTT1JTLmdldEludChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0QXZhaWxhYmxlUHJvY2Vzc29ycygpKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBdmFpbGFibGVQcm9jZXNzb3JzKGludCB2YWx1ZSkKICAgICB7CkBAIC0xMzgsNiArMTQzLDggQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9VTlNJR05FRF9TSE9SVCA9IDB4RkZGRjsKIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTTV9CWVRFQ09ERV9WRVJTSU9OID0gT3Bjb2Rlcy5BU005OworCiAgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlRGlnZXN0IG5ld01lc3NhZ2VEaWdlc3QoU3RyaW5nIGFsZ29yaXRobSkKICAgICB7CiAgICAgICAgIHRyeQpAQCAtMzkxLDkgKzM5OCw5IEBACiAgICAgcHVibGljIHN0YXRpYyBGaWxlIGNhc3NhbmRyYVRyaWdnZXJEaXIoKQogICAgIHsKICAgICAgICAgRmlsZSB0cmlnZ2VyRGlyID0gbnVsbDsKLSAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRyaWdnZXJzX2RpciIpICE9IG51bGwpCisgICAgICAgIGlmIChUUklHR0VSU19ESVIuZ2V0U3RyaW5nKCkgIT0gbnVsbCkKICAgICAgICAgewotICAgICAgICAgICAgdHJpZ2dlckRpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRyaWdnZXJzX2RpciIpKTsKKyAgICAgICAgICAgIHRyaWdnZXJEaXIgPSBuZXcgRmlsZShUUklHR0VSU19ESVIuZ2V0U3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewpAQCAtNDE5LDI2ICs0MjYsNDIgQEAKICAgICAgICAgcmV0dXJuIHByZXZpb3VzUmVsZWFzZVZlcnNpb25TdHJpbmc7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsZWFzZVZlcnNpb25TdHJpbmcoKQorICAgIHByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgZ2V0VmVyc2lvblByb3BlcnRpZXMoKQogICAgIHsKICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IEZCVXRpbGl0aWVzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgib3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL3ZlcnNpb24ucHJvcGVydGllcyIpKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoaW4gPT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEucmVsZWFzZVZlcnNpb24iLCBVTktOT1dOX1JFTEVBU0VfVkVSU0lPTik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKICAgICAgICAgICAgIHByb3BzLmxvYWQoaW4pOwotICAgICAgICAgICAgcmV0dXJuIHByb3BzLmdldFByb3BlcnR5KCJDYXNzYW5kcmFWZXJzaW9uIik7CisgICAgICAgICAgICByZXR1cm4gcHJvcHM7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICB7CiAgICAgICAgICAgICBKVk1TdGFiaWxpdHlJbnNwZWN0b3IuaW5zcGVjdFRocm93YWJsZShlKTsKICAgICAgICAgICAgIGxvZ2dlci53YXJuKCJVbmFibGUgdG8gbG9hZCB2ZXJzaW9uLnByb3BlcnRpZXMiLCBlKTsKLSAgICAgICAgICAgIHJldHVybiAiZGVidWcgdmVyc2lvbiI7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlbGVhc2VWZXJzaW9uU3RyaW5nKCkKKyAgICB7CisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBnZXRWZXJzaW9uUHJvcGVydGllcygpOworICAgICAgICBpZiAocHJvcHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBSRUxFQVNFX1ZFUlNJT04uZ2V0U3RyaW5nKFVOS05PV05fUkVMRUFTRV9WRVJTSU9OKTsKKyAgICAgICAgcmV0dXJuIHByb3BzLmdldFByb3BlcnR5KCJDYXNzYW5kcmFWZXJzaW9uIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0R2l0U0hBKCkKKyAgICB7CisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBnZXRWZXJzaW9uUHJvcGVydGllcygpOworICAgICAgICBpZiAocHJvcHMgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBHSVRfU0hBLmdldFN0cmluZyhVTktOT1dOX0dJVF9TSEEpOworICAgICAgICByZXR1cm4gcHJvcHMuZ2V0UHJvcGVydHkoIkdpdFNIQSIsIFVOS05PV05fR0lUX1NIQSk7CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsZWFzZVZlcnNpb25NYWpvcigpCiAgICAgewogICAgICAgICBTdHJpbmcgcmVsZWFzZVZlcnNpb24gPSBGQlV0aWxpdGllcy5nZXRSZWxlYXNlVmVyc2lvblN0cmluZygpOwpAQCAtNTg4LDExICs2MTEsOCBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgSVBhcnRpdGlvbmVyIG5ld1BhcnRpdGlvbmVyKERlc2NyaXB0b3IgZGVzYykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBFbnVtU2V0PE1ldGFkYXRhVHlwZT4gdHlwZXMgPSBFbnVtU2V0Lm9mKE1ldGFkYXRhVHlwZS5WQUxJREFUSU9OLCBNZXRhZGF0YVR5cGUuSEVBREVSKTsKLSAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IHNzdGFibGVNZXRhZGF0YSA9IGRlc2MuZ2V0TWV0YWRhdGFTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoZGVzYywgdHlwZXMpOwotICAgICAgICBWYWxpZGF0aW9uTWV0YWRhdGEgdmFsaWRhdGlvbk1ldGFkYXRhID0gKFZhbGlkYXRpb25NZXRhZGF0YSkgc3N0YWJsZU1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuVkFMSURBVElPTik7Ci0gICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50IGhlYWRlciA9IChTZXJpYWxpemF0aW9uSGVhZGVyLkNvbXBvbmVudCkgc3N0YWJsZU1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuSEVBREVSKTsKLSAgICAgICAgcmV0dXJuIG5ld1BhcnRpdGlvbmVyKHZhbGlkYXRpb25NZXRhZGF0YS5wYXJ0aXRpb25lciwgT3B0aW9uYWwub2YoaGVhZGVyLmdldEtleVR5cGUoKSkpOworICAgICAgICBTdGF0c0NvbXBvbmVudCBzdGF0c0NvbXBvbmVudCA9IFN0YXRzQ29tcG9uZW50LmxvYWQoZGVzYywgTWV0YWRhdGFUeXBlLlZBTElEQVRJT04sIE1ldGFkYXRhVHlwZS5IRUFERVIpOworICAgICAgICByZXR1cm4gbmV3UGFydGl0aW9uZXIoc3RhdHNDb21wb25lbnQudmFsaWRhdGlvbk1ldGFkYXRhKCkucGFydGl0aW9uZXIsIE9wdGlvbmFsLm9mKHN0YXRzQ29tcG9uZW50LnNlcmlhbGl6YXRpb25IZWFkZXIoKS5nZXRLZXlUeXBlKCkpKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIElQYXJ0aXRpb25lciBuZXdQYXJ0aXRpb25lcihTdHJpbmcgcGFydGl0aW9uZXJDbGFzc05hbWUpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCkBAIC04MDcsNTggKzgyNyw2IEBACiAgICAgICAgIHJldHVybiBuZXcgV3JhcHBlZENsb3NlYWJsZUl0ZXJhdG9yPFQ+KGl0ZXJhdG9yKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZnJvbUpzb25NYXAoU3RyaW5nIGpzb24pCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGpzb25NYXBwZXIucmVhZFZhbHVlKGpzb24sIE1hcC5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZnJvbUpzb25MaXN0KFN0cmluZyBqc29uKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBqc29uTWFwcGVyLnJlYWRWYWx1ZShqc29uLCBMaXN0LmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBqc29uKE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGpzb25NYXBwZXIud3JpdGVWYWx1ZUFzU3RyaW5nKG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZVRvSnNvbkZpbGUoT2JqZWN0IG9iamVjdCwgRmlsZSBvdXRwdXRGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gb3V0cHV0RmlsZS5uZXdPdXRwdXRTdHJlYW0oT1ZFUldSSVRFKSkKLSAgICAgICAgewotICAgICAgICAgICAganNvbk1hcHBlci53cml0ZVZhbHVlKChPdXRwdXRTdHJlYW0pIG91dCwgb2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZGVzZXJpYWxpemVGcm9tSnNvbkZpbGUoQ2xhc3M8VD4gdENsYXNzLCBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW1QbHVzIGluID0gZmlsZS5uZXdJbnB1dFN0cmVhbSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4ganNvbk1hcHBlci5yZWFkVmFsdWUoKElucHV0U3RyZWFtKSBpbiwgdENsYXNzKTsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByZXR0eVByaW50TWVtb3J5KGxvbmcgc2l6ZSkKICAgICB7CiAgICAgICAgIHJldHVybiBwcmV0dHlQcmludE1lbW9yeShzaXplLCBmYWxzZSk7CkBAIC0xMTQxLDQgKzExMDksMzAgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9Ci19CisKKyAgICBAU2FmZVZhcmFyZ3MKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBJbW11dGFibGVMaXN0PFQ+IGltbXV0YWJsZUxpc3RXaXRoRmlsdGVyZWROdWxscyhULi4uIHZhbHVlcykKKyAgICB7CisgICAgICAgIEltbXV0YWJsZUxpc3QuQnVpbGRlcjxUPiBidWlsZGVyID0gSW1tdXRhYmxlTGlzdC5idWlsZGVyV2l0aEV4cGVjdGVkU2l6ZSh2YWx1ZXMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZCh2YWx1ZXNbaV0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlUXVpZXRseShPYmplY3QgbykKKyAgICB7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBBdXRvQ2xvc2VhYmxlKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgICgoQXV0b0Nsb3NlYWJsZSkgbykuY2xvc2UoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci53YXJuKCJDbG9zaW5nIHt9IGhhZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiIsIG8sIGUpOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0ZpbHRlckZhY3RvcnkuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0ZpbHRlckZhY3RvcnkuamF2YQppbmRleCA0Y2YwY2JmLi42Mjc2YTNhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9GaWx0ZXJGYWN0b3J5LmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvRmlsdGVyRmFjdG9yeS5qYXZhCkBAIC0xNywxNSArMTcsMTkgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKIAoraW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5vYnMuSUJpdFNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5vYnMuT2ZmSGVhcEJpdFNldDsKIAogcHVibGljIGNsYXNzIEZpbHRlckZhY3RvcnkKIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElGaWx0ZXIgQWx3YXlzUHJlc2VudCA9IG5ldyBBbHdheXNQcmVzZW50RmlsdGVyKCk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJRmlsdGVyIEFsd2F5c1ByZXNlbnQgPSBBbHdheXNQcmVzZW50RmlsdGVyLmluc3RhbmNlOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEZpbHRlckZhY3RvcnkuY2xhc3MpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQklUU0VUX0VYQ0VTUyA9IDIwOwpAQCAtNTcsNyArNjEsNyBAQAogICAgIHsKICAgICAgICAgYXNzZXJ0IG1heEZhbHNlUG9zUHJvYmFiaWxpdHkgPD0gMS4wIDogIkludmFsaWQgcHJvYmFiaWxpdHkiOwogICAgICAgICBpZiAobWF4RmFsc2VQb3NQcm9iYWJpbGl0eSA9PSAxLjApCi0gICAgICAgICAgICByZXR1cm4gbmV3IEFsd2F5c1ByZXNlbnRGaWx0ZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQ7CiAgICAgICAgIGludCBidWNrZXRzUGVyRWxlbWVudCA9IEJsb29tQ2FsY3VsYXRpb25zLm1heEJ1Y2tldHNQZXJFbGVtZW50KG51bUVsZW1lbnRzKTsKICAgICAgICAgQmxvb21DYWxjdWxhdGlvbnMuQmxvb21TcGVjaWZpY2F0aW9uIHNwZWMgPSBCbG9vbUNhbGN1bGF0aW9ucy5jb21wdXRlQmxvb21TcGVjKGJ1Y2tldHNQZXJFbGVtZW50LCBtYXhGYWxzZVBvc1Byb2JhYmlsaXR5KTsKICAgICAgICAgcmV0dXJuIGNyZWF0ZUZpbHRlcihzcGVjLkssIG51bUVsZW1lbnRzLCBzcGVjLmJ1Y2tldHNQZXJFbGVtZW50KTsKQEAgLTcwLDQgKzc0LDU2IEBACiAgICAgICAgIElCaXRTZXQgYml0c2V0ID0gbmV3IE9mZkhlYXBCaXRTZXQobnVtQml0cyk7CiAgICAgICAgIHJldHVybiBuZXcgQmxvb21GaWx0ZXIoaGFzaCwgYml0c2V0KTsKICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBbHdheXNQcmVzZW50RmlsdGVyIGltcGxlbWVudHMgSUZpbHRlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbHdheXNQcmVzZW50RmlsdGVyIGluc3RhbmNlID0gbmV3IEFsd2F5c1ByZXNlbnRGaWx0ZXIoKTsKKworICAgICAgICBwcml2YXRlIEFsd2F5c1ByZXNlbnRGaWx0ZXIoKSB7IH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ByZXNlbnQoRmlsdGVyS2V5IGtleSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBhZGQoRmlsdGVyS2V5IGtleSkgeyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7IH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsgfQorCisgICAgICAgIHB1YmxpYyBJRmlsdGVyIHNoYXJlZENvcHkoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUaHJvd2FibGUgY2xvc2UoVGhyb3dhYmxlIGFjY3VtdWxhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkVG8oUmVmLklkZW50aXR5Q29sbGVjdGlvbiBpZGVudGl0aWVzKQorICAgICAgICB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBzZXJpYWxpemVkU2l6ZShib29sZWFuIG9sZFNlcmlhbGl6YXRpb25Gb3JtYXQpIHsgcmV0dXJuIDA7IH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VyaWFsaXplKERhdGFPdXRwdXRTdHJlYW1QbHVzIG91dCwgYm9vbGVhbiBvbGRTZXJpYWxpemF0aW9uRm9ybWF0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm8tb3AKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBvZmZIZWFwU2l6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5mb3JtYXRpdmUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9HdWlkR2VuZXJhdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9HdWlkR2VuZXJhdG9yLmphdmEKaW5kZXggNDY4NDNiNC4uZTA2MjcwZiAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvR3VpZEdlbmVyYXRvci5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0d1aWRHZW5lcmF0b3IuamF2YQpAQCAtMzQsNyArMzQsNyBAQAogICAgIHsKICAgICAgICAgaWYgKCFKQVZBX1NFQ1VSSVRZX0VHRC5pc1ByZXNlbnQoKSkKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZhLnNlY3VyaXR5LmVnZCIsICJmaWxlOi9kZXYvdXJhbmRvbSIpOworICAgICAgICAgICAgSkFWQV9TRUNVUklUWV9FR0Quc2V0U3RyaW5nKCJmaWxlOi9kZXYvdXJhbmRvbSIpOwogICAgICAgICB9CiAgICAgICAgIG15U2VjdXJlUmFuZCA9IG5ldyBTZWN1cmVSYW5kb20oKTsKICAgICAgICAgbG9uZyBzZWN1cmVJbml0aWFsaXplciA9IG15U2VjdXJlUmFuZC5uZXh0TG9uZygpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvSGVhcFV0aWxzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9IZWFwVXRpbHMuamF2YQppbmRleCBjMDkxMGQ4Li4zOGE2OTY5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9IZWFwVXRpbHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9IZWFwVXRpbHMuamF2YQpAQCAtMjIsMTUgKzIyLDI0IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50Lk1hbmFnZW1lbnRGYWN0b3J5OworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN0b3JlOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuQXJyYXlVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudGV4dC5TdHJCdWlsZGVyOwotCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAoraW1wb3J0IGNvbS5zdW4ubWFuYWdlbWVudC5Ib3RTcG90RGlhZ25vc3RpY01YQmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlBhdGhVdGlsczsKKwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRFbnYuSkFWQV9IT01FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CiAKIC8qKgogICogVXRpbGl0eSB0byBsb2cgaGVhcCBoaXN0b2dyYW0uCkBAIC00MCw2ICs0OSw4IEBACiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEhlYXBVdGlscy5jbGFzcyk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NrIERVTVBfTE9DSyA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisKICAgICAvKioKICAgICAgKiBHZW5lcmF0ZXMgYSBIRUFQIGhpc3RvZ3JhbSBpbiB0aGUgbG9nIGZpbGUuCiAgICAgICovCkBAIC03NCw2ICs4NSw3MiBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEByZXR1cm4gZnVsbCBwYXRoIHRvIHRoZSBjcmVhdGVkIGhlYXAgZHVtcCBmaWxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWF5YmVDcmVhdGVIZWFwRHVtcCgpCisgICAgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBvbmx5IG9uZSBoZWFwIGR1bXAgY2FuIGJlIGluIHByb2dyZXNzIGFjcm9zcyBhbGwgdGhyZWFkcywgYW5kIGFib3J0IGZvcgorICAgICAgICAvLyB0aHJlYWRzIHRoYXQgY2Fubm90IGltbWVkaWF0ZWx5IGFjcXVpcmUgdGhlIGxvY2ssIGFsbG93aW5nIHRoZW0gdG8gZmFpbCBub3JtYWxseS4KKyAgICAgICAgaWYgKERVTVBfTE9DSy50cnlMb2NrKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RHVtcEhlYXBPblVuY2F1Z2h0RXhjZXB0aW9uKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNQmVhblNlcnZlciBzZXJ2ZXIgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRQbGF0Zm9ybU1CZWFuU2VydmVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgUGF0aCBhYnNvbHV0ZUJhc2VQYXRoID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldEhlYXBEdW1wUGF0aCgpOworICAgICAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwb2ludCB3aXRoIHRoaXMgdmFsdWUgbnVsbCBhcyB3ZSBpbml0aWFsaXplIHRoZSBib29sIG9ubHkgYWZ0ZXIgY29uZmlybWluZworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgLVhYIHBhcmFtIC8gLnlhbWwgY29uZiBpcyBwcmVzZW50IG9uIGluaXRpYWwgaW5pdCBhbmQgdGhlIEpNWCBlbnRyeSBwb2ludCwgYnV0IHN0aWxsIHdvcnRoIGNoZWNraW5nLgorICAgICAgICAgICAgICAgICAgICBpZiAoYWJzb2x1dGVCYXNlUGF0aCA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RHVtcEhlYXBPblVuY2F1Z2h0RXhjZXB0aW9uKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIGhlYXAgZHVtcCB1bmxlc3MgLVhYOkhlYXBEdW1wUGF0aCBvciBjYXNzYW5kcmEueWFtbDpoZWFwX2R1bXBfcGF0aCBpcyBzcGVjaWZpZWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBsb25nIG1heE1lbW9yeUJ5dGVzID0gUnVudGltZS5nZXRSdW50aW1lKCkubWF4TWVtb3J5KCk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgZnJlZVNwYWNlQnl0ZXMgPSBQYXRoVXRpbHMudHJ5R2V0U3BhY2UoYWJzb2x1dGVCYXNlUGF0aCwgRmlsZVN0b3JlOjpnZXRVbmFsbG9jYXRlZFNwYWNlKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBBYm9ydCBpZiB0aGVyZSBpc24ndCBlbm91Z2ggcm9vbSBvbiB0aGUgdGFyZ2V0IGRpc2sgdG8gZHVtcCB0aGUgZW50aXJlIGhlYXAgYW5kIHRoZW4gY29weSBpdC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyZWVTcGFjZUJ5dGVzIDwgMiAqIG1heE1lbW9yeUJ5dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBhbGxvY2F0ZWQgc3BhY2UgZm9yIGEgaGVhcCBkdW1wIHNuYXBzaG90LiBUaGVyZSBhcmUgb25seSAiICsgZnJlZVNwYWNlQnl0ZXMgKyAiIGJ5dGVzIGZyZWUgYXQgIiArIGFic29sdXRlQmFzZVBhdGggKyAnLicpOworCisgICAgICAgICAgICAgICAgICAgIEhvdFNwb3REaWFnbm9zdGljTVhCZWFuIG14QmVhbiA9IE1hbmFnZW1lbnRGYWN0b3J5Lm5ld1BsYXRmb3JtTVhCZWFuUHJveHkoc2VydmVyLCAiY29tLnN1bi5tYW5hZ2VtZW50OnR5cGU9SG90U3BvdERpYWdub3N0aWMiLCBIb3RTcG90RGlhZ25vc3RpY01YQmVhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlbmFtZSA9IFN0cmluZy5mb3JtYXQoInBpZCVzLWVwb2NoJXMuaHByb2YiLCBIZWFwVXRpbHMuZ2V0UHJvY2Vzc0lkKCkudG9TdHJpbmcoKSwgY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdWxsUGF0aCA9IEZpbGUuZ2V0UGF0aChhYnNvbHV0ZUJhc2VQYXRoLnRvU3RyaW5nKCksIGZpbGVuYW1lKS50b1N0cmluZygpOworCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJXcml0aW5nIGhlYXAgZHVtcCB0byB7fSBvbiBwYXJ0aXRpb24gdy8ge30gZnJlZSBieXRlcy4uLiIsIGFic29sdXRlQmFzZVBhdGgsIGZyZWVTcGFjZUJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgbXhCZWFuLmR1bXBIZWFwKGZ1bGxQYXRoLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJIZWFwIGR1bXAgd3JpdHRlbiB0byB7fSIsIGZ1bGxQYXRoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGZ1cnRoZXIgaGVhcCBkdW1wIGNyZWF0aW9ucyB1bnRpbCBleHBsaWNpdGx5IHJlLWVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREdW1wSGVhcE9uVW5jYXVnaHRFeGNlcHRpb24oZmFsc2UpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdWxsUGF0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJIZWFwIGR1bXAgY3JlYXRpb24gb24gdW5jYXVnaHQgZXhjZXB0aW9ucyBpcyBkaXNhYmxlZC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oIlVuYWJsZSB0byBjcmVhdGUgaGVhcCBkdW1wLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERVTVBfTE9DSy51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiSGVhcCBkdW1wIGNyZWF0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MuIFJlcXVlc3QgYWJvcnRlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgogICAgICAqIFJldHJpZXZlIHRoZSBwYXRoIHRvIHRoZSBKQ01EIGV4ZWN1dGFibGUuCiAgICAgICogQHJldHVybiB0aGUgcGF0aCB0byB0aGUgSkNNRCBleGVjdXRhYmxlIG9yIG51bGwgaWYgaXQgY2Fubm90IGJlIGZvdW5kLgogICAgICAqLwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvSUZpbHRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvSUZpbHRlci5qYXZhCmluZGV4IGI1ZWIyYzQuLmYwNmFlNmUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0lGaWx0ZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9JRmlsdGVyLmphdmEKQEAgLTE3LDE0ICsxNywyNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzOwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFN0cmVhbVBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5TaGFyZWRDbG9zZWFibGU7CiAKIHB1YmxpYyBpbnRlcmZhY2UgSUZpbHRlciBleHRlbmRzIFNoYXJlZENsb3NlYWJsZQogewogICAgIGludGVyZmFjZSBGaWx0ZXJLZXkKICAgICB7Ci0gICAgICAgIC8qKiBQbGFjZXMgdGhlIG11cm11cjMgaGFzaCBvZiB0aGUga2V5IGluIHRoZSBnaXZlbiBsb25nIGFycmF5IG9mIHNpemUgYXQgbGVhc3QgdHdvLiAqLworICAgICAgICAvKioKKyAgICAgICAgICogUGxhY2VzIHRoZSBtdXJtdXIzIGhhc2ggb2YgdGhlIGtleSBpbiB0aGUgZ2l2ZW4gbG9uZyBhcnJheSBvZiBzaXplIGF0IGxlYXN0IHR3by4KKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgZmlsdGVySGFzaChsb25nW10gZGVzdCk7CisKKyAgICAgICAgZGVmYXVsdCBzaG9ydCBmaWx0ZXJIYXNoTG93ZXJCaXRzKCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZ1tdIGRlc3QgPSBuZXcgbG9uZ1syXTsKKyAgICAgICAgICAgIGZpbHRlckhhc2goZGVzdCk7CisgICAgICAgICAgICByZXR1cm4gKHNob3J0KSBkZXN0WzFdOworICAgICAgICB9CiAgICAgfQogCiAgICAgdm9pZCBhZGQoRmlsdGVyS2V5IGtleSk7CkBAIC0zMyw3ICs0NSw5IEBACiAKICAgICB2b2lkIGNsZWFyKCk7CiAKLSAgICBsb25nIHNlcmlhbGl6ZWRTaXplKCk7CisgICAgbG9uZyBzZXJpYWxpemVkU2l6ZShib29sZWFuIG9sZFNlcmlhbGl6YXRpb25Gb3JtYXQpOworCisgICAgdm9pZCBzZXJpYWxpemUoRGF0YU91dHB1dFN0cmVhbVBsdXMgb3V0LCBib29sZWFuIG9sZFNlcmlhbGl6YXRpb25Gb3JtYXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogICAgIHZvaWQgY2xvc2UoKTsKIApAQCAtNDEsNyArNTUsMTAgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdXNlZCBvZmYgaGVhcC4KKyAgICAgKgogICAgICAqIEByZXR1cm4gdGhlIGFtb3VudCBvZiBtZW1vcnkgaW4gYnl0ZXMgdXNlZCBvZmYgaGVhcAogICAgICAqLwogICAgIGxvbmcgb2ZmSGVhcFNpemUoKTsKKworICAgIGJvb2xlYW4gaXNJbmZvcm1hdGl2ZSgpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvSk1YU2VydmVyVXRpbHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0pNWFNlcnZlclV0aWxzLmphdmEKaW5kZXggNTU1N2ZkYS4uYmE5YzcwNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvSk1YU2VydmVyVXRpbHMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9KTVhTZXJ2ZXJVdGlscy5qYXZhCkBAIC01NCw2ICs1NCw4IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLmpteC5BdXRoZW50aWNhdGlvblByb3h5OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0pNWF9BVVRIT1JJWkVSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9KTVhfUkVNT1RFX0xPR0lOX0NPTkZJRzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX0FDQ0VTU19GSUxFOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfQVVUSEVOVElDQVRFOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfUEFTU1dPUkRfRklMRTsKQEAgLTYyLDYgKzY0LDkgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1NTTF9FTkFCTEVEX0NJUEhFUl9TVUlURVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9TU0xfRU5BQkxFRF9QUk9UT0NPTFM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9TU0xfTkVFRF9DTElFTlRfQVVUSDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5KQVZBWF9STUlfU1NMX0NMSUVOVF9FTkFCTEVEX0NJUEhFUl9TVUlURVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSkFWQVhfUk1JX1NTTF9DTElFTlRfRU5BQkxFRF9QUk9UT0NPTFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSkFWQV9STUlfU0VSVkVSX0hPU1ROQU1FOwogCiBwdWJsaWMgY2xhc3MgSk1YU2VydmVyVXRpbHMKIHsKQEAgLTgyLDcgKzg3LDcgQEAKICAgICAgICAgaWYgKGxvY2FsKQogICAgICAgICB7CiAgICAgICAgICAgICBzZXJ2ZXJBZGRyZXNzID0gSW5ldEFkZHJlc3MuZ2V0TG9vcGJhY2tBZGRyZXNzKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmEucm1pLnNlcnZlci5ob3N0bmFtZSIsIHNlcnZlckFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSk7CisgICAgICAgICAgICBKQVZBX1JNSV9TRVJWRVJfSE9TVE5BTUUuc2V0U3RyaW5nKHNlcnZlckFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBDb25maWd1cmUgdGhlIFJNSSBjbGllbnQgJiBzZXJ2ZXIgc29ja2V0IGZhY3RvcmllcywgaW5jbHVkaW5nIFNTTCBjb25maWcuCkBAIC0xNjYsNyArMTcxLDcgQEAKICAgICAgICAgLy8gYmVmb3JlIGNyZWF0aW5nIHRoZSBhdXRoZW50aWNhdG9yLiBJZiBubyBwYXNzd29yZCBmaWxlIGhhcyBiZWVuCiAgICAgICAgIC8vIGV4cGxpY2l0bHkgc2V0LCBpdCdzIHJlYWQgZnJvbSB0aGUgZGVmYXVsdCBsb2NhdGlvbgogICAgICAgICAvLyAkSkFWQV9IT01FL2xpYi9tYW5hZ2VtZW50L2pteHJlbW90ZS5wYXNzd29yZAotICAgICAgICBTdHJpbmcgY29uZmlnRW50cnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5qbXgucmVtb3RlLmxvZ2luLmNvbmZpZyIpOworICAgICAgICBTdHJpbmcgY29uZmlnRW50cnkgPSBDQVNTQU5EUkFfSk1YX1JFTU9URV9MT0dJTl9DT05GSUcuZ2V0U3RyaW5nKCk7CiAgICAgICAgIGlmIChjb25maWdFbnRyeSAhPSBudWxsKQogICAgICAgICB7CiAgICAgICAgICAgICBlbnYucHV0KEpNWENvbm5lY3RvclNlcnZlci5BVVRIRU5USUNBVE9SLCBuZXcgQXV0aGVudGljYXRpb25Qcm94eShjb25maWdFbnRyeSkpOwpAQCAtMTk0LDcgKzE5OSw3IEBACiAgICAgICAgIC8vIGNhbiBiZSBzZXQgYXMgdGhlIEpNWENvbm5lY3RvclNlcnZlcidzIE1CZWFuU2VydmVyRm9yd2FyZGVyLgogICAgICAgICAvLyBJZiBubyBjdXN0b20gcHJveHkgaXMgc3VwcGxpZWQsIGNoZWNrIHN5c3RlbSBwcm9wZXJ0aWVzIGZvciB0aGUgbG9jYXRpb24gb2YgdGhlCiAgICAgICAgIC8vIHN0YW5kYXJkIGFjY2VzcyBmaWxlICYgc3Rhc2ggaXQgaW4gZW52Ci0gICAgICAgIFN0cmluZyBhdXRoelByb3h5Q2xhc3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5qbXguYXV0aG9yaXplciIpOworICAgICAgICBTdHJpbmcgYXV0aHpQcm94eUNsYXNzID0gQ0FTU0FORFJBX0pNWF9BVVRIT1JJWkVSLmdldFN0cmluZygpOwogICAgICAgICBpZiAoYXV0aHpQcm94eUNsYXNzICE9IG51bGwpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZpbmFsIEludm9jYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBGQlV0aWxpdGllcy5jb25zdHJ1Y3QoYXV0aHpQcm94eUNsYXNzLCAiSk1YIGF1dGh6IHByb3h5Iik7CkBAIC0yMjQsNyArMjI5LDcgQEAKICAgICAgICAgICAgIFN0cmluZyBwcm90b2NvbExpc3QgPSBDT01fU1VOX01BTkFHRU1FTlRfSk1YUkVNT1RFX1NTTF9FTkFCTEVEX1BST1RPQ09MUy5nZXRTdHJpbmcoKTsKICAgICAgICAgICAgIGlmIChwcm90b2NvbExpc3QgIT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4LnJtaS5zc2wuY2xpZW50LmVuYWJsZWRQcm90b2NvbHMiLCBwcm90b2NvbExpc3QpOworICAgICAgICAgICAgICAgIEpBVkFYX1JNSV9TU0xfQ0xJRU5UX0VOQUJMRURfUFJPVE9DT0xTLnNldFN0cmluZyhwcm90b2NvbExpc3QpOwogICAgICAgICAgICAgICAgIHByb3RvY29scyA9IFN0cmluZ1V0aWxzLnNwbGl0KHByb3RvY29sTGlzdCwgJywnKTsKICAgICAgICAgICAgIH0KIApAQCAtMjMyLDcgKzIzNyw3IEBACiAgICAgICAgICAgICBTdHJpbmcgY2lwaGVyTGlzdCA9IENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfU1NMX0VOQUJMRURfQ0lQSEVSX1NVSVRFUy5nZXRTdHJpbmcoKTsKICAgICAgICAgICAgIGlmIChjaXBoZXJMaXN0ICE9IG51bGwpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5ybWkuc3NsLmNsaWVudC5lbmFibGVkQ2lwaGVyU3VpdGVzIiwgY2lwaGVyTGlzdCk7CisgICAgICAgICAgICAgICAgSkFWQVhfUk1JX1NTTF9DTElFTlRfRU5BQkxFRF9DSVBIRVJfU1VJVEVTLnNldFN0cmluZyhjaXBoZXJMaXN0KTsKICAgICAgICAgICAgICAgICBjaXBoZXJzID0gU3RyaW5nVXRpbHMuc3BsaXQoY2lwaGVyTGlzdCwgJywnKTsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvSlZNU3RhYmlsaXR5SW5zcGVjdG9yLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9KVk1TdGFiaWxpdHlJbnNwZWN0b3IuamF2YQppbmRleCAxZDNjMDlmLi5hMzk2ZWY5IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9KVk1TdGFiaWxpdHlJbnNwZWN0b3IuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9KVk1TdGFiaWxpdHlJbnNwZWN0b3IuamF2YQpAQCAtNDYsNiArNDYsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5VbmNoZWNrZWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBSSU5UX0hFQVBfSElTVE9HUkFNX09OX09VVF9PRl9NRU1PUllfRVJST1I7CisKIC8qKgogICogUmVzcG9uc2libGUgZm9yIGRlY2lkaW5nIHdoZXRoZXIgdG8ga2lsbCB0aGUgSlZNIGlmIGl0IGdldHMgaW4gYW4gInVuc3RhYmxlIiBzdGF0ZSAodGhpbmsgT09NKS4KICAqLwpAQCAtMTA1LDcgKzEwNyw3IEBACiAgICAgICAgIGJvb2xlYW4gaXNVbnN0YWJsZSA9IGZhbHNlOwogICAgICAgICBpZiAodCBpbnN0YW5jZW9mIE91dE9mTWVtb3J5RXJyb3IpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChCb29sZWFuLmdldEJvb2xlYW4oImNhc3NhbmRyYS5wcmludEhlYXBIaXN0b2dyYW1Pbk91dE9mTWVtb3J5RXJyb3IiKSkKKyAgICAgICAgICAgIGlmIChQUklOVF9IRUFQX0hJU1RPR1JBTV9PTl9PVVRfT0ZfTUVNT1JZX0VSUk9SLmdldEJvb2xlYW4oKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGF2b2lkIHByaW50aW5nIG11bHRpcGxlIHRpbWUgdGhlIGhlYXAgaGlzdG9ncmFtIGlmIG11bHRpcGxlIE9PTSBlcnJvcnMgaGFwcGVuIGluIGEgc2hvcnQKICAgICAgICAgICAgICAgICAvLyB0aW1lIHNwYW4uCkBAIC0xMzMsNiArMTM1LDkgQEAKICAgICAgICAgICAgIGlzVW5zdGFibGUgPSB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gQW55dGhpbmcgb3RoZXIgdGhhbiBhbiBPT00sIHdlIHNob3VsZCB0cnkgYW5kIGhlYXAgZHVtcCB0byBjYXB0dXJlIHdoYXQncyBnb2luZyBvbiBpZiBjb25maWd1cmVkIHRvIGRvIHNvCisgICAgICAgIEhlYXBVdGlscy5tYXliZUNyZWF0ZUhlYXBEdW1wKCk7CisKICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbikKICAgICAgICAgICAgIHRocm93IG5ldyBVbmNoZWNrZWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbigoSW50ZXJydXB0ZWRFeGNlcHRpb24pIHQpOwogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9Kc29uVXRpbHMuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0pzb25VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZGMxM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9Kc29uVXRpbHMuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlLkpzb25GYWN0b3J5OworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlLnV0aWwuQnVmZmVyUmVjeWNsZXJzOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdFdyaXRlcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuU2VyaWFsaXphdGlvbkZlYXR1cmU7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGF0eXBlLmpzcjMxMC5KYXZhVGltZU1vZHVsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSW5wdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZU91dHB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGUuV3JpdGVNb2RlLk9WRVJXUklURTsKKworcHVibGljIGZpbmFsIGNsYXNzIEpzb25VdGlscworeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0TWFwcGVyIEpTT05fT0JKRUNUX01BUFBFUiA9IG5ldyBPYmplY3RNYXBwZXIobmV3IEpzb25GYWN0b3J5KCkpOyAvLyBjaGVja3N0eWxlOiBwZXJtaXQgdGhpcyBpbnN0YW50aWF0aW9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RXcml0ZXIgSlNPTl9PQkpFQ1RfUFJFVFRZX1dSSVRFUjsKKworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgSlNPTl9PQkpFQ1RfTUFQUEVSLnJlZ2lzdGVyTW9kdWxlKG5ldyBKYXZhVGltZU1vZHVsZSgpKTsKKyAgICAgICAgSlNPTl9PQkpFQ1RfTUFQUEVSLmRpc2FibGUoU2VyaWFsaXphdGlvbkZlYXR1cmUuV1JJVEVfREFURVNfQVNfVElNRVNUQU1QUyk7CisgICAgICAgIEpTT05fT0JKRUNUX1BSRVRUWV9XUklURVIgPSBKU09OX09CSkVDVF9NQVBQRVIud3JpdGVyV2l0aERlZmF1bHRQcmV0dHlQcmludGVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBKc29uVXRpbHMoKQorICAgIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdW90ZXMgc3RyaW5nIGNvbnRlbnRzIHVzaW5nIHN0YW5kYXJkIEpTT04gcXVvdGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBxdW90ZUFzSnNvblN0cmluZyhTdHJpbmcgcykKKyAgICB7CisgICAgICAgIC8vIEluIGZ1dHVyZSBzaG91bGQgdXBkYXRlIHRvIGRpcmVjdGx5IHVzZSBgSnNvblN0cmluZ0VuY29kZXIuZ2V0SW5zdGFuY2UoKWAgYnV0IGZvciBub3c6CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKEJ1ZmZlclJlY3ljbGVycy5nZXRKc29uU3RyaW5nRW5jb2RlcigpLnF1b3RlQXNTdHJpbmcocykpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGRlY29kZUpzb24oYnl0ZVtdIGpzb24pCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEpTT05fT0JKRUNUX01BUFBFUi5yZWFkVmFsdWUoanNvbiwgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJFcnJvciBkZWNvZGluZyBKU09OIGJ5dGVzOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGRlY29kZUpzb24oU3RyaW5nIGpzb24pCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEpTT05fT0JKRUNUX01BUFBFUi5yZWFkVmFsdWUoanNvbiwgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJFcnJvciBkZWNvZGluZyBKU09OIHN0cmluZzogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB3cml0ZUFzSnNvbkJ5dGVzKE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSlNPTl9PQkpFQ1RfTUFQUEVSLndyaXRlVmFsdWVBc0J5dGVzKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJFcnJvciB3cml0aW5nIGFzIEpTT046ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgd3JpdGVBc0pzb25TdHJpbmcoT2JqZWN0IHZhbHVlKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBKU09OX09CSkVDVF9NQVBQRVIud3JpdGVWYWx1ZUFzU3RyaW5nKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJFcnJvciB3cml0aW5nIGFzIEpTT046ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgd3JpdGVBc1ByZXR0eUpzb25TdHJpbmcoT2JqZWN0IHZhbHVlKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBKU09OX09CSkVDVF9QUkVUVFlfV1JJVEVSLndyaXRlVmFsdWVBc1N0cmluZyh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiRXJyb3Igd3JpdGluZyBhcyBKU09OOiAiICsgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IE1hcDxTdHJpbmcsIFQ+IGZyb21Kc29uTWFwKFN0cmluZyBqc29uKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBKU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKGpzb24sIE1hcC5jbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiRXJyb3IgZGVjb2RpbmcgSlNPTiBzdHJpbmc6ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gTWFwPFN0cmluZywgVD4gZnJvbUpzb25NYXAoYnl0ZVtdIGJ5dGVzKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBKU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKGJ5dGVzLCBNYXAuY2xhc3MpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIkVycm9yIGRlY29kaW5nIEpTT046ICIgKyBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZnJvbUpzb25MaXN0KGJ5dGVbXSBieXRlcykKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gSlNPTl9PQkpFQ1RfTUFQUEVSLnJlYWRWYWx1ZShieXRlcywgTGlzdC5jbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiRXJyb3IgZGVjb2RpbmcgSlNPTjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBmcm9tSnNvbkxpc3QoU3RyaW5nIGpzb24pCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEpTT05fT0JKRUNUX01BUFBFUi5yZWFkVmFsdWUoanNvbiwgTGlzdC5jbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiRXJyb3IgZGVjb2RpbmcgSlNPTjogIiArIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VyaWFsaXplVG9Kc29uRmlsZShPYmplY3Qgb2JqZWN0LCBGaWxlIG91dHB1dEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChGaWxlT3V0cHV0U3RyZWFtUGx1cyBvdXQgPSBvdXRwdXRGaWxlLm5ld091dHB1dFN0cmVhbShPVkVSV1JJVEUpKQorICAgICAgICB7CisgICAgICAgICAgICBKU09OX09CSkVDVF9QUkVUVFlfV1JJVEVSLndyaXRlVmFsdWUoKE91dHB1dFN0cmVhbSkgb3V0LCBvYmplY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBkZXNlcmlhbGl6ZUZyb21Kc29uRmlsZShDbGFzczxUPiB0Q2xhc3MsIEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbVBsdXMgaW4gPSBmaWxlLm5ld0lucHV0U3RyZWFtKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBKU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKChJbnB1dFN0cmVhbSkgaW4sIHRDbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIHVucXVvdGluZyBhbmQgY2FzZS1pbnNlbnNpdGl2aXR5IGluIG1hcCBrZXlzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVDYXNlU2Vuc2l0aXZpdHkoTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZU1hcCkKKyAgICB7CisgICAgICAgIGZvciAoU3RyaW5nIG1hcEtleSA6IG5ldyBBcnJheUxpc3Q8Pih2YWx1ZU1hcC5rZXlTZXQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlmIGl0J3Mgc3Vycm91bmRlZCBieSBxdW90ZXMsIHJlbW92ZSB0aGVtIGFuZCBwcmVzZXJ2ZSB0aGUgY2FzZQorICAgICAgICAgICAgaWYgKG1hcEtleS5zdGFydHNXaXRoKCJcIiIpICYmIG1hcEtleS5lbmRzV2l0aCgiXCIiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZU1hcC5wdXQobWFwS2V5LnN1YnN0cmluZygxLCBtYXBLZXkubGVuZ3RoKCkgLSAxKSwgdmFsdWVNYXAucmVtb3ZlKG1hcEtleSkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGxvd2VyY2FzZSBpdCBpZiBuZWVkZWQKKyAgICAgICAgICAgIFN0cmluZyBsb3dlcmVkID0gbWFwS2V5LnRvTG93ZXJDYXNlKExvY2FsZS5VUyk7CisgICAgICAgICAgICBpZiAoIW1hcEtleS5lcXVhbHMobG93ZXJlZCkpCisgICAgICAgICAgICAgICAgdmFsdWVNYXAucHV0KGxvd2VyZWQsIHZhbHVlTWFwLnJlbW92ZShtYXBLZXkpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL01CZWFuV3JhcHBlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvTUJlYW5XcmFwcGVyLmphdmEKaW5kZXggZjhiYzQzOS4uZjAwM2UxYSAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvTUJlYW5XcmFwcGVyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvTUJlYW5XcmFwcGVyLmphdmEKQEAgLTI3LDcgKzI3LDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSVNfRElTQUJMRURfTUJFQU5fUkVHSVNUUkFUSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk9SR19BUEFDSEVfQ0FTU0FORFJBX0RJU0FCTEVfTUJFQU5fUkVHSVNUUkFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk1CRUFOX1JFR0lTVFJBVElPTl9DTEFTUzsKIAogLyoqCkBAIC00Miw3ICs0Miw3IEBACiAKICAgICBzdGF0aWMgTUJlYW5XcmFwcGVyIGNyZWF0ZSgpCiAgICAgewotICAgICAgICBpZiAoSVNfRElTQUJMRURfTUJFQU5fUkVHSVNUUkFUSU9OLmdldEJvb2xlYW4oKSkKKyAgICAgICAgaWYgKE9SR19BUEFDSEVfQ0FTU0FORFJBX0RJU0FCTEVfTUJFQU5fUkVHSVNUUkFUSU9OLmdldEJvb2xlYW4oKSkKICAgICAgICAgICAgIHJldHVybiBuZXcgTm9PcE1CZWFuV3JhcHBlcigpOwogCiAgICAgICAgIFN0cmluZyBrbGFzcyA9IE1CRUFOX1JFR0lTVFJBVElPTl9DTEFTUy5nZXRTdHJpbmcoKTsKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL01lcmdlSXRlcmF0b3IuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL01lcmdlSXRlcmF0b3IuamF2YQppbmRleCA2NzEzZGQwLi4yNzIzODk2IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9NZXJnZUl0ZXJhdG9yLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvTWVyZ2VJdGVyYXRvci5qYXZhCkBAIC0zOTUsMTAgKzM5NSwxMSBAQAogCiAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0xvd2VyQm91bmQoKQogICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQgaXRlbSAhPSBudWxsOwogICAgICAgICAgICAgcmV0dXJuIGl0ZW0gPT0gbG93ZXJCb3VuZDsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIGNvbnN1bWUoUmVkdWNlciByZWR1Y2VyKQorICAgICAgICBwdWJsaWMgPE91dD4gdm9pZCBjb25zdW1lKFJlZHVjZXI8SW4sIE91dD4gcmVkdWNlcikKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGlzTG93ZXJCb3VuZCgpKQogICAgICAgICAgICAgewpAQCAtNDg4LDQgKzQ4OSw0IEBACiAgICAgICAgICAgICByZXR1cm4gKE91dCkgc291cmNlLm5leHQoKTsKICAgICAgICAgfQogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9Nb25vdG9uaWNDbG9jay5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvTW9ub3RvbmljQ2xvY2suamF2YQppbmRleCBhZDllZTgxLi43YmU1NGMwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9Nb25vdG9uaWNDbG9jay5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL01vbm90b25pY0Nsb2NrLmphdmEKQEAgLTI3LDExICsyNywxMiBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvcnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUxMSVNFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQVBQUk9YSU1BVEVfVElNRV9QUkVDSVNJT05fTVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0xPQ0tfTU9OT1RPTklDX0FQUFJPWDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DTE9DS19NT05PVE9OSUNfUFJFQ0lTRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5OQU5PVElNRVRPTUlMTElTX1RJTUVTVEFNUF9VUERBVEVfSU5URVJWQUw7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkLlNjb3BlLlNJTVVMQVRJT047CiAKQEAgLTEzOSw4ICsxNDAsNyBAQAogICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVwb2NoU2FtcGxpbmdDbG9jayBpbXBsZW1lbnRzIE1vbm90b25pY0Nsb2NrCiAgICAgewogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQWJzdHJhY3RFcG9jaFNhbXBsaW5nQ2xvY2suY2xhc3MpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRFX0lOVEVSVkFMX1BST1BFUlRZID0gQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJOQU5PVElNRVRPTUlMTElTX1RJTUVTVEFNUF9VUERBVEVfSU5URVJWQUwiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVQREFURV9JTlRFUlZBTF9NUyA9IExvbmcuZ2V0TG9uZyhVUERBVEVfSU5URVJWQUxfUFJPUEVSVFksIDEwMDAwKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUERBVEVfSU5URVJWQUxfTVMgPSBOQU5PVElNRVRPTUlMTElTX1RJTUVTVEFNUF9VUERBVEVfSU5URVJWQUwuZ2V0TG9uZygpOwogCiAgICAgICAgIEBWaXNpYmxlRm9yVGVzdGluZwogICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFsbW9zdFNhbWVUaW1lIGltcGxlbWVudHMgTW9ub3RvbmljQ2xvY2tUcmFuc2xhdGlvbgpAQCAtMjgxLDcgKzI4MSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTYW1wbGVkQ2xvY2sgaW1wbGVtZW50cyBNb25vdG9uaWNDbG9jawogICAgIHsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNhbXBsZWRDbG9jay5jbGFzcyk7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVUERBVEVfSU5URVJWQUxfTVMgPSBNYXRoLm1heCgxLCBJbnRlZ2VyLnBhcnNlSW50KFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImFwcHJveGltYXRlX3RpbWVfcHJlY2lzaW9uX21zIiwgIjIiKSkpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0lOVEVSVkFMX01TID0gTWF0aC5tYXgoMSwgQVBQUk9YSU1BVEVfVElNRV9QUkVDSVNJT05fTVMuZ2V0SW50KCkpOwogICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVSUk9SX05BTk9TID0gTUlMTElTRUNPTkRTLnRvTmFub3MoVVBEQVRFX0lOVEVSVkFMX01TKTsKIAogICAgICAgICBwcml2YXRlIGZpbmFsIE1vbm90b25pY0Nsb2NrIHByZWNpc2U7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9OYXRpdmVTU1RhYmxlTG9hZGVyQ2xpZW50LmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9OYXRpdmVTU1RhYmxlTG9hZGVyQ2xpZW50LmphdmEKaW5kZXggZGRiM2VhNi4uMTlkY2MyMyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvTmF0aXZlU1NUYWJsZUxvYWRlckNsaWVudC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL05hdGl2ZVNTVGFibGVMb2FkZXJDbGllbnQuamF2YQpAQCAtMjEyLDcgKzIxMiw3IEBACiAKICAgICAgICAgaW50IHBvc2l0aW9uID0gcm93LmdldEludCgicG9zaXRpb24iKTsKICAgICAgICAgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhLktpbmQga2luZCA9IENvbHVtbk1ldGFkYXRhLktpbmQudmFsdWVPZihyb3cuZ2V0U3RyaW5nKCJraW5kIikudG9VcHBlckNhc2UoKSk7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRhYmxlLCBuYW1lLCB0eXBlLCBwb3NpdGlvbiwga2luZCk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRhYmxlLCBuYW1lLCB0eXBlLCBwb3NpdGlvbiwga2luZCwgbnVsbCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgRHJvcHBlZENvbHVtbiBjcmVhdGVEcm9wcGVkQ29sdW1uRnJvbVJvdyhSb3cgcm93LCBTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZSkKQEAgLTIyMCw3ICsyMjAsNyBAQAogICAgICAgICBTdHJpbmcgbmFtZSA9IHJvdy5nZXRTdHJpbmcoImNvbHVtbl9uYW1lIik7CiAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gQ1FMVHlwZVBhcnNlci5wYXJzZShrZXlzcGFjZSwgcm93LmdldFN0cmluZygidHlwZSIpLCBUeXBlcy5ub25lKCkpOwogICAgICAgICBDb2x1bW5NZXRhZGF0YS5LaW5kIGtpbmQgPSBDb2x1bW5NZXRhZGF0YS5LaW5kLnZhbHVlT2Yocm93LmdldFN0cmluZygia2luZCIpLnRvVXBwZXJDYXNlKCkpOwotICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW4gPSBuZXcgQ29sdW1uTWV0YWRhdGEoa2V5c3BhY2UsIHRhYmxlLCBDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKG5hbWUsIHRydWUpLCB0eXBlLCBDb2x1bW5NZXRhZGF0YS5OT19QT1NJVElPTiwga2luZCk7CisgICAgICAgIENvbHVtbk1ldGFkYXRhIGNvbHVtbiA9IG5ldyBDb2x1bW5NZXRhZGF0YShrZXlzcGFjZSwgdGFibGUsIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgdHJ1ZSksIHR5cGUsIENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLCBraW5kLCBudWxsKTsKICAgICAgICAgbG9uZyBkcm9wcGVkVGltZSA9IHJvdy5nZXRUaW1lc3RhbXAoImRyb3BwZWRfdGltZSIpLmdldFRpbWUoKTsKICAgICAgICAgcmV0dXJuIG5ldyBEcm9wcGVkQ29sdW1uKGNvbHVtbiwgZHJvcHBlZFRpbWUpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL09iamVjdFNpemVzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9PYmplY3RTaXplcy5qYXZhCmluZGV4IDA3MDY2Y2YuLjJkOTQ5ODMgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL09iamVjdFNpemVzLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvT2JqZWN0U2l6ZXMuamF2YQpAQCAtMTksNiArMTksOSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzOwogCitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAogaW1wb3J0IG9yZy5naXRodWIuamFtbS5NZW1vcnlMYXlvdXRTcGVjaWZpY2F0aW9uOwpAQCAtMzEsNiArMzQsNyBAQAogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lbW9yeU1ldGVyIG1ldGVyID0gbmV3IE1lbW9yeU1ldGVyKCkud2l0aEd1ZXNzaW5nKE1lbW9yeU1ldGVyLkd1ZXNzLkZBTExCQUNLX1VOU0FGRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlnbm9yZUtub3duU2luZ2xldG9ucygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lbW9yeU1ldGVyIG9taXRTaGFyZWRNZXRlciA9IG1ldGVyLm9taXRTaGFyZWRCdWZmZXJPdmVyaGVhZCgpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBFTVBUWV9IRUFQX0JVRkZFUl9TSVpFID0gbWVhc3VyZShCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUik7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBFTVBUWV9CWVRFX0FSUkFZX1NJWkUgPSBtZWFzdXJlKG5ldyBieXRlWzBdKTsKQEAgLTM4LDYgKzQyLDggQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgRElSRUNUX0JVRkZFUl9IRUFQX1NJWkUgPSBtZWFzdXJlKEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoMCkpOwogCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIElQVjZfU09DS0VUX0FERFJFU1NfU0laRSA9IE9iamVjdFNpemVzLm1lYXN1cmVEZWVwKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhnZXRJcHZBZGRyZXNzKDE2KSwgNDIpKTsKKwogICAgIC8qKgogICAgICAqIE1lbW9yeSBhIGJ5dGUgYXJyYXkgY29uc3VtZXMKICAgICAgKgpAQCAtMjE3LDEwICsyMjMsMzggQEAKIAogICAgIC8qKgogICAgICAqIEBwYXJhbSBwb2pvIHRoZSBvYmplY3QgdG8gbWVhc3VyZQorICAgICAqIEByZXR1cm4gVGhlIHNpemUgb24gdGhlIGhlYXAgb2YgdGhlIGluc3RhbmNlIGFuZCBhbGwgcmV0YWluZWQgaGVhcCByZWZlcmVuY2VkIGJ5IGl0LCBleGNsdWRpbmcgcG9ydGlvbnMgb2YKKyAgICAgKiBCeXRlQnVmZmVyIHRoYXQgYXJlIG5vdCBkaXJlY3RseSByZWZlcmVuY2VkIGJ5IGl0IGJ1dCBpbmNsdWRpbmcgYW55IG90aGVyIHJlZmVyZW5jZWQgdGhhdCBtYXkgYWxzbyBiZSByZXRhaW5lZAorICAgICAqIGJ5IG90aGVyIG9iamVjdHMuIFRoaXMgYWxzbyBpbmNsdWRlcyBieXRlcyByZWZlcmVuY2VkIGluIGRpcmVjdCBieXRlIGJ1ZmZlcnMsIGFuZCBtYXkgZG91YmxlLWNvdW50IG1lbW9yeSBpZgorICAgICAqIGl0IGlzIHJlZmVyZW5jZWQgYnkgbXVsdGlwbGUgQnl0ZUJ1ZmZlciBjb3BpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIG1lYXN1cmVEZWVwT21pdFNoYXJlZChPYmplY3QgcG9qbykKKyAgICB7CisgICAgICAgIHJldHVybiBvbWl0U2hhcmVkTWV0ZXIubWVhc3VyZURlZXAocG9qbyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBvam8gdGhlIG9iamVjdCB0byBtZWFzdXJlCiAgICAgICogQHJldHVybiB0aGUgc2l6ZSBvbiB0aGUgaGVhcCBvZiB0aGUgaW5zdGFuY2Ugb25seSwgZXhjbHVkaW5nIGFueSByZWZlcmVuY2VkIG9iamVjdHMKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGxvbmcgbWVhc3VyZShPYmplY3QgcG9qbykKICAgICB7CiAgICAgICAgIHJldHVybiBtZXRlci5tZWFzdXJlKHBvam8pOwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEluZXRBZGRyZXNzIGdldElwdkFkZHJlc3MoaW50IHNpemUpCisgICAgeworICAgICAgICBpZiAoc2l6ZSA9PSAxNiB8fCBzaXplID09NCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEluZXRBZGRyZXNzLmdldEJ5QWRkcmVzcyhuZXcgYnl0ZVtzaXplXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHNpemUgb2YgYSBieXRlIGFycmF5IHdoZW4gZ2V0dGluZyBhbmQgaXB2IGFkZHJlc3M6ICIgKyBzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkV4Y3BlY3RlZCBhIGJ5dGUgYXJyYXkgc2l6ZSBvZiA0IG9yIDE2IGZvciBhbiBpcHYgYWRkcmVzcyBidXQgZ290OiAiICsgc2l6ZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvT3V0cHV0SGFuZGxlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvT3V0cHV0SGFuZGxlci5qYXZhCmluZGV4IDgyMDE2MGQuLjc2ZWIzNDUgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL091dHB1dEhhbmRsZXIuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9PdXRwdXRIYW5kbGVyLmphdmEKQEAgLTI2LDIwICsyNiwzNiBAQAogcHVibGljIGludGVyZmFjZSBPdXRwdXRIYW5kbGVyCiB7CiAgICAgLy8gY2FsbGVkIHdoZW4gYW4gaW1wb3J0YW50IGluZm8gbmVlZCB0byBiZSBkaXNwbGF5ZWQKLSAgICBwdWJsaWMgdm9pZCBvdXRwdXQoU3RyaW5nIG1zZyk7Ci0KLSAgICAvLyBjYWxsZWQgd2hlbiBhIGxlc3MgaW1wb3J0YW50IGluZm8gbmVlZCB0byBiZSBkaXNwbGF5ZWQKLSAgICBwdWJsaWMgdm9pZCBkZWJ1ZyhTdHJpbmcgbXNnKTsKLQotICAgIC8vIGNhbGxlZCB3aGVuIHRoZSB1c2VyIG5lZWRzIHRvIGJlIHdhcm4KLSAgICBwdWJsaWMgdm9pZCB3YXJuKFN0cmluZyBtc2cpOwotICAgIHB1YmxpYyB2b2lkIHdhcm4oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRoKTsKLSAgICBwdWJsaWMgZGVmYXVsdCB2b2lkIHdhcm4oVGhyb3dhYmxlIHRoKQorICAgIHZvaWQgb3V0cHV0KFN0cmluZyBtc2cpOworICAgIGRlZmF1bHQgdm9pZCBvdXRwdXQoU3RyaW5nIG1zZywgT2JqZWN0IC4uLiBhcmdzKQogICAgIHsKLSAgICAgICAgd2Fybih0aC5nZXRNZXNzYWdlKCksIHRoKTsKKyAgICAgICAgb3V0cHV0KFN0cmluZy5mb3JtYXQobXNnLCBhcmdzKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBMb2dPdXRwdXQgaW1wbGVtZW50cyBPdXRwdXRIYW5kbGVyCisgICAgLy8gY2FsbGVkIHdoZW4gYSBsZXNzIGltcG9ydGFudCBpbmZvIG5lZWQgdG8gYmUgZGlzcGxheWVkCisgICAgdm9pZCBkZWJ1ZyhTdHJpbmcgbXNnKTsKKyAgICBkZWZhdWx0IHZvaWQgZGVidWcoU3RyaW5nIG1zZywgT2JqZWN0IC4uLiBhcmdzKQorICAgIHsKKyAgICAgICAgZGVidWcoU3RyaW5nLmZvcm1hdChtc2csIGFyZ3MpKTsKKyAgICB9CisKKyAgICAvLyBjYWxsZWQgd2hlbiB0aGUgdXNlciBuZWVkcyB0byBiZSB3YXJuCisgICAgdm9pZCB3YXJuKFN0cmluZyBtc2cpOworICAgIHZvaWQgd2FybihUaHJvd2FibGUgdGgsIFN0cmluZyBtc2cpOworICAgIGRlZmF1bHQgdm9pZCB3YXJuKFRocm93YWJsZSB0aCkKKyAgICB7CisgICAgICAgIHdhcm4odGgsIHRoLmdldE1lc3NhZ2UoKSk7CisgICAgfQorICAgIGRlZmF1bHQgdm9pZCB3YXJuKFRocm93YWJsZSB0aCwgU3RyaW5nIG1zZywgT2JqZWN0Li4uIGFyZ3MpCisgICAgeworICAgICAgICB3YXJuKHRoLCBTdHJpbmcuZm9ybWF0KG1zZywgYXJncykpOworICAgIH0KKyAgICBkZWZhdWx0IHZvaWQgd2FybihTdHJpbmcgbXNnLCBPYmplY3QgLi4uIGFyZ3MpCisgICAgeworICAgICAgICB3YXJuKFN0cmluZy5mb3JtYXQobXNnLCBhcmdzKSk7CisgICAgfQorCisgICAgY2xhc3MgTG9nT3V0cHV0IGltcGxlbWVudHMgT3V0cHV0SGFuZGxlcgogICAgIHsKICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKExvZ091dHB1dC5jbGFzcyk7CiAKQEAgLTU4LDEzICs3NCwxMyBAQAogICAgICAgICAgICAgbG9nZ2VyLndhcm4obXNnKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHdhcm4oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRoKQorICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKFRocm93YWJsZSB0aCwgU3RyaW5nIG1zZykKICAgICAgICAgewogICAgICAgICAgICAgbG9nZ2VyLndhcm4obXNnLCB0aCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN5c3RlbU91dHB1dCBpbXBsZW1lbnRzIE91dHB1dEhhbmRsZXIKKyAgICBjbGFzcyBTeXN0ZW1PdXRwdXQgaW1wbGVtZW50cyBPdXRwdXRIYW5kbGVyCiAgICAgewogICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBkZWJ1ZzsKICAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gcHJpbnRTdGFjazsKQEAgLTk1LDE0ICsxMTEsMTQgQEAKIAogICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKFN0cmluZyBtc2cpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHdhcm4obXNnLCBudWxsKTsKKyAgICAgICAgICAgIHdhcm4oKFRocm93YWJsZSkgbnVsbCwgbXNnKTsKICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIHdhcm4oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRoKQorICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKFRocm93YWJsZSB0aCwgU3RyaW5nIG1zZykKICAgICAgICAgewogICAgICAgICAgICAgd2Fybk91dC5wcmludGxuKCJXQVJOSU5HOiAiICsgbXNnKTsKICAgICAgICAgICAgIGlmIChwcmludFN0YWNrICYmIHRoICE9IG51bGwpCiAgICAgICAgICAgICAgICAgdGgucHJpbnRTdGFja1RyYWNlKHdhcm5PdXQpOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1Jhbmdlc1NlcmlhbGl6ZXIuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1Jhbmdlc1NlcmlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzA3NTAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvUmFuZ2VzU2VyaWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlR5cGVTaXplczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uSVZlcnNpb25lZFNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CisKK3B1YmxpYyBjbGFzcyBSYW5nZXNTZXJpYWxpemVyIGltcGxlbWVudHMgSVZlcnNpb25lZFNlcmlhbGl6ZXI8Q29sbGVjdGlvbjxSYW5nZTxUb2tlbj4+PgoreworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUmFuZ2VzU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFJhbmdlc1NlcmlhbGl6ZXIoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gcmFuZ2VzLCBEYXRhT3V0cHV0UGx1cyBvdXQsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIG91dC53cml0ZUludChyYW5nZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChSYW5nZTxUb2tlbj4gciA6IHJhbmdlcykKKyAgICAgICAgeworICAgICAgICAgICAgVG9rZW4uc2VyaWFsaXplci5zZXJpYWxpemUoci5sZWZ0LCBvdXQsIHZlcnNpb24pOworICAgICAgICAgICAgVG9rZW4uc2VyaWFsaXplci5zZXJpYWxpemUoci5yaWdodCwgb3V0LCB2ZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFJhbmdlPFRva2VuPj4gZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbiwgaW50IHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaW50IGNvdW50ID0gaW4ucmVhZEludCgpOworICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gcmFuZ2VzID0gbmV3IEFycmF5TGlzdDw+KGNvdW50KTsKKyAgICAgICAgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBhcnRpdGlvbmVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVG9rZW4gc3RhcnQgPSBUb2tlbi5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCBwYXJ0aXRpb25lciwgdmVyc2lvbik7CisgICAgICAgICAgICBUb2tlbiBlbmQgPSBUb2tlbi5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCBwYXJ0aXRpb25lciwgdmVyc2lvbik7CisgICAgICAgICAgICByYW5nZXMuYWRkKG5ldyBSYW5nZTw+KHN0YXJ0LCBlbmQpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmFuZ2VzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIHNlcmlhbGl6ZWRTaXplKENvbGxlY3Rpb248UmFuZ2U8VG9rZW4+PiByYW5nZXMsIGludCB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgaW50IHNpemUgPSBUeXBlU2l6ZXMuc2l6ZW9mKHJhbmdlcy5zaXplKCkpOworICAgICAgICBpZiAocmFuZ2VzLnNpemUoKSA+IDApCisgICAgICAgICAgICBzaXplICs9IHJhbmdlcy5zaXplKCkgKiAyICogVG9rZW4uc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShyYW5nZXMuaXRlcmF0b3IoKS5uZXh0KCkubGVmdCwgdmVyc2lvbik7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1JlZmxlY3Rpb25VdGlscy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvUmVmbGVjdGlvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxMjU2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1JlZmxlY3Rpb25VdGlscy5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBSZWZsZWN0aW9uVXRpbHMKK3sKKyAgICBwcml2YXRlIFJlZmxlY3Rpb25VdGlscygpCisgICAgeworCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGaWVsZCBnZXRNb2RpZmllcnNGaWVsZCgpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gYmVsb3cgY29kZSB3b3JrcyBiZWZvcmUgSmF2YSAxMgorICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEZpZWxkLmNsYXNzLmdldERlY2xhcmVkRmllbGQoIm1vZGlmaWVycyIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzIGlzIG1pdGlnYXRpb24gZm9yIEpESyAxNyAoaHR0cHM6Ly9idWdzLm9wZW5qZGsub3JnL2Jyb3dzZS9KREstODIxMDUyMikKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1ldGhvZCBnZXREZWNsYXJlZEZpZWxkczAgPSBDbGFzcy5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0RGVjbGFyZWRGaWVsZHMwIiwgYm9vbGVhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgZ2V0RGVjbGFyZWRGaWVsZHMwLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgICAgICAgICAgRmllbGRbXSBmaWVsZHMgPSAoRmllbGRbXSkgZ2V0RGVjbGFyZWRGaWVsZHMwLmludm9rZShGaWVsZC5jbGFzcywgZmFsc2UpOworICAgICAgICAgICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBmaWVsZHMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIm1vZGlmaWVycyIuZXF1YWxzKGZpZWxkLmdldE5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChSZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uIGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGUuYWRkU3VwcHJlc3NlZChleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1NoYXJlZC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU2hhcmVkLmphdmEKaW5kZXggZTU3NmM4Ni4uNjQzMzYyNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU2hhcmVkLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU2hhcmVkLmphdmEKQEAgLTI0LDcgKzI0LDcgQEAKIGltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CiAKIC8qKgotICogVGVsbHMganZtLWR0ZXN0IHRoYXQgYSBjbGFzcyBzaG91bGQgYmUgc2hhcmVkIGFjY3Jvc3MgYWxsIHtAbGluayBDbGFzc0xvYWRlcn1zLgorICogVGVsbHMganZtLWR0ZXN0IHRoYXQgYSBjbGFzcyBzaG91bGQgYmUgc2hhcmVkIGFjcm9zcyBhbGwge0BsaW5rIENsYXNzTG9hZGVyfXMuCiAgKgogICogSnZtLWR0ZXN0IHJlbGllcyBvbiBjbGFzc2xvYWRlciBpc29sYXRpb24gdG8gcnVuIG11bHRpcGxlIGNhc3NhbmRyYSBpbnN0YW5jZXMgaW4gdGhlIHNhbWUgSlZNLCB0aGlzIG1ha2VzIGl0CiAgKiBzbyBzb21lIGNsYXNzZXMgZG8gbm90IGdldCBzaGFyZWQgKG91dHNpZGUgYSBibGVzc3NlZCBzZXQgb2YgY2xhc3Nlcy9wYWNrYWdlcykuIFdoZW4gdGhlIGRlZmF1bHQgYmVoYXZpb3IKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1N0YXR1c0xvZ2dlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU3RhdHVzTG9nZ2VyLmphdmEKaW5kZXggZGNiMTEzNS4uMDg1MDIyNCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU3RhdHVzTG9nZ2VyLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU3RhdHVzTG9nZ2VyLmphdmEKQEAgLTE5LDE3ICsxOSwxOSBAQAogCiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DYXNzYW5kcmFNZXRyaWNzUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5UaHJlYWRQb29sTWV0cmljczsKLQogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5BdXRvU2F2aW5nQ2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuSVJvd0NhY2hlRW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuS2V5Q2FjaGVLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuUm93Q2FjaGVLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dJbmRleEVudHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DYXNzYW5kcmFNZXRyaWNzUmVnaXN0cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5UaHJlYWRQb29sTWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNhY2hlU2VydmljZTsKIApAQCAtOTIsNyArOTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXNzYWdpbmdTZXJ2aWNlIiwgIm4vYSIsIHBlbmRpbmdMYXJnZU1lc3NhZ2VzICsgIi8iICsgcGVuZGluZ1NtYWxsTWVzc2FnZXMpKTsKIAogICAgICAgICAvLyBHbG9iYWwga2V5L3JvdyBjYWNoZSBpbmZvcm1hdGlvbgotICAgICAgICBBdXRvU2F2aW5nQ2FjaGU8S2V5Q2FjaGVLZXksIFJvd0luZGV4RW50cnk+IGtleUNhY2hlID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlOworICAgICAgICBBdXRvU2F2aW5nQ2FjaGU8S2V5Q2FjaGVLZXksIEFic3RyYWN0Um93SW5kZXhFbnRyeT4ga2V5Q2FjaGUgPSBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGU7CiAgICAgICAgIEF1dG9TYXZpbmdDYWNoZTxSb3dDYWNoZUtleSwgSVJvd0NhY2hlRW50cnk+IHJvd0NhY2hlID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLnJvd0NhY2hlOwogCiAgICAgICAgIGludCBrZXlDYWNoZUtleXNUb1NhdmUgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0S2V5Q2FjaGVLZXlzVG9TYXZlKCk7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9TeW5jVXRpbC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU3luY1V0aWwuamF2YQppbmRleCA2MDU1ODU5Li4xYWRjNGZjIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9TeW5jVXRpbC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1N5bmNVdGlsLmphdmEKQEAgLTI3LDEwICsyNywxMyBAQAogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKLQogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudEVudjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTWVtb3J5VXRpbDsKKwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTg3LDggKzkwLDggQEAKICAgICAgICAgZmRVc2VDb3VudEZpZWxkID0gZmRVc2VDb3VudFRlbXA7CiAKICAgICAgICAgLy9JZiBza2lwcGluZyBzeW5jaW5nIGlzIHJlcXVlc3RlZCBieSBhbnkgbWVhbnMgdGhlbiBza2lwIHRoZW0uCi0gICAgICAgIGJvb2xlYW4gc2tpcFN5bmNQcm9wZXJ0eSA9IEJvb2xlYW4uZ2V0Qm9vbGVhbihDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInNraXBfc3luYyIpOwotICAgICAgICBib29sZWFuIHNraXBTeW5jRW52ID0gQm9vbGVhbi52YWx1ZU9mKFN5c3RlbS5nZXRlbnYoKS5nZXRPckRlZmF1bHQoIkNBU1NBTkRSQV9TS0lQX1NZTkMiLCAiZmFsc2UiKSk7CisgICAgICAgIGJvb2xlYW4gc2tpcFN5bmNQcm9wZXJ0eSA9IENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0NBU1NBTkRSQV9TS0lQX1NZTkMuZ2V0Qm9vbGVhbigpOworICAgICAgICBib29sZWFuIHNraXBTeW5jRW52ID0gQ2Fzc2FuZHJhUmVsZXZhbnRFbnYuQ0FTU0FORFJBX1NLSVBfU1lOQy5nZXRCb29sZWFuKCk7CiAgICAgICAgIFNLSVBfU1lOQyA9IHNraXBTeW5jUHJvcGVydHkgfHwgc2tpcFN5bmNFbnY7CiAgICAgICAgIGlmIChTS0lQX1NZTkMpCiAgICAgICAgIHsKQEAgLTk5LDYgKzEwMiwxMiBAQAogICAgIHB1YmxpYyBzdGF0aWMgTWFwcGVkQnl0ZUJ1ZmZlciBmb3JjZShNYXBwZWRCeXRlQnVmZmVyIGJ1ZikKICAgICB7CiAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGJ1Zik7CisgICAgICAgIE9iamVjdCBhdHRhY2htZW50ID0gTWVtb3J5VXRpbC5nZXRBdHRhY2htZW50KGJ1Zik7CisgICAgICAgIGlmIChhdHRhY2htZW50IGluc3RhbmNlb2YgUnVubmFibGUpCisgICAgICAgIHsKKyAgICAgICAgICAgICgoUnVubmFibGUpIGF0dGFjaG1lbnQpLnJ1bigpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgfQogICAgICAgICBpZiAoU0tJUF9TWU5DKQogICAgICAgICB7CiAgICAgICAgICAgICBPYmplY3QgZmQgPSBudWxsOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvVGhyb3dhYmxlcy5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvVGhyb3dhYmxlcy5qYXZhCmluZGV4IDgzMzdhNTYuLmQ2MzY3MTEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1Rocm93YWJsZXMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9UaHJvd2FibGVzLmphdmEKQEAgLTE4LDE5ICsxOCwyNSBAQAogKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHM7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTm9ubnVsbDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTUmVhZEVycm9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5VbmNoZWNrZWRJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKIAogcHVibGljIGZpbmFsIGNsYXNzIFRocm93YWJsZXMKQEAgLTE4NCw2ICsxOTAsNTkgQEAKICAgICAgICAgfSkpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEBzZWUge0BsaW5rICNjbG9zZUFuZEFkZFN1cHByZXNzZWQoVGhyb3dhYmxlLCBJdGVyYWJsZSl9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlQW5kQWRkU3VwcHJlc3NlZChATm9ubnVsbCBUaHJvd2FibGUgdCwgQXV0b0Nsb3NlYWJsZS4uLiBjbG9zZWFibGVzKQorICAgIHsKKyAgICAgICAgY2xvc2VBbmRBZGRTdXBwcmVzc2VkKHQsIEFycmF5cy5hc0xpc3QoY2xvc2VhYmxlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERvIHdoYXQge0BsaW5rICNjbG9zZUFuZEFkZFN1cHByZXNzZWQoVGhyb3dhYmxlLCBJdGVyYWJsZSl9IGRvZXMsIGFkZGl0aW9uYWxseSBmaWx0ZXJpbmcgb3V0IGFsbCBudWxsIGNsb3NhYmxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VOb25OdWxsQW5kQWRkU3VwcHJlc3NlZChATm9ubnVsbCBUaHJvd2FibGUgdCwgQXV0b0Nsb3NlYWJsZS4uLiBjbG9zZWFibGVzKQorICAgIHsKKyAgICAgICAgY2xvc2VBbmRBZGRTdXBwcmVzc2VkKHQsIEl0ZXJhYmxlcy5maWx0ZXIoQXJyYXlzLmFzTGlzdChjbG9zZWFibGVzKSwgT2JqZWN0czo6bm9uTnVsbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlcyBhbGwgY2xvc2FibGVzIGluIHRoZSBwcm92aWRlZCBjb2xsZWN0aW9ucyBhbmQgYWNjdW11bGF0ZXMgdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbnMgdGhyb3duIHdoZW4gY2xvc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2N1bXVsYXRlIG5vbi1udWxsIGV4Y2VwdGlvbiB0byBhY2N1bXVsYXRlIGVycm9ycyB0aHJvd24gd2hlbiBjbG9zaW5nIHRoZSBwcm92aWRlZCByZXNvdXJjZXMKKyAgICAgKiBAcGFyYW0gY2xvc2VhYmxlcyBjbG9zZWFibGVzIHRvIGJlIGNsb3NlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZUFuZEFkZFN1cHByZXNzZWQoQE5vbm51bGwgVGhyb3dhYmxlIGFjY3VtdWxhdGUsIEl0ZXJhYmxlPEF1dG9DbG9zZWFibGU+IGNsb3NlYWJsZXMpCisgICAgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChhY2N1bXVsYXRlKTsKKyAgICAgICAgZm9yIChBdXRvQ2xvc2VhYmxlIGNsb3NlYWJsZSA6IGNsb3NlYWJsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsb3NlYWJsZS5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSBleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY2N1bXVsYXRlLmFkZFN1cHByZXNzZWQoZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VlIHtAbGluayAjY2xvc2UoVGhyb3dhYmxlLCBJdGVyYWJsZSl9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUaHJvd2FibGUgY2xvc2UoVGhyb3dhYmxlIGFjY3VtdWxhdGUsIEF1dG9DbG9zZWFibGUgLi4uIGNsb3NlYWJsZXMpCisgICAgeworICAgICAgICByZXR1cm4gY2xvc2UoYWNjdW11bGF0ZSwgQXJyYXlzLmFzTGlzdChjbG9zZWFibGVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIGFsbCB0aGUgcmVzb3VyY2VzIGluIHRoZSBwcm92aWRlZCBjb2xsZWN0aW9ucyBhbmQgYWNjdW11bGF0ZXMgdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbnMgdGhyb3duIHdoZW4gY2xvc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2N1bXVsYXRlIHRoZSBpbml0aWFsIHZhbHVlIGZvciB0aGUgZXhjZXB0aW9uIGFjY3VtdWxhdG9yLCBjYW4gYmUge0Bjb2RlIG51bGx9CisgICAgICogQHBhcmFtIGNsb3NlYWJsZXMgY2xvc2VhYmxlcyB0byBiZSBjbG9zZWQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSBudWxsfSwge0BwYXJhbSBhY2N1bXVsYXRlfSBvciB0aGUgZmlyc3QgZXhjZXB0aW9uIHRocm93biB3aGVuIGNsb3NpbmcgdGhlIHByb3ZpZGVkIHJlc291cmNlcworICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgVGhyb3dhYmxlIGNsb3NlKFRocm93YWJsZSBhY2N1bXVsYXRlLCBJdGVyYWJsZTw/IGV4dGVuZHMgQXV0b0Nsb3NlYWJsZT4gY2xvc2VhYmxlcykKICAgICB7CiAgICAgICAgIGZvciAoQXV0b0Nsb3NlYWJsZSBjbG9zZWFibGUgOiBjbG9zZWFibGVzKQpAQCAtMjY3LDQgKzMyNiwxMSBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIHVuY2hlY2tlZCh1bndyYXBwZWQodCkpOwogICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBbnlDYXVzZShUaHJvd2FibGUgZXJyLCBDbGFzczw/IGV4dGVuZHMgVGhyb3dhYmxlPiBjYXVzZSkKKyAgICB7CisgICAgICAgIGlmICghYW55Q2F1c2VNYXRjaGVzKGVyciwgY2F1c2U6OmlzSW5zdGFuY2UpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJUaGUgZXhjZXB0aW9uIGlzIG5vdCBjYXVzZWQgYnkgIiArIGNhdXNlLmdldE5hbWUoKSwgZXJyKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9UaW1lVVVJRC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvVGltZVVVSUQuamF2YQppbmRleCA4ZDc5MDk2Li5kOTkzZjE3IDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9UaW1lVVVJRC5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1RpbWVVVUlELmphdmEKQEAgLTUzLDYgKzUzLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5UeXBlU2VyaWFsaXplcjsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUNST1NFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX1VOU0FGRV9USU1FX1VVSURfTk9ERTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ERVRFUk1JTklTTV9VTlNBRkVfVVVJRF9OT0RFOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwpAQCAtODIsNiArODMsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUlOX0NMT0NLX1NFUV9BTkRfTk9ERSA9IDB4ODA4MDgwODA4MDgwODA4MEw7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBNQVhfQ0xPQ0tfU0VRX0FORF9OT0RFID0gMHg3ZjdmN2Y3ZjdmN2Y3ZjdmTDsKIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBUSU1FVVVJRF9TSVpFID0gT2JqZWN0U2l6ZXMubWVhc3VyZURlZXAobmV3IFRpbWVVVUlEKDEwLCAxMCkpOwogCiAgICAgZmluYWwgbG9uZyB1dWlkVGltZXN0YW1wLCBsc2I7CiAKQEAgLTQzOCw5ICs0NDAsOCBAQAogICAgICAgICAgICAgaWYgKERFVEVSTUlOSVNNX1VOU0FGRV9VVUlEX05PREUuZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgICAgIHJldHVybiBGQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydCgpLmFkZHJlc3NCeXRlc1szXTsKIAotICAgICAgICAgICAgTG9uZyBzcGVjaWZpZWQgPSBMb25nLmdldExvbmcoImNhc3NhbmRyYS51bnNhZmUudGltZXV1aWRub2RlIik7Ci0gICAgICAgICAgICBpZiAoc3BlY2lmaWVkICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNwZWNpZmllZAorICAgICAgICAgICAgaWYgKENBU1NBTkRSQV9VTlNBRkVfVElNRV9VVUlEX05PREUuaXNQcmVzZW50KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIENBU1NBTkRSQV9VTlNBRkVfVElNRV9VVUlEX05PREUuZ2V0TG9uZygpCiAgICAgICAgICAgICAgICAgICAgICAgIF4gRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKS5hZGRyZXNzQnl0ZXNbM10KICAgICAgICAgICAgICAgICAgICAgICAgXiAoRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKS5hZGRyZXNzQnl0ZXNbMl0gPDwgOCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1dyYXBwZWRSdW5uYWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvV3JhcHBlZFJ1bm5hYmxlLmphdmEKaW5kZXggMWRlN2E0Ni4uOTgxZTAyNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvV3JhcHBlZFJ1bm5hYmxlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvV3JhcHBlZFJ1bm5hYmxlLmphdmEKQEAgLTE3LDggKzE3LDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKIAotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuVGhyb3dhYmxlczsKLQogcHVibGljIGFic3RyYWN0IGNsYXNzIFdyYXBwZWRSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlCiB7CiAgICAgcHVibGljIGZpbmFsIHZvaWQgcnVuKCkKQEAgLTI3LDkgKzI1LDEzIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJ1bk1heVRocm93KCk7CiAgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9iaW5sb2cvQmluTG9nLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9iaW5sb2cvQmluTG9nLmphdmEKaW5kZXggNDNmZjY3ZS4uOGIwZTAyNTcwIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9iaW5sb2cvQmluTG9nLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYmlubG9nL0JpbkxvZy5qYXZhCkBAIC0zNSw2ICszNSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAoraW1wb3J0IG5ldC5vcGVuaGZ0LmNocm9uaWNsZS5jb3JlLmlvLkJhY2tncm91bmRSZXNvdXJjZVJlbGVhc2VyOwogaW1wb3J0IG5ldC5vcGVuaGZ0LmNocm9uaWNsZS5xdWV1ZS5DaHJvbmljbGVRdWV1ZTsKIGltcG9ydCBuZXQub3BlbmhmdC5jaHJvbmljbGUucXVldWUuaW1wbC5zaW5nbGUuU2luZ2xlQ2hyb25pY2xlUXVldWU7CiBpbXBvcnQgbmV0Lm9wZW5oZnQuY2hyb25pY2xlLnF1ZXVlLmltcGwuc2luZ2xlLlNpbmdsZUNocm9uaWNsZVF1ZXVlQnVpbGRlcjsKQEAgLTQyLDYgKzQzLDcgQEAKIGltcG9ydCBuZXQub3BlbmhmdC5jaHJvbmljbGUucXVldWUuUm9sbEN5Y2xlczsKIGltcG9ydCBuZXQub3BlbmhmdC5jaHJvbmljbGUud2lyZS5XaXJlT3V0OwogaW1wb3J0IG5ldC5vcGVuaGZ0LmNocm9uaWNsZS53aXJlLldyaXRlTWFyc2hhbGxhYmxlOworaW1wb3J0IG5ldC5vcGVuaGZ0LnBvc2l4LlBvc2l4QVBJOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuTmFtZWRUaHJlYWRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOwpAQCAtNTEsNiArNTMsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuV2VpZ2h0ZWRRdWV1ZTsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DSFJPTklDTEVfQU5OT1VOQ0VSX0RJU0FCTEU7CiAKIC8qKgogICogQmluIGxvZyBpcyBhIGlzIHF1aWNrIGFuZCBkaXJ0eSBiaW5hcnkgbG9nIHRoYXQgaXMga2luZCBvZiBhIE5JSCB2ZXJzaW9uIG9mIGJpbmFyeSBsb2dnaW5nIHdpdGggYSB0cmFkaXRpb25hbCBsb2dnaW5nCkBAIC03NSw2ICs3OCwxMyBAQAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAidmVyc2lvbiI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsKIAorICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgLy8gQXZvaWQgdGhlIGNocm9uaWNsZSBhbm5vdW5jZW1lbnQgd2hpY2ggaXMgY29tbWVyY2lhbCBhZHZlcnRpc2VtZW50LCBhbmQgZGVidWcgaW5mbyB3ZSBhbHJlYWR5IHByaW50IGF0IHN0YXJ0dXAKKyAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL09wZW5IRlQvQ2hyb25pY2xlLUNvcmUvYmxvYi9jaHJvbmljbGUtY29yZS0yLjIzLjM2L3NyYy9tYWluL2phdmEvbmV0L29wZW5oZnQvY2hyb25pY2xlL2NvcmUvYW5ub3VuY2VyL0Fubm91bmNlci5qYXZhI0wzMi1MMzMKKyAgICAgICAgQ0hST05JQ0xFX0FOTk9VTkNFUl9ESVNBQkxFLnNldEJvb2xlYW4odHJ1ZSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBDaHJvbmljbGVRdWV1ZSBxdWV1ZTsKICAgICBwcml2YXRlIEV4Y2VycHRBcHBlbmRlciBhcHBlbmRlcjsKICAgICBAVmlzaWJsZUZvclRlc3RpbmcKQEAgLTEyMiw2ICsxMzIsNyBAQAogCiAgICAgcHJpdmF0ZSBCaW5Mb2coUGF0aCBwYXRoLCBCaW5Mb2dPcHRpb25zIG9wdGlvbnMsIEJpbkxvZ0FyY2hpdmVyIGFyY2hpdmVyKQogICAgIHsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoUG9zaXhBUEkucG9zaXgoKSwgIkNhbm5vdCBpbml0aWFsaXplIE9wZW5IRlQgUG9zaXgiKTsKICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwocGF0aCwgInBhdGggd2FzIG51bGwiKTsKICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwob3B0aW9ucy5yb2xsX2N5Y2xlLCAicm9sbF9jeWNsZSB3YXMgbnVsbCIpOwogICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQob3B0aW9ucy5tYXhfcXVldWVfd2VpZ2h0ID4gMCwgIm1heF9xdWV1ZV93ZWlnaHQgbXVzdCBiZSA+IDAiKTsKQEAgLTEzNSw3ICsxNDYsNiBAQAogICAgICAgICBhcHBlbmRlciA9IHF1ZXVlLmFjcXVpcmVBcHBlbmRlcigpOwogICAgICAgICB0aGlzLmJsb2NraW5nID0gb3B0aW9ucy5ibG9jazsKICAgICAgICAgdGhpcy5wYXRoID0gcGF0aDsKLQogICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgIH0KIApAQCAtMTcwLDYgKzE4MCw3IEBACiAKICAgICAgICAgc2hvdWxkQ29udGludWUgPSBmYWxzZTsKICAgICAgICAgc2FtcGxlUXVldWUucHV0KE5PX09QKTsKKyAgICAgICAgQmFja2dyb3VuZFJlc291cmNlUmVsZWFzZXIuc3RvcCgpOwogICAgICAgICBiaW5Mb2dUaHJlYWQuam9pbigpOwogICAgICAgICBhcHBlbmRlci5jbG9zZSgpOwogICAgICAgICBhcHBlbmRlciA9IG51bGw7CmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9idHJlZS9CVHJlZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnRyZWUvQlRyZWUuamF2YQppbmRleCBhMDI2ZjcwLi4yZDhmZWZiIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9idHJlZS9CVHJlZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J0cmVlL0JUcmVlLmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTWF0aC5tYXg7CiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5NYXRoLm1pbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5CVFJFRV9CUkFOQ0hfU0hJRlQ7CiAKIHB1YmxpYyBjbGFzcyBCVHJlZQogewpAQCAtNjIsNyArNjMsNyBAQAogICAgICAqIHN1YnRyZWVzIHdoZW4gbW9kaWZ5aW5nIHRoZSB0cmVlLCBzaW5jZSB0aGUgbW9kaWZpZWQgdHJlZSB3b3VsZCBuZWVkIG5ldyBwYXJlbnQgcmVmZXJlbmNlcykuCiAgICAgICogSW5zdGVhZCwgd2Ugc3RvcmUgdGhlc2UgcmVmZXJlbmNlcyBpbiBhIFBhdGggYXMgbmVlZGVkIHdoZW4gbmF2aWdhdGluZyB0aGUgdHJlZS4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCUkFOQ0hfU0hJRlQgPSBJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS5idHJlZS5icmFuY2hzaGlmdCIsIDUpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJSQU5DSF9TSElGVCA9IEJUUkVFX0JSQU5DSF9TSElGVC5nZXRJbnQoKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCUkFOQ0hfRkFDVE9SID0gMSA8PCBCUkFOQ0hfU0hJRlQ7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0tFWVMgPSBCUkFOQ0hfRkFDVE9SIC8gMiAtIDE7CkBAIC05NDksNiArOTUwLDkgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBzaXplT2ZTdHJ1Y3R1cmVPbkhlYXAoT2JqZWN0W10gdHJlZSkKICAgICB7CisgICAgICAgIGlmICh0cmVlID09IEVNUFRZX0xFQUYpCisgICAgICAgICAgICByZXR1cm4gMDsKKwogICAgICAgICBsb25nIHNpemUgPSBPYmplY3RTaXplcy5zaXplT2ZBcnJheSh0cmVlKTsKICAgICAgICAgaWYgKGlzTGVhZih0cmVlKSkKICAgICAgICAgICAgIHJldHVybiBzaXplOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZUNvbXBhcmFibGUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVDb21wYXJhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRmNDI1YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVDb21wYXJhYmxlLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGU7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisvKioKKyAqIEludGVyZmFjZSBpbmRpY2F0aW5nIGEgdmFsdWUgY2FuIGJlIHJlcHJlc2VudGVkL2lkZW50aWZpZWQgYnkgYSBjb21wYXJhYmxlIHtAbGluayBCeXRlU291cmNlfS4KKyAqCisgKiBBbGwgQ2Fzc2FuZHJhIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFydCBvZiBhIHByaW1hcnkga2V5IGhhdmUgYSBjb3JyZXNwb25kaW5nIGJ5dGUtY29tcGFyYWJsZSB0cmFuc2xhdGlvbiwKKyAqIGRldGFpbGVkIGluIEJ5dGVDb21wYXJhYmxlLm1kLiBCeXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb25zIGFyZSB1c2VkIGluIHNvbWUgbWVtdGFibGUgYXMgd2VsbCBhcyBwcmltYXJ5IGFuZAorICogc2Vjb25kYXJ5IGluZGV4IGltcGxlbWVudGF0aW9ucy4KKyAqLworcHVibGljIGludGVyZmFjZSBCeXRlQ29tcGFyYWJsZQoreworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzb3VyY2UgdGhhdCBnZW5lcmF0ZXMgdGhlIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUgYnl0ZSBieSBieXRlLgorICAgICAqLworICAgIEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmVyc2lvbiB2ZXJzaW9uKTsKKworICAgIGVudW0gVmVyc2lvbgorICAgIHsKKyAgICAgICAgTEVHQUNZLCAvLyBFbmNvZGluZyB1c2VkIGluIGxlZ2FjeSBzc3RhYmxlIGZvcm1hdDsgZm9yd2FyZCAodmFsdWUgdG8gYnl0ZS1jb21wYXJhYmxlKSB0cmFuc2xhdGlvbiBvbmx5CisgICAgICAgIE9TUzUwLCAgLy8gQ0FTU0FORFJBIDUuMCBlbmNvZGluZworICAgIH0KKworICAgIEJ5dGVDb21wYXJhYmxlIEVNUFRZID0gKFZlcnNpb24gdmVyc2lvbikgLT4gQnl0ZVNvdXJjZS5FTVBUWTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBmcm9tIHRoZSBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb24uIFVzZWQgZm9yIGRlYnVnZ2luZy4KKyAgICAgKi8KKyAgICBkZWZhdWx0IFN0cmluZyBieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIEJ5dGVTb3VyY2Ugc3RyZWFtID0gYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbik7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiAibnVsbCI7CisgICAgICAgIGZvciAoaW50IGIgPSBzdHJlYW0ubmV4dCgpOyBiICE9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTTsgYiA9IHN0cmVhbS5uZXh0KCkpCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKChiID4+IDQpICYgMHhGKSkuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoYiAmIDB4RikpOworICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8vIFNpbXBsZSBmYWN0b3JpZXMgdXNlZCBmb3IgdGVzdGluZworCisgICAgc3RhdGljIEJ5dGVDb21wYXJhYmxlIG9mKFN0cmluZyBzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHYgLT4gQnl0ZVNvdXJjZS5vZihzLCB2KTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGUgb2YobG9uZyB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB2IC0+IEJ5dGVTb3VyY2Uub2YodmFsdWUpOworICAgIH0KKworICAgIHN0YXRpYyBCeXRlQ29tcGFyYWJsZSBvZihpbnQgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gdiAtPiBCeXRlU291cmNlLm9mKHZhbHVlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGUgZml4ZWRMZW5ndGgoQnl0ZUJ1ZmZlciBieXRlcykKKyAgICB7CisgICAgICAgIHJldHVybiB2IC0+IEJ5dGVTb3VyY2UuZml4ZWRMZW5ndGgoYnl0ZXMpOworICAgIH0KKworICAgIHN0YXRpYyBCeXRlQ29tcGFyYWJsZSBmaXhlZExlbmd0aChieXRlW10gYnl0ZXMpCisgICAgeworICAgICAgICByZXR1cm4gdiAtPiBCeXRlU291cmNlLmZpeGVkTGVuZ3RoKGJ5dGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2VwYXJhdG9yIGZvciB0d28gYnl0ZSBzb3VyY2VzLCBpLmUuIHNvbWV0aGluZyB0aGF0IGlzIGRlZmluaXRlbHkgPiBwcmV2TWF4LCBhbmQgPD0gY3Vyck1pbiwgYXNzdW1pbmcKKyAgICAgKiBwcmV2TWF4IDwgY3Vyck1pbi4KKyAgICAgKiBUaGlzIHJldHVybnMgdGhlIHNob3J0ZXN0IHByZWZpeCBvZiBjdXJyTWluIHRoYXQgaXMgZ3JlYXRlciB0aGFuIHByZXZNYXguCisgICAgICovCisgICAgc3RhdGljIEJ5dGVDb21wYXJhYmxlIHNlcGFyYXRvclByZWZpeChCeXRlQ29tcGFyYWJsZSBwcmV2TWF4LCBCeXRlQ29tcGFyYWJsZSBjdXJyTWluKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHZlcnNpb24gLT4gQnl0ZVNvdXJjZS5zZXBhcmF0b3JQcmVmaXgocHJldk1heC5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSwgY3Vyck1pbi5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNlcGFyYXRvciBmb3IgdHdvIGJ5dGUgY29tcGFyYWJsZSwgaS5lLiBzb21ldGhpbmcgdGhhdCBpcyBkZWZpbml0ZWx5ID4gcHJldk1heCwgYW5kIDw9IGN1cnJNaW4sIGFzc3VtaW5nCisgICAgICogcHJldk1heCA8IGN1cnJNaW4uCisgICAgICogVGhpcyBpcyBhIHN0cmVhbSBvZiBsZW5ndGggMSBsb25nZXIgdGhhbiB0aGUgY29tbW9uIHByZWZpeCBvZiB0aGUgdHdvIHN0cmVhbXMsIHdpdGggbGFzdCBieXRlIG9uZSBoaWdoZXIgdGhhbiB0aGUKKyAgICAgKiBwcmV2TWF4IHN0cmVhbS4KKyAgICAgKi8KKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGUgc2VwYXJhdG9yR3QoQnl0ZUNvbXBhcmFibGUgcHJldk1heCwgQnl0ZUNvbXBhcmFibGUgY3Vyck1pbikKKyAgICB7CisgICAgICAgIHJldHVybiB2ZXJzaW9uIC0+IEJ5dGVTb3VyY2Uuc2VwYXJhdG9yR3QocHJldk1heC5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSwgY3Vyck1pbi5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSk7CisgICAgfQorCisgICAgc3RhdGljIEJ5dGVDb21wYXJhYmxlIGN1dChCeXRlQ29tcGFyYWJsZSBzcmMsIGludCBjdXRvZmYpCisgICAgeworICAgICAgICByZXR1cm4gdmVyc2lvbiAtPiBCeXRlU291cmNlLmN1dChzcmMuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbiksIGN1dG9mZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBsZW5ndGggb2YgYSBieXRlIGNvbXBhcmFibGUsIG5vdCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0b3IgYnl0ZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IGxlbmd0aChCeXRlQ29tcGFyYWJsZSBzcmMsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGludCBsID0gMDsKKyAgICAgICAgQnl0ZVNvdXJjZSBzID0gc3JjLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pOworICAgICAgICB3aGlsZSAocy5uZXh0KCkgIT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgKytsOworICAgICAgICByZXR1cm4gbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIHR3byBieXRlLWNvbXBhcmFibGUgdmFsdWVzIGJ5IHRoZWlyIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbi4gVXNlZCBmb3IgdGVzdHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgdGhlIGxleGljb2dyYXBoaWMgdW5zaWduZWQgYnl0ZSBjb21wYXJpc29uIG9mIHRoZSBieXRlLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb25zIG9mIHRoZQorICAgICAqICAgICAgICAgdHdvIGFyZ3VtZW50cworICAgICAqLworICAgIHN0YXRpYyBpbnQgY29tcGFyZShCeXRlQ29tcGFyYWJsZSBieXRlczEsIEJ5dGVDb21wYXJhYmxlIGJ5dGVzMiwgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgQnl0ZVNvdXJjZSBzMSA9IGJ5dGVzMS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKyAgICAgICAgQnl0ZVNvdXJjZSBzMiA9IGJ5dGVzMi5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKworICAgICAgICBpZiAoczEgPT0gbnVsbCB8fCBzMiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4uY29tcGFyZShzMSAhPSBudWxsLCBzMiAhPSBudWxsKTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGIxID0gczEubmV4dCgpOworICAgICAgICAgICAgaW50IGIyID0gczIubmV4dCgpOworICAgICAgICAgICAgaW50IGNtcCA9IEludGVnZXIuY29tcGFyZShiMSwgYjIpOworICAgICAgICAgICAgaWYgKGNtcCAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBjbXA7CisgICAgICAgICAgICBpZiAoYjEgPT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtaW5pbXVtIHByZWZpeCB0aGF0IGRpZmZlcmVudGlhdGVzIHRoZSB0d28gZ2l2ZW4gYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9ucy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IGRpZmZQb2ludChCeXRlQ29tcGFyYWJsZSBieXRlczEsIEJ5dGVDb21wYXJhYmxlIGJ5dGVzMiwgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgQnl0ZVNvdXJjZSBzMSA9IGJ5dGVzMS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKyAgICAgICAgQnl0ZVNvdXJjZSBzMiA9IGJ5dGVzMi5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKyAgICAgICAgaW50IHBvcyA9IDE7CisgICAgICAgIGludCBiOworICAgICAgICB3aGlsZSAoKGIgPSBzMS5uZXh0KCkpID09IHMyLm5leHQoKSAmJiBiICE9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSkKKyAgICAgICAgICAgICsrcG9zOworICAgICAgICByZXR1cm4gcG9zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVDb21wYXJhYmxlLm1kIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZUNvbXBhcmFibGUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxMmUyNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVDb21wYXJhYmxlLm1kCkBAIC0wLDAgKzEsNzEyIEBACis8IS0tLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAKKyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKyMgQnl0ZS1jb21wYXJhYmxlIHRyYW5zbGF0aW9uIG9mIHR5cGVzIChCeXRlQ29tcGFyYWJsZS9CeXRlU291cmNlKQorCisjIyBQcm9ibGVtIC8gTW90aXZhdGlvbgorCitDYXNzYW5kcmEgaGFzIGEgdmVyeSBoZWF2eSByZWxpYW5jZSBvbiBjb21wYXJpc29ucyDigJQgdGhleSBhcmUgdXNlZCB0aHJvdWdob3V0IHJlYWQgYW5kIHdyaXRlIHBhdGhzLCBjb29yZGluYXRpb24sCitjb21wYWN0aW9uLCBldGMuIHRvIGJlIGFibGUgdG8gb3JkZXIgYW5kIG1lcmdlIHJlc3VsdHMuIEl0IGFsc28gc3VwcG9ydHMgYSByYW5nZSBvZiB0eXBlcyB3aGljaCBvZnRlbiByZXF1aXJlIHRoZQorY29tcGFyZWQgb2JqZWN0IHRvIGJlIGNvbXBsZXRlbHkgaW4gbWVtb3J5IHRvIG9yZGVyIGNvcnJlY3RseSwgd2hpY2ggaW4gdHVybiBoYXMgbmVjZXNzaXRhdGVkIGludGVyZmFjZXMgd2hlcmUKK2NvbXBhcmlzb25zIGNhbiBvbmx5IGJlIGFwcGxpZWQgaWYgdGhlIGNvbXBhcmVkIG9iamVjdHMgYXJlIGNvbXBsZXRlbHkgbG9hZGVkLgorCitUaGlzIGhhcyBzb21lIHJhdGhlciBwYWluZnVsIGltcGxpY2F0aW9ucyBvbiB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGRhdGFiYXNlLCBib3RoIGluIHRlcm1zIG9mIHRoZSB0aW1lIGl0IHRha2VzIHRvIGxvYWQsCitjb21wYXJlIGFuZCBnYXJiYWdlIGNvbGxlY3QsIGFzIHdlbGwgYXMgaW4gdGVybXMgb2YgdGhlIHNwYWNlIHJlcXVpcmVkIHRvIGhvbGQgY29tcGxldGUga2V5cyBpbiBvbi1kaXNrIGluZGljZXMgYW5kCitkZXNlcmlhbGl6ZWQgdmVyc2lvbnMgaW4gaW4tbWVtb3J5IGRhdGEgc3RydWN0dXJlcy4gSW4gYWRkaXRpb24gdG8gdGhpcywgdGhlIHJlbGlhbmNlIG9uIGNvbXBhcmlzb25zIGZvcmNlcyBDYXNzYW5kcmEgdG8KK3VzZSBvbmx5IGNvbXBhcmlzb24tYmFzZWQgc3RydWN0dXJlcywgd2hpY2ggYXJlbuKAmXQgdGhlIG1vc3QgZWZmaWNpZW50LgorCitUaGVyZSBpcyBubyB3YXkgdG8gZXNjYXBlIHRoZSBuZWVkIHRvIGNvbXBhcmUgYW5kIG9yZGVyIG9iamVjdHMgaW4gQ2Fzc2FuZHJhLCBidXQgdGhlIG1hY2hpbmVyeSBmb3IgZG9pbmcgdGhpcyBjYW4gYmUKK2RvbmUgbXVjaCBtb3JlIHNtYXJ0bHkgaWYgd2UgaW1wb3NlIHNvbWUgc2ltcGxlIHN0cnVjdHVyZSBpbiB0aGUgb2JqZWN0cyB3ZSBkZWFsIHdpdGgg4oCUIGJ5dGUgb3JkZXJpbmcuCisKK1RoZSB0ZXJtIOKAnGJ5dGUgb3JkZXLigJ0gYXMgdXNlZCBpbiB0aGlzIGRvY3VtZW50IHJlZmVycyB0byB0aGUgcHJvcGVydHkgb2YgYmVpbmcgb3JkZXJlZCB2aWEgbGV4aWNvZ3JhcGhpYyBjb21wYXJlIG9uIHRoZQordW5zaWduZWQgdmFsdWVzIG9mIHRoZSBieXRlIGNvbnRlbnRzLiBTb21lIG9mIHRoZSB0eXBlcyBpbiBDYXNzYW5kcmEgYWxyZWFkeSBoYXZlIHRoaXMgcHJvcGVydHkgKGUuZy4gc3RyaW5ncywgYmxvYnMpLAorYnV0IG90aGVyIG1vc3QgaGVhdmlseSB1c2VkIG9uZXMgKGUuZy4gaW50ZWdlcnMsIHV1aWRzKSBkb27igJl0LgorCitXaGVuIGJ5dGUgb3JkZXIgaXMgdW5pdmVyc2FsbHkgYXZhaWxhYmxlIGZvciB0aGUgdHlwZXMgdXNlZCBmb3Iga2V5cywgc2V2ZXJhbCBrZXkgYWR2YW50YWdlcyBjYW4gYmUgcHV0IHRvIHVzZToKKworLSBDb21wYXJpc29ucyBjYW4gYmUgZG9uZSB1c2luZyBhIHNpbmdsZSBzaW1wbGUgbWV0aG9kLCBjb3JlIG1hY2hpbmVyeSBkb2VzbuKAmXQgbmVlZCB0byBrbm93IGFueXRoaW5nIGFib3V0IHR5cGVzLgorLSBQcmVmaXggZGlmZmVyZW5jZXMgYXJlIGVub3VnaCB0byBkZWZpbmUgb3JkZXI7IHVuaXF1ZSBwcmVmaXhlcyBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGNvbXBsZXRlIGtleXMuCistIFRyaWVzIGNhbiBiZSB1c2VkIHRvIHN0b3JlLCBxdWVyeSBhbmQgaXRlcmF0ZSBvdmVyIHJhbmdlcyBvZiBrZXlzLCBwcm92aWRpbmcgZmFzdCBsb29rdXAgYW5kIHByZWZpeCBjb21wcmVzc2lvbi4KKy0gTWVyZ2luZyBjYW4gYmUgcGVyZm9ybWVkIGJ5IG1lcmdpbmcgdHJpZXMsIHNpZ25pZmljYW50bHkgcmVkdWNpbmcgdGhlIG51bWJlciBvZiBuZWNlc3NhcnkgY29tcGFyaXNvbnMuCisKKyMjIE9yZGVyaW5nIHRoZSB0eXBlcworCitBcyB3ZSB3YW50IHRvIGtlZXAgYWxsIGV4aXN0aW5nIGZ1bmN0aW9uYWxpdHkgaW4gQ2Fzc2FuZHJhLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZGVhbCB3aXRoIGV4aXN0aW5nCitub24tYnl0ZS1vcmRlci1jb21wYXJhYmxlIHR5cGVzLiBUaGlzIHJlcXVpcmVzIHNvbWUgZm9ybSBvZiBjb252ZXJzaW9uIG9mIGVhY2ggdmFsdWUgdG8gYSBzZXF1ZW5jZSBvZiBieXRlcyB0aGF0IGNhbiBiZQorYnl0ZS1vcmRlciBjb21wYXJlZCAoYWxzbyBjYWxsZWQgImJ5dGUtY29tcGFyYWJsZSIpLCBhcyB3ZWxsIGFzIHRoZSBpbnZlcnNlIGNvbnZlcnNpb24gZnJvbSBieXRlLWNvbXBhcmFibGUgdG8gdmFsdWUuCisKK0FzIG9uZSBvZiB0aGUgbWFpbiBhZHZhbnRhZ2VzIG9mIGJ5dGUgb3JkZXIgaXMgdGhlIGFiaWxpdHkgdG8gZGVjaWRlIGNvbXBhcmlzb25zIGVhcmx5LCB3aXRob3V0IGhhdmluZyB0byByZWFkIHRoZSB3aG9sZQorb2YgdGhlIGlucHV0IHNlcXVlbmNlLCBieXRlLW9yZGVyZWQgaW50ZXJwcmV0YXRpb25zIG9mIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYXMgc291cmNlcyBvZiBieXRlcyB3aXRoIHVua25vd24gbGVuZ3RoLAordXNpbmcgdGhlIGludGVyZmFjZSBgQnl0ZVNvdXJjZWAuIFRoZSBpbnRlcmZhY2UgZGVjbGFyZXMgb25lIG1ldGhvZCwgYG5leHQoKWAgd2hpY2ggcHJvZHVjZXMgdGhlIG5leHQgYnl0ZSBvZiB0aGUKK3N0cmVhbSwgb3IgYEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTWAgaWYgdGhlIHN0cmVhbSBpcyBleGhhdXN0ZWQuCisKK2BFTkRfT0ZfU1RSRUFNYCBpcyBjaG9zZW4gYXMgYC0xYCAoYChpbnQpIC0xYCwgd2hpY2ggaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgcG9zc2libGUgYnl0ZSB2YWx1ZXMpLCB0byBtYWtlIGNvbXBhcmluZwordHdvIGJ5dGUgc291cmNlcyBhcyB0cml2aWFsIChhbmQgdGh1cyBmYXN0KSBhcyBwb3NzaWJsZS4KKworVG8gYmUgYWJsZSB0byBjb21wbGV0ZWx5IGFic3RyYWN0IHR5cGUgaW5mb3JtYXRpb24gYXdheSBmcm9tIHRoZSBzdG9yYWdlIG1hY2hpbmVyeSwgd2UgYWxzbyBmbGF0dGVuIGNvbXBsZXggdHlwZXMgaW50bworc2luZ2xlIGJ5dGUgc2VxdWVuY2VzLiBUbyBkbyB0aGlzLCB3ZSBhZGQgc2VwYXJhdG9yIGJ5dGVzIGluIGZyb250LCBiZXR3ZWVuIGNvbXBvbmVudHMsIGFuZCBhdCB0aGUgZW5kIGFuZCBkbyBzb21lCitlbmNvZGluZyBvZiB2YXJpYWJsZS1sZW5ndGggc2VxdWVuY2VzLgorCitUaGUgb3RoZXIgaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IHRoaXMgcGFja2FnZSBgQnl0ZUNvbXBhcmFibGVgLCBpcyBhbiBlbnRpdHkgd2hvc2UgYnl0ZS1vcmRlcmVkIGludGVycHJldGF0aW9uIGNhbiBiZQorcmVxdWVzdGVkLiBUaGUgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkIGJ5IGBEZWNvcmF0ZWRLZXlgLCBhbmQgY2FuIGJlIHJlcXVlc3RlZCBmb3IgY2x1c3RlcmluZyBrZXlzIGFuZCBib3VuZHMgdXNpbmcKK2BDbHVzdGVyaW5nQ29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlYC4gVGhlIGludmVyc2UgdHJhbnNsYXRpb24gaXMgcHJvdmlkZWQgYnkKK2BCdWZmZXIvTmF0aXZlRGVjb3JhdGVkS2V5LmZyb21CeXRlQ29tcGFyYWJsZWAgYW5kIGBDbHVzdGVyaW5nQ29tcGFyYXRvci5jbHVzdGVyaW5nL2JvdW5kL2JvdW5kYXJ5RnJvbUJ5dGVDb21wYXJhYmxlYC4KKworVGhlIChyYXRoZXIgdGVjaG5pY2FsKSBwYXJhZ3JhcGhzIGJlbG93IGRldGFpbCB0aGUgZW5jb2Rpbmcgd2UgaGF2ZSBjaG9zZW4gZm9yIHRoZSB2YXJpb3VzIHR5cGVzLiBGb3Igc2ltcGxpY2l0eSB3ZQorb25seSBkaXNjdXNzIHRoZSBiaWRpcmVjdGlvbmFsIGBPU1M1MGAgdmVyc2lvbiBvZiB0aGUgdHJhbnNsYXRpb24uIFRoZSBpbXBsZW1lbnRhdGlvbnMgaW4gY29kZSBvZiB0aGUgdmFyaW91cyBtYXBwaW5ncworYXJlIGluIHRoZSByZWxlYXZhbnQgYEFic3RyYWN0VHlwZWAgc3ViY2xhc3MuCisKKyMjIyBEZXNpcmVkIHByb3BlcnRpZXMKKworR2VuZXJhbGx5LCB3ZSBkZXNpcmUgdGhlIGZvbGxvd2luZyB0d28gcHJvcGVydGllcyBmcm9tIHRoZSBieXRlLW9yZGVyZWQgdHJhbnNsYXRpb25zIG9mIHZhbHVlcyB3ZSB1c2UgaW4gdGhlIGRhdGFiYXNlOgorCistIENvbXBhcmlzb24gZXF1aXZhbGVuY2UgKDEpOiAgCisgICAgPG1hdGggeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiPgorICAgICAgPHNlbWFudGljcz4KKyAgICAgICAgPG1zdHlsZSBkaXNwbGF5c3R5bGU9InRydWUiPgorICAgICAgICAgIDxtbz4mI3gyMjAwOzwvbW8+CisgICAgICAgICAgPG1pPng8L21pPgorICAgICAgICAgIDxtbz4sPC9tbz4KKyAgICAgICAgICA8bWk+eTwvbWk+CisgICAgICAgICAgPG1vPiYjeDIyMDg7PC9tbz4KKyAgICAgICAgICA8bWk+VDwvbWk+CisgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG10ZXh0PmNvbXBhcmVCeXRlc1Vuc2lnbmVkPC9tdGV4dD4KKyAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICA8bW8+KDwvbW8+CisgICAgICAgICAgICA8bWk+VDwvbWk+CisgICAgICAgICAgICA8bW8+LjwvbW8+CisgICAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgICAgPG10ZXh0PmJ5dGVPcmRlcmVkPC9tdGV4dD4KKyAgICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgICA8bW8+KDwvbW8+CisgICAgICAgICAgICAgIDxtaT54PC9taT4KKyAgICAgICAgICAgICAgPG1vPik8L21vPgorICAgICAgICAgICAgPC9tcm93PgorICAgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgICAgPG1pPlQ8L21pPgorICAgICAgICAgICAgPG1vPi48L21vPgorICAgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICAgIDxtdGV4dD5ieXRlT3JkZXJlZDwvbXRleHQ+CisgICAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgICAgPG1vPig8L21vPgorICAgICAgICAgICAgICA8bWk+eTwvbWk+CisgICAgICAgICAgICAgIDxtbz4pPC9tbz4KKyAgICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICAgIDxtbz4pPC9tbz4KKyAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgPG1vPj08L21vPgorICAgICAgICAgIDxtaT5UPC9taT4KKyAgICAgICAgICA8bW8+LjwvbW8+CisgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICA8bXRleHQ+Y29tcGFyZTwvbXRleHQ+CisgICAgICAgICAgPC9tcm93PgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG1vPig8L21vPgorICAgICAgICAgICAgPG1pPng8L21pPgorICAgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgICAgPG1pPnk8L21pPgorICAgICAgICAgICAgPG1vPik8L21vPgorICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgPC9tc3R5bGU+CisgICAgICAgIDwhLS0gPGFubm90YXRpb24gZW5jb2Rpbmc9InRleHQveC1hc2NpaW1hdGgiPmZvcmFsbCB4LHkgaW4gVCwgImNvbXBhcmVCeXRlc1Vuc2lnbmVkIihULiJieXRlT3JkZXJlZCIoeCksIFQuImJ5dGVPcmRlcmVkIih5KSk9VC4iY29tcGFyZSIoeCwgeSk8L2Fubm90YXRpb24+IC0tPgorICAgICAgPC9zZW1hbnRpY3M+CisgICAgPC9tYXRoPgorLSBQcmVmaXgtZnJlZWRvbSAoMik6ICAKKyAgICA8bWF0aCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCI+CisgICAgICA8c2VtYW50aWNzPgorICAgICAgICA8bXN0eWxlIGRpc3BsYXlzdHlsZT0idHJ1ZSI+CisgICAgICAgICAgPG1vPiYjeDIyMDA7PC9tbz4KKyAgICAgICAgICA8bWk+eDwvbWk+CisgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgIDxtaT55PC9taT4KKyAgICAgICAgICA8bW8+JiN4MjIwODs8L21vPgorICAgICAgICAgIDxtaT5UPC9taT4KKyAgICAgICAgICA8bW8+LDwvbW8+CisgICAgICAgICAgPG1pPlQ8L21pPgorICAgICAgICAgIDxtbz4uPC9tbz4KKyAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgIDxtdGV4dD5ieXRlT3JkZXJlZDwvbXRleHQ+CisgICAgICAgICAgPC9tcm93PgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG1vPig8L21vPgorICAgICAgICAgICAgPG1pPng8L21pPgorICAgICAgICAgICAgPG1vPik8L21vPgorICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgIDxtc3BhY2Ugd2lkdGg9IjFleCIgLz4KKyAgICAgICAgICAgIDxtdGV4dD4gaXMgbm90IGEgcHJlZml4IG9mIDwvbXRleHQ+CisgICAgICAgICAgICA8bXNwYWNlIHdpZHRoPSIxZXgiIC8+CisgICAgICAgICAgPC9tcm93PgorICAgICAgICAgIDxtaT5UPC9taT4KKyAgICAgICAgICA8bW8+LjwvbW8+CisgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICA8bXRleHQ+Ynl0ZU9yZGVyZWQ8L210ZXh0PgorICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgIDxtbz4oPC9tbz4KKyAgICAgICAgICAgIDxtaT55PC9taT4KKyAgICAgICAgICAgIDxtbz4pPC9tbz4KKyAgICAgICAgICA8L21yb3c+CisgICAgICAgIDwvbXN0eWxlPgorICAgICAgICA8IS0tIDxhbm5vdGF0aW9uIGVuY29kaW5nPSJ0ZXh0L3gtYXNjaWltYXRoIj5mb3JhbGwgeCx5IGluIFQsIFQuImJ5dGVPcmRlcmVkIih4KSAiIGlzIG5vdCBhIHByZWZpeCBvZiAiIFQuImJ5dGVPcmRlcmVkIih5KTwvYW5ub3RhdGlvbj4gLS0+CisgICAgICA8L3NlbWFudGljcz4KKyAgICA8L21hdGg+CisKK1RoZSBmb3JtZXIgaXMgdGhlIGVzc2VudGlhbCByZXF1aXJlbWVudCwgYW5kIHRoZSBsYXR0ZXIgYWxsb3dzIGNvbnN0cnVjdGlvbiBvZiBlbmNvZGluZ3Mgb2Ygc2VxdWVuY2VzIG9mIG11bHRpcGxlCit2YWx1ZXMsIGFzIHdlbGwgYXMgYSBsaXR0bGUgbW9yZSBlZmZpY2llbmN5IGluIHRoZSBkYXRhIHN0cnVjdHVyZXMuCisKK1RvIG1vcmUgZWZmaWNpZW50bHkgZW5jb2RlIGJ5dGUtb3JkZXJlZCBibG9icywgaG93ZXZlciwgd2UgdXNlIGEgc2xpZ2h0bHkgdHdlYWtlZCB2ZXJzaW9uIG9mIHRoZSBhYm92ZSByZXF1aXJlbWVudHM6CisKKy0gQ29tcGFyaXNvbiBlcXVpdmFsZW5jZSAoMyk6ICAKKyAgICA8bWF0aCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCI+CisgICAgICA8c2VtYW50aWNzPgorICAgICAgICA8bXN0eWxlIGRpc3BsYXlzdHlsZT0idHJ1ZSI+CisgICAgICAgICAgPG1vPiYjeDIyMDA7PC9tbz4KKyAgICAgICAgICA8bWk+eDwvbWk+CisgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgIDxtaT55PC9taT4KKyAgICAgICAgICA8bW8+JiN4MjIwODs8L21vPgorICAgICAgICAgIDxtaT5UPC9taT4KKyAgICAgICAgICA8bW8+LDwvbW8+CisgICAgICAgICAgPG1vPiYjeDIyMDA7PC9tbz4KKyAgICAgICAgICA8bXN1Yj4KKyAgICAgICAgICAgIDxtaT5iPC9taT4KKyAgICAgICAgICAgIDxtbj4xPC9tbj4KKyAgICAgICAgICA8L21zdWI+CisgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgIDxtc3ViPgorICAgICAgICAgICAgPG1pPmI8L21pPgorICAgICAgICAgICAgPG1uPjI8L21uPgorICAgICAgICAgIDwvbXN1Yj4KKyAgICAgICAgICA8bW8+JiN4MjIwODs8L21vPgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG1vPls8L21vPgorICAgICAgICAgICAgPG1uPjB4MTA8L21uPgorICAgICAgICAgICAgPG1vPi08L21vPgorICAgICAgICAgICAgPG1uPjB4RUY8L21uPgorICAgICAgICAgICAgPG1vPl08L21vPgorICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICA8bW8+LDwvbW8+CisgICAgICAgICAgICA8bXRleHQ+PGJyLz48L210ZXh0PgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG10ZXh0PmNvbXBhcmVCeXRlc1Vuc2lnbmVkPC9tdGV4dD4KKyAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICA8bW8+KDwvbW8+CisgICAgICAgICAgICA8bWk+VDwvbWk+CisgICAgICAgICAgICA8bW8+LjwvbW8+CisgICAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgICAgPG10ZXh0PmJ5dGVPcmRlcmVkPC9tdGV4dD4KKyAgICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgICA8bW8+KDwvbW8+CisgICAgICAgICAgICAgIDxtaT54PC9taT4KKyAgICAgICAgICAgICAgPG1vPik8L21vPgorICAgICAgICAgICAgPC9tcm93PgorICAgICAgICAgICAgPG1vPis8L21vPgorICAgICAgICAgICAgPG1zdWI+CisgICAgICAgICAgICAgIDxtaT5iPC9taT4KKyAgICAgICAgICAgICAgPG1uPjE8L21uPgorICAgICAgICAgICAgPC9tc3ViPgorICAgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgICAgPG1pPlQ8L21pPgorICAgICAgICAgICAgPG1vPi48L21vPgorICAgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICAgIDxtdGV4dD5ieXRlT3JkZXJlZDwvbXRleHQ+CisgICAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgICAgPG1vPig8L21vPgorICAgICAgICAgICAgICA8bWk+eTwvbWk+CisgICAgICAgICAgICAgIDxtbz4pPC9tbz4KKyAgICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICAgIDxtbz4rPC9tbz4KKyAgICAgICAgICAgIDxtc3ViPgorICAgICAgICAgICAgICA8bWk+YjwvbWk+CisgICAgICAgICAgICAgIDxtbj4yPC9tbj4KKyAgICAgICAgICAgIDwvbXN1Yj4KKyAgICAgICAgICAgIDxtbz4pPC9tbz4KKyAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgPG1vPj08L21vPgorICAgICAgICAgIDxtaT5UPC9taT4KKyAgICAgICAgICA8bW8+LjwvbW8+CisgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICA8bXRleHQ+Y29tcGFyZTwvbXRleHQ+CisgICAgICAgICAgPC9tcm93PgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG1vPig8L21vPgorICAgICAgICAgICAgPG1pPng8L21pPgorICAgICAgICAgICAgPG1vPiw8L21vPgorICAgICAgICAgICAgPG1pPnk8L21pPgorICAgICAgICAgICAgPG1vPik8L21vPgorICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgPC9tc3R5bGU+CisgICAgICAgIDwhLS0gPGFubm90YXRpb24gZW5jb2Rpbmc9InRleHQveC1hc2NpaW1hdGgiPmZvcmFsbCB4LHkgaW4gVCwgZm9yYWxsIGJfMSwgYl8yIGluIFsweDEwLTB4RUZdLAorICAgICJjb21wYXJlQnl0ZXNVbnNpZ25lZCIoVC4iYnl0ZU9yZGVyZWQiKHgpK2JfMSwgVC4iYnl0ZU9yZGVyZWQiKHkpK2JfMik9VC4iY29tcGFyZSIoeCwgeSk8L2Fubm90YXRpb24+IC0tPgorICAgICAgPC9zZW1hbnRpY3M+CisgICAgPC9tYXRoPgorLSBXZWFrIHByZWZpeC1mcmVlZG9tICg0KTogIAorICAgIDxtYXRoIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIj4KKyAgICAgIDxzZW1hbnRpY3M+CisgICAgICAgIDxtc3R5bGUgZGlzcGxheXN0eWxlPSJ0cnVlIj4KKyAgICAgICAgICA8bW8+JiN4MjIwMDs8L21vPgorICAgICAgICAgIDxtaT54PC9taT4KKyAgICAgICAgICA8bW8+LDwvbW8+CisgICAgICAgICAgPG1pPnk8L21pPgorICAgICAgICAgIDxtbz4mI3gyMjA4OzwvbW8+CisgICAgICAgICAgPG1pPlQ8L21pPgorICAgICAgICAgIDxtbz4sPC9tbz4KKyAgICAgICAgICA8bW8+JiN4MjIwMDs8L21vPgorICAgICAgICAgIDxtaT5iPC9taT4KKyAgICAgICAgICA8bW8+JiN4MjIwODs8L21vPgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG1vPls8L21vPgorICAgICAgICAgICAgPG1uPjB4MTA8L21uPgorICAgICAgICAgICAgPG1vPi08L21vPgorICAgICAgICAgICAgPG1uPjB4RUY8L21uPgorICAgICAgICAgICAgPG1vPl08L21vPgorICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICA8bW8+LDwvbW8+CisgICAgICAgICAgICA8bXRleHQ+PGJyLz48L210ZXh0PgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG1vPig8L21vPgorICAgICAgICAgICAgPG1pPlQ8L21pPgorICAgICAgICAgICAgPG1vPi48L21vPgorICAgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICAgIDxtdGV4dD5ieXRlT3JkZXJlZDwvbXRleHQ+CisgICAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgICA8bXJvdz4KKyAgICAgICAgICAgICAgPG1vPig8L21vPgorICAgICAgICAgICAgICA8bWk+eDwvbWk+CisgICAgICAgICAgICAgIDxtbz4pPC9tbz4KKyAgICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICAgIDxtbz4rPC9tbz4KKyAgICAgICAgICAgIDxtaT5iPC9taT4KKyAgICAgICAgICAgIDxtbz4pPC9tbz4KKyAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICA8bXNwYWNlIHdpZHRoPSIxZXgiIC8+CisgICAgICAgICAgICA8bXRleHQ+IGlzIG5vdCBhIHByZWZpeCBvZiA8L210ZXh0PgorICAgICAgICAgICAgPG1zcGFjZSB3aWR0aD0iMWV4IiAvPgorICAgICAgICAgIDwvbXJvdz4KKyAgICAgICAgICA8bWk+VDwvbWk+CisgICAgICAgICAgPG1vPi48L21vPgorICAgICAgICAgIDxtcm93PgorICAgICAgICAgICAgPG10ZXh0PmJ5dGVPcmRlcmVkPC9tdGV4dD4KKyAgICAgICAgICA8L21yb3c+CisgICAgICAgICAgPG1yb3c+CisgICAgICAgICAgICA8bW8+KDwvbW8+CisgICAgICAgICAgICA8bWk+eTwvbWk+CisgICAgICAgICAgICA8bW8+KTwvbW8+CisgICAgICAgICAgPC9tcm93PgorICAgICAgICA8L21zdHlsZT4KKyAgICAgICAgPCEtLSA8YW5ub3RhdGlvbiBlbmNvZGluZz0idGV4dC94LWFzY2lpbWF0aCI+Zm9yYWxsIHgseSBpbiBULCBmb3JhbGwgYiBpbiBbMHgxMC0weEVGXSwKKyAgICAoVC4iYnl0ZU9yZGVyZWQiKHgpK2IpICIgaXMgbm90IGEgcHJlZml4IG9mICIgVC4iYnl0ZU9yZGVyZWQiKHkpPC9hbm5vdGF0aW9uPiAtLT4KKyAgICAgIDwvc2VtYW50aWNzPgorICAgIDwvbWF0aD4KKworVGhlc2UgdmVyc2lvbnMgYWxsb3cgdGhlIGFkZGl0aW9uIG9mIGEgc2VwYXJhdG9yIGJ5dGUgYWZ0ZXIgZWFjaCB2YWx1ZSwgYW5kIGd1YXJhbnRlZSB0aGF0IHRoZSBjb21iaW5hdGlvbiB3aXRoCitzZXBhcmF0b3IgZnVsZmlsbHMgdGhlIG9yaWdpbmFsIHJlcXVpcmVtZW50cy4gKDMpIGlzIHNvbWV3aGF0IHN0cm9uZ2VyIHRoYW4gKDEpIGJ1dCBpcyBuZWNlc3NhcmlseSB0cnVlIGlmICgyKSBpcyBhbHNvCitpbiBmb3JjZSwgd2hpbGUgKDQpIHRyaXZpYWxseSBmb2xsb3dzIGZyb20gKDIpLgorCisjIyBGaXhlZCBsZW5ndGggdW5zaWduZWQgaW50ZWdlcnMgKE11cm11ciB0b2tlbiwgZGF0ZS90aW1lKQorCitUaGlzIGlzIHRoZSB0cml2aWFsIGNhc2UsIGFzIHdlIGNhbiBzaW1wbHkgdXNlIHRoZSBpbnB1dCBieXRlcyBpbiBiaWctZW5kaWFuIG9yZGVyLiBUaGUgY29tcGFyaXNvbiByZXN1bHQgaXMgdGhlIHNhbWUsCithbmQgZml4ZWQgbGVuZ3RoIHZhbHVlcyBhcmUgdHJpdmlhbGx5IHByZWZpeCBmcmVlLCBpLmUuICgxKSBhbmQgKDIpIGFyZSBzYXRpc2ZpZWQsIGFuZCB0aHVzICgzKSBhbmQgKDQpIGZvbGxvdyBmcm9tIHRoZQorb2JzZXJ2YXRpb24gYWJvdmUuCisKKyMjIEZpeGVkLWxlbmd0aCBzaWduZWQgaW50ZWdlcnMgKGJ5dGUsIHNob3J0LCBpbnQsIGxlZ2FjeSBiaWdpbnQpCisKK0FzIGFib3ZlLCBidXQgd2UgbmVlZCB0byBpbnZlcnQgdGhlIHNpZ24gYml0IG9mIHRoZSBudW1iZXIgdG8gcHV0IG5lZ2F0aXZlIG51bWJlcnMgYmVmb3JlIHBvc2l0aXZlcy4gVGhpcyBtYXBzCitgTUlOX1ZBTFVFYCB0byBgMHgwMGAuLi4sIGAtMWAgdG8gYDB4N0bigKZgLCBgMGAgdG8gYDB4ODDigKZgLCBhbmQgYE1BWF9WQUxVRWAgdG8gYDB4RkbigKZgOyBjb21wYXJpbmcgdGhlIHJlc3VsdGluZyBudW1iZXIKK2FzIGFuIHVuc2lnbmVkIGludGVnZXIgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBjb21wYXJpbmcgdGhlIHNvdXJjZSBzaWduZWQuCisKK0V4YW1wbGVzOgorCisKK3wgVHlwZSBhbmQgdmFsdWUgfCBieXRlcyAgICAgICAgICAgICAgICAgICB8IGVuY29kZXMgYXMgICAgICAgICAgICAgIHwKK3wgLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKK3wgaW50IDEgICAgICAgICAgfCAwMCAwMCAwMCAwMSAgICAgICAgICAgICB8IDgwIDAwIDAwIDAxICAgICAgICAgICAgIHwKK3wgc2hvcnQgLTEgICAgICAgfCBGRiBGRiAgICAgICAgICAgICAgICAgICB8IDdGIEZGICAgICAgICAgICAgICAgICAgIHwKK3wgYnl0ZSAwICAgICAgICAgfCAwMCAgICAgICAgICAgICAgICAgICAgICB8IDgwICAgICAgICAgICAgICAgICAgICAgIHwKK3wgYnl0ZSAtMiAgICAgICAgfCBGRSAgICAgICAgICAgICAgICAgICAgICB8IDdFICAgICAgICAgICAgICAgICAgICAgIHwKK3wgaW50IE1BWF9WQUxVRSAgfCA3RiBGRiBGRiBGRiAgICAgICAgICAgICB8IEZGIEZGIEZGIEZGICAgICAgICAgICAgIHwKK3wgbG9uZyBNSU5fVkFMVUUgfCA4MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwKKworIyMgVmFyaWFibGUtbGVuZ3RoIGVuY29kaW5nIG9mIGludGVnZXJzIChjdXJyZW50IGJpZ2ludCkKKworQW5vdGhlciB3YXkgdG8gZW5jb2RlIGludGVnZXJzIHRoYXQgbWF5IHNhdmUgc2lnbmlmaWNhbnQgYW1vdW50cyBvZiBzcGFjZSB3aGVuIHNtYWxsZXIgbnVtYmVycyBhcmUgb2Z0ZW4gaW4gdXNlLCBidXQKK3N0aWxsIHBlcm1pdHMgbGFyZ2UgdmFsdWVzIHRvIGJlIGVmZmljaWVudGx5IGVuY29kZWQsIGlzIHRvIHVzZSBhbiBlbmNvZGluZyBzY2hlbWUgc2ltaWxhciB0byBVVEYtOC4KKworRm9yIHVuc2lnbmVkIG51bWJlcnMgdGhpcyBjYW4gYmUgZG9uZSBieSBzdGFydGluZyB0aGUgbnVtYmVyIHdpdGggYXMgbWFueSAxcyBpbiBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXMgdGhlcmUgYXJlCithZGRpdGlvbmFsIGJ5dGVzIGluIHRoZSBlbmNvZGluZywgZm9sbG93ZWQgYnkgYSAwLCBhbmQgdGhlIGJpdHMgb2YgdGhlIG51bWJlci4gTnVtYmVycyBiZXR3ZWVuIDAgYW5kIDEyNyBhcmUgZW5jb2RlZAoraW4gb25lIGJ5dGUsIGFuZCBlYWNoIGFkZGl0aW9uYWwgYnl0ZSBhZGRzIDcgbW9yZSBiaXRzLiBWYWx1ZXMgdGhhdCB1c2UgYWxsIDggYnl0ZXMgZG8gbm90IG5lZWQgYSA5dGggYml0IG9mIDAgYW5kIGNhbgordGh1cyBmaXQgOSBieXRlcy4gQmVjYXVzZSBsb25nZXIgbnVtYmVycyBoYXZlIG1vcmUgMXMgaW4gdGhlaXIgTVNCcywgdGhleSBjb21wYXJlCitoaWdoZXIgdGhhbiBzaG9ydGVyIG9uZXMgKGFuZCB3ZSBhbHdheXMgdXNlIHRoZSBzaG9ydGVzdCByZXByZXNlbnRhdGlvbikuIEJlY2F1c2UgdGhlIGxlbmd0aCBpcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGVzZQoraW5pdGlhbCBiaXRzLCBubyB2YWx1ZSBjYW4gYmUgYSBwcmVmaXggb2YgYW5vdGhlci4KKworCit8IFZhbHVlICAgICAgICAgICAgfCBieXRlcyAgICAgICAgICAgICAgICAgICB8IGVuY29kZXMgYXMgICAgICAgICAgICAgICAgIHwKK3wgLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorfCAwICAgICAgICAgICAgICAgIHwgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCAwMCAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IDEgICAgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMSB8IDAxICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgMTI3ICgyXjctMSkgICAgICB8IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDdGIHwgN0YgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAxMjggKDJeNykgICAgICAgIHwgMDAgMDAgMDAgMDAgMDAgMDAgMDAgODAgfCA4MCA4MCAgICAgICAgICAgICAgICAgICAgICB8Cit8IDE2MzgzICgyXjE0IC0gMSkgfCAwMCAwMCAwMCAwMCAwMCAwMCAzRiBGRiB8IEJGIEZGICAgICAgICAgICAgICAgICAgICAgIHwKK3wgMTYzODQgKDJeMTQpICAgICB8IDAwIDAwIDAwIDAwIDAwIDAwIDQwIDAwIHwgQzAgNDAgMDAgICAgICAgICAgICAgICAgICAgfAorfCAyXjMxIC0gMSAgICAgICAgIHwgMDAgMDAgMDAgMDAgN0YgRkYgRkYgRkYgfCBGMCA3RiBGRiBGRiBGRiAgICAgICAgICAgICB8Cit8IDJeMzEgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCA4MCAwMCAwMCAwMCB8IEYwIDgwIDAwIDAwIDAwICAgICAgICAgICAgIHwKK3wgMl41NiAtIDEgICAgICAgICB8IDAwIEZGIEZGIEZGIEZGIEZGIEZGIEZGIHwgRkUgRkYgRkYgRkYgRkYgRkYgRkYgRkYgICAgfAorfCAyXjU2ICAgICAgICAgICAgIHwgMDEgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCBGRiAwMSAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8Cit8IDJeNjQtIDEgICAgICAgICAgfCBGRiBGRiBGRiBGRiBGRiBGRiBGRiBGRiB8IEZGIEZGIEZGIEZGIEZGIEZGIEZGIEZGIEZGIHwKKworVG8gZW5jb2RlIHNpZ25lZCBudW1iZXJzLCB3ZSBtdXN0IHN0YXJ0IHdpdGggdGhlIHNpZ24gYml0LCBhbmQgbXVzdCBhbHNvIGVuc3VyZSB0aGF0IGxvbmdlciBuZWdhdGl2ZSBudW1iZXJzIHNvcnQKK3NtYWxsZXIgdGhhbiBzaG9ydGVyIG9uZXMuIFRoZSBmaXJzdCBiaXQgb2YgdGhlIGVuY29kaW5nIGlzIHRoZSBpbnZlcnRlZCBzaWduIChpLmUuIDEgZm9yIHBvc2l0aXZlLCAwIGZvciBuZWdhdGl2ZSksCitmb2xsb3dlZCBieSB0aGUgbGVuZ3RoIGVuY29kZWQgYXMgYSBzZXF1ZW5jZSBvZiBiaXRzIHRoYXQgbWF0Y2hlcyB0aGUgaW52ZXJ0ZWQgc2lnbiwgZm9sbG93ZWQgYnkgYSBiaXQgdGhhdCBkaWZmZXJzCisobGlrZSBhYm92ZSwgbm90IG5lY2Vzc2FyeSBmb3IgOS1ieXRlIGVuY29kaW5ncykgYW5kIHRoZSBiaXRzIG9mIHRoZSBudW1iZXIncyB0d28ncyBjb21wbGVtZW50LgorCisKK3wgVmFsdWUgICAgICAgICAgICAgfCBieXRlcyAgICAgICAgICAgICAgICAgICB8IGVuY29kZXMgYXMgICAgICAgICAgICAgICAgIHwKK3wgLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKK3wgMSAgICAgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMSB8IDgxICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgLTEgICAgICAgICAgICAgICAgfCBGRiBGRiBGRiBGRiBGRiBGRiBGRiBGRiB8IDdGICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgMCAgICAgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8IDgwICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgNjMgICAgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAzRiB8IEJGICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgLTY0ICAgICAgICAgICAgICAgfCBGRiBGRiBGRiBGRiBGRiBGRiBGRiBDMCB8IDQwICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgNjQgICAgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCAwMCAwMCAwMCA0MCB8IEMwIDQwICAgICAgICAgICAgICAgICAgICAgIHwKK3wgLTY1ICAgICAgICAgICAgICAgfCBGRiBGRiBGRiBGRiBGRiBGRiBGRiBCRiB8IDNGIEJGICAgICAgICAgICAgICAgICAgICAgIHwKK3wgODE5MSAgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCAwMCAwMCAxRiBGRiB8IERGIEZGICAgICAgICAgICAgICAgICAgICAgIHwKK3wgODE5MiAgICAgICAgICAgICAgfCAwMCAwMCAwMCAwMCAwMCAwMCAyMCAwMCB8IEUwIDIwIDAwICAgICAgICAgICAgICAgICAgIHwKK3wgSW50ZWdlci5NQVhfVkFMVUUgfCAwMCAwMCAwMCAwMCA3RiBGRiBGRiBGRiB8IEY4IDdGIEZGIEZGIEZGICAgICAgICAgICAgIHwKK3wgTG9uZy5NSU5fVkFMVUUgICAgfCA4MCAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwKKworIyMgRml4ZWQtc2l6ZSBmbG9hdGluZy1wb2ludCBudW1iZXJzIChmbG9hdCwgZG91YmxlKQorCitJRUVFLTc1NCB3YXMgZGVzaWduZWQgd2l0aCBieXRlLWJ5LWJ5dGUgY29tcGFyaXNvbnMgaW4gbWluZCwgYW5kIHByb3ZpZGVzIGFuIGltcG9ydGFudCBndWFyYW50ZWUgYWJvdXQgdGhlIGJ5dGVzIG9mIGEKK2Zsb2F0aW5nIHBvaW50IG51bWJlcjoKKyogSWYgeCBhbmQgeSBhcmUgb2YgdGhlIHNhbWUgc2lnbiwgYnl0ZXMoeCkg4omlIGJ5dGVzKHkpIOKHlCB8eHwg4omlIHx5fC4KKworVGh1cywgdG8gYmUgYWJsZSB0byBvcmRlciBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFzIHVuc2lnbmVkIGludGVnZXJzLCB3ZSBjYW46CisKKyogRmxpcCB0aGUgc2lnbiBiaXQgc28gbmVnYXRpdmVzIGFyZSBzbWFsbGVyIHRoYW4gcG9zaXRpdmUgbnVtYmVycy4KKyogSWYgdGhlIG51bWJlciB3YXMgbmVnYXRpdmUsIGFsc28gZmxpcCBhbGwgdGhlIG90aGVyIGJpdHMgc28gbGFyZ2VyIG1hZ25pdHVkZXMgYmVjb21lIHNtYWxsZXIgaW50ZWdlcnMuCisKK1RoaXMgbWF0Y2hlcyBleGFjdGx5IHRoZSBiZWhhdmlvdXIgb2YgYERvdWJsZS5jb21wYXJlYCwgd2hpY2ggZG9lc27igJl0IGZ1bGx5IGFncmVlIHdpdGggbnVtZXJpY2FsIGNvbXBhcmlzb25zIChzZWUgc3BlYykKK2luIG9yZGVyIHRvIGRlZmluZSBhIG5hdHVyYWwgb3JkZXIgb3ZlciB0aGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4KKworRXhhbXBsZXM6CisKKworfCBUeXBlIGFuZCB2YWx1ZSB8IGJ5dGVzICAgICAgICAgICAgICAgICAgIHwgZW5jb2RlcyBhcyAgICAgICAgICAgICAgfAorfCAtLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorfCBmbG9hdCArMS4wICAgICB8IDNGIDgwIDAwIDAwICAgICAgICAgICAgIHwgQkYgODAgMDAgMDAgICAgICAgICAgICAgfAorfCBmbG9hdCArMC4wICAgICB8IDAwIDAwIDAwIDAwICAgICAgICAgICAgIHwgODAgMDAgMDAgMDAgICAgICAgICAgICAgfAorfCBmbG9hdCAtMC4wICAgICB8IDgwIDAwIDAwIDAwICAgICAgICAgICAgIHwgN0YgRkYgRkYgRkYgICAgICAgICAgICAgfAorfCBmbG9hdCAtMS4wICAgICB8IEJGIDgwIDAwIDAwICAgICAgICAgICAgIHwgNDAgN0YgRkYgRkYgICAgICAgICAgICAgfAorfCBkb3VibGUgKzEuMCAgICB8IDNGIEYwIDAwIDAwIDAwIDAwIDAwIDAwIHwgQkYgRjAgMDAgMDAgMDAgMDAgMDAgMDAgfAorfCBkb3VibGUgK0luZiAgICB8IDdGIEYwIDAwIDAwIDAwIDAwIDAwIDAwIHwgRkYgRjAgMDAgMDAgMDAgMDAgMDAgMDAgfAorfCBkb3VibGUgLUluZiAgICB8IEZGIEYwIDAwIDAwIDAwIDAwIDAwIDAwIHwgMDAgMEYgRkYgRkYgRkYgRkYgRkYgRkYgfAorfCBkb3VibGUgTmFOICAgICB8IDdGIEY4IDAwIDAwIDAwIDAwIDAwIDAwIHwgRkYgRjggMDAgMDAgMDAgMDAgMDAgMDAgfAorCisjIyBVVUlEcworCitVVUlEcyBhcmUgZml4ZWQtbGVuZ3RoIHVuc2lnbmVkIGludGVnZXJzLCB3aGVyZSB0aGUgVVVJRCB2ZXJzaW9uL3R5cGUgaXMgY29tcGFyZWQgZmlyc3QsIGFuZCB3aGVyZSBiaXRzIG5lZWQgdG8gYmUKK3Jlb3JkZXJlZCBmb3IgdGhlIHRpbWUgVVVJRHMuIFRvIGNyZWF0ZSBhIGJ5dGUtb3JkZXJlZCByZXByZXNlbnRhdGlvbiwgd2UgcmVvcmRlciB0aGUgYnl0ZXM6IHB1bGwgdGhlIHZlcnNpb24gZGlnaXQKK2ZpcnN0LCB0aGVuIHRoZSByZXN0IG9mIHRoZSBkaWdpdHMsIHVzaW5nIHRoZSBzcGVjaWFsIHRpbWUgb3JkZXIgaWYgdGhlIHZlcnNpb24gaXMgZXF1YWwgdG8gb25lLgorCitFeGFtcGxlczoKKworCit8IFR5cGUgYW5kIHZhbHVlIHwgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZW5jb2RlcyBhcyAgICAgICAgICAgICAgICAgICAgICAgfAorfCAtLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKK3wgUmFuZG9tICh2NCkgICAgfCBjYzUyMDg4Mi05NTA3LTQ0ZmItOGZjOS1iMzQ5ZWNkZWU2NTggfCA0Y2M1MjA4ODI5NTA3NGZiOGZjOWIzNDllY2RlZTY1OCB8Cit8IFRpbWUgKHYxKSAgICAgIHwgMmE5MmQ3NTAtZDhkYy0xMWU2LWEyZGUtY2Y4ZWNkNGNmMDUzIHwgMTFlNmQ4ZGMyYTkyZDc1MGEyZGVjZjhlY2Q0Y2YwNTMgfAorCisjIyBNdWx0aS1jb21wb25lbnQgc2VxdWVuY2VzIChQYXJ0aXRpb24gb3IgQ2x1c3RlcmluZyBrZXlzLCB0dXBsZXMpLCBib3VuZHMgYW5kIG51bGxzCisKK0FzIG1lbnRpb25lZCBhYm92ZSwgd2UgZW5jb2RlIHNlcXVlbmNlcyBieSBhZGRpbmcgc2VwYXJhdG9yIGJ5dGVzIGluIGZyb250LCBiZXR3ZWVuIGNvbXBvbmVudHMsIGFuZCBhIHRlcm1pbmF0b3IgYXQgdGhlCitlbmQuIFRoZSB2YWx1ZXMgd2UgY2hvc2UgZm9yIHRoZSBzZXBhcmF0b3IgYW5kIHRlcm1pbmF0b3IgYXJlIGAweDQwYCBhbmQgYDB4MzhgLCBhbmQgdGhleSBzZXJ2ZSBzZXZlcmFsIHB1cnBvc2VzOgorCistIFBlcm1pdHMgcGFydGlhbGx5IHNwZWNpZmllZCBib3VuZHMsIHdpdGggc3RyaWN0L2V4Y2x1c2l2ZSBvciBub24tc3RyaWN0L2luY2x1c2l2ZSBzZW1hbnRpY3MuIFRoaXMgaXMgZG9uZSBieSBmaW5pc2hpbmcKKyAgYSBib3VuZCB3aXRoIGEgdGVybWluYXRvciB2YWx1ZSB0aGF0IGlzIHNtYWxsZXIvZ3JlYXRlciB0aGFuIHRoZSBzZXBhcmF0b3IgYW5kIHRlcm1pbmF0b3IuIFdlIGNhbiB1c2UgYDB4MjBgIGZvciBgPGAvYOKJpWAKKyAgYW5kIGAweDYwYCBmb3IgYOKJpGAvYD5gLgorLSBQZXJtaXRzIGVuY29kaW5nIG9mIGBudWxsYCBhbmQgYGVtcHR5YCB2YWx1ZXMuIFdlIHVzZSBgMHgzRWAgYXMgdGhlIHNlcGFyYXRvciBmb3IgbnVsbHMgYW5kIGAweDNGYCBmb3IgZW1wdHksCisgIGZvbGxvd2VkIGJ5IG5vIHZhbHVlIGJ5dGVzLiBUaGlzIGlzIGFsd2F5cyBzbWFsbGVyIHRoYW4gYSBzZXF1ZW5jZSB3aXRoIG5vbi1udWxsIHZhbHVlIGZvciB0aGlzIGNvbXBvbmVudCwgYnV0IG5vdAorICBzbWFsbGVyIHRoYW4gYSBzZXF1ZW5jZSB0aGF0IGVuZHMgaW4gdGhpcyBjb21wb25lbnQuCistIEhlbHBzIGlkZW50aWZ5IHRoZSBlbmRpbmcgb2YgdmFyaWFibGUtbGVuZ3RoIGNvbXBvbmVudHMgKHNlZSBiZWxvdykuCisKK0V4YW1wbGVzOgorCisKK3wgVHlwZXMgYW5kIHZhbHVlcyAgICAgICAgIHwgYnl0ZXMgICAgICAgICAgICAgICAgICB8IGVuY29kZXMgYXMgICAgICAgICAgICAgICAgICAgICB8Cit8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorfCAoc2hvcnQgMSwgZmxvYXQgMS4wKSAgICAgfCAwMCAwMSwgM0YgODAgMDAgMDAgICAgIHwgNDDCtzgwIDAxwrc0MMK3QkYgODAgMDAgMDDCtzM4IHwKK3wgKHNob3J0IC0xLCBudWxsKSAgICAgICAgIHwgRkYgRkYsIOKAlCAgICAgICAgICAgICAgfCA0MMK3N0YgRkbCtzNFwrczOCAgICAgICAgICAgICAgfAorfCDiiaUgKHNob3J0IDAsIGZsb2F0IC1JbmYpIHwgMDAgMDAsIEZGIDgwIDAwIDAwLCA+PSB8IDQwwrc4MCAwMMK3NDDCtzAwIDdGIEZGIEZGwrcyMCB8Cit8IDwgKHNob3J0IE1JTikgICAgICAgICAgICB8IDgwIDAwLCA8PSAgICAgICAgICAgICAgfCA0MMK3MDAgMDDCtzIwICAgICAgICAgICAgICAgICAgfAorfCBcPiAobnVsbCkgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgM0XCtzYwICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgQk9UVE9NICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8IDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8IFRPUCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCA2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCisoVGhlIG1pZGRsZSBkb3QgwrcgZG9lc24ndCBleGlzdCBpbiB0aGUgZW5jb2RpbmcsIGl04oCZcyBqdXN0IGEgdmlzdWFsaXNhdGlvbiBvZiB0aGUgYm91bmRhcmllcyBpbiB0aGUgZXhhbXBsZXMuKQorCitTaW5jZToKKworLSBhbGwgc2VwYXJhdG9ycyBpbiB1c2UgYXJlIHdpdGhpbiBgMHgxMGAtYDB4RUZgLCBhbmQKKy0gd2UgdXNlIHRoZSBzYW1lIHNlcGFyYXRvciBmb3IgaW50ZXJuYWwgY29tcG9uZW50cywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIG51bGxzIHdoaWNoIHdlIGVuY29kZSB3aXRoIGEgc21hbGxlcgorICBzZXBhcmF0b3IKKy0gdGhlIHNlcXVlbmNlIGhhcyBhIGZpeGVkIG51bWJlciBvZiBjb21wb25lbnRzIG9yIHdlIHVzZSBhIGRpZmZlcmVudCB0cmFpbGluZyB2YWx1ZSB3aGVuZXZlciBpdCBjYW4gYmUgc2hvcnRlcgorCit0aGUgcHJvcGVydGllcyAoMykgYW5kICg0KSBndWFyYW50ZWUgdGhhdCB0aGUgYnl0ZSBjb21wYXJpc29uIG9mIHRoZSBlbmNvZGluZyBnb2VzIGluIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyB0aGUKK2xleGljb2dyYXBoaWNhbCBjb21wYXJpc29uIG9mIHRoZSBzZXF1ZW5jZS4gSW4gY29tYmluYXRpb24gd2l0aCB0aGUgdGhpcmQgcG9pbnQgYWJvdmUsICg0KSBhbHNvIGVuc3VyZXMgdGhhdCBubyBlbmNvZGluZworaXMgYSBwcmVmaXggb2YgYW5vdGhlci4gU2luY2Ugd2UgaGF2ZSAoMSkgYW5kICgyKSwgKDMpIGFuZCAoNCkgYXJlIGFsc28gc2F0aXNmaWVkLgorCitOb3RlIHRoYXQgdGhpcyBtZWFucyB0aGF0IHRoZSBlbmNvZGluZ3Mgb2YgYWxsIHBhcnRpdGlvbiBhbmQgY2x1c3RlcmluZyBrZXlzIHVzZWQgaW4gdGhlIGRhdGFiYXNlIHdpbGwgYmUgcHJlZml4LWZyZWUuCisKKyMjIFZhcmlhYmxlLWxlbmd0aCBieXRlIGNvbXBhcmFibGVzIChBU0NJSSwgVVRGLTggc3RyaW5ncywgYmxvYnMsIEluZXRBZGRyZXNzKQorCitJbiBpc29sYXRpb24sIHRoZXNlIGNhbiBiZSBjb21wYXJlZCBkaXJlY3RseSB3aXRob3V0IHJlaW50ZXJwcmV0YXRpb24uIEhvd2V2ZXIsIG9uY2Ugd2UgcGxhY2UgdGhlc2UgaW5zaWRlIGEgZmxhdHRlbmVkCitzZXF1ZW5jZSBvZiB2YWx1ZXMgd2UgbmVlZCB0byBjbGVhcmx5IGRlZmluZSB0aGUgYm91bmRhcmllcyBiZXR3ZWVuIHZhbHVlcyB3aGlsZSBtYWludGFpbmluZyBvcmRlci4gVG8gZG8gdGhpcyB3ZSB1c2UgYW4KK2VuZC1vZi12YWx1ZSBtYXJrZXI7IHNpbmNlIHNob3J0ZXIgdmFsdWVzIG11c3QgYmUgc21hbGxlciB0aGFuIGxvbmdlciwgdGhpcyBtYXJrZXIgbXVzdCBiZSAwIGFuZCB3ZSBuZWVkIHRvIGZpbmQgYSB3YXkKK3RvIGVuY29kZS9lc2NhcGUgYWN0dWFsIDBzIGluIHRoZSBpbnB1dCBzZXF1ZW5jZS4KKworVGhlIG1ldGhvZCB3ZSBjaG9zZSBmb3IgdGhpcyBpcyB0aGUgZm9sbG93aW5nOgorCistIElmIHRoZSBpbnB1dCBkb2VzIG5vdCBlbmQgb24gYDAwYCwgYSBgMDBgIGJ5dGUgaXMgYXBwZW5kZWQgYXQgdGhlIGVuZC4KKy0gSWYgdGhlIGlucHV0IGNvbnRhaW5zIGEgYDAwYCBieXRlLCBpdCBpcyBlbmNvZGVkIGFzIGAwMCBGRmAuCistIElmIHRoZSBpbnB1dCBjb250YWlucyBhIHNlcXVlbmNlIG9mICpuKiBgMDBgIGJ5dGVzLCB0aGV5IGFyZSBlbmNvZGVkIGFzIGAwMGAgYEZFYCAoKm4qLTEgdGltZXMpIGBGRmAKKyAgKHNvIHRoYXQgd2UgZG9u4oCZdCBkb3VibGUgdGhlIHNpemUgb2YgYDAwYCBibG9icykuCistIElmIHRoZSBpbnB1dCBlbmRzIGluIGAwMGAsIHRoZSBsYXN0IGBGRmAgaXMgY2hhbmdlZCB0byBgRkVgCisgICh0byBlbnN1cmUgaXTigJlzIHNtYWxsZXIgdGhhbiB0aGUgc2FtZSB2YWx1ZSB3aXRoIGAwMGAgYXBwZW5kZWQpLgorCitFeGFtcGxlczoKKworCit8IGJ5dGVzL3NlcXVlbmNlICAgICB8IGVuY29kZXMgYXMgICAgICAgICAgICAgICB8Cit8IC0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Cit8IDIyIDAwICAgICAgICAgICAgICB8IDIyIDAwIEZFICAgICAgICAgICAgICAgICB8Cit8IDIyIDAwIDAwIDMzICAgICAgICB8IDIyIDAwIEZFIEZGIDMzIDAwICAgICAgICB8Cit8IDIyIDAwIDExICAgICAgICAgICB8IDIyIDAwIEZGIDExIDAwICAgICAgICAgICB8Cit8IChibG9iIDIyLCBzaG9ydCAwKSB8IDQwwrcyMiAwMMK3NDDCtzgwIDAwwrc0MCB8Cit8IOKJpSAoYmxvYiAyMiAwMCkgICAgfCA0MMK3MjIgMDAgRkXCtzIwICAgICAgICAgfAorfCDiiaQgKGJsb2IgMjIgMDAgMDApIHwgNDDCtzIyIDAwIEZFIEZFwrc2MCAgICAgIHwKKworV2l0aGluIHRoZSBlbmNvZGluZywgYSBgMDBgIGJ5dGUgY2FuIG9ubHkgYmUgZm9sbG93ZWQgYnkgYSBgRkVgIG9yIGBGRmAgYnl0ZSwgYW5kIGhlbmNlIGlmIGFuIGVuY29kaW5nIGlzIGEgcHJlZml4IG9mCithbm90aGVyLCB0aGUgbGF0dGVyIGhhcyB0byBoYXZlIGEgYEZFYCBvciBgRkZgIGFzIHRoZSBuZXh0IGJ5dGUsIHdoaWNoIGVuc3VyZXMgYm90aCAoNCkgKGFkZGluZyBgMTBgLWBFRmAgdG8gdGhlIGZvcm1lcgorbWFrZXMgaXQgbm8gbG9uZ2VyIGEgcHJlZml4IG9mIHRoZSBsYXR0ZXIpIGFuZCAoMykgKGFkZGluZyBgMTBgLWBFRmAgdG8gdGhlIGZvcm1lciBtYWtlcyBpdCBzbWFsbGVyIHRoYW4gdGhlIGxhdHRlcjsgaW4KK3RoaXMgY2FzZSB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGZvcm1lciBpcyBhIHByZWZpeCBvZiB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGxhdHRlcikuCisKKyMjIFZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VycyAodmFyaW50LCBSYW5kb21QYXJ0aXRpb25lciB0b2tlbiksIGxlZ2FjeSBlbmNvZGluZworCitJZiBpbnRlZ2VycyBvZiB1bmJvdW5kZWQgbGVuZ3RoIGFyZSBndWFyYW50ZWVkIHRvIHN0YXJ0IHdpdGggYSBub24temVybyBkaWdpdCwgdG8gY29tcGFyZSB0aGVtIHdlIGNhbiBmaXJzdCB1c2UgYSBzaWduZWQKK2xlbmd0aCwgYXMgbnVtYmVycyB3aXRoIGxvbmdlciByZXByZXNlbnRhdGlvbnMgaGF2ZSBoaWdoZXIgbWFnbml0dWRlcy4gT25seSBpZiB0aGUgbGVuZ3RocyBtYXRjaCB3ZSBuZWVkIHRvIGNvbXBhcmUgdGhlCitzZXF1ZW5jZSBvZiBkaWdpdHMsIHdoaWNoIG5vdyBoYXMgYSBrbm93biBsZW5ndGguCisKKyhOb3RlOiBUaGUgbWVhbmluZyBvZiDigJxkaWdpdOKAnSBoZXJlIGlzIG5vdCB0aGUgc2FtZSBhcyDigJxkZWNpbWFsIGRpZ2l04oCdLiBXZSBvcGVyYXRlIHdpdGggbnVtYmVycyBzdG9yZWQgYXMgYnl0ZXMsIHRodXMgaXQKK21ha2VzIG1vc3Qgc2Vuc2UgdG8gdHJlYXQgdGhlIG51bWJlcnMgYXMgZW5jb2RlZCBpbiBiYXNlLTI1Niwgd2hlcmUgZWFjaCBkaWdpdCBpcyBhIGJ5dGUuKQorCitUaGlzIHRyYW5zbGF0ZXMgdG8gdGhlIGZvbGxvd2luZyBlbmNvZGluZyBvZiB2YXJpbnRzOgorCistIFN0cmlwIGFueSBsZWFkaW5nIHplcm9zLiBOb3RlIHRoYXQgZm9yIG5lZ2F0aXZlIG51bWJlcnMsIGBCaWdJbnRlZ2VyYCBlbmNvZGVzIGxlYWRpbmcgMCBhcyBgMHhGRmAuCistIElmIHRoZSBsZW5ndGggaXMgMTI4IG9yIGdyZWF0ZXIsIGxlYWQgd2l0aCBhIGJ5dGUgb2YgYDB4RkZgIChwb3NpdGl2ZSkgb3IgYDB4MDBgIChuZWdhdGl2ZSkgZm9yIGV2ZXJ5IDEyOCB1bnRpbCB0aGVyZQorICBhcmUgbGVzcyB0aGFuIDEyOCBsZWZ0LgorLSBFbmNvZGUgdGhlIHNpZ24gYW5kIChyZW1haW5pbmcpIGxlbmd0aCBvZiB0aGUgbnVtYmVyIGFzIGEgYnl0ZToKKyAgLSBgMHg4MCArIChsZW5ndGggLSAxKWAgZm9yIHBvc2l0aXZlIG51bWJlcnMgKHNvIHRoYXQgZ3JlYXRlciBtYWduaXR1ZGUgaXMgaGlnaGVyKTsKKyAgLSBgMHg3RiAtIChsZW5ndGggLSAxKWAgZm9yIG5lZ2F0aXZlIG51bWJlcnMgKHNvIHRoYXQgZ3JlYXRlciBtYWduaXR1ZGUgaXMgbG93ZXIsIGFuZCBhbGwgbmVnYXRpdmVzIGFyZSBsb3dlciB0aGFuCisgICAgcG9zaXRpdmVzKS4KKy0gUGFzdGUgdGhlIGJ5dGVzIG9mIHRoZSBudW1iZXIsIDLigJlzIGNvbXBsZW1lbnQgZW5jb2RlZCBmb3IgbmVnYXRpdmUgbnVtYmVycyAoYEJpZ0ludGVnZXJgIGFscmVhZHkgYXBwbGllcyB0aGUgMuKAmXMKKyAgY29tcGxlbWVudCkuCisKK1NpbmNlIHdoZW4gY29tcGFyaW5nIHR3byBudW1iZXJzIHdlIGVpdGhlciBoYXZlIGEgZGlmZmVyZW5jZSBpbiB0aGUgbGVuZ3RoIHByZWZpeCwgb3IgdGhlIGxlbmd0aHMgYXJlIHRoZSBzYW1lIGlmIHdlCituZWVkIHRvIGNvbXBhcmUgdGhlIGNvbnRlbnQgYnl0ZXMsIHRoZXJlIGlzIG5vIHJpc2sgdGhhdCBhIGxvbmdlciBudW1iZXIgY2FuIGJlIGNvbmZ1c2VkIHdpdGggYSBzaG9ydGVyIGNvbWJpbmVkIGluIGEKK211bHRpLWNvbXBvbmVudCBzZXF1ZW5jZS4gSW4gb3RoZXIgd29yZHMsIG5vIHZhbHVlIGNhbiBiZSBhIHByZWZpeCBvZiBhbm90aGVyLCB0aHVzIHdlIGhhdmUgKDEpIGFuZCAoMikgYW5kIHRodXMgKDMpIGFuZCAoNCkKK2FzIHdlbGwuCisKK0V4YW1wbGVzOgorCisKK3wgICB2YWx1ZSB8IGJ5dGVzICAgICAgICAgICAgfCBlbmNvZGVzIGFzICAgICAgICAgICAgICB8Cit8IC0tLS0tLTogfCAtLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorfCAgICAgICAwIHwgMDAgICAgICAgICAgICAgICB8IDgwwrcwMCAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgMSB8IDAxICAgICAgICAgICAgICAgfCA4MMK3MDEgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgLTEgfCBGRiAgICAgICAgICAgICAgIHwgN0bCt0ZGICAgICAgICAgICAgICAgICAgfAorfCAgICAgMjU1IHwgMDAgRkYgICAgICAgICAgICB8IDgwwrdGRiAgICAgICAgICAgICAgICAgIHwKK3wgICAgLTI1NiB8IEZGIDAwICAgICAgICAgICAgfCA3RsK3MDAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAyNTYgfCAwMSAwMCAgICAgICAgICAgIHwgODHCtzAxIDAwICAgICAgICAgICAgICAgfAorfCAgICAyXjE2IHwgMDEgMDAgMDAgICAgICAgICB8IDgywrcwMSAwMCAwMCAgICAgICAgICAgIHwKK3wgICAtMl4zMiB8IEZGIDAwIDAwIDAwIDAwICAgfCA3Q8K3MDAgMDAgMDAgMDAgICAgICAgICB8Cit8ICAyXjEwMjQgfCAwMSAwMCgxMjggdGltZXMpIHwgRkYgODDCtzAxIDAwKDEyOCB0aW1lcykgfAorfCAtMl4yMDQ4IHwgRkYgMDAoMjU2IHRpbWVzKSB8IDAwIDAwIDgwwrcwMCgyNTYgdGltZXMpIHwKKworKE1pZGRsZSBkb3Qgwrcgc2hvd3MgdGhlIHRyYW5zaXRpb24gcG9pbnQgYmV0d2VlbiBsZW5ndGggYW5kIGRpZ2l0cy4pCisKKyMjIFZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VycywgY3VycmVudCBlbmNvZGluZworCitCZWNhdXNlIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VycyBhcmUgYWxzbyBvZnRlbiB1c2VkIHRvIHN0b3JlIHNtYWxsZXIgcmFuZ2UgaW50ZWdlcnMsIGl0IG1ha2VzIHNlbnNlIHRvIGFsc28gYXBwbHkKK3RoZSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciBlbmNvZGluZy4gVGh1cywgdGhlIGN1cnJlbnQgdmFyaW50IHNjaGVtZSBjaG9vc2VzIHRvOgorCistIFN0cmlwIGFueSBsZWFkaW5nIHplcm9zLiBOb3RlIHRoYXQgZm9yIG5lZ2F0aXZlIG51bWJlcnMsIGBCaWdJbnRlZ2VyYCBlbmNvZGVzIGxlYWRpbmcgMCBhcyBgMHhGRmAuCistIE1hcCBudW1iZXJzIGRpcmVjdGx5IHRvIHRoZWlyIFt2YXJpYWJsZS1sZW5ndGggaW50ZWdlciBlbmNvZGluZ10oI3ZhcmlhYmxlLWxlbmd0aC1lbmNvZGluZy1vZi1pbnRlZ2Vycy1jdXJyZW50LWJpZ2ludCksCisgIGlmIHRoZXkgaGF2ZSA2IGJ5dGVzIG9yIGxlc3MuCistIE90aGVyd2lzZSwgZW5jb2RlIGFzOgorICAtIGEgc2lnbiBieXRlICgwMCBmb3IgbmVnYXRpdmUgbnVtYmVycywgRkYgZm9yIHBvc2l0aXZlLCBkaXN0aW5jdCBmcm9tIHRoZSBsZWFkaW5nIGJ5dGUgb2YgdGhlIHZhcmlhYmxlLWxlbmd0aAorICAgIGVuY29kaW5nIGFib3ZlKQorICAtIGEgdmFyaWFibGUtbGVuZ3RoIGVuY29kZWQgbnVtYmVyIG9mIGJ5dGVzIGFkanVzdGVkIGJ5IC03IChzbyB0aGF0IHRoZSBzbWFsbGVzdCBsZW5ndGggdGhpcyBlbmNvZGluZyB1c2VzIG1hcHMgdG8KKyAgICAwKSwgaW52ZXJ0ZWQgZm9yIG5lZ2F0aXZlIG51bWJlcnMgKHNvIHRoYXQgZ3JlYXRlciBsZW5ndGggY29tcGFyZXMgc21hbGxlcikKKyAgLSB0aGUgYnl0ZXMgb2YgdGhlIG51bWJlciwgdHdvJ3MgY29tcGxlbWVudCBlbmNvZGVkLgorICAgIFdlIG5ldmVyIHVzZSBhIGxvbmdlciBlbmNvZGluZyAoZS5nLiB1c2luZyB0aGUgc2Vjb25kIG1ldGhvZCBpZiB2YXJpYWJsZS1sZW5ndGggc3VmZmljZXMgb3Igd2l0aCBhZGRlZCAwMCBsZWFkaW5nCisgICAgYnl0ZXMpIGlmIGEgc2hvcnRlciBvbmUgc3VmZmljZXMuCisKK0J5IHRoZSBzYW1lIHJlYXNvbmluZyBhcyBhYm92ZSwgYW5kIHRoZSBmYWN0IHRoYXQgdGhlIHNpZ24gYnl0ZSBjYW5ub3QgYmUgY29uZnVzZWQgd2l0aCBhIHZhcmlhYmxlLWxlbmd0aCBlbmNvZGluZworZmlyc3QgYnl0ZSwgbm8gdmFsdWUgY2FuIGJlIGEgcHJlZml4IG9mIGFub3RoZXIuIEFzIHRoZSBzaWduIGJ5dGUgY29tcGFyZXMgc21hbGxlciBmb3IgbmVnYXRpdmUgKHJlc3BlY3RpdmVseSBiaWdnZXIKK2ZvciBwb3NpdGl2ZSBudW1iZXJzKSB0aGFuIGFueSB2YXJpYWJsZS1sZW5ndGggZW5jb2RlZCBpbnRlZ2VyLCB0aGUgY29tcGFyaXNvbiBvcmRlciBpcyBtYWludGFpbmVkIHdoZW4gb25lIG51bWJlcgordXNlcyB2YXJpYWJsZS1sZW5ndGggZW5jb2RpbmcsIGFuZCB0aGUgb3RoZXIgZG9lc24ndC4gTG9uZ2VyIG51bWJlcnMgY29tcGFyZSBzbWFsbGVyIHdoZW4gbmVnYXRpdmUgKGJlY2F1c2Ugb2YgdGhlCitpbnZlcnRlZCBsZW5ndGggYnl0ZXMpLCBhbmQgYmlnZ2VyIHdoZW4gcG9zaXRpdmUuCisKK0V4YW1wbGVzOgorCisKK3wgICB2YWx1ZSB8IGJ5dGVzICAgICAgICAgICAgICAgICAgIHwgZW5jb2RlcyBhcyAgICAgICAgICAgICAgICAgICAgICB8Cit8IC0tLS0tLTogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorfCAgICAgICAwIHwgMDAgICAgICAgICAgICAgICAgICAgICAgfCA4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgMSB8IDAxICAgICAgICAgICAgICAgICAgICAgIHwgODEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgLTEgfCBGRiAgICAgICAgICAgICAgICAgICAgICB8IDdGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgICAgMjU1IHwgMDAgRkYgICAgICAgICAgICAgICAgICAgfCBDMCBGRiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgICAgLTI1NiB8IEZGIDAwICAgICAgICAgICAgICAgICAgIHwgM0YgMDAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAyNTYgfCAwMSAwMCAgICAgICAgICAgICAgICAgICB8IEMxIDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgICAyXjE2IHwgMDEgMDAgMDAgICAgICAgICAgICAgICAgfCBFMSAwMCAwMCAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgICAtMl4zMiB8IEZGIDAwIDAwIDAwIDAwICAgICAgICAgIHwgMDcgMDAgMDAgMDAgMDAgICAgICAgICAgICAgICAgICB8Cit8ICAyXjU2LTEgfCAwMCBGRiBGRiBGRiBGRiBGRiBGRiBGRiB8IEZFIEZGIEZGIEZGIEZGIEZGIEZGIEZGICAgICAgICAgfAorfCAgIC0yXjU2IHwgRkYgMDAgMDAgMDAgMDAgMDAgMDAgMDAgfCAwMSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgICAgICAgIHwKK3wgICAgMl41NiB8IDAxIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHwgRkbCtzAwwrcwMSAwMCAwMCAwMCAwMCAwMCAwMCAwMCB8Cit8IC0yXjU2LTEgfCBGRSBGRiBGRiBGRiBGRiBGRiBGRiBGRiB8IDAwwrdGRsK3RkUgRkYgRkYgRkYgRkYgRkYgRkYgRkYgfAorfCAgMl4xMDI0IHwgMDEgMDAoMTI4IHRpbWVzKSAgICAgICAgfCBGRsK3N0HCtzAxIDAwKDEyOCB0aW1lcykgICAgICAgIHwKK3wgLTJeMjA0OCB8IEZGIDAwKDI1NiB0aW1lcykgICAgICAgIHwgMDDCtzdGIDA2wrcwMCgyNTYgdGltZXMpICAgICAgICB8CisKKyhNaWRkbGUgZG90IMK3IHNob3dzIHRoZSB0cmFuc2l0aW9uIHBvaW50IGJldHdlZW4gbGVuZ3RoIGFuZCBkaWdpdHMuKQorCisjIyBWYXJpYWJsZS1sZW5ndGggZmxvYXRpbmctcG9pbnQgZGVjaW1hbHMgKGRlY2ltYWwpCisKK1ZhcmlhYmxlLWxlbmd0aCBmbG9hdHMgYXJlIG1vcmUgY29tcGxpY2F0ZWQsIGJ1dCB3ZSBjYW4gdHJlYXQgdGhlbSBzaW1pbGFybHkgdG8gSUVFRS03NTQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgYnkKK25vcm1hbGl6aW5nIHRoZW0gYnkgc3BsaXR0aW5nIHRoZW0gaW50byBzaWduLCBtYW50aXNzYSBhbmQgc2lnbmVkIGV4cG9uZW50IHN1Y2ggdGhhdCB0aGUgbWFudGlzc2EgaXMgYSBudW1iZXIgYmVsb3cgMQord2l0aCBhIG5vbi16ZXJvIGxlYWRpbmcgZGlnaXQuIFdlIGNhbiB0aGVuIGNvbXBhcmUgc2lnbiwgZXhwb25lbnQgYW5kIG1hbnRpc3NhIGluIHNlcXVlbmNlICh3aGVyZSB0aGUgY29tcGFyaXNvbiBvZgorZXhwb25lbnQgYW5kIG1hbnRpc3NhIGFyZSB3aXRoIHJldmVyc2VkIG1lYW5pbmcgaWYgdGhlIHNpZ24gaXMgbmVnYXRpdmUpIGFuZCB0aGF0IGdpdmVzIHVzIHRoZSBkZWNpbWFsIG9yZGVyaW5nLgorCitBIGJpdCBvZiBleHRyYSBjYXJlIG11c3QgYmUgZXhlcmNpc2VkIHdoZW4gZW5jb2RpbmcgZGVjaW1hbHMuIFNpbmNlIGZyYWN0aW9ucyBsaWtlIGAwLjFgIGNhbm5vdCBiZSBwZXJmZWN0bHkgZW5jb2RlZCBpbgorYmluYXJ5LCBkZWNpbWFscyAoYW5kIG1hbnRpc3NhcykgY2Fubm90IGJlIGVuY29kZWQgaW4gYmluYXJ5IG9yIGJhc2UtMjU2IGNvcnJlY3RseS4gQSBkZWNpbWFsIGJhc2UgbXVzdCBiZSB1c2VkOyBzaW5jZQord2UgZGVhbCB3aXRoIGJ5dGVzLCBpdCBtYWtlcyBtb3N0IHNlbnNlIHRvIG1ha2UgdGhpbmdzIGEgbGl0dGxlIG1vcmUgZWZmaWNpZW50IGJ5IHVzaW5nIGJhc2UtMTAwLiBGbG9hdGluZy1wb2ludAorZW5jb2RpbmcgYW5kIHRoZSBjb21wYXJpc29uIGlkZWEgZnJvbSB0aGUgcHJldmlvdXMgcGFyYWdyYXBoIHdvcmsgaW4gYW55IG51bWJlciBiYXNlLgorCitgQmlnRGVjaW1hbGAgcHJlc2VudHMgYSBmdXJ0aGVyIGNoYWxsZW5nZSwgYXMgaXQgZW5jb2RlcyBkZWNpbWFscyB1c2luZyBhIG1peHR1cmUgb2YgYmFzZXM6IG51bWJlcnMgaGF2ZSBhIGJpbmFyeS0KK2VuY29kZWQgaW50ZWdlciBwYXJ0IGFuZCBhIGRlY2ltYWwgcG93ZXItb2YtdGVuIHNjYWxlLiBUaGUgYnl0ZXMgcHJvZHVjZWQgYnkgYSBgQmlnRGVjaW1hbGAgYXJlIHRodXMgbm90IHN1aXRhYmxlIGZvcgorZGlyZWN0IGNvbnZlcnNpb24gdG8gYnl0ZSBjb21wYXJhYmxlIGFuZCB3ZSBtdXN0IGZpcnN0IGluc3RhbnRpYXRlIHRoZSBieXRlcyBhcyBhIGBCaWdEZWNpbWFsYCwgYW5kIHRoZW4gYXBwbHkgdGhlCitjbGFzc+KAmXMgbWV0aG9kcyB0byBvcGVyYXRlIG9uIGl0IGFzIGEgbnVtYmVyLgorCitXZSB0aGVuIHVzZSB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgorCistIElmIHRoZSBudW1iZXIgaXMgMCwgdGhlIGVuY29kaW5nIGlzIGEgc2luZ2xlIGAweDgwYCBieXRlLgorLSBDb252ZXJ0IHRoZSBpbnB1dCB0byBzaWduZWQgbWFudGlzc2EgYW5kIHNpZ25lZCBleHBvbmVudCBpbiBiYXNlLTEwMC4gSWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlLCBpbnZlcnQgdGhlIHNpZ24gb2YgdGhlCisgIGV4cG9uZW50IHRvIGZvcm0gdGhlICJtb2R1bGF0ZWQgZXhwb25lbnQiLgorLSBPdXRwdXQgYSBieXRlIGVuY29kaW5nOgorICAtIHRoZSBzaWduIG9mIHRoZSBudW1iZXIgZW5jb2RlZCBhcyBgMHg4MGAgaWYgcG9zaXRpdmUgYW5kIGAweDAwYCBpZiBuZWdhdGl2ZSwKKyAgLSB0aGUgZXhwb25lbnQgbGVuZ3RoIChzdHJpcHBpbmcgbGVhZGluZyAwcykgaW4gYnl0ZXMgYXMgYDB4NDAgKyBtb2R1bGF0ZWRfZXhwb25lbnRfbGVuZ3RoYCwgd2hlcmUgdGhlIGxlbmd0aCBpcyBnaXZlbgorICAgIHdpdGggdGhlIHNpZ24gb2YgdGhlIG1vZHVsYXRlZCBleHBvbmVudC4KKy0gT3V0cHV0IGBleHBvbmVudF9sZW5ndGhgIGJ5dGVzIG9mIG1vZHVsYXRlZCBleHBvbmVudCwgMuKAmXMgY29tcGxlbWVudCBlbmNvZGVkIHNvIHRoYXQgbmVnYXRpdmUgdmFsdWVzIGFyZSBjb3JyZWN0bHkKKyAgb3JkZXJlZC4KKy0gT3V0cHV0IGAweDgwICsgbGVhZGluZyBzaWduZWQgYnl0ZSBvZiBtYW50aXNzYWAsIHdoaWNoIGlzIG9idGFpbmVkIGJ5IG11bHRpcGx5aW5nIHRoZSBtYW50aXNzYSBieSAxMDAgYW5kIHJvdW5kaW5nIHRvCisgIC3iiJ4uIFRoZSByb3VuZGluZyBpcyBkb25lIHNvIHRoYXQgdGhlIHJlbWFpbmRlciBvZiB0aGUgbWFudGlzc2EgYmVjb21lcyBwb3NpdGl2ZSwgYW5kIHRodXMgZXZlcnkgbmV3IGJ5dGUgYWRkcyBzb21lCisgIHZhbHVlIHRvIGl0LCBtYWtpbmcgc2hvcnRlciBzZXF1ZW5jZXMgbG93ZXIgaW4gdmFsdWUuCistIFVwZGF0ZSB0aGUgbWFudGlzc2EgdG8gYmUgdGhlIHJlbWFpbmRlciBhZnRlciB0aGUgcm91bmRpbmcgYWJvdmUuIFRoZSByZXN1bHQgaXMgZ3VhcmFudGVlZCB0byBiZSAwIG9yIGdyZWF0ZXIuCistIFdoaWxlIHRoZSBtYW50aXNzYSBpcyBub24temVybywgb3V0cHV0IGAweDgwICsgbGVhZGluZyBieXRlYCBhcyBhYm92ZSBhbmQgdXBkYXRlIHRoZSBtYW50aXNzYSB0byBiZSB0aGUgcmVtYWluZGVyLgorLSBPdXRwdXQgYDB4MDBgLgorCitBcyBhIGRlc2NyaXB0aW9uIG9mIGhvdyB0aGlzIHByb2R1Y2VzIHRoZSBjb3JyZWN0IG9yZGVyaW5nLCBjb25zaWRlciB0aGUgcmVzdWx0IG9mIGNvbXBhcmlzb24gaW4gdGhlIGZpcnN0IGRpZmZlcmluZworYnl0ZToKKworLSBEaWZmZXJlbmNlIGluIHRoZSBmaXJzdCBieXRlIGNhbiBiZSBjYXVzZWQgYnk6CisgIC0gRGlmZmVyZW5jZSBpbiBzaWduIG9mIHRoZSBudW1iZXIgb3IgYmVpbmcgemVybywgd2hpY2ggeWllbGRzIHRoZSBjb3JyZWN0IG9yZGVyaW5nIGJlY2F1c2UKKyAgICAtIE5lZ2F0aXZlIG51bWJlcnMgc3RhcnQgd2l0aCBgMHgzY2AgLSBgMHg0NGAKKyAgICAtIFplcm8gc3RhcnRzIHdpdGggYDB4ODBgCisgICAgLSBQb3NpdGl2ZSBudW1iZXJzIHN0YXJ0IHdpdGggYDB4YmNgIC0gYDB4YzRgCisgIC0gRGlmZmVyZW5jZSBpbiBzaWduIG9mIHRoZSBleHBvbmVudCBtb2R1bGF0ZWQgd2l0aCB0aGUgc2lnbiBvZiB0aGUgbnVtYmVyLiBJbiBhIHBvc2l0aXZlIG51bWJlciBuZWdhdGl2ZSBleHBvbmVudHMKKyAgICBtZWFuIHNtYWxsZXIgdmFsdWVzLCB3aGlsZSBpbiBhIG5lZ2F0aXZlIG51bWJlciBpdOKAmXMgdGhlIG9wcG9zaXRlLCB0aHVzIHRoZSBtb2R1bGF0aW9uIHdpdGggdGhlIG51bWJlcuKAmXMgc2lnbgorICAgIGVuc3VyZXMgdGhlIGNvcnJlY3Qgb3JkZXJpbmcuCisgIC0gRGlmZmVyZW5jZSBpbiBtb2R1bGF0ZWQgbGVuZ3RoIG9mIHRoZSBleHBvbmVudDogYWdhaW4sIHNpbmNlIHdlIGdhdmUgdGhlIGxlbmd0aCBhIHNpZ24gdGhhdCBpcyBmb3JtZWQgZnJvbSBib3RoCisgICAgdGhlIHNpZ24gb2YgdGhlIGV4cG9uZW50IGFuZCB0aGUgc2lnbiBvZiB0aGUgbnVtYmVyLCBzbWFsbGVyIG51bWJlcnMgbWVhbiBzbWFsbGVyIGV4cG9uZW50IGluIHRoZSBwb3NpdGl2ZSBudW1iZXIKKyAgICBjYXNlLCBhbmQgYmlnZ2VyIGV4cG9uZW50IGluIHRoZSBuZWdhdGl2ZSBudW1iZXIgY2FzZS4gSW4gZWl0aGVyIGNhc2UgdGhpcyBwcm92aWRlcyB0aGUgY29ycmVjdCBvcmRlcmluZy4KKy0gRGlmZmVyZW5jZSBpbiBvbmUgb2YgdGhlIGJ5dGVzIG9mIHRoZSBtb2R1bGF0ZWQgZXhwb25lbnQgKHdob3NlIGxlbmd0aCBhbmQgc2lnbiBhcmUgbm93IGVxdWFsIGZvciBib3RoIGNvbXBhcmVkCisgIG51bWJlcnMpOgorICAtIFNtYWxsZXIgYnl0ZSBtZWFucyBhIHNtYWxsZXIgbW9kdWxhdGVkIGV4cG9uZW50LiBJbiB0aGUgcG9zaXRpdmUgY2FzZSB0aGlzIG1lYW5zIGEgc21hbGxlciBleHBvbmVudCwgdGh1cyBhIHNtYWxsZXIKKyAgICBudW1iZXIuIEluIHRoZSBuZWdhdGl2ZSBjYXNlIHRoaXMgbWVhbnMgdGhlIGV4cG9uZW50IGlzIGJpZ2dlciwgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBudW1iZXIgYXMgd2VsbCwgYW5kIHRodXMKKyAgICB0aGUgbnVtYmVyIGlzIHNtYWxsZXIuCistIEl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIGRpZmZlcmVuY2UgdG8gbWl4IG9uZSBudW1iZXLigJlzIGV4cG9uZW50IHdpdGggYW5vdGhlcuKAmXMgbWFudGlzc2EgKGFzIHN1Y2ggbnVtYmVycyB3b3VsZCBoYXZlCisgIGRpZmZlcmVudCBsZWFkaW5nIGJ5dGVzKS4KKy0gRGlmZmVyZW5jZSBpbiBhIG1hbnRpc3NhIGJ5dGUgcHJlc2VudCBpbiBib3RoIGlucHV0czoKKyAgLSBTbWFsbGVyIGJ5dGUgbWVhbnMgc21hbGxlciBzaWduZWQgbWFudGlzc2EgYW5kIGhlbmNlIHNtYWxsZXIgbnVtYmVyIHdoZW4gdGhlIGV4cG9uZW50cyBhcmUgZXF1YWwuCistIE9uZSBtYW50aXNzYSBlbmRpbmcgYmVmb3JlIGFub3RoZXI6CisgIC0gVGhpcyB3aWxsIHJlc3VsdCBpbiB0aGUgc2hvcnRlciBiZWluZyB0cmVhdGVkIGFzIHNtYWxsZXIgKHNpbmNlIHRoZSB0cmFpbGluZyBieXRlIGlzIGAwMGApLgorICAtIFNpbmNlIGFsbCBtYW50aXNzYXMgaGF2ZSBhdCBsZWFzdCBvbmUgYnl0ZSwgdGhpcyBjYW7igJl0IGhhcHBlbiBpbiB0aGUgbGVhZGluZyBtYW50aXNzYSBieXRlLgorICAtIFRodXMgdGhlIG90aGVyIG51bWJlcuKAmXMgYnl0ZXMgZnJvbSBoZXJlIG9uIGFyZSBub3QgbmVnYXRpdmUsIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlbSBtdXN0IGJlIG5vbi16ZXJvLCB3aGljaCBtZWFucworICAgIGl0cyBtYW50aXNzYSBpcyBiaWdnZXIgYW5kIHRodXMgaXQgZW5jb2RlcyBhIGJpZ2dlciBudW1iZXIuCisKK0V4YW1wbGVzOgorCisKK3wgICAgICB2YWx1ZSB8ICBtZXhwIHwgbWFudGlzc2EgfCBtYW50aXNzYSBpbiBieXRlcyB8IGVuY29kZXMgYXMgICAgICAgICAgIHwKK3wgLS0tLS0tLS0tOiB8IC0tLS06IHwgLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKK3wgICAgICAgIDEuMSB8ICAgICAxIHwgMC4wMTEwICAgfCAuICAwMSAxMCAgICAgICAgICB8IEMxwrcwMcK3ODEgOEHCtzAwICAgIHwKK3wgICAgICAgICAgMSB8ICAgICAxIHwgMC4wMSAgICAgfCAuICAwMSAgICAgICAgICAgICB8IEMxwrcwMcK3ODHCtzAwICAgICAgIHwKK3wgICAgICAgMC4wMSB8ICAgICAwIHwgMC4wMSAgICAgfCAuICAwMSAgICAgICAgICAgICB8IEMwwrc4McK3MDAgICAgICAgICAgIHwKK3wgICAgICAgICAgMCB8ICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8IDgwICAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAtMC4wMSB8ICAgICAwIHwgLTAuMDEgICAgfCAuIC0wMSAgICAgICAgICAgICB8IDQwwrc4McK3MDAgICAgICAgICAgIHwKK3wgICAgICAgICAtMSB8ICAgIC0xIHwgLTAuMDEgICAgfCAuIC0wMSAgICAgICAgICAgICB8IDNGwrdGRsK3N0bCtzAwICAgICAgIHwKK3wgICAgICAgLTEuMSB8ICAgIC0xIHwgLTAuMDExMCAgfCAuIC0wMiA5MCAgICAgICAgICB8IDNGwrdGRsK3N0UgREHCtzAwICAgIHwKK3wgICAgICAtOTguOSB8ICAgIC0xIHwgLTAuOTg5MCAgfCAuIC05OSAxMCAgICAgICAgICB8IDNGwrdGRsK3MUQgOEHCtzAwICAgIHwKK3wgICAgICAgIC05OSB8ICAgIC0xIHwgLTAuOTkgICAgfCAuIC05OSAgICAgICAgICAgICB8IDNGwrdGRsK3MUTCtzAwICAgICAgIHwKK3wgICAgICAtOTkuOSB8ICAgIC0xIHwgLTAuOTk5MCAgfCAuLTEwMCAxMCAgICAgICAgICB8IDNGwrdGRsK3MUMgOEHCtzAwICAgIHwKK3wgIC04LjFlMjAwMCB8IC0xMDAxIHwgLTAuMDgxMCAgfCAuIC0wOSA5MCAgICAgICAgICB8IDNFwrdGQyAxN8K3NzcgREHCtzAwIHwKK3wgLTguMWUtMjAwMCB8ICAgOTk5IHwgLTAuMDgxMCAgfCAuIC0wOSA5MCAgICAgICAgICB8IDQywrcwMyBFN8K3NzcgREHCtzAwIHwKK3wgIDguMWUtMjAwMCB8ICAtOTk5IHwgMC4wODEwICAgfCAuICAwOCAxMCAgICAgICAgICB8IEJFwrdGQyAxOcK3ODggOEHCtzAwIHwKK3wgICA4LjFlMjAwMCB8ICAxMDAxIHwgMC4wODEwICAgfCAuICAwOCAxMCAgICAgICAgICB8IEMywrcwMyBFOcK3ODggOEHCtzAwIHwKKworKG1leHAgc3RhbmRzIGZvciDigJxtb2R1bGF0ZWQgZXhwb25lbnTigJ0sIGkuZS4gZXhwb25lbnQgKiBzaWduKQorCitUaGUgdmFsdWVzIGFyZSBwcmVmaXgtZnJlZSwgYmVjYXVzZSBubyBleHBvbmVudOKAmXMgZW5jb2RpbmcgY2FuIGJlIGEgcHJlZml4IG9mIGFub3RoZXIsIGFuZCB0aGUgbWFudGlzc2FzIGNhbiBuZXZlciBoYXZlCithIGAwMGAgYnl0ZSBhdCBhbnkgcGxhY2Ugb3RoZXIgdGhhbiB0aGUgbGFzdCBieXRlLCBhbmQgdGh1cyBhbGwgKDEpLSg0KSBhcmUgc2F0aXNmaWVkLgorCisjIyBOdWxscyBhbmQgZW1wdHkgZW5jb2RpbmdzCisKK1NvbWUgdHlwZXMgaW4gQ2Fzc2FuZHJhIChlLmcuIG51bWJlcnMpIGFkbWl0IG51bGwgdmFsdWVzIHRoYXQgYXJlIHJlcHJlc2VudGVkIGFzIGVtcHR5IGJ5dGUgYnVmZmVycy4gVGhpcyBpcworZGlzdGluY3QgZnJvbSBudWxsIGJ5dGUgYnVmZmVycywgd2hpY2ggY2FuIGFsc28gYXBwZWFyIGluIHNvbWUgY2FzZXMuIFBhcnRpY3VsYXJseSwgbnVsbCB2YWx1ZXMgaW4gY2x1c3RlcmluZworY29sdW1ucywgd2hlbiBhbGxvd2VkIGJ5IHRoZSB0eXBlLCBhcmUgaW50ZXJwcmV0ZWQgYXMgZW1wdHkgYnl0ZSBidWZmZXJzLCBlbmNvZGVkIHdpdGggdGhlIGVtcHR5IHNlcGFyYXRvciBgMHgzRmAuCitVbnNwZWNpZmllZCBjbHVzdGVyaW5nIGNvbHVtbnMgKGF0IHRoZSBlbmQgb2YgYSBjbHVzdGVyaW5nIHNwZWNpZmljYXRpb24pLCBwb3NzaWJsZSB3aXRoIGBDT01QQUNUIFNUT1JBR0VgIG9yIHNlY29uZGFyeQoraW5kZXhlcywgdXNlIHRoZSBudWxsIHNlcGFyYXRvciBgMHgzRWAuCisKKyMjIFJldmVyc2VkIHR5cGVzCisKK1JldmVyc2luZyBhIHR5cGUgaXMgc3RyYWlnaHRmb3J3YXJkOiBmbGlwIGFsbCBiaXRzIG9mIHRoZSBlbmNvZGVkIGJ5dGUgc2VxdWVuY2UuIFNpbmNlIHRoZSBzb3VyY2UgdHlwZSBlbmNvZGluZyBtdXN0CitzYXRpc2Z5ICgzKSBhbmQgKDQpLCB0aGUgZmxpcHBlZCBiaXRzIGFsc28gZG8gZm9yIHRoZSByZXZlcnNlZCBjb21wYXJhdG9yLiAoSXQgaXMgYWxzbyB0cnVlIHRoYXQgaWYgdGhlIHNvdXJjZSB0eXBlCitzYXRpc2ZpZXMgKDEpLSgyKSwgdGhlIHJldmVyc2VkIHdpbGwgc2F0aXNmeSB0aGVzZSB0b28uKQorCitJbiBhIHNlcXVlbmNlIHdlIGFsc28gbXVzdCBjb3JyZWN0IHRoZSBlbXB0eSBlbmNvZGluZyBmb3IgYSByZXZlcnNlZCB0eXBlIChzaW5jZSBpdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBhbGwgdmFsdWVzKS4KK0luc3RlYWQgb2YgYDB4M0ZgIHdlIHVzZSBgMHg0MWAgYXMgdGhlIHNlcGFyYXRvciBieXRlLiBOdWxsIGVuY29kaW5ncyBhcmUgbm90IG1vZGlmaWVkLCBhcyBudWxscyBjb21wYXJlIHNtYWxsZXIgZXZlbgoraW4gcmV2ZXJzZWQgdHlwZXMuCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiYjgyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVTb3VyY2UuamF2YQpAQCAtMCwwICsxLDg1NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGU7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVmFsdWVBY2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZS5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW1vcnlVdGlsOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworCisvKioKKyAqIEEgc3RyZWFtIG9mIGJ5dGVzLCB1c2VkIGZvciBieXRlLW9yZGVyLWNvbXBhcmFibGUgcmVwcmVzZW50YXRpb25zIG9mIGRhdGEsIGFuZCB1dGlsaXRpZXMgdG8gY29udmVydCB2YXJpb3VzIHZhbHVlcworICogdG8gdGhlaXIgYnl0ZS1vcmRlcmVkIHRyYW5zbGF0aW9uLgorICogU2VlIEJ5dGVDb21wYXJhYmxlLm1kIGZvciBkZXRhaWxzIGFib3V0IHRoZSBlbmNvZGluZyBzY2hlbWUuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQnl0ZVNvdXJjZQoreworICAgIC8qKiBDb25zdW1lIHRoZSBuZXh0IGJ5dGUsIHVuc2lnbmVkLiBNdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1LCBvciBFTkRfT0ZfU1RSRUFNIGlmIHRoZXJlIGFyZSBubyBtb3JlIGJ5dGVzLiAqLworICAgIGludCBuZXh0KCk7CisKKyAgICAvKiogVmFsdWUgcmV0dXJuZWQgaWYgYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiAqLworICAgIGludCBFTkRfT0ZfU1RSRUFNID0gLTE7CisKKyAgICBCeXRlU291cmNlIEVNUFRZID0gKCkgLT4gRU5EX09GX1NUUkVBTTsKKworICAgIC8qKgorICAgICAqIEVzY2FwZSB2YWx1ZS4gVXNlZCwgYW1vbmcgb3RoZXIgdGhpbmdzLCB0byBtYXJrIHRoZSBlbmQgb2Ygc3ViY29tcG9uZW50cyAoc28gdGhhdCBzaG9ydGVyIGNvbXBhcmVzIGJlZm9yZSBhbnl0aGluZyBsb25nZXIpLgorICAgICAqIEFjdHVhbCB6ZXJvcyBpbiBpbnB1dCBuZWVkIHRvIGJlIGVzY2FwZWQgaWYgdGhpcyBpcyBpbiB1c2UgKHNlZSB7QGxpbmsgQWJzdHJhY3RFc2NhcGVyfSkuCisgICAgICovCisgICAgaW50IEVTQ0FQRSA9IDB4MDA7CisKKyAgICAvLyBaZXJvcyBhcmUgZW5jb2RlZCBhcyBhIHNlcXVlbmNlIG9mIEVTQ0FQRSwgMCBvciBtb3JlIG9mIEVTQ0FQRURfMF9DT05ULCBFU0NBUEVEXzBfRE9ORSBzbyB6ZXJvZWQgc3BhY2VzIG9ubHkgZ3JvdyBieSAxIGJ5dGUKKyAgICBpbnQgRVNDQVBFRF8wX0NPTlQgPSAweEZFOworICAgIGludCBFU0NBUEVEXzBfRE9ORSA9IDB4RkY7CisKKyAgICAvLyBBbGwgc2VwYXJhdG9ycyBtdXN0IGJlIHdpdGhpbiB0aGVzZSBib3VuZHMKKyAgICBpbnQgTUlOX1NFUEFSQVRPUiA9IDB4MTA7CisgICAgaW50IE1BWF9TRVBBUkFUT1IgPSAweEVGOworCisgICAgLy8gTmV4dCBjb21wb25lbnQgbWFya2VyLgorICAgIGludCBORVhUX0NPTVBPTkVOVCA9IDB4NDA7CisgICAgLy8gTWFya2VyIHVzZWQgdG8gcHJlc2VudCBudWxsIHZhbHVlcyByZXByZXNlbnRlZCBieSBlbXB0eSBidWZmZXJzIChlLmcuIGJ5IEludDMyVHlwZSkKKyAgICBpbnQgTkVYVF9DT01QT05FTlRfRU1QVFkgPSAweDNGOworICAgIGludCBORVhUX0NPTVBPTkVOVF9FTVBUWV9SRVZFUlNFRCA9IDB4NDE7CisgICAgLy8gTWFya2VyIGZvciBudWxsIGNvbXBvbmVudHMgaW4gdHVwbGVzLCBtYXBzLCBzZXRzIGFuZCBjbHVzdGVyaW5nIGtleXMuCisgICAgaW50IE5FWFRfQ09NUE9ORU5UX05VTEwgPSAweDNFOworCisgICAgLy8gU2VjdGlvbiBmb3IgbmV4dCBjb21wb25lbnQgbWFya2VycyB3aGljaCBpcyBub3QgYWxsb3dlZCBmb3IgdXNlCisgICAgaW50IE1JTl9ORVhUX0NPTVBPTkVOVCA9IDB4M0M7CisgICAgaW50IE1BWF9ORVhUX0NPTVBPTkVOVCA9IDB4NDQ7CisKKyAgICAvLyBEZWZhdWx0IHRlcm1pbmF0b3IgYnl0ZSBpbiBzZXF1ZW5jZXMuIFNtYWxsZXIgdGhhbiBORVhUX0NPTVBPTkVOVF9OVUxMLCBidXQgbGFyZ2VyIHRoYW4gTFRfTkVYVF9DT01QT05FTlQgdG8KKyAgICAvLyBlbnN1cmUgbGV4aWNvZ3JhcGhpYyBjb21wYXJlcyBnbyBpbiB0aGUgY29ycmVjdCBkaXJlY3Rpb24KKyAgICBpbnQgVEVSTUlOQVRPUiA9IDB4Mzg7CisgICAgLy8gVGhlc2UgYXJlIHNwZWNpYWwgZW5kaW5ncywgZm9yIGV4Y2x1c2l2ZS9pbmNsdXNpdmUgYm91bmRzIChpLmUuIHNtYWxsZXIgdGhhbiBhbnl0aGluZyB3aXRoIG1vcmUgY29tcG9uZW50cywKKyAgICAvLyBiaWdnZXIgdGhhbiBhbnl0aGluZyB3aXRoIG1vcmUgY29tcG9uZW50cykKKyAgICBpbnQgTFRfTkVYVF9DT01QT05FTlQgPSAweDIwOworICAgIGludCBHVF9ORVhUX0NPTVBPTkVOVCA9IDB4NjA7CisKKyAgICAvLyBVbnN1cHBvcnRlZCwgZm9yIGFydGlmaWNpYWwgYm91bmRzCisgICAgaW50IExUTFRfTkVYVF9DT01QT05FTlQgPSAweDFGOyAvLyBMVF9ORVhUX0NPTVBPTkVOVCAtIDEKKyAgICBpbnQgR1RHVF9ORVhUX0NPTVBPTkVOVCA9IDB4NjE7IC8vIEdUX05FWFRfQ09NUE9ORU5UICsgMQorCisgICAgLy8gU3BlY2lhbCB2YWx1ZSBmb3IgY29tcG9uZW50cyB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZSBub3JtYWwgbWluL21heCBzcGFuLiAoc3RhdGljIHJvd3MpCisgICAgaW50IEVYQ0xVREVEID0gMHgxODsKKworICAgIC8qKgorICAgICAqIEVuY29kZXMgYnl0ZS1hY2Nlc3NpYmxlIGRhdGEgYXMgYSBieXRlLWNvbXBhcmFibGUgc291cmNlIHRoYXQgaGFzIDBzIGVzY2FwZWQgYW5kIGZpbmlzaGVzIGluIGFuIGVzY2FwZWQKKyAgICAgKiBzdGF0ZS4KKyAgICAgKiBUaGlzIHByb3ZpZGVzIGEgd2Vha2x5LXByZWZpeC1mcmVlIGJ5dGUtY29tcGFyYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IHRvIHVzZSBpbiBzZXF1ZW5jZXMuCisgICAgICogKFNlZSB7QGxpbmsgQWJzdHJhY3RFc2NhcGVyfSBmb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbi4pCisgICAgICovCisgICAgc3RhdGljIDxWPiBCeXRlU291cmNlIG9mKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSwgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBY2Nlc3NvckVzY2FwZXI8PihhY2Nlc3NvciwgZGF0YSwgdmVyc2lvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyBhIGJ5dGUgYnVmZmVyIGFzIGEgYnl0ZS1jb21wYXJhYmxlIHNvdXJjZSB0aGF0IGhhcyAwcyBlc2NhcGVkIGFuZCBmaW5pc2hlcyBpbiBhbiBlc2NhcGUuCisgICAgICogVGhpcyBwcm92aWRlcyBhIHdlYWtseS1wcmVmaXgtZnJlZSBieXRlLWNvbXBhcmFibGUgdmVyc2lvbiBvZiB0aGUgY29udGVudCB0byB1c2UgaW4gc2VxdWVuY2VzLgorICAgICAqIChTZWUgQnl0ZVNvdXJjZS5CdWZmZXJFc2NhcGVyL011bHRpIGZvciBleHBsYW5hdGlvbi4pCisgICAgICovCisgICAgc3RhdGljIEJ5dGVTb3VyY2Ugb2YoQnl0ZUJ1ZmZlciBidWYsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQnVmZmVyRXNjYXBlcihidWYsIHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMgYSBieXRlIGFycmF5IGFzIGEgYnl0ZS1jb21wYXJhYmxlIHNvdXJjZSB0aGF0IGhhcyAwcyBlc2NhcGVkIGFuZCBmaW5pc2hlcyBpbiBhbiBlc2NhcGUuCisgICAgICogVGhpcyBwcm92aWRlcyBhIHByZWZpeC1mcmVlIGJ5dGUtY29tcGFyYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IHRvIHVzZSBpbiBzZXF1ZW5jZXMuCisgICAgICogKFNlZSBCeXRlU291cmNlLkJ1ZmZlckVzY2FwZXIvTXVsdGkgZm9yIGV4cGxhbmF0aW9uLikKKyAgICAgKi8KKyAgICBzdGF0aWMgQnl0ZVNvdXJjZSBvZihieXRlW10gYnVmLCBWZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFycmF5RXNjYXBlcihidWYsIHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMgYSBtZW1vcnkgcmFuZ2UgYXMgYSBieXRlLWNvbXBhcmFibGUgc291cmNlIHRoYXQgaGFzIDBzIGVzY2FwZWQgYW5kIGZpbmlzaGVzIGluIGFuIGVzY2FwZS4KKyAgICAgKiBUaGlzIHByb3ZpZGVzIGEgd2Vha2x5LXByZWZpeC1mcmVlIGJ5dGUtY29tcGFyYWJsZSB2ZXJzaW9uIG9mIHRoZSBjb250ZW50IHRvIHVzZSBpbiBzZXF1ZW5jZXMuCisgICAgICogKFNlZSBCeXRlU291cmNlLkJ1ZmZlckVzY2FwZXIvTXVsdGkgZm9yIGV4cGxhbmF0aW9uLikKKyAgICAgKi8KKyAgICBzdGF0aWMgQnl0ZVNvdXJjZSBvZk1lbW9yeShsb25nIGFkZHJlc3MsIGludCBsZW5ndGgsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTWVtb3J5RXNjYXBlcihhZGRyZXNzLCBsZW5ndGgsIHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbWJpbmVzIGEgY2hhaW4gb2Ygc291cmNlcywgdHVybmluZyB0aGVpciB3ZWFrLXByZWZpeC1mcmVlIGJ5dGUtY29tcGFyYWJsZSByZXByZXNlbnRhdGlvbiBpbnRvIHRoZSBjb21iaW5hdGlvbidzCisgICAgICogcHJlZml4LWZyZWUgYnl0ZS1jb21wYXJhYmxlIHJlcHJlc2VudGF0aW9uLCB3aXRoIHRoZSBpbmNsdWRlZCB0ZXJtaW5hdG9yIGNoYXJhY3Rlci4KKyAgICAgKiBGb3IgY29ycmVjdG5lc3MsIHRoZSB0ZXJtaW5hdG9yIG11c3QgYmUgd2l0aGluIE1JTi1NQVhfU0VQQVJBVE9SIGFuZCBvdXRzaWRlIHRoZSByYW5nZSByZXNlcnZlZCBmb3IKKyAgICAgKiBORVhUX0NPTVBPTkVOVCBtYXJrZXJzLgorICAgICAqIFR5cGljYWxseSBURVJNSU5BVE9SLCBvciBMVC9HVF9ORVhUX0NPTVBPTkVOVCBpZiB1c2VkIGZvciBwYXJ0aWFsbHkgc3BlY2lmaWVkIGJvdW5kcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgQnl0ZVNvdXJjZSB3aXRoVGVybWluYXRvcihpbnQgdGVybWluYXRvciwgQnl0ZVNvdXJjZS4uLiBzcmNzKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHRlcm1pbmF0b3IgPj0gTUlOX1NFUEFSQVRPUiAmJiB0ZXJtaW5hdG9yIDw9IE1BWF9TRVBBUkFUT1I7CisgICAgICAgIGFzc2VydCB0ZXJtaW5hdG9yIDwgTUlOX05FWFRfQ09NUE9ORU5UIHx8IHRlcm1pbmF0b3IgPiBNQVhfTkVYVF9DT01QT05FTlQ7CisgICAgICAgIHJldHVybiBuZXcgTXVsdGkoc3JjcywgdGVybWluYXRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXMgYWJvdmUsIGJ1dCBwZXJtaXRzIGFueSBzZXBhcmF0b3IuIFRoZSBsZWdhY3kgZm9ybWF0IHdhc24ndCB1c2luZyB3ZWFrIHByZWZpeCBmcmVlZG9tIGFuZCBoYXMgc29tZQorICAgICAqIG5vbi1yZXZlcnNpYmxlIHRyYW5zZm9ybWF0aW9ucy4KKyAgICAgKi8KKyAgICBzdGF0aWMgQnl0ZVNvdXJjZSB3aXRoVGVybWluYXRvckxlZ2FjeShpbnQgdGVybWluYXRvciwgQnl0ZVNvdXJjZS4uLiBzcmNzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNdWx0aShzcmNzLCB0ZXJtaW5hdG9yKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZVNvdXJjZSB3aXRoVGVybWluYXRvck1heWJlTGVnYWN5KFZlcnNpb24gdmVyc2lvbiwgaW50IGxlZ2FjeVRlcm1pbmF0b3IsIEJ5dGVTb3VyY2UuLi4gc3JjcykKKyAgICB7CisgICAgICAgIHJldHVybiB2ZXJzaW9uID09IFZlcnNpb24uTEVHQUNZID8gd2l0aFRlcm1pbmF0b3JMZWdhY3kobGVnYWN5VGVybWluYXRvciwgc3JjcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB3aXRoVGVybWluYXRvcihURVJNSU5BVE9SLCBzcmNzKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZVNvdXJjZSBvZihTdHJpbmcgcywgVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUVzY2FwZXIocy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSwgdmVyc2lvbik7CisgICAgfQorCisgICAgc3RhdGljIEJ5dGVTb3VyY2Ugb2YobG9uZyB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTnVtYmVyKHZhbHVlIF4gKDFMPDw2MyksIDgpOworICAgIH0KKworICAgIHN0YXRpYyBCeXRlU291cmNlIG9mKGludCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTnVtYmVyKHZhbHVlIF4gKDFMPDwzMSksIDQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgYSBzb3VyY2UgZm9yIGEgc2lnbmVkIGZpeGVkLWxlbmd0aCBudW1iZXIsIGFsc28gdHJhbnNsYXRpbmcgZW1wdHkgdG8gbnVsbC4KKyAgICAgKiBUaGUgZmlyc3QgYnl0ZSBoYXMgaXRzIHNpZ24gYml0IGludmVydGVkLCBhbmQgdGhlIHJlc3QgYXJlIHBhc3NlZCB1bmNoYW5nZWQuCisgICAgICogUHJlc3VtZXMgdGhhdCB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgaXMgYWx3YXlzIGVpdGhlciAwIG9yIGNvbnN0YW50IGZvciB0aGUgdHlwZSwgd2hpY2ggcGVybWl0cyBkZWNvZGluZyBhbmQKKyAgICAgKiBlbnN1cmVzIHRoZSByZXByZXNlbnRhdGlvbiBpcyBwcmVmaXgtZnJlZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgPFY+IEJ5dGVTb3VyY2Ugb3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aE51bWJlcihWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEpCisgICAgeworICAgICAgICByZXR1cm4gIWFjY2Vzc29yLmlzRW1wdHkoZGF0YSkgPyBzaWduZWRGaXhlZExlbmd0aE51bWJlcihhY2Nlc3NvciwgZGF0YSkgOiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgYSBzb3VyY2UgZm9yIGEgc2lnbmVkIGZpeGVkLWxlbmd0aCBudW1iZXIuCisgICAgICogVGhlIGZpcnN0IGJ5dGUgaGFzIGl0cyBzaWduIGJpdCBpbnZlcnRlZCwgYW5kIHRoZSByZXN0IGFyZSBwYXNzZWQgdW5jaGFuZ2VkLgorICAgICAqIFByZXN1bWVzIHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzIGFsd2F5cyBjb25zdGFudCBmb3IgdGhlIHR5cGUuCisgICAgICovCisgICAgc3RhdGljIDxWPiBCeXRlU291cmNlIHNpZ25lZEZpeGVkTGVuZ3RoTnVtYmVyKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgU2lnbmVkRml4ZWRMZW5ndGhOdW1iZXI8PihhY2Nlc3NvciwgZGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvZHVjZSBhIHNvdXJjZSBmb3IgYSBzaWduZWQgZml4ZWQtbGVuZ3RoIGZsb2F0aW5nLXBvaW50IG51bWJlciwgYWxzbyB0cmFuc2xhdGluZyBlbXB0eSB0byBudWxsLgorICAgICAqIElmIHNpZ24gYml0IGlzIG9uLCByZXR1cm5zIG5lZ2F0ZWQgYnl0ZXMuIElmIG5vdCwgYWRkIHRoZSBzaWduIGJpdCB2YWx1ZS4KKyAgICAgKiAoU2lnbiBvZiBJRUVFIGZsb2F0cyBpcyB0aGUgaGlnaGVzdCBiaXQsIHRoZSByZXN0IGNhbiBiZSBjb21wYXJlZCBpbiBtYWduaXR1ZGUgYnkgYnl0ZSBjb21wYXJpc29uLikKKyAgICAgKiBQcmVzdW1lcyB0aGF0IHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciBpcyBhbHdheXMgZWl0aGVyIDAgb3IgY29uc3RhbnQgZm9yIHRoZSB0eXBlLCB3aGljaCBwZXJtaXRzIGRlY29kaW5nIGFuZAorICAgICAqIGVuc3VyZXMgdGhlIHJlcHJlc2VudGF0aW9uIGlzIHByZWZpeC1mcmVlLgorICAgICAqLworICAgIHN0YXRpYyA8Vj4gQnl0ZVNvdXJjZSBvcHRpb25hbFNpZ25lZEZpeGVkTGVuZ3RoRmxvYXQoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJuICFhY2Nlc3Nvci5pc0VtcHR5KGRhdGEpID8gc2lnbmVkRml4ZWRMZW5ndGhGbG9hdChhY2Nlc3NvciwgZGF0YSkgOiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgYSBzb3VyY2UgZm9yIGEgc2lnbmVkIGZpeGVkLWxlbmd0aCBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgICAgICogSWYgc2lnbiBiaXQgaXMgb24sIHJldHVybnMgbmVnYXRlZCBieXRlcy4gSWYgbm90LCBhZGQgdGhlIHNpZ24gYml0IHZhbHVlLgorICAgICAqIChTaWduIG9mIElFRUUgZmxvYXRzIGlzIHRoZSBoaWdoZXN0IGJpdCwgdGhlIHJlc3QgY2FuIGJlIGNvbXBhcmVkIGluIG1hZ25pdHVkZSBieSBieXRlIGNvbXBhcmlzb24uKQorICAgICAqIFByZXN1bWVzIHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIGlzIGFsd2F5cyBjb25zdGFudCBmb3IgdGhlIHR5cGUuCisgICAgICovCisgICAgc3RhdGljIDxWPiBCeXRlU291cmNlIHNpZ25lZEZpeGVkTGVuZ3RoRmxvYXQoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTaWduZWRGaXhlZExlbmd0aEZsb2F0PD4oYWNjZXNzb3IsIGRhdGEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgYSBzb3VyY2UgZm9yIGEgc2lnbmVkIGludGVnZXIsIHN0b3JlZCB1c2luZyB2YXJpYWJsZSBsZW5ndGggZW5jb2RpbmcuCisgICAgICogVGhlIHJlcHJlc2VudGF0aW9uIHVzZXMgYmV0d2VlbiAxIGFuZCA5IGJ5dGVzLCBpcyBwcmVmaXgtZnJlZSBhbmQgY29tcGFyZXMKKyAgICAgKiBjb3JyZWN0bHkuCisgICAgICovCisgICAgc3RhdGljIEJ5dGVTb3VyY2UgdmFyaWFibGVMZW5ndGhJbnRlZ2VyKGxvbmcgdmFsdWUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFZhcmlhYmxlTGVuZ3RoSW50ZWdlcih2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNlcGFyYXRvciBmb3IgdHdvIGJ5dGUgc291cmNlcywgaS5lLiBzb21ldGhpbmcgdGhhdCBpcyBkZWZpbml0ZWx5ID4gcHJldk1heCwgYW5kIDw9IGN1cnJNaW4sIGFzc3VtaW5nCisgICAgICogcHJldk1heCA8IGN1cnJNaW4uCisgICAgICogVGhpcyByZXR1cm5zIHRoZSBzaG9ydGVzdCBwcmVmaXggb2YgY3Vyck1pbiB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBwcmV2TWF4LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVNvdXJjZSBzZXBhcmF0b3JQcmVmaXgoQnl0ZVNvdXJjZSBwcmV2TWF4LCBCeXRlU291cmNlIGN1cnJNaW4pCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFNlcGFyYXRvcihwcmV2TWF4LCBjdXJyTWluLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2VwYXJhdG9yIGZvciB0d28gYnl0ZSBzb3VyY2VzLCBpLmUuIHNvbWV0aGluZyB0aGF0IGlzIGRlZmluaXRlbHkgPiBwcmV2TWF4LCBhbmQgPD0gY3Vyck1pbiwgYXNzdW1pbmcKKyAgICAgKiBwcmV2TWF4IDwgY3Vyck1pbi4KKyAgICAgKiBUaGlzIGlzIGEgc291cmNlIG9mIGxlbmd0aCAxIGxvbmdlciB0aGFuIHRoZSBjb21tb24gcHJlZml4IG9mIHRoZSB0d28gc291cmNlcywgd2l0aCBsYXN0IGJ5dGUgb25lIGhpZ2hlciB0aGFuIHRoZQorICAgICAqIHByZXZNYXggc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVNvdXJjZSBzZXBhcmF0b3JHdChCeXRlU291cmNlIHByZXZNYXgsIEJ5dGVTb3VyY2UgY3Vyck1pbikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgU2VwYXJhdG9yKHByZXZNYXgsIGN1cnJNaW4sIGZhbHNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVTb3VyY2Ugb25lQnl0ZShpbnQgaSkKKyAgICB7CisgICAgICAgIGFzc2VydCBpID49IDAgJiYgaSA8PSAweEZGIDogIkFyZ3VtZW50IG11c3QgYmUgYSB2YWxpZCB1bnNpZ25lZCBieXRlLiI7CisgICAgICAgIHJldHVybiBuZXcgQnl0ZVNvdXJjZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY29uc3VtZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChjb25zdW1lZCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgY29uc3VtZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVNvdXJjZSBjdXQoQnl0ZVNvdXJjZSBzcmMsIGludCBjdXRvZmYpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEJ5dGVTb3VyY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9zID0gMDsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBwb3MrKyA8IGN1dG9mZiA/IHNyYy5uZXh0KCkgOiBFTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXAgYSBCeXRlU291cmNlIGluIGEgbGVuZ3RoLWZpeGluZyBmYWNhZGUuCisgICAgICoKKyAgICAgKiBJZiB0aGUgbGVuZ3RoIG9mIHtAY29kZSBzcmN9IGlzIGxlc3MgdGhhbiB7QGNvZGUgY3V0b2ZmfSwgdGhlbiBwYWQgaXQgb24gdGhlIHJpZ2h0IHdpdGgge0Bjb2RlIHBhZGRpbmd9IHVudGlsCisgICAgICogdGhlIG92ZXJhbGwgbGVuZ3RoIGVxdWFscyB7QGNvZGUgY3V0b2ZmfS4gIElmIHRoZSBsZW5ndGggb2Yge0Bjb2RlIHNyY30gaXMgZ3JlYXRlciB0aGFuIHtAY29kZSBjdXRvZmZ9LCB0aGVuCisgICAgICogdHJ1bmNhdGUge0Bjb2RlIHNyY30gdG8gdGhhdCBzaXplLiAgRWZmZWN0aXZlbHkgYSBub29wIGlmIHtAY29kZSBzcmN9IGhhcHBlbnMgdG8gaGF2ZSBsZW5ndGgge0Bjb2RlIGN1dG9mZn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBpbnB1dCBzb3VyY2UgdG8gd3JhcAorICAgICAqIEBwYXJhbSBjdXRvZmYgdGhlIHNpemUgb2YgdGhlIHNvdXJjZSByZXR1cm5lZAorICAgICAqIEBwYXJhbSBwYWRkaW5nIGEgcGFkZGluZyBieXRlIChhbiBpbnQgc3ViamVjdCB0byBhIDB4RkYgbWFzaykKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVTb3VyY2UgY3V0T3JSaWdodFBhZChCeXRlU291cmNlIHNyYywgaW50IGN1dG9mZiwgaW50IHBhZGRpbmcpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEJ5dGVTb3VyY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9zID0gMDsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChwb3MrKyA+PSBjdXRvZmYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IG5leHQgPSBzcmMubmV4dCgpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXh0ID09IEVORF9PRl9TVFJFQU0gPyBwYWRkaW5nIDogbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFZhcmlhYmxlLWxlbmd0aCBlbmNvZGluZy4gRXNjYXBlcyAwcyBhcyBFU0NBUEUgKyB6ZXJvIG9yIG1vcmUgRVNDQVBFRF8wX0NPTlQgKyBFU0NBUEVEXzBfRE9ORS4KKyAgICAgKiBJZiB0aGUgc291cmNlIGVuZHMgaW4gMCwgd2UgdXNlIEVTQ0FQRURfMF9DT05UIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbmNvZGluZyByZW1haW5zIHNtYWxsZXIgdGhhbiB0aGF0IHNvdXJjZQorICAgICAqIHdpdGggYSBmdXJ0aGVyIDAgYXQgdGhlIGVuZC4KKyAgICAgKiBGaW5pc2hlcyBpbiBhbiBlc2NhcGVkIHN0YXRlIChlaXRoZXIgd2l0aCBFU0NBUEUgb3IgRVNDQVBFRF8wX0NPTlQpLCB3aGljaCBpbiB7QGxpbmsgTXVsdGl9IGlzIGZvbGxvd2VkIGJ5CisgICAgICogYSBjb21wb25lbnQgc2VwYXJhdG9yIGJldHdlZW4gMHgxMCBhbmQgMHhGRS4KKyAgICAgKgorICAgICAqIEUuZy4gIkFcMFwwQiIgdHJhbnNsYXRlcyB0byA0MTAwRkVGRjQyMDAKKyAgICAgKiAgICAgICJBXDBCXDAiICAgICAgICAgICAgICAgNDEwMEZGNDIwMEZFICgrMDAgZm9yIHtAbGluayBWZXJzaW9uI0xFR0FDWX0pCisgICAgICogICAgICAiQVwwIiAgICAgICAgICAgICAgICAgIDQxMDBGRSAgICAgICAoKzAwIGZvciB7QGxpbmsgVmVyc2lvbiNMRUdBQ1l9KQorICAgICAqICAgICAgIkFCIiAgICAgICAgICAgICAgICAgICA0MTQyMDAKKyAgICAgKgorICAgICAqIElmIGluIGEgc2luZ2xlIGJ5dGUgc291cmNlLCB0aGUgYnl0ZXMgY291bGQgYmUgc2ltcGx5IHBhc3NlZCB1bmNoYW5nZWQsIGJ1dCB0aGlzIHdvdWxkIG5vdCBhbGxvdyB1cyB0bworICAgICAqIGNvbWJpbmUgY29tcG9uZW50cy4gVGhpcyB0cmFuc2xhdGlvbiBwcmVzZXJ2ZXMgb3JkZXIsIGFuZCBzaW5jZSB0aGUgZW5jb2RpbmcgZm9yIDAgaXMgaGlnaGVyIHRoYW4gdGhlIHNlcGFyYXRvcgorICAgICAqIGFsc28gbWFrZXMgc3VyZSBzaG9ydGVyIGNvbXBvbmVudHMgYXJlIHRyZWF0ZWQgYXMgc21hbGxlci4KKyAgICAgKgorICAgICAqIFRoZSBlbmNvZGluZyBpcyBub3QgcHJlZml4LWZyZWUsIHNpbmNlIGUuZy4gdGhlIGVuY29kaW5nIG9mICJBIiAoNDEwMCkgaXMgYSBwcmVmaXggb2YgdGhlIGVuY29kaW5nIG9mICJBXDAiCisgICAgICogKDQxMDBGRSksIGJ1dCB0aGUgYnl0ZSBmb2xsb3dpbmcgdGhlIHByZWZpeCBpcyBndWFyYW50ZWVkIHRvIGJlIEZFIG9yIEZGLCB3aGljaCBtYWtlcyB0aGUgZW5jb2Rpbmcgd2Vha2x5CisgICAgICogcHJlZml4LWZyZWUuIEFkZGl0aW9uYWxseSwgYW55IHN1Y2ggcHJlZml4IHNlcXVlbmNlIHdpbGwgY29tcGFyZSBzbWFsbGVyIHRoYW4gdGhlIHZhbHVlIHRvIHdoaWNoIGl0IGlzIGEgcHJlZml4LAorICAgICAqIGJlY2F1c2UgYW55IHBlcm1pdHRlZCBzZXBhcmF0b3IgYnl0ZSB3aWxsIGJlIHNtYWxsZXIgdGhhbiB0aGUgYnl0ZSBmb2xsb3dpbmcgdGhlIHByZWZpeC4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQWJzdHJhY3RFc2NhcGVyIGltcGxlbWVudHMgQnl0ZVNvdXJjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uIHZlcnNpb247CisgICAgICAgIHByaXZhdGUgaW50IGJ1ZnBvczsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGVzY2FwZWQ7CisKKyAgICAgICAgQWJzdHJhY3RFc2NhcGVyKGludCBwb3NpdGlvbiwgVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmJ1ZnBvcyA9IHBvc2l0aW9uOworICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgZmluYWwgaW50IG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmcG9zID49IGxpbWl0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZnBvcyA+IGxpbWl0KCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTkRfT0ZfU1RSRUFNOworCisgICAgICAgICAgICAgICAgKytidWZwb3M7CisgICAgICAgICAgICAgICAgaWYgKGVzY2FwZWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IFZlcnNpb24uTEVHQUNZKQorICAgICAgICAgICAgICAgICAgICAgICAgLS1idWZwb3M7IC8vIHBsYWNlIGFuIEVTQ0FQRSBhdCB0aGUgZW5kIG9mIHNlcXVlbmNlIGVuZGluZyBpbiBFU0NBUEUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVTQ0FQRURfMF9DT05UOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRVNDQVBFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgaW5kZXggPSBidWZwb3MrKzsKKyAgICAgICAgICAgIGludCBiID0gZ2V0KGluZGV4KSAmIDB4RkY7CisgICAgICAgICAgICBpZiAoIWVzY2FwZWQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGIgPT0gRVNDQVBFKQorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYiA9PSBFU0NBUEUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFU0NBUEVEXzBfQ09OVDsKKyAgICAgICAgICAgICAgICAtLWJ1ZnBvczsKKyAgICAgICAgICAgICAgICBlc2NhcGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVTQ0FQRURfMF9ET05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJ5dGUgZ2V0KGludCBpbmRleCk7CisKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBsaW1pdCgpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBBY2Nlc3NvckVzY2FwZXI8Vj4gZXh0ZW5kcyBBYnN0cmFjdEVzY2FwZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgViBkYXRhOworICAgICAgICBwcml2YXRlIGZpbmFsIFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3I7CisKKyAgICAgICAgcHJpdmF0ZSBBY2Nlc3NvckVzY2FwZXIoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhLCBWZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKDAsIHZlcnNpb24pOworICAgICAgICAgICAgdGhpcy5hY2Nlc3NvciA9IGFjY2Vzc29yOworICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnQgbGltaXQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3Iuc2l6ZShkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBieXRlIGdldChpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3Nvci5nZXRCeXRlKGRhdGEsIGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBCdWZmZXJFc2NhcGVyIGV4dGVuZHMgQWJzdHJhY3RFc2NhcGVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXIgYnVmOworCisgICAgICAgIHByaXZhdGUgQnVmZmVyRXNjYXBlcihCeXRlQnVmZmVyIGJ1ZiwgVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihidWYucG9zaXRpb24oKSwgdmVyc2lvbik7CisgICAgICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnQgbGltaXQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnVmLmxpbWl0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYnl0ZSBnZXQoaW50IGluZGV4KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnVmLmdldChpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQXJyYXlFc2NhcGVyIGV4dGVuZHMgQWJzdHJhY3RFc2NhcGVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBidWY7CisKKyAgICAgICAgcHJpdmF0ZSBBcnJheUVzY2FwZXIoYnl0ZVtdIGJ1ZiwgVmVyc2lvbiB2ZXJzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcigwLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIHRoaXMuYnVmID0gYnVmOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBieXRlIGdldChpbnQgaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBidWZbaW5kZXhdOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBpbnQgbGltaXQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnVmLmxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBNZW1vcnlFc2NhcGVyIGV4dGVuZHMgQWJzdHJhY3RFc2NhcGVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgYWRkcmVzczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGVuZ3RoOworCisgICAgICAgIE1lbW9yeUVzY2FwZXIobG9uZyBhZGRyZXNzLCBpbnQgbGVuZ3RoLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKDAsIHZlcnNpb24pOworICAgICAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGJ5dGUgZ2V0KGludCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIE1lbW9yeVV0aWwuZ2V0Qnl0ZShhZGRyZXNzICsgaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGludCBsaW1pdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaXhlZCBsZW5ndGggc2lnbmVkIG51bWJlciBlbmNvZGluZy4gSW52ZXJ0cyBmaXJzdCBiaXQgKHNvIHRoYXQgbmVnIDwgcG9zKSwgdGhlbiBqdXN0IHBvc3RzIGFsbCBieXRlcyBmcm9tIHRoZQorICAgICAqIGJ1ZmZlci4gQXNzdW1lcyBidWZmZXIgaXMgb2YgY29ycmVjdCBsZW5ndGguCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFNpZ25lZEZpeGVkTGVuZ3RoTnVtYmVyPFY+IGltcGxlbWVudHMgQnl0ZVNvdXJjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yOworICAgICAgICBwcml2YXRlIGZpbmFsIFYgZGF0YTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgYnVmcG9zOworCisgICAgICAgIHB1YmxpYyBTaWduZWRGaXhlZExlbmd0aE51bWJlcihWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBWIGRhdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuYWNjZXNzb3IgPSBhY2Nlc3NvcjsKKyAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgICAgICAgICB0aGlzLmJ1ZnBvcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBuZXh0KCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGJ1ZnBvcyA+PSBhY2Nlc3Nvci5zaXplKGRhdGEpKQorICAgICAgICAgICAgICAgIHJldHVybiBFTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgaW50IHYgPSBhY2Nlc3Nvci5nZXRCeXRlKGRhdGEsIGJ1ZnBvcykgJiAweEZGOworICAgICAgICAgICAgaWYgKGJ1ZnBvcyA9PSAwKQorICAgICAgICAgICAgICAgIHYgXj0gMHg4MDsKKyAgICAgICAgICAgICsrYnVmcG9zOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYXJpYWJsZS1sZW5ndGggZW5jb2RpbmcgZm9yIHVuc2lnbmVkIGludGVnZXJzLgorICAgICAqIFRoZSBlbmNvZGluZyBpcyBzaW1pbGFyIHRvIFVURi04IGVuY29kaW5nLgorICAgICAqIE51bWJlcnMgYmV0d2VlbiAwIGFuZCAxMjcgYXJlIGVuY29kZWQgaW4gb25lIGJ5dGUsIHVzaW5nIDAgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LgorICAgICAqIExhcmdlciB2YWx1ZXMgaGF2ZSAxcyBpbiBhcyBtYW55IG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgYXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGJ5dGVzCisgICAgICogaW4gdGhlIHJlcHJlc2VudGF0aW9uLCBmb2xsb3dlZCBieSBhIDAuIFRoaXMgZW5zdXJlcyB0aGF0IGxvbmdlciBudW1iZXJzIGNvbXBhcmUgbGFyZ2VyIHRoYW4gc2hvcnRlcgorICAgICAqIG9uZXMuIFNpbmNlIHdlIG5ldmVyIHVzZSBhIGxvbmdlciByZXByZXNlbnRhdGlvbiB0aGFuIG5lY2Vzc2FyeSwgdGhpcyBpbXBsaWVzIG51bWJlcnMgY29tcGFyZSBjb3JyZWN0bHkuCisgICAgICogQXMgdGhlIG51bWJlciBvZiBieXRlcyBpcyBzcGVjaWZpZWQgaW4gdGhlIGJpdHMgb2YgdGhlIGZpcnN0LCBubyB2YWx1ZSBpcyBhIHByZWZpeCBvZiBhbm90aGVyLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBWYXJpYWJsZUxlbmd0aFVuc2lnbmVkSW50ZWdlciBpbXBsZW1lbnRzIEJ5dGVTb3VyY2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyB2YWx1ZTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcG9zID0gLTE7CisKKyAgICAgICAgcHVibGljIFZhcmlhYmxlTGVuZ3RoVW5zaWduZWRJbnRlZ2VyKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBiaXRzTWludXNPbmUgPSA2MyAtIChMb25nLm51bWJlck9mTGVhZGluZ1plcm9zKHZhbHVlIHwgMSkpOyAvLyAwIHRvIDYzICh0aGUgfCAxIGlzIHRvIG1ha2Ugc3VyZSAwIG1hcHMgdG8gMCAoMSBiaXQpKQorICAgICAgICAgICAgICAgIGludCBieXRlc01pbnVzT25lID0gYml0c01pbnVzT25lIC8gNzsKKyAgICAgICAgICAgICAgICBpbnQgbWFzayA9IC0yNTYgPj4gYnl0ZXNNaW51c09uZTsgICAvLyBzZXF1ZW5jZSBvZiBieXRlc01pbnVzT25lIDFzIGluIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdHMKKyAgICAgICAgICAgICAgICBwb3MgPSBieXRlc01pbnVzT25lICogODsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludCkgKCh2YWx1ZSA+Pj4gcG9zKSB8IG1hc2spICYgMHhGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcyAtPSA4OworICAgICAgICAgICAgaWYgKHBvcyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gKGludCkgKHZhbHVlID4+PiBwb3MpICYgMHhGRjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZhcmlhYmxlLWxlbmd0aCBlbmNvZGluZyBmb3Igc2lnbmVkIGludGVnZXJzLgorICAgICAqIFRoZSBlbmNvZGluZyBpcyBiYXNlZCBvbiB0aGUgdW5zaWduZWQgZW5jb2RpbmcgYWJvdmUsIHdoZXJlIHRoZSBmaXJzdCBiaXQgc3RvcmVkIGlzIHRoZSBpbnZlcnRlZCBzaWduLAorICAgICAqIGZvbGxvd2VkIGJ5IGFzIG1hbnkgbWF0Y2hpbmcgYml0cyBhcyB0aGVyZSBhcmUgYWRkaXRpb25hbCBieXRlcyBpbiB0aGUgZW5jb2RpbmcsIGZvbGxvd2VkIGJ5IHRoZSB0d28ncworICAgICAqIGNvbXBsZW1lbnQgb2YgdGhlIG51bWJlci4KKyAgICAgKiBCZWNhdXNlIG9mIHRoZSBpbnZlcnRlZCBzaWduIGJpdCwgbmVnYXRpdmUgbnVtYmVycyBjb21wYXJlIHNtYWxsZXIgdGhhbiBwb3NpdGl2ZXMsIGFuZCBiZWNhdXNlIHRoZSBsZW5ndGgKKyAgICAgKiBiaXRzIG1hdGNoIHRoZSBzaWduLCBsb25nZXIgcG9zaXRpdmUgbnVtYmVycyBjb21wYXJlIGdyZWF0ZXIgYW5kIGxvbmdlciBuZWdhdGl2ZSBvbmVzIGNvbXBhcmUgc21hbGxlci4KKyAgICAgKgorICAgICAqIEV4YW1wbGVzOgorICAgICAqICAgICAgMCAgICAgICAgICAgICAgZW5jb2RlcyBhcyAgICAgICAgICAgODAKKyAgICAgKiAgICAgIDEgICAgICAgICAgICAgIGVuY29kZXMgYXMgICAgICAgICAgIDgxCisgICAgICogICAgIC0xICAgICAgICAgICAgICBlbmNvZGVzIGFzICAgICAgICAgICA3RgorICAgICAqICAgICA2MyAgICAgICAgICAgICAgZW5jb2RlcyBhcyAgICAgICAgICAgQkYKKyAgICAgKiAgICAgNjQgICAgICAgICAgICAgIGVuY29kZXMgYXMgICAgICAgICAgIEMwNDAKKyAgICAgKiAgICAtNjQgICAgICAgICAgICAgIGVuY29kZXMgYXMgICAgICAgICAgIDQwCisgICAgICogICAgLTY1ICAgICAgICAgICAgICBlbmNvZGVzIGFzICAgICAgICAgICAzRkJGCisgICAgICogICAyXjIwLTEgICAgICAgICAgICBlbmNvZGVzIGFzICAgICAgICAgICBFRkZGRkYKKyAgICAgKiAgIDJeMjAgICAgICAgICAgICAgIGVuY29kZXMgYXMgICAgICAgICAgIEYwMTAwMDAwCisgICAgICogIC0yXjIwICAgICAgICAgICAgICBlbmNvZGVzIGFzICAgICAgICAgICAxMDAwMDAKKyAgICAgKiAgIDJeNjQtMSAgICAgICAgICAgIGVuY29kZXMgYXMgICAgICAgICAgIEZGRkZGRkZGRkZGRkZGRkZGRgorICAgICAqICAtMl42NCAgICAgICAgICAgICAgZW5jb2RlcyBhcyAgICAgICAgICAgMDAwMDAwMDAwMDAwMDAwMDAwCisgICAgICoKKyAgICAgKiBBcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGlzIHNwZWNpZmllZCBpbiBiaXRzIDItOSwgbm8gdmFsdWUgaXMgYSBwcmVmaXggb2YgYW5vdGhlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgVmFyaWFibGVMZW5ndGhJbnRlZ2VyIGltcGxlbWVudHMgQnl0ZVNvdXJjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHZhbHVlOworICAgICAgICBwcml2YXRlIGludCBwb3M7CisKKyAgICAgICAgcHVibGljIFZhcmlhYmxlTGVuZ3RoSW50ZWdlcihsb25nIHZhbHVlKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIG5lZ2F0aXZlTWFzayA9IHZhbHVlID4+IDYzOyAgICAvLyAtMSBmb3IgbmVnYXRpdmUsIDAgZm9yIHBvc2l0aXZlCisgICAgICAgICAgICB2YWx1ZSBePSBuZWdhdGl2ZU1hc2s7CisKKyAgICAgICAgICAgIGludCBiaXRzID0gNjQgLSBMb25nLm51bWJlck9mTGVhZGluZ1plcm9zKHZhbHVlIHwgMSk7IC8vIDEgdG8gNjMgKGNhbid0IGJlIDY0IGJlY2F1c2Ugd2UgZmxpcCBuZWdhdGl2ZSBudW1iZXJzKQorICAgICAgICAgICAgaW50IGJ5dGVzID0gYml0cyAvIDcgKyAxOyAgIC8vIDAtNiBiaXRzIDEgYnl0ZSA3LTEzIDIgYnl0ZXMgZXRjIHRvIDU2LTYzIDkgYnl0ZXMKKyAgICAgICAgICAgIGlmIChieXRlcyA+PSA5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhbHVlIHw9IDB4ODAwMDAwMDAwMDAwMDAwMEw7ICAgLy8gOHRoIGJpdCwgd2hpY2ggZG9lc24ndCBmaXQgdGhlIGZpcnN0IGJ5dGUKKyAgICAgICAgICAgICAgICBwb3MgPSBuZWdhdGl2ZU1hc2sgPCAwID8gMjU2IDogLTE7IC8vIG91dCBvZiAwLTY0IHJhbmdlIGludGVnZXIgc3VjaCB0aGF0ICYgMHhGRiBpcyAweDAwIGZvciBuZWdhdGl2ZSBhbmQgMHhGRiBmb3IgcG9zaXRpdmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIG1hc2sgPSAoLTB4MTAwID4+IGJ5dGVzKSAmIDB4RkY7IC8vIG9uZSBpbiBzaWduIGJpdCBhbmQgYXMgbWFueSBtb3JlIGFzIHRoZXJlIGFyZSBleHRyYSBieXRlcworICAgICAgICAgICAgICAgIHBvcyA9IGJ5dGVzICogODsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlIHwgKG1hc2sgPDwgKHBvcyAtIDgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFsdWUgXj0gbmVnYXRpdmVNYXNrOworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwb3MgPD0gMCB8fCBwb3MgPiA2NCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocG9zID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIDgtYnl0ZSB2YWx1ZSwgcmV0dXJuaW5nIGZpcnN0IGJ5dGUKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IHBvcyAmIDB4RkY7IC8vIDB4MDAgZm9yIG5lZ2F0aXZlIG51bWJlcnMsIDB4RkYgZm9yIHBvc2l0aXZlCisgICAgICAgICAgICAgICAgICAgIHBvcyA9IDY0OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcyAtPSA4OworICAgICAgICAgICAgcmV0dXJuIChpbnQpICh2YWx1ZSA+Pj4gcG9zKSAmIDB4RkY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTnVtYmVyIGltcGxlbWVudHMgQnl0ZVNvdXJjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHZhbHVlOworICAgICAgICBwcml2YXRlIGludCBwb3M7CisKKyAgICAgICAgcHVibGljIE51bWJlcihsb25nIHZhbHVlLCBpbnQgbGVuZ3RoKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB0aGlzLnBvcyA9IGxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocG9zID09IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gKGludCkgKCh2YWx1ZSA+PiAoLS1wb3MgKiA4KSkgJiAweEZGKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpeGVkIGxlbmd0aCBzaWduZWQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGVuY29kaW5nLiBGaXJzdCBiaXQgaXMgc2lnbi4gSWYgcG9zaXRpdmUsIGFkZCBzaWduIGJpdCB2YWx1ZSB0byBtYWtlCisgICAgICogZ3JlYXRlciB0aGFuIGFsbCBuZWdhdGl2ZXMuIElmIG5vdCwgaW52ZXJ0IGFsbCBjb250ZW50IHRvIG1ha2UgbmVnYXRpdmVzIHdpdGggYmlnZ2VyIG1hZ25pdHVkZSBzbWFsbGVyLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBTaWduZWRGaXhlZExlbmd0aEZsb2F0PFY+IGltcGxlbWVudHMgQnl0ZVNvdXJjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yOworICAgICAgICBwcml2YXRlIGZpbmFsIFYgZGF0YTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgYnVmcG9zOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW52ZXJ0OworCisgICAgICAgIHB1YmxpYyBTaWduZWRGaXhlZExlbmd0aEZsb2F0KFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5hY2Nlc3NvciA9IGFjY2Vzc29yOworICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKKyAgICAgICAgICAgIHRoaXMuYnVmcG9zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnVmcG9zID49IGFjY2Vzc29yLnNpemUoZGF0YSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICBpbnQgdiA9IGFjY2Vzc29yLmdldEJ5dGUoZGF0YSwgYnVmcG9zKSAmIDB4RkY7CisgICAgICAgICAgICBpZiAoYnVmcG9zID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW52ZXJ0ID0gdiA+PSAweDgwOworICAgICAgICAgICAgICAgIHYgfD0gMHg4MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbnZlcnQpCisgICAgICAgICAgICAgICAgdiA9IHYgXiAweEZGOworICAgICAgICAgICAgKytidWZwb3M7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbWJpbmF0aW9uIG9mIG11bHRpcGxlIGJ5dGUgc291cmNlcy4gQWRkcyB7QGxpbmsgTkVYVF9DT01QT05FTlR9IGJlZm9yZSBzb3VyY2VzLCBvciB7QGxpbmsgTkVYVF9DT01QT05FTlRfTlVMTH0gaWYgbmV4dCBpcyBudWxsLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBNdWx0aSBpbXBsZW1lbnRzIEJ5dGVTb3VyY2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZVNvdXJjZVtdIHNyY3M7CisgICAgICAgIHByaXZhdGUgaW50IHNyY251bSA9IC0xOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBzZXF1ZW5jZVRlcm1pbmF0b3I7CisKKyAgICAgICAgTXVsdGkoQnl0ZVNvdXJjZVtdIHNyY3MsIGludCBzZXF1ZW5jZVRlcm1pbmF0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuc3JjcyA9IHNyY3M7CisgICAgICAgICAgICB0aGlzLnNlcXVlbmNlVGVybWluYXRvciA9IHNlcXVlbmNlVGVybWluYXRvcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3JjbnVtID09IHNyY3MubGVuZ3RoKQorICAgICAgICAgICAgICAgIHJldHVybiBFTkRfT0ZfU1RSRUFNOworCisgICAgICAgICAgICBpbnQgYiA9IEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICBpZiAoc3JjbnVtID49IDAgJiYgc3Jjc1tzcmNudW1dICE9IG51bGwpCisgICAgICAgICAgICAgICAgYiA9IHNyY3Nbc3JjbnVtXS5uZXh0KCk7CisgICAgICAgICAgICBpZiAoYiA+IEVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGI7CisKKyAgICAgICAgICAgICsrc3JjbnVtOworICAgICAgICAgICAgaWYgKHNyY251bSA9PSBzcmNzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2VUZXJtaW5hdG9yOworICAgICAgICAgICAgaWYgKHNyY3Nbc3JjbnVtXSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBORVhUX0NPTVBPTkVOVF9OVUxMOworICAgICAgICAgICAgcmV0dXJuIE5FWFRfQ09NUE9ORU5UOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHRoZSBzaG9ydGVzdCBjb21tb24gcHJlZml4IG9mIHByZXZNYXggYW5kIGN1cnJNaW4gdGhhdCBzZXBhcmF0ZXMgdGhvc2UgdHdvIGJ5dGUgc3RyZWFtcy4KKyAgICAgKiBJZiB7QGNvZGUgdXNlQ3VyciA9PSB0cnVlfSB0aGUgbGFzdCBieXRlIG9mIHRoZSByZXR1cm5lZCBzdHJlYW0gY29tZXMgZnJvbSB7QGNvZGUgY3Vyck1pbn0gYW5kIGlzIHRoZSBmaXJzdAorICAgICAqIGJ5dGUgd2hpY2ggaXMgZ3JlYXRlciB0aGFuIGJ5dGUgb24gdGhlIGNvcnJlc3BvbmRpbmcgcG9zaXRpb24gb2Yge0Bjb2RlIHByZXZNYXh9LgorICAgICAqIE90aGVyd2lzZSwgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgcmV0dXJuZWQgc3RyZWFtIGNvbWVzIGZyb20ge0Bjb2RlIHByZXZNYXh9IGFuZCBpcyBpbmNyZW1lbnRlZCBieSBvbmUsIHN0aWxsCisgICAgICogZ3VhcmFudGVlaW5nIHRoYXQgaXQgaXMgPD0gdGhhbiB0aGUgYnl0ZSBvbiB0aGUgY29ycmVzcG9uZGluZyBwb3NpdGlvbiBvZiB7QGNvZGUgY3Vyck1pbn0uCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFNlcGFyYXRvciBpbXBsZW1lbnRzIEJ5dGVTb3VyY2UKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZVNvdXJjZSBwcmV2OworICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVTb3VyY2UgY3VycjsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHVzZUN1cnI7CisKKyAgICAgICAgU2VwYXJhdG9yKEJ5dGVTb3VyY2UgcHJldk1heCwgQnl0ZVNvdXJjZSBjdXJyTWluLCBib29sZWFuIHVzZUN1cnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucHJldiA9IHByZXZNYXg7CisgICAgICAgICAgICB0aGlzLmN1cnIgPSBjdXJyTWluOworICAgICAgICAgICAgdGhpcy51c2VDdXJyID0gdXNlQ3VycjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IG5leHQoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZG9uZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIGludCBwID0gcHJldi5uZXh0KCk7CisgICAgICAgICAgICBpbnQgYyA9IGN1cnIubmV4dCgpOworICAgICAgICAgICAgYXNzZXJ0IHAgPD0gYyA6IHByZXYgKyAiIG5vdCBsZXNzIHRoYW4gIiArIGN1cnI7CisgICAgICAgICAgICBpZiAocCA9PSBjKQorICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gdXNlQ3VyciA/IGMgOiBwICsgMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyA8Vj4gQnl0ZVNvdXJjZSBvcHRpb25hbEZpeGVkTGVuZ3RoKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIFYgZGF0YSkKKyAgICB7CisgICAgICAgIHJldHVybiAhYWNjZXNzb3IuaXNFbXB0eShkYXRhKSA/IGZpeGVkTGVuZ3RoKGFjY2Vzc29yLCBkYXRhKSA6IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBieXRlIHNvdXJjZSBvZiB0aGUgZ2l2ZW4gYnl0ZXMgd2l0aG91dCBhbnkgZW5jb2RpbmcuCisgICAgICogVGhlIHJlc3VsdGluZyBzb3VyY2UgaXMgb25seSBndWFyYW50ZWVkIHRvIGdpdmUgY29ycmVjdCBjb21wYXJpc29uIHJlc3VsdHMgYW5kIGJlIHByZWZpeC1mcmVlIGlmIHRoZQorICAgICAqIHVuZGVybHlpbmcgdHlwZSBoYXMgYSBmaXhlZCBsZW5ndGguCisgICAgICogSW4gdGVzdHMsIHRoaXMgbWV0aG9kIGlzIGFsc28gdXNlZCB0byBnZW5lcmF0ZSBub24tZXNjYXBlZCB0ZXN0IGNhc2VzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFY+IEJ5dGVTb3VyY2UgZml4ZWRMZW5ndGgoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgViBkYXRhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlU291cmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBvcyA9IC0xOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICsrcG9zIDwgYWNjZXNzb3Iuc2l6ZShkYXRhKSA/IGFjY2Vzc29yLmdldEJ5dGUoZGF0YSwgcG9zKSAmIDB4RkYgOiBFTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgYnl0ZSBzb3VyY2Ugb2YgdGhlIGdpdmVuIGJ5dGVzIHdpdGhvdXQgYW55IGVuY29kaW5nLgorICAgICAqIFRoZSByZXN1bHRpbmcgc291cmNlIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBnaXZlIGNvcnJlY3QgY29tcGFyaXNvbiByZXN1bHRzIGFuZCBiZSBwcmVmaXgtZnJlZSBpZiB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIHR5cGUgaGFzIGEgZml4ZWQgbGVuZ3RoLgorICAgICAqIEluIHRlc3RzLCB0aGlzIG1ldGhvZCBpcyBhbHNvIHVzZWQgdG8gZ2VuZXJhdGUgbm9uLWVzY2FwZWQgdGVzdCBjYXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVTb3VyY2UgZml4ZWRMZW5ndGgoQnl0ZUJ1ZmZlciBiKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlU291cmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBvcyA9IGIucG9zaXRpb24oKSAtIDE7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBuZXh0KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKytwb3MgPCBiLmxpbWl0KCkgPyBiLmdldChwb3MpICYgMHhGRiA6IEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBieXRlIHNvdXJjZSBvZiB0aGUgZ2l2ZW4gYnl0ZXMgd2l0aG91dCBhbnkgZW5jb2RpbmcuCisgICAgICogSWYgdXNlZCBpbiBhIHNlcXVlbmNlLCB0aGUgcmVzdWx0aW5nIHNvdXJjZSBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gZ2l2ZSBjb3JyZWN0IGNvbXBhcmlzb24gcmVzdWx0cyBpZiB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIHR5cGUgaGFzIGEgZml4ZWQgbGVuZ3RoLgorICAgICAqIEluIHRlc3RzLCB0aGlzIG1ldGhvZCBpcyBhbHNvIHVzZWQgdG8gZ2VuZXJhdGUgbm9uLWVzY2FwZWQgdGVzdCBjYXNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVTb3VyY2UgZml4ZWRMZW5ndGgoYnl0ZVtdIGIpCisgICAgeworICAgICAgICByZXR1cm4gZml4ZWRMZW5ndGgoYiwgMCwgYi5sZW5ndGgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVNvdXJjZSBmaXhlZExlbmd0aChieXRlW10gYiwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIGNoZWNrQXJndW1lbnQob2Zmc2V0ID49IDAgJiYgb2Zmc2V0IDw9IGIubGVuZ3RoKTsKKyAgICAgICAgY2hlY2tBcmd1bWVudChsZW5ndGggPj0gMCAmJiBvZmZzZXQgKyBsZW5ndGggPD0gYi5sZW5ndGgpOworCisgICAgICAgIHJldHVybiBuZXcgQnl0ZVNvdXJjZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwb3MgPSBvZmZzZXQgLSAxOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuICsrcG9zIDwgb2Zmc2V0ICsgbGVuZ3RoID8gYltwb3NdICYgMHhGRiA6IEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFBlZWthYmxlIGltcGxlbWVudHMgQnl0ZVNvdXJjZQorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVTb3VyY2Ugd3JhcHBlZDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgcGVla2VkID0gTk9ORTsKKworICAgICAgICBwdWJsaWMgUGVla2FibGUoQnl0ZVNvdXJjZSB3cmFwcGVkKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwZWVrZWQgIT0gTk9ORSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdmFsID0gcGVla2VkOworICAgICAgICAgICAgICAgIHBlZWtlZCA9IE5PTkU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5uZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IHBlZWsoKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocGVla2VkID09IE5PTkUpCisgICAgICAgICAgICAgICAgcGVla2VkID0gd3JhcHBlZC5uZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gcGVla2VkOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBQZWVrYWJsZSBwZWVrYWJsZShCeXRlU291cmNlIHApCisgICAgeworICAgICAgICAvLyBXaGVuIGdpdmVuIGEgbnVsbCBzb3VyY2UsIHdlJ3JlIGJldHRlciBvZmYgbm90IHdyYXBwaW5nIGl0IGFuZCBqdXN0IHJldHVybmluZyBudWxsLiBUaGlzIHdheSBleGlzdGluZworICAgICAgICAvLyBjb2RlIHRoYXQgZG9lc24ndCBrbm93IGFib3V0IEJ5dGVTb3VyY2UuUGVla2FibGUsIGJ1dCBoYW5kbGVzIGNvcnJlY3RseSBudWxsIEJ5dGVTb3VyY2VzIHdvbid0IGJlIHRocm93bgorICAgICAgICAvLyBvZmYgYnkgYSBub24tbnVsbCBpbnN0YW5jZSB0aGF0IHNlbWFudGljYWxseSBzaG91bGQgaGF2ZSBiZWVuIG51bGwuCisgICAgICAgIGlmIChwID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIChwIGluc3RhbmNlb2YgUGVla2FibGUpCisgICAgICAgICAgICAgICA/IChQZWVrYWJsZSkgcAorICAgICAgICAgICAgICAgOiBuZXcgUGVla2FibGUocCk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVTb3VyY2VJbnZlcnNlLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlSW52ZXJzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YjY2NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlSW52ZXJzZS5qYXZhCkBAIC0wLDAgKzEsNDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZTsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5WYWx1ZUFjY2Vzc29yOworCisvKioKKyAqIENvbnRhaW5zIGludmVyc2UgdHJhbnNmb3JtYXRpb24gdXRpbGl0aWVzIGZvciB7QGxpbmsgQnl0ZVNvdXJjZX1zLgorICoKKyAqIFNlZSBCeXRlQ29tcGFyYWJsZS5tZCBmb3IgZGV0YWlscyBhYm91dCB0aGUgZW5jb2Rpbmcgc2NoZW1lLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQnl0ZVNvdXJjZUludmVyc2UKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5JVElBTF9CVUZGRVJfQ0FQQUNJVFkgPSAzMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQllURV9BTExfQklUUyA9IDB4RkY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfTk9fQklUUyA9IDB4MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVfU0lHTl9CSVQgPSAxIDw8IDc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNIT1JUX1NJR05fQklUID0gMSA8PCAxNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5UX1NJR05fQklUID0gMSA8PCAzMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIExPTkdfU0lHTl9CSVQgPSAxTCA8PCA2MzsKKworICAgIC8qKgorICAgICAqIENvbnN1bWUgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyBhbmQgcHJvZHVjZSBhIGxvbmcgZnJvbSB0aGVtLCBlZmZlY3RpdmVseSB0cmVhdGluZyB0aGUgYnl0ZXMgYXMgYSBiaWctZW5kaWFuCisgICAgICogdW5zaWduZWQgZW5jb2Rpbmcgb2YgdGhlIG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VW5zaWduZWRGaXhlZExlbmd0aEFzTG9uZyhCeXRlU291cmNlIGJ5dGVTb3VyY2UsIGludCBsZW5ndGgpCisgICAgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChieXRlU291cmNlKTsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50KGxlbmd0aCA+PSAxICYmIGxlbmd0aCA8PSA4LCAiQmV0d2VlbiAxIGFuZCA4IGJ5dGVzIGNhbiBiZSByZWFkIGF0IGEgdGltZSIpOworCisgICAgICAgIGxvbmcgcmVzdWx0ID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgOCkgfCBnZXRBbmRDaGVja0J5dGUoYnl0ZVNvdXJjZSwgaSwgbGVuZ3RoKTsgIC8vIG5vdGU6IHRoaXMgbXVzdCB1c2UgdGhlIHVuc2lnbmVkIGJ5dGUgdmFsdWUKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgdGhlIGJ5dGVzIGZvciBhbiBlbmNvZGVkIHNpZ25lZCBmaXhlZC1sZW5ndGggbnVtYmVyLgorICAgICAqIFRoZSBmaXJzdCBieXRlIGhhcyBpdHMgc2lnbiBiaXQgaW52ZXJ0ZWQsIGFuZCB0aGUgcmVzdCBhcmUgcGFzc2VkIHVuY2hhbmdlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxWPiBWIGdldFNpZ25lZEZpeGVkTGVuZ3RoKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGJ5dGVTb3VyY2UpOworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQobGVuZ3RoID49IDEsICJBdCBsZWFzdCAxIGJ5dGUgc2hvdWxkIGJlIHJlYWQiKTsKKworICAgICAgICBWIHJlc3VsdCA9IGFjY2Vzc29yLmFsbG9jYXRlKGxlbmd0aCk7CisgICAgICAgIC8vIFRoZSBmaXJzdCBieXRlIG5lZWRzIHRvIGhhdmUgaXRzIHNpZ24gZmxpcHBlZAorICAgICAgICBhY2Nlc3Nvci5wdXRCeXRlKHJlc3VsdCwgMCwgKGJ5dGUpIChnZXRBbmRDaGVja0J5dGUoYnl0ZVNvdXJjZSwgMCwgbGVuZ3RoKSBeIEJZVEVfU0lHTl9CSVQpKTsKKyAgICAgICAgLy8gYW5kIHRoZSByZXN0IGNhbiBiZSByZXRyaWV2ZWQgdW5jaGFuZ2VkLgorICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICAgICAgYWNjZXNzb3IucHV0Qnl0ZShyZXN1bHQsIGksIChieXRlKSBnZXRBbmRDaGVja0J5dGUoYnl0ZVNvdXJjZSwgaSwgbGVuZ3RoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvZHVjZSB0aGUgYnl0ZXMgZm9yIGFuIGVuY29kZWQgc2lnbmVkIGZpeGVkLWxlbmd0aCBudW1iZXIsIGFsc28gdHJhbnNsYXRpbmcgbnVsbCB0byBlbXB0eSBidWZmZXIuCisgICAgICogVGhlIGZpcnN0IGJ5dGUgaGFzIGl0cyBzaWduIGJpdCBpbnZlcnRlZCwgYW5kIHRoZSByZXN0IGFyZSBwYXNzZWQgdW5jaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFY+IFYgZ2V0T3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aChWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yLCBCeXRlU291cmNlIGJ5dGVTb3VyY2UsIGludCBsZW5ndGgpCisgICAgeworICAgICAgICByZXR1cm4gYnl0ZVNvdXJjZSA9PSBudWxsID8gYWNjZXNzb3IuZW1wdHkoKSA6IGdldFNpZ25lZEZpeGVkTGVuZ3RoKGFjY2Vzc29yLCBieXRlU291cmNlLCBsZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgdGhlIGJ5dGVzIGZvciBhbiBlbmNvZGVkIHNpZ25lZCBmaXhlZC1sZW5ndGggZmxvYXRpbmctcG9pbnQgbnVtYmVyLgorICAgICAqIElmIHNpZ24gYml0IGlzIG9uLCByZXR1cm5zIG5lZ2F0ZWQgYnl0ZXMuIElmIG5vdCwgY2xlYXJzIHRoZSBzaWduIGJpdCBhbmQgcGFzc2VzIHRoZSByZXN0IG9mIHRoZSBieXRlcyB1bmNoYW5nZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8Vj4gViBnZXRTaWduZWRGaXhlZExlbmd0aEZsb2F0KFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGJ5dGVTb3VyY2UpOworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQobGVuZ3RoID49IDEsICJBdCBsZWFzdCAxIGJ5dGUgc2hvdWxkIGJlIHJlYWQiKTsKKworICAgICAgICBWIHJlc3VsdCA9IGFjY2Vzc29yLmFsbG9jYXRlKGxlbmd0aCk7CisKKyAgICAgICAgaW50IHhvcjsKKyAgICAgICAgaW50IGZpcnN0ID0gZ2V0QW5kQ2hlY2tCeXRlKGJ5dGVTb3VyY2UsIDAsIGxlbmd0aCk7CisgICAgICAgIGlmIChmaXJzdCA8IDB4ODApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5lZ2F0aXZlIG51bWJlci4gSW52ZXJ0IGFsbCBiaXRzLgorICAgICAgICAgICAgeG9yID0gQllURV9BTExfQklUUzsKKyAgICAgICAgICAgIGZpcnN0IF49IHhvcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFBvc2l0aXZlIG51bWJlci4gSW52ZXJ0IG9ubHkgdGhlIHNpZ24gYml0LgorICAgICAgICAgICAgeG9yID0gQllURV9OT19CSVRTOworICAgICAgICAgICAgZmlyc3QgXj0gQllURV9TSUdOX0JJVDsKKyAgICAgICAgfQorICAgICAgICBhY2Nlc3Nvci5wdXRCeXRlKHJlc3VsdCwgMCwgKGJ5dGUpIGZpcnN0KTsKKworICAgICAgICAvLyB4b3IgaXMgbm93IGFwcGxpZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIGJ5dGVzIHRvIGZsaXAgdGhlaXIgYml0cyBpZiBuZWNlc3NhcnkuCisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpCisgICAgICAgICAgICBhY2Nlc3Nvci5wdXRCeXRlKHJlc3VsdCwgaSwgKGJ5dGUpIChnZXRBbmRDaGVja0J5dGUoYnl0ZVNvdXJjZSwgaSwgbGVuZ3RoKSBeIHhvcikpOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvZHVjZSB0aGUgYnl0ZXMgZm9yIGFuIGVuY29kZWQgc2lnbmVkIGZpeGVkLWxlbmd0aCBmbG9hdGluZy1wb2ludCBudW1iZXIsIGFsc28gdHJhbnNsYXRpbmcgbnVsbCB0byBhbiBlbXB0eQorICAgICAqIGJ1ZmZlci4KKyAgICAgKiBJZiBzaWduIGJpdCBpcyBvbiwgcmV0dXJucyBuZWdhdGVkIGJ5dGVzLiBJZiBub3QsIGNsZWFycyB0aGUgc2lnbiBiaXQgYW5kIHBhc3NlcyB0aGUgcmVzdCBvZiB0aGUgYnl0ZXMgdW5jaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFY+IFYgZ2V0T3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aEZsb2F0KFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBieXRlU291cmNlID09IG51bGwgPyBhY2Nlc3Nvci5lbXB0eSgpIDogZ2V0U2lnbmVkRml4ZWRMZW5ndGhGbG9hdChhY2Nlc3NvciwgYnl0ZVNvdXJjZSwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdW1lIHRoZSBuZXh0IGxlbmd0aCBieXRlcyBmcm9tIHRoZSBzb3VyY2UgdW5jaGFuZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFY+IFYgZ2V0Rml4ZWRMZW5ndGgoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwgQnl0ZVNvdXJjZSBieXRlU291cmNlLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoYnl0ZVNvdXJjZSk7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudChsZW5ndGggPj0gMSwgIkF0IGxlYXN0IDEgYnl0ZSBzaG91bGQgYmUgcmVhZCIpOworCisgICAgICAgIFYgcmVzdWx0ID0gYWNjZXNzb3IuYWxsb2NhdGUobGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgICAgIGFjY2Vzc29yLnB1dEJ5dGUocmVzdWx0LCBpLCAoYnl0ZSkgZ2V0QW5kQ2hlY2tCeXRlKGJ5dGVTb3VyY2UsIGksIGxlbmd0aCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN1bWUgdGhlIG5leHQgbGVuZ3RoIGJ5dGVzIGZyb20gdGhlIHNvdXJjZSB1bmNoYW5nZWQsIGFsc28gdHJhbnNsYXRpbmcgbnVsbCB0byBhbiBlbXB0eSBidWZmZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8Vj4gViBnZXRPcHRpb25hbEZpeGVkTGVuZ3RoKFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSwgaW50IGxlbmd0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBieXRlU291cmNlID09IG51bGwgPyBhY2Nlc3Nvci5lbXB0eSgpIDogZ2V0Rml4ZWRMZW5ndGgoYWNjZXNzb3IsIGJ5dGVTb3VyY2UsIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZSB0aGUgbmV4dCB7QGNvZGUgaW50fSBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBnaXZlbiB7QGxpbmsgQnl0ZVNvdXJjZX0uIFRoZSBzb3VyY2UgcG9zaXRpb24gaXMKKyAgICAgKiBtb2RpZmllZCBhY2NvcmRpbmdseSAobW92ZWQgNCBieXRlcyBmb3J3YXJkKS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgc291cmNlIGlzIG5vdCBzdHJpY3RseSByZXF1aXJlZCB0byByZXByZXNlbnQganVzdCB0aGUgZW5jb2Rpbmcgb2YgYW4ge0Bjb2RlIGludH0gdmFsdWUsIHNvIHRoZW9yZXRpY2FsbHkKKyAgICAgKiB0aGlzIEFQSSBjb3VsZCBiZSB1c2VkIGZvciByZWFkaW5nIGRhdGEgaW4gNC1ieXRlIHN0cmlkZXMuIE5ldmVydGhlbGVzcyBpdHMgdXNhZ2UgaXMgZmFpcmx5IGxpbWl0ZWQgYmVjYXVzZToKKyAgICAgKiA8b2w+CisgICAgICogICAgIDxsaT4uLi5pdCBwcmVzdXBwb3NlcyBzaWduZWQgZml4ZWQtbGVuZ3RoIGVuY29kaW5nIGZvciB0aGUgZW5jb2Rpbmcgb2YgdGhlIG9yaWdpbmFsIHZhbHVlPC9saT4KKyAgICAgKiAgICAgPGxpPi4uLml0IGRlY29kZXMgdGhlIGRhdGEgcmV0dXJuZWQgb24gZWFjaCBzdHJpZGUgYXMgYW4ge0Bjb2RlIGludH0gKGkuZS4gaXQgaW52ZXJ0cyBpdHMgbGVhZGluZyBiaXQpPC9saT4KKyAgICAgKiAgICAgPGxpPi4uLml0IGRvZXNuJ3QgcHJvdmlkZSBhbnkgbWVhbmluZ2Z1bCBndWFyYW50ZWVzICh3aXRoIHJlZ2FyZCB0byB0aHJvd2luZykgaW4gY2FzZSB0aGVyZSBhcmUgbm90IGVub3VnaAorICAgICAqICAgICBieXRlcyB0byByZWFkLCBpbiBjYXNlIGEgc3BlY2lhbCBlc2NhcGUgdmFsdWUgd2FzIG5vdCBpbnRlcnByZXRlZCBhcyBzdWNoLCBldGMuPC9saT4KKyAgICAgKiA8L29sPgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlU291cmNlIEEgbm9uLW51bGwgYnl0ZSBzb3VyY2UsIGNvbnRhaW5pbmcgYXQgbGVhc3QgNCBieXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRTaWduZWRJbnQoQnl0ZVNvdXJjZSBieXRlU291cmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChpbnQpIGdldFVuc2lnbmVkRml4ZWRMZW5ndGhBc0xvbmcoYnl0ZVNvdXJjZSwgNCkgXiBJTlRfU0lHTl9CSVQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3VtZSB0aGUgbmV4dCB7QGNvZGUgbG9uZ30gZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgZ2l2ZW4ge0BsaW5rIEJ5dGVTb3VyY2V9LiBUaGUgc291cmNlIHBvc2l0aW9uIGlzCisgICAgICogbW9kaWZpZWQgYWNjb3JkaW5nbHkgKG1vdmVkIDggYnl0ZXMgZm9yd2FyZCkuCisgICAgICogPHA+CisgICAgICogVGhlIHNvdXJjZSBpcyBub3Qgc3RyaWN0bHkgcmVxdWlyZWQgdG8gcmVwcmVzZW50IGp1c3QgdGhlIGVuY29kaW5nIG9mIGEge0Bjb2RlIGxvbmd9IHZhbHVlLCBzbyB0aGVvcmV0aWNhbGx5CisgICAgICogdGhpcyBBUEkgY291bGQgYmUgdXNlZCBmb3IgcmVhZGluZyBkYXRhIGluIDgtYnl0ZSBzdHJpZGVzLiBOZXZlcnRoZWxlc3MgaXRzIHVzYWdlIGlzIGZhaXJseSBsaW1pdGVkIGJlY2F1c2U6CisgICAgICogPG9sPgorICAgICAqICAgICA8bGk+Li4uaXQgcHJlc3VwcG9zZXMgc2lnbmVkIGZpeGVkLWxlbmd0aCBlbmNvZGluZyBmb3IgdGhlIGVuY29kaW5nIG9mIHRoZSBvcmlnaW5hbCB2YWx1ZTwvbGk+CisgICAgICogICAgIDxsaT4uLi5pdCBkZWNvZGVzIHRoZSBkYXRhIHJldHVybmVkIG9uIGVhY2ggc3RyaWRlIGFzIGEge0Bjb2RlIGxvbmd9IChpLmUuIGl0IGludmVydHMgaXRzIGxlYWRpbmcgYml0KTwvbGk+CisgICAgICogICAgIDxsaT4uLi5pdCBkb2Vzbid0IHByb3ZpZGUgYW55IG1lYW5pbmdmdWwgZ3VhcmFudGVlcyAod2l0aCByZWdhcmQgdG8gdGhyb3dpbmcpIGluIGNhc2UgdGhlcmUgYXJlIG5vdCBlbm91Z2gKKyAgICAgKiAgICAgYnl0ZXMgdG8gcmVhZCwgaW4gY2FzZSBhIHNwZWNpYWwgZXNjYXBlIHZhbHVlIHdhcyBub3QgaW50ZXJwcmV0ZWQgYXMgc3VjaCwgZXRjLjwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYnl0ZVNvdXJjZSBBIG5vbi1udWxsIGJ5dGUgc291cmNlLCBjb250YWluaW5nIGF0IGxlYXN0IDggYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBsb25nIGdldFNpZ25lZExvbmcoQnl0ZVNvdXJjZSBieXRlU291cmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldFVuc2lnbmVkRml4ZWRMZW5ndGhBc0xvbmcoYnl0ZVNvdXJjZSwgOCkgXiBMT05HX1NJR05fQklUOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiB7QGxpbmsgQnl0ZVNvdXJjZX0gdG8gYSB7QGNvZGUgYnl0ZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnl0ZVNvdXJjZSBBIG5vbi1udWxsIGJ5dGUgc291cmNlLCBjb250YWluaW5nIGF0IGxlYXN0IDEgYnl0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGUgZ2V0U2lnbmVkQnl0ZShCeXRlU291cmNlIGJ5dGVTb3VyY2UpCisgICAgeworICAgICAgICByZXR1cm4gKGJ5dGUpIChnZXRBbmRDaGVja0J5dGUoUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoYnl0ZVNvdXJjZSksIDAsIDEpIF4gQllURV9TSUdOX0JJVCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhlIGdpdmVuIHtAbGluayBCeXRlU291cmNlfSB0byBhIHtAY29kZSBzaG9ydH0uIEFsbCB0ZXJtcyBhbmQgY29uZGl0aW9ucyB2YWxpZCBmb3IKKyAgICAgKiB7QGxpbmsgI2dldFNpZ25lZEludChCeXRlU291cmNlKX0gYW5kIHtAbGluayAjZ2V0U2lnbmVkTG9uZyhCeXRlU291cmNlKX0gdHJhbnNsYXRlIHRvIHRoaXMgYXMgd2VsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlU291cmNlIEEgbm9uLW51bGwgYnl0ZSBzb3VyY2UsIGNvbnRhaW5pbmcgYXQgbGVhc3QgMiBieXRlcy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFNpZ25lZEludChCeXRlU291cmNlKQorICAgICAqIEBzZWUgI2dldFNpZ25lZExvbmcoQnl0ZVNvdXJjZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHNob3J0IGdldFNpZ25lZFNob3J0KEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSkKKyAgICB7CisgICAgICAgIHJldHVybiAoc2hvcnQpIChnZXRVbnNpZ25lZEZpeGVkTGVuZ3RoQXNMb25nKGJ5dGVTb3VyY2UsIDIpIF4gU0hPUlRfU0lHTl9CSVQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZSBhIHZhcmlhYmxlLWxlbmd0aCBzaWduZWQgaW50ZWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VmFyaWFibGVMZW5ndGhJbnRlZ2VyKEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSkKKyAgICB7CisgICAgICAgIGludCBzaWduQW5kTWFzayA9IGdldEFuZENoZWNrQnl0ZShieXRlU291cmNlKTsKKworICAgICAgICBsb25nIHN1bSA9IDA7CisgICAgICAgIGludCBieXRlczsKKyAgICAgICAgLy8gRm9yIGV2ZXJ5IGJpdCBhZnRlciB0aGUgc2lnbiB0aGF0IG1hdGNoZXMgdGhlIHNpZ24sIHJlYWQgb25lIG1vcmUgYnl0ZS4KKyAgICAgICAgZm9yIChieXRlcyA9IDA7IGJ5dGVzIDwgNyAmJiBzYW1lQnl0ZVNpZ24oc2lnbkFuZE1hc2sgPDwgKGJ5dGVzICsgMSksIHNpZ25BbmRNYXNrKTsgKytieXRlcykKKyAgICAgICAgICAgIHN1bSA9IChzdW0gPDwgOCkgfCBnZXRBbmRDaGVja0J5dGUoYnl0ZVNvdXJjZSk7CisKKyAgICAgICAgLy8gVGhlIGVpZ2h0aCBsZW5ndGggYml0IGlzIHN0b3JlZCBpbiB0aGUgc2Vjb25kIGJ5dGUuCisgICAgICAgIGlmIChieXRlcyA9PSA3ICYmIHNhbWVCeXRlU2lnbigoaW50KSAoc3VtID4+IDQ4KSwgc2lnbkFuZE1hc2spKQorICAgICAgICAgICAgcmV0dXJuICgoc3VtIDw8IDgpIHwgZ2V0QW5kQ2hlY2tCeXRlKGJ5dGVTb3VyY2UpKSBeIExPTkdfU0lHTl9CSVQ7ICAgIC8vIDktYnl0ZSBlbmNvZGluZywgdXNlIGJ5dGVzIDItOSB3aXRoIGludmVydGVkIHNpZ24KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdW0gfD0gKCgobG9uZykgc2lnbkFuZE1hc2spIDw8IGJ5dGVzICogOCk7ICAgICAvLyBhZGQgdGhlIHJlc3Qgb2YgdGhlIGJpdHMKKyAgICAgICAgICAgIGxvbmcgc2lnbk1hc2sgPSAtMHg0MEwgPDwgYnl0ZXMgKiA3OyAgICAgICAgICAgIC8vIG1hc2sgb2YgdGhlIGJpdHMgdGhhdCBzaG91bGQgYmUgcmVwbGFjZWQgYnkgdGhlIHNpZ24KKyAgICAgICAgICAgIGxvbmcgc2lnbiA9IChieXRlKSAoc2lnbkFuZE1hc2sgXiAweDgwKSA+PiA3OyAgIC8vIC0xIGlmIG5lZ2F0aXZlICgwIGxlYWRpbmcgYml0KSwgMCBvdGhlcndpc2UKKyAgICAgICAgICAgIHJldHVybiBzdW0gJiB+c2lnbk1hc2sgfCBzaWduICYgc2lnbk1hc2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGUgYSB2YXJpYWJsZS1sZW5ndGggdW5zaWduZWQgaW50ZWdlciwgcGFzc2luZyBhbGwgYnl0ZXMgcmVhZCB0aHJvdWdoIFhPUiB3aXRoIHRoZSBnaXZlbiB4b3JXaXRoIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIFVzZWQgaW4gQmlnSW50ZWdlciBlbmNvZGluZyB0byByZWFkIG51bWJlciBsZW5ndGgsIHdoZXJlIG5lZ2F0aXZlIG51bWJlcnMgaGF2ZSB0aGVpciBsZW5ndGggbmVnYXRlZAorICAgICAqIChpLmUuIHhvcldpdGggPSAweEZGKSB0byBlbnN1cmUgY29ycmVjdCBvcmRlcmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VmFyaWFibGVMZW5ndGhVbnNpZ25lZEludGVnZXJYb3JpbmcoQnl0ZVNvdXJjZSBieXRlU291cmNlLCBpbnQgeG9yV2l0aCkKKyAgICB7CisgICAgICAgIGludCBzaWduQW5kTWFzayA9IGdldEFuZENoZWNrQnl0ZShieXRlU291cmNlKSBeIHhvcldpdGg7CisKKyAgICAgICAgbG9uZyBzdW0gPSAwOworICAgICAgICBpbnQgYnl0ZXM7CisgICAgICAgIC8vIFJlYWQgYW4gZXh0cmEgYnl0ZSB3aGlsZSB0aGUgbmV4dCBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyAxLgorICAgICAgICBmb3IgKGJ5dGVzID0gMDsgYnl0ZXMgPD0gNyAmJiAoKHNpZ25BbmRNYXNrIDw8IGJ5dGVzKSAmIDB4ODApICE9IDA7ICsrYnl0ZXMpCisgICAgICAgICAgICBzdW0gPSAoc3VtIDw8IDgpIHwgZ2V0QW5kQ2hlY2tCeXRlKGJ5dGVTb3VyY2UpIF4geG9yV2l0aDsKKworICAgICAgICAvLyBTdHJpcCB0aGUgbGVuZ3RoIGJpdHMgZnJvbSB0aGUgbGVhZGluZyBieXRlLgorICAgICAgICBzaWduQW5kTWFzayAmPSB+KC0yNTYgPj4gYnl0ZXMpOworICAgICAgICByZXR1cm4gc3VtIHwgKCgobG9uZykgc2lnbkFuZE1hc2spIDw8IGJ5dGVzICogOCk7ICAgICAvLyBBZGQgdGhlIHJlc3Qgb2YgdGhlIGJpdHMgb2YgdGhlIGxlYWRpbmcgYnl0ZS4KKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gcGFyYW1ldGVycyB0cmVhdGVkIGFzIGJ5dGVzIGhhdmUgdGhlIHNhbWUgc2lnbi4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNhbWVCeXRlU2lnbihpbnQgYSwgaW50IGIpCisgICAgeworICAgICAgICByZXR1cm4gKChhIF4gYikgJiAweDgwKSA9PSAwOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEFuZENoZWNrQnl0ZShCeXRlU291cmNlIGJ5dGVTb3VyY2UpCisgICAgeworICAgICAgICByZXR1cm4gZ2V0QW5kQ2hlY2tCeXRlKGJ5dGVTb3VyY2UsIC0xLCAtMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEFuZENoZWNrQnl0ZShCeXRlU291cmNlIGJ5dGVTb3VyY2UsIGludCBwb3MsIGludCBsZW5ndGgpCisgICAgeworICAgICAgICBpbnQgZGF0YSA9IGJ5dGVTb3VyY2UubmV4dCgpOworICAgICAgICBpZiAoZGF0YSA9PSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIGxlbmd0aCA+IDAgPyBTdHJpbmcuZm9ybWF0KCJVbmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0gcmVhY2hlZCBhZnRlciAlZCBieXRlcyAoZXhwZWN0ZWQgPj0gJWQpIiwgcG9zLCBsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJVbmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0iKTsKKyAgICAgICAgYXNzZXJ0IGRhdGEgPj0gQllURV9OT19CSVRTICYmIGRhdGEgPD0gQllURV9BTExfQklUUworICAgICAgICAgICAgOiAiQSBCeXRlU291cmNlIG11c3QgcHJvZHVjZSB1bnNpZ25lZCBieXRlcyBhbmQgZW5kIGluIEVORF9PRl9TVFJFQU0iOworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIHNpbmdsZSB2YXJpYWJsZS1sZW5ndGggYnl0ZSBzZXF1ZW5jZSAoYmxvYiwgc3RyaW5nLCAuLi4pIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBzY2hlbWUgZGVzY3JpYmVkCisgICAgICogaW4gQnl0ZUNvbXBhcmFibGUubWQsIGRlY29kaW5nIGl0IGJhY2sgdG8gaXRzIG9yaWdpbmFsLCB1bmVzY2FwZWQgZm9ybS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlU291cmNlIFRoZSBzb3VyY2Ugb2YgdGhlIHZhcmlhYmxlLWxlbmd0aCBieXRlcyBzZXF1ZW5jZS4KKyAgICAgKiBAcmV0dXJuIEEgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBvcmlnaW5hbCwgdW5lc2NhcGVkIGJ5dGVzIG9mIHRoZSBnaXZlbiBzb3VyY2UuIFVuZXNjYXBlZCBoZXJlIG1lYW5zCisgICAgICogbm90IGluY2x1ZGluZyBhbnkgb2YgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgb2YgdGhlIGVuY29kaW5nIHNjaGVtZSB1c2VkIGZvciB2YXJpYWJsZS1sZW5ndGggYnl0ZSBzZXF1ZW5jZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0VW5lc2NhcGVkQnl0ZXMoQnl0ZVNvdXJjZS5QZWVrYWJsZSBieXRlU291cmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGJ5dGVTb3VyY2UgPT0gbnVsbCA/IG51bGwgOiByZWFkQnl0ZXModW5lc2NhcGUoYnl0ZVNvdXJjZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzIGFib3ZlLCBidXQgY29udmVydHMgdGhlIHJlc3VsdCB0byBhIEJ5dGVTb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCeXRlU291cmNlIHVuZXNjYXBlKEJ5dGVTb3VyY2UuUGVla2FibGUgYnl0ZVNvdXJjZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQnl0ZVNvdXJjZSgpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZXNjYXBlZCA9IGZhbHNlOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFlc2NhcGVkKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRhdGEgPSBieXRlU291cmNlLm5leHQoKTsgLy8gd2UgY29uc3VtZSB0aGlzIGJ5dGUgbm8gbWF0dGVyIHdoYXQgaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgPiBCeXRlU291cmNlLkVTQ0FQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOyAgICAgICAgLy8gbW9zdCB1c2VkIHBhdGggbGVhZHMgaGVyZQorCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBkYXRhICE9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSA6ICJJbnZhbGlkIGVzY2FwZWQgYnl0ZSBzZXF1ZW5jZSI7CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludCBuZXh0ID0gYnl0ZVNvdXJjZS5wZWVrKCk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChuZXh0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBFTkRfT0ZfU1RSRUFNOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGVuZCBvZiBhIGJ5dGUtY29tcGFyYWJsZSBvdXRzaWRlIG9mIGEgbXVsdGktY29tcG9uZW50IHNlcXVlbmNlLiBObyBtYXR0ZXIgd2hhdCB3ZSBoYXZlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWVuIG9yIHBlZWtlZCBiZWZvcmUsIHdlIHNob3VsZCBzdG9wIG5vdy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVTb3VyY2UubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRVNDQVBFRF8wX0RPTkU6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZW5kIG9mIDEgb3IgbW9yZSBjb25zZWN1dGl2ZSAweDAwIHZhbHVlIGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVNvdXJjZS5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVNDQVBFOworICAgICAgICAgICAgICAgICAgICBjYXNlIEVTQ0FQRURfMF9DT05UOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXNjYXBlZCBzZXF1ZW5jZSBjb250aW51ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVTb3VyY2UubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVTQ0FQRTsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuIEVTQ0FQRSBvciBFU0NBUEVEXzBfQ09OVCB3b24ndCBiZSBmb2xsb3dlZCBieSBlaXRoZXIgYW5vdGhlciBFU0NBUEVEXzBfQ09OVCwgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVTQ0FQRURfMF9ET05FLCBvciBhbiBFTkRfT0ZfU1RSRUFNIG9ubHkgd2hlbiB0aGUgYnl0ZS1jb21wYXJhYmxlIGlzIHBhcnQgb2YgYSBtdWx0aS1jb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcXVlbmNlIGFuZCB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZW5jb2RlZCBieXRlLWNvbXBhcmFibGUuIEluIHRoaXMgY2FzZSwgdGhlIGJ5dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUganVzdCBwZWVrZWQgaXMgdGhlIHNlcGFyYXRvciBvciB0ZXJtaW5hdG9yIGJ5dGUgYmV0d2VlbiBvciBhdCB0aGUgZW5kIG9mIGNvbXBvbmVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aGljaCBieSBjb250YWN0IG11c3QgYmUgMHgxMCAtIDB4RkUsIHdoaWNoIGNhbm5vdCBjb25mbGljdCB3aXRoIG91ciBzcGVjaWFsIGJ5dGVzKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBuZXh0ID49IEJ5dGVTb3VyY2UuTUlOX1NFUEFSQVRPUiAmJiBuZXh0IDw9IEJ5dGVTb3VyY2UuTUFYX1NFUEFSQVRPUiA6IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbmxpa2UgYWJvdmUsIHdlIGRvbid0IGNvbnN1bWUgdGhpcyBieXRlICh0aGUgc2VxdWVuY2UgZGVjb2RpbmcgbmVlZHMgaXQpLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBieXRlcyBvZiB0aGUgZ2l2ZW4gc291cmNlIGludG8gYSBieXRlIGFycmF5LiBEb2Vzbid0IGRvIGFueSB0cmFuc2Zvcm1hdGlvbiBvbiB0aGUgYnl0ZXMsIGp1c3QgcmVhZHMKKyAgICAgKiB0aGVtIHVudGlsIGl0IHJlYWRzIGFuIHtAbGluayBCeXRlU291cmNlI0VORF9PRl9TVFJFQU19IGJ5dGUsIGFmdGVyIHdoaWNoIGl0IHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSByZWFkCisgICAgICogYnl0ZXMsIDxzdHJvbmc+ZXhjbHVkaW5nIHRoZSB7QGxpbmsgQnl0ZVNvdXJjZSNFTkRfT0ZfU1RSRUFNfTwvc3Ryb25nPi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBzaXplcyBhIHRlbnRhdGl2ZSBpbnRlcm5hbCBidWZmZXIgYXJyYXkgYXQge0Bjb2RlIGluaXRpYWxCdWZmZXJDYXBhY2l0eX0uICBIb3dldmVyLCBpZgorICAgICAqIHtAY29kZSBieXRlU291cmNlfSBleGNlZWRzIHRoaXMgc2l6ZSwgdGhlIGJ1ZmZlciBhcnJheSBpcyByZWNyZWF0ZWQgd2l0aCBkb3VibGVkIGNhcGFjaXR5IGFzIG1hbnkgdGltZXMgYXMKKyAgICAgKiBuZWNlc3NhcnkuICBJZiwgYWZ0ZXIge0Bjb2RlIGJ5dGVTb3VyY2V9IGlzIGZ1bGx5IGV4aGF1c3RlZCwgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gaXQgZG9lcyBub3QgZXhhY3RseQorICAgICAqIG1hdGNoIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHRlbnRhdGl2ZSBidWZmZXIgYXJyYXksIHRoZW4gaXQgaXMgY29waWVkIGludG8gYW5vdGhlciBhcnJheSBzaXplZCB0byBmaXQgdGhlCisgICAgICogbnVtYmVyIG9mIGJ5dGVzIHJlYWQ7IG90aGVyd2lzZSwgaXQgaXMgcmV0dXJuZWQgd2l0aG91dCB0aGF0IGZpbmFsIGNvcHkgc3RlcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlU291cmNlIFRoZSBzb3VyY2Ugd2hpY2ggYnl0ZXMgd2UncmUgaW50ZXJlc3RlZCBpbi4KKyAgICAgKiBAcGFyYW0gaW5pdGlhbEJ1ZmZlckNhcGFjaXR5IFRoZSBpbml0aWFsIHNpemUgb2YgdGhlIGludGVybmFsIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIEEgYnl0ZSBhcnJheSBjb250YWluaW5nIGV4YWN0bHkgYWxsIHRoZSByZWFkIGJ5dGVzLiBJbiBjYXNlIG9mIGEge0Bjb2RlIG51bGx9IHNvdXJjZSwgdGhlIHJldHVybmVkIGJ5dGUKKyAgICAgKiBhcnJheSB3aWxsIGJlIGVtcHR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHJlYWRCeXRlcyhCeXRlU291cmNlIGJ5dGVTb3VyY2UsIGZpbmFsIGludCBpbml0aWFsQnVmZmVyQ2FwYWNpdHkpCisgICAgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChieXRlU291cmNlKTsKKworICAgICAgICBpbnQgcmVhZEJ5dGVzID0gMDsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2luaXRpYWxCdWZmZXJDYXBhY2l0eV07CisgICAgICAgIGludCBkYXRhOworICAgICAgICB3aGlsZSAoKGRhdGEgPSBieXRlU291cmNlLm5leHQoKSkgIT0gQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNKQorICAgICAgICB7CisgICAgICAgICAgICBidWYgPSBlbnN1cmVDYXBhY2l0eShidWYsIHJlYWRCeXRlcyk7CisgICAgICAgICAgICBidWZbcmVhZEJ5dGVzKytdID0gKGJ5dGUpIGRhdGE7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVhZEJ5dGVzICE9IGJ1Zi5sZW5ndGgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZiA9IEFycmF5cy5jb3B5T2YoYnVmLCByZWFkQnl0ZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgdGhlIGJ5dGVzIG9mIHRoZSBnaXZlbiBzb3VyY2UgaW50byBhIGJ5dGUgYXJyYXkuIERvZXNuJ3QgZG8gYW55IHRyYW5zZm9ybWF0aW9uIG9uIHRoZSBieXRlcywganVzdCByZWFkcworICAgICAqIHRoZW0gdW50aWwgaXQgcmVhZHMgYW4ge0BsaW5rIEJ5dGVTb3VyY2UjRU5EX09GX1NUUkVBTX0gYnl0ZSwgYWZ0ZXIgd2hpY2ggaXQgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIHJlYWQKKyAgICAgKiBieXRlcywgPHN0cm9uZz5leGNsdWRpbmcgdGhlIHtAbGluayBCeXRlU291cmNlI0VORF9PRl9TVFJFQU19PC9zdHJvbmc+LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byB7QGxpbmsgI3JlYWRCeXRlcyhCeXRlU291cmNlLCBpbnQpfSB3aGVyZSB0aGUgc2Vjb25kIGFjdHVhbCBwYXJhbWV0ZXIgaXMKKyAgICAgKiB7QGxpbmtwbGFpbiAjSU5JVElBTF9CVUZGRVJfQ0FQQUNJVFl9ICh7QHZhbHVlIElOSVRJQUxfQlVGRkVSX0NBUEFDSVRZfSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnl0ZVNvdXJjZSBUaGUgc291cmNlIHdoaWNoIGJ5dGVzIHdlJ3JlIGludGVyZXN0ZWQgaW4uCisgICAgICogQHJldHVybiBBIGJ5dGUgYXJyYXkgY29udGFpbmluZyBleGFjdGx5IGFsbCB0aGUgcmVhZCBieXRlcy4gSW4gY2FzZSBvZiBhIHtAY29kZSBudWxsfSBzb3VyY2UsIHRoZSByZXR1cm5lZCBieXRlCisgICAgICogYXJyYXkgd2lsbCBiZSBlbXB0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkQnl0ZXMoQnl0ZVNvdXJjZSBieXRlU291cmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlYWRCeXRlcyhieXRlU291cmNlLCBJTklUSUFMX0JVRkZFUl9DQVBBQ0lUWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGUgZ2l2ZW4gYnVmZmVyIGhhcyBjYXBhY2l0eSBmb3IgdGFraW5nIGRhdGEgd2l0aCB0aGUgZ2l2ZW4gbGVuZ3RoIC0gaWYgaXQgZG9lc24ndCwgaXQgcmV0dXJucyBhIGNvcHkKKyAgICAgKiBvZiB0aGUgYnVmZmVyLCBidXQgd2l0aCBkb3VibGUgdGhlIGNhcGFjaXR5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJ5dGVbXSBlbnN1cmVDYXBhY2l0eShieXRlW10gYnVmLCBpbnQgZGF0YUxlbmd0aEluQnl0ZXMpCisgICAgeworICAgICAgICBpZiAoZGF0YUxlbmd0aEluQnl0ZXMgPT0gYnVmLmxlbmd0aCkKKyAgICAgICAgICAgIC8vIFdlIHdvbid0IGdhaW4gbXVjaCB3aXRoIGd1YXJkaW5nIGFnYWluc3Qgb3ZlcmZsb3cuIFdlJ2xsIG92ZXJmbG93IHdoZW4gZGF0YUxlbmd0aEluQnl0ZXMgPj0gMSA8PCAzMCwKKyAgICAgICAgICAgIC8vIGFuZCBpZiB3ZSBkbyBndWFyZCwgd2UnbGwgYmUgYWJsZSB0byBleHRlbmQgdGhlIGNhcGFjaXR5IHRvIEludGVnZXIuTUFYX1ZBTFVFICh3aGljaCBpcyAxIDw8IDMxIC0gMSkuCisgICAgICAgICAgICAvLyBDb250cm9sbGluZyB0aGUgZXhjZXB0aW9uIHRoYXQgd2lsbCBiZSB0aHJvd24gc2hvdWxkbid0IG1hdHRlciB0aGF0IG11Y2gsIGFuZCAgaW4gcHJhY3RpY2UsIHdlIGFsbW9zdAorICAgICAgICAgICAgLy8gc3VyZWx5IHdvbid0IGJlIHJlYWRpbmcgZ2lnYWJ5dGVzIG9mIEJ5dGVTb3VyY2UgZGF0YSBhdCBvbmNlLgorICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2YoYnVmLCBkYXRhTGVuZ3RoSW5CeXRlcyAqIDIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoZSBnaXZlbiB7QGxpbmsgQnl0ZVNvdXJjZX0gdG8gYSBVVEYtOCB7QGxpbmsgU3RyaW5nfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlU291cmNlIFRoZSBzb3VyY2Ugd2UncmUgaW50ZXJlc3RlZCBpbi4KKyAgICAgKiBAcmV0dXJuIEEgVVRGLTggc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoQnl0ZVNvdXJjZS5QZWVrYWJsZSBieXRlU291cmNlKQorICAgIHsKKyAgICAgICAgaWYgKGJ5dGVTb3VyY2UgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgIGJ5dGVbXSBkYXRhID0gZ2V0VW5lc2NhcGVkQnl0ZXMoYnl0ZVNvdXJjZSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoZGF0YSwgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBNdWx0aS1jb21wb25lbnQgc2VxdWVuY2UgdXRpbGl0aWVzLgorICAgICAqLworCisgICAgLyoqCisgICAgICogQSB1dGlsaXR5IGZvciBjb25zdW1pbmcgY29tcG9uZW50cyBmcm9tIGEgcGVla2FibGUgbXVsdGktY29tcG9uZW50IHNlcXVlbmNlLgorICAgICAqIEl0IHVzZXMgdGhlIGNvbXBvbmVudCBzZXBhcmF0b3JzLCBzbyB0aGUgZ2l2ZW4gc2VxdWVuY2UgbmVlZHMgdG8gaGF2ZSBpdHMgbGFzdCBjb21wb25lbnQgZnVsbHkgY29uc3VtZWQsIGluCisgICAgICogb3JkZXIgZm9yIHRoZSBuZXh0IGNvbnN1bWFibGUgYnl0ZSB0byBiZSBhIHNlcGFyYXRvci4gSWRlbnRpZnlpbmcgdGhlIGVuZCBvZiB0aGUgY29tcG9uZW50IHRoYXQgd2lsbCB0aGVuIGJlCisgICAgICogY29uc3VtZWQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjb25zdW1lciAodGhlIHVzZXIgb2YgdGhpcyBtZXRob2QpLgorICAgICAqIEBwYXJhbSBzb3VyY2UgQSBwZWVrYWJsZSBtdWx0aS1jb21wb25lbnQgc2VxdWVuY2UsIHdoaWNoIG5leHQgYnl0ZSBpcyBhIGNvbXBvbmVudCBzZXBhcmF0b3IuCisgICAgICogQHJldHVybiB0aGUgZ2l2ZW4gbXVsdGktY29tcG9uZW50IHNlcXVlbmNlIGlmIGl0cyBuZXh0IGNvbXBvbmVudCBpcyBub3QgbnVsbCwgb3Ige0Bjb2RlIG51bGx9IGlmIGl0IGlzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVNvdXJjZS5QZWVrYWJsZSBuZXh0Q29tcG9uZW50U291cmNlKEJ5dGVTb3VyY2UuUGVla2FibGUgc291cmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5leHRDb21wb25lbnRTb3VyY2Uoc291cmNlLCBzb3VyY2UubmV4dCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHV0aWxpdHkgZm9yIGNvbnN1bWluZyBjb21wb25lbnRzIGZyb20gYSBwZWVrYWJsZSBtdWx0aS1jb21wb25lbnQgc2VxdWVuY2UsIHZlcnkgc2ltaWxhciB0bworICAgICAqIHtAbGluayAjbmV4dENvbXBvbmVudFNvdXJjZShCeXRlU291cmNlLlBlZWthYmxlKX0gLSB0aGUgZGlmZmVyZW5jZSBiZWluZyB0aGF0IGhlcmUgdGhlIHNlcGFyYXRvciBjYW4gYmUgcGFzc2VkCisgICAgICogaW4gY2FzZSBpdCBoYWQgdG8gYmUgY29uc3VtZWQgYmVmb3JlaGFuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVTb3VyY2UuUGVla2FibGUgbmV4dENvbXBvbmVudFNvdXJjZShCeXRlU291cmNlLlBlZWthYmxlIHNvdXJjZSwgaW50IHNlcGFyYXRvcikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXh0Q29tcG9uZW50TnVsbChzZXBhcmF0b3IpCisgICAgICAgICAgICAgICA/IG51bGwKKyAgICAgICAgICAgICAgIDogc291cmNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBuZXh0Q29tcG9uZW50TnVsbChpbnQgc2VwYXJhdG9yKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNlcGFyYXRvciA9PSBCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5UX05VTEwgfHwgc2VwYXJhdG9yID09IEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlRfRU1QVFkKKyAgICAgICAgICAgICAgIHx8IHNlcGFyYXRvciA9PSBCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5UX0VNUFRZX1JFVkVSU0VEOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvQWJzdHJhY3RGdXR1cmUuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvQWJzdHJhY3RGdXR1cmUuamF2YQppbmRleCA4M2NkN2QzLi4wMDIwZTFhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L0Fic3RyYWN0RnV0dXJlLmphdmEKKysrIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9BYnN0cmFjdEZ1dHVyZS5qYXZhCkBAIC00OTQsMTEgKzQ5NCwxMSBAQAogICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQogICAgIHsKICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24oKTsKLSAgICAgICAgU3RyaW5nIHN0YXRlID0gc3RhdGUoKTsKKyAgICAgICAgU3RyaW5nIHN0YXRlID0gc3RhdGVJbmZvKCk7CiAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbiA9PSBudWxsID8gc3RhdGUgOiAoc3RhdGUgKyAnICcgKyBkZXNjcmlwdGlvbik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGUoKQorICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlSW5mbygpCiAgICAgewogICAgICAgICBPYmplY3QgcmVzdWx0ID0gdGhpcy5yZXN1bHQ7CiAgICAgICAgIGlmIChpc1N1Y2Nlc3MocmVzdWx0KSkKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvTGlnaHR3ZWlnaHRSZWN5Y2xlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9MaWdodHdlaWdodFJlY3ljbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmMGQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvTGlnaHR3ZWlnaHRSZWN5Y2xlci5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheURlcXVlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworCitpbnRlcmZhY2UgTGlnaHR3ZWlnaHRSZWN5Y2xlclBvb2xIb2xkZXI8VD4KK3sKKyAgICBBcnJheURlcXVlPFQ+IGdldCgpOworfQorCisvKioKKyAqIEEgc2ltcGxlIHRocmVhZCBsb2NhbCBvYmplY3QgcmV1c2UgZmFjaWxpdHkgd2l0aCBsaW1pdGVkIGNhcGFjaXR5IGFuZCBubyBhdHRlbXB0IGF0IHJlYmFsYW5jaW5nIHBvb2xpbmcgYmV0d2VlbgorICogdGhyZWFkcy4gVGhpcyBpcyBtZWFudCB0byBiZSBwdXQgaW4gcGxhY2Ugd2hlcmUgY2h1cm4gaXMgaGlnaCwgYnV0IHNpbmdsZSBvYmplY3QgYWxsb2NhdGlvbiBhbmQgZm9vdHByaW50IGFyZSBub3QKKyAqIHNvIGhpZ2ggdG8ganVzdGlmeSBhIG1vcmUgc29waGlzdGljYXRlZCBhcHByb2FjaC4KKyAqCisgKiBAcGFyYW0gPFQ+CisgKiBAc2VlIFRocmVhZExvY2FscyNjcmVhdGVMaWdodHdlaWdodFJlY3ljbGVyKGludCkKKyAqLworcHVibGljIGludGVyZmFjZSBMaWdodHdlaWdodFJlY3ljbGVyPFQ+IGV4dGVuZHMgTGlnaHR3ZWlnaHRSZWN5Y2xlclBvb2xIb2xkZXI8VD4KK3sKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgcmV1c2FibGUgaW5zdGFuY2UsIG9yIG51bGwgaWYgbm9uZSBpcyBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBkZWZhdWx0IFQgcmV1c2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldCgpLnBvbGxGaXJzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSByZXVzYWJsZSBpbnN0YW5jZSwgb3IgYWxsb2NhdGUgb25lIHZpYSB0aGUgcHJvdmlkZWQgc3VwcGxpZXIKKyAgICAgKi8KKyAgICBkZWZhdWx0IFQgcmV1c2VPckFsbG9jYXRlKFN1cHBsaWVyPFQ+IHN1cHBsaWVyKQorICAgIHsKKyAgICAgICAgZmluYWwgVCByZXVzZSA9IHJldXNlKCk7CisgICAgICAgIHJldHVybiByZXVzZSAhPSBudWxsID8gcmV1c2UgOiBzdXBwbGllci5nZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gdCB0byBiZSByZWN5Y2xlZCwgaWYgdCBpcyBhIGNvbGxlY3Rpb24gaXQgd2lsbCBiZSBjbGVhcmVkIGJlZm9yZSByZWN5Y2xpbmcsIGJ1dCBub3QgY2xlYXJlZCBpZiBub3QKKyAgICAgKiAgICAgICAgICByZWN5Y2xlZAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0IHdhcyByZWN5Y2xlZCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgZGVmYXVsdCBib29sZWFuIHRyeVJlY3ljbGUoVCB0KQorICAgIHsKKyAgICAgICAgT2JqZWN0cy5yZXF1aXJlTm9uTnVsbCh0KTsKKworICAgICAgICBmaW5hbCBBcnJheURlcXVlPFQ+IHBvb2wgPSBnZXQoKTsKKyAgICAgICAgaWYgKHBvb2wuc2l6ZSgpIDwgY2FwYWNpdHkoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKQorICAgICAgICAgICAgICAgICgoQ29sbGVjdGlvbjw/PikgdCkuY2xlYXIoKTsKKyAgICAgICAgICAgIHBvb2wub2ZmZXJGaXJzdCh0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBjdXJyZW50IGNvdW50IG9mIGF2YWlsYWJsZSBpbnN0YW5jZXMgZm9yIHJldXNlCisgICAgICovCisgICAgZGVmYXVsdCBpbnQgYXZhaWxhYmxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZXQoKS5zaXplKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIG1heGltdW0gY2FwYWNpdHkgb2YgdGhlIHJlY3ljbGVyCisgICAgICovCisgICAgaW50IGNhcGFjaXR5KCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9SZWYuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvUmVmLmphdmEKaW5kZXggOTA2NTBjZi4uMWUyN2RjNyAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9SZWYuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1JlZi5qYXZhCkBAIC01NSw2ICs1NSw3IEBACiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvckZhY3RvcnkuR2xvYmFsLmV4ZWN1dG9yRmFjdG9yeTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5JbmZpbml0ZUxvb3BFeGVjdXRvci5TaW11bGF0b3JTYWZlLlVOU0FGRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0RFQlVHX1JFRl9DT1VOVDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkLlNjb3BlLlNJTVVMQVRJT047CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXMubWF5YmVGYWlsOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzLm1lcmdlOwpAQCAtOTMsNyArOTQsNyBAQAogcHVibGljIGZpbmFsIGNsYXNzIFJlZjxUPiBpbXBsZW1lbnRzIFJlZkNvdW50ZWQ8VD4KIHsKICAgICBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlZi5jbGFzcyk7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0VOQUJMRUQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5kZWJ1Z3JlZmNvdW50IiwgImZhbHNlIikuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19FTkFCTEVEID0gVEVTVF9ERUJVR19SRUZfQ09VTlQuZ2V0Qm9vbGVhbigpOwogICAgIHN0YXRpYyBPbkxlYWsgT05fTEVBSzsKIAogICAgIEBTaGFyZWQoc2NvcGUgPSBTSU1VTEFUSU9OKQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9SZWZzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1JlZnMuamF2YQppbmRleCBlNWQ5YzM3Li5mYjYwNjdlIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1JlZnMuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1JlZnMuamF2YQpAQCAtMjAsOCArMjAsMTMgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50OwogCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuRnVuY3Rpb247CkBAIC0yMDQsNyArMjA5LDcgQEAKICAgICAvKioKICAgICAgKiBBY3F1aXJlIGEgcmVmZXJlbmNlIHRvIGFsbCBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0cywgb3Igbm9uZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBSZWZDb3VudGVkPFQ+PiBSZWZzPFQ+IHRyeVJlZihJdGVyYWJsZTxUPiByZWZlcmVuY2UpCisgICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIFJlZkNvdW50ZWQ8VD4+IFJlZnM8VD4gdHJ5UmVmKEl0ZXJhYmxlPD8gZXh0ZW5kcyBUPiByZWZlcmVuY2UpCiAgICAgewogICAgICAgICBIYXNoTWFwPFQsIFJlZjxUPj4gcmVmcyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgZm9yIChUIHJjIDogcmVmZXJlbmNlKQpAQCAtMjIwLDcgKzIyNSw3IEBACiAgICAgICAgIHJldHVybiBuZXcgUmVmczxUPihyZWZzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgUmVmQ291bnRlZDxUPj4gUmVmczxUPiByZWYoSXRlcmFibGU8VD4gcmVmZXJlbmNlKQorICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBSZWZDb3VudGVkPFQ+PiBSZWZzPFQ+IHJlZihJdGVyYWJsZTw/IGV4dGVuZHMgVD4gcmVmZXJlbmNlKQogICAgIHsKICAgICAgICAgUmVmczxUPiByZWZzID0gdHJ5UmVmKHJlZmVyZW5jZSk7CiAgICAgICAgIGlmIChyZWZzICE9IG51bGwpCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1NoYXJlZENsb3NlYWJsZS5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9TaGFyZWRDbG9zZWFibGUuamF2YQppbmRleCBkNjQzZDFkLi4yNDNlOTRhIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1NoYXJlZENsb3NlYWJsZS5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvU2hhcmVkQ2xvc2VhYmxlLmphdmEKQEAgLTM0LDQgKzM0LDEyIEBACiAgICAgcHVibGljIFRocm93YWJsZSBjbG9zZShUaHJvd2FibGUgYWNjdW11bGF0ZSk7CiAKICAgICBwdWJsaWMgdm9pZCBhZGRUbyhSZWYuSWRlbnRpdHlDb2xsZWN0aW9uIGlkZW50aXRpZXMpOwotfQorCisgICAgc3RhdGljIDxUIGV4dGVuZHMgU2hhcmVkQ2xvc2VhYmxlPiBUIHNoYXJlZENvcHlPck51bGwoVCBzaGFyZWRDbG9zZWFibGUpCisgICAgeworICAgICAgICBpZiAoc2hhcmVkQ2xvc2VhYmxlICE9IG51bGwpCisgICAgICAgICAgICByZXR1cm4gKFQpIHNoYXJlZENsb3NlYWJsZS5zaGFyZWRDb3B5KCk7CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvVGhyZWFkTG9jYWxzLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1RocmVhZExvY2Fscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OGJhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1RocmVhZExvY2Fscy5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheURlcXVlOworCitpbXBvcnQgaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZhc3RUaHJlYWRMb2NhbDsKKworcHVibGljIGZpbmFsIGNsYXNzIFRocmVhZExvY2FscworeworICAgIHByaXZhdGUgVGhyZWFkTG9jYWxzKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gTGlnaHR3ZWlnaHRSZWN5Y2xlcjxUPiBjcmVhdGVMaWdodHdlaWdodFJlY3ljbGVyKGludCBsaW1pdCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRmFzdFRocmVhZExvY2FsTGlnaHR3ZWlnaHRSZWN5Y2xlcjw+KGxpbWl0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHtAbGluayBMaWdodHdlaWdodFJlY3ljbGVyfSB3aGljaCBpcyBiYWNrZWQgYnkgYSB7QGxpbmsgRmFzdFRocmVhZExvY2FsfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBGYXN0VGhyZWFkTG9jYWxMaWdodHdlaWdodFJlY3ljbGVyPFQ+IGV4dGVuZHMgRmFzdFRocmVhZExvY2FsPEFycmF5RGVxdWU8VD4+IGltcGxlbWVudHMgTGlnaHR3ZWlnaHRSZWN5Y2xlcjxUPgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY2FwYWNpdHk7CisKKyAgICAgICAgcHVibGljIEZhc3RUaHJlYWRMb2NhbExpZ2h0d2VpZ2h0UmVjeWNsZXIoaW50IGNhcGFjaXR5KQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgdGhpcy5jYXBhY2l0eSA9IGNhcGFjaXR5OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIEFycmF5RGVxdWU8VD4gaW5pdGlhbFZhbHVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheURlcXVlPD4oY2FwYWNpdHkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gbWF4aW11bSBjYXBhY2l0eSBvZiB0aGUgcmVjeWNsZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgY2FwYWNpdHkoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gY2FwYWNpdHk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbG9nZ2luZy9Mb2diYWNrTG9nZ2luZ1N1cHBvcnQuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2xvZ2dpbmcvTG9nYmFja0xvZ2dpbmdTdXBwb3J0LmphdmEKaW5kZXggZWRhOTE1My4uZTcxMGQ0NCAxMDA2NDQKLS0tIGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbG9nZ2luZy9Mb2diYWNrTG9nZ2luZ1N1cHBvcnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9sb2dnaW5nL0xvZ2JhY2tMb2dnaW5nU3VwcG9ydC5qYXZhCkBAIC0yMCw4ICsyMCwxMSBAQAogCiBpbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwogCiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5KTVg7CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOwpAQCAtNTcsNiArNjAsOCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uU3RhcnR1cCgpCiAgICAgeworICAgICAgICBjaGVja09ubHlPbmVWaXJ0dWFsVGFibGVBcHBlbmRlcigpOworCiAgICAgICAgIC8vIFRoZSBkZWZhdWx0IGxvZ2JhY2sgY29uZmlndXJhdGlvbiBpbiBjb25mL2xvZ2JhY2sueG1sIGFsbG93cyByZWxvYWRpbmcgdGhlCiAgICAgICAgIC8vIGNvbmZpZ3VyYXRpb24gd2hlbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGhhcyBjaGFuZ2VkIChldmVyeSA2MCBzZWNvbmRzIGJ5IGRlZmF1bHQpLgogICAgICAgICAvLyBUaGlzIHJlcXVpcmVzIGxvZ2JhY2sgdG8gdXNlIGZpbGUgSS9PIEFQSXMuIEJ1dCBmaWxlIEkvTyBpcyBub3QgYWxsb3dlZCBmcm9tIFVERnMuCkBAIC0xMzIsNiArMTM3LDQ2IEBACiAgICAgICAgIHJldHVybiBsb2dMZXZlbE1hcHM7CiAgICAgfQogCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9wdGlvbmFsPEFwcGVuZGVyPD8+PiBnZXRBcHBlbmRlcihDbGFzczw/PiBhcHBlbmRlckNsYXNzLCBTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIExvZ2dlckNvbnRleHQgbGMgPSAoTG9nZ2VyQ29udGV4dCkgTG9nZ2VyRmFjdG9yeS5nZXRJTG9nZ2VyRmFjdG9yeSgpOworICAgICAgICBmb3IgKExvZ2dlciBsb2dCYWNrTG9nZ2VyIDogbGMuZ2V0TG9nZ2VyTGlzdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPEFwcGVuZGVyPElMb2dnaW5nRXZlbnQ+PiBpdGVyYXRvciA9IGxvZ0JhY2tMb2dnZXIuaXRlcmF0b3JGb3JBcHBlbmRlcnMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBcHBlbmRlcjxJTG9nZ2luZ0V2ZW50PiBhcHBlbmRlciA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXBwZW5kZXIuZ2V0Q2xhc3MoKSA9PSBhcHBlbmRlckNsYXNzICYmIGFwcGVuZGVyLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPcHRpb25hbC5vZihhcHBlbmRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gT3B0aW9uYWwuZW1wdHkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tPbmx5T25lVmlydHVhbFRhYmxlQXBwZW5kZXIoKQorICAgIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgTG9nZ2VyQ29udGV4dCBsYyA9IChMb2dnZXJDb250ZXh0KSBMb2dnZXJGYWN0b3J5LmdldElMb2dnZXJGYWN0b3J5KCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiB2aXJ0dWFsQXBwZW5kZXJOYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKExvZ2dlciBsb2dCYWNrTG9nZ2VyIDogbGMuZ2V0TG9nZ2VyTGlzdCgpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKEl0ZXJhdG9yPEFwcGVuZGVyPElMb2dnaW5nRXZlbnQ+PiBpdGVyYXRvciA9IGxvZ0JhY2tMb2dnZXIuaXRlcmF0b3JGb3JBcHBlbmRlcnMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBcHBlbmRlcjw/PiBhcHBlbmRlciA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXBwZW5kZXIgaW5zdGFuY2VvZiBWaXJ0dWFsVGFibGVBcHBlbmRlcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZpcnR1YWxBcHBlbmRlck5hbWVzLmFkZChhcHBlbmRlci5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb3VudCA+IDEpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlRoZXJlIGFyZSBtdWx0aXBsZSBhcHBlbmRlcnMgb2YgY2xhc3MgJXMgb2YgbmFtZXMgJXMuIFRoZXJlIGlzIG9ubHkgb25lIGFwcGVuZGVyIG9mIHN1Y2ggY2xhc3MgYWxsb3dlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnR1YWxUYWJsZUFwcGVuZGVyLmNsYXNzLmdldE5hbWUoKSwgU3RyaW5nLmpvaW4oIiwiLCB2aXJ0dWFsQXBwZW5kZXJOYW1lcykpKTsKKyAgICB9CisKICAgICBwcml2YXRlIGJvb2xlYW4gaGFzQXBwZW5kZXJzKExvZ2dlciBsb2dCYWNrTG9nZ2VyKQogICAgIHsKICAgICAgICAgSXRlcmF0b3I8QXBwZW5kZXI8SUxvZ2dpbmdFdmVudD4+IGl0ID0gbG9nQmFja0xvZ2dlci5pdGVyYXRvckZvckFwcGVuZGVycygpOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbG9nZ2luZy9Mb2dnaW5nU3VwcG9ydC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbG9nZ2luZy9Mb2dnaW5nU3VwcG9ydC5qYXZhCmluZGV4IDhlYTgzYmUuLjM1ZTExOTcgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2xvZ2dpbmcvTG9nZ2luZ1N1cHBvcnQuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9sb2dnaW5nL0xvZ2dpbmdTdXBwb3J0LmphdmEKQEAgLTE5LDYgKzE5LDkgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubG9nZ2luZzsKIAogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgY2gucW9zLmxvZ2JhY2suY29yZS5BcHBlbmRlcjsKIAogLyoqCiAgKiBDb21tb24gYWJzdHJhY3Rpb24gb2YgZnVuY3Rpb25hbGl0eSB3aGljaCBjYW4gYmUgaW1wbGVtZW50ZWQgZm9yIGRpZmZlcmVudCBsb2dnaW5nIGJhY2tlbmQgaW1wbGVtZW50YXRpb25zIChzbGY0aiBiaW5kaW5ncykuCkBAIC00OSw0ICs1Miw5IEBACiAgICAgICogQHJldHVybiBhIG1hcCBvZiBsb2dnZXIgbmFtZXMgYW5kIHRoZWlyIGFzc29jaWF0ZWQgbG9nIGxldmVsIGFzIHN0cmluZyByZXByZXNlbnRhdGlvbnMuCiAgICAgICovCiAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRMb2dnaW5nTGV2ZWxzKCk7CisKKyAgICBkZWZhdWx0IE9wdGlvbmFsPEFwcGVuZGVyPD8+PiBnZXRBcHBlbmRlcihDbGFzczw/PiBhcHBlbmRlckNsYXNzLCBTdHJpbmcgYXBwZW5kZXJOYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLmVtcHR5KCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbG9nZ2luZy9WaXJ0dWFsVGFibGVBcHBlbmRlci5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbG9nZ2luZy9WaXJ0dWFsVGFibGVBcHBlbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MjBiMjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9sb2dnaW5nL1ZpcnR1YWxUYWJsZUFwcGVuZGVyLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubG9nZ2luZzsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CisKK2ltcG9ydCBjaC5xb3MubG9nYmFjay5jbGFzc2ljLnNwaS5Mb2dnaW5nRXZlbnQ7CitpbXBvcnQgY2gucW9zLmxvZ2JhY2suY29yZS5BcHBlbmRlckJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXVkaXQuRmlsZUF1ZGl0TG9nZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuTG9nTWVzc2FnZXNUYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLlZpcnR1YWxLZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLlZpcnR1YWxLZXlzcGFjZVJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuVmlydHVhbFRhYmxlOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuTG9nTWVzc2FnZXNUYWJsZS5MT0dTX1ZJUlRVQUxfVEFCTEVfREVGQVVMVF9ST1dTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLkxvZ01lc3NhZ2VzVGFibGUuVEFCTEVfTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50cy5WSVJUVUFMX1ZJRVdTOworCisvKioKKyAqIEFwcGVuZHMgQ2Fzc2FuZHJhIGxvZ3MgdG8gdmlydHVhbCB0YWJsZSBzeXN0ZW1fdmlld3Muc3lzdGVtX2xvZ3MKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZpcnR1YWxUYWJsZUFwcGVuZGVyIGV4dGVuZHMgQXBwZW5kZXJCYXNlPExvZ2dpbmdFdmVudD4KK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBFTkRFUl9OQU1FID0gIkNRTExPRyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBmb3JiaWRkZW5Mb2dnZXJzID0gSW1tdXRhYmxlU2V0Lm9mKEZpbGVBdWRpdExvZ2dlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBMb2dNZXNzYWdlc1RhYmxlIGxvZ3M7CisKKyAgICAvLyBmb3IgaG9sZGluZyBtZXNzYWdlcyB1bnRpbCB2aXJ0dWFsIHJlZ2lzdHJ5IGNvbnRhaW5zIGxvZ3MgdmlydHVhbCB0YWJsZQorICAgIC8vIGFzIGl0IHRha2VzIHNvbWUgdGltZSBkdXJpbmcgc3RhcnR1cCBvZiBhIG5vZGUgdG8gaW5pdGlhbGlzZSB2aXJ0dWFsIHRhYmxlcyBidXQgbWVzc2FnZXMgYXJlCisgICAgLy8gbG9nZ2VkIGFscmVhZHkKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8TG9nZ2luZ0V2ZW50PiBtZXNzYWdlQnVmZmVyID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYXBwZW5kKExvZ2dpbmdFdmVudCBldmVudE9iamVjdCkKKyAgICB7CisgICAgICAgIGlmICghZm9yYmlkZGVuTG9nZ2Vycy5jb250YWlucyhldmVudE9iamVjdC5nZXRMb2dnZXJOYW1lKCkpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobG9ncyA9PSBudWxsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ3MgPSBnZXRWaXJ0dWFsVGFibGUoKTsKKyAgICAgICAgICAgICAgICBpZiAobG9ncyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBhZGRUb0J1ZmZlcihldmVudE9iamVjdCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBsb2dzLmFkZChldmVudE9iamVjdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbG9ncy5hZGQoZXZlbnRPYmplY3QpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcCgpCisgICAgeworICAgICAgICBtZXNzYWdlQnVmZmVyLmNsZWFyKCk7CisgICAgICAgIHN1cGVyLnN0b3AoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGbHVzaGVzIGFsbCBsb2dzIHdoaWNoIHdlcmUgYXBwZW5kZWQgYmVmb3JlIHZpcnR1YWwgdGFibGUgd2FzIHJlZ2lzdGVyZWQuCisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2Fzc2FuZHJhRGFlbW9uI3NldHVwVmlydHVhbEtleXNwYWNlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZsdXNoQnVmZmVyKCkKKyAgICB7CisgICAgICAgIE9wdGlvbmFsLm9mTnVsbGFibGUoZ2V0VmlydHVhbFRhYmxlKCkpLmlmUHJlc2VudCh2dGFibGUgLT4geworICAgICAgICAgICAgbWVzc2FnZUJ1ZmZlci5mb3JFYWNoKHZ0YWJsZTo6YWRkKTsKKyAgICAgICAgICAgIG1lc3NhZ2VCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMb2dNZXNzYWdlc1RhYmxlIGdldFZpcnR1YWxUYWJsZSgpCisgICAgeworICAgICAgICBWaXJ0dWFsS2V5c3BhY2Uga2V5c3BhY2UgPSBWaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeS5pbnN0YW5jZS5nZXRLZXlzcGFjZU51bGxhYmxlKFZJUlRVQUxfVklFV1MpOworCisgICAgICAgIGlmIChrZXlzcGFjZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgT3B0aW9uYWw8VmlydHVhbFRhYmxlPiBsb2dzVGFibGUgPSBrZXlzcGFjZS50YWJsZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHZ0IC0+IHZ0Lm5hbWUoKS5lcXVhbHMoVEFCTEVfTkFNRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCk7CisKKyAgICAgICAgaWYgKCFsb2dzVGFibGUuaXNQcmVzZW50KCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICBWaXJ0dWFsVGFibGUgdnQgPSBsb2dzVGFibGUuZ2V0KCk7CisKKyAgICAgICAgaWYgKCEodnQgaW5zdGFuY2VvZiBMb2dNZXNzYWdlc1RhYmxlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiVmlydHVhbCB0YWJsZSAlcy4lcyBpcyBub3QgYmFja2VkIGJ5IGFuIGluc3RhbmNlIG9mICVzIGJ1dCBieSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVklSVFVBTF9WSUVXUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUJMRV9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ01lc3NhZ2VzVGFibGUuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7CisKKyAgICAgICAgcmV0dXJuIChMb2dNZXNzYWdlc1RhYmxlKSB2dDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkVG9CdWZmZXIoTG9nZ2luZ0V2ZW50IGV2ZW50T2JqZWN0KQorICAgIHsKKyAgICAgICAgLy8gd2UgcmVzdHJpY3QgaG93IG1hbnkgbG9nZ2luZyBldmVudHMgd2UgY2FuIHB1dCBpbnRvIGJ1ZmZlciwKKyAgICAgICAgLy8gc28gd2UgYXJlIG5vdCBncm93aW5nIHdpdGhvdXQgYW55IGJvdW5kIHdoZW4gdGhpbmdzIGdvIHNvdXRoCisgICAgICAgIGlmIChtZXNzYWdlQnVmZmVyLnNpemUoKSA8IExPR1NfVklSVFVBTF9UQUJMRV9ERUZBVUxUX1JPV1MpCisgICAgICAgICAgICBtZXNzYWdlQnVmZmVyLmFkZChldmVudE9iamVjdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbWVtb3J5L0Vuc3VyZU9uSGVhcC5qYXZhIGIvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbWVtb3J5L0Vuc3VyZU9uSGVhcC5qYXZhCmluZGV4IGQ2NmMwMmMuLjM0YjllYWEgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL21lbW9yeS9FbnN1cmVPbkhlYXAuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9tZW1vcnkvRW5zdXJlT25IZWFwLmphdmEKQEAgLTMyLDYgKzMyLDggQEAKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEVuc3VyZU9uSGVhcCBleHRlbmRzIFRyYW5zZm9ybWF0aW9uCiB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFbnN1cmVPbkhlYXAgTk9PUCA9IG5ldyBOb09wKCk7CisKICAgICBwdWJsaWMgYWJzdHJhY3QgRGVjb3JhdGVkS2V5IGFwcGx5VG9QYXJ0aXRpb25LZXkoRGVjb3JhdGVkS2V5IGtleSk7CiAgICAgcHVibGljIGFic3RyYWN0IFVuZmlsdGVyZWRSb3dJdGVyYXRvciBhcHBseVRvUGFydGl0aW9uKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBwYXJ0aXRpb24pOwogICAgIHB1YmxpYyBhYnN0cmFjdCBTZWFyY2hJdGVyYXRvcjxDbHVzdGVyaW5nPD8+LCBSb3c+IGFwcGx5VG9QYXJ0aXRpb24oU2VhcmNoSXRlcmF0b3I8Q2x1c3RlcmluZzw/PiwgUm93PiBwYXJ0aXRpb24pOwpkaWZmIC0tZ2l0IGEvc3JjL2phdmEvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvbWVtb3J5L0hlYXBQb29sLmphdmEgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9tZW1vcnkvSGVhcFBvb2wuamF2YQppbmRleCA1MzJkMTFmLi42NTk3MTVkIDEwMDY0NAotLS0gYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9tZW1vcnkvSGVhcFBvb2wuamF2YQorKysgYi9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9tZW1vcnkvSGVhcFBvb2wuamF2YQpAQCAtMzAsOCArMzAsNiBAQAogCiBwdWJsaWMgY2xhc3MgSGVhcFBvb2wgZXh0ZW5kcyBNZW10YWJsZVBvb2wKIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFbnN1cmVPbkhlYXAgRU5TVVJFX05PT1AgPSBuZXcgRW5zdXJlT25IZWFwLk5vT3AoKTsKLQogICAgIHB1YmxpYyBIZWFwUG9vbChsb25nIG1heE9uSGVhcE1lbW9yeSwgZmxvYXQgY2xlYW51cFRocmVzaG9sZCwgTWVtdGFibGVDbGVhbmVyIGNsZWFuZXIpCiAgICAgewogICAgICAgICBzdXBlcihtYXhPbkhlYXBNZW1vcnksIDAsIGNsZWFudXBUaHJlc2hvbGQsIGNsZWFuZXIpOwpAQCAtNTksNyArNTcsNyBAQAogCiAgICAgICAgIHB1YmxpYyBFbnN1cmVPbkhlYXAgZW5zdXJlT25IZWFwKCkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEVOU1VSRV9OT09QOworICAgICAgICAgICAgcmV0dXJuIEVuc3VyZU9uSGVhcC5OT09QOwogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIENsb25lciBjbG9uZXIoT3BPcmRlci5Hcm91cCBvcEdyb3VwKQpAQCAtMTI0LDcgKzEyMiw3IEBACiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBFbnN1cmVPbkhlYXAgZW5zdXJlT25IZWFwKCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRU5TVVJFX05PT1A7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVuc3VyZU9uSGVhcC5OT09QOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwdWJsaWMgQ2xvbmVyIGNsb25lcihPcE9yZGVyLkdyb3VwIG9wR3JvdXApCmRpZmYgLS1naXQgYS9zcmMvamF2YS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy92aW50L1ZJbnRDb2RpbmcuamF2YSBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL3ZpbnQvVkludENvZGluZy5qYXZhCmluZGV4IDg1NDNlNmYuLmMyNDU1YmIgMTAwNjQ0Ci0tLSBhL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL3ZpbnQvVkludENvZGluZy5qYXZhCisrKyBiL3NyYy9qYXZhL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL3ZpbnQvVkludENvZGluZy5qYXZhCkBAIC03Myw2ICs3MywyMSBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NJWkUgPSAxMDsKIAorICAgIC8qKgorICAgICAqIFRocm93IHdoZW4gYXR0ZW1wdGluZyB0byBkZWNvZGUgYSB2aW50IGFuZCB0aGUgb3V0cHV0IHR5cGUKKyAgICAgKiBkb2Vzbid0IGhhdmUgZW5vdWdoIHNwYWNlIHRvIGZpdCB0aGUgdmFsdWUgdGhhdCB3YXMgZGVjb2RlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVkludE91dE9mUmFuZ2VFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCisgICAgeworICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyB2YWx1ZTsKKworICAgICAgICBwcml2YXRlIFZJbnRPdXRPZlJhbmdlRXhjZXB0aW9uKGxvbmcgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHZhbHVlICsgIiBpcyBvdXQgb2YgcmFuZ2UgZm9yIGEgMzItYml0IGludGVnZXIiKTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyByZWFkVW5zaWduZWRWSW50KERhdGFJbnB1dCBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpbnQgZmlyc3RCeXRlID0gaW5wdXQucmVhZEJ5dGUoKTsKQEAgLTEwMSwxNCArMTE2LDI0IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmVhZCB1cCB0byBhIDMyLWJpdCBpbnRlZ2VyIGJhY2ssIHVzaW5nIHRoZSB1bnNpZ25lZCAobm8gemlnemFnKSBlbmNvZGluZy4KKyAgICAgKgogICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgYXMge0BsaW5rICNyZWFkVW5zaWduZWRWSW50KERhdGFJbnB1dCl9LAogICAgICAqIGV4Y2VwdCB0aGF0IHdlIGRvICpub3QqIGJsb2NrIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGJ5dGVzIGluIHRoZSBidWZmZXIKICAgICAgKiB0byByZWNvbnN0cnVjdCB0aGUgdmFsdWUuCiAgICAgICoKLSAgICAgKiBXQVJOSU5HOiB0aGlzIG1ldGhvZCBpcyBvbmx5IHNhZmUgZm9yIHZpbnRzIHdlIGtub3cgdG8gYmUgcmVwcmVzZW50YWJsZSBieSBhIHBvc2l0aXZlIGxvbmcgdmFsdWUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIC0xIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGJ5dGVzIGluIHRoZSBpbnB1dCB0byByZWFkIHRoZSB2YWx1ZTsgZWxzZSwgdGhlIHZpbnQgdW5zaWduZWQgdmFsdWUuCisgICAgICogQHRocm93cyBWSW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiBJZiB0aGUgdmludCBkb2Vzbid0IGZpdCBpbnRvIGEgMzItYml0IGludGVnZXIKICAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRVbnNpZ25lZFZJbnQzMihCeXRlQnVmZmVyIGlucHV0LCBpbnQgcmVhZGVySW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gY2hlY2tlZENhc3QoZ2V0VW5zaWduZWRWSW50KGlucHV0LCByZWFkZXJJbmRleCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFZJbnQzMihCeXRlQnVmZmVyIGlucHV0LCBpbnQgcmVhZGVySW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gY2hlY2tlZENhc3QoZGVjb2RlWmlnWmFnNjQoZ2V0VW5zaWduZWRWSW50KGlucHV0LCByZWFkZXJJbmRleCkpKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0VW5zaWduZWRWSW50KEJ5dGVCdWZmZXIgaW5wdXQsIGludCByZWFkZXJJbmRleCkKICAgICB7CiAgICAgICAgIHJldHVybiBnZXRVbnNpZ25lZFZJbnQoaW5wdXQsIHJlYWRlckluZGV4LCBpbnB1dC5saW1pdCgpKTsKQEAgLTE2NSw2ICsxOTAsMzIgQEAKICAgICAgICAgcmV0dXJuIGRlY29kZVppZ1phZzY0KHJlYWRVbnNpZ25lZFZJbnQoaW5wdXQpKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBSZWFkIHVwIHRvIGEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIGJhY2suCisgICAgICoKKyAgICAgKiBBc3N1bWVzIHRoZSB2aW50IHdhcyB3cml0dGVuIHVzaW5nIHtAbGluayAjd3JpdGVWSW50MzIoaW50LCBEYXRhT3V0cHV0UGx1cyl9IG9yIHNpbWlsYXIKKyAgICAgKiB0aGF0IHppZ3phZyBlbmNvZGVzIHRoZSBpbnRlZ2VyLgorICAgICAqCisgICAgICogQHRocm93cyBWSW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiBJZiB0aGUgdmludCBkb2Vzbid0IGZpdCBpbnRvIGEgMzItYml0IGludGVnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCByZWFkVkludDMyKERhdGFJbnB1dCBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gY2hlY2tlZENhc3QoZGVjb2RlWmlnWmFnNjQocmVhZFVuc2lnbmVkVkludChpbnB1dCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHVwIHRvIGEgMzItYml0IGludGVnZXIuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZSBvcmlnaW5hbCBpbnRlZ2VyIHdhcyB3cml0dGVuIHVzaW5nIHtAbGluayAjd3JpdGVVbnNpZ25lZFZJbnQzMihpbnQsIERhdGFPdXRwdXRQbHVzKX0KKyAgICAgKiBvciBzaW1pbGFyIHRoYXQgZG9lc24ndCB6aWd6YWcgZW5jb2RlcyB0aGUgdmludC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVkludE91dE9mUmFuZ2VFeGNlcHRpb24gSWYgdGhlIHZpbnQgZG9lc24ndCBmaXQgaW50byBhIDMyLWJpdCBpbnRlZ2VyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgcmVhZFVuc2lnbmVkVkludDMyKERhdGFJbnB1dCBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gY2hlY2tlZENhc3QocmVhZFVuc2lnbmVkVkludChpbnB1dCkpOworICAgIH0KKwogICAgIC8vICYgdGhpcyB3aXRoIHRoZSBmaXJzdCBieXRlIHRvIGdpdmUgdGhlIHZhbHVlIHBhcnQgZm9yIGEgZ2l2ZW4gZXh0cmFCeXRlc1RvUmVhZCBlbmNvZGVkIGluIHRoZSBieXRlCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZmlyc3RCeXRlVmFsdWVNYXNrKGludCBleHRyYUJ5dGVzVG9SZWFkKQogICAgIHsKQEAgLTE4Niw2ICsyMzcsMTIgQEAKICAgICAgICAgcmV0dXJuIEludGVnZXIubnVtYmVyT2ZMZWFkaW5nWmVyb3MofmZpcnN0Qnl0ZSkgLSAyNDsKICAgICB9CiAKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVVuc2lnbmVkVkludChpbnQgdmFsdWUsIERhdGFPdXRwdXRQbHVzIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVzZSB3cml0ZVVuc2lnbmVkVkludDMyL3JlYWRVbnNpZ25lZFZJbnQzMiIpOworICAgIH0KKwogICAgIEBJbmxpbmUKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVVbnNpZ25lZFZJbnQobG9uZyB2YWx1ZSwgRGF0YU91dHB1dFBsdXMgb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CkBAIC0yMDAsNyArMjU3LDcgQEAKICAgICAgICAgICAgIGludCBleHRyYUJ5dGVzID0gc2l6ZSAtIDE7CiAgICAgICAgICAgICBsb25nIG1hc2sgPSAobG9uZylWSW50Q29kaW5nLmVuY29kZUV4dHJhQnl0ZXNUb1JlYWQoZXh0cmFCeXRlcykgPDwgNTY7CiAgICAgICAgICAgICBsb25nIHJlZ2lzdGVyID0gKHZhbHVlIDw8IHNoaWZ0KSB8IG1hc2s7Ci0gICAgICAgICAgICBvdXRwdXQud3JpdGVCeXRlcyhyZWdpc3Rlciwgc2l6ZSk7CisgICAgICAgICAgICBvdXRwdXQud3JpdGVNb3N0U2lnbmlmaWNhbnRCeXRlcyhyZWdpc3Rlciwgc2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSBpZiAoc2l6ZSA9PSA5KQogICAgICAgICB7CkBAIC0yMTMsNiArMjcwLDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVVbnNpZ25lZFZJbnQzMihpbnQgdmFsdWUsIERhdGFPdXRwdXRQbHVzIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB3cml0ZVVuc2lnbmVkVkludCgobG9uZyl2YWx1ZSwgb3V0cHV0KTsKKyAgICB9CisKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVVuc2lnbmVkVkludChpbnQgdmFsdWUsIEJ5dGVCdWZmZXIgb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVXNlIHdyaXRlVW5zaWduZWRWSW50MzIvZ2V0VW5zaWduZWRWSW50MzIiKTsKKyAgICB9CisKICAgICBASW5saW5lCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVW5zaWduZWRWSW50KGxvbmcgdmFsdWUsIEJ5dGVCdWZmZXIgb3V0cHV0KQogICAgIHsKQEAgLTI1MSwxNyArMzE5LDQ3IEBACiAgICAgfQogCiAgICAgQElubGluZQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVVuc2lnbmVkVkludDMyKGludCB2YWx1ZSwgQnl0ZUJ1ZmZlciBvdXRwdXQpCisgICAgeworICAgICAgICB3cml0ZVVuc2lnbmVkVkludCgobG9uZyl2YWx1ZSwgb3V0cHV0KTsKKyAgICB9CisKKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVZJbnQoaW50IHZhbHVlLCBEYXRhT3V0cHV0UGx1cyBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVc2Ugd3JpdGVWSW50MzIvcmVhZFZJbnQzMiIpOworICAgIH0KKworICAgIEBJbmxpbmUKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVWSW50KGxvbmcgdmFsdWUsIERhdGFPdXRwdXRQbHVzIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICB3cml0ZVVuc2lnbmVkVkludChlbmNvZGVaaWdaYWc2NCh2YWx1ZSksIG91dHB1dCk7CiAgICAgfQogCiAgICAgQElubGluZQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVZJbnQobG9uZyB2YWx1ZSwgQnl0ZUJ1ZmZlciBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVZJbnQzMihpbnQgdmFsdWUsIERhdGFPdXRwdXRQbHVzIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB3cml0ZVZJbnQoKGxvbmcpdmFsdWUsIG91dHB1dCk7CisgICAgfQorCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVWSW50KGludCB2YWx1ZSwgQnl0ZUJ1ZmZlciBvdXRwdXQpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVzZSB3cml0ZVZJbnQzMi9nZXRWSW50MzIiKTsKKyAgICB9CisKKyAgICBASW5saW5lCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVkludChsb25nIHZhbHVlLCBCeXRlQnVmZmVyIG91dHB1dCkKICAgICB7CiAgICAgICAgIHdyaXRlVW5zaWduZWRWSW50KGVuY29kZVppZ1phZzY0KHZhbHVlKSwgb3V0cHV0KTsKICAgICB9CiAKKyAgICBASW5saW5lCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVkludDMyKGludCB2YWx1ZSwgQnl0ZUJ1ZmZlciBvdXRwdXQpCisgICAgeworICAgICAgICB3cml0ZVZJbnQoKGxvbmcpdmFsdWUsIG91dHB1dCk7CisgICAgfQorCiAgICAgLyoqCiAgICAgICogQHJldHVybiBhIFRFTVBPUkFSWSBUSFJFQUQgTE9DQUwgQlVGRkVSIGNvbnRhaW5pbmcgdGhlIGVuY29kZWQgYnl0ZXMgb2YgdGhlIHZhbHVlCiAgICAgICogVGhpcyBieXRlW10gbXVzdCBiZSBkaXNjYXJkZWQgYnkgdGhlIGNhbGxlciBpbW1lZGlhdGVseSwgYW5kIHN5bmNocm9ub3VzbHkKQEAgLTMyNiw0ICs0MjQsMTIgQEAKICAgICAgICAgLy8gdGhlIGZvcm11bGEgYmVsb3cgaXMgaGFuZC1waWNrZWQgdG8gbWF0Y2ggdGhlIG9yaWdpbmFsIDkgLSAoKG1hZ25pdHVkZSAtIDEpIC8gNykKICAgICAgICAgcmV0dXJuICg2MzkgLSBtYWduaXR1ZGUgKiA5KSA+PiA2OwogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNoZWNrZWRDYXN0KGxvbmcgdmFsdWUpCisgICAgeworICAgICAgICBpbnQgcmVzdWx0ID0gKGludCl2YWx1ZTsKKyAgICAgICAgaWYgKChsb25nKXJlc3VsdCAhPSB2YWx1ZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBWSW50T3V0T2ZSYW5nZUV4Y2VwdGlvbih2YWx1ZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0JEZhY3RvcnkgYi9zcmMvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQkRmFjdG9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTAzN2M1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0JEZhY3RvcnkKQEAgLTAsMCArMSwyIEBACitvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0JEJpZ0Zvcm1hdEZhY3RvcnkKK29yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5CdGlGb3JtYXQkQnRpRm9ybWF0RmFjdG9yeQpkaWZmIC0tZ2l0IGEvdGVzdC9hbnR0YXNrcy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hbnR0YXNrcy9KZGtQcm9wZXJ0aWVzLmphdmEgYi90ZXN0L2FudHRhc2tzL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2FudHRhc2tzL0pka1Byb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTVkMjAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9hbnR0YXNrcy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hbnR0YXNrcy9KZGtQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hbnR0YXNrczsKKworaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7CitpbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzazsKKworcHVibGljIGNsYXNzIEpka1Byb3BlcnRpZXMgZXh0ZW5kcyBUYXNrCit7CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKKyAgICB7CisgICAgICAgIFByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKKyAgICAgICAgcHJvamVjdC5zZXROZXdQcm9wZXJ0eSgiamF2YS52ZXJzaW9uLiIgKyBwcm9qZWN0LmdldFByb3BlcnR5KCJhbnQuamF2YS52ZXJzaW9uIikucmVwbGFjZSgiMS4iLCAiIiksICJ0cnVlIik7CisgICAgICAgIHByb2plY3Quc2V0TmV3UHJvcGVydHkoInVzZS1qZGsiICsgcHJvamVjdC5nZXRQcm9wZXJ0eSgiYW50LmphdmEudmVyc2lvbiIpLnJlcGxhY2UoIjEuIiwgIiIpLCAidHJ1ZSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvYnVybi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvTWVzc2FnZUdlbmVyYXRvci5qYXZhIGIvdGVzdC9idXJuL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdlR2VuZXJhdG9yLmphdmEKaW5kZXggNDNlYTE2ZS4uODBlNjQ3YyAxMDA2NDQKLS0tIGEvdGVzdC9idXJuL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdlR2VuZXJhdG9yLmphdmEKKysrIGIvdGVzdC9idXJuL29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdlR2VuZXJhdG9yLmphdmEKQEAgLTE0OSw3ICsxNDksNyBAQAogICAgIHsKICAgICAgICAgaW50IGxlbmd0aCA9IG1lc3NhZ2luZ1ZlcnNpb24gPCBWRVJTSU9OXzQwCiAgICAgICAgICAgICAgICAgICAgICA/IGluLnJlYWRJbnQoKQotICAgICAgICAgICAgICAgICAgICAgOiAoaW50KSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisgICAgICAgICAgICAgICAgICAgICA6IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOwogICAgICAgICBsb25nIGlkID0gaW4ucmVhZExvbmcoKTsKICAgICAgICAgaWYgKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpID09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKQogICAgICAgICAgICAgaWQgPSBMb25nLnJldmVyc2VCeXRlcyhpZCk7CkBAIC0xNjIsNyArMTYyLDcgQEAKICAgICAgICAgaWYgKG1lc3NhZ2luZ1ZlcnNpb24gPCBWRVJTSU9OXzQwKQogICAgICAgICAgICAgb3V0LndyaXRlSW50KHBheWxvYWQubGVuZ3RoKTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHBheWxvYWQubGVuZ3RoKTsKKyAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKHBheWxvYWQubGVuZ3RoKTsKICAgICB9CiAKICAgICBzdGF0aWMgbG9uZyBzZXJpYWxpemVkU2l6ZShieXRlW10gcGF5bG9hZCwgaW50IG1lc3NhZ2luZ1ZlcnNpb24pCmRpZmYgLS1naXQgYS90ZXN0L2J1cm4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1NpbXBsZUNsaWVudFBlcmZUZXN0LmphdmEgYi90ZXN0L2J1cm4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1NpbXBsZUNsaWVudFBlcmZUZXN0LmphdmEKaW5kZXggYTA1MDI0NS4uZTYwNDY5NyAxMDA2NDQKLS0tIGEvdGVzdC9idXJuL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9TaW1wbGVDbGllbnRQZXJmVGVzdC5qYXZhCisrKyBiL3Rlc3QvYnVybi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvU2ltcGxlQ2xpZW50UGVyZlRlc3QuamF2YQpAQCAtMzAsNyArMzAsNyBAQAogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5SYXRlTGltaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubWF0aC5zdGF0LmRlc2NyaXB0aXZlLkRlc2NyaXB0aXZlU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubWF0aDMuc3RhdC5kZXNjcmlwdGl2ZS5EZXNjcmlwdGl2ZVN0YXRpc3RpY3M7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpkaWZmIC0tZ2l0IGEvdGVzdC9idXJuL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0xvbmdCVHJlZVRlc3QuamF2YSBiL3Rlc3QvYnVybi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9Mb25nQlRyZWVUZXN0LmphdmEKaW5kZXggMDFiNDQ5My4uOWFhMTNmOSAxMDA2NDQKLS0tIGEvdGVzdC9idXJuL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0xvbmdCVHJlZVRlc3QuamF2YQorKysgYi90ZXN0L2J1cm4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvTG9uZ0JUcmVlVGVzdC5qYXZhCkBAIC01Miw2ICs1Miw3IEBACiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLnRyYW5zZm9ybTsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbXBhcmF0b3IubmF0dXJhbE9yZGVyOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29tcGFyYXRvci5yZXZlcnNlT3JkZXI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQlRSRUVfRkFOX0ZBQ1RPUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuQlRyZWUuaXRlcmFibGU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CkBAIC0xOTAsNyArMTkxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiB1cGRhdGUgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSW50ZWdlciBpIDogc2VsZWN0aW9uLnRlc3RLZXlzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnB1dChpLCBuZXcgSW50ZWdlcihpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUucHV0KGksIEludGVnZXIudmFsdWVPZihpKSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRpbmdGdW5jdGlvbiBmdW5jdGlvbiA9IG5ldyBDb3VudGluZ0Z1bmN0aW9uKCh4KSAtPiB4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gb3JpZ2luYWwgPSBzZWxlY3Rpb24udGVzdEFzU2V0LnRyZWUoKTsKQEAgLTIxMCw3ICsyMTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPEludGVnZXIsIEludGVnZXI+IHVwZGF0ZSA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJbnRlZ2VyIGkgOiBzZWxlY3Rpb24udGVzdEtleXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUucHV0KGksIG5ldyBJbnRlZ2VyKGkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZS5wdXQoaSwgSW50ZWdlci52YWx1ZU9mKGkpKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudGluZ0Z1bmN0aW9uIGZ1bmN0aW9uID0gbmV3IENvdW50aW5nRnVuY3Rpb24oKHgpIC0+IHVwZGF0ZS5nZXRPckRlZmF1bHQoeCwgeCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBvcmlnaW5hbCA9IHNlbGVjdGlvbi50ZXN0QXNTZXQudHJlZSgpOwpAQCAtMjMwLDcgKzIzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gdXBkYXRlID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEludGVnZXIgaSA6IHNlbGVjdGlvbi50ZXN0S2V5cykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZS5wdXQoaSwgbmV3IEludGVnZXIoaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnB1dChpLCBJbnRlZ2VyLnZhbHVlT2YoaSkpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50aW5nRnVuY3Rpb24gZnVuY3Rpb24gPSBuZXcgQ291bnRpbmdGdW5jdGlvbih1cGRhdGU6OmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIG9yaWdpbmFsID0gc2VsZWN0aW9uLnRlc3RBc1NldC50cmVlKCk7CkBAIC0yNDksNyArMjUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiB1cGRhdGUgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoSW50ZWdlciBpIDogc2VsZWN0aW9uLnRlc3RLZXlzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnB1dChpLCBuZXcgSW50ZWdlcihpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUucHV0KGksIEludGVnZXIudmFsdWVPZihpKSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRpbmdGdW5jdGlvbiBmdW5jdGlvbiA9IG5ldyBDb3VudGluZ0Z1bmN0aW9uKCh4KSAtPiB1cGRhdGUuY29udGFpbnNLZXkoeCkgPyBudWxsIDogeCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIG9yaWdpbmFsID0gc2VsZWN0aW9uLnRlc3RBc1NldC50cmVlKCk7CkBAIC0xMTM1LDcgKzExMzYsNyBAQAogICAgICAgICBmb3IgKFN0cmluZyBhcmcgOiBhcmdzKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoYXJnLnN0YXJ0c1dpdGgoImZhbj0iKSkKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5idHJlZS5mYW5mYWN0b3IiLCBhcmcuc3Vic3RyaW5nKDQpKTsKKyAgICAgICAgICAgICAgICBCVFJFRV9GQU5fRkFDVE9SLnNldFN0cmluZyhhcmcuc3Vic3RyaW5nKDQpKTsKICAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5zdGFydHNXaXRoKCJtaW49IikpCiAgICAgICAgICAgICAgICAgbWluVHJlZVNpemUgPSBJbnRlZ2VyLnBhcnNlSW50KGFyZy5zdWJzdHJpbmcoNCkpOwogICAgICAgICAgICAgZWxzZSBpZiAoYXJnLnN0YXJ0c1dpdGgoIm1heD0iKSkKZGlmZiAtLWdpdCBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtbXVybXVyLnlhbWwgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhLW11cm11ci55YW1sCmluZGV4IGMwYzJhZTcuLjM4NWVkNDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtbXVybXVyLnlhbWwKKysrIGIvdGVzdC9jb25mL2Nhc3NhbmRyYS1tdXJtdXIueWFtbApAQCAtMzksNiArMzksNiBAQAogcm93X2NhY2hlX2NsYXNzX25hbWU6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLk9IQ1Byb3ZpZGVyCiByb3dfY2FjaGVfc2l6ZTogMTZNaUIKIHVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogdHJ1ZQotc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiB0cnVlCitzY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IGZhbHNlCiBzYXNpX2luZGV4ZXNfZW5hYmxlZDogdHJ1ZQogbWF0ZXJpYWxpemVkX3ZpZXdzX2VuYWJsZWQ6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtb2xkLnlhbWwgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhLW9sZC55YW1sCmluZGV4IDg2OTgzYWMuLjEwOTgxYzIgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtb2xkLnlhbWwKKysrIGIvdGVzdC9jb25mL2Nhc3NhbmRyYS1vbGQueWFtbApAQCAtNDMsNyArNDMsNyBAQAogcm93X2NhY2hlX2NsYXNzX25hbWU6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLk9IQ1Byb3ZpZGVyCiByb3dfY2FjaGVfc2l6ZV9pbl9tYjogMTYKIGVuYWJsZV91c2VyX2RlZmluZWRfZnVuY3Rpb25zOiB0cnVlCi1lbmFibGVfc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uczogdHJ1ZQorZW5hYmxlX3NjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnM6IGZhbHNlCiBwcmVwYXJlZF9zdGF0ZW1lbnRzX2NhY2hlX3NpemVfbWI6CiBjb3JydXB0ZWRfdG9tYnN0b25lX3N0cmF0ZWd5OiBleGNlcHRpb24KIHN0cmVhbV9lbnRpcmVfc3N0YWJsZXM6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtcGVtLWprcy1zc2xjb250ZXh0ZmFjdG9yeS55YW1sIGIvdGVzdC9jb25mL2Nhc3NhbmRyYS1wZW0tamtzLXNzbGNvbnRleHRmYWN0b3J5LnlhbWwKaW5kZXggMWYxMGU2Yy4uYWQ5ZDk5OCAxMDA2NDQKLS0tIGEvdGVzdC9jb25mL2Nhc3NhbmRyYS1wZW0tamtzLXNzbGNvbnRleHRmYWN0b3J5LnlhbWwKKysrIGIvdGVzdC9jb25mL2Nhc3NhbmRyYS1wZW0tamtzLXNzbGNvbnRleHRmYWN0b3J5LnlhbWwKQEAgLTE0MCw3ICsxNDAsNyBAQAogcm93X2NhY2hlX2NsYXNzX25hbWU6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLk9IQ1Byb3ZpZGVyCiByb3dfY2FjaGVfc2l6ZTogMTZNaUIKIHVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogdHJ1ZQotc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiB0cnVlCitzY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IGZhbHNlCiBwcmVwYXJlZF9zdGF0ZW1lbnRzX2NhY2hlX3NpemU6IDFNaUIKIGNvcnJ1cHRlZF90b21ic3RvbmVfc3RyYXRlZ3k6IGV4Y2VwdGlvbgogc3RyZWFtX2VudGlyZV9zc3RhYmxlczogdHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb25mL2Nhc3NhbmRyYS1wZW0tc3NsY29udGV4dGZhY3RvcnktaW52YWxpZGNvbmZpZ3VyYXRpb24ueWFtbCBiL3Rlc3QvY29uZi9jYXNzYW5kcmEtcGVtLXNzbGNvbnRleHRmYWN0b3J5LWludmFsaWRjb25maWd1cmF0aW9uLnlhbWwKaW5kZXggOGM3ZDkxMC4uMTVhYWFlMCAxMDA2NDQKLS0tIGEvdGVzdC9jb25mL2Nhc3NhbmRyYS1wZW0tc3NsY29udGV4dGZhY3RvcnktaW52YWxpZGNvbmZpZ3VyYXRpb24ueWFtbAorKysgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhLXBlbS1zc2xjb250ZXh0ZmFjdG9yeS1pbnZhbGlkY29uZmlndXJhdGlvbi55YW1sCkBAIC0xMzcsNyArMTM3LDcgQEAKIHJvd19jYWNoZV9jbGFzc19uYW1lOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5PSENQcm92aWRlcgogcm93X2NhY2hlX3NpemU6IDE2TWlCCiB1c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IHRydWUKLXNjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogdHJ1ZQorc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiBmYWxzZQogcHJlcGFyZWRfc3RhdGVtZW50c19jYWNoZV9zaXplOiAxTWlCCiBjb3JydXB0ZWRfdG9tYnN0b25lX3N0cmF0ZWd5OiBleGNlcHRpb24KIHN0cmVhbV9lbnRpcmVfc3N0YWJsZXM6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtcGVtLXNzbGNvbnRleHRmYWN0b3J5LnlhbWwgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhLXBlbS1zc2xjb250ZXh0ZmFjdG9yeS55YW1sCmluZGV4IDI2ZDBmMWYuLjM2ZGFlY2QgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtcGVtLXNzbGNvbnRleHRmYWN0b3J5LnlhbWwKKysrIGIvdGVzdC9jb25mL2Nhc3NhbmRyYS1wZW0tc3NsY29udGV4dGZhY3RvcnkueWFtbApAQCAtMTQxLDcgKzE0MSw3IEBACiByb3dfY2FjaGVfY2xhc3NfbmFtZTogb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuT0hDUHJvdmlkZXIKIHJvd19jYWNoZV9zaXplOiAxNk1pQgogdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiB0cnVlCi1zY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IHRydWUKK3NjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogZmFsc2UKIHByZXBhcmVkX3N0YXRlbWVudHNfY2FjaGVfc2l6ZTogMU1pQgogY29ycnVwdGVkX3RvbWJzdG9uZV9zdHJhdGVneTogZXhjZXB0aW9uCiBzdHJlYW1fZW50aXJlX3NzdGFibGVzOiB0cnVlCmRpZmYgLS1naXQgYS90ZXN0L2NvbmYvY2Fzc2FuZHJhLXNlZWRzLnlhbWwgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhLXNlZWRzLnlhbWwKaW5kZXggMWMzOGY4ZS4uMmEyMDZmMSAxMDA2NDQKLS0tIGEvdGVzdC9jb25mL2Nhc3NhbmRyYS1zZWVkcy55YW1sCisrKyBiL3Rlc3QvY29uZi9jYXNzYW5kcmEtc2VlZHMueWFtbApAQCAtNDAsNCArNDAsNCBAQAogcm93X2NhY2hlX2NsYXNzX25hbWU6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLk9IQ1Byb3ZpZGVyCiByb3dfY2FjaGVfc2l6ZTogMTZNaUIKIHVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogdHJ1ZQotc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiB0cnVlCitzY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IGZhbHNlCmRpZmYgLS1naXQgYS90ZXN0L2NvbmYvY2Fzc2FuZHJhLXNzbGNvbnRleHRmYWN0b3J5LWludmFsaWRjb25maWd1cmF0aW9uLnlhbWwgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhLXNzbGNvbnRleHRmYWN0b3J5LWludmFsaWRjb25maWd1cmF0aW9uLnlhbWwKaW5kZXggZDM5NzBjYi4uNmU2YjIxZiAxMDA2NDQKLS0tIGEvdGVzdC9jb25mL2Nhc3NhbmRyYS1zc2xjb250ZXh0ZmFjdG9yeS1pbnZhbGlkY29uZmlndXJhdGlvbi55YW1sCisrKyBiL3Rlc3QvY29uZi9jYXNzYW5kcmEtc3NsY29udGV4dGZhY3RvcnktaW52YWxpZGNvbmZpZ3VyYXRpb24ueWFtbApAQCAtNzIsNyArNzIsNyBAQAogcm93X2NhY2hlX2NsYXNzX25hbWU6IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLk9IQ1Byb3ZpZGVyCiByb3dfY2FjaGVfc2l6ZTogMTZNaUIKIHVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogdHJ1ZQotc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiB0cnVlCitzY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IGZhbHNlCiBwcmVwYXJlZF9zdGF0ZW1lbnRzX2NhY2hlX3NpemU6IDFNaUIKIGNvcnJ1cHRlZF90b21ic3RvbmVfc3RyYXRlZ3k6IGV4Y2VwdGlvbgogc3RyZWFtX2VudGlyZV9zc3RhYmxlczogdHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdC9jb25mL2Nhc3NhbmRyYS1zc2xjb250ZXh0ZmFjdG9yeS55YW1sIGIvdGVzdC9jb25mL2Nhc3NhbmRyYS1zc2xjb250ZXh0ZmFjdG9yeS55YW1sCmluZGV4IGZkZTRiZmQuLmFkZDE2NjYgMTAwNjQ0Ci0tLSBhL3Rlc3QvY29uZi9jYXNzYW5kcmEtc3NsY29udGV4dGZhY3RvcnkueWFtbAorKysgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhLXNzbGNvbnRleHRmYWN0b3J5LnlhbWwKQEAgLTc1LDcgKzc1LDcgQEAKIHJvd19jYWNoZV9jbGFzc19uYW1lOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5PSENQcm92aWRlcgogcm93X2NhY2hlX3NpemU6IDE2TWlCCiB1c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IHRydWUKLXNjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogdHJ1ZQorc2NyaXB0ZWRfdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiBmYWxzZQogcHJlcGFyZWRfc3RhdGVtZW50c19jYWNoZV9zaXplOiAxTWlCCiBjb3JydXB0ZWRfdG9tYnN0b25lX3N0cmF0ZWd5OiBleGNlcHRpb24KIHN0cmVhbV9lbnRpcmVfc3N0YWJsZXM6IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3QvY29uZi9jYXNzYW5kcmEueWFtbCBiL3Rlc3QvY29uZi9jYXNzYW5kcmEueWFtbAppbmRleCA4OWM1Njg1Li42ZTMwNTlhIDEwMDY0NAotLS0gYS90ZXN0L2NvbmYvY2Fzc2FuZHJhLnlhbWwKKysrIGIvdGVzdC9jb25mL2Nhc3NhbmRyYS55YW1sCkBAIC00Myw3ICs0Myw3IEBACiByb3dfY2FjaGVfY2xhc3NfbmFtZTogb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuT0hDUHJvdmlkZXIKIHJvd19jYWNoZV9zaXplOiAxNk1pQgogdXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkOiB0cnVlCi1zY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQ6IHRydWUKK3NjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZDogZmFsc2UKIHByZXBhcmVkX3N0YXRlbWVudHNfY2FjaGVfc2l6ZTogMU1pQgogY29ycnVwdGVkX3RvbWJzdG9uZV9zdHJhdGVneTogZXhjZXB0aW9uCiBzdHJlYW1fZW50aXJlX3NzdGFibGVzOiB0cnVlCkBAIC01Niw2ICs1Niw5IEBACiAgIGFsbG93X25vZGV0b29sX2FyY2hpdmVfY29tbWFuZDogdHJ1ZQogYXV0b19oaW50c19jbGVhbnVwX2VuYWJsZWQ6IHRydWUKIAoraGVhcF9kdW1wX3BhdGg6IGJ1aWxkL3Rlc3QKK2R1bXBfaGVhcF9vbl91bmNhdWdodF9leGNlcHRpb246IHRydWUKKwogcmVhZF90aHJlc2hvbGRzX2VuYWJsZWQ6IHRydWUKIGNvb3JkaW5hdG9yX3JlYWRfc2l6ZV93YXJuX3RocmVzaG9sZDogMTAyNEtpQgogY29vcmRpbmF0b3JfcmVhZF9zaXplX2ZhaWxfdGhyZXNob2xkOiA0MDk2S2lCCkBAIC02NywxMyArNzAsMTUgQEAKIG1lbXRhYmxlOgogICAgIGNvbmZpZ3VyYXRpb25zOgogICAgICAgICBza2lwbGlzdDoKLSAgICAgICAgICAgIGluaGVyaXRzOiBkZWZhdWx0CiAgICAgICAgICAgICBjbGFzc19uYW1lOiBTa2lwTGlzdE1lbXRhYmxlCisgICAgICAgIHRyaWU6CisgICAgICAgICAgICBjbGFzc19uYW1lOiBUcmllTWVtdGFibGUKKyAgICAgICAgICAgIHBhcmFtZXRlcnM6CisgICAgICAgICAgICAgICAgc2hhcmRzOiA0CiAgICAgICAgIHNraXBsaXN0X3NoYXJkZWQ6CiAgICAgICAgICAgICBjbGFzc19uYW1lOiBTaGFyZGVkU2tpcExpc3RNZW10YWJsZQogICAgICAgICAgICAgcGFyYW1ldGVyczoKICAgICAgICAgICAgICAgICBzZXJpYWxpemVfd3JpdGVzOiBmYWxzZQotICAgICAgICAgICAgICAgIHNoYXJkczogNAogICAgICAgICBza2lwbGlzdF9zaGFyZGVkX2xvY2tpbmc6CiAgICAgICAgICAgICBpbmhlcml0czogc2tpcGxpc3Rfc2hhcmRlZAogICAgICAgICAgICAgcGFyYW1ldGVyczoKQEAgLTgxLDcgKzg2LDYgQEAKICAgICAgICAgc2tpcGxpc3RfcmVtYXBwZWQ6CiAgICAgICAgICAgICBpbmhlcml0czogc2tpcGxpc3QKICAgICAgICAgdGVzdF9mdWxsbmFtZToKLSAgICAgICAgICAgIGluaGVyaXRzOiBkZWZhdWx0CiAgICAgICAgICAgICBjbGFzc19uYW1lOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5UZXN0TWVtdGFibGUKICAgICAgICAgdGVzdF9zaG9ydG5hbWU6CiAgICAgICAgICAgICBjbGFzc19uYW1lOiBUZXN0TWVtdGFibGUKQEAgLTEwNSwzICsxMDksNyBAQAogICAgICAgICAgICAgY2xhc3NfbmFtZTogb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy52YWxpZGF0aW9uLm9wZXJhdGlvbnMuQ3JlYXRlVGVzdCRJbnZhbGlkTWVtdGFibGVGYWN0b3J5TWV0aG9kCiAgICAgICAgIHRlc3RfaW52YWxpZF9mYWN0b3J5X2ZpZWxkOgogICAgICAgICAgICAgY2xhc3NfbmFtZTogb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy52YWxpZGF0aW9uLm9wZXJhdGlvbnMuQ3JlYXRlVGVzdCRJbnZhbGlkTWVtdGFibGVGYWN0b3J5RmllbGQKKyAgICAgICAgdGVzdF9tZW10YWJsZV9tZXRyaWNzOgorICAgICAgICAgICAgY2xhc3NfbmFtZTogVHJpZU1lbXRhYmxlCisjIE5vdGU6IGtlZXAgdGhlIG1lbXRhYmxlIGNvbmZpZ3VyYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgc28gdGhhdCB0aGUgZGVmYXVsdCBtYXBwaW5nIGNhbiBiZSBjaGFuZ2VkIHdpdGhvdXQKKyMgZHVwbGljYXRpbmcgdGhlIHdob2xlIHNlY3Rpb24gYWJvdmUuCmRpZmYgLS1naXQgYS90ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LnRydXN0c3RvcmUgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LnRydXN0c3RvcmUKaW5kZXggNDljZjMzMi4uYWIwMWFmMyAxMDA2NDQKLS0tIGEvdGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC50cnVzdHN0b3JlCisrKyBiL3Rlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3QudHJ1c3RzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0X2VuZHBvaW50X3ZlcmlmeS5rZXlzdG9yZSBiL3Rlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3RfZW5kcG9pbnRfdmVyaWZ5LmtleXN0b3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTM4NWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0X2VuZHBvaW50X3ZlcmlmeS5rZXlzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0X291dGJvdW5kLmtleXN0b3JlIGIvdGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdF9vdXRib3VuZC5rZXlzdG9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGJmNDY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdF9vdXRib3VuZC5rZXlzdG9yZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2NvbmYvbG9nYmFjay1kdGVzdF93aXRoX3Z0YWJsZV9hcHBlbmRlci54bWwgYi90ZXN0L2NvbmYvbG9nYmFjay1kdGVzdF93aXRoX3Z0YWJsZV9hcHBlbmRlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmZDEwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29uZi9sb2diYWNrLWR0ZXN0X3dpdGhfdnRhYmxlX2FwcGVuZGVyLnhtbApAQCAtMCwwICsxLDY2IEBACis8IS0tCisgIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIH4gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPGNvbmZpZ3VyYXRpb24gZGVidWc9ImZhbHNlIiBzY2FuPSJ0cnVlIiBzY2FuUGVyaW9kPSI2MCBzZWNvbmRzIj4KKyAgICA8ZGVmaW5lIG5hbWU9ImNsdXN0ZXJfaWQiIGNsYXNzPSJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLkNsdXN0ZXJJRERlZmluZXIiIC8+CisgICAgPGRlZmluZSBuYW1lPSJpbnN0YW5jZV9pZCIgY2xhc3M9Im9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmltcGwuSW5zdGFuY2VJRERlZmluZXIiIC8+CisKKyAgICA8IS0tIFNodXRkb3duIGhvb2sgZW5zdXJlcyB0aGF0IGFzeW5jIGFwcGVuZGVyIGZsdXNoZXMgLS0+CisgICAgPHNodXRkb3duSG9vayBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5ob29rLkRlbGF5aW5nU2h1dGRvd25Ib29rIi8+CisKKyAgICA8YXBwZW5kZXIgbmFtZT0iSU5TVEFOQ0VGSUxFIiBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5GaWxlQXBwZW5kZXIiPgorICAgICAgICA8ZmlsZT4uL2J1aWxkL3Rlc3QvbG9ncy8ke2Nhc3NhbmRyYS50ZXN0dGFnfS8ke3N1aXRlbmFtZX0vJHtjbHVzdGVyX2lkfS8ke2luc3RhbmNlX2lkfS9zeXN0ZW0ubG9nPC9maWxlPgorICAgICAgICA8ZW5jb2Rlcj4KKyAgICAgICAgICAgIDxwYXR0ZXJuPiUtNWxldmVsIFsldGhyZWFkXSAke2luc3RhbmNlX2lkfSAlZGF0ZXtJU084NjAxfSAlbXNnJW48L3BhdHRlcm4+CisgICAgICAgIDwvZW5jb2Rlcj4KKyAgICAgICAgPGltbWVkaWF0ZUZsdXNoPnRydWU8L2ltbWVkaWF0ZUZsdXNoPgorICAgIDwvYXBwZW5kZXI+CisKKyAgICA8YXBwZW5kZXIgbmFtZT0iSU5TVEFOQ0VTVERFUlIiIHRhcmdldD0iU3lzdGVtLmVyciIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuQ29uc29sZUFwcGVuZGVyIj4KKyAgICAgICAgPGVuY29kZXI+CisgICAgICAgICAgICA8cGF0dGVybj4lLTVsZXZlbCAlZGF0ZXtISDptbTpzcyxTU1N9ICVtc2clbjwvcGF0dGVybj4KKyAgICAgICAgPC9lbmNvZGVyPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmZpbHRlci5UaHJlc2hvbGRGaWx0ZXIiPgorICAgICAgICAgICAgPGxldmVsPldBUk48L2xldmVsPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L2FwcGVuZGVyPgorCisgICAgPGFwcGVuZGVyIG5hbWU9IklOU1RBTkNFU1RET1VUIiB0YXJnZXQ9IlN5c3RlbS5vdXQiIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLkNvbnNvbGVBcHBlbmRlciI+CisgICAgICAgIDxlbmNvZGVyPgorICAgICAgICAgICAgPHBhdHRlcm4+JS01bGV2ZWwgWyV0aHJlYWRdICR7aW5zdGFuY2VfaWR9ICVkYXRle0lTTzg2MDF9ICVGOiVMIC0gJW1zZyVuPC9wYXR0ZXJuPgorICAgICAgICA8L2VuY29kZXI+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuZmlsdGVyLlRocmVzaG9sZEZpbHRlciI+CisgICAgICAgICAgICA8bGV2ZWw+REVCVUc8L2xldmVsPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L2FwcGVuZGVyPgorCisgICAgPGxvZ2dlciBuYW1lPSJvcmcuYXBhY2hlLmhhZG9vcCIgbGV2ZWw9IldBUk4iLz4KKworICAgIDxhcHBlbmRlciBuYW1lPSJDUUxMT0ciIGNsYXNzPSJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5sb2dnaW5nLlZpcnR1YWxUYWJsZUFwcGVuZGVyIj4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5maWx0ZXIuVGhyZXNob2xkRmlsdGVyIj4KKyAgICAgICAgICAgIDxsZXZlbD5JTkZPPC9sZXZlbD4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9hcHBlbmRlcj4KKworICAgIDxyb290IGxldmVsPSJERUJVRyI+CisgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJJTlNUQU5DRUZJTEUiIC8+IDwhLS0gdXNlIGJsb2NraW5nIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aXRoIGFwcGVuZGluZyBhbmQgc2VhcmNoaW5nIC0tPgorICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iSU5TVEFOQ0VTVERFUlIiIC8+CisgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJJTlNUQU5DRVNURE9VVCIgLz4KKyAgICAgICAgPGFwcGVuZGVyLXJlZiByZWY9IkNRTExPRyIgLz4KKyAgICA8L3Jvb3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0L2NvbmYvbG9nYmFjay1kdGVzdF93aXRoX3Z0YWJsZV9hcHBlbmRlcl9pbnZhbGlkLnhtbCBiL3Rlc3QvY29uZi9sb2diYWNrLWR0ZXN0X3dpdGhfdnRhYmxlX2FwcGVuZGVyX2ludmFsaWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMzBjMTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2NvbmYvbG9nYmFjay1kdGVzdF93aXRoX3Z0YWJsZV9hcHBlbmRlcl9pbnZhbGlkLnhtbApAQCAtMCwwICsxLDczIEBACis8IS0tCisgIH4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICB+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICB+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgIH4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICB+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAgfiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgIH4gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICB+CisgIH4gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICB+CisgIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAtLT4KKworPGNvbmZpZ3VyYXRpb24gZGVidWc9ImZhbHNlIiBzY2FuPSJ0cnVlIiBzY2FuUGVyaW9kPSI2MCBzZWNvbmRzIj4KKyAgICA8ZGVmaW5lIG5hbWU9ImNsdXN0ZXJfaWQiIGNsYXNzPSJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLkNsdXN0ZXJJRERlZmluZXIiIC8+CisgICAgPGRlZmluZSBuYW1lPSJpbnN0YW5jZV9pZCIgY2xhc3M9Im9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmltcGwuSW5zdGFuY2VJRERlZmluZXIiIC8+CisKKyAgICA8IS0tIFNodXRkb3duIGhvb2sgZW5zdXJlcyB0aGF0IGFzeW5jIGFwcGVuZGVyIGZsdXNoZXMgLS0+CisgICAgPHNodXRkb3duSG9vayBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5ob29rLkRlbGF5aW5nU2h1dGRvd25Ib29rIi8+CisKKyAgICA8YXBwZW5kZXIgbmFtZT0iSU5TVEFOQ0VGSUxFIiBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY29yZS5GaWxlQXBwZW5kZXIiPgorICAgICAgICA8ZmlsZT4uL2J1aWxkL3Rlc3QvbG9ncy8ke2Nhc3NhbmRyYS50ZXN0dGFnfS8ke3N1aXRlbmFtZX0vJHtjbHVzdGVyX2lkfS8ke2luc3RhbmNlX2lkfS9zeXN0ZW0ubG9nPC9maWxlPgorICAgICAgICA8ZW5jb2Rlcj4KKyAgICAgICAgICAgIDxwYXR0ZXJuPiUtNWxldmVsIFsldGhyZWFkXSAke2luc3RhbmNlX2lkfSAlZGF0ZXtJU084NjAxfSAlbXNnJW48L3BhdHRlcm4+CisgICAgICAgIDwvZW5jb2Rlcj4KKyAgICAgICAgPGltbWVkaWF0ZUZsdXNoPnRydWU8L2ltbWVkaWF0ZUZsdXNoPgorICAgIDwvYXBwZW5kZXI+CisKKyAgICA8YXBwZW5kZXIgbmFtZT0iSU5TVEFOQ0VTVERFUlIiIHRhcmdldD0iU3lzdGVtLmVyciIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNvcmUuQ29uc29sZUFwcGVuZGVyIj4KKyAgICAgICAgPGVuY29kZXI+CisgICAgICAgICAgICA8cGF0dGVybj4lLTVsZXZlbCAlZGF0ZXtISDptbTpzcyxTU1N9ICVtc2clbjwvcGF0dGVybj4KKyAgICAgICAgPC9lbmNvZGVyPgorICAgICAgICA8ZmlsdGVyIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jbGFzc2ljLmZpbHRlci5UaHJlc2hvbGRGaWx0ZXIiPgorICAgICAgICAgICAgPGxldmVsPldBUk48L2xldmVsPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L2FwcGVuZGVyPgorCisgICAgPGFwcGVuZGVyIG5hbWU9IklOU1RBTkNFU1RET1VUIiB0YXJnZXQ9IlN5c3RlbS5vdXQiIGNsYXNzPSJjaC5xb3MubG9nYmFjay5jb3JlLkNvbnNvbGVBcHBlbmRlciI+CisgICAgICAgIDxlbmNvZGVyPgorICAgICAgICAgICAgPHBhdHRlcm4+JS01bGV2ZWwgWyV0aHJlYWRdICR7aW5zdGFuY2VfaWR9ICVkYXRle0lTTzg2MDF9ICVGOiVMIC0gJW1zZyVuPC9wYXR0ZXJuPgorICAgICAgICA8L2VuY29kZXI+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuZmlsdGVyLlRocmVzaG9sZEZpbHRlciI+CisgICAgICAgICAgICA8bGV2ZWw+REVCVUc8L2xldmVsPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L2FwcGVuZGVyPgorCisgICAgPGxvZ2dlciBuYW1lPSJvcmcuYXBhY2hlLmhhZG9vcCIgbGV2ZWw9IldBUk4iLz4KKworICAgIDxhcHBlbmRlciBuYW1lPSJDUUxMT0ciIGNsYXNzPSJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5sb2dnaW5nLlZpcnR1YWxUYWJsZUFwcGVuZGVyIj4KKyAgICAgICAgPGZpbHRlciBjbGFzcz0iY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5maWx0ZXIuVGhyZXNob2xkRmlsdGVyIj4KKyAgICAgICAgICAgIDxsZXZlbD5JTkZPPC9sZXZlbD4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9hcHBlbmRlcj4KKworICAgIDxhcHBlbmRlciBuYW1lPSJDUUxMT0cyIiBjbGFzcz0ib3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubG9nZ2luZy5WaXJ0dWFsVGFibGVBcHBlbmRlciI+CisgICAgICAgIDxmaWx0ZXIgY2xhc3M9ImNoLnFvcy5sb2diYWNrLmNsYXNzaWMuZmlsdGVyLlRocmVzaG9sZEZpbHRlciI+CisgICAgICAgICAgICA8bGV2ZWw+SU5GTzwvbGV2ZWw+CisgICAgICAgIDwvZmlsdGVyPgorICAgIDwvYXBwZW5kZXI+CisKKyAgICA8cm9vdCBsZXZlbD0iREVCVUciPgorICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iSU5TVEFOQ0VGSUxFIiAvPiA8IS0tIHVzZSBibG9ja2luZyB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2l0aCBhcHBlbmRpbmcgYW5kIHNlYXJjaGluZyAtLT4KKyAgICAgICAgPGFwcGVuZGVyLXJlZiByZWY9IklOU1RBTkNFU1RERVJSIiAvPgorICAgICAgICA8YXBwZW5kZXItcmVmIHJlZj0iSU5TVEFOQ0VTVERPVVQiIC8+CisgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJDUUxMT0ciIC8+CisgICAgICAgIDxhcHBlbmRlci1yZWYgcmVmPSJDUUxMT0cyIiAvPiA8IS0tIGludmFsaWQsIHdlIGNhbiBub3QgaGF2ZSBtdWx0aXBsZSBhcHBlbmRlcnMgb2YgVmlydHVhbFRhYmxlQXBwZW5kZXIgY2xhc3MgLS0+CisgICAgPC9yb290PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdC9jb25mL3RyaWVfbWVtdGFibGUueWFtbCBiL3Rlc3QvY29uZi90cmllX21lbXRhYmxlLnlhbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzY2E4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvY29uZi90cmllX21lbXRhYmxlLnlhbWwKQEAgLTAsMCArMSwyNSBAQAorIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisjIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisjIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisjIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIE5vdGU6IHRoaXMgYXR0YWNoZXMgYXQgdGhlIGVuZCBvZiBjYXNzYW5kcmEueWFtbCwgd2hlcmUgdGhlIG1lbXRhYmxlIGNvbmZpZ3VyYXRpb24gc2V0dGluZyBtdXN0IGJlLgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaW5oZXJpdHM6IHRyaWUKKworIyBDaGFuZ2UgdGhlIGRlZmF1bHQgU1NUYWJsZSBmb3JtYXQgdG8gQlRJLgorIyBOb3RlOiBUaGlzIGNhbiBhbHNvIGJlIGFjaGlldmVkIGJ5IHBhc3NpbmcgLURjYXNzYW5kcmEuc3N0YWJsZS5mb3JtYXQuZGVmYXVsdD1idGkKK3NzdGFibGU6CisgIHNlbGVjdGVkX2Zvcm1hdDogYnRpCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLUNvbXByZXNzaW9uSW5mby5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfY2x1c3QvZGEtMS1idGktQ29tcHJlc3Npb25JbmZvLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMDc1YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLUNvbXByZXNzaW9uSW5mby5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLURhdGEuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLURhdGEuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwOWQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfY2x1c3QvZGEtMS1idGktRGF0YS5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLURpZ2VzdC5jcmMzMiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfY2x1c3QvZGEtMS1idGktRGlnZXN0LmNyYzMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2I5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLURpZ2VzdC5jcmMzMgpAQCAtMCwwICsxIEBACiszNTAxNjk2NjczClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1GaWx0ZXIuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLUZpbHRlci5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODY4ZTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1GaWx0ZXIuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1QYXJ0aXRpb25zLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1QYXJ0aXRpb25zLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZjFiMDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLVBhcnRpdGlvbnMuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1Sb3dzLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1Sb3dzLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZGVmYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLVJvd3MuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1TdGF0aXN0aWNzLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1TdGF0aXN0aWNzLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODAxOGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLVN0YXRpc3RpY3MuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1UT0MudHh0IGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdC9kYS0xLWJ0aS1UT0MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODkxMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0L2RhLTEtYnRpLVRPQy50eHQKQEAgLTAsMCArMSw4IEBACitEYXRhLmRiCitTdGF0aXN0aWNzLmRiCitEaWdlc3QuY3JjMzIKK1RPQy50eHQKK0NvbXByZXNzaW9uSW5mby5kYgorRmlsdGVyLmRiCitQYXJ0aXRpb25zLmRiCitSb3dzLmRiCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktQ29tcHJlc3Npb25JbmZvLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLUNvbXByZXNzaW9uSW5mby5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmZhNmVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLUNvbXByZXNzaW9uSW5mby5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktRGF0YS5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfY2x1c3RfY291bnRlci9kYS0xLWJ0aS1EYXRhLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMWEwNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktRGF0YS5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktRGlnZXN0LmNyYzMyIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLURpZ2VzdC5jcmMzMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjYxMjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLURpZ2VzdC5jcmMzMgpAQCAtMCwwICsxIEBACisxNzQ4ODI2MDg2ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLUZpbHRlci5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfY2x1c3RfY291bnRlci9kYS0xLWJ0aS1GaWx0ZXIuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2OGU1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfY2x1c3RfY291bnRlci9kYS0xLWJ0aS1GaWx0ZXIuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVBhcnRpdGlvbnMuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktUGFydGl0aW9ucy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWYxYjAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVBhcnRpdGlvbnMuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVJvd3MuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktUm93cy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTM0N2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVJvd3MuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVN0YXRpc3RpY3MuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktU3RhdGlzdGljcy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODIyMTc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVN0YXRpc3RpY3MuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVRPQy50eHQgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX2NsdXN0X2NvdW50ZXIvZGEtMS1idGktVE9DLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTg5MTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9jbHVzdF9jb3VudGVyL2RhLTEtYnRpLVRPQy50eHQKQEAgLTAsMCArMSw4IEBACitEYXRhLmRiCitTdGF0aXN0aWNzLmRiCitEaWdlc3QuY3JjMzIKK1RPQy50eHQKK0NvbXByZXNzaW9uSW5mby5kYgorRmlsdGVyLmRiCitQYXJ0aXRpb25zLmRiCitSb3dzLmRiCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1Db21wcmVzc2lvbkluZm8uZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1Db21wcmVzc2lvbkluZm8uZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY2ODMxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlL2RhLTEtYnRpLUNvbXByZXNzaW9uSW5mby5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1EYXRhLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktRGF0YS5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGJhOTI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktRGF0YS5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1EaWdlc3QuY3JjMzIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1EaWdlc3QuY3JjMzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkMjViZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlL2RhLTEtYnRpLURpZ2VzdC5jcmMzMgpAQCAtMCwwICsxIEBACis0MTA0MzI3MjM3ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktRmlsdGVyLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktRmlsdGVyLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjhlNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1GaWx0ZXIuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktUGFydGl0aW9ucy5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlL2RhLTEtYnRpLVBhcnRpdGlvbnMuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIwYjRlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlL2RhLTEtYnRpLVBhcnRpdGlvbnMuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLldyaXRlUmVzcG9uc2UuYmluIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktUm93cy5kYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLldyaXRlUmVzcG9uc2UuYmluCnJlbmFtZSB0byB0ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1Sb3dzLmRiCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1TdGF0aXN0aWNzLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktU3RhdGlzdGljcy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTAwN2I4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktU3RhdGlzdGljcy5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZS9kYS0xLWJ0aS1UT0MudHh0IGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktVE9DLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTg5MTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGUvZGEtMS1idGktVE9DLnR4dApAQCAtMCwwICsxLDggQEAKK0RhdGEuZGIKK1N0YXRpc3RpY3MuZGIKK0RpZ2VzdC5jcmMzMgorVE9DLnR4dAorQ29tcHJlc3Npb25JbmZvLmRiCitGaWx0ZXIuZGIKK1BhcnRpdGlvbnMuZGIKK1Jvd3MuZGIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktQ29tcHJlc3Npb25JbmZvLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGVfY291bnRlci9kYS0xLWJ0aS1Db21wcmVzc2lvbkluZm8uZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRiOWFhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktQ29tcHJlc3Npb25JbmZvLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktRGF0YS5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktRGF0YS5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWIzNmYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGVfY291bnRlci9kYS0xLWJ0aS1EYXRhLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktRGlnZXN0LmNyYzMyIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGVfY291bnRlci9kYS0xLWJ0aS1EaWdlc3QuY3JjMzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE3YWNlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktRGlnZXN0LmNyYzMyCkBAIC0wLDAgKzEgQEAKKzExMDIxOTI0ODgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZV9jb3VudGVyL2RhLTEtYnRpLUZpbHRlci5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktRmlsdGVyLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjhlNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZV9jb3VudGVyL2RhLTEtYnRpLUZpbHRlci5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZV9jb3VudGVyL2RhLTEtYnRpLVBhcnRpdGlvbnMuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZV9jb3VudGVyL2RhLTEtYnRpLVBhcnRpdGlvbnMuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczZDNjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktUGFydGl0aW9ucy5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuV3JpdGVSZXNwb25zZS5iaW4gYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZV9jb3VudGVyL2RhLTEtYnRpLVJvd3MuZGIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSB0ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuV3JpdGVSZXNwb25zZS5iaW4KY29weSB0byB0ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL2RhL2xlZ2FjeV90YWJsZXMvbGVnYWN5X2RhX3NpbXBsZV9jb3VudGVyL2RhLTEtYnRpLVJvd3MuZGIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktU3RhdGlzdGljcy5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktU3RhdGlzdGljcy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjgyNTc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGVfY291bnRlci9kYS0xLWJ0aS1TdGF0aXN0aWNzLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktVE9DLnR4dCBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvZGEvbGVnYWN5X3RhYmxlcy9sZWdhY3lfZGFfc2ltcGxlX2NvdW50ZXIvZGEtMS1idGktVE9DLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTg5MTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9kYS9sZWdhY3lfdGFibGVzL2xlZ2FjeV9kYV9zaW1wbGVfY291bnRlci9kYS0xLWJ0aS1UT0MudHh0CkBAIC0wLDAgKzEsOCBAQAorRGF0YS5kYgorU3RhdGlzdGljcy5kYgorRGlnZXN0LmNyYzMyCitUT0MudHh0CitDb21wcmVzc2lvbkluZm8uZGIKK0ZpbHRlci5kYgorUGFydGl0aW9ucy5kYgorUm93cy5kYgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1Db21wcmVzc2lvbkluZm8uZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0L25jLTEtYmlnLUNvbXByZXNzaW9uSW5mby5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWJmMGE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1Db21wcmVzc2lvbkluZm8uZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1EYXRhLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1EYXRhLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYjVkYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0L25jLTEtYmlnLURhdGEuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1EaWdlc3QuY3JjMzIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0L25jLTEtYmlnLURpZ2VzdC5jcmMzMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzU1NGZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1EaWdlc3QuY3JjMzIKQEAgLTAsMCArMSBAQAorNTE2MzUxNDU4ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1GaWx0ZXIuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0L25jLTEtYmlnLUZpbHRlci5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODY4ZTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1GaWx0ZXIuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1JbmRleC5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3QvbmMtMS1iaWctSW5kZXguZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyM2JlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3QvbmMtMS1iaWctSW5kZXguZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1TdGF0aXN0aWNzLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1TdGF0aXN0aWNzLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTM1NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0L25jLTEtYmlnLVN0YXRpc3RpY3MuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1TdW1tYXJ5LmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1TdW1tYXJ5LmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMjRlMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0L25jLTEtYmlnLVN1bW1hcnkuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1UT0MudHh0IGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdC9uYy0xLWJpZy1UT0MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTkxMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0L25jLTEtYmlnLVRPQy50eHQKQEAgLTAsMCArMSw4IEBACitUT0MudHh0CitEYXRhLmRiCitTdGF0aXN0aWNzLmRiCitTdW1tYXJ5LmRiCitGaWx0ZXIuZGIKK0RpZ2VzdC5jcmMzMgorSW5kZXguZGIKK0NvbXByZXNzaW9uSW5mby5kYgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLUNvbXByZXNzaW9uSW5mby5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1Db21wcmVzc2lvbkluZm8uZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhYjhkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1Db21wcmVzc2lvbkluZm8uZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLURhdGEuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0X2NvdW50ZXIvbmMtMS1iaWctRGF0YS5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjEyZDNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLURhdGEuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLURpZ2VzdC5jcmMzMiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1EaWdlc3QuY3JjMzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwYmYzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1EaWdlc3QuY3JjMzIKQEAgLTAsMCArMSBAQAorMzY3NzE1MjQxMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1GaWx0ZXIuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0X2NvdW50ZXIvbmMtMS1iaWctRmlsdGVyLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjhlNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX2NsdXN0X2NvdW50ZXIvbmMtMS1iaWctRmlsdGVyLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1JbmRleC5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1JbmRleC5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZkYjNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLUluZGV4LmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1TdGF0aXN0aWNzLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLVN0YXRpc3RpY3MuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEzYWIwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1TdGF0aXN0aWNzLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1TdW1tYXJ5LmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLVN1bW1hcnkuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyNGUwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1TdW1tYXJ5LmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1UT0MudHh0IGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19jbHVzdF9jb3VudGVyL25jLTEtYmlnLVRPQy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhOTEyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfY2x1c3RfY291bnRlci9uYy0xLWJpZy1UT0MudHh0CkBAIC0wLDAgKzEsOCBAQAorVE9DLnR4dAorRGF0YS5kYgorU3RhdGlzdGljcy5kYgorU3VtbWFyeS5kYgorRmlsdGVyLmRiCitEaWdlc3QuY3JjMzIKK0luZGV4LmRiCitDb21wcmVzc2lvbkluZm8uZGIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlL25jLTEtYmlnLUNvbXByZXNzaW9uSW5mby5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlL25jLTEtYmlnLUNvbXByZXNzaW9uSW5mby5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjY4MzE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctQ29tcHJlc3Npb25JbmZvLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlL25jLTEtYmlnLURhdGEuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1EYXRhLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTM1ODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1EYXRhLmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlL25jLTEtYmlnLURpZ2VzdC5jcmMzMiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlL25jLTEtYmlnLURpZ2VzdC5jcmMzMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Y2Mjk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctRGlnZXN0LmNyYzMyCkBAIC0wLDAgKzEgQEAKKzExNTU2MjUyMzkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1GaWx0ZXIuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1GaWx0ZXIuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2OGU1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlL25jLTEtYmlnLUZpbHRlci5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1JbmRleC5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlL25jLTEtYmlnLUluZGV4LmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMDk0YmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1JbmRleC5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1TdGF0aXN0aWNzLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctU3RhdGlzdGljcy5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTk0MGQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctU3RhdGlzdGljcy5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1TdW1tYXJ5LmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctU3VtbWFyeS5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjI0ZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctU3VtbWFyeS5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZS9uYy0xLWJpZy1UT0MudHh0IGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctVE9DLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWE5MTJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGUvbmMtMS1iaWctVE9DLnR4dApAQCAtMCwwICsxLDggQEAKK1RPQy50eHQKK0RhdGEuZGIKK1N0YXRpc3RpY3MuZGIKK1N1bW1hcnkuZGIKK0ZpbHRlci5kYgorRGlnZXN0LmNyYzMyCitJbmRleC5kYgorQ29tcHJlc3Npb25JbmZvLmRiCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLUNvbXByZXNzaW9uSW5mby5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlX2NvdW50ZXIvbmMtMS1iaWctQ29tcHJlc3Npb25JbmZvLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjlhYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLUNvbXByZXNzaW9uSW5mby5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLURhdGEuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLURhdGEuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzMWUzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlX2NvdW50ZXIvbmMtMS1iaWctRGF0YS5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLURpZ2VzdC5jcmMzMiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlX2NvdW50ZXIvbmMtMS1iaWctRGlnZXN0LmNyYzMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NjQxMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLURpZ2VzdC5jcmMzMgpAQCAtMCwwICsxIEBACis0MDQ1OTM3NzAxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1GaWx0ZXIuZGIgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLUZpbHRlci5kYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODY4ZTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1GaWx0ZXIuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1JbmRleC5kYiBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlX2NvdW50ZXIvbmMtMS1iaWctSW5kZXguZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllNjVjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvbmMvbGVnYWN5X3RhYmxlcy9sZWdhY3lfbmNfc2ltcGxlX2NvdW50ZXIvbmMtMS1iaWctSW5kZXguZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1TdGF0aXN0aWNzLmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1TdGF0aXN0aWNzLmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZDc5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLVN0YXRpc3RpY3MuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1TdW1tYXJ5LmRiIGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1TdW1tYXJ5LmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMjRlMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLVN1bW1hcnkuZGIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1UT0MudHh0IGIvdGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYy9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uY19zaW1wbGVfY291bnRlci9uYy0xLWJpZy1UT0MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTkxMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2RhdGEvbGVnYWN5LXNzdGFibGVzL25jL2xlZ2FjeV90YWJsZXMvbGVnYWN5X25jX3NpbXBsZV9jb3VudGVyL25jLTEtYmlnLVRPQy50eHQKQEAgLTAsMCArMSw4IEBACitUT0MudHh0CitEYXRhLmRiCitTdGF0aXN0aWNzLmRiCitTdW1tYXJ5LmRiCitGaWx0ZXIuZGIKK0RpZ2VzdC5jcmMzMgorSW5kZXguZGIKK0NvbXByZXNzaW9uSW5mby5kYgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlJhbmdlU2xpY2VDb21tYW5kLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9kYi5SYW5nZVNsaWNlQ29tbWFuZC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YTBiMDUuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlJhbmdlU2xpY2VDb21tYW5kLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9kYi5Sb3cuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlJvdy5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZGU4YmIuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlJvdy5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZGIuUm93TXV0YXRpb24uYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlJvd011dGF0aW9uLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2NTIyMC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZGIuUm93TXV0YXRpb24uYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9kYi5TbGljZUJ5TmFtZXNSZWFkQ29tbWFuZC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODkyZDUuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZGIuU2xpY2VGcm9tUmVhZENvbW1hbmQuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTYwZDI0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZGIuVHJ1bmNhdGlvbi5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZGIuVHJ1bmNhdGlvbi5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNjc5OTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLlRydW5jYXRpb24uYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLldyaXRlUmVzcG9uc2UuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2RiLldyaXRlUmVzcG9uc2UuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDc2MjM4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9kYi5Xcml0ZVJlc3BvbnNlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZ21zLkVuZHBvaW50U3RhdGUuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTRiY2VkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZ21zLkdvc3NpcC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvZ21zLkdvc3NpcC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYjI3YTguLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L2dtcy5Hb3NzaXAuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3NlcnZpY2UuVHJlZVJlcXVlc3QuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3NlcnZpY2UuVHJlZVJlcXVlc3QuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQ3ZTJhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zZXJ2aWNlLlRyZWVSZXF1ZXN0LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zZXJ2aWNlLlRyZWVSZXNwb25zZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvc2VydmljZS5UcmVlUmVzcG9uc2UuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzM3Nzg1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zZXJ2aWNlLlRyZWVSZXNwb25zZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvc3RyZWFtaW5nLlBlbmRpbmdGaWxlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zdHJlYW1pbmcuUGVuZGluZ0ZpbGUuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzBkNjFhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zdHJlYW1pbmcuUGVuZGluZ0ZpbGUuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3N0cmVhbWluZy5TdHJlYW1IZWFkZXIuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3N0cmVhbWluZy5TdHJlYW1IZWFkZXIuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDIxYTY4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zdHJlYW1pbmcuU3RyZWFtSGVhZGVyLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zdHJlYW1pbmcuU3RyZWFtUmVwbHkuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3N0cmVhbWluZy5TdHJlYW1SZXBseS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNzQwNTguLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3N0cmVhbWluZy5TdHJlYW1SZXBseS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvc3RyZWFtaW5nLlN0cmVhbVJlcXVlc3RNZXNzYWdlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zdHJlYW1pbmcuU3RyZWFtUmVxdWVzdE1lc3NhZ2UuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2Y4ZDBlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy9zdHJlYW1pbmcuU3RyZWFtUmVxdWVzdE1lc3NhZ2UuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3V0aWxzLkJsb29tRmlsdGVyLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy91dGlscy5CbG9vbUZpbHRlci5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZDdmYmEuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3V0aWxzLkJsb29tRmlsdGVyLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzAuNy91dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW0uYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3V0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZGQzOWIuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3V0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvdXRpbHMuTGVnYWN5Qmxvb21GaWx0ZXIuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMC43L3V0aWxzLkxlZ2FjeUJsb29tRmlsdGVyLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFlZjFiOC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8wLjcvdXRpbHMuTGVnYWN5Qmxvb21GaWx0ZXIuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlJhbmdlU2xpY2VDb21tYW5kLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5SYW5nZVNsaWNlQ29tbWFuZC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMjQ5MTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlJhbmdlU2xpY2VDb21tYW5kLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5Sb3cuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlJvdy5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTBmNDEuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlJvdy5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIuUm93TXV0YXRpb24uYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlJvd011dGF0aW9uLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5MmNiNS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIuUm93TXV0YXRpb24uYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5TbGljZUJ5TmFtZXNSZWFkQ29tbWFuZC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODkyZDUuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIuU2xpY2VGcm9tUmVhZENvbW1hbmQuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTYwZDI0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIuVHJ1bmNhdGlvbi5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIuVHJ1bmNhdGlvbi5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNjc5OTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLlRydW5jYXRpb24uYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLldyaXRlUmVzcG9uc2UuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLldyaXRlUmVzcG9uc2UuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDc2MjM4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5Xcml0ZVJlc3BvbnNlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5taWdyYXRpb24uS2V5c3BhY2UxLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5taWdyYXRpb24uS2V5c3BhY2UxLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzOWM1ZS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIubWlncmF0aW9uLktleXNwYWNlMS5iaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi23bC9EbDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVRXbG5jbUYwYVc5dUlpd2libUZ0WlhOd1lXTmxJam9pYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV2xuY21GMGFXOXVMbUYyY204aUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSnZiR1JmZG1WeWMybHZiaUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbVpwZUdWa0lpd2libUZ0WlNJNklsVlZTVVFpTENKdVlXMWxjM0JoWTJVaU9pSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzUxZEdsc2N5NWhkbkp2SWl3aWMybDZaU0k2TVRaOWZTeDdJbTVoYldVaU9pSnVaWGRmZG1WeWMybHZiaUlzSW5SNWNHVWlPaUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1MWRHbHNjeTVoZG5KdkxsVlZTVVFpZlN4N0ltNWhiV1VpT2lKeWIzZGZiWFYwWVhScGIyNGlMQ0owZVhCbElqb2lZbmwwWlhNaWZTeDdJbTVoYldVaU9pSmpiR0Z6YzI1aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2liV2xuY21GMGFXOXVJaXdpZEhsd1pTSTZXM3NpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkJaR1JEYjJ4MWJXNUdZVzFwYkhraUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSmpaaUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkRaa1JsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltdGxlWE53WVdObElpd2lkSGx3WlNJNkluTjBjbWx1WnlKOUxIc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pWTI5c2RXMXVYM1I1Y0dVaUxDSjBlWEJsSWpwYkluTjBjbWx1WnlJc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaVkyOXRjR0Z5WVhSdmNsOTBlWEJsSWl3aWRIbHdaU0k2V3lKemRISnBibWNpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5OMVltTnZiWEJoY21GMGIzSmZkSGx3WlNJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKamIyMXRaVzUwSWl3aWRIbHdaU0k2V3lKemRISnBibWNpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5emFYcGxJaXdpZEhsd1pTSTZXeUprYjNWaWJHVWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbXRsZVY5allXTm9aVjl6YVhwbElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSmxZV1JmY21Wd1lXbHlYMk5vWVc1alpTSXNJblI1Y0dVaU9sc2laRzkxWW14bElpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnlaWEJzYVdOaGRHVmZiMjVmZDNKcGRHVWlMQ0owZVhCbElqb2lZbTl2YkdWaGJpSXNJbVJsWm1GMWJIUWlPbVpoYkhObGZTeDdJbTVoYldVaU9pSm5ZMTluY21GalpWOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW1SbFptRjFiSFJmZG1Gc2FXUmhkR2x2Ymw5amJHRnpjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnJaWGxmZG1Gc2FXUmhkR2x2Ymw5amJHRnpjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnRhVzVmWTI5dGNHRmpkR2x2Ymw5MGFISmxjMmh2YkdRaUxDSjBlWEJsSWpwYkltNTFiR3dpTENKcGJuUWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2liV0Y0WDJOdmJYQmhZM1JwYjI1ZmRHaHlaWE5vYjJ4a0lpd2lkSGx3WlNJNld5SnVkV3hzSWl3aWFXNTBJbDBzSW1SbFptRjFiSFFpT201MWJHeDlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl6WVhabFgzQmxjbWx2WkY5cGJsOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDBzSW1SbFptRjFiSFFpT2pCOUxIc2libUZ0WlNJNkltdGxlVjlqWVdOb1pWOXpZWFpsWDNCbGNtbHZaRjlwYmw5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMHNJbVJsWm1GMWJIUWlPak0yTURCOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXJaWGx6WDNSdlgzTmhkbVVpTENKMGVYQmxJanBiSW01MWJHd2lMQ0pwYm5RaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaWJXVnlaMlZmYzJoaGNtUnpYMk5vWVc1alpTSXNJblI1Y0dVaU9sc2liblZzYkNJc0ltUnZkV0pzWlNKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKcFpDSXNJblI1Y0dVaU9sc2lhVzUwSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKamIyeDFiVzVmYldWMFlXUmhkR0VpTENKMGVYQmxJanBiZXlKMGVYQmxJam9pWVhKeVlYa2lMQ0pwZEdWdGN5STZleUowZVhCbElqb2ljbVZqYjNKa0lpd2libUZ0WlNJNklrTnZiSFZ0YmtSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaVlubDBaWE1pZlN4N0ltNWhiV1VpT2lKMllXeHBaR0YwYVc5dVgyTnNZWE56SWl3aWRIbHdaU0k2SW5OMGNtbHVaeUo5TEhzaWJtRnRaU0k2SW1sdVpHVjRYM1I1Y0dVaUxDSjBlWEJsSWpwYmV5SjBlWEJsSWpvaVpXNTFiU0lzSW01aGJXVWlPaUpKYm1SbGVGUjVjR1VpTENKemVXMWliMnh6SWpwYklrdEZXVk1pTENKRFZWTlVUMDBpWFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1SmJtUmxlRlI1Y0dVaVhYMHNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lhVzVrWlhoZmJtRnRaU0lzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpwYm1SbGVGOXZjSFJwYjI1eklpd2lkSGx3WlNJNld5SnVkV3hzSWl4N0luUjVjR1VpT2lKdFlYQWlMQ0oyWVd4MVpYTWlPaUp6ZEhKcGJtY2lmVjBzSW1SbFptRjFiSFFpT201MWJHeDlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVEYjJ4MWJXNUVaV1lpWFgxOUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXdjbTkyYVdSbGNpSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZExDSmtaV1poZFd4MElqb2liM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVRMjl1WTNWeWNtVnVkRXhwYm10bFpFaGhjMmhEWVdOb1pWQnliM1pwWkdWeUluMHNleUp1WVcxbElqb2lhMlY1WDJGc2FXRnpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2lZbmwwWlhNaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaVkyOXRjR0ZqZEdsdmJsOXpkSEpoZEdWbmVTSXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKamIyMXdZV04wYVc5dVgzTjBjbUYwWldkNVgyOXdkR2x2Ym5NaUxDSjBlWEJsSWpwYkltNTFiR3dpTEhzaWRIbHdaU0k2SW0xaGNDSXNJblpoYkhWbGN5STZJbk4wY21sdVp5SjlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2lZMjl0Y0hKbGMzTnBiMjVmYjNCMGFXOXVjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNleUowZVhCbElqb2liV0Z3SWl3aWRtRnNkV1Z6SWpvaWMzUnlhVzVuSW4xZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKaWJHOXZiVjltYVd4MFpYSmZabkJmWTJoaGJtTmxJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2laRzkxWW14bElsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NURaa1JsWmlKZGZYMWRmU3g3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lSSEp2Y0VOdmJIVnRia1poYldsc2VTSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbXR6Ym1GdFpTSXNJblI1Y0dVaU9pSnpkSEpwYm1jaWZTeDdJbTVoYldVaU9pSmpabTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4xZGZTeDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVFXUmtTMlY1YzNCaFkyVWlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUpyY3lJc0luUjVjR1VpT25zaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpMYzBSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaWMzUnlZWFJsWjNsZlkyeGhjM01pTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYzNSeVlYUmxaM2xmYjNCMGFXOXVjeUlzSW5SNWNHVWlPbHQ3SW5SNWNHVWlPaUp0WVhBaUxDSjJZV3gxWlhNaU9pSnpkSEpwYm1jaWZTd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnlaWEJzYVdOaGRHbHZibDltWVdOMGIzSWlMQ0owZVhCbElqcGJJbWx1ZENJc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaVkyWmZaR1ZtY3lJc0luUjVjR1VpT25zaWRIbHdaU0k2SW1GeWNtRjVJaXdpYVhSbGJYTWlPaUpEWmtSbFppSjlmU3g3SW01aGJXVWlPaUprZFhKaFlteGxYM2R5YVhSbGN5SXNJblI1Y0dVaU9pSmliMjlzWldGdUlpd2laR1ZtWVhWc2RDSTZkSEoxWlgxZExDSmhiR2xoYzJWeklqcGJJbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OdmJtWnBaeTVoZG5KdkxrdHpSR1ZtSWwxOWZWMTlMSHNpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkVjbTl3UzJWNWMzQmhZMlVpTENKbWFXVnNaSE1pT2x0N0ltNWhiV1VpT2lKcmMyNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pVlhCa1lYUmxTMlY1YzNCaFkyVWlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUp2YkdSTGN5SXNJblI1Y0dVaU9pSkxjMFJsWmlKOUxIc2libUZ0WlNJNkltNWxkMHR6SWl3aWRIbHdaU0k2SWt0elJHVm1JbjFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pVlhCa1lYUmxRMjlzZFcxdVJtRnRhV3g1SWl3aVptbGxiR1J6SWpwYmV5SnVZVzFsSWpvaWJXVjBZV1JoZEdFaUxDSjBlWEJsSWpvaVEyWkVaV1lpZlYxOVhYMWRmYWhMODFCM1dSSGhBQUQranI3cTJmeW9UQnBnZDFrUjRRQUEvbzYrNnRuOHVzOENBQVp6ZVhOMFpXMEFKR0U0TkdNeFlUWXdMVGMzTlRrdE1URmxNUzB3TURBd0xXWmxPR1ZpWldWaFpEbG1Zd0FBQUFFQUFBQURBUUFBQUFPQUFBQUFnQUFBQUFBQUFBQUFBQUFLQUF0QmRuSnZMMU5qYUdWdFlRQUFBQUUyVDZnUENnQUFDdTk3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lTM05FWldZaUxDSnVZVzFsYzNCaFkyVWlPaUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRhV2R5WVhScGIyNHVZWFp5YnlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYzNSeVlYUmxaM2xmWTJ4aGMzTWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2ljM1J5WVhSbFozbGZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sdDdJblI1Y0dVaU9pSnRZWEFpTENKMllXeDFaWE1pT2lKemRISnBibWNpZlN3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJaUxDSjBlWEJsSWpwYkltbHVkQ0lzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTJaZlpHVm1jeUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbUZ5Y21GNUlpd2lhWFJsYlhNaU9uc2lkSGx3WlNJNkluSmxZMjl5WkNJc0ltNWhiV1VpT2lKRFprUmxaaUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW10bGVYTndZV05sSWl3aWRIbHdaU0k2SW5OMGNtbHVaeUo5TEhzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2lZMjlzZFcxdVgzUjVjR1VpTENKMGVYQmxJanBiSW5OMGNtbHVaeUlzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTI5dGNHRnlZWFJ2Y2w5MGVYQmxJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbk4xWW1OdmJYQmhjbUYwYjNKZmRIbHdaU0lzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjIxdFpXNTBJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl6YVhwbElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkltdGxlVjlqWVdOb1pWOXphWHBsSWl3aWRIbHdaU0k2V3lKa2IzVmliR1VpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KbFlXUmZjbVZ3WVdseVgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaVpHOTFZbXhsSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdWZmIyNWZkM0pwZEdVaUxDSjBlWEJsSWpvaVltOXZiR1ZoYmlJc0ltUmxabUYxYkhRaU9tWmhiSE5sZlN4N0ltNWhiV1VpT2lKblkxOW5jbUZqWlY5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbVJsWm1GMWJIUmZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKclpYbGZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKdGFXNWZZMjl0Y0dGamRHbHZibDkwYUhKbGMyaHZiR1FpTENKMGVYQmxJanBiSW01MWJHd2lMQ0pwYm5RaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaWJXRjRYMk52YlhCaFkzUnBiMjVmZEdoeVpYTm9iMnhrSWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpYVc1MElsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXpZWFpsWDNCbGNtbHZaRjlwYmw5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMHNJbVJsWm1GMWJIUWlPakI5TEhzaWJtRnRaU0k2SW10bGVWOWpZV05vWlY5ellYWmxYM0JsY21sdlpGOXBibDl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwwc0ltUmxabUYxYkhRaU9qTTJNREI5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5clpYbHpYM1J2WDNOaGRtVWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSnBiblFpWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pYldWeVoyVmZjMmhoY21SelgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW1SdmRXSnNaU0pkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpwWkNJc0luUjVjR1VpT2xzaWFXNTBJaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjJ4MWJXNWZiV1YwWVdSaGRHRWlMQ0owZVhCbElqcGJleUowZVhCbElqb2lZWEp5WVhraUxDSnBkR1Z0Y3lJNmV5SjBlWEJsSWpvaWNtVmpiM0prSWl3aWJtRnRaU0k2SWtOdmJIVnRia1JsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pWW5sMFpYTWlmU3g3SW01aGJXVWlPaUoyWVd4cFpHRjBhVzl1WDJOc1lYTnpJaXdpZEhsd1pTSTZJbk4wY21sdVp5SjlMSHNpYm1GdFpTSTZJbWx1WkdWNFgzUjVjR1VpTENKMGVYQmxJanBiZXlKMGVYQmxJam9pWlc1MWJTSXNJbTVoYldVaU9pSkpibVJsZUZSNWNHVWlMQ0p6ZVcxaWIyeHpJanBiSWt0RldWTWlMQ0pEVlZOVVQwMGlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVKYm1SbGVGUjVjR1VpWFgwc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaWFXNWtaWGhmYm1GdFpTSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnBibVJsZUY5dmNIUnBiMjV6SWl3aWRIbHdaU0k2V3lKdWRXeHNJaXg3SW5SNWNHVWlPaUp0WVhBaUxDSjJZV3gxWlhNaU9pSnpkSEpwYm1jaWZWMHNJbVJsWm1GMWJIUWlPbTUxYkd4OVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NURiMngxYlc1RVpXWWlYWDE5TENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5d2NtOTJhV1JsY2lJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkTENKa1pXWmhkV3gwSWpvaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVEyOXVZM1Z5Y21WdWRFeHBibXRsWkVoaGMyaERZV05vWlZCeWIzWnBaR1Z5SW4wc2V5SnVZVzFsSWpvaWEyVjVYMkZzYVdGeklpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVlubDBaWE1pWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pWTI5dGNHRmpkR2x2Ymw5emRISmhkR1ZuZVNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpqYjIxd1lXTjBhVzl1WDNOMGNtRjBaV2Q1WDI5d2RHbHZibk1pTENKMGVYQmxJanBiSW01MWJHd2lMSHNpZEhsd1pTSTZJbTFoY0NJc0luWmhiSFZsY3lJNkluTjBjbWx1WnlKOVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaVkyOXRjSEpsYzNOcGIyNWZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sc2liblZzYkNJc2V5SjBlWEJsSWpvaWJXRndJaXdpZG1Gc2RXVnpJam9pYzNSeWFXNW5JbjFkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUppYkc5dmJWOW1hV3gwWlhKZlpuQmZZMmhoYm1ObElpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVpHOTFZbXhsSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5WFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1RFprUmxaaUpkZlgxOUxIc2libUZ0WlNJNkltUjFjbUZpYkdWZmQzSnBkR1Z6SWl3aWRIbHdaU0k2SW1KdmIyeGxZVzRpTENKa1pXWmhkV3gwSWpwMGNuVmxmVjBzSW1Gc2FXRnpaWE1pT2xzaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMjl1Wm1sbkxtRjJjbTh1UzNORVpXWWlYWDBBRFV0bGVVTmhZMmhsVTNCaFkyVUFBQUFCTmsrb0R3b0FBQVJ3R2t0bGVVTmhZMmhsVTNCaFkyVldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l4QUFJR0drdGxlVU5oWTJobFUzQmhZMlVTVTNSaGJtUmhjbVF6QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBOEQ4QW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBcGhBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBYVMyVjVRMkZqYUdWVGNHRmpaUkpUZEdGdVpHRnlaRElBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR3UHdDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NrRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJwTFpYbERZV05vWlZOd1lXTmxFbE4wWVc1a1lYSmtNUUFRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT0EvQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BS0lRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFFQUNVdGxlWE53WVdObE1RQUFBQUUyVDZnUENnQUFKdUFTUzJWNWMzQmhZMlV4Vm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ01RQUNOQkpMWlhsemNHRmpaVEVhVTNWd1pYSkVhWEpsWTNSSFF3QUtVM1Z3WlhJQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFBQUFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3RDBEd0FBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVEVRU21SaVkxVjBaamdBRUZOMFlXNWtZWEprQUZCdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMbFZVUmpoVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFhZ2hCQUpxWm1abVptYmsvQVFDQXZHa0NVRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVZWUkdPRlI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEErQThBQWhCbWIzSjBlWFIzYjFadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa2x1ZEdWblpYSlVlWEJsQWdBUVEyOXNkVzF1TkRJQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeEVrcGtZbU5CYzJOcGFRQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFYTmphV2xVZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWFnaEJBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UVhOamFXbFVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FQNFBBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxNUXhUZFhCbGNqRUFDbE4xY0dWeUFGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFCUWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVNYjI1blZIbHdaUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BTjRQQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVNCV1lXeDFaWE5YYVhSb1VYVnZkR1Z6QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJxQ0VFQW1wbVptWm1adVQ4QkFJQzhhUUpRYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNVZWRVk0Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0RjRHdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFTVUzVndaWEl5QUFwVGRYQmxjZ0JTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFVRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVRHOXVaMVI1Y0dVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdEZ0R3QUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpURU1VM1Z3WlhJekFBcFRkWEJsY2dCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VBVUc5eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VURzl1WjFSNWNHVUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3RGlEd0FBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVEVNVTNWd1pYSTBBQXBUZFhCbGNnQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQVVHOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1VlZSR09GUjVjR1VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0RrRHdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFTVUzVndaWEkxQUFwVGRYQmxjZ0JTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTVnOEFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhERk4xY0dWeU5nQUtVM1Z3WlhJQVhtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1VEdWNGFXTmhiRlZWU1VSVWVYQmxBRkJ2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xsVlVSamhVZVhCbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTZBOEFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhHbE4xY0dWeVEyOTFiblJsY2pFQUNsTjFjR1Z5QUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHb0lRUUNhbVptWm1abTVQd0VBZ0x4cEFtSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtOdmRXNTBaWEpEYjJ4MWJXNVVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFnQUFBQUFBQVBBL0FQSVBBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxNUkJLWkdKalRHOXVad0FRVTNSaGJtUmhjbVFBVUc5eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VURzl1WjFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQnFDRUVBbXBtWm1abVp1VDhCQUlDOGFRSlFiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1TWIyNW5WSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3RDZEd0FBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVEVTVTNSaGJtUmhjbVEwQUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBMWc4QUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeEVFbHVaR1Y0WldReUFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRWE5qYVdsVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTdBOEFBaEppYVhKMGFHUmhkR1ZRYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNU1iMjVuVkhsd1pRSUFKRFl5TmprM01qYzBOamcyTkRZeE56UTJOUUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVEVXU21SaVkwbHVkR1ZuWlhJQUVGTjBZVzVrWVhKa0FGWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtsdWRHVm5aWEpVZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWFnaEJBSnFabVptWm1iay9BUUNBdkdrQ1ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1U1c1MFpXZGxjbFI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEE5ZzhBQWdJcVVHOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1VlZSR09GUjVjR1VDQUJCRGIyeDFiVzQwTWdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFU1UzUmhibVJoY21RekFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTFBOEFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhFRWx1WkdWNFpXUXhBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UVhOamFXbFVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEE2ZzhBQWhKaWFYSjBhR1JoZEdWUWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVNYjI1blZIbHdaUUFBQUNRMk1qWTVOekkzTkRZNE5qUTJNVGMwTmpVQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeEVsTjBZVzVrWVhKa01nQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FOSVBBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxNUkpUZEdGdVpHRnlaREVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0RRRHdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFd1UzUmhibVJoY21SRWVXNWhiV2xqUTI5dGNHOXphWFJsQUJCVGRHRnVaR0Z5WkFDa0FtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UkhsdVlXMXBZME52YlhCdmMybDBaVlI1Y0dVb2REMCtiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1VWFXMWxWVlZKUkZSNWNHVXNZajArYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVXBBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFhZ2hCQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BSUlRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVNKVGRHRnVaR0Z5WkVOdmJYQnZjMmwwWlFBUVUzUmhibVJoY21RQTRnSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtOdmJYQnZjMmwwWlZSNWNHVW9iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVc2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVVYVcxbFZWVkpSRlI1Y0dVc2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVKYm5SbFoyVnlWSGx3WlNrQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFCcUNFRUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QWdCQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhFa3BrWW1OQ2VYUmxjd0FRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFhZ2hCQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BUHdQQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVNCVGRHRnVaR0Z5WkVsdWRHVm5aWEl4QUJCVGRHRnVaR0Z5WkFCV2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVKYm5SbFoyVnlWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdEdUR3QUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpURVFRMjkxYm5SbGNqRUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFHb0lRUUNhbVptWm1abTVQd0VBZ0x4cEFtSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtOdmRXNTBaWEpEYjJ4MWJXNVVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFnQUFBQUFBQVBBL0FQQVBBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxNUnBUZEdGdVpHRnlaRXh2Ym1jeUFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTJnOEFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhHbE4wWVc1a1lYSmtURzl1WnpFQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdEWUR3QUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFBQUJBQWxMWlhsemNHRmpaVElBQUFBQk5rK29Ed29BQUFlcEVrdGxlWE53WVdObE1sWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVzYjJOaGRHOXlMbE5wYlhCc1pWTjBjbUYwWldkNUFBSWtjbVZ3YkdsallYUnBiMjVmWm1GamRHOXlBakVBQWdvU1MyVjVjM0JoWTJVeUVFbHVaR1Y0WldReEFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRWE5qYVdsVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QWpCQUFBaEppYVhKMGFHUmhkR1ZRYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNU1iMjVuVkhsd1pRQUFBQ1EyTWpZNU56STNORFk0TmpRMk1UYzBOalVBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFTUzJWNWMzQmhZMlV5RWxOMFlXNWtZWEprTXdBUVUzUmhibVJoY21RQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQUlZUUFBQUFabTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OaFkyaGxMbE5sY21saGJHbDZhVzVuUTJGamFHVlFjbTkyYVdSbGNnQUNmbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtTnZiWEJoWTNScGIyNHVVMmw2WlZScFpYSmxaRU52YlhCaFkzUnBiMjVUZEhKaGRHVm5lUUlBQWdBQUVrdGxlWE53WVdObE1oSlRkR0Z1WkdGeVpERUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q0VFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVElNVTNWd1pYSXpBQXBUZFhCbGNnQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBaUJBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeURGTjFjR1Z5TkFBS1UzVndaWElBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBRmh2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xsUnBiV1ZWVlVsRVZIbHdaUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BSW9RQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFFQUNVdGxlWE53WVdObE13QUFBQUUyVDZnUENnQUFBMUFTUzJWNWMzQmhZMlV6Vm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ05RQUNCQkpMWlhsemNHRmpaVE1RU1c1a1pYaGxaREVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1QmMyTnBhVlI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NRRUFBQ0VtSnBjblJvWkdGMFpWQnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGt4dmJtZFVlWEJsQUFBQUpEWXlOamszTWpjME5qZzJORFl4TnpRMk5RQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpUTVNVM1JoYm1SaGNtUXhBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEFqaEFBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFBQVFBSlMyVjVjM0JoWTJVMEFBQUFBVFpQcUE4S0FBQUhoaEpMWlhsemNHRmpaVFJXYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdWJHOWpZWFJ2Y2k1VGFXMXdiR1ZUZEhKaGRHVm5lUUFDSkhKbGNHeHBZMkYwYVc5dVgyWmhZM1J2Y2dJekFBSUtFa3RsZVhOd1lXTmxOQkpUZEdGdVpHRnlaRE1BRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NVRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRRU1UzUmhibVJoY21ReEFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QWtoQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVTBERk4xY0dWeU13QUtVM1Z3WlhJQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BSllRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTkF4VGRYQmxjalFBQ2xOMWNHVnlBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRQlliM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1VWFXMWxWVlZKUkZSNWNHVUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q1lFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVFFNVTNWd1pYSTFBQXBUZFhCbGNnQlliM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1VWFXMWxWVlZKUkZSNWNHVUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QW1oQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBUUFKUzJWNWMzQmhZMlUxQUFBQUFUWlBxQThLQUFBRERSSkxaWGx6Y0dGalpUVldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l5QUFJRUVrdGxlWE53WVdObE5SSlRkR0Z1WkdGeVpERUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q2NFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVFVRUTI5MWJuUmxjakVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrTnZkVzUwWlhKRGIyeDFiVzVVZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BSjRRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFFQUNVdGxlWE53WVdObE5nQUFBQUUyVDZnUENnQUFBZllTUzJWNWMzQmhZMlUyVm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ01RQUNBaEpMWlhsemNHRmpaVFlRU1c1a1pYaGxaREVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1QmMyTnBhVlI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NnRUFBQ0VtSnBjblJvWkdGMFpWQnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGt4dmJtZFVlWEJsQUFBQUpEWXlOamszTWpjME5qZzJORFl4TnpRMk5RQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFBQUJBQkJPYjBOdmJXMXBkR3h2WjFOd1lXTmxBQUFBQVRaUHFBOEtBQUFCdWlCT2IwTnZiVzFwZEd4dloxTndZV05sVm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ01RQUNBaUJPYjBOdmJXMXBkR3h2WjFOd1lXTmxFbE4wWVc1a1lYSmtNUUFRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BS3dRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFBQURWSnZkME5oWTJobFUzQmhZMlVBQUFBQk5rK29Ed29BQUFNV0dsSnZkME5oWTJobFUzQmhZMlZXYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdWJHOWpZWFJ2Y2k1VGFXMXdiR1ZUZEhKaGRHVm5lUUFDSkhKbGNHeHBZMkYwYVc5dVgyWmhZM1J2Y2dJeEFBSUVHbEp2ZDBOaFkyaGxVM0JoWTJVUVEyRmphR1ZrUTBZQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFCWlFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDcUVBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCcFNiM2REWVdOb1pWTndZV05sSEVOR1YybDBhRzkxZEVOaFkyaGxBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEFxQkFBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFBQVZwdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0YVdkeVlYUnBiMjR1UVdSa1MyVjVjM0JoWTJVRUVrdGxlWE53WVdObE1WWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVzYjJOaGRHOXlMbE5wYlhCc1pWTjBjbUYwWldkNUFBSWtjbVZ3YkdsallYUnBiMjVmWm1GamRHOXlBakVBQWpRU1MyVjVjM0JoWTJVeEdsTjFjR1Z5UkdseVpXTjBSME1BQ2xOMWNHVnlBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFBQUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBOUE4QUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeEVFcGtZbU5WZEdZNEFCQlRkR0Z1WkdGeVpBQlFiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1VlZFWTRWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdvSVFRQ2FtWm1abVptNVB3RUFnTHhwQWxCdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMbFZVUmpoVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQVBnUEFBSVFabTl5ZEhsMGQyOVdiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1SmJuUmxaMlZ5Vkhsd1pRSUFFRU52YkhWdGJqUXlBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxNUkpLWkdKalFYTmphV2tBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0Z6WTJscFZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR29JUVFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrRnpZMmxwVkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0QrRHdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFTVUzVndaWEl4QUFwVGRYQmxjZ0JTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFVRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVRHOXVaMVI1Y0dVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdEZUR3QUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpURWdWbUZzZFdWelYybDBhRkYxYjNSbGN3QVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWFnaEJBSnFabVptWm1iay9BUUNBdkdrQ1VHOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1VlZSR09GUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTNBOEFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhERk4xY0dWeU1nQUtVM1Z3WlhJQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUZCdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa3h2Ym1kVWVYQmxBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEE0QThBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFTUzJWNWMzQmhZMlV4REZOMWNHVnlNd0FLVTNWd1pYSUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFGQnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGt4dmJtZFVlWEJsQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBNGc4QUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeERGTjFjR1Z5TkFBS1UzVndaWElBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBRkJ2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xsVlVSamhVZVhCbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTVBOEFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhERk4xY0dWeU5RQUtVM1Z3WlhJQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BT1lQQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVF4VGRYQmxjallBQ2xOMWNHVnlBRjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xreGxlR2xqWVd4VlZVbEVWSGx3WlFCUWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVWVkVZNFZIbHdaUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BT2dQQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVJwVGRYQmxja052ZFc1MFpYSXhBQXBUZFhCbGNnQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJxQ0VFQW1wbVptWm1adVQ4QkFJQzhhUUppYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNURiM1Z1ZEdWeVEyOXNkVzF1Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0lBQUFBQUFBRHdQd0R5RHdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFUVNtUmlZMHh2Ym1jQUVGTjBZVzVrWVhKa0FGQnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGt4dmJtZFVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBYWdoQkFKcVptWm1abWJrL0FRQ0F2R2tDVUc5eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VURzl1WjFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBK2c4QUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeEVsTjBZVzVrWVhKa05BQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FOWVBBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxNUkJKYm1SbGVHVmtNZ0FRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtGelkybHBWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BT3dQQUFJU1ltbHlkR2hrWVhSbFVHOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1VEc5dVoxUjVjR1VDQUNRMk1qWTVOekkzTkRZNE5qUTJNVGMwTmpVQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVeEZrcGtZbU5KYm5SbFoyVnlBQkJUZEdGdVpHRnlaQUJXYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUpiblJsWjJWeVZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBR29JUVFDYW1abVptWm01UHdFQWdMeHBBbFp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrbHVkR1ZuWlhKVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQVBZUEFBSUNLbEJ2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xsVlVSamhVZVhCbEFnQVFRMjlzZFcxdU5ESUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhFbE4wWVc1a1lYSmtNd0FRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BTlFQQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVJCSmJtUmxlR1ZrTVFBUVUzUmhibVJoY21RQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrRnpZMmxwVkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQU9vUEFBSVNZbWx5ZEdoa1lYUmxVRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVRHOXVaMVI1Y0dVQUFBQWtOakkyT1RjeU56UTJPRFkwTmpFM05EWTFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxNUkpUZEdGdVpHRnlaRElBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0RTRHdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFU1UzUmhibVJoY21ReEFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QTBBOEFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXhNRk4wWVc1a1lYSmtSSGx1WVcxcFkwTnZiWEJ2YzJsMFpRQVFVM1JoYm1SaGNtUUFwQUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrUjVibUZ0YVdORGIyMXdiM05wZEdWVWVYQmxLSFE5UG05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VWR2x0WlZWVlNVUlVlWEJsTEdJOVBtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsS1FJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdvSVFRQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDQ0VBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpURWlVM1JoYm1SaGNtUkRiMjF3YjNOcGRHVUFFRk4wWVc1a1lYSmtBT0lDYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNURiMjF3YjNOcGRHVlVlWEJsS0c5eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxMRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVZHbHRaVlZWU1VSVWVYQmxMRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVNXNTBaV2RsY2xSNWNHVXBBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFhZ2hCQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BSUFRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVJKS1pHSmpRbmwwWlhNQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUdvSVFRQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdEOER3QUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpURWdVM1JoYm1SaGNtUkpiblJsWjJWeU1RQVFVM1JoYm1SaGNtUUFWbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVNXNTBaV2RsY2xSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEE3ZzhBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFTUzJWNWMzQmhZMlV4RUVOdmRXNTBaWEl4QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJxQ0VFQW1wbVptWm1adVQ4QkFJQzhhUUppYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNURiM1Z1ZEdWeVEyOXNkVzF1Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0lBQUFBQUFBRHdQd0R3RHdBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRFYVUzUmhibVJoY21STWIyNW5NZ0FRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BTm9QQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTVJwVGRHRnVaR0Z5WkV4dmJtY3hBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEEyQThBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFBQVE9PQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5taWdyYXRpb24uS2V5c3BhY2UyLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5taWdyYXRpb24uS2V5c3BhY2UyLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEyODQ0My4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIubWlncmF0aW9uLktleXNwYWNlMi5iaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1Z2C9EbDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVRXbG5jbUYwYVc5dUlpd2libUZ0WlhOd1lXTmxJam9pYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV2xuY21GMGFXOXVMbUYyY204aUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSnZiR1JmZG1WeWMybHZiaUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbVpwZUdWa0lpd2libUZ0WlNJNklsVlZTVVFpTENKdVlXMWxjM0JoWTJVaU9pSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzUxZEdsc2N5NWhkbkp2SWl3aWMybDZaU0k2TVRaOWZTeDdJbTVoYldVaU9pSnVaWGRmZG1WeWMybHZiaUlzSW5SNWNHVWlPaUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1MWRHbHNjeTVoZG5KdkxsVlZTVVFpZlN4N0ltNWhiV1VpT2lKeWIzZGZiWFYwWVhScGIyNGlMQ0owZVhCbElqb2lZbmwwWlhNaWZTeDdJbTVoYldVaU9pSmpiR0Z6YzI1aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2liV2xuY21GMGFXOXVJaXdpZEhsd1pTSTZXM3NpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkJaR1JEYjJ4MWJXNUdZVzFwYkhraUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSmpaaUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkRaa1JsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltdGxlWE53WVdObElpd2lkSGx3WlNJNkluTjBjbWx1WnlKOUxIc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pWTI5c2RXMXVYM1I1Y0dVaUxDSjBlWEJsSWpwYkluTjBjbWx1WnlJc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaVkyOXRjR0Z5WVhSdmNsOTBlWEJsSWl3aWRIbHdaU0k2V3lKemRISnBibWNpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5OMVltTnZiWEJoY21GMGIzSmZkSGx3WlNJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKamIyMXRaVzUwSWl3aWRIbHdaU0k2V3lKemRISnBibWNpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5emFYcGxJaXdpZEhsd1pTSTZXeUprYjNWaWJHVWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbXRsZVY5allXTm9aVjl6YVhwbElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSmxZV1JmY21Wd1lXbHlYMk5vWVc1alpTSXNJblI1Y0dVaU9sc2laRzkxWW14bElpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnlaWEJzYVdOaGRHVmZiMjVmZDNKcGRHVWlMQ0owZVhCbElqb2lZbTl2YkdWaGJpSXNJbVJsWm1GMWJIUWlPbVpoYkhObGZTeDdJbTVoYldVaU9pSm5ZMTluY21GalpWOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW1SbFptRjFiSFJmZG1Gc2FXUmhkR2x2Ymw5amJHRnpjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnJaWGxmZG1Gc2FXUmhkR2x2Ymw5amJHRnpjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnRhVzVmWTI5dGNHRmpkR2x2Ymw5MGFISmxjMmh2YkdRaUxDSjBlWEJsSWpwYkltNTFiR3dpTENKcGJuUWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2liV0Y0WDJOdmJYQmhZM1JwYjI1ZmRHaHlaWE5vYjJ4a0lpd2lkSGx3WlNJNld5SnVkV3hzSWl3aWFXNTBJbDBzSW1SbFptRjFiSFFpT201MWJHeDlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl6WVhabFgzQmxjbWx2WkY5cGJsOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDBzSW1SbFptRjFiSFFpT2pCOUxIc2libUZ0WlNJNkltdGxlVjlqWVdOb1pWOXpZWFpsWDNCbGNtbHZaRjlwYmw5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMHNJbVJsWm1GMWJIUWlPak0yTURCOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXJaWGx6WDNSdlgzTmhkbVVpTENKMGVYQmxJanBiSW01MWJHd2lMQ0pwYm5RaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaWJXVnlaMlZmYzJoaGNtUnpYMk5vWVc1alpTSXNJblI1Y0dVaU9sc2liblZzYkNJc0ltUnZkV0pzWlNKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKcFpDSXNJblI1Y0dVaU9sc2lhVzUwSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKamIyeDFiVzVmYldWMFlXUmhkR0VpTENKMGVYQmxJanBiZXlKMGVYQmxJam9pWVhKeVlYa2lMQ0pwZEdWdGN5STZleUowZVhCbElqb2ljbVZqYjNKa0lpd2libUZ0WlNJNklrTnZiSFZ0YmtSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaVlubDBaWE1pZlN4N0ltNWhiV1VpT2lKMllXeHBaR0YwYVc5dVgyTnNZWE56SWl3aWRIbHdaU0k2SW5OMGNtbHVaeUo5TEhzaWJtRnRaU0k2SW1sdVpHVjRYM1I1Y0dVaUxDSjBlWEJsSWpwYmV5SjBlWEJsSWpvaVpXNTFiU0lzSW01aGJXVWlPaUpKYm1SbGVGUjVjR1VpTENKemVXMWliMnh6SWpwYklrdEZXVk1pTENKRFZWTlVUMDBpWFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1SmJtUmxlRlI1Y0dVaVhYMHNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lhVzVrWlhoZmJtRnRaU0lzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpwYm1SbGVGOXZjSFJwYjI1eklpd2lkSGx3WlNJNld5SnVkV3hzSWl4N0luUjVjR1VpT2lKdFlYQWlMQ0oyWVd4MVpYTWlPaUp6ZEhKcGJtY2lmVjBzSW1SbFptRjFiSFFpT201MWJHeDlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVEYjJ4MWJXNUVaV1lpWFgxOUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXdjbTkyYVdSbGNpSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZExDSmtaV1poZFd4MElqb2liM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVRMjl1WTNWeWNtVnVkRXhwYm10bFpFaGhjMmhEWVdOb1pWQnliM1pwWkdWeUluMHNleUp1WVcxbElqb2lhMlY1WDJGc2FXRnpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2lZbmwwWlhNaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaVkyOXRjR0ZqZEdsdmJsOXpkSEpoZEdWbmVTSXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKamIyMXdZV04wYVc5dVgzTjBjbUYwWldkNVgyOXdkR2x2Ym5NaUxDSjBlWEJsSWpwYkltNTFiR3dpTEhzaWRIbHdaU0k2SW0xaGNDSXNJblpoYkhWbGN5STZJbk4wY21sdVp5SjlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2lZMjl0Y0hKbGMzTnBiMjVmYjNCMGFXOXVjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNleUowZVhCbElqb2liV0Z3SWl3aWRtRnNkV1Z6SWpvaWMzUnlhVzVuSW4xZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKaWJHOXZiVjltYVd4MFpYSmZabkJmWTJoaGJtTmxJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2laRzkxWW14bElsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NURaa1JsWmlKZGZYMWRmU3g3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lSSEp2Y0VOdmJIVnRia1poYldsc2VTSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbXR6Ym1GdFpTSXNJblI1Y0dVaU9pSnpkSEpwYm1jaWZTeDdJbTVoYldVaU9pSmpabTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4xZGZTeDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVFXUmtTMlY1YzNCaFkyVWlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUpyY3lJc0luUjVjR1VpT25zaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpMYzBSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaWMzUnlZWFJsWjNsZlkyeGhjM01pTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYzNSeVlYUmxaM2xmYjNCMGFXOXVjeUlzSW5SNWNHVWlPbHQ3SW5SNWNHVWlPaUp0WVhBaUxDSjJZV3gxWlhNaU9pSnpkSEpwYm1jaWZTd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnlaWEJzYVdOaGRHbHZibDltWVdOMGIzSWlMQ0owZVhCbElqcGJJbWx1ZENJc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaVkyWmZaR1ZtY3lJc0luUjVjR1VpT25zaWRIbHdaU0k2SW1GeWNtRjVJaXdpYVhSbGJYTWlPaUpEWmtSbFppSjlmU3g3SW01aGJXVWlPaUprZFhKaFlteGxYM2R5YVhSbGN5SXNJblI1Y0dVaU9pSmliMjlzWldGdUlpd2laR1ZtWVhWc2RDSTZkSEoxWlgxZExDSmhiR2xoYzJWeklqcGJJbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OdmJtWnBaeTVoZG5KdkxrdHpSR1ZtSWwxOWZWMTlMSHNpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkVjbTl3UzJWNWMzQmhZMlVpTENKbWFXVnNaSE1pT2x0N0ltNWhiV1VpT2lKcmMyNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pVlhCa1lYUmxTMlY1YzNCaFkyVWlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUp2YkdSTGN5SXNJblI1Y0dVaU9pSkxjMFJsWmlKOUxIc2libUZ0WlNJNkltNWxkMHR6SWl3aWRIbHdaU0k2SWt0elJHVm1JbjFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pVlhCa1lYUmxRMjlzZFcxdVJtRnRhV3g1SWl3aVptbGxiR1J6SWpwYmV5SnVZVzFsSWpvaWJXVjBZV1JoZEdFaUxDSjBlWEJsSWpvaVEyWkVaV1lpZlYxOVhYMWRmYWh4QjRCM1dSSGhBQUQranI3cTJmeW9jUWVCZDFrUjRRQUEvbzYrNnRuOHlyTUJBQVp6ZVhOMFpXMEFKR0U0TnpFd056Z3hMVGMzTlRrdE1URmxNUzB3TURBd0xXWmxPR1ZpWldWaFpEbG1Zd0FBQUFFQUFBQURBUUFBQUFPQUFBQUFnQUFBQUFBQUFBQUFBQUFKQUF0QmRuSnZMMU5qYUdWdFlRQUFBQUUyVDZnUCtRQUFDdTk3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lTM05FWldZaUxDSnVZVzFsYzNCaFkyVWlPaUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRhV2R5WVhScGIyNHVZWFp5YnlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYzNSeVlYUmxaM2xmWTJ4aGMzTWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2ljM1J5WVhSbFozbGZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sdDdJblI1Y0dVaU9pSnRZWEFpTENKMllXeDFaWE1pT2lKemRISnBibWNpZlN3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJaUxDSjBlWEJsSWpwYkltbHVkQ0lzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTJaZlpHVm1jeUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbUZ5Y21GNUlpd2lhWFJsYlhNaU9uc2lkSGx3WlNJNkluSmxZMjl5WkNJc0ltNWhiV1VpT2lKRFprUmxaaUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW10bGVYTndZV05sSWl3aWRIbHdaU0k2SW5OMGNtbHVaeUo5TEhzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2lZMjlzZFcxdVgzUjVjR1VpTENKMGVYQmxJanBiSW5OMGNtbHVaeUlzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTI5dGNHRnlZWFJ2Y2w5MGVYQmxJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbk4xWW1OdmJYQmhjbUYwYjNKZmRIbHdaU0lzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjIxdFpXNTBJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl6YVhwbElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkltdGxlVjlqWVdOb1pWOXphWHBsSWl3aWRIbHdaU0k2V3lKa2IzVmliR1VpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KbFlXUmZjbVZ3WVdseVgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaVpHOTFZbXhsSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdWZmIyNWZkM0pwZEdVaUxDSjBlWEJsSWpvaVltOXZiR1ZoYmlJc0ltUmxabUYxYkhRaU9tWmhiSE5sZlN4N0ltNWhiV1VpT2lKblkxOW5jbUZqWlY5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbVJsWm1GMWJIUmZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKclpYbGZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKdGFXNWZZMjl0Y0dGamRHbHZibDkwYUhKbGMyaHZiR1FpTENKMGVYQmxJanBiSW01MWJHd2lMQ0pwYm5RaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaWJXRjRYMk52YlhCaFkzUnBiMjVmZEdoeVpYTm9iMnhrSWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpYVc1MElsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXpZWFpsWDNCbGNtbHZaRjlwYmw5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMHNJbVJsWm1GMWJIUWlPakI5TEhzaWJtRnRaU0k2SW10bGVWOWpZV05vWlY5ellYWmxYM0JsY21sdlpGOXBibDl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwwc0ltUmxabUYxYkhRaU9qTTJNREI5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5clpYbHpYM1J2WDNOaGRtVWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSnBiblFpWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pYldWeVoyVmZjMmhoY21SelgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW1SdmRXSnNaU0pkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpwWkNJc0luUjVjR1VpT2xzaWFXNTBJaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjJ4MWJXNWZiV1YwWVdSaGRHRWlMQ0owZVhCbElqcGJleUowZVhCbElqb2lZWEp5WVhraUxDSnBkR1Z0Y3lJNmV5SjBlWEJsSWpvaWNtVmpiM0prSWl3aWJtRnRaU0k2SWtOdmJIVnRia1JsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pWW5sMFpYTWlmU3g3SW01aGJXVWlPaUoyWVd4cFpHRjBhVzl1WDJOc1lYTnpJaXdpZEhsd1pTSTZJbk4wY21sdVp5SjlMSHNpYm1GdFpTSTZJbWx1WkdWNFgzUjVjR1VpTENKMGVYQmxJanBiZXlKMGVYQmxJam9pWlc1MWJTSXNJbTVoYldVaU9pSkpibVJsZUZSNWNHVWlMQ0p6ZVcxaWIyeHpJanBiSWt0RldWTWlMQ0pEVlZOVVQwMGlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVKYm1SbGVGUjVjR1VpWFgwc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaWFXNWtaWGhmYm1GdFpTSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnBibVJsZUY5dmNIUnBiMjV6SWl3aWRIbHdaU0k2V3lKdWRXeHNJaXg3SW5SNWNHVWlPaUp0WVhBaUxDSjJZV3gxWlhNaU9pSnpkSEpwYm1jaWZWMHNJbVJsWm1GMWJIUWlPbTUxYkd4OVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NURiMngxYlc1RVpXWWlYWDE5TENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5d2NtOTJhV1JsY2lJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkTENKa1pXWmhkV3gwSWpvaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVEyOXVZM1Z5Y21WdWRFeHBibXRsWkVoaGMyaERZV05vWlZCeWIzWnBaR1Z5SW4wc2V5SnVZVzFsSWpvaWEyVjVYMkZzYVdGeklpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVlubDBaWE1pWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pWTI5dGNHRmpkR2x2Ymw5emRISmhkR1ZuZVNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpqYjIxd1lXTjBhVzl1WDNOMGNtRjBaV2Q1WDI5d2RHbHZibk1pTENKMGVYQmxJanBiSW01MWJHd2lMSHNpZEhsd1pTSTZJbTFoY0NJc0luWmhiSFZsY3lJNkluTjBjbWx1WnlKOVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaVkyOXRjSEpsYzNOcGIyNWZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sc2liblZzYkNJc2V5SjBlWEJsSWpvaWJXRndJaXdpZG1Gc2RXVnpJam9pYzNSeWFXNW5JbjFkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUppYkc5dmJWOW1hV3gwWlhKZlpuQmZZMmhoYm1ObElpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVpHOTFZbXhsSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5WFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1RFprUmxaaUpkZlgxOUxIc2libUZ0WlNJNkltUjFjbUZpYkdWZmQzSnBkR1Z6SWl3aWRIbHdaU0k2SW1KdmIyeGxZVzRpTENKa1pXWmhkV3gwSWpwMGNuVmxmVjBzSW1Gc2FXRnpaWE1pT2xzaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMjl1Wm1sbkxtRjJjbTh1UzNORVpXWWlYWDBBRFV0bGVVTmhZMmhsVTNCaFkyVUFBQUFCTmsrb0Qva0FBQVJ3R2t0bGVVTmhZMmhsVTNCaFkyVldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l4QUFJR0drdGxlVU5oWTJobFUzQmhZMlVTVTNSaGJtUmhjbVF6QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBOEQ4QW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBcGhBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBYVMyVjVRMkZqYUdWVGNHRmpaUkpUZEdGdVpHRnlaRElBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR3UHdDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NrRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJwTFpYbERZV05vWlZOd1lXTmxFbE4wWVc1a1lYSmtNUUFRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT0EvQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BS0lRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFFQUNVdGxlWE53WVdObE1nQUFBQUUyVDZnUCtRQUFCNmtTUzJWNWMzQmhZMlV5Vm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ01RQUNDaEpMWlhsemNHRmpaVElRU1c1a1pYaGxaREVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1QmMyTnBhVlI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NNRUFBQ0VtSnBjblJvWkdGMFpWQnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGt4dmJtZFVlWEJsQUFBQUpEWXlOamszTWpjME5qZzJORFl4TnpRMk5RQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpUSVNVM1JoYm1SaGNtUXpBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEFoaEFBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFTUzJWNWMzQmhZMlV5RWxOMFlXNWtZWEprTVFBUVUzUmhibVJoY21RQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQUlRUUFBQUFabTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OaFkyaGxMbE5sY21saGJHbDZhVzVuUTJGamFHVlFjbTkyYVdSbGNnQUNmbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtTnZiWEJoWTNScGIyNHVVMmw2WlZScFpYSmxaRU52YlhCaFkzUnBiMjVUZEhKaGRHVm5lUUlBQWdBQUVrdGxlWE53WVdObE1neFRkWEJsY2pNQUNsTjFjR1Z5QUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q0lFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVElNVTNWd1pYSTBBQXBUZFhCbGNnQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQVdHOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1VkdsdFpWVlZTVVJVZVhCbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QWloQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBUUFKUzJWNWMzQmhZMlV6QUFBQUFUWlBxQS81QUFBRFVCSkxaWGx6Y0dGalpUTldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0kxQUFJRUVrdGxlWE53WVdObE14QkpibVJsZUdWa01RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0Z6WTJscFZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKQVFBQUlTWW1seWRHaGtZWFJsVUc5eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VURzl1WjFSNWNHVUFBQUFrTmpJMk9UY3lOelEyT0RZME5qRTNORFkxQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBRWt0bGVYTndZV05sTXhKVGRHRnVaR0Z5WkRFQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDT0VBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFBQUJBQWxMWlhsemNHRmpaVFFBQUFBQk5rK29EL2tBQUFlR0VrdGxlWE53WVdObE5GWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVzYjJOaGRHOXlMbE5wYlhCc1pWTjBjbUYwWldkNUFBSWtjbVZ3YkdsallYUnBiMjVmWm1GamRHOXlBak1BQWdvU1MyVjVjM0JoWTJVMEVsTjBZVzVrWVhKa013QVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKUVFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxOQkpUZEdGdVpHRnlaREVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NTRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRRTVUzVndaWEl6QUFwVGRYQmxjZ0JTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QWxoQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVTBERk4xY0dWeU5BQUtVM1Z3WlhJQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUZodmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMbFJwYldWVlZVbEVWSGx3WlFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQUpnUUFBQUFabTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OaFkyaGxMbE5sY21saGJHbDZhVzVuUTJGamFHVlFjbTkyYVdSbGNnQUNmbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtTnZiWEJoWTNScGIyNHVVMmw2WlZScFpYSmxaRU52YlhCaFkzUnBiMjVUZEhKaGRHVm5lUUlBQWdBQUVrdGxlWE53WVdObE5BeFRkWEJsY2pVQUNsTjFjR1Z5QUZodmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMbFJwYldWVlZVbEVWSGx3WlFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NhRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUFBQkFBbExaWGx6Y0dGalpUVUFBQUFCTmsrb0Qva0FBQU1ORWt0bGVYTndZV05sTlZadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNXNiMk5oZEc5eUxsTnBiWEJzWlZOMGNtRjBaV2Q1QUFJa2NtVndiR2xqWVhScGIyNWZabUZqZEc5eUFqSUFBZ1FTUzJWNWMzQmhZMlUxRWxOMFlXNWtZWEprTVFBUVUzUmhibVJoY21RQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQUp3UUFBQUFabTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OaFkyaGxMbE5sY21saGJHbDZhVzVuUTJGamFHVlFjbTkyYVdSbGNnQUNmbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtTnZiWEJoWTNScGIyNHVVMmw2WlZScFpYSmxaRU52YlhCaFkzUnBiMjVUZEhKaGRHVm5lUUlBQWdBQUVrdGxlWE53WVdObE5SQkRiM1Z1ZEdWeU1RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1ltOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UTI5MWJuUmxja052YkhWdGJsUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QW5oQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBUUFKUzJWNWMzQmhZMlUyQUFBQUFUWlBxQS81QUFBQjloSkxaWGx6Y0dGalpUWldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l4QUFJQ0VrdGxlWE53WVdObE5oQkpibVJsZUdWa01RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0Z6WTJscFZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FLQVFBQUlTWW1seWRHaGtZWFJsVUc5eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VURzl1WjFSNWNHVUFBQUFrTmpJMk9UY3lOelEyT0RZME5qRTNORFkxQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFFQUVFNXZRMjl0YldsMGJHOW5VM0JoWTJVQUFBQUJOaytvRC9rQUFBRzZJRTV2UTI5dGJXbDBiRzluVTNCaFkyVldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l4QUFJQ0lFNXZRMjl0YldsMGJHOW5VM0JoWTJVU1UzUmhibVJoY21ReEFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QXJCQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBQUFOVW05M1EyRmphR1ZUY0dGalpRQUFBQUUyVDZnUCtRQUFBeFlhVW05M1EyRmphR1ZUY0dGalpWWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVzYjJOaGRHOXlMbE5wYlhCc1pWTjBjbUYwWldkNUFBSWtjbVZ3YkdsallYUnBiMjVmWm1GamRHOXlBakVBQWdRYVVtOTNRMkZqYUdWVGNHRmpaUkJEWVdOb1pXUkRSZ0FRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBRmxBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BS29RQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBR2xKdmQwTmhZMmhsVTNCaFkyVWNRMFpYYVhSb2IzVjBRMkZqYUdVQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDb0VBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFBQUJXbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMXBaM0poZEdsdmJpNUJaR1JMWlhsemNHRmpaUVFTUzJWNWMzQmhZMlV5Vm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ01RQUNDaEpMWlhsemNHRmpaVElRU1c1a1pYaGxaREVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1QmMyTnBhVlI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NNRUFBQ0VtSnBjblJvWkdGMFpWQnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGt4dmJtZFVlWEJsQUFBQUpEWXlOamszTWpjME5qZzJORFl4TnpRMk5RQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpUSVNVM1JoYm1SaGNtUXpBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEFoaEFBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFTUzJWNWMzQmhZMlV5RWxOMFlXNWtZWEprTVFBUVUzUmhibVJoY21RQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQUlRUUFBQUFabTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OaFkyaGxMbE5sY21saGJHbDZhVzVuUTJGamFHVlFjbTkyYVdSbGNnQUNmbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtTnZiWEJoWTNScGIyNHVVMmw2WlZScFpYSmxaRU52YlhCaFkzUnBiMjVUZEhKaGRHVm5lUUlBQWdBQUVrdGxlWE53WVdObE1neFRkWEJsY2pNQUNsTjFjR1Z5QUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q0lFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVElNVTNWd1pYSTBBQXBUZFhCbGNnQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQVdHOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1VkdsdFpWVlZTVVJVZVhCbEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QWloQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBUT09ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLm1pZ3JhdGlvbi5LZXlzcGFjZTMuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLm1pZ3JhdGlvbi5LZXlzcGFjZTMuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2EwOTJlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5taWdyYXRpb24uS2V5c3BhY2UzLmJpbgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUm0L0RsN0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pVFdsbmNtRjBhVzl1SWl3aWJtRnRaWE53WVdObElqb2liM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXbG5jbUYwYVc5dUxtRjJjbThpTENKbWFXVnNaSE1pT2x0N0ltNWhiV1VpT2lKdmJHUmZkbVZ5YzJsdmJpSXNJblI1Y0dVaU9uc2lkSGx3WlNJNkltWnBlR1ZrSWl3aWJtRnRaU0k2SWxWVlNVUWlMQ0p1WVcxbGMzQmhZMlVpT2lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNTFkR2xzY3k1aGRuSnZJaXdpYzJsNlpTSTZNVFo5ZlN4N0ltNWhiV1VpT2lKdVpYZGZkbVZ5YzJsdmJpSXNJblI1Y0dVaU9pSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzUxZEdsc2N5NWhkbkp2TGxWVlNVUWlmU3g3SW01aGJXVWlPaUp5YjNkZmJYVjBZWFJwYjI0aUxDSjBlWEJsSWpvaVlubDBaWE1pZlN4N0ltNWhiV1VpT2lKamJHRnpjMjVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaWJXbG5jbUYwYVc5dUlpd2lkSGx3WlNJNlczc2lkSGx3WlNJNkluSmxZMjl5WkNJc0ltNWhiV1VpT2lKQlpHUkRiMngxYlc1R1lXMXBiSGtpTENKbWFXVnNaSE1pT2x0N0ltNWhiV1VpT2lKalppSXNJblI1Y0dVaU9uc2lkSGx3WlNJNkluSmxZMjl5WkNJc0ltNWhiV1VpT2lKRFprUmxaaUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW10bGVYTndZV05sSWl3aWRIbHdaU0k2SW5OMGNtbHVaeUo5TEhzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2lZMjlzZFcxdVgzUjVjR1VpTENKMGVYQmxJanBiSW5OMGNtbHVaeUlzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTI5dGNHRnlZWFJ2Y2w5MGVYQmxJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbk4xWW1OdmJYQmhjbUYwYjNKZmRIbHdaU0lzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjIxdFpXNTBJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl6YVhwbElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkltdGxlVjlqWVdOb1pWOXphWHBsSWl3aWRIbHdaU0k2V3lKa2IzVmliR1VpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KbFlXUmZjbVZ3WVdseVgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaVpHOTFZbXhsSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdWZmIyNWZkM0pwZEdVaUxDSjBlWEJsSWpvaVltOXZiR1ZoYmlJc0ltUmxabUYxYkhRaU9tWmhiSE5sZlN4N0ltNWhiV1VpT2lKblkxOW5jbUZqWlY5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbVJsWm1GMWJIUmZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKclpYbGZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKdGFXNWZZMjl0Y0dGamRHbHZibDkwYUhKbGMyaHZiR1FpTENKMGVYQmxJanBiSW01MWJHd2lMQ0pwYm5RaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaWJXRjRYMk52YlhCaFkzUnBiMjVmZEdoeVpYTm9iMnhrSWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpYVc1MElsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXpZWFpsWDNCbGNtbHZaRjlwYmw5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMHNJbVJsWm1GMWJIUWlPakI5TEhzaWJtRnRaU0k2SW10bGVWOWpZV05vWlY5ellYWmxYM0JsY21sdlpGOXBibDl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwwc0ltUmxabUYxYkhRaU9qTTJNREI5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5clpYbHpYM1J2WDNOaGRtVWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSnBiblFpWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pYldWeVoyVmZjMmhoY21SelgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW1SdmRXSnNaU0pkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpwWkNJc0luUjVjR1VpT2xzaWFXNTBJaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjJ4MWJXNWZiV1YwWVdSaGRHRWlMQ0owZVhCbElqcGJleUowZVhCbElqb2lZWEp5WVhraUxDSnBkR1Z0Y3lJNmV5SjBlWEJsSWpvaWNtVmpiM0prSWl3aWJtRnRaU0k2SWtOdmJIVnRia1JsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pWW5sMFpYTWlmU3g3SW01aGJXVWlPaUoyWVd4cFpHRjBhVzl1WDJOc1lYTnpJaXdpZEhsd1pTSTZJbk4wY21sdVp5SjlMSHNpYm1GdFpTSTZJbWx1WkdWNFgzUjVjR1VpTENKMGVYQmxJanBiZXlKMGVYQmxJam9pWlc1MWJTSXNJbTVoYldVaU9pSkpibVJsZUZSNWNHVWlMQ0p6ZVcxaWIyeHpJanBiSWt0RldWTWlMQ0pEVlZOVVQwMGlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVKYm1SbGVGUjVjR1VpWFgwc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaWFXNWtaWGhmYm1GdFpTSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnBibVJsZUY5dmNIUnBiMjV6SWl3aWRIbHdaU0k2V3lKdWRXeHNJaXg3SW5SNWNHVWlPaUp0WVhBaUxDSjJZV3gxWlhNaU9pSnpkSEpwYm1jaWZWMHNJbVJsWm1GMWJIUWlPbTUxYkd4OVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NURiMngxYlc1RVpXWWlYWDE5TENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5d2NtOTJhV1JsY2lJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkTENKa1pXWmhkV3gwSWpvaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVEyOXVZM1Z5Y21WdWRFeHBibXRsWkVoaGMyaERZV05vWlZCeWIzWnBaR1Z5SW4wc2V5SnVZVzFsSWpvaWEyVjVYMkZzYVdGeklpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVlubDBaWE1pWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pWTI5dGNHRmpkR2x2Ymw5emRISmhkR1ZuZVNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpqYjIxd1lXTjBhVzl1WDNOMGNtRjBaV2Q1WDI5d2RHbHZibk1pTENKMGVYQmxJanBiSW01MWJHd2lMSHNpZEhsd1pTSTZJbTFoY0NJc0luWmhiSFZsY3lJNkluTjBjbWx1WnlKOVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaVkyOXRjSEpsYzNOcGIyNWZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sc2liblZzYkNJc2V5SjBlWEJsSWpvaWJXRndJaXdpZG1Gc2RXVnpJam9pYzNSeWFXNW5JbjFkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUppYkc5dmJWOW1hV3gwWlhKZlpuQmZZMmhoYm1ObElpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVpHOTFZbXhsSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5WFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1RFprUmxaaUpkZlgxZGZTeDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVJISnZjRU52YkhWdGJrWmhiV2xzZVNJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltdHpibUZ0WlNJc0luUjVjR1VpT2lKemRISnBibWNpZlN4N0ltNWhiV1VpT2lKalptNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pUVdSa1MyVjVjM0JoWTJVaUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSnJjeUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkxjMFJsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYzNSeVlYUmxaM2xmWTJ4aGMzTWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2ljM1J5WVhSbFozbGZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sdDdJblI1Y0dVaU9pSnRZWEFpTENKMllXeDFaWE1pT2lKemRISnBibWNpZlN3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJaUxDSjBlWEJsSWpwYkltbHVkQ0lzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTJaZlpHVm1jeUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbUZ5Y21GNUlpd2lhWFJsYlhNaU9pSkRaa1JsWmlKOWZTeDdJbTVoYldVaU9pSmtkWEpoWW14bFgzZHlhWFJsY3lJc0luUjVjR1VpT2lKaWIyOXNaV0Z1SWl3aVpHVm1ZWFZzZENJNmRISjFaWDFkTENKaGJHbGhjMlZ6SWpwYkltOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU52Ym1acFp5NWhkbkp2TGt0elJHVm1JbDE5ZlYxOUxIc2lkSGx3WlNJNkluSmxZMjl5WkNJc0ltNWhiV1VpT2lKRWNtOXdTMlY1YzNCaFkyVWlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUpyYzI1aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMWRmU3g3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lWWEJrWVhSbFMyVjVjM0JoWTJVaUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSnZiR1JMY3lJc0luUjVjR1VpT2lKTGMwUmxaaUo5TEhzaWJtRnRaU0k2SW01bGQwdHpJaXdpZEhsd1pTSTZJa3R6UkdWbUluMWRmU3g3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lWWEJrWVhSbFEyOXNkVzF1Um1GdGFXeDVJaXdpWm1sbGJHUnpJanBiZXlKdVlXMWxJam9pYldWMFlXUmhkR0VpTENKMGVYQmxJam9pUTJaRVpXWWlmVjE5WFgxZGZhaHkzRUIzV1JIaEFBRCtqcjdxMmZ5b2N0eEJkMWtSNFFBQS9vNis2dG44eUpRQkFBWnplWE4wWlcwQUpHRTROekprWXpReExUYzNOVGt0TVRGbE1TMHdNREF3TFdabE9HVmlaV1ZoWkRsbVl3QUFBQUVBQUFBREFRQUFBQU9BQUFBQWdBQUFBQUFBQUFBQUFBQUlBQXRCZG5KdkwxTmphR1Z0WVFBQUFBRTJUNmdRQkFBQUN1OTdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVMzTkVaV1lpTENKdVlXMWxjM0JoWTJVaU9pSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dGFXZHlZWFJwYjI0dVlYWnlieUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2ljM1J5WVhSbFozbGZZMnhoYzNNaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaWMzUnlZWFJsWjNsZmIzQjBhVzl1Y3lJc0luUjVjR1VpT2x0N0luUjVjR1VpT2lKdFlYQWlMQ0oyWVd4MVpYTWlPaUp6ZEhKcGJtY2lmU3dpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUp5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lpTENKMGVYQmxJanBiSW1sdWRDSXNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lZMlpmWkdWbWN5SXNJblI1Y0dVaU9uc2lkSGx3WlNJNkltRnljbUY1SWl3aWFYUmxiWE1pT25zaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpEWmtSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbXRsZVhOd1lXTmxJaXdpZEhsd1pTSTZJbk4wY21sdVp5SjlMSHNpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaVkyOXNkVzF1WDNSNWNHVWlMQ0owZVhCbElqcGJJbk4wY21sdVp5SXNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lZMjl0Y0dGeVlYUnZjbDkwZVhCbElpd2lkSGx3WlNJNld5SnpkSEpwYm1jaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluTjFZbU52YlhCaGNtRjBiM0pmZEhsd1pTSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSmpiMjF0Wlc1MElpd2lkSGx3WlNJNld5SnpkSEpwYm1jaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXphWHBsSWl3aWRIbHdaU0k2V3lKa2IzVmliR1VpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW10bGVWOWpZV05vWlY5emFYcGxJaXdpZEhsd1pTSTZXeUprYjNWaWJHVWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkpsWVdSZmNtVndZV2x5WDJOb1lXNWpaU0lzSW5SNWNHVWlPbHNpWkc5MVlteGxJaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUp5WlhCc2FXTmhkR1ZmYjI1ZmQzSnBkR1VpTENKMGVYQmxJam9pWW05dmJHVmhiaUlzSW1SbFptRjFiSFFpT21aaGJITmxmU3g3SW01aGJXVWlPaUpuWTE5bmNtRmpaVjl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkltUmxabUYxYkhSZmRtRnNhV1JoZEdsdmJsOWpiR0Z6Y3lJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpyWlhsZmRtRnNhV1JoZEdsdmJsOWpiR0Z6Y3lJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUp0YVc1ZlkyOXRjR0ZqZEdsdmJsOTBhSEpsYzJodmJHUWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSnBiblFpWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pYldGNFgyTnZiWEJoWTNScGIyNWZkR2h5WlhOb2IyeGtJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2lhVzUwSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5ellYWmxYM0JsY21sdlpGOXBibDl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwwc0ltUmxabUYxYkhRaU9qQjlMSHNpYm1GdFpTSTZJbXRsZVY5allXTm9aVjl6WVhabFgzQmxjbWx2WkY5cGJsOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDBzSW1SbFptRjFiSFFpT2pNMk1EQjlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjlyWlhselgzUnZYM05oZG1VaUxDSjBlWEJsSWpwYkltNTFiR3dpTENKcGJuUWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2liV1Z5WjJWZmMyaGhjbVJ6WDJOb1lXNWpaU0lzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbVJ2ZFdKc1pTSmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnBaQ0lzSW5SNWNHVWlPbHNpYVc1MElpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSmpiMngxYlc1ZmJXVjBZV1JoZEdFaUxDSjBlWEJsSWpwYmV5SjBlWEJsSWpvaVlYSnlZWGtpTENKcGRHVnRjeUk2ZXlKMGVYQmxJam9pY21WamIzSmtJaXdpYm1GdFpTSTZJa052YkhWdGJrUmxaaUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2lZbmwwWlhNaWZTeDdJbTVoYldVaU9pSjJZV3hwWkdGMGFXOXVYMk5zWVhOeklpd2lkSGx3WlNJNkluTjBjbWx1WnlKOUxIc2libUZ0WlNJNkltbHVaR1Y0WDNSNWNHVWlMQ0owZVhCbElqcGJleUowZVhCbElqb2laVzUxYlNJc0ltNWhiV1VpT2lKSmJtUmxlRlI1Y0dVaUxDSnplVzFpYjJ4eklqcGJJa3RGV1ZNaUxDSkRWVk5VVDAwaVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NUpibVJsZUZSNWNHVWlYWDBzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pYVc1a1pYaGZibUZ0WlNJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKcGJtUmxlRjl2Y0hScGIyNXpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpeDdJblI1Y0dVaU9pSnRZWEFpTENKMllXeDFaWE1pT2lKemRISnBibWNpZlYwc0ltUmxabUYxYkhRaU9tNTFiR3g5WFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1RGIyeDFiVzVFWldZaVhYMTlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl3Y205MmFXUmxjaUlzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRMQ0prWldaaGRXeDBJam9pYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1UTI5dVkzVnljbVZ1ZEV4cGJtdGxaRWhoYzJoRFlXTm9aVkJ5YjNacFpHVnlJbjBzZXlKdVlXMWxJam9pYTJWNVgyRnNhV0Z6SWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpWW5sMFpYTWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2lZMjl0Y0dGamRHbHZibDl6ZEhKaGRHVm5lU0lzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSmpiMjF3WVdOMGFXOXVYM04wY21GMFpXZDVYMjl3ZEdsdmJuTWlMQ0owZVhCbElqcGJJbTUxYkd3aUxIc2lkSGx3WlNJNkltMWhjQ0lzSW5aaGJIVmxjeUk2SW5OMGNtbHVaeUo5WFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pWTI5dGNISmxjM05wYjI1ZmIzQjBhVzl1Y3lJc0luUjVjR1VpT2xzaWJuVnNiQ0lzZXlKMGVYQmxJam9pYldGd0lpd2lkbUZzZFdWeklqb2ljM1J5YVc1bkluMWRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSmliRzl2YlY5bWFXeDBaWEpmWm5CZlkyaGhibU5sSWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpWkc5MVlteGxJbDBzSW1SbFptRjFiSFFpT201MWJHeDlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVEWmtSbFppSmRmWDE5TEhzaWJtRnRaU0k2SW1SMWNtRmliR1ZmZDNKcGRHVnpJaXdpZEhsd1pTSTZJbUp2YjJ4bFlXNGlMQ0prWldaaGRXeDBJanAwY25WbGZWMHNJbUZzYVdGelpYTWlPbHNpYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyOXVabWxuTG1GMmNtOHVTM05FWldZaVhYMEFEVXRsZVVOaFkyaGxVM0JoWTJVQUFBQUJOaytvRUFRQUFBUndHa3RsZVVOaFkyaGxVM0JoWTJWV2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXViRzlqWVhSdmNpNVRhVzF3YkdWVGRISmhkR1ZuZVFBQ0pISmxjR3hwWTJGMGFXOXVYMlpoWTNSdmNnSXhBQUlHR2t0bGVVTmhZMmhsVTNCaFkyVVNVM1JoYm1SaGNtUXpBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE4RDhBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEFwaEFBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFhUzJWNVEyRmphR1ZUY0dGalpSSlRkR0Z1WkdGeVpESUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRHdQd0NhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q2tFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQnBMWlhsRFlXTm9aVk53WVdObEVsTjBZVzVrWVhKa01RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFPQS9BSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FLSVFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFBQUVBQ1V0bGVYTndZV05sTXdBQUFBRTJUNmdRQkFBQUExQVNTMlY1YzNCaFkyVXpWbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG14dlkyRjBiM0l1VTJsdGNHeGxVM1J5WVhSbFoza0FBaVJ5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lDTlFBQ0JCSkxaWGx6Y0dGalpUTVFTVzVrWlhobFpERUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVCYzJOcGFWUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q1FFQUFDRW1KcGNuUm9aR0YwWlZCdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa3h2Ym1kVWVYQmxBQUFBSkRZeU5qazNNamMwTmpnMk5EWXhOelEyTlFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRNU1UzUmhibVJoY21ReEFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QWpoQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBUUFKUzJWNWMzQmhZMlUwQUFBQUFUWlBxQkFFQUFBSGhoSkxaWGx6Y0dGalpUUldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l6QUFJS0VrdGxlWE53WVdObE5CSlRkR0Z1WkdGeVpETUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q1VFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVFFTVTNSaGJtUmhjbVF4QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBa2hBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVMERGTjFjR1Z5TXdBS1UzVndaWElBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKWVFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxOQXhUZFhCbGNqUUFDbE4xY0dWeUFGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFCWWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVVYVcxbFZWVkpSRlI1Y0dVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDWUVBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpUUU1VM1Z3WlhJMUFBcFRkWEJsY2dCWWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVVYVcxbFZWVkpSRlI1Y0dVQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBbWhBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBQUFRQUpTMlY1YzNCaFkyVTFBQUFBQVRaUHFCQUVBQUFERFJKTFpYbHpjR0ZqWlRWV2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXViRzlqWVhSdmNpNVRhVzF3YkdWVGRISmhkR1ZuZVFBQ0pISmxjR3hwWTJGMGFXOXVYMlpoWTNSdmNnSXlBQUlFRWt0bGVYTndZV05sTlJKVGRHRnVaR0Z5WkRFQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDY0VBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpUVVFRMjkxYm5SbGNqRUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFtSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtOdmRXNTBaWEpEYjJ4MWJXNVVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKNFFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFBQUVBQ1V0bGVYTndZV05sTmdBQUFBRTJUNmdRQkFBQUFmWVNTMlY1YzNCaFkyVTJWbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG14dlkyRjBiM0l1VTJsdGNHeGxVM1J5WVhSbFoza0FBaVJ5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lDTVFBQ0FoSkxaWGx6Y0dGalpUWVFTVzVrWlhobFpERUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVCYzJOcGFWUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q2dFQUFDRW1KcGNuUm9aR0YwWlZCdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa3h2Ym1kVWVYQmxBQUFBSkRZeU5qazNNamMwTmpnMk5EWXhOelEyTlFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUFBQkFCQk9iME52YlcxcGRHeHZaMU53WVdObEFBQUFBVFpQcUJBRUFBQUJ1aUJPYjBOdmJXMXBkR3h2WjFOd1lXTmxWbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG14dlkyRjBiM0l1VTJsdGNHeGxVM1J5WVhSbFoza0FBaVJ5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lDTVFBQ0FpQk9iME52YlcxcGRHeHZaMU53WVdObEVsTjBZVzVrWVhKa01RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FLd1FBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFBQUFBRFZKdmQwTmhZMmhsVTNCaFkyVUFBQUFCTmsrb0VBUUFBQU1XR2xKdmQwTmhZMmhsVTNCaFkyVldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l4QUFJRUdsSnZkME5oWTJobFUzQmhZMlVRUTJGamFHVmtRMFlBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUJaUUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NxRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJwU2IzZERZV05vWlZOd1lXTmxIRU5HVjJsMGFHOTFkRU5oWTJobEFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QXFCQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBVnB2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRhV2R5WVhScGIyNHVRV1JrUzJWNWMzQmhZMlVFRWt0bGVYTndZV05sTTFadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNXNiMk5oZEc5eUxsTnBiWEJzWlZOMGNtRjBaV2Q1QUFJa2NtVndiR2xqWVhScGIyNWZabUZqZEc5eUFqVUFBZ1FTUzJWNWMzQmhZMlV6RUVsdVpHVjRaV1F4QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFYTmphV2xVZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBa0JBQUFoSmlhWEowYUdSaGRHVlFiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1TWIyNW5WSGx3WlFBQUFDUTJNalk1TnpJM05EWTROalEyTVRjME5qVUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQVNTMlY1YzNCaFkyVXpFbE4wWVc1a1lYSmtNUUFRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BSTRRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFFPQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5taWdyYXRpb24uS2V5c3BhY2U0LmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9kYi5taWdyYXRpb24uS2V5c3BhY2U0LmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUwNWRhNC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIubWlncmF0aW9uLktleXNwYWNlNC5iaW4KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1KyC9EbDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVRXbG5jbUYwYVc5dUlpd2libUZ0WlhOd1lXTmxJam9pYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV2xuY21GMGFXOXVMbUYyY204aUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSnZiR1JmZG1WeWMybHZiaUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbVpwZUdWa0lpd2libUZ0WlNJNklsVlZTVVFpTENKdVlXMWxjM0JoWTJVaU9pSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzUxZEdsc2N5NWhkbkp2SWl3aWMybDZaU0k2TVRaOWZTeDdJbTVoYldVaU9pSnVaWGRmZG1WeWMybHZiaUlzSW5SNWNHVWlPaUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1MWRHbHNjeTVoZG5KdkxsVlZTVVFpZlN4N0ltNWhiV1VpT2lKeWIzZGZiWFYwWVhScGIyNGlMQ0owZVhCbElqb2lZbmwwWlhNaWZTeDdJbTVoYldVaU9pSmpiR0Z6YzI1aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2liV2xuY21GMGFXOXVJaXdpZEhsd1pTSTZXM3NpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkJaR1JEYjJ4MWJXNUdZVzFwYkhraUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSmpaaUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkRaa1JsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltdGxlWE53WVdObElpd2lkSGx3WlNJNkluTjBjbWx1WnlKOUxIc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pWTI5c2RXMXVYM1I1Y0dVaUxDSjBlWEJsSWpwYkluTjBjbWx1WnlJc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaVkyOXRjR0Z5WVhSdmNsOTBlWEJsSWl3aWRIbHdaU0k2V3lKemRISnBibWNpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5OMVltTnZiWEJoY21GMGIzSmZkSGx3WlNJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKamIyMXRaVzUwSWl3aWRIbHdaU0k2V3lKemRISnBibWNpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5emFYcGxJaXdpZEhsd1pTSTZXeUprYjNWaWJHVWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbXRsZVY5allXTm9aVjl6YVhwbElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSmxZV1JmY21Wd1lXbHlYMk5vWVc1alpTSXNJblI1Y0dVaU9sc2laRzkxWW14bElpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnlaWEJzYVdOaGRHVmZiMjVmZDNKcGRHVWlMQ0owZVhCbElqb2lZbTl2YkdWaGJpSXNJbVJsWm1GMWJIUWlPbVpoYkhObGZTeDdJbTVoYldVaU9pSm5ZMTluY21GalpWOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW1SbFptRjFiSFJmZG1Gc2FXUmhkR2x2Ymw5amJHRnpjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnJaWGxmZG1Gc2FXUmhkR2x2Ymw5amJHRnpjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnRhVzVmWTI5dGNHRmpkR2x2Ymw5MGFISmxjMmh2YkdRaUxDSjBlWEJsSWpwYkltNTFiR3dpTENKcGJuUWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2liV0Y0WDJOdmJYQmhZM1JwYjI1ZmRHaHlaWE5vYjJ4a0lpd2lkSGx3WlNJNld5SnVkV3hzSWl3aWFXNTBJbDBzSW1SbFptRjFiSFFpT201MWJHeDlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl6WVhabFgzQmxjbWx2WkY5cGJsOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDBzSW1SbFptRjFiSFFpT2pCOUxIc2libUZ0WlNJNkltdGxlVjlqWVdOb1pWOXpZWFpsWDNCbGNtbHZaRjlwYmw5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMHNJbVJsWm1GMWJIUWlPak0yTURCOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXJaWGx6WDNSdlgzTmhkbVVpTENKMGVYQmxJanBiSW01MWJHd2lMQ0pwYm5RaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaWJXVnlaMlZmYzJoaGNtUnpYMk5vWVc1alpTSXNJblI1Y0dVaU9sc2liblZzYkNJc0ltUnZkV0pzWlNKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKcFpDSXNJblI1Y0dVaU9sc2lhVzUwSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKamIyeDFiVzVmYldWMFlXUmhkR0VpTENKMGVYQmxJanBiZXlKMGVYQmxJam9pWVhKeVlYa2lMQ0pwZEdWdGN5STZleUowZVhCbElqb2ljbVZqYjNKa0lpd2libUZ0WlNJNklrTnZiSFZ0YmtSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaVlubDBaWE1pZlN4N0ltNWhiV1VpT2lKMllXeHBaR0YwYVc5dVgyTnNZWE56SWl3aWRIbHdaU0k2SW5OMGNtbHVaeUo5TEhzaWJtRnRaU0k2SW1sdVpHVjRYM1I1Y0dVaUxDSjBlWEJsSWpwYmV5SjBlWEJsSWpvaVpXNTFiU0lzSW01aGJXVWlPaUpKYm1SbGVGUjVjR1VpTENKemVXMWliMnh6SWpwYklrdEZXVk1pTENKRFZWTlVUMDBpWFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1SmJtUmxlRlI1Y0dVaVhYMHNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lhVzVrWlhoZmJtRnRaU0lzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpwYm1SbGVGOXZjSFJwYjI1eklpd2lkSGx3WlNJNld5SnVkV3hzSWl4N0luUjVjR1VpT2lKdFlYQWlMQ0oyWVd4MVpYTWlPaUp6ZEhKcGJtY2lmVjBzSW1SbFptRjFiSFFpT201MWJHeDlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVEYjJ4MWJXNUVaV1lpWFgxOUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXdjbTkyYVdSbGNpSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZExDSmtaV1poZFd4MElqb2liM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVRMjl1WTNWeWNtVnVkRXhwYm10bFpFaGhjMmhEWVdOb1pWQnliM1pwWkdWeUluMHNleUp1WVcxbElqb2lhMlY1WDJGc2FXRnpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2lZbmwwWlhNaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaVkyOXRjR0ZqZEdsdmJsOXpkSEpoZEdWbmVTSXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKamIyMXdZV04wYVc5dVgzTjBjbUYwWldkNVgyOXdkR2x2Ym5NaUxDSjBlWEJsSWpwYkltNTFiR3dpTEhzaWRIbHdaU0k2SW0xaGNDSXNJblpoYkhWbGN5STZJbk4wY21sdVp5SjlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2lZMjl0Y0hKbGMzTnBiMjVmYjNCMGFXOXVjeUlzSW5SNWNHVWlPbHNpYm5Wc2JDSXNleUowZVhCbElqb2liV0Z3SWl3aWRtRnNkV1Z6SWpvaWMzUnlhVzVuSW4xZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKaWJHOXZiVjltYVd4MFpYSmZabkJmWTJoaGJtTmxJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2laRzkxWW14bElsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NURaa1JsWmlKZGZYMWRmU3g3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lSSEp2Y0VOdmJIVnRia1poYldsc2VTSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbXR6Ym1GdFpTSXNJblI1Y0dVaU9pSnpkSEpwYm1jaWZTeDdJbTVoYldVaU9pSmpabTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4xZGZTeDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVFXUmtTMlY1YzNCaFkyVWlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUpyY3lJc0luUjVjR1VpT25zaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpMYzBSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaWMzUnlZWFJsWjNsZlkyeGhjM01pTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYzNSeVlYUmxaM2xmYjNCMGFXOXVjeUlzSW5SNWNHVWlPbHQ3SW5SNWNHVWlPaUp0WVhBaUxDSjJZV3gxWlhNaU9pSnpkSEpwYm1jaWZTd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnlaWEJzYVdOaGRHbHZibDltWVdOMGIzSWlMQ0owZVhCbElqcGJJbWx1ZENJc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaVkyWmZaR1ZtY3lJc0luUjVjR1VpT25zaWRIbHdaU0k2SW1GeWNtRjVJaXdpYVhSbGJYTWlPaUpEWmtSbFppSjlmU3g3SW01aGJXVWlPaUprZFhKaFlteGxYM2R5YVhSbGN5SXNJblI1Y0dVaU9pSmliMjlzWldGdUlpd2laR1ZtWVhWc2RDSTZkSEoxWlgxZExDSmhiR2xoYzJWeklqcGJJbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OdmJtWnBaeTVoZG5KdkxrdHpSR1ZtSWwxOWZWMTlMSHNpZEhsd1pTSTZJbkpsWTI5eVpDSXNJbTVoYldVaU9pSkVjbTl3UzJWNWMzQmhZMlVpTENKbWFXVnNaSE1pT2x0N0ltNWhiV1VpT2lKcmMyNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pVlhCa1lYUmxTMlY1YzNCaFkyVWlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUp2YkdSTGN5SXNJblI1Y0dVaU9pSkxjMFJsWmlKOUxIc2libUZ0WlNJNkltNWxkMHR6SWl3aWRIbHdaU0k2SWt0elJHVm1JbjFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pVlhCa1lYUmxRMjlzZFcxdVJtRnRhV3g1SWl3aVptbGxiR1J6SWpwYmV5SnVZVzFsSWpvaWJXVjBZV1JoZEdFaUxDSjBlWEJsSWpvaVEyWkVaV1lpZlYxOVhYMWRmYWgwaWZCM1dSSGhBQUQranI3cTJmeW9kSW54ZDFrUjRRQUEvbzYrNnRuOCtJWUJBQVp6ZVhOMFpXMEFKR0U0TnpRNE9XWXhMVGMzTlRrdE1URmxNUzB3TURBd0xXWmxPR1ZpWldWaFpEbG1Zd0FBQUFFQUFBQURBUUFBQUFPQUFBQUFnQUFBQUFBQUFBQUFBQUFIQUF0QmRuSnZMMU5qYUdWdFlRQUFBQUUyVDZnUUR3QUFDdTk3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lTM05FWldZaUxDSnVZVzFsYzNCaFkyVWlPaUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRhV2R5WVhScGIyNHVZWFp5YnlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYzNSeVlYUmxaM2xmWTJ4aGMzTWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2ljM1J5WVhSbFozbGZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sdDdJblI1Y0dVaU9pSnRZWEFpTENKMllXeDFaWE1pT2lKemRISnBibWNpZlN3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJaUxDSjBlWEJsSWpwYkltbHVkQ0lzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTJaZlpHVm1jeUlzSW5SNWNHVWlPbnNpZEhsd1pTSTZJbUZ5Y21GNUlpd2lhWFJsYlhNaU9uc2lkSGx3WlNJNkluSmxZMjl5WkNJc0ltNWhiV1VpT2lKRFprUmxaaUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW10bGVYTndZV05sSWl3aWRIbHdaU0k2SW5OMGNtbHVaeUo5TEhzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2lZMjlzZFcxdVgzUjVjR1VpTENKMGVYQmxJanBiSW5OMGNtbHVaeUlzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWTI5dGNHRnlZWFJ2Y2w5MGVYQmxJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbk4xWW1OdmJYQmhjbUYwYjNKZmRIbHdaU0lzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjIxdFpXNTBJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl6YVhwbElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkltdGxlVjlqWVdOb1pWOXphWHBsSWl3aWRIbHdaU0k2V3lKa2IzVmliR1VpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KbFlXUmZjbVZ3WVdseVgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaVpHOTFZbXhsSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKeVpYQnNhV05oZEdWZmIyNWZkM0pwZEdVaUxDSjBlWEJsSWpvaVltOXZiR1ZoYmlJc0ltUmxabUYxYkhRaU9tWmhiSE5sZlN4N0ltNWhiV1VpT2lKblkxOW5jbUZqWlY5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbVJsWm1GMWJIUmZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKclpYbGZkbUZzYVdSaGRHbHZibDlqYkdGemN5SXNJblI1Y0dVaU9sc2liblZzYkNJc0luTjBjbWx1WnlKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKdGFXNWZZMjl0Y0dGamRHbHZibDkwYUhKbGMyaHZiR1FpTENKMGVYQmxJanBiSW01MWJHd2lMQ0pwYm5RaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaWJXRjRYMk52YlhCaFkzUnBiMjVmZEdoeVpYTm9iMnhrSWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpYVc1MElsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXpZWFpsWDNCbGNtbHZaRjlwYmw5elpXTnZibVJ6SWl3aWRIbHdaU0k2V3lKcGJuUWlMQ0p1ZFd4c0lsMHNJbVJsWm1GMWJIUWlPakI5TEhzaWJtRnRaU0k2SW10bGVWOWpZV05vWlY5ellYWmxYM0JsY21sdlpGOXBibDl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwwc0ltUmxabUYxYkhRaU9qTTJNREI5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5clpYbHpYM1J2WDNOaGRtVWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSnBiblFpWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pYldWeVoyVmZjMmhoY21SelgyTm9ZVzVqWlNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW1SdmRXSnNaU0pkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpwWkNJc0luUjVjR1VpT2xzaWFXNTBJaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUpqYjJ4MWJXNWZiV1YwWVdSaGRHRWlMQ0owZVhCbElqcGJleUowZVhCbElqb2lZWEp5WVhraUxDSnBkR1Z0Y3lJNmV5SjBlWEJsSWpvaWNtVmpiM0prSWl3aWJtRnRaU0k2SWtOdmJIVnRia1JsWmlJc0ltWnBaV3hrY3lJNlczc2libUZ0WlNJNkltNWhiV1VpTENKMGVYQmxJam9pWW5sMFpYTWlmU3g3SW01aGJXVWlPaUoyWVd4cFpHRjBhVzl1WDJOc1lYTnpJaXdpZEhsd1pTSTZJbk4wY21sdVp5SjlMSHNpYm1GdFpTSTZJbWx1WkdWNFgzUjVjR1VpTENKMGVYQmxJanBiZXlKMGVYQmxJam9pWlc1MWJTSXNJbTVoYldVaU9pSkpibVJsZUZSNWNHVWlMQ0p6ZVcxaWIyeHpJanBiSWt0RldWTWlMQ0pEVlZOVVQwMGlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVKYm1SbGVGUjVjR1VpWFgwc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaWFXNWtaWGhmYm1GdFpTSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnBibVJsZUY5dmNIUnBiMjV6SWl3aWRIbHdaU0k2V3lKdWRXeHNJaXg3SW5SNWNHVWlPaUp0WVhBaUxDSjJZV3gxWlhNaU9pSnpkSEpwYm1jaWZWMHNJbVJsWm1GMWJIUWlPbTUxYkd4OVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NURiMngxYlc1RVpXWWlYWDE5TENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5d2NtOTJhV1JsY2lJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkTENKa1pXWmhkV3gwSWpvaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVEyOXVZM1Z5Y21WdWRFeHBibXRsWkVoaGMyaERZV05vWlZCeWIzWnBaR1Z5SW4wc2V5SnVZVzFsSWpvaWEyVjVYMkZzYVdGeklpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVlubDBaWE1pWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pWTI5dGNHRmpkR2x2Ymw5emRISmhkR1ZuZVNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpqYjIxd1lXTjBhVzl1WDNOMGNtRjBaV2Q1WDI5d2RHbHZibk1pTENKMGVYQmxJanBiSW01MWJHd2lMSHNpZEhsd1pTSTZJbTFoY0NJc0luWmhiSFZsY3lJNkluTjBjbWx1WnlKOVhTd2laR1ZtWVhWc2RDSTZiblZzYkgwc2V5SnVZVzFsSWpvaVkyOXRjSEpsYzNOcGIyNWZiM0IwYVc5dWN5SXNJblI1Y0dVaU9sc2liblZzYkNJc2V5SjBlWEJsSWpvaWJXRndJaXdpZG1Gc2RXVnpJam9pYzNSeWFXNW5JbjFkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUppYkc5dmJWOW1hV3gwWlhKZlpuQmZZMmhoYm1ObElpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVpHOTFZbXhsSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5WFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1RFprUmxaaUpkZlgxOUxIc2libUZ0WlNJNkltUjFjbUZpYkdWZmQzSnBkR1Z6SWl3aWRIbHdaU0k2SW1KdmIyeGxZVzRpTENKa1pXWmhkV3gwSWpwMGNuVmxmVjBzSW1Gc2FXRnpaWE1pT2xzaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMjl1Wm1sbkxtRjJjbTh1UzNORVpXWWlYWDBBRFV0bGVVTmhZMmhsVTNCaFkyVUFBQUFCTmsrb0VBOEFBQVJ3R2t0bGVVTmhZMmhsVTNCaFkyVldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l4QUFJR0drdGxlVU5oWTJobFUzQmhZMlVTVTNSaGJtUmhjbVF6QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBOEQ4QW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBcGhBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBYVMyVjVRMkZqYUdWVGNHRmpaUkpUZEdGdVpHRnlaRElBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUR3UHdDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NrRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJwTFpYbERZV05vWlZOd1lXTmxFbE4wWVc1a1lYSmtNUUFRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT0EvQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BS0lRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFFQUNVdGxlWE53WVdObE5BQUFBQUUyVDZnUUR3QUFCNFlTUzJWNWMzQmhZMlUwVm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ013QUNDaEpMWlhsemNHRmpaVFFTVTNSaGJtUmhjbVF6QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBbEJBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVMEVsTjBZVzVrWVhKa01RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKSVFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxOQXhUZFhCbGNqTUFDbE4xY0dWeUFGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NXRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJKTFpYbHpjR0ZqWlRRTVUzVndaWEkwQUFwVGRYQmxjZ0JTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUFXRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVZHbHRaVlZWU1VSVWVYQmxBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEFtQkFBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFTUzJWNWMzQmhZMlUwREZOMWNHVnlOUUFLVTNWd1pYSUFXRzl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVZHbHRaVlZWU1VSVWVYQmxBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKb1FBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFBQUVBQ1V0bGVYTndZV05sTlFBQUFBRTJUNmdRRHdBQUF3MFNTMlY1YzNCaFkyVTFWbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG14dlkyRjBiM0l1VTJsdGNHeGxVM1J5WVhSbFoza0FBaVJ5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lDTWdBQ0JCSkxaWGx6Y0dGalpUVVNVM1JoYm1SaGNtUXhBQkJUZEdGdVpHRnlaQUJTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBbXBtWm1abVp1VDhCQUlDOGFRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdnQ1FBQUFBQUFDL3YvLy93OENtcG1abVptWnVUOEFuQkFBQUFCbWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVZMkZqYUdVdVUyVnlhV0ZzYVhwcGJtZERZV05vWlZCeWIzWnBaR1Z5QUFKK2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1WTI5dGNHRmpkR2x2Ymk1VGFYcGxWR2xsY21Wa1EyOXRjR0ZqZEdsdmJsTjBjbUYwWldkNUFnQUNBQUFTUzJWNWMzQmhZMlUxRUVOdmRXNTBaWEl4QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUppYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNURiM1Z1ZEdWeVEyOXNkVzF1Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NlRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUFBQkFBbExaWGx6Y0dGalpUWUFBQUFCTmsrb0VBOEFBQUgyRWt0bGVYTndZV05sTmxadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNXNiMk5oZEc5eUxsTnBiWEJzWlZOMGNtRjBaV2Q1QUFJa2NtVndiR2xqWVhScGIyNWZabUZqZEc5eUFqRUFBZ0lTUzJWNWMzQmhZMlUyRUVsdVpHVjRaV1F4QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFYTmphV2xVZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBb0JBQUFoSmlhWEowYUdSaGRHVlFiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1TWIyNW5WSGx3WlFBQUFDUTJNalk1TnpJM05EWTROalEyTVRjME5qVUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBUUFRVG05RGIyMXRhWFJzYjJkVGNHRmpaUUFBQUFFMlQ2Z1FEd0FBQWJvZ1RtOURiMjF0YVhSc2IyZFRjR0ZqWlZadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNXNiMk5oZEc5eUxsTnBiWEJzWlZOMGNtRjBaV2Q1QUFJa2NtVndiR2xqWVhScGIyNWZabUZqZEc5eUFqRUFBZ0lnVG05RGIyMXRhWFJzYjJkVGNHRmpaUkpUZEdGdVpHRnlaREVBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NzRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUFBQUFBMVNiM2REWVdOb1pWTndZV05sQUFBQUFUWlBxQkFQQUFBREZocFNiM2REWVdOb1pWTndZV05sVm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExteHZZMkYwYjNJdVUybHRjR3hsVTNSeVlYUmxaM2tBQWlSeVpYQnNhV05oZEdsdmJsOW1ZV04wYjNJQ01RQUNCQnBTYjNkRFlXTm9aVk53WVdObEVFTmhZMmhsWkVOR0FCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQVdVQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QXFoQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQWFVbTkzUTJGamFHVlRjR0ZqWlJ4RFJsZHBkR2h2ZFhSRFlXTm9aUUFRVTNSaGJtUmhjbVFBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUpxWm1abVptYmsvQVFDQXZHa0NVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJSUFrQUFBQUFBQXY3Ly8vOFBBcHFabVptWm1iay9BS2dRQUFBQVptOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU5oWTJobExsTmxjbWxoYkdsNmFXNW5RMkZqYUdWUWNtOTJhV1JsY2dBQ2ZtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG1OdmJYQmhZM1JwYjI0dVUybDZaVlJwWlhKbFpFTnZiWEJoWTNScGIyNVRkSEpoZEdWbmVRSUFBZ0FBQUFGYWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldsbmNtRjBhVzl1TGtGa1pFdGxlWE53WVdObEJCSkxaWGx6Y0dGalpUUldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l6QUFJS0VrdGxlWE53WVdObE5CSlRkR0Z1WkdGeVpETUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q1VFQUFBQUdadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpZV05vWlM1VFpYSnBZV3hwZW1sdVowTmhZMmhsVUhKdmRtbGtaWElBQW41dmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTVqYjIxd1lXTjBhVzl1TGxOcGVtVlVhV1Z5WldSRGIyMXdZV04wYVc5dVUzUnlZWFJsWjNrQ0FBSUFBQkpMWlhsemNHRmpaVFFTVTNSaGJtUmhjbVF4QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBa2hBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBU1MyVjVjM0JoWTJVMERGTjFjR1Z5TXdBS1UzVndaWElBVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKWVFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFFa3RsZVhOd1lXTmxOQXhUZFhCbGNqUUFDbE4xY0dWeUFGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFCWWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVVYVcxbFZWVkpSRlI1Y0dVQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDWUVBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpUUU1VM1Z3WlhJMUFBcFRkWEJsY2dCWWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVVYVcxbFZWVkpSRlI1Y0dVQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBbWhBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBQUFRPT0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIubWlncmF0aW9uLktleXNwYWNlNS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZGIubWlncmF0aW9uLktleXNwYWNlNS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMDcwNGEuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2RiLm1pZ3JhdGlvbi5LZXlzcGFjZTUuYmluCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotOqgvRGw3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lUV2xuY21GMGFXOXVJaXdpYm1GdFpYTndZV05sSWpvaWIzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldsbmNtRjBhVzl1TG1GMmNtOGlMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUp2YkdSZmRtVnljMmx2YmlJc0luUjVjR1VpT25zaWRIbHdaU0k2SW1acGVHVmtJaXdpYm1GdFpTSTZJbFZWU1VRaUxDSnVZVzFsYzNCaFkyVWlPaUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1MWRHbHNjeTVoZG5Kdklpd2ljMmw2WlNJNk1UWjlmU3g3SW01aGJXVWlPaUp1WlhkZmRtVnljMmx2YmlJc0luUjVjR1VpT2lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNTFkR2xzY3k1aGRuSnZMbFZWU1VRaWZTeDdJbTVoYldVaU9pSnliM2RmYlhWMFlYUnBiMjRpTENKMGVYQmxJam9pWW5sMFpYTWlmU3g3SW01aGJXVWlPaUpqYkdGemMyNWhiV1VpTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYldsbmNtRjBhVzl1SWl3aWRIbHdaU0k2VzNzaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpCWkdSRGIyeDFiVzVHWVcxcGJIa2lMQ0ptYVdWc1pITWlPbHQ3SW01aGJXVWlPaUpqWmlJc0luUjVjR1VpT25zaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpEWmtSbFppSXNJbVpwWld4a2N5STZXM3NpYm1GdFpTSTZJbXRsZVhOd1lXTmxJaXdpZEhsd1pTSTZJbk4wY21sdVp5SjlMSHNpYm1GdFpTSTZJbTVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaVkyOXNkVzF1WDNSNWNHVWlMQ0owZVhCbElqcGJJbk4wY21sdVp5SXNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lZMjl0Y0dGeVlYUnZjbDkwZVhCbElpd2lkSGx3WlNJNld5SnpkSEpwYm1jaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluTjFZbU52YlhCaGNtRjBiM0pmZEhsd1pTSXNJblI1Y0dVaU9sc2ljM1J5YVc1bklpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSmpiMjF0Wlc1MElpd2lkSGx3WlNJNld5SnpkSEpwYm1jaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSnZkMTlqWVdOb1pWOXphWHBsSWl3aWRIbHdaU0k2V3lKa2IzVmliR1VpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW10bGVWOWpZV05vWlY5emFYcGxJaXdpZEhsd1pTSTZXeUprYjNWaWJHVWlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkpsWVdSZmNtVndZV2x5WDJOb1lXNWpaU0lzSW5SNWNHVWlPbHNpWkc5MVlteGxJaXdpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUp5WlhCc2FXTmhkR1ZmYjI1ZmQzSnBkR1VpTENKMGVYQmxJam9pWW05dmJHVmhiaUlzSW1SbFptRjFiSFFpT21aaGJITmxmU3g3SW01aGJXVWlPaUpuWTE5bmNtRmpaVjl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkltUmxabUYxYkhSZmRtRnNhV1JoZEdsdmJsOWpiR0Z6Y3lJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUpyWlhsZmRtRnNhV1JoZEdsdmJsOWpiR0Z6Y3lJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW5OMGNtbHVaeUpkTENKa1pXWmhkV3gwSWpwdWRXeHNmU3g3SW01aGJXVWlPaUp0YVc1ZlkyOXRjR0ZqZEdsdmJsOTBhSEpsYzJodmJHUWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSnBiblFpWFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pYldGNFgyTnZiWEJoWTNScGIyNWZkR2h5WlhOb2IyeGtJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2lhVzUwSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5TEhzaWJtRnRaU0k2SW5KdmQxOWpZV05vWlY5ellYWmxYM0JsY21sdlpGOXBibDl6WldOdmJtUnpJaXdpZEhsd1pTSTZXeUpwYm5RaUxDSnVkV3hzSWwwc0ltUmxabUYxYkhRaU9qQjlMSHNpYm1GdFpTSTZJbXRsZVY5allXTm9aVjl6WVhabFgzQmxjbWx2WkY5cGJsOXpaV052Ym1Seklpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDBzSW1SbFptRjFiSFFpT2pNMk1EQjlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjlyWlhselgzUnZYM05oZG1VaUxDSjBlWEJsSWpwYkltNTFiR3dpTENKcGJuUWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2liV1Z5WjJWZmMyaGhjbVJ6WDJOb1lXNWpaU0lzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbVJ2ZFdKc1pTSmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnBaQ0lzSW5SNWNHVWlPbHNpYVc1MElpd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSmpiMngxYlc1ZmJXVjBZV1JoZEdFaUxDSjBlWEJsSWpwYmV5SjBlWEJsSWpvaVlYSnlZWGtpTENKcGRHVnRjeUk2ZXlKMGVYQmxJam9pY21WamIzSmtJaXdpYm1GdFpTSTZJa052YkhWdGJrUmxaaUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2lZbmwwWlhNaWZTeDdJbTVoYldVaU9pSjJZV3hwWkdGMGFXOXVYMk5zWVhOeklpd2lkSGx3WlNJNkluTjBjbWx1WnlKOUxIc2libUZ0WlNJNkltbHVaR1Y0WDNSNWNHVWlMQ0owZVhCbElqcGJleUowZVhCbElqb2laVzUxYlNJc0ltNWhiV1VpT2lKSmJtUmxlRlI1Y0dVaUxDSnplVzFpYjJ4eklqcGJJa3RGV1ZNaUxDSkRWVk5VVDAwaVhTd2lZV3hwWVhObGN5STZXeUp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1amIyNW1hV2N1WVhaeWJ5NUpibVJsZUZSNWNHVWlYWDBzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pYVc1a1pYaGZibUZ0WlNJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKcGJtUmxlRjl2Y0hScGIyNXpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpeDdJblI1Y0dVaU9pSnRZWEFpTENKMllXeDFaWE1pT2lKemRISnBibWNpZlYwc0ltUmxabUYxYkhRaU9tNTFiR3g5WFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1RGIyeDFiVzVFWldZaVhYMTlMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbkp2ZDE5allXTm9aVjl3Y205MmFXUmxjaUlzSW5SNWNHVWlPbHNpYzNSeWFXNW5JaXdpYm5Wc2JDSmRMQ0prWldaaGRXeDBJam9pYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1UTI5dVkzVnljbVZ1ZEV4cGJtdGxaRWhoYzJoRFlXTm9aVkJ5YjNacFpHVnlJbjBzZXlKdVlXMWxJam9pYTJWNVgyRnNhV0Z6SWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpWW5sMFpYTWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2lZMjl0Y0dGamRHbHZibDl6ZEhKaGRHVm5lU0lzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbk4wY21sdVp5SmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSmpiMjF3WVdOMGFXOXVYM04wY21GMFpXZDVYMjl3ZEdsdmJuTWlMQ0owZVhCbElqcGJJbTUxYkd3aUxIc2lkSGx3WlNJNkltMWhjQ0lzSW5aaGJIVmxjeUk2SW5OMGNtbHVaeUo5WFN3aVpHVm1ZWFZzZENJNmJuVnNiSDBzZXlKdVlXMWxJam9pWTI5dGNISmxjM05wYjI1ZmIzQjBhVzl1Y3lJc0luUjVjR1VpT2xzaWJuVnNiQ0lzZXlKMGVYQmxJam9pYldGd0lpd2lkbUZzZFdWeklqb2ljM1J5YVc1bkluMWRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSmliRzl2YlY5bWFXeDBaWEpmWm5CZlkyaGhibU5sSWl3aWRIbHdaU0k2V3lKdWRXeHNJaXdpWkc5MVlteGxJbDBzSW1SbFptRjFiSFFpT201MWJHeDlYU3dpWVd4cFlYTmxjeUk2V3lKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWpiMjVtYVdjdVlYWnlieTVEWmtSbFppSmRmWDFkZlN4N0luUjVjR1VpT2lKeVpXTnZjbVFpTENKdVlXMWxJam9pUkhKdmNFTnZiSFZ0YmtaaGJXbHNlU0lzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW10emJtRnRaU0lzSW5SNWNHVWlPaUp6ZEhKcGJtY2lmU3g3SW01aGJXVWlPaUpqWm01aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMWRmU3g3SW5SNWNHVWlPaUp5WldOdmNtUWlMQ0p1WVcxbElqb2lRV1JrUzJWNWMzQmhZMlVpTENKbWFXVnNaSE1pT2x0N0ltNWhiV1VpT2lKcmN5SXNJblI1Y0dVaU9uc2lkSGx3WlNJNkluSmxZMjl5WkNJc0ltNWhiV1VpT2lKTGMwUmxaaUlzSW1acFpXeGtjeUk2VzNzaWJtRnRaU0k2SW01aGJXVWlMQ0owZVhCbElqb2ljM1J5YVc1bkluMHNleUp1WVcxbElqb2ljM1J5WVhSbFozbGZZMnhoYzNNaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaWMzUnlZWFJsWjNsZmIzQjBhVzl1Y3lJc0luUjVjR1VpT2x0N0luUjVjR1VpT2lKdFlYQWlMQ0oyWVd4MVpYTWlPaUp6ZEhKcGJtY2lmU3dpYm5Wc2JDSmRmU3g3SW01aGJXVWlPaUp5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lpTENKMGVYQmxJanBiSW1sdWRDSXNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lZMlpmWkdWbWN5SXNJblI1Y0dVaU9uc2lkSGx3WlNJNkltRnljbUY1SWl3aWFYUmxiWE1pT2lKRFprUmxaaUo5ZlN4N0ltNWhiV1VpT2lKa2RYSmhZbXhsWDNkeWFYUmxjeUlzSW5SNWNHVWlPaUppYjI5c1pXRnVJaXdpWkdWbVlYVnNkQ0k2ZEhKMVpYMWRMQ0poYkdsaGMyVnpJanBiSW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTnZibVpwWnk1aGRuSnZMa3R6UkdWbUlsMTlmVjE5TEhzaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpFY205d1MyVjVjM0JoWTJVaUxDSm1hV1ZzWkhNaU9sdDdJbTVoYldVaU9pSnJjMjVoYldVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4xZGZTeDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVZYQmtZWFJsUzJWNWMzQmhZMlVpTENKbWFXVnNaSE1pT2x0N0ltNWhiV1VpT2lKdmJHUkxjeUlzSW5SNWNHVWlPaUpMYzBSbFppSjlMSHNpYm1GdFpTSTZJbTVsZDB0eklpd2lkSGx3WlNJNklrdHpSR1ZtSW4xZGZTeDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVZYQmtZWFJsUTI5c2RXMXVSbUZ0YVd4NUlpd2labWxsYkdSeklqcGJleUp1WVcxbElqb2liV1YwWVdSaGRHRWlMQ0owZVhCbElqb2lRMlpFWldZaWZWMTlYWDFkZmFoMXduQjNXUkhoQUFEK2pyN3EyZnlvZGVtQWQxa1I0UUFBL282KzZ0bjh2R2dBQm5ONWMzUmxiUUFrWVRnM05XVTVPREF0TnpjMU9TMHhNV1V4TFRBd01EQXRabVU0WldKbFpXRmtPV1pqQUFBQUFRQUFBQU1CQUFBQUE0QUFBQUNBQUFBQUFBQUFBQUFBQUFZQUMwRjJjbTh2VTJOb1pXMWhBQUFBQVRaUHFCQVlBQUFLNzNzaWRIbHdaU0k2SW5KbFkyOXlaQ0lzSW01aGJXVWlPaUpMYzBSbFppSXNJbTVoYldWemNHRmpaU0k2SW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFwWjNKaGRHbHZiaTVoZG5Kdklpd2labWxsYkdSeklqcGJleUp1WVcxbElqb2libUZ0WlNJc0luUjVjR1VpT2lKemRISnBibWNpZlN4N0ltNWhiV1VpT2lKemRISmhkR1ZuZVY5amJHRnpjeUlzSW5SNWNHVWlPaUp6ZEhKcGJtY2lmU3g3SW01aGJXVWlPaUp6ZEhKaGRHVm5lVjl2Y0hScGIyNXpJaXdpZEhsd1pTSTZXM3NpZEhsd1pTSTZJbTFoY0NJc0luWmhiSFZsY3lJNkluTjBjbWx1WnlKOUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSmxjR3hwWTJGMGFXOXVYMlpoWTNSdmNpSXNJblI1Y0dVaU9sc2lhVzUwSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKalpsOWtaV1p6SWl3aWRIbHdaU0k2ZXlKMGVYQmxJam9pWVhKeVlYa2lMQ0pwZEdWdGN5STZleUowZVhCbElqb2ljbVZqYjNKa0lpd2libUZ0WlNJNklrTm1SR1ZtSWl3aVptbGxiR1J6SWpwYmV5SnVZVzFsSWpvaWEyVjVjM0JoWTJVaUxDSjBlWEJsSWpvaWMzUnlhVzVuSW4wc2V5SnVZVzFsSWpvaWJtRnRaU0lzSW5SNWNHVWlPaUp6ZEhKcGJtY2lmU3g3SW01aGJXVWlPaUpqYjJ4MWJXNWZkSGx3WlNJc0luUjVjR1VpT2xzaWMzUnlhVzVuSWl3aWJuVnNiQ0pkZlN4N0ltNWhiV1VpT2lKamIyMXdZWEpoZEc5eVgzUjVjR1VpTENKMGVYQmxJanBiSW5OMGNtbHVaeUlzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pYzNWaVkyOXRjR0Z5WVhSdmNsOTBlWEJsSWl3aWRIbHdaU0k2V3lKemRISnBibWNpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW1OdmJXMWxiblFpTENKMGVYQmxJanBiSW5OMGNtbHVaeUlzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pY205M1gyTmhZMmhsWDNOcGVtVWlMQ0owZVhCbElqcGJJbVJ2ZFdKc1pTSXNJbTUxYkd3aVhYMHNleUp1WVcxbElqb2lhMlY1WDJOaFkyaGxYM05wZW1VaUxDSjBlWEJsSWpwYkltUnZkV0pzWlNJc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaWNtVmhaRjl5WlhCaGFYSmZZMmhoYm1ObElpd2lkSGx3WlNJNld5SmtiM1ZpYkdVaUxDSnVkV3hzSWwxOUxIc2libUZ0WlNJNkluSmxjR3hwWTJGMFpWOXZibDkzY21sMFpTSXNJblI1Y0dVaU9pSmliMjlzWldGdUlpd2laR1ZtWVhWc2RDSTZabUZzYzJWOUxIc2libUZ0WlNJNkltZGpYMmR5WVdObFgzTmxZMjl1WkhNaUxDSjBlWEJsSWpwYkltbHVkQ0lzSW01MWJHd2lYWDBzZXlKdVlXMWxJam9pWkdWbVlYVnNkRjkyWVd4cFpHRjBhVzl1WDJOc1lYTnpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2ljM1J5YVc1bklsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OUxIc2libUZ0WlNJNkltdGxlVjkyWVd4cFpHRjBhVzl1WDJOc1lYTnpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpd2ljM1J5YVc1bklsMHNJbVJsWm1GMWJIUWlPbTUxYkd4OUxIc2libUZ0WlNJNkltMXBibDlqYjIxd1lXTjBhVzl1WDNSb2NtVnphRzlzWkNJc0luUjVjR1VpT2xzaWJuVnNiQ0lzSW1sdWRDSmRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSnRZWGhmWTI5dGNHRmpkR2x2Ymw5MGFISmxjMmh2YkdRaUxDSjBlWEJsSWpwYkltNTFiR3dpTENKcGJuUWlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMHNleUp1WVcxbElqb2ljbTkzWDJOaFkyaGxYM05oZG1WZmNHVnlhVzlrWDJsdVgzTmxZMjl1WkhNaUxDSjBlWEJsSWpwYkltbHVkQ0lzSW01MWJHd2lYU3dpWkdWbVlYVnNkQ0k2TUgwc2V5SnVZVzFsSWpvaWEyVjVYMk5oWTJobFgzTmhkbVZmY0dWeWFXOWtYMmx1WDNObFkyOXVaSE1pTENKMGVYQmxJanBiSW1sdWRDSXNJbTUxYkd3aVhTd2laR1ZtWVhWc2RDSTZNell3TUgwc2V5SnVZVzFsSWpvaWNtOTNYMk5oWTJobFgydGxlWE5mZEc5ZmMyRjJaU0lzSW5SNWNHVWlPbHNpYm5Wc2JDSXNJbWx1ZENKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKdFpYSm5aVjl6YUdGeVpITmZZMmhoYm1ObElpd2lkSGx3WlNJNld5SnVkV3hzSWl3aVpHOTFZbXhsSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5TEhzaWJtRnRaU0k2SW1sa0lpd2lkSGx3WlNJNld5SnBiblFpTENKdWRXeHNJbDE5TEhzaWJtRnRaU0k2SW1OdmJIVnRibDl0WlhSaFpHRjBZU0lzSW5SNWNHVWlPbHQ3SW5SNWNHVWlPaUpoY25KaGVTSXNJbWwwWlcxeklqcDdJblI1Y0dVaU9pSnlaV052Y21RaUxDSnVZVzFsSWpvaVEyOXNkVzF1UkdWbUlpd2labWxsYkdSeklqcGJleUp1WVcxbElqb2libUZ0WlNJc0luUjVjR1VpT2lKaWVYUmxjeUo5TEhzaWJtRnRaU0k2SW5aaGJHbGtZWFJwYjI1ZlkyeGhjM01pTENKMGVYQmxJam9pYzNSeWFXNW5JbjBzZXlKdVlXMWxJam9pYVc1a1pYaGZkSGx3WlNJc0luUjVjR1VpT2x0N0luUjVjR1VpT2lKbGJuVnRJaXdpYm1GdFpTSTZJa2x1WkdWNFZIbHdaU0lzSW5ONWJXSnZiSE1pT2xzaVMwVlpVeUlzSWtOVlUxUlBUU0pkTENKaGJHbGhjMlZ6SWpwYkltOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbU52Ym1acFp5NWhkbkp2TGtsdVpHVjRWSGx3WlNKZGZTd2liblZzYkNKZGZTeDdJbTVoYldVaU9pSnBibVJsZUY5dVlXMWxJaXdpZEhsd1pTSTZXeUp6ZEhKcGJtY2lMQ0p1ZFd4c0lsMTlMSHNpYm1GdFpTSTZJbWx1WkdWNFgyOXdkR2x2Ym5NaUxDSjBlWEJsSWpwYkltNTFiR3dpTEhzaWRIbHdaU0k2SW0xaGNDSXNJblpoYkhWbGN5STZJbk4wY21sdVp5SjlYU3dpWkdWbVlYVnNkQ0k2Ym5Wc2JIMWRMQ0poYkdsaGMyVnpJanBiSW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTnZibVpwWnk1aGRuSnZMa052YkhWdGJrUmxaaUpkZlgwc0ltNTFiR3dpWFgwc2V5SnVZVzFsSWpvaWNtOTNYMk5oWTJobFgzQnliM1pwWkdWeUlpd2lkSGx3WlNJNld5SnpkSEpwYm1jaUxDSnVkV3hzSWwwc0ltUmxabUYxYkhRaU9pSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNURiMjVqZFhKeVpXNTBUR2x1YTJWa1NHRnphRU5oWTJobFVISnZkbWxrWlhJaWZTeDdJbTVoYldVaU9pSnJaWGxmWVd4cFlYTWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSmllWFJsY3lKZExDSmtaV1poZFd4MElqcHVkV3hzZlN4N0ltNWhiV1VpT2lKamIyMXdZV04wYVc5dVgzTjBjbUYwWldkNUlpd2lkSGx3WlNJNld5SnVkV3hzSWl3aWMzUnlhVzVuSWwwc0ltUmxabUYxYkhRaU9tNTFiR3g5TEhzaWJtRnRaU0k2SW1OdmJYQmhZM1JwYjI1ZmMzUnlZWFJsWjNsZmIzQjBhVzl1Y3lJc0luUjVjR1VpT2xzaWJuVnNiQ0lzZXlKMGVYQmxJam9pYldGd0lpd2lkbUZzZFdWeklqb2ljM1J5YVc1bkluMWRMQ0prWldaaGRXeDBJanB1ZFd4c2ZTeDdJbTVoYldVaU9pSmpiMjF3Y21WemMybHZibDl2Y0hScGIyNXpJaXdpZEhsd1pTSTZXeUp1ZFd4c0lpeDdJblI1Y0dVaU9pSnRZWEFpTENKMllXeDFaWE1pT2lKemRISnBibWNpZlYwc0ltUmxabUYxYkhRaU9tNTFiR3g5TEhzaWJtRnRaU0k2SW1Kc2IyOXRYMlpwYkhSbGNsOW1jRjlqYUdGdVkyVWlMQ0owZVhCbElqcGJJbTUxYkd3aUxDSmtiM1ZpYkdVaVhTd2laR1ZtWVhWc2RDSTZiblZzYkgxZExDSmhiR2xoYzJWeklqcGJJbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OdmJtWnBaeTVoZG5KdkxrTm1SR1ZtSWwxOWZYMHNleUp1WVcxbElqb2laSFZ5WVdKc1pWOTNjbWwwWlhNaUxDSjBlWEJsSWpvaVltOXZiR1ZoYmlJc0ltUmxabUYxYkhRaU9uUnlkV1Y5WFN3aVlXeHBZWE5sY3lJNld5SnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqYjI1bWFXY3VZWFp5Ynk1TGMwUmxaaUpkZlFBTlMyVjVRMkZqYUdWVGNHRmpaUUFBQUFFMlQ2Z1FHQUFBQkhBYVMyVjVRMkZqYUdWVGNHRmpaVlp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1c2IyTmhkRzl5TGxOcGJYQnNaVk4wY21GMFpXZDVBQUlrY21Wd2JHbGpZWFJwYjI1ZlptRmpkRzl5QWpFQUFnWWFTMlY1UTJGamFHVlRjR0ZqWlJKVGRHRnVaR0Z5WkRNQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFEd1B3Q2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDbUVBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCcExaWGxEWVdOb1pWTndZV05sRWxOMFlXNWtZWEprTWdBUVUzUmhibVJoY21RQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVBBL0FKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQUtRUUFBQUFabTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OaFkyaGxMbE5sY21saGJHbDZhVzVuUTJGamFHVlFjbTkyYVdSbGNnQUNmbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtTnZiWEJoWTNScGIyNHVVMmw2WlZScFpYSmxaRU52YlhCaFkzUnBiMjVUZEhKaGRHVm5lUUlBQWdBQUdrdGxlVU5oWTJobFUzQmhZMlVTVTNSaGJtUmhjbVF4QUJCVGRHRnVaR0Z5WkFCU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBNEQ4QW1wbVptWm1adVQ4QkFJQzhhUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnZ0NRQUFBQUFBQy92Ly8vdzhDbXBtWm1abVp1VDhBb2hBQUFBQm1iM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WTJGamFHVXVVMlZ5YVdGc2FYcHBibWREWVdOb1pWQnliM1pwWkdWeUFBSitiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdVkyOXRjR0ZqZEdsdmJpNVRhWHBsVkdsbGNtVmtRMjl0Y0dGamRHbHZibE4wY21GMFpXZDVBZ0FDQUFBQUFRQUpTMlY1YzNCaFkyVTFBQUFBQVRaUHFCQVlBQUFERFJKTFpYbHpjR0ZqWlRWV2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXViRzlqWVhSdmNpNVRhVzF3YkdWVGRISmhkR1ZuZVFBQ0pISmxjR3hwWTJGMGFXOXVYMlpoWTNSdmNnSXlBQUlFRWt0bGVYTndZV05sTlJKVGRHRnVaR0Z5WkRFQUVGTjBZVzVrWVhKa0FGSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQ2FtWm1abVptNVB3RUFnTHhwQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUpTYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXViV0Z5YzJoaGJDNUNlWFJsYzFSNWNHVUNDQUpBQUFBQUFBTCsvLy8vRHdLYW1abVptWm01UHdDY0VBQUFBR1p2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1allXTm9aUzVUWlhKcFlXeHBlbWx1WjBOaFkyaGxVSEp2ZG1sa1pYSUFBbjV2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNWpiMjF3WVdOMGFXOXVMbE5wZW1WVWFXVnlaV1JEYjIxd1lXTjBhVzl1VTNSeVlYUmxaM2tDQUFJQUFCSkxaWGx6Y0dGalpUVVFRMjkxYm5SbGNqRUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFtSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtOdmRXNTBaWEpEYjJ4MWJXNVVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FKNFFBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFBQUVBQ1V0bGVYTndZV05sTmdBQUFBRTJUNmdRR0FBQUFmWVNTMlY1YzNCaFkyVTJWbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG14dlkyRjBiM0l1VTJsdGNHeGxVM1J5WVhSbFoza0FBaVJ5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lDTVFBQ0FoSkxaWGx6Y0dGalpUWVFTVzVrWlhobFpERUFFRk4wWVc1a1lYSmtBRkp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNhbVptWm1abTVQd0VBZ0x4cEFsSnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1dFlYSnphR0ZzTGtKNWRHVnpWSGx3WlFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVCYzJOcGFWUjVjR1VDQ0FKQUFBQUFBQUwrLy8vL0R3S2FtWm1abVptNVB3Q2dFQUFDRW1KcGNuUm9aR0YwWlZCdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa3h2Ym1kVWVYQmxBQUFBSkRZeU5qazNNamMwTmpnMk5EWXhOelEyTlFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUFBQkFCQk9iME52YlcxcGRHeHZaMU53WVdObEFBQUFBVFpQcUJBWUFBQUJ1aUJPYjBOdmJXMXBkR3h2WjFOd1lXTmxWbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG14dlkyRjBiM0l1VTJsdGNHeGxVM1J5WVhSbFoza0FBaVJ5WlhCc2FXTmhkR2x2Ymw5bVlXTjBiM0lDTVFBQ0FpQk9iME52YlcxcGRHeHZaMU53WVdObEVsTjBZVzVrWVhKa01RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1VtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWxKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlJQWtBQUFBQUFBdjcvLy84UEFwcVptWm1abWJrL0FLd1FBQUFBWm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtTmhZMmhsTGxObGNtbGhiR2w2YVc1blEyRmphR1ZRY205MmFXUmxjZ0FDZm05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbU52YlhCaFkzUnBiMjR1VTJsNlpWUnBaWEpsWkVOdmJYQmhZM1JwYjI1VGRISmhkR1ZuZVFJQUFnQUFBQUFBRFZKdmQwTmhZMmhsVTNCaFkyVUFBQUFCTmsrb0VCZ0FBQU1XR2xKdmQwTmhZMmhsVTNCaFkyVldiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1Ykc5allYUnZjaTVUYVcxd2JHVlRkSEpoZEdWbmVRQUNKSEpsY0d4cFkyRjBhVzl1WDJaaFkzUnZjZ0l4QUFJRUdsSnZkME5oWTJobFUzQmhZMlVRUTJGamFHVmtRMFlBRUZOMFlXNWtZWEprQUZKdmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNWtZaTV0WVhKemFHRnNMa0o1ZEdWelZIbHdaUUlBQUFBQUFBQUFBQUJaUUFBQUFBQUFBQUFBQUFDYW1abVptWm01UHdFQWdMeHBBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0NBSkFBQUFBQUFMKy8vLy9Ed0thbVptWm1abTVQd0NxRUFBQUFHWnZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVqWVdOb1pTNVRaWEpwWVd4cGVtbHVaME5oWTJobFVISnZkbWxrWlhJQUFuNXZjbWN1WVhCaFkyaGxMbU5oYzNOaGJtUnlZUzVrWWk1amIyMXdZV04wYVc5dUxsTnBlbVZVYVdWeVpXUkRiMjF3WVdOMGFXOXVVM1J5WVhSbFoza0NBQUlBQUJwU2IzZERZV05vWlZOd1lXTmxIRU5HVjJsMGFHOTFkRU5oWTJobEFCQlRkR0Z1WkdGeVpBQlNiM0puTG1Gd1lXTm9aUzVqWVhOellXNWtjbUV1WkdJdWJXRnljMmhoYkM1Q2VYUmxjMVI1Y0dVQ0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFtcG1abVptWnVUOEJBSUM4YVFKU2IzSm5MbUZ3WVdOb1pTNWpZWE56WVc1a2NtRXVaR0l1YldGeWMyaGhiQzVDZVhSbGMxUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QXFCQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBVnB2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRhV2R5WVhScGIyNHVRV1JrUzJWNWMzQmhZMlVFRWt0bGVYTndZV05sTlZadmNtY3VZWEJoWTJobExtTmhjM05oYm1SeVlTNXNiMk5oZEc5eUxsTnBiWEJzWlZOMGNtRjBaV2Q1QUFJa2NtVndiR2xqWVhScGIyNWZabUZqZEc5eUFqSUFBZ1FTUzJWNWMzQmhZMlUxRWxOMFlXNWtZWEprTVFBUVUzUmhibVJoY21RQVVtOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UW5sMFpYTlVlWEJsQWdBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFKcVptWm1abWJrL0FRQ0F2R2tDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBbEp2Y21jdVlYQmhZMmhsTG1OaGMzTmhibVJ5WVM1a1lpNXRZWEp6YUdGc0xrSjVkR1Z6Vkhsd1pRSUlBa0FBQUFBQUF2Ny8vLzhQQXBxWm1abVptYmsvQUp3UUFBQUFabTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1OaFkyaGxMbE5sY21saGJHbDZhVzVuUTJGamFHVlFjbTkyYVdSbGNnQUNmbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtTnZiWEJoWTNScGIyNHVVMmw2WlZScFpYSmxaRU52YlhCaFkzUnBiMjVUZEhKaGRHVm5lUUlBQWdBQUVrdGxlWE53WVdObE5SQkRiM1Z1ZEdWeU1RQVFVM1JoYm1SaGNtUUFVbTl5Wnk1aGNHRmphR1V1WTJGemMyRnVaSEpoTG1SaUxtMWhjbk5vWVd3dVFubDBaWE5VZVhCbEFnQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSnFabVptWm1iay9BUUNBdkdrQ1ltOXlaeTVoY0dGamFHVXVZMkZ6YzJGdVpISmhMbVJpTG0xaGNuTm9ZV3d1UTI5MWJuUmxja052YkhWdGJsUjVjR1VDVW05eVp5NWhjR0ZqYUdVdVkyRnpjMkZ1WkhKaExtUmlMbTFoY25Ob1lXd3VRbmwwWlhOVWVYQmxBZ2dDUUFBQUFBQUMvdi8vL3c4Q21wbVptWm1adVQ4QW5oQUFBQUJtYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVkyRmphR1V1VTJWeWFXRnNhWHBwYm1kRFlXTm9aVkJ5YjNacFpHVnlBQUorYjNKbkxtRndZV05vWlM1allYTnpZVzVrY21FdVpHSXVZMjl0Y0dGamRHbHZiaTVUYVhwbFZHbGxjbVZrUTI5dGNHRmpkR2x2YmxOMGNtRjBaV2Q1QWdBQ0FBQUFBUT09ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2dtcy5FbmRwb2ludFN0YXRlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODNjNWEuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL2dtcy5FbmRwb2ludFN0YXRlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9nbXMuR29zc2lwLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9nbXMuR29zc2lwLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBiMjdhOC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvZ21zLkdvc3NpcC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvc2VydmljZS5UcmVlUmVxdWVzdC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvc2VydmljZS5UcmVlUmVxdWVzdC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMmExYjguLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3NlcnZpY2UuVHJlZVJlcXVlc3QuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3NlcnZpY2UuVHJlZVJlc3BvbnNlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9zZXJ2aWNlLlRyZWVSZXNwb25zZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOTRlMmQuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3NlcnZpY2UuVHJlZVJlc3BvbnNlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9zdHJlYW1pbmcuUGVuZGluZ0ZpbGUuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3N0cmVhbWluZy5QZW5kaW5nRmlsZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYTA4NDQuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3N0cmVhbWluZy5QZW5kaW5nRmlsZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvc3RyZWFtaW5nLlN0cmVhbUhlYWRlci5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvc3RyZWFtaW5nLlN0cmVhbUhlYWRlci5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMTQzYjguLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3N0cmVhbWluZy5TdHJlYW1IZWFkZXIuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3N0cmVhbWluZy5TdHJlYW1SZXBseS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvc3RyZWFtaW5nLlN0cmVhbVJlcGx5LmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI3NDA1OC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvc3RyZWFtaW5nLlN0cmVhbVJlcGx5LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC9zdHJlYW1pbmcuU3RyZWFtUmVxdWVzdE1lc3NhZ2UuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3N0cmVhbWluZy5TdHJlYW1SZXF1ZXN0TWVzc2FnZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMTlhZDkuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3N0cmVhbWluZy5TdHJlYW1SZXF1ZXN0TWVzc2FnZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvdXRpbHMuQmxvb21GaWx0ZXIuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3V0aWxzLkJsb29tRmlsdGVyLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwMzE3MC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvdXRpbHMuQmxvb21GaWx0ZXIuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4wL3V0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZDM5Yi4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC91dGlscy5MZWdhY3lCbG9vbUZpbHRlci5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjAvdXRpbHMuTGVnYWN5Qmxvb21GaWx0ZXIuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWVmMWI4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMC91dGlscy5MZWdhY3lCbG9vbUZpbHRlci5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuUmFuZ2VTbGljZUNvbW1hbmQuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2RiLlJhbmdlU2xpY2VDb21tYW5kLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczZDczOC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuUmFuZ2VTbGljZUNvbW1hbmQuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2RiLlJvdy5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuUm93LmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1YWQ5ZC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuUm93LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9kYi5Sb3dNdXRhdGlvbi5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuUm93TXV0YXRpb24uYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjJkYWVkLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9kYi5Sb3dNdXRhdGlvbi5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuU2xpY2VCeU5hbWVzUmVhZENvbW1hbmQuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI5OTU2ZC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuU2xpY2VCeU5hbWVzUmVhZENvbW1hbmQuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2RiLlNsaWNlRnJvbVJlYWRDb21tYW5kLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNjhjZDMuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2RiLlNsaWNlRnJvbVJlYWRDb21tYW5kLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9kYi5UcnVuY2F0aW9uLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9kYi5UcnVuY2F0aW9uLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2Nzk5NS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuVHJ1bmNhdGlvbi5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuV3JpdGVSZXNwb25zZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZGIuV3JpdGVSZXNwb25zZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNzYyMzguLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2RiLldyaXRlUmVzcG9uc2UuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2dtcy5FbmRwb2ludFN0YXRlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODUyNzkuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL2dtcy5FbmRwb2ludFN0YXRlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9nbXMuR29zc2lwLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9nbXMuR29zc2lwLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY1YWM1Ny4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvZ21zLkdvc3NpcC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvc2VydmljZS5UcmVlUmVxdWVzdC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvc2VydmljZS5UcmVlUmVxdWVzdC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMmExYjguLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3NlcnZpY2UuVHJlZVJlcXVlc3QuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3NlcnZpY2UuVHJlZVJlc3BvbnNlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9zZXJ2aWNlLlRyZWVSZXNwb25zZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZjNjNmYuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3NlcnZpY2UuVHJlZVJlc3BvbnNlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9zdHJlYW1pbmcuUGVuZGluZ0ZpbGUuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3N0cmVhbWluZy5QZW5kaW5nRmlsZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzhmNzcuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3N0cmVhbWluZy5QZW5kaW5nRmlsZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvc3RyZWFtaW5nLlN0cmVhbUhlYWRlci5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvc3RyZWFtaW5nLlN0cmVhbUhlYWRlci5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNWI3YWMuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3N0cmVhbWluZy5TdHJlYW1IZWFkZXIuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3N0cmVhbWluZy5TdHJlYW1SZXBseS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvc3RyZWFtaW5nLlN0cmVhbVJlcGx5LmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkzMzMxNi4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvc3RyZWFtaW5nLlN0cmVhbVJlcGx5LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi9zdHJlYW1pbmcuU3RyZWFtUmVxdWVzdE1lc3NhZ2UuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3N0cmVhbWluZy5TdHJlYW1SZXF1ZXN0TWVzc2FnZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNTM1NzkuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3N0cmVhbWluZy5TdHJlYW1SZXF1ZXN0TWVzc2FnZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvdXRpbHMuQmxvb21GaWx0ZXIuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3V0aWxzLkJsb29tRmlsdGVyLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0ZTdkZS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvdXRpbHMuQmxvb21GaWx0ZXIuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMS4yL3V0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZDM5Yi4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi91dGlscy5MZWdhY3lCbG9vbUZpbHRlci5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8xLjIvdXRpbHMuTGVnYWN5Qmxvb21GaWx0ZXIuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWVmMWI4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzEuMi91dGlscy5MZWdhY3lCbG9vbUZpbHRlci5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuUmFuZ2VTbGljZUNvbW1hbmQuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLlJhbmdlU2xpY2VDb21tYW5kLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5ZTQyOS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuUmFuZ2VTbGljZUNvbW1hbmQuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9kYi5TbGljZUJ5TmFtZXNSZWFkQ29tbWFuZC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YzMzYTIuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuU2xpY2VGcm9tUmVhZENvbW1hbmQuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmVlZGUzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuVHJ1bmNhdGlvbi5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZGIuVHJ1bmNhdGlvbi5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNjc5OTUuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2RiLlRydW5jYXRpb24uYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2dtcy5FbmRwb2ludFN0YXRlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODk4OTMuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL2dtcy5FbmRwb2ludFN0YXRlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9nbXMuR29zc2lwLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9nbXMuR29zc2lwLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY1YWM1Ny4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvZ21zLkdvc3NpcC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc2VydmljZS5TeW5jQ29tcGxldGUuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3NlcnZpY2UuU3luY0NvbXBsZXRlLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjNzJlMS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc2VydmljZS5TeW5jQ29tcGxldGUuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3NlcnZpY2UuU3luY1JlcXVlc3QuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3NlcnZpY2UuU3luY1JlcXVlc3QuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTE4NDA1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9zZXJ2aWNlLlN5bmNSZXF1ZXN0LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9zZXJ2aWNlLlZhbGlkYXRpb25Db21wbGV0ZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzhkN2JlLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9zZXJ2aWNlLlZhbGlkYXRpb25Db21wbGV0ZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc2VydmljZS5WYWxpZGF0aW9uUmVxdWVzdC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc2VydmljZS5WYWxpZGF0aW9uUmVxdWVzdC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzRjNDcuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3N0cmVhbWluZy5QZW5kaW5nRmlsZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc3RyZWFtaW5nLlBlbmRpbmdGaWxlLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjOGY3Ny4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc3RyZWFtaW5nLlBlbmRpbmdGaWxlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9zdHJlYW1pbmcuU3RyZWFtSGVhZGVyLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9zdHJlYW1pbmcuU3RyZWFtSGVhZGVyLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlNWVkYy4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc3RyZWFtaW5nLlN0cmVhbUhlYWRlci5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc3RyZWFtaW5nLlN0cmVhbVJlcGx5LmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9zdHJlYW1pbmcuU3RyZWFtUmVwbHkuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDk0ZWNjLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC9zdHJlYW1pbmcuU3RyZWFtUmVwbHkuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3N0cmVhbWluZy5TdHJlYW1SZXF1ZXN0TWVzc2FnZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc3RyZWFtaW5nLlN0cmVhbVJlcXVlc3RNZXNzYWdlLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhYWY3OC4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvc3RyZWFtaW5nLlN0cmVhbVJlcXVlc3RNZXNzYWdlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC91dGlscy5CbG9vbUZpbHRlci5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvdXRpbHMuQmxvb21GaWx0ZXIuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmY3MmY1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC91dGlscy5CbG9vbUZpbHRlci5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjAvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC91dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW0uYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWRkMzliLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC91dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW0uYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3V0aWxzLkxlZ2FjeUJsb29tRmlsdGVyLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMC91dGlscy5MZWdhY3lCbG9vbUZpbHRlci5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZWYxYjguLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4wL3V0aWxzLkxlZ2FjeUJsb29tRmlsdGVyLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9kYi5SYW5nZVNsaWNlQ29tbWFuZC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZGIuUmFuZ2VTbGljZUNvbW1hbmQuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODUyZGYwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9kYi5SYW5nZVNsaWNlQ29tbWFuZC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZGIuU2xpY2VCeU5hbWVzUmVhZENvbW1hbmQuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL2RiLlNsaWNlQnlOYW1lc1JlYWRDb21tYW5kLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTljMzNhMi4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZGIuU2xpY2VCeU5hbWVzUmVhZENvbW1hbmQuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL2RiLlNsaWNlRnJvbVJlYWRDb21tYW5kLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9kYi5TbGljZUZyb21SZWFkQ29tbWFuZC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZWVkZTMuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL2RiLlNsaWNlRnJvbVJlYWRDb21tYW5kLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9kYi5UcnVuY2F0aW9uLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9kYi5UcnVuY2F0aW9uLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2Nzk5NS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZGIuVHJ1bmNhdGlvbi5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZGIuV3JpdGVSZXNwb25zZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZGIuV3JpdGVSZXNwb25zZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL2RiLldyaXRlUmVzcG9uc2UuYmluCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZ21zLkVuZHBvaW50U3RhdGUuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODdmYzc3Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZ21zLkdvc3NpcC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvZ21zLkdvc3NpcC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNWFjNTcuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL2dtcy5Hb3NzaXAuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL3NlcnZpY2UuU3luY0NvbXBsZXRlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9zZXJ2aWNlLlN5bmNDb21wbGV0ZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzM2FiZTIuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL3NlcnZpY2UuU3luY0NvbXBsZXRlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9zZXJ2aWNlLlN5bmNSZXF1ZXN0LmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9zZXJ2aWNlLlN5bmNSZXF1ZXN0LmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJiOGJmOS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvc2VydmljZS5TeW5jUmVxdWVzdC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL3NlcnZpY2UuVmFsaWRhdGlvbkNvbXBsZXRlLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVmZjQ4Zi4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzc0ZDA1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS9zZXJ2aWNlLlZhbGlkYXRpb25SZXF1ZXN0LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS91dGlscy5CbG9vbUZpbHRlci5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvdXRpbHMuQmxvb21GaWx0ZXIuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTcwNDJhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS91dGlscy5CbG9vbUZpbHRlci5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvdXRpbHMuQmxvb21GaWx0ZXIxMDAwLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS91dGlscy5CbG9vbUZpbHRlcjEwMDAuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTk2NzljLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzIuMS91dGlscy5CbG9vbUZpbHRlcjEwMDAuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMi4xL3V0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVkZDM5Yi4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8yLjEvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvZ21zLkVuZHBvaW50U3RhdGUuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjMwYWUxLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvZ21zLkdvc3NpcC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvZ21zLkdvc3NpcC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNWFjNTcuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMy4wL2dtcy5Hb3NzaXAuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMy4wL3NlcnZpY2UuU3luY0NvbXBsZXRlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC9zZXJ2aWNlLlN5bmNDb21wbGV0ZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZWE0YjQuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMy4wL3NlcnZpY2UuU3luY0NvbXBsZXRlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC9zZXJ2aWNlLlN5bmNSZXF1ZXN0LmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC9zZXJ2aWNlLlN5bmNSZXF1ZXN0LmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwOTc3Ny4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvc2VydmljZS5TeW5jUmVxdWVzdC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMy4wL3NlcnZpY2UuVmFsaWRhdGlvbkNvbXBsZXRlLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhmMGZiOS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMy4wL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vMy4wL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA3NjNiLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC9zZXJ2aWNlLlZhbGlkYXRpb25SZXF1ZXN0LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC91dGlscy5CbG9vbUZpbHRlci5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvdXRpbHMuQmxvb21GaWx0ZXIuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGJmYjRmLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC91dGlscy5CbG9vbUZpbHRlci5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi8zLjAvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC91dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW0uYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWRkMzliLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzMuMC91dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW0uYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL2dtcy5FbmRwb2ludFN0YXRlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KaW5kZXggMTdmYzA4OC4uMDgzZGJiNyAxMDA2NDQKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL2dtcy5FbmRwb2ludFN0YXRlLmJpbgorKysgYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvZ21zLkVuZHBvaW50U3RhdGUuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9nbXMuR29zc2lwLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9nbXMuR29zc2lwLmJpbgppbmRleCAyZmJkNWQ0Li43YTRmYjU2IDEwMDY0NAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvZ21zLkdvc3NpcC5iaW4KKysrIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL2dtcy5Hb3NzaXAuYmluCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9zZXJ2aWNlLlN5bmNDb21wbGV0ZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvc2VydmljZS5TeW5jQ29tcGxldGUuYmluCmluZGV4IDRlOGNhYTYuLjM5YTYyNDMgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9zZXJ2aWNlLlN5bmNDb21wbGV0ZS5iaW4KKysrIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL3NlcnZpY2UuU3luY0NvbXBsZXRlLmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvc2VydmljZS5TeW5jUmVxdWVzdC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvc2VydmljZS5TeW5jUmVxdWVzdC5iaW4KaW5kZXggMTdiYjAxNC4uZjg1M2IyMCAxMDA2NDQKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL3NlcnZpY2UuU3luY1JlcXVlc3QuYmluCisrKyBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9zZXJ2aWNlLlN5bmNSZXF1ZXN0LmJpbgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL3NlcnZpY2UuVmFsaWRhdGlvbkNvbXBsZXRlLmJpbgppbmRleCA3NDAyYzllLi5iYjRkZTQzIDEwMDY0NAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluCisrKyBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9zZXJ2aWNlLlZhbGlkYXRpb25Db21wbGV0ZS5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4wL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluCmluZGV4IGZhNGE5MTMuLjA0YzQ5MmEgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMC9zZXJ2aWNlLlZhbGlkYXRpb25SZXF1ZXN0LmJpbgorKysgYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjAvc2VydmljZS5WYWxpZGF0aW9uUmVxdWVzdC5iaW4KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4xL2dtcy5FbmRwb2ludFN0YXRlLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMS9nbXMuRW5kcG9pbnRTdGF0ZS5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2RiYjcuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4xL2dtcy5FbmRwb2ludFN0YXRlLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMS9nbXMuR29zc2lwLmJpbiBiL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMS9nbXMuR29zc2lwLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0ZmI1Ni4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvZ21zLkdvc3NpcC5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvc2VydmljZS5TeW5jQ29tcGxldGUuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4xL3NlcnZpY2UuU3luY0NvbXBsZXRlLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhNjI0My4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvc2VydmljZS5TeW5jQ29tcGxldGUuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4xL3NlcnZpY2UuU3luY1JlcXVlc3QuYmluIGIvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4xL3NlcnZpY2UuU3luY1JlcXVlc3QuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODUzYjIwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMS9zZXJ2aWNlLlN5bmNSZXF1ZXN0LmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMS9zZXJ2aWNlLlZhbGlkYXRpb25Db21wbGV0ZS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvc2VydmljZS5WYWxpZGF0aW9uQ29tcGxldGUuYmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjRkZTQzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGF0YS9zZXJpYWxpemF0aW9uLzQuMS9zZXJ2aWNlLlZhbGlkYXRpb25Db21wbGV0ZS5iaW4KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvc2VydmljZS5WYWxpZGF0aW9uUmVxdWVzdC5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvc2VydmljZS5WYWxpZGF0aW9uUmVxdWVzdC5iaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YzQ5MmEuLjAwMDAwMDAKLS0tIGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4xL3NlcnZpY2UuVmFsaWRhdGlvblJlcXVlc3QuYmluCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9kYXRhL3NlcmlhbGl6YXRpb24vNC4xL3V0aWxzLkVzdGltYXRlZEhpc3RvZ3JhbS5iaW4gYi90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3OGVkYS4uMDAwMDAwMAotLS0gYS90ZXN0L2RhdGEvc2VyaWFsaXphdGlvbi80LjEvdXRpbHMuRXN0aW1hdGVkSGlzdG9ncmFtLmJpbgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvYWN0aW9uL0dvc3NpcEhlbHBlci5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9hY3Rpb24vR29zc2lwSGVscGVyLmphdmEKaW5kZXggNWIyM2I4Ni4uN2E0NjkzNSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9hY3Rpb24vR29zc2lwSGVscGVyLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9hY3Rpb24vR29zc2lwSGVscGVyLmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW5zdGFuY2U7CkBAIC00NjcsMjUgKzQ2OCwyNCBAQAogICAgICAgICByZXR1cm4gbmV0VmVyc2lvbjsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2l0aFByb3BlcnR5KFN0cmluZyBwcm9wLCBib29sZWFuIHZhbHVlLCBSdW5uYWJsZSByKQorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3aXRoUHJvcGVydHkoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIHByb3AsIGJvb2xlYW4gdmFsdWUsIFJ1bm5hYmxlIHIpCiAgICAgewogICAgICAgICB3aXRoUHJvcGVydHkocHJvcCwgQm9vbGVhbi50b1N0cmluZyh2YWx1ZSksIHIpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3aXRoUHJvcGVydHkoU3RyaW5nIHByb3AsIFN0cmluZyB2YWx1ZSwgUnVubmFibGUgcikKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd2l0aFByb3BlcnR5KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBwcm9wLCBTdHJpbmcgdmFsdWUsIFJ1bm5hYmxlIHIpCiAgICAgewotICAgICAgICBTdHJpbmcgYmVmb3JlID0gU3lzdGVtLmdldFByb3BlcnR5KHByb3ApOworICAgICAgICBTdHJpbmcgcHJldiA9IHByb3Auc2V0U3RyaW5nKHZhbHVlKTsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShwcm9wLCB2YWx1ZSk7CiAgICAgICAgICAgICByLnJ1bigpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGJlZm9yZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KHByb3ApOworICAgICAgICAgICAgaWYgKHByZXYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwcm9wLmNsZWFyVmFsdWUoKTsgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdjbGVhclZhbHVlU3lzdGVtUHJvcGVydHlVc2FnZScKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkocHJvcCwgYmVmb3JlKTsKKyAgICAgICAgICAgICAgICBwcm9wLnNldFN0cmluZyhwcmV2KTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvYXBpL1Jvdy5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9hcGkvUm93LmphdmEKaW5kZXggMzMyNzJlZC4uOWQwOGNiMiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9hcGkvUm93LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9hcGkvUm93LmphdmEKQEAgLTYyLDcgKzYyLDcgQEAKICAgICAgICAgdGhpcy5uYW1lSW5kZXggPSBuYW1lSW5kZXg7CiAgICAgfQogCi0gICAgdm9pZCBzZXRSZXN1bHRzKE9iamVjdFtdIHJlc3VsdHMpCisgICAgcHVibGljIHZvaWQgc2V0UmVzdWx0cyhPYmplY3RbXSByZXN1bHRzKQogICAgIHsKICAgICAgICAgdGhpcy5yZXN1bHRzID0gcmVzdWx0czsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL2Z1enovSGFycnlIZWxwZXIuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvZnV6ei9IYXJyeUhlbHBlci5qYXZhCmluZGV4IDI5OTdmYTYuLjY2MTc4ZjIgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvZnV6ei9IYXJyeUhlbHBlci5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvZnV6ei9IYXJyeUhlbHBlci5qYXZhCkBAIC0yNiwxOSArMjYsMjggQEAKIGltcG9ydCBoYXJyeS5tb2RlbC5jbG9jay5PZmZzZXRDbG9jazsKIGltcG9ydCBoYXJyeS5tb2RlbC5zdXQuUHJpbnRsblN1dDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9BTExPV19TSU1QTEVfU1RSQVRFR1k7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX01JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkRJU0FCTEVfVENBQ1RJVkVfT1BFTlNTTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5MT0c0SjJfRElTQUJMRV9KTVg7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTE9HNEoyX0RJU0FCTEVfSk1YX0xFR0FDWTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5MT0c0Sl9TSFVURE9XTl9IT09LX0VOQUJMRUQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuT1JHX0FQQUNIRV9DQVNTQU5EUkFfRElTQUJMRV9NQkVBTl9SRUdJU1RSQVRJT047CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUkVMT0NBVEVEX1NIQURFRF9JT19ORVRUWV9UUkFOU1BPUlRfTk9OQVRJVkU7CisKIHB1YmxpYyBjbGFzcyBIYXJyeUhlbHBlcgogewogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgibG9nNGoyLmRpc2FibGVKbXgiLCAidHJ1ZSIpOyAvLyBzZXR0aW5nIGJvdGggd2F5cyBhcyBjaGFuZ2VzIGJldHdlZW4gdmVyc2lvbnMKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJsb2c0ajIuZGlzYWJsZS5qbXgiLCAidHJ1ZSIpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImxvZzRqLnNodXRkb3duSG9va0VuYWJsZWQiLCAiZmFsc2UiKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuYWxsb3dfc2ltcGxlc3RyYXRlZ3kiLCAidHJ1ZSIpOyAvLyBtYWtlcyBlYXNpZXIgdG8gc2hhcmUgT1NTIHRlc3RzIHdpdGhvdXQgUkYgbGltaXRzCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLm1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yIiwgIjAiKTsgLy8gbWFrZXMgZWFzaWVyIHRvIHNoYXJlIE9TUyB0ZXN0cyB3aXRob3V0IFJGIGxpbWl0cwotCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmRpc2FibGVfdGNhY3RpdmVfb3BlbnNzbCIsICJ0cnVlIik7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgicmVsb2NhdGVkLnNoYWRlZC5pby5uZXR0eS50cmFuc3BvcnQubm9OYXRpdmUiLCAidHJ1ZSIpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc2FibGVfbWJlYW5fcmVnaXN0cmF0aW9uIiwgInRydWUiKTsKKyAgICAgICAgLy8gc2V0dGluZyBib3RoIHdheXMgYXMgY2hhbmdlcyBiZXR3ZWVuIHZlcnNpb25zCisgICAgICAgIExPRzRKMl9ESVNBQkxFX0pNWC5zZXRCb29sZWFuKHRydWUpOworICAgICAgICBMT0c0SjJfRElTQUJMRV9KTVhfTEVHQUNZLnNldEJvb2xlYW4odHJ1ZSk7CisgICAgICAgIExPRzRKX1NIVVRET1dOX0hPT0tfRU5BQkxFRC5zZXRCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgQ0FTU0FORFJBX0FMTE9XX1NJTVBMRV9TVFJBVEVHWS5zZXRCb29sZWFuKHRydWUpOyAvLyBtYWtlcyBlYXNpZXIgdG8gc2hhcmUgT1NTIHRlc3RzIHdpdGhvdXQgUkYgbGltaXRzCisgICAgICAgIENBU1NBTkRSQV9NSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUi5zZXRJbnQoMCk7IC8vIG1ha2VzIGVhc2llciB0byBzaGFyZSBPU1MgdGVzdHMgd2l0aG91dCBSRiBsaW1pdHMKKyAgICAgICAgRElTQUJMRV9UQ0FDVElWRV9PUEVOU1NMLnNldEJvb2xlYW4odHJ1ZSk7CisgICAgICAgIFJFTE9DQVRFRF9TSEFERURfSU9fTkVUVFlfVFJBTlNQT1JUX05PTkFUSVZFLnNldEJvb2xlYW4odHJ1ZSk7CisgICAgICAgIE9SR19BUEFDSEVfQ0FTU0FORFJBX0RJU0FCTEVfTUJFQU5fUkVHSVNUUkFUSU9OLnNldEJvb2xlYW4odHJ1ZSk7CiAKICAgICAgICAgSW5Kdm1TdXQuaW5pdCgpOwogICAgICAgICBRdWVyeWluZ05vT3BDaGVja2VyLmluaXQoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvZnV6ei9TU1RhYmxlR2VuZXJhdG9yLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL2Z1enovU1NUYWJsZUdlbmVyYXRvci5qYXZhCmluZGV4IDYyN2QzNjAuLmM3ZDBmYmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvZnV6ei9TU1RhYmxlR2VuZXJhdG9yLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9mdXp6L1NTVGFibGVHZW5lcmF0b3IuamF2YQpAQCAtMzA2LDcgKzMwNiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFic3RyYWN0TWFya2VyLlJhdyh2YWx1ZXMuc2l6ZSgpIC0gMSkpKTsKICAgICAgICAgfQogCi0gICAgICAgIFN0YXRlbWVudFJlc3RyaWN0aW9ucyByZXN0cmljdGlvbnMgPSBuZXcgU3RhdGVtZW50UmVzdHJpY3Rpb25zKFN0YXRlbWVudFR5cGUuREVMRVRFLAorICAgICAgICBTdGF0ZW1lbnRSZXN0cmljdGlvbnMgcmVzdHJpY3Rpb25zID0gbmV3IFN0YXRlbWVudFJlc3RyaWN0aW9ucyhudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZW1lbnRUeXBlLkRFTEVURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYnVpbGQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFZhcmlhYmxlU3BlY2lmaWNhdGlvbnModmFyaWFibGVOYW1lcyksCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL2ltcGwvQWJzdHJhY3RDbHVzdGVyLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL2ltcGwvQWJzdHJhY3RDbHVzdGVyLmphdmEKaW5kZXggN2QzMzM3Mi4uNzhiMTRkMiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9pbXBsL0Fic3RyYWN0Q2x1c3Rlci5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvaW1wbC9BYnN0cmFjdENsdXN0ZXIuamF2YQpAQCAtMTg3LDcgKzE4Nyw3IEBACiAKICAgICAgICAgewogICAgICAgICAgICAgLy8gdGhvc2UgcHJvcGVydGllcyBtYXkgYmUgc2V0IGZvciB1bml0LXRlc3Qgb3B0aW1pemF0aW9uczsgdGhvc2Ugc2hvdWxkIG5vdCBiZSB1c2VkIHdoZW4gcnVubmluZyBkdGVzdHMKLSAgICAgICAgICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GTFVTSF9MT0NBTF9TQ0hFTUFfQ0hBTkdFUy5yZXNldCgpOworICAgICAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfRkxVU0hfTE9DQUxfU0NIRU1BX0NIQU5HRVMucmVzZXQoKTsKICAgICAgICAgICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5OT05fR1JBQ0VGVUxfU0hVVERPV04ucmVzZXQoKTsKICAgICAgICAgfQogCkBAIC02NTAsNiArNjUwLDE2IEBACiAgICAgICAgIHJldHVybiBzdHJlYW0oKS5tYXAoSUluc3RhbmNlOjpjb29yZGluYXRvcik7CiAgICAgfQogCisgICAgcHVibGljIExpc3Q8ST4gZ2V0KGludC4uLiBub2RlcykKKyAgICB7CisgICAgICAgIGlmIChub2RlcyA9PSBudWxsIHx8IG5vZGVzLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gbm9kZXMgcHJvdmlkZWQiKTsKKyAgICAgICAgTGlzdDxJPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KG5vZGVzLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgOiBub2RlcykKKyAgICAgICAgICAgIGxpc3QuYWRkKGdldChpKSk7CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKwogICAgIC8qKgogICAgICAqIFdBUk5JTkc6IHdlIGluZGV4IGZyb20gMSBoZXJlLCBmb3IgY29uc2lzdGVuY3kgd2l0aCBpbmV0IGFkZHJlc3MhCiAgICAgICovCkBAIC0xMDMzLDYgKzEwNDMsOCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKICAgICB7CisgICAgICAgIGxvZ2dlci5pbmZvKCJDbG9zaW5nIGNsdXN0ZXIge30iLCB0aGlzLmNsdXN0ZXJJZCk7CisgICAgICAgIEZCVXRpbGl0aWVzLmNsb3NlUXVpZXRseShpbnN0YW5jZUluaXRpYWxpemVyKTsKICAgICAgICAgRkJVdGlsaXRpZXMud2FpdE9uRnV0dXJlcyhpbnN0YW5jZXMuc3RyZWFtKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGkgLT4gIWkuaXNTaHV0ZG93bigpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoSUluc3RhbmNlOjpzaHV0ZG93bikKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvaW1wbC9JbnN0YW5jZS5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9pbXBsL0luc3RhbmNlLmphdmEKaW5kZXggZDRjYjFjYi4uNDM1ZGU2NSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9pbXBsL0luc3RhbmNlLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9pbXBsL0luc3RhbmNlLmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN5c3RlbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTeXN0ZW1zOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKQEAgLTk2LDggKzk3LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5oaW50cy5IaW50c1NlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguU2Vjb25kYXJ5SW5kZXhNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLklWZXJzaW9uZWRBc3ltbWV0cmljU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4U3VtbWFyeU1hbmFnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOwpAQCAtMTQ2LDExICsxNDcsMTcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KVk1TdGFiaWxpdHlJbnNwZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlJlZjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5sb2dnaW5nLkxvZ2dpbmdTdXBwb3J0RmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuQnVmZmVyUG9vbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMucHJvZ3Jlc3Muam14LkpNWEJyb2FkY2FzdEV4ZWN1dG9yOwogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTlVURVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3Rvcnk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09OU0lTVEVOVF9SQU5HRV9NT1ZFTUVOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT05TSVNURU5UX1NJTVVMVEFORU9VU19NT1ZFU19BTExPVzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SSU5HX0RFTEFZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfQ0FTU0FORFJBX1NVSVRFTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0NBU1NBTkRSQV9URVNUVEFHOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5CTEFOS19HT1NTSVA7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLkdPU1NJUDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkFUSVZFX1BST1RPQ09MOwpAQCAtMjE2LDE0ICsyMjMsMTQgQEAKICAgICB7CiAgICAgICAgIC8vIHRoZSBwYXRoIHVzZWQgaXMgZGVmaW5lZCBieSB0ZXN0L2NvbmYvbG9nYmFjay1kdGVzdC54bWwgYW5kIGxvb2tzIGxpa2UgdGhlIGZvbGxvd2luZwogICAgICAgICAvLyAuL2J1aWxkL3Rlc3QvbG9ncy8ke2Nhc3NhbmRyYS50ZXN0dGFnfS8ke3N1aXRlbmFtZX0vJHtjbHVzdGVyX2lkfS8ke2luc3RhbmNlX2lkfS9zeXN0ZW0ubG9nCi0gICAgICAgIFN0cmluZyB0YWcgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS50ZXN0dGFnIiwgImNhc3NhbmRyYS50ZXN0dGFnX0lTX1VOREVGSU5FRCIpOwotICAgICAgICBTdHJpbmcgc3VpdGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInN1aXRlbmFtZSIsICJzdWl0ZW5hbWVfSVNfVU5ERUZJTkVEIik7CisgICAgICAgIFN0cmluZyB0YWcgPSBURVNUX0NBU1NBTkRSQV9URVNUVEFHLmdldFN0cmluZygpOworICAgICAgICBTdHJpbmcgc3VpdGUgPSBURVNUX0NBU1NBTkRSQV9TVUlURU5BTUUuZ2V0U3RyaW5nKCk7CiAgICAgICAgIFN0cmluZyBjbHVzdGVySWQgPSBDbHVzdGVySUREZWZpbmVyLmdldElkKCk7CiAgICAgICAgIFN0cmluZyBpbnN0YW5jZUlkID0gSW5zdGFuY2VJRERlZmluZXIuZ2V0SW5zdGFuY2VJZCgpOwotICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShTdHJpbmcuZm9ybWF0KCJidWlsZC90ZXN0L2xvZ3MvJXMvJXMvJXMvJXMvc3lzdGVtLmxvZyIsIHRhZywgc3VpdGUsIGNsdXN0ZXJJZCwgaW5zdGFuY2VJZCkpOworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShGaWxlU3lzdGVtcy5nZXREZWZhdWx0KCksIFN0cmluZy5mb3JtYXQoImJ1aWxkL3Rlc3QvbG9ncy8lcy8lcy8lcy8lcy9zeXN0ZW0ubG9nIiwgdGFnLCBzdWl0ZSwgY2x1c3RlcklkLCBpbnN0YW5jZUlkKSk7CiAgICAgICAgIC8vIHdoZW4gY3JlYXRpbmcgYSBjbHVzdGVyIGdsb2JhbGx5IGluIGEgdGVzdCBjbGFzcyB3ZSBnZXQgdGhlIGxvZ3Mgd2l0aG91dCB0aGUgc3VpdGUsIHRyeSBmaW5kaW5nIHRob3NlIGxvZ3M6CiAgICAgICAgIGlmICghZi5leGlzdHMoKSkKLSAgICAgICAgICAgIGYgPSBuZXcgRmlsZShTdHJpbmcuZm9ybWF0KCJidWlsZC90ZXN0L2xvZ3MvJXMvJXMvJXMvc3lzdGVtLmxvZyIsIHRhZywgY2x1c3RlcklkLCBpbnN0YW5jZUlkKSk7CisgICAgICAgICAgICBmID0gbmV3IEZpbGUoRmlsZVN5c3RlbXMuZ2V0RGVmYXVsdCgpLCBTdHJpbmcuZm9ybWF0KCJidWlsZC90ZXN0L2xvZ3MvJXMvJXMvJXMvc3lzdGVtLmxvZyIsIHRhZywgY2x1c3RlcklkLCBpbnN0YW5jZUlkKSk7CiAgICAgICAgIGlmICghZi5leGlzdHMoKSkKICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5hYmxlIHRvIGxvY2F0ZSBzeXN0ZW0ubG9nIHVuZGVyICIgKyBuZXcgRmlsZSgiYnVpbGQvdGVzdC9sb2dzIikuYWJzb2x1dGVQYXRoKCkgKyAiOyBtYWtlIHN1cmUgSUNsdXN0ZXIuc2V0dXAoKSBpcyBjYWxsZWQgb3IgZXh0ZW5kIFRlc3RCYXNlSW1wbCBhbmQgZG8gbm90IGRlZmluZSBhIHN0YXRpYyBiZWZvcmVDbGFzcyBmdW5jdGlvbiB3aXRoIEBCZWZvcmVDbGFzcyIpOwogICAgICAgICByZXR1cm4gbmV3IEZpbGVMb2dBY3Rpb24oZik7CkBAIC00NDEsNyArNDQ4LDcgQEAKICAgICAgICAgYmF0Y2guaWQuc2VyaWFsaXplKG91dCk7CiAgICAgICAgIG91dC53cml0ZUxvbmcoYmF0Y2guY3JlYXRpb25UaW1lKTsKIAotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoYmF0Y2guZ2V0RW5jb2RlZE11dGF0aW9ucygpLnNpemUoKSk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKGJhdGNoLmdldEVuY29kZWRNdXRhdGlvbnMoKS5zaXplKCkpOwogCiAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBtdXRhdGlvbiA6IGJhdGNoLmdldEVuY29kZWRNdXRhdGlvbnMoKSkKICAgICAgICAgewpAQCAtNTA4LDcgKzUxNSwxNCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhlYWRlci52ZXJiLnN0YWdlLmV4ZWN1dG9yKCkuZXhlY3V0ZShFeGVjdXRvckxvY2Fscy5jcmVhdGUoc3RhdGUpLCAoKSAtPiBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCkuaW5ib3VuZFNpbmsuYWNjZXB0KG1lc3NhZ2VJbikpOworICAgICAgICAgICAgICAgIEV4ZWN1dG9yUGx1cyBleGVjdXRvciA9IGhlYWRlci52ZXJiLnN0YWdlLmV4ZWN1dG9yKCk7CisgICAgICAgICAgICAgICAgaWYgKGV4ZWN1dG9yLmlzU2h1dGRvd24oKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5tZXRyaWNzLnJlY29yZERyb3BwZWRNZXNzYWdlKG1lc3NhZ2VJbiwgbWVzc2FnZUluLmVsYXBzZWRTaW5jZUNyZWF0ZWQoVGltZVVuaXQuTkFOT1NFQ09ORFMpLCBUaW1lVW5pdC5OQU5PU0VDT05EUyk7CisgICAgICAgICAgICAgICAgICAgIGluSW5zdGFuY2Vsb2dnZXIud2FybigiRHJvcHBpbmcgbWVzc2FnZSB7fSBkdWUgdG8gc3RhZ2Uge30gYmVpbmcgc2h1dGRvd24iLCBtZXNzYWdlSW4sIGhlYWRlci52ZXJiLnN0YWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKEV4ZWN1dG9yTG9jYWxzLmNyZWF0ZShzdGF0ZSksICgpIC0+IE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5pbmJvdW5kU2luay5hY2NlcHQobWVzc2FnZUluKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgfQpAQCAtNTc4LDkgKzU5Miw5IEBACiAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5oYXMoR09TU0lQKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhY2t5Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnJpbmdfZGVsYXlfbXMiLCAiMTUwMDAiKTsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uc2lzdGVudC5yYW5nZW1vdmVtZW50IiwgImZhbHNlIik7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbnNpc3RlbnQuc2ltdWx0YW5lb3VzbW92ZXMuYWxsb3ciLCAidHJ1ZSIpOworICAgICAgICAgICAgICAgICAgICBSSU5HX0RFTEFZLnNldExvbmcoMTUwMDApOworICAgICAgICAgICAgICAgICAgICBDT05TSVNURU5UX1JBTkdFX01PVkVNRU5ULnNldEJvb2xlYW4oZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBDT05TSVNURU5UX1NJTVVMVEFORU9VU19NT1ZFU19BTExPVy5zZXRCb29sZWFuKHRydWUpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIG1rZGlycygpOwpAQCAtNTkwLDkgKzYwNCwxMiBAQAogICAgICAgICAgICAgICAgIERpc3RyaWJ1dGVkVGVzdFNuaXRjaC5hc3NpZ24oY29uZmlnLm5ldHdvcmtUb3BvbG9neSgpKTsKIAogICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgICAgICAgICAgICAgIExvZ2dpbmdTdXBwb3J0RmFjdG9yeS5nZXRMb2dnaW5nU3VwcG9ydCgpLm9uU3RhcnR1cCgpOworCiAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLnNldEZTRXJyb3JIYW5kbGVyKG5ldyBEZWZhdWx0RlNFcnJvckhhbmRsZXIoKSk7CiAgICAgICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmNyZWF0ZUFsbERpcmVjdG9yaWVzKCk7CiAgICAgICAgICAgICAgICAgQ2Fzc2FuZHJhRGFlbW9uLmdldEluc3RhbmNlRm9yVGVzdGluZygpLm1pZ3JhdGVTeXN0ZW1EYXRhSWZOZWVkZWQoKTsKKyAgICAgICAgICAgICAgICBDYXNzYW5kcmFEYWVtb24ubG9nU3lzdGVtSW5mbyhpbkluc3RhbmNlbG9nZ2VyKTsKICAgICAgICAgICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RhcnQoKTsKIAogICAgICAgICAgICAgICAgIENhc3NhbmRyYURhZW1vbi5nZXRJbnN0YW5jZUZvclRlc3RpbmcoKS5ydW5TdGFydHVwQ2hlY2tzKCk7CkBAIC02MTksNiArNjM2LDkgQEAKICAgICAgICAgICAgICAgICAvLyBTdGFydCB1cCB2aXJ0dWFsIHRhYmxlIHN1cHBvcnQKICAgICAgICAgICAgICAgICBDYXNzYW5kcmFEYWVtb24uZ2V0SW5zdGFuY2VGb3JUZXN0aW5nKCkuc2V0dXBWaXJ0dWFsS2V5c3BhY2VzKCk7CiAKKyAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWJyaXMgaW4gZGF0YSBkaXJlY3RvcmllcworICAgICAgICAgICAgICAgIENhc3NhbmRyYURhZW1vbi5nZXRJbnN0YW5jZUZvclRlc3RpbmcoKS5zY3J1YkRhdGFEaXJlY3RvcmllcygpOworCiAgICAgICAgICAgICAgICAgS2V5c3BhY2Uuc2V0SW5pdGlhbGl6ZWQoKTsKIAogICAgICAgICAgICAgICAgIC8vIFJlcGxheSBhbnkgQ29tbWl0TG9nU2VnbWVudHMgZm91bmQgb24gZGlzawpAQCAtNjYzLDYgKzY4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIHByb3BhZ2F0ZU1lc3NhZ2luZ1ZlcnNpb25zKGNsdXN0ZXIpOyAvLyBmYWtlIG1lc3NhZ2luZyBuZWVkcyB0byBrbm93IG1lc3NhZ2luZyB2ZXJzaW9uIGZvciBmaWx0ZXJzCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGludGVybm9kZU1lc3NhZ2luZ1N0YXJ0ZWQgPSB0cnVlOworCiAgICAgICAgICAgICAgICAgSlZNU3RhYmlsaXR5SW5zcGVjdG9yLnJlcGxhY2VLaWxsZXIobmV3IEluc3RhbmNlS2lsbGVyKEluc3RhbmNlLnRoaXM6OnNodXRkb3duKSk7CiAKICAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGlzIGlzIG1vcmUgdGhhbiBqdXN0IGdvc3NpcApAQCAtOTMxLDkgKzk1Miw5IEBACiAgICAgcHVibGljIE5vZGVUb29sUmVzdWx0IG5vZGV0b29sUmVzdWx0KGJvb2xlYW4gd2l0aE5vdGlmaWNhdGlvbnMsIFN0cmluZy4uLiBjb21tYW5kQW5kQXJncykKICAgICB7CiAgICAgICAgIHJldHVybiBzeW5jKCgpIC0+IHsKLSAgICAgICAgICAgIHRyeSAoQ2FwdHVyaW5nT3V0cHV0IG91dHB1dCA9IG5ldyBDYXB0dXJpbmdPdXRwdXQoKSkKKyAgICAgICAgICAgIHRyeSAoQ2FwdHVyaW5nT3V0cHV0IG91dHB1dCA9IG5ldyBDYXB0dXJpbmdPdXRwdXQoKTsKKyAgICAgICAgICAgICAgICAgRFRlc3ROb2RlVG9vbCBub2RldG9vbCA9IG5ldyBEVGVzdE5vZGVUb29sKHdpdGhOb3RpZmljYXRpb25zLCBvdXRwdXQuZGVsZWdhdGUpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERUZXN0Tm9kZVRvb2wgbm9kZXRvb2wgPSBuZXcgRFRlc3ROb2RlVG9vbCh3aXRoTm90aWZpY2F0aW9ucywgb3V0cHV0LmRlbGVnYXRlKTsKICAgICAgICAgICAgICAgICAvLyBpbnN0YWxsIHNlY3VyaXR5IG1hbmFnZXIgdG8gZ2V0IGluZm9ybWVkIGFib3V0IHRoZSBleGl0LWNvZGUKICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0U2VjdXJpdHlNYW5hZ2VyKG5ldyBTZWN1cml0eU1hbmFnZXIoKQogICAgICAgICAgICAgICAgIHsKQEAgLTEwMTcsMTUgKzEwMzgsMTggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRFRlc3ROb2RlVG9vbCBleHRlbmRzIE5vZGVUb29sIHsKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERUZXN0Tm9kZVRvb2wgZXh0ZW5kcyBOb2RlVG9vbCBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUKKyAgICB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgU3RvcmFnZVNlcnZpY2VNQmVhbiBzdG9yYWdlUHJveHk7CiAgICAgICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGluZ05vdGlmaWNhdGlvbkxpc3RlbmVyIG5vdGlmaWNhdGlvbnMgPSBuZXcgQ29sbGVjdGluZ05vdGlmaWNhdGlvbkxpc3RlbmVyKCk7Ci0KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbnRlcm5hbE5vZGVQcm9iZSBpbnRlcm5hbE5vZGVQcm9iZTsKICAgICAgICAgcHJpdmF0ZSBUaHJvd2FibGUgbGF0ZXN0RXJyb3I7CiAKLSAgICAgICAgcHVibGljIERUZXN0Tm9kZVRvb2woYm9vbGVhbiB3aXRoTm90aWZpY2F0aW9ucywgT3V0cHV0IG91dHB1dCkgeworICAgICAgICBwdWJsaWMgRFRlc3ROb2RlVG9vbChib29sZWFuIHdpdGhOb3RpZmljYXRpb25zLCBPdXRwdXQgb3V0cHV0KQorICAgICAgICB7CiAgICAgICAgICAgICBzdXBlcihuZXcgSW50ZXJuYWxOb2RlUHJvYmVGYWN0b3J5KHdpdGhOb3RpZmljYXRpb25zKSwgb3V0cHV0KTsKLSAgICAgICAgICAgIHN0b3JhZ2VQcm94eSA9IG5ldyBJbnRlcm5hbE5vZGVQcm9iZSh3aXRoTm90aWZpY2F0aW9ucykuZ2V0U3RvcmFnZVNlcnZpY2UoKTsKKyAgICAgICAgICAgIGludGVybmFsTm9kZVByb2JlID0gbmV3IEludGVybmFsTm9kZVByb2JlKHdpdGhOb3RpZmljYXRpb25zKTsKKyAgICAgICAgICAgIHN0b3JhZ2VQcm94eSA9IGludGVybmFsTm9kZVByb2JlLmdldFN0b3JhZ2VTZXJ2aWNlKCk7CiAgICAgICAgICAgICBzdG9yYWdlUHJveHkuYWRkTm90aWZpY2F0aW9uTGlzdGVuZXIobm90aWZpY2F0aW9ucywgbnVsbCwgbnVsbCk7CiAgICAgICAgIH0KIApAQCAtMTA3MSw2ICsxMDk1LDEyIEBACiAgICAgICAgICAgICBzdXBlci5lcnIoZSk7CiAgICAgICAgICAgICBsYXRlc3RFcnJvciA9IGU7CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICBpbnRlcm5hbE5vZGVQcm9iZS5jbG9zZSgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ29sbGVjdGluZ05vdGlmaWNhdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgTm90aWZpY2F0aW9uTGlzdGVuZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvaW1wbC9UcmFjaW5nVXRpbC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9pbXBsL1RyYWNpbmdVdGlsLmphdmEKaW5kZXggMDZmZGFiYi4uOWMzNDdlMCAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9pbXBsL1RyYWNpbmdVdGlsLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9pbXBsL1RyYWNpbmdVdGlsLmphdmEKQEAgLTI3LDcgKzI3LDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKIAotCiAvKioKICAqIFV0aWxpdGllcyBmb3IgYWNjZXNzaW5nIHRoZSBzeXN0ZW1fdHJhY2VzIHRhYmxlIGZyb20gaW4tSlZNIGR0ZXN0cwogICovCkBAIC0xMDQsMTQgKzEwMyw0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRyYWNlczsKICAgICB9Ci0KLSAgICAvLyBTZXQgdXAgdGhlIHdhaXQgZm9yIHRyYWNpbmcgdGltZSBzeXN0ZW0gcHJvcGVydHksIHJldHVybmluZyB0aGUgcHJldmlvdXMgdmFsdWUuCi0gICAgLy8gSGFuZGxlcyBiZWluZyBjYWxsZWQgYWdhaW4gdG8gcmVzZXQgd2l0aCB0aGUgb3JpZ2luYWwgdmFsdWUsIHJlcGxhY2luZyB0aGUgbnVsbAotICAgIC8vIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2V0V2FpdEZvclRyYWNpbmdFdmVudFRpbWVvdXRTZWNzKFN0cmluZyB0aW1lb3V0SW5TZWNvbmRzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLndhaXRfZm9yX3RyYWNpbmdfZXZlbnRzX3RpbWVvdXRfc2VjcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dEluU2Vjb25kcyA9PSBudWxsID8gIjAiIDogdGltZW91dEluU2Vjb25kcyk7Ci0KLSAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL21vY2svbm9kZXRvb2wvSW50ZXJuYWxOb2RlUHJvYmUuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvbW9jay9ub2RldG9vbC9JbnRlcm5hbE5vZGVQcm9iZS5qYXZhCmluZGV4IDA5NzIwNmEuLjM4MWJiMDkgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvbW9jay9ub2RldG9vbC9JbnRlcm5hbE5vZGVQcm9iZS5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvbW9jay9ub2RldG9vbC9JbnRlcm5hbE5vZGVQcm9iZS5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YXgubWFuYWdlbWVudC5MaXN0ZW5lck5vdEZvdW5kRXhjZXB0aW9uOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKIApAQCAtNDUsMTQgKzQ0LDEzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5HQ0luc3BlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VQcm94eTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2VNQmVhbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtTWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ob2RlUHJvYmU7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKIAogcHVibGljIGNsYXNzIEludGVybmFsTm9kZVByb2JlIGV4dGVuZHMgTm9kZVByb2JlCiB7CiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHdpdGhOb3RpZmljYXRpb25zOworICAgIHByaXZhdGUgYm9vbGVhbiBwcmV2aW91c1NraXBOb3RpZmljYXRpb25MaXN0ZW5lcnMgPSBmYWxzZTsKIAogICAgIHB1YmxpYyBJbnRlcm5hbE5vZGVQcm9iZShib29sZWFuIHdpdGhOb3RpZmljYXRpb25zKQogICAgIHsKQEAgLTY2LDI2ICs2NCwxMCBAQAogICAgICAgICBtYmVhblNlcnZlckNvbm4gPSBudWxsOwogICAgICAgICBqbXhjID0gbnVsbDsKIAotICAgICAgICBpZiAod2l0aE5vdGlmaWNhdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzUHJveHkgPSBTdG9yYWdlU2VydmljZS5pbnN0YW5jZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIG5vdGlmaWNhdGlvbiBhcGlzIHdpdGggYSBuby1vcCBtZXRob2QKLSAgICAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlTUJlYW4gbW9jayA9IE1vY2tpdG8uc3B5KFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlKTsKLSAgICAgICAgICAgIE1vY2tpdG8uZG9Ob3RoaW5nKCkud2hlbihtb2NrKS5hZGROb3RpZmljYXRpb25MaXN0ZW5lcihNb2NraXRvLmFueSgpLCBNb2NraXRvLmFueSgpLCBNb2NraXRvLmFueSgpKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1vY2tpdG8uZG9Ob3RoaW5nKCkud2hlbihtb2NrKS5yZW1vdmVOb3RpZmljYXRpb25MaXN0ZW5lcihNb2NraXRvLmFueSgpLCBNb2NraXRvLmFueSgpLCBNb2NraXRvLmFueSgpKTsKLSAgICAgICAgICAgICAgICBNb2NraXRvLmRvTm90aGluZygpLndoZW4obW9jaykucmVtb3ZlTm90aWZpY2F0aW9uTGlzdGVuZXIoTW9ja2l0by5hbnkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoTGlzdGVuZXJOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNzUHJveHkgPSBtb2NrOwotICAgICAgICB9CisgICAgICAgIHByZXZpb3VzU2tpcE5vdGlmaWNhdGlvbkxpc3RlbmVycyA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLnNraXBOb3RpZmljYXRpb25MaXN0ZW5lcnM7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLnNraXBOb3RpZmljYXRpb25MaXN0ZW5lcnMgPSAhd2l0aE5vdGlmaWNhdGlvbnM7CisKKyAgICAgICAgc3NQcm94eSA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlOwogICAgICAgICBtc1Byb3h5ID0gTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpOwogICAgICAgICBzdHJlYW1Qcm94eSA9IFN0cmVhbU1hbmFnZXIuaW5zdGFuY2U7CiAgICAgICAgIGNvbXBhY3Rpb25Qcm94eSA9IENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlOwpAQCAtMTA1LDcgKzg3LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCiAgICAgewotICAgICAgICAvLyBub3RoaW5nIHRvIGNsb3NlLiBuby1vcAorICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5za2lwTm90aWZpY2F0aW9uTGlzdGVuZXJzID0gcHJldmlvdXNTa2lwTm90aWZpY2F0aW9uTGlzdGVuZXJzOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9zaGFyZWQvQnl0ZW1hbi5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9zaGFyZWQvQnl0ZW1hbi5qYXZhCmluZGV4IGI0ZGQxMGMuLmM1Yzc2ZTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvc2hhcmVkL0J5dGVtYW4uamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3NoYXJlZC9CeXRlbWFuLmphdmEKQEAgLTQ3LDExICs0NywxMyBAQAogCiBpbXBvcnQgb3JnLmpib3NzLmJ5dGVtYW4uYWdlbnQuVHJhbnNmb3JtZXI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0JZVEVNQU5fVFJBTlNGT1JNQVRJT05TX0RFQlVHOworCiBwdWJsaWMgZmluYWwgY2xhc3MgQnl0ZW1hbgogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihCeXRlbWFuLmNsYXNzKTsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVFJBTlNGT1JNQVRJT05TID0gQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEudGVzdC5ieXRlbWFuLnRyYW5zZm9ybWF0aW9ucy5kZWJ1ZyIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVFJBTlNGT1JNQVRJT05TID0gVEVTVF9CWVRFTUFOX1RSQU5TRk9STUFUSU9OU19ERUJVRy5nZXRCb29sZWFuKCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWV0aG9kIE1FVEhPRDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkwgQllURU1BTjsKIApkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9zaGFyZWQvQ2x1c3RlclV0aWxzLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3NoYXJlZC9DbHVzdGVyVXRpbHMuamF2YQppbmRleCBkYzI4MGYzLi5jMzEzODIxIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3NoYXJlZC9DbHVzdGVyVXRpbHMuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3NoYXJlZC9DbHVzdGVyVXRpbHMuamF2YQpAQCAtNDAsNiArNDAsMTAgQEAKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRnV0dXJlczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5BcHBsaWNhdGlvblN0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5WZXJzaW9uZWRWYWx1ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIApAQCAtNTksNiArNjMsOSBAQAogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5VbmludGVycnVwdGlibGVzLnNsZWVwVW5pbnRlcnJ1cHRpYmx5OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkJPT1RTVFJBUF9TQ0hFTUFfREVMQVlfTVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQlJPQURDQVNUX0lOVEVSVkFMX01TOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFUExBQ0VfQUREUkVTU19GSVJTVF9CT09UOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJJTkdfREVMQVk7CiBpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKIAogLyoqCkBAIC0yNTEsMTMgKzI1OCwxMyBAQAogCiAgICAgICAgIHJldHVybiBzdGFydChpbnN0LCBwcm9wZXJ0aWVzIC0+IHsKICAgICAgICAgICAgIC8vIGxvd2VyIHRoaXMgc28gdGhlIHJlcGxhY2VtZW50IHdhaXRzIGxlc3MgdGltZQotICAgICAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmJyb2FkY2FzdF9pbnRlcnZhbF9tcyIsIExvbmcudG9TdHJpbmcoVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygzMCkpKTsKKyAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0KEJST0FEQ0FTVF9JTlRFUlZBTF9NUywgTG9uZy50b1N0cmluZyhUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDMwKSkpOwogICAgICAgICAgICAgLy8gZGVmYXVsdCBpcyAzMHMsIGxvd2VyaW5nIGFzIGl0IHNob3VsZCBiZSBmYXN0ZXIKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImNhc3NhbmRyYS5yaW5nX2RlbGF5X21zIiwgTG9uZy50b1N0cmluZyhUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDEwKSkpOworICAgICAgICAgICAgcHJvcGVydGllcy5zZXQoUklOR19ERUxBWSwgTG9uZy50b1N0cmluZyhUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDEwKSkpOwogICAgICAgICAgICAgcHJvcGVydGllcy5zZXQoQk9PVFNUUkFQX1NDSEVNQV9ERUxBWV9NUywgVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygxMCkpOwogCiAgICAgICAgICAgICAvLyBzdGF0ZSB3aGljaCBub2RlIHRvIHJlcGxhY2UKLSAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoImNhc3NhbmRyYS5yZXBsYWNlX2FkZHJlc3NfZmlyc3RfYm9vdCIsIHRvUmVwbGFjZS5jb25maWcoKS5icm9hZGNhc3RBZGRyZXNzKCkuZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkpOworICAgICAgICAgICAgcHJvcGVydGllcy5zZXQoUkVQTEFDRV9BRERSRVNTX0ZJUlNUX0JPT1QsIHRvUmVwbGFjZS5jb25maWcoKS5icm9hZGNhc3RBZGRyZXNzKCkuZ2V0QWRkcmVzcygpLmdldEhvc3RBZGRyZXNzKCkpOwogCiAgICAgICAgICAgICBmbi5hY2NlcHQoaW5zdCwgcHJvcGVydGllcyk7CiAgICAgICAgIH0pOwpAQCAtNTU0LDYgKzU2MSw2MyBAQAogICAgICAgICB9KTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXdhaXRHb3NzaXBTY2hlbWFNYXRjaChJQ2x1c3Rlcjw/IGV4dGVuZHMgIElJbnN0YW5jZT4gY2x1c3RlcikKKyAgICB7CisgICAgICAgIGNsdXN0ZXIuZm9yRWFjaChDbHVzdGVyVXRpbHM6OmF3YWl0R29zc2lwU2NoZW1hTWF0Y2gpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhd2FpdEdvc3NpcFNjaGVtYU1hdGNoKElJbnN0YW5jZSBpbnN0YW5jZSkKKyAgICB7CisgICAgICAgIGlmICghaW5zdGFuY2UuY29uZmlnKCkuaGFzKEZlYXR1cmUuR09TU0lQKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd2hlbiBnb3Npc3AgaXNuJ3QgZW5hYmxlZCwgZG9uJ3QgYm90aGVyIHdhaXRpbmcgb24gZ29zc2lwIHRvIHNldHRsZS4uLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGF3YWl0R29zc2lwKGluc3RhbmNlLCAiU2NoZW1hIElEcyBkaWQgbm90IG1hdGNoIiwgYWxsIC0+IHsKKyAgICAgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPFN0cmluZywgU3RyaW5nPj4gZSA6IGFsbC5lbnRyeVNldCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RhdGUgPSBlLmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgLy8gaGFzIHRoZSBpbnN0YW5jZSBqb2luZWQ/CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0YXR1cyA9IHN0YXRlLmdldChBcHBsaWNhdGlvblN0YXRlLlNUQVRVU19XSVRIX1BPUlQubmFtZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRlLmdldChBcHBsaWNhdGlvblN0YXRlLlNUQVRVUy5uYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCB8fCAhc3RhdHVzLmNvbnRhaW5zKFZlcnNpb25lZFZhbHVlLlNUQVRVU19OT1JNQUwpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gaWdub3JlIGluc3RhbmNlcyBub3Qgam9pbmVkIHlldAorICAgICAgICAgICAgICAgIFN0cmluZyBzY2hlbWEgPSBzdGF0ZS5nZXQoIlNDSEVNQSIpOworICAgICAgICAgICAgICAgIGlmIChzY2hlbWEgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVbmFibGUgdG8gZmluZCBzY2hlbWEgZm9yICIgKyBlLmdldEtleSgpICsgIjsgc3RhdHVzIHdhcyAiICsgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBzY2hlbWEgPSBzY2hlbWEuc3BsaXQoIjoiKVsxXTsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gc2NoZW1hOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICghY3VycmVudC5lcXVhbHMoc2NoZW1hKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGF3YWl0R29zc2lwU3RhdGVNYXRjaChJQ2x1c3Rlcjw/IGV4dGVuZHMgIElJbnN0YW5jZT4gY2x1c3RlciwgSUluc3RhbmNlIGV4cGVjdGVkSW5Hb3NzaXAsIEFwcGxpY2F0aW9uU3RhdGUga2V5KQorICAgIHsKKyAgICAgICAgU2V0PFN0cmluZz4gbWF0Y2hlcyA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoZXMgPSBjbHVzdGVyLnN0cmVhbSgpLm1hcChDbHVzdGVyVXRpbHM6Omdvc3NpcEluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZ2kgLT4gT2JqZWN0cy5yZXF1aXJlTm9uTnVsbChnaS5nZXQoZ2V0QnJvYWRjYXN0QWRkcmVzc1N0cmluZyhleHBlY3RlZEluR29zc2lwKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKG0gLT4gbS5nZXQoa2V5Lm5hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgICAgICBpZiAobWF0Y2hlcy5pc0VtcHR5KCkgfHwgbWF0Y2hlcy5zaXplKCkgPT0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBzbGVlcFVuaW50ZXJydXB0aWJseSgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkV4cGVjdGVkIEFwcGxpY2F0aW9uU3RhdGUuIiArIGtleSArICIgdG8gbWF0Y2gsIGJ1dCBzYXcgIiArIG1hdGNoZXMpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEdldCB0aGUgZ29zc2lwIGluZm9ybWF0aW9uIGZyb20gdGhlIG5vZGUuICBDdXJyZW50bHkgb25seSBhZGRyZXNzLCBnZW5lcmF0aW9uLCBhbmQgaGVhcnRiZWF0IGFyZSByZXR1cm5lZAogICAgICAqCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3NoYXJlZC9XaXRoUHJvcGVydGllcy5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC9zaGFyZWQvV2l0aFByb3BlcnRpZXMuamF2YQppbmRleCA4ODk4N2MyLi5kMTdkM2U2IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3NoYXJlZC9XaXRoUHJvcGVydGllcy5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvc2hhcmVkL1dpdGhQcm9wZXJ0aWVzLmphdmEKQEAgLTIzLDkyICsyMyw3MyBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5jb252ZXJ0VG9TdHJpbmc7CisKIHB1YmxpYyBmaW5hbCBjbGFzcyBXaXRoUHJvcGVydGllcyBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUKIHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8UHJvcGVydHk+IHByb3BlcnRpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UnVubmFibGU+IHJvbGxiYWNrID0gbmV3IEFycmF5TGlzdDw+KCk7CiAKICAgICBwdWJsaWMgV2l0aFByb3BlcnRpZXMoKQogICAgIHsKICAgICB9CiAKLSAgICBwdWJsaWMgV2l0aFByb3BlcnRpZXMoU3RyaW5nLi4uIGt2cykKLSAgICB7Ci0gICAgICAgIHdpdGgoa3ZzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB3aXRoKFN0cmluZy4uLiBrdnMpCisgICAgcHVibGljIFdpdGhQcm9wZXJ0aWVzIHdpdGgoU3RyaW5nLi4uIGt2cykKICAgICB7CiAgICAgICAgIGFzc2VydCBrdnMubGVuZ3RoICUgMiA9PSAwIDogIklucHV0IG11c3QgaGF2ZSBhbiBldmVuIGFtb3VudCBvZiBpbnB1dHMgYnV0IGdpdmVuICIgKyBrdnMubGVuZ3RoOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBrdnMubGVuZ3RoIC0gMjsgaSA9IGkgKyAyKQotICAgICAgICB7CiAgICAgICAgICAgICB3aXRoKGt2c1tpXSwga3ZzW2kgKyAxXSk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKQorICAgIHB1YmxpYyBXaXRoUHJvcGVydGllcyBzZXQoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIHByb3AsIFN0cmluZyB2YWx1ZSkKICAgICB7Ci0gICAgICAgIHdpdGgoa2V5LCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBzZXQocHJvcCwgKCkgLT4gcHJvcC5zZXRTdHJpbmcodmFsdWUpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXQoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIHByb3AsIFN0cmluZyB2YWx1ZSkKKyAgICBwdWJsaWMgV2l0aFByb3BlcnRpZXMgc2V0KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBwcm9wLCBTdHJpbmcuLi4gdmFsdWVzKQogICAgIHsKLSAgICAgICAgd2l0aChwcm9wLmdldEtleSgpLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBzZXQocHJvcCwgQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXQoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIHByb3AsIFN0cmluZy4uLiB2YWx1ZXMpCisgICAgcHVibGljIFdpdGhQcm9wZXJ0aWVzIHNldChDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMgcHJvcCwgQ29sbGVjdGlvbjxTdHJpbmc+IHZhbHVlcykKICAgICB7Ci0gICAgICAgIHNldChwcm9wLCBBcnJheXMuYXNMaXN0KHZhbHVlcykpOworICAgICAgICByZXR1cm4gc2V0KHByb3AsIEpvaW5lci5vbigiLCIpLmpvaW4odmFsdWVzKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBwcm9wLCBDb2xsZWN0aW9uPFN0cmluZz4gdmFsdWVzKQorICAgIHB1YmxpYyBXaXRoUHJvcGVydGllcyBzZXQoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIHByb3AsIGJvb2xlYW4gdmFsdWUpCiAgICAgewotICAgICAgICBzZXQocHJvcCwgSm9pbmVyLm9uKCIsIikuam9pbih2YWx1ZXMpKTsKKyAgICAgICAgcmV0dXJuIHNldChwcm9wLCAoKSAtPiBwcm9wLnNldEJvb2xlYW4odmFsdWUpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBzZXQoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzIHByb3AsIGJvb2xlYW4gdmFsdWUpCisgICAgcHVibGljIFdpdGhQcm9wZXJ0aWVzIHNldChDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMgcHJvcCwgbG9uZyB2YWx1ZSkKICAgICB7Ci0gICAgICAgIHNldChwcm9wLCBCb29sZWFuLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIHJldHVybiBzZXQocHJvcCwgKCkgLT4gcHJvcC5zZXRMb25nKHZhbHVlKSk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgc2V0KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBwcm9wLCBsb25nIHZhbHVlKQorICAgIHByaXZhdGUgdm9pZCB3aXRoKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkKICAgICB7Ci0gICAgICAgIHNldChwcm9wLCBMb25nLnRvU3RyaW5nKHZhbHVlKSk7CisgICAgICAgIFN0cmluZyBwcmV2aW91cyA9IFN5c3RlbS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdibG9ja1N5c3RlbVByb3BlcnR5VXNhZ2UnCisgICAgICAgIHJvbGxiYWNrLmFkZChwcmV2aW91cyA9PSBudWxsID8gKCkgLT4gU3lzdGVtLmNsZWFyUHJvcGVydHkoa2V5KSA6ICgpIC0+IFN5c3RlbS5zZXRQcm9wZXJ0eShrZXksIHByZXZpb3VzKSk7IC8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnYmxvY2tTeXN0ZW1Qcm9wZXJ0eVVzYWdlJwogICAgIH0KIAotICAgIHB1YmxpYyB2b2lkIHdpdGgoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKQorICAgIHByaXZhdGUgV2l0aFByb3BlcnRpZXMgc2V0KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBwcm9wLCBTdXBwbGllcjxPYmplY3Q+IHByZXYpCiAgICAgewotICAgICAgICBTdHJpbmcgcHJldmlvdXMgPSBTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHByb3BlcnRpZXMuYWRkKG5ldyBQcm9wZXJ0eShrZXksIHByZXZpb3VzKSk7CisgICAgICAgIFN0cmluZyBwcmV2aW91cyA9IGNvbnZlcnRUb1N0cmluZyhwcmV2LmdldCgpKTsKKyAgICAgICAgcm9sbGJhY2suYWRkKHByZXZpb3VzID09IG51bGwgPyBwcm9wOjpjbGVhclZhbHVlIDogKCkgLT4gcHJvcC5zZXRTdHJpbmcocHJldmlvdXMpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCi0KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCiAgICAgewotICAgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKHByb3BlcnRpZXMpOwotICAgICAgICBwcm9wZXJ0aWVzLmZvckVhY2gocyAtPiB7Ci0gICAgICAgICAgICBpZiAocy52YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKHMua2V5KTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkocy5rZXksIHMudmFsdWUpOwotICAgICAgICB9KTsKLSAgICAgICAgcHJvcGVydGllcy5jbGVhcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFByb3BlcnR5Ci0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBrZXk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOwotCi0gICAgICAgIHByaXZhdGUgUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKHJvbGxiYWNrKTsKKyAgICAgICAgcm9sbGJhY2suZm9yRWFjaChSdW5uYWJsZTo6cnVuKTsKKyAgICAgICAgcm9sbGJhY2suY2xlYXIoKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQWxsb3dBdXRvU25hcHNob3RUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQWxsb3dBdXRvU25hcHNob3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5NDkwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9BbGxvd0F1dG9TbmFwc2hvdFRlc3QuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUlzb2xhdGVkRXhlY3V0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyLmJ1aWxkOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbC5BTEw7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLkdPU1NJUDsKK2ltcG9ydCBzdGF0aWMgb3JnLmF3YWl0aWxpdHkuQXdhaXRpbGl0eS5hd2FpdDsKKworcHVibGljIGNsYXNzIEFsbG93QXV0b1NuYXBzaG90VGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbG93QXV0b1NuYXBzaG90T25BdXRvU25hcHNob3RFbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGMgPSBnZXRDbHVzdGVyKHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50ZXN0X3RhYmxlIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSB0cnVlIikpOworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJEUk9QIFRBQkxFICVzLnRlc3RfdGFibGU7IikpOworCisgICAgICAgICAgICBjaGVja1NuYXBzaG90cyhjLCB0cnVlLCAidGVzdF90YWJsZSIsICJkcm9wcGVkIik7CisKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRlc3RfdGFibGUyIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSBmYWxzZSIpKTsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiRFJPUCBUQUJMRSAlcy50ZXN0X3RhYmxlMjsiKSk7CisKKyAgICAgICAgICAgIGNoZWNrU25hcHNob3RzKGMsIGZhbHNlLCAidGVzdF90YWJsZTIiLCAiZHJvcHBlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsb3dBdXRvU25hcHNob3RPbkF1dG9TbmFwc2hvdERpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGMgPSBnZXRDbHVzdGVyKGZhbHNlKSkKKyAgICAgICAgeworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudGVzdF90YWJsZSAoYSB0ZXh0IHByaW1hcnkga2V5LCBiIGludCkgV0lUSCBhbGxvd19hdXRvX3NuYXBzaG90ID0gdHJ1ZSIpKTsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiRFJPUCBUQUJMRSAlcy50ZXN0X3RhYmxlOyIpKTsKKworICAgICAgICAgICAgY2hlY2tTbmFwc2hvdHMoYywgZmFsc2UsICJ0ZXN0X3RhYmxlIiwgImRyb3BwZWQiKTsKKworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudGVzdF90YWJsZTIgKGEgdGV4dCBwcmltYXJ5IGtleSwgYiBpbnQpIFdJVEggYWxsb3dfYXV0b19zbmFwc2hvdCA9IGZhbHNlIikpOworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJEUk9QIFRBQkxFICVzLnRlc3RfdGFibGUyOyIpKTsKKworICAgICAgICAgICAgY2hlY2tTbmFwc2hvdHMoYywgZmFsc2UsICJ0ZXN0X3RhYmxlMiIsICJkcm9wcGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlQW5kRW5hYmxlQWxsb3dBdXRvU25hcHNob3QoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgYyA9IGdldENsdXN0ZXIodHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRlc3RfdGFibGUgKGEgdGV4dCBwcmltYXJ5IGtleSwgYiBpbnQpIFdJVEggYWxsb3dfYXV0b19zbmFwc2hvdCA9IHRydWUiKSk7CisKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQUxURVIgVEFCTEUgJXMudGVzdF90YWJsZSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSBmYWxzZSIpKTsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQUxURVIgVEFCTEUgJXMudGVzdF90YWJsZSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSB0cnVlIikpOworCisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkRST1AgVEFCTEUgJXMudGVzdF90YWJsZTsiKSk7CisKKyAgICAgICAgICAgIGNoZWNrU25hcHNob3RzKGMsIHRydWUsICJ0ZXN0X3RhYmxlIiwgImRyb3BwZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRydW5jYXRlQWxsb3dBdXRvU25hcHNob3QoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgYyA9IGdldENsdXN0ZXIodHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGFsbG93X2F1dG9fc25hcHNob3QgPSB0cnVlCisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50ZXN0X3RhYmxlIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSB0cnVlIikpOworCisgICAgICAgICAgICBjLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50ZXN0X3RhYmxlIChhLCBiKSBWQUxVRVMgKCdhJywgMSk7IiksIEFMTCk7CisKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiVFJVTkNBVEUgVEFCTEUgJXMudGVzdF90YWJsZTsiKSk7CisKKyAgICAgICAgICAgIGNoZWNrU25hcHNob3RzKGMsIHRydWUsICJ0ZXN0X3RhYmxlIiwgInRydW5jYXRlZCIpOworCisgICAgICAgICAgICAvLyBhbGxvd19hdXRvX3NuYXBzaG90ID0gZmFsc2UKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRlc3RfdGFibGUyIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSBmYWxzZSIpKTsKKworICAgICAgICAgICAgYy5jb29yZGluYXRvcigxKS5leGVjdXRlKHdpdGhLZXlzcGFjZSgiSU5TRVJUIElOVE8gJXMudGVzdF90YWJsZTIgKGEsIGIpIFZBTFVFUyAoJ2EnLCAxKTsiKSwgQUxMKTsKKworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJUUlVOQ0FURSBUQUJMRSAlcy50ZXN0X3RhYmxlMjsiKSk7CisKKyAgICAgICAgICAgIGNoZWNrU25hcHNob3RzKGMsIGZhbHNlLCAidGVzdF90YWJsZTIiLCAidHJ1bmNhdGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXRlcmlhbGl6ZWRWaWV3QWxsb3dBdXRvU25hcHNob3QoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgYyA9IGdldENsdXN0ZXIodHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG1hdGVyaWFsaXplZCB2aWV3IGFsbG93X2F1dG9fc25hcHNob3QgPSBmYWxzZQorICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudCAoayBpbnQsIGMxIGludCwgYzIgaW50LCB2MSBpbnQsIHYyIGludCwgUFJJTUFSWSBLRVkgKGssIGMxLCBjMikpIikpOworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMubXYxIEFTIFNFTEVDVCAqIEZST00gdCBXSEVSRSBrIElTIE5PVCBOVUxMIEFORCBjMSBJUyBOT1QgTlVMTCBBTkQgYzIgSVMgTk9UIE5VTEwgUFJJTUFSWSBLRVkgKGMxLCBrLCBjMikgV0lUSCBhbGxvd19hdXRvX3NuYXBzaG90ID0gZmFsc2UiKSk7CisKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnQgKGssIGMxLCBjMiwgdjEsIHYyKSBWQUxVRVMgKDEsIDIsIDMsIDQsIDUpOyIpLCBBTEwpOworCisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkRST1AgTUFURVJJQUxJWkVEIFZJRVcgJXMubXYxOyIpKTsKKworICAgICAgICAgICAgY2hlY2tTbmFwc2hvdHMoYywgZmFsc2UsICJtdjEiLCAiZHJvcHBlZCIpOworCisgICAgICAgICAgICAvLyBtYXRlcmlhbGl6ZWQgdmlldyBhbGxvd19hdXRvX3NuYXBzaG90ID0gdHJ1ZQorICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMubXYxIEFTIFNFTEVDVCAqIEZST00gdCBXSEVSRSBrIElTIE5PVCBOVUxMIEFORCBjMSBJUyBOT1QgTlVMTCBBTkQgYzIgSVMgTk9UIE5VTEwgUFJJTUFSWSBLRVkgKGMxLCBrLCBjMikgV0lUSCBhbGxvd19hdXRvX3NuYXBzaG90ID0gdHJ1ZSIpKTsKKworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJEUk9QIE1BVEVSSUFMSVpFRCBWSUVXICVzLm12MTsiKSk7CisgICAgICAgICAgICBjaGVja1NuYXBzaG90cyhjLCB0cnVlLCAibXYxIiwgImRyb3BwZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQ2x1c3RlciBnZXRDbHVzdGVyKGJvb2xlYW4gYXV0b1NuYXBzaG90RW5hYmxlZCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gaW5pdChidWlsZCgyKS53aXRoQ29uZmlnKGMgLT4gYy53aXRoKEdPU1NJUCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJhdXRvX3NuYXBzaG90IiwgYXV0b1NuYXBzaG90RW5hYmxlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJtYXRlcmlhbGl6ZWRfdmlld3NfZW5hYmxlZCIsIHRydWUpKS5zdGFydCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tTbmFwc2hvdHMoQ2x1c3RlciBjbHVzdGVyLCBib29sZWFuIHNob3VsZENvbnRhaW4sIFN0cmluZyB0YWJsZSwgU3RyaW5nIHNuYXBzaG90UHJlZml4KQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjbHVzdGVyLnNpemUoKSArIDE7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgaW50IG5vZGUgPSBpOyAvLyBoYXMgdG8gYmUgZWZmZWN0aXZlbHkgZmluYWwgZm9yIHRoZSB1c2FnZSBpbiAidW50aWwiIG1ldGhvZAorICAgICAgICAgICAgYXdhaXQoKS51bnRpbCgoKSAtPiBjbHVzdGVyLmdldChub2RlKS5hcHBsaWVzT25JbnN0YW5jZSgoSUlzb2xhdGVkRXhlY3V0b3IuU2VyaWFsaXphYmxlVHJpRnVuY3Rpb248Qm9vbGVhbiwgU3RyaW5nLCBTdHJpbmcsIEJvb2xlYW4+KSAoc2hvdWxkQ29udGFpblNuYXBzaG90LCB0YWJsZU5hbWUsIHByZWZpeCkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyZWFtPFN0cmluZz4gc3RyZWFtID0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuZ2V0U25hcHNob3REZXRhaWxzKENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpLmtleVNldCgpLnN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZGljYXRlPFN0cmluZz4gcHJlZGljYXRlID0gdGFnIC0+IHRhZy5zdGFydHNXaXRoKHByZWZpeCArICctJykgJiYgdGFnLmVuZHNXaXRoKCctJyArIHRhYmxlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hvdWxkQ29udGFpblNuYXBzaG90ID8gc3RyZWFtLmFueU1hdGNoKHByZWRpY2F0ZSkgOiBzdHJlYW0ubm9uZU1hdGNoKHByZWRpY2F0ZSk7CisgICAgICAgICAgICB9KS5hcHBseShzaG91bGRDb250YWluLCB0YWJsZSwgc25hcHNob3RQcmVmaXgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9BbHRlclRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9BbHRlclRlc3QuamF2YQppbmRleCAyMDYxYzI5MS4uYmM3MTU5YiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0FsdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9BbHRlclRlc3QuamF2YQpAQCAtMzgsMTAgKzM4LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLlNpbXBsZVF1ZXJ5UmVzdWx0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Ub2tlblN1cHBsaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5DbHVzdGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXRpbC5RdWVyeVJlc3VsdFV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSk9JTl9SSU5HOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hY3Rpb24uR29zc2lwSGVscGVyLndpdGhQcm9wZXJ0eTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuT05FOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5HT1NTSVA7CkBAIC05OSw3ICs5OSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIElJbnN0YW5jZUNvbmZpZyBjb25maWcgPSBjbHVzdGVyLm5ld0luc3RhbmNlQ29uZmlnKCk7CiAgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgZ29zc2lwcGluZ09ubHlNZW1iZXIgPSBjbHVzdGVyLmJvb3RzdHJhcChjb25maWcpOwotICAgICAgICAgICAgd2l0aFByb3BlcnR5KCJjYXNzYW5kcmEuam9pbl9yaW5nIiwgQm9vbGVhbi50b1N0cmluZyhmYWxzZSksICgpIC0+IGdvc3NpcHBpbmdPbmx5TWVtYmVyLnN0YXJ0dXAoY2x1c3RlcikpOworICAgICAgICAgICAgd2l0aFByb3BlcnR5KEpPSU5fUklORywgZmFsc2UsICgpIC0+IGdvc3NpcHBpbmdPbmx5TWVtYmVyLnN0YXJ0dXAoY2x1c3RlcikpOwogCiAgICAgICAgICAgICBpbnQgYXR0ZW1wdHMgPSAwOwogICAgICAgICAgICAgLy8gaXQgdGFrZXMgc29tZSB0aW1lIHRoZSB1bmRlcmx5aW5nIHN0cnVjdHVyZSBpcyBwb3B1bGF0ZWQgb3RoZXJ3aXNlIHRoZSB0ZXN0IGlzIGZsYWt5CkBAIC0xNTgsMTIgKzE1OCw4IEBACiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQUxURVIgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50YmwgV0lUSCBtZW10YWJsZSA9ICd0ZXN0Y29uZmlnJyIsIGZhbHNlLCBub2RlMSk7CiAgICAgICAgICAgICAvLyB0aGUgYWJvdmUgc2hvdWxkIHN1Y2NlZWQsIHRoZSBjb25maWd1cmF0aW9uIGlzIGFjY2VwdGFibGUgdG8gbm9kZTEKIAotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNjaGVtYTEgPSBRdWVyeVJlc3VsdFV0aWwuZXhwYW5kKG5vZGUxLmV4ZWN1dGVJbnRlcm5hbFdpdGhSZXN1bHQoIlNFTEVDVCAqIEZST00gc3lzdGVtX3NjaGVtYS50YWJsZXMgV0hFUkUga2V5c3BhY2VfbmFtZT0/IiwgS0VZU1BBQ0UpKTsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzY2hlbWEyID0gUXVlcnlSZXN1bHRVdGlsLmV4cGFuZChub2RlMi5leGVjdXRlSW50ZXJuYWxXaXRoUmVzdWx0KCJTRUxFQ1QgKiBGUk9NIHN5c3RlbV9zY2hlbWEudGFibGVzIFdIRVJFIGtleXNwYWNlX25hbWU9PyIsIEtFWVNQQUNFKSk7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygibm9kZTEgc2NoZW1hOiBcbnt9Iiwgc2NoZW1hMSk7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygibm9kZTIgc2NoZW1hOiBcbnt9Iiwgc2NoZW1hMik7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHNjaGVtYTEsIHNjaGVtYTIpOwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGVycm9ySW5Mb2cgPSBub2RlMi5sb2dzKCkuZ3JlcChtYXJrLCAiRVJST1IuKkludmFsaWQgbWVtdGFibGUgY29uZmlndXJhdGlvbi4qIikuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICBDbHVzdGVyVXRpbHMuYXdhaXRHb3NzaXBTY2hlbWFNYXRjaChjbHVzdGVyKTsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBlcnJvckluTG9nID0gbm9kZTIubG9ncygpLmdyZXAobWFyaywiRVJST1IuKkludmFsaWQgbWVtdGFibGUgY29uZmlndXJhdGlvbi4qIikuZ2V0UmVzdWx0KCk7CiAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShlcnJvckluTG9nLnNpemUoKSA+IDApOwogICAgICAgICAgICAgbG9nZ2VyLmluZm8oTGlzdHMubGlzdFRvU3RyaW5nKGVycm9ySW5Mb2cpKTsKIApAQCAtMTc1LDkgKzE3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0Y29uZmlnIiwgSW1tdXRhYmxlTWFwLm9mKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzX25hbWUiLCAiTm90RXhpc3RpbmdNZW10YWJsZSIpKSkpKTsKICAgICAgICAgICAgIG5vZGUzLnN0YXJ0dXAoY2x1c3Rlcik7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2NoZW1hMyA9IFF1ZXJ5UmVzdWx0VXRpbC5leHBhbmQobm9kZTMuZXhlY3V0ZUludGVybmFsV2l0aFJlc3VsdCgiU0VMRUNUICogRlJPTSBzeXN0ZW1fc2NoZW1hLnRhYmxlcyBXSEVSRSBrZXlzcGFjZV9uYW1lPT8iLCBLRVlTUEFDRSkpOwotICAgICAgICAgICAgbG9nZ2VyLmluZm8oIm5vZGUzIHNjaGVtYTogXG57fSIsIHNjaGVtYTMpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzY2hlbWExLCBzY2hlbWEzKTsKKyAgICAgICAgICAgIENsdXN0ZXJVdGlscy5hd2FpdEdvc3NpcFNjaGVtYU1hdGNoKGNsdXN0ZXIpOwogCiAgICAgICAgICAgICBlcnJvckluTG9nID0gbm9kZTMubG9ncygpLmdyZXAoIkVSUk9SLipJbnZhbGlkIG1lbXRhYmxlIGNvbmZpZ3VyYXRpb24uKiIpLmdldFJlc3VsdCgpOwogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZXJyb3JJbkxvZy5zaXplKCkgPiAwKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Cb290c3RyYXBCaW5hcnlEaXNhYmxlZFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Cb290c3RyYXBCaW5hcnlEaXNhYmxlZFRlc3QuamF2YQppbmRleCAzZjUwYzMwLi42MjdiNjk1IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQm9vdHN0cmFwQmluYXJ5RGlzYWJsZWRUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0Jvb3RzdHJhcEJpbmFyeURpc2FibGVkVGVzdC5qYXZhCkBAIC0yNCw3ICsyNCw5IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOwogCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOwpAQCAtMzYsMTMgKzM4LDMzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLlRva2VuU3VwcGxpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLkJ5dGVtYW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLk5ldHdvcmtUb3BvbG9neTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJJTkdfREVMQVk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9XUklURV9TVVJWRVk7CisKIC8qKgogICogUmVwbGFjZXMgcHl0aG9uIGR0ZXN0IGJvb3RzdHJhcF90ZXN0LnB5OjpUZXN0Qm9vdHN0cmFwOjp0ZXN0X2Jvb3RzdHJhcF9iaW5hcnlfZGlzYWJsZWQKICAqLwogcHVibGljIGNsYXNzIEJvb3RzdHJhcEJpbmFyeURpc2FibGVkVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAogeworICAgIHN0YXRpYyBXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgVGVzdEJhc2VJbXBsLmJlZm9yZUNsYXNzKCk7CisgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTLCBmYWxzZSk7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWZ0ZXJDbGFzcygpCisgICAgeworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CisgICAgfQorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCiAgICAgewpAQCAtOTIsOSArMTE0LDkgQEAKICAgICAgICAgY29uZmlnLmZvckVhY2gobm9kZUNvbmZpZzo6c2V0KTsKIAogICAgICAgICAvL1RPRE8gY2FuIHdlIG1ha2UgdGhpcyBtb3JlIGlzb2xhdGVkPwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5yaW5nX2RlbGF5X21zIiwgIjUwMDAiKTsKKyAgICAgICAgUklOR19ERUxBWS5zZXRMb25nKDUwMDApOwogICAgICAgICBpZiAoaXNXcml0ZVN1cnZleSkKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLndyaXRlX3N1cnZleSIsICJ0cnVlIik7CisgICAgICAgICAgICBURVNUX1dSSVRFX1NVUlZFWS5zZXRCb29sZWFuKHRydWUpOwogCiAgICAgICAgIFJld3JpdGVFbmFibGVkLmVuYWJsZSgpOwogICAgICAgICBjbHVzdGVyLmJvb3RzdHJhcChub2RlQ29uZmlnKS5zdGFydHVwKCk7CkBAIC0xMDgsNiArMTMwLDcgQEAKICAgICAgICAgICAgIC5mYWlsdXJlKCkKICAgICAgICAgICAgIC5lcnJvckNvbnRhaW5zKCJDYW5ub3Qgam9pbiB0aGUgcmluZyB1bnRpbCBib290c3RyYXAgY29tcGxldGVzIik7CiAKKyAgICAgICAgbm9kZS5ub2RldG9vbFJlc3VsdCgiYm9vdHN0cmFwIiwgInJlc3VtZSIpLmFzc2VydHMoKS5mYWlsdXJlKCk7CiAgICAgICAgIFJld3JpdGVFbmFibGVkLmRpc2FibGUoKTsKICAgICAgICAgbm9kZS5ub2RldG9vbFJlc3VsdCgiYm9vdHN0cmFwIiwgInJlc3VtZSIpLmFzc2VydHMoKS5zdWNjZXNzKCk7CiAgICAgICAgIGlmIChpc1dyaXRlU3VydmV5KQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NBU0NvbnRlbnRpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ0FTQ29udGVudGlvblRlc3QuamF2YQppbmRleCBhYWZiYzQ1Li42MGU4ZGIwIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ0FTQ29udGVudGlvblRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ0FTQ29udGVudGlvblRlc3QuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBWE9TX1VTRV9TRUxGX0VYRUNVVElPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuUVVPUlVNOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi5QQVhPUzJfUFJFUEFSRV9SRVE7CiAKQEAgLTQ1LDcgKzQ2LDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5wYXhvcy51c2Vfc2VsZl9leGVjdXRpb24iLCAiZmFsc2UiKTsKKyAgICAgICAgUEFYT1NfVVNFX1NFTEZfRVhFQ1VUSU9OLnNldEJvb2xlYW4oZmFsc2UpOwogICAgICAgICBUZXN0QmFzZUltcGwuYmVmb3JlQ2xhc3MoKTsKICAgICAgICAgQ29uc3VtZXI8SUluc3RhbmNlQ29uZmlnPiBjb25mID0gY29uZmlnIC0+IGNvbmZpZwogICAgICAgICAgICAgICAgIC5zZXQoInBheG9zX3ZhcmlhbnQiLCAidjIiKQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NBU1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9DQVNUZXN0LmphdmEKaW5kZXggOGUyYjhhYy4uZGM3OTI1NiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NBU1Rlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ0FTVGVzdC5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBWE9TX1VTRV9TRUxGX0VYRUNVVElPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuQU5ZOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbC5PTkU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsLkxPQ0FMX1FVT1JVTTsKQEAgLTc2LDcgKzc3LDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5wYXhvcy51c2Vfc2VsZl9leGVjdXRpb24iLCAiZmFsc2UiKTsKKyAgICAgICAgUEFYT1NfVVNFX1NFTEZfRVhFQ1VUSU9OLnNldEJvb2xlYW4oZmFsc2UpOwogICAgICAgICBUZXN0QmFzZUltcGwuYmVmb3JlQ2xhc3MoKTsKICAgICAgICAgQ29uc3VtZXI8SUluc3RhbmNlQ29uZmlnPiBjb25mID0gY29uZmlnIC0+IGNvbmZpZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgicGF4b3NfdmFyaWFudCIsICJ2MiIpCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ2x1c3RlclN0b3JhZ2VVc2FnZVRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9DbHVzdGVyU3RvcmFnZVVzYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMzc5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ2x1c3RlclN0b3JhZ2VVc2FnZVRlc3QuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUludm9rYWJsZUluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSXNvbGF0ZWRFeGVjdXRvci5TZXJpYWxpemFibGVGdW5jdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkRlZmF1bHROYW1lRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworCisvKioKKyAqIFRoaXMgY2xhc3MgdmVyaWZpZXMgdGhlIGJlaGF2aW9yIG9mIG91ciBnbG9iYWwgZGlzayB1c2FnZSBtZXRyaWNzIGFjcm9zcyBkaWZmZXJlbnQgY2x1c3RlciBhbmQgcmVwbGljYXRpb24KKyAqIGNvbmZpZ3VyYXRpb25zLiBJbiBhZGRpdGlvbiwgaXQgdmVyaWZpZXMgdGhhdCB0aGV5IGFyZSBwcm9wZXJseSBleHBvc2VkIHZpYSB0aGUgcHVibGljIG1ldHJpYyByZWdpc3RyeS4KKyAqCisgKiBEaXNrIHVzYWdlIG1ldHJpY3MgYXJlIGNoYXJhY3Rlcml6ZWQgYnkgaG93IHRoZXkgaGFuZGxlIGNvbXByZXNzaW9uIGFuZCByZXBsaWNhdGlvbjoKKyAqCisgKiAiY29tcHJlc3NlZCIgLT4gaW5kaWNhdGVzIHJhdyBkaXNrIHVzYWdlCisgKiAidW5jb21wcmVzc2VkIiAtPiBpbmRpY2F0ZXMgdW5jb21wcmVzc2VkIGZpbGUgc2l6ZSAod2hpY2ggaXMgZXF1aXZhbGVudCB0byAiY29tcHJlc3NlZCIgd2l0aCBubyBjb21wcmVzc2lvbiBlbmFibGVkKQorICogInJlcGxpY2F0ZWQiIC0+IGluY2x1ZGVzIGRpc2sgdXNhZ2UgZm9yIGRhdGEgb3V0c2lkZSB0aGUgbm9kZSdzIHByaW1hcnkgcmFuZ2UKKyAqICJ1bnJlcGxpY2F0ZWQiIC0+IGluZGljYXRlcyBkaXNrIHVzYWdlIHNjYWxlZCBkb3duIGJ5IHJlcGxpY2F0aW9uIGZhY3RvciBhY3Jvc3MgdGhlIGVudGlyZSBjbHVzdGVyCisgKi8KK3B1YmxpYyBjbGFzcyBDbHVzdGVyU3RvcmFnZVVzYWdlVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHROYW1lRmFjdG9yeSBGQUNUT1JZID0gbmV3IERlZmF1bHROYW1lRmFjdG9yeSgiU3RvcmFnZSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNVVRBVElPTlMgPSAxMDAwOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9SZXBsaWNhdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIFdpdGggYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgMSBmb3Igb3VyIG9ubHkgdXNlciBrZXlzcGFjZSwgc3lzdGVtIGtleXNwYWNlcyB1c2luZyBsb2NhbCByZXBsaWNhdGlvbiwgYW5kCisgICAgICAgIC8vIGVtcHR5IGRpc3RyaWJ1dGVkIHN5c3RlbSB0YWJsZXMsIHJlcGxpY2F0ZWQgYW5kIHVucmVwbGljYXRlZCB2ZXJzaW9ucyBvZiBvdXIgY29tcHJlc3NlZCBhbmQgdW5jb21wcmVzc2VkCisgICAgICAgIC8vIG1ldHJpY3Mgc2hvdWxkIGJlIGVxdWl2YWxlbnQuCisKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBpbml0KGJ1aWxkZXIoKS53aXRoTm9kZXMoMikuc3RhcnQoKSwgMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcHVsYXRlVXNlcktleXNwYWNlKGNsdXN0ZXIpOworICAgICAgICAgICAgdmVyaWZ5TG9hZE1ldHJpY3NXaXRob3V0UmVwbGljYXRpb24oY2x1c3Rlci5nZXQoMSkpOworICAgICAgICAgICAgdmVyaWZ5TG9hZE1ldHJpY3NXaXRob3V0UmVwbGljYXRpb24oY2x1c3Rlci5nZXQoMikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUxvYWRNZXRyaWNzV2l0aG91dFJlcGxpY2F0aW9uKElJbnZva2FibGVJbnN0YW5jZSBub2RlKQorICAgIHsKKyAgICAgICAgbG9uZyBjb21wcmVzc2VkTG9hZCA9IGdldExvYWQobm9kZSk7CisgICAgICAgIGxvbmcgdW5jb21wcmVzc2VkTG9hZCA9IGdldFVuY29tcHJlc3NlZExvYWQobm9kZSk7CisgICAgICAgIGFzc2VydFRoYXQoY29tcHJlc3NlZExvYWQpLmlzRXF1YWxUbyhnZXRVbnJlcGxpY2F0ZWRMb2FkKG5vZGUpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh1bmNvbXByZXNzZWRMb2FkKS5pc0VxdWFsVG8oZ2V0VW5yZXBsaWNhdGVkVW5jb21wcmVzc2VkTG9hZChub2RlKSk7CisgICAgICAgIGFzc2VydFRoYXQodW5jb21wcmVzc2VkTG9hZCkuaXNHcmVhdGVyVGhhbihjb21wcmVzc2VkTG9hZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUmVwbGljYXRpb24oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBXaXRoIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDIgZm9yIG91ciBvbmx5IHVzZXIga2V5c3BhY2UsIGRpc2sgc3BhY2UgdXNlZCBieSB0aGF0IGtleXNwYWNlIHNob3VsZAorICAgICAgICAvLyBiZSBzY2FsZWQgZG93biBieSBhIGZhY3RvciBvZiAyLCB3aGlsZSBjb250cmlidXRpb25zIGZyb20gc3lzdGVtIGtleXNwYWNlcyBhcmUgdW5hZmZlY3RlZC4KKworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IGluaXQoYnVpbGRlcigpLndpdGhOb2RlcygzKS5zdGFydCgpLCAyKSkKKyAgICAgICAgeworICAgICAgICAgICAgcG9wdWxhdGVVc2VyS2V5c3BhY2UoY2x1c3Rlcik7CisKKyAgICAgICAgICAgIHZlcmlmeUxvYWRNZXRyaWNzV2l0aFJlcGxpY2F0aW9uKGNsdXN0ZXIuZ2V0KDEpKTsKKyAgICAgICAgICAgIHZlcmlmeUxvYWRNZXRyaWNzV2l0aFJlcGxpY2F0aW9uKGNsdXN0ZXIuZ2V0KDIpKTsKKyAgICAgICAgICAgIHZlcmlmeUxvYWRNZXRyaWNzV2l0aFJlcGxpY2F0aW9uKGNsdXN0ZXIuZ2V0KDMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpRGF0YWNlbnRlclJlcGxpY2F0aW9uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gV2l0aCBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAxIGZvciBvdXIgb25seSB1c2VyIGtleXNwYWNlIGluIHR3byBEQ3MsIGRpc2sgc3BhY2UgdXNlZCBieSB0aGF0IGtleXNwYWNlIHNob3VsZAorICAgICAgICAvLyBiZSBzY2FsZWQgZG93biBieSBhIGZhY3RvciBvZiAyLCB3aGlsZSBjb250cmlidXRpb25zIGZyb20gc3lzdGVtIGtleXNwYWNlcyBhcmUgdW5hZmZlY3RlZC4KKworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IGJ1aWxkZXIoKS53aXRoREMoIkRDMSIsIDIpLndpdGhEQygiREMyIiwgMikuc3RhcnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBLRVlTUEFDRSAiICsgS0VZU1BBQ0UgKyAiIFdJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ0RDMSc6IDEsICdEQzInOiAxfTsiKTsKKyAgICAgICAgICAgIHBvcHVsYXRlVXNlcktleXNwYWNlKGNsdXN0ZXIpOworCisgICAgICAgICAgICB2ZXJpZnlMb2FkTWV0cmljc1dpdGhSZXBsaWNhdGlvbihjbHVzdGVyLmdldCgxKSk7CisgICAgICAgICAgICB2ZXJpZnlMb2FkTWV0cmljc1dpdGhSZXBsaWNhdGlvbihjbHVzdGVyLmdldCgyKSk7CisgICAgICAgICAgICB2ZXJpZnlMb2FkTWV0cmljc1dpdGhSZXBsaWNhdGlvbihjbHVzdGVyLmdldCgzKSk7CisgICAgICAgICAgICB2ZXJpZnlMb2FkTWV0cmljc1dpdGhSZXBsaWNhdGlvbihjbHVzdGVyLmdldCg0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVVc2VyS2V5c3BhY2UoQ2x1c3RlciBjbHVzdGVyKQorICAgIHsKKyAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudGJsIChwayBpbnQsIHYgdGV4dCwgUFJJTUFSWSBLRVkgKHBrKSk7IikpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTVVUQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRibCAocGssIHYpIFZBTFVFUyAoPyw/KSIpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgaSwgImNvbXByZXNzYWJsZSIpOworICAgICAgICB9CisKKyAgICAgICAgY2x1c3Rlci5mb3JFYWNoKChpKSAtPiBpLmZsdXNoKEtFWVNQQUNFKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUxvYWRNZXRyaWNzV2l0aFJlcGxpY2F0aW9uKElJbnZva2FibGVJbnN0YW5jZSBub2RlKQorICAgIHsKKyAgICAgICAgbG9uZyB1bnJlcGxpY2F0ZWRMb2FkID0gZ2V0VW5yZXBsaWNhdGVkTG9hZChub2RlKTsKKyAgICAgICAgbG9uZyBleHBlY3RlZFVucmVwbGljYXRlZExvYWQgPSBjb21wdXRlVW5yZXBsaWNhdGVkTWV0cmljKG5vZGUsIHRhYmxlIC0+IHRhYmxlLm1ldHJpYy5saXZlRGlza1NwYWNlVXNlZC5nZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChleHBlY3RlZFVucmVwbGljYXRlZExvYWQpLmlzRXF1YWxUbyh1bnJlcGxpY2F0ZWRMb2FkKTsKKyAgICAgICAgYXNzZXJ0VGhhdChnZXRMb2FkKG5vZGUpKS5pc0dyZWF0ZXJUaGFuKHVucmVwbGljYXRlZExvYWQpOworCisgICAgICAgIGxvbmcgdW5yZXBsaWNhdGVkVW5jb21wcmVzc2VkTG9hZCA9IGdldFVucmVwbGljYXRlZFVuY29tcHJlc3NlZExvYWQobm9kZSk7CisgICAgICAgIGxvbmcgZXhwZWN0ZWRVbnJlcGxpY2F0ZWRVbmNvbXByZXNzZWRMb2FkID0gY29tcHV0ZVVucmVwbGljYXRlZE1ldHJpYyhub2RlLCB0YWJsZSAtPiB0YWJsZS5tZXRyaWMudW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQuZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZXhwZWN0ZWRVbnJlcGxpY2F0ZWRVbmNvbXByZXNzZWRMb2FkKS5pc0VxdWFsVG8odW5yZXBsaWNhdGVkVW5jb21wcmVzc2VkTG9hZCk7CisgICAgICAgIGFzc2VydFRoYXQoZ2V0VW5jb21wcmVzc2VkTG9hZChub2RlKSkuaXNHcmVhdGVyVGhhbih1bnJlcGxpY2F0ZWRVbmNvbXByZXNzZWRMb2FkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgZ2V0TG9hZChJSW52b2thYmxlSW5zdGFuY2Ugbm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlLm1ldHJpY3MoKS5nZXRDb3VudGVyKEZBQ1RPUlkuY3JlYXRlTWV0cmljTmFtZSgiTG9hZCIpLmdldE1ldHJpY05hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGdldFVuY29tcHJlc3NlZExvYWQoSUludm9rYWJsZUluc3RhbmNlIG5vZGUxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGUxLm1ldHJpY3MoKS5nZXRDb3VudGVyKEZBQ1RPUlkuY3JlYXRlTWV0cmljTmFtZSgiVW5jb21wcmVzc2VkTG9hZCIpLmdldE1ldHJpY05hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGdldFVucmVwbGljYXRlZExvYWQoSUludm9rYWJsZUluc3RhbmNlIG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gKExvbmcpIG5vZGUubWV0cmljcygpLmdldEdhdWdlKEZBQ1RPUlkuY3JlYXRlTWV0cmljTmFtZSgiVW5yZXBsaWNhdGVkTG9hZCIpLmdldE1ldHJpY05hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGdldFVucmVwbGljYXRlZFVuY29tcHJlc3NlZExvYWQoSUludm9rYWJsZUluc3RhbmNlIG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gKExvbmcpIG5vZGUubWV0cmljcygpLmdldEdhdWdlKEZBQ1RPUlkuY3JlYXRlTWV0cmljTmFtZSgiVW5yZXBsaWNhdGVkVW5jb21wcmVzc2VkTG9hZCIpLmdldE1ldHJpY05hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGNvbXB1dGVVbnJlcGxpY2F0ZWRNZXRyaWMoSUludm9rYWJsZUluc3RhbmNlIG5vZGUsIFNlcmlhbGl6YWJsZUZ1bmN0aW9uPENvbHVtbkZhbWlseVN0b3JlLCBMb25nPiBtZXRyaWMpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZS5jYWxsT25JbnN0YW5jZSgoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHN1bSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoS2V5c3BhY2Uga2V5c3BhY2UgOiBLZXlzcGFjZS5hbGwoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKENvbHVtbkZhbWlseVN0b3JlIHRhYmxlIDoga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmVzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBtZXRyaWMuYXBwbHkodGFibGUpIC8ga2V5c3BhY2UuZ2V0UmVwbGljYXRpb25TdHJhdGVneSgpLmdldFJlcGxpY2F0aW9uRmFjdG9yKCkuZnVsbFJlcGxpY2FzOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NvbHVtbk1hc2tUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ29sdW1uTWFza1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGQxOTdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NvbHVtbk1hc2tUZXN0LmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ29uc2lzdGVuY3lMZXZlbDsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuUmVzdWx0U2V0OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TZXNzaW9uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TaW1wbGVTdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlN0YXRlbWVudDsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUucG9saWNpZXMuTG9hZEJhbGFuY2luZ1BvbGljeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkNhc3NhbmRyYVJvbGVNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJbnZva2FibGVJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLlJvd1V0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXRpbC5TaW5nbGVIb3N0TG9hZEJhbGFuY2luZ1BvbGljeTsKKworaW1wb3J0IHN0YXRpYyBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ2x1c3Rlci5CdWlsZGVyOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlOVVRFUzsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5DYXNzYW5kcmFSb2xlTWFuYWdlci5ERUZBVUxUX1NVUEVSVVNFUl9OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkNhc3NhbmRyYVJvbGVNYW5hZ2VyLkRFRkFVTFRfU1VQRVJVU0VSX1BBU1NXT1JEOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5HT1NTSVA7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLk5BVElWRV9QUk9UT0NPTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLkFzc2VydFV0aWxzLmFzc2VydFJvd3M7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5Bc3NlcnRVdGlscy5yb3c7CitpbXBvcnQgc3RhdGljIG9yZy5hd2FpdGlsaXR5LkF3YWl0aWxpdHkuYXdhaXQ7CisKKy8qKgorICogVGVzdHMgZm9yIGR5bmFtaWMgZGF0YSBtYXNraW5nLgorICovCitwdWJsaWMgY2xhc3MgQ29sdW1uTWFza1Rlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUID0gd2l0aEtleXNwYWNlKCJTRUxFQ1QgKiBGUk9NICVzLnQiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUk5BTUUgPSAiZGRtX3VzZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRCA9ICJkZG1fcGFzc3dvcmQiOworCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBjb2x1bW4gbWFza3MgYXJlIHByb3BhZ2F0ZWQgdG8gYWxsIG5vZGVzIGluIHRoZSBjbHVzdGVyLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hc2tQcm9wYWdhdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gY3JlYXRlQ2x1c3RlcldpdGhBdWhlbnRpY2F0aW9uKDMpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50IChrIGludCBQUklNQVJZIEtFWSwgdiB0ZXh0IE1BU0tFRCBXSVRIIERFRkFVTFQpIFdJVEggcmVhZF9yZXBhaXI9J05PTkUnIikpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkuZXhlY3V0ZUludGVybmFsKHdpdGhLZXlzcGFjZSgiSU5TRVJUIElOVE8gJXMudChrLCB2KSBWQUxVRVMgKDEsICdzZWNyZXQxJykiKSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5leGVjdXRlSW50ZXJuYWwod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50KGssIHYpIFZBTFVFUyAoMiwgJ3NlY3JldDInKSIpKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDMpLmV4ZWN1dGVJbnRlcm5hbCh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnQoaywgdikgVkFMVUVTICgzLCAnc2VjcmV0MycpIikpOworCisgICAgICAgICAgICBhc3NlcnRSb3dzSW5BbGxDb29yZGluYXRvcnMoY2x1c3Rlciwgcm93KDEsICIqKioqIiksIHJvdygyLCAiKioqKiIpLCByb3coMywgIioqKioiKSk7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQUxURVIgVEFCTEUgJXMudCBBTFRFUiB2IERST1AgTUFTS0VEIikpOworICAgICAgICAgICAgYXNzZXJ0Um93c0luQWxsQ29vcmRpbmF0b3JzKGNsdXN0ZXIsIHJvdygxLCAic2VjcmV0MSIpLCByb3coMiwgInNlY3JldDIiKSwgcm93KDMsICJzZWNyZXQzIikpOworCisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkFMVEVSIFRBQkxFICVzLnQgQUxURVIgdiBNQVNLRUQgV0lUSCBtYXNrX2lubmVyKG51bGwsIDEpIikpOworICAgICAgICAgICAgYXNzZXJ0Um93c0luQWxsQ29vcmRpbmF0b3JzKGNsdXN0ZXIsIHJvdygxLCAiKioqKioqMSIpLCByb3coMiwgIioqKioqKjIiKSwgcm93KDMsICIqKioqKiozIikpOworCisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkFMVEVSIFRBQkxFICVzLnQgQUxURVIgdiBNQVNLRUQgV0lUSCBtYXNrX2lubmVyKDMsIG51bGwpIikpOworICAgICAgICAgICAgYXNzZXJ0Um93c0luQWxsQ29vcmRpbmF0b3JzKGNsdXN0ZXIsIHJvdygxLCAic2VjKioqKiIpLCByb3coMiwgInNlYyoqKioiKSwgcm93KDMsICJzZWMqKioqIikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBjb2x1bW4gbWFza3MgYXJlIHByb3Blcmx5IGxvYWRlZCBhdCBzdGFydHVwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hc2tMb2FkaW5nKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBjcmVhdGVDbHVzdGVyV2l0aEF1aGVudGljYXRpb24oMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElJbnZva2FibGVJbnN0YW5jZSBub2RlID0gY2x1c3Rlci5nZXQoMSk7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIEZVTkNUSU9OICVzLmN1c3RvbV9tYXNrKGNvbHVtbiB0ZXh0LCByZXBsYWNlbWVudCB0ZXh0KSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgdGV4dCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiByZXBsYWNlbWVudDsnIikpOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudCAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgdGV4dCBNQVNLRUQgV0lUSCBERUZBVUxULCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYiB0ZXh0IE1BU0tFRCBXSVRIIG1hc2tfcmVwbGFjZSgncmVkYWN0ZWQnKSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMgdGV4dCBNQVNLRUQgV0lUSCBtYXNrX2lubmVyKG51bGwsIDEpLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZCB0ZXh0IE1BU0tFRCBXSVRIIG1hc2tfaW5uZXIoMywgbnVsbCksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlIHRleHQgTUFTS0VEIFdJVEggJTxzLmN1c3RvbV9tYXNrKCdvYnNjdXJlZCcpLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFJJTUFSWSBLRVkgKGEsIGIpKSIpKTsKKyAgICAgICAgICAgIFN0cmluZyBpbnNlcnQgPSB3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnQoYSwgYiwgYywgZCwgZSkgVkFMVUVTICg/LCA/LCA/LCA/LCA/KSIpOworICAgICAgICAgICAgbm9kZS5leGVjdXRlSW50ZXJuYWwoaW5zZXJ0LCAic2VjcmV0MSIsICJzZWNyZXQxIiwgInNlY3JldDEiLCAic2VjcmV0MSIsICJzZWNyZXQxIik7CisgICAgICAgICAgICBub2RlLmV4ZWN1dGVJbnRlcm5hbChpbnNlcnQsICJzZWNyZXQyIiwgInNlY3JldDIiLCAic2VjcmV0MiIsICJzZWNyZXQyIiwgInNlY3JldDIiKTsKKyAgICAgICAgICAgIGFzc2VydFJvd3NXaXRoUmVzdGFydChub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygiKioqKiIsICJyZWRhY3RlZCIsICIqKioqKioxIiwgInNlYyoqKioiLCAib2JzY3VyZWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIioqKioiLCAicmVkYWN0ZWQiLCAiKioqKioqMiIsICJzZWMqKioqIiwgIm9ic2N1cmVkIikpOworCisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkFMVEVSIFRBQkxFICVzLnQgQUxURVIgYSBEUk9QIE1BU0tFRCIpKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQUxURVIgVEFCTEUgJXMudCBBTFRFUiBiIE1BU0tFRCBXSVRIIG1hc2tfbnVsbCgpIikpOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJBTFRFUiBUQUJMRSAlcy50IEFMVEVSIGMgTUFTS0VEIFdJVEggbWFza19pbm5lcihudWxsLCBudWxsLCAnIycpIikpOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJBTFRFUiBUQUJMRSAlcy50IEFMVEVSIGQgTUFTS0VEIFdJVEggbWFza19pbm5lcigzLCAxLCAnIycpIikpOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJBTFRFUiBUQUJMRSAlcy50IEFMVEVSIGUgTUFTS0VEIFdJVEggJTxzLmN1c3RvbV9tYXNrKCdjZW5zb3JlZCcpIikpOworICAgICAgICAgICAgYXNzZXJ0Um93c1dpdGhSZXN0YXJ0KG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KCJzZWNyZXQxIiwgbnVsbCwgIiMjIyMjIyMiLCAic2VjIyMjMSIsICJjZW5zb3JlZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygic2VjcmV0MiIsIG51bGwsICIjIyMjIyMjIiwgInNlYyMjIzIiLCAiY2Vuc29yZWQiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDbHVzdGVyIGNyZWF0ZUNsdXN0ZXJXaXRoQXVoZW50aWNhdGlvbihpbnQgbm9kZUNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIENsdXN0ZXIgY2x1c3RlciA9IGluaXQoQ2x1c3Rlci5idWlsZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoTm9kZXMobm9kZUNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjb25mIC0+IGNvbmYud2l0aChHT1NTSVAsIE5BVElWRV9QUk9UT0NPTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgiZHluYW1pY19kYXRhX21hc2tpbmdfZW5hYmxlZCIsICJ0cnVlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgidXNlcl9kZWZpbmVkX2Z1bmN0aW9uc19lbmFibGVkIiwgInRydWUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJhdXRoZW50aWNhdG9yIiwgIlBhc3N3b3JkQXV0aGVudGljYXRvciIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoImF1dGhvcml6ZXIiLCAiQ2Fzc2FuZHJhQXV0aG9yaXplciIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSk7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgdXNlciB3aXRob3V0IFVOTUFTSyBwZXJtaXNzaW9uCisgICAgICAgIHdpdGhBdXRoZW50aWNhdGVkU2Vzc2lvbihjbHVzdGVyLmdldCgxKSwgREVGQVVMVF9TVVBFUlVTRVJfTkFNRSwgREVGQVVMVF9TVVBFUlVTRVJfUEFTU1dPUkQsIHNlc3Npb24gLT4geworICAgICAgICAgICAgc2Vzc2lvbi5leGVjdXRlKGZvcm1hdCgiQ1JFQVRFIFVTRVIgSUYgTk9UIEVYSVNUUyAlcyBXSVRIIFBBU1NXT1JEICclcyciLCBVU0VSTkFNRSwgUEFTU1dPUkQpKTsKKyAgICAgICAgICAgIHNlc3Npb24uZXhlY3V0ZShmb3JtYXQoIkdSQU5UIEFMTCBPTiBLRVlTUEFDRSAlcyBUTyAlcyIsIEtFWVNQQUNFLCBVU0VSTkFNRSkpOworICAgICAgICAgICAgc2Vzc2lvbi5leGVjdXRlKGZvcm1hdCgiUkVWT0tFIFVOTUFTSyBPTiBLRVlTUEFDRSAlcyBGUk9NICVzIiwgS0VZU1BBQ0UsIFVTRVJOQU1FKSk7CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBjbHVzdGVyOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Um93c0luQWxsQ29vcmRpbmF0b3JzKENsdXN0ZXIgY2x1c3RlciwgT2JqZWN0W10uLi4gZXhwZWN0ZWRSb3dzKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjbHVzdGVyLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRSb3dzV2l0aEF1dGhlbnRpY2F0aW9uKGNsdXN0ZXIuZ2V0KGkpLCBleHBlY3RlZFJvd3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRSb3dzV2l0aFJlc3RhcnQoSUludm9rYWJsZUluc3RhbmNlIG5vZGUsIE9iamVjdFtdLi4uIGV4cGVjdGVkUm93cykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gdGVzdCBxdWVyeWluZyB3aXRoIGluLW1lbW9yeSBjb2x1bW4gZGVmaW5pdGlvbnMKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhBdXRoZW50aWNhdGlvbihub2RlLCBleHBlY3RlZFJvd3MpOworCisgICAgICAgIC8vIHJlc3RhcnQgdGhlIG5vZGVzIHRvIHJlbG9hZCB0aGUgY29sdW1uIGRlZmluaXRpb25zIGZyb20gZGlzaworICAgICAgICBub2RlLnNodXRkb3duKCkuZ2V0KCk7CisgICAgICAgIG5vZGUuc3RhcnR1cCgpOworCisgICAgICAgIC8vIHRlc3QgcXVlcnlpbmcgd2l0aCB0aGUgY29sdW1uIGRlZmluaXRpb25zIGxvYWRlZCBmcm9tIGRpc2sKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhBdXRoZW50aWNhdGlvbihub2RlLCBleHBlY3RlZFJvd3MpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Um93c1dpdGhBdXRoZW50aWNhdGlvbihJSW52b2thYmxlSW5zdGFuY2Ugbm9kZSwgT2JqZWN0W10uLi4gZXhwZWN0ZWRSb3dzKQorICAgIHsKKyAgICAgICAgd2l0aEF1dGhlbnRpY2F0ZWRTZXNzaW9uKG5vZGUsIFVTRVJOQU1FLCBQQVNTV09SRCwgc2Vzc2lvbiAtPiB7CisgICAgICAgICAgICBTdGF0ZW1lbnQgc3RhdGVtZW50ID0gbmV3IFNpbXBsZVN0YXRlbWVudChTRUxFQ1QpLnNldENvbnNpc3RlbmN5TGV2ZWwoQ29uc2lzdGVuY3lMZXZlbC5BTEwpOworICAgICAgICAgICAgUmVzdWx0U2V0IHJlc3VsdFNldCA9IHNlc3Npb24uZXhlY3V0ZShzdGF0ZW1lbnQpOworICAgICAgICAgICAgYXNzZXJ0Um93cyhSb3dVdGlsLnRvT2JqZWN0cyhyZXN1bHRTZXQpLCBleHBlY3RlZFJvd3MpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHdpdGhBdXRoZW50aWNhdGVkU2Vzc2lvbihJSW52b2thYmxlSW5zdGFuY2UgaW5zdGFuY2UsIFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkLCBDb25zdW1lcjxTZXNzaW9uPiBjb25zdW1lcikKKyAgICB7CisgICAgICAgIC8vIHdhaXQgZm9yIGV4aXN0aW5nIHJvbGVzCisgICAgICAgIGF3YWl0KCkucG9sbERlbGF5KDEsIFNFQ09ORFMpCisgICAgICAgICAgICAgICAucG9sbEludGVydmFsKDEsIFNFQ09ORFMpCisgICAgICAgICAgICAgICAuYXRNb3N0KDEsIE1JTlVURVMpCisgICAgICAgICAgICAgICAudW50aWwoKCkgLT4gaW5zdGFuY2UuY2FsbE9uSW5zdGFuY2UoQ2Fzc2FuZHJhUm9sZU1hbmFnZXI6Omhhc0V4aXN0aW5nUm9sZXMpKTsKKworICAgICAgICAvLyB1c2UgYSBsb2FkIGJhbGFuY2luZyBwb2xpY3kgdGhhdCBlbnN1cmVzIHRoYXQgd2UgYWN0dWFsbHkgY29ubmVjdCB0byB0aGUgZGVzaXJlZCBub2RlCisgICAgICAgIEluZXRBZGRyZXNzIGFkZHJlc3MgPSBpbnN0YW5jZS5icm9hZGNhc3RBZGRyZXNzKCkuZ2V0QWRkcmVzcygpOworICAgICAgICBMb2FkQmFsYW5jaW5nUG9saWN5IGxiYyA9IG5ldyBTaW5nbGVIb3N0TG9hZEJhbGFuY2luZ1BvbGljeShhZGRyZXNzKTsKKworICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ2x1c3Rlci5idWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29udGFjdFBvaW50cyhhZGRyZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoTG9hZEJhbGFuY2luZ1BvbGljeShsYmMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDcmVkZW50aWFscyh1c2VybmFtZSwgcGFzc3dvcmQpOworCisgICAgICAgIHRyeSAoY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXIgY2x1c3RlciA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBjbHVzdGVyLmNvbm5lY3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3VtZXIuYWNjZXB0KHNlc3Npb24pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NvbXBhY3Rpb25EaXNrU3BhY2VUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvQ29tcGFjdGlvbkRpc2tTcGFjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTlmODdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NvbXBhY3Rpb25EaXNrU3BhY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3RvcmU7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVTdG9yZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUGF0aFV0aWxzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgbmV0LmJ5dGVidWRkeS5CeXRlQnVkZHk7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NMb2FkaW5nU3RyYXRlZ3k7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5NZXRob2REZWxlZ2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQWN0aXZlQ29tcGFjdGlvbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKKworaW1wb3J0IHN0YXRpYyBuZXQuYnl0ZWJ1ZGR5Lm1hdGNoZXIuRWxlbWVudE1hdGNoZXJzLm5hbWVkOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK3B1YmxpYyBjbGFzcyBDb21wYWN0aW9uRGlza1NwYWNlVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vU3BhY2VMZWZ0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkoQ2x1c3RlciBjbHVzdGVyID0gaW5pdChDbHVzdGVyLmJ1aWxkKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjb25maWcgLT4gY29uZmlnLnNldCgibWluX2ZyZWVfc3BhY2VfcGVyX2RyaXZlX2luX21iIiwgIjAiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRGF0YURpckNvdW50KDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEluc3RhbmNlSW5pdGlhbGl6ZXIoQkI6Omluc3RhbGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJjcmVhdGUgdGFibGUgIitLRVlTUEFDRSsiLnRibCAoaWQgaW50IHByaW1hcnkga2V5LCB4IGludCkgd2l0aCBjb21wYWN0aW9uID0geydjbGFzcyc6J1NpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3knfSIpOworICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJpbnNlcnQgaW50byAiK0tFWVNQQUNFKyIudGJsIChpZCwgeCkgdmFsdWVzICgxLDEpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkuZmx1c2goS0VZU1BBQ0UpOworICAgICAgICAgICAgY2x1c3Rlci5zZXRVbmNhdWdodEV4Y2VwdGlvbnNGaWx0ZXIoKHQpIC0+IHQuZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgdC5nZXRNZXNzYWdlKCkuY29udGFpbnMoIk5vdCBlbm91Z2ggc3BhY2UgZm9yIGNvbXBhY3Rpb24iKSAmJiB0LmdldE1lc3NhZ2UoKS5jb250YWlucyhLRVlTUEFDRSsiLnRibCIpKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLnJ1bk9uSW5zdGFuY2UoKCkgLT4geworICAgICAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKCJ0YmwiKTsKKyAgICAgICAgICAgICAgICBCQi5lc3RpbWF0ZWRSZW1haW5pbmcuc2V0KDIwMDApOworICAgICAgICAgICAgICAgIEJCLmZyZWVTcGFjZS5zZXQoMjAwMCk7CisgICAgICAgICAgICAgICAgQkIuc3N0YWJsZURpciA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5kZXNjcmlwdG9yLmRpcmVjdG9yeTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNmcy5mb3JjZU1ham9yQ29tcGFjdGlvbigpOworICAgICAgICAgICAgICAgICAgICBmYWlsKCJUaGlzIHNob3VsZCBmYWlsLCB3ZSBoYXZlIDIwMDBiIGZyZWUgc3BhY2UsIDIwMDBiIGVzdGltYXRlZCByZW1haW5pbmcgY29tcGFjdGlvbnMgYW5kIHRoZSBuZXcgY29tcGFjdGlvbiA+IDAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBhbmQgYXZhaWxhYmxlIHNwYWNlIGFnYWluOgorICAgICAgICAgICAgICAgIEJCLmVzdGltYXRlZFJlbWFpbmluZy5zZXQoMTAwMCk7CisgICAgICAgICAgICAgICAgY2ZzLmZvcmNlTWFqb3JDb21wYWN0aW9uKCk7CisKKyAgICAgICAgICAgICAgICBCQi5lc3RpbWF0ZWRSZW1haW5pbmcuc2V0KDIwMDApOworICAgICAgICAgICAgICAgIEJCLmZyZWVTcGFjZS5zZXQoMTAwMDApOworICAgICAgICAgICAgICAgIGNmcy5mb3JjZU1ham9yQ29tcGFjdGlvbigpOworCisgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGZhaWwgaWYgb3RoZXIgZGlyIG9uIHRoZSBzYW1lIGZpbGUgc3RvcmUgcnVucyBvdXQgb2YgZGlzaworICAgICAgICAgICAgICAgIEJCLmZyZWVTcGFjZS5zZXQoMCk7CisgICAgICAgICAgICAgICAgZm9yIChEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5IG5ld0RpciA6IGNmcy5nZXREaXJlY3RvcmllcygpLmdldFdyaXRlYWJsZUxvY2F0aW9ucygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRmlsZSBuZXdTU1RhYmxlRGlyID0gY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0TG9jYXRpb25Gb3JEaXNrKG5ld0Rpcik7CisgICAgICAgICAgICAgICAgICAgIGlmICghQkIuc3N0YWJsZURpci5lcXVhbHMobmV3U1NUYWJsZURpcikpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJCLnNzdGFibGVEaXIgPSBjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2sobmV3RGlyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2ZzLmZvcmNlTWFqb3JDb21wYWN0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoInRoaXMgc2hvdWxkIGZhaWwsIGRhdGEgZGlycyBzaGFyZSBmaWxlc3RvcmUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9pZ25vcmVkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJCCisgICAgeworICAgICAgICBzdGF0aWMgZmluYWwgQXRvbWljTG9uZyBlc3RpbWF0ZWRSZW1haW5pbmcgPSBuZXcgQXRvbWljTG9uZygpOworICAgICAgICBzdGF0aWMgZmluYWwgQXRvbWljTG9uZyBmcmVlU3BhY2UgPSBuZXcgQXRvbWljTG9uZygpOworICAgICAgICBzdGF0aWMgRmlsZSBzc3RhYmxlRGlyOworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChDbGFzc0xvYWRlciBjbCwgSW50ZWdlciBub2RlKQorICAgICAgICB7CisgICAgICAgICAgICBuZXcgQnl0ZUJ1ZGR5KCkucmViYXNlKEFjdGl2ZUNvbXBhY3Rpb25zLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ldGhvZChuYW1lZCgiZXN0aW1hdGVkUmVtYWluaW5nV3JpdGVCeXRlcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisKKyAgICAgICAgICAgIG5ldyBCeXRlQnVkZHkoKS5yZWJhc2UoRmlsZVN0b3JlVXRpbHMuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKCJ0cnlHZXRTcGFjZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIE1hcDxGaWxlLCBMb25nPiBlc3RpbWF0ZWRSZW1haW5pbmdXcml0ZUJ5dGVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHNzdGFibGVEaXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKHNzdGFibGVEaXIsIGVzdGltYXRlZFJlbWFpbmluZy5nZXQoKSk7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgbG9uZyB0cnlHZXRTcGFjZShGaWxlU3RvcmUgZmlsZVN0b3JlLCBQYXRoVXRpbHMuSU9Ub0xvbmdGdW5jdGlvbjxGaWxlU3RvcmU+IGZ1bmN0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3N0YWJsZURpciAhPSBudWxsICYmIEZpbGVzLmdldEZpbGVTdG9yZShzc3RhYmxlRGlyLnRvUGF0aCgpKS5lcXVhbHMoZmlsZVN0b3JlKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyZWVTcGFjZS5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIExvbmcuTUFYX1ZBTFVFOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Db21wYWN0aW9uT3ZlcmxhcHBpbmdTU1RhYmxlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NvbXBhY3Rpb25PdmVybGFwcGluZ1NTVGFibGVUZXN0LmphdmEKaW5kZXggNmE2NWM5MS4uNDRjYWY4NSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NvbXBhY3Rpb25PdmVybGFwcGluZ1NTVGFibGVUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0NvbXBhY3Rpb25PdmVybGFwcGluZ1NTVGFibGVUZXN0LmphdmEKQEAgLTE4LDggKzE4LDEwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKIAoraW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CkBAIC05NiwxMyArOTgsMTMgQEAKICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGwoQ2xhc3NMb2FkZXIgY2wsIEludGVnZXIgaSkKICAgICAgICAgewogICAgICAgICAgICAgbmV3IEJ5dGVCdWRkeSgpLnJlYmFzZShEaXJlY3Rvcmllcy5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXRob2QobmFtZWQoImhhc0F2YWlsYWJsZURpc2tTcGFjZSIpLmFuZCh0YWtlc0FyZ3VtZW50cygyKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKCJoYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMiKS5hbmQodGFrZXNBcmd1bWVudHMoMikpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCLmNsYXNzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CiAgICAgICAgIH0KIAotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQXZhaWxhYmxlRGlza1NwYWNlKGxvbmcgaWdub3JlMSwgbG9uZyBpZ25vcmUyKQorICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKE1hcDxGaWxlLExvbmc+IGlnbm9yZTEsIE1hcDxGaWxlLExvbmc+IGlnbm9yZTIpCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChlbmFibGVkLmdldCgpKQogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0RhdGFSZXN1cnJlY3Rpb25DaGVja1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9EYXRhUmVzdXJyZWN0aW9uQ2hlY2tUZXN0LmphdmEKaW5kZXggMWIyOTdkYS4uZjQ4Yzg3MiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0RhdGFSZXN1cnJlY3Rpb25DaGVja1Rlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvRGF0YVJlc3VycmVjdGlvbkNoZWNrVGVzdC5qYXZhCkBAIC0yNSwxMSArMjUsMTEgQEAKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuU3RhcnR1cENoZWNrc09wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUludm9rYWJsZUluc3RhbmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSXNvbGF0ZWRFeGVjdXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5TdGFydHVwRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkRhdGFSZXN1cnJlY3Rpb25DaGVjazsKQEAgLTQwLDYgKzQwLDcgQEAKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTlVURVM7CiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0LlNFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0hFQ0tfREFUQV9SRVNVUlJFQ1RJT05fSEVBUlRCRUFUX1BFUklPRDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlN0YXJ0dXBDaGVja3NPcHRpb25zLkVOQUJMRURfUFJPUEVSVFk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXIuYnVpbGQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLk5BVElWRV9QUk9UT0NPTDsKQEAgLTU5LDExICs2MCw5IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YVJlc3VycmVjdGlvbkNoZWNrKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgdHJ5CisgICAgICAgIC8vIHNldCBpdCB0byAxIGhvdXIgc28gY2hlY2sgd2lsbCBiZSBub3QgdXBkYXRlZCBhZnRlciBpdCBpcyB3cml0dGVuLCBmb3IgdGVzdCBwdXJwb3NlcworICAgICAgICB0cnkgKFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoQ0hFQ0tfREFUQV9SRVNVUlJFQ1RJT05fSEVBUlRCRUFUX1BFUklPRCwgMzYwMDAwMCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIHNldCBpdCB0byAxIGhvdXIgc28gY2hlY2sgd2lsbCBiZSBub3QgdXBkYXRlZCBhZnRlciBpdCBpcyB3cml0dGVuLCBmb3IgdGVzdCBwdXJwb3NlcwotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DSEVDS19EQVRBX1JFU1VSUkVDVElPTl9IRUFSVEJFQVRfUEVSSU9ELmdldEtleSgpLCAiMzYwMDAwMCIpOwotCiAgICAgICAgICAgICAvLyBzdGFydCB0aGUgbm9kZSB3aXRoIHRoZSBjaGVjayBlbmFibGVkLCBpdCB3aWxsIGp1c3QgcGFzcyBmaW5lIGFzIHRoZXJlIGFyZSBub3QgYW55IHVzZXIgdGFibGVzIHlldAogICAgICAgICAgICAgLy8gYW5kIHN5c3RlbSB0YWJsZXMgYXJlIHlvdW5nIGVub3VnaAogICAgICAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBidWlsZCgpLndpdGhOb2RlcygxKQpAQCAtMTI5LDEwICsxMjgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhDTFVERURfS0VZU1BBQ0VTX0NPTkZJR19QUk9QRVJUWSwgImtzMyIpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DSEVDS19EQVRBX1JFU1VSUkVDVElPTl9IRUFSVEJFQVRfUEVSSU9ELmdldEtleSgpKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgVGhyb3dhYmxlIGV4ZWN1dGVDaGVja3NPbkluc3RhbmNlKElJbnZva2FibGVJbnN0YW5jZSBpbnN0YW5jZSwgZmluYWwgU3RyaW5nLi4uIGNvbmZpZykKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9FcGhlbWVyYWxTbmFwc2hvdFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9FcGhlbWVyYWxTbmFwc2hvdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGU4ZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0VwaGVtZXJhbFNuYXBzaG90VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Q7CisKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LkZ1dHVyZXM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW52b2thYmxlSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJc29sYXRlZEV4ZWN1dG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnNuYXBzaG90LlNuYXBzaG90TWFuaWZlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuT05FOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5HT1NTSVA7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLk5BVElWRV9QUk9UT0NPTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkVUV09SSzsKK2ltcG9ydCBzdGF0aWMgb3JnLmF3YWl0aWxpdHkuQXdhaXRpbGl0eS5hd2FpdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIEVwaGVtZXJhbFNuYXBzaG90VGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBzbmFwc2hvdE5hbWUgPSAic25hcHNob3RuYW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc25hcHNob3ROYW1lMiA9ICJzZWNvbmQtc25hcHNob3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0YWJsZU5hbWUgPSAiY2l0eSI7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydHVwUmVtb3Zlc0VwaGVtZXJhbFNuYXBzaG90T25FcGhlbWVyYWxGbGFnSW5NYW5pZmVzdCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjID0gaW5pdChidWlsZGVyKCkud2l0aE5vZGVzKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjb25maWcgLT4gY29uZmlnLndpdGgoR09TU0lQLCBORVRXT1JLLCBOQVRJVkVfUFJPVE9DT0wpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBQYWlyPFN0cmluZywgU3RyaW5nW10+IGluaXRpYWxpc2F0aW9uRGF0YSA9IGluaXRpYWxpc2UoYyk7CisKKyAgICAgICAgICAgIHJld3JpdGVNYW5pZmVzdFRvRXBoZW1lcmFsKGluaXRpYWxpc2F0aW9uRGF0YS5sZWZ0LCBpbml0aWFsaXNhdGlvbkRhdGEucmlnaHQpOworCisgICAgICAgICAgICB2ZXJpZnkoYy5nZXQoMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETyB0aGlzIHRlc3QgbWlnaHQgYmUgZGVsZXRlZCBvbmNlIHdlIGdldCByaWQgb2YgZXBoZW1lcmFsIG1hcmtlciBmaWxlIGZvciBnb29kIGluIDQuMworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0dXBSZW1vdmVzRXBoZW1lcmFsU25hcHNob3RPbk1hcmtlckZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgYyA9IGluaXQoYnVpbGRlcigpLndpdGhOb2RlcygxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy53aXRoKEdPU1NJUCwgTkVUV09SSywgTkFUSVZFX1BST1RPQ09MKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgUGFpcjxTdHJpbmcsIFN0cmluZ1tdPiBpbml0aWFsaXNhdGlvbkRhdGEgPSBpbml0aWFsaXNlKGMpOworCisgICAgICAgICAgICBTdHJpbmcgdGFibGVJZCA9IGluaXRpYWxpc2F0aW9uRGF0YS5sZWZ0OworICAgICAgICAgICAgU3RyaW5nW10gZGF0YURpcnMgPSBpbml0aWFsaXNhdGlvbkRhdGEucmlnaHQ7CisKKyAgICAgICAgICAgIC8vIHBsYWNlIGVwaGVtZXJhbCBtYXJrZXIgZmlsZSBpbnRvIHNuYXBzaG90IGRpcmVjdG9yeSBwcmV0ZW5kaW5nIGl0IHdhcyBjcmVhdGVkIGFzIGVwaGVtZXJhbAorICAgICAgICAgICAgUGF0aCBlcGhlbWVyYWxNYXJrZXJGaWxlID0gUGF0aHMuZ2V0KGRhdGFEaXJzWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZShLRVlTUEFDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc29sdmUoZm9ybWF0KCIlcy0lcyIsIHRhYmxlTmFtZSwgdGFibGVJZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlKCJzbmFwc2hvdHMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZShzbmFwc2hvdE5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlKCJlcGhlbWVyYWwuc25hcHNob3QiKTsKKworICAgICAgICAgICAgRmlsZXMuY3JlYXRlRmlsZShlcGhlbWVyYWxNYXJrZXJGaWxlKTsKKworICAgICAgICAgICAgdmVyaWZ5KGMuZ2V0KDEpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVwaGVtZXJhbFNuYXBzaG90SXNOb3RDbGVhcmFibGVGcm9tTm9kZXRvb2woKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgYyA9IGluaXQoYnVpbGRlcigpLndpdGhOb2RlcygxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy53aXRoKEdPU1NJUCwgTkVUV09SSywgTkFUSVZFX1BST1RPQ09MKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSUludm9rYWJsZUluc3RhbmNlIGluc3RhbmNlID0gYy5nZXQoMSk7CisKKyAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmdbXT4gaW5pdGlhbGlzYXRpb25EYXRhID0gaW5pdGlhbGlzZShjKTsKKyAgICAgICAgICAgIHJld3JpdGVNYW5pZmVzdFRvRXBoZW1lcmFsKGluaXRpYWxpc2F0aW9uRGF0YS5sZWZ0LCBpbml0aWFsaXNhdGlvbkRhdGEucmlnaHQpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGluc3RhbmNlLm5vZGV0b29sUmVzdWx0KCJsaXN0c25hcHNob3RzIiwgIi1lIikuZ2V0U3Rkb3V0KCkuY29udGFpbnMoc25hcHNob3ROYW1lKSk7CisgICAgICAgICAgICBpbnN0YW5jZS5ub2RldG9vbFJlc3VsdCgiY2xlYXJzbmFwc2hvdCIsICItdCIsIHNuYXBzaG90TmFtZSkuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKKyAgICAgICAgICAgIC8vIGVwaGVtZXJhbCBzbmFwc2hvdCB3YXMgbm90IHJlbW92ZWQgYXMgaXQgY2FuIG5vdCBiZSAoZnJvbSBub2RldG9vbCAvIHVzZXIgb3BlcmF0aW9uKQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpbnN0YW5jZS5ub2RldG9vbFJlc3VsdCgibGlzdHNuYXBzaG90cyIsICItZSIpLmdldFN0ZG91dCgpLmNvbnRhaW5zKHNuYXBzaG90TmFtZSkpOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZShpbnN0YW5jZS5sb2dzKCkuZ3JlcCgiU2tpcHBpbmcgZGVsZXRpb24gb2YgZXBoZW1lcmFsIHNuYXBzaG90ICdzbmFwc2hvdG5hbWUnIGluIGtleXNwYWNlIGRpc3RyaWJ1dGVkX3Rlc3Rfa2V5c3BhY2UuICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVwaGVtZXJhbCBzbmFwc2hvdHMgYXJlIG5vdCByZW1vdmFibGUgYnkgYSB1c2VyLiIpLmdldFJlc3VsdCgpLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcmluZ0FsbFNuYXBzaG90c0Zyb21Ob2RldG9vbFdpbGxLZWVwRXBoZW1lcmFsU25hcGhvdHNJbnRhY3QoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgYyA9IGluaXQoYnVpbGRlcigpLndpdGhOb2RlcygxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy53aXRoKEdPU1NJUCwgTkVUV09SSywgTkFUSVZFX1BST1RPQ09MKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSUludm9rYWJsZUluc3RhbmNlIGluc3RhbmNlID0gYy5nZXQoMSk7CisKKyAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBTdHJpbmdbXT4gaW5pdGlhbGlzYXRpb25EYXRhID0gaW5pdGlhbGlzZShjKTsKKworICAgICAgICAgICAgcmV3cml0ZU1hbmlmZXN0VG9FcGhlbWVyYWwoaW5pdGlhbGlzYXRpb25EYXRhLmxlZnQsIGluaXRpYWxpc2F0aW9uRGF0YS5yaWdodCk7CisKKyAgICAgICAgICAgIGluc3RhbmNlLm5vZGV0b29sUmVzdWx0KCJjbGVhcnNuYXBzaG90IiwgIi0tYWxsIikuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoaW5zdGFuY2Uubm9kZXRvb2xSZXN1bHQoImxpc3RzbmFwc2hvdHMiLCAiLWUiKS5nZXRTdGRvdXQoKS5jb250YWlucyhzbmFwc2hvdE5hbWUpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGluc3RhbmNlLm5vZGV0b29sUmVzdWx0KCJsaXN0c25hcHNob3RzIiwgIi1lIikuZ2V0U3Rkb3V0KCkuY29udGFpbnMoc25hcHNob3ROYW1lMikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBQYWlyPFN0cmluZywgU3RyaW5nW10+IGluaXRpYWxpc2UoQ2x1c3RlciBjKQorICAgIHsKKyAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAlcy4iICsgdGFibGVOYW1lICsgIiAoY2l0eWlkIGludCBQUklNQVJZIEtFWSwgbmFtZSB0ZXh0KSIpKTsKKyAgICAgICAgYy5jb29yZGluYXRvcigxKS5leGVjdXRlKHdpdGhLZXlzcGFjZSgiSU5TRVJUIElOVE8gJXMuIiArIHRhYmxlTmFtZSArICIoY2l0eWlkLCBuYW1lKSBWQUxVRVMgKDEsICdDYW5iZXJyYScpOyIpLCBPTkUpOworICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgaW5zdGFuY2UgPSBjLmdldCgxKTsKKworICAgICAgICBpbnN0YW5jZS5mbHVzaChLRVlTUEFDRSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGluc3RhbmNlLm5vZGV0b29sKCJzbmFwc2hvdCIsICIta3QiLCB3aXRoS2V5c3BhY2UoIiVzLiIgKyB0YWJsZU5hbWUpLCAiLXQiLCBzbmFwc2hvdE5hbWUpKTsKKyAgICAgICAgd2FpdEZvclNuYXBzaG90KGluc3RhbmNlLCBzbmFwc2hvdE5hbWUpOworCisgICAgICAgIC8vIHRha2Ugb25lIG1vcmUgc25hcHNob3QsIHRoaXMgb25lIGlzIG5vdCBlcGhlbWVyYWwsCisgICAgICAgIC8vIHN0YXJ0aW5nIENhc3NhbmRyYSB3aWxsIGNsZWFyIGVwaGVtZXJhbHMsIGJ1dCBpdCB3aWxsIG5vdCBhZmZlY3Qgbm9uLWVwaGVtZXJhbCBzbmFwc2hvdHMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGluc3RhbmNlLm5vZGV0b29sKCJzbmFwc2hvdCIsICIta3QiLCB3aXRoS2V5c3BhY2UoIiVzLiIgKyB0YWJsZU5hbWUpLCAiLXQiLCBzbmFwc2hvdE5hbWUyKSk7CisgICAgICAgIHdhaXRGb3JTbmFwc2hvdChpbnN0YW5jZSwgc25hcHNob3ROYW1lMik7CisKKyAgICAgICAgU3RyaW5nIHRhYmxlSWQgPSBpbnN0YW5jZS5jYWxsT25JbnN0YW5jZSgoSUlzb2xhdGVkRXhlY3V0b3IuU2VyaWFsaXphYmxlQ2FsbGFibGU8U3RyaW5nPikgKCkgLT4geworICAgICAgICAgICAgcmV0dXJuIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldE1ldGFkYXRhKCkudGFibGVzLmdldCh0YWJsZU5hbWUpLmdldCgpLmlkLmFzVVVJRCgpLnRvU3RyaW5nKCkucmVwbGFjZUFsbCgiLSIsICIiKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgU3RyaW5nW10gZGF0YURpcnMgPSAoU3RyaW5nW10pIGluc3RhbmNlLmNvbmZpZygpLmdldCgiZGF0YV9maWxlX2RpcmVjdG9yaWVzIik7CisKKyAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKHRhYmxlSWQsIGRhdGFEaXJzKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnkoSUludm9rYWJsZUluc3RhbmNlIGluc3RhbmNlKQorICAgIHsKKyAgICAgICAgLy8gYnkgZGVmYXVsdCwgd2UgZG8gbm90IHNlZSBlcGhlbWVyYWxzCisgICAgICAgIGFzc2VydEZhbHNlKGluc3RhbmNlLm5vZGV0b29sUmVzdWx0KCJsaXN0c25hcHNob3RzIikuZ2V0U3Rkb3V0KCkuY29udGFpbnMoc25hcHNob3ROYW1lKSk7CisKKyAgICAgICAgLy8gd2Ugc2VlIHRoZW0gdmlhIC1lIGZsYWcKKyAgICAgICAgYXNzZXJ0VHJ1ZShpbnN0YW5jZS5ub2RldG9vbFJlc3VsdCgibGlzdHNuYXBzaG90cyIsICItZSIpLmdldFN0ZG91dCgpLmNvbnRhaW5zKHNuYXBzaG90TmFtZSkpOworCisgICAgICAgIEZ1dHVyZXMuZ2V0VW5jaGVja2VkKGluc3RhbmNlLnNodXRkb3duKCkpOworCisgICAgICAgIC8vIHN0YXJ0dXAgc2hvdWxkIHJlbW92ZSBlcGhlbWVyYWwgc25hcHNob3QKKyAgICAgICAgaW5zdGFuY2Uuc3RhcnR1cCgpOworCisgICAgICAgIGFzc2VydEZhbHNlKGluc3RhbmNlLm5vZGV0b29sUmVzdWx0KCJsaXN0c25hcHNob3RzIiwgIi1lIikuZ2V0U3Rkb3V0KCkuY29udGFpbnMoc25hcHNob3ROYW1lKSk7CisgICAgICAgIGFzc2VydFRydWUoaW5zdGFuY2Uubm9kZXRvb2xSZXN1bHQoImxpc3RzbmFwc2hvdHMiLCAiLWUiKS5nZXRTdGRvdXQoKS5jb250YWlucyhzbmFwc2hvdE5hbWUyKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JTbmFwc2hvdChJSW52b2thYmxlSW5zdGFuY2UgaW5zdGFuY2UsIFN0cmluZyBzbmFwc2hvdE5hbWUpCisgICAgeworICAgICAgICBhd2FpdCgpLnRpbWVvdXQoMjAsIFNFQ09ORFMpCisgICAgICAgICAgICAgICAucG9sbEludGVydmFsKDEsIFNFQ09ORFMpCisgICAgICAgICAgICAgICAudW50aWwoKCkgLT4gaW5zdGFuY2Uubm9kZXRvb2xSZXN1bHQoImxpc3RzbmFwc2hvdHMiLCAiLWUiKS5nZXRTdGRvdXQoKS5jb250YWlucyhzbmFwc2hvdE5hbWUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmV3cml0ZU1hbmlmZXN0VG9FcGhlbWVyYWwoU3RyaW5nIHRhYmxlSWQsIFN0cmluZ1tdIGRhdGFEaXJzKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyByZXdyaXRlIG1hbmlmZXN0LCBwcmV0ZW5kIHRoYXQgaXQgaXMgZXBoZW1lcmFsCisgICAgICAgIFBhdGggbWFuaWZlc3RQYXRoID0gZmluZE1hbmlmZXN0KGRhdGFEaXJzLCB0YWJsZUlkKTsKKyAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IFNuYXBzaG90TWFuaWZlc3QuZGVzZXJpYWxpemVGcm9tSnNvbkZpbGUobmV3IEZpbGUobWFuaWZlc3RQYXRoKSk7CisgICAgICAgIFNuYXBzaG90TWFuaWZlc3QgbWFuaWZlc3RXaXRoRXBoZW1lcmFsRmxhZyA9IG5ldyBTbmFwc2hvdE1hbmlmZXN0KG1hbmlmZXN0LmZpbGVzLCBudWxsLCBtYW5pZmVzdC5jcmVhdGVkQXQsIHRydWUpOworICAgICAgICBtYW5pZmVzdFdpdGhFcGhlbWVyYWxGbGFnLnNlcmlhbGl6ZVRvSnNvbkZpbGUobmV3IEZpbGUobWFuaWZlc3RQYXRoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYXRoIGZpbmRNYW5pZmVzdChTdHJpbmdbXSBkYXRhRGlycywgU3RyaW5nIHRhYmxlSWQpCisgICAgeworICAgICAgICBmb3IgKFN0cmluZyBkYXRhRGlyIDogZGF0YURpcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhdGggbWFuaWZlc3QgPSBQYXRocy5nZXQoZGF0YURpcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlKEtFWVNQQUNFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc29sdmUoZm9ybWF0KCIlcy0lcyIsIHRhYmxlTmFtZSwgdGFibGVJZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZSgic25hcHNob3RzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlKHNuYXBzaG90TmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlKCJtYW5pZmVzdC5qc29uIik7CisKKyAgICAgICAgICAgIGlmIChGaWxlcy5leGlzdHMobWFuaWZlc3QpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIG1hbmlmZXN0ISIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9GYWlsaW5nUmVwYWlyVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ZhaWxpbmdSZXBhaXJUZXN0LmphdmEKaW5kZXggZWIxY2RmZi4uNDA1Mjc5YSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ZhaWxpbmdSZXBhaXJUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ZhaWxpbmdSZXBhaXJUZXN0LmphdmEKQEAgLTY0LDkgKzY0LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLkluc3RhbmNlS2lsbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Gb3J3YXJkaW5nU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQ2hhbm5lbFByb3h5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcGFpci5SZXBhaXJQYXJhbGxlbGlzbTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9GYWlsaW5nUmVzcG9uc2VEb2VzTm90TG9nVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ZhaWxpbmdSZXNwb25zZURvZXNOb3RMb2dUZXN0LmphdmEKaW5kZXggMTA3MTkzOC4uNDAzMmNjNyAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ZhaWxpbmdSZXNwb25zZURvZXNOb3RMb2dUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ZhaWxpbmdSZXNwb25zZURvZXNOb3RMb2dUZXN0LmphdmEKQEAgLTQwLDYgKzQwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuTG9nQWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Mb2dSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUmVxdWVzdEV4ZWN1dGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlcXVlc3RWYWxpZGF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CkBAIC00OSw2ICs1MCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTUQ1RGlnZXN0OwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DVVNUT01fUVVFUllfSEFORExFUl9DTEFTUzsKKwogLyoqCiAgKiBUaGlzIGNsYXNzIGlzIHJhdGhlciBpbXBlbGVtbnRhdGlvbiBzcGVjaWZpYy4gIEl0IGlzIHBvc3NpYmxlIHRoYXQgY2hhbmdlcyBtYWRlIHdpbGwgY2F1c2UgdGhpcyB0ZXN0cyB0byBmYWlsLAogICogc28gdXBkYXRpbmcgdG8gdGhlIGxhdGVzdCBsb2dpYyBpcyBmaW5lLgpAQCAtNjgsMTMgKzcxLDE1IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBkaXNwYXRjaGVyRXJyb3JEb2VzTm90TG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY3VzdG9tX3F1ZXJ5X2hhbmRsZXJfY2xhc3MiLCBBbHdheXNSZWplY3RFcnJvclF1ZXJ5SGFuZGxlci5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IENsdXN0ZXIuYnVpbGQoMSkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KENVU1RPTV9RVUVSWV9IQU5ETEVSX0NMQVNTLCBBbHdheXNSZWplY3RFcnJvclF1ZXJ5SGFuZGxlci5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICAgICAgIENsdXN0ZXIgY2x1c3RlciA9IENsdXN0ZXIuYnVpbGQoMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoYyAtPiBjLndpdGgoRmVhdHVyZS5OQVRJVkVfUFJPVE9DT0wsIEZlYXR1cmUuR09TU0lQKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJjbGllbnRfZXJyb3JfcmVwb3J0aW5nX2V4Y2x1c2lvbnMiLCBJbW11dGFibGVNYXAub2YoInN1Ym5ldHMiLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCIxMjcuMC4wLjEiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoImNsaWVudF9lcnJvcl9yZXBvcnRpbmdfZXhjbHVzaW9ucyIsIEltbXV0YWJsZU1hcC5vZigic3VibmV0cyIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIjEyNy4wLjAuMSIpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpOworCisgICAgICAgICkKICAgICAgICAgeworCiAgICAgICAgICAgICB0cnkgKFNpbXBsZUNsaWVudCBjbGllbnQgPSBTaW1wbGVDbGllbnQuYnVpbGRlcigiMTI3LjAuMC4xIiwgOTA0MikuYnVpbGQoKS5jb25uZWN0KGZhbHNlKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZSgiU0VMRUNUICogRlJPTSBzeXN0ZW0ucGVlcnMiLCBDb25zaXN0ZW5jeUxldmVsLk9ORSk7CkBAIC05MiwxMCArOTcsNiBAQAogICAgICAgICAgICAgbWF0Y2hlcyA9IGxvZ3MuZ3JlcCgiVW5leHBlY3RlZCBleGNlcHRpb24gZHVyaW5nIHJlcXVlc3QiKTsKICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChtYXRjaGVzLmdldFJlc3VsdCgpKS5pc0VtcHR5KCk7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLmN1c3RvbV9xdWVyeV9oYW5kbGVyX2NsYXNzIik7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFsd2F5c1JlamVjdEVycm9yUXVlcnlIYW5kbGVyIGltcGxlbWVudHMgUXVlcnlIYW5kbGVyCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvRmFpbGluZ1RydW5jYXRpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvRmFpbGluZ1RydW5jYXRpb25UZXN0LmphdmEKaW5kZXggZGQ0MTlkYi4uOWNlMmJmMyAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ZhaWxpbmdUcnVuY2F0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9GYWlsaW5nVHJ1bmNhdGlvblRlc3QuamF2YQpAQCAtMzAsMTMgKzMwLDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CiAKIGltcG9ydCBzdGF0aWMgbmV0LmJ5dGVidWRkeS5tYXRjaGVyLkVsZW1lbnRNYXRjaGVycy5uYW1lZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0JCRkFJTEhFTFBFUl9FTkFCTEVEOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogcHVibGljIGNsYXNzIEZhaWxpbmdUcnVuY2F0aW9uVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQl9GQUlMX0hFTFBFUl9QUk9QID0gInRlc3QuYmJmYWlsaGVscGVyLmVuYWJsZWQiOwotCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbGluZ1RydW5jYXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CkBAIC00NSw3ICs0NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpKQogICAgICAgICB7CiAgICAgICAgICAgICBjbHVzdGVyLnNldFVuY2F1Z2h0RXhjZXB0aW9uc0ZpbHRlcih0IC0+ICJ0cnVuY2F0ZUJsb2NraW5nIi5lcXVhbHModC5nZXRNZXNzYWdlKCkpKTsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShCQl9GQUlMX0hFTFBFUl9QUk9QLCAidHJ1ZSIpOworICAgICAgICAgICAgVEVTVF9CQkZBSUxIRUxQRVJfRU5BQkxFRC5zZXRCb29sZWFuKHRydWUpOwogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoImNyZWF0ZSB0YWJsZSAiICsgS0VZU1BBQ0UgKyAiLnRibCAoaWQgaW50IHByaW1hcnkga2V5LCB0IGludCkiKTsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewpAQCAtNzYsNyArNzUsNyBAQAogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0cnVuY2F0ZUJsb2NraW5nKCkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKEJvb2xlYW4uZ2V0Qm9vbGVhbihCQl9GQUlMX0hFTFBFUl9QUk9QKSkKKyAgICAgICAgICAgIGlmIChURVNUX0JCRkFJTEhFTFBFUl9FTkFCTEVELmdldEJvb2xlYW4oKSkKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidHJ1bmNhdGVCbG9ja2luZyIpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0Zyb3plblVEVFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Gcm96ZW5VRFRUZXN0LmphdmEKaW5kZXggM2I1NDM5OC4uMzMxNGMyYSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0Zyb3plblVEVFRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvRnJvemVuVURUVGVzdC5qYXZhCkBAIC02NSwxNCArNjUsMTQgQEAKICAgICAgICAgewogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoImNyZWF0ZSB0eXBlICIgKyBLRVlTUEFDRSArICIuYSAoZm9vIHRleHQpIik7CiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiY3JlYXRlIHRhYmxlICIgKyBLRVlTUEFDRSArICIueCAoaWQgaW50LCBjayBmcm96ZW48YT4sIGkgaW50LCBwcmltYXJ5IGtleSAoaWQsIGNrKSkiKTsKLSAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgiaW5zZXJ0IGludG8gIiArIEtFWVNQQUNFICsgIi54IChpZCwgY2ssIGkpIFZBTFVFUyAoMSwgc3lzdGVtLmZyb21qc29uKCd7XCJmb29cIjpcIlwifScpLCAxKSIsIENvbnNpc3RlbmN5TGV2ZWwuQUxMKTsKLSAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgiaW5zZXJ0IGludG8gIiArIEtFWVNQQUNFICsgIi54IChpZCwgY2ssIGkpIFZBTFVFUyAoMSwgc3lzdGVtLmZyb21qc29uKCd7XCJmb29cIjpcImFcIn0nKSwgMikiLCBDb25zaXN0ZW5jeUxldmVsLkFMTCk7CisgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoImluc2VydCBpbnRvICIgKyBLRVlTUEFDRSArICIueCAoaWQsIGNrLCBpKSBWQUxVRVMgKDEsIHN5c3RlbS5mcm9tX2pzb24oJ3tcImZvb1wiOlwiXCJ9JyksIDEpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpOworICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJpbnNlcnQgaW50byAiICsgS0VZU1BBQ0UgKyAiLnggKGlkLCBjaywgaSkgVkFMVUVTICgxLCBzeXN0ZW0uZnJvbV9qc29uKCd7XCJmb29cIjpcImFcIn0nKSwgMikiLCBDb25zaXN0ZW5jeUxldmVsLkFMTCk7CiAgICAgICAgICAgICBjbHVzdGVyLmZvckVhY2goaSAtPiBpLmZsdXNoKEtFWVNQQUNFKSk7CiAKICAgICAgICAgICAgIFJ1bm5hYmxlIGNoZWNrID0gKCkgLT4gewotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJzZWxlY3QgaSBmcm9tICIgKyBLRVlTUEFDRSArICIueCBXSEVSRSBpZCA9IDEgYW5kIGNrID0gc3lzdGVtLmZyb21qc29uKCd7XCJmb29cIjpcIlwifScpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJzZWxlY3QgaSBmcm9tICIgKyBLRVlTUEFDRSArICIueCBXSEVSRSBpZCA9IDEgYW5kIGNrID0gc3lzdGVtLmZyb21fanNvbigne1wiZm9vXCI6XCJcIn0nKSIsIENvbnNpc3RlbmN5TGV2ZWwuQUxMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygxKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gIiArIEtFWVNQQUNFICsgIi54IFdIRVJFIGlkID0gMSBhbmQgY2sgPSBzeXN0ZW0uZnJvbWpzb24oJ3tcImZvb1wiOlwiYVwifScpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJzZWxlY3QgaSBmcm9tICIgKyBLRVlTUEFDRSArICIueCBXSEVSRSBpZCA9IDEgYW5kIGNrID0gc3lzdGVtLmZyb21fanNvbigne1wiZm9vXCI6XCJhXCJ9JykiLCBDb25zaXN0ZW5jeUxldmVsLkFMTCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coMikpOwogICAgICAgICAgICAgfTsKIApAQCAtODAsMTAgKzgwLDEwIEBACiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiYWx0ZXIgdHlwZSAiICsgS0VZU1BBQ0UgKyAiLmEgYWRkIGJhciB0ZXh0Iik7CiAgICAgICAgICAgICBjaGVjay5ydW4oKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gIiArIEtFWVNQQUNFICsgIi54IFdIRVJFIGlkID0gMSBhbmQgY2sgPSBzeXN0ZW0uZnJvbWpzb24oJ3tcImZvb1wiOlwiXCIsXCJiYXJcIjpcIlwifScpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpKTsKLSAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgiaW5zZXJ0IGludG8gIiArIEtFWVNQQUNFICsgIi54IChpZCwgY2ssIGkpIFZBTFVFUyAoMSwgc3lzdGVtLmZyb21qc29uKCd7XCJmb29cIjpcIlwiLFwiYmFyXCI6XCJcIn0nKSwgMykiLCBDb25zaXN0ZW5jeUxldmVsLkFMTCk7CisgICAgICAgICAgICBhc3NlcnRSb3dzKGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSAiICsgS0VZU1BBQ0UgKyAiLnggV0hFUkUgaWQgPSAxIGFuZCBjayA9IHN5c3RlbS5mcm9tX2pzb24oJ3tcImZvb1wiOlwiXCIsXCJiYXJcIjpcIlwifScpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgiaW5zZXJ0IGludG8gIiArIEtFWVNQQUNFICsgIi54IChpZCwgY2ssIGkpIFZBTFVFUyAoMSwgc3lzdGVtLmZyb21fanNvbigne1wiZm9vXCI6XCJcIixcImJhclwiOlwiXCJ9JyksIDMpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpOwogICAgICAgICAgICAgY2hlY2sucnVuKCk7Ci0gICAgICAgICAgICBhc3NlcnRSb3dzKGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSAiICsgS0VZU1BBQ0UgKyAiLnggV0hFUkUgaWQgPSAxIGFuZCBjayA9IHN5c3RlbS5mcm9tanNvbigne1wiZm9vXCI6XCJcIixcImJhclwiOlwiXCJ9JykiLCBDb25zaXN0ZW5jeUxldmVsLkFMTCksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSAiICsgS0VZU1BBQ0UgKyAiLnggV0hFUkUgaWQgPSAxIGFuZCBjayA9IHN5c3RlbS5mcm9tX2pzb24oJ3tcImZvb1wiOlwiXCIsXCJiYXJcIjpcIlwifScpIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coMykpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTQzLDExICsxNDMsMTEgQEAKIAogICAgIHByaXZhdGUgU3RyaW5nIGpzb24oaW50IGkpCiAgICAgewotICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgic3lzdGVtLmZyb21qc29uKCd7XCJmb29cIjpcIiVkXCJ9JykiLCBpKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInN5c3RlbS5mcm9tX2pzb24oJ3tcImZvb1wiOlwiJWRcIn0nKSIsIGkpOwogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGpzb24oaW50IGksIGludCBqKQogICAgIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInN5c3RlbS5mcm9tanNvbigne1wiZm9vXCI6XCIlZFwiLCBcImJhclwiOlwiJWRcIn0nKSIsIGksIGopOworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgic3lzdGVtLmZyb21fanNvbigne1wiZm9vXCI6XCIlZFwiLCBcImJhclwiOlwiJWRcIn0nKSIsIGksIGopOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Hb3NzaXBUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvR29zc2lwVGVzdC5qYXZhCmluZGV4IGM1ZjJhMDcuLjM5MDU0MTEgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Hb3NzaXBUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0dvc3NpcFRlc3QuamF2YQpAQCAtNTEsNiArNTEsNyBAQAogCiBpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMubmFtZWQ7CiBpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMudGFrZXNBcmd1bWVudHM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSk9JTl9SSU5HOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hY3Rpb24uR29zc2lwSGVscGVyLndpdGhQcm9wZXJ0eTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuR09TU0lQOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5ORVRXT1JLOwpAQCAtMjk5LDcgKzMwMCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIElJbnN0YW5jZUNvbmZpZyBjb25maWcgPSBjbHVzdGVyLm5ld0luc3RhbmNlQ29uZmlnKCk7CiAgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgZ29zc2lwcGluZ09ubHlNZW1iZXIgPSBjbHVzdGVyLmJvb3RzdHJhcChjb25maWcpOwotICAgICAgICAgICAgd2l0aFByb3BlcnR5KCJjYXNzYW5kcmEuam9pbl9yaW5nIiwgQm9vbGVhbi50b1N0cmluZyhmYWxzZSksICgpIC0+IGdvc3NpcHBpbmdPbmx5TWVtYmVyLnN0YXJ0dXAoY2x1c3RlcikpOworICAgICAgICAgICAgd2l0aFByb3BlcnR5KEpPSU5fUklORywgZmFsc2UsICgpIC0+IGdvc3NpcHBpbmdPbmx5TWVtYmVyLnN0YXJ0dXAoY2x1c3RlcikpOwogCiAgICAgICAgICAgICBhc3NlcnRUcnVlKGdvc3NpcHBpbmdPbmx5TWVtYmVyLmNhbGxPbkluc3RhbmNlKChJSXNvbGF0ZWRFeGVjdXRvci5TZXJpYWxpemFibGVDYWxsYWJsZTxCb29sZWFuPikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaXNHb3NzaXBSdW5uaW5nKCkpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9IaW50ZWRIYW5kb2ZmQWRkUmVtb3ZlTm9kZXNUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvSGludGVkSGFuZG9mZkFkZFJlbW92ZU5vZGVzVGVzdC5qYXZhCmluZGV4IDVjZjFhYjYuLmFkZDZmZGYgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9IaW50ZWRIYW5kb2ZmQWRkUmVtb3ZlTm9kZXNUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0hpbnRlZEhhbmRvZmZBZGRSZW1vdmVOb2Rlc1Rlc3QuamF2YQpAQCAtMjMsMTggKzIzLDIyIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFjdGlvbi5Hb3NzaXBIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJbnZva2FibGVJbnN0YW5jZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuVG9rZW5TdXBwbGllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuTmV0d29ya1RvcG9sb2d5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuSGludHNTZXJ2aWNlTWV0cmljczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0b3JhZ2VNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uc0ZvckNsYXNzVHlwZXMuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmF3YWl0aWxpdHkuQXdhaXRpbGl0eS5hd2FpdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYWN0aW9uLkdvc3NpcEhlbHBlci5kZWNvbW1pc3Npb247CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsLkFMTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuVFdPOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5HT1NTSVA7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLk5BVElWRV9QUk9UT0NPTDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkVUV09SSzsKQEAgLTQ2LDYgKzUwLDM5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBIaW50ZWRIYW5kb2ZmQWRkUmVtb3ZlTm9kZXNUZXN0IGV4dGVuZHMgVGVzdEJhc2VJbXBsCiB7CisgICAgQFN1cHByZXNzV2FybmluZ3MoIkNvbnZlcnQyTWV0aG9kUmVmIikKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZEF2b2lkSGludFRyYW5zZmVyT25EZWNvbW1pc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IGluaXQoYnVpbGRlcigpLndpdGhOb2RlcygzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy5zZXQoInRyYW5zZmVyX2hpbnRzX29uX2RlY29tbWlzc2lvbiIsIGZhbHNlKS53aXRoKEdPU1NJUCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aG91dFZOb2RlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLmRlY29tX25vX2hpbnRzX3Rlc3QgKGtleSBpbnQgUFJJTUFSWSBLRVksIHZhbHVlIGludCkiKSk7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLmRlY29tX25vX2hpbnRzX3Rlc3QgKGtleSwgdmFsdWUpIFZBTFVFUyAoPywgPykiKSwgQUxMLCAwLCAwKTsKKyAgICAgICAgICAgIGxvbmcgaGludHNCZWZvcmVTaHV0ZG93biA9IGNvdW50VG90YWxIaW50cyhjbHVzdGVyLmdldCgxKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGhpbnRzQmVmb3JlU2h1dGRvd24pLmlzRXF1YWxUbygwKTsKKyAgICAgICAgICAgIGxvbmcgaGludHNEZWxpdmVyZWQgPSBjb3VudEhpbnRzRGVsaXZlcmVkKGNsdXN0ZXIuZ2V0KDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaGludHNEZWxpdmVyZWQpLmlzRXF1YWxUbygwKTsKKworICAgICAgICAgICAgLy8gU2h1dGRvd24gbm9kZSAzIHNvIGhpbnRzIGNhbiBiZSB3cml0dGVuIGFnYWluc3QgaXQuCisgICAgICAgICAgICBjbHVzdGVyLmdldCgzKS5zaHV0ZG93bigpLmdldCgpOworCisgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy5kZWNvbV9ub19oaW50c190ZXN0IChrZXksIHZhbHVlKSBWQUxVRVMgKD8sID8pIiksIFRXTywgMCwgMCk7CisgICAgICAgICAgICBBd2FpdGlsaXR5LmF3YWl0KCkudW50aWwoKCkgLT4gY291bnRUb3RhbEhpbnRzKGNsdXN0ZXIuZ2V0KDEpKSA+IDApOworICAgICAgICAgICAgbG9uZyBoaW50c0FmdGVyU2h1dGRvd24gPSBjb3VudFRvdGFsSGludHMoY2x1c3Rlci5nZXQoMSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChoaW50c0FmdGVyU2h1dGRvd24pLmlzRXF1YWxUbygxKTsKKworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2xSZXN1bHQoImRlY29tbWlzc2lvbiIsICItLWZvcmNlIikuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKKyAgICAgICAgICAgIGxvbmcgaGludHNEZWxpdmVyZWRCeURlY29tID0gY291bnRIaW50c0RlbGl2ZXJlZChjbHVzdGVyLmdldCgxKSk7CisgICAgICAgICAgICBTdHJpbmcgbW9kZSA9IGNsdXN0ZXIuZ2V0KDEpLmNhbGxPbkluc3RhbmNlKCgpIC0+IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldE9wZXJhdGlvbk1vZGUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RvcmFnZVNlcnZpY2UuTW9kZS5ERUNPTU1JU1NJT05FRC50b1N0cmluZygpLCBtb2RlKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaGludHNEZWxpdmVyZWRCeURlY29tKS5pc0VxdWFsVG8oMCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKioKICAgICAgKiBSZXBsYWNlcyBQeXRob24gZHRlc3Qge0Bjb2RlIGhpbnRlZGhhbmRvZmZfdGVzdC5weTpUZXN0SGludGVkSGFuZG9mZi50ZXN0X2hpbnRlZGhhbmRvZmZfZGVjb20oKX0uCiAgICAgICovCkBAIC0xMzAsNiArMTY3LDEyIEBACiAgICAgICAgIHJldHVybiBpbnN0YW5jZS5jYWxsT25JbnN0YW5jZSgoKSAtPiBTdG9yYWdlTWV0cmljcy50b3RhbEhpbnRzLmdldENvdW50KCkpOwogICAgIH0KIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJDb252ZXJ0Mk1ldGhvZFJlZiIpCisgICAgcHJpdmF0ZSBsb25nIGNvdW50SGludHNEZWxpdmVyZWQoSUludm9rYWJsZUluc3RhbmNlIGluc3RhbmNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlLmNhbGxPbkluc3RhbmNlKCgpIC0+IEhpbnRzU2VydmljZU1ldHJpY3MuaGludHNTdWNjZWVkZWQuZ2V0Q291bnQoKSk7CisgICAgfQorCiAgICAgQFN1cHByZXNzV2FybmluZ3MoIlNhbWVQYXJhbWV0ZXJWYWx1ZSIpCiAgICAgcHJpdmF0ZSB2b2lkIHBvcHVsYXRlKENsdXN0ZXIgY2x1c3RlciwgU3RyaW5nIHRhYmxlLCBpbnQgY29vcmRpbmF0b3IsIGludCBzdGFydCwgaW50IGNvdW50LCBDb25zaXN0ZW5jeUxldmVsIGNsKQogICAgIHsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9JUE1lbWJlcnNoaXBUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvSVBNZW1iZXJzaGlwVGVzdC5qYXZhCmluZGV4IDQ3NGE4YjcuLjE2YTk3YjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9JUE1lbWJlcnNoaXBUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0lQTWVtYmVyc2hpcFRlc3QuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXI7CiBpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJFUExBQ0VfQUREUkVTUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLkNsdXN0ZXJVdGlscy5hc3NlcnRSaW5nSXM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5DbHVzdGVyVXRpbHMuZ2V0RGlyZWN0b3JpZXM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5DbHVzdGVyVXRpbHMuc3RvcFVuY2hlY2tlZDsKQEAgLTY0LDExICs2NSwxMyBAQAogICAgICAgICAgICAgICAgIGdldERpcmVjdG9yaWVzKG5vZGVUb1JlcGxhY2UpLmZvckVhY2goRmlsZVV0aWxzOjpkZWxldGVSZWN1cnNpdmUpOwogCiAgICAgICAgICAgICAgICAgbm9kZVRvUmVwbGFjZS5jb25maWcoKS5zZXQoImF1dG9fYm9vdHN0cmFwIiwgYXV0b19ib290c3RyYXApOworCiAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBvdmVycmlkZSB0aGUgaG9zdCBpZCBiZWNhdXNlIG90aGVyd2lzZSB0aGUgbm9kZSB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIGFzIGEgbmV3IG5vZGUKICAgICAgICAgICAgICAgICAoKEluc3RhbmNlQ29uZmlnKSBub2RlVG9SZXBsYWNlLmNvbmZpZygpKS5zZXRIb3N0SWQoVVVJRC5yYW5kb21VVUlEKCkpOwogCiAgICAgICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gbm9kZVRvUmVwbGFjZS5zdGFydHVwKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNNZXNzYWdlKCJBIG5vZGUgd2l0aCBhZGRyZXNzIC8xMjcuMC4wLjM6NzAxMiBhbHJlYWR5IGV4aXN0cywgY2FuY2VsbGluZyBqb2luLiBVc2UgY2Fzc2FuZHJhLnJlcGxhY2VfYWRkcmVzcyBpZiB5b3Ugd2FudCB0byByZXBsYWNlIHRoaXMgbm9kZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2UoIkEgbm9kZSB3aXRoIGFkZHJlc3MgLzEyNy4wLjAuMzo3MDEyIGFscmVhZHkgZXhpc3RzLCBjYW5jZWxsaW5nIGpvaW4uIFVzZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVQTEFDRV9BRERSRVNTLmdldEtleSgpICsgIiBpZiB5b3Ugd2FudCB0byByZXBsYWNlIHRoaXMgbm9kZS4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9JbnRlcm5vZGVFbmNyeXB0aW9uRW5mb3JjZW1lbnRUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvSW50ZXJub2RlRW5jcnlwdGlvbkVuZm9yY2VtZW50VGVzdC5qYXZhCmluZGV4IDYyZjBhNzMuLjI3YzI2ZmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9JbnRlcm5vZGVFbmNyeXB0aW9uRW5mb3JjZW1lbnRUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0ludGVybm9kZUVuY3J5cHRpb25FbmZvcmNlbWVudFRlc3QuamF2YQpAQCAtMTcsMjEgKzE3LDM4IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKIAoraW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQWxsb3dBbGxJbnRlcm5vZGVBdXRoZW50aWNhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSUludGVybm9kZUF1dGhlbnRpY2F0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSXNvbGF0ZWRFeGVjdXRvci5TZXJpYWxpemFibGVSdW5uYWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuTmV0d29ya1RvcG9sb2d5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuSW5ib3VuZE1lc3NhZ2VIYW5kbGVyczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuT3V0Ym91bmRDb25uZWN0aW9uczsKK2ltcG9ydCBvcmcuYXdhaXRpbGl0eS5Bd2FpdGlsaXR5OwogCiBpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzLmdldE9ubHlFbGVtZW50OwogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKQEAgLTM5LDYgKzU2LDExNCBAQAogCiBwdWJsaWMgZmluYWwgY2xhc3MgSW50ZXJub2RlRW5jcnlwdGlvbkVuZm9yY2VtZW50VGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAogeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5ib3VuZENvbm5lY3Rpb25zQXJlUmVqZWN0ZWRXaGVuQXV0aEZhaWxzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBSZWplY3RJbmJvdW5kQ29ubmVjdGlvbnMgYXV0aGVudGljYXRvciBpcyBjb25maWd1cmVkIG9ubHkgZm9yIGluc3RhbmNlIDEgb2YgdGhlIGNsdXN0ZXIKKyAgICAgICAgQ2x1c3Rlci5CdWlsZGVyIGJ1aWxkZXIgPSBjcmVhdGVDbHVzdGVyKFJlamVjdEluYm91bmRDb25uZWN0aW9ucy5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IGJ1aWxkZXIuc3RhcnQoKTsgQ2xvc2VhYmxlIGVzID0gZXhlY3V0b3JTZXJ2aWNlOjpzaHV0ZG93bikKKyAgICAgICAgeworICAgICAgICAgICAgZXhlY3V0b3JTZXJ2aWNlLnN1Ym1pdCgoKSAtPiBvcGVuQ29ubmVjdGlvbnMoY2x1c3RlcikpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSW5zdGFuY2UgKDEpIHNob3VsZCBiZSBhYmxlIHRvIG1ha2Ugb3V0Ym91bmQgY29ubmVjdGlvbnMgdG8gaW5zdGFuY2UgKDIpIGJ1dCBJbnN0YW5jZSAoMSkgc2hvdWxkIG5vdCBiZQorICAgICAgICAgICAgICogYWNjZXB0aW5nIGFueSBpbmJvdW5kIGNvbm5lY3Rpb25zLiB3ZSBzaG91bGQgd2FpdCBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgbG9nIG9uIEluc3RhbmNlICgxKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBTZXJpYWxpemFibGVSdW5uYWJsZSBydW5uYWJsZSA9ICgpIC0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGluYm91bmQgaGFuZGxlcnMgYXMgYXV0aGVudGljYXRpb24gZmFpbHMgJiB3ZSByZW1vdmUgaGFuZGxlcnMuCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5tZXNzYWdlSGFuZGxlcnMudmFsdWVzKCkuc2l6ZSgpKTsKKworICAgICAgICAgICAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBmYWlsdXJlIGlzIGR1ZSB0byBhdXRoZW50aWNhdGlvbiBmYWlsdXJlCisgICAgICAgICAgICAgICAgZmluYWwgUmVqZWN0SW5ib3VuZENvbm5lY3Rpb25zIGF1dGhlbnRpY2F0b3IgPSAoUmVqZWN0SW5ib3VuZENvbm5lY3Rpb25zKSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW50ZXJub2RlQXV0aGVudGljYXRvcigpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoYXV0aGVudGljYXRvci5hdXRoZW50aWNhdGlvbkZhaWxlZCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAvLyBXYWl0IGZvciBhdXRoZW50aWNhdGlvbiB0byBmYWlsCisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5sb2dzKCkud2F0Y2hGb3IoIlVuYWJsZSB0byBhdXRoZW50aWNhdGUgcGVlciIpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkucnVuT25JbnN0YW5jZShydW5uYWJsZSk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE91dGJvdW5kQ29ubmVjdGlvbnNBcmVSZWplY3RlZFdoZW5BdXRoRmFpbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENsdXN0ZXIuQnVpbGRlciBidWlsZGVyID0gY3JlYXRlQ2x1c3RlcihSZWplY3RPdXRib3VuZEF1dGhlbnRpY2F0b3IuY2xhc3MpOworCisgICAgICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBidWlsZGVyLnN0YXJ0KCk7IENsb3NlYWJsZSBlcyA9IGV4ZWN1dG9yU2VydmljZTo6c2h1dGRvd24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZS5zdWJtaXQoKCkgLT4gb3BlbkNvbm5lY3Rpb25zKGNsdXN0ZXIpKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEluc3RhbmNlICgxKSBzaG91bGQgbm90IGJlIGFibGUgdG8gbWFrZSBvdXRib3VuZCBjb25uZWN0aW9ucyB0byBpbnN0YW5jZSAoMikgYnV0IEluc3RhbmNlICgyKSBzaG91bGQgYmUKKyAgICAgICAgICAgICAqIGFjY2VwdGluZyBvdXRib3VuZCBjb25uZWN0aW9ucyBmcm9tIEluc3RhbmNlICgxKQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBTZXJpYWxpemFibGVSdW5uYWJsZSBydW5uYWJsZSA9ICgpIC0+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIG91dGJvdW5kIGNvbm5lY3Rpb25zIGFzIGF1dGhlbnRpY2F0aW9uIGZhaWxzIG9uIEluc3RhbmNlICgxKS4KKyAgICAgICAgICAgICAgICBPdXRib3VuZENvbm5lY3Rpb25zIG91dGJvdW5kID0gZ2V0T25seUVsZW1lbnQoTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLmNoYW5uZWxNYW5hZ2Vycy52YWx1ZXMoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSghb3V0Ym91bmQuc21hbGwuaXNDb25uZWN0ZWQoKSAmJiAhb3V0Ym91bmQubGFyZ2UuaXNDb25uZWN0ZWQoKSAmJiAhb3V0Ym91bmQudXJnZW50LmlzQ29ubmVjdGVkKCkpOworCisgICAgICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgdGhlIGZhaWx1cmUgaXMgZHVlIHRvIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUKKyAgICAgICAgICAgICAgICBmaW5hbCBSZWplY3RPdXRib3VuZEF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRvciA9IChSZWplY3RPdXRib3VuZEF1dGhlbnRpY2F0b3IpIERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbnRlcm5vZGVBdXRoZW50aWNhdG9yKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhdXRoZW50aWNhdG9yLmF1dGhlbnRpY2F0aW9uRmFpbGVkKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIGF1dGhlbnRpY2F0aW9uIHRvIGZhaWwKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLmxvZ3MoKS53YXRjaEZvcigiQXV0aGVudGljYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5ydW5Pbkluc3RhbmNlKHJ1bm5hYmxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE91dGJvdW5kQ29ubmVjdGlvbnNBcmVJbnRlcnJ1cHRlZFdoZW5BdXRoRmFpbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENsdXN0ZXIuQnVpbGRlciBidWlsZGVyID0gY3JlYXRlQ2x1c3RlcihBbGxvd0ZpcnN0QW5kUmVqZWN0T3RoZXJPdXRib3VuZEF1dGhlbnRpY2F0b3IuY2xhc3MpOworICAgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBidWlsZGVyLnN0YXJ0KCk7IENsb3NlYWJsZSBlcyA9IGV4ZWN1dG9yU2VydmljZTo6c2h1dGRvd24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZS5zdWJtaXQoKCkgLT4gb3BlbkNvbm5lY3Rpb25zKGNsdXN0ZXIpKTsKKworICAgICAgICAgICAgLy8gVmVyaWZ5IHRoYXQgYXV0aGVudGljYXRpb24gaXMgZmFpbGVkIGFuZCBJbnRlcnJ1cHQgaXMgY2FsbGVkIG9uIG91dGJvdW5kIGNvbm5lY3Rpb25zLgorICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubG9ncygpLndhdGNoRm9yKCJBdXRoZW50aWNhdGlvbiBmYWlsZWQgdG8iKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLmxvZ3MoKS53YXRjaEZvcigiSW50ZXJydXB0ZWQgb3V0Ym91bmQgY29ubmVjdGlvbnMgdG8iKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENoZWNrIGlmIG91dGJvdW5kIGNvbm5lY3Rpb25zIGFyZSB6ZXJvCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFNlcmlhbGl6YWJsZVJ1bm5hYmxlIHJ1bm5hYmxlID0gKCkgLT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBzdWNjZXNzZnVsIG91dGJvdW5kIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICBmaW5hbCBBbGxvd0ZpcnN0QW5kUmVqZWN0T3RoZXJPdXRib3VuZEF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRvciA9IChBbGxvd0ZpcnN0QW5kUmVqZWN0T3RoZXJPdXRib3VuZEF1dGhlbnRpY2F0b3IpIERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbnRlcm5vZGVBdXRoZW50aWNhdG9yKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGF1dGhlbnRpY2F0b3Iuc3VjY2Vzc2Z1bE91dGJvdW5kLmdldCgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGF1dGhlbnRpY2F0b3IuZmFpbGVkT3V0Ym91bmQuZ2V0KCkgPiAwKTsKKworICAgICAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBvdXRib3VuZCBjb25uZWN0aW9ucyBhcyBhdXRoZW50aWNhdGlvbiBmYWlscy4KKyAgICAgICAgICAgICAgICBPdXRib3VuZENvbm5lY3Rpb25zIG91dGJvdW5kID0gZ2V0T25seUVsZW1lbnQoTWVzc2FnaW5nU2VydmljZS5pbnN0YW5jZSgpLmNoYW5uZWxNYW5hZ2Vycy52YWx1ZXMoKSk7CisgICAgICAgICAgICAgICAgQXdhaXRpbGl0eS5hd2FpdCgpLnVudGlsKCgpIC0+ICFvdXRib3VuZC5zbWFsbC5pc0Nvbm5lY3RlZCgpICYmICFvdXRib3VuZC5sYXJnZS5pc0Nvbm5lY3RlZCgpICYmICFvdXRib3VuZC51cmdlbnQuaXNDb25uZWN0ZWQoKSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkucnVuT25JbnN0YW5jZShydW5uYWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uc0FyZUFjY2VwdGVkV2hlbkF1dGhTdWNjZWRzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB2ZXJpZnlBdXRoZW50aWNhdGlvblN1Y2NlZWRzKEFsbG93QWxsSW50ZXJub2RlQXV0aGVudGljYXRvci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aGVudGljYXRpb25XaXRoQ2VydGlmaWNhdGVBdXRoZW50aWNhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB2ZXJpZnlBdXRoZW50aWNhdGlvblN1Y2NlZWRzKENlcnRpZmljYXRlVmVyaWZ5QXV0aGVudGljYXRvci5jbGFzcyk7CisgICAgfQorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbnNBcmVSZWplY3RlZFdpdGhJbnZhbGlkQ29uZmlnKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKQEAgLTQ5LDE2ICsxNzQsMTggQEAKICAgICAgICAgICAgICAgICBjLndpdGgoRmVhdHVyZS5ORVRXT1JLKTsKICAgICAgICAgICAgICAgICBjLndpdGgoRmVhdHVyZS5OQVRJVkVfUFJPVE9DT0wpOwogCisgICAgICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZW5jcnlwdGlvbiA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgICAgICBlbmNyeXB0aW9uLnB1dCgib3B0aW9uYWwiLCAiZmFsc2UiKTsKKyAgICAgICAgICAgICAgICBlbmNyeXB0aW9uLnB1dCgiaW50ZXJub2RlX2VuY3J5cHRpb24iLCAibm9uZSIpOwogICAgICAgICAgICAgICAgIGlmIChjLm51bSgpID09IDEpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBlbmNyeXB0aW9uID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uLnB1dCgia2V5c3RvcmUiLCAidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC5rZXlzdG9yZSIpOwogICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uLnB1dCgia2V5c3RvcmVfcGFzc3dvcmQiLCAiY2Fzc2FuZHJhIik7CiAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb24ucHV0KCJ0cnVzdHN0b3JlIiwgInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3QudHJ1c3RzdG9yZSIpOwogICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uLnB1dCgidHJ1c3RzdG9yZV9wYXNzd29yZCIsICJjYXNzYW5kcmEiKTsKLSAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbi5wdXQoImludGVybm9kZV9lbmNyeXB0aW9uIiwgImRjIik7Ci0gICAgICAgICAgICAgICAgICAgIGMuc2V0KCJzZXJ2ZXJfZW5jcnlwdGlvbl9vcHRpb25zIiwgZW5jcnlwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb24ucHV0KCJpbnRlcm5vZGVfZW5jcnlwdGlvbiIsICJhbGwiKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYy5zZXQoInNlcnZlcl9lbmNyeXB0aW9uX29wdGlvbnMiLCBlbmNyeXB0aW9uKTsKICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAud2l0aE5vZGVJZFRvcG9sb2d5KEltbXV0YWJsZU1hcC5vZigxLCBOZXR3b3JrVG9wb2xvZ3kuZGNBbmRSYWNrKCJkYzEiLCAicjFhIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCBOZXR3b3JrVG9wb2xvZ3kuZGNBbmRSYWNrKCJkYzIiLCAicjJhIikpKTsKQEAgLTE1Myw0ICsyODAsMTY0IEBACiAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgS0VZU1BBQ0UgdGVzdF9jb25uZWN0aW9uc19mcm9tXzIgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSVRIIHJlcGxpY2F0aW9uID0geydjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InOiAyfTsiLCBmYWxzZSwgY2x1c3Rlci5nZXQoMikpOwogICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlBdXRoZW50aWNhdGlvblN1Y2NlZWRzKGZpbmFsIENsYXNzIGF1dGhlbnRpY2F0b3JDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBDbHVzdGVyLkJ1aWxkZXIgYnVpbGRlciA9IGNyZWF0ZUNsdXN0ZXIoYXV0aGVudGljYXRvckNsYXNzKTsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBidWlsZGVyLnN0YXJ0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9wZW5Db25uZWN0aW9ucyhjbHVzdGVyKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGluc3RhbmNlICgxKSBzaG91bGQgY29ubmVjdCB0byBpbnN0YW5jZSAoMikgd2l0aG91dCBhbnkgaXNzdWVzOworICAgICAgICAgICAgICogaW5zdGFuY2UgKDIpIHNob3VsZCBjb25uZWN0IHRvIGluc3RhbmNlICgxKSB3aXRob3V0IGFueSBpc3N1ZXMuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgU2VyaWFsaXphYmxlUnVubmFibGUgcnVubmFibGUgPSAoKSAtPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBiZSBpbmJvdW5kIGNvbm5lY3Rpb25zIGFzIGF1dGhlbnRpY2F0aW9uIHN1Y2NlZWRzLgorICAgICAgICAgICAgICAgIEluYm91bmRNZXNzYWdlSGFuZGxlcnMgaW5ib3VuZCA9IGdldE9ubHlFbGVtZW50KE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5tZXNzYWdlSGFuZGxlcnMudmFsdWVzKCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoaW5ib3VuZC5jb3VudCgpID4gMCk7CisKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgb3V0Ym91bmQgY29ubmVjdGlvbnMgYXMgYXV0aGVudGljYXRpb24gc3VjY2VlZHMuCisgICAgICAgICAgICAgICAgT3V0Ym91bmRDb25uZWN0aW9ucyBvdXRib3VuZCA9IGdldE9ubHlFbGVtZW50KE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5jaGFubmVsTWFuYWdlcnMudmFsdWVzKCkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUob3V0Ym91bmQuc21hbGwuaXNDb25uZWN0ZWQoKSB8fCBvdXRib3VuZC5sYXJnZS5pc0Nvbm5lY3RlZCgpIHx8IG91dGJvdW5kLnVyZ2VudC5pc0Nvbm5lY3RlZCgpKTsKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLnJ1bk9uSW5zdGFuY2UocnVubmFibGUpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMikucnVuT25JbnN0YW5jZShydW5uYWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENsdXN0ZXIuQnVpbGRlciBjcmVhdGVDbHVzdGVyKGZpbmFsIENsYXNzIGF1dGhlbnRpY2F0b3JDbGFzcykKKyAgICB7CisgICAgICAgIHJldHVybiBidWlsZGVyKCkKKyAgICAgICAgLndpdGhOb2RlcygyKQorICAgICAgICAud2l0aENvbmZpZyhjIC0+CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMud2l0aChGZWF0dXJlLk5FVFdPUkspOworICAgICAgICAgICAgICAgICAgICAgICAgYy53aXRoKEZlYXR1cmUuTkFUSVZFX1BST1RPQ09MKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZW5jcnlwdGlvbiA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb24ucHV0KCJrZXlzdG9yZSIsICJ0ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LmtleXN0b3JlIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uLnB1dCgia2V5c3RvcmVfcGFzc3dvcmQiLCAiY2Fzc2FuZHJhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uLnB1dCgidHJ1c3RzdG9yZSIsICJ0ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LnRydXN0c3RvcmUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb24ucHV0KCJ0cnVzdHN0b3JlX3Bhc3N3b3JkIiwgImNhc3NhbmRyYSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbi5wdXQoImludGVybm9kZV9lbmNyeXB0aW9uIiwgImFsbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbi5wdXQoInJlcXVpcmVfY2xpZW50X2F1dGgiLCAidHJ1ZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYy5zZXQoInNlcnZlcl9lbmNyeXB0aW9uX29wdGlvbnMiLCBlbmNyeXB0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLm51bSgpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5zZXQoImludGVybm9kZV9hdXRoZW50aWNhdG9yIiwgYXV0aGVudGljYXRvckNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5zZXQoImludGVybm9kZV9hdXRoZW50aWNhdG9yIiwgQWxsb3dBbGxJbnRlcm5vZGVBdXRoZW50aWNhdG9yLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgIC53aXRoTm9kZUlkVG9wb2xvZ3koSW1tdXRhYmxlTWFwLm9mKDEsIE5ldHdvcmtUb3BvbG9neS5kY0FuZFJhY2soImRjMSIsICJyMWEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgTmV0d29ya1RvcG9sb2d5LmRjQW5kUmFjaygiZGMyIiwgInIyYSIpKSk7CisgICAgfQorCisgICAgLy8gQXV0aGVudGljYXRvciB0aGF0IHZhbGlkYXRlcyBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2VydGlmaWNhdGVWZXJpZnlBdXRoZW50aWNhdG9yIGltcGxlbWVudHMgSUludGVybm9kZUF1dGhlbnRpY2F0b3IKKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoSW5ldEFkZHJlc3MgcmVtb3RlQWRkcmVzcywgaW50IHJlbW90ZVBvcnQsIENlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzLCBJbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uIGNvbm5lY3Rpb25UeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29ubmVjdGlvblR5cGUgPT0gSW50ZXJub2RlQ29ubmVjdGlvbkRpcmVjdGlvbi5PVVRCT1VORF9QUkVDT05ORUNUKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByZXNlbnRlZCBjZXJ0aWZpY2F0ZXMgZHVyaW5nIGludGVybm9kZSBhdXRoZW50aWNhdGlvbiBhcmUgdGhlIG9uZXMgaW4gdGhlIGtleXN0b3JlcworICAgICAgICAgICAgICAgIC8vIGNvbmZpZ3VyZWQgaW4gdGhlIGNhc3NhbmRyYS55YW1sIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgS2V5U3RvcmUga2V5U3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgiSktTIik7CisgICAgICAgICAgICAgICAgY2hhcltdIGtleVN0b3JlUGFzc3dvcmQgPSAiY2Fzc2FuZHJhIi50b0NoYXJBcnJheSgpOworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGtleVN0b3JlRGF0YSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Qua2V5c3RvcmUiKTsKKyAgICAgICAgICAgICAgICBrZXlTdG9yZS5sb2FkKGtleVN0b3JlRGF0YSwga2V5U3RvcmVQYXNzd29yZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNlcnRpZmljYXRlcyAhPSBudWxsICYmIGNlcnRpZmljYXRlcy5sZW5ndGggIT0gMCAmJiBrZXlTdG9yZS5nZXRDZXJ0aWZpY2F0ZSgiY2Fzc2FuZHJhX3NzbF90ZXN0IikuZXF1YWxzKGNlcnRpZmljYXRlc1swXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlQ29uZmlndXJhdGlvbigpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCisgICAgICAgIHsKKworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWplY3RDb25uZWN0aW9uc0F1dGhlbnRpY2F0b3IgaW1wbGVtZW50cyBJSW50ZXJub2RlQXV0aGVudGljYXRvcgorICAgIHsKKyAgICAgICAgYm9vbGVhbiBhdXRoZW50aWNhdGlvbkZhaWxlZCA9IGZhbHNlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoSW5ldEFkZHJlc3MgcmVtb3RlQWRkcmVzcywgaW50IHJlbW90ZVBvcnQsIENlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzLCBJbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uIGNvbm5lY3Rpb25UeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBhdXRoZW50aWNhdGlvbkZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVDb25maWd1cmF0aW9uKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICAgICAgeworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlamVjdEluYm91bmRDb25uZWN0aW9ucyBleHRlbmRzIFJlamVjdENvbm5lY3Rpb25zQXV0aGVudGljYXRvcgorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShJbmV0QWRkcmVzcyByZW1vdGVBZGRyZXNzLCBpbnQgcmVtb3RlUG9ydCwgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMsIEludGVybm9kZUNvbm5lY3Rpb25EaXJlY3Rpb24gY29ubmVjdGlvblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb25uZWN0aW9uVHlwZSA9PSBJbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uLklOQk9VTkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmF1dGhlbnRpY2F0ZShyZW1vdGVBZGRyZXNzLCByZW1vdGVQb3J0LCBjZXJ0aWZpY2F0ZXMsIGNvbm5lY3Rpb25UeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWplY3RPdXRib3VuZEF1dGhlbnRpY2F0b3IgZXh0ZW5kcyBSZWplY3RDb25uZWN0aW9uc0F1dGhlbnRpY2F0b3IKKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoSW5ldEFkZHJlc3MgcmVtb3RlQWRkcmVzcywgaW50IHJlbW90ZVBvcnQsIENlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzLCBJbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uIGNvbm5lY3Rpb25UeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY29ubmVjdGlvblR5cGUgPT0gSW50ZXJub2RlQ29ubmVjdGlvbkRpcmVjdGlvbi5PVVRCT1VORCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuYXV0aGVudGljYXRlKHJlbW90ZUFkZHJlc3MsIHJlbW90ZVBvcnQsIGNlcnRpZmljYXRlcywgY29ubmVjdGlvblR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFsbG93Rmlyc3RBbmRSZWplY3RPdGhlck91dGJvdW5kQXV0aGVudGljYXRvciBleHRlbmRzIFJlamVjdE91dGJvdW5kQXV0aGVudGljYXRvcgorICAgIHsKKyAgICAgICAgQXRvbWljSW50ZWdlciBzdWNjZXNzZnVsT3V0Ym91bmQgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICAgICAgICBBdG9taWNJbnRlZ2VyIGZhaWxlZE91dGJvdW5kID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlKEluZXRBZGRyZXNzIHJlbW90ZUFkZHJlc3MsIGludCByZW1vdGVQb3J0LCBDZXJ0aWZpY2F0ZVtdIGNlcnRpZmljYXRlcywgSW50ZXJub2RlQ29ubmVjdGlvbkRpcmVjdGlvbiBjb25uZWN0aW9uVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb25UeXBlID09IEludGVybm9kZUNvbm5lY3Rpb25EaXJlY3Rpb24uT1VUQk9VTkQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3NmdWxPdXRib3VuZC5jb21wYXJlQW5kU2V0KDAsIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZhaWxlZE91dGJvdW5kLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbkZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9KVk1EVGVzdFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9KVk1EVGVzdFRlc3QuamF2YQppbmRleCAwODlkMTdiLi5mMTFhZDE2IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvSlZNRFRlc3RUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0pWTURUZXN0VGVzdC5qYXZhCkBAIC05NSw2ICs5NSwxNiBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQganZtQXJndW1lbnRMb2dnaW5nVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBDbHVzdGVyLmJ1aWxkKDEpLnN0YXJ0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIExvZ0FjdGlvbiBsb2dzID0gY2x1c3Rlci5nZXQoMSkubG9ncygpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGxvZ3MuZ3JlcCgiSlZNIEFyZ3VtZW50cyIpLmdldFJlc3VsdCgpKS5pc05vdEVtcHR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIG5vblNoYXJlZENvbmZpZ0NsYXNzVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgTWFwPFN0cmluZyxPYmplY3Q+IGNvbW1pdExvZ0NvbXByZXNzaW9uID0gSW1tdXRhYmxlTWFwLm9mKCJjbGFzc19uYW1lIiwgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkxaNENvbXByZXNzb3IiLApkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0pWTVN0YWJpbGl0eUluc3BlY3RvclRocm93YWJsZVRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9KVk1TdGFiaWxpdHlJbnNwZWN0b3JUaHJvd2FibGVUZXN0LmphdmEKaW5kZXggNjY1ZDU4Yy4uYjYzMTc5YiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L0pWTVN0YWJpbGl0eUluc3BlY3RvclRocm93YWJsZVRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvSlZNU3RhYmlsaXR5SW5zcGVjdG9yVGhyb3dhYmxlVGVzdC5qYXZhCkBAIC0zNCw3ICszNCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2VzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CkBAIC00OCwxMCArNDcsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNSZWFkRXJyb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkZvcndhcmRpbmdTU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2Fzc2FuZHJhRGFlbW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKQEAgLTIzMSwyMiArMjI5LDE0IEBACiAgICAgICAgICAgICB0aHJvdyB0aHJvd0ZTRXJyb3IoKTsKICAgICAgICAgfQogCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd0l0ZXJhdG9yKEZpbGVEYXRhSW5wdXQgZmlsZSwgRGVjb3JhdGVkS2V5IGtleSwgUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5LCBTbGljZXMgc2xpY2VzLCBDb2x1bW5GaWx0ZXIgc2VsZWN0ZWRDb2x1bW5zLCBib29sZWFuIHJldmVyc2VkKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkVGhyb3dDb3JydXB0ZWQpCi0gICAgICAgICAgICAgICAgdGhyb3cgdGhyb3dDb3JydXB0ZWQoKTsKLSAgICAgICAgICAgIHRocm93IHRocm93RlNFcnJvcigpOwotICAgICAgICB9Ci0KICAgICAgICAgcHJpdmF0ZSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0aHJvd0NvcnJ1cHRlZCgpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbihuZXcgSU9FeGNlcHRpb24oImZhaWxlZCB0byBnZXQgcG9zaXRpb24iKSwgZGVzY3JpcHRvci5iYXNlRmlsZW5hbWUoKSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24obmV3IElPRXhjZXB0aW9uKCJmYWlsZWQgdG8gZ2V0IHBvc2l0aW9uIiksIGRlc2NyaXB0b3IuYmFzZUZpbGUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICBwcml2YXRlIEZTRXJyb3IgdGhyb3dGU0Vycm9yKCkKICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZTUmVhZEVycm9yKG5ldyBJT0V4Y2VwdGlvbigiZmFpbGVkIHRvIGdldCBwb3NpdGlvbiIpLCBkZXNjcmlwdG9yLmJhc2VGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBGU1JlYWRFcnJvcihuZXcgSU9FeGNlcHRpb24oImZhaWxlZCB0byBnZXQgcG9zaXRpb24iKSwgZGVzY3JpcHRvci5iYXNlRmlsZSgpKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9NZXNzYWdlRm9yd2FyZGluZ1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9NZXNzYWdlRm9yd2FyZGluZ1Rlc3QuamF2YQppbmRleCBhNGRkOGU2Li43MDA2Nzk1IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTWVzc2FnZUZvcndhcmRpbmdUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L01lc3NhZ2VGb3J3YXJkaW5nVGVzdC5qYXZhCkBAIC0zOSw4ICszOSwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuaW1wbC5Jc29sYXRlZEV4ZWN1dG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmltcGwuVHJhY2luZ1V0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuV0FJVF9GT1JfVFJBQ0lOR19FVkVOVFNfVElNRU9VVF9TRUNTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwogCiBwdWJsaWMgY2xhc3MgTWVzc2FnZUZvcndhcmRpbmdUZXN0IGV4dGVuZHMgVGVzdEJhc2VJbXBsCkBAIC00OCwxNSArNTAsMTYgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIG11dGF0aW9uc0ZvcndhcmRlZFRvQWxsUmVwbGljYXNUZXN0KCkKICAgICB7Ci0gICAgICAgIFN0cmluZyBvcmlnaW5hbFRyYWNlVGltZW91dCA9IFRyYWNpbmdVdGlsLnNldFdhaXRGb3JUcmFjaW5nRXZlbnRUaW1lb3V0U2VjcygiMSIpOwogICAgICAgICBmaW5hbCBpbnQgbnVtSW5zZXJ0cyA9IDEwMDsKICAgICAgICAgTWFwPEluZXRBZGRyZXNzLCBJbnRlZ2VyPiBmb3J3YXJkRnJvbUNvdW50cyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgTWFwPEluZXRBZGRyZXNzLCBJbnRlZ2VyPiBjb21taXRDb3VudHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKLSAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSAoQ2x1c3RlcikgaW5pdChidWlsZGVyKCkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KFdBSVRfRk9SX1RSQUNJTkdfRVZFTlRTX1RJTUVPVVRfU0VDUywgMSk7CisgICAgICAgICAgICAgQ2x1c3RlciBjbHVzdGVyID0gKENsdXN0ZXIpIGluaXQoYnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhEQygiZGMwIiwgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aERDKCJkYzEiLCAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSk7CisgICAgICAgICAgICAgKQogICAgICAgICB7CiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQ1JFQVRFIFRBQkxFICIgKyBLRVlTUEFDRSArICIudGJsIChwayBpbnQsIGNrIGludCwgdiB0ZXh0LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKIApAQCAtMTE1LDkgKzExOCw1IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJUaHJldyBleGNlcHRpb246ICIgKyBlKTsKICAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFRyYWNpbmdVdGlsLnNldFdhaXRGb3JUcmFjaW5nRXZlbnRUaW1lb3V0U2VjcyhvcmlnaW5hbFRyYWNlVGltZW91dCk7Ci0gICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTWlncmF0aW9uQ29vcmRpbmF0b3JUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTWlncmF0aW9uQ29vcmRpbmF0b3JUZXN0LmphdmEKaW5kZXggY2E4OWI0My4uZTc1NzgzZCAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L01pZ3JhdGlvbkNvb3JkaW5hdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9NaWdyYXRpb25Db29yZGluYXRvclRlc3QuamF2YQpAQCAtMzAsOCArMzAsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuTmV0d29ya1RvcG9sb2d5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT05TSVNURU5UX1JBTkdFX01PVkVNRU5UOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLklHTk9SRURfU0NIRU1BX0NIRUNLX0VORFBPSU5UUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JR05PUkVEX1NDSEVNQV9DSEVDS19WRVJTSU9OUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVBMQUNFX0FERFJFU1M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLkdPU1NJUDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkVUV09SSzsKIApAQCAtNDEsMTEgKzQzLDkgQEAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImNhc3NhbmRyYS5yZXBsYWNlX2FkZHJlc3MiKTsKLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImNhc3NhbmRyYS5jb25zaXN0ZW50LnJhbmdlbW92ZW1lbnQiKTsKLQotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShJR05PUkVEX1NDSEVNQV9DSEVDS19WRVJTSU9OUy5nZXRLZXkoKSk7Ci0gICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KElHTk9SRURfU0NIRU1BX0NIRUNLX1ZFUlNJT05TLmdldEtleSgpKTsKKyAgICAgICAgUkVQTEFDRV9BRERSRVNTLmNsZWFyVmFsdWUoKTsgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdjbGVhclZhbHVlU3lzdGVtUHJvcGVydHlVc2FnZScKKyAgICAgICAgQ09OU0lTVEVOVF9SQU5HRV9NT1ZFTUVOVC5jbGVhclZhbHVlKCk7IC8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnY2xlYXJWYWx1ZVN5c3RlbVByb3BlcnR5VXNhZ2UnCisgICAgICAgIElHTk9SRURfU0NIRU1BX0NIRUNLX1ZFUlNJT05TLmNsZWFyVmFsdWUoKTsgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdjbGVhclZhbHVlU3lzdGVtUHJvcGVydHlVc2FnZScKICAgICB9CiAgICAgLyoqCiAgICAgICogV2Ugc2hvdWxkbid0IHdhaXQgb24gdmVyc2lvbnMgb25seSBhdmFpbGFibGUgZnJvbSBhIG5vZGUgYmVpbmcgcmVwbGFjZWQKQEAgLTY3LDcgKzY3LDcgQEAKIAogICAgICAgICAgICAgSUluc3RhbmNlQ29uZmlnIGNvbmZpZyA9IGNsdXN0ZXIubmV3SW5zdGFuY2VDb25maWcoKTsKICAgICAgICAgICAgIGNvbmZpZy5zZXQoImF1dG9fYm9vdHN0cmFwIiwgdHJ1ZSk7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5yZXBsYWNlX2FkZHJlc3MiLCByZXBsYWNlbWVudEFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSk7CisgICAgICAgICAgICBSRVBMQUNFX0FERFJFU1Muc2V0U3RyaW5nKHJlcGxhY2VtZW50QWRkcmVzcy5nZXRIb3N0QWRkcmVzcygpKTsKICAgICAgICAgICAgIGNsdXN0ZXIuYm9vdHN0cmFwKGNvbmZpZykuc3RhcnR1cCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtODksNyArODksNyBAQAogICAgICAgICAgICAgSUluc3RhbmNlQ29uZmlnIGNvbmZpZyA9IGNsdXN0ZXIubmV3SW5zdGFuY2VDb25maWcoKTsKICAgICAgICAgICAgIGNvbmZpZy5zZXQoImF1dG9fYm9vdHN0cmFwIiwgdHJ1ZSk7CiAgICAgICAgICAgICBJR05PUkVEX1NDSEVNQV9DSEVDS19FTkRQT0lOVFMuc2V0U3RyaW5nKGlnbm9yZWRFbmRwb2ludC5nZXRIb3N0QWRkcmVzcygpKTsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbnNpc3RlbnQucmFuZ2Vtb3ZlbWVudCIsICJmYWxzZSIpOworICAgICAgICAgICAgQ09OU0lTVEVOVF9SQU5HRV9NT1ZFTUVOVC5zZXRCb29sZWFuKGZhbHNlKTsKICAgICAgICAgICAgIGNsdXN0ZXIuYm9vdHN0cmFwKGNvbmZpZykuc3RhcnR1cCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgICAgICAgICBJSW5zdGFuY2VDb25maWcgY29uZmlnID0gY2x1c3Rlci5uZXdJbnN0YW5jZUNvbmZpZygpOwogICAgICAgICAgICAgY29uZmlnLnNldCgiYXV0b19ib290c3RyYXAiLCB0cnVlKTsKICAgICAgICAgICAgIElHTk9SRURfU0NIRU1BX0NIRUNLX1ZFUlNJT05TLnNldFN0cmluZyhpbml0aWFsVmVyc2lvbi50b1N0cmluZygpICsgJywnICsgb2xkVmVyc2lvbik7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25zaXN0ZW50LnJhbmdlbW92ZW1lbnQiLCAiZmFsc2UiKTsKKyAgICAgICAgICAgIENPTlNJU1RFTlRfUkFOR0VfTU9WRU1FTlQuc2V0Qm9vbGVhbihmYWxzZSk7CiAgICAgICAgICAgICBjbHVzdGVyLmJvb3RzdHJhcChjb25maWcpLnN0YXJ0dXAoKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Nb3ZlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L01vdmVUZXN0LmphdmEKaW5kZXggZmMxYmNhMy4uY2RiZTFjZCAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L01vdmVUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L01vdmVUZXN0LmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuTm9kZVRvb2xSZXN1bHQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlJJTkdfREVMQVk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLkdPU1NJUDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkVUV09SSzsKIApAQCAtNDIsNyArNDMsNyBAQAogCiAgICAgc3RhdGljCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5yaW5nX2RlbGF5X21zIiwgIjUwMDAiKTsgLy8gZG93biBmcm9tIDMwcyBkZWZhdWx0CisgICAgICAgIFJJTkdfREVMQVkuc2V0TG9uZyg1MDAwKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgbW92ZShib29sZWFuIGZvcndhcmRzKSB0aHJvd3MgVGhyb3dhYmxlCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTXVsdGlwbGVEYXRhRGlyZWN0b3J5VGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L011bHRpcGxlRGF0YURpcmVjdG9yeVRlc3QuamF2YQppbmRleCAwODI2OTU0Li4zMDQxMzZiIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTXVsdGlwbGVEYXRhRGlyZWN0b3J5VGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9NdWx0aXBsZURhdGFEaXJlY3RvcnlUZXN0LmphdmEKQEAgLTM3LDYgKzM3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5UT0NDb21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogCiBwdWJsaWMgY2xhc3MgTXVsdGlwbGVEYXRhRGlyZWN0b3J5VGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbApAQCAtMTUxLDE0ICsxNTIsMTQgQEAKICAgICAgICAgICAgIC8vIGdldHRpbmcgYSBuZXcgZmlsZSBpbmRleCBpbiBvcmRlciB0byBtb3ZlIFNTVGFibGUgYmV0d2VlbiBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgIHNlY29uZCA9IGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihzZWNvbmQuZGlyZWN0b3J5KTsKICAgICAgICAgICAgIC8vIG5vdyB3ZSBqdXN0IG1vdmUgYWxsIHNzdGFibGVzIGZyb20gZmlyc3QgdG8gc2Vjb25kCi0gICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBTU1RhYmxlUmVhZGVyLmNvbXBvbmVudHNGb3IoZmlyc3QpKQorICAgICAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogVE9DQ29tcG9uZW50LmxvYWRPckNyZWF0ZShmaXJzdCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlyc3QuZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gZmlyc3QuZmlsZUZvcihjb21wb25lbnQpOwogICAgICAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzLmNvcHkoZmlsZS50b1BhdGgoKSwgbmV3IEZpbGUoc2Vjb25kLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpLnRvUGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzLmNvcHkoZmlsZS50b1BhdGgoKSwgc2Vjb25kLmZpbGVGb3IoY29tcG9uZW50KS50b1BhdGgoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9OYXRpdmVNaXhlZFZlcnNpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTmF0aXZlTWl4ZWRWZXJzaW9uVGVzdC5qYXZhCmluZGV4IDI2ZDAxODYuLjI5NjA1ZjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9OYXRpdmVNaXhlZFZlcnNpb25UZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L05hdGl2ZU1peGVkVmVyc2lvblRlc3QuamF2YQpAQCAtMzAsOCArMzAsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW52b2thYmxlSW5zdGFuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JT19ORVRUWV9FVkVOVExPT1BfVEhSRUFEUzsKKwogcHVibGljIGNsYXNzIE5hdGl2ZU1peGVkVmVyc2lvblRlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwKIHsKICAgICBAVGVzdApAQCAtMzksMTUgKzQyLDE3IEBACiAgICAgewogICAgICAgICAvLyBtYWtlIHN1cmUgdG8gbGltaXQgdGhlIG5ldHR5IHRocmVhZCBwb29sIHRvIHNpemUgMSwgdGhpcyB3aWxsIG1ha2UgdGhlIHRlc3QgZGV0ZXJtYW5pc3RpYyBhcyBhbGwgd29yawogICAgICAgICAvLyB3aWxsIGhhcHBlbiBvbiB0aGUgc2luZ2xlIHRocmVhZC4KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJpby5uZXR0eS5ldmVudExvb3BUaHJlYWRzIiwgIjEiKTsKLSAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBDbHVzdGVyLmJ1aWxkKDEpCisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChJT19ORVRUWV9FVkVOVExPT1BfVEhSRUFEUywgMSk7CisgICAgICAgICAgICAgQ2x1c3RlciBjbHVzdGVyID0gQ2x1c3Rlci5idWlsZCgxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjIC0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMud2l0aChGZWF0dXJlLnZhbHVlcygpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgicmVhZF90aHJlc2hvbGRzX2VuYWJsZWQiLCB0cnVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgibG9jYWxfcmVhZF9zaXplX3dhcm5fdGhyZXNob2xkIiwgIjFLaUIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKTsKKyAgICAgICAgICAgICApCiAgICAgICAgIHsKKwogICAgICAgICAgICAgaW5pdChjbHVzdGVyKTsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRibCAocGsgaW50LCBjazEgaW50LCB2YWx1ZSBibG9iLCBQUklNQVJZIEtFWSAocGssIGNrMSkpIikpOwogICAgICAgICAgICAgSUludm9rYWJsZUluc3RhbmNlIG5vZGUgPSBjbHVzdGVyLmdldCgxKTsKQEAgLTc4LDkgKzgzLDUgQEAKICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBub2RlLmxvZ3MoKS5ncmVwKCJXYXJuaW5ncyBwcmVzZW50IGluIG1lc3NhZ2Ugd2l0aCB2ZXJzaW9uIGxlc3MgdGhhbiIpLmdldFJlc3VsdCgpOwogICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHJlc3VsdCkuaXNFbXB0eSgpOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImlvLm5ldHR5LmV2ZW50TG9vcFRocmVhZHMiKTsKLSAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9OYXRpdmVQcm90b2NvbFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9OYXRpdmVQcm90b2NvbFRlc3QuamF2YQppbmRleCBmOTY1NTcyLi4xMWJhOTk0IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTmF0aXZlUHJvdG9jb2xUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L05hdGl2ZVByb3RvY29sVGVzdC5qYXZhCkBAIC0zNCw2ICszNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklDbHVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmltcGwuUm93VXRpbDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpPSU5fUklORzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYWN0aW9uLkdvc3NpcEhlbHBlci53aXRoUHJvcGVydHk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLkdPU1NJUDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkFUSVZFX1BST1RPQ09MOwpAQCAtMTAzLDcgKzEwNCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIElJbnN0YW5jZUNvbmZpZyBjb25maWcgPSBjbHVzdGVyLm5ld0luc3RhbmNlQ29uZmlnKCk7CiAgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgZ29zc2lwcGluZ09ubHlNZW1iZXIgPSBjbHVzdGVyLmJvb3RzdHJhcChjb25maWcpOwotICAgICAgICAgICAgd2l0aFByb3BlcnR5KCJjYXNzYW5kcmEuam9pbl9yaW5nIiwgQm9vbGVhbi50b1N0cmluZyhmYWxzZSksICgpIC0+IGdvc3NpcHBpbmdPbmx5TWVtYmVyLnN0YXJ0dXAoY2x1c3RlcikpOworICAgICAgICAgICAgd2l0aFByb3BlcnR5KEpPSU5fUklORywgZmFsc2UsICgpIC0+IGdvc3NpcHBpbmdPbmx5TWVtYmVyLnN0YXJ0dXAoY2x1c3RlcikpOwogCiAgICAgICAgICAgICBhc3NlcnRUcnVlKGdvc3NpcHBpbmdPbmx5TWVtYmVyLmNhbGxPbkluc3RhbmNlKChJSXNvbGF0ZWRFeGVjdXRvci5TZXJpYWxpemFibGVDYWxsYWJsZTxCb29sZWFuPikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaXNOYXRpdmVUcmFuc3BvcnRSdW5uaW5nKCkpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9OYXRpdmVUcmFuc3BvcnRFbmNyeXB0aW9uT3B0aW9uc1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9OYXRpdmVUcmFuc3BvcnRFbmNyeXB0aW9uT3B0aW9uc1Rlc3QuamF2YQppbmRleCBjNWE4MTBjLi41ZjJjYWFmIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTmF0aXZlVHJhbnNwb3J0RW5jcnlwdGlvbk9wdGlvbnNUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L05hdGl2ZVRyYW5zcG9ydEVuY3J5cHRpb25PcHRpb25zVGVzdC5qYXZhCkBAIC0xOCwxOCArMTgsMzMgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0OwogCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIAoraW1wb3J0IGphdmF4Lm5ldC5zc2wuS2V5TWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubmV0LnNzbC5UcnVzdE1hbmFnZXJGYWN0b3J5OworCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CiAKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU1NMT3B0aW9uczsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuZXhjZXB0aW9ucy5Ob0hvc3RBdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgY29tLmRhdGFzdGF4LnNoYWRlZC5uZXR0eS5oYW5kbGVyLnNzbC5Tc2xDb250ZXh0OworaW1wb3J0IGNvbS5kYXRhc3RheC5zaGFkZWQubmV0dHkuaGFuZGxlci5zc2wuU3NsQ29udGV4dEJ1aWxkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZTsKIAogcHVibGljIGNsYXNzIE5hdGl2ZVRyYW5zcG9ydEVuY3J5cHRpb25PcHRpb25zVGVzdCBleHRlbmRzIEFic3RyYWN0RW5jcnlwdGlvbk9wdGlvbnNJbXBsCiB7CisgICAgQFJ1bGUKKyAgICBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gZXhwZWN0ZWRFeGNlcHRpb24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIG5vZGVXaWxsTm90U3RhcnRXaXRoQmFkS2V5c3RvcmUoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewpAQCAtMjE5LDQgKzIzNCw5MCBAQAogICAgICAgICAgICAgYXNzZXJ0Q2Fubm90U3RhcnREdWVUb0NvbmZpZ3VyYXRpb25FeGNlcHRpb24oY2x1c3Rlcik7CiAgICAgICAgIH0KICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmRwb2ludFZlcmlmaWNhdGlvbkRpc2FibGVkSXBOb3RJblNBTigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIFdoZW4gcmVxdWlyZWRfZW5kcG9pbnRfdmVyaWZpY2F0aW9uIGlzIHNldCB0byBmYWxzZSwgY2xpZW50IGNlcnRpZmljYXRlIElwL2hvc3RuYW1lIHNob3VsZCBiZSB2YWxpZGF0ZWQKKyAgICAgICAgLy8gVGhlIGNlcnRpZmljYXRlIGluIGNhc3NhbmRyYV9zc2xfdGVzdF9vdXRib3VuZC5rZXlzdG9yZSBkb2VzIG5vdCBoYXZlIElQL2hvc3RuYW1lIGVtYmVkZWQsIHNvIHdoZW4KKyAgICAgICAgLy8gcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24gaXMgZmFsc2UsIHRoZSBjb25uZWN0aW9uIHNob3VsZCBiZSBlc3RhYmxpc2hlZAorICAgICAgIHRlc3RFbmRwb2ludFZlcmlmaWNhdGlvbihmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5kcG9pbnRWZXJpZmljYXRpb25FbmFibGVkSXBOb3RJblNBTigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIFdoZW4gcmVxdWlyZWRfZW5kcG9pbnRfdmVyaWZpY2F0aW9uIGlzIHNldCB0byB0cnVlLCBjbGllbnQgY2VydGlmaWNhdGUgSXAvaG9zdG5hbWUgc2hvdWxkIGJlIHZhbGlkYXRlZAorICAgICAgICAvLyBUaGUgY2VydGlmaWNhdGUgaW4gY2Fzc2FuZHJhX3NzbF90ZXN0X291dGJvdW5kLmtleXN0b3JlIGRvZXMgbm90IGhhdmUgSVAvaG9zdG5hbWUgZW1lYmVkZWQsIHNvIHdoZW4KKyAgICAgICAgLy8gcmVxdWlyZV9lbmRwb2ludF92ZXJpZmljYXRpb24gaXMgdHJ1ZSwgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZAorICAgICAgICB0ZXN0RW5kcG9pbnRWZXJpZmljYXRpb24odHJ1ZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuZHBvaW50VmVyaWZpY2F0aW9uRW5hYmxlZFdpdGhJUEluU2FuKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gV2hlbiByZXF1aXJlZF9lbmRwb2ludF92ZXJpZmljYXRpb24gaXMgc2V0IHRvIHRydWUsIGNsaWVudCBjZXJ0aWZpY2F0ZSBJcC9ob3N0bmFtZSBzaG91bGQgYmUgdmFsaWRhdGVkCisgICAgICAgIC8vIFRoZSBjZXJ0aWZpY2F0ZSBpbiBjYXNzYW5kcmFfc3NsX3Rlc3Rfb3V0Ym91bmQua2V5c3RvcmUgaGF2ZSBJUC9ob3N0bmFtZSBlbWViZWRlZCwgc28gd2hlbgorICAgICAgICAvLyByZXF1aXJlX2VuZHBvaW50X3ZlcmlmaWNhdGlvbiBpcyB0cnVlLCB0aGUgY29ubmVjdGlvbiBzaG91bGQgYmUgZXN0YWJsaXNoZWQKKyAgICAgICAgdGVzdEVuZHBvaW50VmVyaWZpY2F0aW9uKHRydWUsIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RW5kcG9pbnRWZXJpZmljYXRpb24oYm9vbGVhbiByZXF1aXJlRW5kcG9pbnRWZXJpZmljYXRpb24sIGJvb2xlYW4gaXBJblNBTikgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBidWlsZGVyKCkud2l0aE5vZGVzKDEpLndpdGhDb25maWcoYyAtPiB7CisgICAgICAgICAgICBjLndpdGgoRmVhdHVyZS5OQVRJVkVfUFJPVE9DT0wpOworICAgICAgICAgICAgYy5zZXQoImNsaWVudF9lbmNyeXB0aW9uX29wdGlvbnMiLAorICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlTWFwLmJ1aWxkZXIoKS5wdXRBbGwodmFsaWRLZXlzdG9yZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wdXQoImVuYWJsZWQiLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dCgicmVxdWlyZV9jbGllbnRfYXV0aCIsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHV0KCJyZXF1aXJlX2VuZHBvaW50X3ZlcmlmaWNhdGlvbiIsIHJlcXVpcmVFbmRwb2ludFZlcmlmaWNhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgfSkuc3RhcnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgSW5ldEFkZHJlc3MgYWRkcmVzcyA9IGNsdXN0ZXIuZ2V0KDEpLmNvbmZpZygpLmJyb2FkY2FzdEFkZHJlc3MoKS5nZXRBZGRyZXNzKCk7CisgICAgICAgICAgICBTc2xDb250ZXh0QnVpbGRlciBzc2xDb250ZXh0QnVpbGRlciA9IFNzbENvbnRleHRCdWlsZGVyLmZvckNsaWVudCgpOworICAgICAgICAgICAgaWYgKGlwSW5TQU4pCisgICAgICAgICAgICAgICAgc3NsQ29udGV4dEJ1aWxkZXIua2V5TWFuYWdlcihjcmVhdGVLZXlNYW5hZ2VyRmFjdG9yeSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdF9lbmRwb2ludF92ZXJpZnkua2V5c3RvcmUiLCAiY2Fzc2FuZHJhIikpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNzbENvbnRleHRCdWlsZGVyLmtleU1hbmFnZXIoY3JlYXRlS2V5TWFuYWdlckZhY3RvcnkoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Rfb3V0Ym91bmQua2V5c3RvcmUiLCAiY2Fzc2FuZHJhIikpOworCisgICAgICAgICAgICBTc2xDb250ZXh0IHNzbENvbnRleHQgPSBzc2xDb250ZXh0QnVpbGRlci50cnVzdE1hbmFnZXIoY3JlYXRlVHJ1c3RNYW5hZ2VyRmFjdG9yeSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC50cnVzdHN0b3JlIiwgImNhc3NhbmRyYSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIGZpbmFsIFNTTE9wdGlvbnMgc3NsT3B0aW9ucyA9IHNvY2tldENoYW5uZWwgLT4gc3NsQ29udGV4dC5uZXdIYW5kbGVyKHNvY2tldENoYW5uZWwuYWxsb2MoKSk7CisgICAgICAgICAgICBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ2x1c3RlciBkcml2ZXJDbHVzdGVyID0gY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXIuYnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29udGFjdFBvaW50KGFkZHJlc3MuZ2V0SG9zdEFkZHJlc3MoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NMKHNzbE9wdGlvbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgaWYgKCFpcEluU0FOKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkRXhjZXB0aW9uLmV4cGVjdChOb0hvc3RBdmFpbGFibGVFeGNlcHRpb24uY2xhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkcml2ZXJDbHVzdGVyLmNvbm5lY3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgS2V5TWFuYWdlckZhY3RvcnkgY3JlYXRlS2V5TWFuYWdlckZhY3RvcnkoZmluYWwgU3RyaW5nIGtleVN0b3JlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleVN0b3JlUGFzc3dvcmQpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oa2V5U3RvcmVQYXRoKTsKKyAgICAgICAgZmluYWwgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgiSktTIik7CisgICAgICAgIGtzLmxvYWQoc3RyZWFtLCBrZXlTdG9yZVBhc3N3b3JkLnRvQ2hhckFycmF5KCkpOworICAgICAgICBmaW5hbCBLZXlNYW5hZ2VyRmFjdG9yeSBrbWYgPSBLZXlNYW5hZ2VyRmFjdG9yeS5nZXRJbnN0YW5jZShLZXlNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCkpOworICAgICAgICBrbWYuaW5pdChrcywga2V5U3RvcmVQYXNzd29yZC50b0NoYXJBcnJheSgpKTsKKyAgICAgICAgcmV0dXJuIGttZjsKKyAgICB9CisKKyAgICBwcml2YXRlIFRydXN0TWFuYWdlckZhY3RvcnkgY3JlYXRlVHJ1c3RNYW5hZ2VyRmFjdG9yeShmaW5hbCBTdHJpbmcgdHJ1c3RTdG9yZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRydXN0U3RvcmVQYXNzd29yZCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0cnVzdFN0b3JlUGF0aCk7CisgICAgICAgIGZpbmFsIEtleVN0b3JlIHRzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoIkpLUyIpOworICAgICAgICB0cy5sb2FkKHN0cmVhbSwgdHJ1c3RTdG9yZVBhc3N3b3JkLnRvQ2hhckFycmF5KCkpOworICAgICAgICBmaW5hbCBUcnVzdE1hbmFnZXJGYWN0b3J5IHRtZiA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UoVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCkpOworICAgICAgICB0bWYuaW5pdCh0cyk7CisgICAgICAgIHJldHVybiB0bWY7CisgICAgfQorCiB9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTm9kZVRvb2xUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvTm9kZVRvb2xUZXN0LmphdmEKaW5kZXggOTA4N2Y5Ni4uMjRhNjVlMyAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L05vZGVUb29sVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Ob2RlVG9vbFRlc3QuamF2YQpAQCAtMTE2LDQgKzExNiwzNSBAQAogICAgICAgICAgICAgcmluZ1Jlc3VsdC5hc3NlcnRzKCkuc3RkZXJyQ29udGFpbnMoImlzIG5vdCBwZXJtaXR0ZWQgYXMgdGhpcyBjYWNoZSBpcyBkaXNhYmxlZCIpOwogICAgICAgICB9CiAgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mb091dHB1dCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeSAoSUNsdXN0ZXI8Pz4gY2x1c3RlciA9IGluaXQoYnVpbGRlcigpLndpdGhOb2RlcygxKS5zdGFydCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgTm9kZVRvb2xSZXN1bHQgcmluZ1Jlc3VsdCA9IGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJpbmZvIik7CisgICAgICAgICAgICByaW5nUmVzdWx0LmFzc2VydHMoKS5zdGRvdXRDb250YWlucygiSUQiKTsKKyAgICAgICAgICAgIHJpbmdSZXN1bHQuYXNzZXJ0cygpLnN0ZG91dENvbnRhaW5zKCJHb3NzaXAgYWN0aXZlIik7CisgICAgICAgICAgICByaW5nUmVzdWx0LmFzc2VydHMoKS5zdGRvdXRDb250YWlucygiTmF0aXZlIFRyYW5zcG9ydCBhY3RpdmUiKTsKKyAgICAgICAgICAgIHJpbmdSZXN1bHQuYXNzZXJ0cygpLnN0ZG91dENvbnRhaW5zKCJMb2FkIik7CisgICAgICAgICAgICByaW5nUmVzdWx0LmFzc2VydHMoKS5zdGRvdXRDb250YWlucygiVW5jb21wcmVzc2VkIGxvYWQiKTsKKyAgICAgICAgICAgIHJpbmdSZXN1bHQuYXNzZXJ0cygpLnN0ZG91dENvbnRhaW5zKCJHZW5lcmF0aW9uIik7CisgICAgICAgICAgICByaW5nUmVzdWx0LmFzc2VydHMoKS5zdGRvdXRDb250YWlucygiVXB0aW1lIik7CisgICAgICAgICAgICByaW5nUmVzdWx0LmFzc2VydHMoKS5zdGRvdXRDb250YWlucygiSGVhcCBNZW1vcnkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZlcnNpb25JbmNsdWRlc0dpdFNIQVdoZW5WZXJib3NlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgTk9ERS5ub2RldG9vbFJlc3VsdCgidmVyc2lvbiIpCisgICAgICAgICAgICAuYXNzZXJ0cygpCisgICAgICAgICAgICAuc3VjY2VzcygpCisgICAgICAgICAgICAuc3Rkb3V0Tm90Q29udGFpbnMoIkdpdFNIQToiKTsKKworICAgICAgICBOT0RFLm5vZGV0b29sUmVzdWx0KCJ2ZXJzaW9uIiwgIi0tdmVyYm9zZSIpCisgICAgICAgICAgICAuYXNzZXJ0cygpCisgICAgICAgICAgICAuc3VjY2VzcygpCisgICAgICAgICAgICAuc3Rkb3V0Q29udGFpbnMoIkdpdFNIQToiKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvT3ZlcnNpemVkTXV0YXRpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvT3ZlcnNpemVkTXV0YXRpb25UZXN0LmphdmEKaW5kZXggMmIwZDBhMC4uZmNkNjAwYyAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L092ZXJzaXplZE11dGF0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9PdmVyc2l6ZWRNdXRhdGlvblRlc3QuamF2YQpAQCAtMzYsNyArMzYsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50IChrZXkgaW50IFBSSU1BUlkgS0VZLCB2YWwgYmxvYikiKSk7CiAgICAgICAgICAgICBTdHJpbmcgcGF5bG9hZCA9IFN0cmluZ1V0aWxzLnJlcGVhdCgnMScsIDEwMjQgKiA0OSk7Ci0gICAgICAgICAgICBTdHJpbmcgcXVlcnkgPSAiSU5TRVJUIElOVE8gJXMudCAoa2V5LCB2YWwpIFZBTFVFUyAoMSwgdGV4dEFzQmxvYignIiArIHBheWxvYWQgKyAiJykpIjsKKyAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9ICJJTlNFUlQgSU5UTyAlcy50IChrZXksIHZhbCkgVkFMVUVTICgxLCB0ZXh0X2FzX2Jsb2IoJyIgKyBwYXlsb2FkICsgIicpKSI7CiAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKHF1ZXJ5KSwgQUxMKSkKICAgICAgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIlJlamVjdGVkIGFuIG92ZXJzaXplZCBtdXRhdGlvbiAoIikKICAgICAgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIi80OTE1MikgZm9yIGtleXNwYWNlOiBkaXN0cmlidXRlZF90ZXN0X2tleXNwYWNlLiBUb3Aga2V5cyBhcmU6IHQuMSIpOwpAQCAtNTMsOCArNTMsOCBAQAogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUga3MxLnQgKGtleSBpbnQgUFJJTUFSWSBLRVksIHZhbCBibG9iKSIpKTsKICAgICAgICAgICAgIFN0cmluZyBwYXlsb2FkID0gU3RyaW5nVXRpbHMucmVwZWF0KCcxJywgMTAyNCAqIDQ4KTsKICAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9ICJCRUdJTiBCQVRDSFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8ga3MxLnQgKGtleSwgdmFsKSBWQUxVRVMgKDEsIHRleHRBc0Jsb2IoJyIgKyBwYXlsb2FkICsgIicpKVxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8ga3MxLnQgKGtleSwgdmFsKSBWQUxVRVMgKDIsIHRleHRBc0Jsb2IoJzIyMicpKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8ga3MxLnQgKGtleSwgdmFsKSBWQUxVRVMgKDEsIHRleHRfYXNfYmxvYignIiArIHBheWxvYWQgKyAiJykpXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyBrczEudCAoa2V5LCB2YWwpIFZBTFVFUyAoMiwgdGV4dF9hc19ibG9iKCcyMjInKSlcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFQUExZIEJBVENIIjsKICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UocXVlcnkpLCBBTEwpKQogICAgICAgICAgICAgICAgICAgICAgIC5oYXNNZXNzYWdlQ29udGFpbmluZygiUmVqZWN0ZWQgYW4gb3ZlcnNpemVkIG11dGF0aW9uICgiKQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1BhcnRpdGlvbkRlbnlsaXN0VGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1BhcnRpdGlvbkRlbnlsaXN0VGVzdC5qYXZhCmluZGV4IDM4Mjk4MWYuLmQ4ZTYzNzggMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9QYXJ0aXRpb25EZW55bGlzdFRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUGFydGl0aW9uRGVueWxpc3RUZXN0LmphdmEKQEAgLTM0LDYgKzM0LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VQcm94eTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09OU0lTVEVOVF9SQU5HRV9NT1ZFTUVOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT05TSVNURU5UX1NJTVVMVEFORU9VU19NT1ZFU19BTExPVzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SSU5HX0RFTEFZOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5HT1NTSVA7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLk5FVFdPUks7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKQEAgLTU4LDkgKzYxLDkgQEAKICAgICBwdWJsaWMgdm9pZCBjaGVja1N0YXJ0dXBXaXRob3V0VHJpZ2dlcmluZ1VuYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCiAgICAgewogICAgICAgICBpbnQgbm9kZUNvdW50ID0gNDsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEucmluZ19kZWxheV9tcyIsICI1MDAwIik7IC8vIGRvd24gZnJvbSAzMHMgZGVmYXVsdAotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25zaXN0ZW50LnJhbmdlbW92ZW1lbnQiLCAiZmFsc2UiKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uc2lzdGVudC5zaW11bHRhbmVvdXNtb3Zlcy5hbGxvdyIsICJ0cnVlIik7CisgICAgICAgIFJJTkdfREVMQVkuc2V0TG9uZyg1MDAwKTsgLy8gZG93biBmcm9tIDMwcyBkZWZhdWx0CisgICAgICAgIENPTlNJU1RFTlRfUkFOR0VfTU9WRU1FTlQuc2V0Qm9vbGVhbihmYWxzZSk7CisgICAgICAgIENPTlNJU1RFTlRfU0lNVUxUQU5FT1VTX01PVkVTX0FMTE9XLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gQ2x1c3Rlci5idWlsZChub2RlQ291bnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGgoTkVUV09SSykKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9QYXhvc1JlcGFpcjJUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUGF4b3NSZXBhaXIyVGVzdC5qYXZhCmluZGV4IDU3NGI4NGYuLjQwMDUwYmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9QYXhvc1JlcGFpcjJUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1BheG9zUmVwYWlyMlRlc3QuamF2YQpAQCAtMjcsNiArMjcsOCBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hd2FpdGlsaXR5LkF3YWl0aWxpdHk7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTYzLDYgKzY1LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUludm9rYWJsZUluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5DbHVzdGVyVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5DYXNXcml0ZVRpbWVvdXRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLkZhaWx1cmVEZXRlY3RvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKQEAgLTkxLDYgKzk0LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0LlNFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQVVUT19SRVBBSVJfRlJFUVVFTkNZX1NFQ09ORFM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRElTQUJMRV9QQVhPU19BVVRPX1JFUEFJUlM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuQmFsbG90LkZsYWcuR0xPQkFMOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLkJhbGxvdEdlbmVyYXRvci5HbG9iYWwuc3RhbGVCYWxsb3Q7CkBAIC0xMDYsNyArMTExLDcgQEAKIAogICAgIHN0YXRpYwogICAgIHsKLSAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBWE9TX0VYRUNVVEVfT05fU0VMRi5zZXRCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBWE9TX1VTRV9TRUxGX0VYRUNVVElPTi5zZXRCb29sZWFuKGZhbHNlKTsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgfQogCkBAIC0yMzksNyArMjQ0LDcgQEAKICAgICAgICAgKQogICAgICAgICB7CiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQ1JFQVRFIFRBQkxFICIgKyBLRVlTUEFDRSArICcuJyArIFRBQkxFICsgIiAoayBpbnQgcHJpbWFyeSBrZXksIHYgaW50KSIpOwotICAgICAgICAgICAgY2x1c3Rlci5nZXQoMykuc2h1dGRvd24oKS5nZXQoKTsKKyAgICAgICAgICAgIENsdXN0ZXJVdGlscy5zdG9wVW5jaGVja2VkKGNsdXN0ZXIuZ2V0KDMpKTsKICAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBub2RlMyA9IEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeUFkZHJlc3MoY2x1c3Rlci5nZXQoMykuYnJvYWRjYXN0QWRkcmVzcygpKTsKIAogICAgICAgICAgICAgLy8gbWFrZSBzdXJlIG5vZGUxIGtub3dzIG5vZGUzIGlzIGRvd24KQEAgLTMzMCwyMSArMzM1LDIwIEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBwYXhvc0F1dG9SZXBhaXIoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5hdXRvX3JlcGFpcl9mcmVxdWVuY3lfc2Vjb25kcyIsICIxIik7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmRpc2FibGVfcGF4b3NfYXV0b19yZXBhaXJzIiwgInRydWUiKTsKLSAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBpbml0KENsdXN0ZXIuY3JlYXRlKDMsIGNmZyAtPiBjZmcKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KEFVVE9fUkVQQUlSX0ZSRVFVRU5DWV9TRUNPTkRTLCAxKS5zZXQoRElTQUJMRV9QQVhPU19BVVRPX1JFUEFJUlMsIHRydWUpOworICAgICAgICAgICAgIENsdXN0ZXIgY2x1c3RlciA9IGluaXQoQ2x1c3Rlci5jcmVhdGUoMywgY2ZnIC0+IGNmZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoInBheG9zX3ZhcmlhbnQiLCAidjIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoInBheG9zX3JlcGFpcl9lbmFibGVkIiwgdHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJ0cnVuY2F0ZV9yZXF1ZXN0X3RpbWVvdXRfaW5fbXMiLCAxMDAwTCkpKQotICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgidHJ1bmNhdGVfcmVxdWVzdF90aW1lb3V0X2luX21zIiwgMTAwMEwpKSk7CisgICAgICAgICAgICAgKQogICAgICAgICB7CiAgICAgICAgICAgICBjbHVzdGVyLmZvckVhY2goaSAtPiB7CiAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DTE9DS19HTE9CQUwuaXNQcmVzZW50KCkpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjEiLCBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS5hdXRvX3JlcGFpcl9mcmVxdWVuY3lfc2Vjb25kcyIpKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEuZGlzYWJsZV9wYXhvc19hdXRvX3JlcGFpcnMiKSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQVVUT19SRVBBSVJfRlJFUVVFTkNZX1NFQ09ORFMuZ2V0SW50KCkpOworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESVNBQkxFX1BBWE9TX0FVVE9fUkVQQUlSUy5nZXRCb29sZWFuKCkpOwogICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQ1JFQVRFIFRBQkxFICIgKyBLRVlTUEFDRSArICcuJyArIFRBQkxFICsgIiAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKLSAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDMpLnNodXRkb3duKCkuZ2V0KCk7CisgICAgICAgICAgICBDbHVzdGVyVXRpbHMuc3RvcFVuY2hlY2tlZChjbHVzdGVyLmdldCgzKSk7CiAgICAgICAgICAgICBjbHVzdGVyLnZlcmJzKFZlcmIuUEFYT1NfQ09NTUlUX1JFUSkuZHJvcCgpOwogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CkBAIC0zNjksNyArMzczLDcgQEAKICAgICAgICAgICAgIGZvciAoaW50IGk9MDsgaTwyMDsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICghY2x1c3Rlci5nZXQoMSkuY2FsbHNPbkluc3RhbmNlKCgpIC0+IFBheG9zU3RhdGUudW5jb21taXR0ZWRUcmFja2VyKCkuaGFzSW5mbGlnaHRBdXRvUmVwYWlycygpKS5jYWxsKCkKLSAgICAgICAgICAgICAgICAgJiYgIWNsdXN0ZXIuZ2V0KDIpLmNhbGxzT25JbnN0YW5jZSgoKSAtPiBQYXhvc1N0YXRlLnVuY29tbWl0dGVkVHJhY2tlcigpLmhhc0luZmxpZ2h0QXV0b1JlcGFpcnMoKSkuY2FsbCgpKQorICAgICAgICAgICAgICAgICAgICAmJiAhY2x1c3Rlci5nZXQoMikuY2FsbHNPbkluc3RhbmNlKCgpIC0+IFBheG9zU3RhdGUudW5jb21taXR0ZWRUcmFja2VyKCkuaGFzSW5mbGlnaHRBdXRvUmVwYWlycygpKS5jYWxsKCkpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJXYWl0aW5nIGZvciBhdXRvIHJlcGFpcnMgdG8gZmluaXNoLi4uIik7CiAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOwpAQCAtMzc3LDExICszODEsNiBAQAogICAgICAgICAgICAgYXNzZXJ0VW5jb21taXR0ZWQoY2x1c3Rlci5nZXQoMSksIEtFWVNQQUNFLCBUQUJMRSwgMCk7CiAgICAgICAgICAgICBhc3NlcnRVbmNvbW1pdHRlZChjbHVzdGVyLmdldCgyKSwgS0VZU1BBQ0UsIFRBQkxFLCAwKTsKICAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJjYXNzYW5kcmEuYXV0b19yZXBhaXJfZnJlcXVlbmN5X3NlY29uZHMiKTsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJjYXNzYW5kcmEuZGlzYWJsZV9wYXhvc19hdXRvX3JlcGFpcnMiKTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUGF4b3NSZXBhaXJUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUGF4b3NSZXBhaXJUZXN0LmphdmEKaW5kZXggYmZkNGU5NS4uMzI1MWY4NCAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1BheG9zUmVwYWlyVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9QYXhvc1JlcGFpclRlc3QuamF2YQpAQCAtOTYsNyArOTYsNyBAQAogCiAgICAgc3RhdGljCiAgICAgewotICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfRVhFQ1VURV9PTl9TRUxGLnNldEJvb2xlYW4oZmFsc2UpOworICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfVVNFX1NFTEZfRVhFQ1VUSU9OLnNldEJvb2xlYW4oZmFsc2UpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9QcmV2aWV3UmVwYWlyU25hcHNob3RUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUHJldmlld1JlcGFpclNuYXBzaG90VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNjc5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUHJldmlld1JlcGFpclNuYXBzaG90VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQm91bmRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJc29sYXRlZEV4ZWN1dG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWZzOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlOVVRFUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuR09TU0lQOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5ORVRXT1JLOworaW1wb3J0IHN0YXRpYyBvcmcuYXdhaXRpbGl0eS5Bd2FpdGlsaXR5LmF3YWl0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZW1wdHlTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworCitwdWJsaWMgY2xhc3MgUHJldmlld1JlcGFpclNuYXBzaG90VGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIC8qKgorICAgICAqIE1ha2VzIHN1cmUgd2Ugb25seSBzbmFwc2hvdCBzc3RhYmxlcyBjb250YWluaW5nIHRoZSBtaXNtYXRjaGluZyB0b2tlbgorICAgICAqIDxwPgorICAgICAqIDEuIGNyZWF0ZSAxMDAgc3N0YWJsZXMgcGVyIGluc3RhbmNlLCBjb21wYWN0aW9uIGRpc2FibGVkLCBvbmUgdG9rZW4gcGVyIHNzdGFibGUKKyAgICAgKiAyLiBtYWtlIDMgdG9rZW5zIG1pc21hdGNoaW5nIG9uIG5vZGUyLCBvbmUgdG9rZW4gcGVyIHNzdGFibGUKKyAgICAgKiAzLiBydW4gcHJldmlldyByZXBhaXIKKyAgICAgKiA0LiBtYWtlIHN1cmUgdGhhdCBvbmx5IHRoZSBzc3RhYmxlcyBjb250YWluaW5nIHRoZSB0b2tlbiBhcmUgaW4gdGhlIHNuYXBzaG90CisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U25hcHNob3RPZlNTdGFibGVzQ29udGFpbmluZ01pc21hdGNoaW5nVG9rZW5zKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IGluaXQoQ2x1c3Rlci5idWlsZCgyKS53aXRoQ29uZmlnKGNvbmZpZyAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zZXQoInNuYXBzaG90X29uX3JlcGFpcmVkX2RhdGFfbWlzbWF0Y2giLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoKEdPU1NJUCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aChORVRXT1JLKSkuc3RhcnQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldDxJbnRlZ2VyPiB0b2tlbnNUb01pc21hdGNoID0gU2V0cy5uZXdIYXNoU2V0KDEsIDUwLCA5OSk7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoImNyZWF0ZSB0YWJsZSAlcy50YmwgKGlkIGludCBwcmltYXJ5IGtleSkgd2l0aCBjb21wYWN0aW9uID0geydjbGFzcycgOiAnU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneScsICdlbmFibGVkJzpmYWxzZSB9IikpOworICAgICAgICAgICAgLy8gMSB0b2tlbiBwZXIgc3N0YWJsZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKHdpdGhLZXlzcGFjZSgiaW5zZXJ0IGludG8gJXMudGJsIChpZCkgdmFsdWVzICg/KSIpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgaSk7CisgICAgICAgICAgICAgICAgY2x1c3Rlci5zdHJlYW0oKS5mb3JFYWNoKGluc3RhbmNlIC0+IGluc3RhbmNlLmZsdXNoKEtFWVNQQUNFKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbHVzdGVyLnN0cmVhbSgpLmZvckVhY2goaW5zdGFuY2UgLT4gaW5zdGFuY2UuZmx1c2goS0VZU1BBQ0UpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDI7IGkrKykKKyAgICAgICAgICAgICAgICBtYXJrUmVwYWlyZWQoY2x1c3RlciwgaSk7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpCisgICAgICAgICAgICAgICAgICAgLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLXZkIiwgIi1wciIsIEtFWVNQQUNFLCAidGJsIikKKyAgICAgICAgICAgICAgICAgICAuYXNzZXJ0cygpCisgICAgICAgICAgICAgICAgICAgLnN1Y2Nlc3MoKQorICAgICAgICAgICAgICAgICAgIC5zdGRvdXRDb250YWlucygiUmVwYWlyZWQgZGF0YSBpcyBpbiBzeW5jIik7CisKKyAgICAgICAgICAgIFNldDxUb2tlbj4gbWlzbWF0Y2hpbmdUb2tlbnMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgICAgICBmb3IgKEludGVnZXIgdG9rZW4gOiB0b2tlbnNUb01pc21hdGNoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDIpLmV4ZWN1dGVJbnRlcm5hbCh3aXRoS2V5c3BhY2UoImluc2VydCBpbnRvICVzLnRibCAoaWQpIHZhbHVlcyAoPykiKSwgdG9rZW4pOworICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDIpLmZsdXNoKEtFWVNQQUNFKTsKKyAgICAgICAgICAgICAgICBPYmplY3RbXVtdIHJlcyA9IGNsdXN0ZXIuZ2V0KDIpLmV4ZWN1dGVJbnRlcm5hbCh3aXRoS2V5c3BhY2UoInNlbGVjdCB0b2tlbihpZCkgZnJvbSAlcy50Ymwgd2hlcmUgaWQgPSA/IiksIHRva2VuKTsKKyAgICAgICAgICAgICAgICBtaXNtYXRjaGluZ1Rva2Vucy5hZGQobmV3IE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4oKGxvbmcpIHJlc1swXVswXSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYXJrUmVwYWlyZWQoY2x1c3RlciwgMik7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpCisgICAgICAgICAgICAgICAgICAgLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLXZkIiwgS0VZU1BBQ0UsICJ0YmwiKQorICAgICAgICAgICAgICAgICAgIC5hc3NlcnRzKCkKKyAgICAgICAgICAgICAgICAgICAuc3VjY2VzcygpCisgICAgICAgICAgICAgICAgICAgLnN0ZG91dENvbnRhaW5zKCJSZXBhaXJlZCBkYXRhIGlzIGluY29uc2lzdGVudCIpOworCisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5ydW5Pbkluc3RhbmNlKGNoZWNrU25hcHNob3QobWlzbWF0Y2hpbmdUb2tlbnMsIDMpKTsKKyAgICAgICAgICAgIC8vIG5vZGUyIGdvdCB0aGUgZHVwbGljYXRlIG1pc21hdGNoLXRva2VucyBhYm92ZSwgc28gaXQgc2hvdWxkIGV4aXN0IGluIGV4YWN0bHkgNiBzc3RhYmxlcworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMikucnVuT25JbnN0YW5jZShjaGVja1NuYXBzaG90KG1pc21hdGNoaW5nVG9rZW5zLCA2KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIElJc29sYXRlZEV4ZWN1dG9yLlNlcmlhbGl6YWJsZVJ1bm5hYmxlIGNoZWNrU25hcHNob3QoU2V0PFRva2VuPiBtaXNtYXRjaGluZ1Rva2VucywgaW50IGV4cGVjdGVkU25hcHNob3RTaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgpIC0+IHsKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKCJ0YmwiKTsKKworICAgICAgICAgICAgU3RyaW5nIHNuYXBzaG90VGFnID0gYXdhaXQoKS5hdE1vc3QoMSwgTUlOVVRFUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9sbEludGVydmFsKDEwMCwgTUlMTElTRUNPTkRTKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bnRpbCgoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHRhZyA6IGNmcy5saXN0U25hcHNob3RzKCkua2V5U2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNyZWF0ZSB0aGUgc25hcHNob3Qgc2NoZW1hIGZpbGUgbGFzdCwgc28gd2hlbiB0aGlzIGV4aXN0cyB3ZSBrbm93IHRoZSBzbmFwc2hvdCBpcyBjb21wbGV0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRTbmFwc2hvdFNjaGVtYUZpbGUodGFnKS5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIG5vdChlbXB0eVN0cmluZygpKSk7CisKKyAgICAgICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBpblNuYXBzaG90ID0gbmV3IEhhc2hTZXQ8PigpOworCisgICAgICAgICAgICB0cnkgKFJlZnM8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBjZnMuZ2V0U25hcHNob3RTU1RhYmxlUmVhZGVycyhzbmFwc2hvdFRhZykpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW5TbmFwc2hvdC5hZGRBbGwoc3N0YWJsZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTbmFwc2hvdFNpemUsIGluU25hcHNob3Quc2l6ZSgpKTsKKworICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQm91bmRzPFRva2VuPiBzc3RhYmxlQm91bmRzID0gbmV3IEJvdW5kczw+KHNzdGFibGUuZmlyc3QuZ2V0VG9rZW4oKSwgc3N0YWJsZS5sYXN0LmdldFRva2VuKCkpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkQmVJblNuYXBzaG90ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChUb2tlbiBtaXNtYXRjaGluZ1Rva2VuIDogbWlzbWF0Y2hpbmdUb2tlbnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3N0YWJsZUJvdW5kcy5jb250YWlucyhtaXNtYXRjaGluZ1Rva2VuKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc2hvdWxkQmVJblNuYXBzaG90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZEJlSW5TbmFwc2hvdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNob3VsZEJlSW5TbmFwc2hvdCwgaW5TbmFwc2hvdC5jb250YWlucyhzc3RhYmxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG1hcmtSZXBhaXJlZChDbHVzdGVyIGNsdXN0ZXIsIGludCBpbnN0YW5jZSkKKyAgICB7CisgICAgICAgIGNsdXN0ZXIuZ2V0KGluc3RhbmNlKS5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKCJ0YmwiKTsKKyAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogY2ZzLmdldExpdmVTU1RhYmxlcygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5kZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLm11dGF0ZVJlcGFpck1ldGFkYXRhKHNzdGFibGUuZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5yZWxvYWRTU1RhYmxlTWV0YWRhdGEoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9QcmV2aWV3UmVwYWlyVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1ByZXZpZXdSZXBhaXJUZXN0LmphdmEKaW5kZXggOTBlMjlmMi4uYTBiNjQzZiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1ByZXZpZXdSZXBhaXJUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1ByZXZpZXdSZXBhaXJUZXN0LmphdmEKQEAgLTczLDkgKzczLDcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkVUV09SSzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklNZXNzYWdlRmlsdGVycy5NYXRjaGVyOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLkluc3RhbmNlLmRlc2VyaWFsaXplTWVzc2FnZTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5QcmV2aWV3UmVwYWlyVGVzdC5EZWxheUZpcnN0UmVwYWlyVHlwZU1lc3NhZ2VGaWx0ZXIuZmluYWxpemVQcm9wb3NlOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlByZXZpZXdSZXBhaXJUZXN0LkRlbGF5Rmlyc3RSZXBhaXJUeXBlTWVzc2FnZUZpbHRlci52YWxpZGF0aW9uUmVxdWVzdDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlZlcmIuRklOQUxJWkVfUFJPUE9TRV9NU0c7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiLlZBTElEQVRJT05fUkVROwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkNvbmRpdGlvbi5uZXdPbmVUaW1lQ29uZGl0aW9uOwpAQCAtMTg3LDEwICsxODUsMTQgQEAKICAgICAgICAgICAgIHByZXZpZXdSZXBhaXJTdGFydGVkLmF3YWl0KCk7CiAgICAgICAgICAgICAvLyB0aGlzIG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgdGhlIHByZXZpZXcgcmVwYWlyIGlzIHVucGF1c2VkIG9uIG5vZGUyCiAgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5jYWxsT25JbnN0YW5jZShyZXBhaXIob3B0aW9ucyhmYWxzZSwgZmFsc2UpKSk7CisgICAgICAgICAgICBSZXBhaXJSZXN1bHQgaXJSZXN1bHQgPSBjbHVzdGVyLmdldCgxKS5jYWxsT25JbnN0YW5jZShyZXBhaXIob3B0aW9ucyhmYWxzZSwgZmFsc2UpKSk7CiAgICAgICAgICAgICBjb250aW51ZVByZXZpZXdSZXBhaXIuc2lnbmFsQWxsKCk7CiAgICAgICAgICAgICBSZXBhaXJSZXN1bHQgcnMgPSByc0Z1dHVyZS5nZXQoKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKHJzLnN1Y2Nlc3MpOyAvLyBwcmV2aWV3IHJlcGFpciBzaG91bGQgaGF2ZSBmYWlsZWQKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHJzLnN1Y2Nlc3MpOyAvLyBwcmV2aWV3IHJlcGFpciB3YXMgc3RhcnRlZCBiZWZvcmUgSVIsIGJ1dCBoYXMgbG93ZXIgcHJpb3JpdHksIHNvIGl0cyB0YXNrIHdpbGwgZ2V0IGNhbmNlbGxlZAogICAgICAgICAgICAgYXNzZXJ0RmFsc2UocnMud2FzSW5jb25zaXN0ZW50KTsgLy8gYW5kIG5vIG1pc21hdGNoZXMgc2hvdWxkIGhhdmUgYmVlbiByZXBvcnRlZAorCisgICAgICAgICAgICBhc3NlcnRUcnVlKGlyUmVzdWx0LnN1Y2Nlc3MpOyAvLyBJUiB3YXMgc3RhcnRlZCBhZnRlciBwcmV2aWV3IHJlcGFpciwgYnV0IGhhcyBhIGhpZ2hlciBwcmlvcml0eSwgc28gaXQnbGwgYmUgYWxsb3dlZCB0byBmaW5pc2gKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGlyUmVzdWx0Lndhc0luY29uc2lzdGVudCk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQogICAgICAgICB7CkBAIC0yMjYsMzQgKzIyOCwyMSBAQAogICAgICAgICAgICAgICAgICAgIC5tZXNzYWdlc01hdGNoaW5nKHZhbGlkYXRpb25SZXF1ZXN0KHByZXZpZXdSZXBhaXJTdGFydGVkLCBjb250aW51ZVByZXZpZXdSZXBhaXIpKQogICAgICAgICAgICAgICAgICAgIC5kcm9wKCk7CiAKLSAgICAgICAgICAgIENvbmRpdGlvbiBpclJlcGFpclN0YXJ0ZWQgPSBuZXdPbmVUaW1lQ29uZGl0aW9uKCk7Ci0gICAgICAgICAgICBDb25kaXRpb24gY29udGludWVJclJlcGFpciA9IG5ld09uZVRpbWVDb25kaXRpb24oKTsKLSAgICAgICAgICAgIC8vIHRoaXMgYmxvY2tzIHRoZSBJUiBmcm9tIGNvbW1pdHRpbmcsIHNvIHdlIGNhbiByZWVuYWJsZSB0aGUgcHJldmlldwotICAgICAgICAgICAgY2x1c3Rlci5maWx0ZXJzKCkKLSAgICAgICAgICAgICAgICAgICAub3V0Ym91bmQoKQotICAgICAgICAgICAgICAgICAgIC52ZXJicyhGSU5BTElaRV9QUk9QT1NFX01TRy5pZCkKLSAgICAgICAgICAgICAgICAgICAuZnJvbSgxKS50bygyKQotICAgICAgICAgICAgICAgICAgIC5tZXNzYWdlc01hdGNoaW5nKGZpbmFsaXplUHJvcG9zZShpclJlcGFpclN0YXJ0ZWQsIGNvbnRpbnVlSXJSZXBhaXIpKQotICAgICAgICAgICAgICAgICAgIC5kcm9wKCk7Ci0KICAgICAgICAgICAgIEZ1dHVyZTxSZXBhaXJSZXN1bHQ+IHByZXZpZXdSZXN1bHQgPSBjbHVzdGVyLmdldCgxKS5hc3luY0NhbGxzT25JbnN0YW5jZShyZXBhaXIob3B0aW9ucyh0cnVlLCBmYWxzZSkpKS5jYWxsKCk7CiAgICAgICAgICAgICBwcmV2aWV3UmVwYWlyU3RhcnRlZC5hd2FpdCgpOwogCi0gICAgICAgICAgICAvLyB0cmlnZ2VyIElSIGFuZCB3YWl0IHRpbGwgaXRzIHJlYWR5IHRvIGNvbW1pdAorICAgICAgICAgICAgLy8gdHJpZ2dlciBJUiBhbmQgd2FpdCB0aWxsIGl0J3MgcmVhZHkgdG8gY29tbWl0CiAgICAgICAgICAgICBGdXR1cmU8UmVwYWlyUmVzdWx0PiBpclJlc3VsdCA9IGNsdXN0ZXIuZ2V0KDEpLmFzeW5jQ2FsbHNPbkluc3RhbmNlKHJlcGFpcihvcHRpb25zKGZhbHNlLCBmYWxzZSkpKS5jYWxsKCk7Ci0gICAgICAgICAgICBpclJlcGFpclN0YXJ0ZWQuYXdhaXQoKTsKKyAgICAgICAgICAgIFJlcGFpclJlc3VsdCBpciA9IGlyUmVzdWx0LmdldCgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpci5zdWNjZXNzKTsgLy8gSVIgd2FzIHN1Ym1pdHRlZCBhZnRlciBwcmV2aWV3IHJlcGFpciBoYXMgYWNxdWlyZWQgc3N0YWJsZXMsIGJ1dCBoYXMgaGlnaGVyIHByaW9yaXR5CisgICAgICAgICAgICBhc3NlcnRGYWxzZShpci53YXNJbmNvbnNpc3RlbnQpOyAvLyBub3QgcHJldmlldywgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCBwcmV2aWV3IG5vdGlmaWNhdGlvbgogCiAgICAgICAgICAgICAvLyB1bmJsb2NrIHByZXZpZXcgcmVwYWlyIGFuZCB3YWl0IGZvciBpdCB0byBjb21wbGV0ZQogICAgICAgICAgICAgY29udGludWVQcmV2aWV3UmVwYWlyLnNpZ25hbEFsbCgpOwogCiAgICAgICAgICAgICBSZXBhaXJSZXN1bHQgcnMgPSBwcmV2aWV3UmVzdWx0LmdldCgpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UocnMuc3VjY2Vzcyk7IC8vIHByZXZpZXcgcmVwYWlyIHNob3VsZCBoYXZlIGZhaWxlZAorICAgICAgICAgICAgYXNzZXJ0RmFsc2UocnMuc3VjY2Vzcyk7IC8vIHByZXZpZXcgcmVwYWlyIHdhcyBzdGFydGVkIGVhcmxpZXIgdGhhbiBJUiBzZXNzaW9uOyBidXQgaGFzIHNtYWxsZXIgcHJpb3JpdHkKICAgICAgICAgICAgIGFzc2VydEZhbHNlKHJzLndhc0luY29uc2lzdGVudCk7IC8vIGFuZCBubyBtaXNtYXRjaGVzIHNob3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQKLQotICAgICAgICAgICAgY29udGludWVJclJlcGFpci5zaWduYWxBbGwoKTsKLSAgICAgICAgICAgIFJlcGFpclJlc3VsdCBpciA9IGlyUmVzdWx0LmdldCgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShpci5zdWNjZXNzKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKGlyLndhc0luY29uc2lzdGVudCk7IC8vIG5vdCBwcmV2aWV3LCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHByZXZpZXcgbm90aWZpY2F0aW9uCiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Qcm9maWxlTG9hZFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9Qcm9maWxlTG9hZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODNlYTdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1Byb2ZpbGVMb2FkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5pbnRlcnJ1cHRpYmxlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW52b2thYmxlSW5zdGFuY2U7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworcHVibGljIGNsYXNzIFByb2ZpbGVMb2FkVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjaGVkdWxlZFNhbXBsaW5nVGFza0xvZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gaW5pdChDbHVzdGVyLmJ1aWxkKDEpLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50YmwgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpOyIpKTsKKworICAgICAgICAgICAgLy8gc3RhcnQgdGhlIHNjaGVkdWxlZCBwcm9maWxlbG9hZCB0YXNrIHRoYXQgc2FtcGxlcyBmb3IgMSBzZWNvbmQgYW5kIGV2ZXJ5IHNlY29uZC4KKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJwcm9maWxlbG9hZCIsICIxMDAwIiwgIi1pIiwgIjEwMDAiKS5hc3NlcnRzKCkuc3VjY2VzcygpOworCisgICAgICAgICAgICBSYW5kb20gcm5kID0gbmV3IFJhbmRvbSgpOworICAgICAgICAgICAgLy8gODAwICogMm1zID0gMS42IHNlY29uZHMuIEl0IGxvZ3MgZXZlcnkgc2Vjb25kLiBTbyBpdCBsb2dzIGF0IGxlYXN0IG9uY2UuCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDgwMDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50YmwgKHBrLCBjaywgdikgVkFMVUVTICg/LD8sPykiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lMZXZlbC5RVU9SVU0sIHJuZC5uZXh0SW50KCksIHJuZC5uZXh0SW50KCksIGkpOworICAgICAgICAgICAgICAgIFVuaW50ZXJydXB0aWJsZXMuc2xlZXBVbmludGVycnVwdGlibHkoMiwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC0tbGlzdCBzaG91bGQgZGlzcGxheSBhbGwgYWN0aXZlIHRhc2tzLgorICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkT3V0cHV0ID0gU3RyaW5nLmZvcm1hdCgiS0VZU1BBQ0UgVEFCTEUlbiIgKyAiJThzICU1cyIsICIqIiwgIioiKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJwcm9maWxlbG9hZCIsICItLWxpc3QiKQorICAgICAgICAgICAgICAgICAgIC5hc3NlcnRzKCkKKyAgICAgICAgICAgICAgICAgICAuc3VjY2VzcygpCisgICAgICAgICAgICAgICAgICAgLnN0ZG91dENvbnRhaW5zKGV4cGVjdGVkT3V0cHV0KTsKKworICAgICAgICAgICAgLy8gbG9vcCBhc3NlcnQgdGhlIGxvZyBjb250YWlucyB0aGUgZnJlcXVlbmN5IHJlYWRvdXQ7IGdpdmUgdGhpcyAxNSBzZWNvbmRzIHdoaWNoIHNob3VsZCBiZSBwbGVudHkgb2YgdGltZQorICAgICAgICAgICAgLy8gZXZlbiBvbiB2ZXJ5IGJhZGx5IHVuZGVycHJvdmlzaW9uZWQgZW52aXJvbm1lbnRzCisgICAgICAgICAgICBpbnQgdGltZW91dCA9IDE1OworICAgICAgICAgICAgYm9vbGVhbiB0ZXN0UGFzc2VkID0gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAodGltZW91dC0tID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZnJlcUhlYWRpbmdzID0gY2x1c3Rlci5nZXQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2dzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ncmVwKCJGcmVxdWVuY3kgb2YgKHJlYWRzfHdyaXRlc3xjYXMgY29udGVudGlvbnMpIGJ5IHBhcnRpdGlvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzdWx0KCk7CisgICAgICAgICAgICAgICAgaWYgKGZyZXFIZWFkaW5ncy5zaXplKCkgPiAzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdFBhc3NlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBVbmludGVycnVwdGlibGVzLnNsZWVwVW5pbnRlcnJ1cHRpYmx5KDEsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlRoZSBzY2hlZHVsZWQgdGFzayBzaG91bGQgYXQgbGVhc3QgcnVuIGFuZCBsb2cgb25jZSIsIHRlc3RQYXNzZWQpOworCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gc3RhcnRTYW1wbGluZ0xvZ3MgPSBjbHVzdGVyLmdldCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2dzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ3JlcCgiU3RhcnRpbmcgdG8gc2FtcGxlIHRhYmxlcyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFJlc3VsdCgpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkl0IHNob3VsZCBzdGFydCBzYW1wbGluZyBhdCBsZWFzdCBvbmNlIiwgc3RhcnRTYW1wbGluZ0xvZ3Muc2l6ZSgpID4gMCk7CisKKyAgICAgICAgICAgIC8vIHN0b3AgdGhlIHNjaGVkdWxlZCBzYW1wbGluZworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2xSZXN1bHQoInByb2ZpbGVsb2FkIiwgIi0tc3RvcCIpLmFzc2VydHMoKS5zdWNjZXNzKCk7CisKKyAgICAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBsYXN0IHNjaGVkdWxlIHRvIGJlIHN0b3BwZWQuIC0tbGlzdCBzaG91bGQgbGlzdCBub3RoaW5nIGFmdGVyIHN0b3BwaW5nCisgICAgICAgICAgICBhc3NlcnRMaXN0RW1wdHkoY2x1c3Rlci5nZXQoMSkpOworCisgICAgICAgICAgICAvLyBzY2hlZHVsZSBvbiB0aGUgc3BlY2lmaWMgdGFibGUKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJwcm9maWxlbG9hZCIsIEtFWVNQQUNFLCAidGJsIiwgIjEwMDAiLCAiLWkiLCAiMTAwMCIpLmFzc2VydHMoKS5zdWNjZXNzKCk7CisgICAgICAgICAgICBleHBlY3RlZE91dHB1dCA9IFN0cmluZy5mb3JtYXQoIiUiICsgS0VZU1BBQ0UubGVuZ3RoKCkgKyAicyAlNXMlbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyAlNXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLRVlTUEFDRSIsICJUQUJMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZU1BBQ0UsICJ0YmwiKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJwcm9maWxlbG9hZCIsICItLWxpc3QiKQorICAgICAgICAgICAgICAgICAgIC5hc3NlcnRzKCkKKyAgICAgICAgICAgICAgICAgICAuc3VjY2VzcygpCisgICAgICAgICAgICAgICAgICAgLnN0ZG91dENvbnRhaW5zKGV4cGVjdGVkT3V0cHV0KTsKKyAgICAgICAgICAgIC8vIHN0b3AgYWxsIHNob3VsZCBzdG9wIHRoZSB0YXNrIHNjaGVkdWxlZCB3aXRoIHRoZSBzcGVjaWZpYyB0YWJsZQorICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2xSZXN1bHQoInByb2ZpbGVsb2FkIiwgIi0tc3RvcCIpCisgICAgICAgICAgICAgICAgICAgLmFzc2VydHMoKS5zdWNjZXNzKCk7CisgICAgICAgICAgICBhc3NlcnRMaXN0RW1wdHkoY2x1c3Rlci5nZXQoMSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJldmVudER1cGxpY2F0ZWRTY2hlZHVsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBpbml0KENsdXN0ZXIuYnVpbGQoMSkuc3RhcnQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRibCAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSk7IikpOworCisgICAgICAgICAgICAvLyBOZXcgc2FtcGxpbmc7IHdlIGFyZSBnb29kCisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5ub2RldG9vbFJlc3VsdCgicHJvZmlsZWxvYWQiLCBLRVlTUEFDRSwgInRibCIsICIxMDAwIiwgIi1pIiwgIjEwMDAiKQorICAgICAgICAgICAgICAgICAgIC5hc3NlcnRzKCkKKyAgICAgICAgICAgICAgICAgICAuc3VjY2VzcygpCisgICAgICAgICAgICAgICAgICAgLnN0ZG91dE5vdENvbnRhaW5zKCJVbmFibGUgdG8gc2NoZWR1bGUgc2FtcGxpbmcgZm9yIGtleXNwYWNlIik7CisKKyAgICAgICAgICAgIC8vIER1cGxpY2F0ZWQgc2FtcGxpbmcgKGFnYWluc3QgdGhlIHNhbWUgdGFibGUpIGJ1dCBkaWZmZXJlbnQgaW50ZXJ2YWwuIE5vZGV0b29sIHNob3VsZCByZWplY3QKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJwcm9maWxlbG9hZCIsIEtFWVNQQUNFLCAidGJsIiwgIjEwMDAiLCAiLWkiLCAiMTAwMCIpCisgICAgICAgICAgICAgICAgICAgLmFzc2VydHMoKQorICAgICAgICAgICAgICAgICAgIC5zdWNjZXNzKCkKKyAgICAgICAgICAgICAgICAgICAuc3Rkb3V0Q29udGFpbnMoIlVuYWJsZSB0byBzY2hlZHVsZSBzYW1wbGluZyBmb3Iga2V5c3BhY2UiKTsKKworICAgICAgICAgICAgLy8gVGhlICJzYW1wbGluZyBhbGwiIHJlcXVlc3QgY3JlYXRlcyBvdmVybGFwcywgc28gaXQgc2hvdWxkIGJlIHJlamVjdGVkIHRvbworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2xSZXN1bHQoInByb2ZpbGVsb2FkIiwgIjEwMDAiLCAiLWkiLCAiMTAwMCIpCisgICAgICAgICAgICAgICAgICAgLmFzc2VydHMoKQorICAgICAgICAgICAgICAgICAgIC5zdWNjZXNzKCkKKyAgICAgICAgICAgICAgICAgICAuc3Rkb3V0Q29udGFpbnMoIlVuYWJsZSB0byBzY2hlZHVsZSBzYW1wbGluZyBmb3Iga2V5c3BhY2UiKTsKKworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2xSZXN1bHQoInByb2ZpbGVsb2FkIiwgS0VZU1BBQ0UsICJ0YmwiLCAiLS1zdG9wIikuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKKyAgICAgICAgICAgIGFzc2VydExpc3RFbXB0eShjbHVzdGVyLmdldCgxKSk7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJwcm9maWxlbG9hZCIsICJub25leGlzdGtzIiwgIm5vbmV4aXN0dGJsIiwgIi0tc3RvcCIpCisgICAgICAgICAgICAgICAgICAgLmFzc2VydHMoKQorICAgICAgICAgICAgICAgICAgIC5zdWNjZXNzKCkKKyAgICAgICAgICAgICAgICAgICAuc3Rkb3V0Q29udGFpbnMoIlVuYWJsZSB0byBzdG9wIHRoZSBub24tZXhpc3RlbnQgc2NoZWR1bGVkIHNhbXBsaW5nIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TGlzdEVtcHR5KElJbnZva2FibGVJbnN0YW5jZSBpbnN0YW5jZSkKKyAgICB7CisgICAgICAgIFVuaW50ZXJydXB0aWJsZXMuc2xlZXBVbmludGVycnVwdGlibHkoMTUwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiLS1saXN0IHNob3VsZCBsaXN0IG5vdGhpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLRVlTUEFDRSBUQUJMRVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5ub2RldG9vbFJlc3VsdCgicHJvZmlsZWxvYWQiLCAiLS1saXN0IikuZ2V0U3Rkb3V0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9RdWVyaWVzVGFibGVUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUXVlcmllc1RhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZTU2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUXVlcmllc1RhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuU2ltcGxlUXVlcnlSZXN1bHQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBRdWVyaWVzVGFibGVUZXN0IGV4dGVuZHMgVGVzdEJhc2VJbXBsCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVRFUkFUSU9OUyA9IDI1NjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkRXhwb3NlUmVhZHNBbmRXcml0ZXMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IGluaXQoQ2x1c3Rlci5idWlsZCgxKS5zdGFydCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgxNik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50YmwgKGsgaW50IHByaW1hcnkga2V5LCB2IGludCkiKTsKKworICAgICAgICAgICAgQXRvbWljSW50ZWdlciByZWFkcyA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICAgICAgQXRvbWljSW50ZWdlciB3cml0ZXMgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgICAgIEF0b21pY0ludGVnZXIgcGF4b3MgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJVEVSQVRJT05TOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGsgPSBpOworICAgICAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJJTlNFUlQgSU5UTyAiICsgS0VZU1BBQ0UgKyAiLnRibCAoaywgdikgVkFMVUVTICgiICsgayArICIsIDApIiwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpKTsKKyAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSgiVVBEQVRFICIgKyBLRVlTUEFDRSArICIudGJsIFNFVCB2ID0gMTAgV0hFUkUgayA9ICIgKyAoayAtIDEpICsgIiBJRiB2ID0gMCIsIENvbnNpc3RlbmN5TGV2ZWwuQUxMKSk7CisgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIiArIEtFWVNQQUNFICsgIi50YmwgV0hFUkUgayA9ICIgKyAoayAtIDEpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCkpOworCisgICAgICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU2ltcGxlUXVlcnlSZXN1bHQgcmVzdWx0ID0gY2x1c3Rlci5nZXQoMSkuZXhlY3V0ZUludGVybmFsV2l0aFJlc3VsdCgiU0VMRUNUICogRlJPTSBzeXN0ZW1fdmlld3MucXVlcmllcyIpOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlc3VsdC5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJvdyByb3cgPSByZXN1bHQubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRocmVhZElkID0gcm93LmdldCgidGhyZWFkX2lkIikudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0YXNrID0gcm93LmdldCgidGFzayIpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJZC5jb250YWlucygiUmVhZCIpICYmIHRhc2suY29udGFpbnMoIlNFTEVDVCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRzLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhyZWFkSWQuY29udGFpbnMoIk11dGF0aW9uIikgJiYgdGFzay5jb250YWlucygiTXV0YXRpb24iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXMuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aHJlYWRJZC5jb250YWlucygiTXV0YXRpb24iKSAmJiB0YXNrLmNvbnRhaW5zKCJQYXhvcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheG9zLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oMSwgVGltZVVuaXQuTUlOVVRFUykpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBXZSBzaG91bGQgc2VlIGF0IGxlYXN0IG9uZSByZWFkLCB3cml0ZSwgYW5kIGNvbmRpdGlvbmFsIHVwZGF0ZSBpbiB0aGUgInF1ZXJpZXMiIHRhYmxlLgorICAgICAgICAgICAgYXNzZXJ0VGhhdChyZWFkcy5nZXQoKSkuaXNHcmVhdGVyVGhhbigwKS5pc0xlc3NUaGFuT3JFcXVhbFRvKElURVJBVElPTlMpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh3cml0ZXMuZ2V0KCkpLmlzR3JlYXRlclRoYW4oMCkuaXNMZXNzVGhhbk9yRXF1YWxUbyhJVEVSQVRJT05TKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocGF4b3MuZ2V0KCkpLmlzR3JlYXRlclRoYW4oMCkuaXNMZXNzVGhhbk9yRXF1YWxUbyhJVEVSQVRJT05TKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9SZWFkUmVwYWlyVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1JlYWRSZXBhaXJUZXN0LmphdmEKaW5kZXggOWE3MGU4OS4uODNjMjgwNiAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1JlYWRSZXBhaXJUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1JlYWRSZXBhaXJUZXN0LmphdmEKQEAgLTM0LDcgKzM0LDYgQEAKIGltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmR5bmFtaWMubG9hZGluZy5DbGFzc0xvYWRpbmdTdHJhdGVneTsKIGltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmltcGxlbWVudGF0aW9uLk1ldGhvZERlbGVnYXRpb247CiBpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5iaW5kLmFubm90YXRpb24uU3VwZXJDYWxsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuTXV0YXRpb247CkBAIC01OSw2ICs1OCw3IEBACiAKIGltcG9ydCBzdGF0aWMgbmV0LmJ5dGVidWRkeS5tYXRjaGVyLkVsZW1lbnRNYXRjaGVycy5uYW1lZDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFMTE9XX0FMVEVSX1JGX0RVUklOR19SQU5HRV9NT1ZFTUVOVDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2Uub3BlbjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuQUxMOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbC5RVU9SVU07CkBAIC0yNTMsNyArMjUzLDcgQEAKICAgICAgICAgICAgIGFzc2VydFJvd3MoY2x1c3Rlci5nZXQoMikuZXhlY3V0ZUludGVybmFsKHF1ZXJ5KSk7CiAKICAgICAgICAgICAgIC8vIGFsdGVyIFJGCi0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJhbGxvd19hbHRlcl9yZl9kdXJpbmdfcmFuZ2VfbW92ZW1lbnQiLCAidHJ1ZSIpOworICAgICAgICAgICAgQUxMT1dfQUxURVJfUkZfRFVSSU5HX1JBTkdFX01PVkVNRU5ULnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkFMVEVSIEtFWVNQQUNFICVzIFdJVEggcmVwbGljYXRpb24gPSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieydjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InOiAyfSIpKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1JlcGFpckNvb3JkaW5hdG9yQmFzZS5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1JlcGFpckNvb3JkaW5hdG9yQmFzZS5qYXZhCmluZGV4IGYxMjY2ZmEuLjBmYzI1NTQgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9SZXBhaXJDb29yZGluYXRvckJhc2UuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUmVwYWlyQ29vcmRpbmF0b3JCYXNlLmphdmEKQEAgLTM0LDYgKzM0LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LkRpc3RyaWJ1dGVkUmVwYWlyVXRpbHMuUmVwYWlyUGFyYWxsZWxpc207CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5EaXN0cmlidXRlZFJlcGFpclV0aWxzLlJlcGFpclR5cGU7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5OT0RFVE9PTF9KTVhfTk9USUZJQ0FUSU9OX1BPTExfSU5URVJWQUxfU0VDT05EUzsKKwogcHVibGljIGNsYXNzIFJlcGFpckNvb3JkaW5hdG9yQmFzZSBleHRlbmRzIFRlc3RCYXNlSW1wbAogewogICAgIHByb3RlY3RlZCBzdGF0aWMgQ2x1c3RlciBDTFVTVEVSOwpAQCAtNjcsNyArNjksNyBAQAogICAgICAgICAvLyBUaGlzIG9ubHkgd29ya3MgYmVjYXVzZSB0aGUgd2F5IENJIHdvcmtzCiAgICAgICAgIC8vIEluIENJIGEgbmV3IEpWTSBpcyBzcHVuIHVwIGZvciBlYWNoIHRlc3QgZmlsZSwgc28gdGhpcyBkb2Vzbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYW5vdGhlciB0ZXN0IGZpbGUKICAgICAgICAgLy8gZ2V0dGluZyB0aGlzIHNldCBmaXJzdAotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5ub2RldG9vbC5qbXhfbm90aWZpY2F0aW9uX3BvbGxfaW50ZXJ2YWxfc2Vjb25kcyIsICIxIik7CisgICAgICAgIE5PREVUT09MX0pNWF9OT1RJRklDQVRJT05fUE9MTF9JTlRFUlZBTF9TRUNPTkRTLnNldExvbmcoMSk7CiAgICAgfQogCiAgICAgQEJlZm9yZUNsYXNzCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUmVwYWlyRGlnZXN0VHJhY2tpbmdUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvUmVwYWlyRGlnZXN0VHJhY2tpbmdUZXN0LmphdmEKaW5kZXggZjZkYTg4OC4uYjcwMjg1NSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1JlcGFpckRpZ2VzdFRyYWNraW5nVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9SZXBhaXJEaWdlc3RUcmFja2luZ1Rlc3QuamF2YQpAQCAtMjAsMTAgKzIwLDggQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkN5Y2xpY0JhcnJpZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CkBAIC0zMSwxNCArMjksNiBAQAogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TRVBFeGVjdXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5BYnN0cmFjdFJlcGxpY2F0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5FbmRwb2ludHNGb3JUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlJlcGxpY2FMYXlvdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC00NiwyMSArMzYsMzIgQEAKIGltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmR5bmFtaWMubG9hZGluZy5DbGFzc0xvYWRpbmdTdHJhdGVneTsKIGltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmltcGxlbWVudGF0aW9uLk1ldGhvZERlbGVnYXRpb247CiBpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5iaW5kLmFubm90YXRpb24uU3VwZXJDYWxsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5TRVBFeGVjdXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWFkQ29tbWFuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWFkRXhlY3V0aW9uQ29udHJvbGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUludm9rYWJsZUluc3RhbmNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSXNvbGF0ZWRFeGVjdXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlN0YXRzQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkFic3RyYWN0UmVwbGljYXRpb25TdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkVuZHBvaW50c0ZvclRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYUxheW91dDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlJlcGxpY2FVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlUHJveHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlUHJveHkuTG9jYWxSZWFkUnVubmFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRGlhZ25vc3RpY1NuYXBzaG90U2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogCiBpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMubmFtZWQ7CiBpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMudGFrZXNBcmd1bWVudHM7CkBAIC01MTYsMTAgKzUxNyw3IEBACiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBzc3RhYmxlcy5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHNzdGFibGUuZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IG1ldGFkYXRhID0gZGVzY3JpcHRvci5nZXRNZXRhZGF0YVNlcmlhbGl6ZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2VyaWFsaXplKGRlc2NyaXB0b3IsIEVudW1TZXQub2YoTWV0YWRhdGFUeXBlLlNUQVRTKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzdGF0cyA9IChTdGF0c01ldGFkYXRhKSBtZXRhZGF0YS5nZXQoTWV0YWRhdGFUeXBlLlNUQVRTKTsKKyAgICAgICAgICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzdGF0cyA9IFN0YXRzQ29tcG9uZW50LmxvYWQoZGVzY3JpcHRvcikuc3RhdHNNZXRhZGF0YSgpOwogICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJyZXBhaXJlZCBhdCBpcyBzZXQgZm9yIHNzdGFibGU6ICIgKyBkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLnJlcGFpcmVkQXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZlUmVwYWlyU2VydmljZS5VTlJFUEFJUkVEX1NTVEFCTEUpOwpAQCAtNTY4LDEwICs1NjYsNyBAQAogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gc3N0YWJsZXMubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBzc3RhYmxlLmRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgICAgIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBtZXRhZGF0YSA9IGRlc2NyaXB0b3IuZ2V0TWV0YWRhdGFTZXJpYWxpemVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kZXNlcmlhbGl6ZShkZXNjcmlwdG9yLCBFbnVtU2V0Lm9mKE1ldGFkYXRhVHlwZS5TVEFUUykpOwotCi0gICAgICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgc3RhdHMgPSAoU3RhdHNNZXRhZGF0YSkgbWV0YWRhdGEuZ2V0KE1ldGFkYXRhVHlwZS5TVEFUUyk7CisgICAgICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgc3RhdHMgPSBTdGF0c0NvbXBvbmVudC5sb2FkKGRlc2NyaXB0b3IpLnN0YXRzTWV0YWRhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoInJlcGFpcmVkIGF0IGlzIG5vdCBzZXQgZm9yIHNzdGFibGU6ICIgKyBkZXNjcmlwdG9yLCBzdGF0cy5yZXBhaXJlZEF0ID4gMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1NTVGFibGVJZEdlbmVyYXRpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvU1NUYWJsZUlkR2VuZXJhdGlvblRlc3QuamF2YQppbmRleCBkZDM3YmQzLi5kYjIyNDRiIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvU1NUYWJsZUlkR2VuZXJhdGlvblRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvU1NUYWJsZUlkR2VuZXJhdGlvblRlc3QuamF2YQpAQCAtMzYsNyArMzYsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlN5c3RlbUtleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQWJzdHJhY3RDb21wYWN0aW9uU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5EYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3k7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5UaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5OwpAQCAtMTUxLDcgKzE1MCw2IEBACiAgICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdENvbXBhY3Rpb25TdHJhdGVnaWVzV2l0aE1peGVkU1NUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICB0ZXN0Q29tcGFjdGlvblN0cmF0ZWdpZXNXaXRoTWl4ZWRTU1RhYmxlcyhTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzKTsKICAgICB9CkBAIC00MzIsOCArNDMwLDE2IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFNTVGFibGVzQ291bnQoU2V0PERlc2NyaXB0b3I+IGRlc2NzLCBTdHJpbmcgdGFibGVOYW1lLCBpbnQgZXhwZWN0ZWRTZXFHZW5JZHMsIGludCBleHBlY3RlZFVVSURHZW5JZHMpCiAgICAgewotICAgICAgICBMaXN0PFN0cmluZz4gc2VxU1NUYWJsZXMgPSBkZXNjcy5zdHJlYW0oKS5maWx0ZXIoZGVzYyAtPiBkZXNjLmlkIGluc3RhbmNlb2YgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCkubWFwKERlc2NyaXB0b3I6OmJhc2VGaWxlbmFtZSkuc29ydGVkKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHV1aWRTU1RhYmxlcyA9IGRlc2NzLnN0cmVhbSgpLmZpbHRlcihkZXNjIC0+IGRlc2MuaWQgaW5zdGFuY2VvZiBVVUlEQmFzZWRTU1RhYmxlSWQpLm1hcChEZXNjcmlwdG9yOjpiYXNlRmlsZW5hbWUpLnNvcnRlZCgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBzZXFTU1RhYmxlcyA9IGRlc2NzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihkZXNjIC0+IGRlc2MuaWQgaW5zdGFuY2VvZiBTZXF1ZW5jZUJhc2VkU1NUYWJsZUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoZGVzY3JpcHRvciAtPiBkZXNjcmlwdG9yLmJhc2VGaWxlKCkudG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHV1aWRTU1RhYmxlcyA9IGRlc2NzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZGVzYyAtPiBkZXNjLmlkIGluc3RhbmNlb2YgVVVJREJhc2VkU1NUYWJsZUlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGRlc2NyaXB0b3IgLT4gZGVzY3JpcHRvci5iYXNlRmlsZSgpLnRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0ZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKICAgICAgICAgYXNzZXJ0VGhhdChzZXFTU1RhYmxlcykuZGVzY3JpYmVkQXMoIlNTVGFibGVzIG9mICVzIHdpdGggc2VxdWVuY2UgYmFzZWQgaWQiLCB0YWJsZU5hbWUpLmhhc1NpemUoZXhwZWN0ZWRTZXFHZW5JZHMpOwogICAgICAgICBhc3NlcnRUaGF0KHV1aWRTU1RhYmxlcykuZGVzY3JpYmVkQXMoIlNTVGFibGVzIG9mICVzIHdpdGggVVVJRCBiYXNlZCBpZCIsIHRhYmxlTmFtZSkuaGFzU2l6ZShleHBlY3RlZFVVSURHZW5JZHMpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9TZWNvbmRhcnlJbmRleENvbXBhY3Rpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvU2Vjb25kYXJ5SW5kZXhDb21wYWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmMwZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvU2Vjb25kYXJ5SW5kZXhDb21wYWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LmludGVybmFsLkNhc3NhbmRyYUluZGV4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKKworcHVibGljIGNsYXNzIFNlY29uZGFyeUluZGV4Q29tcGFjdGlvblRlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QyaUNvbXBhY3Rpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gaW5pdChDbHVzdGVyLmJ1aWxkKDEpLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoImNyZWF0ZSB0YWJsZSAlcy50YmwgKGlkIGludCwgY2sgaW50LCBzb21ldGhpbmcgaW50LCBlbHNlIGludCwgcHJpbWFyeSBrZXkgKGlkLCBjaykpOyIpKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiY3JlYXRlIGluZGV4IHRibF9pZHggb24gJXMudGJsIChjaykiKSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJpbnNlcnQgaW50byAlcy50YmwgKGlkLCBjaywgc29tZXRoaW5nLCBlbHNlKSB2YWx1ZXMgKD8sID8sID8sID8pIiksIENvbnNpc3RlbmN5TGV2ZWwuQUxMLCBpLCBpLCBpLCBpKTsKKworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkucnVuT25JbnN0YW5jZSgoKSAtPiB7CisgICAgICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoInRibCIpOworICAgICAgICAgICAgICAgIENhc3NhbmRyYUluZGV4IGkgPSAoQ2Fzc2FuZHJhSW5kZXgpIGNmcy5pbmRleE1hbmFnZXIuZ2V0SW5kZXhCeU5hbWUoInRibF9pZHgiKTsKKyAgICAgICAgICAgICAgICBpLmdldEluZGV4Q2ZzKCkuZm9yY2VCbG9ja2luZ0ZsdXNoKENvbHVtbkZhbWlseVN0b3JlLkZsdXNoUmVhc29uLlVOSVRfVEVTVFMpOworICAgICAgICAgICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBpZHhTU1RhYmxlcyA9IGkuZ2V0SW5kZXhDZnMoKS5nZXRMaXZlU1NUYWJsZXMoKTsKKyAgICAgICAgICAgICAgICAvLyBlbXVsYXRlIG9uZ29pbmcgaW5kZXggY29tcGFjdGlvbjoKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgaCA9IG5ldyBNb2NrSG9sZGVyKGkuZ2V0SW5kZXhDZnMoKS5tZXRhZGF0YSgpLCBpZHhTU1RhYmxlcyk7CisgICAgICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmJlZ2luQ29tcGFjdGlvbihoKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZXN0aW1hdGVkUmVtYWluaW5nV3JpdGVCeXRlcygpOworICAgICAgICAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5maW5pc2hDb21wYWN0aW9uKGgpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTW9ja0hvbGRlciBleHRlbmRzIENvbXBhY3Rpb25JbmZvLkhvbGRlcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgVGFibGVNZXRhZGF0YSBtZXRhZGF0YTsKKworICAgICAgICBwdWJsaWMgTW9ja0hvbGRlcihUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBTZXQ8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YTsKKyAgICAgICAgICAgIHRoaXMuc3N0YWJsZXMgPSBzc3RhYmxlczsKKyAgICAgICAgfQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uSW5mbyhtZXRhZGF0YSwgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OLCAwLCAxMDAwLCBuZXh0VGltZVVVSUQoKSwgc3N0YWJsZXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9TdHJlYW1zRGlza1NwYWNlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1N0cmVhbXNEaXNrU3BhY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ3MjY2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9TdHJlYW1zRGlza1NwYWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgbmV0LmJ5dGVidWRkeS5CeXRlQnVkZHk7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NMb2FkaW5nU3RyYXRlZ3k7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5NZXRob2REZWxlZ2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5BY3RpdmVDb21wYWN0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtTWFuYWdlcjsKKworaW1wb3J0IHN0YXRpYyBuZXQuYnl0ZWJ1ZGR5Lm1hdGNoZXIuRWxlbWVudE1hdGNoZXJzLm5hbWVkOworaW1wb3J0IHN0YXRpYyBuZXQuYnl0ZWJ1ZGR5Lm1hdGNoZXIuRWxlbWVudE1hdGNoZXJzLnRha2VzQXJndW1lbnRzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5HT1NTSVA7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLk5FVFdPUks7CisKK3B1YmxpYyBjbGFzcyBTdHJlYW1zRGlza1NwYWNlVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFib3J0U3RyZWFtcygpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeShDbHVzdGVyIGNsdXN0ZXIgPSBpbml0KENsdXN0ZXIuYnVpbGQoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcuc2V0KCJoaW50ZWRfaGFuZG9mZl9lbmFibGVkIiwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGgoR09TU0lQKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoKE5FVFdPUkspKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhJbnN0YW5jZUluaXRpYWxpemVyKChjbCwgaWQpIC0+IEJCLmRvSW5zdGFsbChjbCwgaWQsIFN0cmVhbU1hbmFnZXIuY2xhc3MsICJnZXRUb3RhbFJlbWFpbmluZ09uZ29pbmdCeXRlcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiY3JlYXRlIHRhYmxlICIgKyBLRVlTUEFDRSArICIudGJsIChpZCBpbnQgcHJpbWFyeSBrZXksIHQgaW50KSB3aXRoIGNvbXBhY3Rpb249eydjbGFzcyc6ICdTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J30iKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5leGVjdXRlSW50ZXJuYWwoIklOU0VSVCBJTlRPICIgKyBLRVlTUEFDRSArICIudGJsIChpZCwgdCkgdmFsdWVzICg/LD8pIiwgaSwgaSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5mbHVzaChLRVlTUEFDRSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5ydW5Pbkluc3RhbmNlKCgpIC0+IEJCLm9uZ29pbmcuc2V0KExvbmcuTUFYX1ZBTFVFIC8gMikpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2xSZXN1bHQoInJlcGFpciIsICItZnVsbCIpLmFzc2VydHMoKS5mYWlsdXJlKCk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5ub2RldG9vbFJlc3VsdCgicmVwYWlyIiwgIi1mdWxsIikuYXNzZXJ0cygpLmZhaWx1cmUoKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDIpLnJ1bk9uSW5zdGFuY2UoKCkgLT4gQkIub25nb2luZy5zZXQoMCkpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2xSZXN1bHQoInJlcGFpciIsICItZnVsbCIpLmFzc2VydHMoKS5zdWNjZXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBYm9ydFN0cmVhbXNXaGVuT25nb2luZ0NvbXBhY3Rpb25zTGVhdmVJbnN1ZmZpY2llbnRTcGFjZSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeShDbHVzdGVyIGNsdXN0ZXIgPSBpbml0KENsdXN0ZXIuYnVpbGQoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcuc2V0KCJoaW50ZWRfaGFuZG9mZl9lbmFibGVkIiwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGgoR09TU0lQKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoKE5FVFdPUkspKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhJbnN0YW5jZUluaXRpYWxpemVyKChjbCwgaWQpIC0+IEJCLmRvSW5zdGFsbChjbCwgaWQsIEFjdGl2ZUNvbXBhY3Rpb25zLmNsYXNzLCAiZXN0aW1hdGVkUmVtYWluaW5nV3JpdGVCeXRlcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiY3JlYXRlIHRhYmxlICIgKyBLRVlTUEFDRSArICIudGJsIChpZCBpbnQgcHJpbWFyeSBrZXksIHQgaW50KSB3aXRoIGNvbXBhY3Rpb249eydjbGFzcyc6ICdTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J30iKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5leGVjdXRlSW50ZXJuYWwoIklOU0VSVCBJTlRPICIgKyBLRVlTUEFDRSArICIudGJsIChpZCwgdCkgdmFsdWVzICg/LD8pIiwgaSwgaSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5mbHVzaChLRVlTUEFDRSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgidGJsIik7CisgICAgICAgICAgICAgICAgQkIuZGF0YWRpciA9IGNmcy5nZXREaXJlY3RvcmllcygpLmdldExvY2F0aW9uRm9yRGlzayhjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXRXcml0ZWFibGVMb2NhdGlvbigwKSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDIpLnJ1bk9uSW5zdGFuY2UoKCkgLT4gQkIub25nb2luZy5zZXQoTG9uZy5NQVhfVkFMVUUgLyAyKSk7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLWZ1bGwiKS5hc3NlcnRzKCkuZmFpbHVyZSgpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMikubm9kZXRvb2xSZXN1bHQoInJlcGFpciIsICItZnVsbCIpLmFzc2VydHMoKS5mYWlsdXJlKCk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5ydW5Pbkluc3RhbmNlKCgpIC0+IEJCLm9uZ29pbmcuc2V0KDApKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLWZ1bGwiKS5hc3NlcnRzKCkuc3VjY2VzcygpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJvcnRTdHJlYW1zV2hlblRvb01hbnlQZW5kaW5nQ29tcGFjdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkoQ2x1c3RlciBjbHVzdGVyID0gaW5pdChDbHVzdGVyLmJ1aWxkKDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjb25maWcgLT4gY29uZmlnLnNldCgiaGludGVkX2hhbmRvZmZfZW5hYmxlZCIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoInJlamVjdF9yZXBhaXJfY29tcGFjdGlvbl90aHJlc2hvbGQiLCAxMDI0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoKEdPU1NJUCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aChORVRXT1JLKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoSW5zdGFuY2VJbml0aWFsaXplcihCQjo6aW5zdGFsbENTTUdldEVzdGltYXRlZFJlbWFpbmluZ1Rhc2tzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiY3JlYXRlIHRhYmxlICIgKyBLRVlTUEFDRSArICIudGJsIChpZCBpbnQgcHJpbWFyeSBrZXksIHQgaW50KSB3aXRoIGNvbXBhY3Rpb249eydjbGFzcyc6ICdTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J30iKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5leGVjdXRlSW50ZXJuYWwoIklOU0VSVCBJTlRPICIgKyBLRVlTUEFDRSArICIudGJsIChpZCwgdCkgdmFsdWVzICg/LD8pIiwgaSwgaSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5mbHVzaChLRVlTUEFDRSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBCQi5vbmdvaW5nLnNldChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UmVwYWlyUGVuZGluZ0NvbXBhY3Rpb25SZWplY3RUaHJlc2hvbGQoKSArIDEpOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLWZ1bGwiKS5hc3NlcnRzKCkuZmFpbHVyZSgpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMikubm9kZXRvb2xSZXN1bHQoInJlcGFpciIsICItZnVsbCIpLmFzc2VydHMoKS5mYWlsdXJlKCk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5ydW5Pbkluc3RhbmNlKCgpIC0+IEJCLm9uZ29pbmcuc2V0KDApKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLWZ1bGwiKS5hc3NlcnRzKCkuc3VjY2VzcygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCQgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBBdG9taWNMb25nIG9uZ29pbmcgPSBuZXcgQXRvbWljTG9uZygpOworICAgICAgICBwdWJsaWMgc3RhdGljIEZpbGUgZGF0YWRpcjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb0luc3RhbGwoQ2xhc3NMb2FkZXIgY2wsIGludCBpZCwgQ2xhc3M8Pz4gY2xhenosIFN0cmluZyBtZXRob2QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpZCAhPSAyKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG5ldyBCeXRlQnVkZHkoKS5yZWJhc2UoY2xhenopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKG1ldGhvZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW50ZXJjZXB0KE1ldGhvZERlbGVnYXRpb24udG8oQkIuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ha2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvYWQoY2wsIENsYXNzTG9hZGluZ1N0cmF0ZWd5LkRlZmF1bHQuSU5KRUNUSU9OKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRUb3RhbFJlbWFpbmluZ09uZ29pbmdCeXRlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBvbmdvaW5nLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBNYXA8RmlsZSwgTG9uZz4gZXN0aW1hdGVkUmVtYWluaW5nV3JpdGVCeXRlcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1hcDxGaWxlLCBMb25nPiByZXQgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBpZiAoZGF0YWRpciAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJldC5wdXQoZGF0YWRpciwgb25nb2luZy5nZXQoKSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MoaW50IGFkZGl0aW9uYWxTU1RhYmxlcywgbG9uZyBhZGRpdGlvbmFsQnl0ZXMsIGJvb2xlYW4gaXNJbmNyZW1lbnRhbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChpbnQpIG9uZ29pbmcuZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluc3RhbGxDU01HZXRFc3RpbWF0ZWRSZW1haW5pbmdUYXNrcyhDbGFzc0xvYWRlciBjbCwgaW50IG5vZGVOdW1iZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChub2RlTnVtYmVyID09IDIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IEJ5dGVCdWRkeSgpLnJlZGVmaW5lKENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ldGhvZChuYW1lZCgiZ2V0RXN0aW1hdGVkUmVtYWluaW5nVGFza3MiKS5hbmQodGFrZXNBcmd1bWVudHMoMykpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRlcmNlcHQoTWV0aG9kRGVsZWdhdGlvbi50byhCQi5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ha2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1RhYmxlTGV2ZWxJbmNyZW1lbnRhbEJhY2t1cHNUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvVGFibGVMZXZlbEluY3JlbWVudGFsQmFja3Vwc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTJmODY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1RhYmxlTGV2ZWxJbmNyZW1lbnRhbEJhY2t1cHNUZXN0LmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TZXF1ZW5jZUJhc2VkU1NUYWJsZUlkOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWwuZ2V0QmFja3VwczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3Rlci5idWlsZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuQUxMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LkV4ZWNVdGlsLnJldGhyb3c7CitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgVGFibGVMZXZlbEluY3JlbWVudGFsQmFja3Vwc1Rlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwgIAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluY3JlbWVudGFsQmFja3VwRW5hYmxlZENyZWF0ZVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGMgPSBnZXRDbHVzdGVyKHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50ZXN0X3RhYmxlIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGluY3JlbWVudGFsX2JhY2t1cHMgPSB0cnVlIikpOworICAgICAgICAgICAgZGlzYWJsZUNvbXBhY3Rpb24oYywgS0VZU1BBQ0UsICJ0ZXN0X3RhYmxlIik7CisgICAgICAgICAgICBjLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50ZXN0X3RhYmxlIChhLCBiKSBWQUxVRVMgKCdhJywgMSkiKSwgQUxMKTsKKyAgICAgICAgICAgIGZsdXNoKGMsIEtFWVNQQUNFKTsKKyAgICAgICAgICAgIGFzc2VydEJhY2t1cFNTVGFibGVzQ291bnQoYywgMSwgdHJ1ZSwgS0VZU1BBQ0UsICJ0ZXN0X3RhYmxlIik7CisKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRlc3RfdGFibGUgKGEsIGIpIFZBTFVFUyAoJ2EnLCAxKSIpLCBBTEwpOworICAgICAgICAgICAgZmx1c2goYywgS0VZU1BBQ0UpOworICAgICAgICAgICAgYXNzZXJ0QmFja3VwU1NUYWJsZXNDb3VudChjLCAyLCB0cnVlLCBLRVlTUEFDRSwgInRlc3RfdGFibGUiKTsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiRFJPUCBUQUJMRSAlcy50ZXN0X3RhYmxlIikpOworCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRlc3RfdGFibGUyIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGluY3JlbWVudGFsX2JhY2t1cHMgPSBmYWxzZSIpKTsKKyAgICAgICAgICAgIGRpc2FibGVDb21wYWN0aW9uKGMsIEtFWVNQQUNFLCAidGVzdF90YWJsZTIiKTsKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRlc3RfdGFibGUyIChhLCBiKSBWQUxVRVMgKCdhJywgMSkiKSwgQUxMKTsKKyAgICAgICAgICAgIGZsdXNoKGMsIEtFWVNQQUNFKTsKKyAgICAgICAgICAgIGFzc2VydEJhY2t1cFNTVGFibGVzQ291bnQoYywgMCwgZmFsc2UsIEtFWVNQQUNFLCAidGVzdF90YWJsZTIiKTsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiRFJPUCBUQUJMRSAlcy50ZXN0X3RhYmxlMiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluY3JlbWVudGFsQmFja3VwRW5hYmxlZEFsdGVyVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgYyA9IGdldENsdXN0ZXIodHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRlc3RfdGFibGUgKGEgdGV4dCBwcmltYXJ5IGtleSwgYiBpbnQpIFdJVEggaW5jcmVtZW50YWxfYmFja3VwcyA9IGZhbHNlIikpOworICAgICAgICAgICAgZGlzYWJsZUNvbXBhY3Rpb24oYywgS0VZU1BBQ0UsICJ0ZXN0X3RhYmxlIik7CisgICAgICAgICAgICBjLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50ZXN0X3RhYmxlIChhLCBiKSBWQUxVRVMgKCdhJywgMSkiKSwgQUxMKTsKKyAgICAgICAgICAgIGZsdXNoKGMsIEtFWVNQQUNFKTsKKyAgICAgICAgICAgIGFzc2VydEJhY2t1cFNTVGFibGVzQ291bnQoYywgMCwgZmFsc2UsIEtFWVNQQUNFLCAidGVzdF90YWJsZSIpOworCisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkFMVEVSIFRBQkxFICVzLnRlc3RfdGFibGUgIFdJVEggaW5jcmVtZW50YWxfYmFja3VwcyA9IHRydWUiKSk7CisgICAgICAgICAgICBjLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50ZXN0X3RhYmxlIChhLCBiKSBWQUxVRVMgKCdhJywgMSkiKSwgQUxMKTsKKyAgICAgICAgICAgIGZsdXNoKGMsIEtFWVNQQUNFKTsKKyAgICAgICAgICAgIGFzc2VydEJhY2t1cFNTVGFibGVzQ291bnQoYywgMSwgdHJ1ZSwgS0VZU1BBQ0UsICJ0ZXN0X3RhYmxlIik7CisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkRST1AgVEFCTEUgJXMudGVzdF90YWJsZSIpKTsKKworCisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50ZXN0X3RhYmxlMiAoYSB0ZXh0IHByaW1hcnkga2V5LCBiIGludCkgV0lUSCBpbmNyZW1lbnRhbF9iYWNrdXBzID0gdHJ1ZSIpKTsKKyAgICAgICAgICAgIGRpc2FibGVDb21wYWN0aW9uKGMsIEtFWVNQQUNFLCAidGVzdF90YWJsZTIiKTsKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRlc3RfdGFibGUyIChhLCBiKSBWQUxVRVMgKCdhJywgMSkiKSwgQUxMKTsKKyAgICAgICAgICAgIGZsdXNoKGMsIEtFWVNQQUNFKTsKKyAgICAgICAgICAgIGFzc2VydEJhY2t1cFNTVGFibGVzQ291bnQoYywgMSwgdHJ1ZSwgS0VZU1BBQ0UsICJ0ZXN0X3RhYmxlMiIpOworCisgICAgICAgICAgICBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkFMVEVSIFRBQkxFICVzLnRlc3RfdGFibGUyICBXSVRIIGluY3JlbWVudGFsX2JhY2t1cHMgPSBmYWxzZSIpKTsKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRlc3RfdGFibGUyIChhLCBiKSBWQUxVRVMgKCdhJywgMSkiKSwgQUxMKTsKKyAgICAgICAgICAgIGZsdXNoKGMsIEtFWVNQQUNFKTsKKyAgICAgICAgICAgIGFzc2VydEJhY2t1cFNTVGFibGVzQ291bnQoYywgMSwgZmFsc2UsIEtFWVNQQUNFLCAidGVzdF90YWJsZTIiKTsKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiRFJPUCBUQUJMRSAlcy50ZXN0X3RhYmxlMiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluY3JlbWVudGFsQmFja3VwV2hlbkNyZWF0ZVRhYmxlQnlEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGMgPSBnZXRDbHVzdGVyKHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICAvL2luY3JlbWVudGFsX2JhY2t1cHMgaXMgc2V0IHRvIHRydWUgYnkgZGVmYXVsdAorICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudGVzdF90YWJsZSAoYSB0ZXh0IHByaW1hcnkga2V5LCBiIGludCkiKSk7CisgICAgICAgICAgICBkaXNhYmxlQ29tcGFjdGlvbihjLCBLRVlTUEFDRSwgInRlc3RfdGFibGUiKTsKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRlc3RfdGFibGUgKGEsIGIpIFZBTFVFUyAoJ2EnLCAxKSIpLCBBTEwpOworICAgICAgICAgICAgZmx1c2goYywgS0VZU1BBQ0UpOworICAgICAgICAgICAgYXNzZXJ0QmFja3VwU1NUYWJsZXNDb3VudChjLCAxLCB0cnVlLCBLRVlTUEFDRSwgInRlc3RfdGFibGUiKTsKKworICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJBTFRFUiBUQUJMRSAlcy50ZXN0X3RhYmxlICBXSVRIIGluY3JlbWVudGFsX2JhY2t1cHMgPSBmYWxzZSIpKTsKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRlc3RfdGFibGUgKGEsIGIpIFZBTFVFUyAoJ2EnLCAxKSIpLCBBTEwpOworICAgICAgICAgICAgZmx1c2goYywgS0VZU1BBQ0UpOworICAgICAgICAgICAgYXNzZXJ0QmFja3VwU1NUYWJsZXNDb3VudChjLCAxLCBmYWxzZSwgS0VZU1BBQ0UsICJ0ZXN0X3RhYmxlIik7CisKKyAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQUxURVIgVEFCTEUgJXMudGVzdF90YWJsZSAgV0lUSCBpbmNyZW1lbnRhbF9iYWNrdXBzID0gdHJ1ZSIpKTsKKyAgICAgICAgICAgIGMuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRlc3RfdGFibGUgKGEsIGIpIFZBTFVFUyAoJ2EnLCAxKSIpLCBBTEwpOworICAgICAgICAgICAgZmx1c2goYywgS0VZU1BBQ0UpOworICAgICAgICAgICAgYXNzZXJ0QmFja3VwU1NUYWJsZXNDb3VudChjLCAyLCB0cnVlLCBLRVlTUEFDRSwgInRlc3RfdGFibGUiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJEUk9QIFRBQkxFICVzLnRlc3RfdGFibGUiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENsdXN0ZXIgZ2V0Q2x1c3Rlcihib29sZWFuIGluY3JlbWVudGFsQmFja3VwcykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gaW5pdChidWlsZCgyKS53aXRoRGF0YURpckNvdW50KDEpLndpdGhDb25maWcoYyAtPiBjLndpdGgoRmVhdHVyZS5HT1NTSVApCisgICAgICAgICAgICAgICAgLnNldCgiaW5jcmVtZW50YWxfYmFja3VwcyIsIGluY3JlbWVudGFsQmFja3VwcykpLnN0YXJ0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmbHVzaChDbHVzdGVyIGNsdXN0ZXIsIFN0cmluZyBrZXlzcGFjZSkgCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGNsdXN0ZXIuc2l6ZSgpICsgMTsgaSsrKQorICAgICAgICAgICAgY2x1c3Rlci5nZXQoaSkuZmx1c2goa2V5c3BhY2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkaXNhYmxlQ29tcGFjdGlvbihDbHVzdGVyIGNsdXN0ZXIsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjbHVzdGVyLnNpemUoKSArIDE7IGkrKykKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KGkpLm5vZGV0b29sKCJkaXNhYmxlYXV0b2NvbXBhY3Rpb24iLCBrZXlzcGFjZSwgdGFibGUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljICB2b2lkIGFzc2VydEJhY2t1cFNTVGFibGVzQ291bnQoQ2x1c3RlciBjbHVzdGVyLCBpbnQgZXhwZWN0ZWRTZXFHZW5JZHMsIGJvb2xlYW4gZW5hYmxlLCBTdHJpbmcga3MsIFN0cmluZy4uLiB0YWJsZU5hbWVzKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjbHVzdGVyLnNpemUoKSArIDE7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY2x1c3Rlci5nZXQoaSkucnVuT25JbnN0YW5jZShyZXRocm93KCgpIC0+IEFycmF5cy5zdHJlYW0odGFibGVOYW1lcykuZm9yRWFjaCh0YWJsZU5hbWUgLT4gIGFzc2VydFRhYmxlTWV0YUluY3JlbWVudGFsQmFja3VwRW5hYmxlKGtzLCB0YWJsZU5hbWUsIGVuYWJsZSkpKSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldChpKS5ydW5Pbkluc3RhbmNlKHJldGhyb3coKCkgLT4gQXJyYXlzLnN0cmVhbSh0YWJsZU5hbWVzKS5mb3JFYWNoKHRhYmxlTmFtZSAtPiBhc3NlcnRTU1RhYmxlc0NvdW50KGdldEJhY2t1cHMoa3MsIHRhYmxlTmFtZSksIHRhYmxlTmFtZSwgZXhwZWN0ZWRTZXFHZW5JZHMpKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRTU1RhYmxlc0NvdW50KFNldDxEZXNjcmlwdG9yPiBkZXNjcywgU3RyaW5nIHRhYmxlTmFtZSwgaW50IGV4cGVjdGVkU2VxR2VuSWRzKQorICAgIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHNlcVNTVGFibGVzID0gZGVzY3Muc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGRlc2MgLT4gZGVzYy5pZCBpbnN0YW5jZW9mIFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChkZXNjcmlwdG9yIC0+IGRlc2NyaXB0b3IuYmFzZUZpbGUoKS50b1N0cmluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0ZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICBhc3NlcnRUaGF0KHNlcVNTVGFibGVzKS5kZXNjcmliZWRBcygiU1NUYWJsZXMgb2YgJXMgd2l0aCBzZXF1ZW5jZSBiYXNlZCBpZCIsIHRhYmxlTmFtZSkuaGFzU2l6ZShleHBlY3RlZFNlcUdlbklkcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRUYWJsZU1ldGFJbmNyZW1lbnRhbEJhY2t1cEVuYWJsZShTdHJpbmcga3MsIFN0cmluZyB0YWJsZU5hbWUsIGJvb2xlYW4gZW5hYmxlKQorICAgIHsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY29sdW1uRmFtaWx5U3RvcmUgPSBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cyhrcywgdGFibGVOYW1lKTsKKyAgICAgICAgaWYgKGVuYWJsZSkKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29sdW1uRmFtaWx5U3RvcmUuaXNUYWJsZUluY3JlbWVudGFsQmFja3Vwc0VuYWJsZWQoKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGNvbHVtbkZhbWlseVN0b3JlLmlzVGFibGVJbmNyZW1lbnRhbEJhY2t1cHNFbmFibGVkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9UZXN0QmFzZUltcGwuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9UZXN0QmFzZUltcGwuamF2YQppbmRleCBlOTdhMDgxLi4zNWM1OTA0IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvVGVzdEJhc2VJbXBsLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1Rlc3RCYXNlSW1wbC5qYXZhCkBAIC0yNyw2ICsyNyw4IEBACiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVTZXQ7CiAKQEAgLTQyLDYgKzQ0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuRGlzdHJpYnV0ZWRUZXN0QmFzZTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkJPT1RTVFJBUF9TQ0hFTUFfREVMQVlfTVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSk9JTl9SSU5HOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hY3Rpb24uR29zc2lwSGVscGVyLndpdGhQcm9wZXJ0eTsKIAogcHVibGljIGNsYXNzIFRlc3RCYXNlSW1wbCBleHRlbmRzIERpc3RyaWJ1dGVkVGVzdEJhc2UKQEAgLTExOSw4ICsxMjIsOCBAQAogICAgICAgICBJSW5zdGFuY2VDb25maWcgY29uZmlnID0gY2x1c3Rlci5uZXdJbnN0YW5jZUNvbmZpZygpOwogICAgICAgICBjb25maWcuc2V0KCJhdXRvX2Jvb3RzdHJhcCIsIHRydWUpOwogICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgbmV3SW5zdGFuY2UgPSBjbHVzdGVyLmJvb3RzdHJhcChjb25maWcpOwotICAgICAgICB3aXRoUHJvcGVydHkoQk9PVFNUUkFQX1NDSEVNQV9ERUxBWV9NUy5nZXRLZXkoKSwgSW50ZWdlci50b1N0cmluZyg5MCAqIDEwMDApLAotICAgICAgICAgICAgICAgICAgICAgKCkgLT4gd2l0aFByb3BlcnR5KCJjYXNzYW5kcmEuam9pbl9yaW5nIiwgZmFsc2UsICgpIC0+IG5ld0luc3RhbmNlLnN0YXJ0dXAoY2x1c3RlcikpKTsKKyAgICAgICAgd2l0aFByb3BlcnR5KEJPT1RTVFJBUF9TQ0hFTUFfREVMQVlfTVMsIEludGVnZXIudG9TdHJpbmcoOTAgKiAxMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICgpIC0+IHdpdGhQcm9wZXJ0eShKT0lOX1JJTkcsIGZhbHNlLCAoKSAtPiBuZXdJbnN0YW5jZS5zdGFydHVwKGNsdXN0ZXIpKSk7CiAgICAgICAgIG5ld0luc3RhbmNlLm5vZGV0b29sUmVzdWx0KCJqb2luIikuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKICAgICB9CiAKQEAgLTE5MCw5ICsxOTMsMjAgQEAKICAgICB7CiAgICAgICAgIC8vIFRoZXNlIGtleXNwYWNlcyBhcmUgdW5kZXIgcmVwbGljYXRlZCBieSBkZWZhdWx0LCBzbyBtdXN0IGJlIHVwZGF0ZWQgd2hlbiBkb2luZyBhIG11bHRpLW5vZGUgY2x1c3RlcjsKICAgICAgICAgLy8gZWxzZSBib290c3RyYXAgd2lsbCBmYWlsIHdpdGggJ1VuYWJsZSB0byBmaW5kIHN1ZmZpY2llbnQgc291cmNlcyBmb3Igc3RyZWFtaW5nIHJhbmdlIDxyYW5nZT4gaW4ga2V5c3BhY2UgPG5hbWU+JworICAgICAgICBNYXA8U3RyaW5nLCBMb25nPiBkY0NvdW50cyA9IGNsdXN0ZXIuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChpIC0+IGkuY29uZmlnKCkubG9jYWxEYXRhY2VudGVyKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeShGdW5jdGlvbi5pZGVudGl0eSgpLCBDb2xsZWN0b3JzLmNvdW50aW5nKCkpKTsKKyAgICAgICAgU3RyaW5nIHJlcGxpY2EgPSAieydjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneSciOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExvbmc+IGUgOiBkY0NvdW50cy5lbnRyeVNldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgZGMgPSBlLmdldEtleSgpOworICAgICAgICAgICAgaW50IHJmID0gTWF0aC5taW4oZS5nZXRWYWx1ZSgpLmludFZhbHVlKCksIDMpOworICAgICAgICAgICAgcmVwbGljYSArPSAiLCAnIiArIGRjICsgIic6ICIgKyByZjsKKyAgICAgICAgfQorICAgICAgICByZXBsaWNhICs9ICJ9IjsKICAgICAgICAgZm9yIChTdHJpbmcga3MgOiBBcnJheXMuYXNMaXN0KCJzeXN0ZW1fYXV0aCIsICJzeXN0ZW1fdHJhY2VzIikpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJBTFRFUiBLRVlTUEFDRSAiICsga3MgKyAiIFdJVEggUkVQTElDQVRJT04gPSB7J2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6ICIgKyBNYXRoLm1pbihjbHVzdGVyLnNpemUoKSwgMykgKyAifSIpOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkFMVEVSIEtFWVNQQUNFICIgKyBrcyArICIgV0lUSCBSRVBMSUNBVElPTiA9ICIgKyByZXBsaWNhKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGluIHJlYWwgbGl2ZSByZXBhaXIgaXMgbmVlZGVkIGluIHRoaXMgY2FzZSwgYnV0IGluIHRoZSB0ZXN0IGNhc2UgaXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIHRhYmxlcyBsb29zZQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1RpbWVvdXRBYm9ydFRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9UaW1lb3V0QWJvcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5NjUzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9UaW1lb3V0QWJvcnRUZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfUkVBRF9JVEVSQVRJT05fREVMQVlfTVM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5wc2phdmEudXRpbC5Bc3NlcnRTdGF0dXMuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIFRpbWVvdXRBYm9ydFRlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRpbWVvdXRUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgVEVTVF9SRUFEX0lURVJBVElPTl9ERUxBWV9NUy5zZXRJbnQoNTAwMCk7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gaW5pdChDbHVzdGVyLmJ1aWxkKDEpLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoImNyZWF0ZSB0YWJsZSAlcy50YmwgKGlkIGludCwgY2sxIGludCwgY2syIGludCwgZCBpbnQsIHByaW1hcnkga2V5IChpZCwgY2sxLCBjazIpKSIpKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoImRlbGV0ZSBmcm9tICVzLnRibCB1c2luZyB0aW1lc3RhbXAgNSB3aGVyZSBpZCA9IDEgYW5kIGNrMSA9IDc3ICIpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5mbHVzaChLRVlTUEFDRSk7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoImluc2VydCBpbnRvICVzLnRibCAoaWQsIGNrMSwgY2syLCBkKSB2YWx1ZXMgKDEsNzcsPywxKSB1c2luZyB0aW1lc3RhbXAgMTAiKSwgQ29uc2lzdGVuY3lMZXZlbC5BTEwsIGkpOworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkuZmx1c2goS0VZU1BBQ0UpOworICAgICAgICAgICAgYm9vbGVhbiBjYXVnaHRFeGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoInNlbGVjdCAqIGZyb20gJXMudGJsIHdoZXJlIGlkPTEgYW5kIGNrMSA9IDc3IiksIENvbnNpc3RlbmN5TGV2ZWwuQUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29udGFpbnMoIlJlYWRUaW1lb3V0RXhjZXB0aW9uIikpOworICAgICAgICAgICAgICAgIGNhdWdodEV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNhdWdodEV4Y2VwdGlvbik7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gZXJyb3JzID0gY2x1c3Rlci5nZXQoMSkubG9ncygpLmdyZXBGb3JFcnJvcnMoKS5nZXRSZXN1bHQoKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGVycm9ycy50b1N0cmluZygpLCBlcnJvcnMuc3RyZWFtKCkuYW55TWF0Y2gocyAtPiBzLmNvbnRhaW5zKCJvcGVuIFJUIGJvdW5kIikpKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvVXBkYXRlU3lzdGVtQXV0aEFmdGVyRENFeHBhbnNpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvVXBkYXRlU3lzdGVtQXV0aEFmdGVyRENFeHBhbnNpb25UZXN0LmphdmEKaW5kZXggODc2NTA2Ny4uNTMxM2NlZSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1VwZGF0ZVN5c3RlbUF1dGhBZnRlckRDRXhwYW5zaW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9VcGRhdGVTeXN0ZW1BdXRoQWZ0ZXJEQ0V4cGFuc2lvblRlc3QuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Db25kaXRpb247CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtNDQsNiArNDUsNyBAQAogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTlVURVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQXV0aEtleXNwYWNlLlJPTEVTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuR09TU0lQOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5ORVRXT1JLOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQXNzZXJ0VXRpbHMuYXNzZXJ0Um93czsKQEAgLTExMyw3ICsxMTUsNyBAQAogICAgIHsKICAgICAgICAgLy8gcmVkdWNlIHRoZSB0aW1lIGZyb20gMTBzIHRvIHByZXZlbnQgIkNhbm5vdCBwcm9jZXNzIHJvbGUgcmVsYXRlZCBxdWVyeSBhcyB0aGUgcm9sZSBtYW5hZ2VyIGlzbid0IHlldCBzZXR1cC4iCiAgICAgICAgIC8vIGV4Y2VwdGlvbiBmcm9tIENhc3NhbmRyYVJvbGVNYW5hZ2VyCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN1cGVydXNlcl9zZXR1cF9kZWxheV9tcyIsICIwIik7CisgICAgICAgIFNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUy5zZXRMb25nKDApOwogICAgICAgICBUZXN0QmFzZUltcGwuYmVmb3JlQ2xhc3MoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9VcGdyYWRlU1NUYWJsZXNUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvVXBncmFkZVNTVGFibGVzVGVzdC5qYXZhCmluZGV4IGVlODlhODEuLjJiZGNhZjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9VcGdyYWRlU1NUYWJsZXNUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1VwZ3JhZGVTU1RhYmxlc1Rlc3QuamF2YQpAQCAtMTksMjIgKzE5LDIwOSBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0OwogCiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgbmV0LmJ5dGVidWRkeS5CeXRlQnVkZHk7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NMb2FkaW5nU3RyYXRlZ3k7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5NZXRob2REZWxlZ2F0aW9uOworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uYmluZC5hbm5vdGF0aW9uLlN1cGVyQ2FsbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkFjdGl2ZUNvbXBhY3Rpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklDbHVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW52b2thYmxlSW5zdGFuY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkxvZ0FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CisKK2ltcG9ydCBzdGF0aWMgbmV0LmJ5dGVidWRkeS5tYXRjaGVyLkVsZW1lbnRNYXRjaGVycy5uYW1lZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Db3VudERvd25MYXRjaC5uZXdDb3VudERvd25MYXRjaDsKIAogcHVibGljIGNsYXNzIFVwZ3JhZGVTU1RhYmxlc1Rlc3QgZXh0ZW5kcyBUZXN0QmFzZUltcGwKIHsKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHVwZ3JhZGVTU1RhYmxlc0ludGVycnVwdHNPbmdvaW5nQ29tcGFjdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeSAoSUNsdXN0ZXI8SUludm9rYWJsZUluc3RhbmNlPiBjbHVzdGVyID0gaW5pdChidWlsZGVyKCkud2l0aE5vZGVzKDEpLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQ1JFQVRFIFRBQkxFICIgKyBLRVlTUEFDRSArICIudGJsIChwayBpbnQsIGNrIGludCwgdiB0ZXh0LCBQUklNQVJZIEtFWSAocGssIGNrKSk7Iik7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5hY2NlcHRzT25JbnN0YW5jZSgoU3RyaW5nIGtzKSAtPiB7CisgICAgICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3BlbihrcykuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoInRibCIpOworICAgICAgICAgICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zZXRNYXhpbXVtQ29tcGFjdG9yVGhyZWFkcygxKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zZXRDb3JlQ29tcGFjdG9yVGhyZWFkcygxKTsKKyAgICAgICAgICAgIH0pLmFjY2VwdChLRVlTUEFDRSk7CisKKyAgICAgICAgICAgIFN0cmluZyBibG9iID0gImJsb2IiOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICAgICAgYmxvYiArPSBibG9iOworCisgICAgICAgICAgICBmb3IgKGludCBjbnQgPSAwOyBjbnQgPCA1OyBjbnQrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJJTlNFUlQgSU5UTyAiICsgS0VZU1BBQ0UgKyAiLnRibCAocGssIGNrLCB2KSBWQUxVRVMgKD8sPyw/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeUxldmVsLlFVT1JVTSwgKGNudCAqIDEwMDApICsgaSwgaSwgYmxvYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sKCJmbHVzaCIsIEtFWVNQQUNFLCAidGJsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZ0FjdGlvbiBsb2dBY3Rpb24gPSBjbHVzdGVyLmdldCgxKS5sb2dzKCk7CisgICAgICAgICAgICBsb2dBY3Rpb24ubWFyaygpOworICAgICAgICAgICAgRnV0dXJlPD8+IGZ1dHVyZSA9IGNsdXN0ZXIuZ2V0KDEpLmFzeW5jQWNjZXB0c09uSW5zdGFuY2UoKFN0cmluZyBrcykgLT4geworICAgICAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oa3MpLmdldENvbHVtbkZhbWlseVN0b3JlKCJ0YmwiKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zdWJtaXRNYXhpbWFsKGNmcywgRkJVdGlsaXRpZXMubm93SW5TZWNvbmRzKCksIGZhbHNlLCBPcGVyYXRpb25UeXBlLkNPTVBBQ1RJT04pOworICAgICAgICAgICAgfSkuYXBwbHkoS0VZU1BBQ0UpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBjbHVzdGVyLmdldCgxKS5ub2RldG9vbCgidXBncmFkZXNzdGFibGVzIiwgIi1hIiwgS0VZU1BBQ0UsICJ0YmwiKSk7CisgICAgICAgICAgICBmdXR1cmUuZ2V0KCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobG9nQWN0aW9uLmdyZXAoIkNvbXBhY3Rpb24gaW50ZXJydXB0ZWQiKS5nZXRSZXN1bHQoKS5pc0VtcHR5KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb21wYWN0aW9uRG9lc05vdENhbmNlbFVwZ3JhZGVTU1RhYmxlcygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeSAoSUNsdXN0ZXI8SUludm9rYWJsZUluc3RhbmNlPiBjbHVzdGVyID0gaW5pdChidWlsZGVyKCkud2l0aE5vZGVzKDEpLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQ1JFQVRFIFRBQkxFICIgKyBLRVlTUEFDRSArICIudGJsIChwayBpbnQsIGNrIGludCwgdiB0ZXh0LCBQUklNQVJZIEtFWSAocGssIGNrKSk7Iik7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5hY2NlcHRzT25JbnN0YW5jZSgoU3RyaW5nIGtzKSAtPiB7CisgICAgICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3BlbihrcykuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoInRibCIpOworICAgICAgICAgICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zZXRNYXhpbXVtQ29tcGFjdG9yVGhyZWFkcygxKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zZXRDb3JlQ29tcGFjdG9yVGhyZWFkcygxKTsKKyAgICAgICAgICAgIH0pLmFjY2VwdChLRVlTUEFDRSk7CisKKyAgICAgICAgICAgIFN0cmluZyBibG9iID0gImJsb2IiOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICAgICAgYmxvYiArPSBibG9iOworCisgICAgICAgICAgICBmb3IgKGludCBjbnQgPSAwOyBjbnQgPCA1OyBjbnQrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJJTlNFUlQgSU5UTyAiICsgS0VZU1BBQ0UgKyAiLnRibCAocGssIGNrLCB2KSBWQUxVRVMgKD8sPyw/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeUxldmVsLlFVT1JVTSwgKGNudCAqIDEwMDApICsgaSwgaSwgYmxvYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sKCJmbHVzaCIsIEtFWVNQQUNFLCAidGJsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZ0FjdGlvbiBsb2dBY3Rpb24gPSBjbHVzdGVyLmdldCgxKS5sb2dzKCk7CisgICAgICAgICAgICBsb2dBY3Rpb24ubWFyaygpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBjbHVzdGVyLmdldCgxKS5ub2RldG9vbCgidXBncmFkZXNzdGFibGVzIiwgIi1hIiwgS0VZU1BBQ0UsICJ0YmwiKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobG9nQWN0aW9uLndhdGNoRm9yKCJDb21wYWN0aW5nIikuZ2V0UmVzdWx0KCkuaXNFbXB0eSgpKTsKKworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMSkuYWNjZXB0c09uSW5zdGFuY2UoKFN0cmluZyBrcykgLT4geworICAgICAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oa3MpLmdldENvbHVtbkZhbWlseVN0b3JlKCJ0YmwiKTsKKyAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5hbGxPZihDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zdWJtaXRNYXhpbWFsKGNmcywgRkJVdGlsaXRpZXMubm93SW5TZWNvbmRzKCksIGZhbHNlLCBPcGVyYXRpb25UeXBlLkNPTVBBQ1RJT04pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF3YWl0VW5pbnRlcnJ1cHRpYmx5KDEsIFRpbWVVbml0Lk1JTlVURVMpOworCisgICAgICAgICAgICB9KS5hY2NlcHQoS0VZU1BBQ0UpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobG9nQWN0aW9uLmdyZXAoIkNvbXBhY3Rpb24gaW50ZXJydXB0ZWQiKS5nZXRSZXN1bHQoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGxvZ0FjdGlvbi5ncmVwKCJGaW5pc2hlZCBVcGdyYWRlIHNzdGFibGVzIikuZ2V0UmVzdWx0KCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShsb2dBY3Rpb24uZ3JlcCgiQ29tcGFjdGVkICguKikgNSBzc3RhYmxlcyB0byIpLmdldFJlc3VsdCgpLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNsZWFudXBEb2VzTm90SW50ZXJydXB0VXBncmFkZVNTVGFibGVzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdHJ5IChJQ2x1c3RlcjxJSW52b2thYmxlSW5zdGFuY2U+IGNsdXN0ZXIgPSBpbml0KGJ1aWxkZXIoKS53aXRoTm9kZXMoMSkud2l0aEluc3RhbmNlSW5pdGlhbGl6ZXIoQkI6Omluc3RhbGwpLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQ1JFQVRFIFRBQkxFICIgKyBLRVlTUEFDRSArICIudGJsIChwayBpbnQsIGNrIGludCwgdiB0ZXh0LCBQUklNQVJZIEtFWSAocGssIGNrKSk7Iik7CisKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLmFjY2VwdHNPbkluc3RhbmNlKChTdHJpbmcga3MpIC0+IHsKKyAgICAgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKGtzKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgidGJsIik7CisgICAgICAgICAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICAgICAgfSkuYWNjZXB0KEtFWVNQQUNFKTsKKworICAgICAgICAgICAgU3RyaW5nIGJsb2IgPSAiYmxvYiI7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgICAgICBibG9iICs9IGJsb2I7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoIklOU0VSVCBJTlRPICIgKyBLRVlTUEFDRSArICIudGJsIChwaywgY2ssIHYpIFZBTFVFUyAoPyw/LD8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lMZXZlbC5RVU9SVU0sIGksIGksIGJsb2IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5ub2RldG9vbCgiZmx1c2giLCBLRVlTUEFDRSwgInRibCIpOworCisgICAgICAgICAgICBMb2dBY3Rpb24gbG9nQWN0aW9uID0gY2x1c3Rlci5nZXQoMSkubG9ncygpOworICAgICAgICAgICAgbG9nQWN0aW9uLm1hcmsoKTsKKworICAgICAgICAgICAgLy8gU3RhcnQgdXBncmFkaW5nc3N0YWJsZXMgLSB1c2UgQkIgdG8gcGF1c2Ugb25jZSBpbnNpZGUgQWN0aXZlQ29tcGFjdGlvbnMuYmVnaW5Db21wYWN0aW9uCisgICAgICAgICAgICBUaHJlYWQgdXBncmFkZVRocmVhZCA9IG5ldyBUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sKCJ1cGdyYWRlc3N0YWJsZXMiLCAiLWEiLCBLRVlTUEFDRSwgInRibCIpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB1cGdyYWRlVGhyZWFkLnN0YXJ0KCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjbHVzdGVyLmdldCgxKS5jYWxsT25JbnN0YW5jZSgoKSAtPiBCQi5zdGFydGluZy5hd2FpdFVuaW50ZXJydXB0aWJseSgxLCBUaW1lVW5pdC5NSU5VVEVTKSkpOworCisgICAgICAgICAgICAvLyBTdGFydCBhIHNjcnViIGFuZCBtYWtlIHN1cmUgdGhhdCBpdCBmYWlscywgbG9nIGNoZWNrIGxhdGVyIHRvIG1ha2Ugc3VyZSBpdCB3YXMKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQgY2Fubm90IGNhbmNlbCB0aGUgYWN0aXZlIHVwZ3JhZGUgc3N0YWJsZXMKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnROb3RFcXVhbHMoMCwgY2x1c3Rlci5nZXQoMSkubm9kZXRvb2woInNjcnViIiwgS0VZU1BBQ0UsICJ0YmwiKSk7CisKKyAgICAgICAgICAgIC8vIE5vdyByZXN1bWUgdGhlIHVwZ3JhZGUgc3N0YWJsZXMgc28gdGVzdCBjYW4gc2h1dCBkb3duCisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBCQi5zdGFydC5kZWNyZW1lbnQoKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgdXBncmFkZVRocmVhZC5qb2luKCk7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShsb2dBY3Rpb24uZ3JlcCgiVW5hYmxlIHRvIGNhbmNlbCBpbi1wcm9ncmVzcyBjb21wYWN0aW9ucywgc2luY2UgdGhleSdyZSBydW5uaW5nIHdpdGggaGlnaGVyIG9yIHNhbWUgcHJpb3JpdHk6IFVwZ3JhZGUgc3N0YWJsZXMiKS5nZXRSZXN1bHQoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGxvZ0FjdGlvbi5ncmVwKCJTdGFydGluZyBTY3J1YiBmb3IgIikuZ2V0UmVzdWx0KCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShsb2dBY3Rpb24uZ3JlcCgiRmluaXNoZWQgVXBncmFkZSBzc3RhYmxlcyBmb3IgZGlzdHJpYnV0ZWRfdGVzdF9rZXlzcGFjZS50Ymwgc3VjY2Vzc2Z1bGx5IikuZ2V0UmVzdWx0KCkuaXNFbXB0eSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdHJ1bmNhdGVXaGlsZVVwZ3JhZGluZygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeSAoSUNsdXN0ZXI8SUludm9rYWJsZUluc3RhbmNlPiBjbHVzdGVyID0gaW5pdChidWlsZGVyKCkud2l0aE5vZGVzKDEpLnN0YXJ0KCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50YmwgKHBrIGludCwgY2sgaW50LCB2IHRleHQsIFBSSU1BUlkgS0VZIChwaywgY2spKSAiKSk7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5hY2NlcHRzT25JbnN0YW5jZSgoU3RyaW5nIGtzKSAtPiB7CisgICAgICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3BlbihrcykuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoInRibCIpOworICAgICAgICAgICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zZXRNYXhpbXVtQ29tcGFjdG9yVGhyZWFkcygxKTsKKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5zZXRDb3JlQ29tcGFjdG9yVGhyZWFkcygxKTsKKyAgICAgICAgICAgIH0pLmFjY2VwdChLRVlTUEFDRSk7CisKKyAgICAgICAgICAgIFN0cmluZyBibG9iID0gImJsb2IiOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKQorICAgICAgICAgICAgICAgIGJsb2IgKz0gYmxvYjsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDA7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50YmwgKHBrLCBjaywgdikgVkFMVUVTICg/LD8sPykiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lMZXZlbC5RVU9SVU0sIGksIGksIGJsb2IpOworICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiBpICUgMTAwID09IDApCisgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLm5vZGV0b29sKCJmbHVzaCIsIEtFWVNQQUNFLCAidGJsIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExvZ0FjdGlvbiBsb2dBY3Rpb24gPSBjbHVzdGVyLmdldCgxKS5sb2dzKCk7CisgICAgICAgICAgICBsb2dBY3Rpb24ubWFyaygpOworCisgICAgICAgICAgICBGdXR1cmU8Pz4gdXBncmFkZSA9IENvbXBsZXRhYmxlRnV0dXJlLnJ1bkFzeW5jKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBjbHVzdGVyLmdldCgxKS5ub2RldG9vbCgidXBncmFkZXNzdGFibGVzIiwgIi1hIiwgS0VZU1BBQ0UsICJ0YmwiKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIlRSVU5DQVRFICVzLnRibCIpKTsKKyAgICAgICAgICAgIHVwZ3JhZGUuZ2V0KCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobG9nQWN0aW9uLmdyZXAoIkNvbXBhY3Rpb24gaW50ZXJydXB0ZWQiKS5nZXRSZXN1bHQoKS5pc0VtcHR5KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCByZXdyaXRlU1NUYWJsZXNUZXN0KCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgdHJ5IChJQ2x1c3RlcjxJSW52b2thYmxlSW5zdGFuY2U+IGNsdXN0ZXIgPSBidWlsZGVyKCkud2l0aE5vZGVzKDEpLndpdGhEYXRhRGlyQ291bnQoMSkuc3RhcnQoKSkKQEAgLTc0LDcgKzI2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgdGJsIDogY2ZzLmdldExpdmVTU1RhYmxlcygpKQogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRzID0gTWF0aC5tYXgobWF4VHMsIHRibC5nZXRDcmVhdGlvblRpbWVGb3IoQ29tcG9uZW50LkRBVEEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhUcyA9IE1hdGgubWF4KG1heFRzLCB0YmwuZ2V0RGF0YUNyZWF0aW9uVGltZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhUczsKICAgICAgICAgICAgICAgICAgICAgfSkuYXBwbHkoS0VZU1BBQ0UpOwpAQCAtOTYsNyArMjgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBsaXZlU1NUYWJsZXMuc2l6ZSgpID09IDIgOiBTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCAyIHNzdGFibGVzLCBidXQgZ290ICIgKyBsaXZlU1NUYWJsZXMuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciB0YmwgOiBsaXZlU1NUYWJsZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRibC5nZXRDcmVhdGlvblRpbWVGb3IoQ29tcG9uZW50LkRBVEEpIDw9IG1heFRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YmwuZ2V0RGF0YUNyZWF0aW9uVGltZSgpIDw9IG1heFRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZCsrOwpAQCAtMTE1LDQgKzMwMiwzOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCQgorICAgIHsKKyAgICAgICAgLy8gV2lsbCBiZSBpbml0aWFsaXplZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgaW5zdGFuY2UgY2xhc3MgbG9hZGVyCisgICAgICAgIHN0YXRpYyBDb3VudERvd25MYXRjaCBzdGFydGluZyA9IG5ld0NvdW50RG93bkxhdGNoKDEpOworICAgICAgICBzdGF0aWMgQ291bnREb3duTGF0Y2ggc3RhcnQgPSBuZXdDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgSW50ZWdlciBudW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ldyBCeXRlQnVkZHkoKS5yZWJhc2UoQWN0aXZlQ29tcGFjdGlvbnMuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKCJiZWdpbkNvbXBhY3Rpb24iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRlcmNlcHQoTWV0aG9kRGVsZWdhdGlvbi50byhCQi5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFrZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9hZChjbGFzc0xvYWRlciwgQ2xhc3NMb2FkaW5nU3RyYXRlZ3kuRGVmYXVsdC5JTkpFQ1RJT04pOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWdpbkNvbXBhY3Rpb24oQ29tcGFjdGlvbkluZm8uSG9sZGVyIGNpLCBAU3VwZXJDYWxsIENhbGxhYmxlPFZvaWQ+IHp1cGVyQ2FsbCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgenVwZXJDYWxsLmNhbGwoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2kuZ2V0Q29tcGFjdGlvbkluZm8oKS5nZXRUYXNrVHlwZSgpID09IE9wZXJhdGlvblR5cGUuVVBHUkFERV9TU1RBQkxFUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nLmRlY3JlbWVudCgpOworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzdGFydC5hd2FpdFVuaW50ZXJydXB0aWJseSgxLCBUaW1lVW5pdC5NSU5VVEVTKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1ZpcnR1YWxUYWJsZUxvZ3NUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvVmlydHVhbFRhYmxlTG9nc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmMyOTU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L1ZpcnR1YWxUYWJsZUxvZ3NUZXN0LmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGNoLnFvcy5sb2diYWNrLmNsYXNzaWMuTGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5Mb2dNZXNzYWdlc1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuTG9nTWVzc2FnZXNUYWJsZS5Mb2dNZXNzYWdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLlNpbXBsZVF1ZXJ5UmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmxvZ2dpbmcuVmlydHVhbFRhYmxlQXBwZW5kZXI7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTE9HQkFDS19DT05GSUdVUkFUSU9OX0ZJTEU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuTG9nTWVzc2FnZXNUYWJsZS5MRVZFTF9DT0xVTU5fTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5Mb2dNZXNzYWdlc1RhYmxlLkxPR0dFUl9DT0xVTU5fTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5Mb2dNZXNzYWdlc1RhYmxlLk1FU1NBR0VfQ09MVU1OX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuTG9nTWVzc2FnZXNUYWJsZS5PUkRFUl9JTl9NSUxMSVNFQ09ORF9DT0xVTU5fTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5Mb2dNZXNzYWdlc1RhYmxlLlRJTUVTVEFNUF9DT0xVTU5fTkFNRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWwuT05FOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK3B1YmxpYyBjbGFzcyBWaXJ0dWFsVGFibGVMb2dzVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZUYWJsZU91dHB1dCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChMT0dCQUNLX0NPTkZJR1VSQVRJT05fRklMRSwgInRlc3QvY29uZi9sb2diYWNrLWR0ZXN0X3dpdGhfdnRhYmxlX2FwcGVuZGVyLnhtbCIpOworICAgICAgICAgICAgIENsdXN0ZXIgY2x1c3RlciA9IENsdXN0ZXIuYnVpbGQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoYyAtPiBjLndpdGgoRmVhdHVyZS52YWx1ZXMoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpOworICAgICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxUZXN0aW5nTG9nTWVzc2FnZT4gcm93cyA9IGdldFJvd3MoY2x1c3Rlcik7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShyb3dzLmlzRW1wdHkoKSk7CisKKyAgICAgICAgICAgIHJvd3MuZm9yRWFjaChtZXNzYWdlIC0+IGFzc2VydFRydWUoTGV2ZWwudG9MZXZlbChtZXNzYWdlLmxldmVsKS5pc0dyZWF0ZXJPckVxdWFsKExldmVsLklORk8pKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUFwcGVuZGVyc0ZhaWxUb1N0YXJ0Tm9kZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIExPR0JBQ0tfQ09ORklHVVJBVElPTl9GSUxFLnNldFN0cmluZygidGVzdC9jb25mL2xvZ2JhY2stZHRlc3Rfd2l0aF92dGFibGVfYXBwZW5kZXJfaW52YWxpZC54bWwiKTsKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KExPR0JBQ0tfQ09ORklHVVJBVElPTl9GSUxFLCAidGVzdC9jb25mL2xvZ2JhY2stZHRlc3Rfd2l0aF92dGFibGVfYXBwZW5kZXJfaW52YWxpZC54bWwiKTsKKyAgICAgICAgICAgICBDbHVzdGVyIGlnbm9yZWQgPSBDbHVzdGVyLmJ1aWxkKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGMgLT4gYy53aXRoKEZlYXR1cmUudmFsdWVzKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKTsKKyAgICAgICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZhaWwoIk5vZGUgc2hvdWxkIG5vdCBzdGFydCBhcyB0aGVyZSBpcyBzdXBwb3NlZCB0byBiZSBpbnZhbGlkIGxvZ2JhY2sgY29uZmlndXJhdGlvbiBmaWxlLiIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXQoIlRoZXJlIGFyZSBtdWx0aXBsZSBhcHBlbmRlcnMgb2YgY2xhc3MgJXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZiBuYW1lcyBDUUxMT0csQ1FMTE9HMi4gVGhlcmUgaXMgb25seSBvbmUgYXBwZW5kZXIgb2Ygc3VjaCBjbGFzcyBhbGxvd2VkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnR1YWxUYWJsZUFwcGVuZGVyLmNsYXNzLmdldE5hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxUZXN0aW5nTG9nTWVzc2FnZT4gZ2V0Um93cyhDbHVzdGVyIGNsdXN0ZXIpCisgICAgeworICAgICAgICBTaW1wbGVRdWVyeVJlc3VsdCBzaW1wbGVRdWVyeVJlc3VsdCA9IGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZVdpdGhSZXN1bHQocXVlcnkoInNlbGVjdCAqIGZyb20gJXMiKSwgT05FKTsKKyAgICAgICAgTGlzdDxUZXN0aW5nTG9nTWVzc2FnZT4gcm93cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBzaW1wbGVRdWVyeVJlc3VsdC5mb3JFYWNoUmVtYWluaW5nKHJvdyAtPiB7CisgICAgICAgICAgICBsb25nIHRpbWVzdGFtcCA9IHJvdy5nZXRUaW1lc3RhbXAoVElNRVNUQU1QX0NPTFVNTl9OQU1FKS5nZXRUaW1lKCk7CisgICAgICAgICAgICBTdHJpbmcgbG9nZ2VyID0gcm93LmdldFN0cmluZyhMT0dHRVJfQ09MVU1OX05BTUUpOworICAgICAgICAgICAgU3RyaW5nIGxldmVsID0gcm93LmdldFN0cmluZyhMRVZFTF9DT0xVTU5fTkFNRSk7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHJvdy5nZXRTdHJpbmcoTUVTU0FHRV9DT0xVTU5fTkFNRSk7CisgICAgICAgICAgICBpbnQgb3JkZXIgPSByb3cuZ2V0SW50ZWdlcihPUkRFUl9JTl9NSUxMSVNFQ09ORF9DT0xVTU5fTkFNRSk7CisgICAgICAgICAgICBUZXN0aW5nTG9nTWVzc2FnZSBsb2dNZXNzYWdlID0gbmV3IFRlc3RpbmdMb2dNZXNzYWdlKHRpbWVzdGFtcCwgbG9nZ2VyLCBsZXZlbCwgbWVzc2FnZSwgb3JkZXIpOworICAgICAgICAgICAgcm93cy5hZGQobG9nTWVzc2FnZSk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcm93czsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBxdWVyeShTdHJpbmcgdGVtcGxhdGUpCisgICAgeworICAgICAgICByZXR1cm4gZm9ybWF0KHRlbXBsYXRlLCBnZXRUYWJsZU5hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFibGVOYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBmb3JtYXQoIiVzLiVzIiwgU2NoZW1hQ29uc3RhbnRzLlZJUlRVQUxfVklFV1MsIExvZ01lc3NhZ2VzVGFibGUuVEFCTEVfTkFNRSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdGluZ0xvZ01lc3NhZ2UgZXh0ZW5kcyBMb2dNZXNzYWdlCisgICAgeworICAgICAgICBwcml2YXRlIGludCBvcmRlcjsKKworICAgICAgICBwdWJsaWMgVGVzdGluZ0xvZ01lc3NhZ2UobG9uZyB0aW1lc3RhbXAsIFN0cmluZyBsb2dnZXIsIFN0cmluZyBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIGludCBvcmRlcikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIodGltZXN0YW1wLCBsb2dnZXIsIGxldmVsLCBtZXNzYWdlKTsKKyAgICAgICAgICAgIHRoaXMub3JkZXIgPSBvcmRlcjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9jZGMvVG9nZ2xlQ0RDT25SZXBhaXJFbmFibGVkVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L2NkYy9Ub2dnbGVDRENPblJlcGFpckVuYWJsZWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5Y2YwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9jZGMvVG9nZ2xlQ0RDT25SZXBhaXJFbmFibGVkVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5jZGM7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1NlZ21lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlRlc3RCYXNlSW1wbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQXNzZXJ0VXRpbHMuYXNzZXJ0Um93czsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLkFzc2VydFV0aWxzLmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5Bc3NlcnRVdGlscy5yb3c7CisKK3B1YmxpYyBjbGFzcyBUb2dnbGVDRENPblJlcGFpckVuYWJsZWRUZXN0IGV4dGVuZHMgVGVzdEJhc2VJbXBsCit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q0RDT25SZXBhaXJJc0VuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0Q0RDT25SZXBhaXJFbmFibGVkKHRydWUsIGNsdXN0ZXIgLT4geworICAgICAgICAgICAgY2x1c3Rlci5nZXQoMikucnVuT25JbnN0YW5jZSgoKSAtPiB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBjb250YWluQ0RDSW5Mb2cgPSBDb21taXRMb2cuaW5zdGFuY2Uuc2VnbWVudE1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0QWN0aXZlU2VnbWVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hbnlNYXRjaChzIC0+IHMuZ2V0Q0RDU3RhdGUoKSA9PSBDb21taXRMb2dTZWdtZW50LkNEQ1N0YXRlLkNPTlRBSU5TKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJNdXRhdGlvbiBzaG91bGQgYmUgYWRkZWQgdG8gY29tbWl0IGxvZyB3aGVuIGNkY19vbl9yZXBhaXJfZW5hYmxlZCBpcyB0cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5DRENJbkxvZyk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q0RDT25SZXBhaXJJc0Rpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdENEQ09uUmVwYWlyRW5hYmxlZChmYWxzZSwgY2x1c3RlciAtPiB7CisgICAgICAgICAgICBjbHVzdGVyLmdldCgyKS5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGNvbnRhaW5DRENJbkxvZyA9IENvbW1pdExvZy5pbnN0YW5jZS5zZWdtZW50TWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBY3RpdmVTZWdtZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFsbE1hdGNoKHMgLT4gcy5nZXRDRENTdGF0ZSgpICE9IENvbW1pdExvZ1NlZ21lbnQuQ0RDU3RhdGUuQ09OVEFJTlMpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIk5vIG11dGF0aW9uIHNob3VsZCBiZSBhZGRlZCB0byBjb21taXQgbG9nIHdoZW4gY2RjX29uX3JlcGFpcl9lbmFibGVkIGlzIGZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5DRENJbkxvZyk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLy8gdGVzdCBoZWxwZXIgdG8gcmVwYWlyIGRhdGEgYmV0d2VlbiBub2RlcyB3aGVuIGNkY19vbl9yZXBhaXJfZW5hYmxlZCBpcyBvbiBvciBvZmYuCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RDRENPblJlcGFpckVuYWJsZWQoYm9vbGVhbiBlbmFibGVkLCBDb25zdW1lcjxDbHVzdGVyPiBhc3NlcnRpb24pIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gaW5pdChDbHVzdGVyLmJ1aWxkKDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoYyAtPiBjLnNldCgiY2RjX2VuYWJsZWQiLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoImNkY19vbl9yZXBhaXJfZW5hYmxlZCIsIGVuYWJsZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGgoRmVhdHVyZS5ORVRXT1JLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoKEZlYXR1cmUuR09TU0lQKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnRibCAoayBJTlQgUFJJTUFSWSBLRVksIHYgSU5UKSBXSVRIIGNkYz10cnVlIikpOworCisgICAgICAgICAgICAvLyBEYXRhIG9ubHkgaW4gbm9kZTEKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLmV4ZWN1dGVJbnRlcm5hbCh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRibCAoaywgdikgVkFMVUVTICgxLCAxKSIpKTsKKyAgICAgICAgICAgIE9iamVjdFtdW10gcmVzdWx0ID0gY2x1c3Rlci5nZXQoMSkuZXhlY3V0ZUludGVybmFsKHdpdGhLZXlzcGFjZSgiU0VMRUNUICogRlJPTSAlcy50YmwgV0hFUkUgayA9IDEiKSk7CisgICAgICAgICAgICBhc3NlcnRSb3dzKHJlc3VsdCwgcm93KDEsIDEpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNsdXN0ZXIuZ2V0KDIpLmV4ZWN1dGVJbnRlcm5hbCh3aXRoS2V5c3BhY2UoIlNFTEVDVCAqIEZST00gJXMudGJsIFdIRVJFIGsgPSAxIikpOworICAgICAgICAgICAgYXNzZXJ0Um93cyhyZXN1bHQpOworCisgICAgICAgICAgICAvLyByZXBhaXIKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDEpLmZsdXNoKEtFWVNQQUNFKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KDIpLm5vZGV0b29sKCJyZXBhaXIiLCBLRVlTUEFDRSwgInRibCIpOworCisgICAgICAgICAgICAvLyB2ZXJpZnkgbm9kZTIgbm93IGhhdmUgZGF0YQorICAgICAgICAgICAgcmVzdWx0ID0gY2x1c3Rlci5nZXQoMikuZXhlY3V0ZUludGVybmFsKHdpdGhLZXlzcGFjZSgiU0VMRUNUICogRlJPTSAlcy50YmwgV0hFUkUgayA9IDEiKSk7CisgICAgICAgICAgICBhc3NlcnRSb3dzKHJlc3VsdCwgcm93KDEsIDEpKTsKKworICAgICAgICAgICAgYXNzZXJ0aW9uLmFjY2VwdChjbHVzdGVyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9ndWFyZHJhaWxzL0d1YXJkcmFpbFBhcnRpdGlvblNpemVUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvZ3VhcmRyYWlscy9HdWFyZHJhaWxQYXJ0aXRpb25TaXplVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZWU4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvZ3VhcmRyYWlscy9HdWFyZHJhaWxQYXJ0aXRpb25TaXplVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3QuZ3VhcmRyYWlsczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5CeXRlQnVmZmVyLmFsbG9jYXRlOworCisvKioKKyAqIFRlc3RzIHRoZSBndWFyZHJhaWwgZm9yIHRoZSBzaXplIG9mIHBhcnRpdGlvbiBzaXplLCB7QGxpbmsgR3VhcmRyYWlscyNwYXJ0aXRpb25TaXplfS4KKyAqIDxwPgorICogVGhpcyB0ZXN0IG9ubHkgaW5jbHVkZXMgdGhlIGFjdGl2YXRpb24gb2YgdGhlIGd1YXJkcmFpbCBkdXJpbmcgc3N0YWJsZSB3cml0ZXMsIGZvY3VzaW5nIG9uIHRoZSBlbW1pdHRlZCBsb2cgbWVzc2FnZXMuCisgKiBUaGUgdGVzdHMgZm9yIGNvbmZpZywgY2xpZW50IHdhcm5pbmdzIGFuZCBkaWFnbm9zdGljIGV2ZW50cyBhcmUgaW4KKyAqIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbFBhcnRpdGlvblNpemVUZXN0fS4KKyAqLworcHVibGljIGNsYXNzIEd1YXJkcmFpbFBhcnRpdGlvblNpemVUZXN0IGV4dGVuZHMgR3VhcmRyYWlsVGVzdGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBUk5fVEhSRVNIT0xEID0gMTAyNCAqIDEwMjQ7IC8vIGJ5dGVzICgxIE1pQikKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkFJTF9USFJFU0hPTEQgPSBXQVJOX1RIUkVTSE9MRCAqIDI7IC8vIGJ5dGVzICgyIE1pQikKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fTk9ERVMgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fQ0xVU1RFUklOR1MgPSA1OworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2x1c3RlciBjbHVzdGVyOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQ2x1c3RlcigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY2x1c3RlciA9IGluaXQoQ2x1c3Rlci5idWlsZChOVU1fTk9ERVMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjIC0+IGMuc2V0KCJwYXJ0aXRpb25fc2l6ZV93YXJuX3RocmVzaG9sZCIsIFdBUk5fVEhSRVNIT0xEICsgIkIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgicGFydGl0aW9uX3NpemVfZmFpbF90aHJlc2hvbGQiLCBGQUlMX1RIUkVTSE9MRCArICJCIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoImNvbXBhY3Rpb25fbGFyZ2VfcGFydGl0aW9uX3dhcm5pbmdfdGhyZXNob2xkIiwgIjk5OUdpQiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJtZW10YWJsZV9oZWFwX3NwYWNlIiwgIjUxMk1pQiIpKSAvLyBhdm9pZHMgZmx1c2hlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpOworICAgICAgICBjbHVzdGVyLmRpc2FibGVBdXRvQ29tcGFjdGlvbihLRVlTUEFDRSk7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhcmRvd25DbHVzdGVyKCkKKyAgICB7CisgICAgICAgIGlmIChjbHVzdGVyICE9IG51bGwpCisgICAgICAgICAgICBjbHVzdGVyLmNsb3NlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENsdXN0ZXIgZ2V0Q2x1c3RlcigpCisgICAgeworICAgICAgICByZXR1cm4gY2x1c3RlcjsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aXRpb25TaXplKCkKKyAgICB7CisgICAgICAgIHRlc3RQYXJ0aXRpb25TaXplKFdBUk5fVEhSRVNIT0xELCBGQUlMX1RIUkVTSE9MRCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGl0aW9uU2l6ZVdpdGhEeW5hbWljVXBkYXRlKCkKKyAgICB7CisgICAgICAgIGludCB3YXJuID0gV0FSTl9USFJFU0hPTEQgKiAyOworICAgICAgICBpbnQgZmFpbCA9IEZBSUxfVEhSRVNIT0xEICogMjsKKyAgICAgICAgY2x1c3Rlci5nZXQoMSkucnVuT25JbnN0YW5jZSgoKSAtPiBHdWFyZHJhaWxzLmluc3RhbmNlLnNldFBhcnRpdGlvblNpemVUaHJlc2hvbGQod2FybiArICJCIiwgZmFpbCArICJCIikpOworICAgICAgICB0ZXN0UGFydGl0aW9uU2l6ZSh3YXJuLCBmYWlsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFBhcnRpdGlvblNpemUoaW50IHdhcm4sIGludCBmYWlsKQorICAgIHsKKyAgICAgICAgc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50LCBjIGludCwgdiBibG9iLCBQUklNQVJZIEtFWSAoaywgYykpIik7CisKKyAgICAgICAgLy8gZW1wdHkgdGFibGUKKyAgICAgICAgYXNzZXJ0Tm90V2FybmVkT25GbHVzaCgpOworICAgICAgICBhc3NlcnROb3RXYXJuZWRPbkNvbXBhY3QoKTsKKworICAgICAgICAvLyBrZWVwIHBhcnRpdGlvbiBzaXplIGxvd2VyIHRoYW4gdGhyZXNob2xkcworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgxLCAxLCA/KSIsIGFsbG9jYXRlKDEpKTsKKyAgICAgICAgYXNzZXJ0Tm90V2FybmVkT25GbHVzaCgpOworICAgICAgICBhc3NlcnROb3RXYXJuZWRPbkNvbXBhY3QoKTsKKworICAgICAgICAvLyBleGNlZWQgd2FybiB0aHJlc2hvbGQKKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBOVU1fQ0xVU1RFUklOR1M7IGMrKykKKyAgICAgICAgeworICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoMSwgPywgPykiLCBjLCBhbGxvY2F0ZSh3YXJuIC8gTlVNX0NMVVNURVJJTkdTKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0V2FybmVkT25GbHVzaChleHBlY3RlZE1lc3NhZ2VzKDEpKTsKKyAgICAgICAgYXNzZXJ0V2FybmVkT25Db21wYWN0KGV4cGVjdGVkTWVzc2FnZXMoMSkpOworCisgICAgICAgIC8vIGV4Y2VlZCBmYWlsIHRocmVzaG9sZAorICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IE5VTV9DTFVTVEVSSU5HUyAqIDEwOyBjKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDEsID8sID8pIiwgYywgYWxsb2NhdGUoZmFpbCAvIE5VTV9DTFVTVEVSSU5HUykpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEZhaWxlZE9uRmx1c2goZXhwZWN0ZWRNZXNzYWdlcygxKSk7CisgICAgICAgIGFzc2VydEZhaWxlZE9uQ29tcGFjdChleHBlY3RlZE1lc3NhZ2VzKDEpKTsKKworICAgICAgICAvLyByZW1vdmUgbW9zdCBvZiB0aGUgZGF0YSB0byBiZSB1bmRlciB0aGUgdGhyZXNob2xkIGFnYWluCisgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSAxIEFORCBjID4gMSIpOworICAgICAgICBhc3NlcnROb3RXYXJuZWRPbkZsdXNoKCk7CisgICAgICAgIGFzc2VydE5vdFdhcm5lZE9uQ29tcGFjdCgpOworCisgICAgICAgIC8vIGV4Y2VlZCB3YXJuIHRocmVzaG9sZCBpbiBtdWx0aXBsZSBwYXJ0aXRpb25zCisgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgTlVNX0NMVVNURVJJTkdTOyBjKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDEsID8sID8pIiwgYywgYWxsb2NhdGUod2FybiAvIE5VTV9DTFVTVEVSSU5HUykpOworICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoMiwgPywgPykiLCBjLCBhbGxvY2F0ZSh3YXJuIC8gTlVNX0NMVVNURVJJTkdTKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0V2FybmVkT25GbHVzaChleHBlY3RlZE1lc3NhZ2VzKDEsIDIpKTsKKyAgICAgICAgYXNzZXJ0V2FybmVkT25Db21wYWN0KGV4cGVjdGVkTWVzc2FnZXMoMSwgMikpOworCisgICAgICAgIC8vIGV4Y2VlZCB3YXJuIHRocmVzaG9sZCBpbiBhIG5ldyBwYXJ0aXRpb24KKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBOVU1fQ0xVU1RFUklOR1M7IGMrKykKKyAgICAgICAgeworICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoMywgPywgPykiLCBjLCBhbGxvY2F0ZSh3YXJuIC8gTlVNX0NMVVNURVJJTkdTKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0V2FybmVkT25GbHVzaChleHBlY3RlZE1lc3NhZ2VzKDMpKTsKKyAgICAgICAgYXNzZXJ0V2FybmVkT25Db21wYWN0KGV4cGVjdGVkTWVzc2FnZXMoMSwgMiwgMykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlKFN0cmluZyBxdWVyeSwgT2JqZWN0Li4uIGFyZ3MpCisgICAgeworICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoZm9ybWF0KHF1ZXJ5KSwgQ29uc2lzdGVuY3lMZXZlbC5BTEwsIGFyZ3MpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nW10gZXhwZWN0ZWRNZXNzYWdlcyhpbnQuLi4ga2V5cykKKyAgICB7CisgICAgICAgIFN0cmluZ1tdIG1lc3NhZ2VzID0gbmV3IFN0cmluZ1trZXlzLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIG1lc3NhZ2VzW2ldID0gU3RyaW5nLmZvcm1hdCgiR3VhcmRyYWlsIHBhcnRpdGlvbl9zaXplIHZpb2xhdGVkOiBQYXJ0aXRpb24gJXM6JWQiLCBxdWFsaWZpZWRUYWJsZU5hbWUsIGtleXNbaV0pOworICAgICAgICByZXR1cm4gbWVzc2FnZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L2hvc3RyZXBsYWNlbWVudC9GYWlsZWRCb290c3RyYXBUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvaG9zdHJlcGxhY2VtZW50L0ZhaWxlZEJvb3RzdHJhcFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YThlNDIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L2hvc3RyZXBsYWNlbWVudC9GYWlsZWRCb290c3RyYXBUZXN0LmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5ob3N0cmVwbGFjZW1lbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgbmV0LmJ5dGVidWRkeS5CeXRlQnVkZHk7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NMb2FkaW5nU3RyYXRlZ3k7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5NZXRob2REZWxlZ2F0aW9uOworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uYmluZC5hbm5vdGF0aW9uLlN1cGVyQ2FsbDsKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmltcGxlbWVudGF0aW9uLmJpbmQuYW5ub3RhdGlvbi5UaGlzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQ2Fzc2FuZHJhUm9sZU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUludm9rYWJsZUluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Ob2RlVG9vbFJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuVG9rZW5TdXBwbGllcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlRlc3RCYXNlSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudFJlcXVlc3RzTWV0cmljc0hvbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1SZXN1bHRGdXR1cmU7CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKK2ltcG9ydCBvcmcuYXdhaXRpbGl0eS5Bd2FpdGlsaXR5OworCitpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMubmFtZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1VQRVJVU0VSX1NFVFVQX0RFTEFZX01TOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQ2x1c3RlclV0aWxzLnJlcGxhY2VIb3N0QW5kU3RhcnQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5DbHVzdGVyVXRpbHMuc3RvcFVuY2hlY2tlZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5ob3N0cmVwbGFjZW1lbnQuSG9zdFJlcGxhY2VtZW50VGVzdC5zZXR1cENsdXN0ZXI7CisKK3B1YmxpYyBjbGFzcyBGYWlsZWRCb290c3RyYXBUZXN0IGV4dGVuZHMgVGVzdEJhc2VJbXBsCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEZhaWxlZEJvb3RzdHJhcFRlc3QuY2xhc3MpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PREVfVE9fUkVNT1ZFID0gMjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcm9sZVNldHVwRG9lc05vdFByb2R1Y2VVbmF2YWlsYWJsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIENsdXN0ZXIuQnVpbGRlciBidWlsZGVyID0gQ2x1c3Rlci5idWlsZCgzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjIC0+IGMud2l0aChGZWF0dXJlLnZhbHVlcygpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhJbnN0YW5jZUluaXRpYWxpemVyKEJCOjppbnN0YWxsKTsKKyAgICAgICAgVG9rZW5TdXBwbGllciBldmVuID0gVG9rZW5TdXBwbGllci5ldmVubHlEaXN0cmlidXRlZFRva2VucygzLCBidWlsZGVyLmdldFRva2VuQ291bnQoKSk7CisgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLndpdGhUb2tlblN1cHBsaWVyKChUb2tlblN1cHBsaWVyKSBub2RlIC0+IGV2ZW4udG9rZW5zKG5vZGUgPT0gNCA/IE5PREVfVE9fUkVNT1ZFIDogbm9kZSkpOworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IGJ1aWxkZXIuc3RhcnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxJSW52b2thYmxlSW5zdGFuY2U+IGFsaXZlID0gQXJyYXlzLmFzTGlzdChjbHVzdGVyLmdldCgxKSwgY2x1c3Rlci5nZXQoMykpOworICAgICAgICAgICAgSUludm9rYWJsZUluc3RhbmNlIG5vZGVUb1JlbW92ZSA9IGNsdXN0ZXIuZ2V0KE5PREVfVE9fUkVNT1ZFKTsKKworICAgICAgICAgICAgc2V0dXBDbHVzdGVyKGNsdXN0ZXIpOworCisgICAgICAgICAgICBzdG9wVW5jaGVja2VkKG5vZGVUb1JlbW92ZSk7CisKKyAgICAgICAgICAgIC8vIHNob3VsZCBmYWlsIHRvIGpvaW4sIGJ1dCBzaG91bGQgc3RhcnQgdXAhCisgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgYWRkZWQgPSByZXBsYWNlSG9zdEFuZFN0YXJ0KGNsdXN0ZXIsIG5vZGVUb1JlbW92ZSwgcCAtPiBwLnNldChTVVBFUlVTRVJfU0VUVVBfREVMQVlfTVMsICIxIikpOworICAgICAgICAgICAgLy8gbG9nIGdvc3NpcCBmb3IgZGVidWdnaW5nCisgICAgICAgICAgICBhbGl2ZS5mb3JFYWNoKGkgLT4geworICAgICAgICAgICAgICAgIE5vZGVUb29sUmVzdWx0IHJlc3VsdCA9IGkubm9kZXRvb2xSZXN1bHQoImdvc3NpcGluZm8iKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiZ29zc2lwaW5mbyBmb3Igbm9kZXt9XG57fSIsIGkuY29uZmlnKCkubnVtKCksIHJlc3VsdC5nZXRTdGRvdXQoKSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gQ2Fzc2FuZHJhUm9sZU1hbmFnZXIgYXR0ZW1wdGVkIHRvIGRvIGRpc3RyaWJ1dGVkIHJlYWRzIHdoaWxlIGJvb3RzdHJhcCB3YXMgc3RpbGwgZ29pbmcgKGl0IGZhaWxlZCwgc28gc3RpbGwgaW4gYm9vdHN0cmFwIG1vZGUpCisgICAgICAgICAgICAvLyBzbyBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgaXMgbm8gbG9uZ2VyIGhhcHBlbmluZyBhbmQgd2UgaW5jcmVtZW50aW5nIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2xpZW50UmVxdWVzdE1ldHJpY3MudW5hdmFpbGFibGVzCisgICAgICAgICAgICAvLyBzbGVlcCBsYXJnZXIgdGhhbiBtdWx0aXBsZSByZXRyeSBhdHRlbXB0cy4uLgorICAgICAgICAgICAgQXdhaXRpbGl0eS5hd2FpdCgpCisgICAgICAgICAgICAgICAgICAgICAgLmF0TW9zdCgxLCBUaW1lVW5pdC5NSU5VVEVTKQorICAgICAgICAgICAgICAgICAgICAgIC51bnRpbCgoKSAtPiBhZGRlZC5jYWxsT25JbnN0YW5jZSgoKSAtPiBCQi5TRVRVUF9TQ0hFRFVMRV9DT1VOVEVSLmdldCgpKSA+PSA0Mik7IC8vIHdoeSA0Mj8gIGp1c3QgbmVlZCBzb21ldGhpbmcgbGFyZ2UgZW5vdWdoIHRvIG1ha2Ugc3VyZSBtdWx0aXBsZSBhdHRlbXB0cyBoYXBwZW5lZAorCisgICAgICAgICAgICAvLyBkbyB3ZSBoYXZlIGFueSByZWFkIG1ldHJpY3MgaGF2ZSB1bmF2YWlsYWJsZXM/CisgICAgICAgICAgICBhZGRlZC5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoQ2xpZW50UmVxdWVzdHNNZXRyaWNzSG9sZGVyLnJlYWRNZXRyaWNzLnVuYXZhaWxhYmxlcy5nZXRDb3VudCgpKS5kZXNjcmliZWRBcygicmVhZCB1bmF2YWlsYWJsZXMiKS5pc0VxdWFsVG8oMCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KENsaWVudFJlcXVlc3RzTWV0cmljc0hvbGRlci5jYXNSZWFkTWV0cmljcy51bmF2YWlsYWJsZXMuZ2V0Q291bnQoKSkuZGVzY3JpYmVkQXMoIkNBUyByZWFkIHVuYXZhaWxhYmxlcyIpLmlzRXF1YWxUbygwKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCQgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGwoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIEludGVnZXIgbnVtKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobnVtICE9IDQpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBuZXcgQnl0ZUJ1ZGR5KCkucmViYXNlKFN0cmVhbVJlc3VsdEZ1dHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXRob2QobmFtZWQoIm1heWJlQ29tcGxldGUiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRlcmNlcHQoTWV0aG9kRGVsZWdhdGlvbi50byhCQi5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFrZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9hZChjbGFzc0xvYWRlciwgQ2xhc3NMb2FkaW5nU3RyYXRlZ3kuRGVmYXVsdC5JTkpFQ1RJT04pOworCisgICAgICAgICAgICBuZXcgQnl0ZUJ1ZGR5KCkucmViYXNlKENhc3NhbmRyYVJvbGVNYW5hZ2VyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ldGhvZChuYW1lZCgic2NoZWR1bGVTZXR1cFRhc2siKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRlcmNlcHQoTWV0aG9kRGVsZWdhdGlvbi50byhCQi5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFrZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9hZChjbGFzc0xvYWRlciwgQ2xhc3NMb2FkaW5nU3RyYXRlZ3kuRGVmYXVsdC5JTkpFQ1RJT04pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1heWJlQ29tcGxldGUoQFRoaXMgU3RyZWFtUmVzdWx0RnV0dXJlIGZ1dHVyZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBNZXRob2QgbWV0aG9kID0gZnV0dXJlLmdldENsYXNzKCkuZ2V0U3VwZXJjbGFzcygpLmdldFN1cGVyY2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgidHJ5RmFpbHVyZSIsIFRocm93YWJsZS5jbGFzcyk7CisgICAgICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIG1ldGhvZC5pbnZva2UoZnV0dXJlLCBuZXcgU3RyZWFtRXhjZXB0aW9uKGZ1dHVyZS5nZXRDdXJyZW50U3RhdGUoKSwgIlN0cmVhbSBmYWlsZWQiKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIFNFVFVQX1NDSEVEVUxFX0NPVU5URVIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNjaGVkdWxlU2V0dXBUYXNrKGZpbmFsIENhbGxhYmxlPD8+IHNldHVwVGFzaywgQFN1cGVyQ2FsbCBSdW5uYWJsZSBmbikKKyAgICAgICAgeworICAgICAgICAgICAgU0VUVVBfU0NIRURVTEVfQ09VTlRFUi5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgIGZuLnJ1bigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L2hvc3RyZXBsYWNlbWVudC9Ib3N0UmVwbGFjZW1lbnRUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvaG9zdHJlcGxhY2VtZW50L0hvc3RSZXBsYWNlbWVudFRlc3QuamF2YQppbmRleCAzZGUwYmY1Li44MjE5ZDQzIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvaG9zdHJlcGxhY2VtZW50L0hvc3RSZXBsYWNlbWVudFRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvaG9zdHJlcGxhY2VtZW50L0hvc3RSZXBsYWNlbWVudFRlc3QuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5TaW1wbGVRdWVyeVJlc3VsdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuVG9rZW5TdXBwbGllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQXNzZXJ0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLkNsdXN0ZXJVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlRlc3RCYXNlSW1wbDsKIGltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwogCkBAIC0yMTAsNiArMjExLDggQEAKICAgICAgICAgZml4RGlzdHJpYnV0ZWRTY2hlbWFzKGNsdXN0ZXIpOwogICAgICAgICBpbml0KGNsdXN0ZXIpOwogCisgICAgICAgIENsdXN0ZXJVdGlscy5hd2FpdEdvc3NpcFNjaGVtYU1hdGNoKGNsdXN0ZXIpOworCiAgICAgICAgIHBvcHVsYXRlKGNsdXN0ZXIpOwogICAgICAgICBjbHVzdGVyLmZvckVhY2goaSAtPiBpLmZsdXNoKEtFWVNQQUNFKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L2pteC9KTVhHZXR0ZXJDaGVja1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9qbXgvSk1YR2V0dGVyQ2hlY2tUZXN0LmphdmEKaW5kZXggZWYwZjFlYy4uYjkzNWUyNCAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L2pteC9KTVhHZXR0ZXJDaGVja1Rlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvam14L0pNWEdldHRlckNoZWNrVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5UZXN0QmFzZUltcGw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSk1YU2VydmVyVXRpbHM7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JU19ESVNBQkxFRF9NQkVBTl9SRUdJU1RSQVRJT047CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuT1JHX0FQQUNIRV9DQVNTQU5EUkFfRElTQUJMRV9NQkVBTl9SRUdJU1RSQVRJT047CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyLmdldEF1dG9tYXRpY2FsbHlBbGxvY2F0ZWRQb3J0OwogCiBwdWJsaWMgY2xhc3MgSk1YR2V0dGVyQ2hlY2tUZXN0IGV4dGVuZHMgVGVzdEJhc2VJbXBsCkBAIC02OCw3ICs2OCw3IEBACiAgICAgICAgIGpteFNlcnZlci5zdGFydCgpOwogICAgICAgICBTdHJpbmcgdXJsID0gInNlcnZpY2U6am14OnJtaTovLy9qbmRpL3JtaTovLyIgKyBqbXhIb3N0ICsgIjoiICsgam14UG9ydCArICIvam14cm1pIjsKIAotICAgICAgICBJU19ESVNBQkxFRF9NQkVBTl9SRUdJU1RSQVRJT04uc2V0Qm9vbGVhbihmYWxzZSk7CisgICAgICAgIE9SR19BUEFDSEVfQ0FTU0FORFJBX0RJU0FCTEVfTUJFQU5fUkVHSVNUUkFUSU9OLnNldEJvb2xlYW4oZmFsc2UpOwogICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IENsdXN0ZXIuYnVpbGQoMSkud2l0aENvbmZpZyhjIC0+IGMud2l0aChGZWF0dXJlLnZhbHVlcygpKSkuc3RhcnQoKSkKICAgICAgICAgewogICAgICAgICAgICAgTGlzdDxOYW1lZD4gZXJyb3JzID0gbmV3IEFycmF5TGlzdDw+KCk7CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvbWV0cmljL1RhYmxlTWV0cmljVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L21ldHJpYy9UYWJsZU1ldHJpY1Rlc3QuamF2YQppbmRleCAwOGM5MzI0Li5hOGRkZmUwIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvbWV0cmljL1RhYmxlTWV0cmljVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9tZXRyaWMvVGFibGVNZXRyaWNUZXN0LmphdmEKQEAgLTQ3LDcgKzQ3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFjaW5nLlRyYWNlS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuTUJlYW5XcmFwcGVyOwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSVNfRElTQUJMRURfTUJFQU5fUkVHSVNUUkFUSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk9SR19BUEFDSEVfQ0FTU0FORFJBX0RJU0FCTEVfTUJFQU5fUkVHSVNUUkFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk1CRUFOX1JFR0lTVFJBVElPTl9DTEFTUzsKIAogcHVibGljIGNsYXNzIFRhYmxlTWV0cmljVGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbApAQCAtNTUsNyArNTUsNyBAQAogICAgIHN0YXRpYwogICAgIHsKICAgICAgICAgTUJFQU5fUkVHSVNUUkFUSU9OX0NMQVNTLnNldFN0cmluZyhNYXBNQmVhbldyYXBwZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgSVNfRElTQUJMRURfTUJFQU5fUkVHSVNUUkFUSU9OLnNldEJvb2xlYW4oZmFsc2UpOworICAgICAgICBPUkdfQVBBQ0hFX0NBU1NBTkRSQV9ESVNBQkxFX01CRUFOX1JFR0lTVFJBVElPTi5zZXRCb29sZWFuKGZhbHNlKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IFNZU1RFTV9UQUJMRVMgPSBudWxsOwpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L21ldHJpY3MvUmVxdWVzdFRpbWVvdXRUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvbWV0cmljcy9SZXF1ZXN0VGltZW91dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzk5ZmNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L21ldHJpY3MvUmVxdWVzdFRpbWVvdXRUZXN0LmphdmEKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5tZXRyaWNzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG5ldC5ieXRlYnVkZHkuQnl0ZUJ1ZGR5OworaW1wb3J0IG5ldC5ieXRlYnVkZHkuZHluYW1pYy5sb2FkaW5nLkNsYXNzTG9hZGluZ1N0cmF0ZWd5OworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uTWV0aG9kRGVsZWdhdGlvbjsKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmltcGxlbWVudGF0aW9uLmJpbmQuYW5ub3RhdGlvbi5TdXBlckNhbGw7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5iaW5kLmFubm90YXRpb24uU3VwZXJNZXRob2Q7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5iaW5kLmFubm90YXRpb24uVGhpczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5CYXRjaFN0YXRlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3QuVGVzdEJhc2VJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUmVxdWVzdEZhaWx1cmVSZWFzb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlJlcXVlc3RDYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Bc3NlcnRpb25VdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNhc1dyaXRlVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlYWRUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuV3JpdGVUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UucGF4b3MuUGF4b3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Bd2FpdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5Db25kaXRpb247CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKKworaW1wb3J0IHN0YXRpYyBuZXQuYnl0ZWJ1ZGR5Lm1hdGNoZXIuRWxlbWVudE1hdGNoZXJzLm5hbWVkOworaW1wb3J0IHN0YXRpYyBuZXQuYnl0ZWJ1ZGR5Lm1hdGNoZXIuRWxlbWVudE1hdGNoZXJzLnRha2VzQXJndW1lbnRzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Bc3NlcnRpb25VdGlscy5pc1Rocm93YWJsZTsKKworcHVibGljIGNsYXNzIFJlcXVlc3RUaW1lb3V0VGVzdCBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgTkVYVCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPT1JESU5BVE9SID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBDbHVzdGVyIENMVVNURVI7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ0xVU1RFUiA9IENsdXN0ZXIuYnVpbGQoMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjIC0+IGMuc2V0KCJ0cnVuY2F0ZV9yZXF1ZXN0X3RpbWVvdXQiLCAiMTBzIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhJbnN0YW5jZUluaXRpYWxpemVyKEJCOjppbnN0YWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydCgpOworICAgICAgICBpbml0KENMVVNURVIpOworICAgICAgICBDTFVTVEVSLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50YmwgKHBrIGludCBQUklNQVJZIEtFWSwgdiBpbnQpIikpOworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFudXAoKQorICAgIHsKKyAgICAgICAgaWYgKENMVVNURVIgIT0gbnVsbCkKKyAgICAgICAgICAgIENMVVNURVIuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlKCkKKyAgICB7CisgICAgICAgIENMVVNURVIuZ2V0KENPT1JESU5BVE9SKS5ydW5Pbkluc3RhbmNlKCgpIC0+IE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS5jYWxsYmFja3MudW5zYWZlQ2xlYXIoKSk7CisgICAgICAgIENMVVNURVIuZmlsdGVycygpLnJlc2V0KCk7CisgICAgICAgIEJCLnJlc2V0KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnQoKQorICAgIHsKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5NVVRBVElPTl9SRVEuaWQpLnRvKDIpLmRyb3AoKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gQ0xVU1RFUi5jb29yZGluYXRvcihDT09SRElOQVRPUikuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRibCAocGssIHYpIFZBTFVFUyAoPywgPykiKSwgQ29uc2lzdGVuY3lMZXZlbC5BTEwsIE5FWFQuZ2V0QW5kSW5jcmVtZW50KCksIE5FWFQuZ2V0QW5kSW5jcmVtZW50KCkpKQorICAgICAgICAgICAgICAgICAgLmlzKGlzVGhyb3dhYmxlKFdyaXRlVGltZW91dEV4Y2VwdGlvbi5jbGFzcykpOworICAgICAgICBCQi5hc3NlcnRJc1RpbWVvdXRUcnVlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKQorICAgIHsKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5NVVRBVElPTl9SRVEuaWQpLnRvKDIpLmRyb3AoKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gQ0xVU1RFUi5jb29yZGluYXRvcihDT09SRElOQVRPUikuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlVQREFURSAlcy50YmwgU0VUIHY9PyBXSEVSRSBwaz0/IiksIENvbnNpc3RlbmN5TGV2ZWwuQUxMLCBORVhULmdldEFuZEluY3JlbWVudCgpLCBORVhULmdldEFuZEluY3JlbWVudCgpKSkKKyAgICAgICAgICAgICAgICAgIC5pcyhpc1Rocm93YWJsZShXcml0ZVRpbWVvdXRFeGNlcHRpb24uY2xhc3MpKTsKKyAgICAgICAgQkIuYXNzZXJ0SXNUaW1lb3V0VHJ1ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYmF0Y2hJbnNlcnQoKQorICAgIHsKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5NVVRBVElPTl9SRVEuaWQpLnRvKDIpLmRyb3AoKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gQ0xVU1RFUi5jb29yZGluYXRvcihDT09SRElOQVRPUikuZXhlY3V0ZShiYXRjaCh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRibCAocGssIHYpIFZBTFVFUyAoPywgPykiKSksIENvbnNpc3RlbmN5TGV2ZWwuQUxMLCBORVhULmdldEFuZEluY3JlbWVudCgpLCBORVhULmdldEFuZEluY3JlbWVudCgpKSkKKyAgICAgICAgICAgICAgICAgIC5pcyhpc1Rocm93YWJsZShXcml0ZVRpbWVvdXRFeGNlcHRpb24uY2xhc3MpKTsKKyAgICAgICAgQkIuYXNzZXJ0SXNUaW1lb3V0VHJ1ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmFuZ2VTZWxlY3QoKQorICAgIHsKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5SQU5HRV9SRVEuaWQpLnRvKDIpLmRyb3AoKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gQ0xVU1RFUi5jb29yZGluYXRvcihDT09SRElOQVRPUikuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCAqIEZST00gJXMudGJsIiksIENvbnNpc3RlbmN5TGV2ZWwuQUxMKSkKKyAgICAgICAgICAgICAgICAgIC5pcyhpc1Rocm93YWJsZShSZWFkVGltZW91dEV4Y2VwdGlvbi5jbGFzcykpOworICAgICAgICBCQi5hc3NlcnRJc1RpbWVvdXRUcnVlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzZWxlY3QoKQorICAgIHsKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5SRUFEX1JFUS5pZCkudG8oMikuZHJvcCgpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBDTFVTVEVSLmNvb3JkaW5hdG9yKENPT1JESU5BVE9SKS5leGVjdXRlKHdpdGhLZXlzcGFjZSgiU0VMRUNUICogRlJPTSAlcy50YmwgV0hFUkUgcGs9PyIpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgTkVYVC5nZXRBbmRJbmNyZW1lbnQoKSkpCisgICAgICAgICAgICAgICAgICAuaXMoaXNUaHJvd2FibGUoUmVhZFRpbWVvdXRFeGNlcHRpb24uY2xhc3MpKTsKKyAgICAgICAgQkIuYXNzZXJ0SXNUaW1lb3V0VHJ1ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdHJ1bmNhdGUoKQorICAgIHsKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5UUlVOQ0FURV9SRVEuaWQpLnRvKDIpLmRyb3AoKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gQ0xVU1RFUi5jb29yZGluYXRvcihDT09SRElOQVRPUikuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlRSVU5DQVRFICVzLnRibCIpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCkpCisgICAgICAgICAgICAgICAgICAuaXMoQXNzZXJ0aW9uVXRpbHMucm9vdENhdXNlSXMoVGltZW91dEV4Y2VwdGlvbi5jbGFzcykpOworICAgICAgICBCQi5hc3NlcnRJc1RpbWVvdXRUcnVlKCk7CisgICAgfQorCisgICAgLy8gZG9uJ3QgY2FsbCBCQi5hc3NlcnRJc1RpbWVvdXRUcnVlKCk7IGZvciBDQVMsIGFzIGl0IGhhcyBpdHMgb3duIGxvZ2ljCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNhc1YyUHJlcGFyZUluc2VydCgpCisgICAgeworICAgICAgICB3aXRoUGF4b3MoQ29uZmlnLlBheG9zVmFyaWFudC52Mik7CisKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5QQVhPUzJfUFJFUEFSRV9SRVEuaWQpLnRvKDIsIDMpLmRyb3AoKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gQ0xVU1RFUi5jb29yZGluYXRvcihDT09SRElOQVRPUikuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIklOU0VSVCBJTlRPICVzLnRibCAocGssIHYpIFZBTFVFUyAoPywgPykgSUYgTk9UIEVYSVNUUyIpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgTkVYVC5nZXRBbmRJbmNyZW1lbnQoKSwgTkVYVC5nZXRBbmRJbmNyZW1lbnQoKSkpCisgICAgICAgICAgICAgICAgICAuaXMoaXNUaHJvd2FibGUoQ2FzV3JpdGVUaW1lb3V0RXhjZXB0aW9uLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjYXNWMlByZXBhcmVTZWxlY3QoKQorICAgIHsKKyAgICAgICAgd2l0aFBheG9zKENvbmZpZy5QYXhvc1ZhcmlhbnQudjIpOworCisgICAgICAgIENMVVNURVIuZmlsdGVycygpLnZlcmJzKFZlcmIuUEFYT1MyX1BSRVBBUkVfUkVRLmlkKS50bygyLCAzKS5kcm9wKCk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IENMVVNURVIuY29vcmRpbmF0b3IoQ09PUkRJTkFUT1IpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJTRUxFQ1QgKiBGUk9NICVzLnRibCBXSEVSRSBwaz0/IiksIENvbnNpc3RlbmN5TGV2ZWwuU0VSSUFMLCBORVhULmdldEFuZEluY3JlbWVudCgpKSkKKyAgICAgICAgICAgICAgICAgIC5pcyhpc1Rocm93YWJsZShSZWFkVGltZW91dEV4Y2VwdGlvbi5jbGFzcykpOyAvLyB3aHkgZG9lcyB3cml0ZSBoYXZlIGl0cyBvd24gdHlwZSBidXQgbm90IHJlYWQ/CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjYXNWMkNvbW1pdEluc2VydCgpCisgICAgeworICAgICAgICB3aXRoUGF4b3MoQ29uZmlnLlBheG9zVmFyaWFudC52Mik7CisKKyAgICAgICAgQ0xVU1RFUi5maWx0ZXJzKCkudmVyYnMoVmVyYi5QQVhPU19DT01NSVRfUkVRLmlkKS50bygyLCAzKS5kcm9wKCk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IENMVVNURVIuY29vcmRpbmF0b3IoQ09PUkRJTkFUT1IpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50YmwgKHBrLCB2KSBWQUxVRVMgKD8sID8pIElGIE5PVCBFWElTVFMiKSwgQ29uc2lzdGVuY3lMZXZlbC5BTEwsIE5FWFQuZ2V0QW5kSW5jcmVtZW50KCksIE5FWFQuZ2V0QW5kSW5jcmVtZW50KCkpKQorICAgICAgICAgICAgICAgICAgLmlzKGlzVGhyb3dhYmxlKENhc1dyaXRlVGltZW91dEV4Y2VwdGlvbi5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd2l0aFBheG9zKENvbmZpZy5QYXhvc1ZhcmlhbnQgdmFyaWFudCkKKyAgICB7CisgICAgICAgIENMVVNURVIuZm9yRWFjaChpIC0+IGkucnVuT25JbnN0YW5jZSgoKSAtPiBQYXhvcy5zZXRQYXhvc1ZhcmlhbnQodmFyaWFudCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmF0Y2goU3RyaW5nIGNxbCkKKyAgICB7CisgICAgICAgIHJldHVybiAiQkVHSU4gIiArIEJhdGNoU3RhdGVtZW50LlR5cGUuVU5MT0dHRUQubmFtZSgpICsgIiBCQVRDSFxuIiArIGNxbCArICJcbkFQUExZIEJBVENIIjsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJCCisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChDbGFzc0xvYWRlciBjbCwgaW50IG51bSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG51bSAhPSBDT09SRElOQVRPUikKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBuZXcgQnl0ZUJ1ZGR5KCkucmViYXNlKENvbmRpdGlvbi5Bc3luYy5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXRob2QobmFtZWQoImF3YWl0IikuYW5kKHRha2VzQXJndW1lbnRzKDIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRlcmNlcHQoTWV0aG9kRGVsZWdhdGlvbi50byhCQi5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFrZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9hZChjbCwgQ2xhc3NMb2FkaW5nU3RyYXRlZ3kuRGVmYXVsdC5JTkpFQ1RJT04pOworCisgICAgICAgICAgICBuZXcgQnl0ZUJ1ZGR5KCkucmViYXNlKFJlcXVlc3RDYWxsYmFjay5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXRob2QobmFtZWQoImlzVGltZW91dCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gYXdhaXQobG9uZyB0aW1lLCBUaW1lVW5pdCB1bml0cywgQFRoaXMgQXdhaXRhYmxlIHNlbGYsIEBTdXBlck1ldGhvZCBNZXRob2QgbWV0aG9kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlIHVuZGVybGluZSBjb25kaXRpb24gaXMgbWV0IGJlZm9yZSByZXR1cm5uaW5nIHRydWUKKyAgICAgICAgICAgIC8vIHRoaXMgd2F5IGl0cyBrbm93IHRoYXQgdGhlIHRpbWVvdXRzIHRyaWdnZXJlZCEKKyAgICAgICAgICAgIHdoaWxlICghKChib29sZWFuKSBtZXRob2QuaW52b2tlKHNlbGYsIHRpbWUsIHVuaXRzKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgVElNRU9VVFMgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVGltZW91dChNYXA8SW5ldEFkZHJlc3NBbmRQb3J0LCBSZXF1ZXN0RmFpbHVyZVJlYXNvbj4gZmFpbHVyZVJlYXNvbkJ5RW5kcG9pbnQsIEBTdXBlckNhbGwgQ2FsbGFibGU8Qm9vbGVhbj4gZm4pIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYm9vbGVhbiB0aW1lb3V0ID0gZm4uY2FsbCgpOworICAgICAgICAgICAgaWYgKHRpbWVvdXQpCisgICAgICAgICAgICAgICAgVElNRU9VVFMuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICByZXR1cm4gdGltZW91dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRJc1RpbWVvdXRUcnVlKCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRpbWVvdXRzID0gQ0xVU1RFUi5nZXQoQ09PUkRJTkFUT1IpLmNhbGxPbkluc3RhbmNlKCgpIC0+IFRJTUVPVVRTLmdldEFuZFNldCgwKSk7CisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodGltZW91dHMpLmlzR3JlYXRlclRoYW4oMCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICBDTFVTVEVSLmdldChDT09SRElOQVRPUikucnVuT25JbnN0YW5jZSgoKSAtPiBUSU1FT1VUUy5zZXQoMCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3JpbmcvQm9vdHN0cmFwVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3JpbmcvQm9vdHN0cmFwVGVzdC5qYXZhCmluZGV4IDQyM2U3OGIuLmYzMWUzYTggMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9yaW5nL0Jvb3RzdHJhcFRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvcmluZy9Cb290c3RyYXBUZXN0LmphdmEKQEAgLTE5LDE2ICsxOSwyNCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnJpbmc7CiAKIGltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NYW5hZ2VtZW50RmFjdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uSW50U3RyZWFtOwogCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtcHRpb25WaW9sYXRlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU3lzdGVtS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JQ2x1c3RlcjsKQEAgLTM2LDkgKzQ0LDE0IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJbnZva2FibGVJbnN0YW5jZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuVG9rZW5TdXBwbGllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuTmV0d29ya1RvcG9sb2d5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlRlc3RCYXNlSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpPSU5fUklORzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NSUdSQVRJT05fREVMQVk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hY3Rpb24uR29zc2lwSGVscGVyLmJvb3RzdHJhcDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYWN0aW9uLkdvc3NpcEhlbHBlci5wdWxsU2NoZW1hRnJvbTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYWN0aW9uLkdvc3NpcEhlbHBlci5zdGF0dXNUb0Jvb3RzdHJhcDsKQEAgLTUwLDYgKzYzLDggQEAKIHsKICAgICBwcml2YXRlIGxvbmcgc2F2ZWRNaWdyYXRpb25EZWxheTsKIAorICAgIHN0YXRpYyBXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzOworCiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKQogICAgIHsKQEAgLTU5LDE4ICs3NCwxMzkgQEAKICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgcnVubmluZyBtdWx0aXBsZSB0ZXN0IGNhc2VzIGluIHRoZSBjbGFzcywgd2hlcmUgZWFjaCBzdGFydHMgYSBub2RlIGJ1dCBpbiB0aGUgc2FtZSBKVk0sIHRoZQogICAgICAgICAvLyB1cC10aW1lIHdpbGwgYmUgbW9yZSBvciBsZXNzIHJlbGV2YW50IG9ubHkgZm9yIHRoZSBmaXJzdCB0ZXN0LiBJbiBvcmRlciB0byBlbmZvcmNlIHRoZSBzdGFydHVwLWxpa2UgYmVoYXZpb3VyCiAgICAgICAgIC8vIGZvciBlYWNoIHRlc3QgY2FzZSwgdGhlIE1JR1JBVElPTl9ERUxBWSB0aW1lIGlzIGFkanVzdGVkIGFjY29yZGluZ2x5Ci0gICAgICAgIHNhdmVkTWlncmF0aW9uRGVsYXkgPSBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTUlHUkFUSU9OX0RFTEFZLmdldExvbmcoKTsKLSAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk1JR1JBVElPTl9ERUxBWS5zZXRMb25nKE1hbmFnZW1lbnRGYWN0b3J5LmdldFJ1bnRpbWVNWEJlYW4oKS5nZXRVcHRpbWUoKSArIHNhdmVkTWlncmF0aW9uRGVsYXkpOworICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KE1JR1JBVElPTl9ERUxBWSwgTWFuYWdlbWVudEZhY3RvcnkuZ2V0UnVudGltZU1YQmVhbigpLmdldFVwdGltZSgpICsgc2F2ZWRNaWdyYXRpb25EZWxheSk7CiAgICAgfQogCiAgICAgQEFmdGVyCiAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXN0KCkKICAgICB7Ci0gICAgICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NSUdSQVRJT05fREVMQVkuc2V0TG9uZyhzYXZlZE1pZ3JhdGlvbkRlbGF5KTsKKyAgICAgICAgcHJvcGVydGllcy5jbG9zZSgpOwogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgYm9vdHN0cmFwVGVzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICBwdWJsaWMgdm9pZCBib290c3RyYXBXaXRoUmVzdW1lVGVzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFJFU0VUX0JPT1RTVFJBUF9QUk9HUkVTUy5zZXRCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgYm9vdHN0cmFwVGVzdCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYm9vdHN0cmFwV2l0aG91dFJlc3VtZVRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBSRVNFVF9CT09UU1RSQVBfUFJPR1JFU1Muc2V0Qm9vbGVhbih0cnVlKTsKKyAgICAgICAgYm9vdHN0cmFwVGVzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpcm0gdGhhdCBhIG5vcm1hbCwgbm9uLXJlc3VtZWQgYm9vdHN0cmFwIHdpdGhvdXQgdGhlIHJlc2V0X2Jvb3RzdHJhcF9wcm9ncmVzcyBwYXJhbSBzcGVjaWZpZWQgd29ya3Mgd2l0aG91dCBpc3N1ZS4KKyAgICAgKiBAdGhyb3dzIFRocm93YWJsZQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYm9vdHN0cmFwVW5zcGVjaWZpZWRSZXN1bWVUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgUkVTRVRfQk9PVFNUUkFQX1BST0dSRVNTLmNsZWFyVmFsdWUoKTsgLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgbmVhcmJ5ICdjbGVhclZhbHVlU3lzdGVtUHJvcGVydHlVc2FnZScKKyAgICAgICAgYm9vdHN0cmFwVGVzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpcm0gdGhhdCwgaW4gdGhlIGFic2VuY2Ugb2YgdGhlIHJlc2V0X2Jvb3RzdHJhcF9wcm9ncmVzcyBwYXJhbSBiZWluZyBzZXQgYW5kIGluIHRoZSBmYWNlIG9mIGEgZm91bmQgcHJpb3IKKyAgICAgKiBwYXJ0aWFsIGJvb3RzdHJhcCwgd2UgZXJyb3Igb3V0IGFuZCBkb24ndCBjb21wbGV0ZSBvdXIgYm9vdHN0cmFwLgorICAgICAqCisgICAgICogVGVzdCB3L291dCB2bm9kZXMgb25seTsgbG9naWMgaXMgaWRlbnRpY2FsIGZvciBib3RoIHJ1biBlbnYgYnV0IHRoZSB0b2tlbiBhbGxvYyBpbiB0aGlzIHRlc3QgZG9lc24ndCB3b3JrIGZvcgorICAgICAqIHZub2RlIGVudiBhbmQgaXQncyBub3Qgd29ydGggdGhlIGxpZnQgdG8gdXBkYXRlIGl0IHRvIHdvcmsgaW4gYm90aCBlbnYuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFRocm93YWJsZQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYm9vdHN0cmFwVW5zcGVjaWZpZWRGYWlsc09uUmVzdW1lVGVzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFJFU0VUX0JPT1RTVFJBUF9QUk9HUkVTUy5jbGVhclZhbHVlKCk7IC8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnY2xlYXJWYWx1ZVN5c3RlbVByb3BlcnR5VXNhZ2UnCisKKyAgICAgICAgLy8gTmVlZCBvdXIgcGFydGl0aW9uZXIgYWN0aXZlIGZvciByYW5nZVRvQnl0ZXMgY29udmVyc2lvbiBiZWxvdworICAgICAgICBDb25maWcgYyA9IERhdGFiYXNlRGVzY3JpcHRvci5sb2FkQ29uZmlnKCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigoKSAtPiBjKTsKKworICAgICAgICBpbnQgb3JpZ2luYWxOb2RlQ291bnQgPSAyOworICAgICAgICBpbnQgZXhwYW5kZWROb2RlQ291bnQgPSBvcmlnaW5hbE5vZGVDb3VudCArIDE7CisKKyAgICAgICAgYm9vbGVhbiBzYXdFeGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgdHJ5IChDbHVzdGVyIGNsdXN0ZXIgPSBidWlsZGVyKCkud2l0aE5vZGVzKG9yaWdpbmFsTm9kZUNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRob3V0Vk5vZGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFRva2VuU3VwcGxpZXIoVG9rZW5TdXBwbGllci5ldmVubHlEaXN0cmlidXRlZFRva2VucyhleHBhbmRlZE5vZGVDb3VudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhOb2RlSWRUb3BvbG9neShOZXR3b3JrVG9wb2xvZ3kuc2luZ2xlRGNOZXR3b3JrVG9wb2xvZ3koZXhwYW5kZWROb2RlQ291bnQsICJkYzAiLCAicmFjazAiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjb25maWcgLT4gY29uZmlnLndpdGgoTkVUV09SSywgR09TU0lQKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgcG9wdWxhdGUoY2x1c3RlciwgMCwgMTAwKTsKKworICAgICAgICAgICAgSUluc3RhbmNlQ29uZmlnIGNvbmZpZyA9IGNsdXN0ZXIubmV3SW5zdGFuY2VDb25maWcoKTsKKyAgICAgICAgICAgIElJbnZva2FibGVJbnN0YW5jZSBuZXdJbnN0YW5jZSA9IGNsdXN0ZXIuYm9vdHN0cmFwKGNvbmZpZyk7CisgICAgICAgICAgICAgICAgd2l0aFByb3BlcnR5KEpPSU5fUklORywgZmFsc2UsICgpIC0+IG5ld0luc3RhbmNlLnN0YXJ0dXAoY2x1c3RlcikpOworCisgICAgICAgICAgICBjbHVzdGVyLmZvckVhY2goc3RhdHVzVG9Cb290c3RyYXAobmV3SW5zdGFuY2UpKTsKKworICAgICAgICAgICAgTGlzdDxUb2tlbj4gdG9rZW5zID0gY2x1c3Rlci50b2tlbnMoKTsKKyAgICAgICAgICAgIGFzc2VydCB0b2tlbnMuc2l6ZSgpID49IDM7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBPdXIgbG9jYWwgdG9rZW5zOgorICAgICAgICAgICAgVG9rZW5zIGluIGNsdXN0ZXIgdG9rZW5zOiBbLTMwNzQ0NTczNDU2MTgyNTg2MDMsIDMwNzQ0NTczNDU2MTgyNTg2MDEsIDkyMjMzNzIwMzY4NTQ3NzU4MDVdCisKKyAgICAgICAgICAgIEZyb20gdGhlIGJvb3RzdHJhcCBwcm9jZXNzOgorICAgICAgICAgICAgZmV0Y2hSZXBsaWNhcyBpbiBvdXIgdGVzdCBrZXlzcGFjZToKKyAgICAgICAgICAgIFtGZXRjaFJlcGxpY2EKKyAgICAgICAgICAgICAgICB7bG9jYWw9RnVsbCgvMTI3LjAuMC4zOjcwMTIsKC0zMDc0NDU3MzQ1NjE4MjU4NjAzLDMwNzQ0NTczNDU2MTgyNTg2MDFdKSwKKyAgICAgICAgICAgICAgICByZW1vdGU9RnVsbCgvMTI3LjAuMC4xOjcwMTIsKC0zMDc0NDU3MzQ1NjE4MjU4NjAzLDMwNzQ0NTczNDU2MTgyNTg2MDFdKX0sCisgICAgICAgICAgICBGZXRjaFJlcGxpY2EKKyAgICAgICAgICAgICAgICB7bG9jYWw9RnVsbCgvMTI3LjAuMC4zOjcwMTIsKDkyMjMzNzIwMzY4NTQ3NzU4MDUsLTMwNzQ0NTczNDU2MTgyNTg2MDNdKSwKKyAgICAgICAgICAgICAgICByZW1vdGU9RnVsbCgvMTI3LjAuMC4xOjcwMTIsKDkyMjMzNzIwMzY4NTQ3NzU4MDUsLTMwNzQ0NTczNDU2MTgyNTg2MDNdKX0sCisgICAgICAgICAgICBGZXRjaFJlcGxpY2EKKyAgICAgICAgICAgICAgICB7bG9jYWw9RnVsbCgvMTI3LjAuMC4zOjcwMTIsKDMwNzQ0NTczNDU2MTgyNTg2MDEsOTIyMzM3MjAzNjg1NDc3NTgwNV0pLAorICAgICAgICAgICAgICAgIHJlbW90ZT1GdWxsKC8xMjcuMC4wLjE6NzAxMiwoMzA3NDQ1NzM0NTYxODI1ODYwMSw5MjIzMzcyMDM2ODU0Nzc1ODA1XSl9XQorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIC8vIEluc2VydCBzb21lIGJvZ3VzIHJhbmdlcyBpbiB0aGUga2V5c3BhY2UgdG8gYmUgYm9vdHN0cmFwcGVkIHRvIHRyaWdnZXIgdGhlIGNoZWNrIG9uIGF2YWlsYWJsZSByYW5nZXMgb24gYm9vdHN0cmFwLgorICAgICAgICAgICAgLy8gTm90ZTogdGhlc2UgaGF2ZSB0byBwcmVjaXNlbHkgb3ZlcmxhcCB3aXRoIHRoZSB0b2tlbiByYW5nZXMgaGl0IGR1cmluZyBzdHJlYW1pbmcgb3IgdGhleSB3b24ndCB0cmlnZ2VyIHRoZQorICAgICAgICAgICAgLy8gYXZhaWxhYmlsaXR5IGxvZ2ljIG9uIGJvb3RzdHJhcCB0byB0aGVuIGV4Y2VwdCBvdXQ7IHdlIGNhbid0IGp1c3QgaGF2ZSBfYW55XyByYW5nZSBmb3IgYSBrZXlzcGFjZSwgYnV0IHJhdGhlciwKKyAgICAgICAgICAgIC8vIG11c3QgaGF2ZSBhIHJhbmdlIHRoYXQgb3ZlcmxhcHMgd2l0aCB3aGF0IHdlJ3JlIHRyeWluZyB0byBzdHJlYW0uCisgICAgICAgICAgICBTZXQ8UmFuZ2UgPFRva2VuPj4gZnVsbFNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgIGZ1bGxTZXQuYWRkKG5ldyBSYW5nZTw+KHRva2Vucy5nZXQoMCksIHRva2Vucy5nZXQoMSkpKTsKKyAgICAgICAgICAgIGZ1bGxTZXQuYWRkKG5ldyBSYW5nZTw+KHRva2Vucy5nZXQoMSksIHRva2Vucy5nZXQoMikpKTsKKyAgICAgICAgICAgIGZ1bGxTZXQuYWRkKG5ldyBSYW5nZTw+KHRva2Vucy5nZXQoMiksIHRva2Vucy5nZXQoMCkpKTsKKworICAgICAgICAgICAgLy8gU2hvdWxkIGJlIGZpbmUgdG8gdHJpZ2dlciBvbiBmdWxsIHJhbmdlcyBvbmx5IGJ1dCBhZGQgYSBwYXJ0aWFsIGZvciBnb29kIG1lYXN1cmUuCisgICAgICAgICAgICBTZXQ8UmFuZ2UgPFRva2VuPj4gcGFydGlhbFNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgIHBhcnRpYWxTZXQuYWRkKG5ldyBSYW5nZTw+KHRva2Vucy5nZXQoMiksIHRva2Vucy5nZXQoMSkpKTsKKworICAgICAgICAgICAgU3RyaW5nIGNxbCA9IFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChrZXlzcGFjZV9uYW1lLCBmdWxsX3JhbmdlcywgdHJhbnNpZW50X3JhbmdlcykgVkFMVUVTICg/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5BVkFJTEFCTEVfUkFOR0VTX1YyKTsKKworICAgICAgICAgICAgbmV3SW5zdGFuY2UuZXhlY3V0ZUludGVybmFsKGNxbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsU2V0LnN0cmVhbSgpLm1hcChTeXN0ZW1LZXlzcGFjZTo6cmFuZ2VUb0J5dGVzKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGlhbFNldC5zdHJlYW0oKS5tYXAoU3lzdGVtS2V5c3BhY2U6OnJhbmdlVG9CeXRlcykuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKworICAgICAgICAgICAgLy8gV2UgZXhwZWN0IGJvb3RzdHJhcCB0byB0aHJvdyBhbiBleGNlcHRpb24gb24gbm9kZTMgdy90aGUgc2VlbiByYW5nZXMgd2UndmUgaW5zZXJ0ZWQKKyAgICAgICAgICAgIGNsdXN0ZXIucnVuKGFzTGlzdChwdWxsU2NoZW1hRnJvbShjbHVzdGVyLmdldCgxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5zdGFuY2UuY29uZmlnKCkubnVtKCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChBc3N1bXB0aW9uVmlvbGF0ZWRFeGNlcHRpb24gYXZlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBXZSBnZXQgYW4gQXNzdW1wdGlvblZpb2xhdGVkRXhjZXB0aW9uIGlmIHdlJ3JlIGluIGEgdGVzdCBqb2IgY29uZmlndXJlZCB3L3Zub2RlcworICAgICAgICAgICAgdGhyb3cgYXZlOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJ0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJ0ZS5nZXRNZXNzYWdlKCkuY29udGFpbnMoIkRpc2NvdmVyZWQgZXhpc3RpbmcgYm9vdHN0cmFwIGRhdGEiKSkKKyAgICAgICAgICAgICAgICBzYXdFeGNlcHRpb24gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJFeHBlY3RlZCB0byBzZWUgYSBSdW50aW1lRXhjZXB0aW9uIHcvJ0Rpc2NvdmVyZWQgZXhpc3RpbmcgYm9vdHN0cmFwIGRhdGEnIGluIHRoZSBlcnJvciBtZXNzYWdlOyBkaWQgbm90LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNhd0V4Y2VwdGlvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGJvb3RzdHJhcFRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBpbnQgb3JpZ2luYWxOb2RlQ291bnQgPSAyOwogICAgICAgICBpbnQgZXhwYW5kZWROb2RlQ291bnQgPSBvcmlnaW5hbE5vZGVDb3VudCArIDE7CkBAIC04NSw3ICsyMjEsNyBAQAogCiAgICAgICAgICAgICBJSW5zdGFuY2VDb25maWcgY29uZmlnID0gY2x1c3Rlci5uZXdJbnN0YW5jZUNvbmZpZygpOwogICAgICAgICAgICAgSUludm9rYWJsZUluc3RhbmNlIG5ld0luc3RhbmNlID0gY2x1c3Rlci5ib290c3RyYXAoY29uZmlnKTsKLSAgICAgICAgICAgIHdpdGhQcm9wZXJ0eSgiY2Fzc2FuZHJhLmpvaW5fcmluZyIsIGZhbHNlLAorICAgICAgICAgICAgd2l0aFByb3BlcnR5KEpPSU5fUklORywgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gbmV3SW5zdGFuY2Uuc3RhcnR1cChjbHVzdGVyKSk7CiAKICAgICAgICAgICAgIGNsdXN0ZXIuZm9yRWFjaChzdGF0dXNUb0Jvb3RzdHJhcChuZXdJbnN0YW5jZSkpOwpAQCAtMTE1LDE0ICsyNTEsMTQgQEAKICAgICAgICAgewogICAgICAgICAgICAgSUluc3RhbmNlQ29uZmlnIGNvbmZpZyA9IGNsdXN0ZXIubmV3SW5zdGFuY2VDb25maWcoKTsKICAgICAgICAgICAgIElJbnZva2FibGVJbnN0YW5jZSBuZXdJbnN0YW5jZSA9IGNsdXN0ZXIuYm9vdHN0cmFwKGNvbmZpZyk7Ci0gICAgICAgICAgICB3aXRoUHJvcGVydHkoImNhc3NhbmRyYS5qb2luX3JpbmciLCBmYWxzZSwKKyAgICAgICAgICAgIHdpdGhQcm9wZXJ0eShKT0lOX1JJTkcsIGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IG5ld0luc3RhbmNlLnN0YXJ0dXAoY2x1c3RlcikpOwogCiAgICAgICAgICAgICBjbHVzdGVyLmZvckVhY2goc3RhdHVzVG9Cb290c3RyYXAobmV3SW5zdGFuY2UpKTsKIAogICAgICAgICAgICAgcG9wdWxhdGUoY2x1c3RlciwgMCwgMTAwKTsKIAotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDAsIG5ld0luc3RhbmNlLmV4ZWN1dGVJbnRlcm5hbCgiU0VMRUNUICpGUk9NICIgKyBLRVlTUEFDRSArICIudGJsIikubGVuZ3RoKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAwLCBuZXdJbnN0YW5jZS5leGVjdXRlSW50ZXJuYWwoIlNFTEVDVCAqIEZST00gIiArIEtFWVNQQUNFICsgIi50YmwiKS5sZW5ndGgpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvcmluZy9DbGVhbnVwRmFpbHVyZVRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9yaW5nL0NsZWFudXBGYWlsdXJlVGVzdC5qYXZhCmluZGV4IDljOGY3MWYuLjhlYzM2MzAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9yaW5nL0NsZWFudXBGYWlsdXJlVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9yaW5nL0NsZWFudXBGYWlsdXJlVGVzdC5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLk5ldHdvcmtUb3BvbG9neTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlRlc3RCYXNlSW1wbDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpPSU5fUklORzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFjdGlvbi5Hb3NzaXBIZWxwZXIuc3RhdHVzVG9Cb290c3RyYXA7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFjdGlvbi5Hb3NzaXBIZWxwZXIuc3RhdHVzVG9EZWNvbW1pc3Npb247CkBAIC04Niw3ICs4Nyw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIElJbnN0YW5jZUNvbmZpZyBjb25maWcgPSBjbHVzdGVyLm5ld0luc3RhbmNlQ29uZmlnKCk7CiAgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgYm9vdHN0cmFwcGluZ05vZGUgPSBjbHVzdGVyLmJvb3RzdHJhcChjb25maWcpOwotICAgICAgICAgICAgd2l0aFByb3BlcnR5KCJjYXNzYW5kcmEuam9pbl9yaW5nIiwgZmFsc2UsCisgICAgICAgICAgICB3aXRoUHJvcGVydHkoSk9JTl9SSU5HLCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBib290c3RyYXBwaW5nTm9kZS5zdGFydHVwKGNsdXN0ZXIpKTsKIAogICAgICAgICAgICAgLy8gU3RhcnQgZGVjb21pc3Npb24gb24gYm9vdHN0cmFwcGluZ05vZGUKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9yaW5nL1BlbmRpbmdXcml0ZXNUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvcmluZy9QZW5kaW5nV3JpdGVzVGVzdC5qYXZhCmluZGV4IDJlNzAyYjIuLjBlMGNmNzYgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9yaW5nL1BlbmRpbmdXcml0ZXNUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3JpbmcvUGVuZGluZ1dyaXRlc1Rlc3QuamF2YQpAQCAtNDEsNiArNDEsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuUGVuZGluZ1JhbmdlQ2FsY3VsYXRvclNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkpPSU5fUklORzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYWN0aW9uLkdvc3NpcEhlbHBlci5ib290c3RyYXA7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFjdGlvbi5Hb3NzaXBIZWxwZXIuZGlzc2VtaW5hdGVHb3NzaXBTdGF0ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYWN0aW9uLkdvc3NpcEhlbHBlci5zdGF0dXNUb0Jvb3RzdHJhcDsKQEAgLTY1LDggKzY2LDcgQEAKICAgICAgICAgICAgIEJvb3RzdHJhcFRlc3QucG9wdWxhdGUoY2x1c3RlciwgMCwgMTAwKTsKICAgICAgICAgICAgIElJbnN0YW5jZUNvbmZpZyBjb25maWcgPSBjbHVzdGVyLm5ld0luc3RhbmNlQ29uZmlnKCk7CiAgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgbmV3SW5zdGFuY2UgPSBjbHVzdGVyLmJvb3RzdHJhcChjb25maWcpOwotICAgICAgICAgICAgd2l0aFByb3BlcnR5KCJjYXNzYW5kcmEuam9pbl9yaW5nIiwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gbmV3SW5zdGFuY2Uuc3RhcnR1cChjbHVzdGVyKSk7CisgICAgICAgICAgICB3aXRoUHJvcGVydHkoSk9JTl9SSU5HLCBmYWxzZSwgKCkgLT4gbmV3SW5zdGFuY2Uuc3RhcnR1cChjbHVzdGVyKSk7CiAKICAgICAgICAgICAgIGNsdXN0ZXIuZm9yRWFjaChzdGF0dXNUb0Jvb3RzdHJhcChuZXdJbnN0YW5jZSkpOwogICAgICAgICAgICAgY2x1c3Rlci5ydW4oYm9vdHN0cmFwKGZhbHNlLCBEdXJhdGlvbi5vZlNlY29uZHMoNjApLCBEdXJhdGlvbi5vZlNlY29uZHMoNjApKSwgbmV3SW5zdGFuY2UuY29uZmlnKCkubnVtKCkpOwpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9BYnN0cmFjdFN0cmVhbUZhaWx1cmVMb2dzLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL0Fic3RyYWN0U3RyZWFtRmFpbHVyZUxvZ3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGFhNmIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9BYnN0cmFjdFN0cmVhbUZhaWx1cmVMb2dzLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Quc3RyZWFtaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5CeXRlQnVkZHk7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NMb2FkaW5nU3RyYXRlZ3k7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5NZXRob2REZWxlZ2F0aW9uOworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uYmluZC5hbm5vdGF0aW9uLlN1cGVyQ2FsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5zdHJlYW1pbmcuQ2Fzc2FuZHJhSW5jb21pbmdGaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJbnZva2FibGVJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuTG9nUmVzdWx0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5TaW1wbGVRdWVyeVJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlRlc3RCYXNlSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlJhbmdlQXdhcmVTU1RhYmxlV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVplcm9Db3B5V3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOworaW1wb3J0IHN0YXRpYyBuZXQuYnl0ZWJ1ZGR5Lm1hdGNoZXIuRWxlbWVudE1hdGNoZXJzLm5hbWVkOworaW1wb3J0IHN0YXRpYyBuZXQuYnl0ZWJ1ZGR5Lm1hdGNoZXIuRWxlbWVudE1hdGNoZXJzLnRha2VzQXJndW1lbnRzOworCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RTdHJlYW1GYWlsdXJlTG9ncyBleHRlbmRzIFRlc3RCYXNlSW1wbAoreworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEFic3RyYWN0U3RyZWFtRmFpbHVyZUxvZ3MuY2xhc3MpOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgRkFJTElOR19OT0RFID0gMjsKKworICAgIHByb3RlY3RlZCB2b2lkIHN0cmVhbVRlc3QoYm9vbGVhbiB6ZXJvQ29weVN0cmVhbWluZywgU3RyaW5nIHJlYXNvbiwgSW50ZWdlciBmYWlsZWROb2RlKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gQ2x1c3Rlci5idWlsZCgyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEluc3RhbmNlSW5pdGlhbGl6ZXIoQkJTdHJlYW1IZWxwZXI6Omluc3RhbGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGMgLT4gYy53aXRoKEZlYXR1cmUudmFsdWVzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoInN0cmVhbV9lbnRpcmVfc3N0YWJsZXMiLCB6ZXJvQ29weVN0cmVhbWluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBkaWUsIHRoaXMgd2lsbCB0cnkgdG8gaGFsdCBKVk0sIHdoaWNoIGlzIGVhc2llciB0byB2YWxpZGF0ZSBpbiB0aGUgdGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciBsZXZlbHMgcmVxdWlyZSBjaGVja2luZyBzdGF0ZSBvZiB0aGUgc3Vic3lzdGVtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJkaXNrX2ZhaWx1cmVfcG9saWN5IiwgImRpZSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW5pdChjbHVzdGVyKTsKKworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudGJsIChwayBpbnQgUFJJTUFSWSBLRVkpIikpOworCisgICAgICAgICAgICB0cmlnZ2VyU3RyZWFtaW5nKGNsdXN0ZXIpOworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGRpc2sgZmFpbHVyZSBwb2xpY3kgaXMgbm90IHRyaWdnZXJlZAorCisgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgZmFpbGluZ05vZGUgPSBjbHVzdGVyLmdldChmYWlsZWROb2RlKTsKKworICAgICAgICAgICAgc2VhcmNoRm9yTG9nKGZhaWxpbmdOb2RlLCByZWFzb24pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdHJpZ2dlclN0cmVhbWluZyhDbHVzdGVyIGNsdXN0ZXIpCisgICAgeworICAgICAgICBJSW52b2thYmxlSW5zdGFuY2Ugbm9kZTEgPSBjbHVzdGVyLmdldCgxKTsKKyAgICAgICAgSUludm9rYWJsZUluc3RhbmNlIG5vZGUyID0gY2x1c3Rlci5nZXQoMik7CisKKyAgICAgICAgLy8gcmVwYWlyIHdpbGwgZG8gc3RyZWFtaW5nIElGRiB0aGVyZSBpcyBhIG1pc21hdGNoOyBzbyBjYXVzZSBvbmUKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKQorICAgICAgICAgICAgbm9kZTEuZXhlY3V0ZUludGVybmFsKHdpdGhLZXlzcGFjZSgiSU5TRVJUIElOVE8gJXMudGJsIChwaykgVkFMVUVTICg/KSIpLCBpKTsgLy8gdGltZXN0YW1wIHdvbid0IG1hdGNoLCBjYXVzaW5nIGEgbWlzbWF0Y2gKKworICAgICAgICAvLyB0cmlnZ2VyIHN0cmVhbWluZzsgZXhwZWN0ZWQgdG8gZmFpbCBhcyBzdHJlYW1pbmcgc29ja2V0IGNsb3NlZCBpbiB0aGUgbWlkZGxlIChjdXJyZW50bHkgdGhpcyBpcyBhbiB1bnJlY292ZXJhYmxlIGV2ZW50KQorICAgICAgICAvL0Jsb2NrcyB1bnRpbCB0aGUgc3RyZWFtIGlzIGNvbXBsZXRlCisgICAgICAgIG5vZGUyLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLWZ1bGwiLCBLRVlTUEFDRSwgInRibCIpLmFzc2VydHMoKS5mYWlsdXJlKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2VhcmNoRm9yTG9nKElJbnZva2FibGVJbnN0YW5jZSBmYWlsaW5nTm9kZSwgU3RyaW5nIHJlYXNvbikKKyAgICB7CisgICAgICAgIHNlYXJjaEZvckxvZyhmYWlsaW5nTm9kZSwgdHJ1ZSwgcmVhc29uKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzZWFyY2hGb3JMb2coSUludm9rYWJsZUluc3RhbmNlIGZhaWxpbmdOb2RlLCBib29sZWFuIGZhaWxJZk5vTWF0Y2gsIFN0cmluZyByZWFzb24pCisgICAgeworICAgICAgICBMb2dSZXN1bHQ8TGlzdDxTdHJpbmc+PiByZXN1bHQgPSBmYWlsaW5nTm9kZS5sb2dzKCkuZ3JlcEZvckVycm9ycygtMSwgUGF0dGVybi5jb21waWxlKCJTdHJlYW0gZmFpbGVkOiIpKTsKKyAgICAgICAgLy8gZ3JlcEZvckVycm9ycyB3aWxsIGluY2x1ZGUgYWxsIEVSUk9SIGxvZ3MgZXZlbiBpZiB0aGV5IGRvbid0IG1hdGNoIHRoZSBwYXR0ZXJuOyBmb3IgdGhpcyByZWFzb24gbmVlZCB0byBmaWx0ZXIgYWZ0ZXIgdGhlIGZhY3QKKyAgICAgICAgTGlzdDxTdHJpbmc+IG1hdGNoZXMgPSByZXN1bHQuZ2V0UmVzdWx0KCk7CisKKyAgICAgICAgbWF0Y2hlcyA9IG1hdGNoZXMuc3RyZWFtKCkuZmlsdGVyKHMgLT4gcy5zdGFydHNXaXRoKCJXQVJOIikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJTdHJlYW0gZmFpbGVkIGxvZ3MgZm91bmQ6IHt9IiwgU3RyaW5nLmpvaW4oIlxuIiwgbWF0Y2hlcykpOworICAgICAgICBpZiAobWF0Y2hlcy5pc0VtcHR5KCkgJiYgIWZhaWxJZk5vTWF0Y2gpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KG1hdGNoZXMpCisgICAgICAgICAgICAgICAgICAuZGVzY3JpYmVkQXMoIm5vZGUlZCBleHBlY3RlZCB0byBmaW5kICVzIGJ1dCBjb3VsZCBub3QiLCBmYWlsaW5nTm9kZS5jb25maWcoKS5udW0oKSwgcmVhc29uKQorICAgICAgICAgICAgICAgICAgLmhhc1NpemUoMSk7CisgICAgICAgIFN0cmluZyBsb2dMaW5lID0gbWF0Y2hlcy5nZXQoMCk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChsb2dMaW5lKS5jb250YWlucyhyZWFzb24pOworCisgICAgICAgIE1hdGNoZXIgbWF0Y2ggPSBQYXR0ZXJuLmNvbXBpbGUoIi4qXFxbU3RyZWFtICMoLiopXFxdIikubWF0Y2hlcihsb2dMaW5lKTsKKyAgICAgICAgaWYgKCFtYXRjaC5maW5kKCkpIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5hYmxlIHRvIHBhcnNlOiAiICsgbG9nTGluZSk7CisgICAgICAgIFVVSUQgcGxhbklkID0gVVVJRC5mcm9tU3RyaW5nKG1hdGNoLmdyb3VwKDEpKTsKKyAgICAgICAgU2ltcGxlUXVlcnlSZXN1bHQgcXIgPSBmYWlsaW5nTm9kZS5leGVjdXRlSW50ZXJuYWxXaXRoUmVzdWx0KCJTRUxFQ1QgKiBGUk9NIHN5c3RlbV92aWV3cy5zdHJlYW1pbmcgV0hFUkUgaWQ9PyIsIHBsYW5JZCk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChxci5oYXNOZXh0KCkpLmlzVHJ1ZSgpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQocXIubmV4dCgpLmdldFN0cmluZygiZmFpbHVyZV9jYXVzZSIpKS5jb250YWlucyhyZWFzb24pOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJCU3RyZWFtSGVscGVyCisgICAgeworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgd3JpdGVEaXJlY3RseVRvQ2hhbm5lbChCeXRlQnVmZmVyIGJ1ZiwgQFN1cGVyQ2FsbCBDYWxsYWJsZTxJbnRlZ2VyPiB6dXBlcikgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNDYWxsZXIoU1NUYWJsZVplcm9Db3B5V3JpdGVyLmNsYXNzLmdldE5hbWUoKSwgIndyaXRlIikpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRFU1QiKTsKKyAgICAgICAgICAgIC8vIGRpZmZlcmVudCBjb250ZXh0OyBwYXNzIHRocm91Z2gKKyAgICAgICAgICAgIHJldHVybiB6dXBlci5jYWxsKCk7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGFwcGVuZChVbmZpbHRlcmVkUm93SXRlcmF0b3IgcGFydGl0aW9uLCBAU3VwZXJDYWxsIENhbGxhYmxlPEJvb2xlYW4+IHp1cGVyKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpc0NhbGxlcihDYXNzYW5kcmFJbmNvbWluZ0ZpbGUuY2xhc3MuZ2V0TmFtZSgpLCAicmVhZCIpKSAvLyBoYW5kbGVzIGNvbXByZXNzZWQgYW5kIG5vbi1jb21wcmVzc2VkCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIC8vIGRpZmZlcmVudCBjb250ZXh0OyBwYXNzIHRocm91Z2gKKyAgICAgICAgICAgIHJldHVybiB6dXBlci5jYWxsKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgSW50ZWdlciBudW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChudW0gIT0gRkFJTElOR19OT0RFKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIG5ldyBCeXRlQnVkZHkoKS5yZWJhc2UoU2VxdWVudGlhbFdyaXRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXRob2QobmFtZWQoIndyaXRlRGlyZWN0bHlUb0NoYW5uZWwiKS5hbmQodGFrZXNBcmd1bWVudHMoMSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCU3RyZWFtSGVscGVyLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsYXNzTG9hZGVyLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisKKyAgICAgICAgICAgIG5ldyBCeXRlQnVkZHkoKS5yZWJhc2UoUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKCJhcHBlbmQiKS5hbmQodGFrZXNBcmd1bWVudHMoMSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCU3RyZWFtSGVscGVyLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsYXNzTG9hZGVyLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc0NhbGxlcihTdHJpbmcga2xhc3MsIFN0cmluZyBtZXRob2QpCisgICAgeworICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIHN0YWNrID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRTdGFja1RyYWNlKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhY2subGVuZ3RoOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50IGUgPSBzdGFja1tpXTsKKyAgICAgICAgICAgIGlmIChrbGFzcy5lcXVhbHMoZS5nZXRDbGFzc05hbWUoKSkgJiYgbWV0aG9kLmVxdWFscyhlLmdldE1ldGhvZE5hbWUoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvQm91bmRFeGNlcHRpb25UZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL0JvdW5kRXhjZXB0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYzQ0NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL0JvdW5kRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVNlc3Npb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBCb3VuZEV4Y2VwdGlvblRlc3QKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTElNSVQgPSAyOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRXhjZXB0aW9uKCkKKyAgICB7CisgICAgICAgIFRocm93YWJsZSBleGNlcHRpb25Ub1Rlc3QgPSBleGNlcHRpb24oInRlc3QgZXhjZXB0aW9uIik7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYm91bmRlZFN0YWNrVHJhY2UgPSBTdHJlYW1TZXNzaW9uLmJvdW5kU3RhY2tUcmFjZShleGNlcHRpb25Ub1Rlc3QsIExJTUlULCBuZXcgU3RyaW5nQnVpbGRlcigpKTsKKworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdGFja1RyYWNlID0gImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiB0ZXN0IGV4Y2VwdGlvblxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZy5Cb3VuZEV4Y2VwdGlvblRlc3QubWV0aG9kKEJvdW5kRXhjZXB0aW9uVGVzdC5qYXZhOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Quc3RyZWFtaW5nLkJvdW5kRXhjZXB0aW9uVGVzdC5tZXRob2QoQm91bmRFeGNlcHRpb25UZXN0LmphdmE6MSlcbiI7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RhY2tUcmFjZSxib3VuZGVkU3RhY2tUcmFjZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRFeGNlcHRpb24oKQorICAgIHsKKyAgICAgICAgVGhyb3dhYmxlIGV4Y2VwdGlvblRvVGVzdCA9IGV4Y2VwdGlvbihleGNlcHRpb24oInRoZSBkaXNrIC9mb28vdmFyIGlzIGJhZCIsIGV4Y2VwdGlvbigiQmFkIGRpc2sgc29tZXdoZXJlIikpKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBib3VuZGVkU3RhY2tUcmFjZSA9IFN0cmVhbVNlc3Npb24uYm91bmRTdGFja1RyYWNlKGV4Y2VwdGlvblRvVGVzdCwgTElNSVQsIG5ldyBTdHJpbmdCdWlsZGVyKCkpOworCisgICAgICAgIFN0cmluZyBleHBlY3RlZFN0YWNrVHJhY2UgPSAiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiB0aGUgZGlzayAvZm9vL3ZhciBpcyBiYWRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0b3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5zdHJlYW1pbmcuQm91bmRFeGNlcHRpb25UZXN0Lm1ldGhvZChCb3VuZEV4Y2VwdGlvblRlc3QuamF2YTowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZy5Cb3VuZEV4Y2VwdGlvblRlc3QubWV0aG9kKEJvdW5kRXhjZXB0aW9uVGVzdC5qYXZhOjEpXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogdGhlIGRpc2sgL2Zvby92YXIgaXMgYmFkXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogQmFkIGRpc2sgc29tZXdoZXJlXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Quc3RyZWFtaW5nLkJvdW5kRXhjZXB0aW9uVGVzdC5tZXRob2QoQm91bmRFeGNlcHRpb25UZXN0LmphdmE6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0b3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5zdHJlYW1pbmcuQm91bmRFeGNlcHRpb25UZXN0Lm1ldGhvZChCb3VuZEV4Y2VwdGlvblRlc3QuamF2YToxKVxuIjsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdGFja1RyYWNlLCBib3VuZGVkU3RhY2tUcmFjZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25DeWNsZSgpCisgICAgeworICAgICAgICBFeGNlcHRpb24gZTEgPSBleGNlcHRpb24oIlRlc3QgZXhjZXB0aW9uIDEiKTsKKyAgICAgICAgRXhjZXB0aW9uIGUyID0gZXhjZXB0aW9uKCJUZXN0IGV4Y2VwdGlvbiAyIik7CisKKyAgICAgICAgZTEuaW5pdENhdXNlKGUyKTsKKyAgICAgICAgZTIuaW5pdENhdXNlKGUxKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIGJvdW5kZWRTdGFja1RyYWNlID0gU3RyZWFtU2Vzc2lvbi5ib3VuZFN0YWNrVHJhY2UoZTEsIExJTUlULCBuZXcgU3RyaW5nQnVpbGRlcigpKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RhY2tUcmFjZSA9ICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogVGVzdCBleGNlcHRpb24gMVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZy5Cb3VuZEV4Y2VwdGlvblRlc3QubWV0aG9kKEJvdW5kRXhjZXB0aW9uVGVzdC5qYXZhOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Quc3RyZWFtaW5nLkJvdW5kRXhjZXB0aW9uVGVzdC5tZXRob2QoQm91bmRFeGNlcHRpb25UZXN0LmphdmE6MSlcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiBUZXN0IGV4Y2VwdGlvbiAyXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbQ0lSQ1VMQVIgUkVGRVJFTkNFOiBqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogVGVzdCBleGNlcHRpb24gMV1cbiI7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RhY2tUcmFjZSwgYm91bmRlZFN0YWNrVHJhY2UudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdGFja1RyYWNlKCkKKyAgICB7CisgICAgICAgIFRocm93YWJsZSBleGNlcHRpb25Ub1Rlc3QgPSBleGNlcHRpb24oInRoZXJlIGFyZSB3b3JkcyBoZXJlIiwgMCk7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBib3VuZGVkU3RhY2tUcmFjZSA9IFN0cmVhbVNlc3Npb24uYm91bmRTdGFja1RyYWNlKGV4Y2VwdGlvblRvVGVzdCwgTElNSVQsIG5ldyBTdHJpbmdCdWlsZGVyKCkpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdGFja1RyYWNlID0gImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiB0aGVyZSBhcmUgd29yZHMgaGVyZVxuIjsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdGFja1RyYWNlLGJvdW5kZWRTdGFja1RyYWNlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5TmVzdGVkU3RhY2tUcmFjZSgpCisgICAgeworICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uVG9UZXN0ID0gZXhjZXB0aW9uKGV4Y2VwdGlvbigidGhlIGRpc2sgL2Zvby92YXIgaXMgYmFkIiwgZXhjZXB0aW9uKCJCYWQgZGlzayBzb21ld2hlcmUiKSwgMCksIDApOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgYm91bmRlZFN0YWNrVHJhY2UgPSBTdHJlYW1TZXNzaW9uLmJvdW5kU3RhY2tUcmFjZShleGNlcHRpb25Ub1Rlc3QsIExJTUlULCBuZXcgU3RyaW5nQnVpbGRlcigpKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RhY2tUcmFjZSA9ICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IHRoZSBkaXNrIC9mb28vdmFyIGlzIGJhZFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IHRoZSBkaXNrIC9mb28vdmFyIGlzIGJhZFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IEJhZCBkaXNrIHNvbWV3aGVyZVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZy5Cb3VuZEV4Y2VwdGlvblRlc3QubWV0aG9kKEJvdW5kRXhjZXB0aW9uVGVzdC5qYXZhOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Quc3RyZWFtaW5nLkJvdW5kRXhjZXB0aW9uVGVzdC5tZXRob2QoQm91bmRFeGNlcHRpb25UZXN0LmphdmE6MSlcbiI7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RhY2tUcmFjZSwgYm91bmRlZFN0YWNrVHJhY2UudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGltaXRMYXJnZXJUaGFuU3RhY2tUcmFjZSgpCisgICAgeworICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uVG9UZXN0ID0gZXhjZXB0aW9uKGV4Y2VwdGlvbigidGhlIGRpc2sgL2Zvby92YXIgaXMgYmFkIiwgZXhjZXB0aW9uKCJCYWQgZGlzayBzb21ld2hlcmUiKSksIDEpOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgYm91bmRlZFN0YWNrVHJhY2UgPSBTdHJlYW1TZXNzaW9uLmJvdW5kU3RhY2tUcmFjZShleGNlcHRpb25Ub1Rlc3QsIExJTUlULCBuZXcgU3RyaW5nQnVpbGRlcigpKTsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RhY2tUcmFjZSA9ICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb246IHRoZSBkaXNrIC9mb28vdmFyIGlzIGJhZFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZy5Cb3VuZEV4Y2VwdGlvblRlc3QubWV0aG9kKEJvdW5kRXhjZXB0aW9uVGVzdC5qYXZhOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogdGhlIGRpc2sgL2Zvby92YXIgaXMgYmFkXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Quc3RyZWFtaW5nLkJvdW5kRXhjZXB0aW9uVGVzdC5tZXRob2QoQm91bmRFeGNlcHRpb25UZXN0LmphdmE6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uOiBCYWQgZGlzayBzb21ld2hlcmVcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0b3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5zdHJlYW1pbmcuQm91bmRFeGNlcHRpb25UZXN0Lm1ldGhvZChCb3VuZEV4Y2VwdGlvblRlc3QuamF2YTowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHRvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZy5Cb3VuZEV4Y2VwdGlvblRlc3QubWV0aG9kKEJvdW5kRXhjZXB0aW9uVGVzdC5qYXZhOjEpXG4iOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFN0YWNrVHJhY2UsIGJvdW5kZWRTdGFja1RyYWNlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0YWNrVHJhY2VFbGVtZW50W10gZnJhbWVzKGludCBsZW5ndGgpCisgICAgeworICAgICAgICBTdGFja1RyYWNlRWxlbWVudFtdIGZyYW1lcyA9IG5ldyBTdGFja1RyYWNlRWxlbWVudFtsZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICAgICAgZnJhbWVzW2ldID0gbmV3IFN0YWNrVHJhY2VFbGVtZW50KEJvdW5kRXhjZXB0aW9uVGVzdC5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksICJtZXRob2QiLCBCb3VuZEV4Y2VwdGlvblRlc3QuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi5qYXZhIiwgaSk7CisgICAgICAgIHJldHVybiBmcmFtZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24oU3RyaW5nIG1zZykKKyAgICB7CisgICAgICAgIHJldHVybiBleGNlcHRpb24obXNnLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbihTdHJpbmcgbXNnLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihtc2csIG51bGwsIGxlbmd0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihudWxsLCBjYXVzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihudWxsLCBjYXVzZSwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UpCisgICAgeworICAgICAgICByZXR1cm4gZXhjZXB0aW9uKG1zZywgY2F1c2UsIExJTUlUICogMik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24oU3RyaW5nIG1zZywgVGhyb3dhYmxlIGNhdXNlLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgUnVudGltZUV4Y2VwdGlvbiBlOworICAgICAgICBpZiAobXNnICE9IG51bGwgJiYgY2F1c2UgIT0gbnVsbCkgZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZywgY2F1c2UpOworICAgICAgICBlbHNlIGlmIChtc2cgIT0gbnVsbCkgZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1zZyk7CisgICAgICAgIGVsc2UgaWYgKGNhdXNlICE9IG51bGwpIGUgPSBuZXcgUnVudGltZUV4Y2VwdGlvbihjYXVzZSk7CisgICAgICAgIGVsc2UgZSA9IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgICAgIGUuc2V0U3RhY2tUcmFjZShmcmFtZXMobGVuZ3RoKSk7CisgICAgICAgIHJldHVybiBlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvTENTU3RyZWFtaW5nS2VlcExldmVsVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9MQ1NTdHJlYW1pbmdLZWVwTGV2ZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMxOTc2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvTENTU3RyZWFtaW5nS2VlcExldmVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3Quc3RyZWFtaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLkNsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJbnZva2FibGVJbnN0YW5jZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlRlc3RCYXNlSW1wbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlLkdPU1NJUDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmUuTkFUSVZFX1BST1RPQ09MOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZS5ORVRXT1JLOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBMQ1NTdHJlYW1pbmdLZWVwTGV2ZWxUZXN0IGV4dGVuZHMgVGVzdEJhc2VJbXBsCit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb20oKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gYnVpbGRlcigpLndpdGhOb2Rlcyg0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcud2l0aChORVRXT1JLLCBHT1NTSVAsIE5BVElWRV9QUk9UT0NPTCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhvdXRWTm9kZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRGF0YURpckNvdW50KDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcHVsYXRlKGNsdXN0ZXIpOworCisgICAgICAgICAgICBjbHVzdGVyLmdldCg0KS5ub2RldG9vbFJlc3VsdCgiZGVjb21taXNzaW9uIikuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKKworICAgICAgICAgICAgYXNzZXJ0RW1wdHlMMChjbHVzdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1vdmUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gYnVpbGRlcigpLndpdGhOb2Rlcyg0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcud2l0aChORVRXT1JLLCBHT1NTSVAsIE5BVElWRV9QUk9UT0NPTCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhvdXRWTm9kZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRGF0YURpckNvdW50KDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBvcHVsYXRlKGNsdXN0ZXIpOworCisgICAgICAgICAgICBsb25nIHRva2VuVmFsID0gKChNdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuKWNsdXN0ZXIudG9rZW5zKCkuZ2V0KDMpLmdldFRva2VuKCkpLnRva2VuOworICAgICAgICAgICAgbG9uZyBwcmV2VG9rZW5WYWwgPSAoKE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4pY2x1c3Rlci50b2tlbnMoKS5nZXQoMikuZ2V0VG9rZW4oKSkudG9rZW47CisgICAgICAgICAgICAvLyBtb3ZlIG5vZGUgNCB0byB0aGUgbWlkZGxlIHBvaW50IGJldHdlZW4gaXRzIGN1cnJlbnQgcG9zaXRpb24gYW5kIHRoZSBwcmV2aW91cyBub2RlCisgICAgICAgICAgICBsb25nIG5ld1Rva2VuID0gKHRva2VuVmFsICsgcHJldlRva2VuVmFsKSAvIDI7CisgICAgICAgICAgICBjbHVzdGVyLmdldCg0KS5ub2RldG9vbFJlc3VsdCgibW92ZSIsIFN0cmluZy52YWx1ZU9mKG5ld1Rva2VuKSkuYXNzZXJ0cygpLnN1Y2Nlc3MoKTsKKworICAgICAgICAgICAgYXNzZXJ0RW1wdHlMMChjbHVzdGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGUoQ2x1c3RlciBjbHVzdGVyKQorICAgIHsKKyAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgS0VZU1BBQ0UgJXMgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogMn0iKSk7CisgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLmRlY29tX3Rlc3QgKGlkIGludCBQUklNQVJZIEtFWSwgdmFsdWUgaW50KSB3aXRoIGNvbXBhY3Rpb24gPSB7ICdjbGFzcyc6J0xldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3knLCAnZW5hYmxlZCc6J2ZhbHNlJyB9IikpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoImluc2VydCBpbnRvICVzLmRlY29tX3Rlc3QgKGlkLCB2YWx1ZSkgVkFMVUVTICg/LCA/KSIpLCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgaSwgaSk7CisgICAgICAgICAgICBpZiAoaSAlIDEwMCA9PSAwKQorICAgICAgICAgICAgICAgIGNsdXN0ZXIuZm9yRWFjaCgoaW5zdCkgLT4gaW5zdC5mbHVzaChLRVlTUEFDRSkpOworICAgICAgICB9CisgICAgICAgIGNsdXN0ZXIuZm9yRWFjaCgoaSkgLT4gaS5mbHVzaChLRVlTUEFDRSkpOworICAgICAgICByZWxldmVsKGNsdXN0ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVsZXZlbChDbHVzdGVyIGNsdXN0ZXIpCisgICAgeworICAgICAgICBmb3IgKElJbnZva2FibGVJbnN0YW5jZSBpIDogY2x1c3RlcikKKyAgICAgICAgeworICAgICAgICAgICAgaS5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgiZGVjb21fdGVzdCIpLmdldExpdmVTU1RhYmxlcygpOworICAgICAgICAgICAgICAgIGludCBsdmwgPSAxOworICAgICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5tdXRhdGVMZXZlbEFuZFJlbG9hZChsdmwrKyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFbXB0eUwwKGNsdXN0ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RW1wdHlMMChDbHVzdGVyIGNsdXN0ZXIpCisgICAgeworICAgICAgICBmb3IgKElJbnZva2FibGVJbnN0YW5jZSBpIDogY2x1c3RlcikKKyAgICAgICAgeworICAgICAgICAgICAgaS5ydW5Pbkluc3RhbmNlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKCJkZWNvbV90ZXN0IikuZ2V0TGl2ZVNTVGFibGVzKCkpCisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoc3N0YWJsZS5nZXRTU1RhYmxlTGV2ZWwoKSA+IDApOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL1N0cmVhbUNsb3NlSW5NaWRkbGVUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL1N0cmVhbUNsb3NlSW5NaWRkbGVUZXN0LmphdmEKaW5kZXggZmM1MmFiNi4uZjI3NzJiYyAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9TdHJlYW1DbG9zZUluTWlkZGxlVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvU3RyZWFtQ2xvc2VJbk1pZGRsZVRlc3QuamF2YQpAQCAtMzcsOCArMzcsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Ub2tlblN1cHBsaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5DbHVzdGVyVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5UZXN0QmFzZUltcGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlWmVyb0NvcHlXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5SYW5nZUF3YXJlU1NUYWJsZVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVaZXJvQ29weVdyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXI7CiBpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKIApAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQogICAgICAgICBwdWJsaWMgc3RhdGljIGludCB3cml0ZURpcmVjdGx5VG9DaGFubmVsKEJ5dGVCdWZmZXIgYnVmLCBAU3VwZXJDYWxsIENhbGxhYmxlPEludGVnZXI+IHp1cGVyKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc0NhbGxlcihCaWdUYWJsZVplcm9Db3B5V3JpdGVyLmNsYXNzLmdldE5hbWUoKSwgIndyaXRlIikpCisgICAgICAgICAgICBpZiAoaXNDYWxsZXIoU1NUYWJsZVplcm9Db3B5V3JpdGVyLmNsYXNzLmdldE5hbWUoKSwgIndyaXRlIikpCiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb24oKTsKICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBjb250ZXh0OyBwYXNzIHRocm91Z2gKICAgICAgICAgICAgIHJldHVybiB6dXBlci5jYWxsKCk7CkBAIC0xOTMsNCArMTkzLDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsYXNzTG9hZGVyLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CiAgICAgICAgIH0KICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9TdHJlYW1GYWlsdXJlTG9nc0ZhaWx1cmVEdWVUb1Nlc3Npb25GYWlsZWRUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL1N0cmVhbUZhaWx1cmVMb2dzRmFpbHVyZUR1ZVRvU2Vzc2lvbkZhaWxlZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDRlYTFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9TdHJlYW1GYWlsdXJlTG9nc0ZhaWx1cmVEdWVUb1Nlc3Npb25GYWlsZWRUZXN0LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworcHVibGljIGNsYXNzIFN0cmVhbUZhaWx1cmVMb2dzRmFpbHVyZUR1ZVRvU2Vzc2lvbkZhaWxlZFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFN0cmVhbUZhaWx1cmVMb2dzCit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmYWlsdXJlRHVlVG9TZXNzaW9uRmFpbGVkKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdHJlYW1UZXN0KHRydWUsIlJlbW90ZSBwZWVyIC8xMjcuMC4wLjI6NzAxMiBmYWlsZWQgc3RyZWFtIHNlc3Npb24iLCAxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL1N0cmVhbUZhaWx1cmVMb2dzRmFpbHVyZUR1ZVRvU2Vzc2lvblRpbWVvdXRUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3Qvc3RyZWFtaW5nL1N0cmVhbUZhaWx1cmVMb2dzRmFpbHVyZUR1ZVRvU2Vzc2lvblRpbWVvdXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3MzU5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvU3RyZWFtRmFpbHVyZUxvZ3NGYWlsdXJlRHVlVG9TZXNzaW9uVGltZW91dFRlc3QuamF2YQpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LnN0cmVhbWluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Gb3JrSm9pblBvb2w7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5jaGVja2VkVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG5ldC5ieXRlYnVkZHkuQnl0ZUJ1ZGR5OworaW1wb3J0IG5ldC5ieXRlYnVkZHkuZHluYW1pYy5sb2FkaW5nLkNsYXNzTG9hZGluZ1N0cmF0ZWd5OworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uTWV0aG9kRGVsZWdhdGlvbjsKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmltcGxlbWVudGF0aW9uLmJpbmQuYW5ub3RhdGlvbi5TdXBlckNhbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuc3RyZWFtaW5nLkNhc3NhbmRyYUluY29taW5nRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5DbHVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlWmVyb0NvcHlXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlNoYXJlZDsKK2ltcG9ydCBvcmcuYXdhaXRpbGl0eS5Bd2FpdGlsaXR5OworCitpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMubmFtZWQ7CitpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMudGFrZXNBcmd1bWVudHM7CisKK3B1YmxpYyBjbGFzcyBTdHJlYW1GYWlsdXJlTG9nc0ZhaWx1cmVEdWVUb1Nlc3Npb25UaW1lb3V0VGVzdCBleHRlbmRzIEFic3RyYWN0U3RyZWFtRmFpbHVyZUxvZ3MKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZhaWx1cmVEdWVUb1Nlc3Npb25UaW1lb3V0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0cnkgKENsdXN0ZXIgY2x1c3RlciA9IENsdXN0ZXIuYnVpbGQoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhJbnN0YW5jZUluaXRpYWxpemVyKEJCU3RyZWFtVGltZW91dEhlbHBlcjo6aW5zdGFsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoYyAtPiBjLndpdGgoRmVhdHVyZS52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBkaWUsIHRoaXMgd2lsbCB0cnkgdG8gaGFsdCBKVk0sIHdoaWNoIGlzIGVhc2llciB0byB2YWxpZGF0ZSBpbiB0aGUgdGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciBsZXZlbHMgcmVxdWlyZSBjaGVja2luZyBzdGF0ZSBvZiB0aGUgc3Vic3lzdGVtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJzdHJlYW1fdHJhbnNmZXJfdGFza190aW1lb3V0IiwgIjFtcyIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSkKKyAgICAgICAgeworCisgICAgICAgICAgICBpbml0KGNsdXN0ZXIpOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudGJsIChwayBpbnQgUFJJTUFSWSBLRVkpIikpOworCisgICAgICAgICAgICBGb3JrSm9pblBvb2wuY29tbW9uUG9vbCgpLmV4ZWN1dGUoKCkgLT4gdHJpZ2dlclN0cmVhbWluZyhjbHVzdGVyKSk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBd2FpdGlsaXR5LmF3YWl0KCJEaWQgbm90IHNlZSBzdHJlYW0gcnVubmluZyBvciB0aW1lZCBvdXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuYXRNb3N0KDMsIFRpbWVVbml0Lk1JTlVURVMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC51bnRpbCgoKSAtPiBTdGF0ZS5TVFJFQU1fSVNfUlVOTklORy5hd2FpdChmYWxzZSkgfHwgc2VhcmNoRm9yTG9nKGNsdXN0ZXIuZ2V0KDEpLCBmYWxzZSwgIlNlc3Npb24gdGltZWQgb3V0IikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXRlLlVOQkxPQ0tfU1RSRUFNLnNpZ25hbCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXdhaXRpbGl0eS5hd2FpdCgiVW5hYmxlIHRvIGZpbmQgJ1Nlc3Npb24gdGltZWQgb3V0JyIpCisgICAgICAgICAgICAgICAgICAgICAgLmF0TW9zdCgxLCBUaW1lVW5pdC5NSU5VVEVTKQorICAgICAgICAgICAgICAgICAgICAgIC51bnRpbCgoKSAtPiBzZWFyY2hGb3JMb2coY2x1c3Rlci5nZXQoMSksIGZhbHNlLCAiU2Vzc2lvbiB0aW1lZCBvdXQiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU2hhcmVkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0ZQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUZXN0Q29uZGl0aW9uIFNUUkVBTV9JU19SVU5OSU5HID0gbmV3IFRlc3RDb25kaXRpb24oKTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUZXN0Q29uZGl0aW9uIFVOQkxPQ0tfU1RSRUFNID0gbmV3IFRlc3RDb25kaXRpb24oKTsKKyAgICB9CisKKyAgICBAU2hhcmVkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Q29uZGl0aW9uCisgICAgeworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc2lnbmFsZWQgPSBmYWxzZTsKKworICAgICAgICBwdWJsaWMgdm9pZCBhd2FpdCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF3YWl0KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYXdhaXQoYm9vbGVhbiB0aHJvd09uVGltZW91dCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBkZWFkbGluZU5hbm9zID0gQ2xvY2suR2xvYmFsLm5hbm9UaW1lKCkgKyBUaW1lVW5pdC5NSU5VVEVTLnRvTmFub3MoMSk7CisgICAgICAgICAgICB3aGlsZSAoIXNpZ25hbGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgcmVtYWluaW5nTWlsbGlzID0gVGltZVVuaXQuTkFOT1NFQ09ORFMudG9NaWxsaXMoZGVhZGxpbmVOYW5vcyAtIENsb2NrLkdsb2JhbC5uYW5vVGltZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nTWlsbGlzIDw9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhyb3dPblRpbWVvdXQpIHRocm93IG5ldyBVbmNoZWNrZWRUaW1lb3V0RXhjZXB0aW9uKCJDb25kaXRpb24gbm90IG1ldCB3aXRoaW4gMSBtaW51dGUiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBhd2FpdCBtYXkgYmxvY2sgc2lnbmFsIGZyb20gdHJpZ2dlcmluZyBub3RpZnksIHNvIG1ha2Ugc3VyZSBub3QgdG8gYmxvY2sgZm9yIG1vcmUgdGhhbiA1MDBtcworICAgICAgICAgICAgICAgIHJlbWFpbmluZ01pbGxpcyA9IE1hdGgubWluKHJlbWFpbmluZ01pbGxpcywgNTAwKTsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53YWl0KHJlbWFpbmluZ01pbGxpcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2lnbmFsKCkKKyAgICAgICAgeworICAgICAgICAgICAgc2lnbmFsZWQgPSB0cnVlOworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMubm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJCU3RyZWFtVGltZW91dEhlbHBlcgorICAgIHsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IHdyaXRlRGlyZWN0bHlUb0NoYW5uZWwoQnl0ZUJ1ZmZlciBidWYsIEBTdXBlckNhbGwgQ2FsbGFibGU8SW50ZWdlcj4genVwZXIpIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGlzQ2FsbGVyKFNTVGFibGVaZXJvQ29weVdyaXRlci5jbGFzcy5nZXROYW1lKCksICJ3cml0ZSIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXRlLlNUUkVBTV9JU19SVU5OSU5HLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIFN0YXRlLlVOQkxPQ0tfU1RSRUFNLmF3YWl0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkaWZmZXJlbnQgY29udGV4dDsgcGFzcyB0aHJvdWdoCisgICAgICAgICAgICByZXR1cm4genVwZXIuY2FsbCgpOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcHBlbmQoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbiwgQFN1cGVyQ2FsbCBDYWxsYWJsZTxCb29sZWFuPiB6dXBlcikgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaXNDYWxsZXIoQ2Fzc2FuZHJhSW5jb21pbmdGaWxlLmNsYXNzLmdldE5hbWUoKSwgInJlYWQiKSkgLy8gaGFuZGxlcyBjb21wcmVzc2VkIGFuZCBub24tY29tcHJlc3NlZAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFN0YXRlLlNUUkVBTV9JU19SVU5OSU5HLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIFN0YXRlLlVOQkxPQ0tfU1RSRUFNLmF3YWl0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkaWZmZXJlbnQgY29udGV4dDsgcGFzcyB0aHJvdWdoCisgICAgICAgICAgICByZXR1cm4genVwZXIuY2FsbCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGwoQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIEludGVnZXIgbnVtKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobnVtICE9IEZBSUxJTkdfTk9ERSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBuZXcgQnl0ZUJ1ZGR5KCkucmViYXNlKFNlcXVlbnRpYWxXcml0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKCJ3cml0ZURpcmVjdGx5VG9DaGFubmVsIikuYW5kKHRha2VzQXJndW1lbnRzKDEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnRlcmNlcHQoTWV0aG9kRGVsZWdhdGlvbi50byhCQlN0cmVhbVRpbWVvdXRIZWxwZXIuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ha2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvYWQoY2xhc3NMb2FkZXIsIENsYXNzTG9hZGluZ1N0cmF0ZWd5LkRlZmF1bHQuSU5KRUNUSU9OKTsKKworICAgICAgICAgICAgbmV3IEJ5dGVCdWRkeSgpLnJlYmFzZShSYW5nZUF3YXJlU1NUYWJsZVdyaXRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXRob2QobmFtZWQoImFwcGVuZCIpLmFuZCh0YWtlc0FyZ3VtZW50cygxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW50ZXJjZXB0KE1ldGhvZERlbGVnYXRpb24udG8oQkJTdHJlYW1UaW1lb3V0SGVscGVyLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsYXNzTG9hZGVyLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvU3RyZWFtRmFpbHVyZUxvZ3NGYWlsdXJlSW5UaGVNaWRkbGVXaXRoRU9GVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9TdHJlYW1GYWlsdXJlTG9nc0ZhaWx1cmVJblRoZU1pZGRsZVdpdGhFT0ZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwZjRmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvU3RyZWFtRmFpbHVyZUxvZ3NGYWlsdXJlSW5UaGVNaWRkbGVXaXRoRU9GVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5zdHJlYW1pbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBTdHJlYW1GYWlsdXJlTG9nc0ZhaWx1cmVJblRoZU1pZGRsZVdpdGhFT0ZUZXN0IGV4dGVuZHMgQWJzdHJhY3RTdHJlYW1GYWlsdXJlTG9ncworeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZmFpbHVyZUluVGhlTWlkZGxlV2l0aEVPRigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgc3RyZWFtVGVzdChmYWxzZSwgIlNlc3Npb24gcGVlciAvMTI3LjAuMC4xOjcwMTIgRmFpbGVkIGJlY2F1c2UgdGhlcmUgd2FzIGFuIGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb24gd2l0aCBzdGF0ZT1TVFJFQU1JTkciLCBGQUlMSU5HX05PREUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvU3RyZWFtRmFpbHVyZUxvZ3NGYWlsdXJlSW5UaGVNaWRkbGVXaXRoVW5rbm93blRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC9zdHJlYW1pbmcvU3RyZWFtRmFpbHVyZUxvZ3NGYWlsdXJlSW5UaGVNaWRkbGVXaXRoVW5rbm93blRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDI1MDdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3N0cmVhbWluZy9TdHJlYW1GYWlsdXJlTG9nc0ZhaWx1cmVJblRoZU1pZGRsZVdpdGhVbmtub3duVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5zdHJlYW1pbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBTdHJlYW1GYWlsdXJlTG9nc0ZhaWx1cmVJblRoZU1pZGRsZVdpdGhVbmtub3duVGVzdCBleHRlbmRzIEFic3RyYWN0U3RyZWFtRmFpbHVyZUxvZ3MKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZhaWx1cmVJblRoZU1pZGRsZVdpdGhVbmtub3duKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdHJlYW1UZXN0KHRydWUsICJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogVEVTVCIsIEZBSUxJTkdfTk9ERSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3RocmVzaG9sZHMvUm93SW5kZXhTaXplV2FybmluZ1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC90aHJlc2hvbGRzL1Jvd0luZGV4U2l6ZVdhcm5pbmdUZXN0LmphdmEKaW5kZXggMzNlNmNkNi4uYTBmN2Y2MCAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3RocmVzaG9sZHMvUm93SW5kZXhTaXplV2FybmluZ1Rlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvdGhyZXNob2xkcy9Sb3dJbmRleFNpemVXYXJuaW5nVGVzdC5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjLkRhdGFTdG9yYWdlVW5pdC5LSUJJQllURVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKQEAgLTM3LDEzICszOCwxNiBAQAogICAgIHsKICAgICAgICAgQWJzdHJhY3RDbGllbnRTaXplV2FybmluZy5zZXR1cENsYXNzKCk7CiAKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29udmVydDJNZXRob2RSZWYKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoQ0xVU1RFUi5nZXQoMSkuY2FsbE9uSW5zdGFuY2UoKCkgLT4gQmlnRm9ybWF0LmlzU2VsZWN0ZWQoKSkpOworCiAgICAgICAgIENMVVNURVIuc3RyZWFtKCkuZm9yRWFjaChpIC0+IGkucnVuT25JbnN0YW5jZSgoKSAtPiB7CiAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Um93SW5kZXhSZWFkU2l6ZVdhcm5UaHJlc2hvbGQobmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCgxLCBLSUJJQllURVMpKTsKICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRSb3dJbmRleFJlYWRTaXplRmFpbFRocmVzaG9sZChuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kKDIsIEtJQklCWVRFUykpOwogCiAgICAgICAgICAgICAvLyBoYWNrIHRvIGZvcmNlIG11bHRpcGxlIGluZGV4IGVudHJpZXMKICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleENhY2hlU2l6ZSgxIDw8IDIwKTsKLSAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemUoMCk7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoMCk7CiAgICAgICAgIH0pKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC90b3BvbG9neS9EZWNvbW1pc3Npb25Bdm9pZFJlYWRUaW1lb3V0c1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC90b3BvbG9neS9EZWNvbW1pc3Npb25Bdm9pZFJlYWRUaW1lb3V0c1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjdmN2YxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC90ZXN0L3RvcG9sb2d5L0RlY29tbWlzc2lvbkF2b2lkUmVhZFRpbWVvdXRzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC50b3BvbG9neTsKKworcHVibGljIGNsYXNzIERlY29tbWlzc2lvbkF2b2lkUmVhZFRpbWVvdXRzVGVzdCBleHRlbmRzIERlY29tbWlzc2lvbkF2b2lkVGltZW91dHMKK3sKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFF1ZXJ5KFN0cmluZyB0YWJsZSkKKyAgICB7CisgICAgICAgIHJldHVybiAiU0VMRUNUICogRlJPTSAiICsgdGFibGUgKyAiIFdIRVJFIHBrPT8iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC90b3BvbG9neS9EZWNvbW1pc3Npb25Bdm9pZFRpbWVvdXRzLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvdG9wb2xvZ3kvRGVjb21taXNzaW9uQXZvaWRUaW1lb3V0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MjA2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvdG9wb2xvZ3kvRGVjb21taXNzaW9uQXZvaWRUaW1lb3V0cy5qYXZhCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3QudG9wb2xvZ3k7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRhYmxlRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgbmV0LmJ5dGVidWRkeS5CeXRlQnVkZHk7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NMb2FkaW5nU3RyYXRlZ3k7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5NZXRob2REZWxlZ2F0aW9uOworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uYmluZC5hbm5vdGF0aW9uLlN1cGVyQ2FsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuRmVhdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW5zdGFuY2VJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUludm9rYWJsZUluc3RhbmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5TaW1wbGVRdWVyeVJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQ2x1c3RlclV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnRlc3QuVGVzdEJhc2VJbXBsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnV0aWwuQ29vcmRpbmF0b3JzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnV0aWwuUXVlcnlSZXN1bHRVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnV0aWwuYnl0ZXJld3JpdGUuU3RhdHVzQ2hhbmdlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXRpbC5ieXRlcmV3cml0ZS5TdGF0dXNDaGFuZ2VMaXN0ZW5lci5Ib29rczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC51dGlsLmJ5dGVyZXdyaXRlLlVuZGVhZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlYWRUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuV3JpdGVUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5BcHBsaWNhdGlvblN0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuRHluYW1pY0VuZHBvaW50U25pdGNoOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlJlcGxpY2FDb2xsZWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5WZXJiOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkFzc2VydGlvblV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworCitpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMubmFtZWQ7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWNvbW1pc3Npb25Bdm9pZFRpbWVvdXRzIGV4dGVuZHMgVGVzdEJhc2VJbXBsCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVDT01fTk9ERSA9IDY7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoQ2x1c3RlciBjbHVzdGVyID0gQ2x1c3Rlci5idWlsZCg4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFJhY2tzKDIsIDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoSW5zdGFuY2VJbml0aWFsaXplcihuZXcgQkIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoYyAtPiBjLndpdGgoRmVhdHVyZS5HT1NTSVApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoInRyYW5zZmVyX2hpbnRzX29uX2RlY29tbWlzc2lvbiIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJzZXZlcml0eV9kdXJpbmdfZGVjb21taXNzaW9uIiwgMTAwMDBEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJkeW5hbWljX3NuaXRjaF9iYWRuZXNzX3RocmVzaG9sZCIsIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZmFpbHVyZSBoYXBwZW5zIGluIFBlbmRpbmdSYW5nZUNhbGN1bGF0b3JTZXJ2aWNlLnVwZGF0ZSwgc28gdGhlIGtleXNwYWNlIGlzIGJlaW5nIHJlbW92ZWQKKyAgICAgICAgICAgIGNsdXN0ZXIuc2V0VW5jYXVnaHRFeGNlcHRpb25zRmlsdGVyKChpZ25vcmUsIHRocm93YWJsZSkgLT4gISJVbmtub3duIGtleXNwYWNlIHN5c3RlbV9kaXN0cmlidXRlZCIuZXF1YWxzKHRocm93YWJsZS5nZXRNZXNzYWdlKCkpKTsKKworICAgICAgICAgICAgZml4RGlzdHJpYnV0ZWRTY2hlbWFzKGNsdXN0ZXIpOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBLRVlTUEFDRSAiICsgS0VZU1BBQ0UgKyAiIFdJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMywgJ2RhdGFjZW50ZXIyJzogM30iKTsKKyAgICAgICAgICAgIFN0cmluZyB0YWJsZSA9IEtFWVNQQUNFICsgIi50YmwiOworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBUQUJMRSAiICsgdGFibGUgKyAiIChwayBibG9iIFBSSU1BUlkgS0VZKSIpOworCisgICAgICAgICAgICBMaXN0PElJbnZva2FibGVJbnN0YW5jZT4gZGMxID0gY2x1c3Rlci5nZXQoMSwgMiwgMywgNCk7CisgICAgICAgICAgICBMaXN0PElJbnZva2FibGVJbnN0YW5jZT4gZGMyID0gY2x1c3Rlci5nZXQoNSwgNiwgNywgOCk7CisgICAgICAgICAgICBJSW52b2thYmxlSW5zdGFuY2UgdG9EZWNvbSA9IGRjMi5nZXQoMSk7CisgICAgICAgICAgICBMaXN0PE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4+IHRva2VucyA9IENsdXN0ZXJVdGlscy5nZXRMb2NhbFRva2Vucyh0b0RlY29tKS5zdHJlYW0oKS5tYXAodCAtPiBuZXcgTXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbihMb25nLnBhcnNlTG9uZyh0KSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKyAgICAgICAgICAgIGZvciAoTXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbiB0b2tlbiA6IHRva2VucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGtleSA9IE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4ua2V5Rm9yVG9rZW4odG9rZW4pOworCisgICAgICAgICAgICAgICAgdG9EZWNvbS5jb29yZGluYXRvcigpLmV4ZWN1dGUoIklOU0VSVCBJTlRPICIgKyB0YWJsZSArICIocGspIFZBTFVFUyAoPykiLCBDb25zaXN0ZW5jeUxldmVsLkVBQ0hfUVVPUlVNLCBrZXkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBub2RldG9vbCA9IENvbXBsZXRhYmxlRnV0dXJlLnJ1bkFzeW5jKCgpIC0+IHRvRGVjb20ubm9kZXRvb2xSZXN1bHQoImRlY29tbWlzc2lvbiIpLmFzc2VydHMoKS5zdWNjZXNzKCkpOworCisgICAgICAgICAgICBIb29rcyBzdGF0dXNIb29rcyA9IFN0YXR1c0NoYW5nZUxpc3RlbmVyLmhvb2tzKERFQ09NX05PREUpOworICAgICAgICAgICAgc3RhdHVzSG9va3MubGVhdmluZy5hd2FpdEFuZEVudGVyKCk7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgYWxsIG5vZGVzIHNlZSB0aGUgc2V2ZXJpdHkgY2hhbmdlCisgICAgICAgICAgICBDbHVzdGVyVXRpbHMuYXdhaXRHb3NzaXBTdGF0ZU1hdGNoKGNsdXN0ZXIsIGNsdXN0ZXIuZ2V0KERFQ09NX05PREUpLCBBcHBsaWNhdGlvblN0YXRlLlNFVkVSSVRZKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuZm9yRWFjaChpIC0+IGkucnVuT25JbnN0YW5jZSgoKSAtPiAoKER5bmFtaWNFbmRwb2ludFNuaXRjaCkgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEVuZHBvaW50U25pdGNoKCkpLnVwZGF0ZVNjb3JlcygpKSk7CisKKyAgICAgICAgICAgIHN0YXR1c0hvb2tzLmxlYXZlLmF3YWl0KCk7CisgICAgICAgICAgICBjbHVzdGVyLmZpbHRlcnMoKS52ZXJicyhWZXJiLkdPU1NJUF9ESUdFU1RfU1lOLmlkKS5kcm9wKCk7CisgICAgICAgICAgICBzdGF0dXNIb29rcy5sZWF2ZS5lbnRlcigpOworCisgICAgICAgICAgICBub2RldG9vbC5qb2luKCk7CisKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBmYWlsdXJlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gZ2V0UXVlcnkodGFibGUpOworICAgICAgICAgICAgZm9yIChNdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuIHRva2VuIDogdG9rZW5zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gTXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbi5rZXlGb3JUb2tlbih0b2tlbik7CisKKyAgICAgICAgICAgICAgICBmb3IgKElJbnZva2FibGVJbnN0YW5jZSBpIDogZGMxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChDb25zaXN0ZW5jeUxldmVsIGNsIDogbGV2ZWxzKCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvb3JkaW5hdG9ycy53aXRoVHJhY2luZyhpLmNvb3JkaW5hdG9yKCksIHF1ZXJ5LCBjbCwga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChDb29yZGluYXRvcnMuV2l0aFRyYWNlRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBc3NlcnRpb25VdGlscy5pc0luc3RhbmNlb2YoV3JpdGVUaW1lb3V0RXhjZXB0aW9uLmNsYXNzKS5tYXRjaGVzKGNhdXNlKSB8fCBBc3NlcnRpb25VdGlscy5pc0luc3RhbmNlb2YoUmVhZFRpbWVvdXRFeGNlcHRpb24uY2xhc3MpLm1hdGNoZXMoY2F1c2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHRyYWNlTWVzc3NhZ2VzID0gQXJyYXlzLmFzTGlzdCgiU2VuZGluZyBtdXRhdGlvbiB0byByZW1vdGUgcmVwbGljYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRpbmcgZGF0YSBmcm9tIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGluZyBkaWdlc3QgZnJvbSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVRdWVyeVJlc3VsdCBmaWx0ZXJlZCA9IFF1ZXJ5UmVzdWx0VXRpbC5xdWVyeShlLnRyYWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoImFjdGl2aXR5IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHJvdyAtPiB0cmFjZU1lc3NzYWdlcy5zdHJlYW0oKS5hbnlNYXRjaChyb3cuZ2V0U3RyaW5nKCJhY3Rpdml0eSIpOjpzdGFydHNXaXRoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IGRlY29tZU5vZGUgPSBCQi5hZGRyZXNzKChieXRlKSBERUNPTV9OT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZpbHRlcmVkLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxvZyA9IGZpbHRlcmVkLm5leHQoKS5nZXRTdHJpbmcoImFjdGl2aXR5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmNvbnRhaW5zKGRlY29tZU5vZGUudG9TdHJpbmcoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZXMuYWRkKCJGYWlsdXJlIHdpdGggbm9kZSIgKyBpLmNvbmZpZygpLm51bSgpICsgIiwgY2w9IiArIGNsICsgIjtcblx0IiArIGNhdXNlLmdldE1lc3NhZ2UoKSArICI7XG5cdFRyYWNlIGFjdGl2aXR5PSIgKyBsb2cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFmYWlsdXJlcy5pc0VtcHR5KCkpIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihTdHJpbmcuam9pbigiXG4iLCBmYWlsdXJlcykpOworCisgICAgICAgICAgICAvLyBzaW5jZSBvbmx5IG9uZSB0ZXN0cyBleGlzdHMgcGVyIGZpbGUsIHNodXRkb3duIHdpdGhvdXQgYmxvY2tpbmcgc28gLmNsb3NlIGRvZXMgbm90IHRpbWVvdXQKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLndhaXRPbkZ1dHVyZXMoY2x1c3Rlci5zdHJlYW0oKS5tYXAoSUluc3RhbmNlOjpzaHV0ZG93bikuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIFRpbWVVbml0Lk1JTlVURVMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRRdWVyeShTdHJpbmcgdGFibGUpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxDb25zaXN0ZW5jeUxldmVsPiBsZXZlbHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEVudW1TZXQub2YoQ29uc2lzdGVuY3lMZXZlbC5RVU9SVU0sIENvbnNpc3RlbmN5TGV2ZWwuTE9DQUxfUVVPUlVNLCBDb25zaXN0ZW5jeUxldmVsLkVBQ0hfUVVPUlVNLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zaXN0ZW5jeUxldmVsLk9ORSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCQiBpbXBsZW1lbnRzIElJbnN0YW5jZUluaXRpYWxpemVyLCBBdXRvQ2xvc2VhYmxlCisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaW5pdGlhbGlzZShDbGFzc0xvYWRlciBjbCwgVGhyZWFkR3JvdXAgZ3JvdXAsIGludCBub2RlLCBpbnQgZ2VuZXJhdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgVW5kZWFkLmluc3RhbGwoY2wpOworICAgICAgICAgICAgbmV3IEJ5dGVCdWRkeSgpLnJlYmFzZShEeW5hbWljRW5kcG9pbnRTbml0Y2guY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKG5hbWVkKCJzb3J0ZWRCeVByb3hpbWl0eSIpKS5pbnRlcmNlcHQoTWV0aG9kRGVsZWdhdGlvbi50byhCQi5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFrZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAubG9hZChjbCwgQ2xhc3NMb2FkaW5nU3RyYXRlZ3kuRGVmYXVsdC5JTkpFQ1RJT04pOworCisgICAgICAgICAgICBpZiAobm9kZSAhPSBERUNPTV9OT0RFKSByZXR1cm47CisgICAgICAgICAgICBTdGF0dXNDaGFuZ2VMaXN0ZW5lci5pbnN0YWxsKGNsLCBub2RlLCBTdGF0dXNDaGFuZ2VMaXN0ZW5lci5TdGF0dXMuTEVBVklORywgU3RhdHVzQ2hhbmdlTGlzdGVuZXIuU3RhdHVzLkxFQVZFKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgVW5kZWFkLmNsb3NlKCk7CisgICAgICAgICAgICBTdGF0dXNDaGFuZ2VMaXN0ZW5lci5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyAgPEMgZXh0ZW5kcyBSZXBsaWNhQ29sbGVjdGlvbjw/IGV4dGVuZHMgQz4+IEMgc29ydGVkQnlQcm94aW1pdHkoZmluYWwgSW5ldEFkZHJlc3NBbmRQb3J0IGFkZHJlc3MsIEMgcmVwbGljYXMsIEBTdXBlckNhbGwgQ2FsbGFibGU8Qz4gcmVhbCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBDIHJlc3VsdCA9IHJlYWwuY2FsbCgpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5zaXplKCkgPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBkZWNvbSA9IGFkZHJlc3MoKGJ5dGUpIERFQ09NX05PREUpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZW5kcG9pbnRzKCkuY29udGFpbnMoZGVjb20pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKER5bmFtaWNFbmRwb2ludFNuaXRjaC5nZXRTZXZlcml0eShkZWNvbSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGljYSBsYXN0ID0gcmVzdWx0LmdldChyZXN1bHQuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxhc3QuZW5kcG9pbnQoKS5lcXVhbHMoZGVjb20pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiRXhwZWN0ZWQgZW5kcG9pbnQgIiArIGRlY29tICsgIiB0byBiZSB0aGUgbGFzdCByZXBsaWNhLCBidXQgZm91bmQgIiArIGxhc3QuZW5kcG9pbnQoKSArICI7ICIgKyByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIEluZXRBZGRyZXNzQW5kUG9ydCBhZGRyZXNzKGJ5dGUgbnVtKQorICAgICAgICB7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5QWRkcmVzc092ZXJyaWRlRGVmYXVsdHMoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKG5ldyBieXRlW117IDEyNywgMCwgMCwgbnVtIH0pLCA3MDEyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdGVzdC90b3BvbG9neS9EZWNvbW1pc3Npb25Bdm9pZFdyaXRlVGltZW91dHNUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvdG9wb2xvZ3kvRGVjb21taXNzaW9uQXZvaWRXcml0ZVRpbWVvdXRzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMmViYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3Rlc3QvdG9wb2xvZ3kvRGVjb21taXNzaW9uQXZvaWRXcml0ZVRpbWVvdXRzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC50b3BvbG9neTsKKworcHVibGljIGNsYXNzIERlY29tbWlzc2lvbkF2b2lkV3JpdGVUaW1lb3V0c1Rlc3QgZXh0ZW5kcyBEZWNvbW1pc3Npb25Bdm9pZFRpbWVvdXRzCit7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRRdWVyeShTdHJpbmcgdGFibGUpCisgICAgeworICAgICAgICByZXR1cm4gIklOU0VSVCBJTlRPICIgKyB0YWJsZSArICIocGspIFZBTFVFUyAoPykiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9CYXRjaFVwZ3JhZGVUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQmF0Y2hVcGdyYWRlVGVzdC5qYXZhCmluZGV4IGRiNWUyZTEuLjdiYTEyZmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9CYXRjaFVwZ3JhZGVUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0JhdGNoVXBncmFkZVRlc3QuamF2YQpAQCAtMzMsNyArMzMsNyBAQAogICAgICAgICBuZXcgVGVzdENhc2UoKQogICAgICAgICAubm9kZXMoMikKICAgICAgICAgLm5vZGVzVG9VcGdyYWRlKDIpCi0gICAgICAgIC51cGdyYWRlc0Zyb20odjQwKS5zZXR1cCgoY2x1c3RlcikgLT4geworICAgICAgICAudXBncmFkZXNUb0N1cnJlbnRGcm9tKHY0MCkuc2V0dXAoKGNsdXN0ZXIpIC0+IHsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi51c2VycyAoIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcmlkIHV1aWQgUFJJTUFSWSBLRVksIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlyc3RuYW1lIGFzY2lpLCIgKwpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlQ29sdW1uRGVsZXRlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlQ29sdW1uRGVsZXRlVGVzdC5qYXZhCmluZGV4IDcyMGExYjUuLjJhMmVjZTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZUNvbHVtbkRlbGV0ZVRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQ29tcGFjdFN0b3JhZ2VDb2x1bW5EZWxldGVUZXN0LmphdmEKQEAgLTMzLDcgKzMzLDcgQEAKICAgICAgICAgbmV3IFRlc3RDYXNlKCkKICAgICAgICAgLm5vZGVzKDIpCiAgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgyKQotICAgICAgICAudXBncmFkZXNGcm9tKHYzMCkKKyAgICAgICAgLnVwZ3JhZGVzVG9DdXJyZW50RnJvbSh2NDApCiAgICAgICAgIC5zZXR1cCgoY2x1c3RlcikgLT4gewogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBUQUJMRSAiICsgS0VZU1BBQ0UgKyAiLnRibCAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkgV0lUSCBDT01QQUNUIFNUT1JBR0UiKTsKICAgICAgICAgfSkKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZUhpZGRlbkNvbHVtblRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZUhpZGRlbkNvbHVtblRlc3QuamF2YQppbmRleCA0ZTUyMzZjLi45M2Y3NzBjIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQ29tcGFjdFN0b3JhZ2VIaWRkZW5Db2x1bW5UZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlSGlkZGVuQ29sdW1uVGVzdC5qYXZhCkBAIC0zMyw3ICszMyw3IEBACiAgICAgICAgIG5ldyBUZXN0Q2FzZSgpCiAgICAgICAgIC5ub2RlcygyKQogICAgICAgICAubm9kZXNUb1VwZ3JhZGUoMikKLSAgICAgICAgLnVwZ3JhZGVzRnJvbSh2MzApCisgICAgICAgIC51cGdyYWRlc1RvQ3VycmVudEZyb20odjQwKQogICAgICAgICAuc2V0dXAoKGNsdXN0ZXIpIC0+IHsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50YmwgKHBrIGludCwgY2sgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkgV0lUSCBDT01QQUNUIFNUT1JBR0UiKTsKICAgICAgICAgfSkKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZUltcGxpY2l0TnVsbEluQ2x1c3RlcmluZ1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZUltcGxpY2l0TnVsbEluQ2x1c3RlcmluZ1Rlc3QuamF2YQppbmRleCA5ZDQ4MjRhLi41MmI3OTJlIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQ29tcGFjdFN0b3JhZ2VJbXBsaWNpdE51bGxJbkNsdXN0ZXJpbmdUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlSW1wbGljaXROdWxsSW5DbHVzdGVyaW5nVGVzdC5qYXZhCkBAIC0zMyw3ICszMyw3IEBACiAgICAgICAgIG5ldyBUZXN0Q2FzZSgpCiAgICAgICAgIC5ub2RlcygyKQogICAgICAgICAubm9kZXNUb1VwZ3JhZGUoMikKLSAgICAgICAgLnVwZ3JhZGVzRnJvbSh2MzApCisgICAgICAgIC51cGdyYWRlc1RvQ3VycmVudEZyb20odjQwKQogICAgICAgICAuc2V0dXAoKGNsdXN0ZXIpIC0+IHsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50YmwgKHBrIGludCwgY2sxIGludCwgY2syIGludCwgdiBpbnQsIFBSSU1BUlkgS0VZIChwaywgY2sxLCBjazIpKSBXSVRIIENPTVBBQ1QgU1RPUkFHRSIpOwogICAgICAgICB9KQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nVGVzdC5qYXZhCmluZGV4IDMwN2Q2ZGQuLjE2NDMxOTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZVBhZ2luZ1Rlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQ29tcGFjdFN0b3JhZ2VQYWdpbmdUZXN0LmphdmEKQEAgLTMzLDcgKzMzLDcgQEAKICAgICAgICAgbmV3IFRlc3RDYXNlKCkKICAgICAgICAgLm5vZGVzKDIpCiAgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgyKQotICAgICAgICAudXBncmFkZXNGcm9tKHYzMCkKKyAgICAgICAgLnVwZ3JhZGVzVG9DdXJyZW50RnJvbSh2NDApCiAgICAgICAgIC5zZXR1cCgoY2x1c3RlcikgLT4gewogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBUQUJMRSAiICsgS0VZU1BBQ0UgKyAiLnRibCAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkgV0lUSCBDT01QQUNUIFNUT1JBR0UiKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMTA7IGkrKykKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZVBhZ2luZ1dpdGhQcm90b2NvbFRlc3Rlci5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVGVzdGVyLmphdmEKaW5kZXggNmRkM2JkOS4uNjkxYWQ0ZSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVGVzdGVyLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVGVzdGVyLmphdmEKQEAgLTYxLDcgKzYxLDcgQEAKICAgICAgICAgbmV3IFRlc3RDYXNlKCkKICAgICAgICAgLm5vZGVzKDIpCiAgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgxKQotICAgICAgICAuc2luZ2xlVXBncmFkZShpbml0aWFsVmVyc2lvbigpKQorICAgICAgICAuc2luZ2xlVXBncmFkZVRvQ3VycmVudEZyb20oaW5pdGlhbFZlcnNpb24oKSkKICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy53aXRoKEdPU1NJUCwgTkVUV09SSywgTkFUSVZFX1BST1RPQ09MKSkKICAgICAgICAgLnNldHVwKGMgLT4gewogICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudCAocGsgdGV4dCwgY2sgdGV4dCwgdiB0ZXh0LCAiICsKQEAgLTg4LDcgKzg4LDcgQEAKICAgICAgICAgbmV3IFRlc3RDYXNlKCkKICAgICAgICAgLm5vZGVzKDIpCiAgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgxKQotICAgICAgICAuc2luZ2xlVXBncmFkZShpbml0aWFsVmVyc2lvbigpKQorICAgICAgICAuc2luZ2xlVXBncmFkZVRvQ3VycmVudEZyb20oaW5pdGlhbFZlcnNpb24oKSkKICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy53aXRoKEdPU1NJUCwgTkVUV09SSywgTkFUSVZFX1BST1RPQ09MKSkKICAgICAgICAgLnNldHVwKGMgLT4gewogICAgICAgICAgICAgYy5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudCAocGsgdGV4dCwgY2sxIHRleHQsIGNrMiB0ZXh0LCB2IHRleHQsICIgKwpAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgIG5ldyBUZXN0Q2FzZSgpCiAgICAgICAgIC5ub2RlcygyKQogICAgICAgICAubm9kZXNUb1VwZ3JhZGUoMSkKLSAgICAgICAgLnNpbmdsZVVwZ3JhZGUoaW5pdGlhbFZlcnNpb24oKSkKKyAgICAgICAgLnNpbmdsZVVwZ3JhZGVUb0N1cnJlbnRGcm9tKGluaXRpYWxWZXJzaW9uKCkpCiAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcud2l0aChHT1NTSVAsIE5FVFdPUkssIE5BVElWRV9QUk9UT0NPTCkpCiAgICAgICAgIC5zZXR1cChjIC0+IHsKICAgICAgICAgICAgIGMuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnQgKHBrIHRleHQgUFJJTUFSWSBLRVksIHYxIHRleHQsIHYyIHRleHQpIFdJVEggQ09NUEFDVCBTVE9SQUdFIikpOwpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVjMwVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVjMwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MThhNTE0Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZVBhZ2luZ1dpdGhQcm90b2NvbFYzMFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXBncmFkZTsKLQotaW1wb3J0IGNvbS52ZHVybW9udC5zZW12ZXI0ai5TZW12ZXI7Ci0KLS8qKgotICoge0BsaW5rIENvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVGVzdGVyfSBmb3IgdjMwIC0+IENVUlJFTlQgdXBncmFkZSBwYXRoLgotICovCi1wdWJsaWMgY2xhc3MgQ29tcGFjdFN0b3JhZ2VQYWdpbmdXaXRoUHJvdG9jb2xWMzBUZXN0IGV4dGVuZHMgQ29tcGFjdFN0b3JhZ2VQYWdpbmdXaXRoUHJvdG9jb2xUZXN0ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU2VtdmVyIGluaXRpYWxWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2MzA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVjNYVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVjNYVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDNjMzcyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0U3RvcmFnZVBhZ2luZ1dpdGhQcm90b2NvbFYzWFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXBncmFkZTsKLQotaW1wb3J0IGNvbS52ZHVybW9udC5zZW12ZXI0ai5TZW12ZXI7Ci0KLS8qKgotICoge0BsaW5rIENvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVGVzdGVyfSBmb3IgdjNYIC0+IENVUlJFTlQgdXBncmFkZSBwYXRoLgotICovCi1wdWJsaWMgY2xhc3MgQ29tcGFjdFN0b3JhZ2VQYWdpbmdXaXRoUHJvdG9jb2xWM1hUZXN0IGV4dGVuZHMgQ29tcGFjdFN0b3JhZ2VQYWdpbmdXaXRoUHJvdG9jb2xUZXN0ZXIKLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU2VtdmVyIGluaXRpYWxWZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB2M1g7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVjQxVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0NvbXBhY3RTdG9yYWdlUGFnaW5nV2l0aFByb3RvY29sVjQxVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZDdkYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQ29tcGFjdFN0b3JhZ2VQYWdpbmdXaXRoUHJvdG9jb2xWNDFUZXN0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC51cGdyYWRlOworCitpbXBvcnQgY29tLnZkdXJtb250LnNlbXZlcjRqLlNlbXZlcjsKKworLyoqCisgKiB7QGxpbmsgQ29tcGFjdFN0b3JhZ2VQYWdpbmdXaXRoUHJvdG9jb2xUZXN0ZXJ9IGZvciB2NDEgLT4gQ1VSUkVOVCB1cGdyYWRlIHBhdGguCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wYWN0U3RvcmFnZVBhZ2luZ1dpdGhQcm90b2NvbFY0MVRlc3QgZXh0ZW5kcyBDb21wYWN0U3RvcmFnZVBhZ2luZ1dpdGhQcm90b2NvbFRlc3RlcgoreworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTZW12ZXIgaW5pdGlhbFZlcnNpb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHY0MTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQ29tcGFjdGlvbkhpc3RvcnlTeXN0ZW1UYWJsZVVwZ3JhZGVUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvQ29tcGFjdGlvbkhpc3RvcnlTeXN0ZW1UYWJsZVVwZ3JhZGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNlOTJkZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Db21wYWN0aW9uSGlzdG9yeVN5c3RlbVRhYmxlVXBncmFkZVRlc3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnVwZ3JhZGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworCitpbXBvcnQgY29tLnZkdXJtb250LnNlbXZlcjRqLlNlbXZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSGlzdG9yeVRhYnVsYXJEYXRhLkNPTVBBQ1RJT05fVFlQRV9QUk9QRVJUWTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbEp2bUR0ZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5ub2RldG9vbC5Db21wYWN0aW9uSGlzdG9yeVRlc3QuYXNzZXJ0Q29tcGFjdGlvbkhpc3RvcnlPdXRQdXQ7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ29tcGFjdGlvbkhpc3RvcnlTeXN0ZW1UYWJsZVVwZ3JhZGVUZXN0IGV4dGVuZHMgVXBncmFkZVRlc3RCYXNlCit7CisgICAgQFBhcmFtZXRlcgorICAgIHB1YmxpYyBTZW12ZXIgdmVyc2lvbjsKKworICAgIEBQYXJhbWV0ZXJzKCkKKyAgICBwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxTZW12ZXI+IHZlcnNpb25zKCkKKyAgICB7CisgICAgICAgIHJldHVybiBMaXN0cy5uZXdBcnJheUxpc3QodjMwLCB2M1gsIHY0MCwgdjQxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvbXBhY3Rpb25IaXN0b3J5U3lzdGVtVGFibGVUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgbmV3IFRlc3RDYXNlKCkKKyAgICAgICAgLm5vZGVzKDEpCisgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgxKQorICAgICAgICAudXBncmFkZXNUb0N1cnJlbnRGcm9tKHZlcnNpb24pCisgICAgICAgIC5zZXR1cCgoY2x1c3RlcikgLT4geworICAgICAgICAgICAgLy9jcmVhdGUgdGFibGUKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50YiAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGsgdGV4dCBQUklNQVJZIEtFWSwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjMSB0ZXh0LCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMyIGludCwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjMyBpbnQpIik7CisgICAgICAgICAgICAvLyBkaXNhYmxlIGF1dG8gY29tcGFjdGlvbgorICAgICAgICAgICAgY2x1c3Rlci5zdHJlYW0oKS5mb3JFYWNoKG5vZGUgLT4gbm9kZS5ub2RldG9vbCgiZGlzYWJsZWF1dG9jb21wYWN0aW9uIikpOworICAgICAgICAgICAgLy8gZ2VuZXJhdGUgc3N0YWJsZXMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IDEwOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKCJJTlNFUlQgSU5UTyAiICsgS0VZU1BBQ0UgKyAiLnRiIChwaywgYzEsIGMyLCBjMykgVkFMVUVTICgncGsiICsgaSArICInLCAnYzEiICsgaSArICInLCAiICsgaSArICcsJyArIGkgKyAnKScsIENvbnNpc3RlbmN5TGV2ZWwuQUxMKTsKKyAgICAgICAgICAgICAgICBjbHVzdGVyLnN0cmVhbSgpLmZvckVhY2gobm9kZSAtPiBub2RlLmZsdXNoKEtFWVNQQUNFKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBmb3JjZSBjb21wYWN0CisgICAgICAgICAgICBjbHVzdGVyLnN0cmVhbSgpLmZvckVhY2gobm9kZSAtPiBub2RlLmZvcmNlQ29tcGFjdChLRVlTUEFDRSwgInRiIikpOworICAgICAgICB9KS5ydW5BZnRlckNsdXN0ZXJVcGdyYWRlKChjbHVzdGVyKSAtPiB7CisgICAgICAgICAgICAvLyBkaXNhYmxlIGF1dG8gY29tcGFjdGlvbiBhdCBzdGFydCB1cAorICAgICAgICAgICAgY2x1c3Rlci5zdHJlYW0oKS5mb3JFYWNoKG5vZGUgLT4gbm9kZS5ub2RldG9vbCgiZGlzYWJsZWF1dG9jb21wYWN0aW9uIikpOworICAgICAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2xIaXN0b3J5ID0gaW52b2tlTm9kZXRvb2xKdm1EdGVzdChjbHVzdGVyLmdldCgxKSwgImNvbXBhY3Rpb25oaXN0b3J5Iik7CisgICAgICAgICAgICB0b29sSGlzdG9yeS5hc3NlcnRPbkNsZWFuRXhpdCgpOworICAgICAgICAgICAgLy8gdXBncmFkZWQgc3lzdGVtLmNvbXBhY3Rpb25faGlzdG9yeSBkYXRhIHZlcmlmeQorICAgICAgICAgICAgYXNzZXJ0Q29tcGFjdGlvbkhpc3RvcnlPdXRQdXQodG9vbEhpc3RvcnksIEtFWVNQQUNFLCAidGIiLCBJbW11dGFibGVNYXAub2YoKSk7CisKKyAgICAgICAgICAgIC8vIGZvcmNlIGNvbXBhY3QKKyAgICAgICAgICAgIGNsdXN0ZXIuc3RyZWFtKCkuZm9yRWFjaChub2RlIC0+IG5vZGUubm9kZXRvb2woImNvbXBhY3QiKSk7CisgICAgICAgICAgICB0b29sSGlzdG9yeSA9IGludm9rZU5vZGV0b29sSnZtRHRlc3QoY2x1c3Rlci5nZXQoMSksICJjb21wYWN0aW9uaGlzdG9yeSIpOworICAgICAgICAgICAgdG9vbEhpc3RvcnkuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgICAgIGFzc2VydENvbXBhY3Rpb25IaXN0b3J5T3V0UHV0KHRvb2xIaXN0b3J5LCBLRVlTUEFDRSwgInRiIiwgSW1tdXRhYmxlTWFwLm9mKENPTVBBQ1RJT05fVFlQRV9QUk9QRVJUWSwgT3BlcmF0aW9uVHlwZS5NQUpPUl9DT01QQUNUSU9OLnR5cGUpKTsKKyAgICAgICAgfSkKKyAgICAgICAgLnJ1bigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Ecm9wQ29tcGFjdFN0b3JhZ2VOdWxsQ2x1c3RlcmluZ1ZhbHVlc1Rlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Ecm9wQ29tcGFjdFN0b3JhZ2VOdWxsQ2x1c3RlcmluZ1ZhbHVlc1Rlc3QuamF2YQppbmRleCAxNjU3NzY1Li4yZTU1NzhkIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvRHJvcENvbXBhY3RTdG9yYWdlTnVsbENsdXN0ZXJpbmdWYWx1ZXNUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0Ryb3BDb21wYWN0U3RvcmFnZU51bGxDbHVzdGVyaW5nVmFsdWVzVGVzdC5qYXZhCkBAIC0zMyw3ICszMyw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdE51bGxDbHVzdGVyaW5nVmFsdWVzKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgbmV3IFRlc3RDYXNlKCkubm9kZXMoMSkKLSAgICAgICAgICAgICAgICAgICAgICAudXBncmFkZXNGcm9tKHYzMCkKKyAgICAgICAgICAgICAgICAgICAgICAudXBncmFkZXNUb0N1cnJlbnRGcm9tKHYzMCkKICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjb25maWcgLT4gY29uZmlnLndpdGgoR09TU0lQLCBORVRXT1JLLCBOQVRJVkVfUFJPVE9DT0wpLnNldCgiZW5hYmxlX2Ryb3BfY29tcGFjdF9zdG9yYWdlIiwgdHJ1ZSkpCiAgICAgICAgICAgICAgICAgICAgICAgLnNldHVwKGNsdXN0ZXIgLT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY3JlYXRlID0gIkNSRUFURSBUQUJMRSAlcy4lcyhrIGludCwgYzEgaW50LCBjMiBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAoaywgYzEsIGMyKSkgIiArCmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvRHJvcENvbXBhY3RTdG9yYWdlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0Ryb3BDb21wYWN0U3RvcmFnZVRlc3QuamF2YQppbmRleCBjNjQ1MDg1Li45ODQ2MjY0IDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvRHJvcENvbXBhY3RTdG9yYWdlVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9Ecm9wQ29tcGFjdFN0b3JhZ2VUZXN0LmphdmEKQEAgLTM1LDcgKzM1LDcgQEAKICAgICAgICAgbmV3IFRlc3RDYXNlKCkKICAgICAgICAgLm5vZGVzKDIpCiAgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgxLCAyKQotICAgICAgICAudXBncmFkZXNGcm9tKHYzMCkKKyAgICAgICAgLnVwZ3JhZGVzVG9DdXJyZW50RnJvbSh2MzApCiAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcud2l0aChHT1NTSVAsIE5FVFdPUkspLnNldCgiZW5hYmxlX2Ryb3BfY29tcGFjdF9zdG9yYWdlIiwgdHJ1ZSkpCiAgICAgICAgIC5zZXR1cCgoY2x1c3RlcikgLT4gewogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBUQUJMRSAiICsgS0VZU1BBQ0UgKyAiLnRibCAocGsgaW50LCBjayBpbnQsIFBSSU1BUlkgS0VZIChwaywgY2spKSBXSVRIIENPTVBBQ1QgU1RPUkFHRSIpOwpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL0dyb3VwQnlUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvR3JvdXBCeVRlc3QuamF2YQppbmRleCBiMDliODgyLi5iMjk3MWNkIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvR3JvdXBCeVRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvR3JvdXBCeVRlc3QuamF2YQpAQCAtMzUsNyArMzUsNyBAQAogICAgICAgICAvLyBDQVNTQU5EUkEtMTY1ODI6IGdyb3VwLWJ5IGFjcm9zcyBtaXhlZCB2ZXJzaW9uIGNsdXN0ZXIgd291bGQgZmFpbCB3aXRoIEFycmF5SW5kZXhPdXRPZkJvdW5kRXhjZXB0aW9uCiAgICAgICAgIG5ldyBVcGdyYWRlVGVzdEJhc2UuVGVzdENhc2UoKQogICAgICAgICAubm9kZXMoMikKLSAgICAgICAgLnVwZ3JhZGVzRnJvbSh2M1gpCisgICAgICAgIC51cGdyYWRlc1RvQ3VycmVudEZyb20odjNYKQogICAgICAgICAubm9kZXNUb1VwZ3JhZGUoMSkKICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy53aXRoKEdPU1NJUCwgTkVUV09SSykpCiAgICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVBdmFpbGFiaWxpdHlUZXN0QmFzZS5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUF2YWlsYWJpbGl0eVRlc3RCYXNlLmphdmEKaW5kZXggNGU1MGViMS4uMWNhMjNhZSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUF2YWlsYWJpbGl0eVRlc3RCYXNlLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUF2YWlsYWJpbGl0eVRlc3RCYXNlLmphdmEKQEAgLTc0LDYgKzc0LDE0IEBACiAgICAgICAgIHRlc3RBdmFpbGFiaWxpdHkodHJ1ZSwgaW5pdGlhbCwgd3JpdGVDb25zaXN0ZW5jeUxldmVsLCByZWFkQ29uc2lzdGVuY3lMZXZlbCk7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHRlc3RBdmFpbGFiaWxpdHkoU2VtdmVyIGluaXRpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lMZXZlbCB3cml0ZUNvbnNpc3RlbmN5TGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc2lzdGVuY3lMZXZlbCByZWFkQ29uc2lzdGVuY3lMZXZlbCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdGVzdEF2YWlsYWJpbGl0eSh0cnVlLCBpbml0aWFsLCB3cml0ZUNvbnNpc3RlbmN5TGV2ZWwsIHJlYWRDb25zaXN0ZW5jeUxldmVsKTsKKyAgICAgICAgdGVzdEF2YWlsYWJpbGl0eShmYWxzZSwgaW5pdGlhbCwgd3JpdGVDb25zaXN0ZW5jeUxldmVsLCByZWFkQ29uc2lzdGVuY3lMZXZlbCk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0QXZhaWxhYmlsaXR5KGJvb2xlYW4gdXBncmFkZWRDb29yZGluYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VtdmVyIGluaXRpYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNpc3RlbmN5TGV2ZWwgd3JpdGVDb25zaXN0ZW5jeUxldmVsLApAQCAtODIsNyArOTAsNyBAQAogICAgICAgICBuZXcgVGVzdENhc2UoKQogICAgICAgICAubm9kZXMoTlVNX05PREVTKQogICAgICAgICAubm9kZXNUb1VwZ3JhZGUodXBncmFkZWRDb29yZGluYXRvciA/IDEgOiAyKQotICAgICAgICAudXBncmFkZXMoaW5pdGlhbCwgVXBncmFkZVRlc3RCYXNlLkNVUlJFTlQpCisgICAgICAgIC51cGdyYWRlc1RvQ3VycmVudEZyb20oaW5pdGlhbCkKICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy5zZXQoInJlYWRfcmVxdWVzdF90aW1lb3V0X2luX21zIiwgU0VDT05EUy50b01pbGxpcyg1KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoIndyaXRlX3JlcXVlc3RfdGltZW91dF9pbl9tcyIsIFNFQ09ORFMudG9NaWxsaXMoNSkpKQogICAgICAgICAvLyB1c2UgcmV0cnkgb2YgMTBtcyBzbyB0aGF0IGVhY2ggY2hlY2sgaXMgY29uc2lzdGVudApAQCAtOTMsNiArMTAxLDcgQEAKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnQgKGsgdXVpZCwgYyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAoaywgYykpIFdJVEggc3BlY3VsYXRpdmVfcmV0cnkgPSAnMTBtcyciKSk7CiAgICAgICAgICAgICBjbHVzdGVyLnNldFVuY2F1Z2h0RXhjZXB0aW9uc0ZpbHRlcih0aHJvd2FibGUgLT4gdGhyb3dhYmxlIGluc3RhbmNlb2YgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24pOwogICAgICAgICB9KQorICAgICAgICAucnVuQmVmb3JlQ2x1c3RlclVwZ3JhZGUoY2x1c3RlciAtPiBjbHVzdGVyLmZpbHRlcnMoKS5yZXNldCgpKQogICAgICAgICAucnVuQWZ0ZXJOb2RlVXBncmFkZSgoY2x1c3RlciwgbikgLT4gewogCiAgICAgICAgICAgICBJQ29vcmRpbmF0b3IgY29vcmRpbmF0b3IgPSBjbHVzdGVyLmNvb3JkaW5hdG9yKENPT1JESU5BVE9SKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVBdmFpbGFiaWxpdHlWM1hPbmVBbGxUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlQXZhaWxhYmlsaXR5VjNYT25lQWxsVGVzdC5qYXZhCmluZGV4IDhlYTk0ZWEuLjU5NTU0ZDEgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVBdmFpbGFiaWxpdHlWM1hPbmVBbGxUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUF2YWlsYWJpbGl0eVYzWE9uZUFsbFRlc3QuamF2YQpAQCAtMjUsNyArMjUsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgTWl4ZWRNb2RlQXZhaWxhYmlsaXR5VjNYT25lQWxsVGVzdCBleHRlbmRzIE1peGVkTW9kZUF2YWlsYWJpbGl0eVRlc3RCYXNlCiB7Ci0gICAgcHVibGljIE1peGVkTW9kZUF2YWlsYWJpbGl0eVYzWE9uZUFsbFRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgcHVibGljIE1peGVkTW9kZUF2YWlsYWJpbGl0eVYzWE9uZUFsbFRlc3QoKQogICAgIHsKICAgICAgICAgc3VwZXIodjNYLCBDb25zaXN0ZW5jeUxldmVsLk9ORSwgQ29uc2lzdGVuY3lMZXZlbC5BTEwpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVDb25zaXN0ZW5jeVRlc3RCYXNlLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlQ29uc2lzdGVuY3lUZXN0QmFzZS5qYXZhCmluZGV4IGY5OGZjOGEuLjUxOTYyNWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVDb25zaXN0ZW5jeVRlc3RCYXNlLmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUNvbnNpc3RlbmN5VGVzdEJhc2UuamF2YQpAQCAtNDIsMTEgKzQyLDYgQEAKIHsKICAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdGVzdENvbnNpc3RlbmN5KFNlbXZlciBpbml0aWFsKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICB0ZXN0Q29uc2lzdGVuY3koaW5pdGlhbCwgVXBncmFkZVRlc3RCYXNlLkNVUlJFTlQpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCB0ZXN0Q29uc2lzdGVuY3koU2VtdmVyIGluaXRpYWwsIFNlbXZlciB1cGdyYWRlKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewogICAgICAgICBMaXN0PFRlc3Rlcj4gdGVzdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICB0ZXN0ZXJzLmFkZEFsbChUZXN0ZXIuY3JlYXRlKDEsIEFMTCkpOwogICAgICAgICB0ZXN0ZXJzLmFkZEFsbChUZXN0ZXIuY3JlYXRlKDIsIEFMTCwgUVVPUlVNKSk7CkBAIC01NSw3ICs1MCw3IEBACiAgICAgICAgIG5ldyBUZXN0Q2FzZSgpCiAgICAgICAgIC5ub2RlcygzKQogICAgICAgICAubm9kZXNUb1VwZ3JhZGUoMSkKLSAgICAgICAgLnVwZ3JhZGVzKGluaXRpYWwsIHVwZ3JhZGUpCisgICAgICAgIC51cGdyYWRlc1RvQ3VycmVudEZyb20oaW5pdGlhbCkKICAgICAgICAgLndpdGhDb25maWcoY29uZmlnIC0+IGNvbmZpZy5zZXQoInJlYWRfcmVxdWVzdF90aW1lb3V0X2luX21zIiwgU0VDT05EUy50b01pbGxpcygzMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJ3cml0ZV9yZXF1ZXN0X3RpbWVvdXRfaW5fbXMiLCBTRUNPTkRTLnRvTWlsbGlzKDMwKSkpCiAgICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVGcm9tM1JlcGxpY2F0aW9uVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUZyb20zUmVwbGljYXRpb25UZXN0LmphdmEKaW5kZXggNDkwMjM4NS4uNjlkM2RiZSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUZyb20zUmVwbGljYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZUZyb20zUmVwbGljYXRpb25UZXN0LmphdmEKQEAgLTE4LDE5ICsxOCw2NSBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnVwZ3JhZGU7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLXB1YmxpYyBjbGFzcyBNaXhlZE1vZGVGcm9tM1JlcGxpY2F0aW9uVGVzdCBleHRlbmRzIE1peGVkTW9kZVJlcGxpY2F0aW9uVGVzdEJhc2UKLXsKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTdHJhdGVneTMwdG8zWCgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIHRlc3RTaW1wbGVTdHJhdGVneSh2MzAsIHYzWCk7Ci0gICAgfQoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5Bc3NlcnRVdGlscy5hc3NlcnRSb3dzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQXNzZXJ0VXRpbHMucm93OworCitwdWJsaWMgY2xhc3MgTWl4ZWRNb2RlRnJvbTNSZXBsaWNhdGlvblRlc3QgZXh0ZW5kcyBVcGdyYWRlVGVzdEJhc2UKK3sKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTdHJhdGVneSgpIHRocm93cyBUaHJvd2FibGUKICAgICB7Ci0gICAgICAgIHRlc3RTaW1wbGVTdHJhdGVneSh2MzApOworICAgICAgICBTdHJpbmcgaW5zZXJ0ID0gIklOU0VSVCBJTlRPIHRlc3Rfc2ltcGxlLm5hbWVzIChrZXksIG5hbWUpIFZBTFVFUyAoPywgPykiOworICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCAqIEZST00gdGVzdF9zaW1wbGUubmFtZXMgV0hFUkUga2V5ID0gPyI7CisKKyAgICAgICAgbmV3IFRlc3RDYXNlKCkKKyAgICAgICAgLm5vZGVzKDMpCisgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgxLCAyKQorICAgICAgICAudXBncmFkZXNUb0N1cnJlbnRGcm9tKHYzMCkKKyAgICAgICAgLnNldHVwKGNsdXN0ZXIgLT4geworICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBLRVlTUEFDRSB0ZXN0X3NpbXBsZSBXSVRIIHJlcGxpY2F0aW9uID0geydjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InOiAyfTsiKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgdGVzdF9zaW1wbGUubmFtZXMgKGtleSBpbnQgUFJJTUFSWSBLRVksIG5hbWUgdGV4dCkiKTsKKyAgICAgICAgfSkKKyAgICAgICAgLnJ1bkFmdGVyTm9kZVVwZ3JhZGUoKGNsdXN0ZXIsIHVwZ3JhZGVkKSAtPiB7CisgICAgICAgICAgICBMaXN0PExvbmc+IGluaXRpYWxUb2tlbnMgPSBuZXcgQXJyYXlMaXN0PD4oY2x1c3Rlci5zaXplKCkgKyAxKTsKKyAgICAgICAgICAgIGluaXRpYWxUb2tlbnMuYWRkKG51bGwpOyAvLyBUaGUgZmlyc3QgdmFsaWQgdG9rZW4gaXMgYXQgMSB0byBhdm9pZCBvZmZzZXQgbWF0aCBiZWxvdy4KKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gY2x1c3Rlci5zaXplKCk7IGkrKykKKyAgICAgICAgICAgICAgICBpbml0aWFsVG9rZW5zLmFkZChMb25nLnZhbHVlT2YoY2x1c3Rlci5nZXQoaSkuY29uZmlnKCkuZ2V0KCJpbml0aWFsX3Rva2VuIikudG9TdHJpbmcoKSkpOworCisgICAgICAgICAgICBMaXN0PExvbmc+IHZhbGlkVG9rZW5zID0gaW5pdGlhbFRva2Vucy5zdWJMaXN0KDEsIGNsdXN0ZXIuc2l6ZSgpICsgMSk7CisKKyAgICAgICAgICAgIC8vIEV4ZXJjaXNlIGFsbCB0aGUgY29vcmRpbmF0b3JzLi4uCisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBjbHVzdGVyLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIC4uLmFuZCBzYW1wbGUgZW5vdWdoIGtleXMgdGhhdCB3ZSBjb3ZlciB0aGUgcmluZy4KKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQga2V5ID0gaiArIChpICogMTApOworICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSByb3cgPSByb3coa2V5LCAiTmVybyIpOworICAgICAgICAgICAgICAgICAgICBMb25nIHRva2VuID0gdG9rZW5Gcm9tKGtleSk7CisKKyAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcihpKS5leGVjdXRlKGluc2VydCwgQ29uc2lzdGVuY3lMZXZlbC5BTEwsIHJvdyk7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IG5vZGUgPSBwcmltYXJ5UmVwbGljYSh2YWxpZFRva2VucywgdG9rZW4pOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGNsdXN0ZXIuZ2V0KG5vZGUpLmV4ZWN1dGVJbnRlcm5hbChzZWxlY3QsIGtleSksIHJvdyk7CisKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5leHROb2RlKG5vZGUsIGNsdXN0ZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhjbHVzdGVyLmdldChub2RlKS5leGVjdXRlSW50ZXJuYWwoc2VsZWN0LCBrZXkpLCByb3cpOworCisgICAgICAgICAgICAgICAgICAgIC8vIEF0IFJGPTIsIHRoaXMgbm9kZSBzaG91bGQgbm90IGhhdmUgcmVjZWl2ZWQgdGhlIHdyaXRlLgorICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV4dE5vZGUobm9kZSwgY2x1c3Rlci5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGNsdXN0ZXIuZ2V0KG5vZGUpLmV4ZWN1dGVJbnRlcm5hbChzZWxlY3QsIGtleSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkKKyAgICAgICAgLnJ1bigpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVHb3NzaXBUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlR29zc2lwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGM5Njk1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVHb3NzaXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC51cGdyYWRlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpQ29uc3VtZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5VcGdyYWRlYWJsZUNsdXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklNZXNzYWdlRmlsdGVyczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYjsKLWltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwotCi1wdWJsaWMgY2xhc3MgTWl4ZWRNb2RlR29zc2lwVGVzdCBleHRlbmRzIFVwZ3JhZGVUZXN0QmFzZQotewotICAgIFBhdHRlcm4gZXhwZWN0ZWROb3JtYWxTdGF0dXMgPSBQYXR0ZXJuLmNvbXBpbGUoIlNUQVRVUzpcXGQrOk5PUk1BTCwtP1xcZCsiKTsKLSAgICBQYXR0ZXJuIGV4cGVjdGVkTm9ybWFsU3RhdHVzV2l0aFBvcnQgPSBQYXR0ZXJuLmNvbXBpbGUoIlNUQVRVU19XSVRIX1BPUlQ6XFxkKzpOT1JNQUwsLT9cXGQrIik7Ci0gICAgUGF0dGVybiBleHBlY3RlZE5vcm1hbFgzID0gUGF0dGVybi5jb21waWxlKCJYMzpcXGQrOk5PUk1BTCwtP1xcZCsiKTsKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFN0YXR1c0ZpZWxkU2hvdWxkRXhpc3RJbk9sZFZlcnNpb25Ob2RlcygpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIG5ldyBUZXN0Q2FzZSgpCi0gICAgICAgIC53aXRoQ29uZmlnKGMgLT4gYy53aXRoKEZlYXR1cmUuR09TU0lQLCBGZWF0dXJlLk5FVFdPUkspKQotICAgICAgICAubm9kZXMoMykKLSAgICAgICAgLm5vZGVzVG9VcGdyYWRlT3JkZXJlZCgxLCAyLCAzKQotICAgICAgICAvLyBhbGwgdXBncmFkZXMgZnJvbSB2MzAgdXAsIGV4Y2x1ZGluZyB2MzAtPnYzWCBhbmQgZnJvbSB2NDAKLSAgICAgICAgLnNpbmdsZVVwZ3JhZGUodjMwKQotICAgICAgICAuc2luZ2xlVXBncmFkZSh2M1gpCi0gICAgICAgIC5zZXR1cChjIC0+IHt9KQotICAgICAgICAucnVuQWZ0ZXJOb2RlVXBncmFkZSgoY2x1c3Rlciwgbm9kZSkgLT4gewotICAgICAgICAgICAgaWYgKG5vZGUgPT0gMSkgewotICAgICAgICAgICAgICAgIGNoZWNrUGVlckdvc3NpcEluZm9TaG91bGRDb250YWluTm9ybWFsU3RhdHVzKGNsdXN0ZXIsIDIpOwotICAgICAgICAgICAgICAgIGNoZWNrUGVlckdvc3NpcEluZm9TaG91bGRDb250YWluTm9ybWFsU3RhdHVzKGNsdXN0ZXIsIDMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5vZGUgPT0gMikgewotICAgICAgICAgICAgICAgIGNoZWNrUGVlckdvc3NpcEluZm9TaG91bGRDb250YWluTm9ybWFsU3RhdHVzKGNsdXN0ZXIsIDMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KQotICAgICAgICAucnVuQWZ0ZXJDbHVzdGVyVXBncmFkZShjbHVzdGVyIC0+IHsKLSAgICAgICAgICAgIC8vIHdhaXQgMSBtaW51dGUgZm9yIGBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXMuR29zc2lwZXIudXBncmFkZUZyb21WZXJzaW9uU3VwcGxpZXJgIHRvIHVwZGF0ZQotICAgICAgICAgICAgVW5pbnRlcnJ1cHRpYmxlcy5zbGVlcFVuaW50ZXJydXB0aWJseSgxLCBUaW1lVW5pdC5NSU5VVEVTKTsKLSAgICAgICAgICAgIGNoZWNrUGVlckdvc3NpcEluZm9PZkFsbE5vZGVzU2hvdWxkQ29udGFpbk5ld1N0YXR1c0FmdGVyVXBncmFkZShjbHVzdGVyKTsKLSAgICAgICAgfSkKLSAgICAgICAgLnJ1bigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNpbWlsYXIgdG8ge0BsaW5rICN0ZXN0U3RhdHVzRmllbGRTaG91bGRFeGlzdEluT2xkVmVyc2lvbk5vZGVzfSwgYnV0IGluIGFuIGVkZ2UgY2FzZSB0aGF0Ci0gICAgICogMSkgbm9kZTIgYW5kIG5vZGUzIGNhbm5vdCBnb3NzaXAgd2l0aCBlYWNoIG90aGVyLgotICAgICAqIDIpIG5vZGUyIHNlbmRzIFNZTiB0byBub2RlMSBmaXJzdCB3aGVuIHVwZ3JhZGluZy4KLSAgICAgKiAzKSBub2RlMyBpcyBhdCB0aGUgbG93ZXIgdmVyc2lvbiBkdXJpbmcgdGhlIGNsdXN0ZXIgdXBncmFkZQotICAgICAqIEluIHRoaXMgY2FzZSwgbm9kZTMgZ29zc2lwIGluZm8gZG9lcyBub3QgY29udGFpbiBTVEFUVVMgZmllbGQgZm9yIG5vZGUyCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdHVzRmllbGRTaG91bGRFeGlzdEluT2xkVmVyc2lvbk5vZGVzRWRnZUNhc2UoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBBdG9taWNSZWZlcmVuY2U8SU1lc3NhZ2VGaWx0ZXJzLkZpbHRlcj4gbjFHb3NzaXBTeW5CbG9ja2VyID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7Ci0gICAgICAgIG5ldyBUZXN0Q2FzZSgpCi0gICAgICAgIC53aXRoQ29uZmlnKGMgLT4gYy53aXRoKEZlYXR1cmUuR09TU0lQLCBGZWF0dXJlLk5FVFdPUkspKQotICAgICAgICAubm9kZXMoMykKLSAgICAgICAgLm5vZGVzVG9VcGdyYWRlT3JkZXJlZCgxLCAyLCAzKQotICAgICAgICAvLyBhbGwgdXBncmFkZXMgZnJvbSB2MzAgdXAsIGV4Y2x1ZGluZyB2MzAtPnYzWCBhbmQgZnJvbSB2NDAKLSAgICAgICAgLnNpbmdsZVVwZ3JhZGUodjMwKQotICAgICAgICAuc2luZ2xlVXBncmFkZSh2M1gpCi0gICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKLSAgICAgICAgICAgIC8vIG5vZGUyIGFuZCBub2RlMyBnb3NzaXBlciBjYW5ub3QgdGFsayB3aXRoIGVhY2ggb3RoZXIKLSAgICAgICAgICAgIGNsdXN0ZXIuZmlsdGVycygpLnZlcmJzKFZlcmIuR09TU0lQX0RJR0VTVF9TWU4uaWQpLmZyb20oMikudG8oMykuZHJvcCgpOwotICAgICAgICAgICAgY2x1c3Rlci5maWx0ZXJzKCkudmVyYnMoVmVyYi5HT1NTSVBfRElHRVNUX1NZTi5pZCkuZnJvbSgzKS50bygyKS5kcm9wKCk7Ci0gICAgICAgIH0pCi0gICAgICAgIC5ydW5BZnRlck5vZGVVcGdyYWRlKChjbHVzdGVyLCBub2RlKSAtPiB7Ci0gICAgICAgICAgICAvLyBsZXQgbm9kZTIgc2VuZHMgdGhlIFNZTiB0byBub2RlMSBmaXJzdAotICAgICAgICAgICAgaWYgKG5vZGUgPT0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJTWVzc2FnZUZpbHRlcnMuRmlsdGVyIGZpbHRlciA9IGNsdXN0ZXIuZmlsdGVycygpLnZlcmJzKFZlcmIuR09TU0lQX0RJR0VTVF9TWU4uaWQpLmZyb20oMSkudG8oMikuZHJvcCgpOwotICAgICAgICAgICAgICAgIG4xR29zc2lwU3luQmxvY2tlci5zZXQoZmlsdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUgPT0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuMUdvc3NpcFN5bkJsb2NrZXIuZ2V0KCkub2ZmKCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5vZGUzR29zc2lwVmlldyA9IGNsdXN0ZXIuZ2V0KDMpLm5vZGV0b29sUmVzdWx0KCJnb3NzaXBpbmZvIikuZ2V0U3Rkb3V0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5vZGUyR29zc2lwU3RhdGUgPSBnZXRHb3NzaXBTdGF0ZU9mTm9kZShub2RlM0dvc3NpcFZpZXcsICIvMTI3LjAuMC4yIik7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KG5vZGUyR29zc2lwU3RhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5hcygiVGhlIG5vZGUyJ3MgZ29zc2lwIHN0YXRlIGZyb20gbm9kZTMncyBwZXJzcGVjdGl2ZSBzaG91bGQgY29udGFpbiBzdGF0dXMuICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFuZCBpdCBzaG91bGQgY2FycnkgYW4gdW5yZWNvZ25pemVkIGZpZWxkIFgzIHdpdGggTk9STUFMLiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWluc1BhdHRlcm4oZXhwZWN0ZWROb3JtYWxTdGF0dXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWluc1BhdHRlcm4oZXhwZWN0ZWROb3JtYWxYMyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pCi0gICAgICAgIC5ydW5BZnRlckNsdXN0ZXJVcGdyYWRlKGNsdXN0ZXIgLT4gewotICAgICAgICAgICAgLy8gd2FpdCAxIG1pbnV0ZSBmb3IgYG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5Hb3NzaXBlci51cGdyYWRlRnJvbVZlcnNpb25TdXBwbGllcmAgdG8gdXBkYXRlCi0gICAgICAgICAgICBVbmludGVycnVwdGlibGVzLnNsZWVwVW5pbnRlcnJ1cHRpYmx5KDEsIFRpbWVVbml0Lk1JTlVURVMpOwotICAgICAgICAgICAgY2hlY2tQZWVyR29zc2lwSW5mb09mQWxsTm9kZXNTaG91bGRDb250YWluTmV3U3RhdHVzQWZ0ZXJVcGdyYWRlKGNsdXN0ZXIpOwotICAgICAgICB9KQotICAgICAgICAucnVuKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGVlckdvc3NpcEluZm9PZkFsbE5vZGVzU2hvdWxkQ29udGFpbk5ld1N0YXR1c0FmdGVyVXBncmFkZShVcGdyYWRlYWJsZUNsdXN0ZXIgY2x1c3RlcikKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IG4gPSBpOwotICAgICAgICAgICAgY2hlY2tQZWVyR29zc2lwSW5mbyhjbHVzdGVyLCBpLCAoZ29zc2lwSW5mbywgcGVlcnMpIC0+IHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwIDogcGVlcnMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoZ2V0R29zc2lwU3RhdGVPZk5vZGUoZ29zc2lwSW5mbywgcCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXMoU3RyaW5nLmZvcm1hdCgiJXMgZ29zc2lwIHN0YXRlIGluIG5vZGUlcyBzaG91bGQgbm90IGNvbnRhaW4gU1RBVFVTICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBzaG91bGQgY29udGFpbiBTVEFUVVNfV0lUSF9QT1JULiIsIHAsIG4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRvZXNOb3RDb250YWluKCJTVEFUVVM6IikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWluc1BhdHRlcm4oZXhwZWN0ZWROb3JtYWxTdGF0dXNXaXRoUG9ydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tQZWVyR29zc2lwSW5mb1Nob3VsZENvbnRhaW5Ob3JtYWxTdGF0dXMoVXBncmFkZWFibGVDbHVzdGVyIGNsdXN0ZXIsIGludCBub2RlKQotICAgIHsKLSAgICAgICAgY2hlY2tQZWVyR29zc2lwSW5mbyhjbHVzdGVyLCBub2RlLCAoZ29zc2lwSW5mbywgcGVlcnMpIC0+IHsKLSAgICAgICAgICAgIGZvciAoU3RyaW5nIG4gOiBwZWVycykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoZ2V0R29zc2lwU3RhdGVPZk5vZGUoZ29zc2lwSW5mbywgbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWluc1BhdHRlcm4oZXhwZWN0ZWROb3JtYWxTdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tQZWVyR29zc2lwSW5mbyhVcGdyYWRlYWJsZUNsdXN0ZXIgY2x1c3RlciwgaW50IG5vZGUsIEJpQ29uc3VtZXI8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gdmVyaWZpZXIpCi0gICAgewotICAgICAgICBTZXQ8SW50ZWdlcj4gcGVlcnMgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoMSwgMiwgMykpOwotICAgICAgICBwZWVycy5yZW1vdmUobm9kZSk7Ci0gICAgICAgIFN0cmluZyBnb3NzaXBJbmZvID0gY2x1c3Rlci5nZXQobm9kZSkubm9kZXRvb2xSZXN1bHQoImdvc3NpcGluZm8iKS5nZXRTdGRvdXQoKTsKLSAgICAgICAgdmVyaWZpZXIuYWNjZXB0KGdvc3NpcEluZm8sIHBlZXJzLnN0cmVhbSgpLm1hcChpIC0+ICIxMjcuMC4wLiIgKyBpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGdldEdvc3NpcFN0YXRlT2ZOb2RlKFN0cmluZyByYXdPdXRwdXQsIFN0cmluZyBub2RlSW50ZXJlc3RlZCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyB0ZW1wID0gcmF3T3V0cHV0LnN1YnN0cmluZyhyYXdPdXRwdXQuaW5kZXhPZihub2RlSW50ZXJlc3RlZCkpOwotICAgICAgICBpbnQgbmV4dFNsYXNoSW5kZXggPSB0ZW1wLmluZGV4T2YoJy8nLCAxKTsKLSAgICAgICAgaWYgKG5leHRTbGFzaEluZGV4ICE9IC0xKQotICAgICAgICAgICAgcmV0dXJuIHRlbXAuc3Vic3RyaW5nKDAsIG5leHRTbGFzaEluZGV4KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHRlbXA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZU1lc3NhZ2VGb3J3YXJkVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZU1lc3NhZ2VGb3J3YXJkVGVzdC5qYXZhCmluZGV4IGQxNTUxZmIuLjU1MDkyYWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVNZXNzYWdlRm9yd2FyZFRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlTWVzc2FnZUZvcndhcmRUZXN0LmphdmEKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgICAgICAud2l0aENvbmZpZyhjIC0+IGMud2l0aChGZWF0dXJlLkdPU1NJUCwgRmVhdHVyZS5ORVRXT1JLKSkKICAgICAgICAgLndpdGhCdWlsZGVyKGIgLT4gYi53aXRoUmFja3MobnVtRENzLCAxLCBub2Rlc1BlckRjKSkKICAgICAgICAgLm5vZGVzKG51bURDcyAqIG5vZGVzUGVyRGMpCi0gICAgICAgIC5zaW5nbGVVcGdyYWRlKHYzMCkKKyAgICAgICAgLnVwZ3JhZGVzVG9DdXJyZW50RnJvbSh2NDApCiAgICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJBTFRFUiBLRVlTUEFDRSAiICsgS0VZU1BBQ0UgKwogICAgICAgICAgICAgICAgICIgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAiICsgbnRzQXJncyArICIgfTsiKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVSZWFkUmVwYWlyRGVsZXRlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVJlYWRSZXBhaXJEZWxldGVUZXN0LmphdmEKaW5kZXggMDE5NTVjNS4uZTYwMzc3OCAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVJlYWRSZXBhaXJEZWxldGVUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVJlYWRSZXBhaXJEZWxldGVUZXN0LmphdmEKQEAgLTQ2LDcgKzQ2LDggQEAKICAgICAgICAgYWxsVXBncmFkZXMoMiwgMSkKICAgICAgICAgLnNldHVwKGNsdXN0ZXIgLT4gewogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2Uod2l0aEtleXNwYWNlKCJDUkVBVEUgVEFCTEUgJXMudCAoayBpbnQsIGMgaW50LCB2IGludCwgcyBpbnQgc3RhdGljLCBQUklNQVJZIEtFWSAoaywgYykpIikpOwotCisgICAgICAgIH0pCisgICAgICAgIC5ydW5CZWZvcmVDbHVzdGVyVXBncmFkZShjbHVzdGVyIC0+IHsKICAgICAgICAgICAgIC8vIGluc2VydCB0aGUgcm93cyBpbiBhbGwgdGhlIG5vZGVzCiAgICAgICAgICAgICBTdHJpbmcgaW5zZXJ0ID0gd2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50IChrLCBjLCB2LCBzKSBWQUxVRVMgKD8sID8sID8sID8pIik7CiAgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoaW5zZXJ0LCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgcm93MSk7CkBAIC04NSw3ICs4Niw4IEBACiAgICAgICAgIGFsbFVwZ3JhZGVzKDIsIDEpCiAgICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnQgKGsgaW50LCBjIGludCwgdiBpbnQsIHMgaW50IHN0YXRpYywgUFJJTUFSWSBLRVkgKGssIGMpKSIpKTsKLQorICAgICAgICB9KQorICAgICAgICAucnVuQmVmb3JlQ2x1c3RlclVwZ3JhZGUoY2x1c3RlciAtPiB7CiAgICAgICAgICAgICAvLyBpbnNlcnQgaGFsZiBwYXJ0aXRpb24gaW4gZWFjaCBub2RlCiAgICAgICAgICAgICBTdHJpbmcgaW5zZXJ0ID0gd2l0aEtleXNwYWNlKCJJTlNFUlQgSU5UTyAlcy50IChrLCBjLCB2LCBzKSBWQUxVRVMgKD8sID8sID8sID8pIik7CiAgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoaW5zZXJ0LCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgcGFydGl0aW9uMVswXSk7CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlUmVhZFJlcGFpcldyaXRlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVJlYWRSZXBhaXJXcml0ZVRlc3QuamF2YQppbmRleCBmY2IwNDgyLi40OTY2ZTVjIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlUmVhZFJlcGFpcldyaXRlVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVSZWFkUmVwYWlyV3JpdGVUZXN0LmphdmEKQEAgLTQ1LDYgKzQ1LDcgQEAKIAogICAgICAgICBhbGxVcGdyYWRlcygyLCAxKQogICAgICAgICAuc2V0dXAoYyAtPiBjLnNjaGVtYUNoYW5nZSh3aXRoS2V5c3BhY2UoIkNSRUFURSBUQUJMRSAlcy50IChrIGludCwgYyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAoaywgYykpIikpKQorICAgICAgICAucnVuQmVmb3JlQ2x1c3RlclVwZ3JhZGUoY2x1c3RlciAtPiBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJUUlVOQ0FURSAlcy50IiksIENvbnNpc3RlbmN5TGV2ZWwuQUxMKSkKICAgICAgICAgLnJ1bkFmdGVyQ2x1c3RlclVwZ3JhZGUoY2x1c3RlciAtPiB7CiAKICAgICAgICAgICAgIC8vIGluc2VydCByb3dzIGludGVybmFsbHkgaW4gZWFjaCBub2RlCkBAIC03Nyw3ICs3OCw4IEBACiAgICAgICAgIGFsbFVwZ3JhZGVzKDIsIDEpCiAgICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnQgKGsgaW50LCBjIGludCwgdiBpbnQsIFBSSU1BUlkgS0VZIChrLCBjKSkiKSk7Ci0KKyAgICAgICAgfSkKKyAgICAgICAgLnJ1bkJlZm9yZUNsdXN0ZXJVcGdyYWRlKGNsdXN0ZXIgLT4gewogICAgICAgICAgICAgLy8gaW5zZXJ0IHRoZSBpbml0aWFsIHZlcnNpb24gb2YgdGhlIHJvd3MgaW4gYWxsIHRoZSBub2RlcwogICAgICAgICAgICAgU3RyaW5nIGluc2VydCA9IHdpdGhLZXlzcGFjZSgiSU5TRVJUIElOVE8gJXMudCAoaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIpOwogICAgICAgICAgICAgY2x1c3Rlci5jb29yZGluYXRvcigxKS5leGVjdXRlKGluc2VydCwgQ29uc2lzdGVuY3lMZXZlbC5BTEwsIHJvdzEpOwpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVJlYWRUZXN0LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlUmVhZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiY2ZmMC4uMDAwMDAwMAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlUmVhZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXBncmFkZTsKLQotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJbnZva2FibGVJbnN0YW5jZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXMuR29zc2lwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2Fzc2FuZHJhVmVyc2lvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlJlYWREaWdlc3RDb25zaXN0ZW5jeVRlc3QuQ1JFQVRFX1RBQkxFOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0LlJlYWREaWdlc3RDb25zaXN0ZW5jeVRlc3QuaW5zZXJ0RGF0YTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudGVzdC5SZWFkRGlnZXN0Q29uc2lzdGVuY3lUZXN0LnRlc3REaWdlc3RDb25zaXN0ZW5jeTsKLQotcHVibGljIGNsYXNzIE1peGVkTW9kZVJlYWRUZXN0IGV4dGVuZHMgVXBncmFkZVRlc3RCYXNlCi17Ci0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBtaXhlZE1vZGVSZWFkQ29sdW1uU3Vic2V0RGlnZXN0Q2hlY2soKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBuZXcgVGVzdENhc2UoKQotICAgICAgICAud2l0aENvbmZpZyhjIC0+IGMud2l0aChGZWF0dXJlLkdPU1NJUCwgRmVhdHVyZS5ORVRXT1JLKSkKLSAgICAgICAgLm5vZGVzKDIpCi0gICAgICAgIC5ub2Rlc1RvVXBncmFkZSgxKQotICAgICAgICAvLyBhbGwgdXBncmFkZXMgZnJvbSB2MzAgdXAsIGV4Y2x1ZGluZyB2MzAtPnYzWCBhbmQgZnJvbSB2NDAKLSAgICAgICAgLnNpbmdsZVVwZ3JhZGUodjMwKQotICAgICAgICAuc2luZ2xlVXBncmFkZSh2M1gpCi0gICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKLSAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKENSRUFURV9UQUJMRSk7Ci0gICAgICAgICAgICBpbnNlcnREYXRhKGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkpOwotICAgICAgICAgICAgdGVzdERpZ2VzdENvbnNpc3RlbmN5KGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkpOwotICAgICAgICAgICAgdGVzdERpZ2VzdENvbnNpc3RlbmN5KGNsdXN0ZXIuY29vcmRpbmF0b3IoMikpOwotICAgICAgICB9KQotICAgICAgICAucnVuQWZ0ZXJDbHVzdGVyVXBncmFkZShjbHVzdGVyIC0+IHsKLSAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gbGV0IGdvc3NpcCBzZXR0bGUgb3IgdGhlIHRlc3Qgd2lsbCBmYWlsCi0gICAgICAgICAgICBpbnQgYXR0ZW1wdHMgPSAxOwotICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29udmVydDJNZXRob2RSZWYKLSAgICAgICAgICAgIHdoaWxlICghKChJSW52b2thYmxlSW5zdGFuY2UpIGNsdXN0ZXIuZ2V0KDEpKS5jYWxsT25JbnN0YW5jZSgoKSAtPiBHb3NzaXBlci5pbnN0YW5jZS5pc1VwZ3JhZGluZ0Zyb21WZXJzaW9uTG93ZXJUaGFuKENhc3NhbmRyYVZlcnNpb24uQ0FTU0FORFJBXzRfMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFHb3NzaXBlci5pbnN0YW5jZS5pc1VwZ3JhZGluZ0Zyb21WZXJzaW9uTG93ZXJUaGFuKG5ldyBDYXNzYW5kcmFWZXJzaW9uKCgiMy4wIikpLmZhbWlseUxvd2VyQm91bmQuZ2V0KCkpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdHMrKyA+IDkwKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiR29zc2lwZXIuaW5zdGFuY2UuaGF2ZU1ham9yVmVyc2lvbjNOb2RlcygpIGNvbnRpbnVhbGx5IHJldHVybnMgZmFsc2UgZGVzcGl0ZSBleHBlY3RpbmcgdG8gYmUgdHJ1ZSIpOwotICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBjYXVzZSBhIGRpc2dlc3QgbWlzbWF0Y2ggaW4gbWl4ZWQgbW9kZQotICAgICAgICAgICAgdGVzdERpZ2VzdENvbnNpc3RlbmN5KGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkpOwotICAgICAgICAgICAgdGVzdERpZ2VzdENvbnNpc3RlbmN5KGNsdXN0ZXIuY29vcmRpbmF0b3IoMikpOwotICAgICAgICB9KQotICAgICAgICAucnVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVJlcGFpclRlc3QuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVSZXBhaXJUZXN0LmphdmEKaW5kZXggODEzZDlmMi4uNmUyMmJlNSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVJlcGFpclRlc3QuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlUmVwYWlyVGVzdC5qYXZhCkBAIC01NCw3ICs1NCw3IEBACiAgICAgICAgIG5ldyBVcGdyYWRlVGVzdEJhc2UuVGVzdENhc2UoKQogICAgICAgICAubm9kZXMoMikKICAgICAgICAgLm5vZGVzVG9VcGdyYWRlKFVQR1JBREVEX05PREUpCi0gICAgICAgIC5zaW5nbGVVcGdyYWRlKHYzWCkKKyAgICAgICAgLnVwZ3JhZGVzVG9DdXJyZW50RnJvbSh2NDApCiAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiBjb25maWcud2l0aChORVRXT1JLLCBHT1NTSVApKQogICAgICAgICAuc2V0dXAoY2x1c3RlciAtPiB7CiAgICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZShDUkVBVEVfVEFCTEUpOwpAQCAtNzgsMzkgKzc4LDUxIEBACiAgICAgICAgICAgICAgICAgY2x1c3Rlci5nZXQoMikuZmx1c2goS0VZU1BBQ0UpOwogCiAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBvZiByZXBhaXJpbmcgdGhlIHVwZ3JhZGVkIG5vZGUgdGhlIHJlcGFpciBzaG91bGQgYmUgcmVqZWN0ZWQgd2l0aCBhIGRlY3JpcHRpdmUgZXJyb3IgaW4gYm90aAotICAgICAgICAgICAgICAgIC8vIG5vZGV0b29sIG91dHB1dCBhbmQgbG9ncyAoc2VlIENBU1NBTkRSQS0xMzk0NCkKLSAgICAgICAgICAgICAgICBpZiAocmVwYWlyZWROb2RlID09IFVQR1JBREVEX05PREUpCisgICAgICAgICAgICAgICAgLy8gbm9kZXRvb2wgb3V0cHV0IGFuZCBsb2dzIChzZWUgQ0FTU0FORFJBLTEzOTQ0KSwgaWYgTWVzc2FnaW5nU2VydmljZS5jdXJyZW50VmVyc2lvbiBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAgIGlmIChjbHVzdGVyLmdldCgxKS5nZXRNZXNzYWdpbmdWZXJzaW9uKCkgIT0gY2x1c3Rlci5nZXQoMikuZ2V0TWVzc2FnaW5nVmVyc2lvbigpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9ICJSZXBhaXIgaXMgbm90IHN1cHBvcnRlZCBpbiBtaXhlZCBtYWpvciB2ZXJzaW9uIGNsdXN0ZXJzIjsKLSAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5nZXQocmVwYWlyZWROb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLS1mdWxsIiwgS0VZU1BBQ0UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuYXNzZXJ0cygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAuZXJyb3JDb250YWlucyhlcnJvck1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRMb2dIYXMoY2x1c3RlciwgcmVwYWlyZWROb2RlLCBlcnJvck1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVwYWlyZWROb2RlID09IFVQR1JBREVEX05PREUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlcGFpciBpcyBvbmx5IG5vdCBzdXBwb3J0ZWQgd2hlbiBNZXNzYWdpbmdTZXJ2aWNlLmN1cnJlbnRfdmVyc2lvbiBkb24ndCBtYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGJ1dCB3ZSBrZWVwIHRoZSBlcnJvciBtZXNzYWdlIHNpbXBsZSBhbmQgdXNlci1mYWNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSAiUmVwYWlyIGlzIG5vdCBzdXBwb3J0ZWQgaW4gbWl4ZWQgbWFqb3IgdmVyc2lvbiBjbHVzdGVycyI7CisgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLmdldChyZXBhaXJlZE5vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLS1mdWxsIiwgS0VZU1BBQ0UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFzc2VydHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lcnJvckNvbnRhaW5zKGVycm9yTWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRMb2dIYXMoY2x1c3RlciwgcmVwYWlyZWROb2RlLCBlcnJvck1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBub2RlIGlzc3VpbmcgdGhlIHJlcGFpciBpcyB0aGUgbm90IHVwZGF0ZWQgbm9kZSB3ZSBkb24ndCBoYXZlIHNwZWNpZmljIGVycm9yIG1hbmFnZW1lbnQsCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHRoZSByZXBhaXIgd2lsbCBwcm9kdWNlIGEgZmFpbHVyZSBpbiB0aGUgdXBncmFkZWQgbm9kZSwgYW5kIGl0IHdpbGwgdGFrZSBvbmUgaG91ciB0byB0aW1lIG91dCBpbgorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm90IHVwZ3JhZGVkIG5vZGUuIFNpbmNlIHdlIGRvbid0IHdhbnQgdG8gd2FpdCB0aGF0IGxvbmcsIHdlIG9ubHkgd2FpdCBhIGZldyBzZWNvbmRzIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVwYWlyIGJlZm9yZSB2ZXJpZnlpbmcgdGhlICJ1bmtub3duIHZlcmIgaWQiIGVycm9yIGluIHRoZSB1cGdyYWRlZCBub2RlLgorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElVcGdyYWRlYWJsZUluc3RhbmNlIGluc3RhbmNlID0gY2x1c3Rlci5nZXQocmVwYWlyZWROb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZS5zdXBwbHlBc3luYygoKSAtPiBpbnN0YW5jZS5ub2RldG9vbFJlc3VsdCgicmVwYWlyIiwgIi0tZnVsbCIsIEtFWVNQQUNFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoMTAsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIlJlcGFpciBpbiB0aGUgbm90IHVwZ3JhZGVkIG5vZGUgc2hvdWxkIGhhdmUgdGltZWQgb3V0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGltZW91dEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydExvZ0hhcyhjbHVzdGVyLCBVUEdSQURFRF9OT0RFLCAidW5leHBlY3RlZCBleGNlcHRpb24gY2F1Z2h0IHdoaWxlIHByb2Nlc3NpbmcgaW5ib3VuZCBtZXNzYWdlcyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydExvZ0hhcyhjbHVzdGVyLCBVUEdSQURFRF9OT0RFLCAiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjogVW5rbm93biB2ZXJiIGlkIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgcHJldmlvdXMgZmFpbGVkIHJlcGFpciBoYXNuJ3QgcmVwYWlyZWQgdGhlIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhjbHVzdGVyLmdldCgxKS5leGVjdXRlSW50ZXJuYWwoU0VMRUNULCBrZXkpLCByb3cxKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhjbHVzdGVyLmdldCgyKS5leGVjdXRlSW50ZXJuYWwoU0VMRUNULCBrZXkpLCByb3cyKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXNzdWluZyB0aGUgcmVwYWlyIGlzIHRoZSBub3QgdXBkYXRlZCBub2RlIHdlIGRvbid0IGhhdmUgc3BlY2lmaWMgZXJyb3IgbWFuYWdlbWVudCwKLSAgICAgICAgICAgICAgICAvLyBzbyB0aGUgcmVwYWlyIHdpbGwgcHJvZHVjZSBhIGZhaWx1cmUgaW4gdGhlIHVwZ3JhZGVkIG5vZGUsIGFuZCBpdCB3aWxsIHRha2Ugb25lIGhvdXIgdG8gdGltZSBvdXQgaW4KLSAgICAgICAgICAgICAgICAvLyB0aGUgbm90IHVwZ3JhZGVkIG5vZGUuIFNpbmNlIHdlIGRvbid0IHdhbnQgdG8gd2FpdCB0aGF0IGxvbmcsIHdlIG9ubHkgd2FpdCBhIGZldyBzZWNvbmRzIGZvciB0aGUKLSAgICAgICAgICAgICAgICAvLyByZXBhaXIgYmVmb3JlIHZlcmlmeWluZyB0aGUgInVua25vd24gdmVyYiBpZCIgZXJyb3IgaW4gdGhlIHVwZ3JhZGVkIG5vZGUuCiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIElVcGdyYWRlYWJsZUluc3RhbmNlIGluc3RhbmNlID0gY2x1c3Rlci5nZXQocmVwYWlyZWROb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlLnN1cHBseUFzeW5jKCgpIC0+IGluc3RhbmNlLm5vZGV0b29sUmVzdWx0KCJyZXBhaXIiLCAiLS1mdWxsIiwgS0VZU1BBQ0UpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoIlJlcGFpciBpbiB0aGUgbm90IHVwZ3JhZGVkIG5vZGUgc2hvdWxkIGhhdmUgdGltZWQgb3V0Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TG9nSGFzKGNsdXN0ZXIsIFVQR1JBREVEX05PREUsICJ1bmV4cGVjdGVkIGV4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgcHJvY2Vzc2luZyBpbmJvdW5kIG1lc3NhZ2VzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRMb2dIYXMoY2x1c3RlciwgVVBHUkFERURfTk9ERSwgImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb246IFVua25vd24gdmVyYiBpZCIpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KHJlcGFpcmVkTm9kZSkubm9kZXRvb2xSZXN1bHQoInJlcGFpciIsICItLWZ1bGwiLCBLRVlTUEFDRSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSB0aGF0IHRoZSByZXBhaXIgcmVwYWlyZWQgdGhlIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhjbHVzdGVyLmdldCgxKS5leGVjdXRlSW50ZXJuYWwoU0VMRUNULCBrZXkpLCByb3cxLCByb3cyKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhjbHVzdGVyLmdldCgyKS5leGVjdXRlSW50ZXJuYWwoU0VMRUNULCBrZXkpLCByb3cxLCByb3cyKTsKICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCB0aGUgcHJldmlvdXMgZmFpbGVkIHJlcGFpciBoYXNuJ3QgcmVwYWlyZWQgdGhlIGRhdGEKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGNsdXN0ZXIuZ2V0KDEpLmV4ZWN1dGVJbnRlcm5hbChTRUxFQ1QsIGtleSksIHJvdzEpOwotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoY2x1c3Rlci5nZXQoMikuZXhlY3V0ZUludGVybmFsKFNFTEVDVCwga2V5KSwgcm93Mik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pCiAgICAgICAgIC5ydW4oKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVSZXBsaWNhdGlvblRlc3RCYXNlLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlUmVwbGljYXRpb25UZXN0QmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjJkYTdhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9NaXhlZE1vZGVSZXBsaWNhdGlvblRlc3RCYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnVwZ3JhZGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgY29tLnZkdXJtb250LnNlbXZlcjRqLlNlbXZlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5Bc3NlcnRVdGlscy5hc3NlcnRSb3dzOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQXNzZXJ0VXRpbHMucm93OwotCi0vKioKLSAqIEEgYmFzZSBjbGFzcyBmb3IgdGVzdGluZyBiYXNpYyByZXBsaWNhdGlvbiBvbiBtaXhlZC12ZXJzaW9uIGNsdXN0ZXJzLgotICovCi1wdWJsaWMgY2xhc3MgTWl4ZWRNb2RlUmVwbGljYXRpb25UZXN0QmFzZSBleHRlbmRzIFVwZ3JhZGVUZXN0QmFzZQotewotICAgIHByb3RlY3RlZCB2b2lkIHRlc3RTaW1wbGVTdHJhdGVneShTZW12ZXIgZnJvbSkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgdGVzdFNpbXBsZVN0cmF0ZWd5KGZyb20sIFVwZ3JhZGVUZXN0QmFzZS5DVVJSRU5UKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0U2ltcGxlU3RyYXRlZ3koU2VtdmVyIGZyb20sIFNlbXZlciB0bykgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgU3RyaW5nIGluc2VydCA9ICJJTlNFUlQgSU5UTyB0ZXN0X3NpbXBsZS5uYW1lcyAoa2V5LCBuYW1lKSBWQUxVRVMgKD8sID8pIjsKLSAgICAgICAgU3RyaW5nIHNlbGVjdCA9ICJTRUxFQ1QgKiBGUk9NIHRlc3Rfc2ltcGxlLm5hbWVzIFdIRVJFIGtleSA9ID8iOwotCi0gICAgICAgIG5ldyBUZXN0Q2FzZSgpCi0gICAgICAgIC5ub2RlcygzKQotICAgICAgICAubm9kZXNUb1VwZ3JhZGUoMSwgMikKLSAgICAgICAgLnVwZ3JhZGVzKGZyb20sIHRvKQotICAgICAgICAuc2V0dXAoY2x1c3RlciAtPiB7Ci0gICAgICAgICAgICBjbHVzdGVyLnNjaGVtYUNoYW5nZSgiQ1JFQVRFIEtFWVNQQUNFIHRlc3Rfc2ltcGxlIFdJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6IDJ9OyIpOwotICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBUQUJMRSB0ZXN0X3NpbXBsZS5uYW1lcyAoa2V5IGludCBQUklNQVJZIEtFWSwgbmFtZSB0ZXh0KSIpOwotICAgICAgICB9KQotICAgICAgICAucnVuQWZ0ZXJOb2RlVXBncmFkZSgoY2x1c3RlciwgdXBncmFkZWQpIC0+IHsKLSAgICAgICAgICAgIExpc3Q8TG9uZz4gaW5pdGlhbFRva2VucyA9IG5ldyBBcnJheUxpc3Q8PihjbHVzdGVyLnNpemUoKSArIDEpOwotICAgICAgICAgICAgaW5pdGlhbFRva2Vucy5hZGQobnVsbCk7IC8vIFRoZSBmaXJzdCB2YWxpZCB0b2tlbiBpcyBhdCAxIHRvIGF2b2lkIG9mZnNldCBtYXRoIGJlbG93LgotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBjbHVzdGVyLnNpemUoKTsgaSsrKQotICAgICAgICAgICAgICAgIGluaXRpYWxUb2tlbnMuYWRkKExvbmcudmFsdWVPZihjbHVzdGVyLmdldChpKS5jb25maWcoKS5nZXQoImluaXRpYWxfdG9rZW4iKS50b1N0cmluZygpKSk7Ci0KLSAgICAgICAgICAgIExpc3Q8TG9uZz4gdmFsaWRUb2tlbnMgPSBpbml0aWFsVG9rZW5zLnN1Ykxpc3QoMSwgY2x1c3Rlci5zaXplKCkgKyAxKTsKLQotICAgICAgICAgICAgLy8gRXhlcmNpc2UgYWxsIHRoZSBjb29yZGluYXRvcnMuLi4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IGNsdXN0ZXIuc2l6ZSgpOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gLi4uYW5kIHNhbXBsZSBlbm91Z2gga2V5cyB0aGF0IHdlIGNvdmVyIHRoZSByaW5nLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBrZXkgPSBqICsgKGkgKiAxMCk7Ci0gICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHJvdyA9IHJvdyhrZXksICJOZXJvIik7Ci0gICAgICAgICAgICAgICAgICAgIExvbmcgdG9rZW4gPSB0b2tlbkZyb20oa2V5KTsKLQotICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKGkpLmV4ZWN1dGUoaW5zZXJ0LCBDb25zaXN0ZW5jeUxldmVsLkFMTCwgcm93KTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgbm9kZSA9IHByaW1hcnlSZXBsaWNhKHZhbGlkVG9rZW5zLCB0b2tlbik7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoY2x1c3Rlci5nZXQobm9kZSkuZXhlY3V0ZUludGVybmFsKHNlbGVjdCwga2V5KSwgcm93KTsKLQotICAgICAgICAgICAgICAgICAgICBub2RlID0gbmV4dE5vZGUobm9kZSwgY2x1c3Rlci5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGNsdXN0ZXIuZ2V0KG5vZGUpLmV4ZWN1dGVJbnRlcm5hbChzZWxlY3QsIGtleSksIHJvdyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gQXQgUkY9MiwgdGhpcyBub2RlIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgd3JpdGUuCi0gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXh0Tm9kZShub2RlLCBjbHVzdGVyLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoY2x1c3Rlci5nZXQobm9kZSkuZXhlY3V0ZUludGVybmFsKHNlbGVjdCwga2V5KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KQotICAgICAgICAucnVuKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVdyaXRldGltZU9yVFRMVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL01peGVkTW9kZVdyaXRldGltZU9yVFRMVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NWZmZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvTWl4ZWRNb2RlV3JpdGV0aW1lT3JUVExUZXN0LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXBncmFkZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JQ29vcmRpbmF0b3I7CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbC5BTEw7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5Bc3NlcnRVdGlscy5hc3NlcnRSb3dzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuQXNzZXJ0VXRpbHMucm93OworCisvKioKKyAqIFRlc3RzIHRoZSBDUUwgZnVuY3Rpb25zIHtAY29kZSB3cml0ZXRpbWV9LCB7QGNvZGUgbWF4d3JpdGV0aW1lfSBhbmQge0Bjb2RlIHR0bH0gb24gcm9sbGluZyB1cGdyYWRlLgorICoKKyAqIHtAY29kZSB3cml0ZXRpbWV9IGFuZCB7QGNvZGUgdHRsfSBvbiBzaW5nbGUtY2VsbCBjb2x1bW5zIGlzIGFsd2F5cyBzdXBwb3J0ZWQsIGV2ZW4gaW4gbWl4ZWQgY2x1c3RlcnMuCisgKiB7QGNvZGUgd3JpdGV0aW1lfSBhbmQge0Bjb2RlIHR0bH0gb24gbXVsdGktY2VsbCBjb2x1bW5zIGlzIG5vdCBzdXBwb3J0ZWQgaW4gY29vcmRpbmF0b3Igbm9kZXMgPCA0LjIuCisgKiB7QGNvZGUgbWF4d3JpdGV0aW1lfSBpcyBub3Qgc3VwcG9ydGVkIGluIGNvb3JkaW5hdG9yIG5vZGVzIDwgNC4yLgorICovCitwdWJsaWMgY2xhc3MgTWl4ZWRNb2RlV3JpdGV0aW1lT3JUVExUZXN0IGV4dGVuZHMgVXBncmFkZVRlc3RCYXNlCit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGV0aW1lT3JUVExEdXJpbmdVcGdyYWRlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgbmV3IFRlc3RDYXNlKCkKKyAgICAgICAgLm5vZGVzKDIpCisgICAgICAgIC5ub2Rlc1RvVXBncmFkZU9yZGVyZWQoMSwgMikKKyAgICAgICAgLnVwZ3JhZGVzVG9DdXJyZW50RnJvbSh2MzApCisgICAgICAgIC5zZXR1cChjbHVzdGVyIC0+IHsKKworICAgICAgICAgICAgSUNvb3JkaW5hdG9yIGNvb3JkaW5hdG9yID0gY2x1c3Rlci5jb29yZGluYXRvcigxKTsKKyAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKHdpdGhLZXlzcGFjZSgiQ1JFQVRFIFRBQkxFICVzLnQgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGludCwgcyBzZXQ8aW50PiwgZnMgZnJvemVuPHNldDxpbnQ+PikiKSk7CisgICAgICAgICAgICBjb29yZGluYXRvci5leGVjdXRlKHdpdGhLZXlzcGFjZSgiSU5TRVJUIElOVE8gJXMudCAoaywgdiwgcywgZnMpIFZBTFVFUyAoMCwgMCwgezAsIDF9LCB7MCwgMSwgMiwgM30pIFVTSU5HIFRJTUVTVEFNUCAxIEFORCBUVEwgMTAwMCIpLCBBTEwpOworICAgICAgICAgICAgY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlVQREFURSAlcy50IFVTSU5HIFRJTUVTVEFNUCAyIEFORCBUVEwgMjAwMCBTRVQgdiA9IDEsIHMgPSBzICsgezIsIDN9IFdIRVJFIGsgPSAwIiksIEFMTCk7CisKKyAgICAgICAgICAgIGFzc2VydFByZTQyQmVoYXZpb3VyKGNsdXN0ZXIuY29vcmRpbmF0b3IoMSkpOworICAgICAgICAgICAgYXNzZXJ0UHJlNDJCZWhhdmlvdXIoY2x1c3Rlci5jb29yZGluYXRvcigyKSk7CisgICAgICAgIH0pCisgICAgICAgIC5ydW5BZnRlck5vZGVVcGdyYWRlKChjbHVzdGVyLCBub2RlKSAtPiB7CisgICAgICAgICAgICBpZiAobm9kZSA9PSAxKSAvLyBvbmx5IG5vZGUxIGlzIHVwZ3JhZGVkLCBhbmQgdGhlIGNsdXN0ZXIgaXMgaW4gbWl4ZWQgbW9kZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydFBvc3Q0MkJlaGF2aW91cihjbHVzdGVyLmNvb3JkaW5hdG9yKDEpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRQcmU0MkJlaGF2aW91cihjbHVzdGVyLmNvb3JkaW5hdG9yKDIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLy8gYm90aCBub2RlcyBoYXZlIGJlZW4gdXBncmFkZWQsIGFuZCB0aGUgY2x1c3RlciBpc24ndCBpbiBtaXhlZCBtb2RlIGFueW1vcmUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRQb3N0NDJCZWhhdmlvdXIoY2x1c3Rlci5jb29yZGluYXRvcigxKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0UG9zdDQyQmVoYXZpb3VyKGNsdXN0ZXIuY29vcmRpbmF0b3IoMikpOworICAgICAgICAgICAgfQorICAgICAgICB9KQorICAgICAgICAucnVuKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFByZTQyQmVoYXZpb3VyKElDb29yZGluYXRvciBjb29yZGluYXRvcikKKyAgICB7CisgICAgICAgIC8vIHJlZ3VsYXIgY29sdW1uLCBzdXBwb3J0ZWQgZXhjZXB0IGZvciBtYXh3cml0ZXRpbWUKKyAgICAgICAgYXNzZXJ0Um93cyhjb29yZGluYXRvci5leGVjdXRlKHdpdGhLZXlzcGFjZSgiU0VMRUNUIHdyaXRldGltZSh2KSBGUk9NICVzLnQiKSwgQUxMKSwgcm93KDJMKSk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGNvb3JkaW5hdG9yLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJTRUxFQ1QgbWF4d3JpdGV0aW1lKHYpIEZST00gJXMudCIpLCBBTEwpKQorICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJVbmtub3duIGZ1bmN0aW9uICdtYXh3cml0ZXRpbWUnIik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCgoSW50ZWdlcikgY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCB0dGwodikgRlJPTSAlcy50IiksIEFMTClbMF1bMF0pCisgICAgICAgICAgICAgICAgICAuaXNMZXNzVGhhbk9yRXF1YWxUbygyMDAwKS5pc0dyZWF0ZXJUaGFuKDIwMDAgLSAzMDApOyAvLyBtYXJnaW4gb2YgZXJyb3Igb2YgNSBtaW51dGVzIHNpbmNlIFRUTHMgZGVjcmVhc2UKKworICAgICAgICAvLyBmcm96ZW4gY29sbGVjdGlvbiwgc3VwcG9ydGVkIGV4Y2VwdCBmb3IgbWF4d3JpdGV0aW1lCisgICAgICAgIGFzc2VydFJvd3MoY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCB3cml0ZXRpbWUoZnMpIEZST00gJXMudCIpLCBBTEwpLCByb3coMUwpKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCBtYXh3cml0ZXRpbWUoZnMpIEZST00gJXMudCIpLCBBTEwpKQorICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJVbmtub3duIGZ1bmN0aW9uICdtYXh3cml0ZXRpbWUnIik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCgoSW50ZWdlcikgY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCB0dGwoZnMpIEZST00gJXMudCIpLCBBTEwpWzBdWzBdKQorICAgICAgICAgICAgICAgICAgLmlzTGVzc1RoYW5PckVxdWFsVG8oMTAwMCkuaXNHcmVhdGVyVGhhbigxMDAwIC0gMzAwKTsgLy8gbWFyZ2luIG9mIGVycm9yIG9mIDUgbWludXRlcyBzaW5jZSBUVExzIGRlY3JlYXNlCisKKyAgICAgICAgLy8gbm90LWZyb3plbiBjb2xsZWN0aW9uLCBub3Qgc3VwcG9ydGVkCisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGNvb3JkaW5hdG9yLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJTRUxFQ1Qgd3JpdGV0aW1lKHMpIEZST00gJXMudCIpLCBBTEwpKQorICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJDYW5ub3QgdXNlIHNlbGVjdGlvbiBmdW5jdGlvbiB3cml0ZVRpbWUgb24gbm9uLWZyb3plbiBjb2xsZWN0aW9uIHMiKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCBtYXh3cml0ZXRpbWUocykgRlJPTSAlcy50IiksIEFMTCkpCisgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIlVua25vd24gZnVuY3Rpb24gJ21heHdyaXRldGltZSciKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCB0dGwocykgRlJPTSAlcy50IiksIEFMTCkpCisgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIkNhbm5vdCB1c2Ugc2VsZWN0aW9uIGZ1bmN0aW9uIHR0bCBvbiBub24tZnJvemVuIGNvbGxlY3Rpb24gcyIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQb3N0NDJCZWhhdmlvdXIoSUNvb3JkaW5hdG9yIGNvb3JkaW5hdG9yKQorICAgIHsKKyAgICAgICAgLy8gcmVndWxhciBjb2x1bW4sIGZ1bGx5IHN1cHBvcnRlZAorICAgICAgICBhc3NlcnRSb3dzKGNvb3JkaW5hdG9yLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJTRUxFQ1Qgd3JpdGV0aW1lKHYpIEZST00gJXMudCIpLCBBTEwpLCByb3coMkwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhjb29yZGluYXRvci5leGVjdXRlKHdpdGhLZXlzcGFjZSgiU0VMRUNUIG1heHdyaXRldGltZSh2KSBGUk9NICVzLnQiKSwgQUxMKSwgcm93KDJMKSk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCgoSW50ZWdlcikgY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCB0dGwodikgRlJPTSAlcy50IiksIEFMTClbMF1bMF0pCisgICAgICAgICAgICAgICAgICAuaXNMZXNzVGhhbk9yRXF1YWxUbygyMDAwKS5pc0dyZWF0ZXJUaGFuKDIwMDAgLSAzMDApOyAvLyBtYXJnaW4gb2YgZXJyb3Igb2YgNSBtaW51dGVzIHNpbmNlIFRUTHMgZGVjcmVhc2UKKworICAgICAgICAvLyBmcm96ZW4gY29sbGVjdGlvbiwgZnVsbHkgc3VwcG9ydGVkCisgICAgICAgIGFzc2VydFJvd3MoY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCB3cml0ZXRpbWUoZnMpIEZST00gJXMudCIpLCBBTEwpLCByb3coMUwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhjb29yZGluYXRvci5leGVjdXRlKHdpdGhLZXlzcGFjZSgiU0VMRUNUIG1heHdyaXRldGltZShmcykgRlJPTSAlcy50IiksIEFMTCksIHJvdygxTCkpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoKEludGVnZXIpIGNvb3JkaW5hdG9yLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJTRUxFQ1QgdHRsKGZzKSBGUk9NICVzLnQiKSwgQUxMKVswXVswXSkKKyAgICAgICAgICAgICAgICAgIC5pc0xlc3NUaGFuT3JFcXVhbFRvKDEwMDApLmlzR3JlYXRlclRoYW4oMTAwMCAtIDMwMCk7IC8vIG1hcmdpbiBvZiBlcnJvciBvZiA1IG1pbnV0ZXMgc2luY2UgVFRMcyBkZWNyZWFzZQorCisgICAgICAgIC8vIG5vdC1mcm96ZW4gY29sbGVjdGlvbiwgZnVsbHkgc3VwcG9ydGVkCisgICAgICAgIGFzc2VydFJvd3MoY29vcmRpbmF0b3IuZXhlY3V0ZSh3aXRoS2V5c3BhY2UoIlNFTEVDVCB3cml0ZXRpbWUocykgRlJPTSAlcy50IiksIEFMTCksIHJvdyhBcnJheXMuYXNMaXN0KDFMLCAxTCwgMkwsIDJMKSkpOworICAgICAgICBhc3NlcnRSb3dzKGNvb3JkaW5hdG9yLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJTRUxFQ1QgbWF4d3JpdGV0aW1lKHMpIEZST00gJXMudCIpLCBBTEwpLCByb3coMkwpKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGNvb3JkaW5hdG9yLmV4ZWN1dGUod2l0aEtleXNwYWNlKCJTRUxFQ1QgdHRsKHMpIEZST00gJXMudCIpLCBBTEwpWzBdWzBdKQorICAgICAgICAgICAgICAgICAgLm1hdGNoZXMobCAtPiBsIGluc3RhbmNlb2YgTGlzdCAmJiAoKExpc3Q8Pz4pIGwpLnNpemUoKSA9PSA0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvUHJlNDBNZXNzYWdlRmlsdGVyVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL1ByZTQwTWVzc2FnZUZpbHRlclRlc3QuamF2YQppbmRleCA0Y2NhN2I5Li45MDMwZmRjIDEwMDY0NAotLS0gYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvUHJlNDBNZXNzYWdlRmlsdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9QcmU0ME1lc3NhZ2VGaWx0ZXJUZXN0LmphdmEKQEAgLTM0LDkgKzM0LDcgQEAKICAgICAgICAgLm5vZGVzKDIpCiAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZ0NvbnN1bWVyKQogICAgICAgICAubm9kZXNUb1VwZ3JhZGUoMSkKLSAgICAgICAgLy8gYWxsIHVwZ3JhZGVzIGZyb20gdjMwIHVwLCBleGNsdWRpbmcgdjMwLT52M1gKLSAgICAgICAgLnNpbmdsZVVwZ3JhZGUodjMwKQotICAgICAgICAudXBncmFkZXNGcm9tKHYzWCkKKyAgICAgICAgLnVwZ3JhZGVzVG9DdXJyZW50RnJvbSh2NDApCiAgICAgICAgIC5zZXR1cCgoY2x1c3RlcikgLT4gewogICAgICAgICAgICAgY2x1c3Rlci5maWx0ZXJzKCkub3V0Ym91bmQoKS5hbGxWZXJicygpLm1lc3NhZ2VzTWF0Y2hpbmcoKGYsdCxtKSAtPiBmYWxzZSkuZHJvcCgpOwogICAgICAgICAgICAgY2x1c3Rlci5zY2hlbWFDaGFuZ2UoIkNSRUFURSBUQUJMRSAiICsgS0VZU1BBQ0UgKyAiLnRibCAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9VcGdyYWRlVGVzdC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL1VwZ3JhZGVUZXN0LmphdmEKaW5kZXggYjE2OTJiOS4uNTVlMWYxZSAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL1VwZ3JhZGVUZXN0LmphdmEKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL1VwZ3JhZGVUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5Db25zaXN0ZW5jeUxldmVsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5GZWF0dXJlOworCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5Bc3NlcnRVdGlscy4qOwogCiBwdWJsaWMgY2xhc3MgVXBncmFkZVRlc3QgZXh0ZW5kcyBVcGdyYWRlVGVzdEJhc2UKQEAgLTMzLDcgKzM0LDcgQEAKICAgICAgICAgLm5vZGVzKDIpCiAgICAgICAgIC5ub2Rlc1RvVXBncmFkZSgxKQogICAgICAgICAud2l0aENvbmZpZygoY2ZnKSAtPiBjZmcud2l0aChGZWF0dXJlLk5FVFdPUkssIEZlYXR1cmUuR09TU0lQKSkKLSAgICAgICAgLnVwZ3JhZGVzRnJvbSh2M1gpCisgICAgICAgIC51cGdyYWRlc1RvQ3VycmVudEZyb20odjNYKQogICAgICAgICAuc2V0dXAoKGNsdXN0ZXIpIC0+IHsKICAgICAgICAgICAgIGNsdXN0ZXIuc2NoZW1hQ2hhbmdlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50YmwgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CiAgICAgICAgICAgICBjbHVzdGVyLmNvb3JkaW5hdG9yKDEpLmV4ZWN1dGUoIklOU0VSVCBJTlRPICIgKyBLRVlTUEFDRSArICIudGJsIChwaywgY2ssIHYpIFZBTFVFUyAoMSwgMSwgMSkiLCBDb25zaXN0ZW5jeUxldmVsLkFMTCk7CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvVXBncmFkZVRlc3RCYXNlLmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3VwZ3JhZGUvVXBncmFkZVRlc3RCYXNlLmphdmEKaW5kZXggNWMzMmZjZC4uZTQ0ZWNjNyAxMDA2NDQKLS0tIGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91cGdyYWRlL1VwZ3JhZGVUZXN0QmFzZS5qYXZhCisrKyBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXBncmFkZS9VcGdyYWRlVGVzdEJhc2UuamF2YQpAQCAtMTksMTcgKzE5LDIyIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnVwZ3JhZGU7CiAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5OYXZpZ2FibGVTZXQ7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OwogaW1wb3J0IGNvbS52ZHVybW9udC5zZW12ZXI0ai5TZW12ZXI7CiBpbXBvcnQgY29tLnZkdXJtb250LnNlbXZlcjRqLlNlbXZlci5TZW12ZXJUeXBlOwogCiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKQEAgLTQ0LDEwICs0OSwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5UaHJvd2luZ1J1bm5hYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5WZXJzaW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlNpbXBsZUdyYXBoOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5WZXJzaW9ucy5WZXJzaW9uOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuVmVyc2lvbnMuZmluZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2ltcGxlR3JhcGguc29ydGVkVmVydGljZXM7CiAKIHB1YmxpYyBjbGFzcyBVcGdyYWRlVGVzdEJhc2UgZXh0ZW5kcyBEaXN0cmlidXRlZFRlc3RCYXNlCiB7CkBAIC01Niw4ICs2Miw3IEBACiAgICAgQEFmdGVyCiAgICAgcHVibGljIHZvaWQgYWZ0ZXJFYWNoKCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5ydW5GaW5hbGl6YXRpb24oKTsKLSAgICAgICAgU3lzdGVtLmdjKCk7CisgICAgICAgIHRyaWdnZXJHQygpOwogICAgIH0KIAogICAgIEBCZWZvcmVDbGFzcwpAQCAtODYsMjcgKzkxLDU4IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZW12ZXIgdjNYID0gbmV3IFNlbXZlcigiMy4xMS4wIiwgU2VtdmVyVHlwZS5MT09TRSk7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZW12ZXIgdjQwID0gbmV3IFNlbXZlcigiNC4wLWFscGhhMSIsIFNlbXZlclR5cGUuTE9PU0UpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2VtdmVyIHY0MSA9IG5ldyBTZW12ZXIoIjQuMS1hbHBoYTEiLCBTZW12ZXJUeXBlLkxPT1NFKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNlbXZlciB2NTAgPSBuZXcgU2VtdmVyKCI1LjAtYWxwaGExIiwgU2VtdmVyVHlwZS5MT09TRSk7CiAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExpc3Q8UGFpcjxTZW12ZXIsU2VtdmVyPj4gU1VQUE9SVEVEX1VQR1JBREVfUEFUSFMgPSBJbW11dGFibGVMaXN0Lm9mKAotICAgICAgICBQYWlyLmNyZWF0ZSh2MzAsIHYzWCksCi0gICAgICAgIFBhaXIuY3JlYXRlKHYzMCwgdjQwKSwKLSAgICAgICAgUGFpci5jcmVhdGUodjMwLCB2NDEpLAotICAgICAgICBQYWlyLmNyZWF0ZSh2M1gsIHY0MCksCi0gICAgICAgIFBhaXIuY3JlYXRlKHYzWCwgdjQxKSwKLSAgICAgICAgUGFpci5jcmVhdGUodjQwLCB2NDEpKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFNpbXBsZUdyYXBoPFNlbXZlcj4gU1VQUE9SVEVEX1VQR1JBREVfUEFUSFMgPSBuZXcgU2ltcGxlR3JhcGguQnVpbGRlcjxTZW12ZXI+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2MzAsIHYzWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2MzAsIHY0MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2MzAsIHY0MSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2M1gsIHY0MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2M1gsIHY0MSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2NDAsIHY0MSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2NDAsIHY1MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRWRnZSh2NDEsIHY1MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKIAogICAgIC8vIHRoZSBsYXN0IGlzIGFsd2F5cyB0aGUgY3VycmVudAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU2VtdmVyIENVUlJFTlQgPSBTVVBQT1JURURfVVBHUkFERV9QQVRIUy5nZXQoU1VQUE9SVEVEX1VQR1JBREVfUEFUSFMuc2l6ZSgpIC0gMSkucmlnaHQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZW12ZXIgQ1VSUkVOVCA9IFNpbXBsZUdyYXBoLm1heChTVVBQT1JURURfVVBHUkFERV9QQVRIUyk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZW12ZXIgT0xERVNUID0gU2ltcGxlR3JhcGgubWluKFNVUFBPUlRFRF9VUEdSQURFX1BBVEhTKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFZlcnNpb25zCiAgICAgewogICAgICAgICBmaW5hbCBWZXJzaW9uIGluaXRpYWw7Ci0gICAgICAgIGZpbmFsIFZlcnNpb24gdXBncmFkZTsKKyAgICAgICAgZmluYWwgTGlzdDxWZXJzaW9uPiB1cGdyYWRlOworICAgICAgICBmaW5hbCBMaXN0PFNlbXZlcj4gdXBncmFkZVZlcnNpb25zOwogCi0gICAgICAgIHB1YmxpYyBUZXN0VmVyc2lvbnMoVmVyc2lvbiBpbml0aWFsLCBWZXJzaW9uIHVwZ3JhZGUpCisgICAgICAgIHB1YmxpYyBUZXN0VmVyc2lvbnMoVmVyc2lvbiBpbml0aWFsLCBMaXN0PFZlcnNpb24+IHVwZ3JhZGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMuaW5pdGlhbCA9IGluaXRpYWw7CiAgICAgICAgICAgICB0aGlzLnVwZ3JhZGUgPSB1cGdyYWRlOworICAgICAgICAgICAgdGhpcy51cGdyYWRlVmVyc2lvbnMgPSB1cGdyYWRlLnN0cmVhbSgpLm1hcCh2IC0+IHYudmVyc2lvbikuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHJldHVybiB0cnVlOworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgVGVzdFZlcnNpb25zIHRoYXQgPSAoVGVzdFZlcnNpb25zKSBvOworICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKGluaXRpYWwudmVyc2lvbiwgdGhhdC5pbml0aWFsLnZlcnNpb24pICYmIE9iamVjdHMuZXF1YWxzKHVwZ3JhZGVWZXJzaW9ucywgdGhhdC51cGdyYWRlVmVyc2lvbnMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKGluaXRpYWwudmVyc2lvbiwgdXBncmFkZVZlcnNpb25zKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoaW5pdGlhbC52ZXJzaW9uKS5hcHBlbmQoIiAtPiAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh1cGdyYWRlVmVyc2lvbnMpOworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExOCw2ICsxNTQsNyBAQAogICAgICAgICBwcml2YXRlIFJ1bk9uQ2x1c3RlciBzZXR1cDsKICAgICAgICAgcHJpdmF0ZSBSdW5PbkNsdXN0ZXJBbmROb2RlIHJ1bkJlZm9yZU5vZGVSZXN0YXJ0OwogICAgICAgICBwcml2YXRlIFJ1bk9uQ2x1c3RlckFuZE5vZGUgcnVuQWZ0ZXJOb2RlVXBncmFkZTsKKyAgICAgICAgcHJpdmF0ZSBSdW5PbkNsdXN0ZXIgcnVuQmVmb3JlQ2x1c3RlclVwZ3JhZGU7CiAgICAgICAgIHByaXZhdGUgUnVuT25DbHVzdGVyIHJ1bkFmdGVyQ2x1c3RlclVwZ3JhZGU7CiAgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PEludGVnZXI+IG5vZGVzVG9VcGdyYWRlID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOwogICAgICAgICBwcml2YXRlIENvbnN1bWVyPElJbnN0YW5jZUNvbmZpZz4gY29uZmlnQ29uc3VtZXI7CkBAIC0xMzksMjkgKzE3Niw4MCBAQAogICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgIH0KIAotICAgICAgICAvKiogcGVyZm9ybXMgYWxsIHN1cHBvcnRlZCB1cGdyYWRlIHBhdGhzIHRoYXQgZXhpc3QgaW4gYmV0d2VlbiBmcm9tIGFuZCBDVVJSRU5UIChpbmNsdXNpdmUpICoqLwotICAgICAgICBwdWJsaWMgVGVzdENhc2UgdXBncmFkZXNGcm9tKFNlbXZlciBmcm9tKQorICAgICAgICAvKiogcGVyZm9ybXMgYWxsIHN1cHBvcnRlZCB1cGdyYWRlIHBhdGhzIHRoYXQgZXhpc3QgaW4gYmV0d2VlbiBmcm9tIGFuZCBlbmQgb24gQ1VSUkVOVCAoaW5jbHVzaXZlKQorICAgICAgICAgKiB7QGNvZGUgdXBncmFkZXNUb0N1cnJlbnRGcm9tKDMuMCk7IC8vIHByb2R1Y2VzOiAzLjAgLT4gQ1VSUkVOVCwgMy4xMSAtPiBDVVJSRU5ULCDigKZ9CisgICAgICAgICAqKi8KKyAgICAgICAgcHVibGljIFRlc3RDYXNlIHVwZ3JhZGVzVG9DdXJyZW50RnJvbShTZW12ZXIgZnJvbSkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHVwZ3JhZGVzKGZyb20sIENVUlJFTlQpOworICAgICAgICAgICAgcmV0dXJuIHVwZ3JhZGVzVG8oZnJvbSwgQ1VSUkVOVCk7CiAgICAgICAgIH0KIAotICAgICAgICAvKiogcGVyZm9ybXMgYWxsIHN1cHBvcnRlZCB1cGdyYWRlIHBhdGhzIHRoYXQgZXhpc3QgaW4gYmV0d2VlbiBmcm9tIGFuZCB0byAoaW5jbHVzaXZlKSAqKi8KLSAgICAgICAgcHVibGljIFRlc3RDYXNlIHVwZ3JhZGVzKFNlbXZlciBmcm9tLCBTZW12ZXIgdG8pCisgICAgICAgIC8qKgorICAgICAgICAgKiBwZXJmb3JtcyBhbGwgc3VwcG9ydGVkIHVwZ3JhZGUgcGF0aHMgdG8gdGhlICJ0byIgdGFyZ2V0OyBleGFtcGxlCisgICAgICAgICAqIHtAY29kZSB1cGdyYWRlc1RvKDMuMCwgNC4wKTsgLy8gcHJvZHVjZXM6IDMuMCAtPiA0LjAsIDMuMTEgLT4gNC4wfQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFRlc3RDYXNlIHVwZ3JhZGVzVG8oU2VtdmVyIGZyb20sIFNlbXZlciB0bykKICAgICAgICAgewotICAgICAgICAgICAgU1VQUE9SVEVEX1VQR1JBREVfUEFUSFMuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAuZmlsdGVyKHVwZ3JhZGVQYXRoIC0+ICh1cGdyYWRlUGF0aC5sZWZ0LmNvbXBhcmVUbyhmcm9tKSA+PSAwICYmIHVwZ3JhZGVQYXRoLnJpZ2h0LmNvbXBhcmVUbyh0bykgPD0gMCkpCi0gICAgICAgICAgICAgICAgLmZvckVhY2hPcmRlcmVkKHVwZ3JhZGVQYXRoIC0+Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZ3JhZGUuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZXN0VmVyc2lvbnModmVyc2lvbnMuZ2V0TGF0ZXN0KHVwZ3JhZGVQYXRoLmxlZnQpLCB2ZXJzaW9ucy5nZXRMYXRlc3QodXBncmFkZVBhdGgucmlnaHQpKSk7Ci0gICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBMaXN0PFRlc3RWZXJzaW9ucz4gdXBncmFkZSA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgTmF2aWdhYmxlU2V0PFNlbXZlcj4gdmVydGljZXMgPSBzb3J0ZWRWZXJ0aWNlcyhTVVBQT1JURURfVVBHUkFERV9QQVRIUyk7CisgICAgICAgICAgICBmb3IgKFNlbXZlciBzdGFydCA6IHZlcnRpY2VzLnN1YlNldChmcm9tLCB0cnVlLCB0bywgZmFsc2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIG9ubHkgaW5jbHVkZSBwYWlycyB0aGF0IGFyZSBhbGxvd2VkLCBhbmQgc3RhcnQgb3IgZW5kIG9uIENVUlJFTlQKKyAgICAgICAgICAgICAgICBpZiAoU1VQUE9SVEVEX1VQR1JBREVfUEFUSFMuaGFzRWRnZShzdGFydCwgdG8pICYmIGNvbnRhaW5zKHN0YXJ0LCB0bywgQ1VSUkVOVCkpCisgICAgICAgICAgICAgICAgICAgIHVwZ3JhZGUuYWRkKG5ldyBUZXN0VmVyc2lvbnModmVyc2lvbnMuZ2V0TGF0ZXN0KHN0YXJ0KSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh2ZXJzaW9ucy5nZXRMYXRlc3QodG8pKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkFkZGluZyB1cGdyYWRlcyBvZlxue30iLCB1cGdyYWRlLnN0cmVhbSgpLm1hcChUZXN0VmVyc2lvbnM6OnRvU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiXG4iKSkpOworICAgICAgICAgICAgdGhpcy51cGdyYWRlLmFkZEFsbCh1cGdyYWRlKTsKICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICB9CiAKLSAgICAgICAgLyoqIFdpbGwgdGVzdCB0aGlzIHNwZWNpZmljIHVwZ3JhZGUgcGF0aCAqKi8KLSAgICAgICAgcHVibGljIFRlc3RDYXNlIHNpbmdsZVVwZ3JhZGUoU2VtdmVyIGZyb20pCisgICAgICAgIC8qKgorICAgICAgICAgKiBwZXJmb3JtcyBhbGwgc3VwcG9ydGVkIHVwZ3JhZGUgcGF0aHMgZnJvbSB0aGUgImZyb20iIHRhcmdldDsgZXhhbXBsZQorICAgICAgICAgKiB7QGNvZGUgdXBncmFkZXNGcm9tKDQuMCwgNC4yKTsgLy8gcHJvZHVjZXM6IDQuMCAtPiA0LjEsIDQuMCAtPiA0LjJ9CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVGVzdENhc2UgdXBncmFkZXNGcm9tKFNlbXZlciBmcm9tLCBTZW12ZXIgdG8pCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMudXBncmFkZS5hZGQobmV3IFRlc3RWZXJzaW9ucyh2ZXJzaW9ucy5nZXRMYXRlc3QoZnJvbSksIHZlcnNpb25zLmdldExhdGVzdChDVVJSRU5UKSkpOworICAgICAgICAgICAgTGlzdDxUZXN0VmVyc2lvbnM+IHVwZ3JhZGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIE5hdmlnYWJsZVNldDxTZW12ZXI+IHZlcnRpY2VzID0gc29ydGVkVmVydGljZXMoU1VQUE9SVEVEX1VQR1JBREVfUEFUSFMpOworICAgICAgICAgICAgZm9yIChTZW12ZXIgZW5kIDogdmVydGljZXMuc3ViU2V0KGZyb20sIGZhbHNlLCB0bywgdHJ1ZSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gb25seSBpbmNsdWRlIHBhaXJzIHRoYXQgYXJlIGFsbG93ZWQsIGFuZCBzdGFydCBvciBlbmQgb24gQ1VSUkVOVAorICAgICAgICAgICAgICAgIGlmIChTVVBQT1JURURfVVBHUkFERV9QQVRIUy5oYXNFZGdlKGZyb20sIGVuZCkgJiYgY29udGFpbnMoZnJvbSwgZW5kLCBDVVJSRU5UKSkKKyAgICAgICAgICAgICAgICAgICAgdXBncmFkZS5hZGQobmV3IFRlc3RWZXJzaW9ucyh2ZXJzaW9ucy5nZXRMYXRlc3QoZnJvbSksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QodmVyc2lvbnMuZ2V0TGF0ZXN0KGVuZCkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiQWRkaW5nIHVwZ3JhZGVzIG9mXG57fSIsIHVwZ3JhZGUuc3RyZWFtKCkubWFwKFRlc3RWZXJzaW9uczo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCJcbiIpKSk7CisgICAgICAgICAgICB0aGlzLnVwZ3JhZGUuYWRkQWxsKHVwZ3JhZGUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogcGVyZm9ybXMgYWxsIHN1cHBvcnRlZCB1cGdyYWRlIHBhdGhzIHRoYXQgZXhpc3QgaW4gYmV0d2VlbiBmcm9tIGFuZCB0byB0aGF0IGluY2x1ZGUgdGhlIGN1cnJlbnQgdmVyc2lvbi4KKyAgICAgICAgICogVGhpcyBjYWxsIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB7QGNvZGUgdXBncmFkZXNUbyhmcm9tLCBDVVJSRU5UKS51cGdyYWRlc0Zyb20oQ1VSUkVOVCwgdG8pfS4KKyAgICAgICAgICoqLworICAgICAgICBwdWJsaWMgVGVzdENhc2UgdXBncmFkZXMoU2VtdmVyIGZyb20sIFNlbXZlciB0bykKKyAgICAgICAgeworICAgICAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlVuYWJsZSB0byBkbyB1cGdyYWRlcygiICsgZnJvbSArICIsICIgKyB0byArICIpOyBkb2VzIG5vdCBjb250YWluIENVUlJFTlQ9IiArIENVUlJFTlQsIGNvbnRhaW5zKGZyb20sIHRvLCBDVVJSRU5UKSk7CisgICAgICAgICAgICBpZiAoZnJvbS5jb21wYXJlVG8oQ1VSUkVOVCkgPCAwKQorICAgICAgICAgICAgICAgIHVwZ3JhZGVzVG8oZnJvbSwgQ1VSUkVOVCk7CisgICAgICAgICAgICBpZiAoQ1VSUkVOVC5jb21wYXJlVG8odG8pIDwgMCkKKyAgICAgICAgICAgICAgICB1cGdyYWRlc0Zyb20oQ1VSUkVOVCwgdG8pOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKFNlbXZlciBmcm9tLCBTZW12ZXIgdG8sIFNlbXZlciB0YXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRhcmdldCA+PSBmcm9tICYmIHRhcmdldCA8PSB0bworICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5jb21wYXJlVG8oZnJvbSkgPj0gMCAmJiB0YXJnZXQuY29tcGFyZVRvKHRvKSA8PSAwOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFdpbGwgdGVzdCB0aGlzIHNwZWNpZmljIHVwZ3JhZGUgcGF0aCAqKi8KKyAgICAgICAgcHVibGljIFRlc3RDYXNlIHNpbmdsZVVwZ3JhZGVUb0N1cnJlbnRGcm9tKFNlbXZlciBmcm9tKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIVNVUFBPUlRFRF9VUEdSQURFX1BBVEhTLmhhc0VkZ2UoZnJvbSwgQ1VSUkVOVCkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVcGdyYWRpbmcgZnJvbSAiICsgZnJvbSArICIgdG8gIiArIENVUlJFTlQgKyAiIGlzbid0IGRpcmVjdGx5IHN1cHBvcnRlZCBhbmQgbXVzdCBnbyB0aHJvdWdoIG90aGVyIHZlcnNpb25zIGZpcnN0OyBzdXBwb3J0ZWQgcGF0aHM6ICIgKyBTVVBQT1JURURfVVBHUkFERV9QQVRIUy5maW5kUGF0aHMoZnJvbSwgQ1VSUkVOVCkpOworICAgICAgICAgICAgVGVzdFZlcnNpb25zIHRlc3RzID0gbmV3IFRlc3RWZXJzaW9ucyh0aGlzLnZlcnNpb25zLmdldExhdGVzdChmcm9tKSwgQXJyYXlzLmFzTGlzdCh0aGlzLnZlcnNpb25zLmdldExhdGVzdChDVVJSRU5UKSkpOworICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkFkZGluZyB1cGdyYWRlIG9mIHt9IiwgdGVzdHMpOworICAgICAgICAgICAgdGhpcy51cGdyYWRlLmFkZCh0ZXN0cyk7CiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCkBAIC0xODMsNiArMjcxLDEyIEBACiAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBUZXN0Q2FzZSBydW5CZWZvcmVDbHVzdGVyVXBncmFkZShSdW5PbkNsdXN0ZXIgcnVuQmVmb3JlQ2x1c3RlclVwZ3JhZGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucnVuQmVmb3JlQ2x1c3RlclVwZ3JhZGUgPSBydW5CZWZvcmVDbHVzdGVyVXBncmFkZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIFRlc3RDYXNlIHJ1bkFmdGVyQ2x1c3RlclVwZ3JhZGUoUnVuT25DbHVzdGVyIHJ1bkFmdGVyQ2x1c3RlclVwZ3JhZGUpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMucnVuQWZ0ZXJDbHVzdGVyVXBncmFkZSA9IHJ1bkFmdGVyQ2x1c3RlclVwZ3JhZGU7CkBAIC0yMTEsNiArMzA1LDggQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKICAgICAgICAgICAgIGlmIChydW5CZWZvcmVOb2RlUmVzdGFydCA9PSBudWxsKQogICAgICAgICAgICAgICAgIHJ1bkJlZm9yZU5vZGVSZXN0YXJ0ID0gKGMsIG4pIC0+IHt9OworICAgICAgICAgICAgaWYgKHJ1bkJlZm9yZUNsdXN0ZXJVcGdyYWRlID09IG51bGwpCisgICAgICAgICAgICAgICAgcnVuQmVmb3JlQ2x1c3RlclVwZ3JhZGUgPSAoYykgLT4ge307CiAgICAgICAgICAgICBpZiAocnVuQWZ0ZXJDbHVzdGVyVXBncmFkZSA9PSBudWxsKQogICAgICAgICAgICAgICAgIHJ1bkFmdGVyQ2x1c3RlclVwZ3JhZGUgPSAoYykgLT4ge307CiAgICAgICAgICAgICBpZiAocnVuQWZ0ZXJOb2RlVXBncmFkZSA9PSBudWxsKQpAQCAtMjE5LDI2ICszMTUsNDQgQEAKICAgICAgICAgICAgICAgICBmb3IgKGludCBuID0gMTsgbiA8PSBub2RlQ291bnQ7IG4rKykKICAgICAgICAgICAgICAgICAgICAgbm9kZXNUb1VwZ3JhZGUuYWRkKG4pOwogCisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKICAgICAgICAgICAgIGZvciAoVGVzdFZlcnNpb25zIHVwZ3JhZGUgOiB0aGlzLnVwZ3JhZGUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oInRlc3RpbmcgdXBncmFkZSBmcm9tIHt9IHRvIHt9IiwgdXBncmFkZS5pbml0aWFsLnZlcnNpb24sIHVwZ3JhZGUudXBncmFkZS52ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygidGVzdGluZyB1cGdyYWRlIGZyb20ge30gdG8ge30iLCB1cGdyYWRlLmluaXRpYWwudmVyc2lvbiwgdXBncmFkZS51cGdyYWRlVmVyc2lvbnMpOwogICAgICAgICAgICAgICAgIHRyeSAoVXBncmFkZWFibGVDbHVzdGVyIGNsdXN0ZXIgPSBpbml0KFVwZ3JhZGVhYmxlQ2x1c3Rlci5jcmVhdGUobm9kZUNvdW50LCB1cGdyYWRlLmluaXRpYWwsIGNvbmZpZ0NvbnN1bWVyLCBidWlsZGVyQ29uc3VtZXIpKSkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIHNldHVwLnJ1bihjbHVzdGVyKTsKIAotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBuIDogbm9kZXNUb1VwZ3JhZGUpCisgICAgICAgICAgICAgICAgICAgIGZvciAoVmVyc2lvbiBuZXh0VmVyc2lvbiA6IHVwZ3JhZGUudXBncmFkZSkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5nZXQobikuc2h1dGRvd24oKS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KG4pLnNldFZlcnNpb24odXBncmFkZS51cGdyYWRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJlZm9yZU5vZGVSZXN0YXJ0LnJ1bihjbHVzdGVyLCBuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KG4pLnN0YXJ0dXAoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkFmdGVyTm9kZVVwZ3JhZGUucnVuKGNsdXN0ZXIsIG4pOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWZvcmVDbHVzdGVyVXBncmFkZS5ydW4oY2x1c3Rlcik7CiAKLSAgICAgICAgICAgICAgICAgICAgcnVuQWZ0ZXJDbHVzdGVyVXBncmFkZS5ydW4oY2x1c3Rlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgbiA6IG5vZGVzVG9VcGdyYWRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5nZXQobikuc2h1dGRvd24oKS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlckdDKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KG4pLnNldFZlcnNpb24obmV4dFZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5CZWZvcmVOb2RlUmVzdGFydC5ydW4oY2x1c3Rlciwgbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIuZ2V0KG4pLnN0YXJ0dXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQWZ0ZXJOb2RlVXBncmFkZS5ydW4oY2x1c3Rlciwgbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuQWZ0ZXJDbHVzdGVyVXBncmFkZS5ydW4oY2x1c3Rlcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLmNoZWNrQW5kUmVzZXRVbmNhdWdodEV4Y2VwdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoU3RyaW5nLmZvcm1hdCgiRXJyb3IgaW4gdGVzdCAnJXMnIHdoaWxlIHVwZ3JhZGluZyB0byAnJXMnOyBzdWNjZXNzZnVsIHVwZ3JhZGVzICVzIiwgdXBncmFkZSwgbmV4dFZlcnNpb24udmVyc2lvbiwgdGhpcy51cGdyYWRlLnN0cmVhbSgpLmxpbWl0KG9mZnNldCkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSksIHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9mZnNldCsrOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKICAgICAgICAgcHVibGljIFRlc3RDYXNlIG5vZGVzVG9VcGdyYWRlKGludCAuLi4gbm9kZXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIFNldDxJbnRlZ2VyPiBzZXQgPSBuZXcgSGFzaFNldDw+KG5vZGVzLmxlbmd0aCk7CkBAIC0yNjAsMTAgKzM3NCwxNiBAQAogICAgICAgICB9CiAgICAgIH0KIAorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdHJpZ2dlckdDKCkKKyAgICB7CisgICAgICAgIFN5c3RlbS5ydW5GaW5hbGl6YXRpb24oKTsKKyAgICAgICAgU3lzdGVtLmdjKCk7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIFRlc3RDYXNlIGFsbFVwZ3JhZGVzKGludCBub2RlcywgaW50Li4uIHRvVXBncmFkZSkKICAgICB7CiAgICAgICAgIHJldHVybiBuZXcgVGVzdENhc2UoKS5ub2Rlcyhub2RlcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZ3JhZGVzRnJvbSh2MzApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51cGdyYWRlc1RvQ3VycmVudEZyb20odjMwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubm9kZXNUb1VwZ3JhZGUodG9VcGdyYWRlKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXRpbC9Db29yZGluYXRvcnMuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXRpbC9Db29yZGluYXRvcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDI2ZTYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL0Nvb3JkaW5hdG9ycy5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLkNvbnNpc3RlbmN5TGV2ZWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklDb29yZGluYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuU2ltcGxlUXVlcnlSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CisKK3B1YmxpYyBjbGFzcyBDb29yZGluYXRvcnMKK3sKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdpdGhUcmFjZQorICAgIHsKKyAgICAgICAgcHVibGljIGZpbmFsIFNpbXBsZVF1ZXJ5UmVzdWx0IHJlc3VsdCwgdHJhY2U7CisKKyAgICAgICAgcHVibGljIFdpdGhUcmFjZShTaW1wbGVRdWVyeVJlc3VsdCByZXN1bHQsIFNpbXBsZVF1ZXJ5UmVzdWx0IHRyYWNlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgIHRoaXMudHJhY2UgPSB0cmFjZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgV2l0aFRyYWNlIHdpdGhUcmFjaW5nKElDb29yZGluYXRvciBjb29yZGluYXRvciwgU3RyaW5nIHF1ZXJ5LCBDb25zaXN0ZW5jeUxldmVsIGNvbnNpc3RlbmN5TGV2ZWwsIE9iamVjdC4uLiBib3VuZFZhbHVlcykKKyAgICB0aHJvd3MgV2l0aFRyYWNlRXhjZXB0aW9uCisgICAgeworICAgICAgICBVVUlEIHNlc3Npb24gPSBUaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVBc1VVSUQoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFNpbXBsZVF1ZXJ5UmVzdWx0IHJlc3VsdCA9IGNvb3JkaW5hdG9yLmV4ZWN1dGVXaXRoVHJhY2luZ1dpdGhSZXN1bHQoc2Vzc2lvbiwgcXVlcnksIGNvbnNpc3RlbmN5TGV2ZWwsIGJvdW5kVmFsdWVzKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV2l0aFRyYWNlKHJlc3VsdCwgZ2V0VHJhY2UoY29vcmRpbmF0b3IsIHNlc3Npb24pKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXaXRoVHJhY2VFeGNlcHRpb24odCwgZ2V0VHJhY2UoY29vcmRpbmF0b3IsIHNlc3Npb24pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2ltcGxlUXVlcnlSZXN1bHQgZ2V0VHJhY2UoSUNvb3JkaW5hdG9yIGNvb3JkaW5hdG9yLCBVVUlEIHNlc3Npb24pCisgICAgeworICAgICAgICByZXR1cm4gY29vcmRpbmF0b3IuZXhlY3V0ZVdpdGhSZXN1bHQoIlNFTEVDVCAqIEZST00gc3lzdGVtX3RyYWNlcy5ldmVudHMgV0hFUkUgc2Vzc2lvbl9pZD0/IiwgQ29uc2lzdGVuY3lMZXZlbC5MT0NBTF9RVU9SVU0sIHNlc3Npb24pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2l0aFRyYWNlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHVibGljIGZpbmFsIFNpbXBsZVF1ZXJ5UmVzdWx0IHRyYWNlOworCisgICAgICAgIHB1YmxpYyBXaXRoVHJhY2VFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlLCBTaW1wbGVRdWVyeVJlc3VsdCB0cmFjZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoY2F1c2UpOworICAgICAgICAgICAgdGhpcy50cmFjZSA9IHRyYWNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL1F1ZXJ5UmVzdWx0VXRpbC5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL1F1ZXJ5UmVzdWx0VXRpbC5qYXZhCmluZGV4IGE1MDJlOGMuLjIzZDg4ZTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXRpbC9RdWVyeVJlc3VsdFV0aWwuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3V0aWwvUXVlcnlSZXN1bHRVdGlsLmphdmEKQEAgLTE3LDExICsxNywxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnV0aWw7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKIAogaW1wb3J0IGNvbS5nb29nbGUubW9uaXRvcmluZy5ydW50aW1lLmluc3RydW1lbnRhdGlvbi5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLlF1ZXJ5UmVzdWx0czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuUm93OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5TaW1wbGVRdWVyeVJlc3VsdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5ub2RldG9vbC5mb3JtYXR0ZXIuVGFibGVCdWlsZGVyOwpAQCAtMzMsNiArMzYsMzggQEAKICAgICB7CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG9yZGVyQnkoU2ltcGxlUXVlcnlSZXN1bHQgcXIsIFN0cmluZy4uLiBjb2x1bW5zKQorICAgIHsKKyAgICAgICAgaWYgKGNvbHVtbnMgPT0gbnVsbCB8fCBjb2x1bW5zLmxlbmd0aCA9PSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gY29sdW1ucyBkZWZpbmVkIik7CisgICAgICAgIGludFtdIGluZGV4ID0gbmV3IGludFtjb2x1bW5zLmxlbmd0aF07CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IGNvbHVtbnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IHFyLm5hbWVzKCkuaW5kZXhPZihuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4ID09IC0xKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNvbHVtbiAiICsgbmFtZSk7CisgICAgICAgICAgICAgICAgaW5kZXhbb2Zmc2V0KytdID0gaWR4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHFyLnJlc2V0KCk7CisgICAgICAgIEFycmF5cy5zb3J0KHFyLnRvT2JqZWN0QXJyYXlzKCksIChhLCBiKSAtPiB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGV4Lmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBpbmRleFtpXTsKKyAgICAgICAgICAgICAgICBPYmplY3QgYW8gPSBhW2lkeF07CisgICAgICAgICAgICAgICAgT2JqZWN0IGJvID0gYltpZHhdOworICAgICAgICAgICAgICAgIGlmIChhbyA9PSBudWxsICYmIGJvID09IG51bGwpIHJldHVybiAwOworICAgICAgICAgICAgICAgIGlmIChhbyA9PSBudWxsKSByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBpZiAoYm8gPT0gbnVsbCkgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGludCByYyA9ICgoQ29tcGFyYWJsZSkgYW8pLmNvbXBhcmVUbyhibyk7CisgICAgICAgICAgICAgICAgaWYgKHJjICE9IDApIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9KTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoU2ltcGxlUXVlcnlSZXN1bHQgcXIsIE9iamVjdC4uLiB2YWx1ZXMpCiAgICAgewogICAgICAgICByZXR1cm4gY29udGFpbnMocXIsIGEgLT4gZXF1YWxzKGEsIHZhbHVlcykpOwpAQCAtMTAwLDYgKzEzNSwxMSBAQAogICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIFF1ZXJ5QnVpbGRlciBxdWVyeShTaW1wbGVRdWVyeVJlc3VsdCByZXN1bHQpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5QnVpbGRlcihyZXN1bHQpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm93QXNzZXJ0SGVscGVyCiAgICAgewogICAgICAgICBwcml2YXRlIGZpbmFsIFJvdyByb3c7CkBAIC0xODQsNCArMjI0LDczIEBACiAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc2l6ZSkuZGVzY3JpYmVkQXMoIlF1ZXJ5UmVzdWx0IGlzIG5vdCBlbXB0eSIpLmlzRXF1YWxUbygwKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUXVlcnlCdWlsZGVyCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIFNpbXBsZVF1ZXJ5UmVzdWx0IGlucHV0OworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBwcml2YXRlIFByZWRpY2F0ZTxSb3c+IGZpbHRlciA9IGlnbm9yZSAtPiB0cnVlOworCisgICAgICAgIHB1YmxpYyBRdWVyeUJ1aWxkZXIoU2ltcGxlUXVlcnlSZXN1bHQgaW5wdXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBRdWVyeUJ1aWxkZXIgc2VsZWN0KFN0cmluZy4uLiBuYW1lcykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghaW5wdXQubmFtZXMoKS5jb250YWlucyhuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBjb2x1bW4gIiArIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5uYW1lcy5jbGVhcigpOworICAgICAgICAgICAgLy8gaWYgbmFtZXMgaXMgZW1wdHksIHRoZW4gdGhpcyBiZWNvbWVzICJTRUxFQ1QgKiIKKyAgICAgICAgICAgIHRoaXMubmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QobmFtZXMpKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFF1ZXJ5QnVpbGRlciBmaWx0ZXIoUHJlZGljYXRlPFJvdz4gZm4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gZm47CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTaW1wbGVRdWVyeVJlc3VsdCBidWlsZCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFF1ZXJ5UmVzdWx0cy5CdWlsZGVyIGJ1aWxkZXIgPSBRdWVyeVJlc3VsdHMuYnVpbGRlcigpOworICAgICAgICAgICAgaWYgKG5hbWVzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmNvbHVtbnMoaW5wdXQubmFtZXMoKS50b0FycmF5KG5ldyBTdHJpbmdbMF0pKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5wdXQuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUm93IHJvdyA9IGlucHV0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci50ZXN0KHJvdykpCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnJvdyhyb3cudG9PYmplY3RBcnJheSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gbmFtZXMgPSB0aGlzLm5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5jb2x1bW5zKG5hbWVzKTsKKyAgICAgICAgICAgICAgICBpbnRbXSBpbmRleCA9IG5ldyBpbnRbbmFtZXMubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFtvZmZzZXQrK10gPSBpbnB1dC5uYW1lcygpLmluZGV4T2YobmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFJvdyByb3cgPSBuZXcgUm93KG5hbWVzKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5wdXQuaGFzTmV4dCgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gcmF3ID0gaW5wdXQubmV4dCgpLnRvT2JqZWN0QXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gdXBkYXRlZCA9IG5ldyBPYmplY3RbaW5kZXgubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleC5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRbaV0gPSByYXdbaW5kZXhbaV1dOworICAgICAgICAgICAgICAgICAgICByb3cuc2V0UmVzdWx0cyh1cGRhdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci50ZXN0KHJvdykpCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnJvdyh1cGRhdGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL1NpbmdsZUhvc3RMb2FkQmFsYW5jaW5nUG9saWN5LmphdmEgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3V0aWwvU2luZ2xlSG9zdExvYWRCYWxhbmNpbmdQb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOThiYWFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL1NpbmdsZUhvc3RMb2FkQmFsYW5jaW5nUG9saWN5LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXRpbDsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmF0b3JzOworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXI7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkhvc3Q7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkhvc3REaXN0YW5jZTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU3RhdGVtZW50OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5wb2xpY2llcy5Mb2FkQmFsYW5jaW5nUG9saWN5OworCisvKioKKyAqIEEgQ1FMIGRyaXZlciB7QGxpbmsgTG9hZEJhbGFuY2luZ1BvbGljeX0gdGhhdCBvbmx5IGNvbm5lY3RzIHRvIGEgZml4ZWQgaG9zdC4KKyAqLworcHVibGljIGNsYXNzIFNpbmdsZUhvc3RMb2FkQmFsYW5jaW5nUG9saWN5IGltcGxlbWVudHMgTG9hZEJhbGFuY2luZ1BvbGljeQoreworICAgIHByaXZhdGUgZmluYWwgSW5ldEFkZHJlc3MgYWRkcmVzczsKKyAgICBwcml2YXRlIEhvc3QgaG9zdDsKKworICAgIHB1YmxpYyBTaW5nbGVIb3N0TG9hZEJhbGFuY2luZ1BvbGljeShJbmV0QWRkcmVzcyBhZGRyZXNzKQorICAgIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgTGlzdDxIb3N0PiBob3N0cyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0KENsdXN0ZXIgY2x1c3RlciwgQ29sbGVjdGlvbjxIb3N0PiBob3N0cykKKyAgICB7CisgICAgICAgIGhvc3QgPSBob3N0cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGggLT4gaC5nZXRCcm9hZGNhc3RBZGRyZXNzKCkuZXF1YWxzKGFkZHJlc3MpKS5maW5kRmlyc3QoKQorICAgICAgICAgICAgICAgICAgICAub3JFbHNlVGhyb3coKCkgLT4gbmV3IEFzc2VydGlvbkVycm9yKCJUaGUgaG9zdCBzaG91bGQgYmUgYSBjb250YWN0IHBvaW50IikpOworICAgICAgICB0aGlzLmhvc3RzLmFkZChob3N0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSG9zdERpc3RhbmNlIGRpc3RhbmNlKEhvc3QgaG9zdCkKKyAgICB7CisgICAgICAgIHJldHVybiBIb3N0RGlzdGFuY2UuTE9DQUw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhdG9yPEhvc3Q+IG5ld1F1ZXJ5UGxhbihTdHJpbmcgbG9nZ2VkS2V5c3BhY2UsIFN0YXRlbWVudCBzdGF0ZW1lbnQpCisgICAgeworICAgICAgICByZXR1cm4gSXRlcmF0b3JzLnNpbmdsZXRvbkl0ZXJhdG9yKGhvc3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQWRkKEhvc3QgaG9zdCkKKyAgICB7CisgICAgICAgIC8vIG5vLW9wCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25VcChIb3N0IGhvc3QpCisgICAgeworICAgICAgICAvLyBuby1vcAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRG93bihIb3N0IGhvc3QpCisgICAgeworICAgICAgICAvLyBuby1vcAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVtb3ZlKEhvc3QgaG9zdCkKKyAgICB7CisgICAgICAgIC8vIG5vLW9wCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgLy8gbm8tb3AKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL1R3b1dheS5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL1R3b1dheS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NzdjYzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3V0aWwvVHdvV2F5LmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5jaGVja2VkVGltZW91dEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlNoYXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uOworCitAU2hhcmVkCitwdWJsaWMgY2xhc3MgVHdvV2F5IGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQoreworICAgIHByaXZhdGUgdm9sYXRpbGUgQ291bnREb3duTGF0Y2ggZmlyc3QgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb3VudERvd25MYXRjaCBzZWNvbmQgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICBwdWJsaWMgdm9pZCBhd2FpdEFuZEVudGVyKCkKKyAgICB7CisgICAgICAgIGF3YWl0KCk7CisgICAgICAgIGVudGVyKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXdhaXQoKQorICAgIHsKKyAgICAgICAgYXdhaXQoZmlyc3QpOworICAgICAgICBmaXJzdCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW50ZXIoKQorICAgIHsKKyAgICAgICAgaWYgKGZpcnN0ICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0LmNvdW50RG93bigpOworICAgICAgICAgICAgYXdhaXQoc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlY29uZC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhd2FpdChDb3VudERvd25MYXRjaCBsYXRjaCkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWxhdGNoLmF3YWl0KDEsIFRpbWVVbml0Lk1JTlVURVMpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmNoZWNrZWRUaW1lb3V0RXhjZXB0aW9uKCJUaW1lb3V0IHdhaXRpbmcgb24gIiArIChsYXRjaCA9PSBzZWNvbmQgPyAic2Vjb25kIiA6ICJmaXJzdCIpICsgIiBsYXRjaCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5jaGVja2VkSW50ZXJydXB0ZWRFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgeworICAgICAgICBpZiAoZmlyc3QgIT0gbnVsbCkKKyAgICAgICAgICAgIGZpcnN0LmNvdW50RG93bigpOworICAgICAgICBmaXJzdCA9IG51bGw7CisgICAgICAgIHNlY29uZC5jb3VudERvd24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3V0aWwvYnl0ZXJld3JpdGUvU3RhdHVzQ2hhbmdlTGlzdGVuZXIuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXRpbC9ieXRlcmV3cml0ZS9TdGF0dXNDaGFuZ2VMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2Yjg3NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2Rpc3RyaWJ1dGVkL3V0aWwvYnl0ZXJld3JpdGUvU3RhdHVzQ2hhbmdlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC51dGlsLmJ5dGVyZXdyaXRlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CisKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LkJ5dGVCdWRkeTsKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmR5bmFtaWMuRHluYW1pY1R5cGU7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NMb2FkaW5nU3RyYXRlZ3k7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5pbXBsZW1lbnRhdGlvbi5NZXRob2REZWxlZ2F0aW9uOworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uYmluZC5hbm5vdGF0aW9uLlN1cGVyQ2FsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLkluc3RhbmNlSUREZWZpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnV0aWwuVHdvV2F5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkOworCitpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMubmFtZWQ7CisKK3B1YmxpYyBjbGFzcyBTdGF0dXNDaGFuZ2VMaXN0ZW5lcgoreworICAgIHB1YmxpYyBlbnVtIFN0YXR1cworICAgIHsKKyAgICAgICAgTEVBVklORygic3RhcnRMZWF2aW5nIiksCisgICAgICAgIExFQVZFKCJsZWF2ZVJpbmciKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXRob2Q7CisKKyAgICAgICAgU3RhdHVzKFN0cmluZyBtZXRob2QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGwoQ2xhc3NMb2FkZXIgY2wsIGludCBub2RlLCBTdGF0dXMgZmlyc3QsIFN0YXR1cy4uLiByZXN0KQorICAgIHsKKyAgICAgICAgaW5zdGFsbChjbCwgbm9kZSwgRW51bVNldC5vZihmaXJzdCwgcmVzdCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnN0YWxsKENsYXNzTG9hZGVyIGNsLCBpbnQgbm9kZSwgU2V0PFN0YXR1cz4gc3RhdHVzZXMpCisgICAgeworICAgICAgICBpZiAoc3RhdHVzZXMuaXNFbXB0eSgpKSB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOZWVkIGEgc2V0IG9mIHN0YXR1cyB0byBsaXN0ZW4gdG8iKTsKKworICAgICAgICBTdGF0ZS5ob29rcy5wdXQobm9kZSwgbmV3IEhvb2tzKCkpOworICAgICAgICBEeW5hbWljVHlwZS5CdWlsZGVyPFN0b3JhZ2VTZXJ2aWNlPiBidWlsZGVyID0gbmV3IEJ5dGVCdWRkeSgpLnJlYmFzZShTdG9yYWdlU2VydmljZS5jbGFzcyk7CisgICAgICAgIGZvciAoU3RhdHVzIHMgOiBzdGF0dXNlcykKKyAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLm1ldGhvZChuYW1lZChzLm1ldGhvZCkpLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCLmNsYXNzKSk7CisgICAgICAgIGJ1aWxkZXIubWFrZSgpLmxvYWQoY2wsIENsYXNzTG9hZGluZ1N0cmF0ZWd5LkRlZmF1bHQuSU5KRUNUSU9OKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoKQorICAgIHsKKyAgICAgICAgZm9yIChIb29rcyBob29rIDogU3RhdGUuaG9va3MudmFsdWVzKCkpCisgICAgICAgICAgICBob29rLmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBIb29rcyBob29rcyhpbnQgbm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBPYmplY3RzLnJlcXVpcmVOb25OdWxsKFN0YXRlLmhvb2tzLmdldChub2RlKSwgIlVua25vd24gbm9kZSIgKyBub2RlKTsKKyAgICB9CisKKyAgICBAU2hhcmVkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0ZQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgSG9va3M+IGhvb2tzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKyAgICB9CisKKyAgICBAU2hhcmVkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIb29rcyBpbXBsZW1lbnRzIEF1dG9DbG9zZWFibGUKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHdvV2F5IGxlYXZpbmcgPSBuZXcgVHdvV2F5KCk7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHdvV2F5IGxlYXZlID0gbmV3IFR3b1dheSgpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoVHdvV2F5IGNvbmRpdGlvbjogQXJyYXlzLmFzTGlzdChsZWF2aW5nLCBsZWF2ZSkpCisgICAgICAgICAgICAgICAgY29uZGl0aW9uLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJCCisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBpbnQgTk9ERSA9IC0xOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydExlYXZpbmcoQFN1cGVyQ2FsbCBSdW5uYWJsZSB6dXBlcikKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2VlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2Uuc3RhcnRMZWF2aW5nCisgICAgICAgICAgICBob29rcygpLmxlYXZpbmcuZW50ZXIoKTsKKyAgICAgICAgICAgIHp1cGVyLnJ1bigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGxlYXZlUmluZyhAU3VwZXJDYWxsIFJ1bm5hYmxlIHp1cGVyKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzZWUgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZS5sZWF2ZVJpbmcKKyAgICAgICAgICAgIGhvb2tzKCkubGVhdmUuZW50ZXIoKTsKKyAgICAgICAgICAgIHp1cGVyLnJ1bigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSG9va3MgaG9va3MoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RhdGUuaG9va3MuZ2V0KG5vZGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgbm9kZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBub2RlID0gTk9ERTsKKyAgICAgICAgICAgIGlmIChub2RlID09IC0xKQorICAgICAgICAgICAgICAgIG5vZGUgPSBOT0RFID0gSW50ZWdlci5wYXJzZUludChJbnN0YW5jZUlERGVmaW5lci5nZXRJbnN0YW5jZUlkKCkucmVwbGFjZSgibm9kZSIsICIiKSk7CisgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXRpbC9ieXRlcmV3cml0ZS9VbmRlYWQuamF2YSBiL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGlzdHJpYnV0ZWQvdXRpbC9ieXRlcmV3cml0ZS9VbmRlYWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjFkNjVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaXN0cmlidXRlZC91dGlsL2J5dGVyZXdyaXRlL1VuZGVhZC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQudXRpbC5ieXRlcmV3cml0ZTsKKworaW1wb3J0IG5ldC5ieXRlYnVkZHkuQnl0ZUJ1ZGR5OworaW1wb3J0IG5ldC5ieXRlYnVkZHkuZHluYW1pYy5sb2FkaW5nLkNsYXNzTG9hZGluZ1N0cmF0ZWd5OworaW1wb3J0IG5ldC5ieXRlYnVkZHkuaW1wbGVtZW50YXRpb24uTWV0aG9kRGVsZWdhdGlvbjsKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmltcGxlbWVudGF0aW9uLmJpbmQuYW5ub3RhdGlvbi5TdXBlckNhbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLkVuZHBvaW50U3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkOworCitpbXBvcnQgc3RhdGljIG5ldC5ieXRlYnVkZHkubWF0Y2hlci5FbGVtZW50TWF0Y2hlcnMubmFtZWQ7CisKK3B1YmxpYyBjbGFzcyBVbmRlYWQKK3sKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5zdGFsbChDbGFzc0xvYWRlciBjbCkKKyAgICB7CisgICAgICAgIG5ldyBCeXRlQnVkZHkoKS5yZWJhc2UoRW5kcG9pbnRTdGF0ZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgLm1ldGhvZChuYW1lZCgibWFya0RlYWQiKSkuaW50ZXJjZXB0KE1ldGhvZERlbGVnYXRpb24udG8oQkIuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAgICAubWFrZSgpCisgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKGNsLCBDbGFzc0xvYWRpbmdTdHJhdGVneS5EZWZhdWx0LklOSkVDVElPTik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKCkKKyAgICB7CisgICAgICAgIFN0YXRlLmVuYWJsZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBAU2hhcmVkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0ZQorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGVuYWJsZWQgPSB0cnVlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQkIKKyAgICB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYXJrRGVhZChAU3VwZXJDYWxsIFJ1bm5hYmxlIHJlYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChTdGF0ZS5lbmFibGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGRvbid0IGxldCBhbnl0aGluZyBnZXQgbWFya2VkIGRlYWQuLi4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWFsLnJ1bigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9Gb3J3YXJkaW5nU1NUYWJsZVJlYWRlci5qYXZhIGIvdGVzdC9kaXN0cmlidXRlZC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9Gb3J3YXJkaW5nU1NUYWJsZVJlYWRlci5qYXZhCmluZGV4IDkwMTJkY2MuLjkxZDQxZmUgMTAwNjQ0Ci0tLSBhL3Rlc3QvZGlzdHJpYnV0ZWQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvRm9yd2FyZGluZ1NTVGFibGVSZWFkZXIuamF2YQorKysgYi90ZXN0L2Rpc3RyaWJ1dGVkL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L0ZvcndhcmRpbmdTU1RhYmxlUmVhZGVyLmphdmEKQEAgLTIzLDE2ICsyMywxNCBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlJhdGVMaW1pdGVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuSW5zdHJ1bWVudGluZ0NhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLktleUNhY2hlS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRhdGFSYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93SW5kZXhFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKQEAgLTQzLDE5ICs0MSwyNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQ29tcHJlc3Npb25NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVZlcmlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuS2V5SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5LZXlSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLlN0YXRzTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5DaGFubmVsUHJveHk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5DaGVja2VkRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW50ZWdyaXR5TWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlJlc3RvcmFibGVNZXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Fc3RpbWF0ZWRIaXN0b2dyYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PdXRwdXRIYW5kbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmOwogCkBAIC02MywxNCArNjYsMjUgQEAKIHsKICAgICBwcml2YXRlIGZpbmFsIFNTVGFibGVSZWFkZXIgZGVsZWdhdGU7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGV4dGVuZHMgU1NUYWJsZVJlYWRlci5CdWlsZGVyPEZvcndhcmRpbmdTU1RhYmxlUmVhZGVyLCBCdWlsZGVyPgorICAgIHsKKyAgICAgICAgcHVibGljIEJ1aWxkZXIoU1NUYWJsZVJlYWRlciBkZWxlZ2F0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZGVsZWdhdGUuZGVzY3JpcHRvcik7CisgICAgICAgICAgICBkZWxlZ2F0ZS51bmJ1aWxkVG8odGhpcywgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGb3J3YXJkaW5nU1NUYWJsZVJlYWRlciBidWlsZEludGVybmFsKE93bmVyIG93bmVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyBGb3J3YXJkaW5nU1NUYWJsZVJlYWRlcihTU1RhYmxlUmVhZGVyIGRlbGVnYXRlKQogICAgIHsKLSAgICAgICAgc3VwZXIoZGVsZWdhdGUuZGVzY3JpcHRvciwgU1NUYWJsZS5jb21wb25lbnRzRm9yKGRlbGVnYXRlLmRlc2NyaXB0b3IpLAotICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmLmZvck9mZmxpbmVUb29scyhkZWxlZ2F0ZS5tZXRhZGF0YSgpKSwgZGVsZWdhdGUubWF4RGF0YUFnZSwgZGVsZWdhdGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCksCi0gICAgICAgICAgICAgIGRlbGVnYXRlLm9wZW5SZWFzb24sIGRlbGVnYXRlLmhlYWRlciwgZGVsZWdhdGUuaW5kZXhTdW1tYXJ5LCBkZWxlZ2F0ZS5kZmlsZSwgZGVsZWdhdGUuaWZpbGUsIGRlbGVnYXRlLmJmKTsKKyAgICAgICAgc3VwZXIobmV3IEJ1aWxkZXIoZGVsZWdhdGUpLCBkZWxlZ2F0ZS5vd25lcigpLm9yRWxzZShudWxsKSk7CiAgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLSAgICAgICAgdGhpcy5maXJzdCA9IGRlbGVnYXRlLmZpcnN0OwotICAgICAgICB0aGlzLmxhc3QgPSBkZWxlZ2F0ZS5sYXN0OwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtOTIsMTIgKzEwNiwyNCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG1heUNvbnRhaW5Bc3N1bWluZ0tleUlzSW5SYW5nZShEZWNvcmF0ZWRLZXkga2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm1heUNvbnRhaW5Bc3N1bWluZ0tleUlzSW5SYW5nZShrZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldHVwT25saW5lKCkKICAgICB7CiAgICAgICAgIGRlbGVnYXRlLnNldHVwT25saW5lKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSLCBFIGV4dGVuZHMgRXhjZXB0aW9uPiBSIHJ1bldpdGhMb2NrKENoZWNrZWRGdW5jdGlvbjxEZXNjcmlwdG9yLCBSLCBFPiB0YXNrKSB0aHJvd3MgRQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnJ1bldpdGhMb2NrKHRhc2spOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHNldFJlcGxhY2VkKCkKICAgICB7CiAgICAgICAgIGRlbGVnYXRlLnNldFJlcGxhY2VkKCk7CkBAIC0xMjIsMTUgKzE0OCw5IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNTVGFibGVSZWFkZXIgY2xvbmVXaXRoTmV3U3RhcnQoRGVjb3JhdGVkS2V5IG5ld1N0YXJ0LCBSdW5uYWJsZSBydW5PbkNsb3NlKQorICAgIHB1YmxpYyBTU1RhYmxlUmVhZGVyIGNsb25lV2l0aE5ld1N0YXJ0KERlY29yYXRlZEtleSBuZXdTdGFydCkKICAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5jbG9uZVdpdGhOZXdTdGFydChuZXdTdGFydCwgcnVuT25DbG9zZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNTVGFibGVSZWFkZXIgY2xvbmVXaXRoTmV3U3VtbWFyeVNhbXBsaW5nTGV2ZWwoQ29sdW1uRmFtaWx5U3RvcmUgcGFyZW50LCBpbnQgc2FtcGxpbmdMZXZlbCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuY2xvbmVXaXRoTmV3U3VtbWFyeVNhbXBsaW5nTGV2ZWwocGFyZW50LCBzYW1wbGluZ0xldmVsKTsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNsb25lV2l0aE5ld1N0YXJ0KG5ld1N0YXJ0KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE0MCwzOSArMTYwLDIxIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlSW5NZW1vcnlDb21wb25lbnRzKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCk7CisgICAgICAgIGRlbGVnYXRlLnJlbGVhc2VJbk1lbW9yeUNvbXBvbmVudHMoKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRJbmRleFN1bW1hcnlPZmZIZWFwU2l6ZSgpCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEluZGV4U3VtbWFyeU9mZkhlYXBTaXplKCk7CisgICAgICAgIGRlbGVnYXRlLnZhbGlkYXRlKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRNaW5JbmRleEludGVydmFsKCkKKyAgICBwcm90ZWN0ZWQgdm9pZCBjbG9zZUludGVybmFsQ29tcG9uZW50KEF1dG9DbG9zZWFibGUgY2xvc2VhYmxlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE1pbkluZGV4SW50ZXJ2YWwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZG91YmxlIGdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlU3VtbWFyeSgpCi0gICAgewotICAgICAgICBkZWxlZ2F0ZS5yZWxlYXNlU3VtbWFyeSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEluZGV4U2NhblBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uIGtleSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRJbmRleFNjYW5Qb3NpdGlvbihrZXkpOworICAgICAgICBkZWxlZ2F0ZS5jbG9zZUludGVybmFsQ29tcG9uZW50KGNsb3NlYWJsZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xODgsMjQgKzE5MCw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElGaWx0ZXIgZ2V0Qmxvb21GaWx0ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEJsb29tRmlsdGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0Qmxvb21GaWx0ZXJTZXJpYWxpemVkU2l6ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0Qmxvb21GaWx0ZXJTZXJpYWxpemVkU2l6ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEJsb29tRmlsdGVyT2ZmSGVhcFNpemUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEJsb29tRmlsdGVyT2ZmSGVhcFNpemUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgbG9uZyBlc3RpbWF0ZWRLZXlzKCkKICAgICB7CiAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5lc3RpbWF0ZWRLZXlzKCk7CkBAIC0yMTgsMjQgKzIwMiw2IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRJbmRleFN1bW1hcnlTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRJbmRleFN1bW1hcnlTaXplKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRNYXhJbmRleFN1bW1hcnlTaXplKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRNYXhJbmRleFN1bW1hcnlTaXplKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJ5dGVbXSBnZXRJbmRleFN1bW1hcnlLZXkoaW50IGluZGV4KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEluZGV4U3VtbWFyeUtleShpbmRleCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCiAgICAgcHVibGljIEl0ZXJhYmxlPERlY29yYXRlZEtleT4gZ2V0S2V5U2FtcGxlcyhSYW5nZTxUb2tlbj4gcmFuZ2UpCiAgICAgewogICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0S2V5U2FtcGxlcyhyYW5nZSk7CkBAIC0yNDgsMzkgKzIxNCwxNSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBLZXlDYWNoZUtleSBnZXRDYWNoZUtleShEZWNvcmF0ZWRLZXkga2V5KQorICAgIHByb3RlY3RlZCBsb25nIGdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uIGtleSwgT3BlcmF0b3Igb3AsIGJvb2xlYW4gdXBkYXRlU3RhdHMsIFNTVGFibGVSZWFkc0xpc3RlbmVyIGxpc3RlbmVyKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENhY2hlS2V5KGtleSk7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQb3NpdGlvbihrZXksIG9wLCB1cGRhdGVTdGF0cywgbGlzdGVuZXIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNhY2hlS2V5KERlY29yYXRlZEtleSBrZXksIFJvd0luZGV4RW50cnkgaW5mbykKKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGdldFJvd0luZGV4RW50cnkoUGFydGl0aW9uUG9zaXRpb24ga2V5LCBPcGVyYXRvciBvcCwgYm9vbGVhbiB1cGRhdGVDYWNoZUFuZFN0YXRzLCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKICAgICB7Ci0gICAgICAgIGRlbGVnYXRlLmNhY2hlS2V5KGtleSwgaW5mbyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJvd0luZGV4RW50cnkgZ2V0Q2FjaGVkUG9zaXRpb24oRGVjb3JhdGVkS2V5IGtleSwgYm9vbGVhbiB1cGRhdGVTdGF0cykKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRDYWNoZWRQb3NpdGlvbihrZXksIHVwZGF0ZVN0YXRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUm93SW5kZXhFbnRyeSBnZXRDYWNoZWRQb3NpdGlvbihLZXlDYWNoZUtleSB1bmlmaWVkS2V5LCBib29sZWFuIHVwZGF0ZVN0YXRzKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENhY2hlZFBvc2l0aW9uKHVuaWZpZWRLZXksIHVwZGF0ZVN0YXRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0tleUNhY2hlRW5hYmxlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNLZXlDYWNoZUVuYWJsZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgUm93SW5kZXhFbnRyeSBnZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbiBrZXksIE9wZXJhdG9yIG9wLCBib29sZWFuIHVwZGF0ZUNhY2hlQW5kU3RhdHMsIGJvb2xlYW4gcGVybWl0TWF0Y2hQYXN0TGFzdCwgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UG9zaXRpb24oa2V5LCBvcCwgdXBkYXRlQ2FjaGVBbmRTdGF0cywgcGVybWl0TWF0Y2hQYXN0TGFzdCwgbGlzdGVuZXIpOworICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0Um93SW5kZXhFbnRyeShrZXksIG9wLCB1cGRhdGVDYWNoZUFuZFN0YXRzLCBsaXN0ZW5lcik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yOTAsMTUgKzIzMiwyMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3Igcm93SXRlcmF0b3IoRmlsZURhdGFJbnB1dCBmaWxlLCBEZWNvcmF0ZWRLZXkga2V5LCBSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIFNsaWNlcyBzbGljZXMsIENvbHVtbkZpbHRlciBzZWxlY3RlZENvbHVtbnMsIGJvb2xlYW4gcmV2ZXJzZWQpCisgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBzaW1wbGVJdGVyYXRvcihGaWxlRGF0YUlucHV0IGZpbGUsIERlY29yYXRlZEtleSBrZXksIGxvbmcgZGF0YVBvc2l0aW9uLCBib29sZWFuIHRvbWJzdG9uZU9ubHkpCiAgICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUucm93SXRlcmF0b3IoZmlsZSwga2V5LCBpbmRleEVudHJ5LCBzbGljZXMsIHNlbGVjdGVkQ29sdW1ucywgcmV2ZXJzZWQpOworICAgICAgICByZXR1cm4gZGVsZWdhdGUuc2ltcGxlSXRlcmF0b3IoZmlsZSwga2V5LCBkYXRhUG9zaXRpb24sIHRvbWJzdG9uZU9ubHkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVbmZpbHRlcmVkUm93SXRlcmF0b3Igc2ltcGxlSXRlcmF0b3IoRmlsZURhdGFJbnB1dCBmaWxlLCBEZWNvcmF0ZWRLZXkga2V5LCBSb3dJbmRleEVudHJ5IGluZGV4RW50cnksIGJvb2xlYW4gdG9tYnN0b25lT25seSkKKyAgICBwdWJsaWMgS2V5UmVhZGVyIGtleVJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnNpbXBsZUl0ZXJhdG9yKGZpbGUsIGtleSwgaW5kZXhFbnRyeSwgdG9tYnN0b25lT25seSk7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5rZXlSZWFkZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgS2V5SXRlcmF0b3Iga2V5SXRlcmF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5rZXlJdGVyYXRvcigpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzk4LDkgKzM0Niw5IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gbmV3U2luY2UobG9uZyBhZ2UpCisgICAgcHVibGljIGJvb2xlYW4gbmV3U2luY2UobG9uZyB0aW1lc3RhbXBNaWxsaXMpCiAgICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUubmV3U2luY2UoYWdlKTsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLm5ld1NpbmNlKHRpbWVzdGFtcE1pbGxpcyk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC00MTAsMTUgKzM1OCwyMSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUxpbmtzKFN0cmluZyBzbmFwc2hvdERpcmVjdG9yeVBhdGgsIFJhdGVMaW1pdGVyIHJhdGVMaW1pdGVyKQorICAgIHsKKyAgICAgICAgZGVsZWdhdGUuY3JlYXRlTGlua3Moc25hcHNob3REaXJlY3RvcnlQYXRoLCByYXRlTGltaXRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gaXNSZXBhaXJlZCgpCiAgICAgewogICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNSZXBhaXJlZCgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXkga2V5QXQobG9uZyBpbmRleFBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgRGVjb3JhdGVkS2V5IGtleUF0UG9zaXRpb25Gcm9tU2Vjb25kYXJ5SW5kZXgobG9uZyBrZXlQb3NpdGlvbkZyb21TZWNvbmRhcnlJbmRleCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUua2V5QXQoaW5kZXhQb3NpdGlvbik7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5rZXlBdFBvc2l0aW9uRnJvbVNlY29uZGFyeUluZGV4KGtleVBvc2l0aW9uRnJvbVNlY29uZGFyeUluZGV4KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTQ1MiwzNiArNDA2LDYgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlQ291bnQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRSZWNlbnRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UmVjZW50Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlQ291bnQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0UmVjZW50Qmxvb21GaWx0ZXJUcnVlUG9zaXRpdmVDb3VudCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UmVjZW50Qmxvb21GaWx0ZXJUcnVlUG9zaXRpdmVDb3VudCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbnN0cnVtZW50aW5nQ2FjaGU8S2V5Q2FjaGVLZXksIFJvd0luZGV4RW50cnk+IGdldEtleUNhY2hlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRLZXlDYWNoZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBFc3RpbWF0ZWRIaXN0b2dyYW0gZ2V0RXN0aW1hdGVkUGFydGl0aW9uU2l6ZSgpCiAgICAgewogICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0RXN0aW1hdGVkUGFydGl0aW9uU2l6ZSgpOwpAQCAtNTc4LDYgKzUwMiwxOCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG11dGF0ZUxldmVsQW5kUmVsb2FkKGludCBuZXdMZXZlbCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBkZWxlZ2F0ZS5tdXRhdGVMZXZlbEFuZFJlbG9hZChuZXdMZXZlbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbXV0YXRlUmVwYWlyZWRBbmRSZWxvYWQobG9uZyBuZXdSZXBhaXJlZEF0LCBUaW1lVVVJRCBuZXdQZW5kaW5nUmVwYWlyLCBib29sZWFuIGlzVHJhbnNpZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRlbGVnYXRlLm11dGF0ZVJlcGFpcmVkQW5kUmVsb2FkKG5ld1JlcGFpcmVkQXQsIG5ld1BlbmRpbmdSZXBhaXIsIGlzVHJhbnNpZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZWxvYWRTU1RhYmxlTWV0YWRhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGRlbGVnYXRlLnJlbG9hZFNTVGFibGVNZXRhZGF0YSgpOwpAQCAtNjAyLDkgKzUzOCw5IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhbmRvbUFjY2Vzc1JlYWRlciBvcGVuSW5kZXhSZWFkZXIoKQorICAgIHB1YmxpYyB2b2lkIHRyeVNraXBGaWxlQ2FjaGVCZWZvcmUoRGVjb3JhdGVkS2V5IGtleSkKICAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5vcGVuSW5kZXhSZWFkZXIoKTsKKyAgICAgICAgZGVsZWdhdGUudHJ5U2tpcEZpbGVDYWNoZUJlZm9yZShrZXkpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNjE0LDMzICs1NTAsOSBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFubmVsUHJveHkgZ2V0SW5kZXhDaGFubmVsKCkKKyAgICBwdWJsaWMgbG9uZyBnZXREYXRhQ3JlYXRpb25UaW1lKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRJbmRleENoYW5uZWwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmlsZUhhbmRsZSBnZXRJbmRleEZpbGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEluZGV4RmlsZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldENyZWF0aW9uVGltZUZvcihDb21wb25lbnQgY29tcG9uZW50KQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENyZWF0aW9uVGltZUZvcihjb21wb25lbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEtleUNhY2hlSGl0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRLZXlDYWNoZUhpdCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEtleUNhY2hlUmVxdWVzdCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0S2V5Q2FjaGVSZXF1ZXN0KCk7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXREYXRhQ3JlYXRpb25UaW1lKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC02NzQsNyArNTg2LDEzIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgdm9pZCBzZXR1cChib29sZWFuIHRyYWNrSG90bmVzcykKKyAgICBwcm90ZWN0ZWQgTGlzdDxBdXRvQ2xvc2VhYmxlPiBzZXR1cEluc3RhbmNlKGJvb2xlYW4gdHJhY2tIb3RuZXNzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnNldHVwSW5zdGFuY2UodHJhY2tIb3RuZXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cChib29sZWFuIHRyYWNrSG90bmVzcykKICAgICB7CiAgICAgICAgIGRlbGVnYXRlLnNldHVwKHRyYWNrSG90bmVzcyk7CiAgICAgfQpAQCAtNzEwLDEyICs2MjgsNiBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5kZXhGaWxlbmFtZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0SW5kZXhGaWxlbmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uRmFtaWx5TmFtZSgpCiAgICAgewogICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0Q29sdW1uRmFtaWx5TmFtZSgpOwpAQCAtNzQwLDYgKzY1MiwzMCBAQAogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGxvZ2ljYWxCeXRlc09uRGlzaygpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUubG9naWNhbEJ5dGVzT25EaXNrKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDb21wb25lbnQ+IGdldENvbXBvbmVudHMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENvbXBvbmVudHMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd0l0ZXJhdG9yKERlY29yYXRlZEtleSBrZXkpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUucm93SXRlcmF0b3Ioa2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBtYXliZVBlcnNpc3RTU1RhYmxlUmVhZE1ldGVyKCkKKyAgICB7CisgICAgICAgIGRlbGVnYXRlLm1heWJlUGVyc2lzdFNTVGFibGVSZWFkTWV0ZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgICB7CiAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS50b1N0cmluZygpOwpAQCAtNzU2LDQgKzY5Miw0MCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEJvdW5kcygpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJVmVyaWZpZXIgZ2V0VmVyaWZpZXIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBPdXRwdXRIYW5kbGVyIG91dHB1dEhhbmRsZXIsIGJvb2xlYW4gaXNPZmZsaW5lLCBJVmVyaWZpZXIuT3B0aW9ucyBvcHRpb25zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFZlcmlmaWVyKGNmcywgb3V0cHV0SGFuZGxlciwgaXNPZmZsaW5lLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlTZWxlY3RlZChTU1RhYmxlUmVhZHNMaXN0ZW5lci5TZWxlY3Rpb25SZWFzb24gcmVhc29uLCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsb2NhbExpc3RlbmVyLCBPcGVyYXRvciBvcCwgYm9vbGVhbiB1cGRhdGVTdGF0cywgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGVudHJ5KQorICAgIHsKKyAgICAgICAgZGVsZWdhdGUubm90aWZ5U2VsZWN0ZWQocmVhc29uLCBsb2NhbExpc3RlbmVyLCBvcCwgdXBkYXRlU3RhdHMsIGVudHJ5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBub3RpZnlTa2lwcGVkKFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uIHJlYXNvbiwgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbG9jYWxMaXN0ZW5lciwgT3BlcmF0b3Igb3AsIGJvb2xlYW4gdXBkYXRlU3RhdHMpCisgICAgeworICAgICAgICBkZWxlZ2F0ZS5ub3RpZnlTa2lwcGVkKHJlYXNvbiwgbG9jYWxMaXN0ZW5lciwgb3AsIHVwZGF0ZVN0YXRzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VzdGltYXRpb25JbmZvcm1hdGl2ZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNFc3RpbWF0aW9uSW5mb3JtYXRpdmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGF0YUludGVncml0eU1ldGFkYXRhLkNoZWNrc3VtVmFsaWRhdG9yIG1heWJlR2V0Q2hlY2tzdW1WYWxpZGF0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXliZUdldENoZWNrc3VtVmFsaWRhdG9yKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERhdGFJbnRlZ3JpdHlNZXRhZGF0YS5GaWxlRGlnZXN0VmFsaWRhdG9yIG1heWJlR2V0RGlnZXN0VmFsaWRhdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUubWF5YmVHZXREaWdlc3RWYWxpZGF0b3IoKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L2xvbmcvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Mb25nTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneUNRTFRlc3QuamF2YSBiL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xvbmdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5Q1FMVGVzdC5qYXZhCmluZGV4IDFkZjdlN2MuLmFkMThkOWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xvbmdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5Q1FMVGVzdC5qYXZhCisrKyBiL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xvbmdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5Q1FMVGVzdC5qYXZhCkBAIC0yOSwxMyArMjksMTMgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5pbnRlcnJ1cHRpYmxlczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkhleDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfU1RSSUNUX0xDU19DSEVDS1M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKIAogcHVibGljIGNsYXNzIExvbmdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5Q1FMVGVzdCBleHRlbmRzIENRTFRlc3RlcgpAQCAtNDQsNyArNDQsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc3RyZXNzVGVzdENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAidGVzdC5zdHJpY3RfbGNzX2NoZWNrcyIsICJ0cnVlIik7CisgICAgICAgIFRFU1RfU1RSSUNUX0xDU19DSEVDS1Muc2V0Qm9vbGVhbih0cnVlKTsKICAgICAgICAgLy8gZmx1c2gvY29tcGFjdCB0b25zIG9mIHNzdGFibGVzLCBpbnZhbGlkYXRlIHRva2VuIG1ldGFkYXRhIGluIGEgbG9vcCB0byBtYWtlIENTTSByZWxvYWQgdGhlIHN0cmF0ZWdpZXMKICAgICAgICAgY3JlYXRlVGFibGUoImNyZWF0ZSB0YWJsZSAlcyAoaWQgaW50IHByaW1hcnkga2V5LCBpIHRleHQpIHdpdGggY29tcGFjdGlvbiA9IHsnY2xhc3MnOidMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5JywgJ3NzdGFibGVfc2l6ZV9pbl9tYic6MX0iKTsKICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGVzID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CmRpZmYgLS1naXQgYS90ZXN0L2xvbmcvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Mb25nTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YSBiL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xvbmdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCmluZGV4IDczM2U0NmYuLmE3ODBjZjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xvbmdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCisrKyBiL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xvbmdMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCkBAIC0xOTgsOSArMTk4LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0sIHRydWUsIHRydWUpOwotCi0KKyAgICAgICAgfSwgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OLCB0cnVlLCB0cnVlKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdC9sb25nL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0hlYXBVdGlsc1Rlc3QuamF2YSBiL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9IZWFwVXRpbHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjOTFjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbG9uZy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9IZWFwVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKKworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBIZWFwVXRpbHNUZXN0Cit7CisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkRHVtcEhlYXBXaXRoUGF0aEFyZ1NwZWNpZmllZCgpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RHVtcEhlYXBPblVuY2F1Z2h0RXhjZXB0aW9uKHRydWUpOworICAgICAgICBTdHJpbmcgcGF0aCA9IEhlYXBVdGlscy5tYXliZUNyZWF0ZUhlYXBEdW1wKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocGF0aCk7CisgICAgICAgIGFzc2VydFRydWUoUGF0aHMuZ2V0KHBhdGgpLnRvRmlsZSgpLmV4aXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoRGF0YWJhc2VEZXNjcmlwdG9yLmdldER1bXBIZWFwT25VbmNhdWdodEV4Y2VwdGlvbigpKTsKKworICAgICAgICAvLyBBZnRlciB0aGUgZmlyc3QgZHVtcCwgc3Vic2VxdWVudCByZXF1ZXN0cyBzaG91bGQgYmUgbm8tb3BzLi4uCisgICAgICAgIHBhdGggPSBIZWFwVXRpbHMubWF5YmVDcmVhdGVIZWFwRHVtcCgpOworICAgICAgICBhc3NlcnROdWxsKHBhdGgpOworCisgICAgICAgIC8vIC4uLnVudGlsIGNyZWF0aW9uIGlzIG1hbnVhbGx5IHJlLWVuYWJsZWQuCisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREdW1wSGVhcE9uVW5jYXVnaHRFeGNlcHRpb24odHJ1ZSk7CisgICAgICAgIGFzc2VydFRydWUoRGF0YWJhc2VEZXNjcmlwdG9yLmdldER1bXBIZWFwT25VbmNhdWdodEV4Y2VwdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SGVhcER1bXBQYXRoKCkpOworICAgICAgICBwYXRoID0gSGVhcFV0aWxzLm1heWJlQ3JlYXRlSGVhcER1bXAoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXRoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShQYXRocy5nZXQocGF0aCkudG9GaWxlKCkuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0RHVtcEhlYXBPblVuY2F1Z2h0RXhjZXB0aW9uKCkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L21lbW9yeS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25BbGxvY2F0aW9uVGVzdC5qYXZhIGIvdGVzdC9tZW1vcnkvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uQWxsb2NhdGlvblRlc3QuamF2YQppbmRleCA0ZDY1MmI3Li5lMmE0ZWRlIDEwMDY0NAotLS0gYS90ZXN0L21lbW9yeS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25BbGxvY2F0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvbWVtb3J5L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkFsbG9jYXRpb25UZXN0LmphdmEKQEAgLTM5Myw3ICszOTMsNyBAQAogICAgICAgICBNZWFzdXJlbWVudCBtZWFzdXJlbWVudCA9IGNyZWF0ZU1lYXN1cmVtZW50KCk7CiAgICAgICAgIG1lYXN1cmVtZW50LnN0YXJ0KCk7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1BbGxvYzsgaSsrKQotICAgICAgICAgICAgbmV3IEludGVnZXIoaSk7CisgICAgICAgICAgICBJbnRlZ2VyLnZhbHVlT2YoaSk7CiAKICAgICAgICAgbWVhc3VyZW1lbnQuc3RvcCgpOwogICAgICAgICBsb2dnZXIuaW5mbygiICoqIHt9IiwgbWVhc3VyZW1lbnQucHJldHR5Qnl0ZXMoKSk7CmRpZmYgLS1naXQgYS90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL0Fic3RyYWN0VHlwZUJ5dGVTb3VyY2VEZWNvZGluZ0JlbmNoLmphdmEgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL0Fic3RyYWN0VHlwZUJ5dGVTb3VyY2VEZWNvZGluZ0JlbmNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5NjE3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvQWJzdHJhY3RUeXBlQnl0ZVNvdXJjZURlY29kaW5nQmVuY2guamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50ZXN0Lm1pY3JvYmVuY2g7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CisKK2ltcG9ydCBuZXQubmljb3VsYWouY29tcGlsZWNvbW1hbmQuYW5ub3RhdGlvbnMuSW5saW5lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZXNUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuRGVjaW1hbFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnRlZ2VyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlR5cGVQYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5CZW5jaG1hcms7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkJlbmNobWFya01vZGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkZvcms7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkxldmVsOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTW9kZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuT3V0cHV0VGltZVVuaXQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlBhcmFtOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TY29wZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2V0dXA7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlN0YXRlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5UaHJlYWRzOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5XYXJtdXA7CisKK0BCZW5jaG1hcmtNb2RlKE1vZGUuQXZlcmFnZVRpbWUpCitAT3V0cHV0VGltZVVuaXQoVGltZVVuaXQuTUlDUk9TRUNPTkRTKQorQFdhcm11cChpdGVyYXRpb25zID0gNSwgdGltZSA9IDEpCitATWVhc3VyZW1lbnQoaXRlcmF0aW9ucyA9IDUsIHRpbWUgPSAyKQorQEZvcmsodmFsdWUgPSAxLGp2bUFyZ3NBcHBlbmQgPSB7ICItWG14NEciLCAiLVhtczRHIiwgIi1Eam1oLmV4ZWN1dG9yPUNVU1RPTSIsICItRGptaC5leGVjdXRvci5jbGFzcz1vcmcuYXBhY2hlLmNhc3NhbmRyYS50ZXN0Lm1pY3JvYmVuY2guRmFzdFRocmVhZEV4ZWN1dG9yIn0pCitAVGhyZWFkcygxKQorQFN0YXRlKFNjb3BlLkJlbmNobWFyaykKK3B1YmxpYyBjbGFzcyBBYnN0cmFjdFR5cGVCeXRlU291cmNlRGVjb2RpbmdCZW5jaAoreworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiBMQVRFU1QgPSBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEFic3RyYWN0VHlwZSwgQmlGdW5jdGlvbjxSYW5kb20sIEludGVnZXIsIEJ5dGVTb3VyY2UuUGVla2FibGU+PiBQRUVLQUJMRV9HRU5FUkFUT1JfQllfVFlQRSA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICBzdGF0aWMKKyAgICB7CisgICAgICAgIFBFRUtBQkxFX0dFTkVSQVRPUl9CWV9UWVBFLnB1dChVVEY4VHlwZS5pbnN0YW5jZSwgKHBybmcsIGxlbmd0aCkgLT4KKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIHJhbmRvbUJ5dGVzID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIHBybmcubmV4dEJ5dGVzKHJhbmRvbUJ5dGVzKTsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uub2YobmV3IFN0cmluZyhyYW5kb21CeXRlcywgU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCksIExBVEVTVCkpOworICAgICAgICB9KTsKKyAgICAgICAgUEVFS0FCTEVfR0VORVJBVE9SX0JZX1RZUEUucHV0KEJ5dGVzVHlwZS5pbnN0YW5jZSwgKHBybmcsIGxlbmd0aCkgLT4KKyAgICAgICAgeworICAgICAgICAgICAgYnl0ZVtdIHJhbmRvbUJ5dGVzID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIHBybmcubmV4dEJ5dGVzKHJhbmRvbUJ5dGVzKTsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uub2YocmFuZG9tQnl0ZXMsIExBVEVTVCkpOworICAgICAgICB9KTsKKyAgICAgICAgUEVFS0FCTEVfR0VORVJBVE9SX0JZX1RZUEUucHV0KEludGVnZXJUeXBlLmluc3RhbmNlLCAocHJuZywgbGVuZ3RoKSAtPgorICAgICAgICB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIHJhbmRvbVZhcmludCA9IEJpZ0ludGVnZXIudmFsdWVPZihwcm5nLm5leHRMb25nKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGggLyA4OyArK2kpCisgICAgICAgICAgICAgICAgcmFuZG9tVmFyaW50ID0gcmFuZG9tVmFyaW50Lm11bHRpcGx5KEJpZ0ludGVnZXIudmFsdWVPZihwcm5nLm5leHRMb25nKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLnBlZWthYmxlKEludGVnZXJUeXBlLmluc3RhbmNlLmFzQ29tcGFyYWJsZUJ5dGVzKEludGVnZXJUeXBlLmluc3RhbmNlLmRlY29tcG9zZShyYW5kb21WYXJpbnQpLCBMQVRFU1QpKTsKKyAgICAgICAgfSk7CisgICAgICAgIFBFRUtBQkxFX0dFTkVSQVRPUl9CWV9UWVBFLnB1dChEZWNpbWFsVHlwZS5pbnN0YW5jZSwgKHBybmcsIGxlbmd0aCkgLT4KKyAgICAgICAgeworICAgICAgICAgICAgQmlnSW50ZWdlciByYW5kb21NYW50aXNzYSA9IEJpZ0ludGVnZXIudmFsdWVPZihwcm5nLm5leHRMb25nKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGggLyA4OyArK2kpCisgICAgICAgICAgICAgICAgcmFuZG9tTWFudGlzc2EgPSByYW5kb21NYW50aXNzYS5tdWx0aXBseShCaWdJbnRlZ2VyLnZhbHVlT2YocHJuZy5uZXh0TG9uZygpKSk7CisgICAgICAgICAgICBpbnQgcmFuZG9tU2NhbGUgPSBwcm5nLm5leHRJbnQoSW50ZWdlci5NQVhfVkFMVUUgPj4gMSkgKyBJbnRlZ2VyLk1BWF9WQUxVRSA+PiAxOworICAgICAgICAgICAgQmlnRGVjaW1hbCByYW5kb21EZWNpbWFsID0gbmV3IEJpZ0RlY2ltYWwocmFuZG9tTWFudGlzc2EsIHJhbmRvbVNjYWxlKTsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLnBlZWthYmxlKERlY2ltYWxUeXBlLmluc3RhbmNlLmFzQ29tcGFyYWJsZUJ5dGVzKERlY2ltYWxUeXBlLmluc3RhbmNlLmRlY29tcG9zZShyYW5kb21EZWNpbWFsKSwgTEFURVNUKSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisKKyAgICBAUGFyYW0oeyIzMiIsICIxMjgiLCAiNTEyIn0pCisgICAgcHJpdmF0ZSBpbnQgbGVuZ3RoOworCisgICAgQFBhcmFtKHsiVVRGOFR5cGUiLCAiQnl0ZXNUeXBlIiwgIkludGVnZXJUeXBlIiwgIkRlY2ltYWxUeXBlIn0pCisgICAgcHJpdmF0ZSBTdHJpbmcgYWJzdHJhY3RUeXBlTmFtZTsKKworICAgIHByaXZhdGUgQWJzdHJhY3RUeXBlIGFic3RyYWN0VHlwZTsKKyAgICBwcml2YXRlIEJpRnVuY3Rpb248UmFuZG9tLCBJbnRlZ2VyLCBCeXRlU291cmNlLlBlZWthYmxlPiBwZWVrYWJsZUdlbmVyYXRvcjsKKworICAgIEBTZXR1cChMZXZlbC5UcmlhbCkKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpCisgICAgeworICAgICAgICBhYnN0cmFjdFR5cGUgPSBUeXBlUGFyc2VyLnBhcnNlKGFic3RyYWN0VHlwZU5hbWUpOworICAgICAgICBwZWVrYWJsZUdlbmVyYXRvciA9IFBFRUtBQkxFX0dFTkVSQVRPUl9CWV9UWVBFLmdldChhYnN0cmFjdFR5cGUpOworICAgIH0KKworICAgIEBJbmxpbmUKKyAgICBwcml2YXRlIEJ5dGVTb3VyY2UuUGVla2FibGUgcmFuZG9tUGVla2FibGVCeXRlcygpCisgICAgeworICAgICAgICByZXR1cm4gcGVla2FibGVHZW5lcmF0b3IuYXBwbHkocHJuZywgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIGludCBiYXNlbGluZSgpCisgICAgeworICAgICAgICAvLyBHZXR0aW5nIHRoZSBzb3VyY2UgaXMgbm90IGVub3VnaCBhcyBpdHMgY29udGVudCBpcyBwcm9kdWNlZCBvbiBuZXh0KCkgY2FsbHMuCisgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgc291cmNlID0gcmFuZG9tUGVla2FibGVCeXRlcygpOworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICB3aGlsZSAoc291cmNlLm5leHQoKSAhPSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0pCisgICAgICAgICAgICArK2NvdW50OworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyBCeXRlQnVmZmVyIGZyb21Db21wYXJhYmxlQnl0ZXMoKQorICAgIHsKKyAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBwZWVrYWJsZUJ5dGVzID0gcmFuZG9tUGVla2FibGVCeXRlcygpOworICAgICAgICByZXR1cm4gYWJzdHJhY3RUeXBlLmZyb21Db21wYXJhYmxlQnl0ZXMocGVla2FibGVCeXRlcywgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9CbG9vbUZpbHRlclNlcmlhbGl6ZXJCZW5jaC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9CbG9vbUZpbHRlclNlcmlhbGl6ZXJCZW5jaC5qYXZhCmluZGV4IDMyZTA0OGQuLmIwMzM3MmUgMTAwNjQ0Ci0tLSBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvQmxvb21GaWx0ZXJTZXJpYWxpemVyQmVuY2guamF2YQorKysgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL0Jsb29tRmlsdGVyU2VyaWFsaXplckJlbmNoLmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50ZXN0Lm1pY3JvYmVuY2g7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRTdHJlYW1QbHVzOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKQEAgLTUzLDcgKzUyLDYgQEAKIEBTdGF0ZShTY29wZS5CZW5jaG1hcmspCiBwdWJsaWMgY2xhc3MgQmxvb21GaWx0ZXJTZXJpYWxpemVyQmVuY2gKIHsKLQogICAgIEBQYXJhbSh7IjEiLCAiMTAiLCAiMTAwIiwgIjEwMjQifSkKICAgICBwcml2YXRlIGxvbmcgbnVtRWxlbXNJbks7CiAKQEAgLTY3LDYgKzY1LDggQEAKIAogICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciB0ZXN0VmFsID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW10geyAwLCAxfSk7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCbG9vbUZpbHRlclNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IEJsb29tRmlsdGVyU2VyaWFsaXplci5mb3JWZXJzaW9uKGZhbHNlKTsKKwogICAgIEBCZW5jaG1hcmsKICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemF0aW9uVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKQEAgLTc1LDE2ICs3NSwxNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBCbG9vbUZpbHRlciBmaWx0ZXIgPSAoQmxvb21GaWx0ZXIpIEZpbHRlckZhY3RvcnkuZ2V0RmlsdGVyKG51bUVsZW1zSW5LICogMTAyNCwgMC4wMWQpOwogICAgICAgICAgICAgZmlsdGVyLmFkZCh3cmFwKHRlc3RWYWwpKTsKLSAgICAgICAgICAgIERhdGFPdXRwdXRTdHJlYW1QbHVzIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtUGx1cyhmaWxlKTsKKyAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW1QbHVzIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtUGx1cyhmaWxlKTsKICAgICAgICAgICAgIGlmIChvbGRCZkZvcm1hdCkKICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uc1Rlc3Quc2VyaWFsaXplT2xkQmZGb3JtYXQoZmlsdGVyLCBvdXQpOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIEJsb29tRmlsdGVyU2VyaWFsaXplci5zZXJpYWxpemUoZmlsdGVyLCBvdXQpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGZpbHRlciwgb3V0KTsKICAgICAgICAgICAgIG91dC5jbG9zZSgpOwogICAgICAgICAgICAgZmlsdGVyLmNsb3NlKCk7CiAKICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbVBsdXMgaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtUGx1cyhmaWxlKTsKLSAgICAgICAgICAgIEJsb29tRmlsdGVyIGZpbHRlcjIgPSBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIG9sZEJmRm9ybWF0KTsKKyAgICAgICAgICAgIEJsb29tRmlsdGVyIGZpbHRlcjIgPSBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZm9yVmVyc2lvbihvbGRCZkZvcm1hdCkuZGVzZXJpYWxpemUoaW4pOwogICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShpbik7CiAgICAgICAgICAgICBmaWx0ZXIyLmNsb3NlKCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvQ2FjaGVMb2FkZXJCZW5jaC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9DYWNoZUxvYWRlckJlbmNoLmphdmEKaW5kZXggZGU3ODhiNy4uYWZhZmFkNiAxMDA2NDQKLS0tIGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9DYWNoZUxvYWRlckJlbmNoLmphdmEKKysrIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9DYWNoZUxvYWRlckJlbmNoLmphdmEKQEAgLTI1LDE1ICsyNSwyMSBAQAogCiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkF1dG9TYXZpbmdDYWNoZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5LZXlDYWNoZUtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQXNjaWlUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQWJzdHJhY3RSb3dJbmRleEVudHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2FjaGVTZXJ2aWNlOwpAQCAtNDUsNiArNTEsNyBAQAogaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5NZWFzdXJlbWVudDsKIGltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTW9kZTsKIGltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuT3V0cHV0VGltZVVuaXQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlBhcmFtOwogaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TY29wZTsKIGltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2V0dXA7CiBpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlN0YXRlOwpAQCAtNTUsMjQgKzYyLDQwIEBACiBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKIEBCZW5jaG1hcmtNb2RlKE1vZGUuU2FtcGxlVGltZSkKIEBPdXRwdXRUaW1lVW5pdChUaW1lVW5pdC5NSUxMSVNFQ09ORFMpCi1AV2FybXVwKGl0ZXJhdGlvbnMgPSAxLCB0aW1lID0gMSwgdGltZVVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTKQotQE1lYXN1cmVtZW50KGl0ZXJhdGlvbnMgPSAyLCB0aW1lID0gMiwgdGltZVVuaXQgPSBUaW1lVW5pdC5TRUNPTkRTKQorQFdhcm11cChpdGVyYXRpb25zID0gMSwgdGltZSA9IDUsIHRpbWVVbml0ID0gVGltZVVuaXQuU0VDT05EUykKK0BNZWFzdXJlbWVudChpdGVyYXRpb25zID0gMSwgdGltZSA9IDEwLCB0aW1lVW5pdCA9IFRpbWVVbml0LlNFQ09ORFMpCiBARm9yayh2YWx1ZSA9IDEpCiBAVGhyZWFkcygxKQogQFN0YXRlKFNjb3BlLkJlbmNobWFyaykKLXB1YmxpYyBjbGFzcyBDYWNoZUxvYWRlckJlbmNoIGV4dGVuZHMgQ1FMVGVzdGVyCitwdWJsaWMgY2xhc3MgQ2FjaGVMb2FkZXJCZW5jaAogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBudW1TU1RhYmxlcyA9IDEwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG51bVNTVGFibGVzID0gMTAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBudW1LZXlzUGVyVGFibGUgPSAxMDAwMDsKKwogICAgIHByaXZhdGUgZmluYWwgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKIAorICAgIEBQYXJhbSh7ICJ0cnVlIiwgImZhbHNlIiB9KQorICAgIGJvb2xlYW4gdXNlVVVJREdlbmVyYXRpb25JZGVudGlmaWVyczsKKwogICAgIEBTZXR1cChMZXZlbC5UcmlhbCkKICAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7Ci0gICAgICAgIENRTFRlc3Rlci5wcmVwYXJlU2VydmVyKCk7Ci0gICAgICAgIFN0cmluZyBrZXlzcGFjZSA9IGNyZWF0ZUtleXNwYWNlKCJDUkVBVEUgS0VZU1BBQ0UgJXMgd2l0aCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogMSB9IGFuZCBkdXJhYmxlX3dyaXRlcyA9IGZhbHNlIik7Ci0gICAgICAgIFN0cmluZyB0YWJsZTEgPSBjcmVhdGVUYWJsZShrZXlzcGFjZSwgIkNSRUFURSBUQUJMRSAlcyAoa2V5IHRleHQgUFJJTUFSWSBLRVksIHZhbCB0ZXh0KSIpOwotICAgICAgICBTdHJpbmcgdGFibGUyID0gY3JlYXRlVGFibGUoa2V5c3BhY2UsICJDUkVBVEUgVEFCTEUgJXMgKGtleSB0ZXh0IFBSSU1BUlkgS0VZLCB2YWwgdGV4dCkiKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCgpIC0+IHsKKyAgICAgICAgICAgIENvbmZpZyBjb25maWcgPSBEYXRhYmFzZURlc2NyaXB0b3IubG9hZENvbmZpZygpOworICAgICAgICAgICAgY29uZmlnLmtleV9jYWNoZV9zaXplID0gbmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nTWViaWJ5dGVzQm91bmQoMjU2KTsKKyAgICAgICAgICAgIGNvbmZpZy51dWlkX3NzdGFibGVfaWRlbnRpZmllcnNfZW5hYmxlZCA9IHVzZVVVSURHZW5lcmF0aW9uSWRlbnRpZmllcnM7CisgICAgICAgICAgICBjb25maWcuZHVtcF9oZWFwX29uX3VuY2F1Z2h0X2V4Y2VwdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgfSk7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5wcmVwYXJlU2VydmVyKCk7CiAKKyAgICAgICAgU3RyaW5nIGtleXNwYWNlID0gImtzIjsKKyAgICAgICAgU3RyaW5nIHRhYmxlMSA9ICJ0YWIxIjsKKyAgICAgICAgU3RyaW5nIHRhYmxlMiA9ICJ0YWIyIjsKKworICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIEtFWVNQQUNFICVzIHdpdGggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJyA6IDEgfSBhbmQgZHVyYWJsZV93cml0ZXMgPSBmYWxzZSIsIGtleXNwYWNlKSk7CisgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJDUkVBVEUgVEFCTEUgJXMuJXMgKGtleSB0ZXh0IFBSSU1BUlkgS0VZLCB2YWwgdGV4dCkiLCBrZXlzcGFjZSwgdGFibGUxKSk7CisgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJDUkVBVEUgVEFCTEUgJXMuJXMgKGtleSB0ZXh0IFBSSU1BUlkgS0VZLCB2YWwgdGV4dCkiLCBrZXlzcGFjZSwgdGFibGUyKSk7CiAKICAgICAgICAgS2V5c3BhY2Uuc3lzdGVtKCkuZm9yRWFjaChrIC0+IGsuZ2V0Q29sdW1uRmFtaWx5U3RvcmVzKCkuZm9yRWFjaChDb2x1bW5GYW1pbHlTdG9yZTo6ZGlzYWJsZUF1dG9Db21wYWN0aW9uKSk7CiAKQEAgLTg3LDE2ICsxMTAsMTggQEAKICAgICAgICAgY29sdW1uRmFtaWx5U3RvcmVzLmFkZChjZnMxKTsKICAgICAgICAgY29sdW1uRmFtaWx5U3RvcmVzLmFkZChjZnMyKTsKIAotICAgICAgICBsb2dnZXIuaW5mbygiQ3JlYXRpbmcge30gc3N0YWJsZXMiLCBudW1TU1RhYmxlcyk7CiAgICAgICAgIGZvciAoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOiBjb2x1bW5GYW1pbHlTdG9yZXMpCiAgICAgICAgIHsKICAgICAgICAgICAgIGNmcy50cnVuY2F0ZUJsb2NraW5nKCk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNTVGFibGVzIDsgaSsrKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhIGNvbERlZiA9IENvbHVtbk1ldGFkYXRhLnJlZ3VsYXJDb2x1bW4oY2ZzLm1ldGFkYXRhKCksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJ2YWwiKSwgQXNjaWlUeXBlLmluc3RhbmNlKTsKLSAgICAgICAgICAgICAgICBSb3dVcGRhdGVCdWlsZGVyIHJvd0J1aWxkZXIgPSBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyByYW5kb20ubmV4dEludCgpLCAia2V5Iik7Ci0gICAgICAgICAgICAgICAgcm93QnVpbGRlci5hZGQoY29sRGVmLCAidmFsMSIpOwotICAgICAgICAgICAgICAgIHJvd0J1aWxkZXIuYnVpbGQoKS5hcHBseSgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbnVtS2V5c1BlclRhYmxlOyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBSb3dVcGRhdGVCdWlsZGVyIHJvd0J1aWxkZXIgPSBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyByYW5kb20ubmV4dEludCgpLCAia2V5IiArIGspOworICAgICAgICAgICAgICAgICAgICByb3dCdWlsZGVyLmFkZChjb2xEZWYsICJ2YWwxIik7CisgICAgICAgICAgICAgICAgICAgIHJvd0J1aWxkZXIuYnVpbGQoKS5hcHBseSgpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjZnMuZm9yY2VCbG9ja2luZ0ZsdXNoKENvbHVtbkZhbWlseVN0b3JlLkZsdXNoUmVhc29uLlVTRVJfRk9SQ0VEKTsKICAgICAgICAgICAgIH0KIApAQCAtMTA0LDEwICsxMjksMTUgQEAKIAogICAgICAgICAgICAgLy8gcHJlaGVhdCBrZXkgY2FjaGUKICAgICAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogY2ZzLmdldExpdmVTU1RhYmxlcygpKQotICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oVXRpbC5kaygia2V5IiksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgbnVtS2V5c1BlclRhYmxlOyBrKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKFV0aWwuZGsoImtleSIgKyBrKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5PiBrZXlDYWNoZSA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZTsKKyAgICAgICAgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBBYnN0cmFjdFJvd0luZGV4RW50cnk+IGtleUNhY2hlID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlOwogCiAgICAgICAgIC8vIHNlcmlhbGl6ZSB0byBmaWxlCiAgICAgICAgIGtleUNhY2hlLnN1Ym1pdFdyaXRlKGtleUNhY2hlLnNpemUoKSkuZ2V0KCk7CkBAIC0xMTYsMjEgKzE0NiwyMiBAQAogICAgIEBTZXR1cChMZXZlbC5JbnZvY2F0aW9uKQogICAgIHB1YmxpYyB2b2lkIHNldHVwS2V5Q2FjaGUoKQogICAgIHsKLSAgICAgICAgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5PiBrZXlDYWNoZSA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZTsKKyAgICAgICAgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBBYnN0cmFjdFJvd0luZGV4RW50cnk+IGtleUNhY2hlID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlOwogICAgICAgICBrZXlDYWNoZS5jbGVhcigpOwogICAgIH0KIAogICAgIEBUZWFyRG93bihMZXZlbC5UcmlhbCkKICAgICBwdWJsaWMgdm9pZCB0ZWFyZG93bigpCiAgICAgewotICAgICAgICBDUUxUZXN0ZXIuY2xlYW51cCgpOwogICAgICAgICBDUUxUZXN0ZXIudGVhckRvd25DbGFzcygpOworICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RvcFVuc2FmZSh0cnVlKTsKKyAgICAgICAgQ1FMVGVzdGVyLmNsZWFudXAoKTsKICAgICB9CiAKICAgICBAQmVuY2htYXJrCiAgICAgcHVibGljIHZvaWQga2V5Q2FjaGVMb2FkVGVzdCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7Ci0gICAgICAgIEF1dG9TYXZpbmdDYWNoZTxLZXlDYWNoZUtleSwgUm93SW5kZXhFbnRyeT4ga2V5Q2FjaGUgPSBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGU7CisgICAgICAgIEF1dG9TYXZpbmdDYWNoZTxLZXlDYWNoZUtleSwgQWJzdHJhY3RSb3dJbmRleEVudHJ5PiBrZXlDYWNoZSA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZTsKIAogICAgICAgICBrZXlDYWNoZS5sb2FkU2F2ZWRBc3luYygpLmdldCgpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvQ2FjaGluZ0JlbmNoVGVzdC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9DYWNoaW5nQmVuY2hUZXN0LmphdmEKaW5kZXggYzU4OWNhNS4uYjFmODg3MCAxMDA2NDQKLS0tIGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9DYWNoaW5nQmVuY2hUZXN0LmphdmEKKysrIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9DYWNoaW5nQmVuY2hUZXN0LmphdmEKQEAgLTI5LDE1ICsyOSwxNCBAQAogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLQoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkNodW5rQ2FjaGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZy5Db21taXRMb2dTeW5jOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcuRGlza0FjY2Vzc01vZGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQ2h1bmtDYWNoZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKQEAgLTIwMSw3ICsyMDAsNyBAQAogICAgIHsKICAgICAgICAgaWQuc2V0KDApOwogICAgICAgICBjb21wYWN0aW9uVGltZU5hbm9zID0gMDsKLSAgICAgICAgQ2h1bmtDYWNoZS5pbnN0YW5jZS5lbmFibGUoY2FjaGVFbmFibGVkKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldEZpbGVDYWNoZUVuYWJsZWQoY2FjaGVFbmFibGVkKTsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldERpc2tBY2Nlc3NNb2RlKG1vZGUpOwogICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBXSVRIIGNvbXBhY3Rpb24gPSB7ICdjbGFzcycgOiAgJyIgKyBjb21wYWN0aW9uQ2xhc3MgKyAiJyAgfTsiKTsKICAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgV0lUSCBjb21wcmVzc2lvbiA9IHsgJ3NzdGFibGVfY29tcHJlc3Npb24nIDogJyIgKyBjb21wcmVzc29yQ2xhc3MgKyAiJyAgfTsiKTsKQEAgLTM4NSw0ICszODQsNCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBpbnN0YW5jZXM7CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvTWV0YWRhdGFDb2xsZWN0b3JCZW5jaC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9NZXRhZGF0YUNvbGxlY3RvckJlbmNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjZmZhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvTWV0YWRhdGFDb2xsZWN0b3JCZW5jaC5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRlc3QubWljcm9iZW5jaDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdCb3VuZGFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4LktpbmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Mb25nVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJ1ZmZlckNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5qY3Rvb2xzLnV0aWwuUG93MjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuKjsKKworQEJlbmNobWFya01vZGUoTW9kZS5BdmVyYWdlVGltZSkKK0BPdXRwdXRUaW1lVW5pdChUaW1lVW5pdC5OQU5PU0VDT05EUykKK0BXYXJtdXAoaXRlcmF0aW9ucyA9IDEwLCB0aW1lID0gMSkKK0BNZWFzdXJlbWVudChpdGVyYXRpb25zID0gMTAsIHRpbWUgPSAxKQorQEZvcmsoMSkKK0BTdGF0ZShTY29wZS5CZW5jaG1hcmspCitwdWJsaWMgY2xhc3MgTWV0YWRhdGFDb2xsZWN0b3JCZW5jaAoreworICAgIEBQYXJhbSh7ICIxMCIgfSkKKyAgICBpbnQgY2x1c3RlcmluZ0tleU51bTsKKworICAgIEBQYXJhbSh7ICIxMDAwMCIgfSkKKyAgICBpbnQgZGF0YXNldFNpemU7CisgICAgaW50IGRhdHVtSW5kZXg7CisgICAgQ2VsbDw/PltdIGNlbGxzOworICAgIENsdXN0ZXJpbmc8Pz5bXSBjbHVzdGVyaW5nczsKKyAgICBDbHVzdGVyaW5nQm91bmQ8Pz5bXSBjbHVzdGVyaW5nQm91bmRzOworICAgIENsdXN0ZXJpbmdCb3VuZGFyeTw/PltdIGNsdXN0ZXJpbmdCb3VuZGFyaWVzOworICAgIE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvcjsKKworICAgIEBTZXR1cAorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkKKyAgICB7CisgICAgICAgIFRhYmxlTWV0YWRhdGEuQnVpbGRlciB0YWJsZU1ldGFkYXRhQnVpbGRlciA9IFRhYmxlTWV0YWRhdGEuYnVpbGRlcigiayIsICJ0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQYXJ0aXRpb25LZXlDb2x1bW4oInBrIiwgTG9uZ1R5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbigicmMiLCBMb25nVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2x1c3RlcmluZ0tleU51bTsgaSsrKQorICAgICAgICAgICAgdGFibGVNZXRhZGF0YUJ1aWxkZXIuYWRkQ2x1c3RlcmluZ0NvbHVtbigiY2siICsgaSwgTG9uZ1R5cGUuaW5zdGFuY2UpOworICAgICAgICBUYWJsZU1ldGFkYXRhIHRhYmxlTWV0YWRhdGEgPSB0YWJsZU1ldGFkYXRhQnVpbGRlci5idWlsZCgpOworICAgICAgICBjb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IodGFibGVNZXRhZGF0YS5jb21wYXJhdG9yKTsKKworICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW5NZXRhZGF0YSA9IHRhYmxlTWV0YWRhdGEucmVndWxhckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgVGhyZWFkTG9jYWxSYW5kb20gY3VycmVudCA9IFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKTsKKyAgICAgICAgZGF0YXNldFNpemUgPSBQb3cyLnJvdW5kVG9Qb3dlck9mVHdvKGRhdGFzZXRTaXplKTsKKyAgICAgICAgY2VsbHMgPSBuZXcgQ2VsbFtkYXRhc2V0U2l6ZV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YXNldFNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY2VsbHNbaV0gPSBuZXcgQnVmZmVyQ2VsbChjb2x1bW5NZXRhZGF0YSwgY3VycmVudC5uZXh0TG9uZygwLCBMb25nLk1BWF9WQUxVRSksIGN1cnJlbnQubmV4dEludCgxLCBJbnRlZ2VyLk1BWF9WQUxVRSksIENlbGwuTk9fREVMRVRJT05fVElNRSwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgY2x1c3RlcmluZ3MgPSBuZXcgQ2x1c3RlcmluZ1tkYXRhc2V0U2l6ZV07CisgICAgICAgIGNsdXN0ZXJpbmdCb3VuZHMgPSBuZXcgQ2x1c3RlcmluZ0JvdW5kW2RhdGFzZXRTaXplXTsKKyAgICAgICAgY2x1c3RlcmluZ0JvdW5kYXJpZXMgPSBuZXcgQ2x1c3RlcmluZ0JvdW5kYXJ5W2RhdGFzZXRTaXplXTsKKyAgICAgICAgQnl0ZUJ1ZmZlcltdIGNrcyA9IG5ldyBCeXRlQnVmZmVyW2NsdXN0ZXJpbmdLZXlOdW1dOworICAgICAgICBLaW5kW10gY2x1c3RlcmluZ0JvdW5kS2luZHMgPSBuZXcgS2luZFtdeyBLaW5kLklOQ0xfU1RBUlRfQk9VTkQsIEtpbmQuSU5DTF9FTkRfQk9VTkQsIEtpbmQuRVhDTF9TVEFSVF9CT1VORCwgS2luZC5FWENMX0VORF9CT1VORCB9OworICAgICAgICBLaW5kW10gY2x1c3RlcmluZ0JvdW5kYXJ5S2luZHMgPSBuZXcgS2luZFtdeyBLaW5kLklOQ0xfRU5EX0VYQ0xfU1RBUlRfQk9VTkRBUlksIEtpbmQuRVhDTF9FTkRfSU5DTF9TVEFSVF9CT1VOREFSWSB9OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFzZXRTaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2x1c3RlcmluZ0tleU51bTsgaisrKQorICAgICAgICAgICAgICAgIGNrc1tqXSA9IExvbmdUeXBlLmluc3RhbmNlLmRlY29tcG9zZShjdXJyZW50Lm5leHRMb25nKCkpOworICAgICAgICAgICAgY2x1c3RlcmluZ3NbaV0gPSBDbHVzdGVyaW5nLm1ha2UoQXJyYXlzLmNvcHlPZihja3MsIGNrcy5sZW5ndGgpKTsKKyAgICAgICAgICAgIGNsdXN0ZXJpbmdCb3VuZHNbaV0gPSBDbHVzdGVyaW5nQm91bmQuY3JlYXRlKGNsdXN0ZXJpbmdCb3VuZEtpbmRzW2kgJSBjbHVzdGVyaW5nQm91bmRLaW5kcy5sZW5ndGhdLCBjbHVzdGVyaW5nc1tpXSk7CisgICAgICAgICAgICBjbHVzdGVyaW5nQm91bmRhcmllc1tpXSA9IENsdXN0ZXJpbmdCb3VuZGFyeS5jcmVhdGUoY2x1c3RlcmluZ0JvdW5kYXJ5S2luZHNbaSAlIGNsdXN0ZXJpbmdCb3VuZGFyeUtpbmRzLmxlbmd0aF0sIGNsdXN0ZXJpbmdzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5nYygpOworICAgICAgICAvLyBzaHVmZmxlIGFycmF5IGNvbnRlbnRzIHRvIGVuc3VyZSBhIG1vcmUgJ25hdHVyYWwnIGxheW91dAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFzZXRTaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0byA9IGN1cnJlbnQubmV4dEludCgwLCBkYXRhc2V0U2l6ZSk7CisgICAgICAgICAgICBDZWxsPD8+IHRlbXAgPSBjZWxsc1tpXTsKKyAgICAgICAgICAgIGNlbGxzW2ldID0gY2VsbHNbdG9dOworICAgICAgICAgICAgY2VsbHNbdG9dID0gdGVtcDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YXNldFNpemU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRvID0gY3VycmVudC5uZXh0SW50KDAsIGRhdGFzZXRTaXplKTsKKyAgICAgICAgICAgIENsdXN0ZXJpbmc8Pz4gdGVtcCA9IGNsdXN0ZXJpbmdzW2ldOworICAgICAgICAgICAgY2x1c3RlcmluZ3NbaV0gPSBjbHVzdGVyaW5nc1t0b107CisgICAgICAgICAgICBjbHVzdGVyaW5nc1t0b10gPSB0ZW1wOworICAgICAgICB9CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUNlbGwoKQorICAgIHsKKyAgICAgICAgY29sbGVjdG9yLnVwZGF0ZShuZXh0Q2VsbCgpKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgdXBkYXRlQ2x1c3RlcmluZygpCisgICAgeworICAgICAgICBjb2xsZWN0b3IudXBkYXRlQ2x1c3RlcmluZ1ZhbHVlcyhuZXh0Q2x1c3RlcmluZygpKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgdXBkYXRlQ2x1c3RlcmluZ0JvdW5kKCkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rvci51cGRhdGVDbHVzdGVyaW5nVmFsdWVzQnlCb3VuZE9yQm91bmRhcnkobmV4dENsdXN0ZXJpbmdCb3VuZCgpKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgdXBkYXRlQ2x1c3RlcmluZ0JvdW5kYXJ5KCkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rvci51cGRhdGVDbHVzdGVyaW5nVmFsdWVzQnlCb3VuZE9yQm91bmRhcnkobmV4dENsdXN0ZXJpbmdCb3VuZGFyeSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2VsbDw/PiBuZXh0Q2VsbCgpCisgICAgeworICAgICAgICByZXR1cm4gY2VsbHNbZGF0dW1JbmRleCsrICYgKGNlbGxzLmxlbmd0aCAtIDEpXTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2x1c3RlcmluZzw/PiBuZXh0Q2x1c3RlcmluZygpCisgICAgeworICAgICAgICByZXR1cm4gY2x1c3RlcmluZ3NbZGF0dW1JbmRleCsrICYgKGNsdXN0ZXJpbmdzLmxlbmd0aCAtIDEpXTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2x1c3RlcmluZ0JvdW5kPD8+IG5leHRDbHVzdGVyaW5nQm91bmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNsdXN0ZXJpbmdCb3VuZHNbZGF0dW1JbmRleCsrICYgKGNsdXN0ZXJpbmdCb3VuZHMubGVuZ3RoIC0gMSldOworICAgIH0KKworICAgIHB1YmxpYyBDbHVzdGVyaW5nQm91bmRhcnk8Pz4gbmV4dENsdXN0ZXJpbmdCb3VuZGFyeSgpCisgICAgeworICAgICAgICByZXR1cm4gY2x1c3RlcmluZ0JvdW5kYXJpZXNbZGF0dW1JbmRleCsrICYgKGNsdXN0ZXJpbmdCb3VuZGFyaWVzLmxlbmd0aCAtIDEpXTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9WSW50Q29kaW5nQmVuY2guamF2YSBiL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvVkludENvZGluZ0JlbmNoLmphdmEKaW5kZXggOWM4MjIzNi4uYTYwZDlmMiAxMDA2NDQKLS0tIGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9WSW50Q29kaW5nQmVuY2guamF2YQorKysgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL1ZJbnRDb2RpbmdCZW5jaC5qYXZhCkBAIC0xOCw2ICsxOCwxMiBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRlc3QubWljcm9iZW5jaDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQnVmZmVyZWREYXRhT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZzsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuKjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguaW5mcmEuQmxhY2tob2xlOworCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOwpAQCAtMjgsMjMgKzM0LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5CdWZmZXJlZERhdGFPdXRwdXRTdHJlYW1QbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMudmludC5WSW50Q29kaW5nOwotaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5CZW5jaG1hcms7Ci1pbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkJlbmNobWFya01vZGU7Ci1pbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkZvcms7Ci1pbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk1lYXN1cmVtZW50OwotaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5Nb2RlOwotaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5PdXRwdXRUaW1lVW5pdDsKLWltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuUGFyYW07Ci1pbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlNjb3BlOwotaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TdGF0ZTsKLWltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuVGVhckRvd247Ci1pbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlRocmVhZHM7Ci1pbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLldhcm11cDsKLWltcG9ydCBvcmcub3Blbmpkay5qbWguaW5mcmEuQmxhY2tob2xlOwotCiBAQmVuY2htYXJrTW9kZShNb2RlLkF2ZXJhZ2VUaW1lKQogQE91dHB1dFRpbWVVbml0KFRpbWVVbml0Lk5BTk9TRUNPTkRTKQogQFdhcm11cChpdGVyYXRpb25zID0gNSwgdGltZSA9IDEsIHRpbWVVbml0ID0gVGltZVVuaXQuU0VDT05EUykKZGlmZiAtLWdpdCBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvWmVyb0NvcHlTdHJlYW1pbmdCZW5jaG1hcmsuamF2YSBiL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvWmVyb0NvcHlTdHJlYW1pbmdCZW5jaG1hcmsuamF2YQppbmRleCBiNWJiNDBjLi41OWFjZmM2IDEwMDY0NAotLS0gYS90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL1plcm9Db3B5U3RyZWFtaW5nQmVuY2htYXJrLmphdmEKKysrIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9aZXJvQ29weVN0cmVhbWluZ0JlbmNobWFyay5qYXZhCkBAIC01NCw3ICs1NCw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LkFzeW5jU3RyZWFtaW5nT3V0cHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ2FjaGluZ1BhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLmFzeW5jLk5ldHR5U3RyZWFtaW5nQ29ubmVjdGlvbkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlByZXZpZXdLaW5kOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TZXNzaW9uSW5mbzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtQ29vcmRpbmF0b3I7CkBAIC02Myw2ICs2Miw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVJlc3VsdEZ1dHVyZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtU2Vzc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtU3VtbWFyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuYXN5bmMuTmV0dHlTdHJlYW1pbmdDb25uZWN0aW9uRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcubWVzc2FnZXMuU3RyZWFtTWVzc2FnZUhlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKQEAgLTEzNCw3ICsxMzQsNiBAQAogCiAgICAgICAgICAgICBDYXNzYW5kcmFTdHJlYW1IZWFkZXIgZW50aXJlU1NUYWJsZVN0cmVhbUhlYWRlciA9CiAgICAgICAgICAgICAgICAgQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyLmJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZUZvcm1hdChzc3RhYmxlLmRlc2NyaXB0b3IuZm9ybWF0VHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVWZXJzaW9uKHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZUxldmVsKDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhFc3RpbWF0ZWRLZXlzKHNzdGFibGUuZXN0aW1hdGVkS2V5cygpKQpAQCAtMTU0LDcgKzE1Myw2IEBACiAgICAgICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gcmVxdWVzdGVkUmFuZ2VzID0gQXJyYXlzLmFzTGlzdChuZXcgUmFuZ2U8Pihzc3RhYmxlLmZpcnN0Lm1pblZhbHVlKCkuZ2V0VG9rZW4oKSwgc3N0YWJsZS5sYXN0LmdldFRva2VuKCkpKTsKICAgICAgICAgICAgIENhc3NhbmRyYVN0cmVhbUhlYWRlciBwYXJ0aWFsU1NUYWJsZVN0cmVhbUhlYWRlciA9CiAgICAgICAgICAgICBDYXNzYW5kcmFTdHJlYW1IZWFkZXIuYnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVGb3JtYXQoc3N0YWJsZS5kZXNjcmlwdG9yLmZvcm1hdFR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVWZXJzaW9uKHNzdGFibGUuZGVzY3JpcHRvci52ZXJzaW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlTGV2ZWwoMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRXN0aW1hdGVkS2V5cyhzc3RhYmxlLmVzdGltYXRlZEtleXMoKSkKQEAgLTIyMSw3ICsyMTksNyBAQAogICAgICAgICAgICAgU3RyZWFtUmVzdWx0RnV0dXJlIGZ1dHVyZSA9IFN0cmVhbVJlc3VsdEZ1dHVyZS5jcmVhdGVJbml0aWF0b3IobmV4dFRpbWVVVUlEKCksIFN0cmVhbU9wZXJhdGlvbi5CT09UU1RSQVAsIENvbGxlY3Rpb25zLjxTdHJlYW1FdmVudEhhbmRsZXI+ZW1wdHlMaXN0KCksIHN0cmVhbUNvb3JkaW5hdG9yKTsKIAogICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IHBlZXIgPSBGQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydCgpOwotICAgICAgICAgICAgc3RyZWFtQ29vcmRpbmF0b3IuYWRkU2Vzc2lvbkluZm8obmV3IFNlc3Npb25JbmZvKHBlZXIsIDAsIHBlZXIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgU3RyZWFtU2Vzc2lvbi5TdGF0ZS5JTklUSUFMSVpFRCkpOworICAgICAgICAgICAgc3RyZWFtQ29vcmRpbmF0b3IuYWRkU2Vzc2lvbkluZm8obmV3IFNlc3Npb25JbmZvKHBlZXIsIDAsIHBlZXIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgU3RyZWFtU2Vzc2lvbi5TdGF0ZS5JTklUSUFMSVpFRCwgbnVsbCkpOwogCiAgICAgICAgICAgICBTdHJlYW1TZXNzaW9uIHNlc3Npb24gPSBzdHJlYW1Db29yZGluYXRvci5nZXRPckNyZWF0ZU91dGJvdW5kU2Vzc2lvbihwZWVyKTsKICAgICAgICAgICAgIHNlc3Npb24uaW5pdChmdXR1cmUpOwpkaWZmIC0tZ2l0IGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9idHJlZS9BdG9taWNCVHJlZVBhcnRpdGlvblVwZGF0ZUJlbmNoLmphdmEgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2J0cmVlL0F0b21pY0JUcmVlUGFydGl0aW9uVXBkYXRlQmVuY2guamF2YQppbmRleCAzNGVjMjlhLi43MDgzODMyIDEwMDY0NAotLS0gYS90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2J0cmVlL0F0b21pY0JUcmVlUGFydGl0aW9uVXBkYXRlQmVuY2guamF2YQorKysgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2J0cmVlL0F0b21pY0JUcmVlUGFydGl0aW9uVXBkYXRlQmVuY2guamF2YQpAQCAtNTAsOCArNTAsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQ29tcG9zaXRlVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLk1hcFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5BYnN0cmFjdEJUcmVlUGFydGl0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuQXRvbWljQlRyZWVQYXJ0aXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5CVHJlZVBhcnRpdGlvbkRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25VcGRhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5CVHJlZVJvdzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJ1ZmZlckNlbGw7CkBAIC0yNDAsNyArMjQwLDcgQEAKICAgICAgICAgICAgIHRyeSAoQnVsa0l0ZXJhdG9yPFJvdz4gaXRlciA9IEJ1bGtJdGVyYXRvci5vZihpbnNlcnRCdWZmZXIpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIE9iamVjdFtdIHRyZWUgPSBCVHJlZS5idWlsZChpdGVyLCByb3dDb3VudCwgVXBkYXRlRnVuY3Rpb24ubm9PcCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUGFydGl0aW9uVXBkYXRlLnVuc2FmZUNvbnN0cnVjdChtZXRhZGF0YSwgZGVjb3JhdGVkS2V5LCBBYnN0cmFjdEJUcmVlUGFydGl0aW9uLnVuc2FmZUNvbnN0cnVjdEhvbGRlcihwYXJ0aXRpb25Db2x1bW5zLCB0cmVlLCBEZWxldGlvbkluZm8uTElWRSwgUm93cy5FTVBUWV9TVEFUSUNfUk9XLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKSwgTk9fREVMRVRJT05fSU5GTywgZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybiBQYXJ0aXRpb25VcGRhdGUudW5zYWZlQ29uc3RydWN0KG1ldGFkYXRhLCBkZWNvcmF0ZWRLZXksIEJUcmVlUGFydGl0aW9uRGF0YS51bnNhZmVDb25zdHJ1Y3QocGFydGl0aW9uQ29sdW1ucywgdHJlZSwgRGVsZXRpb25JbmZvLkxJVkUsIFJvd3MuRU1QVFlfU1RBVElDX1JPVywgRW5jb2RpbmdTdGF0cy5OT19TVEFUUyksIE5PX0RFTEVUSU9OX0lORk8sIGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zNDIsMTIgKzM0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBhbGxvY2F0ZShpbnQgc2l6ZSkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW52YWxpZGF0ZU9uID4gMCAmJiAtLWludmFsaWRhdGVPbiA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RCVHJlZVBhcnRpdGlvbi5Ib2xkZXIgaG9sZGVyID0gdXBkYXRlLnVuc2FmZUdldEhvbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUJUcmVlLmlzRW1wdHkoaG9sZGVyLnRyZWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnVuc2FmZVNldEhvbGRlcihBYnN0cmFjdEJUcmVlUGFydGl0aW9uLnVuc2FmZUNvbnN0cnVjdEhvbGRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIuY29sdW1ucywgQXJyYXlzLmNvcHlPZihob2xkZXIudHJlZSwgaG9sZGVyLnRyZWUubGVuZ3RoKSwgaG9sZGVyLmRlbGV0aW9uSW5mbywgaG9sZGVyLnN0YXRpY1JvdywgaG9sZGVyLnN0YXRzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVHJlZVBhcnRpdGlvbkRhdGEudW5zYWZlSW52YWxpZGF0ZSh1cGRhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyLmFsbG9jYXRlKHNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMzk3LDcgKzM5Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCkubmV4dExvbmcoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW52b2tlQmVmb3JlLmFjY2VwdCh0aGlzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUuYWRkQWxsV2l0aFNpemVEZWx0YShpbnNlcnRbaW5kZXhdLCBjbG9uZXIsIE5PX09SREVSLmdldEN1cnJlbnQoKSwgVXBkYXRlVHJhbnNhY3Rpb24uTk9fT1ApOworICAgICAgICAgICAgICAgIHVwZGF0ZS5hZGRBbGwoaW5zZXJ0W2luZGV4XSwgY2xvbmVyLCBOT19PUkRFUi5nZXRDdXJyZW50KCksIFVwZGF0ZVRyYW5zYWN0aW9uLk5PX09QKTsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZpbmFsbHkKQEAgLTQwNSw3ICs0MDAsNyBAQAogICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5hZGRBbmRHZXQoMHgxMDAwMDBMKSA9PSAoKCgobG9uZylpZkdlbmVyYXRpb24pIDw8IDQwKSB8ICgoKGxvbmcpaW5zZXJ0Lmxlbmd0aCkgPDwgMjApIHwgaW5zZXJ0Lmxlbmd0aCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBhY3RpdmVUaHJlYWRzLnNldCgwKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlLnVuc2FmZVNldEhvbGRlcihBYnN0cmFjdEJUcmVlUGFydGl0aW9uLnVuc2FmZUdldEVtcHR5SG9sZGVyKCkpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGUudW5zYWZlU2V0SG9sZGVyKEJUcmVlUGFydGl0aW9uRGF0YS51bnNhZmVHZXRFbXB0eSgpKTsKICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdGhlIHN0YXRlIGFuZCByb2xsb3ZlciB0aGUgZ2VuZXJhdGlvbgogICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zZXQoKGlmR2VuZXJhdGlvbiArIDFMKSA8PCA0MCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNTY2LDcgKzU2MSwxMyBAQAogICAgIHByaXZhdGUgc3RhdGljIENvbHVtbk1ldGFkYXRhW10gY29sdW1ucyhBYnN0cmFjdFR5cGU8Pz4gdHlwZSwgQ29sdW1uTWV0YWRhdGEuS2luZCBraW5kLCBpbnQgY291bnQsIFN0cmluZyBwcmVmaXgpCiAgICAgewogICAgICAgICByZXR1cm4gSW50U3RyZWFtLnJhbmdlKDAsIGNvdW50KQotICAgICAgICAgICAgICAgICAgICAgICAgLm1hcFRvT2JqKGkgLT4gbmV3IENvbHVtbk1ldGFkYXRhKCIiLCAiIiwgbmV3IENvbHVtbklkZW50aWZpZXIocHJlZml4ICsgaSwgdHJ1ZSksIHR5cGUsIGtpbmQgIT0gQ29sdW1uTWV0YWRhdGEuS2luZC5SRUdVTEFSID8gaSA6IENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLCBraW5kKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBUb09iaihpIC0+IG5ldyBDb2x1bW5NZXRhZGF0YSgiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29sdW1uSWRlbnRpZmllcihwcmVmaXggKyBpLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgIT0gQ29sdW1uTWV0YWRhdGEuS2luZC5SRUdVTEFSID8gaSA6IENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAudG9BcnJheShDb2x1bW5NZXRhZGF0YVtdOjpuZXcpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9idHJlZS9CVHJlZVRyYW5zZm9ybUJlbmNoLmphdmEgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2J0cmVlL0JUcmVlVHJhbnNmb3JtQmVuY2guamF2YQppbmRleCA0ZjJmYTc4Li5hNDU5MzE2IDEwMDY0NAotLS0gYS90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2J0cmVlL0JUcmVlVHJhbnNmb3JtQmVuY2guamF2YQorKysgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2J0cmVlL0JUcmVlVHJhbnNmb3JtQmVuY2guamF2YQpAQCAtNzAsNyArNzAsNyBAQAogICAgICAgICBzZXR1cCgyICogZGF0YVNpemUpOwogICAgICAgICBkYXRhMiA9IGRhdGEuY2xvbmUoKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZGF0YTIubGVuZ3RoIDsgKytpKQotICAgICAgICAgICAgZGF0YTJbaV0gPSBuZXcgSW50ZWdlcihkYXRhMltpXSk7CisgICAgICAgICAgICBkYXRhMltpXSA9IEludGVnZXIudmFsdWVPZihkYXRhMltpXSk7CiAgICAgfQogCiAgICAgQFN0YXRlKFNjb3BlLlRocmVhZCkKZGlmZiAtLWdpdCBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvYnRyZWUvQlRyZWVVcGRhdGVCZW5jaC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9idHJlZS9CVHJlZVVwZGF0ZUJlbmNoLmphdmEKaW5kZXggZjJiZTg1OS4uYzdhZDgxYyAxMDA2NDQKLS0tIGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9idHJlZS9CVHJlZVVwZGF0ZUJlbmNoLmphdmEKKysrIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9idHJlZS9CVHJlZVVwZGF0ZUJlbmNoLmphdmEKQEAgLTgzLDcgKzgzLDcgQEAKICAgICAgICAgc2V0dXAoMiAqIChkYXRhU2l6ZSArIGluc2VydFNpemUpKTsKICAgICAgICAgZGF0YTIgPSBkYXRhLmNsb25lKCk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGRhdGEyLmxlbmd0aCA7ICsraSkKLSAgICAgICAgICAgIGRhdGEyW2ldID0gbmV3IEludGVnZXIoZGF0YTJbaV0pOworICAgICAgICAgICAgZGF0YTJbaV0gPSBJbnRlZ2VyLnZhbHVlT2YoZGF0YTJbaV0pOwogICAgIH0KIAogICAgIEBTdGF0ZShTY29wZS5UaHJlYWQpCmRpZmYgLS1naXQgYS90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2luc3RhbmNlL1JlYWRUZXN0LmphdmEgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2luc3RhbmNlL1JlYWRUZXN0LmphdmEKaW5kZXggNTRmNzIxYi4uNWE4Njg0MiAxMDA2NDQKLS0tIGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9pbnN0YW5jZS9SZWFkVGVzdC5qYXZhCisrKyBiL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvaW5zdGFuY2UvUmVhZFRlc3QuamF2YQpAQCAtODAsMTEgKzgwLDIxIEBACiAgICAgICAgICAgICAvLyBkb24ndCBmbHVzaAogICAgICAgICB9CiAKKyAgICAgICAgU3lzdGVtLmVyci5mb3JtYXQoIiVzIHNzdGFibGVzLCB0b3RhbCAlcywgJSxkIHBhcnRpdGlvbnMuIE1lYW4gd3JpdGUgbGF0ZW5jeSAlLjJmIG1zXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShjZnMubWV0cmljLmxpdmVEaXNrU3BhY2VVc2VkLmdldENvdW50KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0cmljLmVzdGltYXRlZFBhcnRpdGlvbkNvdW50LmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5tZXRyaWMud3JpdGVMYXRlbmN5LmxhdGVuY3kuZ2V0U25hcHNob3QoKS5nZXRNZWFuKCkpOwogICAgICAgICAvLyBOZWVkZWQgdG8gc3RhYmlsaXplIHNzdGFibGUgY291bnQgZm9yIG9mZi1jYWNoZSBzaXplZCB0ZXN0cyAoZS5nLiBjb3VudCA9IDEwMF8wMDBfMDAwKQogICAgICAgICB3aGlsZSAoY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSA+PSAxNSkKICAgICAgICAgewogICAgICAgICAgICAgY2ZzLmVuYWJsZUF1dG9Db21wYWN0aW9uKHRydWUpOwogICAgICAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICAgICAgU3lzdGVtLmVyci5mb3JtYXQoIiVzIHNzdGFibGVzLCB0b3RhbCAlcywgJSxkIHBhcnRpdGlvbnMuIE1lYW4gd3JpdGUgbGF0ZW5jeSAlLjJmIG1zXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGNmcy5tZXRyaWMubGl2ZURpc2tTcGFjZVVzZWQuZ2V0Q291bnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0cmljLmVzdGltYXRlZFBhcnRpdGlvbkNvdW50LmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0cmljLndyaXRlTGF0ZW5jeS5sYXRlbmN5LmdldFNuYXBzaG90KCkuZ2V0TWVhbigpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTA5LDcgKzExOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRocm93YWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZSh0aHJvd2FibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZlVuY2hlY2tlZCh0aHJvd2FibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRocm93YWJsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgfQpAQCAtMTQyLDcgKzE1Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRocm93YWJsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZSh0aHJvd2FibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZlVuY2hlY2tlZCh0aHJvd2FibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHRocm93YWJsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9pbnN0YW5jZS9TaW1wbGVUYWJsZVdyaXRlci5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC9pbnN0YW5jZS9TaW1wbGVUYWJsZVdyaXRlci5qYXZhCmluZGV4IGZiYThkMTYuLmNjNzhlMDMgMTAwNjQ0Ci0tLSBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvaW5zdGFuY2UvU2ltcGxlVGFibGVXcml0ZXIuamF2YQorKysgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL2luc3RhbmNlL1NpbXBsZVRhYmxlV3JpdGVyLmphdmEKQEAgLTEzOCw3ICsxMzgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aHJvd2FibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0aHJvd2FibGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgIH0KQEAgLTE2OSw3ICsxNzAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aHJvd2FibGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5wcm9wYWdhdGUodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0aHJvd2FibGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvdHJpZXMvQ29tcGFyaXNvblJlYWRCZW5jaC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC90cmllcy9Db21wYXJpc29uUmVhZEJlbmNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI1MDUxMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvdHJpZXMvQ29tcGFyaXNvblJlYWRCZW5jaC5qYXZhCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50ZXN0Lm1pY3JvYmVuY2gudHJpZXM7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5hdmlnYWJsZU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRTa2lwTGlzdE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlDb25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkRlY2ltYWxUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50ZWdlclR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXMuSW5NZW1vcnlUcmllOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkJ1ZmZlclR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUFycmF5VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2VJbnZlcnNlOworaW1wb3J0IG9yZy5naXRodWIuamFtbS5NZW1vcnlNZXRlcjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuQmVuY2htYXJrOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5CZW5jaG1hcmtNb2RlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5Gb3JrOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5MZXZlbDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk1vZGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk91dHB1dFRpbWVVbml0OworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5QYXJhbTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2NvcGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlNldHVwOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TdGF0ZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuVGhyZWFkczsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuV2FybXVwOworCitAQmVuY2htYXJrTW9kZShNb2RlLkF2ZXJhZ2VUaW1lKQorQE91dHB1dFRpbWVVbml0KFRpbWVVbml0Lk1JTExJU0VDT05EUykKK0BXYXJtdXAoaXRlcmF0aW9ucyA9IDIsIHRpbWUgPSAxKQorQE1lYXN1cmVtZW50KGl0ZXJhdGlvbnMgPSAzLCB0aW1lID0gMSkKK0BGb3JrKHZhbHVlID0gMSxqdm1BcmdzQXBwZW5kID0geyAiLVhteDRHIiwgIi1YbXM0RyIsICItRGptaC5leGVjdXRvcj1DVVNUT00iLCAiLURqbWguZXhlY3V0b3IuY2xhc3M9b3JnLmFwYWNoZS5jYXNzYW5kcmEudGVzdC5taWNyb2JlbmNoLkZhc3RUaHJlYWRFeGVjdXRvciJ9KQorQFRocmVhZHMoMSkgLy8gbm8gY29uY3VycmVudCB3cml0ZXMKK0BTdGF0ZShTY29wZS5CZW5jaG1hcmspCitwdWJsaWMgY2xhc3MgQ29tcGFyaXNvblJlYWRCZW5jaAoreworICAgIC8vIE5vdGU6IFRvIHNlZSBhIHByaW50b3V0IG9mIHRoZSB1c2FnZSBmb3IgZWFjaCBvYmplY3QsIGFkZCAuZW5hYmxlRGVidWcoKSBoZXJlIChtb3N0IHVzZWZ1bCB3aXRoIHNtYWxsZXIgbnVtYmVyIG9mCisgICAgLy8gcGFydGl0aW9ucykuCisgICAgc3RhdGljIE1lbW9yeU1ldGVyIG1ldGVyID0gbmV3IE1lbW9yeU1ldGVyKCkuaWdub3JlS25vd25TaW5nbGV0b25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoR3Vlc3NpbmcoTWVtb3J5TWV0ZXIuR3Vlc3MuRkFMTEJBQ0tfVU5TQUZFKTsKKworICAgIEBQYXJhbSh7Ik9OX0hFQVAifSkKKyAgICBCdWZmZXJUeXBlIGJ1ZmZlclR5cGUgPSBCdWZmZXJUeXBlLk9GRl9IRUFQOworCisgICAgQFBhcmFtKHsiMTAwMCIsICIxMDAwMDAiLCAiMTAwMDAwMDAifSkKKyAgICBpbnQgY291bnQgPSAxMDAwOworCisgICAgQFBhcmFtKHsiVFJFRV9NQVAiLCAiQ1NMTSIsICJUUklFIn0pCisgICAgTWFwT3B0aW9uIG1hcCA9IE1hcE9wdGlvbi5UUklFOworCisgICAgQFBhcmFtKHsiTE9ORyJ9KQorICAgIFR5cGVPcHRpb24gdHlwZSA9IFR5cGVPcHRpb24uTE9ORzsKKworICAgIGZpbmFsIHN0YXRpYyBJbk1lbW9yeVRyaWUuVXBzZXJ0VHJhbnNmb3JtZXI8Qnl0ZSwgQnl0ZT4gcmVzb2x2ZXIgPSAoeCwgeSkgLT4geTsKKworICAgIEFjY2Vzczw/PiBhY2Nlc3M7CisKKyAgICBAU2V0dXAoTGV2ZWwuVHJpYWwpCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzd2l0Y2ggKG1hcCkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBUUkVFX01BUDoKKyAgICAgICAgICAgICAgICBhY2Nlc3MgPSBuZXcgTmF2aWdhYmxlTWFwQWNjZXNzKG5ldyBUcmVlTWFwKHR5cGUudHlwZS5jb21wYXJhdG9yKCkpLCB0eXBlLnR5cGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDU0xNOgorICAgICAgICAgICAgICAgIGFjY2VzcyA9IG5ldyBOYXZpZ2FibGVNYXBBY2Nlc3MobmV3IENvbmN1cnJlbnRTa2lwTGlzdE1hcCh0eXBlLnR5cGUuY29tcGFyYXRvcigpKSwgdHlwZS50eXBlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVFJJRToKKyAgICAgICAgICAgICAgICBhY2Nlc3MgPSBuZXcgVHJpZUFjY2Vzcyh0eXBlLnR5cGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgxKTsKKworICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgiUHV0dGluZyAlLGRcbiIsIGNvdW50KTsKKyAgICAgICAgbG9uZyB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZvciAobG9uZyBjdXJyZW50ID0gMDsgY3VycmVudCA8IGNvdW50OyArK2N1cnJlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgbCA9IHJhbmQubmV4dExvbmcoKTsKKyAgICAgICAgICAgIGFjY2Vzcy5wdXQobCwgQnl0ZS52YWx1ZU9mKChieXRlKSAobCA+PiA1NikpKTsKKyAgICAgICAgfQorICAgICAgICB0aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lOworICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgiVG9vayAlLjNmIHNlY29uZHNcbiIsIHRpbWUgKiAwLjAwMSk7CisgICAgICAgIGFjY2Vzcy5wcmludFNpemUoKTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgVHlwZTxUPgorICAgIHsKKyAgICAgICAgVCBmcm9tTG9uZyhsb25nIGwpOworICAgICAgICBUIGZyb21CeXRlQ29tcGFyYWJsZShCeXRlQ29tcGFyYWJsZSBiYyk7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlIGxvbmdUb0J5dGVDb21wYXJhYmxlKGxvbmcgbCk7CisgICAgICAgIENvbXBhcmF0b3I8VD4gY29tcGFyYXRvcigpOworICAgIH0KKworICAgIHB1YmxpYyBlbnVtIFR5cGVPcHRpb24KKyAgICB7CisgICAgICAgIExPTkcobmV3IExvbmdUeXBlKCkpLAorICAgICAgICBCSUdJTlQobmV3IEJpZ0ludFR5cGUoKSksCisgICAgICAgIERFQ0lNQUwobmV3IEJpZ0RlY2ltYWxUeXBlKCkpLAorICAgICAgICBTVFJJTkdfQkFTRTE2KG5ldyBTdHJpbmdUeXBlKDE2KSksCisgICAgICAgIFNUUklOR19CQVNFMTAobmV3IFN0cmluZ1R5cGUoMTApKSwKKyAgICAgICAgU1RSSU5HX0JBU0U0KG5ldyBTdHJpbmdUeXBlKDQpKSwKKyAgICAgICAgQVJSQVkobmV3IEFycmF5VHlwZSgxKSksCisgICAgICAgIEFSUkFZX1JFUDMobmV3IEFycmF5VHlwZSgzKSksCisgICAgICAgIEFSUkFZX1JFUDcobmV3IEFycmF5VHlwZSg3KSk7CisKKyAgICAgICAgZmluYWwgVHlwZTw/PiB0eXBlOworCisgICAgICAgIFR5cGVPcHRpb24oVHlwZTw/PiB0eXBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIExvbmdUeXBlIGltcGxlbWVudHMgVHlwZTxMb25nPgorICAgIHsKKyAgICAgICAgcHVibGljIExvbmcgZnJvbUxvbmcobG9uZyBsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMb25nIGZyb21CeXRlQ29tcGFyYWJsZShCeXRlQ29tcGFyYWJsZSBiYykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZExvbmcoYmMuYXNDb21wYXJhYmxlQnl0ZXMoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ5dGVDb21wYXJhYmxlIGxvbmdUb0J5dGVDb21wYXJhYmxlKGxvbmcgbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJ5dGVDb21wYXJhYmxlLm9mKGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbXBhcmF0b3I8TG9uZz4gY29tcGFyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDb21wYXJhdG9yLm5hdHVyYWxPcmRlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpZ0ludFR5cGUgaW1wbGVtZW50cyBUeXBlPEJpZ0ludGVnZXI+CisgICAgeworICAgICAgICBwdWJsaWMgQmlnSW50ZWdlciBmcm9tTG9uZyhsb25nIGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCaWdJbnRlZ2VyLnZhbHVlT2YobCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQmlnSW50ZWdlciBmcm9tQnl0ZUNvbXBhcmFibGUoQnl0ZUNvbXBhcmFibGUgYmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyVHlwZS5pbnN0YW5jZS5jb21wb3NlKEludGVnZXJUeXBlLmluc3RhbmNlLmZyb21Db21wYXJhYmxlQnl0ZXMoQnl0ZVNvdXJjZS5wZWVrYWJsZShiYy5hc0NvbXBhcmFibGVCeXRlcyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uT1NTNTApKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCeXRlQ29tcGFyYWJsZSBsb25nVG9CeXRlQ29tcGFyYWJsZShsb25nIGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB2IC0+IEludGVnZXJUeXBlLmluc3RhbmNlLmFzQ29tcGFyYWJsZUJ5dGVzKEludGVnZXJUeXBlLmluc3RhbmNlLmRlY29tcG9zZShmcm9tTG9uZyhsKSksIHYpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbXBhcmF0b3I8QmlnSW50ZWdlcj4gY29tcGFyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDb21wYXJhdG9yLm5hdHVyYWxPcmRlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEJpZ0RlY2ltYWxUeXBlIGltcGxlbWVudHMgVHlwZTxCaWdEZWNpbWFsPgorICAgIHsKKyAgICAgICAgcHVibGljIEJpZ0RlY2ltYWwgZnJvbUxvbmcobG9uZyBsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQmlnRGVjaW1hbC52YWx1ZU9mKGwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJpZ0RlY2ltYWwgZnJvbUJ5dGVDb21wYXJhYmxlKEJ5dGVDb21wYXJhYmxlIGJjKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRGVjaW1hbFR5cGUuaW5zdGFuY2UuY29tcG9zZShEZWNpbWFsVHlwZS5pbnN0YW5jZS5mcm9tQ29tcGFyYWJsZUJ5dGVzKEJ5dGVTb3VyY2UucGVla2FibGUoYmMuYXNDb21wYXJhYmxlQnl0ZXMoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnl0ZUNvbXBhcmFibGUgbG9uZ1RvQnl0ZUNvbXBhcmFibGUobG9uZyBsKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdiAtPiBEZWNpbWFsVHlwZS5pbnN0YW5jZS5hc0NvbXBhcmFibGVCeXRlcyhEZWNpbWFsVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoZnJvbUxvbmcobCkpLCB2KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21wYXJhdG9yPEJpZ0RlY2ltYWw+IGNvbXBhcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ29tcGFyYXRvci5uYXR1cmFsT3JkZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTdHJpbmdUeXBlIGltcGxlbWVudHMgVHlwZTxTdHJpbmc+CisgICAgeworICAgICAgICBmaW5hbCBpbnQgYmFzZTsKKworICAgICAgICBTdHJpbmdUeXBlKGludCBiYXNlKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmJhc2UgPSBiYXNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBmcm9tTG9uZyhsb25nIGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKGwsIGJhc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBmcm9tQnl0ZUNvbXBhcmFibGUoQnl0ZUNvbXBhcmFibGUgYmMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKEJ5dGVTb3VyY2VJbnZlcnNlLnJlYWRCeXRlcyhiYy5hc0NvbXBhcmFibGVCeXRlcyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKSksIFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJ5dGVDb21wYXJhYmxlIGxvbmdUb0J5dGVDb21wYXJhYmxlKGxvbmcgbCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEJ5dGVDb21wYXJhYmxlLmZpeGVkTGVuZ3RoKGZyb21Mb25nKGwpLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBDb21wYXJhdG9yLm5hdHVyYWxPcmRlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEFycmF5VHlwZSBpbXBsZW1lbnRzIFR5cGU8Ynl0ZVtdPgorICAgIHsKKyAgICAgICAgZmluYWwgaW50IHJlcHM7CisKKyAgICAgICAgQXJyYXlUeXBlKGludCByZXBzKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLnJlcHMgPSByZXBzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGVbXSBmcm9tTG9uZyhsb25nIGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSB2YWx1ZSA9IG5ldyBieXRlWzggKiByZXBzXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVwczsgKytqKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZVtpICogcmVwcyArIGpdID0gKGJ5dGUpKGwgPj4gKDU2IC0gaSAqIDgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZnJvbUJ5dGVDb21wYXJhYmxlKEJ5dGVDb21wYXJhYmxlIGJjKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZUludmVyc2UucmVhZEJ5dGVzKGJjLmFzQ29tcGFyYWJsZUJ5dGVzKEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uT1NTNTApKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCeXRlQ29tcGFyYWJsZSBsb25nVG9CeXRlQ29tcGFyYWJsZShsb25nIGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBCeXRlQ29tcGFyYWJsZS5maXhlZExlbmd0aChmcm9tTG9uZyhsKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29tcGFyYXRvcjxieXRlW10+IGNvbXBhcmF0b3IoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQnl0ZUFycmF5VXRpbDo6Y29tcGFyZVVuc2lnbmVkOworICAgICAgICB9CisgICAgfQorCisgICAgaW50ZXJmYWNlIEFjY2VzczxUPgorICAgIHsKKyAgICAgICAgdm9pZCBwdXQobG9uZyB2LCBieXRlIGIpOworICAgICAgICBieXRlIGdldChsb25nIHYpOworICAgICAgICBJdGVyYWJsZTxCeXRlPiB2YWx1ZXMoKTsKKyAgICAgICAgSXRlcmFibGU8Qnl0ZT4gdmFsdWVzU2xpY2UobG9uZyBsZWZ0LCBib29sZWFuIGluY2x1ZGVMZWZ0LCBsb25nIHJpZ2h0LCBib29sZWFuIGluY2x1ZGVSaWdodCk7CisgICAgICAgIEl0ZXJhYmxlPE1hcC5FbnRyeTxULCBCeXRlPj4gZW50cnlTZXQoKTsKKyAgICAgICAgdm9pZCBjb25zdW1lVmFsdWVzKENvbnN1bWVyPEJ5dGU+IGNvbnN1bWVyKTsKKyAgICAgICAgdm9pZCBjb25zdW1lRW50cmllcyhCaUNvbnN1bWVyPFQsIEJ5dGU+IGNvbnN1bWVyKTsKKyAgICAgICAgdm9pZCBwcmludFNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZW51bSBNYXBPcHRpb24KKyAgICB7CisgICAgICAgIFRSRUVfTUFQLAorICAgICAgICBDU0xNLAorICAgICAgICBUUklFCisgICAgfQorCisgICAgY2xhc3MgVHJpZUFjY2VzczxUPiBpbXBsZW1lbnRzIEFjY2VzczxUPgorICAgIHsKKyAgICAgICAgZmluYWwgSW5NZW1vcnlUcmllPEJ5dGU+IHRyaWU7CisgICAgICAgIGZpbmFsIFR5cGU8VD4gdHlwZTsKKworICAgICAgICBUcmllQWNjZXNzKFR5cGU8VD4gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIHRyaWUgPSBuZXcgSW5NZW1vcnlUcmllPD4oYnVmZmVyVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwdXQobG9uZyB2LCBieXRlIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRyaWUucHV0UmVjdXJzaXZlKHR5cGUubG9uZ1RvQnl0ZUNvbXBhcmFibGUodiksIGIsIHJlc29sdmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbk1lbW9yeVRyaWUuU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlIGdldChsb25nIHYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cmllLmdldCh0eXBlLmxvbmdUb0J5dGVDb21wYXJhYmxlKHYpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYWJsZTxCeXRlPiB2YWx1ZXMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJpZS52YWx1ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYWJsZTxCeXRlPiB2YWx1ZXNTbGljZShsb25nIGxlZnQsIGJvb2xlYW4gaW5jbHVkZUxlZnQsIGxvbmcgcmlnaHQsIGJvb2xlYW4gaW5jbHVkZVJpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdHJpZS5zdWJ0cmllKHR5cGUubG9uZ1RvQnl0ZUNvbXBhcmFibGUobGVmdCksIGluY2x1ZGVMZWZ0LCB0eXBlLmxvbmdUb0J5dGVDb21wYXJhYmxlKHJpZ2h0KSwgaW5jbHVkZVJpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSXRlcmFibGU8TWFwLkVudHJ5PFQsIEJ5dGU+PiBlbnRyeVNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBJdGVyYWJsZXMudHJhbnNmb3JtKHRyaWUuZW50cnlTZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgZW4gLT4gbmV3IEFic3RyYWN0TWFwLlNpbXBsZUVudHJ5PD4odHlwZS5mcm9tQnl0ZUNvbXBhcmFibGUoZW4uZ2V0S2V5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbi5nZXRWYWx1ZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjb25zdW1lVmFsdWVzKENvbnN1bWVyPEJ5dGU+IGNvbnN1bWVyKQorICAgICAgICB7CisgICAgICAgICAgICB0cmllLmZvckVhY2hWYWx1ZShjb25zdW1lcjo6YWNjZXB0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbnN1bWVFbnRyaWVzKEJpQ29uc3VtZXI8VCwgQnl0ZT4gY29uc3VtZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyaWUuZm9yRWFjaEVudHJ5KChrZXksIHZhbHVlKSAtPiBjb25zdW1lci5hY2NlcHQodHlwZS5mcm9tQnl0ZUNvbXBhcmFibGUoa2V5KSwgdmFsdWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByaW50U2l6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgZGVlcHNpemUgPSBtZXRlci5tZWFzdXJlRGVlcCh0cmllKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQuZm9ybWF0KCJUcmllIHNpemUgb24gaGVhcCAlLGQgb2ZmIGhlYXAgJSxkIGRlZXAgc2l6ZSAlLGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmllLnNpemVPbkhlYXAoKSwgdHJpZS5zaXplT2ZmSGVhcCgpLCBkZWVwc2l6ZSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgicGVyIGVudHJ5IG9uIGhlYXAgJS4yZiBvZmYgaGVhcCAlLjJmIGRlZXAgc2l6ZSAlLjJmXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5zaXplT25IZWFwKCkgKiAxLjAgLyBjb3VudCwgdHJpZS5zaXplT2ZmSGVhcCgpICogMS4wIC8gY291bnQsIGRlZXBzaXplICogMS4wIC8gY291bnQpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xhc3MgTmF2aWdhYmxlTWFwQWNjZXNzPFQ+IGltcGxlbWVudHMgQWNjZXNzPFQ+CisgICAgeworICAgICAgICBmaW5hbCBOYXZpZ2FibGVNYXA8VCwgQnl0ZT4gbmF2aWdhYmxlTWFwOworICAgICAgICBmaW5hbCBUeXBlPFQ+IHR5cGU7CisKKyAgICAgICAgTmF2aWdhYmxlTWFwQWNjZXNzKE5hdmlnYWJsZU1hcDxULCBCeXRlPiBuYXZpZ2FibGVNYXAsIFR5cGU8VD4gdHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5uYXZpZ2FibGVNYXAgPSBuYXZpZ2FibGVNYXA7CisgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHV0KGxvbmcgdiwgYnl0ZSBiKQorICAgICAgICB7CisgICAgICAgICAgICBuYXZpZ2FibGVNYXAucHV0KHR5cGUuZnJvbUxvbmcodiksIGIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGUgZ2V0KGxvbmcgdikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5hdmlnYWJsZU1hcC5nZXQodHlwZS5mcm9tTG9uZyh2KSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSXRlcmFibGU8Qnl0ZT4gdmFsdWVzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5hdmlnYWJsZU1hcC52YWx1ZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJdGVyYWJsZTxCeXRlPiB2YWx1ZXNTbGljZShsb25nIGxlZnQsIGJvb2xlYW4gaW5jbHVkZUxlZnQsIGxvbmcgcmlnaHQsIGJvb2xlYW4gaW5jbHVkZVJpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmF2aWdhYmxlTWFwLnN1Yk1hcCh0eXBlLmZyb21Mb25nKGxlZnQpLCBpbmNsdWRlTGVmdCwgdHlwZS5mcm9tTG9uZyhyaWdodCksIGluY2x1ZGVSaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSXRlcmFibGU8TWFwLkVudHJ5PFQsIEJ5dGU+PiBlbnRyeVNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuYXZpZ2FibGVNYXAuZW50cnlTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbnN1bWVWYWx1ZXMoQ29uc3VtZXI8Qnl0ZT4gY29uc3VtZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5hdmlnYWJsZU1hcC52YWx1ZXMoKS5mb3JFYWNoKGNvbnN1bWVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbnN1bWVFbnRyaWVzKEJpQ29uc3VtZXI8VCwgQnl0ZT4gY29uc3VtZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIG5hdmlnYWJsZU1hcC5mb3JFYWNoKGNvbnN1bWVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByaW50U2l6ZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgc2l6ZSA9IG1ldGVyLm1lYXN1cmVEZWVwKG5hdmlnYWJsZU1hcCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdChtYXAgKyAiIHNpemUgb24gaGVhcCAlLGRcbiIsIHNpemUpOworICAgICAgICAgICAgU3lzdGVtLm91dC5mb3JtYXQoInBlciBlbnRyeSBvbiBoZWFwICUuMmZcbiIsIHNpemUgKiAxLjAgLyBjb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgZ2V0UmFuZG9tKCkKKyAgICB7CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgxKTsKKworICAgICAgICBmb3IgKGxvbmcgY3VycmVudCA9IDA7IGN1cnJlbnQgPCBjb3VudDsgKytjdXJyZW50KQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGwgPSByYW5kLm5leHRMb25nKCk7CisgICAgICAgICAgICBCeXRlIHJlcyA9IGFjY2Vzcy5nZXQobCk7CisgICAgICAgICAgICBpZiAocmVzLmJ5dGVWYWx1ZSgpICE9IGwgPj4gNTYpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIGludCBpdGVyYXRlVmFsdWVzKCkKKyAgICB7CisgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICBmb3IgKGJ5dGUgYiA6IGFjY2Vzcy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHN1bSArPSBiOworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGNvbnN1bWVWYWx1ZXMoKQorICAgIHsKKyAgICAgICAgY2xhc3MgQ291bnRlciBpbXBsZW1lbnRzIENvbnN1bWVyPEJ5dGU+CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzdW0gPSAwOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChCeXRlIGFCeXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1bSArPSBhQnl0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDb3VudGVyIGNvdW50ZXIgPSBuZXcgQ291bnRlcigpOworICAgICAgICBhY2Nlc3MuY29uc3VtZVZhbHVlcyhjb3VudGVyKTsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXIuc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGNvbnN1bWVFbnRyaWVzKCkKKyAgICB7CisgICAgICAgIGNsYXNzIENvdW50ZXI8VD4gaW1wbGVtZW50cyBCaUNvbnN1bWVyPFQsIEJ5dGU+CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzdW0gPSAwOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdChUIGtleSwgQnl0ZSBhQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gYUJ5dGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ291bnRlciBjb3VudGVyID0gbmV3IENvdW50ZXIoKTsKKyAgICAgICAgYWNjZXNzLmNvbnN1bWVFbnRyaWVzKGNvdW50ZXIpOworICAgICAgICByZXR1cm4gY291bnRlci5zdW07CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyBpbnQgaXRlcmF0ZUVudHJpZXMoKQorICAgIHsKKyAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PD8sIEJ5dGU+IGVuIDogYWNjZXNzLmVudHJ5U2V0KCkpCisgICAgICAgICAgICBzdW0gKz0gZW4uZ2V0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIHN1bTsKKyAgICB9CisKKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGdldEJ5SXRlcmF0ZVZhbHVlU2xpY2UoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKDEpOworICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHYgPSByYW5kLm5leHRMb25nKCk7CisgICAgICAgICAgICBJdGVyYWJsZTxCeXRlPiB2YWx1ZXMgPSBhY2Nlc3MudmFsdWVzU2xpY2UodiwgdHJ1ZSwgdiwgdHJ1ZSk7CisgICAgICAgICAgICBmb3IgKGJ5dGUgYiA6IHZhbHVlcykKKyAgICAgICAgICAgICAgICBzdW0gKz0gYjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGl0ZXJhdGVWYWx1ZXNMaW1pdGVkKCkKKyAgICB7CisgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICBJdGVyYWJsZTxCeXRlPiB2YWx1ZXMgPSBhY2Nlc3MudmFsdWVzU2xpY2UoMEwsIGZhbHNlLCBMb25nLk1BWF9WQUxVRSAvIDIsIHRydWUpOyAvLyAxLzQKKyAgICAgICAgZm9yIChieXRlIGIgOiB2YWx1ZXMpCisgICAgICAgICAgICBzdW0gKz0gYjsKKyAgICAgICAgcmV0dXJuIHN1bTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL3RyaWVzL0luTWVtb3J5VHJpZVJlYWRCZW5jaC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC90cmllcy9Jbk1lbW9yeVRyaWVSZWFkQmVuY2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmYyZTRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC90cmllcy9Jbk1lbW9yeVRyaWVSZWFkQmVuY2guamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudGVzdC5taWNyb2JlbmNoLnRyaWVzOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUNvbnN1bWVyOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXMuSW5NZW1vcnlUcmllOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzLlRyaWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXMuVHJpZUVudHJpZXNXYWxrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQnVmZmVyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuKjsKKworQEJlbmNobWFya01vZGUoTW9kZS5BdmVyYWdlVGltZSkKK0BPdXRwdXRUaW1lVW5pdChUaW1lVW5pdC5NSUxMSVNFQ09ORFMpCitAV2FybXVwKGl0ZXJhdGlvbnMgPSA1LCB0aW1lID0gMSkKK0BNZWFzdXJlbWVudChpdGVyYXRpb25zID0gNSwgdGltZSA9IDEpCitARm9yayh2YWx1ZSA9IDEsanZtQXJnc0FwcGVuZCA9IHsgIi1YbXg0RyIsICItWG1zNEciLCAiLURqbWguZXhlY3V0b3I9Q1VTVE9NIiwgIi1Eam1oLmV4ZWN1dG9yLmNsYXNzPW9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRlc3QubWljcm9iZW5jaC5GYXN0VGhyZWFkRXhlY3V0b3IifSkKK0BUaHJlYWRzKDEpIC8vIG5vIGNvbmN1cnJlbnQgd3JpdGVzCitAU3RhdGUoU2NvcGUuQmVuY2htYXJrKQorcHVibGljIGNsYXNzIEluTWVtb3J5VHJpZVJlYWRCZW5jaAoreworICAgIEBQYXJhbSh7Ik9OX0hFQVAiLCAiT0ZGX0hFQVAifSkKKyAgICBCdWZmZXJUeXBlIGJ1ZmZlclR5cGUgPSBCdWZmZXJUeXBlLk9GRl9IRUFQOworCisgICAgQFBhcmFtKHsiMTAwMCIsICIxMDAwMDAiLCAiMTAwMDAwMDAifSkKKyAgICBpbnQgY291bnQgPSAxMDAwOworCisgICAgZmluYWwgc3RhdGljIEluTWVtb3J5VHJpZS5VcHNlcnRUcmFuc2Zvcm1lcjxCeXRlLCBCeXRlPiByZXNvbHZlciA9ICh4LCB5KSAtPiB5OworCisgICAgSW5NZW1vcnlUcmllPEJ5dGU+IHRyaWU7CisKKyAgICBAU2V0dXAoTGV2ZWwuVHJpYWwpCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICB0cmllID0gbmV3IEluTWVtb3J5VHJpZTw+KGJ1ZmZlclR5cGUpOworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oMSk7CisKKyAgICAgICAgU3lzdGVtLm91dC5mb3JtYXQoIlB1dHRpbmcgJSxkXG4iLCBjb3VudCk7CisgICAgICAgIGZvciAobG9uZyBjdXJyZW50ID0gMDsgY3VycmVudCA8IGNvdW50OyArK2N1cnJlbnQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgbCA9IHJhbmQubmV4dExvbmcoKTsKKyAgICAgICAgICAgIHRyaWUucHV0UmVjdXJzaXZlKEJ5dGVDb21wYXJhYmxlLm9mKGwpLCBCeXRlLnZhbHVlT2YoKGJ5dGUpIChsID4+IDU2KSksIHJlc29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgiVHJpZSBzaXplIG9uIGhlYXAgJSxkIG9mZiBoZWFwICUsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5zaXplT25IZWFwKCksIHRyaWUuc2l6ZU9mZkhlYXAoKSk7CisgICAgICAgIFN5c3RlbS5vdXQuZm9ybWF0KCJwZXIgZW50cnkgb24gaGVhcCAlLjJmIG9mZiBoZWFwICUuMmZcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWUuc2l6ZU9uSGVhcCgpICogMS4wIC8gY291bnQsIHRyaWUuc2l6ZU9mZkhlYXAoKSAqIDEuMCAvIGNvdW50KTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgZ2V0UmFuZG9tKCkKKyAgICB7CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgxKTsKKworICAgICAgICBmb3IgKGxvbmcgY3VycmVudCA9IDA7IGN1cnJlbnQgPCBjb3VudDsgKytjdXJyZW50KQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGwgPSByYW5kLm5leHRMb25nKCk7CisgICAgICAgICAgICBCeXRlIHJlcyA9IHRyaWUuZ2V0KEJ5dGVDb21wYXJhYmxlLm9mKGwpKTsKKyAgICAgICAgICAgIGlmIChyZXMuYnl0ZVZhbHVlKCkgIT0gbCA+PiA1NikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGl0ZXJhdGVWYWx1ZXMoKQorICAgIHsKKyAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgIGZvciAoYnl0ZSBiIDogdHJpZS52YWx1ZXMoKSkKKyAgICAgICAgICAgIHN1bSArPSBiOworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGNvbnN1bWVWYWx1ZXMoKQorICAgIHsKKyAgICAgICAgY2xhc3MgQ291bnRlciBpbXBsZW1lbnRzIFRyaWUuVmFsdWVDb25zdW1lcjxCeXRlPgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc3VtID0gMDsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoQnl0ZSBhQnl0ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gYUJ5dGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ291bnRlciBjb3VudGVyID0gbmV3IENvdW50ZXIoKTsKKyAgICAgICAgdHJpZS5mb3JFYWNoVmFsdWUoY291bnRlcik7CisgICAgICAgIHJldHVybiBjb3VudGVyLnN1bTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIGludCBjb25zdW1lRW50cmllcygpCisgICAgeworICAgICAgICBjbGFzcyBDb3VudGVyIGltcGxlbWVudHMgQmlDb25zdW1lcjxCeXRlQ29tcGFyYWJsZSwgQnl0ZT4KKyAgICAgICAgeworICAgICAgICAgICAgaW50IHN1bSA9IDA7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KEJ5dGVDb21wYXJhYmxlIGJ5dGVDb21wYXJhYmxlLCBCeXRlIGFCeXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1bSArPSBhQnl0ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDb3VudGVyIGNvdW50ZXIgPSBuZXcgQ291bnRlcigpOworICAgICAgICB0cmllLmZvckVhY2hFbnRyeShjb3VudGVyKTsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXIuc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IHByb2Nlc3NFbnRyaWVzKCkKKyAgICB7CisgICAgICAgIGNsYXNzIENvdW50ZXIgZXh0ZW5kcyBUcmllRW50cmllc1dhbGtlcjxCeXRlLCBWb2lkPgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc3VtID0gMDsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb250ZW50KEJ5dGUgY29udGVudCwgYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZUxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gY29udGVudDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVm9pZCBjb21wbGV0ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ291bnRlciBjb3VudGVyID0gbmV3IENvdW50ZXIoKTsKKyAgICAgICAgdHJpZS5wcm9jZXNzKGNvdW50ZXIpOworICAgICAgICByZXR1cm4gY291bnRlci5zdW07CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyBpbnQgaXRlcmF0ZVZhbHVlc1Vub3JkZXJlZCgpCisgICAgeworICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgZm9yIChieXRlIGIgOiB0cmllLnZhbHVlc1Vub3JkZXJlZCgpKQorICAgICAgICAgICAgc3VtICs9IGI7CisgICAgICAgIHJldHVybiBzdW07CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyBpbnQgaXRlcmF0ZUVudHJpZXMoKQorICAgIHsKKyAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBCeXRlPiBlbiA6IHRyaWUuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIHN1bSArPSBlbi5nZXRWYWx1ZSgpOworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGl0ZXJhdGVWYWx1ZXNMaW1pdGVkKCkKKyAgICB7CisgICAgICAgIEl0ZXJhYmxlPEJ5dGU+IHZhbHVlcyA9IHRyaWUuc3VidHJpZShCeXRlQ29tcGFyYWJsZS5vZigwTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUub2YoTG9uZy5NQVhfVkFMVUUgLyAyKSwgICAgICAgICAvLyAxLzQgb2YgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZXMoKTsKKyAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgIGZvciAoYnl0ZSBiIDogdmFsdWVzKQorICAgICAgICAgICAgc3VtICs9IGI7CisgICAgICAgIHJldHVybiBzdW07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC90cmllcy9Jbk1lbW9yeVRyaWVVbmlvbkJlbmNoLmphdmEgYi90ZXN0L21pY3JvYmVuY2gvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdGVzdC9taWNyb2JlbmNoL3RyaWVzL0luTWVtb3J5VHJpZVVuaW9uQmVuY2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzJlMjBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC90cmllcy9Jbk1lbW9yeVRyaWVVbmlvbkJlbmNoLmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRlc3QubWljcm9iZW5jaC50cmllczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllcy5Jbk1lbW9yeVRyaWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXMuVHJpZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5CdWZmZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy4qOworCitAQmVuY2htYXJrTW9kZShNb2RlLkF2ZXJhZ2VUaW1lKQorQE91dHB1dFRpbWVVbml0KFRpbWVVbml0Lk1JTExJU0VDT05EUykKK0BXYXJtdXAoaXRlcmF0aW9ucyA9IDUsIHRpbWUgPSAxKQorQE1lYXN1cmVtZW50KGl0ZXJhdGlvbnMgPSA1LCB0aW1lID0gMSkKK0BGb3JrKHZhbHVlID0gMSxqdm1BcmdzQXBwZW5kID0geyAiLVhteDRHIiwgIi1YbXM0RyIsICItRGptaC5leGVjdXRvcj1DVVNUT00iLCAiLURqbWguZXhlY3V0b3IuY2xhc3M9b3JnLmFwYWNoZS5jYXNzYW5kcmEudGVzdC5taWNyb2JlbmNoLkZhc3RUaHJlYWRFeGVjdXRvciJ9KQorQFRocmVhZHMoMSkgLy8gbm8gY29uY3VycmVudCB3cml0ZXMKK0BTdGF0ZShTY29wZS5CZW5jaG1hcmspCitwdWJsaWMgY2xhc3MgSW5NZW1vcnlUcmllVW5pb25CZW5jaAoreworICAgIEBQYXJhbSh7Ik9OX0hFQVAiLCAiT0ZGX0hFQVAifSkKKyAgICBCdWZmZXJUeXBlIGJ1ZmZlclR5cGUgPSBCdWZmZXJUeXBlLk9GRl9IRUFQOworCisgICAgQFBhcmFtKHsiMTAwMCIsICIxMDAwMDAiLCAiMTAwMDAwMDAifSkKKyAgICBpbnQgY291bnQgPSAxMDAwOworCisgICAgQFBhcmFtKHsiMiIsICIzIiwgIjgifSkKKyAgICBpbnQgc291cmNlcyA9IDI7CisKKyAgICBAUGFyYW0oeyJmYWxzZSIsICJ0cnVlIn0pCisgICAgYm9vbGVhbiBzZXF1ZW50aWFsID0gdHJ1ZTsKKworICAgIGZpbmFsIHN0YXRpYyBJbk1lbW9yeVRyaWUuVXBzZXJ0VHJhbnNmb3JtZXI8Qnl0ZSwgQnl0ZT4gcmVzb2x2ZXIgPSAoeCwgeSkgLT4geTsKKworICAgIFRyaWU8Qnl0ZT4gdHJpZTsKKworICAgIEBTZXR1cChMZXZlbC5UcmlhbCkKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIExpc3Q8SW5NZW1vcnlUcmllPEJ5dGU+PiB0cmllcyA9IG5ldyBBcnJheUxpc3Q8Pihzb3VyY2VzKTsKKyAgICAgICAgU3lzdGVtLm91dC5mb3JtYXQoIlB1dHRpbmcgJSxkIGFtb25nICVkIHRyaWVzXG4iLCBjb3VudCwgc291cmNlcyk7CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgxKTsKKyAgICAgICAgaWYgKHNlcXVlbnRpYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgc3ogPSA2NTUzNiAvIHNvdXJjZXM7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZXM7ICsraSkKKyAgICAgICAgICAgICAgICB0cmllcy5hZGQobmV3IEluTWVtb3J5VHJpZTw+KGJ1ZmZlclR5cGUpKTsKKworICAgICAgICAgICAgZm9yIChsb25nIGN1cnJlbnQgPSAwOyBjdXJyZW50IDwgY291bnQ7ICsrY3VycmVudCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGwgPSByYW5kLm5leHRMb25nKCk7CisgICAgICAgICAgICAgICAgSW5NZW1vcnlUcmllPEJ5dGU+IHR0ID0gdHJpZXMuZ2V0KE1hdGgubWluKChpbnQpICgoKGwgPj4gNDgpICsgMzI3NjgpIC8gc3opLCBzb3VyY2VzIC0gMSkpOworICAgICAgICAgICAgICAgIHR0LnB1dFJlY3Vyc2l2ZShCeXRlQ29tcGFyYWJsZS5vZihsKSwgKGJ5dGUpIChsID4+IDU2KSwgcmVzb2x2ZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGN1cnJlbnQgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VzOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5NZW1vcnlUcmllPEJ5dGU+IHRyaWUgPSBuZXcgSW5NZW1vcnlUcmllKGJ1ZmZlclR5cGUpOworICAgICAgICAgICAgICAgIGludCBjdXJyTWF4ID0gdGhpcy5jb3VudCAqIChpICsgMSkgLyBzb3VyY2VzOworCisgICAgICAgICAgICAgICAgZm9yICg7IGN1cnJlbnQgPCBjdXJyTWF4OyArK2N1cnJlbnQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsb25nIGwgPSByYW5kLm5leHRMb25nKCk7CisgICAgICAgICAgICAgICAgICAgIHRyaWUucHV0UmVjdXJzaXZlKEJ5dGVDb21wYXJhYmxlLm9mKGwpLCAoYnl0ZSkgKGwgPj4gNTYpLCByZXNvbHZlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyaWVzLmFkZCh0cmllKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoSW5NZW1vcnlUcmllPEJ5dGU+IHRyaWUgOiB0cmllcykKKyAgICAgICAgeworICAgICAgICAgICAgU3lzdGVtLm91dC5mb3JtYXQoIlRyaWUgc2l6ZSBvbiBoZWFwICUsZCBvZmYgaGVhcCAlLGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmllLnNpemVPbkhlYXAoKSwgdHJpZS5zaXplT2ZmSGVhcCgpKTsKKyAgICAgICAgfQorICAgICAgICB0cmllID0gVHJpZS5tZXJnZURpc3RpbmN0KHRyaWVzKTsKKworICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgiQWN0dWFsIGNvdW50ICUsZFxuIiwgSXRlcmFibGVzLnNpemUodHJpZS52YWx1ZXMoKSkpOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGl0ZXJhdGVWYWx1ZXMoKQorICAgIHsKKyAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgIGZvciAoYnl0ZSBiIDogdHJpZS52YWx1ZXMoKSkKKyAgICAgICAgICAgIHN1bSArPSBiOworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGl0ZXJhdGVWYWx1ZXNVbm9yZGVyZWQoKQorICAgIHsKKyAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgIGZvciAoYnl0ZSBiIDogdHJpZS52YWx1ZXNVbm9yZGVyZWQoKSkKKyAgICAgICAgICAgIHN1bSArPSBiOworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgaW50IGl0ZXJhdGVFbnRyaWVzKCkKKyAgICB7CisgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxCeXRlQ29tcGFyYWJsZSwgQnl0ZT4gZW4gOiB0cmllLmVudHJ5U2V0KCkpCisgICAgICAgICAgICBzdW0gKz0gZW4uZ2V0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIHN1bTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIGludCBpdGVyYXRlVmFsdWVzTGltaXRlZCgpCisgICAgeworICAgICAgICBJdGVyYWJsZTxCeXRlPiB2YWx1ZXMgPSB0cmllLnN1YnRyaWUoQnl0ZUNvbXBhcmFibGUub2YoMEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlLm9mKExvbmcuTUFYX1ZBTFVFIC8gMiksICAgICAgICAgLy8gMS80IG9mIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKCk7CisgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICBmb3IgKGJ5dGUgYiA6IHZhbHVlcykKKyAgICAgICAgICAgIHN1bSArPSBiOworICAgICAgICByZXR1cm4gc3VtOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvdHJpZXMvSW5NZW1vcnlUcmllV3JpdGVCZW5jaC5qYXZhIGIvdGVzdC9taWNyb2JlbmNoL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rlc3QvbWljcm9iZW5jaC90cmllcy9Jbk1lbW9yeVRyaWVXcml0ZUJlbmNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJiZTExZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvbWljcm9iZW5jaC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90ZXN0L21pY3JvYmVuY2gvdHJpZXMvSW5NZW1vcnlUcmllV3JpdGVCZW5jaC5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50ZXN0Lm1pY3JvYmVuY2gudHJpZXM7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllcy5Jbk1lbW9yeVRyaWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQnVmZmVyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuKjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguaW5mcmEuQmxhY2tob2xlOworCitAQmVuY2htYXJrTW9kZShNb2RlLkF2ZXJhZ2VUaW1lKQorQE91dHB1dFRpbWVVbml0KFRpbWVVbml0Lk1JTExJU0VDT05EUykKK0BXYXJtdXAoaXRlcmF0aW9ucyA9IDUsIHRpbWUgPSAxKQorQE1lYXN1cmVtZW50KGl0ZXJhdGlvbnMgPSA1LCB0aW1lID0gMSkKK0BGb3JrKHZhbHVlID0gMSxqdm1BcmdzQXBwZW5kID0geyAiLVhteDRHIiwgIi1YbXM0RyIsICItRGptaC5leGVjdXRvcj1DVVNUT00iLCAiLURqbWguZXhlY3V0b3IuY2xhc3M9b3JnLmFwYWNoZS5jYXNzYW5kcmEudGVzdC5taWNyb2JlbmNoLkZhc3RUaHJlYWRFeGVjdXRvciJ9KQorQFRocmVhZHMoMSkgLy8gbm8gY29uY3VycmVudCB3cml0ZXMKK0BTdGF0ZShTY29wZS5CZW5jaG1hcmspCitwdWJsaWMgY2xhc3MgSW5NZW1vcnlUcmllV3JpdGVCZW5jaAoreworICAgIEBQYXJhbSh7Ik9OX0hFQVAiLCAiT0ZGX0hFQVAifSkKKyAgICBCdWZmZXJUeXBlIGJ1ZmZlclR5cGUgPSBCdWZmZXJUeXBlLk9GRl9IRUFQOworCisgICAgQFBhcmFtKHsiMTAwMCIsICIxMDAwMDAiLCAiMTAwMDAwMDAifSkKKyAgICBpbnQgY291bnQgPSAxMDAwOworCisgICAgQFBhcmFtKHsiOCJ9KQorICAgIGludCBrZXlMZW5ndGggPSA4OworCisgICAgZmluYWwgc3RhdGljIEluTWVtb3J5VHJpZS5VcHNlcnRUcmFuc2Zvcm1lcjxCeXRlLCBCeXRlPiByZXNvbHZlciA9ICh4LCB5KSAtPiB5OworCisgICAgLy8gU2V0IHRoaXMgdG8gdHJ1ZSB0byBwcmludCB0aGUgdHJpZSBzaXplcyBhZnRlciBpbnNlcnRpb25zIGZvciBzYW5pdHkgY2hlY2tpbmcuCisgICAgLy8gVGhpcyBtaWdodCBhZmZlY3QgdGhlIHRpbWluZ3MsIGRvIG5vdCBjb21taXQgd2l0aCB0aGlzIHNldCB0byB0cnVlLgorICAgIGZpbmFsIHN0YXRpYyBib29sZWFuIFBSSU5UX1NJWkVTID0gZmFsc2U7CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgcHV0U2VxdWVudGlhbChCbGFja2hvbGUgYmgpIHRocm93cyBJbk1lbW9yeVRyaWUuU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlPiB0cmllID0gbmV3IEluTWVtb3J5VHJpZShidWZmZXJUeXBlKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGtleUxlbmd0aCk7CisKKyAgICAgICAgZm9yIChsb25nIGN1cnJlbnQgPSAwOyBjdXJyZW50IDwgY291bnQ7ICsrY3VycmVudCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBsID0gY3VycmVudDsKKyAgICAgICAgICAgIGJ1Zi5wdXRMb25nKGtleUxlbmd0aCAtIDgsIGwpOworICAgICAgICAgICAgdHJpZS5wdXRSZWN1cnNpdmUoQnl0ZUNvbXBhcmFibGUuZml4ZWRMZW5ndGgoYnVmKSwgQnl0ZS52YWx1ZU9mKChieXRlKSAobCA+PiA1NikpLCByZXNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFBSSU5UX1NJWkVTKQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRyaWUudmFsdWVzQ291bnQoKSk7CisgICAgICAgIGJoLmNvbnN1bWUodHJpZSk7CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyB2b2lkIHB1dFJhbmRvbShCbGFja2hvbGUgYmgpIHRocm93cyBJbk1lbW9yeVRyaWUuU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlPiB0cmllID0gbmV3IEluTWVtb3J5VHJpZShidWZmZXJUeXBlKTsKKyAgICAgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKDEpOworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVba2V5TGVuZ3RoXTsKKworICAgICAgICBmb3IgKGxvbmcgY3VycmVudCA9IDA7IGN1cnJlbnQgPCBjb3VudDsgKytjdXJyZW50KQorICAgICAgICB7CisgICAgICAgICAgICByYW5kLm5leHRCeXRlcyhidWYpOworICAgICAgICAgICAgdHJpZS5wdXRSZWN1cnNpdmUoQnl0ZUNvbXBhcmFibGUuZml4ZWRMZW5ndGgoYnVmKSwgQnl0ZS52YWx1ZU9mKGJ1ZlswXSksIHJlc29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUFJJTlRfU0laRVMpCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odHJpZS52YWx1ZXNDb3VudCgpKTsKKyAgICAgICAgYmguY29uc3VtZSh0cmllKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgYXBwbHlTZXF1ZW50aWFsKEJsYWNraG9sZSBiaCkgdGhyb3dzIEluTWVtb3J5VHJpZS5TcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSW5NZW1vcnlUcmllPEJ5dGU+IHRyaWUgPSBuZXcgSW5NZW1vcnlUcmllKGJ1ZmZlclR5cGUpOworICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoa2V5TGVuZ3RoKTsKKworICAgICAgICBmb3IgKGxvbmcgY3VycmVudCA9IDA7IGN1cnJlbnQgPCBjb3VudDsgKytjdXJyZW50KQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGwgPSBjdXJyZW50OworICAgICAgICAgICAgYnVmLnB1dExvbmcoa2V5TGVuZ3RoIC0gOCwgbCk7CisgICAgICAgICAgICB0cmllLnB1dFNpbmdsZXRvbihCeXRlQ29tcGFyYWJsZS5maXhlZExlbmd0aChidWYpLCBCeXRlLnZhbHVlT2YoKGJ5dGUpIChsID4+IDU2KSksIHJlc29sdmVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUFJJTlRfU0laRVMpCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odHJpZS52YWx1ZXNDb3VudCgpKTsKKyAgICAgICAgYmguY29uc3VtZSh0cmllKTsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIHZvaWQgYXBwbHlSYW5kb20oQmxhY2tob2xlIGJoKSB0aHJvd3MgSW5NZW1vcnlUcmllLlNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBJbk1lbW9yeVRyaWU8Qnl0ZT4gdHJpZSA9IG5ldyBJbk1lbW9yeVRyaWUoYnVmZmVyVHlwZSk7CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgxKTsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2tleUxlbmd0aF07CisKKyAgICAgICAgZm9yIChsb25nIGN1cnJlbnQgPSAwOyBjdXJyZW50IDwgY291bnQ7ICsrY3VycmVudCkKKyAgICAgICAgeworICAgICAgICAgICAgcmFuZC5uZXh0Qnl0ZXMoYnVmKTsKKyAgICAgICAgICAgIHRyaWUucHV0U2luZ2xldG9uKEJ5dGVDb21wYXJhYmxlLmZpeGVkTGVuZ3RoKGJ1ZiksIEJ5dGUudmFsdWVPZihidWZbMF0pLCByZXNvbHZlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFBSSU5UX1NJWkVTKQorICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRyaWUudmFsdWVzQ291bnQoKSk7CisgICAgICAgIGJoLmNvbnN1bWUodHJpZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vQ2xhc3NUcmFuc2Zvcm1lci5qYXZhIGIvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vQ2xhc3NUcmFuc2Zvcm1lci5qYXZhCmluZGV4IDZlNmIwZDMuLjc3OGU0NGMgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2ltdWxhdG9yL2FzbS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvYXNtL0NsYXNzVHJhbnNmb3JtZXIuamF2YQorKysgYi90ZXN0L3NpbXVsYXRvci9hc20vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2FzbS9DbGFzc1RyYW5zZm9ybWVyLmphdmEKQEAgLTExMCw2ICsxMTAsOCBAQAogICAgIHByaXZhdGUgZmluYWwgRW51bVNldDxGbGFnPiBmbGFnczsKICAgICBwcml2YXRlIGZpbmFsIENvbnN1bWVyPFN0cmluZz4gZGVwZW5kZW50VHlwZXM7CiAKKyAgICBwcml2YXRlIGJvb2xlYW4gdXBkYXRlVmlzaWJpbGl0eSA9IGZhbHNlOworCiAgICAgQ2xhc3NUcmFuc2Zvcm1lcihpbnQgYXBpLCBTdHJpbmcgY2xhc3NOYW1lLCBFbnVtU2V0PEZsYWc+IGZsYWdzLCBDb25zdW1lcjxTdHJpbmc+IGRlcGVuZGVudFR5cGVzKQogICAgIHsKICAgICAgICAgdGhpcyhhcGksIG5ldyBDbGFzc1dyaXRlcigwKSwgY2xhc3NOYW1lLCBmbGFncywgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgZGVwZW5kZW50VHlwZXMpOwpAQCAtMTM3LDEyICsxMzksNTggQEAKICAgICAgICAgdGhpcy5tZXRob2RMb2dnZXIgPSBNZXRob2RMb2dnZXIubG9nKGFwaSwgY2xhc3NOYW1lKTsKICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRVcGRhdGVWaXNpYmlsaXR5KGJvb2xlYW4gdXBkYXRlVmlzaWJpbGl0eSkKKyAgICB7CisgICAgICAgIHRoaXMudXBkYXRlVmlzaWJpbGl0eSA9IHVwZGF0ZVZpc2liaWxpdHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSmF2YSAxMSBjaGFuZ2VkIHRoZSB3YXkgdGhhdCBjbGFzc2VzIGRlZmluZWQgaW4gdGhlIHNhbWUgc291cmNlIGZpbGUgZ2V0IGFjY2VzcyB0byBwcml2YXRlIHN0YXRlIChzZWUgaHR0cHM6Ly9vcGVuamRrLm9yZy9qZXBzLzE4MSksCisgICAgICogcmF0aGVyIHRoYW4gdHJ5aW5nIHRvIGFkYXB0IHRvIHRoaXMsIHRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIG1ha2UgdGhlIGZpZWxkL21ldGhvZC9jbGFzcyBwdWJsaWMgc28gdGhhdCBhY2Nlc3MKKyAgICAgKiBpcyBub3QgcmVzdHJpY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYWtlUHVibGljKGludCBhY2Nlc3MpCisgICAgeworICAgICAgICBpZiAoIXVwZGF0ZVZpc2liaWxpdHkpCisgICAgICAgICAgICByZXR1cm4gYWNjZXNzOworICAgICAgICAvLyBsZWF2ZSBub24tdXNlciBjcmVhdGVkIG1ldGhvZHMvZmllbGRzL2V0Yy4gYWxvbmUKKyAgICAgICAgaWYgKGNvbnRhaW5zKGFjY2VzcywgT3Bjb2Rlcy5BQ0NfQlJJREdFKSB8fCBjb250YWlucyhhY2Nlc3MsIE9wY29kZXMuQUNDX1NZTlRIRVRJQykpCisgICAgICAgICAgICByZXR1cm4gYWNjZXNzOworICAgICAgICBpZiAoY29udGFpbnMoYWNjZXNzLCBPcGNvZGVzLkFDQ19QUklWQVRFKSkKKyAgICAgICAgeworICAgICAgICAgICAgYWNjZXNzICY9IH5PcGNvZGVzLkFDQ19QUklWQVRFOworICAgICAgICAgICAgYWNjZXNzIHw9IE9wY29kZXMuQUNDX1BVQkxJQzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChjb250YWlucyhhY2Nlc3MsIE9wY29kZXMuQUNDX1BST1RFQ1RFRCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFjY2VzcyAmPSB+T3Bjb2Rlcy5BQ0NfUFJPVEVDVEVEOworICAgICAgICAgICAgYWNjZXNzIHw9IE9wY29kZXMuQUNDX1BVQkxJQzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghY29udGFpbnMoYWNjZXNzLCBPcGNvZGVzLkFDQ19QVUJMSUMpKSAvLyBwYWNrYWdlLXByb3RlY3RlZAorICAgICAgICB7CisgICAgICAgICAgICBhY2Nlc3MgfD0gT3Bjb2Rlcy5BQ0NfUFVCTElDOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhY2Nlc3M7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhpbnQgdmFsdWUsIGludCBtYXNrKQorICAgIHsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSAmIG1hc2spICE9IDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXQoaW50IHZlcnNpb24sIGludCBhY2Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc2lnbmF0dXJlLCBTdHJpbmcgc3VwZXJOYW1lLCBTdHJpbmdbXSBpbnRlcmZhY2VzKQorICAgIHsKKyAgICAgICAgc3VwZXIudmlzaXQodmVyc2lvbiwgbWFrZVB1YmxpYyhhY2Nlc3MpLCBuYW1lLCBzaWduYXR1cmUsIHN1cGVyTmFtZSwgaW50ZXJmYWNlcyk7CisKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgRmllbGRWaXNpdG9yIHZpc2l0RmllbGQoaW50IGFjY2VzcywgU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjcmlwdG9yLCBTdHJpbmcgc2lnbmF0dXJlLCBPYmplY3QgdmFsdWUpCiAgICAgewogICAgICAgICBpZiAoZGVwZW5kZW50VHlwZXMgIT0gbnVsbCkKICAgICAgICAgICAgIFV0aWxzLnZpc2l0SWZSZWZUeXBlKGRlc2NyaXB0b3IsIGRlcGVuZGVudFR5cGVzKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0RmllbGQoYWNjZXNzLCBuYW1lLCBkZXNjcmlwdG9yLCBzaWduYXR1cmUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0RmllbGQobWFrZVB1YmxpYyhhY2Nlc3MpLCBuYW1lLCBkZXNjcmlwdG9yLCBzaWduYXR1cmUsIHZhbHVlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTE3Niw2ICsyMjQsNyBAQAogICAgICAgICAgICAgaXNUb1N0cmluZyA9IHRydWU7CiAgICAgICAgIH0KIAorICAgICAgICBhY2Nlc3MgPSBtYWtlUHVibGljKGFjY2Vzcyk7CiAgICAgICAgIE1ldGhvZFZpc2l0b3IgdmlzaXRvcjsKICAgICAgICAgaWYgKGZsYWdzLmNvbnRhaW5zKE1PTklUT1JTKSAmJiAoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1lOQ0hST05JWkVEKSAhPSAwKQogICAgICAgICB7CmRpZmYgLS1naXQgYS90ZXN0L3NpbXVsYXRvci9hc20vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2FzbS9JbnRlcmNlcHRBZ2VudC5qYXZhIGIvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vSW50ZXJjZXB0QWdlbnQuamF2YQppbmRleCA4N2NmYWIwLi5jNGJlYWY5IDEwMDY0NAotLS0gYS90ZXN0L3NpbXVsYXRvci9hc20vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2FzbS9JbnRlcmNlcHRBZ2VudC5qYXZhCisrKyBiL3Rlc3Qvc2ltdWxhdG9yL2FzbS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvYXNtL0ludGVyY2VwdEFnZW50LmphdmEKQEAgLTU0LDYgKzU0LDggQEAKIGltcG9ydCBzdGF0aWMgb3JnLm9iamVjdHdlYi5hc20uT3Bjb2Rlcy5JUkVUVVJOOwogaW1wb3J0IHN0YXRpYyBvcmcub2JqZWN0d2ViLmFzbS5PcGNvZGVzLlJFVFVSTjsKIAorLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgYmVsb3cgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKKwogLyoqCiAgKiBBIG1lY2hhbmlzbSBmb3Igd2VhdmluZyBjbGFzc2VzIGxvYWRlZCBieSB0aGUgYm9vdHN0cmFwIGNsYXNzbG9hZGVyIHRoYXQgd2UgY2Fubm90IG92ZXJyaWRlLgogICogVGhlIGRlc2lnbiBzdXBwb3J0cyB3ZWF2aW5nIG9mIHRoZSBpbnRlcm5hbHMgb2YgdGhlc2UgY2xhc3NlcywgYW5kIGluIGZ1dHVyZSB3ZSBtYXkgd2FudCB0bwpAQCAtMjk2LDEyICsyOTgsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdE1ldGhvZEluc24oSU5WT0tFU1RBVElDLCAiamF2YS9sYW5nL1RocmVhZCIsICJjdXJyZW50VGhyZWFkIiwgIigpTGphdmEvbGFuZy9UaHJlYWQ7IiwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0RmllbGRJbnNuKEdFVFNUQVRJQywgImphdmEvdXRpbC9jb25jdXJyZW50L1RocmVhZExvY2FsUmFuZG9tIiwgIlNFRUQiLCAiSiIpOwogICAgICAgICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0TWV0aG9kSW5zbihJTlZPS0VTVEFUSUMsICJvcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3Ivc3lzdGVtcy9JbnRlcmNlcHRvck9mU3lzdGVtTWV0aG9kcyRHbG9iYWwiLCAicmFuZG9tU2VlZCIsICIoKUoiLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXRNZXRob2RJbnNuKElOVk9LRVZJUlRVQUwsICJzdW4vbWlzYy9VbnNhZmUiLCAicHV0TG9uZyIsICIoTGphdmEvbGFuZy9PYmplY3Q7SkopViIsIGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5zYWZlQ2xhc3MgPSBVdGlscy5kZXNjcmlwdG9yVG9DbGFzc05hbWUodW5zYWZlRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXRNZXRob2RJbnNuKElOVk9LRVZJUlRVQUwsIHVuc2FmZUNsYXNzLCAicHV0TG9uZyIsICIoTGphdmEvbGFuZy9PYmplY3Q7SkopViIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdEZpZWxkSW5zbihHRVRTVEFUSUMsICJqYXZhL3V0aWwvY29uY3VycmVudC9UaHJlYWRMb2NhbFJhbmRvbSIsIHVuc2FmZUZpZWxkTmFtZSwgdW5zYWZlRGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXRNZXRob2RJbnNuKElOVk9LRVNUQVRJQywgImphdmEvbGFuZy9UaHJlYWQiLCAiY3VycmVudFRocmVhZCIsICIoKUxqYXZhL2xhbmcvVGhyZWFkOyIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdEZpZWxkSW5zbihHRVRTVEFUSUMsICJqYXZhL3V0aWwvY29uY3VycmVudC9UaHJlYWRMb2NhbFJhbmRvbSIsICJQUk9CRSIsICJKIik7CiAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXRMZGNJbnNuKDApOwotICAgICAgICAgICAgICAgICAgICB2aXNpdG9yLnZpc2l0TWV0aG9kSW5zbihJTlZPS0VWSVJUVUFMLCAic3VuL21pc2MvVW5zYWZlIiwgInB1dEludCIsICIoTGphdmEvbGFuZy9PYmplY3Q7SkkpViIsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRvci52aXNpdE1ldGhvZEluc24oSU5WT0tFVklSVFVBTCwgdW5zYWZlQ2xhc3MsICJwdXRJbnQiLCAiKExqYXZhL2xhbmcvT2JqZWN0O0pJKVYiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXRJbnNuKFJFVFVSTik7CiAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXRMYWJlbChuZXcgTGFiZWwoKSk7CiAgICAgICAgICAgICAgICAgICAgIHZpc2l0b3IudmlzaXRNYXhzKDYsIDEpOwpkaWZmIC0tZ2l0IGEvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vSW50ZXJjZXB0Q2xhc3Nlcy5qYXZhIGIvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vSW50ZXJjZXB0Q2xhc3Nlcy5qYXZhCmluZGV4IGE1NzA3NGQuLjQ3M2NjMjcgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2ltdWxhdG9yL2FzbS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvYXNtL0ludGVyY2VwdENsYXNzZXMuamF2YQorKysgYi90ZXN0L3NpbXVsYXRvci9hc20vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2FzbS9JbnRlcmNlcHRDbGFzc2VzLmphdmEKQEAgLTI0Niw2ICsyNDYsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgQ2xhc3NUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IG5ldyBDbGFzc1RyYW5zZm9ybWVyKGFwaSwgaW50ZXJuYWxOYW1lLCBmbGFncywgbW9uaXRvckRlbGF5Q2hhbmNlLCBuZXcgTmVtZXNpc0dlbmVyYXRvcihhcGksIGludGVybmFsTmFtZSwgbmVtZXNpc0NoYW5jZSksIG5lbWVzaXNGaWVsZFNlbGVjdG9yLCBoYXNoY29kZSwgZGVwZW5kZW50VHlwZXMpOworICAgICAgICB0cmFuc2Zvcm1lci5zZXRVcGRhdGVWaXNpYmlsaXR5KHRydWUpOwogICAgICAgICB0cmFuc2Zvcm1lci5yZWFkQW5kVHJhbnNmb3JtKGlucHV0KTsKIAogICAgICAgICBpZiAoIXRyYW5zZm9ybWVyLmlzVHJhbnNmb3JtZWQoKSkKZGlmZiAtLWdpdCBhL3Rlc3Qvc2ltdWxhdG9yL2FzbS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvYXNtL01ldGhvZExvZ2dlci5qYXZhIGIvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vTWV0aG9kTG9nZ2VyLmphdmEKaW5kZXggMWU2YTg0NC4uN2U2YTY4OSAxMDA2NDQKLS0tIGEvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vTWV0aG9kTG9nZ2VyLmphdmEKKysrIGIvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vTWV0aG9kTG9nZ2VyLmphdmEKQEAgLTM3LDYgKzM3LDggQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLmFzbS5NZXRob2RMb2dnZXIuTGV2ZWwuTk9ORTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLmFzbS5NZXRob2RMb2dnZXIuTGV2ZWwudmFsdWVPZjsKIAorLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgYmVsb3cgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKKwogLy8gVE9ETyAoY29uZmlnKTogc3VwcG9ydCBsb2dnaW5nIG9ubHkgZm9yIHBhY2thZ2VzL2NsYXNzZXMgbWF0Y2hpbmcgYSBwYXR0ZXJuCiBpbnRlcmZhY2UgTWV0aG9kTG9nZ2VyCiB7CmRpZmYgLS1naXQgYS90ZXN0L3NpbXVsYXRvci9hc20vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2FzbS9VdGlscy5qYXZhIGIvdGVzdC9zaW11bGF0b3IvYXNtL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9hc20vVXRpbHMuamF2YQppbmRleCBiZTJlZjZjLi5kNzEwZmZlIDEwMDY0NAotLS0gYS90ZXN0L3NpbXVsYXRvci9hc20vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2FzbS9VdGlscy5qYXZhCisrKyBiL3Rlc3Qvc2ltdWxhdG9yL2FzbS9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvYXNtL1V0aWxzLmphdmEKQEAgLTI4Nyw0ICsyODcsMTIgQEAKICAgICAgICAgICAgICAgICBmb3JFYWNoLmFjY2VwdChkZXNjcmlwdG9yLnN1YnN0cmluZyhpICsgMSwgZGVzY3JpcHRvci5sZW5ndGgoKSAtIDEpKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2NyaXB0b3JUb0NsYXNzTmFtZShTdHJpbmcgZGVzYykKKyAgICB7CisgICAgICAgIC8vIHNhbXBsZXM6ICJMamRrL2ludGVybmFsL21pc2MvVW5zYWZlOyIsICJMc3VuL21pc2MvVW5zYWZlOyIKKyAgICAgICAgaWYgKCEoZGVzYy5zdGFydHNXaXRoKCJMIikgJiYgZGVzYy5lbmRzV2l0aCgiOyIpKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuYWJsZSB0byBwYXJzZSBkZXNjcmlwdG9yOiAiICsgZGVzYyk7CisgICAgICAgIHJldHVybiBkZXNjLnN1YnN0cmluZygxLCBkZXNjLmxlbmd0aCgpIC0gMSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvQWN0aW9uU2NoZWR1bGUuamF2YSBiL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL0FjdGlvblNjaGVkdWxlLmphdmEKaW5kZXggMThmYzg3Ny4uNjExOWU0NyAxMDA2NDQKLS0tIGEvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvQWN0aW9uU2NoZWR1bGUuamF2YQorKysgYi90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9BY3Rpb25TY2hlZHVsZS5qYXZhCkBAIC00Myw2ICs0Myw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvc2VhYmxlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfU0lNVUxBVE9SX0RFQlVHOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuQWN0aW9uLk1vZGlmaWVyLkRBRU1PTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLkFjdGlvbi5Nb2RpZmllci5TVFJFQU07CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5BY3Rpb24uUGhhc2UuQ09OU0VRVUVOQ0U7CkBAIC0zMDAsNyArMzAxLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlNpbXVsYXRpb24gZmFpbGVkIHRvIG1ha2UgcHJvZ3Jlc3MuIFJ1biB3aXRoIC1EY2Fzc2FuZHJhLnRlc3Quc2ltdWxhdG9yLmRlYnVnPXRydWUgdG8gc2VlIHRoZSBibG9ja2VkIHRhc2sgZ3JhcGguIEJsb2NrZWQgdGFza3M6Iik7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJTaW11bGF0aW9uIGZhaWxlZCB0byBtYWtlIHByb2dyZXNzLiBSdW4gd2l0aCAtRHt9PXRydWUgdG8gc2VlIHRoZSBibG9ja2VkIHRhc2sgZ3JhcGguIEJsb2NrZWQgdGFza3M6IiwgVEVTVF9TSU1VTEFUT1JfREVCVUcuZ2V0S2V5KCkpOwogICAgICAgICAgICAgICAgIGFjdGlvbnMgPSBzZXF1ZW5jZXMudmFsdWVzKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIocyAtPiBzLm9uIGluc3RhbmNlb2YgT3JkZXJPbklkKQpkaWZmIC0tZ2l0IGEvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvQ2x1c3RlclNpbXVsYXRpb24uamF2YSBiL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL0NsdXN0ZXJTaW11bGF0aW9uLmphdmEKaW5kZXggY2FmNjQyZS4uODkyZTkwNCAxMDA2NDQKLS0tIGEvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvQ2x1c3RlclNpbXVsYXRpb24uamF2YQorKysgYi90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9DbHVzdGVyU2ltdWxhdGlvbi5qYXZhCkBAIC0yMSw4ICsyMSw4IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTeXN0ZW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0zNSw4ICszNSw2IEBACiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5qaW1mcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmppbWZzLkppbWZzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5Bc3luY0Z1bmN0aW9uOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5GdXR1cmVDYWxsYmFjazsKIApAQCAtNTUsNiArNTMsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmltcGwuRGlyZWN0U3RyZWFtaW5nQ29ubmVjdGlvbkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuaW1wbC5Jc29sYXRlZEV4ZWN1dG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkxaNENvbXByZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlU3lzdGVtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLkJhbGxvdEdlbmVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLlBheG9zUHJlcGFyZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuUmFuZG9tU291cmNlLkNob2ljZXM7CkBAIC02Miw2ICs2MSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLmFzbS5OZW1lc2lzRmllbGRTZWxlY3RvcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLmNsdXN0ZXIuQ2x1c3RlckFjdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLmNsdXN0ZXIuQ2x1c3RlckFjdGlvbnMuVG9wb2xvZ3lDaGFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uZmlsZXN5c3RlbS5MaXN0ZW5hYmxlRmlsZVN5c3RlbTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3Iuc3lzdGVtcy5GYWlsdXJlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3Iuc3lzdGVtcy5JbnRlcmNlcHRlZFdhaXQuQ2FwdHVyZVNpdGVzLkNhcHR1cmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLnN5c3RlbXMuSW50ZXJjZXB0aWJsZVRocmVhZDsKQEAgLTYwNyw3ICs2MDcsNyBAQAogICAgIHB1YmxpYyBmaW5hbCBTaW11bGF0ZWRTeXN0ZW1zIHNpbXVsYXRlZDsKICAgICBwdWJsaWMgZmluYWwgQ2x1c3RlciBjbHVzdGVyOwogICAgIHB1YmxpYyBmaW5hbCBTIHNpbXVsYXRpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBGaWxlU3lzdGVtIGppbWZzOworICAgIHByaXZhdGUgZmluYWwgTGlzdGVuYWJsZUZpbGVTeXN0ZW0gZnM7CiAgICAgcHJvdGVjdGVkIGZpbmFsIE1hcDxJbnRlZ2VyLCBMaXN0PENsb3NlYWJsZT4+IG9uVW5leHBlY3RlZFNodXRkb3duID0gbmV3IFRyZWVNYXA8PigpOwogICAgIHByb3RlY3RlZCBmaW5hbCBMaXN0PENhbGxhYmxlPFZvaWQ+PiBvblNodXRkb3duID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKICAgICBwcm90ZWN0ZWQgZmluYWwgVGhyZWFkTG9jYWxSYW5kb21DaGVjayB0aHJlYWRMb2NhbFJhbmRvbUNoZWNrOwpAQCAtNjE4LDkgKzYxOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXVsYXRpb25GYWN0b3J5PFM+IGZhY3RvcnkpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgdGhpcy5yYW5kb20gPSByYW5kb207Ci0gICAgICAgIHRoaXMuamltZnMgID0gSmltZnMubmV3RmlsZVN5c3RlbShMb25nLnRvSGV4U3RyaW5nKHNlZWQpICsgJ3gnICsgdW5pcXVlTnVtLCBDb25maWd1cmF0aW9uLnVuaXgoKS50b0J1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNYXhTaXplKDRMIDw8IDMwKS5zZXRCbG9ja1NpemUoNTEyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgdGhpcy5mcyA9IG5ldyBMaXN0ZW5hYmxlRmlsZVN5c3RlbShGaWxlU3lzdGVtcy5qaW1mcyhMb25nLnRvSGV4U3RyaW5nKHNlZWQpICsgJ3gnICsgdW5pcXVlTnVtKSk7CiAKICAgICAgICAgZmluYWwgU2ltdWxhdGVkTWVzc2FnZURlbGl2ZXJ5IGRlbGl2ZXJ5OwogICAgICAgICBmaW5hbCBTaW11bGF0ZWRFeGVjdXRpb24gZXhlY3V0aW9uOwpAQCAtNjcwLDIzICs2NjgsMjggQEAKIAogICAgICAgICBGYWlsdXJlcyBmYWlsdXJlcyA9IG5ldyBGYWlsdXJlcygpOwogICAgICAgICBUaHJlYWRBbGxvY2F0b3IgdGhyZWFkQWxsb2NhdG9yID0gbmV3IFRocmVhZEFsbG9jYXRvcihyYW5kb20sIGJ1aWxkZXIudGhyZWFkQ291bnQsIG51bU9mTm9kZXMpOworICAgICAgICBMaXN0PFN0cmluZz4gYWxsb3dlZERpc2tBY2Nlc3NNb2RlcyA9IEFycmF5cy5hc0xpc3QoIm1tYXAiLCAibW1hcF9pbmRleF9vbmx5IiwgInN0YW5kYXJkIik7CisgICAgICAgIFN0cmluZyBkaXNrX2FjY2Vzc19tb2RlID0gYWxsb3dlZERpc2tBY2Nlc3NNb2Rlcy5nZXQocmFuZG9tLnVuaWZvcm0oMCwgYWxsb3dlZERpc2tBY2Nlc3NNb2Rlcy5zaXplKCkgLSAxKSk7CisgICAgICAgIGJvb2xlYW4gY29tbWl0bG9nQ29tcHJlc3NlZCA9IHJhbmRvbS5kZWNpZGUoLjVmKTsKICAgICAgICAgY2x1c3RlciA9IHNuaXRjaC5zZXR1cChDbHVzdGVyLmJ1aWxkKG51bU9mTm9kZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhSb290KGppbWZzLmdldFBhdGgoIi9jYXNzYW5kcmEiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFJvb3QoZnMuZ2V0UGF0aCgiL2Nhc3NhbmRyYSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU2hhcmVkQ2xhc3NlcyhzaGFyZWRDbGFzc1ByZWRpY2F0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjb25maWcgLT4gY29uZmlnVXBkYXRlci5hY2NlcHQodGhyZWFkQWxsb2NhdG9yLnVwZGF0ZShjb25maWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGgoRmVhdHVyZS5CTEFOS19HT1NTSVApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoInJlYWRfcmVxdWVzdF90aW1lb3V0IiwgU3RyaW5nLmZvcm1hdCgiJWRtcyIsIE5BTk9TRUNPTkRTLnRvTWlsbGlzKGJ1aWxkZXIucmVhZFRpbWVvdXROYW5vcykpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJ3cml0ZV9yZXF1ZXN0X3RpbWVvdXQiLCBTdHJpbmcuZm9ybWF0KCIlZG1zIiwgTkFOT1NFQ09ORFMudG9NaWxsaXMoYnVpbGRlci53cml0ZVRpbWVvdXROYW5vcykpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJjYXNfY29udGVudGlvbl90aW1lb3V0IiwgU3RyaW5nLmZvcm1hdCgiJWRtcyIsIE5BTk9TRUNPTkRTLnRvTWlsbGlzKGJ1aWxkZXIuY29udGVudGlvblRpbWVvdXROYW5vcykpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJyZXF1ZXN0X3RpbWVvdXQiLCBTdHJpbmcuZm9ybWF0KCIlZG1zIiwgTkFOT1NFQ09ORFMudG9NaWxsaXMoYnVpbGRlci5yZXF1ZXN0VGltZW91dE5hbm9zKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoIm1lbXRhYmxlX2hlYXBfc3BhY2UiLCAiMU1pQiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoIm1lbXRhYmxlX2FsbG9jYXRpb25fdHlwZSIsIGJ1aWxkZXIubWVtb3J5TGlzdGVuZXIgIT0gbnVsbCA/ICJ1bnNsYWJiZWRfaGVhcF9idWZmZXJzX2xvZ2dlZCIgOiAiaGVhcF9idWZmZXJzIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgiZmlsZV9jYWNoZV9zaXplIiwgIjE2TWlCIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgidXNlX2RldGVybWluaXN0aWNfdGFibGVfaWQiLCB0cnVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJkaXNrX2FjY2Vzc19tb2RlIiwgInN0YW5kYXJkIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgiZmFpbHVyZV9kZXRlY3RvciIsIFNpbXVsYXRlZEZhaWx1cmVEZXRlY3Rvci5JbnN0YW5jZS5jbGFzcy5nZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoImNvbW1pdGxvZ19jb21wcmVzc2lvbiIsIG5ldyBQYXJhbWV0ZXJpemVkQ2xhc3MoTFo0Q29tcHJlc3Nvci5jbGFzcy5nZXROYW1lKCksIGVtcHR5TWFwKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICkpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNvbmZpZyAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy53aXRoKEZlYXR1cmUuQkxBTktfR09TU0lQKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJyZWFkX3JlcXVlc3RfdGltZW91dCIsIFN0cmluZy5mb3JtYXQoIiVkbXMiLCBOQU5PU0VDT05EUy50b01pbGxpcyhidWlsZGVyLnJlYWRUaW1lb3V0TmFub3MpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgid3JpdGVfcmVxdWVzdF90aW1lb3V0IiwgU3RyaW5nLmZvcm1hdCgiJWRtcyIsIE5BTk9TRUNPTkRTLnRvTWlsbGlzKGJ1aWxkZXIud3JpdGVUaW1lb3V0TmFub3MpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgiY2FzX2NvbnRlbnRpb25fdGltZW91dCIsIFN0cmluZy5mb3JtYXQoIiVkbXMiLCBOQU5PU0VDT05EUy50b01pbGxpcyhidWlsZGVyLmNvbnRlbnRpb25UaW1lb3V0TmFub3MpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgicmVxdWVzdF90aW1lb3V0IiwgU3RyaW5nLmZvcm1hdCgiJWRtcyIsIE5BTk9TRUNPTkRTLnRvTWlsbGlzKGJ1aWxkZXIucmVxdWVzdFRpbWVvdXROYW5vcykpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJtZW10YWJsZV9oZWFwX3NwYWNlIiwgIjFNaUIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJtZW10YWJsZV9hbGxvY2F0aW9uX3R5cGUiLCBidWlsZGVyLm1lbW9yeUxpc3RlbmVyICE9IG51bGwgPyAidW5zbGFiYmVkX2hlYXBfYnVmZmVyc19sb2dnZWQiIDogImhlYXBfYnVmZmVycyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoImZpbGVfY2FjaGVfc2l6ZSIsICIxNk1pQiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoInVzZV9kZXRlcm1pbmlzdGljX3RhYmxlX2lkIiwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgiZGlza19hY2Nlc3NfbW9kZSIsIGRpc2tfYWNjZXNzX21vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoImZhaWx1cmVfZGV0ZWN0b3IiLCBTaW11bGF0ZWRGYWlsdXJlRGV0ZWN0b3IuSW5zdGFuY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1pdGxvZ0NvbXByZXNzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2V0KCJjb21taXRsb2dfY29tcHJlc3Npb24iLCBuZXcgUGFyYW1ldGVyaXplZENsYXNzKExaNENvbXByZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBlbXB0eU1hcCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1VwZGF0ZXIuYWNjZXB0KHRocmVhZEFsbG9jYXRvci51cGRhdGUoY29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEluc3RhbmNlSW5pdGlhbGl6ZXIobmV3IElJbnN0YW5jZUluaXRpYWxpemVyKCkKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvU2ltdWxhdGlvblJ1bm5lci5qYXZhIGIvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvU2ltdWxhdGlvblJ1bm5lci5qYXZhCmluZGV4IDZmMWViMTIuLjMyODg4ZjQgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL1NpbXVsYXRpb25SdW5uZXIuamF2YQorKysgYi90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9TaW11bGF0aW9uUnVubmVyLmphdmEKQEAgLTU0LDE4ICs1NCwyMSBAQAogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuc3RyZWFtOwogaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5OQU5PU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BTExPV19BTFRFUl9SRl9EVVJJTkdfUkFOR0VfTU9WRU1FTlQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQkFUQ0hfQ09NTUlUX0xPR19TWU5DX0lOVEVSVkFMOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9KTVhfUkVNT1RFX1BPUlQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0xPQ0tfR0xPQkFMOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNMT0NLX01PTk9UT05JQ19BUFBST1g7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0xPQ0tfTU9OT1RPTklDX1BSRUNJU0U7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuREVURVJNSU5JU01fQ09OU0lTVEVOVF9ESVJFQ1RPUllfTElTVElOR1M7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09OU0lTVEVOVF9ESVJFQ1RPUllfTElTVElOR1M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuREVURVJNSU5JU01fVU5TQUZFX1VVSURfTk9ERTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESVNBQkxFX1NTVEFCTEVfQUNUSVZJVFlfVFJBQ0tJTkc7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuREVURVJNSU5JU01fU1NUQUJMRV9DT01QUkVTU0lPTl9ERUZBVUxUOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkRURVNUX0FQSV9MT0dfVE9QT0xPR1k7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuR09TU0lQRVJfU0tJUF9XQUlUSU5HX1RPX1NFVFRMRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JR05PUkVfTUlTU0lOR19OQVRJVkVfRklMRV9ISU5UUzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5JU19ESVNBQkxFRF9NQkVBTl9SRUdJU1RSQVRJT047CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuT1JHX0FQQUNIRV9DQVNTQU5EUkFfRElTQUJMRV9NQkVBTl9SRUdJU1RSQVRJT047CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTElCSkVNQUxMT0M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTUVNVEFCTEVfT1ZFUkhFQURfU0laRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NSUdSQVRJT05fREVMQVk7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuUEFYT1NfUkVQQUlSX1JFVFJZX1RJTUVPVVRfSU5fTVM7CkBAIC05OSwxMiArMTAyLDEyIEBACiAgICAgICAgIHRyeSB7IENsb2NrLkdsb2JhbC5uYW5vVGltZSgpOyB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkge30gLy8gbWFrZSBzdXJlIHN0YXRpYyBpbml0aWFsaXplciBnZXRzIGNhbGxlZAogCiAgICAgICAgIC8vIFRPRE8gKGNsZWFudXApOiBkaXNhYmxlIHVubmVjZXNzYXJ5IHRoaW5ncyBsaWtlIGNvbXBhY3Rpb24gbG9nZ2VyIHRocmVhZHMgZXRjCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmxpYmplbWFsbG9jIiwgIi0iKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuZHRlc3QuYXBpLmxvZy50b3BvbG9neSIsICJmYWxzZSIpOworICAgICAgICBMSUJKRU1BTExPQy5zZXRTdHJpbmcoIi0iKTsKKyAgICAgICAgRFRFU1RfQVBJX0xPR19UT1BPTE9HWS5zZXRCb29sZWFuKGZhbHNlKTsKIAogICAgICAgICAvLyB0aGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gYWxsb3cgbm9uLW1lbWJlcnMgb2YgdGhlIHJpbmcgdG8gZXhpc3QgaW4gZ29zc2lwIHdpdGhvdXQgYnJlYWtpbmcgUkYgY2hhbmdlcwogICAgICAgICAvLyBpdCB3b3VsZCBiZSBuaWNlIG5vdCB0byByZWx5IG9uIHRoaXMsIGJ1dCBob3BlZnVsbHkgd2UnbGwgaGF2ZSBjb25zaXN0ZW50IHJhbmdlIG1vdmVtZW50cyBiZWZvcmUgaXQgbWF0dGVycwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5hbGxvd19hbHRlcl9yZl9kdXJpbmdfcmFuZ2VfbW92ZW1lbnQiLCAidHJ1ZSIpOworICAgICAgICBBTExPV19BTFRFUl9SRl9EVVJJTkdfUkFOR0VfTU9WRU1FTlQuc2V0Qm9vbGVhbih0cnVlKTsKIAogICAgICAgICBmb3IgKENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBwcm9wZXJ0eSA6IEFycmF5cy5hc0xpc3QoQ0xPQ0tfR0xPQkFMLCBDTE9DS19NT05PVE9OSUNfQVBQUk9YLCBDTE9DS19NT05PVE9OSUNfUFJFQ0lTRSkpCiAgICAgICAgICAgICBwcm9wZXJ0eS5zZXRTdHJpbmcoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5zeXN0ZW1zLlNpbXVsYXRlZFRpbWUkR2xvYmFsIik7CkBAIC0xMTgsMTQgKzEyMSwxNCBAQAogICAgICAgICBCQVRDSF9DT01NSVRfTE9HX1NZTkNfSU5URVJWQUwuc2V0SW50KC0xKTsKICAgICAgICAgRElTQUJMRV9TU1RBQkxFX0FDVElWSVRZX1RSQUNLSU5HLnNldEJvb2xlYW4oZmFsc2UpOwogICAgICAgICBERVRFUk1JTklTTV9TU1RBQkxFX0NPTVBSRVNTSU9OX0RFRkFVTFQuc2V0Qm9vbGVhbihmYWxzZSk7IC8vIGNvbXByZXNzaW9uIGNhdXNlcyB2YXJpYXRpb24gaW4gZmlsZSBzaXplIGZvciBlLmcuIFVVSURzLCBJUCBhZGRyZXNzZXMsIHJhbmRvbSBmaWxlIHBhdGhzCi0gICAgICAgIERFVEVSTUlOSVNNX0NPTlNJU1RFTlRfRElSRUNUT1JZX0xJU1RJTkdTLnNldEJvb2xlYW4odHJ1ZSk7CisgICAgICAgIENPTlNJU1RFTlRfRElSRUNUT1JZX0xJU1RJTkdTLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIFRFU1RfSUdOT1JFX1NJR0FSLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIFNZU1RFTV9BVVRIX0RFRkFVTFRfUkYuc2V0SW50KDMpOwogICAgICAgICBNSUdSQVRJT05fREVMQVkuc2V0SW50KEludGVnZXIuTUFYX1ZBTFVFKTsKICAgICAgICAgRElTQUJMRV9HT1NTSVBfRU5EUE9JTlRfUkVNT1ZBTC5zZXRCb29sZWFuKHRydWUpOwogICAgICAgICBNRU1UQUJMRV9PVkVSSEVBRF9TSVpFLnNldEludCgxMDApOwogICAgICAgICBJR05PUkVfTUlTU0lOR19OQVRJVkVfRklMRV9ISU5UUy5zZXRCb29sZWFuKHRydWUpOwotICAgICAgICBJU19ESVNBQkxFRF9NQkVBTl9SRUdJU1RSQVRJT04uc2V0Qm9vbGVhbih0cnVlKTsKKyAgICAgICAgT1JHX0FQQUNIRV9DQVNTQU5EUkFfRElTQUJMRV9NQkVBTl9SRUdJU1RSQVRJT04uc2V0Qm9vbGVhbih0cnVlKTsKICAgICAgICAgVEVTVF9KVk1fRFRFU1RfRElTQUJMRV9TU0wuc2V0Qm9vbGVhbih0cnVlKTsgLy8gdG8gc3VwcG9ydCBlYXNpbHkgcnVubmluZyB3aXRob3V0IG5ldHR5IGZyb20gZHRlc3QtamFyCiAKICAgICAgICAgaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgaW5zdGFuY2VvZiBJbnRlcmNlcHRpYmxlVGhyZWFkKTsgLy8gbG9hZCBJbnRlcmNlcHRpYmxlVGhyZWFkIGNsYXNzIHRvIGF2b2lkIGluZmluaXRlIGxvb3AgaW4gSW50ZXJjZXB0b3JPZkdsb2JhbE1ldGhvZHMKZGlmZiAtLWdpdCBhL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2RlYnVnL1JlY29uY2lsZS5qYXZhIGIvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvZGVidWcvUmVjb25jaWxlLmphdmEKaW5kZXggNWFjZjc2NC4uOGQwZWQ0NiAxMDA2NDQKLS0tIGEvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvZGVidWcvUmVjb25jaWxlLmphdmEKKysrIGIvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvZGVidWcvUmVjb25jaWxlLmphdmEKQEAgLTM1LDcgKzM1LDkgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzLkRhdGFJbnB1dFN0cmVhbVBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5DbHVzdGVyU2ltdWxhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuUmFuZG9tU291cmNlOwpAQCAtODAsNyArODIsNyBAQAogCiAgICAgICAgIFN0cmluZyByZWFkSW50ZXJuZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgaW50IGlkID0gKGludCkgaW4ucmVhZFZJbnQoKTsKKyAgICAgICAgICAgIGludCBpZCA9IGluLnJlYWRWSW50MzIoKTsKICAgICAgICAgICAgIGlmIChpZCA9PSBzdHJpbmdzLnNpemUoKSkgc3RyaW5ncy5hZGQoaW4ucmVhZFVURigpKTsKICAgICAgICAgICAgIGVsc2UgaWYgKGlkID4gc3RyaW5ncy5zaXplKCkpIHRocm93IGZhaWxXaXRoT09NKCk7CiAgICAgICAgICAgICByZXR1cm4gc3RyaW5ncy5nZXQoaWQpOwpAQCAtMjEwLDcgKzIxMiw3IEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBieXRlIHR5cGUgPSBpbi5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgICAgIGludCBjID0gKGludCkgaW4ucmVhZFZJbnQoKTsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IGluLnJlYWRWSW50MzIoKTsKICAgICAgICAgICAgICAgICBsb25nIHYgPSBpbi5yZWFkTG9uZygpOwogICAgICAgICAgICAgICAgIHRocmVhZHMuY2hlY2tUaHJlYWQoKTsKICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSA3IHx8IGMgIT0gY291bnQgfHwgdmFsdWUgIT0gdikKQEAgLTI0MCwxMSArMjQyLDExIEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBieXRlIHR5cGUgPSBpbi5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgICAgIGludCBjID0gKGludCkgaW4ucmVhZFZJbnQoKTsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IGluLnJlYWRWSW50MzIoKTsKICAgICAgICAgICAgICAgICB0aHJlYWRzLmNoZWNrVGhyZWFkKCk7Ci0gICAgICAgICAgICAgICAgaW50IG1pbjEgPSAoaW50KSBpbi5yZWFkVkludCgpOwotICAgICAgICAgICAgICAgIGludCBtYXgxID0gKGludCkgaW4ucmVhZFZJbnQoKSArIG1pbjE7Ci0gICAgICAgICAgICAgICAgaW50IHYxID0gKGludCkgaW4ucmVhZFZJbnQoKSArIG1pbjE7CisgICAgICAgICAgICAgICAgaW50IG1pbjEgPSBpbi5yZWFkVkludDMyKCk7CisgICAgICAgICAgICAgICAgaW50IG1heDEgPSBpbi5yZWFkVkludDMyKCkgKyBtaW4xOworICAgICAgICAgICAgICAgIGludCB2MSA9IGluLnJlYWRWSW50MzIoKSArIG1pbjE7CiAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gMSB8fCBtaW4gIT0gbWluMSB8fCBtYXggIT0gbWF4MSB8fCB2ICE9IHYxIHx8IGMgIT0gY291bnQpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoU3RyaW5nLmZvcm1hdCgiKCVkLCVkLCVkWyVkLCVkXSkgIT0gKCVkLCVkLCVkWyVkLCVkXSkiLCAxLCBjb3VudCwgdiwgbWluLCBtYXgsIHR5cGUsIGMsIHYxLCBtaW4xLCBtYXgxKSk7CkBAIC0yNzMsNyArMjc1LDcgQEAKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGJ5dGUgdHlwZSA9IGluLnJlYWRCeXRlKCk7Ci0gICAgICAgICAgICAgICAgaW50IGMgPSAoaW50KSBpbi5yZWFkVkludCgpOworICAgICAgICAgICAgICAgIGludCBjID0gaW4ucmVhZFZJbnQzMigpOwogICAgICAgICAgICAgICAgIHRocmVhZHMuY2hlY2tUaHJlYWQoKTsKICAgICAgICAgICAgICAgICBsb25nIG1pbjEgPSBpbi5yZWFkVkludCgpOwogICAgICAgICAgICAgICAgIGxvbmcgbWF4MSA9IGluLnJlYWRWSW50KCkgKyBtaW4xOwpAQCAtMzA2LDcgKzMwOCw3IEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBieXRlIHR5cGUgPSBpbi5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgICAgIGludCBjID0gKGludCkgaW4ucmVhZFZJbnQoKTsKKyAgICAgICAgICAgICAgICBpbnQgYyA9IGluLnJlYWRWSW50MzIoKTsKICAgICAgICAgICAgICAgICB0aHJlYWRzLmNoZWNrVGhyZWFkKCk7CiAgICAgICAgICAgICAgICAgZmxvYXQgdjEgPSBpbi5yZWFkRmxvYXQoKTsKICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSAzIHx8IHYgIT0gdjEgfHwgYyAhPSBjb3VudCkKQEAgLTMzOCw3ICszNDAsNyBAQAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYnl0ZSB0eXBlID0gaW4ucmVhZEJ5dGUoKTsKLSAgICAgICAgICAgICAgICBpbnQgYyA9IChpbnQpIGluLnJlYWRWSW50KCk7CisgICAgICAgICAgICAgICAgaW50IGMgPSBpbi5yZWFkVkludDMyKCk7CiAgICAgICAgICAgICAgICAgdGhyZWFkcy5jaGVja1RocmVhZCgpOwogICAgICAgICAgICAgICAgIGRvdWJsZSB2MSA9IGluLnJlYWREb3VibGUoKTsKICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSA2IHx8IHYgIT0gdjEgfHwgYyAhPSBjb3VudCkKQEAgLTM2OSw3ICszNzEsNyBAQAogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYnl0ZSB0eXBlID0gaW4ucmVhZEJ5dGUoKTsKLSAgICAgICAgICAgICAgICBpbnQgYyA9IChpbnQpIGluLnJlYWRWSW50KCk7CisgICAgICAgICAgICAgICAgaW50IGMgPSBpbi5yZWFkVkludDMyKCk7CiAgICAgICAgICAgICAgICAgbG9uZyB2MSA9IGluLnJlYWRWSW50KCk7CiAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT0gNCB8fCBzZWVkICE9IHYxIHx8IGMgIT0gY291bnQpCiAgICAgICAgICAgICAgICAgICAgIHRocm93IGZhaWxXaXRoT09NKCk7CkBAIC0zOTUsNyArMzk3LDcgQEAKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGJ5dGUgdHlwZSA9IGluLnJlYWRCeXRlKCk7Ci0gICAgICAgICAgICAgICAgaW50IGMgPSAoaW50KSBpbi5yZWFkVkludCgpOworICAgICAgICAgICAgICAgIGludCBjID0gaW4ucmVhZFZJbnQzMigpOwogICAgICAgICAgICAgICAgIGxvbmcgdjEgPSBpbi5yZWFkVkludCgpOwogICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IDUgfHwgdiAhPSB2MSB8fCBjICE9IGNvdW50KQogICAgICAgICAgICAgICAgICAgICB0aHJvdyBmYWlsV2l0aE9PTSgpOwpAQCAtNDMzLDggKzQzNSw4IEBACiAgICAgICAgIEZpbGUgdGltZUZpbGUgPSBuZXcgRmlsZShuZXcgRmlsZShsb2FkRnJvbURpciksIExvbmcudG9IZXhTdHJpbmcoc2VlZCkgKyAiLnRpbWUuZ3oiKTsKIAogICAgICAgICB0cnkgKEJ1ZmZlcmVkUmVhZGVyIGV2ZW50SW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBHWklQSW5wdXRTdHJlYW0oZXZlbnRGaWxlLm5ld0lucHV0U3RyZWFtKCkpKSk7Ci0gICAgICAgICAgICAgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzIHJuZ0luID0gbmV3IERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cyhybmdGaWxlLmV4aXN0cygpICYmIHdpdGhSbmcgIT0gTk9ORSA/IG5ldyBHWklQSW5wdXRTdHJlYW0ocm5nRmlsZS5uZXdJbnB1dFN0cmVhbSgpKSA6IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOwotICAgICAgICAgICAgIERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cyB0aW1lSW4gPSBuZXcgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzKHRpbWVGaWxlLmV4aXN0cygpICYmIHdpdGhUaW1lICE9IE5PTkUgPyBuZXcgR1pJUElucHV0U3RyZWFtKHRpbWVGaWxlLm5ld0lucHV0U3RyZWFtKCkpIDogbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSkpCisgICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtUGx1cyBybmdJbiA9IFV0aWwuRGF0YUlucHV0U3RyZWFtUGx1c0ltcGwud3JhcChybmdGaWxlLmV4aXN0cygpICYmIHdpdGhSbmcgIT0gTk9ORSA/IG5ldyBHWklQSW5wdXRTdHJlYW0ocm5nRmlsZS5uZXdJbnB1dFN0cmVhbSgpKSA6IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOworICAgICAgICAgICAgIERhdGFJbnB1dFN0cmVhbVBsdXMgdGltZUluID0gVXRpbC5EYXRhSW5wdXRTdHJlYW1QbHVzSW1wbC53cmFwKHRpbWVGaWxlLmV4aXN0cygpICYmIHdpdGhUaW1lICE9IE5PTkUgPyBuZXcgR1pJUElucHV0U3RyZWFtKHRpbWVGaWxlLm5ld0lucHV0U3RyZWFtKCkpIDogbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGJvb2xlYW4gaW5wdXRIYXNXYWl0U2l0ZXMsIGlucHV0SGFzV2FrZVNpdGVzLCBpbnB1dEhhc1JuZ0NhbGxTaXRlcywgaW5wdXRIYXNUaW1lQ2FsbFNpdGVzOwogICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvZGVidWcvUmVjb3JkLmphdmEgYi90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9kZWJ1Zy9SZWNvcmQuamF2YQppbmRleCA3Y2E3YTIwLi40MmM3YjA4IDEwMDY0NAotLS0gYS90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9kZWJ1Zy9SZWNvcmQuamF2YQorKysgYi90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9kZWJ1Zy9SZWNvcmQuamF2YQpAQCAtMTgsMjQgKzE4LDYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuZGVidWc7CiAKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2hhbm5lbHM7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlRmllbGRVcGRhdGVyOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLWltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5CdWZmZXJlZERhdGFPdXRwdXRTdHJlYW1QbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFN0cmVhbVBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwpAQCAtNDYsMTEgKzI4LDIyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvc2VhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb3NlYWJsZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVGhyZWFkczsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNoYW5uZWxzOworaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2VGaWVsZFVwZGF0ZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGUuV3JpdGVNb2RlLk9WRVJXUklURTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLlNpbXVsYXRpb25SdW5uZXIuUmVjb3JkT3B0aW9uLk5PTkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5TaW11bGF0aW9uUnVubmVyLlJlY29yZE9wdGlvbi5WQUxVRTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLlNpbXVsYXRpb25SdW5uZXIuUmVjb3JkT3B0aW9uLldJVEhfQ0FMTFNJVEVTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuU2ltdWxhdGlvblJ1bm5lci5SZWNvcmRPcHRpb24uKjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLlNpbXVsYXRvclV0aWxzLmZhaWxXaXRoT09NOwogCiBwdWJsaWMgY2xhc3MgUmVjb3JkCkBAIC0yODIsNyArMjc1LDcgQEAKICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVCeXRlKDcpOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVWSW50KGNvdW50KyspOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVWSW50MzIoY291bnQrKyk7CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUxvbmcodmFsdWUpOwogICAgICAgICAgICAgICAgICAgICB0aHJlYWRzLndyaXRlVGhyZWFkKCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzA5LDExICszMDIsMTEgQEAKICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVCeXRlKDEpOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVWSW50KGNvdW50KyspOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVWSW50MzIoY291bnQrKyk7CiAgICAgICAgICAgICAgICAgICAgIHRocmVhZHMud3JpdGVUaHJlYWQoKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludChtaW4pOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVWSW50KG1heCAtIG1pbik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQodiAtIG1pbik7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQzMihtaW4pOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVWSW50MzIobWF4IC0gbWluKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludDMyKHYgLSBtaW4pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQpAQCAtMzM5LDcgKzMzMiw3IEBACiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlQnl0ZSgyKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludChjb3VudCsrKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludDMyKGNvdW50KyspOwogICAgICAgICAgICAgICAgICAgICB0aHJlYWRzLndyaXRlVGhyZWFkKCk7CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQobWluKTsKICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludChtYXggLSBtaW4pOwpAQCAtMzY5LDcgKzM2Miw3IEBACiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlQnl0ZSgzKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludChjb3VudCsrKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludDMyKGNvdW50KyspOwogICAgICAgICAgICAgICAgICAgICB0aHJlYWRzLndyaXRlVGhyZWFkKCk7CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUZsb2F0KHYpOwogICAgICAgICAgICAgICAgIH0KQEAgLTM5Nyw3ICszOTAsNyBAQAogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUJ5dGUoNik7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQoY291bnQrKyk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQzMihjb3VudCsrKTsKICAgICAgICAgICAgICAgICAgICAgdGhyZWFkcy53cml0ZVRocmVhZCgpOwogICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVEb3VibGUodik7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDI1LDcgKzQxOCw3IEBACiAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlQnl0ZSg0KTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludChjb3VudCsrKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludDMyKGNvdW50KyspOwogICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVWSW50KHNlZWQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTQ1MSw3ICs0NDQsNyBAQAogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUJ5dGUoNSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQoY291bnQrKyk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQzMihjb3VudCsrKTsKICAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlRmxvYXQodik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTE0LDExICs1MDcsMTEgQEAKICAgICAgICAgICAgIEludGVnZXIgaWQgPSBvYmplY3RzLmdldChvKTsKICAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQoaWQpOworICAgICAgICAgICAgICAgIG91dC53cml0ZVZJbnQzMihpZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlVkludChvYmplY3RzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlVkludDMyKG9iamVjdHMuc2l6ZSgpKTsKICAgICAgICAgICAgICAgICBvdXQud3JpdGVVVEYoby50b1N0cmluZygpKTsKICAgICAgICAgICAgICAgICBvYmplY3RzLnB1dChvLCBvYmplY3RzLnNpemUoKSk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9kZWJ1Zy9TZWxmUmVjb25jaWxpbmdSYW5kb20uamF2YSBiL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2RlYnVnL1NlbGZSZWNvbmNpbGluZ1JhbmRvbS5qYXZhCmluZGV4IDQ0NGVjNDQuLjk5ZGY0YjkgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2RlYnVnL1NlbGZSZWNvbmNpbGluZ1JhbmRvbS5qYXZhCisrKyBiL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL2RlYnVnL1NlbGZSZWNvbmNpbGluZ1JhbmRvbS5qYXZhCkBAIC0yMCwyNCArMjAsMjkgQEAKIAogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKIAoraW1wb3J0IG9yZy5hZ3JvbmEuY29sbGVjdGlvbnMuTG9uZzJMb25nSGFzaE1hcDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuUmFuZG9tU291cmNlOwotaW1wb3J0IG9yZy5oc3FsZGIubGliLkludEtleUxvbmdWYWx1ZUhhc2hNYXA7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLlNpbXVsYXRvclV0aWxzLmZhaWxXaXRoT09NOwogCiBwdWJsaWMgY2xhc3MgU2VsZlJlY29uY2lsaW5nUmFuZG9tIGltcGxlbWVudHMgU3VwcGxpZXI8UmFuZG9tU291cmNlPgogewotICAgIHN0YXRpYyBjbGFzcyBNYXAgZXh0ZW5kcyBJbnRLZXlMb25nVmFsdWVIYXNoTWFwCisgICAgc3RhdGljIGNsYXNzIE1hcCBleHRlbmRzIExvbmcyTG9uZ0hhc2hNYXAKICAgICB7CisgICAgICAgIHB1YmxpYyBNYXAobG9uZyBtaXNzaW5nVmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKG1pc3NpbmdWYWx1ZSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgYm9vbGVhbiBwdXQoaW50IGksIGxvbmcgdikKICAgICAgICAgewogICAgICAgICAgICAgaW50IHNpemUgPSB0aGlzLnNpemUoKTsKLSAgICAgICAgICAgIHN1cGVyLmFkZE9yUmVtb3ZlKChsb25nKWksIChsb25nKXYsIChPYmplY3QpbnVsbCwgKE9iamVjdCludWxsLCBmYWxzZSk7CisgICAgICAgICAgICBzdXBlci5wdXQoaSwgdik7CiAgICAgICAgICAgICByZXR1cm4gc2l6ZSAhPSB0aGlzLnNpemUoKTsKICAgICAgICAgfQogICAgIH0KLSAgICBmaW5hbCBNYXAgbWFwID0gbmV3IE1hcCgpOwotICAgIGxvbmdbXSB0bXAgPSBuZXcgbG9uZ1sxXTsKKworICAgIGZpbmFsIE1hcCBtYXAgPSBuZXcgTWFwKExvbmcuTUlOX1ZBTFVFKTsKICAgICBib29sZWFuIGlzTmV4dFByaW1hcnkgPSB0cnVlOwogCiAgICAgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmVyaWZ5aW5nIGV4dGVuZHMgUmFuZG9tU291cmNlLkFic3RyYWN0CkBAIC0xMTMsMTAgKzExOCwxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICB2b2lkIG5leHQobG9uZyB2KQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghbWFwLmdldCgrK2N1ciwgdG1wKSkKKyAgICAgICAgICAgICAgICBsb25nIHZhbHVlID0gbWFwLmdldCgrK2N1cik7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IExvbmcuTUlOX1ZBTFVFKQogICAgICAgICAgICAgICAgICAgICB0aHJvdyBmYWlsV2l0aE9PTSgpOwogICAgICAgICAgICAgICAgIG1hcC5yZW1vdmUoY3VyKTsKLSAgICAgICAgICAgICAgICBpZiAodG1wWzBdICE9IHYpCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IHYpCiAgICAgICAgICAgICAgICAgICAgIHRocm93IGZhaWxXaXRoT09NKCk7CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL3BheG9zL0JhbGxvdHMuamF2YSBiL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL3BheG9zL0JhbGxvdHMuamF2YQppbmRleCAwOGUxYjJlLi42MGViZjQ3IDEwMDY0NAotLS0gYS90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9wYXhvcy9CYWxsb3RzLmphdmEKKysrIGIvdGVzdC9zaW11bGF0b3IvbWFpbi9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvcGF4b3MvQmFsbG90cy5qYXZhCkBAIC00MiwxNyArNDIsMTcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5zeXN0ZW1zLk5vbkludGVyY2VwdGlibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLnN5c3RlbXMuTm9uSW50ZXJjZXB0aWJsZS5QZXJtaXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5Db21taXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5QYXhvc1N0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5zeXN0ZW1zLk5vbkludGVyY2VwdGlibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2ltdWxhdG9yLnN5c3RlbXMuTm9uSW50ZXJjZXB0aWJsZS5QZXJtaXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU2hhcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5Mb25nLm1heDsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLkFycmF5cy5zdHJlYW07CmRpZmYgLS1naXQgYS90ZXN0L3NpbXVsYXRvci9tYWluL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci9wYXhvcy9QYXhvc1NpbXVsYXRpb24uamF2YSBiL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL3BheG9zL1BheG9zU2ltdWxhdGlvbi5qYXZhCmluZGV4IDYzZTg0ZGMuLmE2ZmJjNDQgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL3BheG9zL1BheG9zU2ltdWxhdGlvbi5qYXZhCisrKyBiL3Rlc3Qvc2ltdWxhdG9yL21haW4vb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL3BheG9zL1BheG9zU2ltdWxhdGlvbi5qYXZhCkBAIC0yNiwxNyArMjYsMTQgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUNvbnN1bWVyOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Mb25nU3VwcGxpZXI7Ci0KIGltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwotCiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuRXhlY3V0b3JGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JQbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuQ2x1c3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuQ29uc2lzdGVuY3lMZXZlbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUludm9rYWJsZUluc3RhbmNlOwpAQCAtNTUsOCArNTIsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVGhyZWFkczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uOwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5BY3Rpb24uTW9kaWZpZXJzLk5PTkU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9TSU1VTEFUT1JfTElWRU5FU1NfQ0hFQ0s7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5BY3Rpb24uTW9kaWZpZXJzLkRJU1BMQVlfT1JJR0lOOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuQWN0aW9uLk1vZGlmaWVycy5OT05FOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zaW11bGF0b3IuU2ltdWxhdG9yVXRpbHMuZmFpbFdpdGhPT007CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNpbXVsYXRvci5wYXhvcy5IaXN0b3J5Q2hlY2tlci5jYXVzZWRCeTsKIApAQCAtMTMzLDcgKzEzMSw3IEBACiAgICAgICAgIEF0b21pY0xvbmcgY291bnRlciA9IG5ldyBBdG9taWNMb25nKCk7CiAgICAgICAgIFNjaGVkdWxlZEV4ZWN1dG9yUGx1cyBsaXZlbmVzc0NoZWNrZXIgPSBudWxsOwogICAgICAgICBTY2hlZHVsZWRGdXR1cmU8Pz4gbGl2ZW5lc3MgPSBudWxsOwotICAgICAgICBpZiAoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfU0lNVUxBVE9SX0xJVkVORVNTX0NIRUNLLmdldEJvb2xlYW4oKSkKKyAgICAgICAgaWYgKFRFU1RfU0lNVUxBVE9SX0xJVkVORVNTX0NIRUNLLmdldEJvb2xlYW4oKSkKICAgICAgICAgewogICAgICAgICAgICAgbGl2ZW5lc3NDaGVja2VyID0gRXhlY3V0b3JGYWN0b3J5Lkdsb2JhbC5leGVjdXRvckZhY3RvcnkoKS5zY2hlZHVsZWQoIlNpbXVsYXRpb25MaXZlbmVzcyIpOwogICAgICAgICAgICAgbGl2ZW5lc3MgPSBsaXZlbmVzc0NoZWNrZXIuc2NoZWR1bGVXaXRoRml4ZWREZWxheShuZXcgUnVubmFibGUoKQpAQCAtMTcwLDcgKzE2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGN1ciA9IGNvdW50ZXIuZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyID09IHByZXYpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJTaW11bGF0aW9uIGFwcGVhcnMgdG8gaGF2ZSBzdGFsbGVkOyB0ZXJtaW5hdGluZy4gVG8gZGlzYWJsZSBzZXQgLURjYXNzYW5kcmEudGVzdC5zaW11bGF0b3IubGl2ZW5lc3NjaGVjaz1mYWxzZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiU2ltdWxhdGlvbiBhcHBlYXJzIHRvIGhhdmUgc3RhbGxlZDsgdGVybWluYXRpbmcuIFRvIGRpc2FibGUgc2V0IC1Ee309ZmFsc2UiLCBURVNUX1NJTVVMQVRPUl9MSVZFTkVTU19DSEVDSy5nZXRLZXkoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2h1dGRvd24uc2V0KDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGZhaWxXaXRoT09NKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yNjIsOCArMjYwLDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGxvZyhjYXVzZWRCeVByaW1hcnlLZXkpOwotICAgICAgICBpZiAoY2F1c2VkQnlQcmltYXJ5S2V5ICE9IG51bGwpIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGNhdXNlZEJ5VGhyb3dhYmxlKTsKLSAgICAgICAgZWxzZSB0aHJvdyBUaHJvd2FibGVzLnByb3BhZ2F0ZShzaW11bGF0ZWQuZmFpbHVyZXMuZ2V0KCkuZ2V0KDApKTsKKyAgICAgICAgVGhyb3dhYmxlIHQgPSAoY2F1c2VkQnlQcmltYXJ5S2V5ICE9IG51bGwpID8gY2F1c2VkQnlUaHJvd2FibGUgOiBzaW11bGF0ZWQuZmFpbHVyZXMuZ2V0KCkuZ2V0KDApOworICAgICAgICBUaHJvd2FibGVzLnRocm93SWZVbmNoZWNrZWQodCk7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKZGlmZiAtLWdpdCBhL3Rlc3Qvc2ltdWxhdG9yL3Rlc3Qvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL3Rlc3QvU2hvcnRQYXhvc1NpbXVsYXRpb25UZXN0LmphdmEgYi90ZXN0L3NpbXVsYXRvci90ZXN0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NpbXVsYXRvci90ZXN0L1Nob3J0UGF4b3NTaW11bGF0aW9uVGVzdC5qYXZhCmluZGV4IDE5ZDY2MDEuLmYxOTVmMWIgMTAwNjQ0Ci0tLSBhL3Rlc3Qvc2ltdWxhdG9yL3Rlc3Qvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2ltdWxhdG9yL3Rlc3QvU2hvcnRQYXhvc1NpbXVsYXRpb25UZXN0LmphdmEKKysrIGIvdGVzdC9zaW11bGF0b3IvdGVzdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zaW11bGF0b3IvdGVzdC9TaG9ydFBheG9zU2ltdWxhdGlvblRlc3QuamF2YQpAQCAtNDAsMyArNDAsNCBAQAogICAgICAgICBQYXhvc1NpbXVsYXRpb25SdW5uZXIubWFpbihuZXcgU3RyaW5nW10geyAicmVjb25jaWxlIiwgIi1uIiwgIjMuLjYiLCAiLXQiLCAiMTAwMCIsICItYyIsICIyIiwgIi0tY2x1c3Rlci1hY3Rpb24tbGltaXQiLCAiMiIsICItcyIsICIzMCIsICItLXdpdGgtc2VsZiIgfSk7CiAgICAgfQogfQorCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvQWJzdHJhY3RTZXJpYWxpemF0aW9uc1Rlc3Rlci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL0Fic3RyYWN0U2VyaWFsaXphdGlvbnNUZXN0ZXIuamF2YQppbmRleCA2NTAzNzA3Li5lYmI3NGE3IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvQWJzdHJhY3RTZXJpYWxpemF0aW9uc1Rlc3Rlci5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9BYnN0cmFjdFNlcmlhbGl6YXRpb25zVGVzdGVyLmphdmEKQEAgLTI3LDE3ICsyNywxOSBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfVkVSU0lPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1NFUklBTElaQVRJT05fV1JJVEVTOworCiBwdWJsaWMgY2xhc3MgQWJzdHJhY3RTZXJpYWxpemF0aW9uc1Rlc3RlcgogewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENVUl9WRVIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS52ZXJzaW9uIiwgIjQuMSIpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENVUl9WRVIgPSBDQVNTQU5EUkFfVkVSU0lPTi5nZXRTdHJpbmcoIjQuMCIpOwogICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gVkVSU0lPTl9NQVAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+ICgpCiAgICAge3sKICAgICAgICAgcHV0KCIzLjAiLCBNZXNzYWdpbmdTZXJ2aWNlLlZFUlNJT05fMzApOwogICAgICAgICBwdXQoIjQuMCIsIE1lc3NhZ2luZ1NlcnZpY2UuVkVSU0lPTl80MCk7Ci0gICAgICAgIHB1dCgiNC4xIiwgTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzQxKTsKICAgICB9fTsKIAotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWEVDVVRFX1dSSVRFUyA9IEJvb2xlYW4uZ2V0Qm9vbGVhbigiY2Fzc2FuZHJhLnRlc3Qtc2VyaWFsaXphdGlvbi13cml0ZXMiKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhFQ1VURV9XUklURVMgPSBURVNUX1NFUklBTElaQVRJT05fV1JJVEVTLmdldEJvb2xlYW4oKTsKIAogICAgIHByb3RlY3RlZCBzdGF0aWMgaW50IGdldFZlcnNpb24oKQogICAgIHsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9DYXNzYW5kcmFCcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvQ2Fzc2FuZHJhQnJpZWZKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhCmluZGV4IDJiZWZiNWMuLmRjOWI4ZjggMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9DYXNzYW5kcmFCcmllZkpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL0Nhc3NhbmRyYUJyaWVmSlVuaXRSZXN1bHRGb3JtYXR0ZXIuamF2YQpAQCAtMzYsNiArMzYsOSBAQAogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuU3RyaW5nVXRpbHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0NBU1NBTkRSQV9LRUVQQlJJRUZCUklFRjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0NBU1NBTkRSQV9URVNUVEFHOworCiAvKioKICAqIFByaW50cyBwbGFpbiB0ZXh0IG91dHB1dCBvZiB0aGUgdGVzdCB0byBhIHNwZWNpZmllZCBXcml0ZXIuCiAgKiBJbnNwaXJlZCBieSB0aGUgUGxhaW5KVW5pdFJlc3VsdEZvcm1hdHRlci4KQEAgLTQ3LDkgKzUwLDkgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBPTkVfU0VDT05EID0gMTAwMC4wOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRhZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRlc3R0YWciLCAiIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRhZyA9IFRFU1RfQ0FTU0FORFJBX1RFU1RUQUcuZ2V0U3RyaW5nKCk7CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCb29sZWFuIGtlZXBCcmllZkJyaWVmID0gQm9vbGVhbi5nZXRCb29sZWFuKCJjYXNzYW5kcmEua2VlcEJyaWVmQnJpZWYiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCb29sZWFuIGtlZXBCcmllZkJyaWVmID0gVEVTVF9DQVNTQU5EUkFfS0VFUEJSSUVGQlJJRUYuZ2V0Qm9vbGVhbigpOwogCiAgICAgLyoqCiAgICAgICogV2hlcmUgdG8gd3JpdGUgdGhlIGxvZyB0by4KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9DYXNzYW5kcmFYTUxKVW5pdFJlc3VsdEZvcm1hdHRlci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL0Nhc3NhbmRyYVhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKaW5kZXggZGU4ZmI0ZS4uNmY4MjFjMyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL0Nhc3NhbmRyYVhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL0Nhc3NhbmRyYVhNTEpVbml0UmVzdWx0Rm9ybWF0dGVyLmphdmEKQEAgLTUwLDYgKzUwLDkgQEAKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0NBU1NBTkRSQV9TVUlURU5BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9DQVNTQU5EUkFfVEVTVFRBRzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVU5fSkFWQV9DT01NQU5EOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXM7CiAKIC8qKgpAQCAtNzMsNyArNzYsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRhZyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRlc3R0YWciLCAiIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRhZyA9IFRFU1RfQ0FTU0FORFJBX1RFU1RUQUcuZ2V0U3RyaW5nKCk7CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcHJvcGVydHkgZm9yIHRoZSB0ZXN0IHN1aXRlIG5hbWUgc28gdGhhdCBsb2cgY29uZmlndXJhdGlvbiBjYW4gcGljayBpdCB1cApAQCAtODEsOSArODQsOSBAQAogICAgICAqLwogICAgIHN0YXRpYwogICAgIHsKLSAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInN1bi5qYXZhLmNvbW1hbmQiKTsKKyAgICAgICAgU3RyaW5nIGNvbW1hbmQgPSBTVU5fSkFWQV9DT01NQU5ELmdldFN0cmluZygpOwogICAgICAgICBTdHJpbmcgYXJnc1tdID0gY29tbWFuZC5zcGxpdCgiICIpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInN1aXRlbmFtZSIsIGFyZ3NbMV0pOworICAgICAgICBURVNUX0NBU1NBTkRSQV9TVUlURU5BTUUuc2V0U3RyaW5nKGFyZ3NbMV0pOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL0xvZ2JhY2tTdGF0dXNMaXN0ZW5lci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL0xvZ2JhY2tTdGF0dXNMaXN0ZW5lci5qYXZhCmluZGV4IDcxOWZhZGEuLjgzNGQ1MWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9Mb2diYWNrU3RhdHVzTGlzdGVuZXIuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvTG9nYmFja1N0YXR1c0xpc3RlbmVyLmphdmEKQEAgLTMzLDggKzMzLDEyIEBACiBpbXBvcnQgY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5zcGkuTG9nZ2VyQ29udGV4dExpc3RlbmVyOwogaW1wb3J0IGNoLnFvcy5sb2diYWNrLmNvcmUuc3RhdHVzLlN0YXR1czsKIGltcG9ydCBjaC5xb3MubG9nYmFjay5jb3JlLnN0YXR1cy5TdGF0dXNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5JbnN0YW5jZUNsYXNzTG9hZGVyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1VOX1NUREVSUl9FTkNPRElORzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVU5fU1RET1VUX0VOQ09ESU5HOworCiAvKgogICogTGlzdGVuIGZvciBsb2diYWNrIHJlYWRpbmVzcyBhbmQgdGhlbiByZWRpcmVjdCBzdGRvdXQvc3RkZXJyIHRvIGxvZ2JhY2sKICAqLwpAQCAtODQsOSArODgsOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgUHJpbnRTdHJlYW0gd3JhcExvZ2dlcihMb2dnZXIgbG9nZ2VyLCBQcmludFN0cmVhbSBvcmlnaW5hbCwgU3RyaW5nIGVuY29kaW5nUHJvcGVydHksIGJvb2xlYW4gZXJyb3IpIHRocm93cyBFeGNlcHRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBQcmludFN0cmVhbSB3cmFwTG9nZ2VyKExvZ2dlciBsb2dnZXIsIFByaW50U3RyZWFtIG9yaWdpbmFsLCBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMgZW5jb2RpbmdQcm9wZXJ0eSwgYm9vbGVhbiBlcnJvcikgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kaW5nID0gU3lzdGVtLmdldFByb3BlcnR5KGVuY29kaW5nUHJvcGVydHkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RpbmcgPSBlbmNvZGluZ1Byb3BlcnR5LmdldFN0cmluZygpOwogICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgVG9Mb2dnZXJPdXRwdXRTdHJlYW0obG9nZ2VyLCBlbmNvZGluZywgZXJyb3IpOwogICAgICAgICByZXR1cm4gZW5jb2RpbmcgIT0gbnVsbCA/IG5ldyBXcmFwcGVkUHJpbnRTdHJlYW0ob3MsIHRydWUsIGVuY29kaW5nLCBvcmlnaW5hbCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgV3JhcHBlZFByaW50U3RyZWFtKG9zLCB0cnVlLCBvcmlnaW5hbCk7CkBAIC00NzUsOSArNDc5LDkgQEAKICAgICAgICAgICAgICAgICBMb2dnZXIgc3Rkb3V0TG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoInN0ZG91dCIpOwogICAgICAgICAgICAgICAgIExvZ2dlciBzdGRlcnJMb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcigic3RkZXJyIik7CiAKLSAgICAgICAgICAgICAgICByZXBsYWNlbWVudE91dCA9IHdyYXBMb2dnZXIoc3Rkb3V0TG9nZ2VyLCBvcmlnaW5hbE91dCwgInN1bi5zdGRvdXQuZW5jb2RpbmciLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRPdXQgPSB3cmFwTG9nZ2VyKHN0ZG91dExvZ2dlciwgb3JpZ2luYWxPdXQsIFNVTl9TVERPVVRfRU5DT0RJTkcsIGZhbHNlKTsKICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KHJlcGxhY2VtZW50T3V0KTsKLSAgICAgICAgICAgICAgICByZXBsYWNlbWVudEVyciA9IHdyYXBMb2dnZXIoc3RkZXJyTG9nZ2VyLCBvcmlnaW5hbEVyciwgInN1bi5zdGRlcnIuZW5jb2RpbmciLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByZXBsYWNlbWVudEVyciA9IHdyYXBMb2dnZXIoc3RkZXJyTG9nZ2VyLCBvcmlnaW5hbEVyciwgU1VOX1NUREVSUl9FTkNPRElORywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgU3lzdGVtLnNldEVycihyZXBsYWNlbWVudEVycik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvU2NoZW1hTG9hZGVyLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvU2NoZW1hTG9hZGVyLmphdmEKaW5kZXggMzI3OTQ5MC4uZjAxNzhkMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL1NjaGVtYUxvYWRlci5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9TY2hlbWFMb2FkZXIuamF2YQpAQCAtNTAsNiArNTAsOSBAQAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BTExPV19VTlNBRkVfSk9JTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0NPTVBSRVNTSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfQ09NUFJFU1NJT05fQUxHTzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwogCiBwdWJsaWMgY2xhc3MgU2NoZW1hTG9hZGVyCkBAIC04Miw3ICs4NSw3IEBACiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHN0YXJ0R29zc2lwZXIoKQogICAgIHsKICAgICAgICAgLy8gc2tpcCBzaGFkb3cgcm91bmQgYW5kIGVuZHBvaW50IGNvbGxpc2lvbiBjaGVjayBpbiB0ZXN0cwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5hbGxvd191bnNhZmVfam9pbiIsICJ0cnVlIik7CisgICAgICAgIEFMTE9XX1VOU0FGRV9KT0lOLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIGlmICghR29zc2lwZXIuaW5zdGFuY2UuaXNFbmFibGVkKCkpCiAgICAgICAgICAgICBHb3NzaXBlci5pbnN0YW5jZS5zdGFydCgoaW50KSAoY3VycmVudFRpbWVNaWxsaXMoKSAvIDEwMDApKTsKICAgICB9CkBAIC0yNDksNyArMjUyLDcgQEAKICAgICAgICAgZm9yIChLZXlzcGFjZU1ldGFkYXRhIGtzbSA6IHNjaGVtYSkKICAgICAgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlTmV3S2V5c3BhY2Uoa3NtKTsKIAotICAgICAgICBpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEudGVzdC5jb21wcmVzc2lvbiIsICJmYWxzZSIpKSkKKyAgICAgICAgaWYgKFRFU1RfQ09NUFJFU1NJT04uZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgdXNlQ29tcHJlc3Npb24oc2NoZW1hLCBjb21wcmVzc2lvblBhcmFtcyhDb21wcmVzc2lvblBhcmFtcy5ERUZBVUxUX0NIVU5LX0xFTkdUSCkpOwogICAgIH0KIApAQCAtMjc0LDcgKzI3Nyw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlS2V5c3BhY2UoU3RyaW5nIG5hbWUsIEtleXNwYWNlUGFyYW1zIHBhcmFtcywgVGFibGVzIHRhYmxlcywgVHlwZXMgdHlwZXMpCiAgICAgewotICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZU5ld0tleXNwYWNlKEtleXNwYWNlTWV0YWRhdGEuY3JlYXRlKG5hbWUsIHBhcmFtcywgdGFibGVzLCBWaWV3cy5ub25lKCksIHR5cGVzLCBGdW5jdGlvbnMubm9uZSgpKSk7CisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlTmV3S2V5c3BhY2UoS2V5c3BhY2VNZXRhZGF0YS5jcmVhdGUobmFtZSwgcGFyYW1zLCB0YWJsZXMsIFZpZXdzLm5vbmUoKSwgdHlwZXMsIFVzZXJGdW5jdGlvbnMubm9uZSgpKSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQXV0aChJUm9sZU1hbmFnZXIgcm9sZU1hbmFnZXIsIElBdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0b3IsIElBdXRob3JpemVyIGF1dGhvcml6ZXIsIElOZXR3b3JrQXV0aG9yaXplciBuZXR3b3JrQXV0aG9yaXplcikKQEAgLTI4Niw2ICsyODksNyBAQAogICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZU5ld0tleXNwYWNlKEF1dGhLZXlzcGFjZS5tZXRhZGF0YSgpKTsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFJvbGVNYW5hZ2VyKCkuc2V0dXAoKTsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEF1dGhlbnRpY2F0b3IoKS5zZXR1cCgpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW50ZXJub2RlQXV0aGVudGljYXRvcigpLnNldHVwSW50ZXJub2RlKCk7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5nZXRBdXRob3JpemVyKCkuc2V0dXAoKTsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldE5ldHdvcmtBdXRob3JpemVyKCkuc2V0dXAoKTsKICAgICAgICAgU2NoZW1hLmluc3RhbmNlLnJlZ2lzdGVyTGlzdGVuZXIobmV3IEF1dGhTY2hlbWFDaGFuZ2VMaXN0ZW5lcigpKTsKQEAgLTI5OCw3ICszMDIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQoSW50ZWdlclR5cGUuaW5zdGFuY2UuZnJvbVN0cmluZygiNDIiKSwgSW50ZWdlclR5cGUuaW5zdGFuY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVURjhUeXBlLmluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhLk5PX1BPU0lUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhLktpbmQuUkVHVUxBUik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEuS2luZC5SRUdVTEFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uTWV0YWRhdGEgdXRmOENvbHVtbihTdHJpbmcga3NOYW1lLCBTdHJpbmcgY2ZOYW1lKQpAQCAtMzA4LDcgKzMxMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uSWRlbnRpZmllci5nZXRJbnRlcm5lZCgiZm9ydHl0d28iLCB0cnVlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEY4VHlwZS5pbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YS5OT19QT1NJVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YS5LaW5kLlJFR1VMQVIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbk1ldGFkYXRhLktpbmQuUkVHVUxBUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFRhYmxlTWV0YWRhdGEgcGVyUm93SW5kZXhlZENGTUQoU3RyaW5nIGtzTmFtZSwgU3RyaW5nIGNmTmFtZSkKQEAgLTcyMiw3ICs3MjgsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBDb21wcmVzc2lvblBhcmFtcyBnZXRDb21wcmVzc2lvblBhcmFtZXRlcnMoSW50ZWdlciBjaHVua1NpemUpCiAgICAgewotICAgICAgICBpZiAoQm9vbGVhbi5wYXJzZUJvb2xlYW4oU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEudGVzdC5jb21wcmVzc2lvbiIsICJmYWxzZSIpKSkKKyAgICAgICAgaWYgKFRFU1RfQ09NUFJFU1NJT04uZ2V0Qm9vbGVhbigpKQogICAgICAgICAgICAgcmV0dXJuIGNodW5rU2l6ZSAhPSBudWxsID8gY29tcHJlc3Npb25QYXJhbXMoY2h1bmtTaXplKSA6IGNvbXByZXNzaW9uUGFyYW1zKENvbXByZXNzaW9uUGFyYW1zLkRFRkFVTFRfQ0hVTktfTEVOR1RIKTsKIAogICAgICAgICByZXR1cm4gQ29tcHJlc3Npb25QYXJhbXMubm9Db21wcmVzc2lvbigpOwpAQCAtNzU2LDcgKzc2Miw3IEBACiAKICAgICBwcml2YXRlIHN0YXRpYyBDb21wcmVzc2lvblBhcmFtcyBjb21wcmVzc2lvblBhcmFtcyhpbnQgY2h1bmtMZW5ndGgpCiAgICAgewotICAgICAgICBTdHJpbmcgYWxnbyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRlc3QuY29tcHJlc3Npb24uYWxnbyIsICJsejQiKS50b0xvd2VyQ2FzZSgpOworICAgICAgICBTdHJpbmcgYWxnbyA9IFRFU1RfQ09NUFJFU1NJT05fQUxHTy5nZXRTdHJpbmcoKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICBzd2l0Y2ggKGFsZ28pCiAgICAgICAgIHsKICAgICAgICAgICAgIGNhc2UgImRlZmxhdGUiOgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL1NlcnZlclRlc3RVdGlscy5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL1NlcnZlclRlc3RVdGlscy5qYXZhCmluZGV4IDEwY2IwODIuLmZhNTlmMGQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9TZXJ2ZXJUZXN0VXRpbHMuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvU2VydmVyVGVzdFV0aWxzLmphdmEKQEAgLTIxLDE2ICsyMSwyMiBAQAogaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXVkaXQuQXVkaXRMb2dNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU3lzdGVtS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlTdXBwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkFic3RyYWN0RW5kcG9pbnRTbml0Y2g7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CkBAIC0yMDMsNCArMjA5LDIyIEBACiAgICAgcHJpdmF0ZSBTZXJ2ZXJUZXN0VXRpbHMoKQogICAgIHsKICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8QmlnVGFibGVSZWFkZXI+IGdldExpdmVCaWdUYWJsZVJlYWRlcnMoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNmcy5nZXRMaXZlU1NUYWJsZXMoKQorICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJpZ1RhYmxlUmVhZGVyLmNsYXNzOjppc0luc3RhbmNlKQorICAgICAgICAgICAgICAgICAgLm1hcChCaWdUYWJsZVJlYWRlci5jbGFzczo6Y2FzdCkKKyAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgSW5kZXhTdW1tYXJ5U3VwcG9ydDxSPj4gTGlzdDxSPiBnZXRMaXZlSW5kZXhTdW1tYXJ5U3VwcG9ydGluZ1JlYWRlcnMoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNmcy5nZXRMaXZlU1NUYWJsZXMoKQorICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAuZmlsdGVyKEluZGV4U3VtbWFyeVN1cHBvcnQuY2xhc3M6OmlzSW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAubWFwKHIgLT4gKFIpIHIpCisgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvVXRpbC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL1V0aWwuamF2YQppbmRleCAwNDU5Y2IzLi4zZTM2NjkyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvVXRpbC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9VdGlsLmphdmEKQEAgLTIwLDkgKzIwLDEyIEBACiAgKi8KIAogaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FcnJvcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKQEAgLTExMyw2ICsxMTYsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2VxdWVuY2VCYXNlZFNTVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlVVSURCYXNlZFNTVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXJXaXRoRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhOwpAQCAtMTM2LDYgKzE0MSw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogaW1wb3J0IG9yZy5hd2FpdGlsaXR5LkF3YWl0aWxpdHk7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKK2ltcG9ydCBvcmcubW9ja2l0by5pbnRlcm5hbC5zdHViYmluZy5kZWZhdWx0YW5zd2Vycy5Gb3J3YXJkc0ludm9jYXRpb25zOwogCiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5lcXVhbFRvOwpAQCAtNDY0LDEwICs0NzEsMTAgQEAKICAgICAgICAgICAgIGFzc2VydCBpdGVyYXRvci5oYXNOZXh0KCkgOiAiRXhwZWN0aW5nIG9uZSByb3cgaW4gb25lIHBhcnRpdGlvbiBidXQgZ290IG5vdGhpbmciOwogICAgICAgICAgICAgdHJ5IChSb3dJdGVyYXRvciBwYXJ0aXRpb24gPSBpdGVyYXRvci5uZXh0KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0ICFpdGVyYXRvci5oYXNOZXh0KCkgOiAiRXhwZWN0aW5nIGEgc2luZ2xlIHBhcnRpdGlvbiBidXQgZ290IG1vcmUiOwogICAgICAgICAgICAgICAgIGFzc2VydCBwYXJ0aXRpb24uaGFzTmV4dCgpIDogIkV4cGVjdGluZyBvbmUgcm93IGluIG9uZSBwYXJ0aXRpb24gYnV0IGdvdCBhbiBlbXB0eSBwYXJ0aXRpb24iOwogICAgICAgICAgICAgICAgIFJvdyByb3cgPSBwYXJ0aXRpb24ubmV4dCgpOwogICAgICAgICAgICAgICAgIGFzc2VydCAhcGFydGl0aW9uLmhhc05leHQoKSA6ICJFeHBlY3RpbmcgYSBzaW5nbGUgcm93IGJ1dCBnb3QgbW9yZSI7CisgICAgICAgICAgICAgICAgYXNzZXJ0ICFpdGVyYXRvci5oYXNOZXh0KCkgOiAiRXhwZWN0aW5nIGEgc2luZ2xlIHBhcnRpdGlvbiBidXQgZ290IG1vcmUiOwogICAgICAgICAgICAgICAgIHJldHVybiByb3c7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTg1MCw3ICs4NTcsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChzc3QubmFtZSgpLmNvbnRhaW5zKCJEYXRhIikpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGQgPSBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShzc3QuYWJzb2x1dGVQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGQgPSBEZXNjcmlwdG9yLmZyb21GaWxlV2l0aENvbXBvbmVudChzc3QsIGZhbHNlKS5sZWZ0OwogICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGxpdmVJZGVudGlmaWVycy5jb250YWlucyhkLmlkKSk7CiAgICAgICAgICAgICAgICAgICAgIGZpbGVDb3VudCsrOwogICAgICAgICAgICAgICAgIH0KQEAgLTg1OSw2ICs4NjYsMTk5IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFNTVGFibGVDb3VudCwgZmlsZUNvdW50KTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgZ2VuZXJhdGVNdXJtdXJDb2xsaXNpb24oQnl0ZUJ1ZmZlciBvcmlnaW5hbCwgYnl0ZS4uLiBieXRlc1RvQWRkKQorICAgIHsKKyAgICAgICAgLy8gUm91bmQgc2l6ZSB1cCB0byAxNiwgYW5kIGFkZCBhbm90aGVyIDE2IGJ5dGVzCisgICAgICAgIEJ5dGVCdWZmZXIgY29sbGlzaW9uID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgob3JpZ2luYWwucmVtYWluaW5nKCkgKyBieXRlc1RvQWRkLmxlbmd0aCArIDMxKSAmIC0xNik7CisgICAgICAgIGNvbGxpc2lvbi5wdXQob3JpZ2luYWwpOyAgICAvLyB3ZSBjYW4gdXNlIHRoaXMgYXMgYSBjb3B5IG9mIG9yaWdpbmFsIHdpdGggMHMgYXBwZW5kZWQgYXQgdGhlIGVuZAorCisgICAgICAgIG9yaWdpbmFsLmZsaXAoKTsKKworICAgICAgICBsb25nIGMxID0gMHg4N2MzN2I5MTExNDI1M2Q1TDsKKyAgICAgICAgbG9uZyBjMiA9IDB4NGNmNWFkNDMyNzQ1OTM3Zkw7CisKKyAgICAgICAgbG9uZyBoMSA9IDA7CisgICAgICAgIGxvbmcgaDIgPSAwOworCisgICAgICAgIC8vIEdldCBoYXNoIG9mIG9yaWdpbmFsCisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBvcmlnaW5hbC5saW1pdCgpOworICAgICAgICB3aGlsZSAoaW5kZXggPD0gbGVuZ3RoIC0gMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgazEgPSBMb25nLnJldmVyc2VCeXRlcyhjb2xsaXNpb24uZ2V0TG9uZyhpbmRleCArIDApKTsKKyAgICAgICAgICAgIGxvbmcgazIgPSBMb25nLnJldmVyc2VCeXRlcyhjb2xsaXNpb24uZ2V0TG9uZyhpbmRleCArIDgpKTsKKworICAgICAgICAgICAgLy8gMTYgYnl0ZXMKKyAgICAgICAgICAgIGsxICo9IGMxOworICAgICAgICAgICAgazEgPSByb3RsNjQoazEsIDMxKTsKKyAgICAgICAgICAgIGsxICo9IGMyOworICAgICAgICAgICAgaDEgXj0gazE7CisgICAgICAgICAgICBoMSA9IHJvdGw2NChoMSwgMjcpOworICAgICAgICAgICAgaDEgKz0gaDI7CisgICAgICAgICAgICBoMSA9IGgxICogNSArIDB4NTJkY2U3Mjk7CisgICAgICAgICAgICBrMiAqPSBjMjsKKyAgICAgICAgICAgIGsyID0gcm90bDY0KGsyLCAzMyk7CisgICAgICAgICAgICBrMiAqPSBjMTsKKyAgICAgICAgICAgIGgyIF49IGsyOworICAgICAgICAgICAgaDIgPSByb3RsNjQoaDIsIDMxKTsKKyAgICAgICAgICAgIGgyICs9IGgxOworICAgICAgICAgICAgaDIgPSBoMiAqIDUgKyAweDM4NDk1YWI1OworCisgICAgICAgICAgICBpbmRleCArPSAxNjsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgb2gxID0gaDE7CisgICAgICAgIGxvbmcgb2gyID0gaDI7CisKKyAgICAgICAgLy8gUHJvY2VzcyBmaW5hbCB1bmZpbGxlZCBjaHVuaywgYnV0IG9ubHkgYWRqdXN0IHRoZSBvcmlnaW5hbCBoYXNoIHZhbHVlCisgICAgICAgIGlmIChpbmRleCA8IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBrMSA9IExvbmcucmV2ZXJzZUJ5dGVzKGNvbGxpc2lvbi5nZXRMb25nKGluZGV4ICsgMCkpOworICAgICAgICAgICAgbG9uZyBrMiA9IExvbmcucmV2ZXJzZUJ5dGVzKGNvbGxpc2lvbi5nZXRMb25nKGluZGV4ICsgOCkpOworCisgICAgICAgICAgICAvLyAxNiBieXRlcworICAgICAgICAgICAgazEgKj0gYzE7CisgICAgICAgICAgICBrMSA9IHJvdGw2NChrMSwgMzEpOworICAgICAgICAgICAgazEgKj0gYzI7CisgICAgICAgICAgICBvaDEgXj0gazE7CisKKyAgICAgICAgICAgIGsyICo9IGMyOworICAgICAgICAgICAgazIgPSByb3RsNjQoazIsIDMzKTsKKyAgICAgICAgICAgIGsyICo9IGMxOworICAgICAgICAgICAgb2gyIF49IGsyOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlc2UgYXJlIHRoZSBoYXNoZXMgdGhlIG9yaWdpbmFsIHdvdWxkIHByb3ZpZGUsIGJlZm9yZSBmaW5hbCBtaXhpbmcKKyAgICAgICAgb2gxIF49IG9yaWdpbmFsLmNhcGFjaXR5KCk7CisgICAgICAgIG9oMiBePSBvcmlnaW5hbC5jYXBhY2l0eSgpOworCisgICAgICAgIC8vIEZpbGwgaW4gdGhlIHJlbWFpbmluZyBieXRlcyBiZWZvcmUgdGhlIGxhc3QgMTYgYW5kIGdldCB0aGVpciBoYXNoCisgICAgICAgIGNvbGxpc2lvbi5wdXQoYnl0ZXNUb0FkZCk7CisgICAgICAgIHdoaWxlICgoY29sbGlzaW9uLnBvc2l0aW9uKCkgJiAweDBmKSAhPSAwKQorICAgICAgICAgICAgY29sbGlzaW9uLnB1dCgoYnl0ZSkgMCk7CisKKyAgICAgICAgd2hpbGUgKGluZGV4IDwgY29sbGlzaW9uLnBvc2l0aW9uKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgazEgPSBMb25nLnJldmVyc2VCeXRlcyhjb2xsaXNpb24uZ2V0TG9uZyhpbmRleCArIDApKTsKKyAgICAgICAgICAgIGxvbmcgazIgPSBMb25nLnJldmVyc2VCeXRlcyhjb2xsaXNpb24uZ2V0TG9uZyhpbmRleCArIDgpKTsKKworICAgICAgICAgICAgLy8gMTYgYnl0ZXMKKyAgICAgICAgICAgIGsxICo9IGMxOworICAgICAgICAgICAgazEgPSByb3RsNjQoazEsIDMxKTsKKyAgICAgICAgICAgIGsxICo9IGMyOworICAgICAgICAgICAgaDEgXj0gazE7CisgICAgICAgICAgICBoMSA9IHJvdGw2NChoMSwgMjcpOworICAgICAgICAgICAgaDEgKz0gaDI7CisgICAgICAgICAgICBoMSA9IGgxICogNSArIDB4NTJkY2U3Mjk7CisgICAgICAgICAgICBrMiAqPSBjMjsKKyAgICAgICAgICAgIGsyID0gcm90bDY0KGsyLCAzMyk7CisgICAgICAgICAgICBrMiAqPSBjMTsKKyAgICAgICAgICAgIGgyIF49IGsyOworICAgICAgICAgICAgaDIgPSByb3RsNjQoaDIsIDMxKTsKKyAgICAgICAgICAgIGgyICs9IGgxOworICAgICAgICAgICAgaDIgPSBoMiAqIDUgKyAweDM4NDk1YWI1OworCisgICAgICAgICAgICBpbmRleCArPSAxNjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdvcmtpbmcgYmFja3dhcmRzLCB3ZSBtdXN0IGdldCB0aGlzIGhhc2ggcGFpcgorICAgICAgICBsb25nIHRoMSA9IGgxOworICAgICAgICBsb25nIHRoMiA9IGgyOworCisgICAgICAgIC8vIGFkanVzdCBvaHggd2l0aCBsZW5ndGgKKyAgICAgICAgaDEgPSBvaDEgXiBjb2xsaXNpb24uY2FwYWNpdHkoKTsKKyAgICAgICAgaDIgPSBvaDIgXiBjb2xsaXNpb24uY2FwYWNpdHkoKTsKKworICAgICAgICAvLyBHZXQgbW9kdWxvLWxvbmcgaW52ZXJzZXMgb2YgdGhlIG11bHRpcGxpZXJzIHVzZWQgaW4gdGhlIGNvbXB1dGF0aW9uCisgICAgICAgIGxvbmcgaTVpID0gaW52ZXJzZSg1TCk7CisgICAgICAgIGxvbmcgYzFpID0gaW52ZXJzZShjMSk7CisgICAgICAgIGxvbmcgYzJpID0gaW52ZXJzZShjMik7CisKKyAgICAgICAgLy8gcmV2ZXJ0IG9uZSBzdGVwCisgICAgICAgIGgyIC09IDB4Mzg0OTVhYjU7CisgICAgICAgIGgyICo9IGk1aTsKKyAgICAgICAgaDIgLT0gaDE7CisgICAgICAgIGgyID0gcm90bDY0KGgyLCAzMyk7CisKKyAgICAgICAgaDEgLT0gMHg1MmRjZTcyOTsKKyAgICAgICAgaDEgKj0gaTVpOworICAgICAgICBoMSAtPSB0aDI7ICAvLyB1c2UgaDIgYmVmb3JlIGl0J3MgYWRqdXN0ZWQgd2l0aCBrMgorICAgICAgICBoMSA9IHJvdGw2NChoMSwgMzcpOworCisgICAgICAgIC8vIGV4dHJhY3QgdGhlIHJlcXVpcmVkIG1vZGlmaWVycyBhbmQgYXBwbGllcyB0aGUgaW52ZXJzZSBvZiB0aGVpciB0cmFuc2Zvcm1hdGlvbgorICAgICAgICBsb25nIGsxID0gaDEgXiB0aDE7CisgICAgICAgIGsxID0gYzJpICogazE7CisgICAgICAgIGsxID0gcm90bDY0KGsxLCAzMyk7CisgICAgICAgIGsxID0gYzFpICogazE7CisKKyAgICAgICAgbG9uZyBrMiA9IGgyIF4gdGgyOworICAgICAgICBrMiA9IGMxaSAqIGsyOworICAgICAgICBrMiA9IHJvdGw2NChrMiwgMzEpOworICAgICAgICBrMiA9IGMyaSAqIGsyOworCisgICAgICAgIGNvbGxpc2lvbi5wdXRMb25nKExvbmcucmV2ZXJzZUJ5dGVzKGsxKSk7CisgICAgICAgIGNvbGxpc2lvbi5wdXRMb25nKExvbmcucmV2ZXJzZUJ5dGVzKGsyKSk7CisgICAgICAgIGNvbGxpc2lvbi5mbGlwKCk7CisKKyAgICAgICAgcmV0dXJuIGNvbGxpc2lvbjsKKyAgICB9CisKKyAgICAvLyBBc3N1bWVzIGEgYW5kIGIgYXJlIHBvc2l0aXZlCisgICAgcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlcltdIHhnY2QoQmlnSW50ZWdlciBhLCBCaWdJbnRlZ2VyIGIpIHsKKyAgICAgICAgQmlnSW50ZWdlciB4ID0gYSwgeSA9IGI7CisgICAgICAgIEJpZ0ludGVnZXJbXSBxcmVtOworICAgICAgICBCaWdJbnRlZ2VyW10gcmVzdWx0ID0gbmV3IEJpZ0ludGVnZXJbM107CisgICAgICAgIEJpZ0ludGVnZXIgeDAgPSBCaWdJbnRlZ2VyLk9ORSwgeDEgPSBCaWdJbnRlZ2VyLlpFUk87CisgICAgICAgIEJpZ0ludGVnZXIgeTAgPSBCaWdJbnRlZ2VyLlpFUk8sIHkxID0gQmlnSW50ZWdlci5PTkU7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBxcmVtID0geC5kaXZpZGVBbmRSZW1haW5kZXIoeSk7CisgICAgICAgICAgICB4ID0gcXJlbVsxXTsKKyAgICAgICAgICAgIHgwID0geDAuc3VidHJhY3QoeTAubXVsdGlwbHkocXJlbVswXSkpOworICAgICAgICAgICAgeDEgPSB4MS5zdWJ0cmFjdCh5MS5tdWx0aXBseShxcmVtWzBdKSk7CisgICAgICAgICAgICBpZiAoeC5lcXVhbHMoQmlnSW50ZWdlci5aRVJPKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHRbMF0gPSB5OworICAgICAgICAgICAgICAgIHJlc3VsdFsxXSA9IHkwOworICAgICAgICAgICAgICAgIHJlc3VsdFsyXSA9IHkxOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHFyZW0gPSB5LmRpdmlkZUFuZFJlbWFpbmRlcih4KTsKKyAgICAgICAgICAgIHkgPSBxcmVtWzFdOworICAgICAgICAgICAgeTAgPSB5MC5zdWJ0cmFjdCh4MC5tdWx0aXBseShxcmVtWzBdKSk7CisgICAgICAgICAgICB5MSA9IHkxLnN1YnRyYWN0KHgxLm11bHRpcGx5KHFyZW1bMF0pKTsKKyAgICAgICAgICAgIGlmICh5LmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdFswXSA9IHg7CisgICAgICAgICAgICAgICAgcmVzdWx0WzFdID0geDA7CisgICAgICAgICAgICAgICAgcmVzdWx0WzJdID0geDE7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgYSBtdXBsdGlwbGljYXRpdmUgaW52ZXJzZSBmb3IgdGhlIGdpdmVuIG11bHRpcGxpZXIgZm9yIGxvbmcsIGkuZS4KKyAgICAgKiBzdWNoIHRoYXQgeCAqIGludmVyc2UoeCkgPSAxIHdoZXJlICogaXMgbG9uZyBtdWx0aXBsaWNhdGlvbi4KKyAgICAgKiBJbiBvdGhlciB3b3Jkcywgc3VjaCBhbiBpbnRlZ2VyIHRoYXQgeCAqIGludmVyc2UoeCkgPT0gMSAobW9kIDJeNjQpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBpbnZlcnNlKGxvbmcgbXVsdGlwbGllcikKKyAgICB7CisgICAgICAgIGZpbmFsIEJpZ0ludGVnZXIgbW9kdWx1cyA9IEJpZ0ludGVnZXIuT05FLnNoaWZ0TGVmdCg2NCk7CisgICAgICAgIC8vIEFkZCB0aGUgbW9kdWx1cyB0byB0aGUgbXVsdGlwbGllciB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIG5lZ2F0aXZlcyAoYSArIG0gPT0gYSAobW9kIG0pKQorICAgICAgICBCaWdJbnRlZ2VyW10gZ2NkcyA9IHhnY2QoQmlnSW50ZWdlci52YWx1ZU9mKG11bHRpcGxpZXIpLmFkZChtb2R1bHVzKSwgbW9kdWx1cyk7CisgICAgICAgIC8vIHhnY2QgZ2l2ZXMgZywgYSBhbmQgYiwgc3VjaCB0aGF0IGF4ICsgYm0gPSBnCisgICAgICAgIC8vIGllLCBheCA9IGcgKG1vZCBtKS4gUmV0dXJuIGEKKyAgICAgICAgYXNzZXJ0IGdjZHNbMF0uZXF1YWxzKEJpZ0ludGVnZXIuT05FKSA6ICJFdmVuIG51bWJlciAiICsgbXVsdGlwbGllciArICIgaGFzIG5vIGxvbmcgaW52ZXJzZSI7CisgICAgICAgIHJldHVybiBnY2RzWzFdLmxvbmdWYWx1ZUV4YWN0KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIHJvdGw2NChsb25nIHYsIGludCBuKQorICAgIHsKKyAgICAgICAgcmV0dXJuICgodiA8PCBuKSB8ICh2ID4+PiAoNjQgLSBuKSkpOworICAgIH0KKwogICAgIC8qKgogICAgICAqIERpc2FibGUgYmxvb20gZmlsdGVyIG9uIGFsbCBzc3RhYmxlcyBvZiBnaXZlbiB0YWJsZQogICAgICAqLwpAQCAtODY5LDcgKzEwNjksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNzdGFibGUgPSBzc3RhYmxlLmNsb25lQW5kUmVwbGFjZShGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQpOworICAgICAgICAgICAgICAgIHNzdGFibGUgPSAoKFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyKSBzc3RhYmxlKS5jbG9uZUFuZFJlcGxhY2UoRmlsdGVyRmFjdG9yeS5BbHdheXNQcmVzZW50KTsKICAgICAgICAgICAgICAgICB0eG4udXBkYXRlKHNzdGFibGUsIHRydWUpOwogICAgICAgICAgICAgICAgIHR4bi5jaGVja3BvaW50KCk7CiAgICAgICAgICAgICB9CkBAIC04NzcsNyArMTA3Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgcmVhZGVyIDogY2ZzLmdldExpdmVTU1RhYmxlcygpKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbHRlckZhY3RvcnkuQWx3YXlzUHJlc2VudCwgcmVhZGVyLmdldEJsb29tRmlsdGVyKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsICgoU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIpIHJlYWRlcikuZ2V0RmlsdGVyT2ZmSGVhcFNpemUoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMDQyLDQgKzEyNDIsMjMgQEAKICAgICB7CiAgICAgICAgIHZpZXcuZm9yY2VCbG9ja2luZ0ZsdXNoKENvbHVtbkZhbWlseVN0b3JlLkZsdXNoUmVhc29uLlVOSVRfVEVTVFMpOwogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGF0YUlucHV0U3RyZWFtUGx1c0ltcGwgZXh0ZW5kcyBEYXRhSW5wdXRTdHJlYW0gaW1wbGVtZW50cyBEYXRhSW5wdXRQbHVzCisgICAgeworICAgICAgICBwcml2YXRlIERhdGFJbnB1dFN0cmVhbVBsdXNJbXBsKElucHV0U3RyZWFtIGluKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihpbik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIERhdGFJbnB1dFN0cmVhbVBsdXMgd3JhcChJbnB1dFN0cmVhbSBpbikKKyAgICAgICAgeworICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtUGx1c0ltcGwgaW1wbCA9IG5ldyBEYXRhSW5wdXRTdHJlYW1QbHVzSW1wbChpbik7CisgICAgICAgICAgICByZXR1cm4gTW9ja2l0by5tb2NrKERhdGFJbnB1dFN0cmVhbVBsdXMuY2xhc3MsIG5ldyBGb3J3YXJkc0ludm9jYXRpb25zKGltcGwpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUnVudGltZUV4Y2VwdGlvbiB0ZXN0TXVzdEJlSW1wbGVtZW50ZWRGb3JTU1RhYmxlRm9ybWF0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRlc3QgbXVzdCBiZSBpbXBsZW1lbnRlZCBmb3Igc3N0YWJsZSBmb3JtYXQgIiArIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1ZGl0L0F1ZGl0TG9nZ2VyQXV0aFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdWRpdC9BdWRpdExvZ2dlckF1dGhUZXN0LmphdmEKaW5kZXggOWEzYzYwNS4uMGNlZDVhMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1ZGl0L0F1ZGl0TG9nZ2VyQXV0aFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXVkaXQvQXVkaXRMb2dnZXJBdXRoVGVzdC5qYXZhCkBAIC00Miw2ICs0Miw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5FbWJlZGRlZENhc3NhbmRyYVNlcnZpY2U7CiBpbXBvcnQgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVyczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUzsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOwpAQCAtNzUsNyArNzYsNyBAQAogICAgICAgICAgICAgY29uZmlnLmF1ZGl0X2xvZ2dpbmdfb3B0aW9ucy5sb2dnZXIgPSBuZXcgUGFyYW1ldGVyaXplZENsYXNzKCJJbk1lbW9yeUF1ZGl0TG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN1cGVydXNlcl9zZXR1cF9kZWxheV9tcyIsICIwIik7CisgICAgICAgIFNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUy5zZXRMb25nKDApOwogICAgICAgICBlbWJlZGRlZCA9IFNlcnZlclRlc3RVdGlscy5zdGFydEVtYmVkZGVkQ2Fzc2FuZHJhU2VydmljZSgpOwogCiAgICAgICAgIGV4ZWN1dGVXaXRoQ3JlZGVudGlhbHMoCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXVkaXQvQXVkaXRMb2dnZXJDbGVhbnVwVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1ZGl0L0F1ZGl0TG9nZ2VyQ2xlYW51cFRlc3QuamF2YQppbmRleCA4OTE4MjdjLi5lYmM1ZWFkIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXVkaXQvQXVkaXRMb2dnZXJDbGVhbnVwVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdWRpdC9BdWRpdExvZ2dlckNsZWFudXBUZXN0LmphdmEKQEAgLTQxLDYgKzQxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmZpbGUuRmlsZXMubGlzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVVBFUlVTRVJfU0VUVVBfREVMQVlfTVM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIApAQCAtNjksNyArNzAsOCBAQAogICAgICAgICBlbXB0eUNxNEZpbGUgPSBGaWxlcy5jcmVhdGVGaWxlKGF1ZGl0TG9nRGlyUm9vdC50b1BhdGgoKS5yZXNvbHZlKCIyMDIyMDkyOC0xMiIgKyBTaW5nbGVDaHJvbmljbGVRdWV1ZS5TVUZGSVgpKS50b0ZpbGUoKTsKICAgICAgICAgZW1wdHlNZXRhZGF0YUZpbGUgPSBGaWxlcy5jcmVhdGVGaWxlKGF1ZGl0TG9nRGlyUm9vdC50b1BhdGgoKS5yZXNvbHZlKCJtZXRhZGF0YSIgKyBTaW5nbGVUYWJsZVN0b3JlLlNVRkZJWCkpLnRvRmlsZSgpOwogCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN1cGVydXNlcl9zZXR1cF9kZWxheV9tcyIsICIwIik7CisgICAgICAgIFNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUy5zZXRMb25nKDApOworCiAgICAgICAgIGVtYmVkZGVkID0gbmV3IEVtYmVkZGVkQ2Fzc2FuZHJhU2VydmljZSgpOwogICAgICAgICBlbWJlZGRlZC5zdGFydCgpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdWRpdC9BdWRpdExvZ2dlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdWRpdC9BdWRpdExvZ2dlclRlc3QuamF2YQppbmRleCAxZWU2NmY3Li45ZGZkMTcxIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXVkaXQvQXVkaXRMb2dnZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1ZGl0L0F1ZGl0TG9nZ2VyVGVzdC5qYXZhCkBAIC00OTYsNyArNDk2LDcgQEAKICAgICB7CiAgICAgICAgIFN0cmluZyB0YmxOYW1lID0gY3JlYXRlVGFibGVOYW1lKCk7CiAKLSAgICAgICAgU3RyaW5nIGNxbCA9ICJDUkVBVEUgRlVOQ1RJT04gSUYgTk9UIEVYSVNUUyAgIiArIEtFWVNQQUNFICsgIi4iICsgdGJsTmFtZSArICIgKGNvbHVtbiBURVhULG51bSBpbnQpIFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUIFJFVFVSTlMgdGV4dCBMQU5HVUFHRSBqYXZhc2NyaXB0IEFTICQkIGNvbHVtbi5zdWJzdHJpbmcoMCxudW0pICQkIjsKKyAgICAgICAgU3RyaW5nIGNxbCA9ICJDUkVBVEUgRlVOQ1RJT04gSUYgTk9UIEVYSVNUUyAgIiArIEtFWVNQQUNFICsgIi4iICsgdGJsTmFtZSArICIgKGNvbHVtbiBURVhULG51bSBpbnQpIFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUIFJFVFVSTlMgdGV4dCBMQU5HVUFHRSBqYXZhIEFTICQkIHJldHVybiBjb2x1bW4uc3Vic3RyaW5nKDAsbnVtKTsgJCQiOwogICAgICAgICBleGVjdXRlQW5kQXNzZXJ0KGNxbCwgQXVkaXRMb2dFbnRyeVR5cGUuQ1JFQVRFX0ZVTkNUSU9OKTsKIAogICAgICAgICBjcWwgPSAiRFJPUCBGVU5DVElPTiAiICsgS0VZU1BBQ0UgKyAiLiIgKyB0YmxOYW1lOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvQXV0aENhY2hlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvQXV0aENhY2hlVGVzdC5qYXZhCmluZGV4IDBlMjIzNDYuLjUwYTBhOWMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0F1dGhDYWNoZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9BdXRoQ2FjaGVUZXN0LmphdmEKQEAgLTMzLDYgKzMzLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db25zaXN0ZW5jeUxldmVsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuVW5hdmFpbGFibGVFeGNlcHRpb247CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5BVVRIX0NBQ0hFX1dBUk1JTkdfTUFYX1JFVFJJRVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQVVUSF9DQUNIRV9XQVJNSU5HX1JFVFJZX0lOVEVSVkFMX01TOwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CkBAIC0yNjQsOCArMjY2LDggQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGhhbmRsZVByb3ZpZGVyRXJyb3JEdXJpbmdXYXJtaW5nKCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShBdXRoQ2FjaGUuQ0FDSEVfTE9BRF9SRVRSSUVTX1BST1BFUlRZLCAiMyIpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoQXV0aENhY2hlLkNBQ0hFX0xPQURfUkVUUllfSU5URVJWQUxfUFJPUEVSVFksICIwIik7CisgICAgICAgIEFVVEhfQ0FDSEVfV0FSTUlOR19NQVhfUkVUUklFUy5zZXRJbnQoMyk7CisgICAgICAgIEFVVEhfQ0FDSEVfV0FSTUlOR19SRVRSWV9JTlRFUlZBTF9NUy5zZXRMb25nKDApOwogICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGF0dGVtcHRzID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CiAKICAgICAgICAgU3VwcGxpZXI8TWFwPFN0cmluZywgSW50ZWdlcj4+IGJ1bGtMb2FkZXIgPSAoKSAtPiB7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9DcmVhdGVBbmRBbHRlclJvbGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9DcmVhdGVBbmRBbHRlclJvbGVUZXN0LmphdmEKaW5kZXggMzNhZTEyOS4uNmJiODNiMyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvQ3JlYXRlQW5kQWx0ZXJSb2xlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL0NyZWF0ZUFuZEFsdGVyUm9sZVRlc3QuamF2YQpAQCAtMjEsMTEgKzIxLDEwIEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCi1pbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLmV4Y2VwdGlvbnMuQXV0aGVudGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5taW5kcm90LmpiY3J5cHQuQkNyeXB0LmdlbnNhbHQ7CiBpbXBvcnQgc3RhdGljIG9yZy5taW5kcm90LmpiY3J5cHQuQkNyeXB0Lmhhc2hwdzsKIApAQCAtMzQsNiArMzMsMTIgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGVybWlzc2lvbnNWYWxpZGl0eSgwKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFJvbGVzVmFsaWRpdHkoMCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDcmVkZW50aWFsc1ZhbGlkaXR5KDApOworCiAgICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7CiAgICAgICAgIHJlcXVpcmVBdXRoZW50aWNhdGlvbigpOwogICAgICAgICByZXF1aXJlTmV0d29yaygpOwpAQCAtNjIsMTEgKzY3LDExIEBACiAKICAgICAgICAgdXNlVXNlcih1c2VyMSwgcGxhaW5UZXh0UHdkKTsKIAotICAgICAgICBleGVjdXRlTmV0V2l0aEF1dGhTcGluKCJTRUxFQ1Qga2V5IEZST00gc3lzdGVtLmxvY2FsIik7CisgICAgICAgIGV4ZWN1dGVOZXQoIlNFTEVDVCBrZXkgRlJPTSBzeXN0ZW0ubG9jYWwiKTsKIAogICAgICAgICB1c2VVc2VyKHVzZXIyLCBwbGFpblRleHRQd2QpOwogCi0gICAgICAgIGV4ZWN1dGVOZXRXaXRoQXV0aFNwaW4oIlNFTEVDVCBrZXkgRlJPTSBzeXN0ZW0ubG9jYWwiKTsKKyAgICAgICAgZXhlY3V0ZU5ldCgiU0VMRUNUIGtleSBGUk9NIHN5c3RlbS5sb2NhbCIpOwogCiAgICAgICAgIHVzZVN1cGVyVXNlcigpOwogCkBAIC03OCwxMSArODMsMTEgQEAKIAogICAgICAgICB1c2VVc2VyKHVzZXIxLCBwbGFpblRleHRQd2QyKTsKIAotICAgICAgICBleGVjdXRlTmV0V2l0aEF1dGhTcGluKCJTRUxFQ1Qga2V5IEZST00gc3lzdGVtLmxvY2FsIik7CisgICAgICAgIGV4ZWN1dGVOZXQoIlNFTEVDVCBrZXkgRlJPTSBzeXN0ZW0ubG9jYWwiKTsKIAogICAgICAgICB1c2VVc2VyKHVzZXIyLCBwbGFpblRleHRQd2QyKTsKIAotICAgICAgICBleGVjdXRlTmV0V2l0aEF1dGhTcGluKCJTRUxFQ1Qga2V5IEZST00gc3lzdGVtLmxvY2FsIik7CisgICAgICAgIGV4ZWN1dGVOZXQoIlNFTEVDVCBrZXkgRlJPTSBzeXN0ZW0ubG9jYWwiKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTA1LDExICsxMTAsMTEgQEAKIAogICAgICAgICB1c2VVc2VyKHVzZXIxLCBwbGFpblRleHRQd2QpOwogCi0gICAgICAgIGV4ZWN1dGVOZXRXaXRoQXV0aFNwaW4oIlNFTEVDVCBrZXkgRlJPTSBzeXN0ZW0ubG9jYWwiKTsKKyAgICAgICAgZXhlY3V0ZU5ldCgiU0VMRUNUIGtleSBGUk9NIHN5c3RlbS5sb2NhbCIpOwogCiAgICAgICAgIHVzZVVzZXIodXNlcjIsIHBsYWluVGV4dFB3ZCk7CiAKLSAgICAgICAgZXhlY3V0ZU5ldFdpdGhBdXRoU3BpbigiU0VMRUNUIGtleSBGUk9NIHN5c3RlbS5sb2NhbCIpOworICAgICAgICBleGVjdXRlTmV0KCJTRUxFQ1Qga2V5IEZST00gc3lzdGVtLmxvY2FsIik7CiAKICAgICAgICAgdXNlU3VwZXJVc2VyKCk7CiAKQEAgLTExOCwzMiArMTIzLDEwIEBACiAKICAgICAgICAgdXNlVXNlcih1c2VyMSwgcGxhaW5UZXh0UHdkMik7CiAKLSAgICAgICAgZXhlY3V0ZU5ldFdpdGhBdXRoU3BpbigiU0VMRUNUIGtleSBGUk9NIHN5c3RlbS5sb2NhbCIpOworICAgICAgICBleGVjdXRlTmV0KCJTRUxFQ1Qga2V5IEZST00gc3lzdGVtLmxvY2FsIik7CiAKICAgICAgICAgdXNlVXNlcih1c2VyMiwgcGxhaW5UZXh0UHdkMik7CiAKLSAgICAgICAgZXhlY3V0ZU5ldFdpdGhBdXRoU3BpbigiU0VMRUNUIGtleSBGUk9NIHN5c3RlbS5sb2NhbCIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFsdGVyaW5nIG9yIGNyZWF0aW5nIGF1dGggbWF5IHRha2Ugc29tZSB0aW1lIHRvIGJlIGVmZmVjdGl2ZQotICAgICAqCi0gICAgICogQHBhcmFtIHF1ZXJ5Ci0gICAgICovCi0gICAgdm9pZCBleGVjdXRlTmV0V2l0aEF1dGhTcGluKFN0cmluZyBxdWVyeSkKLSAgICB7Ci0gICAgICAgIFV0aWwuc3BpbkFzc2VydEVxdWFscyh0cnVlLCAoKSAtPiB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleGVjdXRlTmV0KHF1ZXJ5KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbjogIiArIGUsIGUgaW5zdGFuY2VvZiBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbik7Ci0gICAgICAgICAgICAgICAgcmVpbml0aWFsaXplTmV0d29yaygpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgMTApOworICAgICAgICBleGVjdXRlTmV0KCJTRUxFQ1Qga2V5IEZST00gc3lzdGVtLmxvY2FsIik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvR3JhbnRBbmRSZXZva2VUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9HcmFudEFuZFJldm9rZVRlc3QuamF2YQppbmRleCA1YzFjMmEwLi5lZWZmMDUyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9HcmFudEFuZFJldm9rZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9HcmFudEFuZFJldm9rZVRlc3QuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJlc3VsdFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwpAQCAtMzYsNiArMzcsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkKICAgICB7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGVybWlzc2lvbnNWYWxpZGl0eSgwKTsKICAgICAgICAgQ1FMVGVzdGVyLnNldFVwQ2xhc3MoKTsKICAgICAgICAgcmVxdWlyZUF1dGhlbnRpY2F0aW9uKCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9QYXNzd29yZEF1dGhlbnRpY2F0b3JUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYXV0aC9QYXNzd29yZEF1dGhlbnRpY2F0b3JUZXN0LmphdmEKaW5kZXggZTEwMzNmZi4uMGE4ZWZjMiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvUGFzc3dvcmRBdXRoZW50aWNhdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL1Bhc3N3b3JkQXV0aGVudGljYXRvclRlc3QuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKIGltcG9ydCBvcmcubWluZHJvdC5qYmNyeXB0LkJDcnlwdDsKIAogaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5BdXRoZW50aWNhdG9yOwpAQCAtNDUsMTQgKzQ2LDEzIEBACiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQ2Fzc2FuZHJhUm9sZU1hbmFnZXIuZ2V0R2Vuc2FsdExvZ1JvdW5kczsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5QYXNzd29yZEF1dGhlbnRpY2F0b3IuU2FzbE5lZ290aWF0b3I7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguUGFzc3dvcmRBdXRoZW50aWNhdG9yLmNoZWNrcHc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQVVUSF9CQ1JZUFRfR0VOU0FMVF9MT0cyX1JPVU5EUzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLm1pbmRyb3QuamJjcnlwdC5CQ3J5cHQuZ2Vuc2FsdDsKIGltcG9ydCBzdGF0aWMgb3JnLm1pbmRyb3QuamJjcnlwdC5CQ3J5cHQuaGFzaHB3OwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQ2Fzc2FuZHJhUm9sZU1hbmFnZXIuR0VOU0FMVF9MT0cyX1JPVU5EU19QUk9QRVJUWTsKLQogcHVibGljIGNsYXNzIFBhc3N3b3JkQXV0aGVudGljYXRvclRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKIHsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBQYXNzd29yZEF1dGhlbnRpY2F0b3IgYXV0aGVudGljYXRvciA9IG5ldyBQYXNzd29yZEF1dGhlbnRpY2F0b3IoKTsKQEAgLTExOSwxOSArMTE5LDEwIEBACiAKICAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZVNhbHRSb3VuZHNQcm9wZXJ0eVRlc3QoSW50ZWdlciByb3VuZHMpCiAgICAgewotICAgICAgICBTdHJpbmcgb2xkUHJvcGVydHkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoR0VOU0FMVF9MT0cyX1JPVU5EU19QUk9QRVJUWSk7Ci0gICAgICAgIHRyeQorICAgICAgICB0cnkgKFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoQVVUSF9CQ1JZUFRfR0VOU0FMVF9MT0cyX1JPVU5EUywgcm91bmRzKSkKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KEdFTlNBTFRfTE9HMl9ST1VORFNfUFJPUEVSVFksIHJvdW5kcy50b1N0cmluZygpKTsKICAgICAgICAgICAgIGdldEdlbnNhbHRMb2dSb3VuZHMoKTsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKCJQcm9wZXJ0eSAiICsgR0VOU0FMVF9MT0cyX1JPVU5EU19QUk9QRVJUWSArICIgbXVzdCBiZSBpbiBpbnRlcnZhbCBbNCwzMF0iKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvbGRQcm9wZXJ0eSAhPSBudWxsKQotICAgICAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShHRU5TQUxUX0xPRzJfUk9VTkRTX1BST1BFUlRZLCBvbGRQcm9wZXJ0eSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoR0VOU0FMVF9MT0cyX1JPVU5EU19QUk9QRVJUWSk7CisgICAgICAgICAgICBBc3NlcnQuZmFpbCgiUHJvcGVydHkgIiArIEFVVEhfQkNSWVBUX0dFTlNBTFRfTE9HMl9ST1VORFMuZ2V0S2V5KCkgKyAiIG11c3QgYmUgaW4gaW50ZXJ2YWwgWzQsMzBdIik7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9hdXRoL2pteC9KTVhBdXRoVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvam14L0pNWEF1dGhUZXN0LmphdmEKaW5kZXggM2JjMjhhOS4uZmVjZTQwNSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvam14L0pNWEF1dGhUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2F1dGgvam14L0pNWEF1dGhUZXN0LmphdmEKQEAgLTQzLDYgKzQzLDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmVNQmVhbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KTVhTZXJ2ZXJVdGlsczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9KTVhfQVVUSE9SSVpFUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfSk1YX1JFTU9URV9MT0dJTl9DT05GSUc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09NX1NVTl9NQU5BR0VNRU5UX0pNWFJFTU9URV9BVVRIRU5USUNBVEU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSkFWQV9TRUNVUklUWV9BVVRIX0xPR0lOX0NPTkZJRzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIApAQCAtODYsMTAgKzkwLDEwIEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXR1cEpNWFNlcnZlcigpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIFN0cmluZyBjb25maWcgPSBQYXRocy5nZXQoQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2UoImF1dGgvY2Fzc2FuZHJhLXRlc3QtamFhcy5jb25mIikudG9VUkkoKSkudG9TdHJpbmcoKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLmF1dGhlbnRpY2F0ZSIsICJ0cnVlIik7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZyIsIGNvbmZpZyk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmpteC5yZW1vdGUubG9naW4uY29uZmlnIiwgIlRlc3RMb2dpbiIpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5qbXguYXV0aG9yaXplciIsIE5vU3VwZXJVc2VyQXV0aG9yaXphdGlvblByb3h5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIENPTV9TVU5fTUFOQUdFTUVOVF9KTVhSRU1PVEVfQVVUSEVOVElDQVRFLnNldEJvb2xlYW4odHJ1ZSk7CisgICAgICAgIEpBVkFfU0VDVVJJVFlfQVVUSF9MT0dJTl9DT05GSUcuc2V0U3RyaW5nKGNvbmZpZyk7CisgICAgICAgIENBU1NBTkRSQV9KTVhfUkVNT1RFX0xPR0lOX0NPTkZJRy5zZXRTdHJpbmcoIlRlc3RMb2dpbiIpOworICAgICAgICBDQVNTQU5EUkFfSk1YX0FVVEhPUklaRVIuc2V0U3RyaW5nKE5vU3VwZXJVc2VyQXV0aG9yaXphdGlvblByb3h5LmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgIGpteFNlcnZlciA9IEpNWFNlcnZlclV0aWxzLmNyZWF0ZUpNWFNlcnZlcig5OTk5LCAibG9jYWxob3N0IiwgdHJ1ZSk7CiAgICAgICAgIGpteFNlcnZlci5zdGFydCgpOwogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYmF0Y2hsb2cvQmF0Y2hsb2dNYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2JhdGNobG9nL0JhdGNobG9nTWFuYWdlclRlc3QuamF2YQppbmRleCAxZmIzNzM1Li45MGExZDczIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvYmF0Y2hsb2cvQmF0Y2hsb2dNYW5hZ2VyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9iYXRjaGxvZy9CYXRjaGxvZ01hbmFnZXJUZXN0LmphdmEKQEAgLTE3MCw3ICsxNzAsNyBAQAogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBxdWVyeSA9IFN0cmluZy5mb3JtYXQoIlNFTEVDVCAqIEZST00gXCIlc1wiLlwiJXNcIiBXSEVSRSBrZXkgPSBpbnRBc0Jsb2IoJWQpIiwgS0VZU1BBQ0UxLCBDRl9TVEFOREFSRDEsIGkpOworICAgICAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gU3RyaW5nLmZvcm1hdCgiU0VMRUNUICogRlJPTSBcIiVzXCIuXCIlc1wiIFdIRVJFIGtleSA9IGludF9hc19ibG9iKCVkKSIsIEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQxLCBpKTsKICAgICAgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0ID0gZXhlY3V0ZUludGVybmFsKHF1ZXJ5KTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0KTsKICAgICAgICAgICAgIGlmIChpIDwgNTApCkBAIC0yNDgsNyArMjQ4LDcgQEAKICAgICAgICAgLy8gV2Ugc2hvdWxkIHNlZSBoYWxmIG9mIFN0YW5kYXJkMi10YXJnZXRlZCBtdXRhdGlvbnMgd3JpdHRlbiBhZnRlciB0aGUgcmVwbGF5IGFuZCBhbGwgb2YgU3RhbmRhcmQzIG11dGF0aW9ucyBhcHBsaWVkLgogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykKICAgICAgICAgewotICAgICAgICAgICAgVW50eXBlZFJlc3VsdFNldCByZXN1bHQgPSBleGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiU0VMRUNUICogRlJPTSBcIiVzXCIuXCIlc1wiIFdIRVJFIGtleSA9IGludEFzQmxvYiglZCkiLCBLRVlTUEFDRTEsIENGX1NUQU5EQVJEMixpKSk7CisgICAgICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJlc3VsdCA9IGV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgKiBGUk9NIFwiJXNcIi5cIiVzXCIgV0hFUkUga2V5ID0gaW50X2FzX2Jsb2IoJWQpIiwgS0VZU1BBQ0UxLCBDRl9TVEFOREFSRDIsaSkpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwogICAgICAgICAgICAgaWYgKGkgPj0gNTAwKQogICAgICAgICAgICAgewpAQCAtMjY0LDcgKzI2NCw3IEBACiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0ID0gZXhlY3V0ZUludGVybmFsKFN0cmluZy5mb3JtYXQoIlNFTEVDVCAqIEZST00gXCIlc1wiLlwiJXNcIiBXSEVSRSBrZXkgPSBpbnRBc0Jsb2IoJWQpIiwgS0VZU1BBQ0UxLCBDRl9TVEFOREFSRDMsIGkpKTsKKyAgICAgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0ID0gZXhlY3V0ZUludGVybmFsKFN0cmluZy5mb3JtYXQoIlNFTEVDVCAqIEZST00gXCIlc1wiLlwiJXNcIiBXSEVSRSBrZXkgPSBpbnRfYXNfYmxvYiglZCkiLCBLRVlTUEFDRTEsIENGX1NUQU5EQVJEMywgaSkpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKGkpLCByZXN1bHQub25lKCkuZ2V0Qnl0ZXMoImtleSIpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygibmFtZSIgKyBpLCByZXN1bHQub25lKCkuZ2V0U3RyaW5nKCJuYW1lIikpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NhY2hlL0F1dG9TYXZpbmdDYWNoZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jYWNoZS9BdXRvU2F2aW5nQ2FjaGVUZXN0LmphdmEKaW5kZXggMDQwNDA5ZS4uNTAxNDVlMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NhY2hlL0F1dG9TYXZpbmdDYWNoZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY2FjaGUvQXV0b1NhdmluZ0NhY2hlVGVzdC5qYXZhCkBAIC0xNywyMCArMTcsMjUgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Bc2NpaVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQXNjaWlUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DYWNoZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKQEAgLTQ0LDYgKzQ5LDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShLZXlDYWNoZVN1cHBvcnQuaXNTdXBwb3J0ZWRCeShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpKTsKICAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKICAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKQEAgLTg1LDcgKzkyLDcgQEAKICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCiAgICAgICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKFV0aWwuZGsoImtleTEiKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CiAKLSAgICAgICAgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5PiBrZXlDYWNoZSA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZTsKKyAgICAgICAgQXV0b1NhdmluZ0NhY2hlPEtleUNhY2hlS2V5LCBBYnN0cmFjdFJvd0luZGV4RW50cnk+IGtleUNhY2hlID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlOwogCiAgICAgICAgIC8vIHNlcmlhbGl6ZSB0byBmaWxlCiAgICAgICAgIGtleUNhY2hlLnN1Ym1pdFdyaXRlKGtleUNhY2hlLnNpemUoKSkuZ2V0KCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0Nhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzVGVzdC5qYXZhCmluZGV4IGRlNmUwZDIuLjdhM2UwY2QgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzVGVzdC5qYXZhCkBAIC0xOCwyNiArMTgsNDEgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWc7CiAKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgYmVsb3cgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKKwogcHVibGljIGNsYXNzIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllc1Rlc3QKIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMgVEVTVF9QUk9QID0gQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk9SR19BUEFDSEVfQ0FTU0FORFJBX0NPTkZfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVNfVEVTVDsKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKQorICAgIHsKKyAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRLZXkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3lzdGVtUHJvcGVydHlpc1NldCgpIHsKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMsICJ0ZXN0IikpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChTeXN0ZW0uZ2V0UHJvcGVydHkoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRLZXkoKSkpLmlzRXF1YWxUbygidGVzdCIpOyAvLyBjaGVja3N0eWxlOiBzdXBwcmVzcyBuZWFyYnkgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKKyAgICAgICAgfQorICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZygpCiAgICAgewotICAgICAgICB0cnkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMsICJzb21lLXN0cmluZyIpKQogICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoVEVTVF9QUk9QLmdldEtleSgpLCAic29tZS1zdHJpbmciKTsKLSAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX1BST1AuZ2V0U3RyaW5nKCkpLmlzRXF1YWxUbygic29tZS1zdHJpbmciKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSk7CisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRTdHJpbmcoKSkuaXNFcXVhbFRvKCJzb21lLXN0cmluZyIpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NiwxMDAgKzYxLDg0IEBACiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSwgInRydWUiKTsKLSAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX1BST1AuZ2V0Qm9vbGVhbigpKS5pc0VxdWFsVG8odHJ1ZSk7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoVEVTVF9QUk9QLmdldEtleSgpLCAiZmFsc2UiKTsKLSAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX1BST1AuZ2V0Qm9vbGVhbigpKS5pc0VxdWFsVG8oZmFsc2UpOwotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSwgImp1bmsiKTsKLSAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX1BST1AuZ2V0Qm9vbGVhbigpKS5pc0VxdWFsVG8oZmFsc2UpOwotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSwgIiIpOwotICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFRFU1RfUFJPUC5nZXRCb29sZWFuKCkpLmlzRXF1YWxUbyhmYWxzZSk7CisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRLZXkoKSwgInRydWUiKTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLmdldEJvb2xlYW4oKSkuaXNFcXVhbFRvKHRydWUpOworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMuZ2V0S2V5KCksICJmYWxzZSIpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMuZ2V0Qm9vbGVhbigpKS5pc0VxdWFsVG8oZmFsc2UpOworICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMuZ2V0S2V5KCksICJqdW5rIik7CisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRCb29sZWFuKCkpLmlzRXF1YWxUbyhmYWxzZSk7CisgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRLZXkoKSwgIiIpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMuZ2V0Qm9vbGVhbigpKS5pc0VxdWFsVG8oZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoVEVTVF9QUk9QLmdldEtleSgpKTsKKyAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMuZ2V0S2V5KCkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbl9udWxsKCkKICAgICB7Ci0gICAgICAgIHRyeQorICAgICAgICB0cnkgKFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKSkKICAgICAgICAgewotICAgICAgICAgICAgVEVTVF9QUk9QLmdldEJvb2xlYW4oKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSk7CisgICAgICAgICAgICBURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLmdldEJvb2xlYW4oKTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLmdldEJvb2xlYW4oKSkuaXNGYWxzZSgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjaW1hbCgpCiAgICAgewotICAgICAgICB0cnkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMsICIxMjM0NTY3ODkiKSkKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSwgIjEyMzQ1Njc4OSIpOwotICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFRFU1RfUFJPUC5nZXRJbnQoKSkuaXNFcXVhbFRvKDEyMzQ1Njc4OSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShURVNUX1BST1AuZ2V0S2V5KCkpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMuZ2V0SW50KCkpLmlzRXF1YWxUbygxMjM0NTY3ODkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGV4YWRlY2ltYWwoKQogICAgIHsKLSAgICAgICAgdHJ5CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLCAiMHgxMjM0NTY3YSIpKQogICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoVEVTVF9QUk9QLmdldEtleSgpLCAiMHgxMjM0NTY3YSIpOwotICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFRFU1RfUFJPUC5nZXRJbnQoKSkuaXNFcXVhbFRvKDMwNTQxOTg5OCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShURVNUX1BST1AuZ2V0S2V5KCkpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFRFU1RfQ0FTU0FORFJBX1JFTEVWQU5UX1BST1BFUlRJRVMuZ2V0SW50KCkpLmlzRXF1YWxUbygzMDU0MTk4OTgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0T2N0YWwoKQogICAgIHsKLSAgICAgICAgdHJ5CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLCAiMDEyMzQ1NjciKSkKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSwgIjAxMjM0NTY3Iik7Ci0gICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoVEVTVF9QUk9QLmdldEludCgpKS5pc0VxdWFsVG8oMzQyMzkxKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KFRFU1RfUFJPUC5nZXRLZXkoKSk7CisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRJbnQoKSkuaXNFcXVhbFRvKDM0MjM5MSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdChleHBlY3RlZCA9IENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdEludGVnZXJfZW1wdHkoKQogICAgIHsKLSAgICAgICAgdHJ5CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLCAiIikpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShURVNUX1BST1AuZ2V0S2V5KCksICIiKTsKLSAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX1BST1AuZ2V0SW50KCkpLmlzRXF1YWxUbygzNDIzOTEpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoVEVTVF9QUk9QLmdldEtleSgpKTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLmdldEludCgpKS5pc0VxdWFsVG8oMzQyMzkxKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIEBUZXN0KGV4cGVjdGVkID0gTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzKQogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyX251bGwoKQogICAgIHsKLSAgICAgICAgdHJ5CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpKQogICAgICAgICB7Ci0gICAgICAgICAgICBURVNUX1BST1AuZ2V0SW50KCk7CisgICAgICAgICAgICBURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLmdldEludCgpOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhclByb3BlcnR5KCkKKyAgICB7CisgICAgICAgIGFzc2VydE51bGwoVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRTdHJpbmcoKSk7CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLCAidGVzdCIpKQogICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShURVNUX1BST1AuZ2V0S2V5KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgVEVTVF9DQVNTQU5EUkFfUkVMRVZBTlRfUFJPUEVSVElFUy5nZXRTdHJpbmcoKSk7CiAgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0TnVsbChURVNUX0NBU1NBTkRSQV9SRUxFVkFOVF9QUk9QRVJUSUVTLmdldFN0cmluZygpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0NvbmZpZ0NvbXBhdGFiaWxpdHlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0NvbmZpZ0NvbXBhdGFiaWxpdHlUZXN0LmphdmEKaW5kZXggOGQxZTVlMi4uNGE2MjAzMyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9Db25maWdDb21wYXRhYmlsaXR5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvQ29uZmlnQ29tcGF0YWJpbGl0eVRlc3QuamF2YQpAQCAtMjAwLDE0ICsyMDAsMTQgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIENsYXNzVHJlZSBsb2FkKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIE9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKG5ldyBZQU1MRmFjdG9yeSgpKTsKKyAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIobmV3IFlBTUxGYWN0b3J5KCkpOyAvLyBjaGVja3N0eWxlOiBwZXJtaXQgdGhpcyBpbnN0YW50aWF0aW9uCiAgICAgICAgIHJldHVybiBtYXBwZXIucmVhZFZhbHVlKG5ldyBGaWxlKHBhdGgpLCBDbGFzc1RyZWUuY2xhc3MpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKENsYXNzVHJlZSBjbGFzc1RyZWUsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGxvZ2dlci5pbmZvKCJEdW1waW5nIGNsYXNzIHRvIHt9IiwgcGF0aCk7Ci0gICAgICAgIE9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKG5ldyBZQU1MRmFjdG9yeSgpKTsKKyAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIobmV3IFlBTUxGYWN0b3J5KCkpOyAvLyBjaGVja3N0eWxlOiBwZXJtaXQgdGhpcyBpbnN0YW50aWF0aW9uCiAgICAgICAgIG1hcHBlci53cml0ZVZhbHVlKG5ldyBGaWxlKHBhdGgpLCBjbGFzc1RyZWUpOwogCiAgICAgICAgIC8vIHZhbGlkYXRlIHRoYXQgbG9hZCB3b3JrcyBhcyBleHBlY3RlZApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9EYXRhYmFzZURlc2NyaXB0b3JSZWZUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0RhdGFiYXNlRGVzY3JpcHRvclJlZlRlc3QuamF2YQppbmRleCAzZWUwNWNmLi42ZTJjYmUyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0RhdGFiYXNlRGVzY3JpcHRvclJlZlRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0RhdGFiYXNlRGVzY3JpcHRvclJlZlRlc3QuamF2YQpAQCAtMzcsNyArMzcsNiBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKQEAgLTQ2LDcgKzQ1LDcgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiAvKioKLSAqIFZlcmlmaWVzIHRoYXQge0BsaW5rIERhdGFiYXNlRGVzY3JpcHRvciNjbGllbnRJbml0aWFsaXphdGlvbigpfSB9IGFuZCBhIGNvdXBsZSBvZiA8aT5hcHBseTwvaT4gbWV0aG9kcworICogVmVyaWZpZXMgdGhhdCB7QGxpbmsgRGF0YWJhc2VEZXNjcmlwdG9yI2NsaWVudEluaXRpYWxpemF0aW9uKCl9IGFuZCBhIGNvdXBsZSBvZiA8aT5hcHBseTwvaT4gbWV0aG9kcwogICogZG8gbm90IHNvbWVob3cgbGF6aWx5IGluaXRpYWxpemUgYW55IHVud2FudGVkIHBhcnQgb2YgQ2Fzc2FuZHJhIGxpa2Ugc2NoZW1hLCBjb21taXQgbG9nIG9yIHN0YXJ0CiAgKiB1bmV4cGVjdGVkIHRocmVhZHMuCiAgKgpAQCAtNTYsNiArNTUsMTQgQEAKIHB1YmxpYyBjbGFzcyBEYXRhYmFzZURlc2NyaXB0b3JSZWZUZXN0CiB7CiAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHZhbGlkQ2xhc3NlcyA9IHsKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuQ29uc29sZUFwcGVuZGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuQ29uc29sZUFwcGVuZGVyJDEiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Db25zb2xlQXBwZW5kZXJCZWFuSW5mbyIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLkNvbnNvbGVBcHBlbmRlckN1c3RvbWl6ZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Mb2diYWNrU3RhdHVzTGlzdGVuZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Mb2diYWNrU3RhdHVzTGlzdGVuZXIkVG9Mb2dnZXJPdXRwdXRTdHJlYW0iLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Mb2diYWNrU3RhdHVzTGlzdGVuZXIkV3JhcHBlZFByaW50U3RyZWFtIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuVGVlaW5nQXBwZW5kZXIiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdWRpdC5BdWRpdExvZ09wdGlvbnMiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdWRpdC5CaW5BdWRpdExvZ2dlciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1ZGl0LkJpbkxvZ0F1ZGl0TG9nZ2VyIiwKQEAgLTYzLDE5ICs3MCwxOCBAQAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkFsbG93QWxsSW50ZXJub2RlQXV0aGVudGljYXRvciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQXV0aENhY2hlJEJ1bGtMb2FkZXIiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkNhY2hlYWJsZSIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSUludGVybm9kZUF1dGhlbnRpY2F0b3IiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLklBdXRoZW50aWNhdG9yIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JQXV0aG9yaXplciIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSVJvbGVNYW5hZ2VyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JSW50ZXJub2RlQXV0aGVudGljYXRvciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSU5ldHdvcmtBdXRob3JpemVyIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSVJvbGVNYW5hZ2VyIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMkUHJvcGVydHlDb252ZXJ0ZXIiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlndXJhdGlvbkxvYWRlciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWciLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnJDEiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnJENvbW1pdExvZ1N5bmMiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnJENvbW1pdEZhaWx1cmVQb2xpY3kiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnJENvbW1pdExvZ1N5bmMiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnJENvcnJ1cHRlZFRvbWJzdG9uZVN0cmF0ZWd5IiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZyREaXNrQWNjZXNzTW9kZSIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWckRGlza0ZhaWx1cmVQb2xpY3kiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnJERpc2tPcHRpbWl6YXRpb25TdHJhdGVneSIsCkBAIC04NiwxNCArOTIsMTcgQEAKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZyRQYXhvc1N0YXRlUHVyZ2luZyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWckUGF4b3NWYXJpYW50IiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZyRSZXBhaXJDb21tYW5kUG9vbEZ1bGxTdHJhdGVneSIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWckU1NUYWJsZUNvbmZpZyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWckVXNlckZ1bmN0aW9uVGltZW91dFBvbGljeSIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWckQ29ycnVwdGVkVG9tYnN0b25lU3RyYXRlZ3kiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yJEJ5dGVVbml0IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZ0JlYW5JbmZvIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZ0N1c3RvbWl6ZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlndXJhdGlvbkxvYWRlciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhUmF0ZVNwZWMiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVJhdGVTcGVjJERhdGFSYXRlVW5pdCIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhUmF0ZVNwZWMkRGF0YVJhdGVVbml0JDEiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVJhdGVTcGVjJERhdGFSYXRlVW5pdCQyIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFSYXRlU3BlYyREYXRhUmF0ZVVuaXQkMyIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhUmF0ZVNwZWMkTG9uZ0J5dGVzUGVyU2Vjb25kQm91bmQiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYyREYXRhU3RvcmFnZVVuaXQiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjJERhdGFTdG9yYWdlVW5pdCQxIiwKQEAgLTEwNSw1MiArMTE0LDYwIEBACiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWMkSW50TWViaWJ5dGVzQm91bmQiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjJExvbmdCeXRlc0JvdW5kIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYyRMb25nTWViaWJ5dGVzQm91bmQiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvciRCeXRlVW5pdCIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWMiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVJhdGVTcGVjJExvbmdCeXRlc1BlclNlY29uZEJvdW5kIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYyRJbnRNaWxsaXNlY29uZHNCb3VuZCIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWMkSW50TWludXRlc0JvdW5kIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYyRJbnRTZWNvbmRzQm91bmQiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRHVyYXRpb25TcGVjJExvbmdNaWxsaXNlY29uZHNCb3VuZCIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWMkTG9uZ01pY3Jvc2Vjb25kc0JvdW5kIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYyRMb25nTmFub3NlY29uZHNCb3VuZCIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWMkTG9uZ1NlY29uZHNCb3VuZCIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWMkSW50TWlsbGlzZWNvbmRzQm91bmQiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRHVyYXRpb25TcGVjJEludFNlY29uZHNCb3VuZCIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWMkSW50TWludXRlc0JvdW5kIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zJENsaWVudEVuY3J5cHRpb25PcHRpb25zIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zJFNlcnZlckVuY3J5cHRpb25PcHRpb25zIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zJFNlcnZlckVuY3J5cHRpb25PcHRpb25zJEludGVybm9kZUVuY3J5cHRpb24iLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnMkU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMkT3V0Z29pbmdFbmNyeXB0ZWRQb3J0U291cmNlIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zJFNlcnZlckVuY3J5cHRpb25PcHRpb25zQmVhbkluZm8iLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnMkU2VydmVyRW5jcnlwdGlvbk9wdGlvbnNDdXN0b21pemVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zQmVhbkluZm8iLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnNDdXN0b21pemVyIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkd1YXJkcmFpbHNPcHRpb25zIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkd1YXJkcmFpbHNPcHRpb25zJENvbmZpZyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5HdWFyZHJhaWxzT3B0aW9ucyRDb25zaXN0ZW5jeUxldmVscyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5HdWFyZHJhaWxzT3B0aW9ucyRUYWJsZVByb3BlcnRpZXMiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuUGFyYW1ldGVyaXplZENsYXNzIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlJlcGxpY2FGaWx0ZXJpbmdQcm90ZWN0aW9uT3B0aW9ucyIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5ZYW1sQ29uZmlndXJhdGlvbkxvYWRlciIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5ZYW1sQ29uZmlndXJhdGlvbkxvYWRlciRQcm9wZXJ0aWVzQ2hlY2tlciIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5ZYW1sQ29uZmlndXJhdGlvbkxvYWRlciRQcm9wZXJ0aWVzQ2hlY2tlciQxIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLllhbWxDb25maWd1cmF0aW9uTG9hZGVyJEN1c3RvbUNvbnN0cnVjdG9yIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlRyYW5zcGFyZW50RGF0YUVuY3J5cHRpb25PcHRpb25zIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlN0YXJ0dXBDaGVja3NPcHRpb25zIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlN1Ym5ldEdyb3VwcyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5UcmFja1dhcm5pbmdzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlRyYW5zcGFyZW50RGF0YUVuY3J5cHRpb25PcHRpb25zIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLllhbWxDb25maWd1cmF0aW9uTG9hZGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLllhbWxDb25maWd1cmF0aW9uTG9hZGVyJEN1c3RvbUNvbnN0cnVjdG9yIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLllhbWxDb25maWd1cmF0aW9uTG9hZGVyJFByb3BlcnRpZXNDaGVja2VyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLllhbWxDb25maWd1cmF0aW9uTG9hZGVyJFByb3BlcnRpZXNDaGVja2VyJDEiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkFsdGVyS2V5c3BhY2VTdGF0ZW1lbnQiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZUtleXNwYWNlU3RhdGVtZW50IiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29uc2lzdGVuY3lMZXZlbCIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2dTZWdtZW50TWFuYWdlckZhY3RvcnkiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuRGVmYXVsdENvbW1pdExvZ1NlZ21lbnRNZ3JGYWN0b3J5IiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkFic3RyYWN0Q29tbWl0TG9nU2VnbWVudE1hbmFnZXIiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nU2VnbWVudE1hbmFnZXJDREMiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nU2VnbWVudE1hbmFnZXJTdGFuZGFyZCIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2ciLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nTUJlYW4iLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nU2VnbWVudE1hbmFnZXJDREMiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nU2VnbWVudE1hbmFnZXJGYWN0b3J5IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyU3RhbmRhcmQiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuRGVmYXVsdENvbW1pdExvZ1NlZ21lbnRNZ3JGYWN0b3J5IiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzQ29uZmlnIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzQ29uZmlnTUJlYW4iLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbHNDb25maWckQ29uc2lzdGVuY3lMZXZlbHMiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLkd1YXJkcmFpbHNDb25maWckVGFibGVQcm9wZXJ0aWVzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZ3VhcmRyYWlscy5HdWFyZHJhaWxzQ29uZmlnTUJlYW4iLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzLlZhbHVlcyRDb25maWciLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRTb3VyY2UiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuYXBpLklJbnN0YW5jZSIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSXNvbGF0ZWRFeGVjdXRvciIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5JbnN0YW5jZUNsYXNzTG9hZGVyIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuaW1wbC5JbnN0YW5jZUNvbmZpZyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmFwaS5JSW52b2thYmxlSW5zdGFuY2UiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5hcGkuSUlzb2xhdGVkRXhlY3V0b3IiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLkluc3RhbmNlQ29uZmlnIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuaW1wbC5JbnZva2FibGVJbnN0YW5jZSRDYWxsYWJsZU5vRXhjZXB0IiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuaW1wbC5JbnZva2FibGVJbnN0YW5jZSRJbnN0YW5jZUZ1bmN0aW9uIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuaW1wbC5JbnZva2FibGVJbnN0YW5jZSRTZXJpYWxpemFibGVCaUNvbnN1bWVyIiwKQEAgLTE2Myw2NyArMTgwLDk2IEBACiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLmltcGwuSW52b2thYmxlSW5zdGFuY2UkVHJpRnVuY3Rpb24iLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLk1lc3NhZ2UiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5pbXBsLk5ldHdvcmtUb3BvbG9neSIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUmVxdWVzdFZhbGlkYXRpb25FeGNlcHRpb24iLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuSW5zdGFuY2VDbGFzc0xvYWRlciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ2Fzc2FuZHJhRXhjZXB0aW9uIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUmVxdWVzdFZhbGlkYXRpb25FeGNlcHRpb24iLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlRyYW5zcG9ydEV4Y2VwdGlvbiIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmZxbC5GdWxsUXVlcnlMb2dnZXIiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5mcWwuRnVsbFF1ZXJ5TG9nZ2VyT3B0aW9ucyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5JRmFpbHVyZURldGVjdG9yIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JRW5kcG9pbnRTbml0Y2giLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3IiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU0Vycm9yIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuSUNvbXByZXNzb3IiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5JQ29tcHJlc3NvciRVc2VzIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuTFo0Q29tcHJlc3NvciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQkVHlwZSIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNjcnViYmVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5NZXRyaWNzUHJvdmlkZXJzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlJEJ1aWxkZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5BYnN0cmFjdFNTVGFibGVGb3JtYXQiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdCRDb21wb25lbnRzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdCRDb21wb25lbnRzJFR5cGVzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdCRGYWN0b3J5IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdCRLZXlDYWNoZVZhbHVlU2VyaWFsaXplciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQkU1NUYWJsZVJlYWRlckZhY3RvcnkiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0JFNTVGFibGVXcml0ZXJGYWN0b3J5IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdCRUeXBlIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXIkQnVpbGRlciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXJXaXRoRmlsdGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIkQnVpbGRlciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNvcnRlZFRhYmxlUmVhZGVyTG9hZGluZ0J1aWxkZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlV3JpdGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlciRCdWlsZGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU29ydGVkVGFibGVXcml0ZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Tb3J0ZWRUYWJsZVdyaXRlciRCdWlsZGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbiIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0JEJpZ0Zvcm1hdEZhY3RvcnkiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0JEJpZ1RhYmxlUmVhZGVyRmFjdG9yeSIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQkQmlnVGFibGVXcml0ZXJGYWN0b3J5IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdCRCaWdWZXJzaW9uIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdCRDb21wb25lbnRzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdCRDb21wb25lbnRzJFR5cGVzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1NTVGFibGVSZWFkZXJMb2FkaW5nQnVpbGRlciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdUYWJsZVJlYWRlciIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdUYWJsZVJlYWRlciRCdWlsZGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlV3JpdGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlV3JpdGVyJEJ1aWxkZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlTdXBwb3J0IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5rZXljYWNoZS5LZXlDYWNoZVN1cHBvcnQiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhVHlwZSIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQnVmZmVyZWREYXRhT3V0cHV0U3RyZWFtUGx1cyIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmVidWZmZXJpbmdJbnB1dFN0cmVhbSIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1cyIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZU91dHB1dFN0cmVhbVBsdXMiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGUiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXMiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXMkRGF0YUlucHV0U3RyZWFtUGx1cyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlckZpeGVkIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0U3RyZWFtUGx1cyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXMiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXMiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRTdHJlYW1QbHVzIiwKICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EaXNrT3B0aW1pemF0aW9uU3RyYXRlZ3kiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNwaW5uaW5nRGlza09wdGltaXphdGlvblN0cmF0ZWd5IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSW5wdXRTdHJlYW1QbHVzIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1cyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUGF0aFV0aWxzJElPVG9Mb25nRnVuY3Rpb24iLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJlYnVmZmVyaW5nSW5wdXRTdHJlYW0iLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNwaW5uaW5nRGlza09wdGltaXphdGlvblN0cmF0ZWd5IiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JRW5kcG9pbnRTbml0Y2giLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydCIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYSIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYUNvbGxlY3Rpb24iLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlNpbXBsZVNlZWRQcm92aWRlciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU2VlZFByb3ZpZGVyIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5TaW1wbGVTZWVkUHJvdmlkZXIiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5FbmNyeXB0aW9uQ29udGV4dCIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LklTc2xDb250ZXh0RmFjdG9yeSIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LlNTTEZhY3RvcnkiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5FbmNyeXB0aW9uQ29udGV4dCIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2FjaGVTZXJ2aWNlJENhY2hlVHlwZSIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbEV4Y2VwdGlvbiIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJpbmxvZy5CaW5Mb2dPcHRpb25zIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvc2VhYmxlIiwKKyAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvc2VhYmxlSXRlcmF0b3IiLAogICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcyIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzJDEiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9zZWFibGVJdGVyYXRvciIsCiAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXIiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuQ29uc29sZUFwcGVuZGVyIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuQ29uc29sZUFwcGVuZGVyJDEiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Mb2diYWNrU3RhdHVzTGlzdGVuZXIiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Mb2diYWNrU3RhdHVzTGlzdGVuZXIkVG9Mb2dnZXJPdXRwdXRTdHJlYW0iLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Mb2diYWNrU3RhdHVzTGlzdGVuZXIkV3JhcHBlZFByaW50U3RyZWFtIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuVGVlaW5nQXBwZW5kZXIiLAotICAgIC8vIGdlbmVyYXRlZCBjbGFzc2VzCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWdCZWFuSW5mbyIsCi0gICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWdDdXN0b21pemVyIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zQmVhbkluZm8iLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnNDdXN0b21pemVyIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zJFNlcnZlckVuY3J5cHRpb25PcHRpb25zQmVhbkluZm8iLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnMkU2VydmVyRW5jcnlwdGlvbk9wdGlvbnNDdXN0b21pemVyIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEuQ29uc29sZUFwcGVuZGVyQmVhbkluZm8iLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5Db25zb2xlQXBwZW5kZXJDdXN0b21pemVyIiwKLSAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkFsdGVyS2V5c3BhY2VTdGF0ZW1lbnQiLAotICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZUtleXNwYWNlU3RhdGVtZW50IgorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5iaW5sb2cuQmluTG9nT3B0aW9ucyIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuUmVmQ291bnRlZCIsCisgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuU2VsZlJlZkNvdW50ZWQiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlRyYW5zYWN0aW9uYWwiLAorICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LlVuY2hlY2tlZEludGVycnVwdGVkRXhjZXB0aW9uIgogICAgIH07CiAKICAgICBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gY2hlY2tlZENsYXNzZXMgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QodmFsaWRDbGFzc2VzKSk7CkBAIC0zNzAsOCArNDE2LDggQEAKICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICAgICAgZm9yIChQYWlyPFN0cmluZywgRXhjZXB0aW9uPiB2aW9sYXRpb24gOiBuZXcgQXJyYXlMaXN0PD4odmlvbGF0aW9ucykpCiAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJcblxuIikKLSAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIlZJT0xBVElPTjogIikuYXBwZW5kKHZpb2xhdGlvbi5sZWZ0KS5hcHBlbmQoJ1xuJykKLSAgICAgICAgICAgICAgICAgIC5hcHBlbmQoVGhyb3dhYmxlcy5nZXRTdGFja1RyYWNlQXNTdHJpbmcodmlvbGF0aW9uLnJpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJWSU9MQVRJT046ICIpLmFwcGVuZCh2aW9sYXRpb24ubGVmdCk7IC8vLmFwcGVuZCgnXG4nKQorICAgICAgICAgICAgICAgICAgLy8uYXBwZW5kKFRocm93YWJsZXMuZ2V0U3RhY2tUcmFjZUFzU3RyaW5nKHZpb2xhdGlvbi5yaWdodCkpOwogICAgICAgICAgICAgU3RyaW5nIG1zZyA9IHNiLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICBlcnIucHJpbnRsbihtc2cpOwogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0RhdGFiYXNlRGVzY3JpcHRvclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRGF0YWJhc2VEZXNjcmlwdG9yVGVzdC5qYXZhCmluZGV4IDJiNzJjZDcuLmYxZjM5NTggMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRGF0YWJhc2VEZXNjcmlwdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRGF0YWJhc2VEZXNjcmlwdG9yVGVzdC5qYXZhCkBAIC0zNCw5ICszNCwxMyBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQUxMT1dfVU5MSU1JVEVEX0NPTkNVUlJFTlRfVkFMSURBVElPTlM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09ORklHX0xPQURFUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5QQVJUSVRJT05FUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYy5EYXRhU3RvcmFnZVVuaXQuS0lCSUJZVEVTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5OwpAQCAtNjMsNyArNjcsNyBAQAogCiAgICAgICAgIC8vIE5vdyB0cnkgY3VzdG9tIGxvYWRlcgogICAgICAgICBDb25maWd1cmF0aW9uTG9hZGVyIHRlc3RMb2FkZXIgPSBuZXcgVGVzdExvYWRlcigpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25maWcubG9hZGVyIiwgdGVzdExvYWRlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIENPTkZJR19MT0FERVIuc2V0U3RyaW5nKHRlc3RMb2FkZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwogCiAgICAgICAgIGNvbmZpZyA9IERhdGFiYXNlRGVzY3JpcHRvci5sb2FkQ29uZmlnKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygiQ29uZmlndXJhdGlvbkxvYWRlciBUZXN0IiwgY29uZmlnLmNsdXN0ZXJfbmFtZSk7CkBAIC0yMzMsMTEgKzIzNyw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcnRpdGlvblByb3BlcnR5T3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTdHJpbmcga2V5ID0gQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJwYXJ0aXRpb25lciI7Ci0gICAgICAgIFN0cmluZyBwcmV2aW91cyA9IFN5c3RlbS5nZXRQcm9wZXJ0eShrZXkpOwotICAgICAgICB0cnkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KFBBUlRJVElPTkVSLCAiVGhpc0RvZXNOb3RFeGlzdCIpKQogICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCAiVGhpc0RvZXNOb3RFeGlzdCIpOwogICAgICAgICAgICAgQ29uZmlnIHRlc3RDb25maWcgPSBEYXRhYmFzZURlc2NyaXB0b3IubG9hZENvbmZpZygpOwogICAgICAgICAgICAgdGVzdENvbmZpZy5wYXJ0aXRpb25lciA9ICJNdXJtdXIzUGFydGl0aW9uZXIiOwogCkBAIC0yNTYsMTcgKzI1Nyw2IEBACiAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRoaXNEb2VzTm90RXhpc3QiLCBjYXVzZS5nZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHByZXZpb3VzID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoa2V5LCBwcmV2aW91cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdApAQCAtMjk4LDE5ICsyODgsMjIgQEAKIAogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZSgtMSk7Ci0gICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjb2x1bW5faW5kZXhfc2l6ZSA9IC0xIik7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoLTUpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gY29sdW1uX2luZGV4X3NpemUgPSAtNSIpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWdub3JlZCkgeyB9Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA5NiwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDk2LCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplKDApKTsKIAogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZSgyICogMTAyNCAqIDEwMjQpOworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZUluS2lCKDIgKiAxMDI0ICogMTAyNCk7CiAgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gY29sdW1uX2luZGV4X3NpemUgPSAyR2lCIik7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWdub3JlZCkgeyB9Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA5NiwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDk2LCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplKDApKTsKKworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoLTEpOyAgLy8gc2V0IHVuZGVmaW5lZAorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDgxOTIsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleFNpemUoODE5MikpOwogCiAgICAgICAgIHRyeQogICAgICAgICB7CkBAIC00MTUsNyArNDA4LDcgQEAKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQigwKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZm9yIGRlcHRoIG9mIDkiKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZm9yIGRlcHRoIG9mIDAiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGlnbm9yZWQpIHsgfQogCkBAIC01MDQsNyArNDk3LDcgQEAKICAgICAgICAgY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0VGhhdChlLmdldE1lc3NhZ2UoKSkuaXNFcXVhbFRvKCJUbyBzZXQgY29uY3VycmVudF92YWxpZGF0aW9ucyA+IGNvbmN1cnJlbnRfY29tcGFjdG9ycywgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldCB0aGUgc3lzdGVtIHByb3BlcnR5IGNhc3NhbmRyYS5hbGxvd191bmxpbWl0ZWRfY29uY3VycmVudF92YWxpZGF0aW9ucz10cnVlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNldCB0aGUgc3lzdGVtIHByb3BlcnR5IC1EIiArIEFMTE9XX1VOTElNSVRFRF9DT05DVVJSRU5UX1ZBTElEQVRJT05TLmdldEtleSgpICsgIj10cnVlIik7CiAgICAgICAgIH0KIAogICAgICAgICAvLyB1bmxlc3Mgd2UgZGlzYWJsZSB0aGF0IGNoZWNrIChkb25lIHdpdGggYSBzeXN0ZW0gcHJvcGVydHkgYXQgc3RhcnR1cCBvciB2aWEgSk1YKQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9EdXJhdGlvblNwZWNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0R1cmF0aW9uU3BlY1Rlc3QuamF2YQppbmRleCAyMjg0NmZjLi5iMGM3M2RlIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0R1cmF0aW9uU3BlY1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0R1cmF0aW9uU3BlY1Rlc3QuamF2YQpAQCAtMjEzLDYgKzIxMyw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZCgiMTBzIiksIER1cmF0aW9uU3BlYy5JbnRTZWNvbmRzQm91bmQuaW5TZWNvbmRzU3RyaW5nKCIxMCIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kKCIxMHMiKSwgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZC5pblNlY29uZHNTdHJpbmcoIjEwcyIpKTsKIAorICAgICAgICBhc3NlcnRFcXVhbHMoMTBMLCBuZXcgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCgiMTB1cyIpLnRvTWljcm9zZWNvbmRzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMTBMLCBuZXcgRHVyYXRpb25TcGVjLkxvbmdNaWxsaXNlY29uZHNCb3VuZCgiMTBtcyIpLnRvTWlsbGlzZWNvbmRzKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMTBMLCBuZXcgRHVyYXRpb25TcGVjLkxvbmdTZWNvbmRzQm91bmQoIjEwcyIpLnRvU2Vjb25kcygpKTsKICAgICB9CkBAIC0yODQsNiArMjg1LDExIEBACiAgICAgICAgIGFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBuZXcgRHVyYXRpb25TcGVjLkludE1pbnV0ZXNCb3VuZCgiLTEwcyIpKS5pc0luc3RhbmNlT2YoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIkludmFsaWQgZHVyYXRpb246IC0xMHMiKTsKIAorICAgICAgICBhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gbmV3IER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQoIjEwbnMiKSkuaXNJbnN0YW5jZU9mKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJJbnZhbGlkIGR1cmF0aW9uOiAxMG5zIEFjY2VwdGVkIHVuaXRzIik7CisgICAgICAgIGFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBuZXcgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZCgxMCwgTkFOT1NFQ09ORFMpKS5pc0luc3RhbmNlT2YoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIkludmFsaWQgZHVyYXRpb246IDEwIE5BTk9TRUNPTkRTIEFjY2VwdGVkIHVuaXRzIik7CisKICAgICAgICAgYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IG5ldyBEdXJhdGlvblNwZWMuTG9uZ01pbGxpc2Vjb25kc0JvdW5kKCIxMG5zIikpLmlzSW5zdGFuY2VPZihJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNNZXNzYWdlQ29udGFpbmluZygiSW52YWxpZCBkdXJhdGlvbjogMTBucyBBY2NlcHRlZCB1bml0cyIpOwogICAgICAgICBhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gbmV3IER1cmF0aW9uU3BlYy5Mb25nTWlsbGlzZWNvbmRzQm91bmQoMTAsIE5BTk9TRUNPTkRTKSkuaXNJbnN0YW5jZU9mKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRW5jcnlwdGlvbk9wdGlvbnNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0VuY3J5cHRpb25PcHRpb25zVGVzdC5qYXZhCmluZGV4IGE3NmMyNGEuLjBmZjIxMjQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvRW5jcnlwdGlvbk9wdGlvbnNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9FbmNyeXB0aW9uT3B0aW9uc1Rlc3QuamF2YQpAQCAtMTI1LDcgKzEyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNyeXB0aW9uT3B0aW9ucy5UbHNFbmNyeXB0aW9uUG9saWN5IGV4cGVjdGVkKQogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zVGVzdENhc2UobmV3IEVuY3J5cHRpb25PcHRpb25zLlNlcnZlckVuY3J5cHRpb25PcHRpb25zKG5ldyBQYXJhbWV0ZXJpemVkQ2xhc3MoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LkRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8PigpKSwga2V5c3RvcmVQYXRoLCAiZHVtbXlwYXNzIiwgImR1bW15dHJ1c3RzdG9yZSIsICJkdW1teXBhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPD4oKSksIGtleXN0b3JlUGF0aCwgImR1bW15cGFzcyIsIGtleXN0b3JlUGF0aCwgImR1bW15cGFzcyIsICJkdW1teXRydXN0c3RvcmUiLCAiZHVtbXlwYXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG51bGwsIG51bGwsIG51bGwsICJKS1MiLCBmYWxzZSwgZmFsc2UsIG9wdGlvbmFsLCBpbnRlcm5vZGVFbmNyeXB0aW9uLCBmYWxzZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwbHlDb25maWcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvTG9hZE9sZFlBTUxCYWNrd2FyZENvbXBhdGliaWxpdHlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL0xvYWRPbGRZQU1MQmFja3dhcmRDb21wYXRpYmlsaXR5VGVzdC5qYXZhCmluZGV4IDBlMDI4Y2IuLjg1NTRlZDQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvTG9hZE9sZFlBTUxCYWNrd2FyZENvbXBhdGliaWxpdHlUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9Mb2FkT2xkWUFNTEJhY2t3YXJkQ29tcGF0aWJpbGl0eVRlc3QuamF2YQpAQCAtMjMsNiArMjMsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CkBAIC0zMyw3ICszNCw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwRGF0YWJhc2VEZXNjcmlwdG9yKCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIsICJjYXNzYW5kcmEtb2xkLnlhbWwiKTsKKyAgICAgICAgQ0FTU0FORFJBX0NPTkZJRy5zZXRTdHJpbmcoImNhc3NhbmRyYS1vbGQueWFtbCIpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICB9CiAKQEAgLTEwNSw3ICsxMDYsNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IER1cmF0aW9uU3BlYy5JbnRTZWNvbmRzQm91bmQoNjA0ODAwKSwgY29uZmlnLnRyYWNlX3R5cGVfcmVwYWlyX3R0bCk7CiAgICAgICAgIGFzc2VydE51bGwoY29uZmlnLnByZXBhcmVkX3N0YXRlbWVudHNfY2FjaGVfc2l6ZSk7CiAgICAgICAgIGFzc2VydFRydWUoY29uZmlnLnVzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZCk7Ci0gICAgICAgIGFzc2VydFRydWUoY29uZmlnLnNjcmlwdGVkX3VzZXJfZGVmaW5lZF9mdW5jdGlvbnNfZW5hYmxlZCk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy5zY3JpcHRlZF91c2VyX2RlZmluZWRfZnVuY3Rpb25zX2VuYWJsZWQpOwogICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5tYXRlcmlhbGl6ZWRfdmlld3NfZW5hYmxlZCk7CiAgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy50cmFuc2llbnRfcmVwbGljYXRpb25fZW5hYmxlZCk7CiAgICAgICAgIGFzc2VydFRydWUoY29uZmlnLnNhc2lfaW5kZXhlc19lbmFibGVkKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvT3ZlcnJpZGVDb25maWd1cmF0aW9uTG9hZGVyLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL092ZXJyaWRlQ29uZmlndXJhdGlvbkxvYWRlci5qYXZhCmluZGV4IDJmZmU5MWIuLjdhOGIxNGUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvT3ZlcnJpZGVDb25maWd1cmF0aW9uTG9hZGVyLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9PdmVycmlkZUNvbmZpZ3VyYXRpb25Mb2FkZXIuamF2YQpAQCAtMjIsNiArMjIsOCBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09ORklHX0xPQURFUjsKKwogLyoqCiAgKiBIZWxwZXIgY2xhc3MgZm9yIHByb2dyYW1tYXRpY2FsbHkgb3ZlcnJpZGluZyBpbmRpdmlkdWFsIGNvbmZpZyB2YWx1ZXMgYmVmb3JlIERhdGFiYXNlRGVzY3JpcHRvciBpcyBib290c3RyYXBwZWQuCiAgKi8KQEAgLTQwLDcgKzQyLDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvdmVycmlkZShDb25zdW1lcjxDb25maWc+IG1vZGlmaWVyKQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KENvbmZpZy5QUk9QRVJUWV9QUkVGSVggKyAiY29uZmlnLmxvYWRlciIsIE92ZXJyaWRlQ29uZmlndXJhdGlvbkxvYWRlci5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBDT05GSUdfTE9BREVSLnNldFN0cmluZyhPdmVycmlkZUNvbmZpZ3VyYXRpb25Mb2FkZXIuY2xhc3MuZ2V0TmFtZSgpKTsKICAgICAgICAgY29uZmlnTW9kaWZpZXIgPSBtb2RpZmllcjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL1lhbWxDb25maWd1cmF0aW9uTG9hZGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NvbmZpZy9ZYW1sQ29uZmlndXJhdGlvbkxvYWRlclRlc3QuamF2YQppbmRleCAwNmJlMWRjLi5iNDZkMmVhIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY29uZmlnL1lhbWxDb25maWd1cmF0aW9uTG9hZGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jb25maWcvWWFtbENvbmZpZ3VyYXRpb25Mb2FkZXJUZXN0LmphdmEKQEAgLTkxLDIxICs5MSwxOSBAQAogICAgICAgICAvLyB0aGUgcmVhc29uIGlzIHRoYXQgaXRzIG5vdCBhIHNjYWxhciBidXQgYSBjb21wbGV4IHR5cGUgKGNvbGxlY3Rpb24gdHlwZSksIHNvIHRoZSBtYXAgd2UgdXNlIG5lZWRzIHRvIGhhdmUgYSBjb2xsZWN0aW9uIHRvIG1hdGNoLgogICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGRlZmluZSBhIGNvbW1vbiBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIHRoZXNlIHR5cGVzIHNvIHRoZXkgY2FuIGJlIHdyaXR0ZW4gdG87IHRoaXMKICAgICAgICAgLy8gaXMgYW4gaXNzdWUgdGhhdCBTZXR0aW5nc1RhYmxlIG1heSBuZWVkIHRvIHdvcnJ5IGFib3V0LgotICAgICAgICB0cnkgKFdpdGhQcm9wZXJ0aWVzIGlnbm9yZSA9IG5ldyBXaXRoUHJvcGVydGllcyhDT05GSUdfQUxMT1dfU1lTVEVNX1BST1BFUlRJRVMuZ2V0S2V5KCksICJ0cnVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTVEVNX1BST1BFUlRZX1BSRUZJWCArICJzdG9yYWdlX3BvcnQiLCAiMTIzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTVEVNX1BST1BFUlRZX1BSRUZJWCArICJjb21taXRsb2dfc3luYyIsICJiYXRjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU1RFTV9QUk9QRVJUWV9QUkVGSVggKyAic2VlZF9wcm92aWRlci5jbGFzc19uYW1lIiwgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU2ltcGxlU2VlZFByb3ZpZGVyIiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9QRVJUWV9QUkVGSVggKyAiY2xpZW50X2VuY3J5cHRpb25fb3B0aW9ucy5jaXBoZXJfc3VpdGVzIiwgIltcIkZha2VDaXBoZXJcIl0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNURU1fUFJPUEVSVFlfUFJFRklYICsgImNsaWVudF9lbmNyeXB0aW9uX29wdGlvbnMub3B0aW9uYWwiLCAiZmFsc2UiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNURU1fUFJPUEVSVFlfUFJFRklYICsgImNsaWVudF9lbmNyeXB0aW9uX29wdGlvbnMuZW5hYmxlZCIsICJ0cnVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTVEVNX1BST1BFUlRZX1BSRUZJWCArICJkb2Vzbm90ZXhpc3QiLCAidHJ1ZSIKLSAgICAgICAgKSkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBpZ25vcmUgPSBuZXcgV2l0aFByb3BlcnRpZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoQ09ORklHX0FMTE9XX1NZU1RFTV9QUk9QRVJUSUVTLCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoKFNZU1RFTV9QUk9QRVJUWV9QUkVGSVggKyAic3RvcmFnZV9wb3J0IiwgIjEyMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTVEVNX1BST1BFUlRZX1BSRUZJWCArICJjb21taXRsb2dfc3luYyIsICJiYXRjaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTVEVNX1BST1BFUlRZX1BSRUZJWCArICJzZWVkX3Byb3ZpZGVyLmNsYXNzX25hbWUiLCAib3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5TaW1wbGVTZWVkUHJvdmlkZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU1RFTV9QUk9QRVJUWV9QUkVGSVggKyAiY2xpZW50X2VuY3J5cHRpb25fb3B0aW9ucy5vcHRpb25hbCIsIEJvb2xlYW4uRkFMU0UudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNURU1fUFJPUEVSVFlfUFJFRklYICsgImNsaWVudF9lbmNyeXB0aW9uX29wdGlvbnMuZW5hYmxlZCIsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU1RFTV9QUk9QRVJUWV9QUkVGSVggKyAiZG9lc25vdGV4aXN0IiwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpKQogICAgICAgICB7CiAgICAgICAgICAgICBDb25maWcgY29uZmlnID0gWWFtbENvbmZpZ3VyYXRpb25Mb2FkZXIuZnJvbU1hcChDb2xsZWN0aW9ucy5lbXB0eU1hcCgpLCB0cnVlLCBDb25maWcuY2xhc3MpOwogICAgICAgICAgICAgYXNzZXJ0VGhhdChjb25maWcuc3RvcmFnZV9wb3J0KS5pc0VxdWFsVG8oMTIzKTsKICAgICAgICAgICAgIGFzc2VydFRoYXQoY29uZmlnLmNvbW1pdGxvZ19zeW5jKS5pc0VxdWFsVG8oQ29uZmlnLkNvbW1pdExvZ1N5bmMuYmF0Y2gpOwogICAgICAgICAgICAgYXNzZXJ0VGhhdChjb25maWcuc2VlZF9wcm92aWRlci5jbGFzc19uYW1lKS5pc0VxdWFsVG8oIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU2ltcGxlU2VlZFByb3ZpZGVyIik7Ci0vLyAgICAgICAgICAgIGFzc2VydFRoYXQoY29uZmlnLmNsaWVudF9lbmNyeXB0aW9uX29wdGlvbnMuY2lwaGVyX3N1aXRlcykuaXNFcXVhbFRvKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIkZha2VDaXBoZXIiKSk7CiAgICAgICAgICAgICBhc3NlcnRUaGF0KGNvbmZpZy5jbGllbnRfZW5jcnlwdGlvbl9vcHRpb25zLm9wdGlvbmFsKS5pc0ZhbHNlKCk7CiAgICAgICAgICAgICBhc3NlcnRUaGF0KGNvbmZpZy5jbGllbnRfZW5jcnlwdGlvbl9vcHRpb25zLmVuYWJsZWQpLmlzVHJ1ZSgpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Bc3NpZ25tZW50VGVzdGFibGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Bc3NpZ25tZW50VGVzdGFibGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjMDBmMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0Fzc2lnbm1lbnRUZXN0YWJsZVRlc3QuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQXNjaWlUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTG9uZ1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKKworcHVibGljIGNsYXNzIEFzc2lnbm1lbnRUZXN0YWJsZVRlc3QKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZSgpCisgICAgeworICAgICAgICB0ZXN0R2V0UHJlZmVycmVkQ29tcGF0aWJsZVR5cGUobnVsbCk7CisKKyAgICAgICAgdGVzdEdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKEFzY2lpVHlwZS5pbnN0YW5jZSwgQXNjaWlUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgdGVzdEdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKFVURjhUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSk7CisgICAgICAgIHRlc3RHZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShBc2NpaVR5cGUuaW5zdGFuY2UsIEFzY2lpVHlwZS5pbnN0YW5jZSwgQXNjaWlUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgdGVzdEdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKFVURjhUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSwgVVRGOFR5cGUuaW5zdGFuY2UpOworICAgICAgICB0ZXN0R2V0UHJlZmVycmVkQ29tcGF0aWJsZVR5cGUoVVRGOFR5cGUuaW5zdGFuY2UsIEFzY2lpVHlwZS5pbnN0YW5jZSwgVVRGOFR5cGUuaW5zdGFuY2UpOworICAgICAgICB0ZXN0R2V0UHJlZmVycmVkQ29tcGF0aWJsZVR5cGUoVVRGOFR5cGUuaW5zdGFuY2UsIFVURjhUeXBlLmluc3RhbmNlLCBBc2NpaVR5cGUuaW5zdGFuY2UpOworCisgICAgICAgIHRlc3RHZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShJbnQzMlR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIHRlc3RHZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShMb25nVHlwZS5pbnN0YW5jZSwgTG9uZ1R5cGUuaW5zdGFuY2UpOworICAgICAgICB0ZXN0R2V0UHJlZmVycmVkQ29tcGF0aWJsZVR5cGUoSW50MzJUeXBlLmluc3RhbmNlLCBJbnQzMlR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIHRlc3RHZXRQcmVmZXJyZWRDb21wYXRpYmxlVHlwZShMb25nVHlwZS5pbnN0YW5jZSwgTG9uZ1R5cGUuaW5zdGFuY2UsIExvbmdUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgdGVzdEdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKG51bGwsIEludDMyVHlwZS5pbnN0YW5jZSwgTG9uZ1R5cGUuaW5zdGFuY2UpOyAvLyBub3QgYXNzaWduYWJsZQorICAgICAgICB0ZXN0R2V0UHJlZmVycmVkQ29tcGF0aWJsZVR5cGUobnVsbCwgTG9uZ1R5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSk7IC8vIG5vdCBhc3NpZ25hYmxlCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEdldFByZWZlcnJlZENvbXBhdGlibGVUeXBlKEFic3RyYWN0VHlwZTw/PiB0eXBlLCBBYnN0cmFjdFR5cGU8Pz4uLi4gdHlwZXMpCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHR5cGUsIEFzc2lnbm1lbnRUZXN0YWJsZS5nZXRDb21wYXRpYmxlVHlwZUlmS25vd24oQXJyYXlzLmFzTGlzdCh0eXBlcykpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DRENTdGF0ZW1lbnRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DRENTdGF0ZW1lbnRUZXN0LmphdmEKaW5kZXggZmIyNGFhOS4uNTU4NjViMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ0RDU3RhdGVtZW50VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0NEQ1N0YXRlbWVudFRlc3QuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogCiBwdWJsaWMgY2xhc3MgQ0RDU3RhdGVtZW50VGVzdCBleHRlbmRzIENRTFRlc3RlcgpAQCAtMjksNiArMzAsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkKICAgICB7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q0RDRW5hYmxlZCh0cnVlKTsKICAgICAgICAgQ1FMVGVzdGVyLnNldFVwQ2xhc3MoKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DUUwzVHlwZUxpdGVyYWxUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DUUwzVHlwZUxpdGVyYWxUZXN0LmphdmEKaW5kZXggZjBkMmMxOS4uMGQ3MzczMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ1FMM1R5cGVMaXRlcmFsVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0NRTDNUeXBlTGl0ZXJhbFRlc3QuamF2YQpAQCAtNDg0LDcgKzQ4NCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZXhwZWN0ZWQuYXBwZW5kKGJyYWNrZXRDbG9zZSk7Ci0gICAgICAgICAgICBidWZmZXIgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGJ1ZmZlcnMsIGFkZGVkLnNpemUoKSwgdmVyc2lvbik7CisgICAgICAgICAgICBidWZmZXIgPSBDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKGJ1ZmZlcnMsIGFkZGVkLnNpemUoKSk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gbmV3IFZhbHVlKGV4cGVjdGVkLnRvU3RyaW5nKCksIGNvbGxlY3Rpb25UeXBlLmFzQ1FMM1R5cGUoKSwgYnVmZmVyKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0NRTFRlc3Rlci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ1FMVGVzdGVyLmphdmEKaW5kZXggMjNiMzkyZi4uNDFiODZmMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ1FMVGVzdGVyLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ1FMVGVzdGVyLmphdmEKQEAgLTI2LDcgKzI2LDIxIEBACiBpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5ybWkuc2VydmVyLlJNSVNvY2tldEZhY3Rvcnk7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKQEAgLTM0LDcgKzQ4LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7Ci0KIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyQ29ubmVjdGlvbjsKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3I7CiBpbXBvcnQgamF2YXgubWFuYWdlbWVudC5yZW1vdGUuSk1YQ29ubmVjdG9yRmFjdG9yeTsKQEAgLTQ2LDE4ICs1OSwyNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3RyaW5nczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKLQotaW1wb3J0IG9yZy5qdW5pdC4qOwotCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLkdhdWdlOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS4qOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5DbG9zZUZ1dHVyZTsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ2x1c3RlcjsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQ29sdW1uRGVmaW5pdGlvbnM7CiBpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkRhdGFUeXBlOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5OZXR0eU9wdGlvbnM7CiBpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJlc3VsdFNldDsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuUm93OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TZXNzaW9uOworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TaW1wbGVTdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlNvY2tldE9wdGlvbnM7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlN0YXRlbWVudDsKIGltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuZXhjZXB0aW9ucy5VbmF1dGhvcml6ZWRFeGNlcHRpb247Ci0KIGltcG9ydCBjb20uZGF0YXN0YXguc2hhZGVkLm5ldHR5LmNoYW5uZWwuRXZlbnRMb29wR3JvdXA7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKQEAgLTY5LDUwICs5MSw4NSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguSVJvbGVNYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuU3RhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TeXN0ZW1LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJvb2xlYW5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlc1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Db2xsZWN0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkRlY2ltYWxUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuRG91YmxlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkR1cmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkZsb2F0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkluZXRBZGRyZXNzVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludGVnZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTGlzdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Mb25nVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLk1hcFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5TZXRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuU2hvcnRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVGltZVVVSURUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVGltZXN0YW1wVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlR1cGxlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVVJRFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbC5WaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLlZpcnR1YWxTY2hlbWFLZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuU3ludGF4RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LlNlY29uZGFyeUluZGV4TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5maWxlc3lzdGVtLkxpc3RlbmFibGVGaWxlU3lzdGVtOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVTeXN0ZW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuVG9rZW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNhc3NhbmRyYU1ldHJpY3NSZWdpc3RyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsaWVudE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbk5hbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5UdXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5TeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkluZGV4TWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFUZXN0VXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5UeXBlU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuUXVlcnlTdGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5FdmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuTWVzc2FnZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5TZXJ2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlNpbXBsZUNsaWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuUmVzdWx0TWVzc2FnZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5KTVhTZXJ2ZXJVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIGltcG9ydCBvcmcuYXdhaXRpbGl0eS5Bd2FpdGlsaXR5OwogCi1pbXBvcnQgc3RhdGljIGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Tb2NrZXRPcHRpb25zLkRFRkFVTFRfQ09OTkVDVF9USU1FT1VUX01JTExJUzsKLWltcG9ydCBzdGF0aWMgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlNvY2tldE9wdGlvbnMuREVGQVVMVF9SRUFEX1RJTUVPVVRfTUlMTElTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9KTVhfTE9DQUxfUE9SVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0RSSVZFUl9DT05ORUNUSU9OX1RJTUVPVVRfTVM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9EUklWRVJfUkVBRF9USU1FT1VUX01TOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfUkVVU0VfUFJFUEFSRUQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9ST1dfQ0FDSEVfU0laRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1VTRV9QUkVQQVJFRDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKQEAgLTEzMCw5ICsxODcsOSBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UgPSAiY3FsX3Rlc3Rfa2V5c3BhY2UiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFX1BFUl9URVNUID0gImNxbF90ZXN0X2tleXNwYWNlX2FsdCI7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9QUkVQQVJFRF9WQUxVRVMgPSBCb29sZWFuLnZhbHVlT2YoU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEudGVzdC51c2VfcHJlcGFyZWQiLCAidHJ1ZSIpKTsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVVU0VfUFJFUEFSRUQgPSBCb29sZWFuLnZhbHVlT2YoU3lzdGVtLmdldFByb3BlcnR5KCJjYXNzYW5kcmEudGVzdC5yZXVzZV9wcmVwYXJlZCIsICJ0cnVlIikpOwotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgbG9uZyBST1dfQ0FDSEVfU0laRV9JTl9NSUIgPSBuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdNZWJpYnl0ZXNCb3VuZChTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS50ZXN0LnJvd19jYWNoZV9zaXplIiwgIjBNaUIiKSkudG9NZWJpYnl0ZXMoKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVVNFX1BSRVBBUkVEX1ZBTFVFUyA9IFRFU1RfVVNFX1BSRVBBUkVELmdldEJvb2xlYW4oKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVVU0VfUFJFUEFSRUQgPSBURVNUX1JFVVNFX1BSRVBBUkVELmdldEJvb2xlYW4oKTsKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGxvbmcgUk9XX0NBQ0hFX1NJWkVfSU5fTUlCID0gbmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nTWViaWJ5dGVzQm91bmQoVEVTVF9ST1dfQ0FDSEVfU0laRS5nZXRTdHJpbmcoIjBNaUIiKSkudG9NZWJpYnl0ZXMoKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIHNlcU51bWJlciA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CiAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIFRPT19CSUcgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKEZCVXRpbGl0aWVzLk1BWF9VTlNJR05FRF9TSE9SVCArIDEwMjQpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfQ0VOVEVSID0gU2VydmVyVGVzdFV0aWxzLkRBVEFfQ0VOVEVSOwpAQCAtMTkxLDggKzI0OCw2IEBACiAKICAgICAgICAgbmF0aXZlQWRkciA9IEluZXRBZGRyZXNzLmdldExvb3BiYWNrQWRkcmVzcygpOwogICAgICAgICBuYXRpdmVQb3J0ID0gZ2V0QXV0b21hdGljYWxseUFsbG9jYXRlZFBvcnQobmF0aXZlQWRkcik7Ci0KLSAgICAgICAgU2VydmVyVGVzdFV0aWxzLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4ga2V5c3BhY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CkBAIC0zMTgsNiArMzczLDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKwogICAgICAgICBpZiAoUk9XX0NBQ0hFX1NJWkVfSU5fTUlCID4gMCkKICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRSb3dDYWNoZVNpemVJbk1pQihST1dfQ0FDSEVfU0laRV9JTl9NSUIpOwogICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5zZXRQYXJ0aXRpb25lclVuc2FmZShNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UpOwpAQCAtNDQwLDcgKzQ5Nyw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBidWlsZE5vZGV0b29sQXJncyhMaXN0PFN0cmluZz4gYXJncykKICAgICB7Ci0gICAgICAgIGludCBwb3J0ID0gam14UG9ydCA9PSAwID8gSW50ZWdlci5nZXRJbnRlZ2VyKCJjYXNzYW5kcmEuam14LmxvY2FsLnBvcnQiLCA3MTk5KSA6IGpteFBvcnQ7CisgICAgICAgIGludCBwb3J0ID0gam14UG9ydCA9PSAwID8gQ0FTU0FORFJBX0pNWF9MT0NBTF9QT1JULmdldEludCg3MTk5KSA6IGpteFBvcnQ7CiAgICAgICAgIFN0cmluZyBob3N0ID0gam14SG9zdCA9PSBudWxsID8gIjEyNy4wLjAuMSIgOiBqbXhIb3N0OwogICAgICAgICBMaXN0PFN0cmluZz4gYWxsQXJncyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBhbGxBcmdzLmFkZCgiYmluL25vZGV0b29sIik7CkBAIC01NzMsMTAgKzYzMCw4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgQ2x1c3RlciBpbml0Q2xpZW50Q2x1c3RlcihVc2VyIHVzZXIsIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uKQogICAgIHsKICAgICAgICAgU29ja2V0T3B0aW9ucyBzb2NrZXRPcHRpb25zID0KLSAgICAgICAgICAgICAgICBuZXcgU29ja2V0T3B0aW9ucygpLnNldENvbm5lY3RUaW1lb3V0TWlsbGlzKEludGVnZXIuZ2V0SW50ZWdlcigiY2Fzc2FuZHJhLnRlc3QuZHJpdmVyLmNvbm5lY3Rpb25fdGltZW91dF9tcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9DT05ORUNUX1RJTUVPVVRfTUlMTElTKSkgLy8gZGVmYXVsdCBpcyA1MDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSZWFkVGltZW91dE1pbGxpcyhJbnRlZ2VyLmdldEludGVnZXIoImNhc3NhbmRyYS50ZXN0LmRyaXZlci5yZWFkX3RpbWVvdXRfbXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUkVBRF9USU1FT1VUX01JTExJUykpOyAvLyBkZWZhdWx0IGlzIDEyMDAwCisgICAgICAgICAgICAgICAgbmV3IFNvY2tldE9wdGlvbnMoKS5zZXRDb25uZWN0VGltZW91dE1pbGxpcyhURVNUX0RSSVZFUl9DT05ORUNUSU9OX1RJTUVPVVRfTVMuZ2V0SW50KCkpIC8vIGRlZmF1bHQgaXMgNTAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UmVhZFRpbWVvdXRNaWxsaXMoVEVTVF9EUklWRVJfUkVBRF9USU1FT1VUX01TLmdldEludCgpKTsgLy8gZGVmYXVsdCBpcyAxMjAwMAogCiAgICAgICAgIGxvZ2dlci5pbmZvKCJUaW1lb3V0czoge30gLyB7fSIsIHNvY2tldE9wdGlvbnMuZ2V0Q29ubmVjdFRpbWVvdXRNaWxsaXMoKSwgc29ja2V0T3B0aW9ucy5nZXRSZWFkVGltZW91dE1pbGxpcygpKTsKIApAQCAtMTI4Niw2ICsxMzQxLDExIEBACiAgICAgICAgIHJldHVybiBzZXNzaW9uTmV0KCkuZXhlY3V0ZShuZXcgU2ltcGxlU3RhdGVtZW50KGZvcm1hdFF1ZXJ5KHF1ZXJ5KSkuc2V0RmV0Y2hTaXplKHBhZ2VTaXplKSk7CiAgICAgfQogCisgICAgcHJvdGVjdGVkIGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5SZXN1bHRTZXQgZXhlY3V0ZU5ldFdpdGhvdXRQYWdpbmcoU3RyaW5nIHF1ZXJ5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGVOZXRXaXRoUGFnaW5nKHF1ZXJ5LCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIFNlc3Npb24gc2Vzc2lvbk5ldCgpCiAgICAgewogICAgICAgICByZXR1cm4gc2Vzc2lvbk5ldChnZXREZWZhdWx0VmVyc2lvbigpKTsKQEAgLTEzNDIsNyArMTQwMiw3IEBACiAgICAgICAgIHJldHVybiBRdWVyeVByb2Nlc3Nvci5pbnN0YW5jZS5wcmVwYXJlKGZvcm1hdFF1ZXJ5KHF1ZXJ5KSwgQ2xpZW50U3RhdGUuZm9ySW50ZXJuYWxDYWxscygpKTsKICAgICB9CiAKLSAgICBwcm90ZWN0ZWQgVW50eXBlZFJlc3VsdFNldCBleGVjdXRlKFN0cmluZyBxdWVyeSwgT2JqZWN0Li4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHByb3RlY3RlZCBVbnR5cGVkUmVzdWx0U2V0IGV4ZWN1dGUoU3RyaW5nIHF1ZXJ5LCBPYmplY3QuLi4gdmFsdWVzKQogICAgIHsKICAgICAgICAgcmV0dXJuIGV4ZWN1dGVGb3JtYXR0ZWRRdWVyeShmb3JtYXRRdWVyeShxdWVyeSksIHZhbHVlcyk7CiAgICAgfQpAQCAtMTM1Miw3ICsxNDEyLDExIEBACiAgICAgICAgIHJldHVybiBleGVjdXRlRm9ybWF0dGVkUXVlcnkoZm9ybWF0Vmlld1F1ZXJ5KEtFWVNQQUNFLCBxdWVyeSksIHZhbHVlcyk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIFVudHlwZWRSZXN1bHRTZXQgZXhlY3V0ZUZvcm1hdHRlZFF1ZXJ5KFN0cmluZyBxdWVyeSwgT2JqZWN0Li4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIC8qKgorICAgICAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBxdWVyeSB1c2luZyB0aGUge0BsaW5rIENsaWVudFN0YXRlI2ZvckludGVybmFsQ2FsbHMoKX0gYXMgdGhlIGV4cGVjdGVkIENsaWVudFN0YXRlLiBOb3RlOgorICAgICAqIHRoaXMgbWVhbnMgcGVybWlzc2lvbnMgY2hlY2tpbmcgd2lsbCBub3QgYXBwbHkgYW5kIHF1ZXJpZXMgd2lsbCBwcm9jZWVkIHJlZ2FyZGxlc3Mgb2Ygcm9sZSBvciBndWFyZHJhaWxzLgorICAgICAqLworICAgIHByb3RlY3RlZCBVbnR5cGVkUmVzdWx0U2V0IGV4ZWN1dGVGb3JtYXR0ZWRRdWVyeShTdHJpbmcgcXVlcnksIE9iamVjdC4uLiB2YWx1ZXMpCiAgICAgewogICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJzOwogICAgICAgICBpZiAodXNlUHJlcGFyZWQpCkBAIC0xNzI3LDYgKzE3OTEsMjQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydENvbHVtbk5hbWVzKFJlc3VsdFNldCByZXN1bHQsIFN0cmluZy4uLiBleHBlY3RlZENvbHVtbk5hbWVzKQorICAgIHsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuZmFpbCgiTm8gcm93cyByZXR1cm5lZCBieSBxdWVyeS4iKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIENvbHVtbkRlZmluaXRpb25zIGNvbHVtbkRlZmluaXRpb25zID0gcmVzdWx0LmdldENvbHVtbkRlZmluaXRpb25zKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdvdCBsZXNzIGNvbHVtbnMgdGhhbiBleHBlY3RlZC4iLCBleHBlY3RlZENvbHVtbk5hbWVzLmxlbmd0aCwgY29sdW1uRGVmaW5pdGlvbnMuc2l6ZSgpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMCwgbSA9IGNvbHVtbkRlZmluaXRpb25zLnNpemUoKTsgaSA8IG07IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGNvbHVtbk5hbWUgPSBjb2x1bW5EZWZpbml0aW9ucy5nZXROYW1lKGkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhleHBlY3RlZENvbHVtbk5hbWVzW2ldLCBjb2x1bW5OYW1lKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEFsbFJvd3MoT2JqZWN0W10uLi4gcm93cykgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIiksIHJvd3MpOwpAQCAtMTczNyw2ICsxODE5LDExIEBACiAgICAgICAgIHJldHVybiBleHBlY3RlZDsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdFtdW10gcm93cyhPYmplY3RbXS4uLiByb3dzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJvd3M7CisgICAgfQorCiAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RW1wdHkoVW50eXBlZFJlc3VsdFNldCByZXN1bHQpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiAhcmVzdWx0LmlzRW1wdHkoKSkKQEAgLTE3NjgsOCArMTg1NSwxNSBAQAogICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKE9wdGlvbmFsLmVtcHR5KCksIGVycm9yTWVzc2FnZSwgZXhjZXB0aW9uLCBxdWVyeSwgdmFsdWVzKTsKICAgICB9CiAKLSAgICAvLyBpZiBhIHByb3RvY29sIHZlcnNpb24gPiBJbnRlZ2VyLk1JTl9WQUxVRSBpcyBzdXBwbGllZCwgZXhlY3V0ZXMKLSAgICAvLyB0aGUgcXVlcnkgdmlhIHRoZSBqYXZhIGRyaXZlciwgbWltaWNraW5nIGEgcmVhbCBjbGllbnQuCisgICAgLyoqCisgICAgICogQXNzZXJ0cyB0aGF0IHRoZSBxdWVyeSBwcm92aWRlZCB0aHJvd3MgdGhlIGV4Y2VwdGlvbnMgcHJvdmlkZWQuCisgICAgICoKKyAgICAgKiBOT1RFOiBUaGlzIG1ldGhvZCB1c2VzIHtAbGluayBDbGllbnRTdGF0ZSNmb3JJbnRlcm5hbENhbGxzKCl9IHdoaWNoIHNldHMgdGhlIHtAbGluayBDbGllbnRTdGF0ZSNpc0ludGVybmFsfSB2YWx1ZQorICAgICAqIHRvIHRydWUsIG51bGxpZnlpbmcgYW55IHN5c3RlbSBrZXlzcGFjZSBvciBvdGhlciBwZXJtaXNzaW9ucyBjaGVja2luZyBmb3IgdGFibGVzLgorICAgICAqCisgICAgICogSWYgYSBwcm90b2NvbCB2ZXJzaW9uID4gSW50ZWdlci5NSU5fVkFMVUUgaXMgc3VwcGxpZWQsIGV4ZWN1dGVzCisgICAgICogdGhlIHF1ZXJ5IHZpYSB0aGUgamF2YSBkcml2ZXIsIG1pbWlja2luZyBhIHJlYWwgY2xpZW50LgorICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoT3B0aW9uYWw8UHJvdG9jb2xWZXJzaW9uPiBwcm90b2NvbFZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFRocm93YWJsZT4gZXhjZXB0aW9uLApAQCAtMjE0OCwxMiArMjI0MiwxMiBAQAogICAgICAgICByZXR1cm4gbmV3IFVzZXJUeXBlVmFsdWUoZmllbGROYW1lcywgZmllbGRWYWx1ZXMpOwogICAgIH0KIAotICAgIHByb3RlY3RlZCBPYmplY3QgbGlzdChPYmplY3QuLi52YWx1ZXMpCisgICAgcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiBsaXN0KE9iamVjdC4uLnZhbHVlcykKICAgICB7CiAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHZhbHVlcyk7CiAgICAgfQogCi0gICAgcHJvdGVjdGVkIE9iamVjdCBzZXQoT2JqZWN0Li4udmFsdWVzKQorICAgIHByb3RlY3RlZCBTZXQ8T2JqZWN0PiBzZXQoT2JqZWN0Li4udmFsdWVzKQogICAgIHsKICAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldC5jb3B5T2YodmFsdWVzKTsKICAgICB9CkBAIC0yNDAzLDQgKzI0OTcsMzIgQEAKICAgICAgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFsKHBhc3N3b3JkLCB1LnBhc3N3b3JkKTsKICAgICAgICAgfQogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgSW5NZW1vcnkgZXh0ZW5kcyBDUUxUZXN0ZXIKKyAgICB7CisgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgTGlzdGVuYWJsZUZpbGVTeXN0ZW0gZnMgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2VkIGJ5IHtAbGluayAjY2xlYW51cEZpbGVTeXN0ZW1MaXN0ZW5lcnMoKX0gdG8ga25vdyBpZiBmaWxlIHN5c3RlbSBsaXN0ZW5lcnMgc2hvdWxkIGJlIHJlbW92ZWQgYXQgdGhlIHN0YXJ0CisgICAgICAgICAqIG9mIGEgdGVzdDsgY2FuIGRpc2FibGUgZm9yIGNhc2VzIHdoZXJlIGxpc3RlbmVycyBhcmUgbmVlZGVkIGNyb3NzIG11dGxpcGxlIHRlc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY2xlYW51cEZpbGVTeXN0ZW1MaXN0ZW5lcnMgPSB0cnVlOworCisgICAgICAgIEBCZWZvcmVDbGFzcworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZzID0gRmlsZVN5c3RlbXMubmV3R2xvYmFsSW5NZW1vcnlGaWxlU3lzdGVtKCk7CisgICAgICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuSUdOT1JFX01JU1NJTkdfTkFUSVZFX0ZJTEVfSElOVFMuc2V0Qm9vbGVhbih0cnVlKTsKKyAgICAgICAgICAgIEZpbGVTeXN0ZW1zLm1heWJlQ3JlYXRlVG1wKCk7CisKKyAgICAgICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7CisgICAgICAgIH0KKyAgICAgICAgQEJlZm9yZQorICAgICAgICBwdWJsaWMgdm9pZCBjbGVhbnVwRmlsZVN5c3RlbUxpc3RlbmVycygpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghY2xlYW51cEZpbGVTeXN0ZW1MaXN0ZW5lcnMpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgZnMuY2xlYXJMaXN0ZW5lcnMoKTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0N1c3RvbU5vd0luU2Vjb25kc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0N1c3RvbU5vd0luU2Vjb25kc1Rlc3QuamF2YQppbmRleCA4NzY4Yjc3Li5jZTliMTAzIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9DdXN0b21Ob3dJblNlY29uZHNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvQ3VzdG9tTm93SW5TZWNvbmRzVGVzdC5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuc3RhdGVtZW50cy5CYXRjaFN0YXRlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuTW9kaWZpY2F0aW9uU3RhdGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbnNpc3RlbmN5TGV2ZWw7CkBAIC00Myw2ICs0NCw4IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKQogICAgIHsKKyAgICAgICAgU2VydmVyVGVzdFV0aWxzLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisKICAgICAgICAgcHJlcGFyZVNlcnZlcigpOwogICAgICAgICByZXF1aXJlTmV0d29yaygpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0RlY29yYXRlZEtleVByZWZpeGVzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvRGVjb3JhdGVkS2V5UHJlZml4ZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyNmQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0RlY29yYXRlZEtleVByZWZpeGVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDM7CisKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5CeXRlT3JkZXJlZFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5UaHJvd2luZ1J1bm5hYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Ub21ic3RvbmVzV2l0aEluZGV4ZWRTU1RhYmxlVGVzdC5tYWtlUmFuZG9tU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyBwcmltYXJ5IGluZGV4IGZvciBwcmVmaXhlcy4gRXhlcmNpc2VzIHBhdGhzIGluIHRoZSBCVEkgcGFydGl0aW9uIGl0ZXJhdG9ycyB0aGF0IGFyZSB2ZXJ5IGhhcmQgdG8gcmVhY2ggdXNpbmcKKyAqIGEgaGFzaGluZyBwYXJ0aXRpb25lci4KKyAqLworcHVibGljIGNsYXNzIERlY29yYXRlZEtleVByZWZpeGVzVGVzdCBleHRlbmRzIENRTFRlc3RlcgoreworICAgIC8vIHRvIGZvcmNlIGluZGV4aW5nLCB3ZSBuZWVkIG1vcmUgdGhhbiAyKmNvbHVtbl9pbmRleF9zaXplICg0ayBmb3IgdGVzdHMpIGJ5dGVzIHBlciBwYXJ0aXRpb24uCisgICAgc3RhdGljIGZpbmFsIGludCBFTlRSWV9TSVpFID0gMTAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgV0lERV9ST1dfQ09VTlQgPSAxMDA7CisKKyAgICBTdHJpbmdbXSBrZXlzOworICAgIFN0cmluZ1tdIHNhbWVQcmVmaXhCZWZvcmU7CisgICAgU3RyaW5nW10gc2FtZVByZWZpeEFmdGVyOworCisgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAvLyBNdXN0IGJlIGNhbGxlZCB0aGUgc2FtZSBhcyBDUUxUZXN0ZXIncyB2ZXJzaW9uIHRvIGVuc3VyZSBpdCBvdmVycmlkZXMgaXQKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2Uuc2V0UGFydGl0aW9uZXJVbnNhZmUoQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5pbnN0YW5jZSk7CisKKyAgICAgICAgLy8gT25jZSBwZXItSlZNIGlzIGVub3VnaAorICAgICAgICBwcmVwYXJlU2VydmVyKCk7CisgICAgfQorCisgICAgYm9vbGVhbiB3aWRlKGludCBpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGkgJSAyID09IDE7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcmFuZG9tQ0tleShpbnQgaSkKKyAgICB7CisgICAgICAgIHJldHVybiB3aWRlKGkpID8gcmFuZC5uZXh0SW50KFdJREVfUk9XX0NPVU5UKSA6IDA7CisgICAgfQorCisgICAgdm9pZCBwcmVwYXJlVGFibGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UGFydGl0aW9uZXIoKSBpbnN0YW5jZW9mIEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIpOworCisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIHRleHQsIGNrIGludCwgdjEgaW50LCB2MiB0ZXh0LCBwcmltYXJ5IGtleShwaywgY2spKTsiKTsKKworICAgICAgICBTdHJpbmdbXSBiYXNlS2V5cyA9IG5ldyBTdHJpbmdbXSB7IkEiLCAiQkIiLCAiQ0NDIiwgIkREREQifTsKKyAgICAgICAga2V5cyA9IG5ldyBTdHJpbmdbYmFzZUtleXMubGVuZ3RoXTsKKyAgICAgICAgc2FtZVByZWZpeEJlZm9yZSA9IG5ldyBTdHJpbmdbYmFzZUtleXMubGVuZ3RoXTsKKyAgICAgICAgc2FtZVByZWZpeEFmdGVyID0gbmV3IFN0cmluZ1tiYXNlS2V5cy5sZW5ndGhdOworCisgICAgICAgIC8vIENyZWF0ZSBrZXlzIGFuZCBib3VuZHMgYmVmb3JlIGFuZCBhZnRlciBpdCB3aXRoIHRoZSBzYW1lIHByZWZpeAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJhc2VLZXlzLmxlbmd0aDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gYmFzZUtleXNbaV07CisgICAgICAgICAgICBrZXlzW2ldID0ga2V5ICsgImtleSI7CisgICAgICAgICAgICBzYW1lUHJlZml4QmVmb3JlW2ldID0ga2V5ICsgImJlZm9yZSI7CisgICAgICAgICAgICBzYW1lUHJlZml4QWZ0ZXJbaV0gPSBrZXkgKyAibGFyZ2VyIjsKKyAgICAgICAgICAgIGFkZFBhcnRpdGlvbihrZXlzW2ldLCB3aWRlKGkpID8gV0lERV9ST1dfQ09VTlQgOiAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRQYXJ0aXRpb24oU3RyaW5nIGtleSwgaW50IHJvd0NvdW50KSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvd0NvdW50OyArK2kpCisgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2MSwgdjIpIHZhbHVlcyAoPywgPywgPywgPykiLCBrZXksIGksIDEsIG1ha2VSYW5kb21TdHJpbmcoRU5UUllfU0laRSkpOworICAgIH0KKworICAgIHZvaWQgdGVzdFdpdGhGbHVzaChUaHJvd2luZ1J1bm5hYmxlIHRlc3QpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHByZXBhcmVUYWJsZSgpOworICAgICAgICB0ZXN0LnJ1bigpOworICAgICAgICBmbHVzaCgpOworICAgICAgICB0ZXN0LnJ1bigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeExvb2t1cEVRKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdGVzdFdpdGhGbHVzaCgoKSAtPgorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSBwayA9ID8gQU5EIGNrID0gPyIsIGtleXNbaV0sIHJhbmRvbUNLZXkoaSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGtleXNbaV0pKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSBwayA9ID8iLCBzYW1lUHJlZml4QmVmb3JlW2ldKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUIHBrIEZST00gJXMgV0hFUkUgcGsgPSA/Iiwgc2FtZVByZWZpeEFmdGVyW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeExvb2t1cEdFKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdGVzdFdpdGhGbHVzaCgoKSAtPgorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPj0gdG9rZW4oPykgTElNSVQgMSIsIGtleXNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGtleXNbaV0pKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBMSU1JVCAxIiwgc2FtZVByZWZpeEJlZm9yZVtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coa2V5c1tpXSkpOworICAgICAgICAgICAgICAgIGFzc2VydFJldHVybnNOZXh0KGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBMSU1JVCAxIiwgc2FtZVByZWZpeEFmdGVyW2ldKSwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0UmV0dXJuc05leHQoVW50eXBlZFJlc3VsdFNldCByZXN1bHQsIGludCBpKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBpZiAoaSA9PSBrZXlzLmxlbmd0aCAtIDEpCisgICAgICAgICAgICBhc3NlcnRFbXB0eShyZXN1bHQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnRSb3dzKHJlc3VsdCwgcm93KGtleXNbaSArIDFdKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlZml4TG9va3VwR1QoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICB0ZXN0V2l0aEZsdXNoKCgpIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRSZXR1cm5zTmV4dChleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBMSU1JVCAxIiwga2V5c1tpXSksIGkpOworICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHBrIEZST00gJXMgV0hFUkUgdG9rZW4ocGspID4gdG9rZW4oPykgTElNSVQgMSIsIHNhbWVQcmVmaXhCZWZvcmVbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGtleXNbaV0pKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRSZXR1cm5zTmV4dChleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBMSU1JVCAxIiwgc2FtZVByZWZpeEFmdGVyW2ldKSwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeEtleVNsaWNlRXhhY3QoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICB0ZXN0V2l0aEZsdXNoKCgpIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gaTsgaiA8IGtleXMubGVuZ3RoOyArK2opCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI8PiIgKyBqLCBNYXRoLm1heCgwLCBqIC0gaSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSgiU0VMRUNUIHBrIEZST00gJXMgV0hFUkUgdG9rZW4ocGspID4gdG9rZW4oPykgQU5EIHRva2VuKHBrKSA8IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwga2V5c1tpXSwga2V5c1tqXSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAiPTw+IiArIGosIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSgiU0VMRUNUIHBrIEZST00gJXMgV0hFUkUgdG9rZW4ocGspID4gdG9rZW4oPykgQU5EIHRva2VuKHBrKSA8PSB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIGtleXNbaV0sIGtleXNbal0pLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjw+PSIgKyBqLCBqIC0gaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDwgdG9rZW4oPykgQU5EIGNrID0gMCBBTExPVyBGSUxURVJJTkciLCBrZXlzW2ldLCBrZXlzW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI9PD49IiArIGosIGogLSBpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwga2V5c1tpXSwga2V5c1tqXSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeEtleVNsaWNlU2FtZVByZWZpeCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRlc3RXaXRoRmx1c2goKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCBrZXlzLmxlbmd0aDsgKytqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjxiYT4iICsgaiwgaiAtIGkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDwgdG9rZW4oPykgQU5EIGNrID0gMCBBTExPVyBGSUxURVJJTkciLCBzYW1lUHJlZml4QmVmb3JlW2ldLCBzYW1lUHJlZml4QWZ0ZXJbal0pLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAiPTxiYT4iICsgaiwgaiAtIGkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEJlZm9yZVtpXSwgc2FtZVByZWZpeEFmdGVyW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjxiYT49IiArIGosIGogLSBpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSgiU0VMRUNUIHBrIEZST00gJXMgV0hFUkUgdG9rZW4ocGspID49IHRva2VuKD8pIEFORCB0b2tlbihwaykgPCB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIHNhbWVQcmVmaXhCZWZvcmVbaV0sIHNhbWVQcmVmaXhBZnRlcltqXSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI9PGJhPj0iICsgaiwgaiAtIGkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPj0gdG9rZW4oPykgQU5EIHRva2VuKHBrKSA8PSB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIHNhbWVQcmVmaXhCZWZvcmVbaV0sIHNhbWVQcmVmaXhBZnRlcltqXSkuc2l6ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjxhYT4iICsgaiwgaiAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+IHRva2VuKD8pIEFORCB0b2tlbihwaykgPCB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIHNhbWVQcmVmaXhBZnRlcltpXSwgc2FtZVByZWZpeEFmdGVyW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIj08YWE+IiArIGosIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEFmdGVyW2ldLCBzYW1lUHJlZml4QWZ0ZXJbal0pLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAiPGFhPj0iICsgaiwgaiAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDwgdG9rZW4oPykgQU5EIGNrID0gMCBBTExPVyBGSUxURVJJTkciLCBzYW1lUHJlZml4QWZ0ZXJbaV0sIHNhbWVQcmVmaXhBZnRlcltqXSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI9PGFhPj0iICsgaiwgaiAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEFmdGVyW2ldLCBzYW1lUHJlZml4QWZ0ZXJbal0pLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI8YmI+IiArIGosIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDwgdG9rZW4oPykgQU5EIGNrID0gMCBBTExPVyBGSUxURVJJTkciLCBzYW1lUHJlZml4QmVmb3JlW2ldLCBzYW1lUHJlZml4QmVmb3JlW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIj08YmI+IiArIGosIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEJlZm9yZVtpXSwgc2FtZVByZWZpeEJlZm9yZVtqXSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI8YmI+PSIgKyBqLCBqIC0gaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSgiU0VMRUNUIHBrIEZST00gJXMgV0hFUkUgdG9rZW4ocGspID49IHRva2VuKD8pIEFORCB0b2tlbihwaykgPCB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIHNhbWVQcmVmaXhCZWZvcmVbaV0sIHNhbWVQcmVmaXhCZWZvcmVbal0pLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAiPTxiYj49IiArIGosIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPj0gdG9rZW4oPykgQU5EIHRva2VuKHBrKSA8PSB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIHNhbWVQcmVmaXhCZWZvcmVbaV0sIHNhbWVQcmVmaXhCZWZvcmVbal0pLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI8YWI+IiArIGosIE1hdGgubWF4KDAsIGogLSBpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+IHRva2VuKD8pIEFORCB0b2tlbihwaykgPCB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIHNhbWVQcmVmaXhBZnRlcltpXSwgc2FtZVByZWZpeEJlZm9yZVtqXSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI9PGFiPiIgKyBqLCBNYXRoLm1heCgwLCBqIC0gaSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEFmdGVyW2ldLCBzYW1lUHJlZml4QmVmb3JlW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjxhYj49IiArIGosIE1hdGgubWF4KDAsIGogLSBpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDwgdG9rZW4oPykgQU5EIGNrID0gMCBBTExPVyBGSUxURVJJTkciLCBzYW1lUHJlZml4QWZ0ZXJbaV0sIHNhbWVQcmVmaXhCZWZvcmVbal0pLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAiPTxhYj49IiArIGosIE1hdGgubWF4KDAsIGogLSBpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEFmdGVyW2ldLCBzYW1lUHJlZml4QmVmb3JlW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlZml4S2V5U2xpY2VNaXhlZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRlc3RXaXRoRmx1c2goKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGk7IGogPCBrZXlzLmxlbmd0aDsgKytqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjxiaz4iICsgaiwgaiAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+IHRva2VuKD8pIEFORCB0b2tlbihwaykgPCB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIHNhbWVQcmVmaXhCZWZvcmVbaV0sIGtleXNbal0pLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAiPTxiaz4iICsgaiwgaiAtIGkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEJlZm9yZVtpXSwga2V5c1tqXSkuc2l6ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjxhaz4iICsgaiwgTWF0aC5tYXgoMCwgaiAtIGkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSgiU0VMRUNUIHBrIEZST00gJXMgV0hFUkUgdG9rZW4ocGspID4gdG9rZW4oPykgQU5EIHRva2VuKHBrKSA8IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEFmdGVyW2ldLCBrZXlzW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIj08YWs+IiArIGosIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDw9IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwgc2FtZVByZWZpeEFmdGVyW2ldLCBrZXlzW2pdKS5zaXplKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAiPGtiPiIgKyBqLCBNYXRoLm1heCgwLCBqIC0gaSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPiB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDwgdG9rZW4oPykgQU5EIGNrID0gMCBBTExPVyBGSUxURVJJTkciLCBrZXlzW2ldLCBzYW1lUHJlZml4QmVmb3JlW2pdKS5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIj08a2I+IiArIGosIGogLSBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgcGsgRlJPTSAlcyBXSEVSRSB0b2tlbihwaykgPj0gdG9rZW4oPykgQU5EIHRva2VuKHBrKSA8IHRva2VuKD8pIEFORCBjayA9IDAgQUxMT1cgRklMVEVSSU5HIiwga2V5c1tpXSwgc2FtZVByZWZpeEJlZm9yZVtqXSkuc2l6ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgIjxrYT4iICsgaiwgaiAtIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+IHRva2VuKD8pIEFORCB0b2tlbihwaykgPCB0b2tlbig/KSBBTkQgY2sgPSAwIEFMTE9XIEZJTFRFUklORyIsIGtleXNbaV0sIHNhbWVQcmVmaXhBZnRlcltqXSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArICI9PGthPiIgKyBqLCBqIC0gaSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA+PSB0b2tlbig/KSBBTkQgdG9rZW4ocGspIDwgdG9rZW4oPykgQU5EIGNrID0gMCBBTExPVyBGSUxURVJJTkciLCBrZXlzW2ldLCBzYW1lUHJlZml4QWZ0ZXJbal0pLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9FbXB0eVZhbHVlc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0VtcHR5VmFsdWVzVGVzdC5qYXZhCmluZGV4IDM2NTJhYzguLmZmN2Y4NjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0VtcHR5VmFsdWVzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0VtcHR5VmFsdWVzVGVzdC5qYXZhCkBAIC0xOSw3ICsxOSw2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDM7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIApAQCAtNzMsMTcgKzcyLDIwIEBACiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWYgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc1RhYmxlIDogY2ZzLmdldExpdmVTU1RhYmxlcygpKQogICAgICAgICB7Ci0gICAgICAgICAgICB0cnkgKFByaW50U3RyZWFtIG91dCA9IG5ldyBQcmludFN0cmVhbShidWYsIHRydWUpKQorICAgICAgICAgICAgaW50IGV4aXRWYWx1ZSA9IDA7CisgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBQcm9jZXNzQnVpbGRlciBwYiA9IG5ldyBQcm9jZXNzQnVpbGRlcigidG9vbHMvYmluL3NzdGFibGVkdW1wIiwgc3NUYWJsZS5nZXRGaWxlbmFtZSgpKTsKKyAgICAgICAgICAgICAgICBwYi5yZWRpcmVjdEVycm9yU3RyZWFtKHRydWUpOwogICAgICAgICAgICAgICAgIFByb2Nlc3MgcHJvY2VzcyA9IHBiLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgcHJvY2Vzcy53YWl0Rm9yKCk7CisgICAgICAgICAgICAgICAgZXhpdFZhbHVlID0gcHJvY2Vzcy53YWl0Rm9yKCk7CiAgICAgICAgICAgICAgICAgSU9VdGlscy5jb3B5KHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSwgYnVmKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCh0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYnVmLnRvU3RyaW5nKCksIDAsIGV4aXRWYWx1ZSk7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIFN0cmluZyBvdXRTdHJpbmcgPSBuZXcgU3RyaW5nKGJ1Zi50b0J5dGVBcnJheSgpLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0djQ29tcGFjdGlvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0djQ29tcGFjdGlvblRlc3QuamF2YQppbmRleCBlZGVkMTQ1Li45MTExMWQxIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9HY0NvbXBhY3Rpb25UZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvR2NDb21wYWN0aW9uVGVzdC5qYXZhCkBAIC01NSw3ICs1NSw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFVudHlwZWRSZXN1bHRTZXQgZXhlY3V0ZShTdHJpbmcgcXVlcnksIE9iamVjdC4uLiB2YWx1ZXMpIHRocm93cyBUaHJvd2FibGUKKyAgICBwcm90ZWN0ZWQgVW50eXBlZFJlc3VsdFNldCBleGVjdXRlKFN0cmluZyBxdWVyeSwgT2JqZWN0Li4uIHZhbHVlcykKICAgICB7CiAgICAgICAgIHJldHVybiBleGVjdXRlRm9ybWF0dGVkUXVlcnkoZm9ybWF0UXVlcnkoS0VZU1BBQ0VfUEVSX1RFU1QsIHF1ZXJ5KSwgdmFsdWVzKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9LZXlDYWNoZUNxbFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0tleUNhY2hlQ3FsVGVzdC5qYXZhCmluZGV4IDJiMGEzYzguLjljN2RhYzEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0tleUNhY2hlQ3FsVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0tleUNhY2hlQ3FsVGVzdC5qYXZhCkBAIC0zMyw2ICszMyw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXg7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5maWx0ZXIuQmxvb21GaWx0ZXJNZXRyaWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGVTdXBwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2FjaGVNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuQ2Fzc2FuZHJhTWV0cmljc1JlZ2lzdHJ5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5DYWNoaW5nUGFyYW1zOwpAQCAtNDksNiArNTEsNyBAQAogCiBwdWJsaWMgY2xhc3MgS2V5Q2FjaGVDcWxUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzc3RhYmxlSW1wbENhY2hlc0tleXM7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29tbW9uQ29sdW1uc0RlZiA9CiAgICAgInBhcnRfa2V5X2EgICAgIGludCwiICsKQEAgLTk4LDYgKzEwMSw3IEBACiAgICAgewogICAgICAgICBDYWNoaW5nUGFyYW1zLkRFRkFVTFQgPSBDYWNoaW5nUGFyYW1zLkNBQ0hFX05PVEhJTkc7CiAgICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7CisgICAgICAgIHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA9IEtleUNhY2hlU3VwcG9ydC5pc1N1cHBvcnRlZEJ5KERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xMTUsNyArMTE5LDcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgVW50eXBlZFJlc3VsdFNldCBleGVjdXRlKFN0cmluZyBxdWVyeSwgT2JqZWN0Li4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHByb3RlY3RlZCBVbnR5cGVkUmVzdWx0U2V0IGV4ZWN1dGUoU3RyaW5nIHF1ZXJ5LCBPYmplY3QuLi4gdmFsdWVzKQogICAgIHsKICAgICAgICAgcmV0dXJuIGV4ZWN1dGVGb3JtYXR0ZWRRdWVyeShmb3JtYXRRdWVyeShLRVlTUEFDRV9QRVJfVEVTVCwgcXVlcnkpLCB2YWx1ZXMpOwogICAgIH0KQEAgLTI2OCw3ICsyNzIsNyBAQAogICAgICAgICBsb25nIGhpdHMgPSBtZXRyaWNzLmhpdHMuZ2V0Q291bnQoKTsKICAgICAgICAgbG9uZyByZXF1ZXN0cyA9IG1ldHJpY3MucmVxdWVzdHMuZ2V0Q291bnQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGhpdHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSZXF1ZXN0cywgcmVxdWVzdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3N0YWJsZUltcGxDYWNoZXNLZXlzID8gZXhwZWN0ZWRSZXF1ZXN0cyA6IDAsIHJlcXVlc3RzKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCiAgICAgICAgIHsKQEAgLTI4NSw4ICsyODksOCBAQAogICAgICAgICBtZXRyaWNzID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmdldE1ldHJpY3MoKTsKICAgICAgICAgaGl0cyA9IG1ldHJpY3MuaGl0cy5nZXRDb3VudCgpOwogICAgICAgICByZXF1ZXN0cyA9IG1ldHJpY3MucmVxdWVzdHMuZ2V0Q291bnQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgaGl0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlcXVlc3RzLCByZXF1ZXN0cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlSW1wbENhY2hlc0tleXMgPyAyMDAgOiAwLCBoaXRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA/IGV4cGVjdGVkUmVxdWVzdHMgOiAwLCByZXF1ZXN0cyk7CiAKICAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLnN1Ym1pdFdyaXRlKEludGVnZXIuTUFYX1ZBTFVFKS5nZXQoKTsKIApAQCAtMzYyLDcgKzM2Niw3IEBACiAgICAgICAgIGxvbmcgaGl0cyA9IG1ldHJpY3MuaGl0cy5nZXRDb3VudCgpOwogICAgICAgICBsb25nIHJlcXVlc3RzID0gbWV0cmljcy5yZXF1ZXN0cy5nZXRDb3VudCgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaGl0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE51bWJlck9mUmVxdWVzdHMsIHJlcXVlc3RzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA/IGV4cGVjdGVkTnVtYmVyT2ZSZXF1ZXN0cyA6IDAsIHJlcXVlc3RzKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCiAgICAgICAgIHsKQEAgLTM4MCw4ICszODQsOCBAQAogICAgICAgICBtZXRyaWNzID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmdldE1ldHJpY3MoKTsKICAgICAgICAgaGl0cyA9IG1ldHJpY3MuaGl0cy5nZXRDb3VudCgpOwogICAgICAgICByZXF1ZXN0cyA9IG1ldHJpY3MucmVxdWVzdHMuZ2V0Q291bnQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgaGl0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE51bWJlck9mUmVxdWVzdHMsIHJlcXVlc3RzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA/IDIwMCA6IDAsIGhpdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3N0YWJsZUltcGxDYWNoZXNLZXlzID8gZXhwZWN0ZWROdW1iZXJPZlJlcXVlc3RzIDogMCwgcmVxdWVzdHMpOwogCiAgICAgICAgIGRyb3BUYWJsZSgiRFJPUCBUQUJMRSAlcyIpOwogCkBAIC00MjgsNiArNDMyLDcgQEAKIAogICAgICAgICBsb25nIGV4cGVjdGVkTnVtYmVyT2ZSZXF1ZXN0cyA9IDA7CiAKKyAgICAgICAgQ2FjaGVNZXRyaWNzIG1ldHJpY3MgPSBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUuZ2V0TWV0cmljcygpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbF90ZXh0IEZST00gJXMgV0hFUkUgcGFydF9rZXlfYSA9ID8gQU5EIHBhcnRfa2V5X2IgPSA/IiwgaSwgSW50ZWdlci50b09jdGFsU3RyaW5nKGkpKSwKQEAgLTQzNywxMSArNDQyLDEwIEBACiAgICAgICAgICAgICBleHBlY3RlZE51bWJlck9mUmVxdWVzdHMgKz0gcmVjZW50Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlcygpICsgMTsKICAgICAgICAgfQogCi0gICAgICAgIENhY2hlTWV0cmljcyBtZXRyaWNzID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmdldE1ldHJpY3MoKTsKICAgICAgICAgbG9uZyBoaXRzID0gbWV0cmljcy5oaXRzLmdldENvdW50KCk7CiAgICAgICAgIGxvbmcgcmVxdWVzdHMgPSBtZXRyaWNzLnJlcXVlc3RzLmdldENvdW50KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBoaXRzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCByZXF1ZXN0cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlSW1wbENhY2hlc0tleXMgPyAxMCA6IDAsIHJlcXVlc3RzKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQogICAgICAgICB7CkBAIC00NTQsOCArNDU4LDggQEAKIAogICAgICAgICBoaXRzID0gbWV0cmljcy5oaXRzLmdldENvdW50KCk7CiAgICAgICAgIHJlcXVlc3RzID0gbWV0cmljcy5yZXF1ZXN0cy5nZXRDb3VudCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIGhpdHMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWROdW1iZXJPZlJlcXVlc3RzLCByZXF1ZXN0cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlSW1wbENhY2hlc0tleXMgPyAxMCA6IDAsIGhpdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3N0YWJsZUltcGxDYWNoZXNLZXlzID8gZXhwZWN0ZWROdW1iZXJPZlJlcXVlc3RzIDogMCwgcmVxdWVzdHMpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC00OTIsNyArNDk2LDcgQEAKICAgICAgICAgbG9uZyBoaXRzID0gbWV0cmljcy5oaXRzLmdldENvdW50KCk7CiAgICAgICAgIGxvbmcgcmVxdWVzdHMgPSBtZXRyaWNzLnJlcXVlc3RzLmdldENvdW50KCk7CiAgICAgICAgIGFzc2VydEVxdWFscygwLCBoaXRzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCByZXF1ZXN0cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlSW1wbENhY2hlc0tleXMgPyAxMCA6IDAsIHJlcXVlc3RzKTsKIAogICAgICAgICAvLyAxMCBxdWVyaWVzLCBlYWNoIDUwIHJlc3VsdCByb3dzCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKQEAgLTUwMyw4ICs1MDcsOCBAQAogICAgICAgICBtZXRyaWNzID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmdldE1ldHJpY3MoKTsKICAgICAgICAgaGl0cyA9IG1ldHJpY3MuaGl0cy5nZXRDb3VudCgpOwogICAgICAgICByZXF1ZXN0cyA9IG1ldHJpY3MucmVxdWVzdHMuZ2V0Q291bnQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBoaXRzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwICsgMTAsIHJlcXVlc3RzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA/IDEwIDogMCwgaGl0cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlSW1wbENhY2hlc0tleXMgPyAyMCA6IDAsIHJlcXVlc3RzKTsKIAogICAgICAgICAvLyAxMDAgcXVlcmllcyAtIG11c3QgZ2V0IGEgaGl0IGluIGtleS1jYWNoZQogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCkBAIC01MTksOCArNTIzLDggQEAKICAgICAgICAgbWV0cmljcyA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5nZXRNZXRyaWNzKCk7CiAgICAgICAgIGhpdHMgPSBtZXRyaWNzLmhpdHMuZ2V0Q291bnQoKTsKICAgICAgICAgcmVxdWVzdHMgPSBtZXRyaWNzLnJlcXVlc3RzLmdldENvdW50KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxMCArIDEwMCwgaGl0cyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyMCArIDEwMCwgcmVxdWVzdHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3N0YWJsZUltcGxDYWNoZXNLZXlzID8gMTAgKyAxMDAgOiAwLCBoaXRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA/IDIwICsgMTAwIDogMCwgcmVxdWVzdHMpOwogCiAgICAgICAgIC8vIDUwMDAgcXVlcmllcyAtIGZpcnN0IDEwIHBhcnRpdGlvbnMgYWxyZWFkeSBpbiBrZXkgY2FjaGUKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykKQEAgLTUzNCw4ICs1MzgsOCBAQAogCiAgICAgICAgIGhpdHMgPSBtZXRyaWNzLmhpdHMuZ2V0Q291bnQoKTsKICAgICAgICAgcmVxdWVzdHMgPSBtZXRyaWNzLnJlcXVlc3RzLmdldENvdW50KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxMTAgKyA0OTEwLCBoaXRzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMCArIDU1MDAsIHJlcXVlc3RzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA/IDExMCArIDQ5MTAgOiAwLCBoaXRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA/IDEyMCArIDU1MDAgOiAwLCByZXF1ZXN0cyk7CiAgICAgfQogCiAgICAgLy8gSW5zZXJ0cyAxMDAgcGFydGl0aW9ucyBzcGxpdCBvdmVyIDEwIHNzdGFibGVzIChmbHVzaCBhZnRlciAxMCBwYXJ0aXRpb25zKS4KQEAgLTYxNCw2ICs2MTgsOSBAQAogCiAgICAgcHJpdmF0ZSBsb25nIHJlY2VudEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXMoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRV9QRVJfVEVTVCkubWV0cmljLnJlY2VudEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXMuZ2V0VmFsdWUoKTsKKyAgICAgICAgcmV0dXJuIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRV9QRVJfVEVTVCkubWV0cmljLmZvcm1hdFNwZWNpZmljR2F1Z2VzLmdldChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoQmxvb21GaWx0ZXJNZXRyaWNzLmluc3RhbmNlLnJlY2VudEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZXMubmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmdWYWx1ZSgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0tleXdvcmRTcGxpdDJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9LZXl3b3JkU3BsaXQyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmU2NTFhLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL0tleXdvcmRTcGxpdDJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwotCi0vKioKLSAqIFRoaXMgYmFzZSBjbGFzcyB0ZXN0cyBhbGwga2V5d29yZHMgd2hpY2ggdG9vayBhIGxvbmcgdGltZS4gSGVuY2UgaXQgd2FzIHNwbGl0IGludG8gbXVsdGlwbGUKLSAqIEtleXdvcmRUZXN0U3BsaXROIHRvIHByZXZlbnQgQ0kgdGltaW5nIG91dC4gSWYgdGltZW91dHMgcmVhcHBlYXIgc3BsaXQgaXQgZnVydGhlcgotICovCi1AUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQotcHVibGljIGNsYXNzIEtleXdvcmRTcGxpdDJUZXN0IGV4dGVuZHMgS2V5d29yZFRlc3RCYXNlCi17Ci0gICAgc3RhdGljIGludCBTUExJVCA9IDI7Ci0gICAgc3RhdGljIGludCBUT1RBTF9TUExJVFMgPSAyOwotCi0gICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gImtleXdvcmQgezB9IGlzUmVzZXJ2ZWQgezF9IikKLSAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGtleXdvcmRzKCkgewotICAgICAgICByZXR1cm4gS2V5d29yZFRlc3RCYXNlLmdldEtleXdvcmRzRm9yU3BsaXQoU1BMSVQsIFRPVEFMX1NQTElUUyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBLZXl3b3JkU3BsaXQyVGVzdChTdHJpbmcga2V5d29yZCwgYm9vbGVhbiBpc1Jlc2VydmVkKQotICAgIHsKLSAgICAgICAgc3VwZXIoa2V5d29yZCwgaXNSZXNlcnZlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvS2V5d29yZFNwbGl0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvS2V5d29yZFNwbGl0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MWFhZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9LZXl3b3JkU3BsaXRUZXN0LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiBUaGlzIGJhc2UgY2xhc3MgdGVzdHMgYWxsIGtleXdvcmRzIHdoaWNoIHRvb2sgYSBsb25nIHRpbWUuIEhlbmNlIGl0IHdhcyBzcGxpdCBpbnRvIG11bHRpcGxlCisgKiBLZXl3b3JkVGVzdFNwbGl0TiB0byBwcmV2ZW50IENJIHRpbWluZyBvdXQuIElmIHRpbWVvdXRzIHJlYXBwZWFyIHNwbGl0IGl0IGZ1cnRoZXIKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBLZXl3b3JkU3BsaXRUZXN0IGV4dGVuZHMgS2V5d29yZFRlc3RCYXNlCit7CisgICAgc3RhdGljIGludCBTUExJVCA9IDI7CisgICAgc3RhdGljIGludCBUT1RBTF9TUExJVFMgPSAyOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gImtleXdvcmQgezB9IGlzUmVzZXJ2ZWQgezF9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGtleXdvcmRzKCkgeworICAgICAgICByZXR1cm4gS2V5d29yZFRlc3RCYXNlLmdldEtleXdvcmRzRm9yU3BsaXQoU1BMSVQsIFRPVEFMX1NQTElUUyk7CisgICAgfQorCisgICAgcHVibGljIEtleXdvcmRTcGxpdFRlc3QoU3RyaW5nIGtleXdvcmQsIGJvb2xlYW4gaXNSZXNlcnZlZCkKKyAgICB7CisgICAgICAgIHN1cGVyKGtleXdvcmQsIGlzUmVzZXJ2ZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL01lbXRhYmxlUXVpY2tUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9NZW10YWJsZVF1aWNrVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTVkYTkyLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL01lbXRhYmxlUXVpY2tUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwotCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7Ci0KLUBSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgTWVtdGFibGVRdWlja1Rlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKLXsKLSAgICBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE1lbXRhYmxlUXVpY2tUZXN0LmNsYXNzKTsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgcGFydGl0aW9ucyA9IDUwXzAwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IHJvd3NQZXJQYXJ0aXRpb24gPSA0OwotCi0gICAgc3RhdGljIGZpbmFsIGludCBkZWxldGVkUGFydGl0aW9uc1N0YXJ0ID0gMjBfMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgZGVsZXRlZFBhcnRpdGlvbnNFbmQgPSBkZWxldGVkUGFydGl0aW9uc1N0YXJ0ICsgMTBfMDAwOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBkZWxldGVkUm93c1N0YXJ0ID0gNDBfMDAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgZGVsZXRlZFJvd3NFbmQgPSBkZWxldGVkUm93c1N0YXJ0ICsgNV8wMDA7Ci0KLSAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoKQotICAgIHB1YmxpYyBTdHJpbmcgbWVtdGFibGVDbGFzczsKLQotICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3Q+IHBhcmFtZXRlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoInNraXBsaXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNraXBsaXN0X3NoYXJkZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2tpcGxpc3Rfc2hhcmRlZF9sb2NraW5nIik7Ci0gICAgfQotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwKCkKLSAgICB7Ci0gICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7Ci0gICAgICAgIENRTFRlc3Rlci5wcmVwYXJlU2VydmVyKCk7Ci0gICAgICAgIENRTFRlc3Rlci5kaXNhYmxlUHJlcGFyZWRSZXVzZUZvclRlc3QoKTsKLSAgICAgICAgbG9nZ2VyLmluZm8oInNldHVwQ2xhc3MgZG9uZS4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RNZW10YWJsZSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0KLSAgICAgICAgU3RyaW5nIGtleXNwYWNlID0gY3JlYXRlS2V5c3BhY2UoIkNSRUFURSBLRVlTUEFDRSAlcyB3aXRoIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3RvcicgOiAxIH0gYW5kIGR1cmFibGVfd3JpdGVzID0gZmFsc2UiKTsKLSAgICAgICAgU3RyaW5nIHRhYmxlID0gY3JlYXRlVGFibGUoa2V5c3BhY2UsICJDUkVBVEUgVEFCTEUgJXMgKCB1c2VyaWQgYmlnaW50LCBwaWNpZCBiaWdpbnQsIGNvbW1lbnRpZCBiaWdpbnQsIFBSSU1BUlkgS0VZKHVzZXJpZCwgcGljaWQpKSIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIGNvbXByZXNzaW9uID0geydlbmFibGVkJzogZmFsc2V9IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBtZW10YWJsZSA9ICciICsgbWVtdGFibGVDbGFzcyArICInIik7Ci0gICAgICAgIGV4ZWN1dGUoInVzZSAiICsga2V5c3BhY2UgKyAnOycpOwotCi0gICAgICAgIFN0cmluZyB3cml0ZVN0YXRlbWVudCA9ICJJTlNFUlQgSU5UTyAiK3RhYmxlKyIodXNlcmlkLHBpY2lkLGNvbW1lbnRpZClWQUxVRVMoPyw/LD8pIjsKLQotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKGtleXNwYWNlKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSh0YWJsZSk7Ci0gICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotCi0gICAgICAgIGxvbmcgaTsKLSAgICAgICAgbG9uZyBsaW1pdCA9IHBhcnRpdGlvbnM7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJXcml0aW5nIHt9IHBhcnRpdGlvbnMgb2Yge30gcm93cyIsIHBhcnRpdGlvbnMsIHJvd3NQZXJQYXJ0aXRpb24pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGltaXQ7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChsb25nIGogPSAwOyBqIDwgcm93c1BlclBhcnRpdGlvbjsgKytqKQotICAgICAgICAgICAgICAgIGV4ZWN1dGUod3JpdGVTdGF0ZW1lbnQsIGksIGosIGkgKyBqKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZ2dlci5pbmZvKCJEZWxldGluZyBwYXJ0aXRpb25zIGJldHdlZW4ge30gYW5kIHt9IiwgZGVsZXRlZFBhcnRpdGlvbnNTdGFydCwgZGVsZXRlZFBhcnRpdGlvbnNFbmQpOwotICAgICAgICBmb3IgKGkgPSBkZWxldGVkUGFydGl0aW9uc1N0YXJ0OyBpIDwgZGVsZXRlZFBhcnRpdGlvbnNFbmQ7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gbm8gcGFydGl0aW9uIGV4aXN0cywgYnV0IHdlIHdpbGwgY3JlYXRlIGEgdG9tYnN0b25lCi0gICAgICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAiICsgdGFibGUgKyAiIFdIRVJFIHVzZXJpZCA9ID8iLCBpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZ2dlci5pbmZvKCJEZWxldGluZyByb3dzIGJldHdlZW4ge30gYW5kIHt9IiwgZGVsZXRlZFJvd3NTdGFydCwgZGVsZXRlZFJvd3NFbmQpOwotICAgICAgICBmb3IgKGkgPSBkZWxldGVkUm93c1N0YXJ0OyBpIDwgZGVsZXRlZFJvd3NFbmQ7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gbm8gcm93IGV4aXN0cywgYnV0IHdlIHdpbGwgY3JlYXRlIGEgdG9tYnN0b25lIChhbmQgcGFydGl0aW9uKQotICAgICAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gIiArIHRhYmxlICsgIiBXSEVSRSB1c2VyaWQgPSA/IEFORCBwaWNpZCA9ID8iLCBpLCAwTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2dnZXIuaW5mbygiUmVhZGluZyB7fSBwYXJ0aXRpb25zIiwgcGFydGl0aW9ucyk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW1pdDsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJlc3VsdCA9IGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIiArIHRhYmxlICsgIiBXSEVSRSB1c2VyaWQgPSA/IiwgaSk7Ci0gICAgICAgICAgICBpZiAoaSA+PSBkZWxldGVkUGFydGl0aW9uc1N0YXJ0ICYmIGkgPCBkZWxldGVkUGFydGl0aW9uc0VuZCkKLSAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShyZXN1bHQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBzdGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPj0gZGVsZXRlZFJvd3NTdGFydCAmJiBpIDwgZGVsZXRlZFJvd3NFbmQpCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gMTsKLSAgICAgICAgICAgICAgICBPYmplY3RbXVtdIHJvd3MgPSBuZXcgT2JqZWN0W3Jvd3NQZXJQYXJ0aXRpb24gLSBzdGFydF1bXTsKLSAgICAgICAgICAgICAgICBmb3IgKGxvbmcgaiA9IHN0YXJ0OyBqIDwgcm93c1BlclBhcnRpdGlvbjsgKytqKQotICAgICAgICAgICAgICAgICAgICByb3dzWyhpbnQpIChqIC0gc3RhcnQpXSA9IHJvdyhpLCBqLCBpICsgaik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhyZXN1bHQsIHJvd3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGRlbGV0ZWRQYXJ0aXRpb25zID0gZGVsZXRlZFBhcnRpdGlvbnNFbmQgLSBkZWxldGVkUGFydGl0aW9uc1N0YXJ0OwotICAgICAgICBpbnQgZGVsZXRlZFJvd3MgPSBkZWxldGVkUm93c0VuZCAtIGRlbGV0ZWRSb3dzU3RhcnQ7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJTZWxlY3RpbmcgKiIpOwotICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJlc3VsdCA9IGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIiArIHRhYmxlKTsKLSAgICAgICAgYXNzZXJ0Um93Q291bnQocmVzdWx0LCByb3dzUGVyUGFydGl0aW9uICogKHBhcnRpdGlvbnMgLSBkZWxldGVkUGFydGl0aW9ucykgLSBkZWxldGVkUm93cyk7Ci0KLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotCi0gICAgICAgIGxvZ2dlci5pbmZvKCJTZWxlY3RpbmcgKiIpOwotICAgICAgICByZXN1bHQgPSBleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICIgKyB0YWJsZSk7Ci0gICAgICAgIGFzc2VydFJvd0NvdW50KHJlc3VsdCwgcm93c1BlclBhcnRpdGlvbiAqIChwYXJ0aXRpb25zIC0gZGVsZXRlZFBhcnRpdGlvbnMpIC0gZGVsZXRlZFJvd3MpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9NZW10YWJsZVNpemVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9NZW10YWJsZVNpemVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZmYwNTUuLjAwMDAwMDAKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvTWVtdGFibGVTaXplVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKLQotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuTWVtdGFibGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7Ci0KLUBSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgTWVtdGFibGVTaXplVGVzdCBleHRlbmRzIENRTFRlc3RlcgotewotICAgIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTWVtdGFibGVTaXplVGVzdC5jbGFzcyk7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IHBhcnRpdGlvbnMgPSA1MF8wMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCByb3dzUGVyUGFydGl0aW9uID0gNDsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgZGVsZXRlZFBhcnRpdGlvbnMgPSAxMF8wMDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBkZWxldGVkUm93cyA9IDVfMDAwOwotCi0gICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDApCi0gICAgcHVibGljIFN0cmluZyBtZW10YWJsZUNsYXNzOwotCi0gICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDEpCi0gICAgcHVibGljIGludCBkaWZmZXJlbmNlUGVyUGFydGl0aW9uOwotCi0gICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInswfSIpCi0gICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiBwYXJhbWV0ZXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKG5ldyBPYmplY3RbXXsic2tpcGxpc3QiLCA1MH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsic2tpcGxpc3Rfc2hhcmRlZCIsIDYwfSk7Ci0gICAgfQotCi0gICAgLy8gbXVzdCBiZSB3aXRoaW4gNTAgYnl0ZXMgcGVyIHBhcnRpdGlvbiBvZiB0aGUgYWN0dWFsIHNpemUKLSAgICBmaW5hbCBsb25nIE1BWF9ESUZGRVJFTkNFX1BBUlRJVElPTlMgPSAocGFydGl0aW9ucyArIGRlbGV0ZWRQYXJ0aXRpb25zICsgZGVsZXRlZFJvd3MpOwotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwKCkKLSAgICB7Ci0gICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7Ci0gICAgICAgIENRTFRlc3Rlci5wcmVwYXJlU2VydmVyKCk7Ci0gICAgICAgIENRTFRlc3Rlci5kaXNhYmxlUHJlcGFyZWRSZXVzZUZvclRlc3QoKTsKLSAgICAgICAgbG9nZ2VyLmluZm8oInNldHVwQ2xhc3MgZG9uZS4iKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTaXplKCkKLSAgICB7Ci0gICAgICAgIFV0aWwuZmxha3lUZXN0KHRoaXM6OnRlc3RTaXplRmxha3ksIDIsICJGYWlscyBvY2Nhc2lvbmFsbHksIHNlZSBDQVNTQU5EUkEtMTY2ODQiKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdFNpemVGbGFreSgpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleXNwYWNlID0gY3JlYXRlS2V5c3BhY2UoIkNSRUFURSBLRVlTUEFDRSAlcyB3aXRoIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3RvcicgOiAxIH0gYW5kIGR1cmFibGVfd3JpdGVzID0gZmFsc2UiKTsKLSAgICAgICAgICAgIFN0cmluZyB0YWJsZSA9IGNyZWF0ZVRhYmxlKGtleXNwYWNlLCAiQ1JFQVRFIFRBQkxFICVzICggdXNlcmlkIGJpZ2ludCwgcGljaWQgYmlnaW50LCBjb21tZW50aWQgYmlnaW50LCBQUklNQVJZIEtFWSh1c2VyaWQsIHBpY2lkKSkiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29tcHJlc3Npb24gPSB7J2VuYWJsZWQnOiBmYWxzZX0iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBtZW10YWJsZSA9ICciICsgbWVtdGFibGVDbGFzcyArICInIik7Ci0gICAgICAgICAgICBleGVjdXRlKCJ1c2UgIiArIGtleXNwYWNlICsgJzsnKTsKLQotICAgICAgICAgICAgU3RyaW5nIHdyaXRlU3RhdGVtZW50ID0gIklOU0VSVCBJTlRPICIgKyB0YWJsZSArICIodXNlcmlkLHBpY2lkLGNvbW1lbnRpZClWQUxVRVMoPyw/LD8pIjsKLQotICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3BlbihrZXlzcGFjZSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUodGFibGUpOwotICAgICAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotICAgICAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotCi0gICAgICAgICAgICBsb25nIGRlZXBTaXplQmVmb3JlID0gT2JqZWN0U2l6ZXMubWVhc3VyZURlZXAoY2ZzLmdldFRyYWNrZXIoKS5nZXRWaWV3KCkuZ2V0Q3VycmVudE1lbXRhYmxlKCkpOwotICAgICAgICAgICAgbG9nZ2VyLmluZm8oIk1lbXRhYmxlIGRlZXAgc2l6ZSBiZWZvcmUge31cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShkZWVwU2l6ZUJlZm9yZSkpOwotICAgICAgICAgICAgbG9uZyBpOwotICAgICAgICAgICAgbG9uZyBsaW1pdCA9IHBhcnRpdGlvbnM7Ci0gICAgICAgICAgICBsb2dnZXIuaW5mbygiV3JpdGluZyB7fSBwYXJ0aXRpb25zIG9mIHt9IHJvd3MiLCBwYXJ0aXRpb25zLCByb3dzUGVyUGFydGl0aW9uKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW1pdDsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAobG9uZyBqID0gMDsgaiA8IHJvd3NQZXJQYXJ0aXRpb247ICsraikKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSh3cml0ZVN0YXRlbWVudCwgaSwgaiwgaSArIGopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb2dnZXIuaW5mbygiRGVsZXRpbmcge30gcGFydGl0aW9ucyIsIGRlbGV0ZWRQYXJ0aXRpb25zKTsKLSAgICAgICAgICAgIGxpbWl0ICs9IGRlbGV0ZWRQYXJ0aXRpb25zOwotICAgICAgICAgICAgZm9yICg7IGkgPCBsaW1pdDsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG5vIHBhcnRpdGlvbiBleGlzdHMsIGJ1dCB3ZSB3aWxsIGNyZWF0ZSBhIHRvbWJzdG9uZQotICAgICAgICAgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICIgKyB0YWJsZSArICIgV0hFUkUgdXNlcmlkID0gPyIsIGkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb2dnZXIuaW5mbygiRGVsZXRpbmcge30gcm93cyIsIGRlbGV0ZWRSb3dzKTsKLSAgICAgICAgICAgIGxpbWl0ICs9IGRlbGV0ZWRSb3dzOwotICAgICAgICAgICAgZm9yICg7IGkgPCBsaW1pdDsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG5vIHJvdyBleGlzdHMsIGJ1dCB3ZSB3aWxsIGNyZWF0ZSBhIHRvbWJzdG9uZSAoYW5kIHBhcnRpdGlvbikKLSAgICAgICAgICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAiICsgdGFibGUgKyAiIFdIRVJFIHVzZXJpZCA9ID8gQU5EIHBpY2lkID0gPyIsIGksIDBMKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJXYXJuaW5nOiAiICsgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSArICIgc3N0YWJsZXMgY3JlYXRlZC4iKTsKLQotICAgICAgICAgICAgTWVtdGFibGUgbWVtdGFibGUgPSBjZnMuZ2V0VHJhY2tlcigpLmdldFZpZXcoKS5nZXRDdXJyZW50TWVtdGFibGUoKTsKLSAgICAgICAgICAgIE1lbXRhYmxlLk1lbW9yeVVzYWdlIHVzYWdlID0gTWVtdGFibGUuZ2V0TWVtb3J5VXNhZ2UobWVtdGFibGUpOwotICAgICAgICAgICAgbG9uZyBhY3R1YWxIZWFwID0gdXNhZ2Uub3duc09uSGVhcDsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJNZW10YWJsZSBpbiB7fSBtb2RlOiB7fSBvcHMsIHt9IHNlcmlhbGl6ZWQgYnl0ZXMsIHt9XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1lbXRhYmxlQWxsb2NhdGlvblR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXRhYmxlLm9wZXJhdGlvbkNvdW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShtZW10YWJsZS5nZXRMaXZlRGF0YVNpemUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSk7Ci0KLSAgICAgICAgICAgIGxvbmcgZGVlcFNpemVBZnRlciA9IE9iamVjdFNpemVzLm1lYXN1cmVEZWVwKG1lbXRhYmxlKTsKLSAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJNZW10YWJsZSBkZWVwIHNpemUge31cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShkZWVwU2l6ZUFmdGVyKSk7Ci0KLSAgICAgICAgICAgIGxvbmcgZXhwZWN0ZWRIZWFwID0gZGVlcFNpemVBZnRlciAtIGRlZXBTaXplQmVmb3JlOwotICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCBoZWFwIHVzYWdlIGNsb3NlIHRvICVzLCBnb3QgJXMuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGV4cGVjdGVkSGVhcCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoYWN0dWFsSGVhcCkpOwotICAgICAgICAgICAgbG9nZ2VyLmluZm8obWVzc2FnZSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLCBNYXRoLmFicyhhY3R1YWxIZWFwIC0gZXhwZWN0ZWRIZWFwKSA8PSBNQVhfRElGRkVSRU5DRV9QQVJUSVRJT05TICogZGlmZmVyZW5jZVBlclBhcnRpdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0aHJvd2FibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRocm93YWJsZXMucHJvcGFnYXRlKHRocm93YWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvUGFnaW5nVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvUGFnaW5nVGVzdC5qYXZhCmluZGV4IGEzMzg3YzQuLjc1ZDczZTUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1BhZ2luZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9QYWdpbmdUZXN0LmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0NPTkZJRzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKQEAgLTU3LDcgKzU4LDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25maWciLCAiY2Fzc2FuZHJhLW11cm11ci55YW1sIik7CisgICAgICAgIENBU1NBTkRSQV9DT05GSUcuc2V0U3RyaW5nKCJjYXNzYW5kcmEtbXVybXVyLnlhbWwiKTsKIAogICAgICAgICBjYXNzYW5kcmEgPSBTZXJ2ZXJUZXN0VXRpbHMuc3RhcnRFbWJlZGRlZENhc3NhbmRyYVNlcnZpY2UoKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvUXVlcnlXaXRoSW5kZXhlZFNTVGFibGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9RdWVyeVdpdGhJbmRleGVkU1NUYWJsZVRlc3QuamF2YQppbmRleCAwMWEyYWZkLi42MzU2MmI3IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9RdWVyeVdpdGhJbmRleGVkU1NUYWJsZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9RdWVyeVdpdGhJbmRleGVkU1NUYWJsZVRlc3QuamF2YQpAQCAtMTcsMTMgKzE3LDE0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMzsKIAotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Gb3J3YXJkaW5nU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogCkBAIC01OSw3ICs2MCwyMSBAQAogICAgICAgICBib29sZWFuIGhhc0luZGV4ZWQgPSBmYWxzZTsKICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRMaXZlU1NUYWJsZXMoKSkKICAgICAgICAgewotICAgICAgICAgICAgUm93SW5kZXhFbnRyeSBpbmRleEVudHJ5ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihkaywgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgICAgICBjbGFzcyBJbmRleEVudHJ5QWNjZXNzb3IgZXh0ZW5kcyBGb3J3YXJkaW5nU1NUYWJsZVJlYWRlcgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB1YmxpYyBJbmRleEVudHJ5QWNjZXNzb3IoU1NUYWJsZVJlYWRlciBkZWxlZ2F0ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyKGRlbGVnYXRlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGdldFJvd0luZGV4RW50cnkoUGFydGl0aW9uUG9zaXRpb24ga2V5LCBPcGVyYXRvciBvcCwgYm9vbGVhbiB1cGRhdGVDYWNoZUFuZFN0YXRzLCBTU1RhYmxlUmVhZHNMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRSb3dJbmRleEVudHJ5KGtleSwgb3AsIHVwZGF0ZUNhY2hlQW5kU3RhdHMsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEluZGV4RW50cnlBY2Nlc3NvciBhY2Nlc3NvciA9IG5ldyBJbmRleEVudHJ5QWNjZXNzb3Ioc3N0YWJsZSk7CisgICAgICAgICAgICBBYnN0cmFjdFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSA9IGFjY2Vzc29yLmdldFJvd0luZGV4RW50cnkoZGssIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEsIGZhbHNlLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5OT09QX0xJU1RFTkVSKTsKICAgICAgICAgICAgIGhhc0luZGV4ZWQgfD0gaW5kZXhFbnRyeSAhPSBudWxsICYmIGluZGV4RW50cnkuaXNJbmRleGVkKCk7CiAgICAgICAgIH0KICAgICAgICAgYXNzZXJ0IGhhc0luZGV4ZWQ7CkBAIC03MCwxNSArODUsNCBAQAogICAgICAgICBhc3NlcnRSb3dDb3VudChleGVjdXRlKCJTRUxFQ1QgRElTVElOQ1QgcyBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIDEpOwogICAgICAgICBhc3NlcnRSb3dDb3VudChleGVjdXRlKCJTRUxFQ1QgRElTVElOQ1QgcyBGUk9NICVzIFdIRVJFIGsgPSA/IE9SREVSIEJZIHQgREVTQyIsIDApLCAxKTsKICAgICB9Ci0KLSAgICAvLyBDcmVhdGVzIGEgcmFuZG9tIHN0cmluZyAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlUmFuZG9tU3QoaW50IGxlbmd0aCkKLSAgICB7Ci0gICAgICAgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0gICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzI2XTsKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBmb3IgKGNoYXIgYyA9ICdhJzsgYyA8PSAneic7IGMrKykKLSAgICAgICAgICAgIGNoYXJzW2krK10gPSBjOwotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaGFycyk7Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVG9tYnN0b25lc1dpdGhJbmRleGVkU1NUYWJsZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1RvbWJzdG9uZXNXaXRoSW5kZXhlZFNTVGFibGVUZXN0LmphdmEKaW5kZXggZjlhYzhkMS4uMWQ4ODhmZiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVG9tYnN0b25lc1dpdGhJbmRleGVkU1NUYWJsZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9Ub21ic3RvbmVzV2l0aEluZGV4ZWRTU1RhYmxlVGVzdC5qYXZhCkBAIC0xOSwxMyArMTksMTggQEAKIAogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdQcmVmaXg7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5Sb3dJbmRleEVudHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5CdGlGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKIHB1YmxpYyBjbGFzcyBUb21ic3RvbmVzV2l0aEluZGV4ZWRTU1RhYmxlVGVzdCBleHRlbmRzIENRTFRlc3RlcgpAQCAtNDQsNiArNDksNyBAQAogCiAgICAgcHVibGljIHZvaWQgdGVzdFRvbWJzdG9uZUJvdW5kYXJpZXNJbkluZGV4KFN0cmluZyBjYWNoZUtleXMpIHRocm93cyBUaHJvd2FibGUKICAgICB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKCJUaGlzIHRlc3QgcmVxdWlyZXMgdGhhdCB0aGUgZGVmYXVsdCBTU1RhYmxlIGZvcm1hdCBpcyBCSUciLCBCaWdGb3JtYXQuaXNTZWxlY3RlZCgpKTsKICAgICAgICAgLy8gVGhhdCB0ZXN0IHJlcHJvZHVjZXMgdGhlIGJ1ZyBmcm9tIENBU1NBTkRSQS0xMTE1OCB3aGVyZSBhIHJhbmdlIHRvbWJzdG9uZSBib3VuZGFyeSBpbiB0aGUgY29sdW1uIGluZGV4IHdvdWxkCiAgICAgICAgIC8vIGNhdXNlIGFuIGFzc2VydGlvbiBmYWlsdXJlLgogCkBAIC03NCwxOSArODAsMTYgQEAKICAgICAgICAgICAgIGludCBpbmRleGVkUm93ID0gLTE7CiAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldExpdmVTU1RhYmxlcygpKQogICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJpZ1RhYmxlUmVhZGVyIHJlYWRlciA9IChCaWdUYWJsZVJlYWRlcikgc3N0YWJsZTsKICAgICAgICAgICAgICAgICAvLyBUaGUgbGluZSBiZWxvdyBmYWlsZWQgd2l0aCBrZXkgY2FjaGluZyBvZmYgKENBU1NBTkRSQS0xMTE1OCkKLSAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5IGluZGV4RW50cnkgPSBzc3RhYmxlLmdldFBvc2l0aW9uKGRrLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKKyAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5IGluZGV4RW50cnkgPSByZWFkZXIuZ2V0Um93SW5kZXhFbnRyeShkaywgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CiAgICAgICAgICAgICAgICAgaWYgKGluZGV4RW50cnkgIT0gbnVsbCAmJiBpbmRleEVudHJ5LmlzSW5kZXhlZCgpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IChGaWxlRGF0YUlucHV0IHJlYWRlciA9IHNzdGFibGUub3BlbkluZGV4UmVhZGVyKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkuSW5kZXhJbmZvUmV0cmlldmVyIGluZm9SZXRyaWV2ZXIgPSBpbmRleEVudHJ5Lm9wZW5XaXRoSW5kZXgoc3N0YWJsZS5nZXRJbmRleEZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGZpcnN0TmFtZSA9IGluZm9SZXRyaWV2ZXIuY29sdW1uc0luZGV4KDEpLmZpcnN0TmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdE5hbWUua2luZCgpLmlzQm91bmRhcnkoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBkZWxldGlvbkxvb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVkUm93ID0gSW50MzJUeXBlLmluc3RhbmNlLmNvbXBvc2UoZmlyc3ROYW1lLmJ1ZmZlckF0KDApKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5LkluZGV4SW5mb1JldHJpZXZlciBpbmZvUmV0cmlldmVyID0gaW5kZXhFbnRyeS5vcGVuV2l0aEluZGV4KHJlYWRlci5nZXRJbmRleEZpbGUoKSk7CisgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gZmlyc3ROYW1lID0gaW5mb1JldHJpZXZlci5jb2x1bW5zSW5kZXgoMSkuZmlyc3ROYW1lOworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3ROYW1lLmtpbmQoKS5pc0JvdW5kYXJ5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBkZWxldGlvbkxvb3A7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ZWRSb3cgPSBJbnQzMlR5cGUuaW5zdGFuY2UuY29tcG9zZShmaXJzdE5hbWUuYnVmZmVyQXQoMCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFzc2VydCBpbmRleGVkUm93ID49IDA7CkBAIC0xMDgsNiArMTExLDc4IEBACiAgICAgICAgIGFzc2VydFJvd0NvdW50KGV4ZWN1dGUoIlNFTEVDVCBESVNUSU5DVCBzIEZST00gJXMgV0hFUkUgayA9ID8gT1JERVIgQlkgdCBERVNDIiwgMCksIDEpOwogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjdGl2ZVRvbWJzdG9uZUluSW5kZXhDYWNoZWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBBc3N1bWUuYXNzdW1lRmFsc2UoIkJUSSBmb3JtYXQgZG9lcyBub3QgdXNlIGtleSBjYWNoZSIsIEJ0aUZvcm1hdC5pc1NlbGVjdGVkKCkpOworICAgICAgICB0ZXN0QWN0aXZlVG9tYnN0b25lSW5JbmRleCgiQUxMIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZlVG9tYnN0b25lSW5JbmRleE5vdENhY2hlZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRlc3RBY3RpdmVUb21ic3RvbmVJbkluZGV4KCJOT05FIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEFjdGl2ZVRvbWJzdG9uZUluSW5kZXgoU3RyaW5nIGNhY2hlS2V5cykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgaW50IFJPV1MgPSAxMDAwOworICAgICAgICBpbnQgVkFMVUVfTEVOR1RIID0gMTAwOworCisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50LCB0IGludCwgdjEgdGV4dCwgdjIgdGV4dCwgdjMgdGV4dCwgdjQgdGV4dCwgUFJJTUFSWSBLRVkgKGssIHQpKSBXSVRIIGNhY2hpbmcgPSB7ICdrZXlzJyA6ICciICsgY2FjaGVLZXlzICsgIicgfSIpOworICAgICAgICBTdHJpbmcgdGV4dCA9IG1ha2VSYW5kb21TdHJpbmcoVkFMVUVfTEVOR1RIKTsKKworICAgICAgICAvLyBXcml0ZSBhIGxhcmdlLWVub3VnaCBwYXJ0aXRpb24gdG8gYmUgaW5kZXhlZC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBST1dTOyBpKyspCisgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyhrLCB0LCB2MSkgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMSIsIDAsIGksIHRleHQpOworICAgICAgICAvLyBBZGQgdjIgdGhhdCBzaG91bGQgc3Vydml2ZSBwYXJ0IG9mIHRoZSBkZWxldGlvbiB3ZSBsYXRlciBpbnNlcnQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBST1dTOyBpKyspCisgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyhrLCB0LCB2MikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMyIsIDAsIGksIHRleHQpOworICAgICAgICBmbHVzaCgpOworCisgICAgICAgIC8vIE5vdyBkZWxldGUgcGFydHMgb2YgdGhpcyBwYXJ0aXRpb24sIGJ1dCBhZGQgZW5vdWdoIG5ldyBkYXRhIHRvIG1ha2Ugc3VyZSB0aGUgZGVsZXRpb24gc3BhbnMgaW5kZXggYmxvY2tzCisgICAgICAgIGludCBtaW5EZWxldGVkMSA9IFJPV1MvMTA7CisgICAgICAgIGludCBtYXhEZWxldGVkMSA9IDUgKiBST1dTLzEwOworICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBVU0lORyBUSU1FU1RBTVAgMiBXSEVSRSBrID0gMCBBTkQgdCA+PSA/IEFORCB0IDwgPyIsIG1pbkRlbGV0ZWQxLCBtYXhEZWxldGVkMSk7CisKKyAgICAgICAgLy8gRGVsZXRlIGFnYWluIHRvIG1ha2UgYSBib3VuZGFyeQorICAgICAgICBpbnQgbWluRGVsZXRlZDIgPSA0ICogUk9XUy8xMDsKKyAgICAgICAgaW50IG1heERlbGV0ZWQyID0gOSAqIFJPV1MvMTA7CisgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFVTSU5HIFRJTUVTVEFNUCA0IFdIRVJFIGsgPSAwIEFORCB0ID49ID8gQU5EIHQgPCA/IiwgbWluRGVsZXRlZDIsIG1heERlbGV0ZWQyKTsKKworICAgICAgICAvLyBBZGQgdjMgc3Vydml2aW5nIHRoYXQgZGVsZXRpb24gdG9vIGFuZCBhbHNvIGVuc3VyaW5nIHRoZSB0d28gZGVsZXRpb25zIHNwYW4gaW5kZXggYmxvY2tzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUk9XUzsgaSsrKQorICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMoaywgdCwgdjMpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDUiLCAwLCBpLCB0ZXh0KTsKKyAgICAgICAgZmx1c2goKTsKKworICAgICAgICAvLyB0ZXN0IGRlbGV0aW9ucyB3b3JrZWQKKyAgICAgICAgdmVyaWZ5RXhwZWN0ZWRBY3RpdmVUb21ic3RvbmVSb3dzKFJPV1MsIHRleHQsIG1pbkRlbGV0ZWQxLCBtaW5EZWxldGVkMiwgbWF4RGVsZXRlZDIpOworCisgICAgICAgIC8vIFRlc3QgYWdhaW4gY29tcGFjdGVkLiBUaGlzIGlzIG11Y2ggZWFzaWVyIHRvIHBhc3MgYW5kIGRvZXNuJ3QgYWN0dWFsbHkgdGVzdCBhY3RpdmUgdG9tYnN0b25lcyBpbiBpbmRleAorICAgICAgICBjb21wYWN0KCk7CisgICAgICAgIHZlcmlmeUV4cGVjdGVkQWN0aXZlVG9tYnN0b25lUm93cyhST1dTLCB0ZXh0LCBtaW5EZWxldGVkMSwgbWluRGVsZXRlZDIsIG1heERlbGV0ZWQyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RXhwZWN0ZWRBY3RpdmVUb21ic3RvbmVSb3dzKGludCBST1dTLCBTdHJpbmcgdGV4dCwgaW50IG1pbkRlbGV0ZWQxLCBpbnQgbWluRGVsZXRlZDIsIGludCBtYXhEZWxldGVkMikgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0Um93Q291bnQoZXhlY3V0ZSgiU0VMRUNUIHQgRlJPTSAlcyBXSEVSRSBrID0gPyBBTkQgdjEgPSA/IEFMTE9XIEZJTFRFUklORyIsIDAsIHRleHQpLCBST1dTIC0gKG1heERlbGV0ZWQyIC0gbWluRGVsZXRlZDEpKTsKKyAgICAgICAgYXNzZXJ0Um93Q291bnQoZXhlY3V0ZSgiU0VMRUNUIHQgRlJPTSAlcyBXSEVSRSBrID0gPyBBTkQgdjEgPSA/IE9SREVSIEJZIHQgREVTQyBBTExPVyBGSUxURVJJTkciLCAwLCB0ZXh0KSwgUk9XUyAtIChtYXhEZWxldGVkMiAtIG1pbkRlbGV0ZWQxKSk7CisgICAgICAgIGFzc2VydFJvd0NvdW50KGV4ZWN1dGUoIlNFTEVDVCB0IEZST00gJXMgV0hFUkUgayA9ID8gQU5EIHYyID0gPyBBTExPVyBGSUxURVJJTkciLCAwLCB0ZXh0KSwgUk9XUyAtIChtYXhEZWxldGVkMiAtIG1pbkRlbGV0ZWQyKSk7CisgICAgICAgIGFzc2VydFJvd0NvdW50KGV4ZWN1dGUoIlNFTEVDVCB0IEZST00gJXMgV0hFUkUgayA9ID8gQU5EIHYyID0gPyBPUkRFUiBCWSB0IERFU0MgQUxMT1cgRklMVEVSSU5HIiwgMCwgdGV4dCksIFJPV1MgLSAobWF4RGVsZXRlZDIgLSBtaW5EZWxldGVkMikpOworICAgICAgICBhc3NlcnRSb3dDb3VudChleGVjdXRlKCJTRUxFQ1QgdCBGUk9NICVzIFdIRVJFIGsgPSA/IEFORCB2MyA9ID8gQUxMT1cgRklMVEVSSU5HIiwgMCwgdGV4dCksIFJPV1MpOworICAgICAgICBhc3NlcnRSb3dDb3VudChleGVjdXRlKCJTRUxFQ1QgdCBGUk9NICVzIFdIRVJFIGsgPSA/IEFORCB2MyA9ID8gT1JERVIgQlkgdCBERVNDIEFMTE9XIEZJTFRFUklORyIsIDAsIHRleHQpLCBST1dTKTsKKyAgICAgICAgLy8gdGVzdCBpbmRleCB5aWVsZHMgdGhlIGNvcnJlY3QgYWN0aXZlIGRlbGV0aW9ucworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFJPV1M7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHYxRXhwZWN0ZWQgPSBpIDwgbWluRGVsZXRlZDEgfHwgaSA+PSBtYXhEZWxldGVkMiA/IHRleHQgOiBudWxsOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHYyRXhwZWN0ZWQgPSBpIDwgbWluRGVsZXRlZDIgfHwgaSA+PSBtYXhEZWxldGVkMiA/IHRleHQgOiBudWxsOworICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgdjEsdjIsdjMgRlJPTSAlcyBXSEVSRSBrID0gPyBBTkQgdCA+PSA/IExJTUlUIDEiLCAwLCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcm93KHYxRXhwZWN0ZWQsIHYyRXhwZWN0ZWQsIHRleHQpKTsKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHYxLHYyLHYzIEZST00gJXMgV0hFUkUgayA9ID8gQU5EIHQgPD0gPyBPUkRFUiBCWSB0IERFU0MgTElNSVQgMSIsIDAsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICByb3codjFFeHBlY3RlZCwgdjJFeHBlY3RlZCwgdGV4dCkpOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVJhbmRvbVN0cmluZyhpbnQgbGVuZ3RoKQogICAgIHsKICAgICAgICAgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1ZpZXdGaWx0ZXJpbmcxVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld0ZpbHRlcmluZzFUZXN0LmphdmEKaW5kZXggNDdkNWI4ZS4uOTNiMDkyNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld0ZpbHRlcmluZzFUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld0ZpbHRlcmluZzFUZXN0LmphdmEKQEAgLTMxLDYgKzMxLDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTVZfQUxMT1dfRklMVEVSSU5HX05PTktFWV9DT0xVTU5TX1VOU0FGRTsKKwogLyogVmlld0ZpbHRlcmluZ1Rlc3QgY2xhc3MgaGFzIGJlZW4gc3BsaXQgaW50byBtdWx0aXBsZSBvbmVzIGJlY2F1c2Ugb2YgdGltZW91dCBpc3N1ZXMgKENBU1NBTkRSQS0xNjY3MCwgQ0FTU0FORFJBLTE3MTY3KQogICogQW55IGNoYW5nZXMgaGVyZSBjaGVjayBpZiB0aGV5IGFwcGx5IHRvIHRoZSBvdGhlciBjbGFzc2VzCiAgKiAtIFZpZXdGaWx0ZXJpbmdQS1Rlc3QKQEAgLTQ2LDEzICs0OCwxMyBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydHVwKCkKICAgICB7CiAgICAgICAgIFZpZXdBYnN0cmFjdFBhcmFtZXRlcml6ZWRUZXN0LnN0YXJ0dXAoKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEubXYuYWxsb3dfZmlsdGVyaW5nX25vbmtleV9jb2x1bW5zX3Vuc2FmZSIsICJ0cnVlIik7CisgICAgICAgIE1WX0FMTE9XX0ZJTFRFUklOR19OT05LRVlfQ09MVU1OU19VTlNBRkUuc2V0Qm9vbGVhbih0cnVlKTsKICAgICB9CiAKICAgICBAQWZ0ZXJDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bigpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5tdi5hbGxvd19maWx0ZXJpbmdfbm9ua2V5X2NvbHVtbnNfdW5zYWZlIiwgImZhbHNlIik7CisgICAgICAgIE1WX0FMTE9XX0ZJTFRFUklOR19OT05LRVlfQ09MVU1OU19VTlNBRkUuc2V0Qm9vbGVhbihmYWxzZSk7CiAgICAgfQogCiAgICAgLy8gVE9ETyB3aWxsIHJldmlzZSB0aGUgbm9uLXBrIGZpbHRlciBjb25kaXRpb24gaW4gTVYsIHNlZSBDQVNTQU5EUkEtMTE1MDAKQEAgLTM2Myw3ICszNjUsNyBAQAogICAgICAgICAiQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXICVzIEFTIFNFTEVDVCAqIEZST00gJXMgV0hFUkUgYSBJUyBOT1QgTlVMTCBBTkQgYiBJUyBOT1QgTlVMTCBBTkQgZCBpcyBOT1QgTlVMTCBQUklNQVJZIEtFWSAoKGEsIGIpLCBjLCBkKSIsCiAgICAgICAgICJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMgQVMgU0VMRUNUICogRlJPTSAlcyBXSEVSRSBhIElTIE5PVCBOVUxMIEFORCBiIElTIE5PVCBOVUxMIEFORCBjIGlzIE5PVCBOVUxMIFBSSU1BUlkgS0VZICgoYSwgYiksIGMsIGQpIiwKICAgICAgICAgIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGEgPSA/IEFORCBiIElTIE5PVCBOVUxMIEFORCBjIGlzIE5PVCBOVUxMIFBSSU1BUlkgS0VZICgoYSwgYiksIGMsIGQpIiwKLSAgICAgICAgIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGEgPSBibG9iQXNJbnQoPykgQU5EIGIgSVMgTk9UIE5VTEwgQU5EIGMgaXMgTk9UIE5VTEwgUFJJTUFSWSBLRVkgKChhLCBiKSwgYywgZCkiLAorICAgICAgICAiQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXICVzIEFTIFNFTEVDVCAqIEZST00gJXMgV0hFUkUgYSA9IGJsb2JfYXNfaW50KD8pIEFORCBiIElTIE5PVCBOVUxMIEFORCBjIGlzIE5PVCBOVUxMIFBSSU1BUlkgS0VZICgoYSwgYiksIGMsIGQpIiwKICAgICAgICAgIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFBSSU1BUlkgS0VZIChhLCBiLCBjLCBkKSIKICAgICAgICAgKTsKIApAQCAtMzkxLDcgKzM5Myw3IEBACiAgICAgICAgICJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMgQVMgU0VMRUNUICogRlJPTSAlcyBXSEVSRSBhID0gMSBBTkQgYiA9IDEgQU5EIChjLCBkKSA+ICgxLCAxKSBQUklNQVJZIEtFWSAoKGEsIGIpLCBjLCBkKSIsCiAgICAgICAgICJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMgQVMgU0VMRUNUICogRlJPTSAlcyBXSEVSRSBhID0gMSBBTkQgYiA9IDEgQU5EIChjLCBkKSBJTiAoKDEsIDEpLCAoMiwgMikpIFBSSU1BUlkgS0VZICgoYSwgYiksIGMsIGQpIiwKICAgICAgICAgIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGEgPSAoaW50KSAxIEFORCBiID0gMSBBTkQgYyA9IDEgQU5EIGQgPSAxIFBSSU1BUlkgS0VZICgoYSwgYiksIGMsIGQpIiwKLSAgICAgICAgIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGEgPSBibG9iQXNJbnQoaW50QXNCbG9iKDEpKSBBTkQgYiA9IDEgQU5EIGMgPSAxIEFORCBkID0gMSBQUklNQVJZIEtFWSAoKGEsIGIpLCBjLCBkKSIKKyAgICAgICAgIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGEgPSBibG9iX2FzX2ludChpbnRfYXNfYmxvYigxKSkgQU5EIGIgPSAxIEFORCBjID0gMSBBTkQgZCA9IDEgUFJJTUFSWSBLRVkgKChhLCBiKSwgYywgZCkiCiAgICAgICAgICk7CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnb29kU3RhdGVtZW50cy5zaXplKCk7IGkrKykKQEAgLTQ2Miw3ICs0NjQsNyBAQAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYykgVkFMVUVTICg/LCA/LCA/KSIsIDEsIDEsIDMpOwogCiAgICAgICAgIGNyZWF0ZVZpZXcoIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzICIgKwotICAgICAgICAgICAgICAgICAgICJXSEVSRSBhID0gYmxvYkFzSW50KGludEFzQmxvYigxKSkgQU5EIGIgSVMgTk9UIE5VTEwgIiArCisgICAgICAgICAgICAgICAgICAgIldIRVJFIGEgPSBibG9iX2FzX2ludChpbnRfYXNfYmxvYigxKSkgQU5EIGIgSVMgTk9UIE5VTEwgIiArCiAgICAgICAgICAgICAgICAgICAgIlBSSU1BUlkgS0VZIChhLCBiKSIpOwogCiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZVZpZXcoIlNFTEVDVCBhLCBiLCBjIEZST00gJXMiKSwKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1ZpZXdQS1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1ZpZXdQS1Rlc3QuamF2YQppbmRleCA2YWIyN2VmLi4xYzJiOWE2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9WaWV3UEtUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld1BLVGVzdC5qYXZhCkBAIC0yNTMsOCArMjUzLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCwgYmlnaW50dmFsKSBWQUxVRVMgKD8sID8sIGZyb21Kc29uKD8pKSIsIDAsICJhc2NpaSB0ZXh0IiwgIjEyMzEyMzEyMzEyMyIpOwotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiYXNjaWkgdGV4dFwiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCwgYmlnaW50dmFsKSBWQUxVRVMgKD8sID8sIGZyb21fanNvbig/KSkiLCAwLCAiYXNjaWkgdGV4dCIsICIxMjMxMjMxMjMxMjMiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGFzY2lpdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJhc2NpaSB0ZXh0XCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmlnaW50dmFsIEZST00gJXMgV0hFUkUgayA9ID8gYW5kIGFzY2lpdmFsID0gPyIsIDAsICJhc2NpaSB0ZXh0IiksIHJvdygxMjMxMjMxMjMxMjNMKSk7CiAKICAgICAgICAgLy9DaGVjayB0aGUgTVYKQEAgLTI2NSw3ICsyNjUsNyBAQAogCiAKICAgICAgICAgLy9VUERBVEUgQkFTRQotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwsIGJpZ2ludHZhbCkgVkFMVUVTICg/LCA/LCBmcm9tSnNvbig/KSkiLCAwLCAiYXNjaWkgdGV4dCIsICIxIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCwgYmlnaW50dmFsKSBWQUxVRVMgKD8sID8sIGZyb21fanNvbig/KSkiLCAwLCAiYXNjaWkgdGV4dCIsICIxIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJpZ2ludHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IGFuZCBhc2NpaXZhbCA9ID8iLCAwLCAiYXNjaWkgdGV4dCIpLCByb3coMUwpKTsKIAogICAgICAgICAvL0NoZWNrIHRoZSBNVgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld1NjaGVtYVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1ZpZXdTY2hlbWFUZXN0LmphdmEKaW5kZXggMDlkN2UxNS4uYjU4Nzc3ZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld1NjaGVtYVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9WaWV3U2NoZW1hVGVzdC5qYXZhCkBAIC0yNTQsMzEzICsyNTQsMzEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBmcm9tSnNvbigpIGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgcmVjZWl2ZXIgdHlwZSBpcyBrbm93bgotICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiZnJvbUpzb24oKSBjYW5ub3QgYmUgdXNlZCBpbiB0aGUgc2VsZWN0aW9uIGNsYXVzZSIsICJTRUxFQ1QgZnJvbUpzb24oYXNjaWl2YWwpIEZST00gJXMiLCAwLCAwKTsKKyAgICAgICAgLy8gZnJvbV9qc29uKCkgY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSByZWNlaXZlciB0eXBlIGlzIGtub3duCisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJmcm9tX2pzb24oKSBjYW5ub3QgYmUgdXNlZCBpbiB0aGUgc2VsZWN0aW9uIGNsYXVzZSIsICJTRUxFQ1QgZnJvbV9qc29uKGFzY2lpdmFsKSBGUk9NICVzIiwgMCwgMCk7CiAKICAgICAgICAgU3RyaW5nIGZ1bmMxID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0UsICJpbnQiLCAiQ1JFQVRFIEZVTkNUSU9OICVzIChhIGludCkgQ0FMTEVEIE9OIE5VTEwgSU5QVVQgUkVUVVJOUyB0ZXh0IExBTkdVQUdFIGphdmEgQVMgJCQgcmV0dXJuIGEudG9TdHJpbmcoKTsgJCQiKTsKICAgICAgICAgY3JlYXRlRnVuY3Rpb25PdmVybG9hZChmdW5jMSwgImludCIsICJDUkVBVEUgRlVOQ1RJT04gJXMgKGEgdGV4dCkgQ0FMTEVEIE9OIE5VTEwgSU5QVVQgUkVUVVJOUyB0ZXh0IExBTkdVQUdFIGphdmEgQVMgJCQgcmV0dXJuIG5ldyBTdHJpbmcoYSk7ICQkIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBhc2NpaSA9PT09PT09PT09PT09PT09Ci0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJhc2NpaSB0ZXh0XCIiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGFzY2lpdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJhc2NpaSB0ZXh0XCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGFzY2lpdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcImFzY2lpIFxcXCIgdGV4dFwiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiYXNjaWkgXFxcIiB0ZXh0XCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgImFzY2lpIFwiIHRleHQiKSk7CiAKLSAgICAgICAgLy8gdGVzdCB0aGF0IHdlIGNhbiB1c2UgZnJvbUpzb24oKSBpbiBvdGhlciB2YWxpZCBwbGFjZXMgaW4gcXVlcmllcwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBhc2NpaXZhbCBGUk9NICVzIFdIRVJFIGsgPSBmcm9tSnNvbig/KSIsICIwIiksIHJvdygiYXNjaWkgXCIgdGV4dCIpKTsKKyAgICAgICAgLy8gdGVzdCB0aGF0IHdlIGNhbiB1c2UgZnJvbV9qc29uKCkgaW4gb3RoZXIgdmFsaWQgcGxhY2VzIGluIHF1ZXJpZXMKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYXNjaWl2YWwgRlJPTSAlcyBXSEVSRSBrID0gZnJvbV9qc29uKD8pIiwgIjAiKSwgcm93KCJhc2NpaSBcIiB0ZXh0IikpOwogCiAgICAgICAgIC8vQ2hlY2sgdGhlIE1WCiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHVkdHZhbCBmcm9tIG12X2FzY2lpdmFsIFdIRVJFIGFzY2lpdmFsID0gPyIsICJhc2NpaSB0ZXh0IikpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB1ZHR2YWwgZnJvbSBtdl9hc2NpaXZhbCBXSEVSRSBhc2NpaXZhbCA9ID8iLCAiYXNjaWkgXCIgdGV4dCIpLCByb3coMCwgbnVsbCkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgYXNjaWl2YWwgPSBmcm9tSnNvbig/KSBXSEVSRSBrID0gZnJvbUpzb24oPykiLCAiXCJhc2NpaSBcXFwiIHRleHRcIiIsICIwIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgYXNjaWl2YWwgPSBmcm9tX2pzb24oPykgV0hFUkUgayA9IGZyb21fanNvbig/KSIsICJcImFzY2lpIFxcXCIgdGV4dFwiIiwgIjAiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdWR0dmFsIGZyb20gbXZfYXNjaWl2YWwgV0hFUkUgYXNjaWl2YWwgPSA/IiwgImFzY2lpIFwiIHRleHQiKSwgcm93KDAsIG51bGwpKTsKIAotICAgICAgICB1cGRhdGVWaWV3KCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gZnJvbUpzb24oPykiLCAiMCIpOworICAgICAgICB1cGRhdGVWaWV3KCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gZnJvbV9qc29uKD8pIiwgIjAiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdWR0dmFsIGZyb20gbXZfYXNjaWl2YWwgV0hFUkUgYXNjaWl2YWwgPSA/IiwgImFzY2lpIFwiIHRleHQiKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGFzY2lpdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcImFzY2lpIHRleHRcIiIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcImFzY2lpIHRleHRcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB1ZHR2YWwgZnJvbSBtdl9hc2NpaXZhbCBXSEVSRSBhc2NpaXZhbCA9ID8iLCAiYXNjaWkgdGV4dCIpLCByb3coMCwgbnVsbCkpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gYmlnaW50ID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGJpZ2ludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzMTIzMTIzIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBiaWdpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMxMjMxMjMxMjMiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYmlnaW50dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIDEyMzEyMzEyMzEyM0wpKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl9iaWdpbnR2YWwgV0hFUkUgYmlnaW50dmFsID0gPyIsIDEyMzEyMzEyMzEyM0wpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBibG9iID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGJsb2J2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMHgwMDAwMDAwMVwiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIweDAwMDAwMDAxXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYmxvYnZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygxKSkpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2Jsb2J2YWwgV0hFUkUgYmxvYnZhbCA9ID8iLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygxKSksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGJvb2xlYW4gPT09PT09PT09PT09PT09PQotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgYm9vbGVhbnZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAidHJ1ZSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgYm9vbGVhbnZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgInRydWUiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYm9vbGVhbnZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCB0cnVlKSk7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfYm9vbGVhbnZhbCBXSEVSRSBib29sZWFudmFsID0gPyIsIHRydWUpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGJvb2xlYW52YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgImZhbHNlIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBib29sZWFudmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiZmFsc2UiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYm9vbGVhbnZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBmYWxzZSkpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2Jvb2xlYW52YWwgV0hFUkUgYm9vbGVhbnZhbCA9ID8iLCB0cnVlKSk7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfYm9vbGVhbnZhbCBXSEVSRSBib29sZWFudmFsID0gPyIsIGZhbHNlKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gZGF0ZSA9PT09PT09PT09PT09PT09Ci0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBkYXRldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjE5ODctMDMtMjNcIiIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZGF0ZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMTk4Ny0wMy0yM1wiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGRhdGV2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgU2ltcGxlRGF0ZVNlcmlhbGl6ZXIuZGF0ZVN0cmluZ1RvRGF5cygiMTk4Ny0wMy0yMyIpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZGF0ZXZhbCBXSEVSRSBkYXRldmFsID0gZnJvbUpzb24oPykiLCAiXCIxOTg3LTAzLTIzXCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2RhdGV2YWwgV0hFUkUgZGF0ZXZhbCA9IGZyb21fanNvbig/KSIsICJcIjE5ODctMDMtMjNcIiIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBkZWNpbWFsID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGRlY2ltYWx2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMzEyMy4xMjMxMjMiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGRlY2ltYWx2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMxMjMuMTIzMTIzIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGRlY2ltYWx2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbmV3IEJpZ0RlY2ltYWwoIjEyMzEyMy4xMjMxMjMiKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2RlY2ltYWx2YWwgV0hFUkUgZGVjaW1hbHZhbCA9IGZyb21Kc29uKD8pIiwgIjEyMzEyMy4xMjMxMjMiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2RlY2ltYWx2YWwgV0hFUkUgZGVjaW1hbHZhbCA9IGZyb21fanNvbig/KSIsICIxMjMxMjMuMTIzMTIzIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKIAotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBkZWNpbWFsdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGRlY2ltYWx2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbmV3IEJpZ0RlY2ltYWwoIjEyMzEyMyIpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZGVjaW1hbHZhbCBXSEVSRSBkZWNpbWFsdmFsID0gZnJvbUpzb24oPykiLCAiMTIzMTIzLjEyMzEyMyIpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl9kZWNpbWFsdmFsIFdIRVJFIGRlY2ltYWx2YWwgPSBmcm9tSnNvbig/KSIsICIxMjMxMjMiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2RlY2ltYWx2YWwgV0hFUkUgZGVjaW1hbHZhbCA9IGZyb21fanNvbig/KSIsICIxMjMxMjMuMTIzMTIzIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2RlY2ltYWx2YWwgV0hFUkUgZGVjaW1hbHZhbCA9IGZyb21fanNvbig/KSIsICIxMjMxMjMiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vIGFjY2VwdCBzdHJpbmdzIGZvciBudW1iZXJzIHRoYXQgY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzIGRvdWJsZXMKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGRlY2ltYWx2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMTIzMTIzLjEyMzEyM1wiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBkZWNpbWFsdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIxMjMxMjMuMTIzMTIzXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZGVjaW1hbHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBuZXcgQmlnRGVjaW1hbCgiMTIzMTIzLjEyMzEyMyIpKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGRlY2ltYWx2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiLTEuMjNFLTEyXCIiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGRlY2ltYWx2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIi0xLjIzRS0xMlwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGRlY2ltYWx2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbmV3IEJpZ0RlY2ltYWwoIi0xLjIzRS0xMiIpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZGVjaW1hbHZhbCBXSEVSRSBkZWNpbWFsdmFsID0gZnJvbUpzb24oPykiLCAiXCItMS4yM0UtMTJcIiIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZGVjaW1hbHZhbCBXSEVSRSBkZWNpbWFsdmFsID0gZnJvbV9qc29uKD8pIiwgIlwiLTEuMjNFLTEyXCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gZG91YmxlID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzLjEyMzEyMyIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZG91YmxldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzLjEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBkb3VibGV2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgMTIzMTIzLjEyMzEyM2QpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl9kb3VibGV2YWwgV0hFUkUgZG91YmxldmFsID0gZnJvbUpzb24oPykiLCAiMTIzMTIzLjEyMzEyMyIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZG91YmxldmFsIFdIRVJFIGRvdWJsZXZhbCA9IGZyb21fanNvbig/KSIsICIxMjMxMjMuMTIzMTIzIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKIAotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZG91YmxldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMxMjMiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBkb3VibGV2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgMTIzMTIzLjBkKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZG91YmxldmFsIFdIRVJFIGRvdWJsZXZhbCA9IGZyb21Kc29uKD8pIiwgIjEyMzEyMyIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZG91YmxldmFsIFdIRVJFIGRvdWJsZXZhbCA9IGZyb21fanNvbig/KSIsICIxMjMxMjMiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gZmxvYXQgPT09PT09PT09PT09PT09PQotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZmxvYXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMzEyMy4xMjMxMjMiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGZsb2F0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzLjEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmbG9hdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAxMjMxMjMuMTIzMTIzZikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2Zsb2F0dmFsIFdIRVJFIGZsb2F0dmFsID0gZnJvbUpzb24oPykiLCAiMTIzMTIzLjEyMzEyMyIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfZmxvYXR2YWwgV0hFUkUgZmxvYXR2YWwgPSBmcm9tX2pzb24oPykiLCAiMTIzMTIzLjEyMzEyMyIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGZsb2F0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMxMjMiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGZsb2F0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZsb2F0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIDEyMzEyMy4wZikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2Zsb2F0dmFsIFdIRVJFIGZsb2F0dmFsID0gZnJvbUpzb24oPykiLCAiMTIzMTIzIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl9mbG9hdHZhbCBXSEVSRSBmbG9hdHZhbCA9IGZyb21fanNvbig/KSIsICIxMjMxMjMiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gaW5ldCA9PT09PT09PT09PT09PT09Ci0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBpbmV0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjEyNy4wLjAuMVwiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBpbmV0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIxMjcuMC4wLjFcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBpbmV0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiMTI3LjAuMC4xIikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl9pbmV0dmFsIFdIRVJFIGluZXR2YWwgPSBmcm9tSnNvbig/KSIsICJcIjEyNy4wLjAuMVwiIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl9pbmV0dmFsIFdIRVJFIGluZXR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCIxMjcuMC4wLjFcIiIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGluZXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiOjoxXCIiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGluZXR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjo6MVwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGluZXR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCI6OjEiKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2luZXR2YWwgV0hFUkUgaW5ldHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiMTI3LjAuMC4xXCIiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfaW5ldHZhbCBXSEVSRSBpbmV0dmFsID0gZnJvbUpzb24oPykiLCAiXCI6OjFcIiIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfaW5ldHZhbCBXSEVSRSBpbmV0dmFsID0gZnJvbV9qc29uKD8pIiwgIlwiMTI3LjAuMC4xXCIiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfaW5ldHZhbCBXSEVSRSBpbmV0dmFsID0gZnJvbV9qc29uKD8pIiwgIlwiOjoxXCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gaW50ID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMxMjMiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgaW50dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIDEyMzEyMykpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2ludHZhbCBXSEVSRSBpbnR2YWwgPSBmcm9tSnNvbig/KSIsICIxMjMxMjMiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X2ludHZhbCBXSEVSRSBpbnR2YWwgPSBmcm9tX2pzb24oPykiLCAiMTIzMTIzIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHRleHQgKHZhcmNoYXIpID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwic29tZSBcXFwiIHRleHRcIiIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdGV4dHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwic29tZSBcXFwiIHRleHRcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0ZXh0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJzb21lIFwiIHRleHQiKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiXFx1MjAxM1wiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0ZXh0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJcXHUyMDEzXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXHUyMDEzIikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiXFx1MjAxM1wiIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJcXHUyMDEzXCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0ZXh0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcImFiY2RcIiIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdGV4dHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiYWJjZFwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgImFiY2QiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB0aW1lID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMDc6MzU6MDcuMDAwMTExMjIyXCIiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjA3OjM1OjA3LjAwMDExMTIyMlwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRpbWV2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgVGltZVNlcmlhbGl6ZXIudGltZVN0cmluZ1RvTG9uZygiMDc6MzU6MDcuMDAwMTExMjIyIikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl90aW1ldmFsIFdIRVJFIHRpbWV2YWwgPSBmcm9tSnNvbig/KSIsICJcIjA3OjM1OjA3LjAwMDExMTIyMlwiIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl90aW1ldmFsIFdIRVJFIHRpbWV2YWwgPSBmcm9tX2pzb24oPykiLCAiXCIwNzozNTowNy4wMDAxMTEyMjJcIiIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB0aW1lc3RhbXAgPT09PT09PT09PT09PT09PQotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXN0YW1wdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMxMjMxMjMxMjMiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRpbWVzdGFtcHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMzEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0aW1lc3RhbXB2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbmV3IERhdGUoMTIzMTIzMTIzMTIzTCkpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl90aW1lc3RhbXB2YWwgV0hFUkUgdGltZXN0YW1wdmFsID0gZnJvbUpzb24oPykiLCAiMTIzMTIzMTIzMTIzIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl90aW1lc3RhbXB2YWwgV0hFUkUgdGltZXN0YW1wdmFsID0gZnJvbV9qc29uKD8pIiwgIjEyMzEyMzEyMzEyMyIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRpbWVzdGFtcHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIyMDE0LTAxLTAxXCIiKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRpbWVzdGFtcHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMjAxNC0wMS0wMVwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRpbWVzdGFtcHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieS1NLWQiKS5wYXJzZSgiMjAxNC0wMS0wMSIpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfdGltZXN0YW1wdmFsIFdIRVJFIHRpbWVzdGFtcHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiMjAxNC0wMS0wMVwiIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl90aW1lc3RhbXB2YWwgV0hFUkUgdGltZXN0YW1wdmFsID0gZnJvbV9qc29uKD8pIiwgIlwiMjAxNC0wMS0wMVwiIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHRpbWV1dWlkID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0aW1ldXVpZHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGltZXV1aWR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0aW1ldXVpZHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCI2QkREQzg5QS01NjQ0LTExRTQtOTdGQy01Njg0N0FGRTk3OTlcIiIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjZCRERDODlBLTU2NDQtMTFFNC05N0ZDLTU2ODQ3QUZFOTc5OVwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRpbWV1dWlkdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl90aW1ldXVpZHZhbCBXSEVSRSB0aW1ldXVpZHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiNkJEREM4OUEtNTY0NC0xMUU0LTk3RkMtNTY4NDdBRkU5Nzk5XCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X3RpbWV1dWlkdmFsIFdIRVJFIHRpbWV1dWlkdmFsID0gZnJvbV9qc29uKD8pIiwgIlwiNkJEREM4OUEtNTY0NC0xMUU0LTk3RkMtNTY4NDdBRkU5Nzk5XCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gdXVpZHZhbCA9PT09PT09PT09PT09PT09Ci0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB1dWlkdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKTsKIAotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdXVpZHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCI2QkREQzg5QS01NjQ0LTExRTQtOTdGQy01Njg0N0FGRTk3OTlcIiIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdXVpZHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiNkJEREM4OUEtNTY0NC0xMUU0LTk3RkMtNTY4NDdBRkU5Nzk5XCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdXVpZHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfdXVpZHZhbCBXSEVSRSB1dWlkdmFsID0gZnJvbUpzb24oPykiLCAiXCI2QkREQzg5QS01NjQ0LTExRTQtOTdGQy01Njg0N0FGRTk3OTlcIiIpLCByb3coMCwgImFzY2lpIHRleHQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIGZyb20gbXZfdXVpZHZhbCBXSEVSRSB1dWlkdmFsID0gZnJvbV9qc29uKD8pIiwgIlwiNkJEREM4OUEtNTY0NC0xMUU0LTk3RkMtNTY4NDdBRkU5Nzk5XCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gdmFyaW50ID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzMTIzMTIzIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB2YXJpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMxMjMxMjMxMjMiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdmFyaW50dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG5ldyBCaWdJbnRlZ2VyKCIxMjMxMjMxMjMxMjMiKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X3ZhcmludHZhbCBXSEVSRSB2YXJpbnR2YWwgPSBmcm9tSnNvbig/KSIsICIxMjMxMjMxMjMxMjMiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X3ZhcmludHZhbCBXSEVSRSB2YXJpbnR2YWwgPSBmcm9tX2pzb24oPykiLCAiMTIzMTIzMTIzMTIzIiksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKIAogICAgICAgICAvLyBhY2NlcHQgc3RyaW5ncyBmb3IgbnVtYmVycyB0aGF0IGNhbm5vdCBiZSByZXByZXNlbnRlZCBhcyBsb25ncwotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdmFyaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBcIiIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdmFyaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdmFyaW50dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG5ldyBCaWdJbnRlZ2VyKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYXNjaWl2YWwgZnJvbSBtdl92YXJpbnR2YWwgV0hFUkUgdmFyaW50dmFsID0gZnJvbUpzb24oPykiLCAiXCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwXCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBmcm9tIG12X3ZhcmludHZhbCBXSEVSRSB2YXJpbnR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwXCIiKSwgcm93KDAsICJhc2NpaSB0ZXh0IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gbGlzdHMgPT09PT09PT09PT09PT09PQotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgbGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiWzEsIDIsIDNdIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBsaXN0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiWzEsIDIsIDNdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbGlzdCgxLCAyLCAzKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBsaXN0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoMSwgMiwgMykpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgxLCAyLCAzKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBsaXN0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbMV0iKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJbMV0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBsaXN0KDEpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgxKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBsaXN0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbV9qc29uKD8pIiwgIlwiYWJjZFwiIiksIHJvdygwLCBsaXN0KDEpKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiVVBEQVRFICVzIFNFVCBsaXN0dmFsID0gbGlzdHZhbCArIGZyb21Kc29uKD8pIFdIRVJFIGsgPSA/IiwgIlsyXSIsIDApOworICAgICAgICB1cGRhdGVWaWV3KCJVUERBVEUgJXMgU0VUIGxpc3R2YWwgPSBsaXN0dmFsICsgZnJvbV9qc29uKD8pIFdIRVJFIGsgPSA/IiwgIlsyXSIsIDApOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBsaXN0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIGxpc3QoMSwgMikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiYWJjZFwiIiksIHJvdygwLCBsaXN0KDEsIDIpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoMSwgMikpKTsKIAotICAgICAgICB1cGRhdGVWaWV3KCJVUERBVEUgJXMgU0VUIGxpc3R2YWwgPSBmcm9tSnNvbig/KSArIGxpc3R2YWwgV0hFUkUgayA9ID8iLCAiWzBdIiwgMCk7CisgICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgbGlzdHZhbCA9IGZyb21fanNvbig/KSArIGxpc3R2YWwgV0hFUkUgayA9ID8iLCAiWzBdIiwgMCk7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbGlzdCgwLCAxLCAyKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBsaXN0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoMCwgMSwgMikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgwLCAxLCAyKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgbGlzdHZhbFsxXSA9IGZyb21Kc29uKD8pIFdIRVJFIGsgPSA/IiwgIjEwIiwgMCk7CisgICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgbGlzdHZhbFsxXSA9IGZyb21fanNvbig/KSBXSEVSRSBrID0gPyIsICIxMCIsIDApOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBsaXN0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIGxpc3QoMCwgMTAsIDIpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgwLCAxMCwgMikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgwLCAxMCwgMikpKTsKIAogICAgICAgICB1cGRhdGVWaWV3KCJERUxFVEUgbGlzdHZhbFsxXSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCk7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbGlzdCgwLCAyKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBsaXN0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoMCwgMikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgwLCAyKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBsaXN0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbXSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgbGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbnVsbCkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBsaXN0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbnVsbCkpOwogCiAgICAgICAgIC8vIGZyb3plbgotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiWzEsIDIsIDNdIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5saXN0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiWzEsIDIsIDNdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbmxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbGlzdCgxLCAyLCAzKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5saXN0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoMSwgMiwgMykpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBmcm9tIG12X2Zyb3plbmxpc3R2YWwgd2hlcmUgZnJvemVubGlzdHZhbCA9IGZyb21Kc29uKD8pIiwgIlsxLCAyLCAzXSIpLCByb3coMCwgImFiY2QiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbmxpc3R2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoMSwgMiwgMykpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBmcm9tIG12X2Zyb3plbmxpc3R2YWwgd2hlcmUgZnJvemVubGlzdHZhbCA9IGZyb21fanNvbig/KSIsICJbMSwgMiwgM10iKSwgcm93KDAsICJhYmNkIikpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5saXN0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbMywgMiwgMV0iKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGZyb3plbmxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJbMywgMiwgMV0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZnJvemVubGlzdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBsaXN0KDMsIDIsIDEpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgZnJvbSBtdl9mcm96ZW5saXN0dmFsIHdoZXJlIGZyb3plbmxpc3R2YWwgPSBmcm9tSnNvbig/KSIsICJbMSwgMiwgM10iKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgZnJvbSBtdl9mcm96ZW5saXN0dmFsIHdoZXJlIGZyb3plbmxpc3R2YWwgPSBmcm9tSnNvbig/KSIsICJbMywgMiwgMV0iKSwgcm93KDAsICJhYmNkIikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5saXN0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoMywgMiwgMSkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBmcm9tIG12X2Zyb3plbmxpc3R2YWwgd2hlcmUgZnJvemVubGlzdHZhbCA9IGZyb21fanNvbig/KSIsICJbMSwgMiwgM10iKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgZnJvbSBtdl9mcm96ZW5saXN0dmFsIHdoZXJlIGZyb3plbmxpc3R2YWwgPSBmcm9tX2pzb24oPykiLCAiWzMsIDIsIDFdIiksIHJvdygwLCAiYWJjZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZnJvemVubGlzdHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgzLCAyLCAxKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5saXN0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbXSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbmxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbGlzdCgpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbmxpc3R2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLCByb3coMCwgbGlzdCgpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbmxpc3R2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIGxpc3QoKSkpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gc2V0cyA9PT09PT09PT09PT09PT09Ci0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBzZXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwKICAgICAgICAgICAgICAgICAgICAwLCAiW1wiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4XCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIHNldChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OCIpLCAoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpKQogICAgICAgICApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBzZXR2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBzZXR2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgc2V0KFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4IiksIChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSkpKTsKIAogICAgICAgICAvLyBkdXBsaWNhdGVzIGFyZSBva2F5LCBqdXN0IGxpa2UgaW4gQ1FMCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBzZXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwKICAgICAgICAgICAgICAgICAgICAwLCAiW1wiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4XCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4XCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIHNldChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OCIpLCAoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpKQogICAgICAgICApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBzZXR2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBzZXR2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgc2V0KFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4IiksIChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSkpKTsKIAotICAgICAgICB1cGRhdGVWaWV3KCJVUERBVEUgJXMgU0VUIHNldHZhbCA9IHNldHZhbCArIGZyb21Kc29uKD8pIFdIRVJFIGsgPSA/IiwgIltcIjZiZGRjODlhLTU2NDQtMDAwMC05N2ZjLTU2ODQ3YWZlOTc5OVwiXSIsIDApOworICAgICAgICB1cGRhdGVWaWV3KCJVUERBVEUgJXMgU0VUIHNldHZhbCA9IHNldHZhbCArIGZyb21fanNvbig/KSBXSEVSRSBrID0gPyIsICJbXCI2YmRkYzg5YS01NjQ0LTAwMDAtOTdmYy01Njg0N2FmZTk3OTlcIl0iLCAwKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1Qgaywgc2V0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgc2V0KFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0wMDAwLTk3ZmMtNTY4NDdhZmU5Nzk5IiksIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4IiksIChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSkpCiAgICAgICAgICk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiYWJjZFwiIiksCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCBzZXQoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTAwMDAtOTdmYy01Njg0N2FmZTk3OTkiKSwgVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTgiKSwgKFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgc2V0dmFsID0gc2V0dmFsIC0gZnJvbUpzb24oPykgV0hFUkUgayA9ID8iLCAiW1wiNmJkZGM4OWEtNTY0NC0wMDAwLTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIiwgMCk7CisgICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgc2V0dmFsID0gc2V0dmFsIC0gZnJvbV9qc29uKD8pIFdIRVJFIGsgPSA/IiwgIltcIjZiZGRjODlhLTU2NDQtMDAwMC05N2ZjLTU2ODQ3YWZlOTc5OVwiXSIsIDApOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBzZXR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCBzZXQoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTgiKSwgKFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKSkKICAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1Qgaywgc2V0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1Qgaywgc2V0dmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbV9qc29uKD8pIiwgIlwiYWJjZFwiIiksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIHNldChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OCIpLCAoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpKSk7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiW10iKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBudWxsKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiYWJjZFwiIiksCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCBudWxsKSk7CiAKIAogICAgICAgICAvLyBmcm96ZW4KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGZyb3plbnNldHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLAorICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVuc2V0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLAogICAgICAgICAgICAgICAgICAgIDAsICJbXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OThcIiwgXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIl0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZnJvemVuc2V0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgc2V0KFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4IiksIChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSkpCiAgICAgICAgICk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbnNldHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21Kc29uKD8pIiwgIlwiYWJjZFwiIiksCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbnNldHZhbCBmcm9tIG12X3RleHR2YWwgV0hFUkUgdGV4dHZhbCA9IGZyb21fanNvbig/KSIsICJcImFiY2RcIiIpLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCBzZXQoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTgiKSwgKFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5zZXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGZyb3plbnNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwKICAgICAgICAgICAgICAgICAgICAwLCAiW1wiNmJkZGM4OWEtMDAwMC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4XCJdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbnNldHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIHNldChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTAwMDAtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpLCAoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTgiKSkpKQogICAgICAgICApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5zZXR2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5zZXR2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgc2V0KFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtMDAwMC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IiksIChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OCIpKSkpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IG1hcHMgPT09PT09PT09PT09PT09PQotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJhXCI6IDEsIFwiYlwiOiAyfSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYVwiOiAxLCBcImJcIjogMn0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG1hcCgiYSIsIDEsICJiIiwgMikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwgcm93KDAsIG1hcCgiYSIsIDEsICJiIiwgMikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbV9qc29uKD8pIiwgIlwiYWJjZFwiIiksIHJvdygwLCBtYXAoImEiLCAxLCAiYiIsIDIpKSk7CiAKICAgICAgICAgdXBkYXRlVmlldygiVVBEQVRFICVzIFNFVCBtYXB2YWxbP10gPSA/ICBXSEVSRSBrID0gPyIsICJjIiwgMywgMCk7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIG1hcHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIG1hcCgiYSIsIDEsICJiIiwgMiwgImMiLCAzKSkKICAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbV9qc29uKD8pIiwgIlwiYWJjZFwiIiksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIG1hcCgiYSIsIDEsICJiIiwgMiwgImMiLCAzKSkpOwogCiAgICAgICAgIHVwZGF0ZVZpZXcoIlVQREFURSAlcyBTRVQgbWFwdmFsWz9dID0gPyAgV0hFUkUgayA9ID8iLCAiYiIsIDEwLCAwKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgbWFwKCJhIiwgMSwgImIiLCAxMCwgImMiLCAzKSkKICAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbUpzb24oPykiLCAiXCJhYmNkXCIiKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIGZyb20gbXZfdGV4dHZhbCBXSEVSRSB0ZXh0dmFsID0gZnJvbV9qc29uKD8pIiwgIlwiYWJjZFwiIiksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIG1hcCgiYSIsIDEsICJiIiwgMTAsICJjIiwgMykpKTsKIAogICAgICAgICB1cGRhdGVWaWV3KCJERUxFVEUgbWFwdmFsWz9dIEZST00gJXMgV0hFUkUgayA9ID8iLCAiYiIsIDApOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBtYXB2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCBtYXAoImEiLCAxLCAiYyIsIDMpKQogICAgICAgICApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBtYXB2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBtYXB2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgbWFwKCJhIiwgMSwgImMiLCAzKSkpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBtYXB2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgInt9Iik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBtYXB2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ7fSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBtYXB2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbnVsbCkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBtYXB2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tSnNvbig/KSIsICJcImFiY2RcIiIpLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBtYXB2YWwgZnJvbSBtdl90ZXh0dmFsIFdIRVJFIHRleHR2YWwgPSBmcm9tX2pzb24oPykiLCAiXCJhYmNkXCIiKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgbnVsbCkpOwogCiAgICAgICAgIC8vIGZyb3plbgotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJhXCI6IDEsIFwiYlwiOiAyfSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubWFwdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYVwiOiAxLCBcImJcIjogMn0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZnJvemVubWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG1hcCgiYSIsIDEsICJiIiwgMikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NIG12X2Zyb3plbm1hcHZhbCBXSEVSRSBmcm96ZW5tYXB2YWwgPSBmcm9tSnNvbig/KSIsICJ7XCJhXCI6IDEsIFwiYlwiOiAyfSIpLCByb3coMCwgImFiY2QiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSBtdl9mcm96ZW5tYXB2YWwgV0hFUkUgZnJvemVubWFwdmFsID0gZnJvbV9qc29uKD8pIiwgIntcImFcIjogMSwgXCJiXCI6IDJ9IiksIHJvdygwLCAiYWJjZCIpKTsKIAotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJiXCI6IDIsIFwiYVwiOiAzfSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubWFwdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYlwiOiAyLCBcImFcIjogM30iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZnJvemVubWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG1hcCgiYSIsIDMsICJiIiwgMikpKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZnJvemVubWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG1hcCgiYSIsIDMsICJiIiwgMikpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHR1cGxlcyA9PT09PT09PT09PT09PT09Ci0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0dXBsZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiWzEsIFwiZm9vYmFyXCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0dXBsZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlsxLCBcImZvb2JhclwiLCBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiXSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0dXBsZXZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIHR1cGxlKDEsICJmb29iYXIiLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSkKICAgICAgICAgKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NIG12X3R1cGxldmFsIFdIRVJFIHR1cGxldmFsID0gPyIsIHR1cGxlKDEsICJmb29iYXIiLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsICJhYmNkIikpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0dXBsZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiWzEsIG51bGwsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CisgICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCB0dXBsZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlsxLCBudWxsLCBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiXSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0dXBsZXZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIHR1cGxlKDEsIG51bGwsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKQogICAgICAgICApOwpAQCAtNTY5LDM3ICs1NjksMzcgQEAKICAgICAgICAgICAgICAgICAgICByb3coMCwgImFiY2QiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBVRFRzID09PT09PT09PT09PT09PT0KLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAie1wiYVwiOiAxLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIntcImFcIjogMSwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiY1wiOiBbXCJmb29cIiwgXCJiYXJcIl19Iik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHVkdHZhbC5hLCB1ZHR2YWwuYiwgdWR0dmFsLmMgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCAxLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpLCBzZXQoImJhciIsICJmb28iKSkKICAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NIG12X3VkdHZhbCBXSEVSRSB1ZHR2YWwgPSBmcm9tSnNvbig/KSIsICJ7XCJhXCI6IDEsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImNcIjogW1wiZm9vXCIsIFwiYmFyXCJdfSIpLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0ZXh0dmFsIEZST00gbXZfdWR0dmFsIFdIRVJFIHVkdHZhbCA9IGZyb21fanNvbig/KSIsICJ7XCJhXCI6IDEsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImNcIjogW1wiZm9vXCIsIFwiYmFyXCJdfSIpLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCAiYWJjZCIpKTsKIAogICAgICAgICAvLyBvcmRlciBvZiBmaWVsZHMgc2hvdWxkbid0IG1hdHRlcgotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiYVwiOiAxLCBcImNcIjogW1wiZm9vXCIsIFwiYmFyXCJdfSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImFcIjogMSwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdWR0dmFsLmEsIHVkdHZhbC5iLCB1ZHR2YWwuYyBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIDEsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IiksIHNldCgiYmFyIiwgImZvbyIpKQogICAgICAgICApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0ZXh0dmFsIEZST00gbXZfdWR0dmFsIFdIRVJFIHVkdHZhbCA9IGZyb21Kc29uKD8pIiwgIntcImFcIjogMSwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiY1wiOiBbXCJmb29cIiwgXCJiYXJcIl19IiksCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSBtdl91ZHR2YWwgV0hFUkUgdWR0dmFsID0gZnJvbV9qc29uKD8pIiwgIntcImFcIjogMSwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiY1wiOiBbXCJmb29cIiwgXCJiYXJcIl19IiksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsICJhYmNkIikpOwogCiAgICAgICAgIC8vIHRlc3QgbnVsbHMKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAie1wiYVwiOiBudWxsLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIntcImFcIjogbnVsbCwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiY1wiOiBbXCJmb29cIiwgXCJiYXJcIl19Iik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHVkdHZhbC5hLCB1ZHR2YWwuYiwgdWR0dmFsLmMgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgICAgIHJvdygwLCBudWxsLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpLCBzZXQoImJhciIsICJmb28iKSkKICAgICAgICAgKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NIG12X3VkdHZhbCBXSEVSRSB1ZHR2YWwgPSBmcm9tSnNvbig/KSIsICJ7XCJhXCI6IDEsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImNcIjogW1wiZm9vXCIsIFwiYmFyXCJdfSIpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NIG12X3VkdHZhbCBXSEVSRSB1ZHR2YWwgPSBmcm9tSnNvbig/KSIsICJ7XCJhXCI6IG51bGwsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImNcIjogW1wiZm9vXCIsIFwiYmFyXCJdfSIpLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0ZXh0dmFsIEZST00gbXZfdWR0dmFsIFdIRVJFIHVkdHZhbCA9IGZyb21fanNvbig/KSIsICJ7XCJhXCI6IDEsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImNcIjogW1wiZm9vXCIsIFwiYmFyXCJdfSIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NIG12X3VkdHZhbCBXSEVSRSB1ZHR2YWwgPSBmcm9tX2pzb24oPykiLCAie1wiYVwiOiBudWxsLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKSwKICAgICAgICAgICAgICAgICAgICByb3coMCwgImFiY2QiKSk7CiAKICAgICAgICAgLy8gdGVzdCBtaXNzaW5nIGZpZWxkcwotICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJhXCI6IDEsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwifSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYVwiOiAxLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIn0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdWR0dmFsLmEsIHVkdHZhbC5iLCB1ZHR2YWwuYyBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsIDEsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IiksIG51bGwpCiAgICAgICAgICk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSBtdl91ZHR2YWwgV0hFUkUgdWR0dmFsID0gZnJvbUpzb24oPykiLCAie1wiYVwiOiBudWxsLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSBtdl91ZHR2YWwgV0hFUkUgdWR0dmFsID0gZnJvbUpzb24oPykiLCAie1wiYVwiOiAxLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIn0iKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NIG12X3VkdHZhbCBXSEVSRSB1ZHR2YWwgPSBmcm9tX2pzb24oPykiLCAie1wiYVwiOiBudWxsLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSBtdl91ZHR2YWwgV0hFUkUgdWR0dmFsID0gZnJvbV9qc29uKD8pIiwgIntcImFcIjogMSwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJ9IiksCiAgICAgICAgICAgICAgICAgICAgcm93KDAsICJhYmNkIikpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL1ZpZXdUZXN0LmphdmEKaW5kZXggZDgyZmQzMi4uYTI3OTNmZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvVmlld1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9WaWV3VGVzdC5qYXZhCkBAIC0yMzIsMTIgKzIzMiwxMiBAQAogCiAgICAgICAgIGNyZWF0ZVZpZXcoIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSVMgTk9UIE5VTEwgQU5EIGludHZhbCBJUyBOT1QgTlVMTCBQUklNQVJZIEtFWSAoaW50dmFsLCBrKSIpOwogCi0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwsIGxpc3R2YWwpIFZBTFVFUyAoPywgPywgZnJvbUpzb24oPykpIiwgMCwgMCwgIlsxLCAyLCAzXSIpOworICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgaW50dmFsLCBsaXN0dmFsKSBWQUxVRVMgKD8sID8sIGZyb21fanNvbig/KSkiLCAwLCAwLCAiWzEsIDIsIDNdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbGlzdCgxLCAyLCAzKSkpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGVWaWV3KCJTRUxFQ1QgaywgbGlzdHZhbCBmcm9tICVzIFdIRVJFIGludHZhbCA9ID8iLCAwKSwgcm93KDAsIGxpc3QoMSwgMiwgMykpKTsKIAogICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgaW50dmFsKSBWQUxVRVMgKD8sID8pIiwgMSwgMSk7Ci0gICAgICAgIHVwZGF0ZVZpZXcoIklOU0VSVCBJTlRPICVzIChrLCBsaXN0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDEsICJbMSwgMiwgM10iKTsKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDEsICJbMSwgMiwgM10iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMSksIHJvdygxLCBsaXN0KDEsIDIsIDMpKSk7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZVZpZXcoIlNFTEVDVCBrLCBsaXN0dmFsIGZyb20gJXMgV0hFUkUgaW50dmFsID0gPyIsIDEpLCByb3coMSwgbGlzdCgxLCAyLCAzKSkpOwogICAgIH0KQEAgLTI0OSw3ICsyNDksNyBAQAogCiAgICAgICAgIGNyZWF0ZVZpZXcoIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSVMgTk9UIE5VTEwgQU5EIGxpc3R2YWwgSVMgTk9UIE5VTEwgUFJJTUFSWSBLRVkgKGssIGxpc3R2YWwpIik7CiAKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGludHZhbCwgbGlzdHZhbCkgVkFMVUVTICg/LCA/LCBmcm9tSnNvbig/KSkiLAorICAgICAgICB1cGRhdGVWaWV3KCJJTlNFUlQgSU5UTyAlcyAoaywgaW50dmFsLCBsaXN0dmFsKSBWQUxVRVMgKD8sID8sIGZyb21fanNvbig/KSkiLAogICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAiW1tcImFcIixcIjFcIl0sIFtcImJcIixcIjJcIl0sIFtcImNcIixcIjNcIl1dIik7CkBAIC0yNjEsNyArMjYxLDcgQEAKICAgICAgICAgICAgICAgICAgICByb3coMCwgbGlzdCh0dXBsZSgiYSIsICIxIiksIHR1cGxlKCJiIiwgIjIiKSwgdHVwbGUoImMiLCAiMyIpKSkpOwogCiAgICAgICAgIC8vIHVwZGF0ZSBsaXN0dmFsIHdpdGggdGhlIHNhbWUgdmFsdWUgYW5kIGl0IHdpbGwgYmUgY29tcGFyZWQgaW4gdmlldyBnZW5lcmF0b3IKLSAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwKKyAgICAgICAgdXBkYXRlVmlldygiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsCiAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAiW1tcImFcIixcIjFcIl0sIFtcImJcIixcIjJcIl0sIFtcImNcIixcIjNcIl1dIik7CiAgICAgICAgIC8vIHZlcmlmeSByZXN1bHQKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9DYXN0RmN0c1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9DYXN0RmN0c1Rlc3QuamF2YQppbmRleCA2ZWZiZGMwLi43ZmUzYjYxIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQ2FzdEZjdHNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Nhc3RGY3RzVGVzdC5qYXZhCkBAIC0zMjYsNyArMzI2LDcgQEAKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgdiBGUk9NICVzIiksIHJvdygzKSk7CiAKICAgICAgICAgLy8gQ2FzdCBvZiBwbGFjZWhvbGRlciB3aXRob3V0IHR5cGUgaGludAotICAgICAgICBhc3NlcnRJbnZhbGlkUmVxdWVzdE1lc3NhZ2UoIkFtYmlndW91cyBjYWxsIHRvIGZ1bmN0aW9uIHN5c3RlbS5jYXN0QXNJbnQiLAorICAgICAgICBhc3NlcnRJbnZhbGlkUmVxdWVzdE1lc3NhZ2UoIkFtYmlndW91cyBjYWxsIHRvIGZ1bmN0aW9uIHN5c3RlbS5jYXN0X2FzX2ludCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHYpIFZBTFVFUyAoMSwgQ0FTVCg/IEFTIGludCkpIiwgMy40Zik7CiAKICAgICAgICAgLy8gVHlwZSBoaW50IG9mIGNhc3QKQEAgLTM2Myw3ICszNjMsNyBAQAogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCB2IEZST00gJXMiKSwgcm93KDMpKTsKIAogICAgICAgICAvLyBDYXN0IG9mIHBsYWNlaG9sZGVyIHdpdGhvdXQgdHlwZSBoaW50Ci0gICAgICAgIGFzc2VydEludmFsaWRSZXF1ZXN0TWVzc2FnZSgiQW1iaWd1b3VzIGNhbGwgdG8gZnVuY3Rpb24gc3lzdGVtLmNhc3RBc0ludCIsCisgICAgICAgIGFzc2VydEludmFsaWRSZXF1ZXN0TWVzc2FnZSgiQW1iaWd1b3VzIGNhbGwgdG8gZnVuY3Rpb24gc3lzdGVtLmNhc3RfYXNfaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVUERBVEUgJXMgU0VUIHYgPSBDQVNUKD8gQVMgaW50KSBXSEVSRSBrID0gMSIsIDMuNGYpOwogCiAgICAgICAgIC8vIFR5cGUgaGludCBvZiBjYXN0CkBAIC00MDUsNyArNDA1LDcgQEAKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgdiBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMyksIHJvdygzKSk7CiAKICAgICAgICAgLy8gQ2FzdCBvZiBwbGFjZWhvbGRlciB3aXRob3V0IHR5cGUgaGludAotICAgICAgICBhc3NlcnRJbnZhbGlkUmVxdWVzdE1lc3NhZ2UoIkFtYmlndW91cyBjYWxsIHRvIGZ1bmN0aW9uIHN5c3RlbS5jYXN0QXNJbnQiLAorICAgICAgICBhc3NlcnRJbnZhbGlkUmVxdWVzdE1lc3NhZ2UoIkFtYmlndW91cyBjYWxsIHRvIGZ1bmN0aW9uIHN5c3RlbS5jYXN0X2FzX2ludCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCB2ID0gPyBXSEVSRSBrID0gQ0FTVCg/IEFTIGludCkiLCAzLCAzLjRmKTsKIAogICAgICAgICAvLyBUeXBlIGhpbnQgb2YgY2FzdApAQCAtNDQ0LDcgKzQ0NCw3IEBACiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGsgRlJPTSAlcyBXSEVSRSBrID0gQ0FTVCgoZmxvYXQpID8gQVMgaW50KSIsIDMuNGYpLCByb3coMykpOwogCiAgICAgICAgIC8vIENhc3Qgb2YgcGxhY2Vob2xkZXIgd2l0aG91dCB0eXBlIGhpbnQKLSAgICAgICAgYXNzZXJ0SW52YWxpZFJlcXVlc3RNZXNzYWdlKCJBbWJpZ3VvdXMgY2FsbCB0byBmdW5jdGlvbiBzeXN0ZW0uY2FzdEFzSW50IiwKKyAgICAgICAgYXNzZXJ0SW52YWxpZFJlcXVlc3RNZXNzYWdlKCJBbWJpZ3VvdXMgY2FsbCB0byBmdW5jdGlvbiBzeXN0ZW0uY2FzdF9hc19pbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCBrIEZST00gJXMgV0hFUkUgayA9IENBU1QoPyBBUyBpbnQpIiwgMy40Zik7CiAKICAgICAgICAgLy8gVHlwZSBoaW50IG9mIGNhc3QKQEAgLTQ4Myw3ICs0ODMsNyBAQAogICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMykpOwogCiAgICAgICAgIC8vIENhc3Qgb2YgcGxhY2Vob2xkZXIgd2l0aG91dCB0eXBlIGhpbnQKLSAgICAgICAgYXNzZXJ0SW52YWxpZFJlcXVlc3RNZXNzYWdlKCJBbWJpZ3VvdXMgY2FsbCB0byBmdW5jdGlvbiBzeXN0ZW0uY2FzdEFzSW50IiwKKyAgICAgICAgYXNzZXJ0SW52YWxpZFJlcXVlc3RNZXNzYWdlKCJBbWJpZ3VvdXMgY2FsbCB0byBmdW5jdGlvbiBzeXN0ZW0uY2FzdF9hc19pbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSBDQVNUKD8gQVMgaW50KSIsIDMuNGYpOwogCiAgICAgICAgIC8vIFR5cGUgaGludCBvZiBjYXN0CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQ29sbGVjdGlvbkZjdHNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvQ29sbGVjdGlvbkZjdHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkMjk5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9Db2xsZWN0aW9uRmN0c1Rlc3QuamF2YQpAQCAtMCwwICsxLDU5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9uczsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEubWF0aC5Sb3VuZGluZ01vZGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5OdW1iZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CisKKy8qKgorICogVGVzdHMgZm9yIHRoZSBmdW5jdGlvbnMgZGVmaW5lZCBvbiB7QGxpbmsgQ29sbGVjdGlvbkZjdHN9LgorICovCitwdWJsaWMgY2xhc3MgQ29sbGVjdGlvbkZjdHNUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBiaWdpbnQxID0gbmV3IEJpZ0ludGVnZXIoIjEyMzQ1Njc4OTAxMjM0NTY3ODkwIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBiaWdpbnQyID0gbmV3IEJpZ0ludGVnZXIoIjIzNDU2Nzg5MDEyMzQ1Njc4OTAxIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBiaWdkZWNpbWFsMSA9IG5ldyBCaWdEZWNpbWFsKCIxMjM0NTY3ODkwLjEyMzQ1Njc4OTAiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIGJpZ2RlY2ltYWwyID0gbmV3IEJpZ0RlY2ltYWwoIjIzNDU2Nzg5MDEuMjM0NTY3ODkwMSIpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90TnVtZXJpY0NvbGxlY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiB1dWlkLCBsIGxpc3Q8dGV4dD4sIHMgc2V0PGJvb2xlYW4+LCBmbCBmcm96ZW48bGlzdDx0ZXh0Pj4sIGZzIGZyb3plbjxzZXQ8Ym9vbGVhbj4+KSIpOworCisgICAgICAgIC8vIHN1bQorICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKCJGdW5jdGlvbiBzeXN0ZW0uY29sbGVjdGlvbl9zdW0gcmVxdWlyZXMgYSBudW1lcmljIHNldC9saXN0IGFyZ3VtZW50LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGZvdW5kIGFyZ3VtZW50IHYgb2YgdHlwZSB1dWlkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKHYpIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiRnVuY3Rpb24gc3lzdGVtLmNvbGxlY3Rpb25fc3VtIHJlcXVpcmVzIGEgbnVtZXJpYyBzZXQvbGlzdCBhcmd1bWVudCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBmb3VuZCBhcmd1bWVudCBsIG9mIHR5cGUgbGlzdDx0ZXh0PiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShsKSBGUk9NICVzIik7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoIkZ1bmN0aW9uIHN5c3RlbS5jb2xsZWN0aW9uX3N1bSByZXF1aXJlcyBhIG51bWVyaWMgc2V0L2xpc3QgYXJndW1lbnQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZm91bmQgYXJndW1lbnQgcyBvZiB0eXBlIHNldDxib29sZWFuPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShzKSBGUk9NICVzIik7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoIkZ1bmN0aW9uIHN5c3RlbS5jb2xsZWN0aW9uX3N1bSByZXF1aXJlcyBhIG51bWVyaWMgc2V0L2xpc3QgYXJndW1lbnQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZm91bmQgYXJndW1lbnQgZmwgb2YgdHlwZSBmcm96ZW48bGlzdDx0ZXh0Pj4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRUxFQ1QgY29sbGVjdGlvbl9zdW0oZmwpIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiRnVuY3Rpb24gc3lzdGVtLmNvbGxlY3Rpb25fc3VtIHJlcXVpcmVzIGEgbnVtZXJpYyBzZXQvbGlzdCBhcmd1bWVudCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBmb3VuZCBhcmd1bWVudCBmcyBvZiB0eXBlIGZyb3plbjxzZXQ8Ym9vbGVhbj4+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIik7CisKKyAgICAgICAgLy8gYXZnCisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoIkZ1bmN0aW9uIHN5c3RlbS5jb2xsZWN0aW9uX2F2ZyByZXF1aXJlcyBhIG51bWVyaWMgc2V0L2xpc3QgYXJndW1lbnQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZm91bmQgYXJndW1lbnQgdiBvZiB0eXBlIHV1aWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRUxFQ1QgY29sbGVjdGlvbl9hdmcodikgRlJPTSAlcyIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKCJGdW5jdGlvbiBzeXN0ZW0uY29sbGVjdGlvbl9hdmcgcmVxdWlyZXMgYSBudW1lcmljIHNldC9saXN0IGFyZ3VtZW50LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGZvdW5kIGFyZ3VtZW50IGwgb2YgdHlwZSBsaXN0PHRleHQ+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKGwpIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiRnVuY3Rpb24gc3lzdGVtLmNvbGxlY3Rpb25fYXZnIHJlcXVpcmVzIGEgbnVtZXJpYyBzZXQvbGlzdCBhcmd1bWVudCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBmb3VuZCBhcmd1bWVudCBzIG9mIHR5cGUgc2V0PGJvb2xlYW4+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKHMpIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiRnVuY3Rpb24gc3lzdGVtLmNvbGxlY3Rpb25fYXZnIHJlcXVpcmVzIGEgbnVtZXJpYyBzZXQvbGlzdCBhcmd1bWVudCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBmb3VuZCBhcmd1bWVudCBmbCBvZiB0eXBlIGZyb3plbjxsaXN0PHRleHQ+PiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhmbCkgRlJPTSAlcyIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKCJGdW5jdGlvbiBzeXN0ZW0uY29sbGVjdGlvbl9hdmcgcmVxdWlyZXMgYSBudW1lcmljIHNldC9saXN0IGFyZ3VtZW50LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGZvdW5kIGFyZ3VtZW50IGZzIG9mIHR5cGUgZnJvemVuPHNldDxib29sZWFuPj4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRUxFQ1QgY29sbGVjdGlvbl9hdmcoZnMpIEZST00gJXMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaW55SW50KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoQ1FMM1R5cGUuTmF0aXZlLlRJTllJTlQpOworCisgICAgICAgIC8vIGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfdmFsdWVzKG0pLCBtYXBfa2V5cyhmbSksIG1hcF92YWx1ZXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgc2V0KCksIGxpc3QoKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgMCwgMCwgMCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21heChsKSwgY29sbGVjdGlvbl9tYXgocyksIGNvbGxlY3Rpb25fbWF4KGZsKSwgY29sbGVjdGlvbl9tYXgoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShsKSwgY29sbGVjdGlvbl9zdW0ocyksIGNvbGxlY3Rpb25fc3VtKGZsKSwgY29sbGVjdGlvbl9zdW0oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgKGJ5dGUpIDAsIChieXRlKSAwKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKGwpLCBjb2xsZWN0aW9uX2F2ZyhzKSwgY29sbGVjdGlvbl9hdmcoZmwpLCBjb2xsZWN0aW9uX2F2ZyhmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCAoYnl0ZSkgMCwgKGJ5dGUpIDApKTsKKworICAgICAgICAvLyBub3QgZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwsIGZsLCBzLCBmcywgbSwgZm0pICBWQUxVRVMgKDEsID8sID8sID8sID8sID8sID8pIiwKKyAgICAgICAgICAgICAgICBsaXN0KChieXRlKSAxLCAoYnl0ZSkgMiksIHNldCgoYnl0ZSkgMSwgKGJ5dGUpIDIpLAorICAgICAgICAgICAgICAgIGxpc3QoKGJ5dGUpIDEsIChieXRlKSAyKSwgc2V0KChieXRlKSAxLCAoYnl0ZSkgMiksCisgICAgICAgICAgICAgICAgbWFwKChieXRlKSAxLCAoYnl0ZSkgMiwgKGJ5dGUpIDMsIChieXRlKSA0KSwKKyAgICAgICAgICAgICAgICBtYXAoKGJ5dGUpIDEsIChieXRlKSAyLCAoYnl0ZSkgMywgKGJ5dGUpIDQpKTsKKworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX2tleXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coc2V0KChieXRlKSAxLCAoYnl0ZSkgMyksIHNldCgoYnl0ZSkgMSwgKGJ5dGUpIDMpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF92YWx1ZXMobSksIG1hcF92YWx1ZXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobGlzdCgoYnl0ZSkgMiwgKGJ5dGUpIDQpLCBsaXN0KChieXRlKSAyLCAoYnl0ZSkgNCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChsKSwgY29sbGVjdGlvbl9jb3VudChzKSwgY29sbGVjdGlvbl9jb3VudChtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIDIsIDIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChmbCksIGNvbGxlY3Rpb25fY291bnQoZnMpLCBjb2xsZWN0aW9uX2NvdW50KGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIDIsIDIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9taW4obCksIGNvbGxlY3Rpb25fbWluKHMpLCBjb2xsZWN0aW9uX21pbihmbCksIGNvbGxlY3Rpb25fbWluKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KChieXRlKSAxLCAoYnl0ZSkgMSwgKGJ5dGUpIDEsIChieXRlKSAxKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWF4KGwpLCBjb2xsZWN0aW9uX21heChzKSwgY29sbGVjdGlvbl9tYXgoZmwpLCBjb2xsZWN0aW9uX21heChmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygoYnl0ZSkgMiwgKGJ5dGUpIDIsIChieXRlKSAyLCAoYnl0ZSkgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShsKSwgY29sbGVjdGlvbl9zdW0ocyksIGNvbGxlY3Rpb25fc3VtKGZsKSwgY29sbGVjdGlvbl9zdW0oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coKGJ5dGUpIDMsIChieXRlKSAzLCAoYnl0ZSkgMywgKGJ5dGUpIDMpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9hdmcobCksIGNvbGxlY3Rpb25fYXZnKHMpLCBjb2xsZWN0aW9uX2F2ZyhmbCksIGNvbGxlY3Rpb25fYXZnKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KChieXRlKSAxLCAoYnl0ZSkgMSwgKGJ5dGUpIDEsIChieXRlKSAxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U21hbGxJbnQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZShDUUwzVHlwZS5OYXRpdmUuU01BTExJTlQpOworCisgICAgICAgIC8vIGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfdmFsdWVzKG0pLCBtYXBfa2V5cyhmbSksIG1hcF92YWx1ZXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgc2V0KCksIGxpc3QoKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgMCwgMCwgMCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21heChsKSwgY29sbGVjdGlvbl9tYXgocyksIGNvbGxlY3Rpb25fbWF4KGZsKSwgY29sbGVjdGlvbl9tYXgoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShsKSwgY29sbGVjdGlvbl9zdW0ocyksIGNvbGxlY3Rpb25fc3VtKGZsKSwgY29sbGVjdGlvbl9zdW0oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgKHNob3J0KSAwLCAoc2hvcnQpIDApKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9hdmcobCksIGNvbGxlY3Rpb25fYXZnKHMpLCBjb2xsZWN0aW9uX2F2ZyhmbCksIGNvbGxlY3Rpb25fYXZnKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIChzaG9ydCkgMCwgKHNob3J0KSAwKSk7CisKKyAgICAgICAgLy8gbm90IGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCwgcywgZnMsIG0sIGZtKSAgVkFMVUVTICgxLCA/LCA/LCA/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgbGlzdCgoc2hvcnQpIDEsIChzaG9ydCkgMiksIHNldCgoc2hvcnQpIDEsIChzaG9ydCkgMiksCisgICAgICAgICAgICAgICAgbGlzdCgoc2hvcnQpIDEsIChzaG9ydCkgMiksIHNldCgoc2hvcnQpIDEsIChzaG9ydCkgMiksCisgICAgICAgICAgICAgICAgbWFwKChzaG9ydCkgMSwgKHNob3J0KSAyLCAoc2hvcnQpIDMsIChzaG9ydCkgNCksCisgICAgICAgICAgICAgICAgbWFwKChzaG9ydCkgMSwgKHNob3J0KSAyLCAoc2hvcnQpIDMsIChzaG9ydCkgNCkpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfa2V5cyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzZXQoKHNob3J0KSAxLCAoc2hvcnQpIDMpLCBzZXQoKHNob3J0KSAxLCAoc2hvcnQpIDMpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF92YWx1ZXMobSksIG1hcF92YWx1ZXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobGlzdCgoc2hvcnQpIDIsIChzaG9ydCkgNCksIGxpc3QoKHNob3J0KSAyLCAoc2hvcnQpIDQpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWluKGwpLCBjb2xsZWN0aW9uX21pbihzKSwgY29sbGVjdGlvbl9taW4oZmwpLCBjb2xsZWN0aW9uX21pbihmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygoc2hvcnQpIDEsIChzaG9ydCkgMSwgKHNob3J0KSAxLCAoc2hvcnQpIDEpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KChzaG9ydCkgMiwgKHNob3J0KSAyLCAoc2hvcnQpIDIsIChzaG9ydCkgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShsKSwgY29sbGVjdGlvbl9zdW0ocyksIGNvbGxlY3Rpb25fc3VtKGZsKSwgY29sbGVjdGlvbl9zdW0oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coKHNob3J0KSAzLCAoc2hvcnQpIDMsIChzaG9ydCkgMywgKHNob3J0KSAzKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKGwpLCBjb2xsZWN0aW9uX2F2ZyhzKSwgY29sbGVjdGlvbl9hdmcoZmwpLCBjb2xsZWN0aW9uX2F2ZyhmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygoc2hvcnQpIDEsIChzaG9ydCkgMSwgKHNob3J0KSAxLCAoc2hvcnQpIDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZShDUUwzVHlwZS5OYXRpdmUuSU5UKTsKKworICAgICAgICAvLyBlbXB0eSBjb2xsZWN0aW9ucworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX3ZhbHVlcyhtKSwgbWFwX2tleXMoZm0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIHNldCgpLCBsaXN0KCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChsKSwgY29sbGVjdGlvbl9jb3VudChzKSwgY29sbGVjdGlvbl9jb3VudChtKSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sbGVjdGlvbl9jb3VudChmbCksIGNvbGxlY3Rpb25fY291bnQoZnMpLCBjb2xsZWN0aW9uX2NvdW50KGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIDAsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9taW4obCksIGNvbGxlY3Rpb25fbWluKHMpLCBjb2xsZWN0aW9uX21pbihmbCksIGNvbGxlY3Rpb25fbWluKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9hdmcobCksIGNvbGxlY3Rpb25fYXZnKHMpLCBjb2xsZWN0aW9uX2F2ZyhmbCksIGNvbGxlY3Rpb25fYXZnKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIDAsIDApKTsKKworICAgICAgICAvLyBub3QgZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwsIGZsLCBzLCBmcywgbSwgZm0pICBWQUxVRVMgKDEsID8sID8sID8sID8sID8sID8pIiwKKyAgICAgICAgICAgICAgICBsaXN0KDEsIDIpLCBzZXQoMSwgMiksIGxpc3QoMSwgMiksIHNldCgxLCAyKSwgbWFwKDEsIDIsIDMsIDQpLCBtYXAoMSwgMiwgMywgNCkpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfa2V5cyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzZXQoMSwgMyksIHNldCgxLCAzKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfdmFsdWVzKG0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KGxpc3QoMiwgNCksIGxpc3QoMiwgNCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChsKSwgY29sbGVjdGlvbl9jb3VudChzKSwgY29sbGVjdGlvbl9jb3VudChtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIDIsIDIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChmbCksIGNvbGxlY3Rpb25fY291bnQoZnMpLCBjb2xsZWN0aW9uX2NvdW50KGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIDIsIDIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9taW4obCksIGNvbGxlY3Rpb25fbWluKHMpLCBjb2xsZWN0aW9uX21pbihmbCksIGNvbGxlY3Rpb25fbWluKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDEsIDEsIDEsIDEpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIDIsIDIsIDIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDMsIDMsIDMsIDMpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9hdmcobCksIGNvbGxlY3Rpb25fYXZnKHMpLCBjb2xsZWN0aW9uX2F2ZyhmbCksIGNvbGxlY3Rpb25fYXZnKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDEsIDEsIDEsIDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaWdJbnQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZShDUUwzVHlwZS5OYXRpdmUuQklHSU5UKTsKKworICAgICAgICAvLyBlbXB0eSBjb2xsZWN0aW9ucworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX3ZhbHVlcyhtKSwgbWFwX2tleXMoZm0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIHNldCgpLCBsaXN0KCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChsKSwgY29sbGVjdGlvbl9jb3VudChzKSwgY29sbGVjdGlvbl9jb3VudChtKSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sbGVjdGlvbl9jb3VudChmbCksIGNvbGxlY3Rpb25fY291bnQoZnMpLCBjb2xsZWN0aW9uX2NvdW50KGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIDAsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9taW4obCksIGNvbGxlY3Rpb25fbWluKHMpLCBjb2xsZWN0aW9uX21pbihmbCksIGNvbGxlY3Rpb25fbWluKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIDBMLCAwTCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhsKSwgY29sbGVjdGlvbl9hdmcocyksIGNvbGxlY3Rpb25fYXZnKGZsKSwgY29sbGVjdGlvbl9hdmcoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgMEwsIDBMKSk7CisKKyAgICAgICAgLy8gbm90IGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCwgcywgZnMsIG0sIGZtKSAgVkFMVUVTICgxLCA/LCA/LCA/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgbGlzdCgxTCwgMkwpLCBzZXQoMUwsIDJMKSwgbGlzdCgxTCwgMkwpLCBzZXQoMUwsIDJMKSwgbWFwKDFMLCAyTCwgM0wsIDRMKSwgbWFwKDFMLCAyTCwgM0wsIDRMKSk7CisKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX2tleXMobSksIG1hcF9rZXlzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KHNldCgxTCwgM0wpLCBzZXQoMUwsIDNMKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfdmFsdWVzKG0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KGxpc3QoMkwsIDRMKSwgbGlzdCgyTCwgNEwpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWluKGwpLCBjb2xsZWN0aW9uX21pbihzKSwgY29sbGVjdGlvbl9taW4oZmwpLCBjb2xsZWN0aW9uX21pbihmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygxTCwgMUwsIDFMLCAxTCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21heChsKSwgY29sbGVjdGlvbl9tYXgocyksIGNvbGxlY3Rpb25fbWF4KGZsKSwgY29sbGVjdGlvbl9tYXgoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMkwsIDJMLCAyTCwgMkwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDNMLCAzTCwgM0wsIDNMKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKGwpLCBjb2xsZWN0aW9uX2F2ZyhzKSwgY29sbGVjdGlvbl9hdmcoZmwpLCBjb2xsZWN0aW9uX2F2ZyhmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygxTCwgMUwsIDFMLCAxTCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsb2F0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoQ1FMM1R5cGUuTmF0aXZlLkZMT0FUKTsKKworICAgICAgICAvLyBlbXB0eSBjb2xsZWN0aW9ucworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX3ZhbHVlcyhtKSwgbWFwX2tleXMoZm0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIHNldCgpLCBsaXN0KCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChsKSwgY29sbGVjdGlvbl9jb3VudChzKSwgY29sbGVjdGlvbl9jb3VudChtKSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sbGVjdGlvbl9jb3VudChmbCksIGNvbGxlY3Rpb25fY291bnQoZnMpLCBjb2xsZWN0aW9uX2NvdW50KGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIDAsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9taW4obCksIGNvbGxlY3Rpb25fbWluKHMpLCBjb2xsZWN0aW9uX21pbihmbCksIGNvbGxlY3Rpb25fbWluKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIDBmLCAwZikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhsKSwgY29sbGVjdGlvbl9hdmcocyksIGNvbGxlY3Rpb25fYXZnKGZsKSwgY29sbGVjdGlvbl9hdmcoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgMGYsIDBmKSk7CisKKyAgICAgICAgLy8gbm90IGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCwgcywgZnMsIG0sIGZtKSAgVkFMVUVTICgxLCA/LCA/LCA/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgbGlzdCgxLjIzZiwgMi4zNGYpLCBsaXN0KDEuMjNmLCAyLjM0ZiksCisgICAgICAgICAgICAgICAgc2V0KDEuMjNmLCAyLjM0ZiksIHNldCgxLjIzZiwgMi4zNGYpLAorICAgICAgICAgICAgICAgIG1hcCgxLjIzZiwgMi4zNGYsIDMuNDVmLCA0LjU2ZiksIG1hcCgxLjIzZiwgMi4zNGYsIDMuNDVmLCA0LjU2ZikpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfa2V5cyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzZXQoMS4yM2YsIDMuNDVmKSwgc2V0KDEuMjNmLCAzLjQ1ZikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX3ZhbHVlcyhtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhsaXN0KDIuMzRmLCA0LjU2ZiksIGxpc3QoMi4zNGYsIDQuNTZmKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMS4yM2YsIDEuMjNmLCAxLjIzZiwgMS4yM2YpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDIuMzRmLCAyLjM0ZiwgMi4zNGYsIDIuMzRmKSk7CisKKyAgICAgICAgZmxvYXQgc3VtID0gMS4yM2YgKyAyLjM0ZjsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KHN1bSwgc3VtLCBzdW0sIHN1bSkpOworCisgICAgICAgIGZsb2F0IGF2ZyA9ICgxLjIzZiArIDIuMzRmKSAvIDI7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKGwpLCBjb2xsZWN0aW9uX2F2ZyhzKSwgY29sbGVjdGlvbl9hdmcoZmwpLCBjb2xsZWN0aW9uX2F2ZyhmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhhdmcsIGF2ZywgYXZnLCBhdmcpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZShDUUwzVHlwZS5OYXRpdmUuRE9VQkxFKTsKKworICAgICAgICAvLyBlbXB0eSBjb2xsZWN0aW9ucworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX3ZhbHVlcyhtKSwgbWFwX2tleXMoZm0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIHNldCgpLCBsaXN0KCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChsKSwgY29sbGVjdGlvbl9jb3VudChzKSwgY29sbGVjdGlvbl9jb3VudChtKSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sbGVjdGlvbl9jb3VudChmbCksIGNvbGxlY3Rpb25fY291bnQoZnMpLCBjb2xsZWN0aW9uX2NvdW50KGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIDAsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9taW4obCksIGNvbGxlY3Rpb25fbWluKHMpLCBjb2xsZWN0aW9uX21pbihmbCksIGNvbGxlY3Rpb25fbWluKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIDBkLCAwZCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhsKSwgY29sbGVjdGlvbl9hdmcocyksIGNvbGxlY3Rpb25fYXZnKGZsKSwgY29sbGVjdGlvbl9hdmcoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgMGQsIDBkKSk7CisKKyAgICAgICAgLy8gbm90IGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCwgcywgZnMsIG0sIGZtKSAgVkFMVUVTICgxLCA/LCA/LCA/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgbGlzdCgxLjIzZCwgMi4zNGQpLCBsaXN0KDEuMjNkLCAyLjM0ZCksCisgICAgICAgICAgICAgICAgc2V0KDEuMjNkLCAyLjM0ZCksIHNldCgxLjIzZCwgMi4zNGQpLAorICAgICAgICAgICAgICAgIG1hcCgxLjIzZCwgMi4zNGQsIDMuNDVkLCA0LjU2ZCksIG1hcCgxLjIzZCwgMi4zNGQsIDMuNDVkLCA0LjU2ZCkpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfa2V5cyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzZXQoMS4yM2QsIDMuNDVkKSwgc2V0KDEuMjNkLCAzLjQ1ZCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX3ZhbHVlcyhtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhsaXN0KDIuMzRkLCA0LjU2ZCksIGxpc3QoMi4zNGQsIDQuNTZkKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMS4yM2QsIDEuMjNkLCAxLjIzZCwgMS4yM2QpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KDIuMzRkLCAyLjM0ZCwgMi4zNGQsIDIuMzRkKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKGwpLCBjb2xsZWN0aW9uX3N1bShzKSwgY29sbGVjdGlvbl9zdW0oZmwpLCBjb2xsZWN0aW9uX3N1bShmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygzLjU3ZCwgMy41N2QsIDMuNTdkLCAzLjU3ZCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhsKSwgY29sbGVjdGlvbl9hdmcocyksIGNvbGxlY3Rpb25fYXZnKGZsKSwgY29sbGVjdGlvbl9hdmcoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMS43ODVkLCAxLjc4NWQsIDEuNzg1ZCwgMS43ODVkKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFySW50KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoQ1FMM1R5cGUuTmF0aXZlLlZBUklOVCk7CisKKyAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX2tleXMobSksIG1hcF92YWx1ZXMobSksIG1hcF9rZXlzKGZtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBzZXQoKSwgbGlzdCgpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBudWxsLCAwLCAwLCAwKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWluKGwpLCBjb2xsZWN0aW9uX21pbihzKSwgY29sbGVjdGlvbl9taW4oZmwpLCBjb2xsZWN0aW9uX21pbihmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBudWxsLCBudWxsKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWF4KGwpLCBjb2xsZWN0aW9uX21heChzKSwgY29sbGVjdGlvbl9tYXgoZmwpLCBjb2xsZWN0aW9uX21heChmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBudWxsLCBudWxsKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKGwpLCBjb2xsZWN0aW9uX3N1bShzKSwgY29sbGVjdGlvbl9zdW0oZmwpLCBjb2xsZWN0aW9uX3N1bShmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBCaWdJbnRlZ2VyLlpFUk8sIEJpZ0ludGVnZXIuWkVSTykpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhsKSwgY29sbGVjdGlvbl9hdmcocyksIGNvbGxlY3Rpb25fYXZnKGZsKSwgY29sbGVjdGlvbl9hdmcoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgQmlnSW50ZWdlci5aRVJPLCBCaWdJbnRlZ2VyLlpFUk8pKTsKKworICAgICAgICAvLyBub3QgZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwsIGZsLCBzLCBmcywgbSwgZm0pICBWQUxVRVMgKDEsID8sID8sID8sID8sID8sID8pIiwKKyAgICAgICAgICAgICAgICBsaXN0KGJpZ2ludDEsIGJpZ2ludDIpLCBsaXN0KGJpZ2ludDEsIGJpZ2ludDIpLAorICAgICAgICAgICAgICAgIHNldChiaWdpbnQxLCBiaWdpbnQyKSwgc2V0KGJpZ2ludDEsIGJpZ2ludDIpLAorICAgICAgICAgICAgICAgIG1hcChiaWdpbnQxLCBiaWdpbnQyLCBiaWdpbnQyLCBiaWdpbnQxKSwgbWFwKGJpZ2ludDEsIGJpZ2ludDIsIGJpZ2ludDIsIGJpZ2ludDEpKTsKKworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX2tleXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coc2V0KGJpZ2ludDEsIGJpZ2ludDIpLCBzZXQoYmlnaW50MSwgYmlnaW50MikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX3ZhbHVlcyhtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhsaXN0KGJpZ2ludDIsIGJpZ2ludDEpLCBsaXN0KGJpZ2ludDIsIGJpZ2ludDEpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWluKGwpLCBjb2xsZWN0aW9uX21pbihzKSwgY29sbGVjdGlvbl9taW4oZmwpLCBjb2xsZWN0aW9uX21pbihmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhiaWdpbnQxLCBiaWdpbnQxLCBiaWdpbnQxLCBiaWdpbnQxKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWF4KGwpLCBjb2xsZWN0aW9uX21heChzKSwgY29sbGVjdGlvbl9tYXgoZmwpLCBjb2xsZWN0aW9uX21heChmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhiaWdpbnQyLCBiaWdpbnQyLCBiaWdpbnQyLCBiaWdpbnQyKSk7CisKKyAgICAgICAgQmlnSW50ZWdlciBzdW0gPSBiaWdpbnQxLmFkZChiaWdpbnQyKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9zdW0obCksIGNvbGxlY3Rpb25fc3VtKHMpLCBjb2xsZWN0aW9uX3N1bShmbCksIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KHN1bSwgc3VtLCBzdW0sIHN1bSkpOworCisgICAgICAgIEJpZ0ludGVnZXIgYXZnID0gYmlnaW50MS5hZGQoYmlnaW50MikuZGl2aWRlKEJpZ0ludGVnZXIudmFsdWVPZigyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKGwpLCBjb2xsZWN0aW9uX2F2ZyhzKSwgY29sbGVjdGlvbl9hdmcoZmwpLCBjb2xsZWN0aW9uX2F2ZyhmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhhdmcsIGF2ZywgYXZnLCBhdmcpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNpbWFsKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoQ1FMM1R5cGUuTmF0aXZlLkRFQ0lNQUwpOworCisgICAgICAgIC8vIGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfdmFsdWVzKG0pLCBtYXBfa2V5cyhmbSksIG1hcF92YWx1ZXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgc2V0KCksIGxpc3QoKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgMCwgMCwgMCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21heChsKSwgY29sbGVjdGlvbl9tYXgocyksIGNvbGxlY3Rpb25fbWF4KGZsKSwgY29sbGVjdGlvbl9tYXgoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShsKSwgY29sbGVjdGlvbl9zdW0ocyksIGNvbGxlY3Rpb25fc3VtKGZsKSwgY29sbGVjdGlvbl9zdW0oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgbnVsbCwgQmlnRGVjaW1hbC5aRVJPLCBCaWdEZWNpbWFsLlpFUk8pKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9hdmcobCksIGNvbGxlY3Rpb25fYXZnKHMpLCBjb2xsZWN0aW9uX2F2ZyhmbCksIGNvbGxlY3Rpb25fYXZnKGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIEJpZ0RlY2ltYWwuWkVSTywgQmlnRGVjaW1hbC5aRVJPKSk7CisKKyAgICAgICAgLy8gbm90IGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCwgcywgZnMsIG0sIGZtKSAgVkFMVUVTICgxLCA/LCA/LCA/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgbGlzdChiaWdkZWNpbWFsMSwgYmlnZGVjaW1hbDIpLCBsaXN0KGJpZ2RlY2ltYWwxLCBiaWdkZWNpbWFsMiksCisgICAgICAgICAgICAgICAgc2V0KGJpZ2RlY2ltYWwxLCBiaWdkZWNpbWFsMiksIHNldChiaWdkZWNpbWFsMSwgYmlnZGVjaW1hbDIpLAorICAgICAgICAgICAgICAgIG1hcChiaWdkZWNpbWFsMSwgYmlnZGVjaW1hbDIsIGJpZ2RlY2ltYWwyLCBiaWdkZWNpbWFsMSksCisgICAgICAgICAgICAgICAgbWFwKGJpZ2RlY2ltYWwxLCBiaWdkZWNpbWFsMiwgYmlnZGVjaW1hbDIsIGJpZ2RlY2ltYWwxKSk7CisKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX2tleXMobSksIG1hcF9rZXlzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KHNldChiaWdkZWNpbWFsMSwgYmlnZGVjaW1hbDIpLCBzZXQoYmlnZGVjaW1hbDEsIGJpZ2RlY2ltYWwyKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfdmFsdWVzKG0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KGxpc3QoYmlnZGVjaW1hbDIsIGJpZ2RlY2ltYWwxKSwgbGlzdChiaWdkZWNpbWFsMiwgYmlnZGVjaW1hbDEpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCAyLCAyKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWluKGwpLCBjb2xsZWN0aW9uX21pbihzKSwgY29sbGVjdGlvbl9taW4oZmwpLCBjb2xsZWN0aW9uX21pbihmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhiaWdkZWNpbWFsMSwgYmlnZGVjaW1hbDEsIGJpZ2RlY2ltYWwxLCBiaWdkZWNpbWFsMSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21heChsKSwgY29sbGVjdGlvbl9tYXgocyksIGNvbGxlY3Rpb25fbWF4KGZsKSwgY29sbGVjdGlvbl9tYXgoZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coYmlnZGVjaW1hbDIsIGJpZ2RlY2ltYWwyLCBiaWdkZWNpbWFsMiwgYmlnZGVjaW1hbDIpKTsKKworICAgICAgICBCaWdEZWNpbWFsIHN1bSA9IGJpZ2RlY2ltYWwxLmFkZChiaWdkZWNpbWFsMik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKGwpLCBjb2xsZWN0aW9uX3N1bShzKSwgY29sbGVjdGlvbl9zdW0oZmwpLCBjb2xsZWN0aW9uX3N1bShmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzdW0sIHN1bSwgc3VtLCBzdW0pKTsKKworICAgICAgICBCaWdEZWNpbWFsIGF2ZyA9IGJpZ2RlY2ltYWwxLmFkZChiaWdkZWNpbWFsMikuZGl2aWRlKEJpZ0RlY2ltYWwudmFsdWVPZigyKSwgUm91bmRpbmdNb2RlLkhBTEZfRVZFTik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fYXZnKGwpLCBjb2xsZWN0aW9uX2F2ZyhzKSwgY29sbGVjdGlvbl9hdmcoZmwpLCBjb2xsZWN0aW9uX2F2ZyhmcykgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhhdmcsIGF2ZywgYXZnLCBhdmcpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc2NpaSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKENRTDNUeXBlLk5hdGl2ZS5BU0NJSSk7CisKKyAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX2tleXMobSksIG1hcF92YWx1ZXMobSksIG1hcF9rZXlzKGZtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBzZXQoKSwgbGlzdCgpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBudWxsLCAwLCAwLCAwKSk7CisKKyAgICAgICAgLy8gbm90IGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCwgcywgZnMsIG0sIGZtKSAgVkFMVUVTICgxLCA/LCA/LCA/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgbGlzdCgiYWJjIiwgImJjZCIpLCBzZXQoImFiYyIsICJiY2QiKSwKKyAgICAgICAgICAgICAgICBsaXN0KCJhYmMiLCAiYmNkIiksIHNldCgiYWJjIiwgImJjZCIpLAorICAgICAgICAgICAgICAgIG1hcCgiYWJjIiwgImJjZCIsICJjZGUiLCAiZGVmIiksIG1hcCgiYWJjIiwgImJjZCIsICJjZGUiLCAiZGVmIikpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfa2V5cyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzZXQoImFiYyIsICJjZGUiKSwgc2V0KCJhYmMiLCAiY2RlIikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX3ZhbHVlcyhtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhsaXN0KCJiY2QiLCAiZGVmIiksIGxpc3QoImJjZCIsICJkZWYiKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coImFiYyIsICJhYmMiLCAiYWJjIiwgImFiYyIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KCJiY2QiLCAiYmNkIiwgImJjZCIsICJiY2QiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKENRTDNUeXBlLk5hdGl2ZS5URVhUKTsKKworICAgICAgICAvLyBlbXB0eSBjb2xsZWN0aW9ucworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX3ZhbHVlcyhtKSwgbWFwX2tleXMoZm0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIHNldCgpLCBsaXN0KCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9jb3VudChsKSwgY29sbGVjdGlvbl9jb3VudChzKSwgY29sbGVjdGlvbl9jb3VudChtKSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sbGVjdGlvbl9jb3VudChmbCksIGNvbGxlY3Rpb25fY291bnQoZnMpLCBjb2xsZWN0aW9uX2NvdW50KGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIG51bGwsIG51bGwsIDAsIDAsIDApKTsKKworICAgICAgICAvLyBub3QgZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwsIGZsLCBzLCBmcywgbSwgZm0pICBWQUxVRVMgKDEsID8sID8sID8sID8sID8sID8pIiwKKyAgICAgICAgICAgICAgICBsaXN0KCLDoWJjIiwgImJjZCIpLCBzZXQoIsOhYmMiLCAiYmNkIiksCisgICAgICAgICAgICAgICAgbGlzdCgiw6FiYyIsICJiY2QiKSwgc2V0KCLDoWJjIiwgImJjZCIpLAorICAgICAgICAgICAgICAgIG1hcCgiw6FiYyIsICJiY2QiLCAiY2TDqSIsICJkw6lmIiksIG1hcCgiw6FiYyIsICJiY2QiLCAiY2TDqSIsICJkw6lmIikpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF9rZXlzKG0pLCBtYXBfa2V5cyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzZXQoIsOhYmMiLCAiY2TDqSIpLCBzZXQoIsOhYmMiLCAiY2TDqSIpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hcF92YWx1ZXMobSksIG1hcF92YWx1ZXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3cobGlzdCgiZMOpZiIsICJiY2QiKSwgbGlzdCgiZMOpZiIsICJiY2QiKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coImJjZCIsICJiY2QiLCAiYmNkIiwgImJjZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KCLDoWJjIiwgIsOhYmMiLCAiw6FiYyIsICLDoWJjIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW4oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZShDUUwzVHlwZS5OYXRpdmUuQk9PTEVBTik7CisKKyAgICAgICAgLy8gZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFwX2tleXMobSksIG1hcF92YWx1ZXMobSksIG1hcF9rZXlzKGZtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBzZXQoKSwgbGlzdCgpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCBudWxsLCBudWxsLCAwLCAwLCAwKSk7CisKKyAgICAgICAgLy8gbm90IGVtcHR5IGNvbGxlY3Rpb25zCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCwgcywgZnMsIG0sIGZtKSAgVkFMVUVTICgxLCA/LCA/LCA/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgbGlzdCh0cnVlLCBmYWxzZSksIHNldCh0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbGlzdCh0cnVlLCBmYWxzZSksIHNldCh0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFwKHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSksIG1hcCh0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKKworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfa2V5cyhtKSwgbWFwX2tleXMoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coc2V0KHRydWUsIGZhbHNlKSwgc2V0KHRydWUsIGZhbHNlKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXBfdmFsdWVzKG0pLCBtYXBfdmFsdWVzKGZtKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KGxpc3QodHJ1ZSwgZmFsc2UpLCBsaXN0KHRydWUsIGZhbHNlKSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGwpLCBjb2xsZWN0aW9uX2NvdW50KHMpLCBjb2xsZWN0aW9uX2NvdW50KG0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2NvdW50KGZsKSwgY29sbGVjdGlvbl9jb3VudChmcyksIGNvbGxlY3Rpb25fY291bnQoZm0pIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgMiwgMikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX21pbihsKSwgY29sbGVjdGlvbl9taW4ocyksIGNvbGxlY3Rpb25fbWluKGZsKSwgY29sbGVjdGlvbl9taW4oZnMpIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICByb3coZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY29sbGVjdGlvbl9tYXgobCksIGNvbGxlY3Rpb25fbWF4KHMpLCBjb2xsZWN0aW9uX21heChmbCksIGNvbGxlY3Rpb25fbWF4KGZzKSBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgcm93KHRydWUsIHRydWUsIHRydWUsIHRydWUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlVGFibGUoQ1FMM1R5cGUuTmF0aXZlIHR5cGUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKFN0cmluZy5mb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgayBpbnQgUFJJTUFSWSBLRVksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbCBsaXN0PCVzPiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBzIHNldDwlPHM+LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG0gbWFwPCU8cywgJTxzPiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmbCBmcm96ZW48bGlzdDwlPHM+PiwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmcyBmcm96ZW48c2V0PCU8cz4+LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZtIGZyb3plbjxtYXA8JTxzLCAlPHM+PikiLCB0eXBlKSk7CisKKyAgICAgICAgLy8gdGVzdCBmdW5jdGlvbnMgd2l0aCBhbiBlbXB0eSB0YWJsZQorICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgbWFwX2tleXMobSksIG1hcF9rZXlzKGZtKSwgbWFwX3ZhbHVlcyhtKSwgbWFwX3ZhbHVlcyhmbSkgRlJPTSAlcyIpKTsKKyAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQobCksIGNvbGxlY3Rpb25fY291bnQocyksIGNvbGxlY3Rpb25fY291bnQobSkgRlJPTSAlcyIpKTsKKyAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fY291bnQoZmwpLCBjb2xsZWN0aW9uX2NvdW50KGZzKSwgY29sbGVjdGlvbl9jb3VudChmbSkgRlJPTSAlcyIpKTsKKyAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWluKGwpLCBjb2xsZWN0aW9uX21pbihzKSwgY29sbGVjdGlvbl9taW4oZmwpLCBjb2xsZWN0aW9uX21pbihmcykgRlJPTSAlcyIpKTsKKyAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fbWF4KGwpLCBjb2xsZWN0aW9uX21heChzKSwgY29sbGVjdGlvbl9tYXgoZmwpLCBjb2xsZWN0aW9uX21heChmcykgRlJPTSAlcyIpKTsKKworICAgICAgICBTdHJpbmcgZXJyb3JNc2cgPSAicmVxdWlyZXMgYSBudW1lcmljIHNldC9saXN0IGFyZ3VtZW50IjsKKyAgICAgICAgaWYgKHR5cGUuZ2V0VHlwZSgpIGluc3RhbmNlb2YgTnVtYmVyVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKGwpLCBjb2xsZWN0aW9uX3N1bShzKSwgY29sbGVjdGlvbl9zdW0oZmwpLCBjb2xsZWN0aW9uX3N1bShmcykgRlJPTSAlcyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhsKSwgY29sbGVjdGlvbl9hdmcocyksIGNvbGxlY3Rpb25fYXZnKGZsKSwgY29sbGVjdGlvbl9hdmcoZnMpIEZST00gJXMiKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShsKSBGUk9NICVzIik7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhsKSBGUk9NICVzIik7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShzKSBGUk9NICVzIik7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhzKSBGUk9NICVzIik7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShmbCkgRlJPTSAlcyIpOworICAgICAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZShlcnJvck1zZywgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsICJTRUxFQ1QgY29sbGVjdGlvbl9hdmcoZmwpIEZST00gJXMiKTsKKyAgICAgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoZXJyb3JNc2csIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLCAiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKGZzKSBGUk9NICVzIik7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhmcykgRlJPTSAlcyIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoZXJyb3JNc2csIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLCAiU0VMRUNUIGNvbGxlY3Rpb25fc3VtKG0pIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZShlcnJvck1zZywgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsICJTRUxFQ1QgY29sbGVjdGlvbl9hdmcobSkgRlJPTSAlcyIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX3N1bShmbSkgRlJPTSAlcyIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKGVycm9yTXNnLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywgIlNFTEVDVCBjb2xsZWN0aW9uX2F2ZyhmbSkgRlJPTSAlcyIpOworCisgICAgICAgIC8vIHByZXBhcmUgZW1wdHkgY29sbGVjdGlvbnMKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwsIGZsLCBzLCBmcywgbSwgZm0pIFZBTFVFUyAoMSwgPywgPywgPywgPywgPywgPykiLAorICAgICAgICAgICAgICAgIGxpc3QoKSwgbGlzdCgpLCBzZXQoKSwgc2V0KCksIG1hcCgpLCBtYXAoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL0Z1bmN0aW9uRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9GdW5jdGlvbkZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwN2QxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9GdW5jdGlvbkZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnM7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5EdXJhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOworCitwdWJsaWMgY2xhc3MgRnVuY3Rpb25GYWN0b3J5VGVzdCBleHRlbmRzIENRTFRlc3RlcgoreworICAgIC8qKgorICAgICAqIEEgZnVuY3Rpb24gdGhhdCBqdXN0IHJldHVybnMgaXRzIG9ubHkgYXJndW1lbnQgd2l0aG91dCBhbnkgY2hhbmdlcy4KKyAgICAgKiBDYWxscyB0byB0aGlzIGZ1bmN0aW9uIHdpbGwgdHJ5IHRvIGluZmVyIHRoZSB0eXBlIG9mIGl0cyBhcmd1bWVudCwgaWYgbWlzc2luZywgZnJvbSB0aGUgZnVuY3Rpb24ncyByZWNlaXZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGdW5jdGlvbkZhY3RvcnkgSURFTlRJVFkgPSBuZXcgRnVuY3Rpb25GYWN0b3J5KCJpZGVudGl0eSIsIEZ1bmN0aW9uUGFyYW1ldGVyLmFueVR5cGUodHJ1ZSkpCisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24obmFtZS5uYW1lLCBhcmdUeXBlcy5nZXQoMCksIGFyZ1R5cGVzLmdldCgwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBleGVjdXRlKFByb3RvY29sVmVyc2lvbiBwcm90b2NvbCwgTGlzdDxCeXRlQnVmZmVyPiBwYXJhbWV0ZXJzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMuZ2V0KDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpdHMgb25seSBhcmd1bWVudC4KKyAgICAgKiBDYWxscyB0byB0aGlzIGZ1bmN0aW9uIHdvbid0IHRyeSB0byBpbmZlciB0aGUgdHlwZSBvZiBpdHMgYXJndW1lbnQsIGlmIG1pc3NpbmcsIGZyb20gdGhlIGZ1bmN0aW9uJ3MgcmVjZWl2ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRnVuY3Rpb25GYWN0b3J5IFRPX1NUUklORyA9IG5ldyBGdW5jdGlvbkZhY3RvcnkoInRvc3RyaW5nIiwgRnVuY3Rpb25QYXJhbWV0ZXIuYW55VHlwZShmYWxzZSkpCisgICAgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIE5hdGl2ZUZ1bmN0aW9uIGRvR2V0T3JDcmVhdGVGdW5jdGlvbihMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJnVHlwZXMsIEFic3RyYWN0VHlwZTw/PiByZWNlaXZlclR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlU2NhbGFyRnVuY3Rpb24obmFtZS5uYW1lLCBVVEY4VHlwZS5pbnN0YW5jZSwgYXJnVHlwZXMuZ2V0KDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGV4ZWN1dGUoUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sLCBMaXN0PEJ5dGVCdWZmZXI+IHBhcmFtZXRlcnMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gcGFyYW1ldGVycy5nZXQoMCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZShhcmdUeXBlcy5nZXQoMCkuY29tcG9zZSh2YWx1ZSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVVUlEIHV1aWQgPSBVVUlELmZyb21TdHJpbmcoIjYyYzNlOTZmLTU1Y2QtNDkzYi04YzhlLTVhMTg4ODNhMTY5OCIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRpbWVVVUlEIHRpbWVVVUlEID0gVGltZVVVSUQuZnJvbVN0cmluZygiMDAzNDY2NDItMmQyZi0xMWVkLWEyNjEtMDI0MmFjMTIwMDAyIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBiaWdpbnQgPSBuZXcgQmlnSW50ZWdlcigiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIGJpZ2RlY2ltYWwgPSBuZXcgQmlnRGVjaW1hbCgiMTIzNDU2Nzg5MC4xMjM0NTY3ODkwIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZSBkYXRlID0gbmV3IERhdGUoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEdXJhdGlvbiBkdXJhdGlvbiA9IER1cmF0aW9uLm5ld0luc3RhbmNlKDEsIDIsIDMpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEluZXRBZGRyZXNzIGluZXQgPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MoMCkuZ2V0QWRkcmVzcygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgYmxvYiA9IEJ5dGVCdWZmZXJVdGlsLmhleFRvQnl0ZXMoIkFCQ0RFRiIpOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkKKyAgICB7CisgICAgICAgIE5hdGl2ZUZ1bmN0aW9ucy5pbnN0YW5jZS5hZGQoSURFTlRJVFkpOworICAgICAgICBOYXRpdmVGdW5jdGlvbnMuaW5zdGFuY2UuYWRkKFRPX1NUUklORyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZE51bWJlck9mQXJndW1lbnRzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVkpIik7CisgICAgICAgIFN0cmluZyBtc2cgPSAiSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBmdW5jdGlvbiBzeXN0ZW0uaWRlbnRpdHkoYW55KSI7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKG1zZywgIlNFTEVDVCBpZGVudGl0eSgpIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UobXNnLCAiU0VMRUNUIGlkZW50aXR5KDEsIDIpIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UobXNnLCAiU0VMRUNUIGlkZW50aXR5KCcxJywgJzInLCAnMycpIEZST00gJXMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duRnVuY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSkiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVua25vd24gZnVuY3Rpb24gJ3Vua25vd24nIiwgIlNFTEVDVCB1bmtub3duKCkgRlJPTSAlcyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVR5cGVzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksICIgKworICAgICAgICAgICAgICAgICAgICAidGlueWludCB0aW55aW50LCAiICsKKyAgICAgICAgICAgICAgICAgICAgInNtYWxsaW50IHNtYWxsaW50LCAiICsKKyAgICAgICAgICAgICAgICAgICAgImludCBpbnQsICIgKworICAgICAgICAgICAgICAgICAgICAiYmlnaW50IGJpZ2ludCwgIiArCisgICAgICAgICAgICAgICAgICAgICJmbG9hdCBmbG9hdCwgIiArCisgICAgICAgICAgICAgICAgICAgICJkb3VibGUgZG91YmxlLCAiICsKKyAgICAgICAgICAgICAgICAgICAgInZhcmludCB2YXJpbnQsICIgKworICAgICAgICAgICAgICAgICAgICAiZGVjaW1hbCBkZWNpbWFsLCAiICsKKyAgICAgICAgICAgICAgICAgICAgInRleHQgdGV4dCwgIiArCisgICAgICAgICAgICAgICAgICAgICJhc2NpaSBhc2NpaSwgIiArCisgICAgICAgICAgICAgICAgICAgICJib29sZWFuIGJvb2xlYW4sICIgKworICAgICAgICAgICAgICAgICAgICAiZGF0ZSBkYXRlLCAiICsKKyAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCB0aW1lc3RhbXAsICIgKworICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24gZHVyYXRpb24sICIgKworICAgICAgICAgICAgICAgICAgICAidXVpZCB1dWlkLCAiICsKKyAgICAgICAgICAgICAgICAgICAgInRpbWV1dWlkIHRpbWV1dWlkLCIgKworICAgICAgICAgICAgICAgICAgICAiaW5ldCBpbmV0LCIgKworICAgICAgICAgICAgICAgICAgICAiYmxvYiBibG9iKSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZGVudGl0eSh0aW55aW50KSwgIGlkZW50aXR5KHNtYWxsaW50KSwgaWRlbnRpdHkoaW50KSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiaWRlbnRpdHkoYmlnaW50KSwgaWRlbnRpdHkoZmxvYXQpLCBpZGVudGl0eShkb3VibGUpLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZGVudGl0eSh2YXJpbnQpLCBpZGVudGl0eShkZWNpbWFsKSwgaWRlbnRpdHkodGV4dCksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgImlkZW50aXR5KGFzY2lpKSwgaWRlbnRpdHkoYm9vbGVhbiksIGlkZW50aXR5KGRhdGUpLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZGVudGl0eSh0aW1lc3RhbXApLCBpZGVudGl0eShkdXJhdGlvbiksIGlkZW50aXR5KHV1aWQpLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZGVudGl0eSh0aW1ldXVpZCksIGlkZW50aXR5KGluZXQpLCBpZGVudGl0eShibG9iKSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJGUk9NICVzIjsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoc2VsZWN0KTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0uaWRlbnRpdHkodGlueWludCkiLCAic3lzdGVtLmlkZW50aXR5KHNtYWxsaW50KSIsICJzeXN0ZW0uaWRlbnRpdHkoaW50KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0uaWRlbnRpdHkoYmlnaW50KSIsICJzeXN0ZW0uaWRlbnRpdHkoZmxvYXQpIiwgInN5c3RlbS5pZGVudGl0eShkb3VibGUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS5pZGVudGl0eSh2YXJpbnQpIiwgInN5c3RlbS5pZGVudGl0eShkZWNpbWFsKSIsICJzeXN0ZW0uaWRlbnRpdHkodGV4dCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtLmlkZW50aXR5KGFzY2lpKSIsICJzeXN0ZW0uaWRlbnRpdHkoYm9vbGVhbikiLCAic3lzdGVtLmlkZW50aXR5KGRhdGUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS5pZGVudGl0eSh0aW1lc3RhbXApIiwgInN5c3RlbS5pZGVudGl0eShkdXJhdGlvbikiLCAic3lzdGVtLmlkZW50aXR5KHV1aWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS5pZGVudGl0eSh0aW1ldXVpZCkiLCAic3lzdGVtLmlkZW50aXR5KGluZXQpIiwgInN5c3RlbS5pZGVudGl0eShibG9iKSIpOworICAgICAgICBhc3NlcnRFbXB0eShycyk7CisKKyAgICAgICAgLy8gVGVzdCB3aXRoIG5vdC1lbXB0eSB0YWJsZQorICAgICAgICBPYmplY3RbXSByb3cgPSByb3coKGJ5dGUpIDEsIChzaG9ydCkgMSwgMTIzLCAxMjNMLCAxLjIzZiwgMS4yM2QsIGJpZ2ludCwgYmlnZGVjaW1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICLDoWJjIiwgImFiYyIsIHRydWUsIDEsIGRhdGUsIGR1cmF0aW9uLCB1dWlkLCB0aW1lVVVJRCwgaW5ldCwgYmxvYik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0aW55aW50LCBzbWFsbGludCwgaW50LCBiaWdpbnQsIGZsb2F0LCBkb3VibGUsIHZhcmludCwgZGVjaW1hbCwgIiArCisgICAgICAgICAgICAgICAgInRleHQsIGFzY2lpLCBib29sZWFuLCBkYXRlLCB0aW1lc3RhbXAsIGR1cmF0aW9uLCB1dWlkLCB0aW1ldXVpZCwgaW5ldCwgYmxvYikgIiArCisgICAgICAgICAgICAgICAgIlZBTFVFUyAoMSwgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPykiLCByb3cpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoc2VsZWN0KSwgcm93KTsKKworICAgICAgICAvLyBUZXN0IHdpdGggYmluZCBtYXJrZXJzCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0aW55aW50LCBzbWFsbGludCwgaW50LCBiaWdpbnQsIGZsb2F0LCBkb3VibGUsIHZhcmludCwgZGVjaW1hbCwgIiArCisgICAgICAgICAgICAgICAgInRleHQsIGFzY2lpLCBib29sZWFuLCBkYXRlLCB0aW1lc3RhbXAsIGR1cmF0aW9uLCB1dWlkLCB0aW1ldXVpZCwgaW5ldCwgYmxvYikgIiArCisgICAgICAgICAgICAgICAgIlZBTFVFUyAoMSwgIiArCisgICAgICAgICAgICAgICAgImlkZW50aXR5KD8pLCBpZGVudGl0eSg/KSwgaWRlbnRpdHkoPyksIGlkZW50aXR5KD8pLCBpZGVudGl0eSg/KSwgaWRlbnRpdHkoPyksICIgKworICAgICAgICAgICAgICAgICJpZGVudGl0eSg/KSwgaWRlbnRpdHkoPyksIGlkZW50aXR5KD8pLCBpZGVudGl0eSg/KSwgaWRlbnRpdHkoPyksIGlkZW50aXR5KD8pLCAiICsKKyAgICAgICAgICAgICAgICAiaWRlbnRpdHkoPyksIGlkZW50aXR5KD8pLCBpZGVudGl0eSg/KSwgaWRlbnRpdHkoPyksIGlkZW50aXR5KD8pLCBpZGVudGl0eSg/KSkiLCByb3cpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoc2VsZWN0KSwgcm93KTsKKworICAgICAgICAvLyBUZXN0IGxpdGVyYWxzCisgICAgICAgIHRlc3RMaXRlcmFsKCIodGlueWludCkgMSIsIChieXRlKSAxKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIihzbWFsbGludCkgMSIsIChzaG9ydCkgMSk7CisgICAgICAgIHRlc3RMaXRlcmFsKDEyMyk7CisgICAgICAgIHRlc3RMaXRlcmFsKDEyMzQ1Njc4OTAxMjNMKTsKKyAgICAgICAgdGVzdExpdGVyYWwoMS4yMyk7CisgICAgICAgIHRlc3RMaXRlcmFsKDEyMzQ1NjcuMTIzNDU2N0QpOworICAgICAgICB0ZXN0TGl0ZXJhbChiaWdpbnQpOworICAgICAgICB0ZXN0TGl0ZXJhbChiaWdkZWNpbWFsKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIidhYmMnIiwgImFiYyIpOworICAgICAgICB0ZXN0TGl0ZXJhbCgiJ8OhYmMnIiwgIsOhYmMiKTsKKyAgICAgICAgdGVzdExpdGVyYWwodHJ1ZSk7CisgICAgICAgIHRlc3RMaXRlcmFsKGZhbHNlKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIih0aW1lc3RhbXApICcxOTcwLTAxLTAxIDAwOjAwOjAwLjAwMCswMDAwJyIsIG5ldyBEYXRlKDApKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIih0aW1lKSAnMDA6MDA6MDAuMDAwMDAwJyIsIDBMKTsKKyAgICAgICAgdGVzdExpdGVyYWwoZHVyYXRpb24pOworICAgICAgICB0ZXN0TGl0ZXJhbCh1dWlkKTsKKyAgICAgICAgdGVzdExpdGVyYWwodGltZVVVSUQpOworICAgICAgICB0ZXN0TGl0ZXJhbCgiKGluZXQpICcwLjAuMC4wJyIsIGluZXQpOworICAgICAgICB0ZXN0TGl0ZXJhbCgiMHgiICsgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChibG9iKSwgYmxvYik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0cygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCBzIHNldDxpbnQ+LCBmcyBmcm96ZW48c2V0PGludD4+KSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCBpZGVudGl0eShzKSwgaWRlbnRpdHkoZnMpIEZST00gJXMiOworICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJzID0gZXhlY3V0ZShzZWxlY3QpOworICAgICAgICBhc3NlcnRDb2x1bW5OYW1lcyhycywgInN5c3RlbS5pZGVudGl0eShzKSIsICJzeXN0ZW0uaWRlbnRpdHkoZnMpIik7CisgICAgICAgIGFzc2VydEVtcHR5KHJzKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggbm90LWVtcHR5IHRhYmxlCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzLCBmcykgVkFMVUVTICgxLCB7MSwgMn0sIHsxLCAyfSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHMsIGZzKSBWQUxVRVMgKDIsIHsxLCAyLCAzfSwgezEsIDIsIDN9KSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcywgZnMpIFZBTFVFUyAoMywgezIsIDF9LCB7MiwgMX0pIik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShzZWxlY3QpLAorICAgICAgICAgICAgICAgICAgIHJvdyhzZXQoMSwgMiksIHNldCgxLCAyKSksCisgICAgICAgICAgICAgICAgICAgcm93KHNldCgxLCAyLCAzKSwgc2V0KDEsIDIsIDMpKSwKKyAgICAgICAgICAgICAgICAgICByb3coc2V0KDIsIDEpLCBzZXQoMiwgMSkpKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggYmluZCBtYXJrZXJzCisgICAgICAgIE9iamVjdFtdIHJvdyA9IHJvdyhzZXQoMSwgMiwgMyksIHNldCg0LCA1LCA2KSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzLCBmcykgVkFMVUVTICg0LCBpZGVudGl0eSg/KSwgaWRlbnRpdHkoPykpIiwgcm93KTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgcywgZnMgRlJPTSAlcyBXSEVSRSBrID0gNCIpLCByb3cpOworCisgICAgICAgIC8vIFRlc3QgbGl0ZXJhbHMKKyAgICAgICAgdGVzdExpdGVyYWxGYWlscygiW10iKTsKKyAgICAgICAgdGVzdExpdGVyYWwoInsxLCAxMjM0NTY3ODkwfSIsIHNldCgxLCAxMjM0NTY3ODkwKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKFN0cmluZy5mb3JtYXQoInsxLCAlc30iLCBiaWdpbnQpLCBzZXQoQmlnSW50ZWdlci5PTkUsIGJpZ2ludCkpOworICAgICAgICB0ZXN0TGl0ZXJhbCgieydhYmMnfSIsIHNldCgiYWJjIikpOworICAgICAgICB0ZXN0TGl0ZXJhbCgieyfDoWJjJ30iLCBzZXQoIsOhYmMiKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKCJ7J2FiYycsICfDoWJjJ30iLCBzZXQoImFiYyIsICLDoWJjIikpOworICAgICAgICB0ZXN0TGl0ZXJhbCgieyfDoWJjJywgJ2FiYyd9Iiwgc2V0KCLDoWJjIiwgImFiYyIpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoInt0cnVlfSIsIHNldCh0cnVlKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKCJ7ZmFsc2V9Iiwgc2V0KGZhbHNlKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKFN0cmluZy5mb3JtYXQoInslc30iLCB1dWlkKSwgc2V0KHV1aWQpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoU3RyaW5nLmZvcm1hdCgieyVzfSIsIHRpbWVVVUlEKSwgc2V0KHRpbWVVVUlEKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKFN0cmluZy5mb3JtYXQoInslcywgJXN9IiwgdXVpZCwgdGltZVVVSUQpLCBzZXQodXVpZCwgdGltZVVVSUQuYXNVVUlEKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0cygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCBsIGxpc3Q8aW50PiwgZmwgZnJvemVuPGxpc3Q8aW50Pj4pIik7CisKKyAgICAgICAgLy8gVGVzdCB3aXRoIGVtcHR5IHRhYmxlCisgICAgICAgIFN0cmluZyBzZWxlY3QgPSAiU0VMRUNUIGlkZW50aXR5KGwpLCBpZGVudGl0eShmbCkgRlJPTSAlcyI7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcnMgPSBleGVjdXRlKHNlbGVjdCk7CisgICAgICAgIGFzc2VydENvbHVtbk5hbWVzKHJzLCAic3lzdGVtLmlkZW50aXR5KGwpIiwgInN5c3RlbS5pZGVudGl0eShmbCkiKTsKKyAgICAgICAgYXNzZXJ0RW1wdHkocnMpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBub3QtZW1wdHkgdGFibGUKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwsIGZsKSBWQUxVRVMgKDEsIFsxLCAyXSwgWzEsIDJdKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbCwgZmwpIFZBTFVFUyAoMiwgWzEsIDIsIDNdLCBbMSwgMiwgM10pIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCkgVkFMVUVTICgzLCBbMiwgMV0sIFsyLCAxXSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKHNlbGVjdCksCisgICAgICAgICAgICAgICAgICAgcm93KGxpc3QoMSwgMiksIGxpc3QoMSwgMikpLAorICAgICAgICAgICAgICAgICAgIHJvdyhsaXN0KDEsIDIsIDMpLCBsaXN0KDEsIDIsIDMpKSwKKyAgICAgICAgICAgICAgICAgICByb3cobGlzdCgyLCAxKSwgbGlzdCgyLCAxKSkpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBiaW5kIG1hcmtlcnMKKyAgICAgICAgT2JqZWN0W10gcm93ID0gcm93KGxpc3QoMSwgMiwgMyksIGxpc3QoNCwgNSwgNikpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbCwgZmwpIFZBTFVFUyAoNCwgaWRlbnRpdHkoPyksIGlkZW50aXR5KD8pKSIsIHJvdyk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGwsIGZsIEZST00gJXMgV0hFUkUgayA9IDQiKSwgcm93KTsKKworICAgICAgICAvLyBUZXN0IGxpdGVyYWxzCisgICAgICAgIHRlc3RMaXRlcmFsRmFpbHMoIltdIik7CisgICAgICAgIHRlc3RMaXRlcmFsKCJbMSwgMTIzNDU2Nzg5MF0iLCBsaXN0KDEsIDEyMzQ1Njc4OTApKTsKKyAgICAgICAgdGVzdExpdGVyYWwoU3RyaW5nLmZvcm1hdCgiWzEsICVzXSIsIGJpZ2ludCksIGxpc3QoQmlnSW50ZWdlci5PTkUsIGJpZ2ludCkpOworICAgICAgICB0ZXN0TGl0ZXJhbCgiWydhYmMnXSIsIGxpc3QoImFiYyIpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIlsnw6FiYyddIiwgbGlzdCgiw6FiYyIpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIlsnYWJjJywgJ8OhYmMnXSIsIGxpc3QoImFiYyIsICLDoWJjIikpOworICAgICAgICB0ZXN0TGl0ZXJhbCgiWyfDoWJjJywgJ2FiYyddIiwgbGlzdCgiw6FiYyIsICJhYmMiKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKCJbdHJ1ZV0iLCBsaXN0KHRydWUpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIltmYWxzZV0iLCBsaXN0KGZhbHNlKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKFN0cmluZy5mb3JtYXQoIlslc10iLCB1dWlkKSwgbGlzdCh1dWlkKSk7CisgICAgICAgIHRlc3RMaXRlcmFsKFN0cmluZy5mb3JtYXQoIlslc10iLCB0aW1lVVVJRCksIGxpc3QodGltZVVVSUQpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoU3RyaW5nLmZvcm1hdCgiWyVzLCAlc10iLCB1dWlkLCB0aW1lVVVJRCksIGxpc3QodXVpZCwgdGltZVVVSUQuYXNVVUlEKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIG0gbWFwPGludCwgaW50PiwgZm0gZnJvemVuPG1hcDxpbnQsIGludD4+KSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCBpZGVudGl0eShtKSwgaWRlbnRpdHkoZm0pIEZST00gJXMiOworICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJzID0gZXhlY3V0ZShzZWxlY3QpOworICAgICAgICBhc3NlcnRDb2x1bW5OYW1lcyhycywgInN5c3RlbS5pZGVudGl0eShtKSIsICJzeXN0ZW0uaWRlbnRpdHkoZm0pIik7CisgICAgICAgIGFzc2VydEVtcHR5KHJzKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggbm90LWVtcHR5IHRhYmxlCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtLCBmbSkgVkFMVUVTICgxLCB7MToxMCwgMjoyMH0sIHsxOjEwLCAyOjIwfSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0sIGZtKSBWQUxVRVMgKDIsIHsxOjEwLCAyOjIwLCAzOjMwfSwgezE6MTAsIDI6MjAsIDM6MzB9KSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSwgZm0pIFZBTFVFUyAoMywgezI6MjAsIDE6MTB9LCB7MjoyMCwgMToxMH0pIik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShzZWxlY3QpLAorICAgICAgICAgICAgICAgICAgIHJvdyhtYXAoMSwgMTAsIDIsIDIwKSwgbWFwKDEsIDEwLCAyLCAyMCkpLAorICAgICAgICAgICAgICAgICAgIHJvdyhtYXAoMSwgMTAsIDIsIDIwLCAzLCAzMCksIG1hcCgxLCAxMCwgMiwgMjAsIDMsIDMwKSksCisgICAgICAgICAgICAgICAgICAgcm93KG1hcCgxLCAxMCwgMiwgMjApLCBtYXAoMSwgMTAsIDIsIDIwKSkpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBiaW5kIG1hcmtlcnMKKyAgICAgICAgT2JqZWN0W10gcm93ID0gcm93KG1hcCgxLCAxMCwgMiwgMjApLCBtYXAoMywgMzAsIDQsIDQwKSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtLCBmbSkgVkFMVUVTICg0LCBpZGVudGl0eSg/KSwgaWRlbnRpdHkoPykpIiwgcm93KTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbSwgZm0gRlJPTSAlcyBXSEVSRSBrID0gNCIpLCByb3cpOworCisgICAgICAgIC8vIFRlc3QgbGl0ZXJhbHMKKyAgICAgICAgdGVzdExpdGVyYWxGYWlscygie30iKTsKKyAgICAgICAgdGVzdExpdGVyYWxGYWlscygiezE6IDEwLCAyOiAyMH0iKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIihtYXA8aW50LCBpbnQ+KSB7MTogMTAsIDI6IDIwfSIsIG1hcCgxLCAxMCwgMiwgMjApKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIihtYXA8aW50LCB0ZXh0PikgezE6ICdhYmMnLCAyOiAnw6FiYyd9IiwgbWFwKDEsICJhYmMiLCAyLCAiw6FiYyIpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIihtYXA8dGV4dCwgaW50PikgeydhYmMnOiAxLCAnw6FiYyc6IDJ9IiwgbWFwKCJhYmMiLCAxLCAiw6FiYyIsIDIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUdXBsZXMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdCB0dXBsZTxpbnQsIHRleHQsIGJvb2xlYW4+KSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCBpZGVudGl0eSh0KSBGUk9NICVzIjsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoc2VsZWN0KTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsICJzeXN0ZW0uaWRlbnRpdHkodCkiKTsKKyAgICAgICAgYXNzZXJ0RW1wdHkocnMpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBub3QtZW1wdHkgdGFibGUKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMSwgKDEsICdhJywgZmFsc2UpKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgyLCAoMiwgJ2InLCB0cnVlKSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMywgKDMsIG51bGwsIHRydWUpKSIpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoc2VsZWN0KSwKKyAgICAgICAgICAgICAgICAgICByb3codHVwbGUoMSwgImEiLCBmYWxzZSkpLAorICAgICAgICAgICAgICAgICAgIHJvdyh0dXBsZSgyLCAiYiIsIHRydWUpKSwKKyAgICAgICAgICAgICAgICAgICByb3codHVwbGUoMywgbnVsbCwgdHJ1ZSkpKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggYmluZCBtYXJrZXJzCisgICAgICAgIE9iamVjdFtdIHJvdyA9IHJvdyh0dXBsZSg0LCAiZCIsIGZhbHNlKSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDQsIGlkZW50aXR5KD8pKSIsIHJvdyk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHQgRlJPTSAlcyBXSEVSRSBrID0gNCIpLCByb3cpOworCisgICAgICAgIC8vIFRlc3QgbGl0ZXJhbHMKKyAgICAgICAgdGVzdExpdGVyYWxGYWlscygiKDEpIik7CisgICAgICAgIHRlc3RMaXRlcmFsKCIodHVwbGU8aW50PikgKDEpIiwgdHVwbGUoMSkpOworICAgICAgICB0ZXN0TGl0ZXJhbCgiKDEsICdhJykiLCB0dXBsZSgxLCAiYSIpKTsKKyAgICAgICAgdGVzdExpdGVyYWwoIigxLCAnYScsIGZhbHNlKSIsIHR1cGxlKDEsICJhIiwgZmFsc2UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVRFRzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIHVkdCA9IGNyZWF0ZVR5cGUoIkNSRUFURSBUWVBFICVzICh4IGludCkiKTsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHUgZnJvemVuPCIgKyB1ZHQgKyAiPiwgZnUgZnJvemVuPCIgKyB1ZHQgKyAiPikiKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggZW1wdHkgdGFibGUKKyAgICAgICAgU3RyaW5nIHNlbGVjdCA9ICJTRUxFQ1QgaWRlbnRpdHkodSksIGlkZW50aXR5KGZ1KSBGUk9NICVzIjsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoc2VsZWN0KTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsICJzeXN0ZW0uaWRlbnRpdHkodSkiLCAic3lzdGVtLmlkZW50aXR5KGZ1KSIpOworICAgICAgICBhc3NlcnRFbXB0eShycyk7CisKKyAgICAgICAgLy8gVGVzdCB3aXRoIG5vdC1lbXB0eSB0YWJsZQorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdSwgZnUpIFZBTFVFUyAoMSwge3g6IDJ9LCBudWxsKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdSwgZnUpIFZBTFVFUyAoMiwge3g6IDR9LCB7eDogNn0pIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB1LCBmdSkgVkFMVUVTICg0LCBudWxsLCB7eDogOH0pIik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShzZWxlY3QpLAorICAgICAgICAgICAgICAgICAgIHJvdyh1c2VyVHlwZSgieCIsIDIpLCBudWxsKSwKKyAgICAgICAgICAgICAgICAgICByb3codXNlclR5cGUoIngiLCA0KSwgdXNlclR5cGUoIngiLCA2KSksCisgICAgICAgICAgICAgICAgICAgcm93KG51bGwsIHVzZXJUeXBlKCJ4IiwgOCkpKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggYmluZCBtYXJrZXJzCisgICAgICAgIE9iamVjdFtdIHJvdyA9IHJvdyh1c2VyVHlwZSgieCIsIDQpLCB1c2VyVHlwZSgieCIsIDUpKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHUsIGZ1KSBWQUxVRVMgKDQsIGlkZW50aXR5KD8pLCBpZGVudGl0eSg/KSkiLCByb3cpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCB1LCBmdSBGUk9NICVzIFdIRVJFIGsgPSA0IiksIHJvdyk7CisKKyAgICAgICAgLy8gVGVzdCBsaXRlcmFscworICAgICAgICB0ZXN0TGl0ZXJhbEZhaWxzKCJ7fSIpOworICAgICAgICB0ZXN0TGl0ZXJhbEZhaWxzKCJ7eDogMTB9Iik7CisgICAgICAgIHRlc3RMaXRlcmFsKCcoJyArIHVkdCArICIpe3g6IDEwfSIsIHR1cGxlKDEwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQ2FsbHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiBpbnQsIHQgdGV4dCkiKTsKKworICAgICAgICAvLyBUZXN0IGZ1bmN0aW9uIHRoYXQgaW5mZXJzIHBhcmFtZXRlciB0eXBlIGZyb20gcmVjZWl2ZXIgdHlwZQorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgxLCBpZGVudGl0eShpZGVudGl0eSgyKSkpIik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHYgRlJPTSAlcyBXSEVSRSBrID0gMSIpLCByb3coMikpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgxLCBpZGVudGl0eShpZGVudGl0eSgoaW50KSA/KSkpIiwgMyk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHYgRlJPTSAlcyBXSEVSRSBrID0gMSIpLCByb3coMykpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBpZGVudGl0eShpZGVudGl0eSh2KSkgRlJPTSAlcyBXSEVSRSBrID0gMSIpLCByb3coMykpOworCisgICAgICAgIC8vIFRlc3QgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdCBpbmZlciBwYXJhbWV0ZXIgdHlwZSBmcm9tIHJlY2VpdmVyIHR5cGUKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMSwgdG9zdHJpbmcodG9zdHJpbmcoNCkpKSIpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCB0IEZST00gJXMgV0hFUkUgayA9IDEiKSwgcm93KCI0IikpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgxLCB0b3N0cmluZyh0b3N0cmluZygoaW50KSA/KSkpIiwgNSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHRvc3RyaW5nKHRvc3RyaW5nKHQpKSBGUk9NICVzIFdIRVJFIGsgPSAxIiksIHJvdygiNSIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdExpdGVyYWwoT2JqZWN0IGxpdGVyYWwpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRlc3RMaXRlcmFsKGxpdGVyYWwsIGxpdGVyYWwpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0TGl0ZXJhbChPYmplY3QgZnVuY3Rpb25BcmdzLCBPYmplY3QgZXhwZWN0ZWRSZXN1bHQpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgJXMoJXMpIEZST00gJSVzIExJTUlUIDEiLCBJREVOVElUWS5uYW1lKCksIGZ1bmN0aW9uQXJncykpLAorICAgICAgICAgICAgICAgICAgIHJvdyhleHBlY3RlZFJlc3VsdCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0TGl0ZXJhbEZhaWxzKE9iamVjdCBmdW5jdGlvbkFyZ3MpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJDYW5ub3QgaW5mZXIgdHlwZSBvZiBhcmd1bWVudCAiICsgZnVuY3Rpb25BcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgJXMoJXMpIEZST00gJSVzIiwgSURFTlRJVFkubmFtZSgpLCBmdW5jdGlvbkFyZ3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvTWF0aEZjdHNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvTWF0aEZjdHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlZmMwYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9NYXRoRmN0c1Rlc3QuamF2YQpAQCAtMCwwICsxLDMzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9uczsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQ291bnRlckNvbHVtblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Eb3VibGVUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuRmxvYXRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50ZWdlclR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkRlY2ltYWxUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTG9uZ1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5OdW1iZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuU2hvcnRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBNYXRoRmN0c1Rlc3QKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBYnMoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDEsIEludDMyVHlwZS5pbnN0YW5jZSwgMSk7CisgICAgICAgIGFzc2VydEFic0VxdWFscygwLCBJbnQzMlR5cGUuaW5zdGFuY2UsIDApOworICAgICAgICBhc3NlcnRBYnNFcXVhbHMoMywgSW50MzJUeXBlLmluc3RhbmNlLCAtMyk7CisKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKChieXRlKSAxLCBCeXRlVHlwZS5pbnN0YW5jZSwgKGJ5dGUpIDEpOworICAgICAgICBhc3NlcnRBYnNFcXVhbHMoKGJ5dGUpIDAsIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgMCk7CisgICAgICAgIGFzc2VydEFic0VxdWFscygoYnl0ZSkgMywgQnl0ZVR5cGUuaW5zdGFuY2UsIChieXRlKSAtMyk7CisKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKChzaG9ydCkgMSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIDEpOworICAgICAgICBhc3NlcnRBYnNFcXVhbHMoKHNob3J0KSAwLCBTaG9ydFR5cGUuaW5zdGFuY2UsIChzaG9ydCkgMCk7CisgICAgICAgIGFzc2VydEFic0VxdWFscygoc2hvcnQpIDMsIFNob3J0VHlwZS5pbnN0YW5jZSwgKHNob3J0KSAtMyk7CisKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDFGLCBGbG9hdFR5cGUuaW5zdGFuY2UsIDFGKTsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDEuNUYsIEZsb2F0VHlwZS5pbnN0YW5jZSwgMS41Rik7CisgICAgICAgIGFzc2VydEFic0VxdWFscygwRiwgRmxvYXRUeXBlLmluc3RhbmNlLCAwRik7CisgICAgICAgIGFzc2VydEFic0VxdWFscygzRiwgRmxvYXRUeXBlLmluc3RhbmNlLCAtM0YpOworICAgICAgICBhc3NlcnRBYnNFcXVhbHMoMy43RiwgRmxvYXRUeXBlLmluc3RhbmNlLCAtMy43Rik7CisKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDFMLCBMb25nVHlwZS5pbnN0YW5jZSwgMUwpOworICAgICAgICBhc3NlcnRBYnNFcXVhbHMoMEwsIExvbmdUeXBlLmluc3RhbmNlLCAwTCk7CisgICAgICAgIGFzc2VydEFic0VxdWFscygzTCwgTG9uZ1R5cGUuaW5zdGFuY2UsIC0zTCk7CisKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDFMLCBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSwgMUwpOworICAgICAgICBhc3NlcnRBYnNFcXVhbHMoMEwsIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCAwTCk7CisgICAgICAgIGFzc2VydEFic0VxdWFscygzTCwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIC0zTCk7CisKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDEuMCwgRG91YmxlVHlwZS5pbnN0YW5jZSwgMS4wKTsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDEuNSwgRG91YmxlVHlwZS5pbnN0YW5jZSwgMS41KTsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDAuMCwgRG91YmxlVHlwZS5pbnN0YW5jZSwgMC4wKTsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKDMuMCwgRG91YmxlVHlwZS5pbnN0YW5jZSwgLTMuMCk7CisgICAgICAgIGFzc2VydEFic0VxdWFscygzLjcsIERvdWJsZVR5cGUuaW5zdGFuY2UsIC0zLjcpOworCisgICAgICAgIGFzc2VydEFic0VxdWFscyhCaWdJbnRlZ2VyLk9ORSwgSW50ZWdlclR5cGUuaW5zdGFuY2UsIEJpZ0ludGVnZXIuT05FKTsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKEJpZ0ludGVnZXIuWkVSTywgSW50ZWdlclR5cGUuaW5zdGFuY2UsIEJpZ0ludGVnZXIuWkVSTyk7CisgICAgICAgIGFzc2VydEFic0VxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMyksIEludGVnZXJUeXBlLmluc3RhbmNlLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTMpKTsKKworICAgICAgICBhc3NlcnRBYnNFcXVhbHMoQmlnRGVjaW1hbC5PTkUsIERlY2ltYWxUeXBlLmluc3RhbmNlLCBCaWdEZWNpbWFsLk9ORSk7CisgICAgICAgIGFzc2VydEFic0VxdWFscyhCaWdEZWNpbWFsLnZhbHVlT2YoMS41KSwgRGVjaW1hbFR5cGUuaW5zdGFuY2UsIEJpZ0RlY2ltYWwudmFsdWVPZigxLjUpKTsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKEJpZ0RlY2ltYWwuWkVSTywgRGVjaW1hbFR5cGUuaW5zdGFuY2UsIEJpZ0RlY2ltYWwuWkVSTyk7CisgICAgICAgIGFzc2VydEFic0VxdWFscyhCaWdEZWNpbWFsLnZhbHVlT2YoMyksIERlY2ltYWxUeXBlLmluc3RhbmNlLCBCaWdEZWNpbWFsLnZhbHVlT2YoLTMpKTsKKyAgICAgICAgYXNzZXJ0QWJzRXF1YWxzKEJpZ0RlY2ltYWwudmFsdWVPZigzLjcpLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQmlnRGVjaW1hbC52YWx1ZU9mKC0zLjcpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgTnVtYmVyPiB2b2lkIGFzc2VydEFic0VxdWFscyhUIGV4cGVjdGVkLCBOdW1iZXJUeXBlPFQ+IGlucHV0VHlwZSwgVCBpbnB1dFZhbHVlKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmN0RXF1YWxzKE1hdGhGY3RzLmFic0ZjdChpbnB1dFR5cGUpLCBleHBlY3RlZCwgaW5wdXRUeXBlLCBpbnB1dFZhbHVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHAoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChpbnQpIE1hdGgucG93KE1hdGguRSwgNSksIEludDMyVHlwZS5pbnN0YW5jZSwgNSk7CisgICAgICAgIGFzc2VydEV4cEVxdWFscygoaW50KSBNYXRoLkUsIEludDMyVHlwZS5pbnN0YW5jZSwgMSk7CisgICAgICAgIGFzc2VydEV4cEVxdWFscygxLCBJbnQzMlR5cGUuaW5zdGFuY2UsIDApOworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoKGludCkgTWF0aC5wb3coTWF0aC5FLCAtMSksIEludDMyVHlwZS5pbnN0YW5jZSwgLTEpOworCisgICAgICAgIGFzc2VydEV4cEVxdWFscygoYnl0ZSkgTWF0aC5wb3coTWF0aC5FLCA1KSwgQnl0ZVR5cGUuaW5zdGFuY2UsIChieXRlKSA1KTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChieXRlKSBNYXRoLkUsIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgMSk7CisgICAgICAgIGFzc2VydEV4cEVxdWFscygoYnl0ZSkgMSwgQnl0ZVR5cGUuaW5zdGFuY2UsIChieXRlKSAwKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChieXRlKSBNYXRoLnBvdyhNYXRoLkUsIC0xKSwgQnl0ZVR5cGUuaW5zdGFuY2UsIChieXRlKSAtMSk7CisKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChzaG9ydCkgTWF0aC5wb3coTWF0aC5FLCA1KSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIDUpOworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoKHNob3J0KSBNYXRoLkUsIFNob3J0VHlwZS5pbnN0YW5jZSwgKHNob3J0KSAxKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChzaG9ydCkgMSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIDApOworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoKHNob3J0KSBNYXRoLnBvdyhNYXRoLkUsIC0xKSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIC0xKTsKKworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoKGZsb2F0KSBNYXRoLnBvdyhNYXRoLkUsIDUpLCBGbG9hdFR5cGUuaW5zdGFuY2UsIDVGKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChmbG9hdCkgTWF0aC5FLCBGbG9hdFR5cGUuaW5zdGFuY2UsIDFGKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKDFGLCBGbG9hdFR5cGUuaW5zdGFuY2UsIDBGKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChmbG9hdCkgTWF0aC5wb3coTWF0aC5FLCAtMSksIEZsb2F0VHlwZS5pbnN0YW5jZSwgLTFGKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChmbG9hdCkgTWF0aC5wb3coTWF0aC5FLCAtMi41KSwgRmxvYXRUeXBlLmluc3RhbmNlLCAtMi41Rik7CisKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKChsb25nKSBNYXRoLnBvdyhNYXRoLkUsIDUpLCBMb25nVHlwZS5pbnN0YW5jZSwgNUwpOworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoKGxvbmcpIE1hdGguRSwgTG9uZ1R5cGUuaW5zdGFuY2UsIDFMKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKDFMLCBMb25nVHlwZS5pbnN0YW5jZSwgMEwpOworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoKGxvbmcpIE1hdGgucG93KE1hdGguRSwgLTEpLCBMb25nVHlwZS5pbnN0YW5jZSwgLTFMKTsKKworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoKGxvbmcpIE1hdGgucG93KE1hdGguRSwgNSksIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCA1TCk7CisgICAgICAgIGFzc2VydEV4cEVxdWFscygobG9uZykgTWF0aC5FLCBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSwgMUwpOworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoMUwsIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCAwTCk7CisgICAgICAgIGFzc2VydEV4cEVxdWFscygobG9uZykgTWF0aC5wb3coTWF0aC5FLCAtMSksIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCAtMUwpOworCisgICAgICAgIGFzc2VydEV4cEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoKGxvbmcpIE1hdGgucG93KE1hdGguRSwgNSkpLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgQmlnSW50ZWdlci52YWx1ZU9mKDUpKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigobG9uZykgTWF0aC5FKSwgSW50ZWdlclR5cGUuaW5zdGFuY2UsIEJpZ0ludGVnZXIudmFsdWVPZigxKSk7CisgICAgICAgIGFzc2VydEV4cEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoMSksIEludGVnZXJUeXBlLmluc3RhbmNlLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMCkpOworICAgICAgICBhc3NlcnRFeHBFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKChsb25nKSBNYXRoLnBvdyhNYXRoLkUsIC0xKSksIEludGVnZXJUeXBlLmluc3RhbmNlLCBCaWdJbnRlZ2VyLnZhbHVlT2YoLTEpKTsKKworICAgICAgICBhc3NlcnRFeHBFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjE0OC40MTMxNTkxMDI1NzY2MDM0MjExMTU1ODAwNDA1NSIpLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQmlnRGVjaW1hbC52YWx1ZU9mKDUpKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjciKSwgRGVjaW1hbFR5cGUuaW5zdGFuY2UsIEJpZ0RlY2ltYWwudmFsdWVPZigxKSk7CisgICAgICAgIGFzc2VydEV4cEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMSIpLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQmlnRGVjaW1hbC52YWx1ZU9mKDApKTsKKyAgICAgICAgYXNzZXJ0RXhwRXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIwLjM2Nzg3OTQ0MTE3MTQ0MjMyMTU5NTUyMzc3MDE2MTQ2IiksIERlY2ltYWxUeXBlLmluc3RhbmNlLCBCaWdEZWNpbWFsLnZhbHVlT2YoLTEpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgTnVtYmVyPiB2b2lkIGFzc2VydEV4cEVxdWFscyhUIGV4cGVjdGVkLCBOdW1iZXJUeXBlPFQ+IGlucHV0VHlwZSwgVCBpbnB1dFZhbHVlKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmN0RXF1YWxzKE1hdGhGY3RzLmV4cEZjdChpbnB1dFR5cGUpLCBleHBlY3RlZCwgaW5wdXRUeXBlLCBpbnB1dFZhbHVlKTsKKyAgICB9CisKKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nKCkKKyAgICB7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygoaW50KSBNYXRoLmxvZyg1KSwgSW50MzJUeXBlLmluc3RhbmNlLCA1KTsKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKDAsIEludDMyVHlwZS5pbnN0YW5jZSwgKGludCkgTWF0aC5FKTsKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKDAsIEludDMyVHlwZS5pbnN0YW5jZSwgMSk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygoaW50KSBNYXRoLmxvZygtMSksIEludDMyVHlwZS5pbnN0YW5jZSwgLTEpOworCisgICAgICAgIGFzc2VydExvZ0VxdWFscygoYnl0ZSkgTWF0aC5sb2coNSksIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgNSk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygoYnl0ZSkgMCwgQnl0ZVR5cGUuaW5zdGFuY2UsIChieXRlKSBNYXRoLkUpOworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoKGJ5dGUpIDAsIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgMSk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygoYnl0ZSkgTWF0aC5sb2coLTEpLCBCeXRlVHlwZS5pbnN0YW5jZSwgKGJ5dGUpIC0xKTsKKworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoKHNob3J0KSBNYXRoLmxvZyg1KSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIDUpOworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoKHNob3J0KSAwLCBTaG9ydFR5cGUuaW5zdGFuY2UsIChzaG9ydCkgTWF0aC5FKTsKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKChzaG9ydCkgMCwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIDEpOworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoKHNob3J0KSBNYXRoLmxvZygtMSksIFNob3J0VHlwZS5pbnN0YW5jZSwgKHNob3J0KSAtMSk7CisKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKChmbG9hdCkgTWF0aC5sb2coNS41RiksIEZsb2F0VHlwZS5pbnN0YW5jZSwgNS41RiwgMC4wMDAwMDAxKTsKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKDFGLCBGbG9hdFR5cGUuaW5zdGFuY2UsIChmbG9hdCkgTWF0aC5FLCAwLjAwMDAwMDEpOworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoMEYsIEZsb2F0VHlwZS5pbnN0YW5jZSwgMUYsIDAuMDAwMDAwMSk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygoZmxvYXQpIE1hdGgubG9nKC0xRiksIEZsb2F0VHlwZS5pbnN0YW5jZSwgLTFGLCAwLjAwMDAwMDEpOworCisKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKChsb25nKSBNYXRoLmxvZyg1KSwgTG9uZ1R5cGUuaW5zdGFuY2UsIDVMKTsKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKDBMLCBMb25nVHlwZS5pbnN0YW5jZSwgKGxvbmcpIE1hdGguRSk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygwTCwgTG9uZ1R5cGUuaW5zdGFuY2UsIDFMKTsKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKChsb25nKSBNYXRoLmxvZygtMSksIExvbmdUeXBlLmluc3RhbmNlLCAtMUwpOworCisgICAgICAgIGFzc2VydExvZ0VxdWFscygobG9uZykgTWF0aC5sb2coNSksIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCA1TCk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygwTCwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIChsb25nKSBNYXRoLkUpOworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoMEwsIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCAxTCk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscygobG9uZykgTWF0aC5sb2coLTEpLCBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSwgLTFMKTsKKworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKChsb25nKSBNYXRoLmxvZyg1KSksIEludGVnZXJUeXBlLmluc3RhbmNlLCBCaWdJbnRlZ2VyLnZhbHVlT2YoNSkpOworICAgICAgICBhc3NlcnRMb2dFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgQmlnSW50ZWdlci52YWx1ZU9mKChsb25nKSBNYXRoLkUpKTsKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKEJpZ0ludGVnZXIudmFsdWVPZigwKSwgSW50ZWdlclR5cGUuaW5zdGFuY2UsIEJpZ0ludGVnZXIudmFsdWVPZigxKSk7CisKKyAgICAgICAgYXNzZXJ0TG9nRXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIxLjYwOTQzNzkxMjQzNDEwMDM3NDYwMDc1OTMzMzIyNjIiKSwgRGVjaW1hbFR5cGUuaW5zdGFuY2UsIEJpZ0RlY2ltYWwudmFsdWVPZig1KSk7CisgICAgICAgIGFzc2VydExvZ0VxdWFscyhuZXcgQmlnRGVjaW1hbCgiMCIpLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQmlnRGVjaW1hbC52YWx1ZU9mKDEpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgTnVtYmVyPiB2b2lkIGFzc2VydExvZ0VxdWFscyhUIGV4cGVjdGVkLCBOdW1iZXJUeXBlPFQ+IGlucHV0VHlwZSwgVCBpbnB1dFZhbHVlKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmN0RXF1YWxzKE1hdGhGY3RzLmxvZ0ZjdChpbnB1dFR5cGUpLCBleHBlY3RlZCwgaW5wdXRUeXBlLCBpbnB1dFZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgTnVtYmVyPiB2b2lkIGFzc2VydExvZ0VxdWFscyhUIGV4cGVjdGVkLCBOdW1iZXJUeXBlPFQ+IGlucHV0VHlwZSwgVCBpbnB1dFZhbHVlLCBkb3VibGUgZGVsdGEpCisgICAgeworICAgICAgICBhc3NlcnRGY3RFcXVhbHMoTWF0aEZjdHMubG9nRmN0KGlucHV0VHlwZSksIGV4cGVjdGVkLCBpbnB1dFR5cGUsIGlucHV0VmFsdWUsIGRlbHRhKTsKKyAgICB9CisgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nMTAoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoKGludCkgTWF0aC5sb2cxMCg1KSwgSW50MzJUeXBlLmluc3RhbmNlLCA1KTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoMCwgSW50MzJUeXBlLmluc3RhbmNlLCAoaW50KSBNYXRoLkUpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygwLCBJbnQzMlR5cGUuaW5zdGFuY2UsIDEpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygoaW50KSBNYXRoLmxvZzEwKC0xKSwgSW50MzJUeXBlLmluc3RhbmNlLCAtMSk7CisKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoKGJ5dGUpIE1hdGgubG9nMTAoNSksIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgNSk7CisgICAgICAgIGFzc2VydExvZzEwRXF1YWxzKChieXRlKSAwLCBCeXRlVHlwZS5pbnN0YW5jZSwgKGJ5dGUpIE1hdGguRSk7CisgICAgICAgIGFzc2VydExvZzEwRXF1YWxzKChieXRlKSAwLCBCeXRlVHlwZS5pbnN0YW5jZSwgKGJ5dGUpIDEpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygoYnl0ZSkgTWF0aC5sb2cxMCgtMSksIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgLTEpOworCisgICAgICAgIGFzc2VydExvZzEwRXF1YWxzKChzaG9ydCkgTWF0aC5sb2cxMCg1KSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIDUpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygoc2hvcnQpIDAsIFNob3J0VHlwZS5pbnN0YW5jZSwgKHNob3J0KSBNYXRoLkUpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygoc2hvcnQpIDAsIFNob3J0VHlwZS5pbnN0YW5jZSwgKHNob3J0KSAxKTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoKHNob3J0KSBNYXRoLmxvZzEwKC0xKSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIC0xKTsKKworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygoZmxvYXQpIE1hdGgubG9nMTAoNS41RiksIEZsb2F0VHlwZS5pbnN0YW5jZSwgNS41RiwgMC4wMDAwMDAxKTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoMUYsIEZsb2F0VHlwZS5pbnN0YW5jZSwgMTBGLCAwLjAwMDAwMDEpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygwRiwgRmxvYXRUeXBlLmluc3RhbmNlLCAxRiwgMC4wMDAwMDAxKTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoKGZsb2F0KSBNYXRoLmxvZzEwKC0xRiksIEZsb2F0VHlwZS5pbnN0YW5jZSwgLTFGLCAwLjAwMDAwMDEpOworCisKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoKGxvbmcpIE1hdGgubG9nMTAoNSksIExvbmdUeXBlLmluc3RhbmNlLCA1TCk7CisgICAgICAgIGFzc2VydExvZzEwRXF1YWxzKDBMLCBMb25nVHlwZS5pbnN0YW5jZSwgKGxvbmcpIE1hdGguRSk7CisgICAgICAgIGFzc2VydExvZzEwRXF1YWxzKDBMLCBMb25nVHlwZS5pbnN0YW5jZSwgMUwpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygobG9uZykgTWF0aC5sb2cxMCgtMSksIExvbmdUeXBlLmluc3RhbmNlLCAtMUwpOworCisgICAgICAgIGFzc2VydExvZzEwRXF1YWxzKChsb25nKSBNYXRoLmxvZzEwKDUpLCBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSwgNUwpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygwTCwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIChsb25nKSBNYXRoLkUpOworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscygwTCwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIDFMKTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoKGxvbmcpIE1hdGgubG9nMTAoLTEpLCBDb3VudGVyQ29sdW1uVHlwZS5pbnN0YW5jZSwgLTFMKTsKKworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscyhCaWdJbnRlZ2VyLnZhbHVlT2YoKGxvbmcpIE1hdGgubG9nMTAoNSkpLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgQmlnSW50ZWdlci52YWx1ZU9mKDUpKTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgQmlnSW50ZWdlci52YWx1ZU9mKChsb25nKSBNYXRoLkUpKTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgQmlnSW50ZWdlci52YWx1ZU9mKDEpKTsKKworICAgICAgICBhc3NlcnRMb2cxMEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMC42OTg5NzAwMDQzMzYwMTg4MDQ3ODYyNjExMDUyNzU1MSIpLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQmlnRGVjaW1hbC52YWx1ZU9mKDUpKTsKKyAgICAgICAgYXNzZXJ0TG9nMTBFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjAiKSwgRGVjaW1hbFR5cGUuaW5zdGFuY2UsIEJpZ0RlY2ltYWwudmFsdWVPZigxKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VCBleHRlbmRzIE51bWJlcj4gdm9pZCBhc3NlcnRMb2cxMEVxdWFscyhUIGV4cGVjdGVkLCBOdW1iZXJUeXBlPFQ+IGlucHV0VHlwZSwgVCBpbnB1dFZhbHVlKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmN0RXF1YWxzKE1hdGhGY3RzLmxvZzEwRmN0KGlucHV0VHlwZSksIGV4cGVjdGVkLCBpbnB1dFR5cGUsIGlucHV0VmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBOdW1iZXI+IHZvaWQgYXNzZXJ0TG9nMTBFcXVhbHMoVCBleHBlY3RlZCwgTnVtYmVyVHlwZTxUPiBpbnB1dFR5cGUsIFQgaW5wdXRWYWx1ZSwgZG91YmxlIGRlbHRhKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmN0RXF1YWxzKE1hdGhGY3RzLmxvZzEwRmN0KGlucHV0VHlwZSksIGV4cGVjdGVkLCBpbnB1dFR5cGUsIGlucHV0VmFsdWUsIGRlbHRhKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb3VuZCgpCisgICAgeworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscyg1LCBJbnQzMlR5cGUuaW5zdGFuY2UsIDUpOworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscygwLCBJbnQzMlR5cGUuaW5zdGFuY2UsIDApOworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscygtMSwgSW50MzJUeXBlLmluc3RhbmNlLCAtMSk7CisKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoKGJ5dGUpIDUsIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgNSk7CisgICAgICAgIGFzc2VydFJvdW5kRXF1YWxzKChieXRlKSAwLCBCeXRlVHlwZS5pbnN0YW5jZSwgKGJ5dGUpIDApOworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscygoYnl0ZSkgLTEsIEJ5dGVUeXBlLmluc3RhbmNlLCAoYnl0ZSkgLTEpOworCisgICAgICAgIGFzc2VydFJvdW5kRXF1YWxzKChzaG9ydCkgNSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIDUpOworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscygoc2hvcnQpIDAsIFNob3J0VHlwZS5pbnN0YW5jZSwgKHNob3J0KSAwKTsKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoKHNob3J0KSAtMSwgU2hvcnRUeXBlLmluc3RhbmNlLCAoc2hvcnQpIC0xKTsKKworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscygoZmxvYXQpIE1hdGgucm91bmQoNS41RiksIEZsb2F0VHlwZS5pbnN0YW5jZSwgNS41Rik7CisgICAgICAgIGFzc2VydFJvdW5kRXF1YWxzKDFGLCBGbG9hdFR5cGUuaW5zdGFuY2UsIDFGKTsKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoMEYsIEZsb2F0VHlwZS5pbnN0YW5jZSwgMEYpOworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscygoZmxvYXQpIE1hdGgucm91bmQoLTEuNUYpLCBGbG9hdFR5cGUuaW5zdGFuY2UsIC0xLjVGKTsKKworCisgICAgICAgIGFzc2VydFJvdW5kRXF1YWxzKDVMLCBMb25nVHlwZS5pbnN0YW5jZSwgNUwpOworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscygwTCwgTG9uZ1R5cGUuaW5zdGFuY2UsIDBMKTsKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoLTFMLCBMb25nVHlwZS5pbnN0YW5jZSwgLTFMKTsKKworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscyg1TCwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIDVMKTsKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoMEwsIENvdW50ZXJDb2x1bW5UeXBlLmluc3RhbmNlLCAwTCk7CisgICAgICAgIGFzc2VydFJvdW5kRXF1YWxzKC0xTCwgQ291bnRlckNvbHVtblR5cGUuaW5zdGFuY2UsIC0xTCk7CisKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDUpLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgQmlnSW50ZWdlci52YWx1ZU9mKDUpKTsKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKDApLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgQmlnSW50ZWdlci52YWx1ZU9mKDApKTsKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMoQmlnSW50ZWdlci52YWx1ZU9mKC0xKSwgSW50ZWdlclR5cGUuaW5zdGFuY2UsIEJpZ0ludGVnZXIudmFsdWVPZigtMSkpOworCisgICAgICAgIGFzc2VydFJvdW5kRXF1YWxzKG5ldyBCaWdEZWNpbWFsKCI2IiksIERlY2ltYWxUeXBlLmluc3RhbmNlLCBCaWdEZWNpbWFsLnZhbHVlT2YoNS41KSk7CisgICAgICAgIGFzc2VydFJvdW5kRXF1YWxzKG5ldyBCaWdEZWNpbWFsKCIxIiksIERlY2ltYWxUeXBlLmluc3RhbmNlLCBCaWdEZWNpbWFsLnZhbHVlT2YoMSkpOworICAgICAgICBhc3NlcnRSb3VuZEVxdWFscyhuZXcgQmlnRGVjaW1hbCgiMCIpLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQmlnRGVjaW1hbC52YWx1ZU9mKDApKTsKKyAgICAgICAgYXNzZXJ0Um91bmRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIi0yIiksIERlY2ltYWxUeXBlLmluc3RhbmNlLCBCaWdEZWNpbWFsLnZhbHVlT2YoLTEuNSkpOworICAgIH0KKworICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBOdW1iZXI+IHZvaWQgYXNzZXJ0Um91bmRFcXVhbHMoVCBleHBlY3RlZCwgTnVtYmVyVHlwZTxUPiBpbnB1dFR5cGUsIFQgaW5wdXRWYWx1ZSkKKyAgICB7CisgICAgICAgIGFzc2VydEZjdEVxdWFscyhNYXRoRmN0cy5yb3VuZEZjdChpbnB1dFR5cGUpLCBleHBlY3RlZCwgaW5wdXRUeXBlLCBpbnB1dFZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQnVmZmVyIGV4ZWN1dGVGdW5jdGlvbihGdW5jdGlvbiBmdW5jdGlvbiwgQnl0ZUJ1ZmZlciBpbnB1dCkKKyAgICB7CisgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFyYW1zID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChpbnB1dCk7CisgICAgICAgIHJldHVybiAoKFNjYWxhckZ1bmN0aW9uKSBmdW5jdGlvbikuZXhlY3V0ZShQcm90b2NvbFZlcnNpb24uQ1VSUkVOVCwgcGFyYW1zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgTnVtYmVyPiB2b2lkIGFzc2VydEZjdEVxdWFscyhOYXRpdmVGdW5jdGlvbiBmY3QsIFQgZXhwZWN0ZWQsIE51bWJlclR5cGU8VD4gaW5wdXRUeXBlLCBUIGlucHV0VmFsdWUpCisgICAgeworICAgICAgICBCeXRlQnVmZmVyIGlucHV0ID0gaW5wdXRUeXBlLmRlY29tcG9zZShpbnB1dFZhbHVlKTsKKyAgICAgICAgaWYgKGV4cGVjdGVkIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhpcyBibG9jayBpcyB0byBkZWFsIHdpdGggdGhlIGVkZ2VjYXNlIHdoZXJlIHR3byBCaWdEZWNpbWFscycgdmFsdWVzIGFyZSBlcXVhbCBidXQgbm90IHRoZWlyIHNjYWxlLgorICAgICAgICAgICAgQmlnRGVjaW1hbCBiZEV4cGVjdGVkID0gKEJpZ0RlY2ltYWwpIGV4cGVjdGVkOworICAgICAgICAgICAgQmlnRGVjaW1hbCBiZElucHV0VmFsdWUgPSAoQmlnRGVjaW1hbCkgaW5wdXRUeXBlLmNvbXBvc2UoZXhlY3V0ZUZ1bmN0aW9uKGZjdCwgaW5wdXQpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhiZEV4cGVjdGVkLmNvbXBhcmVUbyhiZElucHV0VmFsdWUpLCAwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgaW5wdXRUeXBlLmNvbXBvc2UoZXhlY3V0ZUZ1bmN0aW9uKGZjdCwgaW5wdXQpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgTnVtYmVyPiB2b2lkIGFzc2VydEZjdEVxdWFscyhOYXRpdmVGdW5jdGlvbiBmY3QsIFQgZXhwZWN0ZWQsIE51bWJlclR5cGU8VD4gaW5wdXRUeXBlLCBUIGlucHV0VmFsdWUsIGRvdWJsZSBkZWx0YSkKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgaW5wdXQgPSBpbnB1dFR5cGUuZGVjb21wb3NlKGlucHV0VmFsdWUpOworICAgICAgICBUIGFjdHVhbCA9IGlucHV0VHlwZS5jb21wb3NlKGV4ZWN1dGVGdW5jdGlvbihmY3QsIGlucHV0KSk7CisgICAgICAgIGlmIChEb3VibGUuaXNOYU4oZXhwZWN0ZWQuZG91YmxlVmFsdWUoKSkpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKERvdWJsZS5pc05hTihhY3R1YWwuZG91YmxlVmFsdWUoKSkpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoTWF0aC5hYnMoZXhwZWN0ZWQuZG91YmxlVmFsdWUoKSAtIGFjdHVhbC5kb3VibGVWYWx1ZSgpKSA8PSBkZWx0YSk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9OYXRpdmVGdW5jdGlvbnNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvTmF0aXZlRnVuY3Rpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZjM1NDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvTmF0aXZlRnVuY3Rpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKKworcHVibGljIGNsYXNzIE5hdGl2ZUZ1bmN0aW9uc1Rlc3QKK3sKKyAgICAvKioKKyAgICAgKiBNYXAgYXNzb2NpYXRpbmcgb2xkIGZ1bmN0aW9ucyB0aGF0IGRvbid0IHNhdGlzZnkgdGhlIG5hbWluZyBjb252ZW50aW9ucyBhZG9wdGVkIGJ5IENBU1NBTkRSQS0xODAzNyB0byB0aGVpcgorICAgICAqIG5ldyBuYW1lcyBhY2NvcmRpbmcgdG8gdGhvc2UgY29udmVudGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBMRUdBQ1lfRlVOQ1RJT05fTkFNRVMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKQorICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgcHV0KCJjYXN0QXNBc2NpaSIsICJjYXN0X2FzX2FzY2lpIik7CisgICAgICAgICAgICBwdXQoImNhc3RBc0JpZ2ludCIsICJjYXN0X2FzX2JpZ2ludCIpOworICAgICAgICAgICAgcHV0KCJjYXN0QXNEYXRlIiwgImNhc3RfYXNfZGF0ZSIpOworICAgICAgICAgICAgcHV0KCJjYXN0QXNEZWNpbWFsIiwgImNhc3RfYXNfZGVjaW1hbCIpOworICAgICAgICAgICAgcHV0KCJjYXN0QXNEb3VibGUiLCAiY2FzdF9hc19kb3VibGUiKTsKKyAgICAgICAgICAgIHB1dCgiY2FzdEFzRmxvYXQiLCAiY2FzdF9hc19mbG9hdCIpOworICAgICAgICAgICAgcHV0KCJjYXN0QXNJbnQiLCAiY2FzdF9hc19pbnQiKTsKKyAgICAgICAgICAgIHB1dCgiY2FzdEFzU21hbGxpbnQiLCAiY2FzdF9hc19zbWFsbGludCIpOworICAgICAgICAgICAgcHV0KCJjYXN0QXNUZXh0IiwgImNhc3RfYXNfdGV4dCIpOworICAgICAgICAgICAgcHV0KCJjYXN0QXNUaW1lc3RhbXAiLCAiY2FzdF9hc190aW1lc3RhbXAiKTsKKyAgICAgICAgICAgIHB1dCgiY2FzdEFzVGlueWludCIsICJjYXN0X2FzX3RpbnlpbnQiKTsKKyAgICAgICAgICAgIHB1dCgiY2FzdEFzVmFyaW50IiwgImNhc3RfYXNfdmFyaW50Iik7CisgICAgICAgICAgICBwdXQoImJsb2Jhc2FzY2lpIiwgImJsb2JfYXNfYXNjaWkiKTsKKyAgICAgICAgICAgIHB1dCgiYmxvYmFzYmlnaW50IiwgImJsb2JfYXNfYmlnaW50Iik7CisgICAgICAgICAgICBwdXQoImJsb2Jhc2Jvb2xlYW4iLCAiYmxvYl9hc19ib29sZWFuIik7CisgICAgICAgICAgICBwdXQoImJsb2Jhc2NvdW50ZXIiLCAiYmxvYl9hc19jb3VudGVyIik7CisgICAgICAgICAgICBwdXQoImJsb2Jhc2RhdGUiLCAiYmxvYl9hc19kYXRlIik7CisgICAgICAgICAgICBwdXQoImJsb2Jhc2RlY2ltYWwiLCAiYmxvYl9hc19kZWNpbWFsIik7CisgICAgICAgICAgICBwdXQoImJsb2Jhc2RvdWJsZSIsICJibG9iX2FzX2RvdWJsZSIpOworICAgICAgICAgICAgcHV0KCJibG9iYXNkdXJhdGlvbiIsICJibG9iX2FzX2R1cmF0aW9uIik7CisgICAgICAgICAgICBwdXQoImJsb2Jhc2VtcHR5IiwgImJsb2JfYXNfZW1wdHkiKTsKKyAgICAgICAgICAgIHB1dCgiYmxvYmFzZmxvYXQiLCAiYmxvYl9hc19mbG9hdCIpOworICAgICAgICAgICAgcHV0KCJibG9iYXNpbmV0IiwgImJsb2JfYXNfaW5ldCIpOworICAgICAgICAgICAgcHV0KCJibG9iYXNpbnQiLCAiYmxvYl9hc19pbnQiKTsKKyAgICAgICAgICAgIHB1dCgiYmxvYmFzc21hbGxpbnQiLCAiYmxvYl9hc19zbWFsbGludCIpOworICAgICAgICAgICAgcHV0KCJibG9iYXN0ZXh0IiwgImJsb2JfYXNfdGV4dCIpOworICAgICAgICAgICAgcHV0KCJibG9iYXN0aW1lIiwgImJsb2JfYXNfdGltZSIpOworICAgICAgICAgICAgcHV0KCJibG9iYXN0aW1lc3RhbXAiLCAiYmxvYl9hc190aW1lc3RhbXAiKTsKKyAgICAgICAgICAgIHB1dCgiYmxvYmFzdGltZXV1aWQiLCAiYmxvYl9hc190aW1ldXVpZCIpOworICAgICAgICAgICAgcHV0KCJibG9iYXN0aW55aW50IiwgImJsb2JfYXNfdGlueWludCIpOworICAgICAgICAgICAgcHV0KCJibG9iYXN1dWlkIiwgImJsb2JfYXNfdXVpZCIpOworICAgICAgICAgICAgcHV0KCJibG9iYXN2YXJjaGFyIiwgImJsb2JfYXNfdmFyY2hhciIpOworICAgICAgICAgICAgcHV0KCJibG9iYXN2YXJpbnQiLCAiYmxvYl9hc192YXJpbnQiKTsKKyAgICAgICAgICAgIHB1dCgiYXNjaWlhc2Jsb2IiLCAiYXNjaWlfYXNfYmxvYiIpOworICAgICAgICAgICAgcHV0KCJiaWdpbnRhc2Jsb2IiLCAiYmlnaW50X2FzX2Jsb2IiKTsKKyAgICAgICAgICAgIHB1dCgiYm9vbGVhbmFzYmxvYiIsICJib29sZWFuX2FzX2Jsb2IiKTsKKyAgICAgICAgICAgIHB1dCgiY291bnRlcmFzYmxvYiIsICJjb3VudGVyX2FzX2Jsb2IiKTsKKyAgICAgICAgICAgIHB1dCgiZGF0ZWFzYmxvYiIsICJkYXRlX2FzX2Jsb2IiKTsKKyAgICAgICAgICAgIHB1dCgiZGVjaW1hbGFzYmxvYiIsICJkZWNpbWFsX2FzX2Jsb2IiKTsKKyAgICAgICAgICAgIHB1dCgiZG91YmxlYXNibG9iIiwgImRvdWJsZV9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoImR1cmF0aW9uYXNibG9iIiwgImR1cmF0aW9uX2FzX2Jsb2IiKTsKKyAgICAgICAgICAgIHB1dCgiZW1wdHlhc2Jsb2IiLCAiZW1wdHlfYXNfYmxvYiIpOworICAgICAgICAgICAgcHV0KCJmbG9hdGFzYmxvYiIsICJmbG9hdF9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoImluZXRhc2Jsb2IiLCAiaW5ldF9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoImludGFzYmxvYiIsICJpbnRfYXNfYmxvYiIpOworICAgICAgICAgICAgcHV0KCJzbWFsbGludGFzYmxvYiIsICJzbWFsbGludF9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoInRleHRhc2Jsb2IiLCAidGV4dF9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoInRpbWVhc2Jsb2IiLCAidGltZV9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoInRpbWVzdGFtcGFzYmxvYiIsICJ0aW1lc3RhbXBfYXNfYmxvYiIpOworICAgICAgICAgICAgcHV0KCJ0aW1ldXVpZGFzYmxvYiIsICJ0aW1ldXVpZF9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoInRpbnlpbnRhc2Jsb2IiLCAidGlueWludF9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoInV1aWRhc2Jsb2IiLCAidXVpZF9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoInZhcmNoYXJhc2Jsb2IiLCAidmFyY2hhcl9hc19ibG9iIik7CisgICAgICAgICAgICBwdXQoInZhcmludGFzYmxvYiIsICJ2YXJpbnRfYXNfYmxvYiIpOworICAgICAgICAgICAgcHV0KCJjb3VudFJvd3MiLCAiY291bnRfcm93cyIpOworICAgICAgICAgICAgcHV0KCJtYXh0aW1ldXVpZCIsICJtYXhfdGltZXV1aWQiKTsKKyAgICAgICAgICAgIHB1dCgibWludGltZXV1aWQiLCAibWluX3RpbWV1dWlkIik7CisgICAgICAgICAgICBwdXQoImN1cnJlbnRkYXRlIiwgImN1cnJlbnRfZGF0ZSIpOworICAgICAgICAgICAgcHV0KCJjdXJyZW50dGltZSIsICJjdXJyZW50X3RpbWUiKTsKKyAgICAgICAgICAgIHB1dCgiY3VycmVudHRpbWVzdGFtcCIsICJjdXJyZW50X3RpbWVzdGFtcCIpOworICAgICAgICAgICAgcHV0KCJjdXJyZW50dGltZXV1aWQiLCAiY3VycmVudF90aW1ldXVpZCIpOworICAgICAgICAgICAgcHV0KCJ0b2RhdGUiLCAidG9fZGF0ZSIpOworICAgICAgICAgICAgcHV0KCJ0b3RpbWVzdGFtcCIsICJ0b190aW1lc3RhbXAiKTsKKyAgICAgICAgICAgIHB1dCgidG91bml4dGltZXN0YW1wIiwgInRvX3VuaXhfdGltZXN0YW1wIik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogTWFwIGFzc29jaWF0aW5nIG9sZCBmdW5jdGlvbnMgZmFjdG9yaWVzIHRoYXQgZG9uJ3Qgc2F0aXNmeSB0aGUgbmFtaW5nIGNvbnZlbnRpb25zIGFkb3B0ZWQgYnkgQ0FTU0FORFJBLTE4MDM3IHRvCisgICAgICogdGhlaXIgbmV3IG5hbWVzIGFjY29yZGluZyB0byB0aG9zZSBjb252ZW50aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IExFR0FDWV9GVU5DVElPTl9GQUNUT1JZX05BTUVTID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHB1dCgidG9qc29uIiwgInRvX2pzb24iKTsKKyAgICAgICAgICAgIHB1dCgiZnJvbWpzb24iLCAiZnJvbV9qc29uIik7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogVmVyaWZ5IHRoYXQgdGhlIG9sZCBmdW5jdGlvbnMgdGhhdCBkb24ndCBzYXRpc2Z5IHRoZSBuYW1pbmcgY29udmVudGlvbnMgYWRvcHRlZCBieSBDQVNTQU5EUkEtMTgwMzcgaGF2ZSBhCisgICAgICogcmVwbGFjZW1lbnQgZnVuY3Rpb24gdGhhdCBzYXRpc2ZpZXMgdGhvc2UgY29udmVudGlvbnMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVwcmVjdGVkRnVuY3Rpb25OYW1lcygpCisgICAgeworICAgICAgICBOYXRpdmVGdW5jdGlvbnMgbmF0aXZlRnVuY3Rpb25zID0gTmF0aXZlRnVuY3Rpb25zLmluc3RhbmNlOworICAgICAgICBMRUdBQ1lfRlVOQ1RJT05fTkFNRVMuZm9yRWFjaCgob2xkTmFtZSwgbmV3TmFtZSkgLT4geworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KG5hdGl2ZUZ1bmN0aW9ucy5nZXRGdW5jdGlvbnMoRnVuY3Rpb25OYW1lLm5hdGl2ZUZ1bmN0aW9uKG9sZE5hbWUpKSkuaXNOb3RFbXB0eSgpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KG5hdGl2ZUZ1bmN0aW9ucy5nZXRGdW5jdGlvbnMoRnVuY3Rpb25OYW1lLm5hdGl2ZUZ1bmN0aW9uKG5ld05hbWUpKSkuaXNOb3RFbXB0eSgpOworICAgICAgICB9KTsKKworICAgICAgICBmb3IgKE5hdGl2ZUZ1bmN0aW9uIGZ1bmN0aW9uIDogbmF0aXZlRnVuY3Rpb25zLmdldEZ1bmN0aW9ucygpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGZ1bmN0aW9uLm5hbWUubmFtZTsKKworICAgICAgICAgICAgaWYgKHNhdGlzZmllc0NvbnZlbnRpb25zKGZ1bmN0aW9uLm5hbWUpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoTEVHQUNZX0ZVTkNUSU9OX05BTUVTKS5jb250YWluc0tleShuYW1lKTsKKyAgICAgICAgICAgIEZ1bmN0aW9uTmFtZSBuZXdOYW1lID0gRnVuY3Rpb25OYW1lLm5hdGl2ZUZ1bmN0aW9uKExFR0FDWV9GVU5DVElPTl9OQU1FUy5nZXQobmFtZSkpOworCisgICAgICAgICAgICBGdW5jdGlvbiBuZXdGdW5jdGlvbiA9IEZ1bmN0aW9uUmVzb2x2ZXIuZ2V0KFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24uYXJnVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLnJldHVyblR5cGUpOworCisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQobmV3RnVuY3Rpb24pLmlzTm90TnVsbCgpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGZ1bmN0aW9uKS5pc05vdEVxdWFsVG8obmV3RnVuY3Rpb24pOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGZ1bmN0aW9uKS5pc0VxdWFsVG8oKChOYXRpdmVGdW5jdGlvbikgbmV3RnVuY3Rpb24pLndpdGhMZWdhY3lOYW1lKCkpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGZ1bmN0aW9uLmFyZ1R5cGVzKCkpLmlzRXF1YWxUbyhuZXdGdW5jdGlvbi5hcmdUeXBlcygpKTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChmdW5jdGlvbi5yZXR1cm5UeXBlKCkpLmlzRXF1YWxUbyhuZXdGdW5jdGlvbi5yZXR1cm5UeXBlKCkpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGZ1bmN0aW9uLmdldENsYXNzKCkpLmlzRXF1YWxUbyhuZXdGdW5jdGlvbi5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChmdW5jdGlvbi5uYW1lKCkubmFtZS50b0xvd2VyQ2FzZSgpKQorICAgICAgICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oU3RyaW5nVXRpbHMucmVtb3ZlKG5ld0Z1bmN0aW9uLm5hbWUoKS5uYW1lLCAnXycpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHRoZSBvbGQgZnVuY3Rpb25zIGZ1bmN0aW9uIGZhY3RvcmllcyB0aGF0IGRvbid0IHNhdGlzZnkgdGhlIG5hbWluZyBjb252ZW50aW9ucyBhZG9wdGVkIGJ5CisgICAgICogQ0FTU0FORFJBLTE4MDM3IGhhdmUgYSByZXBsYWNlbWVudCBmdW5jdGlvbiBmYWN0b3J5IHRoYXQgc2F0aXNmaWVzIHRob3NlIGNvbnZlbnRpb25zLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlcHJlY3RlZEZ1bmN0aW9uRmFjdG9yeU5hbWVzKCkKKyAgICB7CisgICAgICAgIE5hdGl2ZUZ1bmN0aW9ucyBuYXRpdmVGdW5jdGlvbnMgPSBOYXRpdmVGdW5jdGlvbnMuaW5zdGFuY2U7CisgICAgICAgIExFR0FDWV9GVU5DVElPTl9GQUNUT1JZX05BTUVTLmZvckVhY2goKG9sZE5hbWUsIG5ld05hbWUpIC0+IHsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChuYXRpdmVGdW5jdGlvbnMuZ2V0RmFjdG9yaWVzKEZ1bmN0aW9uTmFtZS5uYXRpdmVGdW5jdGlvbihvbGROYW1lKSkpLmlzTm90RW1wdHkoKTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChuYXRpdmVGdW5jdGlvbnMuZ2V0RmFjdG9yaWVzKEZ1bmN0aW9uTmFtZS5uYXRpdmVGdW5jdGlvbihuZXdOYW1lKSkpLmlzTm90RW1wdHkoKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgZm9yIChGdW5jdGlvbkZhY3RvcnkgZmFjdG9yeSA6IG5hdGl2ZUZ1bmN0aW9ucy5nZXRGYWN0b3JpZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBmYWN0b3J5Lm5hbWUubmFtZTsKKworICAgICAgICAgICAgaWYgKHNhdGlzZmllc0NvbnZlbnRpb25zKGZhY3RvcnkubmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChMRUdBQ1lfRlVOQ1RJT05fRkFDVE9SWV9OQU1FUykuY29udGFpbnNLZXkobmFtZSk7CisgICAgICAgICAgICBGdW5jdGlvbk5hbWUgbmV3TmFtZSA9IEZ1bmN0aW9uTmFtZS5uYXRpdmVGdW5jdGlvbihMRUdBQ1lfRlVOQ1RJT05fRkFDVE9SWV9OQU1FUy5nZXQobmFtZSkpOworICAgICAgICAgICAgQ29sbGVjdGlvbjxGdW5jdGlvbkZhY3Rvcnk+IG5ld0ZhY3RvcmllcyA9IE5hdGl2ZUZ1bmN0aW9ucy5pbnN0YW5jZS5nZXRGYWN0b3JpZXMobmV3TmFtZSk7CisKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChuZXdGYWN0b3JpZXMpLmhhc1NpemUoMSk7CisgICAgICAgICAgICBGdW5jdGlvbkZhY3RvcnkgbmV3RmFjdG9yeSA9IG5ld0ZhY3Rvcmllcy5pdGVyYXRvcigpLm5leHQoKTsKKworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGZhY3RvcnkpLmlzTm90RXF1YWxUbyhuZXdGYWN0b3J5KTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChmYWN0b3J5Lm5hbWUpLmlzTm90RXF1YWxUbyhuZXdGYWN0b3J5Lm5hbWUpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGZhY3RvcnkucGFyYW1ldGVycykuaXNFcXVhbFRvKG5ld0ZhY3RvcnkucGFyYW1ldGVycyk7CisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoZmFjdG9yeS5nZXRDbGFzcygpKS5pc0VxdWFsVG8obmV3RmFjdG9yeS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChmYWN0b3J5Lm5hbWUoKS5uYW1lLnRvTG93ZXJDYXNlKCkpCisgICAgICAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhTdHJpbmdVdGlscy5yZW1vdmUobmV3RmFjdG9yeS5uYW1lKCkubmFtZSwgJ18nKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNhdGlzZmllc0NvbnZlbnRpb25zKEZ1bmN0aW9uTmFtZSBmdW5jdGlvbk5hbWUpCisgICAgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGZ1bmN0aW9uTmFtZS5uYW1lOworICAgICAgICByZXR1cm4gbmFtZS5lcXVhbHMobmFtZS50b0xvd2VyQ2FzZSgpKSAmJgorICAgICAgICAgICAgICAgIUxFR0FDWV9GVU5DVElPTl9OQU1FUy5jb250YWluc0tleShuYW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVGltZUZjdHNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvVGltZUZjdHNUZXN0LmphdmEKaW5kZXggYTEyNGU2MC4uYjBjYzFlMCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL1RpbWVGY3RzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9UaW1lRmN0c1Rlc3QuamF2YQpAQCAtODgsMTYgKzg4LDYgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REYXRlT2YoKQotICAgIHsKLQotICAgICAgICBsb25nIHRpbWVJbk1pbGxpcyA9IERBVEVfVElNRS50b0luc3RhbnQoKS50b0Vwb2NoTWlsbGkoKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCA9IEJ5dGVCdWZmZXIud3JhcChhdFVuaXhNaWxsaXNBc0J5dGVzKHRpbWVJbk1pbGxpcywgMCkpOwotICAgICAgICBCeXRlQnVmZmVyIG91dHB1dCA9IGV4ZWN1dGVGdW5jdGlvbihUaW1lRmN0cy5kYXRlT2ZGY3QsIGlucHV0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKERhdGUuZnJvbShEQVRFX1RJTUUudG9JbnN0YW50KCkpLCBUaW1lc3RhbXBUeXBlLmluc3RhbmNlLmNvbXBvc2Uob3V0cHV0KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZVV1aWRUb1RpbWVzdGFtcCgpCiAgICAgewogICAgICAgICBsb25nIHRpbWVJbk1pbGxpcyA9IERBVEVfVElNRS50b0luc3RhbnQoKS50b0Vwb2NoTWlsbGkoKTsKQEAgLTEwNywxNSArOTcsNiBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFVuaXhUaW1lc3RhbXBPZkZjdCgpCi0gICAgewotICAgICAgICBsb25nIHRpbWVJbk1pbGxpcyA9IERBVEVfVElNRS50b0luc3RhbnQoKS50b0Vwb2NoTWlsbGkoKTsKLSAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dCA9IEJ5dGVCdWZmZXIud3JhcChhdFVuaXhNaWxsaXNBc0J5dGVzKHRpbWVJbk1pbGxpcywgMCkpOwotICAgICAgICBCeXRlQnVmZmVyIG91dHB1dCA9IGV4ZWN1dGVGdW5jdGlvbihUaW1lRmN0cy51bml4VGltZXN0YW1wT2ZGY3QsIGlucHV0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRpbWVJbk1pbGxpcywgTG9uZ1R5cGUuaW5zdGFuY2UuY29tcG9zZShvdXRwdXQpLmxvbmdWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lVXVpZFRvVW5peFRpbWVzdGFtcCgpCiAgICAgewogICAgICAgICBsb25nIHRpbWVJbk1pbGxpcyA9IERBVEVfVElNRS50b0luc3RhbnQoKS50b0Vwb2NoTWlsbGkoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tJbkFueVBvc2l0aW9uVGVzdGVyLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrSW5BbnlQb3NpdGlvblRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MmFhYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrSW5BbnlQb3NpdGlvblRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsMjY3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CisKKy8qKgorICoge0BsaW5rIENvbHVtbk1hc2tUZXN0ZXJ9IHZlcmlmeWluZyB0aGF0IG1hc2tzIGNhbiBiZSBhcHBsaWVkIHRvIGNvbHVtbnMgaW4gYW55IHBvc2l0aW9uIChwYXJ0aXRpb24ga2V5IGNvbHVtbnMsCisgKiBjbHVzdGVyaW5nIGtleSBjb2x1bW5zLCBzdGF0aWMgY29sdW1ucyBhbmQgcmVndWxhciBjb2x1bW5zKS4gVGhlIGNvbHVtbnMgb2YgYW55IGRlcGVuZGluZyBtYXRlcmlhbGl6ZWQgdmlld3Mgc2hvdWxkCisgKiBiZSB1ZHBhdGVkIGFjY29yZGluZ2x5LgorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGFic3RyYWN0IGNsYXNzIENvbHVtbk1hc2tJbkFueVBvc2l0aW9uVGVzdGVyIGV4dGVuZHMgQ29sdW1uTWFza1Rlc3RlcgoreworICAgIC8qKiBUaGUgY29sdW1uIG1hc2sgYXMgZXhwcmVzc2VkIGluIENRTCBzdGF0ZW1lbnRzIHJpZ2h0IGFmdGVyIHRoZSB7QGNvZGUgTUFTS0VEIFdJVEh9IGtleXdvcmRzLiAqLworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcgorICAgIHB1YmxpYyBTdHJpbmcgbWFzazsKKworICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgbWFza2VkIGNvbHVtbiAqLworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcigxKQorICAgIHB1YmxpYyBTdHJpbmcgdHlwZTsKKworICAgIC8qKiBUaGUgdHlwZXMgb2YgdGhlIHRlc3RlZCBtYXNraW5nIGZ1bmN0aW9uIHBhcnRpYWwgYXJndW1lbnRzLiAqLworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcigyKQorICAgIHB1YmxpYyBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gYXJndW1lbnRUeXBlczsKKworICAgIC8qKiBUaGUgc2VyaWFsaXplZCB2YWx1ZXMgb2YgdGhlIHRlc3RlZCBtYXNraW5nIGZ1bmN0aW9uIHBhcnRpYWwgYXJndW1lbnRzLiAqLworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcigzKQorICAgIHB1YmxpYyBMaXN0PEJ5dGVCdWZmZXI+IGFyZ3VtZW50VmFsdWVzOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVGFibGVXaXRoTWFza2VkQ29sdW1ucygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIE5vdGhpbmcgaXMgbWFza2VkCisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50LCBjIGludCwgciBpbnQsIHMgaW50IHN0YXRpYywgUFJJTUFSWSBLRVkoaywgYykpIik7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU5vdE1hc2tlZCgiayIsICJjIiwgInIiLCAicyIpOworCisgICAgICAgIC8vIE1hc2tlZCBwYXJ0aXRpb24ga2V5CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAoayAlcyBNQVNLRUQgV0lUSCAlcyBQUklNQVJZIEtFWSwgciBpbnQpIiwgdHlwZSwgbWFzaykpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoImsiKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKCJyIik7CisKKyAgICAgICAgLy8gTWFza2VkIHBhcnRpdGlvbiBrZXkgY29tcG9uZW50CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAoazEgaW50LCBrMiAlcyBNQVNLRUQgV0lUSCAlcywgciBpbnQsIFBSSU1BUlkgS0VZKGsxLCBrMikpIiwgdHlwZSwgbWFzaykpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoImsyIik7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU5vdE1hc2tlZCgiazEiLCAiciIpOworCisgICAgICAgIC8vIE1hc2tlZCBjbHVzdGVyaW5nIGtleQorICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50LCBjICVzIE1BU0tFRCBXSVRIICVzLCByIGludCwgUFJJTUFSWSBLRVkgKGssIGMpKSIsIHR5cGUsIG1hc2spKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJjIik7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU5vdE1hc2tlZCgiayIsICJyIik7CisKKyAgICAgICAgLy8gTWFza2VkIGNsdXN0ZXJpbmcga2V5IHdpdGggcmV2ZXJzZSBvcmRlcgorICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50LCBjICVzIE1BU0tFRCBXSVRIICVzLCByIGludCwgUFJJTUFSWSBLRVkgKGssIGMpKSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKGMgREVTQykiLCB0eXBlLCBtYXNrKSk7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU1hc2tlZCgiYyIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAiciIpOworCisgICAgICAgIC8vIE1hc2tlZCBjbHVzdGVyaW5nIGtleSBjb21wb25lbnQKKyAgICAgICAgY3JlYXRlVGFibGUoZm9ybWF0KCJDUkVBVEUgVEFCTEUgJSVzIChrIGludCwgYzEgaW50LCBjMiAlcyBNQVNLRUQgV0lUSCAlcywgciBpbnQsIFBSSU1BUlkgS0VZIChrLCBjMSwgYzIpKSIsIHR5cGUsIG1hc2spKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJjMiIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAiYzEiLCAiciIpOworCisgICAgICAgIC8vIE1hc2tlZCByZWd1bGFyIGNvbHVtbgorICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50IFBSSU1BUlkgS0VZLCByMSAlcyBNQVNLRUQgV0lUSCAlcywgcjIgaW50KSIsIHR5cGUsIG1hc2spKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJyMSIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAicjIiKTsKKworICAgICAgICAvLyBNYXNrZWQgc3RhdGljIGNvbHVtbgorICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50LCBjIGludCwgciBpbnQsIHMgJXMgU1RBVElDIE1BU0tFRCBXSVRIICVzLCBQUklNQVJZIEtFWSAoaywgYykpIiwgdHlwZSwgbWFzaykpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoInMiKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKCJrIiwgImMiLCAiciIpOworCisgICAgICAgIC8vIE11bHRpcGxlIG1hc2tlZCBjb2x1bW5zCisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiazEgaW50LCBrMiAlcyBNQVNLRUQgV0lUSCAlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzEgaW50LCBjMiAlcyBNQVNLRUQgV0lUSCAlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicjEgaW50LCByMiAlcyBNQVNLRUQgV0lUSCAlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiczEgaW50IHN0YXRpYywgczIgJXMgc3RhdGljIE1BU0tFRCBXSVRIICVzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJQUklNQVJZIEtFWSgoazEsIGsyKSwgYzEsIGMyKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgbWFzaywgdHlwZSwgbWFzaywgdHlwZSwgbWFzaywgdHlwZSwgbWFzaykpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoImsyIiwgImMyIiwgInIyIiwgInMyIik7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU5vdE1hc2tlZCgiazEiLCAiYzEiLCAicjEiLCAiczEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVUYWJsZVdpdGhNYXNrZWRDb2x1bW5zQW5kTWF0ZXJpYWxpemVkVmlldygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiazEgaW50LCBrMiAlcyBNQVNLRUQgV0lUSCAlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzEgaW50LCBjMiAlcyBNQVNLRUQgV0lUSCAlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicjEgaW50LCByMiAlcyBNQVNLRUQgV0lUSCAlcywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiczEgaW50IHN0YXRpYywgczIgJXMgc3RhdGljIE1BU0tFRCBXSVRIICVzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJQUklNQVJZIEtFWSgoazEsIGsyKSwgYzEsIGMyKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgbWFzaywgdHlwZSwgbWFzaywgdHlwZSwgbWFzaywgdHlwZSwgbWFzaykpOworICAgICAgICBjcmVhdGVWaWV3KCJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMgQVMgU0VMRUNUIGsxLCBrMiwgYzEsIGMyLCByMSwgcjIgRlJPTSAlcyAiICsKKyAgICAgICAgICAgICAgICAgICAiV0hFUkUgazEgSVMgTk9UIE5VTEwgQU5EIGsyIElTIE5PVCBOVUxMICIgKworICAgICAgICAgICAgICAgICAgICJBTkQgYzEgSVMgTk9UIE5VTEwgQU5EIGMyIElTIE5PVCBOVUxMICIgKworICAgICAgICAgICAgICAgICAgICJBTkQgcjEgSVMgTk9UIE5VTEwgQU5EIHIyIElTIE5PVCBOVUxMICIgKworICAgICAgICAgICAgICAgICAgICJQUklNQVJZIEtFWSAocjIsIGMyLCBjMSwgazIsIGsxKSIpOworCisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU1hc2tlZCgiazIiLCAiYzIiLCAicjIiLCAiczIiKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKCJrMSIsICJjMSIsICJyMSIsICJzMSIpOworCisgICAgICAgIGFzc2VydFZpZXdDb2x1bW5zQXJlTWFza2VkKCJrMiIsICJjMiIsICJyMiIpOworICAgICAgICBhc3NlcnRWaWV3Q29sdW1uc0FyZU5vdE1hc2tlZCgiazEiLCAiYzEiLCAicjEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbHRlclRhYmxlV2l0aE1hc2tlZENvbHVtbnMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBDcmVhdGUgdGhlIHRhYmxlIHRvIGJlIGFsdGVyZWQKKyAgICAgICAgY3JlYXRlVGFibGUoZm9ybWF0KCJDUkVBVEUgVEFCTEUgJSVzIChrICVzLCBjICU8cywgcjEgJTxzLCByMiAlPHMgTUFTS0VEIFdJVEggJXMsIHIzICVzLCBzICU8cyBzdGF0aWMsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBSSU1BUlkgS0VZIChrLCBjKSkiLCB0eXBlLCBtYXNrLCB0eXBlKSk7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU1hc2tlZCgicjIiKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKCJrIiwgImMiLCAicjEiLCAicjMiLCAicyIpOworCisgICAgICAgIC8vIEFkZCBuZXcgbWFza2VkIGNvbHVtbgorICAgICAgICBhbHRlclRhYmxlKGZvcm1hdCgiQUxURVIgVEFCTEUgJSVzIEFERCByNCAlcyBNQVNLRUQgV0lUSCAlcyIsIHR5cGUsIG1hc2spKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJyMiIsICJyNCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAiYyIsICJyMSIsICJyMyIsICJzIik7CisKKyAgICAgICAgLy8gU2V0IG1hc2sgZm9yIGFuIGV4aXN0aW5nIGJ1dCB1bm1hc2tlZCBjb2x1bW4KKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICUlcyBBTFRFUiByMSBNQVNLRUQgV0lUSCAlcyIsIG1hc2spKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJyMSIsICJyMiIsICJyNCIpOworCisgICAgICAgIC8vIFVubWFzayBhIG1hc2tlZCBjb2x1bW4KKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgcjEgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgcjIgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJyNCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoInIxIiwgInIyIiwgInIzIik7CisKKyAgICAgICAgLy8gTWFzayBhbmQgZGlzYWJsZSBtYXNrIGZvciBwcmltYXJ5IGtleQorICAgICAgICBhbHRlclRhYmxlKGZvcm1hdCgiQUxURVIgVEFCTEUgJSVzIEFMVEVSIGsgTUFTS0VEIFdJVEggJXMiLCBtYXNrKSk7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU1hc2tlZCgiayIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBrIERST1AgTUFTS0VEIik7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU5vdE1hc2tlZCgiayIpOworCisgICAgICAgIC8vIE1hc2sgYW5kIGRpc2FibGUgbWFzayBmb3IgY2x1c3RlcmluZyBrZXkKKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICUlcyBBTFRFUiBjIE1BU0tFRCBXSVRIICVzIiwgbWFzaykpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoImMiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgYyBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImMiKTsKKworICAgICAgICAvLyBNYXNrIGFuZCBkaXNhYmxlIG1hc2sgZm9yIHN0YXRpYyBjb2x1bW4KKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICUlcyBBTFRFUiBzIE1BU0tFRCBXSVRIICVzIiwgbWFzaykpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoInMiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgcyBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoInMiKTsKKworICAgICAgICAvLyBBZGQgbXVsdGlwbGUgbWFza2VkIGNvbHVtbnMgd2l0aGluIHRoZSBzYW1lIHF1ZXJ5CisgICAgICAgIGFsdGVyVGFibGUoZm9ybWF0KCJBTFRFUiBUQUJMRSAlJXMgQUREICgiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInI1ICVzIE1BU0tFRCBXSVRIICVzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInI2ICVzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInI3ICVzIE1BU0tFRCBXSVRIICVzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInI4ICVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIG1hc2ssIHR5cGUsIHR5cGUsIG1hc2ssIHR5cGUpKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJyNSIsICJyNyIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoInI2IiwgInI4Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWx0ZXJUYWJsZVdpdGhNYXNrZWRDb2x1bW5zQW5kTWF0ZXJpYWxpemVkVmlldygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiayAlcywgYyAlPHMsIHIxICU8cywgcjIgJTxzLCBzMSAlPHMgc3RhdGljLCBzMiAlPHMgc3RhdGljLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJQUklNQVJZIEtFWShrLCBjKSkiLCB0eXBlKSk7CisgICAgICAgIGNyZWF0ZVZpZXcoIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgaywgYywgcjIgRlJPTSAlcyAiICsKKyAgICAgICAgICAgICAgICAgICAiV0hFUkUgayBJUyBOT1QgTlVMTCBBTkQgYyBJUyBOT1QgTlVMTCAiICsKKyAgICAgICAgICAgICAgICAgICAiQU5EIHIxIElTIE5PVCBOVUxMIEFORCByMiBJUyBOT1QgTlVMTCAiICsKKyAgICAgICAgICAgICAgICAgICAiUFJJTUFSWSBLRVkgKHIyLCBjLCBrKSIpOworCisgICAgICAgIC8vIEFkZGluZyBhIGNvbHVtbiB0byB0aGUgdGFibGUgZG9lc24ndCBoYXZlIGFuIGVmZmVjdCBvbiB0aGUgdmlldworICAgICAgICBhbHRlclRhYmxlKGZvcm1hdCgiQUxURVIgVEFCTEUgJSVzIEFERCByMyAlcyBNQVNLRUQgV0lUSCAlcyIsIHR5cGUsIG1hc2spKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJyMyIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAiYyIsICJyMSIsICJyMiIsICJzMSIsICJzMiIpOworICAgICAgICBhc3NlcnRWaWV3Q29sdW1uc0FyZU5vdE1hc2tlZCgiayIsICJjIiwgInIyIik7CisKKyAgICAgICAgLy8gTWFza2luZyBhIGNvbHVtbiB0aGF0IGlzIG5vdCBwYXJ0IG9mIHRoZSB2aWV3IGRvZXNuJ3QgaGF2ZSBhbiBlZmZlY3Qgb24gdGhlIHZpZXcKKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICUlcyBBTFRFUiByMSBNQVNLRUQgV0lUSCAlcyIsIG1hc2spKTsKKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICUlcyBBTFRFUiBzMSBNQVNLRUQgV0lUSCAlcyIsIG1hc2spKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKCJyMSIsICJyMyIsICJzMSIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAiYyIsICJyMiIsICJzMiIpOworICAgICAgICBhc3NlcnRWaWV3Q29sdW1uc0FyZU5vdE1hc2tlZCgiayIsICJjIiwgInIyIik7CisKKyAgICAgICAgLy8gTWFza2luZyBhIGNvbHVtbiB0aGF0IGlzIHBhcnQgb2YgdGhlIHZpZXcgc2hvdWxkIGhhdmUgYW4gZWZmZWN0IG9uIHRoZSB2aWV3CisgICAgICAgIGFsdGVyVGFibGUoZm9ybWF0KCJBTFRFUiBUQUJMRSAlJXMgQUxURVIgcjIgTUFTS0VEIFdJVEggJXMiLCBtYXNrKSk7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU1hc2tlZCgicjEiLCAicjIiLCAicjMiLCAiczEiKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKCJrIiwgImMiLCAiczIiKTsKKyAgICAgICAgYXNzZXJ0Vmlld0NvbHVtbnNBcmVNYXNrZWQoInIyIik7CisgICAgICAgIGFzc2VydFZpZXdDb2x1bW5zQXJlTm90TWFza2VkKCJrIiwgImMiKTsKKworICAgICAgICAvLyBNYXNrIHRoZSByZXN0IG9mIHRoZSBjb2x1bW5zCisgICAgICAgIGFsdGVyVGFibGUoZm9ybWF0KCJBTFRFUiBUQUJMRSAlJXMgQUxURVIgayBNQVNLRUQgV0lUSCAlcyIsIG1hc2spKTsKKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICUlcyBBTFRFUiBjIE1BU0tFRCBXSVRIICVzIiwgbWFzaykpOworICAgICAgICBhbHRlclRhYmxlKGZvcm1hdCgiQUxURVIgVEFCTEUgJSVzIEFMVEVSIHMyIE1BU0tFRCBXSVRIICVzIiwgbWFzaykpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoImsiLCAiYyIsICJyMSIsICJyMiIsICJyMyIsICJzMSIsICJzMiIpOworICAgICAgICBhc3NlcnRWaWV3Q29sdW1uc0FyZU1hc2tlZCgiayIsICJjIiwgInIyIik7CisKKyAgICAgICAgLy8gVW5tYXNrIGEgY29sdW1uIHRoYXQgaXMgcGFydCBvZiB0aGUgdmlldworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiByMiBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVNYXNrZWQoImsiLCAiYyIsICJyMSIsICJyMyIsICJzMSIsICJzMiIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoInIyIik7CisgICAgICAgIGFzc2VydFZpZXdDb2x1bW5zQXJlTWFza2VkKCJrIiwgImMiKTsKKyAgICAgICAgYXNzZXJ0Vmlld0NvbHVtbnNBcmVOb3RNYXNrZWQoInIyIik7CisKKyAgICAgICAgLy8gVW5tYXNrIHRoZSByZXN0IG9mIHRoZSBjb2x1bW5zCisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGsgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgYyBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiByMSBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiByMyBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBzMSBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBzMiBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAiYyIsICJyMSIsICJyMiIsICJyMyIsICJzMSIsICJzMiIpOworICAgICAgICBhc3NlcnRWaWV3Q29sdW1uc0FyZU5vdE1hc2tlZCgiayIsICJjIiwgInIyIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZnVuY3Rpb25OYW1lKCkKKyAgICB7CisgICAgICAgIGlmIChtYXNrLmVxdWFscygiREVGQVVMVCIpKQorICAgICAgICAgICAgcmV0dXJuICJtYXNrX2RlZmF1bHQiOworCisgICAgICAgIHJldHVybiBTdHJpbmdVdGlscy5yZW1vdmUoU3RyaW5nVXRpbHMuc3Vic3RyaW5nQmVmb3JlKG1hc2ssICIoIiksIEtFWVNQQUNFICsgIi4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTWFza2VkKFN0cmluZy4uLiBjb2x1bW5zKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBmb3IgKFN0cmluZyBjb2x1bW4gOiBjb2x1bW5zKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZChjdXJyZW50VGFibGUoKSwgY29sdW1uLCBmdW5jdGlvbk5hbWUoKSwgYXJndW1lbnRUeXBlcywgYXJndW1lbnRWYWx1ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFZpZXdDb2x1bW5zQXJlTWFza2VkKFN0cmluZy4uLiBjb2x1bW5zKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBmb3IgKFN0cmluZyBjb2x1bW4gOiBjb2x1bW5zKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZChjdXJyZW50VmlldygpLCBjb2x1bW4sIGZ1bmN0aW9uTmFtZSgpLCBhcmd1bWVudFR5cGVzLCBhcmd1bWVudFZhbHVlcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrSW5BbnlQb3NpdGlvbldpdGhEZWZhdWx0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza0luQW55UG9zaXRpb25XaXRoRGVmYXVsdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjliZjNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza0luQW55UG9zaXRpb25XaXRoRGVmYXVsdFRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0OworCisvKioKKyAqIHtAbGluayBDb2x1bW5NYXNrSW5BbnlQb3NpdGlvblRlc3Rlcn0gZm9yIHtAbGluayBEZWZhdWx0TWFza2luZ0Z1bmN0aW9ufS4KKyAqLworcHVibGljIGNsYXNzIENvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aERlZmF1bHRUZXN0IGV4dGVuZHMgQ29sdW1uTWFza0luQW55UG9zaXRpb25UZXN0ZXIKK3sKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAibWFzaz17MH0sIHR5cGU9ezF9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IG9wdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgIHsgIkRFRkFVTFQiLCAiaW50IiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpIH0sCisgICAgICAgIHsgIkRFRkFVTFQiLCAidGV4dCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSB9LAorICAgICAgICB7ICJERUZBVUxUIiwgImZyb3plbjxsaXN0PHV1aWQ+PiIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSB9LAorICAgICAgICB7ICJtYXNrX2RlZmF1bHQoKSIsICJpbnQiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkgfSwKKyAgICAgICAgeyAibWFza19kZWZhdWx0KCkiLCAidGV4dCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSB9LAorICAgICAgICB7ICJtYXNrX2RlZmF1bHQoKSIsICJmcm96ZW48bGlzdDx1dWlkPj4iLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkgfSwKKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza0luQW55UG9zaXRpb25XaXRoTnVsbFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aE51bGxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxZTJhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aE51bGxUZXN0LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdDsKKworLyoqCisgKiB7QGxpbmsgQ29sdW1uTWFza0luQW55UG9zaXRpb25UZXN0ZXJ9IGZvciB7QGxpbmsgTnVsbE1hc2tpbmdGdW5jdGlvbn0uCisgKi8KK3B1YmxpYyBjbGFzcyBDb2x1bW5NYXNrSW5BbnlQb3NpdGlvbldpdGhOdWxsVGVzdCBleHRlbmRzIENvbHVtbk1hc2tJbkFueVBvc2l0aW9uVGVzdGVyCit7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIm1hc2s9ezB9LCB0eXBlPXsxfSIpCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiBvcHRpb25zKCkKKyAgICB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdeworICAgICAgICB7ICJtYXNrX251bGwoKSIsICJpbnQiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkgfSwKKyAgICAgICAgeyAibWFza19udWxsKCkiLCAidGV4dCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSB9LAorICAgICAgICB7ICJtYXNrX251bGwoKSIsICJmcm96ZW48bGlzdDx1dWlkPj4iLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkgfSwKKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza0luQW55UG9zaXRpb25XaXRoUGFydGlhbFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aFBhcnRpYWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwNDc5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aFBhcnRpYWxUZXN0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OworCisvKioKKyAqIHtAbGluayBDb2x1bW5NYXNrSW5BbnlQb3NpdGlvblRlc3Rlcn0gZm9yIHtAbGluayBQYXJ0aWFsTWFza2luZ0Z1bmN0aW9ufS4KKyAqLworcHVibGljIGNsYXNzIENvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aFBhcnRpYWxUZXN0IGV4dGVuZHMgQ29sdW1uTWFza0luQW55UG9zaXRpb25UZXN0ZXIKK3sKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAibWFzaz17MH0sIHR5cGU9ezF9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IG9wdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgIHsgIm1hc2tfaW5uZXIoMSwgMikiLCAidGV4dCIsCisgICAgICAgICAgYXNMaXN0KEludDMyVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICBhc0xpc3QoSW50MzJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgxKSwgSW50MzJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgyKSkgfSwKKyAgICAgICAgeyAibWFza19vdXRlcigxLCAyKSIsICJ0ZXh0IiwKKyAgICAgICAgICBhc0xpc3QoSW50MzJUeXBlLmluc3RhbmNlLCBJbnQzMlR5cGUuaW5zdGFuY2UpLAorICAgICAgICAgIGFzTGlzdChJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDEpLCBJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDIpKSB9LAorICAgICAgICB7ICJtYXNrX2lubmVyKDEsIDIsICcjJykiLCAidGV4dCIsCisgICAgICAgICAgYXNMaXN0KEludDMyVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgYXNMaXN0KEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMSksIEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMiksIFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgiIyIpKSB9LAorICAgICAgICB7ICJtYXNrX291dGVyKDEsIDIsICcjJykiLCAidGV4dCIsCisgICAgICAgICAgYXNMaXN0KEludDMyVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgYXNMaXN0KEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMSksIEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMiksIFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgiIyIpKSB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aFJlcGxhY2VUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrSW5BbnlQb3NpdGlvbldpdGhSZXBsYWNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYzUxNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrSW5BbnlQb3NpdGlvbldpdGhSZXBsYWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5MaXN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3Q7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0OworCisvKioKKyAqIHtAbGluayBDb2x1bW5NYXNrSW5BbnlQb3NpdGlvblRlc3Rlcn0gZm9yIHtAbGluayBSZXBsYWNlTWFza2luZ0Z1bmN0aW9ufS4KKyAqLworcHVibGljIGNsYXNzIENvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aFJlcGxhY2VUZXN0IGV4dGVuZHMgQ29sdW1uTWFza0luQW55UG9zaXRpb25UZXN0ZXIKK3sKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAibWFzaz17MH0sIHR5cGU9ezF9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IG9wdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgIHsgIm1hc2tfcmVwbGFjZSgwKSIsICJpbnQiLAorICAgICAgICAgIHNpbmdsZXRvbkxpc3QoSW50MzJUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICBzaW5nbGV0b25MaXN0KEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMCkpIH0sCisgICAgICAgIHsgIm1hc2tfcmVwbGFjZSgncmVkYWN0ZWQnKSIsICJ0ZXh0IiwKKyAgICAgICAgICBzaW5nbGV0b25MaXN0KFVURjhUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICBzaW5nbGV0b25MaXN0KFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgicmVkYWN0ZWQiKSkgfSwKKyAgICAgICAgeyAibWFza19yZXBsYWNlKFtdKSIsICJmcm96ZW48bGlzdDxpbnQ+PiIsCisgICAgICAgICAgc2luZ2xldG9uTGlzdChMaXN0VHlwZS5nZXRJbnN0YW5jZShJbnQzMlR5cGUuaW5zdGFuY2UsIGZhbHNlKSksCisgICAgICAgICAgc2luZ2xldG9uTGlzdChMaXN0VHlwZS5nZXRJbnN0YW5jZShJbnQzMlR5cGUuaW5zdGFuY2UsIGZhbHNlKS5kZWNvbXBvc2UoZW1wdHlMaXN0KCkpKSB9LAorICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrSW5BbnlQb3NpdGlvbldpdGhVREZUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrSW5BbnlQb3NpdGlvbldpdGhVREZUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDllNTAyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tJbkFueVBvc2l0aW9uV2l0aFVERlRlc3QuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdDsKKworLyoqCisgKiB7QGxpbmsgQ29sdW1uTWFza0luQW55UG9zaXRpb25UZXN0ZXJ9IGZvciB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLgorICovCitwdWJsaWMgY2xhc3MgQ29sdW1uTWFza0luQW55UG9zaXRpb25XaXRoVURGVGVzdCBleHRlbmRzIENvbHVtbk1hc2tJbkFueVBvc2l0aW9uVGVzdGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfUkVQTEFDRV9GVU5DVElPTiA9IEtFWVNQQUNFICsgIi5tYXNrX3RleHRfcmVwbGFjZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVF9SRVBMQUNFX0ZVTkNUSU9OID0gS0VZU1BBQ0UgKyAiLm1hc2tfaW50X3JlcGxhY2UiOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwU2NoZW1hKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0LCB0ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiBJRiBOT1QgRVhJU1RTICIgKyBURVhUX1JFUExBQ0VfRlVOQ1RJT04gKyAiIChjb2x1bW4gdGV4dCwgcmVwbGFjZW1lbnQgdGV4dCkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgdGV4dCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIHJlcGxhY2VtZW50OyciKTsKKyAgICAgICAgY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICJpbnQsIGludCIsCisgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gSUYgTk9UIEVYSVNUUyAiICsgSU5UX1JFUExBQ0VfRlVOQ1RJT04gKyAiIChjb2x1bW4gaW50LCByZXBsYWNlbWVudCBpbnQpICIgKworICAgICAgICAgICAgICAgICAgICAgICAiQ0FMTEVEIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGludCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIHJlcGxhY2VtZW50OyciKTsKKyAgICB9CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAibWFzaz17MH0sIHR5cGU9ezF9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IG9wdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgIHsgVEVYVF9SRVBMQUNFX0ZVTkNUSU9OICsgIigncmVkYWN0ZWQnKSIsICJ0ZXh0IiwKKyAgICAgICAgICBzaW5nbGV0b25MaXN0KFVURjhUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICBzaW5nbGV0b25MaXN0KFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgicmVkYWN0ZWQiKSkgfSwKKyAgICAgICAgeyBJTlRfUkVQTEFDRV9GVU5DVElPTiArICIoMCkiLCAiaW50IiwKKyAgICAgICAgICBzaW5nbGV0b25MaXN0KEludDMyVHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgc2luZ2xldG9uTGlzdChJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDApKSB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tOYXRpdmVUeXBlc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tOYXRpdmVUeXBlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTUxNTI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza05hdGl2ZVR5cGVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3Q7CisKKy8qKgorICoge0BsaW5rIENvbHVtbk1hc2tUZXN0ZXJ9IHZlcmlmeWluZyB0aGF0IHdlIGNhbiBhdHRhY2ggY29sdW1uIG1hc2tzIHRvIHRhYmxlIGNvbHVtbnMgd2l0aCBhbnkgbmF0aXZlIGRhdGEgdHlwZS4KKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBDb2x1bW5NYXNrTmF0aXZlVHlwZXNUZXN0IGV4dGVuZHMgQ29sdW1uTWFza1Rlc3RlcgoreworICAgIC8qKiBUaGUgdHlwZSBvZiB0aGUgY29sdW1uLiAqLworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcgorICAgIHB1YmxpYyBDUUwzVHlwZS5OYXRpdmUgdHlwZTsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ0eXBlPXswfSIpCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiBvcHRpb25zKCkKKyAgICB7CisgICAgICAgIExpc3Q8T2JqZWN0W10+IHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChDUUwzVHlwZS5OYXRpdmUgdHlwZSA6IENRTDNUeXBlLk5hdGl2ZS52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHR5cGUgIT0gQ1FMM1R5cGUuTmF0aXZlLkVNUFRZKQorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuYWRkKG5ldyBPYmplY3RbXXsgdHlwZSB9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVEYXRhVHlwZXMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgZGVmID0gZm9ybWF0KCIlcyBNQVNLRUQgV0lUSCBERUZBVUxUIiwgdHlwZSk7CisgICAgICAgIFN0cmluZyBrZXlEZWYgPSB0eXBlID09IENRTDNUeXBlLk5hdGl2ZS5DT1VOVEVSIHx8IHR5cGUgPT0gQ1FMM1R5cGUuTmF0aXZlLkRVUkFUSU9OCisgICAgICAgICAgICAgICAgICAgICAgICA/ICJpbnQgTUFTS0VEIFdJVEggREVGQVVMVCIgOiBkZWY7CisgICAgICAgIFN0cmluZyBzdGF0aWNEZWYgPSBmb3JtYXQoIiVzIFNUQVRJQyBNQVNLRUQgV0lUSCBERUZBVUxUIiwgdHlwZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRhYmxlIHdpdGggbWFza3MKKyAgICAgICAgU3RyaW5nIHRhYmxlID0gY3JlYXRlVGFibGUoZm9ybWF0KCJDUkVBVEUgVEFCTEUgJSVzIChrICVzLCBjICU8cywgciAlcywgcyAlcywgUFJJTUFSWSBLRVkoaywgYykpIiwga2V5RGVmLCBkZWYsIHN0YXRpY0RlZikpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgImsiLCAibWFza19kZWZhdWx0IiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uSXNNYXNrZWQodGFibGUsICJjIiwgIm1hc2tfZGVmYXVsdCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSk7CisgICAgICAgIGFzc2VydENvbHVtbklzTWFza2VkKHRhYmxlLCAiciIsICJtYXNrX2RlZmF1bHQiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgInMiLCAibWFza19kZWZhdWx0IiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKworICAgICAgICAvLyBBbHRlciBjb2x1bW4gbWFza3MKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgayBNQVNLRUQgV0lUSCBtYXNrX251bGwoKSIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBjIE1BU0tFRCBXSVRIIG1hc2tfbnVsbCgpIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIHIgTUFTS0VEIFdJVEggbWFza19udWxsKCkiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgcyBNQVNLRUQgV0lUSCBtYXNrX251bGwoKSIpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgImsiLCAibWFza19udWxsIiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uSXNNYXNrZWQodGFibGUsICJjIiwgIm1hc2tfbnVsbCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSk7CisgICAgICAgIGFzc2VydENvbHVtbklzTWFza2VkKHRhYmxlLCAiciIsICJtYXNrX251bGwiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgInMiLCAibWFza19udWxsIiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKworICAgICAgICAvLyBEcm9wIG1hc2tzCisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGsgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgYyBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiByIERST1AgTUFTS0VEIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIHMgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKCJrIiwgImMiLCAiciIsICJzIik7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrUXVlcnlUZXN0ZXIuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tRdWVyeVRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTg3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrUXVlcnlUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5SZXN1bHRTZXQ7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CisKKy8qKgorICogVGVzdCBxdWVyaWVzIG9uIGNvbHVtbnMgdGhhdCBoYXZlIGF0dGFjaGVkIGEgZHluYW1pYyBkYXRhIG1hc2tpbmcgZnVuY3Rpb24uCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sdW1uTWFza1F1ZXJ5VGVzdGVyIGV4dGVuZHMgQ29sdW1uTWFza1Rlc3RlcgoreworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcgorICAgIHB1YmxpYyBTdHJpbmcgb3JkZXI7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMSkKKyAgICBwdWJsaWMgU3RyaW5nIG1hc2s7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMikKKyAgICBwdWJsaWMgU3RyaW5nIGNvbHVtblR5cGU7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMykKKyAgICBwdWJsaWMgT2JqZWN0IGNvbHVtblZhbHVlOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDQpCisgICAgcHVibGljIE9iamVjdCBtYXNrZWRWYWx1ZTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cFNjaGVtYSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKCIgKworICAgICAgICAgICAgICAgICAgICBmb3JtYXQoImsxICVzLCBrMiAlPHMgTUFTS0VEIFdJVEggJXMsICIsIGNvbHVtblR5cGUsIG1hc2spICsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJjMSAlcywgYzIgJTxzIE1BU0tFRCBXSVRIICVzLCAiLCBjb2x1bW5UeXBlLCBtYXNrKSArCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgicjEgJXMsIHIyICU8cyBNQVNLRUQgV0lUSCAlcywgIiwgY29sdW1uVHlwZSwgbWFzaykgKworICAgICAgICAgICAgICAgICAgICBmb3JtYXQoInMxICVzIHN0YXRpYywgczIgJTxzIHN0YXRpYyBNQVNLRUQgV0lUSCAlcywgIiwgY29sdW1uVHlwZSwgbWFzaykgKworICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlBSSU1BUlkgS0VZKChrMSwgazIpLCBjMSwgYzIpKSBXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKGMxICVzLCBjMiAlPHMpIiwgb3JkZXIpKTsKKworICAgICAgICBjcmVhdGVWaWV3KCJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMgQVMgU0VMRUNUIGsyLCBrMSwgYzIsIGMxLCByMiwgcjEgRlJPTSAlcyAiICsKKyAgICAgICAgICAgICAgICAgICAiV0hFUkUgazEgSVMgTk9UIE5VTEwgQU5EIGsyIElTIE5PVCBOVUxMICIgKworICAgICAgICAgICAgICAgICAgICJBTkQgYzEgSVMgTk9UIE5VTEwgQU5EIGMyIElTIE5PVCBOVUxMICIgKworICAgICAgICAgICAgICAgICAgICJBTkQgcjEgSVMgTk9UIE5VTEwgQU5EIHIyIElTIE5PVCBOVUxMICIgKworICAgICAgICAgICAgICAgICAgICJQUklNQVJZIEtFWSAoKGMyLCBjMSksIGsyLCBrMSkiKTsKKworICAgICAgICBleGVjdXRlTmV0KCJJTlNFUlQgSU5UTyAlcyhrMSwgazIsIGMxLCBjMiwgcjEsIHIyLCBzMSwgczIpIFZBTFVFUyAoPywgPywgPywgPywgPywgPywgPywgPykiLAorICAgICAgICAgICAgICAgICAgIGNvbHVtblZhbHVlLCBjb2x1bW5WYWx1ZSwgY29sdW1uVmFsdWUsIGNvbHVtblZhbHVlLCBjb2x1bW5WYWx1ZSwgY29sdW1uVmFsdWUsIGNvbHVtblZhbHVlLCBjb2x1bW5WYWx1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0V2l0aFdpbGNhcmQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBSZXN1bHRTZXQgcnMgPSBleGVjdXRlTmV0KCJTRUxFQ1QgKiBGUk9NICVzIik7CisgICAgICAgIGFzc2VydENvbHVtbk5hbWVzKHJzLCAiazEiLCAiazIiLCAiYzEiLCAiYzIiLCAiczEiLCAiczIiLCAicjEiLCAicjIiKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChycywgcm93KGNvbHVtblZhbHVlLCBtYXNrZWRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblZhbHVlLCBtYXNrZWRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblZhbHVlLCBtYXNrZWRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblZhbHVlLCBtYXNrZWRWYWx1ZSkpOworCisgICAgICAgIHJzID0gZXhlY3V0ZU5ldChmb3JtYXQoIlNFTEVDVCAqIEZST00gJXMuJXMiLCBLRVlTUEFDRSwgY3VycmVudFZpZXcoKSkpOworICAgICAgICBhc3NlcnRDb2x1bW5OYW1lcyhycywgImMyIiwgImMxIiwgImsyIiwgImsxIiwgInIxIiwgInIyIik7CisgICAgICAgIGFzc2VydFJvd3NOZXQocnMsIHJvdyhtYXNrZWRWYWx1ZSwgY29sdW1uVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrZWRWYWx1ZSwgY29sdW1uVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5WYWx1ZSwgbWFza2VkVmFsdWUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWxlY3RXaXRoQWxsQ29sdW1uTmFtZXMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBSZXN1bHRTZXQgcnMgPSBleGVjdXRlTmV0KCJTRUxFQ1QgYzIsIGMxLCBrMiwgazEsIHIyLCByMSwgczIsIHMxIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsICJjMiIsICJjMSIsICJrMiIsICJrMSIsICJyMiIsICJyMSIsICJzMiIsICJzMSIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHJzLCByb3cobWFza2VkVmFsdWUsIGNvbHVtblZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza2VkVmFsdWUsIGNvbHVtblZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza2VkVmFsdWUsIGNvbHVtblZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza2VkVmFsdWUsIGNvbHVtblZhbHVlKSk7CisKKyAgICAgICAgcnMgPSBleGVjdXRlTmV0KGZvcm1hdCgiU0VMRUNUIGMyLCBjMSwgazIsIGsxLCByMiwgcjEgRlJPTSAlcy4lcyIsIEtFWVNQQUNFLCBjdXJyZW50VmlldygpKSk7CisgICAgICAgIGFzc2VydENvbHVtbk5hbWVzKHJzLCAiYzIiLCAiYzEiLCAiazIiLCAiazEiLCAicjIiLCAicjEiKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChycywgcm93KG1hc2tlZFZhbHVlLCBjb2x1bW5WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tlZFZhbHVlLCBjb2x1bW5WYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tlZFZhbHVlLCBjb2x1bW5WYWx1ZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdE9ubHlNYXNrZWRDb2x1bW5zKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gZXhlY3V0ZU5ldCgiU0VMRUNUIGsyLCBjMiwgczIsIHIyIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsICJrMiIsICJjMiIsICJzMiIsICJyMiIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHJzLCByb3cobWFza2VkVmFsdWUsIG1hc2tlZFZhbHVlLCBtYXNrZWRWYWx1ZSwgbWFza2VkVmFsdWUpKTsKKworICAgICAgICBycyA9IGV4ZWN1dGVOZXQoZm9ybWF0KCJTRUxFQ1QgazIsIGMyLCByMiBGUk9NICVzLiVzIiwgS0VZU1BBQ0UsIGN1cnJlbnRWaWV3KCkpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsICJrMiIsICJjMiIsICJyMiIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHJzLCByb3cobWFza2VkVmFsdWUsIG1hc2tlZFZhbHVlLCBtYXNrZWRWYWx1ZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdE9ubHlOb3RNYXNrZWRDb2x1bW5zKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gZXhlY3V0ZU5ldCgiU0VMRUNUIGsxLCBjMSwgczEsIHIxIEZST00gJXMiKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsICJrMSIsICJjMSIsICJzMSIsICJyMSIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHJzLCByb3coY29sdW1uVmFsdWUsIGNvbHVtblZhbHVlLCBjb2x1bW5WYWx1ZSwgY29sdW1uVmFsdWUpKTsKKworICAgICAgICBycyA9IGV4ZWN1dGVOZXQoZm9ybWF0KCJTRUxFQ1QgazEsIGMxLCByMSBGUk9NICVzLiVzIiwgS0VZU1BBQ0UsIGN1cnJlbnRWaWV3KCkpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsICJrMSIsICJjMSIsICJyMSIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHJzLCByb3coY29sdW1uVmFsdWUsIGNvbHVtblZhbHVlLCBjb2x1bW5WYWx1ZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tRdWVyeVdpdGhEZWZhdWx0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aERlZmF1bHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlZjJhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tRdWVyeVdpdGhEZWZhdWx0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKKy8qKgorICoge0BsaW5rIENvbHVtbk1hc2tRdWVyeVRlc3Rlcn0gZm9yIHtAbGluayBEZWZhdWx0TWFza2luZ0Z1bmN0aW9ufS4KKyAqLworcHVibGljIGNsYXNzIENvbHVtbk1hc2tRdWVyeVdpdGhEZWZhdWx0VGVzdCBleHRlbmRzIENvbHVtbk1hc2tRdWVyeVRlc3RlcgoreworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJvcmRlcj17MH0sIG1hc2s9ezF9LCB0eXBlPXsyfSwgdmFsdWU9ezN9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IG9wdGlvbnMoKQorICAgIHsKKyAgICAgICAgTGlzdDxPYmplY3RbXT4gb3B0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKFN0cmluZyBvcmRlciA6IEFycmF5cy5hc0xpc3QoIkFTQyIsICJERVNDIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKG5ldyBPYmplY3RbXXsgb3JkZXIsICJERUZBVUxUIiwgInRleHQiLCAiYWJjIiwgIioqKioiIH0pOworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIkRFRkFVTFQiLCAiaW50IiwgMTIzLCAwIH0pOworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIm1hc2tfZGVmYXVsdCgpIiwgInRleHQiLCAiYWJjIiwgIioqKioiIH0pOworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIm1hc2tfZGVmYXVsdCgpIiwgImludCIsIDEyMywgMCwgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aE51bGxUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrUXVlcnlXaXRoTnVsbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmU0MGJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aE51bGxUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiB7QGxpbmsgQ29sdW1uTWFza1F1ZXJ5VGVzdGVyfSBmb3Ige0BsaW5rIE51bGxNYXNraW5nRnVuY3Rpb259LgorICovCitwdWJsaWMgY2xhc3MgQ29sdW1uTWFza1F1ZXJ5V2l0aE51bGxUZXN0IGV4dGVuZHMgQ29sdW1uTWFza1F1ZXJ5VGVzdGVyCit7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIm9yZGVyPXswfSwgbWFzaz17MX0sIHR5cGU9ezJ9LCB2YWx1ZT17M30iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gb3B0aW9ucygpCisgICAgeworICAgICAgICBMaXN0PE9iamVjdFtdPiBvcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIG9yZGVyIDogQXJyYXlzLmFzTGlzdCgiQVNDIiwgIkRFU0MiKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIm1hc2tfbnVsbCgpIiwgInRleHQiLCAiYWJjIiwgbnVsbCB9KTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKG5ldyBPYmplY3RbXXsgb3JkZXIsICJtYXNrX251bGwoKSIsICJpbnQiLCAxMjMsIG51bGwgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aFBhcnRpYWxUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrUXVlcnlXaXRoUGFydGlhbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWE0MjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aFBhcnRpYWxUZXN0LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiB7QGxpbmsgQ29sdW1uTWFza1F1ZXJ5VGVzdGVyfSBmb3Ige0BsaW5rIFBhcnRpYWxNYXNraW5nRnVuY3Rpb259LgorICovCitwdWJsaWMgY2xhc3MgQ29sdW1uTWFza1F1ZXJ5V2l0aFBhcnRpYWxUZXN0IGV4dGVuZHMgQ29sdW1uTWFza1F1ZXJ5VGVzdGVyCit7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIm9yZGVyPXswfSwgbWFzaz17MX0sIHR5cGU9ezJ9LCB2YWx1ZT17M30iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gb3B0aW9ucygpCisgICAgeworICAgICAgICBMaXN0PE9iamVjdFtdPiBvcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIG9yZGVyIDogQXJyYXlzLmFzTGlzdCgiQVNDIiwgIkRFU0MiKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIm1hc2tfaW5uZXIobnVsbCwgbnVsbCkiLCAidGV4dCIsICJhYmNkZWYiLCAiKioqKioqIiB9KTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKG5ldyBPYmplY3RbXXsgb3JkZXIsICJtYXNrX2lubmVyKDEsIDIpIiwgInRleHQiLCAiYWJjZGVmIiwgImEqKiplZiIgfSk7CisgICAgICAgICAgICBvcHRpb25zLmFkZChuZXcgT2JqZWN0W117IG9yZGVyLCAibWFza19pbm5lcigxLCAyLCAnIycpIiwgInRleHQiLCAiYWJjZGVmIiwgImEjIyNlZiIgfSk7CisgICAgICAgICAgICBvcHRpb25zLmFkZChuZXcgT2JqZWN0W117IG9yZGVyLCAibWFza19vdXRlcigxLCBudWxsKSIsICJ0ZXh0IiwgImFiY2RlZiIsICIqYmNkZWYiIH0pOworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIm1hc2tfb3V0ZXIoMSwgMikiLCAidGV4dCIsICJhYmNkZWYiLCAiKmJjZCoqIiB9KTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKG5ldyBPYmplY3RbXXsgb3JkZXIsICJtYXNrX291dGVyKDEsIDIsICcjJykiLCAidGV4dCIsICJhYmNkZWYiLCAiI2JjZCMjIiwgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aFJlcGxhY2VUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrUXVlcnlXaXRoUmVwbGFjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTNhNTcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aFJlcGxhY2VUZXN0LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiB7QGxpbmsgQ29sdW1uTWFza1F1ZXJ5VGVzdGVyfSBmb3Ige0BsaW5rIFJlcGxhY2VNYXNraW5nRnVuY3Rpb259LgorICovCitwdWJsaWMgY2xhc3MgQ29sdW1uTWFza1F1ZXJ5V2l0aFJlcGxhY2VUZXN0IGV4dGVuZHMgQ29sdW1uTWFza1F1ZXJ5VGVzdGVyCit7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIm9yZGVyPXswfSwgbWFzaz17MX0sIHR5cGU9ezJ9LCB2YWx1ZT17M30iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gb3B0aW9ucygpCisgICAgeworICAgICAgICBMaXN0PE9iamVjdFtdPiBvcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIG9yZGVyIDogQXJyYXlzLmFzTGlzdCgiQVNDIiwgIkRFU0MiKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIm1hc2tfcmVwbGFjZShudWxsKSIsICJpbnQiLCAxMjMsIG51bGwgfSk7CisgICAgICAgICAgICBvcHRpb25zLmFkZChuZXcgT2JqZWN0W117IG9yZGVyLCAibWFza19yZXBsYWNlKCdyZWRhY3RlZCcpIiwgImFzY2lpIiwgImFiYyIsICJyZWRhY3RlZCIgfSk7CisgICAgICAgICAgICBvcHRpb25zLmFkZChuZXcgT2JqZWN0W117IG9yZGVyLCAibWFza19yZXBsYWNlKCdyZWRhY3RlZCcpIiwgInRleHQiLCAiYWJjIiwgInJlZGFjdGVkIiB9KTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKG5ldyBPYmplY3RbXXsgb3JkZXIsICJtYXNrX3JlcGxhY2UoMCkiLCAiaW50IiwgMTIzLCAwIH0pOworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgIm1hc2tfcmVwbGFjZSgwKSIsICJiaWdpbnQiLCAxMjNMLCAwTCB9KTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKG5ldyBPYmplY3RbXXsgb3JkZXIsICJtYXNrX3JlcGxhY2UoMCkiLCAidmFyaW50IiwgQmlnSW50ZWdlci52YWx1ZU9mKDEyMyksIEJpZ0ludGVnZXIuWkVSTyB9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3B0aW9uczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrUXVlcnlXaXRoVURGVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aFVERlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmI5MGI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1F1ZXJ5V2l0aFVERlRlc3QuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKKy8qKgorICoge0BsaW5rIENvbHVtbk1hc2tRdWVyeVRlc3Rlcn0gZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBDb2x1bW5NYXNrUXVlcnlXaXRoVURGVGVzdCBleHRlbmRzIENvbHVtbk1hc2tRdWVyeVRlc3RlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1JFUExBQ0VfRlVOQ1RJT04gPSBLRVlTUEFDRSArICIubWFza190ZXh0X3JlcGxhY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlRfUkVQTEFDRV9GVU5DVElPTiA9IEtFWVNQQUNFICsgIi5tYXNrX2ludF9yZXBsYWNlIjsKKworICAgIEBCZWZvcmUKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cFNjaGVtYSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAidGV4dCwgdGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gSUYgTk9UIEVYSVNUUyAiICsgVEVYVF9SRVBMQUNFX0ZVTkNUSU9OICsgIiAoY29sdW1uIHRleHQsIHJlcGxhY2VtZW50IHRleHQpICIgKworICAgICAgICAgICAgICAgICAgICAgICAiQ0FMTEVEIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIHRleHQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhICIgKworICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiByZXBsYWNlbWVudDsnIik7CisgICAgICAgIGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAiaW50LCBpbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OIElGIE5PVCBFWElTVFMgIiArIElOVF9SRVBMQUNFX0ZVTkNUSU9OICsgIiAoY29sdW1uIGludCwgcmVwbGFjZW1lbnQgaW50KSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIkNBTExFRCBPTiBOVUxMIElOUFVUICIgKworICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhICIgKworICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiByZXBsYWNlbWVudDsnIik7CisgICAgICAgIHN1cGVyLnNldHVwU2NoZW1hKCk7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIm9yZGVyPXswfSwgbWFzaz17MX0sIHR5cGU9ezJ9LCB2YWx1ZT17M30iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gb3B0aW9ucygpCisgICAgeworICAgICAgICBMaXN0PE9iamVjdFtdPiBvcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIG9yZGVyIDogQXJyYXlzLmFzTGlzdCgiQVNDIiwgIkRFU0MiKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgVEVYVF9SRVBMQUNFX0ZVTkNUSU9OICsgIigncmVkYWN0ZWQnKSIsICJ0ZXh0IiwgImFiYyIsICJyZWRhY3RlZCIgfSk7CisgICAgICAgICAgICBvcHRpb25zLmFkZChuZXcgT2JqZWN0W117IG9yZGVyLCBURVhUX1JFUExBQ0VfRlVOQ1RJT04gKyAiKCdzZWNyZXQnKSIsICJ0ZXh0IiwgImFiYyIsICJzZWNyZXQiIH0pOworICAgICAgICAgICAgb3B0aW9ucy5hZGQobmV3IE9iamVjdFtdeyBvcmRlciwgSU5UX1JFUExBQ0VfRlVOQ1RJT04gKyAiKDApIiwgImludCIsIDEyMywgMCB9KTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKG5ldyBPYmplY3RbXXsgb3JkZXIsIElOVF9SRVBMQUNFX0ZVTkNUSU9OICsgIigtMSkiLCAiaW50IiwgMTIzLCAtMSB9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3B0aW9uczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2UxMGUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1Rlc3QuamF2YQpAQCAtMCwwICsxLDU4MCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQm91bmRTdGF0ZW1lbnQ7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlByZXBhcmVkU3RhdGVtZW50OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5GdW5jdGlvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuTmF0aXZlRnVuY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuTmF0aXZlRnVuY3Rpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmcuQ29sdW1uTWFzay5ESVNBQkxFRF9FUlJPUl9NRVNTQUdFOworCisvKioKKyAqIFRlc3RzIHNjaGVtYSBhbHRlcmluZyBxdWVyaWVzICh7QGNvZGUgQ1JFQVRFIFRBQkxFfSwge0Bjb2RlIEFMVEVSIFRBQkxFfSwgZXRjLikgdGhhdCBhdHRhY2gvZGV0dGFjaCBkeW5hbWljIGRhdGEKKyAqIG1hc2tpbmcgZnVuY3Rpb25zIHRvIGNvbHVtbiBkZWZpbml0aW9ucy4KKyAqLworcHVibGljIGNsYXNzIENvbHVtbk1hc2tUZXN0IGV4dGVuZHMgQ29sdW1uTWFza1Rlc3RlcgoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25zKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gQ3JlYXRlIHRhYmxlIHdpdGggbWFza3MKKyAgICAgICAgU3RyaW5nIHRhYmxlID0gY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicyBzZXQ8aW50PiBNQVNLRUQgV0lUSCBERUZBVUxULCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImwgbGlzdDxpbnQ+IE1BU0tFRCBXSVRIIERFRkFVTFQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibSBtYXA8aW50LCBpbnQ+IE1BU0tFRCBXSVRIIERFRkFVTFQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnMgZnJvemVuPHNldDxpbnQ+PiBNQVNLRUQgV0lUSCBERUZBVUxULCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsIGZyb3plbjxsaXN0PGludD4+IE1BU0tFRCBXSVRIIERFRkFVTFQsICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm0gZnJvemVuPG1hcDxpbnQsIGludD4+IE1BU0tFRCBXSVRIIERFRkFVTFQpIik7CisgICAgICAgIGFzc2VydENvbHVtbklzTWFza2VkKHRhYmxlLCAicyIsICJtYXNrX2RlZmF1bHQiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgImwiLCAibWFza19kZWZhdWx0IiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uSXNNYXNrZWQodGFibGUsICJtIiwgIm1hc2tfZGVmYXVsdCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSk7CisgICAgICAgIGFzc2VydENvbHVtbklzTWFza2VkKHRhYmxlLCAiZnMiLCAibWFza19kZWZhdWx0IiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uSXNNYXNrZWQodGFibGUsICJmbCIsICJtYXNrX2RlZmF1bHQiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgImZtIiwgIm1hc2tfZGVmYXVsdCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSk7CisKKyAgICAgICAgLy8gQWx0ZXIgY29sdW1uIG1hc2tzCisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIHMgTUFTS0VEIFdJVEggbWFza19udWxsKCkiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgbCBNQVNLRUQgV0lUSCBtYXNrX251bGwoKSIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBtIE1BU0tFRCBXSVRIIG1hc2tfbnVsbCgpIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGZzIE1BU0tFRCBXSVRIIG1hc2tfbnVsbCgpIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGZsIE1BU0tFRCBXSVRIIG1hc2tfbnVsbCgpIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGZtIE1BU0tFRCBXSVRIIG1hc2tfbnVsbCgpIik7CisgICAgICAgIGFzc2VydENvbHVtbklzTWFza2VkKHRhYmxlLCAicyIsICJtYXNrX251bGwiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgImwiLCAibWFza19udWxsIiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uSXNNYXNrZWQodGFibGUsICJtIiwgIm1hc2tfbnVsbCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSk7CisgICAgICAgIGFzc2VydENvbHVtbklzTWFza2VkKHRhYmxlLCAiZnMiLCAibWFza19udWxsIiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uSXNNYXNrZWQodGFibGUsICJmbCIsICJtYXNrX251bGwiLCBlbXB0eUxpc3QoKSwgZW1wdHlMaXN0KCkpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgImZtIiwgIm1hc2tfbnVsbCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSk7CisKKyAgICAgICAgLy8gRHJvcCBtYXNrcworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBzIERST1AgTUFTS0VEIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGwgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgbSBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBmcyBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBmbCBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBmbSBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoInMiLCAibCIsICJtIiwgImZzIiwgImZsIiwgImZtIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VURUcygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyB0eXBlID0gY3JlYXRlVHlwZSgiQ1JFQVRFIFRZUEUgJXMgKGExIHZhcmludCwgYTIgdmFyaW50LCBhMyB2YXJpbnQpOyIpOworCisgICAgICAgIC8vIENyZWF0ZSB0YWJsZSB3aXRoIG1hc2sKKyAgICAgICAgU3RyaW5nIHRhYmxlID0gY3JlYXRlVGFibGUoZm9ybWF0KCJDUkVBVEUgVEFCTEUgJSVzIChrIGludCBQUklNQVJZIEtFWSwgdiAlcyBNQVNLRUQgV0lUSCBERUZBVUxUKSIsIHR5cGUpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uSXNNYXNrZWQodGFibGUsICJ2IiwgIm1hc2tfZGVmYXVsdCIsIGVtcHR5TGlzdCgpLCBlbXB0eUxpc3QoKSk7CisKKyAgICAgICAgLy8gQWx0ZXIgY29sdW1uIG1hc2sKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBNQVNLRUQgV0lUSCBtYXNrX251bGwoKSIpOworICAgICAgICBhc3NlcnRDb2x1bW5Jc01hc2tlZCh0YWJsZSwgInYiLCAibWFza19udWxsIiwgZW1wdHlMaXN0KCksIGVtcHR5TGlzdCgpKTsKKworICAgICAgICAvLyBEcm9wIG1hc2sKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoInYiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbHRlclRhYmxlQWRkTWFza2luZ1RvTm9uRXhpc3RpbmdDb2x1bW4oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgdGFibGUgPSBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiB0ZXh0KSIpOworICAgICAgICBleGVjdXRlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBJRiBFWElTVFMgdW5rbm93biBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKGZvcm1hdCgiQ29sdW1uIHdpdGggbmFtZSAndW5rbm93bicgZG9lc24ndCBleGlzdCBvbiB0YWJsZSAnJXMnIiwgdGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRRdWVyeSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdW5rbm93biBNQVNLRUQgV0lUSCBERUZBVUxUIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsdGVyVGFibGVSZW1vdmVNYXNraW5nRnJvbU5vbkV4aXN0aW5nQ29sdW1uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIHRhYmxlID0gY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgdGV4dCkiKTsKKyAgICAgICAgZXhlY3V0ZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgSUYgRVhJU1RTIHVua25vd24gRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoZm9ybWF0KCJDb2x1bW4gd2l0aCBuYW1lICd1bmtub3duJyBkb2Vzbid0IGV4aXN0IG9uIHRhYmxlICclcyciLCB0YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFF1ZXJ5KCJBTFRFUiBUQUJMRSAlcyBBTFRFUiB1bmtub3duIERST1AgTUFTS0VEIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsdGVyVGFibGVSZW1vdmVNYXNrRnJvbVVubWFza2VkQ29sdW1uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgdGV4dCkiKTsKKyAgICAgICAgZXhlY3V0ZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoInYiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTWFza2luZ0Z1bmN0aW9uTmFtZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIGNyZWF0ZSB0YWJsZQorICAgICAgICBjcmVhdGVUYWJsZU5hbWUoKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBmaW5kIG1hc2tpbmcgZnVuY3Rpb24gZm9yIHYsIG5vIGRlY2xhcmVkIGZ1bmN0aW9uIG1hdGNoZXMgdGhlIHNpZ25hdHVyZSBtYXNrX21pc3NpbmcoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFF1ZXJ5KCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGludCBNQVNLRUQgV0lUSCBtYXNrX21pc3NpbmcoKSkiKSk7CisKKyAgICAgICAgLy8gYWx0ZXIgdGFibGUKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgaW50KSIpOworICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIGZpbmQgbWFza2luZyBmdW5jdGlvbiBmb3Igdiwgbm8gZGVjbGFyZWQgZnVuY3Rpb24gbWF0Y2hlcyB0aGUgc2lnbmF0dXJlIG1hc2tfbWlzc2luZygpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFMVEVSIFRBQkxFICVzIEFMVEVSIHYgTUFTS0VEIFdJVEggbWFza19taXNzaW5nKCkiKTsKKworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAidiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRNYXNraW5nRnVuY3Rpb25Bcmd1bWVudHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBjcmVhdGUgdGFibGUKKyAgICAgICAgY3JlYXRlVGFibGVOYW1lKCk7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGZ1bmN0aW9uIHN5c3RlbS5tYXNrX2RlZmF1bHQoYW55KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFF1ZXJ5KCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGludCBNQVNLRUQgV0lUSCBtYXNrX2RlZmF1bHQoMSkpIikpOworCisgICAgICAgIC8vIGFsdGVyIHRhYmxlCisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGludCkiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBmb3IgZnVuY3Rpb24gc3lzdGVtLm1hc2tfZGVmYXVsdChhbnkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFMVEVSIFRBQkxFICVzIEFMVEVSIHYgTUFTS0VEIFdJVEggbWFza19kZWZhdWx0KDEpIik7CisKKyAgICAgICAgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKCJrIiwgInYiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkTWFza2luZ0Z1bmN0aW9uQXJndW1lbnRUeXBlcygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIGNyZWF0ZSB0YWJsZQorICAgICAgICBjcmVhdGVUYWJsZU5hbWUoKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkZ1bmN0aW9uIHN5c3RlbS5tYXNrX2lubmVyIHJlcXVpcmVzIGFuIGFyZ3VtZW50IG9mIHR5cGUgaW50LCBidXQgZm91bmQgYXJndW1lbnQgJ2EnIG9mIHR5cGUgYXNjaWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRRdWVyeSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiB0ZXh0IE1BU0tFRCBXSVRIIG1hc2tfaW5uZXIoJ2EnLCAnYicpKSIpKTsKKworICAgICAgICAvLyBhbHRlciB0YWJsZQorICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiB0ZXh0KSIpOworICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRnVuY3Rpb24gc3lzdGVtLm1hc2tfaW5uZXIgcmVxdWlyZXMgYW4gYXJndW1lbnQgb2YgdHlwZSBpbnQsIGJ1dCBmb3VuZCBhcmd1bWVudCAnYScgb2YgdHlwZSBhc2NpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBTFRFUiBUQUJMRSAlcyBBTFRFUiB2IE1BU0tFRCBXSVRIIG1hc2tfaW5uZXIoJ2EnLCAnYicpIik7CisgICAgICAgIGFzc2VydFRhYmxlQ29sdW1uc0FyZU5vdE1hc2tlZCgiayIsICJ2Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uTWFza2luZ1dpdGhOb3RNYXNraW5nRnVuY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBjcmVhdGUgdGFibGUKKyAgICAgICAgY3JlYXRlVGFibGVOYW1lKCk7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJOb3QtbWFza2luZyBmdW5jdGlvbiB0b2pzb24oKSBjYW5ub3QgYmUgdXNlZCBmb3IgbWFza2luZyB0YWJsZSBjb2x1bW5zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0UXVlcnkoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgdGV4dCBNQVNLRUQgV0lUSCB0b2pzb24oKSkiKSk7CisKKyAgICAgICAgLy8gYWx0ZXIgdGFibGUKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgdGV4dCkiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIk5vdC1tYXNraW5nIGZ1bmN0aW9uIHRvanNvbigpIGNhbm5vdCBiZSB1c2VkIGZvciBtYXNraW5nIHRhYmxlIGNvbHVtbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBNQVNLRUQgV0lUSCB0b2pzb24oKSIpOworICAgICAgICBhc3NlcnRUYWJsZUNvbHVtbnNBcmVOb3RNYXNrZWQoImsiLCAidiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlcGFyZWRTdGF0ZW1lbnQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiB0ZXh0IE1BU0tFRCBXSVRIIERFRkFVTFQpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDAsICdzZW5zaXRpdmUnKSIpOworCisgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IHNlc3Npb25OZXQoKTsKKyAgICAgICAgUHJlcGFyZWRTdGF0ZW1lbnQgcHJlcGFyZWQgPSBzZXNzaW9uLnByZXBhcmUoZm9ybWF0UXVlcnkoIlNFTEVDVCB2IEZST00gJXMgV0hFUkUgayA9ID8iKSk7CisgICAgICAgIEJvdW5kU3RhdGVtZW50IGJvdW5kID0gcHJlcGFyZWQuYmluZCgwKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChzZXNzaW9uLmV4ZWN1dGUoYm91bmQpLCByb3coIioqKioiKSk7CisKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHNlc3Npb24uZXhlY3V0ZShib3VuZCksIHJvdygic2Vuc2l0aXZlIikpOworCisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIHYgTUFTS0VEIFdJVEggbWFza19yZXBsYWNlKCdyZWRhY3RlZCcpIik7CisgICAgICAgIGFzc2VydFJvd3NOZXQoc2Vzc2lvbi5leGVjdXRlKGJvdW5kKSwgcm93KCJyZWRhY3RlZCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWaWV3cygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50LCBjIGludCwgdiB0ZXh0IE1BU0tFRCBXSVRIIG1hc2tfcmVwbGFjZSgncmVkYWN0ZWQnKSwgUFJJTUFSWSBLRVkgKGssIGMpKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgwLCAwLCAnc2Vuc2l0aXZlJykiKTsKKyAgICAgICAgU3RyaW5nIHZpZXcgPSBjcmVhdGVWaWV3KCJDUkVBVEUgTUFURVJJQUxJWkVEIFZJRVcgJXMgQVMgU0VMRUNUICogRlJPTSAlcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSEVSRSBrIElTIE5PVCBOVUxMIEFORCBjIElTIE5PVCBOVUxMIEFORCB2IElTIE5PVCBOVUxMICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBSSU1BUlkgS0VZICh2LCBrLCBjKSIpOworICAgICAgICB3YWl0Rm9yVmlld011dGF0aW9ucygpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQoZm9ybWF0KCJTRUxFQ1QgdiBGUk9NICVzLiVzIiwgS0VZU1BBQ0UsIHZpZXcpKSwgcm93KCJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KGZvcm1hdCgiU0VMRUNUIHYgRlJPTSAlcy4lcyBXSEVSRSB2PSdzZW5zaXRpdmUnIiwgS0VZU1BBQ0UsIHZpZXcpKSwgcm93KCJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KGZvcm1hdCgiU0VMRUNUIHYgRlJPTSAlcy4lcyBXSEVSRSB2PSdyZWRhY3RlZCciLCBLRVlTUEFDRSwgdmlldykpKTsKKworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiB2IERST1AgTUFTS0VEIik7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChmb3JtYXQoIlNFTEVDVCB2IEZST00gJXMuJXMiLCBLRVlTUEFDRSwgdmlldykpLCByb3coInNlbnNpdGl2ZSIpKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KGZvcm1hdCgiU0VMRUNUIHYgRlJPTSAlcy4lcyBXSEVSRSB2PSdzZW5zaXRpdmUnIiwgS0VZU1BBQ0UsIHZpZXcpKSwgcm93KCJzZW5zaXRpdmUiKSk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChmb3JtYXQoIlNFTEVDVCB2IEZST00gJXMuJXMgV0hFUkUgdj0ncmVkYWN0ZWQnIiwgS0VZU1BBQ0UsIHZpZXcpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVwYXJlZFN0YXRlbWVudE9uVmlldygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50LCBjIGludCwgdiB0ZXh0IE1BU0tFRCBXSVRIIERFRkFVTFQsIFBSSU1BUlkgS0VZIChrLCBjKSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoMCwgMCwgJ3NlbnNpdGl2ZScpIik7CisgICAgICAgIFN0cmluZyB2aWV3ID0gY3JlYXRlVmlldygiQ1JFQVRFIE1BVEVSSUFMSVpFRCBWSUVXICVzIEFTIFNFTEVDVCAqIEZST00gJXMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUgayBJUyBOT1QgTlVMTCBBTkQgYyBJUyBOT1QgTlVMTCBBTkQgdiBJUyBOT1QgTlVMTCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQUklNQVJZIEtFWSAodiwgaywgYykiKTsKKyAgICAgICAgd2FpdEZvclZpZXdNdXRhdGlvbnMoKTsKKworICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBzZXNzaW9uTmV0KCk7CisgICAgICAgIFByZXBhcmVkU3RhdGVtZW50IHByZXBhcmVkID0gc2Vzc2lvbi5wcmVwYXJlKGZvcm1hdCgiU0VMRUNUIHYgRlJPTSAlcy4lcyBXSEVSRSB2PT8iLCBLRVlTUEFDRSwgdmlldykpOworICAgICAgICBCb3VuZFN0YXRlbWVudCBib3VuZCA9IHByZXBhcmVkLmJpbmQoInNlbnNpdGl2ZSIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHNlc3Npb24uZXhlY3V0ZShib3VuZCksIHJvdygiKioqKiIpKTsKKworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiB2IERST1AgTUFTS0VEIik7CisgICAgICAgIGFzc2VydFJvd3NOZXQoc2Vzc2lvbi5leGVjdXRlKGJvdW5kKSwgcm93KCJzZW5zaXRpdmUiKSk7CisKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBNQVNLRUQgV0lUSCBtYXNrX3JlcGxhY2UoJ3JlZGFjdGVkJykiKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChzZXNzaW9uLmV4ZWN1dGUoYm91bmQpLCByb3coInJlZGFjdGVkIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdyb3VwQnkoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCwgYyBpbnQsIHYgdGV4dCwgUFJJTUFSWSBLRVkgKGssIGMpKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgwLCAwLCAnc2Vuc2l0aXZlJykiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoMCwgMSwgJ3NlbnNpdGl2ZScpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDEsIDAsICdzZW5zaXRpdmUnKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgxLCAxLCAnc2Vuc2l0aXZlJykiKTsKKworICAgICAgICAvLyB3aXRob3V0IG1hc2tzCisgICAgICAgIFN0cmluZyBxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICVzIEdST1VQIEJZIGsiOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQocXVlcnkpLCByb3coMSwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMCwgInNlbnNpdGl2ZSIpKTsKKworICAgICAgICAvLyB3aXRoIG1hc2tlZCByZWd1bGFyIGNvbHVtbgorICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiB2IE1BU0tFRCBXSVRIIG1hc2tfcmVwbGFjZSgncmVkYWN0ZWQnKSIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQocXVlcnkpLCByb3coMSwgMCwgInJlZGFjdGVkIiksIHJvdygwLCAwLCAicmVkYWN0ZWQiKSk7CisKKyAgICAgICAgLy8gd2l0aCBtYXNrZWQgY2x1c3RlcmluZyBrZXkKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgYyBNQVNLRUQgV0lUSCBtYXNrX3JlcGxhY2UoLTEpIik7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChxdWVyeSksIHJvdygxLCAtMSwgInJlZGFjdGVkIiksIHJvdygwLCAtMSwgInJlZGFjdGVkIikpOworCisgICAgICAgIC8vIHdpdGggbWFza2VkIHBhcnRpdGlvbiBrZXkKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgayBNQVNLRUQgV0lUSCBtYXNrX3JlcGxhY2UoLTEpIik7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChxdWVyeSksIHJvdygtMSwgLTEsICJyZWRhY3RlZCIpLCByb3coLTEsIC0xLCAicmVkYWN0ZWQiKSk7CisKKyAgICAgICAgLy8gYWdhaW4gd2l0aG91dCBtYXNrcworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBrIERST1AgTUFTS0VEIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGMgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBEUk9QIE1BU0tFRCIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQocXVlcnkpLCByb3coMSwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMCwgInNlbnNpdGl2ZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWdpbmcoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCwgYyBpbnQsIHYgdGV4dCwgUFJJTUFSWSBLRVkgKGssIGMpKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgwLCAwLCAnc2Vuc2l0aXZlJykiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoMCwgMSwgJ3NlbnNpdGl2ZScpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDEsIDAsICdzZW5zaXRpdmUnKSIpOworCisgICAgICAgIC8vIHdpdGhvdXQgbWFza3MKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMiLCByb3coMSwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMSwgInNlbnNpdGl2ZSIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDEiLCByb3coMSwgMCwgInNlbnNpdGl2ZSIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAiLCByb3coMCwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMSwgInNlbnNpdGl2ZSIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMgPSAxIiwgcm93KDAsIDEsICJzZW5zaXRpdmUiKSk7CisKKyAgICAgICAgLy8gd2l0aCBtYXNrZWQgcmVndWxhciBjb2x1bW4KKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBNQVNLRUQgV0lUSCBtYXNrX3JlcGxhY2UoJ3JlZGFjdGVkJykiKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMiLCByb3coMSwgMCwgInJlZGFjdGVkIiksIHJvdygwLCAwLCAicmVkYWN0ZWQiKSwgcm93KDAsIDEsICJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDEiLCByb3coMSwgMCwgInJlZGFjdGVkIikpOworICAgICAgICBhc3NlcnRSb3dzV2l0aFBhZ2luZygiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gMCIsIHJvdygwLCAwLCAicmVkYWN0ZWQiKSwgcm93KDAsIDEsICJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMgPSAxIiwgcm93KDAsIDEsICJyZWRhY3RlZCIpKTsKKworICAgICAgICAvLyB3aXRoIG1hc2tlZCBjbHVzdGVyaW5nIGtleQorICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBjIE1BU0tFRCBXSVRIIG1hc2tfcmVwbGFjZSgtMSkiKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMiLCByb3coMSwgLTEsICJyZWRhY3RlZCIpLCByb3coMCwgLTEsICJyZWRhY3RlZCIpLCByb3coMCwgLTEsICJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDEiLCByb3coMSwgLTEsICJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAiLCByb3coMCwgLTEsICJyZWRhY3RlZCIpLCByb3coMCwgLTEsICJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMgPSAxIiwgcm93KDAsIC0xLCAicmVkYWN0ZWQiKSk7CisKKyAgICAgICAgLy8gd2l0aCBtYXNrZWQgcGFydGl0aW9uIGtleQorICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBrIE1BU0tFRCBXSVRIIG1hc2tfcmVwbGFjZSgtMSkiKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMiLCByb3coLTEsIC0xLCAicmVkYWN0ZWQiKSwgcm93KC0xLCAtMSwgInJlZGFjdGVkIiksIHJvdygtMSwgLTEsICJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDEiLCByb3coLTEsIC0xLCAicmVkYWN0ZWQiKSk7CisgICAgICAgIGFzc2VydFJvd3NXaXRoUGFnaW5nKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSAwIiwgcm93KC0xLCAtMSwgInJlZGFjdGVkIiksIHJvdygtMSwgLTEsICJyZWRhY3RlZCIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMgPSAxIiwgcm93KC0xLCAtMSwgInJlZGFjdGVkIikpOworCisgICAgICAgIC8vIGFnYWluIHdpdGhvdXQgbWFza3MKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgayBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBjIERST1AgTUFTS0VEIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIHYgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMiLCByb3coMSwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMSwgInNlbnNpdGl2ZSIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDEiLCByb3coMSwgMCwgInNlbnNpdGl2ZSIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAiLCByb3coMCwgMCwgInNlbnNpdGl2ZSIpLCByb3coMCwgMSwgInNlbnNpdGl2ZSIpKTsKKyAgICAgICAgYXNzZXJ0Um93c1dpdGhQYWdpbmcoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMgPSAxIiwgcm93KDAsIDEsICJzZW5zaXRpdmUiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCByb3dzIGFyZSBhbHdheXMgb3JkZXJlZCBhY2NvcmRpbmcgdG8gdGhlIGNsZWFyIHZhbHVlcyBvZiB0aGUgY29sdW1ucywgZXZlbiBmb3IgdGhlIHBvc3Qtb3JkZXJpbmcgZG9uZQorICAgICAqIGZvciBxdWVyaWVzIHdpdGgge0Bjb2RlIElOfSByZXN0cmljdGlvbnMgYW5kIHtAY29kZSBPUkRFUiBCWX0gY2xhdXNlcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0T3JkZXJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCwgYyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAoaywgYykpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDAsIDAsIDApIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDAsIDEsIDEpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDEsIDAsIDMpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDEsIDEsIDQpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDIsIDAsIDYpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDIsIDEsIDcpIik7CisgICAgICAgIE5hdGl2ZUZ1bmN0aW9ucy5pbnN0YW5jZS5hZGQoTkVHQVRJVkUpOworCisgICAgICAgIC8vIFRlc3Qgb3JkZXJpbmcgd2l0aG91dCBtYXNraW5nLCBqdXN0IGZvciByZWZlcmVuY2UKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAxLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMSwgMCwgMyksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIDEsIDQpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCAwLCA2KSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMiwgMSwgNykpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgQVNDIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAwLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMiwgMCwgNiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAxLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMiwgMSwgNykpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgREVTQyIpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAxLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMSwgMSwgNCksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIDEsIDcpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMSwgMCwgMyksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIDAsIDYpKTsKKworICAgICAgICAvLyBUZXN0IG9yZGVyaW5nIHdpdGggbWFudWFsbHkgYXBwbGllZCBtYXNraW5nIGZ1bmN0aW9uLCBqdXN0IGZvciByZWZlcmVuY2UKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KCJTRUxFQ1QgaywgbWFza19uZWdhdGl2ZShjKSwgdiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0wLCAwKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0xLCAxKSwgLy8gKDAsIDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0wLCAzKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0xLCA0KSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0wLCA2KSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0xLCA3KSk7IC8vICgyLCAxLCA3KQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgaywgbWFza19uZWdhdGl2ZShjKSwgdiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgQVNDIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0wLCAwKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0wLCAzKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0wLCA2KSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0xLCAxKSwgLy8gKDAsIDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0xLCA0KSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0xLCA3KSk7IC8vICgyLCAxLCA3KQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgaywgbWFza19uZWdhdGl2ZShjKSwgdiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgREVTQyIpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAtMSwgMSksIC8vICgwLCAxLCAxKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAtMSwgNCksIC8vICgxLCAxLCA0KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCAtMSwgNyksIC8vICgyLCAxLCA3KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAtMCwgMCksIC8vICgwLCAwLCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAtMCwgMyksIC8vICgxLCAwLCAzKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCAtMCwgNikpOyAvLyAoMiwgMCwgNikKKworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBjIE1BU0tFRCBXSVRIIG1hc2tfbmVnYXRpdmUoKSIpOworCisgICAgICAgIC8vIFRlc3Qgb3JkZXJpbmcgb2Ygd2lsZGNhcmQgcXVlcmllcyB3aXRoIG1hc2tlZCBjb2x1bW4KKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0wLCAwKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0xLCAxKSwgLy8gKDAsIDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0wLCAzKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0xLCA0KSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0wLCA2KSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0xLCA3KSk7IC8vICgyLCAxLCA3KQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgQVNDIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0wLCAwKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0wLCAzKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0wLCA2KSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0xLCAxKSwgLy8gKDAsIDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0xLCA0KSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0xLCA3KSk7IC8vICgyLCAxLCA3KQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgREVTQyIpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAtMSwgMSksIC8vICgwLCAxLCAxKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAtMSwgNCksIC8vICgxLCAxLCA0KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCAtMSwgNyksIC8vICgyLCAxLCA3KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAtMCwgMCksIC8vICgwLCAwLCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAtMCwgMyksIC8vICgxLCAwLCAzKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCAtMCwgNikpOyAvLyAoMiwgMCwgNikKKworICAgICAgICAvLyBUZXN0IG9yZGVyaW5nIG9mIGNvbHVtbiBzZWxlY3Rpb24gcXVlcmllcyB3aXRoIG1hc2tlZCBjb2x1bW4KKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KCJTRUxFQ1QgaywgYywgdiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0wLCAwKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0xLCAxKSwgLy8gKDAsIDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0wLCAzKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0xLCA0KSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0wLCA2KSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0xLCA3KSk7IC8vICgyLCAxLCA3KQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgaywgYywgdiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgQVNDIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0wLCAwKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0wLCAzKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0wLCA2KSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIC0xLCAxKSwgLy8gKDAsIDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIC0xLCA0KSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIC0xLCA3KSk7IC8vICgyLCAxLCA3KQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgaywgYywgdiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgREVTQyIpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAtMSwgMSksIC8vICgwLCAxLCAxKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAtMSwgNCksIC8vICgxLCAxLCA0KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCAtMSwgNyksIC8vICgyLCAxLCA3KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAtMCwgMCksIC8vICgwLCAwLCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAtMCwgMyksIC8vICgxLCAwLCAzKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCAtMCwgNikpOyAvLyAoMiwgMCwgNikKKworICAgICAgICAvLyBUZXN0IG9yZGVyaW5nIG9mIGNvbHVtbiBzZWxlY3Rpb24gcXVlcmllcyB3aXRoIG1hc2tlZCBjb2x1bW4sIHdpdGhvdXQgc2VsZWN0aW5nIHRoZSBvcmRlcmVkIGNvbHVtbgorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQoIlNFTEVDVCBrLCB2IEZST00gJXMgV0hFUkUgayBJTiAoMCwgMSwgMikiKSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMCwgMCksIC8vICgwLCAwLCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAxKSwgLy8gKDAsIDEsIDEpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIDMpLCAvLyAoMSwgMCwgMykKKyAgICAgICAgICAgICAgICAgICAgICByb3coMSwgNCksIC8vICgxLCAxLCA0KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCA2KSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIDcpKTsgLy8gKDIsIDEsIDcpCisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldFdpdGhvdXRQYWdpbmcoIlNFTEVDVCBrLCB2IEZST00gJXMgV0hFUkUgayBJTiAoMCwgMSwgMikgT1JERVIgQlkgYyBBU0MiKSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coMCwgMCksIC8vICgwLCAwLCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAzKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIDYpLCAvLyAoMiwgMCwgNikKKyAgICAgICAgICAgICAgICAgICAgICByb3coMCwgMSksIC8vICgwLCAxLCAxKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCA0KSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIDcpKTsgLy8gKDIsIDEsIDcpCisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldFdpdGhvdXRQYWdpbmcoIlNFTEVDVCBrLCB2IEZST00gJXMgV0hFUkUgayBJTiAoMCwgMSwgMikgT1JERVIgQlkgYyBERVNDIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIDEpLCAvLyAoMCwgMSwgMSkKKyAgICAgICAgICAgICAgICAgICAgICByb3coMSwgNCksIC8vICgxLCAxLCA0KQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCA3KSwgLy8gKDIsIDEsIDcpCisgICAgICAgICAgICAgICAgICAgICAgcm93KDAsIDApLCAvLyAoMCwgMCwgMCkKKyAgICAgICAgICAgICAgICAgICAgICByb3coMSwgMyksIC8vICgxLCAwLCAzKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCA2KSk7IC8vICgyLCAwLCA2KQorCisgICAgICAgIC8vIFRlc3Qgb3JkZXJpbmcgb2Ygd2lsZGNhcmQgSlNPTiBxdWVyaWVzIHdpdGggbWFza2VkIGNvbHVtbgorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQoIlNFTEVDVCBKU09OICogRlJPTSAlcyBXSEVSRSBrIElOICgwLCAxLCAyKSIpLAorICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wia1wiOiAwLCBcImNcIjogMCwgXCJ2XCI6IDB9IiksIC8vICgwLCAwLCAwKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wia1wiOiAwLCBcImNcIjogLTEsIFwidlwiOiAxfSIpLCAvLyAoMCwgMSwgMSkKKyAgICAgICAgICAgICAgICAgICAgICByb3coIntcImtcIjogMSwgXCJjXCI6IDAsIFwidlwiOiAzfSIpLCAvLyAoMSwgMCwgMykKKyAgICAgICAgICAgICAgICAgICAgICByb3coIntcImtcIjogMSwgXCJjXCI6IC0xLCBcInZcIjogNH0iKSwgLy8gKDEsIDEsIDQpCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDIsIFwiY1wiOiAwLCBcInZcIjogNn0iKSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDIsIFwiY1wiOiAtMSwgXCJ2XCI6IDd9IikpOyAvLyAoMiwgMSwgNykKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0V2l0aG91dFBhZ2luZygiU0VMRUNUIEpTT04gKiBGUk9NICVzIFdIRVJFIGsgSU4gKDAsIDEsIDIpIE9SREVSIEJZIGMgQVNDIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDAsIFwiY1wiOiAwLCBcInZcIjogMH0iKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDEsIFwiY1wiOiAwLCBcInZcIjogM30iKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDIsIFwiY1wiOiAwLCBcInZcIjogNn0iKSwgLy8gKDIsIDAsIDYpCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDAsIFwiY1wiOiAtMSwgXCJ2XCI6IDF9IiksIC8vICgwLCAxLCAxKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wia1wiOiAxLCBcImNcIjogLTEsIFwidlwiOiA0fSIpLCAvLyAoMSwgMSwgNCkKKyAgICAgICAgICAgICAgICAgICAgICByb3coIntcImtcIjogMiwgXCJjXCI6IC0xLCBcInZcIjogN30iKSk7IC8vICgyLCAxLCA3KQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRob3V0UGFnaW5nKCJTRUxFQ1QgSlNPTiAqIEZST00gJXMgV0hFUkUgayBJTiAoMCwgMSwgMikgT1JERVIgQlkgYyBERVNDIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDAsIFwiY1wiOiAtMSwgXCJ2XCI6IDF9IiksIC8vICgwLCAxLCAxKQorICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wia1wiOiAxLCBcImNcIjogLTEsIFwidlwiOiA0fSIpLCAvLyAoMSwgMSwgNCkKKyAgICAgICAgICAgICAgICAgICAgICByb3coIntcImtcIjogMiwgXCJjXCI6IC0xLCBcInZcIjogN30iKSwgLy8gKDIsIDEsIDcpCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDAsIFwiY1wiOiAwLCBcInZcIjogMH0iKSwgLy8gKDAsIDAsIDApCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDEsIFwiY1wiOiAwLCBcInZcIjogM30iKSwgLy8gKDEsIDAsIDMpCisgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrXCI6IDIsIFwiY1wiOiAwLCBcInZcIjogNn0iKSk7IC8vICgyLCAwLCA2KQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZUZsYWcoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyB2ZXJpZnkgdGhhdCB3ZSBjYW5ub3QgY3JlYXRlIHRhYmxlcyB3aXRoIG1hc2tlZCBjb2x1bW5zIGlmIERETSBpcyBkaXNhYmxlZAorICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RHluYW1pY0RhdGFNYXNraW5nRW5hYmxlZChmYWxzZSk7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoRElTQUJMRURfRVJST1JfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIFRBQkxFIHQgKGsgaW50IFBSSU1BUlkgS0VZLCB2IHRleHQgTUFTS0VEIFdJVEggREVGQVVMVCkiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZShESVNBQkxFRF9FUlJPUl9NRVNTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgVEFCTEUgdCAoayBpbnQgTUFTS0VEIFdJVEggREVGQVVMVCBQUklNQVJZIEtFWSwgdiB0ZXh0KSIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKERJU0FCTEVEX0VSUk9SX01FU1NBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBUQUJMRSB0IChrIGludCwgYyBpbnQgTUFTS0VEIFdJVEggREVGQVVMVCwgdiB0ZXh0LCBQUklNQVJZIEtFWShrLCBjKSkiKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhhdCB3ZSBjYW5ub3QgbWFzayBhbiBleGlzdGluZyBjb2x1bW4gaWYgRERNIGlzIGRpc2FibGVkCisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50LCBjIGludCwgcyBpbnQgc3RhdGljLCByIGludCwgUFJJTUFSWSBLRVkoaywgYykpIik7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoRElTQUJMRURfRVJST1JfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgJXMgQUxURVIgayBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoRElTQUJMRURfRVJST1JfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgJXMgQUxURVIgYyBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoRElTQUJMRURfRVJST1JfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgJXMgQUxURVIgcyBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoRElTQUJMRURfRVJST1JfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgJXMgQUxURVIgciBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisKKyAgICAgICAgLy8gZW5hYmxlIERETSBhbmQgYWRkIHNvbWUgbWFza2VkIGRhdGEKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldER5bmFtaWNEYXRhTWFza2luZ0VuYWJsZWQodHJ1ZSk7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGsgTUFTS0VEIFdJVEggREVGQVVMVCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBjIE1BU0tFRCBXSVRIIERFRkFVTFQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgcyBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIHIgTUFTS0VEIFdJVEggREVGQVVMVCIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgcywgcikgVkFMVUVTICgxLCAyLCAzLCA0KSIpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQoIlNFTEVDVCAqIEZST00gJXMiKSwgcm93KDAsIDAsIDAsIDApKTsKKworICAgICAgICAvLyB2ZXJpZnkgdGhhdCBjb2x1bW4gbWFza3MgYXJlIG5vdCBhcHBsaWVkIGlmIERETSBpcyBkaXNhYmxlZAorICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RHluYW1pY0RhdGFNYXNraW5nRW5hYmxlZChmYWxzZSk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldCgiU0VMRUNUICogRlJPTSAlcyIpLCByb3coMSwgMiwgMywgNCkpOworCisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHdlIGNhbiBkcm9wIGNvbHVtbiBtYXNrcyBldmVuIGlmIERETSBpcyBkaXNhYmxlZAorICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBrIERST1AgTUFTS0VEIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGMgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgcyBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiByIERST1AgTUFTS0VEIik7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREeW5hbWljRGF0YU1hc2tpbmdFbmFibGVkKHRydWUpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQoIlNFTEVDVCAqIEZST00gJXMiKSwgcm93KDEsIDIsIDMsIDQpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Um93c1dpdGhQYWdpbmcoU3RyaW5nIHF1ZXJ5LCBPYmplY3RbXS4uLiByb3dzKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgcGFnZVNpemUgOiBBcnJheXMuYXNMaXN0KDEsIDIsIDMsIDQsIDUsIDEwMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldFdpdGhQYWdpbmcocXVlcnksIHBhZ2VTaXplKSwgcm93cyk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGxpbWl0IDogQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0LCA1LCAxMDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldFdpdGhQYWdpbmcocXVlcnkgKyAiIExJTUlUICIgKyBsaW1pdCwgcGFnZVNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmNvcHlPZlJhbmdlKHJvd3MsIDAsIE1hdGgubWluKGxpbWl0LCByb3dzLmxlbmd0aCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZ1bmN0aW9uRmFjdG9yeSBORUdBVElWRSA9IG5ldyBGdW5jdGlvbkZhY3RvcnkoIm1hc2tfbmVnYXRpdmUiLCBGdW5jdGlvblBhcmFtZXRlci5maXhlZChDUUwzVHlwZS5OYXRpdmUuSU5UKSkKKyAgICB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgTmF0aXZlRnVuY3Rpb24gZG9HZXRPckNyZWF0ZUZ1bmN0aW9uKExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBhcmdUeXBlcywgQWJzdHJhY3RUeXBlPD8+IHJlY2VpdmVyVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXNraW5nRnVuY3Rpb24obmFtZSwgYXJnVHlwZXMuZ2V0KDApLCBhcmdUeXBlcy5nZXQoMCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIE1hc2tlciBtYXNrZXIoQnl0ZUJ1ZmZlci4uLiBwYXJhbWV0ZXJzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJiIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYiA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHZhbHVlID0gSW50MzJUeXBlLmluc3RhbmNlLmNvbXBvc2UoYmIpICogLTE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50MzJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrVGVzdGVyLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrVGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmOGIwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtbklkZW50aWZpZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5VbnR5cGVkUmVzdWx0U2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlNjYWxhckZ1bmN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuUmV2ZXJzZWRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUtleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFLZXlzcGFjZVRhYmxlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVXNlckZ1bmN0aW9uczsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRlc3RzIHRhYmxlIGNvbHVtbnMgd2l0aCBhdHRhY2hlZCBkeW5hbWljIGRhdGEgbWFza2luZyBmdW5jdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBDb2x1bW5NYXNrVGVzdGVyIGV4dGVuZHMgQ1FMVGVzdGVyCit7CisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUk5BTUUgPSAiZGRtX3VzZXIiOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEID0gImRkbV9wYXNzd29yZCI7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKQorICAgIHsKKyAgICAgICAgQ1FMVGVzdGVyLnNldFVwQ2xhc3MoKTsKKyAgICAgICAgcmVxdWlyZUF1dGhlbnRpY2F0aW9uKCk7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREeW5hbWljRGF0YU1hc2tpbmdFbmFibGVkKHRydWUpOworICAgICAgICB1c2VTdXBlclVzZXIoKTsKKyAgICAgICAgZXhlY3V0ZU5ldChmb3JtYXQoIkNSRUFURSBVU0VSIElGIE5PVCBFWElTVFMgJXMgV0lUSCBQQVNTV09SRCAnJXMnIiwgVVNFUk5BTUUsIFBBU1NXT1JEKSk7CisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBBTEwgT04gS0VZU1BBQ0UgJXMgVE8gJXMiLCBLRVlTUEFDRSwgVVNFUk5BTUUpKTsKKyAgICAgICAgZXhlY3V0ZU5ldChmb3JtYXQoIlJFVk9LRSBVTk1BU0sgT04gS0VZU1BBQ0UgJXMgRlJPTSAlcyIsIEtFWVNQQUNFLCBVU0VSTkFNRSkpOworICAgICAgICB1c2VVc2VyKFVTRVJOQU1FLCBQQVNTV09SRCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0VGFibGVDb2x1bW5zQXJlTm90TWFza2VkKFN0cmluZy4uLiBjb2x1bW5zKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBmb3IgKFN0cmluZyBjb2x1bW4gOiBjb2x1bW5zKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRDb2x1bW5Jc05vdE1hc2tlZChjdXJyZW50VGFibGUoKSwgY29sdW1uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFZpZXdDb2x1bW5zQXJlTm90TWFza2VkKFN0cmluZy4uLiBjb2x1bW5zKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBmb3IgKFN0cmluZyBjb2x1bW4gOiBjb2x1bW5zKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRDb2x1bW5Jc05vdE1hc2tlZChjdXJyZW50VmlldygpLCBjb2x1bW4pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29sdW1uSXNOb3RNYXNrZWQoU3RyaW5nIHRhYmxlLCBTdHJpbmcgY29sdW1uKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBDb2x1bW5NYXNrIG1hc2sgPSBnZXRDb2x1bW5NYXNrKHRhYmxlLCBjb2x1bW4pOworICAgICAgICBhc3NlcnROdWxsKGZvcm1hdCgiTWFzayBmb3IgY29sdW1uICclcyciLCBjb2x1bW4pLCBtYXNrKTsKKworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoZm9ybWF0KCJTRUxFQ1QgKiBGUk9NICVzLiVzIFdIRVJFIGtleXNwYWNlX25hbWUgPSA/IEFORCB0YWJsZV9uYW1lID0gPyBBTkQgY29sdW1uX25hbWUgPSA/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFDb25zdGFudHMuU0NIRU1BX0tFWVNQQUNFX05BTUUsIFNjaGVtYUtleXNwYWNlVGFibGVzLkNPTFVNTl9NQVNLUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTUEFDRSwgdGFibGUsIGNvbHVtbikpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydENvbHVtbklzTWFza2VkKFN0cmluZyB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBmdW5jdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IHBhcnRpYWxBcmd1bWVudFR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gcGFydGlhbEFyZ3VtZW50VmFsdWVzKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBLZXlzcGFjZU1ldGFkYXRhIGtleXNwYWNlTWV0YWRhdGEgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKS5nZXRNZXRhZGF0YSgpOworICAgICAgICBUYWJsZU1ldGFkYXRhIHRhYmxlTWV0YWRhdGEgPSBrZXlzcGFjZU1ldGFkYXRhLmdldFRhYmxlT3JWaWV3TnVsbGFibGUodGFibGUpOworICAgICAgICBhc3NlcnROb3ROdWxsKHRhYmxlTWV0YWRhdGEpOworICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW5NZXRhZGF0YSA9IHRhYmxlTWV0YWRhdGEuZ2V0Q29sdW1uKENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQoY29sdW1uLCBmYWxzZSkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbHVtbk1ldGFkYXRhKTsKKyAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGNvbHVtblR5cGUgPSBjb2x1bW5NZXRhZGF0YS50eXBlOworCisgICAgICAgIC8vIFZlcmlmeSB0aGUgY29sdW1uIG1hc2sgaW4gdGhlIGluLW1lbW9yeSBzY2hlbWEKKyAgICAgICAgQ29sdW1uTWFzayBtYXNrID0gZ2V0Q29sdW1uTWFzayh0YWJsZSwgY29sdW1uKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtYXNrKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYXNrLnBhcnRpYWxBcmd1bWVudFR5cGVzKCkpLmlzRXF1YWxUbyhjb2x1bW5UeXBlLmlzUmV2ZXJzZWQoKSAmJiBmdW5jdGlvbk5hbWUuZXF1YWxzKCJtYXNrX3JlcGxhY2UiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UocGFydGlhbEFyZ3VtZW50VHlwZXMuZ2V0KDApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBhcnRpYWxBcmd1bWVudFR5cGVzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYXNrLnBhcnRpYWxBcmd1bWVudFZhbHVlcygpKS5pc0VxdWFsVG8ocGFydGlhbEFyZ3VtZW50VmFsdWVzKTsKKworICAgICAgICAvLyBWZXJpZnkgdGhlIGZ1bmN0aW9uIGluIHRoZSBjb2x1bW4gbWFzaworICAgICAgICBTY2FsYXJGdW5jdGlvbiBmdW5jdGlvbiA9IG1hc2suZnVuY3Rpb247CisgICAgICAgIGFzc2VydE5vdE51bGwoZnVuY3Rpb24pOworICAgICAgICBhc3NlcnRUaGF0KGZ1bmN0aW9uLm5hbWUoKS5uYW1lKS5pc0VxdWFsVG8oZnVuY3Rpb25OYW1lKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmdW5jdGlvbi5hcmdUeXBlcygpLmdldCgwKS5hc0NRTDNUeXBlKCkpLmlzRXF1YWxUbyhjb2x1bW5NZXRhZGF0YS50eXBlLmFzQ1FMM1R5cGUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZnVuY3Rpb24uYXJnVHlwZXMoKS5zaXplKCkpLmlzRXF1YWxUbyhwYXJ0aWFsQXJndW1lbnRUeXBlcy5zaXplKCkgKyAxKTsKKworICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgcGVyc2lzdGVkIGNvbHVtbiBtZXRhZGF0YQorICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IGNvbHVtblJvd3MgPSBleGVjdXRlKCJTRUxFQ1QgKiBGUk9NIHN5c3RlbV9zY2hlbWEuY29sdW1ucyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0hFUkUga2V5c3BhY2VfbmFtZSA9ID8gQU5EIHRhYmxlX25hbWUgPSA/IEFORCBjb2x1bW5fbmFtZSA9ID8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWVNQQUNFLCB0YWJsZSwgY29sdW1uKTsKKyAgICAgICAgQ29sdW1uTWV0YWRhdGEgcGVyc2lzdGVkQ29sdW1uID0gU2NoZW1hS2V5c3BhY2UuY3JlYXRlQ29sdW1uRnJvbVJvdyhjb2x1bW5Sb3dzLm9uZSgpLCBrZXlzcGFjZU1ldGFkYXRhLnR5cGVzLCBVc2VyRnVuY3Rpb25zLm5vbmUoKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHRoZSBjb2x1bW4gbWFzayBpbiB0aGUgcGVyc2lzdGVkIHNjaGVtYQorICAgICAgICBDb2x1bW5NYXNrIHNhdmVkTWFzayA9IHBlcnNpc3RlZENvbHVtbi5nZXRNYXNrKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoc2F2ZWRNYXNrKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYXNrKS5pc0VxdWFsVG8oc2F2ZWRNYXNrKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYXNrLmZ1bmN0aW9uLmFyZ1R5cGVzKCkpLmlzRXF1YWxUbyhzYXZlZE1hc2suZnVuY3Rpb24uYXJnVHlwZXMoKSk7CisgICAgfQorCisgICAgQE51bGxhYmxlCisgICAgcHJvdGVjdGVkIENvbHVtbk1hc2sgZ2V0Q29sdW1uTWFzayhTdHJpbmcgdGFibGUsIFN0cmluZyBjb2x1bW4pCisgICAgeworICAgICAgICBUYWJsZU1ldGFkYXRhIHRhYmxlTWV0YWRhdGEgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0VGFibGVNZXRhZGF0YShLRVlTUEFDRSwgdGFibGUpOworICAgICAgICBhc3NlcnROb3ROdWxsKHRhYmxlTWV0YWRhdGEpOworICAgICAgICBDb2x1bW5NZXRhZGF0YSBjb2x1bW5NZXRhZGF0YSA9IHRhYmxlTWV0YWRhdGEuZ2V0Q29sdW1uKENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQoY29sdW1uLCBmYWxzZSkpOworCisgICAgICAgIGlmIChjb2x1bW5NZXRhZGF0YSA9PSBudWxsKQorICAgICAgICAgICAgZmFpbChmb3JtYXQoIlVua25vd24gY29sdW1uICclcyciLCBjb2x1bW4pKTsKKworICAgICAgICByZXR1cm4gY29sdW1uTWV0YWRhdGEuZ2V0TWFzaygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0NvbHVtbk1hc2tXaXRoVHlwZUFsdGVyaW5nRnVuY3Rpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrV2l0aFR5cGVBbHRlcmluZ0Z1bmN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MzUwYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrV2l0aFR5cGVBbHRlcmluZ0Z1bmN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGUuTmF0aXZlLkFTQ0lJOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlLk5hdGl2ZS5CSUdJTlQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGUuTmF0aXZlLkJMT0I7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGUuTmF0aXZlLklOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZS5OYXRpdmUuVEVYVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZS5OYXRpdmUuVkFSSU5UOworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXRUaHJvd25CeTsKKworLyoqCisgKiB7QGxpbmsgQ29sdW1uTWFza1Rlc3Rlcn0gZm9yIG1hc2tzIHVzaW5nIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0IHJldHVybiB2YWx1ZXMgd2l0aCBhIHR5cGUgZGlmZmVyZW50IHRvIHRoZSB0eXBlIG9mIHRoZQorICogbWFza2VkIGNvbHVtbi4gVGhvc2UgcXVlcmllcyBzaG91bGQgZmFpbC4KKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBDb2x1bW5NYXNrV2l0aFR5cGVBbHRlcmluZ0Z1bmN0aW9uVGVzdCBleHRlbmRzIENvbHVtbk1hc2tUZXN0ZXIKK3sKKyAgICAvKiogVGhlIGNvbHVtbiBtYXNrIGFzIGV4cHJlc3NlZCBpbiBDUUwgc3RhdGVtZW50cyByaWdodCBhZnRlciB0aGUge0Bjb2RlIE1BU0tFRCBXSVRIfSBrZXl3b3Jkcy4gKi8KKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIKKyAgICBwdWJsaWMgU3RyaW5nIG1hc2s7CisKKyAgICAvKiogVGhlIHR5cGUgb2YgdGhlIG1hc2tlZCBjb2x1bW4uICovCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDEpCisgICAgcHVibGljIENRTDNUeXBlLk5hdGl2ZSB0eXBlOworCisgICAgLyoqIFRoZSB0eXBlIHJldHVybmVkIGJ5IHRoZSB0ZXN0ZWQgbWFza2luZyBmdW5jdGlvbi4gKi8KKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMikKKyAgICBwdWJsaWMgQ1FMM1R5cGUgcmV0dXJuZWRUeXBlOworCisgICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZFN1Y2NlZWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgZXJyb3JNZXNzYWdlOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIm1hc2s9ezB9IHR5cGU9ezF9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IG9wdGlvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgIHsgIm1hc2tfZGVmYXVsdCgpIiwgSU5ULCBJTlQgfSwKKyAgICAgICAgeyAibWFza19kZWZhdWx0KCkiLCBURVhULCBURVhUIH0sCisgICAgICAgIHsgIm1hc2tfbnVsbCgpIiwgSU5ULCBJTlQgfSwKKyAgICAgICAgeyAibWFza19udWxsKCkiLCBURVhULCBURVhUIH0sCisgICAgICAgIHsgIm1hc2tfaGFzaCgpIiwgSU5ULCBCTE9CIH0sCisgICAgICAgIHsgIm1hc2tfaGFzaCgnU0hBLTUxMicpIiwgSU5ULCBCTE9CIH0sCisgICAgICAgIHsgIm1hc2tfaW5uZXIoMSwyKSIsIFRFWFQsIFRFWFQgfSwKKyAgICAgICAgeyAibWFza19vdXRlcigxLDIpIiwgVEVYVCwgVEVYVCB9LAorICAgICAgICB7ICJtYXNrX3JlcGxhY2UoMCkiLCBJTlQsIElOVCB9LAorICAgICAgICB7ICJtYXNrX3JlcGxhY2UoMCkiLCBCSUdJTlQsIEJJR0lOVCB9LAorICAgICAgICB7ICJtYXNrX3JlcGxhY2UoMCkiLCBWQVJJTlQsIFZBUklOVCB9LAorICAgICAgICB7ICJtYXNrX3JlcGxhY2UoJ3JlZGFjdGVkJykiLCBBU0NJSSwgQVNDSUkgfSwKKyAgICAgICAgeyAibWFza19yZXBsYWNlKCdyZWRhY3RlZCcpIiwgVEVYVCwgVEVYVCB9IH0pOworICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cEV4cGVjdGVkUmVzdWx0cygpCisgICAgeworICAgICAgICBzaG91bGRTdWNjZWVkID0gcmV0dXJuZWRUeXBlID09IHR5cGU7CisgICAgICAgIGVycm9yTWVzc2FnZSA9IHNob3VsZFN1Y2NlZWQgPyBudWxsIDogZm9ybWF0KCJNYXNraW5nIGZ1bmN0aW9uICVzIHJldHVybiB0eXBlIGlzICVzLiIsIG1hc2ssIHJldHVybmVkVHlwZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZUFsdGVyaW5nRnVuY3Rpb25PbkNyZWF0ZVRhYmxlKCkKKyAgICB7CisgICAgICAgIHRlc3RPbkNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMuJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2ICVzIE1BU0tFRCBXSVRIICVzKSIpOworICAgICAgICB0ZXN0T25DcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzLiVzIChrICVzIE1BU0tFRCBXSVRIICVzIFBSSU1BUlkgS0VZLCB2IGludCkiKTsKKyAgICAgICAgdGVzdE9uQ3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcy4lcyAoazEgaW50LCBrMiAlcyBNQVNLRUQgV0lUSCAlcywgUFJJTUFSWSBLRVkoKGsxLCBrMikpKSIpOworICAgICAgICB0ZXN0T25DcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzLiVzIChrIGludCwgYyAlcyBNQVNLRUQgV0lUSCAlcywgUFJJTUFSWSBLRVkoaywgYykpIFdJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAoYyBBU0MpIik7CisgICAgICAgIHRlc3RPbkNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMuJXMgKGsgaW50LCBjICVzIE1BU0tFRCBXSVRIICVzLCBQUklNQVJZIEtFWShrLCBjKSkgV0lUSCBDTFVTVEVSSU5HIE9SREVSIEJZIChjIERFU0MpIik7CisgICAgICAgIHRlc3RPbkNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMuJXMgKGsgaW50LCBjIGludCwgcyAlcyBTVEFUSUMgTUFTS0VEIFdJVEggJXMsIFBSSU1BUlkgS0VZKGssIGMpKSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0T25DcmVhdGVUYWJsZShTdHJpbmcgcXVlcnkpCisgICAgeworICAgICAgICBTdHJpbmcgZm9ybWF0dGVkUXVlcnkgPSBmb3JtYXQocXVlcnksIEtFWVNQQUNFLCBjcmVhdGVUYWJsZU5hbWUoKSwgdHlwZSwgbWFzayk7CisgICAgICAgIGlmIChzaG91bGRTdWNjZWVkKQorICAgICAgICAgICAgY3JlYXRlVGFibGUoZm9ybWF0dGVkUXVlcnkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gZXhlY3V0ZShmb3JtYXR0ZWRRdWVyeSkpLmhhc01lc3NhZ2VDb250YWluaW5nKGVycm9yTWVzc2FnZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZUFsdGVyaW5nRnVuY3Rpb25Pbk1hc2tDb2x1bW4oKQorICAgIHsKKyAgICAgICAgdGVzdE9uQWx0ZXJDb2x1bW4oIkNSRUFURSBUQUJMRSAlcy4lcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkFMVEVSIFRBQkxFICVzLiVzIEFMVEVSIHYgTUFTS0VEIFdJVEggJXMiKTsKKyAgICAgICAgdGVzdE9uQWx0ZXJDb2x1bW4oIkNSRUFURSBUQUJMRSAlcy4lcyAoayAlcyBQUklNQVJZIEtFWSwgdiBpbnQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkFMVEVSIFRBQkxFICVzLiVzIEFMVEVSIGsgTUFTS0VEIFdJVEggJXMiKTsKKyAgICAgICAgdGVzdE9uQWx0ZXJDb2x1bW4oIkNSRUFURSBUQUJMRSAlcy4lcyAoazEgaW50LCBrMiAlcywgUFJJTUFSWSBLRVkoKGsxLCBrMikpKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBTFRFUiBUQUJMRSAlcy4lcyBBTFRFUiBrMiBNQVNLRUQgV0lUSCAlcyIpOworICAgICAgICB0ZXN0T25BbHRlckNvbHVtbigiQ1JFQVRFIFRBQkxFICVzLiVzIChrIGludCwgYyAlcywgUFJJTUFSWSBLRVkoaywgYykpIFdJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAoYyBBU0MpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkFMVEVSIFRBQkxFICVzLiVzIEFMVEVSIGMgTUFTS0VEIFdJVEggJXMiKTsKKyAgICAgICAgdGVzdE9uQWx0ZXJDb2x1bW4oIkNSRUFURSBUQUJMRSAlcy4lcyAoayBpbnQsIGMgJXMsIFBSSU1BUlkgS0VZKGssIGMpKSBXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKGMgREVTQykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgJXMuJXMgQUxURVIgYyBNQVNLRUQgV0lUSCAlcyIpOworICAgICAgICB0ZXN0T25BbHRlckNvbHVtbigiQ1JFQVRFIFRBQkxFICVzLiVzIChrIGludCwgYyBpbnQsIHMgJXMgU1RBVElDLCBQUklNQVJZIEtFWShrLCBjKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQUxURVIgVEFCTEUgJXMuJXMgQUxURVIgcyBNQVNLRUQgV0lUSCAlcyIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0T25BbHRlckNvbHVtbihTdHJpbmcgY3JlYXRlUXVlcnksIFN0cmluZyBhbHRlclF1ZXJ5KQorICAgIHsKKyAgICAgICAgU3RyaW5nIHRhYmxlID0gY3JlYXRlVGFibGVOYW1lKCk7CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdChjcmVhdGVRdWVyeSwgS0VZU1BBQ0UsIHRhYmxlLCB0eXBlKSk7CisKKyAgICAgICAgU3RyaW5nIGZvcm1hdHRlZFF1ZXJ5ID0gZm9ybWF0KGFsdGVyUXVlcnksIEtFWVNQQUNFLCB0YWJsZSwgbWFzayk7CisgICAgICAgIGlmIChzaG91bGRTdWNjZWVkKQorICAgICAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXR0ZWRRdWVyeSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBleGVjdXRlKGZvcm1hdHRlZFF1ZXJ5KSkuaGFzTWVzc2FnZUNvbnRhaW5pbmcoZXJyb3JNZXNzYWdlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUeXBlQWx0ZXJpbmdGdW5jdGlvbk9uQWRkQ29sdW1uKCkKKyAgICB7CisgICAgICAgIFN0cmluZyB0YWJsZSA9IGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgJXMpIiwgdHlwZSkpOworICAgICAgICBTdHJpbmcgcXVlcnkgPSBmb3JtYXQoIkFMVEVSIFRBQkxFICVzLiVzIEFERCBuICVzIE1BU0tFRCBXSVRIICVzIiwgS0VZU1BBQ0UsIHRhYmxlLCB0eXBlLCBtYXNrKTsKKyAgICAgICAgaWYgKHNob3VsZFN1Y2NlZWQpCisgICAgICAgICAgICBhbHRlclRhYmxlKHF1ZXJ5KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGV4ZWN1dGUocXVlcnkpKS5oYXNNZXNzYWdlQ29udGFpbmluZyhlcnJvck1lc3NhZ2UpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1dpdGhVREZUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9Db2x1bW5NYXNrV2l0aFVERlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjI2YTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvQ29sdW1uTWFza1dpdGhVREZUZXN0LmphdmEKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkJvdW5kU3RhdGVtZW50OworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCisvKioKKyAqIHtAbGluayBDb2x1bW5NYXNrVGVzdGVyfSBmb3IgY29sdW1uIG1hc2tzIHVzaW5nIGEgVURGLgorICovCitwdWJsaWMgY2xhc3MgQ29sdW1uTWFza1dpdGhVREZUZXN0IGV4dGVuZHMgQ29sdW1uTWFza1Rlc3RlcgoreworICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VURGKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gY3JlYXRlIGEgdGFibGUgbWFza2VkIHdpdGggYSBVREYgYW5kIHdpdGggYSBtYXRlcmlhbGl6ZWQgdmlldworICAgICAgICBTdHJpbmcgZnVuY3Rpb24gPSBjcmVhdGVBZGRGdW5jdGlvbigpOworICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50LCBjIGludCwgdiBpbnQgTUFTS0VEIFdJVEggJXMoNyksIFBSSU1BUlkgS0VZIChrLCBjKSkiLCBmdW5jdGlvbikpOworICAgICAgICBTdHJpbmcgdmlldyA9IGNyZWF0ZVZpZXcoIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldIRVJFIGsgSVMgTk9UIE5VTEwgQU5EIGMgSVMgTk9UIE5VTEwgQU5EIHYgSVMgTk9UIE5VTEwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFJJTUFSWSBLRVkgKHYsIGssIGMpIik7CisKKyAgICAgICAgLy8gYWRkIHNvbWUgZGF0YQorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgwLCAwLCAxMCkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoMCwgMSwgMjApIik7CisgICAgICAgIE9iamVjdFtdW10gY2xlYXJSb3dzID0gcm93cyhyb3coMCwgMCwgMTApLCByb3coMCwgMSwgMjApKTsKKyAgICAgICAgT2JqZWN0W11bXSBtYXNrZWRSb3dzID0gcm93cyhyb3coMCwgMCwgMTcpLCByb3coMCwgMSwgMjcpKTsKKyAgICAgICAgd2FpdEZvclZpZXdNdXRhdGlvbnMoKTsKKworICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBzZXNzaW9uTmV0KCk7CisKKyAgICAgICAgLy8gcXVlcnkgdGhlIHRhYmxlIGFuZCB2ZXJpZnkgdGhhdCB0aGUgY29sdW1uIG1hc2sgaXMgYXBwbGllZAorICAgICAgICBTdHJpbmcgdGFibGVRdWVyeSA9ICJTRUxFQ1QgaywgYywgdiBGUk9NICVzIjsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KHRhYmxlUXVlcnkpLCBtYXNrZWRSb3dzKTsKKyAgICAgICAgQm91bmRTdGF0ZW1lbnQgdGFibGVQcmVwYXJlZCA9IHNlc3Npb24ucHJlcGFyZShmb3JtYXRRdWVyeSh0YWJsZVF1ZXJ5KSkuYmluZCgpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHNlc3Npb24uZXhlY3V0ZSh0YWJsZVByZXBhcmVkKSwgbWFza2VkUm93cyk7CisKKyAgICAgICAgLy8gcXVlcnkgdGhlIHZpZXcgYW5kIHZlcmlmeSB0aGF0IHRoZSBjb2x1bW4gbWFzayBpcyBhcHBsaWVkCisgICAgICAgIFN0cmluZyB2aWV3UXVlcnkgPSBmb3JtYXQoIlNFTEVDVCBrLCBjLCB2IEZST00gJXMuJXMiLCBLRVlTUEFDRSwgdmlldyk7CisgICAgICAgIEJvdW5kU3RhdGVtZW50IHZpZXdQcmVwYXJlZCA9IHNlc3Npb24ucHJlcGFyZShmb3JtYXRRdWVyeSh0YWJsZVF1ZXJ5KSkuYmluZCgpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQodmlld1F1ZXJ5KSwgbWFza2VkUm93cyk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoc2Vzc2lvbi5leGVjdXRlKHZpZXdQcmVwYXJlZCksIG1hc2tlZFJvd3MpOworCisgICAgICAgIC8vIGRyb3AgdGhlIGNvbHVtbiBtYXNrIGFuZCB2ZXJpZnkgdGhhdCB0aGUgY29sdW1uIGlzIG5vdCBtYXNrZWQgYW55bW9yZQorICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiB2IERST1AgTUFTS0VEIik7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldCh0YWJsZVF1ZXJ5KSwgY2xlYXJSb3dzKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KHZpZXdRdWVyeSksIGNsZWFyUm93cyk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoc2Vzc2lvbi5leGVjdXRlKHRhYmxlUHJlcGFyZWQpLCBjbGVhclJvd3MpOworICAgICAgICBhc3NlcnRSb3dzTmV0KHNlc3Npb24uZXhlY3V0ZSh2aWV3UHJlcGFyZWQpLCBjbGVhclJvd3MpOworCisgICAgICAgIC8vIG1hc2sgdGhlIGNvbHVtbiBhZ2FpbiwgYnV0IHRoaXMgdGltZSB3aXRoIGEgZGlmZmVyZW50IGFyZ3VtZW50CisgICAgICAgIGFsdGVyVGFibGUoZm9ybWF0KCJBTFRFUiBUQUJMRSAlJXMgQUxURVIgdiBNQVNLRUQgV0lUSCAlcyg4KSIsIGZ1bmN0aW9uKSk7CisgICAgICAgIG1hc2tlZFJvd3MgPSByb3dzKHJvdygwLCAwLCAxOCksIHJvdygwLCAxLCAyOCkpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQodGFibGVRdWVyeSksIG1hc2tlZFJvd3MpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQodmlld1F1ZXJ5KSwgbWFza2VkUm93cyk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoc2Vzc2lvbi5leGVjdXRlKHRhYmxlUHJlcGFyZWQpLCBtYXNrZWRSb3dzKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChzZXNzaW9uLmV4ZWN1dGUodmlld1ByZXBhcmVkKSwgbWFza2VkUm93cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VURGV2l0aFJldmVyc2VkKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gY3JlYXRlIGEgdGFibGUgbWFza2VkIHdpdGggYSBVREYgYW5kIHdpdGggYSBtYXRlcmlhbGl6ZWQgdmlldworICAgICAgICBTdHJpbmcgZnVuY3Rpb24gPSBjcmVhdGVBZGRGdW5jdGlvbigpOworICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50LCBjIGludCBNQVNLRUQgV0lUSCAlcygxMDApLCB2IGludCwgUFJJTUFSWSBLRVkgKGssIGMpKSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKGMgREVTQykiLCBmdW5jdGlvbikpOworICAgICAgICBTdHJpbmcgdmlldyA9IGNyZWF0ZVZpZXcoIkNSRUFURSBNQVRFUklBTElaRUQgVklFVyAlcyBBUyBTRUxFQ1QgKiBGUk9NICVzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldIRVJFIGsgSVMgTk9UIE5VTEwgQU5EIGMgSVMgTk9UIE5VTEwgQU5EIHYgSVMgTk9UIE5VTEwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFJJTUFSWSBLRVkgKHYsIGMsIEspICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAoYyBERVNDLCBrIEFTQykiKTsKKworICAgICAgICAvLyBhZGQgc29tZSBkYXRhCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDAsIDEsIDApIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDAsIDIsIDApIik7CisgICAgICAgIE9iamVjdFtdW10gY2xlYXJSb3dzID0gcm93cyhyb3coMCwgMiwgMCksIHJvdygwLCAxLCAwKSk7CisgICAgICAgIE9iamVjdFtdW10gbWFza2VkUm93cyA9IHJvd3Mocm93KDAsIDEwMiwgMCksIHJvdygwLCAxMDEsIDApKTsKKyAgICAgICAgd2FpdEZvclZpZXdNdXRhdGlvbnMoKTsKKworICAgICAgICAvLyBxdWVyeSB0aGUgdGFibGUgYW5kIHZlcmlmeSB0aGF0IHRoZSBjb2x1bW4gbWFzayBpcyBhcHBsaWVkCisgICAgICAgIFN0cmluZyB0YWJsZVF1ZXJ5ID0gIlNFTEVDVCBrLCBjLCB2IEZST00gJXMiOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQodGFibGVRdWVyeSksIG1hc2tlZFJvd3MpOworCisgICAgICAgIC8vIHF1ZXJ5IHRoZSB2aWV3IGFuZCB2ZXJpZnkgdGhhdCB0aGUgY29sdW1uIG1hc2sgaXMgYXBwbGllZAorICAgICAgICBTdHJpbmcgdmlld1F1ZXJ5ID0gZm9ybWF0KCJTRUxFQ1QgaywgYywgdiBGUk9NICVzLiVzIiwgS0VZU1BBQ0UsIHZpZXcpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQodmlld1F1ZXJ5KSwgbWFza2VkUm93cyk7CisKKyAgICAgICAgLy8gZHJvcCB0aGUgY29sdW1uIG1hc2sgYW5kIHZlcmlmeSB0aGF0IHRoZSBjb2x1bW4gaXMgbm90IG1hc2tlZCBhbnltb3JlCisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGMgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KHRhYmxlUXVlcnkpLCBjbGVhclJvd3MpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXQodmlld1F1ZXJ5KSwgY2xlYXJSb3dzKTsKKworICAgICAgICAvLyBtYXNrIHRoZSBjb2x1bW4gYWdhaW4sIGJ1dCB0aGlzIHRpbWUgd2l0aCBhIGRpZmZlcmVudCBhcmd1bWVudAorICAgICAgICBhbHRlclRhYmxlKGZvcm1hdCgiQUxURVIgVEFCTEUgJSVzIEFMVEVSIGMgTUFTS0VEIFdJVEggJXMoMTAwMCkiLCBmdW5jdGlvbikpOworICAgICAgICBtYXNrZWRSb3dzID0gcm93cyhyb3coMCwgMTAwMiwgMCksIHJvdygwLCAxMDAxLCAwKSk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldCh0YWJsZVF1ZXJ5KSwgbWFza2VkUm93cyk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldCh2aWV3UXVlcnkpLCBtYXNrZWRSb3dzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZmllcyB0aGF0IHF1ZXJpZXMgZHJvcHBpbmcgYSBVREYgdGhhdCBpcyB1c2VkIGZvciBtYXNraW5nIGNvbHVtbnMgYXJlIHJlamVjdGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERyb3BVREZXaXRoRGVwZW5kZW50TWFza3MoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgZnVuY3Rpb24gPSBjcmVhdGVBZGRGdW5jdGlvbigpOworICAgICAgICBTdHJpbmcgbWFzayA9IGZvcm1hdCgiTUFTS0VEIFdJVEggJXMoNykiLCBmdW5jdGlvbik7CisgICAgICAgIFN0cmluZyB0YWJsZTEgPSBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50ICVzIFBSSU1BUlkgS0VZLCB2IGludCAlPHMpIiwgbWFzaykpOworICAgICAgICBTdHJpbmcgdGFibGUyID0gY3JlYXRlVGFibGUoZm9ybWF0KCJDUkVBVEUgVEFCTEUgJSVzIChrIGludCAlcywgYyBpbnQgJTxzLCB2IGludCAlPHMsIHMgaW50IHN0YXRpYyAlPHMsIFBSSU1BUlkgS0VZIChrLCBjKSkiLCBtYXNrKSk7CisKKyAgICAgICAgU3RyaW5nIGRyb3BGdW5jdGlvblF1ZXJ5ID0gZm9ybWF0KCJEUk9QIEZVTkNUSU9OICVzIiwgZnVuY3Rpb24pOworCisgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZm9ybWF0KCJGdW5jdGlvbiAnJXMnIGlzIHN0aWxsIHJlZmVyZW5jZWQgYnkgY29sdW1uIG1hc2tzIGluIHRhYmxlcyAlcywgJXMiLCBmdW5jdGlvbiwgdGFibGUxLCB0YWJsZTIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKG1lc3NhZ2UsIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLCBkcm9wRnVuY3Rpb25RdWVyeSk7CisKKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICVzLiVzIEFMVEVSIGsgRFJPUCBNQVNLRUQiLCBLRVlTUEFDRSwgdGFibGUxKSk7CisgICAgICAgIGFsdGVyVGFibGUoZm9ybWF0KCJBTFRFUiBUQUJMRSAlcy4lcyBBTFRFUiBrIERST1AgTUFTS0VEIiwgS0VZU1BBQ0UsIHRhYmxlMikpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKG1lc3NhZ2UsIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLCBkcm9wRnVuY3Rpb25RdWVyeSk7CisKKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICVzLiVzIEFMVEVSIHYgRFJPUCBNQVNLRUQiLCBLRVlTUEFDRSwgdGFibGUxKSk7CisgICAgICAgIGFsdGVyVGFibGUoZm9ybWF0KCJBTFRFUiBUQUJMRSAlcy4lcyBBTFRFUiB2IERST1AgTUFTS0VEIiwgS0VZU1BBQ0UsIHRhYmxlMikpOworICAgICAgICBtZXNzYWdlID0gZm9ybWF0KCJGdW5jdGlvbiAnJXMnIGlzIHN0aWxsIHJlZmVyZW5jZWQgYnkgY29sdW1uIG1hc2tzIGluIHRhYmxlcyAlcyIsIGZ1bmN0aW9uLCB0YWJsZTIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKG1lc3NhZ2UsIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLCBkcm9wRnVuY3Rpb25RdWVyeSk7CisKKyAgICAgICAgYWx0ZXJUYWJsZShmb3JtYXQoIkFMVEVSIFRBQkxFICVzLiVzIEFMVEVSIGMgRFJPUCBNQVNLRUQiLCBLRVlTUEFDRSwgdGFibGUyKSk7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UobWVzc2FnZSwgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsIGRyb3BGdW5jdGlvblF1ZXJ5KTsKKworICAgICAgICBhbHRlclRhYmxlKGZvcm1hdCgiQUxURVIgVEFCTEUgJXMuJXMgQUxURVIgcyBEUk9QIE1BU0tFRCIsIEtFWVNQQUNFLCB0YWJsZTIpKTsKKyAgICAgICAgc2NoZW1hQ2hhbmdlKGRyb3BGdW5jdGlvblF1ZXJ5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nVURGKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0TWFza2luZ0ZhaWxzKCJVbmFibGUgdG8gZmluZCBtYXNraW5nIGZ1bmN0aW9uIGZvciB2LCBubyBkZWNsYXJlZCBmdW5jdGlvbiBtYXRjaGVzIHRoZSBzaWduYXR1cmUgJXMoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWlzc2luZ191ZGYiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVREZXaXRoTm9Bcmd1bWVudHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRNYXNraW5nRmFpbHMoIkludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBjYWxsIHRvIGZ1bmN0aW9uICVzOiAwIHJlcXVpcmVkIGJ1dCAxIHByb3ZpZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzICgpICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNBTExFRCBPTiBOVUxMIElOUFVUICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgaW50ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiA0MjsnIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVERldpdGhXcm9uZ0FyZ3VtZW50Q291bnQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRNYXNraW5nRmFpbHMoIkludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiBjYWxsIHRvIGZ1bmN0aW9uICVzOiAyIHJlcXVpcmVkIGJ1dCAzIHByb3ZpZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFkZEZ1bmN0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDEsIDMpIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VURGV2l0aFdyb25nQXJndW1lbnRUeXBlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0TWFza2luZ0ZhaWxzKCJUeXBlIGVycm9yOiBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgYmUgcGFzc2VkIGFzIGFyZ3VtZW50IDAgb2YgZnVuY3Rpb24gJXMgb2YgdHlwZSB0ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiAlcyAoYSB0ZXh0KSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIHRleHQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIFwicmVkYWN0ZWRcIjsnIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVERldpdGhXcm9uZ1JldHVyblR5cGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRNYXNraW5nRmFpbHMoIk1hc2tpbmcgZnVuY3Rpb24gJXMoKSByZXR1cm4gdHlwZSBpcyB0ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzIChhIGludCkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0FMTEVEIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyB0ZXh0ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiBcInJlZGFjdGVkXCI7JyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVREZJbk90aGVyS2V5c3BhY2UoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRNYXNraW5nRmFpbHMoIk1hc2tpbmcgZnVuY3Rpb24gJXMoKSBkb2Vzbid0IGJlbG9uZyB0byB0aGUgc2FtZSBrZXlzcGFjZSBhcyB0aGUgdGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0VfUEVSX1RFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMgKGlucHV0IGludCkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0FMTEVEIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIEludGVnZXIudmFsdWVPZihpbnB1dCk7JyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVREEoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgZlN0YXRlID0gY3JlYXRlQWRkRnVuY3Rpb24oKTsKKyAgICAgICAgU3RyaW5nIGZGaW5hbCA9IGNyZWF0ZUlkZW50aXR5RnVuY3Rpb24oKTsKKyAgICAgICAgYXNzZXJ0TWFza2luZ0ZhaWxzKCJBZ2dyZWdhdGUgZnVuY3Rpb24gJXMoKSBjYW5ub3QgYmUgdXNlZCBmb3IgbWFza2luZyB0YWJsZSBjb2x1bW5zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUFnZ3JlZ2F0ZShLRVlTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEFHR1JFR0FURSAlcyhpbnQpICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRlVOQyAiICsgc2hvcnRGdW5jdGlvbk5hbWUoZlN0YXRlKSArICIgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNUWVBFIGludCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRklOQUxGVU5DICIgKyBzaG9ydEZ1bmN0aW9uTmFtZShmRmluYWwpICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5JVENPTkQgNDIiKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE1hc2tpbmdGYWlscyhTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGZ1bmN0aW9uKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRNYXNraW5nRmFpbHMobWVzc2FnZSwgZnVuY3Rpb24sICIoKSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNYXNraW5nRmFpbHMoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBmdW5jdGlvbiwgU3RyaW5nIGFyZ3VtZW50cykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgbWVzc2FnZSA9IGZvcm1hdChtZXNzYWdlLCBmdW5jdGlvbik7CisKKyAgICAgICAgLy8gY3JlYXRlIHRhYmxlIHNob3VsZCBmYWlsCisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGV4ZWN1dGUoZm9ybWF0KCJDUkVBVEUgVEFCTEUgJXMuJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGludCBNQVNLRUQgV0lUSCAlcyVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWVNQQUNFLCBjcmVhdGVUYWJsZU5hbWUoKSwgZnVuY3Rpb24sIGFyZ3VtZW50cykpKQorICAgICAgICAgICAgICAgICAgLmlzSW5zdGFuY2VPZihJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgIC5oYXNNZXNzYWdlQ29udGFpbmluZyhtZXNzYWdlKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjdXJyZW50VGFibGVNZXRhZGF0YSgpKTsKKworICAgICAgICAvLyBhbHRlciB0YWJsZSBzaG91bGQgZmFpbAorICAgICAgICBTdHJpbmcgdGFibGUgPSBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiBpbnQpIik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGV4ZWN1dGUoZm9ybWF0KCJBTFRFUiBUQUJMRSAlcy4lcyBBTFRFUiB2IE1BU0tFRCBXSVRIICVzJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTUEFDRSwgdGFibGUsIGZ1bmN0aW9uLCBhcmd1bWVudHMpKSkKKyAgICAgICAgICAgICAgICAgIC5pc0luc3RhbmNlT2YoSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcobWVzc2FnZSk7CisgICAgICAgIGFzc2VydENvbHVtbklzTm90TWFza2VkKHRhYmxlLCAidiIpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZUFkZEZ1bmN0aW9uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCwgaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMgKGEgaW50LCBiIGludCkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0FMTEVEIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIEludGVnZXIudmFsdWVPZihhKSArIEludGVnZXIudmFsdWVPZihiKTsnIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlSWRlbnRpdHlGdW5jdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHJldHVybiBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQsIGludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzIChhIGludCkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0FMTEVEIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIGE7JyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0RlZmF1bHRNYXNraW5nRnVuY3Rpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9EZWZhdWx0TWFza2luZ0Z1bmN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTRhYjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9EZWZhdWx0TWFza2luZ0Z1bmN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CisKKy8qKgorICogVGVzdHMgZm9yIHtAbGluayBEZWZhdWx0TWFza2luZ0Z1bmN0aW9ufS4KKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRNYXNraW5nRnVuY3Rpb25UZXN0IGV4dGVuZHMgTWFza2luZ0Z1bmN0aW9uVGVzdGVyCit7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVzdE1hc2tpbmdPbkNvbHVtbihTdHJpbmcgbmFtZSwgQ1FMM1R5cGUgdHlwZSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoZm9ybWF0KCJTRUxFQ1QgbWFza19kZWZhdWx0KCVzKSBGUk9NICUlcyIsIG5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICByb3codHlwZS5nZXRUeXBlKCkuZ2V0TWFza2VkVmFsdWUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL0hhc2hNYXNraW5nRnVuY3Rpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9IYXNoTWFza2luZ0Z1bmN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZmU3NTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9IYXNoTWFza2luZ0Z1bmN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Db2x1bW5EZWZpbml0aW9uczsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuRGF0YVR5cGU7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJlc3VsdFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKKworLyoqCisgKiBUZXN0cyBmb3Ige0BsaW5rIEhhc2hNYXNraW5nRnVuY3Rpb259LgorICovCitwdWJsaWMgY2xhc3MgSGFzaE1hc2tpbmdGdW5jdGlvblRlc3QgZXh0ZW5kcyBNYXNraW5nRnVuY3Rpb25UZXN0ZXIKK3sKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKQorICAgIHsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0TWFza2luZ09uQ29sdW1uKFN0cmluZyBuYW1lLCBDUUwzVHlwZSB0eXBlLCBPYmplY3QgdmFsdWUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgc2VyaWFsaXplZFZhbHVlID0gc2VyaWFsaXplZFZhbHVlKHR5cGUsIHZhbHVlKTsKKworICAgICAgICAvLyB3aXRoIGRlZmF1bHQgYWxnb3JpdGhtCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShmb3JtYXQoIlNFTEVDVCBtYXNrX2hhc2goJXMpIEZST00gJSVzIiwgbmFtZSkpLAorICAgICAgICAgICAgICAgICAgIHJvdyhIYXNoTWFza2luZ0Z1bmN0aW9uLmhhc2goSGFzaE1hc2tpbmdGdW5jdGlvbi5tZXNzYWdlRGlnZXN0KEhhc2hNYXNraW5nRnVuY3Rpb24uREVGQVVMVF9BTEdPUklUSE0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZFZhbHVlKSkpOworCisgICAgICAgIC8vIHdpdGggbnVsbCBhbGdvcml0aG0KKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKGZvcm1hdCgiU0VMRUNUIG1hc2tfaGFzaCglcywgbnVsbCkgRlJPTSAlJXMiLCBuYW1lKSksCisgICAgICAgICAgICAgICAgICAgcm93KEhhc2hNYXNraW5nRnVuY3Rpb24uaGFzaChIYXNoTWFza2luZ0Z1bmN0aW9uLm1lc3NhZ2VEaWdlc3QoSGFzaE1hc2tpbmdGdW5jdGlvbi5ERUZBVUxUX0FMR09SSVRITSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkVmFsdWUpKSk7CisKKyAgICAgICAgLy8gd2l0aCBtYW51YWxseSBzcGVjaWZpZWQgYWxnb3JpdGhtCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShmb3JtYXQoIlNFTEVDVCBtYXNrX2hhc2goJXMsICdTSEEtNTEyJykgRlJPTSAlJXMiLCBuYW1lKSksCisgICAgICAgICAgICAgICAgICAgcm93KEhhc2hNYXNraW5nRnVuY3Rpb24uaGFzaChIYXNoTWFza2luZ0Z1bmN0aW9uLm1lc3NhZ2VEaWdlc3QoIlNIQS01MTIiKSwgc2VyaWFsaXplZFZhbHVlKSkpOworCisgICAgICAgIC8vIHdpdGggbm90IGZvdW5kIEFTQ0lJIGFsZ29yaXRobQorICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKCJIYXNoIGFsZ29yaXRobSBub3QgZm91bmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiU0VMRUNUIG1hc2tfaGFzaCglcywgJ3Vua25vd24tYWxnb3JpdGhtJykgRlJPTSAlJXMiLCBuYW1lKSk7CisKKyAgICAgICAgLy8gd2l0aCBub3QgZm91bmQgVVRGLTggYWxnb3JpdGhtCisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoIkhhc2ggYWxnb3JpdGhtIG5vdCBmb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJTRUxFQ1QgbWFza19oYXNoKCVzLCAnw6HDqcOtw7PDuicpIEZST00gJSVzIiwgbmFtZSkpOworCisgICAgICAgIC8vIHRlc3QgcmVzdWx0IHNldCBtZXRhZGF0YSwgaXQgc2hvdWxkIGFsd2F5cyBiZSBvZiB0eXBlIGJsb2IKKyAgICAgICAgUmVzdWx0U2V0IHJzID0gZXhlY3V0ZU5ldChmb3JtYXQoIlNFTEVDVCBtYXNrX2hhc2goJXMpIEZST00gJSVzIiwgbmFtZSkpOworICAgICAgICBDb2x1bW5EZWZpbml0aW9ucyBkZWZpbml0aW9ucyA9IHJzLmdldENvbHVtbkRlZmluaXRpb25zKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgZGVmaW5pdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhEYXRhVHlwZS5ibG9iKCksIGRlZmluaXRpb25zLmdldFR5cGUoMCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcm1hdCgiJXMubWFza19oYXNoKCVzKSIsIFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSwgbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMuZ2V0TmFtZSgwKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIHNlcmlhbGl6ZWRWYWx1ZShDUUwzVHlwZSB0eXBlLCBPYmplY3QgdmFsdWUpCisgICAgeworICAgICAgICBpZiAoaXNOdWxsT3JFbXB0eU11bHRpQ2VsbCh0eXBlLCB2YWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKworICAgICAgICByZXR1cm4gbWFrZUJ5dGVCdWZmZXIodmFsdWUsIHR5cGUuZ2V0VHlwZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9NYXNraW5nRnVuY3Rpb25UZXN0ZXIuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL01hc2tpbmdGdW5jdGlvblRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NWYyYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9NYXNraW5nRnVuY3Rpb25UZXN0ZXIuamF2YQpAQCAtMCwwICsxLDI4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUwzVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkR1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQ29sbGVjdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5MaXN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLk1hcFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5TZXRUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVHVwbGVUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Vc2VyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlNpbXBsZURhdGVTZXJpYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworCisvKioKKyAqIEFic3RyYWN0IGNsYXNzIGZvciB0ZXN0aW5nIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE1hc2tpbmdGdW5jdGlvbn0uCisgKiA8cD4KKyAqIEl0IHRlc3RzIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgZnVuY3Rpb24gYXMgZGVmaW5lZCBieSB7QGxpbmsgI3Rlc3RNYXNraW5nT25Db2x1bW4oU3RyaW5nLCBDUUwzVHlwZSwgT2JqZWN0KX0KKyAqIG9uIGFsbCBDUUwgZGF0YSB0eXBlcyBvbiBhbGwgdGhlIHBvc3NpYmxlIHBvc2l0aW9ucyBhbGxvd2VkIGZvciB0aGF0IHR5cGUgKHByaW1hcnkga2V5LCByZWd1bGFyIGFuZCBzdGF0aWMgY29sdW1ucykuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNYXNraW5nRnVuY3Rpb25UZXN0ZXIgZXh0ZW5kcyBDUUxUZXN0ZXIKK3sKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgbmF0aXZlIG1hc2tpbmcgZnVuY3Rpb24gZm9yIGFsbCBDUUwgbmF0aXZlIGRhdGEgdHlwZXMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFza2luZ09uTmF0aXZlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZm9yIChDUUwzVHlwZS5OYXRpdmUgdHlwZSA6IENRTDNUeXBlLk5hdGl2ZS52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgRU1QVFk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09VTlRFUjoKKyAgICAgICAgICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkNvdW50ZXJDb2x1bW4oMEwsIC0xTCwgMUwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRFWFQ6CisgICAgICAgICAgICAgICAgY2FzZSBBU0NJSToKKyAgICAgICAgICAgICAgICBjYXNlIFZBUkNIQVI6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKHR5cGUsICJjb25maWRlbnRpYWwiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCT09MRUFOOgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyh0eXBlLCB0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVElOWUlOVDoKKyAgICAgICAgICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkFsbENvbHVtbnModHlwZSwgKGJ5dGUpIDAsIChieXRlKSAyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTTUFMTElOVDoKKyAgICAgICAgICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkFsbENvbHVtbnModHlwZSwgKHNob3J0KSAwLCAoc2hvcnQpIDIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIElOVDoKKyAgICAgICAgICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkFsbENvbHVtbnModHlwZSwgMiwgSW50ZWdlci5NSU5fVkFMVUUsIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCSUdJTlQ6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKHR5cGUsIDJMLCBMb25nLk1JTl9WQUxVRSwgTG9uZy5NQVhfVkFMVUUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEZMT0FUOgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyh0eXBlLCAyLjNmLCBGbG9hdC5NSU5fVkFMVUUsIEZsb2F0Lk1BWF9WQUxVRSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyh0eXBlLCAyLjNkLCBEb3VibGUuTUlOX1ZBTFVFLCBEb3VibGUuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBWQVJJTlQ6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKHR5cGUsIEJpZ0ludGVnZXIudmFsdWVPZigtMSksIEJpZ0ludGVnZXIudmFsdWVPZigwKSwgQmlnSW50ZWdlci52YWx1ZU9mKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBERUNJTUFMOgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyh0eXBlLCBCaWdEZWNpbWFsLnZhbHVlT2YoMi4zKSwgQmlnRGVjaW1hbC52YWx1ZU9mKDApLCBCaWdEZWNpbWFsLnZhbHVlT2YoLTIuMykpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERBVEU6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZURhdGVTZXJpYWxpemVyLnRpbWVJbk1pbGxpc1RvRGF5KDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVEYXRlU2VyaWFsaXplci50aW1lSW5NaWxsaXNUb0RheShMb25nLk1BWF9WQUxVRSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERVUkFUSU9OOgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWFza2luZ09uTm90S2V5Q29sdW1ucyh0eXBlLCBEdXJhdGlvbi5uZXdJbnN0YW5jZSgxLCAyLCAzKSwgRHVyYXRpb24ubmV3SW5zdGFuY2UoMywgMiwgMSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRJTUU6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKENRTDNUeXBlLk5hdGl2ZS5USU1FLCAyTCwgKGxvbmcpIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUSU1FU1RBTVA6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKENRTDNUeXBlLk5hdGl2ZS5USU1FU1RBTVAsIG5ldyBEYXRlKDIpLCBuZXcgRGF0ZShJbnRlZ2VyLk1BWF9WQUxVRSkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFVVSUQ6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKHR5cGUsIFVVSUQucmFuZG9tVVVJRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBUSU1FVVVJRDoKKyAgICAgICAgICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkFsbENvbHVtbnModHlwZSwgVGltZVVVSUQubWluQXRVbml4TWlsbGlzKDIpLCBUaW1lVVVJRC5taW5BdFVuaXhNaWxsaXMoTG9uZy5NQVhfVkFMVUUpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBJTkVUOgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyh0eXBlLCBuZXcgSW5ldFNvY2tldEFkZHJlc3MoMCkuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBCTE9COgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyh0eXBlLCBVVEY4VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoImNvbmZpZGVudGlhbCIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJUeXBlICIgKyB0eXBlICsgIiBzaG91bGQgYmUgdGVzdGVkIGZvciBtYXNraW5nIGZ1bmN0aW9ucyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIG5hdGl2ZSBtYXNraW5nIGZ1bmN0aW9uIGZvciBjb2xsZWN0aW9ucy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXNraW5nT25Db2xsZWN0aW9uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gc2V0CisgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbXXsgc2V0KCksIHNldCgxLCAyLCAzKSB9OworICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyhTZXRUeXBlLmdldEluc3RhbmNlKEludDMyVHlwZS5pbnN0YW5jZSwgZmFsc2UpLmFzQ1FMM1R5cGUoKSwgdmFsdWVzKTsKKyAgICAgICAgdGVzdE1hc2tpbmdPbk5vdEtleUNvbHVtbnMoU2V0VHlwZS5nZXRJbnN0YW5jZShJbnQzMlR5cGUuaW5zdGFuY2UsIHRydWUpLmFzQ1FMM1R5cGUoKSwgdmFsdWVzKTsKKworICAgICAgICAvLyBsaXN0CisgICAgICAgIHZhbHVlcyA9IG5ldyBPYmplY3RbXXsgbGlzdCgpLCBsaXN0KDEsIDIsIDMpIH07CisgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKExpc3RUeXBlLmdldEluc3RhbmNlKEludDMyVHlwZS5pbnN0YW5jZSwgZmFsc2UpLmFzQ1FMM1R5cGUoKSwgdmFsdWVzKTsKKyAgICAgICAgdGVzdE1hc2tpbmdPbk5vdEtleUNvbHVtbnMoTGlzdFR5cGUuZ2V0SW5zdGFuY2UoSW50MzJUeXBlLmluc3RhbmNlLCB0cnVlKS5hc0NRTDNUeXBlKCksIHZhbHVlcyk7CisKKyAgICAgICAgLy8gbWFwCisgICAgICAgIHZhbHVlcyA9IG5ldyBPYmplY3RbXXsgbWFwKCksIG1hcCgxLCAxMCwgMiwgMjAsIDMsIDMwKSB9OworICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyhNYXBUeXBlLmdldEluc3RhbmNlKEludDMyVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlLCBmYWxzZSkuYXNDUUwzVHlwZSgpLCB2YWx1ZXMpOworICAgICAgICB0ZXN0TWFza2luZ09uTm90S2V5Q29sdW1ucyhNYXBUeXBlLmdldEluc3RhbmNlKEludDMyVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlLCB0cnVlKS5hc0NRTDNUeXBlKCksIHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIG5hdGl2ZSBtYXNraW5nIGZ1bmN0aW9uIGZvciB0dXBsZXMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFza2luZ09uVHVwbGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICB0ZXN0TWFza2luZ09uQWxsQ29sdW1ucyhuZXcgVHVwbGVUeXBlKEltbXV0YWJsZUxpc3Qub2YoSW50MzJUeXBlLmluc3RhbmNlLCBJbnQzMlR5cGUuaW5zdGFuY2UpKS5hc0NRTDNUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlKDEsIDEwKSwgdHVwbGUoMiwgMjApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgbmF0aXZlIG1hc2tpbmcgZnVuY3Rpb24gZm9yIFVEVHMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFza2luZ09uVURUKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBjcmVhdGVUeXBlKCJDUkVBVEUgVFlQRSAlcyAoYSBpbnQsIGIgdGV4dCkiKTsKKworICAgICAgICBLZXlzcGFjZU1ldGFkYXRhIGtzID0gU2NoZW1hLmluc3RhbmNlLmdldEtleXNwYWNlTWV0YWRhdGEoa2V5c3BhY2UoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGtzKTsKKworICAgICAgICBVc2VyVHlwZSB1ZHQgPSBrcy50eXBlcy5nZXQoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMobmFtZSkpLm9yRWxzZVRocm93KEFzc2VydGlvbkVycm9yOjpuZXcpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCh1ZHQpOworCisgICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbXXsgdXNlclR5cGUoImEiLCAxLCAiYiIsICJBbGljZSIpLCB1c2VyVHlwZSgiYSIsIDIsICJiIiwgIkJvYiIpIH07CisgICAgICAgIHRlc3RNYXNraW5nT25Ob3RLZXlDb2x1bW5zKHVkdC5hc0NRTDNUeXBlKCksIHZhbHVlcyk7CisgICAgICAgIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKHVkdC5mcmVlemUoKS5hc0NRTDNUeXBlKCksIHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIG5hdGl2ZSBtYXNraW5nIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0eXBlIGFuZCB2YWx1ZXMgb24gYWxsIHBvc3NpYmxlIHR5cGVzIG9mIGNvbHVtbi4KKyAgICAgKiBUaGF0IGlzLCB3aGVuIHRoZSBjb2x1bW4gaXMgcGFydCBvZiB0aGUgcHJpbWFyeSBrZXksIG9yIGEgcmVndWxhciBjb2x1bW4sIG9yIGEgc3RhdGljIGNvbHVtbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIHRoZSB0ZXN0ZWQgY29sdW1uCisgICAgICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzIG9mIHRoZSB0ZXN0ZWQgY29sdW1uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RNYXNraW5nT25BbGxDb2x1bW5zKENRTDNUeXBlIHR5cGUsIE9iamVjdC4uLiB2YWx1ZXMpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAocGsgJXMsIGNrICU8cywgcyAlPHMgc3RhdGljLCB2ICU8cywgUFJJTUFSWSBLRVkgKHBrLCBjaykpIiwgdHlwZSkpOworCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogdmFsdWVzKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUZXN0IG51bGwgdmFsdWVzCisgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyhwaywgY2spIFZBTFVFUyAoPywgPykiLCB2YWx1ZSwgdmFsdWUpOworICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkNvbHVtbigicyIsIHR5cGUsIG51bGwpOworICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkNvbHVtbigidiIsIHR5cGUsIG51bGwpOworCisgICAgICAgICAgICAvLyBUZXN0IG5vdC1udWxsIHZhbHVlcworICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMocGssIGNrLCBzLCB2KSBWQUxVRVMgKD8sID8sID8sID8pIiwgdmFsdWUsIHZhbHVlLCB2YWx1ZSwgdmFsdWUpOworICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkNvbHVtbigicGsiLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgICAgICB0ZXN0TWFza2luZ09uQ29sdW1uKCJjayIsIHR5cGUsIHZhbHVlKTsKKyAgICAgICAgICAgIHRlc3RNYXNraW5nT25Db2x1bW4oInMiLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgICAgICB0ZXN0TWFza2luZ09uQ29sdW1uKCJ2IiwgdHlwZSwgdmFsdWUpOworCisgICAgICAgICAgICAvLyBDbGVhbnVwCisgICAgICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwaz0/IiwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIG5hdGl2ZSBtYXNraW5nIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0eXBlIGFuZCB2YWx1ZXMgd2hlbiB0aGUgY29sdW1uIGlzbid0IHBhcnQgb2YgdGhlCisgICAgICogcHJpbWFyeSBrZXkuIFRoYXQgaXMsIHdoZW4gdGhlIGNvbHVtbiBpcyBlaXRoZXIgYSByZWd1bGFyIGNvbHVtbiBvciBhIHN0YXRpYyBjb2x1bW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgdGVzdGVkIGNvbHVtbgorICAgICAqIEBwYXJhbSB2YWx1ZXMgdGhlIHZhbHVlcyBvZiB0aGUgdGVzdGVkIGNvbHVtbgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0ZXN0TWFza2luZ09uTm90S2V5Q29sdW1ucyhDUUwzVHlwZSB0eXBlLCBPYmplY3QuLi4gdmFsdWVzKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKHBrIGludCwgY2sgaW50LCBzICVzIHN0YXRpYywgdiAlPHMsIFBSSU1BUlkgS0VZIChwaywgY2spKSIsIHR5cGUpKTsKKworICAgICAgICAvLyBUZXN0IG51bGwgdmFsdWVzCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzKHBrLCBjaykgVkFMVUVTICgwLCAwKSIpOworICAgICAgICB0ZXN0TWFza2luZ09uQ29sdW1uKCJzIiwgdHlwZSwgbnVsbCk7CisgICAgICAgIHRlc3RNYXNraW5nT25Db2x1bW4oInYiLCB0eXBlLCBudWxsKTsKKworICAgICAgICAvLyBUZXN0IG5vdC1udWxsIHZhbHVlcworICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IHZhbHVlcykKKyAgICAgICAgeworICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMocGssIGNrLCBzLCB2KSBWQUxVRVMgKDAsIDAsID8sID8pIiwgdmFsdWUsIHZhbHVlKTsKKyAgICAgICAgICAgIHRlc3RNYXNraW5nT25Db2x1bW4oInMiLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgICAgICB0ZXN0TWFza2luZ09uQ29sdW1uKCJ2IiwgdHlwZSwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIG5hdGl2ZSBtYXNraW5nIGZ1bmN0aW9uIG9uIHRoZSBzcGVjaWZpZWQgY291bnRlciBjb2x1bW4gdmFsdWVzIGluIGFsbCB0aGUgcG9zaXRpb25zIHdoZXJlIGl0IGNhbiBhcHBlYXIuCisgICAgICogVGhhdCBpcywgd2hlbiB0aGUgY291bnRlciBjb2x1bW4gaXMgZWl0aGVyIGEgcmVndWxhciBjb2x1bW4gb3IgYSBzdGF0aWMgY29sdW1uLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlcyB0aGUgdmFsdWVzIG9mIHRoZSB0ZXN0ZWQgY291bnRlciBjb2x1bW4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdGVzdE1hc2tpbmdPbkNvdW50ZXJDb2x1bW4oT2JqZWN0Li4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHMgY291bnRlciBzdGF0aWMsIHYgY291bnRlciwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogdmFsdWVzKQorICAgICAgICB7CisgICAgICAgICAgICBleGVjdXRlKCJVUERBVEUgJXMgU0VUIHYgPSB2ICsgPywgcyA9IHMgKyA/IFdIRVJFIHBrID0gMCBBTkQgY2sgPSAwIiwgdmFsdWUsIHZhbHVlKTsKKyAgICAgICAgICAgIHRlc3RNYXNraW5nT25Db2x1bW4oInMiLCBDUUwzVHlwZS5OYXRpdmUuQ09VTlRFUiwgdmFsdWUpOworICAgICAgICAgICAgdGVzdE1hc2tpbmdPbkNvbHVtbigidiIsIENRTDNUeXBlLk5hdGl2ZS5DT1VOVEVSLCB2YWx1ZSk7CisgICAgICAgICAgICBleGVjdXRlKCJUUlVOQ0FURSAlcyIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhlIG5hdGl2ZSBtYXNraW5nIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbiB0eXBlIGFuZCB2YWx1ZS4KKyAgICAgKiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdGFibGUgaXMgYWxyZWFkeSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHRlc3RlZCBjb2x1bW4KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgdGVzdGVkIGNvbHVtbgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHRlc3RlZCBjb2x1bW4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB0ZXN0TWFza2luZ09uQ29sdW1uKFN0cmluZyBuYW1lLCBDUUwzVHlwZSB0eXBlLCBPYmplY3QgdmFsdWUpIHRocm93cyBUaHJvd2FibGU7CisKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc051bGxPckVtcHR5TXVsdGlDZWxsKENRTDNUeXBlIHR5cGUsIE9iamVjdCB2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgQWJzdHJhY3RUeXBlPD8+IGRhdGFUeXBlID0gdHlwZS5nZXRUeXBlKCk7CisgICAgICAgIGlmIChkYXRhVHlwZS5pc011bHRpQ2VsbCgpICYmIGRhdGFUeXBlLmlzQ29sbGVjdGlvbigpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKCgoQ29sbGVjdGlvblR5cGU8Pz4pIGRhdGFUeXBlKS5raW5kID09IENvbGxlY3Rpb25UeXBlLktpbmQuTUFQKQorICAgICAgICAgICAgICAgICAgID8gKChNYXA8PywgPz4pIHZhbHVlKS5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAgICA6ICgoQ29sbGVjdGlvbjw/PikgdmFsdWUpLmlzRW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9OdWxsTWFza2luZ0Z1bmN0aW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvTnVsbE1hc2tpbmdGdW5jdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGY3M2ViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvTnVsbE1hc2tpbmdGdW5jdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLm1hc2tpbmc7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmsgTnVsbE1hc2tpbmdGdW5jdGlvbn0uCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsTWFza2luZ0Z1bmN0aW9uVGVzdCBleHRlbmRzIE1hc2tpbmdGdW5jdGlvblRlc3RlcgoreworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHRlc3RNYXNraW5nT25Db2x1bW4oU3RyaW5nIG5hbWUsIENRTDNUeXBlIHR5cGUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKGZvcm1hdCgiU0VMRUNUIG1hc2tfbnVsbCglcykgRlJPTSAlJXMiLCBuYW1lKSksCisgICAgICAgICAgICAgICAgICAgcm93KChPYmplY3QpIG51bGwpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9QYXJ0aWFsTWFza2luZ0Z1bmN0aW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvUGFydGlhbE1hc2tpbmdGdW5jdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWY3NWE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvUGFydGlhbE1hc2tpbmdGdW5jdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5Db2x1bW5EZWZpbml0aW9uczsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuRGF0YVR5cGU7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJlc3VsdFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTDNUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuU3RyaW5nVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKKworLyoqCisgKiBUZXN0cyBmb3Ige0BsaW5rIFBhcnRpYWxNYXNraW5nRnVuY3Rpb259LgorICovCitwdWJsaWMgY2xhc3MgUGFydGlhbE1hc2tpbmdGdW5jdGlvblRlc3QgZXh0ZW5kcyBNYXNraW5nRnVuY3Rpb25UZXN0ZXIKK3sKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0TWFza2luZ09uQ29sdW1uKFN0cmluZyBuYW1lLCBDUUwzVHlwZSB0eXBlLCBPYmplY3QgdmFsdWUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRlc3RNYXNraW5nT25Db2x1bW4oUGFydGlhbE1hc2tpbmdGdW5jdGlvbi5UeXBlLklOTkVSLCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgIHRlc3RNYXNraW5nT25Db2x1bW4oUGFydGlhbE1hc2tpbmdGdW5jdGlvbi5UeXBlLk9VVEVSLCBuYW1lLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgdGVzdE1hc2tpbmdPbkNvbHVtbihQYXJ0aWFsTWFza2luZ0Z1bmN0aW9uLlR5cGUgbWFza2VyLCBTdHJpbmcgbmFtZSwgQ1FMM1R5cGUgdHlwZSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgZnVuY3Rpb25OYW1lID0gU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FICsgIi5tYXNrXyIgKyBtYXNrZXIubmFtZSgpLnRvTG93ZXJDYXNlKCk7CisKKyAgICAgICAgaWYgKHR5cGUuZ2V0VHlwZSgpIGluc3RhbmNlb2YgU3RyaW5nVHlwZSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nVHlwZSBzdHJpbmdUeXBlID0gKFN0cmluZ1R5cGUpIHR5cGUuZ2V0VHlwZSgpOworICAgICAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgdmFsdWU7CisKKyAgICAgICAgICAgIC8vIC4uLiB3aXRoIGRlZmF1bHQgcGFkZGluZworICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKGZvcm1hdCgiU0VMRUNUICVzKCVzLCAxLCAyKSBGUk9NICUlcyIsIGZ1bmN0aW9uTmFtZSwgbmFtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICByb3cobWFza2VyLm1hc2soc3RyaW5nVmFsdWUsIDEsIDIsIFBhcnRpYWxNYXNraW5nRnVuY3Rpb24uREVGQVVMVF9QQURESU5HX0NIQVIpKSk7CisKKyAgICAgICAgICAgIC8vIC4uLiB3aXRoIG1hbnVhbGx5IHNwZWNpZmllZCBBU0NJSSBwYWRkaW5nCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoZm9ybWF0KCJTRUxFQ1QgJXMoJXMsIDEsIDIsICcjJykgRlJPTSAlJXMiLCBmdW5jdGlvbk5hbWUsIG5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcm93KG1hc2tlci5tYXNrKHN0cmluZ1ZhbHVlLCAxLCAyLCAnIycpKSk7CisKKyAgICAgICAgICAgIC8vIC4uLiB3aXRoIG1hbnVhbGx5IHNwZWNpZmllZCBVVEYtOCBwYWRkaW5nCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoZm9ybWF0KCJTRUxFQ1QgJXMoKHRleHQpICVzLCAxLCAyLCAnw6knKSBGUk9NICUlcyIsIGZ1bmN0aW9uTmFtZSwgbmFtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICByb3cobWFza2VyLm1hc2soc3RyaW5nVmFsdWUsIDEsIDIsICfDqScpKSk7CisKKyAgICAgICAgICAgIC8vIC4uLiB3aXRoIG5vdCBzaW5nbGUtY2hhcmFjdGVyIHBhZGRpbmcKKyAgICAgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoInNob3VsZCBiZSBzaW5nbGUtY2hhcmFjdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiU0VMRUNUICVzKCVzLCAxLCAyLCAndG9vX2xvbmcnKSBGUk9NICUlcyIsIGZ1bmN0aW9uTmFtZSwgbmFtZSkpOworCisgICAgICAgICAgICAvLyAuLi4gd2l0aCBudWxsIHBhZGRpbmcKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShmb3JtYXQoIlNFTEVDVCAlcyglcywgMSwgMiwgbnVsbCkgRlJPTSAlJXMiLCBmdW5jdGlvbk5hbWUsIG5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcm93KG1hc2tlci5tYXNrKHN0cmluZ1ZhbHVlLCAxLCAyLCBQYXJ0aWFsTWFza2luZ0Z1bmN0aW9uLkRFRkFVTFRfUEFERElOR19DSEFSKSkpOworCisgICAgICAgICAgICAvLyAuLi4gd2l0aCBudWxsIGJlZ2luCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoZm9ybWF0KCJTRUxFQ1QgJXMoJXMsIG51bGwsIDIpIEZST00gJSVzIiwgZnVuY3Rpb25OYW1lLCBuYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgIHJvdyhtYXNrZXIubWFzayhzdHJpbmdWYWx1ZSwgMCwgMiwgUGFydGlhbE1hc2tpbmdGdW5jdGlvbi5ERUZBVUxUX1BBRERJTkdfQ0hBUikpKTsKKworICAgICAgICAgICAgLy8gLi4uIHdpdGggbnVsbCBlbmQKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShmb3JtYXQoIlNFTEVDVCAlcyglcywgMSwgbnVsbCkgRlJPTSAlJXMiLCBmdW5jdGlvbk5hbWUsIG5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcm93KG1hc2tlci5tYXNrKHN0cmluZ1ZhbHVlLCAxLCAwLCBQYXJ0aWFsTWFza2luZ0Z1bmN0aW9uLkRFRkFVTFRfUEFERElOR19DSEFSKSkpOworCisgICAgICAgICAgICAvLyB0ZXN0IHJlc3VsdCBzZXQgbWV0YWRhdGEsIGl0IHNob3VsZCBhbHdheXMgYmUgb2YgdHlwZSB0ZXh0LCByZWdhcmRsZXNzIG9mIHRoZSB0eXBlIG9mIHRoZSBjb2x1bW4KKyAgICAgICAgICAgIFJlc3VsdFNldCBycyA9IGV4ZWN1dGVOZXQoZm9ybWF0KCJTRUxFQ1QgJXMoJXMsIDEsIDIpIEZST00gJSVzIiwgZnVuY3Rpb25OYW1lLCBuYW1lKSk7CisgICAgICAgICAgICBDb2x1bW5EZWZpbml0aW9ucyBkZWZpbml0aW9ucyA9IHJzLmdldENvbHVtbkRlZmluaXRpb25zKCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGRlZmluaXRpb25zLnNpemUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGRyaXZlckRhdGFUeXBlKHN0cmluZ1R5cGUpLCBkZWZpbml0aW9ucy5nZXRUeXBlKDApKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9ybWF0KCIlcyglcywgMSwgMikiLCBmdW5jdGlvbk5hbWUsIG5hbWUpLCBkZWZpbml0aW9ucy5nZXROYW1lKDApKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoZm9ybWF0KCJGdW5jdGlvbiAlcyByZXF1aXJlcyBhbiBhcmd1bWVudCBvZiB0eXBlIFt0ZXh0fHZhcmNoYXJ8YXNjaWldLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZm91bmQgYXJndW1lbnQgJXMgb2YgdHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWUsIG5hbWUsIHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJTRUxFQ1QgJXMoJXMsIDEsIDIpIEZST00gJSVzIiwgZnVuY3Rpb25OYW1lLCBuYW1lKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBEYXRhVHlwZSBkcml2ZXJEYXRhVHlwZShTdHJpbmdUeXBlIHR5cGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKChDUUwzVHlwZS5OYXRpdmUpIHR5cGUuYXNDUUwzVHlwZSgpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIEFTQ0lJOgorICAgICAgICAgICAgICAgIHJldHVybiBEYXRhVHlwZS5hc2NpaSgpOworICAgICAgICAgICAgY2FzZSBWQVJDSEFSOgorICAgICAgICAgICAgICAgIHJldHVybiBEYXRhVHlwZS52YXJjaGFyKCk7CisgICAgICAgICAgICBjYXNlIFRFWFQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIERhdGFUeXBlLnRleHQoKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXNraW5nKCkKKyAgICB7CisgICAgICAgIC8vIG51bGwgdmFsdWUKKyAgICAgICAgdGVzdE1hc2tpbmcobnVsbCwgMCwgMCwgJyonLCBudWxsLCBudWxsKTsKKyAgICAgICAgdGVzdE1hc2tpbmcobnVsbCwgOSwgOSwgJyonLCBudWxsLCBudWxsKTsKKyAgICAgICAgdGVzdE1hc2tpbmcobnVsbCwgMCwgMCwgJyMnLCBudWxsLCBudWxsKTsKKyAgICAgICAgdGVzdE1hc2tpbmcobnVsbCwgOSwgOSwgJyMnLCBudWxsLCBudWxsKTsKKworICAgICAgICAvLyBlbXB0eSB2YWx1ZQorICAgICAgICB0ZXN0TWFza2luZygiIiwgMCwgMCwgJyonLCAiIiwgIiIpOworICAgICAgICB0ZXN0TWFza2luZygiIiwgOSwgOSwgJyonLCAiIiwgIiIpOworICAgICAgICB0ZXN0TWFza2luZygiIiwgMCwgMCwgJyMnLCAiIiwgIiIpOworICAgICAgICB0ZXN0TWFza2luZygiIiwgOSwgOSwgJyMnLCAiIiwgIiIpOworCisgICAgICAgIC8vIHNpbmdsZS1jaGFyIHZhbHVlCisgICAgICAgIHRlc3RNYXNraW5nKCJhIiwgMCwgMCwgJyonLCAiKiIsICJhIik7CisgICAgICAgIHRlc3RNYXNraW5nKCJhIiwgMSwgMSwgJyonLCAiYSIsICIqIik7CisgICAgICAgIHRlc3RNYXNraW5nKCJhIiwgMTAsIDEwLCAnKicsICJhIiwgIioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImEiLCAwLCAwLCAnIycsICIjIiwgImEiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImEiLCAxLCAxLCAnIycsICJhIiwgIiMiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImEiLCAxMCwgMTAsICcjJywgImEiLCAiIyIpOworCisgICAgICAgIC8vIHJlZ3VsYXIgdmFsdWUKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMCwgMCwgJyonLCAiKioqKioiLCAiYWJjZGUiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMCwgMSwgJyonLCAiKioqKmUiLCAiYWJjZCoiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMCwgMiwgJyonLCAiKioqZGUiLCAiYWJjKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMCwgMywgJyonLCAiKipjZGUiLCAiYWIqKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMCwgNCwgJyonLCAiKmJjZGUiLCAiYSoqKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMCwgNSwgJyonLCAiYWJjZGUiLCAiKioqKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMCwgNiwgJyonLCAiYWJjZGUiLCAiKioqKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMSwgMCwgJyonLCAiYSoqKioiLCAiKmJjZGUiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMiwgMCwgJyonLCAiYWIqKioiLCAiKipjZGUiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMywgMCwgJyonLCAiYWJjKioiLCAiKioqZGUiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgNCwgMCwgJyonLCAiYWJjZCoiLCAiKioqKmUiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgNSwgMCwgJyonLCAiYWJjZGUiLCAiKioqKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgNiwgMCwgJyonLCAiYWJjZGUiLCAiKioqKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMSwgMSwgJyonLCAiYSoqKmUiLCAiKmJjZCoiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMiwgMiwgJyonLCAiYWIqZGUiLCAiKipjKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgMywgMywgJyonLCAiYWJjZGUiLCAiKioqKioiKTsKKyAgICAgICAgdGVzdE1hc2tpbmcoImFiY2RlIiwgNCwgNCwgJyonLCAiYWJjZGUiLCAiKioqKioiKTsKKworICAgICAgICAvLyBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgICAgICAgdGVzdE1hc2tpbmcoIsOhI8Otw7LDvCIsIDAsIDAsICcqJywgIioqKioqIiwgIsOhI8Otw7LDvCIpOworICAgICAgICB0ZXN0TWFza2luZygiw6Ejw63DssO8IiwgMSwgMSwgJyonLCAiw6EqKirDvCIsICIqI8Otw7IqIik7CisgICAgICAgIHRlc3RNYXNraW5nKCLDoSPDrcOyw7wiLCA1LCA1LCAnKicsICLDoSPDrcOyw7wiLCAiKioqKioiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RNYXNraW5nKFN0cmluZyB1bm1hc2tlZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcGFkZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpbm5lck1hc2tlZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG91dGVyTWFza2VkVmFsdWUpCisgICAgeworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoUGFydGlhbE1hc2tpbmdGdW5jdGlvbi5UeXBlLklOTkVSLm1hc2sodW5tYXNrZWRWYWx1ZSwgYmVnaW4sIGVuZCwgcGFkZGluZykpCisgICAgICAgICAgICAgICAgICAuaXNJbihpbm5lck1hc2tlZFZhbHVlKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFBhcnRpYWxNYXNraW5nRnVuY3Rpb24uVHlwZS5PVVRFUi5tYXNrKHVubWFza2VkVmFsdWUsIGJlZ2luLCBlbmQsIHBhZGRpbmcpKQorICAgICAgICAgICAgICAgICAgLmlzSW4ob3V0ZXJNYXNrZWRWYWx1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvUmVwbGFjZU1hc2tpbmdGdW5jdGlvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL1JlcGxhY2VNYXNraW5nRnVuY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwMTI1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL1JlcGxhY2VNYXNraW5nRnVuY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMM1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKKworLyoqCisgKiBUZXN0cyBmb3Ige0BsaW5rIFJlcGxhY2VNYXNraW5nRnVuY3Rpb259LgorICovCitwdWJsaWMgY2xhc3MgUmVwbGFjZU1hc2tpbmdGdW5jdGlvblRlc3QgZXh0ZW5kcyBNYXNraW5nRnVuY3Rpb25UZXN0ZXIKK3sKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZXN0TWFza2luZ09uQ29sdW1uKFN0cmluZyBuYW1lLCBDUUwzVHlwZSB0eXBlLCBPYmplY3QgdmFsdWUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIG51bGwgcmVwbGFjZW1lbnQgYXJndW1lbnQKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKGZvcm1hdCgiU0VMRUNUIG1hc2tfcmVwbGFjZSglcywgPykgRlJPTSAlJXMiLCBuYW1lKSwgKE9iamVjdCkgbnVsbCksCisgICAgICAgICAgICAgICAgICAgcm93KChPYmplY3QpIG51bGwpKTsKKworICAgICAgICAvLyBub3QtbnVsbCByZXBsYWNlbWVudCBhcmd1bWVudAorICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdCA9IHR5cGUuZ2V0VHlwZSgpOworICAgICAgICBPYmplY3QgcmVwbGFjZW1lbnRWYWx1ZSA9IHQuY29tcG9zZSh0LmdldE1hc2tlZFZhbHVlKCkpOworICAgICAgICBTdHJpbmcgcXVlcnkgPSBmb3JtYXQoIlNFTEVDVCBtYXNrX3JlcGxhY2UoJXMsID8pIEZST00gJSVzIiwgbmFtZSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShxdWVyeSwgcmVwbGFjZW1lbnRWYWx1ZSksIHJvdyhyZXBsYWNlbWVudFZhbHVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVdpdGhEaWZmZXJlbnRUeXBlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgdmFyaW50KSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyhrKSBWQUxVRVMgKDApIik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hc2tfcmVwbGFjZSh2LCAxKSBGUk9NICVzIiksIHJvdyhCaWdJbnRlZ2VyLk9ORSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXNrX3JlcGxhY2UodiwgKGludCkgMSkgRlJPTSAlcyIpLCByb3coQmlnSW50ZWdlci5PTkUpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFza19yZXBsYWNlKHYsIChiaWdpbnQpIDEpIEZST00gJXMiKSwgcm93KEJpZ0ludGVnZXIuT05FKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hc2tfcmVwbGFjZSh2LCAodmFyaW50KSAxKSBGUk9NICVzIiksIHJvdyhCaWdJbnRlZ2VyLk9ORSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXNrX3JlcGxhY2UodiwgPykgRlJPTSAlcyIsIDEpLCByb3coQmlnSW50ZWdlci5PTkUpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWFza19yZXBsYWNlKHYsID8pIEZST00gJXMiLCAxTCksIHJvdyhCaWdJbnRlZ2VyLk9ORSkpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXNrX3JlcGxhY2UodiwgPykgRlJPTSAlcyIsIEJpZ0ludGVnZXIuT05FKSwgcm93KEJpZ0ludGVnZXIuT05FKSk7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoIlR5cGUgZXJyb3I6IDEuMiBjYW5ub3QgYmUgcGFzc2VkIGFzIGFyZ3VtZW50IDEgb2YgZnVuY3Rpb24gc3lzdGVtLm1hc2tfcmVwbGFjZSBvZiB0eXBlIHZhcmludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsICJTRUxFQ1QgbWFza19yZXBsYWNlKHYsIDEuMikgRlJPTSAlcyIpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKCJUeXBlIGVycm9yOiAnc2VjcmV0JyBjYW5ub3QgYmUgcGFzc2VkIGFzIGFyZ3VtZW50IDEgb2YgZnVuY3Rpb24gc3lzdGVtLm1hc2tfcmVwbGFjZSBvZiB0eXBlIHZhcmludCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsICJTRUxFQ1QgbWFza19yZXBsYWNlKHYsICdzZWNyZXQnKSBGUk9NICVzIik7CisKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHYgdmFyY2hhcikiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMoaykgVkFMVUVTICgwKSIpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXNrX3JlcGxhY2UodiwgJ3NlY3JldCcpIEZST00gJXMiKSwgcm93KCJzZWNyZXQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1hc2tfcmVwbGFjZSh2LCAoYXNjaWkpICdzZWNyZXQnKSBGUk9NICVzIiksIHJvdygic2VjcmV0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXNrX3JlcGxhY2UodiwgKHRleHQpICdzZWNyZXQnKSBGUk9NICVzIiksIHJvdygic2VjcmV0IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXNrX3JlcGxhY2UodiwgKHZhcmNoYXIpICdzZWNyZXQnKSBGUk9NICVzIiksIHJvdygic2VjcmV0IikpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKCJUeXBlIGVycm9yOiAxIGNhbm5vdCBiZSBwYXNzZWQgYXMgYXJndW1lbnQgMSBvZiBmdW5jdGlvbiBzeXN0ZW0ubWFza19yZXBsYWNlIG9mIHR5cGUgdGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsICJTRUxFQ1QgbWFza19yZXBsYWNlKHYsIDEpIEZST00gJXMiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9mdW5jdGlvbnMvbWFza2luZy9TZWxlY3RNYXNrZWRQZXJtaXNzaW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvU2VsZWN0TWFza2VkUGVybWlzc2lvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTYwNmZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvU2VsZWN0TWFza2VkUGVybWlzc2lvblRlc3QuamF2YQpAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLmZ1bmN0aW9ucy5tYXNraW5nOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXdhaXRpbGl0eS5jb3JlLlRocm93aW5nUnVubmFibGU7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CisKKy8qKgorICogVGVzdHMgdGhlIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLlBlcm1pc3Npb24jU0VMRUNUX01BU0tFRH0gcGVybWlzc2lvbi4KKyAqLworcHVibGljIGNsYXNzIFNlbGVjdE1hc2tlZFBlcm1pc3Npb25UZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gQ0xFQVJfUk9XID0gcm93KDcsIDcsIDcsIDcpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVIgPSAiZGRtX3VzZXIiOyAvLyB1c2VyIHRoYXQgd2lsbCBoYXZlIHRoZWlyIHBlcm1pc3Npb25zIGNoYW5nZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAiZGRtX3Bhc3N3b3JkIjsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RHluYW1pY0RhdGFNYXNraW5nRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFBlcm1pc3Npb25zVmFsaWRpdHkoMCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRSb2xlc1ZhbGlkaXR5KDApOworICAgICAgICBDUUxUZXN0ZXIuc2V0VXBDbGFzcygpOworICAgICAgICByZXF1aXJlQXV0aGVudGljYXRpb24oKTsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdXNlU3VwZXJVc2VyKCk7CisKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQsIGMgaW50LCBzIGludCBzdGF0aWMsIHYgaW50LCBQUklNQVJZIEtFWSAoaywgYykpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoIklOU0VSVCBJTlRPICVzKGssIGMsIHMsIHYpIFZBTFVFUyAoPywgPywgPywgPykiLCBDTEVBUl9ST1cpOworCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJDUkVBVEUgVVNFUiBJRiBOT1QgRVhJU1RTICVzIFdJVEggUEFTU1dPUkQgJyVzJyIsIFVTRVIsIFBBU1NXT1JEKSk7CisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBTRUxFQ1QgT04gQUxMIEtFWVNQQUNFUyBUTyAlcyIsIFVTRVIpKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBhZnRlcigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHVzZVN1cGVyVXNlcigpOworICAgICAgICBleGVjdXRlTmV0KCJEUk9QIFVTRVIgSUYgRVhJU1RTICIgKyBVU0VSKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgayBEUk9QIE1BU0tFRCIpOworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBjIERST1AgTUFTS0VEIik7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIHMgRFJPUCBNQVNLRUQiKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBEUk9QIE1BU0tFRCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnRpdGlvbktleUNvbHVtbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFsdGVyVGFibGUoIkFMVEVSIFRBQkxFICVzIEFMVEVSIGsgTUFTS0VEIFdJVEggREVGQVVMVCIpOworICAgICAgICBPYmplY3RbXSBtYXNrZWRSb3cgPSByb3coMCwgNywgNywgNyk7CisKKyAgICAgICAgLy8gdGVzdCBxdWVyaWVzIHdpdGggZGVmYXVsdCBwZXJtaXNzaW9ucyAobm8gVU5NQVNLIG5vciBTRUxFQ1RfTUFTS0VEKQorICAgICAgICB0ZXN0UGFydGl0aW9uS2V5Q29sdW1uV2l0aERlZmF1bHRQZXJtaXNzaW9ucyhtYXNrZWRSb3cpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyB3aXRoIG9ubHkgU0VMRUNUX01BU0tFRCBwZXJtaXNzaW9uCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBTRUxFQ1RfTUFTS0VEIE9OIEFMTCBLRVlTUEFDRVMgVE8gJXMiLCBVU0VSKSk7CisgICAgICAgIHRlc3RQYXJ0aXRpb25LZXlDb2x1bW5XaXRoT25seVNlbGVjdE1hc2tlZChtYXNrZWRSb3cpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyB3aXRoIG9ubHkgVU5NQVNLIHBlcm1pc3Npb24gKHdoaWNoIGluY2x1ZGVzIFNFTEVDVF9NQVNLRUQpCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJSRVZPS0UgU0VMRUNUX01BU0tFRCBPTiBBTEwgS0VZU1BBQ0VTIEZST00gJXMiLCBVU0VSKSk7CisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBVTk1BU0sgT04gQUxMIEtFWVNQQUNFUyBUTyAlcyIsIFVTRVIpKTsKKyAgICAgICAgdGVzdFBhcnRpdGlvbktleUNvbHVtbldpdGhVbm1hc2soKTsKKworICAgICAgICAvLyB0ZXN0IHF1ZXJpZXMgd2l0aCBib3RoIFVOTUFTSyBhbmQgU0VMRUNUX01BU0tFRCBwZXJtaXNzaW9ucworICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiR1JBTlQgVU5NQVNLLCBTRUxFQ1RfTUFTS0VEIE9OIEFMTCBLRVlTUEFDRVMgVE8gJXMiLCBVU0VSKSk7CisgICAgICAgIHRlc3RQYXJ0aXRpb25LZXlDb2x1bW5XaXRoVW5tYXNrKCk7CisKKyAgICAgICAgLy8gdGVzdCBxdWVyaWVzIGFnYWluIHdpdGhvdXQgYm90aCBVTk1BU0sgYW5kIFNFTEVDVF9NQVNLRUQgcGVybWlzc2lvbnMKKyAgICAgICAgZXhlY3V0ZU5ldChmb3JtYXQoIlJFVk9LRSBVTk1BU0ssIFNFTEVDVF9NQVNLRUQgT04gQUxMIEtFWVNQQUNFUyBGUk9NICVzIiwgVVNFUikpOworICAgICAgICB0ZXN0UGFydGl0aW9uS2V5Q29sdW1uV2l0aERlZmF1bHRQZXJtaXNzaW9ucyhtYXNrZWRSb3cpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UGFydGl0aW9uS2V5Q29sdW1uV2l0aERlZmF1bHRQZXJtaXNzaW9ucyhPYmplY3RbXSBtYXNrZWRSb3cpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdpdGhVc2VyKCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB2ID0gNyBBTExPVyBGSUxURVJJTkciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHMgPSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRVbmF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyIsICJba10iKTsKKyAgICAgICAgICAgIGFzc2VydFVuYXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPj0gNyBBTExPVyBGSUxURVJJTkciLCAiW2tdIik7CisgICAgICAgICAgICBhc3NlcnRVbmF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyBBTkQgYyA9IDciLCAiW2tdIik7CisgICAgICAgICAgICBhc3NlcnRVbmF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyBBTkQgdiA9IDcgQUxMT1cgRklMVEVSSU5HIiwgIltrXSIpOworICAgICAgICAgICAgYXNzZXJ0VW5hdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdG9rZW4oaykgPSB0b2tlbig3KSIsICJba10iKTsKKyAgICAgICAgICAgIGFzc2VydFVuYXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHRva2VuKGspID49IHRva2VuKDcpIiwgIltrXSIpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFBhcnRpdGlvbktleUNvbHVtbldpdGhPbmx5U2VsZWN0TWFza2VkKE9iamVjdFtdIG1hc2tlZFJvdykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0V2l0aFVzZXIoKCkgLT4geworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBjID0gNyBBTExPVyBGSUxURVJJTkciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHYgPSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA+PSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDcgQU5EIGMgPSA3IiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyBBTkQgdiA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB0b2tlbihrKSA9IHRva2VuKDcpIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB0b2tlbihrKSA+PSB0b2tlbig3KSIsIG1hc2tlZFJvdyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UGFydGl0aW9uS2V5Q29sdW1uV2l0aFVubWFzaygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdpdGhVc2VyKCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB2ID0gNyBBTExPVyBGSUxURVJJTkciLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHMgPSA3IEFMTE9XIEZJTFRFUklORyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDciLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPj0gNyBBTExPVyBGSUxURVJJTkciLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA3IEFORCBjID0gNyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDcgQU5EIHYgPSA3IEFMTE9XIEZJTFRFUklORyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdG9rZW4oaykgPSB0b2tlbig3KSIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdG9rZW4oaykgPj0gdG9rZW4oNykiLCBDTEVBUl9ST1cpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbHVzdGVyaW5nS2V5Q29sdW1uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgYyBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisgICAgICAgIE9iamVjdFtdIG1hc2tlZFJvdyA9IHJvdyg3LCAwLCA3LCA3KTsKKworICAgICAgICAvLyB0ZXN0IHF1ZXJpZXMgd2l0aCBkZWZhdWx0IHBlcm1pc3Npb25zIChubyBVTk1BU0sgbm9yIFNFTEVDVF9NQVNLRUQpCisgICAgICAgIHRlc3RDbHVzdGVyaW5nS2V5Q29sdW1uV2l0aERlZmF1bHRQZXJtaXNzaW9ucyhtYXNrZWRSb3cpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyB3aXRoIG9ubHkgU0VMRUNUX01BU0tFRCBwZXJtaXNzaW9uCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBTRUxFQ1RfTUFTS0VEIE9OIEFMTCBLRVlTUEFDRVMgVE8gJXMiLCBVU0VSKSk7CisgICAgICAgIHRlc3RDbHVzdGVyaW5nS2V5Q29sdW1uV2l0aE9ubHlTZWxlY3RNYXNrZWQobWFza2VkUm93KTsKKworICAgICAgICAvLyB0ZXN0IHF1ZXJpZXMgd2l0aCBvbmx5IFVOTUFTSyBwZXJtaXNzaW9uICh3aGljaCBpbmNsdWRlcyBTRUxFQ1RfTUFTS0VEKQorICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiUkVWT0tFIFNFTEVDVF9NQVNLRUQgT04gQUxMIEtFWVNQQUNFUyBGUk9NICVzIiwgVVNFUikpOworICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiR1JBTlQgVU5NQVNLIE9OIEFMTCBLRVlTUEFDRVMgVE8gJXMiLCBVU0VSKSk7CisgICAgICAgIHRlc3RDbHVzdGVyaW5nS2V5Q29sdW1uV2l0aFVubWFzaygpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyB3aXRoIGJvdGggVU5NQVNLIGFuZCBTRUxFQ1RfTUFTS0VEIHBlcm1pc3Npb25zCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBVTk1BU0ssIFNFTEVDVF9NQVNLRUQgT04gQUxMIEtFWVNQQUNFUyBUTyAlcyIsIFVTRVIpKTsKKyAgICAgICAgdGVzdENsdXN0ZXJpbmdLZXlDb2x1bW5XaXRoVW5tYXNrKCk7CisKKyAgICAgICAgLy8gdGVzdCBxdWVyaWVzIGFnYWluIHdpdGhvdXQgYm90aCBVTk1BU0sgYW5kIFNFTEVDVF9NQVNLRUQgcGVybWlzc2lvbnMKKyAgICAgICAgZXhlY3V0ZU5ldChmb3JtYXQoIlJFVk9LRSBVTk1BU0ssIFNFTEVDVF9NQVNLRUQgT04gQUxMIEtFWVNQQUNFUyBGUk9NICVzIiwgVVNFUikpOworICAgICAgICB0ZXN0Q2x1c3RlcmluZ0tleUNvbHVtbldpdGhEZWZhdWx0UGVybWlzc2lvbnMobWFza2VkUm93KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdENsdXN0ZXJpbmdLZXlDb2x1bW5XaXRoRGVmYXVsdFBlcm1pc3Npb25zKE9iamVjdFtdIG1hc2tlZFJvdykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0V2l0aFVzZXIoKCkgLT4geworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdiA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBzID0gNyBBTExPVyBGSUxURVJJTkciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHRva2VuKGspID0gdG9rZW4oNykiLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0VW5hdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgIltjXSIpOworICAgICAgICAgICAgYXNzZXJ0VW5hdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDcgQU5EIGMgPSA3IiwgIltjXSIpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdENsdXN0ZXJpbmdLZXlDb2x1bW5XaXRoT25seVNlbGVjdE1hc2tlZChPYmplY3RbXSBtYXNrZWRSb3cpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdpdGhVc2VyKCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHYgPSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB0b2tlbihrKSA9IHRva2VuKDcpIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBjID0gNyBBTExPVyBGSUxURVJJTkciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA3IEFORCBjID0gNyIsIG1hc2tlZFJvdyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q2x1c3RlcmluZ0tleUNvbHVtbldpdGhVbm1hc2soKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRXaXRoVXNlcigoKSAtPiB7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMiLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA3IiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB2ID0gNyBBTExPVyBGSUxURVJJTkciLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHMgPSA3IEFMTE9XIEZJTFRFUklORyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdG9rZW4oaykgPSB0b2tlbig3KSIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyBBTkQgYyA9IDciLCBDTEVBUl9ST1cpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNDb2x1bW4oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhbHRlclRhYmxlKCJBTFRFUiBUQUJMRSAlcyBBTFRFUiBzIE1BU0tFRCBXSVRIIERFRkFVTFQiKTsKKyAgICAgICAgT2JqZWN0W10gbWFza2VkUm93ID0gcm93KDcsIDcsIDAsIDcpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyB3aXRoIGRlZmF1bHQgcGVybWlzc2lvbnMgKG5vIFVOTUFTSyBub3IgU0VMRUNUX01BU0tFRCkKKyAgICAgICAgdGVzdFN0YXRpY0NvbHVtbldpdGhEZWZhdWx0UGVybWlzc2lvbnMobWFza2VkUm93KTsKKworICAgICAgICAvLyB0ZXN0IHF1ZXJpZXMgd2l0aCBvbmx5IFNFTEVDVF9NQVNLRUQgcGVybWlzc2lvbgorICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiR1JBTlQgU0VMRUNUX01BU0tFRCBPTiBBTEwgS0VZU1BBQ0VTIFRPICVzIiwgVVNFUikpOworICAgICAgICB0ZXN0U3RhdGljQ29sdW1uV2l0aE9ubHlTZWxlY3RNYXNrZWQobWFza2VkUm93KTsKKworICAgICAgICAvLyB0ZXN0IHF1ZXJpZXMgd2l0aCBvbmx5IFVOTUFTSyBwZXJtaXNzaW9uICh3aGljaCBpbmNsdWRlcyBTRUxFQ1RfTUFTS0VEKQorICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiUkVWT0tFIFNFTEVDVF9NQVNLRUQgT04gQUxMIEtFWVNQQUNFUyBGUk9NICVzIiwgVVNFUikpOworICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiR1JBTlQgVU5NQVNLIE9OIEFMTCBLRVlTUEFDRVMgVE8gJXMiLCBVU0VSKSk7CisgICAgICAgIHRlc3RTdGF0aWNDb2x1bW5XaXRoVW5tYXNrKCk7CisKKyAgICAgICAgLy8gdGVzdCBxdWVyaWVzIHdpdGggYm90aCBVTk1BU0sgYW5kIFNFTEVDVF9NQVNLRUQgcGVybWlzc2lvbnMKKyAgICAgICAgZXhlY3V0ZU5ldChmb3JtYXQoIkdSQU5UIFVOTUFTSywgU0VMRUNUX01BU0tFRCBPTiBBTEwgS0VZU1BBQ0VTIFRPICVzIiwgVVNFUikpOworICAgICAgICB0ZXN0U3RhdGljQ29sdW1uV2l0aFVubWFzaygpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyBhZ2FpbiB3aXRob3V0IGJvdGggVU5NQVNLIGFuZCBTRUxFQ1RfTUFTS0VEIHBlcm1pc3Npb25zCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJSRVZPS0UgVU5NQVNLLCBTRUxFQ1RfTUFTS0VEIE9OIEFMTCBLRVlTUEFDRVMgRlJPTSAlcyIsIFVTRVIpKTsKKyAgICAgICAgdGVzdFN0YXRpY0NvbHVtbldpdGhEZWZhdWx0UGVybWlzc2lvbnMobWFza2VkUm93KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFN0YXRpY0NvbHVtbldpdGhEZWZhdWx0UGVybWlzc2lvbnMoT2JqZWN0W10gbWFza2VkUm93KSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRXaXRoVXNlcigoKSAtPiB7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMiLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHRva2VuKGspID0gdG9rZW4oNykiLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA3IiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyBBTkQgYyA9IDciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdiA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydFVuYXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHMgPSA3IEFMTE9XIEZJTFRFUklORyIsICJbc10iKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTdGF0aWNDb2x1bW5XaXRoT25seVNlbGVjdE1hc2tlZChPYmplY3RbXSBtYXNrZWRSb3cpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdpdGhVc2VyKCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdG9rZW4oaykgPSB0b2tlbig3KSIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA3IEFORCBjID0gNyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBzID0gNyBBTExPVyBGSUxURVJJTkciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHYgPSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RhdGljQ29sdW1uV2l0aFVubWFzaygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdpdGhVc2VyKCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdG9rZW4oaykgPSB0b2tlbig3KSIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDciLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA3IEFORCBjID0gNyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBzID0gNyBBTExPVyBGSUxURVJJTkciLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHYgPSA3IEFMTE9XIEZJTFRFUklORyIsIENMRUFSX1JPVyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25zKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYWx0ZXJUYWJsZSgiQUxURVIgVEFCTEUgJXMgQUxURVIgdiBNQVNLRUQgV0lUSCBERUZBVUxUIik7CisgICAgICAgIE9iamVjdFtdIG1hc2tlZFJvdyA9IHJvdyg3LCA3LCA3LCAwKTsKKworICAgICAgICAvLyB0ZXN0IHF1ZXJpZXMgd2l0aCBkZWZhdWx0IHBlcm1pc3Npb25zIChubyBVTk1BU0sgbm9yIFNFTEVDVF9NQVNLRUQpCisgICAgICAgIHRlc3RDb2xsZWN0aW9uc1dpdGhEZWZhdWx0UGVybWlzc2lvbnMobWFza2VkUm93KTsKKworICAgICAgICAvLyB0ZXN0IHF1ZXJpZXMgd2l0aCBvbmx5IFNFTEVDVF9NQVNLRUQgcGVybWlzc2lvbgorICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiR1JBTlQgU0VMRUNUX01BU0tFRCBPTiBBTEwgS0VZU1BBQ0VTIFRPICVzIiwgVVNFUikpOworICAgICAgICB0ZXN0Q29sbGVjdGlvbnNXaXRoT25seVNlbGVjdE1hc2tlZChtYXNrZWRSb3cpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyB3aXRoIG9ubHkgVU5NQVNLIHBlcm1pc3Npb24gKHdoaWNoIGluY2x1ZGVzIFNFTEVDVF9NQVNLRUQpCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJSRVZPS0UgU0VMRUNUX01BU0tFRCBPTiBBTEwgS0VZU1BBQ0VTIEZST00gJXMiLCBVU0VSKSk7CisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBVTk1BU0sgT04gQUxMIEtFWVNQQUNFUyBUTyAlcyIsIFVTRVIpKTsKKyAgICAgICAgdGVzdENvbGxlY3Rpb25zV2l0aFVubWFzaygpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyB3aXRoIGJvdGggVU5NQVNLIGFuZCBTRUxFQ1RfTUFTS0VEIHBlcm1pc3Npb25zCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJHUkFOVCBVTk1BU0ssIFNFTEVDVF9NQVNLRUQgT04gQUxMIEtFWVNQQUNFUyBUTyAlcyIsIFVTRVIpKTsKKyAgICAgICAgdGVzdENvbGxlY3Rpb25zV2l0aFVubWFzaygpOworCisgICAgICAgIC8vIHRlc3QgcXVlcmllcyBhZ2FpbiB3aXRob3V0IGJvdGggVU5NQVNLIGFuZCBTRUxFQ1RfTUFTS0VEIHBlcm1pc3Npb25zCisgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJSRVZPS0UgVU5NQVNLLCBTRUxFQ1RfTUFTS0VEIE9OIEFMTCBLRVlTUEFDRVMgRlJPTSAlcyIsIFVTRVIpKTsKKyAgICAgICAgdGVzdENvbGxlY3Rpb25zV2l0aERlZmF1bHRQZXJtaXNzaW9ucyhtYXNrZWRSb3cpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q29sbGVjdGlvbnNXaXRoRGVmYXVsdFBlcm1pc3Npb25zKE9iamVjdFtdIG1hc2tlZFJvdykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0V2l0aFVzZXIoKCkgLT4geworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB0b2tlbihrKSA9IHRva2VuKDcpIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDcgQU5EIGMgPSA3IiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBjID0gNyBBTExPVyBGSUxURVJJTkciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHMgPSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRVbmF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB2ID0gNyBBTExPVyBGSUxURVJJTkciLCAiW3ZdIik7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q29sbGVjdGlvbnNXaXRoT25seVNlbGVjdE1hc2tlZChPYmplY3RbXSBtYXNrZWRSb3cpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdpdGhVc2VyKCgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdG9rZW4oaykgPSB0b2tlbig3KSIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA3IEFORCBjID0gNyIsIG1hc2tlZFJvdyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDcgQUxMT1cgRklMVEVSSU5HIiwgbWFza2VkUm93KTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBzID0gNyBBTExPVyBGSUxURVJJTkciLCBtYXNrZWRSb3cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHYgPSA3IEFMTE9XIEZJTFRFUklORyIsIG1hc2tlZFJvdyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q29sbGVjdGlvbnNXaXRoVW5tYXNrKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0V2l0aFVzZXIoKCkgLT4geworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB0b2tlbihrKSA9IHRva2VuKDcpIiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gNyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDcgQU5EIGMgPSA3IiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgICAgIGFzc2VydEF1dGhvcml6ZWRRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBjID0gNyBBTExPVyBGSUxURVJJTkciLCBDTEVBUl9ST1cpOworICAgICAgICAgICAgYXNzZXJ0QXV0aG9yaXplZFF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHMgPSA3IEFMTE9XIEZJTFRFUklORyIsIENMRUFSX1JPVyk7CisgICAgICAgICAgICBhc3NlcnRBdXRob3JpemVkUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdiA9IDcgQUxMT1cgRklMVEVSSU5HIiwgQ0xFQVJfUk9XKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEF1dGhvcml6ZWRRdWVyeShTdHJpbmcgcXVlcnksIE9iamVjdFtdLi4uIHJvd3MpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChxdWVyeSksIHJvd3MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRVbmF1dGhvcml6ZWRRdWVyeShTdHJpbmcgcXVlcnksIFN0cmluZyB1bmF1dGhvcml6ZWRDb2x1bW5zKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZU5ldChmb3JtYXQoIlVzZXIgJXMgaGFzIG5vIFVOTUFTSyBub3IgU0VMRUNUX01BU0tFRCBwZXJtaXNzaW9uIG9uIHRhYmxlICVzLiVzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcXVlcnkgbWFza2VkIGNvbHVtbnMgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFUiwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCB1bmF1dGhvcml6ZWRDb2x1bW5zKSwgcXVlcnkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRXaXRoVXNlcihUaHJvd2luZ1J1bm5hYmxlIGFzc2VydGlvbikgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdXNlVXNlcihVU0VSLCBQQVNTV09SRCk7CisgICAgICAgIGFzc2VydGlvbi5ydW4oKTsKKyAgICAgICAgdXNlU3VwZXJVc2VyKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvZnVuY3Rpb25zL21hc2tpbmcvVW5tYXNrUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL1VubWFza1Blcm1pc3Npb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExY2RjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL2Z1bmN0aW9ucy9tYXNraW5nL1VubWFza1Blcm1pc3Npb25UZXN0LmphdmEKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMubWFza2luZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworCisvKioKKyAqIFRlc3RzIHRoZSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5QZXJtaXNzaW9uI1VOTUFTS30gcGVybWlzc2lvbi4KKyAqIDxwPgorICogVGhlIHBlcm1pc3Npb24gaXMgdGVzdGVkIGZvciBhIHJlZ3VsYXIgdXNlciB3aXRoIHRoZSB7QGNvZGUgVU5NQVNLfSBwZXJtaXNzaW9ucyBvbiBkaWZmZXJlbnQgcmVzb3VyY2VzLAorICogd2hpbGUgYWxzbyB2ZXJpZnlpbmcgdGhlIGFic2VuY2Ugb2Ygc2lkZSBlZmZlY3RzIG9uIG90aGVyIG9yZGluYXJ5IHVzZXJzLCBzdXBlcnVzZXJzIGFuZCBpbnRlcm5hbCBxdWVyaWVzLgorICovCitwdWJsaWMgY2xhc3MgVW5tYXNrUGVybWlzc2lvblRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0tFWVNQQUNFID0gIkNSRUFURSBLRVlTUEFDRSBJRiBOT1QgRVhJU1RTICVzIFdJVEggcmVwbGljYXRpb24gPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogJzEnfSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9UQUJMRSA9ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAlcy4lcyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihrIGludCwgYyBpbnQsIHYgdGV4dCBNQVNLRUQgV0lUSCBtYXNrX3JlcGxhY2UoJ3JlZGFjdGVkJyksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFJJTUFSWSBLRVkgKGssIGMpKSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVCA9ICJJTlNFUlQgSU5UTyAlcy4lcyAoaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9XSUxEQ0FSRCA9ICJTRUxFQ1QgKiBGUk9NICVzLiVzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX0NPTFVNTlMgPSAiU0VMRUNUIGssIGMsIHYgRlJPTSAlcy4lcyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBDTEVBUl9ST1cgPSByb3coMCwgMCwgInNlbnNpdGl2ZSIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIE1BU0tFRF9ST1cgPSByb3coMCwgMCwgInJlZGFjdGVkIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0VfMSA9ICJtYXNrX2tleXNwYWNlXzEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRV8yID0gIm1hc2tfa2V5c3BhY2VfMiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFXzEgPSAibWFza190YWJsZV8xIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfMiA9ICJtYXNrX3RhYmxlXzIiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVIgPSAiZGRtX3VzZXIiOyAvLyB1c2VyIHRoYXQgd2lsbCBoYXZlIHRoZWlyIHBlcm1pc3Npb25zIGNoYW5nZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RIRVJfVVNFUiA9ICJkZG1fb3JkaW5hcnlfdXNlciI7IC8vIHVzZXIgdGhhdCB3b24ndCBoYXZlIHRoZWlyIHBlcm1pc3Npb25zIGFsdGVyZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAiZGRtX3Bhc3N3b3JkIjsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RHluYW1pY0RhdGFNYXNraW5nRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFBlcm1pc3Npb25zVmFsaWRpdHkoMCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRSb2xlc1ZhbGlkaXR5KDApOworICAgICAgICBDUUxUZXN0ZXIuc2V0VXBDbGFzcygpOworICAgICAgICByZXF1aXJlQXV0aGVudGljYXRpb24oKTsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdXNlU3VwZXJVc2VyKCk7CisKKyAgICAgICAgc2NoZW1hQ2hhbmdlKGZvcm1hdChDUkVBVEVfS0VZU1BBQ0UsIEtFWVNQQUNFXzEpKTsKKyAgICAgICAgc2NoZW1hQ2hhbmdlKGZvcm1hdChDUkVBVEVfS0VZU1BBQ0UsIEtFWVNQQUNFXzIpKTsKKworICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoQ1JFQVRFX1RBQkxFLCBLRVlTUEFDRV8xLCBUQUJMRV8xKSk7CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdChDUkVBVEVfVEFCTEUsIEtFWVNQQUNFXzEsIFRBQkxFXzIpKTsKKyAgICAgICAgY3JlYXRlVGFibGUoZm9ybWF0KENSRUFURV9UQUJMRSwgS0VZU1BBQ0VfMiwgVEFCTEVfMSkpOworCisgICAgICAgIGV4ZWN1dGUoZm9ybWF0KElOU0VSVCwgS0VZU1BBQ0VfMSwgVEFCTEVfMSksIENMRUFSX1JPVyk7CisgICAgICAgIGV4ZWN1dGUoZm9ybWF0KElOU0VSVCwgS0VZU1BBQ0VfMSwgVEFCTEVfMiksIENMRUFSX1JPVyk7CisgICAgICAgIGV4ZWN1dGUoZm9ybWF0KElOU0VSVCwgS0VZU1BBQ0VfMiwgVEFCTEVfMSksIENMRUFSX1JPVyk7CisKKyAgICAgICAgZm9yIChTdHJpbmcgdXNlciA6IEFycmF5cy5hc0xpc3QoVVNFUiwgT1RIRVJfVVNFUikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJDUkVBVEUgVVNFUiBJRiBOT1QgRVhJU1RTICVzIFdJVEggUEFTU1dPUkQgJyVzJyIsIHVzZXIsIFBBU1NXT1JEKSk7CisgICAgICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiR1JBTlQgU0VMRUNUIE9OIEFMTCBLRVlTUEFDRVMgVE8gJXMiLCB1c2VyKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBhZnRlcigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHVzZVN1cGVyVXNlcigpOworICAgICAgICBleGVjdXRlTmV0KCJEUk9QIFVTRVIgSUYgRVhJU1RTICIgKyBVU0VSKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbm1hc2tEZWZhdWx0cygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIG9yZGluYXJ5IHVzZXIgd2l0aG91dCBjaGFuZ2VkIHBlcm1pc3Npb25zIHNob3VsZCBzZWUgbWFza2VkIGRhdGEKKyAgICAgICAgdXNlVXNlcihPVEhFUl9VU0VSLCBQQVNTV09SRCk7CisgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8xLCBUQUJMRV8xKTsKKyAgICAgICAgYXNzZXJ0TWFza2VkKEtFWVNQQUNFXzEsIFRBQkxFXzIpOworICAgICAgICBhc3NlcnRNYXNrZWQoS0VZU1BBQ0VfMiwgVEFCTEVfMSk7CisKKyAgICAgICAgLy8gc3VwZXIgdXNlciBzaG91bGQgc2VlIHVubWFza2VkIGRhdGEKKyAgICAgICAgdXNlU3VwZXJVc2VyKCk7CisgICAgICAgIGFzc2VydENsZWFyKEtFWVNQQUNFXzEsIFRBQkxFXzEpOworICAgICAgICBhc3NlcnRDbGVhcihLRVlTUEFDRV8xLCBUQUJMRV8yKTsKKyAgICAgICAgYXNzZXJ0Q2xlYXIoS0VZU1BBQ0VfMiwgVEFCTEVfMSk7CisKKyAgICAgICAgLy8gaW50ZXJuYWwgdXNlciBzaG91bGQgc2VlIHVubWFza2VkIGRhdGEKKyAgICAgICAgYXNzZXJ0Q2xlYXJJbnRlcm5hbChLRVlTUEFDRV8xLCBUQUJMRV8xKTsKKyAgICAgICAgYXNzZXJ0Q2xlYXJJbnRlcm5hbChLRVlTUEFDRV8xLCBUQUJMRV8yKTsKKyAgICAgICAgYXNzZXJ0Q2xlYXJJbnRlcm5hbChLRVlTUEFDRV8yLCBUQUJMRV8xKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbm1hc2tPbkFsbEtleXNwYWNlcygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFBlcm1pc3Npb25zKGZvcm1hdCgiR1JBTlQgVU5NQVNLIE9OIEFMTCBLRVlTUEFDRVMgVE8gJXMiLCBVU0VSKSwgKCkgLT4geworICAgICAgICAgICAgYXNzZXJ0Q2xlYXIoS0VZU1BBQ0VfMSwgVEFCTEVfMSk7CisgICAgICAgICAgICBhc3NlcnRDbGVhcihLRVlTUEFDRV8xLCBUQUJMRV8yKTsKKyAgICAgICAgICAgIGFzc2VydENsZWFyKEtFWVNQQUNFXzIsIFRBQkxFXzEpOworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRQZXJtaXNzaW9ucyhmb3JtYXQoIlJFVk9LRSBVTk1BU0sgT04gQUxMIEtFWVNQQUNFUyBGUk9NICVzIiwgVVNFUiksICgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8xLCBUQUJMRV8xKTsKKyAgICAgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8xLCBUQUJMRV8yKTsKKyAgICAgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8yLCBUQUJMRV8xKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5tYXNrT25LZXlzcGFjZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFBlcm1pc3Npb25zKGZvcm1hdCgiR1JBTlQgVU5NQVNLIE9OIEtFWVNQQUNFICVzIFRPICVzIiwgS0VZU1BBQ0VfMSwgVVNFUiksICgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydENsZWFyKEtFWVNQQUNFXzEsIFRBQkxFXzEpOworICAgICAgICAgICAgYXNzZXJ0Q2xlYXIoS0VZU1BBQ0VfMSwgVEFCTEVfMik7CisgICAgICAgICAgICBhc3NlcnRNYXNrZWQoS0VZU1BBQ0VfMiwgVEFCTEVfMSk7CisgICAgICAgIH0pOworCisgICAgICAgIGFzc2VydFBlcm1pc3Npb25zKGZvcm1hdCgiUkVWT0tFIFVOTUFTSyBPTiBLRVlTUEFDRSAlcyBGUk9NICVzIiwgS0VZU1BBQ0VfMSwgVVNFUiksICgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8xLCBUQUJMRV8xKTsKKyAgICAgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8xLCBUQUJMRV8yKTsKKyAgICAgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8yLCBUQUJMRV8xKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5tYXNrT25UYWJsZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFBlcm1pc3Npb25zKGZvcm1hdCgiR1JBTlQgVU5NQVNLIE9OIFRBQkxFICVzLiVzIFRPICVzIiwgS0VZU1BBQ0VfMSwgVEFCTEVfMSwgVVNFUiksICgpIC0+IHsKKyAgICAgICAgICAgIGFzc2VydENsZWFyKEtFWVNQQUNFXzEsIFRBQkxFXzEpOworICAgICAgICAgICAgYXNzZXJ0TWFza2VkKEtFWVNQQUNFXzEsIFRBQkxFXzIpOworICAgICAgICAgICAgYXNzZXJ0TWFza2VkKEtFWVNQQUNFXzIsIFRBQkxFXzEpOworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRQZXJtaXNzaW9ucyhmb3JtYXQoIlJFVk9LRSBVTk1BU0sgT04gVEFCTEUgJXMuJXMgRlJPTSAlcyIsIEtFWVNQQUNFXzEsIFRBQkxFXzEsIFVTRVIpLCAoKSAtPiB7CisgICAgICAgICAgICBhc3NlcnRNYXNrZWQoS0VZU1BBQ0VfMSwgVEFCTEVfMSk7CisgICAgICAgICAgICBhc3NlcnRNYXNrZWQoS0VZU1BBQ0VfMSwgVEFCTEVfMik7CisgICAgICAgICAgICBhc3NlcnRNYXNrZWQoS0VZU1BBQ0VfMiwgVEFCTEVfMSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQZXJtaXNzaW9ucyhTdHJpbmcgYWx0ZXJQZXJtaXNzaW9uc1F1ZXJ5LCBUaHJvd2luZ1J1bm5hYmxlIGFzc2VydGlvbikgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gYWx0ZXIgcGVybWlzc2lvbnMgYXMgc3VwZXJ1c2VyCisgICAgICAgIHVzZVN1cGVyVXNlcigpOworICAgICAgICBleGVjdXRlTmV0KGFsdGVyUGVybWlzc2lvbnNRdWVyeSk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoZSB0ZXN0ZWQgdXNlciBwZXJtaXNzaW9ucworICAgICAgICB1c2VVc2VyKFVTRVIsIFBBU1NXT1JEKTsKKyAgICAgICAgYXNzZXJ0aW9uLnJ1bigpOworCisgICAgICAgIC8vIHRoZSBvcmRpbmFyeSB1c2VyIHdpdGhvdXQgbW9kaWZpZWQgcGVybWlzc2lvbnMgc2hvdWxkIGtlZXAgc2VlaW5nIG1hc2tlZCBkYXRhCisgICAgICAgIHVzZVVzZXIoT1RIRVJfVVNFUiwgUEFTU1dPUkQpOworICAgICAgICBhc3NlcnRNYXNrZWQoS0VZU1BBQ0VfMSwgVEFCTEVfMSk7CisgICAgICAgIGFzc2VydE1hc2tlZChLRVlTUEFDRV8xLCBUQUJMRV8yKTsKKyAgICAgICAgYXNzZXJ0TWFza2VkKEtFWVNQQUNFXzIsIFRBQkxFXzEpOworCisgICAgICAgIC8vIHN1cGVyIHVzZXIgc2hvdWxkIGtlZXAgc2VlaW5nIHVubWFza2VkIGRhdGEKKyAgICAgICAgdXNlU3VwZXJVc2VyKCk7CisgICAgICAgIGFzc2VydENsZWFyKEtFWVNQQUNFXzEsIFRBQkxFXzEpOworICAgICAgICBhc3NlcnRDbGVhcihLRVlTUEFDRV8xLCBUQUJMRV8yKTsKKyAgICAgICAgYXNzZXJ0Q2xlYXIoS0VZU1BBQ0VfMiwgVEFCTEVfMSk7CisKKyAgICAgICAgLy8gaW50ZXJuYWwgdXNlciBzaG91bGQga2VlcCBzZWVpbmcgdW5tYXNrZWQgZGF0YQorICAgICAgICBhc3NlcnRDbGVhckludGVybmFsKEtFWVNQQUNFXzEsIFRBQkxFXzEpOworICAgICAgICBhc3NlcnRDbGVhckludGVybmFsKEtFWVNQQUNFXzEsIFRBQkxFXzIpOworICAgICAgICBhc3NlcnRDbGVhckludGVybmFsKEtFWVNQQUNFXzIsIFRBQkxFXzEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNYXNrZWQoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChmb3JtYXQoU0VMRUNUX1dJTERDQVJELCBrZXlzcGFjZSwgdGFibGUpKSwgTUFTS0VEX1JPVyk7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChmb3JtYXQoU0VMRUNUX0NPTFVNTlMsIGtleXNwYWNlLCB0YWJsZSkpLCBNQVNLRURfUk9XKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Q2xlYXIoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldChmb3JtYXQoU0VMRUNUX1dJTERDQVJELCBrZXlzcGFjZSwgdGFibGUpKSwgQ0xFQVJfUk9XKTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KGZvcm1hdChTRUxFQ1RfQ09MVU1OUywga2V5c3BhY2UsIHRhYmxlKSksIENMRUFSX1JPVyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydENsZWFySW50ZXJuYWwoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgdGFibGUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShmb3JtYXQoU0VMRUNUX1dJTERDQVJELCBrZXlzcGFjZSwgdGFibGUpKSwgQ0xFQVJfUk9XKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKGZvcm1hdChTRUxFQ1RfQ09MVU1OUywga2V5c3BhY2UsIHRhYmxlKSksIENMRUFSX1JPVyk7CisgICAgfQorCisgICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKKyAgICBwcml2YXRlIGludGVyZmFjZSBUaHJvd2luZ1J1bm5hYmxlCisgICAgeworICAgICAgICB2b2lkIHJ1bigpIHRocm93cyBUaHJvd2FibGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NlbGVjdGlvbkNvbHVtbk1hcHBpbmdUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0aW9uQ29sdW1uTWFwcGluZ1Rlc3QuamF2YQppbmRleCBkNmRlNWZmLi4yMzM5ZjVkIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0aW9uQ29sdW1uTWFwcGluZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0aW9uQ29sdW1uTWFwcGluZ1Rlc3QuamF2YQpAQCAtMjYsNiArMjYsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwpAQCAtNTQsNiArNTUsOCBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkgICAgIC8vIG92ZXJyaWRlcyBDUUxUZXN0ZXIuc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGFydGl0aW9uZXJVbnNhZmUoQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5pbnN0YW5jZSk7CiAKICAgICAgICAgcHJlcGFyZVNlcnZlcigpOwpAQCAtMjI3LDE0ICsyMzAsMTQgQEAKIAogICAgIHByaXZhdGUgdm9pZCB0ZXN0RnVuY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICAvLyBhIGZ1bmN0aW9uIHN1Y2ggYXMgaW50YXNibG9iKDxjb2w+KSBpcyByZXByZXNlbnRlZCBpbiBSZXN1bHRTZXQuTWV0YWRhdGEKKyAgICAgICAgLy8gYSBmdW5jdGlvbiBzdWNoIGFzIGludF9hc19ibG9iKDxjb2w+KSBpcyByZXByZXNlbnRlZCBpbiBSZXN1bHRTZXQuTWV0YWRhdGEKICAgICAgICAgLy8gYnkgYSBDb2x1bW5TcGVjaWZpY2F0aW9uIHdpdGggdGhlIGZ1bmN0aW9uIG5hbWUgcGx1cyBhcmdzIGFuZCB0aGUgdHlwZSBzZXQKICAgICAgICAgLy8gdG8gdGhlIGZ1bmN0aW9uJ3MgcmV0dXJuIHR5cGUKLSAgICAgICAgQ29sdW1uU3BlY2lmaWNhdGlvbiBmblNwZWMgPSBjb2x1bW5TcGVjaWZpY2F0aW9uKCJzeXN0ZW0uaW50YXNibG9iKHYxKSIsIEJ5dGVzVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIENvbHVtblNwZWNpZmljYXRpb24gZm5TcGVjID0gY29sdW1uU3BlY2lmaWNhdGlvbigic3lzdGVtLmludF9hc19ibG9iKHYxKSIsIEJ5dGVzVHlwZS5pbnN0YW5jZSk7CiAgICAgICAgIFNlbGVjdGlvbkNvbHVtbk1hcHBpbmcgZXhwZWN0ZWQgPSBTZWxlY3Rpb25Db2x1bW5NYXBwaW5nLm5ld01hcHBpbmcoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRNYXBwaW5nKGZuU3BlYywgY29sdW1uRGVmaW5pdGlvbigidjEiKSk7CiAKLSAgICAgICAgdmVyaWZ5KGV4cGVjdGVkLCAiU0VMRUNUIGludGFzYmxvYih2MSkgRlJPTSAlcyIpOworICAgICAgICB2ZXJpZnkoZXhwZWN0ZWQsICJTRUxFQ1QgaW50X2FzX2Jsb2IodjEpIEZST00gJXMiKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgdGVzdE5vQXJnRnVuY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCkBAIC0zMjYsNyArMzI5LDcgQEAKICAgICAgICAgU2VsZWN0aW9uQ29sdW1uTWFwcGluZyBleHBlY3RlZCA9IFNlbGVjdGlvbkNvbHVtbk1hcHBpbmcubmV3TWFwcGluZygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE1hcHBpbmcoZm5TcGVjLCBjb2x1bW5EZWZpbml0aW9uKCJ2MSIpKTsKIAotICAgICAgICB2ZXJpZnkoZXhwZWN0ZWQsICJTRUxFQ1QgaW50YXNibG9iKHYxKSBBUyBmbl9hbGlhcyBGUk9NICVzIik7CisgICAgICAgIHZlcmlmeShleHBlY3RlZCwgIlNFTEVDVCBpbnRfYXNfYmxvYih2MSkgQVMgZm5fYWxpYXMgRlJPTSAlcyIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FyZ3VtZW50RnVuY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCkBAIC0zNDEsMTkgKzM0NCwxOSBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRGdW5jdGlvbnNXaXRoQXJndW1lbnRzKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgU2VsZWN0aW9uQ29sdW1ucyBleHBlY3RlZCA9IFNlbGVjdGlvbkNvbHVtbk1hcHBpbmcubmV3TWFwcGluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE1hcHBpbmcoY29sdW1uU3BlY2lmaWNhdGlvbigic3lzdGVtLmJsb2Jhc2ludChzeXN0ZW0uaW50YXNibG9iKHYxKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRNYXBwaW5nKGNvbHVtblNwZWNpZmljYXRpb24oInN5c3RlbS5ibG9iX2FzX2ludChzeXN0ZW0uaW50X2FzX2Jsb2IodjEpKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMlR5cGUuaW5zdGFuY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkRlZmluaXRpb24oInYxIikpOwotICAgICAgICB2ZXJpZnkoZXhwZWN0ZWQsICJTRUxFQ1QgYmxvYmFzaW50KGludGFzYmxvYih2MSkpIEZST00gJXMiKTsKKyAgICAgICAgdmVyaWZ5KGV4cGVjdGVkLCAiU0VMRUNUIGJsb2JfYXNfaW50KGludF9hc19ibG9iKHYxKSkgRlJPTSAlcyIpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRGdW5jdGlvbnMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBTZWxlY3Rpb25Db2x1bW5zIGV4cGVjdGVkID0gU2VsZWN0aW9uQ29sdW1uTWFwcGluZy5uZXdNYXBwaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkTWFwcGluZyhjb2x1bW5TcGVjaWZpY2F0aW9uKCJzeXN0ZW0udG91bml4dGltZXN0YW1wKHN5c3RlbS5ub3coKSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRNYXBwaW5nKGNvbHVtblNwZWNpZmljYXRpb24oInN5c3RlbS50b191bml4X3RpbWVzdGFtcChzeXN0ZW0ubm93KCkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmdUeXBlLmluc3RhbmNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMX0RFRik7Ci0gICAgICAgIHZlcmlmeShleHBlY3RlZCwgIlNFTEVDVCB0b3VuaXh0aW1lc3RhbXAobm93KCkpIEZST00gJXMiKTsKKyAgICAgICAgdmVyaWZ5KGV4cGVjdGVkLCAiU0VMRUNUIHRvX3VuaXhfdGltZXN0YW1wKG5vdygpKSBGUk9NICVzIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUZ1bmN0aW9uc1dpdGhvdXRBbGlhc2VzKCkgdGhyb3dzIFRocm93YWJsZQpAQCAtMzYxLDExICszNjQsMTEgQEAKICAgICAgICAgLy8gd2hlcmUgZHVwbGljYXRlIGZ1bmN0aW9ucyBhcmUgcHJlc2VudCwgdGhlIENvbHVtblNwZWNpZmljYXRpb24gbGlzdCB3aWxsCiAgICAgICAgIC8vIGNvbnRhaW4gYW4gZW50cnkgcGVyLWR1cGxpY2F0ZSBidXQgdGhlIG1hcHBpbmdzIHdpbGwgYmUgZGVkdXBsaWNhdGVkIChpLmUuCiAgICAgICAgIC8vIGEgc2luZ2xlIG1hcHBpbmcgay92IHBhaXIgcmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyIG9mIGR1cGxpY2F0ZXMpCi0gICAgICAgIENvbHVtblNwZWNpZmljYXRpb24gc3BlYyA9IGNvbHVtblNwZWNpZmljYXRpb24oInN5c3RlbS5pbnRhc2Jsb2IodjEpIiwgQnl0ZXNUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgQ29sdW1uU3BlY2lmaWNhdGlvbiBzcGVjID0gY29sdW1uU3BlY2lmaWNhdGlvbigic3lzdGVtLmludF9hc19ibG9iKHYxKSIsIEJ5dGVzVHlwZS5pbnN0YW5jZSk7CiAgICAgICAgIFNlbGVjdGlvbkNvbHVtbnMgZXhwZWN0ZWQgPSBTZWxlY3Rpb25Db2x1bW5NYXBwaW5nLm5ld01hcHBpbmcoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRNYXBwaW5nKHNwZWMsIGNvbHVtbkRlZmluaXRpb24oInYxIikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE1hcHBpbmcoc3BlYywgY29sdW1uRGVmaW5pdGlvbigidjEiKSk7Ci0gICAgICAgIHZlcmlmeShleHBlY3RlZCwgIlNFTEVDVCBpbnRhc2Jsb2IodjEpLCBpbnRhc2Jsb2IodjEpIEZST00gJXMiKTsKKyAgICAgICAgdmVyaWZ5KGV4cGVjdGVkLCAiU0VMRUNUIGludF9hc19ibG9iKHYxKSwgaW50X2FzX2Jsb2IodjEpIEZST00gJXMiKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlRnVuY3Rpb25zV2l0aEFsaWFzZXMoKSB0aHJvd3MgVGhyb3dhYmxlCkBAIC0zNzgsNyArMzgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5EZWZpbml0aW9uKCJ2MSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRNYXBwaW5nKGNvbHVtblNwZWNpZmljYXRpb24oImJsb2JfMiIsIEJ5dGVzVHlwZS5pbnN0YW5jZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uRGVmaW5pdGlvbigidjEiKSk7Ci0gICAgICAgIHZlcmlmeShleHBlY3RlZCwgIlNFTEVDVCBpbnRhc2Jsb2IodjEpIEFTIGJsb2JfMSwgaW50YXNibG9iKHYxKSBBUyBibG9iXzIgRlJPTSAlcyIpOworICAgICAgICB2ZXJpZnkoZXhwZWN0ZWQsICJTRUxFQ1QgaW50X2FzX2Jsb2IodjEpIEFTIGJsb2JfMSwgaW50X2FzX2Jsb2IodjEpIEFTIGJsb2JfMiBGUk9NICVzIik7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdERpc3RpbmN0KCkgdGhyb3dzIFRocm93YWJsZQpAQCAtNTM0LDggKzUzNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQ1JFQVRFIEZVTkNUSU9OICVzIChhIGludCwgYiBpbnQpIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBSRVRVUk5TIGludCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIExBTkdVQUdFIGphdmFzY3JpcHQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBUyAnYSArIGInIikpLm5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgTEFOR1VBR0UgamF2YSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEFTICcgcmV0dXJuIGEgKyBiOyciKSkubmFtZTsKIAogICAgICAgICBTdHJpbmcgYUZ1bmMgPSBjcmVhdGVBZ2dyZWdhdGUoS0VZU1BBQ0UsICJpbnQsIGludCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIENSRUFURSBBR0dSRUdBVEUgJXMgKGludCkiICsKQEAgLTU0NywxNSArNTUwLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBDUkVBVEUgRlVOQ1RJT04gJXMgKGEgaW50KSIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFJFVFVSTlMgaW50IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBMQU5HVUFHRSBqYXZhc2NyaXB0IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBUyAnYSsxJyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgTEFOR1VBR0UgamF2YSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQVMgJyByZXR1cm4gYSArIDE7JyIpOwogCiAgICAgICAgIFN0cmluZyBzcUZ1bmMgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRSwgImludCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIENSRUFURSBGVU5DVElPTiAlcyAoYSBpbnQpIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIFJFVFVSTlMgaW50IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIExBTkdVQUdFIGphdmFzY3JpcHQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgQVMgJ2EqYSciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgTEFOR1VBR0UgamF2YSIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBBUyAnIHJldHVybiBhICogYTsnIik7CiAKICAgICAgICAgQ29sdW1uTWV0YWRhdGEgdjEgPSBjb2x1bW5EZWZpbml0aW9uKCJ2MSIpOwogICAgICAgICBTZWxlY3Rpb25Db2x1bW5zIGV4cGVjdGVkID0gU2VsZWN0aW9uQ29sdW1uTWFwcGluZy5uZXdNYXBwaW5nKCkKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3RvclNlcmlhbGl6YXRpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zZWxlY3Rpb24vU2VsZWN0b3JTZXJpYWxpemF0aW9uVGVzdC5qYXZhCmluZGV4IGVlNGRkMzUuLjUzMGNiNjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3NlbGVjdGlvbi9TZWxlY3RvclNlcmlhbGl6YXRpb25UZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc2VsZWN0aW9uL1NlbGVjdG9yU2VyaWFsaXphdGlvblRlc3QuamF2YQpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKQEAgLTYwLDggKzYxLDEwIEBACiAgICAgICAgIGNoZWNrU2VyaWFsaXphdGlvbih0YWJsZS5nZXRDb2x1bW4obmV3IENvbHVtbklkZW50aWZpZXIoImMxIiwgZmFsc2UpKSwgdGFibGUpOwogCiAgICAgICAgIC8vIFRlc3QgV3JpdGV0aW1lT3JUVExTZWxlY3RvciBzZXJpYWxpemF0aW9uCi0gICAgICAgIGNoZWNrU2VyaWFsaXphdGlvbihuZXcgU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTCh0YWJsZS5nZXRDb2x1bW4obmV3IENvbHVtbklkZW50aWZpZXIoInYiLCBmYWxzZSkpLCB0cnVlKSwgdGFibGUpOwotICAgICAgICBjaGVja1NlcmlhbGl6YXRpb24obmV3IFNlbGVjdGFibGUuV3JpdGV0aW1lT3JUVEwodGFibGUuZ2V0Q29sdW1uKG5ldyBDb2x1bW5JZGVudGlmaWVyKCJ2IiwgZmFsc2UpKSwgZmFsc2UpLCB0YWJsZSk7CisgICAgICAgIENvbHVtbk1ldGFkYXRhIGNvbHVtbiA9IHRhYmxlLmdldENvbHVtbihuZXcgQ29sdW1uSWRlbnRpZmllcigidiIsIGZhbHNlKSk7CisgICAgICAgIGNoZWNrU2VyaWFsaXphdGlvbihuZXcgU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTChjb2x1bW4sIGNvbHVtbiwgU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTC5LaW5kLldSSVRFX1RJTUUpLCB0YWJsZSk7CisgICAgICAgIGNoZWNrU2VyaWFsaXphdGlvbihuZXcgU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTChjb2x1bW4sIGNvbHVtbiwgU2VsZWN0YWJsZS5Xcml0ZXRpbWVPclRUTC5LaW5kLlRUTCksIHRhYmxlKTsKKyAgICAgICAgY2hlY2tTZXJpYWxpemF0aW9uKG5ldyBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMKGNvbHVtbiwgY29sdW1uLCBTZWxlY3RhYmxlLldyaXRldGltZU9yVFRMLktpbmQuTUFYX1dSSVRFX1RJTUUpLCB0YWJsZSk7CiAKICAgICAgICAgLy8gVGVzdCBMaXN0U2VsZWN0b3Igc2VyaWFsaXphdGlvbgogICAgICAgICBjaGVja1NlcmlhbGl6YXRpb24obmV3IFNlbGVjdGFibGUuV2l0aExpc3QoYXNMaXN0KHRhYmxlLmdldENvbHVtbihuZXcgQ29sdW1uSWRlbnRpZmllcigidiIsIGZhbHNlKSksCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL0Rlc2NyaWJlU3RhdGVtZW50VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvc3RhdGVtZW50cy9EZXNjcmliZVN0YXRlbWVudFRlc3QuamF2YQppbmRleCA1MmJiM2MzLi40MjJmY2Q0IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy9zdGF0ZW1lbnRzL0Rlc2NyaWJlU3RhdGVtZW50VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3N0YXRlbWVudHMvRGVzY3JpYmVTdGF0ZW1lbnRUZXN0LmphdmEKQEAgLTM5LDEyICszOSwxNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuVG9rZW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50cy4qOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIApAQCAtNzkwLDYgKzc5Miw1NiBAQAogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlc2NyaWJlVGFibGVXaXRoQ29sdW1uTWFza3MoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICByZXF1aXJlTmV0d29yaygpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RHluYW1pY0RhdGFNYXNraW5nRW5hYmxlZCh0cnVlKTsKKworICAgICAgICBTdHJpbmcgdGFibGUgPSBjcmVhdGVUYWJsZShLRVlTUEFDRV9QRVJfVEVTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBUQUJMRSAlcyAoIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHBrMSB0ZXh0LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcGsyIGludCBNQVNLRUQgV0lUSCBERUZBVUxULCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgY2sxIGludCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIGNrMiBpbnQgTUFTS0VEIFdJVEggbWFza19kZWZhdWx0KCksIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHMxIGRlY2ltYWwgc3RhdGljLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgczIgZGVjaW1hbCBzdGF0aWMgTUFTS0VEIFdJVEggbWFza19udWxsKCksICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB2MSB0ZXh0LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgdjIgdGV4dCBNQVNLRUQgV0lUSCBtYXNrX2lubmVyKDEsIG51bGwpLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBSSU1BUlkgS0VZICgocGsxLCBwazIpLCBjazEsIGNrMiApKSIpOworCisgICAgICAgIFRhYmxlTWV0YWRhdGEgdGFibGVNZXRhZGF0YSA9IFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZU1ldGFkYXRhKEtFWVNQQUNFX1BFUl9URVNULCB0YWJsZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwodGFibGVNZXRhZGF0YSk7CisKKyAgICAgICAgU3RyaW5nIHRhYmxlQ3JlYXRlU3RhdGVtZW50ID0gIkNSRUFURSBUQUJMRSAiICsgS0VZU1BBQ0VfUEVSX1RFU1QgKyAiLiIgKyB0YWJsZSArICIgKFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgcGsxIHRleHQsXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBwazIgaW50IE1BU0tFRCBXSVRIIHN5c3RlbS5tYXNrX2RlZmF1bHQoKSxcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGNrMSBpbnQsXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBjazIgaW50IE1BU0tFRCBXSVRIIHN5c3RlbS5tYXNrX2RlZmF1bHQoKSxcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHMxIGRlY2ltYWwgc3RhdGljLFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgczIgZGVjaW1hbCBzdGF0aWMgTUFTS0VEIFdJVEggc3lzdGVtLm1hc2tfbnVsbCgpLFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgdjEgdGV4dCxcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHYyIHRleHQgTUFTS0VEIFdJVEggc3lzdGVtLm1hc2tfaW5uZXIoMSwgbnVsbCksXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBQUklNQVJZIEtFWSAoKHBrMSwgcGsyKSwgY2sxLCBjazIpXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIikgV0lUSCBJRCA9ICIgKyB0YWJsZU1ldGFkYXRhLmlkICsgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgQU5EIENMVVNURVJJTkcgT1JERVIgQlkgKGNrMSBBU0MsIGNrMiBBU0MpXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgIiArIHRhYmxlUGFyYW1ldGVyc0NxbCgpOworCisgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZURlc2NyaWJlTmV0KCJERVNDUklCRSBUQUJMRSAiICsgS0VZU1BBQ0VfUEVSX1RFU1QgKyAiLiIgKyB0YWJsZSArICIgV0lUSCBJTlRFUk5BTFMiKSwKKyAgICAgICAgICAgICAgICAgICAgICByb3coS0VZU1BBQ0VfUEVSX1RFU1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNyZWF0ZVN0YXRlbWVudCkpOworCisgICAgICAgIC8vIG1hc2tzIHNob3VsZCBiZSBsaXN0ZWQgZXZlbiBpZiBERE0gaXMgZGlzYWJsZWQKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldER5bmFtaWNEYXRhTWFza2luZ0VuYWJsZWQoZmFsc2UpOworICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVEZXNjcmliZU5ldCgiREVTQ1JJQkUgVEFCTEUgIiArIEtFWVNQQUNFX1BFUl9URVNUICsgIi4iICsgdGFibGUgKyAiIFdJVEggSU5URVJOQUxTIiksCisgICAgICAgICAgICAgICAgICAgICAgcm93KEtFWVNQQUNFX1BFUl9URVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAidGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDcmVhdGVTdGF0ZW1lbnQpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RVc2luZ1Jlc2VydmVkSW5DcmVhdGVUeXBlKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgU3RyaW5nIHR5cGUgPSBjcmVhdGVUeXBlKEtFWVNQQUNFX1BFUl9URVNULCAiQ1JFQVRFIFRZUEUgJXMgKFwidG9rZW5cIiB0ZXh0LCBcImRlc2NcIiB0ZXh0KTsiKTsKQEAgLTk2OSw2ICsxMDIxLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGFibGVQYXJhbWV0ZXJzQ3FsKCkKICAgICB7CiAgICAgICAgIHJldHVybiAiYWRkaXRpb25hbF93cml0ZV9wb2xpY3kgPSAnOTlwJ1xuIiArCisgICAgICAgICAgICAgICAiICAgIEFORCBhbGxvd19hdXRvX3NuYXBzaG90ID0gdHJ1ZVxuIiArCiAgICAgICAgICAgICAgICAiICAgIEFORCBibG9vbV9maWx0ZXJfZnBfY2hhbmNlID0gMC4wMVxuIiArCiAgICAgICAgICAgICAgICAiICAgIEFORCBjYWNoaW5nID0geydrZXlzJzogJ0FMTCcsICdyb3dzX3Blcl9wYXJ0aXRpb24nOiAnTk9ORSd9XG4iICsKICAgICAgICAgICAgICAgICIgICAgQU5EIGNkYyA9IGZhbHNlXG4iICsKQEAgLTk4MCw2ICsxMDMzLDcgQEAKICAgICAgICAgICAgICAgICIgICAgQU5EIGRlZmF1bHRfdGltZV90b19saXZlID0gMFxuIiArCiAgICAgICAgICAgICAgICAiICAgIEFORCBleHRlbnNpb25zID0ge31cbiIgKwogICAgICAgICAgICAgICAgIiAgICBBTkQgZ2NfZ3JhY2Vfc2Vjb25kcyA9IDg2NDAwMFxuIiArCisgICAgICAgICAgICAgICAiICAgIEFORCBpbmNyZW1lbnRhbF9iYWNrdXBzID0gdHJ1ZVxuIiArIAogICAgICAgICAgICAgICAgIiAgICBBTkQgbWF4X2luZGV4X2ludGVydmFsID0gMjA0OFxuIiArCiAgICAgICAgICAgICAgICAiICAgIEFORCBtZW10YWJsZV9mbHVzaF9wZXJpb2RfaW5fbXMgPSAwXG4iICsKICAgICAgICAgICAgICAgICIgICAgQU5EIG1pbl9pbmRleF9pbnRlcnZhbCA9IDEyOFxuIiArCkBAIC05OTAsNiArMTA0NCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG12UGFyYW1ldGVyc0NxbCgpCiAgICAgewogICAgICAgICByZXR1cm4gImFkZGl0aW9uYWxfd3JpdGVfcG9saWN5ID0gJzk5cCdcbiIgKworICAgICAgICAgICAgICAgIiAgICBBTkQgYWxsb3dfYXV0b19zbmFwc2hvdCA9IHRydWVcbiIgKwogICAgICAgICAgICAgICAgIiAgICBBTkQgYmxvb21fZmlsdGVyX2ZwX2NoYW5jZSA9IDAuMDFcbiIgKwogICAgICAgICAgICAgICAgIiAgICBBTkQgY2FjaGluZyA9IHsna2V5cyc6ICdBTEwnLCAncm93c19wZXJfcGFydGl0aW9uJzogJ05PTkUnfVxuIiArCiAgICAgICAgICAgICAgICAiICAgIEFORCBjZGMgPSBmYWxzZVxuIiArCkBAIC0xMDAwLDYgKzEwNTUsNyBAQAogICAgICAgICAgICAgICAgIiAgICBBTkQgY3JjX2NoZWNrX2NoYW5jZSA9IDEuMFxuIiArCiAgICAgICAgICAgICAgICAiICAgIEFORCBleHRlbnNpb25zID0ge31cbiIgKwogICAgICAgICAgICAgICAgIiAgICBBTkQgZ2NfZ3JhY2Vfc2Vjb25kcyA9IDg2NDAwMFxuIiArCisgICAgICAgICAgICAgICAiICAgIEFORCBpbmNyZW1lbnRhbF9iYWNrdXBzID0gdHJ1ZVxuIiArCiAgICAgICAgICAgICAgICAiICAgIEFORCBtYXhfaW5kZXhfaW50ZXJ2YWwgPSAyMDQ4XG4iICsKICAgICAgICAgICAgICAgICIgICAgQU5EIG1lbXRhYmxlX2ZsdXNoX3BlcmlvZF9pbl9tcyA9IDBcbiIgKwogICAgICAgICAgICAgICAgIiAgICBBTkQgbWluX2luZGV4X2ludGVydmFsID0gMTI4XG4iICsKQEAgLTEwNDQsOSArMTEwMCw0IEBACiAgICAgICAgICAgICBleGVjdXRlTmV0KHYsICJVU0UgIiArIHVzZUtzKTsKICAgICAgICAgcmV0dXJuIHY7CiAgICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0W11bXSByb3dzKE9iamVjdFtdLi4uIHJvd3MpCi0gICAgewotICAgICAgICByZXR1cm4gcm93czsKLSAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL0NvbGxlY3Rpb25zVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9Db2xsZWN0aW9uc1Rlc3QuamF2YQppbmRleCBmZWRiNGU1Li5lNmVmMTYzIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL0NvbGxlY3Rpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvQ29sbGVjdGlvbnNUZXN0LmphdmEKQEAgLTU3NywxOCArNTc3LDYgQEAKICAgICAgICAgZXhlY3V0ZSgiQUxURVIgVEFCTEUgJXMgQUREIGFsaXN0IGxpc3Q8dGV4dD4iKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBNaWdyYXRlZCBmcm9tIGNxbF90ZXN0cy5weTpUZXN0Q1FMLmNvbGxlY3Rpb25fZnVuY3Rpb25fdGVzdCgpCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RnVuY3Rpb25zT25Db2xsZWN0aW9ucygpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCBsIHNldDxpbnQ+KSIpOwotCi0gICAgICAgIGFzc2VydEludmFsaWQoIlNFTEVDVCB0dGwobCkgRlJPTSAlcyBXSEVSRSBrID0gMCIpOwotICAgICAgICBhc3NlcnRJbnZhbGlkKCJTRUxFQ1Qgd3JpdGV0aW1lKGwpIEZST00gJXMgV0hFUkUgayA9IDAiKTsKLSAgICB9Ci0KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RJblJlc3RyaWN0aW9uV2l0aENvbGxlY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9Gcm96ZW5Db2xsZWN0aW9uc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvRnJvemVuQ29sbGVjdGlvbnNUZXN0LmphdmEKaW5kZXggNWNiZmI0Yy4uYzRjZGNhMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9Gcm96ZW5Db2xsZWN0aW9uc1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL0Zyb3plbkNvbGxlY3Rpb25zVGVzdC5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMucmVzdHJpY3Rpb25zLlN0YXRlbWVudFJlc3RyaWN0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CkBAIC00Myw2ICs0NCw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKSAgICAgLy8gb3ZlcnJpZGVzIENRTFRlc3Rlci5zZXRVcENsYXNzKCkKICAgICB7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICAvLyBTZWxlY3RpbmcgcGFydGl0aW9uZXIgZm9yIGEgdGFibGUgaXMgbm90IGV4cG9zZWQgb24gQ1JFQVRFIFRBQkxFLgogICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5zZXRQYXJ0aXRpb25lclVuc2FmZShCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9Kc29uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9Kc29uVGVzdC5qYXZhCmluZGV4IDgxMGVlNWEuLmY5N2I0ZmEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvSnNvblRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL0pzb25UZXN0LmphdmEKQEAgLTE3LDggKzE3LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnZhbGlkYXRpb24uZW50aXRpZXM7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkpzb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5EdXJhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVGltZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiAKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKQEAgLTQ2LDEwICs0NywxMSBAQAogCiBwdWJsaWMgY2xhc3MgSnNvblRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKIHsKLSAgICAvLyBUaGlzIG1ldGhvZCB3aWxsIGJlIHJhbiBpbnN0ZWFkIG9mIHRoZSBDUUxUZXN0ZXIjc2V0VXBDbGFzcworICAgIC8vIFRoaXMgbWV0aG9kIHdpbGwgYmUgcnVuIGluc3RlYWQgb2YgdGhlIENRTFRlc3RlciNzZXRVcENsYXNzCiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKQogICAgIHsKKyAgICAgICAgU2VydmVyVGVzdFV0aWxzLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgICAgIGlmIChST1dfQ0FDSEVfU0laRV9JTl9NSUIgPiAwKQogICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFJvd0NhY2hlU2l6ZUluTWlCKFJPV19DQUNIRV9TSVpFX0lOX01JQik7CiAKQEAgLTgwLDggKzgyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wiazFcIjogW1wiIiArIHV1aWQgKyAiXCIsIDJdLCBcImMxXCI6IFtcIiIgKyB1dWlkICsgIlwiLCAzXSwgXCJ2YWx1ZVwiOiAzfSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrMVwiOiBbXCIiICsgdXVpZCArICJcIiwgMl0sIFwiYzFcIjogW1wiIiArIHV1aWQgKyAiXCIsIDRdLCBcInZhbHVlXCI6IDR9IikpOwogCi0gICAgICAgICAgICAvLyBTRUxFQ1QgdG9Kc29uKGNvbHVtbikKLSAgICAgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldFdpdGhQYWdpbmcoIlNFTEVDVCB0b0pzb24oazEpLCB0b0pzb24oYzEpLCB0b0pzb24odmFsdWUpIEZST00gJXMiLCBwYWdlU2l6ZSksCisgICAgICAgICAgICAvLyBTRUxFQ1QgdG9fanNvbihjb2x1bW4pCisgICAgICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRoUGFnaW5nKCJTRUxFQ1QgdG9fanNvbihrMSksIHRvX2pzb24oYzEpLCB0b19qc29uKHZhbHVlKSBGUk9NICVzIiwgcGFnZVNpemUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIltcIiIgKyB1dWlkICsgIlwiLCAyXSIsICJbXCIiICsgdXVpZCArICJcIiwgMV0iLCAiMSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIltcIiIgKyB1dWlkICsgIlwiLCAyXSIsICJbXCIiICsgdXVpZCArICJcIiwgMl0iLCAiMiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIltcIiIgKyB1dWlkICsgIlwiLCAyXSIsICJbXCIiICsgdXVpZCArICJcIiwgM10iLCAiMyIpLApAQCAtMTEwLDggKzExMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wiazFcIjoge1wiMVwiOiBbXCIiICsgdXVpZCArICJcIiwgMV0sIFwiMlwiOiBbXCIiICsgdXVpZCArICJcIiwgMl19LCBcImMxXCI6IFtcIiIgKyB1dWlkICsgIlwiLCAzXSwgXCJ2YWx1ZVwiOiAzfSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIntcImsxXCI6IHtcIjFcIjogW1wiIiArIHV1aWQgKyAiXCIsIDFdLCBcIjJcIjogW1wiIiArIHV1aWQgKyAiXCIsIDJdfSwgXCJjMVwiOiBbXCIiICsgdXVpZCArICJcIiwgNF0sIFwidmFsdWVcIjogNH0iKSk7CiAKLSAgICAgICAgICAgIC8vIFNFTEVDVCB0b0pzb24oY29sdW1uKQotICAgICAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0V2l0aFBhZ2luZygiU0VMRUNUIHRvSnNvbihrMSksIHRvSnNvbihjMSksIHRvSnNvbih2YWx1ZSkgRlJPTSAlcyIsIHBhZ2VTaXplKSwKKyAgICAgICAgICAgIC8vIFNFTEVDVCB0b19qc29uKGNvbHVtbikKKyAgICAgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldFdpdGhQYWdpbmcoIlNFTEVDVCB0b19qc29uKGsxKSwgdG9fanNvbihjMSksIHRvX2pzb24odmFsdWUpIEZST00gJXMiLCBwYWdlU2l6ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wiMVwiOiBbXCIiICsgdXVpZCArICJcIiwgMV0sIFwiMlwiOiBbXCIiICsgdXVpZCArICJcIiwgMl19IiwgIltcIiIgKyB1dWlkICsgIlwiLCAxXSIsICIxIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wiMVwiOiBbXCIiICsgdXVpZCArICJcIiwgMV0sIFwiMlwiOiBbXCIiICsgdXVpZCArICJcIiwgMl19IiwgIltcIiIgKyB1dWlkICsgIlwiLCAyXSIsICIyIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wiMVwiOiBbXCIiICsgdXVpZCArICJcIiwgMV0sIFwiMlwiOiBbXCIiICsgdXVpZCArICJcIiwgMl19IiwgIltcIiIgKyB1dWlkICsgIlwiLCAzXSIsICIzIiksCkBAIC0xNDAsOCArMTQyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrMVwiOiBbW1sxLCAyXSwgMV0sIFtbMiwgM10sIDJdXSwgXCJjMVwiOiBbXCIiICsgdXVpZCArICJcIiwgM10sIFwidmFsdWVcIjogM30iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrMVwiOiBbW1sxLCAyXSwgMV0sIFtbMiwgM10sIDJdXSwgXCJjMVwiOiBbXCIiICsgdXVpZCArICJcIiwgNF0sIFwidmFsdWVcIjogNH0iKSk7CiAKLSAgICAgICAgICAgIC8vIFNFTEVDVCB0b0pzb24oY29sdW1uKQotICAgICAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0V2l0aFBhZ2luZygiU0VMRUNUIHRvSnNvbihrMSksIHRvSnNvbihjMSksIHRvSnNvbih2YWx1ZSkgRlJPTSAlcyIsIHBhZ2VTaXplKSwKKyAgICAgICAgICAgIC8vIFNFTEVDVCB0b19qc29uKGNvbHVtbikKKyAgICAgICAgICAgIGFzc2VydFJvd3NOZXQoZXhlY3V0ZU5ldFdpdGhQYWdpbmcoIlNFTEVDVCB0b19qc29uKGsxKSwgdG9fanNvbihjMSksIHRvX2pzb24odmFsdWUpIEZST00gJXMiLCBwYWdlU2l6ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygiW1tbMSwgMl0sIDFdLCBbWzIsIDNdLCAyXV0iLCAiW1wiIiArIHV1aWQgKyAiXCIsIDFdIiwgIjEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KCJbW1sxLCAyXSwgMV0sIFtbMiwgM10sIDJdXSIsICJbXCIiICsgdXVpZCArICJcIiwgMl0iLCAiMiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIltbWzEsIDJdLCAxXSwgW1syLCAzXSwgMl1dIiwgIltcIiIgKyB1dWlkICsgIlwiLCAzXSIsICIzIiksCkBAIC0xNzAsOCArMTcyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICByb3coIntcImsxXCI6IFtbXCIiICsgdXVpZCArICJcIiwgMl0sIFtcIiIgKyB1dWlkICsgIlwiLCAzXV0sIFwiYzFcIjogW1wiIiArIHV1aWQgKyAiXCIsIDNdLCBcInZhbHVlXCI6IDN9IiksCiAgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrMVwiOiBbW1wiIiArIHV1aWQgKyAiXCIsIDJdLCBbXCIiICsgdXVpZCArICJcIiwgM11dLCBcImMxXCI6IFtcIiIgKyB1dWlkICsgIlwiLCA0XSwgXCJ2YWx1ZVwiOiA0fSIpKTsKIAotICAgICAgICAvLyBTRUxFQ1QgdG9Kc29uKGNvbHVtbikKLSAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0V2l0aFBhZ2luZygiU0VMRUNUIHRvSnNvbihrMSksIHRvSnNvbihjMSksIHRvSnNvbih2YWx1ZSkgRlJPTSAlcyIsIHBhZ2VTaXplKSwKKyAgICAgICAgLy8gU0VMRUNUIHRvX2pzb24oY29sdW1uKQorICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRoUGFnaW5nKCJTRUxFQ1QgdG9fanNvbihrMSksIHRvX2pzb24oYzEpLCB0b19qc29uKHZhbHVlKSBGUk9NICVzIiwgcGFnZVNpemUpLAogICAgICAgICAgICAgICAgICAgICAgIHJvdygiW1tcIiIgKyB1dWlkICsgIlwiLCAyXSwgW1wiIiArIHV1aWQgKyAiXCIsIDNdXSIsICJbXCIiICsgdXVpZCArICJcIiwgMV0iLCAiMSIpLAogICAgICAgICAgICAgICAgICAgICAgIHJvdygiW1tcIiIgKyB1dWlkICsgIlwiLCAyXSwgW1wiIiArIHV1aWQgKyAiXCIsIDNdXSIsICJbXCIiICsgdXVpZCArICJcIiwgMl0iLCAiMiIpLAogICAgICAgICAgICAgICAgICAgICAgIHJvdygiW1tcIiIgKyB1dWlkICsgIlwiLCAyXSwgW1wiIiArIHV1aWQgKyAiXCIsIDNdXSIsICJbXCIiICsgdXVpZCArICJcIiwgM10iLCAiMyIpLApAQCAtMjAyLDggKzIwNCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wiazFcIjoge1wiYVwiOiAxLCBcImJcIjogMiwgXCJjXCI6IFtcIjFcIiwgXCIyXCJdfSwgXCJjMVwiOiBbXCIiICsgdXVpZCArICJcIiwgM10sIFwidmFsdWVcIjogM30iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJrMVwiOiB7XCJhXCI6IDEsIFwiYlwiOiAyLCBcImNcIjogW1wiMVwiLCBcIjJcIl19LCBcImMxXCI6IFtcIiIgKyB1dWlkICsgIlwiLCA0XSwgXCJ2YWx1ZVwiOiA0fSIpKTsKIAotICAgICAgICAgICAgLy8gU0VMRUNUIHRvSnNvbihjb2x1bW4pCi0gICAgICAgICAgICBhc3NlcnRSb3dzTmV0KGV4ZWN1dGVOZXRXaXRoUGFnaW5nKCJTRUxFQ1QgdG9Kc29uKGsxKSwgdG9Kc29uKGMxKSwgdG9Kc29uKHZhbHVlKSBGUk9NICVzIiwgcGFnZVNpemUpLAorICAgICAgICAgICAgLy8gU0VMRUNUIHRvX2pzb24oY29sdW1uKQorICAgICAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0V2l0aFBhZ2luZygiU0VMRUNUIHRvX2pzb24oazEpLCB0b19qc29uKGMxKSwgdG9fanNvbih2YWx1ZSkgRlJPTSAlcyIsIHBhZ2VTaXplKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KCJ7XCJhXCI6IDEsIFwiYlwiOiAyLCBcImNcIjogW1wiMVwiLCBcIjJcIl19IiwgIltcIiIgKyB1dWlkICsgIlwiLCAxXSIsICIxIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygie1wiYVwiOiAxLCBcImJcIjogMiwgXCJjXCI6IFtcIjFcIiwgXCIyXCJdfSIsICJbXCIiICsgdXVpZCArICJcIiwgMl0iLCAiMiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIntcImFcIjogMSwgXCJiXCI6IDIsIFwiY1wiOiBbXCIxXCIsIFwiMlwiXX0iLCAiW1wiIiArIHV1aWQgKyAiXCIsIDNdIiwgIjMiKSwKQEAgLTI0Niw0NjggKzI0OCw0NjggQEAKICAgICAgICAgICAgICAgICAidWR0dmFsIGZyb3plbjwiICsgdHlwZU5hbWUgKyAiPiwiICsKICAgICAgICAgICAgICAgICAiZHVyYXRpb252YWwgZHVyYXRpb24pIik7CiAKLSAgICAgICAgLy8gZnJvbUpzb24oKSBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIHJlY2VpdmVyIHR5cGUgaXMga25vd24KLSAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoImZyb21Kc29uKCkgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2UiLCAiU0VMRUNUIGZyb21Kc29uKGFzY2lpdmFsKSBGUk9NICVzIiwgMCwgMCk7CisgICAgICAgIC8vIGZyb21fanNvbigpIGNhbiBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgcmVjZWl2ZXIgdHlwZSBpcyBrbm93bgorICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiZnJvbV9qc29uKCkgY2Fubm90IGJlIHVzZWQgaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2UiLCAiU0VMRUNUIGZyb21fanNvbih0ZXh0dmFsKSBGUk9NICVzIiwgMCwgMCk7CiAKICAgICAgICAgU3RyaW5nIGZ1bmMxID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0UsICJpbnQiLCAiQ1JFQVRFIEZVTkNUSU9OICVzIChhIGludCkgQ0FMTEVEIE9OIE5VTEwgSU5QVVQgUkVUVVJOUyB0ZXh0IExBTkdVQUdFIGphdmEgQVMgJCQgcmV0dXJuIGEudG9TdHJpbmcoKTsgJCQiKTsKICAgICAgICAgY3JlYXRlRnVuY3Rpb25PdmVybG9hZChmdW5jMSwgImludCIsICJDUkVBVEUgRlVOQ1RJT04gJXMgKGEgdGV4dCkgQ0FMTEVEIE9OIE5VTEwgSU5QVVQgUkVUVVJOUyB0ZXh0IExBTkdVQUdFIGphdmEgQVMgJCQgcmV0dXJuIG5ldyBTdHJpbmcoYSk7ICQkIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkFtYmlndW91cyBjYWxsIHRvIGZ1bmN0aW9uIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgIiArIGZ1bmMxICsgIihmcm9tSnNvbig/KSkpIiwgMCwgIjEyMyIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdGV4dHZhbCkgVkFMVUVTICg/LCAiICsgZnVuYzEgKyAiKGZyb21fanNvbig/KSkpIiwgMCwgIjEyMyIpOwogCiAgICAgICAgIC8vIGZhaWxzIEpTT04gcGFyc2luZwogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiQ291bGQgbm90IGRlY29kZSBKU09OIHN0cmluZyAnXHUwMzhFXHUwMzk0XHUwM0I0XHUwM0UwJyIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXHUwMzhFXHUwMzk0XHUwM0I0XHUwM0UwIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlx1MDM4RVx1MDM5NFx1MDNCNFx1MDNFMCIpOwogCiAgICAgICAgIC8vIGhhbmRsZSBudWxscwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgbnVsbCk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgbnVsbCk7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGFzY2lpdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG51bGwpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsIG51bGwpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubWFwdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCBudWxsKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZnJvemVubWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG51bGwpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsIG51bGwpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCBudWxsKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdWR0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG51bGwpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGFzY2lpID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGFzY2lpdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcImFzY2lpIHRleHRcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcImFzY2lpIHRleHRcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiYXNjaWkgdGV4dCIpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiYXNjaWkgXFxcIiB0ZXh0XCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGFzY2lpdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJhc2NpaSBcXFwiIHRleHRcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBhc2NpaXZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiYXNjaWkgXCIgdGV4dCIpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCBBU0NJSSBjaGFyYWN0ZXIgaW4gc3RyaW5nIGxpdGVyYWwiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiXFx1MWZmZlxcdTIwMTNcXHUzM0I0XFx1MjAxNFwiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiXFx1MWZmZlxcdTIwMTNcXHUzM0I0XFx1MjAxNFwiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGFuIGFzY2lpIHN0cmluZywgYnV0IGdvdCBhIEludGVnZXIiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMyIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMiKTsKIAotICAgICAgICAvLyB0ZXN0IHRoYXQgd2UgY2FuIHVzZSBmcm9tSnNvbigpIGluIG90aGVyIHZhbGlkIHBsYWNlcyBpbiBxdWVyaWVzCi0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGFzY2lpdmFsIEZST00gJXMgV0hFUkUgayA9IGZyb21Kc29uKD8pIiwgIjAiKSwgcm93KCJhc2NpaSBcIiB0ZXh0IikpOwotICAgICAgICBleGVjdXRlKCJVUERBVEUgJXMgU0VUIGFzY2lpdmFsID0gZnJvbUpzb24oPykgV0hFUkUgayA9IGZyb21Kc29uKD8pIiwgIlwiYXNjaWkgXFxcIiB0ZXh0XCIiLCAiMCIpOwotICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gZnJvbUpzb24oPykiLCAiMCIpOworICAgICAgICAvLyB0ZXN0IHRoYXQgd2UgY2FuIHVzZSBmcm9tX2pzb24oKSBpbiBvdGhlciB2YWxpZCBwbGFjZXMgaW4gcXVlcmllcworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBhc2NpaXZhbCBGUk9NICVzIFdIRVJFIGsgPSBmcm9tX2pzb24oPykiLCAiMCIpLCByb3coImFzY2lpIFwiIHRleHQiKSk7CisgICAgICAgIGV4ZWN1dGUoIlVQREFURSAlcyBTRVQgYXNjaWl2YWwgPSBmcm9tX2pzb24oPykgV0hFUkUgayA9IGZyb21fanNvbig/KSIsICJcImFzY2lpIFxcXCIgdGV4dFwiIiwgIjAiKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IGZyb21fanNvbig/KSIsICIwIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBiaWdpbnQgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYmlnaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMxMjMxMjMxMjMiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJpZ2ludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMzEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBiaWdpbnR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgMTIzMTIzMTIzMTIzTCkpOwogCiAgICAgICAgIC8vIHN0cmluZ3MgYXJlIGFsc28gYWNjZXB0ZWQKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJpZ2ludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIxMjMxMjMxMjMxMjNcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYmlnaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIxMjMxMjMxMjMxMjNcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBiaWdpbnR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgMTIzMTIzMTIzMTIzTCkpOwogCiAgICAgICAgIC8vIG92ZXJmbG93IChMb25nLk1BWF9WQUxVRSArIDEpCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJFeHBlY3RlZCBhIGJpZ2ludCB2YWx1ZSwgYnV0IGdvdCBhIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGJpZ2ludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiOTIyMzM3MjAzNjg1NDc3NTgwOCIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYmlnaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiOTIyMzM3MjAzNjg1NDc3NTgwOCIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJFeHBlY3RlZCBhIGJpZ2ludCB2YWx1ZSwgYnV0IGdvdCBhIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGJpZ2ludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzLjQ1NiIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYmlnaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzLjQ1NiIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJVbmFibGUgdG8gbWFrZSBsb25nIGZyb20iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYmlnaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcImFiY1wiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBiaWdpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcImFiY1wiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgYmlnaW50IHZhbHVlLCBidXQgZ290IGEiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYmlnaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbXCJhYmNcIl0iKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGJpZ2ludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltcImFiY1wiXSIpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gYmxvYiA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjB4MDAwMDAwMDFcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYmxvYnZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMHgwMDAwMDAwMVwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGJsb2J2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoMSkpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVmFsdWUgJ3h5enonIGlzIG5vdCBhIHZhbGlkIGJsb2IgcmVwcmVzZW50YXRpb24iLAotICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcInh5enpcIiIpOworICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJ4eXp6XCIiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGJsb2IgaXMgbWlzc2luZyAweCBwcmVmaXg6IDEyMyIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjEyM1wiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIxMjNcIiIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJWYWx1ZSAnMHgxMjMnIGlzIG5vdCBhIHZhbGlkIGJsb2IgcmVwcmVzZW50YXRpb24iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYmxvYnZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIweDEyM1wiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIweDEyM1wiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlZhbHVlICcxMjMnIGlzIG5vdCBhIHZhbGlkIGJsb2IgcmVwcmVzZW50YXRpb24iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYmxvYnZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBibG9idmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBib29sZWFuID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJvb2xlYW52YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgInRydWUiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJvb2xlYW52YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ0cnVlIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGJvb2xlYW52YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgdHJ1ZSkpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBib29sZWFudmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJmYWxzZSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYm9vbGVhbnZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgImZhbHNlIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGJvb2xlYW52YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgZmFsc2UpKTsKIAogICAgICAgICAvLyBzdHJpbmdzIGFyZSBhbHNvIGFjY2VwdGVkCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBib29sZWFudmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcImZhbHNlXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJvb2xlYW52YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcImZhbHNlXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYm9vbGVhbnZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBmYWxzZSkpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJVbmFibGUgdG8gbWFrZSBib29sZWFuIGZyb20iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYm9vbGVhbnZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJhYmNcIiIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYm9vbGVhbnZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiYWJjXCIiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRXhwZWN0ZWQgYSBib29sZWFuIHZhbHVlLCBidXQgZ290IGEgSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBib29sZWFudmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGJvb2xlYW52YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMiKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGRhdGUgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZGF0ZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIxOTg3LTAzLTIzXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGRhdGV2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjE5ODctMDMtMjNcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBkYXRldmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIFNpbXBsZURhdGVTZXJpYWxpemVyLmRhdGVTdHJpbmdUb0RheXMoIjE5ODctMDMtMjMiKSkpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJFeHBlY3RlZCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIGRhdGUiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgZGF0ZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBkYXRldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBjb2VyY2UgJ3h5eicgdG8gYSBmb3JtYXR0ZWQgZGF0ZSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBkYXRldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcInh5elwiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBkYXRldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJ4eXpcIiIpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gZGVjaW1hbCA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkZWNpbWFsdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMxMjMuMTIzMTIzIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkZWNpbWFsdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzLjEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBkZWNpbWFsdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG5ldyBCaWdEZWNpbWFsKCIxMjMxMjMuMTIzMTIzIikpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkZWNpbWFsdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGRlY2ltYWx2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbmV3IEJpZ0RlY2ltYWwoIjEyMzEyMyIpKSk7CiAKICAgICAgICAgLy8gYWNjZXB0IHN0cmluZ3MgZm9yIG51bWJlcnMgdGhhdCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgZG91YmxlcwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIxMjMxMjMuMTIzMTIzXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGRlY2ltYWx2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjEyMzEyMy4xMjMxMjNcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBkZWNpbWFsdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG5ldyBCaWdEZWNpbWFsKCIxMjMxMjMuMTIzMTIzIikpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCItMS4yM0UtMTJcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiLTEuMjNFLTEyXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZGVjaW1hbHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBuZXcgQmlnRGVjaW1hbCgiLTEuMjNFLTEyIikpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVmFsdWUgJ3h5enonIGlzIG5vdCBhIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIGEgZGVjaW1hbCB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBkZWNpbWFsdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcInh5enpcIiIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwieHl6elwiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlZhbHVlICd0cnVlJyBpcyBub3QgYSB2YWxpZCByZXByZXNlbnRhdGlvbiBvZiBhIGRlY2ltYWwgdmFsdWUiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAidHJ1ZSIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgInRydWUiKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGRvdWJsZSA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkb3VibGV2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMzEyMy4xMjMxMjMiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMy4xMjMxMjMiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZG91YmxldmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIDEyMzEyMy4xMjMxMjNkKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkb3VibGV2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMxMjMiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZG91YmxldmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIDEyMzEyMy4wZCkpOwogCiAgICAgICAgIC8vIHN0cmluZ3MgYXJlIGFsc28gYWNjZXB0ZWQKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIxMjMxMjNcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZG91YmxldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIxMjMxMjNcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBkb3VibGV2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgMTIzMTIzLjBkKSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBtYWtlIGRvdWJsZSBmcm9tIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJ4eXp6XCIiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwieHl6elwiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgZG91YmxlIHZhbHVlLCBidXQgZ290IiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGRvdWJsZXZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAidHJ1ZSIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgZG91YmxldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAidHJ1ZSIpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gZmxvYXQgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZmxvYXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMzEyMy4xMjMxMjMiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGZsb2F0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzLjEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmbG9hdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAxMjMxMjMuMTIzMTIzZikpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmbG9hdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzMTIzIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmbG9hdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmbG9hdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAxMjMxMjMuMGYpKTsKIAogICAgICAgICAvLyBzdHJpbmdzIGFyZSBhbHNvIGFjY2VwdGVkCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmbG9hdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIxMjMxMjMuMFwiIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmbG9hdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMTIzMTIzLjBcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmbG9hdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAxMjMxMjMuMGYpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIG1ha2UgZmxvYXQgZnJvbSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBmbG9hdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJ4eXp6XCIiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGZsb2F0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJ4eXp6XCIiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRXhwZWN0ZWQgYSBmbG9hdCB2YWx1ZSwgYnV0IGdvdCBhIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGZsb2F0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ0cnVlIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBmbG9hdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgInRydWUiKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGluZXQgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgaW5ldHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIxMjcuMC4wLjFcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgaW5ldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMTI3LjAuMC4xXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgaW5ldHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjEyNy4wLjAuMSIpKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGluZXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiOjoxXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGluZXR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjo6MVwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGluZXR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCI6OjEiKSkpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJVbmFibGUgdG8gbWFrZSBpbmV0IGFkZHJlc3MgZnJvbSAneHl6eiciLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgaW5ldHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJ4eXp6XCIiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGluZXR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcInh5enpcIiIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJFeHBlY3RlZCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBpbmV0IHZhbHVlLCBidXQgZ290IGEgSW50ZWdlciIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBpbmV0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGluZXR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMiKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGludCA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMzEyMyIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzMTIzIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGludHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAxMjMxMjMpKTsKIAogICAgICAgICAvLyBzdHJpbmdzIGFyZSBhbHNvIGFjY2VwdGVkCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMTIzMTIzXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMTIzMTIzXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgaW50dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIDEyMzEyMykpOwogCiAgICAgICAgIC8vIGludCBvdmVyZmxvdyAoMiBeIDMyLCBvciBJbnRlZ2VyLk1BWF9JTlQgKyAxKQogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRXhwZWN0ZWQgYW4gaW50IHZhbHVlLCBidXQgZ290IGEiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIyMTQ3NDgzNjQ4Iik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIyMTQ3NDgzNjQ4Iik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGFuIGludCB2YWx1ZSwgYnV0IGdvdCBhIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzLjQ1NiIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzLjQ1NiIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJVbmFibGUgdG8gbWFrZSBpbnQgZnJvbSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwieHl6elwiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcInh5enpcIiIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJFeHBlY3RlZCBhbiBpbnQgdmFsdWUsIGJ1dCBnb3QgYSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgInRydWUiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgInRydWUiKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHNtYWxsaW50ID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNtYWxsaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIzMjc2NyIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgc21hbGxpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIzMjc2NyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBzbWFsbGludHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAoc2hvcnQpIDMyNzY3KSk7CiAKICAgICAgICAgLy8gc3RyaW5ncyBhcmUgYWxzbyBhY2NlcHRlZAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgc21hbGxpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMzI3NjdcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgc21hbGxpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjMyNzY3XCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1Qgaywgc21hbGxpbnR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgKHNob3J0KSAzMjc2NykpOwogCiAgICAgICAgIC8vIHNtYWxsaW50IG92ZXJmbG93IChTaG9ydC5NQVhfVkFMVUUgKyAxKQogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIG1ha2Ugc2hvcnQgZnJvbSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBzbWFsbGludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMzI3NjgiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHNtYWxsaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMzI3NjgiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIG1ha2Ugc2hvcnQgZnJvbSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBzbWFsbGludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzLjQ1NiIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgc21hbGxpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMuNDU2Iik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBtYWtlIHNob3J0IGZyb20iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgc21hbGxpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwieHl6elwiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBzbWFsbGludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwieHl6elwiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgc2hvcnQgdmFsdWUsIGJ1dCBnb3QgYSBCb29sZWFuIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHNtYWxsaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ0cnVlIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBzbWFsbGludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgInRydWUiKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHRpbnlpbnQgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGlueWludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTI3Iik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0aW55aW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTI3Iik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRpbnlpbnR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgKGJ5dGUpIDEyNykpOwogCiAgICAgICAgIC8vIHN0cmluZ3MgYXJlIGFsc28gYWNjZXB0ZWQKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRpbnlpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMTI3XCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRpbnlpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjEyN1wiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRpbnlpbnR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgKGJ5dGUpIDEyNykpOwogCiAgICAgICAgIC8vIHRpbnlpbnQgb3ZlcmZsb3cgKEJ5dGUuTUFYX1ZBTFVFICsgMSkKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBtYWtlIGJ5dGUgZnJvbSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB0aW55aW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjgiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbnlpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjgiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIG1ha2UgYnl0ZSBmcm9tIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbnlpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMy40NTYiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbnlpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMuNDU2Iik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBtYWtlIGJ5dGUgZnJvbSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB0aW55aW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcInh5enpcIiIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdGlueWludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwieHl6elwiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgYnl0ZSB2YWx1ZSwgYnV0IGdvdCBhIEJvb2xlYW4iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdGlueWludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAidHJ1ZSIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdGlueWludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgInRydWUiKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHRleHQgKHZhcmNoYXIpID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIlwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIiIpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGV4dHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJhYmNkXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcImFiY2RcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0ZXh0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJhYmNkIikpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0ZXh0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcInNvbWUgXFxcIiB0ZXh0XCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcInNvbWUgXFxcIiB0ZXh0XCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGV4dHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAic29tZSBcIiB0ZXh0IikpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0ZXh0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIlxcdTIwMTNcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGV4dHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiXFx1MjAxM1wiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRleHR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlx1MjAxMyIpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRXhwZWN0ZWQgYSBVVEYtOCBzdHJpbmcsIGJ1dCBnb3QgYSBJbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMyIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdGV4dHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMyIpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gdGltZSA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0aW1ldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjA3OjM1OjA3LjAwMDExMTIyMlwiIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0aW1ldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIwNzozNTowNy4wMDAxMTEyMjJcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0aW1ldmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIFRpbWVTZXJpYWxpemVyLnRpbWVTdHJpbmdUb0xvbmcoIjA3OjM1OjA3LjAwMDExMTIyMiIpKSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdGltZSB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB0aW1ldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjM0NTYiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjM0NTYiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIGNvZXJjZSAneHl6JyB0byBhIGZvcm1hdHRlZCB0aW1lIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwieHl6XCIiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcInh5elwiIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB0aW1lc3RhbXAgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXN0YW1wdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMxMjMxMjMxMjMiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRpbWVzdGFtcHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMzEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0aW1lc3RhbXB2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbmV3IERhdGUoMTIzMTIzMTIzMTIzTCkpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXN0YW1wdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjIwMTQtMDEtMDFcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXN0YW1wdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCIyMDE0LTAxLTAxXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdGltZXN0YW1wdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5LU0tZCIpLnBhcnNlKCIyMDE0LTAxLTAxIikpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRXhwZWN0ZWQgYSBsb25nIG9yIGEgZGF0ZXN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHRpbWVzdGFtcCB2YWx1ZSwgYnV0IGdvdCBhIERvdWJsZSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB0aW1lc3RhbXB2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMy40NTYiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbWVzdGFtcHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMy40NTYiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIHBhcnNlIGEgZGF0ZS90aW1lIGZyb20gJ2FiY2QnIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbWVzdGFtcHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJhYmNkXCIiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbWVzdGFtcHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiYWJjZFwiIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB0aW1ldXVpZCA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0aW1ldXVpZHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRpbWV1dWlkdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiNkJEREM4OUEtNTY0NC0xMUU0LTk3RkMtNTY4NDdBRkU5Nzk5XCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCI2QkREQzg5QS01NjQ0LTExRTQtOTdGQy01Njg0N0FGRTk3OTlcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0aW1ldXVpZHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlRpbWVVVUlEIHN1cHBvcnRzIG9ubHkgdmVyc2lvbiAxIFVVSURzIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMFwiIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB0aW1ldXVpZHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCIiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRXhwZWN0ZWQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB0aW1ldXVpZCwgYnV0IGdvdCBhIEludGVnZXIiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMyIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMiKTsKIAogICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB1dWlkdmFsID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHV1aWR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjZCRERDODlBLTU2NDQtMTFFNC05N0ZDLTU2ODQ3QUZFOTc5OVwiIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCI2QkREQzg5QS01NjQ0LTExRTQtOTdGQy01Njg0N0FGRTk3OTlcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB1dWlkdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIG1ha2UgVVVJRCBmcm9tIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMDAwMDAwMDAtMDAwMC0wMDAwLXp6enotMDAwMDAwMDAwMDAwXCIiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHV1aWR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjAwMDAwMDAwLTAwMDAtMDAwMC16enp6LTAwMDAwMDAwMDAwMFwiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgdXVpZCwgYnV0IGdvdCBhIEludGVnZXIiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdXVpZHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB1dWlkdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB2YXJpbnQgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdmFyaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMxMjMxMjMxMjMiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMzEyMzEyMyIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB2YXJpbnR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbmV3IEJpZ0ludGVnZXIoIjEyMzEyMzEyMzEyMyIpKSk7CiAKICAgICAgICAgLy8gYWNjZXB0IHN0cmluZ3MgZm9yIG51bWJlcnMgdGhhdCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgbG9uZ3MKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwXCIiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MFwiIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHZhcmludHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBuZXcgQmlnSW50ZWdlcigiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIpKSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlZhbHVlICcxMjMxMjMuMTIzJyBpcyBub3QgYSB2YWxpZCByZXByZXNlbnRhdGlvbiBvZiBhIHZhcmludCB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB2YXJpbnR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIjEyMzEyMy4xMjMiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMzEyMy4xMjMiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVmFsdWUgJ3h5enonIGlzIG5vdCBhIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIGEgdmFyaW50IHZhbHVlIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJ4eXp6XCIiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwieHl6elwiIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlZhbHVlICcnIGlzIG5vdCBhIHZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIGEgdmFyaW50IHZhbHVlIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHZhcmludHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiXCJcIiIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdmFyaW50dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiXCJcIiIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJWYWx1ZSAndHJ1ZScgaXMgbm90IGEgdmFsaWQgcmVwcmVzZW50YXRpb24gb2YgYSB2YXJpbnQgdmFsdWUiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdmFyaW50dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ0cnVlIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB2YXJpbnR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ0cnVlIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBsaXN0cyA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsaXN0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbMSwgMiwgM10iKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJbMSwgMiwgM10iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBsaXN0KDEsIDIsIDMpKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIltdIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsaXN0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiW10iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbGlzdHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBudWxsKSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgbGlzdCwgYnV0IGdvdCBhIEludGVnZXIiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgbGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBsaXN0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiMTIzIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBtYWtlIGludCBmcm9tIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIltcImFiY1wiXSIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgbGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltcImFiY1wiXSIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJJbnZhbGlkIG51bGwgZWxlbWVudCBpbiBsaXN0IiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIltudWxsXSIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgbGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltudWxsXSIpOwogCiAgICAgICAgIC8vIGZyb3plbgotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVubGlzdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiWzEsIDIsIDNdIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5saXN0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiWzEsIDIsIDNdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGZyb3plbmxpc3R2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbGlzdCgxLCAyLCAzKSkpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gc2V0cyA9PT09PT09PT09PT09PT09Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzZXR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwKICAgICAgICAgICAgICAgICAwLCAiW1wiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4XCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgcm93KDAsIHNldChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OCIpLCAoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpKQogICAgICAgICApOwogCiAgICAgICAgIC8vIGR1cGxpY2F0ZXMgYXJlIG9rYXksIGp1c3QgbGlrZSBpbiBDUUwKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgc2V0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLAogICAgICAgICAgICAgICAgIDAsICJbXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OThcIiwgXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OThcIiwgXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIl0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1Qgaywgc2V0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICByb3coMCwgc2V0KFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4IiksIChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSkpCiAgICAgICAgICk7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiW10iKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHNldHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBudWxsKSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkV4cGVjdGVkIGEgbGlzdCAocmVwcmVzZW50aW5nIGEgc2V0KSwgYnV0IGdvdCBhIEludGVnZXIiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgc2V0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICIxMjMiKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIjEyMyIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJVbmFibGUgdG8gbWFrZSBVVUlEIGZyb20iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgc2V0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbXCJhYmNcIl0iKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltcImFiY1wiXSIpOwogCiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJJbnZhbGlkIG51bGwgZWxlbWVudCBpbiBzZXQiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgc2V0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbbnVsbF0iKTsKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIltudWxsXSIpOwogCiAgICAgICAgIC8vIGZyb3plbgotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVuc2V0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5zZXR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsCiAgICAgICAgICAgICAgICAgMCwgIltcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OFwiLCBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiXSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5zZXR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgIHJvdygwLCBzZXQoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTgiKSwgKFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKSkKICAgICAgICAgKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZnJvemVuc2V0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5zZXR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsCiAgICAgICAgICAgICAgICAgMCwgIltcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OFwiXSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5zZXR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgIHJvdygwLCBzZXQoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTgiKSwgKFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKSkKICAgICAgICAgKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IG1hcHMgPT09PT09PT09PT09PT09PQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJhXCI6IDEsIFwiYlwiOiAyfSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYVwiOiAxLCBcImJcIjogMn0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG1hcCgiYSIsIDEsICJiIiwgMikpKTsKIAotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7fSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie30iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgbWFwdmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsIG51bGwpKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiRXhwZWN0ZWQgYSBtYXAsIGJ1dCBnb3QgYSBJbnRlZ2VyIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIG1hcHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAiMTIzIik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBtYXB2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICIxMjMiKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCBBU0NJSSBjaGFyYWN0ZXIgaW4gc3RyaW5nIGxpdGVyYWwiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJcXHUxZmZmXFx1MjAxM1xcdTMzQjRcXHUyMDE0XCI6IDF9Iik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBtYXB2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ7XCJcXHUxZmZmXFx1MjAxM1xcdTMzQjRcXHUyMDE0XCI6IDF9Iik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkludmFsaWQgbnVsbCB2YWx1ZSBpbiBtYXAiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgbWFwdmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJhXCI6IG51bGx9Iik7CisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBtYXB2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ7XCJhXCI6IG51bGx9Iik7CiAKICAgICAgICAgLy8gZnJvemVuCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5tYXB2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIntcImFcIjogMSwgXCJiXCI6IDJ9Iik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5tYXB2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ7XCJhXCI6IDEsIFwiYlwiOiAyfSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5tYXB2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbWFwKCJhIiwgMSwgImIiLCAyKSkpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5tYXB2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIntcImJcIjogMiwgXCJhXCI6IDF9Iik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5tYXB2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ7XCJiXCI6IDIsIFwiYVwiOiAxfSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBmcm96ZW5tYXB2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgbWFwKCJhIiwgMSwgImIiLCAyKSkpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gdHVwbGVzID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbMSwgXCJmb29iYXJcIiwgXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIl0iKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiWzEsIFwiZm9vYmFyXCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHR1cGxldmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgIHJvdygwLCB0dXBsZSgxLCAiZm9vYmFyIiwgVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpCiAgICAgICAgICk7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJbMSwgbnVsbCwgXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIl0iKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAiWzEsIG51bGwsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHR1cGxldmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICByb3coMCwgdHVwbGUoMSwgbnVsbCwgVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSkpCiAgICAgICAgICk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlR1cGxlIGNvbnRhaW5zIGV4dHJhIGl0ZW1zIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsCisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCB0dXBsZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwKICAgICAgICAgICAgICAgICAwLCAiWzEsIFwiZm9vYmFyXCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIDEsIDIsIDNdIik7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlR1cGxlIGlzIG1pc3NpbmcgaXRlbXMiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdHVwbGV2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLAogICAgICAgICAgICAgICAgIDAsICJbMSwgXCJmb29iYXJcIl0iKTsKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5hYmxlIHRvIG1ha2UgaW50IGZyb20iLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdHVwbGV2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLAogICAgICAgICAgICAgICAgIDAsICJbXCJub3QgYW4gaW50XCIsIFwiZm9vYmFyXCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIik7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBVRFRzID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAie1wiYVwiOiAxLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIntcImFcIjogMSwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiY1wiOiBbXCJmb29cIiwgXCJiYXJcIl19Iik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHVkdHZhbC5hLCB1ZHR2YWwuYiwgdWR0dmFsLmMgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgIHJvdygwLCAxLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpLCBzZXQoImJhciIsICJmb28iKSkKICAgICAgICAgKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGR1cmF0aW9uID09PT09PT09PT09PT09PT0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGR1cmF0aW9udmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIjUzdXNcIiIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZHVyYXRpb252YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcIjUzdXNcIiIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBkdXJhdGlvbnZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCBEdXJhdGlvbi5uZXdJbnN0YW5jZSgwLCAwLCA1MzAwMEwpKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGR1cmF0aW9udmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcIlAyV1wiIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkdXJhdGlvbnZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiUDJXXCIiKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgZHVyYXRpb252YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgRHVyYXRpb24ubmV3SW5zdGFuY2UoMCwgMTQsIDApKSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBjb252ZXJ0ICd4eXonIHRvIGEgZHVyYXRpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIGR1cmF0aW9udmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJcInh5elwiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgZHVyYXRpb252YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJcInh5elwiIik7CiAKICAgICAgICAgLy8gb3JkZXIgb2YgZmllbGRzIHNob3VsZG4ndCBtYXR0ZXIKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAie1wiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImFcIjogMSwgXCJjXCI6IFtcImZvb1wiLCBcImJhclwiXX0iKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIntcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJhXCI6IDEsIFwiY1wiOiBbXCJmb29cIiwgXCJiYXJcIl19Iik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHVkdHZhbC5hLCB1ZHR2YWwuYiwgdWR0dmFsLmMgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgIHJvdygwLCAxLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpLCBzZXQoImJhciIsICJmb28iKSkKICAgICAgICAgKTsKIAogICAgICAgICAvLyB0ZXN0IG51bGxzCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB1ZHR2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIntcImFcIjogbnVsbCwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiY1wiOiBbXCJmb29cIiwgXCJiYXJcIl19Iik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB1ZHR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ7XCJhXCI6IG51bGwsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiLCBcImNcIjogW1wiZm9vXCIsIFwiYmFyXCJdfSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB1ZHR2YWwuYSwgdWR0dmFsLmIsIHVkdHZhbC5jIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICByb3coMCwgbnVsbCwgVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSwgc2V0KCJiYXIiLCAiZm9vIikpCiAgICAgICAgICk7CiAKICAgICAgICAgLy8gdGVzdCBtaXNzaW5nIGZpZWxkcwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21Kc29uKD8pKSIsIDAsICJ7XCJhXCI6IDEsIFwiYlwiOiBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwifSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYVwiOiAxLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIn0iKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdWR0dmFsLmEsIHVkdHZhbC5iLCB1ZHR2YWwuYyBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgcm93KDAsIDEsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IiksIG51bGwpCiAgICAgICAgICk7CiAKLSAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVua25vd24gZmllbGQiLCAiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAie1wieHh4XCI6IDF9Iik7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJVbmtub3duIGZpZWxkIiwgIklOU0VSVCBJTlRPICVzIChrLCB1ZHR2YWwpIFZBTFVFUyAoPywgZnJvbV9qc29uKD8pKSIsIDAsICJ7XCJ4eHhcIjogMX0iKTsKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIlVuYWJsZSB0byBtYWtlIGludCBmcm9tIiwKLSAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKGssIHVkdHZhbCkgVkFMVUVTICg/LCBmcm9tSnNvbig/KSkiLCAwLCAie1wiYVwiOiBcImZvb2JhclwifSIpOworICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIGZyb21fanNvbig/KSkiLCAwLCAie1wiYVwiOiBcImZvb2JhclwifSIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC03NDUsMjEyICs3NDcsMjI0IEBACiAgICAgICAgICAgICAgICAgInVkdHZhbCBmcm96ZW48IiArIHR5cGVOYW1lICsgIj4sIiArCiAgICAgICAgICAgICAgICAgImR1cmF0aW9udmFsIGR1cmF0aW9uKSIpOwogCi0gICAgICAgIC8vIHRvSnNvbigpIGNhbiBvbmx5IGJlIHVzZWQgaW4gc2VsZWN0aW9ucwotICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgidG9Kc29uKCkgbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2UiLAotICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgdG9Kc29uKD8pKSIsIDAsIDApOwotICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgidG9Kc29uKCkgbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gdGhlIHNlbGVjdGlvbiBjbGF1c2UiLAotICAgICAgICAgICAgICAgICJVUERBVEUgJXMgU0VUIGFzY2lpdmFsID0gdG9Kc29uKD8pIFdIRVJFIGsgPSA/IiwgMCwgMCk7Ci0gICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJ0b0pzb24oKSBtYXkgb25seSBiZSB1c2VkIHdpdGhpbiB0aGUgc2VsZWN0aW9uIGNsYXVzZSIsCi0gICAgICAgICAgICAgICAgIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSBmcm9tSnNvbih0b0pzb24oPykpIiwgMCk7CisgICAgICAgIC8vIHRvX2pzb24oKSBjYW4gYmUgdXNlZCBvdXQgb2YgdGhlIHNlbGVjdGlvbiBjbGF1c2UgKHdpdGggbGl0ZXJhbHMpCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0ZXh0dmFsKSBWQUxVRVMgKD8sIHRvX2pzb24oMTIzNCkpIiwgMCk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHRleHR2YWwgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coIjEyMzQiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHRleHR2YWwgRlJPTSAlcyBXSEVSRSB0ZXh0dmFsID0gdG9fanNvbigxMjM0KSBBTExPVyBGSUxURVJJTkciKSwgcm93KCIxMjM0IikpOworICAgICAgICBleGVjdXRlKCJVUERBVEUgJXMgU0VUIHRleHR2YWwgPSB0b19qc29uKC0xMjM0KSBXSEVSRSBrID0gPyIsIDApOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCB0ZXh0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KCItMTIzNCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgdGV4dHZhbCBGUk9NICVzIFdIRVJFIHRleHR2YWwgPSB0b19qc29uKC0xMjM0KSBBTExPVyBGSUxURVJJTkciKSwgcm93KCItMTIzNCIpKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IGZyb21fanNvbih0b19qc29uKDApKSIpOworICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgdGV4dHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCkpOworCisgICAgICAgIC8vIHRvX2pzb24oKSBjYW4gYmUgdXNlZCBvdXQgb2YgdGhlIHNlbGVjdGlvbiBjbGF1c2UgKHdpdGggbWFya2VycykKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgdG9fanNvbigoaW50KSA/KSkiLCAwLCAxMjMxMjMpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCB0ZXh0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KCIxMjMxMjMiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHRleHR2YWwgRlJPTSAlcyBXSEVSRSB0ZXh0dmFsID0gdG9fanNvbigoaW50KSA/KSBBTExPVyBGSUxURVJJTkciLCAxMjMxMjMpLCByb3coIjEyMzEyMyIpKTsKKyAgICAgICAgZXhlY3V0ZSgiVVBEQVRFICVzIFNFVCB0ZXh0dmFsID0gdG9fanNvbigoaW50KSA/KSBXSEVSRSBrID0gPyIsIC0xMjMxMjMsIDApOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCB0ZXh0dmFsIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KCItMTIzMTIzIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCB0ZXh0dmFsIEZST00gJXMgV0hFUkUgdGV4dHZhbCA9IHRvX2pzb24oKGludCkgPykgQUxMT1cgRklMVEVSSU5HIiwgLTEyMzEyMyksIHJvdygiLTEyMzEyMyIpKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IGZyb21fanNvbih0b19qc29uKChpbnQpID8pKSIsIDApOworICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgdGV4dHZhbCBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCkpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gYXNjaWkgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYXNjaWl2YWwpIFZBTFVFUyAoPywgPykiLCAwLCAiYXNjaWkgdGV4dCIpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oYXNjaWl2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcImFzY2lpIHRleHRcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihhc2NpaXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiYXNjaWkgdGV4dFwiIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBhc2NpaXZhbCkgVkFMVUVTICg/LCA/KSIsIDAsICIiKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGFzY2lpdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCJcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihhc2NpaXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiXCIiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBiaWdpbnQgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYmlnaW50dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgMTIzMTIzMTIzMTIzTCk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihiaWdpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIxMjMxMjMxMjMxMjMiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oYmlnaW50dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMTIzMTIzMTIzMTIzIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBiaWdpbnR2YWwpIFZBTFVFUyAoPywgPykiLCAwLCAwTCk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihiaWdpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIwIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGJpZ2ludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjAiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJpZ2ludHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIC0xMjMxMjMxMjMxMjNMKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGJpZ2ludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIi0xMjMxMjMxMjMxMjMiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oYmlnaW50dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiLTEyMzEyMzEyMzEyMyIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGJsb2IgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgYmxvYnZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKDEpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGJsb2J2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIjB4MDAwMDAwMDFcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihibG9idmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIweDAwMDAwMDAxXCIiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJsb2J2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUik7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihibG9idmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIweFwiIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGJsb2J2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIjB4XCIiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBib29sZWFuID09PT09PT09PT09PT09PT0KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGJvb2xlYW52YWwpIFZBTFVFUyAoPywgPykiLCAwLCB0cnVlKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGJvb2xlYW52YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJ0cnVlIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGJvb2xlYW52YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJ0cnVlIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBib29sZWFudmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgZmFsc2UpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oYm9vbGVhbnZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgImZhbHNlIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGJvb2xlYW52YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJmYWxzZSIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGRhdGUgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZGF0ZXZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIFNpbXBsZURhdGVTZXJpYWxpemVyLmRhdGVTdHJpbmdUb0RheXMoIjE5ODctMDMtMjMiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihkYXRldmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIxOTg3LTAzLTIzXCIiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oZGF0ZXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiMTk4Ny0wMy0yM1wiIikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gZGVjaW1hbCA9PT09PT09PT09PT09PT09CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkZWNpbWFsdmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgbmV3IEJpZ0RlY2ltYWwoIjEyMzEyMy4xMjMxMjMiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihkZWNpbWFsdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMTIzMTIzLjEyMzEyMyIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihkZWNpbWFsdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMTIzMTIzLjEyMzEyMyIpKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZGVjaW1hbHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIG5ldyBCaWdEZWNpbWFsKCItMS4yM0UtMTIiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihkZWNpbWFsdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiLTEuMjNFLTEyIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGRlY2ltYWx2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICItMS4yM0UtMTIiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBkb3VibGUgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZG91YmxldmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgMTIzMTIzLjEyMzEyM2QpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oZG91YmxldmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMTIzMTIzLjEyMzEyMyIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihkb3VibGV2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIxMjMxMjMuMTIzMTIzIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkb3VibGV2YWwpIFZBTFVFUyAoPywgPykiLCAwLCAxMjMxMjNkKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGRvdWJsZXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjEyMzEyMy4wIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGRvdWJsZXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjEyMzEyMy4wIikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gZmxvYXQgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgZmxvYXR2YWwpIFZBTFVFUyAoPywgPykiLCAwLCAxMjMuMTIzZik7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihmbG9hdHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjEyMy4xMjMiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oZmxvYXR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIxMjMuMTIzIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmbG9hdHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIDEyMzEyM2YpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oZmxvYXR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIxMjMxMjMuMCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihmbG9hdHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjEyMzEyMy4wIikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gaW5ldCA9PT09PT09PT09PT09PT09CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBpbmV0dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIxMjcuMC4wLjEiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihpbmV0dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIxMjcuMC4wLjFcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihpbmV0dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIxMjcuMC4wLjFcIiIpKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgaW5ldHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiOjoxIikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oaW5ldHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiMDowOjA6MDowOjA6MDoxXCIiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oaW5ldHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiMDowOjA6MDowOjA6MDoxXCIiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSBpbnQgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgaW50dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgMTIzMTIzKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjEyMzEyMyIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIxMjMxMjMiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGludHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIDApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oaW50dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIwIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBpbnR2YWwpIFZBTFVFUyAoPywgPykiLCAwLCAtMTIzMTIzKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIi0xMjMxMjMiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oaW50dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiLTEyMzEyMyIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHNtYWxsaW50ID09PT09PT09PT09PT09PT0KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNtYWxsaW50dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgKHNob3J0KSAzMjc2Nyk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihzbWFsbGludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjMyNzY3IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKHNtYWxsaW50dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMzI3NjciKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNtYWxsaW50dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgKHNob3J0KSAwKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHNtYWxsaW50dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihzbWFsbGludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjAiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNtYWxsaW50dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgKHNob3J0KSAtMzI3NjgpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oc21hbGxpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICItMzI3NjgiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oc21hbGxpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICItMzI3NjgiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB0aW55aW50ID09PT09PT09PT09PT09PT0KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRpbnlpbnR2YWwpIFZBTFVFUyAoPywgPykiLCAwLCAoYnl0ZSkgMTI3KTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHRpbnlpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIxMjciKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24odGlueWludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjEyNyIpKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGlueWludHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIChieXRlKSAwKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHRpbnlpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIwIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKHRpbnlpbnR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICIwIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0aW55aW50dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgKGJ5dGUpIC0xMjgpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odGlueWludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIi0xMjgiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24odGlueWludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIi0xMjgiKSk7CiAKICAgICAgICAgLy8gPT09PT09PT09PT09PT09PSB0ZXh0ICh2YXJjaGFyKSA9PT09PT09PT09PT09PT09CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0ZXh0dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgIiIpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odGV4dHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiXCIiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24odGV4dHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiXCIiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRleHR2YWwpIFZBTFVFUyAoPywgPykiLCAwLCAiYWJjZCIpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odGV4dHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiYWJjZFwiIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKHRleHR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcImFiY2RcIiIpKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGV4dHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsICJcdTg0MjIiKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHRleHR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIlx1ODQyMlwiIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKHRleHR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIlx1ODQyMlwiIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0ZXh0dmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgIlx1MDAwMCIpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odGV4dHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiXFx1MDAwMFwiIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKHRleHR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIlxcdTAwMDBcIiIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHRpbWUgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIDEyM0wpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odGltZXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiMDA6MDA6MDAuMDAwMDAwMTIzXCIiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24odGltZXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiMDA6MDA6MDAuMDAwMDAwMTIzXCIiKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHRpbWV2YWwpIFZBTFVFUyAoPywgZnJvbUpzb24oPykpIiwgMCwgIlwiMDc6MzU6MDcuMDAwMTExMjIyXCIiKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHRpbWV2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIjA3OjM1OjA3LjAwMDExMTIyMlwiIikpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXZhbCkgVkFMVUVTICg/LCBmcm9tX2pzb24oPykpIiwgMCwgIlwiMDc6MzU6MDcuMDAwMTExMjIyXCIiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbih0aW1ldmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIwNzozNTowNy4wMDAxMTEyMjJcIiIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHRpbWVzdGFtcCA9PT09PT09PT09PT09PT09CiAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInktTS1kIik7CiAgICAgICAgIHNkZi5zZXRUaW1lWm9uZShUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVURUIikpOwogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXN0YW1wdmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgc2RmLnBhcnNlKCIyMDE0LTAxLTAxIikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odGltZXN0YW1wdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIyMDE0LTAxLTAxIDAwOjAwOjAwLjAwMFpcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbih0aW1lc3RhbXB2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIjIwMTQtMDEtMDEgMDA6MDA6MDAuMDAwWlwiIikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gdGltZXV1aWQgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdGltZXV1aWR2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHRpbWV1dWlkdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbih0aW1ldXVpZHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIiKSk7CiAKICAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gdXVpZHZhbCA9PT09PT09PT09PT09PT09CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB1dWlkdmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTkiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbih1dWlkdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbih1dWlkdmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHZhcmludCA9PT09PT09PT09PT09PT09CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2YXJpbnR2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBuZXcgQmlnSW50ZWdlcigiMTIzMTIzMTIzMTIzMTIzMTIzMTIzIikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odmFyaW50dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiMTIzMTIzMTIzMTIzMTIzMTIzMTIzIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKHZhcmludHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIjEyMzEyMzEyMzEyMzEyMzEyMzEyMyIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGxpc3RzID09PT09PT09PT09PT09PT0KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGxpc3R2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBsaXN0KDEsIDIsIDMpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGxpc3R2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJbMSwgMiwgM10iKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24obGlzdHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlsxLCAyLCAzXSIpKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbGlzdHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIGxpc3QoKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihsaXN0dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAibnVsbCIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihsaXN0dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAibnVsbCIpKTsKIAogICAgICAgICAvLyBmcm96ZW4KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGZyb3plbmxpc3R2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBsaXN0KDEsIDIsIDMpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGZyb3plbmxpc3R2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJbMSwgMiwgM10iKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oZnJvemVubGlzdHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlsxLCAyLCAzXSIpKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IHNldHMgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgc2V0dmFsKSBWQUxVRVMgKD8sID8pIiwKICAgICAgICAgICAgICAgICAwLCBzZXQoVVVJRC5mcm9tU3RyaW5nKCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTgiKSwgKFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihzZXR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihzZXR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICByb3coMCwgIltcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OFwiLCBcIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OVwiXSIpCiAgICAgICAgICk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHNldHZhbCkgVkFMVUVTICg/LCA/KSIsIDAsIHNldCgpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHNldHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIm51bGwiKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oc2V0dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAibnVsbCIpKTsKIAogICAgICAgICAvLyBmcm96ZW4KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGZyb3plbnNldHZhbCkgVkFMVUVTICg/LCA/KSIsCiAgICAgICAgICAgICAgICAgMCwgc2V0KFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk4IiksIChVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKSkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oZnJvemVuc2V0dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24oZnJvemVuc2V0dmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCiAgICAgICAgICAgICAgICAgcm93KDAsICJbXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OThcIiwgXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIl0iKQogICAgICAgICApOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gbWFwcyA9PT09PT09PT09PT09PT09CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtYXB2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBtYXAoImEiLCAxLCAiYiIsIDIpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKG1hcHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIntcImFcIjogMSwgXCJiXCI6IDJ9IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKG1hcHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIntcImFcIjogMSwgXCJiXCI6IDJ9IikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtYXB2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBtYXAoKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbihtYXB2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJudWxsIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKG1hcHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIm51bGwiKSk7CiAKICAgICAgICAgLy8gZnJvemVuCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBmcm96ZW5tYXB2YWwpIFZBTFVFUyAoPywgPykiLCAwLCBtYXAoImEiLCAxLCAiYiIsIDIpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKGZyb3plbm1hcHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIntcImFcIjogMSwgXCJiXCI6IDJ9IikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGZyb3plbm1hcHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIntcImFcIjogMSwgXCJiXCI6IDJ9IikpOwogCiAgICAgICAgIC8vID09PT09PT09PT09PT09PT0gdHVwbGVzID09PT09PT09PT09PT09PT0KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHR1cGxldmFsKSBWQUxVRVMgKD8sID8pIiwgMCwgdHVwbGUoMSwgImZvb2JhciIsIFVVSUQuZnJvbVN0cmluZygiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5IikpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHR1cGxldmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvX2pzb24odHVwbGV2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgIHJvdygwLCAiWzEsIFwiZm9vYmFyXCIsIFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCJdIikKICAgICAgICAgKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdHVwbGV2YWwpIFZBTFVFUyAoPywgPykiLCAwLCB0dXBsZSgxLCAiZm9vYmFyIiwgbnVsbCkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24odHVwbGV2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbih0dXBsZXZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgIHJvdygwLCAiWzEsIFwiZm9vYmFyXCIsIG51bGxdIikKICAgICAgICAgKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IFVEVHMgPT09PT09PT09PT09PT09PQogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIHthOiA/LCBiOiA/LCBjOiA/fSkiLCAwLCAxLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpLCBzZXQoImZvbyIsICJiYXIiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHRvSnNvbih1ZHR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbih1ZHR2YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwKICAgICAgICAgICAgICAgICByb3coMCwgIntcImFcIjogMSwgXCJiXCI6IFwiNmJkZGM4OWEtNTY0NC0xMWU0LTk3ZmMtNTY4NDdhZmU5Nzk5XCIsIFwiY1wiOiBbXCJiYXJcIiwgXCJmb29cIl19IikKICAgICAgICAgKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdWR0dmFsKSBWQUxVRVMgKD8sIHthOiA/LCBiOiA/fSkiLCAwLCAxLCBVVUlELmZyb21TdHJpbmcoIjZiZGRjODlhLTU2NDQtMTFlNC05N2ZjLTU2ODQ3YWZlOTc5OSIpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9Kc29uKHVkdHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKHVkdHZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLAogICAgICAgICAgICAgICAgIHJvdygwLCAie1wiYVwiOiAxLCBcImJcIjogXCI2YmRkYzg5YS01NjQ0LTExZTQtOTdmYy01Njg0N2FmZTk3OTlcIiwgXCJjXCI6IG51bGx9IikKICAgICAgICAgKTsKIAogICAgICAgICAvLyA9PT09PT09PT09PT09PT09IGR1cmF0aW9uID09PT09PT09PT09PT09PT0KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGR1cmF0aW9udmFsKSBWQUxVRVMgKD8sIDEywrVzKSIsIDApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oZHVyYXRpb252YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIjEydXNcIiIpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgdG9fanNvbihkdXJhdGlvbnZhbCkgRlJPTSAlcyBXSEVSRSBrID0gPyIsIDApLCByb3coMCwgIlwiMTJ1c1wiIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBkdXJhdGlvbnZhbCkgVkFMVUVTICg/LCBQMVkxTTJEVDEwSDVNKSIsIDApOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b0pzb24oZHVyYXRpb252YWwpIEZST00gJXMgV0hFUkUgayA9ID8iLCAwKSwgcm93KDAsICJcIjF5MW1vMmQxMGg1bVwiIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCB0b19qc29uKGR1cmF0aW9udmFsKSBGUk9NICVzIFdIRVJFIGsgPSA/IiwgMCksIHJvdygwLCAiXCIxeTFtbzJkMTBoNW1cIiIpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTAyNCw4ICsxMDM4LDggQEAKICAgICAgICAgICAgICAgICByb3coIntcImZvb1wiOiAyfSIpCiAgICAgICAgICk7CiAKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgSlNPTiB0b0pzb24oYmxvYkFzSW50KGludEFzQmxvYih2KSkpIEZST00gJXMgTElNSVQgMSIpLAotICAgICAgICAgICAgICAgIHJvdygie1wic3lzdGVtLnRvanNvbihzeXN0ZW0uYmxvYmFzaW50KHN5c3RlbS5pbnRhc2Jsb2IodikpKVwiOiBcIjBcIn0iKQorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBKU09OIHRvX2pzb24oYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IodikpKSBGUk9NICVzIExJTUlUIDEiKSwKKyAgICAgICAgICAgICAgICByb3coIntcInN5c3RlbS50b19qc29uKHN5c3RlbS5ibG9iX2FzX2ludChzeXN0ZW0uaW50X2FzX2Jsb2IodikpKVwiOiBcIjBcIn0iKQogICAgICAgICApOwogICAgIH0KIApAQCAtMTI2OCwxMSArMTI4MiwxMSBAQAogCiAgICAgICAgIC8vIG1hcDxzZXQ8dGV4dD4sIHRleHQ+IGtleXMKICAgICAgICAgU3RyaW5nIGlubmVyS2V5MSA9ICJbXCIwXCIsIFwiMVwiXSI7Ci0gICAgICAgIFN0cmluZyBmdWxsS2V5MSA9IFN0cmluZy5mb3JtYXQoIntcIiVzXCI6IFwiJXNcIn0iLCBKc29uLnF1b3RlQXNKc29uU3RyaW5nKGlubmVyS2V5MSksICJhIik7Ci0gICAgICAgIFN0cmluZyBzdHJpbmdLZXkxID0gSnNvbi5xdW90ZUFzSnNvblN0cmluZyhmdWxsS2V5MSk7CisgICAgICAgIFN0cmluZyBmdWxsS2V5MSA9IFN0cmluZy5mb3JtYXQoIntcIiVzXCI6IFwiJXNcIn0iLCBKc29uVXRpbHMucXVvdGVBc0pzb25TdHJpbmcoaW5uZXJLZXkxKSwgImEiKTsKKyAgICAgICAgU3RyaW5nIHN0cmluZ0tleTEgPSBKc29uVXRpbHMucXVvdGVBc0pzb25TdHJpbmcoZnVsbEtleTEpOwogICAgICAgICBTdHJpbmcgaW5uZXJLZXkyID0gIltcIjNcIiwgXCI0XCJdIjsKLSAgICAgICAgU3RyaW5nIGZ1bGxLZXkyID0gU3RyaW5nLmZvcm1hdCgie1wiJXNcIjogXCIlc1wifSIsIEpzb24ucXVvdGVBc0pzb25TdHJpbmcoaW5uZXJLZXkyKSwgImIiKTsKLSAgICAgICAgU3RyaW5nIHN0cmluZ0tleTIgPSBKc29uLnF1b3RlQXNKc29uU3RyaW5nKGZ1bGxLZXkyKTsKKyAgICAgICAgU3RyaW5nIGZ1bGxLZXkyID0gU3RyaW5nLmZvcm1hdCgie1wiJXNcIjogXCIlc1wifSIsIEpzb25VdGlscy5xdW90ZUFzSnNvblN0cmluZyhpbm5lcktleTIpLCAiYiIpOworICAgICAgICBTdHJpbmcgc3RyaW5nS2V5MiA9IEpzb25VdGlscy5xdW90ZUFzSnNvblN0cmluZyhmdWxsS2V5Mik7CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIEpTT04gPyIsICJ7XCJrXCI6IDAsIFwibmVzdGVkc2V0bWFwXCI6IHtcIiIgKyBzdHJpbmdLZXkxICsgIlwiOiB0cnVlLCBcIiIgKyBzdHJpbmdLZXkyICsgIlwiOiBmYWxzZX19Iik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIEpTT04gaywgbmVzdGVkc2V0bWFwIEZST00gJXMiKSwgcm93KCJ7XCJrXCI6IDAsIFwibmVzdGVkc2V0bWFwXCI6IHtcIiIgKyBzdHJpbmdLZXkxICsgIlwiOiB0cnVlLCBcIiIgKyBzdHJpbmdLZXkyICsgIlwiOiBmYWxzZX19IikpOwogCkBAIC0xMzU3LDExICsxMzcxLDExIEBACiAgICAgICAgIH07CiAKICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChudW1UaHJlYWRzKTsKLSAgICAgICAgTGlzdDxGdXR1cmU+IGZ1dHVyZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxGdXR1cmU8Pz4+IGZ1dHVyZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1UaHJlYWRzOyBpKyspCiAgICAgICAgICAgICBmdXR1cmVzLmFkZChleGVjdXRvci5zdWJtaXQod29ya2VyKSk7CiAKLSAgICAgICAgZm9yIChGdXR1cmUgZnV0dXJlIDogZnV0dXJlcykKKyAgICAgICAgZm9yIChGdXR1cmU8Pz4gZnV0dXJlIDogZnV0dXJlcykKICAgICAgICAgICAgIGZ1dHVyZS5nZXQoMzAsIFRpbWVVbml0LlNFQ09ORFMpOwogCiAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duKCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1NlY29uZGFyeUluZGV4VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9TZWNvbmRhcnlJbmRleFRlc3QuamF2YQppbmRleCAzNGI4MDVkLi43N2M2MTFiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1NlY29uZGFyeUluZGV4VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvU2Vjb25kYXJ5SW5kZXhUZXN0LmphdmEKQEAgLTExODQsMzkgKzExODQsMzkgQEAKIAogICAgICAgICBiZWZvcmVBbmRBZnRlckZsdXNoKCgpIC0+IHsKICAgICAgICAgICAgIC8vIFRlc3QgY2x1c3RlcmluZyBjb2x1bW5zIHJlc3RyaWN0aW9ucwotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID0gdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPSB0ZXh0X2FzX2Jsb2IoJycpOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPSAodGV4dEFzQmxvYignJykpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPSAodGV4dF9hc19ibG9iKCcnKSk7IikpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyBJTiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIElOICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSBJTiAoKHRleHRBc0Jsb2IoJycpKSwgKHRleHRBc0Jsb2IoJzEnKSkpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpIElOICgodGV4dF9hc19ibG9iKCcnKSksICh0ZXh0X2FzX2Jsb2IoJzEnKSkpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID4gdGV4dEFzQmxvYignJykgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJykgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRBc0Jsb2IoJycpIEFORCB2ID0gdGV4dEFzQmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dF9hc19ibG9iKCcnKSBBTkQgdiA9IHRleHRfYXNfYmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSA+PSAodGV4dEFzQmxvYignJykpIEFORCB2ID0gdGV4dEFzQmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSA+PSAodGV4dF9hc19ibG9iKCcnKSkgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0QXNCbG9iKCcnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPD0gdGV4dF9hc19ibG9iKCcnKSBBTkQgdiA9IHRleHRfYXNfYmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpIDw9ICh0ZXh0QXNCbG9iKCcnKSkgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPD0gKHRleHRfYXNfYmxvYignJykpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPCAodGV4dEFzQmxvYignJykpIEFORCB2ID0gdGV4dEFzQmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpIDwgKHRleHRfYXNfYmxvYignJykpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dEFzQmxvYignJykgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dF9hc19ibG9iKCcnKSBBTkQgdiA9IHRleHRfYXNfYmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRBc0Jsb2IoJycpIEFORCBjIDwgdGV4dEFzQmxvYignJykgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID4gdGV4dF9hc19ibG9iKCcnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJykgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IikpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSA+ICh0ZXh0QXNCbG9iKCcnKSkgQU5EIChjKSA8ICh0ZXh0QXNCbG9iKCcnKSkgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPiAodGV4dF9hc19ibG9iKCcnKSkgQU5EIChjKSA8ICh0ZXh0X2FzX2Jsb2IoJycpKSBBTkQgdiA9IHRleHRfYXNfYmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSk7CiAgICAgICAgIH0pOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsCkBAIC0xMjI0LDUwICsxMjI0LDUwIEBACiAKICAgICAgICAgYmVmb3JlQW5kQWZ0ZXJGbHVzaCgoKSAtPiB7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID0gdGV4dEFzQmxvYignJyk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID0gdGV4dF9hc19ibG9iKCcnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSA9ICh0ZXh0QXNCbG9iKCcnKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPSAodGV4dF9hc19ibG9iKCcnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIElOICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgSU4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgSU4gKCh0ZXh0QXNCbG9iKCcnKSksICh0ZXh0QXNCbG9iKCcxJykpKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSBJTiAoKHRleHRfYXNfYmxvYignJykpLCAodGV4dF9hc19ibG9iKCcxJykpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID4gdGV4dEFzQmxvYignJykgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJykgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRBc0Jsb2IoJycpIEFORCB2ID0gdGV4dEFzQmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dF9hc19ibG9iKCcnKSBBTkQgdiA9IHRleHRfYXNfYmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0QXNCbG9iKCcnKSkgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0X2FzX2Jsb2IoJycpKSBBTkQgdiA9IHRleHRfYXNfYmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0QXNCbG9iKCcnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRfYXNfYmxvYignJykgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPD0gKHRleHRBc0Jsb2IoJycpKSBBTkQgdiA9IHRleHRBc0Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPD0gKHRleHRfYXNfYmxvYignJykpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPCB0ZXh0QXNCbG9iKCcnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPCB0ZXh0X2FzX2Jsb2IoJycpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPCAodGV4dEFzQmxvYignJykpIEFORCB2ID0gdGV4dEFzQmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpIDwgKHRleHRfYXNfYmxvYignJykpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRBc0Jsb2IoJycpIEFORCBjIDwgdGV4dEFzQmxvYignJykgQU5EIHYgPSB0ZXh0QXNCbG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRfYXNfYmxvYignJykgQU5EIGMgPCB0ZXh0X2FzX2Jsb2IoJycpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcxJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPj0gKHRleHRBc0Jsb2IoJycpKSBBTkQgYyA8IHRleHRBc0Jsb2IoJycpIEFORCB2ID0gdGV4dEFzQmxvYignMScpIEFMTE9XIEZJTFRFUklORzsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0X2FzX2Jsb2IoJycpKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJykgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTExPVyBGSUxURVJJTkc7IikpOwogCiAgICAgICAgICAgICAvLyBUZXN0IHJlc3RyaWN0aW9ucyBvbiBub24tcHJpbWFyeSBrZXkgdmFsdWUKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAgICAgICAgIH0pOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsCkBAIC0xMjc1LDcgKzEyNzUsNyBAQAogCiAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgdiA9IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIzIiksIEVNUFRZX0JZVEVfQlVGRkVSKSk7CiAgICAgICAgIH0pOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVGltZXN0YW1wVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9UaW1lc3RhbXBUZXN0LmphdmEKaW5kZXggMTMwOTBhNi4uOTRiYWY4MiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9UaW1lc3RhbXBUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9UaW1lc3RhbXBUZXN0LmphdmEKQEAgLTE3LDExICsxNywxNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMudmFsaWRhdGlvbi5lbnRpdGllczsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKQEAgLTY2LDcgKzcxLDcgQEAKIAogCiAgICAgICAgIC8vIHdyYXAgd3JpdGV0aW1lKCksIHR0bCgpIGluIG90aGVyIGZ1bmN0aW9ucyAodGVzdCBmb3IgQ0FTU0FORFJBLTg0NTEpCi0gICAgICAgIHJlcyA9IGdldFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGMsIGJsb2JBc0JpZ2ludChiaWdpbnRBc0Jsb2Iod3JpdGV0aW1lKGMpKSksIHR0bChjKSBGUk9NICVzIikpOworICAgICAgICByZXMgPSBnZXRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBrLCBjLCBibG9iX2FzX2JpZ2ludChiaWdpbnRfYXNfYmxvYih3cml0ZXRpbWUoYykpKSwgdHRsKGMpIEZST00gJXMiKSk7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgcmVzLmxlbmd0aCk7CiAKICAgICAgICAgZm9yIChPYmplY3RbXSByIDogcmVzKQpAQCAtNzgsNyArODMsNyBAQAogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoclszXSBpbnN0YW5jZW9mIEludGVnZXIgfHwgclsyXSBpbnN0YW5jZW9mIExvbmcpOwogICAgICAgICB9CiAKLSAgICAgICAgcmVzID0gZ2V0Um93cyhleGVjdXRlKCJTRUxFQ1QgaywgYywgd3JpdGV0aW1lKGMpLCBibG9iQXNJbnQoaW50QXNCbG9iKHR0bChjKSkpIEZST00gJXMiKSk7CisgICAgICAgIHJlcyA9IGdldFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIGMsIHdyaXRldGltZShjKSwgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IodHRsKGMpKSkgRlJPTSAlcyIpKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCByZXMubGVuZ3RoKTsKIAogCkBAIC05Nyw2ICsxMDIsODQgQEAKICAgICAgICAgICAgICAgICAgICByb3coMSwgbnVsbCwgbnVsbCkpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBzZXR1cFNjaGVtYUZvck1heFRpbWVzdGFtcCgpCisgICAgeworICAgICAgICBTdHJpbmcgbXlUeXBlID0gY3JlYXRlVHlwZSgiQ1JFQVRFIFRZUEUgJXMgKGEgaW50LCBiIGludCkiKTsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIGEgdGV4dCwgIiArCisgICAgICAgICAgICAgICAgICAgICJsIGxpc3Q8aW50PiwgZmwgZnJvemVuPGxpc3Q8aW50Pj4sIiArCisgICAgICAgICAgICAgICAgICAgICJzIHNldDxpbnQ+LCBmcyBmcm96ZW48c2V0PGludD4+LCIgKworICAgICAgICAgICAgICAgICAgICAibSBtYXA8aW50LCB0ZXh0PiwgZm0gZnJvemVuPG1hcDxpbnQsIHRleHQ+PiwiICsKKyAgICAgICAgICAgICAgICAgICAgInQgIiArIG15VHlwZSArICIsIGZ0IGZyb3plbjwiICsgbXlUeXBlICsgIj4pIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbE1heFRpbWVzdGFtcE9uRW1wdHlDb2xsZWN0aW9uUmV0dXJuc051bGwoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXR1cFNjaGVtYUZvck1heFRpbWVzdGFtcCgpOworCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrKSBWQUxVRVMgKDEpIik7CisgICAgICAgIE9iamVjdFtdW10gcmVzID0gZ2V0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWF4d3JpdGV0aW1lKGEpLCBtYXh3cml0ZXRpbWUobCksIG1heHdyaXRldGltZShmbCksIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXh3cml0ZXRpbWUocyksIG1heHdyaXRldGltZShmcyksIG1heHdyaXRldGltZShtKSwgbWF4d3JpdGV0aW1lKGZtKSwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heHdyaXRldGltZSh0KSwgbWF4d3JpdGV0aW1lKGZ0KSBGUk9NICVzIFdIRVJFIGs9MSIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzLmxlbmd0aCk7CisgICAgICAgIGZvciAoT2JqZWN0IHYgOiByZXNbMF0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydE51bGwoIkFsbCB0aGUgbXVsdGktY2VsbCBkYXRhIGFyZSBlbXB0eSAod2UgZGlkIG5vdCBpbnNlcnQpLCBjYWxsaW5nIG1heHdyaXRldGltZSBzaG91bGQgcmV0dXJuIG51bGwiLAorICAgICAgICAgICAgICAgICAgICAgICB2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1heFRpbWVzdGFtcCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHNldHVwU2NoZW1hRm9yTWF4VGltZXN0YW1wKCk7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGEsIGwsIGZsLCBzLCBmcywgbSwgZm0sIHQsIGZ0KSBWQUxVRVMgIiArCisgICAgICAgICAgICAgICAgIigxLCAndGVzdCcsIFsxXSwgWzJdLCB7MX0sIHsyfSwgezEgOiAnYSd9LCB7MiA6ICdiJ30sIHthIDogMSwgYiA6IDEgfSwge2EgOiAyLCBiIDogMn0pIFVTSU5HIFRJTUVTVEFNUCAxIik7CisKKyAgICAgICAgLy8gZW51bWVyYXRlIHRocm91Z2ggYWxsIG11bHRpLWNlbGwgdHlwZXMgYW5kIG1ha2Ugc3VyZSBtYXh3cml0ZXRpbWUgcmVmbGVjdHMgdGhlIGV4cGVjdGVkIHJlc3VsdAorICAgICAgICB0ZXN0TWF4VGltZXN0YW1wV2l0aENvbHVtblVwZGF0ZShBcnJheXMuYXNMaXN0KAorICAgICAgICAgICBQYWlyLmNyZWF0ZSgxLCAiVVBEQVRFICVzIFVTSU5HIFRJTUVTVEFNUCAxMCBTRVQgbCA9IGwgKyBbMTBdIFdIRVJFIGsgPSAxIiksCisgICAgICAgICAgIFBhaXIuY3JlYXRlKDMsICJVUERBVEUgJXMgVVNJTkcgVElNRVNUQU1QIDExIFNFVCBzID0gcyArIHsxMH0gV0hFUkUgayA9IDEiKSwKKyAgICAgICAgICAgUGFpci5jcmVhdGUoNSwgIlVQREFURSAlcyBVU0lORyBUSU1FU1RBTVAgMTIgU0VUIG0gPSBtICsgezEwIDogJ2MnfSBXSEVSRSBrID0gMSIpLAorICAgICAgICAgICBQYWlyLmNyZWF0ZSg3LCAiVVBEQVRFICVzIFVTSU5HIFRJTUVTVEFNUCAxMyBTRVQgdC5hID0gMTAgV0hFUkUgayA9IDEiKQorICAgICAgICApKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdE1heFRpbWVzdGFtcFdpdGhDb2x1bW5VcGRhdGUoTGlzdDxQYWlyPEludGVnZXIsIFN0cmluZz4+IHVwZGF0ZVN0YXRlbWVudHMpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGZvciAoUGFpcjxJbnRlZ2VyLCBTdHJpbmc+IHVwZGF0ZSA6IHVwZGF0ZVN0YXRlbWVudHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBmaWVsZFBvcyA9IHVwZGF0ZS5sZWZ0KCk7CisgICAgICAgICAgICBTdHJpbmcgc3RhdGVtZW50ID0gdXBkYXRlLnJpZ2h0KCk7CisKKyAgICAgICAgICAgIC8vIHJ1biB0aGUgdXBkYXRlIHN0YXRlbWVudCBhbmQgdXBkYXRlIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGNvbHVtbgorICAgICAgICAgICAgZXhlY3V0ZShzdGF0ZW1lbnQpOworCisgICAgICAgICAgICBPYmplY3RbXVtdIHJlcyA9IGdldFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1heHdyaXRldGltZShhKSwgbWF4d3JpdGV0aW1lKGwpLCBtYXh3cml0ZXRpbWUoZmwpLCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heHdyaXRldGltZShzKSwgbWF4d3JpdGV0aW1lKGZzKSwgbWF4d3JpdGV0aW1lKG0pLCBtYXh3cml0ZXRpbWUoZm0pLCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heHdyaXRldGltZSh0KSwgbWF4d3JpdGV0aW1lKGZ0KSBGUk9NICVzIFdIRVJFIGs9MSIpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgcmVzLmxlbmd0aCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJtYXh3cml0ZXRpbWUgc2hvdWxkIHdvcmsgb24gYm90aCBzaW5nbGUgY2VsbCBhbmQgY29tcGxleCBjb2x1bW5zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgcmVzWzBdLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKE9iamVjdCB0cyA6IHJlc1swXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHRzIGluc3RhbmNlb2YgTG9uZyk7IC8vIGFsbCB0aGUgcmVzdWx0IGZpZWxkcyBhcmUgdGltZXN0YW1wcworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsb25nIHVwZGF0ZWRUcyA9IChsb25nKSByZXNbMF1bZmllbGRQb3NdOyAvLyBtYXh3cml0ZXRpbWUgdGhlIHVwZGF0ZWQgY29sdW1uCisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzWzBdLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgdHMgPSAobG9uZykgcmVzWzBdW2ldOworICAgICAgICAgICAgICAgIGlmIChpICE9IGZpZWxkUG9zKQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdXBkYXRlZCBjb2x1bW4gc2hvdWxkIGhhdmUgYSBsYXJnZSBtYXh3cml0ZXRpbWUgc2luY2UgaXQgaXMgdXBkYXRlZCBsYXRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMgPCB1cGRhdGVkVHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogTWlncmF0ZWQgZnJvbSBjcWxfdGVzdHMucHk6VGVzdENRTC5pbnZhbGlkX2N1c3RvbV90aW1lc3RhbXBfdGVzdCgpCiAgICAgICovCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1RpbWV1dWlkVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9UaW1ldXVpZFRlc3QuamF2YQppbmRleCA5MzE0NTFlLi4xMzNlZDRlIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1RpbWV1dWlkVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVGltZXV1aWRUZXN0LmphdmEKQEAgLTU1LDE3ICs1NSwxOCBAQAogCiAgICAgICAgIGFzc2VydFJvd0NvdW50KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIHQgPSA/Iiwgcm93c1swXVsxXSksIDEpOwogCi0gICAgICAgIGFzc2VydEludmFsaWQoIlNFTEVDVCBkYXRlT2YoaykgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgdCA9ID8iLCByb3dzWzBdWzFdKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoImsgY2Fubm90IGJlIHBhc3NlZCBhcyBhcmd1bWVudCAwIG9mIGZ1bmN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCBtaW5fdGltZXV1aWQoaykgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgdCA9ID8iLCByb3dzWzBdWzFdKTsKIAogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykKICAgICAgICAgewogICAgICAgICAgICAgbG9uZyB0aW1lc3RhbXAgPSAoKFRpbWVVVUlEKSByb3dzW2ldWzFdKS51bml4KE1JTExJU0VDT05EUyk7Ci0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBkYXRlT2YodCksIHVuaXhUaW1lc3RhbXBPZih0KSBGUk9NICVzIFdIRVJFIGsgPSAwIEFORCB0ID0gPyIsIHJvd3NbaV1bMV0pLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgdG9fdGltZXN0YW1wKHQpLCB0b191bml4X3RpbWVzdGFtcCh0KSBGUk9NICVzIFdIRVJFIGsgPSAwIEFORCB0ID0gPyIsIHJvd3NbaV1bMV0pLAogICAgICAgICAgICAgICAgICAgICAgICByb3cobmV3IERhdGUodGltZXN0YW1wKSwgdGltZXN0YW1wKSk7CiAgICAgICAgIH0KIAotICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgdCBGUk9NICVzIFdIRVJFIGsgPSAwIEFORCB0ID4gbWF4VGltZXV1aWQoMTIzNDU2NykgQU5EIHQgPCBtaW5UaW1ldXVpZCgnMjAxMi0xMS0wNyAxODoxODoyMi0wODAwJykiKSk7Ci0gICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCB0IEZST00gJXMgV0hFUkUgayA9IDAgQU5EIHQgPiBtYXhUaW1ldXVpZCgxNTY0ODMwMTgyMDAwKSBBTkQgdCA8IG1pblRpbWV1dWlkKCcyMDEyLTExLTA3IDE4OjE4OjIyLTA4MDAnKSIpKTsKKyAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUIHQgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgdCA+IG1heF90aW1ldXVpZCgxMjM0NTY3KSBBTkQgdCA8IG1pbl90aW1ldXVpZCgnMjAxMi0xMS0wNyAxODoxODoyMi0wODAwJykiKSk7CisgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCB0IEZST00gJXMgV0hFUkUgayA9IDAgQU5EIHQgPiBtYXhfdGltZXV1aWQoMTU2NDgzMDE4MjAwMCkgQU5EIHQgPCBtaW5fdGltZXV1aWQoJzIwMTItMTEtMDcgMTg6MTg6MjItMDgwMCcpIikpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9UdXBsZVR5cGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1R1cGxlVHlwZVRlc3QuamF2YQppbmRleCA5ZjUzZGI0Li44ZTgzZmQyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1R1cGxlVHlwZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1R1cGxlVHlwZVRlc3QuamF2YQpAQCAtMzMsNiArMzMsNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5VbnR5cGVkUmVzdWx0U2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZUJ1ZmZlckFjY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVHVwbGVUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkFic3RyYWN0VHlwZUdlbmVyYXRvcnMuVHlwZVN1cHBvcnQ7CiBpbXBvcnQgb3JnLnF1aWNrdGhlb3JpZXMuY29yZS5HZW47CkBAIC0yNjYsNyArMjY3LDcgQEAKICAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciB2YWx1ZSA6IHRlc3RjYXNlLnVuaXF1ZVJvd3MpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbWFwLnB1dCh2YWx1ZSwgY291bnQpOwotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSB0dXBsZUJ1ZmZlcnMgPSB0dXBsZVR5cGUuc3BsaXQodmFsdWUpOworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJbXSB0dXBsZUJ1ZmZlcnMgPSB0dXBsZVR5cGUuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB2YWx1ZSk7CiAKICAgICAgICAgICAgICAgICAvLyB1c2UgY2FzdCB0byBhdm9pZCB3YXJuaW5nCiAgICAgICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGlkLCB2YWx1ZSkgVkFMVUVTICg/LCA/KSIsIHR1cGxlKChPYmplY3RbXSkgdHVwbGVCdWZmZXJzKSwgY291bnQpOwpAQCAtMzA0LDcgKzMwNSw3IEBACiAgICAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgdmFsdWUgOiB0ZXN0Y2FzZS51bmlxdWVSb3dzKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG1hcC5wdXQodmFsdWUsIGNvdW50KTsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyW10gdHVwbGVCdWZmZXJzID0gdHVwbGVUeXBlLnNwbGl0KHZhbHVlKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyW10gdHVwbGVCdWZmZXJzID0gdHVwbGVUeXBlLnNwbGl0KEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgdmFsdWUpOwogCiAgICAgICAgICAgICAgICAgLy8gdXNlIGNhc3QgdG8gYXZvaWQgd2FybmluZwogICAgICAgICAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgY2ssIHZhbHVlKSBWQUxVRVMgKD8sID8sID8pIiwgMSwgdHVwbGUoKE9iamVjdFtdKSB0dXBsZUJ1ZmZlcnMpLCBjb3VudCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1R5cGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1R5cGVUZXN0LmphdmEKaW5kZXggY2ViOTZiNi4uMTE5YTBmZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9UeXBlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVHlwZVRlc3QuamF2YQpAQCAtNDksMTIgKzQ5LDggQEAKICAgICB7CiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGEgaW50LCBiIHRpbWVzdGFtcCwgYyBiaWdpbnQsIGQgdmFyaW50LCBQUklNQVJZIEtFWSAoYSwgYiwgYywgZCkpIik7CiAKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGEsIGIsIGMsIGQpIFZBTFVFUyAoMCwgdG9Vbml4VGltZXN0YW1wKG5vdygpKSwgdG9UaW1lc3RhbXAobm93KCkpLCB0b1RpbWVzdGFtcChub3coKSkpIik7Ci0gICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0cyA9IGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYT0wIEFORCBiIDw9IHRvVW5peFRpbWVzdGFtcChub3coKSkiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdHMuc2l6ZSgpKTsKLQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYywgZCkgVkFMVUVTICgxLCB1bml4VGltZXN0YW1wT2Yobm93KCkpLCBkYXRlT2Yobm93KCkpLCBkYXRlT2Yobm93KCkpKSIpOwotICAgICAgICByZXN1bHRzID0gZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBhPTEgQU5EIGIgPD0gdG9Vbml4VGltZXN0YW1wKG5vdygpKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYywgZCkgVkFMVUVTICgwLCB0b191bml4X3RpbWVzdGFtcChub3coKSksIHRvX3RpbWVzdGFtcChub3coKSksIHRvX3RpbWVzdGFtcChub3coKSkpIik7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0cyA9IGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYT0wIEFORCBiIDw9IHRvX3VuaXhfdGltZXN0YW1wKG5vdygpKSIpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0cy5zaXplKCkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9VRkF1dGhUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGQXV0aFRlc3QuamF2YQppbmRleCA0YTJkNzFmLi45NjgxODI3IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGQXV0aFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGQXV0aFRlc3QuamF2YQpAQCAtMjgsOSArMjgsOSBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuVXNlckZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLkZ1bmN0aW9uTmFtZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuQmF0Y2hTdGF0ZW1lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLk1vZGlmaWNhdGlvblN0YXRlbWVudDsKQEAgLTMxMSwxNCArMzExLDE0IEBACiAgICAgcHVibGljIHZvaWQgc3lzdGVtRnVuY3Rpb25zUmVxdWlyZU5vRXhwbGljaXRQcml2aWxlZ2VzKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgLy8gd2l0aCB0ZXJtaW5hbCBhcmd1bWVudHMsIHNvIGV2YWx1YXRlZCBhdCBwcmVwYXJlIHRpbWUKLSAgICAgICAgU3RyaW5nIGNxbCA9IFN0cmluZy5mb3JtYXQoIlVQREFURSAlcyBTRVQgdjIgPSAwIFdIRVJFIGsgPSBibG9iYXNpbnQoaW50YXNibG9iKDApKSBhbmQgdjEgPSAwIiwKKyAgICAgICAgU3RyaW5nIGNxbCA9IFN0cmluZy5mb3JtYXQoIlVQREFURSAlcyBTRVQgdjIgPSAwIFdIRVJFIGsgPSBibG9iX2FzX2ludChpbnRfYXNfYmxvYigwKSkgYW5kIHYxID0gMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWVNQQUNFICsgIi4iICsgY3VycmVudFRhYmxlKCkpOwogICAgICAgICBnZXRTdGF0ZW1lbnQoY3FsKS5hdXRob3JpemUoY2xpZW50U3RhdGUpOwogCiAgICAgICAgIC8vIHdpdGggbm9uLXRlcm1pbmFsIGFyZ3VtZW50cywgc28gZXZhbHVhdGVkIGF0IGV4ZWN1dGlvbgogICAgICAgICBTdHJpbmcgZnVuY3Rpb25OYW1lID0gY3JlYXRlU2ltcGxlRnVuY3Rpb24oKTsKICAgICAgICAgZ3JhbnRFeGVjdXRlT25GdW5jdGlvbihmdW5jdGlvbk5hbWUpOwotICAgICAgICBjcWwgPSBTdHJpbmcuZm9ybWF0KCJVUERBVEUgJXMgU0VUIHYyID0gMCBXSEVSRSBrID0gYmxvYmFzaW50KGludGFzYmxvYiglcykpIGFuZCB2MSA9IDAiLAorICAgICAgICBjcWwgPSBTdHJpbmcuZm9ybWF0KCJVUERBVEUgJXMgU0VUIHYyID0gMCBXSEVSRSBrID0gYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoJXMpKSBhbmQgdjEgPSAwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTUEFDRSArICIuIiArIGN1cnJlbnRUYWJsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQ2FsbChmdW5jdGlvbk5hbWUpKTsKICAgICAgICAgZ2V0U3RhdGVtZW50KGNxbCkuYXV0aG9yaXplKGNsaWVudFN0YXRlKTsKQEAgLTYzNSw3ICs2MzUsNyBAQAogICAgICAgICAvLyBJdCBpcyBoZXJlIHRvIGF2b2lkIGhhdmluZyB0byBkdXBsaWNhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgQ3FsUGFyc2VyCiAgICAgICAgIC8vIGZvciB0cmFuc2Zvcm1pbmcgY3FsIHR5cGVzIGludG8gQWJzdHJhY3RUeXBlcwogICAgICAgICBGdW5jdGlvbk5hbWUgZm4gPSBwYXJzZUZ1bmN0aW9uTmFtZShmdW5jdGlvbk5hbWUpOwotICAgICAgICBDb2xsZWN0aW9uPEZ1bmN0aW9uPiBmdW5jdGlvbnMgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0RnVuY3Rpb25zKGZuKTsKKyAgICAgICAgQ29sbGVjdGlvbjxVc2VyRnVuY3Rpb24+IGZ1bmN0aW9ucyA9IFNjaGVtYS5pbnN0YW5jZS5nZXRVc2VyRnVuY3Rpb25zKGZuKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIGEgc2luZ2xlIGZ1bmN0aW9uIGRlZmluaXRpb24gZm9yICVzLCBidXQgZm91bmQgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9ucy5zaXplKCkpLApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9VRkphdmFUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGSmF2YVRlc3QuamF2YQppbmRleCA0N2YxY2JmLi5hZDU5YjRjIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGSmF2YVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGSmF2YVRlc3QuamF2YQpAQCAtNjU3LDcgKzY1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJCRyZXR1cm4gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICB1ZHQuZ2V0U3RyaW5nKFwidHh0XCIpOyQkOyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmTmFtZTFyZXBsYWNlLCB0eXBlKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldEZ1bmN0aW9ucyhwYXJzZUZ1bmN0aW9uTmFtZShmTmFtZTFyZXBsYWNlKSkuc2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBTY2hlbWEuaW5zdGFuY2UuZ2V0VXNlckZ1bmN0aW9ucyhwYXJzZUZ1bmN0aW9uTmFtZShmTmFtZTFyZXBsYWNlKSkuc2l6ZSgpKTsKICAgICAgICAgZXhlY3V0ZShTdHJpbmcuZm9ybWF0KCJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAlcyggdWR0ICVzICkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0FMTEVEIE9OIE5VTEwgSU5QVVQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCkBAIC02NjUsNyArNjY1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAkJHJldHVybiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgIEludGVnZXIudmFsdWVPZih1ZHQuZ2V0SW50KFwiaVwiKSk7JCQ7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZOYW1lMnJlcGxhY2UsIHR5cGUpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBTY2hlbWEuaW5zdGFuY2UuZ2V0RnVuY3Rpb25zKHBhcnNlRnVuY3Rpb25OYW1lKGZOYW1lMnJlcGxhY2UpKS5zaXplKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFNjaGVtYS5pbnN0YW5jZS5nZXRVc2VyRnVuY3Rpb25zKHBhcnNlRnVuY3Rpb25OYW1lKGZOYW1lMnJlcGxhY2UpKS5zaXplKCkpOwogICAgICAgICBleGVjdXRlKFN0cmluZy5mb3JtYXQoIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKCB1ZHQgJXMgKSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKQEAgLTY3Myw3ICs2NzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICQkcmV0dXJuICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgRG91YmxlLnZhbHVlT2YodWR0LmdldERvdWJsZShcImFkZGVkXCIpKTskJDsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk5hbWUzcmVwbGFjZSwgdHlwZSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFNjaGVtYS5pbnN0YW5jZS5nZXRGdW5jdGlvbnMocGFyc2VGdW5jdGlvbk5hbWUoZk5hbWUzcmVwbGFjZSkpLnNpemUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldFVzZXJGdW5jdGlvbnMocGFyc2VGdW5jdGlvbk5hbWUoZk5hbWUzcmVwbGFjZSkpLnNpemUoKSk7CiAgICAgICAgIGV4ZWN1dGUoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXMoIHVkdCAlcyApICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgJXMgIiArCkBAIC02ODEsNyArNjgxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAkJHJldHVybiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgIHVkdDskJDsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZk5hbWU0cmVwbGFjZSwgdHlwZSwgdHlwZSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFNjaGVtYS5pbnN0YW5jZS5nZXRGdW5jdGlvbnMocGFyc2VGdW5jdGlvbk5hbWUoZk5hbWU0cmVwbGFjZSkpLnNpemUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldFVzZXJGdW5jdGlvbnMocGFyc2VGdW5jdGlvbk5hbWUoZk5hbWU0cmVwbGFjZSkpLnNpemUoKSk7CiAKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZOYW1lMXJlcGxhY2UgKyAiKHVkdCkgRlJPTSAlcyBXSEVSRSBrZXkgPSAyIiksCiAgICAgICAgICAgICAgICAgICAgcm93KCJ0d28iKSk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGUHVyZVNjcmlwdFR1cGxlQ29sbGVjdGlvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVUZQdXJlU2NyaXB0VHVwbGVDb2xsZWN0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTgwMWIzLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVUZQdXJlU2NyaXB0VHVwbGVDb2xsZWN0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy52YWxpZGF0aW9uLmVudGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5EYXRhVHlwZTsKLWltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuVHVwbGVUeXBlOwotaW1wb3J0IGNvbS5kYXRhc3RheC5kcml2ZXIuY29yZS5UdXBsZVZhbHVlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBVRlB1cmVTY3JpcHRUdXBsZUNvbGxlY3Rpb25UZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCi17Ci0gICAgLy8gSnVzdCBKYXZhU2NyaXB0IFVERnMgdG8gY2hlY2sgaG93IFVERiAtIGVzcGVjaWFsbHkgc2VjdXJpdHkvY2xhc3MtbG9hZGluZy9zYW5kYm94aW5nIHN0dWZmIC0KLSAgICAvLyBiZWhhdmVzLCBpZiBubyBKYXZhIFVERiBoYXMgYmVlbiBleGVjdXRlZCBiZWZvcmUuCi0KLSAgICAvLyBEbyBub3QgYWRkIGFueSBvdGhlciB0ZXN0IGhlcmUhCi0gICAgLy8gU2VlIENBU1NBTkRSQS0xMDE0MQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YXNjcmlwdFR1cGxlVHlwZUNvbGxlY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBTdHJpbmcgdHVwbGVUeXBlRGVmID0gInR1cGxlPGRvdWJsZSwgbGlzdDxkb3VibGU+LCBzZXQ8dGV4dD4sIG1hcDxpbnQsIGJvb2xlYW4+PiI7Ci0gICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGtleSBpbnQgcHJpbWFyeSBrZXksIHR1cCBmcm96ZW48IiArIHR1cGxlVHlwZURlZiArICI+KSIpOwotCi0gICAgICAgIFN0cmluZyBmVHVwMSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFX1BFUl9URVNULCB0dXBsZVR5cGVEZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMoIHR1cCAiICsgdHVwbGVUeXBlRGVmICsgIiApICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIHR1cGxlPGRvdWJsZSwgbGlzdDxkb3VibGU+LCBzZXQ8dGV4dD4sIG1hcDxpbnQsIGJvb2xlYW4+PiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJCQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICB0dXA7JCQ7Iik7Ci0gICAgICAgIFN0cmluZyBmVHVwMiA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFX1BFUl9URVNULCB0dXBsZVR5cGVEZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMoIHR1cCAiICsgdHVwbGVUeXBlRGVmICsgIiApICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJCQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICB0dXAuZ2V0RG91YmxlKDApOyQkOyIpOwotICAgICAgICBTdHJpbmcgZlR1cDMgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRV9QRVJfVEVTVCwgdHVwbGVUeXBlRGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKCB0dXAgIiArIHR1cGxlVHlwZURlZiArICIgKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBsaXN0PGRvdWJsZT4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICQkIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgdHVwLmdldExpc3QoMSwgamF2YS5sYW5nLkRvdWJsZS5jbGFzcyk7JCQ7Iik7Ci0gICAgICAgIFN0cmluZyBmVHVwNCA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFX1BFUl9URVNULCB0dXBsZVR5cGVEZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMoIHR1cCAiICsgdHVwbGVUeXBlRGVmICsgIiApICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIHNldDx0ZXh0PiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJCQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICB0dXAuZ2V0U2V0KDIsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOyQkOyIpOwotICAgICAgICBTdHJpbmcgZlR1cDUgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRV9QRVJfVEVTVCwgdHVwbGVUeXBlRGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKCB0dXAgIiArIHR1cGxlVHlwZURlZiArICIgKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBtYXA8aW50LCBib29sZWFuPiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJCQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICB0dXAuZ2V0TWFwKDMsIGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLCBqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcyk7JCQ7Iik7Ci0KLSAgICAgICAgTGlzdDxEb3VibGU+IGxpc3QgPSBBcnJheXMuYXNMaXN0KDFkLCAyZCwgM2QpOwotICAgICAgICBTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgVHJlZVNldDw+KEFycmF5cy5hc0xpc3QoIm9uZSIsICJ0aHJlZSIsICJ0d28iKSk7Ci0gICAgICAgIE1hcDxJbnRlZ2VyLCBCb29sZWFuPiBtYXAgPSBuZXcgVHJlZU1hcDw+KCk7Ci0gICAgICAgIG1hcC5wdXQoMSwgdHJ1ZSk7Ci0gICAgICAgIG1hcC5wdXQoMiwgZmFsc2UpOwotICAgICAgICBtYXAucHV0KDMsIHRydWUpOwotCi0gICAgICAgIE9iamVjdCB0ID0gdHVwbGUoMWQsIGxpc3QsIHNldCwgbWFwKTsKLQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoa2V5LCB0dXApIFZBTFVFUyAoMSwgPykiLCB0KTsKLQotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAiICsgZlR1cDEgKyAiKHR1cCkgRlJPTSAlcyBXSEVSRSBrZXkgPSAxIiksCi0gICAgICAgICAgICAgICAgICAgcm93KHQpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZUdXAyICsgIih0dXApIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdygxZCkpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAiICsgZlR1cDMgKyAiKHR1cCkgRlJPTSAlcyBXSEVSRSBrZXkgPSAxIiksCi0gICAgICAgICAgICAgICAgICAgcm93KGxpc3QpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZUdXA0ICsgIih0dXApIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdyhzZXQpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZUdXA1ICsgIih0dXApIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdyhtYXApKTsKLQotICAgICAgICAvLyBzYW1lIHRlc3QgLSBidXQgdmlhIG5hdGl2ZSBwcm90b2NvbAotICAgICAgICAvLyB3ZSB1c2UgcHJvdG9jb2wgVjMgaGVyZSB0byBlbmNvZGUgdGhlIGV4cGVjdGVkIHZlcnNpb24gYmVjYXVzZSB0aGUgc2VydmVyCi0gICAgICAgIC8vIGFsd2F5cyBzZXJpYWxpemVzIENvbGxlY3Rpb25zIHVzaW5nIFYzIC0gc2VlIENvbGxlY3Rpb25TZXJpYWxpemVyJ3MKLSAgICAgICAgLy8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBtZXRob2RzLgotICAgICAgICBUdXBsZVR5cGUgdFR5cGUgPSB0dXBsZVR5cGVPZihQcm90b2NvbFZlcnNpb24uVjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFUeXBlLmNkb3VibGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUubGlzdChEYXRhVHlwZS5jZG91YmxlKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZS5zZXQoRGF0YVR5cGUudGV4dCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUubWFwKERhdGFUeXBlLmNpbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFUeXBlLmNib29sZWFuKCkpKTsKLSAgICAgICAgVHVwbGVWYWx1ZSB0dXAgPSB0VHlwZS5uZXdWYWx1ZSgxZCwgbGlzdCwgc2V0LCBtYXApOwotICAgICAgICBmb3IgKFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uIDogUFJPVE9DT0xfVkVSU0lPTlMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydFJvd3NOZXQodmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU5ldCh2ZXJzaW9uLCAiU0VMRUNUICIgKyBmVHVwMSArICIodHVwKSBGUk9NICVzIFdIRVJFIGtleSA9IDEiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KHR1cCkpOwotICAgICAgICAgICAgYXNzZXJ0Um93c05ldCh2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlTmV0KHZlcnNpb24sICJTRUxFQ1QgIiArIGZUdXAyICsgIih0dXApIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICByb3coMWQpKTsKLSAgICAgICAgICAgIGFzc2VydFJvd3NOZXQodmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU5ldCh2ZXJzaW9uLCAiU0VMRUNUICIgKyBmVHVwMyArICIodHVwKSBGUk9NICVzIFdIRVJFIGtleSA9IDEiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGxpc3QpKTsKLSAgICAgICAgICAgIGFzc2VydFJvd3NOZXQodmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZU5ldCh2ZXJzaW9uLCAiU0VMRUNUICIgKyBmVHVwNCArICIodHVwKSBGUk9NICVzIFdIRVJFIGtleSA9IDEiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KHNldCkpOwotICAgICAgICAgICAgYXNzZXJ0Um93c05ldCh2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlTmV0KHZlcnNpb24sICJTRUxFQ1QgIiArIGZUdXA1ICsgIih0dXApIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICByb3cobWFwKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGU2NyaXB0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9VRlNjcmlwdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzM2U2Zi4uMDAwMDAwMAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGU2NyaXB0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy52YWxpZGF0aW9uLmVudGl0aWVzOwotCi1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlVVSUQ7Ci0KLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5mdW5jdGlvbnMuRnVuY3Rpb25OYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuRnVuY3Rpb25FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwotCi1wdWJsaWMgY2xhc3MgVUZTY3JpcHRUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCi17Ci0gICAgLy8gSnVzdCBKYXZhU2NyaXB0IFVERnMgdG8gY2hlY2sgaG93IFVERiAtIGVzcGVjaWFsbHkgc2VjdXJpdHkvY2xhc3MtbG9hZGluZy9zYW5kYm94aW5nIHN0dWZmIC0KLSAgICAvLyBiZWhhdmVzLCBpZiBubyBKYXZhIFVERiBoYXMgYmVlbiBleGVjdXRlZCBiZWZvcmUuCi0KLSAgICAvLyBEbyBub3QgYWRkIGFueSBvdGhlciB0ZXN0IGhlcmUgLSBlc3BlY2lhbGx5IG5vbmUgdXNpbmcgSmF2YSBVREZzCi0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhc2NyaXB0U2ltcGxlQ29sbGVjdGlvbnMoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrZXkgaW50IHByaW1hcnkga2V5LCBsc3QgbGlzdDxkb3VibGU+LCBzdCBzZXQ8dGV4dD4sIG1wIG1hcDxpbnQsIGJvb2xlYW4+KSIpOwotCi0gICAgICAgIFN0cmluZyBmTmFtZTEgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRV9QRVJfVEVTVCwgImxpc3Q8ZG91YmxlPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKCBsc3QgbGlzdDxkb3VibGU+ICkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBsaXN0PGRvdWJsZT4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ2xzdDsnOyIpOwotICAgICAgICBTdHJpbmcgZk5hbWUyID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0VfUEVSX1RFU1QsICJzZXQ8dGV4dD4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiAlcyggc3Qgc2V0PHRleHQ+ICkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBzZXQ8dGV4dD4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3N0Oyc7Iik7Ci0gICAgICAgIFN0cmluZyBmTmFtZTMgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRV9QRVJfVEVTVCwgIm1hcDxpbnQsIGJvb2xlYW4+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMoIG1wIG1hcDxpbnQsIGJvb2xlYW4+ICkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBtYXA8aW50LCBib29sZWFuPiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnbXA7JzsiKTsKLQotICAgICAgICBMaXN0PERvdWJsZT4gbGlzdCA9IEFycmF5cy5hc0xpc3QoMWQsIDJkLCAzZCk7Ci0gICAgICAgIFNldDxTdHJpbmc+IHNldCA9IG5ldyBUcmVlU2V0PD4oQXJyYXlzLmFzTGlzdCgib25lIiwgInRocmVlIiwgInR3byIpKTsKLSAgICAgICAgTWFwPEludGVnZXIsIEJvb2xlYW4+IG1hcCA9IG5ldyBUcmVlTWFwPD4oKTsKLSAgICAgICAgbWFwLnB1dCgxLCB0cnVlKTsKLSAgICAgICAgbWFwLnB1dCgyLCBmYWxzZSk7Ci0gICAgICAgIG1hcC5wdXQoMywgdHJ1ZSk7Ci0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgbHN0LCBzdCwgbXApIFZBTFVFUyAoMSwgPywgPywgPykiLCBsaXN0LCBzZXQsIG1hcCk7Ci0KLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbHN0LCBzdCwgbXAgRlJPTSAlcyBXSEVSRSBrZXkgPSAxIiksCi0gICAgICAgICAgICAgICAgICAgcm93KGxpc3QsIHNldCwgbWFwKSk7Ci0KLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZOYW1lMSArICIobHN0KSwgIiArIGZOYW1lMiArICIoc3QpLCAiICsgZk5hbWUzICsgIihtcCkgRlJPTSAlcyBXSEVSRSBrZXkgPSAxIiksCi0gICAgICAgICAgICAgICAgICAgcm93KGxpc3QsIHNldCwgbWFwKSk7Ci0KLSAgICAgICAgZm9yIChQcm90b2NvbFZlcnNpb24gdmVyc2lvbiA6IFBST1RPQ09MX1ZFUlNJT05TKQotICAgICAgICAgICAgYXNzZXJ0Um93c05ldCh2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlTmV0KHZlcnNpb24sICJTRUxFQ1QgIiArIGZOYW1lMSArICIobHN0KSwgIiArIGZOYW1lMiArICIoc3QpLCAiICsgZk5hbWUzICsgIihtcCkgRlJPTSAlcyBXSEVSRSBrZXkgPSAxIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhsaXN0LCBzZXQsIG1hcCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEphdmFzY3JpcHRUdXBsZVR5cGUoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrZXkgaW50IHByaW1hcnkga2V5LCB0dXAgZnJvemVuPHR1cGxlPGRvdWJsZSwgdGV4dCwgaW50LCBib29sZWFuPj4pIik7Ci0KLSAgICAgICAgU3RyaW5nIGZOYW1lID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0VfUEVSX1RFU1QsICJ0dXBsZTxkb3VibGUsIHRleHQsIGludCwgYm9vbGVhbj4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKCB0dXAgdHVwbGU8ZG91YmxlLCB0ZXh0LCBpbnQsIGJvb2xlYW4+ICkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgdHVwbGU8ZG91YmxlLCB0ZXh0LCBpbnQsIGJvb2xlYW4+ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAkJHR1cDskJDsiKTsKLQotICAgICAgICBPYmplY3QgdCA9IHR1cGxlKDFkLCAiZm9vIiwgMiwgdHJ1ZSk7Ci0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgdHVwKSBWQUxVRVMgKDEsID8pIiwgdCk7Ci0KLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgdHVwIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdyh0KSk7Ci0KLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZOYW1lICsgIih0dXApIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdyh0KSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YXNjcmlwdFVzZXJUeXBlKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgU3RyaW5nIHR5cGUgPSBjcmVhdGVUeXBlKCJDUkVBVEUgVFlQRSAlcyAodHh0IHRleHQsIGkgaW50KSIpOwotCi0gICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGtleSBpbnQgcHJpbWFyeSBrZXksIHVkdCBmcm96ZW48IiArIHR5cGUgKyAiPikiKTsKLQotICAgICAgICBTdHJpbmcgZlVkdDEgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRSwgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiAlcyggdWR0ICIgKyB0eXBlICsgIiApICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TICIgKyB0eXBlICsgJyAnICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJCQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgdWR0OyQkOyIpOwotICAgICAgICBTdHJpbmcgZlVkdDIgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRSwgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiAlcyggdWR0ICIgKyB0eXBlICsgIiApICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIHRleHQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICQkIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgIHVkdC5nZXRTdHJpbmcoXCJ0eHRcIik7JCQ7Iik7Ci0gICAgICAgIFN0cmluZyBmVWR0MyA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKCB1ZHQgIiArIHR5cGUgKyAiICkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgaW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAkJCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICB1ZHQuZ2V0SW50KFwiaVwiKTskJDsiKTsKLQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoa2V5LCB1ZHQpIFZBTFVFUyAoMSwge3R4dDogJ29uZScsIGk6MX0pIik7Ci0KLSAgICAgICAgVW50eXBlZFJlc3VsdFNldCByb3dzID0gZXhlY3V0ZSgiU0VMRUNUICIgKyBmVWR0MSArICIodWR0KSBGUk9NICVzIFdIRVJFIGtleSA9IDEiKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCByb3dzLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICIgKyBmVWR0MiArICIodWR0KSBGUk9NICVzIFdIRVJFIGtleSA9IDEiKSwKLSAgICAgICAgICAgICAgICAgICByb3coIm9uZSIpKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZVZHQzICsgIih1ZHQpIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdygxKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SmF2YXNjcmlwdFVUQ29sbGVjdGlvbnMoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBTdHJpbmcgdHlwZSA9IGNyZWF0ZVR5cGUoIkNSRUFURSBUWVBFICVzICh0eHQgdGV4dCwgaSBpbnQpIik7Ci0KLSAgICAgICAgY3JlYXRlVGFibGUoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGtleSBpbnQgcHJpbWFyeSBrZXksIGxzdCBsaXN0PGZyb3plbjwlcz4+LCBzdCBzZXQ8ZnJvemVuPCVzPj4sIG1wIG1hcDxpbnQsIGZyb3plbjwlcz4+KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgdHlwZSwgdHlwZSkpOwotCi0gICAgICAgIFN0cmluZyBmTmFtZSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLCAibGlzdDxmcm96ZW48IiArIHR5cGUgKyAiPj4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKCBsc3QgbGlzdDxmcm96ZW48IiArIHR5cGUgKyAiPj4gKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyB0ZXh0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAkJCIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBsc3QuZ2V0KDEpLmdldFN0cmluZyhcInR4dFwiKTskJDsiKTsKLSAgICAgICAgY3JlYXRlRnVuY3Rpb25PdmVybG9hZChmTmFtZSwgInNldDxmcm96ZW48IiArIHR5cGUgKyAiPj4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMoIHN0IHNldDxmcm96ZW48IiArIHR5cGUgKyAiPj4gKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgdGV4dCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICQkIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgc3QuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3RyaW5nKFwidHh0XCIpOyQkOyIpOwotICAgICAgICBjcmVhdGVGdW5jdGlvbk92ZXJsb2FkKGZOYW1lLCAibWFwPGludCwgZnJvemVuPCIgKyB0eXBlICsgIj4+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKCBtcCBtYXA8aW50LCBmcm96ZW48IiArIHR5cGUgKyAiPj4gKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgdGV4dCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICQkIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgbXAuZ2V0KGphdmEubGFuZy5JbnRlZ2VyLnZhbHVlT2YoMykpLmdldFN0cmluZyhcInR4dFwiKTskJDsiKTsKLQotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoa2V5LCBsc3QsIHN0LCBtcCkgdmFsdWVzICgxLCAiICsKLSAgICAgICAgICAgICAgICAvLyBsaXN0PGZyb3plbjxVRFQ+PgotICAgICAgICAgICAgICAgICJbIHt0eHQ6ICdvbmUnLCBpOjF9LCB7dHh0OiAndGhyZWUnLCBpOjF9LCB7dHh0OiAnb25lJywgaToxfSBdICwgIiArCi0gICAgICAgICAgICAgICAgLy8gc2V0PGZyb3plbjxVRFQ+PgotICAgICAgICAgICAgICAgICJ7IHt0eHQ6ICdvbmUnLCBpOjF9LCB7dHh0OiAndGhyZWUnLCBpOjN9LCB7dHh0OiAndHdvJywgaToyfSB9LCAiICsKLSAgICAgICAgICAgICAgICAvLyBtYXA8aW50LCBmcm96ZW48VURUPj4KLSAgICAgICAgICAgICAgICAieyAxOiB7dHh0OiAnb25lJywgaToxfSwgMjoge3R4dDogJ29uZScsIGk6M30sIDM6IHt0eHQ6ICd0d28nLCBpOjJ9IH0pIik7Ci0KLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGZOYW1lICsgIihsc3QpIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdygidGhyZWUiKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICIgKyBmTmFtZSArICIoc3QpIEZST00gJXMgV0hFUkUga2V5ID0gMSIpLAotICAgICAgICAgICAgICAgICAgIHJvdygib25lIikpOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAiICsgZk5hbWUgKyAiKG1wKSBGUk9NICVzIFdIRVJFIGtleSA9IDEiKSwKLSAgICAgICAgICAgICAgICAgICByb3coInR3byIpKTsKLQotICAgICAgICBTdHJpbmcgY3FsU2VsZWN0ID0gIlNFTEVDVCAiICsgZk5hbWUgKyAiKGxzdCksICIgKyBmTmFtZSArICIoc3QpLCAiICsgZk5hbWUgKyAiKG1wKSBGUk9NICVzIFdIRVJFIGtleSA9IDEiOwotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoY3FsU2VsZWN0KSwKLSAgICAgICAgICAgICAgICAgICByb3coInRocmVlIiwgIm9uZSIsICJ0d28iKSk7Ci0KLSAgICAgICAgLy8gc2FtZSB0ZXN0IC0gYnV0IHZpYSBuYXRpdmUgcHJvdG9jb2wKLSAgICAgICAgZm9yIChQcm90b2NvbFZlcnNpb24gdmVyc2lvbiA6IFBST1RPQ09MX1ZFUlNJT05TKQotICAgICAgICAgICAgYXNzZXJ0Um93c05ldCh2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlTmV0KHZlcnNpb24sIGNxbFNlbGVjdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygidGhyZWUiLCAib25lIiwgInR3byIpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhc2NyaXB0RnVuY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrZXkgaW50IHByaW1hcnkga2V5LCB2YWwgZG91YmxlKSIpOwotCi0gICAgICAgIFN0cmluZyBmdW5jdGlvbkJvZHkgPSAnXG4nICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIE1hdGguc2luKHZhbCk7XG4iOwotCi0gICAgICAgIFN0cmluZyBmTmFtZSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLCAiZG91YmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKHZhbCBkb3VibGUpICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyIgKyBmdW5jdGlvbkJvZHkgKyAiJzsiKTsKLQotICAgICAgICBGdW5jdGlvbk5hbWUgZk5hbWVOYW1lID0gcGFyc2VGdW5jdGlvbk5hbWUoZk5hbWUpOwotCi0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGxhbmd1YWdlLCBib2R5IEZST00gc3lzdGVtX3NjaGVtYS5mdW5jdGlvbnMgV0hFUkUga2V5c3BhY2VfbmFtZT0/IEFORCBmdW5jdGlvbl9uYW1lPT8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZk5hbWVOYW1lLmtleXNwYWNlLCBmTmFtZU5hbWUubmFtZSksCi0gICAgICAgICAgICAgICAgICAgcm93KCJqYXZhc2NyaXB0IiwgZnVuY3Rpb25Cb2R5KSk7Ci0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgdmFsKSBWQUxVRVMgKD8sID8pIiwgMSwgMWQpOwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoa2V5LCB2YWwpIFZBTFVFUyAoPywgPykiLCAyLCAyZCk7Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrZXksIHZhbCkgVkFMVUVTICg/LCA/KSIsIDMsIDNkKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1Qga2V5LCB2YWwsICIgKyBmTmFtZSArICIodmFsKSBGUk9NICVzIiksCi0gICAgICAgICAgICAgICAgICAgcm93KDEsIDFkLCBNYXRoLnNpbigxZCkpLAotICAgICAgICAgICAgICAgICAgIHJvdygyLCAyZCwgTWF0aC5zaW4oMmQpKSwKLSAgICAgICAgICAgICAgICAgICByb3coMywgM2QsIE1hdGguc2luKDNkKSkKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhc2NyaXB0QmFkUmV0dXJuVHlwZSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGtleSBpbnQgcHJpbWFyeSBrZXksIHZhbCBkb3VibGUpIik7Ci0KLSAgICAgICAgU3RyaW5nIGZOYW1lID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0UsICJkb3VibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXModmFsIGRvdWJsZSkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgZG91YmxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnXCJzdHJpbmdcIjsnOyIpOwotCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrZXksIHZhbCkgVkFMVUVTICg/LCA/KSIsIDEsIDFkKTsKLSAgICAgICAgLy8gdGhyb3dzIElSRSB3aXRoIENsYXNzQ2FzdEV4Y2VwdGlvbgotICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCB2YWx1ZSBmb3IgQ1FMIHR5cGUgZG91YmxlIiwgIlNFTEVDVCBrZXksIHZhbCwgIiArIGZOYW1lICsgIih2YWwpIEZST00gJXMiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhc2NyaXB0VGhyb3coKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrZXkgaW50IHByaW1hcnkga2V5LCB2YWwgZG91YmxlKSIpOwotCi0gICAgICAgIFN0cmluZyBmTmFtZSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLCAiZG91YmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKHZhbCBkb3VibGUpICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3Rocm93IFwiZm9vbFwiOyc7Iik7Ci0KLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgdmFsKSBWQUxVRVMgKD8sID8pIiwgMSwgMWQpOwotICAgICAgICAvLyB0aHJvd3MgSVJFIHdpdGggU2NyaXB0RXhjZXB0aW9uCi0gICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoImZvb2wiLCBGdW5jdGlvbkV4ZWN1dGlvbkV4Y2VwdGlvbi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIGtleSwgdmFsLCAiICsgZk5hbWUgKyAiKHZhbCkgRlJPTSAlcyIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcmlwdFJldHVyblR5cGVDYXN0aW5nKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoa2V5IGludCBwcmltYXJ5IGtleSwgdmFsIGRvdWJsZSkiKTsKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgdmFsKSBWQUxVRVMgKD8sID8pIiwgMSwgMWQpOwotCi0gICAgICAgIE9iamVjdFtdW10gdmFyaWF0aW9ucyA9IHsKLSAgICAgICAgbmV3IE9iamVjdFtdICAgIHsgICAidHJ1ZSIsICAgICAiYm9vbGVhbiIsICB0cnVlICAgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSAgICB7ICAgImZhbHNlIiwgICAgImJvb2xlYW4iLCAgZmFsc2UgICB9LAotICAgICAgICBuZXcgT2JqZWN0W10gICAgeyAgICIxMDAiLCAgICAgICJ0aW55aW50IiwgIChieXRlKTEwMCB9LAotICAgICAgICBuZXcgT2JqZWN0W10gICAgeyAgICIxMDAuIiwgICAgICJ0aW55aW50IiwgIChieXRlKTEwMCB9LAotICAgICAgICBuZXcgT2JqZWN0W10gICAgeyAgICIxMDAiLCAgICAgICJzbWFsbGludCIsIChzaG9ydCkxMDAgfSwKLSAgICAgICAgbmV3IE9iamVjdFtdICAgIHsgICAiMTAwLiIsICAgICAic21hbGxpbnQiLCAoc2hvcnQpMTAwIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSAgICB7ICAgIjEwMCIsICAgICAgImludCIsICAgICAgMTAwICAgICB9LAotICAgICAgICBuZXcgT2JqZWN0W10gICAgeyAgICIxMDAuIiwgICAgICJpbnQiLCAgICAgIDEwMCAgICAgfSwKLSAgICAgICAgbmV3IE9iamVjdFtdICAgIHsgICAiMTAwIiwgICAgICAiZG91YmxlIiwgICAxMDBkICAgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSAgICB7ICAgIjEwMC4iLCAgICAgImRvdWJsZSIsICAgMTAwZCAgICB9LAotICAgICAgICBuZXcgT2JqZWN0W10gICAgeyAgICIxMDAiLCAgICAgICJiaWdpbnQiLCAgIDEwMEwgICAgfSwKLSAgICAgICAgbmV3IE9iamVjdFtdICAgIHsgICAiMTAwLiIsICAgICAiYmlnaW50IiwgICAxMDBMICAgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSAgICB7ICIxMDAiLCAidmFyaW50IiwgQmlnSW50ZWdlci52YWx1ZU9mKDEwMEwpICAgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSAgICB7ICAgIjEwMC4iLCAgICAgInZhcmludCIsICAgQmlnSW50ZWdlci52YWx1ZU9mKDEwMEwpICAgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSAgICB7ICJwYXJzZUludChcIjEwMFwiKTsiLCAiZGVjaW1hbCIsIEJpZ0RlY2ltYWwudmFsdWVPZigxMDBkKSAgICB9LAotICAgICAgICBuZXcgT2JqZWN0W10gICAgeyAgICIxMDAuIiwgICAgICJkZWNpbWFsIiwgIEJpZ0RlY2ltYWwudmFsdWVPZigxMDBkKSAgICB9LAotICAgICAgICB9OwotCi0gICAgICAgIGZvciAoT2JqZWN0W10gdmFyaWF0aW9uIDogdmFyaWF0aW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgT2JqZWN0IGZ1bmN0aW9uQm9keSA9IHZhcmlhdGlvblswXTsKLSAgICAgICAgICAgIE9iamVjdCByZXR1cm5UeXBlID0gdmFyaWF0aW9uWzFdOwotICAgICAgICAgICAgT2JqZWN0IGV4cGVjdGVkUmVzdWx0ID0gdmFyaWF0aW9uWzJdOwotCi0gICAgICAgICAgICBTdHJpbmcgZk5hbWUgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRSwgImRvdWJsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXModmFsIGRvdWJsZSkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyAiICtyZXR1cm5UeXBlICsgJyAnICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICciICsgZnVuY3Rpb25Cb2R5ICsgIjsnOyIpOwotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1Qga2V5LCB2YWwsICIgKyBmTmFtZSArICIodmFsKSBGUk9NICVzIiksCi0gICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAxZCwgZXhwZWN0ZWRSZXN1bHQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcmlwdFBhcmFtUmV0dXJuVHlwZXMoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBVVUlEIHJ1dWlkID0gVVVJRC5yYW5kb21VVUlEKCk7Ci0gICAgICAgIFRpbWVVVUlEIHR1dWlkID0gbmV4dFRpbWVVVUlEKCk7Ci0KLSAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoa2V5IGludCBwcmltYXJ5IGtleSwgIiArCi0gICAgICAgICAgICAgICAgICAgICJ0aXZhbCB0aW55aW50LCBzaXZhbCBzbWFsbGludCwgaXZhbCBpbnQsIGx2YWwgYmlnaW50LCBmdmFsIGZsb2F0LCBkdmFsIGRvdWJsZSwgdnZhbCB2YXJpbnQsIGRkdmFsIGRlY2ltYWwsICIgKwotICAgICAgICAgICAgICAgICAgICAidGltdmFsIHRpbWUsIGR0dmFsIGRhdGUsIHRzdmFsIHRpbWVzdGFtcCwgdXZhbCB1dWlkLCB0dXZhbCB0aW1ldXVpZCkiKTsKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgdGl2YWwsIHNpdmFsLCBpdmFsLCBsdmFsLCBmdmFsLCBkdmFsLCB2dmFsLCBkZHZhbCwgdGltdmFsLCBkdHZhbCwgdHN2YWwsIHV2YWwsIHR1dmFsKSBWQUxVRVMgIiArCi0gICAgICAgICAgICAgICAgIig/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/KSIsIDEsCi0gICAgICAgICAgICAgICAgKGJ5dGUpMSwgKHNob3J0KTEsIDEsIDFMLCAxZiwgMWQsIEJpZ0ludGVnZXIudmFsdWVPZigxTCksIEJpZ0RlY2ltYWwudmFsdWVPZigxZCksIDFMLCBJbnRlZ2VyLk1BWF9WQUxVRSwgbmV3IERhdGUoMSksIHJ1dWlkLCB0dXVpZCk7Ci0KLSAgICAgICAgT2JqZWN0W11bXSB2YXJpYXRpb25zID0gewotICAgICAgICBuZXcgT2JqZWN0W10geyAgInRpbnlpbnQiLCAgInRpdmFsIiwgICAgKGJ5dGUpMSwgICAgICAgICAgICAgICAgKGJ5dGUpMiAgfSwKLSAgICAgICAgbmV3IE9iamVjdFtdIHsgICJzbWFsbGludCIsICJzaXZhbCIsICAgIChzaG9ydCkxLCAgICAgICAgICAgICAgIChzaG9ydCkyICB9LAotICAgICAgICBuZXcgT2JqZWN0W10geyAgImludCIsICAgICAgIml2YWwiLCAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgMiAgfSwKLSAgICAgICAgbmV3IE9iamVjdFtdIHsgICJiaWdpbnQiLCAgICJsdmFsIiwgICAgIDFMLCAgICAgICAgICAgICAgICAgICAgIDJMICB9LAotICAgICAgICBuZXcgT2JqZWN0W10geyAgImZsb2F0IiwgICAgImZ2YWwiLCAgICAgMWYsICAgICAgICAgICAgICAgICAgICAgMmYgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSB7ICAiZG91YmxlIiwgICAiZHZhbCIsICAgICAxZCwgICAgICAgICAgICAgICAgICAgICAyZCAgfSwKLSAgICAgICAgbmV3IE9iamVjdFtdIHsgICJ2YXJpbnQiLCAgICJ2dmFsIiwgICAgIEJpZ0ludGVnZXIudmFsdWVPZigxTCksIEJpZ0ludGVnZXIudmFsdWVPZigyTCkgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSB7ICAiZGVjaW1hbCIsICAiZGR2YWwiLCAgICBCaWdEZWNpbWFsLnZhbHVlT2YoMWQpLCBCaWdEZWNpbWFsLnZhbHVlT2YoMmQpICB9LAotICAgICAgICBuZXcgT2JqZWN0W10geyAgInRpbWUiLCAgICAgInRpbXZhbCIsICAgMUwsICAgICAgICAgICAgICAgICAgICAgMkwgIH0sCi0gICAgICAgIH07Ci0KLSAgICAgICAgZm9yIChPYmplY3RbXSB2YXJpYXRpb24gOiB2YXJpYXRpb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgdHlwZSA9IHZhcmlhdGlvblswXTsKLSAgICAgICAgICAgIE9iamVjdCBjb2wgPSB2YXJpYXRpb25bMV07Ci0gICAgICAgICAgICBPYmplY3QgZXhwZWN0ZWQxID0gdmFyaWF0aW9uWzJdOwotICAgICAgICAgICAgT2JqZWN0IGV4cGVjdGVkMiA9IHZhcmlhdGlvblszXTsKLSAgICAgICAgICAgIFN0cmluZyBmTmFtZSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLCB0eXBlLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXModmFsICIgKyB0eXBlICsgIikgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyAiICsgdHlwZSArICcgJyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAndmFsKzE7JzsiKTsKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGtleSwgIiArIGNvbCArICIsICIgKyBmTmFtZSArICcoJyArIGNvbCArICIpIEZST00gJXMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIGV4cGVjdGVkMSwgZXhwZWN0ZWQyKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2YXJpYXRpb25zID0gbmV3IE9iamVjdFtdW10gewotICAgICAgICBuZXcgT2JqZWN0W10geyAgInRpbWVzdGFtcCIsInRzdmFsIiwgICAgbmV3IERhdGUoMSksICAgICAgICAgICAgbmV3IERhdGUoMSkgIH0sCi0gICAgICAgIG5ldyBPYmplY3RbXSB7ICAidXVpZCIsICAgICAidXZhbCIsICAgICBydXVpZCwgICAgICAgICAgICAgICAgICBydXVpZCAgfSwKLSAgICAgICAgbmV3IE9iamVjdFtdIHsgICJ0aW1ldXVpZCIsICJ0dXZhbCIsICAgIHR1dWlkLCAgICAgICAgICAgICAgICAgIHR1dWlkICB9LAotICAgICAgICBuZXcgT2JqZWN0W10geyAgImRhdGUiLCAgICAgImR0dmFsIiwgICAgSW50ZWdlci5NQVhfVkFMVUUsICAgICAgSW50ZWdlci5NQVhfVkFMVUUgfSwKLSAgICAgICAgfTsKLQotICAgICAgICBmb3IgKE9iamVjdFtdIHZhcmlhdGlvbiA6IHZhcmlhdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdCB0eXBlID0gdmFyaWF0aW9uWzBdOwotICAgICAgICAgICAgT2JqZWN0IGNvbCA9IHZhcmlhdGlvblsxXTsKLSAgICAgICAgICAgIE9iamVjdCBleHBlY3RlZDEgPSB2YXJpYXRpb25bMl07Ci0gICAgICAgICAgICBPYmplY3QgZXhwZWN0ZWQyID0gdmFyaWF0aW9uWzNdOwotICAgICAgICAgICAgU3RyaW5nIGZOYW1lID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0UsIHR5cGUudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAlcyh2YWwgIiArIHR5cGUgKyAiKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TICIgKyB0eXBlICsgJyAnICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICd2YWw7JzsiKTsKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGtleSwgIiArIGNvbCArICIsICIgKyBmTmFtZSArICcoJyArIGNvbCArICIpIEZST00gJXMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIGV4cGVjdGVkMSwgZXhwZWN0ZWQyKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhc2NyaXB0RGlzYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrZXkgaW50IHByaW1hcnkga2V5LCB2YWwgZG91YmxlKSIpOwotCi0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5lbmFibGVTY3JpcHRlZFVzZXJEZWZpbmVkRnVuY3Rpb25zKGZhbHNlKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEludmFsaWQoIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICIgKyBLRVlTUEFDRSArICIuYXNzZXJ0Tm90RW5hYmxlZCh2YWwgZG91YmxlKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBkb3VibGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdNYXRoLnNpbih2YWwpOyc7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZW5hYmxlU2NyaXB0ZWRVc2VyRGVmaW5lZEZ1bmN0aW9ucyh0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEphdmFzY3JpcHRDb21waWxlRmFpbHVyZSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJGYWlsZWQgdG8gY29tcGlsZSBmdW5jdGlvbiAnY3FsX3Rlc3Rfa2V5c3BhY2Uuc2NyaW52JyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAiICsgS0VZU1BBQ0UgKyAiLnNjcmludih2YWwgZG91YmxlKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBkb3VibGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdmb28gYmFyJzsiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTY3JpcHRJbnZhbGlkTGFuZ3VhZ2UoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCBsYW5ndWFnZSAnYXJ0aWZpY2lhbF9pbnRlbGxpZ2VuY2UnIGZvciBmdW5jdGlvbiAnY3FsX3Rlc3Rfa2V5c3BhY2Uuc2NyaW52JyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAiICsgS0VZU1BBQ0UgKyAiLnNjcmludih2YWwgZG91YmxlKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBkb3VibGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBhcnRpZmljaWFsX2ludGVsbGlnZW5jZVxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAncXVlc3Rpb24gZm9yIDQyPyc7Iik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9VRlNlY3VyaXR5VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9VRlNlY3VyaXR5VGVzdC5qYXZhCmluZGV4IDc0MjJkYjQzLi5mZTFlYzcwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGU2VjdXJpdHlUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9VRlNlY3VyaXR5VGVzdC5qYXZhCkBAIC00OCwxMyArNDgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBKQVZBXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnU3lzdGVtLmdldFByb3BlcnR5KFwiZm9vLmJhci5iYXpcIik7IHJldHVybiAwZDsnOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdTeXN0ZW0uZ2V0UHJvcGVydHkoXCJmb28uYmFyLmJhelwiKTsgcmV0dXJuIDBkOyc7Iik7IC8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnYmxvY2tTeXN0ZW1Qcm9wZXJ0eVVzYWdlJwogICAgICAgICAgICAgZXhlY3V0ZSgiU0VMRUNUICIgKyBmTmFtZSArICIoZHZhbCkgRlJPTSAlcyBXSEVSRSBrZXk9MSIpOwogICAgICAgICAgICAgQXNzZXJ0LmZhaWwoKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRnVuY3Rpb25FeGVjdXRpb25FeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0QWNjZXNzQ29udHJvbEV4Y2VwdGlvbigiU3lzdGVtLmdldFByb3BlcnR5KFwiZm9vLmJhci5iYXpcIik7IHJldHVybiAwZDsiLCBlKTsKKyAgICAgICAgICAgIGFzc2VydEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIlN5c3RlbS5nZXRQcm9wZXJ0eShcImZvby5iYXIuYmF6XCIpOyByZXR1cm4gMGQ7IiwgZSk7IC8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnYmxvY2tTeXN0ZW1Qcm9wZXJ0eVVzYWdlJwogICAgICAgICB9CiAKICAgICAgICAgU3RyaW5nW10gY2ZuU291cmNlcyA9CkBAIC0xMzAsNzQgKzEzMCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgSkFWQVxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyIgKyB0eXBlQW5kU291cmNlWzFdICsgIic7Iik7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBKYXZhU2NyaXB0IFVERnMKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGZOYW1lID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0VfUEVSX1RFU1QsICJkb3VibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKHZhbCBkb3VibGUpICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgZG91YmxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmlzU2h1dGRvd24oKTsgMDsnOyIpOwotICAgICAgICAgICAgZXhlY3V0ZSgiU0VMRUNUICIgKyBmTmFtZSArICIoZHZhbCkgRlJPTSAlcyBXSEVSRSBrZXk9MSIpOwotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkphdmFzY3JpcHQgc2VjdXJpdHkgY2hlY2sgZmFpbGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEZ1bmN0aW9uRXhlY3V0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oIiIsIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nW10gamF2YXNjcmlwdCA9Ci0gICAgICAgIHsKLSAgICAgICAgImphdmEubGFuZy5tYW5hZ2VtZW50Lk1hbmFnbWVudEZhY3RvcnkuZ2V0VGhyZWFkTVhCZWFuKCk7IDA7IiwKLSAgICAgICAgIm5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShcIi90bXAvZm9vXCIpOyAwOyIsCi0gICAgICAgICJuZXcgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtKFwiL3RtcC9mb29cIik7IDA7IiwKLSAgICAgICAgImphdmEubmlvLmZpbGUuRmlsZVN5c3RlbXMuZ2V0RGVmYXVsdCgpLmNyZWF0ZUZpbGVFeGNsdXNpdmVseShcIi4vZm9vX2Jhcl9iYXpcIik7IDA7IiwKLSAgICAgICAgImphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsLm9wZW4oamF2YS5uaW8uZmlsZS5GaWxlU3lzdGVtcy5nZXREZWZhdWx0KCkuZ2V0UGF0aChcIi9ldGMvcGFzc3dkXCIpKTsgMDsiLAotICAgICAgICAiamF2YS5uaW8uY2hhbm5lbHMuU29ja2V0Q2hhbm5lbC5vcGVuKCk7IDA7IiwKLSAgICAgICAgIm5ldyBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQoKS5iaW5kKG51bGwpOyAwOyIsCi0gICAgICAgICJ2YXIgdGhyZWFkID0gbmV3IGphdmEubGFuZy5UaHJlYWQoKTsgdGhyZWFkLnN0YXJ0KCk7IDA7IiwKLSAgICAgICAgImphdmEubGFuZy5TeXN0ZW0uZ2V0UHJvcGVydHkoXCJmb28uYmFyLmJhelwiKTsgMDsiLAotICAgICAgICAiamF2YS5sYW5nLlJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoXCIvdG1wL2Zvb1wiKTsgMDsiLAotICAgICAgICAiamF2YS5sYW5nLlJ1bnRpbWUuZ2V0UnVudGltZSgpLmxvYWRMaWJyYXJ5KFwiZm9vYmFyXCIpOyAwOyIsCi0gICAgICAgICJqYXZhLmxhbmcuUnVudGltZS5nZXRSdW50aW1lKCkubG9hZExpYnJhcnkoXCJmb29iYXJcIik7IDA7IiwKLSAgICAgICAgLy8gVE9ETyB0aGVzZSAodWdseSkgY2FsbHMgYXJlIHN0aWxsIHBvc3NpYmxlIC0gdGhlc2UgY2FuIGNvbnN1bWUgQ1BVIChhcyBvbmUgY291bGQgZG8gd2l0aCBhbiBldmlsIGxvb3AsIHRvbykKLS8vICAgICAgICAiamF2YS5sYW5nLlJ1bnRpbWUuZ2V0UnVudGltZSgpLnRyYWNlTWV0aG9kQ2FsbHModHJ1ZSk7IDA7IiwKLS8vICAgICAgICAiamF2YS5sYW5nLlJ1bnRpbWUuZ2V0UnVudGltZSgpLmdjKCk7IDA7IiwKLS8vICAgICAgICAiamF2YS5sYW5nLlJ1bnRpbWUuZ2V0UnVudGltZSgpOyAwOyIsCi0gICAgICAgIH07Ci0KLSAgICAgICAgZm9yIChTdHJpbmcgc2NyaXB0IDogamF2YXNjcmlwdCkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGZOYW1lID0gY3JlYXRlRnVuY3Rpb24oS0VZU1BBQ0VfUEVSX1RFU1QsICJkb3VibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAlcyh2YWwgZG91YmxlKSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgZG91YmxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyIgKyBzY3JpcHQgKyAiJzsiKTsKLSAgICAgICAgICAgICAgICBleGVjdXRlKCJTRUxFQ1QgIiArIGZOYW1lICsgIihkdmFsKSBGUk9NICVzIFdIRVJFIGtleT0xIik7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkphdmFzY3JpcHQgc2VjdXJpdHkgY2hlY2sgZmFpbGVkOiAiICsgc2NyaXB0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChGdW5jdGlvbkV4ZWN1dGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oc2NyaXB0LCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBzY3JpcHQgPSAiamF2YS5sYW5nLkNsYXNzLmZvck5hbWUoXCJqYXZhLmxhbmcuU3lzdGVtXCIpOyAwOyI7Ci0gICAgICAgIFN0cmluZyBmTmFtZSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFX1BFUl9URVNULCAiZG91YmxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKHZhbCBkb3VibGUpICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHRcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyIgKyBzY3JpcHQgKyAiJzsiKTsKLSAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiSmF2YSByZWZsZWN0aW9uIG5vdCBzdXBwb3J0ZWQgd2hlbiBjbGFzcyBmaWx0ZXIgaXMgcHJlc2VudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25FeGVjdXRpb25FeGNlcHRpb24uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCAiICsgZk5hbWUgKyAiKGR2YWwpIEZST00gJXMgV0hFUkUga2V5PTEiKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEFjY2Vzc0NvbnRyb2xFeGNlcHRpb24oU3RyaW5nIHNjcmlwdCwgRnVuY3Rpb25FeGVjdXRpb25FeGNlcHRpb24gZSkKQEAgLTI1MCwxNiArMTgyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnbG9uZyB0PVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKzUwMDsgd2hpbGUgKHQ+U3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIHsgfTsgcmV0dXJuIDBkOyc7Iik7CiAgICAgICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoInJhbiBsb25nZXIgdGhhbiAyNTBtcyIsICJTRUxFQ1QgIiArIGZOYW1lICsgIihkdmFsKSBGUk9NICVzIFdIRVJFIGtleT0xIik7CiAKLSAgICAgICAgICAgICAgICAvLyBKYXZhc2NyaXB0IFVERgotCi0gICAgICAgICAgICAgICAgZk5hbWUgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRV9QRVJfVEVTVCwgImRvdWJsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXModmFsIGRvdWJsZSkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBkb3VibGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgSkFWQVNDUklQVFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3ZhciB0PWphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSs1MDA7IHdoaWxlICh0PmphdmEubGFuZy5TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSkgeyB9OyAwOyc7Iik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoInJhbiBsb25nZXIgdGhhbiAyNTBtcyIsICJTRUxFQ1QgIiArIGZOYW1lICsgIihkdmFsKSBGUk9NICVzIFdIRVJFIGtleT0xIik7Ci0KICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRXJyb3IgfCBSdW50aW1lRXhjZXB0aW9uIGUpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9VRlRlc3QuamF2YQppbmRleCBlODZiM2RmLi4xYTllNmQyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VGVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVUZUZXN0LmphdmEKQEAgLTg3LDE3ICs4NywxNyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjaGVtYUNoYW5nZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hQ2hhbmdlKCkKICAgICB7CiAgICAgICAgIFN0cmluZyBmID0gY3JlYXRlRnVuY3Rpb25OYW1lKEtFWVNQQUNFKTsKICAgICAgICAgU3RyaW5nIGZ1bmN0aW9uTmFtZSA9IHNob3J0RnVuY3Rpb25OYW1lKGYpOwogICAgICAgICByZWdpc3RlckZ1bmN0aW9uKGYsICJkb3VibGUsIGRvdWJsZSIpOwogCi0gICAgICAgIGFzc2VydFNjaGVtYUNoYW5nZSgiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gIiArIGYgKyAiKHN0YXRlIGRvdWJsZSwgdmFsIGRvdWJsZSkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCisgICAgICAgIGFzc2VydFNjaGVtYUNoYW5nZSgiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gIiArIGYgKyAiKHN0YXRlIGRvdWJsZSwgdmFsIGRvdWJsZSkiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdcInN0cmluZ1wiOyc7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICcgcmV0dXJuIERvdWJsZS52YWx1ZU9mKE1hdGgubWF4KHN0YXRlLmRvdWJsZVZhbHVlKCksIHZhbC5kb3VibGVWYWx1ZSgpKSk7ICc7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZS5DUkVBVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0LkZVTkNUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZU1BBQ0UsIGZ1bmN0aW9uTmFtZSwKQEAgLTEwOCwyMiArMTA4LDIyIEBACiAgICAgICAgIGFzc2VydFNjaGVtYUNoYW5nZSgiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gIiArIGYgKyAiKHN0YXRlIGludCwgdmFsIGludCkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnXCJzdHJpbmdcIjsnOyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoTWF0aC5tYXgoc3RhdGUsIHZhbCkpOyc7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZS5DUkVBVEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0LkZVTkNUSU9OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZU1BBQ0UsIGZ1bmN0aW9uTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLCAiaW50Iik7CiAKLSAgICAgICAgYXNzZXJ0U2NoZW1hQ2hhbmdlKCJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAiICsgZiArICIoc3RhdGUgaW50LCB2YWwgaW50KSAiICsKKyAgICAgICAgLyphc3NlcnRTY2hlbWFDaGFuZ2UoIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICIgKyBmICsgIihzdGF0ZSBpbnQsIHZhbCBpbnQpICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgaW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ1wic3RyaW5nMVwiOyc7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICcgcmV0dXJuIEludGVnZXIudmFsdWVPZihNYXRoLm1heChzdGF0ZSwgdmFsKSk7JzsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlLlVQREFURUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQuRlVOQ1RJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTUEFDRSwgZnVuY3Rpb25OYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCIsICJpbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLCAiaW50Iik7Ki8KIAogICAgICAgICBhc3NlcnRTY2hlbWFDaGFuZ2UoIkRST1AgRlVOQ1RJT04gIiArIGYgKyAiKGRvdWJsZSwgZG91YmxlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2UuRFJPUFBFRCwgVGFyZ2V0LkZVTkNUSU9OLApAQCAtMTM3LDggKzEzNyw4IEBACiAgICAgICAgIGFzc2VydFNjaGVtYUNoYW5nZSgiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gIiArIGZsICsgIihzdGF0ZSBsaXN0PHR1cGxlPGludCwgaW50Pj4sIHZhbCBkb3VibGUpICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgZG91YmxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ1wic3RyaW5nXCI7JzsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyByZXR1cm4gdmFsOyc7IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZS5DUkVBVEVELCBUYXJnZXQuRlVOQ1RJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTUEFDRSwgc2hvcnRGdW5jdGlvbk5hbWUoZmwpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3Q8dHVwbGU8aW50LCBpbnQ+PiIsICJkb3VibGUiKTsKQEAgLTE1Niw3ICsxNTYsNyBAQAogCiAgICAgICAgIEZ1bmN0aW9uTmFtZSBmU2luTmFtZSA9IHBhcnNlRnVuY3Rpb25OYW1lKGZTaW4pOwogCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldEZ1bmN0aW9ucyhwYXJzZUZ1bmN0aW9uTmFtZShmU2luKSkuc2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBTY2hlbWEuaW5zdGFuY2UuZ2V0VXNlckZ1bmN0aW9ucyhwYXJzZUZ1bmN0aW9uTmFtZShmU2luKSkuc2l6ZSgpKTsKIAogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBmdW5jdGlvbl9uYW1lLCBsYW5ndWFnZSBGUk9NIHN5c3RlbV9zY2hlbWEuZnVuY3Rpb25zIFdIRVJFIGtleXNwYWNlX25hbWU9PyIsIEtFWVNQQUNFX1BFUl9URVNUKSwKICAgICAgICAgICAgICAgICAgICByb3coZlNpbk5hbWUubmFtZSwgImphdmEiKSk7CkBAIC0xNjUsNyArMTY1LDcgQEAKIAogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBmdW5jdGlvbl9uYW1lLCBsYW5ndWFnZSBGUk9NIHN5c3RlbV9zY2hlbWEuZnVuY3Rpb25zIFdIRVJFIGtleXNwYWNlX25hbWU9PyIsIEtFWVNQQUNFX1BFUl9URVNUKSk7CiAKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBTY2hlbWEuaW5zdGFuY2UuZ2V0RnVuY3Rpb25zKGZTaW5OYW1lKS5zaXplKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIFNjaGVtYS5pbnN0YW5jZS5nZXRVc2VyRnVuY3Rpb25zKGZTaW5OYW1lKS5zaXplKCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xODIsNyArMTgyLDcgQEAKIAogICAgICAgICBGdW5jdGlvbk5hbWUgZlNpbk5hbWUgPSBwYXJzZUZ1bmN0aW9uTmFtZShmU2luKTsKIAotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFNjaGVtYS5pbnN0YW5jZS5nZXRGdW5jdGlvbnMocGFyc2VGdW5jdGlvbk5hbWUoZlNpbikpLnNpemUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldFVzZXJGdW5jdGlvbnMocGFyc2VGdW5jdGlvbk5hbWUoZlNpbikpLnNpemUoKSk7CiAKICAgICAgICAgLy8gY3JlYXRlIGEgcGFpcnMgb2YgU2VsZWN0IGFuZCBJbnNlcnRzLiBPbmUgc3RhdGVtZW50IGluIGVhY2ggcGFpciB1c2VzIHRoZSBmdW5jdGlvbiBzbyB3aGVuIHdlCiAgICAgICAgIC8vIGRyb3AgaXQgdGhvc2Ugc3RhdGVtZW50cyBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSBpbiBRdWVyeVByb2Nlc3Nvci4gVGhlIG90aGVyIHN0YXRlbWVudHMKQEAgLTIyMCw3ICsyMjAsNyBAQAogICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhICIgKwogICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIERvdWJsZS52YWx1ZU9mKE1hdGguc2luKGlucHV0KSk7JyIpOwogCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldEZ1bmN0aW9ucyhmU2luTmFtZSkuc2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBTY2hlbWEuaW5zdGFuY2UuZ2V0VXNlckZ1bmN0aW9ucyhmU2luTmFtZSkuc2l6ZSgpKTsKIAogICAgICAgICBwcmVwYXJlZFNlbGVjdDE9IFF1ZXJ5UHJvY2Vzc29yLmluc3RhbmNlLnByZXBhcmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlNFTEVDVCBrZXksICVzKGQpIEZST00gJXMuJXMiLCBmU2luLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCkpLApAQCAtMzMzLDkgKzMzMyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiAlcyAoIGlucHV0IGRvdWJsZSApICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBkb3VibGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdpbnB1dCciKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBTY2hlbWEuaW5zdGFuY2UuZ2V0RnVuY3Rpb25zKHBhcnNlRnVuY3Rpb25OYW1lKGZ1bmN0aW9uKSkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiBEb3VibGUudmFsdWVPZihNYXRoLmxvZyhpbnB1dC5kb3VibGVWYWx1ZSgpKSk7JyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFNjaGVtYS5pbnN0YW5jZS5nZXRVc2VyRnVuY3Rpb25zKHBhcnNlRnVuY3Rpb25OYW1lKGZ1bmN0aW9uKSkuc2l6ZSgpKTsKIAogICAgICAgICBMaXN0PFJlc3VsdE1lc3NhZ2UuUHJlcGFyZWQ+IHByZXBhcmVkID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIC8vIHByZXBhcmUgc3RhdGVtZW50cyB3aGljaCB1c2UgdGhlIGZ1bmN0aW9uIHRvIHByb3ZpZGUgYSBEZWxheWVkVmFsdWUKQEAgLTQzOCw3ICs0MzgsNyBAQAogICAgICAgICBleGVjdXRlKCJEUk9QIEZVTkNUSU9OIElGIEVYSVNUUyAiICsgZlNpbik7CiAKICAgICAgICAgLy8gY2FuJ3QgZHJvcCBuYXRpdmUgZnVuY3Rpb25zCi0gICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJTeXN0ZW0ga2V5c3BhY2UgJ3N5c3RlbScgaXMgbm90IHVzZXItbW9kaWZpYWJsZSIsICJEUk9QIEZVTkNUSU9OIHRvdGltZXN0YW1wIik7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJTeXN0ZW0ga2V5c3BhY2UgJ3N5c3RlbScgaXMgbm90IHVzZXItbW9kaWZpYWJsZSIsICJEUk9QIEZVTkNUSU9OIHRvX3RpbWVzdGFtcCIpOwogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiU3lzdGVtIGtleXNwYWNlICdzeXN0ZW0nIGlzIG5vdCB1c2VyLW1vZGlmaWFibGUiLCAiRFJPUCBGVU5DVElPTiB1dWlkIik7CiAKICAgICAgICAgLy8gc2luKCkgbm8gbG9uZ2VyIGV4aXN0cwpAQCAtNjY1LDcgKzY2NSw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RnVuY3Rpb25JblN5c3RlbUtTKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgZXhlY3V0ZSgiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gIiArIEtFWVNQQUNFICsgIi50b3RpbWVzdGFtcCh2YWwgdGltZXV1aWQpICIgKworICAgICAgICBleGVjdXRlKCJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAiICsgS0VZU1BBQ0UgKyAiLnRvX3RpbWVzdGFtcCh2YWwgdGltZXV1aWQpICIgKwogICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAiUkVUVVJOUyB0aW1lc3RhbXAgIiArCiAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIEpBVkFcbiIgKwpAQCAtNjc5LDcgKzY3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBKQVZBXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdyZXR1cm4gbnVsbDsnOyIpOwogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiU3lzdGVtIGtleXNwYWNlICdzeXN0ZW0nIGlzIG5vdCB1c2VyLW1vZGlmaWFibGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gc3lzdGVtLnRvdGltZXN0YW1wKHZhbCB0aW1ldXVpZCkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBzeXN0ZW0udG9fdGltZXN0YW1wKHZhbCB0aW1ldXVpZCkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgdGltZXN0YW1wICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgSkFWQVxuIiArCkBAIC02OTYsNyArNjk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIEpBVkFcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiBudWxsOyc7Iik7CiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJTeXN0ZW0ga2V5c3BhY2UgJ3N5c3RlbScgaXMgbm90IHVzZXItbW9kaWZpYWJsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiB0b3RpbWVzdGFtcCh2YWwgdGltZXV1aWQpICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gdG9fdGltZXN0YW1wKHZhbCB0aW1ldXVpZCkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIE5VTEwgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgdGltZXN0YW1wICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgSkFWQVxuIiArCkBAIC03NjksNyArNzY5LDcgQEAKIAogICAgICAgICBGdW5jdGlvbk5hbWUgZk5hbWVOYW1lID0gcGFyc2VGdW5jdGlvbk5hbWUoZk5hbWUpOwogCi0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldEZ1bmN0aW9ucyhmTmFtZU5hbWUpLnNpemUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgU2NoZW1hLmluc3RhbmNlLmdldFVzZXJGdW5jdGlvbnMoZk5hbWVOYW1lKS5zaXplKCkpOwogCiAgICAgICAgIFJlc3VsdE1lc3NhZ2UuUHJlcGFyZWQgcHJlcGFyZWQgPSBRdWVyeVByb2Nlc3Nvci5pbnN0YW5jZS5wcmVwYXJlKFN0cmluZy5mb3JtYXQoIlNFTEVDVCBrZXksICVzKHVkdCkgRlJPTSAlcy4lcyIsIGZOYW1lLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRTdGF0ZS5mb3JJbnRlcm5hbENhbGxzKCkpOwpAQCAtNzg2LDE4ICs3ODYsMTcgQEAKICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoUXVlcnlQcm9jZXNzb3IuaW5zdGFuY2UuZ2V0UHJlcGFyZWQocHJlcGFyZWQuc3RhdGVtZW50SWQpKTsKIAogICAgICAgICAvLyBmdW5jdGlvbiBzdGF5cwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFNjaGVtYS5pbnN0YW5jZS5nZXRGdW5jdGlvbnMoZk5hbWVOYW1lKS5zaXplKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIFNjaGVtYS5pbnN0YW5jZS5nZXRVc2VyRnVuY3Rpb25zKGZOYW1lTmFtZSkuc2l6ZSgpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVBcmdOYW1lcygpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJEdXBsaWNhdGUgYXJndW1lbnQgbmFtZXMgZm9yIGdpdmVuIGZ1bmN0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICIgKyBLRVlTUEFDRSArICIuc2NyaW52KHZhbCBkb3VibGUsIHZhbCB0ZXh0KSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyB0ZXh0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnXCJmb28gYmFyXCI7JzsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICIgKyBLRVlTUEFDRSArICIuc2NyaW52KGlucHV0IGRvdWJsZSwgaW5wdXQgaW50KSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNBTExFRCBPTiBOVUxMIElOUFVUICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBkb3VibGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhIEFTICdyZXR1cm4gTWF0aC5tYXgoaW5wdXQsIGlucHV0KSc7Iik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTg1NSw3ICs4NTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3Rocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7JzsiKTsKIAogICAgICAgICBLZXlzcGFjZU1ldGFkYXRhIGtzbSA9IFNjaGVtYS5pbnN0YW5jZS5nZXRLZXlzcGFjZU1ldGFkYXRhKEtFWVNQQUNFX1BFUl9URVNUKTsKLSAgICAgICAgVURGdW5jdGlvbiBmID0gKFVERnVuY3Rpb24pIGtzbS5mdW5jdGlvbnMuZ2V0KHBhcnNlRnVuY3Rpb25OYW1lKGZOYW1lKSkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIFVERnVuY3Rpb24gZiA9IChVREZ1bmN0aW9uKSBrc20udXNlckZ1bmN0aW9ucy5nZXQocGFyc2VGdW5jdGlvbk5hbWUoZk5hbWUpKS5pdGVyYXRvcigpLm5leHQoKTsKIAogICAgICAgICBVREZ1bmN0aW9uIGJyb2tlbiA9IFVERnVuY3Rpb24uY3JlYXRlQnJva2VuRnVuY3Rpb24oZi5uYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmFyZ05hbWVzKCksCkBAIC04NjUsNyArODY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuYm9keSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uKCJmb28gYmFyIGlzIGJyb2tlbiIpKTsKLSAgICAgICAgU2NoZW1hVGVzdFV0aWwuYWRkT3JVcGRhdGVLZXlzcGFjZShrc20ud2l0aFN3YXBwZWQoa3NtLmZ1bmN0aW9ucy53aXRob3V0KGYubmFtZSgpLCBmLmFyZ1R5cGVzKCkpLndpdGgoYnJva2VuKSksIGZhbHNlKTsKKyAgICAgICAgU2NoZW1hVGVzdFV0aWwuYWRkT3JVcGRhdGVLZXlzcGFjZShrc20ud2l0aFN3YXBwZWQoa3NtLnVzZXJGdW5jdGlvbnMud2l0aG91dChmLm5hbWUoKSwgZi5hcmdUeXBlcygpKS53aXRoKGJyb2tlbikpLCBmYWxzZSk7CiAKICAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiZm9vIGJhciBpcyBicm9rZW4iLCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIGtleSwgIiArIGZOYW1lICsgIihkdmFsKSBGUk9NICVzIik7CkBAIC05MDgsNyArOTA3LDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrZXkgaW50IHByaW1hcnkga2V5LCBzdmFsIHRleHQsIGF2YWwgYXNjaWksIGJ2YWwgYmxvYiwgZW1wdHlfaW50IGludCkiKTsKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgc3ZhbCwgYXZhbCwgYnZhbCwgZW1wdHlfaW50KSBWQUxVRVMgKD8sID8sID8sID8sIGJsb2JBc0ludCgweCkpIiwgMSwgIiIsICIiLCBCeXRlQnVmZmVyLmFsbG9jYXRlKDApKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgc3ZhbCwgYXZhbCwgYnZhbCwgZW1wdHlfaW50KSBWQUxVRVMgKD8sID8sID8sID8sIGJsb2JfYXNfaW50KDB4KSkiLCAxLCAiIiwgIiIsIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMCkpOwogCiAgICAgICAgIFN0cmluZyBmTmFtZVNSQyA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFX1BFUl9URVNULCAidGV4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiAlcyh2YWwgdGV4dCkgIiArCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1VzZXJUeXBlc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVXNlclR5cGVzVGVzdC5qYXZhCmluZGV4IDBiMDVlOGYuLjBkOTk0OTQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVXNlclR5cGVzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVXNlclR5cGVzVGVzdC5qYXZhCkBAIC0yMiw2ICsyMiw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5CeXRlT3JkZXJlZFBhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CkBAIC0zMiw2ICszMyw4IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKSAgICAgLy8gb3ZlcnJpZGVzIENRTFRlc3Rlci5zZXRVcENsYXNzKCkKICAgICB7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5kYWVtb25Jbml0aWFsaXphdGlvbigpOworCiAgICAgICAgIC8vIFNlbGVjdGluZyBwYXJ0aXRpb25lciBmb3IgYSB0YWJsZSBpcyBub3QgZXhwb3NlZCBvbiBDUkVBVEUgVEFCTEUuCiAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLnNldFBhcnRpdGlvbmVyVW5zYWZlKEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UpOwogCkBAIC0yMDAsNiArMjAzLDU2IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbHNJbkludFVEVCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyBteVR5cGUgPSBLRVlTUEFDRSArICcuJyArIGNyZWF0ZVR5cGUoIkNSRUFURSBUWVBFICVzIChhIGludCkiKTsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoYSBpbnQgUFJJTUFSWSBLRVksIGIgZnJvemVuPCIgKyBteVR5cGUgKyAiPikiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGEsIGIpIFZBTFVFUyAoMSwgPykiLCB1c2VyVHlwZSgiYSIsIDEpKTsKKworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBiLmEgRlJPTSAlcyIpLCByb3coMSkpOworCisgICAgICAgIGZsdXNoKCk7CisKKyAgICAgICAgc2NoZW1hQ2hhbmdlKCJBTFRFUiBUWVBFICIgKyBteVR5cGUgKyAiIEFERCBiIGludCIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYikgVkFMVUVTICgyLCB7YTogMiwgYjogMn0pIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiKSBWQUxVRVMgKDMsIHtiOiAzfSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGEsIGIpIFZBTFVFUyAoNCwge2E6IG51bGwsIGI6IDR9KSIpOworCisgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBiLmEsIGIuYiBGUk9NICVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coMSwgbnVsbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coMiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgNCkpCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbHNJblRleHRVRFQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgbXlUeXBlID0gS0VZU1BBQ0UgKyAnLicgKyBjcmVhdGVUeXBlKCJDUkVBVEUgVFlQRSAlcyAoYSB0ZXh0KSIpOworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChhIGludCBQUklNQVJZIEtFWSwgYiBmcm96ZW48IiArIG15VHlwZSArICI+KSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYikgVkFMVUVTICgxLCB7YTogJyd9KSIpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGIuYSBGUk9NICVzIiksIHJvdygiIikpOworCisgICAgICAgIGZsdXNoKCk7CisKKyAgICAgICAgc2NoZW1hQ2hhbmdlKCJBTFRFUiBUWVBFICIgKyBteVR5cGUgKyAiIEFERCBiIHRleHQiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGEsIGIpIFZBTFVFUyAoMiwge2E6ICcnLCBiOiAnJ30pIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiKSBWQUxVRVMgKDMsIHtiOiAnJ30pIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiKSBWQUxVRVMgKDQsIHthOiBudWxsLCBiOiAnJ30pIik7CisKKyAgICAgICAgYmVmb3JlQW5kQWZ0ZXJGbHVzaCgoKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGIuYSwgYi5iIEZST00gJXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygiIiwgbnVsbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coIiIsICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhudWxsLCAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cobnVsbCwgIiIpKQorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEFsdGVyTm9uRnJvemVuVURUKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgU3RyaW5nIG15VHlwZSA9IEtFWVNQQUNFICsgJy4nICsgY3JlYXRlVHlwZSgiQ1JFQVRFIFRZUEUgJXMgKGEgaW50LCBiIHRleHQpIik7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1ZpcnR1YWxUYWJsZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVmlydHVhbFRhYmxlVGVzdC5qYXZhCmluZGV4IDVkM2IxMzQuLmIyZGE2ZTUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVmlydHVhbFRhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvVmlydHVhbFRhYmxlVGVzdC5qYXZhCkBAIC0zOCw2ICszOCw4IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLmV4Y2VwdGlvbnMuSW52YWxpZFF1ZXJ5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5NdXRhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKQEAgLTU2LDcgKzU4LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmlnZ2Vycy5JVHJpZ2dlcjsKIAogCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIHB1YmxpYyBjbGFzcyBWaXJ0dWFsVGFibGVUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCkBAIC02Niw2ICs3MCw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZUMl9OQU1FID0gInZ0MiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZUM19OQU1FID0gInZ0MyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZUNF9OQU1FID0gInZ0NCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZUNV9OQU1FID0gInZ0NSI7CiAKICAgICAvLyBBcyBsb25nIGFzIHdlIGV4ZWN1dGUgdGVzdCBxdWVyaWVzIHVzaW5nIGV4ZWN1dGUgKGFuZCBub3QgZXhlY3V0ZU5ldCkgdGhlIHZpcnR1YWwgdGFibGVzIGltcGxlbWVudGF0aW9uCiAgICAgLy8gZG8gbm90IG5lZWQgdG8gYmUgdGhyZWFkLXNhZmUuIFdlIGNob29zZSB0byBkbyBpdCB0byBhdm9pZCBpc3N1ZXMgaWYgdGhlIHRlc3QgZnJhbWV3b3JrIHdhcyBjaGFuZ2VkIG9yIHNvbWVib2R5CkBAIC0yMDQsNiArMjA5LDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKwogICAgICAgICBUYWJsZU1ldGFkYXRhIHZ0MU1ldGFkYXRhID0gVGFibGVNZXRhZGF0YS5idWlsZGVyKEtTX05BTUUsIFZUMV9OQU1FKQogICAgICAgICAgICAgICAgIC5raW5kKFRhYmxlTWV0YWRhdGEuS2luZC5WSVJUVUFMKQogICAgICAgICAgICAgICAgIC5hZGRQYXJ0aXRpb25LZXlDb2x1bW4oInBrIiwgVVRGOFR5cGUuaW5zdGFuY2UpCkBAIC0zNDMsNyArMzUwLDI3IEBACiAKICAgICAgICAgfTsKIAotICAgICAgICBWaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeS5pbnN0YW5jZS5yZWdpc3RlcihuZXcgVmlydHVhbEtleXNwYWNlKEtTX05BTUUsIEltbXV0YWJsZUxpc3Qub2YodnQxLCB2dDIsIHZ0MywgdnQ0KSkpOworICAgICAgICBWaXJ0dWFsVGFibGUgdnQ1ID0gbmV3IEFic3RyYWN0VmlydHVhbFRhYmxlKFRhYmxlTWV0YWRhdGEuYnVpbGRlcihLU19OQU1FLCBWVDVfTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmtpbmQoVGFibGVNZXRhZGF0YS5LaW5kLlZJUlRVQUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQYXJ0aXRpb25LZXlDb2x1bW4oInBrIiwgVVRGOFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbHVzdGVyaW5nQ29sdW1uKCJjIiwgVVRGOFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKCJ2MSIsIEludDMyVHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oInYyIiwgTG9uZ1R5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgRGF0YVNldCBkYXRhKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZURhdGFTZXQobWV0YWRhdGEoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWxsb3dGaWx0ZXJpbmdJbXBsaWNpdGx5KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgVmlydHVhbEtleXNwYWNlUmVnaXN0cnkuaW5zdGFuY2UucmVnaXN0ZXIobmV3IFZpcnR1YWxLZXlzcGFjZShLU19OQU1FLCBJbW11dGFibGVMaXN0Lm9mKHZ0MSwgdnQyLCB2dDMsIHZ0NCwgdnQ1KSkpOwogCiAgICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7CiAgICAgfQpAQCAtMTAyNSw2ICsxMDUyLDQ2IEBACiAgICAgICAgIGFzc2VydEpNWEZhaWxzKCgpIC0+IG1iZWFuLmdldEF1dG9Db21wYWN0aW9uU3RhdHVzKEtTX05BTUUsIFZUMV9OQU1FKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWxsb3dlZEZpbHRlcmluZ09uUmVndWxhckNvbHVtbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiU0VMRUNUICogRlJPTSAlcy4lcyBXSEVSRSB2MiA9IDUiLCBLU19OQU1FLCBWVDVfTkFNRSkpOworICAgICAgICAgICAgZmFpbChmb3JtYXQoInNob3VsZCBmYWlsIGFzICVzLiVzIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGZpbHRlcmVkIG9uIGltcGxpY2l0bHkuIiwgS1NfTkFNRSwgVlQ1X05BTUUpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW52YWxpZFF1ZXJ5RXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGV4LmdldE1lc3NhZ2UoKS5jb250YWlucygiQ2Fubm90IGV4ZWN1dGUgdGhpcyBxdWVyeSBhcyBpdCBtaWdodCBpbnZvbHZlIGRhdGEgZmlsdGVyaW5nIGFuZCB0aHVzIG1heSBoYXZlIHVucHJlZGljdGFibGUgcGVyZm9ybWFuY2UiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhbGxvd2VkRmlsdGVyaW5nT25DbHVzdGVyaW5nQ29sdW1uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGV4ZWN1dGVOZXQoZm9ybWF0KCJTRUxFQ1QgKiBGUk9NICVzLiVzIFdIRVJFIGMgPSAnYWJjJyIsIEtTX05BTUUsIFZUNV9OQU1FKSk7CisgICAgICAgICAgICBmYWlsKGZvcm1hdCgic2hvdWxkIGZhaWwgYXMgJXMuJXMgaXMgbm90IGFsbG93ZWQgdG8gYmUgZmlsdGVyZWQgb24gaW1wbGljaXRseS4iLCBLU19OQU1FLCBWVDVfTkFNRSkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnZhbGlkUXVlcnlFeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXguZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJDYW5ub3QgZXhlY3V0ZSB0aGlzIHF1ZXJ5IGFzIGl0IG1pZ2h0IGludm9sdmUgZGF0YSBmaWx0ZXJpbmcgYW5kIHRodXMgbWF5IGhhdmUgdW5wcmVkaWN0YWJsZSBwZXJmb3JtYW5jZSIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbG93ZWRGaWx0ZXJpbmdPblJlZ3VsYXJDb2x1bW4oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiU0VMRUNUICogRlJPTSAlcy4lcyBXSEVSRSB2MiA9IDUiLCBLU19OQU1FLCBWVDFfTkFNRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbG93ZWRGaWx0ZXJpbmdPbkNsdXN0ZXJpbmdDb2x1bW4oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBleGVjdXRlTmV0KGZvcm1hdCgiU0VMRUNUICogRlJPTSAlcy4lcyBXSEVSRSBjID0gJ2FiYyciLCBLU19OQU1FLCBWVDFfTkFNRSkpOworICAgIH0KKwogICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIFRocm93aW5nUnVubmFibGUKICAgICB7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1dyaXRldGltZU9yVFRMVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9lbnRpdGllcy9Xcml0ZXRpbWVPclRUTFRlc3QuamF2YQppbmRleCBjYzZjNjYzLi41NzExOTZkIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL2VudGl0aWVzL1dyaXRldGltZU9yVFRMVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vZW50aXRpZXMvV3JpdGV0aW1lT3JUVExUZXN0LmphdmEKQEAgLTE4LDE3ICsxOCwyNyBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMudmFsaWRhdGlvbi5lbnRpdGllczsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CiAKKy8qKgorICogVGVzdHMgZm9yIENRTCdzIHtAY29kZSBXUklURVRJTUV9LCB7QGNvZGUgTUFYV1JJVEVUSU1FfSBhbmQge0Bjb2RlIFRUTH0gc2VsZWN0aW9uIGZ1bmN0aW9ucy4KKyAqLwogcHVibGljIGNsYXNzIFdyaXRldGltZU9yVFRMVGVzdCBleHRlbmRzIENRTFRlc3RlcgogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVElNRVNUQU1QXzEgPSAxOwpAQCAtNzAsNyArODAsNDIgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCBsIGxpc3Q8aW50PikiKTsKLSAgICAgICAgYXNzZXJ0SW52YWxpZE11bHRpQ2VsbFNlbGVjdGlvbigibCIsIHRydWUpOworCisgICAgICAgIC8vIE51bGwgY29sdW1uCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrKSBWQUxVRVMgKDEpIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBDcmVhdGUgZW1wdHkKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwpIFZBTFVFUyAoMSwgW10pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBDcmVhdGUgd2l0aCBhIHNpbmdsZSBlbGVtZW50IHdpdGhvdXQgVFRMCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsKSBWQUxVRVMgKDEsIFsxXSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibCIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworCisgICAgICAgIC8vIEFkZCBhIG5ldyBlbGVtZW50IHRvIHRoZSBsaXN0IHdpdGggYSBuZXcgdGltZXN0YW1wIGFuZCBhIFRUTAorICAgICAgICBleGVjdXRlKCJVUERBVEUgJXMgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IFNFVCBsPWwrWzJdIFdIRVJFIGs9MSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibCIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisKKyAgICAgICAgYXNzZXJ0SW52YWxpZExpc3RFbGVtZW50U2VsZWN0aW9uKCJsWzBdIiwgImwiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZExpc3RTbGljZVNlbGVjdGlvbigibFsuLjBdIiwgImwiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZExpc3RTbGljZVNlbGVjdGlvbigibFswLi5dIiwgImwiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZExpc3RTbGljZVNlbGVjdGlvbigibFsxLi4xXSIsICJsIik7CisgICAgICAgIGFzc2VydEludmFsaWRMaXN0U2xpY2VTZWxlY3Rpb24oImxbMS4uMl0iLCAibCIpOworCisgICAgICAgIC8vIFJlYWQgbXVsdGlwbGUgcm93cyB0byB2ZXJpZnkgc2VsZWN0b3IgcmVzZXQKKyAgICAgICAgZXhlY3V0ZSgiVFJVTkNBVEUgVEFCTEUgJXMiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwpIFZBTFVFUyAoMSwgWzEsIDIsIDNdKSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8xKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwpIFZBTFVFUyAoMiwgWzEsIDJdKSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8yKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwpIFZBTFVFUyAoMywgWzFdKSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8xKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwpIFZBTFVFUyAoNCwgW10pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbCkgVkFMVUVTICg1LCBudWxsKSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8yKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRShsKSBGUk9NICVzIiwKKyAgICAgICAgICAgICAgICAgICByb3coNSwgTk9fVElNRVNUQU1QKSwKKyAgICAgICAgICAgICAgICAgICByb3coMSwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8xKSksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzIsIFRJTUVTVEFNUF8yKSksCisgICAgICAgICAgICAgICAgICAgcm93KDQsIE5PX1RJTUVTVEFNUCksCisgICAgICAgICAgICAgICAgICAgcm93KDMsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTg2LDYgKzEzMSw5IEBACiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDEsIFtdKSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOwogICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInYiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOwogCisgICAgICAgIC8vIHRydW5jYXRlLCBzaW5jZSBwcmV2aW91cyBjb2x1bW5zIHdvdWxkIHdpbiBvbiByZWNvbmNpbGxpYXRpb24gYmVjYXVzZSBvZiB0aGVpciBUVEwgKENBU1NBTkRSQS0xNDU5MikKKyAgICAgICAgZXhlY3V0ZSgiVFJVTkNBVEUgVEFCTEUgJXMiKTsKKwogICAgICAgICAvLyBVcGRhdGUgd2l0aCBhIHNpbmdsZSBlbGVtZW50IHdpdGhvdXQgVFRMCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDEsIFsxXSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMSk7CiAgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidiIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOwpAQCAtOTMsMTMgKzE0MSwxMTkgQEAKICAgICAgICAgLy8gQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIGxpc3Qgd2l0aCBhIG5ldyB0aW1lc3RhbXAgYW5kIGEgVFRMCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDEsIFsxLCAyLCAzXSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKICAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2IiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKworICAgICAgICBhc3NlcnRJbnZhbGlkTGlzdEVsZW1lbnRTZWxlY3Rpb24oInZbMV0iLCAidiIpOworICAgICAgICBhc3NlcnRJbnZhbGlkTGlzdFNsaWNlU2VsZWN0aW9uKCJ2Wy4uMF0iLCAidiIpOworICAgICAgICBhc3NlcnRJbnZhbGlkTGlzdFNsaWNlU2VsZWN0aW9uKCJ2WzAuLl0iLCAidiIpOworICAgICAgICBhc3NlcnRJbnZhbGlkTGlzdFNsaWNlU2VsZWN0aW9uKCJ2WzEuLjFdIiwgInYiKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZExpc3RTbGljZVNlbGVjdGlvbigidlsxLi4yXSIsICJ2Iik7CisKKyAgICAgICAgLy8gUmVhZCBtdWx0aXBsZSByb3dzIHRvIHZlcmlmeSBzZWxlY3RvciByZXNldAorICAgICAgICBleGVjdXRlKCJUUlVOQ0FURSBUQUJMRSAlcyIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgxLCBbMSwgMiwgM10pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzEpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgyLCBbMSwgMl0pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgzLCBbMV0pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzEpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICg0LCBbXSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDUsIG51bGwpIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHYpIEZST00gJXMiLAorICAgICAgICAgICAgICAgICAgIHJvdyg1LCBOT19USU1FU1RBTVApLAorICAgICAgICAgICAgICAgICAgIHJvdygxLCBUSU1FU1RBTVBfMSksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIFRJTUVTVEFNUF8yKSwKKyAgICAgICAgICAgICAgICAgICByb3coNCwgVElNRVNUQU1QXzIpLAorICAgICAgICAgICAgICAgICAgIHJvdygzLCBUSU1FU1RBTVBfMSkpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNldCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCBzIHNldDxpbnQ+KSIpOwotICAgICAgICBhc3NlcnRJbnZhbGlkTXVsdGlDZWxsU2VsZWN0aW9uKCJzIiwgdHJ1ZSk7CisKKyAgICAgICAgLy8gTnVsbCBjb2x1bW4KKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGspIFZBTFVFUyAoMSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIENyZWF0ZSBlbXB0eQorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICgxLCB7fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIFVwZGF0ZSB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgd2l0aG91dCBUVEwKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHMpIFZBTFVFUyAoMSwgezF9KSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzFdIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWy4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjFdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjJdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swLi5dIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1sxLi5dIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syLi5dIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swLi4xXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMS4uMV0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xKSwgdHRscyhOT19UVEwpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzEuLjJdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syLi4yXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBBZGQgYSBuZXcgZWxlbWVudCB0byB0aGUgc2V0IHdpdGggYSBuZXcgdGltZXN0YW1wIGFuZCBhIFRUTAorICAgICAgICBleGVjdXRlKCJVUERBVEUgJXMgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IFNFVCBzPXMrezJ9IFdIRVJFIGs9MSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgicyIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzFdIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1szXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWy4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjFdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjJdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKE5PX1RUTCwgVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWy4uM10iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMiksIHR0bHMoTk9fVFRMLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1sxLi5dIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKE5PX1RUTCwgVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzIuLl0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8yKSwgdHRscyhUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMy4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uMV0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xKSwgdHRscyhOT19UVEwpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjJdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKE5PX1RUTCwgVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjNdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKE5PX1RUTCwgVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzEuLjFdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1sxLi4yXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1sxLi4zXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syLi4yXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzIpLCB0dGxzKFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syLi4zXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzIpLCB0dGxzKFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1szLi4zXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzMuLjRdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIENvbWJpbmUgdGltZXN0YW1wIHNlbGVjdGlvbiB3aXRoIG90aGVyIHNlbGVjdGlvbnMgYW5kIG9yZGVycworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHNbMV0pIEZST00gJXMiLCByb3coMSwgVElNRVNUQU1QXzEpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIFdSSVRFVElNRShzWzFdKSwgayBGUk9NICVzIiwgcm93KFRJTUVTVEFNUF8xLCAxKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBXUklURVRJTUUoc1sxXSksIFdSSVRFVElNRShzWzJdKSBGUk9NICVzIiwgcm93KFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMikpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgV1JJVEVUSU1FKHNbMl0pLCBXUklURVRJTUUoc1sxXSkgRlJPTSAlcyIsIHJvdyhUSU1FU1RBTVBfMiwgVElNRVNUQU1QXzEpKTsKKworICAgICAgICAvLyBSZWFkIG11bHRpcGxlIHJvd3MgdG8gdmVyaWZ5IHNlbGVjdG9yIHJlc2V0CisgICAgICAgIGV4ZWN1dGUoIlRSVU5DQVRFIFRBQkxFICVzIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKDEsIHsxLCAyLCAzfSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKDIsIHsxLCAyfSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKDMsIHsxfSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKDQsIHt9KSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8yKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHMpIFZBTFVFUyAoNSwgbnVsbCkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMik7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBrLCBXUklURVRJTUUocykgRlJPTSAlcyIsCisgICAgICAgICAgICAgICAgICAgcm93KDUsIE5PX1RJTUVTVEFNUCksCisgICAgICAgICAgICAgICAgICAgcm93KDEsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMSkpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8yLCBUSU1FU1RBTVBfMikpLAorICAgICAgICAgICAgICAgICAgIHJvdyg0LCBOT19USU1FU1RBTVApLAorICAgICAgICAgICAgICAgICAgIHJvdygzLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xKSkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHNbMV0pIEZST00gJXMiLAorICAgICAgICAgICAgICAgICAgIHJvdyg1LCBOT19USU1FU1RBTVApLAorICAgICAgICAgICAgICAgICAgIHJvdygxLCBUSU1FU1RBTVBfMSksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIFRJTUVTVEFNUF8yKSwKKyAgICAgICAgICAgICAgICAgICByb3coNCwgTk9fVElNRVNUQU1QKSwKKyAgICAgICAgICAgICAgICAgICByb3coMywgVElNRVNUQU1QXzEpKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTEwLDI1ICsyNjQsMTgyIEBACiAgICAgICAgIC8vIE51bGwgY29sdW1uCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrKSBWQUxVRVMgKDEpIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CiAgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgicyIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKIAogICAgICAgICAvLyBDcmVhdGUgZW1wdHkKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHMpIFZBTFVFUyAoMSwge30pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CiAgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgicyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gdHJ1bmNhdGUsIHNpbmNlIHByZXZpb3VzIGNvbHVtbnMgd291bGQgd2luIG9uIHJlY29uY2lsbGlhdGlvbiBiZWNhdXNlIG9mIHRoZWlyIFRUTCAoQ0FTU0FORFJBLTE0NTkyKQorICAgICAgICBleGVjdXRlKCJUUlVOQ0FURSBUQUJMRSAlcyIpOwogCiAgICAgICAgIC8vIFVwZGF0ZSB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgd2l0aG91dCBUVEwKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHMpIFZBTFVFUyAoMSwgezF9KSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8xKTsKICAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzFdIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWy4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjFdIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjJdIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swLi5dIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1sxLi5dIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syLi5dIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swLi4xXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMC4uMl0iLCBUSU1FU1RBTVBfMSwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzEuLjFdIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1sxLi4yXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMi4uMl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syLi4zXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKIAogICAgICAgICAvLyBBZGQgYSBuZXcgZWxlbWVudCB0byB0aGUgc2V0IHdpdGggYSBuZXcgdGltZXN0YW1wIGFuZCBhIFRUTAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICgxLCB7MSwgMn0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8yLCBUVExfMik7CiAgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgicyIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzFdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzJdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzNdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWy4uMV0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbLi4yXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1suLjNdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLl0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMS4uXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1syLi5dIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzMuLl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgic1swLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjFdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjJdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzAuLjNdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzEuLjFdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzEuLjJdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzEuLjNdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzIuLjJdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzIuLjNdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJzWzMuLjNdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInNbMy4uNF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gUmVhZCBtdWx0aXBsZSByb3dzIHRvIHZlcmlmeSBzZWxlY3RvciByZXNldAorICAgICAgICBleGVjdXRlKCJUUlVOQ0FURSBUQUJMRSAlcyIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICgxLCB7MSwgMiwgM30pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzEpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICgyLCB7MSwgMn0pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICgzLCB7MX0pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzEpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICg0LCB7fSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKDUsIG51bGwpIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHMpIEZST00gJXMiLAorICAgICAgICAgICAgICAgICAgIHJvdyg1LCBOT19USU1FU1RBTVApLAorICAgICAgICAgICAgICAgICAgIHJvdygxLCBUSU1FU1RBTVBfMSksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIFRJTUVTVEFNUF8yKSwKKyAgICAgICAgICAgICAgICAgICByb3coNCwgVElNRVNUQU1QXzIpLAorICAgICAgICAgICAgICAgICAgIHJvdygzLCBUSU1FU1RBTVBfMSkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHNbMV0pIEZST00gJXMiLAorICAgICAgICAgICAgICAgICAgIHJvdyg1LCBOT19USU1FU1RBTVApLAorICAgICAgICAgICAgICAgICAgIHJvdygxLCBUSU1FU1RBTVBfMSksCisgICAgICAgICAgICAgICAgICAgcm93KDIsIFRJTUVTVEFNUF8yKSwKKyAgICAgICAgICAgICAgICAgICByb3coNCwgTk9fVElNRVNUQU1QKSwKKyAgICAgICAgICAgICAgICAgICByb3coMywgVElNRVNUQU1QXzEpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYXAoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgbSBtYXA8aW50LCBpbnQ+KSIpOwotICAgICAgICBhc3NlcnRJbnZhbGlkTXVsdGlDZWxsU2VsZWN0aW9uKCJtIiwgdHJ1ZSk7CisKKyAgICAgICAgLy8gTnVsbCBjb2x1bW4KKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGspIFZBTFVFUyAoMSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIENyZWF0ZSBlbXB0eQorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSkgVkFMVUVTICgxLCB7fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIFVwZGF0ZSB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgd2l0aG91dCBUVEwKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0pIFZBTFVFUyAoMSwgezE6MTB9KSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bLi4xXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bLi4yXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMS4uXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMi4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uMV0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xKSwgdHRscyhOT19UVEwpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjJdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxLi4xXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMS4uMl0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xKSwgdHRscyhOT19UVEwpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzIuLjJdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMi4uM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIG1hcCB3aXRoIGEgbmV3IHRpbWVzdGFtcCBhbmQgYSBUVEwKKyAgICAgICAgZXhlY3V0ZSgiVVBEQVRFICVzIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyBTRVQgbT1tK3syOjIwfSBXSEVSRSBrPTEiLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMiksIHR0bHMoTk9fVFRMLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMl0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bLi4xXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bLi4yXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjNdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKE5PX1RUTCwgVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLl0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMiksIHR0bHMoTk9fVFRMLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMS4uXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsyLi5dIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMiksIHR0bHMoVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzMuLl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjFdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi4yXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi4zXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhOT19UVEwsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxLi4xXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMS4uMl0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMiksIHR0bHMoTk9fVFRMLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMS4uM10iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMiksIHR0bHMoTk9fVFRMLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMi4uMl0iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8yKSwgdHRscyhUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMi4uM10iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8yKSwgdHRscyhUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMy4uM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVszLi40XSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBDb21iaW5lIHRpbWVzdGFtcCBzZWxlY3Rpb24gd2l0aCBvdGhlciBzZWxlY3Rpb25zIGFuZCBvcmRlcnMKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRShtWzFdKSBGUk9NICVzIiwgcm93KDEsIFRJTUVTVEFNUF8xKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBXUklURVRJTUUobVsxXSksIGsgRlJPTSAlcyIsIHJvdyhUSU1FU1RBTVBfMSwgMSkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgV1JJVEVUSU1FKG1bMV0pLCBXUklURVRJTUUobVsyXSkgRlJPTSAlcyIsIHJvdyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIFdSSVRFVElNRShtWzJdKSwgV1JJVEVUSU1FKG1bMV0pIEZST00gJXMiLCByb3coVElNRVNUQU1QXzIsIFRJTUVTVEFNUF8xKSk7CisKKyAgICAgICAgLy8gUmVhZCBtdWx0aXBsZSByb3dzIHRvIHZlcmlmeSBzZWxlY3RvciByZXNldAorICAgICAgICBleGVjdXRlKCJUUlVOQ0FURSBUQUJMRSAlcyIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSkgVkFMVUVTICgxLCB7MToxMCwgMjoyMCwgMzozMH0pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzEpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSkgVkFMVUVTICgyLCB7MToxMCwgMjoyMH0pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSkgVkFMVUVTICgzLCB7MToxMH0pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzEpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSkgVkFMVUVTICg0LCB7fSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtKSBWQUxVRVMgKDUsIG51bGwpIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKG0pIEZST00gJXMiLAorICAgICAgICAgICAgICAgICAgIHJvdyg1LCBOT19USU1FU1RBTVApLAorICAgICAgICAgICAgICAgICAgIHJvdygxLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzEpKSwKKyAgICAgICAgICAgICAgICAgICByb3coMiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMiwgVElNRVNUQU1QXzIpKSwKKyAgICAgICAgICAgICAgICAgICByb3coNCwgTk9fVElNRVNUQU1QKSwKKyAgICAgICAgICAgICAgICAgICByb3coMywgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSkpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRShtWzFdKSBGUk9NICVzIiwKKyAgICAgICAgICAgICAgICAgICByb3coNSwgTk9fVElNRVNUQU1QKSwKKyAgICAgICAgICAgICAgICAgICByb3coMSwgVElNRVNUQU1QXzEpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCBUSU1FU1RBTVBfMiksCisgICAgICAgICAgICAgICAgICAgcm93KDQsIE5PX1RJTUVTVEFNUCksCisgICAgICAgICAgICAgICAgICAgcm93KDMsIFRJTUVTVEFNUF8xKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEzOSwxOCArNDUwLDI0NCBAQAogICAgICAgICAvLyBOdWxsIGNvbHVtbgogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaykgVkFMVUVTICgxKSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOwogICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWy4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi5dIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CiAKICAgICAgICAgLy8gQ3JlYXRlIGVtcHR5CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtKSBWQUxVRVMgKDEsIHt9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOwogICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm0iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIHRydW5jYXRlLCBzaW5jZSBwcmV2aW91cyBjb2x1bW5zIHdvdWxkIHdpbiBvbiByZWNvbmNpbGxpYXRpb24gYmVjYXVzZSBvZiB0aGVpciBUVEwgKENBU1NBTkRSQS0xNDU5MikKKyAgICAgICAgZXhlY3V0ZSgiVFJVTkNBVEUgVEFCTEUgJXMiKTsKIAogICAgICAgICAvLyBDcmVhdGUgd2l0aCBhIHNpbmdsZSBlbGVtZW50IHdpdGhvdXQgVFRMCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtKSBWQUxVRVMgKDEsIHsxOjEwfSkgVVNJTkcgVElNRVNUQU1QID8iLCBUSU1FU1RBTVBfMSk7CiAgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bLi4xXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bLi4yXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMS4uXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMi4uXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uMV0iLCBUSU1FU1RBTVBfMSwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzAuLjJdIiwgVElNRVNUQU1QXzEsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxLi4xXSIsIFRJTUVTVEFNUF8xLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMS4uMl0iLCBUSU1FU1RBTVBfMSwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzIuLjJdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMi4uM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CiAKICAgICAgICAgLy8gQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIG1hcCB3aXRoIGEgbmV3IHRpbWVzdGFtcCBhbmQgYSBUVEwKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0pIFZBTFVFUyAoMSwgezE6MTAsIDI6MjB9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOwogICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsyXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVszXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWy4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsuLjFdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWy4uMl0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bLi4zXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi5dIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzEuLl0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMi4uXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVszLi5dIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoIm1bMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi4xXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi4yXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVswLi4zXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxLi4xXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxLi4yXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsxLi4zXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsyLi4yXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVsyLi4zXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgibVszLi4zXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJtWzMuLjRdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIFJlYWQgbXVsdGlwbGUgcm93cyB0byB2ZXJpZnkgc2VsZWN0b3IgcmVzZXQKKyAgICAgICAgZXhlY3V0ZSgiVFJVTkNBVEUgVEFCTEUgJXMiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0pIFZBTFVFUyAoMSwgezE6MTAsIDI6MjAsIDM6MzB9KSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8xKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0pIFZBTFVFUyAoMiwgezE6MTAsIDI6MjB9KSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8yKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0pIFZBTFVFUyAoMywgezE6MTB9KSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8xKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0pIFZBTFVFUyAoNCwge30pIFVTSU5HIFRJTUVTVEFNUCA/IiwgVElNRVNUQU1QXzIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSkgVkFMVUVTICg1LCBudWxsKSBVU0lORyBUSU1FU1RBTVAgPyIsIFRJTUVTVEFNUF8yKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRShtKSBGUk9NICVzIiwKKyAgICAgICAgICAgICAgICAgICByb3coNSwgTk9fVElNRVNUQU1QKSwKKyAgICAgICAgICAgICAgICAgICByb3coMSwgVElNRVNUQU1QXzEpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCBUSU1FU1RBTVBfMiksCisgICAgICAgICAgICAgICAgICAgcm93KDQsIFRJTUVTVEFNUF8yKSwKKyAgICAgICAgICAgICAgICAgICByb3coMywgVElNRVNUQU1QXzEpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRShtWzFdKSBGUk9NICVzIiwKKyAgICAgICAgICAgICAgICAgICByb3coNSwgTk9fVElNRVNUQU1QKSwKKyAgICAgICAgICAgICAgICAgICByb3coMSwgVElNRVNUQU1QXzEpLAorICAgICAgICAgICAgICAgICAgIHJvdygyLCBUSU1FU1RBTVBfMiksCisgICAgICAgICAgICAgICAgICAgcm93KDQsIE5PX1RJTUVTVEFNUCksCisgICAgICAgICAgICAgICAgICAgcm93KDMsIFRJTUVTVEFNUF8xKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQ29sbGVjdGlvbnMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiBtYXA8aW50LGZyb3plbjxzZXQ8aW50Pj4+KSIpOworCisgICAgICAgIC8vIE51bGwgY29sdW1uCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrKSBWQUxVRVMgKDEpIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHYpIFZBTFVFUyAoMSwgezE6ezEsMn19KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBleGVjdXRlKCJVUERBVEUgJXMgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IFNFVCB2PXYrezI6ezEsIDJ9fSBXSEVSRSBrPTEiLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidiIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhUVExfMSwgVFRMXzIpKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4xXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEpLCB0dGxzKFRUTF8xKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4yXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhUVExfMSwgVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzAuLjNdIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKFRUTF8xLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMS4uM10iLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMiksIHR0bHMoVFRMXzEsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyLi4zXSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzIpLCB0dGxzKFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszLi4zXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswXVsxXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdWzJdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF1bM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMV1bMV0iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMV1bMl0iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMV1bM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMl1bMV0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMl1bMl0iLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMl1bM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzNdWzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbM11bMV0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXVsyXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzNdWzNdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswXVswLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdWzAuLjFdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF1bMS4uMl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswXVsyLi4zXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdWzMuLjRdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxXVswLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzAuLjFdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzEuLjJdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzIuLjNdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzMuLjRdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyXVswLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzAuLjFdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzEuLjJdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzIuLjNdIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzMuLjRdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXVswLi4wXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzNdWzAuLjFdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbM11bMS4uMl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXVsyLi4zXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzNdWzMuLjRdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4xXVswXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzAuLjFdWzFdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzAuLjFdWzJdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMC4uMl1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4yXVsxXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4yXVsyXSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4yXVszXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcm96ZW5OZXN0ZWRDb2xsZWN0aW9ucygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGZyb3plbjxtYXA8aW50LGZyb3plbjxzZXQ8aW50Pj4+PikiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHYpIFZBTFVFUyAoMSwgezE6ezEsMn0sIDI6ezEsMn19KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidiIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMV0iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMl0iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdWzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF1bMV0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswXVsyXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdWzNdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxXVswXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzFdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzJdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzFdWzNdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyXVswXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzFdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzJdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzJdWzNdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXVswXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzNdWzFdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbM11bMl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXVszXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF1bMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswXVswLi4xXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzBdWzEuLjJdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMF1bMi4uM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswXVszLi40XSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMV1bMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxXVswLi4xXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxXVsxLi4yXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxXVsyLi4zXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxXVszLi40XSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMl1bMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyXVswLi4xXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyXVsxLi4yXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyXVsyLi4zXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyXVszLi40XSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbM11bMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXVswLi4xXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzNdWzEuLjJdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbM11bMi4uM10iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszXVszLi40XSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMC4uMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4xXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxLi4yXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsyLi4zXSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlszLi40XSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMC4uMF1bMF0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlswLi4wXVsxXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzAuLjFdWzBdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMC4uMV1bMV0iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInZbMC4uMV1bMl0iLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidlsxLi4yXVswXSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzEuLjJdWzFdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzEuLjJdWzJdIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ2WzEuLjJdWzNdIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNTgsNyArNjk1LDU4IEBACiAgICAgewogICAgICAgICBTdHJpbmcgdHlwZSA9IGNyZWF0ZVR5cGUoIkNSRUFURSBUWVBFICVzIChmMSBpbnQsIGYyIGludCkiKTsKICAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHQgIiArIHR5cGUgKyAnKScpOwotICAgICAgICBhc3NlcnRJbnZhbGlkTXVsdGlDZWxsU2VsZWN0aW9uKCJ0IiwgZmFsc2UpOworCisgICAgICAgIC8vIE51bGwgY29sdW1uCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrKSBWQUxVRVMgKDApIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gQm90aCBmaWVsZHMgYXJlIGVtcHR5CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDAsIHtmMTpudWxsLCBmMjpudWxsfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9MCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYxKSwgV1JJVEVUSU1FKHQuZjIpIEZST00gJXMgV0hFUkUgaz0wIiwgcm93KDAsIE5PX1RJTUVTVEFNUCwgTk9fVElNRVNUQU1QKSk7CisKKyAgICAgICAgLy8gT25seSB0aGUgZmlyc3QgZmllbGQgaXMgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDEsIHtmMToxLCBmMjpudWxsfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIE5PX1RJTUVTVEFNUCksIHR0bHMoVFRMXzEsIE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0xIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYxKSwgV1JJVEVUSU1FKHQuZjIpIEZST00gJXMgV0hFUkUgaz0xIiwgcm93KDEsIFRJTUVTVEFNUF8xLCBOT19USU1FU1RBTVApKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYyKSwgV1JJVEVUSU1FKHQuZjEpIEZST00gJXMgV0hFUkUgaz0xIiwgcm93KDEsIE5PX1RJTUVTVEFNUCwgVElNRVNUQU1QXzEpKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBzZWNvbmQgZmllbGQgaXMgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDIsIHtmMTpudWxsLCBmMjoyfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MiIsIHRpbWVzdGFtcHMoTk9fVElNRVNUQU1QLCBUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMLCBUVExfMSkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0yIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz0yIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYxKSwgV1JJVEVUSU1FKHQuZjIpIEZST00gJXMgV0hFUkUgaz0yIiwgcm93KDIsIE5PX1RJTUVTVEFNUCwgVElNRVNUQU1QXzEpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYyKSwgV1JJVEVUSU1FKHQuZjEpIEZST00gJXMgV0hFUkUgaz0yIiwgcm93KDIsIFRJTUVTVEFNUF8xLCBOT19USU1FU1RBTVApKTsKKworICAgICAgICAvLyBCb3RoIGZpZWxkcyBhcmUgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDMsIHtmMToxLCBmMjoyfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MyIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8xKSwgdHRscyhUVExfMSwgVFRMXzEpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9MyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsICJrPTMiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHQuZjEpLCBXUklURVRJTUUodC5mMikgRlJPTSAlcyBXSEVSRSBrPTMiLCByb3coMywgVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8xKSk7CisKKyAgICAgICAgLy8gSGF2aW5nIG9ubHkgdGhlIGZpcnN0IGZpZWxkIHNldCwgdXBkYXRlIHRoZSBzZWNvbmQgZmllbGQKKyAgICAgICAgZXhlY3V0ZSgiVVBEQVRFICVzIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyBTRVQgdC5mMj0yIFdIRVJFIGs9MSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTEiLCB0aW1lc3RhbXBzKFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMiksIHR0bHMoVFRMXzEsIFRUTF8yKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMSIsICJrPTEiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz0xIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYxKSwgV1JJVEVUSU1FKHQuZjIpIEZST00gJXMgV0hFUkUgaz0xIiwgcm93KDEsIFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMikpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHQuZjIpLCBXUklURVRJTUUodC5mMSkgRlJPTSAlcyBXSEVSRSBrPTEiLCByb3coMSwgVElNRVNUQU1QXzIsIFRJTUVTVEFNUF8xKSk7CisKKyAgICAgICAgLy8gSGF2aW5nIG9ubHkgdGhlIHNlY29uZCBmaWVsZCBzZXQsIHVwZGF0ZSB0aGUgc2Vjb25kIGZpZWxkCisgICAgICAgIGV4ZWN1dGUoIlVQREFURSAlcyBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8gU0VUIHQuZjE9MSBXSEVSRSBrPTIiLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz0yIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMiwgVElNRVNUQU1QXzEpLCB0dGxzKFRUTF8yLCBUVExfMSkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0yIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MiIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBrLCBXUklURVRJTUUodC5mMSksIFdSSVRFVElNRSh0LmYyKSBGUk9NICVzIFdIRVJFIGs9MiIsIHJvdygyLCBUSU1FU1RBTVBfMiwgVElNRVNUQU1QXzEpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYyKSwgV1JJVEVUSU1FKHQuZjEpIEZST00gJXMgV0hFUkUgaz0yIiwgcm93KDIsIFRJTUVTVEFNUF8xLCBUSU1FU1RBTVBfMikpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNzAsMjIgKzc1OCwzNDMgQEAKICAgICAgICAgLy8gTnVsbCBjb2x1bW4KICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGspIFZBTFVFUyAoMCkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKICAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKIAogICAgICAgICAvLyBCb3RoIGZpZWxkcyBhcmUgZW1wdHkKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMCwge2YxOm51bGwsIGYyOm51bGx9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOwogICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz0wIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9MCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIGssIFdSSVRFVElNRSh0LmYxKSwgV1JJVEVUSU1FKHQuZjIpIEZST00gJXMgV0hFUkUgaz0wIiwgcm93KDAsIE5PX1RJTUVTVEFNUCwgTk9fVElNRVNUQU1QKSk7CiAKICAgICAgICAgLy8gT25seSB0aGUgZmlyc3QgZmllbGQgaXMgc2V0CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDEsIHtmMToxLCBmMjpudWxsfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKICAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMSIsICJrPTEiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz0xIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHQuZjEpLCBXUklURVRJTUUodC5mMikgRlJPTSAlcyBXSEVSRSBrPTEiLCByb3coMSwgVElNRVNUQU1QXzEsIE5PX1RJTUVTVEFNUCkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgaywgV1JJVEVUSU1FKHQuZjIpLCBXUklURVRJTUUodC5mMSkgRlJPTSAlcyBXSEVSRSBrPTEiLCByb3coMSwgTk9fVElNRVNUQU1QLCBUSU1FU1RBTVBfMSkpOwogCiAgICAgICAgIC8vIE9ubHkgdGhlIHNlY29uZCBmaWVsZCBpcyBzZXQKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMiwge2YxOm51bGwsIGYyOjJ9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOwogICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz0yIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9MiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MiIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBrLCBXUklURVRJTUUodC5mMSksIFdSSVRFVElNRSh0LmYyKSBGUk9NICVzIFdIRVJFIGs9MiIsIHJvdygyLCBOT19USU1FU1RBTVAsIFRJTUVTVEFNUF8xKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBrLCBXUklURVRJTUUodC5mMiksIFdSSVRFVElNRSh0LmYxKSBGUk9NICVzIFdIRVJFIGs9MiIsIHJvdygyLCBUSU1FU1RBTVBfMSwgTk9fVElNRVNUQU1QKSk7CiAKICAgICAgICAgLy8gQm90aCBmaWVsZHMgYXJlIHNldAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgzLCB7ZjE6MSwgZjI6Mn0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CiAgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTMiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0zIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBrLCBXUklURVRJTUUodC5mMSksIFdSSVRFVElNRSh0LmYyKSBGUk9NICVzIFdIRVJFIGs9MyIsIHJvdygzLCBUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRVRFRzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIG5lc3RlZFR5cGUgPSBjcmVhdGVUeXBlKCJDUkVBVEUgVFlQRSAlcyAoZjEgaW50LCBmMiBpbnQpIik7CisgICAgICAgIFN0cmluZyB0eXBlID0gY3JlYXRlVHlwZShmb3JtYXQoIkNSRUFURSBUWVBFICUlcyAoZjEgZnJvemVuPCVzPiwgZjIgZnJvemVuPCU8cz4pIiwgbmVzdGVkVHlwZSkpOworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdCAiICsgdHlwZSArICcpJyk7CisKKyAgICAgICAgLy8gQm90aCBmaWVsZHMgYXJlIGVtcHR5CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDEsIHtmMTpudWxsLCBmMjpudWxsfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYyIiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9MSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBmaXJzdCBmaWVsZCBpcyBzZXQsIG5vIG5lc3RlZCBmaWVsZCBpcyBzZXQKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMiwge2YxOntmMTpudWxsLGYyOm51bGx9LCBmMjpudWxsfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MiIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIE5PX1RJTUVTVEFNUCksIHR0bHMoVFRMXzEsIE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0yIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9MiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYyIiwgIms9MiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9MiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9MiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBmaXJzdCBmaWVsZCBpcyBzZXQsIG9ubHkgdGhlIGZpcnN0IG5lc3RlZCBmaWVsZCBpcyBzZXQKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMywge2YxOntmMToxLGYyOm51bGx9LCBmMjpudWxsfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MiIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIE5PX1RJTUVTVEFNUCksIHR0bHMoVFRMXzEsIE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0zIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9MyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gT25seSB0aGUgZmlyc3QgZmllbGQgaXMgc2V0LCBvbmx5IHRoZSBzZWNvbmQgbmVzdGVkIGZpZWxkIGlzIHNldAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICg0LCB7ZjE6e2YxOm51bGwsZjI6Mn0sIGYyOm51bGx9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz00IiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgTk9fVElNRVNUQU1QKSwgdHRscyhUVExfMSwgTk9fVFRMKSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMSIsICJrPTQiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz00IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz00IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9NCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9NCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9NCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBmaXJzdCBmaWVsZCBpcyBzZXQsIGJvdGggbmVzdGVkIGZpZWxkIGFyZSBzZXQKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoNSwge2YxOntmMToxLGYyOjJ9LCBmMjpudWxsfSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9NSIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIE5PX1RJTUVTVEFNUCksIHR0bHMoVFRMXzEsIE5PX1RUTCkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz01IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9NSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTUiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz01IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjEiLCAiaz01IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjIiLCAiaz01IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIE9ubHkgdGhlIHNlY29uZCBmaWVsZCBpcyBzZXQsIG5vIG5lc3RlZCBmaWVsZCBpcyBzZXQKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoNiwge2YxOm51bGwsIGYyOntmMTpudWxsLGYyOm51bGx9fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9NiIsIHRpbWVzdGFtcHMoTk9fVElNRVNUQU1QLCBUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMLCBUVExfMSkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz02IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz02IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz02IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz02IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9NiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9NiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBzZWNvbmQgZmllbGQgaXMgc2V0LCBvbmx5IHRoZSBmaXJzdCBuZXN0ZWQgZmllbGQgaXMgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDcsIHtmMTpudWxsLCBmMjp7ZjE6MSxmMjpudWxsfX0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTciLCB0aW1lc3RhbXBzKE5PX1RJTUVTVEFNUCwgVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCwgVFRMXzEpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9NyIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9NyIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYyIiwgIms9NyIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9NyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTciLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjIiLCAiaz03IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIE9ubHkgdGhlIHNlY29uZCBmaWVsZCBpcyBzZXQsIG9ubHkgdGhlIHNlY29uZCBuZXN0ZWQgZmllbGQgaXMgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDgsIHtmMTpudWxsLCBmMjp7ZjE6bnVsbCxmMjoyfX0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTgiLCB0aW1lc3RhbXBzKE5PX1RJTUVTVEFNUCwgVElNRVNUQU1QXzEpLCB0dGxzKE5PX1RUTCwgVFRMXzEpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9OCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9OCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYyIiwgIms9OCIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9OCIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTgiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTgiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworCisgICAgICAgIC8vIE9ubHkgdGhlIHNlY29uZCBmaWVsZCBpcyBzZXQsIGJvdGggbmVzdGVkIGZpZWxkIGFyZSBzZXQKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoOSwge2YxOm51bGwsIGYyOntmMToxLGYyOjJ9fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9OSIsIHRpbWVzdGFtcHMoTk9fVElNRVNUQU1QLCBUSU1FU1RBTVBfMSksIHR0bHMoTk9fVFRMLCBUVExfMSkpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz05IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz05IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz05IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz05IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9OSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTkiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworCisgICAgICAgIC8vIEJvdGggZmllbGRzIGFyZSBzZXQsIGFsdGVybmF0ZSBmaWVsZHMgYXJlIHNldAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgxMCwge2YxOntmMToxfX0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGV4ZWN1dGUoIlVQREFURSAlcyBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8gU0VUIHQuZjI9e2YyOjJ9IFdIRVJFIGs9MTAiLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz0xMCIsIHRpbWVzdGFtcHMoVElNRVNUQU1QXzEsIFRJTUVTVEFNUF8yKSwgdHRscyhUVExfMSwgVFRMXzIpKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9MTAiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz0xMCIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTEwIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz0xMCIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTEwIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjIiLCAiaz0xMCIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisKKyAgICAgICAgLy8gQm90aCBmaWVsZHMgYXJlIHNldCwgYWx0ZXJuYXRlIGZpZWxkcyBhcmUgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDExLCB7ZjE6e2YyOjJ9fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgZXhlY3V0ZSgiVVBEQVRFICVzIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyBTRVQgdC5mMj17ZjE6Mn0gV0hFUkUgaz0xMSIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTExIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKFRUTF8xLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0xMSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTExIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz0xMSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsICJrPTExIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9MTEiLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjIiLCAiaz0xMSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBCb3RoIGZpZWxkcyBhcmUgc2V0LCBhbGwgZmllbGRzIGFyZSBzZXQKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMTIsIHtmMTp7ZjE6MSxmMjoyfX0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGV4ZWN1dGUoIlVQREFURSAlcyBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8gU0VUIHQuZjI9e2YxOjEsZjI6Mn0gV0hFUkUgaz0xMiIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTEyIiwgdGltZXN0YW1wcyhUSU1FU1RBTVBfMSwgVElNRVNUQU1QXzIpLCB0dGxzKFRUTF8xLCBUVExfMikpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0xMiIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTEyIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYyIiwgIms9MTIiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz0xMiIsIFRJTUVTVEFNUF8yLCBUVExfMik7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTEyIiwgVElNRVNUQU1QXzIsIFRUTF8yKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9MTIiLCBUSU1FU1RBTVBfMiwgVFRMXzIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZyb3plbk5lc3RlZFVEVHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgbmVzdGVkVHlwZSA9IGNyZWF0ZVR5cGUoIkNSRUFURSBUWVBFICVzIChmMSBpbnQsIGYyIGludCkiKTsKKyAgICAgICAgU3RyaW5nIHR5cGUgPSBjcmVhdGVUeXBlKGZvcm1hdCgiQ1JFQVRFIFRZUEUgJSVzIChmMSBmcm96ZW48JXM+LCBmMiBmcm96ZW48JTxzPikiLCBuZXN0ZWRUeXBlKSk7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB0IGZyb3plbjwiICsgdHlwZSArICI+KSIpOworCisgICAgICAgIC8vIEJvdGggZmllbGRzIGFyZSBlbXB0eQorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgxLCB7ZjE6bnVsbCwgZjI6bnVsbH0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTEiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0xIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz0xIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz0xIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz0xIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjEiLCAiaz0xIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjIiLCAiaz0xIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIE9ubHkgdGhlIGZpcnN0IGZpZWxkIGlzIHNldCwgbm8gbmVzdGVkIGZpZWxkIGlzIHNldAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgyLCB7ZjE6e2YxOm51bGwsZjI6bnVsbH0sIGYyOm51bGx9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz0yIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9MiIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTIiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTIiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsICJrPTIiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTIiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTIiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gT25seSB0aGUgZmlyc3QgZmllbGQgaXMgc2V0LCBvbmx5IHRoZSBmaXJzdCBuZXN0ZWQgZmllbGQgaXMgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDMsIHtmMTp7ZjE6MSxmMjpudWxsfSwgZjI6bnVsbH0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTMiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0zIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9MyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTMiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gT25seSB0aGUgZmlyc3QgZmllbGQgaXMgc2V0LCBvbmx5IHRoZSBzZWNvbmQgbmVzdGVkIGZpZWxkIGlzIHNldAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICg0LCB7ZjE6e2YxOm51bGwsZjI6Mn0sIGYyOm51bGx9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz00IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9NCIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTQiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTQiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz00IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjEiLCAiaz00IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjIiLCAiaz00IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIE9ubHkgdGhlIGZpcnN0IGZpZWxkIGlzIHNldCwgYm90aCBuZXN0ZWQgZmllbGQgYXJlIHNldAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICg1LCB7ZjE6e2YxOjEsZjI6Mn0sIGYyOm51bGx9KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz01IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxIiwgIms9NSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTUiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz01IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9NSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9NSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9NSIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBzZWNvbmQgZmllbGQgaXMgc2V0LCBubyBuZXN0ZWQgZmllbGQgaXMgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDYsIHtmMTpudWxsLCBmMjp7ZjE6bnVsbCxmMjpudWxsfX0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTYiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz02IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz02IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz02IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz02IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9NiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9NiIsIE5PX1RJTUVTVEFNUCwgTk9fVFRMKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBzZWNvbmQgZmllbGQgaXMgc2V0LCBvbmx5IHRoZSBmaXJzdCBuZXN0ZWQgZmllbGQgaXMgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDcsIHtmMTpudWxsLCBmMjp7ZjE6MSxmMjpudWxsfX0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTciLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz03IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz03IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz03IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz03IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9NyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTciLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisKKyAgICAgICAgLy8gT25seSB0aGUgc2Vjb25kIGZpZWxkIGlzIHNldCwgb25seSB0aGUgc2Vjb25kIG5lc3RlZCBmaWVsZCBpcyBzZXQKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoOCwge2YxOm51bGwsIGYyOntmMTpudWxsLGYyOjJ9fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9OCIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMSIsICJrPTgiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTgiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTgiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsICJrPTgiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjEiLCAiaz04IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjIiLCAiaz04IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKworICAgICAgICAvLyBPbmx5IHRoZSBzZWNvbmQgZmllbGQgaXMgc2V0LCBib3RoIG5lc3RlZCBmaWVsZCBhcmUgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDksIHtmMTpudWxsLCBmMjp7ZjE6MSxmMjoyfX0pIFVTSU5HIFRJTUVTVEFNUCA/IEFORCBUVEwgPyIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidCIsICJrPTkiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz05IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjEiLCAiaz05IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEuZjIiLCAiaz05IiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz05IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9OSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTkiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworCisgICAgICAgIC8vIEJvdGggZmllbGRzIGFyZSBzZXQsIGFsdGVybmF0ZSBmaWVsZHMgYXJlIHNldAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgxMCwge2YxOntmMToxfSwgZjI6e2YyOjJ9fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MTAiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0xMCIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTEwIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYyIiwgIms9MTAiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMiIsICJrPTEwIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYxIiwgIms9MTAiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTEwIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgLy8gQm90aCBmaWVsZHMgYXJlIHNldCwgYWx0ZXJuYXRlIGZpZWxkcyBhcmUgc2V0CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDExLCB7ZjE6e2YyOjJ9LCBmMjp7ZjE6MX19KSBVU0lORyBUSU1FU1RBTVAgPyBBTkQgVFRMID8iLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQiLCAiaz0xMSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMSIsICJrPTExIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYxIiwgIms9MTEiLCBOT19USU1FU1RBTVAsIE5PX1RUTCk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMiIsICJrPTExIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyIiwgIms9MTEiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIuZjEiLCAiaz0xMSIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMiIsICJrPTExIiwgTk9fVElNRVNUQU1QLCBOT19UVEwpOworCisgICAgICAgIC8vIEJvdGggZmllbGRzIGFyZSBzZXQsIGFsbCBmaWVsZHMgYXJlIHNldAorICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgxMiwge2YxOntmMToxLGYyOjJ9LGYyOntmMToxLGYyOjJ9fSkgVVNJTkcgVElNRVNUQU1QID8gQU5EIFRUTCA/IiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0IiwgIms9MTIiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjEiLCAiaz0xMiIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMS5mMSIsICJrPTEyIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYxLmYyIiwgIms9MTIiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgICAgICBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoInQuZjIiLCAiaz0xMiIsIFRJTUVTVEFNUF8xLCBUVExfMSk7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTCgidC5mMi5mMSIsICJrPTEyIiwgVElNRVNUQU1QXzEsIFRUTF8xKTsKKyAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKCJ0LmYyLmYyIiwgIms9MTIiLCBUSU1FU1RBTVBfMSwgVFRMXzEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZ1bmN0aW9ucygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGludCwgcyBzZXQ8aW50PiwgZnMgZnJvemVuPHNldDxpbnQ+PikiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHYsIHMsIGZzKSBWQUxVRVMgKDAsIDAsIHsxLCAyLCAzfSwgezEsIDIsIDN9KSBVU0lORyBUSU1FU1RBTVAgMSBBTkQgVFRMIDEwMDAiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHYsIHMsIGZzKSBWQUxVRVMgKDEsIDEsIHsxMCwgMjAsIDMwfSwgezEwLCAyMCwgMzB9KSBVU0lORyBUSU1FU1RBTVAgMTAgQU5EIFRUTCAxMDAwIik7CisgICAgICAgIGV4ZWN1dGUoIlVQREFURSAlcyBVU0lORyBUSU1FU1RBTVAgMiBBTkQgVFRMIDIwMDAgU0VUIHMgPSBzICsgezIsIDN9IFdIRVJFIGsgPSAwIik7CisgICAgICAgIGV4ZWN1dGUoIlVQREFURSAlcyBVU0lORyBUSU1FU1RBTVAgMjAgQU5EIFRUTCAyMDAwIFNFVCBzID0gcyArIHsyMCwgMzB9IFdIRVJFIGsgPSAxIik7CisKKyAgICAgICAgLy8gUmVndWxhciBjb2x1bW4KKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1pbih2KSBGUk9NICVzIiwgcm93KDApKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1heCh2KSBGUk9NICVzIiwgcm93KDEpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIHdyaXRldGltZSh2KSBGUk9NICVzIiwgcm93KDEwTCksIHJvdygxTCkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgbWluKHdyaXRldGltZSh2KSkgRlJPTSAlcyIsIHJvdygxTCkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgbWF4KHdyaXRldGltZSh2KSkgRlJPTSAlcyIsIHJvdygxMEwpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1pbihtYXh3cml0ZXRpbWUodikpIEZST00gJXMiLCByb3coMUwpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1heChtYXh3cml0ZXRpbWUodikpIEZST00gJXMiLCByb3coMTBMKSk7CisKKyAgICAgICAgLy8gRnJvemVuIGNvbGxlY3Rpb24KKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1pbihmcykgRlJPTSAlcyIsIHJvdyhzZXQoMSwgMiwgMykpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1heChmcykgRlJPTSAlcyIsIHJvdyhzZXQoMTAsIDIwLCAzMCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIHdyaXRldGltZShmcykgRlJPTSAlcyIsIHJvdygxMEwpLCByb3coMUwpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1pbih3cml0ZXRpbWUoZnMpKSBGUk9NICVzIiwgcm93KDFMKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBtYXgod3JpdGV0aW1lKGZzKSkgRlJPTSAlcyIsIHJvdygxMEwpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1pbihtYXh3cml0ZXRpbWUoZnMpKSBGUk9NICVzIiwgcm93KDFMKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBtYXgobWF4d3JpdGV0aW1lKGZzKSkgRlJPTSAlcyIsIHJvdygxMEwpKTsKKworICAgICAgICAvLyBNdWx0aS1jZWxsIGNvbGxlY3Rpb24KKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1pbihzKSBGUk9NICVzIiwgcm93KHNldCgxLCAyLCAzKSkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgbWF4KHMpIEZST00gJXMiLCByb3coc2V0KDEwLCAyMCwgMzApKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCB3cml0ZXRpbWUocykgRlJPTSAlcyIsIHJvdyhsaXN0KDEwTCwgMjBMLCAyMEwpKSwgcm93KGxpc3QoMUwsIDJMLCAyTCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cygiU0VMRUNUIG1pbih3cml0ZXRpbWUocykpIEZST00gJXMiLCByb3cobGlzdCgxTCwgMkwsIDJMKSkpOworICAgICAgICBhc3NlcnRSb3dzKCJTRUxFQ1QgbWF4KHdyaXRldGltZShzKSkgRlJPTSAlcyIsIHJvdyhsaXN0KDEwTCwgMjBMLCAyMEwpKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBtaW4obWF4d3JpdGV0aW1lKHMpKSBGUk9NICVzIiwgcm93KDJMKSk7CisgICAgICAgIGFzc2VydFJvd3MoIlNFTEVDVCBtYXgobWF4d3JpdGV0aW1lKHMpKSBGUk9NICVzIiwgcm93KDIwTCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8SW50ZWdlcj4gdHRscyhJbnRlZ2VyLi4uIGEpCisgICAgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChhKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PExvbmc+IHRpbWVzdGFtcHMoTG9uZy4uLiBhKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoYSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJvd3MoU3RyaW5nIHF1ZXJ5LCBPYmplY3RbXS4uLiByb3dzKSB0aHJvd3MgVGhyb3dhYmxlCkBAIC0xOTgsMjMgKzExMDcsMzQgQEAKICAgICAgICAgYXNzZXJ0V3JpdGV0aW1lQW5kVFRMKGNvbHVtbiwgbnVsbCwgdGltZXN0YW1wLCB0dGwpOwogICAgIH0KIAorICAgIHByaXZhdGUgdm9pZCBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoU3RyaW5nIGNvbHVtbiwgTGlzdDxMb25nPiB0aW1lc3RhbXBzLCBMaXN0PEludGVnZXI+IHR0bHMpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdyaXRldGltZUFuZFRUTChjb2x1bW4sIG51bGwsIHRpbWVzdGFtcHMsIHR0bHMpOworICAgIH0KKwogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRXcml0ZXRpbWVBbmRUVEwoU3RyaW5nIGNvbHVtbiwgU3RyaW5nIHdoZXJlLCBMb25nIHRpbWVzdGFtcCwgSW50ZWdlciB0dGwpCiAgICAgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgd2hlcmUgPSB3aGVyZSA9PSBudWxsID8gIiIgOiAiIFdIRVJFICIgKyB3aGVyZTsKIAogICAgICAgICAvLyBWZXJpZnkgd3JpdGUgdGltZQotICAgICAgICBTdHJpbmcgd3JpdGV0aW1lUXVlcnkgPSBTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgV1JJVEVUSU1FKCVzKSBGUk9NICUlcyAlcyIsIGNvbHVtbiwgd2hlcmUpOwotICAgICAgICBhc3NlcnRSb3dzKHdyaXRldGltZVF1ZXJ5LCByb3codGltZXN0YW1wKSk7CisgICAgICAgIGFzc2VydFJvd3MoZm9ybWF0KCJTRUxFQ1QgV1JJVEVUSU1FKCVzKSBGUk9NICUlcyAlcyIsIGNvbHVtbiwgd2hlcmUpLCByb3codGltZXN0YW1wKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IG1heCB3cml0ZSB0aW1lCisgICAgICAgIGFzc2VydFJvd3MoZm9ybWF0KCJTRUxFQ1QgTUFYV1JJVEVUSU1FKCVzKSBGUk9NICUlcyAlcyIsIGNvbHVtbiwgd2hlcmUpLCByb3codGltZXN0YW1wKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHdyaXRlIHRpbWUgYW5kIG1heCB3cml0ZSB0aW1lIHRvZ2V0aGVyCisgICAgICAgIGFzc2VydFJvd3MoZm9ybWF0KCJTRUxFQ1QgV1JJVEVUSU1FKCVzKSwgTUFYV1JJVEVUSU1FKCVzKSBGUk9NICUlcyAlcyIsIGNvbHVtbiwgY29sdW1uLCB3aGVyZSksCisgICAgICAgICAgICAgICAgICAgcm93KHRpbWVzdGFtcCwgdGltZXN0YW1wKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHR0bAotICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJzID0gZXhlY3V0ZShTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgVFRMKCVzKSBGUk9NICUlcyAlcyIsIGNvbHVtbiwgd2hlcmUpKTsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoZm9ybWF0KCJTRUxFQ1QgVFRMKCVzKSBGUk9NICUlcyAlcyIsIGNvbHVtbiwgd2hlcmUpKTsKICAgICAgICAgYXNzZXJ0Um93Q291bnQocnMsIDEpOwogICAgICAgICBVbnR5cGVkUmVzdWx0U2V0LlJvdyByb3cgPSBycy5vbmUoKTsKLSAgICAgICAgU3RyaW5nIHR0bENvbHVtbiA9IFN0cmluZy5mb3JtYXQoInR0bCglcykiLCBjb2x1bW4pOworICAgICAgICBTdHJpbmcgdHRsQ29sdW1uID0gZm9ybWF0KCJ0dGwoJXMpIiwgY29sdW1uKTsKICAgICAgICAgaWYgKHR0bCA9PSBudWxsKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnRUVEwodHRsLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKHJvdy5oYXModHRsQ29sdW1uKSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0yMjIsNiArMTE0Miw0NSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFdyaXRldGltZUFuZFRUTChTdHJpbmcgY29sdW1uLCBTdHJpbmcgd2hlcmUsIExpc3Q8TG9uZz4gdGltZXN0YW1wcywgTGlzdDxJbnRlZ2VyPiB0dGxzKQorICAgIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHdoZXJlID0gd2hlcmUgPT0gbnVsbCA/ICIiIDogIiBXSEVSRSAiICsgd2hlcmU7CisKKyAgICAgICAgLy8gVmVyaWZ5IHdyaXRlIHRpbWUKKyAgICAgICAgYXNzZXJ0Um93cyhmb3JtYXQoIlNFTEVDVCBXUklURVRJTUUoJXMpIEZST00gJSVzICVzIiwgY29sdW1uLCB3aGVyZSksIHJvdyh0aW1lc3RhbXBzKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IG1heCB3cml0ZSB0aW1lCisgICAgICAgIExvbmcgbWF4VGltZXN0YW1wID0gdGltZXN0YW1wcy5zdHJlYW0oKS5maWx0ZXIoT2JqZWN0czo6bm9uTnVsbCkubWF4KExvbmc6OmNvbXBhcmUpLm9yRWxzZShudWxsKTsKKyAgICAgICAgYXNzZXJ0Um93cyhmb3JtYXQoIlNFTEVDVCBNQVhXUklURVRJTUUoJXMpIEZST00gJSVzICVzIiwgY29sdW1uLCB3aGVyZSksIHJvdyhtYXhUaW1lc3RhbXApKTsKKworICAgICAgICAvLyBWZXJpZnkgd3JpdGUgdGltZSBhbmQgbWF4IHdyaXRlIHRpbWUgdG9nZXRoZXIKKyAgICAgICAgYXNzZXJ0Um93cyhmb3JtYXQoIlNFTEVDVCBXUklURVRJTUUoJXMpLCBNQVhXUklURVRJTUUoJXMpIEZST00gJSVzICVzIiwgY29sdW1uLCBjb2x1bW4sIHdoZXJlKSwKKyAgICAgICAgICAgICAgICAgICByb3codGltZXN0YW1wcywgbWF4VGltZXN0YW1wKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHR0bAorICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJzID0gZXhlY3V0ZShmb3JtYXQoIlNFTEVDVCBUVEwoJXMpIEZST00gJSVzICVzIiwgY29sdW1uLCB3aGVyZSkpOworICAgICAgICBhc3NlcnRSb3dDb3VudChycywgMSk7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQuUm93IHJvdyA9IHJzLm9uZSgpOworICAgICAgICBTdHJpbmcgdHRsQ29sdW1uID0gZm9ybWF0KCJ0dGwoJXMpIiwgY29sdW1uKTsKKyAgICAgICAgaWYgKHR0bHMgPT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uocm93Lmhhcyh0dGxDb2x1bW4pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExpc3Q8SW50ZWdlcj4gYWN0dWFsVFRMcyA9IHJvdy5nZXRMaXN0KHR0bENvbHVtbiwgSW50MzJUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0dGxzLnNpemUoKSwgYWN0dWFsVFRMcy5zaXplKCkpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFjdHVhbFRUTHMuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW50ZWdlciBleHBlY3RlZFRUTCA9IHR0bHMuZ2V0KGkpOworICAgICAgICAgICAgICAgIEludGVnZXIgYWN0dWFsVFRMID0gYWN0dWFsVFRMcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VFRMKGV4cGVjdGVkVFRMLCBhY3R1YWxUVEwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgLyoqCiAgICAgICogU2luY2UgdGhlIHJldHVybmVkIFRUTCBpcyB0aGUgcmVtYWluaW5nIHNlY29uZHMgc2luY2UgbGFzdCB1cGRhdGUsIGl0IGNvdWxkIGJlIGxvd2VyIHRoYW4gdGhlCiAgICAgICogc3BlY2lmaWVkIFRUTCBkZXBlbmRpbmcgb24gdGhlIHRlc3QgZXhlY3V0aW9uIHRpbWUsIHNlIHdlIGFsbG93IHVwIHRvIG9uZS1taW51dGUgZGlmZmVyZW5jZQpAQCAtMjQyLDIzICsxMjAxLDQyIEBACiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0SW52YWxpZFByaW1hcnlLZXlTZWxlY3Rpb24oU3RyaW5nIGNvbHVtbikgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiQ2Fubm90IHVzZSBzZWxlY3Rpb24gZnVuY3Rpb24gd3JpdGVUaW1lIG9uIFBSSU1BUlkgS0VZIHBhcnQgIiArIGNvbHVtbiwKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiQ2Fubm90IHVzZSBzZWxlY3Rpb24gZnVuY3Rpb24gd3JpdGV0aW1lIG9uIFBSSU1BUlkgS0VZIHBhcnQgIiArIGNvbHVtbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgV1JJVEVUSU1FKCVzKSBGUk9NICUlcyIsIGNvbHVtbikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiU0VMRUNUIFdSSVRFVElNRSglcykgRlJPTSAlJXMiLCBjb2x1bW4pKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZSgiQ2Fubm90IHVzZSBzZWxlY3Rpb24gZnVuY3Rpb24gbWF4d3JpdGV0aW1lIG9uIFBSSU1BUlkgS0VZIHBhcnQgIiArIGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlNFTEVDVCBNQVhXUklURVRJTUUoJXMpIEZST00gJSVzIiwgY29sdW1uKSk7CiAgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoIkNhbm5vdCB1c2Ugc2VsZWN0aW9uIGZ1bmN0aW9uIHR0bCBvbiBQUklNQVJZIEtFWSBwYXJ0ICIgKyBjb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiU0VMRUNUIFRUTCglcykgRlJPTSAlJXMiLCBjb2x1bW4pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlNFTEVDVCBUVEwoJXMpIEZST00gJSVzIiwgY29sdW1uKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEludmFsaWRNdWx0aUNlbGxTZWxlY3Rpb24oU3RyaW5nIGNvbHVtbiwgYm9vbGVhbiBpc0NvbGxlY3Rpb24pIHRocm93cyBUaHJvd2FibGUKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0SW52YWxpZExpc3RFbGVtZW50U2VsZWN0aW9uKFN0cmluZyBjb2x1bW4sIFN0cmluZyBsaXN0KSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdCgiQ2Fubm90IHVzZSBzZWxlY3Rpb24gZnVuY3Rpb24gJSVzIG9uIG5vbi1mcm96ZW4gJXMgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbGxlY3Rpb24gPyAiY29sbGVjdGlvbiIgOiAiVURUIiwgY29sdW1uKTsKLSAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZShmb3JtYXQobWVzc2FnZSwgIndyaXRlVGltZSIpLAorICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGZvcm1hdCgiRWxlbWVudCBzZWxlY3Rpb24gaXMgb25seSBhbGxvd2VkIG9uIHNldHMgYW5kIG1hcHMsIGJ1dCAlcyBpcyBhIGxpc3QiLCBsaXN0KTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZShtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlNFTEVDVCBXUklURVRJTUUoJXMpIEZST00gJSVzIiwgY29sdW1uKSk7Ci0gICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UoZm9ybWF0KG1lc3NhZ2UsICJ0dGwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlNFTEVDVCBXUklURVRJTUUoJXMpIEZST00gJSVzIiwgY29sdW1uKSk7CisgICAgICAgIGFzc2VydEludmFsaWRUaHJvd01lc3NhZ2UobWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbi5jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgVFRMKCVzKSBGUk9NICUlcyIsIGNvbHVtbikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiU0VMRUNUIE1BWFdSSVRFVElNRSglcykgRlJPTSAlJXMiLCBjb2x1bW4pKTsKKyAgICAgICAgYXNzZXJ0SW52YWxpZFRocm93TWVzc2FnZShtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiU0VMRUNUIFRUTCglcykgRlJPTSAlJXMiLCBjb2x1bW4pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0SW52YWxpZExpc3RTbGljZVNlbGVjdGlvbihTdHJpbmcgY29sdW1uLCBTdHJpbmcgbGlzdCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBmb3JtYXQoIlNsaWNlIHNlbGVjdGlvbiBpcyBvbmx5IGFsbG93ZWQgb24gc2V0cyBhbmQgbWFwcywgYnV0ICVzIGlzIGEgbGlzdCIsIGxpc3QpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJTRUxFQ1QgV1JJVEVUSU1FKCVzKSBGUk9NICUlcyIsIGNvbHVtbikpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJTRUxFQ1QgTUFYV1JJVEVUSU1FKCVzKSBGUk9NICUlcyIsIGNvbHVtbikpOworICAgICAgICBhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJTRUxFQ1QgVFRMKCVzKSBGUk9NICUlcyIsIGNvbHVtbikpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vbWlzY2VsbGFuZW91cy9PdmVyZmxvd1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vbWlzY2VsbGFuZW91cy9PdmVyZmxvd1Rlc3QuamF2YQppbmRleCAwZDllMDQzLi45MDkyZjk0IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL21pc2NlbGxhbmVvdXMvT3ZlcmZsb3dUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9taXNjZWxsYW5lb3VzL092ZXJmbG93VGVzdC5qYXZhCkBAIC0xNzAsOCArMTcwLDggQEAKICAgICB7CiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCBpIHZhcmludCwgYiBibG9iKSIpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBpLCBiKSBWQUxVRVMgKDAsIGJsb2JBc1ZhcmludChiaWdpbnRBc0Jsb2IoMykpLCB0ZXh0QXNCbG9iKCdmb29iYXInKSkiKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaSwgYmxvYkFzVGV4dChiKSBGUk9NICVzIFdIRVJFIGsgPSAwIiksCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBpLCBiKSBWQUxVRVMgKDAsIGJsb2JfYXNfdmFyaW50KGJpZ2ludF9hc19ibG9iKDMpKSwgdGV4dF9hc19ibG9iKCdmb29iYXInKSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgaSwgYmxvYl9hc190ZXh0KGIpIEZST00gJXMgV0hFUkUgayA9IDAiKSwKICAgICAgICAgICAgICAgICAgICByb3coQmlnSW50ZWdlci52YWx1ZU9mKDMpLCAiZm9vYmFyIikpOwogICAgIH0KIApAQCAtMjMwLDcgKzIzMCw3IEBACiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB0IHRpbWV1dWlkLCkiKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaykgVkFMVUVTICgwKSIpOwotICAgICAgICBPYmplY3RbXVtdIHJvd3MgPSBnZXRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBkYXRlT2YodCkgRlJPTSAlcyBXSEVSRSBrPTAiKSk7CisgICAgICAgIE9iamVjdFtdW10gcm93cyA9IGdldFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHRvX3RpbWVzdGFtcCh0KSBGUk9NICVzIFdIRVJFIGs9MCIpKTsKICAgICAgICAgYXNzZXJ0TnVsbChyb3dzWzBdWzBdKTsKICAgICB9CiAKQEAgLTI4OCw5ICsyODgsOSBAQAogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiBpbnQpIik7CiAKICAgICAgICAgLy8gIEEgYmxvYiB0aGF0IGlzIG5vdCA0IGJ5dGVzIHNob3VsZCBiZSByZWplY3RlZAotICAgICAgICBhc3NlcnRJbnZhbGlkKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgwLCBibG9iQXNJbnQoMHgwMSkpIik7CisgICAgICAgIGFzc2VydEludmFsaWQoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDAsIGJsb2JfYXNfaW50KDB4MDEpKSIpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDAsIGJsb2JBc0ludCgweDAwMDAwMDAxKSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHYpIFZBTFVFUyAoMCwgYmxvYl9hc19pbnQoMHgwMDAwMDAwMSkpIik7CiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgic2VsZWN0IHYgZnJvbSAlcyB3aGVyZSBrPTAiKSwgcm93KDEpKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL21pc2NlbGxhbmVvdXMvU1NUYWJsZXNJdGVyYXRlZFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vbWlzY2VsbGFuZW91cy9TU1RhYmxlc0l0ZXJhdGVkVGVzdC5qYXZhCmluZGV4IGZmMGU1NDYuLmExMjIzYzEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vbWlzY2VsbGFuZW91cy9TU1RhYmxlc0l0ZXJhdGVkVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vbWlzY2VsbGFuZW91cy9TU1RhYmxlc0l0ZXJhdGVkVGVzdC5qYXZhCkBAIC0yMCwxMiArMjAsMTYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnZhbGlkYXRpb24ubWlzY2VsbGFuZW91czsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5VbnR5cGVkUmVzdWx0U2V0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsZWFyYWJsZUhpc3RvZ3JhbTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTUwLDYgKzU0LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICBudW1TU1RhYmxlc0l0ZXJhdGVkKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUFuZENoZWNrUmFuZ2VRdWVyeShTdHJpbmcgcXVlcnksIGludCBudW1TU1RhYmxlcywgT2JqZWN0W10uLi4gcm93cykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgbG9nZ2VyLmluZm8oIkV4ZWN1dGluZyBxdWVyeToge30gd2l0aCBwYXJhbWV0ZXJzOiB7fSIsIHF1ZXJ5LCBBcnJheXMudG9TdHJpbmcocm93cykpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoS0VZU1BBQ0VfUEVSX1RFU1QpOworCisgICAgICAgICgoQ2xlYXJhYmxlSGlzdG9ncmFtKSBjZnMubWV0cmljLnNzdGFibGVzUGVyUmFuZ2VSZWFkSGlzdG9ncmFtLmNmKS5jbGVhcigpOyAvLyByZXNldHMgY291bnRzCisKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKHF1ZXJ5KSwgcm93cyk7CisKKyAgICAgICAgbG9uZyBudW1TU1RhYmxlc0l0ZXJhdGVkID0gY2ZzLm1ldHJpYy5zc3RhYmxlc1BlclJhbmdlUmVhZEhpc3RvZ3JhbS5jZi5nZXRTbmFwc2hvdCgpLmdldE1heCgpOyAvLyBtYXggc3N0YWJsZXMgcmVhZAorICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRXhwZWN0ZWQgJWQgc3N0YWJsZXMgaXRlcmF0ZWQgYnV0IGdvdCAlZCBpbnN0ZWFkLCB3aXRoICVkIGxpdmUgc3N0YWJsZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TU1RhYmxlcywgbnVtU1NUYWJsZXNJdGVyYXRlZCwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSksCisgICAgICAgICAgICAgICAgICAgICBudW1TU1RhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgIG51bVNTVGFibGVzSXRlcmF0ZWQpOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlVGFibGUoU3RyaW5nIHF1ZXJ5KQogICAgIHsKQEAgLTU5LDcgKzc5LDcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgVW50eXBlZFJlc3VsdFNldCBleGVjdXRlKFN0cmluZyBxdWVyeSwgT2JqZWN0Li4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHByb3RlY3RlZCBVbnR5cGVkUmVzdWx0U2V0IGV4ZWN1dGUoU3RyaW5nIHF1ZXJ5LCBPYmplY3QuLi4gdmFsdWVzKQogICAgIHsKICAgICAgICAgcmV0dXJuIGV4ZWN1dGVGb3JtYXR0ZWRRdWVyeShmb3JtYXRRdWVyeShLRVlTUEFDRV9QRVJfVEVTVCwgcXVlcnkpLCB2YWx1ZXMpOwogICAgIH0KQEAgLTM1NCw3ICszNzQsNyBAQAogICAgIHByaXZhdGUgdm9pZCB0ZXN0RGVsZXRpb25PbkluZGV4ZWRTU1RhYmxlREVTQyhib29sZWFuIGRlbGV0ZVdpdGhSYW5nZSkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgLy8gcmVkdWNlIHRoZSBjb2x1bW4gaW5kZXggc2l6ZSBzbyB0aGF0IGNvbHVtbnMgZ2V0IGluZGV4ZWQgZHVyaW5nIGZsdXNoCi0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemUoMSk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemVJbktpQigxKTsKIAogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChpZCBpbnQsIGNvbCBpbnQsIHZhbCB0ZXh0LCBQUklNQVJZIEtFWSAoaWQsIGNvbCkpIFdJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAoY29sIERFU0MpIik7CiAKQEAgLTQwMiw3ICs0MjIsNyBAQAogICAgIHByaXZhdGUgdm9pZCB0ZXN0RGVsZXRpb25PbkluZGV4ZWRTU1RhYmxlQVNDKGJvb2xlYW4gZGVsZXRlV2l0aFJhbmdlKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICAvLyByZWR1Y2UgdGhlIGNvbHVtbiBpbmRleCBzaXplIHNvIHRoYXQgY29sdW1ucyBnZXQgaW5kZXhlZCBkdXJpbmcgZmx1c2gKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZSgxKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZUluS2lCKDEpOwogCiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGlkIGludCwgY29sIGludCwgdmFsIHRleHQsIFBSSU1BUlkgS0VZIChpZCwgY29sKSkgV0lUSCBDTFVTVEVSSU5HIE9SREVSIEJZIChjb2wgQVNDKSIpOwogCkBAIC00MzEsMTMgKzQ1MSwxOSBAQAogICAgICAgICB9CiAgICAgICAgIGZsdXNoKCk7CiAKKyAgICAgICAgLy8gVGhlIGNvZGUgaGFzIHRvIHJlYWQgdGhlIDFzdCBhbmQgM3JkIHNzdGFibGVzIHRvIHNlZSB0aGF0IGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSAybmQgc3N0YWJsZSBpcyBkZWxldGVkLCBhbmQKKyAgICAgICAgLy8gb3ZlcmFsbCBoYXMgdG8gcmVhZCB0aGUgMyBzc3RhYmxlcwogICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBMSU1JVCAxIiwgMywgcm93KDEsIDEwMDEsICIxMDAxIikpOwogICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBMSU1JVCAyIiwgMywgcm93KDEsIDEwMDEsICIxMDAxIiksIHJvdygxLCAxMDAyLCAiMTAwMiIpKTsKIAogICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSIsIDMsIGFsbFJvd3MpOwotICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBBTkQgY29sID4gMTAwMCBMSU1JVCAxIiwgMiwgcm93KDEsIDEwMDEsICIxMDAxIikpOworCisgICAgICAgIC8vIFRoZSAxc3QgYW5kIDNyZCBzc3RhYmxlcyBoYXZlIGRhdGEgb25seSB1cCB0byAxMDAwLCBzbyB0aGV5IHdpbGwgYmUgc2tpcHBlZAorICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBBTkQgY29sID4gMTAwMCBMSU1JVCAxIiwgMSwgcm93KDEsIDEwMDEsICIxMDAxIikpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBBTkQgY29sID4gMTAwMCIsIDEsIGFsbFJvd3MpOworCisgICAgICAgIC8vIFRoZSBjb25kaXRpb24gbWFrZXMgbm8gZGlmZmVyZW5jZSB0byB0aGUgY29kZSwgYW5kIGFsbCAzIHNzdGFibGVzIGhhdmUgdG8gcmVhZAogICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBBTkQgY29sIDw9IDIwMDAgTElNSVQgMSIsIDMsIHJvdygxLCAxMDAxLCAiMTAwMSIpKTsKLSAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEgQU5EIGNvbCA+IDEwMDAiLCAyLCBhbGxSb3dzKTsKICAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEgQU5EIGNvbCA8PSAyMDAwIiwgMywgYWxsUm93cyk7CiAgICAgfQogCkBAIC00NTEsNyArNDc3LDcgQEAKICAgICBwcml2YXRlIHZvaWQgdGVzdERlbGV0aW9uT25PdmVybGFwcGluZ0luZGV4ZWRTU1RhYmxlKGJvb2xlYW4gZGVsZXRlV2l0aFJhbmdlKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICAvLyByZWR1Y2UgdGhlIGNvbHVtbiBpbmRleCBzaXplIHNvIHRoYXQgY29sdW1ucyBnZXQgaW5kZXhlZCBkdXJpbmcgZmx1c2gKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZSgxKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZUluS2lCKDEpOwogCiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGlkIGludCwgY29sIGludCwgdmFsMSB0ZXh0LCB2YWwyIHRleHQsIFBSSU1BUlkgS0VZIChpZCwgY29sKSkgV0lUSCBDTFVTVEVSSU5HIE9SREVSIEJZIChjb2wgQVNDKSIpOwogCkBAIC01MTUsMTQgKzU0MSwzMCBAQAogICAgICAgICAgICAgICAgIGFsbFJvd3NbaWR4XSA9IHJvdygxLCBpLCBJbnRlZ2VyLnRvU3RyaW5nKGkpLCBJbnRlZ2VyLnRvU3RyaW5nKGkpKTsKICAgICAgICAgfQogCi0gICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBpZD0xIExJTUlUIDEiLCAyLCByb3coMSwgMSwgIjEiLCAiMSIpKTsKLSAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEgTElNSVQgMiIsIDIsIHJvdygxLCAxLCAiMSIsICIxIiksIHJvdygxLCAyLCAiMiIsIG51bGwpKTsKKyAgICAgICAgLy8gVGhlIDUwMHRoIGZpcnN0IHJvd3MgYXJlIGluIHRoZSBmaXJzdCBzc3RhYmxlIChhbmQgdGhlcmUgaXMgbm8gcGFydGl0aW9uIGRlbGV0aW9uL3N0YXRpYyByb3cpLCBzbyB0aGUgJ2xvd2VyCisgICAgICAgIC8vIGJvdW5kJyBvcHRpbWl6YXRpb24gd2lsbCBraWNrIGluIGFuZCB3ZSdsbCBvbmx5IHJlYWQgdGhlIDFzdCBzc3RhYmxlLgorICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBMSU1JVCAxIiwgMSwgcm93KDEsIDEsICIxIiwgIjEiKSk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBpZD0xIExJTUlUIDIiLCAxLCByb3coMSwgMSwgIjEiLCAiMSIpLCByb3coMSwgMiwgIjIiLCBudWxsKSk7CiAKKyAgICAgICAgLy8gR2V0dGluZyBldmVyeXRoaW5nIG9idmlvdXNseSByZXF1aXJlcyByZWFkaW5nIGJvdGggc3N0YWJsZXMKICAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEiLCAyLCBhbGxSb3dzKTsKKworICAgICAgICAvLyBUaGUgJ2xvd2VyIGJvdW5kJyBvcHRpbWl6YXRpb24gZG9uJ3QgaGVscCB1cyBiZWNhdXNlIHdoaWxlIHRoZSByb3cgdG8gZmV0Y2ggaXMgaW4gdGhlIDFzdCBzc3RhYmxlLCB0aGUgbG93ZXIKKyAgICAgICAgLy8gYm91bmQgZm9yIHRoZSAybmQgc3N0YWJsZSBpcyA1MDEsIHdoaWNoIGlzIGxvd2VyIHRoYW4gMTAwMC4KICAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEgQU5EIGNvbCA+IDEwMDAgTElNSVQgMSIsIDIsIHJvdygxLCAxMDAxLCAiMTAwMSIsICIxMDAxIikpOwotICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBBTkQgY29sIDw9IDIwMDAgTElNSVQgMSIsIDIsIHJvdygxLCAxLCAiMSIsICIxIikpOworCisgICAgICAgIC8vIFNvbWV3aGF0IHNpbWlsYXIgdG8gdGhlIHByZXZpb3VzIG9uZTogdGhlIHJvdyBpcyBpbiB0aCAybmQgc3N0YWJsZSBpbiB0aGlzIGNhc2UsIGJ1dCBhcyB0aGUgbG93ZXIgYm91bmQgZm9yCisgICAgICAgIC8vIHRoZSBmaXJzdCBzc3RhYmxlIGlzIDEsIHRoaXMgZG9lc24ndCBoZWxwLgogICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9MSBBTkQgY29sID4gNTAwIExJTUlUIDEiLCAyLCByb3coMSwgNzUxLCAiNzUxIiwgIjc1MSIpKTsKLSAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEgQU5EIGNvbCA8PSA1MDAgTElNSVQgMSIsIDIsIHJvdygxLCAxLCAiMSIsICIxIikpOworCisgICAgICAgIC8vIFRoZSAnY29sIDw9ID8nIGNvbmRpdGlvbiBpbiBib3RoIHF1ZXJpZXMgZG9lc24ndCBpbXBhY3QgdGhlIHJlYWQgcGF0aCwgd2hpY2ggY2FuIHN0aWxsIG1ha2UgdXNlIG9mIHRoZSBsb3dlcgorICAgICAgICAvLyBib3VuZCBvcHRpbWl6YXRpb24gYW5kIHJlYWQgb25seSB0aGUgZmlyc3Qgc3N0YWJsZS4KKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEgQU5EIGNvbCA8PSAyMDAwIExJTUlUIDEiLCAxLCByb3coMSwgMSwgIjEiLCAiMSIpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGlkPTEgQU5EIGNvbCA8PSA1MDAgTElNSVQgMSIsIDEsIHJvdygxLCAxLCAiMSIsICIxIikpOworCisgICAgICAgIC8vIE1ha2luZyBzdXJlIHRoZSAnbG93ZXIgYm91bmQnIG9wdGltaXphdGlvbiBhbHNvIHdvcmsgaW4gcmV2ZXJzZSBxdWVyaWVzIChpbiB3aGljaCBpdCdzIG1vcmUgb2YgYSAndXBwZXIKKyAgICAgICAgLy8gYm91bmQnIG9wdGltaXphdGlvbikuCisgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBpZD0xIEFORCBjb2wgPD0gMjAwMCBPUkRFUiBCWSBjb2wgREVTQyBMSU1JVCAxIiwgMSwgcm93KDEsIDIwMDAsICIyMDAwIiwgbnVsbCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC05OTYsNyArMTAzOCw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFjdEFuZE5vbkNvbXBhY3RUYWJsZVdpdGhDb3VudGVyKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgZm9yIChTdHJpbmcgd2l0aCA6IG5ldyBTdHJpbmdbXXsiIiwgIiBXSVRIIENPTVBBQ1QgU1RPUkFHRSJ9KQorICAgICAgICBmb3IgKFN0cmluZyB3aXRoIDogbmV3IFN0cmluZ1tdeyAiIiwgIiBXSVRIIENPTVBBQ1QgU1RPUkFHRSIgfSkKICAgICAgICAgewogICAgICAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjIGludCwgY291bnQgY291bnRlciwgUFJJTUFSWSBLRVkocGssIGMpKSIgKyB3aXRoKTsKIApAQCAtMTAzOCw3ICsxMDgwLDcgQEAKICAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgcywgdiBGUk9NICVzIFdIRVJFIHBrID0gMyBBTkQgYyA9IDMiLCAzLCByb3coMywgc2V0KDEpKSk7CiAgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUIHYgRlJPTSAlcyBXSEVSRSBwayA9IDEgQU5EIGMgPSAxIiwgMywgcm93KHNldCgzKSkpOwogICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCB2IEZST00gJXMgV0hFUkUgcGsgPSAyIEFORCBjID0gMSIsIDIsIHJvdyhzZXQoMykpKTsKLSAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgdiBGUk9NICVzIFdIRVJFIHBrID0gMyBBTkQgYyA9IDMiLCAzLCByb3coc2V0KDEpKSk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUIHYgRlJPTSAlcyBXSEVSRSBwayA9IDMgQU5EIGMgPSAzIiwgMSwgcm93KHNldCgxKSkpOwogICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCBzIEZST00gJXMgV0hFUkUgcGsgPSAxIiwgMywgcm93KChJbnRlZ2VyKSBudWxsKSk7CiAgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUIHMgRlJPTSAlcyBXSEVSRSBwayA9IDIiLCAyLCByb3coMSksIHJvdygxKSk7CiAgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUIERJU1RJTkNUIHMgRlJPTSAlcyBXSEVSRSBwayA9IDIiLCAyLCByb3coMSkpOwpAQCAtMTA4Nyw3ICsxMTI5LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wYWN0QW5kTm9uQ29tcGFjdFRhYmxlV2l0aFBhcnRpdGlvblRvbWJzdG9uZXMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICBmb3IgKEJvb2xlYW4gY29tcGFjdCAgOiBuZXcgQm9vbGVhbltdIHtCb29sZWFuLkZBTFNFLCBCb29sZWFuLlRSVUV9KQorICAgICAgICBmb3IgKEJvb2xlYW4gY29tcGFjdCA6IG5ldyBCb29sZWFuW117IEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uVFJVRSB9KQogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmcgd2l0aCA9IGNvbXBhY3QgPyAiIFdJVEggQ09NUEFDVCBTVE9SQUdFIiA6ICIiOwogICAgICAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50IFBSSU1BUlkgS0VZLCB2MSBpbnQsIHYyIGludCkiICsgd2l0aCk7CkBAIC0xNjQyLDQgKzE2ODQsMTU3IEBACiAgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUIHYxIEZST00gJXMgV0hFUkUgcGsgPSA1IiwgMSk7CiAgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUIHYyIEZST00gJXMgV0hFUkUgcGsgPSA1IiwgMSk7CiAgICAgfQotfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcHBpbmdCeVNsaWNlSW5TaW5nbGVQYXJ0aXRpb25SZWFkcygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgYyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWShwaywgYykpIik7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgMSwgMSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDIsIDIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCAzLCAzKTsKKyAgICAgICAgZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRV9QRVJfVEVTVCkuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKKworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCAyLCA0KTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgMywgNSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDQsIDYpOworICAgICAgICBmbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKEtFWVNQQUNFX1BFUl9URVNUKS5nZXRMaXZlU1NUYWJsZXMoKS5zaXplKCkpOworCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDMsIDcpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCA0LCA4KTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgNSwgOSk7CisgICAgICAgIGZsdXNoKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoS0VZU1BBQ0VfUEVSX1RFU1QpLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgNCwgMTApOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCA1LCAxMSk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDYsIDEyKTsKKyAgICAgICAgZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRV9QRVJfVEVTVCkuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKKworICAgICAgICAvLyBwb2ludCBxdWVyeSAtIHRlc3Qgd2hldGhlciBzc3RhYmxlcyBhcmUgc2tpcHBlZCBkdWUgdG8gbm90IGNvdmVyaW5nIHRoZSByZXF1ZXN0ZWQgc2xpY2UKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA9IDAiLCAwKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA9IDEiLCAxLCByb3coMSwgMSwgMSkpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSAxIEFORCBjID0gMiIsIDIsIHJvdygxLCAyLCA0KSk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IDEgQU5EIGMgPSAzIiwgMywgcm93KDEsIDMsIDcpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA9IDQiLCAzLCByb3coMSwgNCwgMTApKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA9IDUiLCAyLCByb3coMSwgNSwgMTEpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA9IDYiLCAxLCByb3coMSwgNiwgMTIpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA9IDciLCAwKTsKKworICAgICAgICAvLyByYW5nZSBxdWVyeSAtIHRlc3Qgd2hldGhlciBzc3RhYmxlcyBhcmUgc2tpcHBlZCBkdWUgdG8gbm90IGNvdmVyaW5nIHRoZSByZXF1ZXN0ZSBzbGljZQorICAgICAgICBleGVjdXRlQW5kQ2hlY2soIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSAxIEFORCBjID4gLTEwIEFORCBjIDw9IDAiLCAwKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA+IC0xMCBBTkQgYyA8IDEiLCAwKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA+IC0xMCBBTkQgYyA8PSAxIiwgMSwgcm93KDEsIDEsIDEpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA+IDEgQU5EIGMgPCAzIiwgMiwgcm93KDEsIDIsIDQpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgYyA+PSA2IiwgMSwgcm93KDEsIDYsIDEyKSk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVjaygiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IDEgQU5EIGMgPiA2IiwgMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcHBpbmdCeVNsaWNlSW5QYXJ0aXRpb25SYW5nZVJlYWRzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjIGludCwgdiBpbnQsIFBSSU1BUlkgS0VZKHBrLCBjKSkiKTsKKworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCAxLCAxKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgMiwgMik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDMsIDMpOworICAgICAgICBmbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKEtFWVNQQUNFX1BFUl9URVNUKS5nZXRMaXZlU1NUYWJsZXMoKS5zaXplKCkpOworCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDIsIDQpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCAzLCA1KTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgNCwgNik7CisgICAgICAgIGZsdXNoKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoS0VZU1BBQ0VfUEVSX1RFU1QpLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgMywgNyk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDQsIDgpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCA1LCA5KTsKKyAgICAgICAgZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRV9QRVJfVEVTVCkuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKKworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCAxLCA0LCAxMCk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIDEsIDUsIDExKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwgMSwgNiwgMTIpOworICAgICAgICBmbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKEtFWVNQQUNFX1BFUl9URVNUKS5nZXRMaXZlU1NUYWJsZXMoKS5zaXplKCkpOworCisgICAgICAgIC8vIHBvaW50IHF1ZXJ5IC0gdGVzdCB3aGV0aGVyIHNzdGFibGVzIGFyZSBza2lwcGVkIGR1ZSB0byBub3QgY292ZXJpbmcgdGhlIHJlcXVlc3RlZCBzbGljZQorICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPSAwIEFMTE9XIEZJTFRFUklORyIsIDApOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPSAxIEFMTE9XIEZJTFRFUklORyIsIDEsIHJvdygxLCAxLCAxKSk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVja1JhbmdlUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9IDIgQUxMT1cgRklMVEVSSU5HIiwgMiwgcm93KDEsIDIsIDQpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrUmFuZ2VRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBjID0gMyBBTExPVyBGSUxURVJJTkciLCAzLCByb3coMSwgMywgNykpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPSA0IEFMTE9XIEZJTFRFUklORyIsIDMsIHJvdygxLCA0LCAxMCkpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPSA1IEFMTE9XIEZJTFRFUklORyIsIDIsIHJvdygxLCA1LCAxMSkpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPSA2IEFMTE9XIEZJTFRFUklORyIsIDEsIHJvdygxLCA2LCAxMikpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPSA3IEFMTE9XIEZJTFRFUklORyIsIDApOworCisgICAgICAgIC8vIHJhbmdlIHF1ZXJ5IC0gdGVzdCB3aGV0aGVyIHNzdGFibGVzIGFyZSBza2lwcGVkIGR1ZSB0byBub3QgY292ZXJpbmcgdGhlIHJlcXVlc3RlIHNsaWNlCisgICAgICAgIGV4ZWN1dGVBbmRDaGVja1JhbmdlUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA+IC0xMCBBTkQgYyA8PSAwIEFMTE9XIEZJTFRFUklORyIsIDApOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPiAtMTAgQU5EIGMgPCAxIEFMTE9XIEZJTFRFUklORyIsIDApOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPiAtMTAgQU5EIGMgPD0gMSBBTExPVyBGSUxURVJJTkciLCAxLCByb3coMSwgMSwgMSkpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPiAxIEFORCBjIDwgMyBBTExPVyBGSUxURVJJTkciLCAyLCByb3coMSwgMiwgNCkpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGMgPj0gNiBBTExPVyBGSUxURVJJTkciLCAxLCByb3coMSwgNiwgMTIpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrUmFuZ2VRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBjID4gNiBBTExPVyBGSUxURVJJTkciLCAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTa2lwcGluZ0J5S2V5UmFuZ2VJblBhcnRpdGlvblJhbmdlUmVhZHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBEZWNvcmF0ZWRLZXlbXSBrZXlzID0gbmV3IERlY29yYXRlZEtleVs4XTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAga2V5c1tpXSA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRQYXJ0aXRpb25lcigpLmRlY29yYXRlS2V5KEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoaSkpOworICAgICAgICBBcnJheXMuc29ydChrZXlzKTsKKworICAgICAgICBpbnRbXSBrID0gbmV3IGludFtrZXlzLmxlbmd0aF07CisgICAgICAgIFN0cmluZ1tdIHQgPSBuZXcgU3RyaW5nW2tleXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0ga2V5c1tpXTsKKyAgICAgICAgICAgIGtbaV0gPSBJbnQzMlR5cGUuaW5zdGFuY2UuY29tcG9zZShrZXkuZ2V0S2V5KCkpOworICAgICAgICAgICAgdFtpXSA9IGtleS5nZXRUb2tlbigpLmdldFRva2VuVmFsdWUoKS50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjIGludCwgdiBpbnQsIFBSSU1BUlkgS0VZKHBrLCBjKSkiKTsKKworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCBrWzFdLCAxLCAxKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwga1syXSwgMiwgMik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIGtbM10sIDMsIDMpOworICAgICAgICBmbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKEtFWVNQQUNFX1BFUl9URVNUKS5nZXRMaXZlU1NUYWJsZXMoKS5zaXplKCkpOworCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIGtbMl0sIDIsIDQpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCBrWzNdLCAzLCA1KTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwga1s0XSwgNCwgNik7CisgICAgICAgIGZsdXNoKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoS0VZU1BBQ0VfUEVSX1RFU1QpLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwga1szXSwgMywgNyk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIGtbNF0sIDQsIDgpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCBrWzVdLCA1LCA5KTsKKyAgICAgICAgZmx1c2goKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRV9QRVJfVEVTVCkuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKKworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykgVVNJTkcgVElNRVNUQU1QIDEwMDAiLCBrWzRdLCA0LCAxMCk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSBVU0lORyBUSU1FU1RBTVAgMTAwMCIsIGtbNV0sIDUsIDExKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIFVTSU5HIFRJTUVTVEFNUCAxMDAwIiwga1s2XSwgNiwgMTIpOworICAgICAgICBmbHVzaCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKEtFWVNQQUNFX1BFUl9URVNUKS5nZXRMaXZlU1NUYWJsZXMoKS5zaXplKCkpOworCisgICAgICAgIC8vIHJhbmdlIHF1ZXJ5IC0gdGVzdCB3aGV0aGVyIHNzdGFibGVzIGFyZSBza2lwcGVkIGR1ZSB0byBub3QgY292ZXJpbmcgdGhlIHJlcXVlc3RlZCBzbGljZQorICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIFRPS0VOIChwaykgPD0gIiArIHRbMF0sIDApOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIFRPS0VOIChwaykgPCAiICsgdFsxXSwgMCk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVja1JhbmdlUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgVE9LRU4ocGspID49ICIgKyB0WzFdICsgIiBBTkQgVE9LRU4gKHBrKSA8ICIgKyB0WzJdLCAxLCByb3coa1sxXSwgMSwgMSkpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIFRPS0VOKHBrKSA+PSAiICsgdFsyXSArICIgQU5EIFRPS0VOIChwaykgPCAiICsgdFszXSwgMiwgcm93KGtbMl0sIDIsIDQpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrUmFuZ2VRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBUT0tFTihwaykgPj0gIiArIHRbM10gKyAiIEFORCBUT0tFTiAocGspIDwgIiArIHRbNF0sIDMsIHJvdyhrWzNdLCAzLCA3KSk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVja1JhbmdlUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgVE9LRU4ocGspID49ICIgKyB0WzNdICsgIiBBTkQgVE9LRU4gKHBrKSA8PSAiICsgdFs0XSwgNCwgcm93KGtbM10sIDMsIDcpLCByb3coa1s0XSwgNCwgMTApKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrUmFuZ2VRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBUT0tFTihwaykgPj0gIiArIHRbNF0gKyAiIEFORCBUT0tFTiAocGspIDwgIiArIHRbNV0sIDMsIHJvdyhrWzRdLCA0LCAxMCkpOworICAgICAgICBleGVjdXRlQW5kQ2hlY2tSYW5nZVF1ZXJ5KCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIFRPS0VOKHBrKSA+PSAiICsgdFs1XSArICIgQU5EIFRPS0VOIChwaykgPCAiICsgdFs2XSwgMiwgcm93KGtbNV0sIDUsIDExKSk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVja1JhbmdlUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgVE9LRU4ocGspID49ICIgKyB0WzZdICsgIiBBTkQgVE9LRU4gKHBrKSA8ICIgKyB0WzddLCAxLCByb3coa1s2XSwgNiwgMTIpKTsKKyAgICAgICAgZXhlY3V0ZUFuZENoZWNrUmFuZ2VRdWVyeSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBUT0tFTihwaykgPiAiICsgdFs2XSwgMCk7CisgICAgICAgIGV4ZWN1dGVBbmRDaGVja1JhbmdlUXVlcnkoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgVE9LRU4ocGspID49ICIgKyB0WzddLCAwKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0FnZ3JlZ2F0aW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0FnZ3JlZ2F0aW9uVGVzdC5qYXZhCmluZGV4IDRiOGU1ZTkuLmZiMzdmM2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9BZ2dyZWdhdGlvblRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvQWdncmVnYXRpb25UZXN0LmphdmEKQEAgLTI0MSw2ICsyNDEsMTE0IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWdncmVnYXRlV2l0aFNldHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgcyBzZXQ8aW50PiwgZnMgZnJvemVuPHNldDxpbnQ+PikiKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggZW1wdHkgdGFibGUKKyAgICAgICAgU3RyaW5nIHNlbGVjdCA9ICJTRUxFQ1QgY291bnQocyksIGNvdW50KGZzKSwgbWluKHMpLCBtaW4oZnMpLCBtYXgocyksIG1heChmcykgRlJPTSAlcyI7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcnMgPSBleGVjdXRlKHNlbGVjdCk7CisgICAgICAgIGFzc2VydENvbHVtbk5hbWVzKHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtLmNvdW50KHMpIiwgInN5c3RlbS5jb3VudChmcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzdGVtLm1pbihzKSIsICJzeXN0ZW0ubWluKGZzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0ubWF4KHMpIiwgInN5c3RlbS5tYXgoZnMpIik7CisgICAgICAgIGFzc2VydFJvd3MocnMsIHJvdygwTCwgMEwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggbm90LWVtcHR5IHRhYmxlCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBzLCBmcykgVkFMVUVTICgxLCB7MSwgMn0sIHsxLCAyfSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHMsIGZzKSBWQUxVRVMgKDIsIHsxLCAyLCAzfSwgezEsIDIsIDN9KSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgcywgZnMpIFZBTFVFUyAoMywgezIsIDF9LCB7MiwgMX0pIik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShzZWxlY3QpLCByb3coM0wsIDNMLCBzZXQoMSwgMiksIHNldCgxLCAyKSwgc2V0KDEsIDIsIDMpLCBzZXQoMSwgMiwgMykpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZ2dyZWdhdGVXaXRoTGlzdHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgbCBsaXN0PGludD4sIGZsIGZyb3plbjxsaXN0PGludD4+KSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCBjb3VudChsKSwgY291bnQoZmwpLCBtaW4obCksIG1pbihmbCksIG1heChsKSwgbWF4KGZsKSBGUk9NICVzIjsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoc2VsZWN0KTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0uY291bnQobCkiLCAic3lzdGVtLmNvdW50KGZsKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0ubWluKGwpIiwgInN5c3RlbS5taW4oZmwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS5tYXgobCkiLCAic3lzdGVtLm1heChmbCkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhycywgcm93KDBMLCAwTCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBub3QtZW1wdHkgdGFibGUKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIGwsIGZsKSBWQUxVRVMgKDEsIFsxLCAyXSwgWzEsIDJdKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbCwgZmwpIFZBTFVFUyAoMiwgWzEsIDIsIDNdLCBbMSwgMiwgM10pIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBsLCBmbCkgVkFMVUVTICgzLCBbMiwgMV0sIFsyLCAxXSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKHNlbGVjdCksCisgICAgICAgICAgICAgICAgICAgcm93KDNMLCAzTCwgbGlzdCgxLCAyKSwgbGlzdCgxLCAyKSwgbGlzdCgyLCAxKSwgbGlzdCgyLCAxKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFnZ3JlZ2F0ZVdpdGhNYXBzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIG0gbWFwPGludCwgaW50PiwgZm0gZnJvemVuPG1hcDxpbnQsIGludD4+KSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCBjb3VudChtKSwgY291bnQoZm0pLCBtaW4obSksIG1pbihmbSksIG1heChtKSwgbWF4KGZtKSBGUk9NICVzIjsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoc2VsZWN0KTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0uY291bnQobSkiLCAic3lzdGVtLmNvdW50KGZtKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0ubWluKG0pIiwgInN5c3RlbS5taW4oZm0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS5tYXgobSkiLCAic3lzdGVtLm1heChmbSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhycywgcm93KDBMLCAwTCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBub3QtZW1wdHkgdGFibGUKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIG0sIGZtKSBWQUxVRVMgKDEsIHsxOjEwLCAyOjIwfSwgezE6MTAsIDI6MjB9KSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgbSwgZm0pIFZBTFVFUyAoMiwgezE6MTAsIDI6MjAsIDM6MzB9LCB7MToxMCwgMjoyMCwgMzozMH0pIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCBtLCBmbSkgVkFMVUVTICgzLCB7MjoyMCwgMToxMH0sIHsyOjIwLCAxOjEwfSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKHNlbGVjdCksCisgICAgICAgICAgICAgICAgICAgcm93KDNMLCAzTCwKKyAgICAgICAgICAgICAgICAgICAgICAgbWFwKDEsIDEwLCAyLCAyMCksIG1hcCgxLCAxMCwgMiwgMjApLAorICAgICAgICAgICAgICAgICAgICAgICBtYXAoMSwgMTAsIDIsIDIwLCAzLCAzMCksIG1hcCgxLCAxMCwgMiwgMjAsIDMsIDMwKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFnZ3JlZ2F0ZVdpdGhUdXBsZXMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdCB0dXBsZTxpbnQsIHRleHQsIGJvb2xlYW4+KSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCBjb3VudCh0KSwgbWluKHQpLCBtYXgodCkgRlJPTSAlcyI7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcnMgPSBleGVjdXRlKHNlbGVjdCk7CisgICAgICAgIGFzc2VydENvbHVtbk5hbWVzKHJzLCAic3lzdGVtLmNvdW50KHQpIiwgInN5c3RlbS5taW4odCkiLCAic3lzdGVtLm1heCh0KSIpOworICAgICAgICBhc3NlcnRSb3dzKHJzLCByb3coMEwsIG51bGwsIG51bGwpKTsKKworICAgICAgICAvLyBUZXN0IHdpdGggbm90LWVtcHR5IHRhYmxlCisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDEsICgxLCAnYScsIGZhbHNlKSkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoMiwgKDIsICdiJywgdHJ1ZSkpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB0KSBWQUxVRVMgKDMsICgzLCBudWxsLCB0cnVlKSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKHNlbGVjdCksIHJvdygzTCwgdHVwbGUoMSwgImEiLCBmYWxzZSksIHR1cGxlKDMsIG51bGwsIHRydWUpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWdncmVnYXRlV2l0aFVEVHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgdWR0ID0gY3JlYXRlVHlwZSgiQ1JFQVRFIFRZUEUgJXMgKHggaW50KSIpOworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdSBmcm96ZW48IiArIHVkdCArICI+LCBmdSBmcm96ZW48IiArIHVkdCArICI+KSIpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBlbXB0eSB0YWJsZQorICAgICAgICBTdHJpbmcgc2VsZWN0ID0gIlNFTEVDVCBjb3VudCh1KSwgY291bnQoZnUpLCBtaW4odSksIG1pbihmdSksIG1heCh1KSwgbWF4KGZ1KSBGUk9NICVzIjsKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoc2VsZWN0KTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMocnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0uY291bnQodSkiLCAic3lzdGVtLmNvdW50KGZ1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0ubWluKHUpIiwgInN5c3RlbS5taW4oZnUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS5tYXgodSkiLCAic3lzdGVtLm1heChmdSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhycywgcm93KDBMLCAwTCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkpOworCisgICAgICAgIC8vIFRlc3Qgd2l0aCBub3QtZW1wdHkgdGFibGUKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHUsIGZ1KSBWQUxVRVMgKDEsIHt4OiAyfSwgbnVsbCkiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHUsIGZ1KSBWQUxVRVMgKDIsIHt4OiA0fSwge3g6IDZ9KSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdSwgZnUpIFZBTFVFUyAoMywgbnVsbCwge3g6IDh9KSIpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoc2VsZWN0KSwKKyAgICAgICAgICAgICAgICAgICByb3coMkwsIDJMLCB1c2VyVHlwZSgieCIsIDIpLCB1c2VyVHlwZSgieCIsIDYpLCB1c2VyVHlwZSgieCIsIDQpLCB1c2VyVHlwZSgieCIsIDgpKSk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWdncmVnYXRlV2l0aFVkdEZpZWxkcygpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIFN0cmluZyBteVR5cGUgPSBjcmVhdGVUeXBlKCJDUkVBVEUgVFlQRSAlcyAoeCBpbnQpIik7CkBAIC0yNTksOCArMzY3LDggQEAKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgY291bnQoYi54KSwgbWF4KGIueCkgYXMgbWF4LCBiLngsIGMueCBhcyBmaXJzdCBGUk9NICVzIiksCiAgICAgICAgICAgICAgICAgICAgcm93KDNMLCA4LCAyLCBudWxsKSk7CiAKLSAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkludmFsaWQgZmllbGQgc2VsZWN0aW9uOiBzeXN0ZW0ubWF4KGIpIG9mIHR5cGUgYmxvYiBpcyBub3QgYSB1c2VyIHR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUIG1heChiKS54IGFzIG1heCBGUk9NICVzIik7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGNvdW50KGIpLCBtaW4oYikueCwgbWF4KGIpLngsIGNvdW50KGMpLCBtaW4oYykueCwgbWF4KGMpLnggRlJPTSAlcyIpLAorICAgICAgICAgICAgICAgICAgIHJvdygzTCwgMiwgOCwgMkwsIDYsIDEyKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTM2OSwyNSArNDc3LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBKQVZBICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ3JldHVybiBEb3VibGUudmFsdWVPZihNYXRoLmNvcHlTaWduKG1hZ25pdHVkZSwgc2lnbikpOyc7Iik7CiAKLSAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMoZXhlY3V0ZSgiU0VMRUNUIG1heChhKSwgbWF4KHRvVW5peFRpbWVzdGFtcChiKSkgRlJPTSAlcyIpLCAic3lzdGVtLm1heChhKSIsICJzeXN0ZW0ubWF4KHN5c3RlbS50b3VuaXh0aW1lc3RhbXAoYikpIik7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1heChhKSwgbWF4KHRvVW5peFRpbWVzdGFtcChiKSkgRlJPTSAlcyIpLCByb3cobnVsbCwgbnVsbCkpOwotICAgICAgICBhc3NlcnRDb2x1bW5OYW1lcyhleGVjdXRlKCJTRUxFQ1QgbWF4KGEpLCB0b1VuaXhUaW1lc3RhbXAobWF4KGIpKSBGUk9NICVzIiksICJzeXN0ZW0ubWF4KGEpIiwgInN5c3RlbS50b3VuaXh0aW1lc3RhbXAoc3lzdGVtLm1heChiKSkiKTsKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWF4KGEpLCB0b1VuaXhUaW1lc3RhbXAobWF4KGIpKSBGUk9NICVzIiksIHJvdyhudWxsLCBudWxsKSk7CisgICAgICAgIGFzc2VydENvbHVtbk5hbWVzKGV4ZWN1dGUoIlNFTEVDVCBtYXgoYSksIG1heCh0b191bml4X3RpbWVzdGFtcChiKSkgRlJPTSAlcyIpLCAic3lzdGVtLm1heChhKSIsICJzeXN0ZW0ubWF4KHN5c3RlbS50b191bml4X3RpbWVzdGFtcChiKSkiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWF4KGEpLCBtYXgodG9fdW5peF90aW1lc3RhbXAoYikpIEZST00gJXMiKSwgcm93KG51bGwsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0Q29sdW1uTmFtZXMoZXhlY3V0ZSgiU0VMRUNUIG1heChhKSwgdG9fdW5peF90aW1lc3RhbXAobWF4KGIpKSBGUk9NICVzIiksICJzeXN0ZW0ubWF4KGEpIiwgInN5c3RlbS50b191bml4X3RpbWVzdGFtcChzeXN0ZW0ubWF4KGIpKSIpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXgoYSksIHRvX3VuaXhfdGltZXN0YW1wKG1heChiKSkgRlJPTSAlcyIpLCByb3cobnVsbCwgbnVsbCkpOwogCiAgICAgICAgIGFzc2VydENvbHVtbk5hbWVzKGV4ZWN1dGUoIlNFTEVDVCBtYXgoIiArIGNvcHlTaWduICsgIihjLCBkKSkgRlJPTSAlcyIpLCAic3lzdGVtLm1heCgiICsgY29weVNpZ24gKyAiKGMsIGQpKSIpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXgoIiArIGNvcHlTaWduICsgIihjLCBkKSkgRlJPTSAlcyIpLCByb3coKE9iamVjdCkgbnVsbCkpOwogCi0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiLCBjLCBkKSBWQUxVRVMgKDEsIG1heFRpbWV1dWlkKCcyMDExLTAyLTAzIDA0OjA1OjAwKzAwMDAnKSwgLTEuMiwgMi4xKSIpOwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYywgZCkgVkFMVUVTICgyLCBtYXhUaW1ldXVpZCgnMjAxMS0wMi0wMyAwNDowNjowMCswMDAwJyksIDEuMywgLTMuNCkiKTsKLSAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGEsIGIsIGMsIGQpIFZBTFVFUyAoMywgbWF4VGltZXV1aWQoJzIwMTEtMDItMDMgMDQ6MTA6MDArMDAwMCcpLCAxLjQsIDEuMikiKTsKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGEsIGIsIGMsIGQpIFZBTFVFUyAoMSwgbWF4X3RpbWV1dWlkKCcyMDExLTAyLTAzIDA0OjA1OjAwKzAwMDAnKSwgLTEuMiwgMi4xKSIpOworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYywgZCkgVkFMVUVTICgyLCBtYXhfdGltZXV1aWQoJzIwMTEtMDItMDMgMDQ6MDY6MDArMDAwMCcpLCAxLjMsIC0zLjQpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiLCBjLCBkKSBWQUxVRVMgKDMsIG1heF90aW1ldXVpZCgnMjAxMS0wMi0wMyAwNDoxMDowMCswMDAwJyksIDEuNCwgMS4yKSIpOwogCiAgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0ID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQgaGg6bW06c3MiKTsKICAgICAgICAgZm9ybWF0LnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJHTVQiKSk7CiAgICAgICAgIERhdGUgZGF0ZSA9IGZvcm1hdC5wYXJzZSgiMjAxMS0wMi0wMyAwNDoxMDowMCIpOwogICAgICAgICBkYXRlID0gRGF0ZVV0aWxzLnRydW5jYXRlKGRhdGUsIENhbGVuZGFyLk1JTExJU0VDT05EKTsKIAotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBtYXgoYSksIG1heCh0b1VuaXhUaW1lc3RhbXAoYikpIEZST00gJXMiKSwgcm93KDMsIGRhdGUuZ2V0VGltZSgpKSk7Ci0gICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1heChhKSwgdG9Vbml4VGltZXN0YW1wKG1heChiKSkgRlJPTSAlcyIpLCByb3coMywgZGF0ZS5nZXRUaW1lKCkpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgbWF4KGEpLCBtYXgodG9fdW5peF90aW1lc3RhbXAoYikpIEZST00gJXMiKSwgcm93KDMsIGRhdGUuZ2V0VGltZSgpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIG1heChhKSwgdG9fdW5peF90aW1lc3RhbXAobWF4KGIpKSBGUk9NICVzIiksIHJvdygzLCBkYXRlLmdldFRpbWUoKSkpOwogCiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICIgKyBjb3B5U2lnbiArICIobWF4KGMpLCBtaW4oYykpIEZST00gJXMiKSwgcm93KC0xLjQpKTsKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGNvcHlTaWduICsgIihjLCBkKSBGUk9NICVzIiksIHJvdygxLjIpLCByb3coLTEuMyksIHJvdygxLjQpKTsKQEAgLTQwNCwxNiArNTEyLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKHN0YXRlIGRvdWJsZSwgdmFsIGRvdWJsZSkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ1wic3RyaW5nXCI7JzsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyByZXR1cm4gc3RhdGU7JzsiKTsKIAogICAgICAgICBjcmVhdGVGdW5jdGlvbk92ZXJsb2FkKGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvdWJsZSwgZG91YmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXMoc3RhdGUgaW50LCB2YWwgaW50KSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgaW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnXCJzdHJpbmdcIjsnOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIHN0YXRlOyc7Iik7CiAKICAgICAgICAgU3RyaW5nIGEgPSBjcmVhdGVBZ2dyZWdhdGVOYW1lKEtFWVNQQUNFKTsKICAgICAgICAgU3RyaW5nIGFnZ3JlZ2F0ZU5hbWUgPSBzaG9ydEZ1bmN0aW9uTmFtZShhKTsKQEAgLTQ1Niw4ICs1NjQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXMoc3RhdGUgZG91YmxlLCB2YWwgbGlzdDx0dXBsZTxpbnQsIGludD4+KSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBkb3VibGUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ1wic3RyaW5nXCI7JzsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnIHJldHVybiBzdGF0ZTsnOyIpOwogCiAgICAgICAgIFN0cmluZyBhMSA9IGNyZWF0ZUFnZ3JlZ2F0ZU5hbWUoS0VZU1BBQ0UpOwogICAgICAgICByZWdpc3RlckFnZ3JlZ2F0ZShhMSwgImxpc3Q8dHVwbGU8aW50LCBpbnQ+PiIpOwpAQCAtNDc5LDE2ICs1ODcsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gJXMoc3RhdGUgZG91YmxlLCB2YWwgZG91YmxlKSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgZG91YmxlICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnXCJzdHJpbmdcIjsnOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAncmV0dXJuIHN0YXRlOyc7Iik7CiAKICAgICAgICAgY3JlYXRlRnVuY3Rpb25PdmVybG9hZChmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkb3VibGUsIGRvdWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKHN0YXRlIGludCwgdmFsIGludCkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGludCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ1wic3RyaW5nXCI7JzsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyByZXR1cm4gc3RhdGU7JzsiKTsKIAogICAgICAgICAvLyBEUk9QIEFHR1JFR0FURSBtdXN0IG5vdCBzdWNjZWVkIGFnYWluc3QgYSBzY2FsYXIKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIm1hdGNoZXMgbXVsdGlwbGUgZnVuY3Rpb24gZGVmaW5pdGlvbnMiLCAiRFJPUCBBR0dSRUdBVEUgIiArIGYpOwpAQCAtNTMxLDggKzYzOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OICVzKHN0YXRlIGRvdWJsZSwgdmFsIGRvdWJsZSkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFVFVSTlMgTlVMTCBPTiBOVUxMIElOUFVUICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGRvdWJsZSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ1wic3RyaW5nXCI7JzsiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJyByZXR1cm4gc3RhdGU7JzsiKTsKIAogICAgICAgICBTdHJpbmcgYSA9IGNyZWF0ZUFnZ3JlZ2F0ZShLRVlTUEFDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvdWJsZSIsCkBAIC0xMDMxLDgxICsxMTM5LDYgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKYXZhc2NyaXB0QWdncmVnYXRlKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoYSBpbnQgcHJpbWFyeSBrZXksIGIgaW50KSIpOwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYikgVkFMVUVTICgxLCAxKSIpOwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYikgVkFMVUVTICgyLCAyKSIpOwotICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYikgVkFMVUVTICgzLCAzKSIpOwotCi0gICAgICAgIFN0cmluZyBmU3RhdGUgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQsIGludCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIEZVTkNUSU9OICVzKGEgaW50LCBiIGludCkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YXNjcmlwdCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnYSArIGI7JyIpOwotCi0gICAgICAgIFN0cmluZyBmRmluYWwgPSBjcmVhdGVGdW5jdGlvbihLRVlTUEFDRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiAlcyhhIGludCkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBOVUxMIE9OIE5VTEwgSU5QVVQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyB0ZXh0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVMgJ1wiXCIrYSciKTsKLQotICAgICAgICBTdHJpbmcgYSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgQUdHUkVHQVRFICVzKGludCkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNGVU5DICIgKyBzaG9ydEZ1bmN0aW9uTmFtZShmU3RhdGUpICsgIiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1RZUEUgaW50ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGSU5BTEZVTkMgIiArIHNob3J0RnVuY3Rpb25OYW1lKGZGaW5hbCkgKyAiICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTklUQ09ORCA0MiIpOwotCi0gICAgICAgIC8vIDQyICsgMSArIDIgKyAzID0gNDgKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgIiArIGEgKyAiKGIpIEZST00gJXMiKSwgcm93KCI0OCIpKTsKLQotICAgICAgICBleGVjdXRlKCJEUk9QIEFHR1JFR0FURSAiICsgYSArICIoaW50KSIpOwotCi0gICAgICAgIGV4ZWN1dGUoIkRST1AgRlVOQ1RJT04gIiArIGZGaW5hbCArICIoaW50KSIpOwotICAgICAgICBleGVjdXRlKCJEUk9QIEZVTkNUSU9OICIgKyBmU3RhdGUgKyAiKGludCwgaW50KSIpOwotCi0gICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJVbmtub3duIGZ1bmN0aW9uIiwgIlNFTEVDVCAiICsgYSArICIoYikgRlJPTSAlcyIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEphdmFzY3JpcHRBZ2dyZWdhdGVTaW1wbGUoKSB0aHJvd3MgVGhyb3dhYmxlCi0gICAgewotICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChhIGludCBwcmltYXJ5IGtleSwgYiBpbnQpIik7Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiKSBWQUxVRVMgKDEsIDEpIik7Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiKSBWQUxVRVMgKDIsIDIpIik7Ci0gICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiKSBWQUxVRVMgKDMsIDMpIik7Ci0KLSAgICAgICAgU3RyaW5nIGZTdGF0ZSA9IGNyZWF0ZUZ1bmN0aW9uKEtFWVNQQUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludCwgaW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMoYSBpbnQsIGIgaW50KSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGludCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdhICsgYjsnIik7Ci0KLSAgICAgICAgU3RyaW5nIGEgPSBjcmVhdGVBZ2dyZWdhdGUoS0VZU1BBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQsIGludCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgQUdHUkVHQVRFICVzKGludCkgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTRlVOQyAiICsgc2hvcnRGdW5jdGlvbk5hbWUoZlN0YXRlKSArICIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTVFlQRSBpbnQgIik7Ci0KLSAgICAgICAgLy8gMSArIDIgKyAzID0gNgotICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAiICsgYSArICIoYikgRlJPTSAlcyIpLCByb3coNikpOwotCi0gICAgICAgIGV4ZWN1dGUoIkRST1AgQUdHUkVHQVRFICIgKyBhICsgIihpbnQpIik7Ci0KLSAgICAgICAgZXhlY3V0ZSgiRFJPUCBGVU5DVElPTiAiICsgZlN0YXRlICsgIihpbnQsIGludCkiKTsKLQotICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiVW5rbm93biBmdW5jdGlvbiIsICJTRUxFQ1QgIiArIGEgKyAiKGIpIEZST00gJXMiKTsKLSAgICB9Ci0KLSAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGdW5jdGlvbkRyb3BQcmVwYXJlZFN0YXRlbWVudCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIFN0cmluZyBvdGhlcktTID0gImNxbHRlc3RfZm9vIjsKQEAgLTExMjAsOCArMTE1Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNSRUFURSBGVU5DVElPTiAlcyhhIGludCwgYiBpbnQpICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVUVVJOUyBpbnQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmFzY3JpcHQgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdhICsgYjsnIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxBTkdVQUdFIGphdmEgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICcgcmV0dXJuIGEgKyBiOyciKTsKIAogICAgICAgICAgICAgU3RyaW5nIGEgPSBjcmVhdGVBZ2dyZWdhdGUob3RoZXJLUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLApAQCAtMTE2Myw4ICsxMTk2LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDUkVBVEUgRlVOQ1RJT04gJXMoYSBpbnQsIGIgaW50KSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDQUxMRUQgT04gTlVMTCBJTlBVVCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRVRVUk5TIGludCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMQU5HVUFHRSBqYXZhc2NyaXB0ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFTICdhICsgYjsnIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTEFOR1VBR0UgamF2YSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUyAnIHJldHVybiBhICsgYjsnIik7CiAKICAgICAgICAgU3RyaW5nIGEgPSBjcmVhdGVBZ2dyZWdhdGUoS0VZU1BBQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnQiLApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0FsdGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0FsdGVyVGVzdC5qYXZhCmluZGV4IGZkZGQ1OWIuLjE4ODE3MDcgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9BbHRlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvQWx0ZXJUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwpAQCAtMjksNyArMzAsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLlNraXBMaXN0TWVtdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuVGVzdE1lbXRhYmxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5PcmRlclByZXNlcnZpbmdQYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlN5bnRheEV4Y2VwdGlvbjsKQEAgLTI2OCw5ICsyNjgsOSBAQAogICAgICAgICBJbmV0QWRkcmVzc0FuZFBvcnQgbG9jYWwgPSBGQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydCgpOwogICAgICAgICBJbmV0QWRkcmVzc0FuZFBvcnQgcmVtb3RlID0gSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZSgiMTI3LjAuMC40Iik7CiAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZUhvc3RJZChVVUlELnJhbmRvbVVVSUQoKSwgbG9jYWwpOwotICAgICAgICBtZXRhZGF0YS51cGRhdGVOb3JtYWxUb2tlbihuZXcgT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuU3RyaW5nVG9rZW4oIkEiKSwgbG9jYWwpOworICAgICAgICBtZXRhZGF0YS51cGRhdGVOb3JtYWxUb2tlbihVdGlsLnRva2VuKCJBIiksIGxvY2FsKTsKICAgICAgICAgbWV0YWRhdGEudXBkYXRlSG9zdElkKFVVSUQucmFuZG9tVVVJRCgpLCByZW1vdGUpOwotICAgICAgICBtZXRhZGF0YS51cGRhdGVOb3JtYWxUb2tlbihuZXcgT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuU3RyaW5nVG9rZW4oIkIiKSwgcmVtb3RlKTsKKyAgICAgICAgbWV0YWRhdGEudXBkYXRlTm9ybWFsVG9rZW4oVXRpbC50b2tlbigiQiIpLCByZW1vdGUpOwogCiAgICAgICAgIC8vIFdpdGggdHdvIGRhdGFjZW50ZXJzIHdlIHNob3VsZCByZXNwZWN0IGFueXRoaW5nIHBhc3NlZCBpbiBhcyBhIG1hbnVhbCBvdmVycmlkZQogICAgICAgICBTdHJpbmcga3MxID0gY3JlYXRlS2V5c3BhY2UoIkNSRUFURSBLRVlTUEFDRSAlcyBXSVRIIHJlcGxpY2F0aW9uPXsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogMSwgJyIgKyBEQVRBX0NFTlRFUl9SRU1PVEUgKyAiJzogM30iKTsKQEAgLTMyNiw5ICszMjYsOSBAQAogICAgICAgICBJbmV0QWRkcmVzc0FuZFBvcnQgbG9jYWwgPSBGQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydCgpOwogICAgICAgICBJbmV0QWRkcmVzc0FuZFBvcnQgcmVtb3RlID0gSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZSgiMTI3LjAuMC40Iik7CiAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZUhvc3RJZChVVUlELnJhbmRvbVVVSUQoKSwgbG9jYWwpOwotICAgICAgICBtZXRhZGF0YS51cGRhdGVOb3JtYWxUb2tlbihuZXcgT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuU3RyaW5nVG9rZW4oIkEiKSwgbG9jYWwpOworICAgICAgICBtZXRhZGF0YS51cGRhdGVOb3JtYWxUb2tlbihVdGlsLnRva2VuKCJBIiksIGxvY2FsKTsKICAgICAgICAgbWV0YWRhdGEudXBkYXRlSG9zdElkKFVVSUQucmFuZG9tVVVJRCgpLCByZW1vdGUpOwotICAgICAgICBtZXRhZGF0YS51cGRhdGVOb3JtYWxUb2tlbihuZXcgT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuU3RyaW5nVG9rZW4oIkIiKSwgcmVtb3RlKTsKKyAgICAgICAgbWV0YWRhdGEudXBkYXRlTm9ybWFsVG9rZW4oVXRpbC50b2tlbigiQiIpLCByZW1vdGUpOwogCiAgICAgICAgIC8vIExldCdzIGNyZWF0ZSBhIGtleXNwYWNlIGZpcnN0IHdpdGggU2ltcGxlU3RyYXRlZ3kKICAgICAgICAgU3RyaW5nIGtzMSA9IGNyZWF0ZUtleXNwYWNlKCJDUkVBVEUgS0VZU1BBQ0UgJXMgV0lUSCByZXBsaWNhdGlvbj17ICdjbGFzcycgOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJyA6IDJ9Iik7CkBAIC0zNjMsOSArMzYzLDkgQEAKICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IGxvY2FsID0gRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKTsKICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IHJlbW90ZSA9IEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoIjEyNy4wLjAuNCIpOwogICAgICAgICBtZXRhZGF0YS51cGRhdGVIb3N0SWQoVVVJRC5yYW5kb21VVUlEKCksIGxvY2FsKTsKLSAgICAgICAgbWV0YWRhdGEudXBkYXRlTm9ybWFsVG9rZW4obmV3IE9yZGVyUHJlc2VydmluZ1BhcnRpdGlvbmVyLlN0cmluZ1Rva2VuKCJBIiksIGxvY2FsKTsKKyAgICAgICAgbWV0YWRhdGEudXBkYXRlTm9ybWFsVG9rZW4oVXRpbC50b2tlbigiQSIpLCBsb2NhbCk7CiAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZUhvc3RJZChVVUlELnJhbmRvbVVVSUQoKSwgcmVtb3RlKTsKLSAgICAgICAgbWV0YWRhdGEudXBkYXRlTm9ybWFsVG9rZW4obmV3IE9yZGVyUHJlc2VydmluZ1BhcnRpdGlvbmVyLlN0cmluZ1Rva2VuKCJCIiksIHJlbW90ZSk7CisgICAgICAgIG1ldGFkYXRhLnVwZGF0ZU5vcm1hbFRva2VuKFV0aWwudG9rZW4oIkIiKSwgcmVtb3RlKTsKIAogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RGVmYXVsdEtleXNwYWNlUkYoMyk7CiAKQEAgLTU2MCw2ICs1NjAsNyBAQAogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChhIHRleHQsIGIgaW50LCBjIGludCwgcHJpbWFyeSBrZXkgKGEsIGIpKSIpOwogICAgICAgICBhc3NlcnRTYW1lKE1lbXRhYmxlUGFyYW1zLkRFRkFVTFQuZmFjdG9yeSgpLCBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5tZXRhZGF0YSgpLnBhcmFtcy5tZW10YWJsZS5mYWN0b3J5KCkpOwogICAgICAgICBhc3NlcnRTY2hlbWFPcHRpb24oIm1lbXRhYmxlIiwgbnVsbCk7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBNZW10YWJsZT4gZGVmYXVsdENsYXNzID0gZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuZ2V0VHJhY2tlcigpLmdldFZpZXcoKS5nZXRDdXJyZW50TWVtdGFibGUoKS5nZXRDbGFzcygpOwogCiAgICAgICAgIHRlc3RNZW10YWJsZUNvbmZpZygic2tpcGxpc3QiLCBTa2lwTGlzdE1lbXRhYmxlLkZBQ1RPUlksIFNraXBMaXN0TWVtdGFibGUuY2xhc3MpOwogICAgICAgICB0ZXN0TWVtdGFibGVDb25maWcoInRlc3RfZnVsbG5hbWUiLCBUZXN0TWVtdGFibGUuRkFDVE9SWSwgU2tpcExpc3RNZW10YWJsZS5jbGFzcyk7CkBAIC01NzAsNyArNTcxLDcgQEAKICAgICAgICAgICAgICAgICAgICArICIgV0lUSCBjb21wcmVzc2lvbiA9IHsnY2xhc3MnOiAnTFo0Q29tcHJlc3Nvcid9OyIpOwogICAgICAgICBhc3NlcnRTY2hlbWFPcHRpb24oIm1lbXRhYmxlIiwgInRlc3Rfc2hvcnRuYW1lIik7CiAKLSAgICAgICAgdGVzdE1lbXRhYmxlQ29uZmlnKCJkZWZhdWx0IiwgTWVtdGFibGVQYXJhbXMuREVGQVVMVC5mYWN0b3J5KCksIFNraXBMaXN0TWVtdGFibGUuY2xhc3MpOworICAgICAgICB0ZXN0TWVtdGFibGVDb25maWcoImRlZmF1bHQiLCBNZW10YWJsZVBhcmFtcy5ERUZBVUxULmZhY3RvcnkoKSwgZGVmYXVsdENsYXNzKTsKIAogCiAgICAgICAgIGFzc2VydEFsdGVyVGFibGVUaHJvd3NFeGNlcHRpb24oQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcywKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9Db21wYWN0U3RvcmFnZVNwbGl0MVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9Db21wYWN0U3RvcmFnZVNwbGl0MVRlc3QuamF2YQppbmRleCA4MGJmNTFjLi4yMTRkNzc2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvQ29tcGFjdFN0b3JhZ2VTcGxpdDFUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0NvbXBhY3RTdG9yYWdlU3BsaXQxVGVzdC5qYXZhCkBAIC03NzgsMTEgKzc3OCwxMSBAQAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIHYpIFZBTFVFUyAoPywgPykiLCBieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIikpOwogCiAgICAgICAgIC8vIFRlc3QgcmVzdHJpY3Rpb25zIG9uIG5vbi1wcmltYXJ5IGtleSB2YWx1ZQotICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIHYgPSB0ZXh0QXNCbG9iKCcnKTsiKSk7CisgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCB2KSBWQUxVRVMgKD8sID8pIiwgYnl0ZXMoImZvbzEyNCIpLCBFTVBUWV9CWVRFX0JVRkZFUik7CiAKLSAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHYgPSB0ZXh0QXNCbG9iKCcnKTsiKSwKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHYgPSB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTI0IiksIEVNUFRZX0JZVEVfQlVGRkVSKSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvQ29tcGFjdFN0b3JhZ2VTcGxpdDJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvQ29tcGFjdFN0b3JhZ2VTcGxpdDJUZXN0LmphdmEKaW5kZXggZTM5OWZlYi4uMWM0ZmViMyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0NvbXBhY3RTdG9yYWdlU3BsaXQyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9Db21wYWN0U3RvcmFnZVNwbGl0MlRlc3QuamF2YQpAQCAtMTYzOSw0OSArMTYzOSw0OSBAQAogCiAgICAgICAgICAgICBiZWZvcmVBbmRBZnRlckZsdXNoKCgpIC0+IHsKIAotICAgICAgICAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJLZXkgbWF5IG5vdCBiZSBlbXB0eSIsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignJyk7Iik7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIktleSBtYXkgbm90IGJlIGVtcHR5IiwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgSU4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpOworICAgICAgICAgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJLZXkgbWF5IG5vdCBiZSBlbXB0eSIsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCcnKTsiKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiS2V5IG1heSBub3QgYmUgZW1wdHkiLCAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayBJTiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpOwogCiAgICAgICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIktleSBtYXkgbm90IGJlIGVtcHR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSk7CiAKICAgICAgICAgICAgICAgICAvLyBUZXN0IGNsdXN0ZXJpbmcgY29sdW1ucyByZXN0cmljdGlvbnMKLSAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPSB0ZXh0QXNCbG9iKCcnKTsiKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPSB0ZXh0X2FzX2Jsb2IoJycpOyIpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpID0gKHRleHRBc0Jsb2IoJycpKTsiKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSA9ICh0ZXh0X2FzX2Jsb2IoJycpKTsiKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyBJTiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSk7IiksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyBJTiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSBJTiAoKHRleHRBc0Jsb2IoJycpKSwgKHRleHRBc0Jsb2IoJzEnKSkpOyIpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSBJTiAoKHRleHRfYXNfYmxvYignJykpLCAodGV4dF9hc19ibG9iKCcxJykpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID4gdGV4dEFzQmxvYignJyk7IiksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPiAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSA+ICh0ZXh0X2FzX2Jsb2IoJycpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dEFzQmxvYignJyk7IiksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0QXNCbG9iKCcnKSk7IiksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0X2FzX2Jsb2IoJycpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0X2FzX2Jsb2IoJycpOyIpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpIDw9ICh0ZXh0QXNCbG9iKCcnKSk7IikpOworICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPD0gKHRleHRfYXNfYmxvYignJykpOyIpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJyk7IikpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPCAodGV4dEFzQmxvYignJykpOyIpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpIDwgKHRleHRfYXNfYmxvYignJykpOyIpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRBc0Jsb2IoJycpIEFORCBjIDwgdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID4gdGV4dF9hc19ibG9iKCcnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJyk7IikpOwogICAgICAgICAgICAgfSk7CiAKICAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRhaW5zKCJDT01QQUNUIikpCkBAIC0xNjk2LDYwICsxNjk2LDYwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKTsKIAogICAgICAgICAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA9IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID0gdGV4dF9hc19ibG9iKCcnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjQiKSkpOwogCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPSAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPSAodGV4dF9hc19ibG9iKCcnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyBJTiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSk7IiksCisgICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgSU4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjQiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgSU4gKCh0ZXh0QXNCbG9iKCcnKSksICh0ZXh0QXNCbG9iKCcxJykpKTsiKSwKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpIElOICgodGV4dF9hc19ibG9iKCcnKSksICh0ZXh0X2FzX2Jsb2IoJzEnKSkpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPiB0ZXh0QXNCbG9iKCcnKTsiKSwKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPiAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPiAodGV4dF9hc19ibG9iKCcnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCI0IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpKTsKIAotICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0QXNCbG9iKCcnKSk7IiksCisgICAgICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSA+PSAodGV4dF9hc19ibG9iKCcnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCI0IikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpKTsKIAotICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0QXNCbG9iKCcnKTsiKSwKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSA8PSAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPD0gKHRleHRfYXNfYmxvYignJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJyk7IikpOwogCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpIDwgKHRleHRBc0Jsb2IoJycpKTsiKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPCAodGV4dF9hc19ibG9iKCcnKSk7IikpOwogCi0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0QXNCbG9iKCcnKSBBTkQgYyA8IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dF9hc19ibG9iKCcnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJyk7IikpOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBUZXN0IHJlc3RyaWN0aW9ucyBvbiBub24tcHJpbWFyeSBrZXkgdmFsdWUKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJycpIEFMTE9XIEZJTFRFUklORzsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgdiA9IHRleHRfYXNfYmxvYignJykgQUxMT1cgRklMVEVSSU5HOyIpKTsKIAogICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIiwKICAgICAgICAgICAgICAgICAgICAgYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMyIpLCBFTVBUWV9CWVRFX0JVRkZFUik7CiAKICAgICAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCB2ID0gdGV4dEFzQmxvYignJykgQUxMT1cgRklMVEVSSU5HOyIpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJycpIEFMTE9XIEZJTFRFUklORzsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIzIiksIEVNUFRZX0JZVEVfQlVGRkVSKSk7CiAgICAgICAgICAgICB9KTsKICAgICAgICAgfQpAQCAtMTc2NCw3NiArMTc2NCw3NiBAQAogCiAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0QXNCbG9iKCcxJykgQU5EIGMyID0gdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcxJykgQU5EIGMyID0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPSAodGV4dEFzQmxvYignMScpLCB0ZXh0QXNCbG9iKCcnKSk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID0gKHRleHRfYXNfYmxvYignMScpLCB0ZXh0X2FzX2Jsb2IoJycpKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSBJTiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSkgQU5EIGMyID0gdGV4dEFzQmxvYignMScpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgSU4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSBBTkQgYzIgPSB0ZXh0X2FzX2Jsb2IoJzEnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0QXNCbG9iKCcxJykgQU5EIGMyIElOICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcxJykgQU5EIGMyIElOICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpIElOICgodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSksICh0ZXh0QXNCbG9iKCcxJyksIHRleHRBc0Jsb2IoJzEnKSkpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgSU4gKCh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSksICh0ZXh0X2FzX2Jsb2IoJzEnKSwgdGV4dF9hc19ibG9iKCcxJykpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPiB0ZXh0QXNCbG9iKCcnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID4gdGV4dF9hc19ibG9iKCcnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignMScpIEFORCBjMiA+IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTkQgYzIgPiB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA+ICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRBc0Jsb2IoJzEnKSBBTkQgYzIgPj0gdGV4dEFzQmxvYignJyk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRfYXNfYmxvYignMScpIEFORCBjMiA+PSB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignMScpIEFORCBjMiA8PSB0ZXh0QXNCbG9iKCcnKTsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTkQgYzIgPD0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPD0gKHRleHRBc0Jsb2IoJzEnKSwgdGV4dEFzQmxvYignJykpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA8PSAodGV4dF9hc19ibG9iKCcxJyksIHRleHRfYXNfYmxvYignJykpOyIpKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjMSwgYzIsIHYpIFZBTFVFUyAoPywgPywgPywgPykiLAogICAgICAgICAgICAgICAgIGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpOwogCiAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignJyk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpLCBieXRlcygiNCIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRBc0Jsb2IoJycpIEFORCBjMiA9IHRleHRBc0Jsb2IoJzEnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcnKSBBTkQgYzIgPSB0ZXh0X2FzX2Jsb2IoJzEnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID0gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPSAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjQiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgSU4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpIEFORCBjMiA9IHRleHRBc0Jsb2IoJzEnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxIElOICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkgQU5EIGMyID0gdGV4dF9hc19ibG9iKCcxJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpLCBieXRlcygiNCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgSU4gKCh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSwgKHRleHRBc0Jsb2IoJzEnKSwgdGV4dEFzQmxvYignMScpKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSBJTiAoKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSwgKHRleHRfYXNfYmxvYignMScpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjQiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPj0gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPj0gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPD0gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPD0gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA8ICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKTsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPCAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpKTsKICAgICAgICAgfSk7CiAgICAgfQogCkBAIC0xODU3LDE3ICsxODU3LDE3IEBACiAKICAgICAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPiB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0X2FzX2Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dEFzQmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSkpOworICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRfYXNfYmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpKTsKICAgICAgICAgICAgIH0pOwogCiAgICAgICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCBlbXB0eSBvciBudWxsIHZhbHVlIGZvciBjb2x1bW4gYyIsCkBAIC0xODkyLDE5ICsxODkyLDE5IEBACiAKICAgICAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID4gdGV4dEFzQmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID4gdGV4dF9hc19ibG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRBc0Jsb2IoJzEnKSBBTkQgYzIgPiB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTkQgYzIgPiB0ZXh0X2FzX2Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpIiArIG9yZGVyaW5nQ2xhdXNlKSwKKyAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA+ICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkiICsgb3JkZXJpbmdDbGF1c2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0QXNCbG9iKCcxJykgQU5EIGMyID49IHRleHRBc0Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKKyAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRfYXNfYmxvYignMScpIEFORCBjMiA+PSB0ZXh0X2FzX2Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogICAgICAgICAgICAgfSk7CkBAIC0xOTE0LDE5ICsxOTE0LDE5IEBACiAKICAgICAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxIElOICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSBBTkQgYzIgPSB0ZXh0QXNCbG9iKCcxJykiICsgb3JkZXJpbmdDbGF1c2UpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxIElOICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkgQU5EIGMyID0gdGV4dF9hc19ibG9iKCcxJykiICsgb3JkZXJpbmdDbGF1c2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjQiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpIElOICgodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSksICh0ZXh0QXNCbG9iKCcxJyksIHRleHRBc0Jsb2IoJzEnKSkpIiArIG9yZGVyaW5nQ2xhdXNlKSwKKyAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSBJTiAoKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSwgKHRleHRfYXNfYmxvYignMScpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA+ICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID49ICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPj0gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSIgKyBvcmRlcmluZ0NsYXVzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9DcmVhdGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvQ3JlYXRlVGVzdC5qYXZhCmluZGV4IDY4NzUxY2QuLmMyYTg2NTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9DcmVhdGVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0NyZWF0ZVRlc3QuamF2YQpAQCAtMTcsMTYgKzE3LDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnZhbGlkYXRpb24ub3BlcmF0aW9uczsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLQotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuRHVyYXRpb247CkBAIC0zNCw2ICsyNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuTWVtdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuU2tpcExpc3RNZW10YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZS5UZXN0TWVtdGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuVHJpZU1lbXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOwpAQCAtNDMsMjUgKzM0LDIzIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JRW5kcG9pbnRTbml0Y2g7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5NZW10YWJsZVBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUtleXNwYWNlVGFibGVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJpZ2dlcnMuSVRyaWdnZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5EdXJhdGlvbi5OQU5PU19QRVJfSE9VUjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5EdXJhdGlvbi5OQU5PU19QRVJfTUlDUk87Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuRHVyYXRpb24uTkFOT1NfUEVSX01JTExJOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkR1cmF0aW9uLk5BTk9TX1BFUl9NSU5VVEU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkR1cmF0aW9uLio7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKIAogcHVibGljIGNsYXNzIENyZWF0ZVRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKIHsKQEAgLTYxMywxNCArNjAyLDE2IEBACiAgICAgewogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChhIHRleHQsIGIgaW50LCBjIGludCwgcHJpbWFyeSBrZXkgKGEsIGIpKSIpOwogICAgICAgICBhc3NlcnRTYW1lKE1lbXRhYmxlUGFyYW1zLkRFRkFVTFQuZmFjdG9yeSgpLCBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5tZXRhZGF0YSgpLnBhcmFtcy5tZW10YWJsZS5mYWN0b3J5KCkpOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgTWVtdGFibGU+IGRlZmF1bHRDbGFzcyA9IGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldFRyYWNrZXIoKS5nZXRWaWV3KCkuZ2V0Q3VycmVudE1lbXRhYmxlKCkuZ2V0Q2xhc3MoKTsKIAogICAgICAgICBhc3NlcnRTY2hlbWFPcHRpb24oIm1lbXRhYmxlIiwgbnVsbCk7CiAKICAgICAgICAgdGVzdE1lbXRhYmxlQ29uZmlnKCJza2lwbGlzdCIsIFNraXBMaXN0TWVtdGFibGUuRkFDVE9SWSwgU2tpcExpc3RNZW10YWJsZS5jbGFzcyk7CisgICAgICAgIHRlc3RNZW10YWJsZUNvbmZpZygidHJpZSIsIE1lbXRhYmxlUGFyYW1zLmdldCgidHJpZSIpLmZhY3RvcnkoKSwgVHJpZU1lbXRhYmxlLmNsYXNzKTsKICAgICAgICAgdGVzdE1lbXRhYmxlQ29uZmlnKCJza2lwbGlzdF9yZW1hcHBlZCIsIFNraXBMaXN0TWVtdGFibGUuRkFDVE9SWSwgU2tpcExpc3RNZW10YWJsZS5jbGFzcyk7CiAgICAgICAgIHRlc3RNZW10YWJsZUNvbmZpZygidGVzdF9mdWxsbmFtZSIsIFRlc3RNZW10YWJsZS5GQUNUT1JZLCBTa2lwTGlzdE1lbXRhYmxlLmNsYXNzKTsKICAgICAgICAgdGVzdE1lbXRhYmxlQ29uZmlnKCJ0ZXN0X3Nob3J0bmFtZSIsIFNraXBMaXN0TWVtdGFibGUuRkFDVE9SWSwgU2tpcExpc3RNZW10YWJsZS5jbGFzcyk7Ci0gICAgICAgIHRlc3RNZW10YWJsZUNvbmZpZygiZGVmYXVsdCIsIE1lbXRhYmxlUGFyYW1zLkRFRkFVTFQuZmFjdG9yeSgpLCBTa2lwTGlzdE1lbXRhYmxlLmNsYXNzKTsKKyAgICAgICAgdGVzdE1lbXRhYmxlQ29uZmlnKCJkZWZhdWx0IiwgTWVtdGFibGVQYXJhbXMuREVGQVVMVC5mYWN0b3J5KCksIGRlZmF1bHRDbGFzcyk7CiAKICAgICAgICAgYXNzZXJ0VGhyb3dzQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiVGhlICdjbGFzc19uYW1lJyBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1JFQVRFIFRBQkxFICVzIChhIHRleHQsIGIgaW50LCBjIGludCwgcHJpbWFyeSBrZXkgKGEsIGIpKSIKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9EZWxldGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvRGVsZXRlVGVzdC5qYXZhCmluZGV4IDk4MGI3OTEuLjY0NWJlY2QgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9EZWxldGVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0RlbGV0ZVRlc3QuamF2YQpAQCAtMTE3MSwxMiArMTE3MSwxMiBAQAogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBibG9iLCBjIGJsb2IsIHYgYmxvYiwgUFJJTUFSWSBLRVkgKHBrLCBjKSkiKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykiLCBieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpKTsKLSAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA9IHRleHRBc0Jsb2IoJycpOyIpOworICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPSB0ZXh0X2FzX2Jsb2IoJycpOyIpOwogCiAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjLCB2KSBWQUxVRVMgKD8sID8sID8pIiwgYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSk7Ci0gICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgSU4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpOworICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgSU4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKTsKIAogICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIikpOwogCkBAIC0xMTg0LDI3ICsxMTg0LDI3IEBACiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSk7CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRBc0Jsb2IoJycpIik7CisgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJykiKTsKIAogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMiKSwKICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dEFzQmxvYignJykiKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRfYXNfYmxvYignJykiKTsKIAogICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSk7CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRBc0Jsb2IoJycpIik7CisgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJykiKTsKIAogICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSk7CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0QXNCbG9iKCcnKSIpOwotICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dEFzQmxvYignJykiKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRfYXNfYmxvYignJykiKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dF9hc19ibG9iKCcnKSIpOwogCiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyIpLAogICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLApAQCAtMTIxNywxMiArMTIxNywxMiBAQAogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBibG9iLCBjMSBibG9iLCBjMiBibG9iLCB2IGJsb2IsIFBSSU1BUlkgS0VZIChwaywgYzEsIGMyKSkiKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMxLCBjMiwgdikgVkFMVUVTICg/LCA/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpOwotICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRBc0Jsb2IoJycpOyIpOworICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcnKTsiKTsKIAogICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYzEsIGMyLCB2KSBWQUxVRVMgKD8sID8sID8sID8pIiwgYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSk7Ci0gICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxIElOICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSBBTkQgYzIgPSB0ZXh0QXNCbG9iKCcxJyk7Iik7CisgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgSU4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSBBTkQgYzIgPSB0ZXh0X2FzX2Jsb2IoJzEnKTsiKTsKIAogICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIikpOwogCkBAIC0xMjMwLDI3ICsxMjMwLDI3IEBACiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYzEsIGMyLCB2KSBWQUxVRVMgKD8sID8sID8sID8pIiwgYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKTsKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjMSwgYzIsIHYpIFZBTFVFUyAoPywgPywgPywgPykiLCBieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIzIikpOwogCi0gICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID4gdGV4dEFzQmxvYignJykiKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA+IHRleHRfYXNfYmxvYignJykiKTsKIAogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMiKSwKICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjAiKSkpOwogCi0gICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID49IHRleHRBc0Jsb2IoJycpIik7CisgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgPj0gdGV4dF9hc19ibG9iKCcnKSIpOwogCiAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjMSwgYzIsIHYpIFZBTFVFUyAoPywgPywgPywgPykiLCBieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpOwogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMxLCBjMiwgdikgVkFMVUVTICg/LCA/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjMiKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPiB0ZXh0QXNCbG9iKCcnKSIpOworICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID4gdGV4dF9hc19ibG9iKCcnKSIpOwogCiAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMiKSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjMSwgYzIsIHYpIFZBTFVFUyAoPywgPywgPywgPykiLCBieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpOwogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMxLCBjMiwgdikgVkFMVUVTICg/LCA/LCA/LCA/KSIsIGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjMiKSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPD0gdGV4dEFzQmxvYignJykiKTsKLSAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPCB0ZXh0QXNCbG9iKCcnKSIpOworICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxIDw9IHRleHRfYXNfYmxvYignJykiKTsKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA8IHRleHRfYXNfYmxvYignJykiKTsKIAogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMiKSwKICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9JbnNlcnRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvSW5zZXJ0VGVzdC5qYXZhCmluZGV4IDRlMzNhZTMuLmY2ZTcxYWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9JbnNlcnRUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0luc2VydFRlc3QuamF2YQpAQCAtMTgsNiArMTgsOCBAQAogCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMudmFsaWRhdGlvbi5vcGVyYXRpb25zOwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKQEAgLTY4LDYgKzcwLDE1IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlUVEwoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdiBpbnQpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDAsIDApIFVTSU5HIFRUTCA/IiwgKE9iamVjdCkgbnVsbCk7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDEsIDEpIFVTSU5HIFRUTCA/IiwgQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzBdKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGssIHYsIHR0bCh2KSBGUk9NICVzIiksIHJvdygxLCAxLCBudWxsKSwgcm93KDAsIDAsIG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnRXaXRoVW5zZXQoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgcyB0ZXh0LCBpIGludCkiKTsKQEAgLTg3LDcgKzk4LDcgQEAKIAogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCB1bnNldCB2YWx1ZSBmb3IgY29sdW1uIGsiLCAiVVBEQVRFICVzIFNFVCBpID0gMCBXSEVSRSBrID0gPyIsIHVuc2V0KCkpOwogICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCB1bnNldCB2YWx1ZSBmb3IgY29sdW1uIGsiLCAiREVMRVRFIEZST00gJXMgV0hFUkUgayA9ID8iLCB1bnNldCgpKTsKLSAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkludmFsaWQgdW5zZXQgdmFsdWUgZm9yIGFyZ3VtZW50IGluIGNhbGwgdG8gZnVuY3Rpb24gYmxvYmFzaW50IiwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IGJsb2JBc0ludCg/KSIsIHVuc2V0KCkpOworICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCB1bnNldCB2YWx1ZSBmb3IgYXJndW1lbnQgaW4gY2FsbCB0byBmdW5jdGlvbiBibG9iX2FzX2ludCIsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSBibG9iX2FzX2ludCg/KSIsIHVuc2V0KCkpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvSW5zZXJ0VXBkYXRlSWZDb25kaXRpb25Db2xsZWN0aW9uc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9JbnNlcnRVcGRhdGVJZkNvbmRpdGlvbkNvbGxlY3Rpb25zVGVzdC5qYXZhCmluZGV4IGMwYTUxMzkuLmZlNDA3M2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9JbnNlcnRVcGRhdGVJZkNvbmRpdGlvbkNvbGxlY3Rpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9JbnNlcnRVcGRhdGVJZkNvbmRpdGlvbkNvbGxlY3Rpb25zVGVzdC5qYXZhCkBAIC0yOSw2ICsyOSw3IEBACiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlN5bnRheEV4Y2VwdGlvbjsKQEAgLTUxLDYgKzUyLDggQEAKICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAie2luZGV4fTogY2x1c3Rlck1pblZlcnNpb249ezB9IikKICAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGRhdGEoKQogICAgIHsKKyAgICAgICAgU2VydmVyVGVzdFV0aWxzLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisKICAgICAgICAgcmV0dXJuIEluc2VydFVwZGF0ZUlmQ29uZGl0aW9uVGVzdC5kYXRhKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvSW5zZXJ0VXBkYXRlSWZDb25kaXRpb25TdGF0aWNzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0luc2VydFVwZGF0ZUlmQ29uZGl0aW9uU3RhdGljc1Rlc3QuamF2YQppbmRleCBiOWM5Y2UzLi4zMjcwZmMxIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvSW5zZXJ0VXBkYXRlSWZDb25kaXRpb25TdGF0aWNzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9JbnNlcnRVcGRhdGVJZkNvbmRpdGlvblN0YXRpY3NUZXN0LmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKIAogLyogSW5zZXJ0VXBkYXRlSWZDb25kaXRpb25Db2xsZWN0aW9uc1Rlc3QgY2xhc3MgaGFzIGJlZW4gc3BsaXQgaW50byBtdWx0aXBsZSBvbmVzIGJlY2F1c2Ugb2YgdGltZW91dCBpc3N1ZXMgKENBU1NBTkRSQS0xNjY3MCkKQEAgLTQ3LDYgKzQ4LDcgQEAKICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAie2luZGV4fTogY2x1c3Rlck1pblZlcnNpb249ezB9IikKICAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGRhdGEoKQogICAgIHsKKyAgICAgICAgU2VydmVyVGVzdFV0aWxzLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgICAgIHJldHVybiBJbnNlcnRVcGRhdGVJZkNvbmRpdGlvblRlc3QuZGF0YSgpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0luc2VydFVwZGF0ZUlmQ29uZGl0aW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL0luc2VydFVwZGF0ZUlmQ29uZGl0aW9uVGVzdC5qYXZhCmluZGV4IDg0MjllYzAuLmM2MTc1NDQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9JbnNlcnRVcGRhdGVJZkNvbmRpdGlvblRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvSW5zZXJ0VXBkYXRlSWZDb25kaXRpb25UZXN0LmphdmEKQEAgLTI4LDYgKzI4LDcgQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuRHVyYXRpb247CkBAIC02MSw2ICs2Miw3IEBACiAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIntpbmRleH06IGNsdXN0ZXJNaW5WZXJzaW9uPXswfSIpCiAgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiBkYXRhKCkKICAgICB7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117ICIzLjAiLCAoUnVubmFibGUpICgpIC0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaXI8Qm9vbGVhbiwgQ2Fzc2FuZHJhVmVyc2lvbj4gcmVzID0gR29zc2lwZXIuaW5zdGFuY2UuaXNVcGdyYWRpbmdGcm9tVmVyc2lvbkxvd2VyVGhhbkMxNzY1MyhuZXcgQ2Fzc2FuZHJhVmVyc2lvbigiMy4xMSIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZGVidWdNc2dDQVNTQU5EUkExNzY1MyhyZXMpLCByZXMubGVmdCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvU2VsZWN0R3JvdXBCeVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RHcm91cEJ5VGVzdC5qYXZhCmluZGV4IGY0Njc4M2IuLjBhMGFlY2IgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RHcm91cEJ5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RHcm91cEJ5VGVzdC5qYXZhCkBAIC0yMjUxLDcgKzIyNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KDIsIHRvVGltZXN0YW1wKCIyMDE2LTA5LTI3IDE2OjI1OjAwIFVUQyIpLCAxMCwgMTAsIDFMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygyLCB0b1RpbWVzdGFtcCgiMjAxNi0wOS0yNyAxNjozMDowMCBVVEMiKSwgMTEsIDExLCAxTCkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgcGssIGZsb29yKHRvVGltZXN0YW1wKHRpbWUpLCA1bSIgKyBzdGFydGluZ1RpbWUgKyAiKSwgbWluKHYpLCBtYXgodiksIGNvdW50KHYpIEZST00gJXMgR1JPVVAgQlkgcGssIGZsb29yKHRvVGltZXN0YW1wKHRpbWUpLCA1bSIgKyBzdGFydGluZ1RpbWUgKyAiKSIpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHBrLCBmbG9vcih0b190aW1lc3RhbXAodGltZSksIDVtIiArIHN0YXJ0aW5nVGltZSArICIpLCBtaW4odiksIG1heCh2KSwgY291bnQodikgRlJPTSAlcyBHUk9VUCBCWSBwaywgZmxvb3IodG9fdGltZXN0YW1wKHRpbWUpLCA1bSIgKyBzdGFydGluZ1RpbWUgKyAiKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KDEsIHRvVGltZXN0YW1wKCIyMDE2LTA5LTI3IDE2OjEwOjAwIFVUQyIpLCAxLCAzLCAzTCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coMSwgdG9UaW1lc3RhbXAoIjIwMTYtMDktMjcgMTY6MTU6MDAgVVRDIiksIDQsIDQsIDFMKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCB0b1RpbWVzdGFtcCgiMjAxNi0wOS0yNyAxNjoyMDowMCBVVEMiKSwgNSwgNiwgMkwpLApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL1NlbGVjdExpbWl0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL1NlbGVjdExpbWl0VGVzdC5qYXZhCmluZGV4IDJlNDE5ZTEuLjM0N2JjMWQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RMaW1pdFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvU2VsZWN0TGltaXRUZXN0LmphdmEKQEAgLTIzLDYgKzIzLDcgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQnl0ZU9yZGVyZWRQYXJ0aXRpb25lcjsKQEAgLTM0LDYgKzM1LDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKwogICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5zZXRQYXJ0aXRpb25lclVuc2FmZShCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKTsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFBhcnRpdGlvbmVyVW5zYWZlKEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UpOwogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvU2VsZWN0T3JkZXJCeVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RPcmRlckJ5VGVzdC5qYXZhCmluZGV4IDhhM2FlMDMuLjBjYmUyMjEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RPcmRlckJ5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RPcmRlckJ5VGVzdC5qYXZhCkBAIC03MywxNyArNzMsMTcgQEAKIAogICAgICAgICBiZWZvcmVBbmRBZnRlckZsdXNoKCgpIC0+IHsKICAgICAgICAgICAgIC8vIG9yZGVyIGJ5IHRoZSBvbmx5IGNvbHVtbiBpbiB0aGUgc2VsZWN0aW9uCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQyIsIDApLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYikpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgQVNDIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdygwKSwgcm93KDEpLCByb3coMikpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIERFU0MiLCAwKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JfYXNfaW50KGludF9hc19ibG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIERFU0MiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KDIpLCByb3coMSksIHJvdygwKSk7CiAKICAgICAgICAgICAgIC8vIG9yZGVyIGJ5IGEgY29sdW1uIG5vdCBpbiB0aGUgc2VsZWN0aW9uCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGMpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQyIsIDApLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYykpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgQVNDIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdygwKSwgcm93KDEpLCByb3coMikpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGMpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIERFU0MiLCAwKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JfYXNfaW50KGludF9hc19ibG9iKGMpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIERFU0MiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KDIpLCByb3coMSksIHJvdygwKSk7CiAKICAgICAgICAgICAgIGFzc2VydEludmFsaWQoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGMgQVNDIiwgMCk7CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGMuYSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIERFU0MiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KDIpLCByb3coMSksIHJvdygwKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JBc0ludChpbnRBc0Jsb2IoYy5hKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBERVNDIiwgMCksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iX2FzX2ludChpbnRfYXNfYmxvYihjLmEpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIERFU0MiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KDIpLCByb3coMSksIHJvdygwKSk7CiAgICAgICAgIH0pOwogICAgICAgICBkcm9wVGFibGUoIkRST1AgVEFCTEUgJXMiKTsKQEAgLTE5OCwzOSArMTk4LDM5IEBACiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiLCBjLCBkKSBWQUxVRVMgKD8sID8sID8sID8pIiwgMCwgMSwgMiwgNSk7CiAKICAgICAgICAgYmVmb3JlQW5kQWZ0ZXJGbHVzaCgoKSAtPiB7Ci0gICAgICAgICAgICBhc3NlcnRJbnZhbGlkKCJTRUxFQ1QgYmxvYkFzSW50KGludEFzQmxvYihiKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYyBBU0MiLCAwKTsKLSAgICAgICAgICAgIGFzc2VydEludmFsaWQoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBjIERFU0MiLCAwKTsKLSAgICAgICAgICAgIGFzc2VydEludmFsaWQoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQywgYyBERVNDIiwgMCk7Ci0gICAgICAgICAgICBhc3NlcnRJbnZhbGlkKCJTRUxFQ1QgYmxvYkFzSW50KGludEFzQmxvYihiKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBERVNDLCBjIEFTQyIsIDApOwotICAgICAgICAgICAgYXNzZXJ0SW52YWxpZCgiU0VMRUNUIGJsb2JBc0ludChpbnRBc0Jsb2IoYikpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGQgQVNDIiwgMCk7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYikpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGMgQVNDIiwgMCk7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYikpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGMgREVTQyIsIDApOworICAgICAgICAgICAgYXNzZXJ0SW52YWxpZCgiU0VMRUNUIGJsb2JfYXNfaW50KGludF9hc19ibG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQywgYyBERVNDIiwgMCk7CisgICAgICAgICAgICBhc3NlcnRJbnZhbGlkKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYikpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgREVTQywgYyBBU0MiLCAwKTsKKyAgICAgICAgICAgIGFzc2VydEludmFsaWQoIlNFTEVDVCBibG9iX2FzX2ludChpbnRfYXNfYmxvYihiKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgZCBBU0MiLCAwKTsKIAogICAgICAgICAgICAgLy8gc2VsZWN0IGFuZCBvcmRlciBieSBiCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQyIsIDApLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYikpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgQVNDIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdygwKSwgcm93KDApLCByb3coMCksIHJvdygxKSwgcm93KDEpLCByb3coMSkpOwotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYkFzSW50KGludEFzQmxvYihiKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBERVNDIiwgMCksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iX2FzX2ludChpbnRfYXNfYmxvYihiKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBERVNDIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdygxKSwgcm93KDEpLCByb3coMSksIHJvdygwKSwgcm93KDApLCByb3coMCkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBiLCBibG9iQXNJbnQoaW50QXNCbG9iKGIpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQyIsIDApLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYiwgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYikpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgQVNDIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdygwLCAwKSwgcm93KDAsIDApLCByb3coMCwgMCksIHJvdygxLCAxKSwgcm93KDEsIDEpLCByb3coMSwgMSkpOwotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYiwgYmxvYkFzSW50KGludEFzQmxvYihiKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBERVNDIiwgMCksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBiLCBibG9iX2FzX2ludChpbnRfYXNfYmxvYihiKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBERVNDIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdygxLCAxKSwgcm93KDEsIDEpLCByb3coMSwgMSksIHJvdygwLCAwKSwgcm93KDAsIDApLCByb3coMCwgMCkpOwogCiAgICAgICAgICAgICAvLyBzZWxlY3QgYywgb3JkZXIgYnkgYgotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYkFzSW50KGludEFzQmxvYihjKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBBU0MiLCAwKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JfYXNfaW50KGludF9hc19ibG9iKGMpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQyIsIDApLAogICAgICAgICAgICAgICAgICAgICAgICByb3coMCksIHJvdygxKSwgcm93KDIpLCByb3coMCksIHJvdygxKSwgcm93KDIpKTsKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JBc0ludChpbnRBc0Jsb2IoYykpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgREVTQyIsIDApLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYykpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgREVTQyIsIDApLAogICAgICAgICAgICAgICAgICAgICAgICByb3coMiksIHJvdygxKSwgcm93KDApLCByb3coMiksIHJvdygxKSwgcm93KDApKTsKIAogICAgICAgICAgICAgLy8gc2VsZWN0IGMsIG9yZGVyIGJ5IGIsIGMKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JBc0ludChpbnRBc0Jsb2IoYykpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgQVNDLCBjIEFTQyIsIDApLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoYykpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgQVNDLCBjIEFTQyIsIDApLAogICAgICAgICAgICAgICAgICAgICAgICByb3coMCksIHJvdygxKSwgcm93KDIpLCByb3coMCksIHJvdygxKSwgcm93KDIpKTsKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JBc0ludChpbnRBc0Jsb2IoYykpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgREVTQywgYyBERVNDIiwgMCksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iX2FzX2ludChpbnRfYXNfYmxvYihjKSkgRlJPTSAlcyBXSEVSRSBhPT8gT1JERVIgQlkgYiBERVNDLCBjIERFU0MiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KDIpLCByb3coMSksIHJvdygwKSwgcm93KDIpLCByb3coMSksIHJvdygwKSk7CiAKICAgICAgICAgICAgIC8vIHNlbGVjdCBkLCBvcmRlciBieSBiLCBjCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGQpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQywgYyBBU0MiLCAwKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGJsb2JfYXNfaW50KGludF9hc19ibG9iKGQpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIEFTQywgYyBBU0MiLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KDApLCByb3coMSksIHJvdygyKSwgcm93KDMpLCByb3coNCksIHJvdyg1KSk7Ci0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBibG9iQXNJbnQoaW50QXNCbG9iKGQpKSBGUk9NICVzIFdIRVJFIGE9PyBPUkRFUiBCWSBiIERFU0MsIGMgREVTQyIsIDApLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgYmxvYl9hc19pbnQoaW50X2FzX2Jsb2IoZCkpIEZST00gJXMgV0hFUkUgYT0/IE9SREVSIEJZIGIgREVTQywgYyBERVNDIiwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyg1KSwgcm93KDQpLCByb3coMyksIHJvdygyKSwgcm93KDEpLCByb3coMCkpOwogICAgICAgICB9KTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvU2VsZWN0U2luZ2xlQ29sdW1uUmVsYXRpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvU2VsZWN0U2luZ2xlQ29sdW1uUmVsYXRpb25UZXN0LmphdmEKaW5kZXggMTdjN2U4Ny4uYWUzMTZlMCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL1NlbGVjdFNpbmdsZUNvbHVtblJlbGF0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RTaW5nbGVDb2x1bW5SZWxhdGlvblRlc3QuamF2YQpAQCAtNTQxLDggKzU0MSw4IEBACiAKICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIkludmFsaWQgdW5zZXQgdmFsdWUgZm9yIGFyZ3VtZW50IGluIGNhbGwgdG8gZnVuY3Rpb24gdG9rZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB0b2tlbihrKSA+PSB0b2tlbig/KSIsIHVuc2V0KCkpOwotICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiSW52YWxpZCB1bnNldCB2YWx1ZSBmb3IgYXJndW1lbnQgaW4gY2FsbCB0byBmdW5jdGlvbiBibG9iYXNpbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gYmxvYkFzSW50KD8pIiwgdW5zZXQoKSk7CisgICAgICAgIGFzc2VydEludmFsaWRNZXNzYWdlKCJJbnZhbGlkIHVuc2V0IHZhbHVlIGZvciBhcmd1bWVudCBpbiBjYWxsIHRvIGZ1bmN0aW9uIGJsb2JfYXNfaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgayA9IGJsb2JfYXNfaW50KD8pIiwgdW5zZXQoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvU2VsZWN0VGVzdC5qYXZhCmluZGV4IDdiYmFhODUuLjhlM2E3NTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9TZWxlY3RUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL1NlbGVjdFRlc3QuamF2YQpAQCAtOTIzLDcgKzkyMyw3IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQogICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGssIHQpIFZBTFVFUyAoPywgbm93KCkpIiwgaSk7CiAKLSAgICAgICAgZXhlY3V0ZSgiU0VMRUNUIGRhdGVPZih0KSBGUk9NICVzIik7CisgICAgICAgIGV4ZWN1dGUoIlNFTEVDVCB0b190aW1lc3RhbXAodCkgRlJPTSAlcyIpOwogICAgIH0KIAogICAgIC8qKgpAQCAtOTU5LDcgKzk1OSw3IEBACiAgICAgICAgIGFzc2VydFRydWUodHRsID09IDkgfHwgdHRsID09IDEwKTsKIAogICAgICAgICAvLyB0ZXN0IGFsaWFzaW5nIGEgcmVndWxhciBmdW5jdGlvbgotICAgICAgICBycyA9IGV4ZWN1dGUoIlNFTEVDVCBpbnRBc0Jsb2IoaWQpIEFTIGlkX2Jsb2IgRlJPTSAlcyBXSEVSRSBpZCA9IDAiKTsKKyAgICAgICAgcnMgPSBleGVjdXRlKCJTRUxFQ1QgaW50X2FzX2Jsb2IoaWQpIEFTIGlkX2Jsb2IgRlJPTSAlcyBXSEVSRSBpZCA9IDAiKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJpZF9ibG9iIiwgcnMubWV0YWRhdGEoKS5nZXQoMCkubmFtZS50b1N0cmluZygpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVs0XSksIHJzLm9uZSgpLmdldEJsb2IocnMubWV0YWRhdGEoKS5nZXQoMCkubmFtZS50b1N0cmluZygpKSk7CiAKQEAgLTExMTAsNyArMTExMCw3IEBACiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKCBrIGludCwgdiBpbnQsIFBSSU1BUlkgS0VZIChrLCB2KSkiKTsKIAogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgwLCAwKSIpOwotICAgICAgICAKKwogICAgICAgICBmbHVzaCgpOwogCiAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHYgRlJPTSAlcyBXSEVSRSBrPTAgQU5EIHYgSU4gKDEsIDApIiksCkBAIC0xMjU1LDcgKzEyNTUsNyBAQAogICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBhID0gMiBBTkQgYiA9IDIiKTsKIAogICAgICAgICBiZWZvcmVBbmRBZnRlckZsdXNoKCgpIC0+IHsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAvLyBDaGVja3MgZmlsdGVyaW5nCiAgICAgICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZShTdGF0ZW1lbnRSZXN0cmljdGlvbnMuUkVRVUlSRVNfQUxMT1dfRklMVEVSSU5HX01FU1NBR0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBjID0gNCBBTkQgZCA9IDgiKTsKQEAgLTIzMjgsNyArMjMyOCw3IEBACiAgICAgICAgIC8vIFRlc3QgZm9yIENBU1NBTkRSQS0xMTMxMCBjb21wYXRpYmlsaXR5IHdpdGggMmkKICAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoYSB0ZXh0LCBiIGludCwgYyB0ZXh0LCBkIGludCwgUFJJTUFSWSBLRVkgKGEsIGIsIGMpKTsiKTsKICAgICAgICAgY3JlYXRlSW5kZXgoIkNSRUFURSBJTkRFWCBPTiAlcyhjKSIpOwotICAgICAgICAKKwogICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYywgZCkgVkFMVUVTICg/LCA/LCA/LCA/KSIsICJhIiwgMCwgImIiLCAxKTsKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGEsIGIsIGMsIGQpIFZBTFVFUyAoPywgPywgPywgPykiLCAiYSIsIDEsICJiIiwgMik7CiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChhLCBiLCBjLCBkKSBWQUxVRVMgKD8sID8sID8sID8pIiwgImEiLCAyLCAiYiIsIDMpOwpAQCAtMjUxMyw0OSArMjUxMyw0OSBAQAogCiAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICBhc3NlcnRJbnZhbGlkTWVzc2FnZSgiS2V5IG1heSBub3QgYmUgZW1wdHkiLCAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJycpOyIpOwotICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIktleSBtYXkgbm90IGJlIGVtcHR5IiwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgSU4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpOworICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIktleSBtYXkgbm90IGJlIGVtcHR5IiwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJycpOyIpOworICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIktleSBtYXkgbm90IGJlIGVtcHR5IiwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgSU4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKTsKIAogICAgICAgICAgICAgYXNzZXJ0SW52YWxpZE1lc3NhZ2UoIktleSBtYXkgbm90IGJlIGVtcHR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpOwogCiAgICAgICAgICAgICAvLyBUZXN0IGNsdXN0ZXJpbmcgY29sdW1ucyByZXN0cmljdGlvbnMKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA9IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpID0gKHRleHRBc0Jsb2IoJycpKTsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID0gKHRleHRfYXNfYmxvYignJykpOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgSU4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyBJTiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgSU4gKCh0ZXh0QXNCbG9iKCcnKSksICh0ZXh0QXNCbG9iKCcxJykpKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSBJTiAoKHRleHRfYXNfYmxvYignJykpLCAodGV4dF9hc19ibG9iKCcxJykpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPiAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID4gKHRleHRfYXNfYmxvYignJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0QXNCbG9iKCcnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dF9hc19ibG9iKCcnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSA+PSAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0X2FzX2Jsb2IoJycpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRfYXNfYmxvYignJyk7IikpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSA8PSAodGV4dEFzQmxvYignJykpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPD0gKHRleHRfYXNfYmxvYignJykpOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPCB0ZXh0X2FzX2Jsb2IoJycpOyIpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPCAodGV4dEFzQmxvYignJykpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPCAodGV4dF9hc19ibG9iKCcnKSk7IikpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPiB0ZXh0QXNCbG9iKCcnKSBBTkQgYyA8IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID4gdGV4dF9hc19ibG9iKCcnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJyk7IikpOwogICAgICAgICB9KTsKIAogCkBAIC0yNTYzLDU5ICsyNTYzLDU5IEBACiAgICAgICAgICAgICAgICAgYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjQiKSk7CiAKICAgICAgICAgYmVmb3JlQW5kQWZ0ZXJGbHVzaCgoKSAtPiB7Ci0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA9IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA9IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPSAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID0gKHRleHRfYXNfYmxvYignJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjQiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyBJTiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIElOICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpIElOICgodGV4dEFzQmxvYignJykpLCAodGV4dEFzQmxvYignMScpKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgSU4gKCh0ZXh0X2FzX2Jsb2IoJycpKSwgKHRleHRfYXNfYmxvYignMScpKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPiAodGV4dEFzQmxvYignJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMpID4gKHRleHRfYXNfYmxvYignJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0QXNCbG9iKCcnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dF9hc19ibG9iKCcnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCI0IikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpID49ICh0ZXh0QXNCbG9iKCcnKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPj0gKHRleHRfYXNfYmxvYignJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjQiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjQiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMpIDw9ICh0ZXh0QXNCbG9iKCcnKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYykgPD0gKHRleHRfYXNfYmxvYignJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjQiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPCB0ZXh0QXNCbG9iKCcnKTsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJyk7IikpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjKSA8ICh0ZXh0QXNCbG9iKCcnKSk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjKSA8ICh0ZXh0X2FzX2Jsb2IoJycpKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0QXNCbG9iKCcnKSBBTkQgYyA8IHRleHRBc0Jsb2IoJycpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjID49IHRleHRfYXNfYmxvYignJykgQU5EIGMgPCB0ZXh0X2FzX2Jsb2IoJycpOyIpKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgLy8gVGVzdCByZXN0cmljdGlvbnMgb24gbm9uLXByaW1hcnkga2V5IHZhbHVlCi0gICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJycpIEFMTE9XIEZJTFRFUklORzsiKSk7CisgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCB2ID0gdGV4dF9hc19ibG9iKCcnKSBBTExPVyBGSUxURVJJTkc7IikpOwogCiAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgYywgdikgVkFMVUVTICg/LCA/LCA/KSIsCiAgICAgICAgICAgICAgICAgYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMyIpLCBFTVBUWV9CWVRFX0JVRkZFUik7CiAKICAgICAgICAgYmVmb3JlQW5kQWZ0ZXJGbHVzaCgoKSAtPiB7Ci0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgdiA9IHRleHRBc0Jsb2IoJycpIEFMTE9XIEZJTFRFUklORzsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIHYgPSB0ZXh0X2FzX2Jsb2IoJycpIEFMTE9XIEZJTFRFUklORzsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjMiKSwgRU1QVFlfQllURV9CVUZGRVIpKTsKICAgICAgICAgfSk7CiAgICAgfQpAQCAtMjYyOSw3NiArMjYyOSw3NiBAQAogCiAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0QXNCbG9iKCcxJykgQU5EIGMyID0gdGV4dEFzQmxvYignJyk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcxJykgQU5EIGMyID0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPSAodGV4dEFzQmxvYignMScpLCB0ZXh0QXNCbG9iKCcnKSk7IikpOworICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID0gKHRleHRfYXNfYmxvYignMScpLCB0ZXh0X2FzX2Jsb2IoJycpKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSBJTiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSkgQU5EIGMyID0gdGV4dEFzQmxvYignMScpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgSU4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSBBTkQgYzIgPSB0ZXh0X2FzX2Jsb2IoJzEnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0QXNCbG9iKCcxJykgQU5EIGMyIElOICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcxJykgQU5EIGMyIElOICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpIElOICgodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSksICh0ZXh0QXNCbG9iKCcxJyksIHRleHRBc0Jsb2IoJzEnKSkpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgSU4gKCh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSksICh0ZXh0X2FzX2Jsb2IoJzEnKSwgdGV4dF9hc19ibG9iKCcxJykpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPiB0ZXh0QXNCbG9iKCcnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID4gdGV4dF9hc19ibG9iKCcnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignMScpIEFORCBjMiA+IHRleHRBc0Jsb2IoJycpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTkQgYzIgPiB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA+ICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRBc0Jsb2IoJzEnKSBBTkQgYzIgPj0gdGV4dEFzQmxvYignJyk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRfYXNfYmxvYignMScpIEFORCBjMiA+PSB0ZXh0X2FzX2Jsb2IoJycpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignMScpIEFORCBjMiA8PSB0ZXh0QXNCbG9iKCcnKTsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTkQgYzIgPD0gdGV4dF9hc19ibG9iKCcnKTsiKSk7CiAKLSAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPD0gKHRleHRBc0Jsb2IoJzEnKSwgdGV4dEFzQmxvYignJykpOyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA8PSAodGV4dF9hc19ibG9iKCcxJyksIHRleHRfYXNfYmxvYignJykpOyIpKTsKICAgICAgICAgfSk7CiAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKHBrLCBjMSwgYzIsIHYpIFZBTFVFUyAoPywgPywgPywgPykiLAogICAgICAgICAgICAgICAgIGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpOwogCiAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignJyk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRfYXNfYmxvYignJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpLCBieXRlcygiNCIpKSk7CiAKLSAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA9IHRleHRBc0Jsb2IoJycpIEFORCBjMiA9IHRleHRBc0Jsb2IoJzEnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcnKSBBTkQgYzIgPSB0ZXh0X2FzX2Jsb2IoJzEnKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID0gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPSAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjQiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgSU4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpIEFORCBjMiA9IHRleHRBc0Jsb2IoJzEnKTsiKSwKKyAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxIElOICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkgQU5EIGMyID0gdGV4dF9hc19ibG9iKCcxJyk7IiksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpLCBieXRlcygiNCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgSU4gKCh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSwgKHRleHRBc0Jsb2IoJzEnKSwgdGV4dEFzQmxvYignMScpKSk7IiksCisgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSBJTiAoKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSwgKHRleHRfYXNfYmxvYignMScpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBFTVBUWV9CWVRFX0JVRkZFUiwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjQiKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID4gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPj0gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPj0gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpLAogICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSkpOwogCi0gICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPD0gKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpOyIpLAorICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPD0gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKTsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA8ICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKTsiKSk7CisgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPCAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpOyIpKTsKICAgICAgICAgfSk7CiAgICAgfQogCkBAIC0yNzIyLDE3ICsyNzIyLDE3IEBACiAKICAgICAgICAgICAgIGJlZm9yZUFuZEFmdGVyRmx1c2goKCkgLT4gewogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPiB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+IHRleHRfYXNfYmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA+PSB0ZXh0X2FzX2Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIDwgdGV4dEFzQmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8IHRleHRfYXNfYmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSkpOworICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjIDw9IHRleHRfYXNfYmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpKTsKICAgICAgICAgICAgIH0pOwogCiAgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAocGssIGMsIHYpIFZBTFVFUyAoPywgPywgPykiLApAQCAtMjc0MCwyMiArMjc0MCwyMiBAQAogCiAgICAgICAgICAgICBiZWZvcmVBbmRBZnRlckZsdXNoKCgpIC0+IHsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjIElOICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyBJTiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjID4gdGV4dEFzQmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPiB0ZXh0X2FzX2Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dEFzQmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPj0gdGV4dF9hc19ibG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8IHRleHRBc0Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RW1wdHkoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMgPCB0ZXh0X2FzX2Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYyA8PSB0ZXh0X2FzX2Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiNCIpKSk7CiAgICAgICAgICAgICB9KTsKICAgICAgICAgfQpAQCAtMjc3NSwxOSArMjc3NSwxOSBAQAogCiAgICAgICAgICAgICBiZWZvcmVBbmRBZnRlckZsdXNoKCgpIC0+IHsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA+IHRleHRBc0Jsb2IoJycpIiArIG9yZGVyaW5nQ2xhdXNlKSwKKyAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSA+IHRleHRfYXNfYmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0QXNCbG9iKCcxJykgQU5EIGMyID4gdGV4dEFzQmxvYignJykiICsgb3JkZXJpbmdDbGF1c2UpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dF9hc19ibG9iKCcxJykgQU5EIGMyID4gdGV4dF9hc19ibG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA+ICh0ZXh0QXNCbG9iKCcnKSwgdGV4dEFzQmxvYignMScpKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIyIiksIGJ5dGVzKCIyIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjEiKSkpOwogCi0gICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dEFzQmxvYignZm9vMTIzJykgQU5EIGMxID0gdGV4dEFzQmxvYignMScpIEFORCBjMiA+PSB0ZXh0QXNCbG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgYzEgPSB0ZXh0X2FzX2Jsb2IoJzEnKSBBTkQgYzIgPj0gdGV4dF9hc19ibG9iKCcnKSIgKyBvcmRlcmluZ0NsYXVzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKICAgICAgICAgICAgIH0pOwpAQCAtMjc5NywxOSArMjc5NywxOSBAQAogCiAgICAgICAgICAgICBiZWZvcmVBbmRBZnRlckZsdXNoKCgpIC0+IHsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCBjMSBJTiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSkgQU5EIGMyID0gdGV4dEFzQmxvYignMScpIiArIG9yZGVyaW5nQ2xhdXNlKSwKKyAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0X2FzX2Jsb2IoJ2ZvbzEyMycpIEFORCBjMSBJTiAodGV4dF9hc19ibG9iKCcnKSwgdGV4dF9hc19ibG9iKCcxJykpIEFORCBjMiA9IHRleHRfYXNfYmxvYignMScpIiArIG9yZGVyaW5nQ2xhdXNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgRU1QVFlfQllURV9CVUZGRVIsIGJ5dGVzKCIxIiksIGJ5dGVzKCI0IikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSBJTiAoKHRleHRBc0Jsb2IoJycpLCB0ZXh0QXNCbG9iKCcxJykpLCAodGV4dEFzQmxvYignMScpLCB0ZXh0QXNCbG9iKCcxJykpKSIgKyBvcmRlcmluZ0NsYXVzZSksCisgICAgICAgICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gdGV4dF9hc19ibG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgSU4gKCh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSksICh0ZXh0X2FzX2Jsb2IoJzEnKSwgdGV4dF9hc19ibG9iKCcxJykpKSIgKyBvcmRlcmluZ0NsYXVzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpLCBieXRlcygiNCIpKSk7CiAKLSAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSB0ZXh0QXNCbG9iKCdmb28xMjMnKSBBTkQgKGMxLCBjMikgPiAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSkiICsgb3JkZXJpbmdDbGF1c2UpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID4gKHRleHRfYXNfYmxvYignJyksIHRleHRfYXNfYmxvYignMScpKSIgKyBvcmRlcmluZ0NsYXVzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMiIpLCBieXRlcygiMiIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIiksIGJ5dGVzKCIxIikpKTsKIAotICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRBc0Jsb2IoJ2ZvbzEyMycpIEFORCAoYzEsIGMyKSA+PSAodGV4dEFzQmxvYignJyksIHRleHRBc0Jsb2IoJzEnKSkiICsgb3JkZXJpbmdDbGF1c2UpLAorICAgICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IHRleHRfYXNfYmxvYignZm9vMTIzJykgQU5EIChjMSwgYzIpID49ICh0ZXh0X2FzX2Jsb2IoJycpLCB0ZXh0X2FzX2Jsb2IoJzEnKSkiICsgb3JkZXJpbmdDbGF1c2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KGJ5dGVzKCJmb28xMjMiKSwgYnl0ZXMoIjEiKSwgYnl0ZXMoIjIiKSwgYnl0ZXMoIjIiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3coYnl0ZXMoImZvbzEyMyIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpLCBieXRlcygiMSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyhieXRlcygiZm9vMTIzIiksIEVNUFRZX0JZVEVfQlVGRkVSLCBieXRlcygiMSIpLCBieXRlcygiNCIpKSk7CkBAIC0zMTkxLDQgKzMxOTEsNDAgQEAKICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGsxLCBrMikgVkFMVUVTICh1dWlkKCksICdrMicpIik7CiAgICAgICAgIGFzc2VydFJvd0NvdW50KGV4ZWN1dGUoIlNFTEVDVCBzeXN0ZW0udG9rZW4oazEsIGsyKSBGUk9NICVzIiksIDEpOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1b3RlZE1hcFRleHREYXRhKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAiICsgS0VZU1BBQ0UgKyAiLnQxIChpZCBpbnQsIGRhdGEgdGV4dCwgUFJJTUFSWSBLRVkgKGlkKSkiKTsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAiICsgS0VZU1BBQ0UgKyAiLnQyIChpZCBpbnQsIGRhdGEgbWFwPGludCwgdGV4dD4sIFBSSU1BUlkgS0VZIChpZCkpIik7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gIiArIEtFWVNQQUNFICsgIi50MSAoaWQsIGRhdGEpIFZBTFVFUyAoMSwgJ0knJ20gbmV3YicpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICIgKyBLRVlTUEFDRSArICIudDIgKGlkLCBkYXRhKSBWQUxVRVMgKDEsIHsxOidJJydtIG5ld2InfSkiKTsKKworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBkYXRhIEZST00gIiArIEtFWVNQQUNFICsgIi50MSIpLCByb3coIkknbSBuZXdiIikpOworICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoIlNFTEVDVCBkYXRhIEZST00gIiArIEtFWVNQQUNFICsgIi50MiIpLCByb3coIG1hcCgxLCAiSSdtIG5ld2IiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1b3RlZFNpbXBsZUNvbGxlY3Rpb25zRGF0YSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50MyAoaWQgaW50LCBzZXRfZGF0YSBzZXQ8dGV4dD4sIGxpc3RfZGF0YSBsaXN0PHRleHQ+LCB0dXBsZV9kYXRhIHR1cGxlPGludCwgdGV4dD4sIFBSSU1BUlkgS0VZIChpZCkpIik7CisKKyAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gIiArIEtFWVNQQUNFICsgIi50MyAoaWQsIHNldF9kYXRhLCBsaXN0X2RhdGEsIHR1cGxlX2RhdGEpIHZhbHVlcygxLCB7J0knJ20gbmV3Yid9LCBbJ0knJ20gbmV3YiddLCAoMSwgJ0knJ20gbmV3YicpKSIpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHNldF9kYXRhIEZST00gIiArIEtFWVNQQUNFICsgIi50MyIpLCByb3coc2V0KCJJJ20gbmV3YiIpKSk7CisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIGxpc3RfZGF0YSBGUk9NICIgKyBLRVlTUEFDRSArICIudDMiKSwgcm93KGxpc3QoIkknbSBuZXdiIikpKTsKKyAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKCJTRUxFQ1QgdHVwbGVfZGF0YSBGUk9NICIgKyBLRVlTUEFDRSArICIudDMiKSwgcm93KHR1cGxlKDEsICJJJ20gbmV3YiIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVvdGVkVURURGF0YSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVR5cGUoIkNSRUFURSBUWVBFICIgKyBLRVlTUEFDRSArICIucmFuZG9tIChkYXRhIHRleHQpIik7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgIiArIEtFWVNQQUNFICsgIi50NCAoaWQgaW50LCB1ZHRfZGF0YSBmcm96ZW48cmFuZG9tPiwgUFJJTUFSWSBLRVkgKGlkKSkiKTsKKworICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAiICsgS0VZU1BBQ0UgKyAiLnQ0IChpZCwgdWR0X2RhdGEpIHZhbHVlcygxLCB7ZGF0YTogJ0knJ20gbmV3Yid9KSIpOworCisgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZSgiU0VMRUNUIHVkdF9kYXRhIEZST00gIiArIEtFWVNQQUNFICsgIi50NCIpLCByb3codXNlclR5cGUoInJhbmRvbSIsICJJJ20gbmV3YiIpKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL1RUTFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9jcWwzL3ZhbGlkYXRpb24vb3BlcmF0aW9ucy9UVExUZXN0LmphdmEKaW5kZXggOWVmMjUyMC4uN2I2NmUzMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2NxbDMvdmFsaWRhdGlvbi9vcGVyYXRpb25zL1RUTFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvY3FsMy92YWxpZGF0aW9uL29wZXJhdGlvbnMvVFRMVGVzdC5qYXZhCkBAIC0yMSwxMiArMjEsMTEgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQXR0cmlidXRlczsKQEAgLTM2LDcgKzM1LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRXhwaXJhdGlvbkRhdGVPdmVyZmxvd0hhbmRsaW5nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQWJzdHJhY3RDZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkludmFsaWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSVNjcnViYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVJbnB1dFN0cmVhbVBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5TdGFuZGFsb25lU2NydWJiZXI7CkBAIC00NCw2ICs0Niw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lci5Ub29sUmVzdWx0OwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1Q7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKQEAgLTM3OSw3ICszODIsNyBAQAogCiAgICAgICAgIGlmIChydW5TY3J1YikKICAgICAgICAgewotICAgICAgICAgICAgY2ZzLnNjcnViKHRydWUsIGZhbHNlLCB0cnVlLCByZWluc2VydE92ZXJmbG93ZWRUVEwsIDEpOworICAgICAgICAgICAgY2ZzLnNjcnViKHRydWUsIElTY3J1YmJlci5vcHRpb25zKCkuY2hlY2tEYXRhKCkucmVpbnNlcnRPdmVyZmxvd2VkVFRMUm93cyhyZWluc2VydE92ZXJmbG93ZWRUVEwpLmJ1aWxkKCksIDEpOwogCiAgICAgICAgICAgICBpZiAocmVpbnNlcnRPdmVyZmxvd2VkVFRMKQogICAgICAgICAgICAgewpAQCAtNDAyLDkgKzQwNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHJ1blNTdGFibGVTY3J1YikKICAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlV0aWwuQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QsICJ0cnVlIik7IC8vIE5lY2Vzc2FyeSBmb3IgdGVzdGluZwotCi0gICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChURVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QsIHRydWUpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIFRvb2xSZXN1bHQgdG9vbDsKICAgICAgICAgICAgICAgICBpZiAocmVpbnNlcnRPdmVyZmxvd2VkVFRMKQpAQCAtNDE5LDEwICs0MjAsNiBAQAogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJObyB2YWxpZCBwYXJ0aXRpb25zIGZvdW5kIHdoaWxlIHNjcnViYmluZyIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlV0aWwuQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QpOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgdHJ5CkBAIC00NzUsNCArNDcyLDQgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcmV0dXJuIGNsdXN0ZXJpbmcgPyBDT01QTEVYX0NMVVNURVJJTkcgOiBDT01QTEVYX05PQ0xVU1RFUklORzsKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NlbGxUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2VsbFRlc3QuamF2YQppbmRleCA0MTAwYzU0Li4yNjBjZTk0IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2VsbFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2VsbFRlc3QuamF2YQpAQCAtNzYsNyArNzYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQobmFtZSwgZmFsc2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEuTk9fUE9TSVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEuS2luZC5SRUdVTEFSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YS5LaW5kLlJFR1VMQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nQm91bmRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ0JvdW5kVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGZjYzIwLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nQm91bmRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOwotCi1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIENsdXN0ZXJpbmdCb3VuZFRlc3QKLXsKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGFycmF5VG9wQW5kQm90dG9tKCkKLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5Q2x1c3RlcmluZ0JvdW5kLkJPVFRPTS5pc0JvdHRvbSgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKEFycmF5Q2x1c3RlcmluZ0JvdW5kLkJPVFRPTS5pc1RvcCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlDbHVzdGVyaW5nQm91bmQuVE9QLmlzVG9wKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQXJyYXlDbHVzdGVyaW5nQm91bmQuVE9QLmlzQm90dG9tKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgYnVmZmVyVG9wQW5kQm90dG9tKCkKLSAgICB7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5CT1RUT00uaXNCb3R0b20oKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShCdWZmZXJDbHVzdGVyaW5nQm91bmQuQk9UVE9NLmlzVG9wKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShCdWZmZXJDbHVzdGVyaW5nQm91bmQuVE9QLmlzVG9wKCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLlRPUC5pc0JvdHRvbSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ0hlYXBTaXplVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NsdXN0ZXJpbmdIZWFwU2l6ZVRlc3QuamF2YQppbmRleCBlOTdmMDY3Li4zYmE0YWU2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ0hlYXBTaXplVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nSGVhcFNpemVUZXN0LmphdmEKQEAgLTYxLDYgKzYxLDIyIEBACiAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChtaW4pLmlzTGVzc1RoYW5PckVxdWFsVG8obWF4KTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25DbHVzdGVyaW5nSGVhcFNpemUoKQorICAgIHsKKyAgICAgICAgQ2x1c3RlcmluZzw/PiBjbHVzdGVyaW5nID0gdGhpcy5jbHVzdGVyaW5nLmFjY2Vzc29yKCkuZmFjdG9yeSgpLnN0YXRpY0NsdXN0ZXJpbmcoKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGNsdXN0ZXJpbmcudW5zaGFyZWRIZWFwU2l6ZSgpKQorICAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbygwKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGNsdXN0ZXJpbmcudW5zaGFyZWRIZWFwU2l6ZUV4Y2x1ZGluZ0RhdGEoKSkKKyAgICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oMCk7CisKKyAgICAgICAgY2x1c3RlcmluZyA9IHRoaXMuY2x1c3RlcmluZy5hY2Nlc3NvcigpLmZhY3RvcnkoKS5jbHVzdGVyaW5nKCk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChjbHVzdGVyaW5nLnVuc2hhcmVkSGVhcFNpemUoKSkKKyAgICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oMCk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChjbHVzdGVyaW5nLnVuc2hhcmVkSGVhcFNpemVFeGNsdWRpbmdEYXRhKCkpCisgICAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKDApOworICAgIH0KKwogICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQogICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gZGF0YSgpIHsKICAgICAgICAgYnl0ZVtdIHJhd0J5dGVzID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2IH07CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ1ByZWZpeFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9DbHVzdGVyaW5nUHJlZml4VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOTViMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ2x1c3RlcmluZ1ByZWZpeFRlc3QuamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQXJyYXlBY2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVCdWZmZXJBY2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlZhbHVlQWNjZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5JbW1lZGlhdGVGdXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk1lbXRhYmxlUG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTmF0aXZlQWxsb2NhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5OYXRpdmVQb29sOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5TbGFiQWxsb2NhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5TbGFiUG9vbDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgQ2x1c3RlcmluZ1ByZWZpeFRlc3QKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFycmF5VG9wQW5kQm90dG9tKCkKKyAgICB7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKEFycmF5Q2x1c3RlcmluZ0JvdW5kLkJPVFRPTS5pc0JvdHRvbSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKEFycmF5Q2x1c3RlcmluZ0JvdW5kLkJPVFRPTS5pc1RvcCgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoQXJyYXlDbHVzdGVyaW5nQm91bmQuVE9QLmlzVG9wKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQXJyYXlDbHVzdGVyaW5nQm91bmQuVE9QLmlzQm90dG9tKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYnVmZmVyVG9wQW5kQm90dG9tKCkKKyAgICB7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5CT1RUT00uaXNCb3R0b20oKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShCdWZmZXJDbHVzdGVyaW5nQm91bmQuQk9UVE9NLmlzVG9wKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShCdWZmZXJDbHVzdGVyaW5nQm91bmQuVE9QLmlzVG9wKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLlRPUC5pc0JvdHRvbSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXRhaW5hYmxlQXJyYXkoKQorICAgIHsKKyAgICAgICAgdGVzdFJldGFpbmFibGUoQnl0ZUFycmF5QWNjZXNzb3IuaW5zdGFuY2UuZmFjdG9yeSgpLCB4IC0+IG5ldyBieXRlW11bXSB7eC5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KX0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJldGFpbmFibGVPbkhlYXAoKQorICAgIHsKKyAgICAgICAgdGVzdFJldGFpbmFibGUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLmZhY3RvcnkoKSwgeCAtPiBuZXcgQnl0ZUJ1ZmZlcltdIHtCeXRlQnVmZmVyVXRpbC5ieXRlcyh4KX0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJldGFpbmFibGVPbkhlYXBTbGljZWQoKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgcHJlcGVuZCA9IDA7IHByZXBlbmQgPCAzOyArK3ByZXBlbmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGFwcGVuZCA9IDA7IGFwcGVuZCA8IDM7ICsrYXBwZW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlc3RSZXRhaW5hYmxlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZS5mYWN0b3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2luZ0FsbG9jYXRvcihwcmVwZW5kLCBhcHBlbmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRnVuY3Rpb248U3RyaW5nLCBCeXRlQnVmZmVyW10+IHNsaWNpbmdBbGxvY2F0b3IoaW50IHByZXBlbmQsIGludCBhcHBlbmQpCisgICAgeworICAgICAgICByZXR1cm4geCAtPgorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGJ5dGVzID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoeCk7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHNsaWNlZCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoYnl0ZXMucmVtYWluaW5nKCkgKyBwcmVwZW5kICsgYXBwZW5kKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJlcGVuZDsgKytpKQorICAgICAgICAgICAgICAgIHNsaWNlZC5wdXQoKGJ5dGUpIFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKS5uZXh0SW50KCkpOworICAgICAgICAgICAgc2xpY2VkLnB1dChieXRlcyk7CisgICAgICAgICAgICBieXRlcy5mbGlwKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFwcGVuZDsgKytpKQorICAgICAgICAgICAgICAgIHNsaWNlZC5wdXQoKGJ5dGUpIFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKS5uZXh0SW50KCkpOworICAgICAgICAgICAgc2xpY2VkLnBvc2l0aW9uKHByZXBlbmQpLmxpbWl0KHByZXBlbmQgKyBieXRlcy5yZW1haW5pbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVCdWZmZXJbXXsgc2xpY2VkLnNsaWNlKCkgfTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXRhaW5hYmxlT2ZmSGVhcCgpCisgICAgeworICAgICAgICB0ZXN0UmV0YWluYWJsZShCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UuZmFjdG9yeSgpLCB4IC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgaCA9IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHgpOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2ID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChoLnJlbWFpbmluZygpKTsKKyAgICAgICAgICAgIHYucHV0KGgpOworICAgICAgICAgICAgdi5mbGlwKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVCdWZmZXJbXSB7dn07CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJldGFpbmFibGVPbkhlYXBTbGFiKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0UmV0YWluYWJsZVNsYWIodHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV0YWluYWJsZU9mZkhlYXBTbGFiKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0UmV0YWluYWJsZVNsYWIoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXRhaW5hYmxlU2xhYihib29sZWFuIG9uSGVhcCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICBNZW10YWJsZVBvb2wgcG9vbCA9IG5ldyBTbGFiUG9vbCgxTCA8PCAyNCwgb25IZWFwID8gMCA6IDFMIDw8IDI0LCAxLjBmLCAoKSAtPiBJbW1lZGlhdGVGdXR1cmUuc3VjY2VzcyhmYWxzZSkpOworICAgICAgICBTbGFiQWxsb2NhdG9yIGFsbG9jYXRvciA9ICgoU2xhYkFsbG9jYXRvcikgcG9vbC5uZXdBbGxvY2F0b3IoInRlc3QiKSk7CisgICAgICAgIGFzc2VydCAhYWxsb2NhdG9yLmFsbG9jYXRlKDEpLmlzRGlyZWN0KCkgPT0gb25IZWFwOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdFJldGFpbmFibGUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLmZhY3RvcnkoKSwgeCAtPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgaCA9IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHgpOworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdiA9IGFsbG9jYXRvci5hbGxvY2F0ZShoLnJlbWFpbmluZygpKTsKKyAgICAgICAgICAgICAgICB2LnB1dChoKTsKKyAgICAgICAgICAgICAgICB2LmZsaXAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVCdWZmZXJbXSB7dn07CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHBvb2wuc2h1dGRvd25BbmRXYWl0KDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJldGFpbmFibGVOYXRpdmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIE1lbXRhYmxlUG9vbCBwb29sID0gbmV3IE5hdGl2ZVBvb2woMUwgPDwgMjQsMUwgPDwgMjQsIDEuMGYsICgpIC0+IEltbWVkaWF0ZUZ1dHVyZS5zdWNjZXNzKGZhbHNlKSk7CisgICAgICAgIE5hdGl2ZUFsbG9jYXRvciBhbGxvY2F0b3IgPSAoTmF0aXZlQWxsb2NhdG9yKSBwb29sLm5ld0FsbG9jYXRvcigidGVzdCIpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdFJldGFpbmFibGUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLmZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT4gbmV3IEJ5dGVCdWZmZXJbXSB7Qnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoeCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtPiB4LmtpbmQoKSA9PSBDbHVzdGVyaW5nUHJlZml4LktpbmQuQ0xVU1RFUklORworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBOYXRpdmVDbHVzdGVyaW5nKGFsbG9jYXRvciwgbnVsbCwgKENsdXN0ZXJpbmc8Pz4pIHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBwb29sLnNodXRkb3duQW5kV2FpdCgxMCwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgPFY+IHZvaWQgdGVzdFJldGFpbmFibGUoVmFsdWVBY2Nlc3Nvci5PYmplY3RGYWN0b3J5PFY+IGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uPFN0cmluZywgVltdPiBhbGxvY2F0b3IpCisgICAgeworICAgICAgICB0ZXN0UmV0YWluYWJsZShmYWN0b3J5LCBhbGxvY2F0b3IsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyA8Vj4gdm9pZCB0ZXN0UmV0YWluYWJsZShWYWx1ZUFjY2Vzc29yLk9iamVjdEZhY3Rvcnk8Vj4gZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248U3RyaW5nLCBWW10+IGFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248Q2x1c3RlcmluZ1ByZWZpeDxWPiwgQ2x1c3RlcmluZ1ByZWZpeDxWPj4gbWFwcGVyKQorICAgIHsKKyAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeDxWPltdIGNsdXN0ZXJpbmdzID0gbmV3IENsdXN0ZXJpbmdQcmVmaXhbXQorICAgICAgICB7CisgICAgICAgICAgICBmYWN0b3J5LmNsdXN0ZXJpbmcoKSwKKyAgICAgICAgICAgIGZhY3Rvcnkuc3RhdGljQ2x1c3RlcmluZygpLAorICAgICAgICAgICAgZmFjdG9yeS5jbHVzdGVyaW5nKGFsbG9jYXRvci5hcHBseSgidGVzdCIpKSwKKyAgICAgICAgICAgIGZhY3RvcnkuYm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfU1RBUlRfQk9VTkQsIGFsbG9jYXRvci5hcHBseSgidGVzdEEiKSksCisgICAgICAgICAgICBmYWN0b3J5LmJvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX0VORF9CT1VORCwgYWxsb2NhdG9yLmFwcGx5KCJ0ZXN0QiIpKSwKKyAgICAgICAgICAgIGZhY3RvcnkuYm91bmQoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkVYQ0xfU1RBUlRfQk9VTkQsIGFsbG9jYXRvci5hcHBseSgidGVzdEMiKSksCisgICAgICAgICAgICBmYWN0b3J5LmJvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZC5FWENMX0VORF9CT1VORCwgYWxsb2NhdG9yLmFwcGx5KCJ0ZXN0RCIpKSwKKyAgICAgICAgICAgIGZhY3RvcnkuYm91bmRhcnkoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkVYQ0xfRU5EX0lOQ0xfU1RBUlRfQk9VTkRBUlksIGFsbG9jYXRvci5hcHBseSgidGVzdEUiKSksCisgICAgICAgICAgICBmYWN0b3J5LmJvdW5kYXJ5KENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX0VORF9FWENMX1NUQVJUX0JPVU5EQVJZLCBhbGxvY2F0b3IuYXBwbHkoInRlc3RGIikpLAorICAgICAgICB9OworCisgICAgICAgIGlmIChtYXBwZXIgIT0gbnVsbCkKKyAgICAgICAgICAgIGNsdXN0ZXJpbmdzID0gQXJyYXlzLnN0cmVhbShjbHVzdGVyaW5ncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChtYXBwZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KENsdXN0ZXJpbmdQcmVmaXhbXTo6bmV3KTsKKworICAgICAgICB0ZXN0UmV0YWluYWJsZShjbHVzdGVyaW5ncyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFJldGFpbmFibGUoQ2x1c3RlcmluZ1ByZWZpeDw/PltdIGNsdXN0ZXJpbmdzKQorICAgIHsKKyAgICAgICAgZm9yIChDbHVzdGVyaW5nUHJlZml4PD8+IGNsdXN0ZXJpbmcgOiBjbHVzdGVyaW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeDw/PiByZXRhaW5hYmxlID0gY2x1c3RlcmluZy5yZXRhaW5hYmxlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2x1c3RlcmluZywgcmV0YWluYWJsZSk7CisgICAgICAgICAgICBhc3NlcnRDbHVzdGVyaW5nSXNSZXRhaW5hYmxlKHJldGFpbmFibGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0Q2x1c3RlcmluZ0lzUmV0YWluYWJsZShDbHVzdGVyaW5nUHJlZml4PD8+IGNsdXN0ZXJpbmcpCisgICAgeworICAgICAgICBpZiAoY2x1c3RlcmluZyBpbnN0YW5jZW9mIEFic3RyYWN0QXJyYXlDbHVzdGVyaW5nUHJlZml4KQorICAgICAgICAgICAgcmV0dXJuOyAvLyBoYXMgdG8gYmUgb24taGVhcCBhbmQgbWluaW1pemVkCisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjbHVzdGVyaW5nIGluc3RhbmNlb2YgQWJzdHJhY3RCdWZmZXJDbHVzdGVyaW5nUHJlZml4KTsKKyAgICAgICAgQWJzdHJhY3RCdWZmZXJDbHVzdGVyaW5nUHJlZml4IGFiY2YgPSAoQWJzdHJhY3RCdWZmZXJDbHVzdGVyaW5nUHJlZml4KSBjbHVzdGVyaW5nOworICAgICAgICBCeXRlQnVmZmVyW10gYnVmZmVycyA9IGFiY2YuZ2V0QnVmZmVyQXJyYXkoKTsKKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGIgOiBidWZmZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShiLmlzRGlyZWN0KCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiLmhhc0FycmF5KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGIuY2FwYWNpdHkoKSwgYi5yZW1haW5pbmcoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYi5hcnJheU9mZnNldCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhiLmNhcGFjaXR5KCksIGIuYXJyYXkoKS5sZW5ndGgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvbHVtbkZhbWlseVN0b3JlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvbHVtbkZhbWlseVN0b3JlVGVzdC5qYXZhCmluZGV4IDRkODcxZmMuLjg4NTVjZWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5GYW1pbHlTdG9yZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ29sdW1uRmFtaWx5U3RvcmVUZXN0LmphdmEKQEAgLTYzLDggKzYzLDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXgudHJhbnNhY3Rpb25zLlVwZGF0ZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZWFkc0xpc3RlbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2NydWJUZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLkNsZWFyYWJsZUhpc3RvZ3JhbTsKQEAgLTIwMCw3ICsyMDIsNyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZVN0YW5kYXJkUm93U3RpY2tzQWZ0ZXJGbHVzaCgpIHRocm93cyBUaHJvd2FibGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlU3RhbmRhcmRSb3dTdGlja3NBZnRlckZsdXNoKCkKICAgICB7CiAgICAgICAgIC8vIHRlc3QgdG8gbWFrZSBzdXJlIGZsdXNoaW5nIGFmdGVyIGEgZGVsZXRlIGRvZXNuJ3QgcmVzdXJyZWN0IGRlbHRlZCBjb2xzLgogICAgICAgICBTdHJpbmcga2V5c3BhY2VOYW1lID0gS0VZU1BBQ0UxOwpAQCAtMjU4LDcgKzI2MCw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJFcGhlbWVyYWxTbmFwc2hvdHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyRXBoZW1lcmFsU25hcHNob3RzKCkKICAgICB7CiAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRl9JTkRFWDEpOwogCkBAIC0zNDcsOSArMzQ5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWVNQQUNFMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGX1NUQU5EQVJEMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVTU1RhYmxlLmRlc2NyaXB0b3IuaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlU1NUYWJsZS5kZXNjcmlwdG9yLmZvcm1hdFR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZVNTVGFibGUuZGVzY3JpcHRvci52ZXJzaW9uLmZvcm1hdCk7CiAgICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjIDogbGl2ZVNTVGFibGUuZ2V0Q29tcG9uZW50cygpKQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBmaW5kIGJhY2tlZC11cCBmaWxlOiIgKyBkZXNjLmZpbGVuYW1lRm9yKGMpLCBuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKGMpKS5leGlzdHMoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IGZpbmQgYmFja2VkLXVwIGZpbGU6IiArIGRlc2MuZmlsZUZvcihjKSwgZGVzYy5maWxlRm9yKGMpLmV4aXN0cygpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTc4LDggKzU4MCw4IEBACiAKICAgICAgICAgU2V0PFN0cmluZz4gb3JpZ2luYWxGaWxlcyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgSXRlcmFibGVzLnRvTGlzdChjZnMuY29uY2F0V2l0aEluZGV4ZXMoKSkuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgLmZsYXRNYXAoYyAtPiBjLmdldExpdmVTU1RhYmxlcygpLnN0cmVhbSgpLm1hcCh0IC0+IHQuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpKQotICAgICAgICAgICAgICAgICAuZm9yRWFjaChvcmlnaW5hbEZpbGVzOjphZGQpOworICAgICAgICAgICAgICAgICAuZmxhdE1hcChjIC0+IGMuZ2V0TGl2ZVNTVGFibGVzKCkuc3RyZWFtKCkubWFwKHQgLT4gdC5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKSkpCisgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGUgLT4gb3JpZ2luYWxGaWxlcy5hZGQoZS50b1N0cmluZygpKSk7CiAgICAgICAgIGFzc2VydFRoYXQob3JpZ2luYWxGaWxlcy5zdHJlYW0oKS5hbnlNYXRjaChmIC0+IGYuZW5kc1dpdGgoaW5kZXhUYWJsZUZpbGUpKSkuaXNUcnVlKCk7CiAgICAgICAgIGFzc2VydFRoYXQob3JpZ2luYWxGaWxlcy5zdHJlYW0oKS5hbnlNYXRjaChmIC0+IGYuZW5kc1dpdGgoYmFzZVRhYmxlRmlsZSkpKS5pc1RydWUoKTsKICAgICB9CkBAIC02NjcsOSArNjY5LDkgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzVGFibGVzLnNpemUoKSk7CiAgICAgICAgIFNTVGFibGVSZWFkZXIgc3NUYWJsZSA9IHNzVGFibGVzLml0ZXJhdG9yKCkubmV4dCgpOwogCi0gICAgICAgIFN0cmluZyBkYXRhRmlsZU5hbWUgPSBzc1RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpOwotICAgICAgICBTdHJpbmcgdG1wRGF0YUZpbGVOYW1lID0gc3NUYWJsZS5kZXNjcmlwdG9yLnRtcEZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKTsKLSAgICAgICAgbmV3IEZpbGUoZGF0YUZpbGVOYW1lKS50cnlNb3ZlKG5ldyBGaWxlKHRtcERhdGFGaWxlTmFtZSkpOworICAgICAgICBGaWxlIGRhdGFGaWxlID0gc3NUYWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKTsKKyAgICAgICAgRmlsZSB0bXBEYXRhRmlsZSA9IHNzVGFibGUuZGVzY3JpcHRvci50bXBGaWxlRm9yKENvbXBvbmVudHMuREFUQSk7CisgICAgICAgIGRhdGFGaWxlLnRyeU1vdmUodG1wRGF0YUZpbGUpOwogCiAgICAgICAgIHNzVGFibGUuc2VsZlJlZigpLnJlbGVhc2UoKTsKIApAQCAtNzAxLDYgKzcwMywxMTIgQEAKICAgICAgICAgewogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIHB1dChQYXJ0aXRpb25VcGRhdGUgdXBkYXRlLCBVcGRhdGVUcmFuc2FjdGlvbiBpbmRleGVyLCBHcm91cCBvcEdyb3VwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIHBhcnRpdGlvbkNvdW50KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRMaXZlRGF0YVNpemUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZE1lbW9yeVVzYWdlVG8oTWVtb3J5VXNhZ2UgdXNhZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgbWFya0V4dHJhT25IZWFwVXNlZChsb25nIGFkZGl0aW9uYWxTcGFjZSwgR3JvdXAgb3BHcm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtYXJrRXh0cmFPZmZIZWFwVXNlZChsb25nIGFkZGl0aW9uYWxTcGFjZSwgR3JvdXAgb3BHcm91cCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRmx1c2hhYmxlUGFydGl0aW9uU2V0PD8+IGdldEZsdXNoU2V0KFBhcnRpdGlvblBvc2l0aW9uIGZyb20sIFBhcnRpdGlvblBvc2l0aW9uIHRvKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN3aXRjaE91dChCYXJyaWVyIHdyaXRlQmFycmllciwgQXRvbWljUmVmZXJlbmNlPENvbW1pdExvZ1Bvc2l0aW9uPiBjb21taXRMb2dVcHBlckJvdW5kKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRpc2NhcmQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdHMoR3JvdXAgb3BHcm91cCwgQ29tbWl0TG9nUG9zaXRpb24gY29tbWl0TG9nUG9zaXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDb21taXRMb2dQb3NpdGlvbiBnZXRBcHByb3hpbWF0ZUNvbW1pdExvZ0xvd2VyQm91bmQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDb21taXRMb2dQb3NpdGlvbiBnZXRDb21taXRMb2dMb3dlckJvdW5kKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTGFzdENvbW1pdExvZ1Bvc2l0aW9uIGdldEZpbmFsQ29tbWl0TG9nVXBwZXJCb3VuZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbWF5Q29udGFpbkRhdGFCZWZvcmUoQ29tbWl0TG9nUG9zaXRpb24gcG9zaXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2xlYW4oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRTd2l0Y2goRmx1c2hSZWFzb24gcmVhc29uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBtZXRhZGF0YVVwZGF0ZWQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGxvY2FsUmFuZ2VzVXBkYXRlZCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcGVyZm9ybVNuYXBzaG90KFN0cmluZyBzbmFwc2hvdE5hbWUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByb3dJdGVyYXRvcihEZWNvcmF0ZWRLZXkga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZXMgc2xpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIgY29sdW1uRmlsdGVyLApAQCAtNzE2LDExMyArODI0LDYgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBzd2l0Y2hPdXQoQmFycmllciB3cml0ZUJhcnJpZXIsIEF0b21pY1JlZmVyZW5jZTxDb21taXRMb2dQb3NpdGlvbj4gY29tbWl0TG9nVXBwZXJCb3VuZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGRTd2l0Y2goRmx1c2hSZWFzb24gcmVhc29uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgbG9uZyBwdXQoUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSwgVXBkYXRlVHJhbnNhY3Rpb24gaW5kZXhlciwgR3JvdXAgb3BHcm91cCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwZXJmb3JtU25hcHNob3QoU3RyaW5nIHNuYXBzaG90TmFtZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgbG9uZyBwYXJ0aXRpb25Db3VudCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgbWV0YWRhdGFVcGRhdGVkKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXlDb250YWluRGF0YUJlZm9yZShDb21taXRMb2dQb3NpdGlvbiBwb3NpdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgbWFya0V4dHJhT25IZWFwVXNlZChsb25nIGFkZGl0aW9uYWxTcGFjZSwgR3JvdXAgb3BHcm91cCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtYXJrRXh0cmFPZmZIZWFwVXNlZChsb25nIGFkZGl0aW9uYWxTcGFjZSwgR3JvdXAgb3BHcm91cCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBsb2NhbFJhbmdlc1VwZGF0ZWQoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2xlYW4oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRMaXZlRGF0YVNpemUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBGbHVzaGFibGVQYXJ0aXRpb25TZXQ8Pz4gZ2V0Rmx1c2hTZXQoUGFydGl0aW9uUG9zaXRpb24gZnJvbSwgUGFydGl0aW9uUG9zaXRpb24gdG8pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBMYXN0Q29tbWl0TG9nUG9zaXRpb24gZ2V0RmluYWxDb21taXRMb2dVcHBlckJvdW5kKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWl0TG9nUG9zaXRpb24gZ2V0Q29tbWl0TG9nTG93ZXJCb3VuZCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1pdExvZ1Bvc2l0aW9uIGdldEFwcHJveGltYXRlQ29tbWl0TG9nTG93ZXJCb3VuZCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzY2FyZCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkTWVtb3J5VXNhZ2VUbyhNZW1vcnlVc2FnZSB1c2FnZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHRzKEdyb3VwIG9wR3JvdXAsIENvbW1pdExvZ1Bvc2l0aW9uIGNvbW1pdExvZ1Bvc2l0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvQ29sdW1uc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5zVGVzdC5qYXZhCmluZGV4IDM3ZWRjYmMuLjRjOGJjYzAgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5zVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db2x1bW5zVGVzdC5qYXZhCkBAIC00OTYsNyArNDk2LDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIENvbHVtbk1ldGFkYXRhIGRlZihTdHJpbmcgbmFtZSwgQWJzdHJhY3RUeXBlPD8+IHR5cGUsIENvbHVtbk1ldGFkYXRhLktpbmQga2luZCkKICAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoVEFCTEVfTUVUQURBVEEsIGJ5dGVzKG5hbWUpLCB0eXBlLCBDb2x1bW5NZXRhZGF0YS5OT19QT1NJVElPTiwga2luZCk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoVEFCTEVfTUVUQURBVEEsIGJ5dGVzKG5hbWUpLCB0eXBlLCBDb2x1bW5NZXRhZGF0YS5OT19QT1NJVElPTiwga2luZCwgbnVsbCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgVGFibGVNZXRhZGF0YSBtb2NrKENvbHVtbnMgY29sdW1ucykKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db3JydXB0UHJpbWFyeUluZGV4VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0NvcnJ1cHRQcmltYXJ5SW5kZXhUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5ZjlmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Db3JydXB0UHJpbWFyeUluZGV4VGVzdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5VbnR5cGVkUmVzdWx0U2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmZpbGVzeXN0ZW0uTGlzdGVuYWJsZUZpbGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGkuQnRpRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5OworCitwdWJsaWMgY2xhc3MgQ29ycnVwdFByaW1hcnlJbmRleFRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIuSW5NZW1vcnkKK3sKKyAgICBwcm90ZWN0ZWQgTGlzdGVuYWJsZUZpbGVTeXN0ZW0uUGF0aEZpbHRlciBpc0N1cnJlbnRUYWJsZUluZGV4RmlsZShTdHJpbmcga2V5c3BhY2UsIFN0cmluZyBlbmRzV2l0aCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXRoIC0+IHsKKyAgICAgICAgICAgIGlmICghcGF0aC5nZXRGaWxlTmFtZSgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoZW5kc1dpdGgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IERlc2NyaXB0b3IuZnJvbUZpbGUobmV3IEZpbGUocGF0aCkpOworICAgICAgICAgICAgaWYgKCFkZXNjLmtzbmFtZS5lcXVhbHMoa2V5c3BhY2UpICYmIGRlc2MuY2ZuYW1lLmVxdWFscyhjdXJyZW50VGFibGUoKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH07CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBiaWdQcmltYXJ5SW5kZXhEb2VzTm90RGV0ZWN0RGlza0NvcnJ1cHRpb24oKQorICAgIHsKKyAgICAgICAgLy8gU2V0IGxpc3RlbmVyIGVhcmx5LCBiZWZvcmUgdGhlIGZpbGUgaXMgb3BlbmVkOyBtbWFwIGFjY2VzcyBjYW4gbm90IGJlIGxpc3RlbmVkIHRvLCBzbyBuZWVkIHRvIG9ic2VydmUgdGhlIG9wZW4sIHdoaWNoIGhhcHBlbnMgb24gZmx1c2gKKyAgICAgICAgaWYgKEJpZ0Zvcm1hdC5pc1NlbGVjdGVkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZzLm9uUG9zdFJlYWQoaXNDdXJyZW50VGFibGVJbmRleEZpbGUoa2V5c3BhY2UoKSwgIkluZGV4LmRiIiksIChwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgZHN0LCByZWFkKSAtPiB7CisgICAgICAgICAgICAgICAgLy8gUmVhZGluZyB0aGUgUHJpbWFyeSBpbmRleCBmb3IgdGhlIHRlc3QhCisgICAgICAgICAgICAgICAgLy8gZm9ybWF0CisgICAgICAgICAgICAgICAgLy8gMiBieXRlczogbGVuZ3RoIG9mIGJ5dGVzIGZvciBQSworICAgICAgICAgICAgICAgIC8vIDQgYnl0ZXM6IHBrIGFzIGFuIGludDMyCisgICAgICAgICAgICAgICAgLy8gdmFyaWFibGUgYnl0ZXMgKHNlZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuUm93SW5kZXhFbnRyeS5JbmRleFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUob3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlRGF0YUlucHV0KSkKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KHBvc2l0aW9uKS5kZXNjcmliZWRBcygiVW5leHBlY3RlZCBhY2Nlc3MsIHNob3VsZCBzdGFydCByZWFkIGZyb20gc3RhcnQgb2YgZmlsZSIpLmlzRXF1YWxUbygwKTsKKworICAgICAgICAgICAgICAgIC8vIHNpbXVsYXRlIGJpdCByb3QgYnkgaGF2aW5nIDEgYnl0ZSBjaGFuZ2UuLi4gYnV0IG1ha2Ugc3VyZSBpdCdzIHRoZSBwayEKKyAgICAgICAgICAgICAgICBkc3QucHV0KDIsIEJ5dGUuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEJ0aUZvcm1hdC5pc1NlbGVjdGVkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZzLm9uUG9zdFJlYWQoaXNDdXJyZW50VGFibGVJbmRleEZpbGUoa2V5c3BhY2UoKSwgIlBhcnRpdGlvbnMuZGIiKSwgKHBhdGgsIGNoYW5uZWwsIHBvc2l0aW9uLCBkc3QsIHJlYWQpIC0+IHsKKyAgICAgICAgICAgICAgICAvLyBzaW11bGF0ZSBiaXQgcm90IGJ5IGhhdmluZyAxIGJ5dGUgY2hhbmdlLi4uCisgICAgICAgICAgICAgICAgLy8gZmlyc3QgcmVhZCBzaG91bGQgYmUgaW4gdGhlIGZvb3RlciAtLSBnaXZlIGl0IGFuIGludmFsaWQgcm9vdCBwb3NpdGlvbgorICAgICAgICAgICAgICAgIC8vIFRPRE86IENoYW5nZSB0aGlzIHRvIG1vZGlmeSBzb21ldGhpbmcgaW4gYSBtb3JlIHVuZGV0ZWN0YWJsZSBwb3NpdGlvbiBpbiB0aGUgZmlsZSB3aGVuIGNoZWNrc3VtbWluZyBpcyBpbXBsZW1lbnRlZAorICAgICAgICAgICAgICAgIGRzdC5wdXQoMiwgQnl0ZS5NQVhfVkFMVUUpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgVXRpbC50ZXN0TXVzdEJlSW1wbGVtZW50ZWRGb3JTU1RhYmxlRm9ybWF0KCk7CisKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoaWQgaW50IFBSSU1BUlkgS0VZLCB2YWx1ZSBpbnQpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChpZCwgdmFsdWUpIFZBTFVFUyAoPywgPykiLCAwLCAwKTsKKyAgICAgICAgZmx1c2goKTsKKworICAgICAgICBpZiAoQmlnRm9ybWF0LmlzU2VsZWN0ZWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9PyIsIDApOworICAgICAgICAgICAgLy8gdGhpcyBhc3NlcnQgY2hlY2sgaXMgaGVyZSB0byBnZXQgdGhlIHRlc3QgdG8gYmUgZ3JlZW4uLi4gaWYgdGhlIGZvcm1hdCBpcyBmaXhlZCBhbmQgdGhpcyBkYXRhIGxvc3MgaXMgbm90CisgICAgICAgICAgICAvLyBoYXBwZW5pbmcgYW55bW9yZSwgdGhlbiB0aGlzIGNoZWNrIHNob3VsZCBiZSB1cGRhdGVkCisgICAgICAgICAgICBhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gYXNzZXJ0Um93cyhycywgcm93KDAsIDApKSkuaGFzTWVzc2FnZSgiR290IGxlc3Mgcm93cyB0aGFuIGV4cGVjdGVkLiBFeHBlY3RlZCAxIGJ1dCBnb3QgMCIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgaWQ9PyIsIDApKS5pc0luc3RhbmNlT2YoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RpcmVjdG9yaWVzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0RpcmVjdG9yaWVzVGVzdC5qYXZhCmluZGV4IGM3MDE1MTYuLjcxYTQ5Y2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9EaXJlY3Rvcmllc1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGlyZWN0b3JpZXNUZXN0LmphdmEKQEAgLTE4LDggKzE4LDExIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTdG9yZTsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwogaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5GaWxlQXR0cmlidXRlVmlldzsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5GaWxlU3RvcmVBdHRyaWJ1dGVWaWV3OwogaW1wb3J0IGphdmEudGltZS5JbnN0YW50OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKQEAgLTMzLDE3ICszNiwxNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKLQogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtNTIsNyArNTUsNiBAQAogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIGltcG9ydCBvcmcuc2xmNGouTURDOwogLy8gT3VyIHZlcnNpb24gb2YgU2ZsNGogc2VlbXMgdG8gYmUgbWlzc2luZyB0aGUgTGlzdEFwcGVuZGVyIGNsYXNzLgpAQCAtNjMsNiArNjUsNyBAQAogaW1wb3J0IGNoLnFvcy5sb2diYWNrLmNsYXNzaWMuc3BpLklMb2dnaW5nRXZlbnQ7CiBpbXBvcnQgY2gucW9zLmxvZ2JhY2suY29yZS5yZWFkLkxpc3RBcHBlbmRlcjsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5BdXRoS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZy5EaXNrRmFpbHVyZVBvbGljeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwpAQCAtNzksNyArODIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2VxdWVuY2VCYXNlZFNTVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlVVSURCYXNlZFNTVGFibGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKQEAgLTExMCwxNSArMTEzLDI0IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJGYWtlVGFibGUiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNOQVBTSE9UMSA9ICJzbmFwc2hvdDEiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNOQVBTSE9UMiA9ICJzbmFwc2hvdDIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNOQVBTSE9UMyA9ICJzbmFwc2hvdDMiOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1NOQVBTSE9UX05BTUUgPSAiNDIiOworCisKICAgICBwcml2YXRlIHN0YXRpYyBGaWxlIHRlbXBEYXRhRGlyOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLUyA9ICJrcyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gVEFCTEVTOwogICAgIHByaXZhdGUgc3RhdGljIFNldDxUYWJsZU1ldGFkYXRhPiBDRk07CiAgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTGlzdDxGaWxlPj4gc3N0YWJsZXNCeVRhYmxlTmFtZTsKIAotICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcigwKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRENJRCA9ICJ0ZXN0LURpcmVjdG9yaWVzVGVzdC1pZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgQXRvbWljSW50ZWdlciBkaXlUaHJlYWRJZCA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOworICAgIHByaXZhdGUgaW50IG15RGl5SWQgPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyOworICAgIHByaXZhdGUgTGlzdEFwcGVuZGVyPElMb2dnaW5nRXZlbnQ+IGxpc3RBcHBlbmRlcjsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcgogICAgIHB1YmxpYyBTU1RhYmxlSWQuQnVpbGRlcjw/IGV4dGVuZHMgU1NUYWJsZUlkPiBpZEJ1aWxkZXI7CiAKICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMSkKQEAgLTEzMSwxMyArMTQzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBVVUlEQmFzZWRTU1RhYmxlSWQuQnVpbGRlci5pbnN0YW5jZSwgVXRpbC5uZXdVVUlER2VuKCkgfSk7CiAgICAgfQogCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTURDSUQgPSAidGVzdC1EaXJlY3Rvcmllc1Rlc3QtaWQiOwotICAgIHByaXZhdGUgc3RhdGljIEF0b21pY0ludGVnZXIgZGl5VGhyZWFkSWQgPSBuZXcgQXRvbWljSW50ZWdlcigxKTsKLSAgICBwcml2YXRlIGludCBteURpeUlkID0gLTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIGxvZ2dlcjsKLSAgICBwcml2YXRlIExpc3RBcHBlbmRlcjxJTG9nZ2luZ0V2ZW50PiBsaXN0QXBwZW5kZXI7Ci0KICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKQogICAgIHsKQEAgLTE3Miw3ICsxNzcsNyBAQAogICAgIEBBZnRlckNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGFmdGVyQ2xhc3MoKQogICAgIHsKLSAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVJlY3Vyc2l2ZSh0ZW1wRGF0YURpcik7CisgICAgICAgIHRlbXBEYXRhRGlyLmRlbGV0ZVJlY3Vyc2l2ZSgpOwogICAgIH0KIAogICAgIEBBZnRlcgpAQCAtMTg2LDE3ICsxOTEsNyBAQAogICAgICAgICByZXR1cm4gbmV3IERhdGFEaXJlY3RvcnlbXSB7IG5ldyBEYXRhRGlyZWN0b3J5KGxvY2F0aW9uKSB9OwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIERhdGFEaXJlY3RvcnlbXSB0b0RhdGFEaXJlY3RvcmllcyhGaWxlW10gbG9jYXRpb25zKQotICAgIHsKLSAgICAgICAgRGF0YURpcmVjdG9yeVtdIGRpcnMgPSBuZXcgRGF0YURpcmVjdG9yeVtsb2NhdGlvbnMubGVuZ3RoXTsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpPGxvY2F0aW9ucy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZGlyc1tpXSA9IG5ldyBEYXRhRGlyZWN0b3J5KGxvY2F0aW9uc1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRpcnM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RGaWxlcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RmlsZXMoKQogICAgIHsKICAgICAgICAgZm9yIChUYWJsZU1ldGFkYXRhIGNmbSA6IENGTSkKICAgICAgICAgewpAQCAtMjE4LDI1ICsyMTMsMjcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGNsYXNzIEZha2VTbmFwc2hvdCB7CisgICAgc3RhdGljIGNsYXNzIEZha2VTbmFwc2hvdCB7CiAgICAgICAgIGZpbmFsIFRhYmxlTWV0YWRhdGEgdGFibGU7CiAgICAgICAgIGZpbmFsIFN0cmluZyB0YWc7CiAgICAgICAgIGZpbmFsIEZpbGUgc25hcHNob3REaXI7CiAgICAgICAgIGZpbmFsIFNuYXBzaG90TWFuaWZlc3QgbWFuaWZlc3Q7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZXBoZW1lcmFsOwogCi0gICAgICAgIEZha2VTbmFwc2hvdChUYWJsZU1ldGFkYXRhIHRhYmxlLCBTdHJpbmcgdGFnLCBGaWxlIHNuYXBzaG90RGlyLCBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0KQorICAgICAgICBGYWtlU25hcHNob3QoVGFibGVNZXRhZGF0YSB0YWJsZSwgU3RyaW5nIHRhZywgRmlsZSBzbmFwc2hvdERpciwgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCwgYm9vbGVhbiBlcGhlbWVyYWwpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRoaXMudGFibGUgPSB0YWJsZTsKICAgICAgICAgICAgIHRoaXMudGFnID0gdGFnOwogICAgICAgICAgICAgdGhpcy5zbmFwc2hvdERpciA9IHNuYXBzaG90RGlyOwogICAgICAgICAgICAgdGhpcy5tYW5pZmVzdCA9IG1hbmlmZXN0OworICAgICAgICAgICAgdGhpcy5lcGhlbWVyYWwgPSBlcGhlbWVyYWw7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgVGFibGVTbmFwc2hvdCBhc1RhYmxlU25hcHNob3QoKQogICAgICAgICB7CiAgICAgICAgICAgICBJbnN0YW50IGNyZWF0ZWRBdCA9IG1hbmlmZXN0ID09IG51bGwgPyBudWxsIDogbWFuaWZlc3QuY3JlYXRlZEF0OwogICAgICAgICAgICAgSW5zdGFudCBleHBpcmVzQXQgPSBtYW5pZmVzdCA9PSBudWxsID8gbnVsbCA6IG1hbmlmZXN0LmV4cGlyZXNBdDsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGFibGVTbmFwc2hvdCh0YWJsZS5rZXlzcGFjZSwgdGFibGUubmFtZSwgdGFibGUuaWQuYXNVVUlEKCksIHRhZywgY3JlYXRlZEF0LCBleHBpcmVzQXQsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihzbmFwc2hvdERpcikpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVNuYXBzaG90KHRhYmxlLmtleXNwYWNlLCB0YWJsZS5uYW1lLCB0YWJsZS5pZC5hc1VVSUQoKSwgdGFnLCBjcmVhdGVkQXQsIGV4cGlyZXNBdCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHNuYXBzaG90RGlyKSwgZXBoZW1lcmFsKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjQ4LDM5ICsyNDUsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICB9CiAKLSAgICBwdWJsaWMgRmFrZVNuYXBzaG90IGNyZWF0ZUZha2VTbmFwc2hvdChUYWJsZU1ldGFkYXRhIHRhYmxlLCBTdHJpbmcgdGFnLCBib29sZWFuIGNyZWF0ZU1hbmlmZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgRmFrZVNuYXBzaG90IGNyZWF0ZUZha2VTbmFwc2hvdChUYWJsZU1ldGFkYXRhIHRhYmxlLCBTdHJpbmcgdGFnLCBib29sZWFuIGNyZWF0ZU1hbmlmZXN0LCBib29sZWFuIGVwaGVtZXJhbCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBGaWxlIHRhYmxlRGlyID0gY2ZEaXIodGFibGUpOwogICAgICAgICB0YWJsZURpci50cnlDcmVhdGVEaXJlY3RvcmllcygpOwogICAgICAgICBGaWxlIHNuYXBzaG90RGlyID0gbmV3IEZpbGUodGFibGVEaXIsIERpcmVjdG9yaWVzLlNOQVBTSE9UX1NVQkRJUiArIEZpbGUucGF0aFNlcGFyYXRvcigpICsgdGFnKTsKICAgICAgICAgc25hcHNob3REaXIudHJ5Q3JlYXRlRGlyZWN0b3JpZXMoKTsKIAotICAgICAgICBEZXNjcmlwdG9yIHNzdGFibGVEZXNjID0gbmV3IERlc2NyaXB0b3Ioc25hcHNob3REaXIsIEtTLCB0YWJsZS5uYW1lLCBzc3RhYmxlSWQoMSksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOworICAgICAgICBEZXNjcmlwdG9yIHNzdGFibGVEZXNjID0gbmV3IERlc2NyaXB0b3Ioc25hcHNob3REaXIsIEtTLCB0YWJsZS5uYW1lLCBzc3RhYmxlSWQoMSksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CiAgICAgICAgIGNyZWF0ZUZha2VTU1RhYmxlKHNzdGFibGVEZXNjKTsKIAogICAgICAgICBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0ID0gbnVsbDsKICAgICAgICAgaWYgKGNyZWF0ZU1hbmlmZXN0KQogICAgICAgICB7CiAgICAgICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IERpcmVjdG9yaWVzLmdldFNuYXBzaG90TWFuaWZlc3RGaWxlKHNuYXBzaG90RGlyKTsKLSAgICAgICAgICAgIG1hbmlmZXN0ID0gbmV3IFNuYXBzaG90TWFuaWZlc3QoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzc3RhYmxlRGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpLCBuZXcgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZCgiMW0iKSwgbm93KCkpOworICAgICAgICAgICAgbWFuaWZlc3QgPSBuZXcgU25hcHNob3RNYW5pZmVzdChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdGFibGVEZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKS5hYnNvbHV0ZVBhdGgoKSksIG5ldyBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kKCIxbSIpLCBub3coKSwgZXBoZW1lcmFsKTsKICAgICAgICAgICAgIG1hbmlmZXN0LnNlcmlhbGl6ZVRvSnNvbkZpbGUobWFuaWZlc3RGaWxlKTsKICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlcGhlbWVyYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVzLmNyZWF0ZUZpbGUoc25hcHNob3REaXIudG9QYXRoKCkucmVzb2x2ZSgiZXBoZW1lcmFsLnNuYXBzaG90IikpOworICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIG5ldyBGYWtlU25hcHNob3QodGFibGUsIHRhZywgc25hcHNob3REaXIsIG1hbmlmZXN0KTsKKyAgICAgICAgcmV0dXJuIG5ldyBGYWtlU25hcHNob3QodGFibGUsIHRhZywgc25hcHNob3REaXIsIG1hbmlmZXN0LCBlcGhlbWVyYWwpOwogICAgIH0KIAogICAgIHByaXZhdGUgTGlzdDxGaWxlPiBjcmVhdGVGYWtlU1NUYWJsZShGaWxlIGRpciwgU3RyaW5nIGNmLCBpbnQgZ2VuKQogICAgIHsKLSAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3IoZGlyLCBLUywgY2YsIHNzdGFibGVJZChnZW4pLCBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKTsKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3IoZGlyLCBLUywgY2YsIHNzdGFibGVJZChnZW4pLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpOwogICAgICAgICByZXR1cm4gY3JlYXRlRmFrZVNTVGFibGUoZGVzYyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBMaXN0PEZpbGU+IGNyZWF0ZUZha2VTU1RhYmxlKERlc2NyaXB0b3IgZGVzYykKICAgICB7CiAgICAgICAgIExpc3Q8RmlsZT4gY29tcG9uZW50cyA9IG5ldyBBcnJheUxpc3Q8PigzKTsKLSAgICAgICAgZm9yIChDb21wb25lbnQgYyA6IG5ldyBDb21wb25lbnRbXXsgQ29tcG9uZW50LkRBVEEsIENvbXBvbmVudC5QUklNQVJZX0lOREVYLCBDb21wb25lbnQuRklMVEVSIH0pCisgICAgICAgIGZvciAoQ29tcG9uZW50IGMgOiBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkudXBsb2FkQ29tcG9uZW50cygpKQogICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKGMpKTsKKyAgICAgICAgICAgIEZpbGUgZiA9IGRlc2MuZmlsZUZvcihjKTsKICAgICAgICAgICAgIGYuY3JlYXRlRmlsZUlmTm90RXhpc3RzKCk7CiAgICAgICAgICAgICBjb21wb25lbnRzLmFkZChmKTsKICAgICAgICAgfQpAQCAtMzA2LDE0ICszMDcsMTQgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZERpcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmREaXJzKCkKICAgICB7CiAgICAgICAgIGZvciAoVGFibGVNZXRhZGF0YSBjZm0gOiBDRk0pCiAgICAgICAgIHsKICAgICAgICAgICAgIERpcmVjdG9yaWVzIGRpcmVjdG9yaWVzID0gbmV3IERpcmVjdG9yaWVzKGNmbSwgdG9EYXRhRGlyZWN0b3JpZXModGVtcERhdGFEaXIpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjZkRpcihjZm0pLCBkaXJlY3Rvcmllcy5nZXREaXJlY3RvcnlGb3JOZXdTU1RhYmxlcygpKTsKIAotICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3IoY2ZEaXIoY2ZtKSwgS1MsIGNmbS5uYW1lLCBzc3RhYmxlSWQoMSksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOworICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3IoY2ZEaXIoY2ZtKSwgS1MsIGNmbS5uYW1lLCBzc3RhYmxlSWQoMSksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CiAgICAgICAgICAgICBGaWxlIHNuYXBzaG90RGlyID0gbmV3IEZpbGUoY2ZEaXIoY2ZtKSwgRmlsZS5wYXRoU2VwYXJhdG9yKCkgKyBEaXJlY3Rvcmllcy5TTkFQU0hPVF9TVUJESVIgKyBGaWxlLnBhdGhTZXBhcmF0b3IoKSArIExFR0FDWV9TTkFQU0hPVF9OQU1FKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhzbmFwc2hvdERpci50b0Nhbm9uaWNhbCgpLCBEaXJlY3Rvcmllcy5nZXRTbmFwc2hvdERpcmVjdG9yeShkZXNjLCBMRUdBQ1lfU05BUFNIT1RfTkFNRSkpOwogCkBAIC0zMzMsMjIgKzMzNCwyNyBAQAogICAgICAgICBhc3NlcnRUaGF0KGRpcmVjdG9yaWVzLmxpc3RTbmFwc2hvdHMoKSkuaXNFbXB0eSgpOwogCiAgICAgICAgIC8vIENyZWF0ZSBzbmFwc2hvdCB3aXRoIGFuZCB3aXRob3V0IG1hbmlmZXN0Ci0gICAgICAgIEZha2VTbmFwc2hvdCBzbmFwc2hvdDEgPSBjcmVhdGVGYWtlU25hcHNob3QoZmFrZVRhYmxlLCBTTkFQU0hPVDEsIHRydWUpOwotICAgICAgICBGYWtlU25hcHNob3Qgc25hcHNob3QyID0gY3JlYXRlRmFrZVNuYXBzaG90KGZha2VUYWJsZSwgU05BUFNIT1QyLCBmYWxzZSk7CisgICAgICAgIEZha2VTbmFwc2hvdCBzbmFwc2hvdDEgPSBjcmVhdGVGYWtlU25hcHNob3QoZmFrZVRhYmxlLCBTTkFQU0hPVDEsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgRmFrZVNuYXBzaG90IHNuYXBzaG90MiA9IGNyZWF0ZUZha2VTbmFwc2hvdChmYWtlVGFibGUsIFNOQVBTSE9UMiwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgLy8gZXBoZW1lcmFsIHdpdGhvdXQgbWFuaWZzdAorICAgICAgICBGYWtlU25hcHNob3Qgc25hcHNob3QzID0gY3JlYXRlRmFrZVNuYXBzaG90KGZha2VUYWJsZSwgU05BUFNIT1QzLCBmYWxzZSwgdHJ1ZSk7CiAKICAgICAgICAgLy8gQm90aCBzbmFwc2hvdHMgc2hvdWxkIGJlIHByZXNlbnQKICAgICAgICAgTWFwPFN0cmluZywgVGFibGVTbmFwc2hvdD4gc25hcHNob3RzID0gZGlyZWN0b3JpZXMubGlzdFNuYXBzaG90cygpOwotICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cy5rZXlTZXQoKSkuaXNFcXVhbFRvKFNldHMubmV3SGFzaFNldChTTkFQU0hPVDEsIFNOQVBTSE9UMikpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cy5rZXlTZXQoKSkuaXNFcXVhbFRvKFNldHMubmV3SGFzaFNldChTTkFQU0hPVDEsIFNOQVBTSE9UMiwgU05BUFNIT1QzKSk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzLmdldChTTkFQU0hPVDEpKS5pc0VxdWFsVG8oc25hcHNob3QxLmFzVGFibGVTbmFwc2hvdCgpKTsKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMuZ2V0KFNOQVBTSE9UMikpLmlzRXF1YWxUbyhzbmFwc2hvdDIuYXNUYWJsZVNuYXBzaG90KCkpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cy5nZXQoU05BUFNIT1QzKSkuaXNFcXVhbFRvKHNuYXBzaG90My5hc1RhYmxlU25hcHNob3QoKSk7CiAKICAgICAgICAgLy8gTm93IHJlbW92ZSBzbmFwc2hvdDEKLSAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVJlY3Vyc2l2ZShzbmFwc2hvdDEuc25hcHNob3REaXIpOworICAgICAgICBzbmFwc2hvdDEuc25hcHNob3REaXIuZGVsZXRlUmVjdXJzaXZlKCk7CiAKLSAgICAgICAgLy8gT25seSBzbmFwc2hvdCAyIHNob3VsZCBiZSBwcmVzZW50CisgICAgICAgIC8vIE9ubHkgc25hcHNob3QgMiBhbmQgMyBzaG91bGQgYmUgcHJlc2VudAogICAgICAgICBzbmFwc2hvdHMgPSBkaXJlY3Rvcmllcy5saXN0U25hcHNob3RzKCk7Ci0gICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzLmtleVNldCgpKS5pc0VxdWFsVG8oU2V0cy5uZXdIYXNoU2V0KFNOQVBTSE9UMikpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cy5rZXlTZXQoKSkuaXNFcXVhbFRvKFNldHMubmV3SGFzaFNldChTTkFQU0hPVDIsIFNOQVBTSE9UMykpOwogICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cy5nZXQoU05BUFNIT1QyKSkuaXNFcXVhbFRvKHNuYXBzaG90Mi5hc1RhYmxlU25hcHNob3QoKSk7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzLmdldChTTkFQU0hPVDMpKS5pc0VxdWFsVG8oc25hcHNob3QzLmFzVGFibGVTbmFwc2hvdCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMuZ2V0KFNOQVBTSE9UMykuaXNFcGhlbWVyYWwoKSkuaXNUcnVlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTM1OSwyMSArMzY1LDIzIEBACiAgICAgICAgIGFzc2VydFRoYXQoZGlyZWN0b3JpZXMubGlzdFNuYXBzaG90RGlyc0J5VGFnKCkpLmlzRW1wdHkoKTsKIAogICAgICAgICAvLyBDcmVhdGUgc25hcHNob3Qgd2l0aCBhbmQgd2l0aG91dCBtYW5pZmVzdAotICAgICAgICBGYWtlU25hcHNob3Qgc25hcHNob3QxID0gY3JlYXRlRmFrZVNuYXBzaG90KGZha2VUYWJsZSwgU05BUFNIT1QxLCB0cnVlKTsKLSAgICAgICAgRmFrZVNuYXBzaG90IHNuYXBzaG90MiA9IGNyZWF0ZUZha2VTbmFwc2hvdChmYWtlVGFibGUsIFNOQVBTSE9UMiwgZmFsc2UpOworICAgICAgICBGYWtlU25hcHNob3Qgc25hcHNob3QxID0gY3JlYXRlRmFrZVNuYXBzaG90KGZha2VUYWJsZSwgU05BUFNIT1QxLCB0cnVlLCBmYWxzZSk7CisgICAgICAgIEZha2VTbmFwc2hvdCBzbmFwc2hvdDIgPSBjcmVhdGVGYWtlU25hcHNob3QoZmFrZVRhYmxlLCBTTkFQU0hPVDIsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIEZha2VTbmFwc2hvdCBzbmFwc2hvdDMgPSBjcmVhdGVGYWtlU25hcHNob3QoZmFrZVRhYmxlLCBTTkFQU0hPVDMsIGZhbHNlLCB0cnVlKTsKIAogICAgICAgICAvLyBCb3RoIHNuYXBzaG90cyBzaG91bGQgYmUgcHJlc2VudAogICAgICAgICBNYXA8U3RyaW5nLCBTZXQ8RmlsZT4+IHNuYXBzaG90RGlycyA9IGRpcmVjdG9yaWVzLmxpc3RTbmFwc2hvdERpcnNCeVRhZygpOwotICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90RGlycy5rZXlTZXQoKSkuaXNFcXVhbFRvKFNldHMubmV3SGFzaFNldChTTkFQU0hPVDEsIFNOQVBTSE9UMikpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90RGlycy5rZXlTZXQoKSkuaXNFcXVhbFRvKFNldHMubmV3SGFzaFNldChTTkFQU0hPVDEsIFNOQVBTSE9UMiwgU05BUFNIT1QzKSk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3REaXJzLmdldChTTkFQU0hPVDEpKS5hbGxNYXRjaChzbmFwc2hvdERpciAtPiBzbmFwc2hvdERpci5lcXVhbHMoc25hcHNob3QxLnNuYXBzaG90RGlyKSk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3REaXJzLmdldChTTkFQU0hPVDIpKS5hbGxNYXRjaChzbmFwc2hvdERpciAtPiBzbmFwc2hvdERpci5lcXVhbHMoc25hcHNob3QyLnNuYXBzaG90RGlyKSk7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3REaXJzLmdldChTTkFQU0hPVDMpKS5hbGxNYXRjaChzbmFwc2hvdERpciAtPiBzbmFwc2hvdERpci5lcXVhbHMoc25hcHNob3QzLnNuYXBzaG90RGlyKSk7CiAKICAgICAgICAgLy8gTm93IHJlbW92ZSBzbmFwc2hvdDEKLSAgICAgICAgRmlsZVV0aWxzLmRlbGV0ZVJlY3Vyc2l2ZShzbmFwc2hvdDEuc25hcHNob3REaXIpOworICAgICAgICBzbmFwc2hvdDEuc25hcHNob3REaXIuZGVsZXRlUmVjdXJzaXZlKCk7CiAKLSAgICAgICAgLy8gT25seSBzbmFwc2hvdCAyIHNob3VsZCBiZSBwcmVzZW50CisgICAgICAgIC8vIE9ubHkgc25hcHNob3QgMiBhbmQgMyBzaG91bGQgYmUgcHJlc2VudAogICAgICAgICBzbmFwc2hvdERpcnMgPSBkaXJlY3Rvcmllcy5saXN0U25hcHNob3REaXJzQnlUYWcoKTsKLSAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdERpcnMua2V5U2V0KCkpLmlzRXF1YWxUbyhTZXRzLm5ld0hhc2hTZXQoU05BUFNIT1QyKSk7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3REaXJzLmtleVNldCgpKS5pc0VxdWFsVG8oU2V0cy5uZXdIYXNoU2V0KFNOQVBTSE9UMiwgU05BUFNIT1QzKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTM4Miw3ICszOTAsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmcgdGFnID0gInRlc3QiOwogICAgICAgICAgICAgRGlyZWN0b3JpZXMgZGlyZWN0b3JpZXMgPSBuZXcgRGlyZWN0b3JpZXMoY2ZtLCB0b0RhdGFEaXJlY3Rvcmllcyh0ZW1wRGF0YURpcikpOwotICAgICAgICAgICAgRGVzY3JpcHRvciBwYXJlbnREZXNjID0gbmV3IERlc2NyaXB0b3IoZGlyZWN0b3JpZXMuZ2V0RGlyZWN0b3J5Rm9yTmV3U1NUYWJsZXMoKSwgS1MsIGNmbS5uYW1lLCBzc3RhYmxlSWQoMCksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOworICAgICAgICAgICAgRGVzY3JpcHRvciBwYXJlbnREZXNjID0gbmV3IERlc2NyaXB0b3IoZGlyZWN0b3JpZXMuZ2V0RGlyZWN0b3J5Rm9yTmV3U1NUYWJsZXMoKSwgS1MsIGNmbS5uYW1lLCBzc3RhYmxlSWQoMCksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CiAgICAgICAgICAgICBGaWxlIHBhcmVudFNuYXBzaG90RGlyZWN0b3J5ID0gRGlyZWN0b3JpZXMuZ2V0U25hcHNob3REaXJlY3RvcnkocGFyZW50RGVzYywgdGFnKTsKIAogICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGZpbGVzID0gbmV3IExpbmtlZExpc3Q8PigpOwpAQCAtMzkwLDcgKzM5OCw3IEBACiAKICAgICAgICAgICAgIEZpbGUgbWFuaWZlc3RGaWxlID0gZGlyZWN0b3JpZXMuZ2V0U25hcHNob3RNYW5pZmVzdEZpbGUodGFnKTsKIAotICAgICAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBTbmFwc2hvdE1hbmlmZXN0KGZpbGVzLCBuZXcgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZCgiMW0iKSwgbm93KCkpOworICAgICAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBTbmFwc2hvdE1hbmlmZXN0KGZpbGVzLCBuZXcgRHVyYXRpb25TcGVjLkludFNlY29uZHNCb3VuZCgiMW0iKSwgbm93KCksIGZhbHNlKTsKICAgICAgICAgICAgIG1hbmlmZXN0LnNlcmlhbGl6ZVRvSnNvbkZpbGUobWFuaWZlc3RGaWxlKTsKIAogICAgICAgICAgICAgU2V0PEZpbGU+IGRpcnMgPSBuZXcgSGFzaFNldDw+KCk7CkBAIC00MjksOCArNDM3LDggQEAKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmRGlyKElOREVYX0NGTSksIGRpcik7CiAgICAgICAgIH0KLSAgICAgICAgRGVzY3JpcHRvciBwYXJlbnREZXNjID0gbmV3IERlc2NyaXB0b3IocGFyZW50RGlyZWN0b3JpZXMuZ2V0RGlyZWN0b3J5Rm9yTmV3U1NUYWJsZXMoKSwgS1MsIFBBUkVOVF9DRk0ubmFtZSwgc3N0YWJsZUlkKDApLCBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKTsKLSAgICAgICAgRGVzY3JpcHRvciBpbmRleERlc2MgPSBuZXcgRGVzY3JpcHRvcihpbmRleERpcmVjdG9yaWVzLmdldERpcmVjdG9yeUZvck5ld1NTVGFibGVzKCksIEtTLCBJTkRFWF9DRk0ubmFtZSwgc3N0YWJsZUlkKDApLCBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKTsKKyAgICAgICAgRGVzY3JpcHRvciBwYXJlbnREZXNjID0gbmV3IERlc2NyaXB0b3IocGFyZW50RGlyZWN0b3JpZXMuZ2V0RGlyZWN0b3J5Rm9yTmV3U1NUYWJsZXMoKSwgS1MsIFBBUkVOVF9DRk0ubmFtZSwgc3N0YWJsZUlkKDApLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpOworICAgICAgICBEZXNjcmlwdG9yIGluZGV4RGVzYyA9IG5ldyBEZXNjcmlwdG9yKGluZGV4RGlyZWN0b3JpZXMuZ2V0RGlyZWN0b3J5Rm9yTmV3U1NUYWJsZXMoKSwgS1MsIElOREVYX0NGTS5uYW1lLCBzc3RhYmxlSWQoMCksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CiAKICAgICAgICAgLy8gc25hcHNob3QgZGlyIHNob3VsZCBiZSBjcmVhdGVkIHVuZGVyIGl0cyBwYXJlbnQncwogICAgICAgICBGaWxlIHBhcmVudFNuYXBzaG90RGlyZWN0b3J5ID0gRGlyZWN0b3JpZXMuZ2V0U25hcHNob3REaXJlY3RvcnkocGFyZW50RGVzYywgInRlc3QiKTsKQEAgLTQ0MywxMCArNDUxLDEwIEBACiAgICAgICAgIGFzc2VydFRydWUoaW5kZXhEaXJlY3Rvcmllcy5zbmFwc2hvdEV4aXN0cygidGVzdCIpKTsKIAogICAgICAgICAvLyBjaGVjayB0cnVlIHNuYXBzaG90IHNpemUKLSAgICAgICAgRGVzY3JpcHRvciBwYXJlbnRTbmFwc2hvdCA9IG5ldyBEZXNjcmlwdG9yKHBhcmVudFNuYXBzaG90RGlyZWN0b3J5LCBLUywgUEFSRU5UX0NGTS5uYW1lLCBzc3RhYmxlSWQoMCksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOwotICAgICAgICBjcmVhdGVGaWxlKHBhcmVudFNuYXBzaG90LmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSwgMzApOwotICAgICAgICBEZXNjcmlwdG9yIGluZGV4U25hcHNob3QgPSBuZXcgRGVzY3JpcHRvcihpbmRleFNuYXBzaG90RGlyZWN0b3J5LCBLUywgSU5ERVhfQ0ZNLm5hbWUsIHNzdGFibGVJZCgwKSwgU1NUYWJsZUZvcm1hdC5UeXBlLkJJRyk7Ci0gICAgICAgIGNyZWF0ZUZpbGUoaW5kZXhTbmFwc2hvdC5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSksIDQwKTsKKyAgICAgICAgRGVzY3JpcHRvciBwYXJlbnRTbmFwc2hvdCA9IG5ldyBEZXNjcmlwdG9yKHBhcmVudFNuYXBzaG90RGlyZWN0b3J5LCBLUywgUEFSRU5UX0NGTS5uYW1lLCBzc3RhYmxlSWQoMCksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CisgICAgICAgIGNyZWF0ZUZpbGUocGFyZW50U25hcHNob3QuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLCAzMCk7CisgICAgICAgIERlc2NyaXB0b3IgaW5kZXhTbmFwc2hvdCA9IG5ldyBEZXNjcmlwdG9yKGluZGV4U25hcHNob3REaXJlY3RvcnksIEtTLCBJTkRFWF9DRk0ubmFtZSwgc3N0YWJsZUlkKDApLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpOworICAgICAgICBjcmVhdGVGaWxlKGluZGV4U25hcHNob3QuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLCA0MCk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDMwLCBwYXJlbnREaXJlY3Rvcmllcy50cnVlU25hcHNob3RzU2l6ZSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDQwLCBpbmRleERpcmVjdG9yaWVzLnRydWVTbmFwc2hvdHNTaXplKCkpOwpAQCAtNDYzLDE2ICs0NzEsMTUgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmVudEJhY2t1cERpcmVjdG9yeSwgaW5kZXhCYWNrdXBEaXJlY3RvcnkucGFyZW50KCkpOwogICAgIH0KIAotICAgIHByaXZhdGUgRmlsZSBjcmVhdGVGaWxlKFN0cmluZyBmaWxlTmFtZSwgaW50IHNpemUpCisgICAgcHJpdmF0ZSBGaWxlIGNyZWF0ZUZpbGUoRmlsZSBmaWxlLCBpbnQgc2l6ZSkKICAgICB7Ci0gICAgICAgIEZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLSAgICAgICAgdHJ5IChGaWxlT3V0cHV0U3RyZWFtUGx1cyB3cml0ZXIgPSBuZXcgRmlsZU91dHB1dFN0cmVhbVBsdXMobmV3RmlsZSk7KQorICAgICAgICB0cnkgKEZpbGVPdXRwdXRTdHJlYW1QbHVzIHdyaXRlciA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtUGx1cyhmaWxlKTspCiAgICAgICAgIHsKICAgICAgICAgICAgIHdyaXRlci53cml0ZShuZXcgYnl0ZVtzaXplXSk7CiAgICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlKSB7fQotICAgICAgICByZXR1cm4gbmV3RmlsZTsKKyAgICAgICAgcmV0dXJuIGZpbGU7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTUyNSw3ICs1MzIsNyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRlbXBvcmFyeUZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVtcG9yYXJ5RmlsZSgpCiAgICAgewogICAgICAgICBmb3IgKFRhYmxlTWV0YWRhdGEgY2ZtIDogQ0ZNKQogICAgICAgICB7CkBAIC01ODksMTEgKzU5NiwxMCBAQAogICAgICAgICAgICAgZmluYWwgRGlyZWN0b3JpZXMgZGlyZWN0b3JpZXMgPSBuZXcgRGlyZWN0b3JpZXMoY2ZtLCB0b0RhdGFEaXJlY3Rvcmllcyh0ZW1wRGF0YURpcikpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmRGlyKGNmbSksIGRpcmVjdG9yaWVzLmdldERpcmVjdG9yeUZvck5ld1NTVGFibGVzKCkpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIG4gPSBMb25nLnRvU3RyaW5nKG5hbm9UaW1lKCkpOwotICAgICAgICAgICAgQ2FsbGFibGU8RmlsZT4gZGlyZWN0b3J5R2V0dGVyID0gbmV3IENhbGxhYmxlPEZpbGU+KCkgewotICAgICAgICAgICAgICAgIHB1YmxpYyBGaWxlIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3IoY2ZEaXIoY2ZtKSwgS1MsIGNmbS5uYW1lLCBzc3RhYmxlSWQoMSksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGlyZWN0b3JpZXMuZ2V0U25hcHNob3REaXJlY3RvcnkoZGVzYywgbik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgQ2FsbGFibGU8RmlsZT4gZGlyZWN0b3J5R2V0dGVyID0gKCkgLT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRGVzY3JpcHRvcihjZkRpcihjZm0pLCBLUywgY2ZtLm5hbWUsIHNzdGFibGVJZCgxKSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGlyZWN0b3JpZXMuZ2V0U25hcHNob3REaXJlY3RvcnkoZGVzYywgbik7CiAgICAgICAgICAgICB9OwogICAgICAgICAgICAgTGlzdDxGdXR1cmU8RmlsZT4+IGludm9rZWQgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKDIpLmludm9rZUFsbChBcnJheXMuYXNMaXN0KGRpcmVjdG9yeUdldHRlciwgZGlyZWN0b3J5R2V0dGVyKSk7CiAgICAgICAgICAgICBmb3IoRnV0dXJlPEZpbGU+IGZ1dDppbnZva2VkKSB7CkBAIC03NTcsNyArNzYzLDcgQEAKICAgICAgICAgICAgIERpcmVjdG9yaWVzIGRpcnMgPSBuZXcgRGlyZWN0b3JpZXMoY2ZtLCBwYXRocyk7CiAgICAgICAgICAgICBmb3IgKERhdGFEaXJlY3RvcnkgZGlyIDogcGF0aHMpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkID0gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUobmV3IEZpbGUoZGlyLmxvY2F0aW9uLCBnZXROZXdGaWxlbmFtZShjZm0sIGZhbHNlKSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkID0gRGVzY3JpcHRvci5mcm9tRmlsZShuZXcgRmlsZShkaXIubG9jYXRpb24sIGdldE5ld0ZpbGVuYW1lKGNmbSwgZmFsc2UpKSk7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHAgPSBkaXJzLmdldERhdGFEaXJlY3RvcnlGb3JGaWxlKGQpLmxvY2F0aW9uLmFic29sdXRlUGF0aCgpICsgRmlsZS5wYXRoU2VwYXJhdG9yKCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwLnN0YXJ0c1dpdGgoZGlyLmxvY2F0aW9uLmFic29sdXRlUGF0aCgpICsgRmlsZS5wYXRoU2VwYXJhdG9yKCkpKTsKICAgICAgICAgICAgIH0KQEAgLTc4Niw5ICs3OTIsOSBAQAogICAgICAgICBmb3IgKFRhYmxlTWV0YWRhdGEgdG0gOiBDRk0pCiAgICAgICAgIHsKICAgICAgICAgICAgIERpcmVjdG9yaWVzIGRpcnMgPSBuZXcgRGlyZWN0b3JpZXModG0sIFNldHMubmV3SGFzaFNldChkZDEsIGRkMikpOwotICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUobmV3IEZpbGUoZGRpcjEucmVzb2x2ZShnZXROZXdGaWxlbmFtZSh0bSwgZmFsc2UpKSkpOworICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZShuZXcgRmlsZShkZGlyMS5yZXNvbHZlKGdldE5ld0ZpbGVuYW1lKHRtLCBmYWxzZSkpKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEZpbGUoZGRpcjEpLCBkaXJzLmdldERhdGFEaXJlY3RvcnlGb3JGaWxlKGRlc2MpLmxvY2F0aW9uKTsKLSAgICAgICAgICAgIGRlc2MgPSBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShuZXcgRmlsZShkZGlyMi5yZXNvbHZlKGdldE5ld0ZpbGVuYW1lKHRtLCBmYWxzZSkpKSk7CisgICAgICAgICAgICBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZShuZXcgRmlsZShkZGlyMi5yZXNvbHZlKGdldE5ld0ZpbGVuYW1lKHRtLCBmYWxzZSkpKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEZpbGUoZGRpcjIpLCBkaXJzLmdldERhdGFEaXJlY3RvcnlGb3JGaWxlKGRlc2MpLmxvY2F0aW9uKTsKICAgICAgICAgfQogICAgIH0KQEAgLTgzNiw5ICs4NDIsOSBAQAogICAgICAgICBmb3IgKFRhYmxlTWV0YWRhdGEgdG0gOiBDRk0pCiAgICAgICAgIHsKICAgICAgICAgICAgIERpcmVjdG9yaWVzIGRpcnMgPSBuZXcgRGlyZWN0b3JpZXModG0sIFNldHMubmV3SGFzaFNldChkZDEsIGRkMikpOwotICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUobmV3IEZpbGUoZGRpcjEucmVzb2x2ZShnZXROZXdGaWxlbmFtZSh0bSwgb2xkU3R5bGUpKSkpOworICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZShuZXcgRmlsZShkZGlyMS5yZXNvbHZlKGdldE5ld0ZpbGVuYW1lKHRtLCBvbGRTdHlsZSkpKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEZpbGUoZGRpcjEpLCBkaXJzLmdldERhdGFEaXJlY3RvcnlGb3JGaWxlKGRlc2MpLmxvY2F0aW9uKTsKLSAgICAgICAgICAgIGRlc2MgPSBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShuZXcgRmlsZShkZGlyMi5yZXNvbHZlKGdldE5ld0ZpbGVuYW1lKHRtLCBvbGRTdHlsZSkpKSk7CisgICAgICAgICAgICBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZShuZXcgRmlsZShkZGlyMi5yZXNvbHZlKGdldE5ld0ZpbGVuYW1lKHRtLCBvbGRTdHlsZSkpKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEZpbGUoZGRpcjIpLCBkaXJzLmdldERhdGFEaXJlY3RvcnlGb3JGaWxlKGRlc2MpLmxvY2F0aW9uKTsKICAgICAgICAgfQogICAgIH0KQEAgLTg4OSwzMSArODk1LDI4IEBACiAgICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIFN0cmluZyBnZXROZXdGaWxlbmFtZShUYWJsZU1ldGFkYXRhIHRtLCBib29sZWFuIG9sZFN0eWxlKQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZyZWVDb21wYWN0aW9uU3BhY2UoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIHRtLmtleXNwYWNlICsgRmlsZS5wYXRoU2VwYXJhdG9yKCkgKyB0bS5uYW1lICsgKG9sZFN0eWxlID8gIiIgOiBDb21wb25lbnQuc2VwYXJhdG9yICsgdG0uaWQudG9IZXhTdHJpbmcoKSkgKyAiL25hLTEtYmlnLURhdGEuZGIiOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5Q2FuZGlkYXRlPiBnZXRXcml0ZWFibGVEaXJlY3RvcmllcyhEYXRhRGlyZWN0b3J5W10gZGF0YURpcmVjdG9yaWVzLCBsb25nIHdyaXRlU2l6ZSkKLSAgICB7Ci0gICAgICAgIC8vIGNvcGllZCBmcm9tIERpcmVjdG9yaWVzLmdldFdyaXRlYWJsZUxvY2F0aW9uKGxvbmcpCi0gICAgICAgIExpc3Q8RGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeUNhbmRpZGF0ZT4gY2FuZGlkYXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCi0gICAgICAgIGxvbmcgdG90YWxBdmFpbGFibGUgPSAwTDsKLQotICAgICAgICBmb3IgKERhdGFEaXJlY3RvcnkgZGF0YURpciA6IGRhdGFEaXJlY3RvcmllcykKKyAgICAgICAgZG91YmxlIG9sZE1heFNwYWNlRm9yQ29tcGFjdGlvbnMgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TWF4U3BhY2VGb3JDb21wYWN0aW9uc1BlckRyaXZlKCk7CisgICAgICAgIGxvbmcgb2xkRnJlZVNwYWNlID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1pbkZyZWVTcGFjZVBlckRyaXZlSW5NZWJpYnl0ZXMoKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE1heFNwYWNlRm9yQ29tcGFjdGlvbnNQZXJEcml2ZSgxMDAuMCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRNaW5GcmVlU3BhY2VQZXJEcml2ZUluTWViaWJ5dGVzKDApOworICAgICAgICBGaWxlU3RvcmUgZnN0b3JlID0gbmV3IEZha2VGaWxlU3RvcmUoKTsKKyAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnlDYW5kaWRhdGUgY2FuZGlkYXRlID0gbmV3IERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnlDYW5kaWRhdGUoZGF0YURpcik7Ci0gICAgICAgICAgICAvLyBleGNsdWRlIGRpcmVjdG9yeSBpZiBpdHMgdG90YWwgd3JpdGVTaXplIGRvZXMgbm90IGZpdCB0byBkYXRhIGRpcmVjdG9yeQotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5hdmFpbGFibGVTcGFjZSA8IHdyaXRlU2l6ZSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKGNhbmRpZGF0ZSk7Ci0gICAgICAgICAgICB0b3RhbEF2YWlsYWJsZSArPSBjYW5kaWRhdGUuYXZhaWxhYmxlU3BhY2U7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0TWF4U3BhY2VGb3JDb21wYWN0aW9uc1BlckRyaXZlKDEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgRGlyZWN0b3JpZXMuZ2V0QXZhaWxhYmxlU3BhY2VGb3JDb21wYWN0aW9ucyhmc3RvcmUpKTsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRNYXhTcGFjZUZvckNvbXBhY3Rpb25zUGVyRHJpdmUoLjUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDUwLCBEaXJlY3Rvcmllcy5nZXRBdmFpbGFibGVTcGFjZUZvckNvbXBhY3Rpb25zKGZzdG9yZSkpOworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE1heFNwYWNlRm9yQ29tcGFjdGlvbnNQZXJEcml2ZSgwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBEaXJlY3Rvcmllcy5nZXRBdmFpbGFibGVTcGFjZUZvckNvbXBhY3Rpb25zKGZzdG9yZSkpOwogICAgICAgICB9Ci0KLSAgICAgICAgRGlyZWN0b3JpZXMuc29ydFdyaXRlYWJsZUNhbmRpZGF0ZXMoY2FuZGlkYXRlcywgdG90YWxBdmFpbGFibGUpOwotCi0gICAgICAgIHJldHVybiBjYW5kaWRhdGVzOworICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRNYXhTcGFjZUZvckNvbXBhY3Rpb25zUGVyRHJpdmUob2xkTWF4U3BhY2VGb3JDb21wYWN0aW9ucyk7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0TWluRnJlZVNwYWNlUGVyRHJpdmVJbk1lYmlieXRlcyhvbGRGcmVlU3BhY2UgLyBGaWxlVXRpbHMuT05FX01JQik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIGludCBnZXREaXlUaHJlYWRJZCgpCkBAIC05NDQsMTEgKzk0NywxMCBAQAogICAgIHByaXZhdGUgTGlzdDxJTG9nZ2luZ0V2ZW50PiBmaWx0ZXJMb2dCeURpeUlkKExpc3Q8SUxvZ2dpbmdFdmVudD4gbG9nKQogICAgIHsKICAgICAgICAgQXJyYXlMaXN0PElMb2dnaW5nRXZlbnQ+IGZpbHRlcmVkTG9nID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoSUxvZ2dpbmdFdmVudCBldmVudCA6IGxvZykKKyAgICAgICAgZm9yKElMb2dnaW5nRXZlbnQgZXZlbnQgOiBsb2cpCiAgICAgICAgIHsKICAgICAgICAgICAgIGludCBtZGNJZCA9IEludGVnZXIucGFyc2VJbnQoZXZlbnQuZ2V0TURDUHJvcGVydHlNYXAoKS5nZXQodGhpcy5NRENJRCkpOwotICAgICAgICAgICAgaWYgKG1kY0lkID09IG15RGl5SWQpCi0gICAgICAgICAgICB7CisgICAgICAgICAgICBpZihtZGNJZCA9PSBteURpeUlkKXsKICAgICAgICAgICAgICAgICBmaWx0ZXJlZExvZy5hZGQoZXZlbnQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC05NjAsMTAxICs5NjIsMTkxIEBACiAgICAgICAgIGludCBmb3VuZD0wOwogICAgICAgICBmb3IoSUxvZ2dpbmdFdmVudCBlOiBsb2cpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihlLmdldEZvcm1hdHRlZE1lc3NhZ2UoKSk7CiAgICAgICAgICAgICBpZihlLmdldEZvcm1hdHRlZE1lc3NhZ2UoKS5lbmRzV2l0aChleHBlY3RlZE1lc3NhZ2UpKQotICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChlLmdldExldmVsKCkgPT0gZXhwZWN0ZWRMZXZlbCkKICAgICAgICAgICAgICAgICAgICAgZm91bmQrKzsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZENvdW50LCBmb3VuZCk7CiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXZhaWxhYmxlRGlza1NwYWNlKCkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXZhaWxhYmxlU3BhY2UoKQogICAgIHsKLSAgICAgICAgRGF0YURpcmVjdG9yeVtdIGRhdGFEaXJlY3RvcmllcyA9IG5ldyBEYXRhRGlyZWN0b3J5W10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRhRGlyZWN0b3J5KG5ldyBGaWxlKCIvbmVhcmx5RnVsbERpcjEiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRBdmFpbGFibGVTcGFjZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTFMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0YURpcmVjdG9yeShuZXcgRmlsZSgiL3VuaWZvcm1EaXIyIikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0QXZhaWxhYmxlU3BhY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDk5OUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRhRGlyZWN0b3J5KG5ldyBGaWxlKCIvdmVyeUZ1bGxEaXIiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRBdmFpbGFibGVTcGFjZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgZG91YmxlIG9sZE1heFNwYWNlRm9yQ29tcGFjdGlvbnMgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TWF4U3BhY2VGb3JDb21wYWN0aW9uc1BlckRyaXZlKCk7CisgICAgICAgIGxvbmcgb2xkRnJlZVNwYWNlID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1pbkZyZWVTcGFjZVBlckRyaXZlSW5NZWJpYnl0ZXMoKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE1heFNwYWNlRm9yQ29tcGFjdGlvbnNQZXJEcml2ZSgxLjApOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0TWluRnJlZVNwYWNlUGVyRHJpdmVJbk1lYmlieXRlcygwKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIEZha2VGaWxlU3RvcmUgZnMxID0gbmV3IEZha2VGaWxlU3RvcmUoKTsKKyAgICAgICAgICAgIEZha2VGaWxlU3RvcmUgZnMyID0gbmV3IEZha2VGaWxlU3RvcmUoKTsKKyAgICAgICAgICAgIEZha2VGaWxlU3RvcmUgZnMzID0gbmV3IEZha2VGaWxlU3RvcmUoKTsKKyAgICAgICAgICAgIE1hcDxGaWxlU3RvcmUsIExvbmc+IHdyaXRlcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAotICAgICAgICBEaXJlY3RvcmllcyBkID0gbmV3IERpcmVjdG9yaWVzKCAoKFRhYmxlTWV0YWRhdGEpIENGTS50b0FycmF5KClbMF0pLCBkYXRhRGlyZWN0b3JpZXMpOworICAgICAgICAgICAgZnMxLnVzYWJsZVNwYWNlID0gMzA7CisgICAgICAgICAgICBmczIudXNhYmxlU3BhY2UgPSAzMDsKKyAgICAgICAgICAgIGZzMy51c2FibGVTcGFjZSA9IDMwOwogCi0gICAgICAgIGFzc2VydFRydWUoZC5oYXNBdmFpbGFibGVEaXNrU3BhY2UoMSwyKSk7Ci0gICAgICAgIGFzc2VydFRydWUoZC5oYXNBdmFpbGFibGVEaXNrU3BhY2UoMTAsOTkpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoZC5oYXNBdmFpbGFibGVEaXNrU3BhY2UoMTAsMTAyNCkpOwotICAgICAgICBhc3NlcnRGYWxzZShkLmhhc0F2YWlsYWJsZURpc2tTcGFjZSgxMDI0LDEwMjQqMTAyNCkpOworICAgICAgICAgICAgd3JpdGVzLnB1dChmczEsIDIwTCk7CisgICAgICAgICAgICB3cml0ZXMucHV0KGZzMiwgMjBMKTsKKyAgICAgICAgICAgIHdyaXRlcy5wdXQoZnMzLCAyMEwpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShEaXJlY3Rvcmllcy5oYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMod3JpdGVzKSk7CiAKLSAgICAgICAgTGlzdDxJTG9nZ2luZ0V2ZW50PiBmaWx0ZXJlZExvZyA9IGxpc3RBcHBlbmRlci5saXN0OwotICAgICAgICAvL0xpc3Q8SUxvZ2dpbmdFdmVudD4gZmlsdGVyZWRMb2cgPSBmaWx0ZXJMb2dCeURpeUlkKGxpc3RBcHBlbmRlci5saXN0KTsKLSAgICAgICAgLy8gTG9nIG1lc3NhZ2VzIGNhbiBiZSBvdXQgb2Ygb3JkZXIsIGV2ZW4gZm9yIHRoZSBzaW5nbGUgdGhyZWFkLiAoZSB0dWkgQXN5bmNBcHBlbmRlcj8pCi0gICAgICAgIC8vIFdlIGNhbiBkZWFsIHdpdGggaXQsIGl0J3Mgc3VmZmljaWVudCB0byBqdXN0IGNoZWNrIHRoYXQgYWxsIG1lc3NhZ2VzIGV4aXN0IGluIHRoZSByZXN1bHQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIzLCBmaWx0ZXJlZExvZy5zaXplKCkpOwotICAgICAgICBTdHJpbmcgbG9nTXNnRm9ybWF0ID0gIkRhdGFEaXJlY3RvcnkgJXMgaGFzICVkIGJ5dGVzIGF2YWlsYWJsZSwgY2hlY2tpbmcgaWYgd2UgY2FuIHdyaXRlICVkIGJ5dGVzIjsKLSAgICAgICAgU3RyaW5nIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL25lYXJseUZ1bGxEaXIxIiwgMTEsIDIpOwotICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLkRFQlVHLCBsb2dNc2csIDEpOwotICAgICAgICBsb2dNc2cgPSBTdHJpbmcuZm9ybWF0KGxvZ01zZ0Zvcm1hdCwgIi91bmlmb3JtRGlyMiIsIDk5OSwgMik7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL3ZlcnlGdWxsRGlyIiwgNCwgMik7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL25lYXJseUZ1bGxEaXIxIiwgMTEsIDIpOwotICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLkRFQlVHLCBsb2dNc2csIDEpOwotICAgICAgICBsb2dNc2cgPSBTdHJpbmcuZm9ybWF0KGxvZ01zZ0Zvcm1hdCwgIi91bmlmb3JtRGlyMiIsIDk5OSwgOSk7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL3ZlcnlGdWxsRGlyIiwgNCwgOSk7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL25lYXJseUZ1bGxEaXIxIiwgMTEsIDEwMik7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL3VuaWZvcm1EaXIyIiwgOTk5LCAxMDIpOwotICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLkRFQlVHLCBsb2dNc2csIDEpOwotICAgICAgICBsb2dNc2cgPSBTdHJpbmcuZm9ybWF0KGxvZ01zZ0Zvcm1hdCwgIi92ZXJ5RnVsbERpciIsIDQsIDEwMik7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL25lYXJseUZ1bGxEaXIxIiwgMTEsIDEwMjQpOwotICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLkRFQlVHLCBsb2dNc2csIDEpOwotICAgICAgICBsb2dNc2cgPSBTdHJpbmcuZm9ybWF0KGxvZ01zZ0Zvcm1hdCwgIi91bmlmb3JtRGlyMiIsIDk5OSwgMTAyNCk7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL3ZlcnlGdWxsRGlyIiwgNCwgMTAyNCk7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMSk7CisgICAgICAgICAgICBmczEudXNhYmxlU3BhY2UgPSAxOTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKERpcmVjdG9yaWVzLmhhc0Rpc2tTcGFjZUZvckNvbXBhY3Rpb25zQW5kU3RyZWFtcyh3cml0ZXMpKTsKIAotICAgICAgICBsb2dNc2dGb3JtYXQgPSAiRGF0YURpcmVjdG9yeSAlcyBjYW4ndCBiZSB1c2VkIGZvciBjb21wYWN0aW9uLiBPbmx5ICVzIGlzIGF2YWlsYWJsZSwgYnV0ICVzIGlzIHRoZSBtaW5pbXVtIHdyaXRlIHNpemUuIjsKLSAgICAgICAgbG9nTXNnID0gU3RyaW5nLmZvcm1hdChsb2dNc2dGb3JtYXQsICIvdmVyeUZ1bGxEaXIiLCAiNCBieXRlcyIsICI5IGJ5dGVzIik7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuV0FSTiwgbG9nTXNnLCAxKTsKLSAgICAgICAgbG9nTXNnID0gU3RyaW5nLmZvcm1hdChsb2dNc2dGb3JtYXQsICIvbmVhcmx5RnVsbERpcjEiLCAiMTEgYnl0ZXMiLCAiMTAyIGJ5dGVzIik7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuV0FSTiwgbG9nTXNnLCAxKTsKLSAgICAgICAgbG9nTXNnID0gU3RyaW5nLmZvcm1hdChsb2dNc2dGb3JtYXQsICIvdmVyeUZ1bGxEaXIiLCAiNCBieXRlcyIsICIxMDIgYnl0ZXMiKTsKLSAgICAgICAgY2hlY2tGb3JtYXR0ZWRNZXNzYWdlKGZpbHRlcmVkTG9nLCBMZXZlbC5XQVJOLCBsb2dNc2csIDEpOwotICAgICAgICBsb2dNc2cgPSBTdHJpbmcuZm9ybWF0KGxvZ01zZ0Zvcm1hdCwgIi9uZWFybHlGdWxsRGlyMSIsICIxMSBieXRlcyIsICIxIEtpQiIpOwotICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLldBUk4sIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL3VuaWZvcm1EaXIyIiwgIjk5OSBieXRlcyIsICIxIEtpQiIpOwotICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLldBUk4sIGxvZ01zZywgMSk7Ci0gICAgICAgIGxvZ01zZyA9IFN0cmluZy5mb3JtYXQobG9nTXNnRm9ybWF0LCAiL3ZlcnlGdWxsRGlyIiwgIjQgYnl0ZXMiLCAiMSBLaUIiKTsKLSAgICAgICAgY2hlY2tGb3JtYXR0ZWRNZXNzYWdlKGZpbHRlcmVkTG9nLCBMZXZlbC5XQVJOLCBsb2dNc2csIDEpOworICAgICAgICAgICAgd3JpdGVzLnB1dChmczIsIDI1TCoxMDI0KjEwMjQrOSk7CisgICAgICAgICAgICBmczIudXNhYmxlU3BhY2UgPSAyMEwqMTAyNCoxMDI0LTk7CisgICAgICAgICAgICB3cml0ZXMucHV0KGZzMywgOTk5TCoxMDI0KjEwMjQqMTAyNCs5KTsKKyAgICAgICAgICAgIGZzMi51c2FibGVTcGFjZSA9IDIwTCoxMDI0Kzk5OworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoRGlyZWN0b3JpZXMuaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKHdyaXRlcykpOwogCi0gICAgICAgIGxvZ01zZ0Zvcm1hdCA9ICJBY3Jvc3MgJXMgdGhlcmUncyBvbmx5ICVzIGF2YWlsYWJsZSwgYnV0ICVzIGlzIG5lZWRlZC4iOwotICAgICAgICBsb2dNc2cgPSBTdHJpbmcuZm9ybWF0KGxvZ01zZ0Zvcm1hdCwgIlsvbmVhcmx5RnVsbERpcjEsL3VuaWZvcm1EaXIyLC92ZXJ5RnVsbERpcl0iLCAiOTk5IGJ5dGVzIiwgIjEgS2lCIik7Ci0gICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuV0FSTiwgbG9nTXNnLCAxKTsKLSAgICAgICAgbG9nTXNnID0gU3RyaW5nLmZvcm1hdChsb2dNc2dGb3JtYXQsICJbL25lYXJseUZ1bGxEaXIxLC91bmlmb3JtRGlyMiwvdmVyeUZ1bGxEaXJdIiwgIjAgYnl0ZXMiLCAiMSBNaUIiKTsKLSAgICAgICAgY2hlY2tGb3JtYXR0ZWRNZXNzYWdlKGZpbHRlcmVkTG9nLCBMZXZlbC5XQVJOLCBsb2dNc2csIDEpOworICAgICAgICAgICAgZnMxLnVzYWJsZVNwYWNlID0gMzA7CisgICAgICAgICAgICBmczIudXNhYmxlU3BhY2UgPSAzMDsKKyAgICAgICAgICAgIGZzMy51c2FibGVTcGFjZSA9IDMwTCoxMDI0KjEwMjQqMTAyNCoxMDI0OworCisgICAgICAgICAgICB3cml0ZXMucHV0KGZzMSwgMjBMKTsKKyAgICAgICAgICAgIHdyaXRlcy5wdXQoZnMyLCAyMEwpOworICAgICAgICAgICAgd3JpdGVzLnB1dChmczMsIDMwTCoxMDI0KjEwMjQqMTAyNCoxMDI0KzEpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoRGlyZWN0b3JpZXMuaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKHdyaXRlcykpOworCisgICAgICAgICAgICBMaXN0PElMb2dnaW5nRXZlbnQ+IGZpbHRlcmVkTG9nID0gZmlsdGVyTG9nQnlEaXlJZChsaXN0QXBwZW5kZXIubGlzdCk7CisgICAgICAgICAgICAvLyBMb2cgbWVzc2FnZXMgY2FuIGJlIG91dCBvZiBvcmRlciwgZXZlbiBmb3IgdGhlIHNpbmdsZSB0aHJlYWQuIChlIHR1aSBBc3luY0FwcGVuZGVyPykKKyAgICAgICAgICAgIC8vIFdlIGNhbiBkZWFsIHdpdGggaXQsIGl0J3Mgc3VmZmljaWVudCB0byBqdXN0IGNoZWNrIHRoYXQgYWxsIG1lc3NhZ2VzIGV4aXN0IGluIHRoZSByZXN1bHQKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxNywgZmlsdGVyZWRMb2cuc2l6ZSgpKTsKKworICAgICAgICAgICAgU3RyaW5nIGxvZ01zZyA9ICIzMCBieXRlcyBhdmFpbGFibGUsIGNoZWNraW5nIGlmIHdlIGNhbiB3cml0ZSAyMCBieXRlcyI7CisgICAgICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLkRFQlVHLCBsb2dNc2csIDcpOworICAgICAgICAgICAgbG9nTXNnID0gIjE5IGJ5dGVzIGF2YWlsYWJsZSwgY2hlY2tpbmcgaWYgd2UgY2FuIHdyaXRlIDIwIGJ5dGVzIjsKKyAgICAgICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuREVCVUcsIGxvZ01zZywgMik7CisKKworICAgICAgICAgICAgbG9nTXNnID0gIjE5IGJ5dGVzIGF2YWlsYWJsZSwgYnV0IDIwIGJ5dGVzIGlzIG5lZWRlZCI7CisgICAgICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLldBUk4sIGxvZ01zZywgMik7CisgICAgICAgICAgICBsb2dNc2cgPSAiaGFzIG9ubHkgMjAuMSBLaUIgYXZhaWxhYmxlLCBidXQgMjUgTWlCIGlzIG5lZWRlZCI7CisgICAgICAgICAgICBjaGVja0Zvcm1hdHRlZE1lc3NhZ2UoZmlsdGVyZWRMb2csIExldmVsLldBUk4sIGxvZ01zZywgMSk7CisgICAgICAgICAgICBsb2dNc2cgPSAiaGFzIG9ubHkgMzAgYnl0ZXMgYXZhaWxhYmxlLCBidXQgOTk5IEdpQiBpcyBuZWVkZWQiOworICAgICAgICAgICAgY2hlY2tGb3JtYXR0ZWRNZXNzYWdlKGZpbHRlcmVkTG9nLCBMZXZlbC5XQVJOLCBsb2dNc2csIDEpOworICAgICAgICAgICAgbG9nTXNnID0gImhhcyBvbmx5IDMwIFRpQiBhdmFpbGFibGUsIGJ1dCAzMCBUaUIgaXMgbmVlZGVkIjsKKyAgICAgICAgICAgIGNoZWNrRm9ybWF0dGVkTWVzc2FnZShmaWx0ZXJlZExvZywgTGV2ZWwuV0FSTiwgbG9nTXNnLCAxKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRNYXhTcGFjZUZvckNvbXBhY3Rpb25zUGVyRHJpdmUob2xkTWF4U3BhY2VGb3JDb21wYWN0aW9ucyk7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0TWluRnJlZVNwYWNlUGVyRHJpdmVJbk1lYmlieXRlcyhvbGRGcmVlU3BhY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGFzQXZhaWxhYmxlU3BhY2VTdW1taW5nKCkKKyAgICB7CisgICAgICAgIGRvdWJsZSBvbGRNYXhTcGFjZUZvckNvbXBhY3Rpb25zID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1heFNwYWNlRm9yQ29tcGFjdGlvbnNQZXJEcml2ZSgpOworICAgICAgICBsb25nIG9sZEZyZWVTcGFjZSA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRNaW5GcmVlU3BhY2VQZXJEcml2ZUluTWViaWJ5dGVzKCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRNYXhTcGFjZUZvckNvbXBhY3Rpb25zUGVyRHJpdmUoMS4wKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE1pbkZyZWVTcGFjZVBlckRyaXZlSW5NZWJpYnl0ZXMoMCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBGYWtlRmlsZVN0b3JlIGZzMSA9IG5ldyBGYWtlRmlsZVN0b3JlKCk7CisgICAgICAgICAgICBGYWtlRmlsZVN0b3JlIGZzMiA9IG5ldyBGYWtlRmlsZVN0b3JlKCk7CisgICAgICAgICAgICBNYXA8RmlsZSwgTG9uZz4gZXhwZWN0ZWROZXdXcml0ZVNpemVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgTWFwPEZpbGUsIExvbmc+IHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgICAgICBmczEudXNhYmxlU3BhY2UgPSAxMDA7CisgICAgICAgICAgICBmczIudXNhYmxlU3BhY2UgPSAxMDA7CisKKyAgICAgICAgICAgIEZpbGUgZjEgPSBuZXcgRmlsZSgiZjEiKTsKKyAgICAgICAgICAgIEZpbGUgZjIgPSBuZXcgRmlsZSgiZjIiKTsKKyAgICAgICAgICAgIEZpbGUgZjMgPSBuZXcgRmlsZSgiZjMiKTsKKworICAgICAgICAgICAgZXhwZWN0ZWROZXdXcml0ZVNpemVzLnB1dChmMSwgMjBMKTsKKyAgICAgICAgICAgIGV4cGVjdGVkTmV3V3JpdGVTaXplcy5wdXQoZjIsIDIwTCk7CisgICAgICAgICAgICBleHBlY3RlZE5ld1dyaXRlU2l6ZXMucHV0KGYzLCAyMEwpOworCisgICAgICAgICAgICB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZy5wdXQoZjEsIDIwTCk7CisgICAgICAgICAgICB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZy5wdXQoZjIsIDIwTCk7CisgICAgICAgICAgICB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZy5wdXQoZjMsIDIwTCk7CisgICAgICAgICAgICBGdW5jdGlvbjxGaWxlLCBGaWxlU3RvcmU+IGZpbGVzdG9yZU1hcHBlciA9IChmKSAtPiB7CisgICAgICAgICAgICAgICAgaWYgKGYgPT0gZjEgfHwgZiA9PSBmMikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZzMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnMyOworICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoRGlyZWN0b3JpZXMuaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKGV4cGVjdGVkTmV3V3JpdGVTaXplcywgdG90YWxDb21wYWN0aW9uV3JpdGVSZW1haW5pbmcsIGZpbGVzdG9yZU1hcHBlcikpOworICAgICAgICAgICAgZnMxLnVzYWJsZVNwYWNlID0gNzk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShEaXJlY3Rvcmllcy5oYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMoZXhwZWN0ZWROZXdXcml0ZVNpemVzLCB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZywgZmlsZXN0b3JlTWFwcGVyKSk7CisgICAgICAgICAgICBmczEudXNhYmxlU3BhY2UgPSA4MTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoRGlyZWN0b3JpZXMuaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zKGV4cGVjdGVkTmV3V3JpdGVTaXplcywgdG90YWxDb21wYWN0aW9uV3JpdGVSZW1haW5pbmcsIGZpbGVzdG9yZU1hcHBlcikpOworCisgICAgICAgICAgICBleHBlY3RlZE5ld1dyaXRlU2l6ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGV4cGVjdGVkTmV3V3JpdGVTaXplcy5wdXQoZjEsIDEwMEwpOworICAgICAgICAgICAgdG90YWxDb21wYWN0aW9uV3JpdGVSZW1haW5pbmcuY2xlYXIoKTsKKyAgICAgICAgICAgIHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nLnB1dChmMiwgMTAwTCk7CisgICAgICAgICAgICBmczEudXNhYmxlU3BhY2UgPSAxNTA7CisKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKERpcmVjdG9yaWVzLmhhc0Rpc2tTcGFjZUZvckNvbXBhY3Rpb25zQW5kU3RyZWFtcyhleHBlY3RlZE5ld1dyaXRlU2l6ZXMsIHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nLCBmaWxlc3RvcmVNYXBwZXIpKTsKKyAgICAgICAgICAgIGV4cGVjdGVkTmV3V3JpdGVTaXplcy5jbGVhcigpOworICAgICAgICAgICAgZXhwZWN0ZWROZXdXcml0ZVNpemVzLnB1dChmMSwgMTAwTCk7CisgICAgICAgICAgICB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZy5jbGVhcigpOworICAgICAgICAgICAgdG90YWxDb21wYWN0aW9uV3JpdGVSZW1haW5pbmcucHV0KGYzLCA1MDBMKTsKKyAgICAgICAgICAgIGZzMS51c2FibGVTcGFjZSA9IDE1MDsKKyAgICAgICAgICAgIGZzMi51c2FibGVTcGFjZSA9IDQwMDsgLy8gdG9vIGxpdHRsZSBzcGFjZSBmb3IgdGhlIG9uZ29pbmcgY29tcGFjdGlvbiwgYnV0IHRoaXMgZmlsZXN0b3JlIGRvZXMgbm90IGFmZmVjdCB0aGUgbmV3IGNvbXBhY3Rpb24gc28gaXQgc2hvdWxkIGJlIGFsbG93ZWQKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShEaXJlY3Rvcmllcy5oYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMoZXhwZWN0ZWROZXdXcml0ZVNpemVzLCB0b3RhbENvbXBhY3Rpb25Xcml0ZVJlbWFpbmluZywgZmlsZXN0b3JlTWFwcGVyKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0TWF4U3BhY2VGb3JDb21wYWN0aW9uc1BlckRyaXZlKG9sZE1heFNwYWNlRm9yQ29tcGFjdGlvbnMpOworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE1pbkZyZWVTcGFjZVBlckRyaXZlSW5NZWJpYnl0ZXMob2xkRnJlZVNwYWNlIC8gRmlsZVV0aWxzLk9ORV9NSUIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmV3RmlsZW5hbWUoVGFibGVNZXRhZGF0YSB0bSwgYm9vbGVhbiBvbGRTdHlsZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0bS5rZXlzcGFjZSArIEZpbGUucGF0aFNlcGFyYXRvcigpICsgdG0ubmFtZSArIChvbGRTdHlsZSA/ICIiIDogQ29tcG9uZW50LnNlcGFyYXRvciArIHRtLmlkLnRvSGV4U3RyaW5nKCkpICsgIi9uYS0xLWJpZy1EYXRhLmRiIjsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8RGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeUNhbmRpZGF0ZT4gZ2V0V3JpdGVhYmxlRGlyZWN0b3JpZXMoRGF0YURpcmVjdG9yeVtdIGRhdGFEaXJlY3RvcmllcywgbG9uZyB3cml0ZVNpemUpCisgICAgeworICAgICAgICAvLyBjb3BpZWQgZnJvbSBEaXJlY3Rvcmllcy5nZXRXcml0ZWFibGVMb2NhdGlvbihsb25nKQorICAgICAgICBMaXN0PERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnlDYW5kaWRhdGU+IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBsb25nIHRvdGFsQXZhaWxhYmxlID0gMEw7CisKKyAgICAgICAgZm9yIChEYXRhRGlyZWN0b3J5IGRhdGFEaXIgOiBkYXRhRGlyZWN0b3JpZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnlDYW5kaWRhdGUgY2FuZGlkYXRlID0gbmV3IERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnlDYW5kaWRhdGUoZGF0YURpcik7CisgICAgICAgICAgICAvLyBleGNsdWRlIGRpcmVjdG9yeSBpZiBpdHMgdG90YWwgd3JpdGVTaXplIGRvZXMgbm90IGZpdCB0byBkYXRhIGRpcmVjdG9yeQorICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5hdmFpbGFibGVTcGFjZSA8IHdyaXRlU2l6ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGNhbmRpZGF0ZXMuYWRkKGNhbmRpZGF0ZSk7CisgICAgICAgICAgICB0b3RhbEF2YWlsYWJsZSArPSBjYW5kaWRhdGUuYXZhaWxhYmxlU3BhY2U7CisgICAgICAgIH0KKworICAgICAgICBEaXJlY3Rvcmllcy5zb3J0V3JpdGVhYmxlQ2FuZGlkYXRlcyhjYW5kaWRhdGVzLCB0b3RhbEF2YWlsYWJsZSk7CisKKyAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZXM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWtlRmlsZVN0b3JlIGV4dGVuZHMgRmlsZVN0b3JlCisgICAgeworICAgICAgICBwdWJsaWMgbG9uZyB1c2FibGVTcGFjZSA9IDEwMDsKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0VXNhYmxlU3BhY2UoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdXNhYmxlU3BhY2U7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBuYW1lKCkge3JldHVybiBudWxsO30KKyAgICAgICAgcHVibGljIFN0cmluZyB0eXBlKCkge3JldHVybiBudWxsO30KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHtyZXR1cm4gZmFsc2U7fQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbFNwYWNlKCkge3JldHVybiAwO30KKyAgICAgICAgcHVibGljIGxvbmcgZ2V0VW5hbGxvY2F0ZWRTcGFjZSgpIHtyZXR1cm4gMDt9CisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRmlsZUF0dHJpYnV0ZVZpZXcoQ2xhc3M8PyBleHRlbmRzIEZpbGVBdHRyaWJ1dGVWaWV3PiB0eXBlKSB7cmV0dXJuIGZhbHNlO30KKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNGaWxlQXR0cmlidXRlVmlldyhTdHJpbmcgbmFtZSkge3JldHVybiBmYWxzZTt9CisgICAgICAgIHB1YmxpYyA8ViBleHRlbmRzIEZpbGVTdG9yZUF0dHJpYnV0ZVZpZXc+IFYgZ2V0RmlsZVN0b3JlQXR0cmlidXRlVmlldyhDbGFzczxWPiB0eXBlKSB7cmV0dXJuIG51bGw7fQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlKSB7cmV0dXJuIG51bGw7fQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIk1vY2tGaWxlU3RvcmUiOworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0Rpc2tCb3VuZGFyeU1hbmFnZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGlza0JvdW5kYXJ5TWFuYWdlclRlc3QuamF2YQppbmRleCBjZGY5YTlhLi5mMDQzYzBiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGlza0JvdW5kYXJ5TWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvRGlza0JvdW5kYXJ5TWFuYWdlclRlc3QuamF2YQpAQCAtMTksOCArMTksMTEgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI7CiAKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtMjksMTAgKzMyLDE2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQm9vdFN0cmFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5Ub2tlbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Nb2NrU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKQEAgLTQ1LDYgKzU0LDggQEAKICAgICBwcml2YXRlIERpc2tCb3VuZGFyeU1hbmFnZXIgZGJtOwogICAgIHByaXZhdGUgTW9ja0NGUyBtb2NrOwogICAgIHByaXZhdGUgRGlyZWN0b3JpZXMgZGlyczsKKyAgICBwcml2YXRlIExpc3Q8RGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeT4gZGF0YWRpcnM7CisgICAgcHJpdmF0ZSBMaXN0PEZpbGU+IHRhYmxlRGlyczsKIAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXR1cCgpCkBAIC01MywxMSArNjQsMTMgQEAKICAgICAgICAgVG9rZW5NZXRhZGF0YSBtZXRhZGF0YSA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKTsKICAgICAgICAgbWV0YWRhdGEudXBkYXRlTm9ybWFsVG9rZW5zKEJvb3RTdHJhcHBlci5nZXRSYW5kb21Ub2tlbnMobWV0YWRhdGEsIDEwKSwgRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSk7CiAgICAgICAgIGNyZWF0ZVRhYmxlKCJjcmVhdGUgdGFibGUgJXMgKGlkIGludCBwcmltYXJ5IGtleSwgeCB0ZXh0KSIpOwotICAgICAgICBkaXJzID0gbmV3IERpcmVjdG9yaWVzKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLm1ldGFkYXRhKCksIExpc3RzLm5ld0FycmF5TGlzdChuZXcgRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeShuZXcgRmlsZSgiL3RtcC8xIikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkobmV3IEZpbGUoIi90bXAvMiIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaXJlY3Rvcmllcy5EYXRhRGlyZWN0b3J5KG5ldyBGaWxlKCIvdG1wLzMiKSkpKTsKKyAgICAgICAgZGF0YWRpcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QobmV3IERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkobmV3IEZpbGUoIi90bXAvMSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkobmV3IEZpbGUoIi90bXAvMiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpcmVjdG9yaWVzLkRhdGFEaXJlY3RvcnkobmV3IEZpbGUoIi90bXAvMyIpKSk7CisgICAgICAgIGRpcnMgPSBuZXcgRGlyZWN0b3JpZXMoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkubWV0YWRhdGEoKSwgZGF0YWRpcnMpOwogICAgICAgICBtb2NrID0gbmV3IE1vY2tDRlMoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCksIGRpcnMpOwogICAgICAgICBkYm0gPSBtb2NrLmRpc2tCb3VuZGFyeU1hbmFnZXI7CisgICAgICAgIHRhYmxlRGlycyA9IGRhdGFkaXJzLnN0cmVhbSgpLm1hcChkZGlyIC0+IG1vY2suZ2V0RGlyZWN0b3JpZXMoKS5nZXRMb2NhdGlvbkZvckRpc2soZGRpcikpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEwNSw2ICsxMTgsNzYgQEAKIAogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERpc2tzSW5Cb3VuZHMoKQorICAgIHsKKyAgICAgICAgTGlzdDxQYXJ0aXRpb25Qb3NpdGlvbj4gcHBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgcHBzLmFkZChwcCgxMDApKTsKKyAgICAgICAgcHBzLmFkZChwcCgyMDApKTsKKyAgICAgICAgcHBzLmFkZChwcChMb25nLk1BWF9WQUxVRSkpOyAvLyBsYXN0IHBvc2l0aW9uIGlzIGFsd2F5cyB0aGUgbWF4IHRva2VuCisKKyAgICAgICAgRGlza0JvdW5kYXJpZXMgZGlza0JvdW5kYXJpZXMgPSBuZXcgRGlza0JvdW5kYXJpZXMobW9jaywgZGlycy5nZXRXcml0ZWFibGVMb2NhdGlvbnMoKSwgcHBzLCAwLCAwKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdChkYXRhZGlycy5nZXQoMCkpLCAgICAgICAgICAgICAgICAgIGRpc2tCb3VuZGFyaWVzLmdldERpc2tzSW5Cb3VuZHMoZGsoMTApLCAgZGsoNTApKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KGRhdGFkaXJzLmdldCgyKSksICAgICAgICAgICAgICAgICAgZGlza0JvdW5kYXJpZXMuZ2V0RGlza3NJbkJvdW5kcyhkaygyNTApLCBkayg1MDApKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KGRhdGFkaXJzKSwgICAgICAgICAgICAgICAgICAgICAgICAgZGlza0JvdW5kYXJpZXMuZ2V0RGlza3NJbkJvdW5kcyhkaygwKSwgICBkaygyNTApKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KGRhdGFkaXJzKSwgICAgICAgICAgICAgICAgICAgICAgICAgZGlza0JvdW5kYXJpZXMuZ2V0RGlza3NJbkJvdW5kcyhkaygwKSwgICBkaygyNTApKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KGRhdGFkaXJzLmdldCgxKSwgZGF0YWRpcnMuZ2V0KDIpKSwgZGlza0JvdW5kYXJpZXMuZ2V0RGlza3NJbkJvdW5kcyhkaygxNTApLCBkaygyNTApKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KGRhdGFkaXJzKSwgICAgICAgICAgICAgICAgICAgICAgICAgZGlza0JvdW5kYXJpZXMuZ2V0RGlza3NJbkJvdW5kcyhudWxsLCAgICAgICBkaygyNTApKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhMaXN0cy5uZXdBcnJheUxpc3QoZGF0YWRpcnMuZ2V0KDApKSwgICAgICAgICAgICAgICAgICBkaXNrQm91bmRhcmllcy5nZXREaXNrc0luQm91bmRzKGRrKDApLCAgIGRrKDk5KSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdChkYXRhZGlycy5nZXQoMCkpLCAgICAgICAgICAgICAgICAgIGRpc2tCb3VuZGFyaWVzLmdldERpc2tzSW5Cb3VuZHMoZGsoMCksICAgZGsoMTAwKSkpOyAvLyBwcCgxMDApIGlzIG1heEtleUJvdW5kLCBzbyBkaygxMDApIDwgcHAoMTAwKQorICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdChkYXRhZGlycy5nZXQoMCksIGRhdGFkaXJzLmdldCgxKSksIGRpc2tCb3VuZGFyaWVzLmdldERpc2tzSW5Cb3VuZHMoZGsoMTAwKSwgZGsoMjAwKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdChkYXRhZGlycy5nZXQoMSkpLCAgICAgICAgICAgICAgICAgIGRpc2tCb3VuZGFyaWVzLmdldERpc2tzSW5Cb3VuZHMoZGsoMTAxKSwgZGsoMTAxKSkpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGF0YURpcmVjdG9yaWVzRm9yRmlsZXMoKQorICAgIHsKKyAgICAgICAgaW50IGdlbiA9IDE7CisgICAgICAgIExpc3Q8TXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbj4gdG9rZW5zID0gbW9jay5nZXREaXNrQm91bmRhcmllcygpLnBvc2l0aW9ucy5zdHJlYW0oKS5tYXAodCAtPiAoTXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbil0LmdldFRva2VuKCkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZTsKKworICAgICAgICBNdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuIHNzdGFibGVGaXJzdERpc2sxID0gKE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4pIHBhcnRpdGlvbmVyLm1pZHBvaW50KHBhcnRpdGlvbmVyLmdldE1pbmltdW1Ub2tlbigpLCB0b2tlbnMuZ2V0KDApKTsKKyAgICAgICAgTXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbiBzc3RhYmxlRW5kRGlzazEgICA9IChNdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuKSBwYXJ0aXRpb25lci5taWRwb2ludChzc3RhYmxlRmlyc3REaXNrMSwgICAgICAgICAgICAgdG9rZW5zLmdldCgwKSk7CisgICAgICAgIE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4gc3N0YWJsZUVuZERpc2syICAgPSAoTXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbikgcGFydGl0aW9uZXIubWlkcG9pbnQodG9rZW5zLmdldCgwKSwgICAgICAgICAgICAgICAgIHRva2Vucy5nZXQoMSkpOworICAgICAgICBNdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuIHNzdGFibGVGaXJzdERpc2syID0gKE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4pIHBhcnRpdGlvbmVyLm1pZHBvaW50KHRva2Vucy5nZXQoMCksICAgICAgICAgICAgICAgICBzc3RhYmxlRW5kRGlzazIpOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgY29udGFpbmVkRGlzazEgPSBNb2NrU2NoZW1hLnNzdGFibGUoZ2VuKyssIChsb25nKXNzdGFibGVGaXJzdERpc2sxLmdldFRva2VuVmFsdWUoKSwgKGxvbmcpc3N0YWJsZUVuZERpc2sxLmdldFRva2VuVmFsdWUoKSwgMCwgbW9jayk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgc3RhcnREaXNrMUVuZERpc2syID0gTW9ja1NjaGVtYS5zc3RhYmxlKGdlbisrLCAobG9uZylzc3RhYmxlRmlyc3REaXNrMS5nZXRUb2tlblZhbHVlKCksIChsb25nKXNzdGFibGVFbmREaXNrMi5nZXRUb2tlblZhbHVlKCksIDAsIG1vY2spOworICAgICAgICBTU1RhYmxlUmVhZGVyIGNvbnRhaW5lZERpc2syID0gTW9ja1NjaGVtYS5zc3RhYmxlKGdlbisrLCAobG9uZylzc3RhYmxlRmlyc3REaXNrMi5nZXRUb2tlblZhbHVlKCksIChsb25nKXNzdGFibGVFbmREaXNrMi5nZXRUb2tlblZhbHVlKCksIDAsIG1vY2spOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgZGlzazFCb3VuZGFyeSA9IE1vY2tTY2hlbWEuc3N0YWJsZShnZW4rKywgKGxvbmcpc3N0YWJsZUZpcnN0RGlzazEuZ2V0VG9rZW5WYWx1ZSgpLCAobG9uZyl0b2tlbnMuZ2V0KDApLmdldFRva2VuVmFsdWUoKSwgMCwgbW9jayk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgZGlzazJGdWxsID0gTW9ja1NjaGVtYS5zc3RhYmxlKGdlbisrLCAobG9uZyl0b2tlbnMuZ2V0KDApLmluY3JlYXNlU2xpZ2h0bHkoKS5nZXRUb2tlblZhbHVlKCksIChsb25nKXRva2Vucy5nZXQoMSkuZ2V0VG9rZW5WYWx1ZSgpLCAwLCBtb2NrKTsKKyAgICAgICAgU1NUYWJsZVJlYWRlciBkaXNrM0Z1bGwgPSBNb2NrU2NoZW1hLnNzdGFibGUoZ2VuKyssIChsb25nKXRva2Vucy5nZXQoMSkuaW5jcmVhc2VTbGlnaHRseSgpLmdldFRva2VuVmFsdWUoKSwgKGxvbmcpcGFydGl0aW9uZXIuZ2V0TWF4aW11bVRva2VuKCkuZ2V0VG9rZW5WYWx1ZSgpLCAwLCBtb2NrKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRhYmxlRGlycywgbW9jay5nZXREaXJlY3Rvcmllc0ZvckZpbGVzKEltbXV0YWJsZVNldC5vZigpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KHRhYmxlRGlycy5nZXQoMCkpLCBtb2NrLmdldERpcmVjdG9yaWVzRm9yRmlsZXMoSW1tdXRhYmxlU2V0Lm9mKGNvbnRhaW5lZERpc2sxKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdCh0YWJsZURpcnMuZ2V0KDApLCB0YWJsZURpcnMuZ2V0KDEpKSwgbW9jay5nZXREaXJlY3Rvcmllc0ZvckZpbGVzKEltbXV0YWJsZVNldC5vZihjb250YWluZWREaXNrMSwgc3RhcnREaXNrMUVuZERpc2syKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKExpc3RzLm5ld0FycmF5TGlzdCh0YWJsZURpcnMuZ2V0KDEpKSwgbW9jay5nZXREaXJlY3Rvcmllc0ZvckZpbGVzKEltbXV0YWJsZVNldC5vZihjb250YWluZWREaXNrMikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhMaXN0cy5uZXdBcnJheUxpc3QodGFibGVEaXJzLmdldCgwKSwgdGFibGVEaXJzLmdldCgxKSksIG1vY2suZ2V0RGlyZWN0b3JpZXNGb3JGaWxlcyhJbW11dGFibGVTZXQub2YoY29udGFpbmVkRGlzazEsIGNvbnRhaW5lZERpc2syKSkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KHRhYmxlRGlycy5nZXQoMCkpLCBtb2NrLmdldERpcmVjdG9yaWVzRm9yRmlsZXMoSW1tdXRhYmxlU2V0Lm9mKGRpc2sxQm91bmRhcnkpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTGlzdHMubmV3QXJyYXlMaXN0KHRhYmxlRGlycy5nZXQoMSkpLCBtb2NrLmdldERpcmVjdG9yaWVzRm9yRmlsZXMoSW1tdXRhYmxlU2V0Lm9mKGRpc2syRnVsbCkpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRhYmxlRGlycywgbW9jay5nZXREaXJlY3Rvcmllc0ZvckZpbGVzKEltbXV0YWJsZVNldC5vZihjb250YWluZWREaXNrMSwgZGlzazNGdWxsKSkpOworICAgIH0KKworICAgIHByaXZhdGUgUGFydGl0aW9uUG9zaXRpb24gcHAobG9uZyB0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHQodCkubWF4S2V5Qm91bmQoKTsKKyAgICB9CisgICAgcHJpdmF0ZSBUb2tlbiB0KGxvbmcgdCkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgTXVybXVyM1BhcnRpdGlvbmVyLkxvbmdUb2tlbih0KTsKKyAgICB9CisgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgZGsobG9uZyB0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJEZWNvcmF0ZWRLZXkodCh0KSwgQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKExpc3Q8RGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeT4gZGlyMSwgRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeVtdIGRpcjIpCiAgICAgewogICAgICAgICBpZiAoZGlyMS5zaXplKCkgIT0gZGlyMi5sZW5ndGgpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvSW1wb3J0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0ltcG9ydFRlc3QuamF2YQppbmRleCBmZjg0M2ZhLi45ZGMwNmYwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvSW1wb3J0VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9JbXBvcnRUZXN0LmphdmEKQEAgLTQwLDcgKzQwLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Cb290U3RyYXBwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwpAQCAtMjM2LDcgKzIzNiw3IEBACiAgICAgICAgICAgICBzc3RhYmxlLnNlbGZSZWYoKS5yZWxlYXNlKCk7CiAgICAgICAgICAgICBmb3IgKEZpbGUgZiA6IHNzdGFibGUuZGVzY3JpcHRvci5kaXJlY3RvcnkudHJ5TGlzdCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmLnRvU3RyaW5nKCkuY29udGFpbnMoc3N0YWJsZS5kZXNjcmlwdG9yLmJhc2VGaWxlbmFtZSgpKSkKKyAgICAgICAgICAgICAgICBpZiAoZi50b1N0cmluZygpLmNvbnRhaW5zKHNzdGFibGUuZGVzY3JpcHRvci5iYXNlRmlsZSgpLnRvU3RyaW5nKCkpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJtb3ZlICIgKyBmLnRvUGF0aCgpICsgIiB0byAiICsgYmFja3VwZGlyKTsKICAgICAgICAgICAgICAgICAgICAgRmlsZSBtb3ZlRmlsZVRvID0gbmV3IEZpbGUoYmFja3VwZGlyLCBmLm5hbWUoKSk7CkBAIC0zMTQsOCArMzE0LDggQEAKIAogICAgICAgICBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5jbGVhclVuc2FmZSgpOwogCi0gICAgICAgIFN0cmluZyBmaWxlbmFtZVRvQ29ycnVwdCA9IHNzdGFibGVUb0NvcnJ1cHQuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuU1RBVFMpOwotICAgICAgICB0cnkgKEZpbGVDaGFubmVsIGZpbGVDaGFubmVsID0gbmV3IEZpbGUoZmlsZW5hbWVUb0NvcnJ1cHQpLm5ld1JlYWRXcml0ZUNoYW5uZWwoKSkKKyAgICAgICAgRmlsZSBmaWxlVG9Db3JydXB0ID0gc3N0YWJsZVRvQ29ycnVwdC5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUyk7CisgICAgICAgIHRyeSAoRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBmaWxlVG9Db3JydXB0Lm5ld1JlYWRXcml0ZUNoYW5uZWwoKSkKICAgICAgICAgewogICAgICAgICAgICAgZmlsZUNoYW5uZWwucG9zaXRpb24oMCk7CiAgICAgICAgICAgICBmaWxlQ2hhbm5lbC53cml0ZShCeXRlQnVmZmVyVXRpbC5ieXRlcyhTdHJpbmdVdGlscy5yZXBlYXQoJ3onLCAyKSkpOwpAQCAtNTc0LDggKzU3NCw4IEBACiAgICAgICAgIHNzdGFibGVzLmZvckVhY2gocyAtPiBzLnNlbGZSZWYoKS5yZWxlYXNlKCkpOwogICAgICAgICAvLyBjb3JydXB0IHRoZSBzc3RhYmxlIHdoaWNoIGlzIHN0aWxsIGluIHRoZSBkYXRhIGRpcmVjdG9yeQogICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGVUb0NvcnJ1cHQgPSBzc3RhYmxlcy5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lVG9Db3JydXB0ID0gc3N0YWJsZVRvQ29ycnVwdC5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVEFUUyk7Ci0gICAgICAgIHRyeSAoRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBuZXcgRmlsZShmaWxlbmFtZVRvQ29ycnVwdCkubmV3UmVhZFdyaXRlQ2hhbm5lbCgpKQorICAgICAgICBGaWxlIGZpbGVUb0NvcnJ1cHQgPSBzc3RhYmxlVG9Db3JydXB0LmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLlNUQVRTKTsKKyAgICAgICAgdHJ5IChGaWxlQ2hhbm5lbCBmaWxlQ2hhbm5lbCA9IGZpbGVUb0NvcnJ1cHQubmV3UmVhZFdyaXRlQ2hhbm5lbCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBmaWxlQ2hhbm5lbC5wb3NpdGlvbigwKTsKICAgICAgICAgICAgIGZpbGVDaGFubmVsLndyaXRlKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKFN0cmluZ1V0aWxzLnJlcGVhdCgneicsIDIpKSk7CkBAIC02MTUsNyArNjE1LDcgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwLCByb3dDb3VudCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEZpbGVzLCBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRMaXZlU1NUYWJsZXMoKSk7CiAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogZXhwZWN0ZWRGaWxlcykKLSAgICAgICAgICAgIGFzc2VydFRydWUobmV3IEZpbGUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSkuZXhpc3RzKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpLmV4aXN0cygpKTsKICAgICAgICAgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkudHJ1bmNhdGVCbG9ja2luZygpOwogICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbi53YWl0Rm9yRGVsZXRpb25zKCk7CiAgICAgICAgIGZvciAoRmlsZSBmIDogc3N0YWJsZVRvQ29ycnVwdC5kZXNjcmlwdG9yLmRpcmVjdG9yeS50cnlMaXN0KCkpIC8vIGNsZWFuIHVwIHRoZSBjb3JydXB0IGZpbGVzIHdoaWNoIHRydW5jYXRlIGRvZXMgbm90IGhhbmRsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0tleUNhY2hlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0tleUNhY2hlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzVmMWExLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9LZXlDYWNoZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQXV0b1NhdmluZ0NhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLklDYWNoZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5LZXlDYWNoZUtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2FjaGVTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWZzOwotaW1wb3J0IG9yZy5oYW1jcmVzdC5NYXRjaGVyczsKLWltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOwotaW1wb3J0IG9yZy5tb2NraXRvLmludGVybmFsLnN0dWJiaW5nLmFuc3dlcnMuQW5zd2Vyc1dpdGhEZWxheTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZG9BbnN3ZXI7Ci1pbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKLQotcHVibGljIGNsYXNzIEtleUNhY2hlVGVzdAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRTEgPSAiS2V5Q2FjaGVUZXN0MSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMiA9ICJLZXlDYWNoZVRlc3QyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTEgPSAiU3RhbmRhcmQxIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTIgPSAiU3RhbmRhcmQyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTMgPSAiU3RhbmRhcmQzIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTQgPSAiU3RhbmRhcmQ0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTUgPSAiU3RhbmRhcmQ1IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTYgPSAiU3RhbmRhcmQ2IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTcgPSAiU3RhbmRhcmQ3IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTggPSAiU3RhbmRhcmQ4IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTkgPSAiU3RhbmRhcmQ5IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWTEwID0gIlN0YW5kYXJkMTAiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9GQU1JTFlfSzJfMSA9ICJTdGFuZGFyZDEiOwotCi0KLSAgICBAQmVmb3JlQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7Ci0gICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENPTFVNTl9GQU1JTFkyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDT0xVTU5fRkFNSUxZMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENPTFVNTl9GQU1JTFk1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDT0xVTU5fRkFNSUxZNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENPTFVNTl9GQU1JTFk4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDT0xVTU5fRkFNSUxZOSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTEwKSk7Ci0KLSAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UyLCBDT0xVTU5fRkFNSUxZX0syXzEpKTsKLQotICAgIH0KLQotICAgIEBBZnRlckNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFudXAoKQotICAgIHsKLSAgICAgICAgU2NoZW1hTG9hZGVyLmNsZWFudXBTYXZlZENhY2hlcygpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlTG9hZFNoYWxsb3dJbmRleEVudHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKDApOwotICAgICAgICB0ZXN0S2V5Q2FjaGVMb2FkKENPTFVNTl9GQU1JTFkyKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlDYWNoZUxvYWRJbmRleEluZm9PbkhlYXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhDYWNoZVNpemUoOCk7Ci0gICAgICAgIHRlc3RLZXlDYWNoZUxvYWQoQ09MVU1OX0ZBTUlMWTUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkKFN0cmluZyBjZikgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0KLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgc3RvcmUgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2YpOwotCi0gICAgICAgIC8vIGVtcHR5IHRoZSBjYWNoZQotICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2UuaW52YWxpZGF0ZUtleUNhY2hlKCk7Ci0gICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZSgwLCBLRVlTUEFDRTEsIGNmKTsKLQotICAgICAgICAvLyBpbnNlcnQgZGF0YSBhbmQgZm9yY2UgdG8gZGlzawotICAgICAgICBTY2hlbWFMb2FkZXIuaW5zZXJ0RGF0YShLRVlTUEFDRTEsIGNmLCAwLCAxMDApOwotICAgICAgICBVdGlsLmZsdXNoKHN0b3JlKTsKLQotICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgY2FjaGUKLSAgICAgICAgcmVhZERhdGEoS0VZU1BBQ0UxLCBjZiwgMCwgMTAwKTsKLSAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDEwMCwgS0VZU1BBQ0UxLCBjZik7Ci0KLSAgICAgICAgLy8gcmVhbGx5PyBvdXIgY2FjaGVzIGRvbid0IGltcGxlbWVudCB0aGUgbWFwIGludGVyZmFjZT8gKGhlbmNlIG5vIC5hZGRBbGwpCi0gICAgICAgIE1hcDxLZXlDYWNoZUtleSwgUm93SW5kZXhFbnRyeT4gc2F2ZWRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIE1hcDxLZXlDYWNoZUtleSwgUm93SW5kZXhFbnRyeS5JbmRleEluZm9SZXRyaWV2ZXI+IHNhdmVkSW5mb01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgZm9yIChJdGVyYXRvcjxLZXlDYWNoZUtleT4gaXRlciA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5rZXlJdGVyYXRvcigpOwotICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgICAgS2V5Q2FjaGVLZXkgayA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgaWYgKGsuZGVzYy5rc25hbWUuZXF1YWxzKEtFWVNQQUNFMSkgJiYgay5kZXNjLmNmbmFtZS5lcXVhbHMoY2YpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJvd0luZGV4RW50cnkgcmllID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmdldChrKTsKLSAgICAgICAgICAgICAgICBzYXZlZE1hcC5wdXQoaywgcmllKTsKLSAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdHIgPSByZWFkZXJGb3JLZXkoayk7Ci0gICAgICAgICAgICAgICAgc2F2ZWRJbmZvTWFwLnB1dChrLCByaWUub3BlbldpdGhJbmRleChzc3RyLmdldEluZGV4RmlsZSgpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmb3JjZSB0aGUgY2FjaGUgdG8gZGlzawotICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUuc3VibWl0V3JpdGUoSW50ZWdlci5NQVhfVkFMVUUpLmdldCgpOwotCi0gICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5pbnZhbGlkYXRlS2V5Q2FjaGUoKTsKLSAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDAsIEtFWVNQQUNFMSwgY2YpOwotCi0gICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5sb2FkU2F2ZWQoKTsKLSAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKHNhdmVkTWFwLnNpemUoKSwgS0VZU1BBQ0UxLCBjZik7Ci0KLSAgICAgICAgLy8gcHJvYmFibHkgaXQncyBiZXR0ZXIgdG8gYWRkIGVxdWFscy9oYXNoQ29kZSB0byBSb3dJbmRleEVudHJ5Li4uCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5PiBlbnRyeSA6IHNhdmVkTWFwLmVudHJ5U2V0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvd0luZGV4RW50cnkgZXhwZWN0ZWQgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgUm93SW5kZXhFbnRyeSBhY3R1YWwgPSBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUuZ2V0KGVudHJ5LmdldEtleSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5wb3NpdGlvbiwgYWN0dWFsLnBvc2l0aW9uKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5jb2x1bW5zSW5kZXhDb3VudCgpLCBhY3R1YWwuY29sdW1uc0luZGV4Q291bnQoKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmNvbHVtbnNJbmRleENvdW50KCk7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIGFjdHVhbFNzdHIgPSByZWFkZXJGb3JLZXkoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIHRyeSAoUm93SW5kZXhFbnRyeS5JbmRleEluZm9SZXRyaWV2ZXIgYWN0dWFsSWlyID0gYWN0dWFsLm9wZW5XaXRoSW5kZXgoYWN0dWFsU3N0ci5nZXRJbmRleEZpbGUoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5LkluZGV4SW5mb1JldHJpZXZlciBleHBlY3RlZElpciA9IHNhdmVkSW5mb01hcC5nZXQoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRJaXIuY29sdW1uc0luZGV4KGkpLCBhY3R1YWxJaXIuY29sdW1uc0luZGV4KGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXhwZWN0ZWQuaXNJbmRleGVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmRlbGV0aW9uVGltZSgpLCBhY3R1YWwuZGVsZXRpb25UaW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2F2ZWRJbmZvTWFwLnZhbHVlcygpLmZvckVhY2goaWlyIC0+IHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpaXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgaWlyLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU1NUYWJsZVJlYWRlciByZWFkZXJGb3JLZXkoS2V5Q2FjaGVLZXkgaykKLSAgICB7Ci0gICAgICAgIHJldHVybiBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cyhrLmRlc2Mua3NuYW1lLCBrLmRlc2MuY2ZuYW1lKS5nZXRMaXZlU1NUYWJsZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihzc3RyZWFkZXIgLT4gc3N0cmVhZGVyLmRlc2NyaXB0b3IuaWQgPT0gay5kZXNjLmlkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCkuZ2V0KCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZVNoYWxsb3dJbmRleEVudHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKDApOwotICAgICAgICB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZShDT0xVTU5fRkFNSUxZMyk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZUluZGV4SW5mb09uSGVhcCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleENhY2hlU2l6ZSg4KTsKLSAgICAgICAgdGVzdEtleUNhY2hlTG9hZFdpdGhMb3N0VGFibGUoQ09MVU1OX0ZBTUlMWTYpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZShTdHJpbmcgY2YpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotCi0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRTEpLmdldENvbHVtbkZhbWlseVN0b3JlKGNmKTsKLQotICAgICAgICAvLyBlbXB0eSB0aGUgY2FjaGUKLSAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmludmFsaWRhdGVLZXlDYWNoZSgpOwotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMCwgS0VZU1BBQ0UxLCBjZik7Ci0KLSAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIGZvcmNlIHRvIGRpc2sKLSAgICAgICAgU2NoZW1hTG9hZGVyLmluc2VydERhdGEoS0VZU1BBQ0UxLCBjZiwgMCwgMTAwKTsKLSAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7Ci0KLSAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBmaXJzdEZsdXNoVGFibGVzID0gSW1tdXRhYmxlTGlzdC5jb3B5T2Yoc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkpOwotCi0gICAgICAgIC8vIHBvcHVsYXRlIHRoZSBjYWNoZQotICAgICAgICByZWFkRGF0YShLRVlTUEFDRTEsIGNmLCAwLCAxMDApOwotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMTAwLCBLRVlTUEFDRTEsIGNmKTsKLQotICAgICAgICAvLyBpbnNlcnQgc29tZSBuZXcgZGF0YSBhbmQgZm9yY2UgdG8gZGlzawotICAgICAgICBTY2hlbWFMb2FkZXIuaW5zZXJ0RGF0YShLRVlTUEFDRTEsIGNmLCAxMDAsIDUwKTsKLSAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7Ci0KLSAgICAgICAgLy8gY2hlY2sgdGhhdCBpdCdzIGZpbmUKLSAgICAgICAgcmVhZERhdGEoS0VZU1BBQ0UxLCBjZiwgMTAwLCA1MCk7Ci0gICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZSgxNTAsIEtFWVNQQUNFMSwgY2YpOwotCi0gICAgICAgIC8vIGZvcmNlIHRoZSBjYWNoZSB0byBkaXNrCi0gICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5zdWJtaXRXcml0ZShJbnRlZ2VyLk1BWF9WQUxVRSkuZ2V0KCk7Ci0KLSAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmludmFsaWRhdGVLZXlDYWNoZSgpOwotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMCwgS0VZU1BBQ0UxLCBjZik7Ci0KLSAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgY29udGVudCBpcyB3cml0dGVuIGNvcnJlY3RseQotICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUubG9hZFNhdmVkKCk7Ci0gICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZSgxNTAsIEtFWVNQQUNFMSwgY2YpOwotCi0gICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5pbnZhbGlkYXRlS2V5Q2FjaGUoKTsKLSAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDAsIEtFWVNQQUNFMSwgY2YpOwotCi0gICAgICAgIC8vIG5vdyByZW1vdmUgdGhlIGZpcnN0IHNzdGFibGUgZnJvbSB0aGUgc3RvcmUgdG8gc2ltdWxhdGUgbG9zaW5nIHRoZSBmaWxlCi0gICAgICAgIHN0b3JlLm1hcmtPYnNvbGV0ZShmaXJzdEZsdXNoVGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pOwotCi0gICAgICAgIC8vIGNoZWNrIHRoYXQgcmVhZGluZyBub3cgY29ycmVjdGx5IHNraXBzIG92ZXIgbG9zdCB0YWJsZSBhbmQgcmVhZHMgdGhlIHJlc3QgKENBU1NBTkRSQS0xMDIxOSkKLSAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmxvYWRTYXZlZCgpOwotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoNTAsIEtFWVNQQUNFMSwgY2YpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlU2hhbGxvd0luZGV4RW50cnkoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKDApOwotICAgICAgICB0ZXN0S2V5Q2FjaGUoQ09MVU1OX0ZBTUlMWTEpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlSW5kZXhJbmZvT25IZWFwKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleENhY2hlU2l6ZSg4KTsKLSAgICAgICAgdGVzdEtleUNhY2hlKENPTFVNTl9GQU1JTFk0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEtleUNhY2hlKFN0cmluZyBjZikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotCi0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRTEpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZik7Ci0KLSAgICAgICAgLy8ganVzdCB0byBtYWtlIHN1cmUgdGhhdCBldmVyeXRoaW5nIGlzIGNsZWFuCi0gICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5pbnZhbGlkYXRlS2V5Q2FjaGUoKTsKLQotICAgICAgICAvLyBLZXlDYWNoZSBzaG91bGQgc3RhcnQgYXQgc2l6ZSAwIGlmIHdlJ3JlIGNhY2hpbmcgWCUgb2YgemVybyBkYXRhLgotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMCwgS0VZU1BBQ0UxLCBjZik7Ci0KLSAgICAgICAgTXV0YXRpb24gcm07Ci0KLSAgICAgICAgLy8gaW5zZXJ0cwotICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwgImtleTEiKS5jbHVzdGVyaW5nKCIxIikuYnVpbGQoKS5hcHBseVVuc2FmZSgpOwotICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwgImtleTIiKS5jbHVzdGVyaW5nKCIyIikuYnVpbGQoKS5hcHBseVVuc2FmZSgpOwotCi0gICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIFNTVGFibGUKLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotCi0gICAgICAgIC8vIHJlYWRzIHRvIGNhY2hlIGtleSBwb3NpdGlvbgotICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMsICJrZXkxIikuYnVpbGQoKSk7Ci0gICAgICAgIFV0aWwuZ2V0QWxsKFV0aWwuY21kKGNmcywgImtleTIiKS5idWlsZCgpKTsKLQotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMiwgS0VZU1BBQ0UxLCBjZik7Ci0KLSAgICAgICAgU2V0PFNTVGFibGVSZWFkZXI+IHJlYWRlcnMgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCk7Ci0gICAgICAgIFJlZnM8U1NUYWJsZVJlYWRlcj4gcmVmcyA9IFJlZnMudHJ5UmVmKHJlYWRlcnMpOwotICAgICAgICBpZiAocmVmcyA9PSBudWxsKQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0gICAgICAgIFV0aWwuY29tcGFjdEFsbChjZnMsIEludGVnZXIuTUFYX1ZBTFVFKS5nZXQoKTsKLSAgICAgICAgYm9vbGVhbiBub0Vhcmx5T3BlbiA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlUHJlZW1wdGl2ZU9wZW5JbnRlcnZhbEluTWlCKCkgPCAwOwotCi0gICAgICAgIC8vIGFmdGVyIGNvbXBhY3Rpb24gY2FjaGUgc2hvdWxkIGhhdmUgZW50cmllcyBmb3IgbmV3IFNTVGFibGVzLAotICAgICAgICAvLyBidXQgc2luY2Ugd2UgaGF2ZSBrZXB0IGEgcmVmZXJlbmNlIHRvIHRoZSBvbGQgc3N0YWJsZXMsCi0gICAgICAgIC8vIGlmIHdlIGhhZCAyIGtleXMgaW4gY2FjaGUgcHJldmlvdXNseSBpdCBzaG91bGQgYmVjb21lIDQKLSAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKG5vRWFybHlPcGVuID8gMiA6IDQsIEtFWVNQQUNFMSwgY2YpOwotCi0gICAgICAgIHJlZnMucmVsZWFzZSgpOwotCi0gICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uLndhaXRGb3JEZWxldGlvbnMoKTsKLQotICAgICAgICAvLyBhZnRlciByZWxlYXNpbmcgdGhlIHJlZmVyZW5jZSB0aGlzIHNob3VsZCBkcm9wIHRvIDIKLSAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDIsIEtFWVNQQUNFMSwgY2YpOwotCi0gICAgICAgIC8vIHJlLXJlYWQgc2FtZSBrZXlzIHRvIHZlcmlmeSB0aGF0IGtleSBjYWNoZSBkaWRuJ3QgZ3JvdyBmdXJ0aGVyCi0gICAgICAgIFV0aWwuZ2V0QWxsKFV0aWwuY21kKGNmcywgImtleTEiKS5idWlsZCgpKTsKLSAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoY2ZzLCAia2V5MiIpLmJ1aWxkKCkpOwotCi0gICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZShub0Vhcmx5T3BlbiA/IDQgOiAyLCBLRVlTUEFDRTEsIGNmKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlDYWNoZUxvYWRaZXJvQ2FjaGVMb2FkVGltZSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDYWNoZUxvYWRUaW1lb3V0KDApOwotICAgICAgICBTdHJpbmcgY2YgPSBDT0xVTU5fRkFNSUxZNzsKLQotICAgICAgICBjcmVhdGVBbmRJbnZhbGlkYXRlQ2FjaGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChQYWlyLmNyZWF0ZShLRVlTUEFDRTEsIGNmKSksIDEwMCk7Ci0KLSAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmxvYWRTYXZlZCgpOwotCi0gICAgICAgIC8vIEhlcmUgbWF4IHRpbWUgdG8gbG9hZCBjYWNoZSBpcyB6ZXJvIHdoaWNoIG1lYW5zIG5vIHRpbWUgbGVmdCB0byBsb2FkIGNhY2hlLiBTbyB0aGUga2V5Q2FjaGUgc2l6ZSBzaG91bGQKLSAgICAgICAgLy8gYmUgemVybyBhZnRlciBsb2FkU2F2ZWQoKS4KLSAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDAsIEtFWVNQQUNFMSwgY2YpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlTG9hZFR3b1RhYmxlc1RpbWUoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q2FjaGVMb2FkVGltZW91dCg2MCk7Ci0gICAgICAgIFN0cmluZyBjb2x1bW5GYW1pbHkxID0gQ09MVU1OX0ZBTUlMWTg7Ci0gICAgICAgIFN0cmluZyBjb2x1bW5GYW1pbHkyID0gQ09MVU1OX0ZBTUlMWV9LMl8xOwotICAgICAgICBpbnQgbnVtYmVyT2ZSb3dzID0gMTAwOwotICAgICAgICBMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiB0YWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oMik7Ci0gICAgICAgIHRhYmxlcy5hZGQoUGFpci5jcmVhdGUoS0VZU1BBQ0UxLCBjb2x1bW5GYW1pbHkxKSk7Ci0gICAgICAgIHRhYmxlcy5hZGQoUGFpci5jcmVhdGUoS0VZU1BBQ0UyLCBjb2x1bW5GYW1pbHkyKSk7Ci0KLSAgICAgICAgY3JlYXRlQW5kSW52YWxpZGF0ZUNhY2hlKHRhYmxlcywgbnVtYmVyT2ZSb3dzKTsKLQotICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUubG9hZFNhdmVkKCk7Ci0KLSAgICAgICAgLy8gSGVyZSBtYXggdGltZSB0byBsb2FkIGNhY2hlIGlzIG5lZ2F0aXZlIHdoaWNoIG1lYW5zIG5vIHRpbWUgbGVmdCB0byBsb2FkIGNhY2hlLiBTbyB0aGUga2V5Q2FjaGUgc2l6ZSBzaG91bGQKLSAgICAgICAgLy8gYmUgemVybyBhZnRlciBsb2FkLgotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUobnVtYmVyT2ZSb3dzLCBLRVlTUEFDRTEsIGNvbHVtbkZhbWlseTEpOwotICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUobnVtYmVyT2ZSb3dzLCBLRVlTUEFDRTIsIGNvbHVtbkZhbWlseTIpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlDYWNoZUxvYWRDYWNoZUxvYWRUaW1lRXhjZWVkaW5nTGltaXQoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q2FjaGVMb2FkVGltZW91dCgyKTsKLSAgICAgICAgaW50IGRlbGF5TWlsbGlzID0gMTAwMDsKLSAgICAgICAgaW50IG51bWJlck9mUm93cyA9IDEwMDsKLQotICAgICAgICBTdHJpbmcgY2YgPSBDT0xVTU5fRkFNSUxZOTsKLQotICAgICAgICBjcmVhdGVBbmRJbnZhbGlkYXRlQ2FjaGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChQYWlyLmNyZWF0ZShLRVlTUEFDRTEsIGNmKSksIG51bWJlck9mUm93cyk7Ci0KLSAgICAgICAgLy8gVGVzdGluZyBjYWNoZSBsb2FkLiBIZXJlIHVzaW5nIGN1c3RvbSBidWlsdCBBdXRvU2F2aW5nQ2FjaGUgaW5zdGFuY2UgYXMgc2ltdWxhdGluZyBkZWxheSBpcyBub3QgcG9zc2libGUgd2l0aAotICAgICAgICAvLyAnQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlJy4gJ0F1dG9TYXZpbmdDYWNoZS5sb2FkU2F2ZWQoKScgaXMgcmV0dXJuaW5nIG5vLm9mIGVudHJpZXMgbG9hZGVkIHNvIHdlIGRvbid0IG5lZWQKLSAgICAgICAgLy8gdG8gaW5zdGFudGlhdGUgSUNhY2hlLmNsYXNzLgotICAgICAgICBDYWNoZVNlcnZpY2UuS2V5Q2FjaGVTZXJpYWxpemVyIGtleUNhY2hlU2VyaWFsaXplciA9IG5ldyBDYWNoZVNlcnZpY2UuS2V5Q2FjaGVTZXJpYWxpemVyKCk7Ci0gICAgICAgIENhY2hlU2VydmljZS5LZXlDYWNoZVNlcmlhbGl6ZXIga2V5Q2FjaGVTZXJpYWxpemVyU3B5ID0gTW9ja2l0by5zcHkoa2V5Q2FjaGVTZXJpYWxpemVyKTsKLSAgICAgICAgQXV0b1NhdmluZ0NhY2hlIGF1dG9TYXZpbmdDYWNoZSA9IG5ldyBBdXRvU2F2aW5nQ2FjaGUobW9jayhJQ2FjaGUuY2xhc3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVNlcnZpY2UuQ2FjaGVUeXBlLktFWV9DQUNIRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Q2FjaGVTZXJpYWxpemVyU3B5KTsKLQotICAgICAgICBkb0Fuc3dlcihuZXcgQW5zd2Vyc1dpdGhEZWxheShkZWxheU1pbGxpcywgYW5zd2VyIC0+IGtleUNhY2hlU2VyaWFsaXplci5kZXNlcmlhbGl6ZShhbnN3ZXIuZ2V0QXJndW1lbnQoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlci5nZXRBcmd1bWVudCgxKSkgKSkKLSAgICAgICAgICAgICAgIC53aGVuKGtleUNhY2hlU2VyaWFsaXplclNweSkuZGVzZXJpYWxpemUoYW55KERhdGFJbnB1dFBsdXMuY2xhc3MpLCBhbnkoQ29sdW1uRmFtaWx5U3RvcmUuY2xhc3MpKTsKLQotICAgICAgICBsb25nIG1heEV4cGVjdGVkS2V5Q2FjaGUgPSBNYXRoLm1pbihudW1iZXJPZlJvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKyBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKERhdGFiYXNlRGVzY3JpcHRvci5nZXRDYWNoZUxvYWRUaW1lb3V0KCkpIC8gZGVsYXlNaWxsaXMpOwotCi0gICAgICAgIGxvbmcga2V5c0xvYWRlZCA9IGF1dG9TYXZpbmdDYWNoZS5sb2FkU2F2ZWQoKTsKLSAgICAgICAgYXNzZXJ0VGhhdChrZXlzTG9hZGVkLCBNYXRjaGVycy5sZXNzVGhhbk9yRXF1YWxUbyhtYXhFeHBlY3RlZEtleUNhY2hlKSk7Ci0gICAgICAgIGFzc2VydE5vdEVxdWFscygwLCBrZXlzTG9hZGVkKTsKLSAgICAgICAgTW9ja2l0by52ZXJpZnkoa2V5Q2FjaGVTZXJpYWxpemVyU3B5LCBNb2NraXRvLnRpbWVzKDEpKS5jbGVhbnVwQWZ0ZXJEZXNlcmlhbGl6ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBbmRJbnZhbGlkYXRlQ2FjaGUoTGlzdDxQYWlyPFN0cmluZywgU3RyaW5nPj4gdGFibGVzLCBpbnQgbnVtYmVyT2ZSb3dzKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0KLSAgICAgICAgLy8gZW1wdHkgdGhlIGNhY2hlCi0gICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5pbnZhbGlkYXRlS2V5Q2FjaGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5zaXplKCkpOwotCi0gICAgICAgIGZvcihQYWlyPFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHRhYmxlcykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGtleXNwYWNlID0gZW50cnkubGVmdCgpOwotICAgICAgICAgICAgU3RyaW5nIGNmID0gZW50cnkucmlnaHQoKTsKLSAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0gS2V5c3BhY2Uub3BlbihrZXlzcGFjZSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2YpOwotCi0gICAgICAgICAgICAvLyBpbnNlcnQgZGF0YSBhbmQgZm9yY2UgdG8gZGlzawotICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmluc2VydERhdGEoa2V5c3BhY2UsIGNmLCAwLCBudW1iZXJPZlJvd3MpOwotICAgICAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKFBhaXI8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogdGFibGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcga2V5c3BhY2UgPSBlbnRyeS5sZWZ0KCk7Ci0gICAgICAgICAgICBTdHJpbmcgY2YgPSBlbnRyeS5yaWdodCgpOwotICAgICAgICAgICAgLy8gcG9wdWxhdGUgdGhlIGNhY2hlCi0gICAgICAgICAgICByZWFkRGF0YShrZXlzcGFjZSwgY2YsIDAsIG51bWJlck9mUm93cyk7Ci0gICAgICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUobnVtYmVyT2ZSb3dzLCBrZXlzcGFjZSwgY2YpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZm9yY2UgdGhlIGNhY2hlIHRvIGRpc2sKLSAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLnN1Ym1pdFdyaXRlKENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5zaXplKCkpLmdldCgpOwotCi0gICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5pbnZhbGlkYXRlS2V5Q2FjaGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5zaXplKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVhZERhdGEoU3RyaW5nIGtleXNwYWNlLCBTdHJpbmcgY29sdW1uRmFtaWx5LCBpbnQgc3RhcnRSb3csIGludCBudW1iZXJPZlJvd3MpCi0gICAgewotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBzdG9yZSA9IEtleXNwYWNlLm9wZW4oa2V5c3BhY2UpLmdldENvbHVtbkZhbWlseVN0b3JlKGNvbHVtbkZhbWlseSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZSb3dzOyBpKyspCi0gICAgICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChzdG9yZSwgImtleSIgKyAoaSArIHN0YXJ0Um93KSkuaW5jbHVkZVJvdygiY29sIiArIChpICsgc3RhcnRSb3cpKS5idWlsZCgpKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRLZXlDYWNoZVNpemUoaW50IGV4cGVjdGVkLCBTdHJpbmcga2V5c3BhY2UsIFN0cmluZyBjb2x1bW5GYW1pbHkpCi0gICAgewotICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgIGZvciAoSXRlcmF0b3I8S2V5Q2FjaGVLZXk+IGl0ZXIgPSBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUua2V5SXRlcmF0b3IoKTsKLSAgICAgICAgICAgICBpdGVyLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIEtleUNhY2hlS2V5IGsgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGlmIChrLmRlc2Mua3NuYW1lLmVxdWFscyhrZXlzcGFjZSkgJiYgay5kZXNjLmNmbmFtZS5lcXVhbHMoY29sdW1uRmFtaWx5KSkKLSAgICAgICAgICAgICAgICBzaXplKys7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzaXplKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvS2V5c3BhY2VUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvS2V5c3BhY2VUZXN0LmphdmEKaW5kZXggMjQ0NWZlMy4uMmM1ZTc5MyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL0tleXNwYWNlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9LZXlzcGFjZVRlc3QuamF2YQpAQCAtMTksMjggKzE5LDM2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5JZGVudGlmaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5DbHVzdGVyaW5nSW5kZXhTbGljZUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5EYXRhTGltaXRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Sb3dGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25JdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3dJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uSXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5BYnN0cmFjdFJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGVhcmFibGVIaXN0b2dyYW07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBwdWJsaWMgY2xhc3MgS2V5c3BhY2VUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCiB7CkBAIC01Myw3ICs2MSw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFVudHlwZWRSZXN1bHRTZXQgZXhlY3V0ZShTdHJpbmcgcXVlcnksIE9iamVjdC4uLiB2YWx1ZXMpIHRocm93cyBUaHJvd2FibGUKKyAgICBwcm90ZWN0ZWQgVW50eXBlZFJlc3VsdFNldCBleGVjdXRlKFN0cmluZyBxdWVyeSwgT2JqZWN0Li4uIHZhbHVlcykKICAgICB7CiAgICAgICAgIHJldHVybiBleGVjdXRlRm9ybWF0dGVkUXVlcnkoZm9ybWF0UXVlcnkoS0VZU1BBQ0VfUEVSX1RFU1QsIHF1ZXJ5KSwgdmFsdWVzKTsKICAgICB9CkBAIC00MDcsOCArNDE1LDExIEBACiAKICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgd2UgZG8gaW5kZWVkIGhhdmUgbXVsdGlwbGUgaW5kZXggZW50cmllcwogICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIFJvd0luZGV4RW50cnk8Pz4gaW5kZXhFbnRyeSA9IHNzdGFibGUuZ2V0UG9zaXRpb24oVXRpbC5kaygiMCIpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKLSAgICAgICAgYXNzZXJ0IGluZGV4RW50cnkuY29sdW1uc0luZGV4Q291bnQoKSA+IDI7CisgICAgICAgIGlmIChzc3RhYmxlIGluc3RhbmNlb2YgQmlnVGFibGVSZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFic3RyYWN0Um93SW5kZXhFbnRyeSBpbmRleEVudHJ5ID0gKChCaWdUYWJsZVJlYWRlcikgc3N0YWJsZSkuZ2V0Um93SW5kZXhFbnRyeShVdGlsLmRrKCIwIiksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOworICAgICAgICAgICAgYXNzZXJ0IGluZGV4RW50cnkuYmxvY2tDb3VudCgpID4gMjsKKyAgICAgICAgfQogCiAgICAgICAgIHZhbGlkYXRlU2xpY2VMYXJnZShjZnMpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9OYXRpdmVDZWxsVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL05hdGl2ZUNlbGxUZXN0LmphdmEKaW5kZXggYzcwYmIzYi4uMTkwYmRjZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL05hdGl2ZUNlbGxUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL05hdGl2ZUNlbGxUZXN0LmphdmEKQEAgLTExOCw3ICsxMTgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbklkZW50aWZpZXIuZ2V0SW50ZXJuZWQodXVpZC50b1N0cmluZygpLCBmYWxzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXggPyBuZXcgU2V0VHlwZTw+KEJ5dGVzVHlwZS5pbnN0YW5jZSwgdHJ1ZSkgOiBCeXRlc1R5cGUuaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEuS2luZC5SRUdVTEFSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YS5LaW5kLlJFR1VMQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQ2VsbDw/PiBybmRjZWxsKENvbHVtbk1ldGFkYXRhIGNvbCkKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9SZWFkQ29tbWFuZFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9SZWFkQ29tbWFuZFRlc3QuamF2YQppbmRleCA0M2E3OTUyLi5iZjI3MmI4IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUmVhZENvbW1hbmRUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1JlYWRDb21tYW5kVGVzdC5qYXZhCkBAIC01Niw2ICs1Niw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5RdWVyeUNhbmNlbGxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlcjsKQEAgLTIzMiw3ICsyMzMsMTYgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIFV0aWwuZ2V0QWxsKHJlYWRDb21tYW5kKS5zaXplKCkpOwogCiAgICAgICAgIHJlYWRDb21tYW5kLmFib3J0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBVdGlsLmdldEFsbChyZWFkQ29tbWFuZCkuc2l6ZSgpKTsKKyAgICAgICAgYm9vbGVhbiBjYW5jZWxsZWQgPSBmYWxzZTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFV0aWwuZ2V0QWxsKHJlYWRDb21tYW5kKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUXVlcnlDYW5jZWxsZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGNhbmNlbGxlZCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI2Myw3ICsyNzMsMTYgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBhcnRpdGlvbnMuZ2V0KDApLnJvd0NvdW50KCkpOwogCiAgICAgICAgIHJlYWRDb21tYW5kLmFib3J0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBVdGlsLmdldEFsbChyZWFkQ29tbWFuZCkuc2l6ZSgpKTsKKyAgICAgICAgYm9vbGVhbiBjYW5jZWxsZWQgPSBmYWxzZTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFV0aWwuZ2V0QWxsKHJlYWRDb21tYW5kKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUXVlcnlDYW5jZWxsZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGNhbmNlbGxlZCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI5NCw3ICszMTMsMTYgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBhcnRpdGlvbnMuZ2V0KDApLnJvd0NvdW50KCkpOwogCiAgICAgICAgIHJlYWRDb21tYW5kLmFib3J0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBVdGlsLmdldEFsbChyZWFkQ29tbWFuZCkuc2l6ZSgpKTsKKyAgICAgICAgYm9vbGVhbiBjYW5jZWxsZWQgPSBmYWxzZTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIFV0aWwuZ2V0QWxsKHJlYWRDb21tYW5kKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUXVlcnlDYW5jZWxsZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGNhbmNlbGxlZCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9SZXBhaXJlZERhdGFUb21ic3RvbmVzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1JlcGFpcmVkRGF0YVRvbWJzdG9uZXNUZXN0LmphdmEKaW5kZXggYmIyNzJhZi4uZGMyZWFhZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1JlcGFpcmVkRGF0YVRvbWJzdG9uZXNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1JlcGFpcmVkRGF0YVRvbWJzdG9uZXNUZXN0LmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CkBAIC0yNjEsNiArMjYyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJvd0l0ZXIuaGFzTmV4dCgpKSByb3dJdGVyLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzEyLDQgKzMxNyw0IEBACiAgICAgICAgIHNzdGFibGUucmVsb2FkU1NUYWJsZU1ldGFkYXRhKCk7CiAgICAgICAgIGNmcy5nZXRUcmFja2VyKCkubm90aWZ5U1NUYWJsZVJlcGFpcmVkU3RhdHVzQ2hhbmdlZChDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3N0YWJsZSkpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUm93Q2FjaGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUm93Q2FjaGVUZXN0LmphdmEKaW5kZXggMGJmOGM1ZC4uNGIzN2U2OSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1Jvd0NhY2hlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9Sb3dDYWNoZVRlc3QuamF2YQpAQCAtNTQsNiArNTQsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX09SR19DQUZGSU5JVEFTX09IQ19TRUdNRU5UQ09VTlQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKIAogcHVibGljIGNsYXNzIFJvd0NhY2hlVGVzdApAQCAtNjYsNyArNjcsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuY2FmZmluaXRhcy5vaGMuc2VnbWVudENvdW50IiwgIjE2Iik7CisgICAgICAgIFRFU1RfT1JHX0NBRkZJTklUQVNfT0hDX1NFR01FTlRDT1VOVC5zZXRJbnQoMTYpOwogICAgICAgICBTY2hlbWFMb2FkZXIucHJlcGFyZVNlcnZlcigpOwogICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2UoS0VZU1BBQ0VfQ0FDSEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1Jvd0luZGV4RW50cnlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUm93SW5kZXhFbnRyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmYjU3ZC4uMDAwMDAwMAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvUm93SW5kZXhFbnRyeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuSW50czsKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5JTWVhc3VyYWJsZU1lbW9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVRhYmxlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29sdW1uaXRlcmF0b3IuQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Mb25nVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkltbXV0YWJsZUJUcmVlUGFydGl0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQWJzdHJhY3RVbmZpbHRlcmVkUm93SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5CVHJlZVJvdzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJ1ZmZlckNlbGw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Db2x1bW5EYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRW5jb2RpbmdTdGF0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJhbmdlVG9tYnN0b25lTWFya2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuU2VyaWFsaXphdGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkU2VyaWFsaXplcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4SW5mbzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRmx1c2hPYnNlcnZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLkxvbmdTZXJpYWxpemVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk9iamVjdFNpemVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ0cmVlLkJUcmVlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLXB1YmxpYyBjbGFzcyBSb3dJbmRleEVudHJ5VGVzdCBleHRlbmRzIENRTFRlc3RlcgotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8QWJzdHJhY3RUeXBlPD8+PiBjbHVzdGVyVHlwZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KExvbmdUeXBlLmluc3RhbmNlKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wID0gbmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKGNsdXN0ZXJUeXBlcyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gZHVtbXlfMTAwayA9IG5ldyBieXRlWzEwMDAwMF07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDbHVzdGVyaW5nPD8+IGNuKGxvbmcgbCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBVdGlsLmNsdXN0ZXJpbmcoY29tcCwgbCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QzExMjA2QWdhaW5zdFByZXZpb3VzQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhDYWNoZVNpemUoOTk5OTkpOwotICAgICAgICB0ZXN0QzExMjA2QWdhaW5zdFByZXZpb3VzKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0QzExMjA2QWdhaW5zdFByZXZpb3VzU2hhbGxvdygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleENhY2hlU2l6ZSgwKTsKLSAgICAgICAgdGVzdEMxMTIwNkFnYWluc3RQcmV2aW91cygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEMxMTIwNkFnYWluc3RQcmV2aW91cygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIHBhcnRpdGlvbiB3aXRob3V0IEluZGV4SW5mbwotICAgICAgICB0cnkgKERvdWJsZVNlcmlhbGl6ZXIgZG91YmxlU2VyaWFsaXplciA9IG5ldyBEb3VibGVTZXJpYWxpemVyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZVNlcmlhbGl6ZXIuYnVpbGQobnVsbCwgcGFydGl0aW9uS2V5KDQyTCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY24oNDIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRvdWJsZVNlcmlhbGl6ZXIucmllT2xkU2VyaWFsaXplZCwgZG91YmxlU2VyaWFsaXplci5yaWVOZXdTZXJpYWxpemVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHBhcnRpdGlvbiB3aXRoIG11bHRpcGxlIEluZGV4SW5mbwotICAgICAgICB0cnkgKERvdWJsZVNlcmlhbGl6ZXIgZG91YmxlU2VyaWFsaXplciA9IG5ldyBEb3VibGVTZXJpYWxpemVyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZVNlcmlhbGl6ZXIuYnVpbGQobnVsbCwgcGFydGl0aW9uS2V5KDQyTCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoY24oNDIpLCBjbig0MyksIGNuKDQ0KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkb3VibGVTZXJpYWxpemVyLnJpZU9sZFNlcmlhbGl6ZWQsIGRvdWJsZVNlcmlhbGl6ZXIucmllTmV3U2VyaWFsaXplZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwYXJ0aXRpb24gd2l0aCBtdWx0aXBsZSBJbmRleEluZm8KLSAgICAgICAgdHJ5IChEb3VibGVTZXJpYWxpemVyIGRvdWJsZVNlcmlhbGl6ZXIgPSBuZXcgRG91YmxlU2VyaWFsaXplcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGVTZXJpYWxpemVyLmJ1aWxkKG51bGwsIHBhcnRpdGlvbktleSg0MkwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KGNuKDQyKSwgY24oNDMpLCBjbig0NCksIGNuKDQ1KSwgY24oNDYpLCBjbig0NyksIGNuKDQ4KSwgY24oNDkpLCBjbig1MCksIGNuKDUxKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkb3VibGVTZXJpYWxpemVyLnJpZU9sZFNlcmlhbGl6ZWQsIGRvdWJsZVNlcmlhbGl6ZXIucmllTmV3U2VyaWFsaXplZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5KGxvbmcgbCkKLSAgICB7Ci0gICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gTG9uZ1NlcmlhbGl6ZXIuaW5zdGFuY2Uuc2VyaWFsaXplKGwpOwotICAgICAgICBUb2tlbiB0b2tlbiA9IE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZS5nZXRUb2tlbihrZXkpOwotICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlckRlY29yYXRlZEtleSh0b2tlbiwga2V5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEb3VibGVTZXJpYWxpemVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQotICAgIHsKLSAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9Ci0gICAgICAgICAgICBDcmVhdGVUYWJsZVN0YXRlbWVudC5wYXJzZSgiQ1JFQVRFIFRBQkxFIHBpcGUuZGV2X251bGwgKHBrIGJpZ2ludCwgY2sgYmlnaW50LCB2YWwgdGV4dCwgUFJJTUFSWSBLRVkocGssIGNrKSkiLCAiZm9vIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gQmlnRm9ybWF0LmxhdGVzdFZlcnNpb247Ci0KLSAgICAgICAgRGVsZXRpb25UaW1lIGRlbGV0aW9uSW5mbyA9IG5ldyBEZWxldGlvblRpbWUoRkJVdGlsaXRpZXMudGltZXN0YW1wTWljcm9zKCksIEZCVXRpbGl0aWVzLm5vd0luU2Vjb25kcygpKTsKLSAgICAgICAgTGl2ZW5lc3NJbmZvIHByaW1hcnlLZXlMaXZlbmVzc0luZm8gPSBMaXZlbmVzc0luZm8uRU1QVFk7Ci0gICAgICAgIFJvdy5EZWxldGlvbiBkZWxldGlvbiA9IFJvdy5EZWxldGlvbi5MSVZFOwotCi0gICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyID0gbmV3IFNlcmlhbGl6YXRpb25IZWFkZXIodHJ1ZSwgbWV0YWRhdGEsIG1ldGFkYXRhLnJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zKCksIEVuY29kaW5nU3RhdHMuTk9fU1RBVFMpOwotCi0gICAgICAgIC8vIGNyZWF0ZSBDLTExMjA2ICsgb2xkIHNlcmlhbGl6ZXIgaW5zdGFuY2VzCi0gICAgICAgIFJvd0luZGV4RW50cnkuSW5kZXhTZXJpYWxpemVyIHJpZVNlcmlhbGl6ZXIgPSBuZXcgUm93SW5kZXhFbnRyeS5TZXJpYWxpemVyKHZlcnNpb24sIGhlYWRlcik7Ci0gICAgICAgIFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuU2VyaWFsaXplciBvbGRTZXJpYWxpemVyID0gbmV3IFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuU2VyaWFsaXplcihtZXRhZGF0YSwgdmVyc2lvbiwgaGVhZGVyKTsKLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyZXNvdXJjZSIsICJJT1Jlc291cmNlT3BlbmVkQnV0Tm90U2FmZWx5Q2xvc2VkIiB9KQotICAgICAgICBmaW5hbCBEYXRhT3V0cHV0QnVmZmVyIHJpZU91dHB1dCA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKDEwMjQpOwotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyZXNvdXJjZSIsICJJT1Jlc291cmNlT3BlbmVkQnV0Tm90U2FmZWx5Q2xvc2VkIiB9KQotICAgICAgICBmaW5hbCBEYXRhT3V0cHV0QnVmZmVyIG9sZE91dHB1dCA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKDEwMjQpOwotCi0gICAgICAgIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXIgZGF0YVdyaXRlck5ldzsKLSAgICAgICAgZmluYWwgU2VxdWVudGlhbFdyaXRlciBkYXRhV3JpdGVyT2xkOwotICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5JbmRleCBjb2x1bW5JbmRleDsKLQotICAgICAgICBSb3dJbmRleEVudHJ5IHJpZU5ldzsKLSAgICAgICAgQnl0ZUJ1ZmZlciByaWVOZXdTZXJpYWxpemVkOwotICAgICAgICBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHJpZU9sZDsKLSAgICAgICAgQnl0ZUJ1ZmZlciByaWVPbGRTZXJpYWxpemVkOwotCi0gICAgICAgIERvdWJsZVNlcmlhbGl6ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlck9wdGlvbiBvcHRpb24gPSBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uLm5ld0J1aWxkZXIoKS5idWZmZXJTaXplKDEwMjQpLmJ1aWxkKCk7Ci0gICAgICAgICAgICBGaWxlIGYgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoIlJvd0luZGV4RW50cnlUZXN0LSIsICJkYiIpOwotICAgICAgICAgICAgZGF0YVdyaXRlck5ldyA9IG5ldyBTZXF1ZW50aWFsV3JpdGVyKGYsIG9wdGlvbik7Ci0gICAgICAgICAgICBjb2x1bW5JbmRleCA9IG5ldyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5JbmRleChoZWFkZXIsIGRhdGFXcml0ZXJOZXcsIHZlcnNpb24sIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmllU2VyaWFsaXplci5pbmRleEluZm9TZXJpYWxpemVyKCkpOwotCi0gICAgICAgICAgICBmID0gRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlKCJSb3dJbmRleEVudHJ5VGVzdC0iLCAiZGIiKTsKLSAgICAgICAgICAgIGRhdGFXcml0ZXJPbGQgPSBuZXcgU2VxdWVudGlhbFdyaXRlcihmLCBvcHRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRhdGFXcml0ZXJOZXcuY2xvc2UoKTsKLSAgICAgICAgICAgIGRhdGFXcml0ZXJPbGQuY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYnVpbGQoUm93IHN0YXRpY1JvdywgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSwKLSAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPENsdXN0ZXJpbmc8Pz4+IGNsdXN0ZXJpbmdzLCBsb25nIHN0YXJ0UG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0KLSAgICAgICAgICAgIEl0ZXJhdG9yPENsdXN0ZXJpbmc8Pz4+IGNsdXN0ZXJpbmdJdGVyID0gY2x1c3RlcmluZ3MuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGNvbHVtbkluZGV4LmJ1aWxkUm93SW5kZXgobWFrZVJvd0l0ZXIoc3RhdGljUm93LCBwYXJ0aXRpb25LZXksIGNsdXN0ZXJpbmdJdGVyLCBkYXRhV3JpdGVyTmV3KSk7Ci0gICAgICAgICAgICByaWVOZXcgPSBSb3dJbmRleEVudHJ5LmNyZWF0ZShzdGFydFBvc2l0aW9uLCAwTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0aW9uSW5mbywgY29sdW1uSW5kZXguaGVhZGVyTGVuZ3RoLCBjb2x1bW5JbmRleC5jb2x1bW5JbmRleENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXguaW5kZXhJbmZvU2VyaWFsaXplZFNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkluZGV4LmluZGV4U2FtcGxlcygpLCBjb2x1bW5JbmRleC5vZmZzZXRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWVTZXJpYWxpemVyLmluZGV4SW5mb1NlcmlhbGl6ZXIoKSk7Ci0gICAgICAgICAgICByaWVTZXJpYWxpemVyLnNlcmlhbGl6ZShyaWVOZXcsIHJpZU91dHB1dCwgY29sdW1uSW5kZXguYnVmZmVyKCkpOwotICAgICAgICAgICAgcmllTmV3U2VyaWFsaXplZCA9IHJpZU91dHB1dC5idWZmZXIoKS5kdXBsaWNhdGUoKTsKLQotICAgICAgICAgICAgSXRlcmF0b3I8Q2x1c3RlcmluZzw/Pj4gY2x1c3RlcmluZ0l0ZXIyID0gY2x1c3RlcmluZ3MuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIENvbHVtbkluZGV4IGNvbHVtbkluZGV4ID0gUm93SW5kZXhFbnRyeVRlc3QuQ29sdW1uSW5kZXgud3JpdGVBbmRCdWlsZEluZGV4KG1ha2VSb3dJdGVyKHN0YXRpY1JvdywgcGFydGl0aW9uS2V5LCBjbHVzdGVyaW5nSXRlcjIsIGRhdGFXcml0ZXJPbGQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVdyaXRlck9sZCwgaGVhZGVyLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbik7Ci0gICAgICAgICAgICByaWVPbGQgPSBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5LmNyZWF0ZShzdGFydFBvc2l0aW9uLCBkZWxldGlvbkluZm8sIGNvbHVtbkluZGV4KTsKLSAgICAgICAgICAgIG9sZFNlcmlhbGl6ZXIuc2VyaWFsaXplKHJpZU9sZCwgb2xkT3V0cHV0KTsKLSAgICAgICAgICAgIHJpZU9sZFNlcmlhbGl6ZWQgPSBvbGRPdXRwdXQuYnVmZmVyKCkuZHVwbGljYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEFic3RyYWN0VW5maWx0ZXJlZFJvd0l0ZXJhdG9yIG1ha2VSb3dJdGVyKFJvdyBzdGF0aWNSb3csIERlY29yYXRlZEtleSBwYXJ0aXRpb25LZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8Q2x1c3RlcmluZzw/Pj4gY2x1c3RlcmluZ0l0ZXIsIFNlcXVlbnRpYWxXcml0ZXIgZGF0YVdyaXRlcikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdFVuZmlsdGVyZWRSb3dJdGVyYXRvcihtZXRhZGF0YSwgcGFydGl0aW9uS2V5LCBkZWxldGlvbkluZm8sIG1ldGFkYXRhLnJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY1JvdywgZmFsc2UsIG5ldyBFbmNvZGluZ1N0YXRzKDAsIDAsIDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3RlY3RlZCBVbmZpbHRlcmVkIGNvbXB1dGVOZXh0KCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghY2x1c3RlcmluZ0l0ZXIuaGFzTmV4dCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOwotICAgICAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgc29tZSBmYWtlIGJ5dGVzIHRvIHRoZSBkYXRhIGZpbGUgdG8gZm9yY2Ugd3JpdGluZyB0aGUgSW5kZXhJbmZvIG9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVdyaXRlci53cml0ZShkdW1teV8xMDBrKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkUm93KGNsdXN0ZXJpbmdJdGVyLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgVW5maWx0ZXJlZCBidWlsZFJvdyhDbHVzdGVyaW5nPD8+IGNsdXN0ZXJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJUcmVlLkJ1aWxkZXI8Q29sdW1uRGF0YT4gYnVpbGRlciA9IEJUcmVlLmJ1aWxkZXIoQ29sdW1uRGF0YS5jb21wYXJhdG9yKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYWRkKEJ1ZmZlckNlbGwubGl2ZShtZXRhZGF0YS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMCkpKTsKLSAgICAgICAgICAgIHJldHVybiBCVHJlZVJvdy5jcmVhdGUoY2x1c3RlcmluZywgcHJpbWFyeUtleUxpdmVuZXNzSW5mbywgZGVsZXRpb24sIGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmUgQy0xMTIwNiBjb2RlLgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBDb2x1bW5JbmRleAotICAgIHsKLSAgICAgICAgZmluYWwgbG9uZyBwYXJ0aXRpb25IZWFkZXJMZW5ndGg7Ci0gICAgICAgIGZpbmFsIExpc3Q8SW5kZXhJbmZvPiBjb2x1bW5zSW5kZXg7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sdW1uSW5kZXggRU1QVFkgPSBuZXcgQ29sdW1uSW5kZXgoLTEsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQotICAgICAgICBwcml2YXRlIENvbHVtbkluZGV4KGxvbmcgcGFydGl0aW9uSGVhZGVyTGVuZ3RoLCBMaXN0PEluZGV4SW5mbz4gY29sdW1uc0luZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnQgY29sdW1uc0luZGV4ICE9IG51bGw7Ci0KLSAgICAgICAgICAgIHRoaXMucGFydGl0aW9uSGVhZGVyTGVuZ3RoID0gcGFydGl0aW9uSGVhZGVyTGVuZ3RoOwotICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXggPSBjb2x1bW5zSW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgQ29sdW1uSW5kZXggd3JpdGVBbmRCdWlsZEluZGV4KFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFNTVGFibGVGbHVzaE9ic2VydmVyPiBvYnNlcnZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0ICFpdGVyYXRvci5pc0VtcHR5KCk7Ci0KLSAgICAgICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKGl0ZXJhdG9yLCBvdXRwdXQsIGhlYWRlciwgb2JzZXJ2ZXJzLCB2ZXJzaW9uLmNvcnJlc3BvbmRpbmdNZXNzYWdpbmdWZXJzaW9uKCkpOwotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uSW5kZXggbm90aGluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBFTVBUWTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBIZWxwIHRvIGNyZWF0ZSBhbiBpbmRleCBmb3IgYSBjb2x1bW4gZmFtaWx5IGJhc2VkIG9uIHNpemUgb2YgY29sdW1ucywKLSAgICAgICAgICogYW5kIHdyaXRlIHNhaWQgY29sdW1ucyB0byBkaXNrLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQnVpbGRlcgotICAgICAgICB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvcjsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU2VxdWVudGlhbFdyaXRlciB3cml0ZXI7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFNlcmlhbGl6YXRpb25IZWxwZXIgaGVscGVyOwotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcjsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgaW50IHZlcnNpb247Ci0KLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxJbmRleEluZm8+IGNvbHVtbnNJbmRleCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGluaXRpYWxQb3NpdGlvbjsKLSAgICAgICAgICAgIHByaXZhdGUgbG9uZyBoZWFkZXJMZW5ndGggPSAtMTsKLQotICAgICAgICAgICAgcHJpdmF0ZSBsb25nIHN0YXJ0UG9zaXRpb24gPSAtMTsKLQotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgd3JpdHRlbjsKLSAgICAgICAgICAgIHByaXZhdGUgbG9uZyBwcmV2aW91c1Jvd1N0YXJ0OwotCi0gICAgICAgICAgICBwcml2YXRlIENsdXN0ZXJpbmdQcmVmaXg8Pz4gZmlyc3RDbHVzdGVyaW5nOwotICAgICAgICAgICAgcHJpdmF0ZSBDbHVzdGVyaW5nUHJlZml4PD8+IGxhc3RDbHVzdGVyaW5nOwotCi0gICAgICAgICAgICBwcml2YXRlIERlbGV0aW9uVGltZSBvcGVuTWFya2VyOwotCi0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IG9ic2VydmVyczsKLQotICAgICAgICAgICAgQnVpbGRlcihVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlRmx1c2hPYnNlcnZlcj4gb2JzZXJ2ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZlcnNpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotICAgICAgICAgICAgICAgIHRoaXMud3JpdGVyID0gd3JpdGVyOwotICAgICAgICAgICAgICAgIHRoaXMuaGVscGVyID0gbmV3IFNlcmlhbGl6YXRpb25IZWxwZXIoaGVhZGVyKTsKLSAgICAgICAgICAgICAgICB0aGlzLmhlYWRlciA9IGhlYWRlcjsKLSAgICAgICAgICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzID0gb2JzZXJ2ZXJzID09IG51bGwgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSA6IG9ic2VydmVyczsKLSAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxQb3NpdGlvbiA9IHdyaXRlci5wb3NpdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVQYXJ0aXRpb25IZWFkZXIoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC53cml0ZVdpdGhTaG9ydExlbmd0aChpdGVyYXRvci5wYXJ0aXRpb25LZXkoKS5nZXRLZXkoKSwgd3JpdGVyKTsKLSAgICAgICAgICAgICAgICBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemUoaXRlcmF0b3IucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLCB3cml0ZXIpOwotICAgICAgICAgICAgICAgIGlmIChoZWFkZXIuaGFzU3RhdGljKCkpCi0gICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZXIuc2VyaWFsaXplU3RhdGljUm93KGl0ZXJhdG9yLnN0YXRpY1JvdygpLCBoZWxwZXIsIHdyaXRlciwgdmVyc2lvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBDb2x1bW5JbmRleCBidWlsZCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlUGFydGl0aW9uSGVhZGVyKGl0ZXJhdG9yKTsKLSAgICAgICAgICAgICAgICB0aGlzLmhlYWRlckxlbmd0aCA9IHdyaXRlci5wb3NpdGlvbigpIC0gaW5pdGlhbFBvc2l0aW9uOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBsb25nIGN1cnJlbnRQb3NpdGlvbigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdyaXRlci5wb3NpdGlvbigpIC0gaW5pdGlhbFBvc2l0aW9uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgYWRkSW5kZXhCbG9jaygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSW5kZXhJbmZvIGNJbmRleEluZm8gPSBuZXcgSW5kZXhJbmZvKGZpcnN0Q2x1c3RlcmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENsdXN0ZXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbigpIC0gc3RhcnRQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blbk1hcmtlcik7Ci0gICAgICAgICAgICAgICAgY29sdW1uc0luZGV4LmFkZChjSW5kZXhJbmZvKTsKLSAgICAgICAgICAgICAgICBmaXJzdENsdXN0ZXJpbmcgPSBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgYWRkKFVuZmlsdGVyZWQgdW5maWx0ZXJlZCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBwb3MgPSBjdXJyZW50UG9zaXRpb24oKTsKLQotICAgICAgICAgICAgICAgIGlmIChmaXJzdENsdXN0ZXJpbmcgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEJlZ2lubmluZyBvZiBhbiBpbmRleCBibG9jay4gUmVtZW1iZXIgdGhlIHN0YXJ0IGFuZCBwb3NpdGlvbgotICAgICAgICAgICAgICAgICAgICBmaXJzdENsdXN0ZXJpbmcgPSB1bmZpbHRlcmVkLmNsdXN0ZXJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IHBvczsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBVbmZpbHRlcmVkU2VyaWFsaXplci5zZXJpYWxpemVyLnNlcmlhbGl6ZSh1bmZpbHRlcmVkLCBoZWxwZXIsIHdyaXRlciwgcG9zIC0gcHJldmlvdXNSb3dTdGFydCwgdmVyc2lvbik7Ci0KLSAgICAgICAgICAgICAgICAvLyBub3RpZnkgb2JzZXJ2ZXJzIGFib3V0IGVhY2ggbmV3IHJvdwotICAgICAgICAgICAgICAgIGlmICghb2JzZXJ2ZXJzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXJzLmZvckVhY2goKG8pIC0+IG8ubmV4dFVuZmlsdGVyZWRDbHVzdGVyKHVuZmlsdGVyZWQpKTsKLQotICAgICAgICAgICAgICAgIGxhc3RDbHVzdGVyaW5nID0gdW5maWx0ZXJlZC5jbHVzdGVyaW5nKCk7Ci0gICAgICAgICAgICAgICAgcHJldmlvdXNSb3dTdGFydCA9IHBvczsKLSAgICAgICAgICAgICAgICArK3dyaXR0ZW47Ci0KLSAgICAgICAgICAgICAgICBpZiAodW5maWx0ZXJlZC5raW5kKCkgPT0gVW5maWx0ZXJlZC5LaW5kLlJBTkdFX1RPTUJTVE9ORV9NQVJLRVIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBSYW5nZVRvbWJzdG9uZU1hcmtlciBtYXJrZXIgPSAoUmFuZ2VUb21ic3RvbmVNYXJrZXIpdW5maWx0ZXJlZDsKLSAgICAgICAgICAgICAgICAgICAgb3Blbk1hcmtlciA9IG1hcmtlci5pc09wZW4oZmFsc2UpID8gbWFya2VyLm9wZW5EZWxldGlvblRpbWUoZmFsc2UpIDogbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB3ZSBoaXQgdGhlIGNvbHVtbiBpbmRleCBzaXplIHRoYXQgd2UgaGF2ZSB0byBpbmRleCBhZnRlciwgZ28gYWhlYWQgYW5kIGluZGV4IGl0LgotICAgICAgICAgICAgICAgIGlmIChjdXJyZW50UG9zaXRpb24oKSAtIHN0YXJ0UG9zaXRpb24gPj0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZSgpKQotICAgICAgICAgICAgICAgICAgICBhZGRJbmRleEJsb2NrKCk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBDb2x1bW5JbmRleCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZXIud3JpdGVFbmRPZlBhcnRpdGlvbih3cml0ZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB3ZSBhZGQgbm8gcm93cywganVzdCBhIHRvcCBsZXZlbCBkZWxldGlvbgotICAgICAgICAgICAgICAgIGlmICh3cml0dGVuID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBSb3dJbmRleEVudHJ5VGVzdC5Db2x1bW5JbmRleC5FTVBUWTsKLQotICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IGNvbHVtbiBtYXkgaGF2ZSBmYWxsZW4gb24gYW4gaW5kZXggYm91bmRhcnkgYWxyZWFkeS4gIGlmIG5vdCwgaW5kZXggaXQgZXhwbGljaXRseS4KLSAgICAgICAgICAgICAgICBpZiAoZmlyc3RDbHVzdGVyaW5nICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIGFkZEluZGV4QmxvY2soKTsKLQotICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBhbHdheXMgaGF2ZSBhdCBsZWFzdCBvbmUgY29tcHV0ZWQgaW5kZXggYmxvY2ssIGJ1dCB3ZSBvbmx5IHdyaXRlIGl0IG91dCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gdGhhdC4KLSAgICAgICAgICAgICAgICBhc3NlcnQgIWNvbHVtbnNJbmRleC5pc0VtcHR5KCkgJiYgaGVhZGVyTGVuZ3RoID49IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5JbmRleChoZWFkZXJMZW5ndGgsIGNvbHVtbnNJbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVkU2l6ZSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChhIGludCwgYiB0ZXh0LCBjIGludCwgUFJJTUFSWSBLRVkoYSwgYikpIik7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhYmxlTmFtZSk7Ci0KLSAgICAgICAgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeSBzaW1wbGUgPSBuZXcgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeSgxMjMpOwotCi0gICAgICAgIERhdGFPdXRwdXRCdWZmZXIgYnVmZmVyID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKTsKLSAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBuZXcgU2VyaWFsaXphdGlvbkhlYWRlcih0cnVlLCBjZnMubWV0YWRhdGEoKSwgY2ZzLm1ldGFkYXRhKCkucmVndWxhckFuZFN0YXRpY0NvbHVtbnMoKSwgRW5jb2RpbmdTdGF0cy5OT19TVEFUUyk7Ci0gICAgICAgIFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuU2VyaWFsaXplcihjZnMubWV0YWRhdGEoKSwgQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24sIGhlYWRlcik7Ci0KLSAgICAgICAgc2VyaWFsaXplci5zZXJpYWxpemUoc2ltcGxlLCBidWZmZXIpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhidWZmZXIuZ2V0TGVuZ3RoKCksIHNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoc2ltcGxlKSk7Ci0KLSAgICAgICAgLy8gd3JpdGUgZW5vdWdoIHJvd3MgdG8gZW5zdXJlIHdlIGdldCBhIGZldyBjb2x1bW4gaW5kZXggZW50cmllcwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplKCkgLyA0OyBpKyspCi0gICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYykgVkFMVUVTICg/LCA/LCA/KSIsIDAsIFN0cmluZy52YWx1ZU9mKGkpLCBpKTsKLQotICAgICAgICBJbW11dGFibGVCVHJlZVBhcnRpdGlvbiBwYXJ0aXRpb24gPSBVdGlsLmdldE9ubHlQYXJ0aXRpb25VbmZpbHRlcmVkKFV0aWwuY21kKGNmcykuYnVpbGQoKSk7Ci0KLSAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgicm93X2luZGV4X2VudHJ5X3Rlc3QiLCBudWxsKTsKLSAgICAgICAgdGVtcEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgIFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbmV3IFNlcXVlbnRpYWxXcml0ZXIodGVtcEZpbGUpOwotICAgICAgICBDb2x1bW5JbmRleCBjb2x1bW5JbmRleCA9IFJvd0luZGV4RW50cnlUZXN0LkNvbHVtbkluZGV4LndyaXRlQW5kQnVpbGRJbmRleChwYXJ0aXRpb24udW5maWx0ZXJlZEl0ZXJhdG9yKCksIHdyaXRlciwgaGVhZGVyLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbik7Ci0gICAgICAgIFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkgd2l0aEluZGV4ID0gUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeS5jcmVhdGUoMHhkZWFkYmVlZiwgRGVsZXRpb25UaW1lLkxJVkUsIGNvbHVtbkluZGV4KTsKLSAgICAgICAgSW5kZXhJbmZvLlNlcmlhbGl6ZXIgaW5kZXhTZXJpYWxpemVyID0gSW5kZXhJbmZvLnNlcmlhbGl6ZXIoQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24sIGhlYWRlcik7Ci0KLSAgICAgICAgLy8gc2FuaXR5IGNoZWNrCi0gICAgICAgIGFzc2VydFRydWUoY29sdW1uSW5kZXguY29sdW1uc0luZGV4LnNpemUoKSA+PSAzKTsKLQotICAgICAgICBidWZmZXIgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigpOwotICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZSh3aXRoSW5kZXgsIGJ1ZmZlcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhidWZmZXIuZ2V0TGVuZ3RoKCksIHNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUod2l0aEluZGV4KSk7Ci0KLSAgICAgICAgLy8gc2VyaWFsaXphdGlvbiBjaGVjawotCi0gICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBidWZmZXIuYnVmZmVyKCk7Ci0gICAgICAgIERhdGFJbnB1dEJ1ZmZlciBpbnB1dCA9IG5ldyBEYXRhSW5wdXRCdWZmZXIoYmIsIGZhbHNlKTsKLSAgICAgICAgc2VyaWFsaXphdGlvbkNoZWNrKHdpdGhJbmRleCwgaW5kZXhTZXJpYWxpemVyLCBiYiwgaW5wdXQpOwotCi0gICAgICAgIC8vIHRlc3Qgd2l0aCBhbiBvdXRwdXQgc3RyZWFtIHRoYXQgZG9lc24ndCBzdXBwb3J0IGEgZmlsZS1wb2ludGVyCi0gICAgICAgIGJ1ZmZlciA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUG9zaXRpb24oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGxvbmcgcG9zaXRpb24oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZSh3aXRoSW5kZXgsIGJ1ZmZlcik7Ci0gICAgICAgIGJiID0gYnVmZmVyLmJ1ZmZlcigpOwotICAgICAgICBpbnB1dCA9IG5ldyBEYXRhSW5wdXRCdWZmZXIoYmIsIGZhbHNlKTsKLSAgICAgICAgc2VyaWFsaXphdGlvbkNoZWNrKHdpdGhJbmRleCwgaW5kZXhTZXJpYWxpemVyLCBiYiwgaW5wdXQpOwotCi0gICAgICAgIC8vCi0KLSAgICAgICAgYmIgPSBidWZmZXIuYnVmZmVyKCk7Ci0gICAgICAgIGlucHV0ID0gbmV3IERhdGFJbnB1dEJ1ZmZlcihiYiwgZmFsc2UpOwotICAgICAgICBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIuc2tpcChpbnB1dCwgQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24pOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGJiLnJlbWFpbmluZygpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNlcmlhbGl6YXRpb25DaGVjayhQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHdpdGhJbmRleCwgSW5kZXhJbmZvLlNlcmlhbGl6ZXIgaW5kZXhTZXJpYWxpemVyLCBCeXRlQnVmZmVyIGJiLCBEYXRhSW5wdXRCdWZmZXIgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygweGRlYWRiZWVmLCBpbnB1dC5yZWFkVW5zaWduZWRWSW50KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdpdGhJbmRleC5wcm9tb3RlZFNpemUoaW5kZXhTZXJpYWxpemVyKSwgaW5wdXQucmVhZFVuc2lnbmVkVkludCgpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdpdGhJbmRleC5oZWFkZXJMZW5ndGgoKSwgaW5wdXQucmVhZFVuc2lnbmVkVkludCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh3aXRoSW5kZXguZGVsZXRpb25UaW1lKCksIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGlucHV0KSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLnNpemUoKSwgaW5wdXQucmVhZFVuc2lnbmVkVkludCgpKTsKLQotICAgICAgICBpbnQgb2Zmc2V0ID0gYmIucG9zaXRpb24oKTsKLSAgICAgICAgaW50W10gb2Zmc2V0cyA9IG5ldyBpbnRbd2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLnNpemUoKV07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLnNpemUoKTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gYmIucG9zaXRpb24oKTsKLSAgICAgICAgICAgIG9mZnNldHNbaV0gPSBwb3MgLSBvZmZzZXQ7Ci0gICAgICAgICAgICBJbmRleEluZm8gaW5mbyA9IGluZGV4U2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbnB1dCk7Ci0gICAgICAgICAgICBpbnQgZW5kID0gYmIucG9zaXRpb24oKTsKLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpbmRleFNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoaW5mbyksIGVuZCAtIHBvcyk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS5vZmZzZXQsIGluZm8ub2Zmc2V0KTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS53aWR0aCwgaW5mby53aWR0aCk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdpdGhJbmRleC5jb2x1bW5zSW5kZXgoKS5nZXQoaSkuZW5kT3Blbk1hcmtlciwgaW5mby5lbmRPcGVuTWFya2VyKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS5maXJzdE5hbWUsIGluZm8uZmlyc3ROYW1lKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS5sYXN0TmFtZSwgaW5mby5sYXN0TmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpdGhJbmRleC5jb2x1bW5zSW5kZXgoKS5zaXplKCk7IGkrKykKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMob2Zmc2V0c1tpXSwgaW5wdXQucmVhZEludCgpKTsKLQotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGJiLnJlbWFpbmluZygpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeSBpbXBsZW1lbnRzIElNZWFzdXJhYmxlTWVtb3J5Ci0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVNUFRZX1NJWkUgPSBPYmplY3RTaXplcy5tZWFzdXJlKG5ldyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5KDApKTsKLQotICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBwb3NpdGlvbjsKLQotICAgICAgICBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5KGxvbmcgcG9zaXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgcHJvbW90ZWRTaXplKEluZGV4SW5mby5TZXJpYWxpemVyIGlkeFNlcmlhbGl6ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IGNyZWF0ZShsb25nIHBvc2l0aW9uLCBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lLCBDb2x1bW5JbmRleCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0IGluZGV4ICE9IG51bGw7Ci0gICAgICAgICAgICBhc3NlcnQgZGVsZXRpb25UaW1lICE9IG51bGw7Ci0KLSAgICAgICAgICAgIC8vIHdlIG9ubHkgY29uc2lkZXIgdGhlIGNvbHVtbnMgc3VtbWFyeSB3aGVuIGRldGVybWluaW5nIHdoZXRoZXIgdG8gY3JlYXRlIGFuIEluZGV4ZWRFbnRyeSwKLSAgICAgICAgICAgIC8vIHNpbmNlIGlmIHRoZXJlIGFyZSBpbnN1ZmZpY2llbnQgY29sdW1ucyB0byBiZSB3b3J0aCBpbmRleGluZyB3ZSdyZSBnb2luZyB0byBzZWVrIHRvCi0gICAgICAgICAgICAvLyB0aGUgYmVnaW5uaW5nIG9mIHRoZSByb3cgYW55d2F5LCBzbyB3ZSBtaWdodCBhcyB3ZWxsIHJlYWQgdGhlIHRvbWJzdG9uZSB0aGVyZSBhcyB3ZWxsLgotICAgICAgICAgICAgaWYgKGluZGV4LmNvbHVtbnNJbmRleC5zaXplKCkgPiAxKQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeS5JbmRleGVkRW50cnkocG9zaXRpb24sIGRlbGV0aW9uVGltZSwgaW5kZXgucGFydGl0aW9uSGVhZGVyTGVuZ3RoLCBpbmRleC5jb2x1bW5zSW5kZXgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeShwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaW5kZXggZW50cnkgY29udGFpbnMgdGhlIHJvdy1sZXZlbCB0b21ic3RvbmUgYW5kIGNvbHVtbiBzdW1tYXJ5LiAgT3RoZXJ3aXNlLAotICAgICAgICAgKiBjYWxsZXIgc2hvdWxkIGZldGNoIHRoZXNlIGZyb20gdGhlIHJvdyBoZWFkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gIWNvbHVtbnNJbmRleCgpLmlzRW1wdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgcm93IGhlYWRlciAocGFydGl0aW9uIGtleSwgcGFydGl0aW9uIGRlbGV0aW9uIGFuZCBzdGF0aWMgcm93KS4KLSAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBvbmx5IHByb3ZpZGVkIGZvciBpbmRleGVkIGVudHJpZXMgYW5kIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cKLSAgICAgICAgICoge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSBpZiB7QGNvZGUgIWlzSW5kZXhlZCgpfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBsb25nIGhlYWRlckxlbmd0aCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpc3Q8SW5kZXhJbmZvPiBjb2x1bW5zSW5kZXgoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NJWkU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlcmlhbGl6ZXIKLSAgICAgICAgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbmRleEluZm8uU2VyaWFsaXplciBpZHhTZXJpYWxpemVyOwotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uIHZlcnNpb247Ci0KLSAgICAgICAgICAgIFNlcmlhbGl6ZXIoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgVmVyc2lvbiB2ZXJzaW9uLCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmlkeFNlcmlhbGl6ZXIgPSBJbmRleEluZm8uc2VyaWFsaXplcih2ZXJzaW9uLCBoZWFkZXIpOwotICAgICAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHJpZSwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocmllLnBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocmllLnByb21vdGVkU2l6ZShpZHhTZXJpYWxpemVyKSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmllLmlzSW5kZXhlZCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHJpZS5oZWFkZXJMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNlcmlhbGl6ZShyaWUuZGVsZXRpb25UaW1lKCksIG91dCk7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludChyaWUuY29sdW1uc0luZGV4KCkuc2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgYW5kIHdyaXRlIHRoZSBvZmZzZXRzIHRvIHRoZSBJbmRleEluZm8gb2JqZWN0cy4KLQotICAgICAgICAgICAgICAgICAgICBpbnRbXSBvZmZzZXRzID0gbmV3IGludFtyaWUuY29sdW1uc0luZGV4KCkuc2l6ZSgpXTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAob3V0Lmhhc1Bvc2l0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE91dCBpcyB1c3VhbGx5IGEgU2VxdWVudGlhbFdyaXRlciwgc28gdXNpbmcgdGhlIGZpbGUtcG9pbnRlciBpcyBmaW5lIHRvIGdlbmVyYXRlIHRoZSBvZmZzZXRzLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBEYXRhT3V0cHV0QnVmZmVyIGFsc28gd29ya3MuCi0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIHN0YXJ0ID0gb3V0LnBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEluZGV4SW5mbyBpbmZvIDogcmllLmNvbHVtbnNJbmRleCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHNbaV0gPSBpID09IDAgPyAwIDogKGludCkob3V0LnBvc2l0aW9uKCkgLSBzdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeFNlcmlhbGl6ZXIuc2VyaWFsaXplKGluZm8sIG91dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3Qgc3VyZSB0aGlzIGJyYW5jaCB3aWxsIGV2ZXIgYmUgbmVlZGVkLCBidXQgaWYgaXQgaXMgY2FsbGVkLCBpdCBoYXMgdG8gY2FsY3VsYXRlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VyaWFsaXplZCBzaXplcyBpbnN0ZWFkIG9mIHNpbXBseSB1c2luZyB0aGUgZmlsZS1wb2ludGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEluZGV4SW5mbyBpbmZvIDogcmllLmNvbHVtbnNJbmRleCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHNbaSsrXSA9IG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHhTZXJpYWxpemVyLnNlcmlhbGl6ZShpbmZvLCBvdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBpZHhTZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKGluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgb2ZmIDogb2Zmc2V0cykKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZUludChvZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkgZGVzZXJpYWxpemUoRGF0YUlucHV0UGx1cyBpbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IGluLnJlYWRVbnNpZ25lZFZJbnQoKTsKLQotICAgICAgICAgICAgICAgIGludCBzaXplID0gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBoZWFkZXJMZW5ndGggPSBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUgPSBEZWxldGlvblRpbWUuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBlbnRyaWVzID0gKGludClpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8SW5kZXhJbmZvPiBjb2x1bW5zSW5kZXggPSBuZXcgQXJyYXlMaXN0PD4oZW50cmllcyk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllczsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc0luZGV4LmFkZChpZHhTZXJpYWxpemVyLmRlc2VyaWFsaXplKGluKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW4uc2tpcEJ5dGVzRnVsbHkoZW50cmllcyAqIFR5cGVTaXplcy5zaXplb2YoMCkpOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeS5JbmRleGVkRW50cnkocG9zaXRpb24sIGRlbGV0aW9uVGltZSwgaGVhZGVyTGVuZ3RoLCBjb2x1bW5zSW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVhZHMgb25seSB0aGUgZGF0YSAncG9zaXRpb24nIG9mIHRoZSBpbmRleCBlbnRyeSBhbmQgcmV0dXJucyBpdC4gTm90ZSB0aGF0IHRoaXMgbGVmdCAnaW4nIGluIHRoZSBtaWRkbGUKLSAgICAgICAgICAgIC8vIG9mIHJlYWRpbmcgYW4gZW50cnksIHNvIHRoaXMgaXMgb25seSB1c2VmdWwgaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIGFuZCBpbiBtb3N0IGNhc2UgJ2Rlc2VyaWFsaXplJwotICAgICAgICAgICAgLy8gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KLSAgICAgICAgICAgIHN0YXRpYyBsb25nIHJlYWRQb3NpdGlvbihEYXRhSW5wdXRQbHVzIGluLCBWZXJzaW9uIHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBpbi5yZWFkVW5zaWduZWRWSW50KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBza2lwKERhdGFJbnB1dFBsdXMgaW4sIFZlcnNpb24gdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVhZFBvc2l0aW9uKGluLCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBza2lwUHJvbW90ZWRJbmRleChpbiwgdmVyc2lvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2tpcFByb21vdGVkSW5kZXgoRGF0YUlucHV0UGx1cyBpbiwgVmVyc2lvbiB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpaW4ucmVhZFVuc2lnbmVkVkludCgpOwotICAgICAgICAgICAgICAgIGlmIChzaXplIDw9IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgICAgIGluLnNraXBCeXRlc0Z1bGx5KHNpemUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IHNlcmlhbGl6ZWRTaXplKFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkgcmllKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBpbmRleGVkU2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHJpZS5pc0luZGV4ZWQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8SW5kZXhJbmZvPiBpbmRleCA9IHJpZS5jb2x1bW5zSW5kZXgoKTsKLQotICAgICAgICAgICAgICAgICAgICBpbmRleGVkU2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KHJpZS5oZWFkZXJMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ZWRTaXplICs9IERlbGV0aW9uVGltZS5zZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKHJpZS5kZWxldGlvblRpbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ZWRTaXplICs9IFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQoaW5kZXguc2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKEluZGV4SW5mbyBpbmZvIDogaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVkU2l6ZSArPSBpZHhTZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKGluZm8pOwotCi0gICAgICAgICAgICAgICAgICAgIGluZGV4ZWRTaXplICs9IGluZGV4LnNpemUoKSAqIFR5cGVTaXplcy5zaXplb2YoMCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcmV0dXJuIFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQocmllLnBvc2l0aW9uKSArIFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQoaW5kZXhlZFNpemUpICsgaW5kZXhlZFNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gZW50cnkgaW4gdGhlIHJvdyBpbmRleCBmb3IgYSByb3cgd2hvc2UgY29sdW1ucyBhcmUgaW5kZXhlZC4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEluZGV4ZWRFbnRyeSBleHRlbmRzIFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkKLSAgICAgICAgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lOwotCi0gICAgICAgICAgICAvLyBUaGUgb2Zmc2V0IGluIHRoZSBmaWxlIHdoZW4gdGhlIGluZGV4IGVudHJ5IGVuZAotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGhlYWRlckxlbmd0aDsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxJbmRleEluZm8+IGNvbHVtbnNJbmRleDsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQkFTRV9TSVpFID0KLSAgICAgICAgICAgIE9iamVjdFNpemVzLm1lYXN1cmUobmV3IEluZGV4ZWRFbnRyeSgwLCBEZWxldGlvblRpbWUuTElWRSwgMCwgQXJyYXlzLmFzTGlzdChudWxsLCBudWxsKSkpCi0gICAgICAgICAgICArIE9iamVjdFNpemVzLm1lYXN1cmUobmV3IEFycmF5TGlzdDw+KDEpKTsKLQotICAgICAgICAgICAgcHJpdmF0ZSBJbmRleGVkRW50cnkobG9uZyBwb3NpdGlvbiwgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZSwgbG9uZyBoZWFkZXJMZW5ndGgsIExpc3Q8SW5kZXhJbmZvPiBjb2x1bW5zSW5kZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VwZXIocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIGFzc2VydCBkZWxldGlvblRpbWUgIT0gbnVsbDsKLSAgICAgICAgICAgICAgICBhc3NlcnQgY29sdW1uc0luZGV4ICE9IG51bGwgJiYgY29sdW1uc0luZGV4LnNpemUoKSA+IDE7Ci0gICAgICAgICAgICAgICAgdGhpcy5kZWxldGlvblRpbWUgPSBkZWxldGlvblRpbWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSBoZWFkZXJMZW5ndGg7Ci0gICAgICAgICAgICAgICAgdGhpcy5jb2x1bW5zSW5kZXggPSBjb2x1bW5zSW5kZXg7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWxldGlvblRpbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGxvbmcgaGVhZGVyTGVuZ3RoKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGVhZGVyTGVuZ3RoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBMaXN0PEluZGV4SW5mbz4gY29sdW1uc0luZGV4KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uc0luZGV4OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCBpbnQgcHJvbW90ZWRTaXplKEluZGV4SW5mby5TZXJpYWxpemVyIGlkeFNlcmlhbGl6ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBzaXplID0gVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludChoZWFkZXJMZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShkZWxldGlvblRpbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KGNvbHVtbnNJbmRleC5zaXplKCkpOyAvLyBudW1iZXIgb2YgZW50cmllcwotICAgICAgICAgICAgICAgIGZvciAoSW5kZXhJbmZvIGluZm8gOiBjb2x1bW5zSW5kZXgpCi0gICAgICAgICAgICAgICAgICAgIHNpemUgKz0gaWR4U2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShpbmZvKTsKLQotICAgICAgICAgICAgICAgIHNpemUgKz0gY29sdW1uc0luZGV4LnNpemUoKSAqIFR5cGVTaXplcy5zaXplb2YoMCk7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gSW50cy5jaGVja2VkQ2FzdChzaXplKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb25nIGVudHJ5U2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChJbmRleEluZm8gaWR4IDogY29sdW1uc0luZGV4KQotICAgICAgICAgICAgICAgICAgICBlbnRyeVNpemUgKz0gaWR4LnVuc2hhcmVkSGVhcFNpemUoKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBCQVNFX1NJWkUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBlbnRyeVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgKyBkZWxldGlvblRpbWUudW5zaGFyZWRIZWFwU2l6ZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICsgT2JqZWN0U2l6ZXMuc2l6ZU9mUmVmZXJlbmNlQXJyYXkoY29sdW1uc0luZGV4LnNpemUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleEZvcigpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRGVsZXRpb25UaW1lIGRlbGV0aW9uSW5mbyA9IG5ldyBEZWxldGlvblRpbWUoRkJVdGlsaXRpZXMudGltZXN0YW1wTWljcm9zKCksIEZCVXRpbGl0aWVzLm5vd0luU2Vjb25kcygpKTsKLQotICAgICAgICBMaXN0PEluZGV4SW5mbz4gaW5kZXhlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBpbmRleGVzLmFkZChuZXcgSW5kZXhJbmZvKGNuKDBMKSwgY24oNUwpLCAwLCAwLCBkZWxldGlvbkluZm8pKTsKLSAgICAgICAgaW5kZXhlcy5hZGQobmV3IEluZGV4SW5mbyhjbigxMEwpLCBjbigxNUwpLCAwLCAwLCBkZWxldGlvbkluZm8pKTsKLSAgICAgICAgaW5kZXhlcy5hZGQobmV3IEluZGV4SW5mbyhjbigyMEwpLCBjbigyNUwpLCAwLCAwLCBkZWxldGlvbkluZm8pKTsKLQotICAgICAgICBSb3dJbmRleEVudHJ5IHJpZSA9IG5ldyBSb3dJbmRleEVudHJ5KDBMKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgSW5kZXhJbmZvUmV0cmlldmVyIG9wZW5XaXRoSW5kZXgoRmlsZUhhbmRsZSBpbmRleEZpbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmRleEluZm9SZXRyaWV2ZXIoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIEluZGV4SW5mbyBjb2x1bW5zSW5kZXgoaW50IGluZGV4KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhlcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IGNvbHVtbnNJbmRleENvdW50KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhlcy5zaXplKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBBYnN0cmFjdFNTVGFibGVJdGVyYXRvci5JbmRleFN0YXRlIGluZGV4U3RhdGUgPSBuZXcgQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3IuSW5kZXhTdGF0ZSgKLSAgICAgICAgICAgIG51bGwsIGNvbXAsIHJpZSwgZmFsc2UsIG51bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigtMUwpLCAtMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbig1TCksIC0xKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEyTCksIC0xKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDE3TCksIC0xKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygzLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEwMEwpLCAtMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMykpOwotCi0gICAgICAgIGluZGV4U3RhdGUgPSBuZXcgQWJzdHJhY3RTU1RhYmxlSXRlcmF0b3IuSW5kZXhTdGF0ZSgKLSAgICAgICAgICAgIG51bGwsIGNvbXAsIHJpZSwgdHJ1ZSwgbnVsbAotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigtMUwpLCAtMSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbig1TCksIDMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oNUwpLCAyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDE3TCksIDMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oMTAwTCksIDMpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oMTAwTCksIDQpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oMTJMKSwgMykpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMkwpLCAyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEwMEwpLCAxKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEwMEwpLCAyKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NjaGVtYUNRTEhlbHBlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TY2hlbWFDUUxIZWxwZXJUZXN0LmphdmEKaW5kZXggNjNlZjg2MS4uNDEyNDRjYSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NjaGVtYUNRTEhlbHBlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU2NoZW1hQ1FMSGVscGVyVGVzdC5qYXZhCkBAIC0yMiwxMSArMjIsMTEgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5GaWxlczsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVJlYWRlcjsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuSnNvbk5vZGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuKjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLio7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5JbmRleFRhcmdldDsKQEAgLTM3LDkgKzM3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnJlYWRzLlNwZWN1bGF0aXZlUmV0cnlQb2xpY3k7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05BcnJheTsKLWltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTk9iamVjdDsKLWltcG9ydCBvcmcuanNvbi5zaW1wbGUucGFyc2VyLkpTT05QYXJzZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CkBAIC0yOTcsNiArMjk1LDcgQEAKICAgICAgICAgYXNzZXJ0VGhhdChTY2hlbWFDUUxIZWxwZXIuZ2V0VGFibGVNZXRhZGF0YUFzQ1FMKGNmcy5tZXRhZGF0YSgpLCBjZnMua2V5c3BhY2UuZ2V0TWV0YWRhdGEoKSksCiAgICAgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoIkNMVVNURVJJTkcgT1JERVIgQlkgKGNsMSBBU0MpXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEFORCBhZGRpdGlvbmFsX3dyaXRlX3BvbGljeSA9ICdBTFdBWVMnXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEFORCBhbGxvd19hdXRvX3NuYXBzaG90ID0gdHJ1ZVxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgYmxvb21fZmlsdGVyX2ZwX2NoYW5jZSA9IDEuMFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgY2FjaGluZyA9IHsna2V5cyc6ICdBTEwnLCAncm93c19wZXJfcGFydGl0aW9uJzogJ05PTkUnfVxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgY2RjID0gZmFsc2VcbiIgKwpAQCAtMzA4LDYgKzMwNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgZGVmYXVsdF90aW1lX3RvX2xpdmUgPSA0XG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEFORCBleHRlbnNpb25zID0geydleHQxJzogMHg3NjYxNmMzMX1cbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgQU5EIGdjX2dyYWNlX3NlY29uZHMgPSA1XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEFORCBpbmNyZW1lbnRhbF9iYWNrdXBzID0gdHJ1ZVxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgbWF4X2luZGV4X2ludGVydmFsID0gN1xuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgbWVtdGFibGVfZmx1c2hfcGVyaW9kX2luX21zID0gOFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBBTkQgbWluX2luZGV4X2ludGVydmFsID0gNlxuIiArCkBAIC00NDYsOSArNDQ2LDEwIEBACiAKICAgICAgICAgYXNzZXJ0VGhhdChzY2hlbWEsIGNvbnRhaW5zU3RyaW5nKCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyAiICsgdGFibGVOYW1lICsgIl9yZWcyX2lkeCBPTiAiICsga2V5c3BhY2UoKSArICcuJyArIHRhYmxlTmFtZSArICIgKHJlZzIpOyIpKTsKIAotICAgICAgICBKU09OT2JqZWN0IG1hbmlmZXN0ID0gKEpTT05PYmplY3QpIG5ldyBKU09OUGFyc2VyKCkucGFyc2UobmV3IEZpbGVSZWFkZXIoY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0U25hcHNob3RNYW5pZmVzdEZpbGUoU05BUFNIT1QpKSk7Ci0gICAgICAgIEpTT05BcnJheSBmaWxlcyA9IChKU09OQXJyYXkpIG1hbmlmZXN0LmdldCgiZmlsZXMiKTsKKyAgICAgICAgSnNvbk5vZGUgbWFuaWZlc3QgPSBKc29uVXRpbHMuSlNPTl9PQkpFQ1RfTUFQUEVSLnJlYWRUcmVlKGNmcy5nZXREaXJlY3RvcmllcygpLmdldFNuYXBzaG90TWFuaWZlc3RGaWxlKFNOQVBTSE9UKS50b0phdmFJT0ZpbGUoKSk7CisgICAgICAgIEpzb25Ob2RlIGZpbGVzID0gbWFuaWZlc3QuZ2V0KCJmaWxlcyIpOwogICAgICAgICAvLyB0d28gZmlsZXMsIHRoZSBzZWNvbmQgaXMgaW5kZXgKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZmlsZXMuaXNBcnJheSgpKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBmaWxlcy5zaXplKCkpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NjcnViVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NjcnViVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmU5MTY1Li4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TY3J1YlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKLQotaW1wb3J0IGphdmEuaW8uSU9FcnJvcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKLWltcG9ydCBqYXZhLm5pby5maWxlLlN0YW5kYXJkT3Blbk9wdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXBkYXRlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLkNodW5rQ2FjaGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLk9wZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5VbnR5cGVkUmVzdWx0U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uU2NydWJiZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZU5ld1RyYWNrZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVVJRFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25VcGRhdGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5CeXRlT3JkZXJlZFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5SZXF1ZXN0RXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuV3JpdGVUaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db3JydXB0U1NUYWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlTXVsdGlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmV3cml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlVHhuV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2ltcGxlU1NUYWJsZU11bHRpV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnVGFibGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLmNvdW50ZXJDRk1EOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5nZXRDb21wcmVzc2lvblBhcmFtZXRlcnM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5sb2FkU2NoZW1hOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EOwotaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7Ci0KLXB1YmxpYyBjbGFzcyBTY3J1YlRlc3QKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZBTElEX0xFR0FDWV9TU1RBQkxFX1JPT1RfUFJPUCA9ICJpbnZhbGlkLWxlZ2FjeS1zc3RhYmxlLXJvb3QiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0YgPSAiU3RhbmRhcmQxIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VOVEVSX0NGID0gIkNvdW50ZXIxIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9VVUlEID0gIlVVSURLZXlzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9JTkRFWDEgPSAiSW5kZXhlZDEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGX0lOREVYMiA9ICJJbmRleGVkMiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfSU5ERVgxX0JZVEVPUkRFUkVEID0gIkluZGV4ZWQxX29yZGVyZWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGX0lOREVYMl9CWVRFT1JERVJFRCA9ICJJbmRleGVkMl9vcmRlcmVkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfSU5ERVggPSAiYmlydGhkYXRlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xfTk9OX0lOREVYID0gIm5vdGJpcnRoZGF0ZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ09NUFJFU1NJT05fQ0hVTktfTEVOR1RIID0gNDA5NjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgc2VxID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLQotICAgIFN0cmluZyBrc05hbWU7Ci0gICAgS2V5c3BhY2Uga2V5c3BhY2U7Ci0KLSAgICBAQmVmb3JlQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGxvYWRTY2hlbWEoKTsKLSAgICB9Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgc2V0dXAoKQotICAgIHsKLSAgICAgICAga3NOYW1lID0gInNjcnViX3Rlc3RfIiArIHNlcS5pbmNyZW1lbnRBbmRHZXQoKTsKLSAgICAgICAgY3JlYXRlS2V5c3BhY2Uoa3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChrc05hbWUsIENGKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNGTUQoa3NOYW1lLCBDT1VOVEVSX0NGKS5jb21wcmVzc2lvbihnZXRDb21wcmVzc2lvblBhcmFtZXRlcnMoQ09NUFJFU1NJT05fQ0hVTktfTEVOR1RIKSksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChrc05hbWUsIENGX1VVSUQsIDAsIFVVSURUeXBlLmluc3RhbmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmtleXNJbmRleENGTUQoa3NOYW1lLCBDRl9JTkRFWDEsIHRydWUpLAotICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuY29tcG9zaXRlSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgyLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmtleXNJbmRleENGTUQoa3NOYW1lLCBDRl9JTkRFWDFfQllURU9SREVSRUQsIHRydWUpLnBhcnRpdGlvbmVyKEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuY29tcG9zaXRlSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgyX0JZVEVPUkRFUkVELCB0cnVlKS5wYXJ0aXRpb25lcihCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKSk7Ci0gICAgICAgIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc05hbWUpOwotCi0gICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkob3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVXRpbC5BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVCwgInRydWUiKTsgLy8gTmVjZXNzYXJ5IGZvciB0ZXN0aW5nCi0gICAgfQotCi0gICAgQEFmdGVyQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJDbGFzc0VudigpCi0gICAgewotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5VdGlsLkFMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNUKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1Yk9uZVBhcnRpdGlvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOwotCi0gICAgICAgIC8vIGluc2VydCBkYXRhIGFuZCB2ZXJpZnkgd2UgZ2V0IGl0IGJhY2sgdy8gcmFuZ2UgcXVlcnkKLSAgICAgICAgZmlsbENGKGNmcywgMSk7Ci0gICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKLQotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wZXJmb3JtU2NydWIoY2ZzLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIDIpOwotCi0gICAgICAgIC8vIGNoZWNrIGRhdGEgaXMgc3RpbGwgdGhlcmUKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcnViTGFzdEJyb2tlblBhcnRpdGlvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IENvbHVtbkZhbWlseVN0b3JlLmdldElmRXhpc3RzKGtzTmFtZSwgQ0YpOwotCi0gICAgICAgIC8vIGluc2VydCBkYXRhIGFuZCB2ZXJpZnkgd2UgZ2V0IGl0IGJhY2sgdy8gcmFuZ2UgcXVlcnkKLSAgICAgICAgZmlsbENGKGNmcywgMSk7Ci0gICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKLQotICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gbGl2ZVNTVGFibGVzID0gY2ZzLmdldExpdmVTU1RhYmxlcygpOwotICAgICAgICBhc3NlcnRUaGF0KGxpdmVTU1RhYmxlcykuaGFzU2l6ZSgxKTsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gbGl2ZVNTVGFibGVzLml0ZXJhdG9yKCkubmV4dCgpLmdldEZpbGVuYW1lKCk7Ci0gICAgICAgIEZpbGVzLndyaXRlKFBhdGhzLmdldChmaWxlTmFtZSksIG5ldyBieXRlWzEwXSwgU3RhbmRhcmRPcGVuT3B0aW9uLkNSRUFURSwgU3RhbmRhcmRPcGVuT3B0aW9uLlRSVU5DQVRFX0VYSVNUSU5HKTsKLSAgICAgICAgQ2h1bmtDYWNoZS5pbnN0YW5jZS5pbnZhbGlkYXRlRmlsZShmaWxlTmFtZSk7Ci0KLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGVyZm9ybVNjcnViKGNmcywgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIDIpOwotCi0gICAgICAgIC8vIGNoZWNrIGRhdGEgaXMgc3RpbGwgdGhlcmUKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcnViQ29ycnVwdGVkQ291bnRlclBhcnRpdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBXaGVuIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQsIGZvciB0ZXN0aW5nIGNvcnJ1cHRlZCBjaHVua3Mgd2UgbmVlZCBlbm91Z2ggcGFydGl0aW9ucyB0byBjb3ZlcgotICAgICAgICAvLyBhdCBsZWFzdCAzIGNodW5rcyBvZiBzaXplIENPTVBSRVNTSU9OX0NIVU5LX0xFTkdUSAotICAgICAgICBpbnQgbnVtUGFydGl0aW9ucyA9IDEwMDA7Ci0KLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPVU5URVJfQ0YpOwotICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOwotICAgICAgICBmaWxsQ291bnRlckNGKGNmcywgbnVtUGFydGl0aW9ucyk7Ci0KLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIG51bVBhcnRpdGlvbnMpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgLy9tYWtlIHN1cmUgdG8gb3ZlcnJpZGUgYXQgbW9zdCAxIGNodW5rIHdoZW4gY29tcHJlc3Npb24gaXMgZW5hYmxlZAotICAgICAgICBvdmVycmlkZVdpdGhHYXJiYWdlKHNzdGFibGUsIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIwIiksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIxIikpOwotCi0gICAgICAgIC8vIHdpdGggc2tpcENvcnJ1cHRlZCA9PSBmYWxzZSwgdGhlIHNjcnViIGlzIGV4cGVjdGVkIHRvIGZhaWwKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdGFibGUpLCBPcGVyYXRpb25UeXBlLlNDUlVCKTsKLSAgICAgICAgICAgICBTY3J1YmJlciBzY3J1YmJlciA9IG5ldyBTY3J1YmJlcihjZnMsIHR4biwgZmFsc2UsIHRydWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzY3J1YmJlci5zY3J1YigpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FcnJvciBlcnIpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXJyLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB3aXRoIHNraXBDb3JydXB0ZWQgPT0gdHJ1ZSwgdGhlIGNvcnJ1cHQgcm93cyB3aWxsIGJlIHNraXBwZWQKLSAgICAgICAgU2NydWJiZXIuU2NydWJSZXN1bHQgc2NydWJSZXN1bHQ7Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzc3RhYmxlKSwgT3BlcmF0aW9uVHlwZS5TQ1JVQik7Ci0gICAgICAgICAgICAgU2NydWJiZXIgc2NydWJiZXIgPSBuZXcgU2NydWJiZXIoY2ZzLCB0eG4sIHRydWUsIHRydWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzY3J1YlJlc3VsdCA9IHNjcnViYmVyLnNjcnViV2l0aFJlc3VsdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChzY3J1YlJlc3VsdCk7Ci0KLSAgICAgICAgYm9vbGVhbiBjb21wcmVzc2lvbiA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRlc3QuY29tcHJlc3Npb24iLCAiZmFsc2UiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBzY3J1YlJlc3VsdC5lbXB0eVBhcnRpdGlvbnMpOwotICAgICAgICBpZiAoY29tcHJlc3Npb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1QYXJ0aXRpb25zLCBzY3J1YlJlc3VsdC5iYWRQYXJ0aXRpb25zICsgc2NydWJSZXN1bHQuZ29vZFBhcnRpdGlvbnMpOwotICAgICAgICAgICAgLy9iZWNhdXNlIHdlIG9ubHkgY29ycnVwdGVkIDEgY2h1bmsgYW5kIHdlIGNob3NlIGVub3VnaCBwYXJ0aXRpb25zIHRvIGNvdmVyIGF0IGxlYXN0IDMgY2h1bmtzCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHNjcnViUmVzdWx0Lmdvb2RQYXJ0aXRpb25zID49IHNjcnViUmVzdWx0LmJhZFBhcnRpdGlvbnMgKiAyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBzY3J1YlJlc3VsdC5iYWRQYXJ0aXRpb25zKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1QYXJ0aXRpb25zLTEsIHNjcnViUmVzdWx0Lmdvb2RQYXJ0aXRpb25zKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7Ci0KLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIHNjcnViUmVzdWx0Lmdvb2RQYXJ0aXRpb25zKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1YkNvcnJ1cHRlZFJvd0luU21hbGxGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXcml0ZVRpbWVvdXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIGNhbm5vdCB0ZXN0IHRoaXMgd2l0aCBjb21wcmVzc2lvbgotICAgICAgICBhc3N1bWVUcnVlKCFCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS50ZXN0LmNvbXByZXNzaW9uIiwgImZhbHNlIikpKTsKLQotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09VTlRFUl9DRik7Ci0KLSAgICAgICAgZmlsbENvdW50ZXJDRihjZnMsIDIpOwotCi0gICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAyKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgLy8gb3ZlcndyaXRlIG9uZSByb3cgd2l0aCBnYXJiYWdlCi0gICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjAiKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjEiKSk7Ci0KLSAgICAgICAgLy8gd2l0aCBza2lwQ29ycnVwdGVkID09IGZhbHNlLCB0aGUgc2NydWIgaXMgZXhwZWN0ZWQgdG8gZmFpbAotICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc3N0YWJsZSksIE9wZXJhdGlvblR5cGUuU0NSVUIpOwotICAgICAgICAgICAgIFNjcnViYmVyIHNjcnViYmVyID0gbmV3IFNjcnViYmVyKGNmcywgdHhuLCBmYWxzZSwgdHJ1ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHdpdGggc2tpcENvcnJ1cHRlZCA9PSB0cnVlLCB0aGUgY29ycnVwdCByb3cgd2lsbCBiZSBza2lwcGVkCi0gICAgICAgICAgICBzY3J1YmJlci5zY3J1YigpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FcnJvciBlcnIpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXJyLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc3N0YWJsZSksIE9wZXJhdGlvblR5cGUuU0NSVUIpOwotICAgICAgICAgICAgIFNjcnViYmVyIHNjcnViYmVyID0gbmV3IFNjcnViYmVyKGNmcywgdHhuLCB0cnVlLCB0cnVlKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gd2l0aCBza2lwQ29ycnVwdGVkID09IHRydWUsIHRoZSBjb3JydXB0IHJvdyB3aWxsIGJlIHNraXBwZWQKLSAgICAgICAgICAgIHNjcnViYmVyLnNjcnViKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7Ci0gICAgICAgIC8vIHZlcmlmeSB0aGF0IHdlIGNhbiByZWFkIGFsbCBvZiB0aGUgcm93cywgYW5kIHRoZXJlIGlzIG5vdyBvbmUgbGVzcyByb3cKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcnViT25lUm93V2l0aENvcnJ1cHRlZEtleSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gY2Fubm90IHRlc3QgdGhpcyB3aXRoIGNvbXByZXNzaW9uCi0gICAgICAgIGFzc3VtZVRydWUoIUJvb2xlYW4ucGFyc2VCb29sZWFuKFN5c3RlbS5nZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnRlc3QuY29tcHJlc3Npb24iLCAiZmFsc2UiKSkpOwotCi0gICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7Ci0KLSAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIHZlcmlmeSB3ZSBnZXQgaXQgYmFjayB3LyByYW5nZSBxdWVyeQotICAgICAgICBmaWxsQ0YoY2ZzLCA0KTsKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDQpOwotCi0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgb3ZlcnJpZGVXaXRoR2FyYmFnZShzc3RhYmxlLCAwLCAyKTsKLQotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wZXJmb3JtU2NydWIoY2ZzLCBmYWxzZSwgdHJ1ZSwgMik7Ci0KLSAgICAgICAgLy8gY2hlY2sgZGF0YSBpcyBzdGlsbCB0aGVyZQotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgNCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJDb3JydXB0ZWRDb3VudGVyUm93Tm9FYXJseU9wZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdyaXRlVGltZW91dEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBvbGREaXNhYmxlZFZhbCA9IFNTVGFibGVSZXdyaXRlci5kaXNhYmxlRWFybHlPcGVuaW5nRm9yVGVzdHM7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBTU1RhYmxlUmV3cml0ZXIuZGlzYWJsZUVhcmx5T3BlbmluZ0ZvclRlc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgIHRlc3RTY3J1YkNvcnJ1cHRlZENvdW50ZXJQYXJ0aXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFNTVGFibGVSZXdyaXRlci5kaXNhYmxlRWFybHlPcGVuaW5nRm9yVGVzdHMgPSBvbGREaXNhYmxlZFZhbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcnViTXVsdGlSb3coKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKLQotICAgICAgICAvLyBpbnNlcnQgZGF0YSBhbmQgdmVyaWZ5IHdlIGdldCBpdCBiYWNrIHcvIHJhbmdlIHF1ZXJ5Ci0gICAgICAgIGZpbGxDRihjZnMsIDEwKTsKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEwKTsKLQotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wZXJmb3JtU2NydWIoY2ZzLCBmYWxzZSwgdHJ1ZSwgMik7Ci0KLSAgICAgICAgLy8gY2hlY2sgZGF0YSBpcyBzdGlsbCB0aGVyZQotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMTApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcnViTm9JbmRleCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOwotCi0gICAgICAgIC8vIGluc2VydCBkYXRhIGFuZCB2ZXJpZnkgd2UgZ2V0IGl0IGJhY2sgdy8gcmFuZ2UgcXVlcnkKLSAgICAgICAgZmlsbENGKGNmcywgMTApOwotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMTApOwotCi0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogY2ZzLmdldExpdmVTU1RhYmxlcygpKQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpKS50cnlEZWxldGUoKSk7Ci0KLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGVyZm9ybVNjcnViKGNmcywgZmFsc2UsIHRydWUsIDIpOwotCi0gICAgICAgIC8vIGNoZWNrIGRhdGEgaXMgc3RpbGwgdGhlcmUKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEwKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1Yk91dE9mT3JkZXIoKQotICAgIHsKLSAgICAgICAgLy8gVGhpcyB0ZXN0IGFzc3VtZXMgQnl0ZU9yZGVyUGFydGl0aW9uZXIgdG8gY3JlYXRlIG91dC1vZi1vcmRlciBTU1RhYmxlCi0gICAgICAgIElQYXJ0aXRpb25lciBvbGRQYXJ0aXRpb25lciA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRQYXJ0aXRpb25lcigpOwotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGFydGl0aW9uZXJVbnNhZmUobmV3IEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIoKSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIG91dC1vZi1vcmRlciBTU1RhYmxlCi0gICAgICAgIEZpbGUgdGVtcERpciA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgiU2NydWJUZXN0LnRlc3RTY3J1Yk91dE9mT3JkZXIiLCAiIikucGFyZW50KCk7Ci0gICAgICAgIC8vIGNyZWF0ZSBrcy9jZiBkaXJlY3RvcnkKLSAgICAgICAgRmlsZSB0ZW1wRGF0YURpciA9IG5ldyBGaWxlKHRlbXBEaXIsIFN0cmluZy5qb2luKEZpbGUucGF0aFNlcGFyYXRvcigpLCBrc05hbWUsIENGKSk7Ci0gICAgICAgIGFzc2VydFRydWUodGVtcERhdGFEaXIudHJ5Q3JlYXRlRGlyZWN0b3JpZXMoKSk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKLQotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGtleXMgPSBBcnJheXMuYXNMaXN0KCJ0IiwgImEiLCAiYiIsICJ6IiwgImMiLCAieSIsICJkIik7Ci0gICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IodGVtcERhdGFEaXIpOwotCi0gICAgICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IExpZmVjeWNsZVRyYW5zYWN0aW9uLm9mZmxpbmUoT3BlcmF0aW9uVHlwZS5XUklURSk7Ci0gICAgICAgICAgICAgICAgIFNTVGFibGVUeG5Xcml0ZXIgd3JpdGVyID0gbmV3IFNTVGFibGVUeG5Xcml0ZXIodHhuLCBjcmVhdGVUZXN0V3JpdGVyKGRlc2MsIGtleXMuc2l6ZSgpLCBjZnMubWV0YWRhdGEsIHR4bikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGsgOiBrZXlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSA9IFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmcy5tZXRhZGF0YSgpLCBVdGlsLmRrKGspKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdSb3coInNvbWVOYW1lIikuYWRkKCJ2YWwiLCAic29tZVZhbHVlIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLQotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKHVwZGF0ZS51bmZpbHRlcmVkSXRlcmF0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdyaXRlci5maW5pc2goZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyLm9wZW4oZGVzYywgY2ZzLm1ldGFkYXRhKTsKLSAgICAgICAgICAgICAgICBmYWlsKCJTU1RSIHZhbGlkYXRpb24gc2hvdWxkIGhhdmUgY2F1Z2h0IHRoZSBvdXQtb2Ytb3JkZXIgcm93cyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGlzZSkKLSAgICAgICAgICAgIHsgLyogdGhpcyBpcyBleHBlY3RlZCAqLyB9Ci0KLSAgICAgICAgICAgIC8vIG9wZW4gd2l0aG91dCB2YWxpZGF0aW9uIGZvciBzY3J1YmJpbmcKLSAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICBpZiAobmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTykpLmV4aXN0cygpKQotICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5DT01QUkVTU0lPTl9JTkZPKTsKLSAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5EQVRBKTsKLSAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5QUklNQVJZX0lOREVYKTsKLSAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5GSUxURVIpOwotICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50LlNUQVRTKTsKLSAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5TVU1NQVJZKTsKLSAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5UT0MpOwotCi0gICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24oZGVzYywgY29tcG9uZW50cywgY2ZzKTsKLSAgICAgICAgICAgIGlmIChzc3RhYmxlLmxhc3QuY29tcGFyZVRvKHNzdGFibGUuZmlyc3QpIDwgMCkKLSAgICAgICAgICAgICAgICBzc3RhYmxlLmxhc3QgPSBzc3RhYmxlLmZpcnN0OwotCi0gICAgICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHNjcnViVHhuID0gTGlmZWN5Y2xlVHJhbnNhY3Rpb24ub2ZmbGluZShPcGVyYXRpb25UeXBlLlNDUlVCLCBzc3RhYmxlKTsKLSAgICAgICAgICAgICAgICAgU2NydWJiZXIgc2NydWJiZXIgPSBuZXcgU2NydWJiZXIoY2ZzLCBzY3J1YlR4biwgZmFsc2UsIHRydWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNjcnViYmVyLnNjcnViKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbi53YWl0Rm9yRGVsZXRpb25zKCk7Ci0gICAgICAgICAgICBjZnMubG9hZE5ld1NTVGFibGVzKCk7Ci0gICAgICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgNyk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlUmVjdXJzaXZlKHRlbXBEYXRhRGlyKTsKLSAgICAgICAgICAgIC8vIHJlc2V0IHBhcnRpdGlvbmVyCi0gICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGFydGl0aW9uZXJVbnNhZmUob2xkUGFydGl0aW9uZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgb3ZlcnJpZGVXaXRoR2FyYmFnZShTU1RhYmxlUmVhZGVyIHNzdGFibGUsIEJ5dGVCdWZmZXIga2V5MSwgQnl0ZUJ1ZmZlciBrZXkyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gY29tcHJlc3Npb24gPSBCb29sZWFuLnBhcnNlQm9vbGVhbihTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS50ZXN0LmNvbXByZXNzaW9uIiwgImZhbHNlIikpOwotICAgICAgICBsb25nIHN0YXJ0UG9zaXRpb24sIGVuZFBvc2l0aW9uOwotCi0gICAgICAgIGlmIChjb21wcmVzc2lvbikKLSAgICAgICAgeyAvLyBvdmVyd3JpdGUgd2l0aCBnYXJiYWdlIHRoZSBjb21wcmVzc2lvbiBjaHVua3MgZnJvbSBrZXkxIHRvIGtleTIKLSAgICAgICAgICAgIENvbXByZXNzaW9uTWV0YWRhdGEgY29tcERhdGEgPSBDb21wcmVzc2lvbk1ldGFkYXRhLmNyZWF0ZShzc3RhYmxlLmdldEZpbGVuYW1lKCkpOwotCi0gICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhLkNodW5rIGNodW5rMSA9IGNvbXBEYXRhLmNodW5rRm9yKAotICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uLkZvcktleS5nZXQoa2V5MSwgc3N0YWJsZS5nZXRQYXJ0aXRpb25lcigpKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSkucG9zaXRpb24pOwotICAgICAgICAgICAgQ29tcHJlc3Npb25NZXRhZGF0YS5DaHVuayBjaHVuazIgPSBjb21wRGF0YS5jaHVua0ZvcigKLSAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KGtleTIsIHNzdGFibGUuZ2V0UGFydGl0aW9uZXIoKSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpLnBvc2l0aW9uKTsKLQotICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IE1hdGgubWluKGNodW5rMS5vZmZzZXQsIGNodW5rMi5vZmZzZXQpOwotICAgICAgICAgICAgZW5kUG9zaXRpb24gPSBNYXRoLm1heChjaHVuazEub2Zmc2V0ICsgY2h1bmsxLmxlbmd0aCwgY2h1bmsyLm9mZnNldCArIGNodW5rMi5sZW5ndGgpOwotCi0gICAgICAgICAgICBjb21wRGF0YS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAvLyBvdmVyd3JpdGUgd2l0aCBnYXJiYWdlIGZyb20ga2V5MSB0byBrZXkyCi0gICAgICAgICAgICBsb25nIHJvdzBTdGFydCA9IHNzdGFibGUuZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24uRm9yS2V5LmdldChrZXkxLCBzc3RhYmxlLmdldFBhcnRpdGlvbmVyKCkpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKS5wb3NpdGlvbjsKLSAgICAgICAgICAgIGxvbmcgcm93MVN0YXJ0ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KGtleTIsIHNzdGFibGUuZ2V0UGFydGl0aW9uZXIoKSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpLnBvc2l0aW9uOwotICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IE1hdGgubWluKHJvdzBTdGFydCwgcm93MVN0YXJ0KTsKLSAgICAgICAgICAgIGVuZFBvc2l0aW9uID0gTWF0aC5tYXgocm93MFN0YXJ0LCByb3cxU3RhcnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3ZlcnJpZGVXaXRoR2FyYmFnZShzc3RhYmxlLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBvdmVycmlkZVdpdGhHYXJiYWdlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgbG9uZyBzdGFydFBvc2l0aW9uLCBsb25nIGVuZFBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeSAoRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBuZXcgRmlsZShzc3RhYmxlLmdldEZpbGVuYW1lKCkpLm5ld1JlYWRXcml0ZUNoYW5uZWwoKSkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsZUNoYW5uZWwucG9zaXRpb24oc3RhcnRQb3NpdGlvbik7Ci0gICAgICAgICAgICBmaWxlQ2hhbm5lbC53cml0ZShCeXRlQnVmZmVyVXRpbC5ieXRlcyhTdHJpbmdVdGlscy5yZXBlYXQoJ3onLCAoaW50KSAoZW5kUG9zaXRpb24gLSBzdGFydFBvc2l0aW9uKSkpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ2h1bmtDYWNoZS5pbnN0YW5jZSAhPSBudWxsKQotICAgICAgICAgICAgQ2h1bmtDYWNoZS5pbnN0YW5jZS5pbnZhbGlkYXRlRmlsZShzc3RhYmxlLmdldEZpbGVuYW1lKCkpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIGFzc2VydE9yZGVyZWRBbGwoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgZXhwZWN0ZWRTaXplKQotICAgIHsKLSAgICAgICAgYXNzZXJ0T3JkZXJlZChVdGlsLmNtZChjZnMpLmJ1aWxkKCksIGV4cGVjdGVkU2l6ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRPcmRlcmVkKFJlYWRDb21tYW5kIGNtZCwgaW50IGV4cGVjdGVkU2l6ZSkKLSAgICB7Ci0gICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgRGVjb3JhdGVkS2V5IHByZXYgPSBudWxsOwotICAgICAgICBmb3IgKFBhcnRpdGlvbiBwYXJ0aXRpb24gOiBVdGlsLmdldEFsbFVuZmlsdGVyZWQoY21kKSkKLSAgICAgICAgewotICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGN1cnJlbnQgPSBwYXJ0aXRpb24ucGFydGl0aW9uS2V5KCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJrZXkgIiArIGN1cnJlbnQgKyAiIGRvZXMgbm90IHNvcnQgYWZ0ZXIgcHJldmlvdXMga2V5ICIgKyBwcmV2LCBwcmV2ID09IG51bGwgfHwgcHJldi5jb21wYXJlVG8oY3VycmVudCkgPCAwKTsKLSAgICAgICAgICAgIHByZXYgPSBjdXJyZW50OwotICAgICAgICAgICAgKytzaXplOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFNpemUsIHNpemUpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBmaWxsQ0YoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgcGFydGl0aW9uc1BlclNTVGFibGUpCi0gICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpdGlvbnNQZXJTU1RhYmxlOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhcnRpdGlvblVwZGF0ZSB1cGRhdGUgPSBVcGRhdGVCdWlsZGVyLmNyZWF0ZShjZnMubWV0YWRhdGEoKSwgU3RyaW5nLnZhbHVlT2YoaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdSb3coInIxIikuYWRkKCJ2YWwiLCAiMSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdSb3coInIxIikuYWRkKCJ2YWwiLCAiMSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgICAgICAgICBuZXcgTXV0YXRpb24odXBkYXRlKS5hcHBseVVuc2FmZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmaWxsSW5kZXhDRihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGJvb2xlYW4gY29tcG9zaXRlLCBsb25nIC4uLiB2YWx1ZXMpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdmFsdWVzLmxlbmd0aCAlIDIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkgKz0yKQotICAgICAgICB7Ci0gICAgICAgICAgICBVcGRhdGVCdWlsZGVyIGJ1aWxkZXIgPSBVcGRhdGVCdWlsZGVyLmNyZWF0ZShjZnMubWV0YWRhdGEoKSwgU3RyaW5nLnZhbHVlT2YoaSkpOwotICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLm5ld1JvdygiYyIgKyBpKQotICAgICAgICAgICAgICAgICAgICAgICAuYWRkKENPTF9JTkRFWCwgdmFsdWVzW2ldKQotICAgICAgICAgICAgICAgICAgICAgICAuYWRkKENPTF9OT05fSU5ERVgsIHZhbHVlc1tpICsgMV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIubmV3Um93KCkKLSAgICAgICAgICAgICAgICAgICAgICAgLmFkZChDT0xfSU5ERVgsIHZhbHVlc1tpXSkKLSAgICAgICAgICAgICAgICAgICAgICAgLmFkZChDT0xfTk9OX0lOREVYLCB2YWx1ZXNbaSArIDFdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ldyBNdXRhdGlvbihidWlsZGVyLmJ1aWxkKCkpLmFwcGx5VW5zYWZlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGZpbGxDb3VudGVyQ0YoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgcGFydGl0aW9uc1BlclNTVGFibGUpIHRocm93cyBXcml0ZVRpbWVvdXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9uc1BlclNTVGFibGU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSA9IFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmcy5tZXRhZGF0YSgpLCBTdHJpbmcudmFsdWVPZihpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1JvdygicjEiKS5hZGQoInZhbCIsIDEwMEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgbmV3IENvdW50ZXJNdXRhdGlvbihuZXcgTXV0YXRpb24odXBkYXRlKSwgQ29uc2lzdGVuY3lMZXZlbC5PTkUpLmFwcGx5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJDb2x1bW5WYWxpZGF0aW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBSZXF1ZXN0RXhlY3V0aW9uRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFF1ZXJ5UHJvY2Vzc29yLnByb2Nlc3MoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIFRBQkxFIFwiJXNcIi50ZXN0X2NvbXBhY3Rfc3RhdGljX2NvbHVtbnMgKGEgYmlnaW50LCBiIHRpbWV1dWlkLCBjIGJvb2xlYW4gc3RhdGljLCBkIHRleHQsIFBSSU1BUlkgS0VZIChhLCBiKSkiLCBrc05hbWUpLCBDb25zaXN0ZW5jeUxldmVsLk9ORSk7Ci0KLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoInRlc3RfY29tcGFjdF9zdGF0aWNfY29sdW1ucyIpOwotCi0gICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJJTlNFUlQgSU5UTyBcIiVzXCIudGVzdF9jb21wYWN0X3N0YXRpY19jb2x1bW5zIChhLCBiLCBjLCBkKSBWQUxVRVMgKDEyMywgYzNkYjA3ZTgtYjYwMi0xMWUzLWJjNmItZTBiOWE1NGE2ZDkzLCB0cnVlLCAnZm9vYmFyJykiLCBrc05hbWUpKTsKLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wZXJmb3JtU2NydWIoY2ZzLCBmYWxzZSwgdHJ1ZSwgMik7Ci0KLSAgICAgICAgUXVlcnlQcm9jZXNzb3IucHJvY2VzcyhTdHJpbmcuZm9ybWF0KCJDUkVBVEUgVEFCTEUgXCIlc1wiLnRlc3Rfc2NydWJfdmFsaWRhdGlvbiAoYSB0ZXh0IHByaW1hcnkga2V5LCBiIGludCkiLCBrc05hbWUpLCBDb25zaXN0ZW5jeUxldmVsLk9ORSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmczIgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgidGVzdF9zY3J1Yl92YWxpZGF0aW9uIik7Ci0KLSAgICAgICAgbmV3IE11dGF0aW9uKFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmczIubWV0YWRhdGEoKSwgImtleSIpLm5ld1JvdygpLmFkZCgiYiIsIEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMSkpLmJ1aWxkKCkpLmFwcGx5KCk7Ci0gICAgICAgIFV0aWwuZmx1c2goY2ZzMik7Ci0KLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGVyZm9ybVNjcnViKGNmczIsIGZhbHNlLCBmYWxzZSwgMik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRm9yIENBU1NBTkRSQS02ODkyIHRvbywgY2hlY2sgdGhhdCBmb3IgYSBjb21wYWN0IHRhYmxlIHdpdGggb25lIGNsdXN0ZXIgY29sdW1uLCB3ZSBjYW4gaW5zZXJ0IHdoYXRldmVyCi0gICAgICogd2Ugd2FudCBhcyB2YWx1ZSBmb3IgdGhlIGNsdXN0ZXJpbmcgY29sdW1uLCBpbmNsdWRpbmcgc29tZXRoaW5nIHRoYXQgd291bGQgY29uZmxpY3Qgd2l0aCBhIENRTCBjb2x1bW4gZGVmaW5pdGlvbi4KLSAgICAgKi8KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0aW9uQ29tcGFjdFN0b3JhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBRdWVyeVByb2Nlc3Nvci5wcm9jZXNzKFN0cmluZy5mb3JtYXQoIkNSRUFURSBUQUJMRSBcIiVzXCIudGVzdF9jb21wYWN0X2R5bmFtaWNfY29sdW1ucyAoYSBpbnQsIGIgdGV4dCwgYyB0ZXh0LCBQUklNQVJZIEtFWSAoYSwgYikpIFdJVEggQ09NUEFDVCBTVE9SQUdFIiwga3NOYW1lKSwgQ29uc2lzdGVuY3lMZXZlbC5PTkUpOwotCi0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKCJ0ZXN0X2NvbXBhY3RfZHluYW1pY19jb2x1bW5zIik7Ci0KLSAgICAgICAgUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPIFwiJXNcIi50ZXN0X2NvbXBhY3RfZHluYW1pY19jb2x1bW5zIChhLCBiLCBjKSBWQUxVRVMgKDAsICdhJywgJ2ZvbycpIiwga3NOYW1lKSk7Ci0gICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJJTlNFUlQgSU5UTyBcIiVzXCIudGVzdF9jb21wYWN0X2R5bmFtaWNfY29sdW1ucyAoYSwgYiwgYykgVkFMVUVTICgwLCAnYicsICdiYXInKSIsIGtzTmFtZSkpOwotICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gXCIlc1wiLnRlc3RfY29tcGFjdF9keW5hbWljX2NvbHVtbnMgKGEsIGIsIGMpIFZBTFVFUyAoMCwgJ2MnLCAnYm9vJykiLCBrc05hbWUpKTsKLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wZXJmb3JtU2NydWIoY2ZzLCB0cnVlLCB0cnVlLCAyKTsKLQotICAgICAgICAvLyBTY3J1YiBpcyBzaWxlbnQsIGJ1dCBpdCB3aWxsIHJlbW92ZSBicm9rZW4gcmVjb3Jkcy4gU28gcmVhZGluZyBldmVyeXRoaW5nIGJhY2sgdG8gbWFrZSBzdXJlIG5vdGhpbmcgdG8gInNjcnViYmVkIGF3YXkiCi0gICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcnMgPSBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiU0VMRUNUICogRlJPTSBcIiVzXCIudGVzdF9jb21wYWN0X2R5bmFtaWNfY29sdW1ucyIsIGtzTmFtZSkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJzLnNpemUoKSk7Ci0KLSAgICAgICAgSXRlcmF0b3I8VW50eXBlZFJlc3VsdFNldC5Sb3c+IGl0ZXIgPSBycy5pdGVyYXRvcigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIGl0ZXIubmV4dCgpLmdldFN0cmluZygiYyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBpdGVyLm5leHQoKS5nZXRTdHJpbmcoImMiKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYm9vIiwgaXRlci5uZXh0KCkuZ2V0U3RyaW5nKCJjIikpOwotICAgIH0KLQotICAgIEBUZXN0IC8qIENBU1NBTkRSQS01MTc0ICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNjcnViS2V5c0luZGV4X3ByZXNlcnZlT3JkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vSWYgdGhlIHBhcnRpdGlvbmVyIHByZXNlcnZlcyB0aGUgb3JkZXIgdGhlbiBTZWNvbmRhcnlJbmRleCB1c2VzIEJ5dGVzVHlwZSBjb21wYXJhdG9yLAotICAgICAgICAvLyBvdGhlcndpc2UgaXQgdXNlcyBMb2NhbEJ5UGFydGl0aW9uZXJUeXBlCi0gICAgICAgIHRlc3RTY3J1YkluZGV4KENGX0lOREVYMV9CWVRFT1JERVJFRCwgQ09MX0lOREVYLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJDb21wb3NpdGVJbmRleF9wcmVzZXJ2ZU9yZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0ZXN0U2NydWJJbmRleChDRl9JTkRFWDJfQllURU9SREVSRUQsIENPTF9JTkRFWCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJLZXlzSW5kZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRlc3RTY3J1YkluZGV4KENGX0lOREVYMSwgQ09MX0lOREVYLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJDb21wb3NpdGVJbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGVzdFNjcnViSW5kZXgoQ0ZfSU5ERVgyLCBDT0xfSU5ERVgsIHRydWUsIHRydWUpOwotICAgIH0KLQotICAgIEBUZXN0IC8qIENBU1NBTkRSQS01MTc0ICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZhaWxTY3J1YktleXNJbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGVzdFNjcnViSW5kZXgoQ0ZfSU5ERVgxLCBDT0xfSU5ERVgsIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbFNjcnViQ29tcG9zaXRlSW5kZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRlc3RTY3J1YkluZGV4KENGX0lOREVYMiwgQ09MX0lOREVYLCB0cnVlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJUd2ljZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGVzdFNjcnViSW5kZXgoQ0ZfSU5ERVgyLCBDT0xfSU5ERVgsIHRydWUsIHRydWUsIHRydWUpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJTYW1lUGFyYW1ldGVyVmFsdWUiKQotICAgIHByaXZhdGUgdm9pZCB0ZXN0U2NydWJJbmRleChTdHJpbmcgY2ZOYW1lLCBTdHJpbmcgY29sTmFtZSwgYm9vbGVhbiBjb21wb3NpdGUsIGJvb2xlYW4gLi4uIHNjcnVicykKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKGNmTmFtZSk7Ci0KLSAgICAgICAgaW50IG51bVJvd3MgPSAxMDAwOwotICAgICAgICBsb25nW10gY29sVmFsdWVzID0gbmV3IGxvbmcgW251bVJvd3MgKiAyXTsgLy8gZWFjaCByb3cgaGFzIHR3byBjb2x1bW5zCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sVmFsdWVzLmxlbmd0aDsgaSs9MikKLSAgICAgICAgewotICAgICAgICAgICAgY29sVmFsdWVzW2ldID0gKGkgJSA0ID09IDAgPyAxTCA6IDJMKTsgLy8gaW5kZXggY29sdW1uCi0gICAgICAgICAgICBjb2xWYWx1ZXNbaSsxXSA9IDNMOyAvL290aGVyIGNvbHVtbgotICAgICAgICB9Ci0gICAgICAgIGZpbGxJbmRleENGKGNmcywgY29tcG9zaXRlLCBjb2xWYWx1ZXMpOwotCi0gICAgICAgIC8vIGNoZWNrIGluZGV4Ci0KLSAgICAgICAgYXNzZXJ0T3JkZXJlZChVdGlsLmNtZChjZnMpLmZpbHRlck9uKGNvbE5hbWUsIE9wZXJhdG9yLkVRLCAxTCkuYnVpbGQoKSwgbnVtUm93cyAvIDIpOwotCi0gICAgICAgIC8vIHNjcnViIGluZGV4Ci0gICAgICAgIFNldDxDb2x1bW5GYW1pbHlTdG9yZT4gaW5kZXhDZnNzID0gY2ZzLmluZGV4TWFuYWdlci5nZXRBbGxJbmRleENvbHVtbkZhbWlseVN0b3JlcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW5kZXhDZnNzLnNpemUoKSk7Ci0gICAgICAgIGZvcihDb2x1bW5GYW1pbHlTdG9yZSBpbmRleENmcyA6IGluZGV4Q2ZzcykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzY3J1YnMubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmYWlsdXJlID0gIXNjcnVic1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoZmFpbHVyZSkKLSAgICAgICAgICAgICAgICB7IC8vbWFrZSBzdXJlIHRoZSBuZXh0IHNjcnViIGZhaWxzCi0gICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2UoaW5kZXhDZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKDFMKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoMkwpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzIHJlc3VsdCA9IGluZGV4Q2ZzLnNjcnViKGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLDApOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWlsdXJlID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuQWxsU1NUYWJsZU9wU3RhdHVzLkFCT1JURUQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMuU1VDQ0VTU0ZVTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gY2hlY2sgaW5kZXggaXMgc3RpbGwgd29ya2luZwotICAgICAgICBhc3NlcnRPcmRlcmVkKFV0aWwuY21kKGNmcykuZmlsdGVyT24oY29sTmFtZSwgT3BlcmF0b3IuRVEsIDFMKS5idWlsZCgpLCBudW1Sb3dzIC8gMik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU1NUYWJsZU11bHRpV3JpdGVyIGNyZWF0ZVRlc3RXcml0ZXIoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBsb25nIGtleUNvdW50LCBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhLCBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4pCi0gICAgewotICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciA9IG5ldyBTZXJpYWxpemF0aW9uSGVhZGVyKHRydWUsIG1ldGFkYXRhLmdldCgpLCBtZXRhZGF0YS5nZXQoKS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKLSAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IE1ldGFkYXRhQ29sbGVjdG9yKG1ldGFkYXRhLmdldCgpLmNvbXBhcmF0b3IpLnNzdGFibGVMZXZlbCgwKTsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0TXVsdGlXcml0ZXIobmV3IFRlc3RXcml0ZXIoZGVzY3JpcHRvciwga2V5Q291bnQsIDAsIG51bGwsIGZhbHNlLCBtZXRhZGF0YSwgY29sbGVjdG9yLCBoZWFkZXIsIHR4biksIHR4bik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdE11bHRpV3JpdGVyIGV4dGVuZHMgU2ltcGxlU1NUYWJsZU11bHRpV3JpdGVyCi0gICAgewotICAgICAgICBUZXN0TXVsdGlXcml0ZXIoU1NUYWJsZVdyaXRlciB3cml0ZXIsIExpZmVjeWNsZU5ld1RyYWNrZXIgbGlmZWN5Y2xlTmV3VHJhY2tlcikKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIod3JpdGVyLCBsaWZlY3ljbGVOZXdUcmFja2VyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3Qgd3JpdGVyIHRoYXQgYWxsb3dzIHRvIHdyaXRlIG91dCBvZiBvcmRlciBTU1RhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RXcml0ZXIgZXh0ZW5kcyBCaWdUYWJsZVdyaXRlcgotICAgIHsKLSAgICAgICAgVGVzdFdyaXRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGxvbmcga2V5Q291bnQsIGxvbmcgcmVwYWlyZWRBdCwgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwgYm9vbGVhbiBpc1RyYW5zaWVudCwgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBjb2xsZWN0b3IsIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyLCBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyKGRlc2NyaXB0b3IsIGtleUNvdW50LCByZXBhaXJlZEF0LCBwZW5kaW5nUmVwYWlyLCBpc1RyYW5zaWVudCwgbWV0YWRhdGEsIGNvbGxlY3RvciwgaGVhZGVyLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCB0eG4pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBsb25nIGJlZm9yZUFwcGVuZChEZWNvcmF0ZWRLZXkgZGVjb3JhdGVkS2V5KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZGF0YUZpbGUucG9zaXRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHdpdGggaW52YWxpZCBzc3RhYmxlcyAoY29udGFpbmluZyBkdXBsaWNhdGUgZW50cmllcyBpbiAyLjAgYW5kIDMuMCBzdG9yYWdlIGZvcm1hdCksCi0gICAgICogdGhhdCB3ZXJlIGNhdXNlZCBieSB1cGdyYWRpbmcgZnJvbSAyLnggd2l0aCBkdXBsaWNhdGUgcmFuZ2UgdG9tYnN0b25lcy4KLSAgICAgKgotICAgICAqIFNlZSBDQVNTQU5EUkEtMTIxNDQgZm9yIGRldGFpbHMuCi0gICAgICovCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyT3V0RHVwbGljYXRlcygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIElQYXJ0aXRpb25lciBvbGRQYXJ0ID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBhcnRpdGlvbmVyKCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGFydGl0aW9uZXJVbnNhZmUoTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlKTsKLSAgICAgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLnByb2Nlc3MoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIFRBQkxFIFwiJXNcIi5jZl93aXRoX2R1cGxpY2F0ZXNfM18wIChhIGludCwgYiBpbnQsIGMgaW50LCBQUklNQVJZIEtFWSAoYSwgYikpIiwga3NOYW1lKSwgQ29uc2lzdGVuY3lMZXZlbC5PTkUpOwotCi0gICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgiY2Zfd2l0aF9kdXBsaWNhdGVzXzNfMCIpOwotCi0gICAgICAgICAgICBQYXRoIGxlZ2FjeVNTVGFibGVSb290ID0gUGF0aHMuZ2V0KFN5c3RlbS5nZXRQcm9wZXJ0eShJTlZBTElEX0xFR0FDWV9TU1RBQkxFX1JPT1RfUFJPUCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXlzcGFjZTEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Zfd2l0aF9kdXBsaWNhdGVzXzNfMCIpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlbmFtZSA6IG5ldyBTdHJpbmdbXXsgIm1iLTMtYmlnLUNvbXByZXNzaW9uSW5mby5kYiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iLTMtYmlnLURpZ2VzdC5jcmMzMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iLTMtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWItMy1iaWctU3VtbWFyeS5kYiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iLTMtYmlnLURhdGEuZGIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYi0zLWJpZy1GaWx0ZXIuZGIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYi0zLWJpZy1TdGF0aXN0aWNzLmRiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWItMy1iaWctVE9DLnR4dCIgfSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWxlcy5jb3B5KFBhdGhzLmdldChsZWdhY3lTU1RhYmxlUm9vdC50b1N0cmluZygpLCBmaWxlbmFtZSksIGNmcy5nZXREaXJlY3RvcmllcygpLmdldERpcmVjdG9yeUZvck5ld1NTVGFibGVzKCkudG9QYXRoKCkucmVzb2x2ZShmaWxlbmFtZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjZnMubG9hZE5ld1NTVGFibGVzKCk7Ci0KLSAgICAgICAgICAgIGNmcy5zY3J1Yih0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAxKTsKLQotICAgICAgICAgICAgVW50eXBlZFJlc3VsdFNldCBycyA9IFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgKiBGUk9NIFwiJXNcIi5jZl93aXRoX2R1cGxpY2F0ZXNfM18wIiwga3NOYW1lKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBycy5zaXplKCkpOwotCi0gICAgICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiREVMRVRFIEZST00gXCIlc1wiLmNmX3dpdGhfZHVwbGljYXRlc18zXzAgV0hFUkUgYT0xIEFORCBiID0yIiwga3NOYW1lKSk7Ci0gICAgICAgICAgICBycyA9IFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgKiBGUk9NIFwiJXNcIi5jZl93aXRoX2R1cGxpY2F0ZXNfM18wIiwga3NOYW1lKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJzKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBycy5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFBhcnRpdGlvbmVyVW5zYWZlKG9sZFBhcnQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NjcnViVG9vbFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TY3J1YlRvb2xUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDgxMGMuLjAwMDAwMDAKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NjcnViVG9vbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOwotCi1pbXBvcnQgamF2YS5pby5JT0Vycm9yOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7Ci0KLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVVJRFR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuV3JpdGVUaW1lb3V0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuU3RhbmRhbG9uZVNjcnViYmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci1pbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuY291bnRlckNGTUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLmdldENvbXByZXNzaW9uUGFyYW1ldGVyczsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLmxvYWRTY2hlbWE7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNjcnViVGVzdC5DRl9JTkRFWDE7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNjcnViVGVzdC5DRl9JTkRFWDFfQllURU9SREVSRUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNjcnViVGVzdC5DRl9JTkRFWDI7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNjcnViVGVzdC5DRl9JTkRFWDJfQllURU9SREVSRUQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNjcnViVGVzdC5DRl9VVUlEOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TY3J1YlRlc3QuQ09NUFJFU1NJT05fQ0hVTktfTEVOR1RIOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TY3J1YlRlc3QuQ09VTlRFUl9DRjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2NydWJUZXN0LmFzc2VydE9yZGVyZWRBbGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNjcnViVGVzdC5maWxsQ0Y7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNjcnViVGVzdC5maWxsQ291bnRlckNGOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TY3J1YlRlc3Qub3ZlcnJpZGVXaXRoR2FyYmFnZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCi1wdWJsaWMgY2xhc3MgU2NydWJUb29sVGVzdAotewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRiA9ICJzY3J1Yl90b29sX3Rlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgc2VxID0gbmV3IEF0b21pY0ludGVnZXIoKTsKLQotICAgIFN0cmluZyBrc05hbWU7Ci0gICAgS2V5c3BhY2Uga2V5c3BhY2U7Ci0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBsb2FkU2NoZW1hKCk7Ci0gICAgfQotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldHVwKCkKLSAgICB7Ci0gICAgICAgIGtzTmFtZSA9ICJzY3J1Yl90ZXN0XyIgKyBzZXEuaW5jcmVtZW50QW5kR2V0KCk7Ci0gICAgICAgIGNyZWF0ZUtleXNwYWNlKGtzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoa3NOYW1lLCBDRiksCi0gICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKGtzTmFtZSwgQ09VTlRFUl9DRikuY29tcHJlc3Npb24oZ2V0Q29tcHJlc3Npb25QYXJhbWV0ZXJzKENPTVBSRVNTSU9OX0NIVU5LX0xFTkdUSCkpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoa3NOYW1lLCBDRl9VVUlELCAwLCBVVUlEVHlwZS5pbnN0YW5jZSksCi0gICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5rZXlzSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgxLCB0cnVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmNvbXBvc2l0ZUluZGV4Q0ZNRChrc05hbWUsIENGX0lOREVYMiwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5rZXlzSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgxX0JZVEVPUkRFUkVELCB0cnVlKS5wYXJ0aXRpb25lcihCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmNvbXBvc2l0ZUluZGV4Q0ZNRChrc05hbWUsIENGX0lOREVYMl9CWVRFT1JERVJFRCwgdHJ1ZSkucGFydGl0aW9uZXIoQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5pbnN0YW5jZSkpOwotICAgICAgICBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NOYW1lKTsKLQotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlV0aWwuQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QsICJ0cnVlIik7IC8vIE5lY2Vzc2FyeSBmb3IgdGVzdGluZwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNjcnViT25lUGFydGl0aW9uV2l0aFRvb2woKQotICAgIHsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOwotCi0gICAgICAgIC8vIGluc2VydCBkYXRhIGFuZCB2ZXJpZnkgd2UgZ2V0IGl0IGJhY2sgdy8gcmFuZ2UgcXVlcnkKLSAgICAgICAgZmlsbENGKGNmcywgMSk7Ci0gICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKLQotICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU3RhbmRhbG9uZVNjcnViYmVyLmNsYXNzLCBrc05hbWUsIENGKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJQcmUtc2NydWIgc3N0YWJsZXMgc25hcHNob3R0ZWQgaW50byIpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIjEgcGFydGl0aW9ucyBpbiBuZXcgc3N0YWJsZSBhbmQgMCBlbXB0eSIpOwotICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7Ci0KLSAgICAgICAgLy8gY2hlY2sgZGF0YSBpcyBzdGlsbCB0aGVyZQotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcFNjcnViQ29ycnVwdGVkQ291bnRlclBhcnRpdGlvbldpdGhUb29sKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXcml0ZVRpbWVvdXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPVU5URVJfQ0YpOwotICAgICAgICBpbnQgbnVtUGFydGl0aW9ucyA9IDEwMDA7Ci0KLSAgICAgICAgZmlsbENvdW50ZXJDRihjZnMsIG51bVBhcnRpdGlvbnMpOwotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgbnVtUGFydGl0aW9ucyk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0gICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjAiKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjEiKSk7Ci0KLSAgICAgICAgLy8gd2l0aCBza2lwQ29ycnVwdGVkID09IHRydWUsIHRoZSBjb3JydXB0IHJvd3Mgd2lsbCBiZSBza2lwcGVkCi0gICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTdGFuZGFsb25lU2NydWJiZXIuY2xhc3MsICItcyIsIGtzTmFtZSwgQ09VTlRFUl9DRik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiMCBlbXB0eSIpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoInBhcnRpdGlvbnMgdGhhdCB3ZXJlIHNraXBwZWQiKTsKLSAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1NraXBTY3J1YkNvcnJ1cHRlZENvdW50ZXJQYXJ0aXRpb25XaXRoVG9vbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1VOVEVSX0NGKTsKLSAgICAgICAgaW50IG51bVBhcnRpdGlvbnMgPSAxMDAwOwotCi0gICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCBudW1QYXJ0aXRpb25zKTsKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIG51bVBhcnRpdGlvbnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7Ci0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICBvdmVycmlkZVdpdGhHYXJiYWdlKHNzdGFibGUsIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIwIiksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIxIikpOwotCi0gICAgICAgIC8vIHdpdGggc2tpcENvcnJ1cHRlZCA9PSBmYWxzZSwgdGhlIHNjcnViIGlzIGV4cGVjdGVkIHRvIGZhaWwKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU3RhbmRhbG9uZVNjcnViYmVyLmNsYXNzLCBrc05hbWUsIENPVU5URVJfQ0YpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FcnJvciBlcnIpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXJyLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0NoZWNrU2NydWJNdWx0aVBhcnRpdGlvbldpdGhUb29sKCkKLSAgICB7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKLQotICAgICAgICAvLyBpbnNlcnQgZGF0YSBhbmQgdmVyaWZ5IHdlIGdldCBpdCBiYWNrIHcvIHJhbmdlIHF1ZXJ5Ci0gICAgICAgIGZpbGxDRihjZnMsIDEwKTsKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEwKTsKLQotICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU3RhbmRhbG9uZVNjcnViYmVyLmNsYXNzLCAiLW4iLCBrc05hbWUsIENGKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJQcmUtc2NydWIgc3N0YWJsZXMgc25hcHNob3R0ZWQgaW50byIpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIjEwIHBhcnRpdGlvbnMgaW4gbmV3IHNzdGFibGUgYW5kIDAgZW1wdHkiKTsKLSAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotCi0gICAgICAgIC8vIGNoZWNrIGRhdGEgaXMgc3RpbGwgdGhlcmUKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEwKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJGaXhWYWxpZGF0ZU9ubHlXaXRoVG9vbCgpCi0gICAgewotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7Ci0KLSAgICAgICAgZmlsbENGKGNmcywgMSk7Ci0gICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKLQotICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU3RhbmRhbG9uZVNjcnViYmVyLmNsYXNzLCAiLWUiLCAidmFsaWRhdGVfb25seSIsIGtzTmFtZSwgQ0YpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIk5vdCBjb250aW51aW5nIHdpdGggc2NydWIsIHNpbmNlICctLWhlYWRlci1maXggdmFsaWRhdGUtb25seScgd2FzIHNwZWNpZmllZC4iKTsKLSAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyRml4VmFsaWRhdGVXaXRoVG9vbCgpCi0gICAgewotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7Ci0KLSAgICAgICAgZmlsbENGKGNmcywgMSk7Ci0gICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKLQotICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU3RhbmRhbG9uZVNjcnViYmVyLmNsYXNzLCAiLWUiLCAidmFsaWRhdGUiLCBrc05hbWUsIENGKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJQcmUtc2NydWIgc3N0YWJsZXMgc25hcHNob3R0ZWQgaW50byIpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIjEgcGFydGl0aW9ucyBpbiBuZXcgc3N0YWJsZSBhbmQgMCBlbXB0eSIpOwotICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7Ci0gICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJGaXhGaXhPbmx5V2l0aFRvb2woKQotICAgIHsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOwotCi0gICAgICAgIGZpbGxDRihjZnMsIDEpOwotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7Ci0KLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywgIi1lIiwgImZpeC1vbmx5Iiwga3NOYW1lLCBDRik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiTm90IGNvbnRpbnVpbmcgd2l0aCBzY3J1Yiwgc2luY2UgJy0taGVhZGVyLWZpeCBmaXgtb25seScgd2FzIHNwZWNpZmllZC4iKTsKLSAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyRml4V2l0aFRvb2woKQotICAgIHsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOwotCi0gICAgICAgIGZpbGxDRihjZnMsIDEpOwotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7Ci0KLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywgIi1lIiwgImZpeCIsIGtzTmFtZSwgQ0YpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIlByZS1zY3J1YiBzc3RhYmxlcyBzbmFwc2hvdHRlZCBpbnRvIik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiMSBwYXJ0aXRpb25zIGluIG5ldyBzc3RhYmxlIGFuZCAwIGVtcHR5Iik7Ci0gICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckZpeE5vQ2hlY2tzV2l0aFRvb2woKQotICAgIHsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOwotCi0gICAgICAgIGZpbGxDRihjZnMsIDEpOwotICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7Ci0KLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywgIi1lIiwgIm9mZiIsIGtzTmFtZSwgQ0YpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIlByZS1zY3J1YiBzc3RhYmxlcyBzbmFwc2hvdHRlZCBpbnRvIik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiMSBwYXJ0aXRpb25zIGluIG5ldyBzc3RhYmxlIGFuZCAwIGVtcHR5Iik7Ci0gICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKLSAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TZXJpYWxpemF0aW9uSGVhZGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NlcmlhbGl6YXRpb25IZWFkZXJUZXN0LmphdmEKaW5kZXggOGY3ZTI0Yi4uZDc3ZTFmZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NlcmlhbGl6YXRpb25IZWFkZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NlcmlhbGl6YXRpb25IZWFkZXJUZXN0LmphdmEKQEAgLTE4LDcgKzE4LDE2IEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGI7CiAKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlGdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uRmlsZXM7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKQEAgLTM4LDIzICs0NywxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIAogcHVibGljIGNsYXNzIFNlcmlhbGl6YXRpb25IZWFkZXJUZXN0CiB7CkBAIC02OCw5ICs2Niw4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdHRlbkFzRGlmZmVyZW50S2luZCgpIHRocm93cyBFeGNlcHRpb24KICAgICB7CisgICAgICAgIFNTVGFibGVGb3JtYXQ8PywgPz4gZm9ybWF0ID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpOwogICAgICAgICBmaW5hbCBTdHJpbmcgdGFibGVOYW1lID0gInRlc3RXcml0dGVuQXNEaWZmZXJlbnRLaW5kIjsKLS8vICAgICAgICBmaW5hbCBTdHJpbmcgc2NoZW1hQ3FsV2l0aFN0YXRpYyA9IFN0cmluZy5mb3JtYXQoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQsIGMgaW50LCB2IGludCBzdGF0aWMsIFBSSU1BUlkgS0VZKGssIGMpKSIsIHRhYmxlTmFtZSk7Ci0vLyAgICAgICAgZmluYWwgU3RyaW5nIHNjaGVtYUNxbFdpdGhSZWd1bGFyID0gU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIFRBQkxFICVzIChrIGludCwgYyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWShrLCBjKSkiLCB0YWJsZU5hbWUpOwogICAgICAgICBDb2x1bW5JZGVudGlmaWVyIHYgPSBDb2x1bW5JZGVudGlmaWVyLmdldEludGVybmVkKCJ2IiwgZmFsc2UpOwogICAgICAgICBUYWJsZU1ldGFkYXRhIHNjaGVtYVdpdGhTdGF0aWMgPSBUYWJsZU1ldGFkYXRhLmJ1aWxkZXIoS0VZU1BBQ0UsIHRhYmxlTmFtZSkKICAgICAgICAgICAgICAgICAuYWRkUGFydGl0aW9uS2V5Q29sdW1uKCJrIiwgSW50MzJUeXBlLmluc3RhbmNlKQpAQCAtODcsMTYgKzg0LDI2IEBACiAgICAgICAgIHNjaGVtYVdpdGhTdGF0aWMgPSBzY2hlbWFXaXRoU3RhdGljLnVuYnVpbGQoKS5yZWNvcmRDb2x1bW5Ecm9wKGNvbHVtblJlZ3VsYXIsIDBMKS5idWlsZCgpOwogICAgICAgICBzY2hlbWFXaXRoUmVndWxhciA9IHNjaGVtYVdpdGhSZWd1bGFyLnVuYnVpbGQoKS5yZWNvcmRDb2x1bW5Ecm9wKGNvbHVtblN0YXRpYywgMEwpLmJ1aWxkKCk7CiAKKyAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXJXaXRoU3RhdGljID0gbnVsbDsKKyAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXJXaXRoUmVndWxhciA9IG51bGw7CiAgICAgICAgIFN1cHBsaWVyPFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQ+IGlkID0gVXRpbC5uZXdTZXFHZW4oKTsKICAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZShGaWxlcy5jcmVhdGVUZW1wRGlyKCkpOwogICAgICAgICB0cnkKICAgICAgICAgewogICAgICAgICAgICAgQmlGdW5jdGlvbjxUYWJsZU1ldGFkYXRhLCBGdW5jdGlvbjxCeXRlQnVmZmVyLCBDbHVzdGVyaW5nPD8+PiwgQ2FsbGFibGU8RGVzY3JpcHRvcj4+IHdyaXRlciA9IChzY2hlbWEsIGNsdXN0ZXJpbmdGdW5jdGlvbikgLT4gKCkgLT4gewotICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKEJpZ0Zvcm1hdC5sYXRlc3RWZXJzaW9uLCBkaXIsIHNjaGVtYS5rZXlzcGFjZSwgc2NoZW1hLm5hbWUsIGlkLmdldCgpLCBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKTsKKyAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcihmb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpLCBkaXIsIHNjaGVtYS5rZXlzcGFjZSwgc2NoZW1hLm5hbWUsIGlkLmdldCgpKTsKIAogICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyID0gU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlV2l0aG91dFN0YXRzKHNjaGVtYSk7CiAgICAgICAgICAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBMaWZlY3ljbGVUcmFuc2FjdGlvbi5vZmZsaW5lKE9wZXJhdGlvblR5cGUuV1JJVEUpOwotICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVdyaXRlciBzc3RhYmxlV3JpdGVyID0gQmlnVGFibGVXcml0ZXIuY3JlYXRlKFRhYmxlTWV0YWRhdGFSZWYuZm9yT2ZmbGluZVRvb2xzKHNjaGVtYSksIGRlc2NyaXB0b3IsIDEsIDBMLCBudWxsLCBmYWxzZSwgMCwgaGVhZGVyLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgIHR4bikpCisgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlV3JpdGVyIHNzdGFibGVXcml0ZXIgPSBkZXNjcmlwdG9yLmdldEZvcm1hdCgpLmdldFdyaXRlckZhY3RvcnkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZGVyKGRlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhYmxlTWV0YWRhdGFSZWYoVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHMoc2NoZW1hKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0S2V5Q291bnQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VyaWFsaXphdGlvbkhlYWRlcihoZWFkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZsdXNoT2JzZXJ2ZXJzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNZXRhZGF0YUNvbGxlY3RvcihuZXcgTWV0YWRhdGFDb2xsZWN0b3Ioc2NoZW1hLmNvbXBhcmF0b3IpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGREZWZhdWx0Q29tcG9uZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKHR4biwgbnVsbCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBDb2x1bW5NZXRhZGF0YSBjZCA9IHNjaGVtYS5nZXRDb2x1bW4odik7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IDUgOyArK2kpIHsKQEAgLTExNCw4ICsxMjEsOCBAQAogCiAgICAgICAgICAgICBEZXNjcmlwdG9yIHNzdGFibGVXaXRoUmVndWxhciA9IHdyaXRlci5hcHBseShzY2hlbWFXaXRoUmVndWxhciwgQnVmZmVyQ2x1c3RlcmluZzo6bmV3KS5jYWxsKCk7CiAgICAgICAgICAgICBEZXNjcmlwdG9yIHNzdGFibGVXaXRoU3RhdGljID0gd3JpdGVyLmFwcGx5KHNjaGVtYVdpdGhTdGF0aWMsIHZhbHVlIC0+IENsdXN0ZXJpbmcuU1RBVElDX0NMVVNURVJJTkcpLmNhbGwoKTsKLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyV2l0aFN0YXRpYyA9IFNTVGFibGVSZWFkZXIub3Blbk5vVmFsaWRhdGlvbihzc3RhYmxlV2l0aFN0YXRpYywgVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHMoc2NoZW1hV2l0aFJlZ3VsYXIpKTsKLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyV2l0aFJlZ3VsYXIgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24oc3N0YWJsZVdpdGhSZWd1bGFyLCBUYWJsZU1ldGFkYXRhUmVmLmZvck9mZmxpbmVUb29scyhzY2hlbWFXaXRoU3RhdGljKSk7CisgICAgICAgICAgICByZWFkZXJXaXRoU3RhdGljID0gU1NUYWJsZVJlYWRlci5vcGVuTm9WYWxpZGF0aW9uKG51bGwsIHNzdGFibGVXaXRoU3RhdGljLCBUYWJsZU1ldGFkYXRhUmVmLmZvck9mZmxpbmVUb29scyhzY2hlbWFXaXRoUmVndWxhcikpOworICAgICAgICAgICAgcmVhZGVyV2l0aFJlZ3VsYXIgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24obnVsbCwgc3N0YWJsZVdpdGhSZWd1bGFyLCBUYWJsZU1ldGFkYXRhUmVmLmZvck9mZmxpbmVUb29scyhzY2hlbWFXaXRoU3RhdGljKSk7CiAKICAgICAgICAgICAgIHRyeSAoSVNTVGFibGVTY2FubmVyIHBhcnRpdGlvbnMgPSByZWFkZXJXaXRoU3RhdGljLmdldFNjYW5uZXIoKSkgewogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IDUgOyArK2kpCkBAIC0xNDEsNiArMTQ4LDEwIEBACiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQogICAgICAgICB7CisgICAgICAgICAgICBpZiAocmVhZGVyV2l0aFN0YXRpYyAhPSBudWxsKQorICAgICAgICAgICAgICAgIHJlYWRlcldpdGhTdGF0aWMuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAocmVhZGVyV2l0aFJlZ3VsYXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZWFkZXJXaXRoUmVndWxhci5zZWxmUmVmKCkuY2xvc2UoKTsKICAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGVSZWN1cnNpdmUoZGlyKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TbmFwc2hvdFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TbmFwc2hvdFRlc3QuamF2YQppbmRleCBhYTcyNmVjLi5mZGZkZDZiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU25hcHNob3RUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1NuYXBzaG90VGVzdC5qYXZhCkBAIC0yNCw3ICsyNCw3IEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0LkNvbXBvbmVudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiAKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAgICAgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuZm9yY2VCbG9ja2luZ0ZsdXNoKENvbHVtbkZhbWlseVN0b3JlLkZsdXNoUmVhc29uLlVOSVRfVEVTVFMpOwogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldExpdmVTU1RhYmxlcygpKQogICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIHRvYyA9IG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuVE9DKSk7CisgICAgICAgICAgICBGaWxlIHRvYyA9IHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuVE9DKTsKICAgICAgICAgICAgIEZpbGVzLndyaXRlKHRvYy50b1BhdGgoKSwgbmV3IGJ5dGVbMF0sIFN0YW5kYXJkT3Blbk9wdGlvbi5UUlVOQ0FURV9FWElTVElORyk7CiAgICAgICAgIH0KICAgICAgICAgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuc25hcHNob3QoImhlbGxvIik7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3lzdGVtS2V5c3BhY2VNaWdyYXRvcjQxVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1N5c3RlbUtleXNwYWNlTWlncmF0b3I0MVRlc3QuamF2YQppbmRleCBiNTQzNjc5Li4yYTE1NjFiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3lzdGVtS2V5c3BhY2VNaWdyYXRvcjQxVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TeXN0ZW1LZXlzcGFjZU1pZ3JhdG9yNDFUZXN0LmphdmEKQEAgLTIwLDYgKzIwLDggQEAKIAogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOwpAQCAtMzIsNiArMzQsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxvbmdUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVGltZVVVSURUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwpAQCAtNDIsNiArNDUsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXMubm93OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIApAQCAtMjY0LDQgKzI2OSw1NSBAQAogICAgICAgICB9CiAgICAgICAgIGFzc2VydEVxdWFscygxLCByb3dDb3VudCk7CiAgICAgfQorICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pZ3JhdGVDb21wYWN0aW9uSGlzdG9yeSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyB0YWJsZSA9IFN0cmluZy5mb3JtYXQoIiVzLiVzIiwgU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FLCBTeXN0ZW1LZXlzcGFjZS5DT01QQUNUSU9OX0hJU1RPUlkpOworICAgICAgICBTdHJpbmcgaW5zZXJ0ID0gU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYnl0ZXNfaW4sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYnl0ZXNfb3V0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNvbHVtbmZhbWlseV9uYW1lLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImNvbXBhY3RlZF9hdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJrZXlzcGFjZV9uYW1lLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInJvd3NfbWVyZ2VkKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB2YWx1ZXMgKCA/LCA/LCA/LCA/LCA/LCA/LCA/ICkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSk7CisgICAgICAgIFRpbWVVVUlEIGNvbXBhY3Rpb25JZCA9IFRpbWVVVUlELkdlbmVyYXRvci5hdFVuaXhNaWxsaXMoY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIERhdGUgY29tcGFjdEF0ICA9IERhdGUuZnJvbShub3coKSk7CisgICAgICAgIE1hcDxJbnRlZ2VyLCBMb25nPiByb3dzTWVyZ2VkID0gSW1tdXRhYmxlTWFwLm9mKDYsIDFMKTsKKyAgICAgICAgZXhlY3V0ZShpbnNlcnQsCisgICAgICAgICAgICAgICAgY29tcGFjdGlvbklkLAorICAgICAgICAgICAgICAgIDEwTCwKKyAgICAgICAgICAgICAgICA1TCwKKyAgICAgICAgICAgICAgICAidGFibGUiLAorICAgICAgICAgICAgICAgIGNvbXBhY3RBdCwKKyAgICAgICAgICAgICAgICAia2V5c3BhY2UiLAorICAgICAgICAgICAgICAgIHJvd3NNZXJnZWQpOworICAgICAgICBTeXN0ZW1LZXlzcGFjZU1pZ3JhdG9yNDEubWlncmF0ZUNvbXBhY3Rpb25IaXN0b3J5KCk7CisKKyAgICAgICAgaW50IHJvd0NvdW50ID0gMDsKKyAgICAgICAgZm9yIChVbnR5cGVkUmVzdWx0U2V0LlJvdyByb3cgOiBleGVjdXRlKFN0cmluZy5mb3JtYXQoIlNFTEVDVCAqIEZST00gJXMgd2hlcmUga2V5c3BhY2VfbmFtZSA9ICdrZXlzcGFjZScgYW5kIGNvbHVtbmZhbWlseV9uYW1lID0gJ3RhYmxlJyBhbGxvdyBmaWx0ZXJpbmciLCB0YWJsZSkpKQorICAgICAgICB7CisgICAgICAgICAgICByb3dDb3VudCsrOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbXBhY3Rpb25JZCwgcm93LmdldFRpbWVVVUlEKCJpZCIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMEwsIHJvdy5nZXRMb25nKCJieXRlc19pbiIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg1TCwgcm93LmdldExvbmcoImJ5dGVzX291dCIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGFibGUiLCByb3cuZ2V0U3RyaW5nKCJjb2x1bW5mYW1pbHlfbmFtZSIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb21wYWN0QXQsIHJvdy5nZXRUaW1lc3RhbXAoImNvbXBhY3RlZF9hdCIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygia2V5c3BhY2UiLCByb3cuZ2V0U3RyaW5nKCJrZXlzcGFjZV9uYW1lIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJvd3NNZXJnZWQsIHJvdy5nZXRNYXAoInJvd3NfbWVyZ2VkIiwgSW50MzJUeXBlLmluc3RhbmNlLCBMb25nVHlwZS5pbnN0YW5jZSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZU1hcC5vZigpLCByb3cuZ2V0TWFwKCJjb21wYWN0aW9uX3Byb3BlcnRpZXMiLCBVVEY4VHlwZS5pbnN0YW5jZSwgVVRGOFR5cGUuaW5zdGFuY2UpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcm93Q291bnQpOworCisgICAgICAgIC8vVGVzdCBudWxscy9taXNzaW5nIGRvbid0IHByZXZlbnQgdGhlIHJvdyBmcm9tIHByb3BhZ2F0aW5nCisgICAgICAgIGV4ZWN1dGUoU3RyaW5nLmZvcm1hdCgiVFJVTkNBVEUgJXMiLCB0YWJsZSkpOworICAgICAgICAKKyAgICAgICAgZXhlY3V0ZShTdHJpbmcuZm9ybWF0KCJJTlNFUlQgSU5UTyAlcyAoaWQpIFZBTFVFUyAoPykiLCB0YWJsZSksIGNvbXBhY3Rpb25JZCk7CisgICAgICAgIFN5c3RlbUtleXNwYWNlTWlncmF0b3I0MS5taWdyYXRlQ29tcGFjdGlvbkhpc3RvcnkoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXhlY3V0ZShTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgKiBGUk9NICVzIiwgdGFibGUpKS5zaXplKCkpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TeXN0ZW1LZXlzcGFjZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9TeXN0ZW1LZXlzcGFjZVRlc3QuamF2YQppbmRleCBiZjU5YjYyLi4wYmFkZTRiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvU3lzdGVtS2V5c3BhY2VUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1N5c3RlbUtleXNwYWNlVGVzdC5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNhc3NhbmRyYVZlcnNpb247CkBAIC0xMDUsMTQgKzEwNiwxNCBAQAogICAgICAgICAvLyBGaXJzdCwgY2hlY2sgdGhhdCBpbiB0aGUgYWJzZW5jZSBvZiBhbnkgcHJldmlvdXMgaW5zdGFsbGVkIHZlcnNpb24sIHdlIGRvbid0IGNyZWF0ZSBzbmFwc2hvdHMKICAgICAgICAgZm9yIChDb2x1bW5GYW1pbHlTdG9yZSBjZnMgOiBLZXlzcGFjZS5vcGVuKFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmVzKCkpCiAgICAgICAgICAgICBjZnMuY2xlYXJVbnNhZmUoKTsKLSAgICAgICAgS2V5c3BhY2UuY2xlYXJTbmFwc2hvdChudWxsLCBTY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUUpOworICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5jbGVhclNuYXBzaG90KENvbGxlY3Rpb25zLmVtcHR5TWFwKCksIG51bGwsIFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSk7CiAKICAgICAgICAgU3lzdGVtS2V5c3BhY2Uuc25hcHNob3RPblZlcnNpb25DaGFuZ2UoKTsKICAgICAgICAgYXNzZXJ0RGVsZXRlZCgpOwogCiAgICAgICAgIC8vIG5vdyBzZXR1cCBzeXN0ZW0ubG9jYWwgYXMgaWYgd2UncmUgdXBncmFkaW5nIGZyb20gYSBwcmV2aW91cyB2ZXJzaW9uCiAgICAgICAgIHNldHVwUmVsZWFzZVZlcnNpb24oZ2V0T2xkZXJWZXJzaW9uU3RyaW5nKCkpOwotICAgICAgICBLZXlzcGFjZS5jbGVhclNuYXBzaG90KG51bGwsIFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSk7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmNsZWFyU25hcHNob3QoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwgbnVsbCwgU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FKTsKICAgICAgICAgYXNzZXJ0RGVsZXRlZCgpOwogCiAgICAgICAgIC8vIENvbXBhcmUgdmVyc2lvbnMgYWdhaW4gJiB2ZXJpZnkgdGhhdCBzbmFwc2hvdHMgd2VyZSBjcmVhdGVkIGZvciBhbGwgdGFibGVzIGluIHRoZSBzeXN0ZW0ga3MKQEAgLTEyNSw3ICsxMjYsNyBAQAogCiAgICAgICAgIC8vIGNsZWFyIG91dCB0aGUgc25hcHNob3RzICYgc2V0IHRoZSBwcmV2aW91cyByZWNvcmRlZCB2ZXJzaW9uIGVxdWFsIHRvIHRoZSBsYXRlc3QsIHdlIHNob3VsZG4ndAogICAgICAgICAvLyBzZWUgYW55IG5ldyBzbmFwc2hvdHMgY3JlYXRlZCB0aGlzIHRpbWUuCi0gICAgICAgIEtleXNwYWNlLmNsZWFyU25hcHNob3QobnVsbCwgU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FKTsKKyAgICAgICAgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuY2xlYXJTbmFwc2hvdChDb2xsZWN0aW9ucy5lbXB0eU1hcCgpLCBudWxsLCBTY2hlbWFDb25zdGFudHMuU1lTVEVNX0tFWVNQQUNFX05BTUUpOwogICAgICAgICBzZXR1cFJlbGVhc2VWZXJzaW9uKEZCVXRpbGl0aWVzLmdldFJlbGVhc2VWZXJzaW9uU3RyaW5nKCkpOwogCiAgICAgICAgIFN5c3RlbUtleXNwYWNlLnNuYXBzaG90T25WZXJzaW9uQ2hhbmdlKCk7CkBAIC0xMzQsNyArMTM1LDcgQEAKICAgICAgICAgLy8gMTAgZmlsZXMgZXhwZWN0ZWQuCiAgICAgICAgIGFzc2VydERlbGV0ZWQoKTsKIAotICAgICAgICBLZXlzcGFjZS5jbGVhclNuYXBzaG90KG51bGwsIFNjaGVtYUNvbnN0YW50cy5TWVNURU1fS0VZU1BBQ0VfTkFNRSk7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmNsZWFyU25hcHNob3QoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwgbnVsbCwgU2NoZW1hQ29uc3RhbnRzLlNZU1RFTV9LRVlTUEFDRV9OQU1FKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1ZlcmlmeVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9WZXJpZnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ODgzN2EuLjAwMDAwMDAKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL1ZlcmlmeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkNSQzMyOwotaW1wb3J0IGphdmEudXRpbC56aXAuQ2hlY2tlZElucHV0U3RyZWFtOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5DaGFyc2V0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXBkYXRlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmJhdGNobG9nLkJhdGNoOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmJhdGNobG9nLkJhdGNobG9nTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5DaHVua0NhY2hlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5WZXJpZmllcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVVSURUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5CeXRlT3JkZXJlZFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Xcml0ZVRpbWVvdXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSW5wdXRTdHJlYW1QbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuVG9rZW5NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcHJlc3Npb25QYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLmNvdW50ZXJDRk1EOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5sb2FkU2NoZW1hOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7Ci0KLS8qKgotICogVGVzdCBmb3Ige0BsaW5rIFZlcmlmaWVyfS4KLSAqIAotICogTm90ZTogdGhlIGNvbXBsZXRlIGNvdmVyYWdlIGlzIGNvbXBvc2VkIG9mOgotICogLSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuU3RhbmRhbG9uZVZlcmlmaWVyT25TU1RhYmxlc1Rlc3R9Ci0gKiAtIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5TdGFuZGFsb25lVmVyaWZpZXJUZXN0fQotICogLSB7QGxpbmsgVmVyaWZ5VGVzdH0KLSAqLwotcHVibGljIGNsYXNzIFZlcmlmeVRlc3QKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRSA9ICJLZXlzcGFjZTEiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGID0gIlN0YW5kYXJkMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0YyID0gIlN0YW5kYXJkMiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0YzID0gIlN0YW5kYXJkMyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0Y0ID0gIlN0YW5kYXJkNCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlRFUl9DRiA9ICJDb3VudGVyMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlRFUl9DRjIgPSAiQ291bnRlcjIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5URVJfQ0YzID0gIkNvdW50ZXIzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VOVEVSX0NGNCA9ICJDb3VudGVyNCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SUlVQVF9DRiA9ICJDb3JydXB0MSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SUlVQVF9DRjIgPSAiQ29ycnVwdDIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUlJVUFRDT1VOVEVSX0NGID0gIkNvdW50ZXJDb3JydXB0MSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09SUlVQVENPVU5URVJfQ0YyID0gIkNvdW50ZXJDb3JydXB0MiI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9VVUlEID0gIlVVSURLZXlzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRl9BTFdBWVNfUFJFU0VOVCA9ICJCZkFsd2F5c1ByZXNlbnQiOwotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21wcmVzc2lvblBhcmFtcyBjb21wcmVzc2lvblBhcmFtZXRlcnMgPSBDb21wcmVzc2lvblBhcmFtcy5zbmFwcHkoMzI3NjgpOwotCi0gICAgICAgIGxvYWRTY2hlbWEoKTsKLSAgICAgICAgY3JlYXRlS2V5c3BhY2UoS0VZU1BBQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRDRk1EKEtFWVNQQUNFLCBDRikuY29tcHJlc3Npb24oY29tcHJlc3Npb25QYXJhbWV0ZXJzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRDRk1EKEtFWVNQQUNFLCBDRjIpLmNvbXByZXNzaW9uKGNvbXByZXNzaW9uUGFyYW1ldGVycyksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChLRVlTUEFDRSwgQ0YzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRDRk1EKEtFWVNQQUNFLCBDRjQpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoS0VZU1BBQ0UsIENPUlJVUFRfQ0YpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoS0VZU1BBQ0UsIENPUlJVUFRfQ0YyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNGTUQoS0VZU1BBQ0UsIENPVU5URVJfQ0YpLmNvbXByZXNzaW9uKGNvbXByZXNzaW9uUGFyYW1ldGVycyksCi0gICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKEtFWVNQQUNFLCBDT1VOVEVSX0NGMikuY29tcHJlc3Npb24oY29tcHJlc3Npb25QYXJhbWV0ZXJzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNGTUQoS0VZU1BBQ0UsIENPVU5URVJfQ0YzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNGTUQoS0VZU1BBQ0UsIENPVU5URVJfQ0Y0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNGTUQoS0VZU1BBQ0UsIENPUlJVUFRDT1VOVEVSX0NGKSwKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNGTUQoS0VZU1BBQ0UsIENPUlJVUFRDT1VOVEVSX0NGMiksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChLRVlTUEFDRSwgQ0ZfVVVJRCwgMCwgVVVJRFR5cGUuaW5zdGFuY2UpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoS0VZU1BBQ0UsIEJGX0FMV0FZU19QUkVTRU5UKS5ibG9vbUZpbHRlckZwQ2hhbmNlKDEuMCkpOwotICAgIH0KLQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5Q29ycmVjdCgpCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOwotCi0gICAgICAgIGZpbGxDRihjZnMsIDIpOwotCi0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikKLSAgICAgICAgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5Q291bnRlckNvcnJlY3QoKQotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPVU5URVJfQ0YpOwotCi0gICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCAyKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbmRlZFZlcmlmeUNvcnJlY3QoKQotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGMik7Ci0KLSAgICAgICAgZmlsbENGKGNmcywgMik7Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikKLSAgICAgICAgewotICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5kZWRWZXJpZnlDb3VudGVyQ29ycmVjdCgpCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09VTlRFUl9DRjIpOwotCi0gICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCAyKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgdHJ5IChWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWZXJpZmllcihjZnMsIHNzdGFibGUsIGZhbHNlLCBWZXJpZmllci5vcHRpb25zKCkuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kodHJ1ZSkuZXh0ZW5kZWRWZXJpZmljYXRpb24odHJ1ZSkuYnVpbGQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUNvcnJlY3RVbmNvbXByZXNzZWQoKQotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGMyk7Ci0KLSAgICAgICAgZmlsbENGKGNmcywgMik7Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlDb3VudGVyQ29ycmVjdFVuY29tcHJlc3NlZCgpCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09VTlRFUl9DRjMpOwotCi0gICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCAyKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgdHJ5IChWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWZXJpZmllcihjZnMsIHNzdGFibGUsIGZhbHNlLCBWZXJpZmllci5vcHRpb25zKCkuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kodHJ1ZSkuYnVpbGQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4dGVuZGVkVmVyaWZ5Q29ycmVjdFVuY29tcHJlc3NlZCgpCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0Y0KTsKLQotICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgdHJ5IChWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWZXJpZmllcihjZnMsIHNzdGFibGUsIGZhbHNlLCBWZXJpZmllci5vcHRpb25zKCkuZXh0ZW5kZWRWZXJpZmljYXRpb24odHJ1ZSkuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kodHJ1ZSkuYnVpbGQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlcnIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEV4dGVuZGVkVmVyaWZ5Q291bnRlckNvcnJlY3RVbmNvbXByZXNzZWQoKQotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPVU5URVJfQ0Y0KTsKLQotICAgICAgICBmaWxsQ291bnRlckNGKGNmcywgMik7Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmV4dGVuZGVkVmVyaWZpY2F0aW9uKHRydWUpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUluY29ycmVjdERpZ2VzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09SUlVQVF9DRik7Ci0KLSAgICAgICAgZmlsbENGKGNmcywgMik7Ci0KLSAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoY2ZzKS5idWlsZCgpKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQotICAgICAgICB0cnkgKFJhbmRvbUFjY2Vzc1JlYWRlciBmaWxlID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4obmV3IEZpbGUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5ESUdFU1QpKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvbmcgY29ycmVjdENoZWNrc3VtID0gZmlsZS5yZWFkTG9uZygpOwotCi0gICAgICAgICAgICB3cml0ZUNoZWNrc3VtKCsrY29ycmVjdENoZWNrc3VtLCBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRJR0VTVCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IChWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWZXJpZmllcihjZnMsIHNzdGFibGUsIGZhbHNlLCBWZXJpZmllci5vcHRpb25zKCkuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kodHJ1ZSkuYnVpbGQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKSB7fQotCi0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KGZhbHNlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIFJ1bnRpbWVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXJyKSB7fQotICAgIH0KLQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5Q29ycnVwdFJvd0NvcnJlY3REaWdlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdyaXRlVGltZW91dEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPUlJVUFRfQ0YyKTsKLQotICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKLQotICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMpLmJ1aWxkKCkpOwotCi0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICAvLyBvdmVyd3JpdGUgb25lIHJvdyB3aXRoIGdhcmJhZ2UKLSAgICAgICAgbG9uZyByb3cwU3RhcnQgPSBzc3RhYmxlLmdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uLkZvcktleS5nZXQoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjAiKSwgY2ZzLmdldFBhcnRpdGlvbmVyKCkpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKS5wb3NpdGlvbjsKLSAgICAgICAgbG9uZyByb3cxU3RhcnQgPSBzc3RhYmxlLmdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uLkZvcktleS5nZXQoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjEiKSwgY2ZzLmdldFBhcnRpdGlvbmVyKCkpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKS5wb3NpdGlvbjsKLSAgICAgICAgbG9uZyBzdGFydFBvc2l0aW9uID0gcm93MFN0YXJ0IDwgcm93MVN0YXJ0ID8gcm93MFN0YXJ0IDogcm93MVN0YXJ0OwotICAgICAgICBsb25nIGVuZFBvc2l0aW9uID0gcm93MFN0YXJ0IDwgcm93MVN0YXJ0ID8gcm93MVN0YXJ0IDogcm93MFN0YXJ0OwotCi0gICAgICAgIEZpbGVDaGFubmVsIGZpbGUgPSBuZXcgRmlsZShzc3RhYmxlLmdldEZpbGVuYW1lKCkpLm5ld1JlYWRXcml0ZUNoYW5uZWwoKTsKLSAgICAgICAgZmlsZS5wb3NpdGlvbihzdGFydFBvc2l0aW9uKTsKLSAgICAgICAgZmlsZS53cml0ZShCeXRlQnVmZmVyVXRpbC5ieXRlcyhTdHJpbmdVdGlscy5yZXBlYXQoJ3onLCAyKSkpOwotICAgICAgICBmaWxlLmNsb3NlKCk7Ci0gICAgICAgIGlmIChDaHVua0NhY2hlLmluc3RhbmNlICE9IG51bGwpCi0gICAgICAgICAgICBDaHVua0NhY2hlLmluc3RhbmNlLmludmFsaWRhdGVGaWxlKHNzdGFibGUuZ2V0RmlsZW5hbWUoKSk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBEaWdlc3QgdG8gaGF2ZSB0aGUgcmlnaHQgQ2hlY2tzdW0KLSAgICAgICAgd3JpdGVDaGVja3N1bShzaW1wbGVGdWxsQ2hlY2tzdW0oc3N0YWJsZS5nZXRGaWxlbmFtZSgpKSwgc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5ESUdFU1QpKTsKLQotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRmlyc3QgYSBzaW1wbGUgdmVyaWZ5IGNoZWNraW5nIGRpZ2VzdCwgd2hpY2ggc2hvdWxkIHN1Y2NlZWQKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYWlsKCJTaW1wbGUgdmVyaWZ5IHNob3VsZCBoYXZlIHN1Y2NlZWRlZCBhcyBkaWdlc3QgbWF0Y2hlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmV4dGVuZGVkVmVyaWZpY2F0aW9uKHRydWUpLmJ1aWxkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBOb3cgdHJ5IGV4dGVuZGVkIHZlcmlmeQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlcnIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUJyb2tlblNTVGFibGVNZXRhZGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09SUlVQVF9DRjIpOwotICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOwotICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKLQotICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMpLmJ1aWxkKCkpOwotCi0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICBTdHJpbmcgZmlsZW5hbWVUb0NvcnJ1cHQgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKTsKLSAgICAgICAgRmlsZUNoYW5uZWwgZmlsZSA9IG5ldyBGaWxlKGZpbGVuYW1lVG9Db3JydXB0KS5uZXdSZWFkV3JpdGVDaGFubmVsKCk7Ci0gICAgICAgIGZpbGUucG9zaXRpb24oMCk7Ci0gICAgICAgIGZpbGUud3JpdGUoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoU3RyaW5nVXRpbHMucmVwZWF0KCd6JywgMikpKTsKLSAgICAgICAgZmlsZS5jbG9zZSgpOwotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIHRvIGJlIHRocm93biIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlcnIpCi0gICAgICAgIHt9Ci0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KGZhbHNlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIFJ1bnRpbWVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikgeyBmYWlsKCJ3cm9uZyBleGNlcHRpb24gdGhyb3duIik7IH0KLSAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXJyKQotICAgICAgICB7fQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeU11dGF0ZVJlcGFpclN0YXR1cygpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09SUlVQVF9DRjIpOwotICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOwotICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKLQotICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMpLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIG1ha2UgdGhlIHNzdGFibGUgcmVwYWlyZWQ6Ci0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgc3N0YWJsZS5kZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLm11dGF0ZVJlcGFpck1ldGFkYXRhKHNzdGFibGUuZGVzY3JpcHRvciwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIHNzdGFibGUuZ2V0UGVuZGluZ1JlcGFpcigpLCBzc3RhYmxlLmlzVHJhbnNpZW50KCkpOwotICAgICAgICBzc3RhYmxlLnJlbG9hZFNTVGFibGVNZXRhZGF0YSgpOwotCi0gICAgICAgIC8vIGJyZWFrIHRoZSBzc3RhYmxlOgotICAgICAgICBMb25nIGNvcnJlY3RDaGVja3N1bTsKLSAgICAgICAgdHJ5IChSYW5kb21BY2Nlc3NSZWFkZXIgZmlsZSA9IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuRElHRVNUKSkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb3JyZWN0Q2hlY2tzdW0gPSBmaWxlLnJlYWRMb25nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgd3JpdGVDaGVja3N1bSgrK2NvcnJlY3RDaGVja3N1bSwgc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5ESUdFU1QpKTsKLSAgICAgICAgdHJ5IChWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWZXJpZmllcihjZnMsIHNzdGFibGUsIGZhbHNlLCBWZXJpZmllci5vcHRpb25zKCkubXV0YXRlUmVwYWlyU3RhdHVzKGZhbHNlKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIHRvIGJlIHRocm93biIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlcnIpCi0gICAgICAgIHt9Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlLmlzUmVwYWlyZWQoKSk7Ci0KLSAgICAgICAgLy8gbm93IHRoZSByZXBhaXIgc3RhdHVzIHNob3VsZCBiZSBjaGFuZ2VkOgotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5tdXRhdGVSZXBhaXJTdGF0dXModHJ1ZSkuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kodHJ1ZSkuYnVpbGQoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOwotICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQotICAgICAgICB7fQotICAgICAgICBhc3NlcnRGYWxzZShzc3RhYmxlLmlzUmVwYWlyZWQoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QoZXhwZWN0ZWQgPSBSdW50aW1lRXhjZXB0aW9uLmNsYXNzKQotICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRPZlJhbmdlVG9rZW5zKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7Ci0gICAgICAgIGZpbGxDRihjZnMsIDEwMCk7Ci0gICAgICAgIFRva2VuTWV0YWRhdGEgdG1kID0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuZ2V0VG9rZW5NZXRhZGF0YSgpOwotICAgICAgICBieXRlW10gdGsxID0gbmV3IGJ5dGVbMV0sIHRrMiA9IG5ldyBieXRlWzFdOwotICAgICAgICB0azFbMF0gPSAyOwotICAgICAgICB0azJbMF0gPSAxOwotICAgICAgICB0bWQudXBkYXRlTm9ybWFsVG9rZW4obmV3IEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuQnl0ZXNUb2tlbih0azEpLCBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKCIxMjcuMC4wLjEiKSk7Ci0gICAgICAgIHRtZC51cGRhdGVOb3JtYWxUb2tlbihuZXcgQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5CeXRlc1Rva2VuKHRrMiksIEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoIjEyNy4wLjAuMiIpKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmNoZWNrT3duc1Rva2Vucyh0cnVlKS5leHRlbmRlZFZlcmlmaWNhdGlvbih0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5nZXRUb2tlbk1ldGFkYXRhKCkuY2xlYXJVbnNhZmUoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXV0YXRlUmVwYWlyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09SUlVQVF9DRjIpOwotCi0gICAgICAgIGZpbGxDRihjZnMsIDIpOwotCi0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgc3N0YWJsZS5kZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLm11dGF0ZVJlcGFpck1ldGFkYXRhKHNzdGFibGUuZGVzY3JpcHRvciwgMSwgc3N0YWJsZS5nZXRQZW5kaW5nUmVwYWlyKCksIHNzdGFibGUuaXNUcmFuc2llbnQoKSk7Ci0gICAgICAgIHNzdGFibGUucmVsb2FkU1NUYWJsZU1ldGFkYXRhKCk7Ci0gICAgICAgIGNmcy5nZXRUcmFja2VyKCkubm90aWZ5U1NUYWJsZVJlcGFpcmVkU3RhdHVzQ2hhbmdlZChDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3N0YWJsZSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNzdGFibGUuaXNSZXBhaXJlZCgpKTsKLSAgICAgICAgY2ZzLmZvcmNlTWFqb3JDb21wYWN0aW9uKCk7Ci0KLSAgICAgICAgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgTG9uZyBjb3JyZWN0Q2hlY2tzdW07Ci0gICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGZpbGUgPSBSYW5kb21BY2Nlc3NSZWFkZXIub3BlbihuZXcgRmlsZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRJR0VTVCkpKSkKLSAgICAgICAgewotICAgICAgICAgICAgY29ycmVjdENoZWNrc3VtID0gZmlsZS5yZWFkTG9uZygpOwotICAgICAgICB9Ci0gICAgICAgIHdyaXRlQ2hlY2tzdW0oKytjb3JyZWN0Q2hlY2tzdW0sIHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuRElHRVNUKSk7Ci0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLm11dGF0ZVJlcGFpclN0YXR1cyh0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgICAgICBmYWlsKCJzaG91bGQgYmUgY29ycnVwdCIpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlKQotICAgICAgICB7fQotICAgICAgICBhc3NlcnRGYWxzZShzc3RhYmxlLmlzUmVwYWlyZWQoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5SW5kZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRlc3RCcm9rZW5Db21wb25lbnRIZWxwZXIoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpOwotICAgIH0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlCZigpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGVzdEJyb2tlbkNvbXBvbmVudEhlbHBlcihDb21wb25lbnQuRklMVEVSKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlJbmRleFN1bW1hcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRlc3RCcm9rZW5Db21wb25lbnRIZWxwZXIoQ29tcG9uZW50LlNVTU1BUlkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0ZXN0QnJva2VuQ29tcG9uZW50SGVscGVyKENvbXBvbmVudCBjb21wb25lbnRUb0JyZWFrKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1JSVVBUX0NGMik7Ci0KLSAgICAgICAgZmlsbENGKGNmcywgMik7Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7IC8vc3RpbGwgbm90IGNvcnJ1cHQsIHNob3VsZCBwYXNzCi0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lVG9Db3JydXB0ID0gc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGNvbXBvbmVudFRvQnJlYWspOwotICAgICAgICB0cnkoRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBuZXcgRmlsZShmaWxlbmFtZVRvQ29ycnVwdCkubmV3UmVhZFdyaXRlQ2hhbm5lbCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlQ2hhbm5lbC50cnVuY2F0ZSgzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBleGNlcHRpb24iKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2V4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RRdWljaygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPUlJVUFRfQ0YpOwotCi0gICAgICAgIGZpbGxDRihjZnMsIDIpOwotCi0gICAgICAgIFV0aWwuZ2V0QWxsKFV0aWwuY21kKGNmcykuYnVpbGQoKSk7Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0KLSAgICAgICAgdHJ5IChSYW5kb21BY2Nlc3NSZWFkZXIgZmlsZSA9IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuRElHRVNUKSkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBMb25nIGNvcnJlY3RDaGVja3N1bSA9IGZpbGUucmVhZExvbmcoKTsKLQotICAgICAgICAgICAgd3JpdGVDaGVja3N1bSgrK2NvcnJlY3RDaGVja3N1bSwgc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5ESUdFU1QpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSAoVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoY2ZzLCBzc3RhYmxlLCBmYWxzZSwgVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGEgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikge30KLQotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5xdWljayh0cnVlKS5idWlsZCgpKSkgLy8gd2l0aCBxdWljayA9IHRydWUgd2UgZG9uJ3QgdmVyaWZ5IHRoZSBkaWdlc3QKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIFJ1bnRpbWVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikge30KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5nZU93bkhlbHBlcigpCi0gICAgewotICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gbm9ybWFsaXplZCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBub3JtYWxpemVkLmFkZChyKExvbmcuTUlOX1ZBTFVFLCBMb25nLk1JTl9WQUxVRSArIDEpKTsKLSAgICAgICAgbm9ybWFsaXplZC5hZGQocihMb25nLk1JTl9WQUxVRSArIDUsIExvbmcuTUlOX1ZBTFVFICsgNikpOwotICAgICAgICBub3JtYWxpemVkLmFkZChyKExvbmcuTUlOX1ZBTFVFICsgMTAsIExvbmcuTUlOX1ZBTFVFICsgMTEpKTsKLSAgICAgICAgbm9ybWFsaXplZC5hZGQocigwLDEwKSk7Ci0gICAgICAgIG5vcm1hbGl6ZWQuYWRkKHIoMTAsMTEpKTsKLSAgICAgICAgbm9ybWFsaXplZC5hZGQocigyMCwyNSkpOwotICAgICAgICBub3JtYWxpemVkLmFkZChyKDI2LDIwMCkpOwotCi0gICAgICAgIFZlcmlmaWVyLlJhbmdlT3duSGVscGVyIHJvaCA9IG5ldyBWZXJpZmllci5SYW5nZU93bkhlbHBlcihub3JtYWxpemVkKTsKLQotICAgICAgICByb2gudmFsaWRhdGUoZGsoMSkpOwotICAgICAgICByb2gudmFsaWRhdGUoZGsoMTApKTsKLSAgICAgICAgcm9oLnZhbGlkYXRlKGRrKDExKSk7Ci0gICAgICAgIHJvaC52YWxpZGF0ZShkaygyMSkpOwotICAgICAgICByb2gudmFsaWRhdGUoZGsoMjUpKTsKLSAgICAgICAgYm9vbGVhbiBnb3RFeGNlcHRpb24gPSBmYWxzZTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJvaC52YWxpZGF0ZShkaygyNikpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKLSAgICAgICAgewotICAgICAgICAgICAgZ290RXhjZXB0aW9uID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRUcnVlKGdvdEV4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgQFRlc3QoZXhwZWN0ZWQgPSBBc3NlcnRpb25FcnJvci5jbGFzcykKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmFuZ2VPd25IZWxwZXJCYWRUb2tlbigpCi0gICAgewotICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gbm9ybWFsaXplZCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBub3JtYWxpemVkLmFkZChyKDAsMTApKTsKLSAgICAgICAgVmVyaWZpZXIuUmFuZ2VPd25IZWxwZXIgcm9oID0gbmV3IFZlcmlmaWVyLlJhbmdlT3duSGVscGVyKG5vcm1hbGl6ZWQpOwotICAgICAgICByb2gudmFsaWRhdGUoZGsoMSkpOwotICAgICAgICAvLyBjYWxsIHdpdGggc21hbGxlciB0b2tlbiB0byBnZXQgZXhjZXB0aW9uCi0gICAgICAgIHJvaC52YWxpZGF0ZShkaygwKSk7Ci0gICAgfQotCi0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5nZU93bkhlbHBlck5vcm1hbGl6ZSgpCi0gICAgewotICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gbm9ybWFsaXplZCA9IFJhbmdlLm5vcm1hbGl6ZShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHIoMCwwKSkpOwotICAgICAgICBWZXJpZmllci5SYW5nZU93bkhlbHBlciByb2ggPSBuZXcgVmVyaWZpZXIuUmFuZ2VPd25IZWxwZXIobm9ybWFsaXplZCk7Ci0gICAgICAgIHJvaC52YWxpZGF0ZShkayhMb25nLk1JTl9WQUxVRSkpOwotICAgICAgICByb2gudmFsaWRhdGUoZGsoMCkpOwotICAgICAgICByb2gudmFsaWRhdGUoZGsoTG9uZy5NQVhfVkFMVUUpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5nZU93bkhlbHBlck5vcm1hbGl6ZVdyYXAoKQotICAgIHsKLSAgICAgICAgTGlzdDxSYW5nZTxUb2tlbj4+IG5vcm1hbGl6ZWQgPSBSYW5nZS5ub3JtYWxpemUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyKExvbmcuTUFYX1ZBTFVFIC0gMTAwMCxMb25nLk1JTl9WQUxVRSArIDEwMDApKSk7Ci0gICAgICAgIFZlcmlmaWVyLlJhbmdlT3duSGVscGVyIHJvaCA9IG5ldyBWZXJpZmllci5SYW5nZU93bkhlbHBlcihub3JtYWxpemVkKTsKLSAgICAgICAgcm9oLnZhbGlkYXRlKGRrKExvbmcuTUlOX1ZBTFVFKSk7Ci0gICAgICAgIHJvaC52YWxpZGF0ZShkayhMb25nLk1BWF9WQUxVRSkpOwotICAgICAgICBib29sZWFuIGdvdEV4Y2VwdGlvbiA9IGZhbHNlOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcm9oLnZhbGlkYXRlKGRrKDI2KSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICB7Ci0gICAgICAgICAgICBnb3RFeGNlcHRpb24gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZ290RXhjZXB0aW9uKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVJhbmdlcygpCi0gICAgewotICAgICAgICBuZXcgVmVyaWZpZXIuUmFuZ2VPd25IZWxwZXIoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpLnZhbGlkYXRlKGRrKDEpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlMb2NhbFBhcnRpdGlvbmVyKCkgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBUb2tlbk1ldGFkYXRhIHRtZCA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKTsKLSAgICAgICAgYnl0ZVtdIHRrMSA9IG5ldyBieXRlWzFdLCB0azIgPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgdGsxWzBdID0gMjsKLSAgICAgICAgdGsyWzBdID0gMTsKLSAgICAgICAgdG1kLnVwZGF0ZU5vcm1hbFRva2VuKG5ldyBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLkJ5dGVzVG9rZW4odGsxKSwgSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZSgiMTI3LjAuMC4xIikpOwotICAgICAgICB0bWQudXBkYXRlTm9ybWFsVG9rZW4obmV3IEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuQnl0ZXNUb2tlbih0azIpLCBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKCIxMjcuMC4wLjIiKSk7Ci0gICAgICAgIC8vIHdyaXRlIHNvbWUgYm9ndXMgdG8gYSBsb2NhbHBhcnRpdGlvbmVyIHRhYmxlCi0gICAgICAgIEJhdGNoIGJvZ3VzID0gQmF0Y2guY3JlYXRlTG9jYWwobmV4dFRpbWVVVUlEKCksIDAsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLSAgICAgICAgQmF0Y2hsb2dNYW5hZ2VyLnN0b3JlKGJvZ3VzKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3Blbigic3lzdGVtIikuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoImJhdGNoZXMiKTsKLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkKLSAgICAgICAgewotCi0gICAgICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5jaGVja093bnNUb2tlbnModHJ1ZSkuYnVpbGQoKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3ROb0ZpbHRlckZpbGUoKQotICAgIHsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKEJGX0FMV0FZU19QUkVTRU5UKTsKLSAgICAgICAgZmlsbENGKGNmcywgMTAwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEuMCwgY2ZzLm1ldGFkYXRhKCkucGFyYW1zLmJsb29tRmlsdGVyRnBDaGFuY2UsIDAuMCk7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogY2ZzLmdldExpdmVTU1RhYmxlcygpKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkZJTFRFUikpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZi5leGlzdHMoKSk7Ci0gICAgICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5idWlsZCgpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0KLSAgICBwcml2YXRlIERlY29yYXRlZEtleSBkayhsb25nIGwpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlckRlY29yYXRlZEtleSh0KGwpLCBCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSYW5nZTxUb2tlbj4gcihsb25nIHMsIGxvbmcgZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgUmFuZ2U8Pih0KHMpLCB0KGUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFRva2VuIHQobG9uZyB0KQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuKHQpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlsbENGKENvbHVtbkZhbWlseVN0b3JlIGNmcywgaW50IHBhcnRpdGlvbnNQZXJTU1RhYmxlKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aXRpb25zUGVyU1NUYWJsZTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBVcGRhdGVCdWlsZGVyLmNyZWF0ZShjZnMubWV0YWRhdGEoKSwgU3RyaW5nLnZhbHVlT2YoaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1JvdygiYzEiKS5hZGQoInZhbCIsICIxIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAubmV3Um93KCJjMiIpLmFkZCgidmFsIiwgIjIiKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBseSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGZpbGxDb3VudGVyQ0YoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgcGFydGl0aW9uc1BlclNTVGFibGUpIHRocm93cyBXcml0ZVRpbWVvdXRFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9uc1BlclNTVGFibGU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgVXBkYXRlQnVpbGRlci5jcmVhdGUoY2ZzLm1ldGFkYXRhKCksIFN0cmluZy52YWx1ZU9mKGkpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdSb3coImMxIikuYWRkKCJ2YWwiLCAxMDBMKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBseSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBsb25nIHNpbXBsZUZ1bGxDaGVja3N1bShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW1QbHVzIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbVBsdXMoZmlsZW5hbWUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBDUkMzMiBjaGVja3N1bSA9IG5ldyBDUkMzMigpOwotICAgICAgICAgICAgQ2hlY2tlZElucHV0U3RyZWFtIGNpblN0cmVhbSA9IG5ldyBDaGVja2VkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIGNoZWNrc3VtKTsKLSAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTI4XTsKLSAgICAgICAgICAgIHdoaWxlIChjaW5TdHJlYW0ucmVhZChiKSA+PSAwKSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2luU3RyZWFtLmdldENoZWNrc3VtKCkuZ2V0VmFsdWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZUNoZWNrc3VtKGxvbmcgY2hlY2tzdW0sIFN0cmluZyBmaWxlUGF0aCkKLSAgICB7Ci0gICAgICAgIEZpbGUgb3V0RmlsZSA9IG5ldyBGaWxlKGZpbGVQYXRoKTsKLSAgICAgICAgQnVmZmVyZWRXcml0ZXIgb3V0ID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG91dCA9IEZpbGVzLm5ld0J1ZmZlcmVkV3JpdGVyKG91dEZpbGUudG9QYXRoKCksIENoYXJzZXRzLlVURl84KTsKLSAgICAgICAgICAgIG91dC53cml0ZShTdHJpbmcudmFsdWVPZihjaGVja3N1bSkpOwotICAgICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgICAgICBvdXQuY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEZTV3JpdGVFcnJvcihlLCBvdXRGaWxlKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkob3V0KTsKLSAgICAgICAgfQotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvYWdncmVnYXRpb24vR3JvdXBNYWtlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9hZ2dyZWdhdGlvbi9Hcm91cE1ha2VyVGVzdC5qYXZhCmluZGV4IDEzZmIwZGYuLjQzNjNkODEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9hZ2dyZWdhdGlvbi9Hcm91cE1ha2VyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9hZ2dyZWdhdGlvbi9Hcm91cE1ha2VyVGVzdC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtMzI3LDYgKzMyOCw2IEBACiAgICAgICAgIFNlbGVjdG9yLkZhY3RvcnkgZmFjdG9yeSA9IHNlbGVjdGFibGUubmV3U2VsZWN0b3JGYWN0b3J5KHRhYmxlLCBudWxsLCBuZXcgQXJyYXlMaXN0PD4oKSwgVmFyaWFibGVTcGVjaWZpY2F0aW9ucy5lbXB0eSgpKTsKICAgICAgICAgU2VsZWN0b3Igc2VsZWN0b3IgPSBmYWN0b3J5Lm5ld0luc3RhbmNlKFF1ZXJ5T3B0aW9ucy5ERUZBVUxUKTsKIAotICAgICAgICByZXR1cm4gR3JvdXBNYWtlci5uZXdTZWxlY3Rvckdyb3VwTWFrZXIodGFibGUuY29tcGFyYXRvciwgcmV2ZXJzZWQubGVuZ3RoLCBzZWxlY3Rvcik7CisgICAgICAgIHJldHVybiBHcm91cE1ha2VyLm5ld1NlbGVjdG9yR3JvdXBNYWtlcih0YWJsZS5jb21wYXJhdG9yLCByZXZlcnNlZC5sZW5ndGgsIHNlbGVjdG9yLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGNvbHVtbikpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb2x1bW5pdGVyYXRvci9TU1RhYmxlUmV2ZXJzZUl0ZXJhdG9yVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbHVtbml0ZXJhdG9yL1NTVGFibGVSZXZlcnNlSXRlcmF0b3JUZXN0LmphdmEKaW5kZXggOWY5YjdiYi4uMTY5MzE4ZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbHVtbml0ZXJhdG9yL1NTVGFibGVSZXZlcnNlSXRlcmF0b3JUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbHVtbml0ZXJhdG9yL1NTVGFibGVSZXZlcnNlSXRlcmF0b3JUZXN0LmphdmEKQEAgLTM0LDkgKzM0LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLlJvd0luZGV4RW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOwogCiBwdWJsaWMgY2xhc3MgU1NUYWJsZVJldmVyc2VJdGVyYXRvclRlc3QKQEAgLTg1LDkgKzg2LDEyIEBACiAgICAgICAgIFV0aWwuZmx1c2godGJsKTsKICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gSXRlcmFibGVzLmdldE9ubHlFbGVtZW50KHRibC5nZXRMaXZlU1NUYWJsZXMoKSk7CiAgICAgICAgIERlY29yYXRlZEtleSBkayA9IHRibC5nZXRQYXJ0aXRpb25lcigpLmRlY29yYXRlS2V5KEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2Uoa2V5KSk7Ci0gICAgICAgIFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSA9IHNzdGFibGUuZ2V0UG9zaXRpb24oZGssIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShpbmRleEVudHJ5LmlzSW5kZXhlZCgpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaW5kZXhFbnRyeS5jb2x1bW5zSW5kZXhDb3VudCgpID4gMik7CisgICAgICAgIGlmIChzc3RhYmxlIGluc3RhbmNlb2YgQmlnVGFibGVSZWFkZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFJvd0luZGV4RW50cnkgaW5kZXhFbnRyeSA9ICgoQmlnVGFibGVSZWFkZXIpIHNzdGFibGUpLmdldFJvd0luZGV4RW50cnkoZGssIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoaW5kZXhFbnRyeS5pc0luZGV4ZWQoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShpbmRleEVudHJ5LmJsb2NrQ291bnQoKSA+IDIpOworICAgICAgICB9CiAKICAgICAgICAgLy8gZHJvcCB2MSBzbyB0aGUgZmlyc3QgMiBpbmRleCBibG9ja3Mgb25seSBjb250YWluIGVtcHR5IHVuZmlsdGVyZWRzCiAgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJBTFRFUiBUQUJMRSAlcy4lcyBEUk9QIHYxIiwgS0VZU1BBQ0UsIHRhYmxlKSk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ0ZhaWx1cmVQb2xpY3lUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ0ZhaWx1cmVQb2xpY3lUZXN0LmphdmEKaW5kZXggYWFkZDJmZC4uM2RjNGU1ZiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dGYWlsdXJlUG9saWN5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nRmFpbHVyZVBvbGljeVRlc3QuamF2YQpAQCAtMzIsMTMgKzMyLDE1IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSlZNU3RhYmlsaXR5SW5zcGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLktpbGxlckZvclRlc3RzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09NTUlUTE9HX1NUT1BfT05fRVJST1JTOworCiBwdWJsaWMgY2xhc3MgQ29tbWl0TG9nRmFpbHVyZVBvbGljeVRlc3QKIHsKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7CiAgICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbW1pdGxvZy5zdG9wX29uX2Vycm9ycyIsICJ0cnVlIik7CisgICAgICAgIENPTU1JVExPR19TVE9QX09OX0VSUk9SUy5zZXRCb29sZWFuKHRydWUpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyQ0RDVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dTZWdtZW50TWFuYWdlckNEQ1Rlc3QuamF2YQppbmRleCAzNzg5YjUxLi41ZjZmMjM1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tbWl0bG9nL0NvbW1pdExvZ1NlZ21lbnRNYW5hZ2VyQ0RDVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nU2VnbWVudE1hbmFnZXJDRENUZXN0LmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIAogaW1wb3J0IGNvbS5nb29nbGUubW9uaXRvcmluZy5ydW50aW1lLmluc3RydW1lbnRhdGlvbi5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVSZWFkZXI7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKQEAgLTUxLDYgKzUyLDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q0RDRW5hYmxlZCh0cnVlKTsKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENEQ1RvdGFsU3BhY2VJbk1pQigxMDI0KTsKICAgICAgICAgQ1FMVGVzdGVyLnNldFVwQ2xhc3MoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21taXRsb2cvQ29tbWl0TG9nVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dUZXN0LmphdmEKaW5kZXggMTdiYmVjZS4uZDUzYzFkNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbW1pdGxvZy9Db21taXRMb2dUZXN0LmphdmEKQEAgLTEsMjMgKzEsMjUgQEAKIC8qCi0qIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0qIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0qIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0qIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qCi0qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0qIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0qIHVuZGVyIHRoZSBMaWNlbnNlLgotKi8KKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZzsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwpAQCAtNDEsNiArNDMsNyBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKKwogaW1wb3J0IG9yZy5qdW5pdC4qOwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOwpAQCAtNTQsNiArNTcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5NZW10YWJsZVBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hVGVzdFV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKQEAgLTg1LDYgKzg5LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZzsKIAoraW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DT01NSVRMT0dfSUdOT1JFX1JFUExBWV9FUlJPUlM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ09NTUlUX0xPR19SRVBMQVlfTElTVDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tbWl0bG9nLkNvbW1pdExvZ1NlZ21lbnQuRU5UUllfT1ZFUkhFQURfU0laRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWwuYnl0ZXM7CiAKQEAgLTEwNyw2ICsxMTQsMTEgQEAKICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFOREFSRDEgPSAiU3RhbmRhcmQxIjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBTkRBUkQyID0gIlN0YW5kYXJkMiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTTEgPSAiQ3VzdG9tMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMV9SRVBMQVkgPSAiQ29tbWl0TG9nVGVzdFJlcGxheTEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRTFfUkVQTEFZX1RBQkxFMSA9ICJDb21taXRMb2dUZXN0UmVwbGF5MVRhYmxlMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMV9SRVBMQVlfVEFCTEUyID0gIkNvbW1pdExvZ1Rlc3RSZXBsYXkxVGFibGUyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UyX1JFUExBWSA9ICJDb21taXRMb2dUZXN0UmVwbGF5MiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMl9SRVBMQVlfVEFCTEUyID0gIkNvbW1pdExvZ1Rlc3RSZXBsYXkyVGFibGUyIjsKIAogICAgIHByaXZhdGUgc3RhdGljIEpWTVN0YWJpbGl0eUluc3BlY3Rvci5LaWxsZXIgb2xkS2lsbGVyOwogICAgIHByaXZhdGUgc3RhdGljIEtpbGxlckZvclRlc3RzIHRlc3RLaWxsZXI7CkBAIC0xMjEsMTQgKzEzMywxNCBAQAogICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gZ2VuZXJhdGVEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10KLSAgICAgICAgewotICAgICAgICAgICAgeyBudWxsLCBFbmNyeXB0aW9uQ29udGV4dEdlbmVyYXRvci5jcmVhdGVEaXNhYmxlZENvbnRleHQoKX0sIC8vIE5vIGNvbXByZXNzaW9uLCBubyBlbmNyeXB0aW9uCi0gICAgICAgICAgICB7IG51bGwsIG5ld0VuY3J5cHRpb25Db250ZXh0KCkgfSwgLy8gRW5jcnlwdGlvbgotICAgICAgICAgICAgeyBuZXcgUGFyYW1ldGVyaXplZENsYXNzKExaNENvbXByZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSwgRW5jcnlwdGlvbkNvbnRleHRHZW5lcmF0b3IuY3JlYXRlRGlzYWJsZWRDb250ZXh0KCkgfSwKLSAgICAgICAgICAgIHsgbmV3IFBhcmFtZXRlcml6ZWRDbGFzcyhTbmFwcHlDb21wcmVzc29yLmNsYXNzLmdldE5hbWUoKSwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSksIEVuY3J5cHRpb25Db250ZXh0R2VuZXJhdG9yLmNyZWF0ZURpc2FibGVkQ29udGV4dCgpfSwKLSAgICAgICAgICAgIHsgbmV3IFBhcmFtZXRlcml6ZWRDbGFzcyhEZWZsYXRlQ29tcHJlc3Nvci5jbGFzcy5nZXROYW1lKCksIENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpLCBFbmNyeXB0aW9uQ29udGV4dEdlbmVyYXRvci5jcmVhdGVEaXNhYmxlZENvbnRleHQoKX0sCi0gICAgICAgICAgICB7IG5ldyBQYXJhbWV0ZXJpemVkQ2xhc3MoWnN0ZENvbXByZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSwgRW5jcnlwdGlvbkNvbnRleHRHZW5lcmF0b3IuY3JlYXRlRGlzYWJsZWRDb250ZXh0KCl9Ci0gICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbnVsbCwgRW5jcnlwdGlvbkNvbnRleHRHZW5lcmF0b3IuY3JlYXRlRGlzYWJsZWRDb250ZXh0KCkgfSwgLy8gTm8gY29tcHJlc3Npb24sIG5vIGVuY3J5cHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBudWxsLCBuZXdFbmNyeXB0aW9uQ29udGV4dCgpIH0sIC8vIEVuY3J5cHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuZXcgUGFyYW1ldGVyaXplZENsYXNzKExaNENvbXByZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSwgRW5jcnlwdGlvbkNvbnRleHRHZW5lcmF0b3IuY3JlYXRlRGlzYWJsZWRDb250ZXh0KCkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuZXcgUGFyYW1ldGVyaXplZENsYXNzKFNuYXBweUNvbXByZXNzb3IuY2xhc3MuZ2V0TmFtZSgpLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSwgRW5jcnlwdGlvbkNvbnRleHRHZW5lcmF0b3IuY3JlYXRlRGlzYWJsZWRDb250ZXh0KCkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBuZXcgUGFyYW1ldGVyaXplZENsYXNzKERlZmxhdGVDb21wcmVzc29yLmNsYXNzLmdldE5hbWUoKSwgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSksIEVuY3J5cHRpb25Db250ZXh0R2VuZXJhdG9yLmNyZWF0ZURpc2FibGVkQ29udGV4dCgpIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbmV3IFBhcmFtZXRlcml6ZWRDbGFzcyhac3RkQ29tcHJlc3Nvci5jbGFzcy5nZXROYW1lKCksIENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpLCBFbmNyeXB0aW9uQ29udGV4dEdlbmVyYXRvci5jcmVhdGVEaXNhYmxlZENvbnRleHQoKSB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIEVuY3J5cHRpb25Db250ZXh0IG5ld0VuY3J5cHRpb25Db250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbgpAQCAtMTUyLDEyICsxNjQsMTIgQEAKICAgICAgICAgTWVtdGFibGVQYXJhbXMgc2tpcExpc3RNZW10YWJsZSA9IE1lbXRhYmxlUGFyYW1zLmdldCgic2tpcGxpc3QiKTsKIAogICAgICAgICBUYWJsZU1ldGFkYXRhLkJ1aWxkZXIgY3VzdG9tID0KLSAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEuYnVpbGRlcihLRVlTUEFDRTEsIENVU1RPTTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFBhcnRpdGlvbktleUNvbHVtbigiayIsIEludGVnZXJUeXBlLmluc3RhbmNlKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbHVzdGVyaW5nQ29sdW1uKCJjMSIsIE1hcFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIFVURjhUeXBlLmluc3RhbmNlLCBmYWxzZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsdXN0ZXJpbmdDb2x1bW4oImMyIiwgU2V0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgZmFsc2UpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRTdGF0aWNDb2x1bW4oInMiLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAubWVtdGFibGUoc2tpcExpc3RNZW10YWJsZSk7CisgICAgICAgIFRhYmxlTWV0YWRhdGEuYnVpbGRlcihLRVlTUEFDRTEsIENVU1RPTTEpCisgICAgICAgICAgICAgICAgICAgICAuYWRkUGFydGl0aW9uS2V5Q29sdW1uKCJrIiwgSW50ZWdlclR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAuYWRkQ2x1c3RlcmluZ0NvbHVtbigiYzEiLCBNYXBUeXBlLmdldEluc3RhbmNlKFVURjhUeXBlLmluc3RhbmNlLCBVVEY4VHlwZS5pbnN0YW5jZSwgZmFsc2UpKQorICAgICAgICAgICAgICAgICAgICAgLmFkZENsdXN0ZXJpbmdDb2x1bW4oImMyIiwgU2V0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgZmFsc2UpKQorICAgICAgICAgICAgICAgICAgICAgLmFkZFN0YXRpY0NvbHVtbigicyIsIEludGVnZXJUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgLm1lbXRhYmxlKHNraXBMaXN0TWVtdGFibGUpOwogCiAgICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCkBAIC0xNjgsNiArMTgwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGVUcmFuc2llbnQoMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMiwgU1RBTkRBUkQxLCAwLCBBc2NpaVR5cGUuaW5zdGFuY2UsIEJ5dGVzVHlwZS5pbnN0YW5jZSkubWVtdGFibGUoc2tpcExpc3RNZW10YWJsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMiwgU1RBTkRBUkQyLCAwLCBBc2NpaVR5cGUuaW5zdGFuY2UsIEJ5dGVzVHlwZS5pbnN0YW5jZSkubWVtdGFibGUoc2tpcExpc3RNZW10YWJsZSkpOworICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2UoS0VZU1BBQ0UxX1JFUExBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxX1JFUExBWSwgS0VZU1BBQ0UxX1JFUExBWV9UQUJMRTEsIDAsIEFzY2lpVHlwZS5pbnN0YW5jZSwgQnl0ZXNUeXBlLmluc3RhbmNlKS5tZW10YWJsZShza2lwTGlzdE1lbXRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxX1JFUExBWSwgS0VZU1BBQ0UxX1JFUExBWV9UQUJMRTIsIDAsIEFzY2lpVHlwZS5pbnN0YW5jZSwgQnl0ZXNUeXBlLmluc3RhbmNlKS5tZW10YWJsZShza2lwTGlzdE1lbXRhYmxlKSk7CisgICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTJfUkVQTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTJfUkVQTEFZLCBLRVlTUEFDRTJfUkVQTEFZX1RBQkxFMiwgMCwgQXNjaWlUeXBlLmluc3RhbmNlLCBCeXRlc1R5cGUuaW5zdGFuY2UpLm1lbXRhYmxlKHNraXBMaXN0TWVtdGFibGUpKTsKKwogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKIAogICAgICAgICB0ZXN0S2lsbGVyID0gbmV3IEtpbGxlckZvclRlc3RzKCk7CkBAIC0xODEsNiArMjAxLDEwIEBACiAgICAgQEFmdGVyQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWZ0ZXJDbGFzcygpCiAgICAgeworICAgICAgICBTY2hlbWFUZXN0VXRpbC5kcm9wS2V5c3BhY2VJZkV4aXN0KEtFWVNQQUNFMSwgdHJ1ZSk7CisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmRyb3BLZXlzcGFjZUlmRXhpc3QoS0VZU1BBQ0UyLCB0cnVlKTsKKyAgICAgICAgU2NoZW1hVGVzdFV0aWwuZHJvcEtleXNwYWNlSWZFeGlzdChLRVlTUEFDRTFfUkVQTEFZLCB0cnVlKTsKKyAgICAgICAgU2NoZW1hVGVzdFV0aWwuZHJvcEtleXNwYWNlSWZFeGlzdChLRVlTUEFDRTJfUkVQTEFZLCB0cnVlKTsKICAgICAgICAgSlZNU3RhYmlsaXR5SW5zcGVjdG9yLnJlcGxhY2VLaWxsZXIob2xkS2lsbGVyKTsKICAgICB9CiAKQEAgLTE5NCw3ICsyMTgsNyBAQAogICAgIHB1YmxpYyB2b2lkIGFmdGVyVGVzdCgpCiAgICAgewogICAgICAgICBDb21taXRMb2dTZWdtZW50UmVhZGVyLnNldEFsbG93U2tpcFN5bmNNYXJrZXJDcmMoZmFsc2UpOwotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLnJlcGxheUxpc3QiKTsKKyAgICAgICAgQ09NTUlUX0xPR19SRVBMQVlfTElTVC5jbGVhclZhbHVlKCk7IC8vIGNoZWNrc3R5bGU6IHN1cHByZXNzIG5lYXJieSAnY2xlYXJWYWx1ZVN5c3RlbVByb3BlcnR5VXNhZ2UnCiAgICAgICAgIHRlc3RLaWxsZXIucmVzZXQoKTsKICAgICB9CiAKQEAgLTMxNSwxMSArMzM5LDkgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNvdmVyeVdpdGhHYXJiYWdlTG9nX2lnbm9yZWRCeVByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDb21taXRMb2dSZXBsYXllci5JR05PUkVfUkVQTEFZX0VSUk9SU19QUk9QRVJUWSwgInRydWUiKTsKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KENPTU1JVExPR19JR05PUkVfUkVQTEFZX0VSUk9SUywgInRydWUiKSkKKyAgICAgICAgewogICAgICAgICAgICAgdGVzdFJlY292ZXJ5V2l0aEdhcmJhZ2VMb2coKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KENvbW1pdExvZ1JlcGxheWVyLklHTk9SRV9SRVBMQVlfRVJST1JTX1BST1BFUlRZKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzgyLDEwICs0MDQsMTAgQEAKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzMiA9IGtzLmdldENvbHVtbkZhbWlseVN0b3JlKFNUQU5EQVJEMik7CiAKICAgICAgICAgLy8gUm91Z2hseSAzMiBNaUIgbXV0YXRpb24KLSAgICAgICAgIE11dGF0aW9uIHJtID0gbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzMS5tZXRhZGF0YSgpLCAwLCAiayIpCi0gICAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiYnl0ZXMiKQotICAgICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgoRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbW1pdExvZ1NlZ21lbnRTaXplKCkvNCkgLSAxKSkKLSAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBNdXRhdGlvbiBybSA9IG5ldyBSb3dVcGRhdGVCdWlsZGVyKGNmczEubWV0YWRhdGEoKSwgMCwgImsiKQorICAgICAgICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJieXRlcyIpCisgICAgICAgICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgoRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbW1pdExvZ1NlZ21lbnRTaXplKCkgLyA0KSAtIDEpKQorICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwogCiAgICAgICAgIC8vIEFkZGluZyBpdCB0d2ljZSAod29uJ3QgY2hhbmdlIHNlZ21lbnQpCiAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5hZGQocm0pOwpAQCAtNDEyLDcgKzQzNCw3IEBACiAKICAgICAgICAgQ29sbGVjdGlvbjxDb21taXRMb2dTZWdtZW50PiBzZWdtZW50cyA9IENvbW1pdExvZy5pbnN0YW5jZS5zZWdtZW50TWFuYWdlci5nZXRBY3RpdmVTZWdtZW50cygpOwogCi0gICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCAzIHNlZ21lbnRzIGJ1dCBnb3QgJWQgKCVzKSIsIHNlZ21lbnRzLnNpemUoKSwgZ2V0RGlydHlDRklkcyhzZWdtZW50cykpLAorICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0KCJFeHBlY3RlZCAzIHNlZ21lbnRzIGJ1dCBnb3QgJWQgKCVzKSIsIHNlZ21lbnRzLnNpemUoKSwgZ2V0RGlydHlDRklkcyhzZWdtZW50cykpLAogICAgICAgICAgICAgICAgICAgICAgMywKICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzLnNpemUoKSk7CiAKQEAgLTQyNSw3ICs0NDcsNyBAQAogICAgICAgICBzZWdtZW50cyA9IENvbW1pdExvZy5pbnN0YW5jZS5zZWdtZW50TWFuYWdlci5nZXRBY3RpdmVTZWdtZW50cygpOwogCiAgICAgICAgIC8vIEFzc2VydCB3ZSBzdGlsbCBoYXZlIGJvdGggb3VyIHNlZ21lbnQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIDEgc2VnbWVudCBidXQgZ290ICVkICglcykiLCBzZWdtZW50cy5zaXplKCksIGdldERpcnR5Q0ZJZHMoc2VnbWVudHMpKSwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvcm1hdCgiRXhwZWN0ZWQgMSBzZWdtZW50IGJ1dCBnb3QgJWQgKCVzKSIsIHNlZ21lbnRzLnNpemUoKSwgZ2V0RGlydHlDRklkcyhzZWdtZW50cykpLAogICAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzLnNpemUoKSk7CiAgICAgfQpAQCAtNTAzLDYgKzUyNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJtdXRhdGlvbiBsYXJnZXIgdGhhbiBsaW1pdCB3YXMgYWNjZXB0ZWQiKTsKICAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlZWRSZWNvcmRMaW1pdFdpdGhNdWx0aXBsZVBhcnRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewpAQCAtNTM2LDEyICs1NTksMTIgQEAKICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gZXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKIAogICAgICAgICAgICAgbG9uZyBtdXRhdGlvblNpemUgPSBtdXRhdGlvbi5zZXJpYWxpemVkU2l6ZShNZXNzYWdpbmdTZXJ2aWNlLmN1cnJlbnRfdmVyc2lvbikgKyBFTlRSWV9PVkVSSEVBRF9TSVpFOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkTWVzc2FnZVByZWZpeCA9IFN0cmluZy5mb3JtYXQoIlJlamVjdGVkIGFuIG92ZXJzaXplZCBtdXRhdGlvbiAoJWQvJWQpIGZvciBrZXlzcGFjZTogJXMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0aW9uU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5nZXRNYXhNdXRhdGlvblNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWVNQQUNFMSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRNZXNzYWdlUHJlZml4ID0gZm9ybWF0KCJSZWplY3RlZCBhbiBvdmVyc2l6ZWQgbXV0YXRpb24gKCVkLyVkKSBmb3Iga2V5c3BhY2U6ICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGF0aW9uU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1heE11dGF0aW9uU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTUEFDRTEpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLnN0YXJ0c1dpdGgoZXhwZWN0ZWRNZXNzYWdlUHJlZml4KSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoU3RyaW5nLmZvcm1hdCgiJXMuJXMgYW5kIDEgbW9yZS4iLCBTVEFOREFSRDEsIGtleSkpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucyhmb3JtYXQoIiVzLiVzIGFuZCAxIG1vcmUuIiwgU1RBTkRBUkQxLCBrZXkpKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTcxMyw3ICs3MzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCJ2YWwiLCBCeXRlQnVmZmVyLmFsbG9jYXRlKERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb21taXRMb2dTZWdtZW50U2l6ZSgpIC8gNCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwogCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCA1IDsgaSsrKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspCiAgICAgICAgICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLmFkZChtMik7CiAKICAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBDb21taXRMb2cuaW5zdGFuY2Uuc2VnbWVudE1hbmFnZXIuZ2V0QWN0aXZlU2VnbWVudHMoKS5zaXplKCkpOwpAQCAtNzkxLDYgKzgxNCwxMjQgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYXlMaXN0UHJvcGVydHkoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBvbmx5IGtleXNwYWNlCisgICAgICAgIGFzc2VydFJlcGxheSgyLCBDT01NSVRfTE9HX1JFUExBWV9MSVNULCBLRVlTUEFDRTFfUkVQTEFZKTsKKworICAgICAgICAvLyBvbmx5IGtleXNwYWNlcworICAgICAgICBhc3NlcnRSZXBsYXkoMywgQ09NTUlUX0xPR19SRVBMQVlfTElTVCwgZm9ybWF0KCIlcywlcyIsIEtFWVNQQUNFMV9SRVBMQVksIEtFWVNQQUNFMl9SRVBMQVkpKTsKKworICAgICAgICAvLyBvbmx5IHRhYmxlIHdpdGgga2V5c3BhY2UKKyAgICAgICAgYXNzZXJ0UmVwbGF5KDEsIENPTU1JVF9MT0dfUkVQTEFZX0xJU1QsIGZvcm1hdCgiJXMuJXMiLCBLRVlTUEFDRTFfUkVQTEFZLCBLRVlTUEFDRTFfUkVQTEFZX1RBQkxFMSkpOworCisgICAgICAgIC8vIG1peCBvZiBrZXlzcGFjZSBhbmQgdGFibGVzIHdpdGgga2V5c3BhY2VzCisgICAgICAgIGFzc2VydFJlcGxheSgyLCBDT01NSVRfTE9HX1JFUExBWV9MSVNULCBmb3JtYXQoIiVzLiVzLCVzIiwgS0VZU1BBQ0UxX1JFUExBWSwgS0VZU1BBQ0UxX1JFUExBWV9UQUJMRTEsIEtFWVNQQUNFMl9SRVBMQVkpKTsKKworICAgICAgICAvLyBvbmx5IHRhYmxlcyB3aXRoIGtleXNwYWNlcworICAgICAgICBhc3NlcnRSZXBsYXkoMiwgQ09NTUlUX0xPR19SRVBMQVlfTElTVCwgZm9ybWF0KCIlcy4lcywlcy4lcyIsIEtFWVNQQUNFMV9SRVBMQVksIEtFWVNQQUNFMV9SRVBMQVlfVEFCTEUxLCBLRVlTUEFDRTJfUkVQTEFZLCBLRVlTUEFDRTJfUkVQTEFZX1RBQkxFMikpOworCisgICAgICAgIC8vIG1peCBvZiBrZXlzcGFjZSBhbmQgdGFibGVzIHdpdGgga2V5c3BhY2VzIHdpdGhpbiBzYW1lIGtleXNwYWNlLgorICAgICAgICBhc3NlcnRSZXBsYXkoMiwgQ09NTUlUX0xPR19SRVBMQVlfTElTVCwgZm9ybWF0KCIlcy4lcywlcyIsIEtFWVNQQUNFMV9SRVBMQVksIEtFWVNQQUNFMV9SRVBMQVlfVEFCTEUxLCBLRVlTUEFDRTFfUkVQTEFZKSk7CisKKyAgICAgICAgLy8gdGVzdCBmb3Igd3JvbmcgZm9ybWF0cworCisgICAgICAgIFN0cmluZyBpbnZhbGlkRm9ybWF0ID0gZm9ybWF0KCIlcy4lcy4lcyIsIEtFWVNQQUNFMV9SRVBMQVksIEtFWVNQQUNFMV9SRVBMQVlfVEFCTEUxLCBLRVlTUEFDRTFfUkVQTEFZKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0UmVwbGF5KDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUlUX0xPR19SRVBMQVlfTElTVCwgaW52YWxpZEZvcm1hdCk7CisgICAgICAgICAgICBmYWlsKGZvcm1hdCgicmVwbGF5IHNob3VsZCBmYWlsIG9uIC1EJXM9JXMgYXMgaXQgaXMgaW4gaW52YWxpZCBmb3JtYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUlUX0xPR19SRVBMQVlfTElTVC5nZXRLZXkoKSwgaW52YWxpZEZvcm1hdCkpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmb3JtYXQoIiVzIHByb3BlcnR5IGNvbnRhaW5zIGFuIGl0ZW0gd2hpY2ggaXMgbm90ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gZm9ybWF0ICdrZXlzcGFjZScgb3IgJ2tleXNwYWNlLnRhYmxlJyBidXQgaXQgaXMgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTU1JVF9MT0dfUkVQTEFZX0xJU1QuZ2V0S2V5KCksIGludmFsaWRGb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgaW52YWxpZEZvcm1hdDIgPSBmb3JtYXQoIiVzLiVzLCVzLiIsIEtFWVNQQUNFMV9SRVBMQVksIEtFWVNQQUNFMV9SRVBMQVlfVEFCTEUxLCBLRVlTUEFDRTFfUkVQTEFZKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0UmVwbGF5KDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUlUX0xPR19SRVBMQVlfTElTVCwgaW52YWxpZEZvcm1hdDIpOworICAgICAgICAgICAgZmFpbChmb3JtYXQoInJlcGxheSBzaG91bGQgZmFpbCBvbiAtRCVzPSVzIGFzIGl0IGlzIGluIGludmFsaWQgZm9ybWF0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTU1JVF9MT0dfUkVQTEFZX0xJU1QuZ2V0S2V5KCksIGludmFsaWRGb3JtYXQyKSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZvcm1hdCgiSW52YWxpZCBwYWlyOiAnJXMuJyIsIEtFWVNQQUNFMV9SRVBMQVkpLCBleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVwbGF5TGlzdFByb3BlcnR5UmVwbGF5ZXIgZXh0ZW5kcyBDb21taXRMb2dSZXBsYXllcgorICAgIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXBsYXlGaWx0ZXIgcmVwbGF5RmlsdGVyOworCisgICAgICAgIFJlcGxheUxpc3RQcm9wZXJ0eVJlcGxheWVyKENvbW1pdExvZyBjb21taXRMb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1pdExvZ1Bvc2l0aW9uIGdsb2JhbFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8VGFibGVJZCwgSW50ZXJ2YWxTZXQ8Q29tbWl0TG9nUG9zaXRpb24+PiBjZlBlcnNpc3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGF5RmlsdGVyIHJlcGxheUZpbHRlcikKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoY29tbWl0TG9nLCBnbG9iYWxQb3NpdGlvbiwgY2ZQZXJzaXN0ZWQsIHJlcGxheUZpbHRlcik7CisgICAgICAgICAgICB0aGlzLnJlcGxheUZpbHRlciA9IHJlcGxheUZpbHRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgY291bnQgPSAwOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNdXRhdGlvbihNdXRhdGlvbiBtLCBpbnQgc2l6ZSwgaW50IGVudHJ5TG9jYXRpb24sIENvbW1pdExvZ0Rlc2NyaXB0b3IgZGVzYykKKyAgICAgICAgeworICAgICAgICAgICAgY291bnQgKz0gSXRlcmFibGVzLnNpemUocmVwbGF5RmlsdGVyLmZpbHRlcihtKSk7CisgICAgICAgICAgICBzdXBlci5oYW5kbGVNdXRhdGlvbihtLCBzaXplLCBlbnRyeUxvY2F0aW9uLCBkZXNjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSZXBsYXkoaW50IGV4cGVjdGVkUmVwbGF5ZWRNdXRhdGlvbnMsIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcyBwcm9wZXJ0eSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChwcm9wZXJ0eSwgcHJvcGVydHlWYWx1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5yZXNldFVuc2FmZSh0cnVlKTsKKworICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUga3MxdGIxID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRTFfUkVQTEFZKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRTFfUkVQTEFZX1RBQkxFMSk7CisgICAgICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBrczF0YjIgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMV9SRVBMQVkpLmdldENvbHVtbkZhbWlseVN0b3JlKEtFWVNQQUNFMV9SRVBMQVlfVEFCTEUyKTsKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGtzMnRiMiA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UyX1JFUExBWSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoS0VZU1BBQ0UyX1JFUExBWV9UQUJMRTIpOworCisgICAgICAgICAgICBNdXRhdGlvbiBtdXRhdGlvbjEgPSBuZXcgUm93VXBkYXRlQnVpbGRlcihrczF0YjEubWV0YWRhdGEoKSwgMCwgImtleTEiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNsdXN0ZXJpbmcoImMxIikuYWRkKCJ2YWwiLCBCeXRlQnVmZmVyLmFsbG9jYXRlKDEwMCkpLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIE11dGF0aW9uIG11dGF0aW9uMiA9IG5ldyBSb3dVcGRhdGVCdWlsZGVyKGtzMXRiMi5tZXRhZGF0YSgpLCAwLCAia2V5MiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiYzIiKS5hZGQoInZhbCIsIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTAwKSkuYnVpbGQoKTsKKworICAgICAgICAgICAgTXV0YXRpb24gbXV0YXRpb24zID0gbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoa3MydGIyLm1ldGFkYXRhKCksIDAsICJrZXkzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjMyIpLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxMDApKS5idWlsZCgpOworCisgICAgICAgICAgICBDb21taXRMb2cuaW5zdGFuY2UuYWRkKG11dGF0aW9uMSk7CisgICAgICAgICAgICBDb21taXRMb2cuaW5zdGFuY2UuYWRkKG11dGF0aW9uMik7CisgICAgICAgICAgICBDb21taXRMb2cuaW5zdGFuY2UuYWRkKG11dGF0aW9uMyk7CisgICAgICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3luYyh0cnVlKTsKKworICAgICAgICAgICAgTWFwPFRhYmxlSWQsIEludGVydmFsU2V0PENvbW1pdExvZ1Bvc2l0aW9uPj4gY2ZQZXJzaXN0ZWQgPSBuZXcgSGFzaE1hcDxUYWJsZUlkLCBJbnRlcnZhbFNldDxDb21taXRMb2dQb3NpdGlvbj4+KCkKKyAgICAgICAgICAgIHt7CisgICAgICAgICAgICAgICAgcHV0KGtzMXRiMS5tZXRhZGF0YSgpLmlkLCBJbnRlcnZhbFNldC5lbXB0eSgpKTsKKyAgICAgICAgICAgICAgICBwdXQoa3MxdGIyLm1ldGFkYXRhKCkuaWQsIEludGVydmFsU2V0LmVtcHR5KCkpOworICAgICAgICAgICAgICAgIHB1dChrczJ0YjIubWV0YWRhdGEoKS5pZCwgSW50ZXJ2YWxTZXQuZW1wdHkoKSk7CisgICAgICAgICAgICB9fTsKKworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGFjdGl2ZVNlZ21lbnRzID0gQ29tbWl0TG9nLmluc3RhbmNlLmdldEFjdGl2ZVNlZ21lbnROYW1lcygpOworICAgICAgICAgICAgRmlsZVtdIGZpbGVzID0gbmV3IEZpbGUoQ29tbWl0TG9nLmluc3RhbmNlLnNlZ21lbnRNYW5hZ2VyLnN0b3JhZ2VEaXJlY3RvcnkpLnRyeUxpc3QoKGZpbGUsIG5hbWUpIC0+IGFjdGl2ZVNlZ21lbnRzLmNvbnRhaW5zKG5hbWUpKTsKKyAgICAgICAgICAgIFJlcGxheUxpc3RQcm9wZXJ0eVJlcGxheWVyIHJlcGxheWVyID0gbmV3IFJlcGxheUxpc3RQcm9wZXJ0eVJlcGxheWVyKENvbW1pdExvZy5pbnN0YW5jZSwgQ29tbWl0TG9nUG9zaXRpb24uTk9ORSwgY2ZQZXJzaXN0ZWQsIENvbW1pdExvZ1JlcGxheWVyLlJlcGxheUZpbHRlci5jcmVhdGUoKSk7CisgICAgICAgICAgICByZXBsYXllci5yZXBsYXlGaWxlcyhmaWxlcyk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlcGxheWVkTXV0YXRpb25zLCByZXBsYXllci5jb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHJlcGxheVdpdGhCYWRTeW5jTWFya2VyQ1JDKCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoU1RBTkRBUkQxKTsKQEAgLTg2Myw3ICsxMDA0LDcgQEAKICAgICB7CiAgICAgICAgIGludCBjZWxsQ291bnQgPSAwOwogICAgICAgICBpbnQgbWF4ID0gMTAyNDsKLSAgICAgICAgaW50IGRpc2NhcmRQb3NpdGlvbiA9IChpbnQpKG1heCAqIC44KTsgLy8gYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBlbnRyaWVzIHRoYXQgd2UnbGwgc2tpcCBvbiB0aGUgcmVwbGF5CisgICAgICAgIGludCBkaXNjYXJkUG9zaXRpb24gPSAoaW50KSAobWF4ICogLjgpOyAvLyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGVudHJpZXMgdGhhdCB3ZSdsbCBza2lwIG9uIHRoZSByZXBsYXkKICAgICAgICAgQ29tbWl0TG9nUG9zaXRpb24gY29tbWl0TG9nUG9zaXRpb24gPSBudWxsOwogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoU1RBTkRBUkQxKTsKIApAQCAtOTQ4LDEyICsxMDg5LDEyIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREaXNrRmFpbHVyZVBvbGljeShEaXNrRmFpbHVyZVBvbGljeS5pZ25vcmUpOwogCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCA1IDsgaSsrKQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzLm1ldGFkYXRhKCksIDAsICJrIikKLSAgICAgICAgICAgICAgICAgICAgLmNsdXN0ZXJpbmcoImMiICsgaSkuYWRkKCJ2YWwiLCBCeXRlQnVmZmVyLmFsbG9jYXRlKDEwMCkpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBseSgpOworICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjIiArIGkpLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxMDApKQorICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICAgICAgICAgLmFwcGx5KCk7CiAKICAgICAgICAgICAgICAgICBpZiAoaSA9PSAyKQogICAgICAgICAgICAgICAgIHsKQEAgLTk3OCwyNiArMTExOSwyNyBAQAogICAgICAgICB9CiAKICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLnN5bmModHJ1ZSk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnJlcGxheUxpc3QiLCBLRVlTUEFDRTEgKyAiLiIgKyBTVEFOREFSRDEpOwotICAgICAgICAvLyBDdXJyZW50bHkgd2UgZG9uJ3QgYXR0ZW1wdCB0byByZS1mbHVzaCBhIG1lbXRhYmxlIHRoYXQgZmFpbGVkLCB0aHVzIG1ha2Ugc3VyZSBkYXRhIGlzIHJlcGxheWVkIGJ5IGNvbW1pdGxvZy4KLSAgICAgICAgLy8gSWYgcmV0cmllcyB3b3JrIHN1YnNlcXVlbnQgZmx1c2hlcyBzaG91bGQgY2xlYXIgdXAgZXJyb3IgYW5kIHRoaXMgc2hvdWxkIGNoYW5nZSB0byBleHBlY3QgMC4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENvbW1pdExvZy5pbnN0YW5jZS5yZXNldFVuc2FmZShmYWxzZSkpOwotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLnJlcGxheUxpc3QiKTsKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KENPTU1JVF9MT0dfUkVQTEFZX0xJU1QsIEtFWVNQQUNFMSArICcuJyArIFNUQU5EQVJEMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEN1cnJlbnRseSB3ZSBkb24ndCBhdHRlbXB0IHRvIHJlLWZsdXNoIGEgbWVtdGFibGUgdGhhdCBmYWlsZWQsIHRodXMgbWFrZSBzdXJlIGRhdGEgaXMgcmVwbGF5ZWQgYnkgY29tbWl0bG9nLgorICAgICAgICAgICAgLy8gSWYgcmV0cmllcyB3b3JrIHN1YnNlcXVlbnQgZmx1c2hlcyBzaG91bGQgY2xlYXIgdXAgZXJyb3IgYW5kIHRoaXMgc2hvdWxkIGNoYW5nZSB0byBleHBlY3QgMC4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBDb21taXRMb2cuaW5zdGFuY2UucmVzZXRVbnNhZmUoZmFsc2UpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRPZk9yZGVyRmx1c2hSZWNvdmVyeShCaUNvbnN1bWVyPENvbHVtbkZhbWlseVN0b3JlLCBNZW10YWJsZT4gZmx1c2hBY3Rpb24sIGJvb2xlYW4gcGVyZm9ybUNvbXBhY3Rpb24pCi0gICAgICAgICAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KKyAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5yZXNldFVuc2FmZSh0cnVlKTsKIAogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoU1RBTkRBUkQxKTsKIAotICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCA1IDsgaSsrKQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykKICAgICAgICAgewogICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzLm1ldGFkYXRhKCksIDAsICJrIikKLSAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiYyIgKyBpKS5hZGQoInZhbCIsIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTAwKSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKQotICAgICAgICAgICAgICAgIC5hcHBseSgpOworICAgICAgICAgICAgLmNsdXN0ZXJpbmcoImMiICsgaSkuYWRkKCJ2YWwiLCBCeXRlQnVmZmVyLmFsbG9jYXRlKDEwMCkpCisgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICAgICAgLmFwcGx5KCk7CiAKICAgICAgICAgICAgIE1lbXRhYmxlIGN1cnJlbnQgPSBjZnMuZ2V0VHJhY2tlcigpLmdldFZpZXcoKS5nZXRDdXJyZW50TWVtdGFibGUoKTsKICAgICAgICAgICAgIGlmIChpID09IDIpCkBAIC0xMDEyLDcgKzExNTQsNyBAQAogICAgICAgICAgICAgcmVhZGVyLnJlbG9hZFNTVGFibGVNZXRhZGF0YSgpOwogCiAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5zeW5jKHRydWUpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5yZXBsYXlMaXN0IiwgS0VZU1BBQ0UxICsgIi4iICsgU1RBTkRBUkQxKTsKKyAgICAgICAgQ09NTUlUX0xPR19SRVBMQVlfTElTVC5zZXRTdHJpbmcoS0VZU1BBQ0UxICsgJy4nICsgU1RBTkRBUkQxKTsKICAgICAgICAgLy8gSW4gdGhlIGFic2VuY2Ugb2YgZXJyb3IsIHRoaXMgc2hvdWxkIGJlIDAgYmVjYXVzZSBmb3JjZUJsb2NraW5nRmx1c2gvZm9yY2VSZWN5Y2xlQWxsU2VnbWVudHMgd291bGQgaGF2ZQogICAgICAgICAvLyBwZXJzaXN0ZWQgYWxsIGRhdGEgaW4gdGhlIGNvbW1pdCBsb2cuIEJlY2F1c2Ugd2Uga25vdyB0aGVyZSB3YXMgYW4gZXJyb3IsIHRoZXJlIG11c3QgYmUgc29tZXRoaW5nIGxlZnQgdG8KICAgICAgICAgLy8gcmVwbGF5LgpAQCAtMTA4OSwxNiArMTIzMSwxMSBAQAogCiAgICAgICAgIGludCByZXBsYXllZCA9IDA7CiAKLSAgICAgICAgdHJ5CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChDT01NSVRMT0dfSUdOT1JFX1JFUExBWV9FUlJPUlMsIHRydWUpKQogICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoQ29tbWl0TG9nUmVwbGF5ZXIuSUdOT1JFX1JFUExBWV9FUlJPUlNfUFJPUEVSVFksICJ0cnVlIik7CiAgICAgICAgICAgICByZXBsYXllZCA9IENvbW1pdExvZy5pbnN0YW5jZS5yZXNldFVuc2FmZShmYWxzZSk7CiAgICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShDb21taXRMb2dSZXBsYXllci5JR05PUkVfUkVQTEFZX0VSUk9SU19QUk9QRVJUWSk7Ci0gICAgICAgIH0KLQorICAgICAgICAKICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlcGxheWVkLCAxKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9BYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0Fic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCmluZGV4IGJkNGIyOGYuLjFmYzQzYmQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0Fic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0Fic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCkBAIC0xOSw4ICsxOSw2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb247CiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CkBAIC00NCwxNSArNDIsMTEgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UxID0gIktleXNwYWNlMSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExDU19UQUJMRSA9ICJMQ1NfVEFCTEUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVENTX1RBQkxFID0gIlNUQ1NfVEFCTEUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEVENTX1RBQkxFID0gIkRUQ1NfVEFCTEUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUV0NTX1RBQkxFID0gIlRXQ1NfVEFCTEUiOwogCiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvYWREYXRhKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc3Rjc09wdGlvbnMgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIHN0Y3NPcHRpb25zLnB1dCgidG9tYnN0b25lX2NvbXBhY3Rpb25faW50ZXJ2YWwiLCAiMSIpOwotCiAgICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7CiAgICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCkBAIC02MCwxMyArNTQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb21wYWN0aW9uKENvbXBhY3Rpb25QYXJhbXMubGNzKENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBTVENTX1RBQkxFKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhY3Rpb24oQ29tcGFjdGlvblBhcmFtcy5zdGNzKENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBEVENTX1RBQkxFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhY3Rpb24oQ29tcGFjdGlvblBhcmFtcy5jcmVhdGUoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneS5jbGFzcywgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIFRXQ1NfVEFCTEUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tcGFjdGlvbihDb21wYWN0aW9uUGFyYW1zLmNyZWF0ZShUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSkpOwogICAgICAgICBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoTENTX1RBQkxFKS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKICAgICAgICAgS2V5c3BhY2Uub3BlbihLRVlTUEFDRTEpLmdldENvbHVtbkZhbWlseVN0b3JlKFNUQ1NfVEFCTEUpLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotICAgICAgICBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoRFRDU19UQUJMRSkuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CiAgICAgICAgIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShUV0NTX1RBQkxFKS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKICAgICB9CiAKQEAgLTc2LDcgKzY3LDYgQEAKIAogICAgICAgICBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoTENTX1RBQkxFKS50cnVuY2F0ZUJsb2NraW5nKCk7CiAgICAgICAgIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShTVENTX1RBQkxFKS50cnVuY2F0ZUJsb2NraW5nKCk7Ci0gICAgICAgIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShEVENTX1RBQkxFKS50cnVuY2F0ZUJsb2NraW5nKCk7CiAgICAgICAgIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShUV0NTX1RBQkxFKS50cnVuY2F0ZUJsb2NraW5nKCk7CiAgICAgfQogCkBAIC05MywxMiArODMsNiBAQAogICAgIH0KIAogICAgIEBUZXN0KHRpbWVvdXQ9MzAwMDApCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE5leHRCYWNrZ3JvdW5kVGFza0RvZXNOb3RCbG9ja0RUQ1MoKQotICAgIHsKLSAgICAgICAgdGVzdEdldE5leHRCYWNrZ3JvdW5kVGFza0RvZXNOb3RCbG9jayhEVENTX1RBQkxFKTsKLSAgICB9Ci0KLSAgICBAVGVzdCh0aW1lb3V0PTMwMDAwKQogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROZXh0QmFja2dyb3VuZFRhc2tEb2VzTm90QmxvY2tUV0NTKCkKICAgICB7CiAgICAgICAgIHRlc3RHZXROZXh0QmFja2dyb3VuZFRhc2tEb2VzTm90QmxvY2soVFdDU19UQUJMRSk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9BY3RpdmVDb21wYWN0aW9uc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0FjdGl2ZUNvbXBhY3Rpb25zVGVzdC5qYXZhCmluZGV4IDU2ZDZjNDAuLjc4NDk3OTYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0FjdGl2ZUNvbXBhY3Rpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0FjdGl2ZUNvbXBhY3Rpb25zVGVzdC5qYXZhCkBAIC00Niw4ICs0NiwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5JbmRleDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5TZWNvbmRhcnlJbmRleEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTY3J1YmJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklWZXJpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5LkluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2FjaGVTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwpAQCAtMTQzLDcgKzE0NSwxNSBAQAogICAgICAgICAgICAgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnMgPSBJbW11dGFibGVNYXAuPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPmJ1aWxkZXIoKS5wdXQoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkubWV0YWRhdGEoKS5pZCwgdHhuKS5idWlsZCgpOwogICAgICAgICAgICAgSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24gaXNyID0gbmV3IEluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uKHRyYW5zYWN0aW9ucywgMCwgMTAwMCk7CiAgICAgICAgICAgICBNb2NrQWN0aXZlQ29tcGFjdGlvbnMgbW9ja0FjdGl2ZUNvbXBhY3Rpb25zID0gbmV3IE1vY2tBY3RpdmVDb21wYWN0aW9ucygpOwotICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucnVuSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24oaXNyLCBtb2NrQWN0aXZlQ29tcGFjdGlvbnMpOworICAgICAgICAgICAgbW9ja0FjdGl2ZUNvbXBhY3Rpb25zLmJlZ2luQ29tcGFjdGlvbihpc3IpOworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXNyLnJlZGlzdHJpYnV0ZVN1bW1hcmllcygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWxseQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1vY2tBY3RpdmVDb21wYWN0aW9ucy5maW5pc2hDb21wYWN0aW9uKGlzcik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBhc3NlcnRUcnVlKG1vY2tBY3RpdmVDb21wYWN0aW9ucy5maW5pc2hlZCk7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1vY2tBY3RpdmVDb21wYWN0aW9ucy5ob2xkZXIpOwogICAgICAgICAgICAgLy8gaW5kZXggcmVkaXN0cmlidXRpb24gb3BlcmF0ZXMgb3ZlciBhbGwga2V5c3BhY2VzL3RhYmxlcywgd2UgYWx3YXlzIGNhbmNlbCB0aGVtCkBAIC0xOTEsNyArMjAxLDcgQEAKICAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGUsIE9wZXJhdGlvblR5cGUuU0NSVUIpKQogICAgICAgICB7CiAgICAgICAgICAgICBNb2NrQWN0aXZlQ29tcGFjdGlvbnMgbW9ja0FjdGl2ZUNvbXBhY3Rpb25zID0gbmV3IE1vY2tBY3RpdmVDb21wYWN0aW9ucygpOwotICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2Uuc2NydWJPbmUoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCksIHR4biwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBtb2NrQWN0aXZlQ29tcGFjdGlvbnMpOworICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2Uuc2NydWJPbmUoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCksIHR4biwgSVNjcnViYmVyLm9wdGlvbnMoKS5za2lwQ29ycnVwdGVkKCkuYnVpbGQoKSwgbW9ja0FjdGl2ZUNvbXBhY3Rpb25zKTsKIAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtb2NrQWN0aXZlQ29tcGFjdGlvbnMuZmluaXNoZWQpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1vY2tBY3RpdmVDb21wYWN0aW9ucy5ob2xkZXIuZ2V0Q29tcGFjdGlvbkluZm8oKS5nZXRTU1RhYmxlcygpLCBTZXRzLm5ld0hhc2hTZXQoc3N0YWJsZSkpOwpAQCAtMjE0LDcgKzIyNCw3IEBACiAKICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gSXRlcmFibGVzLmdldEZpcnN0KGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldExpdmVTU1RhYmxlcygpLCBudWxsKTsKICAgICAgICAgTW9ja0FjdGl2ZUNvbXBhY3Rpb25zIG1vY2tBY3RpdmVDb21wYWN0aW9ucyA9IG5ldyBNb2NrQWN0aXZlQ29tcGFjdGlvbnMoKTsKLSAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UudmVyaWZ5T25lKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLCBzc3RhYmxlLCBuZXcgVmVyaWZpZXIuT3B0aW9ucy5CdWlsZGVyKCkuYnVpbGQoKSwgbW9ja0FjdGl2ZUNvbXBhY3Rpb25zKTsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UudmVyaWZ5T25lKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLCBzc3RhYmxlLCBJVmVyaWZpZXIub3B0aW9ucygpLmJ1aWxkKCksIG1vY2tBY3RpdmVDb21wYWN0aW9ucyk7CiAgICAgICAgIGFzc2VydFRydWUobW9ja0FjdGl2ZUNvbXBhY3Rpb25zLmZpbmlzaGVkKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKG1vY2tBY3RpdmVDb21wYWN0aW9ucy5ob2xkZXIuZ2V0Q29tcGFjdGlvbkluZm8oKS5nZXRTU1RhYmxlcygpLCBTZXRzLm5ld0hhc2hTZXQoc3N0YWJsZSkpOwogICAgICAgICBhc3NlcnRGYWxzZShtb2NrQWN0aXZlQ29tcGFjdGlvbnMuaG9sZGVyLmdldENvbXBhY3Rpb25JbmZvKCkuc2hvdWxkU3RvcCgocykgLT4gZmFsc2UpKTsKQEAgLTI0NSw0ICsyNTUsNCBAQAogICAgICAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NhbmNlbENvbXBhY3Rpb25zVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ2FuY2VsQ29tcGFjdGlvbnNUZXN0LmphdmEKaW5kZXggNjc0MjFiYS4uNTFkYTBjNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ2FuY2VsQ29tcGFjdGlvbnNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ2FuY2VsQ29tcGFjdGlvbnNUZXN0LmphdmEKQEAgLTg2LDE0ICs4NiwxNiBAQAogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFjdGl2ZUNvbXBhY3Rpb25zLnNpemUoKSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWN0aXZlQ29tcGFjdGlvbnMuZ2V0KDApLmdldENvbXBhY3Rpb25JbmZvKCkuZ2V0U1NUYWJsZXMoKSwgdG9NYXJrQ29tcGFjdGluZyk7CiAgICAgICAgICAgICAvLyBwcmVkaWNhdGUgcmVxdWlyZXMgdGhlIG5vbi1jb21wYWN0aW5nIHNzdGFibGVzLCBzaG91bGQgbm90IGNhbmNlbCB0aGUgb25lIGN1cnJlbnRseSBjb21wYWN0aW5nOgotICAgICAgICAgICAgY2ZzLnJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKCgpIC0+IG51bGwsIChzc3RhYmxlKSAtPiAhdG9NYXJrQ29tcGFjdGluZy5jb250YWlucyhzc3RhYmxlKSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgIGNmcy5ydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZCgoKSAtPiBudWxsLCAoc3N0YWJsZSkgLT4gIXRvTWFya0NvbXBhY3RpbmcuY29udGFpbnMoc3N0YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uVHlwZS5QMCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhY3RpdmVDb21wYWN0aW9ucy5zaXplKCkpOwogICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYWN0aXZlQ29tcGFjdGlvbnMuZ2V0KDApLmlzU3RvcFJlcXVlc3RlZCgpKTsKIAogICAgICAgICAgICAgLy8gcHJlZGljYXRlIHJlcXVpcmVzIHRoZSBjb21wYWN0aW5nIG9uZXMgLSBtYWtlIHN1cmUgc3RvcCBpcyByZXF1ZXN0ZWQgYW5kIHRoYXQgd2hlbiB3ZSBhYm9ydCB0aGF0CiAgICAgICAgICAgICAvLyBjb21wYWN0aW9uIHdlIGFjdHVhbGx5IHJ1biB0aGUgY2FsbGFibGUgKGNvdW50ZG93biB0aGUgbGF0Y2gpCiAgICAgICAgICAgICBDb3VudERvd25MYXRjaCBjZGwgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7Ci0gICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKCkgLT4gY2ZzLnJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKCgpIC0+IHsgY2RsLmNvdW50RG93bigpOyByZXR1cm4gbnVsbDsgfSwgdG9NYXJrQ29tcGFjdGluZzo6Y29udGFpbnMsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOworICAgICAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCgpIC0+IGNmcy5ydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZCgoKSAtPiB7IGNkbC5jb3VudERvd24oKTsgcmV0dXJuIG51bGw7IH0sIHRvTWFya0NvbXBhY3Rpbmc6OmNvbnRhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25UeXBlLlAwLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKICAgICAgICAgICAgIHQuc3RhcnQoKTsKICAgICAgICAgICAgIHdoaWxlICghYWN0aXZlQ29tcGFjdGlvbnMuZ2V0KDApLmlzU3RvcFJlcXVlc3RlZCgpKQogICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOwpAQCAtMTM5LDEzICsxNDEsMTYgQEAKICAgICAgICAgICAgIGV4cGVjdGVkU1NUYWJsZXMuYWRkKG5ldyBIYXNoU2V0PD4oc3N0YWJsZXMuc3ViTGlzdCg2LCA5KSkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbXBhY3RpbmdTU1RhYmxlcywgZXhwZWN0ZWRTU1RhYmxlcyk7CiAKLSAgICAgICAgICAgIGNmcy5ydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZCgoKSAtPiBudWxsLCAoc3N0YWJsZSkgLT4gZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgICAgICBjZnMucnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQoKCkgLT4gbnVsbCwgKHNzdGFibGUpIC0+IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuUDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYWN0aXZlQ29tcGFjdGlvbnMuc2l6ZSgpKTsKICAgICAgICAgICAgIGFzc2VydFRydWUoYWN0aXZlQ29tcGFjdGlvbnMuc3RyZWFtKCkubm9uZU1hdGNoKENvbXBhY3Rpb25JbmZvLkhvbGRlcjo6aXNTdG9wUmVxdWVzdGVkKSk7CiAKICAgICAgICAgICAgIENvdW50RG93bkxhdGNoIGNkbCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKICAgICAgICAgICAgIC8vIHN0YXJ0IGEgY29tcGFjdGlvbiB3aGljaCBvbmx5IG5lZWRzIHRoZSBzc3RhYmxlcyB3aGVyZSBmaXJzdCB0b2tlbiBpcyA+IDUwIC0gdGhlc2UgYXJlIHRoZSBzc3RhYmxlcyBjb21wYWN0ZWQgYnkgdGN0cy5nZXQoMSkKLSAgICAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZCgoKSAtPiBjZnMucnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQoKCkgLT4geyBjZGwuY291bnREb3duKCk7IHJldHVybiBudWxsOyB9LCAoc3N0YWJsZSkgLT4gZmlyc3Qoc3N0YWJsZSkgPiA1MCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7CisgICAgICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQoKCkgLT4gY2ZzLnJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKCgpIC0+IHsgY2RsLmNvdW50RG93bigpOyByZXR1cm4gbnVsbDsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNzdGFibGUpIC0+IGZpcnN0KHNzdGFibGUpID4gNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuUDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwogICAgICAgICAgICAgdC5zdGFydCgpOwogICAgICAgICAgICAgYWN0aXZlQ29tcGFjdGlvbnMgPSBnZXRBY3RpdmVDb21wYWN0aW9uc0ZvclRhYmxlKGNmcyk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYWN0aXZlQ29tcGFjdGlvbnMuc2l6ZSgpKTsKQEAgLTMzMyw3ICszMzgsOCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGFzc2VydFRydWUoZm91bmRDb21wYWN0aW9uKTsKLSAgICAgICAgY2ZzLnJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKCgpIC0+IHtjb21wYWN0aW9uc1N0b3BwZWQuY291bnREb3duKCk7IHJldHVybiBudWxsO30sIChzc3RhYmxlKSAtPiB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgICAgICBjZnMucnVuV2l0aENvbXBhY3Rpb25zRGlzYWJsZWQoKCkgLT4geyBjb21wYWN0aW9uc1N0b3BwZWQuY291bnREb3duKCk7IHJldHVybiBudWxsOyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNzdGFibGUpIC0+IHRydWUsIE9wZXJhdGlvblR5cGUuUDAsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgIC8vIHdhaXQgZm9yIHRoZSBydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZCBjYWxsYWJsZQogICAgICAgICBjb21wYWN0aW9uc1N0b3BwZWQuYXdhaXQoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGdldEFjdGl2ZUNvbXBhY3Rpb25zRm9yVGFibGUoY2ZzKS5zaXplKCkpOwpAQCAtNDMwLDcgKzQzNiw4IEBACiAgICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBpZHguZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShpZHguZ2V0TGl2ZVNTVGFibGVzKCksIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTikpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLnJ1bldpdGhDb21wYWN0aW9uc0Rpc2FibGVkKCgpIC0+IHRydWUsIChzc3RhYmxlKSAtPiB7IHNzdGFibGVzLmFkZChzc3RhYmxlKTsgcmV0dXJuIHRydWU7fSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5ydW5XaXRoQ29tcGFjdGlvbnNEaXNhYmxlZCgoKSAtPiB0cnVlLCAoc3N0YWJsZSkgLT4geyBzc3RhYmxlcy5hZGQoc3N0YWJsZSk7IHJldHVybiB0cnVlO30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25UeXBlLlAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICAvLyB0aGUgcHJlZGljYXRlIG9ubHkgZ2V0cyBjb21wYWN0aW5nIHNzdGFibGVzLCBhbmQgd2UgYXJlIG9ubHkgY29tcGFjdGluZyB0aGUgMmkgc3N0YWJsZXMgLSB3aXRoIGludGVycnVwdEluZGV4ZXMgPSBmYWxzZSB3ZSBzaG91bGQgc2VlIG5vIHNzdGFibGVzIGhlcmUKICAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlcy5pc0VtcHR5KCkpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkNvbnRyb2xsZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uQ29udHJvbGxlclRlc3QuamF2YQppbmRleCA5ZDgxYjYxLi5jZTliMjhhIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uQ29udHJvbGxlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uQ29udHJvbGxlclRlc3QuamF2YQpAQCAtMjA0LDQgKzIwNCwzNyBAQAogICAgICAgICBhc3NlcnRGYWxzZShldmFsdWF0b3IudGVzdChib3VuZGFyeSkpOwogICAgICAgICBhc3NlcnRUcnVlKGV2YWx1YXRvci50ZXN0KGJvdW5kYXJ5IC0gMSkpOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVOZXZlclB1cmdlVG9tYnN0b25lcygpCisgICAgeworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRjIpOworICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOworCisgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBVdGlsLmRrKCJrMSIpOworICAgICAgICBsb25nIHRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBhcHBseU11dGF0aW9uKGNmcy5tZXRhZGF0YSgpLCBrZXksIHRpbWVzdGFtcCk7CisgICAgICAgIGNmcy5mb3JjZUJsb2NraW5nRmx1c2goQ29sdW1uRmFtaWx5U3RvcmUuRmx1c2hSZWFzb24uVU5JVF9URVNUUyk7CisgICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiB0b0NvbXBhY3QgPSBTZXRzLm5ld0hhc2hTZXQoY2ZzLmdldExpdmVTU1RhYmxlcygpKTsKKyAgICAgICAgY2ZzLnNldE5ldmVyUHVyZ2VUb21ic3RvbmVzKHRydWUpOworICAgICAgICBhcHBseU11dGF0aW9uKGNmcy5tZXRhZGF0YSgpLCBrZXksIHRpbWVzdGFtcCArIDEpOworCisgICAgICAgIHRyeSAoQ29tcGFjdGlvbkNvbnRyb2xsZXIgY2MgPSBuZXcgQ29tcGFjdGlvbkNvbnRyb2xsZXIoY2ZzLCB0b0NvbXBhY3QsIChpbnQpKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLzEwMDApKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY2MuZ2V0UHVyZ2VFdmFsdWF0b3Ioa2V5KS50ZXN0KHRpbWVzdGFtcCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY2MuZ2V0UHVyZ2VFdmFsdWF0b3Ioa2V5KS50ZXN0KHRpbWVzdGFtcCArIDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY2MuZ2V0RnVsbHlFeHBpcmVkU1NUYWJsZXMoKS5pc0VtcHR5KCkpOworCisgICAgICAgICAgICBjZnMuc2V0TmV2ZXJQdXJnZVRvbWJzdG9uZXMoZmFsc2UpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY2MuZ2V0UHVyZ2VFdmFsdWF0b3Ioa2V5KS50ZXN0KHRpbWVzdGFtcCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoY2MuZ2V0UHVyZ2VFdmFsdWF0b3Ioa2V5KS50ZXN0KHRpbWVzdGFtcCArIDEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY2MuZ2V0RnVsbHlFeHBpcmVkU1NUYWJsZXMoKS5pc0VtcHR5KCkpOworCisgICAgICAgICAgICBjYy5tYXliZVJlZnJlc2hPdmVybGFwcygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjYy5nZXRQdXJnZUV2YWx1YXRvcihrZXkpLnRlc3QodGltZXN0YW1wKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShjYy5nZXRQdXJnZUV2YWx1YXRvcihrZXkpLnRlc3QodGltZXN0YW1wICsgMSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjYy5nZXRGdWxseUV4cGlyZWRTU1RhYmxlcygpLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uSXRlcmF0b3JUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uSXRlcmF0b3JUZXN0LmphdmEKaW5kZXggZmYzZjIxMC4uMzMwZTFjNSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbkl0ZXJhdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25JdGVyYXRvclRlc3QuamF2YQpAQCAtMTcsOSArMTcsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRElBR05PU1RJQ19TTkFQU0hPVF9JTlRFUlZBTF9OQU5PUzsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJhbnNmb3JtLkR1cGxpY2F0ZVJvd0NoZWNrZXJUZXN0LmFzc2VydENvbW1hbmRJc3N1ZWQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyYW5zZm9ybS5EdXBsaWNhdGVSb3dDaGVja2VyVGVzdC5tYWtlUm93OwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmFuc2Zvcm0uRHVwbGljYXRlUm93Q2hlY2tlclRlc3Qucm93czsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJhbnNmb3JtLkR1cGxpY2F0ZVJvd0NoZWNrZXJUZXN0LnBhcnRpdGlvbjsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwogCiBpbXBvcnQgamF2YS51dGlsLio7CkBAIC00NjAsNyArNDYxLDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGR1cGxpY2F0ZVJvd3NUZXN0KCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuZGlhZ25vc3RpY19zbmFwc2hvdF9pbnRlcnZhbF9uYW5vcyIsICIwIik7CisgICAgICAgIERJQUdOT1NUSUNfU05BUFNIT1RfSU5URVJWQUxfTkFOT1Muc2V0TG9uZygwKTsKICAgICAgICAgLy8gQ3JlYXRlIGEgdGFibGUgYW5kIGluc2VydCBzb21lIGRhdGEuIFRoZSBhY3R1YWwgcm93cyByZWFkIGluIHRoZSB0ZXN0IHdpbGwgYmUgc3ludGhldGljCiAgICAgICAgIC8vIGJ1dCB0aGlzIGNyZWF0ZXMgYW4gc3N0YWJsZSBvbiBkaXNrIHRvIGJlIHNuYXBzaG90dGVkLgogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayB0ZXh0LCBjazEgaW50LCBjazIgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjazEsIGNrMikpIik7CkBAIC00OTQsNyArNDk1LDcgQEAKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCk7CiAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBjZnMuZ2V0UGFydGl0aW9uZXIoKS5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5ieXRlcygia2V5IikpOwogICAgICAgICB0cnkgKENvbXBhY3Rpb25Db250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgQ29tcGFjdGlvbkNvbnRyb2xsZXIoY2ZzLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgICAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd3MgPSByb3dzKGNmcy5tZXRhZGF0YSgpLCBrZXksIGZhbHNlLCB1bmZpbHRlcmVkcyk7CisgICAgICAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd3MgPSBwYXJ0aXRpb24oY2ZzLm1ldGFkYXRhKCksIGtleSwgZmFsc2UsIHVuZmlsdGVyZWRzKTsKICAgICAgICAgICAgICBJU1NUYWJsZVNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTY2FubmVyKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qocm93cykpOwogICAgICAgICAgICAgIENvbXBhY3Rpb25JdGVyYXRvciBpdGVyID0gbmV3IENvbXBhY3Rpb25JdGVyYXRvcihPcGVyYXRpb25UeXBlLkNPTVBBQ1RJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc2Nhbm5lciksCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyQm91bmRhcnlSZWxvYWRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyQm91bmRhcnlSZWxvYWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQzYjBkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXJCb3VuZGFyeVJlbG9hZFRlc3QuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb247CisKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlza0JvdW5kYXJpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5Ub2tlbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyQm91bmRhcnlSZWxvYWRUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9SZWxvYWQoKQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoImNyZWF0ZSB0YWJsZSAlcyAoaWQgaW50IHByaW1hcnkga2V5KSIpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKTsKKyAgICAgICAgTGlzdDxMaXN0PEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5Pj4gc3RyYXRlZ2llcyA9IGNmcy5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCkuZ2V0U3RyYXRlZ2llcygpOworICAgICAgICBEaXNrQm91bmRhcmllcyBkYiA9IGNmcy5nZXREaXNrQm91bmRhcmllcygpOworICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5nZXRUb2tlbk1ldGFkYXRhKCkuaW52YWxpZGF0ZUNhY2hlZFJpbmdzKCk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgc3RyYXRlZ3kgaW5zdGFuY2VzIGFyZSB0aGUgc2FtZSAobm8gcmVsb2FkKQorICAgICAgICBhc3NlcnRUcnVlKGlzU2FtZShzdHJhdGVnaWVzLCBjZnMuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLmdldFN0cmF0ZWdpZXMoKSkpOworICAgICAgICAvLyBidXQgZGlzayBib3VuZGFyaWVzIGFyZSBub3QgLmVxdWFsIChyaW5nIHZlcnNpb24gY2hhbmdlZCkKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKGRiLCBjZnMuZ2V0RGlza0JvdW5kYXJpZXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoZGIuaXNFcXVpdmFsZW50VG8oY2ZzLmdldERpc2tCb3VuZGFyaWVzKCkpKTsKKworICAgICAgICBkYiA9IGNmcy5nZXREaXNrQm91bmRhcmllcygpOworICAgICAgICBhbHRlclRhYmxlKCJhbHRlciB0YWJsZSAlcyB3aXRoIGNvbW1lbnQgPSAnYWJjZCciKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpc1NhbWUoc3RyYXRlZ2llcywgY2ZzLmdldENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoKS5nZXRTdHJhdGVnaWVzKCkpKTsKKyAgICAgICAgLy8gZGlzayBib3VuZGFyaWVzIGRvbid0IGNoYW5nZSBiZWNhdXNlIG9mIGFsdGVyCisgICAgICAgIGFzc2VydEVxdWFscyhkYiwgY2ZzLmdldERpc2tCb3VuZGFyaWVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbG9hZCgpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoImNyZWF0ZSB0YWJsZSAlcyAoaWQgaW50IHByaW1hcnkga2V5KSIpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKTsKKyAgICAgICAgTGlzdDxMaXN0PEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5Pj4gc3RyYXRlZ2llcyA9IGNmcy5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCkuZ2V0U3RyYXRlZ2llcygpOworICAgICAgICBEaXNrQm91bmRhcmllcyBkYiA9IGNmcy5nZXREaXNrQm91bmRhcmllcygpOworICAgICAgICBUb2tlbk1ldGFkYXRhIHRtZCA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKTsKKyAgICAgICAgdG1kLnVwZGF0ZU5vcm1hbFRva2VuKHRtZC5wYXJ0aXRpb25lci5nZXRNaW5pbXVtVG9rZW4oKSwgSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZSgiMTI3LjAuMC4xIikpOworICAgICAgICB0bWQudXBkYXRlTm9ybWFsVG9rZW4odG1kLnBhcnRpdGlvbmVyLmdldE1heGltdW1Ub2tlbigpLCBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKCIxMjcuMC4wLjIiKSk7CisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgc3RyYXRlZ3kgaW5zdGFuY2VzIGhhdmUgYmVlbiByZWxvYWRlZAorICAgICAgICBhc3NlcnRGYWxzZShpc1NhbWUoc3RyYXRlZ2llcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCkuZ2V0U3RyYXRlZ2llcygpKSk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhkYiwgY2ZzLmdldERpc2tCb3VuZGFyaWVzKCkpOworICAgICAgICBkYiA9IGNmcy5nZXREaXNrQm91bmRhcmllcygpOworCisgICAgICAgIHN0cmF0ZWdpZXMgPSBjZnMuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLmdldFN0cmF0ZWdpZXMoKTsKKyAgICAgICAgYWx0ZXJUYWJsZSgiYWx0ZXIgdGFibGUgJXMgd2l0aCBjb21wYWN0aW9uID0geydjbGFzcyc6ICdTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5JywgJ2VuYWJsZWQnOiBmYWxzZX0iKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXNTYW1lKHN0cmF0ZWdpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLmdldFN0cmF0ZWdpZXMoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGIsIGNmcy5nZXREaXNrQm91bmRhcmllcygpKTsKKworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NhbWUoTGlzdDxMaXN0PEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5Pj4gYSwgTGlzdDxMaXN0PEFic3RyYWN0Q29tcGFjdGlvblN0cmF0ZWd5Pj4gYikKKyAgICB7CisgICAgICAgIGlmIChhLnNpemUoKSAhPSBiLnNpemUoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYS5nZXQoaSkuc2l6ZSgpICE9IGIuZ2V0KGkpLnNpemUoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGEuZ2V0KGkpLnNpemUoKTsgaisrKQorICAgICAgICAgICAgICAgIGlmIChhLmdldChpKS5nZXQoaikgIT0gYi5nZXQoaSkuZ2V0KGopKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXJUZXN0LmphdmEKaW5kZXggOTk2MGU4ZS4uOGE5ZjJmYiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyVGVzdC5qYXZhCkBAIC0yOCwxMSArMjgsMTQgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uRmlsZXM7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTM5NSw2ICszOTgsNDEgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvdW50c0J5QnVja2V0cygpCisgICAgeworICAgICAgICBBc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHMoCisgICAgICAgICAgICBuZXcgaW50W10gezIsIDIsIDR9LAorICAgICAgICAgICAgQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5zdW1Db3VudHNCeUJ1Y2tldChJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgICAgIEltbXV0YWJsZU1hcC5vZig2MDAwMEwsIDEsIDBMLCAyLCAxODAwMDBMLCAxKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVNYXAub2YoNjAwMDBMLCAxLCAwTCwgMiwgMTgwMDAwTCwgMSkpLCBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLlRXQ1NfQlVDS0VUX0NPVU5UX01BWCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHMoCisgICAgICAgICAgICBuZXcgaW50W10gezEsIDEsIDN9LAorICAgICAgICAgICAgQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5zdW1Db3VudHNCeUJ1Y2tldChJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgICAgIEltbXV0YWJsZU1hcC5vZig2MDAwMEwsIDEsIDBMLCAxKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVNYXAub2YoMEwsIDIsIDE4MDAwMEwsIDEpKSwgQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5UV0NTX0JVQ0tFVF9DT1VOVF9NQVgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzKAorICAgICAgICAgICAgbmV3IGludFtdIHsxLCAxfSwKKyAgICAgICAgICAgIENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIuc3VtQ291bnRzQnlCdWNrZXQoSW1tdXRhYmxlTGlzdC5vZigKKyAgICAgICAgICAgICAgICBJbW11dGFibGVNYXAub2YoNjAwMDBMLCAxLCAwTCwgMSksCisgICAgICAgICAgICAgICAgSW1tdXRhYmxlTWFwLm9mKCkpLCBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLlRXQ1NfQlVDS0VUX0NPVU5UX01BWCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHMoCisgICAgICAgICAgICBuZXcgaW50W10gezgsIDR9LAorICAgICAgICAgICAgQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5zdW1Db3VudHNCeUJ1Y2tldChJbW11dGFibGVMaXN0Lm9mKAorICAgICAgICAgICAgICAgIEltbXV0YWJsZU1hcC5vZig2MDAwMEwsIDIsIDBMLCAxLCAxODAwMDBMLCA0KSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVNYXAub2YoNjAwMDBMLCAyLCAwTCwgMSwgMTgwMDAwTCwgNCkpLCAyKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRBcnJheUVxdWFscygKKyAgICAgICAgICAgIG5ldyBpbnRbXSB7MSwgMSwgMn0sCisgICAgICAgICAgICBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLnN1bUNvdW50c0J5QnVja2V0KEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVNYXAub2YoNjAwMDBMLCAxLCAwTCwgMiwgMTgwMDAwTCwgMSkpLCBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLlRXQ1NfQlVDS0VUX0NPVU5UX01BWCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHMoCisgICAgICAgICAgICBuZXcgaW50W10ge30sCisgICAgICAgICAgICBDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyLnN1bUNvdW50c0J5QnVja2V0KEltbXV0YWJsZUxpc3Qub2YoCisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpKSwgQ29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlci5UV0NTX0JVQ0tFVF9DT1VOVF9NQVgpKTsKKyAgICB9CisKICAgICBwcml2YXRlIE1vY2tDRlMgY3JlYXRlSkJPRE1vY2tDRlMoaW50IGRpc2tzKQogICAgIHsKICAgICAgICAgLy8gQ3JlYXRlICNkaXNrcyBkYXRhIGRpcmVjdG9yaWVzIHRvIHNpbXVsYXRlIEpCT0QKQEAgLTQ2NCw4ICs1MDIsNiBAQAogICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgfQogCi0KLQogICAgIGNsYXNzIE1vY2tCb3VuZGFyeU1hbmFnZXIKICAgICB7CiAgICAgICAgIHByaXZhdGUgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvblRhc2tUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uVGFza1Rlc3QuamF2YQppbmRleCAyNGIwYzNkLi5jYTc1NDUzIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uVGFza1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uVGFza1Rlc3QuamF2YQpAQCAtMTkxLDQgKzE5MSwxMiBAQAogICAgICAgICAgICAgY2ZzLmdldFRyYWNrZXIoKS5yZW1vdmVVbnNhZmUoc3N0YWJsZXMpOwogICAgICAgICB9CiAgICAgfQorICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ham9yQ29tcGFjdFRhc2soKQorICAgIHsKKyAgICAgICAgLy9tYWpvciBjb21wYWN0IHdpdGhvdXQgcmFuZ2UvcGsgc3BlY2lmaWVkIAorICAgICAgICBDb21wYWN0aW9uVGFza3MgY29tcGFjdGlvblRhc2tzID0gY2ZzLmdldENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoKS5nZXRNYXhpbWFsVGFza3MoSW50ZWdlci5NQVhfVkFMVUUsIGZhbHNlLCBPcGVyYXRpb25UeXBlLk1BSk9SX0NPTVBBQ1RJT04pOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb21wYWN0aW9uVGFza3Muc3RyZWFtKCkuYWxsTWF0Y2godGFzayAtPiB0YXNrLmNvbXBhY3Rpb25UeXBlLmVxdWFscyhPcGVyYXRpb25UeXBlLk1BSk9SX0NPTVBBQ1RJT04pKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbnNCeXRlbWFuVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vQ29tcGFjdGlvbnNCeXRlbWFuVGVzdC5qYXZhCmluZGV4IDQ2MmQ0MDYuLjk4N2NlMTggMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25zQnl0ZW1hblRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uc0J5dGVtYW5UZXN0LmphdmEKQEAgLTU1LDcgKzU1LDcgQEAKICAgICBAVGVzdAogICAgIEBCTVJ1bGVzKHJ1bGVzID0geyBAQk1SdWxlKG5hbWUgPSAiT25lIFNTVGFibGUgdG9vIGJpZyBmb3IgcmVtYWluaW5nIGRpc2sgc3BhY2UgdGVzdCIsCiAgICAgdGFyZ2V0Q2xhc3MgPSAiRGlyZWN0b3JpZXMiLAotICAgIHRhcmdldE1ldGhvZCA9ICJoYXNBdmFpbGFibGVEaXNrU3BhY2UiLAorICAgIHRhcmdldE1ldGhvZCA9ICJoYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMiLAogICAgIGNvbmRpdGlvbiA9ICJub3QgZmxhZ2dlZChcImRvbmVcIikiLAogICAgIGFjdGlvbiA9ICJmbGFnKFwiZG9uZVwiKTsgcmV0dXJuIGZhbHNlOyIpIH0gKQogICAgIHB1YmxpYyB2b2lkIHRlc3RTU1RhYmxlTm90RW5vdWdoRGlza1NwYWNlRm9yQ29tcGFjdGlvbkdldHNEcm9wcGVkKCkgdGhyb3dzIFRocm93YWJsZQpAQCAtODAsNyArODAsNyBAQAogICAgIEBUZXN0CiAgICAgQEJNUnVsZXMocnVsZXMgPSB7IEBCTVJ1bGUobmFtZSA9ICJObyBkaXNrIHNwYWNlIHdpdGggZXhwaXJlZCBTU1RhYmxlcyB0ZXN0IiwKICAgICB0YXJnZXRDbGFzcyA9ICJEaXJlY3RvcmllcyIsCi0gICAgdGFyZ2V0TWV0aG9kID0gImhhc0F2YWlsYWJsZURpc2tTcGFjZSIsCisgICAgdGFyZ2V0TWV0aG9kID0gImhhc0Rpc2tTcGFjZUZvckNvbXBhY3Rpb25zQW5kU3RyZWFtcyIsCiAgICAgYWN0aW9uID0gInJldHVybiBmYWxzZTsiKSB9ICkKICAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwaXJlZFNTVGFibGVzU3RpbGxHZXREcm9wcGVkV2l0aE5vRGlza1NwYWNlKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgIEBUZXN0KGV4cGVjdGVkID0gUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKICAgICBAQk1SdWxlcyhydWxlcyA9IHsgQEJNUnVsZShuYW1lID0gIk5vIGRpc2sgc3BhY2Ugd2l0aCBleHBpcmVkIFNTVGFibGVzIHRlc3QiLAogICAgIHRhcmdldENsYXNzID0gIkRpcmVjdG9yaWVzIiwKLSAgICB0YXJnZXRNZXRob2QgPSAiaGFzQXZhaWxhYmxlRGlza1NwYWNlIiwKKyAgICB0YXJnZXRNZXRob2QgPSAiaGFzRGlza1NwYWNlRm9yQ29tcGFjdGlvbnNBbmRTdHJlYW1zIiwKICAgICBhY3Rpb24gPSAicmV0dXJuIGZhbHNlOyIpIH0gKQogICAgIHB1YmxpYyB2b2lkIHRlc3RSdW50aW1lRXhjZXB0aW9uV2hlbk5vRGlza1NwYWNlRm9yQ29tcGFjdGlvbigpIHRocm93cyBUaHJvd2FibGUKICAgICB7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uc0NRTFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25zQ1FMVGVzdC5qYXZhCmluZGV4IDY1ZWVhNmEuLjVhZWYxNDQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25zQ1FMVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25zQ1FMVGVzdC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3RvcmU7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC01NSw5ICs1NiwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5QYXRoVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcGFjdGlvblBhcmFtczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtMTA4LDE5ICsxMTIsNiBAQAogICAgICAgICB3YWl0Rm9yTWlub3IoS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBTTEVFUF9USU1FLCB0cnVlKTsKICAgICB9CiAKLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFRyaWdnZXJNaW5vckNvbXBhY3Rpb25EVENTKCkgdGhyb3dzIFRocm93YWJsZQotICAgIHsKLSAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoaWQgdGV4dCBQUklNQVJZIEtFWSkgV0lUSCBjb21wYWN0aW9uID0geydjbGFzcyc6J0RhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3knLCAnbWluX3RocmVzaG9sZCc6Mn07Iik7Ci0gICAgICAgIGFzc2VydFRydWUoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLmlzRW5hYmxlZCgpKTsKLSAgICAgICAgZXhlY3V0ZSgiaW5zZXJ0IGludG8gJXMgKGlkKSB2YWx1ZXMgKCcxJykgdXNpbmcgdGltZXN0YW1wIDEwMDAiKTsgLy8gc2FtZSB0aW1lc3RhbXAgPSBzYW1lIHdpbmRvdyA9IG1pbm9yIGNvbXBhY3Rpb24gdHJpZ2dlcmVkCi0gICAgICAgIGZsdXNoKCk7Ci0gICAgICAgIGV4ZWN1dGUoImluc2VydCBpbnRvICVzIChpZCkgdmFsdWVzICgnMScpIHVzaW5nIHRpbWVzdGFtcCAxMDAwIik7Ci0gICAgICAgIGZsdXNoKCk7Ci0gICAgICAgIHdhaXRGb3JNaW5vcihLRVlTUEFDRSwgY3VycmVudFRhYmxlKCksIFNMRUVQX1RJTUUsIHRydWUpOwotICAgIH0KLQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFRyaWdnZXJNaW5vckNvbXBhY3Rpb25UV0NTKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKQEAgLTIxMywyMSArMjA0LDIxIEBACiAgICAgewogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChpZCB0ZXh0IFBSSU1BUlkgS0VZKSIpOwogICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvY2FsT3B0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgbG9jYWxPcHRpb25zLnB1dCgiY2xhc3MiLCAiRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSIpOworICAgICAgICBsb2NhbE9wdGlvbnMucHV0KCJjbGFzcyIsICJTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5Iik7CiAgICAgICAgIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLnNldENvbXBhY3Rpb25QYXJhbWV0ZXJzKGxvY2FsT3B0aW9ucyk7Ci0gICAgICAgIGFzc2VydFRydWUodmVyaWZ5U3RyYXRlZ2llcyhnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCksIERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2ZXJpZnlTdHJhdGVnaWVzKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoKSwgU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneS5jbGFzcykpOwogICAgICAgICAvLyBJbnZhbGlkYXRlIGRpc2sgYm91bmRhcmllcyB0byBlbnN1cmUgdGhhdCBib3VuZGFyeSBpbnZhbGlkYXRpb24gd2lsbCBub3QgY2F1c2UgdGhlIG9sZCBzdHJhdGVneSB0byBiZSByZWxvYWRlZAogICAgICAgICBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5pbnZhbGlkYXRlTG9jYWxSYW5nZXMoKTsKICAgICAgICAgLy8gYWx0ZXJpbmcgc29tZXRoaW5nIG5vbi1jb21wYWN0aW9uIHJlbGF0ZWQKICAgICAgICAgZXhlY3V0ZSgiQUxURVIgVEFCTEUgJXMgV0lUSCBnY19ncmFjZV9zZWNvbmRzID0gMTAwMCIpOwogICAgICAgICAvLyBzaG91bGQga2VlcCB0aGUgbG9jYWwgY29tcGFjdGlvbiBzdHJhdAotICAgICAgICBhc3NlcnRUcnVlKHZlcmlmeVN0cmF0ZWdpZXMoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLCBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUodmVyaWZ5U3RyYXRlZ2llcyhnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCksIFNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kuY2xhc3MpKTsKICAgICAgICAgLy8gQWx0ZXIga2V5c3BhY2UgcmVwbGljYXRpb24gc2V0dGluZ3MgdG8gZm9yY2UgY29tcGFjdGlvbiBzdHJhdGVneSByZWxvYWQKICAgICAgICAgZXhlY3V0ZSgiYWx0ZXIga2V5c3BhY2UgIitrZXlzcGFjZSgpKyIgd2l0aCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogMyB9Iik7CiAgICAgICAgIC8vIHNob3VsZCBrZWVwIHRoZSBsb2NhbCBjb21wYWN0aW9uIHN0cmF0Ci0gICAgICAgIGFzc2VydFRydWUodmVyaWZ5U3RyYXRlZ2llcyhnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCksIERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2ZXJpZnlTdHJhdGVnaWVzKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoKSwgU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneS5jbGFzcykpOwogICAgICAgICAvLyBhbHRlcmluZyBhIGNvbXBhY3Rpb24gb3B0aW9uCi0gICAgICAgIGV4ZWN1dGUoIkFMVEVSIFRBQkxFICVzIFdJVEggY29tcGFjdGlvbiA9IHsnY2xhc3MnOidTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5JywgJ21pbl90aHJlc2hvbGQnOjN9Iik7CisgICAgICAgIGV4ZWN1dGUoIkFMVEVSIFRBQkxFICVzIFdJVEggY29tcGFjdGlvbiA9IHsnY2xhc3MnOidTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5JywgJ21pbl90aHJlc2hvbGQnOiAzfSIpOwogICAgICAgICAvLyB3aWxsIHVzZSB0aGUgbmV3IG9wdGlvbgogICAgICAgICBhc3NlcnRUcnVlKHZlcmlmeVN0cmF0ZWdpZXMoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuZ2V0Q29tcGFjdGlvblN0cmF0ZWd5TWFuYWdlcigpLCBTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzKSk7CiAgICAgfQpAQCAtMjM3LDI0ICsyMjgsMjMgQEAKICAgICB7CiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGlkIHRleHQgUFJJTUFSWSBLRVkpIik7CiAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbG9jYWxPcHRpb25zID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBsb2NhbE9wdGlvbnMucHV0KCJjbGFzcyIsICJEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5Iik7CisgICAgICAgIGxvY2FsT3B0aW9ucy5wdXQoImNsYXNzIiwgIlNpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kiKTsKICAgICAgICAgbG9jYWxPcHRpb25zLnB1dCgiZW5hYmxlZCIsICJmYWxzZSIpOwogICAgICAgICBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5zZXRDb21wYWN0aW9uUGFyYW1ldGVycyhsb2NhbE9wdGlvbnMpOwogICAgICAgICBhc3NlcnRGYWxzZShnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCkuaXNFbmFibGVkKCkpOwogICAgICAgICBsb2NhbE9wdGlvbnMuY2xlYXIoKTsKLSAgICAgICAgbG9jYWxPcHRpb25zLnB1dCgiY2xhc3MiLCAiRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSIpOworICAgICAgICBsb2NhbE9wdGlvbnMucHV0KCJjbGFzcyIsICJTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5Iik7CiAgICAgICAgIC8vIGxvY2FsT3B0aW9ucy5wdXQoImVuYWJsZWQiLCAidHJ1ZSIpOyAtIHRoaXMgaXMgZGVmYXVsdCEKICAgICAgICAgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuc2V0Q29tcGFjdGlvblBhcmFtZXRlcnMobG9jYWxPcHRpb25zKTsKICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCkuaXNFbmFibGVkKCkpOwogICAgIH0KIAotCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0TG9jYWxDb21wYWN0aW9uU3RyYXRlZ3lFbmFibGUoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChpZCB0ZXh0IFBSSU1BUlkgS0VZKSIpOwogICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGxvY2FsT3B0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgbG9jYWxPcHRpb25zLnB1dCgiY2xhc3MiLCAiRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneSIpOworICAgICAgICBsb2NhbE9wdGlvbnMucHV0KCJjbGFzcyIsICJMZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5Iik7CiAKICAgICAgICAgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CiAgICAgICAgIGFzc2VydEZhbHNlKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldENvbXBhY3Rpb25TdHJhdGVneU1hbmFnZXIoKS5pc0VuYWJsZWQoKSk7CkBAIC0yNjMsOCArMjUzLDYgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZShnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5nZXRDb21wYWN0aW9uU3RyYXRlZ3lNYW5hZ2VyKCkuaXNFbmFibGVkKCkpOwogICAgIH0KIAotCi0KICAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkTG9jYWxDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zKCkKICAgICB7CkBAIC0zNTgsMTMgKzM0NiwxMyBAQAogICAgICAgICAvLyB3cml0ZSBlbm91Z2ggZGF0YSB0byBtYWtlIHN1cmUgd2UgdXNlIGFuIEluZGV4ZWRSZWFkZXIgd2hlbiBkb2luZyBhIHJlYWQsIGFuZCBtYWtlIHN1cmUgaXQgZmFpbHMgd2hlbiByZWFkaW5nIGEgY29ycnVwdCByb3cgZGVsZXRpb24KICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvcnJ1cHRlZFRvbWJzdG9uZVN0cmF0ZWd5KENvbmZpZy5Db3JydXB0ZWRUb21ic3RvbmVTdHJhdGVneS5leGNlcHRpb24pOwogICAgICAgICBpbnQgbWF4U2l6ZVByZSA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleFNpemVJbktpQigpOwotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplKDEwMjQpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoMTAyNCk7CiAgICAgICAgIHByZXBhcmVXaWRlKCk7CiAgICAgICAgIFJvd1VwZGF0ZUJ1aWxkZXIuZGVsZXRlUm93QXQoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkubWV0YWRhdGEoKSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKiAxMDAwLCAtMSwgMjIsIDMzKS5hcHBseSgpOwogICAgICAgICBmbHVzaCgpOwogICAgICAgICByZWFkQW5kVmFsaWRhdGUodHJ1ZSk7CiAgICAgICAgIHJlYWRBbmRWYWxpZGF0ZShmYWxzZSk7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemUobWF4U2l6ZVByZSk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemVJbktpQihtYXhTaXplUHJlKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMzczLDE0ICszNjEsMTQgQEAKICAgICAgICAgLy8gd3JpdGUgZW5vdWdoIGRhdGEgdG8gbWFrZSBzdXJlIHdlIHVzZSBhbiBJbmRleGVkUmVhZGVyIHdoZW4gZG9pbmcgYSByZWFkLCBhbmQgbWFrZSBzdXJlIGl0IGZhaWxzIHdoZW4gcmVhZGluZyBhIGNvcnJ1cHQgc3RhbmRhcmQgdG9tYnN0b25lCiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb3JydXB0ZWRUb21ic3RvbmVTdHJhdGVneShDb25maWcuQ29ycnVwdGVkVG9tYnN0b25lU3RyYXRlZ3kuZXhjZXB0aW9uKTsKICAgICAgICAgaW50IG1heFNpemVQcmUgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoKTsKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZSgxMDI0KTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZUluS2lCKDEwMjQpOwogICAgICAgICBwcmVwYXJlV2lkZSgpOwogICAgICAgICBSb3dVcGRhdGVCdWlsZGVyIHJ1YiA9IG5ldyBSb3dVcGRhdGVCdWlsZGVyKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLm1ldGFkYXRhKCksIC0xLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAqIDEwMDAsIDIyKS5jbHVzdGVyaW5nKDMzKS5kZWxldGUoImIiKTsKICAgICAgICAgcnViLmJ1aWxkKCkuYXBwbHkoKTsKICAgICAgICAgZmx1c2goKTsKICAgICAgICAgcmVhZEFuZFZhbGlkYXRlKHRydWUpOwogICAgICAgICByZWFkQW5kVmFsaWRhdGUoZmFsc2UpOwotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplKG1heFNpemVQcmUpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIobWF4U2l6ZVByZSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTM4OSw3ICszNzcsNyBAQAogICAgICAgICAvLyB3cml0ZSBlbm91Z2ggZGF0YSB0byBtYWtlIHN1cmUgd2UgdXNlIGFuIEluZGV4ZWRSZWFkZXIgd2hlbiBkb2luZyBhIHJlYWQsIGFuZCBtYWtlIHN1cmUgaXQgZmFpbHMgd2hlbiByZWFkaW5nIGEgY29ycnVwdCByYW5nZSB0b21ic3RvbmUKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvcnJ1cHRlZFRvbWJzdG9uZVN0cmF0ZWd5KENvbmZpZy5Db3JydXB0ZWRUb21ic3RvbmVTdHJhdGVneS5leGNlcHRpb24pOwogICAgICAgICBmaW5hbCBpbnQgbWF4U2l6ZVByZUtpQiA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleFNpemVJbktpQigpOwotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplKDEwMjQpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoMTAyNCk7CiAgICAgICAgIHByZXBhcmVXaWRlKCk7CiAgICAgICAgIFJhbmdlVG9tYnN0b25lIHJ0ID0gbmV3IFJhbmdlVG9tYnN0b25lKFNsaWNlLkFMTCwgbmV3IERlbGV0aW9uVGltZShTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwgLTEpKTsKICAgICAgICAgUm93VXBkYXRlQnVpbGRlciBydWIgPSBuZXcgUm93VXBkYXRlQnVpbGRlcihnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5tZXRhZGF0YSgpLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAqIDEwMDAsIDIyKS5jbHVzdGVyaW5nKDMzKS5hZGRSYW5nZVRvbWJzdG9uZShydCk7CkBAIC0zOTcsNyArMzg1LDcgQEAKICAgICAgICAgZmx1c2goKTsKICAgICAgICAgcmVhZEFuZFZhbGlkYXRlKHRydWUpOwogICAgICAgICByZWFkQW5kVmFsaWRhdGUoZmFsc2UpOwotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplKG1heFNpemVQcmVLaUIpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhTaXplSW5LaUIobWF4U2l6ZVByZUtpQik7CiAgICAgfQogCiAKQEAgLTc3MCw0ICs3NTgsNjggQEAKICAgICAgICAgaWYgKHNob3VsZEZpbmQpCiAgICAgICAgICAgICBmYWlsKCJObyBtaW5vciBjb21wYWN0aW9uIHRyaWdnZXJlZCBpbiAiK21heFdhaXRUaW1lKyJtcyIpOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vRGlza3NwYWNlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoImNyZWF0ZSB0YWJsZSAlcyAoaWQgaW50IHByaW1hcnkga2V5LCBpIGludCkgd2l0aCBjb21wYWN0aW9uPXsnY2xhc3MnOidTaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5J30iKTsKKyAgICAgICAgZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZXhlY3V0ZSgiaW5zZXJ0IGludG8gJXMgKGlkLCBpKSB2YWx1ZXMgKD8sPykiLCBpLCBpKTsKKyAgICAgICAgICAgIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmZvcmNlQmxvY2tpbmdGbHVzaChDb2x1bW5GYW1pbHlTdG9yZS5GbHVzaFJlYXNvbi5VTklUX1RFU1RTKTsKKyAgICAgICAgfQorICAgICAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgaG9sZGVyID0gaG9sZGVyKE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTik7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5iZWdpbkNvbXBhY3Rpb24oaG9sZGVyKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmZvcmNlTWFqb3JDb21wYWN0aW9uKCk7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGlnbm9yZWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZmluaXNoQ29tcGFjdGlvbihob2xkZXIpOworICAgICAgICB9CisgICAgICAgIC8vIGRvbid0IGJsb2NrIGNvbXBhY3Rpb25zIGlmIHRoZXJlIGlzIGEgaHVnZSB2YWxpZGF0aW9uCisgICAgICAgIGhvbGRlciA9IGhvbGRlcihPcGVyYXRpb25UeXBlLlZBTElEQVRJT04pOworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuYmVnaW5Db21wYWN0aW9uKGhvbGRlcik7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5mb3JjZU1ham9yQ29tcGFjdGlvbigpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmZpbmlzaENvbXBhY3Rpb24oaG9sZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQ29tcGFjdGlvbkluZm8uSG9sZGVyIGhvbGRlcihPcGVyYXRpb25UeXBlIG9wVHlwZSkKKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25JbmZvLkhvbGRlciBob2xkZXIgPSBuZXcgQ29tcGFjdGlvbkluZm8uSG9sZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGF2YWlsYWJsZVNwYWNlID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKEZpbGUgZiA6IGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldERpcmVjdG9yaWVzKCkuZ2V0Q0ZEaXJlY3RvcmllcygpKQorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVTcGFjZSArPSBQYXRoVXRpbHMudHJ5R2V0U3BhY2UoZi50b1BhdGgoKSwgRmlsZVN0b3JlOjpnZXRVc2FibGVTcGFjZSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLm1ldGFkYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICthdmFpbGFibGVTcGFjZSAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0VGltZVVVSUQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLmdldExpdmVTU1RhYmxlcygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIGhvbGRlcjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9Db21wYWN0aW9uc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25zVGVzdC5qYXZhCmluZGV4IGZjZjVjNTEuLjNjMDIxNTQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0NvbXBhY3Rpb25zVGVzdC5qYXZhCkBAIC0zMSw2ICszMSw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29sdW1uSWRlbnRpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwpAQCAtNjEsMTMgKzYyLDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JU1NUYWJsZVNjYW5uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlSWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlSWRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXBhY3Rpb25QYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFUZXN0VXRpbDsKQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgICAgY29tcGFjdGlvbk9wdGlvbnMucHV0KCJ0b21ic3RvbmVfY29tcGFjdGlvbl9pbnRlcnZhbCIsICIxIik7CiAKICAgICAgICAgLy8gRGlzYWJsZSB0b21ic3RvbmUgaGlzdG9ncmFtIHJvdW5kaW5nIGZvciB0ZXN0cwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5zdHJlYW1pbmdoaXN0b2dyYW0ucm91bmRzZWNvbmRzIiwgIjEiKTsKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNUUkVBTUlOR19ISVNUT0dSQU1fUk9VTkRfU0VDT05EUy5zZXRJbnQoMSk7CiAKICAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKIApAQCAtMTEwLDExICsxMTAsMTYgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgbG9uZyBwb3B1bGF0ZShTdHJpbmcga3MsIFN0cmluZyBjZiwgaW50IHN0YXJ0Um93S2V5LCBpbnQgZW5kUm93S2V5LCBpbnQgdHRsKQogICAgIHsKKyAgICAgICAgcmV0dXJuIHBvcHVsYXRlKGtzLCBjZiwgc3RhcnRSb3dLZXksIGVuZFJvd0tleSwgIiIsIHR0bCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBsb25nIHBvcHVsYXRlKFN0cmluZyBrcywgU3RyaW5nIGNmLCBpbnQgc3RhcnRSb3dLZXksIGludCBlbmRSb3dLZXksIFN0cmluZyBzdWZmaXgsIGludCB0dGwpCisgICAgewogICAgICAgICBsb25nIHRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwogICAgICAgICBUYWJsZU1ldGFkYXRhIGNmbSA9IEtleXNwYWNlLm9wZW4oa3MpLmdldENvbHVtbkZhbWlseVN0b3JlKGNmKS5tZXRhZGF0YSgpOwogICAgICAgICBmb3IgKGludCBpID0gc3RhcnRSb3dLZXk7IGkgPD0gZW5kUm93S2V5OyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBVdGlsLmRrKEludGVnZXIudG9TdHJpbmcoaSkpOworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IFV0aWwuZGsoSW50ZWdlci50b1N0cmluZyhpKSArIHN1ZmZpeCk7CiAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZtLCB0aW1lc3RhbXAsIGogPiAwID8gdHRsIDogMCwga2V5LmdldEtleSgpKQpAQCAtMTgxLDEyICsxODYsMTIgQEAKICAgICAgICAgLy8gZGlzYWJsZSBjb21wYWN0aW9uIHdoaWxlIGZsdXNoaW5nCiAgICAgICAgIHN0b3JlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwogCi0gICAgICAgIC8vUG9wdWxhdGUgc3N0YWJsZTEgd2l0aCB3aXRoIGtleXMgWzAuLjldCi0gICAgICAgIHBvcHVsYXRlKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQxLCAwLCA5LCAzKTsgLy90dGw9M3MKKyAgICAgICAgLy9Qb3B1bGF0ZSBzc3RhYmxlMSB3aXRoIHdpdGgga2V5cyBbMGEuLjI5YV0KKyAgICAgICAgcG9wdWxhdGUoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRDEsIDAsIDI5LCAiYSIsMyk7IC8vdHRsPTNzCiAgICAgICAgIFV0aWwuZmx1c2goc3RvcmUpOwogCi0gICAgICAgIC8vUG9wdWxhdGUgc3N0YWJsZTIgd2l0aCB3aXRoIGtleXMgWzEwLi4xOV0gKGtleXMgZG8gbm90IG92ZXJsYXAgd2l0aCBTU1RhYmxlMSkKLSAgICAgICAgbG9uZyB0aW1lc3RhbXAyID0gcG9wdWxhdGUoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRDEsIDEwLCAxOSwgMyk7IC8vdHRsPTNzCisgICAgICAgIC8vUG9wdWxhdGUgc3N0YWJsZTIgd2l0aCB3aXRoIGtleXMgWzBiLi4yOWJdIChrZXlzIGRvIG5vdCBvdmVybGFwIHdpdGggU1NUYWJsZTEsIGJ1dCB0aGUgcmFuZ2UgaXMgYWxtb3N0IGZ1bGx5IGNvdmVyZWQpCisgICAgICAgIGxvbmcgdGltZXN0YW1wMiA9IHBvcHVsYXRlKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQxLCAwLCAyOSwgImIiLCAzKTsgLy90dGw9M3MKICAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHN0b3JlLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CkBAIC0yNzQsNyArMjc5LDcgQEAKICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gc3N0YWJsZXMuaXRlcmF0b3IoKS5uZXh0KCk7CiAKICAgICAgICAgU1NUYWJsZUlkIHByZXZHZW5lcmF0aW9uID0gc3N0YWJsZS5kZXNjcmlwdG9yLmlkOwotICAgICAgICBTdHJpbmcgZmlsZSA9IG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpLmFic29sdXRlUGF0aCgpOworICAgICAgICBTdHJpbmcgZmlsZSA9IHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkuYWJzb2x1dGVQYXRoKCk7CiAgICAgICAgIC8vIHN1Ym1pdCB1c2VyIGRlZmluZWQgY29tcGFjdGlvbiBvbiBmbHVzaGVkIHNzdGFibGUKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZm9yY2VVc2VyRGVmaW5lZENvbXBhY3Rpb24oZmlsZSk7CiAgICAgICAgIC8vIHdhaXQgdW50aWwgdXNlciBkZWZpbmVkIGNvbXBhY3Rpb24gZmluaXNoZXMKQEAgLTM2Myw4ICszNjgsOCBAQAogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkKICAgICAgICAgewogICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBzdGF0cyA9IHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjAiKSwgc3RhdHMubWluQ2x1c3RlcmluZ1ZhbHVlcy5nZXQoMCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJiIiksIHN0YXRzLm1heENsdXN0ZXJpbmdWYWx1ZXMuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5ieXRlcygiMCIpLCBzdGF0cy5jb3ZlcmVkQ2x1c3RlcmluZy5zdGFydCgpLmJ1ZmZlckF0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5ieXRlcygiYiIpLCBzdGF0cy5jb3ZlcmVkQ2x1c3RlcmluZy5lbmQoKS5idWZmZXJBdCgwKSk7CiAgICAgICAgIH0KIAogICAgICAgICBhc3NlcnRFcXVhbHMoa2V5cywgayk7CkBAIC01NjUsNCArNTcwLDQgQEAKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2Uuc2V0Q29uY3VycmVudENvbXBhY3RvcnMoMSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5nZXRDb3JlQ29tcGFjdG9yVGhyZWFkcygpKTsKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0RhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZjIxMGEuLjAwMDAwMDAKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uOwotCi1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuU1NUYWJsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkRhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kuZ2V0QnVja2V0czsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5EYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5Lm5ld2VzdEJ1Y2tldDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5EYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5LmZpbHRlck9sZFNTVGFibGVzOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkRhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kudmFsaWRhdGVPcHRpb25zOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKLQotcHVibGljIGNsYXNzIERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lUZXN0IGV4dGVuZHMgU2NoZW1hTG9hZGVyCi17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UxID0gIkRhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lUZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkQxID0gIlN0YW5kYXJkMSI7Ci0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBEaXNhYmxlIHRvbWJzdG9uZSBoaXN0b2dyYW0gcm91bmRpbmcgZm9yIHRlc3RzCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN0cmVhbWluZ2hpc3RvZ3JhbS5yb3VuZHNlY29uZHMiLCAiMSIpOwotCi0gICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7Ci0KLSAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMSwKLSAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCi0gICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENGX1NUQU5EQVJEMSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE9wdGlvbnNWYWxpZGF0aW9uKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuQkFTRV9USU1FX0tFWSwgIjMwIik7Ci0gICAgICAgIG9wdGlvbnMucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLk1BWF9TU1RBQkxFX0FHRV9LRVksICIxODI1Iik7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdW52YWxpZGF0ZWQgPSB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIGFzc2VydFRydWUodW52YWxpZGF0ZWQuaXNFbXB0eSgpKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuQkFTRV9USU1FX0tFWSwgIjAiKTsKLSAgICAgICAgICAgIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiJXMgPT0gMCBzaG91bGQgYmUgcmVqZWN0ZWQiLCBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5CQVNFX1RJTUVfS0VZKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkge30KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuQkFTRV9USU1FX0tFWSwgIi0xMzM3Iik7Ci0gICAgICAgICAgICB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgICAgICBmYWlsKFN0cmluZy5mb3JtYXQoIk5lZ2F0aXZlICVzIHNob3VsZCBiZSByZWplY3RlZCIsIERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLkJBU0VfVElNRV9LRVkpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBvcHRpb25zLnB1dChEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5CQVNFX1RJTUVfS0VZLCAiMSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLk1BWF9TU1RBQkxFX0FHRV9LRVksICItMTMzNyIpOwotICAgICAgICAgICAgdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICAgICAgZmFpbChTdHJpbmcuZm9ybWF0KCJOZWdhdGl2ZSAlcyBzaG91bGQgYmUgcmVqZWN0ZWQiLCBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5NQVhfU1NUQUJMRV9BR0VfS0VZKSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuTUFYX1NTVEFCTEVfQUdFX0tFWSwgIjAiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBvcHRpb25zLnB1dChEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5NQVhfV0lORE9XX1NJWkVfS0VZLCAiLTEiKTsKLSAgICAgICAgICAgIHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgICAgIGZhaWwoU3RyaW5nLmZvcm1hdCgiTmVnYXRpdmUgJXMgc2hvdWxkIGJlIHJlamVjdGVkIiwgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuTUFYX1dJTkRPV19TSVpFX0tFWSkpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9wdGlvbnMucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLk1BWF9XSU5ET1dfU0laRV9LRVksICIwIik7Ci0gICAgICAgIH0KLQotICAgICAgICBvcHRpb25zLnB1dCgiYmFkX29wdGlvbiIsICIxLjAiKTsKLSAgICAgICAgdW52YWxpZGF0ZWQgPSB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIGFzc2VydFRydWUodW52YWxpZGF0ZWQuY29udGFpbnNLZXkoImJhZF9vcHRpb24iKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZUNvbnZlcnNpb25zKCkKLSAgICB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuQkFTRV9USU1FX0tFWSwgIjMwIik7Ci0gICAgICAgIG9wdGlvbnMucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLlRJTUVTVEFNUF9SRVNPTFVUSU9OX0tFWSwgIlNFQ09ORFMiKTsKLQotICAgICAgICBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucyBvcHRzID0gbmV3IERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3B0cy5tYXhTU1RhYmxlQWdlLCBUaW1lVW5pdC5TRUNPTkRTLmNvbnZlcnQoMzY1KjEwMDAsIFRpbWVVbml0LkRBWVMpKTsKLQotICAgICAgICBvcHRpb25zLnB1dChEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5USU1FU1RBTVBfUkVTT0xVVElPTl9LRVksICJNSUxMSVNFQ09ORFMiKTsKLSAgICAgICAgb3B0cyA9IG5ldyBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdHMubWF4U1NUYWJsZUFnZSwgVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoMzY1KjEwMDAsIFRpbWVVbml0LkRBWVMpKTsKLQotICAgICAgICBvcHRpb25zLnB1dChEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5USU1FU1RBTVBfUkVTT0xVVElPTl9LRVksICJNSUNST1NFQ09ORFMiKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuTUFYX1NTVEFCTEVfQUdFX0tFWSwgIjEwIik7Ci0gICAgICAgIG9wdHMgPSBuZXcgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMob3B0aW9ucyk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcHRzLm1heFNTVGFibGVBZ2UsIFRpbWVVbml0Lk1JQ1JPU0VDT05EUy5jb252ZXJ0KDEwLCBUaW1lVW5pdC5EQVlTKSk7Ci0KLSAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuTUFYX1NTVEFCTEVfQUdFX0tFWSwgIjAuNSIpOwotICAgICAgICBvcHRzID0gbmV3IERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zKG9wdGlvbnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMob3B0cy5tYXhTU1RhYmxlQWdlLCBUaW1lVW5pdC5NSUNST1NFQ09ORFMuY29udmVydCgxLCBUaW1lVW5pdC5EQVlTKSAvIDIpOwotCi0gICAgICAgIG9wdGlvbnMucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLlRJTUVTVEFNUF9SRVNPTFVUSU9OX0tFWSwgIkhPVVJTIik7Ci0gICAgICAgIG9wdGlvbnMucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLk1BWF9TU1RBQkxFX0FHRV9LRVksICIwLjUiKTsKLSAgICAgICAgb3B0cyA9IG5ldyBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucyhvcHRpb25zKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9wdHMubWF4U1NUYWJsZUFnZSwgMTIpOwotCi0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QnVja2V0cygpCi0gICAgewotICAgICAgICBMaXN0PFBhaXI8U3RyaW5nLCBMb25nPj4gcGFpcnMgPSBMaXN0cy5uZXdBcnJheUxpc3QoCi0gICAgICAgICAgICAgICAgUGFpci5jcmVhdGUoImEiLCAxOTlMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYiIsIDI5OUwpLAotICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKCJhIiwgMUwpLAotICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKCJiIiwgMjAxTCkKLSAgICAgICAgKTsKLSAgICAgICAgTGlzdDxMaXN0PFN0cmluZz4+IGJ1Y2tldHMgPSBnZXRCdWNrZXRzKHBhaXJzLCAxMDBMLCAyLCAyMDBMLCBMb25nLk1BWF9WQUxVRSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBidWNrZXRzLnNpemUoKSk7Ci0KLSAgICAgICAgZm9yIChMaXN0PFN0cmluZz4gYnVja2V0IDogYnVja2V0cykKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGJ1Y2tldC5zaXplKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Y2tldC5nZXQoMCksIGJ1Y2tldC5nZXQoMSkpOwotICAgICAgICB9Ci0KLQotICAgICAgICBwYWlycyA9IExpc3RzLm5ld0FycmF5TGlzdCgKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYSIsIDIwMDBMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYiIsIDM2MDBMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYSIsIDIwMEwpLAotICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKCJjIiwgMzk1MEwpLAotICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKCJ0b28gbmV3IiwgNDEyNUwpLAotICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKCJiIiwgMzg5OUwpLAotICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKCJjIiwgMzkwMEwpCi0gICAgICAgICk7Ci0gICAgICAgIGJ1Y2tldHMgPSBnZXRCdWNrZXRzKHBhaXJzLCAxMDBMLCAzLCA0MDUwTCwgTG9uZy5NQVhfVkFMVUUpOwotICAgICAgICAvLyB0YXJnZXRzIChkaXZQb3NpdGlvbiwgc2l6ZSk6ICg0MCwgMTAwKSwgKDM5LCAxMDApLCAoMTIsIDMwMCksICgzLCA5MDApLCAoMCwgMjcwMCkKLSAgICAgICAgLy8gaW4gb3RoZXIgd29yZHM6IDAgLSAyNjk5LCAyNzAwIC0gMzU5OSwgMzYwMCAtIDM4OTksIDM5MDAgLSAzOTk5LCA0MDAwIC0gNDA5OQotICAgICAgICBhc3NlcnRFcXVhbHMoMywgYnVja2V0cy5zaXplKCkpOwotCi0gICAgICAgIGZvciAoTGlzdDxTdHJpbmc+IGJ1Y2tldCA6IGJ1Y2tldHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBidWNrZXQuc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0KDApLCBidWNrZXQuZ2V0KDEpKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gVGVzdCBiYXNlIDEuCi0gICAgICAgIHBhaXJzID0gTGlzdHMubmV3QXJyYXlMaXN0KAotICAgICAgICAgICAgICAgIFBhaXIuY3JlYXRlKCJhIiwgMjAwTCksCi0gICAgICAgICAgICAgICAgUGFpci5jcmVhdGUoImEiLCAyOTlMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYiIsIDIwMDBMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYiIsIDIwMTRMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYyIsIDM2MTBMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiYyIsIDM2OTBMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiZCIsIDM4OThMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiZCIsIDM4OTlMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiZSIsIDM5MDBMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgiZSIsIDM5NTBMKSwKLSAgICAgICAgICAgICAgICBQYWlyLmNyZWF0ZSgidG9vIG5ldyIsIDQxMjVMKQotICAgICAgICApOwotICAgICAgICBidWNrZXRzID0gZ2V0QnVja2V0cyhwYWlycywgMTAwTCwgMSwgNDA1MEwsIExvbmcuTUFYX1ZBTFVFKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoNSwgYnVja2V0cy5zaXplKCkpOwotCi0gICAgICAgIGZvciAoTGlzdDxTdHJpbmc+IGJ1Y2tldCA6IGJ1Y2tldHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBidWNrZXQuc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWNrZXQuZ2V0KDApLCBidWNrZXQuZ2V0KDEpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFByZXBCdWNrZXQoKQotICAgIHsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGX1NUQU5EQVJEMSk7Ci0gICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLQotICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzEwMF0pOwotCi0gICAgICAgIC8vIGNyZWF0ZSAzIHNzdGFibGVzCi0gICAgICAgIGludCBudW1TU1RhYmxlcyA9IDM7Ci0gICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgbnVtU1NUYWJsZXM7IHIrKykKLSAgICAgICAgewotICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IFV0aWwuZGsoU3RyaW5nLnZhbHVlT2YocikpOwotICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzLm1ldGFkYXRhKCksIHIsIGtleS5nZXRLZXkoKSkKLSAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiY29sdW1uIikKLSAgICAgICAgICAgICAgICAuYWRkKCJ2YWwiLCB2YWx1ZSkuYnVpbGQoKS5hcHBseVVuc2FmZSgpOwotCi0gICAgICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0gICAgICAgIH0KLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotCi0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0cnMgPSBuZXcgQXJyYXlMaXN0PD4oY2ZzLmdldExpdmVTU1RhYmxlcygpKTsKLQotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IG5ld0J1Y2tldCA9IG5ld2VzdEJ1Y2tldChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdHJzLnN1Ykxpc3QoMCwgMikpLCA0LCAzMiwgOSwgMTAsIExvbmcuTUFYX1ZBTFVFLCBuZXcgU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoImluY29taW5nIGJ1Y2tldCBzaG91bGQgbm90IGJlIGFjY2VwdGVkIHdoZW4gaXQgaGFzIGJlbG93IHRoZSBtaW4gdGhyZXNob2xkIFNTVGFibGVzIiwgbmV3QnVja2V0LmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgbmV3QnVja2V0ID0gbmV3ZXN0QnVja2V0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc3N0cnMuc3ViTGlzdCgwLCAyKSksIDQsIDMyLCAxMCwgMTAsIExvbmcuTUFYX1ZBTFVFLCBuZXcgU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMoKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCJub24taW5jb21pbmcgYnVja2V0IHNob3VsZCBiZSBhY2NlcHRlZCB3aGVuIGl0IGhhcyBhdCBsZWFzdCAyIFNTVGFibGVzIiwgbmV3QnVja2V0LmlzRW1wdHkoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbiBzc3RhYmxlIHdpdGggYSBzaW5nbGUgdmFsdWUgc2hvdWxkIGhhdmUgZXF1YWwgbWluL21heCB0aW1lc3RhbXBzIiwgc3N0cnMuZ2V0KDApLmdldE1pblRpbWVzdGFtcCgpLCBzc3Rycy5nZXQoMCkuZ2V0TWF4VGltZXN0YW1wKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImFuIHNzdGFibGUgd2l0aCBhIHNpbmdsZSB2YWx1ZSBzaG91bGQgaGF2ZSBlcXVhbCBtaW4vbWF4IHRpbWVzdGFtcHMiLCBzc3Rycy5nZXQoMSkuZ2V0TWluVGltZXN0YW1wKCksIHNzdHJzLmdldCgxKS5nZXRNYXhUaW1lc3RhbXAoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiYW4gc3N0YWJsZSB3aXRoIGEgc2luZ2xlIHZhbHVlIHNob3VsZCBoYXZlIGVxdWFsIG1pbi9tYXggdGltZXN0YW1wcyIsIHNzdHJzLmdldCgyKS5nZXRNaW5UaW1lc3RhbXAoKSwgc3N0cnMuZ2V0KDIpLmdldE1heFRpbWVzdGFtcCgpKTsKLSAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJPbGRTU1RhYmxlcygpCi0gICAgewotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0ZfU1RBTkRBUkQxKTsKLSAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotCi0gICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMTAwXSk7Ci0KLSAgICAgICAgLy8gY3JlYXRlIDMgc3N0YWJsZXMKLSAgICAgICAgaW50IG51bVNTVGFibGVzID0gMzsKLSAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCBudW1TU1RhYmxlczsgcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gVXRpbC5kayhTdHJpbmcudmFsdWVPZihyKSk7Ci0gICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgciwga2V5LmdldEtleSgpKQotICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjb2x1bW4iKQotICAgICAgICAgICAgICAgIC5hZGQoInZhbCIsIHZhbHVlKS5idWlsZCgpLmFwcGx5VW5zYWZlKCk7Ci0KLSAgICAgICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKLSAgICAgICAgfQotICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0KLSAgICAgICAgSXRlcmFibGU8U1NUYWJsZVJlYWRlcj4gZmlsdGVyZWQ7Ci0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0cnMgPSBuZXcgQXJyYXlMaXN0PD4oY2ZzLmdldExpdmVTU1RhYmxlcygpKTsKLQotICAgICAgICBmaWx0ZXJlZCA9IGZpbHRlck9sZFNTVGFibGVzKHNzdHJzLCAwLCAyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aGVuIG1heFNTVGFibGVBZ2UgaXMgemVybywgbm8gc3N0YWJsZXMgc2hvdWxkIGJlIGZpbHRlcmVkIiwgc3N0cnMuc2l6ZSgpLCBJdGVyYWJsZXMuc2l6ZShmaWx0ZXJlZCkpOwotCi0gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyT2xkU1NUYWJsZXMoc3N0cnMsIDEsIDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9ubHkgdGhlIG5ld2VzdCAyIHNzdGFibGVzIHNob3VsZCByZW1haW4iLCAyLCBJdGVyYWJsZXMuc2l6ZShmaWx0ZXJlZCkpOwotCi0gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyT2xkU1NUYWJsZXMoc3N0cnMsIDEsIDMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9ubHkgdGhlIG5ld2VzdCBzc3RhYmxlIHNob3VsZCByZW1haW4iLCAxLCBJdGVyYWJsZXMuc2l6ZShmaWx0ZXJlZCkpOwotCi0gICAgICAgIGZpbHRlcmVkID0gZmlsdGVyT2xkU1NUYWJsZXMoc3N0cnMsIDEsIDQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm5vIHNzdGFibGVzIHNob3VsZCByZW1haW4gd2hlbiBhbGwgYXJlIHRvbyBvbGQiLCAwLCBJdGVyYWJsZXMuc2l6ZShmaWx0ZXJlZCkpOwotICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOwotICAgIH0KLQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RHJvcEV4cGlyZWRTU1RhYmxlcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSk7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGX1NUQU5EQVJEMSk7Ci0gICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLQotICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzEwMF0pOwotCi0gICAgICAgIC8vIGNyZWF0ZSAyIHNzdGFibGVzCi0gICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBVdGlsLmRrKFN0cmluZy52YWx1ZU9mKCJleHBpcmVkIikpOwotICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIDEsIGtleS5nZXRLZXkoKSkKLSAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjb2x1bW4iKQotICAgICAgICAgICAgLmFkZCgidmFsIiwgdmFsdWUpLmJ1aWxkKCkuYXBwbHlVbnNhZmUoKTsKLQotICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0gICAgICAgIFNTVGFibGVSZWFkZXIgZXhwaXJlZFNTVGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIFRocmVhZC5zbGVlcCgxMCk7Ci0KLSAgICAgICAga2V5ID0gVXRpbC5kayhTdHJpbmcudmFsdWVPZigibm9uZXhwaXJlZCIpKTsKLSAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzLm1ldGFkYXRhKCksIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCBrZXkuZ2V0S2V5KCkpCi0gICAgICAgICAgICAuY2x1c3RlcmluZygiY29sdW1uIikKLSAgICAgICAgICAgIC5hZGQoInZhbCIsIHZhbHVlKS5idWlsZCgpLmFwcGx5VW5zYWZlKCk7Ci0KLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSwgMik7Ci0KLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zID0gbmV3IEhhc2hNYXA8PigpOwotCi0gICAgICAgIG9wdGlvbnMucHV0KERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLkJBU0VfVElNRV9LRVksICIzMCIpOwotICAgICAgICBvcHRpb25zLnB1dChEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5USU1FU1RBTVBfUkVTT0xVVElPTl9LRVksICJNSUxMSVNFQ09ORFMiKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuTUFYX1NTVEFCTEVfQUdFX0tFWSwgRG91YmxlLnRvU3RyaW5nKCgxZCAvICgyNCAqIDYwICogNjApKSkpOwotICAgICAgICBvcHRpb25zLnB1dChEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5T3B0aW9ucy5FWFBJUkVEX1NTVEFCTEVfQ0hFQ0tfRlJFUVVFTkNZX1NFQ09ORFNfS0VZLCAiMCIpOwotICAgICAgICBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5IGR0Y3MgPSBuZXcgRGF0ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneShjZnMsIG9wdGlvbnMpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkKLSAgICAgICAgICAgIGR0Y3MuYWRkU1NUYWJsZShzc3RhYmxlKTsKLSAgICAgICAgZHRjcy5zdGFydHVwKCk7Ci0gICAgICAgIGFzc2VydE51bGwoZHRjcy5nZXROZXh0QmFja2dyb3VuZFRhc2soKGludCkgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC8gMTAwMCkpKTsKLSAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOwotICAgICAgICBBYnN0cmFjdENvbXBhY3Rpb25UYXNrIHQgPSBkdGNzLmdldE5leHRCYWNrZ3JvdW5kVGFzaygoaW50KSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkvMTAwMCkpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgSXRlcmFibGVzLnNpemUodC50cmFuc2FjdGlvbi5vcmlnaW5hbHMoKSkpOwotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSB0LnRyYW5zYWN0aW9uLm9yaWdpbmFscygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3N0YWJsZSwgZXhwaXJlZFNTVGFibGUpOwotICAgICAgICB0LnRyYW5zYWN0aW9uLmFib3J0KCk7Ci0gICAgICAgIGNmcy50cnVuY2F0ZUJsb2NraW5nKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U1RDU0JpZ1dpbmRvdygpCi0gICAgewotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0ZfU1RBTkRBUkQxKTsKLSAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotICAgICAgICBCeXRlQnVmZmVyIGJpZ1ZhbHVlID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzEwMDAwXSk7Ci0gICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMTAwXSk7Ci0gICAgICAgIGludCBudW1TU1RhYmxlcyA9IDQwOwotICAgICAgICAvLyBjcmVhdGUgYmlnIHNzdGFiZWxzIG91dCBvZiBoYWxmOgotICAgICAgICBsb25nIHRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBmb3IgKGludCByID0gMDsgciA8IG51bVNTVGFibGVzIC8gMjsgcisrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IFV0aWwuZGsoU3RyaW5nLnZhbHVlT2YocikpOwotICAgICAgICAgICAgICAgIG5ldyBSb3dVcGRhdGVCdWlsZGVyKGNmcy5tZXRhZGF0YSgpLCB0aW1lc3RhbXAsIGtleS5nZXRLZXkoKSkKLSAgICAgICAgICAgICAgICAgICAgLmNsdXN0ZXJpbmcoImNvbHVtbiIpCi0gICAgICAgICAgICAgICAgICAgIC5hZGQoInZhbCIsIGJpZ1ZhbHVlKS5idWlsZCgpLmFwcGx5VW5zYWZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYW5kIHNtYWxsIG9uZXM6Ci0gICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgbnVtU1NUYWJsZXMgLyAyOyByKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBVdGlsLmRrKFN0cmluZy52YWx1ZU9mKHIpKTsKLSAgICAgICAgICAgIG5ldyBSb3dVcGRhdGVCdWlsZGVyKGNmcy5tZXRhZGF0YSgpLCB0aW1lc3RhbXAsIGtleS5nZXRLZXkoKSkKLSAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiY29sdW1uIikKLSAgICAgICAgICAgICAgICAuYWRkKCJ2YWwiLCB2YWx1ZSkuYnVpbGQoKS5hcHBseVVuc2FmZSgpOwotICAgICAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgICAgICB9Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgb3B0aW9ucy5wdXQoU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneU9wdGlvbnMuTUlOX1NTVEFCTEVfU0laRV9LRVksICIxIik7Ci0gICAgICAgIERhdGVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3kgZHRjcyA9IG5ldyBEYXRlVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5KGNmcywgb3B0aW9ucyk7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogY2ZzLmdldFNTVGFibGVzKFNTVGFibGVTZXQuQ0FOT05JQ0FMKSkKLSAgICAgICAgICAgIGR0Y3MuYWRkU1NUYWJsZShzc3RhYmxlKTsKLSAgICAgICAgQWJzdHJhY3RDb21wYWN0aW9uVGFzayB0YXNrID0gZHRjcy5nZXROZXh0QmFja2dyb3VuZFRhc2soMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyMCwgdGFzay50cmFuc2FjdGlvbi5vcmlnaW5hbHMoKS5zaXplKCkpOwotICAgICAgICB0YXNrLnRyYW5zYWN0aW9uLmFib3J0KCk7Ci0gICAgICAgIGNmcy50cnVuY2F0ZUJsb2NraW5nKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL0xldmVsZWRDb21wYWN0aW9uU3RyYXRlZ3lUZXN0LmphdmEKaW5kZXggMDdhNDVlNy4uNDlmMjU3YiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTGV2ZWxlZENvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9MZXZlbGVkQ29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCkBAIC00NSw2ICs0NSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlVwZGF0ZUJ1aWxkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKQEAgLTU2LDIzICs1NywyMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlQWRkZWROb3RpZmljYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlUmVwYWlyU3RhdHVzQ2hhbmdlZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5yZXBhaXIuVmFsaWRhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEucmVwYWlyLnN0YXRlLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuTW9ja1NjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuUHJldmlld0tpbmQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEucmVwYWlyLlJlcGFpckpvYkRlc2M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEucmVwYWlyLlZhbGlkYXRpb25NYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcGFpci5WYWxpZGF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEucmVwYWlyLnN0YXRlLlZhbGlkYXRpb25TdGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcGFjdGlvblBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLk1vY2tTY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5QcmV2aWV3S2luZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5QYWlyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hd2FpdGlsaXR5LkF3YWl0aWxpdHk7CiAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbjsKLWltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CkBAIC05Miw3ICs5Myw3IEBACiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCiAgICAgewogICAgICAgICAvLyBEaXNhYmxlIHRvbWJzdG9uZSBoaXN0b2dyYW0gcm91bmRpbmcgZm9yIHRlc3RzCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN0cmVhbWluZ2hpc3RvZ3JhbS5yb3VuZHNlY29uZHMiLCAiMSIpOworICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1RSRUFNSU5HX0hJU1RPR1JBTV9ST1VORF9TRUNPTkRTLnNldEludCgxKTsKIAogICAgICAgICBTY2hlbWFMb2FkZXIucHJlcGFyZVNlcnZlcigpOwogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9OZXZlclB1cmdlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vTmV2ZXJQdXJnZVRlc3QuamF2YQppbmRleCA0MjUzNzMxLi4zZjVlNGI2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9OZXZlclB1cmdlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL05ldmVyUHVyZ2VUZXN0LmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTkVWRVJfUFVSR0VfVE9NQlNUT05FUzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIHB1YmxpYyBjbGFzcyBOZXZlclB1cmdlVGVzdCBleHRlbmRzIENRTFRlc3RlcgpAQCAtNDEsNyArNDIsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkgLy8gbWV0aG9kIG5hbWUgbXVzdCBtYXRjaCB0aGUgQEJlZm9yZUNsYXNzIGFubm90YXRlZCBtZXRob2QgaW4gQ1FMVGVzdGVyCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5uZXZlcl9wdXJnZV90b21ic3RvbmVzIiwgInRydWUiKTsKKyAgICAgICAgTkVWRVJfUFVSR0VfVE9NQlNUT05FUy5zZXRCb29sZWFuKHRydWUpOwogICAgICAgICBDUUxUZXN0ZXIuc2V0VXBDbGFzcygpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vUGFydGlhbENvbXBhY3Rpb25zVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vUGFydGlhbENvbXBhY3Rpb25zVGVzdC5qYXZhCmluZGV4IGI5MjJjYTgwLi41ZTBlZDY2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9QYXJ0aWFsQ29tcGFjdGlvbnNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vUGFydGlhbENvbXBhY3Rpb25zVGVzdC5qYXZhCkBAIC0xOCw2ICsxOCw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb247CiAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtMjYsMTIgKzI3LDE1IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvc2VhYmxlSXRlcmF0b3I7CkBAIC0yMDEsNyArMjA1LDI5IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgd3JhcHBlZFtpXSA9IG5ldyBMaW1pdGFibGVEYXRhRGlyZWN0b3J5KG9yaWdpbmFsW2ldKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRGlyZWN0b3JpZXMoY2ZzLm1ldGFkYXRhKCksIHdyYXBwZWQpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RvcmllcyhjZnMubWV0YWRhdGEoKSwgd3JhcHBlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNEaXNrU3BhY2VGb3JDb21wYWN0aW9uc0FuZFN0cmVhbXMoTWFwPEZpbGUsIExvbmc+IGV4cGVjdGVkTmV3V3JpdGVTaXplcywgTWFwPEZpbGUsIExvbmc+IHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc0Rpc2tTcGFjZUZvckNvbXBhY3Rpb25zQW5kU3RyZWFtcyhleHBlY3RlZE5ld1dyaXRlU2l6ZXMsIHRvdGFsQ29tcGFjdGlvbldyaXRlUmVtYWluaW5nLCBmaWxlIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoRGF0YURpcmVjdG9yeSBsb2NhdGlvbiA6IGdldFdyaXRlYWJsZUxvY2F0aW9ucygpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLnRvUGF0aCgpLnN0YXJ0c1dpdGgobG9jYXRpb24ubG9jYXRpb24udG9QYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbWl0YWJsZURhdGFEaXJlY3RvcnkgZGlyZWN0b3J5ID0gKExpbWl0YWJsZURhdGFEaXJlY3RvcnkpIGxvY2F0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyZWN0b3J5LmF2YWlsYWJsZVNwYWNlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdG9yaWVzVGVzdC5GYWtlRmlsZVN0b3JlIHN0b3JlID0gbmV3IERpcmVjdG9yaWVzVGVzdC5GYWtlRmlsZVN0b3JlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnNlIHRoZSBjb21wdXRhdGlvbiBpbiBEaXJlY3Rvcmllcy5nZXRBdmFpbGFibGVTcGFjZUZvckNvbXBhY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS51c2FibGVTcGFjZSA9IE1hdGgucm91bmQoZGlyZWN0b3J5LmF2YWlsYWJsZVNwYWNlIC8gRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1heFNwYWNlRm9yQ29tcGFjdGlvbnNQZXJEcml2ZSgpKSArIERhdGFiYXNlRGVzY3JpcHRvci5nZXRNaW5GcmVlU3BhY2VQZXJEcml2ZUluQnl0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEaXJlY3Rvcmllcy5nZXRGaWxlU3RvcmUoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9TaW5nbGVTU1RhYmxlTENTVGFza1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1NpbmdsZVNTVGFibGVMQ1NUYXNrVGVzdC5qYXZhCmluZGV4IGJiMWQxZjAuLjllMDNlYzMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1NpbmdsZVNTVGFibGVMQ1NUYXNrVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1NpbmdsZVNTVGFibGVMQ1NUYXNrVGVzdC5qYXZhCkBAIC0yOSw5ICsyOSw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTEyOSw4ICsxMjgsNyBAQAogICAgICAgICBVdGlsLmZsdXNoKGNmcyk7CiAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKIAotICAgICAgICBTdHJpbmcgZmlsZW5hbWVUb0NvcnJ1cHQgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKTsKLSAgICAgICAgdHJ5KEZpbGVDaGFubmVsIGZjID0gbmV3IEZpbGUoZmlsZW5hbWVUb0NvcnJ1cHQpLm5ld1JlYWRXcml0ZUNoYW5uZWwoKSkKKyAgICAgICAgdHJ5KEZpbGVDaGFubmVsIGZjID0gc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUykubmV3UmVhZFdyaXRlQ2hhbm5lbCgpKQogICAgICAgICB7CiAgICAgICAgICAgICBmYy5wb3NpdGlvbigwKTsKICAgICAgICAgICAgIGZjLndyaXRlKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKFN0cmluZ1V0aWxzLnJlcGVhdCgneicsIDIpKSk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9TaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vU2l6ZVRpZXJlZENvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YQppbmRleCBmYzk4YTljLi5kYWMzMzFlIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9TaXplVGllcmVkQ29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1NpemVUaWVyZWRDb21wYWN0aW9uU3RyYXRlZ3lUZXN0LmphdmEKQEAgLTI5LDYgKzI5LDcgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKQEAgLTU1LDcgKzU2LDcgQEAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7CiAgICAgICAgIC8vIERpc2FibGUgdG9tYnN0b25lIGhpc3RvZ3JhbSByb3VuZGluZyBmb3IgdGVzdHMKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuc3RyZWFtaW5naGlzdG9ncmFtLnJvdW5kc2Vjb25kcyIsICIxIik7CisgICAgICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TVFJFQU1JTkdfSElTVE9HUkFNX1JPVU5EX1NFQ09ORFMuc2V0SW50KDEpOwogCiAgICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7CiAKQEAgLTkzLDExICs5NCwxMSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdldEJ1Y2tldHMoKQogICAgIHsKLSAgICAgICAgTGlzdDxQYWlyPFN0cmluZywgTG9uZz4+IHBhaXJzID0gbmV3IEFycmF5TGlzdDxQYWlyPFN0cmluZywgTG9uZz4+KCk7CisgICAgICAgIExpc3Q8UGFpcjxTdHJpbmcsIExvbmc+PiBwYWlycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBTdHJpbmdbXSBzdHJpbmdzID0geyAiYSIsICJiYmJiIiwgImNjY2NjY2NjIiwgImNjY2NjY2NjIiwgImJiYmIiLCAiYSIgfTsKICAgICAgICAgZm9yIChTdHJpbmcgc3QgOiBzdHJpbmdzKQogICAgICAgICB7Ci0gICAgICAgICAgICBQYWlyPFN0cmluZywgTG9uZz4gcGFpciA9IFBhaXIuY3JlYXRlKHN0LCBuZXcgTG9uZyhzdC5sZW5ndGgoKSkpOworICAgICAgICAgICAgUGFpcjxTdHJpbmcsIExvbmc+IHBhaXIgPSBQYWlyLmNyZWF0ZShzdCwgKGxvbmcpIHN0Lmxlbmd0aCgpKTsKICAgICAgICAgICAgIHBhaXJzLmFkZChwYWlyKTsKICAgICAgICAgfQogCkBAIC0xMTcsNyArMTE4LDcgQEAKICAgICAgICAgU3RyaW5nW10gc3RyaW5nczIgPSB7ICJhYWEiLCAiYmJiYmJiYmIiLCAiYWFhIiwgImJiYmJiYmJiIiwgImJiYmJiYmJiIiwgImFhYSIgfTsKICAgICAgICAgZm9yIChTdHJpbmcgc3QgOiBzdHJpbmdzMikKICAgICAgICAgewotICAgICAgICAgICAgUGFpcjxTdHJpbmcsIExvbmc+IHBhaXIgPSBQYWlyLmNyZWF0ZShzdCwgbmV3IExvbmcoc3QubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBMb25nPiBwYWlyID0gUGFpci5jcmVhdGUoc3QsIChsb25nKSBzdC5sZW5ndGgoKSk7CiAgICAgICAgICAgICBwYWlycy5hZGQocGFpcik7CiAgICAgICAgIH0KIApAQCAtMTM4LDcgKzEzOSw3IEBACiAgICAgICAgIFN0cmluZ1tdIHN0cmluZ3MzID0geyAiYWFhIiwgImJiYmJiYmJiIiwgImFhYSIsICJiYmJiYmJiYiIsICJiYmJiYmJiYiIsICJhYWEiIH07CiAgICAgICAgIGZvciAoU3RyaW5nIHN0IDogc3RyaW5nczMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBMb25nPiBwYWlyID0gUGFpci5jcmVhdGUoc3QsIG5ldyBMb25nKHN0Lmxlbmd0aCgpKSk7CisgICAgICAgICAgICBQYWlyPFN0cmluZywgTG9uZz4gcGFpciA9IFBhaXIuY3JlYXRlKHN0LCAobG9uZykgc3QubGVuZ3RoKCkpOwogICAgICAgICAgICAgcGFpcnMuYWRkKHBhaXIpOwogICAgICAgICB9CiAKQEAgLTE0Niw4ICsxNDcsOSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYnVja2V0cy5zaXplKCkpOwogICAgIH0KIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbm5lY2Vzc2FyeUxvY2FsVmFyaWFibGUiKQogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFByZXBCdWNrZXQoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgcHVibGljIHZvaWQgdGVzdFByZXBCdWNrZXQoKQogICAgIHsKICAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKICAgICAgICAgU3RyaW5nIGNmbmFtZSA9ICJTdGFuZGFyZDEiOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVFRMRXhwaXJ5VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVFRMRXhwaXJ5VGVzdC5qYXZhCmluZGV4IDBlM2ZiNzYuLjdjN2NkYjYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1RUTEV4cGlyeVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9UVExFeHBpcnlUZXN0LmphdmEKQEAgLTI5LDE4ICsyOSwyMyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYVRlc3RVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EYXRhUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5TU1RhYmxlU2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQXNjaWlUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTWFwVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlUmVhZHNMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hVGVzdFV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuU1NUYWJsZUV4cGlyZWRCbG9ja2VyczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIApAQCAtNTYsNyArNjEsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgLy8gRGlzYWJsZSB0b21ic3RvbmUgaGlzdG9ncmFtIHJvdW5kaW5nIGZvciB0ZXN0cwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5zdHJlYW1pbmdoaXN0b2dyYW0ucm91bmRzZWNvbmRzIiwgIjEiKTsKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNUUkVBTUlOR19ISVNUT0dSQU1fUk9VTkRfU0VDT05EUy5zZXRJbnQoMSk7CiAKICAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9jb21wYWN0aW9uL1RpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3lUZXN0LmphdmEKaW5kZXggZGU2MDI4Ni4uNDFhNGM0NyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi9UaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5VGVzdC5qYXZhCkBAIC0yOCwxOCArMjgsMTIgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkhhc2hNdWx0aW1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKLQogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwpAQCAtNTAsMTAgKzQ0LDE3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLk1vY2tTY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFMTE9XX1VOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5UaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LmdldFdpbmRvd0JvdW5kc0luTWlsbGlzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kubmV3ZXN0QnVja2V0OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3kudmFsaWRhdGVPcHRpb25zOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy5ub3dJblNlY29uZHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIHB1YmxpYyBjbGFzcyBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5VGVzdCBleHRlbmRzIFNjaGVtYUxvYWRlcgogewpAQCAtNjUsOCArNjYsOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgLy8gRGlzYWJsZSB0b21ic3RvbmUgaGlzdG9ncmFtIHJvdW5kaW5nIGZvciB0ZXN0cwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5zdHJlYW1pbmdoaXN0b2dyYW0ucm91bmRzZWNvbmRzIiwgIjEiKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFRpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3lPcHRpb25zLlVOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTl9QUk9QRVJUWSwgInRydWUiKTsKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlNUUkVBTUlOR19ISVNUT0dSQU1fUk9VTkRfU0VDT05EUy5zZXRJbnQoMSk7CisgICAgICAgIEFMTE9XX1VOU0FGRV9BR0dSRVNTSVZFX1NTVEFCTEVfRVhQSVJBVElPTi5zZXRCb29sZWFuKHRydWUpOworCiAKICAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2NvbXBhY3Rpb24vd3JpdGVycy9Db21wYWN0aW9uQXdhcmVXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL0NvbXBhY3Rpb25Bd2FyZVdyaXRlclRlc3QuamF2YQppbmRleCBhNjQxYmUxLi5jNGY3MmRlIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL0NvbXBhY3Rpb25Bd2FyZVdyaXRlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvY29tcGFjdGlvbi93cml0ZXJzL0NvbXBhY3Rpb25Bd2FyZVdyaXRlclRlc3QuamF2YQpAQCAtMTgsMTUgKzE4LDI2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24ud3JpdGVyczsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5Mb25nczsKLWltcG9ydCBvcmcuanVuaXQuKjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5BYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25Db250cm9sbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkl0ZXJhdG9yOwpAQCAtNjcsNiArNzgsMTMgQEAKICAgICAgICAgcmV0dXJuIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKFRBQkxFKTsKICAgICB9CiAKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBhZnRlclRlc3QoKSB7CisgICAgICAgIEtleXNwYWNlIGtzID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtzLmdldENvbHVtbkZhbWlseVN0b3JlKFRBQkxFKTsKKyAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKKyAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Q29tcGFjdGlvbldyaXRlcigpIHRocm93cyBUaHJvd2FibGUKICAgICB7CkBAIC0yNjAsNCArMjc4LDQgQEAKICAgICAgICAgICAgIGFzc2VydFJvd3MoZXhlY3V0ZShTdHJpbmcuZm9ybWF0KCJTRUxFQ1QgaywgdCBGUk9NICVzLiVzIFdIRVJFIGsgPSA6aSIsIEtFWVNQQUNFLCBUQUJMRSksIGkpLCBleHBlY3RlZCk7CiAgICAgICAgIH0KICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9TbGljZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9maWx0ZXIvU2xpY2VUZXN0LmphdmEKaW5kZXggYzgzODgwYy4uMTgyMzNmMCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2ZpbHRlci9TbGljZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZmlsdGVyL1NsaWNlVGVzdC5qYXZhCkBAIC0xOCwxOSArMTgsMzAgQEAKICAqICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlcjsKIAotCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuKjsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkJ1ZmZlckNsdXN0ZXJpbmdCb3VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdCb3VuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4LktpbmQuKjsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4LktpbmQuRVhDTF9FTkRfQk9VTkQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdQcmVmaXguS2luZC5FWENMX1NUQVJUX0JPVU5EOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9FTkRfQk9VTkQ7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX1NUQVJUX0JPVU5EOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBwdWJsaWMgY2xhc3MgU2xpY2VUZXN0CiB7CkBAIC00OCwyMjEgKzU5LDIyMSBAQAogCiAgICAgICAgIC8vIGZpbHRlciBmYWxscyBlbnRpcmVseSBiZWZvcmUgc3N0YWJsZQogICAgICAgICBTbGljZSBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAwLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAwLCAwKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDIsIDAsIDApLCBjb2x1bW5OYW1lcygzLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAyLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAzLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggZW1wdHkgc3RhcnQKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSwgMCwgMCkpOwotICAgICAgICBhc3NlcnRGYWxzZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygyLCAwLCAwKSwgY29sdW1uTmFtZXMoMywgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzRG9Ob3RJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMiwgMCwgMCksIG1ha2VCb3VuZChlaywgMywgMCwgMCkpKTsKIAogICAgICAgICAvLyBzYW1lIGNhc2UsIGJ1dCB3aXRoIG1pc3NpbmcgY29tcG9uZW50cyBmb3Igc3RhcnQKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMCksIG1ha2VCb3VuZChlaywgMSwgMCwgMCkpOwotICAgICAgICBhc3NlcnRGYWxzZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygyLCAwLCAwKSwgY29sdW1uTmFtZXMoMywgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzRG9Ob3RJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMiwgMCwgMCksIG1ha2VCb3VuZChlaywgMywgMCwgMCkpKTsKIAogICAgICAgICAvLyBzYW1lIGNhc2UsIGJ1dCB3aXRoIG1pc3NpbmcgY29tcG9uZW50cyBmb3Igc3RhcnQgYW5kIGVuZAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAwKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDIsIDAsIDApLCBjb2x1bW5OYW1lcygzLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAyLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAzLCAwLCAwKSkpOwogCiAKICAgICAgICAgLy8gZW5kIG9mIHNsaWNlIG1hdGNoZXMgc3RhcnQgb2Ygc3N0YWJsZSBmb3IgdGhlIGZpcnN0IGNvbXBvbmVudCwgYnV0IG5vdCB0aGUgc2Vjb25kIGNvbXBvbmVudAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAwLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAwLCAwKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDEsIDApLCBjb2x1bW5OYW1lcygzLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAxLCAwKSwgbWFrZUJvdW5kKGVrLCAzLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggbWlzc2luZyBjb21wb25lbnRzIGZvciBzdGFydAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAwLCAwKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDEsIDApLCBjb2x1bW5OYW1lcygzLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAxLCAwKSwgbWFrZUJvdW5kKGVrLCAzLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggbWlzc2luZyBjb21wb25lbnRzIGZvciBzdGFydCBhbmQgZW5kCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDApLCBtYWtlQm91bmQoZWssIDEsIDApKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMSwgMCksIGNvbHVtbk5hbWVzKDMsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEsIDApLCBtYWtlQm91bmQoZWssIDMsIDAsIDApKSk7CiAKICAgICAgICAgLy8gZmlyc3QgdHdvIGNvbXBvbmVudHMgbWF0Y2gsIGJ1dCBub3QgdGhlIGxhc3QKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMCwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMCkpOwotICAgICAgICBhc3NlcnRGYWxzZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAxLCAxKSwgY29sdW1uTmFtZXMoMywgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzRG9Ob3RJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMSwgMSksIG1ha2VCb3VuZChlaywgMywgMSwgMSkpKTsKIAogICAgICAgICAvLyBhbGwgdGhyZWUgY29tcG9uZW50cyBpbiBzbGljZSBlbmQgbWF0Y2ggdGhlIHN0YXJ0IG9mIHRoZSBzc3RhYmxlCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDAsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAxLCAxKSwgY29sdW1uTmFtZXMoMywgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEsIDEpLCBtYWtlQm91bmQoZWssIDMsIDEsIDEpKSk7CiAKIAogICAgICAgICAvLyBmaWx0ZXIgZmFsbHMgZW50aXJlbHkgYWZ0ZXIgc3N0YWJsZQogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCA0LCAwLCAwKSwgbWFrZUJvdW5kKGVrLCA0LCAwLCAwKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDIsIDAsIDApLCBjb2x1bW5OYW1lcygzLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAyLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAzLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggZW1wdHkgZW5kCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDQsIDAsIDApLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMiwgMCwgMCksIGNvbHVtbk5hbWVzKDMsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDIsIDAsIDApLCBtYWtlQm91bmQoZWssIDMsIDAsIDApKSk7CiAKICAgICAgICAgLy8gc2FtZSBjYXNlLCBidXQgd2l0aCBtaXNzaW5nIGNvbXBvbmVudHMgZm9yIGVuZAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCA0LCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAxKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDIsIDAsIDApLCBjb2x1bW5OYW1lcygzLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAyLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAzLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggbWlzc2luZyBjb21wb25lbnRzIGZvciBzdGFydCBhbmQgZW5kCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDQsIDApLCBtYWtlQm91bmQoZWssIDEpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMiwgMCwgMCksIGNvbHVtbk5hbWVzKDMsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDIsIDAsIDApLCBtYWtlQm91bmQoZWssIDMsIDAsIDApKSk7CiAKIAogICAgICAgICAvLyBzdGFydCBvZiBzbGljZSBtYXRjaGVzIGVuZCBvZiBzc3RhYmxlIGZvciB0aGUgZmlyc3QgY29tcG9uZW50LCBidXQgbm90IHRoZSBzZWNvbmQgY29tcG9uZW50CiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEsIDEpLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMCwgMCwgMCksIGNvbHVtbk5hbWVzKDEsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDAsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDAsIDApKSk7CiAKICAgICAgICAgLy8gc3RhcnQgb2Ygc2xpY2UgbWF0Y2hlcyBlbmQgb2Ygc3N0YWJsZSBmb3IgdGhlIGZpcnN0IHR3byBjb21wb25lbnRzLCBidXQgbm90IHRoZSBsYXN0IGNvbXBvbmVudAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAxLCAxKSwgbWFrZUJvdW5kKGVrLCAyLCAwLCAwKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDAsIDAsIDApLCBjb2x1bW5OYW1lcygxLCAxLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAwLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAxLCAwKSkpOwogCiAgICAgICAgIC8vIGFsbCB0aHJlZSBjb21wb25lbnRzIGluIHRoZSBzbGljZSBzdGFydCBtYXRjaCB0aGUgZW5kIG9mIHRoZSBzc3RhYmxlCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEsIDEpLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygwLCAwLCAwKSwgY29sdW1uTmFtZXMoMSwgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDAsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKSk7CiAKIAogICAgICAgICAvLyBzbGljZSBjb3ZlcnMgZW50aXJlIHNzdGFibGUgKHdpdGggbm8gbWF0Y2hpbmcgZWRnZXMpCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDAsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMSwgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKSk7CiAKICAgICAgICAgLy8gc2FtZSBjYXNlLCBidXQgd2l0aCBlbXB0eSBlbmRzCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMSwgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKSk7CiAKICAgICAgICAgLy8gc2FtZSBjYXNlLCBidXQgd2l0aCBtaXNzaW5nIGNvbXBvbmVudHMKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMCksIG1ha2VCb3VuZChlaywgMiwgMCkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygxLCAxLCAxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpKTsKIAogICAgICAgICAvLyBzbGljZSBjb3ZlcnMgZW50aXJlIHNzdGFibGUgKHdpdGggbWF0Y2hpbmcgc3RhcnQpCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMSwgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKSk7CiAKICAgICAgICAgLy8gc2xpY2UgY292ZXJzIGVudGlyZSBzc3RhYmxlICh3aXRoIG1hdGNoaW5nIGVuZCkKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMCwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygxLCAxLCAxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpKTsKIAogICAgICAgICAvLyBzbGljZSBjb3ZlcnMgZW50aXJlIHNzdGFibGUgKHdpdGggbWF0Y2hpbmcgc3RhcnQgYW5kIGVuZCkKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygxLCAxLCAxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpKTsKIAogCiAgICAgICAgIC8vIHNsaWNlIGZhbGxzIGVudGlyZWx5IHdpdGhpbiBzc3RhYmxlICh3aXRoIG1hdGNoaW5nIHN0YXJ0KQogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAxLCAwKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDEsIDEsIDEpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAxLCAxKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggYSBtaXNzaW5nIGVuZCBjb21wb25lbnQKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygxLCAxLCAxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpKTsKIAogICAgICAgICAvLyBzbGljZSBmYWxscyBlbnRpcmVseSB3aXRoaW4gc3N0YWJsZSAod2l0aCBtYXRjaGluZyBlbmQpCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMSwgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKSk7CiAKICAgICAgICAgLy8gc2FtZSBjYXNlLCBidXQgd2l0aCBhIG1pc3Npbmcgc3RhcnQgY29tcG9uZW50CiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEpLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMSwgMSwgMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKSk7CiAKIAogICAgICAgICAvLyBzbGljZSBmYWxscyBlbnRpcmVseSB3aXRoaW4gc3N0YWJsZQogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAxLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAxLCAxKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDIsIDIpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAyLCAyKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggYSBtaXNzaW5nIHN0YXJ0IGNvbXBvbmVudAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAxKSwgbWFrZUJvdW5kKGVrLCAxLCAxLCAxKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDIsIDIpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAyLCAyKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggYSBtaXNzaW5nIHN0YXJ0IGFuZCBlbmQgY29tcG9uZW50cwogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxKSwgbWFrZUJvdW5kKGVrLCAxLCAyKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDIsIDIpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAyLCAyKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggYW4gZXF1YWwgZmlyc3QgY29tcG9uZW50IGFuZCBtaXNzaW5nIHN0YXJ0IGFuZCBlbmQgY29tcG9uZW50cwogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxKSwgbWFrZUJvdW5kKGVrLCAxKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDIsIDIpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAyLCAyKSkpOwogCiAgICAgICAgIC8vIHNsaWNlIGZhbGxzIGVudGlyZWx5IHdpdGhpbiBzc3RhYmxlIChzbGljZSBzdGFydCBhbmQgZW5kIGFyZSB0aGUgc2FtZSkKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMSwgMSksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygyLCAyLCAyKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMiwgMiwgMikpKTsKIAogCiAgICAgICAgIC8vIHNsaWNlIHN0YXJ0cyB3aXRoaW4gc3N0YWJsZSwgZW1wdHkgZW5kCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEsIDEpLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMiwgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKSk7CiAKICAgICAgICAgLy8gc2FtZSBjYXNlLCBidXQgd2l0aCBtaXNzaW5nIGVuZCBjb21wb25lbnRzCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDEsIDEpLCBtYWtlQm91bmQoZWssIDMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMiwgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKSk7CiAKICAgICAgICAgLy8gc2xpY2Ugc3RhcnRzIHdpdGhpbiBzc3RhYmxlIChtYXRjaGluZyBzc3RhYmxlIHN0YXJ0KSwgZW1wdHkgZW5kCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMiwgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKSk7CiAKICAgICAgICAgLy8gc2FtZSBjYXNlLCBidXQgd2l0aCBtaXNzaW5nIGVuZCBjb21wb25lbnRzCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDMpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMiwgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKSk7CiAKICAgICAgICAgLy8gc2xpY2Ugc3RhcnRzIHdpdGhpbiBzc3RhYmxlIChtYXRjaGluZyBzc3RhYmxlIGVuZCksIGVtcHR5IGVuZAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAyLCAwLCAwKSwgbWFrZUJvdW5kKGVrKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIHNhbWUgY2FzZSwgYnV0IHdpdGggbWlzc2luZyBlbmQgY29tcG9uZW50cwogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAyLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAzKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAwLCAwKSkpOwogCiAKICAgICAgICAgLy8gc2xpY2UgZW5kcyB3aXRoaW4gc3N0YWJsZSwgZW1wdHkgZW5kCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWssIDEsIDEsIDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAwLCAwKSwgY29sdW1uTmFtZXMoMiwgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDAsIDApKSk7CiAKICAgICAgICAgLy8gc2FtZSBjYXNlLCBidXQgd2l0aCBtaXNzaW5nIHN0YXJ0IGNvbXBvbmVudHMKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMCksIG1ha2VCb3VuZChlaywgMSwgMSwgMSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygyLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMiwgMCwgMCkpKTsKIAogICAgICAgICAvLyBzbGljZSBlbmRzIHdpdGhpbiBzc3RhYmxlIChtYXRjaGluZyBzc3RhYmxlIHN0YXJ0KSwgZW1wdHkgc3RhcnQKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSwgMCwgMCkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygyLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMiwgMCwgMCkpKTsKIAogICAgICAgICAvLyBzYW1lIGNhc2UsIGJ1dCB3aXRoIG1pc3Npbmcgc3RhcnQgY29tcG9uZW50cwogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAwKSwgbWFrZUJvdW5kKGVrLCAxLCAwLCAwKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIHNsaWNlIGVuZHMgd2l0aGluIHNzdGFibGUgKG1hdGNoaW5nIHNzdGFibGUgZW5kKSwgZW1wdHkgc3RhcnQKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMiwgMCwgMCkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKDEsIDAsIDApLCBjb2x1bW5OYW1lcygyLCAwLCAwKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMiwgMCwgMCkpKTsKIAogICAgICAgICAvLyBzYW1lIGNhc2UsIGJ1dCB3aXRoIG1pc3Npbmcgc3RhcnQgY29tcG9uZW50cwogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAwLCAwKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAwLCAwKSwgbWFrZUJvdW5kKGVrLCAyLCAwLCAwKSkpOwogCiAgICAgICAgIC8vIGVtcHR5IG1pbi9tYXggY29sdW1uIG5hbWVzCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEpLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWssIDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEpLCBtYWtlQm91bmQoZWssIDEpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSkpKTsKIAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrLCAxKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoKSwgY29sdW1uTmFtZXMoMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWssIDEpKSk7CiAKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKCksIGNvbHVtbk5hbWVzKDIpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrLCAyKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWssIDIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSkpKTsKIAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAyKSwgbWFrZUJvdW5kKGVrLCAzKSk7Ci0gICAgICAgIGFzc2VydEZhbHNlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKCksIGNvbHVtbk5hbWVzKDEpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWssIDEpKSk7CiAKICAgICAgICAgLy8gYmFzaWMgY2hlY2sgb24gcmV2ZXJzZWQgc2xpY2VzCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDAsIDAsIDApKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMiwgMCwgMCksIGNvbHVtbk5hbWVzKDMsIDAsIDApKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDIsIDAsIDApLCBtYWtlQm91bmQoZWssIDMsIDAsIDApKSk7CiAKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMCwgMCksIG1ha2VCb3VuZChlaywgMCwgMCwgMCkpOwotICAgICAgICBhc3NlcnRGYWxzZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxLCAxLCAwKSwgY29sdW1uTmFtZXMoMywgMCwgMCkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzRG9Ob3RJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMSwgMSwgMCksIG1ha2VCb3VuZChlaywgMywgMCwgMCkpKTsKIAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxLCAxLCAxKSwgbWFrZUJvdW5kKGVrLCAxLCAxLCAwKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSwgMCwgMCksIGNvbHVtbk5hbWVzKDIsIDIsIDIpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDAsIDApLCBtYWtlQm91bmQoZWssIDIsIDIsIDIpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI3OSwzMiArMjkwLDMyIEBACiAKICAgICAgICAgLy8gc2xpY2UgZG9lcyBpbnRlcnNlY3QKICAgICAgICAgU2xpY2Ugc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaykpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKCksIGNvbHVtbk5hbWVzKDEpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrLCAxKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygxKSwgY29sdW1uTmFtZXMoMSwgMikpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEpLCBtYWtlQm91bmQoZWssIDEsIDIpKSk7CiAKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSkpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKCksIGNvbHVtbk5hbWVzKDEpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrLCAxKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEpLCBtYWtlQm91bmQoZWspKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSkpKTsKIAogICAgICAgICBzbGljZSA9IFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrLCAxKSwgbWFrZUJvdW5kKGVrLCAxKSk7Ci0gICAgICAgIGFzc2VydFRydWUoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoKSwgY29sdW1uTmFtZXMoMSkpKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2spLCBtYWtlQm91bmQoZWssIDEpKSk7CiAKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMCksIG1ha2VCb3VuZChlaywgMSwgMiwgMykpOwotICAgICAgICBhc3NlcnRUcnVlKHNsaWNlLmludGVyc2VjdHMoY2MsIGNvbHVtbk5hbWVzKCksIGNvbHVtbk5hbWVzKDEpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrLCAxKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEsIDIsIDMpLCBtYWtlQm91bmQoZWssIDIpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNJbnRlcnNlY3QoY2MsIHNsaWNlLCBTbGljZS5tYWtlKG1ha2VCb3VuZChzayksIG1ha2VCb3VuZChlaywgMSkpKTsKIAogICAgICAgICAvLyBzbGljZSBkb2VzIG5vdCBpbnRlcnNlY3QKICAgICAgICAgc2xpY2UgPSBTbGljZS5tYWtlKG1ha2VCb3VuZChzaywgMiksIG1ha2VCb3VuZChlaywgMywgNCwgNSkpOwotICAgICAgICBhc3NlcnRGYWxzZShzbGljZS5pbnRlcnNlY3RzKGNjLCBjb2x1bW5OYW1lcygpLCBjb2x1bW5OYW1lcygxKSkpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgc2xpY2UsIFNsaWNlLm1ha2UobWFrZUJvdW5kKHNrKSwgbWFrZUJvdW5kKGVrLCAxKSkpOwogCiAgICAgICAgIHNsaWNlID0gU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDApLCBtYWtlQm91bmQoZWssIDAsIDEsIDIpKTsKLSAgICAgICAgYXNzZXJ0RmFsc2Uoc2xpY2UuaW50ZXJzZWN0cyhjYywgY29sdW1uTmFtZXMoMSksIGNvbHVtbk5hbWVzKDEsIDIpKSk7CisgICAgICAgIGFzc2VydFNsaWNlc0RvTm90SW50ZXJzZWN0KGNjLCBzbGljZSwgU2xpY2UubWFrZShtYWtlQm91bmQoc2ssIDEpLCBtYWtlQm91bmQoZWssIDEsIDIpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTM1MywxNCArMzY0LDYgQEAKICAgICAgICAgcmV0dXJuIEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5jcmVhdGUoa2luZCwgdmFsdWVzKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEJ5dGVCdWZmZXI+IGNvbHVtbk5hbWVzKEludGVnZXIgLi4uIGNvbXBvbmVudHMpCi0gICAgewotICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IG5hbWVzID0gbmV3IEFycmF5TGlzdDw+KGNvbXBvbmVudHMubGVuZ3RoKTsKLSAgICAgICAgZm9yIChpbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKLSAgICAgICAgICAgIG5hbWVzLmFkZChCeXRlQnVmZmVyVXRpbC5ieXRlcyhjb21wb25lbnQpKTsKLSAgICAgICAgcmV0dXJuIG5hbWVzOwotICAgIH0KLQogICAgIHByaXZhdGUgc3RhdGljIFNsaWNlIHMoaW50IHN0YXJ0LCBpbnQgZmluaXNoKQogICAgIHsKICAgICAgICAgcmV0dXJuIFNsaWNlLm1ha2UobWFrZUJvdW5kKElOQ0xfU1RBUlRfQk9VTkQsIHN0YXJ0KSwKQEAgLTM4Miw0ICszODUsMjUgQEAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFtpXSwgc2xpY2VzLmdldChpKSk7CiAgICAgfQotfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFNsaWNlc0ludGVyc2VjdChDbHVzdGVyaW5nQ29tcGFyYXRvciBjYywgU2xpY2UgczEsIFNsaWNlIHMyKQorICAgIHsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0SW50ZXJuYWwoY2MsIHMxLCBzMik7CisgICAgICAgIGFzc2VydFNsaWNlc0ludGVyc2VjdEludGVybmFsKGNjLCBTbGljZS5BTEwsIHMxKTsKKyAgICAgICAgYXNzZXJ0U2xpY2VzSW50ZXJzZWN0SW50ZXJuYWwoY2MsIFNsaWNlLkFMTCwgczIpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgU2xpY2UubWFrZShDbHVzdGVyaW5nQm91bmQuZXhjbHVzaXZlU3RhcnRPZihDbHVzdGVyaW5nLkVNUFRZKSwgQ2x1c3RlcmluZ0JvdW5kLmV4Y2x1c2l2ZUVuZE9mKENsdXN0ZXJpbmcuRU1QVFkpKSwgczEpOworICAgICAgICBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChjYywgU2xpY2UubWFrZShDbHVzdGVyaW5nQm91bmQuZXhjbHVzaXZlU3RhcnRPZihDbHVzdGVyaW5nLkVNUFRZKSwgQ2x1c3RlcmluZ0JvdW5kLmV4Y2x1c2l2ZUVuZE9mKENsdXN0ZXJpbmcuRU1QVFkpKSwgczIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTbGljZXNJbnRlcnNlY3RJbnRlcm5hbChDbHVzdGVyaW5nQ29tcGFyYXRvciBjYywgU2xpY2UgczEsIFNsaWNlIHMyKQorICAgIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJpbmcuZm9ybWF0KCJTbGljZSAlcyBzaG91bGQgaW50ZXJzZWN0IHdpdGggc2xpY2UgJXMiLCBzMS50b1N0cmluZyhjYyksIHMyLnRvU3RyaW5nKGNjKSksIHMxLmludGVyc2VjdHMoY2MsIHMyKSk7CisgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiU2xpY2UgJXMgc2hvdWxkIGludGVyc2VjdCB3aXRoIHNsaWNlICVzIiwgczIudG9TdHJpbmcoY2MpLCBzMS50b1N0cmluZyhjYykpLCBzMi5pbnRlcnNlY3RzKGNjLCBzMSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTbGljZXNEb05vdEludGVyc2VjdChDbHVzdGVyaW5nQ29tcGFyYXRvciBjYywgU2xpY2UgczEsIFNsaWNlIHMyKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoU3RyaW5nLmZvcm1hdCgiU2xpY2UgJXMgc2hvdWxkIG5vdCBpbnRlcnNlY3Qgd2l0aCBzbGljZSAlcyIsIHMxLnRvU3RyaW5nKGNjKSwgczIudG9TdHJpbmcoY2MpKSwgczEuaW50ZXJzZWN0cyhjYywgczIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoU3RyaW5nLmZvcm1hdCgiU2xpY2UgJXMgc2hvdWxkIG5vdCBpbnRlcnNlY3Qgd2l0aCBzbGljZSAlcyIsIHMyLnRvU3RyaW5nKGNjKSwgczEudG9TdHJpbmcoY2MpKSwgczIuaW50ZXJzZWN0cyhjYywgczEpKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsQWxsb3dGaWx0ZXJpbmdUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxBbGxvd0ZpbHRlcmluZ1Rlc3QuamF2YQppbmRleCBjNDY0OThjLi41ZWNhODM5IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxBbGxvd0ZpbHRlcmluZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxBbGxvd0ZpbHRlcmluZ1Rlc3QuamF2YQpAQCAtMjIsOCArMjIsMTEgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5yZXN0cmljdGlvbnMuU3RhdGVtZW50UmVzdHJpY3Rpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuSW52YWxpZFJlcXVlc3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYUNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hS2V5c3BhY2VUYWJsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKIAogcHVibGljIGNsYXNzIEd1YXJkcmFpbEFsbG93RmlsdGVyaW5nVGVzdCBleHRlbmRzIEd1YXJkcmFpbFRlc3RlcgogewpAQCAtMzMsNyArMzYsNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldHVwVGVzdCgpCiAgICAgewogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgYSBpbnQsIGIgaW50KSIpOwotICAgICAgICBlbmFibGVTdGF0ZSA9IGdldEd1YXJkcmlhbCgpOworICAgICAgICBlbmFibGVTdGF0ZSA9IGdldEd1YXJkcmFpbCgpOwogICAgIH0KIAogICAgIEBBZnRlcgpAQCAtNDcsNyArNTAsNyBAQAogICAgICAgICBndWFyZHJhaWxzKCkuc2V0QWxsb3dGaWx0ZXJpbmdFbmFibGVkKGFsbG93RmlsdGVyaW5nRW5hYmxlZCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBib29sZWFuIGdldEd1YXJkcmlhbCgpCisgICAgcHJpdmF0ZSBib29sZWFuIGdldEd1YXJkcmFpbCgpCiAgICAgewogICAgICAgICByZXR1cm4gZ3VhcmRyYWlscygpLmdldEFsbG93RmlsdGVyaW5nRW5hYmxlZCgpOwogICAgIH0KQEAgLTkxLDQgKzk0LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hS2V5c3BhY2VUYWJsZXMuVEFCTEVTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYWJsZSgpKSk7CiAgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRBbGxvd0ZpbHRlcmluZygpCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwodHJ1ZSk7CisgICAgICAgIGFzc2VydFJlcXVpcmVkQWxsb3dGaWx0ZXJpbmdUaHJvd3Moc3lzdGVtQ2xpZW50U3RhdGUsIFN0YXRlbWVudFJlc3RyaWN0aW9ucy5SRVFVSVJFU19BTExPV19GSUxURVJJTkdfTUVTU0FHRSk7CisgICAgICAgIGFzc2VydFJlcXVpcmVkQWxsb3dGaWx0ZXJpbmdUaHJvd3Moc3VwZXJDbGllbnRTdGF0ZSwgU3RhdGVtZW50UmVzdHJpY3Rpb25zLlJFUVVJUkVTX0FMTE9XX0ZJTFRFUklOR19NRVNTQUdFKTsKKyAgICAgICAgYXNzZXJ0UmVxdWlyZWRBbGxvd0ZpbHRlcmluZ1Rocm93cyh1c2VyQ2xpZW50U3RhdGUsIFN0YXRlbWVudFJlc3RyaWN0aW9ucy5SRVFVSVJFU19BTExPV19GSUxURVJJTkdfTUVTU0FHRSk7CisKKyAgICAgICAgc2V0R3VhcmRyYWlsKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0UmVxdWlyZWRBbGxvd0ZpbHRlcmluZ1Rocm93cyhzeXN0ZW1DbGllbnRTdGF0ZSwgU3RhdGVtZW50UmVzdHJpY3Rpb25zLlJFUVVJUkVTX0FMTE9XX0ZJTFRFUklOR19NRVNTQUdFKTsKKyAgICAgICAgYXNzZXJ0UmVxdWlyZWRBbGxvd0ZpbHRlcmluZ1Rocm93cyhzdXBlckNsaWVudFN0YXRlLCBTdGF0ZW1lbnRSZXN0cmljdGlvbnMuUkVRVUlSRVNfQUxMT1dfRklMVEVSSU5HX01FU1NBR0UpOworICAgICAgICBhc3NlcnRSZXF1aXJlZEFsbG93RmlsdGVyaW5nVGhyb3dzKHVzZXJDbGllbnRTdGF0ZSwgU3RhdGVtZW50UmVzdHJpY3Rpb25zLkNBTk5PVF9VU0VfQUxMT1dfRklMVEVSSU5HX01FU1NBR0UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSZXF1aXJlZEFsbG93RmlsdGVyaW5nVGhyb3dzKENsaWVudFN0YXRlIHN0YXRlLCBTdHJpbmcgbWVzc2FnZSkKKyAgICB7CisgICAgICAgIFN0cmluZyBxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGEgPSA1IjsKKyAgICAgICAgYXNzZXJ0VGhyb3dzKCgpIC0+IGV4ZWN1dGUoc3RhdGUsIHF1ZXJ5KSwgSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uY2xhc3MsIG1lc3NhZ2UpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbEFsdGVyVGFibGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxBbHRlclRhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYTcwOTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxBbHRlclRhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworCisvKioKKyAqIFRlc3RzIHRoZSBndWFyZHJhaWwgZm9yIGRpc2FibGluZyB1c2VyIGFjY2VzcyB0byB0aGUgQUxURVIgVEFCTEUgc3RhdGVtZW50LCB7QGxpbmsgR3VhcmRyYWlscyNhbHRlclRhYmxlRW5hYmxlZH0uCisgKgorICogTk9URTogVGhpcyB0ZXN0IGNsYXNzIGRlcGVuZHMgb24ge0BsaW5rICNjdXJyZW50VGFibGUoKX0gbWV0aG9kIGZvciBzZXR1cCwgY2xlYW51cCwgYW5kIGV4ZWN1dGlvbiBvZiB0ZXN0cy4gWW91J2xsCisgKiBuZWVkIHRvIHJlZmFjdG9yIHRoaXMgaWYgeW91IGFkZCB0ZXN0cyB0aGF0IG1ha2UgY2hhbmdlcyB0byB0aGUgY3VycmVudCB0YWJsZSBhcyB0aGUgdGVzdCB0ZWFyZG93biB3aWxsIG5vIGxvbmdlciBtYXRjaAorICogc2V0dXAuCisgKi8KK3B1YmxpYyBjbGFzcyBHdWFyZHJhaWxBbHRlclRhYmxlVGVzdCBleHRlbmRzIEd1YXJkcmFpbFRlc3RlcgoreworICAgIHB1YmxpYyBHdWFyZHJhaWxBbHRlclRhYmxlVGVzdCgpCisgICAgeworICAgICAgICBzdXBlcihHdWFyZHJhaWxzLmFsdGVyVGFibGVFbmFibGVkKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXBUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICVzIChrIElOVCwgYyBJTlQsIHYgVEVYVCwgUFJJTUFSWSBLRVkoaywgYykpIik7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZHJvcFRhYmxlKCJEUk9QIFRBQkxFICVzIik7CisgICAgICAgIHNldEd1YXJkcmFpbCh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0R3VhcmRyYWlsKGJvb2xlYW4gYWx0ZXJUYWJsZUVuYWJsZWQpCisgICAgeworICAgICAgICBndWFyZHJhaWxzKCkuc2V0QWx0ZXJUYWJsZUVuYWJsZWQoYWx0ZXJUYWJsZUVuYWJsZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpcm0gdGhhdCBBTFRFUiBUQUJMRSBxdWVyaWVzIGVpdGhlciB3b3JrIChndWFyZHJhaWwgZW5hYmxlZCkgb3IgZmFpbCAoZ3VhcmRyYWlsIGRpc2FibGVkKSBhcHByb3ByaWF0ZWx5CisgICAgICogQHRocm93cyBUaHJvd2FibGUKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHdWFyZHJhaWxFbmFibGVkQW5kRGlzYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgVEFCTEUgJXMgQUREIHRlc3Rfb25lIHRleHQ7IiwgImNoYW5naW5nIGNvbHVtbnMiKTsKKworICAgICAgICBzZXRHdWFyZHJhaWwodHJ1ZSk7CisgICAgICAgIGFzc2VydFZhbGlkKCJBTFRFUiBUQUJMRSAlcyBBREQgdGVzdF90d28gdGV4dDsiKTsKKworICAgICAgICBzZXRHdWFyZHJhaWwoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgVEFCTEUgJXMgQUREIHRlc3RfdGhyZWUgdGV4dDsiLCAiY2hhbmdpbmcgY29sdW1ucyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpcm0gdGhlIGd1YXJkcmFpbCBhcHByb3ByaWF0ZWx5IGNhdGNoZXMgdGhlIEFMVEVSIERST1AgY2FzZSBvbiBhIGNvbHVtbgorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGllc1RvQWx0ZXJEcm9wQ29sdW1uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgc2V0R3VhcmRyYWlsKHRydWUpOworICAgICAgICBhc3NlcnRWYWxpZCgiQUxURVIgVEFCTEUgJXMgQUREIHRlc3Rfb25lIHRleHQ7Iik7CisKKyAgICAgICAgc2V0R3VhcmRyYWlsKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkFMVEVSIFRBQkxFICVzIERST1AgdGVzdF9vbmUiLCAiY2hhbmdpbmcgY29sdW1ucyIpOworCisgICAgICAgIHNldEd1YXJkcmFpbCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkFMVEVSIFRBQkxFICVzIERST1AgdGVzdF9vbmUiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maXJtIHRoZSBndWFyZHJhaWwgYXBwcm9wcmlhdGVseSBjYXRjaGVzIHRoZSBBTFRFUiBSRU5BTUUgY2FzZSBvbiBhIGNvbHVtbgorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGllc1RvQWx0ZXJSZW5hbWVDb2x1bW4oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgVEFCTEUgJXMgUkVOQU1FIGMgVE8gcmVuYW1lZF9jIiwgImNoYW5naW5nIGNvbHVtbnMiKTsKKworICAgICAgICBzZXRHdWFyZHJhaWwodHJ1ZSk7CisgICAgICAgIGFzc2VydFZhbGlkKCJBTFRFUiBUQUJMRSAlcyBSRU5BTUUgYyBUTyByZW5hbWVkX2MiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maXJtIHdlIGNhbiBhbHdheXMgYWx0ZXIgcHJvcGVydGllcyB2aWEgdGhlIG9wdGlvbnMgbWFwIHJlZ2FyZGxlc3Mgb2YgZ3VhcmRyYWlsIHN0YXRlCisgICAgICogQHRocm93cyBUaHJvd2FibGUKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbHRlclZpYU1hcEFsd2F5c1dvcmtzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgc2V0R3VhcmRyYWlsKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkFMVEVSIFRBQkxFICVzIFdJVEggY29tcHJlc3Npb24gPSB7ICdjbGFzcycgOiAnU25hcHB5Q29tcHJlc3NvcicsICdjaHVua19sZW5ndGhfaW5fa2InIDogMzIgfTsiKTsKKworICAgICAgICBzZXRHdWFyZHJhaWwodHJ1ZSk7CisgICAgICAgIGFzc2VydFZhbGlkKCJBTFRFUiBUQUJMRSAlcyBXSVRIIGNvbXByZXNzaW9uID0geyAnY2xhc3MnIDogJ1NuYXBweUNvbXByZXNzb3InLCAnY2h1bmtfbGVuZ3RoX2luX2tiJyA6IDMyIH07Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlybSB0aGUgb3RoZXIgZm9ybSBvZiBBTFRFUiBUQUJMRSBwcm9wZXJ0eSBtYXAgY2hhbmdpbmcgYWx3YXlzIHdvcmtzIHJlZ2FyZGxlc3Mgb2YgZ3VhcmRyYWlsIHN0YXRlCisgICAgICogQHRocm93cyBUaHJvd2FibGUKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbHRlck9wdGlvbnNBbHdheXNXb3JrcygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHNldEd1YXJkcmFpbCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkFMVEVSIFRBQkxFICVzIFdJVEggR0NfR1JBQ0VfU0VDT05EUyA9IDQ1NjsgIik7CisKKyAgICAgICAgc2V0R3VhcmRyYWlsKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkFMVEVSIFRBQkxFICVzIFdJVEggR0NfR1JBQ0VfU0VDT05EUyA9IDEyMzsgIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsQ29sbGVjdGlvblNpemVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxDb2xsZWN0aW9uU2l6ZVRlc3QuamF2YQppbmRleCAxNDgzZTgxLi5iMTVmODVhIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxDb2xsZWN0aW9uU2l6ZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxDb2xsZWN0aW9uU2l6ZVRlc3QuamF2YQpAQCAtMjgsMTIgKzI4LDE0IEBACiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxpc3RUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTWFwVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlNldFR5cGU7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uQnl0ZUJ1ZmZlci5hbGxvY2F0ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYy5EYXRhU3RvcmFnZVVuaXQuQllURVM7CiAKIC8qKgogICogVGVzdHMgdGhlIGd1YXJkcmFpbCBmb3IgdGhlIHNpemUgb2YgY29sbGVjdGlvbnMsIHtAbGluayBHdWFyZHJhaWxzI2NvbGxlY3Rpb25TaXplfS4KQEAgLTUzLDcgKzU1LDkgQEAKICAgICAgICAgICAgICAgR3VhcmRyYWlscy5jb2xsZWN0aW9uU2l6ZSwKICAgICAgICAgICAgICAgR3VhcmRyYWlsczo6c2V0Q29sbGVjdGlvblNpemVUaHJlc2hvbGQsCiAgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldENvbGxlY3Rpb25TaXplV2FyblRocmVzaG9sZCwKLSAgICAgICAgICAgICAgR3VhcmRyYWlsczo6Z2V0Q29sbGVjdGlvblNpemVGYWlsVGhyZXNob2xkKTsKKyAgICAgICAgICAgICAgR3VhcmRyYWlsczo6Z2V0Q29sbGVjdGlvblNpemVGYWlsVGhyZXNob2xkLAorICAgICAgICAgICAgICBieXRlcyAtPiBuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kKGJ5dGVzLCBCWVRFUykudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgc2l6ZSAtPiBuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kKHNpemUpLnRvQnl0ZXMoKSk7CiAgICAgfQogCiAgICAgQEFmdGVyCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxDb2x1bW5WYWx1ZVNpemVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxDb2x1bW5WYWx1ZVNpemVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1MTNkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbENvbHVtblZhbHVlU2l6ZVRlc3QuamF2YQpAQCAtMCwwICsxLDY1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVzVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxpc3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTWFwVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlNldFR5cGU7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CitpbXBvcnQgc3RhdGljIGphdmEubmlvLkJ5dGVCdWZmZXIuYWxsb2NhdGU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWMuRGF0YVN0b3JhZ2VVbml0LkJZVEVTOworCisvKioKKyAqIFRlc3RzIHRoZSBndWFyZHJhaWwgZm9yIHRoZSBzaXplIG9mIGNvbHVtbiB2YWx1ZXMsIHtAbGluayBHdWFyZHJhaWxzI2NvbHVtblZhbHVlU2l6ZX0uCisgKi8KK3B1YmxpYyBjbGFzcyBHdWFyZHJhaWxDb2x1bW5WYWx1ZVNpemVUZXN0IGV4dGVuZHMgVGhyZXNob2xkVGVzdGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBUk5fVEhSRVNIT0xEID0gMTAyNDsgLy8gYnl0ZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkFJTF9USFJFU0hPTEQgPSBXQVJOX1RIUkVTSE9MRCAqIDQ7IC8vIGJ5dGVzCisKKyAgICBwdWJsaWMgR3VhcmRyYWlsQ29sdW1uVmFsdWVTaXplVGVzdCgpCisgICAgeworICAgICAgICBzdXBlcihXQVJOX1RIUkVTSE9MRCArICJCIiwKKyAgICAgICAgICAgICAgRkFJTF9USFJFU0hPTEQgKyAiQiIsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHMuY29sdW1uVmFsdWVTaXplLAorICAgICAgICAgICAgICBHdWFyZHJhaWxzOjpzZXRDb2x1bW5WYWx1ZVNpemVUaHJlc2hvbGQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldENvbHVtblZhbHVlU2l6ZVdhcm5UaHJlc2hvbGQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldENvbHVtblZhbHVlU2l6ZUZhaWxUaHJlc2hvbGQsCisgICAgICAgICAgICAgIGJ5dGVzIC0+IG5ldyBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQoYnl0ZXMsIEJZVEVTKS50b1N0cmluZygpLAorICAgICAgICAgICAgICBzaXplIC0+IG5ldyBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQoc2l6ZSkudG9CeXRlcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVQYXJ0aXRpb25LZXkoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIHRleHQgUFJJTUFSWSBLRVksIHYgaW50KSIpOworCisgICAgICAgIC8vIHRoZSBzaXplIG9mIHByaW1hcnkga2V5IGNvbHVtbnMgaXMgbm90IGd1YXJkZWQgYmVjYXVzZSB0aGV5IGFscmVhZHkgaGF2ZSBhIGZpeGVkIGxpbWl0IG9mIDY1NTM1QgorCisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiSU5TRVJUIElOVE8gJXMgKGssIHYpIFZBTFVFUyAoPywgMCkiKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJVUERBVEUgJXMgU0VUIHYgPSAxIFdIRVJFIGsgPSA/Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiREVMRVRFIHYgRlJPTSAlcyBXSEVSRSBrID0gPyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSA/Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlUGFydGl0aW9uS2V5KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoazEgdGV4dCwgazIgdGV4dCwgdiBpbnQsIFBSSU1BUlkgS0VZKChrMSwgazIpKSkiKTsKKworICAgICAgICAvLyB0aGUgc2l6ZSBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGlzIG5vdCBndWFyZGVkIGJlY2F1c2UgdGhleSBhbHJlYWR5IGhhdmUgYSBmaXhlZCBsaW1pdCBvZiA2NTUzNUIKKworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQyKCJJTlNFUlQgSU5UTyAlcyAoazEsIGsyLCB2KSBWQUxVRVMgKD8sID8sIDApIik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZDIoIlVQREFURSAlcyBTRVQgdiA9IDEgV0hFUkUgazEgPSA/IEFORCBrMiA9ID8iKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkMigiREVMRVRFIHYgRlJPTSAlcyBXSEVSRSBrMSA9ID8gQU5EIGsyID0gPyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQyKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrMSA9ID8gQU5EIGsyID0gPyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUNsdXN0ZXJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCwgYyB0ZXh0LCB2IGludCwgUFJJTUFSWSBLRVkoaywgYykpIik7CisKKyAgICAgICAgLy8gdGhlIHNpemUgb2YgcHJpbWFyeSBrZXkgY29sdW1ucyBpcyBub3QgZ3VhcmRlZCBiZWNhdXNlIHRoZXkgYWxyZWFkeSBoYXZlIGEgZml4ZWQgbGltaXQgb2YgNjU1MzVCCisKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgwLCA/LCAwKSIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIlVQREFURSAlcyBTRVQgdiA9IDEgV0hFUkUgayA9IDAgQU5EIGMgPSA/Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiREVMRVRFIHYgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgYyA9ID8iKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgYyA9ID8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVDbHVzdGVyaW5nKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQsIGMxIHRleHQsIGMyIHRleHQsIHYgaW50LCBQUklNQVJZIEtFWShrLCBjMSwgYzIpKSIpOworCisgICAgICAgIC8vIHRoZSBzaXplIG9mIHByaW1hcnkga2V5IGNvbHVtbnMgaXMgbm90IGd1YXJkZWQgYmVjYXVzZSB0aGV5IGFscmVhZHkgaGF2ZSBhIGZpeGVkIGxpbWl0IG9mIDY1NTM1QgorCisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMxID0gPyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSAwIEFORCBjMSA+ID8iKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgYzEgPCA/Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMxID49ID8iKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgYzEgPD0gPyIpOworCisgICAgICAgIHRlc3ROb1RocmVzaG9sZDIoIklOU0VSVCBJTlRPICVzIChrLCBjMSwgYzIsIHYpIFZBTFVFUyAoMCwgPywgPywgMCkiKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkMigiVVBEQVRFICVzIFNFVCB2ID0gMSBXSEVSRSBrID0gMCBBTkQgYzEgPSA/IEFORCBjMiA9ID8iKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkMigiREVMRVRFIHYgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgYzEgPSA/IEFORCBjMiA9ID8iKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkMigiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMxID0gPyBBTkQgYzIgPSA/Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZDIoIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSAwIEFORCBjMSA9ID8gQU5EIGMyID4gPyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQyKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgYzEgPSA/IEFORCBjMiA8ID8iKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkMigiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IDAgQU5EIGMxID0gPyBBTkQgYzIgPj0gPyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQyKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gMCBBTkQgYzEgPSA/IEFORCBjMiA8PSA/Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVndWxhckNvbHVtbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IHRleHQpIik7CisKKyAgICAgICAgdGVzdFRocmVzaG9sZCgidiIsICJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgwLCA/KSIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJ2IiwgIlVQREFURSAlcyBTRVQgdiA9ID8gV0hFUkUgayA9IDAiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aWNDb2x1bW4oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCwgYyBpbnQsIHMgdGV4dCBTVEFUSUMsIHIgaW50LCBQUklNQVJZIEtFWShrLCBjKSkiKTsKKworICAgICAgICB0ZXN0VGhyZXNob2xkKCJzIiwgIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKDAsID8pIik7CisgICAgICAgIHRlc3RUaHJlc2hvbGQoInMiLCAiSU5TRVJUIElOVE8gJXMgKGssIGMsIHMsIHIpIFZBTFVFUyAoMCwgMCwgPywgMCkiKTsKKyAgICAgICAgdGVzdFRocmVzaG9sZCgicyIsICJVUERBVEUgJXMgU0VUIHMgPSA/IFdIRVJFIGsgPSAwIik7CisgICAgICAgIHRlc3RUaHJlc2hvbGQoInMiLCAiVVBEQVRFICVzIFNFVCBzID0gPywgciA9IDAgV0hFUkUgayA9IDAgQU5EIGMgPSAwIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHVwbGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgdCB0dXBsZTx0ZXh0LCB0ZXh0PikiKTsKKworICAgICAgICB0ZXN0VGhyZXNob2xkMigidCIsICJJTlNFUlQgSU5UTyAlcyAoaywgdCkgVkFMVUVTICgwLCAoPywgPykpIiwgOCk7CisgICAgICAgIHRlc3RUaHJlc2hvbGQyKCJ0IiwgIlVQREFURSAlcyBTRVQgdCA9ICg/LCA/KSBXSEVSRSBrID0gMCIsIDgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVEVCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyB1ZHQgPSBjcmVhdGVUeXBlKCJDUkVBVEUgVFlQRSAlcyAoYSB0ZXh0LCBiIHRleHQpIik7CisgICAgICAgIGNyZWF0ZVRhYmxlKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICUlcyAoayBpbnQgUFJJTUFSWSBLRVksIHUgJXMpIiwgdWR0KSk7CisKKyAgICAgICAgdGVzdFRocmVzaG9sZCgidSIsICJJTlNFUlQgSU5UTyAlcyAoaywgdSkgVkFMVUVTICgwLCB7YTogP30pIik7CisgICAgICAgIHRlc3RUaHJlc2hvbGQoInUiLCAiSU5TRVJUIElOVE8gJXMgKGssIHUpIFZBTFVFUyAoMCwge2I6ID99KSIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJ1IiwgIlVQREFURSAlcyBTRVQgdSA9IHthOiA/fSBXSEVSRSBrID0gMCIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJ1IiwgIlVQREFURSAlcyBTRVQgdSA9IHtiOiA/fSBXSEVSRSBrID0gMCIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJ1IiwgIlVQREFURSAlcyBTRVQgdS5hID0gPyBXSEVSRSBrID0gMCIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJ1IiwgIlVQREFURSAlcyBTRVQgdS5iID0gPyBXSEVSRSBrID0gMCIpOworICAgICAgICB0ZXN0VGhyZXNob2xkMigidSIsICJJTlNFUlQgSU5UTyAlcyAoaywgdSkgVkFMVUVTICgwLCB7YTogPywgYjogP30pIik7CisgICAgICAgIHRlc3RUaHJlc2hvbGQyKCJ1IiwgIlVQREFURSAlcyBTRVQgdS5hID0gPywgdS5iID0gPyBXSEVSRSBrID0gMCIpOworICAgICAgICB0ZXN0VGhyZXNob2xkMigidSIsICJVUERBVEUgJXMgU0VUIHUgPSB7YTogPywgYjogP30gV0hFUkUgayA9IDAiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcm96ZW5VRFQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcgdWR0ID0gY3JlYXRlVHlwZSgiQ1JFQVRFIFRZUEUgJXMgKGEgdGV4dCwgYiB0ZXh0KSIpOworICAgICAgICBjcmVhdGVUYWJsZShmb3JtYXQoIkNSRUFURSBUQUJMRSAlJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IGZyb3plbjwlcz4pIiwgdWR0KSk7CisKKyAgICAgICAgdGVzdFRocmVzaG9sZCgidiIsICJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgwLCB7YTogP30pIiwgOCk7CisgICAgICAgIHRlc3RUaHJlc2hvbGQoInYiLCAiSU5TRVJUIElOVE8gJXMgKGssIHYpIFZBTFVFUyAoMCwge2I6ID99KSIsIDgpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJ2IiwgIlVQREFURSAlcyBTRVQgdiA9IHthOiA/fSBXSEVSRSBrID0gMCIsIDgpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJ2IiwgIlVQREFURSAlcyBTRVQgdiA9IHtiOiA/fSBXSEVSRSBrID0gMCIsIDgpOworICAgICAgICB0ZXN0VGhyZXNob2xkMigidiIsICJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgwLCB7YTogPywgYjogP30pIiwgOCk7CisgICAgICAgIHRlc3RUaHJlc2hvbGQyKCJ2IiwgIlVQREFURSAlcyBTRVQgdiA9IHthOiA/LCBiOiA/fSBXSEVSRSBrID0gMCIsIDgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZFVEVCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyBpbm5lciA9IGNyZWF0ZVR5cGUoIkNSRUFURSBUWVBFICVzIChjIHRleHQsIGQgdGV4dCkiKTsKKyAgICAgICAgU3RyaW5nIG91dGVyID0gY3JlYXRlVHlwZShmb3JtYXQoIkNSRUFURSBUWVBFICUlcyAoYSB0ZXh0LCBiIGZyb3plbjwlcz4pIiwgaW5uZXIpKTsKKyAgICAgICAgY3JlYXRlVGFibGUoZm9ybWF0KCJDUkVBVEUgVEFCTEUgJSVzIChrIGludCBQUklNQVJZIEtFWSwgdiAlcykiLCBvdXRlcikpOworCisgICAgICAgIGZvciAoU3RyaW5nIHF1ZXJ5IDogQXJyYXlzLmFzTGlzdCgiSU5TRVJUIElOVE8gJXMgKGssIHYpIFZBTFVFUyAoMCwge2E6ID8sIGI6IHtjOiA/LCBkOiA/fX0pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVUERBVEUgJXMgU0VUIHYgPSB7YTogPywgYjoge2M6ID8sIGQ6ID99fSBXSEVSRSBrID0gMCIpKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoMCksIGFsbG9jYXRlKDApLCBhbGxvY2F0ZSgwKSk7CisgICAgICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSA4KSwgYWxsb2NhdGUoMCksIGFsbG9jYXRlKDApKTsKKyAgICAgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZSgwKSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSA4KSwgYWxsb2NhdGUoMCkpOworICAgICAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIGFsbG9jYXRlKDApLCBhbGxvY2F0ZSgwKSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSA4KSk7CisKKyAgICAgICAgICAgIGFzc2VydFdhcm5zKCJ2IiwgcXVlcnksIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEICsgMSksIGFsbG9jYXRlKDApLCBhbGxvY2F0ZSgwKSk7CisgICAgICAgICAgICBhc3NlcnRXYXJucygidiIsIHF1ZXJ5LCBhbGxvY2F0ZSgwKSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSA3KSwgYWxsb2NhdGUoMCkpOworICAgICAgICAgICAgYXNzZXJ0V2FybnMoInYiLCBxdWVyeSwgYWxsb2NhdGUoMCksIGFsbG9jYXRlKDApLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCAtIDcpKTsKKworICAgICAgICAgICAgYXNzZXJ0RmFpbHMoInYiLCBxdWVyeSwgYWxsb2NhdGUoRkFJTF9USFJFU0hPTEQgKyAxKSwgYWxsb2NhdGUoMCksIGFsbG9jYXRlKDApKTsKKyAgICAgICAgICAgIGFzc2VydEZhaWxzKCJ2IiwgcXVlcnksIGFsbG9jYXRlKDApLCBhbGxvY2F0ZShGQUlMX1RIUkVTSE9MRCAtIDcpLCBhbGxvY2F0ZSgwKSk7CisgICAgICAgICAgICBhc3NlcnRGYWlscygidiIsIHF1ZXJ5LCBhbGxvY2F0ZSgwKSwgYWxsb2NhdGUoMCksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEIC0gNykpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCBsIGxpc3Q8dGV4dD4pIik7CisKKyAgICAgICAgZm9yIChTdHJpbmcgcXVlcnkgOiBBcnJheXMuYXNMaXN0KCJJTlNFUlQgSU5UTyAlcyAoaywgbCkgVkFMVUVTICgwLCA/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBsID0gPyBXSEVSRSBrID0gMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBsID0gbCArID8gV0hFUkUgayA9IDAiKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdENvbGxlY3Rpb24oImwiLCBxdWVyeSwgdGhpczo6bGlzdCk7CisgICAgICAgIH0KKworICAgICAgICB0ZXN0VGhyZXNob2xkKCJsIiwgIlVQREFURSAlcyBTRVQgbFswXSA9ID8gV0hFUkUgayA9IDAiKTsKKworICAgICAgICBTdHJpbmcgcXVlcnkgPSAiVVBEQVRFICVzIFNFVCBsID0gbCAtID8gV0hFUkUgayA9IDAiOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgdGhpczo6bGlzdCwgYWxsb2NhdGUoMSkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgdGhpczo6bGlzdCwgYWxsb2NhdGUoRkFJTF9USFJFU0hPTEQpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIHRoaXM6Omxpc3QsIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEICsgMSkpOyAvLyBEb2Vzbid0IHdyaXRlIGFueXRoaW5nIGJlY2F1c2Ugd2UgY291bGRuJ3Qgd3JpdGUKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcm96ZW5MaXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIGZsIGZyb3plbjxsaXN0PHRleHQ+PikiKTsKKworICAgICAgICAvLyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIGEgZnJvemVuIGxpc3QgaXMgdGhlIHNpemUgb2YgaXRzIHNlcmlhbGl6ZWQgZWxlbWVudHMsIHBsdXMgYSAzMi1iaXQgaW50ZWdlciBwcmVmaXggZm9yCisgICAgICAgIC8vIHRoZSBudW1iZXIgb2YgZWxlbWVudHMsIGFuZCBhbm90aGVyIDMyLWJpdCBpbnRlZ2VyIGZvciB0aGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQKKworICAgICAgICBmb3IgKFN0cmluZyBxdWVyeSA6IEFycmF5cy5hc0xpc3QoIklOU0VSVCBJTlRPICVzIChrLCBmbCkgVkFMVUVTICgwLCA/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBmbCA9ID8gV0hFUkUgayA9IDAiKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdEZyb3plbkNvbGxlY3Rpb24oImZsIiwgcXVlcnksIHRoaXM6Omxpc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksIHMgc2V0PHRleHQ+KSIpOworCisgICAgICAgIGZvciAoU3RyaW5nIHF1ZXJ5IDogQXJyYXlzLmFzTGlzdCgiSU5TRVJUIElOVE8gJXMgKGssIHMpIFZBTFVFUyAoMCwgPykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVQREFURSAlcyBTRVQgcyA9ID8gV0hFUkUgayA9IDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVQREFURSAlcyBTRVQgcyA9IHMgKyA/IFdIRVJFIGsgPSAwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVUERBVEUgJXMgU0VUIHMgPSBzIC0gPyBXSEVSRSBrID0gMCIpKQorICAgICAgICB7CisgICAgICAgICAgICB0ZXN0Q29sbGVjdGlvbigicyIsIHF1ZXJ5LCB0aGlzOjpzZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0V2l0aENsdXN0ZXJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCwgYzEgaW50LCBjMiBpbnQsIHMgc2V0PHRleHQ+LCBQUklNQVJZIEtFWShrLCBjMSwgYzIpKSIpOworCisgICAgICAgIGZvciAoU3RyaW5nIHF1ZXJ5IDogQXJyYXlzLmFzTGlzdCgiSU5TRVJUIElOVE8gJXMgKGssIGMxLCBjMiwgcykgVkFMVUVTICgwLCAwLCAwLCA/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBzID0gPyBXSEVSRSBrID0gMCBBTkQgYzEgPSAwIEFORCBjMiA9IDAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVQREFURSAlcyBTRVQgcyA9IHMgKyA/IFdIRVJFIGsgPSAwIEFORCBjMSA9IDAgQU5EIGMyID0gMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBzID0gcyAtID8gV0hFUkUgayA9IDAgQU5EIGMxID0gMCBBTkQgYzIgPSAwIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlc3RDb2xsZWN0aW9uKCJzIiwgcXVlcnksIHRoaXM6OnNldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcm96ZW5TZXQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgZnMgZnJvemVuPHNldDx0ZXh0Pj4pIik7CisKKyAgICAgICAgLy8gdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiBhIGZyb3plbiBzZXQgaXMgdGhlIHNpemUgb2YgaXRzIHNlcmlhbGl6ZWQgZWxlbWVudHMsIHBsdXMgYSAzMi1iaXQgaW50ZWdlciBwcmVmaXggZm9yCisgICAgICAgIC8vIHRoZSBudW1iZXIgb2YgZWxlbWVudHMsIGFuZCBhbm90aGVyIDMyLWJpdCBpbnRlZ2VyIGZvciB0aGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQKKworICAgICAgICBmb3IgKFN0cmluZyBxdWVyeSA6IEFycmF5cy5hc0xpc3QoIklOU0VSVCBJTlRPICVzIChrLCBmcykgVkFMVUVTICgwLCA/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBmcyA9ID8gV0hFUkUgayA9IDAiKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdEZyb3plbkNvbGxlY3Rpb24oImZzIiwgcXVlcnksIHRoaXM6OnNldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXAoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrIGludCBQUklNQVJZIEtFWSwgbSBtYXA8dGV4dCwgdGV4dD4pIik7CisKKyAgICAgICAgZm9yIChTdHJpbmcgcXVlcnkgOiBBcnJheXMuYXNMaXN0KCJJTlNFUlQgSU5UTyAlcyAoaywgbSkgVkFMVUVTICgwLCA/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBtID0gPyBXSEVSRSBrID0gMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFICVzIFNFVCBtID0gbSArID8gV0hFUkUgayA9IDAiKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdE1hcCgibSIsIHF1ZXJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIHRlc3RUaHJlc2hvbGQyKCJtIiwgIlVQREFURSAlcyBTRVQgbVs/XSA9ID8gV0hFUkUgayA9IDAiKTsKKyAgICAgICAgdGVzdENvbGxlY3Rpb24oIm0iLCAiVVBEQVRFICVzIFNFVCBtID0gbSAtID8gV0hFUkUgayA9IDAiLCB0aGlzOjpzZXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcFdpdGhDbHVzdGVyaW5nKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQsIGMxIGludCwgYzIgaW50LCBtYyBtYXA8dGV4dCwgdGV4dD4sIFBSSU1BUlkgS0VZKGssIGMxLCBjMikpIik7CisgICAgICAgIHRlc3RNYXAoIm1jIiwgIklOU0VSVCBJTlRPICVzIChrLCBjMSwgYzIsIG1jKSBWQUxVRVMgKDAsIDAsIDAsID8pIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnJvemVuTWFwKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayBpbnQgUFJJTUFSWSBLRVksZm0gZnJvemVuPG1hcDx0ZXh0LCB0ZXh0Pj4pIik7CisKKyAgICAgICAgLy8gdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiBhIGZyb3plbiBtYXAgaXMgdGhlIHNpemUgb2YgdGhlIHNlcmlhbGl6ZWQgdmFsdWVzIHBsdXMgYSAzMi1iaXQgaW50ZWdlciBwcmVmaXggZm9yIHRoZQorICAgICAgICAvLyBudW1iZXIgb2Yga2V5LXZhbHVlIHBhaXJzLCBhbmQgYW5vdGhlciAzMi1iaXQgaW50ZWdlciBmb3IgdGhlIHNpemUgb2YgZWFjaCB2YWx1ZQorCisgICAgICAgIGZvciAoU3RyaW5nIHF1ZXJ5IDogQXJyYXlzLmFzTGlzdCgiSU5TRVJUIElOVE8gJXMgKGssIGZtKSBWQUxVRVMgKDAsID8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVUERBVEUgJXMgU0VUIGZtID0gPyBXSEVSRSBrID0gMCIpKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgdGhpczo6bWFwLCBhbGxvY2F0ZSgxKSwgYWxsb2NhdGUoMSkpOworICAgICAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIHRoaXM6Om1hcCwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSAxMyksIGFsbG9jYXRlKDEpKTsKKyAgICAgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCB0aGlzOjptYXAsIGFsbG9jYXRlKDEpLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCAtIDEzKSk7CisKKyAgICAgICAgICAgIGFzc2VydFdhcm5zKCJmbSIsIHF1ZXJ5LCB0aGlzOjptYXAsIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEIC0gMTIpLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgICAgICBhc3NlcnRXYXJucygiZm0iLCBxdWVyeSwgdGhpczo6bWFwLCBhbGxvY2F0ZSgxKSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSAxMikpOworCisgICAgICAgICAgICBhc3NlcnRGYWlscygiZm0iLCBxdWVyeSwgdGhpczo6bWFwLCBhbGxvY2F0ZShGQUlMX1RIUkVTSE9MRCAtIDEyKSwgYWxsb2NhdGUoMSkpOworICAgICAgICAgICAgYXNzZXJ0RmFpbHMoImZtIiwgcXVlcnksIHRoaXM6Om1hcCwgYWxsb2NhdGUoMSksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEIC0gMTIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhdGNoKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayB0ZXh0LCBjIHRleHQsIHIgdGV4dCwgcyB0ZXh0IFNUQVRJQywgUFJJTUFSWSBLRVkoaywgYykpIik7CisKKyAgICAgICAgLy8gcGFydGl0aW9uIGtleQorICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIkJFR0lOIEJBVENIIElOU0VSVCBJTlRPICVzIChrLCBjLCByKSBWQUxVRVMgKD8sICcwJywgJzAnKTsgQVBQTFkgQkFUQ0g7Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiQkVHSU4gQkFUQ0ggVVBEQVRFICVzIFNFVCByID0gJzAnIFdIRVJFIGsgPSA/IEFORCBjID0gJzAnOyBBUFBMWSBCQVRDSDsiKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJCRUdJTiBCQVRDSCBERUxFVEUgciBGUk9NICVzIFdIRVJFIGsgPSA/IEFORCBjID0gJzAnOyBBUFBMWSBCQVRDSDsiKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJCRUdJTiBCQVRDSCBERUxFVEUgRlJPTSAlcyBXSEVSRSBrID0gPzsgQVBQTFkgQkFUQ0g7Iik7CisKKyAgICAgICAgLy8gc3RhdGljIGNvbHVtbgorICAgICAgICB0ZXN0VGhyZXNob2xkKCJzIiwgIkJFR0lOIEJBVENIIElOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKCcwJywgPyk7IEFQUExZIEJBVENIOyIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJzIiwgIkJFR0lOIEJBVENIIElOU0VSVCBJTlRPICVzIChrLCBzLCBjLCByKSBWQUxVRVMgKCcwJywgPywgJzAnLCAnMCcpOyBBUFBMWSBCQVRDSDsiKTsKKyAgICAgICAgdGVzdFRocmVzaG9sZCgicyIsICJCRUdJTiBCQVRDSCBVUERBVEUgJXMgU0VUIHMgPSA/IFdIRVJFIGsgPSAnMCc7IEFQUExZIEJBVENIOyIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJzIiwgIkJFR0lOIEJBVENIIFVQREFURSAlcyBTRVQgcyA9ID8sIHIgPSAnMCcgV0hFUkUgayA9ICcwJyBBTkQgYyA9ICcwJzsgQVBQTFkgQkFUQ0g7Iik7CisKKyAgICAgICAgLy8gY2x1c3RlcmluZyBrZXkKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJCRUdJTiBCQVRDSCBJTlNFUlQgSU5UTyAlcyAoaywgYywgcikgVkFMVUVTICgnMCcsID8sICcwJyk7IEFQUExZIEJBVENIOyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIkJFR0lOIEJBVENIIFVQREFURSAlcyBTRVQgciA9ICcwJyBXSEVSRSBrID0gJzAnIEFORCBjID0gPzsgQVBQTFkgQkFUQ0g7Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiQkVHSU4gQkFUQ0ggREVMRVRFIHIgRlJPTSAlcyBXSEVSRSBrID0gJzAnIEFORCBjID0gPzsgQVBQTFkgQkFUQ0g7Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiQkVHSU4gQkFUQ0ggREVMRVRFIEZST00gJXMgV0hFUkUgayA9ICcwJyBBTkQgYyA9ID87IEFQUExZIEJBVENIOyIpOworCisgICAgICAgIC8vIHJlZ3VsYXIgY29sdW1uCisgICAgICAgIHRlc3RUaHJlc2hvbGQoInIiLCAiQkVHSU4gQkFUQ0ggSU5TRVJUIElOVE8gJXMgKGssIGMsIHIpIFZBTFVFUyAoJzAnLCAnMCcsID8pOyBBUFBMWSBCQVRDSDsiKTsKKyAgICAgICAgdGVzdFRocmVzaG9sZCgiciIsICJCRUdJTiBCQVRDSCBVUERBVEUgJXMgU0VUIHIgPSA/IFdIRVJFIGsgPSAnMCcgQU5EIGMgPSAnMCc7IEFQUExZIEJBVENIOyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENBU1dpdGhJZk5vdEV4aXN0c0NvbmRpdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgdGV4dCwgYyB0ZXh0LCB2IHRleHQsIHMgdGV4dCBTVEFUSUMsIFBSSU1BUlkgS0VZKGssIGMpKSIpOworCisgICAgICAgIC8vIHBhcnRpdGlvbiBrZXkKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICg/LCAnMCcsICcwJykgSUYgTk9UIEVYSVNUUyIpOworCisgICAgICAgIC8vIGNsdXN0ZXJpbmcga2V5CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiSU5TRVJUIElOVE8gJXMgKGssIGMsIHYpIFZBTFVFUyAoJzAnLCA/LCAnMCcpIElGIE5PVCBFWElTVFMiKTsKKworICAgICAgICAvLyBzdGF0aWMgY29sdW1uCisgICAgICAgIGFzc2VydFZhbGlkKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICgnMScsID8pIElGIE5PVCBFWElTVFMiLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydFZhbGlkKCJJTlNFUlQgSU5UTyAlcyAoaywgcykgVkFMVUVTICgnMicsID8pIElGIE5PVCBFWElTVFMiLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCkpOworICAgICAgICBhc3NlcnRWYWxpZCgiSU5TRVJUIElOVE8gJXMgKGssIHMpIFZBTFVFUyAoJzInLCA/KSBJRiBOT1QgRVhJU1RTIiwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgKyAxKSk7IC8vIG5vdCBhcHBsaWVkCisgICAgICAgIGFzc2VydFdhcm5zKCJzIiwgIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKCczJywgPykgSUYgTk9UIEVYSVNUUyIsIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEICsgMSkpOworCisgICAgICAgIC8vIHJlZ3VsYXIgY29sdW1uCisgICAgICAgIGFzc2VydFZhbGlkKCJJTlNFUlQgSU5UTyAlcyAoaywgYywgdikgVkFMVUVTICgnNCcsICcwJywgPykgSUYgTk9UIEVYSVNUUyIsIGFsbG9jYXRlKDEpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKCc1JywgJzAnLCA/KSBJRiBOT1QgRVhJU1RTIiwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKCc1JywgJzAnLCA/KSBJRiBOT1QgRVhJU1RTIiwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgKyAxKSk7IC8vIG5vdCBhcHBsaWVkCisgICAgICAgIGFzc2VydFdhcm5zKCJ2IiwgIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKCc2JywgJzAnLCA/KSBJRiBOT1QgRVhJU1RTIiwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgKyAxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q0FTV2l0aElmRXhpc3RzQ29uZGl0aW9uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAoayB0ZXh0LCBjIHRleHQsIHYgdGV4dCwgcyB0ZXh0IFNUQVRJQywgUFJJTUFSWSBLRVkoaywgYykpIik7CisKKyAgICAgICAgLy8gcGFydGl0aW9uIGtleSwgdGhlIENBUyB1cGRhdGVzIHdpdGggdmFsdWVzIGJleW9uZCB0aGUgdGhyZXNob2xkIGFyZSBub3QgYXBwbGllZCBzbyB0aGV5IGRvbid0IGNvbWUgdG8gZmFpbAorICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIlVQREFURSAlcyBTRVQgdiA9ICcwJyBXSEVSRSBrID0gPyBBTkQgYyA9ICcwJyBJRiBFWElTVFMiKTsKKworICAgICAgICAvLyBjbHVzdGVyaW5nIGtleSwgdGhlIENBUyB1cGRhdGVzIHdpdGggdmFsdWVzIGJleW9uZCB0aGUgdGhyZXNob2xkIGFyZSBub3QgYXBwbGllZCBzbyB0aGV5IGRvbid0IGNvbWUgdG8gZmFpbAorICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIlVQREFURSAlcyBTRVQgdiA9ICcwJyBXSEVSRSBrID0gJzAnIEFORCBjID0gPyBJRiBFWElTVFMiKTsKKworICAgICAgICAvLyBzdGF0aWMgY29sdW1uLCBvbmx5IHRoZSBhcHBsaWVkIENBUyB1cGRhdGVzIGNhbiBmaXJlIHRoZSBndWFyZHJhaWwKKyAgICAgICAgYXNzZXJ0VmFsaWQoIklOU0VSVCBJTlRPICVzIChrLCBzKSBWQUxVRVMgKCcwJywgJzAnKSIpOworICAgICAgICB0ZXN0VGhyZXNob2xkKCJzIiwgIlVQREFURSAlcyBTRVQgcyA9ID8gV0hFUkUgayA9ICcwJyBJRiBFWElTVFMiKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSAnMCciKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJVUERBVEUgJXMgU0VUIHMgPSA/IFdIRVJFIGsgPSAnMCcgSUYgRVhJU1RTIik7CisKKyAgICAgICAgLy8gcmVndWxhciBjb2x1bW4sIG9ubHkgdGhlIGFwcGxpZWQgQ0FTIHVwZGF0ZXMgY2FuIGZpcmUgdGhlIGd1YXJkcmFpbAorICAgICAgICBhc3NlcnRWYWxpZCgiSU5TRVJUIElOVE8gJXMgKGssIGMpIFZBTFVFUyAoJzAnLCAnMCcpIik7CisgICAgICAgIHRlc3RUaHJlc2hvbGQoInYiLCAiVVBEQVRFICVzIFNFVCB2ID0gPyBXSEVSRSBrID0gJzAnIEFORCBjID0gJzAnIElGIEVYSVNUUyIpOworICAgICAgICBhc3NlcnRWYWxpZCgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9ICcwJyBBTkQgYyA9ICcwJyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIlVQREFURSAlcyBTRVQgdiA9ID8gV0hFUkUgayA9ICcwJyBBTkQgYyA9ICcwJyBJRiBFWElTVFMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDQVNXaXRoQ29sdW1uc0NvbmRpdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgaW50IFBSSU1BUlkgS0VZLCB2IHRleHQpIik7CisKKyAgICAgICAgLy8gdXBkYXRlcyBhcmUgYWx3YXlzIGFjY2VwdGVkIGZvciB2YWx1ZXMgbGVzc2VyIHRoYW4gdGhlIHRocmVzaG9sZCwgaW5kZXBlbmRlbnRseSBvZiB3aGV0aGVyIHRoZXkgYXJlIGFwcGxpZWQKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSAwIik7CisgICAgICAgIGFzc2VydFZhbGlkKCJVUERBVEUgJXMgU0VUIHYgPSA/IFdIRVJFIGsgPSAwIElGIHYgPSAnMCciLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydFZhbGlkKCJVUERBVEUgJXMgU0VUIHYgPSAnMCcgV0hFUkUgayA9IDAiKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIlVQREFURSAlcyBTRVQgdiA9ID8gV0hFUkUgayA9IDAgSUYgdiA9ICcwJyIsIGFsbG9jYXRlKDEpKTsKKworICAgICAgICAvLyB1cGRhdGVzIGFyZSBhbHdheXMgYWNjZXB0ZWQgZm9yIHZhbHVlcyBlcXVhbHMgdG8gdGhlIHRocmVzaG9sZCwgaW5kZXBlbmRlbnRseSBvZiB3aGV0aGVyIHRoZXkgYXJlIGFwcGxpZWQKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkRFTEVURSBGUk9NICVzIFdIRVJFIGsgPSAwIik7CisgICAgICAgIGFzc2VydFZhbGlkKCJVUERBVEUgJXMgU0VUIHYgPSA/IFdIRVJFIGsgPSAwIElGIHYgPSAnMCciLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCkpOworICAgICAgICBhc3NlcnRWYWxpZCgiVVBEQVRFICVzIFNFVCB2ID0gJzAnIFdIRVJFIGsgPSAwIik7CisgICAgICAgIGFzc2VydFZhbGlkKCJVUERBVEUgJXMgU0VUIHYgPSA/IFdIRVJFIGsgPSAwIElGIHYgPSAnMCciLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCkpOworCisgICAgICAgIC8vIHVwZGF0ZXMgYmV5b25kIHRoZSB0aHJlc2hvbGQgZmFpbCBvbmx5IGlmIHRoZSB1cGRhdGUgaXMgYXBwbGllZAorICAgICAgICBhc3NlcnRWYWxpZCgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IDAiKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIlVQREFURSAlcyBTRVQgdiA9ID8gV0hFUkUgayA9IDAgSUYgdiA9ICcwJyIsIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEICsgMSkpOworICAgICAgICBhc3NlcnRWYWxpZCgiVVBEQVRFICVzIFNFVCB2ID0gJzAnIFdIRVJFIGsgPSAwIik7CisgICAgICAgIGFzc2VydFdhcm5zKCJ2IiwgIlVQREFURSAlcyBTRVQgdiA9ID8gV0hFUkUgayA9IDAgSUYgdiA9ICcwJyIsIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEICsgMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGsgdGV4dCwgYyB0ZXh0LCByIHRleHQsIHMgdGV4dCBTVEFUSUMsIFBSSU1BUlkgS0VZKGssIGMpKSIpOworCisgICAgICAgIC8vIHRoZSBndWFyZGFpbCBpcyBvbmx5IGNoZWNrZWQgZm9yIHdyaXRlczsgcmVhZHMgYXJlIGV4Y2x1ZGVkCisKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIGsgPSA/Iik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBrID0gJzAnIEFORCBjID0gPyIpOworICAgICAgICB0ZXN0Tm9UaHJlc2hvbGQoIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgYyA9ID8gQUxMT1cgRklMVEVSSU5HIik7CisgICAgICAgIHRlc3ROb1RocmVzaG9sZCgiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBzID0gPyBBTExPVyBGSUxURVJJTkciKTsKKyAgICAgICAgdGVzdE5vVGhyZXNob2xkKCJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHIgPSA/IEFMTE9XIEZJTFRFUklORyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIG1heCBjb2x1bW4gc2l6ZSBndWFyZHJhaWwgdGhyZXNob2xkIGlzIG5vdCBhcHBsaWVkIGZvciB0aGUgc3BlY2lmaWVkIDEtcGxhY2Vob2xkZXIgQ1FMIHF1ZXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIHF1ZXJ5IGEgQ1FMIG1vZGlmaWNhdGlvbiBzdGF0ZW1lbnQgd2l0aCBleGFjdGx5IG9uZSBwbGFjZWhvbGRlcgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0ZXN0Tm9UaHJlc2hvbGQoU3RyaW5nIHF1ZXJ5KSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoMSkpOworCisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgKyAxKSk7CisKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZShGQUlMX1RIUkVTSE9MRCArIDEpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IHRoZSBtYXggY29sdW1uIHNpemUgZ3VhcmRyYWlsIHRocmVzaG9sZCBpcyBub3QgYXBwbGllZCBmb3IgdGhlIHNwZWNpZmllZCAyLXBsYWNlaG9sZGVyIENRTCBxdWVyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBxdWVyeSBhIENRTCBtb2RpZmljYXRpb24gc3RhdGVtZW50IHdpdGggZXhhY3RseSB0d28gcGxhY2Vob2xkZXJzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRlc3ROb1RocmVzaG9sZDIoU3RyaW5nIHF1ZXJ5KSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoMSksIGFsbG9jYXRlKDEpKTsKKworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQpLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZSgxKSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIGFsbG9jYXRlKChXQVJOX1RIUkVTSE9MRCkpLCBhbGxvY2F0ZSgoV0FSTl9USFJFU0hPTEQpKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCArIDEpLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZSgxKSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgKyAxKSk7CisKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEKSwgYWxsb2NhdGUoMSkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoMSksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZSgoRkFJTF9USFJFU0hPTEQpKSwgYWxsb2NhdGUoKEZBSUxfVEhSRVNIT0xEKSkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoRkFJTF9USFJFU0hPTEQgKyAxKSwgYWxsb2NhdGUoMSkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoMSksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEICsgMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIG1heCBjb2x1bW4gc2l6ZSBndWFyZHJhaWwgdGhyZXNob2xkIGlzIGFwcGxpZWQgZm9yIHRoZSBzcGVjaWZpZWQgMS1wbGFjZWhvbGRlciBDUUwgcXVlcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gcmVmZXJlbmNlZCBieSB0aGUgcXVlcnkgcGxhY2Vob2xkZXIKKyAgICAgKiBAcGFyYW0gcXVlcnkgIGEgQ1FMIHF1ZXJ5IHdpdGggZXhhY3RseSBvbmUgcGxhY2Vob2xkZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdGVzdFRocmVzaG9sZChTdHJpbmcgY29sdW1uLCBTdHJpbmcgcXVlcnkpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRlc3RUaHJlc2hvbGQoY29sdW1uLCBxdWVyeSwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB0aGUgbWF4IGNvbHVtbiBzaXplIGd1YXJkcmFpbCB0aHJlc2hvbGQgaXMgYXBwbGllZCBmb3IgdGhlIHNwZWNpZmllZCAxLXBsYWNlaG9sZGVyIENRTCBxdWVyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2x1bW4gICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiByZWZlcmVuY2VkIGJ5IHRoZSBxdWVyeSBwbGFjZWhvbGRlcgorICAgICAqIEBwYXJhbSBxdWVyeSAgICAgICAgICAgICAgYSBDUUwgcXVlcnkgd2l0aCBleGFjdGx5IG9uZSBwbGFjZWhvbGRlcgorICAgICAqIEBwYXJhbSBzZXJpYWxpemF0aW9uQnl0ZXMgdGhlIGV4dHJhIGJ5dGVzIGFkZGVkIHRvIHRoZSBwbGFjZWhvbGRlciB2YWx1ZSBieSBpdHMgd3JhcHBpbmcgY29sdW1uIHR5cGUgc2VyaWFsaXplcgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0ZXN0VGhyZXNob2xkKFN0cmluZyBjb2x1bW4sIFN0cmluZyBxdWVyeSwgaW50IHNlcmlhbGl6YXRpb25CeXRlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgaW50IHdhcm4gPSBXQVJOX1RIUkVTSE9MRCAtIHNlcmlhbGl6YXRpb25CeXRlczsKKyAgICAgICAgaW50IGZhaWwgPSBGQUlMX1RIUkVTSE9MRCAtIHNlcmlhbGl6YXRpb25CeXRlczsKKworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUoMCkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUod2FybikpOworICAgICAgICBhc3NlcnRXYXJucyhjb2x1bW4sIHF1ZXJ5LCBhbGxvY2F0ZSh3YXJuICsgMSkpOworICAgICAgICBhc3NlcnRGYWlscyhjb2x1bW4sIHF1ZXJ5LCBhbGxvY2F0ZShmYWlsICsgMSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIG1heCBjb2x1bW4gc2l6ZSBndWFyZHJhaWwgdGhyZXNob2xkIGlzIGFwcGxpZWQgZm9yIHRoZSBzcGVjaWZpZWQgMi1wbGFjZWhvbGRlciBDUUwgcXVlcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gcmVmZXJlbmNlZCBieSB0aGUgcGxhY2Vob2xkZXJzCisgICAgICogQHBhcmFtIHF1ZXJ5ICBhIENRTCBxdWVyeSB3aXRoIGV4YWN0bHkgdHdvIHBsYWNlaG9sZGVycworICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0ZXN0VGhyZXNob2xkMihTdHJpbmcgY29sdW1uLCBTdHJpbmcgcXVlcnkpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHRlc3RUaHJlc2hvbGQyKGNvbHVtbiwgcXVlcnksIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgdGhlIG1heCBjb2x1bW4gc2l6ZSBndWFyZHJhaWwgdGhyZXNob2xkIGlzIGFwcGxpZWQgZm9yIHRoZSBzcGVjaWZpZWQgMi1wbGFjZWhvbGRlciBxdWVyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2x1bW4gICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiByZWZlcmVuY2VkIGJ5IHRoZSBwbGFjZWhvbGRlcnMKKyAgICAgKiBAcGFyYW0gcXVlcnkgICAgICAgICAgICAgIGEgQ1FMIHF1ZXJ5IHdpdGggZXhhY3RseSB0d28gcGxhY2Vob2xkZXJzCisgICAgICogQHBhcmFtIHNlcmlhbGl6YXRpb25CeXRlcyB0aGUgZXh0cmEgYnl0ZXMgYWRkZWQgdG8gdGhlIHNpemUgb2YgdGhlIHBsYWNlaG9sZGVyIHZhbHVlIGJ5IHRoZWlyIHdyYXBwaW5nIHNlcmlhbGl6ZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdGVzdFRocmVzaG9sZDIoU3RyaW5nIGNvbHVtbiwgU3RyaW5nIHF1ZXJ5LCBpbnQgc2VyaWFsaXphdGlvbkJ5dGVzKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBpbnQgd2FybiA9IFdBUk5fVEhSRVNIT0xEIC0gc2VyaWFsaXphdGlvbkJ5dGVzOworICAgICAgICBpbnQgZmFpbCA9IEZBSUxfVEhSRVNIT0xEIC0gc2VyaWFsaXphdGlvbkJ5dGVzOworCisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZSgwKSwgYWxsb2NhdGUoMCkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgYWxsb2NhdGUod2FybiksIGFsbG9jYXRlKDApKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIGFsbG9jYXRlKDApLCBhbGxvY2F0ZSh3YXJuKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBhbGxvY2F0ZSh3YXJuIC8gMiksIGFsbG9jYXRlKHdhcm4gLyAyKSk7CisKKyAgICAgICAgYXNzZXJ0V2FybnMoY29sdW1uLCBxdWVyeSwgYWxsb2NhdGUod2FybiArIDEpLCBhbGxvY2F0ZSgwKSk7CisgICAgICAgIGFzc2VydFdhcm5zKGNvbHVtbiwgcXVlcnksIGFsbG9jYXRlKDApLCBhbGxvY2F0ZSh3YXJuICsgMSkpOworCisgICAgICAgIGFzc2VydEZhaWxzKGNvbHVtbiwgcXVlcnksIGFsbG9jYXRlKGZhaWwgKyAxKSwgYWxsb2NhdGUoMCkpOworICAgICAgICBhc3NlcnRGYWlscyhjb2x1bW4sIHF1ZXJ5LCBhbGxvY2F0ZSgwKSwgYWxsb2NhdGUoZmFpbCArIDEpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdENvbGxlY3Rpb24oU3RyaW5nIGNvbHVtbiwgU3RyaW5nIHF1ZXJ5LCBGdW5jdGlvbjxCeXRlQnVmZmVyW10sIEJ5dGVCdWZmZXI+IGNvbGxlY3Rpb25CdWlsZGVyKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgY29sbGVjdGlvbkJ1aWxkZXIsIGFsbG9jYXRlKDEpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIGNvbGxlY3Rpb25CdWlsZGVyLCBhbGxvY2F0ZSgxKSwgYWxsb2NhdGUoMSkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgY29sbGVjdGlvbkJ1aWxkZXIsIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlciwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQpLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlciwgYWxsb2NhdGUoMSksIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlciwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQpLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCkpOworCisgICAgICAgIGFzc2VydFdhcm5zKGNvbHVtbiwgcXVlcnksIGNvbGxlY3Rpb25CdWlsZGVyLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCArIDEpKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoY29sdW1uLCBxdWVyeSwgY29sbGVjdGlvbkJ1aWxkZXIsIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEICsgMSksIGFsbG9jYXRlKDEpKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoY29sdW1uLCBxdWVyeSwgY29sbGVjdGlvbkJ1aWxkZXIsIGFsbG9jYXRlKDEpLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCArIDEpKTsKKworICAgICAgICBhc3NlcnRGYWlscyhjb2x1bW4sIHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlciwgYWxsb2NhdGUoRkFJTF9USFJFU0hPTEQgKyAxKSk7CisgICAgICAgIGFzc2VydEZhaWxzKGNvbHVtbiwgcXVlcnksIGNvbGxlY3Rpb25CdWlsZGVyLCBhbGxvY2F0ZShGQUlMX1RIUkVTSE9MRCArIDEpLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydEZhaWxzKGNvbHVtbiwgcXVlcnksIGNvbGxlY3Rpb25CdWlsZGVyLCBhbGxvY2F0ZSgxKSwgYWxsb2NhdGUoRkFJTF9USFJFU0hPTEQgKyAxKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RGcm96ZW5Db2xsZWN0aW9uKFN0cmluZyBjb2x1bW4sIFN0cmluZyBxdWVyeSwgRnVuY3Rpb248Qnl0ZUJ1ZmZlcltdLCBCeXRlQnVmZmVyPiBjb2xsZWN0aW9uQnVpbGRlcikgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIGNvbGxlY3Rpb25CdWlsZGVyLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlciwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSA4KSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlciwgYWxsb2NhdGUoKFdBUk5fVEhSRVNIT0xEIC0gMTIpIC8gMiksIGFsbG9jYXRlKChXQVJOX1RIUkVTSE9MRCAtIDEyKSAvIDIpKTsKKworICAgICAgICBhc3NlcnRXYXJucyhjb2x1bW4sIHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlciwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQgLSA3KSk7CisgICAgICAgIGFzc2VydFdhcm5zKGNvbHVtbiwgcXVlcnksIGNvbGxlY3Rpb25CdWlsZGVyLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCAtIDEyKSwgYWxsb2NhdGUoMSkpOworCisgICAgICAgIGFzc2VydEZhaWxzKGNvbHVtbiwgcXVlcnksIGNvbGxlY3Rpb25CdWlsZGVyLCBhbGxvY2F0ZShGQUlMX1RIUkVTSE9MRCAtIDcpKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoY29sdW1uLCBxdWVyeSwgY29sbGVjdGlvbkJ1aWxkZXIsIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEIC0gMTIpLCBhbGxvY2F0ZSgxKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RNYXAoU3RyaW5nIGNvbHVtbiwgU3RyaW5nIHF1ZXJ5KSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgdGhpczo6bWFwLCBhbGxvY2F0ZSgxKSwgYWxsb2NhdGUoMSkpOworICAgICAgICBhc3NlcnRWYWxpZChxdWVyeSwgdGhpczo6bWFwLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCksIGFsbG9jYXRlKDEpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQocXVlcnksIHRoaXM6Om1hcCwgYWxsb2NhdGUoMSksIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydFZhbGlkKHF1ZXJ5LCB0aGlzOjptYXAsIGFsbG9jYXRlKFdBUk5fVEhSRVNIT0xEKSwgYWxsb2NhdGUoV0FSTl9USFJFU0hPTEQpKTsKKworICAgICAgICBhc3NlcnRXYXJucyhjb2x1bW4sIHF1ZXJ5LCB0aGlzOjptYXAsIGFsbG9jYXRlKDEpLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCArIDEpKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoY29sdW1uLCBxdWVyeSwgdGhpczo6bWFwLCBhbGxvY2F0ZShXQVJOX1RIUkVTSE9MRCArIDEpLCBhbGxvY2F0ZSgxKSk7CisKKyAgICAgICAgYXNzZXJ0RmFpbHMoY29sdW1uLCBxdWVyeSwgdGhpczo6bWFwLCBhbGxvY2F0ZShGQUlMX1RIUkVTSE9MRCArIDEpLCBhbGxvY2F0ZSgxKSk7CisgICAgICAgIGFzc2VydEZhaWxzKGNvbHVtbiwgcXVlcnksIHRoaXM6Om1hcCwgYWxsb2NhdGUoMSksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEICsgMSkpOworICAgICAgICBhc3NlcnRGYWlscyhjb2x1bW4sIHF1ZXJ5LCB0aGlzOjptYXAsIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEICsgMSksIGFsbG9jYXRlKEZBSUxfVEhSRVNIT0xEICsgMSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRWYWxpZChTdHJpbmcgcXVlcnksIEJ5dGVCdWZmZXIuLi4gdmFsdWVzKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBleGVjdXRlKHF1ZXJ5LCB2YWx1ZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0VmFsaWQoU3RyaW5nIHF1ZXJ5LCBGdW5jdGlvbjxCeXRlQnVmZmVyW10sIEJ5dGVCdWZmZXI+IGNvbGxlY3Rpb25CdWlsZGVyLCBCeXRlQnVmZmVyLi4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0VmFsaWQoKCkgLT4gZXhlY3V0ZShxdWVyeSwgY29sbGVjdGlvbkJ1aWxkZXIuYXBwbHkodmFsdWVzKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRXYXJucyhTdHJpbmcgY29sdW1uLCBTdHJpbmcgcXVlcnksIEZ1bmN0aW9uPEJ5dGVCdWZmZXJbXSwgQnl0ZUJ1ZmZlcj4gY29sbGVjdGlvbkJ1aWxkZXIsIEJ5dGVCdWZmZXIuLi4gdmFsdWVzKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRXYXJucyhjb2x1bW4sIHF1ZXJ5LCBjb2xsZWN0aW9uQnVpbGRlci5hcHBseSh2YWx1ZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0V2FybnMoU3RyaW5nIGNvbHVtbiwgU3RyaW5nIHF1ZXJ5LCBCeXRlQnVmZmVyLi4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZSA9IGZvcm1hdCgiVmFsdWUgb2YgY29sdW1uICVzIGhhcyBzaXplICVzLCB0aGlzIGV4Y2VlZHMgdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLCBXQVJOX1RIUkVTSE9MRCArIDEsIFdBUk5fVEhSRVNIT0xEKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoKCkgLT4gZXhlY3V0ZShxdWVyeSwgdmFsdWVzKSwgZXJyb3JNZXNzYWdlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RmFpbHMoU3RyaW5nIGNvbHVtbiwgU3RyaW5nIHF1ZXJ5LCBGdW5jdGlvbjxCeXRlQnVmZmVyW10sIEJ5dGVCdWZmZXI+IGNvbGxlY3Rpb25CdWlsZGVyLCBCeXRlQnVmZmVyLi4uIHZhbHVlcykgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmFpbHMoY29sdW1uLCBxdWVyeSwgY29sbGVjdGlvbkJ1aWxkZXIuYXBwbHkodmFsdWVzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEZhaWxzKFN0cmluZyBjb2x1bW4sIFN0cmluZyBxdWVyeSwgQnl0ZUJ1ZmZlci4uLiB2YWx1ZXMpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBmb3JtYXQoIlZhbHVlIG9mIGNvbHVtbiAlcyBoYXMgc2l6ZSAlcywgdGhpcyBleGNlZWRzIHRoZSBmYWlsdXJlIHRocmVzaG9sZCBvZiAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiwgRkFJTF9USFJFU0hPTEQgKyAxLCBGQUlMX1RIUkVTSE9MRCk7CisgICAgICAgIGFzc2VydEZhaWxzKCgpIC0+IGV4ZWN1dGUocXVlcnksIHZhbHVlcyksIGVycm9yTWVzc2FnZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoU3RyaW5nIHF1ZXJ5LCBCeXRlQnVmZmVyLi4uIHZhbHVlcykKKyAgICB7CisgICAgICAgIGV4ZWN1dGUodXNlckNsaWVudFN0YXRlLCBxdWVyeSwgQXJyYXlzLmFzTGlzdCh2YWx1ZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXIgc2V0KEJ5dGVCdWZmZXIuLi4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFNldFR5cGUuZ2V0SW5zdGFuY2UoQnl0ZXNUeXBlLmluc3RhbmNlLCB0cnVlKS5kZWNvbXBvc2UoSW1tdXRhYmxlU2V0LmNvcHlPZih2YWx1ZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXIgbGlzdChCeXRlQnVmZmVyLi4uIHZhbHVlcykKKyAgICB7CisgICAgICAgIHJldHVybiBMaXN0VHlwZS5nZXRJbnN0YW5jZShCeXRlc1R5cGUuaW5zdGFuY2UsIHRydWUpLmRlY29tcG9zZShJbW11dGFibGVMaXN0LmNvcHlPZih2YWx1ZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXIgbWFwKEJ5dGVCdWZmZXIuLi4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHZhbHVlcy5sZW5ndGggJSAyID09IDA7CisKKyAgICAgICAgaW50IHNpemUgPSB2YWx1ZXMubGVuZ3RoIC8gMjsKKyAgICAgICAgTWFwPEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXI+IG0gPSBuZXcgTGlua2VkSGFzaE1hcDw+KHNpemUpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIG0ucHV0KHZhbHVlc1syICogaV0sIHZhbHVlc1soMiAqIGkpICsgMV0pOworCisgICAgICAgIHJldHVybiBNYXBUeXBlLmdldEluc3RhbmNlKEJ5dGVzVHlwZS5pbnN0YW5jZSwgQnl0ZXNUeXBlLmluc3RhbmNlLCB0cnVlKS5kZWNvbXBvc2UobSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsRHJvcEtleXNwYWNlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsRHJvcEtleXNwYWNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNDQ3MjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxEcm9wS2V5c3BhY2VUZXN0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgR3VhcmRyYWlsRHJvcEtleXNwYWNlVGVzdCBleHRlbmRzIEd1YXJkcmFpbFRlc3RlcgoreworICAgIHByaXZhdGUgU3RyaW5nIGtleXNwYWNlUXVlcnkgPSAiQ1JFQVRFIEtFWVNQQUNFIGRrZHQgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJyA6IDF9IjsKKworICAgIHByaXZhdGUgdm9pZCBzZXRHdWFyZHJhaWwoYm9vbGVhbiBlbmFibGVkKQorICAgIHsKKyAgICAgICAgR3VhcmRyYWlscy5pbnN0YW5jZS5zZXREcm9wS2V5c3BhY2VFbmFibGVkKGVuYWJsZWQpOworICAgIH0KKworICAgIHB1YmxpYyBHdWFyZHJhaWxEcm9wS2V5c3BhY2VUZXN0KCkKKyAgICB7CisgICAgICAgIHN1cGVyKEd1YXJkcmFpbHMuZHJvcEtleXNwYWNlRW5hYmxlZCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgc2V0R3VhcmRyYWlsKHRydWUpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIElGIEVYSVNUUyBka2R0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuRHJvcFdoaWxlRmVhdHVyZUVuYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwodHJ1ZSk7CisgICAgICAgIGNyZWF0ZUtleXNwYWNlKGtleXNwYWNlUXVlcnkpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIGRrZHQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5ub3REcm9wV2hpbGVGZWF0dXJlRGlzYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwoZmFsc2UpOworICAgICAgICBjcmVhdGVLZXlzcGFjZShrZXlzcGFjZVF1ZXJ5KTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkRST1AgS0VZU1BBQ0UgZGtkdCIsICJEUk9QIEtFWVNQQUNFIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGFsbG93ZWQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJZkV4aXN0c0RvZXNOb3RCeXBhc3NDaGVjaygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHNldEd1YXJkcmFpbChmYWxzZSk7CisgICAgICAgIGNyZWF0ZUtleXNwYWNlKGtleXNwYWNlUXVlcnkpOworICAgICAgICBhc3NlcnRGYWlscygiRFJPUCBLRVlTUEFDRSBJRiBFWElTVFMgZGtkdCIsICJEUk9QIEtFWVNQQUNFIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGFsbG93ZWQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb2dnbGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwoZmFsc2UpOworICAgICAgICBjcmVhdGVLZXlzcGFjZShrZXlzcGFjZVF1ZXJ5KTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkRST1AgS0VZU1BBQ0UgSUYgRVhJU1RTIGRrZHQiLCAiRFJPUCBLRVlTUEFDRSBmdW5jdGlvbmFsaXR5IGlzIG5vdCBhbGxvd2VkIik7CisKKyAgICAgICAgc2V0R3VhcmRyYWlsKHRydWUpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIGRrZHQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1YWMyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5BYnN0cmFjdEVuZHBvaW50U25pdGNoOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSUVuZHBvaW50U25pdGNoOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmVwbGljYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFdhcm47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworCitwdWJsaWMgY2xhc3MgR3VhcmRyYWlsTWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yVGVzdCBleHRlbmRzIFRocmVzaG9sZFRlc3RlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCA9IDI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElTQUJMRURfR1VBUkRSQUlMID0gLTE7CisKKyAgICBwdWJsaWMgR3VhcmRyYWlsTWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yVGVzdCgpCisgICAgeworICAgICAgICBzdXBlcihNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCwKKyAgICAgICAgICAgICAgTUFYSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHMubWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yLAorICAgICAgICAgICAgICBHdWFyZHJhaWxzOjpzZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldE1heGltdW1SZXBsaWNhdGlvbkZhY3Rvcldhcm5UaHJlc2hvbGQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvckZhaWxUaHJlc2hvbGQpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIGNsZWFudXBUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZXhlY3V0ZSgiRFJPUCBLRVlTUEFDRSBJRiBFWElTVFMga3MiKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldERlZmF1bHRLZXlzcGFjZVJGKDEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBsb25nIGN1cnJlbnRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gTG9uZy5wYXJzZUxvbmcoKEtleXNwYWNlLm9wZW4oImtzIikuZ2V0UmVwbGljYXRpb25TdHJhdGVneSgpKS5jb25maWdPcHRpb25zLmdldCgiZGF0YWNlbnRlcjEiKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXRXYXJuaW5ncygpCisgICAgeworICAgICAgICBMaXN0PFN0cmluZz4gd2FybmluZ3MgPSBDbGllbnRXYXJuLmluc3RhbmNlLmdldFdhcm5pbmdzKCk7CisKKyAgICAgICAgLy8gZmlsdGVyaW5nIG91dCBub24tZ3VhcmRyYWlscyBwcm9kdWNlZCB3YXJuaW5ncworICAgICAgICByZXR1cm4gd2FybmluZ3MgPT0gbnVsbAorICAgICAgICAgICAgICAgPyBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKQorICAgICAgICAgICAgICAgOiB3YXJuaW5ncy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodyAtPiAhdy5jb250YWlucygia2V5c3BhY2Uga3MgaXMgaGlnaGVyIHRoYW4gdGhlIG51bWJlciBvZiBub2RlcyAxIGZvciBkYXRhY2VudGVyMSIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF3LmNvbnRhaW5zKCJXaGVuIGluY3JlYXNpbmcgcmVwbGljYXRpb24gZmFjdG9yIHlvdSBuZWVkIHRvIHJ1biBhIGZ1bGwgKC1mdWxsKSByZXBhaXIgdG8gZGlzdHJpYnV0ZSB0aGUgZGF0YSIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF3LmNvbnRhaW5zKCJrZXlzcGFjZSBrcyBpcyBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyIG9mIG5vZGVzIikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXcuY29udGFpbnMoIllvdXIgcmVwbGljYXRpb24gZmFjdG9yIDMgZm9yIGtleXNwYWNlIGtzIGlzIGhpZ2hlciB0aGFuIHRoZSBudW1iZXIgb2Ygbm9kZXMgMiBmb3IgZGF0YWNlbnRlciBkYXRhY2VudGVyMiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1heEtleXNwYWNlUkZEaXNhYmxlZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoRElTQUJMRURfR1VBUkRSQUlMLCBESVNBQkxFRF9HVUFSRFJBSUwpOworICAgICAgICBhc3NlcnRNYXhUaHJlc2hvbGRWYWxpZCgiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDZ9Iik7CisgICAgICAgIGFzc2VydE1heFRocmVzaG9sZFZhbGlkKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMTB9Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU3RyYXRlZ3lDcmVhdGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBndWFyZHJhaWxzKCkuc2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xELCBNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9GQUlMX1RIUkVTSE9MRCk7CisgICAgICAgIGFzc2VydFdhcm5zKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6IDN9IiwgMyk7CisgICAgICAgIGV4ZWN1dGUoIkRST1AgS0VZU1BBQ0UgSUYgRVhJU1RTIGtzIik7CisgICAgICAgIGFzc2VydEZhaWxzKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6IDV9IiwgNSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU3RyYXRlZ3lBbHRlcigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUFYSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKKyAgICAgICAgZXhlY3V0ZSgiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InOiAyfSIpOworICAgICAgICBhc3NlcnRXYXJucygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6IDN9IiwgMyk7CisgICAgICAgIGFzc2VydEZhaWxzKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogNX0iLCA1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZURhdGFjZW50ZXIoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBJRW5kcG9pbnRTbml0Y2ggc25pdGNoID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldEVuZHBvaW50U25pdGNoKCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRFbmRwb2ludFNuaXRjaChuZXcgQWJzdHJhY3RFbmRwb2ludFNuaXRjaCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBQ0sxID0gU2VydmVyVGVzdFV0aWxzLlJBQ0sxOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmFjayhJbmV0QWRkcmVzc0FuZFBvcnQgZW5kcG9pbnQpIHsgcmV0dXJuIFJBQ0sxOyB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXREYXRhY2VudGVyKEluZXRBZGRyZXNzQW5kUG9ydCBlbmRwb2ludCkgeyByZXR1cm4gImRhdGFjZW50ZXIyIjsgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZUVuZHBvaW50cyhJbmV0QWRkcmVzc0FuZFBvcnQgdGFyZ2V0LCBSZXBsaWNhIGExLCBSZXBsaWNhIGEyKSB7IHJldHVybiAwOyB9CisgICAgICAgIH0pOworCisgICAgICAgIExpc3Q8U3RyaW5nPiB0d29XYXJuaW5ncyA9IEFycmF5cy5hc0xpc3QoZm9ybWF0KCJUaGUga2V5c3BhY2Uga3MgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDMsIGFib3ZlIHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiAlcy4iLCBNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJUaGUga2V5c3BhY2Uga3MgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDMsIGFib3ZlIHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiAlcy4iLCBNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCkpOworCisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKS51cGRhdGVIb3N0SWQoVVVJRC5yYW5kb21VVUlEKCksIEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoIjEyNy4wLjAuMjU1IikpOworICAgICAgICBndWFyZHJhaWxzKCkuc2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xELCBNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9GQUlMX1RIUkVTSE9MRCk7CisgICAgICAgIGFzc2VydFZhbGlkKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDIsICdkYXRhY2VudGVyMicgOiAyfSIpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIElGIEVYSVNUUyBrcyIpOworICAgICAgICBhc3NlcnRXYXJucygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDIsICdkYXRhY2VudGVyMicgOiAzfSIsIDMpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIElGIEVYSVNUUyBrcyIpOworICAgICAgICBhc3NlcnRXYXJucygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAzLCAnZGF0YWNlbnRlcjInIDogM30iLCB0d29XYXJuaW5ncyk7CisgICAgICAgIGV4ZWN1dGUoIkRST1AgS0VZU1BBQ0UgSUYgRVhJU1RTIGtzIik7CisgICAgICAgIGFzc2VydEZhaWxzKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDIsICdkYXRhY2VudGVyMicgOiA1fSIsIDUpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIElGIEVYSVNUUyBrcyIpOworICAgICAgICBhc3NlcnRGYWlscygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiA1LCAnZGF0YWNlbnRlcjInIDogNX0iLCA1KTsKKyAgICAgICAgZXhlY3V0ZSgiRFJPUCBLRVlTUEFDRSBJRiBFWElTVFMga3MiKTsKKworICAgICAgICBleGVjdXRlKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDEsICdkYXRhY2VudGVyMicgOiAxfSIpOworICAgICAgICBhc3NlcnRWYWxpZCgiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDIsICdkYXRhY2VudGVyMicgOiAyfSIpOworICAgICAgICBhc3NlcnRXYXJucygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDIsICdkYXRhY2VudGVyMicgOiAzfSIsIDMpOworICAgICAgICBhc3NlcnRXYXJucygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDMsICdkYXRhY2VudGVyMicgOiAzfSIsIHR3b1dhcm5pbmdzKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAyLCAnZGF0YWNlbnRlcjInIDogNX0iLCA1KTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiA1LCAnZGF0YWNlbnRlcjInIDogNX0iLCA1KTsKKworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RW5kcG9pbnRTbml0Y2goc25pdGNoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhLZXlzcGFjZVJGT25seVdhcm5CZWxvdygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUFYSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIERJU0FCTEVEX0dVQVJEUkFJTCk7CisgICAgICAgIGFzc2VydE1heFRocmVzaG9sZFZhbGlkKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMn0iKTsKKyAgICAgICAgYXNzZXJ0TWF4VGhyZXNob2xkVmFsaWQoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDF9Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4S2V5c3BhY2VSRk9ubHlXYXJuQWJvdmUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBndWFyZHJhaWxzKCkuc2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xELCBESVNBQkxFRF9HVUFSRFJBSUwpOworICAgICAgICBhc3NlcnRXYXJucygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDN9IiwgMyk7CisgICAgICAgIGFzc2VydFdhcm5zKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiA0fSIsIDQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1heEtleXNwYWNlUkZPbmx5RmFpbEJlbG93KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZChESVNBQkxFRF9HVUFSRFJBSUwsIE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKKyAgICAgICAgYXNzZXJ0TWF4VGhyZXNob2xkVmFsaWQoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAyfSIpOworICAgICAgICBhc3NlcnRNYXhUaHJlc2hvbGRWYWxpZCgiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogM30iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhLZXlzcGFjZVJGT25seUZhaWxBYm92ZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoRElTQUJMRURfR1VBUkRSQUlMLCBNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9GQUlMX1RIUkVTSE9MRCk7CisgICAgICAgIGFzc2VydEZhaWxzKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogNX0iLCA1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhLZXlzcGFjZVJGT25seUZhaWxBYm92ZUFsdGVyKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZChESVNBQkxFRF9HVUFSRFJBSUwsIE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKKyAgICAgICAgZXhlY3V0ZSgiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDN9Iik7CisgICAgICAgIGFzc2VydEZhaWxzKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiA2fSIsIDYpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1heEtleXNwYWNlUkZXYXJuQmVsb3coKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBndWFyZHJhaWxzKCkuc2V0TWF4aW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xELCBNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9GQUlMX1RIUkVTSE9MRCk7CisgICAgICAgIGFzc2VydE1heFRocmVzaG9sZFZhbGlkKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMX0iKTsKKyAgICAgICAgYXNzZXJ0TWF4VGhyZXNob2xkVmFsaWQoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDJ9Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4S2V5c3BhY2VSRldhcm5GYWlsQmV0d2VlbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNYXhpbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUFYSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAzfSIsIDMpOworICAgICAgICBhc3NlcnRXYXJucygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogNH0iLCA0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhLZXlzcGFjZVJGRmFpbEFib3ZlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZChNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCwgTUFYSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpOworICAgICAgICBhc3NlcnRGYWlscygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDV9IiwgNSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4S2V5c3BhY2VSRkZhaWxBYm92ZUFsdGVyKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZChNQVhJTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCwgTUFYSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpOworICAgICAgICBleGVjdXRlKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogNH0iKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDV9IiwgNSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4UkZMZXNzZXJUaGFuRGVmYXVsdFJGKCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREZWZhdWx0S2V5c3BhY2VSRigzKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gZ3VhcmRyYWlscygpLnNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZCgxLCAyKSkKKyAgICAgICAgICAgICAgICAgIC5pc0luc3RhbmNlT2YoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJtYXhpbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZCB0byBiZSBzZXQgKDIpIGNhbm5vdCBiZSBsZXNzZXIgdGhhbiBkZWZhdWx0X2tleXNwYWNlX3JmICgzKSIpOworCisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREZWZhdWx0S2V5c3BhY2VSRigxKTsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldE1heGltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZCgxLCAyKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gRGF0YWJhc2VEZXNjcmlwdG9yLnNldERlZmF1bHRLZXlzcGFjZVJGKDMpKQorICAgICAgICAgICAgICAgICAgLmlzSW5zdGFuY2VPZihJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoImRlZmF1bHRfa2V5c3BhY2VfcmYgdG8gYmUgc2V0ICgzKSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIG1heGltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkICgyKSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRXYXJucyhTdHJpbmcgcXVlcnksIGludCByZikgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0V2FybnMocXVlcnksIGZvcm1hdCgiVGhlIGtleXNwYWNlIGtzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAlZCwgYWJvdmUgdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmYsIE1BWElNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xEKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEZhaWxzKFN0cmluZyBxdWVyeSwgaW50IHJmKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBhc3NlcnRGYWlscyhxdWVyeSwgZm9ybWF0KCJUaGUga2V5c3BhY2Uga3MgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mICVkLCBhYm92ZSB0aGUgZmFpbHVyZSB0aHJlc2hvbGQgb2YgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZiwgTUFYSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxNYXhpbXVtVGltZXN0YW1wVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsTWF4aW11bVRpbWVzdGFtcFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWMzMWFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsTWF4aW11bVRpbWVzdGFtcFRlc3QuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRHVyYXRpb25TcGVjOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2xpZW50U3RhdGU7CisKK3B1YmxpYyBjbGFzcyBHdWFyZHJhaWxNYXhpbXVtVGltZXN0YW1wVGVzdCBleHRlbmRzIFRocmVzaG9sZFRlc3RlcgoreworICAgIHB1YmxpYyBHdWFyZHJhaWxNYXhpbXVtVGltZXN0YW1wVGVzdCgpCisgICAgeworICAgICAgICBzdXBlcihUaW1lVW5pdC5EQVlTLnRvU2Vjb25kcygxKSArICJzIiwKKyAgICAgICAgICAgICAgVGltZVVuaXQuREFZUy50b1NlY29uZHMoMikgKyAicyIsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHMubWF4aW11bUFsbG93YWJsZVRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgR3VhcmRyYWlsczo6c2V0TWF4aW11bVRpbWVzdGFtcFRocmVzaG9sZCwKKyAgICAgICAgICAgICAgR3VhcmRyYWlsczo6Z2V0TWF4aW11bVRpbWVzdGFtcFdhcm5UaHJlc2hvbGQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldE1heGltdW1UaW1lc3RhbXBGYWlsVGhyZXNob2xkLAorICAgICAgICAgICAgICBtaWNyb3MgLT4gbmV3IER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQobWljcm9zLCBUaW1lVW5pdC5NSUNST1NFQ09ORFMpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgIG1pY3JvcyAtPiBuZXcgRHVyYXRpb25TcGVjLkxvbmdNaWNyb3NlY29uZHNCb3VuZChtaWNyb3MpLnRvTWljcm9zZWNvbmRzKCkpOworICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cFRlc3QoKQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTICVzIChrIGludCBwcmltYXJ5IGtleSwgdiBpbnQpIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRBbGxvd3NBbnlUaW1lc3RhbXAoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBndWFyZHJhaWxzKCkuc2V0TWF4aW11bVRpbWVzdGFtcFRocmVzaG9sZChudWxsLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDIsIDIpIFVTSU5HIFRJTUVTVEFNUCAiICsgKExvbmcuTUFYX1ZBTFVFIC0gMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZWRGYWlsKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDIsIDIpIFVTSU5HIFRJTUVTVEFNUCAiICsgKExvbmcuTUFYX1ZBTFVFIC0gMSksICJtYXhpbXVtX3RpbWVzdGFtcCB2aW9sYXRlZCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZWRJblJhbmdlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDEsIDEpIFVTSU5HIFRJTUVTVEFNUCAiICsgQ2xpZW50U3RhdGUuZ2V0VGltZXN0YW1wKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZWRXYXJuKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0V2FybnMoIklOU0VSVCBJTlRPICVzIChrLCB2KSBWQUxVRVMgKDEsIDEpIFVTSU5HIFRJTUVTVEFNUCAiICsgIChDbGllbnRTdGF0ZS5nZXRUaW1lc3RhbXAoKSArIChUaW1lVW5pdC5EQVlTLnRvTWljcm9zKDEpICsgNDAwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgIm1heGltdW1fdGltZXN0YW1wIHZpb2xhdGVkIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsTWluaW11bVJlcGxpY2F0aW9uRmFjdG9yVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsTWluaW11bVJlcGxpY2F0aW9uRmFjdG9yVGVzdC5qYXZhCmluZGV4IGQzZGY5ODMuLjg4MTdmOWEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbE1pbmltdW1SZXBsaWNhdGlvbkZhY3RvclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUZXN0LmphdmEKQEAgLTg5LDYgKzg5LDcgQEAKICAgICB7CiAgICAgICAgIExpc3Q8U3RyaW5nPiB3YXJuaW5ncyA9IENsaWVudFdhcm4uaW5zdGFuY2UuZ2V0V2FybmluZ3MoKTsKIAorICAgICAgICAvLyBmaWx0ZXJpbmcgb3V0IG5vbi1ndWFyZHJhaWxzIHByb2R1Y2VkIHdhcm5pbmdzCiAgICAgICAgIHJldHVybiB3YXJuaW5ncyA9PSBudWxsCiAgICAgICAgICAgICAgICA/IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpCiAgICAgICAgICAgICAgICA6IHdhcm5pbmdzLnN0cmVhbSgpCkBAIC0xMzIsMTMgKzEzMywyMSBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVN0cmF0ZWd5KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTdHJhdGVneUNyZWF0ZSgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKLSAgICAgICAgYXNzZXJ0V2FybnMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogM30iLAotICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlRoZSBrZXlzcGFjZSAlcyBoYXMgYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgMywgYmVsb3cgdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICVzLiIsIEtTLCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCkpOwotICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6IDF9IiwKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJUaGUga2V5c3BhY2UgJXMgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDEsIGJlbG93IHRoZSBmYWlsdXJlIHRocmVzaG9sZCBvZiAlcy4iLCBLUywgTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogM30iLCAzKTsKKyAgICAgICAgZXhlY3V0ZSgiRFJPUCBLRVlTUEFDRSBJRiBFWElTVFMga3MiKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogMX0iLCAxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTdHJhdGVneUFsdGVyKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldE1pbmltdW1SZXBsaWNhdGlvbkZhY3RvclRocmVzaG9sZChNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCwgTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpOworICAgICAgICBleGVjdXRlKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5JywgJ3JlcGxpY2F0aW9uX2ZhY3Rvcic6IDR9Iik7CisgICAgICAgIGFzc2VydFdhcm5zKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogM30iLCAzKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InOiAxfSIsIDEpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNjEsMTcgKzE3MCwyNiBAQAogCiAgICAgICAgIExpc3Q8U3RyaW5nPiB0d29XYXJuaW5ncyA9IEFycmF5cy5hc0xpc3QoZm9ybWF0KCJUaGUga2V5c3BhY2UgJXMgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDIsIGJlbG93IHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiAlZC4iLCBLUywgTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiVGhlIGtleXNwYWNlICVzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAyLCBiZWxvdyB0aGUgd2FybmluZyB0aHJlc2hvbGQgb2YgJWQuIiwgS1MsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xEKSk7Ci0gICAgICAgIAorCiAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKS51cGRhdGVIb3N0SWQoVVVJRC5yYW5kb21VVUlEKCksIEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoIjEyNy4wLjAuMjU1IikpOwogICAgICAgICBndWFyZHJhaWxzKCkuc2V0TWluaW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xELCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9GQUlMX1RIUkVTSE9MRCk7Ci0gICAgICAgIGFzc2VydFZhbGlkKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDQsICdkYXRhY2VudGVyMicgOiA0IH07Iik7Ci0gICAgICAgIGFzc2VydFdhcm5zKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogNCwgJ2RhdGFjZW50ZXIyJyA6IDIgfTsiLAotICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlRoZSBrZXlzcGFjZSAlcyBoYXMgYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgMiwgYmVsb3cgdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICVkLiIsIEtTLCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCkpOwotICAgICAgICBhc3NlcnRXYXJucygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDIsICdkYXRhY2VudGVyMicgOiAyIH07IiwgdHdvV2FybmluZ3MpOwotICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDQsICdkYXRhY2VudGVyMicgOiAxIH07IiwKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJUaGUga2V5c3BhY2UgJXMgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDEsIGJlbG93IHRoZSBmYWlsdXJlIHRocmVzaG9sZCBvZiAlZC4iLCBLUywgTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpKTsKLSAgICAgICAgYXNzZXJ0RmFpbHMoIkNSRUFURSBLRVlTUEFDRSBrczEgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDEsICdkYXRhY2VudGVyMicgOiAxIH07IiwKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJUaGUga2V5c3BhY2Uga3MxIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAxLCBiZWxvdyB0aGUgZmFpbHVyZSB0aHJlc2hvbGQgb2YgJWQuIiwgTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogNCwgJ2RhdGFjZW50ZXIyJyA6IDQgfSIpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIElGIEVYSVNUUyBrcyIpOworICAgICAgICBhc3NlcnRXYXJucygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiA0LCAnZGF0YWNlbnRlcjInIDogMiB9IiwgMik7CisgICAgICAgIGV4ZWN1dGUoIkRST1AgS0VZU1BBQ0UgSUYgRVhJU1RTIGtzIik7CisgICAgICAgIGFzc2VydFdhcm5zKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDIsICdkYXRhY2VudGVyMicgOiAyIH0iLCB0d29XYXJuaW5ncyk7CisgICAgICAgIGV4ZWN1dGUoIkRST1AgS0VZU1BBQ0UgSUYgRVhJU1RTIGtzIik7CisgICAgICAgIGFzc2VydEZhaWxzKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDQsICdkYXRhY2VudGVyMicgOiAxIH0iLCAxKTsKKyAgICAgICAgZXhlY3V0ZSgiRFJPUCBLRVlTUEFDRSBJRiBFWElTVFMga3MiKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMSwgJ2RhdGFjZW50ZXIyJyA6IDEgfSIsIDEpOworICAgICAgICBleGVjdXRlKCJEUk9QIEtFWVNQQUNFIElGIEVYSVNUUyBrcyIpOworCisgICAgICAgIGV4ZWN1dGUoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogNSwgJ2RhdGFjZW50ZXIyJyA6IDV9Iik7CisgICAgICAgIGFzc2VydFZhbGlkKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnIDogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogNCwgJ2RhdGFjZW50ZXIyJyA6IDQgfSIpOworICAgICAgICBhc3NlcnRXYXJucygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDQsICdkYXRhY2VudGVyMicgOiAyIH0iLCAyKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAyLCAnZGF0YWNlbnRlcjInIDogMiB9IiwgdHdvV2FybmluZ3MpOworICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDQsICdkYXRhY2VudGVyMicgOiAxIH0iLCAxKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAxLCAnZGF0YWNlbnRlcjInIDogMSB9IiwgMSk7CiAKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldEVuZHBvaW50U25pdGNoKHNuaXRjaCk7CiAgICAgICAgIGV4ZWN1dGUoIkRST1AgS0VZU1BBQ0UgSUYgRVhJU1RTIGtzMSIpOwpAQCAtMTg5LDEwICsyMDcsOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5LZXlzcGFjZVJGT25seVdhcm5CZWxvdygpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIERJU0FCTEVEX0dVQVJEUkFJTCk7Ci0gICAgICAgIGFzc2VydFdhcm5zKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogM30iLAotICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlRoZSBrZXlzcGFjZSAlcyBoYXMgYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgMywgYmVsb3cgdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICVzLiIsIEtTLCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCkpOwotICAgICAgICBhc3NlcnRXYXJucygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMn0iLAotICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlRoZSBrZXlzcGFjZSAlcyBoYXMgYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgMiwgYmVsb3cgdGhlIHdhcm5pbmcgdGhyZXNob2xkIG9mICVzLiIsIEtTLCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCkpOworICAgICAgICBhc3NlcnRXYXJucygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDN9IiwgMyk7CisgICAgICAgIGFzc2VydFdhcm5zKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAyfSIsIDIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMDcsOCArMjIzLDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWluS2V5c3BhY2VSRk9ubHlGYWlsQmVsb3coKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBndWFyZHJhaWxzKCkuc2V0TWluaW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKERJU0FCTEVEX0dVQVJEUkFJTCwgTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpOwotICAgICAgICBhc3NlcnRGYWlscygiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDF9IiwKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJUaGUga2V5c3BhY2UgJXMgaGFzIGEgcmVwbGljYXRpb24gZmFjdG9yIG9mIDEsIGJlbG93IHRoZSBmYWlsdXJlIHRocmVzaG9sZCBvZiAlcy4iLCBLUywgTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfRkFJTF9USFJFU0hPTEQpKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAxfSIsIDEpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMTYsOCArMjMxLDcgQEAKICAgICB7CiAgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoRElTQUJMRURfR1VBUkRSQUlMLCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9GQUlMX1RIUkVTSE9MRCk7CiAgICAgICAgIGV4ZWN1dGUoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAzfSIpOwotICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMX0iLAotICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlRoZSBrZXlzcGFjZSAlcyBoYXMgYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgMSwgYmVsb3cgdGhlIGZhaWx1cmUgdGhyZXNob2xkIG9mICVzLiIsIEtTLCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9GQUlMX1RIUkVTSE9MRCkpOworICAgICAgICBhc3NlcnRGYWlscygiQUxURVIgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMX0iLCAxKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjMyLDE4ICsyNDYsMTUgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWluS2V5c3BhY2VSRldhcm5GYWlsQmV0d2VlbigpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKLSAgICAgICAgYXNzZXJ0V2FybnMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAzfSIsCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiVGhlIGtleXNwYWNlICVzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAzLCBiZWxvdyB0aGUgd2FybmluZyB0aHJlc2hvbGQgb2YgJXMuIiwgS1MsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xEKSk7Ci0gICAgICAgIGFzc2VydFdhcm5zKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAyfSIsCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiVGhlIGtleXNwYWNlICVzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAyLCBiZWxvdyB0aGUgd2FybmluZyB0aHJlc2hvbGQgb2YgJXMuIiwgS1MsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX1dBUk5fVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydFdhcm5zKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogM30iLCAzKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoIkFMVEVSIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDJ9IiwgMik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWluS2V5c3BhY2VSRkZhaWxCZWxvdygpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKLSAgICAgICAgYXNzZXJ0RmFpbHMoIkNSRUFURSBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAxfSIsCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiVGhlIGtleXNwYWNlICVzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAxLCBiZWxvdyB0aGUgZmFpbHVyZSB0aHJlc2hvbGQgb2YgJXMuIiwgS1MsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydEZhaWxzKCJDUkVBVEUgS0VZU1BBQ0Uga3MgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJzogJ05ldHdvcmtUb3BvbG9neVN0cmF0ZWd5JywgJ2RhdGFjZW50ZXIxJzogMX0iLCAxKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMjUxLDI2ICsyNjIsMzMgQEAKICAgICB7CiAgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKICAgICAgICAgZXhlY3V0ZSgiQ1JFQVRFIEtFWVNQQUNFIGtzIFdJVEggcmVwbGljYXRpb24gPSB7ICdjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6IDR9Iik7Ci0gICAgICAgIGFzc2VydEZhaWxzKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAxfSIsCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiVGhlIGtleXNwYWNlICVzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAxLCBiZWxvdyB0aGUgZmFpbHVyZSB0aHJlc2hvbGQgb2YgJXMuIiwgS1MsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKSk7CisgICAgICAgIGFzc2VydEZhaWxzKCJBTFRFUiBLRVlTUEFDRSBrcyBXSVRIIHJlcGxpY2F0aW9uID0geyAnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOiAxfSIsIDEpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1pblJGR3JlYXRlclRoYW5EZWZhdWx0UkYoKQogICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXREZWZhdWx0S2V5c3BhY2VSRigxKTsKLSAgICAgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoTUlOSU1VTV9SRVBMSUNBVElPTl9GQUNUT1JfV0FSTl9USFJFU0hPTEQsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZE1lc3NhZ2UgPSAiIjsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldERlZmF1bHRLZXlzcGFjZVJGKDMpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBndWFyZHJhaWxzKCkuc2V0TWluaW11bVJlcGxpY2F0aW9uRmFjdG9yVGhyZXNob2xkKDUsIDQpKQorICAgICAgICAgICAgICAgICAgLmlzSW5zdGFuY2VPZihJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIm1pbmltdW1fcmVwbGljYXRpb25fZmFjdG9yX2ZhaWxfdGhyZXNob2xkIHRvIGJlIHNldCAoNCkgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBkZWZhdWx0X2tleXNwYWNlX3JmICgzKSIpOwogCi0gICAgICAgICAgICBpZihndWFyZHJhaWxzKCkuZ2V0TWluaW11bVJlcGxpY2F0aW9uRmFjdG9yRmFpbFRocmVzaG9sZCgpID4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldERlZmF1bHRLZXlzcGFjZVJGKCkpCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWRNZXNzYWdlID0gZm9ybWF0KCIlc19mYWlsX3RocmVzaG9sZCB0byBiZSBzZXQgKCVkKSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGRlZmF1bHRfa2V5c3BhY2VfcmYgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdIQVQsIGd1YXJkcmFpbHMoKS5nZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JGYWlsVGhyZXNob2xkKCksIERhdGFiYXNlRGVzY3JpcHRvci5nZXREZWZhdWx0S2V5c3BhY2VSRigpKTsKLSAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChlLmdldE1lc3NhZ2UoKSkuY29udGFpbnMoZXhwZWN0ZWRNZXNzYWdlKTsKLSAgICAgICAgfQorICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0RGVmYXVsdEtleXNwYWNlUkYoNik7CisgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRNaW5pbXVtUmVwbGljYXRpb25GYWN0b3JUaHJlc2hvbGQoNSwgNCk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IERhdGFiYXNlRGVzY3JpcHRvci5zZXREZWZhdWx0S2V5c3BhY2VSRigzKSkKKyAgICAgICAgICAgICAgICAgIC5pc0luc3RhbmNlT2YoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJkZWZhdWx0X2tleXNwYWNlX3JmIHRvIGJlIHNldCAoMykgY2Fubm90IGJlIGxlc3MgdGhhbiBtaW5pbXVtX3JlcGxpY2F0aW9uX2ZhY3Rvcl9mYWlsX3RocmVzaG9sZCAoNCkiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0V2FybnMoU3RyaW5nIHF1ZXJ5LCBpbnQgcmYpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdhcm5zKHF1ZXJ5LCBmb3JtYXQoIlRoZSBrZXlzcGFjZSBrcyBoYXMgYSByZXBsaWNhdGlvbiBmYWN0b3Igb2YgJWQsIGJlbG93IHRoZSB3YXJuaW5nIHRocmVzaG9sZCBvZiAlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJmLCBNSU5JTVVNX1JFUExJQ0FUSU9OX0ZBQ1RPUl9XQVJOX1RIUkVTSE9MRCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRGYWlscyhTdHJpbmcgcXVlcnksIGludCByZikgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgYXNzZXJ0RmFpbHMocXVlcnksIGZvcm1hdCgiVGhlIGtleXNwYWNlIGtzIGhhcyBhIHJlcGxpY2F0aW9uIGZhY3RvciBvZiAlZCwgYmVsb3cgdGhlIGZhaWx1cmUgdGhyZXNob2xkIG9mICVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmYsIE1JTklNVU1fUkVQTElDQVRJT05fRkFDVE9SX0ZBSUxfVEhSRVNIT0xEKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsTWluaW11bVRpbWVzdGFtcFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbE1pbmltdW1UaW1lc3RhbXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcxNjlmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbE1pbmltdW1UaW1lc3RhbXBUZXN0LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5ndWFyZHJhaWxzOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOworCitwdWJsaWMgY2xhc3MgR3VhcmRyYWlsTWluaW11bVRpbWVzdGFtcFRlc3QgZXh0ZW5kcyBUaHJlc2hvbGRUZXN0ZXIKK3sKKyAgICBwdWJsaWMgR3VhcmRyYWlsTWluaW11bVRpbWVzdGFtcFRlc3QoKQorICAgIHsKKyAgICAgICAgc3VwZXIoVGltZVVuaXQuREFZUy50b1NlY29uZHMoMSkgKyAicyIsCisgICAgICAgICAgICAgIFRpbWVVbml0LkRBWVMudG9TZWNvbmRzKDIpICsgInMiLAorICAgICAgICAgICAgICBHdWFyZHJhaWxzLm1pbmltdW1BbGxvd2FibGVUaW1lc3RhbXAsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OnNldE1pbmltdW1UaW1lc3RhbXBUaHJlc2hvbGQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldE1pbmltdW1UaW1lc3RhbXBXYXJuVGhyZXNob2xkLAorICAgICAgICAgICAgICBHdWFyZHJhaWxzOjpnZXRNaW5pbXVtVGltZXN0YW1wRmFpbFRocmVzaG9sZCwKKyAgICAgICAgICAgICAgbWljcm9zIC0+IG5ldyBEdXJhdGlvblNwZWMuTG9uZ01pY3Jvc2Vjb25kc0JvdW5kKG1pY3JvcywgVGltZVVuaXQuTUlDUk9TRUNPTkRTKS50b1N0cmluZygpLAorICAgICAgICAgICAgICBtaWNyb3MgLT4gbmV3IER1cmF0aW9uU3BlYy5Mb25nTWljcm9zZWNvbmRzQm91bmQobWljcm9zKS50b01pY3Jvc2Vjb25kcygpKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXBUZXN0KCkKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAlcyAoayBpbnQgcHJpbWFyeSBrZXksIHYgaW50KSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVkKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldE1pbmltdW1UaW1lc3RhbXBUaHJlc2hvbGQobnVsbCwgbnVsbCk7CisgICAgICAgIGFzc2VydFZhbGlkKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgxLCAxKSBVU0lORyBUSU1FU1RBTVAgMTIzNDUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVkRmFpbHVyZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydEZhaWxzKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgxLCAxKSBVU0lORyBUSU1FU1RBTVAgMTIzNDUiLCAibWluaW11bV90aW1lc3RhbXAgdmlvbGF0ZWQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVkSW5SYW5nZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFZhbGlkKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgxLCAxKSBVU0lORyBUSU1FU1RBTVAgIiArIENsaWVudFN0YXRlLmdldFRpbWVzdGFtcCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVkV2FybigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFdhcm5zKCJJTlNFUlQgSU5UTyAlcyAoaywgdikgVkFMVUVTICgxLCAxKSBVU0lORyBUSU1FU1RBTVAgIiArICAoQ2xpZW50U3RhdGUuZ2V0VGltZXN0YW1wKCkgLSAoVGltZVVuaXQuREFZUy50b01pY3JvcygxKSArIDQwMDAwKSksCisgICAgICAgICAgICAgICAgICAgICJtaW5pbXVtX3RpbWVzdGFtcCB2aW9sYXRlZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbFBhcnRpdGlvblNpemVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxQYXJ0aXRpb25TaXplVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDgzOTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxQYXJ0aXRpb25TaXplVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YVN0b3JhZ2VTcGVjOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworCitpbXBvcnQgc3RhdGljIGphdmEubmlvLkJ5dGVCdWZmZXIuYWxsb2NhdGU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWMuRGF0YVN0b3JhZ2VVbml0LkJZVEVTOworCisvKioKKyAqIFRlc3RzIHRoZSBndWFyZHJhaWwgZm9yIHRoZSBzaXplIG9mIHBhcnRpdGlvbnMsIHtAbGluayBHdWFyZHJhaWxzI3BhcnRpdGlvblNpemV9LgorICogPHA+CisgKiBUaGUgZW1pc3Npb24gb24gdW5yZWRhY3RlZCBsb2cgbWVzc2FnZXMgaXMgdGVzdGVkIGluIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC50ZXN0Lmd1YXJkcmFpbHMuR3VhcmRyYWlsUGFydGl0aW9uU2l6ZVRlc3R9LgorICovCitwdWJsaWMgY2xhc3MgR3VhcmRyYWlsUGFydGl0aW9uU2l6ZVRlc3QgZXh0ZW5kcyBUaHJlc2hvbGRUZXN0ZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FSTl9USFJFU0hPTEQgPSAxMDI0ICogMTAyNDsgLy8gYnl0ZXMgKDEgTWlCKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGQUlMX1RIUkVTSE9MRCA9IFdBUk5fVEhSRVNIT0xEICogMjsgLy8gYnl0ZXMgKDIgTWlCKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fQ0xVU1RFUklOR1MgPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVEQUNURURfTUVTU0FHRSA9ICJHdWFyZHJhaWwgcGFydGl0aW9uX3NpemUgdmlvbGF0ZWQ6IFBhcnRpdGlvbiA8cmVkYWN0ZWQ+IGhhcyBzaXplIjsKKworICAgIHB1YmxpYyBHdWFyZHJhaWxQYXJ0aXRpb25TaXplVGVzdCgpCisgICAgeworICAgICAgICBzdXBlcihXQVJOX1RIUkVTSE9MRCArICJCIiwKKyAgICAgICAgICAgICAgRkFJTF9USFJFU0hPTEQgKyAiQiIsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHMucGFydGl0aW9uU2l6ZSwKKyAgICAgICAgICAgICAgR3VhcmRyYWlsczo6c2V0UGFydGl0aW9uU2l6ZVRocmVzaG9sZCwKKyAgICAgICAgICAgICAgR3VhcmRyYWlsczo6Z2V0UGFydGl0aW9uU2l6ZVdhcm5UaHJlc2hvbGQsCisgICAgICAgICAgICAgIEd1YXJkcmFpbHM6OmdldFBhcnRpdGlvblNpemVGYWlsVGhyZXNob2xkLAorICAgICAgICAgICAgICBieXRlcyAtPiBuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kKGJ5dGVzLCBCWVRFUykudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgc2l6ZSAtPiBuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kKHNpemUpLnRvQnl0ZXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGl0aW9uU2l6ZUVuYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBJbnNlcnQgZW5vdWdoIGRhdGEgdG8gdHJpZ2dlciB0aGUgd2FybmluZyBndWFyZHJhaWwsIGJ1dCBub3QgdGhlIGZhaWx1cmUgb25lLgorICAgICAgICBwb3B1bGF0ZVRhYmxlKFdBUk5fVEhSRVNIT0xEKTsKKworICAgICAgICBmbHVzaCgpOworICAgICAgICBsaXN0ZW5lci5hc3NlcnRXYXJuZWQoUkVEQUNURURfTUVTU0FHRSk7CisgICAgICAgIGxpc3RlbmVyLmNsZWFyKCk7CisKKyAgICAgICAgY29tcGFjdCgpOworICAgICAgICBsaXN0ZW5lci5hc3NlcnRXYXJuZWQoUkVEQUNURURfTUVTU0FHRSk7CisgICAgICAgIGxpc3RlbmVyLmNsZWFyKCk7CisKKyAgICAgICAgLy8gSW5zZXJ0IGVub3VnaCBkYXRhIHRvIHRyaWdnZXIgdGhlIGZhaWx1cmUgZ3VhcmRyYWlsLgorICAgICAgICBwb3B1bGF0ZVRhYmxlKEZBSUxfVEhSRVNIT0xEKTsKKworICAgICAgICBmbHVzaCgpOworICAgICAgICBsaXN0ZW5lci5hc3NlcnRGYWlsZWQoUkVEQUNURURfTUVTU0FHRSk7CisgICAgICAgIGxpc3RlbmVyLmNsZWFyKCk7CisKKyAgICAgICAgY29tcGFjdCgpOworICAgICAgICBsaXN0ZW5lci5hc3NlcnRGYWlsZWQoUkVEQUNURURfTUVTU0FHRSk7CisgICAgICAgIGxpc3RlbmVyLmNsZWFyKCk7CisKKyAgICAgICAgLy8gcmVtb3ZlIG1vc3Qgb2YgdGhlIGRhdGEgdG8gYmUgdW5kZXIgdGhlIHRocmVzaG9sZCBhZ2FpbgorICAgICAgICBhc3NlcnRWYWxpZCgiREVMRVRFIEZST00gJXMgV0hFUkUgayA9IDEgQU5EIGMgPiAwIik7CisKKyAgICAgICAgZmx1c2goKTsKKyAgICAgICAgbGlzdGVuZXIuYXNzZXJ0Tm90V2FybmVkKCk7CisgICAgICAgIGxpc3RlbmVyLmFzc2VydE5vdEZhaWxlZCgpOworCisgICAgICAgIGNvbXBhY3QoKTsKKyAgICAgICAgbGlzdGVuZXIuYXNzZXJ0Tm90V2FybmVkKCk7CisgICAgICAgIGxpc3RlbmVyLmFzc2VydE5vdEZhaWxlZCgpOworICAgICAgICBsaXN0ZW5lci5jbGVhcigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnRpdGlvblNpemVEaXNhYmxlZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGd1YXJkcmFpbHMoKS5zZXRQYXJ0aXRpb25TaXplVGhyZXNob2xkKG51bGwsIG51bGwpOworCisgICAgICAgIHBvcHVsYXRlVGFibGUoRkFJTF9USFJFU0hPTEQpOworCisgICAgICAgIGZsdXNoKCk7CisgICAgICAgIGxpc3RlbmVyLmFzc2VydE5vdFdhcm5lZCgpOworICAgICAgICBsaXN0ZW5lci5hc3NlcnROb3RGYWlsZWQoKTsKKworICAgICAgICBjb21wYWN0KCk7CisgICAgICAgIGxpc3RlbmVyLmFzc2VydE5vdFdhcm5lZCgpOworICAgICAgICBsaXN0ZW5lci5hc3NlcnROb3RGYWlsZWQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVUYWJsZShpbnQgdGhyZXNob2xkKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJXMgKGsgaW50LCBjIGludCwgdiBibG9iLCBQUklNQVJZIEtFWShrLCBjKSkiKTsKKyAgICAgICAgZGlzYWJsZUNvbXBhY3Rpb24oKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9DTFVTVEVSSU5HUzsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBpbnQgYyA9IGk7CisgICAgICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBleGVjdXRlKHVzZXJDbGllbnRTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPICVzIChrLCBjLCB2KSBWQUxVRVMgKDEsID8sID8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKGMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlKHRocmVzaG9sZCAvIE5VTV9DTFVTVEVSSU5HUykpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxTaW1wbGVTdHJhdGVneVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbFNpbXBsZVN0cmF0ZWd5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYzZiYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxTaW1wbGVTdHJhdGVneVRlc3QuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBHdWFyZHJhaWxTaW1wbGVTdHJhdGVneVRlc3QgZXh0ZW5kcyBHdWFyZHJhaWxUZXN0ZXIKK3sKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9NU0cgPSAiU2ltcGxlU3RyYXRlZ3kgaXMgbm90IGFsbG93ZWQiOworCisgICAgcHVibGljIEd1YXJkcmFpbFNpbXBsZVN0cmF0ZWd5VGVzdCgpCisgICAgeworICAgICAgICBzdXBlcihHdWFyZHJhaWxzLnNpbXBsZVN0cmF0ZWd5RW5hYmxlZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldEd1YXJkcmFpbChib29sZWFuIGVuYWJsZWQpCisgICAgeworICAgICAgICBndWFyZHJhaWxzKCkuc2V0U2ltcGxlU3RyYXRlZ3lFbmFibGVkKGVuYWJsZWQpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIGFmdGVyVGVzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHNldEd1YXJkcmFpbCh0cnVlKTsKKyAgICAgICAgZXhlY3V0ZSgiRFJPUCBLRVlTUEFDRSBJRiBFWElTVFMgdGVzdF9zczsiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5DcmVhdGVXaXRoR3VhcmRyYWlsRW5hYmxlZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGFzc2VydFZhbGlkKCJDUkVBVEUgS0VZU1BBQ0UgdGVzdF9zcyBXSVRIIHJlcGxpY2F0aW9uID0geydjbGFzcyc6ICdTaW1wbGVTdHJhdGVneSd9OyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbkFsdGVyV2l0aEd1YXJkcmFpbEVuYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBleGVjdXRlKCJDUkVBVEUgS0VZU1BBQ0UgdGVzdF9zcyBXSVRIIHJlcGxpY2F0aW9uID0geydjbGFzcyc6ICdOZXR3b3JrVG9wb2xvZ3lTdHJhdGVneScsICdkYXRhY2VudGVyMSc6MiwgJ2RhdGFjZW50ZXIyJzowfTsiKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkFMVEVSIEtFWVNQQUNFIHRlc3Rfc3MgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knfTsiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHdWFyZHJhaWxCbG9ja3NDcmVhdGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWlscygiQ1JFQVRFIEtFWVNQQUNFIHRlc3Rfc3MgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knfTsiLCBFUlJPUl9NU0cpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEd1YXJkcmFpbEJsb2Nrc0FsdGVyKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgc2V0R3VhcmRyYWlsKGZhbHNlKTsKKyAgICAgICAgZXhlY3V0ZSgiQ1JFQVRFIEtFWVNQQUNFIHRlc3Rfc3MgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOjIsICdkYXRhY2VudGVyMic6MH07Iik7CisgICAgICAgIGFzc2VydEZhaWxzKCJBTFRFUiBLRVlTUEFDRSB0ZXN0X3NzIFdJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5J307IiwgRVJST1JfTVNHKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb2dnbGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBzZXRHdWFyZHJhaWwoZmFsc2UpOworICAgICAgICBhc3NlcnRGYWlscygiQ1JFQVRFIEtFWVNQQUNFIHRlc3Rfc3MgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knfTsiLCBFUlJPUl9NU0cpOworCisgICAgICAgIHNldEd1YXJkcmFpbCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkNSRUFURSBLRVlTUEFDRSB0ZXN0X3NzIFdJVEggcmVwbGljYXRpb24gPSB7J2NsYXNzJzogJ1NpbXBsZVN0cmF0ZWd5J307Iik7CisgICAgICAgIGV4ZWN1dGUoIkFMVEVSIEtFWVNQQUNFIHRlc3Rfc3MgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnTmV0d29ya1RvcG9sb2d5U3RyYXRlZ3knLCAnZGF0YWNlbnRlcjEnOjIsICdkYXRhY2VudGVyMic6MH07Iik7CisKKyAgICAgICAgc2V0R3VhcmRyYWlsKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoIkFMVEVSIEtFWVNQQUNFIHRlc3Rfc3MgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knfTsiLCBFUlJPUl9NU0cpOworCisgICAgICAgIHNldEd1YXJkcmFpbCh0cnVlKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoIkFMVEVSIEtFWVNQQUNFIHRlc3Rfc3MgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knfTsiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxUZXN0ZXIuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbFRlc3Rlci5qYXZhCmluZGV4IDdjOTQ3MDIuLmYyNzQ0YWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbFRlc3Rlci5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbFRlc3Rlci5qYXZhCkBAIC02Nyw2ICs2NywxOCBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAorLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHNwZWNpZmljIHV0aWxpdHkgbWV0aG9kcyBmb3IgdGVzdGluZyBHdWFyZHJhaWxzIHRoYXQgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgcHJvdmlkZWQKKyAqIHtAbGluayBDUUxUZXN0ZXJ9IG1ldGhvZHMuIE1hbnkgb2YgdGhlIG1ldGhvZHMgaW4gQ1FMVGVzdGVyIGRvbid0IHJlc3BlY3QgdGhlIHtAbGluayBDbGllbnRTdGF0ZX0gcHJvdmlkZWQgZm9yIGEgcXVlcnkKKyAqIGFuZCBpbnN0ZWFkIHVzZSB7QGxpbmsgQ2xpZW50U3RhdGUjZm9ySW50ZXJuYWxDYWxscygpfSB3aGljaCBmbGFncyBhcyBhbiBpbnRlcm5hbCBxdWVyeSBhbmQgdGh1cyBieXBhc3NlcyBhdXRoIGFuZAorICogZ3VhcmRyYWlsIGNoZWNrcy4KKyAqCisgKiBTb21lIEd1YXJkcmFpbFRlc3RlciBtZXRob2RzIGFuZCB0aGVpciB1c2FnZSBpcyBhcyBmb2xsb3dzOgorICogICAgICB7QGxpbmsgR3VhcmRyYWlsVGVzdGVyI2Fzc2VydFZhbGlkKFN0cmluZyl9IHRvIGNvbmZpcm0gdGhlIHF1ZXJ5IGFzIHN0cnVjdHVyZWQgaXMgdmFsaWQgZ2l2ZW4gdGhlIHN0YXRlIG9mIHRoZSBkYgorICogICAgICB7QGxpbmsgR3VhcmRyYWlsVGVzdGVyI2Fzc2VydFdhcm5zKFN0cmluZywgU3RyaW5nKX0gdG8gY29uZmlybSBhIHF1ZXJ5IHN1Y2NlZWRzIGJ1dCB3YXJucyB0aGUgdGV4dCBwcm92aWRlZAorICogICAgICB7QGxpbmsgR3VhcmRyYWlsVGVzdGVyI2Fzc2VydEZhaWxzKFN0cmluZywgU3RyaW5nKX0gdG8gY29uZmlybSBhIHF1ZXJ5IGZhaWxzIHdpdGggdGhlIG1lc3NhZ2UgcHJvdmlkZWQKKyAqICAgICAge0BsaW5rIEd1YXJkcmFpbFRlc3RlciN0ZXN0RXhjbHVkZWRVc2Vyc30gdG8gY29uZmlybSBzdXBlcnVzZXJzIGFyZSBleGNsdWRlZCBmcm9tIGFwcGxpY2F0aW9uIG9mIHRoZSBndWFyZHJhaWwKKyAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIEd1YXJkcmFpbFRlc3RlciBleHRlbmRzIENRTFRlc3RlcgogewogICAgIC8vIE5hbWUgdXNlZCB3aGVuIHRlc3RpbmcgQ1JFQVRFIFRBQkxFIHRoYXQgc2hvdWxkIGJlIGFib3J0ZWQgKHdlIG5lZWQgdG8gcHJvdmlkZSBpdCBhcyBhc3NlcnRGYWlscywgd2hpY2gKQEAgLTEwNiw3ICsxMTgsMTUgQEAKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldERpYWdub3N0aWNFdmVudHNFbmFibGVkKHRydWUpOwogCiAgICAgICAgIHN5c3RlbUNsaWVudFN0YXRlID0gQ2xpZW50U3RhdGUuZm9ySW50ZXJuYWxDYWxscygpOworCiAgICAgICAgIHVzZXJDbGllbnRTdGF0ZSA9IENsaWVudFN0YXRlLmZvckV4dGVybmFsQ2FsbHMoSW5ldFNvY2tldEFkZHJlc3MuY3JlYXRlVW5yZXNvbHZlZCgiMTI3LjAuMC4xIiwgMTIzKSk7CisgICAgICAgIEF1dGhlbnRpY2F0ZWRVc2VyIHVzZXIgPSBuZXcgQXV0aGVudGljYXRlZFVzZXIoVVNFUk5BTUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuTG9naW4oKSB7IHJldHVybiB0cnVlOyB9CisgICAgICAgIH07CisgICAgICAgIHVzZXJDbGllbnRTdGF0ZS5sb2dpbih1c2VyKTsKKwogICAgICAgICBzdXBlckNsaWVudFN0YXRlID0gQ2xpZW50U3RhdGUuZm9yRXh0ZXJuYWxDYWxscyhJbmV0U29ja2V0QWRkcmVzcy5jcmVhdGVVbnJlc29sdmVkKCIxMjcuMC4wLjEiLCAzMjEpKTsKICAgICAgICAgc3VwZXJDbGllbnRTdGF0ZS5sb2dpbihuZXcgQXV0aGVudGljYXRlZFVzZXIoQ2Fzc2FuZHJhUm9sZU1hbmFnZXIuREVGQVVMVF9TVVBFUlVTRVJfTkFNRSkpOwogICAgIH0KQEAgLTMxOCw2ICszMzgsMTAgQEAKICAgICAgICAgYXNzZXJ0RmFpbHMoZnVuY3Rpb24sIHRydWUsIG1lc3NhZ2VzLCByZWRhY3RlZE1lc3NhZ2VzKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBVbmxpa2Uge0BsaW5rIENRTFRlc3RlciNhc3NlcnRJbnZhbGlkVGhyb3dNZXNzYWdlfSwgdGhlIGNoYWluIG9mIG1ldGhvZHMgZW5kaW5nIGhlcmUgaW4ge0BsaW5rIEd1YXJkcmFpbFRlc3Rlcn0KKyAgICAgKiByZXNwZWN0IHRoZSBpbnB1dCBDbGllbnRTdGF0ZSBzbyBndWFyZHJhaWxzIHBlcm1pc3Npb25zIHdpbGwgYmUgY29ycmVjdGx5IGNoZWNrZWQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0RmFpbHMoQ2hlY2tlZEZ1bmN0aW9uIGZ1bmN0aW9uLCBib29sZWFuIHRocm93biwgTGlzdDxTdHJpbmc+IG1lc3NhZ2VzLCBMaXN0PFN0cmluZz4gcmVkYWN0ZWRNZXNzYWdlcykgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgQ2xpZW50V2Fybi5pbnN0YW5jZS5jYXB0dXJlV2FybmluZ3MoKTsKQEAgLTMzNyw5ICszNjEsMTcgQEAKIAogICAgICAgICAgICAgaWYgKGd1YXJkcmFpbCAhPSBudWxsKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBndWFyZHJhaWwuZGVjb3JhdGVNZXNzYWdlKCIiKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZvcm1hdCgiRnVsbCBlcnJvciBtZXNzYWdlICclcycgZG9lc24ndCBzdGFydCB3aXRoIHRoZSBwcmVmaXggJyVzJyIsIGUuZ2V0TWVzc2FnZSgpLCBwcmVmaXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aChwcmVmaXgpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBndWFyZHJhaWwuZGVjb3JhdGVNZXNzYWdlKCIiKS5yZXBsYWNlKCIuICIgKyBndWFyZHJhaWwucmVhc29uLCAiIik7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmb3JtYXQoIkZ1bGwgZXJyb3IgbWVzc2FnZSAnJXMnIGRvZXNuJ3Qgc3RhcnQgd2l0aCB0aGUgcHJlZml4ICclcyciLCBtZXNzYWdlLCBwcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdGFydHNXaXRoKHByZWZpeCkpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IGd1YXJkcmFpbC5yZWFzb247CisgICAgICAgICAgICAgICAgaWYgKHJlYXNvbiAhPSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmb3JtYXQoIkZ1bGwgZXJyb3IgbWVzc2FnZSAnJXMnIGRvZXNuJ3QgZW5kIHdpdGggdGhlIHJlYXNvbiAnJXMnIiwgbWVzc2FnZSwgcmVhc29uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmVuZHNXaXRoKHJlYXNvbikpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmb3JtYXQoIkZ1bGwgZXJyb3IgbWVzc2FnZSAnJXMnIGRvZXMgbm90IGNvbnRhaW4gZXhwZWN0ZWQgbWVzc2FnZSAnJXMnIiwgZS5nZXRNZXNzYWdlKCksIGZhaWxNZXNzYWdlKSwKQEAgLTM5Niw5ICs0MjgsMTYgQEAKICAgICAgICAgICAgIFN0cmluZyB3YXJuaW5nID0gd2FybmluZ3MuZ2V0KGkpOwogICAgICAgICAgICAgaWYgKGd1YXJkcmFpbCAhPSBudWxsKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVmaXggPSBndWFyZHJhaWwuZGVjb3JhdGVNZXNzYWdlKCIiKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ3VhcmRyYWlsLmRlY29yYXRlTWVzc2FnZSgiIikucmVwbGFjZSgiLiAiICsgZ3VhcmRyYWlsLnJlYXNvbiwgIiIpOwogICAgICAgICAgICAgICAgIGFzc2VydFRydWUoZm9ybWF0KCJXYXJuaW5nIGxvZyBtZXNzYWdlICclcycgZG9lc24ndCBzdGFydCB3aXRoIHRoZSBwcmVmaXggJyVzJyIsIHdhcm5pbmcsIHByZWZpeCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nLnN0YXJ0c1dpdGgocHJlZml4KSk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcmVhc29uID0gZ3VhcmRyYWlsLnJlYXNvbjsKKyAgICAgICAgICAgICAgICBpZiAocmVhc29uICE9IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZvcm1hdCgiV2FybmluZyBsb2cgbWVzc2FnZSAnJXMnIGRvZXNuJ3QgZW5kIHdpdGggdGhlIHJlYXNvbiAnJXMnIiwgd2FybmluZywgcmVhc29uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nLmVuZHNXaXRoKHJlYXNvbikpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmb3JtYXQoIldhcm5pbmcgbG9nIG1lc3NhZ2UgJyVzJyBkb2VzIG5vdCBjb250YWluIGV4cGVjdGVkIG1lc3NhZ2UgJyVzJyIsIHdhcm5pbmcsIG1lc3NhZ2UpLApAQCAtNDc4LDYgKzUxNywxMCBAQAogICAgICAgICByZXR1cm4gZXhlY3V0ZShzdGF0ZSwgcXVlcnksIG9wdGlvbnMpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGV4ZWN1dGlvbiBvZiBxdWVyeSB1c2luZyB0aGUgaW5wdXQge0BsaW5rIENsaWVudFN0YXRlfSAoaS5lLiB1bmxpa2Uge0BsaW5rIENsaWVudFN0YXRlI2ZvckludGVybmFsQ2FsbHMoKX0KKyAgICAgKiB3aGljaCBtYXkgbm90KSB0byBlbnN1cmUgZ3VhcmRyYWlscyBhcmUgYXBwcm9wcmllYXRlbHkgYXBwbGllZCB0byB0aGUgcXVlcnkgcHJvdmlkZWQuCisgICAgICovCiAgICAgcHJvdGVjdGVkIFJlc3VsdE1lc3NhZ2UgZXhlY3V0ZShDbGllbnRTdGF0ZSBzdGF0ZSwgU3RyaW5nIHF1ZXJ5LCBRdWVyeU9wdGlvbnMgb3B0aW9ucykKICAgICB7CiAgICAgICAgIFF1ZXJ5U3RhdGUgcXVlcnlTdGF0ZSA9IG5ldyBRdWVyeVN0YXRlKHN0YXRlKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbFplcm9EZWZhdWx0VFRMT25UV0NTVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsWmVyb0RlZmF1bHRUVExPblRXQ1NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkMDBlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbFplcm9EZWZhdWx0VFRMT25UV0NTVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmd1YXJkcmFpbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneTsKKworcHVibGljIGNsYXNzIEd1YXJkcmFpbFplcm9EZWZhdWx0VFRMT25UV0NTVGVzdCBleHRlbmRzIEd1YXJkcmFpbFRlc3RlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWSA9ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB0YjEgKGsgaW50IFBSSU1BUlkgS0VZLCBhIGludCwgYiBpbnQpICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSVRIIGRlZmF1bHRfdGltZV90b19saXZlID0gMCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQU5EIGNvbXBhY3Rpb24gPSB7J2NsYXNzJzogJ1RpbWVXaW5kb3dDb21wYWN0aW9uU3RyYXRlZ3knLCAnZW5hYmxlZCc6IHRydWUgfSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURfUVVFUllfMSA9ICJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyB0YjIgKGsgaW50IFBSSU1BUlkgS0VZLCBhIGludCwgYiBpbnQpICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldJVEggZGVmYXVsdF90aW1lX3RvX2xpdmUgPSAxICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFORCBjb21wYWN0aW9uID0geydjbGFzcyc6ICdUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5JywgJ2VuYWJsZWQnOiB0cnVlIH0iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEX1FVRVJZXzIgPSAiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgdGIzIChrIGludCBQUklNQVJZIEtFWSwgYSBpbnQsIGIgaW50KSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXSVRIIGRlZmF1bHRfdGltZV90b19saXZlID0gMCI7CisKKyAgICBwdWJsaWMgR3VhcmRyYWlsWmVyb0RlZmF1bHRUVExPblRXQ1NUZXN0KCkKKyAgICB7CisgICAgICAgIHN1cGVyKEd1YXJkcmFpbHMuemVyb1RUTE9uVFdDU0VuYWJsZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEd1YXJkcmFpbERpc2FibGVkKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgcHJlcGFyZVRlc3QoZmFsc2UsIHRydWUpOworICAgICAgICBhc3NlcnRGYWlscyhRVUVSWSwgIjAgZGVmYXVsdF90aW1lX3RvX2xpdmUgb24gYSB0YWJsZSB3aXRoICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVdpbmRvd0NvbXBhY3Rpb25TdHJhdGVneS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjb21wYWN0aW9uIHN0cmF0ZWd5IGlzIG5vdCBhbGxvd2VkIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3VhcmRyYWlsRW5hYmxlZFdhcm5FbmFibGVkKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgcHJlcGFyZVRlc3QodHJ1ZSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydFdhcm5zKFFVRVJZLCAiMCBkZWZhdWx0X3RpbWVfdG9fbGl2ZSBvbiBhIHRhYmxlIHdpdGggIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5LmNsYXNzLmdldFNpbXBsZU5hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNvbXBhY3Rpb24gc3RyYXRlZ3kgaXMgbm90IHJlY29tbWVuZGVkIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3VhcmRyYWlsRW5hYmxlZFdhcm5EaXNhYmxlZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHByZXBhcmVUZXN0KHRydWUsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoUVVFUlkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEd1YXJkcmFpbE5vdFRyaWdnZXJlZCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHByZXBhcmVUZXN0KHRydWUsIHRydWUpOworICAgICAgICBhc3NlcnRWYWxpZChWQUxJRF9RVUVSWV8xKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoVkFMSURfUVVFUllfMik7CisKKyAgICAgICAgcHJlcGFyZVRlc3QoZmFsc2UsIHRydWUpOworICAgICAgICBhc3NlcnRWYWxpZChWQUxJRF9RVUVSWV8xKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoVkFMSURfUVVFUllfMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjbHVkZWRVc2VycygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGZvciAoYm9vbGVhbiBlbmFibGVkIDogbmV3IGJvb2xlYW5bXSB7IGZhbHNlLCB0cnVlIH0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoYm9vbGVhbiB3YXJuZWQgOiBuZXcgYm9vbGVhbltdeyBmYWxzZSwgdHJ1ZSB9KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByZXBhcmVUZXN0KGVuYWJsZWQsIHdhcm5lZCk7CisgICAgICAgICAgICAgICAgdGVzdEV4Y2x1ZGVkVXNlcnMoKCkgLT4gUVVFUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gVkFMSURfUVVFUllfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSAtPiBWQUxJRF9RVUVSWV8yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcmVwYXJlVGVzdChib29sZWFuIGVuYWJsZWQsIGJvb2xlYW4gd2FybmVkKQorICAgIHsKKyAgICAgICAgZ3VhcmRyYWlscygpLnNldFplcm9UVExPblRXQ1NFbmFibGVkKGVuYWJsZWQpOworICAgICAgICBndWFyZHJhaWxzKCkuc2V0WmVyb1RUTE9uVFdDU1dhcm5lZCh3YXJuZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHNDb25maWdQcm92aWRlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHNDb25maWdQcm92aWRlclRlc3QuamF2YQppbmRleCBlOTliNzM2Li4zNmZiYzdjIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzQ29uZmlnUHJvdmlkZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsc0NvbmZpZ1Byb3ZpZGVyVGVzdC5qYXZhCkBAIC0zNyw2ICszNyw3IEBACiAgICAgICAgIFN0cmluZyBuYW1lID0gZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCkgKyAnJCcgKyBDdXN0b21Qcm92aWRlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CiAgICAgICAgIEd1YXJkcmFpbHNDb25maWdQcm92aWRlciBwcm92aWRlciA9IEd1YXJkcmFpbHNDb25maWdQcm92aWRlci5idWlsZChuYW1lKTsKICAgICAgICAgTWF4VGhyZXNob2xkIGd1YXJkID0gbmV3IE1heFRocmVzaG9sZCgidGVzdF9ndWFyZHJhaWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb21lIHJlYXNvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gcHJvdmlkZXIuZ2V0T3JDcmVhdGUoc3RhdGUpLmdldFRhYmxlc1dhcm5UaHJlc2hvbGQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBwcm92aWRlci5nZXRPckNyZWF0ZShzdGF0ZSkuZ2V0VGFibGVzRmFpbFRocmVzaG9sZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm4sIHdoYXQsIHYsIHQpIC0+IGZvcm1hdCgiJXM6IGZvciAlcywgJXMgPiAlcyIsCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvR3VhcmRyYWlsc1Rlc3QuamF2YQppbmRleCBhMGE1ODIzLi5mMTQzMTIwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvZ3VhcmRyYWlscy9HdWFyZHJhaWxzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL0d1YXJkcmFpbHNUZXN0LmphdmEKQEAgLTM4LDcgKzM4LDggQEAKIHB1YmxpYyBjbGFzcyBHdWFyZHJhaWxzVGVzdCBleHRlbmRzIEd1YXJkcmFpbFRlc3RlcgogewogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0FCTEVEID0gLTE7Ci0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFTT04gPSAiVGVzdGluZyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRSA9ICJGZWF0dXJlIG5hbWUiOwogCiAgICAgcHJpdmF0ZSB2b2lkIHRlc3REaXNhYmxlZFRocmVzaG9sZChUaHJlc2hvbGQgZ3VhcmQpIHRocm93cyBUaHJvd2FibGUKICAgICB7CkBAIC01OCwxNyArNTksMTggQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRNYXhUaHJlc2hvbGQoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBUaHJlc2hvbGQuRXJyb3JNZXNzYWdlUHJvdmlkZXIgZXJyb3JNZXNzYWdlUHJvdmlkZXIgPSAoaXNXYXJuLCB3aGF0LCB2LCB0KSAtPiAiU2hvdWxkIG5ldmVyIHRyaWdnZXIiOwotICAgICAgICB0ZXN0RGlzYWJsZWRUaHJlc2hvbGQobmV3IE1heFRocmVzaG9sZCgieCIsIHN0YXRlIC0+IERJU0FCTEVELCBzdGF0ZSAtPiBESVNBQkxFRCwgZXJyb3JNZXNzYWdlUHJvdmlkZXIpKTsKKyAgICAgICAgdGVzdERpc2FibGVkVGhyZXNob2xkKG5ldyBNYXhUaHJlc2hvbGQoIngiLCBSRUFTT04sIHN0YXRlIC0+IERJU0FCTEVELCBzdGF0ZSAtPiBESVNBQkxFRCwgZXJyb3JNZXNzYWdlUHJvdmlkZXIpKTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhUaHJlc2hvbGQoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBNYXhUaHJlc2hvbGQgZ3VhcmQgPSBuZXcgTWF4VGhyZXNob2xkKCJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzV2Fybiwgd2hhdCwgdiwgdCkgLT4gZm9ybWF0KCIlczogZm9yICVzLCAlcyA+ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNXYXJuID8gIldhcm5pbmciIDogIkFib3J0aW5nIiwgd2hhdCwgdiwgdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQVNPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzV2FybiwgZmVhdHVyZU5hbWUsIHYsIHQpIC0+IGZvcm1hdCgiJXM6IGZvciAlcywgJXMgPiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzV2FybiA/ICJXYXJuaW5nIiA6ICJBYm9ydGluZyIsIGZlYXR1cmVOYW1lLCB2LCB0KSk7CiAKICAgICAgICAgYXNzZXJ0VHJ1ZShndWFyZC5lbmFibGVkKHVzZXJDbGllbnRTdGF0ZSkpOwogCkBAIC05MSwxMCArOTMsMTEgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0V2Fybk9ubHlNYXhUaHJlc2hvbGQoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBNYXhUaHJlc2hvbGQgZ3VhcmQgPSBuZXcgTWF4VGhyZXNob2xkKCJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBESVNBQkxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuLCB3aGF0LCB2LCB0KSAtPiBmb3JtYXQoIiVzOiBmb3IgJXMsICVzID4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dhcm4gPyAiV2FybmluZyIgOiAiQWJvcnRpbmciLCB3aGF0LCB2LCB0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBU09OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IERJU0FCTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm4sIGZlYXR1cmVOYW1lLCB2LCB0KSAtPiBmb3JtYXQoIiVzOiBmb3IgJXMsICVzID4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dhcm4gPyAiV2FybmluZyIgOiAiQWJvcnRpbmciLCBmZWF0dXJlTmFtZSwgdiwgdCkpOwogCiAgICAgICAgIGFzc2VydFRydWUoZ3VhcmQuZW5hYmxlZCh1c2VyQ2xpZW50U3RhdGUpKTsKIApAQCAtMTA5LDEwICsxMTIsMTEgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbE9ubHlNYXhUaHJlc2hvbGQoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBNYXhUaHJlc2hvbGQgZ3VhcmQgPSBuZXcgTWF4VGhyZXNob2xkKCJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBESVNBQkxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuLCB3aGF0LCB2LCB0KSAtPiBmb3JtYXQoIiVzOiBmb3IgJXMsICVzID4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dhcm4gPyAiV2FybmluZyIgOiAiQWJvcnRpbmciLCB3aGF0LCB2LCB0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBU09OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IERJU0FCTEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm4sIGZlYXR1cmVOYW1lLCB2LCB0KSAtPiBmb3JtYXQoIiVzOiBmb3IgJXMsICVzID4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1dhcm4gPyAiV2FybmluZyIgOiAiQWJvcnRpbmciLCBmZWF0dXJlTmFtZSwgdiwgdCkpOwogCiAgICAgICAgIGFzc2VydFRydWUoZ3VhcmQuZW5hYmxlZCh1c2VyQ2xpZW50U3RhdGUpKTsKIApAQCAtMTI3LDEwICsxMzEsMTEgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4VGhyZXNob2xkVXNlcnMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBNYXhUaHJlc2hvbGQgZ3VhcmQgPSBuZXcgTWF4VGhyZXNob2xkKCJ4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzV2Fybiwgd2hhdCwgdiwgdCkgLT4gZm9ybWF0KCIlczogZm9yICVzLCAlcyA+ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNXYXJuID8gIldhcm5pbmciIDogIkZhaWx1cmUiLCB3aGF0LCB2LCB0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBU09OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuLCBmZWF0dXJlTmFtZSwgdiwgdCkgLT4gZm9ybWF0KCIlczogZm9yICVzLCAlcyA+ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNXYXJuID8gIldhcm5pbmciIDogIkZhaWx1cmUiLCBmZWF0dXJlTmFtZSwgdiwgdCkpOwogCiAgICAgICAgIC8vIHZhbHVlIHVuZGVyIGJvdGggdGhyZXNob2xkcwogICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBndWFyZC5ndWFyZCg1LCAieCIsIGZhbHNlLCBudWxsKSk7CkBAIC0xNTYsMTMgKzE2MSwxNCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZE1pblRocmVzaG9sZCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIFRocmVzaG9sZC5FcnJvck1lc3NhZ2VQcm92aWRlciBlcnJvck1lc3NhZ2VQcm92aWRlciA9IChpc1dhcm4sIHdoYXQsIHYsIHQpIC0+ICJTaG91bGQgbmV2ZXIgdHJpZ2dlciI7Ci0gICAgICAgIHRlc3REaXNhYmxlZFRocmVzaG9sZChuZXcgTWluVGhyZXNob2xkKCJ4Iiwgc3RhdGUgLT4gRElTQUJMRUQsIHN0YXRlIC0+IERJU0FCTEVELCBlcnJvck1lc3NhZ2VQcm92aWRlcikpOworICAgICAgICB0ZXN0RGlzYWJsZWRUaHJlc2hvbGQobmV3IE1pblRocmVzaG9sZCgieCIsIFJFQVNPTiwgc3RhdGUgLT4gRElTQUJMRUQsIHN0YXRlIC0+IERJU0FCTEVELCBlcnJvck1lc3NhZ2VQcm92aWRlcikpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1pblRocmVzaG9sZCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIE1pblRocmVzaG9sZCBndWFyZCA9IG5ldyBNaW5UaHJlc2hvbGQoIngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQVNPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzV2Fybiwgd2hhdCwgdiwgdCkgLT4gZm9ybWF0KCIlczogZm9yICVzLCAlcyA8ICVzIiwKQEAgLTE4OSw2ICsxOTUsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RXYXJuT25seU1pblRocmVzaG9sZCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIE1pblRocmVzaG9sZCBndWFyZCA9IG5ldyBNaW5UaHJlc2hvbGQoIngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQVNPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBESVNBQkxFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNXYXJuLCB3aGF0LCB2LCB0KSAtPiBmb3JtYXQoIiVzOiBmb3IgJXMsICVzIDwgJXMiLApAQCAtMjA3LDYgKzIxNCw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdEZhaWxPbmx5TWluVGhyZXNob2xkKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKICAgICAgICAgTWluVGhyZXNob2xkIGd1YXJkID0gbmV3IE1pblRocmVzaG9sZCgieCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBU09OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IERJU0FCTEVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm4sIHdoYXQsIHYsIHQpIC0+IGZvcm1hdCgiJXM6IGZvciAlcywgJXMgPCAlcyIsCkBAIC0yMjUsNiArMjMzLDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TWluVGhyZXNob2xkVXNlcnMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBNaW5UaHJlc2hvbGQgZ3VhcmQgPSBuZXcgTWluVGhyZXNob2xkKCJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFTT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gMTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc1dhcm4sIHdoYXQsIHYsIHQpIC0+IGZvcm1hdCgiJXM6IGZvciAlcywgJXMgPCAlcyIsCkBAIC0yNTEsMzUgKzI2MCw1MyBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVGbGFnKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVGbGFnKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgYXNzZXJ0RmFpbHMoKCkgLT4gbmV3IERpc2FibGVGbGFnKCJ4Iiwgc3RhdGUgLT4gdHJ1ZSwgIlgiKS5lbnN1cmVFbmFibGVkKHVzZXJDbGllbnRTdGF0ZSksICJYIGlzIG5vdCBhbGxvd2VkIik7Ci0gICAgICAgIGFzc2VydFZhbGlkKCgpIC0+IG5ldyBEaXNhYmxlRmxhZygieCIsIHN0YXRlIC0+IGZhbHNlLCAiWCIpLmVuc3VyZUVuYWJsZWQodXNlckNsaWVudFN0YXRlKSk7CisgICAgICAgIGFzc2VydEZhaWxzKCgpIC0+IG5ldyBFbmFibGVGbGFnKCJ4IiwgUkVBU09OLCBzdGF0ZSAtPiBmYWxzZSwgIlgiKS5lbnN1cmVFbmFibGVkKHVzZXJDbGllbnRTdGF0ZSksICJYIGlzIG5vdCBhbGxvd2VkIik7CisgICAgICAgIGFzc2VydFZhbGlkKCgpIC0+IG5ldyBFbmFibGVGbGFnKCJ4IiwgUkVBU09OLCBzdGF0ZSAtPiB0cnVlLCAiWCIpLmVuc3VyZUVuYWJsZWQodXNlckNsaWVudFN0YXRlKSk7CiAKLSAgICAgICAgYXNzZXJ0RmFpbHMoKCkgLT4gbmV3IERpc2FibGVGbGFnKCJ4Iiwgc3RhdGUgLT4gdHJ1ZSwgIlgiKS5lbnN1cmVFbmFibGVkKCJZIiwgdXNlckNsaWVudFN0YXRlKSwgIlkgaXMgbm90IGFsbG93ZWQiKTsKLSAgICAgICAgYXNzZXJ0VmFsaWQoKCkgLT4gbmV3IERpc2FibGVGbGFnKCJ4Iiwgc3RhdGUgLT4gZmFsc2UsICJYIikuZW5zdXJlRW5hYmxlZCgiWSIsIHVzZXJDbGllbnRTdGF0ZSkpOworICAgICAgICBhc3NlcnRGYWlscygoKSAtPiBuZXcgRW5hYmxlRmxhZygieCIsIFJFQVNPTiwgc3RhdGUgLT4gZmFsc2UsICJYIikuZW5zdXJlRW5hYmxlZCgiWSIsIHVzZXJDbGllbnRTdGF0ZSksICJZIGlzIG5vdCBhbGxvd2VkIik7CisgICAgICAgIGFzc2VydFZhbGlkKCgpIC0+IG5ldyBFbmFibGVGbGFnKCJ4IiwgUkVBU09OLCBzdGF0ZSAtPiB0cnVlLCAiWCIpLmVuc3VyZUVuYWJsZWQoIlkiLCB1c2VyQ2xpZW50U3RhdGUpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlRmxhZ1VzZXJzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVGbGFnVXNlcnMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICBEaXNhYmxlRmxhZyBlbmFibGVkID0gbmV3IERpc2FibGVGbGFnKCJ4Iiwgc3RhdGUgLT4gZmFsc2UsICJYIik7CisgICAgICAgIEVuYWJsZUZsYWcgZW5hYmxlZCA9IG5ldyBFbmFibGVGbGFnKCJ4IiwgUkVBU09OLCBzdGF0ZSAtPiB0cnVlLCAiWCIpOwogICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBlbmFibGVkLmVuc3VyZUVuYWJsZWQobnVsbCkpOwogICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBlbmFibGVkLmVuc3VyZUVuYWJsZWQodXNlckNsaWVudFN0YXRlKSk7CiAgICAgICAgIGFzc2VydFZhbGlkKCgpIC0+IGVuYWJsZWQuZW5zdXJlRW5hYmxlZChzeXN0ZW1DbGllbnRTdGF0ZSkpOwogICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBlbmFibGVkLmVuc3VyZUVuYWJsZWQoc3VwZXJDbGllbnRTdGF0ZSkpOwogCi0gICAgICAgIERpc2FibGVGbGFnIGRpc2FibGVkID0gbmV3IERpc2FibGVGbGFnKCJ4Iiwgc3RhdGUgLT4gdHJ1ZSwgIlgiKTsKKyAgICAgICAgRW5hYmxlRmxhZyBkaXNhYmxlZCA9IG5ldyBFbmFibGVGbGFnKCJ4IiwgUkVBU09OLCBzdGF0ZSAtPiBmYWxzZSwgIlgiKTsKICAgICAgICAgYXNzZXJ0RmFpbHMoKCkgLT4gZGlzYWJsZWQuZW5zdXJlRW5hYmxlZCh1c2VyQ2xpZW50U3RhdGUpLCAiWCBpcyBub3QgYWxsb3dlZCIpOwogICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBkaXNhYmxlZC5lbnN1cmVFbmFibGVkKHN5c3RlbUNsaWVudFN0YXRlKSk7CiAgICAgICAgIGFzc2VydFZhbGlkKCgpIC0+IGRpc2FibGVkLmVuc3VyZUVuYWJsZWQoc3VwZXJDbGllbnRTdGF0ZSkpOwogICAgIH0KIAogICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZUZsYWdXYXJuKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgRW5hYmxlRmxhZyBkaXNhYmxlZEd1YXJkID0gbmV3IEVuYWJsZUZsYWcoIngiLCBudWxsLCBzdGF0ZSAtPiB0cnVlLCBzdGF0ZSAtPiBmYWxzZSwgRkVBVFVSRSk7CisKKyAgICAgICAgYXNzZXJ0RmFpbHMoKCkgLT4gZGlzYWJsZWRHdWFyZC5lbnN1cmVFbmFibGVkKG51bGwpLCBmYWxzZSwgRkVBVFVSRSArICIgaXMgbm90IGFsbG93ZWQiKTsKKyAgICAgICAgYXNzZXJ0RmFpbHMoKCkgLT4gZGlzYWJsZWRHdWFyZC5lbnN1cmVFbmFibGVkKHVzZXJDbGllbnRTdGF0ZSksIEZFQVRVUkUgKyAiIGlzIG5vdCBhbGxvd2VkIik7CisgICAgICAgIGFzc2VydFZhbGlkKCgpIC0+IGRpc2FibGVkR3VhcmQuZW5zdXJlRW5hYmxlZChzeXN0ZW1DbGllbnRTdGF0ZSkpOworICAgICAgICBhc3NlcnRWYWxpZCgoKSAtPiBkaXNhYmxlZEd1YXJkLmVuc3VyZUVuYWJsZWQoc3VwZXJDbGllbnRTdGF0ZSkpOworCisgICAgICAgIEVuYWJsZUZsYWcgZW5hYmxlZEd1YXJkID0gbmV3IEVuYWJsZUZsYWcoIngiLCBudWxsLCBzdGF0ZSAtPiB0cnVlLCBzdGF0ZSAtPiB0cnVlLCBGRUFUVVJFKTsKKyAgICAgICAgYXNzZXJ0V2FybnMoKCkgLT4gZW5hYmxlZEd1YXJkLmVuc3VyZUVuYWJsZWQobnVsbCksIEZFQVRVUkUgKyAiIGlzIG5vdCByZWNvbW1lbmRlZCIpOworICAgICAgICBhc3NlcnRXYXJucygoKSAtPiBlbmFibGVkR3VhcmQuZW5zdXJlRW5hYmxlZCh1c2VyQ2xpZW50U3RhdGUpLCBGRUFUVVJFICsgIiBpcyBub3QgcmVjb21tZW5kZWQiKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoKCkgLT4gZW5hYmxlZEd1YXJkLmVuc3VyZUVuYWJsZWQoc3lzdGVtQ2xpZW50U3RhdGUpKTsKKyAgICAgICAgYXNzZXJ0VmFsaWQoKCkgLT4gZW5hYmxlZEd1YXJkLmVuc3VyZUVuYWJsZWQoc3VwZXJDbGllbnRTdGF0ZSkpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlc1dhcm5lZCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIC8vIFVzaW5nIGEgc29ydGVkIHNldCBiZWxvdyB0byBlbnN1cmUgdGhlIG9yZGVyIGluIHRoZSB3YXJuaW5nIG1lc3NhZ2UgY2hlY2tlZCBiZWxvdyBpcyBub3QgcmFuZG9tCiAgICAgICAgIFZhbHVlczxJbnRlZ2VyPiB3YXJuZWQgPSBuZXcgVmFsdWVzPD4oIngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQVNPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBpbnNlcnRpb25PcmRlcmVkU2V0KDQsIDYsIDIwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENvbGxlY3Rpb25zLmVtcHR5U2V0KCksCkBAIC0zMDAsNiArMzI3LDcgQEAKICAgICB7CiAgICAgICAgIC8vIFVzaW5nIGEgc29ydGVkIHNldCBiZWxvdyB0byBlbnN1cmUgdGhlIG9yZGVyIGluIHRoZSBlcnJvciBtZXNzYWdlIGNoZWNrZWQgYmVsb3cgYXJlIG5vdCByYW5kb20KICAgICAgICAgVmFsdWVzPEludGVnZXI+IGlnbm9yZWQgPSBuZXcgVmFsdWVzPD4oIngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFTT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENvbGxlY3Rpb25zLmVtcHR5U2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IGluc2VydGlvbk9yZGVyZWRTZXQoNCwgNiwgMjApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLApAQCAtMzM0LDYgKzM2Miw3IEBACiAgICAgewogICAgICAgICAvLyBVc2luZyBhIHNvcnRlZCBzZXQgYmVsb3cgdG8gZW5zdXJlIHRoZSBvcmRlciBpbiB0aGUgZXJyb3IgbWVzc2FnZSBjaGVja2VkIGJlbG93IGFyZSBub3QgcmFuZG9tCiAgICAgICAgIFZhbHVlczxJbnRlZ2VyPiBkaXNhbGxvd2VkID0gbmV3IFZhbHVlczw+KCJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBU09OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBpbnNlcnRpb25PcmRlcmVkU2V0KDQsIDYsIDIwKSwKQEAgLTM1OSw2ICszODgsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZXNVc2VycygpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIFZhbHVlczxJbnRlZ2VyPiBkaXNhbGxvd2VkID0gbmV3IFZhbHVlczw+KCJ4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBU09OLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSAtPiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IENvbGxlY3Rpb25zLnNpbmdsZXRvbigzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKDQpLApAQCAtMzk2LDYgKzQyNiw3IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFByZWRpY2F0ZXMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBQcmVkaWNhdGVzPEludGVnZXI+IGd1YXJkID0gbmV3IFByZWRpY2F0ZXM8PigieCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQVNPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4geCAtPiB4ID4gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IHggLT4geCA+IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzV2FybiwgdmFsdWUpIC0+IGZvcm1hdCgiJXM6ICVzIiwgaXNXYXJuID8gIldhcm5pbmciIDogIkFib3J0aW5nIiwgdmFsdWUpKTsKQEAgLTQxMiw2ICs0NDMsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVkaWNhdGVzVXNlcnMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewogICAgICAgICBQcmVkaWNhdGVzPEludGVnZXI+IGd1YXJkID0gbmV3IFByZWRpY2F0ZXM8PigieCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQVNPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgLT4geCAtPiB4ID4gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlIC0+IHggLT4geCA+IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzV2FybiwgdmFsdWUpIC0+IGZvcm1hdCgiJXM6ICVzIiwgaXNXYXJuID8gIldhcm5pbmciIDogIkFib3J0aW5nIiwgdmFsdWUpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9ndWFyZHJhaWxzL1RocmVzaG9sZFRlc3Rlci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvVGhyZXNob2xkVGVzdGVyLmphdmEKaW5kZXggZmFlMzA1YS4uN2Y3OTA3OCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvVGhyZXNob2xkVGVzdGVyLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2d1YXJkcmFpbHMvVGhyZXNob2xkVGVzdGVyLmphdmEKQEAgLTI4LDExICsyOCw5IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhU3RvcmFnZVNwZWM7CiBpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFTdG9yYWdlU3BlYy5EYXRhU3RvcmFnZVVuaXQuQllURVM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKQEAgLTg5LDE0ICs4NywxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZXNob2xkIHRocmVzaG9sZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaUNvbnN1bWVyPEd1YXJkcmFpbHMsIFN0cmluZywgU3RyaW5nPiBzZXR0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjxHdWFyZHJhaWxzLCBTdHJpbmc+IHdhcm5HZXR0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjxHdWFyZHJhaWxzLCBTdHJpbmc+IGZhaWxHZXR0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjxHdWFyZHJhaWxzLCBTdHJpbmc+IGZhaWxHZXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjxMb25nLCBTdHJpbmc+IHN0cmluZ0Zvcm1hdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvTG9uZ0Z1bmN0aW9uPFN0cmluZz4gc3RyaW5nUGFyc2VyKQogICAgIHsKICAgICAgICAgc3VwZXIodGhyZXNob2xkKTsKLSAgICAgICAgdGhpcy53YXJuVGhyZXNob2xkID0gbmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCh3YXJuVGhyZXNob2xkKS50b0J5dGVzKCk7Ci0gICAgICAgIHRoaXMuZmFpbFRocmVzaG9sZCA9IG5ldyBEYXRhU3RvcmFnZVNwZWMuTG9uZ0J5dGVzQm91bmQoZmFpbFRocmVzaG9sZCkudG9CeXRlcygpOwotICAgICAgICB0aGlzLnNldHRlciA9IChnLCB3LCBhKSAtPiBzZXR0ZXIuYWNjZXB0KGcsIHcgPT0gbnVsbCA/IG51bGwgOiBuZXcgRGF0YVN0b3JhZ2VTcGVjLkxvbmdCeXRlc0JvdW5kKHcsIEJZVEVTKS50b1N0cmluZygpLCBhID09IG51bGwgPyBudWxsIDogbmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZChhLCBCWVRFUykudG9TdHJpbmcoKSk7Ci0gICAgICAgIHRoaXMud2FybkdldHRlciA9IGcgLT4gbmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZCh3YXJuR2V0dGVyLmFwcGx5KGcpKS50b0J5dGVzKCk7Ci0gICAgICAgIHRoaXMuZmFpbEdldHRlciA9IGcgLT4gbmV3IERhdGFTdG9yYWdlU3BlYy5Mb25nQnl0ZXNCb3VuZChmYWlsR2V0dGVyLmFwcGx5KGcpKS50b0J5dGVzKCk7CisgICAgICAgIHRoaXMud2FyblRocmVzaG9sZCA9IHN0cmluZ1BhcnNlci5hcHBseUFzTG9uZyh3YXJuVGhyZXNob2xkKTsKKyAgICAgICAgdGhpcy5mYWlsVGhyZXNob2xkID0gc3RyaW5nUGFyc2VyLmFwcGx5QXNMb25nKGZhaWxUaHJlc2hvbGQpOworICAgICAgICB0aGlzLnNldHRlciA9IChnLCB3LCBmKSAtPiBzZXR0ZXIuYWNjZXB0KGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyA9PSBudWxsID8gbnVsbCA6IHN0cmluZ0Zvcm1hdHRlci5hcHBseSh3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID09IG51bGwgPyBudWxsIDogc3RyaW5nRm9ybWF0dGVyLmFwcGx5KGYpKTsKKyAgICAgICAgdGhpcy53YXJuR2V0dGVyID0gZyAtPiBzdHJpbmdQYXJzZXIuYXBwbHlBc0xvbmcod2FybkdldHRlci5hcHBseShnKSk7CisgICAgICAgIHRoaXMuZmFpbEdldHRlciA9IGcgLT4gc3RyaW5nUGFyc2VyLmFwcGx5QXNMb25nKGZhaWxHZXR0ZXIuYXBwbHkoZykpOwogICAgICAgICBtYXhWYWx1ZSA9IExvbmcuTUFYX1ZBTFVFIC0gMTsKICAgICAgICAgZGlzYWJsZWRWYWx1ZSA9IG51bGw7CiAgICAgfQpAQCAtMjQ3LDEwICsyNDksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgbmFtZSwgZGlzYWJsZWRWYWx1ZSk7CiAKICAgICAgICAgICAgIGlmIChleHBlY3RlZE1lc3NhZ2UgPT0gbnVsbCAmJiB2YWx1ZSA8IDApCi0gICAgICAgICAgICAgICAgZXhwZWN0ZWRNZXNzYWdlID0gZm9ybWF0KCJJbnZhbGlkIGRhdGEgc3RvcmFnZTogdmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKKyAgICAgICAgICAgICAgICBleHBlY3RlZE1lc3NhZ2UgPSAidmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUiOwogCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybWF0KCJFeGNlcHRpb24gbWVzc2FnZSAnJXMnIGRvZXMgbm90IGNvbnRhaW4gJyVzJyIsIGUuZ2V0TWVzc2FnZSgpLCBleHBlY3RlZE1lc3NhZ2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkTWVzc2FnZSwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGUpLmhhc01lc3NhZ2VDb250YWluaW5nKGV4cGVjdGVkTWVzc2FnZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvSGVscGVyc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvSGVscGVyc1Rlc3QuamF2YQppbmRleCAxYjEyMWMxLi4yMGFmMmEwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0hlbHBlcnNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9IZWxwZXJzVGVzdC5qYXZhCkBAIC04NSw5ICs4NSw5IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlNYXAoKQogICAgIHsKLSAgICAgICAgSW50ZWdlciBvbmUgPSBuZXcgSW50ZWdlcigxKTsKLSAgICAgICAgSW50ZWdlciB0d28gPSBuZXcgSW50ZWdlcigyKTsKLSAgICAgICAgSW50ZWdlciB0aHJlZSA9IG5ldyBJbnRlZ2VyKDMpOworICAgICAgICBJbnRlZ2VyIG9uZSA9IEludGVnZXIudmFsdWVPZigxKTsKKyAgICAgICAgSW50ZWdlciB0d28gPSBJbnRlZ2VyLnZhbHVlT2YoMik7CisgICAgICAgIEludGVnZXIgdGhyZWUgPSBJbnRlZ2VyLnZhbHVlT2YoMyk7CiAgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBpZGVudGl0eSA9IEhlbHBlcnMuaWRlbnRpdHlNYXAoc2V0KG9uZSwgdHdvLCB0aHJlZSkpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMsIGlkZW50aXR5LnNpemUoKSk7CiAgICAgICAgIEFzc2VydC5hc3NlcnRTYW1lKG9uZSwgaWRlbnRpdHkuZ2V0KDEpKTsKQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgICAgICBmYWlsdXJlID0gZmFsc2U7CiAgICAgICAgIHRyeQogICAgICAgICB7Ci0gICAgICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbm90SWRlbnRpdHkgPSBJbW11dGFibGVNYXAub2YoMSwgbmV3IEludGVnZXIoMSksIDIsIDIsIDMsIDMpOworICAgICAgICAgICAgTWFwPEludGVnZXIsIEludGVnZXI+IG5vdElkZW50aXR5ID0gSW1tdXRhYmxlTWFwLm9mKEludGVnZXIuTUlOX1ZBTFVFLCBJbnRlZ2VyLnZhbHVlT2YoSW50ZWdlci5NSU5fVkFMVUUpLCAyLCAyLCAzLCAzKTsKICAgICAgICAgICAgIEhlbHBlcnMucmVwbGFjZShub3RJZGVudGl0eSwgYSwgYik7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ1RyYW5zYWN0aW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9Mb2dUcmFuc2FjdGlvblRlc3QuamF2YQppbmRleCAyODEyMzUzLi44YWZlNzdlIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL0xvZ1RyYW5zYWN0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvTG9nVHJhbnNhY3Rpb25UZXN0LmphdmEKQEAgLTQxLDE1ICs0MSwyMiBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TZXF1ZW5jZUJhc2VkU1NUYWJsZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLkJ0aUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGkuQnRpVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLlBhcnRpdGlvbkluZGV4OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5TdGF0c01ldGFkYXRhOwpAQCAtNTcsNyArNjQsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuTW9ja1NjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5BbHdheXNQcmVzZW50RmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZpbHRlckZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkFic3RyYWN0VHJhbnNhY3Rpb25hbFRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5UcmFuc2FjdGlvbmFsOwpAQCAtODM5LDIyICs4NDYsMTcgQEAKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwodG1wRmlsZXMpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bU5ld0ZpbGVzIC0gMSwgdG1wRmlsZXMuc2l6ZSgpKTsKIAotICAgICAgICAgICAgRmlsZSBzc1RhYmxlMkRhdGFGaWxlID0gbmV3IEZpbGUoc3N0YWJsZTIuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOwotICAgICAgICAgICAgRmlsZSBzc1RhYmxlMkluZGV4RmlsZSA9IG5ldyBGaWxlKHNzdGFibGUyLmRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlBSSU1BUllfSU5ERVgpKTsKKyAgICAgICAgICAgIExpc3Q8RmlsZT4gc3N0YWJsZUZpbGVzID0gc3N0YWJsZTIuZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5wcmltYXJ5Q29tcG9uZW50cygpLnN0cmVhbSgpLm1hcChzc3RhYmxlMi5kZXNjcmlwdG9yOjpmaWxlRm9yKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwogCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHRtcEZpbGVzLmNvbnRhaW5zKHNzVGFibGUyRGF0YUZpbGUpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUodG1wRmlsZXMuY29udGFpbnMoc3NUYWJsZTJJbmRleEZpbGUpKTsKKyAgICAgICAgICAgIGZvciAoRmlsZSBmIDogdG1wRmlsZXMpIGFzc2VydFRydWUodG1wRmlsZXMuY29udGFpbnMoZikpOwogCiAgICAgICAgICAgICBMaXN0PEZpbGU+IGZpbGVzID0gZGlyZWN0b3JpZXMuc3N0YWJsZUxpc3RlcihEaXJlY3Rvcmllcy5PblR4bkVyci5USFJPVykubGlzdEZpbGVzKCk7CiAgICAgICAgICAgICBMaXN0PEZpbGU+IGZpbGVzTm9UbXAgPSBkaXJlY3Rvcmllcy5zc3RhYmxlTGlzdGVyKERpcmVjdG9yaWVzLk9uVHhuRXJyLlRIUk9XKS5za2lwVGVtcG9yYXJ5KHRydWUpLmxpc3RGaWxlcygpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmaWxlcyk7CiAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZpbGVzTm9UbXApOwogCi0gICAgICAgICAgICBhc3NlcnRUcnVlKGZpbGVzLmNvbnRhaW5zKHNzVGFibGUyRGF0YUZpbGUpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZmlsZXMuY29udGFpbnMoc3NUYWJsZTJJbmRleEZpbGUpKTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZmlsZXNOb1RtcC5jb250YWlucyhzc1RhYmxlMkRhdGFGaWxlKSk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShmaWxlc05vVG1wLmNvbnRhaW5zKHNzVGFibGUySW5kZXhGaWxlKSk7CisgICAgICAgICAgICBmb3IgKEZpbGUgZiA6IHRtcEZpbGVzKSBhc3NlcnRUcnVlKGZpbGVzLmNvbnRhaW5zKGYpKTsKKyAgICAgICAgICAgIGZvciAoRmlsZSBmIDogdG1wRmlsZXMpIGFzc2VydEZhbHNlKGZpbGVzTm9UbXAuY29udGFpbnMoZikpOwogCiAgICAgICAgICAgICBsb2cuZmluaXNoKCk7CiAKQEAgLTg2NSw4ICs4NjcsOCBAQAogCiAgICAgICAgICAgICBmaWxlc05vVG1wID0gZGlyZWN0b3JpZXMuc3N0YWJsZUxpc3RlcihEaXJlY3Rvcmllcy5PblR4bkVyci5USFJPVykuc2tpcFRlbXBvcmFyeSh0cnVlKS5saXN0RmlsZXMoKTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZmlsZXNOb1RtcCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGZpbGVzTm9UbXAuY29udGFpbnMoc3NUYWJsZTJEYXRhRmlsZSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlc05vVG1wLmNvbnRhaW5zKHNzVGFibGUySW5kZXhGaWxlKSk7CisKKyAgICAgICAgICAgIGZvciAoRmlsZSBmIDogdG1wRmlsZXMpIGFzc2VydFRydWUoZmlsZXNOb1RtcC5jb250YWlucyhmKSk7CiAKICAgICAgICAgICAgIHNzdGFibGUxLnNlbGZSZWYoKS5yZWxlYXNlKCk7CiAgICAgICAgICAgICBzc3RhYmxlMi5zZWxmUmVmKCkucmVsZWFzZSgpOwpAQCAtMTI2MSwzNyArMTI2Myw4MiBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgU1NUYWJsZVJlYWRlciBzc3RhYmxlKEZpbGUgZGF0YUZvbGRlciwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgZ2VuZXJhdGlvbiwgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3IoZGF0YUZvbGRlciwgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpLCBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZChnZW5lcmF0aW9uKSwgU1NUYWJsZUZvcm1hdC5UeXBlLkJJRyk7Ci0gICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBJbW11dGFibGVTZXQub2YoQ29tcG9uZW50LkRBVEEsIENvbXBvbmVudC5QUklNQVJZX0lOREVYLCBDb21wb25lbnQuRklMVEVSLCBDb21wb25lbnQuVE9DKTsKLSAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3IoZGF0YUZvbGRlciwgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwgY2ZzLmdldFRhYmxlTmFtZSgpLCBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZChnZW5lcmF0aW9uKSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKTsKKyAgICAgICAgaWYgKEJpZ0Zvcm1hdC5pc1NlbGVjdGVkKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7Ci0gICAgICAgICAgICBpZiAoIWZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlLmNyZWF0ZUZpbGVJZk5vdEV4aXN0cygpKTsKKyAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBJbW11dGFibGVTZXQub2YoQ29tcG9uZW50cy5EQVRBLCBDb21wb25lbnRzLlBSSU1BUllfSU5ERVgsIENvbXBvbmVudHMuRklMVEVSLCBDb21wb25lbnRzLlRPQyk7CisgICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmICghZmlsZS5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmaWxlLmNyZWF0ZUZpbGVJZk5vdEV4aXN0cygpKTsKIAotICAgICAgICAgICAgVXRpbC5zZXRGaWxlTGVuZ3RoKGZpbGUsIHNpemUpOworICAgICAgICAgICAgICAgIFV0aWwuc2V0RmlsZUxlbmd0aChmaWxlLCBzaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRmlsZUhhbmRsZSBkRmlsZSA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSkpLmNvbXBsZXRlKCk7CisgICAgICAgICAgICBGaWxlSGFuZGxlIGlGaWxlID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5QUklNQVJZX0lOREVYKSkuY29tcGxldGUoKTsKKworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IE1vY2tTY2hlbWEucmVhZGVyQm91bmRzKGdlbmVyYXRpb24pOworICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKKyAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgbWV0YWRhdGEgPSAoU3RhdHNNZXRhZGF0YSkgbmV3IE1ldGFkYXRhQ29sbGVjdG9yKGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5hbGl6ZU1ldGFkYXRhKGNmcy5tZXRhZGF0YSgpLnBhcnRpdGlvbmVyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLCAwLjAxZiwgLTEsIG51bGwsIGZhbHNlLCBoZWFkZXIsIGtleS5nZXRLZXkoKS5zbGljZSgpLCBrZXkuZ2V0S2V5KCkuc2xpY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChNZXRhZGF0YVR5cGUuU1RBVFMpOworICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBuZXcgQmlnVGFibGVSZWFkZXIuQnVpbGRlcihkZXNjcmlwdG9yKS5zZXRDb21wb25lbnRzKGNvbXBvbmVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhYmxlTWV0YWRhdGFSZWYoY2ZzLm1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREYXRhRmlsZShkRmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kZXhGaWxlKGlGaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbmRleFN1bW1hcnkoTW9ja1NjaGVtYS5pbmRleFN1bW1hcnkuc2hhcmVkQ29weSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaWx0ZXIoRmlsdGVyRmFjdG9yeS5BbHdheXNQcmVzZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRNYXhEYXRhQWdlKDFMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdGF0c01ldGFkYXRhKG1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRPcGVuUmVhc29uKFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbi5OT1JNQUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoaGVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaXJzdChrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldExhc3Qoa2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZChjZnMsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICByZXR1cm4gcmVhZGVyOwogICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEJ0aUZvcm1hdC5pc1NlbGVjdGVkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBJbW11dGFibGVTZXQub2YoQ29tcG9uZW50cy5EQVRBLCBCdGlGb3JtYXQuQ29tcG9uZW50cy5QQVJUSVRJT05fSU5ERVgsIEJ0aUZvcm1hdC5Db21wb25lbnRzLlJPV19JTkRFWCwgQ29tcG9uZW50cy5GSUxURVIsIENvbXBvbmVudHMuVE9DKTsKKyAgICAgICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gZGVzY3JpcHRvci5maWxlRm9yKGNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGZpbGUuY3JlYXRlRmlsZUlmTm90RXhpc3RzKCkpOwogCi0gICAgICAgIEZpbGVIYW5kbGUgZEZpbGUgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkRBVEEpKS5jb21wbGV0ZSgpOwotICAgICAgICBGaWxlSGFuZGxlIGlGaWxlID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKENvbXBvbmVudC5QUklNQVJZX0lOREVYKSkuY29tcGxldGUoKTsKKyAgICAgICAgICAgICAgICBVdGlsLnNldEZpbGVMZW5ndGgoZmlsZSwgc2l6ZSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLSAgICAgICAgU3RhdHNNZXRhZGF0YSBtZXRhZGF0YSA9IChTdGF0c01ldGFkYXRhKSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IoY2ZzLm1ldGFkYXRhKCkuY29tcGFyYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluYWxpemVNZXRhZGF0YShjZnMubWV0YWRhdGEoKS5wYXJ0aXRpb25lci5nZXRDbGFzcygpLmdldENhbm9uaWNhbE5hbWUoKSwgMC4wMWYsIC0xLCBudWxsLCBmYWxzZSwgaGVhZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoTWV0YWRhdGFUeXBlLlNUQVRTKTsKLSAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBTU1RhYmxlUmVhZGVyLmludGVybmFsT3BlbihkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vY2tTY2hlbWEuaW5kZXhTdW1tYXJ5LnNoYXJlZENvcHkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWx3YXlzUHJlc2VudEZpbHRlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbi5OT1JNQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyKTsKLSAgICAgICAgcmVhZGVyLmZpcnN0ID0gcmVhZGVyLmxhc3QgPSBNb2NrU2NoZW1hLnJlYWRlckJvdW5kcyhnZW5lcmF0aW9uKTsKLSAgICAgICAgcmV0dXJuIHJlYWRlcjsKKyAgICAgICAgICAgIEZpbGVIYW5kbGUgZEZpbGUgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpKS5jb21wbGV0ZSgpOworICAgICAgICAgICAgRmlsZUhhbmRsZSBpRmlsZSA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZGVzY3JpcHRvci5maWxlRm9yKEJ0aUZvcm1hdC5Db21wb25lbnRzLlBBUlRJVElPTl9JTkRFWCkpLmNvbXBsZXRlKCk7CisgICAgICAgICAgICBGaWxlSGFuZGxlIHJGaWxlID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihkZXNjcmlwdG9yLmZpbGVGb3IoQnRpRm9ybWF0LkNvbXBvbmVudHMuUk9XX0lOREVYKSkuY29tcGxldGUoKTsKKworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IE1vY2tTY2hlbWEucmVhZGVyQm91bmRzKGdlbmVyYXRpb24pOworICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKKyAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgbWV0YWRhdGEgPSAoU3RhdHNNZXRhZGF0YSkgbmV3IE1ldGFkYXRhQ29sbGVjdG9yKGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5hbGl6ZU1ldGFkYXRhKGNmcy5tZXRhZGF0YSgpLnBhcnRpdGlvbmVyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLCAwLjAxZiwgLTEsIG51bGwsIGZhbHNlLCBoZWFkZXIsIGtleS5nZXRLZXkoKS5zbGljZSgpLCBrZXkuZ2V0S2V5KCkuc2xpY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChNZXRhZGF0YVR5cGUuU1RBVFMpOworICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBuZXcgQnRpVGFibGVSZWFkZXIuQnVpbGRlcihkZXNjcmlwdG9yKS5zZXRDb21wb25lbnRzKGNvbXBvbmVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhYmxlTWV0YWRhdGFSZWYoY2ZzLm1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREYXRhRmlsZShkRmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UGFydGl0aW9uSW5kZXgobmV3IFBhcnRpdGlvbkluZGV4KGlGaWxlLCAwLCAwLCBNb2NrU2NoZW1hLnJlYWRlckJvdW5kcyhnZW5lcmF0aW9uKSwgTW9ja1NjaGVtYS5yZWFkZXJCb3VuZHMoZ2VuZXJhdGlvbikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRSb3dJbmRleEZpbGUockZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpbHRlcihGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1heERhdGFBZ2UoMUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFN0YXRzTWV0YWRhdGEobWV0YWRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE9wZW5SZWFzb24oU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uLk5PUk1BTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VyaWFsaXphdGlvbkhlYWRlcihoZWFkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpcnN0KGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGFzdChrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKGNmcywgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiByZWFkZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBVdGlsLnRlc3RNdXN0QmVJbXBsZW1lbnRlZEZvclNTVGFibGVGb3JtYXQoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RmlsZXMoU3RyaW5nIGRpclBhdGgsIFNldDxTdHJpbmc+IGV4cGVjdGVkRmlsZXMpIHRocm93cyBJT0V4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9SZWFsVHJhbnNhY3Rpb25zVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9SZWFsVHJhbnNhY3Rpb25zVGVzdC5qYXZhCmluZGV4IDA0MjA5NTcuLjg1YzhhZTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvUmVhbFRyYW5zYWN0aW9uc1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL1JlYWxUcmFuc2FjdGlvbnNUZXN0LmphdmEKQEAgLTI0LDE0ICsyNCwxMSBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CkBAIC00Myw4ICs0MCwxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVSZXdyaXRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOwpAQCAtMTYwLDE4ICsxNjAsMTYgQEAKICAgICAgICAgICAgICAgICBGaWxlIGRpcmVjdG9yeSA9IHR4bi5vcmlnaW5hbHMoKS5pdGVyYXRvcigpLm5leHQoKS5kZXNjcmlwdG9yLmRpcmVjdG9yeTsKICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IoZGlyZWN0b3J5KTsKICAgICAgICAgICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhID0gU2NoZW1hLmluc3RhbmNlLmdldFRhYmxlTWV0YWRhdGFSZWYoZGVzYyk7Ci0gICAgICAgICAgICAgICAgcmV3cml0ZXIuc3dpdGNoV3JpdGVyKFNTVGFibGVXcml0ZXIuY3JlYXRlKG1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLCB0eG4ub3JpZ2luYWxzKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4bikpOworICAgICAgICAgICAgICAgIHJld3JpdGVyLnN3aXRjaFdyaXRlcihkZXNjLmdldEZvcm1hdCgpLmdldFdyaXRlckZhY3RvcnkoKS5idWlsZGVyKGRlc2MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGFibGVNZXRhZGF0YVJlZihtZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJpYWxpemF0aW9uSGVhZGVyKFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZShjZnMubWV0YWRhdGEoKSwgdHhuLm9yaWdpbmFscygpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRGbHVzaE9ic2VydmVyc0ZvclNlY29uZGFyeUluZGV4ZXMoY2ZzLmluZGV4TWFuYWdlci5saXN0SW5kZXhlcygpLCB0eG4ub3BUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWV0YWRhdGFDb2xsZWN0b3IobmV3IE1ldGFkYXRhQ29sbGVjdG9yKGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZERlZmF1bHRDb21wb25lbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCh0eG4sIGNmcykpOwogICAgICAgICAgICAgICAgIHdoaWxlIChjaS5oYXNOZXh0KCkpCiAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaS5zZXRUYXJnZXREaXJlY3RvcnkocmV3cml0ZXIuY3VycmVudFdyaXRlcigpLmdldEZpbGVuYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICByZXdyaXRlci5hcHBlbmQoY2kubmV4dCgpKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobmFub1RpbWUoKSAtIGxhc3RDaGVja09ic29sZXRpb24gPiBUaW1lVW5pdC5NSU5VVEVTLnRvTmFub3MoMUwpKQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9UcmFja2VyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL2xpZmVjeWNsZS9UcmFja2VyVGVzdC5qYXZhCmluZGV4IGUzOWY3MWYuLmQ2ZTM3NDIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9saWZlY3ljbGUvVHJhY2tlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbGlmZWN5Y2xlL1RyYWNrZXJUZXN0LmphdmEKQEAgLTQxLDcgKzQxLDE4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLk1lbXRhYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuSU5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLklOb3RpZmljYXRpb25Db25zdW1lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLkluaXRpYWxTU1RhYmxlQWRkZWROb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5NZW10YWJsZURpc2NhcmRlZE5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLk1lbXRhYmxlUmVuZXdlZE5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5ub3RpZmljYXRpb25zLk1lbXRhYmxlU3dpdGNoZWROb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlQWRkZWROb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlRGVsZXRpbmdOb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlTGlzdENoYW5nZWROb3RpZmljYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubm90aWZpY2F0aW9ucy5TU1RhYmxlTWV0YWRhdGFDaGFuZ2VkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5vdGlmaWNhdGlvbnMuU1NUYWJsZVJlcGFpclN0YXR1c0NoYW5nZWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNhY2hpbmdQYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLk1vY2tTY2hlbWE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5PcE9yZGVyOwpAQCAtMTYyLDcgKzE3Myw4IEBACiAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGxpc3RlbmVyLnJlY2VpdmVkLmdldCgwKSBpbnN0YW5jZW9mIEluaXRpYWxTU1RhYmxlQWRkZWROb3RpZmljYXRpb24pOwogCiAgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciByZWFkZXIgOiByZWFkZXJzKQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVhZGVyLmlzS2V5Q2FjaGVFbmFibGVkKCkpOworICAgICAgICAgICAgaWYgKHJlYWRlciBpbnN0YW5jZW9mIEtleUNhY2hlU3VwcG9ydDw/PikKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgoKEtleUNhY2hlU3VwcG9ydDw/PilyZWFkZXIpLmdldEtleUNhY2hlKCkuaXNFbmFibGVkKCkpOwogCiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTcgKyAxMjEgKyA5LCBjZnMubWV0cmljLmxpdmVEaXNrU3BhY2VVc2VkLmdldENvdW50KCkpOwogICAgIH0KQEAgLTE4NCw3ICsxOTYsMTAgQEAKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCB0cmFja2VyLnZpZXcuZ2V0KCkuc3N0YWJsZXMuc2l6ZSgpKTsKIAogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgcmVhZGVyIDogcmVhZGVycykKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlYWRlci5pc0tleUNhY2hlRW5hYmxlZCgpKTsKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJlYWRlciBpbnN0YW5jZW9mIEtleUNhY2hlU3VwcG9ydDw/PikKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgoKEtleUNhY2hlU3VwcG9ydDw/PilyZWFkZXIpLmdldEtleUNhY2hlKCkuaXNFbmFibGVkKCkpOworICAgICAgICB9CiAKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxNyArIDEyMSArIDksIGNmcy5tZXRyaWMubGl2ZURpc2tTcGFjZVVzZWQuZ2V0Q291bnQoKSk7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbGlzdGVuZXIuc2VuZGVycy5zaXplKCkpOwpAQCAtMzE2LDcgKzMzMSw4IEBACiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc2luZ2xldG9uKHJlYWRlciksICgoU1NUYWJsZUFkZGVkTm90aWZpY2F0aW9uKSBsaXN0ZW5lci5yZWNlaXZlZC5nZXQoMSkpLmFkZGVkKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhPcHRpb25hbC5vZihwcmV2MiksICgoU1NUYWJsZUFkZGVkTm90aWZpY2F0aW9uKSBsaXN0ZW5lci5yZWNlaXZlZC5nZXQoMSkpLm1lbXRhYmxlKCkpOwogICAgICAgICBsaXN0ZW5lci5yZWNlaXZlZC5jbGVhcigpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZWFkZXIuaXNLZXlDYWNoZUVuYWJsZWQoKSk7CisgICAgICAgIGlmIChyZWFkZXIgaW5zdGFuY2VvZiBLZXlDYWNoZVN1cHBvcnQ8Pz4pCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgoKEtleUNhY2hlU3VwcG9ydDw/PikgcmVhZGVyKS5nZXRLZXlDYWNoZSgpLmlzRW5hYmxlZCgpKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMCwgY2ZzLm1ldHJpYy5saXZlRGlza1NwYWNlVXNlZC5nZXRDb3VudCgpKTsKIAogICAgICAgICAvLyB0ZXN0IGludmFsaWRhdGVkIENGUwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EeW5hbWljQ29tcG9zaXRlVHlwZVRlc3QuamF2YQppbmRleCBkMjJhOGFjLi42OWMxZWI1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EeW5hbWljQ29tcG9zaXRlVHlwZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9EeW5hbWljQ29tcG9zaXRlVHlwZVRlc3QuamF2YQpAQCAtNDcsNyArNDcsNyBAQAogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRTEgPSAiRHluYW1pY0NvbXBvc2l0ZVR5cGUiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRERZTkNPTVBPU0lURSA9ICJTdGFuZGFyZER5bmFtaWNDb21wb3NpdGUiOwotICAgIHByaXZhdGUgc3RhdGljIE1hcDxCeXRlLCBBYnN0cmFjdFR5cGU8Pz4+IGFsaWFzZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHVibGljIHN0YXRpYyBNYXA8Qnl0ZSwgQWJzdHJhY3RUeXBlPD8+PiBhbGlhc2VzID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRHluYW1pY0NvbXBvc2l0ZVR5cGUgY29tcGFyYXRvcjsKICAgICBzdGF0aWMKQEAgLTYwLDcgKzYwLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVVVJRF9DT1VOVCA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVVJRFtdIHV1aWRzID0gbmV3IFVVSURbVVVJRF9DT1VOVF07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVVUlEW10gdXVpZHMgPSBuZXcgVVVJRFtVVUlEX0NPVU5UXTsKICAgICBzdGF0aWMKICAgICB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVVVJRF9DT1VOVDsgKytpKQpAQCAtMzIwLDEzICszMjAsMTIgQEAKICAgICAgICAgYXNzZXJ0ICFUeXBlUGFyc2VyLnBhcnNlKCJEeW5hbWljQ29tcG9zaXRlVHlwZShhID0+IEJ5dGVzVHlwZSkiKS5pc0NvbXBhdGlibGVXaXRoKFR5cGVQYXJzZXIucGFyc2UoIkR5bmFtaWNDb21wb3NpdGVUeXBlKGEgPT4gQnl0ZXNUeXBlLCBiID0+IEFzY2lpVHlwZSkiKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoU3RyaW5nIHMsIFVVSUQgdXVpZCwgaW50IGksIGJvb2xlYW4gbGFzdElzT25lKQorICAgIHByaXZhdGUgc3RhdGljIEJ5dGVCdWZmZXIgY3JlYXRlRHluYW1pY0NvbXBvc2l0ZUtleShTdHJpbmcgcywgVVVJRCB1dWlkLCBpbnQgaSwgYm9vbGVhbiBsYXN0SXNPbmUpCiAgICAgewogICAgICAgICByZXR1cm4gY3JlYXRlRHluYW1pY0NvbXBvc2l0ZUtleShzLCB1dWlkLCBpLCBsYXN0SXNPbmUsIGZhbHNlKTsKICAgICB9CiAKLSAgICBwcml2YXRlIEJ5dGVCdWZmZXIgY3JlYXRlRHluYW1pY0NvbXBvc2l0ZUtleShTdHJpbmcgcywgVVVJRCB1dWlkLCBpbnQgaSwgYm9vbGVhbiBsYXN0SXNPbmUsCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHJldmVyc2VkKQorICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBjcmVhdGVEeW5hbWljQ29tcG9zaXRlS2V5KFN0cmluZyBzLCBVVUlEIHV1aWQsIGludCBpLCBib29sZWFuIGxhc3RJc09uZSwgYm9vbGVhbiByZXZlcnNlZCkKICAgICB7CiAgICAgICAgIFN0cmluZyBpbnRUeXBlID0gKHJldmVyc2VkID8gIlJldmVyc2VkVHlwZShJbnRlZ2VyVHlwZSkiIDogIkludGVnZXJUeXBlIik7CiAgICAgICAgIEJ5dGVCdWZmZXIgYnl0ZXMgPSBCeXRlQnVmZmVyVXRpbC5ieXRlcyhzKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL0pzb25Db252ZXJzaW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvSnNvbkNvbnZlcnNpb25UZXN0LmphdmEKaW5kZXggYmFiMDYxMS4uZTg5YTcyMiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvSnNvbkNvbnZlcnNpb25UZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvSnNvbkNvbnZlcnNpb25UZXN0LmphdmEKQEAgLTIzLDE2ICsyMywxNCBAQAogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeU9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIEpzb25Db252ZXJzaW9uVGVzdAogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdE1hcHBlciBKU09OX09CSkVDVF9NQVBQRVIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7Ci0KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RNYXAoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewpAQCAtMzExLDcgKzMwOSw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRCeXRlYnVmZmVyUG9zaXRpb25BbmRPdXRwdXQoU3RyaW5nIGpzb24sIFN0cmluZyB0eXBlU3RyaW5nKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSA9IFR5cGVQYXJzZXIucGFyc2UodHlwZVN0cmluZyk7Ci0gICAgICAgIE9iamVjdCBqc29uT2JqZWN0ID0gSlNPTl9PQkpFQ1RfTUFQUEVSLnJlYWRWYWx1ZShqc29uLCBPYmplY3QuY2xhc3MpOworICAgICAgICBPYmplY3QganNvbk9iamVjdCA9IEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVIucmVhZFZhbHVlKGpzb24sIE9iamVjdC5jbGFzcyk7CiAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSB0eXBlLmZyb21KU09OT2JqZWN0KGpzb25PYmplY3QpLmJpbmRBbmRHZXQoUXVlcnlPcHRpb25zLkRFRkFVTFQpOwogICAgICAgICBpbnQgcG9zaXRpb24gPSBiYi5wb3NpdGlvbigpOwogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UaW1lVHlwZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVUeXBlVGVzdC5qYXZhCmluZGV4IGQ2MWQyYzYuLjI2YTJiMTUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVUeXBlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tYXJzaGFsL1RpbWVUeXBlVGVzdC5qYXZhCkBAIC0xLDQgKzEsNCBAQAotLyoqCisvKgogICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQogICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCiAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgpAQCAtMjksMTEgKzI5LDEyIEBACiAKIHB1YmxpYyBjbGFzcyBUaW1lVHlwZVRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKIHsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJQb2ludGxlc3NBcml0aG1ldGljRXhwcmVzc2lvbiIsICJXcmFwcGVyVHlwZU1heUJlUHJpbWl0aXZlIiB9KQogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdENvbXBhcmlzb24oKQogICAgIHsKICAgICAgICAgTG9uZyB0MSA9IFRpbWVTZXJpYWxpemVyLnRpbWVTdHJpbmdUb0xvbmcoIjAxOjAwOjAwLjEyMzQ1Njc4OSIpOwotICAgICAgICBMb25nIHQyID0gbmV3IExvbmcoKDFMICogNjBMICogNjBMICogMTAwMEwgKiAxMDAwTCAqIDEwMDBMKSArIDEyMzQ1Njc4OSk7CisgICAgICAgIExvbmcgdDIgPSAxTCAqIDYwTCAqIDYwTCAqIDEwMDBMICogMTAwMEwgKiAxMDAwTCArIDEyMzQ1Njc4OUw7CiAgICAgICAgIEJ5dGVCdWZmZXIgYjEgPSBUaW1lU2VyaWFsaXplci5pbnN0YW5jZS5zZXJpYWxpemUodDEpOwogICAgICAgICBCeXRlQnVmZmVyIGIyID0gVGltZVNlcmlhbGl6ZXIuaW5zdGFuY2Uuc2VyaWFsaXplKHQyKTsKICAgICAgICAgYXNzZXJ0IFRpbWVUeXBlLmluc3RhbmNlLmNvbXBhcmUoYjEsIGIyKSA9PSAwIDogIkZhaWxlZCA9PSBjb21wYXJpc29uIjsKQEAgLTQxLDcgKzQyLDcgQEAKICAgICAgICAgYjIgPSBUaW1lU2VyaWFsaXplci5pbnN0YW5jZS5zZXJpYWxpemUoMTIzNDU2Nzg5TCk7CiAgICAgICAgIGFzc2VydCBUaW1lVHlwZS5pbnN0YW5jZS5jb21wYXJlKGIxLCBiMikgPiAwIDogIkZhaWxlZCA+IGNvbXBhcmlzb24iOwogCi0gICAgICAgIHQyID0gbmV3IExvbmcoMkwgKiA2MEwgKiA2MEwgKiAxMDAwTCAqIDEwMDBMICogMTAwMEwgKyAxMjM0NTY3ODkpOworICAgICAgICB0MiA9IDJMICogNjBMICogNjBMICogMTAwMEwgKiAxMDAwTCAqIDEwMDBMICsgMTIzNDU2Nzg5TDsKICAgICAgICAgYjIgPSBUaW1lU2VyaWFsaXplci5pbnN0YW5jZS5zZXJpYWxpemUodDIpOwogICAgICAgICBhc3NlcnQgVGltZVR5cGUuaW5zdGFuY2UuY29tcGFyZShiMSwgYjIpIDwgMCA6ICJGYWlsZWQgPCBjb21wYXJpc29uIjsKIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21hcnNoYWwvVHlwZVZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UeXBlVmFsaWRhdGlvblRlc3QuamF2YQppbmRleCA0ZDI1YTFmLi40NzRiODY3IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UeXBlVmFsaWRhdGlvblRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWFyc2hhbC9UeXBlVmFsaWRhdGlvblRlc3QuamF2YQpAQCAtMjA0LDcgKzIwNCw3IEBACiAgICAgICAgIHF0KCkuZm9yQWxsKHR1cGxlV2l0aFZhbHVlR2VuKGJhc2VHZW4pKS5jaGVja0Fzc2VydChwYWlyIC0+IHsKICAgICAgICAgICAgIFR1cGxlVHlwZSB0dXBsZSA9IHBhaXIubGVmdDsKICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBwYWlyLnJpZ2h0OwotICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KFR1cGxlVHlwZS5idWlsZFZhbHVlKHR1cGxlLnNwbGl0KHZhbHVlKSkpCisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoVHVwbGVUeXBlLmJ1aWxkVmFsdWUodHVwbGUuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB2YWx1ZSkpKQogICAgICAgICAgICAgICAgICAgICAgIC5hcygiVHVwbGVUeXBlLmJ1aWxkVmFsdWUoc3BsaXQodmFsdWUpKSA9PSB2YWx1ZSIpCiAgICAgICAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyh2YWx1ZSk7CiAgICAgICAgIH0pOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlUXVpY2tUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVRdWlja1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmNmYTNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlUXVpY2tUZXN0LmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgTWVtdGFibGVRdWlja1Rlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKK3sKKyAgICBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE1lbXRhYmxlUXVpY2tUZXN0LmNsYXNzKTsKKworICAgIHN0YXRpYyBmaW5hbCBpbnQgcGFydGl0aW9ucyA9IDUwXzAwMDsKKyAgICBzdGF0aWMgZmluYWwgaW50IHJvd3NQZXJQYXJ0aXRpb24gPSA0OworCisgICAgc3RhdGljIGZpbmFsIGludCBkZWxldGVkUGFydGl0aW9uc1N0YXJ0ID0gMjBfMDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgZGVsZXRlZFBhcnRpdGlvbnNFbmQgPSBkZWxldGVkUGFydGl0aW9uc1N0YXJ0ICsgMTBfMDAwOworCisgICAgc3RhdGljIGZpbmFsIGludCBkZWxldGVkUm93c1N0YXJ0ID0gNDBfMDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgZGVsZXRlZFJvd3NFbmQgPSBkZWxldGVkUm93c1N0YXJ0ICsgNV8wMDA7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoKQorICAgIHB1YmxpYyBTdHJpbmcgbWVtdGFibGVDbGFzczsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3Q+IHBhcmFtZXRlcnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoInNraXBsaXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNraXBsaXN0X3NoYXJkZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2tpcGxpc3Rfc2hhcmRlZF9sb2NraW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyaWUiKTsKKyAgICB9CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXAoKQorICAgIHsKKyAgICAgICAgQ1FMVGVzdGVyLnNldFVwQ2xhc3MoKTsKKyAgICAgICAgQ1FMVGVzdGVyLnByZXBhcmVTZXJ2ZXIoKTsKKyAgICAgICAgQ1FMVGVzdGVyLmRpc2FibGVQcmVwYXJlZFJldXNlRm9yVGVzdCgpOworICAgICAgICBsb2dnZXIuaW5mbygic2V0dXBDbGFzcyBkb25lLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lbXRhYmxlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKworICAgICAgICBTdHJpbmcga2V5c3BhY2UgPSBjcmVhdGVLZXlzcGFjZSgiQ1JFQVRFIEtFWVNQQUNFICVzIHdpdGggcmVwbGljYXRpb24gPSB7ICdjbGFzcycgOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJyA6IDEgfSBhbmQgZHVyYWJsZV93cml0ZXMgPSBmYWxzZSIpOworICAgICAgICBTdHJpbmcgdGFibGUgPSBjcmVhdGVUYWJsZShrZXlzcGFjZSwgIkNSRUFURSBUQUJMRSAlcyAoIHVzZXJpZCBiaWdpbnQsIHBpY2lkIGJpZ2ludCwgY29tbWVudGlkIGJpZ2ludCwgUFJJTUFSWSBLRVkodXNlcmlkLCBwaWNpZCkpIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29tcHJlc3Npb24gPSB7J2VuYWJsZWQnOiBmYWxzZX0iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIG1lbXRhYmxlID0gJyIgKyBtZW10YWJsZUNsYXNzICsgIiciKTsKKyAgICAgICAgZXhlY3V0ZSgidXNlICIgKyBrZXlzcGFjZSArICc7Jyk7CisKKyAgICAgICAgU3RyaW5nIHdyaXRlU3RhdGVtZW50ID0gIklOU0VSVCBJTlRPICIrdGFibGUrIih1c2VyaWQscGljaWQsY29tbWVudGlkKVZBTFVFUyg/LD8sPykiOworCisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oa2V5c3BhY2UpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhYmxlKTsKKyAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBVdGlsLmZsdXNoKGNmcyk7CisKKyAgICAgICAgbG9uZyBpOworICAgICAgICBsb25nIGxpbWl0ID0gcGFydGl0aW9uczsKKyAgICAgICAgbG9nZ2VyLmluZm8oIldyaXRpbmcge30gcGFydGl0aW9ucyBvZiB7fSByb3dzIiwgcGFydGl0aW9ucywgcm93c1BlclBhcnRpdGlvbik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW1pdDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGxvbmcgaiA9IDA7IGogPCByb3dzUGVyUGFydGl0aW9uOyArK2opCisgICAgICAgICAgICAgICAgZXhlY3V0ZSh3cml0ZVN0YXRlbWVudCwgaSwgaiwgaSArIGopOworICAgICAgICB9CisKKyAgICAgICAgbG9nZ2VyLmluZm8oIkRlbGV0aW5nIHBhcnRpdGlvbnMgYmV0d2VlbiB7fSBhbmQge30iLCBkZWxldGVkUGFydGl0aW9uc1N0YXJ0LCBkZWxldGVkUGFydGl0aW9uc0VuZCk7CisgICAgICAgIGZvciAoaSA9IGRlbGV0ZWRQYXJ0aXRpb25zU3RhcnQ7IGkgPCBkZWxldGVkUGFydGl0aW9uc0VuZDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBubyBwYXJ0aXRpb24gZXhpc3RzLCBidXQgd2Ugd2lsbCBjcmVhdGUgYSB0b21ic3RvbmUKKyAgICAgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICIgKyB0YWJsZSArICIgV0hFUkUgdXNlcmlkID0gPyIsIGkpOworICAgICAgICB9CisKKyAgICAgICAgbG9nZ2VyLmluZm8oIkRlbGV0aW5nIHJvd3MgYmV0d2VlbiB7fSBhbmQge30iLCBkZWxldGVkUm93c1N0YXJ0LCBkZWxldGVkUm93c0VuZCk7CisgICAgICAgIGZvciAoaSA9IGRlbGV0ZWRSb3dzU3RhcnQ7IGkgPCBkZWxldGVkUm93c0VuZDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBubyByb3cgZXhpc3RzLCBidXQgd2Ugd2lsbCBjcmVhdGUgYSB0b21ic3RvbmUgKGFuZCBwYXJ0aXRpb24pCisgICAgICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAiICsgdGFibGUgKyAiIFdIRVJFIHVzZXJpZCA9ID8gQU5EIHBpY2lkID0gPyIsIGksIDBMKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvZ2dlci5pbmZvKCJSZWFkaW5nIHt9IHBhcnRpdGlvbnMiLCBwYXJ0aXRpb25zKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbWl0OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0ID0gZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAiICsgdGFibGUgKyAiIFdIRVJFIHVzZXJpZCA9ID8iLCBpKTsKKyAgICAgICAgICAgIGlmIChpID49IGRlbGV0ZWRQYXJ0aXRpb25zU3RhcnQgJiYgaSA8IGRlbGV0ZWRQYXJ0aXRpb25zRW5kKQorICAgICAgICAgICAgICAgIGFzc2VydEVtcHR5KHJlc3VsdCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoaSA+PSBkZWxldGVkUm93c1N0YXJ0ICYmIGkgPCBkZWxldGVkUm93c0VuZCkKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAxOworICAgICAgICAgICAgICAgIE9iamVjdFtdW10gcm93cyA9IG5ldyBPYmplY3Rbcm93c1BlclBhcnRpdGlvbiAtIHN0YXJ0XVtdOworICAgICAgICAgICAgICAgIGZvciAobG9uZyBqID0gc3RhcnQ7IGogPCByb3dzUGVyUGFydGl0aW9uOyArK2opCisgICAgICAgICAgICAgICAgICAgIHJvd3NbKGludCkgKGogLSBzdGFydCldID0gcm93KGksIGosIGkgKyBqKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRSb3dzKHJlc3VsdCwgcm93cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgZGVsZXRlZFBhcnRpdGlvbnMgPSBkZWxldGVkUGFydGl0aW9uc0VuZCAtIGRlbGV0ZWRQYXJ0aXRpb25zU3RhcnQ7CisgICAgICAgIGludCBkZWxldGVkUm93cyA9IGRlbGV0ZWRSb3dzRW5kIC0gZGVsZXRlZFJvd3NTdGFydDsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlNlbGVjdGluZyAqIik7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0ID0gZXhlY3V0ZSgiU0VMRUNUICogRlJPTSAiICsgdGFibGUpOworICAgICAgICBhc3NlcnRSb3dDb3VudChyZXN1bHQsIHJvd3NQZXJQYXJ0aXRpb24gKiAocGFydGl0aW9ucyAtIGRlbGV0ZWRQYXJ0aXRpb25zKSAtIGRlbGV0ZWRSb3dzKTsKKworICAgICAgICBVdGlsLmZsdXNoKGNmcyk7CisKKyAgICAgICAgbG9nZ2VyLmluZm8oIlNlbGVjdGluZyAqIik7CisgICAgICAgIHJlc3VsdCA9IGV4ZWN1dGUoIlNFTEVDVCAqIEZST00gIiArIHRhYmxlKTsKKyAgICAgICAgYXNzZXJ0Um93Q291bnQocmVzdWx0LCByb3dzUGVyUGFydGl0aW9uICogKHBhcnRpdGlvbnMgLSBkZWxldGVkUGFydGl0aW9ucykgLSBkZWxldGVkUm93cyk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9NZW10YWJsZVNpemVIZWFwQnVmZmVyc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9NZW10YWJsZVNpemVIZWFwQnVmZmVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDk3ZThjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlU2l6ZUhlYXBCdWZmZXJzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGU7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5Lk1lbXRhYmxlUG9vbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuU2xhYlBvb2w7CisKK3B1YmxpYyBjbGFzcyBNZW10YWJsZVNpemVIZWFwQnVmZmVyc1Rlc3QgZXh0ZW5kcyBNZW10YWJsZVNpemVUZXN0QmFzZQoreworICAgIC8vIE92ZXJyaWRlcyBDUUxUZXN0ZXIuc2V0VXBDbGFzcyB0byBydW4gYmVmb3JlIGl0CisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKQorICAgIHsKKyAgICAgICAgc2V0dXAoQ29uZmlnLk1lbXRhYmxlQWxsb2NhdGlvblR5cGUuaGVhcF9idWZmZXJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGNoZWNrTWVtdGFibGVQb29sKCkKKyAgICB7CisgICAgICAgIE1lbXRhYmxlUG9vbCBtZW1vcnlQb29sID0gQWJzdHJhY3RBbGxvY2F0b3JNZW10YWJsZS5NRU1PUllfUE9PTDsKKyAgICAgICAgbG9nZ2VyLmluZm8oIk1lbXRhYmxlIHBvb2wge30gb2ZmLWhlYXAgbGltaXQge30iLCBtZW1vcnlQb29sLCBtZW1vcnlQb29sLm9mZkhlYXAubGltaXQpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZW1vcnlQb29sIGluc3RhbmNlb2YgU2xhYlBvb2wpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lbW9yeVBvb2wub2ZmSGVhcC5saW1pdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlU2l6ZU9mZmhlYXBCdWZmZXJzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlU2l6ZU9mZmhlYXBCdWZmZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMmY0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVTaXplT2ZmaGVhcEJ1ZmZlcnNUZXN0LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTWVtdGFibGVQb29sOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5TbGFiUG9vbDsKKworcHVibGljIGNsYXNzIE1lbXRhYmxlU2l6ZU9mZmhlYXBCdWZmZXJzVGVzdCBleHRlbmRzIE1lbXRhYmxlU2l6ZVRlc3RCYXNlCit7CisgICAgLy8gT3ZlcnJpZGVzIENRTFRlc3Rlci5zZXRVcENsYXNzIHRvIHJ1biBiZWZvcmUgaXQKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCisgICAgeworICAgICAgICBzZXR1cChDb25maWcuTWVtdGFibGVBbGxvY2F0aW9uVHlwZS5vZmZoZWFwX2J1ZmZlcnMpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBjaGVja01lbXRhYmxlUG9vbCgpCisgICAgeworICAgICAgICBNZW10YWJsZVBvb2wgbWVtb3J5UG9vbCA9IEFic3RyYWN0QWxsb2NhdG9yTWVtdGFibGUuTUVNT1JZX1BPT0w7CisgICAgICAgIGxvZ2dlci5pbmZvKCJNZW10YWJsZSBwb29sIHt9IG9mZi1oZWFwIGxpbWl0IHt9IiwgbWVtb3J5UG9vbCwgbWVtb3J5UG9vbC5vZmZIZWFwLmxpbWl0KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVtb3J5UG9vbCBpbnN0YW5jZW9mIFNsYWJQb29sKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVtb3J5UG9vbC5vZmZIZWFwLmxpbWl0ID4gMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlU2l6ZU9mZmhlYXBPYmplY3RzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlU2l6ZU9mZmhlYXBPYmplY3RzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OWY0NTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVTaXplT2ZmaGVhcE9iamVjdHNUZXN0LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTWVtdGFibGVQb29sOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5OYXRpdmVQb29sOworCitwdWJsaWMgY2xhc3MgTWVtdGFibGVTaXplT2ZmaGVhcE9iamVjdHNUZXN0IGV4dGVuZHMgTWVtdGFibGVTaXplVGVzdEJhc2UKK3sKKyAgICAvLyBPdmVycmlkZXMgQ1FMVGVzdGVyLnNldFVwQ2xhc3MgdG8gcnVuIGJlZm9yZSBpdAorICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkKKyAgICB7CisgICAgICAgIHNldHVwKENvbmZpZy5NZW10YWJsZUFsbG9jYXRpb25UeXBlLm9mZmhlYXBfb2JqZWN0cyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBjaGVja01lbXRhYmxlUG9vbCgpCisgICAgeworICAgICAgICBNZW10YWJsZVBvb2wgbWVtb3J5UG9vbCA9IEFic3RyYWN0QWxsb2NhdG9yTWVtdGFibGUuTUVNT1JZX1BPT0w7CisgICAgICAgIGxvZ2dlci5pbmZvKCJNZW10YWJsZSBwb29sIHt9IG9mZi1oZWFwIGxpbWl0IHt9IiwgbWVtb3J5UG9vbCwgbWVtb3J5UG9vbC5vZmZIZWFwLmxpbWl0KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVtb3J5UG9vbCBpbnN0YW5jZW9mIE5hdGl2ZVBvb2wpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9NZW10YWJsZVNpemVUZXN0QmFzZS5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL01lbXRhYmxlU2l6ZVRlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2MDUyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9NZW10YWJsZVNpemVUZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmdpdGh1Yi5qYW1tLk1lbW9yeU1ldGVyOworCisvLyBOb3RlOiBUaGlzIHRlc3QgY2FuIGJlIHJ1biBpbiBpZGVhIHdpdGggdGhlIGFsbG9jYXRpb24gdHlwZSBjb25maWd1cmVkIGluIHRoZSB0ZXN0IHlhbWwgYW5kIG1lbXRhYmxlIHVzaW5nIHRoZQorLy8gdmFsdWUgbWVtdGFibGVDbGFzcyBpcyBpbml0aWFsaXplZCB3aXRoLgorQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZW10YWJsZVNpemVUZXN0QmFzZSBleHRlbmRzIENRTFRlc3RlcgoreworICAgIC8vIE5vdGU6IFRvIHNlZSBhIHByaW50b3V0IG9mIHRoZSB1c2FnZSBmb3IgZWFjaCBvYmplY3QsIGFkZCAuZW5hYmxlRGVidWcoKSBoZXJlIChtb3N0IHVzZWZ1bCB3aXRoIHNtYWxsZXIgbnVtYmVyIG9mCisgICAgLy8gcGFydGl0aW9ucykuCisgICAgc3RhdGljIE1lbW9yeU1ldGVyIG1ldGVyID0gbmV3IE1lbW9yeU1ldGVyKCkuaWdub3JlS25vd25TaW5nbGV0b25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoR3Vlc3NpbmcoTWVtb3J5TWV0ZXIuR3Vlc3MuRkFMTEJBQ0tfVU5TQUZFKTsKKworICAgIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTWVtdGFibGVTaXplVGVzdEJhc2UuY2xhc3MpOworCisgICAgc3RhdGljIGZpbmFsIGludCBwYXJ0aXRpb25zID0gNTBfMDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgcm93c1BlclBhcnRpdGlvbiA9IDQ7CisKKyAgICBzdGF0aWMgZmluYWwgaW50IGRlbGV0ZWRQYXJ0aXRpb25zID0gMTBfMDAwOworICAgIHN0YXRpYyBmaW5hbCBpbnQgZGVsZXRlZFJvd3MgPSA1XzAwMDsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcigwKQorICAgIHB1YmxpYyBTdHJpbmcgbWVtdGFibGVDbGFzcyA9ICJza2lwbGlzdCI7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiezB9IikKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0PiBwYXJhbWV0ZXJzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBJbW11dGFibGVMaXN0Lm9mKCJza2lwbGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJza2lwbGlzdF9zaGFyZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyaWUiKTsKKyAgICB9CisKKyAgICAvLyBNdXN0IGJlIHdpdGhpbiAzJSBvZiB0aGUgcmVhbCB1c2FnZS4gV2UgYXJlIGFjdHVhbGx5IG1vcmUgcHJlY2lzZSB0aGFuIHRoaXMsIGJ1dCB0aGUgdGhyZXNob2xkIGlzIHNldCBoaWdoZXIgdG8KKyAgICAvLyBhdm9pZCBmbGFrZXMuIEZvciBvbi1oZWFwIGFsbG9jYXRvcnMgd2UgYWxsb3cgZm9yIGV4dHJhIG92ZXJoZWFkcyBiZWxvdy4KKyAgICBmaW5hbCBpbnQgTUFYX0RJRkZFUkVOQ0VfUEVSQ0VOVCA9IDM7CisgICAgLy8gU2xhYiBvdmVyaGVhZCwgYWRkZWQgd2hlbiB0aGUgbWVtdGFibGUgdXNlcyBoZWFwX2J1ZmZlcnMuCisgICAgZmluYWwgaW50IFNMQUJfT1ZFUkhFQUQgPSAxMDI0ICogMTAyNDsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cChDb25maWcuTWVtdGFibGVBbGxvY2F0aW9uVHlwZSBhbGxvY2F0aW9uVHlwZSkKKyAgICB7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgRmllbGQgY29uZkZpZWxkID0gRGF0YWJhc2VEZXNjcmlwdG9yLmNsYXNzLmdldERlY2xhcmVkRmllbGQoImNvbmYiKTsKKyAgICAgICAgICAgIGNvbmZGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgQ29uZmlnIGNvbmYgPSAoQ29uZmlnKSBjb25mRmllbGQuZ2V0KG51bGwpOworICAgICAgICAgICAgY29uZi5tZW10YWJsZV9hbGxvY2F0aW9uX3R5cGUgPSBhbGxvY2F0aW9uVHlwZTsKKyAgICAgICAgICAgIGNvbmYubWVtdGFibGVfY2xlYW51cF90aHJlc2hvbGQgPSAwLjhmOyAvLyBnaXZlIHVzIG1vcmUgc3BhY2UgdG8gZml0IHRlc3QgZGF0YSB3aXRob3V0IGZsdXNoaW5nCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7CisgICAgICAgIENRTFRlc3Rlci5wcmVwYXJlU2VydmVyKCk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJzZXR1cENsYXNzIGRvbmUsIGFsbG9jYXRpb24gdHlwZSB7fSIsIGFsbG9jYXRpb25UeXBlKTsKKyAgICB9CisKKyAgICB2b2lkIGNoZWNrTWVtdGFibGVQb29sKCkKKyAgICB7CisgICAgICAgIC8vIG92ZXJyaWRkZW4gYnkgaW5zdGFuY2VzCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBtZW10YWJsZXMgdXNlIHRoZSBjb3JyZWN0IGFsbG9jYXRpb24gdHlwZSwgaS5lLiB0aGF0IHNldHVwIGhhcyB3b3JrZWQuCisgICAgICAgIC8vIElmIHRoaXMgZmFpbHMsIG1ha2Ugc3VyZSB0aGUgdGVzdCBpcyBub3QgcmV1c2luZyBhbiBhbHJlYWR5LWluaXRpYWxpemVkIEpWTS4KKyAgICAgICAgY2hlY2tNZW10YWJsZVBvb2woKTsKKworICAgICAgICBDUUxUZXN0ZXIuZGlzYWJsZVByZXBhcmVkUmV1c2VGb3JUZXN0KCk7CisgICAgICAgIFN0cmluZyBrZXlzcGFjZSA9IGNyZWF0ZUtleXNwYWNlKCJDUkVBVEUgS0VZU1BBQ0UgJXMgd2l0aCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogMSB9IGFuZCBkdXJhYmxlX3dyaXRlcyA9IGZhbHNlIik7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdGFibGUgPSBjcmVhdGVUYWJsZShrZXlzcGFjZSwgIkNSRUFURSBUQUJMRSAlcyAoIHVzZXJpZCBiaWdpbnQsIHBpY2lkIGJpZ2ludCwgY29tbWVudGlkIGJpZ2ludCwgUFJJTUFSWSBLRVkodXNlcmlkLCBwaWNpZCkpIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIGNvbXByZXNzaW9uID0geydlbmFibGVkJzogZmFsc2V9IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgbWVtdGFibGUgPSAnIiArIG1lbXRhYmxlQ2xhc3MgKyAiJyIpOworICAgICAgICAgICAgZXhlY3V0ZSgidXNlICIgKyBrZXlzcGFjZSArICc7Jyk7CisKKyAgICAgICAgICAgIFN0cmluZyB3cml0ZVN0YXRlbWVudCA9ICJJTlNFUlQgSU5UTyAiICsgdGFibGUgKyAiKHVzZXJpZCxwaWNpZCxjb21tZW50aWQpVkFMVUVTKD8sPyw/KSI7CisgICAgICAgICAgICBmb3JjZVByZXBhcmVkVmFsdWVzKCk7CisKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oa2V5c3BhY2UpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhYmxlKTsKKyAgICAgICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKKworICAgICAgICAgICAgTWVtdGFibGUgbWVtdGFibGUgPSBjZnMuZ2V0VHJhY2tlcigpLmdldFZpZXcoKS5nZXRDdXJyZW50TWVtdGFibGUoKTsKKyAgICAgICAgICAgIGxvbmcgZGVlcFNpemVCZWZvcmUgPSBtZXRlci5tZWFzdXJlRGVlcChtZW10YWJsZSk7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiTWVtdGFibGUgZGVlcCBzaXplIGJlZm9yZSB7fSIsIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGRlZXBTaXplQmVmb3JlKSk7CisgICAgICAgICAgICBsb25nIGk7CisgICAgICAgICAgICBsb25nIGxpbWl0ID0gcGFydGl0aW9uczsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJXcml0aW5nIHt9IHBhcnRpdGlvbnMgb2Yge30gcm93cyIsIHBhcnRpdGlvbnMsIHJvd3NQZXJQYXJ0aXRpb24pOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbWl0OyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChsb25nIGogPSAwOyBqIDwgcm93c1BlclBhcnRpdGlvbjsgKytqKQorICAgICAgICAgICAgICAgICAgICBleGVjdXRlKHdyaXRlU3RhdGVtZW50LCBpLCBqLCBpICsgaik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJEZWxldGluZyB7fSBwYXJ0aXRpb25zIiwgZGVsZXRlZFBhcnRpdGlvbnMpOworICAgICAgICAgICAgbGltaXQgKz0gZGVsZXRlZFBhcnRpdGlvbnM7CisgICAgICAgICAgICBmb3IgKDsgaSA8IGxpbWl0OyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbm8gcGFydGl0aW9uIGV4aXN0cywgYnV0IHdlIHdpbGwgY3JlYXRlIGEgdG9tYnN0b25lCisgICAgICAgICAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gIiArIHRhYmxlICsgIiBXSEVSRSB1c2VyaWQgPSA/IiwgaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJEZWxldGluZyB7fSByb3dzIiwgZGVsZXRlZFJvd3MpOworICAgICAgICAgICAgbGltaXQgKz0gZGVsZXRlZFJvd3M7CisgICAgICAgICAgICBmb3IgKDsgaSA8IGxpbWl0OyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbm8gcm93IGV4aXN0cywgYnV0IHdlIHdpbGwgY3JlYXRlIGEgdG9tYnN0b25lIChhbmQgcGFydGl0aW9uKQorICAgICAgICAgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICIgKyB0YWJsZSArICIgV0hFUkUgdXNlcmlkID0gPyBBTkQgcGljaWQgPSA/IiwgaSwgMEwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0U2FtZSgiTWVtdGFibGUgZmx1c2hlZCBkdXJpbmcgdGVzdC4gVGVzdCB3YXMgbm90IGNhcnJpZWQgb3V0IGNvcnJlY3RseS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMuZ2V0VHJhY2tlcigpLmdldFZpZXcoKS5nZXRDdXJyZW50TWVtdGFibGUoKSk7CisKKyAgICAgICAgICAgIE1lbXRhYmxlLk1lbW9yeVVzYWdlIHVzYWdlID0gTWVtdGFibGUuZ2V0TWVtb3J5VXNhZ2UobWVtdGFibGUpOworICAgICAgICAgICAgbG9uZyBhY3R1YWxIZWFwID0gdXNhZ2Uub3duc09uSGVhcDsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKFN0cmluZy5mb3JtYXQoIk1lbXRhYmxlIGluICVzIG1vZGU6ICVkIG9wcywgJXMgc2VyaWFsaXplZCBieXRlcywgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TWVtdGFibGVBbGxvY2F0aW9uVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW10YWJsZS5vcGVyYXRpb25Db3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShtZW10YWJsZS5nZXRMaXZlRGF0YVNpemUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKSk7CisKKyAgICAgICAgICAgIGxvbmcgZGVlcFNpemVBZnRlciA9IG1ldGVyLm1lYXN1cmVEZWVwKG1lbXRhYmxlKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJNZW10YWJsZSBkZWVwIHNpemUge30iLCBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShkZWVwU2l6ZUFmdGVyKSk7CisKKyAgICAgICAgICAgIGxvbmcgZXhwZWN0ZWRIZWFwID0gZGVlcFNpemVBZnRlciAtIGRlZXBTaXplQmVmb3JlOworICAgICAgICAgICAgbG9uZyBtYXhfZGlmZmVyZW5jZSA9IE1BWF9ESUZGRVJFTkNFX1BFUkNFTlQgKiBleHBlY3RlZEhlYXAgLyAxMDA7CisgICAgICAgICAgICBsb25nIHRyaWVfb3ZlcmhlYWQgPSBtZW10YWJsZSBpbnN0YW5jZW9mIFRyaWVNZW10YWJsZSA/ICgoVHJpZU1lbXRhYmxlKSBtZW10YWJsZSkudW51c2VkUmVzZXJ2ZWRNZW1vcnkoKSA6IDA7CisgICAgICAgICAgICBzd2l0Y2ggKERhdGFiYXNlRGVzY3JpcHRvci5nZXRNZW10YWJsZUFsbG9jYXRpb25UeXBlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBoZWFwX2J1ZmZlcnM6CisgICAgICAgICAgICAgICAgICAgIG1heF9kaWZmZXJlbmNlICs9IFNMQUJfT1ZFUkhFQUQ7CisgICAgICAgICAgICAgICAgICAgIGFjdHVhbEhlYXAgKz0gdHJpZV9vdmVyaGVhZDsgICAgLy8gYWRqdXN0IHRyaWUgbWVtb3J5IHdpdGggdW51c2VkIGJ1ZmZlciBzcGFjZSBpZiBvbi1oZWFwCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgdW5zbGFiYmVkX2hlYXBfYnVmZmVyczoKKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsSGVhcCArPSB0cmllX292ZXJoZWFkOyAgICAvLyBhZGp1c3QgdHJpZSBtZW1vcnkgd2l0aCB1bnVzZWQgYnVmZmVyIHNwYWNlIGlmIG9uLWhlYXAKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIGhlYXAgdXNhZ2UgY2xvc2UgdG8gJXMsIGdvdCAlcywgJXMgZGlmZmVyZW5jZS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkJVdGlsaXRpZXMucHJldHR5UHJpbnRNZW1vcnkoZXhwZWN0ZWRIZWFwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShhY3R1YWxIZWFwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShleHBlY3RlZEhlYXAgLSBhY3R1YWxIZWFwKSk7CisgICAgICAgICAgICBsb2dnZXIuaW5mbyhtZXNzYWdlKTsKKyAgICAgICAgICAgIGlmIChNYXRoLmFicyhhY3R1YWxIZWFwIC0gZXhwZWN0ZWRIZWFwKSA+IG1heF9kaWZmZXJlbmNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFVuZGVyIEphdmEgMTEsIGl0IHNlZW1zIHRoZSBtZXRlciBjYW4gcmVhY2ggaW50byBwaGFudG9tIHJlZmVyZW5jZSBxdWV1ZXMgYW5kIGNvdW50IG1vcmUgc3BhY2UgdGhhbgorICAgICAgICAgICAgICAgIC8vIGlzIGFjdHVhbGx5IHJlYWNoYWJsZS4gVW5mb3J0dW5hdGVseSBpZ25vcmVOb25TdHJvbmdSZWZlcmVuY2VzKCkgZG9lcyBub3QgaGVscCAod29yc2UsIGl0IHRocm93cworICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbnMgdHJ5aW5nIHRvIGdldCBhIHBoYW50b20gcmVmZXJyZW50KS4gUmV0cnlpbmcgdGhlIG1lYXN1cmVtZW50IGFwcGVhcnMgdG8gY2xlYXIgdGhlc2UgdXAuCisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwKTsKKyAgICAgICAgICAgICAgICBsb25nIHNlY29uZFBhc3MgPSBtZXRlci5tZWFzdXJlRGVlcChtZW10YWJsZSk7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJEZWVwIHNpemUgZmlyc3QgcGFzcyB7fSBzZWNvbmQgcGFzcyB7fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZCVXRpbGl0aWVzLnByZXR0eVByaW50TWVtb3J5KGRlZXBTaXplQWZ0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5wcmV0dHlQcmludE1lbW9yeShzZWNvbmRQYXNzKSk7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRIZWFwID0gc2Vjb25kUGFzcyAtIGRlZXBTaXplQmVmb3JlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLCBNYXRoLmFicyhhY3R1YWxIZWFwIC0gZXhwZWN0ZWRIZWFwKSA8PSBtYXhfZGlmZmVyZW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBleGVjdXRlKFN0cmluZy5mb3JtYXQoIkRST1AgS0VZU1BBQ0UgSUYgRVhJU1RTICVzIiwga2V5c3BhY2UpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9NZW10YWJsZVNpemVVbnNsYWJiZWRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVTaXplVW5zbGFiYmVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OWE0NzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvbWVtdGFibGUvTWVtdGFibGVTaXplVW5zbGFiYmVkVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGU7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMubWVtb3J5LkhlYXBQb29sOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW10YWJsZVBvb2w7CisKK3B1YmxpYyBjbGFzcyBNZW10YWJsZVNpemVVbnNsYWJiZWRUZXN0IGV4dGVuZHMgTWVtdGFibGVTaXplVGVzdEJhc2UKK3sKKyAgICAvLyBPdmVycmlkZXMgQ1FMVGVzdGVyLnNldFVwQ2xhc3MgdG8gcnVuIGJlZm9yZSBpdAorICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcENsYXNzKCkKKyAgICB7CisgICAgICAgIHNldHVwKENvbmZpZy5NZW10YWJsZUFsbG9jYXRpb25UeXBlLnVuc2xhYmJlZF9oZWFwX2J1ZmZlcnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgY2hlY2tNZW10YWJsZVBvb2woKQorICAgIHsKKyAgICAgICAgTWVtdGFibGVQb29sIG1lbW9yeVBvb2wgPSBBYnN0cmFjdEFsbG9jYXRvck1lbXRhYmxlLk1FTU9SWV9QT09MOworICAgICAgICBsb2dnZXIuaW5mbygiTWVtdGFibGUgcG9vbCB7fSBvZmYtaGVhcCBsaW1pdCB7fSIsIG1lbW9yeVBvb2wsIG1lbW9yeVBvb2wub2ZmSGVhcC5saW1pdCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lbW9yeVBvb2wgaW5zdGFuY2VvZiBIZWFwUG9vbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL21lbXRhYmxlL1NoYXJkZWRNZW10YWJsZUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9TaGFyZGVkTWVtdGFibGVDb25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1MDc5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9tZW10YWJsZS9TaGFyZGVkTWVtdGFibGVDb25maWdUZXN0LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tZW10YWJsZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkluc3RhbmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnZhbGlkQXR0cmlidXRlVmFsdWVFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuUmVmbGVjdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1lbXRhYmxlLkFic3RyYWN0U2hhcmRlZE1lbXRhYmxlLlNIQVJERURfTUVNVEFCTEVfQ09ORklHX09CSkVDVF9OQU1FOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFNoYXJkZWRNZW10YWJsZUNvbmZpZ1Rlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKK3sKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBzdGFydEpNWFNlcnZlcigpOworICAgICAgICBjcmVhdGVNQmVhblNlcnZlckNvbm5lY3Rpb24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U2hhcmRDb3VudFNldEJ5Sk1YKCkgdGhyb3dzIE1hbGZvcm1lZE9iamVjdE5hbWVFeGNlcHRpb24sIFJlZmxlY3Rpb25FeGNlcHRpb24sIEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uLCBJbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uLCBNQmVhbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEludmFsaWRBdHRyaWJ1dGVWYWx1ZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIGNoZWNrIHRoZSBkZWZhdWx0LCBidXQgYWxzbyBtYWtlIHN1cmUgdGhlIGNsYXNzIGlzIGluaXRpYWxpemVkIGlmIHRoZSBkZWZhdWx0IG1lbXRhYmxlIGlzIG5vdCBzaGFyZGVkCisgICAgICAgIGFzc2VydEVxdWFscyhGQlV0aWxpdGllcy5nZXRBdmFpbGFibGVQcm9jZXNzb3JzKCksIEFic3RyYWN0U2hhcmRlZE1lbXRhYmxlLmdldERlZmF1bHRTaGFyZENvdW50KCkpOworICAgICAgICBqbXhDb25uZWN0aW9uLnNldEF0dHJpYnV0ZShuZXcgT2JqZWN0TmFtZShTSEFSREVEX01FTVRBQkxFX0NPTkZJR19PQkpFQ1RfTkFNRSksIG5ldyBBdHRyaWJ1dGUoIkRlZmF1bHRTaGFyZENvdW50IiwgIjciKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBBYnN0cmFjdFNoYXJkZWRNZW10YWJsZS5nZXREZWZhdWx0U2hhcmRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI3Iiwgam14Q29ubmVjdGlvbi5nZXRBdHRyaWJ1dGUobmV3IE9iamVjdE5hbWUoU0hBUkRFRF9NRU1UQUJMRV9DT05GSUdfT0JKRUNUX05BTUUpLCAiRGVmYXVsdFNoYXJkQ291bnQiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b1NoYXJkQ291bnQoKSB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiwgUmVmbGVjdGlvbkV4Y2VwdGlvbiwgQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24sIEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24sIE1CZWFuRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgSW52YWxpZEF0dHJpYnV0ZVZhbHVlRXhjZXB0aW9uCisgICAgeworICAgICAgICBBYnN0cmFjdFNoYXJkZWRNZW10YWJsZS5nZXREZWZhdWx0U2hhcmRDb3VudCgpOyAgICAvLyBpbml0aWFsaXplIGNsYXNzCisgICAgICAgIGpteENvbm5lY3Rpb24uc2V0QXR0cmlidXRlKG5ldyBPYmplY3ROYW1lKFNIQVJERURfTUVNVEFCTEVfQ09ORklHX09CSkVDVF9OQU1FKSwgbmV3IEF0dHJpYnV0ZSgiRGVmYXVsdFNoYXJkQ291bnQiLCAiYXV0byIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZCVXRpbGl0aWVzLmdldEF2YWlsYWJsZVByb2Nlc3NvcnMoKSwgQWJzdHJhY3RTaGFyZGVkTWVtdGFibGUuZ2V0RGVmYXVsdFNoYXJkQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnRvU3RyaW5nKEZCVXRpbGl0aWVzLmdldEF2YWlsYWJsZVByb2Nlc3NvcnMoKSksCisgICAgICAgICAgICAgICAgICAgICBqbXhDb25uZWN0aW9uLmdldEF0dHJpYnV0ZShuZXcgT2JqZWN0TmFtZShTSEFSREVEX01FTVRBQkxFX0NPTkZJR19PQkpFQ1RfTkFNRSksICJEZWZhdWx0U2hhcmRDb3VudCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcGFydGl0aW9ucy9BdG9taWNCVHJlZVBhcnRpdGlvbk1lbXRhYmxlQWNjb3VudGluZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0F0b21pY0JUcmVlUGFydGl0aW9uTWVtdGFibGVBY2NvdW50aW5nVGVzdC5qYXZhCmluZGV4IDA0MTk2ZjYuLjhiNzU1YWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0F0b21pY0JUcmVlUGFydGl0aW9uTWVtdGFibGVBY2NvdW50aW5nVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9wYXJ0aXRpb25zL0F0b21pY0JUcmVlUGFydGl0aW9uTWVtdGFibGVBY2NvdW50aW5nVGVzdC5qYXZhCkBAIC0zMjIsNyArMzIyLDcgQEAKIAogICAgICAgICAgICAgICAgIE9wT3JkZXIuR3JvdXAgd3JpdGVPcCA9IG9wT3JkZXIuZ2V0Q3VycmVudCgpOwogICAgICAgICAgICAgICAgIENsb25lciBjbG9uZXIgPSBhbGxvY2F0b3IuY2xvbmVyKHdyaXRlT3ApOwotICAgICAgICAgICAgICAgIHBhcnRpdGlvbi5hZGRBbGxXaXRoU2l6ZURlbHRhKHVwZGF0ZSwgY2xvbmVyLCB3cml0ZU9wLCBpbmRleGVyKTsKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb24uYWRkQWxsKHVwZGF0ZSwgY2xvbmVyLCB3cml0ZU9wLCBpbmRleGVyKTsKICAgICAgICAgICAgICAgICBvcE9yZGVyLm5ld0JhcnJpZXIoKS5pc3N1ZSgpOwogCiAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChhbGxvY2F0b3Iub25IZWFwKCkub3ducygpKS5pc0dyZWF0ZXJUaGFuT3JFcXVhbFRvKDBMKTsKQEAgLTMzOCw3ICszMzgsNyBAQAogICAgICAgICAgICAgICAgIG9wT3JkZXIubmV3QmFycmllcigpLmlzc3VlKCk7CiAgICAgICAgICAgICAgICAgT3BPcmRlci5Hcm91cCB3cml0ZU9wID0gb3BPcmRlci5nZXRDdXJyZW50KCk7CiAgICAgICAgICAgICAgICAgQ2xvbmVyIGNsb25lciA9IHJlY3JlYXRlZEFsbG9jYXRvci5jbG9uZXIod3JpdGVPcCk7Ci0gICAgICAgICAgICAgICAgcmVjcmVhdGVkLmFkZEFsbFdpdGhTaXplRGVsdGEodXBkYXRlLCBjbG9uZXIsIHdyaXRlT3AsIGluZGV4ZXIpOworICAgICAgICAgICAgICAgIHJlY3JlYXRlZC5hZGRBbGwodXBkYXRlLCBjbG9uZXIsIHdyaXRlT3AsIGluZGV4ZXIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBvZmZoZWFwIGFsbG9jYXRvcnMgZG9uJ3QgcmVsZWFzZSBvbiBoZWFwIG1lbW9yeSwgc28gZXhwZWN0IHRoZSBzYW1lCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcmVwYWlyL1BlbmRpbmdBbnRpQ29tcGFjdGlvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yZXBhaXIvUGVuZGluZ0FudGlDb21wYWN0aW9uVGVzdC5qYXZhCmluZGV4IGE1NTk0NzguLmM5NWIyZGIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yZXBhaXIvUGVuZGluZ0FudGlDb21wYWN0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yZXBhaXIvUGVuZGluZ0FudGlDb21wYWN0aW9uVGVzdC5qYXZhCkBAIC00MSwxNyArNDEsMTQgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTGlzdGVuYWJsZUZ1dHVyZTsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTW9yZUV4ZWN1dG9yczsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvclBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5GdXR1cmVUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuSW1tZWRpYXRlRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5GdXR1cmU7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5FeGVjdXRvclBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5GdXR1cmVUYXNrOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuSW1tZWRpYXRlRXhlY3V0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwpAQCAtNzgsNyArNzUsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlByZXZpZXdLaW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuV3JhcHBlZFJ1bm5hYmxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuVHJhbnNhY3Rpb25hbDsKIApAQCAtNjY1LDE0ICs2NjUsMjMgQEAKICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcHBseShTU1RhYmxlUmVhZGVyIHNzdGFibGUpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjZGwuY291bnREb3duKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjZGwuZ2V0Q291bnQoKSA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGVuZGluZ0FudGlDb21wYWN0aW9uLlNTVGFibGVBY3F1aXNpdGlvbkV4Y2VwdGlvbigiYmxhaCIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9OworCiAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuYmVnaW5Db21wYWN0aW9uKGhvbGRlcik7Ci0gICAgICAgICAgICBQZW5kaW5nQW50aUNvbXBhY3Rpb24uQWNxdWlzaXRpb25DYWxsYWJsZSBhY3F1aXNpdGlvbkNhbGxhYmxlID0gbmV3IFBlbmRpbmdBbnRpQ29tcGFjdGlvbi5BY3F1aXNpdGlvbkNhbGxhYmxlKGNmcywgbmV4dFRpbWVVVUlEKCksIDEwLCAxLCBhY3ApOworICAgICAgICAgICAgUGVuZGluZ0FudGlDb21wYWN0aW9uLkFjcXVpc2l0aW9uQ2FsbGFibGUgYWNxdWlzaXRpb25DYWxsYWJsZSA9IG5ldyBQZW5kaW5nQW50aUNvbXBhY3Rpb24uQWNxdWlzaXRpb25DYWxsYWJsZShjZnMsIG5leHRUaW1lVVVJRCgpLCAxMCwgMSwgYWNwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb3RlY3RlZCBQZW5kaW5nQW50aUNvbXBhY3Rpb24uQWNxdWlyZVJlc3VsdCBhY3F1aXJlU1NUYWJsZXMoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2RsLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2RsLmdldENvdW50KCkgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBlbmRpbmdBbnRpQ29tcGFjdGlvbi5TU1RhYmxlQWNxdWlzaXRpb25FeGNlcHRpb24oImJsYWgiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmZpbmlzaENvbXBhY3Rpb24oaG9sZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmFjcXVpcmVTU1RhYmxlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CiAgICAgICAgICAgICBGdXR1cmUgZiA9IGVzLnN1Ym1pdChhY3F1aXNpdGlvbkNhbGxhYmxlKTsKICAgICAgICAgICAgIGNkbC5hd2FpdCgpOwogICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmLmdldCgpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1Jvd3NNZXJnaW5nVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvUm93c01lcmdpbmdUZXN0LmphdmEKaW5kZXggODA0OWFmMy4uMDFlMzM1ZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvUm93c01lcmdpbmdUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvUm93c01lcmdpbmdUZXN0LmphdmEKQEAgLTI2LDEyICsyNiwxNCBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5CVFJFRV9CUkFOQ0hfU0hJRlQ7CisKIHB1YmxpYyBjbGFzcyBSb3dzTWVyZ2luZ1Rlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKIHsKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5idHJlZS5icmFuY2hzaGlmdCIsICIyIik7CisgICAgICAgIEJUUkVFX0JSQU5DSF9TSElGVC5zZXRJbnQoMik7CiAgICAgICAgIENRTFRlc3Rlci5zZXRVcENsYXNzKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9Sb3dzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvUm93c1Rlc3QuamF2YQppbmRleCBjZmVlYmZkLi44NzQyZmQ4IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9Sb3dzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1Jvd3NUZXN0LmphdmEKQEAgLTIwMCw2ICsyMDAsMTIgQEAKICAgICAgICAgewogICAgICAgICAgICAgdGhpcy5oYXNMZWdhY3lDb3VudGVyU2hhcmRzIHw9IGhhc0xlZ2FjeUNvdW50ZXJTaGFyZHM7CiAgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlUGFydGl0aW9uRGVsZXRpb24oRGVsZXRpb25UaW1lIGR0KQorICAgICAgICB7CisgICAgICAgICAgICB1cGRhdGUoZHQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBzZWNvbmRUb1RzKGludCBub3cpCkBAIC02NDgsNCArNjU0LDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVDZWxsKGIsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUNlbGwoYSkpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9UaHJvdHRsZWRVbmZpbHRlcmVkSXRlcmF0b3JUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9UaHJvdHRsZWRVbmZpbHRlcmVkSXRlcmF0b3JUZXN0LmphdmEKaW5kZXggMGM0YTc5ZC4uZTNjNDJjZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVGhyb3R0bGVkVW5maWx0ZXJlZEl0ZXJhdG9yVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9yb3dzL1Rocm90dGxlZFVuZmlsdGVyZWRJdGVyYXRvclRlc3QuamF2YQpAQCAtMTU5LDcgKzE1OSw3IEBACiAgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IgPSB0aHJvdHRsZWQubmV4dCgpOwogICAgICAgICAgICAgYXNzZXJ0RmFsc2UodGhyb3R0bGVkLmhhc05leHQoKSk7CiAgICAgICAgICAgICBhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEludDMyVHlwZS5pbnN0YW5jZS5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoaXRlcmF0b3Iuc3RhdGljUm93KCkuY2VsbHMoKS5pdGVyYXRvcigpLm5leHQoKS5idWZmZXIoKSksIG5ldyBJbnRlZ2VyKDE2MCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEludDMyVHlwZS5pbnN0YW5jZS5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoaXRlcmF0b3Iuc3RhdGljUm93KCkuY2VsbHMoKS5pdGVyYXRvcigpLm5leHQoKS5idWZmZXIoKSksIEludGVnZXIudmFsdWVPZigxNjApKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIHRlc3Qgb3B0IG91dApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvcm93cy9VbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmRmMWNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3Jvd3MvVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmRUZXN0LmphdmEKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93czsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNsdXN0ZXJpbmdJbmRleFNsaWNlRmlsdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkRhdGFMaW1pdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLlJvd0ZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuU1NUYWJsZVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuVmlldzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludGVnZXJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZVJlYWRzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmRUZXN0Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFID0gImtzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEUgPSAidGJsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0xJQ0VTX1RBQkxFID0gInRibF9zbGljZXMiOworICAgIHByaXZhdGUgc3RhdGljIFRhYmxlTWV0YWRhdGEgdGFibGVNZXRhZGF0YTsKKyAgICBwcml2YXRlIHN0YXRpYyBUYWJsZU1ldGFkYXRhIHNsaWNlc1RhYmxlTWV0YWRhdGE7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworCisgICAgICAgIHRhYmxlTWV0YWRhdGEgPQorICAgICAgICBUYWJsZU1ldGFkYXRhLmJ1aWxkZXIoS0VZU1BBQ0UsIFRBQkxFKQorICAgICAgICAgICAgICAgICAgICAgLmFkZFBhcnRpdGlvbktleUNvbHVtbigiayIsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgLmFkZFN0YXRpY0NvbHVtbigicyIsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgLmFkZENsdXN0ZXJpbmdDb2x1bW4oImkiLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKCJ2IiwgVVRGOFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBzbGljZXNUYWJsZU1ldGFkYXRhID0gVGFibGVNZXRhZGF0YS5idWlsZGVyKEtFWVNQQUNFLCBTTElDRVNfVEFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFBhcnRpdGlvbktleUNvbHVtbigiayIsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbHVzdGVyaW5nQ29sdW1uKCJjMSIsIEludDMyVHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2x1c3RlcmluZ0NvbHVtbigiYzIiLCBJbnQzMlR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oInYiLCBJbnRlZ2VyVHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBTY2hlbWFMb2FkZXIucHJlcGFyZVNlcnZlcigpOworICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2UoS0VZU1BBQ0UsIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwgdGFibGVNZXRhZGF0YSwgc2xpY2VzVGFibGVNZXRhZGF0YSk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHRydW5jYXRlKCkKKyAgICB7CisgICAgICAgIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKFRBQkxFKS50cnVuY2F0ZUJsb2NraW5nKCk7CisgICAgICAgIEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKFNMSUNFU19UQUJMRSkudHJ1bmNhdGVCbG9ja2luZygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvd2VyQm91bmRBcHBsaWNhYmxlU2luZ2xlQ29sdW1uQXNjKCkKKyAgICB7CisgICAgICAgIFN0cmluZyBxdWVyeSA9ICJJTlNFUlQgSU5UTyAlcy4lcyAoaywgaSkgVkFMVUVTICgnazEnLCAlcykiOworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjcmVhdGVTU1RhYmxlKHRhYmxlTWV0YWRhdGEsIEtFWVNQQUNFLCBUQUJMRSwgcXVlcnkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcodGFibGVNZXRhZGF0YS5jb21wYXJhdG9yLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlsLmNsdXN0ZXJpbmcodGFibGVNZXRhZGF0YS5jb21wYXJhdG9yLCBCaWdJbnRlZ2VyLnZhbHVlT2YoOSkpKSwKKyAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcpOworICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gdGFibGVNZXRhZGF0YS5wYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5ieXRlcygiazEiKSk7CisKKyAgICAgICAgU2xpY2Ugc2xpY2UxID0gU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcodGFibGVNZXRhZGF0YS5jb21wYXJhdG9yLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMykpLmFzU3RhcnRCb3VuZCgpLCBDbHVzdGVyaW5nQm91bmQuVE9QKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobG93ZXJCb3VuZEFwcGxpY2FibGUodGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTEsIHNzdGFibGUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUodGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTEsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICBTbGljZSBzbGljZTIgPSBTbGljZS5tYWtlKENsdXN0ZXJpbmdCb3VuZC5CT1RUT00sIFV0aWwuY2x1c3RlcmluZyh0YWJsZU1ldGFkYXRhLmNvbXBhcmF0b3IsIEJpZ0ludGVnZXIudmFsdWVPZigzKSkuYXNFbmRCb3VuZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb3dlckJvdW5kQXBwbGljYWJsZSh0YWJsZU1ldGFkYXRhLCBrZXksIHNsaWNlMiwgc3N0YWJsZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobG93ZXJCb3VuZEFwcGxpY2FibGUodGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTIsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICAvLyBjb3JuZXIgY2FzZXMKKyAgICAgICAgU2xpY2Ugc2xpY2UzID0gU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcodGFibGVNZXRhZGF0YS5jb21wYXJhdG9yLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMCkpLmFzU3RhcnRCb3VuZCgpLCBDbHVzdGVyaW5nQm91bmQuVE9QKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobG93ZXJCb3VuZEFwcGxpY2FibGUodGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTMsIHNzdGFibGUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUodGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTMsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICBTbGljZSBzbGljZTQgPSBTbGljZS5tYWtlKENsdXN0ZXJpbmdCb3VuZC5CT1RUT00sIFV0aWwuY2x1c3RlcmluZyh0YWJsZU1ldGFkYXRhLmNvbXBhcmF0b3IsIEJpZ0ludGVnZXIudmFsdWVPZig5KSkuYXNFbmRCb3VuZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb3dlckJvdW5kQXBwbGljYWJsZSh0YWJsZU1ldGFkYXRhLCBrZXksIHNsaWNlNCwgc3N0YWJsZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobG93ZXJCb3VuZEFwcGxpY2FibGUodGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTQsIHNzdGFibGUsIHRydWUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb3dlckJvdW5kQXBwbGljYWJsZVNpbmdsZUNvbHVtbkRlc2MoKQorICAgIHsKKyAgICAgICAgU3RyaW5nIFRBQkxFX1JFVkVSU0VEID0gInRibF9yZXZlcnNlZCI7CisgICAgICAgIFN0cmluZyBjcmVhdGVUYWJsZSA9IFN0cmluZy5mb3JtYXQoCisgICAgICAgICJDUkVBVEUgVEFCTEUgJXMuJXMgKGsgdGV4dCwgaSB2YXJpbnQsIHYgaW50LCBwcmltYXJ5IGtleSAoaywgaSkpIFdJVEggQ0xVU1RFUklORyBPUkRFUiBCWSAoaSBERVNDKSIsCisgICAgICAgIEtFWVNQQUNFLCBUQUJMRV9SRVZFUlNFRCk7CisgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVPbmNlSW50ZXJuYWwoY3JlYXRlVGFibGUpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShUQUJMRV9SRVZFUlNFRCk7CisgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBjZnMubWV0YWRhdGEoKTsKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gIklOU0VSVCBJTlRPICVzLiVzIChrLCBpKSBWQUxVRVMgKCdrMScsICVzKSI7CisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNyZWF0ZVNTVGFibGUobWV0YWRhdGEsIEtFWVNQQUNFLCBUQUJMRV9SRVZFUlNFRCwgcXVlcnkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcobWV0YWRhdGEuY29tcGFyYXRvciwgQmlnSW50ZWdlci52YWx1ZU9mKDkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5jbHVzdGVyaW5nKG1ldGFkYXRhLmNvbXBhcmF0b3IsIEJpZ0ludGVnZXIudmFsdWVPZigwKSkpLAorICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5jb3ZlcmVkQ2x1c3RlcmluZyk7CisgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBtZXRhZGF0YS5wYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5ieXRlcygiazEiKSk7CisKKyAgICAgICAgU2xpY2Ugc2xpY2UxID0gU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcobWV0YWRhdGEuY29tcGFyYXRvciwgQmlnSW50ZWdlci52YWx1ZU9mKDgpKS5hc1N0YXJ0Qm91bmQoKSwgQ2x1c3RlcmluZ0JvdW5kLlRPUCk7CisgICAgICAgIGFzc2VydEZhbHNlKGxvd2VyQm91bmRBcHBsaWNhYmxlKG1ldGFkYXRhLCBrZXksIHNsaWNlMSwgc3N0YWJsZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb3dlckJvdW5kQXBwbGljYWJsZShtZXRhZGF0YSwga2V5LCBzbGljZTEsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICBTbGljZSBzbGljZTIgPSBTbGljZS5tYWtlKENsdXN0ZXJpbmdCb3VuZC5CT1RUT00sIFV0aWwuY2x1c3RlcmluZyhtZXRhZGF0YS5jb21wYXJhdG9yLCBCaWdJbnRlZ2VyLnZhbHVlT2YoOCkpLmFzRW5kQm91bmQoKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUobWV0YWRhdGEsIGtleSwgc2xpY2UyLCBzc3RhYmxlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShsb3dlckJvdW5kQXBwbGljYWJsZShtZXRhZGF0YSwga2V5LCBzbGljZTIsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICAvLyBjb3JuZXIgY2FzZXMKKyAgICAgICAgU2xpY2Ugc2xpY2UzID0gU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcobWV0YWRhdGEuY29tcGFyYXRvciwgQmlnSW50ZWdlci52YWx1ZU9mKDkpKS5hc1N0YXJ0Qm91bmQoKSwgQ2x1c3RlcmluZ0JvdW5kLlRPUCk7CisgICAgICAgIGFzc2VydEZhbHNlKGxvd2VyQm91bmRBcHBsaWNhYmxlKG1ldGFkYXRhLCBrZXksIHNsaWNlMywgc3N0YWJsZSwgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb3dlckJvdW5kQXBwbGljYWJsZShtZXRhZGF0YSwga2V5LCBzbGljZTMsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICBTbGljZSBzbGljZTQgPSBTbGljZS5tYWtlKENsdXN0ZXJpbmdCb3VuZC5CT1RUT00sIFV0aWwuY2x1c3RlcmluZyhtZXRhZGF0YS5jb21wYXJhdG9yLCBCaWdJbnRlZ2VyLnZhbHVlT2YoMCkpLmFzRW5kQm91bmQoKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUobWV0YWRhdGEsIGtleSwgc2xpY2U0LCBzc3RhYmxlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShsb3dlckJvdW5kQXBwbGljYWJsZShtZXRhZGF0YSwga2V5LCBzbGljZTQsIHNzdGFibGUsIHRydWUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb3dlckJvdW5kQXBwbGljYWJsZU11bHRpcGxlQ29sdW1uc0FzYygpCisgICAgeworICAgICAgICBTdHJpbmcgcXVlcnkgPSAiSU5TRVJUIElOVE8gJXMuJXMgKGssIGMxLCBjMikgVkFMVUVTICgnazEnLCAwLCAlcykiOworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjcmVhdGVTU1RhYmxlKHNsaWNlc1RhYmxlTWV0YWRhdGEsIEtFWVNQQUNFLCBTTElDRVNfVEFCTEUsIHF1ZXJ5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNsaWNlLm1ha2UoVXRpbC5jbHVzdGVyaW5nKHNsaWNlc1RhYmxlTWV0YWRhdGEuY29tcGFyYXRvciwgMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuY2x1c3RlcmluZyhzbGljZXNUYWJsZU1ldGFkYXRhLmNvbXBhcmF0b3IsIDAsIDkpKSwKKyAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcpOworICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gc2xpY2VzVGFibGVNZXRhZGF0YS5wYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5ieXRlcygiazEiKSk7CisKKyAgICAgICAgU2xpY2Ugc2xpY2UxID0gU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcoc2xpY2VzVGFibGVNZXRhZGF0YS5jb21wYXJhdG9yLCAwLCAzKS5hc1N0YXJ0Qm91bmQoKSwgQ2x1c3RlcmluZ0JvdW5kLlRPUCk7CisgICAgICAgIGFzc2VydEZhbHNlKGxvd2VyQm91bmRBcHBsaWNhYmxlKHNsaWNlc1RhYmxlTWV0YWRhdGEsIGtleSwgc2xpY2UxLCBzc3RhYmxlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGxvd2VyQm91bmRBcHBsaWNhYmxlKHNsaWNlc1RhYmxlTWV0YWRhdGEsIGtleSwgc2xpY2UxLCBzc3RhYmxlLCB0cnVlKSk7CisKKyAgICAgICAgU2xpY2Ugc2xpY2UyID0gU2xpY2UubWFrZShDbHVzdGVyaW5nQm91bmQuQk9UVE9NLCBVdGlsLmNsdXN0ZXJpbmcoc2xpY2VzVGFibGVNZXRhZGF0YS5jb21wYXJhdG9yLCAwLCAzKS5hc0VuZEJvdW5kKCkpOworICAgICAgICBhc3NlcnRUcnVlKGxvd2VyQm91bmRBcHBsaWNhYmxlKHNsaWNlc1RhYmxlTWV0YWRhdGEsIGtleSwgc2xpY2UyLCBzc3RhYmxlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShsb3dlckJvdW5kQXBwbGljYWJsZShzbGljZXNUYWJsZU1ldGFkYXRhLCBrZXksIHNsaWNlMiwgc3N0YWJsZSwgdHJ1ZSkpOworCisgICAgICAgIC8vIGNvcm5lciBjYXNlcworICAgICAgICBTbGljZSBzbGljZTMgPSBTbGljZS5tYWtlKFV0aWwuY2x1c3RlcmluZyhzbGljZXNUYWJsZU1ldGFkYXRhLmNvbXBhcmF0b3IsIDAsIDApLmFzU3RhcnRCb3VuZCgpLCBDbHVzdGVyaW5nQm91bmQuVE9QKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobG93ZXJCb3VuZEFwcGxpY2FibGUoc2xpY2VzVGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTMsIHNzdGFibGUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUoc2xpY2VzVGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTMsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICBTbGljZSBzbGljZTQgPSBTbGljZS5tYWtlKENsdXN0ZXJpbmdCb3VuZC5CT1RUT00sIFV0aWwuY2x1c3RlcmluZyhzbGljZXNUYWJsZU1ldGFkYXRhLmNvbXBhcmF0b3IsIDAsIDkpLmFzRW5kQm91bmQoKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUoc2xpY2VzVGFibGVNZXRhZGF0YSwga2V5LCBzbGljZTQsIHNzdGFibGUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGxvd2VyQm91bmRBcHBsaWNhYmxlKHNsaWNlc1RhYmxlTWV0YWRhdGEsIGtleSwgc2xpY2U0LCBzc3RhYmxlLCB0cnVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG93ZXJCb3VuZEFwcGxpY2FibGVNdWx0aXBsZUNvbHVtbnNEZXNjKCkKKyAgICB7CisgICAgICAgIFN0cmluZyBUQUJMRV9SRVZFUlNFRCA9ICJ0Ymxfc2xpY2VzX3JldmVyc2VkIjsKKyAgICAgICAgU3RyaW5nIGNyZWF0ZVRhYmxlID0gU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgIkNSRUFURSBUQUJMRSAlcy4lcyAoayB0ZXh0LCBjMSBpbnQsIGMyIGludCwgdiBpbnQsIHByaW1hcnkga2V5IChrLCBjMSwgYzIpKSBXSVRIIENMVVNURVJJTkcgT1JERVIgQlkgKGMxIEFTQywgYzIgREVTQykiLAorICAgICAgICBLRVlTUEFDRSwgVEFCTEVfUkVWRVJTRUQpOworICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlT25jZUludGVybmFsKGNyZWF0ZVRhYmxlKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoVEFCTEVfUkVWRVJTRUQpOworICAgICAgICBUYWJsZU1ldGFkYXRhIG1ldGFkYXRhID0gY2ZzLm1ldGFkYXRhKCk7CisKKyAgICAgICAgU3RyaW5nIHF1ZXJ5ID0gIklOU0VSVCBJTlRPICVzLiVzIChrLCBjMSwgYzIpIFZBTFVFUyAoJ2sxJywgMCwgJXMpIjsKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY3JlYXRlU1NUYWJsZShtZXRhZGF0YSwgS0VZU1BBQ0UsIFRBQkxFX1JFVkVSU0VELCBxdWVyeSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTbGljZS5tYWtlKFV0aWwuY2x1c3RlcmluZyhtZXRhZGF0YS5jb21wYXJhdG9yLCAwLCA5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbC5jbHVzdGVyaW5nKG1ldGFkYXRhLmNvbXBhcmF0b3IsIDAsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgIHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcpOworICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gbWV0YWRhdGEucGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoImsxIikpOworCisgICAgICAgIFNsaWNlIHNsaWNlMSA9IFNsaWNlLm1ha2UoVXRpbC5jbHVzdGVyaW5nKG1ldGFkYXRhLmNvbXBhcmF0b3IsIDAsIDgpLmFzU3RhcnRCb3VuZCgpLCBDbHVzdGVyaW5nQm91bmQuVE9QKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobG93ZXJCb3VuZEFwcGxpY2FibGUobWV0YWRhdGEsIGtleSwgc2xpY2UxLCBzc3RhYmxlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUcnVlKGxvd2VyQm91bmRBcHBsaWNhYmxlKG1ldGFkYXRhLCBrZXksIHNsaWNlMSwgc3N0YWJsZSwgdHJ1ZSkpOworCisgICAgICAgIFNsaWNlIHNsaWNlMiA9IFNsaWNlLm1ha2UoQ2x1c3RlcmluZ0JvdW5kLkJPVFRPTSwgVXRpbC5jbHVzdGVyaW5nKG1ldGFkYXRhLmNvbXBhcmF0b3IsIDAsIDgpLmFzRW5kQm91bmQoKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUobWV0YWRhdGEsIGtleSwgc2xpY2UyLCBzc3RhYmxlLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRGYWxzZShsb3dlckJvdW5kQXBwbGljYWJsZShtZXRhZGF0YSwga2V5LCBzbGljZTIsIHNzdGFibGUsIHRydWUpKTsKKworICAgICAgICAvLyBjb3JuZXIgY2FzZXMKKyAgICAgICAgU2xpY2Ugc2xpY2UzID0gU2xpY2UubWFrZShVdGlsLmNsdXN0ZXJpbmcobWV0YWRhdGEuY29tcGFyYXRvciwgMCwgOSkuYXNTdGFydEJvdW5kKCksIENsdXN0ZXJpbmdCb3VuZC5UT1ApOworICAgICAgICBhc3NlcnRGYWxzZShsb3dlckJvdW5kQXBwbGljYWJsZShtZXRhZGF0YSwga2V5LCBzbGljZTMsIHNzdGFibGUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRydWUobG93ZXJCb3VuZEFwcGxpY2FibGUobWV0YWRhdGEsIGtleSwgc2xpY2UzLCBzc3RhYmxlLCB0cnVlKSk7CisKKyAgICAgICAgU2xpY2Ugc2xpY2U0ID0gU2xpY2UubWFrZShDbHVzdGVyaW5nQm91bmQuQk9UVE9NLCBVdGlsLmNsdXN0ZXJpbmcobWV0YWRhdGEuY29tcGFyYXRvciwgMCwgMCkuYXNFbmRCb3VuZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsb3dlckJvdW5kQXBwbGljYWJsZShtZXRhZGF0YSwga2V5LCBzbGljZTQsIHNzdGFibGUsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGxvd2VyQm91bmRBcHBsaWNhYmxlKG1ldGFkYXRhLCBrZXksIHNsaWNlNCwgc3N0YWJsZSwgdHJ1ZSkpOworICAgIH0KKworICAgIHByaXZhdGUgU1NUYWJsZVJlYWRlciBjcmVhdGVTU1RhYmxlKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBTdHJpbmcgcXVlcnkpCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKGtleXNwYWNlKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSh0YWJsZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KHF1ZXJ5LCBrZXlzcGFjZSwgdGFibGUsIGkpKTsKKyAgICAgICAgY2ZzLmZvcmNlQmxvY2tpbmdGbHVzaChDb2x1bW5GYW1pbHlTdG9yZS5GbHVzaFJlYXNvbi5VTklUX1RFU1RTKTsKKyAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IG1ldGFkYXRhLnBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJrMSIpKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUuVmlld0ZyYWdtZW50IHZpZXcgPSBjZnMuc2VsZWN0KFZpZXcuc2VsZWN0KFNTVGFibGVTZXQuTElWRSwga2V5KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB2aWV3LnNzdGFibGVzLnNpemUoKSk7CisgICAgICAgIHJldHVybiB2aWV3LnNzdGFibGVzLmdldCgwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbG93ZXJCb3VuZEFwcGxpY2FibGUoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgRGVjb3JhdGVkS2V5IGtleSwgU2xpY2Ugc2xpY2UsIFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgYm9vbGVhbiBpc1JldmVyc2VkKQorICAgIHsKKyAgICAgICAgU2xpY2VzLkJ1aWxkZXIgc2xpY2VzQnVpbGRlciA9IG5ldyBTbGljZXMuQnVpbGRlcihtZXRhZGF0YS5jb21wYXJhdG9yKTsKKyAgICAgICAgc2xpY2VzQnVpbGRlci5hZGQoc2xpY2UpOworICAgICAgICBTbGljZXMgc2xpY2VzID0gc2xpY2VzQnVpbGRlci5idWlsZCgpOworICAgICAgICBDbHVzdGVyaW5nSW5kZXhTbGljZUZpbHRlciBmaWx0ZXIgPSBuZXcgQ2x1c3RlcmluZ0luZGV4U2xpY2VGaWx0ZXIoc2xpY2VzLCBpc1JldmVyc2VkKTsKKworICAgICAgICBTaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZCBjbWQgPSBTaW5nbGVQYXJ0aXRpb25SZWFkQ29tbWFuZC5jcmVhdGUobWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQlV0aWxpdGllcy5ub3dJblNlY29uZHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlci5hbGwobWV0YWRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93RmlsdGVyLk5PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhTGltaXRzLk5PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIpOworCisgICAgICAgIHRyeSAoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yV2l0aExvd2VyQm91bmQgaXRlciA9IG5ldyBVbmZpbHRlcmVkUm93SXRlcmF0b3JXaXRoTG93ZXJCb3VuZChrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXZlcnNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlci5hbGwobWV0YWRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9ja2l0by5tb2NrKFNTVGFibGVSZWFkc0xpc3RlbmVyLmNsYXNzKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLmxvd2VyQm91bmQoKSAhPSBudWxsOworICAgICAgICB9CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhRW50aXJlU1NUYWJsZVN0cmVhbVdyaXRlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhRW50aXJlU1NUYWJsZVN0cmVhbVdyaXRlclRlc3QuamF2YQppbmRleCBhNjViMmVhLi44OThkYTdjIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYUVudGlyZVNTVGFibGVTdHJlYW1Xcml0ZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFFbnRpcmVTU1RhYmxlU3RyZWFtV3JpdGVyVGVzdC5qYXZhCkBAIC0yNCw4ICsyNCw2IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIApAQCAtMzcsMTkgKzM1LDIwIEBACiBpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5EZWZhdWx0RmlsZVJlZ2lvbjsKIGltcG9ydCBpby5uZXR0eS5jaGFubmVsLmVtYmVkZGVkLkVtYmVkZGVkQ2hhbm5lbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU1NUYWJsZU11bHRpV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRCdWZmZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlNoYXJlZERlZmF1bHRGaWxlUmVnaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5Bc3luY1N0cmVhbWluZ091dHB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LlNoYXJlZERlZmF1bHRGaWxlUmVnaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5DYWNoaW5nUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuYXN5bmMuTmV0dHlTdHJlYW1pbmdDb25uZWN0aW9uRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuUHJldmlld0tpbmQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlNlc3Npb25JbmZvOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1Db29yZGluYXRvcjsKQEAgLTU4LDYgKzU3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtUmVzdWx0RnV0dXJlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1TZXNzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1TdW1tYXJ5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5hc3luYy5OZXR0eVN0cmVhbWluZ0Nvbm5lY3Rpb25GYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5tZXNzYWdlcy5TdHJlYW1NZXNzYWdlSGVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwpAQCAtMTQ5LDcgKzE0OSw2IEBACiAKICAgICAgICAgICAgIENhc3NhbmRyYVN0cmVhbUhlYWRlciBoZWFkZXIgPQogICAgICAgICAgICAgQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyLmJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlRm9ybWF0KHNzdGFibGUuZGVzY3JpcHRvci5mb3JtYXRUeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlVmVyc2lvbihzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZUxldmVsKDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEVzdGltYXRlZEtleXMoc3N0YWJsZS5lc3RpbWF0ZWRLZXlzKCkpCkBAIC0yMDksNyArMjA4LDcgQEAKICAgICAgICAgU3RyZWFtUmVzdWx0RnV0dXJlIGZ1dHVyZSA9IFN0cmVhbVJlc3VsdEZ1dHVyZS5jcmVhdGVJbml0aWF0b3IobmV4dFRpbWVVVUlEKCksIFN0cmVhbU9wZXJhdGlvbi5CT09UU1RSQVAsIENvbGxlY3Rpb25zLjxTdHJlYW1FdmVudEhhbmRsZXI+ZW1wdHlMaXN0KCksIHN0cmVhbUNvb3JkaW5hdG9yKTsKIAogICAgICAgICBJbmV0QWRkcmVzc0FuZFBvcnQgcGVlciA9IEZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0KCk7Ci0gICAgICAgIHN0cmVhbUNvb3JkaW5hdG9yLmFkZFNlc3Npb25JbmZvKG5ldyBTZXNzaW9uSW5mbyhwZWVyLCAwLCBwZWVyLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIFN0cmVhbVNlc3Npb24uU3RhdGUuSU5JVElBTElaRUQpKTsKKyAgICAgICAgc3RyZWFtQ29vcmRpbmF0b3IuYWRkU2Vzc2lvbkluZm8obmV3IFNlc3Npb25JbmZvKHBlZXIsIDAsIHBlZXIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgU3RyZWFtU2Vzc2lvbi5TdGF0ZS5JTklUSUFMSVpFRCwgbnVsbCkpOwogCiAgICAgICAgIFN0cmVhbVNlc3Npb24gc2Vzc2lvbiA9IHN0cmVhbUNvb3JkaW5hdG9yLmdldE9yQ3JlYXRlT3V0Ym91bmRTZXNzaW9uKHBlZXIpOwogICAgICAgICBzZXNzaW9uLmluaXQoZnV0dXJlKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhT3V0Z29pbmdGaWxlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFPdXRnb2luZ0ZpbGVUZXN0LmphdmEKaW5kZXggOTNiNmU3MS4uNmFkZmRlZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFPdXRnb2luZ0ZpbGVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFPdXRnb2luZ0ZpbGVUZXN0LmphdmEKQEAgLTE4LDYgKzE4LDcgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5zdHJlYW1pbmc7CiAKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKQEAgLTEzMiw3ICsxMzMsNyBAQAogICAgICAgICBpbnQgY291bnQgPSAwOwogICAgICAgICBEZWNvcmF0ZWRLZXkga2V5OwogCi0gICAgICAgIHRyeSAoS2V5SXRlcmF0b3IgaXRlciA9IG5ldyBLZXlJdGVyYXRvcihzc3RhYmxlLmRlc2NyaXB0b3IsIHNzdGFibGUubWV0YWRhdGEoKSkpCisgICAgICAgIHRyeSAoS2V5SXRlcmF0b3IgaXRlciA9IHNzdGFibGUua2V5SXRlcmF0b3IoKSkKICAgICAgICAgewogICAgICAgICAgICAgZG8KICAgICAgICAgICAgIHsKQEAgLTE0MCw2ICsxNDEsMTAgQEAKICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgfSB3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgY291bnQgPCBpKTsKICAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGtleTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1IZWFkZXJUZXN0LmphdmEKaW5kZXggMGU1MTg3Yy4uYTBlNGU1MSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1IZWFkZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1IZWFkZXJUZXN0LmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5DcmVhdGVUYWJsZVN0YXRlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CkBAIC0zOSw5ICs0MCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CkBAIC0xNDQsOSArMTQ0LDkgQEAKICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5Db21wb25lbnQgc2VyaWFsaXphdGlvbkhlYWRlciA9IFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZVdpdGhvdXRTdGF0cyhtZXRhZGF0YSkudG9Db21wb25lbnQoKTsKICAgICAgICAgQ29tcG9uZW50TWFuaWZlc3QgY29tcG9uZW50TWFuaWZlc3QgPSBlbnRpcmVTU1RhYmxlID8gQ29tcG9uZW50TWFuaWZlc3QuY3JlYXRlKHNzdGFibGUuZGVzY3JpcHRvcikgOiBudWxsOwogICAgICAgICBEZWNvcmF0ZWRLZXkgZmlyc3RLZXkgPSBlbnRpcmVTU1RhYmxlID8gc3N0YWJsZS5maXJzdCA6IG51bGw7CisKICAgICAgICAgcmV0dXJuIENhc3NhbmRyYVN0cmVhbUhlYWRlci5idWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZUZvcm1hdChTU1RhYmxlRm9ybWF0LlR5cGUuQklHKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlVmVyc2lvbihCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZVZlcnNpb24oc3N0YWJsZS5kZXNjcmlwdG9yLnZlcnNpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVMZXZlbCgwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhFc3RpbWF0ZWRLZXlzKDEwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb21wcmVzc2lvbkluZm8oY29tcHJlc3Npb25JbmZvKQpAQCAtMTY2LDggKzE2Niw3IEBACiAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBDcmVhdGVUYWJsZVN0YXRlbWVudC5wYXJzZShkZGwsICJrcyIpLmJ1aWxkKCk7CiAgICAgICAgIENhc3NhbmRyYVN0cmVhbUhlYWRlciBoZWFkZXIgPQogICAgICAgICAgICAgQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyLmJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlRm9ybWF0KFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVWZXJzaW9uKEJpZ0Zvcm1hdC5sYXRlc3RWZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlVmVyc2lvbihEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkuZ2V0TGF0ZXN0VmVyc2lvbigpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTU1RhYmxlTGV2ZWwoMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoRXN0aW1hdGVkS2V5cygwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTZWN0aW9ucyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkKQEAgLTE4NCwxMiArMTgzLDExIEBACiAgICAgICAgIFN0cmluZyBkZGwgPSAiQ1JFQVRFIFRBQkxFIHRibCAoayBJTlQgUFJJTUFSWSBLRVksIHYgSU5UKSI7CiAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBDcmVhdGVUYWJsZVN0YXRlbWVudC5wYXJzZShkZGwsICJrcyIpLmJ1aWxkKCk7CiAKLSAgICAgICAgQ29tcG9uZW50TWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgQ29tcG9uZW50TWFuaWZlc3QobmV3IExpbmtlZEhhc2hNYXA8Q29tcG9uZW50LCBMb25nPigpIHt7IHB1dChDb21wb25lbnQuREFUQSwgMTAwTCk7IH19KTsKKyAgICAgICAgQ29tcG9uZW50TWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgQ29tcG9uZW50TWFuaWZlc3QobmV3IExpbmtlZEhhc2hNYXA8Q29tcG9uZW50LCBMb25nPigpIHt7IHB1dChDb21wb25lbnRzLkRBVEEsIDEwMEwpOyB9fSk7CiAKICAgICAgICAgQ2Fzc2FuZHJhU3RyZWFtSGVhZGVyIGhlYWRlciA9CiAgICAgICAgICAgICBDYXNzYW5kcmFTdHJlYW1IZWFkZXIuYnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVGb3JtYXQoU1NUYWJsZUZvcm1hdC5UeXBlLkJJRykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU1NUYWJsZVZlcnNpb24oQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVWZXJzaW9uKERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKS5nZXRMYXRlc3RWZXJzaW9uKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNTVGFibGVMZXZlbCgwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhFc3RpbWF0ZWRLZXlzKDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFNlY3Rpb25zKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1NYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9DYXNzYW5kcmFTdHJlYW1NYW5hZ2VyVGVzdC5qYXZhCmluZGV4IGU3Nzk1YzguLmZhYzU3MDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ2Fzc2FuZHJhU3RyZWFtTWFuYWdlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0Nhc3NhbmRyYVN0cmVhbU1hbmFnZXJUZXN0LmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC01MywxMCArNTQsMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wYWN0aW9uUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtU3VtbWFyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtaW5nQ2hhbm5lbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuYXN5bmMuTmV0dHlTdHJlYW1pbmdDb25uZWN0aW9uRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuT3V0Z29pbmdTdHJlYW07CkBAIC02OSw2ICs3Miw4IEBACiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZS5OT19QRU5ESU5HX1JFUEFJUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiBwdWJsaWMgY2xhc3MgQ2Fzc2FuZHJhU3RyZWFtTWFuYWdlclRlc3QKIHsKQEAgLTkwLDcgKzk1LDkgQEAKICAgICBwdWJsaWMgdm9pZCBjcmVhdGVLZXlzcGFjZSgpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGtleXNwYWNlID0gU3RyaW5nLmZvcm1hdCgia3NfJXMiLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gICAgICAgIHRibSA9IENyZWF0ZVRhYmxlU3RhdGVtZW50LnBhcnNlKFN0cmluZy5mb3JtYXQoIkNSRUFURSBUQUJMRSAlcyAoayBJTlQgUFJJTUFSWSBLRVksIHYgSU5UKSIsIHRhYmxlKSwga2V5c3BhY2UpLmJ1aWxkKCk7CisgICAgICAgIHRibSA9IENyZWF0ZVRhYmxlU3RhdGVtZW50LnBhcnNlKFN0cmluZy5mb3JtYXQoIkNSRUFURSBUQUJMRSAlcyAoayBJTlQgUFJJTUFSWSBLRVksIHYgSU5UKSIsIHRhYmxlKSwga2V5c3BhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBhY3Rpb24oQ29tcGFjdGlvblBhcmFtcy5zdGNzKENvbGxlY3Rpb25zLmVtcHR5TWFwKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwogICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2Uoa2V5c3BhY2UsIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwgdGJtKTsKICAgICAgICAgY2ZzID0gU2NoZW1hLmluc3RhbmNlLmdldENvbHVtbkZhbWlseVN0b3JlSW5zdGFuY2UodGJtLmlkKTsKICAgICB9CkBAIC0yNDAsOCArMjQ3LDM0IEBACiAgICAgICAgICAgICBkb25lLnNldCh0cnVlKTsKICAgICAgICAgICAgIHQuam9pbigyMCk7CiAgICAgICAgIH0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGZhaWxlZC5nZXQoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNoZWNrQ291bnQuZ2V0KCkgPj0gMik7CisgICAgICAgIGFzc2VydEZhbHNlKGZhaWxlZC5nZXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoY2hlY2tDb3VudC5nZXQoKSA+PSAyKTsKICAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKICAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNoZWNrQXZhaWxhYmxlRGlza1NwYWNlQW5kQ29tcGFjdGlvbnMoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJlYW1TZXNzaW9uLmNoZWNrQXZhaWxhYmxlRGlza1NwYWNlQW5kQ29tcGFjdGlvbnMoY3JlYXRlU3VtbWFyaWVzKCksIG5leHRUaW1lVVVJRCgpLCBudWxsLCBmYWxzZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2hlY2tBdmFpbGFibGVEaXNrU3BhY2VBbmRDb21wYWN0aW9uc0ZhaWxpbmcoKQorICAgIHsKKyAgICAgICAgaW50IHRocmVzaG9sZCA9IEFjdGl2ZVJlcGFpclNlcnZpY2UuaW5zdGFuY2UuZ2V0UmVwYWlyUGVuZGluZ0NvbXBhY3Rpb25SZWplY3RUaHJlc2hvbGQoKTsKKyAgICAgICAgQWN0aXZlUmVwYWlyU2VydmljZS5pbnN0YW5jZS5zZXRSZXBhaXJQZW5kaW5nQ29tcGFjdGlvblJlamVjdFRocmVzaG9sZCgxKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoU3RyZWFtU2Vzc2lvbi5jaGVja0F2YWlsYWJsZURpc2tTcGFjZUFuZENvbXBhY3Rpb25zKGNyZWF0ZVN1bW1hcmllcygpLCBuZXh0VGltZVVVSUQoKSwgbnVsbCwgZmFsc2UpKTsKKyAgICAgICAgQWN0aXZlUmVwYWlyU2VydmljZS5pbnN0YW5jZS5zZXRSZXBhaXJQZW5kaW5nQ29tcGFjdGlvblJlamVjdFRocmVzaG9sZCh0aHJlc2hvbGQpOworICAgIH0KKworICAgIHByaXZhdGUgQ29sbGVjdGlvbjxTdHJlYW1TdW1tYXJ5PiBjcmVhdGVTdW1tYXJpZXMoKQorICAgIHsKKyAgICAgICAgQ29sbGVjdGlvbjxTdHJlYW1TdW1tYXJ5PiBzdW1tYXJpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJlYW1TdW1tYXJ5IHN1bW1hcnkgPSBuZXcgU3RyZWFtU3VtbWFyeSh0Ym0uaWQsIGksIChpICsgMSkgKiAxMCk7CisgICAgICAgICAgICBzdW1tYXJpZXMuYWRkKHN1bW1hcnkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdW1tYXJpZXM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9Db21wb25lbnRNYW5pZmVzdFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvQ29tcG9uZW50TWFuaWZlc3RUZXN0LmphdmEKaW5kZXggNDkwOTI2My4uZjViZmU0ZiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9Db21wb25lbnRNYW5pZmVzdFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0NvbXBvbmVudE1hbmlmZXN0VGVzdC5qYXZhCkBAIC0xOCw0NCArMTgsNDkgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5zdHJlYW1pbmc7CiAKLWltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiAKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlckZpeGVkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLlNlcmlhbGl6YXRpb25VdGlsczsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKLQogcHVibGljIGNsYXNzIENvbXBvbmVudE1hbmlmZXN0VGVzdAogeworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuY2xpZW50SW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkKICAgICB7Ci0gICAgICAgIENvbXBvbmVudE1hbmlmZXN0IGV4cGVjdGVkID0gbmV3IENvbXBvbmVudE1hbmlmZXN0KG5ldyBMaW5rZWRIYXNoTWFwPENvbXBvbmVudCwgTG9uZz4oKSB7eyBwdXQoQ29tcG9uZW50LkRBVEEsIDEwMEwpOyB9fSk7Ci0gICAgICAgIFNlcmlhbGl6YXRpb25VdGlscy5hc3NlcnRTZXJpYWxpemF0aW9uQ3ljbGUoZXhwZWN0ZWQsIENvbXBvbmVudE1hbmlmZXN0LnNlcmlhbGl6ZXIpOworICAgICAgICBDb21wb25lbnRNYW5pZmVzdCBleHBlY3RlZCA9IG5ldyBDb21wb25lbnRNYW5pZmVzdChuZXcgTGlua2VkSGFzaE1hcDxDb21wb25lbnQsIExvbmc+KCkge3sgcHV0KENvbXBvbmVudHMuREFUQSwgMTAwTCk7IH19KTsKKyAgICAgICAgU2VyaWFsaXphdGlvblV0aWxzLmFzc2VydFNlcmlhbGl6YXRpb25DeWNsZShleHBlY3RlZCwgQ29tcG9uZW50TWFuaWZlc3Quc2VyaWFsaXplcnMuZ2V0KEJpZ0Zvcm1hdC5nZXRJbnN0YW5jZSgpLm5hbWUoKSkpOwogICAgIH0KIAotICAgIEBUZXN0KGV4cGVjdGVkID0gRU9GRXhjZXB0aW9uLmNsYXNzKQotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uX0ZhaWxzT25CYWRCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDUxMik7Ci0gICAgICAgIENvbXBvbmVudE1hbmlmZXN0IGV4cGVjdGVkID0gbmV3IENvbXBvbmVudE1hbmlmZXN0KG5ldyBMaW5rZWRIYXNoTWFwPENvbXBvbmVudCwgTG9uZz4oKSB7eyBwdXQoQ29tcG9uZW50LkRBVEEsIDEwMEwpOyB9fSk7Ci0KLSAgICAgICAgRGF0YU91dHB1dEJ1ZmZlckZpeGVkIG91dCA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyRml4ZWQoYnVmKTsKLQotICAgICAgICBDb21wb25lbnRNYW5pZmVzdC5zZXJpYWxpemVyLnNlcmlhbGl6ZShleHBlY3RlZCwgb3V0LCBNZXNzYWdpbmdTZXJ2aWNlLlZFUlNJT05fNDApOwotCi0gICAgICAgIGJ1Zi5wdXRJbnQoMCwgLTEwMCk7Ci0KLSAgICAgICAgRGF0YUlucHV0QnVmZmVyIGluID0gbmV3IERhdGFJbnB1dEJ1ZmZlcihvdXQuYnVmZmVyKCksIGZhbHNlKTsKLSAgICAgICAgQ29tcG9uZW50TWFuaWZlc3QgYWN0dWFsID0gQ29tcG9uZW50TWFuaWZlc3Quc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzQwKTsKLSAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotICAgIH0KKyAgICAvLyBQcm9wb3NlIHJlbW92aW5nIHRoaXMgdGVzdCB3aGljaCBub3cgZmFpbHMgb24gVkludE91dE9mUmFuZ2UKKyAgICAvLyBXZSBkb24ndCBzYWZlbHkgY2hlY2sgaWYgdGhlIGJ5dGVzIGFyZSBiYWQgc28gSSBkb24ndCB1bmRlcnN0YW5kIHdoYXQgaXMgYmVpbmcgdGVzdGVkCisgICAgLy8gVGhlcmUgaXMgbm8gY2hlY2tzdW0KKy8vICAgIEBUZXN0KGV4cGVjdGVkID0gRU9GRXhjZXB0aW9uLmNsYXNzKQorLy8gICAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb25fRmFpbHNPbkJhZEJ5dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisvLyAgICB7CisvLyAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDUxMik7CisvLyAgICAgICAgQ29tcG9uZW50TWFuaWZlc3QgZXhwZWN0ZWQgPSBuZXcgQ29tcG9uZW50TWFuaWZlc3QobmV3IExpbmtlZEhhc2hNYXA8Q29tcG9uZW50LCBMb25nPigpIHt7IHB1dChDb21wb25lbnRzLkRBVEEsIDEwMEwpOyB9fSk7CisvLworLy8gICAgICAgIERhdGFPdXRwdXRCdWZmZXJGaXhlZCBvdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlckZpeGVkKGJ1Zik7CisvLworLy8gICAgICAgIENvbXBvbmVudE1hbmlmZXN0LnNlcmlhbGl6ZXIuc2VyaWFsaXplKGV4cGVjdGVkLCBvdXQsIE1lc3NhZ2luZ1NlcnZpY2UuVkVSU0lPTl80MCk7CisvLworLy8gICAgICAgIGJ1Zi5wdXRJbnQoMCwgLTEwMCk7CisvLworLy8gICAgICAgIERhdGFJbnB1dEJ1ZmZlciBpbiA9IG5ldyBEYXRhSW5wdXRCdWZmZXIob3V0LmJ1ZmZlcigpLCBmYWxzZSk7CisvLyAgICAgICAgQ29tcG9uZW50TWFuaWZlc3QgYWN0dWFsID0gQ29tcG9uZW50TWFuaWZlc3Quc2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzQwKTsKKy8vICAgICAgICBhc3NlcnROb3RFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisvLyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0VudGlyZVNTVGFibGVTdHJlYW1Db25jdXJyZW50Q29tcG9uZW50TXV0YXRpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvc3RyZWFtaW5nL0VudGlyZVNTVGFibGVTdHJlYW1Db25jdXJyZW50Q29tcG9uZW50TXV0YXRpb25UZXN0LmphdmEKaW5kZXggOGI2M2JhNS4uODEwN2ZkOSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3N0cmVhbWluZy9FbnRpcmVTU1RhYmxlU3RyZWFtQ29uY3VycmVudENvbXBvbmVudE11dGF0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi9zdHJlYW1pbmcvRW50aXJlU1NUYWJsZVN0cmVhbUNvbmN1cnJlbnRDb21wb25lbnRNdXRhdGlvblRlc3QuamF2YQpAQCAtNTYsMTAgKzU2LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleFN1bW1hcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlNYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5LkluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUmFuZ2VzQXRFbmRwb2ludDsKQEAgLTcxLDcgKzcxLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hVGVzdFV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5hc3luYy5OZXR0eVN0cmVhbWluZ0Nvbm5lY3Rpb25GYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5PdXRnb2luZ1N0cmVhbTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuUHJldmlld0tpbmQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlNlc3Npb25JbmZvOwpAQCAtODAsNiArNzksNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1SZXN1bHRGdXR1cmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVNlc3Npb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLlN0cmVhbVN1bW1hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLmFzeW5jLk5ldHR5U3RyZWFtaW5nQ29ubmVjdGlvbkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nLm1lc3NhZ2VzLlN0cmVhbU1lc3NhZ2VIZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CkBAIC0zMjQsNyArMzI0LDcgQEAKICAgICAgICAgU3RyZWFtUmVzdWx0RnV0dXJlIGZ1dHVyZSA9IFN0cmVhbVJlc3VsdEZ1dHVyZS5jcmVhdGVJbml0aWF0b3IobmV4dFRpbWVVVUlEKCksIFN0cmVhbU9wZXJhdGlvbi5CT09UU1RSQVAsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBzdHJlYW1Db29yZGluYXRvcik7CiAKICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IHBlZXIgPSBGQlV0aWxpdGllcy5nZXRCcm9hZGNhc3RBZGRyZXNzQW5kUG9ydCgpOwotICAgICAgICBzdHJlYW1Db29yZGluYXRvci5hZGRTZXNzaW9uSW5mbyhuZXcgU2Vzc2lvbkluZm8ocGVlciwgMCwgcGVlciwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBTdHJlYW1TZXNzaW9uLlN0YXRlLklOSVRJQUxJWkVEKSk7CisgICAgICAgIHN0cmVhbUNvb3JkaW5hdG9yLmFkZFNlc3Npb25JbmZvKG5ldyBTZXNzaW9uSW5mbyhwZWVyLCAwLCBwZWVyLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIFN0cmVhbVNlc3Npb24uU3RhdGUuSU5JVElBTElaRUQsIG51bGwpKTsKIAogICAgICAgICBTdHJlYW1TZXNzaW9uIHNlc3Npb24gPSBzdHJlYW1Db29yZGluYXRvci5nZXRPckNyZWF0ZU91dGJvdW5kU2Vzc2lvbihwZWVyKTsKICAgICAgICAgc2Vzc2lvbi5pbml0KGZ1dHVyZSk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJhbnNmb3JtL0R1cGxpY2F0ZVJvd0NoZWNrZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJhbnNmb3JtL0R1cGxpY2F0ZVJvd0NoZWNrZXJUZXN0LmphdmEKaW5kZXggZTQ0Y2JjZC4uZTdmMDRiMSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyYW5zZm9ybS9EdXBsaWNhdGVSb3dDaGVja2VyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmFuc2Zvcm0vRHVwbGljYXRlUm93Q2hlY2tlclRlc3QuamF2YQpAQCAtMzgsNiArMzgsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkRpYWdub3N0aWNTbmFwc2hvdFNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESUFHTk9TVElDX1NOQVBTSE9UX0lOVEVSVkFMX05BTk9TOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbC5ieXRlczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKQEAgLTU5LDcgKzYwLDcgQEAKICAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRTbmFwc2hvdE9uRHVwbGljYXRlUm93RGV0ZWN0aW9uKHRydWUpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5kaWFnbm9zdGljX3NuYXBzaG90X2ludGVydmFsX25hbm9zIiwgIjAiKTsKKyAgICAgICAgRElBR05PU1RJQ19TTkFQU0hPVF9JTlRFUlZBTF9OQU5PUy5zZXRMb25nKDApOwogICAgICAgICAvLyBDcmVhdGUgYSB0YWJsZSBhbmQgaW5zZXJ0IHNvbWUgZGF0YS4gVGhlIGFjdHVhbCByb3dzIHJlYWQgaW4gdGhlIHRlc3Qgd2lsbCBiZSBzeW50aGV0aWMKICAgICAgICAgLy8gYnV0IHRoaXMgY3JlYXRlcyBhbiBzc3RhYmxlIG9uIGRpc2sgdG8gYmUgc25hcHNob3R0ZWQuCiAgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIHRleHQsIGNrMSBpbnQsIGNrMiBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrMSwgY2syKSkiKTsKQEAgLTE5NiwxMCArMTk3LDEwIEBACiAgICAgICAgIHJldHVybiBCVHJlZVJvdy5ub0NlbGxMaXZlUm93KENsdXN0ZXJpbmcubWFrZShjbHVzdGVyaW5nQnl0ZUJ1ZmZlcnMpLCBMaXZlbmVzc0luZm8uY3JlYXRlKDAsIDApKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByb3dzKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1JldmVyc2VkT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkLi4uIHVuZmlsdGVyZWRzKQorICAgIHB1YmxpYyBzdGF0aWMgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHBhcnRpdGlvbihUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUmV2ZXJzZWRPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5maWx0ZXJlZC4uLiB1bmZpbHRlcmVkcykKICAgICB7CiAgICAgICAgIEl0ZXJhdG9yPFVuZmlsdGVyZWQ+IGl0ZXJhdG9yID0gSXRlcmF0b3JzLmZvckFycmF5KHVuZmlsdGVyZWRzKTsKICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdFVuZmlsdGVyZWRSb3dJdGVyYXRvcihtZXRhZGF0YSwKQEAgLTIyNyw3ICsyMjgsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yIGl0ZXIoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgYm9vbGVhbiBpc1JldmVyc2VkT3JkZXIsIFVuZmlsdGVyZWQuLi4gdW5maWx0ZXJlZHMpCiAgICAgewogICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gbWV0YWRhdGEucGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoYnl0ZXMoImtleSIpKTsKLSAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHJvd0l0ZXIgPSByb3dzKG1ldGFkYXRhLCBrZXksIGlzUmV2ZXJzZWRPcmRlciwgdW5maWx0ZXJlZHMpOworICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3Igcm93SXRlciA9IHBhcnRpdGlvbihtZXRhZGF0YSwga2V5LCBpc1JldmVyc2VkT3JkZXIsIHVuZmlsdGVyZWRzKTsKICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGV0b25VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3Iocm93SXRlcik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0NvbGxlY3Rpb25NZXJnZVRyaWVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvQ29sbGVjdGlvbk1lcmdlVHJpZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDkwM2E3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0NvbGxlY3Rpb25NZXJnZVRyaWVUZXN0LmphdmEKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzLkluTWVtb3J5VHJpZVRlc3RCYXNlLio7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzLk1lcmdlVHJpZVRlc3QucmVtb3ZlRHVwbGljYXRlczsKKworcHVibGljIGNsYXNzIENvbGxlY3Rpb25NZXJnZVRyaWVUZXN0Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPVU5UID0gMTUwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXJlY3QoKQorICAgIHsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGVbXSBzcmMxID0gZ2VuZXJhdGVLZXlzKHJhbmQsIENPVU5UKTsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGVbXSBzcmMyID0gZ2VuZXJhdGVLZXlzKHJhbmQsIENPVU5UKTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50MSA9IG5ldyBUcmVlTWFwPD4oKGJ5dGVzMSwgYnl0ZXMyKSAtPiBCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJ5dGVzMSwgYnl0ZXMyLCBWRVJTSU9OKSk7CisgICAgICAgIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gY29udGVudDIgPSBuZXcgVHJlZU1hcDw+KChieXRlczEsIGJ5dGVzMikgLT4gQnl0ZUNvbXBhcmFibGUuY29tcGFyZShieXRlczEsIGJ5dGVzMiwgVkVSU0lPTikpOworCisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiB0cmllMSA9IG1ha2VJbk1lbW9yeVRyaWUoc3JjMSwgY29udGVudDEsIHRydWUpOworICAgICAgICBJbk1lbW9yeVRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZTIgPSBtYWtlSW5NZW1vcnlUcmllKHNyYzIsIGNvbnRlbnQyLCB0cnVlKTsKKworICAgICAgICBjb250ZW50MS5wdXRBbGwoY29udGVudDIpOworICAgICAgICAvLyBjb25zdHJ1Y3QgZGlyZWN0bHksIHRyaWUubWVyZ2UoKSB3aWxsIGRlZmVyIHRvIG1lcmdlV2l0aCBvbiB0d28gc291cmNlcworICAgICAgICBUcmllPEJ5dGVCdWZmZXI+IHVuaW9uID0gbmV3IENvbGxlY3Rpb25NZXJnZVRyaWU8PihJbW11dGFibGVMaXN0Lm9mKHRyaWUxLCB0cmllMiksIHggLT4geC5pdGVyYXRvcigpLm5leHQoKSk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUNvbnRlbnQodW5pb24sIGNvbnRlbnQxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoRHVwbGljYXRlcygpCisgICAgeworICAgICAgICBCeXRlQ29tcGFyYWJsZVtdIHNyYzEgPSBnZW5lcmF0ZUtleXMocmFuZCwgQ09VTlQpOworICAgICAgICBCeXRlQ29tcGFyYWJsZVtdIHNyYzIgPSBnZW5lcmF0ZUtleXMocmFuZCwgQ09VTlQpOworICAgICAgICBTb3J0ZWRNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGNvbnRlbnQxID0gbmV3IFRyZWVNYXA8PigoYnl0ZXMxLCBieXRlczIpIC0+IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnl0ZXMxLCBieXRlczIsIFZFUlNJT04pKTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50MiA9IG5ldyBUcmVlTWFwPD4oKGJ5dGVzMSwgYnl0ZXMyKSAtPiBCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJ5dGVzMSwgYnl0ZXMyLCBWRVJTSU9OKSk7CisKKyAgICAgICAgSW5NZW1vcnlUcmllPEJ5dGVCdWZmZXI+IHRyaWUxID0gbWFrZUluTWVtb3J5VHJpZShzcmMxLCBjb250ZW50MSwgdHJ1ZSk7CisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiB0cmllMiA9IG1ha2VJbk1lbW9yeVRyaWUoc3JjMiwgY29udGVudDIsIHRydWUpOworCisgICAgICAgIGFkZFRvSW5NZW1vcnlUcmllKGdlbmVyYXRlS2V5cyhuZXcgUmFuZG9tKDUpLCBDT1VOVCksIGNvbnRlbnQxLCB0cmllMSwgdHJ1ZSk7CisgICAgICAgIGFkZFRvSW5NZW1vcnlUcmllKGdlbmVyYXRlS2V5cyhuZXcgUmFuZG9tKDUpLCBDT1VOVCksIGNvbnRlbnQyLCB0cmllMiwgdHJ1ZSk7CisKKyAgICAgICAgY29udGVudDEucHV0QWxsKGNvbnRlbnQyKTsKKyAgICAgICAgVHJpZTxCeXRlQnVmZmVyPiB1bmlvbiA9IG5ldyBDb2xsZWN0aW9uTWVyZ2VUcmllPD4oSW1tdXRhYmxlTGlzdC5vZih0cmllMSwgdHJpZTIpLCB4IC0+IHguaXRlcmF0b3IoKS5uZXh0KCkpOworCisgICAgICAgIGFzc2VydFNhbWVDb250ZW50KHVuaW9uLCBjb250ZW50MSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzdGluY3QoKQorICAgIHsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGVbXSBzcmMxID0gZ2VuZXJhdGVLZXlzKHJhbmQsIENPVU5UKTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50MSA9IG5ldyBUcmVlTWFwPD4oKGJ5dGVzMSwgYnl0ZXMyKSAtPiBCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJ5dGVzMSwgYnl0ZXMyLCBWRVJTSU9OKSk7CisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiB0cmllMSA9IG1ha2VJbk1lbW9yeVRyaWUoc3JjMSwgY29udGVudDEsIHRydWUpOworCisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjMiA9IGdlbmVyYXRlS2V5cyhyYW5kLCBDT1VOVCk7CisgICAgICAgIHNyYzIgPSByZW1vdmVEdXBsaWNhdGVzKHNyYzIsIGNvbnRlbnQxKTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50MiA9IG5ldyBUcmVlTWFwPD4oKGJ5dGVzMSwgYnl0ZXMyKSAtPiBCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJ5dGVzMSwgYnl0ZXMyLCBWRVJTSU9OKSk7CisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiB0cmllMiA9IG1ha2VJbk1lbW9yeVRyaWUoc3JjMiwgY29udGVudDIsIHRydWUpOworCisgICAgICAgIGNvbnRlbnQxLnB1dEFsbChjb250ZW50Mik7CisgICAgICAgIFRyaWU8Qnl0ZUJ1ZmZlcj4gdW5pb24gPSBuZXcgQ29sbGVjdGlvbk1lcmdlVHJpZS5EaXN0aW5jdDw+KEltbXV0YWJsZUxpc3Qub2YodHJpZTEsIHRyaWUyKSk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUNvbnRlbnQodW5pb24sIGNvbnRlbnQxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZSgpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlc3RNdWx0aXBsZShyYW5kLm5leHRJbnQoMTApICsgNSwgQ09VTlQgLyAxMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZTEoKQorICAgIHsKKyAgICAgICAgdGVzdE11bHRpcGxlKDEsIENPVU5UIC8gMTApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lcmdlMigpCisgICAgeworICAgICAgICB0ZXN0TXVsdGlwbGUoMiwgQ09VTlQgLyAxMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2UzKCkKKyAgICB7CisgICAgICAgIHRlc3RNdWx0aXBsZSgzLCBDT1VOVCAvIDEwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZTUoKQorICAgIHsKKyAgICAgICAgdGVzdE11bHRpcGxlKDUsIENPVU5UIC8gMTApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lcmdlMCgpCisgICAgeworICAgICAgICB0ZXN0TXVsdGlwbGUoMCwgQ09VTlQgLyAxMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlKGludCBtZXJnZUNvdW50LCBpbnQgY291bnQpCisgICAgeworICAgICAgICB0ZXN0TXVsdGlwbGVEaXN0aW5jdChtZXJnZUNvdW50LCBjb3VudCk7CisgICAgICAgIHRlc3RNdWx0aXBsZVdpdGhEdXBsaWNhdGVzKG1lcmdlQ291bnQsIGNvdW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVEaXN0aW5jdChpbnQgbWVyZ2VDb3VudCwgaW50IGNvdW50KQorICAgIHsKKyAgICAgICAgTGlzdDxUcmllPEJ5dGVCdWZmZXI+PiB0cmllcyA9IG5ldyBBcnJheUxpc3Q8PihtZXJnZUNvdW50KTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50ID0gbmV3IFRyZWVNYXA8PigoYnl0ZXMxLCBieXRlczIpIC0+IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnl0ZXMxLCBieXRlczIsIFZFUlNJT04pKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lcmdlQ291bnQ7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGVbXSBzcmMgPSByZW1vdmVEdXBsaWNhdGVzKGdlbmVyYXRlS2V5cyhyYW5kLCBjb3VudCksIGNvbnRlbnQpOworICAgICAgICAgICAgVHJpZTxCeXRlQnVmZmVyPiB0cmllID0gbWFrZUluTWVtb3J5VHJpZShzcmMsIGNvbnRlbnQsIHRydWUpOworICAgICAgICAgICAgdHJpZXMuYWRkKHRyaWUpOworICAgICAgICB9CisKKyAgICAgICAgVHJpZTxCeXRlQnVmZmVyPiB1bmlvbiA9IFRyaWUubWVyZ2VEaXN0aW5jdCh0cmllcyk7CisgICAgICAgIGFzc2VydFNhbWVDb250ZW50KHVuaW9uLCBjb250ZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVXaXRoRHVwbGljYXRlcyhpbnQgbWVyZ2VDb3VudCwgaW50IGNvdW50KQorICAgIHsKKyAgICAgICAgTGlzdDxUcmllPEJ5dGVCdWZmZXI+PiB0cmllcyA9IG5ldyBBcnJheUxpc3Q8PihtZXJnZUNvdW50KTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50ID0gbmV3IFRyZWVNYXA8PigoYnl0ZXMxLCBieXRlczIpIC0+IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnl0ZXMxLCBieXRlczIsIFZFUlNJT04pKTsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGVbXVtdIGtleXMgPSBuZXcgQnl0ZUNvbXBhcmFibGVbY291bnRdW107CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVyZ2VDb3VudDsgKytpKQorICAgICAgICAgICAga2V5c1tpXSA9IGdlbmVyYXRlS2V5cyhyYW5kLCBjb3VudCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXJnZUNvdW50OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjID0gQXJyYXlzLmNvcHlPZihrZXlzW2ldLCBjb3VudCArIGNvdW50IC8gMTApOworICAgICAgICAgICAgLy8gYWRkIGR1cGxpY2F0ZXMgZnJvbSBvdGhlciB0cmllcworICAgICAgICAgICAgaWYgKG1lcmdlQ291bnQgPiAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBjb3VudDsgaiA8IHNyYy5sZW5ndGg7ICsraikKKyAgICAgICAgICAgICAgICAgICAgc3JjW2pdID0ga2V5c1tyYW5kb21CdXROb3QocmFuZCwgbWVyZ2VDb3VudCwgaSldW3JhbmQubmV4dEludChjb3VudCldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUcmllPEJ5dGVCdWZmZXI+IHRyaWUgPSBtYWtlSW5NZW1vcnlUcmllKGtleXNbaV0sIGNvbnRlbnQsIHRydWUpOworICAgICAgICAgICAgdHJpZXMuYWRkKHRyaWUpOworICAgICAgICB9CisKKyAgICAgICAgVHJpZTxCeXRlQnVmZmVyPiB1bmlvbiA9IFRyaWUubWVyZ2UodHJpZXMsIHggLT4geC5pdGVyYXRvcigpLm5leHQoKSk7CisgICAgICAgIGFzc2VydFNhbWVDb250ZW50KHVuaW9uLCBjb250ZW50KTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdW5pb24gPSBUcmllLm1lcmdlRGlzdGluY3QodHJpZXMpOworICAgICAgICAgICAgYXNzZXJ0U2FtZUNvbnRlbnQodW5pb24sIGNvbnRlbnQpOworICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkV4cGVjdGVkIGFzc2VydGlvbiBlcnJvciBmb3IgZHVwbGljYXRlIGtleXMuIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNvcnJlY3QgcGF0aAorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcmFuZG9tQnV0Tm90KFJhbmRvbSByYW5kLCBpbnQgYm91bmQsIGludCBhdm9pZCkKKyAgICB7CisgICAgICAgIGludCByOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICByID0gcmFuZC5uZXh0SW50KGJvdW5kKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAociA9PSBhdm9pZCk7CisgICAgICAgIHJldHVybiByOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWVBcHBseVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWVBcHBseVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjBiN2M0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZUFwcGx5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK3B1YmxpYyBjbGFzcyBJbk1lbW9yeVRyaWVBcHBseVRlc3QgZXh0ZW5kcyBJbk1lbW9yeVRyaWVUZXN0QmFzZQoreworICAgIEBPdmVycmlkZQorICAgIGJvb2xlYW4gdXNlUHV0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllUHV0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZVB1dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWIyM2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZVB1dFRlc3QuamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkJ1ZmZlclR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitwdWJsaWMgY2xhc3MgSW5NZW1vcnlUcmllUHV0VGVzdCBleHRlbmRzIEluTWVtb3J5VHJpZVRlc3RCYXNlCit7CisgICAgQE92ZXJyaWRlCisgICAgYm9vbGVhbiB1c2VQdXQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ0tleV9TdGFja092ZXJmbG93KCkgdGhyb3dzIEluTWVtb3J5VHJpZS5TcGFjZUV4aGF1c3RlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSW5NZW1vcnlUcmllPFN0cmluZz4gdHJpZSA9IG5ldyBJbk1lbW9yeVRyaWU8PihCdWZmZXJUeXBlLk9OX0hFQVApOworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oMSk7CisgICAgICAgIGJ5dGVbXSBrZXkgPSBuZXcgYnl0ZVs0MDk2MF07CisgICAgICAgIHJhbmQubmV4dEJ5dGVzKGtleSk7CisgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGtleSk7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRyaWUucHV0UmVjdXJzaXZlKEJ5dGVDb21wYXJhYmxlLmZpeGVkTGVuZ3RoKGJ1ZiksICJ2YWx1ZSIsICh4LCB5KSAtPiB5KTsKKyAgICAgICAgICAgIEFzc2VydC5mYWlsKCJTdGFja092ZXJmbG93RXJyb3IgZXhwZWN0ZWQgd2l0aCBhIHJlY3Vyc2l2ZSBwdXQgZm9yIHZlcnkgbG9uZyBrZXlzISIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChTdGFja092ZXJmbG93RXJyb3Igc29lKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBFeHBlY3RlZC4KKyAgICAgICAgfQorICAgICAgICAvLyBVc2luZyBub24tcmVjdXJzaXZlIHB1dCBzaG91bGQgd29yay4KKyAgICAgICAgcHV0U2ltcGxlUmVzb2x2ZSh0cmllLCBCeXRlQ29tcGFyYWJsZS5maXhlZExlbmd0aChidWYpLCAidmFsdWUiLCAoeCwgeSkgLT4geSwgZmFsc2UpOworICAgIH0KKworICAgIC8vIFRoaXMgdGVzdHMgdGhhdCB0cmllIHNwYWNlIGFsbG9jYXRpb24gd29ya3MgY29ycmVjdGx5IGNsb3NlIHRvIHRoZSAyRyBsaW1pdC4gSXQgaXMgbm9ybWFsbHkgZGlzYWJsZWQgYmVjYXVzZQorICAgIC8vIHRoZSB0ZXN0IG1hY2hpbmVzIGRvbid0IHByb3ZpZGUgZW5vdWdoIGhlYXAgbWVtb3J5ICh0ZXN0IHJlcXVpcmVzIH44RyBoZWFwIHRvIGZpbmlzaCkuIFJ1biBpdCBtYW51YWxseSB3aGVuCisgICAgLy8gSW5NZW1vcnlUcmllLmFsbG9jYXRlQmxvY2sgaXMgbW9kaWZpZWQuCisgICAgQElnbm9yZQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE92ZXIxR1NpemUoKSB0aHJvd3MgSW5NZW1vcnlUcmllLlNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBJbk1lbW9yeVRyaWU8U3RyaW5nPiB0cmllID0gbmV3IEluTWVtb3J5VHJpZTw+KEJ1ZmZlclR5cGUuT05fSEVBUCk7CisgICAgICAgIHRyaWUuYWR2YW5jZUFsbG9jYXRlZFBvcygweDIwMDAwMDAwKTsKKyAgICAgICAgU3RyaW5nIHQxID0gInRlc3QxIjsKKyAgICAgICAgU3RyaW5nIHQyID0gInRlc3RpbmcyIjsKKyAgICAgICAgU3RyaW5nIHQzID0gIm9uZW1vcmV0ZXN0MyI7CisgICAgICAgIHRyaWUucHV0UmVjdXJzaXZlKEJ5dGVDb21wYXJhYmxlLm9mKHQxKSwgdDEsICh4LCB5KSAtPiB5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0MSwgdHJpZS5nZXQoQnl0ZUNvbXBhcmFibGUub2YodDEpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKHRyaWUuZ2V0KEJ5dGVDb21wYXJhYmxlLm9mKHQyKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UodHJpZS5yZWFjaGVkQWxsb2NhdGVkU2l6ZVRocmVzaG9sZCgpKTsKKworICAgICAgICB0cmllLmFkdmFuY2VBbGxvY2F0ZWRQb3MoSW5NZW1vcnlUcmllLkFMTE9DQVRFRF9TSVpFX1RIUkVTSE9MRCArIDB4MTAwMCk7CisgICAgICAgIHRyaWUucHV0UmVjdXJzaXZlKEJ5dGVDb21wYXJhYmxlLm9mKHQyKSwgdDIsICh4LCB5KSAtPiB5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0MSwgdHJpZS5nZXQoQnl0ZUNvbXBhcmFibGUub2YodDEpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModDIsIHRyaWUuZ2V0KEJ5dGVDb21wYXJhYmxlLm9mKHQyKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbCh0cmllLmdldChCeXRlQ29tcGFyYWJsZS5vZih0MykpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodHJpZS5yZWFjaGVkQWxsb2NhdGVkU2l6ZVRocmVzaG9sZCgpKTsKKworICAgICAgICB0cmllLmFkdmFuY2VBbGxvY2F0ZWRQb3MoMHg3RkZGRkVFMCk7ICAvLyBjbG9zZSB0byAyRworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHQxLCB0cmllLmdldChCeXRlQ29tcGFyYWJsZS5vZih0MSkpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0MiwgdHJpZS5nZXQoQnl0ZUNvbXBhcmFibGUub2YodDIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKHRyaWUuZ2V0KEJ5dGVDb21wYXJhYmxlLm9mKHQzKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0cmllLnJlYWNoZWRBbGxvY2F0ZWRTaXplVGhyZXNob2xkKCkpOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB0cmllLnB1dFJlY3Vyc2l2ZShCeXRlQ29tcGFyYWJsZS5vZih0MyksIHQzLCAoeCwgeSkgLT4geSk7ICAvLyBzaG91bGQgcHV0IGl0IG92ZXIgdGhlIGVkZ2UKKyAgICAgICAgICAgIGZhaWwoIkluTWVtb3J5VHJpZS5TcGFjZUV4aGF1c3RlZEVycm9yIHdhcyBleHBlY3RlZCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbk1lbW9yeVRyaWUuU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModDEsIHRyaWUuZ2V0KEJ5dGVDb21wYXJhYmxlLm9mKHQxKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHQyLCB0cmllLmdldChCeXRlQ29tcGFyYWJsZS5vZih0MikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwodHJpZS5nZXQoQnl0ZUNvbXBhcmFibGUub2YodDMpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRyaWUucmVhY2hlZEFsbG9jYXRlZFNpemVUaHJlc2hvbGQoKSk7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRyaWUuYWR2YW5jZUFsbG9jYXRlZFBvcyhJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgICAgICBmYWlsKCJJbk1lbW9yeVRyaWUuU3BhY2VFeGhhdXN0ZWRFcnJvciB3YXMgZXhwZWN0ZWQiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSW5NZW1vcnlUcmllLlNwYWNlRXhoYXVzdGVkRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHQxLCB0cmllLmdldChCeXRlQ29tcGFyYWJsZS5vZih0MSkpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0MiwgdHJpZS5nZXQoQnl0ZUNvbXBhcmFibGUub2YodDIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKHRyaWUuZ2V0KEJ5dGVDb21wYXJhYmxlLm9mKHQzKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0cmllLnJlYWNoZWRBbGxvY2F0ZWRTaXplVGhyZXNob2xkKCkpOworCisgICAgICAgIHRyaWUuZGlzY2FyZEJ1ZmZlcnMoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllVGVzdEJhc2UuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9Jbk1lbW9yeVRyaWVUZXN0QmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYzE3MTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllVGVzdEJhc2UuamF2YQpAQCAtMCwwICsxLDYzMSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5IYXNoTXVsdGlzZXQ7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aXNldDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQnVmZmVyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5PYmplY3RTaXplczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEluTWVtb3J5VHJpZVRlc3RCYXNlCit7CisgICAgLy8gU2V0IHRoaXMgdG8gdHJ1ZSAoaW4gY29tYmluYXRpb24gd2l0aCBzbWFsbGVyIGNvdW50KSB0byBkdW1wIHRoZSB0cmllcyB3aGlsZSBkZWJ1Z2dpbmcgYSBwcm9ibGVtLgorICAgIC8vIERvIG5vdCBjb21taXQgdGhlIGNvZGUgd2l0aCBWRVJCT1NFID0gdHJ1ZS4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFZFUkJPU0UgPSBmYWxzZTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT1VOVCA9IDEwMDAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgS0VZX0NIT0lDRSA9IDI1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fTEVOR1RIID0gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9MRU5HVEggPSA1MDsKKworICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOworCisgICAgc3RhdGljIGZpbmFsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gVkVSU0lPTiA9IEluTWVtb3J5VHJpZS5CWVRFX0NPTVBBUkFCTEVfVkVSU0lPTjsKKworICAgIGFic3RyYWN0IGJvb2xlYW4gdXNlUHV0KCk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGUoKQorICAgIHsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGUgZSA9IEJ5dGVDb21wYXJhYmxlLm9mKCJ0ZXN0Iik7CisgICAgICAgIEluTWVtb3J5VHJpZTxTdHJpbmc+IHRyaWUgPSBuZXcgSW5NZW1vcnlUcmllPD4oQnVmZmVyVHlwZS5PRkZfSEVBUCk7CisgICAgICAgIHB1dFNpbXBsZVJlc29sdmUodHJpZSwgZSwgInRlc3QiLCAoeCwgeSkgLT4geSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJpZSAiICsgdHJpZS5kdW1wKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCB0cmllLmdldChlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB0cmllLmdldChCeXRlQ29tcGFyYWJsZS5vZigidGVzdGUiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNwbGl0TXVsdGkoKQorICAgIHsKKyAgICAgICAgdGVzdEVudHJpZXMobmV3IFN0cmluZ1tdIHsgInRlc3RpbmciLCAidGVzdHMiLCAidHJpYWxzIiwgInRyaWFsIiwgImFhYWEiLCAiYWFhYWIiLCAiYWJkZGRkIiwgImFiZWVlZSIgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3BsaXRNdWx0aUJ1ZygpCisgICAgeworICAgICAgICB0ZXN0RW50cmllc0hleChuZXcgU3RyaW5nW10geyAiMGM0MTQzYWVmZiIsICIwYzQxNDNhZTY5ZmYiIH0pOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3BhcnNlMDBidWcoKQorICAgIHsKKyAgICAgICAgU3RyaW5nW10gdGVzdHMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAiNDBiZDI1NmU2ZmQyYWRhZmM0NDAzMzMwMzAwMCIsCisgICAgICAgICI0MGJkZDQ3ZWMwNDM2NDFmMmI0MDMxMzEzMjM0MDAiLAorICAgICAgICAiNDBiZDAwYmY1YWU4Y2Y5ZDFkNDAzMTMzMzIzODAwIiwKKyAgICAgICAgfTsKKyAgICAgICAgSW5NZW1vcnlUcmllPFN0cmluZz4gdHJpZSA9IG5ldyBJbk1lbW9yeVRyaWU8PihCdWZmZXJUeXBlLk9GRl9IRUFQKTsKKyAgICAgICAgZm9yIChTdHJpbmcgdGVzdCA6IHRlc3RzKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSBlID0gQnl0ZUNvbXBhcmFibGUuZml4ZWRMZW5ndGgoQnl0ZUJ1ZmZlclV0aWwuaGV4VG9CeXRlcyh0ZXN0KSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyAiICsgYXNTdHJpbmcoZSkgKyAiOiAiICsgdGVzdCk7CisgICAgICAgICAgICBwdXRTaW1wbGVSZXNvbHZlKHRyaWUsIGUsIHRlc3QsICh4LCB5KSAtPiB5KTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0cmllLmR1bXAoKSk7CisKKyAgICAgICAgZm9yIChTdHJpbmcgdGVzdCA6IHRlc3RzKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3QsIHRyaWUuZ2V0KEJ5dGVDb21wYXJhYmxlLmZpeGVkTGVuZ3RoKEJ5dGVCdWZmZXJVdGlsLmhleFRvQnl0ZXModGVzdCkpKSk7CisKKyAgICAgICAgQXJyYXlzLnNvcnQodGVzdHMpOworCisgICAgICAgIGludCBpZHggPSAwOworICAgICAgICBmb3IgKFN0cmluZyBzIDogdHJpZS52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHMgIT0gdGVzdHNbaWR4XSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIiIgKyBzICsgIiE9IiArIHRlc3RzW2lkeF0pOworICAgICAgICAgICAgKytpZHg7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RzLmxlbmd0aCwgaWR4KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb250ZW50KCkKKyAgICB7CisgICAgICAgIFN0cmluZ1tdIHRlc3RzID0gbmV3IFN0cmluZ1tdIHsidGVzdGluZyIsICJ0ZXN0cyIsICJ0cmlhbHMiLCAidHJpYWwiLCAidGVzdGluZyIsICJ0cmlhbCIsICJ0cmlhbCJ9OworICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW10geyJ0ZXN0aW5nIiwgInRlc3RzIiwgInRyaWFscyIsICJ0cmlhbCIsICJ0MiIsICJ4MiIsICJ5MiJ9OworICAgICAgICBJbk1lbW9yeVRyaWU8U3RyaW5nPiB0cmllID0gbmV3IEluTWVtb3J5VHJpZTw+KEJ1ZmZlclR5cGUuT0ZGX0hFQVApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RzLmxlbmd0aDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdGVzdCA9IHRlc3RzW2ldOworICAgICAgICAgICAgU3RyaW5nIHYgPSB2YWx1ZXNbaV07CisgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSBlID0gQnl0ZUNvbXBhcmFibGUub2YodGVzdCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyAiICsgYXNTdHJpbmcoZSkgKyAiOiAiICsgdik7CisgICAgICAgICAgICBwdXRTaW1wbGVSZXNvbHZlKHRyaWUsIGUsIHYsICh4LCB5KSAtPiAiIiArIHggKyB5KTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJpZSAiICsgdHJpZS5kdW1wKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHRlc3QgPSB0ZXN0c1tpXTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJlYW0uaXRlcmF0ZSgwLCB4IC0+IHggKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5saW1pdCh0ZXN0cy5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih4IC0+IHRlc3RzW3hdID09IHRlc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh4IC0+IHZhbHVlc1t4XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVkdWNlKCIiLCAoeCwgeSkgLT4gIiIgKyB4ICsgeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5nZXQoQnl0ZUNvbXBhcmFibGUub2YodGVzdCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTcGVjU3RhY2tFbnRyeQorICAgIHsKKyAgICAgICAgT2JqZWN0W10gY2hpbGRyZW47CisgICAgICAgIGludCBjdXJDaGlsZDsKKyAgICAgICAgT2JqZWN0IGNvbnRlbnQ7CisgICAgICAgIFNwZWNTdGFja0VudHJ5IHBhcmVudDsKKworICAgICAgICBwdWJsaWMgU3BlY1N0YWNrRW50cnkoT2JqZWN0W10gc3BlYywgT2JqZWN0IGNvbnRlbnQsIFNwZWNTdGFja0VudHJ5IHBhcmVudCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHNwZWM7CisgICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50OworICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgICAgICB0aGlzLmN1ckNoaWxkID0gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1cnNvckZyb21TcGVjIGltcGxlbWVudHMgVHJpZS5DdXJzb3I8Qnl0ZUJ1ZmZlcj4KKyAgICB7CisgICAgICAgIFNwZWNTdGFja0VudHJ5IHN0YWNrOworICAgICAgICBpbnQgZGVwdGg7CisKKyAgICAgICAgQ3Vyc29yRnJvbVNwZWMoT2JqZWN0W10gc3BlYykKKyAgICAgICAgeworICAgICAgICAgICAgc3RhY2sgPSBuZXcgU3BlY1N0YWNrRW50cnkoc3BlYywgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBkZXB0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkdmFuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICBTcGVjU3RhY2tFbnRyeSBjdXJyZW50ID0gc3RhY2s7CisgICAgICAgICAgICB3aGlsZSAoY3VycmVudCAhPSBudWxsICYmICsrY3VycmVudC5jdXJDaGlsZCA+PSBjdXJyZW50LmNoaWxkcmVuLmxlbmd0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7CisgICAgICAgICAgICAgICAgLS1kZXB0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjdXJyZW50ID09IG51bGwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGRlcHRoID09IC0xOworICAgICAgICAgICAgICAgIHJldHVybiBkZXB0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgT2JqZWN0IGNoaWxkID0gY3VycmVudC5jaGlsZHJlbltjdXJyZW50LmN1ckNoaWxkXTsKKyAgICAgICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIE9iamVjdFtdKQorICAgICAgICAgICAgICAgIHN0YWNrID0gbmV3IFNwZWNTdGFja0VudHJ5KChPYmplY3RbXSkgY2hpbGQsIG51bGwsIGN1cnJlbnQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0YWNrID0gbmV3IFNwZWNTdGFja0VudHJ5KG5ldyBPYmplY3RbMF0sIGNoaWxkLCBjdXJyZW50KTsKKworICAgICAgICAgICAgcmV0dXJuICsrZGVwdGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGFkdmFuY2VNdWx0aXBsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgrK3N0YWNrLmN1ckNoaWxkID49IHN0YWNrLmNoaWxkcmVuLmxlbmd0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2tpcENoaWxkcmVuKCk7CisKKyAgICAgICAgICAgIE9iamVjdCBjaGlsZCA9IHN0YWNrLmNoaWxkcmVuW3N0YWNrLmN1ckNoaWxkXTsKKyAgICAgICAgICAgIHdoaWxlIChjaGlsZCBpbnN0YW5jZW9mIE9iamVjdFtdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YWNrID0gbmV3IFNwZWNTdGFja0VudHJ5KChPYmplY3RbXSkgY2hpbGQsIG51bGwsIHN0YWNrKTsKKyAgICAgICAgICAgICAgICArK2RlcHRoOworICAgICAgICAgICAgICAgIGlmIChzdGFjay5jaGlsZHJlbi5sZW5ndGggPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlcHRoOworICAgICAgICAgICAgICAgIGNoaWxkID0gc3RhY2suY2hpbGRyZW5bMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFjayA9IG5ldyBTcGVjU3RhY2tFbnRyeShuZXcgT2JqZWN0WzBdLCBjaGlsZCwgc3RhY2spOworCisKKyAgICAgICAgICAgIHJldHVybiArK2RlcHRoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBza2lwQ2hpbGRyZW4oKQorICAgICAgICB7CisgICAgICAgICAgICAtLWRlcHRoOworICAgICAgICAgICAgc3RhY2sgPSBzdGFjay5wYXJlbnQ7CisgICAgICAgICAgICByZXR1cm4gYWR2YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBkZXB0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBkZXB0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGNvbnRlbnQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKEJ5dGVCdWZmZXIpIHN0YWNrLmNvbnRlbnQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGluY29taW5nVHJhbnNpdGlvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNwZWNTdGFja0VudHJ5IHBhcmVudCA9IHN0YWNrLnBhcmVudDsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnQgIT0gbnVsbCA/IHBhcmVudC5jdXJDaGlsZCArIDB4MzAgOiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBUcmllPEJ5dGVCdWZmZXI+IHNwZWNpZmllZFRyaWUoT2JqZWN0W10gbm9kZURlZikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVHJpZTxCeXRlQnVmZmVyPigpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIEN1cnNvcjxCeXRlQnVmZmVyPiBjdXJzb3IoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ3Vyc29yRnJvbVNwZWMobm9kZURlZik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50cmllc051bGxDaGlsZEJ1ZygpCisgICAgeworICAgICAgICBPYmplY3RbXSB0cmllRGVmID0gbmV3IE9iamVjdFtdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAvLyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlcygxKSwgLy8gMDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKDIpICAvLyAwMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgcmVxdWVzdENoaWxkIHJldHVybnMgbnVsbCwgYmFkIHRoaW5ncyBjYW4gaGFwcGVuIChEQi0yOTgyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC8vIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlcygzKSwgLy8gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ICAvLyAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlcyg0KSwgLy8gMzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsc28gdHJ5IG51bGwgb24gdGhlIFJlbWFpbmluZy5PTkUgcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvLyAzMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoNSksIC8vIDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbHNvIHRlc3QgcmVxdWVzdFVuaXF1ZURlc2NlbmRhbnQgcmV0dXJuaW5nIG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAvLyA1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAvLyA1MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAvLyA1MDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIC8vIDUwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoNikgLy8gNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gZXhwZWN0ZWQgPSBuZXcgVHJlZU1hcDw+KChieXRlczEsIGJ5dGVzMikgLT4gQnl0ZUNvbXBhcmFibGUuY29tcGFyZShieXRlczEsIGJ5dGVzMiwgVkVSU0lPTikpOworICAgICAgICBleHBlY3RlZC5wdXQoY29tcGFyYWJsZSgiMDAiKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoMSkpOworICAgICAgICBleHBlY3RlZC5wdXQoY29tcGFyYWJsZSgiMDEiKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoMikpOworICAgICAgICBleHBlY3RlZC5wdXQoY29tcGFyYWJsZSgiMiIpLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygzKSk7CisgICAgICAgIGV4cGVjdGVkLnB1dChjb21wYXJhYmxlKCIzMCIpLCBCeXRlQnVmZmVyVXRpbC5ieXRlcyg0KSk7CisgICAgICAgIGV4cGVjdGVkLnB1dChjb21wYXJhYmxlKCI0IiksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKDUpKTsKKyAgICAgICAgZXhwZWN0ZWQucHV0KGNvbXBhcmFibGUoIjYiKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoNikpOworCisgICAgICAgIFRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZSA9IHNwZWNpZmllZFRyaWUodHJpZURlZik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0cmllLmR1bXAoKSk7CisgICAgICAgIGFzc2VydFNhbWVDb250ZW50KHRyaWUsIGV4cGVjdGVkKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGUgY29tcGFyYWJsZShTdHJpbmcgcykKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgYiA9IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHMpOworICAgICAgICByZXR1cm4gQnl0ZUNvbXBhcmFibGUuZml4ZWRMZW5ndGgoYik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0KCkKKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjID0gZ2VuZXJhdGVLZXlzKHJhbmQsIENPVU5UKTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50ID0gbmV3IFRyZWVNYXA8PigoYnl0ZXMxLCBieXRlczIpIC0+IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnl0ZXMxLCBieXRlczIsIFZFUlNJT04pKTsKKyAgICAgICAgSW5NZW1vcnlUcmllPEJ5dGVCdWZmZXI+IHRyaWUgPSBtYWtlSW5NZW1vcnlUcmllKHNyYywgY29udGVudCwgdXNlUHV0KCkpOworICAgICAgICBpbnQga2V5c2l6ZSA9IEFycmF5cy5zdHJlYW0oc3JjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBUb0ludChzcmMxIC0+IEJ5dGVDb21wYXJhYmxlLmxlbmd0aChzcmMxLCBWRVJTSU9OKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3VtKCk7CisgICAgICAgIGxvbmcgdHMgPSBPYmplY3RTaXplcy5tZWFzdXJlRGVlcChjb250ZW50KTsKKyAgICAgICAgbG9uZyBvbmggPSBPYmplY3RTaXplcy5tZWFzdXJlRGVlcCh0cmllLmNvbnRlbnRBcnJheXMpOworICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgiVHJpZSBzaXplIG9uIGhlYXAgJSxkIG9mZiBoZWFwICUsZCBtZWFzdXJlZCAlLGQga2V5cyAlLGQgdHJlZW1hcCAlLGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWUuc2l6ZU9uSGVhcCgpLCB0cmllLnNpemVPZmZIZWFwKCksIG9uaCwga2V5c2l6ZSwgdHMpOworICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgicGVyIGVudHJ5IG9uIGhlYXAgJS4yZiBvZmYgaGVhcCAlLjJmIG1lYXN1cmVkICUuMmYga2V5cyAlLjJmIHRyZWVtYXAgJS4yZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5zaXplT25IZWFwKCkgKiAxLjAgLyBDT1VOVCwgdHJpZS5zaXplT2ZmSGVhcCgpICogMS4wIC8gQ09VTlQsIG9uaCAqIDEuMCAvIENPVU5ULCBrZXlzaXplICogMS4wIC8gQ09VTlQsIHRzICogMS4wIC8gQ09VTlQpOworICAgICAgICBpZiAoVkVSQk9TRSkKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJpZSAiICsgdHJpZS5kdW1wKEJ5dGVCdWZmZXJVdGlsOjpieXRlc1RvSGV4KSk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUNvbnRlbnQodHJpZSwgY29udGVudCk7CisgICAgICAgIGNoZWNrR2V0KHRyaWUsIGNvbnRlbnQpOworCisgICAgICAgIHRyaWUuZGlzY2FyZEJ1ZmZlcnMoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVmaXhFdm9sdXRpb24oKQorICAgIHsKKyAgICAgICAgdGVzdEVudHJpZXMobmV3IFN0cmluZ1tdIHsgInRlc3RpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlc3QgY2hhbmdpbmcgdHlwZSB3aXRoIHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZXMxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGVzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlczMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZXM0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGVzNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlczYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZXM3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGVzOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlc3QgYWRkaW5nIHByZWZpeCB0byBjaGFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhaW4xMjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hhaW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0IGFkZGluZyBwcmVmaXggdG8gc3BhcnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGFyc2UxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwYXJzZTIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BhcnNlMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGFyc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXN0IGFkZGluZyBwcmVmaXggdG8gc3BsaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbGl0MSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGxpdDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BsaXQzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbGl0NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGxpdDUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BsaXQ2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNwbGl0NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGxpdDgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BsaXQiCisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZWZpeFVuc2FmZU11bHRpKCkKKyAgICB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBwcmVmaXhlcyBvbiBpbnNpZGUgYSBtdWx0aSBhcmVuJ3Qgb3ZlcndyaXR0ZW4gYnkgZW1iZWRkZWQgbWV0YWRhdGEgbm9kZS4KKworICAgICAgICB0ZXN0RW50cmllcyhuZXcgU3RyaW5nW10geyAidGVzdDg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Q4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Q4OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0ODkwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Q4OTAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Q4OTAxMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0ODkwMTIzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Q4OTAxMjM0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RFbnRyaWVzKFN0cmluZ1tdIHRlc3RzKQorICAgIHsKKyAgICAgICAgZm9yIChGdW5jdGlvbjxTdHJpbmcsIEJ5dGVDb21wYXJhYmxlPiBtYXBwaW5nIDoKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0LjxGdW5jdGlvbjxTdHJpbmcsIEJ5dGVDb21wYXJhYmxlPj5vZihCeXRlQ29tcGFyYWJsZTo6b2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyAtPiBCeXRlQ29tcGFyYWJsZS5maXhlZExlbmd0aChzLmdldEJ5dGVzKCkpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdEVudHJpZXModGVzdHMsIG1hcHBpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RFbnRyaWVzSGV4KFN0cmluZ1tdIHRlc3RzKQorICAgIHsKKyAgICAgICAgdGVzdEVudHJpZXModGVzdHMsIHMgLT4gQnl0ZUNvbXBhcmFibGUuZml4ZWRMZW5ndGgoQnl0ZUJ1ZmZlclV0aWwuaGV4VG9CeXRlcyhzKSkpOworICAgICAgICAvLyBSdW4gdGhlIG90aGVyIHRyYW5zbGF0aW9ucyBqdXN0IGluIGNhc2UuCisgICAgICAgIHRlc3RFbnRyaWVzKHRlc3RzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEVudHJpZXMoU3RyaW5nW10gdGVzdHMsIEZ1bmN0aW9uPFN0cmluZywgQnl0ZUNvbXBhcmFibGU+IG1hcHBpbmcpCisKKyAgICB7CisgICAgICAgIEluTWVtb3J5VHJpZTxTdHJpbmc+IHRyaWUgPSBuZXcgSW5NZW1vcnlUcmllPD4oQnVmZmVyVHlwZS5PRkZfSEVBUCk7CisgICAgICAgIGZvciAoU3RyaW5nIHRlc3QgOiB0ZXN0cykKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgZSA9IG1hcHBpbmcuYXBwbHkodGVzdCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyAiICsgYXNTdHJpbmcoZSkgKyAiOiAiICsgdGVzdCk7CisgICAgICAgICAgICBwdXRTaW1wbGVSZXNvbHZlKHRyaWUsIGUsIHRlc3QsICh4LCB5KSAtPiB5KTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJpZVxuIiArIHRyaWUuZHVtcCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoU3RyaW5nIHRlc3QgOiB0ZXN0cykKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0LCB0cmllLmdldChtYXBwaW5nLmFwcGx5KHRlc3QpKSk7CisgICAgfQorCisgICAgc3RhdGljIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiBtYWtlSW5NZW1vcnlUcmllKEJ5dGVDb21wYXJhYmxlW10gc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlUHV0KQorCisgICAgeworICAgICAgICBJbk1lbW9yeVRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZSA9IG5ldyBJbk1lbW9yeVRyaWU8PihCdWZmZXJUeXBlLk9GRl9IRUFQKTsKKyAgICAgICAgYWRkVG9Jbk1lbW9yeVRyaWUoc3JjLCBjb250ZW50LCB0cmllLCB1c2VQdXQpOworICAgICAgICByZXR1cm4gdHJpZTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBhZGRUb0luTWVtb3J5VHJpZShCeXRlQ29tcGFyYWJsZVtdIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5NZW1vcnlUcmllPEJ5dGVCdWZmZXI+IHRyaWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VQdXQpCisKKyAgICB7CisgICAgICAgIGZvciAoQnl0ZUNvbXBhcmFibGUgYiA6IHNyYykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTm90ZTogQmVjYXVzZSB3ZSBkb24ndCBlbnN1cmUgb3JkZXIgd2hlbiBjYWxsaW5nIHJlc29sdmUsIGp1c3QgdXNlIGEgaGFzaCBvZiB0aGUga2V5IGFzIHBheWxvYWQKKyAgICAgICAgICAgIC8vIChzbyB0aGF0IGFsbCBzb3VyY2VzIGhhdmUgdGhlIHNhbWUgdmFsdWUpLgorICAgICAgICAgICAgaW50IHBheWxvYWQgPSBhc1N0cmluZyhiKS5oYXNoQ29kZSgpOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciB2ID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMocGF5bG9hZCk7CisgICAgICAgICAgICBjb250ZW50LnB1dChiLCB2KTsKKyAgICAgICAgICAgIGlmIChWRVJCT1NFKQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nICIgKyBhc1N0cmluZyhiKSArICI6ICIgKyBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KHYpKTsKKyAgICAgICAgICAgIHB1dFNpbXBsZVJlc29sdmUodHJpZSwgYiwgdiwgKHgsIHkpIC0+IHksIHVzZVB1dCk7CisgICAgICAgICAgICBpZiAoVkVSQk9TRSkKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4odHJpZS5kdW1wKEJ5dGVCdWZmZXJVdGlsOjpieXRlc1RvSGV4KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBjaGVja0dldChJbk1lbW9yeVRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZSwgTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBpdGVtcykKKyAgICB7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBlbiA6IGl0ZW1zLmVudHJ5U2V0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbi5nZXRWYWx1ZSgpLCB0cmllLmdldChlbi5nZXRLZXkoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgYXNzZXJ0U2FtZUNvbnRlbnQoVHJpZTxCeXRlQnVmZmVyPiB0cmllLCBTb3J0ZWRNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IG1hcCkKKyAgICB7CisgICAgICAgIGFzc2VydE1hcEVxdWFscyh0cmllLCBtYXApOworICAgICAgICBhc3NlcnRGb3JFYWNoRW50cnlFcXVhbHModHJpZSwgbWFwKTsKKyAgICAgICAgYXNzZXJ0VmFsdWVzRXF1YWwodHJpZSwgbWFwKTsKKyAgICAgICAgYXNzZXJ0Rm9yRWFjaFZhbHVlRXF1YWxzKHRyaWUsIG1hcCk7CisgICAgICAgIGFzc2VydFVub3JkZXJlZFZhbHVlc0VxdWFsKHRyaWUsIG1hcCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRWYWx1ZXNFcXVhbChUcmllPEJ5dGVCdWZmZXI+IHRyaWUsIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gbWFwKQorICAgIHsKKyAgICAgICAgYXNzZXJ0SXRlcmFibGVzRXF1YWwodHJpZS52YWx1ZXMoKSwgbWFwLnZhbHVlcygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFVub3JkZXJlZFZhbHVlc0VxdWFsKFRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZSwgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBtYXApCisgICAgeworICAgICAgICBNdWx0aXNldDxCeXRlQnVmZmVyPiB1bm9yZGVyZWQgPSBIYXNoTXVsdGlzZXQuY3JlYXRlKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgZXJyb3JzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGIgOiB0cmllLnZhbHVlc1Vub3JkZXJlZCgpKQorICAgICAgICAgICAgdW5vcmRlcmVkLmFkZChiKTsKKworICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgYiA6IG1hcC52YWx1ZXMoKSkKKyAgICAgICAgICAgIGlmICghdW5vcmRlcmVkLnJlbW92ZShiKSkKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJcbk1pc3NpbmcgdmFsdWUgaW4gdmFsdWVzVW5vcmRlcmVkOiAiICsgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiKSk7CisKKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGIgOiB1bm9yZGVyZWQpCisgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJcbkV4dHJhIHZhbHVlIGluIHZhbHVlc1Vub3JkZXJlZDogIiArIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYikpOworCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgZXJyb3JzLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Rm9yRWFjaEVudHJ5RXF1YWxzKFRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZSwgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBtYXApCisgICAgeworICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+PiBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgIHRyaWUuZm9yRWFjaEVudHJ5KChrZXksIHZhbHVlKSAtPiB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiTWFwIGV4aGF1c3RlZCBmaXJzdCwga2V5ICIgKyBhc1N0cmluZyhrZXkpLCBpdC5oYXNOZXh0KCkpOworICAgICAgICAgICAgTWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBlbnRyeSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGVudHJ5LmdldEtleSgpLCBrZXksIFRyaWUuQllURV9DT01QQVJBQkxFX1ZFUlNJT04pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbnRyeS5nZXRWYWx1ZSgpLCB2YWx1ZSk7CisgICAgICAgIH0pOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoIlRyaWUgZXhoYXVzdGVkIGZpcnN0IiwgaXQuaGFzTmV4dCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEZvckVhY2hWYWx1ZUVxdWFscyhUcmllPEJ5dGVCdWZmZXI+IHRyaWUsIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gbWFwKQorICAgIHsKKyAgICAgICAgSXRlcmF0b3I8Qnl0ZUJ1ZmZlcj4gaXQgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgdHJpZS5mb3JFYWNoVmFsdWUodmFsdWUgLT4geworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIk1hcCBleGhhdXN0ZWQgZmlyc3QsIHZhbHVlICIgKyBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KHZhbHVlKSwgaXQuaGFzTmV4dCgpKTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgZW50cnkgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZW50cnksIHZhbHVlKTsKKyAgICAgICAgfSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiVHJpZSBleGhhdXN0ZWQgZmlyc3QiLCBpdC5oYXNOZXh0KCkpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGFzc2VydE1hcEVxdWFscyhUcmllPEJ5dGVCdWZmZXI+IHRyaWUsIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gbWFwKQorICAgIHsKKyAgICAgICAgYXNzZXJ0TWFwRXF1YWxzKHRyaWUuZW50cnlTZXQoKSwgbWFwLmVudHJ5U2V0KCkpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIGFzc2VydE1hcEVxdWFscyhJdGVyYWJsZTxNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+PiBjb250YWluZXIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYWJsZTxNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+PiBjb250YWluZXIyKQorICAgIHsKKyAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPj4gaXQxID0gY29udGFpbmVyMS5pdGVyYXRvcigpOworICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+PiBpdDIgPSBjb250YWluZXIyLml0ZXJhdG9yKCk7CisgICAgICAgIExpc3Q8Qnl0ZUNvbXBhcmFibGU+IGZhaWxlZEF0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHdoaWxlIChpdDEuaGFzTmV4dCgpICYmIGl0Mi5oYXNOZXh0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1hcC5FbnRyeTxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gZW4xID0gaXQxLm5leHQoKTsKKyAgICAgICAgICAgIE1hcC5FbnRyeTxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gZW4yID0gaXQyLm5leHQoKTsKKyAgICAgICAgICAgIGIuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlRyZWVTZXQgJXM6JXNcbiIsIGFzU3RyaW5nKGVuMi5nZXRLZXkoKSksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoZW4yLmdldFZhbHVlKCkpKSk7CisgICAgICAgICAgICBiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJUcmllICAgICVzOiVzXG4iLCBhc1N0cmluZyhlbjEuZ2V0S2V5KCkpLCBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGVuMS5nZXRWYWx1ZSgpKSkpOworICAgICAgICAgICAgaWYgKEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoZW4xLmdldEtleSgpLCBlbjIuZ2V0S2V5KCksIFZFUlNJT04pICE9IDAgfHwgQnl0ZUJ1ZmZlclV0aWwuY29tcGFyZVVuc2lnbmVkKGVuMS5nZXRWYWx1ZSgpLCBlbjIuZ2V0VmFsdWUoKSkgIT0gMCkKKyAgICAgICAgICAgICAgICBmYWlsZWRBdC5hZGQoZW4xLmdldEtleSgpKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoaXQxLmhhc05leHQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgTWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBlbjEgPSBpdDEubmV4dCgpOworICAgICAgICAgICAgYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiVHJpZSAgICAlczolc1xuIiwgYXNTdHJpbmcoZW4xLmdldEtleSgpKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChlbjEuZ2V0VmFsdWUoKSkpKTsKKyAgICAgICAgICAgIGZhaWxlZEF0LmFkZChlbjEuZ2V0S2V5KCkpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChpdDIuaGFzTmV4dCgpKQorICAgICAgICB7CisgICAgICAgICAgICBNYXAuRW50cnk8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGVuMiA9IGl0Mi5uZXh0KCk7CisgICAgICAgICAgICBiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJUcmVlU2V0ICVzOiVzXG4iLCBhc1N0cmluZyhlbjIuZ2V0S2V5KCkpLCBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGVuMi5nZXRWYWx1ZSgpKSkpOworICAgICAgICAgICAgZmFpbGVkQXQuYWRkKGVuMi5nZXRLZXkoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmYWlsZWRBdC5pc0VtcHR5KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkZhaWxlZCBhdCAiICsgTGlzdHMudHJhbnNmb3JtKGZhaWxlZEF0LCBJbk1lbW9yeVRyaWVUZXN0QmFzZTo6YXNTdHJpbmcpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UpOworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKGIpOworICAgICAgICAgICAgQXNzZXJ0LmZhaWwobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPEU+PiB2b2lkIGFzc2VydEl0ZXJhYmxlc0VxdWFsKEl0ZXJhYmxlPEU+IGV4cGVjdGVkSXRlcmFibGUsIEl0ZXJhYmxlPEU+IGFjdHVhbEl0ZXJhYmxlKQorICAgIHsKKyAgICAgICAgSXRlcmF0b3I8RT4gZXhwZWN0ZWQgPSBleHBlY3RlZEl0ZXJhYmxlLml0ZXJhdG9yKCk7CisgICAgICAgIEl0ZXJhdG9yPEU+IGFjdHVhbCA9IGFjdHVhbEl0ZXJhYmxlLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChhY3R1YWwuaGFzTmV4dCgpICYmIGV4cGVjdGVkLmhhc05leHQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhY3R1YWwubmV4dCgpLCBleHBlY3RlZC5uZXh0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChleHBlY3RlZC5oYXNOZXh0KCkpCisgICAgICAgICAgICBBc3NlcnQuZmFpbCgiUmVtYWluZyB2YWx1ZXMgaW4gZXhwZWN0ZWQsIHN0YXJ0aW5nIHdpdGggIiArIGV4cGVjdGVkLm5leHQoKSk7CisgICAgICAgIGVsc2UgaWYgKGFjdHVhbC5oYXNOZXh0KCkpCisgICAgICAgICAgICBBc3NlcnQuZmFpbCgiUmVtYWluZyB2YWx1ZXMgaW4gYWN0dWFsLCBzdGFydGluZyB3aXRoICIgKyBhY3R1YWwubmV4dCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGVbXSBnZW5lcmF0ZUtleXMoUmFuZG9tIHJhbmQsIGludCBjb3VudCkKKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc291cmNlcyA9IG5ldyBCeXRlQ29tcGFyYWJsZVtjb3VudF07CisgICAgICAgIFRyZWVTZXQ8Qnl0ZUNvbXBhcmFibGU+IGFkZGVkID0gbmV3IFRyZWVTZXQ8PigoYnl0ZXMxLCBieXRlczIpIC0+IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnl0ZXMxLCBieXRlczIsIFZFUlNJT04pKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBzb3VyY2VzW2ldID0gZ2VuZXJhdGVLZXkocmFuZCk7CisgICAgICAgICAgICBpZiAoIWFkZGVkLmFkZChzb3VyY2VzW2ldKSkKKyAgICAgICAgICAgICAgICAtLWk7CisgICAgICAgIH0KKworICAgICAgICAvLyBub3RlOiBub3Qgc29ydGVkIQorICAgICAgICByZXR1cm4gc291cmNlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGUgZ2VuZXJhdGVLZXkoUmFuZG9tIHJhbmQpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJhdGVLZXkocmFuZCwgTUlOX0xFTkdUSCwgTUFYX0xFTkdUSCk7CisgICAgfQorCisgICAgc3RhdGljIEJ5dGVDb21wYXJhYmxlIGdlbmVyYXRlS2V5KFJhbmRvbSByYW5kLCBpbnQgbWluTGVuZ3RoLCBpbnQgbWF4TGVuZ3RoKQorICAgIHsKKyAgICAgICAgaW50IGxlbiA9IHJhbmQubmV4dEludChtYXhMZW5ndGggLSBtaW5MZW5ndGggKyAxKSArIG1pbkxlbmd0aDsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbGVuXTsKKyAgICAgICAgaW50IHAgPSAwOworICAgICAgICBpbnQgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOworICAgICAgICB3aGlsZSAocCA8IGxlbmd0aCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNlZWQgPSByYW5kLm5leHRJbnQoS0VZX0NIT0lDRSk7CisgICAgICAgICAgICBSYW5kb20gcjIgPSBuZXcgUmFuZG9tKHNlZWQpOworICAgICAgICAgICAgaW50IG0gPSByMi5uZXh0SW50KDUpICsgMiArIHA7CisgICAgICAgICAgICBpZiAobSA+IGxlbmd0aCkKKyAgICAgICAgICAgICAgICBtID0gbGVuZ3RoOworICAgICAgICAgICAgd2hpbGUgKHAgPCBtKQorICAgICAgICAgICAgICAgIGJ5dGVzW3ArK10gPSAoYnl0ZSkgcjIubmV4dEludCgyNTYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBCeXRlQ29tcGFyYWJsZS5maXhlZExlbmd0aChieXRlcyk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBhc1N0cmluZyhCeXRlQ29tcGFyYWJsZSBiYykKKyAgICB7CisgICAgICAgIHJldHVybiBiYyAhPSBudWxsID8gYmMuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSA6ICJudWxsIjsKKyAgICB9CisKKyAgICA8VCwgTT4gdm9pZCBwdXRTaW1wbGVSZXNvbHZlKEluTWVtb3J5VHJpZTxUPiB0cmllLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWUuTWVyZ2VSZXNvbHZlcjxUPiByZXNvbHZlcikKKyAgICB7CisgICAgICAgIHB1dFNpbXBsZVJlc29sdmUodHJpZSwga2V5LCB2YWx1ZSwgcmVzb2x2ZXIsIHVzZVB1dCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgPFQsIE0+IHZvaWQgcHV0U2ltcGxlUmVzb2x2ZShJbk1lbW9yeVRyaWU8VD4gdHJpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmllLk1lcmdlUmVzb2x2ZXI8VD4gcmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VQdXQpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdHJpZS5wdXRTaW5nbGV0b24oa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhpc3RpbmcsIHVwZGF0ZSkgLT4gZXhpc3RpbmcgIT0gbnVsbCA/IHJlc29sdmVyLnJlc29sdmUoZXhpc3RpbmcsIHVwZGF0ZSkgOiB1cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VQdXQpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbk1lbW9yeVRyaWUuU3BhY2VFeGhhdXN0ZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4sIHRlc3Qgc3RheXMgd2VsbCBiZWxvdyBzaXplIGxpbWl0LgorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZVRocmVhZGVkVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL0luTWVtb3J5VHJpZVRocmVhZGVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YjZlZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvSW5NZW1vcnlUcmllVGhyZWFkZWRUZXN0LmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQnVmZmVyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllcy5Jbk1lbW9yeVRyaWVUZXN0QmFzZS5WRVJTSU9OOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllcy5Jbk1lbW9yeVRyaWVUZXN0QmFzZS5nZW5lcmF0ZUtleXM7CisKK3B1YmxpYyBjbGFzcyBJbk1lbW9yeVRyaWVUaHJlYWRlZFRlc3QKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlQgPSAzMDAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9USEVSUyA9IENPVU5UIC8gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST0dSRVNTX1VQREFURSA9IENPVU5UIC8gMTU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURFUlMgPSA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUxLRVJTID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKKworICAgIHN0YXRpYyBTdHJpbmcgdmFsdWUoQnl0ZUNvbXBhcmFibGUgYikKKyAgICB7CisgICAgICAgIHJldHVybiBiLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyZWFkZWQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjID0gZ2VuZXJhdGVLZXlzKHJhbmQsIENPVU5UICsgT1RIRVJTKTsKKyAgICAgICAgSW5NZW1vcnlUcmllPFN0cmluZz4gdHJpZSA9IG5ldyBJbk1lbW9yeVRyaWU8PihCdWZmZXJUeXBlLk9OX0hFQVApOworICAgICAgICBDb25jdXJyZW50TGlua2VkUXVldWU8VGhyb3dhYmxlPiBlcnJvcnMgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlPD4oKTsKKyAgICAgICAgTGlzdDxUaHJlYWQ+IHRocmVhZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgQXRvbWljQm9vbGVhbiB3cml0ZUNvbXBsZXRlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgQXRvbWljSW50ZWdlciB3cml0ZVByb2dyZXNzID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBXQUxLRVJTOyArK2kpCisgICAgICAgICAgICB0aHJlYWRzLmFkZChuZXcgVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICghd3JpdGVDb21wbGV0ZWQuZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW4gPSB3cml0ZVByb2dyZXNzLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEJ5dGVDb21wYXJhYmxlLCBTdHJpbmc+IGVuIDogdHJpZS5lbnRyeVNldCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gdmFsdWUoZW4uZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZW4uZ2V0S2V5KCkuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSwgdiwgZW4uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJHb3Qgb25seSAiICsgY291bnQgKyAiIHdoaWxlIHByb2dyZXNzIGlzIGF0ICIgKyBtaW4sIGNvdW50ID49IG1pbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSRUFERVJTOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVhZHMuYWRkKG5ldyBUaHJlYWQoKCkgLT4geworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmFuZG9tIHIgPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICghd3JpdGVDb21wbGV0ZWQuZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW4gPSB3cml0ZVByb2dyZXNzLmdldCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpMSA9IDA7IGkxIDwgUFJPR1JFU1NfVVBEQVRFOyArK2kxKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHIubmV4dEludChDT1VOVCArIE9USEVSUyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgYiA9IHNyY1tpbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHYgPSB2YWx1ZShiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdHJpZS5nZXQoYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkdvdCBub3QgYWRkZWQgIiArIGluZGV4ICsgIiB3aGVuIENPVU5UIGlzICIgKyBDT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPCBDT1VOVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkZhaWxlZCAiICsgaW5kZXgsIHYsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGluZGV4IDwgbWluKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiRmFpbGVkIGluZGV4ICIgKyBpbmRleCArICIgd2hpbGUgcHJvZ3Jlc3MgaXMgYXQgIiArIG1pbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFkZCh0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisgICAgICAgIH0KKworICAgICAgICB0aHJlYWRzLmFkZChuZXcgVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ09VTlQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIGIgPSBzcmNbaV07CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogQmVjYXVzZSB3ZSBkb24ndCBlbnN1cmUgb3JkZXIgd2hlbiBjYWxsaW5nIHJlc29sdmUsIGp1c3QgdXNlIGEgaGFzaCBvZiB0aGUga2V5IGFzIHBheWxvYWQKKyAgICAgICAgICAgICAgICAgICAgLy8gKHNvIHRoYXQgYWxsIHNvdXJjZXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSkuCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gdmFsdWUoYik7CisgICAgICAgICAgICAgICAgICAgIGlmIChpICUgMiA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJpZS5hcHBseShUcmllLnNpbmdsZXRvbihiLCB2KSwgKHgsIHkpIC0+IHkpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB0cmllLnB1dFJlY3Vyc2l2ZShiLCB2LCAoeCwgeSkgLT4geSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgJSBQUk9HUkVTU19VUERBVEUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUHJvZ3Jlc3Muc2V0KGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIGVycm9ycy5hZGQodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbGx5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGVDb21wbGV0ZWQuc2V0KHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisKKyAgICAgICAgZm9yIChUaHJlYWQgdCA6IHRocmVhZHMpCisgICAgICAgICAgICB0LnN0YXJ0KCk7CisKKyAgICAgICAgZm9yIChUaHJlYWQgdCA6IHRocmVhZHMpCisgICAgICAgICAgICB0LmpvaW4oKTsKKworICAgICAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCisgICAgICAgICAgICBBc3NlcnQuZmFpbCgiR290IGVycm9yczpcbiIgKyBlcnJvcnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9NZXJnZVRyaWVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvTWVyZ2VUcmllVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMDg0MDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvTWVyZ2VUcmllVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllcy5Jbk1lbW9yeVRyaWVUZXN0QmFzZS4qOworCitwdWJsaWMgY2xhc3MgTWVyZ2VUcmllVGVzdAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT1VOVCA9IDE1MDAwOworICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0KCkKKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjMSA9IGdlbmVyYXRlS2V5cyhyYW5kLCBDT1VOVCk7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjMiA9IGdlbmVyYXRlS2V5cyhyYW5kLCBDT1VOVCk7CisgICAgICAgIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gY29udGVudDEgPSBuZXcgVHJlZU1hcDw+KChieXRlczEsIGJ5dGVzMikgLT4gQnl0ZUNvbXBhcmFibGUuY29tcGFyZShieXRlczEsIGJ5dGVzMiwgVkVSU0lPTikpOworICAgICAgICBTb3J0ZWRNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGNvbnRlbnQyID0gbmV3IFRyZWVNYXA8PigoYnl0ZXMxLCBieXRlczIpIC0+IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnl0ZXMxLCBieXRlczIsIFZFUlNJT04pKTsKKworICAgICAgICBJbk1lbW9yeVRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZTEgPSBtYWtlSW5NZW1vcnlUcmllKHNyYzEsIGNvbnRlbnQxLCB0cnVlKTsKKyAgICAgICAgSW5NZW1vcnlUcmllPEJ5dGVCdWZmZXI+IHRyaWUyID0gbWFrZUluTWVtb3J5VHJpZShzcmMyLCBjb250ZW50MiwgdHJ1ZSk7CisKKyAgICAgICAgY29udGVudDEucHV0QWxsKGNvbnRlbnQyKTsKKyAgICAgICAgVHJpZTxCeXRlQnVmZmVyPiB1bmlvbiA9IHRyaWUxLm1lcmdlV2l0aCh0cmllMiwgKHgsIHkpIC0+IHgpOworCisgICAgICAgIGFzc2VydFNhbWVDb250ZW50KHVuaW9uLCBjb250ZW50MSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aER1cGxpY2F0ZXMoKQorICAgIHsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGVbXSBzcmMxID0gZ2VuZXJhdGVLZXlzKHJhbmQsIENPVU5UKTsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGVbXSBzcmMyID0gZ2VuZXJhdGVLZXlzKHJhbmQsIENPVU5UKTsKKyAgICAgICAgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50MSA9IG5ldyBUcmVlTWFwPD4oKGJ5dGVzMSwgYnl0ZXMyKSAtPiBCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJ5dGVzMSwgYnl0ZXMyLCBWRVJTSU9OKSk7CisgICAgICAgIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gY29udGVudDIgPSBuZXcgVHJlZU1hcDw+KChieXRlczEsIGJ5dGVzMikgLT4gQnl0ZUNvbXBhcmFibGUuY29tcGFyZShieXRlczEsIGJ5dGVzMiwgVkVSU0lPTikpOworCisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiB0cmllMSA9IG1ha2VJbk1lbW9yeVRyaWUoc3JjMSwgY29udGVudDEsIHRydWUpOworICAgICAgICBJbk1lbW9yeVRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZTIgPSBtYWtlSW5NZW1vcnlUcmllKHNyYzIsIGNvbnRlbnQyLCB0cnVlKTsKKworICAgICAgICBhZGRUb0luTWVtb3J5VHJpZShnZW5lcmF0ZUtleXMobmV3IFJhbmRvbSg1KSwgQ09VTlQpLCBjb250ZW50MSwgdHJpZTEsIHRydWUpOworICAgICAgICBhZGRUb0luTWVtb3J5VHJpZShnZW5lcmF0ZUtleXMobmV3IFJhbmRvbSg1KSwgQ09VTlQpLCBjb250ZW50MiwgdHJpZTIsIHRydWUpOworCisgICAgICAgIGNvbnRlbnQxLnB1dEFsbChjb250ZW50Mik7CisgICAgICAgIFRyaWU8Qnl0ZUJ1ZmZlcj4gdW5pb24gPSB0cmllMS5tZXJnZVdpdGgodHJpZTIsICh4LCB5KSAtPiB5KTsKKworICAgICAgICBhc3NlcnRTYW1lQ29udGVudCh1bmlvbiwgY29udGVudDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc3RpbmN0KCkKKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjMSA9IGdlbmVyYXRlS2V5cyhyYW5kLCBDT1VOVCk7CisgICAgICAgIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gY29udGVudDEgPSBuZXcgVHJlZU1hcDw+KChieXRlczEsIGJ5dGVzMikgLT4gQnl0ZUNvbXBhcmFibGUuY29tcGFyZShieXRlczEsIGJ5dGVzMiwgVkVSU0lPTikpOworICAgICAgICBJbk1lbW9yeVRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZTEgPSBtYWtlSW5NZW1vcnlUcmllKHNyYzEsIGNvbnRlbnQxLCB0cnVlKTsKKworICAgICAgICBCeXRlQ29tcGFyYWJsZVtdIHNyYzIgPSBnZW5lcmF0ZUtleXMocmFuZCwgQ09VTlQpOworICAgICAgICBzcmMyID0gcmVtb3ZlRHVwbGljYXRlcyhzcmMyLCBjb250ZW50MSk7CisgICAgICAgIFNvcnRlZE1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gY29udGVudDIgPSBuZXcgVHJlZU1hcDw+KChieXRlczEsIGJ5dGVzMikgLT4gQnl0ZUNvbXBhcmFibGUuY29tcGFyZShieXRlczEsIGJ5dGVzMiwgVkVSU0lPTikpOworICAgICAgICBJbk1lbW9yeVRyaWU8Qnl0ZUJ1ZmZlcj4gdHJpZTIgPSBtYWtlSW5NZW1vcnlUcmllKHNyYzIsIGNvbnRlbnQyLCB0cnVlKTsKKworICAgICAgICBjb250ZW50MS5wdXRBbGwoY29udGVudDIpOworICAgICAgICBUcmllPEJ5dGVCdWZmZXI+IHVuaW9uID0gbmV3IE1lcmdlVHJpZS5EaXN0aW5jdDw+KHRyaWUxLCB0cmllMik7CisKKyAgICAgICAgYXNzZXJ0U2FtZUNvbnRlbnQodW5pb24sIGNvbnRlbnQxKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZUNvbXBhcmFibGVbXSByZW1vdmVEdXBsaWNhdGVzKEJ5dGVDb21wYXJhYmxlW10ga2V5cywgU29ydGVkTWFwPEJ5dGVDb21wYXJhYmxlLCBCeXRlQnVmZmVyPiBjb250ZW50MSkKKyAgICB7CisgICAgICAgIHJldHVybiBBcnJheXMuc3RyZWFtKGtleXMpCisgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGtleSAtPiAhY29udGVudDEuY29udGFpbnNLZXkoa2V5KSkKKyAgICAgICAgICAgICAgICAgICAgIC50b0FycmF5KEJ5dGVDb21wYXJhYmxlW106Om5ldyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1NsaWNlZFRyaWVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvU2xpY2VkVHJpZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2JhZTBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1NsaWNlZFRyaWVUZXN0LmphdmEKQEAgLTAsMCArMSw1MjcgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk5hdmlnYWJsZU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY29tLmdvb2dsZWNvZGUuY29uY3VycmVudHRyZWVzLmNvbW1vbi5JdGVyYWJsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXMuSW5NZW1vcnlUcmllVGVzdEJhc2UuYXNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzLkluTWVtb3J5VHJpZVRlc3RCYXNlLmFzc2VydFNhbWVDb250ZW50OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllcy5Jbk1lbW9yeVRyaWVUZXN0QmFzZS5nZW5lcmF0ZUtleXM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzLkluTWVtb3J5VHJpZVRlc3RCYXNlLm1ha2VJbk1lbW9yeVRyaWU7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFNsaWNlZFRyaWVUZXN0Cit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBCeXRlQ29tcGFyYWJsZVtdIEJPVU5EQVJJRVMgPSB0b0J5dGVDb21wYXJhYmxlKG5ldyBTdHJpbmdbXXsKKyAgICAidGVzdDEiLAorICAgICJ0ZXN0MTEiLAorICAgICJ0ZXN0MTIiLAorICAgICJ0ZXN0MTMiLAorICAgICJ0ZXN0MiIsCisgICAgInRlc3QyMSIsCisgICAgInRlIiwKKyAgICAicyIsCisgICAgInEiLAorICAgICJcMDAwIiwKKyAgICAiXDc3NyIsCisgICAgIlw3NzdcMDAwIiwKKyAgICAiXDAwMFw3NzciLAorICAgICJcMDAwXDAwMCIsCisgICAgIlwwMDBcMDAwXDAwMCIsCisgICAgIlwwMDBcMDAwXDc3NyIsCisgICAgIlw3NzdcNzc3IgorICAgIH0pOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQnl0ZUNvbXBhcmFibGVbXSBLRVlTID0gdG9CeXRlQ29tcGFyYWJsZShuZXcgU3RyaW5nW117CisgICAgInRlc3QxIiwKKyAgICAidGVzdDIiLAorICAgICJ0ZXN0NTUiLAorICAgICJ0ZXN0MTIzIiwKKyAgICAidGVzdDEyNCIsCisgICAgInRlc3QxMiIsCisgICAgInRlc3QyMSIsCisgICAgInRlYXNlIiwKKyAgICAic29ydCIsCisgICAgInNvcnRpbmciLAorICAgICJzcXVhcmUiLAorICAgICJcNzc3XDAwMCIsCisgICAgIlwwMDBcNzc3IiwKKyAgICAiXDAwMFwwMDAiLAorICAgICJcMDAwXDAwMFwwMDAiLAorICAgICJcMDAwXDAwMFw3NzciLAorICAgICJcNzc3XDc3NyIKKyAgICB9KTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8Qnl0ZUNvbXBhcmFibGU+IEJZVEVfQ09NUEFSQUJMRV9DT01QQVJBVE9SID0gKGJ5dGVzMSwgYnl0ZXMyKSAtPiBCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJ5dGVzMSwgYnl0ZXMyLCBUcmllLkJZVEVfQ09NUEFSQUJMRV9WRVJTSU9OKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09VTlQgPSAxNTAwMDsKKyAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVyc2VjdFJhbmdlRGlyZWN0KCkKKyAgICB7CisgICAgICAgIHRlc3RJbnRlcnNlY3RSYW5nZShDT1VOVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEludGVyc2VjdFJhbmdlKGludCBjb3VudCkKKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlW10gc3JjMSA9IGdlbmVyYXRlS2V5cyhyYW5kLCBjb3VudCk7CisgICAgICAgIE5hdmlnYWJsZU1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gY29udGVudDEgPSBuZXcgVHJlZU1hcDw+KChieXRlczEsIGJ5dGVzMikgLT4gQnl0ZUNvbXBhcmFibGUuY29tcGFyZShieXRlczEsIGJ5dGVzMiwgVHJpZS5CWVRFX0NPTVBBUkFCTEVfVkVSU0lPTikpOworCisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiB0cmllMSA9IG1ha2VJbk1lbW9yeVRyaWUoc3JjMSwgY29udGVudDEsIHRydWUpOworCisgICAgICAgIGNoZWNrRXF1YWxSYW5nZShjb250ZW50MSwgdHJpZTEsIG51bGwsIHRydWUsIG51bGwsIHRydWUpOworICAgICAgICBjaGVja0VxdWFsUmFuZ2UoY29udGVudDEsIHRyaWUxLCBJbk1lbW9yeVRyaWVUZXN0QmFzZS5nZW5lcmF0ZUtleShyYW5kKSwgdHJ1ZSwgbnVsbCwgdHJ1ZSk7CisgICAgICAgIGNoZWNrRXF1YWxSYW5nZShjb250ZW50MSwgdHJpZTEsIG51bGwsIHRydWUsIEluTWVtb3J5VHJpZVRlc3RCYXNlLmdlbmVyYXRlS2V5KHJhbmQpLCB0cnVlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIGwgPSByYW5kLm5leHRCb29sZWFuKCkgPyBJbk1lbW9yeVRyaWVUZXN0QmFzZS5nZW5lcmF0ZUtleShyYW5kKSA6IHNyYzFbcmFuZC5uZXh0SW50KHNyYzEubGVuZ3RoKV07CisgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSByID0gcmFuZC5uZXh0Qm9vbGVhbigpID8gSW5NZW1vcnlUcmllVGVzdEJhc2UuZ2VuZXJhdGVLZXkocmFuZCkgOiBzcmMxW3JhbmQubmV4dEludChzcmMxLmxlbmd0aCldOworICAgICAgICAgICAgaW50IGNtcCA9IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUobCwgciwgVHJpZS5CWVRFX0NPTVBBUkFCTEVfVkVSU0lPTik7CisgICAgICAgICAgICBpZiAoY21wID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSB0ID0gbDsKKyAgICAgICAgICAgICAgICBsID0gcjsKKyAgICAgICAgICAgICAgICByID0gdDsgLy8gc3dhcAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVMZWZ0ID0gKGkgJiAxKSAhPSAwIHx8IGNtcCA9PSAwOworICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlUmlnaHQgPSAoaSAmIDIpICE9IDAgfHwgY21wID09IDA7CisgICAgICAgICAgICBjaGVja0VxdWFsUmFuZ2UoY29udGVudDEsIHRyaWUxLCBsLCBpbmNsdWRlTGVmdCwgciwgaW5jbHVkZVJpZ2h0KTsKKyAgICAgICAgICAgIGNoZWNrRXF1YWxSYW5nZShjb250ZW50MSwgdHJpZTEsIG51bGwsIGluY2x1ZGVMZWZ0LCByLCBpbmNsdWRlUmlnaHQpOworICAgICAgICAgICAgY2hlY2tFcXVhbFJhbmdlKGNvbnRlbnQxLCB0cmllMSwgbCwgaW5jbHVkZUxlZnQsIG51bGwsIGluY2x1ZGVSaWdodCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQ29tcGFyYWJsZVtdIHRvQnl0ZUNvbXBhcmFibGUoU3RyaW5nW10ga2V5cykKKyAgICB7CisgICAgICAgIHJldHVybiBBcnJheXMuc3RyZWFtKGtleXMpCisgICAgICAgICAgICAgICAgICAgICAubWFwKHggLT4gQnl0ZUNvbXBhcmFibGUuZml4ZWRMZW5ndGgoeC5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSkpCisgICAgICAgICAgICAgICAgICAgICAudG9BcnJheShCeXRlQ29tcGFyYWJsZVtdOjpuZXcpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvblN1YnRyaWUoKQorICAgIHsKKyAgICAgICAgQXJyYXlzLnNvcnQoQk9VTkRBUklFUywgKGEsIGIpIC0+IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYSwgYiwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCkpOworICAgICAgICBmb3IgKGludCBsaSA9IC0xOyBsaSA8IEJPVU5EQVJJRVMubGVuZ3RoOyArK2xpKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSBsID0gbGkgPCAwID8gbnVsbCA6IEJPVU5EQVJJRVNbbGldOworICAgICAgICAgICAgZm9yIChpbnQgcmkgPSBNYXRoLm1heCgwLCBsaSk7IHJpIDw9IEJPVU5EQVJJRVMubGVuZ3RoOyArK3JpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIHIgPSByaSA9PSBCT1VOREFSSUVTLmxlbmd0aCA/IG51bGwgOiBCT1VOREFSSUVTW3JpXTsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBsaSA9PSByaSA/IDMgOiAwOyBpIDwgNDsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlTGVmdCA9IChpICYgMSkgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlUmlnaHQgPSAoaSAmIDIpICE9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChCeXRlQ29tcGFyYWJsZSBrZXkgOiBLRVlTKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY21wMSA9IGwgIT0gbnVsbCA/IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoa2V5LCBsLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKSA6IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY21wMiA9IHIgIT0gbnVsbCA/IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUociwga2V5LCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKSA6IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBUcmllPEJvb2xlYW4+IGl4ID0gbmV3IFNsaWNlZFRyaWU8PihUcmllLnNpbmdsZXRvbihrZXksIHRydWUpLCBsLCBpbmNsdWRlTGVmdCwgciwgaW5jbHVkZVJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNtcDEgPCAwIHx8IGNtcDEgPT0gMCAmJiAhaW5jbHVkZUxlZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbXAyIDwgMCB8fCBjbXAyID09IDAgJiYgIWluY2x1ZGVSaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhY3R1YWwgPSBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlcy5nZXRGaXJzdChpeC52YWx1ZXMoKSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkICE9IGFjdHVhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkludGVyc2VjdGlvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihpeC5kdW1wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKFN0cmluZy5mb3JtYXQoIkZhaWxlZCBvbiByYW5nZSAlcyVzLCVzJXMga2V5ICVzIGV4cGVjdGVkICVzIGdvdCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVMZWZ0ID8gIlsiIDogIigiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCAhPSBudWxsID8gbC5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uT1NTNTApIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgIT0gbnVsbCA/IHIuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlUmlnaHQgPyAiXSIgOiAiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZW10YWJsZVN1YnRyaWUoKQorICAgIHsKKyAgICAgICAgQXJyYXlzLnNvcnQoQk9VTkRBUklFUywgQllURV9DT01QQVJBQkxFX0NPTVBBUkFUT1IpOworICAgICAgICBOYXZpZ2FibGVNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGNvbnRlbnQxID0gbmV3IFRyZWVNYXA8PihCWVRFX0NPTVBBUkFCTEVfQ09NUEFSQVRPUik7CisgICAgICAgIEluTWVtb3J5VHJpZTxCeXRlQnVmZmVyPiB0cmllMSA9IG1ha2VJbk1lbW9yeVRyaWUoS0VZUywgY29udGVudDEsIHRydWUpOworCisgICAgICAgIGZvciAoaW50IGxpID0gLTE7IGxpIDwgQk9VTkRBUklFUy5sZW5ndGg7ICsrbGkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIGwgPSBsaSA8IDAgPyBudWxsIDogQk9VTkRBUklFU1tsaV07CisgICAgICAgICAgICBmb3IgKGludCByaSA9IE1hdGgubWF4KDAsIGxpKTsgcmkgPD0gQk9VTkRBUklFUy5sZW5ndGg7ICsrcmkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgciA9IHJpID09IEJPVU5EQVJJRVMubGVuZ3RoID8gbnVsbCA6IEJPVU5EQVJJRVNbcmldOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlTGVmdCA9IChpICYgMSkgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpbmNsdWRlUmlnaHQgPSAoaSAmIDIpICE9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmICgoIWluY2x1ZGVMZWZ0IHx8ICFpbmNsdWRlUmlnaHQpICYmIGxpID09IHJpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrRXF1YWxSYW5nZShjb250ZW50MSwgdHJpZTEsIGwsIGluY2x1ZGVMZWZ0LCByLCBpbmNsdWRlUmlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lcmdlU3VidHJpZSgpCisgICAgeworICAgICAgICB0ZXN0TWVyZ2VTdWJ0cmllKDIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25NZXJnZVN1YnRyaWUzKCkKKyAgICB7CisgICAgICAgIHRlc3RNZXJnZVN1YnRyaWUoMyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbk1lcmdlU3VidHJpZTUoKQorICAgIHsKKyAgICAgICAgdGVzdE1lcmdlU3VidHJpZSg1KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VTdWJ0cmllKGludCBtZXJnZUNvdW50KQorICAgIHsKKyAgICAgICAgQXJyYXlzLnNvcnQoQk9VTkRBUklFUywgQllURV9DT01QQVJBQkxFX0NPTVBBUkFUT1IpOworICAgICAgICBOYXZpZ2FibGVNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGNvbnRlbnQxID0gbmV3IFRyZWVNYXA8PihCWVRFX0NPTVBBUkFCTEVfQ09NUEFSQVRPUik7CisgICAgICAgIExpc3Q8VHJpZTxCeXRlQnVmZmVyPj4gdHJpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXJnZUNvdW50OyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyaWVzLmFkZChtYWtlSW5NZW1vcnlUcmllKEFycmF5cy5jb3B5T2ZSYW5nZShLRVlTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTLmxlbmd0aCAqIGkgLyBtZXJnZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlTLmxlbmd0aCAqIChpICsgMSkgLyBtZXJnZUNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSk7CisgICAgICAgIH0KKyAgICAgICAgVHJpZTxCeXRlQnVmZmVyPiB0cmllMSA9IFRyaWUubWVyZ2VEaXN0aW5jdCh0cmllcyk7CisKKyAgICAgICAgZm9yIChpbnQgbGkgPSAtMTsgbGkgPCBCT1VOREFSSUVTLmxlbmd0aDsgKytsaSkKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgbCA9IGxpIDwgMCA/IG51bGwgOiBCT1VOREFSSUVTW2xpXTsKKyAgICAgICAgICAgIGZvciAoaW50IHJpID0gTWF0aC5tYXgoMCwgbGkpOyByaSA8PSBCT1VOREFSSUVTLmxlbmd0aDsgKytyaSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSByID0gcmkgPT0gQk9VTkRBUklFUy5sZW5ndGggPyBudWxsIDogQk9VTkRBUklFU1tyaV07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVMZWZ0ID0gKGkgJiAxKSAhPSAwOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGluY2x1ZGVSaWdodCA9IChpICYgMikgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCghaW5jbHVkZUxlZnQgfHwgIWluY2x1ZGVSaWdodCkgJiYgbGkgPT0gcmkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tFcXVhbFJhbmdlKGNvbnRlbnQxLCB0cmllMSwgbCwgaW5jbHVkZUxlZnQsIHIsIGluY2x1ZGVSaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hlY2tFcXVhbFJhbmdlKE5hdmlnYWJsZU1hcDxCeXRlQ29tcGFyYWJsZSwgQnl0ZUJ1ZmZlcj4gY29udGVudDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyaWU8Qnl0ZUJ1ZmZlcj4gdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZUxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5jbHVkZVJpZ2h0KQorICAgIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIkludGVyc2VjdGlvbiB3aXRoICVzJXM6JXMlcyIsIGluY2x1ZGVMZWZ0ID8gIlsiIDogIigiLCBhc1N0cmluZyhsKSwgYXNTdHJpbmcociksIGluY2x1ZGVSaWdodCA/ICJdIiA6ICIpIikpOworICAgICAgICBTb3J0ZWRNYXA8Qnl0ZUNvbXBhcmFibGUsIEJ5dGVCdWZmZXI+IGltYXAgPSBsID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbnRlbnQxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb250ZW50MS5oZWFkTWFwKHIsIGluY2x1ZGVSaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbnRlbnQxLnRhaWxNYXAobCwgaW5jbHVkZUxlZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb250ZW50MS5zdWJNYXAobCwgaW5jbHVkZUxlZnQsIHIsIGluY2x1ZGVSaWdodCk7CisKKyAgICAgICAgVHJpZTxCeXRlQnVmZmVyPiBpbnRlcnNlY3Rpb24gPSB0MS5zdWJ0cmllKGwsIGluY2x1ZGVMZWZ0LCByLCBpbmNsdWRlUmlnaHQpOworICAgICAgICBhc3NlcnRTYW1lQ29udGVudChpbnRlcnNlY3Rpb24sIGltYXApOworCisgICAgICAgIGlmIChsID09IG51bGwgfHwgciA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIC8vIFRlc3QgaW50ZXJzZWN0aW5nIGludGVyc2VjdGlvbi4KKyAgICAgICAgaW50ZXJzZWN0aW9uID0gdDEuc3VidHJpZShsLCBpbmNsdWRlTGVmdCwgbnVsbCwgZmFsc2UpLnN1YnRyaWUobnVsbCwgZmFsc2UsIHIsIGluY2x1ZGVSaWdodCk7CisgICAgICAgIGFzc2VydFNhbWVDb250ZW50KGludGVyc2VjdGlvbiwgaW1hcCk7CisKKyAgICAgICAgaW50ZXJzZWN0aW9uID0gdDEuc3VidHJpZShudWxsLCBmYWxzZSwgciwgaW5jbHVkZVJpZ2h0KS5zdWJ0cmllKGwsIGluY2x1ZGVMZWZ0LCBudWxsLCBmYWxzZSk7CisgICAgICAgIGFzc2VydFNhbWVDb250ZW50KGludGVyc2VjdGlvbiwgaW1hcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCB0aGUgdmFsdWVzIG9mIHRoZSBwcm92aWRlIHRyaWUgaW50byBhIGxpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IExpc3Q8VD4gdG9MaXN0KFRyaWU8VD4gdHJpZSkKKyAgICB7CisgICAgICAgIHJldHVybiBJdGVyYWJsZXMudG9MaXN0KHRyaWUudmFsdWVzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzaW1wbGUgdHJpZSB3aXRoIGEgcm9vdCBoYXZpbmcgdGhlIHByb3ZpZGVkIG51bWJlciBvZiBjaGlsZHMsIHdoZXJlIGVhY2ggY2hpbGQgaXMgYSBsZWFmIHdob3NlIGNvbnRlbnQKKyAgICAgKiBpcyBzaW1wbHkgdGhlIHZhbHVlIG9mIHRoZSB0cmFuc2l0aW9uIGxlYWRpbmcgdG8gaXQuCisgICAgICoKKyAgICAgKiBJbiBvdGhlciB3b3Jkcywge0Bjb2RlIHNpbmdsZUxldmVsSW50VHJpZSg0KX0gY3JlYXRlcyB0aGUgZm9sbG93aW5nIHRyaWU6CisgICAgICogICAgICAgUm9vdAorICAgICAqIHQ9IDAgIDEgIDIgIDMKKyAgICAgKiAgICB8ICB8ICB8ICB8CisgICAgICogICAgMCAgMSAgMiAgMworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFRyaWU8SW50ZWdlcj4gc2luZ2xlTGV2ZWxJbnRUcmllKGludCBjaGlsZHMpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRyaWU8SW50ZWdlcj4oKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBDdXJzb3I8SW50ZWdlcj4gY3Vyc29yKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHNpbmdsZUxldmVsQ3Vyc29yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsYXNzIHNpbmdsZUxldmVsQ3Vyc29yIGltcGxlbWVudHMgQ3Vyc29yPEludGVnZXI+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGN1cnJlbnQgPSAtMTsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICArK2N1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXB0aCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgc2tpcENoaWxkcmVuKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZHZhbmNlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBkZXB0aCgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCA8IGNoaWxkcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBpbmNvbWluZ1RyYW5zaXRpb24oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIEludGVnZXIgY29udGVudCgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqIENyZWF0ZXMgYSBzaW5nbGUgYnl0ZSB7QGxpbmsgQnl0ZUNvbXBhcmFibGV9IHdpdGggdGhlIHByb3ZpZGUgdmFsdWUgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQ29tcGFyYWJsZSBvZihpbnQgdmFsdWUpCisgICAgeworICAgICAgICBhc3NlcnQgdmFsdWUgPj0gMCAmJiB2YWx1ZSA8PSBCeXRlLk1BWF9WQUxVRTsKKyAgICAgICAgcmV0dXJuIEJ5dGVDb21wYXJhYmxlLmZpeGVkTGVuZ3RoKG5ldyBieXRlW117IChieXRlKXZhbHVlIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUludGVyc2VjdGlvbklJKCkKKyAgICB7CisgICAgICAgIFRyaWU8SW50ZWdlcj4gdHJpZSA9IHNpbmdsZUxldmVsSW50VHJpZSgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpLCB0b0xpc3QodHJpZSkpOworCisgICAgICAgIFRyaWU8SW50ZWdlcj4gaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKG9mKDMpLCB0cnVlLCBvZig3KSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMywgNCwgNSwgNiwgNyksIHRvTGlzdChpbnRlcnNlY3Rpb24pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVJbnRlcnNlY3Rpb25FSSgpCisgICAgeworICAgICAgICBUcmllPEludGVnZXI+IHRyaWUgPSBzaW5nbGVMZXZlbEludFRyaWUoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KSwgdG9MaXN0KHRyaWUpKTsKKworICAgICAgICBUcmllPEludGVnZXI+IGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShvZigzKSwgZmFsc2UsIG9mKDcpLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCg0LCA1LCA2LCA3KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUludGVyc2VjdGlvbklFKCkKKyAgICB7CisgICAgICAgIFRyaWU8SW50ZWdlcj4gdHJpZSA9IHNpbmdsZUxldmVsSW50VHJpZSgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpLCB0b0xpc3QodHJpZSkpOworCisgICAgICAgIFRyaWU8SW50ZWdlcj4gaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKG9mKDMpLCB0cnVlLCBvZig3KSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KDMsIDQsIDUsIDYpLCB0b0xpc3QoaW50ZXJzZWN0aW9uKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlSW50ZXJzZWN0aW9uRUUoKQorICAgIHsKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiB0cmllID0gc2luZ2xlTGV2ZWxJbnRUcmllKDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSksIHRvTGlzdCh0cmllKSk7CisKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUob2YoMyksIGZhbHNlLCBvZig3KSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KDQsIDUsIDYpLCB0b0xpc3QoaW50ZXJzZWN0aW9uKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlTGVmdEludGVyc2VjdGlvbkUoKQorICAgIHsKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiB0cmllID0gc2luZ2xlTGV2ZWxJbnRUcmllKDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSksIHRvTGlzdCh0cmllKSk7CisKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUob2YoMyksIGZhbHNlLCBudWxsLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCg0LCA1LCA2LCA3LCA4LCA5KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUxlZnRJbnRlcnNlY3Rpb25JKCkKKyAgICB7CisgICAgICAgIFRyaWU8SW50ZWdlcj4gdHJpZSA9IHNpbmdsZUxldmVsSW50VHJpZSgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpLCB0b0xpc3QodHJpZSkpOworCisgICAgICAgIFRyaWU8SW50ZWdlcj4gaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKG9mKDMpLCB0cnVlLCBudWxsLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgzLCA0LCA1LCA2LCA3LCA4LCA5KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVJpZ2h0SW50ZXJzZWN0aW9uRSgpCisgICAgeworICAgICAgICBUcmllPEludGVnZXI+IHRyaWUgPSBzaW5nbGVMZXZlbEludFRyaWUoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KSwgdG9MaXN0KHRyaWUpKTsKKworICAgICAgICBUcmllPEludGVnZXI+IGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShudWxsLCB0cnVlLCBvZig3KSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVJpZ2h0SW50ZXJzZWN0aW9uSSgpCisgICAgeworICAgICAgICBUcmllPEludGVnZXI+IHRyaWUgPSBzaW5nbGVMZXZlbEludFRyaWUoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KSwgdG9MaXN0KHRyaWUpKTsKKworICAgICAgICBUcmllPEludGVnZXI+IGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShudWxsLCB0cnVlLCBvZig3KSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcpLCB0b0xpc3QoaW50ZXJzZWN0aW9uKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlTm9JbnRlcnNlY3Rpb24oKQorICAgIHsKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiB0cmllID0gc2luZ2xlTGV2ZWxJbnRUcmllKDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSksIHRvTGlzdCh0cmllKSk7CisKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUobnVsbCwgdHJ1ZSwgbnVsbCwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpLCB0b0xpc3QoaW50ZXJzZWN0aW9uKSk7CisKKyAgICAgICAgLy8gVGhlIHR3byBib29sZWFuIGZsYWdzIGRvbid0IGhhdmUgYSBtZWFuaW5nIHdoZW4gdGhlIGJvdW5kIGRvZXMgbm90IGV4aXN0LiBGb3IgY29tcGxldGVuZXNzLCBhbHNvIHRlc3QKKyAgICAgICAgLy8gd2l0aCB0aGVtIHNldCB0byBmYWxzZS4KKyAgICAgICAgaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKG51bGwsIGZhbHNlLCBudWxsLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpLCB0b0xpc3QoaW50ZXJzZWN0aW9uKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlRW1wdHlJbnRlcnNlY3Rpb25MZWZ0KCkKKyAgICB7CisgICAgICAgIFRyaWU8SW50ZWdlcj4gdHJpZSA9IHNpbmdsZUxldmVsSW50VHJpZSgxMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEsIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpLCB0b0xpc3QodHJpZSkpOworCisgICAgICAgIFRyaWU8SW50ZWdlcj4gaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKEJ5dGVDb21wYXJhYmxlLkVNUFRZLCB0cnVlLCBudWxsLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgtMSwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSksIHRvTGlzdChpbnRlcnNlY3Rpb24pKTsKKworICAgICAgICBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUoQnl0ZUNvbXBhcmFibGUuRU1QVFksIGZhbHNlLCBudWxsLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworCisgICAgICAgIGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShCeXRlQ29tcGFyYWJsZS5FTVBUWSwgdHJ1ZSwgb2YoNSksIHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KC0xLCAwLCAxLCAyLCAzLCA0LCA1KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworCisgICAgICAgIGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShCeXRlQ29tcGFyYWJsZS5FTVBUWSwgZmFsc2UsIG9mKDUpLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgwLCAxLCAyLCAzLCA0LCA1KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlRW1wdHlJbnRlcnNlY3Rpb25SaWdodCgpCisgICAgeworICAgICAgICBUcmllPEludGVnZXI+IHRyaWUgPSBzaW5nbGVMZXZlbEludFRyaWUoMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KC0xLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5KSwgdG9MaXN0KHRyaWUpKTsKKworICAgICAgICBUcmllPEludGVnZXI+IGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShudWxsLCB0cnVlLCBCeXRlQ29tcGFyYWJsZS5FTVBUWSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoLTEpLCB0b0xpc3QoaW50ZXJzZWN0aW9uKSk7CisKKyAgICAgICAgaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKG51bGwsIHRydWUsIEJ5dGVDb21wYXJhYmxlLkVNUFRZLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoKSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworCisgICAgICAgIGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShCeXRlQ29tcGFyYWJsZS5FTVBUWSwgdHJ1ZSwgQnl0ZUNvbXBhcmFibGUuRU1QVFksIHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KC0xKSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworCisgICAgICAgIGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShCeXRlQ29tcGFyYWJsZS5FTVBUWSwgZmFsc2UsIEJ5dGVDb21wYXJhYmxlLkVNUFRZLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgpLCB0b0xpc3QoaW50ZXJzZWN0aW9uKSk7CisKKyAgICAgICAgaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKEJ5dGVDb21wYXJhYmxlLkVNUFRZLCB0cnVlLCBCeXRlQ29tcGFyYWJsZS5FTVBUWSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KCksIHRvTGlzdChpbnRlcnNlY3Rpb24pKTsKKworICAgICAgICAvLyAoZW1wdHksIGVtcHR5KSBpcyBhbiBpbnZhbGlkIGNhbGwgYXMgdGhlICIoZW1wdHkiIGlzIGdyZWF0ZXIgdGhhbiAiZW1wdHkpIgorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YnRyaWVPblN1YnRyaWUoKQorICAgIHsKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiB0cmllID0gc2luZ2xlTGV2ZWxJbnRUcmllKDE1KTsKKworICAgICAgICAvLyBub24tb3ZlcmxhcHBpbmcKKyAgICAgICAgVHJpZTxJbnRlZ2VyPiBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUob2YoMCksIG9mKDQpKS5zdWJ0cmllKG9mKDQpLCBvZig4KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoKSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworICAgICAgICAvLyB0b3VjaGluZworICAgICAgICBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUob2YoMCksIHRydWUsIG9mKDMpLCB0cnVlKS5zdWJ0cmllKG9mKDMpLCBvZig4KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMyksIHRvTGlzdChpbnRlcnNlY3Rpb24pKTsKKyAgICAgICAgLy8gb3ZlcmxhcHBpbmcgMQorICAgICAgICBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUob2YoMCksIG9mKDQpKS5zdWJ0cmllKG9mKDIpLCBvZig4KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMiwgMyksIHRvTGlzdChpbnRlcnNlY3Rpb24pKTsKKyAgICAgICAgLy8gb3ZlcmxhcHBpbmcgMgorICAgICAgICBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUob2YoMCksIG9mKDQpKS5zdWJ0cmllKG9mKDEpLCBvZig4KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMSwgMiwgMyksIHRvTGlzdChpbnRlcnNlY3Rpb24pKTsKKyAgICAgICAgLy8gY292ZXJlZAorICAgICAgICBpbnRlcnNlY3Rpb24gPSB0cmllLnN1YnRyaWUob2YoMCksIG9mKDQpKS5zdWJ0cmllKG9mKDApLCBvZig4KSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMCwgMSwgMiwgMyksIHRvTGlzdChpbnRlcnNlY3Rpb24pKTsKKyAgICAgICAgLy8gY292ZXJlZCAyCisgICAgICAgIGludGVyc2VjdGlvbiA9IHRyaWUuc3VidHJpZShvZig0KSwgdHJ1ZSwgb2YoOCksIHRydWUpLnN1YnRyaWUob2YoMCksIG9mKDgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCg0LCA1LCA2LCA3KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworICAgICAgICAvLyBjb3ZlcmVkIDMKKyAgICAgICAgaW50ZXJzZWN0aW9uID0gdHJpZS5zdWJ0cmllKG9mKDEpLCBmYWxzZSwgb2YoNCksIHRydWUpLnN1YnRyaWUob2YoMCksIG9mKDgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgyLCAzLCA0KSwgdG9MaXN0KGludGVyc2VjdGlvbikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllVG9Eb3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllVG9Eb3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDQ3YzBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVUb0RvdC5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IG9yZy5hZ3JvbmEuRGlyZWN0QnVmZmVyOworCisvKioKKyAqIEEgY2xhc3MgZm9yIGR1bXBpbmcgdGhlIHN0cnVjdHVyZSBvZiBhIHRyaWUgdG8gYSBncmFwaHZpei9kb3QgcmVwcmVzZW50YXRpb24gZm9yIG1ha2luZyB0cmllIGdyYXBocy4KKyAqLworY2xhc3MgVHJpZVRvRG90PFQ+IGV4dGVuZHMgVHJpZVBhdGhSZWNvbnN0cnVjdG9yIGltcGxlbWVudHMgVHJpZS5XYWxrZXI8VCwgU3RyaW5nPgoreworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBiOworICAgIHByaXZhdGUgZmluYWwgRnVuY3Rpb248VCwgU3RyaW5nPiBjb250ZW50VG9TdHJpbmc7CisgICAgcHJpdmF0ZSBmaW5hbCBGdW5jdGlvbjxJbnRlZ2VyLCBTdHJpbmc+IHRyYW5zaXRpb25Ub1N0cmluZzsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdXNlTXVsdGlCeXRlOworICAgIHByaXZhdGUgaW50IHByZXZQb3M7CisgICAgcHJpdmF0ZSBpbnQgY3Vyck5vZGVUZXh0UG9zOworCisgICAgcHVibGljIFRyaWVUb0RvdChGdW5jdGlvbjxULCBTdHJpbmc+IGNvbnRlbnRUb1N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uPEludGVnZXIsIFN0cmluZz4gdHJhbnNpdGlvblRvU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VNdWx0aUJ5dGUpCisgICAgeworICAgICAgICB0aGlzLmNvbnRlbnRUb1N0cmluZyA9IGNvbnRlbnRUb1N0cmluZzsKKyAgICAgICAgdGhpcy50cmFuc2l0aW9uVG9TdHJpbmcgPSB0cmFuc2l0aW9uVG9TdHJpbmc7CisgICAgICAgIHRoaXMudXNlTXVsdGlCeXRlID0gdXNlTXVsdGlCeXRlOworICAgICAgICB0aGlzLmIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBiLmFwcGVuZCgiZGlncmFwaCBHIHtcbiIgKworICAgICAgICAgICAgICAgICAiICBzcGxpbmVzPWN1cnZlZCIpOworICAgICAgICBhZGROb2RlRGVmaW5pdGlvbihub2RlU3RyaW5nKDApKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldFBhdGhMZW5ndGgoaW50IG5ld0xlbmd0aCkKKyAgICB7CisgICAgICAgIHN1cGVyLnJlc2V0UGF0aExlbmd0aChuZXdMZW5ndGgpOworICAgICAgICBwcmV2UG9zID0gbmV3TGVuZ3RoOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBuZXdMaW5lQW5kSW5kZW50KCkKKyAgICB7CisgICAgICAgIGIuYXBwZW5kKCdcbicpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByZXZQb3MgKyAxOyArK2kpCisgICAgICAgICAgICBiLmFwcGVuZCgiICAiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRQYXRoQnl0ZShpbnQgbmV4dEJ5dGUpCisgICAgeworICAgICAgICBuZXdMaW5lQW5kSW5kZW50KCk7CisgICAgICAgIHN1cGVyLmFkZFBhdGhCeXRlKG5leHRCeXRlKTsKKyAgICAgICAgYi5hcHBlbmQobm9kZVN0cmluZyhwcmV2UG9zKSk7CisgICAgICAgIGIuYXBwZW5kKCIgLT4gIik7CisgICAgICAgIFN0cmluZyBuZXdOb2RlID0gbm9kZVN0cmluZyhrZXlQb3MpOworICAgICAgICBiLmFwcGVuZChuZXdOb2RlKTsKKyAgICAgICAgYi5hcHBlbmQoIiBbbGFiZWw9XCIiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHByZXZQb3M7IGkgPCBrZXlQb3MgLSAxOyArK2kpCisgICAgICAgICAgICBiLmFwcGVuZCh0cmFuc2l0aW9uVG9TdHJpbmcuYXBwbHkoa2V5Qnl0ZXNbaV0gJiAweEZGKSk7CisgICAgICAgIGIuYXBwZW5kKHRyYW5zaXRpb25Ub1N0cmluZy5hcHBseShuZXh0Qnl0ZSkpOworICAgICAgICBiLmFwcGVuZCgiXCJdIik7CisgICAgICAgIGFkZE5vZGVEZWZpbml0aW9uKG5ld05vZGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGROb2RlRGVmaW5pdGlvbihTdHJpbmcgbmV3Tm9kZSkKKyAgICB7CisgICAgICAgIHByZXZQb3MgPSBrZXlQb3M7CisgICAgICAgIG5ld0xpbmVBbmRJbmRlbnQoKTsKKyAgICAgICAgY3Vyck5vZGVUZXh0UG9zID0gYi5sZW5ndGgoKTsKKyAgICAgICAgYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJXMgW3NoYXBlPWNpcmNsZSBsYWJlbD1cIlwiXSIsIG5ld05vZGUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBub2RlU3RyaW5nKGludCBrZXlQb3MpCisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBiLmFwcGVuZCgiTm9kZV8iKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlQb3M7ICsraSkKKyAgICAgICAgICAgIGIuYXBwZW5kKHRyYW5zaXRpb25Ub1N0cmluZy5hcHBseShrZXlCeXRlc1tpXSAmIDB4RkYpKTsKKyAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRQYXRoQnl0ZXMoRGlyZWN0QnVmZmVyIGJ1ZmZlciwgaW50IHBvcywgaW50IGNvdW50KQorICAgIHsKKyAgICAgICAgaWYgKHVzZU11bHRpQnl0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIuYWRkUGF0aEJ5dGVzKGJ1ZmZlciwgcG9zLCBjb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgICAgICAgICAgICAgYWRkUGF0aEJ5dGUoYnVmZmVyLmdldEJ5dGUocG9zICsgaSkgJiAweEZGKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbnRlbnQoVCBjb250ZW50KQorICAgIHsKKyAgICAgICAgYi5yZXBsYWNlKGN1cnJOb2RlVGV4dFBvcywgYi5sZW5ndGgoKSwgU3RyaW5nLmZvcm1hdCgiJXMgW3NoYXBlPWRvdWJsZWNpcmNsZSBsYWJlbD1cIiVzXCJdIiwgbm9kZVN0cmluZyhrZXlQb3MpLCBjb250ZW50VG9TdHJpbmcuYXBwbHkoY29udGVudCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGNvbXBsZXRlKCkKKyAgICB7CisgICAgICAgIGIuYXBwZW5kKCJcbn1cbiIpOworICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllVG9Eb3RUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZVRvRG90VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYzY2YWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZVRvRG90VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudHJpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkJ1ZmZlclR5cGU7CisKK3B1YmxpYyBjbGFzcyBUcmllVG9Eb3RUZXN0Cit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9Eb3RDb250ZW50KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSW5NZW1vcnlUcmllPFN0cmluZz4gdHJpZSA9IG5ldyBJbk1lbW9yeVRyaWU8PihCdWZmZXJUeXBlLk9GRl9IRUFQKTsKKyAgICAgICAgU3RyaW5nIHMgPSAiVHJpZSBub2RlIHR5cGVzIGFuZCBtYW5pcHVsYXRpb24gbWVjaGFuaXNtcy4gVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGlzIHRvIGFsbG93IGZvciBoYW5kbGluZyB0cmllcyBkaXJlY3RseSBhcyIgKworICAgICAgICAgICAgICAgICAgICIgdGhleSBhcmUgb24gZGlzayB3aXRob3V0IGFueSBzZXJpYWxpemF0aW9uLCBhbmQgdG8gZW5hYmxlIHRoZSBjcmVhdGlvbiBvZiBzdWNoIGZpbGVzLiI7CisgICAgICAgIHMgPSBzLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIGZvciAoU3RyaW5nIHdvcmQgOiBzLnNwbGl0KCJbXmEtel0rIikpCisgICAgICAgICAgICB0cmllLnB1dFJlY3Vyc2l2ZShJbk1lbW9yeVRyaWVUZXN0QmFzZS5jb21wYXJhYmxlKHdvcmQpLCB3b3JkLCAoeCwgeSkgLT4geSk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHRyaWUucHJvY2VzcyhuZXcgVHJpZVRvRG90KE9iamVjdDo6dG9TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0+IENoYXJhY3Rlci50b1N0cmluZygoY2hhcikgKChpbnQpIHgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVUb01lcm1haWQuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllVG9NZXJtYWlkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1ZDMwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi90cmllcy9UcmllVG9NZXJtYWlkLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnRyaWVzOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgb3JnLmFncm9uYS5EaXJlY3RCdWZmZXI7CisKKy8qKgorICogQSBjbGFzcyBmb3IgZHVtcGluZyB0aGUgc3RydWN0dXJlIG9mIGEgdHJpZSB0byBhIGdyYXBodml6L2RvdCByZXByZXNlbnRhdGlvbiBmb3IgbWFraW5nIHRyaWUgZ3JhcGhzLgorICovCitjbGFzcyBUcmllVG9NZXJtYWlkPFQ+IGV4dGVuZHMgVHJpZVBhdGhSZWNvbnN0cnVjdG9yIGltcGxlbWVudHMgVHJpZS5XYWxrZXI8VCwgU3RyaW5nPgoreworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBiOworICAgIHByaXZhdGUgZmluYWwgRnVuY3Rpb248VCwgU3RyaW5nPiBjb250ZW50VG9TdHJpbmc7CisgICAgcHJpdmF0ZSBmaW5hbCBGdW5jdGlvbjxJbnRlZ2VyLCBTdHJpbmc+IHRyYW5zaXRpb25Ub1N0cmluZzsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdXNlTXVsdGlCeXRlOworICAgIHByaXZhdGUgaW50IHByZXZQb3M7CisgICAgcHJpdmF0ZSBpbnQgY3Vyck5vZGVUZXh0UG9zOworCisgICAgcHVibGljIFRyaWVUb01lcm1haWQoRnVuY3Rpb248VCwgU3RyaW5nPiBjb250ZW50VG9TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248SW50ZWdlciwgU3RyaW5nPiB0cmFuc2l0aW9uVG9TdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB1c2VNdWx0aUJ5dGUpCisgICAgeworICAgICAgICB0aGlzLmNvbnRlbnRUb1N0cmluZyA9IGNvbnRlbnRUb1N0cmluZzsKKyAgICAgICAgdGhpcy50cmFuc2l0aW9uVG9TdHJpbmcgPSB0cmFuc2l0aW9uVG9TdHJpbmc7CisgICAgICAgIHRoaXMudXNlTXVsdGlCeXRlID0gdXNlTXVsdGlCeXRlOworICAgICAgICB0aGlzLmIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBiLmFwcGVuZCgiZ3JhcGggVEQiKTsKKyAgICAgICAgbmV3TGluZUFuZEluZGVudCgpOworICAgICAgICBhZGROb2RlRGVmaW5pdGlvbihub2RlU3RyaW5nKDApKTsKKyAgICAgICAgbmV3TGluZUFuZEluZGVudCgpOworICAgICAgICBiLmFwcGVuZCgic3R5bGUgIiArIG5vZGVTdHJpbmcoMCkgKyAiIGZpbGw6ZGFya2dyZXkiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldFBhdGhMZW5ndGgoaW50IG5ld0xlbmd0aCkKKyAgICB7CisgICAgICAgIHN1cGVyLnJlc2V0UGF0aExlbmd0aChuZXdMZW5ndGgpOworICAgICAgICBwcmV2UG9zID0gbmV3TGVuZ3RoOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBuZXdMaW5lQW5kSW5kZW50KCkKKyAgICB7CisgICAgICAgIGIuYXBwZW5kKCdcbicpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByZXZQb3MgKyAxOyArK2kpCisgICAgICAgICAgICBiLmFwcGVuZCgiICAiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRQYXRoQnl0ZShpbnQgbmV4dEJ5dGUpCisgICAgeworICAgICAgICBuZXdMaW5lQW5kSW5kZW50KCk7CisgICAgICAgIHN1cGVyLmFkZFBhdGhCeXRlKG5leHRCeXRlKTsKKyAgICAgICAgYi5hcHBlbmQobm9kZVN0cmluZyhwcmV2UG9zKSk7CisgICAgICAgIFN0cmluZyBuZXdOb2RlID0gbm9kZVN0cmluZyhrZXlQb3MpOworICAgICAgICBiLmFwcGVuZCgiIC0tXCIiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHByZXZQb3M7IGkgPCBrZXlQb3MgLSAxOyArK2kpCisgICAgICAgICAgICBiLmFwcGVuZCh0cmFuc2l0aW9uVG9TdHJpbmcuYXBwbHkoa2V5Qnl0ZXNbaV0gJiAweEZGKSk7CisgICAgICAgIGIuYXBwZW5kKHRyYW5zaXRpb25Ub1N0cmluZy5hcHBseShuZXh0Qnl0ZSkpOworICAgICAgICBiLmFwcGVuZCgiXCItLT4gIik7CisgICAgICAgIGFkZE5vZGVEZWZpbml0aW9uKG5ld05vZGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGROb2RlRGVmaW5pdGlvbihTdHJpbmcgbmV3Tm9kZSkKKyAgICB7CisgICAgICAgIHByZXZQb3MgPSBrZXlQb3M7CisgICAgICAgIGN1cnJOb2RlVGV4dFBvcyA9IGIubGVuZ3RoKCk7CisgICAgICAgIGIuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiVzKCggKSkiLCBuZXdOb2RlKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgbm9kZVN0cmluZyhpbnQga2V5UG9zKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYi5hcHBlbmQoIk5vZGVfIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga2V5UG9zOyArK2kpCisgICAgICAgICAgICBiLmFwcGVuZCh0cmFuc2l0aW9uVG9TdHJpbmcuYXBwbHkoa2V5Qnl0ZXNbaV0gJiAweEZGKSk7CisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkUGF0aEJ5dGVzKERpcmVjdEJ1ZmZlciBidWZmZXIsIGludCBwb3MsIGludCBjb3VudCkKKyAgICB7CisgICAgICAgIGlmICh1c2VNdWx0aUJ5dGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyLmFkZFBhdGhCeXRlcyhidWZmZXIsIHBvcywgY291bnQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgICAgICAgICAgICAgIGFkZFBhdGhCeXRlKGJ1ZmZlci5nZXRCeXRlKHBvcyArIGkpICYgMHhGRik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb250ZW50KFQgY29udGVudCkKKyAgICB7CisgICAgICAgIGIucmVwbGFjZShjdXJyTm9kZVRleHRQb3MsIGIubGVuZ3RoKCksIFN0cmluZy5mb3JtYXQoIiVzKCgoJXMpKSkiLCBub2RlU3RyaW5nKGtleVBvcyksIGNvbnRlbnRUb1N0cmluZy5hcHBseShjb250ZW50KSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgY29tcGxldGUoKQorICAgIHsKKyAgICAgICAgYi5hcHBlbmQoIlxuIik7CisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVUb01lcm1haWRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdHJpZXMvVHJpZVRvTWVybWFpZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDY5MWJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3RyaWVzL1RyaWVUb01lcm1haWRUZXN0LmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi50cmllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQnVmZmVyVHlwZTsKKworcHVibGljIGNsYXNzIFRyaWVUb01lcm1haWRUZXN0Cit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9NZXJtYWlkQ29udGVudCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEluTWVtb3J5VHJpZTxTdHJpbmc+IHRyaWUgPSBuZXcgSW5NZW1vcnlUcmllPD4oQnVmZmVyVHlwZS5PRkZfSEVBUCk7CisgICAgICAgIC8vIFRoaXMgd2FzIHVzZWQgYXMgYSBiYXNpcyB0aGUgZ3JhcGhzIGluIEJUSUZvcm1hdC5tZAorICAgICAgICBTdHJpbmcgcyA9ICJhIGFsbG93IGFuIGFuZCBhbnkgYXJlIGFzIG5vZGUgb2Ygb24gdGhlIHRoaXMgdG8gdHJpZSB0eXBlcyB3aXRoIHdpdGhvdXQiOworICAgICAgICBzID0gcy50b0xvd2VyQ2FzZSgpOworICAgICAgICBmb3IgKFN0cmluZyB3b3JkIDogcy5zcGxpdCgiW15hLXpdKyIpKQorICAgICAgICAgICAgdHJpZS5wdXRSZWN1cnNpdmUoSW5NZW1vcnlUcmllVGVzdEJhc2UuY29tcGFyYWJsZSh3b3JkKSwgd29yZCwgKHgsIHkpIC0+IHkpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0cmllLnByb2Nlc3MobmV3IFRyaWVUb01lcm1haWQoT2JqZWN0Ojp0b1N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLT4gQ2hhcmFjdGVyLnRvU3RyaW5nKChjaGFyKSAoKGludCkgeCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvQ2xpZW50c1RhYmxlS2V5c3BhY2VDb2xUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9DbGllbnRzVGFibGVLZXlzcGFjZUNvbFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjgyY2FjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvQ2xpZW50c1RhYmxlS2V5c3BhY2VDb2xUZXN0LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIudmlydHVhbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXI7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJvdzsKK2ltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU2Vzc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkVtYmVkZGVkQ2Fzc2FuZHJhU2VydmljZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBDbGllbnRzVGFibGVLZXlzcGFjZUNvbFRlc3QKK3sKKworICAgIHByaXZhdGUgc3RhdGljIENsdXN0ZXIgY2x1c3RlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBFbWJlZGRlZENhc3NhbmRyYVNlcnZpY2UgY2Fzc2FuZHJhOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLU19OQU1FID0gInZ0cyI7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBDbGFzcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY2Fzc2FuZHJhID0gU2VydmVyVGVzdFV0aWxzLnN0YXJ0RW1iZWRkZWRDYXNzYW5kcmFTZXJ2aWNlKCk7CisKKyAgICAgICAgY2x1c3RlciA9IENsdXN0ZXIuYnVpbGRlcigpLmFkZENvbnRhY3RQb2ludCgiMTI3LjAuMC4xIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFBvcnQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldE5hdGl2ZVRyYW5zcG9ydFBvcnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBDbGllbnRzVGFibGUgdGFibGUgPSBuZXcgQ2xpZW50c1RhYmxlKEtTX05BTUUpOworICAgICAgICBWaXJ0dWFsS2V5c3BhY2VSZWdpc3RyeS5pbnN0YW5jZS5yZWdpc3RlcihuZXcgVmlydHVhbEtleXNwYWNlKEtTX05BTUUsIEltbXV0YWJsZUxpc3Qub2YodGFibGUpKSk7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd24oKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjbHVzdGVyICE9IG51bGwpCisgICAgICAgICAgICAgICAgY2x1c3Rlci5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNhc3NhbmRyYSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGNhc3NhbmRyYS5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0Q29ubmVjdGluZ1RvS2V5c3BhY2UoKQorICAgIHsKKyAgICAgICAgdHJ5IChTZXNzaW9uIHNlc3Npb24gPSBjbHVzdGVyLmNvbm5lY3QoKSkKKyAgICAgICAgeworICAgICAgICAgICAgTGlzdDxSb3c+IHJvd3MgPSBzZXNzaW9uLmV4ZWN1dGUoIlNFTEVDVCAqIGZyb20gIiArIEtTX05BTUUgKyAiLmNsaWVudHMiKS5hbGwoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkF0IGxlYXN0IG9uZSBjbGllbnQgc2hvdWxkIGJlIHJldHVybmVkLiIsIHJvd3Muc2l6ZSgpID4gMCk7CisgICAgICAgICAgICBmb3IgKFJvdyByIDogcm93cykKKyAgICAgICAgICAgICAgICBhc3NlcnROdWxsKHIuZ2V0U3RyaW5nKCJrZXlzcGFjZV9uYW1lIikpOyAvLyBObyBrZXlzcGFjZSBpcyBzcGVjaWZlZCB3aGlsZSBjb25uZWN0aW5nLiBJdCBzaG91bGQgYmUgbnVsbC4KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoYW5naW5nS2V5c3BhY2UoKQorICAgIHsKKyAgICAgICAgU3RyaW5nIGtleXNwYWNlMSA9ICJzeXN0ZW1fZGlzdHJpYnV0ZWQiOworICAgICAgICBTdHJpbmcga2V5c3BhY2UyID0gInN5c3RlbV9hdXRoIjsKKyAgICAgICAgdHJ5IChTZXNzaW9uIHNlc3Npb24gPSBjbHVzdGVyLmNvbm5lY3Qoa2V5c3BhY2UxKSkKKyAgICAgICAgeworCisgICAgICAgICAgICBJbmV0QWRkcmVzcyBwb29sQ29ubmVjdGlvbiA9IG51bGw7CisgICAgICAgICAgICBpbnQgcG9ydCA9IC0xOworICAgICAgICAgICAgZm9yIChSb3cgciA6IHNlc3Npb24uZXhlY3V0ZSgiU0VMRUNUICogZnJvbSAiICsgS1NfTkFNRSArICIuY2xpZW50cyIpLmFsbCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEtleXNwYWNlIGlzIHVzZWQgZm9yIHBvb2wgY29ubmVjdGlvbiBvbmx5IChjb250cm9sIGNvbm5lY3Rpb24gaXMgbm90IHVzaW5nIGtleXNwYWNlKS4KKyAgICAgICAgICAgICAgICAvLyBVc2luZyByWyJrZXlzcGFjZV9uYW1lIl0gPT0ga2V5c3BhY2UxIGFzIGEgaGludCB0byBpZGVudGlmeSBhIHBvb2wgY29ubmVjdGlvbiBhcyB3ZSBjYW4ndCBpZGVudGlmeQorICAgICAgICAgICAgICAgIC8vIGNvbnRyb2wgY29ubmVjdGlvbiBiYXNlZCBvbiBpbmZvcm1hdGlvbiBpbiB0aGlzIHRhYmxlLgorICAgICAgICAgICAgICAgIFN0cmluZyBrZXlzcGFjZSA9IHIuZ2V0U3RyaW5nKCJrZXlzcGFjZV9uYW1lIik7CisgICAgICAgICAgICAgICAgaWYgKGtleXNwYWNlMS5lcXVhbHMoa2V5c3BhY2UpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG9vbENvbm5lY3Rpb24gPSByLmdldEluZXQoImFkZHJlc3MiKTsKKyAgICAgICAgICAgICAgICAgICAgcG9ydCA9IHIuZ2V0SW50KCJwb3J0Iik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKC0xLCBwb3J0KTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocG9vbENvbm5lY3Rpb24pOworCisgICAgICAgICAgICBzZXNzaW9uLmV4ZWN1dGUoIlVTRSAiICsga2V5c3BhY2UyKTsKKworICAgICAgICAgICAgU3RyaW5nIHVzZWRLZXlzcGFjZSA9IG51bGw7CisgICAgICAgICAgICBmb3IgKFJvdyByIDogc2Vzc2lvbi5leGVjdXRlKCJTRUxFQ1QgKiBmcm9tICIgKyBLU19OQU1FICsgIi5jbGllbnRzIikuYWxsKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHBvb2xDb25uZWN0aW9uLmVxdWFscyhyLmdldEluZXQoImFkZHJlc3MiKSkgJiYgcG9ydCA9PSByLmdldEludCgicG9ydCIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlZEtleXNwYWNlID0gci5nZXRTdHJpbmcoImtleXNwYWNlX25hbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoa2V5c3BhY2UyLCB1c2VkS2V5c3BhY2UpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvQ3JlZGVudGlhbHNDYWNoZUtleXNUYWJsZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL0NyZWRlbnRpYWxzQ2FjaGVLZXlzVGFibGVUZXN0LmphdmEKaW5kZXggNDUxMzJhOS4uN2FhMWVjNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvQ3JlZGVudGlhbHNDYWNoZUtleXNUYWJsZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9DcmVkZW50aWFsc0NhY2hlS2V5c1RhYmxlVGVzdC5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiAKIGltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuRW5kUG9pbnQ7CiBpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlBsYWluVGV4dEF1dGhQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5BdXRoVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQXV0aGVudGljYXRlZFVzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JQXV0aGVudGljYXRvcjsKQEAgLTQ4LDYgKzQ5LDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKwogICAgICAgICAvLyBoaWdoIHZhbHVlIGlzIHVzZWQgZm9yIGNvbnZlbmllbnQgZGVidWdnaW5nCiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDcmVkZW50aWFsc1ZhbGlkaXR5KDIwXzAwMCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL0xvZ01lc3NhZ2VzVGFibGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9Mb2dNZXNzYWdlc1RhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNjU1YTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9Mb2dNZXNzYWdlc1RhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWw7CisKK2ltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY2gucW9zLmxvZ2JhY2suY2xhc3NpYy5MZXZlbDsKK2ltcG9ydCBjaC5xb3MubG9nYmFjay5jbGFzc2ljLnNwaS5Mb2dnaW5nRXZlbnQ7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EYXRhUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5UaW1lc3RhbXBUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuQWJzdHJhY3RWaXJ0dWFsVGFibGUuRGF0YVNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsLkFic3RyYWN0VmlydHVhbFRhYmxlLlBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTG9jYWxQYXJ0aXRpb25lcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkxPR1NfVklSVFVBTF9UQUJMRV9NQVhfUk9XUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIExvZ01lc3NhZ2VzVGFibGVUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCit7CisgICAgcHJpdmF0ZSBTdHJpbmcga2V5c3BhY2UgPSBjcmVhdGVLZXlzcGFjZU5hbWUoKTsKKyAgICBwcml2YXRlIExvZ01lc3NhZ2VzVGFibGUgdGFibGU7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKQorICAgIHsKKyAgICAgICAgQ1FMVGVzdGVyLnNldFVwQ2xhc3MoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcnVuY2F0ZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIHJlZ2lzdGVyVmlydHVhbFRhYmxlKCk7CisKKyAgICAgICAgaW50IG51bWJlck9mUm93cyA9IDEwMDsKKyAgICAgICAgTGlzdDxMb2dnaW5nRXZlbnQ+IGxvZ2dpbmdFdmVudHMgPSBnZXRMb2dnaW5nRXZlbnRzKG51bWJlck9mUm93cyk7CisgICAgICAgIGxvZ2dpbmdFdmVudHMuZm9yRWFjaCh0YWJsZTo6YWRkKTsKKworICAgICAgICBleGVjdXRlKHF1ZXJ5KCJ0cnVuY2F0ZSAlcyIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKGV4ZWN1dGVOZXQocXVlcnkoInNlbGVjdCB0aW1lc3RhbXAgZnJvbSAlcyIpKS5hbGwoKS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZW1wdHkoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICByZWdpc3RlclZpcnR1YWxUYWJsZSgpOworICAgICAgICBhc3NlcnRFbXB0eShleGVjdXRlKHF1ZXJ5KCJzZWxlY3QgKiBmcm9tICVzIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnNlcnQoKQorICAgIHsKKyAgICAgICAgcmVnaXN0ZXJWaXJ0dWFsVGFibGUoKTsKKworICAgICAgICBpbnQgbnVtYmVyT2ZSb3dzID0gMTAwMDsKKyAgICAgICAgTGlzdDxMb2dnaW5nRXZlbnQ+IGxvZ2dpbmdFdmVudHMgPSBnZXRMb2dnaW5nRXZlbnRzKG51bWJlck9mUm93cyk7CisgICAgICAgIGxvZ2dpbmdFdmVudHMuZm9yRWFjaCh0YWJsZTo6YWRkKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobnVtYmVyT2ZSb3dzLCBudW1iZXJPZlBhcnRpdGlvbnMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGltaXRlZENhcGFjaXR5KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgcmVnaXN0ZXJWaXJ0dWFsVGFibGUoMTAwKTsKKworICAgICAgICBpbnQgbnVtYmVyT2ZSb3dzID0gMTAwMDsKKyAgICAgICAgTGlzdDxMb2dnaW5nRXZlbnQ+IGxvZ2dpbmdFdmVudHMgPSBnZXRMb2dnaW5nRXZlbnRzKG51bWJlck9mUm93cyk7CisgICAgICAgIGxvZ2dpbmdFdmVudHMuZm9yRWFjaCh0YWJsZTo6YWRkKTsKKworICAgICAgICAvLyBldmVuIHdlIGluc2VydGVkIDEwMDAgcm93cywgb25seSAxMDAgYXJlIHByZXNlbnQgYXMgaXRzIGNhcGFjaXR5IGlzIGJvdW5kZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgbnVtYmVyT2ZQYXJ0aXRpb25zKCkpOworCisgICAgICAgIC8vIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIHRhYmxlIHdpbGwgYmUgdGhlIGxhc3Qgb25lIHdoaWNoIHdlIGluc2VydGVkCisgICAgICAgIExvZ2dpbmdFdmVudCBmaXJzdEV2ZW50ID0gbG9nZ2luZ0V2ZW50cy5nZXQoOTk5KTsKKyAgICAgICAgYXNzZXJ0Um93c05ldChleGVjdXRlTmV0KHF1ZXJ5KCJzZWxlY3QgdGltZXN0YW1wIGZyb20gJXMgbGltaXQgMSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBuZXcgRGF0ZShmaXJzdEV2ZW50LmdldFRpbWVTdGFtcCgpKSB9KTsKKworICAgICAgICAvLyB0aGUgbGFzdCByZWNvcmQgaW4gdGhlIHRhYmxlIHdpbGwgYmUgOTAwdGggd2UgaW5zZXJ0ZWQKKyAgICAgICAgTGlzdDxSb3c+IGFsbCA9IGV4ZWN1dGVOZXQocXVlcnkoInNlbGVjdCB0aW1lc3RhbXAgZnJvbSAlcyIpKS5hbGwoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgYWxsLnNpemUoKSk7CisgICAgICAgIFJvdyByb3cgPSBhbGwuZ2V0KGFsbC5zaXplKCkgLSAxKTsKKyAgICAgICAgRGF0ZSB0aW1lc3RhbXAgPSByb3cuZ2V0VGltZXN0YW1wKDApOworICAgICAgICBhc3NlcnRFcXVhbHMobG9nZ2luZ0V2ZW50cy5nZXQoOTAwKS5nZXRUaW1lU3RhbXAoKSwgdGltZXN0YW1wLmdldFRpbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVMb2dzSW5TYW1lTWlsbGlzZWNvbmQoKQorICAgIHsKKyAgICAgICAgcmVnaXN0ZXJWaXJ0dWFsVGFibGUoMTApOworICAgICAgICBMaXN0PExvZ2dpbmdFdmVudD4gbG9nZ2luZ0V2ZW50cyA9IGdldExvZ2dpbmdFdmVudHMoMTAsIEluc3RhbnQubm93KCksIDUpOworICAgICAgICBsb2dnaW5nRXZlbnRzLmZvckVhY2godGFibGU6OmFkZCk7CisKKyAgICAgICAgLy8gMiBwYXJ0aXRpb25zLCA1IHJvd3MgaW4gZWFjaAorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbnVtYmVyT2ZQYXJ0aXRpb25zKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmluZ0J1ZmZlclNpemUoKQorICAgIHsKKyAgICAgICAgTE9HU19WSVJUVUFMX1RBQkxFX01BWF9ST1dTLnNldEludCgtMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb2dNZXNzYWdlc1RhYmxlLkxPR1NfVklSVFVBTF9UQUJMRV9ERUZBVUxUX1JPV1MsIExvZ01lc3NhZ2VzVGFibGUucmVzb2x2ZUJ1ZmZlclNpemUoKSk7CisKKyAgICAgICAgTE9HU19WSVJUVUFMX1RBQkxFX01BWF9ST1dTLnNldEludCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvZ01lc3NhZ2VzVGFibGUuTE9HU19WSVJUVUFMX1RBQkxFX0RFRkFVTFRfUk9XUywgTG9nTWVzc2FnZXNUYWJsZS5yZXNvbHZlQnVmZmVyU2l6ZSgpKTsKKworICAgICAgICBMT0dTX1ZJUlRVQUxfVEFCTEVfTUFYX1JPV1Muc2V0SW50KDEwMDAwMDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9nTWVzc2FnZXNUYWJsZS5MT0dTX1ZJUlRVQUxfVEFCTEVfREVGQVVMVF9ST1dTLCBMb2dNZXNzYWdlc1RhYmxlLnJlc29sdmVCdWZmZXJTaXplKCkpOworCisgICAgICAgIExPR1NfVklSVFVBTF9UQUJMRV9NQVhfUk9XUy5zZXRJbnQoOTk5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvZ01lc3NhZ2VzVGFibGUuTE9HU19WSVJUVUFMX1RBQkxFX0RFRkFVTFRfUk9XUywgTG9nTWVzc2FnZXNUYWJsZS5yZXNvbHZlQnVmZmVyU2l6ZSgpKTsKKworICAgICAgICBMT0dTX1ZJUlRVQUxfVEFCTEVfTUFYX1JPV1Muc2V0SW50KDUwMDAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMDAxLCBMb2dNZXNzYWdlc1RhYmxlLnJlc29sdmVCdWZmZXJTaXplKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlclZpcnR1YWxUYWJsZSgpCisgICAgeworICAgICAgICByZWdpc3RlclZpcnR1YWxUYWJsZShMb2dNZXNzYWdlc1RhYmxlLkxPR1NfVklSVFVBTF9UQUJMRV9NSU5fUk9XUyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyVmlydHVhbFRhYmxlKGludCBzaXplKQorICAgIHsKKyAgICAgICAgdGFibGUgPSBuZXcgTG9nTWVzc2FnZXNUYWJsZShrZXlzcGFjZSwgc2l6ZSk7CisgICAgICAgIFZpcnR1YWxLZXlzcGFjZVJlZ2lzdHJ5Lmluc3RhbmNlLnJlZ2lzdGVyKG5ldyBWaXJ0dWFsS2V5c3BhY2Uoa2V5c3BhY2UsIEltbXV0YWJsZUxpc3Qub2YodGFibGUpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgbnVtYmVyT2ZQYXJ0aXRpb25zKCkKKyAgICB7CisgICAgICAgIERhdGFTZXQgZGF0YSA9IHRhYmxlLmRhdGEoKTsKKworICAgICAgICBJdGVyYXRvcjxQYXJ0aXRpb24+IHBhcnRpdGlvbnMgPSBkYXRhLmdldFBhcnRpdGlvbnMoRGF0YVJhbmdlLmFsbERhdGEobmV3IExvY2FsUGFydGl0aW9uZXIoVGltZXN0YW1wVHlwZS5pbnN0YW5jZSkpKTsKKworICAgICAgICBpbnQgbnVtYmVyT2ZQYXJ0aXRpb25zID0gMDsKKworICAgICAgICB3aGlsZSAocGFydGl0aW9ucy5oYXNOZXh0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcnRpdGlvbnMubmV4dCgpOworICAgICAgICAgICAgbnVtYmVyT2ZQYXJ0aXRpb25zICs9IDE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVtYmVyT2ZQYXJ0aXRpb25zOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5KFN0cmluZyBxdWVyeSkKKyAgICB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KHF1ZXJ5LCB0YWJsZS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8TG9nZ2luZ0V2ZW50PiBnZXRMb2dnaW5nRXZlbnRzKGludCBzaXplKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdldExvZ2dpbmdFdmVudHMoc2l6ZSwgSW5zdGFudC5ub3coKSwgMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PExvZ2dpbmdFdmVudD4gZ2V0TG9nZ2luZ0V2ZW50cyhpbnQgc2l6ZSwgSW5zdGFudCBmaXJzdFRpbWVzdGFtcCwgaW50IGxvZ3NJbk1pbGxpc2Vjb25kKQorICAgIHsKKyAgICAgICAgTGlzdDxMb2dnaW5nRXZlbnQ+IGxvZ3MgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGludCBwYXJ0aXRpb25zID0gc2l6ZSAvIGxvZ3NJbk1pbGxpc2Vjb25kOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9uczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHRpbWVzdGFtcCA9IGZpcnN0VGltZXN0YW1wLnRvRXBvY2hNaWxsaSgpOworICAgICAgICAgICAgZmlyc3RUaW1lc3RhbXAgPSBmaXJzdFRpbWVzdGFtcC5wbHVzU2Vjb25kcygxKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBsb2dzSW5NaWxsaXNlY29uZDsgaisrKQorICAgICAgICAgICAgICAgIGxvZ3MuYWRkKGdldExvZ2dpbmdFdmVudCh0aW1lc3RhbXApKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsb2dzOworICAgIH0KKworICAgIHByaXZhdGUgTG9nZ2luZ0V2ZW50IGdldExvZ2dpbmdFdmVudChsb25nIHRpbWVzdGFtcCkKKyAgICB7CisgICAgICAgIExvZ2dpbmdFdmVudCBldmVudCA9IG5ldyBMb2dnaW5nRXZlbnQoKTsKKyAgICAgICAgZXZlbnQuc2V0TGV2ZWwoTGV2ZWwuSU5GTyk7CisgICAgICAgIGV2ZW50LnNldE1lc3NhZ2UoIm1lc3NhZ2UgIiArIHRpbWVzdGFtcCk7CisgICAgICAgIGV2ZW50LnNldExvZ2dlck5hbWUoImxvZ2dlciAiICsgdGltZXN0YW1wKTsKKyAgICAgICAgZXZlbnQuc2V0VGhyZWFkTmFtZShUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgIGV2ZW50LnNldFRpbWVTdGFtcCh0aW1lc3RhbXApOworCisgICAgICAgIHJldHVybiBldmVudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9OZXR3b3JrUGVybWlzc2lvbnNDYWNoZUtleXNUYWJsZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL05ldHdvcmtQZXJtaXNzaW9uc0NhY2hlS2V5c1RhYmxlVGVzdC5qYXZhCmluZGV4IGY5NDQ4ODQuLmU5MzViYmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL05ldHdvcmtQZXJtaXNzaW9uc0NhY2hlS2V5c1RhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL05ldHdvcmtQZXJtaXNzaW9uc0NhY2hlS2V5c1RhYmxlVGVzdC5qYXZhCkBAIC0yNCw2ICsyNCw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQXV0aFRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkF1dGhlbnRpY2F0ZWRVc2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguRENQZXJtaXNzaW9uczsKQEAgLTQ2LDYgKzQ3LDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKwogICAgICAgICAvLyBoaWdoIHZhbHVlIGlzIHVzZWQgZm9yIGNvbnZlbmllbnQgZGVidWdnaW5nCiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRQZXJtaXNzaW9uc1ZhbGlkaXR5KDIwXzAwMCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1Blcm1pc3Npb25zQ2FjaGVLZXlzVGFibGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9QZXJtaXNzaW9uc0NhY2hlS2V5c1RhYmxlVGVzdC5qYXZhCmluZGV4IDIxNzFiMmQuLjQyOTUxNzUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1Blcm1pc3Npb25zQ2FjaGVLZXlzVGFibGVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvUGVybWlzc2lvbnNDYWNoZUtleXNUYWJsZVRlc3QuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkF1dGhUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5BdXRoZW50aWNhdGVkVXNlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLkRhdGFSZXNvdXJjZTsKQEAgLTUyLDYgKzUzLDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpCiAgICAgeworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICAgICAgLy8gaGlnaCB2YWx1ZSBpcyB1c2VkIGZvciBjb252ZW5pZW50IGRlYnVnZ2luZwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGVybWlzc2lvbnNWYWxpZGl0eSgyMF8wMDApOwogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9Sb2xlc0NhY2hlS2V5c1RhYmxlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvUm9sZXNDYWNoZUtleXNUYWJsZVRlc3QuamF2YQppbmRleCA0MGMzMDM3Li5kZTE0YWVmIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9Sb2xlc0NhY2hlS2V5c1RhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1JvbGVzQ2FjaGVLZXlzVGFibGVUZXN0LmphdmEKQEAgLTI0LDYgKzI0LDcgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5BdXRoVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguQXV0aGVudGljYXRlZFVzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JUm9sZU1hbmFnZXI7CkBAIC00Niw2ICs0Nyw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKQogICAgIHsKKyAgICAgICAgU2VydmVyVGVzdFV0aWxzLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgICAgIC8vIGhpZ2ggdmFsdWUgaXMgdXNlZCBmb3IgY29udmVuaWVudCBkZWJ1Z2dpbmcKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFJvbGVzVmFsaWRpdHkoMjBfMDAwKTsKIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU1NUYWJsZVRhc2tzVGFibGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TU1RhYmxlVGFza3NUYWJsZVRlc3QuamF2YQppbmRleCBmNjQyYTJmLi42ZThhMTM2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TU1RhYmxlVGFza3NUYWJsZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TU1RhYmxlVGFza3NUYWJsZVRlc3QuamF2YQpAQCAtNzMsMTEgKzczLDE0IEBACiAgICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBJbnRTdHJlYW0ucmFuZ2UoMCwgMTApCiAgICAgICAgICAgICAgICAgLm1hcFRvT2JqKGkgLT4gTW9ja1NjaGVtYS5zc3RhYmxlKGksIGkgKiAxMEwsIGkgKiAxMEwgKyA5LCBjZnMpKQogICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgIFN0cmluZyBkaXJlY3RvcnkgPSBTdHJpbmcuZm9ybWF0KCIvc29tZS9kYXRhZGlyLyVzLyVzLSVzIiwgY2ZzLm1ldGFkYXRhLmtleXNwYWNlLCBjZnMubWV0YWRhdGEubmFtZSwgY2ZzLm1ldGFkYXRhLmlkLmFzVVVJRCgpKTsKKwogICAgICAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgY29tcGFjdGlvbkhvbGRlciA9IG5ldyBDb21wYWN0aW9uSW5mby5Ib2xkZXIoKQogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgQ29tcGFjdGlvbkluZm8gZ2V0Q29tcGFjdGlvbkluZm8oKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8oY2ZzLm1ldGFkYXRhKCksIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIGJ5dGVzVG90YWwsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8oY2ZzLm1ldGFkYXRhKCksIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIGJ5dGVzVG90YWwsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMsIGRpcmVjdG9yeSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKQEAgLTkwLDcgKzkzLDcgQEAKICAgICAgICAgVW50eXBlZFJlc3VsdFNldCByZXN1bHQgPSBleGVjdXRlKCJTRUxFQ1QgKiBGUk9NIHZ0cy5zc3RhYmxlX3Rhc2tzIik7CiAgICAgICAgIGFzc2VydFJvd3MocmVzdWx0LCByb3coQ1FMVGVzdGVyLktFWVNQQUNFLCBjdXJyZW50VGFibGUoKSwgY29tcGFjdGlvbklkLCAxLjAgKiBieXRlc0NvbXBhY3RlZCAvIGJ5dGVzVG90YWwsCiAgICAgICAgICAgICAgICAgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSwgYnl0ZXNDb21wYWN0ZWQsIHNzdGFibGVzLnNpemUoKSwKLSAgICAgICAgICAgICAgICBieXRlc1RvdGFsLCBDb21wYWN0aW9uSW5mby5Vbml0LkJZVEVTLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICBkaXJlY3RvcnksIGJ5dGVzVG90YWwsIENvbXBhY3Rpb25JbmZvLlVuaXQuQllURVMudG9TdHJpbmcoKSkpOwogCiAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5maW5pc2hDb21wYWN0aW9uKGNvbXBhY3Rpb25Ib2xkZXIpOwogICAgICAgICByZXN1bHQgPSBleGVjdXRlKCJTRUxFQ1QgKiBGUk9NIHZ0cy5zc3RhYmxlX3Rhc2tzIik7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TbmFwc2hvdHNUYWJsZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1NuYXBzaG90c1RhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ODMyMzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TbmFwc2hvdHNUYWJsZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi52aXJ0dWFsOworCitpbXBvcnQgamF2YS50aW1lLkluc3RhbnQ7CitpbXBvcnQgamF2YS50aW1lLnRlbXBvcmFsLkNocm9ub1VuaXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jazsKKworcHVibGljIGNsYXNzIFNuYXBzaG90c1RhYmxlVGVzdCBleHRlbmRzIENRTFRlc3RlcgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLU19OQU1FID0gInZ0cyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNOQVBTSE9UX1RUTCA9ICJzbmFwc2hvdFR0bCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNOQVBTSE9UX05PX1RUTCA9ICJzbmFwc2hvdE5vVHRsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kIHR0bCA9IG5ldyBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kKCI0aCIpOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFNuYXBzaG90c1RhYmxlIHZ0YWJsZSA9IG5ldyBTbmFwc2hvdHNUYWJsZShLU19OQU1FKTsKKyAgICAgICAgVmlydHVhbEtleXNwYWNlUmVnaXN0cnkuaW5zdGFuY2UucmVnaXN0ZXIobmV3IFZpcnR1YWxLZXlzcGFjZShLU19OQU1FLCBJbW11dGFibGVMaXN0Lm9mKHZ0YWJsZSkpKTsKKworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQsIGNrIGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gMTA7ICsraSkKKyAgICAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChwaywgY2spIFZBTFVFUyAoPywgPykiLCBpLCBpKTsKKworICAgICAgICBmbHVzaCgpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIGFmdGVyKCkKKyAgICB7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmNsZWFyU25hcHNob3QoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwgU05BUFNIT1RfTk9fVFRMLCBLRVlTUEFDRSk7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmNsZWFyU25hcHNob3QoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwgU05BUFNIT1RfVFRMLCBLRVlTUEFDRSk7CisKKyAgICAgICAgc2NoZW1hQ2hhbmdlKFN0cmluZy5mb3JtYXQoIkRST1AgVEFCTEUgJXMiLCBLRVlTUEFDRSArICIuIiArIGN1cnJlbnRUYWJsZSgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U25hcHNob3RzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgSW5zdGFudCBub3cgPSBJbnN0YW50Lm9mRXBvY2hNaWxsaShDbG9jay5HbG9iYWwuY3VycmVudFRpbWVNaWxsaXMoKSkudHJ1bmNhdGVkVG8oQ2hyb25vVW5pdC5NSUxMSVMpOworICAgICAgICBEYXRlIGNyZWF0ZWRBdCA9IG5ldyBEYXRlKG5vdy50b0Vwb2NoTWlsbGkoKSk7CisgICAgICAgIERhdGUgZXhwaXJlc0F0ID0gbmV3IERhdGUobm93LnBsdXNTZWNvbmRzKHR0bC50b1NlY29uZHMoKSkudG9FcG9jaE1pbGxpKCkpOworCisgICAgICAgIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRSkuc25hcHNob3QoU05BUFNIT1RfTk9fVFRMLCBudWxsLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG5vdyk7CisgICAgICAgIGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZShLRVlTUEFDRSkuc25hcHNob3QoU05BUFNIT1RfVFRMLCBudWxsLCBmYWxzZSwgZmFsc2UsIHR0bCwgbnVsbCwgbm93KTsKKworICAgICAgICAvLyBxdWVyeSBhbGwgZnJvbSBzbmFwc2hvdHMgdmlydHVhbCB0YWJsZQorICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IHJlc3VsdCA9IGV4ZWN1dGUoIlNFTEVDVCBuYW1lLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBjcmVhdGVkX2F0LCBleHBpcmVzX2F0LCBlcGhlbWVyYWwgRlJPTSB2dHMuc25hcHNob3RzIik7CisgICAgICAgIGFzc2VydFJvd3NJZ25vcmluZ09yZGVyKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KFNOQVBTSE9UX05PX1RUTCwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjcmVhdGVkQXQsIG51bGwsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KFNOQVBTSE9UX1RUTCwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjcmVhdGVkQXQsIGV4cGlyZXNBdCwgZmFsc2UpKTsKKworICAgICAgICAvLyBxdWVyeSB3aXRoIGNvbmRpdGlvbnMKKyAgICAgICAgcmVzdWx0ID0gZXhlY3V0ZSgiU0VMRUNUIG5hbWUsIGtleXNwYWNlX25hbWUsIHRhYmxlX25hbWUsIGNyZWF0ZWRfYXQsIGV4cGlyZXNfYXQsIGVwaGVtZXJhbCBGUk9NIHZ0cy5zbmFwc2hvdHMgd2hlcmUgZXBoZW1lcmFsID0gZmFsc2UiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgcm93KFNOQVBTSE9UX05PX1RUTCwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjcmVhdGVkQXQsIG51bGwsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICByb3coU05BUFNIT1RfVFRMLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCksIGNyZWF0ZWRBdCwgZXhwaXJlc0F0LCBmYWxzZSkpOworCisgICAgICAgIHJlc3VsdCA9IGV4ZWN1dGUoIlNFTEVDVCBuYW1lLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBjcmVhdGVkX2F0LCBleHBpcmVzX2F0LCBlcGhlbWVyYWwgRlJPTSB2dHMuc25hcHNob3RzIHdoZXJlIHNpemVfb25fZGlzayA+IDEwMDAiKTsKKyAgICAgICAgYXNzZXJ0Um93cyhyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgcm93KFNOQVBTSE9UX05PX1RUTCwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjcmVhdGVkQXQsIG51bGwsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICByb3coU05BUFNIT1RfVFRMLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCksIGNyZWF0ZWRBdCwgZXhwaXJlc0F0LCBmYWxzZSkpOworCisgICAgICAgIHJlc3VsdCA9IGV4ZWN1dGUoIlNFTEVDVCBuYW1lLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBjcmVhdGVkX2F0LCBleHBpcmVzX2F0LCBlcGhlbWVyYWwgRlJPTSB2dHMuc25hcHNob3RzIHdoZXJlIG5hbWUgPSA/IiwgU05BUFNIT1RfVFRMKTsKKyAgICAgICAgYXNzZXJ0Um93cyhyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgcm93KFNOQVBTSE9UX1RUTCwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjcmVhdGVkQXQsIGV4cGlyZXNBdCwgZmFsc2UpKTsKKworICAgICAgICAvLyBjbGVhciBzb21lIHNuYXBzaG90cworICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5jbGVhclNuYXBzaG90KENvbGxlY3Rpb25zLmVtcHR5TWFwKCksIFNOQVBTSE9UX05PX1RUTCwgS0VZU1BBQ0UpOworCisgICAgICAgIHJlc3VsdCA9IGV4ZWN1dGUoIlNFTEVDVCBuYW1lLCBrZXlzcGFjZV9uYW1lLCB0YWJsZV9uYW1lLCBjcmVhdGVkX2F0LCBleHBpcmVzX2F0LCBlcGhlbWVyYWwgRlJPTSB2dHMuc25hcHNob3RzIik7CisgICAgICAgIGFzc2VydFJvd3NJZ25vcmluZ09yZGVyKHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93KFNOQVBTSE9UX1RUTCwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjcmVhdGVkQXQsIGV4cGlyZXNBdCwgZmFsc2UpKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU3RyZWFtaW5nVmlydHVhbFRhYmxlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU3RyZWFtaW5nVmlydHVhbFRhYmxlVGVzdC5qYXZhCmluZGV4IGM4ZTNkODkuLjU2ZDAxOTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1N0cmVhbWluZ1ZpcnR1YWxUYWJsZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TdHJlYW1pbmdWaXJ0dWFsVGFibGVUZXN0LmphdmEKQEAgLTk2LDkgKzk2LDkgQEAKICAgICAgICAgYXNzZXJ0Um93cyhleGVjdXRlKHQoInNlbGVjdCBpZCwgZm9sbG93ZXIsIG9wZXJhdGlvbiwgcGVlcnMsIHN0YXR1cywgcHJvZ3Jlc3NfcGVyY2VudGFnZSwgbGFzdF91cGRhdGVkX2F0LCBmYWlsdXJlX2NhdXNlLCBzdWNjZXNzX21lc3NhZ2UgZnJvbSAlcyIpKSwKICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBzdGF0ZS5pZCgpLCB0cnVlLCAiUmVwYWlyIiwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksICJzdGFydCIsIDBGLCBuZXcgRGF0ZShzdGF0ZS5sYXN0VXBkYXRlZEF0TWlsbGlzKCkpLCBudWxsLCBudWxsIH0pOwogCi0gICAgICAgIHN0YXRlLmhhbmRsZVN0cmVhbUV2ZW50KG5ldyBTdHJlYW1FdmVudC5TZXNzaW9uUHJlcGFyZWRFdmVudChzdGF0ZS5pZCgpLCBuZXcgU2Vzc2lvbkluZm8oUEVFUjIsIDEsIFBFRVIxLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIFN0cmVhbVNlc3Npb24uU3RhdGUuUFJFUEFSSU5HKSwgU3RyZWFtU2Vzc2lvbi5QcmVwYXJlRGlyZWN0aW9uLkFDSykpOworICAgICAgICBzdGF0ZS5oYW5kbGVTdHJlYW1FdmVudChuZXcgU3RyZWFtRXZlbnQuU2Vzc2lvblByZXBhcmVkRXZlbnQoc3RhdGUuaWQoKSwgbmV3IFNlc3Npb25JbmZvKFBFRVIyLCAxLCBQRUVSMSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBTdHJlYW1TZXNzaW9uLlN0YXRlLlBSRVBBUklORywgbnVsbCksIFN0cmVhbVNlc3Npb24uUHJlcGFyZURpcmVjdGlvbi5BQ0spKTsKIAotICAgICAgICBzdGF0ZS5vblN1Y2Nlc3MobmV3IFN0cmVhbVN0YXRlKHN0YXRlLmlkKCksIFN0cmVhbU9wZXJhdGlvbi5SRVBBSVIsIEltbXV0YWJsZVNldC5vZihuZXcgU2Vzc2lvbkluZm8oUEVFUjIsIDEsIFBFRVIxLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIFN0cmVhbVNlc3Npb24uU3RhdGUuQ09NUExFVEUpKSkpOworICAgICAgICBzdGF0ZS5vblN1Y2Nlc3MobmV3IFN0cmVhbVN0YXRlKHN0YXRlLmlkKCksIFN0cmVhbU9wZXJhdGlvbi5SRVBBSVIsIEltbXV0YWJsZVNldC5vZihuZXcgU2Vzc2lvbkluZm8oUEVFUjIsIDEsIFBFRVIxLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIFN0cmVhbVNlc3Npb24uU3RhdGUuQ09NUExFVEUsIG51bGwpKSkpOwogICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUodCgic2VsZWN0IGlkLCBmb2xsb3dlciwgb3BlcmF0aW9uLCBwZWVycywgc3RhdHVzLCBwcm9ncmVzc19wZXJjZW50YWdlLCBsYXN0X3VwZGF0ZWRfYXQsIGZhaWx1cmVfY2F1c2UsIHN1Y2Nlc3NfbWVzc2FnZSBmcm9tICVzIikpLAogICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHN0YXRlLmlkKCksIHRydWUsICJSZXBhaXIiLCBBcnJheXMuYXNMaXN0KGFkZHJlc3MoMTI3LCAwLCAwLCAyKS50b1N0cmluZygpKSwgInN1Y2Nlc3MiLCAxMDBGLCBuZXcgRGF0ZShzdGF0ZS5sYXN0VXBkYXRlZEF0TWlsbGlzKCkpLCBudWxsLCBudWxsIH0pOwogICAgIH0KQEAgLTEyMSw4ICsxMjEsOCBAQAogICAgICAgICBTdHJlYW1SZXN1bHRGdXR1cmUgZnV0dXJlID0gc3RhdGUuZnV0dXJlKCk7CiAgICAgICAgIHN0YXRlLnBoYXNlLnN0YXJ0KCk7CiAKLSAgICAgICAgU2Vzc2lvbkluZm8gczEgPSBuZXcgU2Vzc2lvbkluZm8oUEVFUjIsIDAsIEZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0KCksIEFycmF5cy5hc0xpc3Qoc3RyZWFtU3VtbWFyeSgpKSwgQXJyYXlzLmFzTGlzdChzdHJlYW1TdW1tYXJ5KCksIHN0cmVhbVN1bW1hcnkoKSksIFN0cmVhbVNlc3Npb24uU3RhdGUuUFJFUEFSSU5HKTsKLSAgICAgICAgU2Vzc2lvbkluZm8gczIgPSBuZXcgU2Vzc2lvbkluZm8oUEVFUjMsIDAsIEZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0KCksIEFycmF5cy5hc0xpc3Qoc3RyZWFtU3VtbWFyeSgpKSwgQXJyYXlzLmFzTGlzdChzdHJlYW1TdW1tYXJ5KCksIHN0cmVhbVN1bW1hcnkoKSksIFN0cmVhbVNlc3Npb24uU3RhdGUuUFJFUEFSSU5HKTsKKyAgICAgICAgU2Vzc2lvbkluZm8gczEgPSBuZXcgU2Vzc2lvbkluZm8oUEVFUjIsIDAsIEZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0KCksIEFycmF5cy5hc0xpc3Qoc3RyZWFtU3VtbWFyeSgpKSwgQXJyYXlzLmFzTGlzdChzdHJlYW1TdW1tYXJ5KCksIHN0cmVhbVN1bW1hcnkoKSksIFN0cmVhbVNlc3Npb24uU3RhdGUuUFJFUEFSSU5HLCBudWxsKTsKKyAgICAgICAgU2Vzc2lvbkluZm8gczIgPSBuZXcgU2Vzc2lvbkluZm8oUEVFUjMsIDAsIEZCVXRpbGl0aWVzLmdldEJyb2FkY2FzdEFkZHJlc3NBbmRQb3J0KCksIEFycmF5cy5hc0xpc3Qoc3RyZWFtU3VtbWFyeSgpKSwgQXJyYXlzLmFzTGlzdChzdHJlYW1TdW1tYXJ5KCksIHN0cmVhbVN1bW1hcnkoKSksIFN0cmVhbVNlc3Npb24uU3RhdGUuUFJFUEFSSU5HLCBudWxsKTsKIAogICAgICAgICAvLyB3ZSBvbmx5IHVwZGF0ZSBzdGF0cyBvbiBBQ0sKICAgICAgICAgc3RhdGUuaGFuZGxlU3RyZWFtRXZlbnQobmV3IFN0cmVhbUV2ZW50LlNlc3Npb25QcmVwYXJlZEV2ZW50KHN0YXRlLmlkKCksIHMxLCBTdHJlYW1TZXNzaW9uLlByZXBhcmVEaXJlY3Rpb24uQUNLKSk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TeXN0ZW1Qcm9wZXJ0aWVzVGFibGVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGIvdmlydHVhbC9TeXN0ZW1Qcm9wZXJ0aWVzVGFibGVUZXN0LmphdmEKaW5kZXggNTI0MmQ1NS4uYzhjYTliYSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RiL3ZpcnR1YWwvU3lzdGVtUHJvcGVydGllc1RhYmxlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kYi92aXJ0dWFsL1N5c3RlbVByb3BlcnRpZXNUYWJsZVRlc3QuamF2YQpAQCAtMzcsMTEgKzM3LDEzIEBACiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKIAorLy8gY2hlY2tzdHlsZTogc3VwcHJlc3MgYmVsb3cgJ2Jsb2NrU3lzdGVtUHJvcGVydHlVc2FnZScKKwogcHVibGljIGNsYXNzIFN5c3RlbVByb3BlcnRpZXNUYWJsZVRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1NfTkFNRSA9ICJ2dHMiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gT1JJR0lOQUxfRU5WX01BUCA9IFN5c3RlbS5nZXRlbnYoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QUk9QID0gIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnZpcnR1YWwuU3lzdGVtUHJvcGVydGllc1RhYmxlVGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUFJPUCA9ICJjYXNzYW5kcmEuU3lzdGVtUHJvcGVydGllc1RhYmxlVGVzdCI7CiAKICAgICBwcml2YXRlIFN5c3RlbVByb3BlcnRpZXNUYWJsZSB0YWJsZTsKIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9LZXlDb2xsaXNpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L0tleUNvbGxpc2lvblRlc3QuamF2YQppbmRleCA1YjUzNjVkLi5jMjQ2OTBiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L0tleUNvbGxpc2lvblRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L0tleUNvbGxpc2lvblRlc3QuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnRlZ2VyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwpAQCAtMzYsNiArMzcsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVTb3VyY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKIC8qKgpAQCAtMTI0LDUgKzEyNywxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZVNvdXJjZSBhc0NvbXBhcmFibGVCeXRlcyhCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyVHlwZS5pbnN0YW5jZS5hc0NvbXBhcmFibGVCeXRlcyhJbnRlZ2VyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UodG9rZW4pLCB2ZXJzaW9uKTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvTGVuZ3RoUGFydGl0aW9uZXIuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvTGVuZ3RoUGFydGl0aW9uZXIuamF2YQppbmRleCBjNGU1ZGI4Li45ODU5NDg3IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L0xlbmd0aFBhcnRpdGlvbmVyLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC9MZW5ndGhQYXJ0aXRpb25lci5qYXZhCkBAIC0zNCw2ICszNCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlOwogCiBwdWJsaWMgY2xhc3MgTGVuZ3RoUGFydGl0aW9uZXIgaW1wbGVtZW50cyBJUGFydGl0aW9uZXIKIHsKQEAgLTk1LDYgKzk3LDExIEBACiAgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXJUb2tlbihuZXcgQmlnSW50ZWdlcihCeXRlQnVmZmVyVXRpbC5nZXRBcnJheShieXRlcykpKTsKICAgICAgICAgfQogCisgICAgICAgIHB1YmxpYyBUb2tlbiBmcm9tQ29tcGFyYWJsZUJ5dGVzKEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmcm9tQnl0ZUFycmF5KEludGVnZXJUeXBlLmluc3RhbmNlLmZyb21Db21wYXJhYmxlQnl0ZXMoY29tcGFyYWJsZUJ5dGVzLCB2ZXJzaW9uKSk7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFRva2VuIHRva2VuKQogICAgICAgICB7CiAgICAgICAgICAgICBCaWdJbnRlZ2VyVG9rZW4gYmlnSW50ZWdlclRva2VuID0gKEJpZ0ludGVnZXJUb2tlbikgdG9rZW47CkBAIC0xMjksMTUgKzEzNiwxNSBAQAogICAgIHB1YmxpYyBNYXA8VG9rZW4sIEZsb2F0PiBkZXNjcmliZU93bmVyc2hpcChMaXN0PFRva2VuPiBzb3J0ZWRUb2tlbnMpCiAgICAgewogICAgICAgICAvLyBhbGxUb2tlbnMgd2lsbCBjb250YWluIHRoZSBjb3VudCBhbmQgYmUgcmV0dXJuZWQsIHNvcnRlZF9yYW5nZXMgaXMgc2hvcnRoYW5kIGZvciB0b2tlbjwtPnRva2VuIG1hdGguCi0gICAgICAgIE1hcDxUb2tlbiwgRmxvYXQ+IGFsbFRva2VucyA9IG5ldyBIYXNoTWFwPFRva2VuLCBGbG9hdD4oKTsKLSAgICAgICAgTGlzdDxSYW5nZTxUb2tlbj4+IHNvcnRlZFJhbmdlcyA9IG5ldyBBcnJheUxpc3Q8UmFuZ2U8VG9rZW4+PigpOworICAgICAgICBNYXA8VG9rZW4sIEZsb2F0PiBhbGxUb2tlbnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIExpc3Q8UmFuZ2U8VG9rZW4+PiBzb3J0ZWRSYW5nZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgICAgICAvLyB0aGlzIGluaXRpYWxpemVzIHRoZSBjb3VudHMgdG8gMCBhbmQgY2FsY3MgdGhlIHJhbmdlcyBpbiBvcmRlci4KICAgICAgICAgVG9rZW4gbGFzdFRva2VuID0gc29ydGVkVG9rZW5zLmdldChzb3J0ZWRUb2tlbnMuc2l6ZSgpIC0gMSk7CiAgICAgICAgIGZvciAoVG9rZW4gbm9kZSA6IHNvcnRlZFRva2VucykKICAgICAgICAgewotICAgICAgICAgICAgYWxsVG9rZW5zLnB1dChub2RlLCBuZXcgRmxvYXQoMC4wKSk7Ci0gICAgICAgICAgICBzb3J0ZWRSYW5nZXMuYWRkKG5ldyBSYW5nZTxUb2tlbj4obGFzdFRva2VuLCBub2RlKSk7CisgICAgICAgICAgICBhbGxUb2tlbnMucHV0KG5vZGUsIDAuMEYpOworICAgICAgICAgICAgc29ydGVkUmFuZ2VzLmFkZChuZXcgUmFuZ2U8PihsYXN0VG9rZW4sIG5vZGUpKTsKICAgICAgICAgICAgIGxhc3RUb2tlbiA9IG5vZGU7CiAgICAgICAgIH0KIApAQCAtMTU0LDcgKzE2MSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBTdW0gZXZlcnkgY291bnQgdXAgYW5kIGRpdmlkZSBjb3VudC90b3RhbCBmb3IgdGhlIGZyYWN0aW9uYWwgb3duZXJzaGlwLgotICAgICAgICBGbG9hdCB0b3RhbCA9IG5ldyBGbG9hdCgwLjApOworICAgICAgICBGbG9hdCB0b3RhbCA9IDAuMEY7CiAgICAgICAgIGZvciAoRmxvYXQgZiA6IGFsbFRva2Vucy52YWx1ZXMoKSkKICAgICAgICAgICAgIHRvdGFsICs9IGY7CiAgICAgICAgIGZvciAoTWFwLkVudHJ5PFRva2VuLCBGbG9hdD4gcm93IDogYWxsVG9rZW5zLmVudHJ5U2V0KCkpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L3Rva2VuYWxsb2NhdG9yL09mZmxpbmVUb2tlbkFsbG9jYXRvclRlc3RVdGlscy5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RodC90b2tlbmFsbG9jYXRvci9PZmZsaW5lVG9rZW5BbGxvY2F0b3JUZXN0VXRpbHMuamF2YQppbmRleCBlNTgwNDYxLi5jMTM5NzYwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZGh0L3Rva2VuYWxsb2NhdG9yL09mZmxpbmVUb2tlbkFsbG9jYXRvclRlc3RVdGlscy5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaHQvdG9rZW5hbGxvY2F0b3IvT2ZmbGluZVRva2VuQWxsb2NhdG9yVGVzdFV0aWxzLmphdmEKQEAgLTkxLDEzICs5MSwxMyBAQAogICAgICAgICB9CiAKICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHdhcm4oU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRoKQorICAgICAgICBwdWJsaWMgdm9pZCB3YXJuKFRocm93YWJsZSB0aCwgU3RyaW5nIG1zZykKICAgICAgICAgewogICAgICAgICAgICAgLy8gV2UgY2FuIG9ubHkgZ3VhcmFudGVlIHRoYXQgb3duZXJzaGlwIHN0ZGV2IHdvbid0IGluY3JlYXNlIGFib3ZlIHRoZSB3YXJuIHRocmVzaG9sZCBmb3IgcmFja3M9PTEgb3IgcmFja3M9PXJmCiAgICAgICAgICAgICBpZiAocmFja3MgPT0gMSB8fCByYWNrcyA9PSByZikKICAgICAgICAgICAgICAgICBmYWlsKG1zZyk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc3VwZXIud2Fybihtc2csIHRoKTsKKyAgICAgICAgICAgICAgICBzdXBlci53YXJuKHRoLCBtc2cpOwogICAgICAgICB9CiAgICAgfQotfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9kaWFnL3N0b3JlL0RpYWdub3N0aWNFdmVudE1lbW9yeVN0b3JlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RpYWcvc3RvcmUvRGlhZ25vc3RpY0V2ZW50TWVtb3J5U3RvcmVUZXN0LmphdmEKaW5kZXggNWU4OTdiNi4uOTY0NzUxOSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RpYWcvc3RvcmUvRGlhZ25vc3RpY0V2ZW50TWVtb3J5U3RvcmVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2RpYWcvc3RvcmUvRGlhZ25vc3RpY0V2ZW50TWVtb3J5U3RvcmVUZXN0LmphdmEKQEAgLTY2LDE1ICs2NiwxNSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzLnNpemUoKSk7CiAKICAgICAgICAgTWFwLkVudHJ5PExvbmcsIERpYWdub3N0aWNFdmVudD4gZW50cnkgPSByZXMucG9sbEZpcnN0RW50cnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDEpLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoMSksIGVudHJ5LmdldEtleSgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShlMSwgZW50cnkuZ2V0VmFsdWUoKSk7CiAKICAgICAgICAgZW50cnkgPSByZXMucG9sbEZpcnN0RW50cnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDIpLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoMiksIGVudHJ5LmdldEtleSgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShlMiwgZW50cnkuZ2V0VmFsdWUoKSk7CiAKICAgICAgICAgZW50cnkgPSByZXMucG9sbEZpcnN0RW50cnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDMpLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoMyksIGVudHJ5LmdldEtleSgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShlMywgZW50cnkuZ2V0VmFsdWUoKSk7CiAgICAgfQogCkBAIC05NSwxMSArOTUsMTEgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlcy5zaXplKCkpOwogCiAgICAgICAgIE1hcC5FbnRyeTxMb25nLCBEaWFnbm9zdGljRXZlbnQ+IGVudHJ5ID0gcmVzLnBvbGxGaXJzdEVudHJ5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgTG9uZygxKSwgZW50cnkuZ2V0S2V5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy52YWx1ZU9mKDEpLCBlbnRyeS5nZXRLZXkoKSk7CiAgICAgICAgIGFzc2VydFNhbWUoZTEsIGVudHJ5LmdldFZhbHVlKCkpOwogCiAgICAgICAgIGVudHJ5ID0gcmVzLnBvbGxMYXN0RW50cnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDIpLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoMiksIGVudHJ5LmdldEtleSgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShlMiwgZW50cnkuZ2V0VmFsdWUoKSk7CiAgICAgfQogCkBAIC0xMjIsMTEgKzEyMiwxMSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzLnNpemUoKSk7CiAKICAgICAgICAgTWFwLkVudHJ5PExvbmcsIERpYWdub3N0aWNFdmVudD4gZW50cnkgPSByZXMucG9sbEZpcnN0RW50cnkoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDIpLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoMiksIGVudHJ5LmdldEtleSgpKTsKICAgICAgICAgYXNzZXJ0U2FtZShlMiwgZW50cnkuZ2V0VmFsdWUoKSk7CiAKICAgICAgICAgZW50cnkgPSByZXMucG9sbExhc3RFbnRyeSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvbmcoMyksIGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZigzKSwgZW50cnkuZ2V0S2V5KCkpOwogICAgICAgICBhc3NlcnRTYW1lKGUzLCBlbnRyeS5nZXRWYWx1ZSgpKTsKICAgICB9CiAKQEAgLTE1MSwxMSArMTUxLDExIEBACiAgICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuc2l6ZSgpKTsKIAogICAgICAgICBNYXAuRW50cnk8TG9uZywgRGlhZ25vc3RpY0V2ZW50PiBlbnRyeSA9IHJlcy5wb2xsRmlyc3RFbnRyeSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvbmcoNCksIGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZig0KSwgZW50cnkuZ2V0S2V5KCkpOwogICAgICAgICBhc3NlcnRTYW1lKGUyLCBlbnRyeS5nZXRWYWx1ZSgpKTsKIAogICAgICAgICBlbnRyeSA9IHJlcy5wb2xsRmlyc3RFbnRyeSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvbmcoNSksIGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZig1KSwgZW50cnkuZ2V0S2V5KCkpOwogICAgICAgICBhc3NlcnRTYW1lKGUzLCBlbnRyeS5nZXRWYWx1ZSgpKTsKIAogICAgICAgICBzdG9yZS5zdG9yZShuZXcgVGVzdEV2ZW50MSgpKTsgLy8gNwpAQCAtMTY0LDcgKzE2NCw3IEBACiAKICAgICAgICAgcmVzID0gc3RvcmUuc2Nhbig0TCwgMik7CiAgICAgICAgIGFzc2VydEVxdWFscygyLCByZXMuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDcpLCByZXMucG9sbEZpcnN0RW50cnkoKS5nZXRLZXkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgTG9uZyg4KSwgcmVzLnBvbGxMYXN0RW50cnkoKS5nZXRLZXkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoNyksIHJlcy5wb2xsRmlyc3RFbnRyeSgpLmdldEtleSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZig4KSwgcmVzLnBvbGxMYXN0RW50cnkoKS5nZXRLZXkoKSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9GYWlsdXJlRGV0ZWN0b3JUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0ZhaWx1cmVEZXRlY3RvclRlc3QuamF2YQppbmRleCA3N2ZhYmVmLi44ZWMzZGFlIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0ZhaWx1cmVEZXRlY3RvclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0ZhaWx1cmVEZXRlY3RvclRlc3QuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuVG9rZW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuTUFYX0xPQ0FMX1BBVVNFX0lOX01TOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogCiBwdWJsaWMgY2xhc3MgRmFpbHVyZURldGVjdG9yVGVzdApAQCAtNDUsNyArNDYsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpCiAgICAgewogICAgICAgICAvLyBzbG93IHVuaXQgdGVzdHMgY2FuIGNhdXNlIHByb2JsZW1zIHdpdGggRmFpbHVyZURldGVjdG9yJ3MgR0MgcGF1c2UgaGFuZGxpbmcKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEubWF4X2xvY2FsX3BhdXNlX2luX21zIiwgIjIwMDAwIik7CisgICAgICAgIE1BWF9MT0NBTF9QQVVTRV9JTl9NUy5zZXRMb25nKDIwMDAwKTsKIAogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLnN0YXJ0KCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0dvc3NpcGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9Hb3NzaXBlclRlc3QuamF2YQppbmRleCA2ODg0MWVhLi40NjE0ODM2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL0dvc3NpcGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvR29zc2lwZXJUZXN0LmphdmEKQEAgLTIyLDEyICsyMiwxNSBAQAogaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlVVSUQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLm5ldC5JbmV0QWRkcmVzc2VzOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKQEAgLTQ2LDIwICs0OSwyNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU2VlZFByb3ZpZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuVG9rZW5NZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNhc3NhbmRyYUdlbmVyYXRvcnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2Fzc2FuZHJhVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOworaW1wb3J0IG9yZy5xdWlja3RoZW9yaWVzLmNvcmUuR2VuOworaW1wb3J0IG9yZy5xdWlja3RoZW9yaWVzLmltcGwuQ29uc3RyYWludDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLnF1aWNrdGhlb3JpZXMuUXVpY2tUaGVvcnkucXQ7CiAKIHB1YmxpYyBjbGFzcyBHb3NzaXBlclRlc3QKIHsKICAgICBzdGF0aWMKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShHb3NzaXBlci5Qcm9wcy5ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OLCAidHJ1ZSIpOworICAgICAgICBHT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTi5zZXRCb29sZWFuKHRydWUpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLnN0YXJ0KCk7CiAgICAgfQpAQCAtNDE5LDYgKzQyOCw4OSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBvcmRlcmluZ0NvbXBhcmF0b3IoKQorICAgIHsKKyAgICAgICAgcXQoKS5mb3JBbGwoZXBTdGF0ZU1hcEdlbigpKS5jaGVja0Fzc2VydChtYXAgLT4geworICAgICAgICAgICAgQ29tcGFyYXRvcjxNYXAuRW50cnk8SW5ldEFkZHJlc3NBbmRQb3J0LCBFbmRwb2ludFN0YXRlPj4gY29tcCA9IEdvc3NpcGVyLnN0YXRlT3JkZXJNYXAoKTsKKyAgICAgICAgICAgIExpc3Q8TWFwLkVudHJ5PEluZXRBZGRyZXNzQW5kUG9ydCwgRW5kcG9pbnRTdGF0ZT4+IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDw+KG1hcC5lbnRyeVNldCgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbGVtZW50cy5zaXplKCk7IGorKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+IGUxID0gZWxlbWVudHMuZ2V0KGkpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGUxQm9vdHN0cmFwcGluZyA9IFZlcnNpb25lZFZhbHVlLkJPT1RTVFJBUFBJTkdfU1RBVFVTLmNvbnRhaW5zKEdvc3NpcGVyLmdldEdvc3NpcFN0YXR1cyhlMS5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+IGUyID0gZWxlbWVudHMuZ2V0KGopOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGUyQm9vdHN0cmFwcGluZyA9IFZlcnNpb25lZFZhbHVlLkJPT1RTVFJBUFBJTkdfU1RBVFVTLmNvbnRhaW5zKEdvc3NpcGVyLmdldEdvc3NpcFN0YXR1cyhlMi5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIE9yZGVyaW5nIG9yZGVyaW5nID0gT3JkZXJpbmcuY29tcGFyZShjb21wLCBlMSwgZTIpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChlMUJvb3RzdHJhcHBpbmcgPT0gZTJCb290c3RyYXBwaW5nKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBnZW5lcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBPcmRlcmluZyBzdWIgPSBPcmRlcmluZy5jb21wYXJlKGUxLmdldFZhbHVlKCkuZ2V0SGVhcnRCZWF0U3RhdGUoKS5nZXRHZW5lcmF0aW9uKCksIGUyLmdldFZhbHVlKCkuZ2V0SGVhcnRCZWF0U3RhdGUoKS5nZXRHZW5lcmF0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YiA9PSBPcmRlcmluZy5FUSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBhZGRyZXNzV1BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBPcmRlcmluZy5jb21wYXJlKGUxLmdldEtleSgpLCBlMi5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQob3JkZXJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRlc2NyaWJlZEFzKCJCb3RoIGVsZW1lbnRzIGJvb3RzdHJhcCBjaGVjayB3ZXJlIGVxdWFsOiAlcyA9PSAlcyIsIGUxQm9vdHN0cmFwcGluZywgZTJCb290c3RyYXBwaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oc3ViKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChlMUJvb3RzdHJhcHBpbmcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChvcmRlcmluZykuaXNFcXVhbFRvKE9yZGVyaW5nLkdUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChvcmRlcmluZykuaXNFcXVhbFRvKE9yZGVyaW5nLkxUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZW51bSBPcmRlcmluZworICAgIHsKKyAgICAgICAgTFQsIEVRLCBHVDsKKworICAgICAgICBzdGF0aWMgPFQ+IE9yZGVyaW5nIGNvbXBhcmUoQ29tcGFyYXRvcjxUPiBjb21wYXJhdG9yLCBUIGEsIFQgYikKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHJjID0gY29tcGFyYXRvci5jb21wYXJlKGEsIGIpOworICAgICAgICAgICAgaWYgKHJjIDwgMCkgcmV0dXJuIExUOworICAgICAgICAgICAgaWYgKHJjID09IDApIHJldHVybiBFUTsKKyAgICAgICAgICAgIHJldHVybiBHVDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyA8VCBleHRlbmRzIENvbXBhcmFibGU8VD4+IE9yZGVyaW5nIGNvbXBhcmUoVCBhLCBUIGIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlKENvbXBhcmF0b3IubmF0dXJhbE9yZGVyKCksIGEsIGIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgR2VuPE1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+PiBlcFN0YXRlTWFwR2VuKCkKKyAgICB7CisgICAgICAgIEdlbjxJbmV0QWRkcmVzc0FuZFBvcnQ+IGFkZHJlc3NBbmRQb3J0cyA9IENhc3NhbmRyYUdlbmVyYXRvcnMuSU5FVF9BRERSRVNTX0FORF9QT1JUX0dFTjsKKyAgICAgICAgR2VuPEVuZHBvaW50U3RhdGU+IHN0YXRlcyA9IENhc3NhbmRyYUdlbmVyYXRvcnMuZW5kcG9pbnRTdGF0ZXMoKTsKKyAgICAgICAgQ29uc3RyYWludCBzaXplR2VuID0gQ29uc3RyYWludC5iZXR3ZWVuKDIsIDEwKTsKKyAgICAgICAgR2VuPE1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+PiBtYXBHZW4gPSBycyAtPiB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IE1hdGgudG9JbnRFeGFjdChycy5uZXh0KHNpemVHZW4pKTsKKyAgICAgICAgICAgIE1hcDxJbmV0QWRkcmVzc0FuZFBvcnQsIEVuZHBvaW50U3RhdGU+IG1hcCA9IE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoc2l6ZSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBhZGRyZXNzID0gYWRkcmVzc0FuZFBvcnRzLmdlbmVyYXRlKHJzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5jb250YWluc0tleShhZGRyZXNzKSkgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoYWRkcmVzcywgc3RhdGVzLmdlbmVyYXRlKHJzKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH07CisgICAgICAgIHJldHVybiBtYXBHZW47CisgICAgfQorCiAgICAgc3RhdGljIGNsYXNzIFNpbXBsZVN0YXRlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJRW5kcG9pbnRTdGF0ZUNoYW5nZVN1YnNjcmliZXIKICAgICB7CiAgICAgICAgIHN0YXRpYyBjbGFzcyBPbkNoYW5nZVBhcmFtcwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9QZW5kaW5nUmFuZ2VDYWxjdWxhdG9yU2VydmljZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvUGVuZGluZ1JhbmdlQ2FsY3VsYXRvclNlcnZpY2VUZXN0LmphdmEKaW5kZXggMGQ2ZDE5OS4uMWY3NTg3NiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9QZW5kaW5nUmFuZ2VDYWxjdWxhdG9yU2VydmljZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL1BlbmRpbmdSYW5nZUNhbGN1bGF0b3JTZXJ2aWNlVGVzdC5qYXZhCkBAIC0zOSw2ICszOSw3IEBACiBpbXBvcnQgb3JnLmpib3NzLmJ5dGVtYW4uY29udHJpYi5ibXVuaXQuQk1SdWxlOwogaW1wb3J0IG9yZy5qYm9zcy5ieXRlbWFuLmNvbnRyaWIuYm11bml0LkJNVW5pdFJ1bm5lcjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIApAQCAtNTQsNyArNTUsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoR29zc2lwZXIuUHJvcHMuRElTQUJMRV9USFJFQURfVkFMSURBVElPTiwgInRydWUiKTsKKyAgICAgICAgR09TU0lQX0RJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04uc2V0Qm9vbGVhbih0cnVlKTsKICAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKICAgICAgICAgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaW5pdFNlcnZlcigpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvU2hhZG93Um91bmRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvZ21zL1NoYWRvd1JvdW5kVGVzdC5qYXZhCmluZGV4IDM4MWVkYjguLjMzZDlhMTIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9nbXMvU2hhZG93Um91bmRUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2dtcy9TaGFkb3dSb3VuZFRlc3QuamF2YQpAQCAtMzMsMTEgKzMzLDExIEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TeXN0ZW1LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JRW5kcG9pbnRTbml0Y2g7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CkBAIC00OSw2ICs0OSw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkFVVE9fQk9PVFNUUkFQOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5Nb2NrTWVzc2FnaW5nU2VydmljZS52ZXJiOwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwpAQCAtNjEsNyArNjMsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVcCgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25maWciLCAiY2Fzc2FuZHJhLXNlZWRzLnlhbWwiKTsKKyAgICAgICAgQ0FTU0FORFJBX0NPTkZJRy5zZXRTdHJpbmcoImNhc3NhbmRyYS1zZWVkcy55YW1sIik7CiAKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5zdGFydCgpOwpAQCAtMTcxLDggKzE3Myw3IEBACiAgICAgICAgICAgICAgICAgfSwgMSk7CiAKIAotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJhdXRvX2Jvb3RzdHJhcCIsICJmYWxzZSIpOwotICAgICAgICB0cnkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KEFVVE9fQk9PVFNUUkFQLCBmYWxzZSkpCiAgICAgICAgIHsKICAgICAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmNoZWNrRm9yRW5kcG9pbnRDb2xsaXNpb24oU3lzdGVtS2V5c3BhY2UuZ2V0T3JJbml0aWFsaXplTG9jYWxIb3N0SWQoKSwgU3lzdGVtS2V5c3BhY2UubG9hZEhvc3RJZHMoKS5rZXlTZXQoKSk7CiAgICAgICAgIH0KQEAgLTE4MCw3ICsxODEsNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuYWJsZSB0byBnb3NzaXAgd2l0aCBhbnkgcGVlcnMiLCBlLmdldE1lc3NhZ2UoKSk7CiAgICAgICAgIH0KLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJhdXRvX2Jvb3RzdHJhcCIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMDksOSArMjA5LDEwIEBACiAgICAgICAgICAgICAgICAgfSwgMSk7CiAKIAotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoQ29uZmlnLlBST1BFUlRZX1BSRUZJWCArICJhdXRvX2Jvb3RzdHJhcCIsICJmYWxzZSIpOwotICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5jaGVja0ZvckVuZHBvaW50Q29sbGlzaW9uKFN5c3RlbUtleXNwYWNlLmdldE9ySW5pdGlhbGl6ZUxvY2FsSG9zdElkKCksIFN5c3RlbUtleXNwYWNlLmxvYWRIb3N0SWRzKCkua2V5U2V0KCkpOwotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShDb25maWcuUFJPUEVSVFlfUFJFRklYICsgImF1dG9fYm9vdHN0cmFwIik7CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChBVVRPX0JPT1RTVFJBUCwgZmFsc2UpKQorICAgICAgICB7CisgICAgICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5jaGVja0ZvckVuZHBvaW50Q29sbGlzaW9uKFN5c3RlbUtleXNwYWNlLmdldE9ySW5pdGlhbGl6ZUxvY2FsSG9zdElkKCksIFN5c3RlbUtleXNwYWNlLmxvYWRIb3N0SWRzKCkua2V5U2V0KCkpOworICAgICAgICB9CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvQ2hlY2tzdW1tZWREYXRhSW5wdXRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvQ2hlY2tzdW1tZWREYXRhSW5wdXRUZXN0LmphdmEKaW5kZXggY2MyOTE2My4uZGE5ZjdkZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0NoZWNrc3VtbWVkRGF0YUlucHV0VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9DaGVja3N1bW1lZERhdGFJbnB1dFRlc3QuamF2YQpAQCAtMTcsMjcgKzE3LDE5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaGludHM7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKIAogcHVibGljIGNsYXNzIENoZWNrc3VtbWVkRGF0YUlucHV0VGVzdAogewpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0RUZXN0U2VyaWFsaXplci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0RUZXN0U2VyaWFsaXplci5qYXZhCmluZGV4IDYxYmQ3N2MuLjAyMjFjNTIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9EVGVzdFNlcmlhbGl6ZXIuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvRFRlc3RTZXJpYWxpemVyLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIFVVSURTZXJpYWxpemVyLnNlcmlhbGl6ZXIuc2VyaWFsaXplKG1lc3NhZ2UuaG9zdElkLCBvdXQsIHZlcnNpb24pOwotICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoMCk7CisgICAgICAgIG91dC53cml0ZVVuc2lnbmVkVkludDMyKDApOwogICAgICAgICBtZXNzYWdlLnVua25vd25UYWJsZUlELnNlcmlhbGl6ZShvdXQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRXcml0ZVRUTFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9oaW50cy9IaW50V3JpdGVUVExUZXN0LmphdmEKaW5kZXggZTI0ZmY3Ni4uZjgxNDI0NSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2hpbnRzL0hpbnRXcml0ZVRUTFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaGludHMvSGludFdyaXRlVFRMVGVzdC5qYXZhCkBAIC00NCw2ICs0NCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfTUFYX0hJTlRfVFRMOworCiBwdWJsaWMgY2xhc3MgSGludFdyaXRlVFRMVGVzdAogewogICAgIHByaXZhdGUgc3RhdGljIGludCBUVEwgPSA1MDA7CkBAIC04NCw3ICs4Niw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5tYXhIaW50VFRMIiwgSW50ZWdlci50b1N0cmluZyhUVEwpKTsKKyAgICAgICAgQ0FTU0FORFJBX01BWF9ISU5UX1RUTC5zZXRJbnQoVFRMKTsKICAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKICAgICAgICAgVGFibGVNZXRhZGF0YSB0Ym0gPSBDcmVhdGVUYWJsZVN0YXRlbWVudC5wYXJzZSgiQ1JFQVRFIFRBQkxFIHRibCAoayBJTlQgUFJJTUFSWSBLRVksIHYgSU5UKSIsICJrcyIpLmdjR3JhY2VTZWNvbmRzKEdDX0dSQUNFKS5idWlsZCgpOwogICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2UoImtzIiwgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLCB0Ym0pOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvU0FTSUluZGV4VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvU0FTSUluZGV4VGVzdC5qYXZhCmluZGV4IDQ0MWQ3YjAuLjNjMzMzMjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL1NBU0lJbmRleFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9TQVNJSW5kZXhUZXN0LmphdmEKQEAgLTI0LDEwICsyNCwyMSBAQAogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN5c3RlbXM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKIGltcG9ydCBqYXZhLm5pby5maWxlLlN0YW5kYXJkT3Blbk9wdGlvbjsKIGltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRyaWJ1dGVzOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207CkBAIC0zNiwzNSArNDcsNTggQEAKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5PcGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXg7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5UZXJtOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkluZGV4VGFyZ2V0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRhdGFSYW5nZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuTXV0YXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUmFuZ2VSZWFkQ29tbWFuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWFkQ29tbWFuZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWFkRXhlY3V0aW9uQ29udHJvbGxlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5EYXRhTGltaXRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Sb3dGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5TU1RhYmxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFzY2lpVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxpc3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5WYWx1ZUFjY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uVXBkYXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuVW5maWx0ZXJlZFBhcnRpdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJUcmVlUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQnVmZmVyQ2VsbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5JbmRleDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLmFuYWx5emVyLkFic3RyYWN0QW5hbHl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguc2FzaS5hbmFseXplci5EZWxpbWl0ZXJBbmFseXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLmFuYWx5emVyLk5vT3BBbmFseXplcjsKQEAgLTgwLDExICsxMTQsMTYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbmRleC5zYXNpLnV0aWxzLlJhbmdlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuSW5kZXhTdW1tYXJ5TWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5TWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbHVtbk1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5JbmRleE1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuVHlwZVNlcmlhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5zbmFwc2hvdC5TbmFwc2hvdE1hbmlmZXN0OwpAQCAtOTQsMTMgKzEzMyw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKIGltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5VbmludGVycnVwdGlibGVzOwotCi1pbXBvcnQgb3JnLmp1bml0Lio7Ci0KIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlMTElTRUNPTkRTOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlVGVzdC5nZXRTbmFwc2hvdE1hbmlmZXN0QW5kU2NoZW1hRmlsZVNpemVzOwogCiBwdWJsaWMgY2xhc3MgU0FTSUluZGV4VGVzdApAQCAtMTA4LDcgKzE0Miw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVBhcnRpdGlvbmVyIFBBUlRJVElPTkVSOwogCiAgICAgc3RhdGljIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIiwgImNhc3NhbmRyYS1tdXJtdXIueWFtbCIpOworICAgICAgICBDQVNTQU5EUkFfQ09ORklHLnNldFN0cmluZygiY2Fzc2FuZHJhLW11cm11ci55YW1sIik7CiAgICAgICAgIFBBUlRJVElPTkVSID0gTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlOwogICAgIH0KIApAQCAtMTkyLDcgKzIyNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmdldEtleXNwYWNlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZS5nZXRDb2x1bW5GYW1pbHlOYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmRlc2NyaXB0b3IuaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmRlc2NyaXB0b3IuZm9ybWF0VHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbi5mb3JtYXQpOwogCiAgICAgICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IHNuYXBzaG90U1NUYWJsZXMuZ2V0KHNuYXBzaG90U1NUYWJsZSk7CiAKQEAgLTIwMSw4ICsyMzUsOCBAQAogCiAgICAgICAgICAgICAgICAgZm9yIChDb21wb25lbnQgYyA6IGNvbXBvbmVudHMpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb25nIGNvbXBvbmVudFNpemUgPSBGaWxlcy5zaXplKFBhdGhzLmdldChzbmFwc2hvdFNTVGFibGUuZmlsZW5hbWVGb3IoYykpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKENvbXBvbmVudC5UeXBlLmZyb21SZXByZXNlbnRhdGlvbihjLm5hbWUpID09IENvbXBvbmVudC5UeXBlLlNFQ09OREFSWV9JTkRFWCkKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBjb21wb25lbnRTaXplID0gc25hcHNob3RTU1RhYmxlLmZpbGVGb3IoYykubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChDb21wb25lbnQuVHlwZS5mcm9tUmVwcmVzZW50YXRpb24oYy5uYW1lLCBzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbi5mb3JtYXQpID09IENvbXBvbmVudHMuVHlwZXMuU0VDT05EQVJZX0lOREVYKQogICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTaXplICs9IGNvbXBvbmVudFNpemU7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlU2l6ZSArPSBjb21wb25lbnRTaXplOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvZGlzay9QZXJTU1RhYmxlSW5kZXhXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9kaXNrL1BlclNTVGFibGVJbmRleFdyaXRlclRlc3QuamF2YQppbmRleCBhZDBjYWZmLi42NzA3YWE1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9kaXNrL1BlclNTVGFibGVJbmRleFdyaXRlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9kaXNrL1BlclNTVGFibGVJbmRleFdyaXRlclRlc3QuamF2YQpAQCAtMTgsMjUgKzE4LDM4IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kuZGlzazsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKIAoraW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5GdXR1cmVzOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxvbmdUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5CVHJlZVJvdzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJ1ZmZlckNlbGw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kuU0FTSUluZGV4OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kudXRpbHMuUmFuZ2VJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU0Vycm9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CkBAIC00OSwxMSArNjIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRnV0dXJlczsKLQotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CiAKIHB1YmxpYyBjbGFzcyBQZXJTU1RhYmxlSW5kZXhXcml0ZXJUZXN0IGV4dGVuZHMgU2NoZW1hTG9hZGVyCiB7CkBAIC02Myw3ICs3Miw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvYWRTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIiwgImNhc3NhbmRyYS1tdXJtdXIueWFtbCIpOworICAgICAgICBDQVNTQU5EUkFfQ09ORklHLnNldFN0cmluZygiY2Fzc2FuZHJhLW11cm11ci55YW1sIik7CiAgICAgICAgIFNjaGVtYUxvYWRlci5sb2FkU2NoZW1hKCk7CiAgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlTmV3S2V5c3BhY2UoS2V5c3BhY2VNZXRhZGF0YS5jcmVhdGUoS1NfTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGVUcmFuc2llbnQoMSksCkBAIC0xMTIsNyArMTIxLDkgQEAKIAogICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxEZWNvcmF0ZWRLZXksIFJvdz4ga2V5ID0ga2V5SXRlcmF0b3IubmV4dCgpOwogCi0gICAgICAgICAgICAgICAgaW5kZXhXcml0ZXIuc3RhcnRQYXJ0aXRpb24oa2V5LmdldEtleSgpLCBwb3NpdGlvbisrKTsKKworICAgICAgICAgICAgICAgIGluZGV4V3JpdGVyLnN0YXJ0UGFydGl0aW9uKGtleS5nZXRLZXkoKSwgcG9zaXRpb24sIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBwb3NpdGlvbisrOwogICAgICAgICAgICAgICAgIGluZGV4V3JpdGVyLm5leHRVbmZpbHRlcmVkQ2x1c3RlcihrZXkuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAKQEAgLTEyNiw3ICsxMzcsNyBAQAogICAgICAgICBmb3IgKFN0cmluZyBzZWdtZW50IDogc2VnbWVudHMpCiAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShuZXcgRmlsZShzZWdtZW50KS5leGlzdHMoKSk7CiAKLSAgICAgICAgU3RyaW5nIGluZGV4RmlsZSA9IGluZGV4V3JpdGVyLmluZGV4ZXMuZ2V0KGNvbHVtbikuZmlsZW5hbWUodHJ1ZSk7CisgICAgICAgIEZpbGUgaW5kZXhGaWxlID0gaW5kZXhXcml0ZXIuaW5kZXhlcy5nZXQoY29sdW1uKS5maWxlKHRydWUpOwogCiAgICAgICAgIC8vIGZpbmFsIGZsdXNoCiAgICAgICAgIGluZGV4V3JpdGVyLmNvbXBsZXRlKCk7CkBAIC0xMzQsNyArMTQ1LDcgQEAKICAgICAgICAgZm9yIChTdHJpbmcgc2VnbWVudCA6IHNlZ21lbnRzKQogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG5ldyBGaWxlKHNlZ21lbnQpLmV4aXN0cygpKTsKIAotICAgICAgICBPbkRpc2tJbmRleCBpbmRleCA9IG5ldyBPbkRpc2tJbmRleChuZXcgRmlsZShpbmRleEZpbGUpLCBJbnQzMlR5cGUuaW5zdGFuY2UsIGtleVBvc2l0aW9uIC0+IHsKKyAgICAgICAgT25EaXNrSW5kZXggaW5kZXggPSBuZXcgT25EaXNrSW5kZXgoaW5kZXhGaWxlLCBJbnQzMlR5cGUuaW5zdGFuY2UsIGtleVBvc2l0aW9uIC0+IHsKICAgICAgICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoU3RyaW5nLmZvcm1hdChrZXlGb3JtYXQsIGtleVBvc2l0aW9uKSk7CiAgICAgICAgICAgICByZXR1cm4gY2ZzLm1ldGFkYXRhKCkucGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoa2V5KTsKICAgICAgICAgfSk7CkBAIC0yMzMsNyArMjQ0LDcgQEAKICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShuZXcgRmlsZShzZWdtZW50KS5leGlzdHMoKSk7CiAKICAgICAgICAgLy8gYW5kIGNvbWJpbmVkIGluZGV4IGRvZXNuJ3QgZXhpc3QgZWl0aGVyCi0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShuZXcgRmlsZShpbmRleC5vdXRwdXRGaWxlKS5leGlzdHMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShpbmRleC5vdXRwdXRGaWxlLmV4aXN0cygpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlU2VnbWVudChUYWJsZU1ldGFkYXRhIG1ldGFkYXRhLCBQZXJTU1RhYmxlSW5kZXhXcml0ZXIuSW5kZXggaW5kZXgsIE1hcDxMb25nLCBTZXQ8SW50ZWdlcj4+IGRhdGEpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS9wbGFuL09wZXJhdGlvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL3BsYW4vT3BlcmF0aW9uVGVzdC5qYXZhCmluZGV4IDg2MjBmNWMuLjVmZmViY2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL3BsYW4vT3BlcmF0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL3BsYW4vT3BlcmF0aW9uVGVzdC5qYXZhCkBAIC00Myw2ICs0Myw4IEBACiAKIGltcG9ydCBvcmcuanVuaXQuKjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CisKIHB1YmxpYyBjbGFzcyBPcGVyYXRpb25UZXN0IGV4dGVuZHMgU2NoZW1hTG9hZGVyCiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtTX05BTUUgPSAic2FzaSI7CkBAIC01Nyw3ICs1OSw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGxvYWRTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIiwgImNhc3NhbmRyYS1tdXJtdXIueWFtbCIpOworICAgICAgICBDQVNTQU5EUkFfQ09ORklHLnNldFN0cmluZygiY2Fzc2FuZHJhLW11cm11ci55YW1sIik7CiAgICAgICAgIFNjaGVtYUxvYWRlci5sb2FkU2NoZW1hKCk7CiAgICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLU19OQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlVHJhbnNpZW50KDEpLApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvdXRpbHMvTWFwcGVkQnVmZmVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2luZGV4L3Nhc2kvdXRpbHMvTWFwcGVkQnVmZmVyVGVzdC5qYXZhCmluZGV4IGRjZDc5YjkuLjMzMjkwNmIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pbmRleC9zYXNpL3V0aWxzL01hcHBlZEJ1ZmZlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW5kZXgvc2FzaS91dGlscy9NYXBwZWRCdWZmZXJUZXN0LmphdmEKQEAgLTE3LDIwICsxNywyMSBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LnNhc2kudXRpbHM7CiAKLWltcG9ydCBqYXZhLmlvLio7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZExvY2FsUmFuZG9tOwogCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTG9uZ1R5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5DaGFubmVsUHJveHk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogCi1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQogcHVibGljIGNsYXNzIE1hcHBlZEJ1ZmZlclRlc3QKIHsKICAgICBAVGVzdApAQCAtNDYxLDcgKzQ2Miw3IEBACiAKICAgICAgICAgZmlsZS5nZXRGRCgpLnN5bmMoKTsKIAotICAgICAgICB0cnkgKE1hcHBlZEJ1ZmZlciBidWZmZXIgPSBuZXcgTWFwcGVkQnVmZmVyKG5ldyBDaGFubmVsUHJveHkodG1wLmFic29sdXRlUGF0aCgpLCBmaWxlLmdldENoYW5uZWwoKSkpKQorICAgICAgICB0cnkgKE1hcHBlZEJ1ZmZlciBidWZmZXIgPSBuZXcgTWFwcGVkQnVmZmVyKG5ldyBDaGFubmVsUHJveHkodG1wLCBmaWxlLmdldENoYW5uZWwoKSkpKQogICAgICAgICB7CiAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG51bVZhbHVlcyAqIDgsIGJ1ZmZlci5saW1pdCgpKTsKICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobnVtVmFsdWVzICogOCwgYnVmZmVyLmNhcGFjaXR5KCkpOwpAQCAtNTMwLDcgKzUzMSw3IEBACiAKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWFwcGVkQnVmZmVyKG5ldyBDaGFubmVsUHJveHkodGVzdEZpbGUuYWJzb2x1dGVQYXRoKCksIGZpbGUuZ2V0Q2hhbm5lbCgpKSwgbnVtUGFnZUJpdHMpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXBwZWRCdWZmZXIobmV3IENoYW5uZWxQcm94eSh0ZXN0RmlsZSwgZmlsZS5nZXRDaGFubmVsKCkpLCBudW1QYWdlQml0cyk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQogICAgICAgICB7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vQmxvb21GaWx0ZXJUcmFja2VyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL0Jsb29tRmlsdGVyVHJhY2tlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjZjJhNS4uMDAwMDAwMAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vQmxvb21GaWx0ZXJUcmFja2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbzsKLS8qCi0gKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqCi0gKi8KLQotCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkJsb29tRmlsdGVyVHJhY2tlcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLQotcHVibGljIGNsYXNzIEJsb29tRmlsdGVyVHJhY2tlclRlc3QKLXsKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRpbmdGYWxzZVBvc2l0aXZlcygpCi0gICAgewotICAgICAgICBCbG9vbUZpbHRlclRyYWNrZXIgYmZ0ID0gbmV3IEJsb29tRmlsdGVyVHJhY2tlcigpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIGJmdC5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwTCwgYmZ0LmdldFJlY2VudEZhbHNlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgYmZ0LmFkZEZhbHNlUG9zaXRpdmUoKTsKLSAgICAgICAgYmZ0LmFkZEZhbHNlUG9zaXRpdmUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDJMLCBiZnQuZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMkwsIGJmdC5nZXRSZWNlbnRGYWxzZVBvc2l0aXZlQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwTCwgYmZ0LmdldFJlY2VudEZhbHNlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDJMLCBiZnQuZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCkpOyAvLyBzYW5pdHkgY2hlY2sKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRpbmdUcnVlUG9zaXRpdmVzKCkKLSAgICB7Ci0gICAgICAgIEJsb29tRmlsdGVyVHJhY2tlciBiZnQgPSBuZXcgQmxvb21GaWx0ZXJUcmFja2VyKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwTCwgYmZ0LmdldFRydWVQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIGJmdC5nZXRSZWNlbnRUcnVlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgYmZ0LmFkZFRydWVQb3NpdGl2ZSgpOwotICAgICAgICBiZnQuYWRkVHJ1ZVBvc2l0aXZlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyTCwgYmZ0LmdldFRydWVQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMkwsIGJmdC5nZXRSZWNlbnRUcnVlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCBiZnQuZ2V0UmVjZW50VHJ1ZVBvc2l0aXZlQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyTCwgYmZ0LmdldFRydWVQb3NpdGl2ZUNvdW50KCkpOyAvLyBzYW5pdHkgY2hlY2sKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRpbmdUb09uZUxlYXZlc1RoZU90aGVyQWxvbmUoKQotICAgIHsKLSAgICAgICAgQmxvb21GaWx0ZXJUcmFja2VyIGJmdCA9IG5ldyBCbG9vbUZpbHRlclRyYWNrZXIoKTsKLSAgICAgICAgYmZ0LmFkZEZhbHNlUG9zaXRpdmUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCBiZnQuZ2V0VHJ1ZVBvc2l0aXZlQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwTCwgYmZ0LmdldFJlY2VudFRydWVQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBiZnQuYWRkVHJ1ZVBvc2l0aXZlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxTCwgYmZ0LmdldEZhbHNlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDFMLCBiZnQuZ2V0UmVjZW50RmFsc2VQb3NpdGl2ZUNvdW50KCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9EaXNrU3BhY2VNZXRyaWNzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL0Rpc2tTcGFjZU1ldHJpY3NUZXN0LmphdmEKaW5kZXggYmU4YjE2Mi4uNWVjYmE0NyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL0Rpc2tTcGFjZU1ldHJpY3NUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL0Rpc2tTcGFjZU1ldHJpY3NUZXN0LmphdmEKQEAgLTIxLDI2ICsyMSwzNCBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuU1NUYWJsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4U3VtbWFyeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5LkluZGV4U3VtbWFyeU1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5U3VwcG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0b3JhZ2VNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKIHB1YmxpYyBjbGFzcyBEaXNrU3BhY2VNZXRyaWNzVGVzdCBleHRlbmRzIENRTFRlc3RlcgogewogICAgIC8qKgpAQCAtNjcsNiArNzUsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgc3VtbWFyeVJlZGlzdHJpYnV0aW9uKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoSW5kZXhTdW1tYXJ5U3VwcG9ydC5pc1N1cHBvcnRlZEJ5KERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSkpOwogICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBiaWdpbnQsIFBSSU1BUlkgS0VZIChwaykpIFdJVEggbWluX2luZGV4X2ludGVydmFsPTEiKTsKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCk7CiAKQEAgLTEwMiwxOCArMTExLDM2IEBACiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RGlza1NwYWNlRXF1YWwoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQogICAgIHsKKyAgICAgICAgU2V0PFNTVGFibGVSZWFkZXI+IGxpdmVTU1RhYmxlcyA9IGNmcy5nZXRUcmFja2VyKCkuZ2V0VmlldygpLmxpdmVTU1RhYmxlcygpOwogICAgICAgICBsb25nIGxpdmVEaXNrU3BhY2VVc2VkID0gY2ZzLm1ldHJpYy5saXZlRGlza1NwYWNlVXNlZC5nZXRDb3VudCgpOwotICAgICAgICBsb25nIGFjdHVhbCA9IDA7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogY2ZzLmdldFRyYWNrZXIoKS5nZXRWaWV3KCkubGl2ZVNTVGFibGVzKCkpCi0gICAgICAgICAgICBhY3R1YWwgKz0gc3N0YWJsZS5ieXRlc09uRGlzaygpOworICAgICAgICBsb25nIGFjdHVhbCA9IGxpdmVTU1RhYmxlcy5zdHJlYW0oKS5tYXBUb0xvbmcoU1NUYWJsZVJlYWRlcjo6Ynl0ZXNPbkRpc2spLnN1bSgpOworICAgICAgICBsb25nIHVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkID0gY2ZzLm1ldHJpYy51bmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZC5nZXRDb3VudCgpOworICAgICAgICBsb25nIGFjdHVhbFVuY29tcHJlc3NlZCA9IGxpdmVTU1RhYmxlcy5zdHJlYW0oKS5tYXBUb0xvbmcoU1NUYWJsZVJlYWRlcjo6bG9naWNhbEJ5dGVzT25EaXNrKS5zdW0oKTsKIAotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJieXRlcyBvbiBkaXNrIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgbWV0cmljIGxpdmVEaXNrU3BhY2VVc2VkIiwgYWN0dWFsLCBsaXZlRGlza1NwYWNlVXNlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYnl0ZXMgb24gZGlzayBkb2VzIG5vdCBtYXRjaCBjdXJyZW50IG1ldHJpYyBMaXZlRGlza1NwYWNlVXNlZCIsIGFjdHVhbCwgbGl2ZURpc2tTcGFjZVVzZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJ5dGVzIG9uIGRpc2sgZG9lcyBub3QgbWF0Y2ggY3VycmVudCBtZXRyaWMgVW5jb21wcmVzc2VkTGl2ZURpc2tTcGFjZVVzZWQiLCBhY3R1YWxVbmNvbXByZXNzZWQsIHVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkKTsKKworICAgICAgICAvLyBLZXlzcGFjZS1sZXZlbCBtZXRyaWNzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHRhYmxlLWxldmVsIG1ldHJpY3MsIGFzIHRoZXJlIGlzIG9ubHkgb25lIHRhYmxlLgorICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLmtleXNwYWNlLm1ldHJpYy5saXZlRGlza1NwYWNlVXNlZC5nZXRWYWx1ZSgpLmxvbmdWYWx1ZSgpLCBsaXZlRGlza1NwYWNlVXNlZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhjZnMua2V5c3BhY2UubWV0cmljLnVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkLmdldFZhbHVlKCkubG9uZ1ZhbHVlKCksIHVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5rZXlzcGFjZS5tZXRyaWMudW5yZXBsaWNhdGVkTGl2ZURpc2tTcGFjZVVzZWQuZ2V0VmFsdWUoKS5sb25nVmFsdWUoKSwgbGl2ZURpc2tTcGFjZVVzZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLmtleXNwYWNlLm1ldHJpYy51bnJlcGxpY2F0ZWRVbmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZC5nZXRWYWx1ZSgpLmxvbmdWYWx1ZSgpLCB1bmNvbXByZXNzZWRMaXZlRGlza1NwYWNlVXNlZCk7CisKKyAgICAgICAgLy8gR2xvYmFsIGxvYWQgbWV0cmljcyBzaG91bGQgYmUgaW50ZXJuYWxseSBjb25zaXN0ZW50LCBnaXZlbiB0aGVyZSBpcyBubyByZXBsaWNhdGlvbiwgYnV0IHNsaWdodGx5IGdyZWF0ZXIKKyAgICAgICAgLy8gdGhhbiB0YWJsZSBhbmQga2V5c3BhY2UtbGV2ZWwgbWV0cmljcywgZ2l2ZW4gdGhlIGdsb2JhbCB2ZXJzaW9ucyBhY2NvdW50IGZvciBub24tdXNlciB0YWJsZXMuCisgICAgICAgIGxvbmcgZ2xvYmFsTG9hZCA9IFN0b3JhZ2VNZXRyaWNzLmxvYWQuZ2V0Q291bnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdsb2JhbExvYWQsIFN0b3JhZ2VNZXRyaWNzLnVucmVwbGljYXRlZExvYWQuZ2V0VmFsdWUoKS5sb25nVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZ2xvYmFsTG9hZCkuaXNHcmVhdGVyVGhhbihsaXZlRGlza1NwYWNlVXNlZCk7CisKKyAgICAgICAgbG9uZyBnbG9iYWxVbmNvbXByZXNzZWRMb2FkID0gU3RvcmFnZU1ldHJpY3MudW5jb21wcmVzc2VkTG9hZC5nZXRDb3VudCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2xvYmFsVW5jb21wcmVzc2VkTG9hZCwgU3RvcmFnZU1ldHJpY3MudW5yZXBsaWNhdGVkVW5jb21wcmVzc2VkTG9hZC5nZXRWYWx1ZSgpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChnbG9iYWxVbmNvbXByZXNzZWRMb2FkKS5pc0dyZWF0ZXJUaGFuKHVuY29tcHJlc3NlZExpdmVEaXNrU3BhY2VVc2VkKTsKIAogICAgICAgICAvLyB0b3RhbERpc2tTcGFjZVVzZWQgaXMgYmFzZWQgb2ZmIFNTdGFibGUgZGVsZXRlLCB3aGljaCBpcyBhc3luYzogTG9nVHJhbnNhY3Rpb24ncyB0aWR5IGVucXVldWVzIGluIFNjaGVkdWxlZEV4ZWN1dG9ycy5ub25QZXJpb2RpY1Rhc2tzCiAgICAgICAgIC8vIHdhaXQgZm9yIHRoZXJlIHRvIGJlIG5vIG1vcmUgcGVuZGluZyBzc3RhYmxlIHJlbGVhc2VzCiAgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uLndhaXRGb3JEZWxldGlvbnMoKTsKICAgICAgICAgbG9uZyB0b3RhbERpc2tTcGFjZVVzZWQgPSBjZnMubWV0cmljLnRvdGFsRGlza1NwYWNlVXNlZC5nZXRDb3VudCgpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJieXRlcyBvbiBkaXNrIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgbWV0cmljIHRvdGFsRGlza1NwYWNlVXNlZCIsIGFjdHVhbCwgdG90YWxEaXNrU3BhY2VVc2VkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJieXRlcyBvbiBkaXNrIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgbWV0cmljIHRvdGFsRGlza1NwYWNlVXNlZCIsIGFjdHVhbCwgdG90YWxEaXNrU3BhY2VVc2VkKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGluZGV4RG93bnNhbXBsZUNhbmNlbExhc3RTU1RhYmxlKENvbHVtbkZhbWlseVN0b3JlIGNmcykKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9jb21wcmVzcy9Db21wcmVzc2VkUmFuZG9tQWNjZXNzUmVhZGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzZWRSYW5kb21BY2Nlc3NSZWFkZXJUZXN0LmphdmEKaW5kZXggYzM5OGFjNC4uMmJmMTI3ZiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzZWRSYW5kb21BY2Nlc3NSZWFkZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzZWRSYW5kb21BY2Nlc3NSZWFkZXJUZXN0LmphdmEKQEAgLTIwLDExICsyMCwxMCBAQAogCiBpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJhbmRvbUFjY2Vzc0ZpbGU7IC8vY2hlY2tzdHlsZTogcGVybWl0IHRoaXMgaW1wb3J0CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKIAotaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC0zNCw5ICszMywxNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YVBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlck9wdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcHJlc3Npb25QYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuU3luY1V0aWw7CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwpAQCAtOTgsNyArMTA0LDcgQEAKICAgICAgICAgRmlsZSBmID0gRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlKCJjb21wcmVzc2VkNjc5MV8iLCAiMyIpOwogICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmLmFic29sdXRlUGF0aCgpOwogICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBzc3RhYmxlTWV0YWRhdGFDb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IobmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKEJ5dGVzVHlwZS5pbnN0YW5jZSkpOwotICAgICAgICB0cnkoQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbmV3IENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKGYsIGZpbGVuYW1lICsgIi5tZXRhZGF0YSIsCisgICAgICAgIHRyeShDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIoZiwgbmV3IEZpbGUoZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uUGFyYW1zLnNuYXBweSgzMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3N0YWJsZU1ldGFkYXRhQ29sbGVjdG9yKSkKQEAgLTExOSw5ICsxMjUsOCBAQAogICAgICAgICAgICAgd3JpdGVyLmZpbmlzaCgpOwogICAgICAgICB9CiAKLSAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZmlsZW5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29tcHJlc3Npb25NZXRhZGF0YShuZXcgQ29tcHJlc3Npb25NZXRhZGF0YShmaWxlbmFtZSArICIubWV0YWRhdGEiLCBmLmxlbmd0aCgpLCB0cnVlKSk7Ci0gICAgICAgICAgICAgRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgdHJ5IChDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXByZXNzaW9uTWV0YWRhdGEgPSBDb21wcmVzc2lvbk1ldGFkYXRhLm9wZW4obmV3IEZpbGUoZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiksIGYubGVuZ3RoKCksIHRydWUpOworICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmggPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGYpLndpdGhDb21wcmVzc2lvbk1ldGFkYXRhKGNvbXByZXNzaW9uTWV0YWRhdGEpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmcgcmVzID0gcmVhZGVyLnJlYWRMaW5lKCk7CkBAIC0xNTEsNyArMTU2LDcgQEAKICAgICAgICAgdHJ5CiAgICAgICAgIHsKICAgICAgICAgICAgIHdyaXRlU1NUYWJsZShmaWxlLCBDb21wcmVzc2lvblBhcmFtcy5zbmFwcHkoY2h1bmtMZW5ndGgpLCAxMCk7Ci0gICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIG1ldGFkYXRhID0gbmV3IENvbXByZXNzaW9uTWV0YWRhdGEoZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiwgZmlsZS5sZW5ndGgoKSwgdHJ1ZSk7CisgICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIG1ldGFkYXRhID0gQ29tcHJlc3Npb25NZXRhZGF0YS5vcGVuKG5ldyBGaWxlKGZpbGVuYW1lICsgIi5tZXRhZGF0YSIpLCBmaWxlLmxlbmd0aCgpLCB0cnVlKTsKIAogICAgICAgICAgICAgbG9uZyBjaHVua3MgPSAyNzYxNjI4NTIwTDsKICAgICAgICAgICAgIGxvbmcgbWlkUG9zaXRpb24gPSAoY2h1bmtzIC8gMkwpICogY2h1bmtMZW5ndGg7CkBAIC0xNzcsOSArMTgyLDggQEAKICAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVuYW1lID0gZi5hYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgd3JpdGVTU1RhYmxlKGYsIGNvbXByZXNzZWQgPyBDb21wcmVzc2lvblBhcmFtcy5zbmFwcHkoKSA6IG51bGwsIGp1bmtTaXplKTsKIAotICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXByZXNzaW9uTWV0YWRhdGEgPSBjb21wcmVzc2VkID8gbmV3IENvbXByZXNzaW9uTWV0YWRhdGEoZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiwgZi5sZW5ndGgoKSwgdHJ1ZSkgOiBudWxsOwotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmaWxlbmFtZSkubW1hcHBlZCh1c2VtbWFwKS53aXRoQ29tcHJlc3Npb25NZXRhZGF0YShjb21wcmVzc2lvbk1ldGFkYXRhKTsKLSAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICB0cnkgKENvbXByZXNzaW9uTWV0YWRhdGEgY29tcHJlc3Npb25NZXRhZGF0YSA9IGNvbXByZXNzZWQgPyBDb21wcmVzc2lvbk1ldGFkYXRhLm9wZW4obmV3IEZpbGUoZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiksIGYubGVuZ3RoKCksIHRydWUpIDogbnVsbDsKKyAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmKS5tbWFwcGVkKHVzZW1tYXApLndpdGhDb21wcmVzc2lvbk1ldGFkYXRhKGNvbXByZXNzaW9uTWV0YWRhdGEpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZyI7CkBAIC0yMDMsNyArMjA3LDcgQEAKICAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVuYW1lID0gZi5hYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3Igc3N0YWJsZU1ldGFkYXRhQ29sbGVjdG9yID0gbmV3IE1ldGFkYXRhQ29sbGVjdG9yKG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihCeXRlc1R5cGUuaW5zdGFuY2UpKTsKICAgICAgICAgdHJ5KFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gcGFyYW1zICE9IG51bGwKLSAgICAgICAgICAgICAgICA/IG5ldyBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcihmLCBmaWxlbmFtZSArICIubWV0YWRhdGEiLAorICAgICAgICAgICAgICAgID8gbmV3IENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKGYsIG5ldyBGaWxlKGZpbGVuYW1lICsgIi5tZXRhZGF0YSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24uREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHNzdGFibGVNZXRhZGF0YUNvbGxlY3RvcikKICAgICAgICAgICAgICAgICA6IG5ldyBTZXF1ZW50aWFsV3JpdGVyKGYpKQpAQCAtMjQzLDcgKzI0Nyw3IEBACiAgICAgICAgIGFzc2VydFRydWUobWV0YWRhdGEuY3JlYXRlRmlsZUlmTm90RXhpc3RzKCkpOwogCiAgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIHNzdGFibGVNZXRhZGF0YUNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3RvcihuZXcgQ2x1c3RlcmluZ0NvbXBhcmF0b3IoQnl0ZXNUeXBlLmluc3RhbmNlKSk7Ci0gICAgICAgIHRyeSAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIoZmlsZSwgbWV0YWRhdGEucGF0aCgpLAorICAgICAgICB0cnkgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbmV3IENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKGZpbGUsIG1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24uREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvblBhcmFtcy5zbmFwcHkoKSwgc3N0YWJsZU1ldGFkYXRhQ29sbGVjdG9yKSkKICAgICAgICAgewpAQCAtMjUyLDE2ICsyNTYsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIG9wZW4gY29tcHJlc3Npb24gbWV0YWRhdGEgYW5kIGdldCBjaHVuayBpbmZvcm1hdGlvbgotICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIG1ldGEgPSBuZXcgQ29tcHJlc3Npb25NZXRhZGF0YShtZXRhZGF0YS5wYXRoKCksIGZpbGUubGVuZ3RoKCksIHRydWUpOwotICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhLkNodW5rIGNodW5rID0gbWV0YS5jaHVua0ZvcigwKTsKLQotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmaWxlLnBhdGgoKSkud2l0aENvbXByZXNzaW9uTWV0YWRhdGEobWV0YSk7Ci0gICAgICAgICAgICAgRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgdHJ5IChDb21wcmVzc2lvbk1ldGFkYXRhIG1ldGEgPSBDb21wcmVzc2lvbk1ldGFkYXRhLm9wZW4obWV0YWRhdGEsIGZpbGUubGVuZ3RoKCksIHRydWUpOworICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmggPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGZpbGUpLndpdGhDb21wcmVzc2lvbk1ldGFkYXRhKG1ldGEpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICB7Ly8gcmVhZCBhbmQgdmVyaWZ5IGNvbXByZXNzZWQgZGF0YQogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRFTlQsIHJlYWRlci5yZWFkTGluZSgpKTsKICAgICAgICAgICAgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0gICAgICAgICAgICB0cnkoUmFuZG9tQWNjZXNzRmlsZSBjaGVja3N1bU1vZGlmaWVyID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZmlsZS50b0phdmFJT0ZpbGUoKSwgInJ3IikpCisgICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhLkNodW5rIGNodW5rID0gbWV0YS5jaHVua0ZvcigwKTsKKyAgICAgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzRmlsZSBjaGVja3N1bU1vZGlmaWVyID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoZmlsZS50b0phdmFJT0ZpbGUoKSwgInJ3IikpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYnl0ZVtdIGNoZWNrc3VtID0gbmV3IGJ5dGVbNF07CiAKQEAgLTMxMiw0ICszMTQsNCBAQAogICAgICAgICBmaWxlLndyaXRlKGNoZWNrc3VtKTsKICAgICAgICAgU3luY1V0aWwuc3luYyhmaWxlLmdldEZEKCkpOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vY29tcHJlc3MvQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vY29tcHJlc3MvQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXJUZXN0LmphdmEKaW5kZXggMmI1MDYzMy4uYWZhNDY5YyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9jb21wcmVzcy9Db21wcmVzc2VkU2VxdWVudGlhbFdyaXRlclRlc3QuamF2YQpAQCAtMjEsMjkgKzIxLDM5IEBACiBpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtcy5ERUZBVUxUX0NIVU5LX0xFTkdUSDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlscy5yZWFkRmlsZVRvQnl0ZUFycmF5OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdDb21wYXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZXNUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhUG9zaXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlclRlc3Q7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXByZXNzaW9uUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtcy5ERUZBVUxUX0NIVU5LX0xFTkdUSDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlscy5yZWFkRmlsZVRvQnl0ZUFycmF5OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCiBwdWJsaWMgY2xhc3MgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXJUZXN0IGV4dGVuZHMgU2VxdWVudGlhbFdyaXRlclRlc3QKIHsKICAgICBwcml2YXRlIENvbXByZXNzaW9uUGFyYW1zIGNvbXByZXNzaW9uUGFyYW1ldGVyczsKQEAgLTExNyw3ICsxMjcsNyBAQAogCiAgICAgICAgIGJ5dGVbXSBkYXRhUHJlID0gbmV3IGJ5dGVbYnl0ZXNUb1Rlc3RdOwogICAgICAgICBieXRlW10gcmF3UG9zdCA9IG5ldyBieXRlW2J5dGVzVG9UZXN0XTsKLSAgICAgICAgdHJ5IChDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIoZiwgZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiwKKyAgICAgICAgdHJ5IChDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIoZiwgbmV3IEZpbGUoZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiksCiAgICAgICAgICAgICAgICAgbnVsbCwgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxULAogICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uUGFyYW1ldGVycywKICAgICAgICAgICAgICAgICBzc3RhYmxlTWV0YWRhdGFDb2xsZWN0b3IpKQpAQCAtMTUwLDggKzE2MCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBhc3NlcnQgZi5leGlzdHMoKTsKLSAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZmlsZW5hbWUpLndpdGhDb21wcmVzc2lvbk1ldGFkYXRhKG5ldyBDb21wcmVzc2lvbk1ldGFkYXRhKGZpbGVuYW1lICsgIi5tZXRhZGF0YSIsIGYubGVuZ3RoKCksIHRydWUpKTsKLSAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICB0cnkgKENvbXByZXNzaW9uTWV0YWRhdGEgY29tcHJlc3Npb25NZXRhZGF0YSA9IENvbXByZXNzaW9uTWV0YWRhdGEub3BlbihuZXcgRmlsZShmaWxlbmFtZSArICIubWV0YWRhdGEiKSwgZi5sZW5ndGgoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgRmlsZUhhbmRsZSBmaCA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZikud2l0aENvbXByZXNzaW9uTWV0YWRhdGEoY29tcHJlc3Npb25NZXRhZGF0YSkuY29tcGxldGUoKTsKICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYXRhUHJlLmxlbmd0aCArIHJhd1Bvc3QubGVuZ3RoLCByZWFkZXIubGVuZ3RoKCkpOwpAQCAtMjE3LDcgKzIyNyw3IEBACiAgICAgICAgIGNvbXByZXNzaW9uUGFyYW1ldGVycyA9IG5ldyBDb21wcmVzc2lvblBhcmFtcyhNb2NrQ29tcHJlc3Nvci5jbGFzcy5nZXRUeXBlTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9ja0NvbXByZXNzb3IucGFyYW1zRm9yKHJhdGlvLCBleHRyYSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0NIVU5LX0xFTkdUSCwgcmF0aW8pOwotICAgICAgICB0cnkgKENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA9IG5ldyBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcihmLCBmLnBhdGgoKSArICIubWV0YWRhdGEiLAorICAgICAgICB0cnkgKENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA9IG5ldyBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcihmLCBuZXcgRmlsZShmLnBhdGgoKSArICIubWV0YWRhdGEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvblBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVNZXRhZGF0YUNvbGxlY3RvcikpCkBAIC0yMjgsOCArMjM4LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGFzc2VydCBmLmV4aXN0cygpOwotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmaWxlbmFtZSkud2l0aENvbXByZXNzaW9uTWV0YWRhdGEobmV3IENvbXByZXNzaW9uTWV0YWRhdGEoZmlsZW5hbWUgKyAiLm1ldGFkYXRhIiwgZi5sZW5ndGgoKSwgdHJ1ZSkpOwotICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgIHRyeSAoQ29tcHJlc3Npb25NZXRhZGF0YSBjb21wcmVzc2lvbk1ldGFkYXRhID0gQ29tcHJlc3Npb25NZXRhZGF0YS5vcGVuKG5ldyBGaWxlKGZpbGVuYW1lICsgIi5tZXRhZGF0YSIpLCBmLmxlbmd0aCgpLCB0cnVlKTsKKyAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmKS53aXRoQ29tcHJlc3Npb25NZXRhZGF0YShjb21wcmVzc2lvbk1ldGFkYXRhKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByZWFkZXIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNpemUsIHJlYWRlci5sZW5ndGgoKSk7CkBAIC0yNzYsNyArMjg2LDcgQEAKICAgICAgICAgZmluYWwgaW50IGJ1ZmZlclNpemUgPSA0ODsKICAgICAgICAgZmluYWwgaW50IHdyaXRlU2l6ZSA9IDY0OwogICAgICAgICBieXRlW10gdG9Xcml0ZSA9IG5ldyBieXRlW3dyaXRlU2l6ZV07Ci0gICAgICAgIHRyeSAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIodGVtcEZpbGUsIG9mZnNldHNGaWxlLnBhdGgoKSwKKyAgICAgICAgdHJ5IChTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA9IG5ldyBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcih0ZW1wRmlsZSwgb2Zmc2V0c0ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uUGFyYW1zLmx6NChidWZmZXJTaXplKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0YWRhdGFDb2xsZWN0b3IobmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKFVURjhUeXBlLmluc3RhbmNlKSkpKQpAQCAtMzMwLDcgKzM0MCw3IEBACiAKICAgICAgICAgcHJpdmF0ZSBUZXN0YWJsZUNTVyhGaWxlIGZpbGUsIEZpbGUgb2Zmc2V0c0ZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzKGZpbGUsIG9mZnNldHNGaWxlLCBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIoZmlsZSwgb2Zmc2V0c0ZpbGUucGF0aCgpLAorICAgICAgICAgICAgdGhpcyhmaWxlLCBvZmZzZXRzRmlsZSwgbmV3IENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKGZpbGUsIG9mZnNldHNGaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24uREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvblBhcmFtcy5sejQoQlVGRkVSX1NJWkUsIE1BWF9DT01QUkVTU0VEKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0YWRhdGFDb2xsZWN0b3IobmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKFVURjhUeXBlLmluc3RhbmNlKSkpKTsKQEAgLTM4NSw0ICszOTUsNCBAQAogICAgICAgICB9CiAgICAgfQogCi19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzaW9uTWV0YWRhdGFUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vY29tcHJlc3MvQ29tcHJlc3Npb25NZXRhZGF0YVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjFmZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2NvbXByZXNzL0NvbXByZXNzaW9uTWV0YWRhdGFUZXN0LmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzczsKKworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5NZW1vcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXByZXNzaW9uUGFyYW1zOworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlOworCitwdWJsaWMgY2xhc3MgQ29tcHJlc3Npb25NZXRhZGF0YVRlc3QKK3sKKyAgICBGaWxlIGNodW5rc0luZGV4RmlsZSA9IG5ldyBGaWxlKCIvcGF0aC90by9tZXRhZGF0YSIpOworICAgIENvbXByZXNzaW9uUGFyYW1zIHBhcmFtcyA9IENvbXByZXNzaW9uUGFyYW1zLnpzdGQoKTsKKyAgICBsb25nIGRhdGFMZW5ndGggPSAxMDAwOworICAgIGxvbmcgY29tcHJlc3NlZEZpbGVMZW5ndGggPSAxMDA7CisKKyAgICBwcml2YXRlIENvbXByZXNzaW9uTWV0YWRhdGEgbmV3Q29tcHJlc3Npb25NZXRhZGF0YShNZW1vcnkgbWVtb3J5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wcmVzc2lvbk1ldGFkYXRhKGNodW5rc0luZGV4RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeS5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZEZpbGVMZW5ndGgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lbW9yeUlzRnJlZWQoKQorICAgIHsKKyAgICAgICAgTWVtb3J5IG1lbW9yeSA9IE1lbW9yeS5hbGxvY2F0ZSgxMCk7CisgICAgICAgIENvbXByZXNzaW9uTWV0YWRhdGEgY20gPSBuZXdDb21wcmVzc2lvbk1ldGFkYXRhKG1lbW9yeSk7CisKKyAgICAgICAgY20uY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbS5pc0NsZWFuZWRVcCgpKS5pc1RydWUoKTsKKyAgICAgICAgYXNzZXJ0VGhhdEV4Y2VwdGlvbk9mVHlwZShBc3NlcnRpb25FcnJvci5jbGFzcykuaXNUaHJvd25CeShtZW1vcnk6OnNpemUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lbW9yeUlzU2hhcmVkKCkKKyAgICB7CisgICAgICAgIE1lbW9yeSBtZW1vcnkgPSBNZW1vcnkuYWxsb2NhdGUoMTApOworICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIGNtID0gbmV3Q29tcHJlc3Npb25NZXRhZGF0YShtZW1vcnkpOworCisgICAgICAgIENvbXByZXNzaW9uTWV0YWRhdGEgY29weSA9IGNtLnNoYXJlZENvcHkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb3B5KS5pc05vdFNhbWVBcyhjbSk7CisKKyAgICAgICAgY20uY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbS5pc0NsZWFuZWRVcCgpKS5pc0ZhbHNlKCk7CisgICAgICAgIGFzc2VydFRoYXQoY29weS5pc0NsZWFuZWRVcCgpKS5pc0ZhbHNlKCk7CisgICAgICAgIGFzc2VydFRoYXQobWVtb3J5LnNpemUoKSkuaXNFcXVhbFRvKDEwKTsgLy8gZXhwZWN0ZWQgdGhhdCBubyBleHBlY3Rpb24gaXMgdGhyb3duIHNpbmNlIG1lbW9yeSBzaG91bGQgbm90IGJlIHJlbGVhc2VkIHlldAorCisgICAgICAgIGNvcHkuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbS5pc0NsZWFuZWRVcCgpKS5pc1RydWUoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb3B5LmlzQ2xlYW5lZFVwKCkpLmlzVHJ1ZSgpOworICAgICAgICBhc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlKEFzc2VydGlvbkVycm9yLmNsYXNzKS5pc1Rocm93bkJ5KG1lbW9yeTo6c2l6ZSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9maWxlc3lzdGVtL0ZvcndhcmRpbmdGaWxlQ2hhbm5lbC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2ZpbGVzeXN0ZW0vRm9yd2FyZGluZ0ZpbGVDaGFubmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlY2QyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9maWxlc3lzdGVtL0ZvcndhcmRpbmdGaWxlQ2hhbm5lbC5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmZpbGVzeXN0ZW07CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlTG9jazsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWw7CisKK3B1YmxpYyBjbGFzcyBGb3J3YXJkaW5nRmlsZUNoYW5uZWwgZXh0ZW5kcyBGaWxlQ2hhbm5lbAoreworICAgIHByb3RlY3RlZCBmaW5hbCBGaWxlQ2hhbm5lbCBkZWxlZ2F0ZTsKKworICAgIHB1YmxpYyBGb3J3YXJkaW5nRmlsZUNoYW5uZWwoRmlsZUNoYW5uZWwgZGVsZWdhdGUpCisgICAgeworICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEZpbGVDaGFubmVsIGRlbGVnYXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWQoQnl0ZUJ1ZmZlciBkc3QpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkucmVhZChkc3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIHJlYWQoQnl0ZUJ1ZmZlcltdIGRzdHMsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkucmVhZChkc3RzLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCB3cml0ZShCeXRlQnVmZmVyIHNyYykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS53cml0ZShzcmMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIHdyaXRlKEJ5dGVCdWZmZXJbXSBzcmNzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLndyaXRlKHNyY3MsIG9mZnNldCwgbGVuZ3RoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBwb3NpdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkucG9zaXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsZUNoYW5uZWwgcG9zaXRpb24obG9uZyBuZXdQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5wb3NpdGlvbihuZXdQb3NpdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgc2l6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuc2l6ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWxlQ2hhbm5lbCB0cnVuY2F0ZShsb25nIHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkudHJ1bmNhdGUoc2l6ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZm9yY2UoYm9vbGVhbiBtZXRhRGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBkZWxlZ2F0ZSgpLmZvcmNlKG1ldGFEYXRhKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyB0cmFuc2ZlclRvKGxvbmcgcG9zaXRpb24sIGxvbmcgY291bnQsIFdyaXRhYmxlQnl0ZUNoYW5uZWwgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnRyYW5zZmVyVG8ocG9zaXRpb24sIGNvdW50LCB0YXJnZXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIHRyYW5zZmVyRnJvbShSZWFkYWJsZUJ5dGVDaGFubmVsIHNyYywgbG9uZyBwb3NpdGlvbiwgbG9uZyBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS50cmFuc2ZlckZyb20oc3JjLCBwb3NpdGlvbiwgY291bnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZChCeXRlQnVmZmVyIGRzdCwgbG9uZyBwb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5yZWFkKGRzdCwgcG9zaXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgd3JpdGUoQnl0ZUJ1ZmZlciBzcmMsIGxvbmcgcG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkud3JpdGUoc3JjLCBwb3NpdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcHBlZEJ5dGVCdWZmZXIgbWFwKE1hcE1vZGUgbW9kZSwgbG9uZyBwb3NpdGlvbiwgbG9uZyBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLm1hcChtb2RlLCBwb3NpdGlvbiwgc2l6ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpbGVMb2NrIGxvY2sobG9uZyBwb3NpdGlvbiwgbG9uZyBzaXplLCBib29sZWFuIHNoYXJlZCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5sb2NrKHBvc2l0aW9uLCBzaXplLCBzaGFyZWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWxlTG9jayB0cnlMb2NrKGxvbmcgcG9zaXRpb24sIGxvbmcgc2l6ZSwgYm9vbGVhbiBzaGFyZWQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkudHJ5TG9jayhwb3NpdGlvbiwgc2l6ZSwgc2hhcmVkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbXBsQ2xvc2VDaGFubmVsKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyAuY2xvc2UoKSwgYW5kIC5pc09wZW4oKSBhcmUgImZpbmFsIiwgc28gbmVlZCB0byBsZXZlcmFnZSBpbXBsQ2xvc2VDaGFubmVsCisgICAgICAgIC8vIHRvIGNsb3NlIHRoZSB1bmRlcmxpbmUgY2hhbm5lbAorICAgICAgICBkZWxlZ2F0ZSgpLmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2ZpbGVzeXN0ZW0vRm9yd2FyZGluZ0ZpbGVTeXN0ZW0uamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9maWxlc3lzdGVtL0ZvcndhcmRpbmdGaWxlU3lzdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljNjgyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9maWxlc3lzdGVtL0ZvcndhcmRpbmdGaWxlU3lzdGVtLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uZmlsZXN5c3RlbTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3RvcmU7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3lzdGVtOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhNYXRjaGVyOworaW1wb3J0IGphdmEubmlvLmZpbGUuV2F0Y2hTZXJ2aWNlOworaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLlVzZXJQcmluY2lwYWxMb29rdXBTZXJ2aWNlOworaW1wb3J0IGphdmEubmlvLmZpbGUuc3BpLkZpbGVTeXN0ZW1Qcm92aWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7CisKK3B1YmxpYyBjbGFzcyBGb3J3YXJkaW5nRmlsZVN5c3RlbSBleHRlbmRzIEZpbGVTeXN0ZW0KK3sKKyAgICBwcm90ZWN0ZWQgZmluYWwgRmlsZVN5c3RlbSBkZWxlZ2F0ZTsKKworICAgIHB1YmxpYyBGb3J3YXJkaW5nRmlsZVN5c3RlbShGaWxlU3lzdGVtIGRlbGVnYXRlKQorICAgIHsKKyAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOworICAgIH0KKworICAgIHByb3RlY3RlZCBGaWxlU3lzdGVtIGRlbGVnYXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUGF0aCB3cmFwKFBhdGggcCkKKyAgICB7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIHByb3RlY3RlZCBQYXRoIHVud3JhcChQYXRoIHApCisgICAgeworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsZVN5c3RlbVByb3ZpZGVyIHByb3ZpZGVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnByb3ZpZGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRlbGVnYXRlKCkuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuaXNPcGVuKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5pc1JlYWRPbmx5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRTZXBhcmF0b3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuZ2V0U2VwYXJhdG9yKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhYmxlPFBhdGg+IGdldFJvb3REaXJlY3RvcmllcygpCisgICAgeworICAgICAgICByZXR1cm4gSXRlcmFibGVzLnRyYW5zZm9ybShkZWxlZ2F0ZSgpLmdldFJvb3REaXJlY3RvcmllcygpLCB0aGlzOjp3cmFwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSXRlcmFibGU8RmlsZVN0b3JlPiBnZXRGaWxlU3RvcmVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLmdldEZpbGVTdG9yZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gc3VwcG9ydGVkRmlsZUF0dHJpYnV0ZVZpZXdzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnN1cHBvcnRlZEZpbGVBdHRyaWJ1dGVWaWV3cygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoIGdldFBhdGgoU3RyaW5nIGZpcnN0LCBTdHJpbmcuLi4gbW9yZSkKKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwKGRlbGVnYXRlKCkuZ2V0UGF0aChmaXJzdCwgbW9yZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoTWF0Y2hlciBnZXRQYXRoTWF0Y2hlcihTdHJpbmcgc3ludGF4QW5kUGF0dGVybikKKyAgICB7CisgICAgICAgIFBhdGhNYXRjaGVyIG1hdGNoZXIgPSBkZWxlZ2F0ZSgpLmdldFBhdGhNYXRjaGVyKHN5bnRheEFuZFBhdHRlcm4pOworICAgICAgICByZXR1cm4gcGF0aCAtPiBtYXRjaGVyLm1hdGNoZXModW53cmFwKHBhdGgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVXNlclByaW5jaXBhbExvb2t1cFNlcnZpY2UgZ2V0VXNlclByaW5jaXBhbExvb2t1cFNlcnZpY2UoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuZ2V0VXNlclByaW5jaXBhbExvb2t1cFNlcnZpY2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgV2F0Y2hTZXJ2aWNlIG5ld1dhdGNoU2VydmljZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkubmV3V2F0Y2hTZXJ2aWNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2ZpbGVzeXN0ZW0vRm9yd2FyZGluZ0ZpbGVTeXN0ZW1Qcm92aWRlci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2ZpbGVzeXN0ZW0vRm9yd2FyZGluZ0ZpbGVTeXN0ZW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMWY2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vZmlsZXN5c3RlbS9Gb3J3YXJkaW5nRmlsZVN5c3RlbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uZmlsZXN5c3RlbTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQXN5bmNocm9ub3VzRmlsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuU2Vla2FibGVCeXRlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkFjY2Vzc01vZGU7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5Db3B5T3B0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRGlyZWN0b3J5U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN0b3JlOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN5c3RlbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5PcGVuT3B0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5CYXNpY0ZpbGVBdHRyaWJ1dGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLkZpbGVBdHRyaWJ1dGU7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuRmlsZUF0dHJpYnV0ZVZpZXc7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5zcGkuRmlsZVN5c3RlbVByb3ZpZGVyOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYXRvcnM7CisKK3B1YmxpYyBjbGFzcyBGb3J3YXJkaW5nRmlsZVN5c3RlbVByb3ZpZGVyIGV4dGVuZHMgRmlsZVN5c3RlbVByb3ZpZGVyCit7CisgICAgcHJvdGVjdGVkIGZpbmFsIEZpbGVTeXN0ZW1Qcm92aWRlciBkZWxlZ2F0ZTsKKworICAgIHB1YmxpYyBGb3J3YXJkaW5nRmlsZVN5c3RlbVByb3ZpZGVyKEZpbGVTeXN0ZW1Qcm92aWRlciBkZWxlZ2F0ZSkKKyAgICB7CisgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRmlsZVN5c3RlbVByb3ZpZGVyIGRlbGVnYXRlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUGF0aCB3cmFwKFBhdGggcCkKKyAgICB7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIHByb3RlY3RlZCBQYXRoIHVud3JhcChQYXRoIHApCisgICAgeworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5nZXRTY2hlbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsZVN5c3RlbSBuZXdGaWxlU3lzdGVtKFVSSSB1cmksIE1hcDxTdHJpbmcsID8+IGVudikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5uZXdGaWxlU3lzdGVtKHVyaSwgZW52KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsZVN5c3RlbSBnZXRGaWxlU3lzdGVtKFVSSSB1cmkpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5nZXRGaWxlU3lzdGVtKHVyaSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhdGggZ2V0UGF0aChVUkkgdXJpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyYXAoZGVsZWdhdGUoKS5nZXRQYXRoKHVyaSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZWVrYWJsZUJ5dGVDaGFubmVsIG5ld0J5dGVDaGFubmVsKFBhdGggcGF0aCwgU2V0PD8gZXh0ZW5kcyBPcGVuT3B0aW9uPiBvcHRpb25zLCBGaWxlQXR0cmlidXRlPD8+Li4uIGF0dHJzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLm5ld0J5dGVDaGFubmVsKHVud3JhcChwYXRoKSwgb3B0aW9ucywgYXR0cnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEaXJlY3RvcnlTdHJlYW08UGF0aD4gbmV3RGlyZWN0b3J5U3RyZWFtKFBhdGggZGlyLCBEaXJlY3RvcnlTdHJlYW0uRmlsdGVyPD8gc3VwZXIgUGF0aD4gZmlsdGVyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIERpcmVjdG9yeVN0cmVhbTxQYXRoPiBzdHJlYW0gPSBkZWxlZ2F0ZSgpLm5ld0RpcmVjdG9yeVN0cmVhbSh1bndyYXAoZGlyKSwgZmlsdGVyKTsKKyAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RvcnlTdHJlYW08UGF0aD4oKQorICAgICAgICB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxQYXRoPiBpdGVyYXRvcigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9ycy50cmFuc2Zvcm0oc3RyZWFtLml0ZXJhdG9yKCksIEZvcndhcmRpbmdGaWxlU3lzdGVtUHJvdmlkZXIudGhpczo6d3JhcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVEaXJlY3RvcnkoUGF0aCBkaXIsIEZpbGVBdHRyaWJ1dGU8Pz4uLi4gYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZGVsZWdhdGUoKS5jcmVhdGVEaXJlY3RvcnkodW53cmFwKGRpciksIGF0dHJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZWxldGUoUGF0aCBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRlbGVnYXRlKCkuZGVsZXRlKHVud3JhcChwYXRoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29weShQYXRoIHNvdXJjZSwgUGF0aCB0YXJnZXQsIENvcHlPcHRpb24uLi4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBkZWxlZ2F0ZSgpLmNvcHkodW53cmFwKHNvdXJjZSksIHVud3JhcCh0YXJnZXQpLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBtb3ZlKFBhdGggc291cmNlLCBQYXRoIHRhcmdldCwgQ29weU9wdGlvbi4uLiBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRlbGVnYXRlKCkubW92ZSh1bndyYXAoc291cmNlKSwgdW53cmFwKHRhcmdldCksIG9wdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzU2FtZUZpbGUoUGF0aCBwYXRoLCBQYXRoIHBhdGgyKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLmlzU2FtZUZpbGUodW53cmFwKHBhdGgpLCB1bndyYXAocGF0aDIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0hpZGRlbihQYXRoIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuaXNIaWRkZW4odW53cmFwKHBhdGgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsZVN0b3JlIGdldEZpbGVTdG9yZShQYXRoIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuZ2V0RmlsZVN0b3JlKHVud3JhcChwYXRoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2hlY2tBY2Nlc3MoUGF0aCBwYXRoLCBBY2Nlc3NNb2RlLi4uIG1vZGVzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRlbGVnYXRlKCkuY2hlY2tBY2Nlc3ModW53cmFwKHBhdGgpLCBtb2Rlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxWIGV4dGVuZHMgRmlsZUF0dHJpYnV0ZVZpZXc+IFYgZ2V0RmlsZUF0dHJpYnV0ZVZpZXcoUGF0aCBwYXRoLCBDbGFzczxWPiB0eXBlLCBMaW5rT3B0aW9uLi4uIG9wdGlvbnMpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5nZXRGaWxlQXR0cmlidXRlVmlldyh1bndyYXAocGF0aCksIHR5cGUsIG9wdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QSBleHRlbmRzIEJhc2ljRmlsZUF0dHJpYnV0ZXM+IEEgcmVhZEF0dHJpYnV0ZXMoUGF0aCBwYXRoLCBDbGFzczxBPiB0eXBlLCBMaW5rT3B0aW9uLi4uIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkucmVhZEF0dHJpYnV0ZXModW53cmFwKHBhdGgpLCB0eXBlLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiByZWFkQXR0cmlidXRlcyhQYXRoIHBhdGgsIFN0cmluZyBhdHRyaWJ1dGVzLCBMaW5rT3B0aW9uLi4uIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkucmVhZEF0dHJpYnV0ZXModW53cmFwKHBhdGgpLCBhdHRyaWJ1dGVzLCBvcHRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoUGF0aCBwYXRoLCBTdHJpbmcgYXR0cmlidXRlLCBPYmplY3QgdmFsdWUsIExpbmtPcHRpb24uLi4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBkZWxlZ2F0ZSgpLnNldEF0dHJpYnV0ZSh1bndyYXAocGF0aCksIGF0dHJpYnV0ZSwgdmFsdWUsIG9wdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWxlU3lzdGVtIG5ld0ZpbGVTeXN0ZW0oUGF0aCBwYXRoLCBNYXA8U3RyaW5nLCA/PiBlbnYpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkubmV3RmlsZVN5c3RlbSh1bndyYXAocGF0aCksIGVudik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElucHV0U3RyZWFtIG5ld0lucHV0U3RyZWFtKFBhdGggcGF0aCwgT3Blbk9wdGlvbi4uLiBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLm5ld0lucHV0U3RyZWFtKHVud3JhcChwYXRoKSwgb3B0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE91dHB1dFN0cmVhbSBuZXdPdXRwdXRTdHJlYW0oUGF0aCBwYXRoLCBPcGVuT3B0aW9uLi4uIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkubmV3T3V0cHV0U3RyZWFtKHVud3JhcChwYXRoKSwgb3B0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpbGVDaGFubmVsIG5ld0ZpbGVDaGFubmVsKFBhdGggcGF0aCwgU2V0PD8gZXh0ZW5kcyBPcGVuT3B0aW9uPiBvcHRpb25zLCBGaWxlQXR0cmlidXRlPD8+Li4uIGF0dHJzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLm5ld0ZpbGVDaGFubmVsKHVud3JhcChwYXRoKSwgb3B0aW9ucywgYXR0cnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBc3luY2hyb25vdXNGaWxlQ2hhbm5lbCBuZXdBc3luY2hyb25vdXNGaWxlQ2hhbm5lbChQYXRoIHBhdGgsIFNldDw/IGV4dGVuZHMgT3Blbk9wdGlvbj4gb3B0aW9ucywgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yLCBGaWxlQXR0cmlidXRlPD8+Li4uIGF0dHJzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLm5ld0FzeW5jaHJvbm91c0ZpbGVDaGFubmVsKHVud3JhcChwYXRoKSwgb3B0aW9ucywgZXhlY3V0b3IsIGF0dHJzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVTeW1ib2xpY0xpbmsoUGF0aCBsaW5rLCBQYXRoIHRhcmdldCwgRmlsZUF0dHJpYnV0ZTw/Pi4uLiBhdHRycykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBkZWxlZ2F0ZSgpLmNyZWF0ZVN5bWJvbGljTGluayh1bndyYXAobGluayksIHRhcmdldCwgYXR0cnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUxpbmsoUGF0aCBsaW5rLCBQYXRoIGV4aXN0aW5nKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGRlbGVnYXRlKCkuY3JlYXRlTGluayh1bndyYXAobGluayksIHVud3JhcChleGlzdGluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZUlmRXhpc3RzKFBhdGggcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5kZWxldGVJZkV4aXN0cyh1bndyYXAocGF0aCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoIHJlYWRTeW1ib2xpY0xpbmsoUGF0aCBsaW5rKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwKGRlbGVnYXRlKCkucmVhZFN5bWJvbGljTGluayh1bndyYXAobGluaykpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vZmlsZXN5c3RlbS9Gb3J3YXJkaW5nUGF0aC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2ZpbGVzeXN0ZW0vRm9yd2FyZGluZ1BhdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQwMDM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL2ZpbGVzeXN0ZW0vRm9yd2FyZGluZ1BhdGguamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5maWxlc3lzdGVtOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVN5c3RlbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkxpbmtPcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuV2F0Y2hFdmVudDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLldhdGNoS2V5OworaW1wb3J0IGphdmEubmlvLmZpbGUuV2F0Y2hTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmF0b3JzOworCitwdWJsaWMgY2xhc3MgRm9yd2FyZGluZ1BhdGggaW1wbGVtZW50cyBQYXRoCit7CisgICAgcHJvdGVjdGVkIGZpbmFsIFBhdGggZGVsZWdhdGU7CisKKyAgICBwdWJsaWMgRm9yd2FyZGluZ1BhdGgoUGF0aCBkZWxlZ2F0ZSkKKyAgICB7CisgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUGF0aCBkZWxlZ2F0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGU7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFBhdGggd3JhcChQYXRoIGEpCisgICAgeworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUGF0aCB1bndyYXAoUGF0aCBwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpbGVTeXN0ZW0gZ2V0RmlsZVN5c3RlbSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5nZXRGaWxlU3lzdGVtKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNBYnNvbHV0ZSgpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5pc0Fic29sdXRlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhdGggZ2V0Um9vdCgpCisgICAgeworICAgICAgICByZXR1cm4gd3JhcChkZWxlZ2F0ZSgpLmdldFJvb3QoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhdGggZ2V0RmlsZU5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyYXAoZGVsZWdhdGUoKS5nZXRGaWxlTmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGF0aCBnZXRQYXJlbnQoKQorICAgIHsKKyAgICAgICAgUGF0aCBwYXJlbnQgPSBkZWxlZ2F0ZSgpLmdldFBhcmVudCgpOworICAgICAgICBpZiAocGFyZW50ID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIHdyYXAocGFyZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldE5hbWVDb3VudCgpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5nZXROYW1lQ291bnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGF0aCBnZXROYW1lKGludCBpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwKGRlbGVnYXRlKCkuZ2V0TmFtZShpbmRleCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoIHN1YnBhdGgoaW50IGJlZ2luSW5kZXgsIGludCBlbmRJbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwKGRlbGVnYXRlKCkuc3VicGF0aChiZWdpbkluZGV4LCBlbmRJbmRleCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoUGF0aCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnN0YXJ0c1dpdGgodW53cmFwKG90aGVyKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3RhcnRzV2l0aChTdHJpbmcgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5zdGFydHNXaXRoKG90aGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlbmRzV2l0aChQYXRoIG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuZW5kc1dpdGgodW53cmFwKG90aGVyKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZW5kc1dpdGgoU3RyaW5nIG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuZW5kc1dpdGgob3RoZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoIG5vcm1hbGl6ZSgpCisgICAgeworICAgICAgICByZXR1cm4gd3JhcChkZWxlZ2F0ZSgpLm5vcm1hbGl6ZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGF0aCByZXNvbHZlKFBhdGggb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gd3JhcChkZWxlZ2F0ZSgpLnJlc29sdmUodW53cmFwKG90aGVyKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoIHJlc29sdmUoU3RyaW5nIG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHdyYXAoZGVsZWdhdGUoKS5yZXNvbHZlKG90aGVyKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhdGggcmVzb2x2ZVNpYmxpbmcoUGF0aCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwKGRlbGVnYXRlKCkucmVzb2x2ZVNpYmxpbmcodW53cmFwKG90aGVyKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoIHJlc29sdmVTaWJsaW5nKFN0cmluZyBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwKGRlbGVnYXRlKCkucmVzb2x2ZVNpYmxpbmcob3RoZXIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGF0aCByZWxhdGl2aXplKFBhdGggb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gd3JhcChkZWxlZ2F0ZSgpLnJlbGF0aXZpemUodW53cmFwKG90aGVyKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVUkkgdG9VcmkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkudG9VcmkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGF0aCB0b0Fic29sdXRlUGF0aCgpCisgICAgeworICAgICAgICByZXR1cm4gd3JhcChkZWxlZ2F0ZSgpLnRvQWJzb2x1dGVQYXRoKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoIHRvUmVhbFBhdGgoTGlua09wdGlvbi4uLiBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiB3cmFwKGRlbGVnYXRlKCkudG9SZWFsUGF0aChvcHRpb25zKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpbGUgdG9GaWxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnRvRmlsZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBXYXRjaEtleSByZWdpc3RlcihXYXRjaFNlcnZpY2Ugd2F0Y2hlciwgV2F0Y2hFdmVudC5LaW5kPD8+W10gZXZlbnRzLCBXYXRjaEV2ZW50Lk1vZGlmaWVyLi4uIG1vZGlmaWVycykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5yZWdpc3Rlcih3YXRjaGVyLCBldmVudHMsIG1vZGlmaWVycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFdhdGNoS2V5IHJlZ2lzdGVyKFdhdGNoU2VydmljZSB3YXRjaGVyLCBXYXRjaEV2ZW50LktpbmQ8Pz4uLi4gZXZlbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnJlZ2lzdGVyKHdhdGNoZXIsIGV2ZW50cyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhdG9yPFBhdGg+IGl0ZXJhdG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBJdGVyYXRvcnMudHJhbnNmb3JtKGRlbGVnYXRlKCkuaXRlcmF0b3IoKSwgdGhpczo6d3JhcCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb21wYXJlVG8oUGF0aCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLmNvbXBhcmVUbyh1bndyYXAob3RoZXIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLmVxdWFscyhvYmogaW5zdGFuY2VvZiBQYXRoID8gdW53cmFwKChQYXRoKSBvYmopIDogb2JqKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9maWxlc3lzdGVtL0xpc3RlbmFibGVGaWxlU3lzdGVtLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vZmlsZXN5c3RlbS9MaXN0ZW5hYmxlRmlsZVN5c3RlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OWQzNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vZmlsZXN5c3RlbS9MaXN0ZW5hYmxlRmlsZVN5c3RlbS5qYXZhCkBAIC0wLDAgKzEsODU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmZpbGVzeXN0ZW07CisKK2ltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5jaGVja2VkSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Bc3luY2hyb25vdXNGaWxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DaGFubmVsczsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5SZWFkYWJsZUJ5dGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlZWthYmxlQnl0ZUNoYW5uZWw7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuV3JpdGFibGVCeXRlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTeXN0ZW07CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3lzdGVtczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLk9wZW5PcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRPcGVuT3B0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLkZpbGVBdHRyaWJ1dGU7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5zcGkuRmlsZVN5c3RlbVByb3ZpZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5tZW1vcnkuTWVtb3J5VXRpbDsKKworcHVibGljIGNsYXNzIExpc3RlbmFibGVGaWxlU3lzdGVtIGV4dGVuZHMgRm9yd2FyZGluZ0ZpbGVTeXN0ZW0KK3sKKyAgICBARnVuY3Rpb25hbEludGVyZmFjZQorICAgIHB1YmxpYyBpbnRlcmZhY2UgUGF0aEZpbHRlcgorICAgIHsKKyAgICAgICAgYm9vbGVhbiBhY2NlcHQoUGF0aCBlbnRyeSkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblByZU9wZW4gZXh0ZW5kcyBMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBwcmVPcGVuKFBhdGggcGF0aCwgU2V0PD8gZXh0ZW5kcyBPcGVuT3B0aW9uPiBvcHRpb25zLCBGaWxlQXR0cmlidXRlPD8+W10gYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uUG9zdE9wZW4gZXh0ZW5kcyBMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBwb3N0T3BlbihQYXRoIHBhdGgsIFNldDw/IGV4dGVuZHMgT3Blbk9wdGlvbj4gb3B0aW9ucywgRmlsZUF0dHJpYnV0ZTw/PltdIGF0dHJzLCBGaWxlQ2hhbm5lbCBjaGFubmVsKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblByZVJlYWQgZXh0ZW5kcyBMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBwcmVSZWFkKFBhdGggcGF0aCwgRmlsZUNoYW5uZWwgY2hhbm5lbCwgbG9uZyBwb3NpdGlvbiwgQnl0ZUJ1ZmZlciBkc3QpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uUG9zdFJlYWQgZXh0ZW5kcyBMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBwb3N0UmVhZChQYXRoIHBhdGgsIEZpbGVDaGFubmVsIGNoYW5uZWwsIGxvbmcgcG9zaXRpb24sIEJ5dGVCdWZmZXIgZHN0LCBpbnQgcmVhZCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QcmVUcmFuc2ZlclRvIGV4dGVuZHMgTGlzdGVuZXIKKyAgICB7CisgICAgICAgIHZvaWQgcHJlVHJhbnNmZXJUbyhQYXRoIHBhdGgsIEZpbGVDaGFubmVsIGNoYW5uZWwsIGxvbmcgcG9zaXRpb24sIGxvbmcgY291bnQsIFdyaXRhYmxlQnl0ZUNoYW5uZWwgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblBvc3RUcmFuc2ZlclRvIGV4dGVuZHMgTGlzdGVuZXIKKyAgICB7CisgICAgICAgIHZvaWQgcG9zdFRyYW5zZmVyVG8oUGF0aCBwYXRoLCBGaWxlQ2hhbm5lbCBjaGFubmVsLCBsb25nIHBvc2l0aW9uLCBsb25nIGNvdW50LCBXcml0YWJsZUJ5dGVDaGFubmVsIHRhcmdldCwgbG9uZyB0cmFuc2ZlcmVkKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblByZVRyYW5zZmVyRnJvbSBleHRlbmRzIExpc3RlbmVyCisgICAgeworICAgICAgICB2b2lkIHByZVRyYW5zZmVyRnJvbShQYXRoIHBhdGgsIEZpbGVDaGFubmVsIGNoYW5uZWwsIFJlYWRhYmxlQnl0ZUNoYW5uZWwgc3JjLCBsb25nIHBvc2l0aW9uLCBsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblBvc3RUcmFuc2ZlckZyb20gZXh0ZW5kcyBMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBwb3N0VHJhbnNmZXJGcm9tKFBhdGggcGF0aCwgRmlsZUNoYW5uZWwgY2hhbm5lbCwgUmVhZGFibGVCeXRlQ2hhbm5lbCBzcmMsIGxvbmcgcG9zaXRpb24sIGxvbmcgY291bnQsIGxvbmcgdHJhbnNmZXJlZCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QcmVXcml0ZSBleHRlbmRzIExpc3RlbmVyCisgICAgeworICAgICAgICB2b2lkIHByZVdyaXRlKFBhdGggcGF0aCwgRmlsZUNoYW5uZWwgY2hhbm5lbCwgbG9uZyBwb3NpdGlvbiwgQnl0ZUJ1ZmZlciBzcmMpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE9uUG9zdFdyaXRlIGV4dGVuZHMgTGlzdGVuZXIKKyAgICB7CisgICAgICAgIHZvaWQgcG9zdFdyaXRlKFBhdGggcGF0aCwgRmlsZUNoYW5uZWwgY2hhbm5lbCwgbG9uZyBwb3NpdGlvbiwgQnl0ZUJ1ZmZlciBzcmMsIGludCB3cm90ZSkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25QcmVQb3NpdGlvbiBleHRlbmRzIExpc3RlbmVyCisgICAgeworICAgICAgICB2b2lkIHByZVBvc2l0aW9uKFBhdGggcGF0aCwgRmlsZUNoYW5uZWwgY2hhbm5lbCwgbG9uZyBwb3NpdGlvbiwgbG9uZyBuZXdQb3NpdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25Qb3N0UG9zaXRpb24gZXh0ZW5kcyBMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBwb3N0UG9zaXRpb24oUGF0aCBwYXRoLCBGaWxlQ2hhbm5lbCBjaGFubmVsLCBsb25nIHBvc2l0aW9uLCBsb25nIG5ld1Bvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblByZVRydW5jYXRlIGV4dGVuZHMgTGlzdGVuZXIKKyAgICB7CisgICAgICAgIHZvaWQgcHJlVHJ1bmNhdGUoUGF0aCBwYXRoLCBGaWxlQ2hhbm5lbCBjaGFubmVsLCBsb25nIHNpemUsIGxvbmcgdGFyZ2V0U2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgT25Qb3N0VHJ1bmNhdGUgZXh0ZW5kcyBMaXN0ZW5lcgorICAgIHsKKyAgICAgICAgdm9pZCBwb3N0VHJ1bmNhdGUoUGF0aCBwYXRoLCBGaWxlQ2hhbm5lbCBjaGFubmVsLCBsb25nIHNpemUsIGxvbmcgdGFyZ2V0U2l6ZSwgbG9uZyBuZXdTaXplKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblByZUZvcmNlIGV4dGVuZHMgTGlzdGVuZXIKKyAgICB7CisgICAgICAgIHZvaWQgcHJlRm9yY2UoUGF0aCBwYXRoLCBGaWxlQ2hhbm5lbCBjaGFubmVsLCBib29sZWFuIG1ldGFEYXRhKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBPblBvc3RGb3JjZSBleHRlbmRzIExpc3RlbmVyCisgICAgeworICAgICAgICB2b2lkIHBvc3RGb3JjZShQYXRoIHBhdGgsIEZpbGVDaGFubmVsIGNoYW5uZWwsIGJvb2xlYW4gbWV0YURhdGEpIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFVuc3Vic2NyaWJhYmxlIGV4dGVuZHMgQXV0b0Nsb3NlYWJsZQorICAgIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgY2xvc2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T25QcmVPcGVuPiBvblByZU9wZW4gPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPblBvc3RPcGVuPiBvblBvc3RPcGVuID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T25QcmVUcmFuc2ZlclRvPiBvblByZVRyYW5zZmVyVG8gPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPblBvc3RUcmFuc2ZlclRvPiBvblBvc3RUcmFuc2ZlclRvID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T25QcmVSZWFkPiBvblByZVJlYWQgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPblBvc3RSZWFkPiBvblBvc3RSZWFkID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T25QcmVXcml0ZT4gb25QcmVXcml0ZSA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9uUG9zdFdyaXRlPiBvblBvc3RXcml0ZSA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9uUHJlVHJhbnNmZXJGcm9tPiBvblByZVRyYW5zZmVyRnJvbSA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9uUG9zdFRyYW5zZmVyRnJvbT4gb25Qb3N0VHJhbnNmZXJGcm9tID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPblByZUZvcmNlPiBvblByZUZvcmNlID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T25Qb3N0Rm9yY2U+IG9uUG9zdEZvcmNlID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8T25QcmVUcnVuY2F0ZT4gb25QcmVUcnVuY2F0ZSA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9uUG9zdFRydW5jYXRlPiBvblBvc3RUcnVuY2F0ZSA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9uUHJlUG9zaXRpb24+IG9uUHJlUG9zaXRpb24gPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxPblBvc3RQb3NpdGlvbj4gb25Qb3N0UG9zaXRpb24gPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxMaXN0PD8gZXh0ZW5kcyBMaXN0ZW5lcj4+IGxpc3RzID0gQXJyYXlzLmFzTGlzdChvblByZU9wZW4sIG9uUG9zdE9wZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uUHJlUmVhZCwgb25Qb3N0UmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25QcmVUcmFuc2ZlclRvLCBvblBvc3RUcmFuc2ZlclRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblByZVdyaXRlLCBvblBvc3RXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25QcmVUcmFuc2ZlckZyb20sIG9uUG9zdFRyYW5zZmVyRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25QcmVGb3JjZSwgb25Qb3N0Rm9yY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uUHJlVHJ1bmNhdGUsIG9uUG9zdFRydW5jYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblByZVBvc2l0aW9uLCBvblBvc3RQb3NpdGlvbik7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0ZW5hYmxlRmlsZVN5c3RlbVByb3ZpZGVyIHByb3ZpZGVyOworCisgICAgcHVibGljIExpc3RlbmFibGVGaWxlU3lzdGVtKEZpbGVTeXN0ZW0gZGVsZWdhdGUpCisgICAgeworICAgICAgICBzdXBlcihkZWxlZ2F0ZSk7CisgICAgICAgIHRoaXMucHJvdmlkZXIgPSBuZXcgTGlzdGVuYWJsZUZpbGVTeXN0ZW1Qcm92aWRlcihzdXBlci5wcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgbGlzdGVuKExpc3RlbmVyIGxpc3RlbmVyKQorICAgIHsKKyAgICAgICAgTGlzdDxMaXN0PD8gZXh0ZW5kcyBMaXN0ZW5lcj4+IG1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIE9uUHJlT3BlbikKKyAgICAgICAgeworICAgICAgICAgICAgb25QcmVPcGVuLmFkZCgoT25QcmVPcGVuKSBsaXN0ZW5lcik7CisgICAgICAgICAgICBtYXRjaGVzLmFkZChvblByZU9wZW4pOworICAgICAgICB9CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIE9uUG9zdE9wZW4pCisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUG9zdE9wZW4uYWRkKChPblBvc3RPcGVuKSBsaXN0ZW5lcik7CisgICAgICAgICAgICBtYXRjaGVzLmFkZChvblBvc3RPcGVuKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBPblByZVJlYWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUHJlUmVhZC5hZGQoKE9uUHJlUmVhZCkgbGlzdGVuZXIpOworICAgICAgICAgICAgbWF0Y2hlcy5hZGQob25QcmVSZWFkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBPblBvc3RSZWFkKQorICAgICAgICB7CisgICAgICAgICAgICBvblBvc3RSZWFkLmFkZCgoT25Qb3N0UmVhZCkgbGlzdGVuZXIpOworICAgICAgICAgICAgbWF0Y2hlcy5hZGQob25Qb3N0UmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgT25QcmVUcmFuc2ZlclRvKQorICAgICAgICB7CisgICAgICAgICAgICBvblByZVRyYW5zZmVyVG8uYWRkKChPblByZVRyYW5zZmVyVG8pIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9uUHJlVHJhbnNmZXJUbyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgT25Qb3N0VHJhbnNmZXJUbykKKyAgICAgICAgeworICAgICAgICAgICAgb25Qb3N0VHJhbnNmZXJUby5hZGQoKE9uUG9zdFRyYW5zZmVyVG8pIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9uUG9zdFRyYW5zZmVyVG8pOworICAgICAgICB9CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIE9uUHJlV3JpdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIG9uUHJlV3JpdGUuYWRkKChPblByZVdyaXRlKSBsaXN0ZW5lcik7CisgICAgICAgICAgICBtYXRjaGVzLmFkZChvblByZVdyaXRlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBPblBvc3RXcml0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgb25Qb3N0V3JpdGUuYWRkKChPblBvc3RXcml0ZSkgbGlzdGVuZXIpOworICAgICAgICAgICAgbWF0Y2hlcy5hZGQob25Qb3N0V3JpdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIE9uUHJlVHJhbnNmZXJGcm9tKQorICAgICAgICB7CisgICAgICAgICAgICBvblByZVRyYW5zZmVyRnJvbS5hZGQoKE9uUHJlVHJhbnNmZXJGcm9tKSBsaXN0ZW5lcik7CisgICAgICAgICAgICBtYXRjaGVzLmFkZChvblByZVRyYW5zZmVyRnJvbSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgT25Qb3N0VHJhbnNmZXJGcm9tKQorICAgICAgICB7CisgICAgICAgICAgICBvblBvc3RUcmFuc2ZlckZyb20uYWRkKChPblBvc3RUcmFuc2ZlckZyb20pIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9uUG9zdFRyYW5zZmVyRnJvbSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgT25QcmVGb3JjZSkKKyAgICAgICAgeworICAgICAgICAgICAgb25QcmVGb3JjZS5hZGQoKE9uUHJlRm9yY2UpIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9uUHJlRm9yY2UpOworICAgICAgICB9CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIE9uUG9zdEZvcmNlKQorICAgICAgICB7CisgICAgICAgICAgICBvblBvc3RGb3JjZS5hZGQoKE9uUG9zdEZvcmNlKSBsaXN0ZW5lcik7CisgICAgICAgICAgICBtYXRjaGVzLmFkZChvblBvc3RGb3JjZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgT25QcmVUcnVuY2F0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgb25QcmVUcnVuY2F0ZS5hZGQoKE9uUHJlVHJ1bmNhdGUpIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9uUHJlVHJ1bmNhdGUpOworICAgICAgICB9CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIE9uUG9zdFRydW5jYXRlKQorICAgICAgICB7CisgICAgICAgICAgICBvblBvc3RUcnVuY2F0ZS5hZGQoKE9uUG9zdFRydW5jYXRlKSBsaXN0ZW5lcik7CisgICAgICAgICAgICBtYXRjaGVzLmFkZChvblBvc3RUcnVuY2F0ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgT25QcmVQb3NpdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgb25QcmVQb3NpdGlvbi5hZGQoKE9uUHJlUG9zaXRpb24pIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIG1hdGNoZXMuYWRkKG9uUHJlUG9zaXRpb24pOworICAgICAgICB9CisgICAgICAgIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIE9uUG9zdFBvc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBvblBvc3RQb3NpdGlvbi5hZGQoKE9uUG9zdFBvc2l0aW9uKSBsaXN0ZW5lcik7CisgICAgICAgICAgICBtYXRjaGVzLmFkZChvblBvc3RQb3NpdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hdGNoZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5hYmxlIHRvIGZpbmQgYSBsaXN0ZW5hYmxlIHR5cGUgZm9yICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpKTsKKyAgICAgICAgcmV0dXJuICgpIC0+IHJlbW92ZShtYXRjaGVzLCBsaXN0ZW5lcik7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUHJlT3BlbihPblByZU9wZW4gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25QcmVPcGVuKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblByZU9wZW4gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gb25QcmVPcGVuKChwYXRoLCBvcHRpb25zLCBhdHRycykgLT4geworICAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQocGF0aCkpCisgICAgICAgICAgICAgICAgY2FsbGJhY2sucHJlT3BlbihwYXRoLCBvcHRpb25zLCBhdHRycyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblBvc3RPcGVuKE9uUG9zdE9wZW4gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25Qb3N0T3BlbihQYXRoRmlsdGVyIGZpbHRlciwgT25Qb3N0T3BlbiBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBvblBvc3RPcGVuKChwYXRoLCBvcHRpb25zLCBhdHRycywgY2hhbm5lbCkgLT4geworICAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQocGF0aCkpCisgICAgICAgICAgICAgICAgY2FsbGJhY2sucG9zdE9wZW4ocGF0aCwgb3B0aW9ucywgYXR0cnMsIGNoYW5uZWwpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25QcmVSZWFkKE9uUHJlUmVhZCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBsaXN0ZW4oY2FsbGJhY2spOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZVJlYWQoUGF0aEZpbHRlciBmaWx0ZXIsIE9uUHJlUmVhZCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBvblByZVJlYWQoKHBhdGgsIGNoYW5uZWwsIHBvc2l0aW9uLCBkc3QpIC0+IHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXIuYWNjZXB0KHBhdGgpKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrLnByZVJlYWQocGF0aCwgY2hhbm5lbCwgcG9zaXRpb24sIGRzdCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblBvc3RSZWFkKE9uUG9zdFJlYWQgY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25Qb3N0UmVhZChQYXRoRmlsdGVyIGZpbHRlciwgT25Qb3N0UmVhZCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBvblBvc3RSZWFkKChwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgZHN0LCByZWFkKSAtPiB7CisgICAgICAgICAgICBpZiAoZmlsdGVyLmFjY2VwdChwYXRoKSkKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5wb3N0UmVhZChwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgZHN0LCByZWFkKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUHJlVHJhbnNmZXJUbyhPblByZVRyYW5zZmVyVG8gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25QcmVUcmFuc2ZlclRvKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblByZVRyYW5zZmVyVG8gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gb25QcmVUcmFuc2ZlclRvKChwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgY291bnQsIHRhcmdldCkgLT4geworICAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQocGF0aCkpCisgICAgICAgICAgICAgICAgY2FsbGJhY2sucHJlVHJhbnNmZXJUbyhwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgY291bnQsIHRhcmdldCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblBvc3RUcmFuc2ZlclRvKE9uUG9zdFRyYW5zZmVyVG8gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25Qb3N0VHJhbnNmZXJUbyhQYXRoRmlsdGVyIGZpbHRlciwgT25Qb3N0VHJhbnNmZXJUbyBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBvblBvc3RUcmFuc2ZlclRvKChwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgY291bnQsIHRhcmdldCwgdHJhbnNmZXJlZCkgLT4geworICAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQocGF0aCkpCisgICAgICAgICAgICAgICAgY2FsbGJhY2sucG9zdFRyYW5zZmVyVG8ocGF0aCwgY2hhbm5lbCwgcG9zaXRpb24sIGNvdW50LCB0YXJnZXQsIHRyYW5zZmVyZWQpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25QcmVUcmFuc2ZlckZyb20oT25QcmVUcmFuc2ZlckZyb20gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25QcmVUcmFuc2ZlckZyb20oUGF0aEZpbHRlciBmaWx0ZXIsIE9uUHJlVHJhbnNmZXJGcm9tIGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9uUHJlVHJhbnNmZXJGcm9tKChwYXRoLCBjaGFubmVsLCBzcmMsIHBvc2l0aW9uLCBjb3VudCkgLT4geworICAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQocGF0aCkpCisgICAgICAgICAgICAgICAgY2FsbGJhY2sucHJlVHJhbnNmZXJGcm9tKHBhdGgsIGNoYW5uZWwsIHNyYywgcG9zaXRpb24sIGNvdW50KTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUG9zdFRyYW5zZmVyRnJvbShPblBvc3RUcmFuc2ZlckZyb20gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25Qb3N0VHJhbnNmZXJGcm9tKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblBvc3RUcmFuc2ZlckZyb20gY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gb25Qb3N0VHJhbnNmZXJGcm9tKChwYXRoLCBjaGFubmVsLCBzcmMsIHBvc2l0aW9uLCBjb3VudCwgdHJhbnNmZXJlZCkgLT4geworICAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQocGF0aCkpCisgICAgICAgICAgICAgICAgY2FsbGJhY2sucG9zdFRyYW5zZmVyRnJvbShwYXRoLCBjaGFubmVsLCBzcmMsIHBvc2l0aW9uLCBjb3VudCwgdHJhbnNmZXJlZCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZVdyaXRlKE9uUHJlV3JpdGUgY2FsbGJhY2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25QcmVXcml0ZShQYXRoRmlsdGVyIGZpbHRlciwgT25QcmVXcml0ZSBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBvblByZVdyaXRlKChwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgc3JjKSAtPiB7CisgICAgICAgICAgICBpZiAoZmlsdGVyLmFjY2VwdChwYXRoKSkKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5wcmVXcml0ZShwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgc3JjKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUG9zdFdyaXRlKE9uUG9zdFdyaXRlIGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxpc3RlbihjYWxsYmFjayk7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUG9zdFdyaXRlKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblBvc3RXcml0ZSBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBvblBvc3RXcml0ZSgocGF0aCwgY2hhbm5lbCwgcG9zaXRpb24sIHNyYywgd3JvdGUpIC0+IHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXIuYWNjZXB0KHBhdGgpKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrLnBvc3RXcml0ZShwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgc3JjLCB3cm90ZSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZVBvc2l0aW9uKE9uUHJlUG9zaXRpb24gY2FsbGJhY2trKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxpc3RlbihjYWxsYmFja2spOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZVBvc2l0aW9uKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblByZVBvc2l0aW9uIGNhbGxiYWNraykKKyAgICB7CisgICAgICAgIHJldHVybiBvblByZVBvc2l0aW9uKChwYXRoLCBjaGFubmVsLCBwb3NpdGlvbiwgbmV3UG9zaXRpb24pIC0+IHsKKyAgICAgICAgICAgaWYgKGZpbHRlci5hY2NlcHQocGF0aCkpCisgICAgICAgICAgICAgICBjYWxsYmFja2sucHJlUG9zaXRpb24ocGF0aCwgY2hhbm5lbCwgcG9zaXRpb24sIG5ld1Bvc2l0aW9uKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUG9zdFBvc2l0aW9uKE9uUG9zdFBvc2l0aW9uIGNhbGxiYWNraykKKyAgICB7CisgICAgICAgIHJldHVybiBsaXN0ZW4oY2FsbGJhY2trKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5zdWJzY3JpYmFibGUgb25Qb3N0UG9zaXRpb24oUGF0aEZpbHRlciBmaWx0ZXIsIE9uUG9zdFBvc2l0aW9uIGNhbGxiYWNraykKKyAgICB7CisgICAgICAgIHJldHVybiBvblBvc3RQb3NpdGlvbigocGF0aCwgY2hhbm5lbCwgcG9zaXRpb24sIG5ld1Bvc2l0aW9uKSAtPiB7CisgICAgICAgICAgICBpZiAoZmlsdGVyLmFjY2VwdChwYXRoKSkKKyAgICAgICAgICAgICAgICBjYWxsYmFja2sucG9zdFBvc2l0aW9uKHBhdGgsIGNoYW5uZWwsIHBvc2l0aW9uLCBuZXdQb3NpdGlvbik7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZVRydW5jYXRlKE9uUHJlVHJ1bmNhdGUgY2FsbGJhY2trKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxpc3RlbihjYWxsYmFja2spOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZVRydW5jYXRlKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblByZVRydW5jYXRlIGNhbGxiYWNraykKKyAgICB7CisgICAgICAgIHJldHVybiBvblByZVRydW5jYXRlKChwYXRoLCBjaGFubmVsLCBzaXplLCB0YXJnZXRTaXplKSAtPiB7CisgICAgICAgICAgICBpZiAoZmlsdGVyLmFjY2VwdChwYXRoKSkKKyAgICAgICAgICAgICAgICBjYWxsYmFja2sucHJlVHJ1bmNhdGUocGF0aCwgY2hhbm5lbCwgc2l6ZSwgdGFyZ2V0U2l6ZSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblBvc3RUcnVuY2F0ZShPblBvc3RUcnVuY2F0ZSBjYWxsYmFja2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrayk7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUG9zdFRydW5jYXRlKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblBvc3RUcnVuY2F0ZSBjYWxsYmFja2spCisgICAgeworICAgICAgICByZXR1cm4gb25Qb3N0VHJ1bmNhdGUoKHBhdGgsIGNoYW5uZWwsIHNpemUsIHRhcmdldFNpemUsIG5ld1NpemUpIC0+IHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXIuYWNjZXB0KHBhdGgpKQorICAgICAgICAgICAgICAgIGNhbGxiYWNray5wb3N0VHJ1bmNhdGUocGF0aCwgY2hhbm5lbCwgc2l6ZSwgdGFyZ2V0U2l6ZSwgbmV3U2l6ZSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZUZvcmNlKE9uUHJlRm9yY2UgY2FsbGJhY2trKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxpc3RlbihjYWxsYmFja2spOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblByZUZvcmNlKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblByZUZvcmNlIGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG9uUHJlRm9yY2UoKHBhdGgsIGNoYW5uZWwsIG1ldGFkYXRhKSAtPiB7CisgICAgICAgICAgICBpZiAoZmlsdGVyLmFjY2VwdChwYXRoKSkKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5wcmVGb3JjZShwYXRoLCBjaGFubmVsLCBtZXRhZGF0YSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBVbnN1YnNjcmliYWJsZSBvblBvc3RGb3JjZShPblBvc3RGb3JjZSBjYWxsYmFja2spCisgICAgeworICAgICAgICByZXR1cm4gbGlzdGVuKGNhbGxiYWNrayk7CisgICAgfQorCisgICAgcHVibGljIFVuc3Vic2NyaWJhYmxlIG9uUG9zdEZvcmNlKFBhdGhGaWx0ZXIgZmlsdGVyLCBPblBvc3RGb3JjZSBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHJldHVybiBvblBvc3RGb3JjZSgocGF0aCwgY2hhbm5lbCwgbWV0YWRhdGEpIC0+IHsKKyAgICAgICAgICAgIGlmIChmaWx0ZXIuYWNjZXB0KHBhdGgpKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrLnBvc3RGb3JjZShwYXRoLCBjaGFubmVsLCBtZXRhZGF0YSk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZShMaXN0ZW5lciBsaXN0ZW5lcikKKyAgICB7CisgICAgICAgIHJlbW92ZShsaXN0cywgbGlzdGVuZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlKExpc3Q8TGlzdDw/IGV4dGVuZHMgTGlzdGVuZXI+PiBsaXN0cywgTGlzdGVuZXIgbGlzdGVuZXIpCisgICAgeworICAgICAgICBsaXN0cy5mb3JFYWNoKGwgLT4gbC5yZW1vdmUobGlzdGVuZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhckxpc3RlbmVycygpCisgICAgeworICAgICAgICBsaXN0cy5mb3JFYWNoKExpc3Q6OmNsZWFyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludGVyZmFjZSBMaXN0ZW5lckFjdGlvbjxUPgorICAgIHsKKyAgICAgICAgdm9pZCBhY2NlcHQoVCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgPFQ+IHZvaWQgbm90aWZ5TGlzdGVuZXJzKExpc3Q8VD4gbGlzdGVuZXJzLCBMaXN0ZW5lckFjdGlvbjxUPiBmbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBmb3IgKFQgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpCisgICAgICAgICAgICBmbi5hY2NlcHQobGlzdGVuZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBQYXRoIHdyYXAoUGF0aCBwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHAgaW5zdGFuY2VvZiBMaXN0ZW5hYmxlUGF0aCA/IHAgOiBuZXcgTGlzdGVuYWJsZVBhdGgocCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFBhdGggdW53cmFwKFBhdGggcCkKKyAgICB7CisgICAgICAgIHJldHVybiBwIGluc3RhbmNlb2YgTGlzdGVuYWJsZVBhdGggPyAoKExpc3RlbmFibGVQYXRoKSBwKS5kZWxlZ2F0ZSA6IHA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3RlbmFibGVGaWxlU3lzdGVtUHJvdmlkZXIgcHJvdmlkZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVyOworICAgIH0KKworCisgICAgcHJpdmF0ZSBjbGFzcyBMaXN0ZW5hYmxlRmlsZVN5c3RlbVByb3ZpZGVyIGV4dGVuZHMgRm9yd2FyZGluZ0ZpbGVTeXN0ZW1Qcm92aWRlcgorICAgIHsKKyAgICAgICAgTGlzdGVuYWJsZUZpbGVTeXN0ZW1Qcm92aWRlcihGaWxlU3lzdGVtUHJvdmlkZXIgZGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGRlbGVnYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUGF0aCB3cmFwKFBhdGggYSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExpc3RlbmFibGVGaWxlU3lzdGVtLnRoaXMud3JhcChhKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUGF0aCB1bndyYXAoUGF0aCBwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTGlzdGVuYWJsZUZpbGVTeXN0ZW0udGhpcy51bndyYXAocCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBuZXdPdXRwdXRTdHJlYW0oUGF0aCBwYXRoLCBPcGVuT3B0aW9uLi4uIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGVuID0gb3B0aW9ucy5sZW5ndGg7CisgICAgICAgICAgICBTZXQ8T3Blbk9wdGlvbj4gb3B0cyA9IG5ldyBIYXNoU2V0PD4obGVuICsgMyk7CisgICAgICAgICAgICBpZiAobGVuID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3B0cy5hZGQoU3RhbmRhcmRPcGVuT3B0aW9uLkNSRUFURSk7CisgICAgICAgICAgICAgICAgb3B0cy5hZGQoU3RhbmRhcmRPcGVuT3B0aW9uLlRSVU5DQVRFX0VYSVNUSU5HKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IgKE9wZW5PcHRpb24gb3B0IDogb3B0aW9ucykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcHQgPT0gU3RhbmRhcmRPcGVuT3B0aW9uLlJFQUQpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSRUFEIG5vdCBhbGxvd2VkIik7CisgICAgICAgICAgICAgICAgICAgIG9wdHMuYWRkKG9wdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3B0cy5hZGQoU3RhbmRhcmRPcGVuT3B0aW9uLldSSVRFKTsKKyAgICAgICAgICAgIHJldHVybiBDaGFubmVscy5uZXdPdXRwdXRTdHJlYW0obmV3RmlsZUNoYW5uZWwocGF0aCwgb3B0cykpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbShQYXRoIHBhdGgsIE9wZW5PcHRpb24uLi4gb3B0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoT3Blbk9wdGlvbiBvcHQgOiBvcHRpb25zKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIEFsbCBPcGVuT3B0aW9uIHZhbHVlcyBleGNlcHQgZm9yIEFQUEVORCBhbmQgV1JJVEUgYXJlIGFsbG93ZWQKKyAgICAgICAgICAgICAgICBpZiAob3B0ID09IFN0YW5kYXJkT3Blbk9wdGlvbi5BUFBFTkQgfHwKKyAgICAgICAgICAgICAgICAgICAgb3B0ID09IFN0YW5kYXJkT3Blbk9wdGlvbi5XUklURSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCInIiArIG9wdCArICInIG5vdCBhbGxvd2VkIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTZXQ8T3Blbk9wdGlvbj4gb3B0cyA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdChvcHRpb25zKSk7CisgICAgICAgICAgICByZXR1cm4gQ2hhbm5lbHMubmV3SW5wdXRTdHJlYW0obmV3RmlsZUNoYW5uZWwocGF0aCwgb3B0cykpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZWVrYWJsZUJ5dGVDaGFubmVsIG5ld0J5dGVDaGFubmVsKFBhdGggcGF0aCwgU2V0PD8gZXh0ZW5kcyBPcGVuT3B0aW9uPiBvcHRpb25zLCBGaWxlQXR0cmlidXRlPD8+Li4uIGF0dHJzKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG5ld0ZpbGVDaGFubmVsKHBhdGgsIG9wdGlvbnMsIGF0dHJzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRmlsZUNoYW5uZWwgbmV3RmlsZUNoYW5uZWwoUGF0aCBwYXRoLCBTZXQ8PyBleHRlbmRzIE9wZW5PcHRpb24+IG9wdGlvbnMsIEZpbGVBdHRyaWJ1dGU8Pz4uLi4gYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25QcmVPcGVuLCBsIC0+IGwucHJlT3BlbihwYXRoLCBvcHRpb25zLCBhdHRycykpOworICAgICAgICAgICAgTGlzdGVuYWJsZUZpbGVDaGFubmVsIGNoYW5uZWwgPSBuZXcgTGlzdGVuYWJsZUZpbGVDaGFubmVsKHBhdGgsIGRlbGVnYXRlKCkubmV3RmlsZUNoYW5uZWwodW53cmFwKHBhdGgpLCBvcHRpb25zLCBhdHRycykpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUG9zdE9wZW4sIGwgLT4gbC5wb3N0T3BlbihwYXRoLCBvcHRpb25zLCBhdHRycywgY2hhbm5lbCkpOworICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFzeW5jaHJvbm91c0ZpbGVDaGFubmVsIG5ld0FzeW5jaHJvbm91c0ZpbGVDaGFubmVsKFBhdGggcGF0aCwgU2V0PD8gZXh0ZW5kcyBPcGVuT3B0aW9uPiBvcHRpb25zLCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IsIEZpbGVBdHRyaWJ1dGU8Pz4uLi4gYXR0cnMpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRPRE8iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGJsb2NrIHRoZSBBUElzIHRoYXQgdHJ5IHRvIHN3aXRjaCBGaWxlU3lzdGVtIGJhc2VkIG9mZiBzY2hlbWEKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGaWxlU3lzdGVtIG5ld0ZpbGVTeXN0ZW0oVVJJIHVyaSwgTWFwPFN0cmluZywgPz4gZW52KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZpbGVTeXN0ZW0gbmV3RmlsZVN5c3RlbShQYXRoIHBhdGgsIE1hcDxTdHJpbmcsID8+IGVudikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZpbGVTeXN0ZW0gZ2V0RmlsZVN5c3RlbShVUkkgdXJpKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTGlzdGVuYWJsZVBhdGggZXh0ZW5kcyBGb3J3YXJkaW5nUGF0aAorICAgIHsKKyAgICAgICAgcHVibGljIExpc3RlbmFibGVQYXRoKFBhdGggZGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGRlbGVnYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUGF0aCB3cmFwKFBhdGggYSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExpc3RlbmFibGVGaWxlU3lzdGVtLnRoaXMud3JhcChhKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUGF0aCB1bndyYXAoUGF0aCBwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTGlzdGVuYWJsZUZpbGVTeXN0ZW0udGhpcy51bndyYXAocCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZpbGVTeXN0ZW0gZ2V0RmlsZVN5c3RlbSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMaXN0ZW5hYmxlRmlsZVN5c3RlbS50aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGaWxlIHRvRmlsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkZWxlZ2F0ZSgpLmdldEZpbGVTeXN0ZW0oKSA9PSBGaWxlU3lzdGVtcy5nZXREZWZhdWx0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkudG9GaWxlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTGlzdGVuYWJsZUZpbGVDaGFubmVsIGV4dGVuZHMgRm9yd2FyZGluZ0ZpbGVDaGFubmVsCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxNYXBwZWQ+IG11dGFibGUgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXRoIHBhdGg7CisKKyAgICAgICAgTGlzdGVuYWJsZUZpbGVDaGFubmVsKFBhdGggcGF0aCwgRmlsZUNoYW5uZWwgZGVsZWdhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGRlbGVnYXRlKTsKKyAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZWFkKEJ5dGVCdWZmZXIgZHN0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IHBvc2l0aW9uKCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25QcmVSZWFkLCBsIC0+IGwucHJlUmVhZChwYXRoLCB0aGlzLCBwb3NpdGlvbiwgZHN0KSk7CisgICAgICAgICAgICBpbnQgcmVhZCA9IHN1cGVyLnJlYWQoZHN0KTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyhvblBvc3RSZWFkLCBsIC0+IGwucG9zdFJlYWQocGF0aCwgdGhpcywgcG9zaXRpb24sIGRzdCwgcmVhZCkpOworICAgICAgICAgICAgcmV0dXJuIHJlYWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZWFkKEJ5dGVCdWZmZXIgZHN0LCBsb25nIHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUHJlUmVhZCwgbCAtPiBsLnByZVJlYWQocGF0aCwgdGhpcywgcG9zaXRpb24sIGRzdCkpOworICAgICAgICAgICAgaW50IHJlYWQgPSBzdXBlci5yZWFkKGRzdCwgcG9zaXRpb24pOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUG9zdFJlYWQsIGwgLT4gbC5wb3N0UmVhZChwYXRoLCB0aGlzLCBwb3NpdGlvbiwgZHN0LCByZWFkKSk7CisgICAgICAgICAgICByZXR1cm4gcmVhZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHdyaXRlKEJ5dGVCdWZmZXIgc3JjKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IHBvc2l0aW9uKCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25QcmVXcml0ZSwgbCAtPiBsLnByZVdyaXRlKHBhdGgsIHRoaXMsIHBvc2l0aW9uLCBzcmMpKTsKKyAgICAgICAgICAgIGludCB3cml0ZSA9IHN1cGVyLndyaXRlKHNyYyk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25Qb3N0V3JpdGUsIGwgLT4gbC5wb3N0V3JpdGUocGF0aCwgdGhpcywgcG9zaXRpb24sIHNyYywgd3JpdGUpKTsKKyAgICAgICAgICAgIHJldHVybiB3cml0ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHdyaXRlKEJ5dGVCdWZmZXIgc3JjLCBsb25nIHBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUHJlV3JpdGUsIGwgLT4gbC5wcmVXcml0ZShwYXRoLCB0aGlzLCBwb3NpdGlvbiwgc3JjKSk7CisgICAgICAgICAgICBpbnQgd3JpdGUgPSBzdXBlci53cml0ZShzcmMsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyhvblBvc3RXcml0ZSwgbCAtPiBsLnBvc3RXcml0ZShwYXRoLCB0aGlzLCBwb3NpdGlvbiwgc3JjLCB3cml0ZSkpOworICAgICAgICAgICAgcmV0dXJuIHdyaXRlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGaWxlQ2hhbm5lbCBwb3NpdGlvbihsb25nIG5ld1Bvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IHBvc2l0aW9uKCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25QcmVQb3NpdGlvbiwgbCAtPiBsLnByZVBvc2l0aW9uKHBhdGgsIHRoaXMsIHBvc2l0aW9uLCBuZXdQb3NpdGlvbikpOworICAgICAgICAgICAgc3VwZXIucG9zaXRpb24obmV3UG9zaXRpb24pOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUG9zdFBvc2l0aW9uLCBsIC0+IGwucG9zdFBvc2l0aW9uKHBhdGgsIHRoaXMsIHBvc2l0aW9uLCBuZXdQb3NpdGlvbikpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZpbGVDaGFubmVsIHRydW5jYXRlKGxvbmcgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgY3VycmVudFNpemUgPSB0aGlzLnNpemUoKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVycyhvblByZVRydW5jYXRlLCBsIC0+IGwucHJlVHJ1bmNhdGUocGF0aCwgdGhpcywgY3VycmVudFNpemUsIHNpemUpKTsKKyAgICAgICAgICAgIHN1cGVyLnRydW5jYXRlKHNpemUpOworICAgICAgICAgICAgbG9uZyBsYXRlc3RTaXplID0gdGhpcy5zaXplKCk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25Qb3N0VHJ1bmNhdGUsIGwgLT4gbC5wb3N0VHJ1bmNhdGUocGF0aCwgdGhpcywgY3VycmVudFNpemUsIHNpemUsIGxhdGVzdFNpemUpKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZvcmNlKGJvb2xlYW4gbWV0YURhdGEpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25QcmVGb3JjZSwgbCAtPiBsLnByZUZvcmNlKHBhdGgsIHRoaXMsIG1ldGFEYXRhKSk7CisgICAgICAgICAgICBzdXBlci5mb3JjZShtZXRhRGF0YSk7CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcnMob25Qb3N0Rm9yY2UsIGwgLT4gbC5wb3N0Rm9yY2UocGF0aCwgdGhpcywgbWV0YURhdGEpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyB0cmFuc2ZlclRvKGxvbmcgcG9zaXRpb24sIGxvbmcgY291bnQsIFdyaXRhYmxlQnl0ZUNoYW5uZWwgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUHJlVHJhbnNmZXJUbywgbCAtPiBsLnByZVRyYW5zZmVyVG8ocGF0aCwgdGhpcywgcG9zaXRpb24sIGNvdW50LCB0YXJnZXQpKTsKKyAgICAgICAgICAgIGxvbmcgdHJhbnNmZXJlZCA9IHN1cGVyLnRyYW5zZmVyVG8ocG9zaXRpb24sIGNvdW50LCB0YXJnZXQpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUG9zdFRyYW5zZmVyVG8sIGwgLT4gbC5wb3N0VHJhbnNmZXJUbyhwYXRoLCB0aGlzLCBwb3NpdGlvbiwgY291bnQsIHRhcmdldCwgdHJhbnNmZXJlZCkpOworICAgICAgICAgICAgcmV0dXJuIHRyYW5zZmVyZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgdHJhbnNmZXJGcm9tKFJlYWRhYmxlQnl0ZUNoYW5uZWwgc3JjLCBsb25nIHBvc2l0aW9uLCBsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUHJlVHJhbnNmZXJGcm9tLCBsIC0+IGwucHJlVHJhbnNmZXJGcm9tKHBhdGgsIHRoaXMsIHNyYywgcG9zaXRpb24sIGNvdW50KSk7CisgICAgICAgICAgICBsb25nIHRyYW5zZmVyZWQgPSBzdXBlci50cmFuc2ZlckZyb20oc3JjLCBwb3NpdGlvbiwgY291bnQpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXJzKG9uUG9zdFRyYW5zZmVyRnJvbSwgbCAtPiBsLnBvc3RUcmFuc2ZlckZyb20ocGF0aCwgdGhpcywgc3JjLCBwb3NpdGlvbiwgY291bnQsIHRyYW5zZmVyZWQpKTsKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2ZlcmVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNYXBwZWRCeXRlQnVmZmVyIG1hcChNYXBNb2RlIG1vZGUsIGxvbmcgcG9zaXRpb24sIGxvbmcgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgYmVoYXZpb3IgaXNuJ3QgMTAwJSBjb3JyZWN0Li4uIGlmIHlvdSBtaXggYWNjZXNzIHdpdGggRmlsZUNoYW5lbCBhbmQgQnl0ZUJ1ZmZlciB5b3Ugd2lsbCBnZXQgZGlmZmVyZW50CisgICAgICAgICAgICAvLyByZXN1bHRzIHRoYW4gd2l0aCBhIHJlYWwgbW1hcCBzb2x1dGlvbi4uLiBUaGlzIGxpbWl0YXRpb24gaXMgZHVlIHRvIEJ5dGVCdWZmZXIgYmVpbmcgcHJpdmF0ZSwgc28gbm90IGFibGUKKyAgICAgICAgICAgIC8vIHRvIGNyZWF0ZSBjdXN0b20gQkJzIHRvIG1pbWMgdGhpcyBhY2Nlc3MuLi4KKyAgICAgICAgICAgIGlmIChtb2RlID09IE1hcE1vZGUuUkVBRF9XUklURSAmJiBtdXRhYmxlLmdldCgpICE9IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJtYXAgY2FsbGVkIHR3aWNlIHdpdGggbW9kZSBSRUFEX1dSSVRFOyBmaXJzdCB3YXMgIiArIG11dGFibGUuZ2V0KCkgKyAiLCBub3cgIiArIG5ldyBNYXBwZWQobW9kZSwgbnVsbCwgcG9zaXRpb24sIE1hdGgudG9JbnRFeGFjdChzaXplKSkpOworCisgICAgICAgICAgICBpbnQgaXNpemUgPSBNYXRoLnRvSW50RXhhY3Qoc2l6ZSk7CisgICAgICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIGJiID0gKE1hcHBlZEJ5dGVCdWZmZXIpIEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoaXNpemUpOworCisgICAgICAgICAgICBNYXBwZWQgbWFwcGVkID0gbmV3IE1hcHBlZChtb2RlLCBiYiwgcG9zaXRpb24sIGlzaXplKTsKKyAgICAgICAgICAgIGlmIChtb2RlID09IE1hcE1vZGUuUkVBRF9PTkxZKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLnJlYWRGdWxseSh0aGlzLCBtYXBwZWQuYmIsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBtYXBwZWQuYmIuZmxpcCgpOworCisgICAgICAgICAgICAgICAgUnVubmFibGUgZm9yY2VyID0gKCkgLT4geworICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgTWVtb3J5VXRpbC5zZXRBdHRhY2htZW50KGJiLCBmb3JjZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobW9kZSA9PSBNYXBNb2RlLlJFQURfV1JJVEUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGRlbGVnYXRlKCkuc2l6ZSgpIC0gcG9zaXRpb24gPiAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwucmVhZEZ1bGx5KHRoaXMsIG1hcHBlZC5iYiwgcG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBtYXBwZWQuYmIuZmxpcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB3aXRoIHJlYWwgZmlsZXMgdGhlIEZEIGdldHMgY29waWVkIHNvIHRoZSBjbG9zZSBvZiB0aGUgY2hhbm5lbCBkb2VzIG5vdCBibG9jayB0aGUgQkIgbXV0YXRpb24KKyAgICAgICAgICAgICAgICAvLyBmcm9tIGZsdXNoaW5nLi4uICBpdCdzIHBvc3NpYmxlIHRvIHN1cHBvcnQgdGhpcyB1c2UgY2FzZSwgYnV0IGtlcHQgdGhpbmdzIHNpbXBsaWVyIGZvciBub3cgYnkKKyAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIGlmIHRoZSBiYWNraW5nIGNoYW5uZWwgd2FzIGNsb3NlZC4KKyAgICAgICAgICAgICAgICBSdW5uYWJsZSBmb3JjZXIgPSAoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgbG9jYWwgPSBiYi5kdXBsaWNhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWwucG9zaXRpb24oMCk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgcG9zID0gcG9zaXRpb247CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobG9jYWwuaGFzUmVtYWluaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdyb3RlID0gd3JpdGUobG9jYWwsIHBvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdyb3RlID09IC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IHdyb3RlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5jaGVja2VkSU9FeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIE1lbW9yeVV0aWwuc2V0QXR0YWNobWVudChiYiwgZm9yY2VyKTsKKyAgICAgICAgICAgICAgICBpZiAoIW11dGFibGUuY29tcGFyZUFuZFNldChudWxsLCBtYXBwZWQpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIm1hcCBjYWxsZWQgdHdpY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuc3VwcG9ydGVkIG1vZGU6ICIgKyBtb2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtYXBwZWQuYmI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW1wbENsb3NlQ2hhbm5lbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBzdXBlci5pbXBsQ2xvc2VDaGFubmVsKCk7CisgICAgICAgICAgICBtdXRhYmxlLnNldChudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hcHBlZAorICAgIHsKKyAgICAgICAgZmluYWwgRmlsZUNoYW5uZWwuTWFwTW9kZSBtb2RlOworICAgICAgICBmaW5hbCBNYXBwZWRCeXRlQnVmZmVyIGJiOworICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uOworICAgICAgICBmaW5hbCBpbnQgc2l6ZTsKKworICAgICAgICBwcml2YXRlIE1hcHBlZChGaWxlQ2hhbm5lbC5NYXBNb2RlIG1vZGUsIE1hcHBlZEJ5dGVCdWZmZXIgYmIsIGxvbmcgcG9zaXRpb24sIGludCBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOworICAgICAgICAgICAgdGhpcy5iYiA9IGJiOworICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IHBvc2l0aW9uOworICAgICAgICAgICAgdGhpcy5zaXplID0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJNYXBwZWR7IiArCisgICAgICAgICAgICAgICAgICAgIm1vZGU9IiArIG1vZGUgKworICAgICAgICAgICAgICAgICAgICIsIHBvc2l0aW9uPSIgKyBwb3NpdGlvbiArCisgICAgICAgICAgICAgICAgICAgIiwgc2l6ZT0iICsgc2l6ZSArCisgICAgICAgICAgICAgICAgICAgJ30nOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQmlnVGFibGVXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9CaWdUYWJsZVdyaXRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRkM2M1ZS4uMDAwMDAwMAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9CaWdUYWJsZVdyaXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0qIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0qIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0qCi0qICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotKgotKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0qIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0qICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotKiB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKLQotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlVwZGF0ZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkFic3RyYWN0VHJhbnNhY3Rpb25hbFRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBCaWdUYWJsZVdyaXRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRyYW5zYWN0aW9uYWxUZXN0Ci17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UxID0gIkJpZ1RhYmxlV3JpdGVyVGVzdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkQgPSAiU3RhbmRhcmQxIjsKLQotICAgIHByaXZhdGUgc3RhdGljIENvbHVtbkZhbWlseVN0b3JlIGNmczsKLQotICAgIEBCZWZvcmVDbGFzcwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTY2hlbWFMb2FkZXIucHJlcGFyZVNlcnZlcigpOwotICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2UoS0VZU1BBQ0UxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENGX1NUQU5EQVJELCAwLCBJbnQzMlR5cGUuaW5zdGFuY2UsIEFzY2lpVHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlKSk7Ci0gICAgICAgIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRl9TVEFOREFSRCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFRlc3RhYmxlVHJhbnNhY3Rpb24gbmV3VGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0YWJsZUJUVygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RhYmxlQlRXIGV4dGVuZHMgVGVzdGFibGVUcmFuc2FjdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZSBmaWxlOwotICAgICAgICBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0gICAgICAgIGZpbmFsIFNTVGFibGVUeG5Xcml0ZXIgd3JpdGVyOwotCi0gICAgICAgIHByaXZhdGUgVGVzdGFibGVCVFcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzKGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXREaXJlY3RvcnlGb3JOZXdTU1RhYmxlcygpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFRlc3RhYmxlQlRXKERlc2NyaXB0b3IgZGVzYykKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcyhkZXNjLCBTU1RhYmxlVHhuV3JpdGVyLmNyZWF0ZShjZnMsIGRlc2MsIDAsIDAsIG51bGwsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VyaWFsaXphdGlvbkhlYWRlcih0cnVlLCBjZnMubWV0YWRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLm1ldGFkYXRhKCkucmVndWxhckFuZFN0YXRpY0NvbHVtbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5jb2RpbmdTdGF0cy5OT19TVEFUUykpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgVGVzdGFibGVCVFcoRGVzY3JpcHRvciBkZXNjLCBTU1RhYmxlVHhuV3JpdGVyIHN3KQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcihzdyk7Ci0gICAgICAgICAgICB0aGlzLmZpbGUgPSBuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7Ci0gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjOwotICAgICAgICAgICAgdGhpcy53cml0ZXIgPSBzdzsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVcGRhdGVCdWlsZGVyIHVwZGF0ZSA9IFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmcy5tZXRhZGF0YSgpLCBpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZS5uZXdSb3coaikuYWRkKCJ2YWwiLCBTU1RhYmxlUmV3cml0ZXJUZXN0LnJhbmRvbSgwLCAxMDAwKSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCh1cGRhdGUuYnVpbGQoKS51bmZpbHRlcmVkSXRlcmF0b3IoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRJblByb2dyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnRFeGlzdHMoQ29tcG9uZW50LkRBVEEsIENvbXBvbmVudC5QUklNQVJZX0lOREVYKTsKLSAgICAgICAgICAgIGFzc2VydE5vdEV4aXN0cyhDb21wb25lbnQuRklMVEVSLCBDb21wb25lbnQuU1VNTUFSWSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmaWxlLmxlbmd0aCgpID4gMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRQcmVwYXJlZCgpIHRocm93cyBFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0RXhpc3RzKENvbXBvbmVudC5EQVRBLCBDb21wb25lbnQuUFJJTUFSWV9JTkRFWCwgQ29tcG9uZW50LkZJTFRFUiwgQ29tcG9uZW50LlNVTU1BUlkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0QWJvcnRlZCgpIHRocm93cyBFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0Tm90RXhpc3RzKENvbXBvbmVudC5EQVRBLCBDb21wb25lbnQuUFJJTUFSWV9JTkRFWCwgQ29tcG9uZW50LkZJTFRFUiwgQ29tcG9uZW50LlNVTU1BUlkpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGZpbGUuZXhpc3RzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29tbWl0dGVkKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnRQcmVwYXJlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGNvbW1pdENhblRocm93KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RXhpc3RzKENvbXBvbmVudCAuLi4gY29tcG9uZW50cykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShuZXcgRmlsZShkZXNjcmlwdG9yLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpLmV4aXN0cygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBhc3NlcnROb3RFeGlzdHMoQ29tcG9uZW50IC4uLiBjb21wb25lbnRzKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzKQotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb21wb25lbnQudG9TdHJpbmcoKSwgbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb21wb25lbnQpKS5leGlzdHMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0NRTFNTVGFibGVXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9DUUxTU1RhYmxlV3JpdGVyVGVzdC5qYXZhCmluZGV4IDE4NTEzMTQuLjVkODFkNmMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0NRTFNTVGFibGVXcml0ZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQ1FMU1NUYWJsZVdyaXRlclRlc3QuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLio7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaVByZWRpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CkBAIC01NSw2ICs1Niw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0LlByb3RvY29sVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy4qOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5jdXJyZW50VGltZU1pbGxpczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKQEAgLTg1Miw3ICs4NTQsNyBAQAogICAgICAgICBDUUxTU1RhYmxlV3JpdGVyIHdyaXRlciA9IENRTFNTVGFibGVXcml0ZXIuYnVpbGRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbkRpcmVjdG9yeShkYXRhRGlyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yVGFibGUoc2NoZW1hKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXNpbmcoIklOU0VSVCBJTlRPICIgKyBxdWFsaWZpZWRUYWJsZSArICIgKGssIGMxLCBjMiwgdikgVkFMVUVTICg/LCA/LCA/LCB0ZXh0QXNCbG9iKD8pKSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51c2luZygiSU5TRVJUIElOVE8gIiArIHF1YWxpZmllZFRhYmxlICsgIiAoaywgYzEsIGMyLCB2KSBWQUxVRVMgKD8sID8sID8sIHRleHRfYXNfYmxvYig/KSkiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKIAogICAgICAgICB3cml0ZXIuYWRkUm93KDEsIDIsIDMsICJhYmMiKTsKQEAgLTExMTYsNiArMTExOCwxMjIgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGZpbHRlcmVkLnNpemUoKSk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVXaXRoVGltZXN0YW1wcygpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgbm93ID0gY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9uZyB0aGVuID0gbm93IC0gMTAwMDsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNjaGVtYSA9ICJDUkVBVEUgVEFCTEUgIiArIHF1YWxpZmllZFRhYmxlICsgIiAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICBrIGludCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIHYxIGludCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIHYyIGludCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIHYzIHRleHQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICBQUklNQVJZIEtFWSAoaykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIpIjsKKworICAgICAgICBDUUxTU1RhYmxlV3JpdGVyIHdyaXRlciA9IENRTFNTVGFibGVXcml0ZXIuYnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbkRpcmVjdG9yeShkYXRhRGlyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yVGFibGUoc2NoZW1hKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudXNpbmcoIklOU0VSVCBJTlRPICIgKyBxdWFsaWZpZWRUYWJsZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIChrLCB2MSwgdjIsIHYzKSBWQUxVRVMgKD8sPyw/LD8pIHVzaW5nIHRpbWVzdGFtcCA/IiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIC8vIE5vdGUgdGhhdCwgYWxsIG90aGVyIHRoaW5ncyBiZWluZyBlcXVhbCwgQ2Fzc2FuZHJhIHdpbGwgc29ydCB0aGVzZSByb3dzIGxleGljb2dyYXBoaWNhbGx5LCBzbyB3ZSB1c2UgImhpZ2hlciIgdmFsdWVzIGluIHRoZQorICAgICAgICAvLyByb3cgd2UgZXhwZWN0IHRvICJ3aW4iIHNvIHRoYXQgd2UncmUgc3VyZSB0aGF0IGl0IGlzbid0IGp1c3QgYWNjaWRlbnRhbGx5IHBpY2tlZCBkdWUgdG8gdGhlIHJvdyBzb3J0aW5nLgorICAgICAgICB3cml0ZXIuYWRkUm93KCAxLCA0LCA1LCAiYiIsIG5vdyk7IC8vIFRoaXMgd3JpdGUgc2hvdWxkIGJlIHRoZSBvbmUgZm91bmQgYXQgdGhlIGVuZCBiZWNhdXNlIGl0IGhhcyBhIGhpZ2hlciB0aW1lc3RhbXAKKyAgICAgICAgd3JpdGVyLmFkZFJvdyggMSwgMiwgMywgImEiLCB0aGVuKTsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgIGxvYWRTU1RhYmxlcyhkYXRhRGlyLCBrZXlzcGFjZSk7CisKKyAgICAgICAgVW50eXBlZFJlc3VsdFNldCByZXN1bHRTZXQgPSBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoIlNFTEVDVCAqIEZST00gIiArIHF1YWxpZmllZFRhYmxlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdFNldC5zaXplKCkpOworCisgICAgICAgIEl0ZXJhdG9yPFVudHlwZWRSZXN1bHRTZXQuUm93PiBpdGVyID0gcmVzdWx0U2V0Lml0ZXJhdG9yKCk7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQuUm93IHIxID0gaXRlci5uZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByMS5nZXRJbnQoImsiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCByMS5nZXRJbnQoInYxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgcjEuZ2V0SW50KCJ2MiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgcjEuZ2V0U3RyaW5nKCJ2MyIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXRlci5oYXNOZXh0KCkpOworICAgIH0KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVdpdGhUdGwoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBmaW5hbCBTdHJpbmcgc2NoZW1hID0gIkNSRUFURSBUQUJMRSAiICsgcXVhbGlmaWVkVGFibGUgKyAiICgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIGsgaW50LCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgdjEgaW50LCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgdjIgaW50LCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgdjMgdGV4dCwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIFBSSU1BUlkgS0VZIChrKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIikiOworCisgICAgICAgIENRTFNTVGFibGVXcml0ZXIuQnVpbGRlciBidWlsZGVyID0gQ1FMU1NUYWJsZVdyaXRlci5idWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbkRpcmVjdG9yeShkYXRhRGlyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvclRhYmxlKHNjaGVtYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51c2luZygiSU5TRVJUIElOVE8gIiArIHF1YWxpZmllZFRhYmxlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIChrLCB2MSwgdjIsIHYzKSBWQUxVRVMgKD8sPyw/LD8pIHVzaW5nIFRUTCA/Iik7CisgICAgICAgIENRTFNTVGFibGVXcml0ZXIgd3JpdGVyID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICAvLyBhZGQgYSByb3cgdGhhdCBfc2hvdWxkXyBzaG93IHVwIC0gMSBob3VyIFRUTAorICAgICAgICB3cml0ZXIuYWRkUm93KCAxLCAyLCAzLCAiYSIsIDM2MDApOworICAgICAgICAvLyBJbnNlcnQgYSByb3cgd2l0aCBhIFRUTCBvZiAxIHNlY29uZCAtIHNob3VsZCBub3QgYXBwZWFyIGluIHJlc3VsdHMgb25jZSB3ZSBzbGVlcAorICAgICAgICB3cml0ZXIuYWRkUm93KCAyLCA0LCA1LCAiYiIsIDEpOworICAgICAgICB3cml0ZXIuY2xvc2UoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEyMDApOyAvLyBTbGlnaHRseSBvdmVyIDEgc2Vjb25kLCBqdXN0IHRvIG1ha2Ugc3VyZQorICAgICAgICBsb2FkU1NUYWJsZXMoZGF0YURpciwga2V5c3BhY2UpOworCisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0U2V0ID0gUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKCJTRUxFQ1QgKiBGUk9NICIgKyBxdWFsaWZpZWRUYWJsZSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHRTZXQuc2l6ZSgpKTsKKworICAgICAgICBJdGVyYXRvcjxVbnR5cGVkUmVzdWx0U2V0LlJvdz4gaXRlciA9IHJlc3VsdFNldC5pdGVyYXRvcigpOworICAgICAgICBVbnR5cGVkUmVzdWx0U2V0LlJvdyByMSA9IGl0ZXIubmV4dCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcjEuZ2V0SW50KCJrIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcjEuZ2V0SW50KCJ2MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHIxLmdldEludCgidjIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHIxLmdldFN0cmluZygidjMiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsKKyAgICB9CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVXaXRoVGltZXN0YW1wc0FuZFR0bCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzY2hlbWEgPSAiQ1JFQVRFIFRBQkxFICIgKyBxdWFsaWZpZWRUYWJsZSArICIgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgayBpbnQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICB2MSBpbnQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICB2MiBpbnQsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICB2MyB0ZXh0LCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAgUFJJTUFSWSBLRVkgKGspIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSI7CisKKyAgICAgICAgQ1FMU1NUYWJsZVdyaXRlciB3cml0ZXIgPSBDUUxTU1RhYmxlV3JpdGVyLmJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5EaXJlY3RvcnkoZGF0YURpcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvclRhYmxlKHNjaGVtYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVzaW5nKCJJTlNFUlQgSU5UTyAiICsgcXVhbGlmaWVkVGFibGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoaywgdjEsIHYyLCB2MykgVkFMVUVTICg/LD8sPyw/KSB1c2luZyB0aW1lc3RhbXAgPyBBTkQgVFRMID8iICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIC8vIE5PVEU6IEl0IHdvdWxkIGJlIGVhc2llciB0byBtYWtlIHRoaXMgYSB0aW1lc3RhbXAgaW4gdGhlIHBhc3QsIGJ1dCBDYXNzYW5kcmEgYWxzbyBoYXMgYSBfbG9jYWxfIGRlbGV0aW9uIHRpbWUKKyAgICAgICAgLy8gd2hpY2ggaXMgYmFzZWQgb24gdGhlIHNlcnZlcidzIHRpbWVzdGFtcCwgc28gc2ltcGx5IHNldHRpbmcgdGhlIHRpbWVzdGFtcCB0byBzb21lIHRpbWUgaW4gdGhlIHBhc3QKKyAgICAgICAgLy8gZG9lc24ndCBhY3R1YWxseSBkbyB3aGF0IHlvdSdkIHRoaW5rIGl0IHdvdWxkIGRvLgorICAgICAgICBsb25nIG9uZVNlY29uZEZyb21Ob3cgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFMudG9NaWNyb3MoY3VycmVudFRpbWVNaWxsaXMoKSArIDEwMDApOworICAgICAgICAvLyBJbnNlcnQgc29tZSByb3dzIHdpdGggYSB0aW1lc3RhbXAgb2YgMSBzZWNvbmQgZnJvbSBub3csIGFuZCBkaWZmZXJlbnQgVFRMcworICAgICAgICAvLyBhZGQgYSByb3cgdGhhdCBfc2hvdWxkXyBzaG93IHVwIC0gMSBob3VyIFRUTAorICAgICAgICB3cml0ZXIuYWRkUm93KCAxLCAyLCAzLCAiYSIsIG9uZVNlY29uZEZyb21Ob3csIDM2MDApOworICAgICAgICAvLyBJbnNlcnQgYSByb3cgInR3byBzZWNvbmRzIGFnbyIgd2l0aCBhIFRUTCBvZiAxIHNlY29uZCAtIHNob3VsZCBub3QgYXBwZWFyIGluIHJlc3VsdHMKKyAgICAgICAgd3JpdGVyLmFkZFJvdyggMiwgNCwgNSwgImIiLCBvbmVTZWNvbmRGcm9tTm93LCAxKTsKKyAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgIGxvYWRTU1RhYmxlcyhkYXRhRGlyLCBrZXlzcGFjZSk7CisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcmVzdWx0U2V0ID0gUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKCJTRUxFQ1QgKiBGUk9NICIgKyBxdWFsaWZpZWRUYWJsZSk7CisgICAgICAgIFRocmVhZC5zbGVlcCgxMjAwKTsKKyAgICAgICAgcmVzdWx0U2V0ID0gUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKCJTRUxFQ1QgKiBGUk9NICIgKyBxdWFsaWZpZWRUYWJsZSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHRTZXQuc2l6ZSgpKTsKKworICAgICAgICBJdGVyYXRvcjxVbnR5cGVkUmVzdWx0U2V0LlJvdz4gaXRlciA9IHJlc3VsdFNldC5pdGVyYXRvcigpOworICAgICAgICBVbnR5cGVkUmVzdWx0U2V0LlJvdyByMSA9IGl0ZXIubmV4dCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcjEuZ2V0SW50KCJrIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcjEuZ2V0SW50KCJ2MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHIxLmdldEludCgidjIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHIxLmdldFN0cmluZygidjMiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGl0ZXIuaGFzTmV4dCgpKTsKKyAgICB9CisKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvYWRTU1RhYmxlcyhGaWxlIGRhdGFEaXIsIFN0cmluZyBrcykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KICAgICB7CiAgICAgICAgIFNTVGFibGVMb2FkZXIgbG9hZGVyID0gbmV3IFNTVGFibGVMb2FkZXIoZGF0YURpciwgbmV3IFNTVGFibGVMb2FkZXIuQ2xpZW50KCkKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0NvbXBvbmVudFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0NvbXBvbmVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWI3NjMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvQ29tcG9uZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQuVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVGb3JtYXRUZXN0LkZvcm1hdDE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlRm9ybWF0VGVzdC5Gb3JtYXQyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlRm9ybWF0VGVzdC5mYWN0b3J5OworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdEV4Y2VwdGlvbk9mVHlwZTsKKworcHVibGljIGNsYXNzIENvbXBvbmVudFRlc3QKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EID0gInNlY29uZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJUlNUID0gImZpcnN0IjsKKworICAgIHN0YXRpYworICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCgpIC0+IHsKKyAgICAgICAgICAgIENvbmZpZyBjb25maWcgPSBEYXRhYmFzZURlc2NyaXB0b3IubG9hZENvbmZpZygpOworICAgICAgICAgICAgU1NUYWJsZUZvcm1hdFRlc3QuY29uZmlndXJlKG5ldyBDb25maWcuU1NUYWJsZUNvbmZpZygpLCBuZXcgQmlnRm9ybWF0LkJpZ0Zvcm1hdEZhY3RvcnkoKSwgZmFjdG9yeSgiZmlyc3QiLCBGb3JtYXQxLmNsYXNzKSwgZmFjdG9yeSgic2Vjb25kIiwgRm9ybWF0Mi5jbGFzcykpOworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZXMoKQorICAgIHsKKyAgICAgICAgRnVuY3Rpb248VHlwZSwgQ29tcG9uZW50PiBjb21wb25lbnRGYWN0b3J5ID0gTW9ja2l0by5tb2NrKEZ1bmN0aW9uLmNsYXNzKTsKKworICAgICAgICAvLyBkbyBub3QgYWxsb3cgdG8gZGVmaW5lIGEgdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUgb3IgcmVwciBhcyB0aGUgZXhpc3RpbmcgdHlwZSBmb3IgdGhpcyBvciBwYXJlbnQgZm9ybWF0CisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQXNzZXJ0aW9uRXJyb3IuY2xhc3MpLmlzVGhyb3duQnkoKCkgLT4gVHlwZS5jcmVhdGVTaW5nbGV0b24oQ29tcG9uZW50cy5UeXBlcy5UT0MubmFtZSwgQ29tcG9uZW50cy5UeXBlcy5UT0MucmVwciArICJ4IiwgRm9ybWF0MS5jbGFzcykpOworICAgICAgICBhc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlKEFzc2VydGlvbkVycm9yLmNsYXNzKS5pc1Rocm93bkJ5KCgpIC0+IFR5cGUuY3JlYXRlU2luZ2xldG9uKENvbXBvbmVudHMuVHlwZXMuVE9DLm5hbWUgKyAieCIsIENvbXBvbmVudHMuVHlwZXMuVE9DLnJlcHIsIEZvcm1hdDIuY2xhc3MpKTsKKworICAgICAgICAvLyBhbGxvdyB0byBkZWZpbmUgYSBmb3JtYXQgd2l0aCBvdGhlciBuYW1lIGFuZCByZXByCisgICAgICAgIFR5cGUgdDEgPSBUeXBlLmNyZWF0ZVNpbmdsZXRvbigiT05FIiwgIk9uZS5kYiIsIEZvcm1hdDEuY2xhc3MpOworCisgICAgICAgIC8vIGFsbG93IHRvIGRlZmluZSBhIGZvcm1hdCB3aXRoIHRoZSBzYW1lIG5hbWUgYW5kIHJlcHIgZm9yIHR3byBkaWZmZXJlbnQgZm9ybWF0cworICAgICAgICBUeXBlIHQyZjEgPSBUeXBlLmNyZWF0ZVNpbmdsZXRvbigiVFdPIiwgIlR3by5kYiIsIEZvcm1hdDEuY2xhc3MpOworICAgICAgICBUeXBlIHQyZjIgPSBUeXBlLmNyZWF0ZVNpbmdsZXRvbigiVFdPIiwgIlR3by5kYiIsIEZvcm1hdDIuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHQyZjEpLmlzTm90RXF1YWxUbyh0MmYyKTsKKworICAgICAgICBhc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlKE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKS5pc1Rocm93bkJ5KCgpIC0+IFR5cGUuY3JlYXRlU2luZ2xldG9uKG51bGwsICItVGhyZWUuZGIiLCBGb3JtYXQxLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChUeXBlLmZyb21SZXByZXNlbnRhdGlvbigic2hvdWxkIGJlIGN1c3RvbSIsIEJpZ0Zvcm1hdC5nZXRJbnN0YW5jZSgpKSkuaXNTYW1lQXMoQ29tcG9uZW50cy5UeXBlcy5DVVNUT00pOworICAgICAgICBhc3NlcnRUaGF0KFR5cGUuZnJvbVJlcHJlc2VudGF0aW9uKENvbXBvbmVudHMuVHlwZXMuVE9DLnJlcHIsIEJpZ0Zvcm1hdC5nZXRJbnN0YW5jZSgpKSkuaXNTYW1lQXMoQ29tcG9uZW50cy5UeXBlcy5UT0MpOworICAgICAgICBhc3NlcnRUaGF0KFR5cGUuZnJvbVJlcHJlc2VudGF0aW9uKHQxLnJlcHIsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpLmdldChGSVJTVCkpKS5pc1NhbWVBcyh0MSk7CisgICAgICAgIGFzc2VydFRoYXQoVHlwZS5mcm9tUmVwcmVzZW50YXRpb24odDJmMS5yZXByLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1NUYWJsZUZvcm1hdHMoKS5nZXQoRklSU1QpKSkuaXNTYW1lQXModDJmMSk7CisgICAgICAgIGFzc2VydFRoYXQoVHlwZS5mcm9tUmVwcmVzZW50YXRpb24odDJmMi5yZXByLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1NUYWJsZUZvcm1hdHMoKS5nZXQoU0VDT05EKSkpLmlzU2FtZUFzKHQyZjIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbXBvbmVudHMoKQorICAgIHsKKyAgICAgICAgVHlwZSB0M2YxID0gVHlwZS5jcmVhdGVTaW5nbGV0b24oIlRIUkVFIiwgIlRocmVlLmRiIiwgRm9ybWF0MS5jbGFzcyk7CisgICAgICAgIFR5cGUgdDNmMiA9IFR5cGUuY3JlYXRlU2luZ2xldG9uKCJUSFJFRSIsICJUaHJlZS5kYiIsIEZvcm1hdDIuY2xhc3MpOworICAgICAgICBUeXBlIHQ0ZjEgPSBUeXBlLmNyZWF0ZSgiRk9VUiIsICIuKi1Gb3VyLmRiIiwgRm9ybWF0MS5jbGFzcyk7CisgICAgICAgIFR5cGUgdDRmMiA9IFR5cGUuY3JlYXRlKCJGT1VSIiwgIi4qLUZvdXIuZGIiLCBGb3JtYXQyLmNsYXNzKTsKKworICAgICAgICBDb21wb25lbnQgYzEgPSB0M2YxLmdldFNpbmdsZXRvbigpOworICAgICAgICBDb21wb25lbnQgYzIgPSB0M2YyLmdldFNpbmdsZXRvbigpOworCisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoUnVudGltZUV4Y2VwdGlvbi5jbGFzcykuaXNUaHJvd25CeSgoKSAtPiB0M2YxLmNyZWF0ZUNvbXBvbmVudCh0M2YxLnJlcHIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdEV4Y2VwdGlvbk9mVHlwZShSdW50aW1lRXhjZXB0aW9uLmNsYXNzKS5pc1Rocm93bkJ5KCgpIC0+IHQzZjIuY3JlYXRlQ29tcG9uZW50KHQzZjIucmVwcikpOworICAgICAgICBhc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlKFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MpLmlzVGhyb3duQnkoKCkgLT4gdDRmMS5nZXRTaW5nbGV0b24oKSk7CisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoUnVudGltZUV4Y2VwdGlvbi5jbGFzcykuaXNUaHJvd25CeSgoKSAtPiB0NGYyLmdldFNpbmdsZXRvbigpKTsKKworICAgICAgICBhc3NlcnRUaGF0KENvbXBvbmVudC5wYXJzZSh0M2YxLnJlcHIsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpLmdldChGSVJTVCkpKS5pc1NhbWVBcyhjMSk7CisgICAgICAgIGFzc2VydFRoYXQoQ29tcG9uZW50LnBhcnNlKHQzZjIucmVwciwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTVGFibGVGb3JtYXRzKCkuZ2V0KCJzZWNvbmQiKSkpLmlzU2FtZUFzKGMyKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMSkuaXNOb3RFcXVhbFRvKGMyKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMS50eXBlKS5pc1NhbWVBcyh0M2YxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMi50eXBlKS5pc1NhbWVBcyh0M2YyKTsKKworICAgICAgICBDb21wb25lbnQgYzMgPSBDb21wb25lbnQucGFyc2UoImFiYy1Gb3VyLmRiIiwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTVGFibGVGb3JtYXRzKCkuZ2V0KEZJUlNUKSk7CisgICAgICAgIENvbXBvbmVudCBjNCA9IENvbXBvbmVudC5wYXJzZSgiYWJjLUZvdXIuZGIiLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1NUYWJsZUZvcm1hdHMoKS5nZXQoInNlY29uZCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMy50eXBlKS5pc1NhbWVBcyh0NGYxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjNC50eXBlKS5pc1NhbWVBcyh0NGYyKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMy5uYW1lKS5pc0VxdWFsVG8oImFiYy1Gb3VyLmRiIik7CisgICAgICAgIGFzc2VydFRoYXQoYzQubmFtZSkuaXNFcXVhbFRvKCJhYmMtRm91ci5kYiIpOworICAgICAgICBhc3NlcnRUaGF0KGMzKS5pc05vdEVxdWFsVG8oYzQpOworICAgICAgICBhc3NlcnRUaGF0KGMzKS5pc05vdEVxdWFsVG8oYzEpOworICAgICAgICBhc3NlcnRUaGF0KGM0KS5pc05vdEVxdWFsVG8oYzIpOworCisgICAgICAgIENvbXBvbmVudCBjNSA9IENvbXBvbmVudC5wYXJzZSgiYWJjLUZpdmUuZGIiLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1NUYWJsZUZvcm1hdHMoKS5nZXQoRklSU1QpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjNS50eXBlKS5pc1NhbWVBcyhDb21wb25lbnRzLlR5cGVzLkNVU1RPTSk7CisgICAgICAgIGFzc2VydFRoYXQoYzUubmFtZSkuaXNFcXVhbFRvKCJhYmMtRml2ZS5kYiIpOworCisgICAgICAgIENvbXBvbmVudCBjNiA9IENvbXBvbmVudC5wYXJzZSgiRGF0YS5kYiIsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpLmdldCgic2Vjb25kIikpOworICAgICAgICBhc3NlcnRUaGF0KGM2LnR5cGUpLmlzU2FtZUFzKENvbXBvbmVudHMuVHlwZXMuREFUQSk7CisgICAgICAgIGFzc2VydFRoYXQoYzYpLmlzU2FtZUFzKENvbXBvbmVudHMuREFUQSk7CisKKyAgICAgICAgSGFzaFNldDxDb21wb25lbnQ+IHMxID0gU2V0cy5uZXdIYXNoU2V0KENvbXBvbmVudC5nZXRTaW5nbGV0b25zRm9yKEZvcm1hdDEuY2xhc3MpKTsKKyAgICAgICAgSGFzaFNldDxDb21wb25lbnQ+IHMyID0gU2V0cy5uZXdIYXNoU2V0KENvbXBvbmVudC5nZXRTaW5nbGV0b25zRm9yKEZvcm1hdDIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzMSkuY29udGFpbnMoYzEsIENvbXBvbmVudHMuREFUQSwgQ29tcG9uZW50cy5TVEFUUywgQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzMikuY29udGFpbnMoYzIsIENvbXBvbmVudHMuREFUQSwgQ29tcG9uZW50cy5TVEFUUywgQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzMSkuZG9lc05vdENvbnRhaW4oYzIpOworICAgICAgICBhc3NlcnRUaGF0KHMyKS5kb2VzTm90Q29udGFpbihjMSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChTZXRzLm5ld0hhc2hTZXQoQ29tcG9uZW50LmdldFNpbmdsZXRvbnNGb3IoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTVGFibGVGb3JtYXRzKCkuZ2V0KEZJUlNUKSkpKS5pc0VxdWFsVG8oczEpOworICAgICAgICBhc3NlcnRUaGF0KFNldHMubmV3SGFzaFNldChDb21wb25lbnQuZ2V0U2luZ2xldG9uc0ZvcihEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U1NUYWJsZUZvcm1hdHMoKS5nZXQoInNlY29uZCIpKSkpLmlzRXF1YWxUbyhzMik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvRGVzY3JpcHRvclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0Rlc2NyaXB0b3JUZXN0LmphdmEKaW5kZXggNDA1ZjNkYS4uMTcyMGVhMCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvRGVzY3JpcHRvclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9EZXNjcmlwdG9yVGVzdC5qYXZhCkBAIC0yMCw3ICsyMCw2IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CkBAIC0yOSwxMSArMjgsMTUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRpcmVjdG9yaWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlZlcnNpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogCiBwdWJsaWMgY2xhc3MgRGVzY3JpcHRvclRlc3QKIHsKQEAgLTg0LDE5ICs4NywxOSBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHRlc3RGcm9tRmlsZW5hbWVGb3IoRmlsZSBkaXIpCiAgICAgewotICAgICAgICBjaGVja0Zyb21GaWxlbmFtZShuZXcgRGVzY3JpcHRvcihkaXIsIGtzbmFtZSwgY2ZuYW1lLCBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCgxKSwgU1NUYWJsZUZvcm1hdC5UeXBlLkJJRykpOworICAgICAgICBjaGVja0Zyb21GaWxlbmFtZShuZXcgRGVzY3JpcHRvcihkaXIsIGtzbmFtZSwgY2ZuYW1lLCBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCgxKSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKSk7CiAKICAgICAgICAgLy8gc2Vjb25kYXJ5IGluZGV4CiAgICAgICAgIFN0cmluZyBpZHhOYW1lID0gIm15aWR4IjsKICAgICAgICAgRmlsZSBpZHhEaXIgPSBuZXcgRmlsZShkaXIuYWJzb2x1dGVQYXRoKCkgKyBGaWxlLnBhdGhTZXBhcmF0b3IoKSArIERpcmVjdG9yaWVzLlNFQ09OREFSWV9JTkRFWF9OQU1FX1NFUEFSQVRPUiArIGlkeE5hbWUpOwotICAgICAgICBjaGVja0Zyb21GaWxlbmFtZShuZXcgRGVzY3JpcHRvcihpZHhEaXIsIGtzbmFtZSwgY2ZuYW1lICsgRGlyZWN0b3JpZXMuU0VDT05EQVJZX0lOREVYX05BTUVfU0VQQVJBVE9SICsgaWR4TmFtZSwgbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoNCksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpKTsKKyAgICAgICAgY2hlY2tGcm9tRmlsZW5hbWUobmV3IERlc2NyaXB0b3IoaWR4RGlyLCBrc25hbWUsIGNmbmFtZSArIERpcmVjdG9yaWVzLlNFQ09OREFSWV9JTkRFWF9OQU1FX1NFUEFSQVRPUiArIGlkeE5hbWUsIG5ldyBTZXF1ZW5jZUJhc2VkU1NUYWJsZUlkKDQpLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY2hlY2tGcm9tRmlsZW5hbWUoRGVzY3JpcHRvciBvcmlnaW5hbCkKICAgICB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKG9yaWdpbmFsLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7CisgICAgICAgIEZpbGUgZmlsZSA9IG9yaWdpbmFsLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKTsKIAotICAgICAgICBQYWlyPERlc2NyaXB0b3IsIENvbXBvbmVudD4gcGFpciA9IERlc2NyaXB0b3IuZnJvbUZpbGVuYW1lV2l0aENvbXBvbmVudChmaWxlKTsKKyAgICAgICAgUGFpcjxEZXNjcmlwdG9yLCBDb21wb25lbnQ+IHBhaXIgPSBEZXNjcmlwdG9yLmZyb21GaWxlV2l0aENvbXBvbmVudChmaWxlKTsKICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gcGFpci5sZWZ0OwogCiAgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbC5kaXJlY3RvcnksIGRlc2MuZGlyZWN0b3J5KTsKQEAgLTEwNCw3ICsxMDcsNyBAQAogICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWwuY2ZuYW1lLCBkZXNjLmNmbmFtZSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbC52ZXJzaW9uLCBkZXNjLnZlcnNpb24pOwogICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWwuaWQsIGRlc2MuaWQpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQ29tcG9uZW50LkRBVEEsIHBhaXIucmlnaHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ29tcG9uZW50cy5EQVRBLCBwYWlyLnJpZ2h0KTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTEyLDggKzExNSw4IEBACiAgICAgewogICAgICAgICAvLyBEZXNjcmlwdG9yIHNob3VsZCBiZSBlcXVhbCB3aGVuIHBhcmVudCBkaXJlY3RvcnkgcG9pbnRzIHRvIHRoZSBzYW1lIGRpcmVjdG9yeQogICAgICAgICBGaWxlIGRpciA9IG5ldyBGaWxlKCIuIik7Ci0gICAgICAgIERlc2NyaXB0b3IgZGVzYzEgPSBuZXcgRGVzY3JpcHRvcihkaXIsICJrcyIsICJjZiIsIG5ldyBTZXF1ZW5jZUJhc2VkU1NUYWJsZUlkKDEpLCBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKTsKLSAgICAgICAgRGVzY3JpcHRvciBkZXNjMiA9IG5ldyBEZXNjcmlwdG9yKGRpci50b0Fic29sdXRlKCksICJrcyIsICJjZiIsIG5ldyBTZXF1ZW5jZUJhc2VkU1NUYWJsZUlkKDEpLCBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKTsKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjMSA9IG5ldyBEZXNjcmlwdG9yKGRpciwgImtzIiwgImNmIiwgbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoMSksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CisgICAgICAgIERlc2NyaXB0b3IgZGVzYzIgPSBuZXcgRGVzY3JpcHRvcihkaXIudG9BYnNvbHV0ZSgpLCAia3MiLCAiY2YiLCBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCgxKSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGRlc2MxLCBkZXNjMik7CiAgICAgICAgIGFzc2VydEVxdWFscyhkZXNjMS5oYXNoQ29kZSgpLCBkZXNjMi5oYXNoQ29kZSgpKTsKICAgICB9CkBAIC0xMjEsMTYgKzEyNCwxNiBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVOYW1lcygpCiAgICAgewotICAgICAgICBTdHJpbmdbXSBuYW1lcyA9IHsKLSAgICAgICAgICAgICAibWEtMS1iaWctRGF0YS5kYiIsCi0gICAgICAgICAgICAgLy8gMm5kYXJ5IGluZGV4Ci0gICAgICAgICAgICAgIi5pZHgxIiArIEZpbGUucGF0aFNlcGFyYXRvcigpICsgIm1hLTEtYmlnLURhdGEuZGIiLAotICAgICAgICB9OworICAgICAgICBmaW5hbCBTU1RhYmxlRm9ybWF0PD8sID8+IHNzVGFibGVGb3JtYXQgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCk7CisgICAgICAgIFN0cmluZyBuYW1lID0gc3NUYWJsZUZvcm1hdC5uYW1lKCk7CisgICAgICAgIGZpbmFsIFZlcnNpb24gdmVyc2lvbiA9IHNzVGFibGVGb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpOworICAgICAgICBTdHJpbmdbXSBmaWxlTmFtZXMgPSB7IHZlcnNpb24gKyAiLTEtIiArIG5hbWUgKyAiLURhdGEuZGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDJuZGFyeSBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuaWR4MSIgKyBGaWxlLnBhdGhTZXBhcmF0b3IoKSArIHZlcnNpb24gKyAiLTEtIiArIG5hbWUgKyAiLURhdGEuZGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAKLSAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKERlc2NyaXB0b3IuZnJvbUZpbGVuYW1lKG5hbWUpKTsKLSAgICAgICAgfQorICAgICAgICBmb3IgKFN0cmluZyBmaWxlTmFtZSA6IGZpbGVOYW1lcykKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoRGVzY3JpcHRvci5mcm9tRmlsZVdpdGhDb21wb25lbnQobmV3IEZpbGUoZmlsZU5hbWUpLCBmYWxzZSkubGVmdCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE0Niw3ICsxNDksNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGQgPSBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShuYW1lKTsKKyAgICAgICAgICAgICAgICBEZXNjcmlwdG9yIGQgPSBEZXNjcmlwdG9yLmZyb21GaWxlKG5ldyBGaWxlKG5hbWUpKTsKICAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbChuYW1lKTsKICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CiAgICAgICAgICAgICAgICAgLy9nb29kCkBAIC0xNjAsMTIgKzE2MywxMyBAQAogICAgICAgICAvLyBmcm9tIENhc3NhbmRyYSBkaXJzCiAKICAgICAgICAgU3RyaW5nW10gZmlsZVBhdGhzID0gbmV3IFN0cmluZ1tdewotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYva3MxL3RhYjEtMzQyNDIzNDIzNDMyNC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDI0MjM0MjM0MzI0L3NuYXBzaG90cy9zbmFwc2hvdC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDI0MjM0MjM0MzI0L2JhY2t1cHMvbmEtMS1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYva3MxL3RhYjEtMzQyNDIzNDIzNDMyNC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDI0MjM0MjM0MzI0L3NuYXBzaG90cy9zbmFwc2hvdC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDI0MjM0MjM0MzI0L2JhY2t1cHMvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYva3MxL3RhYjEtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYva3MxL3RhYjEtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvbmItMS1iaWctVE9DLnR4dCIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9zbmFwc2hvdHMvc25hcHNob3QvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYva3MxL3RhYjEtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvYmFja3Vwcy9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9zbmFwc2hvdHMvc25hcHNob3QvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYva3MxL3RhYjEtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvYmFja3Vwcy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCiAgICAgICAgIH07CiAKICAgICAgICAgdGVzdEtleXNwYWNlVGFibGVQYXJzaW5nKGZpbGVQYXRocywgImtzMSIsICJ0YWIxIik7CkBAIC0xNzMsMTIgKzE3NywxMiBAQAogICAgICAgICAvLyBpbmRleGVzCiAKICAgICAgICAgU3RyaW5nW10gZmlsZVBhdGhzSW5kZXhlcyA9IG5ldyBTdHJpbmdbXXsKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjQyMzQyMzQzMjQvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjQyMzQyMzQzMjQvc25hcHNob3RzL3NuYXBzaG90Ly5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDI0MjM0MjM0MzI0L2JhY2t1cHMvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjQyMzQyMzQzMjQvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjQyMzQyMzQzMjQvc25hcHNob3RzL3NuYXBzaG90Ly5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDI0MjM0MjM0MzI0L2JhY2t1cHMvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0Ly5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9zbmFwc2hvdHMvc25hcHNob3QvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L2JhY2t1cHMvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0Ly5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9rczEvdGFiMS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9zbmFwc2hvdHMvc25hcHNob3QvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2tzMS90YWIxLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L2JhY2t1cHMvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKICAgICAgICAgfTsKIAogICAgICAgICB0ZXN0S2V5c3BhY2VUYWJsZVBhcnNpbmcoZmlsZVBhdGhzSW5kZXhlcywgImtzMSIsICJ0YWIxLmluZGV4Iik7CkBAIC0xODYsMjMgKzE5MCwyMyBAQAogICAgICAgICAvLyB3aGF0IGlmIGV2ZW4gYSBzbmFwc2hvdCBvZiBhIGtleXNwYWNlIGFuZCB0YWJsZSBjYWxsZWQgc25hcHNob3RzIGlzIGNhbGxlZCBzbmFwc2hvdHM/CiAKICAgICAgICAgU3RyaW5nW10gZmlsZVBhdGhzV2l0aFNuYXBzaG90S2V5c3BhY2VBbmRUYWJsZSA9IG5ldyBTdHJpbmdbXXsKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4L3NuYXBzaG90cy9zbmFwc2hvdHMvbmEtMS1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvc25hcHNob3RzL3NuYXBzaG90cy03NDI3Mzg0MjczODk0NzgvYmFja3Vwcy9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3OC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3OC9zbmFwc2hvdHMvc25hcHNob3RzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4L2JhY2t1cHMvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvc25hcHNob3RzL3NuYXBzaG90cy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4L3NuYXBzaG90cy9zbmFwc2hvdHMvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvc25hcHNob3RzL3NuYXBzaG90cy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC9iYWNrdXBzL25hLTEtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4NzQyNzM4NDI3Mzg5NDc4NzgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvc25hcHNob3RzL3NuYXBzaG90cy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC9zbmFwc2hvdHMvc25hcHNob3RzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4NzQyNzM4NDI3Mzg5NDc4NzgvYmFja3Vwcy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCiAgICAgICAgIH07CiAKICAgICAgICAgdGVzdEtleXNwYWNlVGFibGVQYXJzaW5nKGZpbGVQYXRoc1dpdGhTbmFwc2hvdEtleXNwYWNlQW5kVGFibGUsICJzbmFwc2hvdHMiLCAic25hcHNob3RzIik7CiAKICAgICAgICAgU3RyaW5nW10gZmlsZVBhdGhzV2l0aFNuYXBzaG90S2V5c3BhY2VBbmRUYWJsZVdpdGhJbmRpY2VzID0gbmV3IFN0cmluZ1tdewotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvc25hcHNob3RzL3NuYXBzaG90cy03NDI3Mzg0MjczODk0NzgvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4L3NuYXBzaG90cy9zbmFwc2hvdHMvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4L2JhY2t1cHMvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4Ly5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3OC9zbmFwc2hvdHMvc25hcHNob3RzLy5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3OC9iYWNrdXBzLy5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4Ly5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4L3NuYXBzaG90cy9zbmFwc2hvdHMvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L3NuYXBzaG90cy9zbmFwc2hvdHMtNzQyNzM4NDI3Mzg5NDc4NzQyNzM4NDI3Mzg5NDc4NzgvYmFja3Vwcy8uaW5kZXgvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvc25hcHNob3RzL3NuYXBzaG90cy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC8uaW5kZXgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvc25hcHNob3RzL3NuYXBzaG90cy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC9zbmFwc2hvdHMvc25hcHNob3RzLy5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9zbmFwc2hvdHMvc25hcHNob3RzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4L2JhY2t1cHMvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKICAgICAgICAgfTsKIAogICAgICAgICB0ZXN0S2V5c3BhY2VUYWJsZVBhcnNpbmcoZmlsZVBhdGhzV2l0aFNuYXBzaG90S2V5c3BhY2VBbmRUYWJsZVdpdGhJbmRpY2VzLCAic25hcHNob3RzIiwgInNuYXBzaG90cy5pbmRleCIpOwpAQCAtMjEwLDEyICsyMTQsMTIgQEAKICAgICAgICAgLy8gd2hhdCBpZiBrZXlzcGFjZSBhbmQgdGFibGUgaXMgY2FsbGVkIGJhY2t1cHM/CiAKICAgICAgICAgU3RyaW5nW10gZmlsZVBhdGhzV2l0aEJhY2t1cHNLZXlzcGFjZUFuZFRhYmxlID0gbmV3IFN0cmluZ1tdewotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3OC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMtNzQyNzM4NDI3Mzg5NDc4L3NuYXBzaG90cy9zbmFwc2hvdHMvbmEtMS1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3OC9iYWNrdXBzL25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy03NDI3Mzg0MjczODk0NzgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3OC9zbmFwc2hvdHMvc25hcHNob3RzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy03NDI3Mzg0MjczODk0NzgvYmFja3Vwcy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMtNzQyNzM4NDI3Mzg5NDc4NzQyNzM4NDI3Mzg5NDc4NzgvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4L3NuYXBzaG90cy9zbmFwc2hvdHMvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4L2JhY2t1cHMvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC9zbmFwc2hvdHMvc25hcHNob3RzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC9iYWNrdXBzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKICAgICAgICAgfTsKIAogICAgICAgICB0ZXN0S2V5c3BhY2VUYWJsZVBhcnNpbmcoZmlsZVBhdGhzV2l0aEJhY2t1cHNLZXlzcGFjZUFuZFRhYmxlLCAiYmFja3VwcyIsICJiYWNrdXBzIik7CkBAIC0yMjQsMTEgKzIyOCwxMiBAQAogCiAgICAgICAgIFN0cmluZ1tdIGxlZ2FjeUZpbGVQYXRoc1dpdGhCYWNrdXBzS2V5c3BhY2VBbmRUYWJsZSA9IG5ldyBTdHJpbmdbXXsKICAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMvbmItMS1iaWctVE9DLnR4dCIsCiAgICAgICAgIC8vIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy9zbmFwc2hvdHMvc25hcHNob3RzL25hLTEtYmlnLUluZGV4LmRiIiwgI25vdCBzdXBwb3J0ZWQgKENBU1NBTkRSQS0xNDAxMykKICAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy9iYWNrdXBzL25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy9uYi0yMi1iaWctSW5kZXguZGIiLAotICAgICAgICAvLyIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMvc25hcHNob3RzL3NuYXBzaG90cy9uYi0yMi1iaWctSW5kZXguZGIiLCAjbm90IHN1cHBvcnRlZCAoQ0FTU0FORFJBLTE0MDEzKQotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzL2JhY2t1cHMvbmItMjItYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgIC8vIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy9zbmFwc2hvdHMvc25hcHNob3RzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwgI25vdCBzdXBwb3J0ZWQgKENBU1NBTkRSQS0xNDAxMykKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy9iYWNrdXBzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKICAgICAgICAgfTsKIAogICAgICAgICB0ZXN0S2V5c3BhY2VUYWJsZVBhcnNpbmcobGVnYWN5RmlsZVBhdGhzV2l0aEJhY2t1cHNLZXlzcGFjZUFuZFRhYmxlLCAiYmFja3VwcyIsICJiYWNrdXBzIik7CkBAIC0yMzYsNTMgKzI0MSw1MyBAQAogICAgICAgICAvLyB3aGF0IGlmIGV2ZW4gYSBzbmFwc2hvdCBvZiBhIGtleXNwYWNlIGFuZCB0YWJsZSBjYWxsZWQgYmFja3VwcyBpcyBjYWxsZWQgc25hcHNob3RzPwogCiAgICAgICAgIFN0cmluZ1tdIGZpbGVQYXRoc1dpdGhCYWNrdXBzS2V5c3BhY2VBbmRUYWJsZVdpdGhJbmRpY2VzID0gbmV3IFN0cmluZ1tdewotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3OC8uaW5kZXgvbmEtMS1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3OC9zbmFwc2hvdHMvc25hcHNob3RzLy5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMtNzQyNzM4NDI3Mzg5NDc4L2JhY2t1cHMvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy03NDI3Mzg0MjczODk0NzgvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy03NDI3Mzg0MjczODk0Nzgvc25hcHNob3RzL3NuYXBzaG90cy8uaW5kZXgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3OC9iYWNrdXBzLy5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMtNzQyNzM4NDI3Mzg5NDc4NzQyNzM4NDI3Mzg5NDc4NzgvLmluZGV4L25hLTEtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9wYXRoL3RvL2Nhc3NhbmRyYS9kYXRhL2RpcjIvZGlyNS9kaXI2L2JhY2t1cHMvYmFja3Vwcy03NDI3Mzg0MjczODk0Nzg3NDI3Mzg0MjczODk0Nzg3OC9zbmFwc2hvdHMvc25hcHNob3RzLy5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMtNzQyNzM4NDI3Mzg5NDc4NzQyNzM4NDI3Mzg5NDc4NzgvYmFja3Vwcy8uaW5kZXgvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4Ly5pbmRleC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvcGF0aC90by9jYXNzYW5kcmEvZGF0YS9kaXIyL2RpcjUvZGlyNi9iYWNrdXBzL2JhY2t1cHMtNzQyNzM4NDI3Mzg5NDc4NzQyNzM4NDI3Mzg5NDc4Nzgvc25hcHNob3RzL3NuYXBzaG90cy8uaW5kZXgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3BhdGgvdG8vY2Fzc2FuZHJhL2RhdGEvZGlyMi9kaXI1L2RpcjYvYmFja3Vwcy9iYWNrdXBzLTc0MjczODQyNzM4OTQ3ODc0MjczODQyNzM4OTQ3ODc4L2JhY2t1cHMvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKICAgICAgICAgfTsKIAogICAgICAgICB0ZXN0S2V5c3BhY2VUYWJsZVBhcnNpbmcoZmlsZVBhdGhzV2l0aEJhY2t1cHNLZXlzcGFjZUFuZFRhYmxlV2l0aEluZGljZXMsICJiYWNrdXBzIiwgImJhY2t1cHMuaW5kZXgiKTsKIAogICAgICAgICBTdHJpbmdbXSBvdXRzaWRlT2ZDYXNzYW5kcmEgPSBuZXcgU3RyaW5nW117Ci0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDI0MjM0MjM0MjM0L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTM0MjQyMzQyMzQyMzQvc25hcHNob3RzL3NuYXBzaG90cy9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDI0MjM0MjM0MjM0L2JhY2t1cHMvbmEtMS1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3RtcC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDI0MjM0MjM0MjM0L25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi9rZXlzcGFjZS90YWJsZS0zNDI0MjM0MjM0MjM0L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTM0MjQyMzQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzQyNDIzNDIzNDIzNC9zbmFwc2hvdHMvc25hcHNob3RzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTM0MjQyMzQyMzQyMzQvYmFja3Vwcy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvdG1wL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTM0MjQyMzQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL2tleXNwYWNlL3RhYmxlLTM0MjQyMzQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiCisgICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9zbmFwc2hvdHMvc25hcHNob3RzL25hLTEtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L2JhY2t1cHMvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIva2V5c3BhY2UvdGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvc25hcHNob3RzL3NuYXBzaG90cy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9iYWNrdXBzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi90bXAvdGVzdHMva2V5c3BhY2UvdGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL2tleXNwYWNlL3RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIgogICAgICAgICB9OwogCiAgICAgICAgIHRlc3RLZXlzcGFjZVRhYmxlUGFyc2luZyhvdXRzaWRlT2ZDYXNzYW5kcmEsICJrZXlzcGFjZSIsICJ0YWJsZSIpOwogCiAgICAgICAgIFN0cmluZ1tdIG91dHNpZGVPZkNhc3NhbmRyYVVwcGVyY2FzZUtleXNwYWNlQW5kVGFibGUgPSBuZXcgU3RyaW5nW117Ci0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9LZXlzcGFjZS9UYWJsZS0yMzQyNDMyNDIzNDIzNC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9LZXlzcGFjZS9UYWJsZS0yMzQyNDMyNDIzNDIzNC9zbmFwc2hvdHMvc25hcHNob3RzL25hLTEtYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL0tleXNwYWNlL1RhYmxlLTIzNDI0MzI0MjM0MjM0L2JhY2t1cHMvbmEtMS1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3RtcC90ZXN0cy9LZXlzcGFjZS9UYWJsZS0yMzQyNDMyNDIzNDIzNC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvS2V5c3BhY2UvVGFibGUtMjM0MjQzMjQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMvS2V5c3BhY2UvVGFibGUtMjM0MjQzMjQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMvS2V5c3BhY2UvVGFibGUtMjM0MjQzMjQyMzQyMzQvc25hcHNob3RzL3NuYXBzaG90cy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9LZXlzcGFjZS9UYWJsZS0yMzQyNDMyNDIzNDIzNC9iYWNrdXBzL25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKLSAgICAgICAgIi90bXAvdGVzdHMvS2V5c3BhY2UvVGFibGUtMjM0MjQzMjQyMzQyMzQvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL0tleXNwYWNlL1RhYmxlLTIzNDI0MzI0MjM0MjM0L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIgorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMvS2V5c3BhY2UvVGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMvS2V5c3BhY2UvVGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvc25hcHNob3RzL3NuYXBzaG90cy9uYS0xLWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9LZXlzcGFjZS9UYWJsZS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9iYWNrdXBzL25hLTEtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi90bXAvdGVzdHMvS2V5c3BhY2UvVGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL0tleXNwYWNlL1RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL0tleXNwYWNlL1RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL0tleXNwYWNlL1RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L3NuYXBzaG90cy9zbmFwc2hvdHMvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMvS2V5c3BhY2UvVGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvYmFja3Vwcy9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIsCisgICAgICAgICIvdG1wL3Rlc3RzL0tleXNwYWNlL1RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi9LZXlzcGFjZS9UYWJsZS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC9uYi0zZzFtXzBudWZfM3ZqNW0yazExMjUxNjVyeGE3LWJpZy1JbmRleC5kYiIKICAgICAgICAgfTsKIAogICAgICAgICB0ZXN0S2V5c3BhY2VUYWJsZVBhcnNpbmcob3V0c2lkZU9mQ2Fzc2FuZHJhVXBwZXJjYXNlS2V5c3BhY2VBbmRUYWJsZSwgIktleXNwYWNlIiwgIlRhYmxlIik7CiAKICAgICAgICAgU3RyaW5nW10gb3V0c2lkZU9mQ2Fzc2FuZHJhSW5kZXhlcyA9IG5ldyBTdHJpbmdbXXsKLSAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTMyNDIzNDIzNDIzNDIzLy5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zMjQyMzQyMzQyMzQyMy9zbmFwc2hvdHMvc25hcHNob3RzLy5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zMjQyMzQyMzQyMzQyMy9iYWNrdXBzLy5pbmRleC9uYS0xLWJpZy1JbmRleC5kYiIsCi0gICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zMjQyMzQyMzQyMzQyMy8uaW5kZXgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzI0MjM0MjM0MjM0MjMvc25hcHNob3RzL3NuYXBzaG90cy8uaW5kZXgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiLAotICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzI0MjM0MjM0MjM0MjMvYmFja3Vwcy8uaW5kZXgvbmItM2cxbV8wbnVmXzN2ajVtMmsxMTI1MTY1cnhhNy1iaWctSW5kZXguZGIiCisgICAgICAgICIvdG1wL3NvbWUvcGF0aC90ZXN0cy9rZXlzcGFjZS90YWJsZS0zNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNDIzNC8uaW5kZXgvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvc25hcHNob3RzL3NuYXBzaG90cy8uaW5kZXgvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvYmFja3Vwcy8uaW5kZXgvbmEtMS1iaWctSW5kZXguZGIiLAorICAgICAgICAiL3RtcC9zb21lL3BhdGgvdGVzdHMva2V5c3BhY2UvdGFibGUtMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQyMzQvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L3NuYXBzaG90cy9zbmFwc2hvdHMvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIiwKKyAgICAgICAgIi90bXAvc29tZS9wYXRoL3Rlc3RzL2tleXNwYWNlL3RhYmxlLTM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0MjM0L2JhY2t1cHMvLmluZGV4L25iLTNnMW1fMG51Zl8zdmo1bTJrMTEyNTE2NXJ4YTctYmlnLUluZGV4LmRiIgogICAgICAgICB9OwogCiAgICAgICAgIHRlc3RLZXlzcGFjZVRhYmxlUGFyc2luZyhvdXRzaWRlT2ZDYXNzYW5kcmFJbmRleGVzLCAia2V5c3BhY2UiLCAidGFibGUuaW5kZXgiKTsKQEAgLTI5OSwxMCArMzA0LDEwIEBACiAgICAgewogICAgICAgICBmb3IgKFN0cmluZyBmaWxlUGF0aCA6IGZpbGVQYXRocykKICAgICAgICAgewotICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUoZmlsZVBhdGgpOworICAgICAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gRGVzY3JpcHRvci5mcm9tRmlsZShuZXcgRmlsZShmaWxlUGF0aCkpOwogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkS2V5c3BhY2UsIGRlc2NyaXB0b3Iua3NuYW1lKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRUYWJsZSwgZGVzY3JpcHRvci5jZm5hbWUpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCBrZXlzcGFjZSBub3QgZm91bmQgZm9yICVzIiwgZmlsZVBhdGgpLCBleHBlY3RlZEtleXNwYWNlLCBkZXNjcmlwdG9yLmtzbmFtZSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIHRhYmxlIG5vdCBmb3VuZCBmb3IgJXMiLCBmaWxlUGF0aCksIGV4cGVjdGVkVGFibGUsIGRlc2NyaXB0b3IuY2ZuYW1lKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4U3VtbWFyeU1hbmFnZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlNYW5hZ2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDk0ZTNjLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4U3VtbWFyeU1hbmFnZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ODggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC4qOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5Kb2luZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5TZXRzOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uY3VycmVudC5OYW1lZFRocmVhZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkluZm87Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlJlc3RvcmFibGVNZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ2FjaGluZ1BhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYVRlc3RVdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwotCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwLm9mOwotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbC5hc3NlcnRPbkRpc2tTdGF0ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Eb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbi5ET1dOU0FNUExFX1RIRVNIT0xEOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4U3VtbWFyeVJlZGlzdHJpYnV0aW9uLlVQU0FNUExFX1RIUkVTSE9MRDsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotcHVibGljIGNsYXNzIEluZGV4U3VtbWFyeU1hbmFnZXJUZXN0Ci17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEluZGV4U3VtbWFyeU1hbmFnZXJUZXN0LmNsYXNzKTsKLQotICAgIGludCBvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWw7Ci0gICAgaW50IG9yaWdpbmFsTWF4SW5kZXhJbnRlcnZhbDsKLSAgICBsb25nIG9yaWdpbmFsQ2FwYWNpdHk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UxID0gIkluZGV4U3VtbWFyeU1hbmFnZXJUZXN0IjsKLSAgICAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRExPV2lJTlRFUlZBTCA9ICJTdGFuZGFyZExvd0luZGV4SW50ZXJ2YWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRFJBQ0UgPSAiU3RhbmRhcmRSYWNlIjsKLQotICAgIEBCZWZvcmVDbGFzcwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKLSAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRExPV2lJTlRFUlZBTCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taW5JbmRleEludGVydmFsKDgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4SW5kZXhJbnRlcnZhbCgyNTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FjaGluZyhDYWNoaW5nUGFyYW1zLkNBQ0hFX05PVEhJTkcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENGX1NUQU5EQVJEUkFDRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taW5JbmRleEludGVydmFsKDgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4SW5kZXhJbnRlcnZhbCgyNTYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FjaGluZyhDYWNoaW5nUGFyYW1zLkNBQ0hFX05PVEhJTkcpKTsKLSAgICB9Ci0KLSAgICBAQmVmb3JlCi0gICAgcHVibGljIHZvaWQgYmVmb3JlVGVzdCgpCi0gICAgewotICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOwotICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUw7IC8vIGluZGV4IGludGVydmFsIG9mIDgsIG5vIGtleSBjYWNoaW5nCi0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotICAgICAgICBvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgPSBjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsKLSAgICAgICAgb3JpZ2luYWxNYXhJbmRleEludGVydmFsID0gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1heEluZGV4SW50ZXJ2YWw7Ci0gICAgICAgIG9yaWdpbmFsQ2FwYWNpdHkgPSBJbmRleFN1bW1hcnlNYW5hZ2VyLmluc3RhbmNlLmdldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoKTsKLSAgICB9Ci0KLSAgICBAQWZ0ZXIKLSAgICBwdWJsaWMgdm9pZCBhZnRlclRlc3QoKQotICAgIHsKLSAgICAgICAgZm9yIChDb21wYWN0aW9uSW5mby5Ib2xkZXIgaG9sZGVyIDogQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmdldENvbXBhY3Rpb25zKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGhvbGRlci5zdG9wKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOwotICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUw7IC8vIGluZGV4IGludGVydmFsIG9mIDgsIG5vIGtleSBjYWNoaW5nCi0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotCi0gICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1pbkluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsKS5idWlsZCgpKTsKLSAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWF4SW5kZXhJbnRlcnZhbChvcmlnaW5hbE1heEluZGV4SW50ZXJ2YWwpLmJ1aWxkKCkpOwotCi0gICAgICAgIEluZGV4U3VtbWFyeU1hbmFnZXIuaW5zdGFuY2Uuc2V0TWVtb3J5UG9vbENhcGFjaXR5SW5NQihvcmlnaW5hbENhcGFjaXR5KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIHRvdGFsT2ZmSGVhcFNpemUoTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcykKLSAgICB7Ci0gICAgICAgIGxvbmcgdG90YWwgPSAwOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICAgICAgdG90YWwgKz0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlPZmZIZWFwU2l6ZSgpOwotICAgICAgICByZXR1cm4gdG90YWw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTU1RhYmxlUmVhZGVyPiByZXNldFN1bW1hcmllcyhDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMsIGxvbmcgb3JpZ2luYWxPZmZIZWFwU2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICAgICAgc3N0YWJsZS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEwMC4wLCAxMDAuMCkpOwotCi0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgb3JpZ2luYWxPZmZIZWFwU2l6ZSAqIHNzdGFibGVzLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0KLSAgICAgICAgcmV0dXJuIHNzdGFibGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZURhdGEoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgbnVtUGFydGl0aW9uKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1QYXJ0aXRpb247IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgUm93IHJvdyA9IFV0aWwuZ2V0T25seVJvd1VuZmlsdGVyZWQoVXRpbC5jbWQoY2ZzLCBTdHJpbmcuZm9ybWF0KCIlM2QiLCBpKSkuYnVpbGQoKSk7Ci0gICAgICAgICAgICBDZWxsPD8+IGNlbGwgPSByb3cuZ2V0Q2VsbChjZnMubWV0YWRhdGEoKS5nZXRDb2x1bW4oQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoInZhbCIpKSk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNlbGwpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgY2VsbC5idWZmZXIoKS5hcnJheSgpLmxlbmd0aCk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgQ29tcGFyYXRvcjxTU1RhYmxlUmVhZGVyPiBob3RuZXNzQ29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yPFNTVGFibGVSZWFkZXI+KCkKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShTU1RhYmxlUmVhZGVyIG8xLCBTU1RhYmxlUmVhZGVyIG8yKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRG91YmxlLmNvbXBhcmUobzEuZ2V0UmVhZE1ldGVyKCkuZmlmdGVlbk1pbnV0ZVJhdGUoKSwgbzIuZ2V0UmVhZE1ldGVyKCkuZmlmdGVlbk1pbnV0ZVJhdGUoKSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNTVGFibGVzKFN0cmluZyBrc25hbWUsIFN0cmluZyBjZm5hbWUsIGludCBudW1TU1RhYmxlcywgaW50IG51bVBhcnRpdGlvbikKLSAgICB7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOwotICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0KLSAgICAgICAgQXJyYXlMaXN0PEZ1dHVyZT4gZnV0dXJlcyA9IG5ldyBBcnJheUxpc3Q8PihudW1TU1RhYmxlcyk7Ci0gICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMTAwXSk7Ci0gICAgICAgIGZvciAoaW50IHNzdGFibGUgPSAwOyBzc3RhYmxlIDwgbnVtU1NUYWJsZXM7IHNzdGFibGUrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBudW1QYXJ0aXRpb247IHArKykKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBTdHJpbmcuZm9ybWF0KCIlM2QiLCBwKTsKLSAgICAgICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwga2V5KQotICAgICAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiY29sdW1uIikKLSAgICAgICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnV0dXJlcy5hZGQoY2ZzLmZvcmNlRmx1c2goQ29sdW1uRmFtaWx5U3RvcmUuRmx1c2hSZWFzb24uVU5JVF9URVNUUykpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoRnV0dXJlIGZ1dHVyZSA6IGZ1dHVyZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZ1dHVyZS5nZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB8IEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhudW1TU1RhYmxlcywgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7Ci0gICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVBhcnRpdGlvbik7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlTWluSW5kZXhJbnRlcnZhbCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKLSAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZwotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKLSAgICAgICAgaW50IG51bVNTVGFibGVzID0gMTsKLSAgICAgICAgaW50IG51bVJvd3MgPSAyNTY7Ci0gICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7Ci0KLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PihjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICAgICAgc3N0YWJsZS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEwMC4wLCAxMDAuMCkpOwotCi0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7Ci0KLSAgICAgICAgLy8gZG91YmxlIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwKLSAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWluSW5kZXhJbnRlcnZhbChvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgKiAyKS5idWlsZCgpKTsKLSAgICAgICAgSW5kZXhTdW1tYXJ5TWFuYWdlci5pbnN0YW5jZS5yZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKTsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDAxKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1Sb3dzIC8gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2l6ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJldHVybiBtaW5faW5kZXhfaW50ZXJ2YWwgdG8gaXRzIG9yaWdpbmFsIHZhbHVlCi0gICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1pbkluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsKS5idWlsZCgpKTsKLSAgICAgICAgSW5kZXhTdW1tYXJ5TWFuYWdlci5pbnN0YW5jZS5yZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKTsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDAxKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1Sb3dzIC8gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2l6ZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGhhbHZlIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwsIGJ1dCBjb25zdHJhaW4gdGhlIGF2YWlsYWJsZSBzcGFjZSB0byBleGFjdGx5IHdoYXQgd2UgaGF2ZSBub3c7IGFzIGEgcmVzdWx0LAotICAgICAgICAvLyB0aGUgc3VtbWFyeSBzaG91bGRuJ3QgY2hhbmdlCi0gICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1pbkluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsIC8gMikuYnVpbGQoKSk7Ci0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgbG9uZyBzdW1tYXJ5U3BhY2UgPSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeU9mZkhlYXBTaXplKCk7Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoYXNMaXN0KHNzdGFibGUpLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCBzdW1tYXJ5U3BhY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsTWluSW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDAxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG51bVJvd3MgLyBvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2l6ZSgpKTsKLQotICAgICAgICAvLyBrZWVwIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwgdGhlIHNhbWUsIGJ1dCBub3cgZ2l2ZSB0aGUgc3VtbWFyeSBlbm91Z2ggc3BhY2UgdG8gZ3JvdyBieSA1MCUKLSAgICAgICAgZG91YmxlIHByZXZpb3VzSW50ZXJ2YWwgPSBzc3RhYmxlLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKTsKLSAgICAgICAgaW50IHByZXZpb3VzU2l6ZSA9IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2l6ZSgpOwotICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KGFzTGlzdChzc3RhYmxlKSwgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKGxvbmcpIE1hdGguY2VpbChzdW1tYXJ5U3BhY2UgKiAxLjUpKTsKLSAgICAgICAgfQotICAgICAgICBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocHJldmlvdXNTaXplICogMS41LCAoZG91YmxlKSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeVNpemUoKSwgMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwcmV2aW91c0ludGVydmFsICogKDEuMCAvIDEuNSksIHNzdGFibGUuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7Ci0KLSAgICAgICAgLy8gcmV0dXJuIG1pbl9pbmRleF9pbnRlcnZhbCB0byBpdCdzIG9yaWdpbmFsIHZhbHVlIChkb3VibGUgaXQpLCBidXQgb25seSBnaXZlIHRoZSBzdW1tYXJ5IGVub3VnaCBzcGFjZQotICAgICAgICAvLyB0byBoYXZlIGFuIGVmZmVjdGl2ZSBpbmRleCBpbnRlcnZhbCBvZiB0d2ljZSB0aGUgbmV3IG1pbgotICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZVRhYmxlVXBkYXRlKGNmcy5tZXRhZGF0YSgpLnVuYnVpbGQoKS5taW5JbmRleEludGVydmFsKG9yaWdpbmFsTWluSW5kZXhJbnRlcnZhbCkuYnVpbGQoKSk7Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoYXNMaXN0KHNzdGFibGUpLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAobG9uZykgTWF0aC5jZWlsKHN1bW1hcnlTcGFjZSAvIDIuMCkpOwotICAgICAgICB9Ci0gICAgICAgIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgKiAyLCBzc3RhYmxlLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnVtUm93cyAvIChvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgKiAyKSwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTaXplKCkpOwotCi0gICAgICAgIC8vIHJhaXNlIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwgYWJvdmUgb3VyIGN1cnJlbnQgZWZmZWN0aXZlIGludGVydmFsLCBidXQgc2V0IHRoZSBtYXhfaW5kZXhfaW50ZXJ2YWwgbG93ZXIKLSAgICAgICAgLy8gdGhhbiB3aGF0IHdlIGFjdHVhbGx5IGhhdmUgc3BhY2UgZm9yIChtZWFuaW5nIHRoZSBpbmRleCBzdW1tYXJ5IHdvdWxkIGlkZWFsbHkgYmUgc21hbGxlciwgYnV0IHRoaXMgd291bGQKLSAgICAgICAgLy8gcmVzdWx0IGluIGFuIGVmZmVjdGl2ZSBpbnRlcnZhbCBhYm92ZSB0aGUgbmV3IG1heCkKLSAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWluSW5kZXhJbnRlcnZhbChvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgKiA0KS5idWlsZCgpKTsKLSAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWF4SW5kZXhJbnRlcnZhbChvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgKiA0KS5idWlsZCgpKTsKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShhc0xpc3Qoc3N0YWJsZSksIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBvZihjZnMubWV0YWRhdGEuaWQsIHR4biksIDEwKTsKLSAgICAgICAgfQotICAgICAgICBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlTWF4SW5kZXhJbnRlcnZhbCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKLSAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZwotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKLSAgICAgICAgaW50IG51bVNTVGFibGVzID0gMTsKLSAgICAgICAgaW50IG51bVJvd3MgPSAyNTY7Ci0gICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7Ci0KLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PihjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICAgICAgc3N0YWJsZS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEwMC4wLCAxMDAuMCkpOwotCi0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBvZihjZnMubWV0YWRhdGEuaWQsIHR4biksIDEwKTsKLSAgICAgICAgfQotICAgICAgICBzc3RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PihjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMSk7Ci0KLSAgICAgICAgLy8gaGFsdmUgdGhlIG1heF9pbmRleF9pbnRlcnZhbAotICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZVRhYmxlVXBkYXRlKGNmcy5tZXRhZGF0YSgpLnVuYnVpbGQoKS5tYXhJbmRleEludGVydmFsKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsIC8gMikuYnVpbGQoKSk7Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBvZihjZnMubWV0YWRhdGEuaWQsIHR4biksIDEpOwotICAgICAgICB9Ci0gICAgICAgIHNzdGFibGVzID0gbmV3IEFycmF5TGlzdDw+KGNmcy5nZXRMaXZlU1NUYWJsZXMoKSk7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjZnMubWV0YWRhdGEoKS5wYXJhbXMubWF4SW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bVJvd3MgLyBjZnMubWV0YWRhdGEoKS5wYXJhbXMubWF4SW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTaXplKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gcmV0dXJuIG1heF9pbmRleF9pbnRlcnZhbCB0byBpdHMgb3JpZ2luYWwgdmFsdWUKLSAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWF4SW5kZXhJbnRlcnZhbChjZnMubWV0YWRhdGEoKS5wYXJhbXMubWF4SW5kZXhJbnRlcnZhbCAqIDIpLmJ1aWxkKCkpOwotICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQotICAgICAgICB7Ci0gICAgICAgICAgICByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAxKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtUm93cyAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeVNpemUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdCh0aW1lb3V0ID0gMTAwMDApCi0gICAgcHVibGljIHZvaWQgdGVzdFJlZGlzdHJpYnV0ZVN1bW1hcmllcygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKLSAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZwotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKLSAgICAgICAgaW50IG51bVNTVGFibGVzID0gNDsKLSAgICAgICAgaW50IG51bVJvd3MgPSAyNTY7Ci0gICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7Ci0KLSAgICAgICAgaW50IG1pblNhbXBsaW5nTGV2ZWwgPSAoQkFTRV9TQU1QTElOR19MRVZFTCAqIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsKSAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsOwotCi0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gc3N0YWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oY2ZzLmdldExpdmVTU1RhYmxlcygpKTsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIHNzdGFibGUub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigxMDAuMCwgMTAwLjApKTsKLQotICAgICAgICBsb25nIHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgPSBzc3RhYmxlcy5nZXQoMCkuZ2V0SW5kZXhTdW1tYXJ5T2ZmSGVhcFNpemUoKTsKLQotICAgICAgICAvLyB0aGVyZSBzaG91bGQgYmUgZW5vdWdoIHNwYWNlIHRvIG5vdCBkb3duc2FtcGxlIGFueXRoaW5nCi0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiBudW1TU1RhYmxlcykpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIG51bVNTVGFibGVzLCB0b3RhbE9mZkhlYXBTaXplKHNzdGFibGVzKSk7Ci0gICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVJvd3MpOwotCi0gICAgICAgIC8vIGV2ZXJ5dGhpbmcgc2hvdWxkIGdldCBjdXQgaW4gaGFsZgotICAgICAgICBhc3NlcnQgc3N0YWJsZXMuc2l6ZSgpID09IDQ7Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiAobnVtU1NUYWJsZXMgLyAyKSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCAvIDIsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2FtcGxpbmdMZXZlbCgpKTsKLSAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7Ci0KLSAgICAgICAgLy8gZXZlcnl0aGluZyBzaG91bGQgZ2V0IGN1dCB0byBhIHF1YXJ0ZXIKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIChudW1TU1RhYmxlcyAvIDQpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMIC8gNCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLQotICAgICAgICAvLyB1cHNhbXBsZSBiYWNrIHVwIHRvIGhhbGYKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIChudW1TU1RhYmxlcyAvIDIpICsgNCkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydCBzc3RhYmxlcy5zaXplKCkgPT0gNDsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMIC8gMiwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLQotICAgICAgICAvLyB1cHNhbXBsZSBiYWNrIHVwIHRvIHRoZSBvcmlnaW5hbCBpbmRleCBzdW1tYXJ5Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiBudW1TU1RhYmxlcykpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLQotICAgICAgICAvLyBtYWtlIHR3byBvZiB0aGUgZm91ciBzc3RhYmxlcyBjb2xkLCBvbmx5IGxlYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhyZWUgZnVsbCBpbmRleCBzdW1tYXJpZXMsCi0gICAgICAgIC8vIHNvIHRoZSB0d28gY29sZCBzc3RhYmxlcyBzaG91bGQgZ2V0IGRvd25zYW1wbGVkIHRvIGJlIGhhbGYgb2YgdGhlaXIgb3JpZ2luYWwgc2l6ZQotICAgICAgICBzc3RhYmxlcy5nZXQoMCkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcig1MC4wLCA1MC4wKSk7Ci0gICAgICAgIHNzdGFibGVzLmdldCgxKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDUwLjAsIDUwLjApKTsKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIDMpKTsKLSAgICAgICAgfQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNzdGFibGVzLCBob3RuZXNzQ29tcGFyYXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMIC8gMiwgc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMIC8gMiwgc3N0YWJsZXMuZ2V0KDEpLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzc3RhYmxlcy5nZXQoMikuZ2V0SW5kZXhTdW1tYXJ5U2FtcGxpbmdMZXZlbCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgzKS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLQotICAgICAgICAvLyBzbWFsbCBpbmNyZWFzZXMgb3IgZGVjcmVhc2VzIGluIHRoZSByZWFkIHJhdGUgZG9uJ3QgcmVzdWx0IGluIGRvd25zYW1wbGluZyBvciB1cHNhbXBsaW5nCi0gICAgICAgIGRvdWJsZSBsb3dlclJhdGUgPSA1MC4wICogKERPV05TQU1QTEVfVEhFU0hPTEQgKyAoRE9XTlNBTVBMRV9USEVTSE9MRCAqIDAuMTApKTsKLSAgICAgICAgZG91YmxlIGhpZ2hlclJhdGUgPSA1MC4wICogKFVQU0FNUExFX1RIUkVTSE9MRCAtIChVUFNBTVBMRV9USFJFU0hPTEQgKiAwLjEwKSk7Ci0gICAgICAgIHNzdGFibGVzLmdldCgwKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKGxvd2VyUmF0ZSwgbG93ZXJSYXRlKSk7Ci0gICAgICAgIHNzdGFibGVzLmdldCgxKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKGhpZ2hlclJhdGUsIGhpZ2hlclJhdGUpKTsKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIDMpKTsKLSAgICAgICAgfQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNzdGFibGVzLCBob3RuZXNzQ29tcGFyYXRvcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMIC8gMiwgc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMIC8gMiwgc3N0YWJsZXMuZ2V0KDEpLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzc3RhYmxlcy5nZXQoMikuZ2V0SW5kZXhTdW1tYXJ5U2FtcGxpbmdMZXZlbCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgzKS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLQotICAgICAgICAvLyByZXNldCwgYW5kIHRoZW4gdGhpcyB0aW1lLCBsZWF2ZSBlbm91Z2ggc3BhY2UgZm9yIG9uZSBvZiB0aGUgY29sZCBzc3RhYmxlcyB0byBub3QgZ2V0IGRvd25zYW1wbGVkCi0gICAgICAgIHNzdGFibGVzID0gcmVzZXRTdW1tYXJpZXMoY2ZzLCBzc3RhYmxlcywgc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSk7Ci0gICAgICAgIHNzdGFibGVzLmdldCgwKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEuMCwgMS4wKSk7Ci0gICAgICAgIHNzdGFibGVzLmdldCgxKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDIuMCwgMi4wKSk7Ci0gICAgICAgIHNzdGFibGVzLmdldCgyKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEwMDAuMCwgMTAwMC4wKSk7Ci0gICAgICAgIHNzdGFibGVzLmdldCgzKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEwMDAuMCwgMTAwMC4wKSk7Ci0KLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKLSAgICAgICAgewotICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIDMpICsgNTApOwotICAgICAgICB9Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc3N0YWJsZXMsIGhvdG5lc3NDb21wYXJhdG9yKTsKLQotICAgICAgICBpZiAoc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSA9PSBtaW5TYW1wbGluZ0xldmVsKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgxKS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgyKS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZXMuZ2V0KDMpLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0gICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVJvd3MpOwotCi0KLSAgICAgICAgLy8gQ2F1c2UgYSBtaXggb2YgdXBzYW1wbGluZyBhbmQgZG93bnNhbXBsaW5nLiBXZSdsbCBsZWF2ZSBlbm91Z2ggc3BhY2UgZm9yIHR3byBmdWxsIGluZGV4IHN1bW1hcmllcy4gVGhlIHR3bwotICAgICAgICAvLyBjb2xkZXN0IHNzdGFibGVzIHdpbGwgZ2V0IGRvd25zYW1wbGVkIHRvIDQvMTI4IG9mIHRoZWlyIHNpemUsIGxlYXZpbmcgdXMgd2l0aCAxIGFuZCA5Mi8xMjh0aCBpbmRleAotICAgICAgICAvLyBzdW1tYXJpZXMgd29ydGggb2Ygc3BhY2UuICBUaGUgaG90dGVzdCBzc3RhYmxlIHNob3VsZCBnZXQgYSBmdWxsIGluZGV4IHN1bW1hcnksIGFuZCB0aGUgb25lIGluIHRoZSBtaWRkbGUKLSAgICAgICAgLy8gc2hvdWxkIGdldCB0aGUgcmVtYWluZGVyLgotICAgICAgICBzc3RhYmxlcy5nZXQoMCkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigwLjAsIDAuMCkpOwotICAgICAgICBzc3RhYmxlcy5nZXQoMSkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigwLjAsIDAuMCkpOwotICAgICAgICBzc3RhYmxlcy5nZXQoMikub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcig5MiwgOTIpKTsKLSAgICAgICAgc3N0YWJsZXMuZ2V0KDMpLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMTI4LjAsIDEyOC4wKSk7Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKGxvbmcpIChzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlICsgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiAoOTIuMCAvIEJBU0VfU0FNUExJTkdfTEVWRUwpKSkpOwotICAgICAgICB9Ci0gICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc3N0YWJsZXMsIGhvdG5lc3NDb21wYXJhdG9yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzdGFibGVzLmdldCgwKS5nZXRJbmRleFN1bW1hcnlTaXplKCkpOyAgLy8gYXQgdGhlIG1pbiBzYW1wbGluZyBsZXZlbAotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeVNpemUoKSk7ICAvLyBhdCB0aGUgbWluIHNhbXBsaW5nIGxldmVsCi0gICAgICAgIGFzc2VydFRydWUoc3N0YWJsZXMuZ2V0KDIpLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSA+IG1pblNhbXBsaW5nTGV2ZWwpOwotICAgICAgICBhc3NlcnRUcnVlKHNzdGFibGVzLmdldCgyKS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkgPCBCQVNFX1NBTVBMSU5HX0xFVkVMKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgzKS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkpOwotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLQotICAgICAgICAvLyBEb24ndCBsZWF2ZSBlbm91Z2ggc3BhY2UgZm9yIGV2ZW4gdGhlIG1pbmltYWwgaW5kZXggc3VtbWFyaWVzCi0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QsIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgMTApOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTaXplKCkpOyAgLy8gYXQgdGhlIG1pbiBzYW1wbGluZyBsZXZlbAotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWJ1aWxkQXRTYW1wbGluZ0xldmVsKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOwotICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUw7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOwotICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0KLSAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVsxMDBdKTsKLQotICAgICAgICBpbnQgbnVtUm93cyA9IDI1NjsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnVtUm93czsgcm93KyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBrZXkgPSBTdHJpbmcuZm9ybWF0KCIlM2QiLCByb3cpOwotICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzLm1ldGFkYXRhKCksIDAsIGtleSkKLSAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjb2x1bW4iKQotICAgICAgICAgICAgLmFkZCgidmFsIiwgdmFsdWUpCi0gICAgICAgICAgICAuYnVpbGQoKQotICAgICAgICAgICAgLmFwcGx5VW5zYWZlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0KLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PihjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZXMuc2l6ZSgpKTsKLSAgICAgICAgU1NUYWJsZVJlYWRlciBvcmlnaW5hbCA9IHNzdGFibGVzLmdldCgwKTsKLQotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBvcmlnaW5hbDsKLSAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShhc0xpc3Qoc3N0YWJsZSksIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IHNhbXBsaW5nTGV2ZWwgPSAxOyBzYW1wbGluZ0xldmVsIDwgQkFTRV9TQU1QTElOR19MRVZFTDsgc2FtcGxpbmdMZXZlbCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNzdGFibGUgPSBzc3RhYmxlLmNsb25lV2l0aE5ld1N1bW1hcnlTYW1wbGluZ0xldmVsKGNmcywgc2FtcGxpbmdMZXZlbCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNhbXBsaW5nTGV2ZWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2FtcGxpbmdMZXZlbCgpKTsKLSAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRTaXplID0gKG51bVJvd3MgKiBzYW1wbGluZ0xldmVsKSAvIChjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCAqIEJBU0VfU0FNUExJTkdfTEVWRUwpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFNpemUsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5U2l6ZSgpLCAxKTsKLSAgICAgICAgICAgICAgICB0eG4udXBkYXRlKHNzdGFibGUsIHRydWUpOwotICAgICAgICAgICAgICAgIHR4bi5jaGVja3BvaW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0eG4uZmluaXNoKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RKTVhGdW5jdGlvbnMoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEluZGV4U3VtbWFyeU1hbmFnZXIgbWFuYWdlciA9IEluZGV4U3VtbWFyeU1hbmFnZXIuaW5zdGFuY2U7Ci0KLSAgICAgICAgLy8gcmVzaXplIGludGVydmFsCi0gICAgICAgIG1hbmFnZXIuc2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoLTEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbmRleFN1bW1hcnlSZXNpemVJbnRlcnZhbEluTWludXRlcygpKTsKLSAgICAgICAgYXNzZXJ0TnVsbChtYW5hZ2VyLmdldFRpbWVUb05leHRSZXNpemUoVGltZVVuaXQuTUlOVVRFUykpOwotCi0gICAgICAgIG1hbmFnZXIuc2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoMTApOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIG1hbmFnZXIuZ2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxMCwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluZGV4U3VtbWFyeVJlc2l6ZUludGVydmFsSW5NaW51dGVzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIG1hbmFnZXIuZ2V0VGltZVRvTmV4dFJlc2l6ZShUaW1lVW5pdC5NSU5VVEVTKSwgMSk7Ci0gICAgICAgIG1hbmFnZXIuc2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoMTUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTUsIG1hbmFnZXIuZ2V0UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxNSwgRGF0YWJhc2VEZXNjcmlwdG9yLmdldEluZGV4U3VtbWFyeVJlc2l6ZUludGVydmFsSW5NaW51dGVzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTUsIG1hbmFnZXIuZ2V0VGltZVRvTmV4dFJlc2l6ZShUaW1lVW5pdC5NSU5VVEVTKSwgMik7Ci0KLSAgICAgICAgLy8gbWVtb3J5IHBvb2wgY2FwYWNpdHkKLSAgICAgICAgYXNzZXJ0VHJ1ZShtYW5hZ2VyLmdldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoKSA+PSAwKTsKLSAgICAgICAgbWFuYWdlci5zZXRNZW1vcnlQb29sQ2FwYWNpdHlJbk1CKDEwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBtYW5hZ2VyLmdldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoKSk7Ci0KLSAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKLSAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZwotICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKLSAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKLSAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKLSAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotCi0gICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMTAwXSk7Ci0KLSAgICAgICAgaW50IG51bVNTVGFibGVzID0gMjsKLSAgICAgICAgaW50IG51bVJvd3MgPSAxMDsKLSAgICAgICAgZm9yIChpbnQgc3N0YWJsZSA9IDA7IHNzdGFibGUgPCBudW1TU1RhYmxlczsgc3N0YWJsZSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBudW1Sb3dzOyByb3crKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gU3RyaW5nLmZvcm1hdCgiJTNkIiwgcm93KTsKLSAgICAgICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwga2V5KQotICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjb2x1bW4iKQotICAgICAgICAgICAgICAgIC5hZGQoInZhbCIsIHZhbHVlKQotICAgICAgICAgICAgICAgIC5idWlsZCgpCi0gICAgICAgICAgICAgICAgLmFwcGx5VW5zYWZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKG1hbmFnZXIuZ2V0QXZlcmFnZUluZGV4SW50ZXJ2YWwoKSA+PSBjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IGludGVydmFscyA9IG1hbmFnZXIuZ2V0SW5kZXhJbnRlcnZhbHMoKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBlbnRyeSA6IGludGVydmFscy5lbnRyeVNldCgpKQotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEtleSgpLmNvbnRhaW5zKENGX1NUQU5EQVJETE9XaUlOVEVSVkFMKSkKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIGVudHJ5LmdldFZhbHVlKCksIDAuMDAxKTsKLQotICAgICAgICBtYW5hZ2VyLnNldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoMCk7Ci0gICAgICAgIG1hbmFnZXIucmVkaXN0cmlidXRlU3VtbWFyaWVzKCk7Ci0gICAgICAgIGFzc2VydFRydWUobWFuYWdlci5nZXRBdmVyYWdlSW5kZXhJbnRlcnZhbCgpID4gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwpOwotICAgICAgICBpbnRlcnZhbHMgPSBtYW5hZ2VyLmdldEluZGV4SW50ZXJ2YWxzKCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgSW50ZWdlcj4gZW50cnkgOiBpbnRlcnZhbHMuZW50cnlTZXQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEtleSgpLmNvbnRhaW5zKENGX1NUQU5EQVJETE9XaUlOVEVSVkFMKSkKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGVudHJ5LmdldFZhbHVlKCkgPj0gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuY2VsSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0ZXN0Q2FuY2VsSW5kZXhIZWxwZXIoKGNmcykgLT4gQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2Uuc3RvcENvbXBhY3Rpb24oIklOREVYX1NVTU1BUlkiKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuY2VsSW5kZXhJbnRlcnJ1cHQoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0ZXN0Q2FuY2VsSW5kZXhIZWxwZXIoKGNmcykgLT4gQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuaW50ZXJydXB0Q29tcGFjdGlvbkZvcihDb2xsZWN0aW9ucy5zaW5nbGV0b24oY2ZzLm1ldGFkYXRhKCkpLCAoc3N0YWJsZSkgLT4gdHJ1ZSwgZmFsc2UpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FuY2VsSW5kZXhIZWxwZXIoQ29uc3VtZXI8Q29sdW1uRmFtaWx5U3RvcmU+IGNhbmNlbEZ1bmN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOwotICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUw7IC8vIGluZGV4IGludGVydmFsIG9mIDgsIG5vIGtleSBjYWNoaW5nCi0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0gICAgICAgIGZpbmFsIGludCBudW1TU1RhYmxlcyA9IDg7Ci0gICAgICAgIGludCBudW1Sb3dzID0gMjU2OwotICAgICAgICBjcmVhdGVTU1RhYmxlcyhrc25hbWUsIGNmbmFtZSwgbnVtU1NUYWJsZXMsIG51bVJvd3MpOwotCi0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gYWxsU1NUYWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oY2ZzLmdldExpdmVTU1RhYmxlcygpKTsKLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IGFsbFNTVGFibGVzLnN1Ykxpc3QoMCwgNCk7Ci0gICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlcj4gY29tcGFjdGluZyA9IGFsbFNTVGFibGVzLnN1Ykxpc3QoNCwgOCk7Ci0KLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIHNzdGFibGUub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigxMDAuMCwgMTAwLjApKTsKLQotICAgICAgICBmaW5hbCBsb25nIHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgPSBzc3RhYmxlcy5nZXQoMCkuZ2V0SW5kZXhTdW1tYXJ5T2ZmSGVhcFNpemUoKTsKLQotICAgICAgICAvLyBldmVyeXRoaW5nIHNob3VsZCBnZXQgY3V0IGluIGhhbGYKLSAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPENvbXBhY3Rpb25JbnRlcnJ1cHRlZEV4Y2VwdGlvbj4gZXhjZXB0aW9uID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7Ci0gICAgICAgIC8vIGJhcnJpZXIgdG8gY29udHJvbCB3aGVuIHJlZGlzdHJpYnV0aW9uIHJ1bnMKLSAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggYmFycmllciA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKLSAgICAgICAgQ29tcGFjdGlvbkluZm8uSG9sZGVyIG9uZ29pbmdDb21wYWN0aW9uID0gbmV3IENvbXBhY3Rpb25JbmZvLkhvbGRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBDb21wYWN0aW9uSW5mbyBnZXRDb21wYWN0aW9uSW5mbygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21wYWN0aW9uSW5mbyhjZnMubWV0YWRhdGEoKSwgT3BlcmF0aW9uVHlwZS5VTktOT1dOLCAwLCAwLCBuZXh0VGltZVVVSUQoKSwgY29tcGFjdGluZyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gaWdub3JlZCA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KGNvbXBhY3RpbmcsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5iZWdpbkNvbXBhY3Rpb24ob25nb2luZ0NvbXBhY3Rpb24pOwotCi0gICAgICAgICAgICBUaHJlYWQgdCA9IE5hbWVkVGhyZWFkRmFjdG9yeS5jcmVhdGVBbm9ueW1vdXNUaHJlYWQobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGxlYXZlIGVub3VnaCBzcGFjZSBmb3IgZXZlbiB0aGUgbWluaW1hbCBpbmRleCBzdW1tYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhTdW1tYXJ5TWFuYWdlci5yZWRpc3RyaWJ1dGVTdW1tYXJpZXMobmV3IE9ic2VydmFibGVSZWRpc3RyaWJ1dGlvbihvZihjZnMubWV0YWRhdGEuaWQsIHR4biksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcnJpZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24uc2V0KGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIHQuc3RhcnQoKTsKLSAgICAgICAgICAgIHdoaWxlIChDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5nZXRBY3RpdmVDb21wYWN0aW9ucygpIDwgMiAmJiB0LmlzQWxpdmUoKSkKLSAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMSk7Ci0gICAgICAgICAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgc3RvcCBjb25kaXRpb24gY2hlY2sgaW4gSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb246OnJlZGlzdHJpYnV0ZVN1bW1hcmllcwotICAgICAgICAgICAgLy8gaXMgbWFkZSAqYWZ0ZXIqIHRoZSBoYWx0IHJlcXVlc3QgaXMgbWFkZSB0byB0aGUgQ29tcGFjdGlvbk1hbmFnZXIsIGRvbid0IGFsbG93IHRoZSByZWRpc3RyaWJ1dGlvbgotICAgICAgICAgICAgLy8gdG8gcHJvY2VlZCB1bnRpbCBzdG9wQ29tcGFjdGlvbiBoYXMgYmVlbiBjYWxsZWQuCi0gICAgICAgICAgICBjYW5jZWxGdW5jdGlvbi5hY2NlcHQoY2ZzKTsKLSAgICAgICAgICAgIC8vIGFsbG93cyB0aGUgcmVkaXN0cmlidXRpb24gdG8gcHJvY2VlZAotICAgICAgICAgICAgYmFycmllci5jb3VudERvd24oKTsKLSAgICAgICAgICAgIHQuam9pbigpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmZpbmlzaENvbXBhY3Rpb24ob25nb2luZ0NvbXBhY3Rpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCgiRXhwZWN0ZWQgY29tcGFjdGlvbiBpbnRlcnJ1cHRlZCBleGNlcHRpb24iLCBleGNlcHRpb24uZ2V0KCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBubyBhY3RpdmUgY29tcGFjdGlvbnMiLCBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZ2V0Q29tcGFjdGlvbnMoKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBiZWZvcmVSZWRpc3RyaWJ1dGlvblNTVGFibGVzID0gbmV3IEhhc2hTZXQ8PihhbGxTU1RhYmxlcyk7Ci0gICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBhZnRlckNhbmNlbFNTVGFibGVzID0gbmV3IEhhc2hTZXQ8PihjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpOwotICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gZGlzam9pbnQgPSBTZXRzLnN5bW1ldHJpY0RpZmZlcmVuY2UoYmVmb3JlUmVkaXN0cmlidXRpb25TU1RhYmxlcywgYWZ0ZXJDYW5jZWxTU1RhYmxlcyk7Ci0gICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiTWlzbWF0Y2hlZCBmaWxlcyBiZWZvcmUgYW5kIGFmdGVyIGNhbmNlbGxpbmcgcmVkaXN0cmlidXRpb246ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5lci5vbigiLCIpLmpvaW4oZGlzam9pbnQpKSwKLSAgICAgICAgICAgICAgICAgICBkaXNqb2ludC5pc0VtcHR5KCkpOwotICAgICAgICBhc3NlcnRPbkRpc2tTdGF0ZShjZnMsIDgpOwotICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXVzZUluZGV4U3VtbWFyeU1hbmFnZXIoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOwotICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUw7IC8vIGluZGV4IGludGVydmFsIG9mIDgsIG5vIGtleSBjYWNoaW5nCi0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotICAgICAgICBpbnQgbnVtU1NUYWJsZXMgPSA0OwotICAgICAgICBpbnQgbnVtUm93cyA9IDI1NjsKLSAgICAgICAgY3JlYXRlU1NUYWJsZXMoa3NuYW1lLCBjZm5hbWUsIG51bVNTVGFibGVzLCBudW1Sb3dzKTsKLQotICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzID0gbmV3IEFycmF5TGlzdDw+KGNmcy5nZXRMaXZlU1NUYWJsZXMoKSk7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgICAgICBzc3RhYmxlLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMTAwLjAsIDEwMC4wKSk7Ci0KLSAgICAgICAgbG9uZyBzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlID0gc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeU9mZkhlYXBTaXplKCk7Ci0KLSAgICAgICAgLy8gZXZlcnl0aGluZyBzaG91bGQgZ2V0IGN1dCBpbiBoYWxmCi0gICAgICAgIGFzc2VydCBzc3RhYmxlcy5zaXplKCkgPT0gbnVtU1NUYWJsZXM7Ci0gICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSAoQXV0b0Nsb3NlYWJsZSB0b3Jlc3VtZSA9IENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnBhdXNlR2xvYmFsQ29tcGFjdGlvbigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBvZihjZnMubWV0YWRhdGEoKS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiAobnVtU1NUYWJsZXMgLyAyKSkpOwotICAgICAgICAgICAgICAgIGZhaWwoIlRoZSByZWRpc3RyaWJ1dGlvbiBzaG91bGQgZmFpbCAtIHdlIGdvdCBwYXVzZWQgYmVmb3JlIGFkZGluZyB0byBhY3RpdmUgY29tcGFjdGlvbnMsIGJ1dCBhZnRlciBtYXJraW5nIGNvbXBhY3RpbmciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICAgIH0KLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzc3RhYmxlcykKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeVNhbXBsaW5nTGV2ZWwoKSk7Ci0gICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVJvd3MpOwotICAgICAgICBhc3NlcnRPbkRpc2tTdGF0ZShjZnMsIG51bVNTVGFibGVzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFNTVGFibGVSZWFkZXI+IHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhMaXN0PFNTVGFibGVSZWFkZXI+IGNvbXBhY3RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBtZW1vcnlQb29sQnl0ZXMpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBsb25nIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUgPSBjb21wYWN0aW5nLnN0cmVhbSgpLm1hcFRvTG9uZyhTU1RhYmxlUmVhZGVyOjpnZXRJbmRleFN1bW1hcnlPZmZIZWFwU2l6ZSkuc3VtKCk7Ci0gICAgICAgIHJldHVybiBJbmRleFN1bW1hcnlNYW5hZ2VyLnJlZGlzdHJpYnV0ZVN1bW1hcmllcyhuZXcgSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24odHJhbnNhY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5UG9vbEJ5dGVzKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgT2JzZXJ2YWJsZVJlZGlzdHJpYnV0aW9uIGV4dGVuZHMgSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24KLSAgICB7Ci0gICAgICAgIENvdW50RG93bkxhdGNoIGJhcnJpZXI7Ci0KLSAgICAgICAgT2JzZXJ2YWJsZVJlZGlzdHJpYnV0aW9uKE1hcDxUYWJsZUlkLCBMaWZlY3ljbGVUcmFuc2FjdGlvbj4gdHJhbnNhY3Rpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBub25SZWRpc3RyaWJ1dGluZ09mZkhlYXBTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBtZW1vcnlQb29sQnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudERvd25MYXRjaCBiYXJyaWVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdXBlcih0cmFuc2FjdGlvbnMsIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUsIG1lbW9yeVBvb2xCeXRlcyk7Ci0gICAgICAgICAgICB0aGlzLmJhcnJpZXIgPSBiYXJyaWVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIExpc3Q8U1NUYWJsZVJlYWRlcj4gcmVkaXN0cmlidXRlU3VtbWFyaWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhcnJpZXIuYXdhaXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbnRlcnJ1cHRlZCB3YWl0aW5nIG9uIHRlc3QgYmFycmllciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlZGlzdHJpYnV0ZVN1bW1hcmllcygpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdlNGQ0ZS4uMDAwMDAwMAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwotCi1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd1VwZGF0ZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5SZXN0b3JhYmxlTWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5TdG9yYWdlTWV0cmljczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ2FjaGluZ1BhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYVRlc3RVdGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi1wdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb25UZXN0Ci17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMSA9ICJJbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvblRlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRCA9ICJTdGFuZGFyZCI7Ci0KLSAgICBAQmVmb3JlQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7Ci0gICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWluSW5kZXhJbnRlcnZhbCg4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heEluZGV4SW50ZXJ2YWwoMjU2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhY2hpbmcoQ2FjaGluZ1BhcmFtcy5DQUNIRV9OT1RISU5HKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWV0cmljc0xvYWRBZnRlclJlZGlzdHJpYnV0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOwotICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkQ7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotICAgICAgICBpbnQgbnVtU1NUYWJsZXMgPSAxOwotICAgICAgICBpbnQgbnVtUm93cyA9IDEwMjQgKiAxMDsKLSAgICAgICAgbG9uZyBsb2FkID0gU3RvcmFnZU1ldHJpY3MubG9hZC5nZXRDb3VudCgpOwotICAgICAgICBTdG9yYWdlTWV0cmljcy5sb2FkLmRlYyhsb2FkKTsgLy8gcmVzZXQgdGhlIGxvYWQgbWV0cmljCi0gICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7Ci0KLSAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IG5ldyBBcnJheUxpc3Q8PihjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHNzdGFibGVzKQotICAgICAgICAgICAgc3N0YWJsZS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEwMC4wLCAxMDAuMCkpOwotCi0gICAgICAgIGxvbmcgb2xkU2l6ZSA9IDA7Ci0gICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3N0YWJsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDAxKTsKLSAgICAgICAgICAgIG9sZFNpemUgKz0gc3N0YWJsZS5ieXRlc09uRGlzaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9hZCA9IFN0b3JhZ2VNZXRyaWNzLmxvYWQuZ2V0Q291bnQoKTsKLSAgICAgICAgbG9uZyBvdGhlcnMgPSBsb2FkIC0gb2xkU2l6ZTsgLy8gT3RoZXIgU1NUYWJsZXMgc2l6ZSwgZS5nLiBzY2hlbWEgYW5kIG90aGVyIHN5c3RlbSBTU1RhYmxlcwotCi0gICAgICAgIGludCBvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgPSBjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsKLSAgICAgICAgLy8gZG91YmxlIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwKLSAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWluSW5kZXhJbnRlcnZhbChvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgKiAyKS5idWlsZCgpKTsKLSAgICAgICAgSW5kZXhTdW1tYXJ5TWFuYWdlci5pbnN0YW5jZS5yZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKTsKLQotICAgICAgICBsb25nIG5ld1NpemUgPSAwOwotICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBzc3RhYmxlLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMDEpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bVJvd3MgLyBjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTaXplKCkpOwotICAgICAgICAgICAgbmV3U2l6ZSArPSBzc3RhYmxlLmJ5dGVzT25EaXNrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbmV3U2l6ZSArPSBvdGhlcnM7Ci0gICAgICAgIGxvYWQgPSBTdG9yYWdlTWV0cmljcy5sb2FkLmdldENvdW50KCk7Ci0KLSAgICAgICAgLy8gbmV3IHNpemUgd2UgY2FsY3VsYXRlIHNob3VsZCBiZSBhbG1vc3QgdGhlIHNhbWUgYXMgdGhlIGxvYWQgaW4gbWV0cmljcwotICAgICAgICBhc3NlcnRFcXVhbHMobmV3U2l6ZSwgbG9hZCwgbmV3U2l6ZSAvIDEwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU1NUYWJsZXMoU3RyaW5nIGtzbmFtZSwgU3RyaW5nIGNmbmFtZSwgaW50IG51bVNTVGFibGVzLCBpbnQgbnVtUm93cykKLSAgICB7Ci0gICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOwotICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOwotICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOwotICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7Ci0KLSAgICAgICAgQXJyYXlMaXN0PEZ1dHVyZT4gZnV0dXJlcyA9IG5ldyBBcnJheUxpc3Q8PihudW1TU1RhYmxlcyk7Ci0gICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMTAwXSk7Ci0gICAgICAgIGZvciAoaW50IHNzdGFibGUgPSAwOyBzc3RhYmxlIDwgbnVtU1NUYWJsZXM7IHNzdGFibGUrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnVtUm93czsgcm93KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IFN0cmluZy5mb3JtYXQoIiUzZCIsIHJvdyk7Ci0gICAgICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzLm1ldGFkYXRhKCksIDAsIGtleSkKLSAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiY29sdW1uIikKLSAgICAgICAgICAgICAgICAuYWRkKCJ2YWwiLCB2YWx1ZSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKQotICAgICAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnV0dXJlcy5hZGQoY2ZzLmZvcmNlRmx1c2goQ29sdW1uRmFtaWx5U3RvcmUuRmx1c2hSZWFzb24uVU5JVF9URVNUUykpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoRnV0dXJlIGZ1dHVyZSA6IGZ1dHVyZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZ1dHVyZS5nZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB8IEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhudW1TU1RhYmxlcywgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvSW5kZXhTdW1tYXJ5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDY4MGY4Li4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0luZGV4U3VtbWFyeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZG9tUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4U3VtbWFyeUJ1aWxkZXIuZG93bnNhbXBsZTsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleFN1bW1hcnlCdWlsZGVyLmVudHJpZXNBdFNhbXBsaW5nTGV2ZWw7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRG93bnNhbXBsaW5nLkJBU0VfU0FNUExJTkdfTEVWRUw7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1wdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5VGVzdAotewotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0KLSAgICBAQmVmb3JlQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEREKCkKLSAgICB7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwotCi0gICAgICAgIGZpbmFsIGxvbmcgc2VlZCA9IG5hbm9UaW1lKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgc2VlZDogIiArIHNlZWQpOwotICAgICAgICByYW5kb20uc2V0U2VlZChzZWVkKTsKLSAgICB9Ci0KLSAgICBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBVdGlsLnRlc3RQYXJ0aXRpb25lcigpOwotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIGxvbmcgc2VlZCA9IG5hbm9UaW1lKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgc2VlZDogIiArIHNlZWQpOwotICAgICAgICByYW5kb20uc2V0U2VlZChzZWVkKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleFN1bW1hcnlLZXlTaXplcygpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gT24gQ2lyY2xlIENJIHdlIG5vcm1hbGx5IGRvbid0IGhhdmUgZW5vdWdoIG9mZi1oZWFwIG1lbW9yeSBmb3IgdGhpcyB0ZXN0IHNvIGlnbm9yZSBpdAotICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShTeXN0ZW0uZ2V0ZW52KCJDSVJDTEVDSSIpID09IG51bGwpOwotCi0gICAgICAgIHRlc3RJbmRleFN1bW1hcnlQcm9wZXJ0aWVzKDMyLCAxMDApOwotICAgICAgICB0ZXN0SW5kZXhTdW1tYXJ5UHJvcGVydGllcyg2NCwgMTAwKTsKLSAgICAgICAgdGVzdEluZGV4U3VtbWFyeVByb3BlcnRpZXMoMTAwLCAxMDApOwotICAgICAgICB0ZXN0SW5kZXhTdW1tYXJ5UHJvcGVydGllcygxMDAwLCAxMDApOwotICAgICAgICB0ZXN0SW5kZXhTdW1tYXJ5UHJvcGVydGllcygxMDAwMCwgMTAwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGVzdEluZGV4U3VtbWFyeVByb3BlcnRpZXMoaW50IGtleVNpemUsIGludCBudW1LZXlzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIGludCBtaW5JbmRleEludGVydmFsID0gMTsKLSAgICAgICAgZmluYWwgTGlzdDxEZWNvcmF0ZWRLZXk+IGtleXMgPSBuZXcgQXJyYXlMaXN0PD4obnVtS2V5cyk7Ci0KLSAgICAgICAgdHJ5IChJbmRleFN1bW1hcnlCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSW5kZXhTdW1tYXJ5QnVpbGRlcihudW1LZXlzLCBtaW5JbmRleEludGVydmFsLCBCQVNFX1NBTVBMSU5HX0xFVkVMKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1LZXlzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIHJhbmRvbUJ5dGVzID0gbmV3IGJ5dGVba2V5U2l6ZV07Ci0gICAgICAgICAgICAgICAgcmFuZG9tLm5leHRCeXRlcyhyYW5kb21CeXRlcyk7Ci0gICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXIud3JhcChyYW5kb21CeXRlcykpOwotICAgICAgICAgICAgICAgIGtleXMuYWRkKGtleSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5tYXliZUFkZEVudHJ5KGtleSwgaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeShJbmRleFN1bW1hcnkgaW5kZXhTdW1tYXJ5ID0gYnVpbGRlci5idWlsZChwYXJ0aXRpb25lcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bUtleXMsIGtleXMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobWluSW5kZXhJbnRlcnZhbCwgaW5kZXhTdW1tYXJ5LmdldE1pbkluZGV4SW50ZXJ2YWwoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bUtleXMsIGluZGV4U3VtbWFyeS5nZXRNYXhOdW1iZXJPZkVudHJpZXMoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bUtleXMgKyAxLCBpbmRleFN1bW1hcnkuZ2V0RXN0aW1hdGVkS2V5Q291bnQoKSk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUtleXM7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGtleXMuZ2V0KGkpLmdldEtleSgpLCBCeXRlQnVmZmVyLndyYXAoaW5kZXhTdW1tYXJ5LmdldEtleShpKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVzdCBhbiBpbmRleCBzdW1tYXJ5IHdob3NlIHRvdGFsIHNpemUgaXMgYmlnZ2VyIHRoYW4gMkdpQiwKLSAgICAgKiB0aGUgaW5kZXggc3VtbWFyeSBidWlsZGVyIHNob3VsZCBsb2cgYW4gZXJyb3IgYnV0IGl0IHNob3VsZCBzdGlsbAotICAgICAqIGNyZWF0ZSBhbiBpbmRleCBzdW1tYXJ5LCBhbGJlaXQgb25lIHRoYXQgZG9lcyBub3QgY292ZXIgdGhlIGVudGlyZSBzc3RhYmxlLgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExhcmdlSW5kZXhTdW1tYXJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBPbiBDaXJjbGUgQ0kgd2Ugbm9ybWFsbHkgZG9uJ3QgaGF2ZSBlbm91Z2ggb2ZmLWhlYXAgbWVtb3J5IGZvciB0aGlzIHRlc3Qgc28gaWdub3JlIGl0Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKFN5c3RlbS5nZXRlbnYoIkNJUkNMRUNJIikgPT0gbnVsbCk7Ci0KLSAgICAgICAgZmluYWwgaW50IG51bUtleXMgPSAxMDAwMDAwOwotICAgICAgICBmaW5hbCBpbnQga2V5U2l6ZSA9IDMwMDA7Ci0gICAgICAgIGZpbmFsIGludCBtaW5JbmRleEludGVydmFsID0gMTsKLQotICAgICAgICB0cnkgKEluZGV4U3VtbWFyeUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBJbmRleFN1bW1hcnlCdWlsZGVyKG51bUtleXMsIG1pbkluZGV4SW50ZXJ2YWwsIEJBU0VfU0FNUExJTkdfTEVWRUwpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUtleXM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBieXRlW10gcmFuZG9tQnl0ZXMgPSBuZXcgYnl0ZVtrZXlTaXplXTsKLSAgICAgICAgICAgICAgICByYW5kb20ubmV4dEJ5dGVzKHJhbmRvbUJ5dGVzKTsKLSAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlci53cmFwKHJhbmRvbUJ5dGVzKSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5tYXliZUFkZEVudHJ5KGtleSwgaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSA9IGJ1aWxkZXIuYnVpbGQocGFydGl0aW9uZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaW5kZXhTdW1tYXJ5KTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtS2V5cywgaW5kZXhTdW1tYXJ5LmdldE1heE51bWJlck9mRW50cmllcygpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtS2V5cyArIDEsIGluZGV4U3VtbWFyeS5nZXRFc3RpbWF0ZWRLZXlDb3VudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3QgYW4gaW5kZXggc3VtbWFyeSB3aG9zZSB0b3RhbCBzaXplIGlzIGJpZ2dlciB0aGFuIDJHaUIsCi0gICAgICogaGF2aW5nIHVwZGF0ZWQgSW5kZXhTdW1tYXJ5QnVpbGRlci5kZWZhdWx0RXhwZWN0ZWRLZXlTaXplIHRvIG1hdGNoIHRoZSBzaXplLAotICAgICAqIHRoZSBpbmRleCBzdW1tYXJ5IHNob3VsZCBiZSBkb3duc2FtcGxlZCBhdXRvbWF0aWNhbGx5LgotICAgICAqLwotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExhcmdlSW5kZXhTdW1tYXJ5V2l0aEV4cGVjdGVkU2l6ZU1hdGNoaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBPbiBDaXJjbGUgQ0kgd2Ugbm9ybWFsbHkgZG9uJ3QgaGF2ZSBlbm91Z2ggb2ZmLWhlYXAgbWVtb3J5IGZvciB0aGlzIHRlc3Qgc28gaWdub3JlIGl0Ci0gICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKFN5c3RlbS5nZXRlbnYoIkNJUkNMRUNJIikgPT0gbnVsbCk7Ci0KLSAgICAgICAgZmluYWwgaW50IG51bUtleXMgPSAxMDAwMDAwOwotICAgICAgICBmaW5hbCBpbnQga2V5U2l6ZSA9IDMwMDA7Ci0gICAgICAgIGZpbmFsIGludCBtaW5JbmRleEludGVydmFsID0gMTsKLQotICAgICAgICBsb25nIG9sZEV4cGVjdGVkS2V5U2l6ZSA9IEluZGV4U3VtbWFyeUJ1aWxkZXIuZGVmYXVsdEV4cGVjdGVkS2V5U2l6ZTsKLSAgICAgICAgSW5kZXhTdW1tYXJ5QnVpbGRlci5kZWZhdWx0RXhwZWN0ZWRLZXlTaXplID0gMzAwMDsKLQotICAgICAgICB0cnkgKEluZGV4U3VtbWFyeUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBJbmRleFN1bW1hcnlCdWlsZGVyKG51bUtleXMsIG1pbkluZGV4SW50ZXJ2YWwsIEJBU0VfU0FNUExJTkdfTEVWRUwpKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUtleXM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBieXRlW10gcmFuZG9tQnl0ZXMgPSBuZXcgYnl0ZVtrZXlTaXplXTsKLSAgICAgICAgICAgICAgICByYW5kb20ubmV4dEJ5dGVzKHJhbmRvbUJ5dGVzKTsKLSAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlci53cmFwKHJhbmRvbUJ5dGVzKSk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5tYXliZUFkZEVudHJ5KGtleSwgaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSA9IGJ1aWxkZXIuYnVpbGQocGFydGl0aW9uZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaW5kZXhTdW1tYXJ5KTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobWluSW5kZXhJbnRlcnZhbCAqIDIsIGluZGV4U3VtbWFyeS5nZXRNaW5JbmRleEludGVydmFsKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1LZXlzIC8gMiwgaW5kZXhTdW1tYXJ5LmdldE1heE51bWJlck9mRW50cmllcygpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtS2V5cyArIDIsIGluZGV4U3VtbWFyeS5nZXRFc3RpbWF0ZWRLZXlDb3VudCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEluZGV4U3VtbWFyeUJ1aWxkZXIuZGVmYXVsdEV4cGVjdGVkS2V5U2l6ZSA9IG9sZEV4cGVjdGVkS2V5U2l6ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldEtleSgpCi0gICAgewotICAgICAgICBQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgSW5kZXhTdW1tYXJ5PiByYW5kb20gPSBnZW5lcmF0ZVJhbmRvbUluZGV4KDEwMCwgMSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmFuZG9tLmxlZnQuZ2V0KGkpLmdldEtleSgpLCBCeXRlQnVmZmVyLndyYXAocmFuZG9tLnJpZ2h0LmdldEtleShpKSkpOwotICAgICAgICByYW5kb20ucmlnaHQuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5hcnlTZWFyY2goKQotICAgIHsKLSAgICAgICAgUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIEluZGV4U3VtbWFyeT4gcmFuZG9tID0gZ2VuZXJhdGVSYW5kb21JbmRleCgxMDAsIDEpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIHJhbmRvbS5yaWdodC5iaW5hcnlTZWFyY2gocmFuZG9tLmxlZnQuZ2V0KGkpKSk7Ci0gICAgICAgIHJhbmRvbS5yaWdodC5jbG9zZSgpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldFBvc2l0aW9uKCkKLSAgICB7Ci0gICAgICAgIFBhaXI8TGlzdDxEZWNvcmF0ZWRLZXk+LCBJbmRleFN1bW1hcnk+IHJhbmRvbSA9IGdlbmVyYXRlUmFuZG9tSW5kZXgoMTAwLCAyKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkqMiwgcmFuZG9tLnJpZ2h0LmdldFBvc2l0aW9uKGkpKTsKLSAgICAgICAgcmFuZG9tLnJpZ2h0LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIEluZGV4U3VtbWFyeT4gcmFuZG9tID0gZ2VuZXJhdGVSYW5kb21JbmRleCgxMDAsIDEpOwotICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGRvcyA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7Ci0gICAgICAgIEluZGV4U3VtbWFyeS5zZXJpYWxpemVyLnNlcmlhbGl6ZShyYW5kb20ucmlnaHQsIGRvcyk7Ci0gICAgICAgIC8vIHdyaXRlIGp1bmsKLSAgICAgICAgZG9zLndyaXRlVVRGKCJKVU5LIik7Ci0gICAgICAgIGRvcy53cml0ZVVURigiSlVOSyIpOwotICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGRvcyk7Ci0gICAgICAgIERhdGFJbnB1dFN0cmVhbSBkaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkb3MudG9CeXRlQXJyYXkoKSkpOwotICAgICAgICBJbmRleFN1bW1hcnkgaXMgPSBJbmRleFN1bW1hcnkuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkaXMsIHBhcnRpdGlvbmVyLCAxLCAxKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBpcy5iaW5hcnlTZWFyY2gocmFuZG9tLmxlZnQuZ2V0KGkpKSk7Ci0gICAgICAgIC8vIHJlYWQgdGhlIGp1bmsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRpcy5yZWFkVVRGKCksICJKVU5LIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhkaXMucmVhZFVURigpLCAiSlVOSyIpOwotICAgICAgICBpcy5jbG9zZSgpOwotICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGRpcyk7Ci0gICAgICAgIHJhbmRvbS5yaWdodC5jbG9zZSgpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEFkZEVtcHR5S2V5KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgSVBhcnRpdGlvbmVyIHAgPSBuZXcgUmFuZG9tUGFydGl0aW9uZXIoKTsKLSAgICAgICAgdHJ5IChJbmRleFN1bW1hcnlCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSW5kZXhTdW1tYXJ5QnVpbGRlcigxLCAxLCBCQVNFX1NBTVBMSU5HX0xFVkVMKSkKLSAgICAgICAgewotICAgICAgICAgICAgYnVpbGRlci5tYXliZUFkZEVudHJ5KHAuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIpLCAwKTsKLSAgICAgICAgICAgIEluZGV4U3VtbWFyeSBzdW1tYXJ5ID0gYnVpbGRlci5idWlsZChwKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBzdW1tYXJ5LnNpemUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3VtbWFyeS5nZXRQb3NpdGlvbigwKSk7Ci0gICAgICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhuZXcgYnl0ZVswXSwgc3VtbWFyeS5nZXRLZXkoMCkpOwotCi0gICAgICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGRvcyA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7Ci0gICAgICAgICAgICBJbmRleFN1bW1hcnkuc2VyaWFsaXplci5zZXJpYWxpemUoc3VtbWFyeSwgZG9zKTsKLSAgICAgICAgICAgIERhdGFJbnB1dFN0cmVhbSBkaXMgPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkb3MudG9CeXRlQXJyYXkoKSkpOwotICAgICAgICAgICAgSW5kZXhTdW1tYXJ5IGxvYWRlZCA9IEluZGV4U3VtbWFyeS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRpcywgcCwgMSwgMSk7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBsb2FkZWQuc2l6ZSgpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhzdW1tYXJ5LmdldFBvc2l0aW9uKDApLCBsb2FkZWQuZ2V0UG9zaXRpb24oMCkpOwotICAgICAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoc3VtbWFyeS5nZXRLZXkoMCksIHN1bW1hcnkuZ2V0S2V5KDApKTsKLSAgICAgICAgICAgIHN1bW1hcnkuY2xvc2UoKTsKLSAgICAgICAgICAgIGxvYWRlZC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgSW5kZXhTdW1tYXJ5PiBnZW5lcmF0ZVJhbmRvbUluZGV4KGludCBzaXplLCBpbnQgaW50ZXJ2YWwpCi0gICAgewotICAgICAgICBMaXN0PERlY29yYXRlZEtleT4gbGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOwotICAgICAgICB0cnkgKEluZGV4U3VtbWFyeUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBJbmRleFN1bW1hcnlCdWlsZGVyKGxpc3Quc2l6ZSgpLCBpbnRlcnZhbCwgQkFTRV9TQU1QTElOR19MRVZFTCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVVSUQgdXVpZCA9IFVVSUQucmFuZG9tVVVJRCgpOwotICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5ieXRlcyh1dWlkKSk7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoa2V5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobGlzdCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgICAgICBidWlsZGVyLm1heWJlQWRkRW50cnkobGlzdC5nZXQoaSksIGkpOwotICAgICAgICAgICAgSW5kZXhTdW1tYXJ5IHN1bW1hcnkgPSBidWlsZGVyLmJ1aWxkKHBhcnRpdGlvbmVyKTsKLSAgICAgICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZShsaXN0LCBzdW1tYXJ5KTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3REb3duc2FtcGxlUGF0dGVybnMoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoMCksIERvd25zYW1wbGluZy5nZXRTYW1wbGluZ1BhdHRlcm4oMCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgwKSwgRG93bnNhbXBsaW5nLmdldFNhbXBsaW5nUGF0dGVybigxKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoMSwgMCksIERvd25zYW1wbGluZy5nZXRTYW1wbGluZ1BhdHRlcm4oMikpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgzLCAxLCAyLCAwKSwgRG93bnNhbXBsaW5nLmdldFNhbXBsaW5nUGF0dGVybig0KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDcsIDMsIDUsIDEsIDYsIDIsIDQsIDApLCBEb3duc2FtcGxpbmcuZ2V0U2FtcGxpbmdQYXR0ZXJuKDgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoMTUsIDcsIDExLCAzLCAxMywgNSwgOSwgMSwgMTQsIDYsIDEwLCAyLCAxMiwgNCwgOCwgMCksIERvd25zYW1wbGluZy5nZXRTYW1wbGluZ1BhdHRlcm4oMTYpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNob3VsZFNraXAoaW50IGluZGV4LCBMaXN0PEludGVnZXI+IHN0YXJ0UG9pbnRzKQotICAgIHsKLSAgICAgICAgZm9yIChpbnQgc3RhcnQgOiBzdGFydFBvaW50cykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChpbmRleCAtIHN0YXJ0KSAlIEJBU0VfU0FNUExJTkdfTEVWRUwgPT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RG93bnNhbXBsZSgpCi0gICAgewotICAgICAgICBmaW5hbCBpbnQgTlVNX0tFWVMgPSA0MDk2OwotICAgICAgICBmaW5hbCBpbnQgSU5ERVhfSU5URVJWQUwgPSAxMjg7Ci0gICAgICAgIGZpbmFsIGludCBPUklHSU5BTF9OVU1fRU5UUklFUyA9IE5VTV9LRVlTIC8gSU5ERVhfSU5URVJWQUw7Ci0KLQotICAgICAgICBQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgSW5kZXhTdW1tYXJ5PiByYW5kb20gPSBnZW5lcmF0ZVJhbmRvbUluZGV4KE5VTV9LRVlTLCBJTkRFWF9JTlRFUlZBTCk7Ci0gICAgICAgIExpc3Q8RGVjb3JhdGVkS2V5PiBrZXlzID0gcmFuZG9tLmxlZnQ7Ci0gICAgICAgIEluZGV4U3VtbWFyeSBvcmlnaW5hbCA9IHJhbmRvbS5yaWdodDsKLQotICAgICAgICAvLyBzYW5pdHkgY2hlY2sgb24gdGhlIG9yaWdpbmFsIGluZGV4IHN1bW1hcnkKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPUklHSU5BTF9OVU1fRU5UUklFUzsgaSsrKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGtleXMuZ2V0KGkgKiBJTkRFWF9JTlRFUlZBTCkuZ2V0S2V5KCksIEJ5dGVCdWZmZXIud3JhcChvcmlnaW5hbC5nZXRLZXkoaSkpKTsKLQotICAgICAgICBMaXN0PEludGVnZXI+IHNhbXBsZVBhdHRlcm4gPSBEb3duc2FtcGxpbmcuZ2V0U2FtcGxpbmdQYXR0ZXJuKEJBU0VfU0FNUExJTkdfTEVWRUwpOwotCi0gICAgICAgIC8vIGRvd25zYW1wbGUgYnkgb25lIGxldmVsLCB0aGVuIHR3byBsZXZlbHMsIHRoZW4gdGhyZWUgbGV2ZWxzLi4uCi0gICAgICAgIGludCBkb3duc2FtcGxpbmdSb3VuZCA9IDE7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsaW5nTGV2ZWwgPSBCQVNFX1NBTVBMSU5HX0xFVkVMIC0gMTsgc2FtcGxpbmdMZXZlbCA+PSAxOyBzYW1wbGluZ0xldmVsLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5IGRvd25zYW1wbGVkID0gZG93bnNhbXBsZShvcmlnaW5hbCwgc2FtcGxpbmdMZXZlbCwgMTI4LCBwYXJ0aXRpb25lcik7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbnRyaWVzQXRTYW1wbGluZ0xldmVsKHNhbXBsaW5nTGV2ZWwsIG9yaWdpbmFsLmdldE1heE51bWJlck9mRW50cmllcygpKSwgZG93bnNhbXBsZWQuc2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgIGludCBzYW1wbGVkQ291bnQgPSAwOwotICAgICAgICAgICAgICAgIExpc3Q8SW50ZWdlcj4gc2tpcFN0YXJ0UG9pbnRzID0gc2FtcGxlUGF0dGVybi5zdWJMaXN0KDAsIGRvd25zYW1wbGluZ1JvdW5kKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE9SSUdJTkFMX05VTV9FTlRSSUVTOyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFNraXAoaSwgc2tpcFN0YXJ0UG9pbnRzKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGtleXMuZ2V0KGkgKiBJTkRFWF9JTlRFUlZBTCkuZ2V0S2V5KCksIEJ5dGVCdWZmZXIud3JhcChkb3duc2FtcGxlZC5nZXRLZXkoc2FtcGxlZENvdW50KSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlZENvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0ZXN0UG9zaXRpb24ob3JpZ2luYWwsIGRvd25zYW1wbGVkLCBrZXlzKTsKLSAgICAgICAgICAgICAgICBkb3duc2FtcGxpbmdSb3VuZCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZG93bnNhbXBsZSBvbmUgbGV2ZWwgZWFjaCB0aW1lCi0gICAgICAgIEluZGV4U3VtbWFyeSBwcmV2aW91cyA9IG9yaWdpbmFsOwotICAgICAgICBkb3duc2FtcGxpbmdSb3VuZCA9IDE7Ci0gICAgICAgIGZvciAoaW50IGRvd25zYW1wbGVMZXZlbCA9IEJBU0VfU0FNUExJTkdfTEVWRUwgLSAxOyBkb3duc2FtcGxlTGV2ZWwgPj0gMTsgZG93bnNhbXBsZUxldmVsLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluZGV4U3VtbWFyeSBkb3duc2FtcGxlZCA9IGRvd25zYW1wbGUocHJldmlvdXMsIGRvd25zYW1wbGVMZXZlbCwgMTI4LCBwYXJ0aXRpb25lcik7Ci0gICAgICAgICAgICBpZiAocHJldmlvdXMgIT0gb3JpZ2luYWwpCi0gICAgICAgICAgICAgICAgcHJldmlvdXMuY2xvc2UoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbnRyaWVzQXRTYW1wbGluZ0xldmVsKGRvd25zYW1wbGVMZXZlbCwgb3JpZ2luYWwuZ2V0TWF4TnVtYmVyT2ZFbnRyaWVzKCkpLCBkb3duc2FtcGxlZC5zaXplKCkpOwotCi0gICAgICAgICAgICBpbnQgc2FtcGxlZENvdW50ID0gMDsKLSAgICAgICAgICAgIExpc3Q8SW50ZWdlcj4gc2tpcFN0YXJ0UG9pbnRzID0gc2FtcGxlUGF0dGVybi5zdWJMaXN0KDAsIGRvd25zYW1wbGluZ1JvdW5kKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgT1JJR0lOQUxfTlVNX0VOVFJJRVM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFNraXAoaSwgc2tpcFN0YXJ0UG9pbnRzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhrZXlzLmdldChpICogSU5ERVhfSU5URVJWQUwpLmdldEtleSgpLCBCeXRlQnVmZmVyLndyYXAoZG93bnNhbXBsZWQuZ2V0S2V5KHNhbXBsZWRDb3VudCkpKTsKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlZENvdW50Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0ZXN0UG9zaXRpb24ob3JpZ2luYWwsIGRvd25zYW1wbGVkLCBrZXlzKTsKLSAgICAgICAgICAgIHByZXZpb3VzID0gZG93bnNhbXBsZWQ7Ci0gICAgICAgICAgICBkb3duc2FtcGxpbmdSb3VuZCsrOwotICAgICAgICB9Ci0gICAgICAgIHByZXZpb3VzLmNsb3NlKCk7Ci0gICAgICAgIG9yaWdpbmFsLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RQb3NpdGlvbihJbmRleFN1bW1hcnkgb3JpZ2luYWwsIEluZGV4U3VtbWFyeSBkb3duc2FtcGxlZCwgTGlzdDxEZWNvcmF0ZWRLZXk+IGtleXMpCi0gICAgewotICAgICAgICBmb3IgKERlY29yYXRlZEtleSBrZXkgOiBrZXlzKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb25nIG9yaWcgPSBTU1RhYmxlUmVhZGVyLmdldEluZGV4U2NhblBvc2l0aW9uRnJvbUJpbmFyeVNlYXJjaFJlc3VsdChvcmlnaW5hbC5iaW5hcnlTZWFyY2goa2V5KSwgb3JpZ2luYWwpOwotICAgICAgICAgICAgaW50IGJpbmFyeVNlYXJjaCA9IGRvd25zYW1wbGVkLmJpbmFyeVNlYXJjaChrZXkpOwotICAgICAgICAgICAgaW50IGluZGV4ID0gU1NUYWJsZVJlYWRlci5nZXRJbmRleFN1bW1hcnlJbmRleEZyb21CaW5hcnlTZWFyY2hSZXN1bHQoYmluYXJ5U2VhcmNoKTsKLSAgICAgICAgICAgIGludCBzY2FuRnJvbSA9IChpbnQpIFNTVGFibGVSZWFkZXIuZ2V0SW5kZXhTY2FuUG9zaXRpb25Gcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGluZGV4LCBkb3duc2FtcGxlZCk7Ci0gICAgICAgICAgICBhc3NlcnQgc2NhbkZyb20gPD0gb3JpZzsKLSAgICAgICAgICAgIGludCBlZmZlY3RpdmVJbnRlcnZhbCA9IGRvd25zYW1wbGVkLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KGluZGV4KTsKLSAgICAgICAgICAgIERlY29yYXRlZEtleSBrID0gbnVsbDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgayAhPSBrZXkgJiYgaSA8IGVmZmVjdGl2ZUludGVydmFsICYmIHNjYW5Gcm9tIDwga2V5cy5zaXplKCkgOyBpKyssIHNjYW5Gcm9tICsrKQotICAgICAgICAgICAgICAgIGsgPSBrZXlzLmdldChzY2FuRnJvbSk7Ci0gICAgICAgICAgICBhc3NlcnQgayA9PSBrZXk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RPcmlnaW5hbEluZGV4TG9va3VwKCkKLSAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSBCQVNFX1NBTVBMSU5HX0xFVkVMOyBpID49IDE7IGktLSkKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBEb3duc2FtcGxpbmcuZ2V0T3JpZ2luYWxJbmRleGVzKGkpLnNpemUoKSk7Ci0KLSAgICAgICAgQXJyYXlMaXN0PEludGVnZXI+IGZ1bGwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCQVNFX1NBTVBMSU5HX0xFVkVMOyBpKyspCi0gICAgICAgICAgICBmdWxsLmFkZChpKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoZnVsbCwgRG93bnNhbXBsaW5nLmdldE9yaWdpbmFsSW5kZXhlcyhCQVNFX1NBTVBMSU5HX0xFVkVMKSk7Ci0gICAgICAgIC8vIHRoZSBlbnRyeSBhdCBpbmRleCAxMjcgaXMgdGhlIGZpcnN0IHRvIGdvCi0gICAgICAgIGFzc2VydEVxdWFscyhmdWxsLnN1Ykxpc3QoMCwgZnVsbC5zaXplKCkgLSAxKSwgRG93bnNhbXBsaW5nLmdldE9yaWdpbmFsSW5kZXhlcyhCQVNFX1NBTVBMSU5HX0xFVkVMIC0gMSkpOwotCi0gICAgICAgIC8vIHNwb3QgY2hlY2sgYSBmZXcgdmFsdWVzICh0aGVzZSBkZXBlbmQgb24gQkFTRV9TQU1QTElOR19MRVZFTCBiZWluZyAxMjgpCi0gICAgICAgIGFzc2VydEVxdWFscygxMjgsIEJBU0VfU0FNUExJTkdfTEVWRUwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgwLCAzMiwgNjQsIDk2KSwgRG93bnNhbXBsaW5nLmdldE9yaWdpbmFsSW5kZXhlcyg0KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDAsIDY0KSwgRG93bnNhbXBsaW5nLmdldE9yaWdpbmFsSW5kZXhlcygyKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDApLCBEb3duc2FtcGxpbmcuZ2V0T3JpZ2luYWxJbmRleGVzKDEpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROdW1iZXJPZlNraXBwZWRFbnRyaWVzQWZ0ZXJJbmRleCgpCi0gICAgewotICAgICAgICBpbnQgaW5kZXhJbnRlcnZhbCA9IDEyODsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCQVNFX1NBTVBMSU5HX0xFVkVMOyBpKyspCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoaW5kZXhJbnRlcnZhbCwgRG93bnNhbXBsaW5nLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KGksIEJBU0VfU0FNUExJTkdfTEVWRUwsIGluZGV4SW50ZXJ2YWwpKTsKLQotICAgICAgICAvLyB3aXRoIG9uZSByb3VuZCBvZiBkb3duc2FtcGxpbmcsIG9ubHkgdGhlIGxhc3Qgc3VtbWFyeSBlbnRyeSBoYXMgYmVlbiByZW1vdmVkLCBzbyBvbmx5IHRoZSBsYXN0IGluZGV4IHdpbGwgaGF2ZQotICAgICAgICAvLyBkb3VibGUgdGhlIGdhcCB1bnRpbCB0aGUgbmV4dCBzYW1wbGUKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCQVNFX1NBTVBMSU5HX0xFVkVMIC0gMjsgaSsrKQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGluZGV4SW50ZXJ2YWwsIERvd25zYW1wbGluZy5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsQWZ0ZXJJbmRleChpLCBCQVNFX1NBTVBMSU5HX0xFVkVMIC0gMSwgaW5kZXhJbnRlcnZhbCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoaW5kZXhJbnRlcnZhbCAqIDIsIERvd25zYW1wbGluZy5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsQWZ0ZXJJbmRleChCQVNFX1NBTVBMSU5HX0xFVkVMIC0gMiwgQkFTRV9TQU1QTElOR19MRVZFTCAtIDEsIGluZGV4SW50ZXJ2YWwpKTsKLQotICAgICAgICAvLyBhdCBzYW1wbGluZ0xldmVsPTIsIHRoZSByZXRhaW5lZCBzdW1tYXJ5IHBvaW50cyBhcmUgWzAsIDY0XSAoYXNzdW1lcyBCQVNFX1NBTVBMSU5HX0xFVkVMIGlzIDEyOCkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEyOCwgQkFTRV9TQU1QTElOR19MRVZFTCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg2NCAqIGluZGV4SW50ZXJ2YWwsIERvd25zYW1wbGluZy5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsQWZ0ZXJJbmRleCgwLCAyLCBpbmRleEludGVydmFsKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg2NCAqIGluZGV4SW50ZXJ2YWwsIERvd25zYW1wbGluZy5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsQWZ0ZXJJbmRleCgxLCAyLCBpbmRleEludGVydmFsKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvTGVnYWN5U1NUYWJsZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL0xlZ2FjeVNTVGFibGVUZXN0LmphdmEKaW5kZXggMDYzYWZlNS4uNDMyZTRiMCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvTGVnYWN5U1NUYWJsZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9MZWdhY3lTU1RhYmxlVGVzdC5qYXZhCkBAIC0xOSwyNCArMTksMTkgQEAKIAogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aDsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlByZWNvbmRpdGlvbnM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JdGVyYWJsZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVPdXRwdXRTdHJlYW1QbHVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCkBAIC00NiwzMSArNDEsMzYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2luZ2xlUGFydGl0aW9uU2xpY2VDb21tYW5kVGVzdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkFic3RyYWN0Q29tcGFjdGlvblRhc2s7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yZXBhaXIuUGVuZGluZ0FudGlDb21wYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnN0cmVhbWluZy5DYXNzYW5kcmFPdXRnb2luZ0ZpbGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2luZ2xlUGFydGl0aW9uU2xpY2VDb21tYW5kVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlZlcmlmaWVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUmFuZ2VUb21ic3RvbmVNYXJrZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnN0cmVhbWluZy5DYXNzYW5kcmFPdXRnb2luZ0ZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGVTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVJbnB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNhY2hlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5PdXRnb2luZ1N0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtUGxhbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtT3BlcmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5TdHJlYW1QbGFuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiAKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX0xFR0FDWV9TU1RBQkxFX1JPT1Q7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZS5OT19QRU5ESU5HX1JFUEFJUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKQEAgLTg1LDggKzg1LDYgQEAKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTGVnYWN5U1NUYWJsZVRlc3QuY2xhc3MpOwogCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1NTVEFCTEVfUFJPUCA9ICJsZWdhY3ktc3N0YWJsZS1yb290IjsKLQogICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBMRUdBQ1lfU1NUQUJMRV9ST09UOwogCiAgICAgLyoqCkBAIC05NCw3ICs5Miw3IEBACiAgICAgICogU2VlIHtAbGluayAjdGVzdEdlbmVyYXRlU3N0YWJsZXMoKX0gdG8gZ2VuZXJhdGUgc3N0YWJsZXMuCiAgICAgICogVGFrZSBjYXJlIG9uIGNvbW1pdCBhcyB5b3UgbmVlZCB0byBhZGQgdGhlIHNzdGFibGUgZmlsZXMgdXNpbmcge0Bjb2RlIGdpdCBhZGQgLWZ9CiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBsZWdhY3lWZXJzaW9ucyA9IHsibmIiLCAibmEiLCAibWUiLCAibWQiLCAibWMiLCAibWIiLCAibWEifTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxlZ2FjeVZlcnNpb25zID0geyJkYSIsICJuYyIsICJuYiIsICJuYSIsICJtZSIsICJtZCIsICJtYyIsICJtYiIsICJtYSJ9OwogCiAgICAgLy8gMTIwMCBjaGFycwogICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgbG9uZ1N0cmluZyA9ICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IiArCkBAIC0xMTMsOCArMTExLDggQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFN0cmluZyBzY3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoTEVHQUNZX1NTVEFCTEVfUFJPUCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJTeXN0ZW0gcHJvcGVydHkgIiArIExFR0FDWV9TU1RBQkxFX1BST1AgKyAiIG5vdCBzZXQiLCBzY3ApOworICAgICAgICBTdHJpbmcgc2NwID0gVEVTVF9MRUdBQ1lfU1NUQUJMRV9ST09ULmdldFN0cmluZygpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiU3lzdGVtIHByb3BlcnR5ICIgKyBURVNUX0xFR0FDWV9TU1RBQkxFX1JPT1QuZ2V0S2V5KCkgKyAiIG5vdCBzZXQiLCBzY3ApOwogCiAgICAgICAgIExFR0FDWV9TU1RBQkxFX1JPT1QgPSBuZXcgRmlsZShzY3ApLnRvQWJzb2x1dGUoKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlN5c3RlbSBwcm9wZXJ0eSAiICsgTEVHQUNZX1NTVEFCTEVfUk9PVCArICIgZG9lcyBub3Qgc3BlY2lmeSBhIGRpcmVjdG9yeSIsIExFR0FDWV9TU1RBQkxFX1JPT1QuaXNEaXJlY3RvcnkoKSk7CkBAIC0xNDQsOCArMTQyLDkgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKFN0cmluZyBsZWdhY3lWZXJzaW9uLCBTdHJpbmcgdGFibGUpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgUGF0aCBmaWxlID0gRmlsZXMubGlzdChnZXRUYWJsZURpcihsZWdhY3lWZXJzaW9uLCB0YWJsZSkudG9QYXRoKCkpLmZpbmRGaXJzdCgpLm9yRWxzZVRocm93KCgpIC0+IG5ldyBSdW50aW1lRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIk5vIGZpbGVzIGZvciB2ZXJzaW9uPSVzIGFuZCB0YWJsZT0lcyIsIGxlZ2FjeVZlcnNpb24sIHRhYmxlKSkpOwotICAgICAgICByZXR1cm4gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUobmV3IEZpbGUoZmlsZSkpOworICAgICAgICBGaWxlW10gZmlsZXMgPSBnZXRUYWJsZURpcihsZWdhY3lWZXJzaW9uLCB0YWJsZSkubGlzdCgpOworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQoZmlsZXMubGVuZ3RoID4gMCwgIk5vIGZpbGVzIGZvciB2ZXJzaW9uPSVzIGFuZCB0YWJsZT0lcyIsIGxlZ2FjeVZlcnNpb24sIHRhYmxlKTsKKyAgICAgICAgcmV0dXJuIERlc2NyaXB0b3IuZnJvbUZpbGVXaXRoQ29tcG9uZW50KGZpbGVzWzBdKS5sZWZ0OwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0zMzIsNyArMzMxLDcgQEAKIAogICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5IChWZXJpZmllciB2ZXJpZmllciA9IG5ldyBWZXJpZmllcihjZnMsIHNzdGFibGUsIGZhbHNlLCBWZXJpZmllci5vcHRpb25zKCkuY2hlY2tWZXJzaW9uKHRydWUpLmJ1aWxkKCkpKQorICAgICAgICAgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5jaGVja1ZlcnNpb24odHJ1ZSkuYnVpbGQoKSkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFzc3RhYmxlLmRlc2NyaXB0b3IudmVyc2lvbi5pc0xhdGVzdFZlcnNpb24oKSkKQEAgLTM0NCw3ICszNDMsNyBAQAogICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IHRocm93IGFueSBleGNlcHRpb24gaWYgbm90IGNoZWNraW5nIHZlcnNpb246CiAgICAgICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkgKFZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IFZlcmlmaWVyKGNmcywgc3N0YWJsZSwgZmFsc2UsIFZlcmlmaWVyLm9wdGlvbnMoKS5jaGVja1ZlcnNpb24oZmFsc2UpLmJ1aWxkKCkpKQorICAgICAgICAgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5jaGVja1ZlcnNpb24oZmFsc2UpLmJ1aWxkKCkpKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDIwLDcgKzQxOSw3IEBACiAgICAgcHJpdmF0ZSB2b2lkIHN0cmVhbUxlZ2FjeVRhYmxlKFN0cmluZyB0YWJsZVBhdHRlcm4sIFN0cmluZyBsZWdhY3lWZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBTdHJpbmcgdGFibGUgPSBTdHJpbmcuZm9ybWF0KHRhYmxlUGF0dGVybiwgbGVnYWN5VmVyc2lvbik7Ci0gICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IFNTVGFibGVSZWFkZXIub3BlbihnZXREZXNjcmlwdG9yKGxlZ2FjeVZlcnNpb24sIHRhYmxlKSk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IFNTVGFibGVSZWFkZXIub3BlbihudWxsLCBnZXREZXNjcmlwdG9yKGxlZ2FjeVZlcnNpb24sIHRhYmxlKSk7CiAgICAgICAgIElQYXJ0aXRpb25lciBwID0gc3N0YWJsZS5nZXRQYXJ0aXRpb25lcigpOwogICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gcmFuZ2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIHJhbmdlcy5hZGQobmV3IFJhbmdlPD4ocC5nZXRNaW5pbXVtVG9rZW4oKSwgcC5nZXRUb2tlbihCeXRlQnVmZmVyVXRpbC5ieXRlcygiMTAwIikpKSk7CkBAIC00NjIsNiArNDYxLDExIEBACiAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeUNhY2hlKFN0cmluZyBsZWdhY3lWZXJzaW9uLCBsb25nIHN0YXJ0Q291bnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uCiAgICAgeworICAgICAgICAvLyBPbmx5IHBlcmZvcm0gdGVzdCBpZiBmb3JtYXQgdXNlcyBjYWNoZS4KKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gSXRlcmFibGVzLmdldEZpcnN0KEtleXNwYWNlLm9wZW4oImxlZ2FjeV90YWJsZXMiKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShTdHJpbmcuZm9ybWF0KCJsZWdhY3lfJXNfc2ltcGxlIiwgbGVnYWN5VmVyc2lvbikpLmdldExpdmVTU1RhYmxlcygpLCBudWxsKTsKKyAgICAgICAgaWYgKCEoc3N0YWJsZSBpbnN0YW5jZW9mIEtleUNhY2hlU3VwcG9ydCkpCisgICAgICAgICAgICByZXR1cm47CisKICAgICAgICAgLy9Gb3IgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9DQVNTQU5EUkEtMTA3NzgKICAgICAgICAgLy9WYWxpZGF0ZSB3aGV0aGVyIHRoZSBrZXkgY2FjaGUgc3VjY2Vzc2Z1bGx5IHNhdmVzIGluIHRoZSBwcmVzZW5jZSBvZiBvbGQga2V5cyBhcwogICAgICAgICAvL3dlbGwgYXMgbG9hZHMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGtleXMKQEAgLTU5NCw3ICs1OTgsNyBAQAogICAgIC8qKgogICAgICAqIEdlbmVyYXRlcyBzc3RhYmxlcyBmb3IgOCBDUUwgdGFibGVzIChzZWUge0BsaW5rICNjcmVhdGVUYWJsZXMoU3RyaW5nKX0pIGluIDxpPmN1cnJlbnQ8L2k+CiAgICAgICogc3N0YWJsZSBmb3JtYXQgKHZlcnNpb24pIGludG8ge0Bjb2RlIHRlc3QvZGF0YS9sZWdhY3ktc3N0YWJsZXMvVkVSU0lPTn0sIHdoZXJlCi0gICAgICoge0Bjb2RlIFZFUlNJT059IG1hdGNoZXMge0BsaW5rIFZlcnNpb24jZ2V0VmVyc2lvbigpIEJpZ0Zvcm1hdC5sYXRlc3RWZXJzaW9uLmdldFZlcnNpb24oKX0uCisgICAgICoge0Bjb2RlIFZFUlNJT059IG1hdGNoZXMge0BsaW5rIFZlcnNpb24jdmVyc2lvbiBCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbi5nZXRWZXJzaW9uKCl9LgogICAgICAqIDxwPgogICAgICAqIFJ1biB0aGlzIHRlc3QgYWxvbmUgKGUuZy4gZnJvbSB5b3VyIElERSkgd2hlbiBhIG5ldyB2ZXJzaW9uIGlzIGludHJvZHVjZWQgb3IgZm9ybWF0IGNoYW5nZWQKICAgICAgKiBkdXJpbmcgZGV2ZWxvcG1lbnQuIEkuZS4gcmVtb3ZlIHRoZSB7QGNvZGUgQElnbm9yZX0gYW5ub3RhdGlvbiB0ZW1wb3JhcmlseS4KQEAgLTYwNCw2ICs2MDgsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlU3N0YWJsZXMoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgeworICAgICAgICBTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKTsKICAgICAgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7CiAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyODsgaSsrKQpAQCAtNjE2LDMxICs2MjEsMzEgQEAKICAgICAgICAgewogICAgICAgICAgICAgU3RyaW5nIHZhbFBrID0gSW50ZWdlci50b1N0cmluZyhwayk7CiAgICAgICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gbGVnYWN5X3RhYmxlcy5sZWdhY3lfJXNfc2ltcGxlIChwaywgdmFsKSBWQUxVRVMgKCclcycsICclcycpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0Zvcm1hdC5sYXRlc3RWZXJzaW9uLCB2YWxQaywgImZvbyBiYXIgYmF6IikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmdldExhdGVzdFZlcnNpb24oKSwgdmFsUGssICJmb28gYmFyIGJheiIpKTsKIAogICAgICAgICAgICAgUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKFN0cmluZy5mb3JtYXQoIlVQREFURSBsZWdhY3lfdGFibGVzLmxlZ2FjeV8lc19zaW1wbGVfY291bnRlciBTRVQgdmFsID0gdmFsICsgMSBXSEVSRSBwayA9ICclcyciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24sIHZhbFBrKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpLCB2YWxQaykpOwogCiAgICAgICAgICAgICBmb3IgKGludCBjayA9IDA7IGNrIDwgNTA7IGNrKyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIHZhbENrID0gSW50ZWdlci50b1N0cmluZyhjayk7CiAKICAgICAgICAgICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gbGVnYWN5X3RhYmxlcy5sZWdhY3lfJXNfY2x1c3QgKHBrLCBjaywgdmFsKSBWQUxVRVMgKCclcycsICclcycsICclcycpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbiwgdmFsUGssIHZhbENrICsgbG9uZ1N0cmluZywgcmFuZG9tU3RyaW5nKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmdldExhdGVzdFZlcnNpb24oKSwgdmFsUGssIHZhbENrICsgbG9uZ1N0cmluZywgcmFuZG9tU3RyaW5nKSk7CiAKICAgICAgICAgICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiVVBEQVRFIGxlZ2FjeV90YWJsZXMubGVnYWN5XyVzX2NsdXN0X2NvdW50ZXIgU0VUIHZhbCA9IHZhbCArIDEgV0hFUkUgcGsgPSAnJXMnIEFORCBjaz0nJXMnIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbiwgdmFsUGssIHZhbENrICsgbG9uZ1N0cmluZykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRMYXRlc3RWZXJzaW9uKCksIHZhbFBrLCB2YWxDayArIGxvbmdTdHJpbmcpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmZvcmNlS2V5c3BhY2VGbHVzaCgibGVnYWN5X3RhYmxlcyIsIENvbHVtbkZhbWlseVN0b3JlLkZsdXNoUmVhc29uLlVOSVRfVEVTVFMpOwogCi0gICAgICAgIEZpbGUga3NEaXIgPSBuZXcgRmlsZShMRUdBQ1lfU1NUQUJMRV9ST09ULCBTdHJpbmcuZm9ybWF0KCIlcy9sZWdhY3lfdGFibGVzIiwgQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24pKTsKKyAgICAgICAgRmlsZSBrc0RpciA9IG5ldyBGaWxlKExFR0FDWV9TU1RBQkxFX1JPT1QsIFN0cmluZy5mb3JtYXQoIiVzL2xlZ2FjeV90YWJsZXMiLCBmb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpKSk7CiAgICAgICAgIGtzRGlyLnRyeUNyZWF0ZURpcmVjdG9yaWVzKCk7Ci0gICAgICAgIGNvcHlTc3RhYmxlc0Zyb21UZXN0RGF0YShTdHJpbmcuZm9ybWF0KCJsZWdhY3lfJXNfc2ltcGxlIiwgQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24pLCBrc0Rpcik7Ci0gICAgICAgIGNvcHlTc3RhYmxlc0Zyb21UZXN0RGF0YShTdHJpbmcuZm9ybWF0KCJsZWdhY3lfJXNfc2ltcGxlX2NvdW50ZXIiLCBCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbiksIGtzRGlyKTsKLSAgICAgICAgY29weVNzdGFibGVzRnJvbVRlc3REYXRhKFN0cmluZy5mb3JtYXQoImxlZ2FjeV8lc19jbHVzdCIsIEJpZ0Zvcm1hdC5sYXRlc3RWZXJzaW9uKSwga3NEaXIpOwotICAgICAgICBjb3B5U3N0YWJsZXNGcm9tVGVzdERhdGEoU3RyaW5nLmZvcm1hdCgibGVnYWN5XyVzX2NsdXN0X2NvdW50ZXIiLCBCaWdGb3JtYXQubGF0ZXN0VmVyc2lvbiksIGtzRGlyKTsKKyAgICAgICAgY29weVNzdGFibGVzRnJvbVRlc3REYXRhKFN0cmluZy5mb3JtYXQoImxlZ2FjeV8lc19zaW1wbGUiLCBmb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpKSwga3NEaXIpOworICAgICAgICBjb3B5U3N0YWJsZXNGcm9tVGVzdERhdGEoU3RyaW5nLmZvcm1hdCgibGVnYWN5XyVzX3NpbXBsZV9jb3VudGVyIiwgZm9ybWF0LmdldExhdGVzdFZlcnNpb24oKSksIGtzRGlyKTsKKyAgICAgICAgY29weVNzdGFibGVzRnJvbVRlc3REYXRhKFN0cmluZy5mb3JtYXQoImxlZ2FjeV8lc19jbHVzdCIsIGZvcm1hdC5nZXRMYXRlc3RWZXJzaW9uKCkpLCBrc0Rpcik7CisgICAgICAgIGNvcHlTc3RhYmxlc0Zyb21UZXN0RGF0YShTdHJpbmcuZm9ybWF0KCJsZWdhY3lfJXNfY2x1c3RfY291bnRlciIsIGZvcm1hdC5nZXRMYXRlc3RWZXJzaW9uKCkpLCBrc0Rpcik7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvcHlTc3RhYmxlc0Zyb21UZXN0RGF0YShTdHJpbmcgdGFibGUsIEZpbGUga3NEaXIpIHRocm93cyBJT0V4Y2VwdGlvbgpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9SYW5nZUF3YXJlU1NUYWJsZVdyaXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjI1OGJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBSYW5nZUF3YXJlU1NUYWJsZVdyaXRlclRlc3QKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRTEgPSAiS2V5c3BhY2UxIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRCA9ICJTdGFuZGFyZDEiOworCisgICAgcHVibGljIHN0YXRpYyBDb2x1bW5GYW1pbHlTdG9yZSBjZnM7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRQYXJ0aXRpb25lclVuc2FmZShNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UpOworICAgICAgICBTY2hlbWFMb2FkZXIuY2xlYW51cEFuZExlYXZlRGlycygpOworICAgICAgICBLZXlzcGFjZS5zZXRJbml0aWFsaXplZCgpOworICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5pbml0U2VydmVyKCk7CisKKyAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXJ0aXRpb25lcihNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UpKTsKKworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKTsKKyAgICAgICAgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0ZfU1RBTkRBUkQpOworICAgICAgICBjZnMuY2xlYXJVbnNhZmUoKTsKKyAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc1dyaXRlckJlZm9yZUFwcGVuZCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKworICAgICAgICBTY2hlbWFMb2FkZXIuaW5zZXJ0RGF0YShLRVlTUEFDRTEsIENGX1NUQU5EQVJELCAwLCAxKTsKKyAgICAgICAgVXRpbC5mbHVzaChjZnMpOworCisgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IExpZmVjeWNsZVRyYW5zYWN0aW9uLm9mZmxpbmUoT3BlcmF0aW9uVHlwZS5TVFJFQU0pOworCisgICAgICAgIFJhbmdlQXdhcmVTU1RhYmxlV3JpdGVyIHdyaXRlciA9IG5ldyBSYW5nZUF3YXJlU1NUYWJsZVdyaXRlcihjZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmcy5nZXRMaXZlU1NUYWJsZXMoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhLmlkLCB3cml0ZXIuZ2V0VGFibGVJZCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCB3cml0ZXIuZ2V0RmlsZVBvaW50ZXIoKSk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlQ29ycnVwdGlvbkRldGVjdGlvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVDb3JydXB0aW9uRGV0ZWN0aW9uVGVzdC5qYXZhCmluZGV4IGVjMDE4NjUuLjIxYWM1MWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVDb3JydXB0aW9uRGV0ZWN0aW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVDb3JydXB0aW9uRGV0ZWN0aW9uVGVzdC5qYXZhCkBAIC0yMSwzMCArMjEsNDAgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLio7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CiAKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlVwZGF0ZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5DaHVua0NhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2xpY2VzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ29sdW1uRmlsdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQXNjaWlUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZXNUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29tcHJlc3Npb25QYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlRmx1c2hPYnNlcnZlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVGbHVzaE9ic2VydmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Y2EwNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlRmx1c2hPYnNlcnZlclRlc3QuamF2YQpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkFycmF5TGlzdE11bHRpbWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGltYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLnR1cGxlLkltbXV0YWJsZVRyaXBsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMudHVwbGUuVHJpcGxlOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Mb25nVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQWJzdHJhY3RVbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5CVHJlZVJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkJ1ZmZlckNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRW5jb2RpbmdTdGF0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFDb2xsZWN0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YVJlZjsKKworcHVibGljIGNsYXNzIFNTVGFibGVGbHVzaE9ic2VydmVyVGVzdAoreworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0REQoKQorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5zdGFydCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLU19OQU1FID0gInRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9OQU1FID0gImZsdXNoX29ic2VydmVyIjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsdXNoT2JzZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBUYWJsZU1ldGFkYXRhIGNmbSA9CisgICAgICAgIFRhYmxlTWV0YWRhdGEuYnVpbGRlcihLU19OQU1FLCBDRl9OQU1FKQorICAgICAgICAgICAgICAgICAgICAgLmFkZFBhcnRpdGlvbktleUNvbHVtbigiaWQiLCBVVEY4VHlwZS5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKCJmaXJzdF9uYW1lIiwgVVRGOFR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbigiYWdlIiwgSW50MzJUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oImhlaWdodCIsIExvbmdUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb24gPSBMaWZlY3ljbGVUcmFuc2FjdGlvbi5vZmZsaW5lKE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTik7CisgICAgICAgIEZsdXNoT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBuZXcgRmx1c2hPYnNlcnZlcigpOworCisgICAgICAgIFN0cmluZyBzc3RhYmxlRGlyZWN0b3J5ID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldEFsbERhdGFGaWxlTG9jYXRpb25zKClbMF07CisgICAgICAgIEZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUoc3N0YWJsZURpcmVjdG9yeSArIEZpbGUucGF0aFNlcGFyYXRvcigpICsgS1NfTkFNRSArIEZpbGUucGF0aFNlcGFyYXRvcigpICsgQ0ZfTkFNRSk7CisgICAgICAgIGRpcmVjdG9yeS5kZWxldGVPbkV4aXQoKTsKKworICAgICAgICBpZiAoIWRpcmVjdG9yeS5leGlzdHMoKSAmJiAhZGlyZWN0b3J5LnRyeUNyZWF0ZURpcmVjdG9yaWVzKCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKG5ldyBJT0V4Y2VwdGlvbigiZmFpbGVkIHRvIGNyZWF0ZSB0bXAgZGlyZWN0b3J5IiksIGRpcmVjdG9yeS5hYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgU1NUYWJsZUZvcm1hdDw/LCA/PiBzc3RhYmxlRm9ybWF0ID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpOworICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgRGVzY3JpcHRvcihzc3RhYmxlRm9ybWF0LmdldExhdGVzdFZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZm0ua2V5c3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmbS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCgwKSk7CisKKyAgICAgICAgU1NUYWJsZVdyaXRlciB3cml0ZXIgPSBkZXNjcmlwdG9yLmdldEZvcm1hdCgpLmdldFdyaXRlckZhY3RvcnkoKS5idWlsZGVyKGRlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRLZXlDb3VudCgxMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhYmxlTWV0YWRhdGFSZWYoVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHMoY2ZtKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1ldGFkYXRhQ29sbGVjdG9yKG5ldyBNZXRhZGF0YUNvbGxlY3RvcihjZm0uY29tcGFyYXRvcikuc3N0YWJsZUxldmVsKDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0U2VyaWFsaXphdGlvbkhlYWRlcihuZXcgU2VyaWFsaXphdGlvbkhlYWRlcih0cnVlLCBjZm0sIGNmbS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZsdXNoT2JzZXJ2ZXJzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob2JzZXJ2ZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRGVmYXVsdENvbXBvbmVudHMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQodHJhbnNhY3Rpb24sIG51bGwpOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gbnVsbDsKKyAgICAgICAgTXVsdGltYXA8Qnl0ZUJ1ZmZlciwgQ2VsbDw/Pj4gZXhwZWN0ZWQgPSBBcnJheUxpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBrZXkgPSBVVEY4VHlwZS5pbnN0YW5jZS5mcm9tU3RyaW5nKCJrZXkxIik7CisgICAgICAgICAgICBleHBlY3RlZC5wdXRBbGwoa2V5LCBBcnJheXMuYXNMaXN0KEJ1ZmZlckNlbGwubGl2ZShnZXRDb2x1bW4oY2ZtLCAiYWdlIiksIG5vdywgSW50MzJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgyNykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJDZWxsLmxpdmUoZ2V0Q29sdW1uKGNmbSwgImZpcnN0X25hbWUiKSwgbm93LCBVVEY4VHlwZS5pbnN0YW5jZS5mcm9tU3RyaW5nKCJqYWNrIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJDZWxsLmxpdmUoZ2V0Q29sdW1uKGNmbSwgImhlaWdodCIpLCBub3csIExvbmdUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgxODNMKSkpKTsKKworICAgICAgICAgICAgd3JpdGVyLmFwcGVuZChuZXcgUm93SXRlcmF0b3IoY2ZtLCBrZXkuZHVwbGljYXRlKCksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYnVpbGRSb3coZXhwZWN0ZWQuZ2V0KGtleSkpKSkpOworCisgICAgICAgICAgICBrZXkgPSBVVEY4VHlwZS5pbnN0YW5jZS5mcm9tU3RyaW5nKCJrZXkyIik7CisgICAgICAgICAgICBleHBlY3RlZC5wdXRBbGwoa2V5LCBBcnJheXMuYXNMaXN0KEJ1ZmZlckNlbGwubGl2ZShnZXRDb2x1bW4oY2ZtLCAiYWdlIiksIG5vdywgSW50MzJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgzMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJDZWxsLmxpdmUoZ2V0Q29sdW1uKGNmbSwgImZpcnN0X25hbWUiKSwgbm93LCBVVEY4VHlwZS5pbnN0YW5jZS5mcm9tU3RyaW5nKCJqaW0iKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckNlbGwubGl2ZShnZXRDb2x1bW4oY2ZtLCAiaGVpZ2h0IiksIG5vdywgTG9uZ1R5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDE4MEwpKSkpOworCisgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKG5ldyBSb3dJdGVyYXRvcihjZm0sIGtleSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChidWlsZFJvdyhleHBlY3RlZC5nZXQoa2V5KSkpKSk7CisKKyAgICAgICAgICAgIGtleSA9IFVURjhUeXBlLmluc3RhbmNlLmZyb21TdHJpbmcoImtleTMiKTsKKyAgICAgICAgICAgIGV4cGVjdGVkLnB1dEFsbChrZXksIEFycmF5cy5hc0xpc3QoQnVmZmVyQ2VsbC5saXZlKGdldENvbHVtbihjZm0sICJhZ2UiKSwgbm93LCBJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDMwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckNlbGwubGl2ZShnZXRDb2x1bW4oY2ZtLCAiZmlyc3RfbmFtZSIpLCBub3csIFVURjhUeXBlLmluc3RhbmNlLmZyb21TdHJpbmcoImtlbiIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyQ2VsbC5saXZlKGdldENvbHVtbihjZm0sICJoZWlnaHQiKSwgbm93LCBMb25nVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMTc4TCkpKSk7CisKKyAgICAgICAgICAgIHdyaXRlci5hcHBlbmQobmV3IFJvd0l0ZXJhdG9yKGNmbSwga2V5LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGJ1aWxkUm93KGV4cGVjdGVkLmdldChrZXkpKSkpKTsKKworICAgICAgICAgICAgcmVhZGVyID0gd3JpdGVyLmZpbmlzaCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkod3JpdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG9ic2VydmVyLmlzQ29tcGxldGUpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnNpemUoKSwgb2JzZXJ2ZXIucm93cy5zaXplKCkpOworCisgICAgICAgIGZvciAoVHJpcGxlPEJ5dGVCdWZmZXIsIExvbmcsIExvbmc+IGUgOiBvYnNlcnZlci5yb3dzLmtleVNldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGtleSA9IGUuZ2V0TGVmdCgpOworICAgICAgICAgICAgbG9uZyBkYXRhUG9zaXRpb24gPSBlLmdldE1pZGRsZSgpOworICAgICAgICAgICAgbG9uZyBpbmRleFBvc2l0aW9uID0gZS5nZXRSaWdodCgpOworCisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgaW5kZXhLZXkgPSByZWFkZXIua2V5QXRQb3NpdGlvbkZyb21TZWNvbmRhcnlJbmRleChpbmRleFBvc2l0aW9uKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgVVRGOFR5cGUuaW5zdGFuY2UuY29tcGFyZShrZXksIGluZGV4S2V5LmdldEtleSgpKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldChrZXkpLCBvYnNlcnZlci5yb3dzLmdldChlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSb3dJdGVyYXRvciBleHRlbmRzIEFic3RyYWN0VW5maWx0ZXJlZFJvd0l0ZXJhdG9yCisgICAgeworICAgICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPFVuZmlsdGVyZWQ+IHJvd3M7CisKKyAgICAgICAgcHVibGljIFJvd0l0ZXJhdG9yKFRhYmxlTWV0YWRhdGEgY2ZtLCBCeXRlQnVmZmVyIGtleSwgQ29sbGVjdGlvbjxVbmZpbHRlcmVkPiBjb250ZW50KQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihjZm0sCisgICAgICAgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UGFydGl0aW9uZXIoKS5kZWNvcmF0ZUtleShrZXkpLAorICAgICAgICAgICAgICAgICAgRGVsZXRpb25UaW1lLkxJVkUsCisgICAgICAgICAgICAgICAgICBjZm0ucmVndWxhckFuZFN0YXRpY0NvbHVtbnMoKSwKKyAgICAgICAgICAgICAgICAgIEJUcmVlUm93LmVtcHR5Um93KENsdXN0ZXJpbmcuU1RBVElDX0NMVVNURVJJTkcpLAorICAgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgICBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKKworICAgICAgICAgICAgcm93cyA9IGNvbnRlbnQuaXRlcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBjb21wdXRlTmV4dCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiByb3dzLmhhc05leHQoKSA/IHJvd3MubmV4dCgpIDogZW5kT2ZEYXRhKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGbHVzaE9ic2VydmVyIGltcGxlbWVudHMgU1NUYWJsZUZsdXNoT2JzZXJ2ZXIKKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTXVsdGltYXA8VHJpcGxlPEJ5dGVCdWZmZXIsIExvbmcsIExvbmc+LCBDZWxsPD8+PiByb3dzID0gQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgTXVsdGltYXA8VHJpcGxlPEJ5dGVCdWZmZXIsIExvbmcsIExvbmc+LCBDZWxsPD8+PiBzdGF0aWNSb3dzID0gQXJyYXlMaXN0TXVsdGltYXAuY3JlYXRlKCk7CisKKyAgICAgICAgcHJpdmF0ZSBUcmlwbGU8Qnl0ZUJ1ZmZlciwgTG9uZywgTG9uZz4gY3VycmVudEtleTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQ29tcGxldGU7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGJlZ2luKCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0UGFydGl0aW9uKERlY29yYXRlZEtleSBrZXksIGxvbmcgZGF0YVBvc2l0aW9uLCBsb25nIGluZGV4UG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJlbnRLZXkgPSBJbW11dGFibGVUcmlwbGUub2Yoa2V5LmdldEtleSgpLCBkYXRhUG9zaXRpb24sIGluZGV4UG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG5leHRVbmZpbHRlcmVkQ2x1c3RlcihVbmZpbHRlcmVkIHJvdykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHJvdy5pc1JvdygpKQorICAgICAgICAgICAgICAgICgoUm93KSByb3cpLmZvckVhY2goKGMpIC0+IHJvd3MucHV0KGN1cnJlbnRLZXksIChDZWxsPD8+KSBjKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGUoKQorICAgICAgICB7CisgICAgICAgICAgICBpc0NvbXBsZXRlID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzdGF0aWNSb3coUm93IHN0YXRpY1JvdykKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGljUm93LmZvckVhY2goKGMpIC0+IHN0YXRpY1Jvd3MucHV0KGN1cnJlbnRLZXksIChDZWxsPD8+KSBjKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSb3cgYnVpbGRSb3coQ29sbGVjdGlvbjxDZWxsPD8+PiBjZWxscykKKyAgICB7CisgICAgICAgIFJvdy5CdWlsZGVyIHJvd0J1aWxkZXIgPSBCVHJlZVJvdy5zb3J0ZWRCdWlsZGVyKCk7CisgICAgICAgIHJvd0J1aWxkZXIubmV3Um93KENsdXN0ZXJpbmcuRU1QVFkpOworICAgICAgICBjZWxscy5mb3JFYWNoKHJvd0J1aWxkZXI6OmFkZENlbGwpOworICAgICAgICByZXR1cm4gcm93QnVpbGRlci5idWlsZCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENvbHVtbk1ldGFkYXRhIGdldENvbHVtbihUYWJsZU1ldGFkYXRhIGNmbSwgU3RyaW5nIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gY2ZtLmdldENvbHVtbihVVEY4VHlwZS5pbnN0YW5jZS5mcm9tU3RyaW5nKG5hbWUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlRm9ybWF0VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUZvcm1hdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGE2OGRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUZvcm1hdFRlc3QuamF2YQpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUZ1bmN0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWcuU1NUYWJsZUNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5ZYW1sQ29uZmlndXJhdGlvbkxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CisKK3B1YmxpYyBjbGFzcyBTU1RhYmxlRm9ybWF0VGVzdAoreworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RGb3JtYXQgaW1wbGVtZW50cyBTU1RhYmxlRm9ybWF0PFNTVGFibGVSZWFkZXIsIFNTVGFibGVXcml0ZXI+CisgICAgeworICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zOworICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbGF0ZXN0VmVyc2lvbjsKKworICAgICAgICBwdWJsaWMgQWJzdHJhY3RGb3JtYXQoU3RyaW5nIGxhdGVzdFZlcnNpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubGF0ZXN0VmVyc2lvbiA9IGxhdGVzdFZlcnNpb247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZlcnNpb24gZ2V0VmVyc2lvbihTdHJpbmcgdmVyc2lvbikKKyAgICAgICAgeworICAgICAgICAgICAgVmVyc2lvbiB2ID0gTW9ja2l0by5tb2NrKFZlcnNpb24uY2xhc3MpOworICAgICAgICAgICAgd2hlbih2LnRvU3RyaW5nKCkpLnRoZW5SZXR1cm4odmVyc2lvbik7CisgICAgICAgICAgICB3aGVuKHYuaXNDb21wYXRpYmxlKCkpLnRoZW5SZXR1cm4odmVyc2lvbi5jaGFyQXQoMCkgPT0gbGF0ZXN0VmVyc2lvbi5jaGFyQXQoMCkpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZlcnNpb24gZ2V0TGF0ZXN0VmVyc2lvbigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRWZXJzaW9uKGxhdGVzdFZlcnNpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBTU1RhYmxlRm9ybWF0LkZhY3RvcnkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgICAgICAgICAgcHVibGljIEJpRnVuY3Rpb248TWFwPFN0cmluZywgU3RyaW5nPiwgU3RyaW5nLCBTU1RhYmxlRm9ybWF0PD8sID8+PiBwcm92aWRlcjsKKworICAgICAgICAgICAgcHVibGljIEZhY3RvcnkoU3RyaW5nIG5hbWUsIEJpRnVuY3Rpb248TWFwPFN0cmluZywgU3RyaW5nPiwgU3RyaW5nLCBTU1RhYmxlRm9ybWF0PD8sID8+PiBwcm92aWRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgICAgIHRoaXMucHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTU1RhYmxlRm9ybWF0PD8sID8+IGdldEluc3RhbmNlKE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9ucykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuYXBwbHkob3B0aW9ucywgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEFic3RyYWN0Rm9ybWF0LkZhY3RvcnkgZmFjdG9yeShTdHJpbmcgbmFtZSwgQ2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Rm9ybWF0PiBjbGF6eikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RGb3JtYXQuRmFjdG9yeShuYW1lLCAob3B0aW9ucywgdmVyc2lvbikgLT4geworICAgICAgICAgICAgQWJzdHJhY3RGb3JtYXQgZm9ybWF0ID0gTW9ja2l0by5zcHkoY2xhenopOworICAgICAgICAgICAgZm9ybWF0Lm5hbWUgPSBuYW1lOworICAgICAgICAgICAgZm9ybWF0Lm9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBGb3JtYXQxIGV4dGVuZHMgQWJzdHJhY3RGb3JtYXQKKyAgICB7CisgICAgICAgIHB1YmxpYyBGb3JtYXQxKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoInh4Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEZvcm1hdDIgZXh0ZW5kcyBBYnN0cmFjdEZvcm1hdAorICAgIHsKKyAgICAgICAgcHVibGljIEZvcm1hdDIoKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcigieXkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRm9ybWF0MyBleHRlbmRzIEFic3RyYWN0Rm9ybWF0CisgICAgeworICAgICAgICBwdWJsaWMgRm9ybWF0MygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKCJ6eiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5jbGllbnRJbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB5YW1sQ29udGVudDAgPSAiIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTU1RhYmxlQ29uZmlnIGV4cGVjdGVkMCA9IG5ldyBDb25maWcuU1NUYWJsZUNvbmZpZygpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHlhbWxDb250ZW50MSA9ICJzc3RhYmxlOlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBzZWxlY3RlZF9mb3JtYXQ6IGFhYVxuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTU1RhYmxlQ29uZmlnIGV4cGVjdGVkMSA9IG5ldyBDb25maWcuU1NUYWJsZUNvbmZpZygpCisgICAgeworICAgICAgICB7CisgICAgICAgICAgICBzZWxlY3RlZF9mb3JtYXQgPSAiYWFhIjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgeWFtbENvbnRlbnQyID0gInNzdGFibGU6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIHNlbGVjdGVkX2Zvcm1hdDogYWFhXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgIGZvcm1hdDpcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgIGFhYTpcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICBwYXJhbTE6IHZhbHVlMVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgIHBhcmFtMjogdmFsdWUyXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICBiYmI6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgcGFyYW0zOiB2YWx1ZTNcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICBwYXJhbTQ6IHZhbHVlNFxuIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmZpZy5TU1RhYmxlQ29uZmlnIGV4cGVjdGVkMiA9IG5ldyBTU1RhYmxlQ29uZmlnKCkKKyAgICB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHNlbGVjdGVkX2Zvcm1hdCA9ICJhYWEiOworICAgICAgICAgICAgZm9ybWF0ID0gSW1tdXRhYmxlTWFwLm9mKCJhYWEiLCBJbW11dGFibGVNYXAub2YoInBhcmFtMSIsICJ2YWx1ZTEiLCAicGFyYW0yIiwgInZhbHVlMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmIiLCBJbW11dGFibGVNYXAub2YoInBhcmFtMyIsICJ2YWx1ZTMiLCAicGFyYW00IiwgInZhbHVlNCIpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTU1RhYmxlQ29uZmlnIHVuZXhwZWN0ZWQgPSBuZXcgQ29uZmlnLlNTVGFibGVDb25maWcoKQorICAgIHsKKyAgICAgICAgeworICAgICAgICAgICAgc2VsZWN0ZWRfZm9ybWF0ID0gImFhYSI7CisgICAgICAgIH0KKyAgICB9OworCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzaW5nWWFtbENvbmZpZygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgWWFtbENvbmZpZ3VyYXRpb25Mb2FkZXIgbG9hZGVyID0gbmV3IFlhbWxDb25maWd1cmF0aW9uTG9hZGVyKCk7CisgICAgICAgIEZpbGUgZiA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgic3N0YWJsZV9mb3JtYXRfdGVzdF9jb25maWciLCAiLnlhbWwiKTsKKyAgICAgICAgVVJMIHVybCA9IGYudG9QYXRoKCkudG9VcmkoKS50b1VSTCgpOworCisgICAgICAgIEltbXV0YWJsZU1hcC5vZih5YW1sQ29udGVudDAsIGV4cGVjdGVkMCwgeWFtbENvbnRlbnQxLCBleHBlY3RlZDEsIHlhbWxDb250ZW50MiwgZXhwZWN0ZWQyKS5mb3JFYWNoKCh5YW1sQ29udGVudCwgZXhwZWN0ZWQpIC0+IHsKKyAgICAgICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gZi5uZXdPdXRwdXRTdHJlYW0oRmlsZS5Xcml0ZU1vZGUuT1ZFUldSSVRFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoeWFtbENvbnRlbnQuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbmZpZyBjb25maWcgPSBsb2FkZXIubG9hZENvbmZpZyh1cmwpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChjb25maWcuc3N0YWJsZSkuZGVzY3JpYmVkQXMoIllhbWw6IFxuJXNcbiIsIHlhbWxDb250ZW50KS5pc0VxdWFsVG9Db21wYXJpbmdGaWVsZEJ5RmllbGQoZXhwZWN0ZWQpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlKCkKKyAgICB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZShTU1RhYmxlQ29uZmlnIGNvbmZpZywgU1NUYWJsZUZvcm1hdC5GYWN0b3J5Li4uIGZhY3RvcmllcykKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5yZXNldFNTVGFibGVGb3JtYXRzKEFycmF5cy5hc0xpc3QoZmFjdG9yaWVzKSwgY29uZmlnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Rm9ybWF0KFN0cmluZyBuYW1lLCBNYXA8U3RyaW5nLCBTdHJpbmc+IG9wdGlvbnMpCisgICAgeworICAgICAgICBBYnN0cmFjdEZvcm1hdCBmb3JtYXQgPSAoQWJzdHJhY3RGb3JtYXQpIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpLmdldChuYW1lKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmb3JtYXQubmFtZSkuaXNFcXVhbFRvKG5hbWUpOworICAgICAgICBhc3NlcnRUaGF0KGZvcm1hdC5vcHRpb25zKS5pc0VxdWFsVG8ob3B0aW9ucyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVNlbGVjdGVkRm9ybWF0KFN0cmluZyBuYW1lKQorICAgIHsKKyAgICAgICAgYXNzZXJ0VGhhdChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkubmFtZSgpKS5pc0VxdWFsVG8obmFtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRDb25maWcoKQorICAgIHsKKyAgICAgICAgY29uZmlndXJlKGV4cGVjdGVkMSwgZmFjdG9yeSgiYWFhIiwgRm9ybWF0MS5jbGFzcykpOworICAgICAgICBhc3NlcnRUaGF0KERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpKS5oYXNTaXplKDEpOworICAgICAgICB2ZXJpZnlGb3JtYXQoImFhYSIsIEltbXV0YWJsZU1hcC5vZigpKTsKKyAgICAgICAgdmVyaWZ5U2VsZWN0ZWRGb3JtYXQoImFhYSIpOworCisgICAgICAgIGNvbmZpZ3VyZShleHBlY3RlZDIsIGZhY3RvcnkoImFhYSIsIEZvcm1hdDEuY2xhc3MpLCBmYWN0b3J5KCJiYmIiLCBGb3JtYXQyLmNsYXNzKSwgZmFjdG9yeSgiY2NjIiwgRm9ybWF0My5jbGFzcykpOworICAgICAgICBhc3NlcnRUaGF0KERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlRm9ybWF0cygpKS5oYXNTaXplKDMpOworICAgICAgICB2ZXJpZnlGb3JtYXQoImFhYSIsIEltbXV0YWJsZU1hcC5vZigicGFyYW0xIiwgInZhbHVlMSIsICJwYXJhbTIiLCAidmFsdWUyIikpOworICAgICAgICB2ZXJpZnlGb3JtYXQoImJiYiIsIEltbXV0YWJsZU1hcC5vZigicGFyYW0zIiwgInZhbHVlMyIsICJwYXJhbTQiLCAidmFsdWU0IikpOworICAgICAgICB2ZXJpZnlGb3JtYXQoImNjYyIsIEltbXV0YWJsZU1hcC5vZigpKTsKKyAgICAgICAgdmVyaWZ5U2VsZWN0ZWRGb3JtYXQoImFhYSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ1ZhbGlkYXRpb24oKQorICAgIHsKKyAgICAgICAgLy8gaW52YWxpZCBuYW1lCisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykuaXNUaHJvd25CeSgoKSAtPiBjb25maWd1cmUoZXhwZWN0ZWQxLCBmYWN0b3J5KCJBYSIsIEZvcm1hdDEuY2xhc3MpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoTWVzc2FnZUNvbnRhaW5pbmdBbGwoIlNTVGFibGUgZm9ybWF0IG5hbWUiLCAibXVzdCBiZSBub24tZW1wdHksIGxvd2VyLWNhc2UgbGV0dGVycyBvbmx5IHN0cmluZyIpOworICAgICAgICBhc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlKENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MpLmlzVGhyb3duQnkoKCkgLT4gY29uZmlndXJlKGV4cGVjdGVkMSwgZmFjdG9yeSgiYS1hIiwgRm9ybWF0MS5jbGFzcykpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhNZXNzYWdlQ29udGFpbmluZ0FsbCgiU1NUYWJsZSBmb3JtYXQgbmFtZSIsICJtdXN0IGJlIG5vbi1lbXB0eSwgbG93ZXItY2FzZSBsZXR0ZXJzIG9ubHkgc3RyaW5nIik7CisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykuaXNUaHJvd25CeSgoKSAtPiBjb25maWd1cmUoZXhwZWN0ZWQxLCBmYWN0b3J5KCJhMSIsIEZvcm1hdDEuY2xhc3MpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoTWVzc2FnZUNvbnRhaW5pbmdBbGwoIlNTVGFibGUgZm9ybWF0IG5hbWUiLCAibXVzdCBiZSBub24tZW1wdHksIGxvd2VyLWNhc2UgbGV0dGVycyBvbmx5IHN0cmluZyIpOworICAgICAgICBhc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlKENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MpLmlzVGhyb3duQnkoKCkgLT4gY29uZmlndXJlKGV4cGVjdGVkMSwgZmFjdG9yeSgiIiwgRm9ybWF0MS5jbGFzcykpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhNZXNzYWdlQ29udGFpbmluZ0FsbCgiU1NUYWJsZSBmb3JtYXQgbmFtZSIsICJtdXN0IGJlIG5vbi1lbXB0eSwgbG93ZXItY2FzZSBsZXR0ZXJzIG9ubHkgc3RyaW5nIik7CisKKyAgICAgICAgLy8gZHVwbGljYXRlIG5hbWUKKyAgICAgICAgYXNzZXJ0VGhhdEV4Y2VwdGlvbk9mVHlwZShDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzKS5pc1Rocm93bkJ5KCgpIC0+IGNvbmZpZ3VyZShleHBlY3RlZDEsIGZhY3RvcnkoImFhYSIsIEZvcm1hdDEuY2xhc3MpLCBmYWN0b3J5KCJhYWEiLCBGb3JtYXQyLmNsYXNzKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aE1lc3NhZ2VDb250YWluaW5nQWxsKCJNdWx0aXBsZSBzc3RhYmxlIGZvcm1hdCBpbXBsZW1lbnRhdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIiwgImFhYSIpOworCisgICAgICAgIC8vIG1pc3NpbmcgbmFtZQorICAgICAgICBhc3NlcnRUaGF0RXhjZXB0aW9uT2ZUeXBlKENvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MpLmlzVGhyb3duQnkoKCkgLT4gY29uZmlndXJlKGV4cGVjdGVkMSwgZmFjdG9yeShudWxsLCBGb3JtYXQxLmNsYXNzKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aE1lc3NhZ2VDb250YWluaW5nQWxsKCJTU1RhYmxlIGZvcm1hdCBuYW1lIiwgImNhbm5vdCBiZSBudWxsIik7CisKKyAgICAgICAgLy8gQ29uZmlndXJhdGlvbiBjb250YWlucyBvcHRpb25zIG9mIHVua25vd24gc3N0YWJsZSBmb3JtYXRzCisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykuaXNUaHJvd25CeSgoKSAtPiBjb25maWd1cmUoZXhwZWN0ZWQyLCBmYWN0b3J5KCJhYWEiLCBGb3JtYXQxLmNsYXNzKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aE1lc3NhZ2VDb250YWluaW5nQWxsKCJDb25maWd1cmF0aW9uIGNvbnRhaW5zIG9wdGlvbnMgb2YgdW5rbm93biBzc3RhYmxlIGZvcm1hdHMiLCAiYmJiIik7CisKKyAgICAgICAgLy8gU2VsZWN0ZWQgc3N0YWJsZSBmb3JtYXQgJyVzJyBpcyBub3QgYXZhaWxhYmxlCisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykuaXNUaHJvd25CeSgoKSAtPiBjb25maWd1cmUoZXhwZWN0ZWQxLCBmYWN0b3J5KCJiYmIiLCBGb3JtYXQxLmNsYXNzKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aE1lc3NhZ2VDb250YWluaW5nQWxsKCJTZWxlY3RlZCBzc3RhYmxlIGZvcm1hdCIsICJhYWEiLCAiaXMgbm90IGF2YWlsYWJsZSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVIZWFkZXJGaXhUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlSGVhZGVyRml4VGVzdC5qYXZhCmluZGV4IDQ1NzJlNWMuLjUyNzNkYWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVIZWFkZXJGaXhUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUhlYWRlckZpeFRlc3QuamF2YQpAQCAtMzMsMTAgKzMzLDExIEBACiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwogaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CkBAIC02MCwxNiArNjEsMTcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVXNlclR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuVmVyc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db2x1bW5NZXRhZGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuSW5kZXhNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuTW9ja1NjaGVtYTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuSW5kZXhNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKIApAQCAtMTAxLDYgKzEwMywxMiBAQAogICAgICAgICByZXR1cm4gTW9ja1NjaGVtYS5zc3RhYmxlSWRHZW5lcmF0b3JzKCk7CiAgICAgfQogCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZUNsYXNzKCkKKyAgICB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKEJpZ0Zvcm1hdC5pc1NlbGVjdGVkKCkpOworICAgIH0KKwogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXR1cCgpCiAgICAgewpAQCAtMTc4LDcgKzE4Niw3IEBACiAgICAgICAgIHJldHVybiBuZXcgVHVwbGVUeXBlKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoVVRGOFR5cGUuaW5zdGFuY2UpKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uIHZlcnNpb24gPSBCaWdGb3JtYXQuaW5zdGFuY2UuZ2V0VmVyc2lvbigibWMiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uIHZlcnNpb24gPSBCaWdGb3JtYXQuZ2V0SW5zdGFuY2UoKS5nZXRWZXJzaW9uKCJtYyIpOwogCiAgICAgcHJpdmF0ZSBUYWJsZU1ldGFkYXRhIHRhYmxlTWV0YWRhdGE7CiAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiB1cGRhdGVkQ29sdW1ucyA9IG5ldyBIYXNoU2V0PD4oKTsKQEAgLTM4Niw3ICszOTQsNyBAQAogICAgICAgICAgICAgQ29sdW1uTWV0YWRhdGEgY2QgPSBnZXRDb2xEZWYoY29sKTsKICAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBkcm9wVHlwZSA9IGNkLnR5cGUuZXhwYW5kVXNlclR5cGVzKCk7CiAgICAgICAgICAgICBjb2xzLnJlbW92ZVJlZ3VsYXJPclN0YXRpY0NvbHVtbihjaSkKLSAgICAgICAgICAgICAgICAucmVjb3JkQ29sdW1uRHJvcChuZXcgQ29sdW1uTWV0YWRhdGEoY2Qua3NOYW1lLCBjZC5jZk5hbWUsIGNkLm5hbWUsIGRyb3BUeXBlLCBjZC5wb3NpdGlvbigpLCBjZC5raW5kKSwgRkJVdGlsaXRpZXMudGltZXN0YW1wTWljcm9zKCkpOworICAgICAgICAgICAgICAgIC5yZWNvcmRDb2x1bW5Ecm9wKG5ldyBDb2x1bW5NZXRhZGF0YShjZC5rc05hbWUsIGNkLmNmTmFtZSwgY2QubmFtZSwgZHJvcFR5cGUsIGNkLnBvc2l0aW9uKCksIGNkLmtpbmQsIGNkLmdldE1hc2soKSksIEZCVXRpbGl0aWVzLnRpbWVzdGFtcE1pY3JvcygpKTsKICAgICAgICAgfQogICAgICAgICB0YWJsZU1ldGFkYXRhID0gY29scy5idWlsZCgpOwogCkBAIC04MjIsMTEgKzgzMCwxMSBAQAogICAgICAgICB0cnkKICAgICAgICAgewogCi0gICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRGVzY3JpcHRvcih2ZXJzaW9uLCBkaXIsICJrcyIsICJjZiIsIE1vY2tTY2hlbWEuc3N0YWJsZUlkKGdlbmVyYXRpb24pLCBTU1RhYmxlRm9ybWF0LlR5cGUuQklHKTsKKyAgICAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IG5ldyBEZXNjcmlwdG9yKHZlcnNpb24sIGRpciwgImtzIiwgImNmIiwgTW9ja1NjaGVtYS5zc3RhYmxlSWQoZ2VuZXJhdGlvbikpOwogCiAgICAgICAgICAgICAvLyBKdXN0IGNyZWF0ZSB0aGUgY29tcG9uZW50IGZpbGVzIC0gd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdGhvc2UuCiAgICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiByZXF1aXJlZENvbXBvbmVudHMpCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKGNvbXBvbmVudCkpLmNyZWF0ZUZpbGVJZk5vdEV4aXN0cygpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRlc2MuZmlsZUZvcihjb21wb25lbnQpLmNyZWF0ZUZpbGVJZk5vdEV4aXN0cygpKTsKIAogICAgICAgICAgICAgQWJzdHJhY3RUeXBlPD8+IHBhcnRpdGlvbktleSA9IGhlYWRlck1ldGFkYXRhLnBhcnRpdGlvbktleVR5cGU7CiAgICAgICAgICAgICBMaXN0PEFic3RyYWN0VHlwZTw/Pj4gY2x1c3RlcmluZ0tleSA9IGhlYWRlck1ldGFkYXRhLmNsdXN0ZXJpbmdDb2x1bW5zKCkKQEAgLTg0Miw3ICs4NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoY2QgLT4gY2Qua2luZCA9PSBDb2x1bW5NZXRhZGF0YS5LaW5kLlJFR1VMQVIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChjZCAtPiBjZC5uYW1lLmJ5dGVzLCBjZCAtPiBjZC50eXBlLCAoYSwgYikgLT4gYSkpOwogCi0gICAgICAgICAgICBGaWxlIHN0YXRzRmlsZSA9IG5ldyBGaWxlKGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlNUQVRTKSk7CisgICAgICAgICAgICBGaWxlIHN0YXRzRmlsZSA9IGRlc2MuZmlsZUZvcihDb21wb25lbnRzLlNUQVRTKTsKICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50IGhlYWRlciA9IFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50LmJ1aWxkQ29tcG9uZW50Rm9yVG9vbHMocGFydGl0aW9uS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyaW5nS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNDb2x1bW5zLApAQCAtODU1LDcgKzg2Myw3IEBACiAgICAgICAgICAgICAgICAgb3V0LmZpbmlzaCgpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOworICAgICAgICAgICAgcmV0dXJuIGRlc2MuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICAgewpAQCAtOTg4LDkgKzk5Niw5IEBACiAKICAgICBwcml2YXRlIFNlcmlhbGl6YXRpb25IZWFkZXIuQ29tcG9uZW50IHJlYWRIZWFkZXIoRmlsZSBzc3RhYmxlKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBEZXNjcmlwdG9yLmZyb21GaWxlbmFtZShzc3RhYmxlKTsKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gRGVzY3JpcHRvci5mcm9tRmlsZVdpdGhDb21wb25lbnQoc3N0YWJsZSwgZmFsc2UpLmxlZnQ7CiAgICAgICAgIHJldHVybiAoU2VyaWFsaXphdGlvbkhlYWRlci5Db21wb25lbnQpIGRlc2MuZ2V0TWV0YWRhdGFTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoZGVzYywgTWV0YWRhdGFUeXBlLkhFQURFUik7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcG9uZW50W10gcmVxdWlyZWRDb21wb25lbnRzID0gbmV3IENvbXBvbmVudFtdeyBDb21wb25lbnQuREFUQSwgQ29tcG9uZW50LkZJTFRFUiwgQ29tcG9uZW50LlBSSU1BUllfSU5ERVgsIENvbXBvbmVudC5UT0MgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wb25lbnRbXSByZXF1aXJlZENvbXBvbmVudHMgPSBuZXcgQ29tcG9uZW50W117IENvbXBvbmVudHMuREFUQSwgQ29tcG9uZW50cy5GSUxURVIsIENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCwgQ29tcG9uZW50cy5UT0MgfTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVMb2FkZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlTG9hZGVyVGVzdC5qYXZhCmluZGV4IGMyNDAzZGQuLmQyMTA4ODggMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVMb2FkZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZUxvYWRlclRlc3QuamF2YQpAQCAtMjQsNiArMjQsNyBAQAogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uRmlsZXM7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC0zMyw2ICszNCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SZXBsaWNhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7CkBAIC00MCw3ICs0Miw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy4qOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQXNjaWlUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLkZTV3JpdGVFcnJvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuU3RyZWFtRXZlbnQ7CkBAIC05NSwxNiArOTYsMzMgQEAKICAgICBAQWZ0ZXIKICAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkKICAgICB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlUmVjdXJzaXZlKHRtcGRpcik7Ci0gICAgICAgIH0gY2F0Y2ggKEZTV3JpdGVFcnJvciBlKSB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB0bXBkaXIuZGVsZXRlUmVjdXJzaXZlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEZTV3JpdGVFcnJvciBlKQorICAgICAgICB7CiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICBXZSBmb3JjZSBhIEdDIGhlcmUgdG8gZm9yY2UgYnVmZmVyIGRlYWxsb2NhdGlvbiwgYW5kIHRoZW4gdHJ5IGRlbGV0aW5nIHRoZSBkaXJlY3RvcnkgYWdhaW4uCiAgICAgICAgICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWU6IGh0dHA6Ly9idWdzLmphdmEuY29tL2J1Z2RhdGFiYXNlL3ZpZXdfYnVnLmRvP2J1Z19pZD00NzE1MTU0CiAgICAgICAgICAgICAgIElmIHRoaXMgaXMgbm90IHRoZSBwcm9ibGVtLCB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcmV0aHJvd24gYW55d2F5LgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKLSAgICAgICAgICAgIEZpbGVVdGlscy5kZWxldGVSZWN1cnNpdmUodG1wZGlyKTsKKyAgICAgICAgICAgIHRtcGRpci5kZWxldGVSZWN1cnNpdmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKFN0cmluZ1tdIGtleXNwYWNlVGFibGUgOiBuZXcgU3RyaW5nW11bXSB7IHtLRVlTUEFDRTEsIENGX1NUQU5EQVJEMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtLRVlTUEFDRTEsIENGX1NUQU5EQVJEMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtLRVlTUEFDRTEsIENGX0JBQ0tVUFN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7S0VZU1BBQ0UyLCBDRl9TVEFOREFSRDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7S0VZU1BBQ0UyLCBDRl9TVEFOREFSRDJ9fSkKKyAgICAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLnRydW5jYXRlKGtleXNwYWNlVGFibGVbMF0sIGtleXNwYWNlVGFibGVbMV0pOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gdHJ1bmNhdGUgdGFibGUhIiwgZXgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNTIsOSArMTcwLDExIEBACiAgICAgICAgIGFzc2VydEVxdWFscygxLCBwYXJ0aXRpb25zLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygia2V5MSIsIEFzY2lpVHlwZS5pbnN0YW5jZS5nZXRTdHJpbmcocGFydGl0aW9ucy5nZXQoMCkucGFydGl0aW9uS2V5KCkuZ2V0S2V5KCkpKTsKICAgICAgICAgYXNzZXJ0IG1ldGFkYXRhICE9IG51bGw7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5ieXRlcygiMTAwIiksIHBhcnRpdGlvbnMuZ2V0KDApLmdldFJvdyhDbHVzdGVyaW5nLm1ha2UoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoImNvbDEiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2VsbChtZXRhZGF0YS5nZXRDb2x1bW4oQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoInZhbCIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWZmZXIoKSk7CisKKyAgICAgICAgUm93IHJvdyA9IHBhcnRpdGlvbnMuZ2V0KDApLmdldFJvdyhDbHVzdGVyaW5nLm1ha2UoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoImNvbDEiKSkpOworICAgICAgICBhc3NlcnQgcm93ICE9IG51bGw7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIxMDAiKSwgcm93LmdldENlbGwobWV0YWRhdGEuZ2V0Q29sdW1uKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJ2YWwiKSkpLmJ1ZmZlcigpKTsKIAogICAgICAgICAvLyBUaGUgc3RyZWFtIGZ1dHVyZSBpcyBzaWduYWxsZWQgd2hlbiB0aGUgd29yayBpcyBjb21wbGV0ZSBidXQgYmVmb3JlIHJlbGVhc2luZyByZWZlcmVuY2VzLiBXYWl0IGZvciByZWxlYXNlCiAgICAgICAgIC8vIGJlZm9yZSBjbGVhbnVwIChDQVNTQU5EUkEtMTAxMTgpLgpAQCAtMTcwLDcgKzE5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbkRpcmVjdG9yeShkYXRhRGlyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yVGFibGUoU3RyaW5nLmZvcm1hdChzY2hlbWEsIEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVzaW5nKFN0cmluZy5mb3JtYXQocXVlcnksIEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhCdWZmZXJTaXplSW5NQigxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEJ1ZmZlclNpemVJbk1pQigxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKIAogICAgICAgICBpbnQgTkJfUEFSVElUSU9OUyA9IDUwMDA7IC8vIEVub3VnaCB0byB3cml0ZSA+MU1pQiBhbmQgZ2V0IGF0IGxlYXN0IG9uZSBjb21wbGV0ZWQgc3N0YWJsZSBiZWZvcmUgd2UndmUgY2xvc2VkIHRoZSB3cml0ZXIKQEAgLTIxMSwxMCArMjMxLDkgQEAKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkaW5nU1NUYWJsZVRvRGlmZmVyZW50S2V5c3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgcHVibGljIHZvaWQgdGVzdExvYWRpbmdTU1RhYmxlVG9EaWZmZXJlbnRLZXlzcGFjZUFuZFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgRmlsZSBkYXRhRGlyID0gbmV3IEZpbGUodG1wZGlyLmFic29sdXRlUGF0aCgpICsgRmlsZS5wYXRoU2VwYXJhdG9yKCkgKyBLRVlTUEFDRTEgKyBGaWxlLnBhdGhTZXBhcmF0b3IoKSArIENGX1NUQU5EQVJEMSk7Ci0gICAgICAgIGFzc2VydCBkYXRhRGlyLnRyeUNyZWF0ZURpcmVjdG9yaWVzKCk7CisgICAgICAgIEZpbGUgZGF0YURpciA9IGRhdGFEaXIoQ0ZfU1RBTkRBUkQxKTsKICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9IFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZU1ldGFkYXRhKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQxKTsKIAogICAgICAgICBTdHJpbmcgc2NoZW1hID0gIkNSRUFURSBUQUJMRSAlcy4lcyAoa2V5IGFzY2lpLCBuYW1lIGFzY2lpLCB2YWwgYXNjaWksIHZhbDEgYXNjaWksIFBSSU1BUlkgS0VZIChrZXksIG5hbWUpKSI7CkBAIC0yMzIsNDIgKzI1MSw2MCBAQAogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0ZfU1RBTkRBUkQxKTsKICAgICAgICAgVXRpbC5mbHVzaChjZnMpOyAvLyB3YWl0IGZvciBzc3RhYmxlcyB0byBiZSBvbiBkaXNrIGVsc2Ugd2Ugd29uJ3QgYmUgYWJsZSB0byBzdHJlYW0gdGhlbQogCi0gICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOwotICAgICAgICBTU1RhYmxlTG9hZGVyIGxvYWRlciA9IG5ldyBTU1RhYmxlTG9hZGVyKGRhdGFEaXIsIG5ldyBUZXN0Q2xpZW50KCksIG5ldyBPdXRwdXRIYW5kbGVyLlN5c3RlbU91dHB1dChmYWxzZSwgZmFsc2UpLCAxLCBLRVlTUEFDRTIpOwotICAgICAgICBsb2FkZXIuc3RyZWFtKENvbGxlY3Rpb25zLmVtcHR5U2V0KCksIGNvbXBsZXRpb25TdHJlYW1MaXN0ZW5lcihsYXRjaCkpLmdldCgpOworICAgICAgICBmb3IgKFN0cmluZyB0YWJsZSA6IG5ldyBTdHJpbmdbXSB7IENGX1NUQU5EQVJEMiwgbnVsbCB9KQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgICAgIFNTVGFibGVMb2FkZXIgbG9hZGVyID0gbmV3IFNTVGFibGVMb2FkZXIoZGF0YURpciwgbmV3IFRlc3RDbGllbnQoKSwgbmV3IE91dHB1dEhhbmRsZXIuU3lzdGVtT3V0cHV0KGZhbHNlLCBmYWxzZSksIDEsIEtFWVNQQUNFMiwgdGFibGUpOworICAgICAgICAgICAgbG9hZGVyLnN0cmVhbShDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBjb21wbGV0aW9uU3RyZWFtTGlzdGVuZXIobGF0Y2gpKS5nZXQoKTsKIAotICAgICAgICBjZnMgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMikuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0ZfU1RBTkRBUkQxKTsKLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOworICAgICAgICAgICAgU3RyaW5nIHRhcmdldFRhYmxlID0gdGFibGUgPT0gbnVsbCA/IENGX1NUQU5EQVJEMSA6IHRhYmxlOworICAgICAgICAgICAgY2ZzID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRTIpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhcmdldFRhYmxlKTsKKyAgICAgICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKIAotICAgICAgICBMaXN0PEZpbHRlcmVkUGFydGl0aW9uPiBwYXJ0aXRpb25zID0gVXRpbC5nZXRBbGwoVXRpbC5jbWQoY2ZzKS5idWlsZCgpKTsKKyAgICAgICAgICAgIExpc3Q8RmlsdGVyZWRQYXJ0aXRpb24+IHBhcnRpdGlvbnMgPSBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMpLmJ1aWxkKCkpOwogCi0gICAgICAgIGFzc2VydEVxdWFscygxLCBwYXJ0aXRpb25zLnNpemUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygia2V5MSIsIEFzY2lpVHlwZS5pbnN0YW5jZS5nZXRTdHJpbmcocGFydGl0aW9ucy5nZXQoMCkucGFydGl0aW9uS2V5KCkuZ2V0S2V5KCkpKTsKLSAgICAgICAgYXNzZXJ0IG1ldGFkYXRhICE9IG51bGw7Ci0gICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5ieXRlcygiMTAwIiksIHBhcnRpdGlvbnMuZ2V0KDApLmdldFJvdyhDbHVzdGVyaW5nLm1ha2UoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoImNvbDEiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2VsbChtZXRhZGF0YS5nZXRDb2x1bW4oQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoInZhbCIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWZmZXIoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcGFydGl0aW9ucy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJrZXkxIiwgQXNjaWlUeXBlLmluc3RhbmNlLmdldFN0cmluZyhwYXJ0aXRpb25zLmdldCgwKS5wYXJ0aXRpb25LZXkoKS5nZXRLZXkoKSkpOworICAgICAgICAgICAgYXNzZXJ0IG1ldGFkYXRhICE9IG51bGw7CiAKLSAgICAgICAgLy8gVGhlIHN0cmVhbSBmdXR1cmUgaXMgc2lnbmFsbGVkIHdoZW4gdGhlIHdvcmsgaXMgY29tcGxldGUgYnV0IGJlZm9yZSByZWxlYXNpbmcgcmVmZXJlbmNlcy4gV2FpdCBmb3IgcmVsZWFzZQotICAgICAgICAvLyBiZWZvcmUgY2xlYW51cCAoQ0FTU0FORFJBLTEwMTE4KS4KLSAgICAgICAgbGF0Y2guYXdhaXQoKTsKKyAgICAgICAgICAgIFJvdyByb3cgPSBwYXJ0aXRpb25zLmdldCgwKS5nZXRSb3coQ2x1c3RlcmluZy5tYWtlKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJjb2wxIikpKTsKKyAgICAgICAgICAgIGFzc2VydCByb3cgIT0gbnVsbDsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIxMDAiKSwgcm93LmdldENlbGwobWV0YWRhdGEuZ2V0Q29sdW1uKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJ2YWwiKSkpLmJ1ZmZlcigpKTsKKworICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBmdXR1cmUgaXMgc2lnbmFsbGVkIHdoZW4gdGhlIHdvcmsgaXMgY29tcGxldGUgYnV0IGJlZm9yZSByZWxlYXNpbmcgcmVmZXJlbmNlcy4gV2FpdCBmb3IgcmVsZWFzZQorICAgICAgICAgICAgLy8gYmVmb3JlIGNsZWFudXAgKENBU1NBTkRSQS0xMDExOCkuCisgICAgICAgICAgICBsYXRjaC5hd2FpdCgpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZGluZ0JhY2t1cHNUYWJsZSgpIHRocm93cyBFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHRlc3RMb2FkaW5nVGFibGUoQ0ZfQkFDS1VQUyk7CisgICAgICAgIHRlc3RMb2FkaW5nVGFibGUoQ0ZfQkFDS1VQUywgZmFsc2UpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdExvYWRpbmdTbmFwc2hvdHNUYWJsZSgpIHRocm93cyBFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIHRlc3RMb2FkaW5nVGFibGUoQ0ZfU05BUFNIT1RTKTsKKyAgICAgICAgdGVzdExvYWRpbmdUYWJsZShDRl9TTkFQU0hPVFMsIGZhbHNlKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgdGVzdExvYWRpbmdUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZGluZ0xlZ2FjeUJhY2t1cHNUYWJsZSgpIHRocm93cyBFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIEZpbGUgZGF0YURpciA9IGRhdGFEaXIodGFibGVOYW1lKTsKKyAgICAgICAgdGVzdExvYWRpbmdUYWJsZShDRl9CQUNLVVBTLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkaW5nTGVnYWN5U25hcHNob3RzVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0TG9hZGluZ1RhYmxlKENGX1NOQVBTSE9UUywgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RMb2FkaW5nVGFibGUoU3RyaW5nIHRhYmxlTmFtZSwgYm9vbGVhbiBpc0xlZ2FjeVRhYmxlKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBGaWxlIGRhdGFEaXIgPSBkYXRhRGlyKHRhYmxlTmFtZSwgaXNMZWdhY3lUYWJsZSk7CiAgICAgICAgIFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEgPSBTY2hlbWEuaW5zdGFuY2UuZ2V0VGFibGVNZXRhZGF0YShLRVlTUEFDRTEsIHRhYmxlTmFtZSk7CiAKICAgICAgICAgdHJ5IChDUUxTU1RhYmxlV3JpdGVyIHdyaXRlciA9IENRTFNTVGFibGVXcml0ZXIuYnVpbGRlcigpCkBAIC0yOTEsOSArMzI4LDExIEBACiAgICAgICAgIGFzc2VydEVxdWFscygxLCBwYXJ0aXRpb25zLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygia2V5IiwgQXNjaWlUeXBlLmluc3RhbmNlLmdldFN0cmluZyhwYXJ0aXRpb25zLmdldCgwKS5wYXJ0aXRpb25LZXkoKS5nZXRLZXkoKSkpOwogICAgICAgICBhc3NlcnQgbWV0YWRhdGEgIT0gbnVsbDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIxMDAiKSwgcGFydGl0aW9ucy5nZXQoMCkuZ2V0Um93KENsdXN0ZXJpbmcubWFrZShCeXRlQnVmZmVyVXRpbC5ieXRlcygiY29sMSIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDZWxsKG1ldGFkYXRhLmdldENvbHVtbihCeXRlQnVmZmVyVXRpbC5ieXRlcygidmFsIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlcigpKTsKKworICAgICAgICBSb3cgcm93ID0gcGFydGl0aW9ucy5nZXQoMCkuZ2V0Um93KENsdXN0ZXJpbmcubWFrZShCeXRlQnVmZmVyVXRpbC5ieXRlcygiY29sMSIpKSk7CisgICAgICAgIGFzc2VydCByb3cgIT0gbnVsbDsKKworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjEwMCIpLCByb3cuZ2V0Q2VsbChtZXRhZGF0YS5nZXRDb2x1bW4oQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoInZhbCIpKSkuYnVmZmVyKCkpOwogCiAgICAgICAgIC8vIFRoZSBzdHJlYW0gZnV0dXJlIGlzIHNpZ25hbGxlZCB3aGVuIHRoZSB3b3JrIGlzIGNvbXBsZXRlIGJ1dCBiZWZvcmUgcmVsZWFzaW5nIHJlZmVyZW5jZXMuIFdhaXQgZm9yIHJlbGVhc2UKICAgICAgICAgLy8gYmVmb3JlIGNsZWFudXAgKENBU1NBTkRSQS0xMDExOCkuCkBAIC0zMDIsNyArMzQxLDE0IEBACiAKICAgICBwcml2YXRlIEZpbGUgZGF0YURpcihTdHJpbmcgY2YpCiAgICAgewotICAgICAgICBGaWxlIGRhdGFEaXIgPSBuZXcgRmlsZSh0bXBkaXIuYWJzb2x1dGVQYXRoKCkgKyBGaWxlLnBhdGhTZXBhcmF0b3IoKSArIFNTVGFibGVMb2FkZXJUZXN0LktFWVNQQUNFMSArIEZpbGUucGF0aFNlcGFyYXRvcigpICsgY2YpOworICAgICAgICByZXR1cm4gZGF0YURpcihjZiwgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgRmlsZSBkYXRhRGlyKFN0cmluZyBjZiwgYm9vbGVhbiBpc0xlZ2FjeVRhYmxlKQorICAgIHsKKyAgICAgICAgLy8gQWRkIC17dGFibGVVdWlkfSBzdWZmaXggdG8gdGFibGUgZGlyIGlmIG5vdCBhIGxlZ2FjeSB0YWJsZQorICAgICAgICBGaWxlIGRhdGFEaXIgPSBuZXcgRmlsZSh0bXBkaXIuYWJzb2x1dGVQYXRoKCkgKyBGaWxlLnBhdGhTZXBhcmF0b3IoKSArIFNTVGFibGVMb2FkZXJUZXN0LktFWVNQQUNFMSArIEZpbGUucGF0aFNlcGFyYXRvcigpICsgY2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoaXNMZWdhY3lUYWJsZSA/ICIiIDogU3RyaW5nLmZvcm1hdCgiLSVzIixUYWJsZUlkLmdlbmVyYXRlKCkudG9IZXhTdHJpbmcoKSkpKTsKICAgICAgICAgYXNzZXJ0IGRhdGFEaXIudHJ5Q3JlYXRlRGlyZWN0b3JpZXMoKTsKICAgICAgICAgLy9tYWtlIHN1cmUgd2UgaGF2ZSBubyB0YWJsZXMuLi4KICAgICAgICAgYXNzZXJ0RXF1YWxzKE9iamVjdHMucmVxdWlyZU5vbk51bGwoZGF0YURpci50cnlMaXN0KCkpLmxlbmd0aCwgMCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlTWV0YWRhdGFUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlTWV0YWRhdGFUZXN0LmphdmEKaW5kZXggMmU1YTE3YS4uMjE1ZjAyZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZU1ldGFkYXRhVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVNZXRhZGF0YVRlc3QuamF2YQpAQCAtMTcsOCArMTcsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CkBAIC0yNiw3ICsyOCw2IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOwpAQCAtMzQsOSArMzUsMTEgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludGVnZXJUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIHB1YmxpYyBjbGFzcyBTU1RhYmxlTWV0YWRhdGFUZXN0CkBAIC0yMTYsMTEgKzIxOSwxMSBAQAogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKSkKICAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLnN0cmluZyhzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLm1pbkNsdXN0ZXJpbmdWYWx1ZXMuZ2V0KDApKSwgIjBjb2wxMDAiKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5zdHJpbmcoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5tYXhDbHVzdGVyaW5nVmFsdWVzLmdldCgwKSksICI3Y29sMTQ5Iik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlclV0aWwuc3RyaW5nKHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcuc3RhcnQoKS5idWZmZXJBdCgwKSksICIwY29sMTAwIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlclV0aWwuc3RyaW5nKHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcuZW5kKCkuYnVmZmVyQXQoMCkpLCAiN2NvbDE0OSIpOwogICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBjbHVzdGVyaW5nIHZhbHVlcyBhcmUgbWluaW1pc2VkCi0gICAgICAgICAgICBhc3NlcnRUcnVlKHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkubWluQ2x1c3RlcmluZ1ZhbHVlcy5nZXQoMCkuY2FwYWNpdHkoKSA8IDUwKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5tYXhDbHVzdGVyaW5nVmFsdWVzLmdldCgwKS5jYXBhY2l0eSgpIDwgNTApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLmNvdmVyZWRDbHVzdGVyaW5nLnN0YXJ0KCkuYnVmZmVyQXQoMCkuY2FwYWNpdHkoKSA8IDUwKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5jb3ZlcmVkQ2x1c3RlcmluZy5lbmQoKS5idWZmZXJBdCgwKS5jYXBhY2l0eSgpIDwgNTApOwogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBrZXkgPSAicm93MiI7CiAKQEAgLTIzOCw2MiArMjQxLDQyIEBACiAgICAgICAgIGFzc2VydEVxdWFscygxLCBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKS5zaXplKCkpOwogICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgc3N0YWJsZSA6IHN0b3JlLmdldExpdmVTU1RhYmxlcygpKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZUJ1ZmZlclV0aWwuc3RyaW5nKHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkubWluQ2x1c3RlcmluZ1ZhbHVlcy5nZXQoMCkpLCAiMGNvbDEwMCIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLnN0cmluZyhzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLm1heENsdXN0ZXJpbmdWYWx1ZXMuZ2V0KDApKSwgIjljb2wyOTgiKTsKLSAgICAgICAgICAgIC8vIGFuZCBtYWtlIHN1cmUgdGhlIGNsdXN0ZXJpbmcgdmFsdWVzIGFyZSBzdGlsbCBtaW5pbWlzZWQgYWZ0ZXIgY29tcGFjdGlvbgotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlLmdldFNTVGFibGVNZXRhZGF0YSgpLm1pbkNsdXN0ZXJpbmdWYWx1ZXMuZ2V0KDApLmNhcGFjaXR5KCkgPCA1MCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkubWF4Q2x1c3RlcmluZ1ZhbHVlcy5nZXQoMCkuY2FwYWNpdHkoKSA8IDUwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5zdHJpbmcoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5jb3ZlcmVkQ2x1c3RlcmluZy5zdGFydCgpLmJ1ZmZlckF0KDApKSwgIjBjb2wxMDAiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5zdHJpbmcoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5jb3ZlcmVkQ2x1c3RlcmluZy5lbmQoKS5idWZmZXJBdCgwKSksICI5Y29sMjk4Iik7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgc3RhdHMgZG9uJ3QgcmVmZXJlbmNlIG5hdGl2ZSBvciBvZmYtaGVhcCBkYXRhCisgICAgICAgICAgICBhc3NlcnRCdWZmZXJzQXJlUmV0YWluYWJsZShBcnJheXMuYXNMaXN0KHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcuc3RhcnQoKS5nZXRCdWZmZXJBcnJheSgpKSk7CisgICAgICAgICAgICBhc3NlcnRCdWZmZXJzQXJlUmV0YWluYWJsZShBcnJheXMuYXNMaXN0KHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcuZW5kKCkuZ2V0QnVmZmVyQXJyYXkoKSkpOworICAgICAgICB9CisKKyAgICAgICAga2V5ID0gInJvdzMiOworICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihzdG9yZS5tZXRhZGF0YSgpLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSwga2V5KQorICAgICAgICAgICAgLmFkZFJhbmdlVG9tYnN0b25lKCIwIiwgIjciKQorICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgICAgIC5hcHBseSgpOworCisgICAgICAgIHN0b3JlLmZvcmNlQmxvY2tpbmdGbHVzaChDb2x1bW5GYW1pbHlTdG9yZS5GbHVzaFJlYXNvbi5VTklUX1RFU1RTKTsKKyAgICAgICAgc3RvcmUuZm9yY2VNYWpvckNvbXBhY3Rpb24oKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN0b3JlLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisgICAgICAgIGZvciAoU1NUYWJsZVJlYWRlciBzc3RhYmxlIDogc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5zdHJpbmcoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5jb3ZlcmVkQ2x1c3RlcmluZy5zdGFydCgpLmJ1ZmZlckF0KDApKSwgIjAiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5zdHJpbmcoc3N0YWJsZS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5jb3ZlcmVkQ2x1c3RlcmluZy5lbmQoKS5idWZmZXJBdCgwKSksICI5Y29sMjk4Iik7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgc3RhdHMgZG9uJ3QgcmVmZXJlbmNlIG5hdGl2ZSBvciBvZmYtaGVhcCBkYXRhCisgICAgICAgICAgICBhc3NlcnRCdWZmZXJzQXJlUmV0YWluYWJsZShBcnJheXMuYXNMaXN0KHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcuc3RhcnQoKS5nZXRCdWZmZXJBcnJheSgpKSk7CisgICAgICAgICAgICBhc3NlcnRCdWZmZXJzQXJlUmV0YWluYWJsZShBcnJheXMuYXNMaXN0KHNzdGFibGUuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuY292ZXJlZENsdXN0ZXJpbmcuZW5kKCkuZ2V0QnVmZmVyQXJyYXkoKSkpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLypAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RMZWdhY3lDb3VudGVyU2hhcmRUcmFja2luZygpCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEJ1ZmZlcnNBcmVSZXRhaW5hYmxlKExpc3Q8Qnl0ZUJ1ZmZlcj4gYnVmZmVycykKICAgICB7Ci0gICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UxKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgiQ291bnRlcjEiKTsKKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGIgOiBidWZmZXJzKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShiLmlzRGlyZWN0KCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiLmhhc0FycmF5KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGIuY2FwYWNpdHkoKSwgYi5yZW1haW5pbmcoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYi5hcnJheU9mZnNldCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhiLmNhcGFjaXR5KCksIGIuYXJyYXkoKS5sZW5ndGgpOworICAgICAgICB9CisgICAgfQogCi0gICAgICAgIC8vIEEgY2VsbCB3aXRoIGFsbCBzaGFyZHMKLSAgICAgICAgQ291bnRlckNvbnRleHQuQ29udGV4dFN0YXRlIHN0YXRlID0gQ291bnRlckNvbnRleHQuQ29udGV4dFN0YXRlLmFsbG9jYXRlKDEsIDEsIDEpOwotICAgICAgICBzdGF0ZS53cml0ZUdsb2JhbChDb3VudGVySWQuZnJvbUludCgxKSwgMUwsIDFMKTsKLSAgICAgICAgc3RhdGUud3JpdGVMb2NhbChDb3VudGVySWQuZnJvbUludCgyKSwgMUwsIDFMKTsKLSAgICAgICAgc3RhdGUud3JpdGVSZW1vdGUoQ291bnRlcklkLmZyb21JbnQoMyksIDFMLCAxTCk7Ci0KLSAgICAgICAgQ29sdW1uRmFtaWx5IGNlbGxzID0gQXJyYXlCYWNrZWRTb3J0ZWRDb2x1bW5zLmZhY3RvcnkuY3JlYXRlKGNmcy5tZXRhZGF0YSk7Ci0gICAgICAgIGNlbGxzLmFkZENvbHVtbihuZXcgQnVmZmVyQ291bnRlckNlbGwoY2VsbG5hbWUoImNvbCIpLCBzdGF0ZS5jb250ZXh0LCAxTCwgTG9uZy5NSU5fVkFMVUUpKTsKLSAgICAgICAgbmV3IE11dGF0aW9uKFV0aWwuZGsoImsiKS5nZXRLZXkoKSwgY2VsbHMpLmFwcGx5VW5zYWZlKCk7Ci0gICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuaGFzTGVnYWN5Q291bnRlclNoYXJkcyk7Ci0gICAgICAgIGNmcy50cnVuY2F0ZUJsb2NraW5nKCk7Ci0KLSAgICAgICAgLy8gQSBjZWxsIHdpdGggZ2xvYmFsIGFuZCByZW1vdGUgc2hhcmRzCi0gICAgICAgIHN0YXRlID0gQ291bnRlckNvbnRleHQuQ29udGV4dFN0YXRlLmFsbG9jYXRlKDAsIDEsIDEpOwotICAgICAgICBzdGF0ZS53cml0ZUxvY2FsKENvdW50ZXJJZC5mcm9tSW50KDIpLCAxTCwgMUwpOwotICAgICAgICBzdGF0ZS53cml0ZVJlbW90ZShDb3VudGVySWQuZnJvbUludCgzKSwgMUwsIDFMKTsKLSAgICAgICAgY2VsbHMgPSBBcnJheUJhY2tlZFNvcnRlZENvbHVtbnMuZmFjdG9yeS5jcmVhdGUoY2ZzLm1ldGFkYXRhKTsKLSAgICAgICAgY2VsbHMuYWRkQ29sdW1uKG5ldyBCdWZmZXJDb3VudGVyQ2VsbChjZWxsbmFtZSgiY29sIiksIHN0YXRlLmNvbnRleHQsIDFMLCBMb25nLk1JTl9WQUxVRSkpOwotICAgICAgICBuZXcgTXV0YXRpb24oVXRpbC5kaygiayIpLmdldEtleSgpLCBjZWxscykuYXBwbHlVbnNhZmUoKTsKLSAgICAgICAgVXRpbC5mbHVzaChjZnMpOwotICAgICAgICBhc3NlcnRUcnVlKGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5oYXNMZWdhY3lDb3VudGVyU2hhcmRzKTsKLSAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKLQotICAgICAgICAvLyBBIGNlbGwgd2l0aCBnbG9iYWwgYW5kIGxvY2FsIHNoYXJkcwotICAgICAgICBzdGF0ZSA9IENvdW50ZXJDb250ZXh0LkNvbnRleHRTdGF0ZS5hbGxvY2F0ZSgxLCAxLCAwKTsKLSAgICAgICAgc3RhdGUud3JpdGVHbG9iYWwoQ291bnRlcklkLmZyb21JbnQoMSksIDFMLCAxTCk7Ci0gICAgICAgIHN0YXRlLndyaXRlTG9jYWwoQ291bnRlcklkLmZyb21JbnQoMiksIDFMLCAxTCk7Ci0gICAgICAgIGNlbGxzID0gQXJyYXlCYWNrZWRTb3J0ZWRDb2x1bW5zLmZhY3RvcnkuY3JlYXRlKGNmcy5tZXRhZGF0YSk7Ci0gICAgICAgIGNlbGxzLmFkZENvbHVtbihuZXcgQnVmZmVyQ291bnRlckNlbGwoY2VsbG5hbWUoImNvbCIpLCBzdGF0ZS5jb250ZXh0LCAxTCwgTG9uZy5NSU5fVkFMVUUpKTsKLSAgICAgICAgbmV3IE11dGF0aW9uKFV0aWwuZGsoImsiKS5nZXRLZXkoKSwgY2VsbHMpLmFwcGx5VW5zYWZlKCk7Ci0gICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U1NUYWJsZU1ldGFkYXRhKCkuaGFzTGVnYWN5Q291bnRlclNoYXJkcyk7Ci0gICAgICAgIGNmcy50cnVuY2F0ZUJsb2NraW5nKCk7Ci0KLSAgICAgICAgLy8gQSBjZWxsIHdpdGggZ2xvYmFsIG9ubHkKLSAgICAgICAgc3RhdGUgPSBDb3VudGVyQ29udGV4dC5Db250ZXh0U3RhdGUuYWxsb2NhdGUoMSwgMCwgMCk7Ci0gICAgICAgIHN0YXRlLndyaXRlR2xvYmFsKENvdW50ZXJJZC5mcm9tSW50KDEpLCAxTCwgMUwpOwotICAgICAgICBjZWxscyA9IEFycmF5QmFja2VkU29ydGVkQ29sdW1ucy5mYWN0b3J5LmNyZWF0ZShjZnMubWV0YWRhdGEpOwotICAgICAgICBjZWxscy5hZGRDb2x1bW4obmV3IEJ1ZmZlckNvdW50ZXJDZWxsKGNlbGxuYW1lKCJjb2wiKSwgc3RhdGUuY29udGV4dCwgMUwsIExvbmcuTUlOX1ZBTFVFKSk7Ci0gICAgICAgIG5ldyBNdXRhdGlvbihVdGlsLmRrKCJrIikuZ2V0S2V5KCksIGNlbGxzKS5hcHBseVVuc2FmZSgpOwotICAgICAgICBVdGlsLmZsdXNoKGNmcyk7Ci0gICAgICAgIGFzc2VydEZhbHNlKGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTU1RhYmxlTWV0YWRhdGEoKS5oYXNMZWdhY3lDb3VudGVyU2hhcmRzKTsKLSAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKLSAgICB9ICovCi19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVJlYWRlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVSZWFkZXJUZXN0LmphdmEKaW5kZXggZjA2NGYxOS4uNWE4MmJjMyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVJlYWRlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlUmVhZGVyVGVzdC5qYXZhCkBAIC0yMCwyMiArMjAsMzggQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5PcGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVhZENvbW1hbmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVhZEV4ZWN1dGlvbkNvbnRyb2xsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TeXN0ZW1LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CkBAIC00OSwyMSArNjUsMzUgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW5kZXguSW5kZXg7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNSZWFkRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5JbmRleFN1bW1hcnlDb21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLkJ0aUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlTdXBwb3J0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUua2V5Y2FjaGUuS2V5Q2FjaGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5rZXljYWNoZS5LZXlDYWNoZVN1cHBvcnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZURhdGFJbnB1dDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLk1tYXBwZWRSZWdpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUGFnZUF3YXJlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5DYWNoaW5nUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DYWNoZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRmlsdGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOwogCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZVRydWU7CiAKIHB1YmxpYyBjbGFzcyBTU1RhYmxlUmVhZGVyVGVzdAogewpAQCAtODEsNyArMTExLDcgQEAKIAogICAgIFRva2VuIHQoaW50IGkpCiAgICAgewotICAgICAgICByZXR1cm4gcGFydGl0aW9uZXIuZ2V0VG9rZW4oQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoU3RyaW5nLnZhbHVlT2YoaSkpKTsKKyAgICAgICAgcmV0dXJuIHBhcnRpdGlvbmVyLmdldFRva2VuKGtleUZvcihpKSk7CiAgICAgfQogCiAgICAgQEJlZm9yZUNsYXNzCkBAIC0xNTIsNyArMTgyLDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0U3Bhbm5lZEluZGV4UG9zaXRpb25zKCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBpbnQgb3JpZ2luYWxNYXhTZWdtZW50U2l6ZSA9IE1tYXBwZWRSZWdpb25zLk1BWF9TRUdNRU5UX1NJWkU7Ci0gICAgICAgIE1tYXBwZWRSZWdpb25zLk1BWF9TRUdNRU5UX1NJWkUgPSA0MDsgLy8gZWFjaCBpbmRleCBlbnRyeSBpcyB+MTEgYnl0ZXMsIHNvIHRoaXMgd2lsbCBnZW5lcmF0ZSBsb3RzIG9mIHNlZ21lbnRzCisgICAgICAgIE1tYXBwZWRSZWdpb25zLk1BWF9TRUdNRU5UX1NJWkUgPSBQYWdlQXdhcmUuUEFHRV9TSVpFOwogCiAgICAgICAgIHRyeQogICAgICAgICB7CkBAIC0xNjAsNyArMTkwLDcgQEAKICAgICAgICAgICAgIHBhcnRpdGlvbmVyID0gc3RvcmUuZ2V0UGFydGl0aW9uZXIoKTsKIAogICAgICAgICAgICAgLy8gaW5zZXJ0IGEgYnVuY2ggb2YgZGF0YSBhbmQgY29tcGFjdCB0byBhIHNpbmdsZSBzc3RhYmxlCi0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwMDsgaiArPSAyKQorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDAwMDsgaiArPSAyKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIG5ldyBSb3dVcGRhdGVCdWlsZGVyKHN0b3JlLm1ldGFkYXRhKCksIGosIFN0cmluZy52YWx1ZU9mKGopKQogICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCIwIikKQEAgLTE3MywxOSArMjAzLDE5IEBACiAKICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgYWxsIG91ciBrZXlzIGFyZSBmb3VuZCBjb3JyZWN0bHkKICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IHN0b3JlLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDA7IGogKz0gMikKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTAwMDA7IGogKz0gMikKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZGsgPSBVdGlsLmRrKFN0cmluZy52YWx1ZU9mKGopKTsKLSAgICAgICAgICAgICAgICBGaWxlRGF0YUlucHV0IGZpbGUgPSBzc3RhYmxlLmdldEZpbGVEYXRhSW5wdXQoc3N0YWJsZS5nZXRQb3NpdGlvbihkaywgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSkucG9zaXRpb24pOworICAgICAgICAgICAgICAgIEZpbGVEYXRhSW5wdXQgZmlsZSA9IHNzdGFibGUuZ2V0RmlsZURhdGFJbnB1dChzc3RhYmxlLmdldFBvc2l0aW9uKGRrLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKSk7CiAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleUluRGlzayA9IHNzdGFibGUuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwucmVhZFdpdGhTaG9ydExlbmd0aChmaWxlKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0IGtleUluRGlzay5lcXVhbHMoZGspIDogU3RyaW5nLmZvcm1hdCgiJXMgIT0gJXMgaW4gJXMiLCBrZXlJbkRpc2ssIGRrLCBmaWxlLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGtleUluRGlzay5lcXVhbHMoZGspIDogZm9ybWF0KCIlcyAhPSAlcyBpbiAlcyIsIGtleUluRGlzaywgZGssIGZpbGUuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gY2hlY2sgbm8gZmFsc2UgcG9zaXRpdmVzCi0gICAgICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8IDExMDsgaiArPSAyKQorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPCAxMTAwMDsgaiArPSAyKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBkayA9IFV0aWwuZGsoU3RyaW5nLnZhbHVlT2YoaikpOwotICAgICAgICAgICAgICAgIGFzc2VydCBzc3RhYmxlLmdldFBvc2l0aW9uKGRrLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKSA9PSBudWxsOworICAgICAgICAgICAgICAgIGFzc2VydCBzc3RhYmxlLmdldFBvc2l0aW9uKGRrLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKSA8IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQpAQCAtMjM4LDE1ICsyNjgsNDEgQEAKIAogICAgICAgICBVdGlsLmZsdXNoKHN0b3JlKTsKIAotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNzdGFibGUuZ2V0UmVhZE1ldGVyKCkuY291bnQoKSk7CisgICAgICAgIGJvb2xlYW4gc3RhcnRTdGF0ZSA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU3RhYmxlUmVhZFJhdGVQZXJzaXN0ZW5jZUVuYWJsZWQoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRTU3RhYmxlUmVhZFJhdGVQZXJzaXN0ZW5jZUVuYWJsZWQodHJ1ZSk7CiAKLSAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IHNzdGFibGUuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjQiKSk7Ci0gICAgICAgIFV0aWwuZ2V0QWxsKFV0aWwuY21kKHN0b3JlLCBrZXkpLmJ1aWxkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKS5jb3VudCgpKTsKKyAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IHN0b3JlLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNzdGFibGUuZ2V0UmVhZE1ldGVyKCkuY291bnQoKSk7CiAKLSAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoc3RvcmUsIGtleSkuaW5jbHVkZVJvdygiMCIpLmJ1aWxkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKS5jb3VudCgpKTsKKyAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBzc3RhYmxlLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCI0IikpOworICAgICAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoc3RvcmUsIGtleSkuYnVpbGQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKS5jb3VudCgpKTsKKworICAgICAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoc3RvcmUsIGtleSkuaW5jbHVkZVJvdygiMCIpLmJ1aWxkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNzdGFibGUuZ2V0UmVhZE1ldGVyKCkuY291bnQoKSk7CisKKyAgICAgICAgICAgIC8vIFdpdGggcGVyc2lzdGVuY2UgZW5hYmxlZCwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gcmV0cmlldmUgdGhlIHN0YXRlIG9mIHRoZSBtZXRlci4KKyAgICAgICAgICAgIHNzdGFibGUubWF5YmVQZXJzaXN0U1NUYWJsZVJlYWRNZXRlcigpOworCisgICAgICAgICAgICBVbnR5cGVkUmVzdWx0U2V0IG1ldGVyID0gU3lzdGVtS2V5c3BhY2UucmVhZFNTVGFibGVBY3Rpdml0eShzdG9yZS5rZXlzcGFjZS5nZXROYW1lKCksIHN0b3JlLm5hbWUsIHNzdGFibGUuZGVzY3JpcHRvci5pZCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShtZXRlci5pc0VtcHR5KCkpOworCisgICAgICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChzdG9yZSwga2V5KS5pbmNsdWRlUm93KCIwIikuYnVpbGQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgc3N0YWJsZS5nZXRSZWFkTWV0ZXIoKS5jb3VudCgpKTsKKworICAgICAgICAgICAgLy8gQWZ0ZXIgY2xlYW5pbmcgZXhpc3Rpbmcgc3RhdGUgYW5kIGRpc2FibGluZyBwZXJzaXN0ZW5jZSwgdGhlcmUgc2hvdWxkIGJlIG5vIG1ldGVyIHN0YXRlIHRvIHJlYWQuCisgICAgICAgICAgICBTeXN0ZW1LZXlzcGFjZS5jbGVhclNTVGFibGVSZWFkTWV0ZXIoc3RvcmUua2V5c3BhY2UuZ2V0TmFtZSgpLCBzdG9yZS5uYW1lLCBzc3RhYmxlLmRlc2NyaXB0b3IuaWQpOworICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFNTdGFibGVSZWFkUmF0ZVBlcnNpc3RlbmNlRW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICBzc3RhYmxlLm1heWJlUGVyc2lzdFNTVGFibGVSZWFkTWV0ZXIoKTsKKyAgICAgICAgICAgIG1ldGVyID0gU3lzdGVtS2V5c3BhY2UucmVhZFNTVGFibGVBY3Rpdml0eShzdG9yZS5rZXlzcGFjZS5nZXROYW1lKCksIHN0b3JlLm5hbWUsIHNzdGFibGUuZGVzY3JpcHRvci5pZCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1ldGVyLmlzRW1wdHkoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0U1N0YWJsZVJlYWRSYXRlUGVyc2lzdGVuY2VFbmFibGVkKHN0YXJ0U3RhdGUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI3MSwxMCArMzI3LDEwIEBACiAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnBlcmZvcm1NYXhpbWFsKHN0b3JlLCBmYWxzZSk7CiAKICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIGxvbmcgcDIgPSBzc3RhYmxlLmdldFBvc2l0aW9uKGsoMiksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpLnBvc2l0aW9uOwotICAgICAgICBsb25nIHAzID0gc3N0YWJsZS5nZXRQb3NpdGlvbihrKDMpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKS5wb3NpdGlvbjsKLSAgICAgICAgbG9uZyBwNiA9IHNzdGFibGUuZ2V0UG9zaXRpb24oayg2KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSkucG9zaXRpb247Ci0gICAgICAgIGxvbmcgcDcgPSBzc3RhYmxlLmdldFBvc2l0aW9uKGsoNyksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpLnBvc2l0aW9uOworICAgICAgICBsb25nIHAyID0gc3N0YWJsZS5nZXRQb3NpdGlvbihkaygyKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGxvbmcgcDMgPSBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDMpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKKyAgICAgICAgbG9uZyBwNiA9IHNzdGFibGUuZ2V0UG9zaXRpb24oZGsoNiksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOworICAgICAgICBsb25nIHA3ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihkayg3KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CiAKICAgICAgICAgU1NUYWJsZVJlYWRlci5QYXJ0aXRpb25Qb3NpdGlvbkJvdW5kcyBwID0gc3N0YWJsZS5nZXRQb3NpdGlvbnNGb3JSYW5nZXMobWFrZVJhbmdlcyh0KDIpLCB0KDYpKSkuZ2V0KDApOwogCkBAIC0zMDcsNiArMzYzLDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQb3NpdGlvbnNLZXlDYWNoZVN0YXRzKCkKICAgICB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKEtleUNhY2hlU3VwcG9ydC5pc1N1cHBvcnRlZEJ5KERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSkpOwogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBzdG9yZSA9IGRpc2NhcmRTU1RhYmxlcyhLRVlTUEFDRTEsIENGX1NUQU5EQVJEMik7CiAgICAgICAgIHBhcnRpdGlvbmVyID0gc3RvcmUuZ2V0UGFydGl0aW9uZXIoKTsKICAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLnNldENhcGFjaXR5KDEwMDApOwpAQCAtMzI0LDc0ICszODEsMjA4IEBACiAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnBlcmZvcm1NYXhpbWFsKHN0b3JlLCBmYWxzZSk7CiAKICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIEtleUNhY2hlIGtleUNhY2hlID0gKChLZXlDYWNoZVN1cHBvcnQ8Pz4pIHNzdGFibGUpLmdldEtleUNhY2hlKCk7CisgICAgICAgIGFzc3VtZVRydWUoa2V5Q2FjaGUuaXNFbmFibGVkKCkpOwogICAgICAgICAvLyBleGlzdGluZywgbm9uLWNhY2hlZCBrZXkKLSAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihrKDIpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzdGFibGUuZ2V0S2V5Q2FjaGVSZXF1ZXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3N0YWJsZS5nZXRLZXlDYWNoZUhpdCgpKTsKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihkaygyKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBrZXlDYWNoZS5nZXRSZXF1ZXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGtleUNhY2hlLmdldEhpdHMoKSk7CiAgICAgICAgIC8vIGV4aXN0aW5nLCBjYWNoZWQga2V5Ci0gICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oaygyKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBzc3RhYmxlLmdldEtleUNhY2hlUmVxdWVzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzdGFibGUuZ2V0S2V5Q2FjaGVIaXQoKSk7CisgICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oZGsoMiksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwga2V5Q2FjaGUuZ2V0UmVxdWVzdHMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBrZXlDYWNoZS5nZXRIaXRzKCkpOwogICAgICAgICAvLyBub24tZXhpc3Rpbmcga2V5IChpdCBpcyBzcGVjaWZpY2FsbHkgY2hvc2VuIHRvIG5vdCBiZSByZWplY3RlZCBieSBCbG9vbSBGaWx0ZXIgY2hlY2spCi0gICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oaygxNCksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgc3N0YWJsZS5nZXRLZXlDYWNoZVJlcXVlc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlLmdldEtleUNhY2hlSGl0KCkpOworICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDE0KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBrZXlDYWNoZS5nZXRSZXF1ZXN0cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGtleUNhY2hlLmdldEhpdHMoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UG9zaXRpb25zQmxvb21GaWx0ZXJTdGF0cygpCiAgICAgeworICAgICAgICBTU1RhYmxlUmVhZGVyV2l0aEZpbHRlciBzc3RhYmxlID0gcHJlcGFyZUdldFBvc2l0aW9ucygpOworCisgICAgICAgIC8vIHRoZSBrZXlzIGFyZSBzcGVjaWZpY2FsbHkgY2hvc2VuIHRvIGNvdmVyIGNlcnRhaW4gdXNlIGNhc2VzCisgICAgICAgIC8vIGV4aXN0aW5nIGtleSBpcyByZWFkIGZyb20gaW5kZXgKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihkayg3KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRUcnVlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVOZWdhdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCkpOworCisgICAgICAgIC8vIGV4aXN0aW5nIGtleSBpcyByZWFkIGZyb20gQ2FjaGUgS2V5IChpZiB1c2VkKQorICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDcpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0VHJ1ZU5lZ2F0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKSk7CisKKyAgICAgICAgLy8gbm9uLWV4aXN0aW5nIGtleSBpcyByZWplY3RlZCBieSBCbG9vbSBGaWx0ZXIgY2hlY2sKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihkayg0NSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOyAgICAvLyBub3RlOiA0NSBmYWxscyBiZXR3ZWVuIDQgYW5kIDUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0VHJ1ZU5lZ2F0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKSk7CisKKyAgICAgICAgLy8gR1Qgc2hvdWxkIG5vdCBhZmZlY3QgYmxvb20gZmlsdGVyIGNvdW50cworICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDU2KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5HRSk7ICAgIC8vIG5vdGU6IDU2IGZhbGxzIGJldHdlZW4gNSBhbmQgNgorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0VHJ1ZVBvc2l0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRUcnVlTmVnYXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldEZhbHNlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihkayg1NyksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuR1QpOyAgICAvLyBub3RlOiA1NyBmYWxscyBiZXR3ZWVuIDUgYW5kIDYKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0VHJ1ZU5lZ2F0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKSk7CisKKyAgICAgICAgLy8gbm9uLWV4aXN0aW5nIGtleSBpcyByZWplY3RlZCBieSBzc3RhYmxlIGtleXMgcmFuZ2UgY2hlY2ssIGlmIHBlcmZvcm1lZCwgb3RoZXJ3aXNlIGl0J3MgYSBmYWxzZSBwb3NpdGl2ZQorICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGNvbGxpc2lvbkZvcig5KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRUcnVlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVOZWdhdGl2ZUNvdW50KCkpOworICAgICAgICBsb25nIGZwQ291bnQgPSBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKTsKKworICAgICAgICAvLyBleGlzdGluZyBrZXkgZmlsdGVyZWQgb3V0IGJ5IHNzdGFibGUga2V5cyByYW5nZSBjaGVjaywgcGVyZm9ybWVkIGJlY2F1c2Ugb2YgbW92ZWQgc3RhcnQKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihkaygxKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRUcnVlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVOZWdhdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZnBDb3VudCwgc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBmcENvdW50ID0gc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCk7CisKKyAgICAgICAgLy8gbm9uLWV4aXN0aW5nIGtleSBpcyByZWplY3RlZCBieSBpbmRleCBpbnRlcnZhbCBjaGVjaworICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGNvbGxpc2lvbkZvcig1KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRUcnVlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldFRydWVOZWdhdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZnBDb3VudCArIDEsIHNzdGFibGUuZ2V0RmlsdGVyVHJhY2tlcigpLmdldEZhbHNlUG9zaXRpdmVDb3VudCgpKTsKKworICAgICAgICAvLyBub24tZXhpc3Rpbmcga2V5IGlzIHJlamVjdGVkIGJ5IGluZGV4IGxvb2t1cCBjaGVjaworICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDgwNyksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3N0YWJsZS5nZXRGaWx0ZXJUcmFja2VyKCkuZ2V0VHJ1ZVBvc2l0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRUcnVlTmVnYXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZwQ291bnQgKyAyLCBzc3RhYmxlLmdldEZpbHRlclRyYWNrZXIoKS5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQb3NpdGlvbnNMaXN0ZW5lckNhbGxzKCkKKyAgICB7CisgICAgICAgIFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyIHNzdGFibGUgPSBwcmVwYXJlR2V0UG9zaXRpb25zKCk7CisKKyAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIgbGlzdGVuZXIgPSBNb2NraXRvLm1vY2soU1NUYWJsZVJlYWRzTGlzdGVuZXIuY2xhc3MpOworICAgICAgICAvLyB0aGUga2V5cyBhcmUgc3BlY2lmaWNhbGx5IGNob3NlbiB0byBjb3ZlciBjZXJ0YWluIHVzZSBjYXNlcworICAgICAgICAvLyBleGlzdGluZyBrZXkgaXMgcmVhZCBmcm9tIGluZGV4CisgICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oZGsoNyksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEsIGxpc3RlbmVyKTsKKyAgICAgICAgTW9ja2l0by52ZXJpZnkobGlzdGVuZXIpLm9uU1NUYWJsZVNlbGVjdGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNlbGVjdGlvblJlYXNvbi5JTkRFWF9FTlRSWV9GT1VORCk7CisgICAgICAgIE1vY2tpdG8ucmVzZXQobGlzdGVuZXIpOworCisgICAgICAgIC8vIGV4aXN0aW5nIGtleSBpcyByZWFkIGZyb20gQ2FjaGUgS2V5IChpZiB1c2VkKQorICAgICAgICAvLyBOb3RlOiBrZXkgY2FjaGUgbWF5IGZhaWwgdG8gY2FjaGUgdGhlIHBhcnRpdGlvbiBpZiBpdCBpcyB3aWRlLgorICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDcpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRLCBsaXN0ZW5lcik7CisgICAgICAgIGlmIChzc3RhYmxlIGluc3RhbmNlb2YgQmlnVGFibGVSZWFkZXIpCisgICAgICAgICAgICBNb2NraXRvLnZlcmlmeShsaXN0ZW5lcikub25TU1RhYmxlU2VsZWN0ZWQoc3N0YWJsZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2VsZWN0aW9uUmVhc29uLktFWV9DQUNIRV9ISVQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBNb2NraXRvLnZlcmlmeShsaXN0ZW5lcikub25TU1RhYmxlU2VsZWN0ZWQoc3N0YWJsZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2VsZWN0aW9uUmVhc29uLklOREVYX0VOVFJZX0ZPVU5EKTsKKyAgICAgICAgTW9ja2l0by5yZXNldChsaXN0ZW5lcik7CisKKyAgICAgICAgLy8gQXMgYWJvdmUgd2l0aCBvdGhlciBvcHMKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihkayg3KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5HVCwgbGlzdGVuZXIpOyAgICAvLyBHVCBkb2VzIG5vdCBlbmdhZ2Uga2V5IGNhY2hlCisgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTZWxlY3RlZChzc3RhYmxlLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5TZWxlY3Rpb25SZWFzb24uSU5ERVhfRU5UUllfRk9VTkQpOworICAgICAgICBNb2NraXRvLnJlc2V0KGxpc3RlbmVyKTsKKworICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDcpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkdFLCBsaXN0ZW5lcik7ICAgIC8vIEdFIGRvZXMKKyAgICAgICAgaWYgKHNzdGFibGUgaW5zdGFuY2VvZiBCaWdUYWJsZVJlYWRlcikKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTZWxlY3RlZChzc3RhYmxlLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5TZWxlY3Rpb25SZWFzb24uS0VZX0NBQ0hFX0hJVCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTZWxlY3RlZChzc3RhYmxlLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5TZWxlY3Rpb25SZWFzb24uSU5ERVhfRU5UUllfRk9VTkQpOworICAgICAgICBNb2NraXRvLnJlc2V0KGxpc3RlbmVyKTsKKworICAgICAgICAvLyBub24tZXhpc3Rpbmcga2V5IGlzIHJlamVjdGVkIGJ5IEJsb29tIEZpbHRlciBjaGVjaworICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDQ1KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSwgbGlzdGVuZXIpOyAgICAvLyBub3RlOiA0NSBmYWxscyBiZXR3ZWVuIDQgYW5kIDUKKyAgICAgICAgTW9ja2l0by52ZXJpZnkobGlzdGVuZXIpLm9uU1NUYWJsZVNraXBwZWQoc3N0YWJsZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2tpcHBpbmdSZWFzb24uQkxPT01fRklMVEVSKTsKKyAgICAgICAgTW9ja2l0by5yZXNldChsaXN0ZW5lcik7CisKKyAgICAgICAgLy8gbm9uLWV4aXN0aW5nIGtleSBpcyByZWplY3RlZCBieSBzc3RhYmxlIGtleXMgcmFuZ2UgY2hlY2ssIGlmIHBlcmZvcm1lZCwgb3RoZXJ3aXNlIGl0J3MgYSBmYWxzZSBwb3NpdGl2ZQorICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGNvbGxpc2lvbkZvcig5KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSwgbGlzdGVuZXIpOworICAgICAgICBpZiAoc3N0YWJsZSBpbnN0YW5jZW9mIEJpZ1RhYmxlUmVhZGVyKQorICAgICAgICAgICAgTW9ja2l0by52ZXJpZnkobGlzdGVuZXIpLm9uU1NUYWJsZVNraXBwZWQoc3N0YWJsZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2tpcHBpbmdSZWFzb24uTUlOX01BWF9LRVlTKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgTW9ja2l0by52ZXJpZnkobGlzdGVuZXIpLm9uU1NUYWJsZVNraXBwZWQoc3N0YWJsZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2tpcHBpbmdSZWFzb24uSU5ERVhfRU5UUllfTk9UX0ZPVU5EKTsKKyAgICAgICAgTW9ja2l0by5yZXNldChsaXN0ZW5lcik7CisKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihjb2xsaXNpb25Gb3IoOSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuR0UsIGxpc3RlbmVyKTsKKyAgICAgICAgaWYgKHNzdGFibGUgaW5zdGFuY2VvZiBCaWdUYWJsZVJlYWRlcikKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTa2lwcGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uLk1JTl9NQVhfS0VZUyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTa2lwcGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uLklOREVYX0VOVFJZX05PVF9GT1VORCk7CisgICAgICAgIE1vY2tpdG8ucmVzZXQobGlzdGVuZXIpOworCisgICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oZGsoOSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuR1QsIGxpc3RlbmVyKTsKKyAgICAgICAgaWYgKHNzdGFibGUgaW5zdGFuY2VvZiBCaWdUYWJsZVJlYWRlcikKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTa2lwcGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uLk1JTl9NQVhfS0VZUyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTa2lwcGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uLklOREVYX0VOVFJZX05PVF9GT1VORCk7CisgICAgICAgIE1vY2tpdG8ucmVzZXQobGlzdGVuZXIpOworCisgICAgICAgIC8vIGV4aXN0aW5nIGtleSBmaWx0ZXJlZCBvdXQgYnkgc3N0YWJsZSBrZXlzIHJhbmdlIGNoZWNrLCBwZXJmb3JtZWQgYmVjYXVzZSBvZiBtb3ZlZCBzdGFydAorICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDEpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRLCBsaXN0ZW5lcik7CisgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTa2lwcGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uLk1JTl9NQVhfS0VZUyk7CisgICAgICAgIE1vY2tpdG8ucmVzZXQobGlzdGVuZXIpOworICAgICAgICBsb25nIHBvcyA9IHNzdGFibGUuZ2V0UG9zaXRpb24oZGsoMSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuR1QsIGxpc3RlbmVyKTsKKyAgICAgICAgTW9ja2l0by52ZXJpZnkobGlzdGVuZXIpLm9uU1NUYWJsZVNlbGVjdGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNlbGVjdGlvblJlYXNvbi5JTkRFWF9FTlRSWV9GT1VORCk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlLmdldFBvc2l0aW9uKGRrKDMpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKSwgcG9zKTsKKyAgICAgICAgTW9ja2l0by5yZXNldChsaXN0ZW5lcik7CisKKyAgICAgICAgLy8gbm9uLWV4aXN0aW5nIGtleSBpcyByZWplY3RlZCBieSBpbmRleCBpbnRlcnZhbCBjaGVjaworICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGNvbGxpc2lvbkZvcig1KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSwgbGlzdGVuZXIpOworICAgICAgICBpZiAoc3N0YWJsZSBpbnN0YW5jZW9mIEJpZ1RhYmxlUmVhZGVyKQorICAgICAgICAgICAgTW9ja2l0by52ZXJpZnkobGlzdGVuZXIpLm9uU1NUYWJsZVNraXBwZWQoc3N0YWJsZSwgU1NUYWJsZVJlYWRzTGlzdGVuZXIuU2tpcHBpbmdSZWFzb24uUEFSVElUSU9OX0lOREVYX0xPT0tVUCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTa2lwcGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNraXBwaW5nUmVhc29uLklOREVYX0VOVFJZX05PVF9GT1VORCk7CisgICAgICAgIE1vY2tpdG8ucmVzZXQobGlzdGVuZXIpOworCisgICAgICAgIC8vIG5vbi1leGlzdGluZyBrZXkgaXMgcmVqZWN0ZWQgYnkgaW5kZXggbG9va3VwCisgICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oZGsoODA3KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSwgbGlzdGVuZXIpOworICAgICAgICBNb2NraXRvLnZlcmlmeShsaXN0ZW5lcikub25TU1RhYmxlU2tpcHBlZChzc3RhYmxlLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5Ta2lwcGluZ1JlYXNvbi5QQVJUSVRJT05fSU5ERVhfTE9PS1VQKTsKKyAgICAgICAgTW9ja2l0by5yZXNldChsaXN0ZW5lcik7CisKKyAgICAgICAgLy8gVmFyaWF0aW9ucyBvZiBub24tZXF1YWwgbWF0Y2gKKyAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihkaygzMSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuR0UsIGxpc3RlbmVyKTsKKyAgICAgICAgTW9ja2l0by52ZXJpZnkobGlzdGVuZXIpLm9uU1NUYWJsZVNlbGVjdGVkKHNzdGFibGUsIFNTVGFibGVSZWFkc0xpc3RlbmVyLlNlbGVjdGlvblJlYXNvbi5JTkRFWF9FTlRSWV9GT1VORCk7CisgICAgICAgIE1vY2tpdG8ucmVzZXQobGlzdGVuZXIpOworCisgICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oZGsoODEpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkdFLCBsaXN0ZW5lcik7CisgICAgICAgIE1vY2tpdG8udmVyaWZ5KGxpc3RlbmVyKS5vblNTVGFibGVTZWxlY3RlZChzc3RhYmxlLCBTU1RhYmxlUmVhZHNMaXN0ZW5lci5TZWxlY3Rpb25SZWFzb24uSU5ERVhfRU5UUllfRk9VTkQpOworICAgICAgICBNb2NraXRvLnJlc2V0KGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNTVGFibGVSZWFkZXJXaXRoRmlsdGVyIHByZXBhcmVHZXRQb3NpdGlvbnMoKQorICAgIHsKICAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSk7CiAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0ZfU1RBTkRBUkRfU01BTExfQkxPT01fRklMVEVSKTsKKyAgICAgICAgc3RvcmUudHJ1bmNhdGVCbG9ja2luZygpOwogICAgICAgICBwYXJ0aXRpb25lciA9IHN0b3JlLmdldFBhcnRpdGlvbmVyKCk7CiAgICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5zZXRDYXBhY2l0eSgxMDAwKTsKIAogICAgICAgICAvLyBpbnNlcnQgZGF0YSBhbmQgY29tcGFjdCB0byBhIHNpbmdsZSBzc3RhYmxlCiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTA7IGorKykKICAgICAgICAgewotICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoc3RvcmUubWV0YWRhdGEoKSwgaiwgU3RyaW5nLnZhbHVlT2YoaikpCi0gICAgICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCIwIikKLSAgICAgICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOworICAgICAgICAgICAgaWYgKGogPT0gOCkgLy8gbGVhdmUgYSBtaXNzaW5nIHByZWZpeAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpbnQgcm93Q291bnQgPSBqIDwgNSA/IDIwMDAgOiAxOyAgICAvLyBtYWtlIHNvbWUgb2YgdGhlIHBhcnRpdGlvbnMgd2lkZQorICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCByb3dDb3VudDsgKytyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5ldyBSb3dVcGRhdGVCdWlsZGVyKHN0b3JlLm1ldGFkYXRhKCksIGosIFN0cmluZy52YWx1ZU9mKGopKQorICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKEludGVnZXIudG9TdHJpbmcocikpCisgICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgICAgICAgICAuYXBwbHlVbnNhZmUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBVdGlsLmZsdXNoKHN0b3JlKTsKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGVyZm9ybU1heGltYWwoc3RvcmUsIGZhbHNlKTsKIAotICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgLy8gdGhlIGtleXMgYXJlIHNwZWNpZmljYWxseSBjaG9zZW4gdG8gY292ZXIgY2VydGFpbiB1c2UgY2FzZXMKLSAgICAgICAgLy8gZXhpc3Rpbmcga2V5IGlzIHJlYWQgZnJvbSBpbmRleAotICAgICAgICBzc3RhYmxlLmdldFBvc2l0aW9uKGsoMiksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVOZWdhdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgLy8gZXhpc3Rpbmcga2V5IGlzIHJlYWQgZnJvbSBDYWNoZSBLZXkKLSAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihrKDIpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNzdGFibGUuZ2V0Qmxvb21GaWx0ZXJUcnVlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNzdGFibGUuZ2V0Qmxvb21GaWx0ZXJUcnVlTmVnYXRpdmVDb3VudCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNzdGFibGUuZ2V0Qmxvb21GaWx0ZXJGYWxzZVBvc2l0aXZlQ291bnQoKSk7Ci0gICAgICAgIC8vIG5vbi1leGlzdGluZyBrZXkgaXMgcmVqZWN0ZWQgYnkgQmxvb20gRmlsdGVyIGNoZWNrCi0gICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oaygxMCksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVOZWdhdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgLy8gbm9uLWV4aXN0aW5nIGtleSBpcyByZWplY3RlZCBieSBzc3RhYmxlIGtleXMgcmFuZ2UgY2hlY2sKLSAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihrKDk5KSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBzc3RhYmxlLmdldEJsb29tRmlsdGVyVHJ1ZVBvc2l0aXZlQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlLmdldEJsb29tRmlsdGVyVHJ1ZU5lZ2F0aXZlQ291bnQoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlLmdldEJsb29tRmlsdGVyRmFsc2VQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICAvLyBub24tZXhpc3Rpbmcga2V5IGlzIHJlamVjdGVkIGJ5IGluZGV4IGludGVydmFsIGNoZWNrCi0gICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oaygxNCksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVOZWdhdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpKTsKLSAgICAgICAgLy8gbm9uLWV4aXN0aW5nIGtleSBpcyByZWplY3RlZCBieSBpbmRleCBsb29rdXAgY2hlY2sKLSAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihrKDgwNyksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVQb3NpdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZS5nZXRCbG9vbUZpbHRlclRydWVOZWdhdGl2ZUNvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgc3N0YWJsZS5nZXRCbG9vbUZpbHRlckZhbHNlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIgc3N0YWJsZSA9IChTU1RhYmxlUmVhZGVyV2l0aEZpbHRlcikgc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIHNzdGFibGUgPSAoU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIpIHNzdGFibGUuY2xvbmVXaXRoTmV3U3RhcnQoZGsoMykpOworICAgICAgICByZXR1cm4gc3N0YWJsZTsKICAgICB9CiAKKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE9wZW5pbmdTU1RhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKQEAgLTQyOCw5MiArNjE5LDIyMyBAQAogICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBzc3RhYmxlLmRlc2NyaXB0b3I7CiAKICAgICAgICAgLy8gdGVzdCB0byBzZWUgaWYgc3N0YWJsZSBjYW4gYmUgb3BlbmVkIGFzIGV4cGVjdGVkCi0gICAgICAgIFNTVGFibGVSZWFkZXIgdGFyZ2V0ID0gU1NUYWJsZVJlYWRlci5vcGVuKGRlc2MpOwotICAgICAgICBhc3NlcnQgdGFyZ2V0LmZpcnN0LmVxdWFscyhmaXJzdEtleSk7Ci0gICAgICAgIGFzc2VydCB0YXJnZXQubGFzdC5lcXVhbHMobGFzdEtleSk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgdGFyZ2V0ID0gU1NUYWJsZVJlYWRlci5vcGVuKHN0b3JlLCBkZXNjKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCB0YXJnZXQuZmlyc3QuZXF1YWxzKGZpcnN0S2V5KTsKKyAgICAgICAgICAgIGFzc2VydCB0YXJnZXQubGFzdC5lcXVhbHMobGFzdEtleSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KIAotICAgICAgICBleGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiQUxURVIgVEFCTEUgXCIlc1wiLlwiJXNcIiBXSVRIIGJsb29tX2ZpbHRlcl9mcF9jaGFuY2UgPSAwLjMiLCBrcywgY2YpKTsKKyAgICAgICAgaWYgKEJpZ0Zvcm1hdC5pc1NlbGVjdGVkKCkpCisgICAgICAgICAgICBjaGVja09wZW5lZEJpZ1RhYmxlKGtzLCBjZiwgc3RvcmUsIGRlc2MpOworICAgICAgICBlbHNlIGlmIChCdGlGb3JtYXQuaXNTZWxlY3RlZCgpKQorICAgICAgICAgICAgY2hlY2tPcGVuZWRCdGlUYWJsZShrcywgY2YsIHN0b3JlLCBkZXNjKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgVXRpbC50ZXN0TXVzdEJlSW1wbGVtZW50ZWRGb3JTU1RhYmxlRm9ybWF0KCk7CisgICAgfQogCi0gICAgICAgIEZpbGUgc3VtbWFyeUZpbGUgPSBuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5TVU1NQVJZKSk7Ci0gICAgICAgIFBhdGggYmxvb21QYXRoID0gbmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuRklMVEVSKSkudG9QYXRoKCk7Ci0gICAgICAgIFBhdGggc3VtbWFyeVBhdGggPSBzdW1tYXJ5RmlsZS50b1BhdGgoKTsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrT3BlbmVkQmlnVGFibGUoU3RyaW5nIGtzLCBTdHJpbmcgY2YsIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlLCBEZXNjcmlwdG9yIGRlc2MpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGV4ZWN1dGVJbnRlcm5hbChmb3JtYXQoIkFMVEVSIFRBQkxFIFwiJXNcIi5cIiVzXCIgV0lUSCBibG9vbV9maWx0ZXJfZnBfY2hhbmNlID0gMC4zIiwga3MsIGNmKSk7CiAKLSAgICAgICAgbG9uZyBibG9vbU1vZGlmaWVkID0gRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShibG9vbVBhdGgpLnRvTWlsbGlzKCk7Ci0gICAgICAgIGxvbmcgc3VtbWFyeU1vZGlmaWVkID0gRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShzdW1tYXJ5UGF0aCkudG9NaWxsaXMoKTsKKyAgICAgICAgRmlsZSBibG9vbUZpbGUgPSBkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5GSUxURVIpOworICAgICAgICBsb25nIGJsb29tTW9kaWZpZWQgPSBibG9vbUZpbGUubGFzdE1vZGlmaWVkKCk7CisKKyAgICAgICAgRmlsZSBzdW1tYXJ5RmlsZSA9IGRlc2MuZmlsZUZvcihDb21wb25lbnRzLlNVTU1BUlkpOworICAgICAgICBsb25nIHN1bW1hcnlNb2RpZmllZCA9IHN1bW1hcnlGaWxlLmxhc3RNb2RpZmllZCgpOwogCiAgICAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUy5zbGVlcCgxMDAwKTsgLy8gc2xlZXAgdG8gZW5zdXJlIG1vZGlmaWVkIHRpbWUgd2lsbCBiZSBkaWZmZXJlbnQKIAogICAgICAgICAvLyBPZmZsaW5lIHRlc3RzCiAgICAgICAgIC8vIGNoZWNrIHRoYXQgYmxvb21maWx0ZXIvc3VtbWFyeSBBUkUgTk9UIHJlZ2VuZXJhdGVkCi0gICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3Blbk5vVmFsaWRhdGlvbihkZXNjLCBzdG9yZS5tZXRhZGF0YSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIEZpbGVzLmdldExhc3RNb2RpZmllZFRpbWUoYmxvb21QYXRoKS50b01pbGxpcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN1bW1hcnlNb2RpZmllZCwgRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShzdW1tYXJ5UGF0aCkudG9NaWxsaXMoKSk7Ci0KLSAgICAgICAgdGFyZ2V0LnNlbGZSZWYoKS5yZWxlYXNlKCk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgdGFyZ2V0ID0gU1NUYWJsZVJlYWRlci5vcGVuTm9WYWxpZGF0aW9uKHN0b3JlLCBkZXNjLCBzdG9yZS5tZXRhZGF0YSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYmxvb21Nb2RpZmllZCwgYmxvb21GaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzdW1tYXJ5TW9kaWZpZWQsIHN1bW1hcnlGaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRhcmdldC5zZWxmUmVmKCkuY2xvc2UoKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIGNoZWNrIHRoYXQgYmxvb21maWx0ZXIvc3VtbWFyeSBBUkUgTk9UIHJlZ2VuZXJhdGVkIGFuZCBCRj1BbHdheXNQcmVzZW50IHdoZW4gZmlsdGVyIGNvbXBvbmVudCBpcyBtaXNzaW5nCi0gICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBTU1RhYmxlLmRpc2NvdmVyQ29tcG9uZW50c0ZvcihkZXNjKTsKLSAgICAgICAgY29tcG9uZW50cy5yZW1vdmUoQ29tcG9uZW50LkZJTFRFUik7CisgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBkZXNjLmRpc2NvdmVyQ29tcG9uZW50cygpOworICAgICAgICBjb21wb25lbnRzLnJlbW92ZShDb21wb25lbnRzLkZJTFRFUik7CiAgICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3Blbk5vVmFsaWRhdGlvbihkZXNjLCBjb21wb25lbnRzLCBzdG9yZSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIEZpbGVzLmdldExhc3RNb2RpZmllZFRpbWUoYmxvb21QYXRoKS50b01pbGxpcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN1bW1hcnlNb2RpZmllZCwgRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShzdW1tYXJ5UGF0aCkudG9NaWxsaXMoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQsIHRhcmdldC5nZXRCbG9vbUZpbHRlcigpKTsKLQotICAgICAgICB0YXJnZXQuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhibG9vbU1vZGlmaWVkLCBibG9vbUZpbGUubGFzdE1vZGlmaWVkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHN1bW1hcnlNb2RpZmllZCwgc3VtbWFyeUZpbGUubGFzdE1vZGlmaWVkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsICgoU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIpIHRhcmdldCkuZ2V0RmlsdGVyT2ZmSGVhcFNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KIAogICAgICAgICAvLyAjIyMjIG9ubGluZSB0ZXN0cyAjIyMjCiAgICAgICAgIC8vIGNoZWNrIHRoYXQgc3VtbWFyeSAmIGJsb29tZmlsdGVyIGFyZSBub3QgcmVnZW5lcmF0ZWQgd2hlbiBTU1RhYmxlIGlzIG9wZW5lZCBhbmQgQkZGUCBoYXMgYmVlbiBjaGFuZ2VkCi0gICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3BlbihkZXNjLCBzdG9yZS5tZXRhZGF0YSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIEZpbGVzLmdldExhc3RNb2RpZmllZFRpbWUoYmxvb21QYXRoKS50b01pbGxpcygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN1bW1hcnlNb2RpZmllZCwgRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShzdW1tYXJ5UGF0aCkudG9NaWxsaXMoKSk7Ci0KLSAgICAgICAgdGFyZ2V0LnNlbGZSZWYoKS5yZWxlYXNlKCk7CisgICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3BlbihzdG9yZSwgZGVzYywgc3RvcmUubWV0YWRhdGEpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIGJsb29tRmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3VtbWFyeU1vZGlmaWVkLCBzdW1tYXJ5RmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBjaGVjayB0aGF0IGJsb29tZmlsdGVyIGlzIHJlY3JlYXRlZCB3aGVuIGl0IGRvZXNuJ3QgZXhpc3QgYW5kIHRoaXMgY2F1c2VzIHRoZSBzdW1tYXJ5IHRvIGJlIHJlY3JlYXRlZAotICAgICAgICBjb21wb25lbnRzID0gU1NUYWJsZS5kaXNjb3ZlckNvbXBvbmVudHNGb3IoZGVzYyk7Ci0gICAgICAgIGNvbXBvbmVudHMucmVtb3ZlKENvbXBvbmVudC5GSUxURVIpOworICAgICAgICBjb21wb25lbnRzID0gZGVzYy5kaXNjb3ZlckNvbXBvbmVudHMoKTsKKyAgICAgICAgY29tcG9uZW50cy5yZW1vdmUoQ29tcG9uZW50cy5GSUxURVIpOworICAgICAgICBjb21wb25lbnRzLnJlbW92ZShDb21wb25lbnRzLlNVTU1BUlkpOwogCi0gICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3BlbihkZXNjLCBjb21wb25lbnRzLCBzdG9yZS5tZXRhZGF0YSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQmxvb21maWx0ZXIgd2FzIG5vdCByZWNyZWF0ZWQiLCBibG9vbU1vZGlmaWVkIDwgRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShibG9vbVBhdGgpLnRvTWlsbGlzKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJTdW1tYXJ5IHdhcyBub3QgcmVjcmVhdGVkIiwgc3VtbWFyeU1vZGlmaWVkIDwgRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShzdW1tYXJ5UGF0aCkudG9NaWxsaXMoKSk7Ci0KLSAgICAgICAgdGFyZ2V0LnNlbGZSZWYoKS5yZWxlYXNlKCk7CisgICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3BlbihzdG9yZSwgZGVzYywgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQmxvb21maWx0ZXIgd2FzIG5vdCByZWNyZWF0ZWQiLCBibG9vbU1vZGlmaWVkIDwgYmxvb21GaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlN1bW1hcnkgd2FzIG5vdCByZWNyZWF0ZWQiLCBzdW1tYXJ5TW9kaWZpZWQgPCBzdW1tYXJ5RmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBjaGVjayB0aGF0IG9ubHkgdGhlIHN1bW1hcnkgaXMgcmVnZW5lcmF0ZWQgd2hlbiBpdCBpcyBkZWxldGVkCi0gICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudC5GSUxURVIpOwotICAgICAgICBzdW1tYXJ5TW9kaWZpZWQgPSBGaWxlcy5nZXRMYXN0TW9kaWZpZWRUaW1lKHN1bW1hcnlQYXRoKS50b01pbGxpcygpOworICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnRzLkZJTFRFUik7CisgICAgICAgIHN1bW1hcnlNb2RpZmllZCA9IHN1bW1hcnlGaWxlLmxhc3RNb2RpZmllZCgpOwogICAgICAgICBzdW1tYXJ5RmlsZS50cnlEZWxldGUoKTsKIAogICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuc2xlZXAoMTAwMCk7IC8vIHNsZWVwIHRvIGVuc3VyZSBtb2RpZmllZCB0aW1lIHdpbGwgYmUgZGlmZmVyZW50Ci0gICAgICAgIGJsb29tTW9kaWZpZWQgPSBGaWxlcy5nZXRMYXN0TW9kaWZpZWRUaW1lKGJsb29tUGF0aCkudG9NaWxsaXMoKTsKKyAgICAgICAgYmxvb21Nb2RpZmllZCA9IGJsb29tRmlsZS5sYXN0TW9kaWZpZWQoKTsKIAotICAgICAgICB0YXJnZXQgPSBTU1RhYmxlUmVhZGVyLm9wZW4oZGVzYywgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyhibG9vbU1vZGlmaWVkLCBGaWxlcy5nZXRMYXN0TW9kaWZpZWRUaW1lKGJsb29tUGF0aCkudG9NaWxsaXMoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoIlN1bW1hcnkgd2FzIG5vdCByZWNyZWF0ZWQiLCBzdW1tYXJ5TW9kaWZpZWQgPCBGaWxlcy5nZXRMYXN0TW9kaWZpZWRUaW1lKHN1bW1hcnlQYXRoKS50b01pbGxpcygpKTsKLQotICAgICAgICB0YXJnZXQuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgdGFyZ2V0ID0gU1NUYWJsZVJlYWRlci5vcGVuKHN0b3JlLCBkZXNjLCBjb21wb25lbnRzLCBzdG9yZS5tZXRhZGF0YSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYmxvb21Nb2RpZmllZCwgYmxvb21GaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlN1bW1hcnkgd2FzIG5vdCByZWNyZWF0ZWQiLCBzdW1tYXJ5TW9kaWZpZWQgPCBzdW1tYXJ5RmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KIAogICAgICAgICAvLyBjaGVjayB0aGF0IHN1bW1hcnkgYW5kIGJsb29tZmlsdGVyIGlzIG5vdCByZWNyZWF0ZWQgd2hlbiB0aGUgSU5ERVggaXMgbWlzc2luZwotICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnQuU1VNTUFSWSk7Ci0gICAgICAgIGNvbXBvbmVudHMucmVtb3ZlKENvbXBvbmVudC5QUklNQVJZX0lOREVYKTsKKyAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50cy5TVU1NQVJZKTsKKyAgICAgICAgY29tcG9uZW50cy5yZW1vdmUoQ29tcG9uZW50cy5QUklNQVJZX0lOREVYKTsKIAotICAgICAgICBzdW1tYXJ5TW9kaWZpZWQgPSBGaWxlcy5nZXRMYXN0TW9kaWZpZWRUaW1lKHN1bW1hcnlQYXRoKS50b01pbGxpcygpOwotICAgICAgICB0YXJnZXQgPSBTU1RhYmxlUmVhZGVyLm9wZW4oZGVzYywgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHN1bW1hcnlNb2RpZmllZCA9IHN1bW1hcnlGaWxlLmxhc3RNb2RpZmllZCgpOworICAgICAgICB0YXJnZXQgPSBTU1RhYmxlUmVhZGVyLm9wZW4oc3RvcmUsIGRlc2MsIGNvbXBvbmVudHMsIHN0b3JlLm1ldGFkYXRhLCBmYWxzZSwgZmFsc2UpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLnNsZWVwKDEwMDApOyAvLyBzbGVlcCB0byBlbnN1cmUgbW9kaWZpZWQgdGltZSB3aWxsIGJlIGRpZmZlcmVudAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIGJsb29tRmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3VtbWFyeU1vZGlmaWVkLCBzdW1tYXJ5RmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrT3BlbmVkQnRpVGFibGUoU3RyaW5nIGtzLCBTdHJpbmcgY2YsIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlLCBEZXNjcmlwdG9yIGRlc2MpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGV4ZWN1dGVJbnRlcm5hbChmb3JtYXQoIkFMVEVSIFRBQkxFIFwiJXNcIi5cIiVzXCIgV0lUSCBibG9vbV9maWx0ZXJfZnBfY2hhbmNlID0gMC4zIiwga3MsIGNmKSk7CisKKyAgICAgICAgRmlsZSBibG9vbUZpbGUgPSBkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5GSUxURVIpOworICAgICAgICBsb25nIGJsb29tTW9kaWZpZWQgPSBibG9vbUZpbGUubGFzdE1vZGlmaWVkKCk7CiAKICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLnNsZWVwKDEwMDApOyAvLyBzbGVlcCB0byBlbnN1cmUgbW9kaWZpZWQgdGltZSB3aWxsIGJlIGRpZmZlcmVudAotICAgICAgICBhc3NlcnRFcXVhbHMoYmxvb21Nb2RpZmllZCwgRmlsZXMuZ2V0TGFzdE1vZGlmaWVkVGltZShibG9vbVBhdGgpLnRvTWlsbGlzKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3VtbWFyeU1vZGlmaWVkLCBGaWxlcy5nZXRMYXN0TW9kaWZpZWRUaW1lKHN1bW1hcnlQYXRoKS50b01pbGxpcygpKTsKIAotICAgICAgICB0YXJnZXQuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgLy8gT2ZmbGluZSB0ZXN0cworICAgICAgICAvLyBjaGVjayB0aGF0IGJsb29tZmlsdGVyIGlzIG5vdCByZWdlbmVyYXRlZAorICAgICAgICBTU1RhYmxlUmVhZGVyIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3Blbk5vVmFsaWRhdGlvbihzdG9yZSwgZGVzYywgc3RvcmUubWV0YWRhdGEpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIGJsb29tRmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayB0aGF0IGJsb29tZmlsdGVyIGlzIG5vdCByZWdlbmVyYXRlZCBhbmQgQkY9QWx3YXlzUHJlc2VudCB3aGVuIGZpbHRlciBjb21wb25lbnQgaXMgbWlzc2luZworICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gZGVzYy5kaXNjb3ZlckNvbXBvbmVudHMoKTsKKyAgICAgICAgY29tcG9uZW50cy5yZW1vdmUoQ29tcG9uZW50cy5GSUxURVIpOworICAgICAgICB0YXJnZXQgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24oZGVzYywgY29tcG9uZW50cywgc3RvcmUpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIGJsb29tRmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgKChTU1RhYmxlUmVhZGVyV2l0aEZpbHRlcikgdGFyZ2V0KS5nZXRGaWx0ZXJPZmZIZWFwU2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRhcmdldC5zZWxmUmVmKCkuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vICMjIyMgb25saW5lIHRlc3RzICMjIyMKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBibG9vbWZpbHRlciBpcyBub3QgcmVnZW5lcmF0ZWQgd2hlbiBTU1RhYmxlIGlzIG9wZW5lZCBhbmQgQkZGUCBoYXMgYmVlbiBjaGFuZ2VkCisgICAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUy5zbGVlcCgxMDAwKTsgLy8gc2xlZXAgdG8gZW5zdXJlIG1vZGlmaWVkIHRpbWUgd2lsbCBiZSBkaWZmZXJlbnQKKyAgICAgICAgdGFyZ2V0ID0gU1NUYWJsZVJlYWRlci5vcGVuKHN0b3JlLCBkZXNjLCBzdG9yZS5tZXRhZGF0YSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYmxvb21Nb2RpZmllZCwgYmxvb21GaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRhcmdldC5zZWxmUmVmKCkuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIHRoYXQgYmxvb21maWx0ZXIgaXMgcmVjcmVhdGVkIHdoZW4gaXQgZG9lc24ndCBleGlzdAorICAgICAgICBjb21wb25lbnRzID0gZGVzYy5kaXNjb3ZlckNvbXBvbmVudHMoKTsKKyAgICAgICAgY29tcG9uZW50cy5yZW1vdmUoQ29tcG9uZW50cy5GSUxURVIpOworCisgICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3BlbihzdG9yZSwgZGVzYywgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQmxvb21maWx0ZXIgd2FzIG5vdCByZWNyZWF0ZWQiLCBibG9vbU1vZGlmaWVkIDwgYmxvb21GaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRhcmdldC5zZWxmUmVmKCkuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJsb29tTW9kaWZpZWQgPSBibG9vbUZpbGUubGFzdE1vZGlmaWVkKCk7CisgICAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUy5zbGVlcCgxMDAwKTsgLy8gc2xlZXAgdG8gZW5zdXJlIG1vZGlmaWVkIHRpbWUgd2lsbCBiZSBkaWZmZXJlbnQKKworICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnRzLkZJTFRFUik7CisgICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3BlbihzdG9yZSwgZGVzYywgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJsb29tTW9kaWZpZWQsIGJsb29tRmlsZS5sYXN0TW9kaWZpZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICB0YXJnZXQuc2VsZlJlZigpLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayB0aGF0IGJsb29tZmlsdGVyIGlzIG5vdCByZWNyZWF0ZWQgd2hlbiB0aGUgSU5ERVggaXMgbWlzc2luZworICAgICAgICBjb21wb25lbnRzLnJlbW92ZShCdGlGb3JtYXQuQ29tcG9uZW50cy5QQVJUSVRJT05fSU5ERVgpOworCisgICAgICAgIHRhcmdldCA9IFNTVGFibGVSZWFkZXIub3BlbihzdG9yZSwgZGVzYywgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuc2xlZXAoMTAwMCk7IC8vIHNsZWVwIHRvIGVuc3VyZSBtb2RpZmllZCB0aW1lIHdpbGwgYmUgZGlmZmVyZW50CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYmxvb21Nb2RpZmllZCwgYmxvb21GaWxlLmxhc3RNb2RpZmllZCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHRhcmdldC5zZWxmUmVmKCkuY2xvc2UoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdExvYWRpbmdTdW1tYXJ5VXNlc0NvcnJlY3RQYXJ0aXRpb25lcigpCisgICAgcHVibGljIHZvaWQgdGVzdExvYWRpbmdTdW1tYXJ5VXNlc0NvcnJlY3RQYXJ0aXRpb25lcigpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0gZGlzY2FyZFNTVGFibGVzKEtFWVNQQUNFMSwgQ0ZfSU5ERVhFRCk7CiAKQEAgLTUyNSwyMCArODQ3LDI1IEBACiAKICAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7CiAKLSAgICAgICAgZm9yKENvbHVtbkZhbWlseVN0b3JlIGluZGV4Q2ZzIDogc3RvcmUuaW5kZXhNYW5hZ2VyLmdldEFsbEluZGV4Q29sdW1uRmFtaWx5U3RvcmVzKCkpCisgICAgICAgIGZvciAoQ29sdW1uRmFtaWx5U3RvcmUgaW5kZXhDZnMgOiBzdG9yZS5pbmRleE1hbmFnZXIuZ2V0QWxsSW5kZXhDb2x1bW5GYW1pbHlTdG9yZXMoKSkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0IGluZGV4Q2ZzLmlzSW5kZXgoKTsKICAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGluZGV4Q2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwogICAgICAgICAgICAgYXNzZXJ0IHNzdGFibGUuZmlyc3QuZ2V0VG9rZW4oKSBpbnN0YW5jZW9mIExvY2FsVG9rZW47CiAKLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIuc2F2ZVN1bW1hcnkoc3N0YWJsZS5kZXNjcmlwdG9yLCBzc3RhYmxlLmZpcnN0LCBzc3RhYmxlLmxhc3QsIHNzdGFibGUuaW5kZXhTdW1tYXJ5KTsKLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVvcGVuZWQgPSBTU1RhYmxlUmVhZGVyLm9wZW4oc3N0YWJsZS5kZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIGFzc2VydCByZW9wZW5lZC5maXJzdC5nZXRUb2tlbigpIGluc3RhbmNlb2YgTG9jYWxUb2tlbjsKLSAgICAgICAgICAgIHJlb3BlbmVkLnNlbGZSZWYoKS5yZWxlYXNlKCk7CisgICAgICAgICAgICBpZiAoc3N0YWJsZSBpbnN0YW5jZW9mIEluZGV4U3VtbWFyeVN1cHBvcnQ8Pz4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmV3IEluZGV4U3VtbWFyeUNvbXBvbmVudCgoKEluZGV4U3VtbWFyeVN1cHBvcnQ8Pz4pIHNzdGFibGUpLmdldEluZGV4U3VtbWFyeSgpLCBzc3RhYmxlLmZpcnN0LCBzc3RhYmxlLmxhc3QpLnNhdmUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVU1NQVJZKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZW9wZW5lZCA9IFNTVGFibGVSZWFkZXIub3BlbihzdG9yZSwgc3N0YWJsZS5kZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgcmVvcGVuZWQuZmlyc3QuZ2V0VG9rZW4oKSBpbnN0YW5jZW9mIExvY2FsVG9rZW47CisgICAgICAgICAgICAgICAgcmVvcGVuZWQuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKiBzZWUgQ0FTU0FORFJBLTU0MDcgKi8KKyAgICAvKioKKyAgICAgKiBzZWUgQ0FTU0FORFJBLTU0MDcKKyAgICAgKi8KICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTY2FubmVyRm9yTm9JbnRlcnNlY3RpbmdSYW5nZXMoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewpAQCAtNTUzLDExICs4ODAsMTYgQEAKIAogICAgICAgICBVdGlsLmZsdXNoKHN0b3JlKTsKICAgICAgICAgYm9vbGVhbiBmb3VuZFNjYW5uZXIgPSBmYWxzZTsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHMgOiBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKSkKKworICAgICAgICBTZXQ8U1NUYWJsZVJlYWRlcj4gbGl2ZVNTVGFibGVzID0gc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHRhYmxlIHNob3VsZCBoYXZlIG9ubHkgb25lIHNzdGFibGUiLCAxLCBsaXZlU1NUYWJsZXMuc2l6ZSgpKTsKKworICAgICAgICBmb3IgKFNTVGFibGVSZWFkZXIgcyA6IGxpdmVTU1RhYmxlcykKICAgICAgICAgewotICAgICAgICAgICAgdHJ5IChJU1NUYWJsZVNjYW5uZXIgc2Nhbm5lciA9IHMuZ2V0U2Nhbm5lcihuZXcgUmFuZ2U8VG9rZW4+KHQoMCksIHQoMSkpKSkKKyAgICAgICAgICAgIHRyeSAoSVNTVGFibGVTY2FubmVyIHNjYW5uZXIgPSBzLmdldFNjYW5uZXIobmV3IFJhbmdlPD4odCgwKSwgdCgxKSkpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNjYW5uZXIubmV4dCgpOyAvLyB0aHJvd3MgZXhjZXB0aW9uIHByZSA1NDA3CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIG5vIGRhdGEgaXMgcmV0dXJuZWQgYW5kIG5vdGhpbmcgZmFpbHMgZm9yIG5vbi1pbnRlcnNlY3RpbmcgcmFuZ2UuCisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc2Nhbm5lci5oYXNOZXh0KCkpOwogICAgICAgICAgICAgICAgIGZvdW5kU2Nhbm5lciA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTU5MywxMyArOTI1LDEzIEBACiAKICAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CiAgICAgICAgIExpc3Q8U1NUYWJsZVJlYWRlci5QYXJ0aXRpb25Qb3NpdGlvbkJvdW5kcz4gc2VjdGlvbnMgPSBzc3RhYmxlLmdldFBvc2l0aW9uc0ZvclJhbmdlcyhyYW5nZXMpOwotICAgICAgICBhc3NlcnQgc2VjdGlvbnMuc2l6ZSgpID09IDEgOiAiRXhwZWN0ZWQgdG8gZmluZCByYW5nZSBpbiBzc3RhYmxlIiA7CisgICAgICAgIGFzc2VydCBzZWN0aW9ucy5zaXplKCkgPT0gMSA6ICJFeHBlY3RlZCB0byBmaW5kIHJhbmdlIGluIHNzdGFibGUiOwogCiAgICAgICAgIC8vIHJlLW9wZW4gdGhlIHNhbWUgc3N0YWJsZSBhcyBpdCB3b3VsZCBiZSBkdXJpbmcgYnVsayBsb2FkaW5nCi0gICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHMgPSBTZXRzLm5ld0hhc2hTZXQoQ29tcG9uZW50LkRBVEEsIENvbXBvbmVudC5QUklNQVJZX0lOREVYKTsKLSAgICAgICAgaWYgKHNzdGFibGUuY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTykpCi0gICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTyk7Ci0gICAgICAgIFNTVGFibGVSZWFkZXIgYnVsa0xvYWRlZCA9IFNTVGFibGVSZWFkZXIub3BlbkZvckJhdGNoKHNzdGFibGUuZGVzY3JpcHRvciwgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEpOworICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gU2V0cy5uZXdIYXNoU2V0KHNzdGFibGUuZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5wcmltYXJ5Q29tcG9uZW50cygpKTsKKyAgICAgICAgaWYgKHNzdGFibGUuY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnRzLkNPTVBSRVNTSU9OX0lORk8pKQorICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKTsKKyAgICAgICAgU1NUYWJsZVJlYWRlciBidWxrTG9hZGVkID0gU1NUYWJsZVJlYWRlci5vcGVuRm9yQmF0Y2goc3RvcmUsIHNzdGFibGUuZGVzY3JpcHRvciwgY29tcG9uZW50cywgc3RvcmUubWV0YWRhdGEpOwogICAgICAgICBzZWN0aW9ucyA9IGJ1bGtMb2FkZWQuZ2V0UG9zaXRpb25zRm9yUmFuZ2VzKHJhbmdlcyk7CiAgICAgICAgIGFzc2VydCBzZWN0aW9ucy5zaXplKCkgPT0gMSA6ICJFeHBlY3RlZCB0byBmaW5kIHJhbmdlIGluIHNzdGFibGUgb3BlbmVkIGZvciBidWxrIGxvYWRpbmciOwogICAgICAgICBidWxrTG9hZGVkLnNlbGZSZWYoKS5yZWxlYXNlKCk7CkBAIC02MDgsMTcgKzk0MCwxNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEluZGV4U3VtbWFyeVJlcGxhY2VtZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgeworICAgICAgICBhc3N1bWVUcnVlKEluZGV4U3VtbWFyeVN1cHBvcnQuaXNTdXBwb3J0ZWRCeShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkpKTsKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgc3RvcmUgPSBkaXNjYXJkU1NUYWJsZXMoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRF9MT1dfSU5ERVhfSU5URVJWQUwpOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZwogCiAgICAgICAgIGZpbmFsIGludCBOVU1fUEFSVElUSU9OUyA9IDUxMjsKICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOVU1fUEFSVElUSU9OUzsgaisrKQogICAgICAgICB7Ci0gICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihzdG9yZS5tZXRhZGF0YSgpLCBqLCBTdHJpbmcuZm9ybWF0KCIlM2QiLCBqKSkKKyAgICAgICAgICAgIG5ldyBSb3dVcGRhdGVCdWlsZGVyKHN0b3JlLm1ldGFkYXRhKCksIGosIGZvcm1hdCgiJTNkIiwgaikpCiAgICAgICAgICAgICAuY2x1c3RlcmluZygiMCIpCi0gICAgICAgICAgICAuYWRkKCJ2YWwiLCBTdHJpbmcuZm9ybWF0KCIlM2QiLCBqKSkKKyAgICAgICAgICAgIC5hZGQoInZhbCIsIGZvcm1hdCgiJTNkIiwgaikpCiAgICAgICAgICAgICAuYnVpbGQoKQogICAgICAgICAgICAgLmFwcGx5VW5zYWZlKCk7Ci0KICAgICAgICAgfQogICAgICAgICBVdGlsLmZsdXNoKHN0b3JlKTsKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGVyZm9ybU1heGltYWwoc3RvcmUsIGZhbHNlKTsKQEAgLTYzMSw3ICs5NjMsNyBAQAogICAgICAgICBMaXN0PEZ1dHVyZTw/Pj4gZnV0dXJlcyA9IG5ldyBBcnJheUxpc3Q8PihOVU1fUEFSVElUSU9OUyAqIDIpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9QQVJUSVRJT05TOyBpKyspCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXIga2V5ID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoU3RyaW5nLmZvcm1hdCgiJTNkIiwgaSkpOworICAgICAgICAgICAgZmluYWwgQnl0ZUJ1ZmZlciBrZXkgPSBCeXRlQnVmZmVyVXRpbC5ieXRlcyhmb3JtYXQoIiUzZCIsIGkpKTsKICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGk7CiAKICAgICAgICAgICAgIGZ1dHVyZXMuYWRkKGV4ZWN1dG9yLnN1Ym1pdChuZXcgUnVubmFibGUoKQpAQCAtNjM5LDcgKzk3MSw3IEBACiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIFJvdyByb3cgPSBVdGlsLmdldE9ubHlSb3dVbmZpbHRlcmVkKFV0aWwuY21kKHN0b3JlLCBrZXkpLmJ1aWxkKCkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgQnl0ZUJ1ZmZlclV0aWwuY29tcGFyZShTdHJpbmcuZm9ybWF0KCIlM2QiLCBpbmRleCkuZ2V0Qnl0ZXMoKSwgcm93LmNlbGxzKCkuaXRlcmF0b3IoKS5uZXh0KCkuYnVmZmVyKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEJ5dGVCdWZmZXJVdGlsLmNvbXBhcmUoZm9ybWF0KCIlM2QiLCBpbmRleCkuZ2V0Qnl0ZXMoKSwgcm93LmNlbGxzKCkuaXRlcmF0b3IoKS5uZXh0KCkuYnVmZmVyKCkpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KSk7CiAKQEAgLTY0OCw3ICs5ODAsNyBAQAogICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBJdGVyYWJsZTxEZWNvcmF0ZWRLZXk+IHJlc3VsdHMgPSBzdG9yZS5rZXlTYW1wbGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSYW5nZTw+KHNzdGFibGUuZ2V0UGFydGl0aW9uZXIoKS5nZXRNaW5pbXVtVG9rZW4oKSwgc3N0YWJsZS5nZXRQYXJ0aXRpb25lcigpLmdldFRva2VuKGtleSkpKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJhbmdlPD4oc3N0YWJsZS5nZXRQYXJ0aXRpb25lcigpLmdldE1pbmltdW1Ub2tlbigpLCBzc3RhYmxlLmdldFBhcnRpdGlvbmVyKCkuZ2V0VG9rZW4oa2V5KSkpOwogICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdHMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0pKTsKQEAgLTY1Nyw3ICs5ODksNyBAQAogICAgICAgICBTU1RhYmxlUmVhZGVyIHJlcGxhY2VtZW50OwogICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IHN0b3JlLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChzc3RhYmxlKSwgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKICAgICAgICAgewotICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSBzc3RhYmxlLmNsb25lV2l0aE5ld1N1bW1hcnlTYW1wbGluZ0xldmVsKHN0b3JlLCAxKTsKKyAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gKChJbmRleFN1bW1hcnlTdXBwb3J0PD8+KSBzc3RhYmxlKS5jbG9uZVdpdGhOZXdTdW1tYXJ5U2FtcGxpbmdMZXZlbChzdG9yZSwgMSk7CiAgICAgICAgICAgICB0eG4udXBkYXRlKHJlcGxhY2VtZW50LCB0cnVlKTsKICAgICAgICAgICAgIHR4bi5maW5pc2goKTsKICAgICAgICAgfQpAQCAtNjcwLDYgKzEwMDIsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEluZGV4U3VtbWFyeVVwc2FtcGxlQW5kUmVsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgYXNzdW1lVHJ1ZShJbmRleFN1bW1hcnlTdXBwb3J0LmlzU3VwcG9ydGVkQnkoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKSk7CiAgICAgICAgIGludCBvcmlnaW5hbE1heFNlZ21lbnRTaXplID0gTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRTsKICAgICAgICAgTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRSA9IDQwOyAvLyBlYWNoIGluZGV4IGVudHJ5IGlzIH4xMSBieXRlcywgc28gdGhpcyB3aWxsIGdlbmVyYXRlIGxvdHMgb2Ygc2VnbWVudHMKIApAQCAtNjgzLDM1ICsxMDE2LDM0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgdGVzdEluZGV4U3VtbWFyeVVwc2FtcGxlQW5kUmVsb2FkMCgpIHRocm93cyBFeGNlcHRpb24KKyAgICBwcml2YXRlIDxSIGV4dGVuZHMgU1NUYWJsZVJlYWRlciAmIEluZGV4U3VtbWFyeVN1cHBvcnQ8Uj4+IHZvaWQgdGVzdEluZGV4U3VtbWFyeVVwc2FtcGxlQW5kUmVsb2FkMCgpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0gZGlzY2FyZFNTVGFibGVzKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkRfTE9XX0lOREVYX0lOVEVSVkFMKTsgLy8gaW5kZXggaW50ZXJ2YWwgb2YgOCwgbm8ga2V5IGNhY2hpbmcKIAogICAgICAgICBmaW5hbCBpbnQgTlVNX1BBUlRJVElPTlMgPSA1MTI7CiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgTlVNX1BBUlRJVElPTlM7IGorKykKICAgICAgICAgewotICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoc3RvcmUubWV0YWRhdGEoKSwgaiwgU3RyaW5nLmZvcm1hdCgiJTNkIiwgaikpCisgICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihzdG9yZS5tZXRhZGF0YSgpLCBqLCBmb3JtYXQoIiUzZCIsIGopKQogICAgICAgICAgICAgLmNsdXN0ZXJpbmcoIjAiKQotICAgICAgICAgICAgLmFkZCgidmFsIiwgU3RyaW5nLmZvcm1hdCgiJTNkIiwgaikpCisgICAgICAgICAgICAuYWRkKCJ2YWwiLCBmb3JtYXQoIiUzZCIsIGopKQogICAgICAgICAgICAgLmJ1aWxkKCkKICAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOwotCiAgICAgICAgIH0KICAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7CiAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnBlcmZvcm1NYXhpbWFsKHN0b3JlLCBmYWxzZSk7CiAKLSAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IHN0b3JlLmdldExpdmVTU1RhYmxlcygpOworICAgICAgICBDb2xsZWN0aW9uPFI+IHNzdGFibGVzID0gU2VydmVyVGVzdFV0aWxzLjxSPmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhzdG9yZSk7CiAgICAgICAgIGFzc2VydCBzc3RhYmxlcy5zaXplKCkgPT0gMTsKLSAgICAgICAgZmluYWwgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gc3N0YWJsZXMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIGZpbmFsIFIgc3N0YWJsZSA9IHNzdGFibGVzLml0ZXJhdG9yKCkubmV4dCgpOwogCiAgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gc3RvcmUuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdGFibGUpLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQogICAgICAgICB7Ci0gICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHJlcGxhY2VtZW50ID0gc3N0YWJsZS5jbG9uZVdpdGhOZXdTdW1tYXJ5U2FtcGxpbmdMZXZlbChzdG9yZSwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkgKyAxKTsKKyAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcmVwbGFjZW1lbnQgPSBzc3RhYmxlLmNsb25lV2l0aE5ld1N1bW1hcnlTYW1wbGluZ0xldmVsKHN0b3JlLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSArIDEpOwogICAgICAgICAgICAgdHhuLnVwZGF0ZShyZXBsYWNlbWVudCwgdHJ1ZSk7CiAgICAgICAgICAgICB0eG4uZmluaXNoKCk7CiAgICAgICAgIH0KLSAgICAgICAgU1NUYWJsZVJlYWRlciByZW9wZW4gPSBTU1RhYmxlUmVhZGVyLm9wZW4oc3N0YWJsZS5kZXNjcmlwdG9yKTsKLSAgICAgICAgYXNzZXJ0IHJlb3Blbi5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkgPT0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnlTYW1wbGluZ0xldmVsKCkgKyAxOworICAgICAgICBSIHJlb3BlbiA9IChSKSBTU1RhYmxlUmVhZGVyLm9wZW4oc3RvcmUsIHNzdGFibGUuZGVzY3JpcHRvcik7CisgICAgICAgIGFzc2VydCByZW9wZW4uZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpID09IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpICsgMTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0SW5kZXhRdWVyeVdvcmtzKENvbHVtbkZhbWlseVN0b3JlIGluZGV4ZWRDRlMpCkBAIC03NDEsOSArMTA3MywxOSBAQAogICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXcgUmFuZ2U8PihsZWZ0LCByaWdodCkpOwogICAgIH0KIAotICAgIHByaXZhdGUgRGVjb3JhdGVkS2V5IGsoaW50IGkpCisgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgZGsoaW50IGkpCiAgICAgewotICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlckRlY29yYXRlZEtleSh0KGkpLCBCeXRlQnVmZmVyVXRpbC5ieXRlcyhTdHJpbmcudmFsdWVPZihpKSkpOworICAgICAgICByZXR1cm4gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoa2V5Rm9yKGkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQnVmZmVyIGtleUZvcihpbnQgaSkKKyAgICB7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlcyhTdHJpbmcudmFsdWVPZihpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBEZWNvcmF0ZWRLZXkgY29sbGlzaW9uRm9yKGludCBpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KFV0aWwuZ2VuZXJhdGVNdXJtdXJDb2xsaXNpb24oQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoU3RyaW5nLnZhbHVlT2YoaSkpKSk7CiAgICAgfQogCiAgICAgQFRlc3QoZXhwZWN0ZWQgPSBSdW50aW1lRXhjZXB0aW9uLmNsYXNzKQpAQCAtNzgxLDE5ICsxMTIzLDE5IEBACiAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgbmV3IGRpcmVjdG9yeSBpcyBlbXB0eSBhbmQgdGhhdCB0aGUgb2xkIGZpbGVzIGV4aXN0OgogICAgICAgICBmb3IgKENvbXBvbmVudCBjIDogc3N0YWJsZS5jb21wb25lbnRzKQogICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShub3RMaXZlRGVzYy5maWxlbmFtZUZvcihjKSk7CisgICAgICAgICAgICBGaWxlIGYgPSBub3RMaXZlRGVzYy5maWxlRm9yKGMpOwogICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZi5leGlzdHMoKSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihjKSkuZXhpc3RzKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihjKS5leGlzdHMoKSk7CiAgICAgICAgIH0KICAgICAgICAgU1NUYWJsZVJlYWRlci5tb3ZlQW5kT3BlblNTVGFibGUoY2ZzLCBzc3RhYmxlLmRlc2NyaXB0b3IsIG5vdExpdmVEZXNjLCBzc3RhYmxlLmNvbXBvbmVudHMsIGZhbHNlKTsKICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBmaWxlcyB3ZXJlIG1vdmVkOgogICAgICAgICBmb3IgKENvbXBvbmVudCBjIDogc3N0YWJsZS5jb21wb25lbnRzKQogICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShub3RMaXZlRGVzYy5maWxlbmFtZUZvcihjKSk7CisgICAgICAgICAgICBGaWxlIGYgPSBub3RMaXZlRGVzYy5maWxlRm9yKGMpOwogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmLmV4aXN0cygpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZi50b1N0cmluZygpLmNvbnRhaW5zKFN0cmluZy5mb3JtYXQoIi0lcy0iLCBpZCkpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZi50b1N0cmluZygpLmNvbnRhaW5zKGZvcm1hdCgiLSVzLSIsIGlkKSkpOwogICAgICAgICAgICAgZi5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKG5ldyBGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihjKSkuZXhpc3RzKCkpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2Uoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoYykuZXhpc3RzKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MzcsNDAgKzExNzksNDAgQEAKICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gc2V0VXBGb3JUZXN0VmVyZml5Q29tcHJlc3Npb25JbmZvRXhpc3RlbmNlKCk7CiAKICAgICAgICAgLy8gZGVsZXRlIHRoZSBjb21wcmVzc2lvbiBpbmZvLCBzbyBpdCBpcyBjb3JydXB0ZWQuCi0gICAgICAgIEZpbGUgY29tcHJlc3Npb25JbmZvRmlsZSA9IG5ldyBGaWxlKGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LkNPTVBSRVNTSU9OX0lORk8pKTsKKyAgICAgICAgRmlsZSBjb21wcmVzc2lvbkluZm9GaWxlID0gZGVzYy5maWxlRm9yKENvbXBvbmVudHMuQ09NUFJFU1NJT05fSU5GTyk7CiAgICAgICAgIGNvbXByZXNzaW9uSW5mb0ZpbGUudHJ5RGVsZXRlKCk7CiAgICAgICAgIGFzc2VydEZhbHNlKCJDb21wcmVzc2lvbkluZm8gZmlsZSBzaG91bGQgbm90IGV4aXN0IiwgY29tcHJlc3Npb25JbmZvRmlsZS5leGlzdHMoKSk7CiAKICAgICAgICAgLy8gZGlzY292ZXJ0IHRoZSBjb21wb25lbnRzIG9uIGRpc2sgYWZ0ZXIgZGVsZXRpb24KLSAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IFNTVGFibGUuZGlzY292ZXJDb21wb25lbnRzRm9yKGRlc2MpOworICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gZGVzYy5kaXNjb3ZlckNvbXBvbmVudHMoKTsKIAogICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbi5leHBlY3QoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24uY2xhc3MpOwogICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbi5leHBlY3RNZXNzYWdlKCJDb21wcmVzc2lvbkluZm8uZGIiKTsKLSAgICAgICAgU1NUYWJsZVJlYWRlci52ZXJpZnlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2VJZkFwcGxpY2FibGUoZGVzYywgY29tcG9uZW50cyk7CisgICAgICAgIENvbXByZXNzaW9uSW5mb0NvbXBvbmVudC52ZXJpZnlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2VJZkFwcGxpY2FibGUoZGVzYywgY29tcG9uZW50cyk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5Q29tcHJlc3Npb25JbmZvRXhpc3RlbmNlV2hlblRPQ1VuYWJsZVRvT3BlbigpCiAgICAgewogICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBzZXRVcEZvclRlc3RWZXJmaXlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2UoKTsKLSAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IFNTVGFibGUuZGlzY292ZXJDb21wb25lbnRzRm9yKGRlc2MpOwotICAgICAgICBTU1RhYmxlUmVhZGVyLnZlcmlmeUNvbXByZXNzaW9uSW5mb0V4aXN0ZW5jZUlmQXBwbGljYWJsZShkZXNjLCBjb21wb25lbnRzKTsKKyAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IGRlc2MuZGlzY292ZXJDb21wb25lbnRzKCk7CisgICAgICAgIENvbXByZXNzaW9uSW5mb0NvbXBvbmVudC52ZXJpZnlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2VJZkFwcGxpY2FibGUoZGVzYywgY29tcG9uZW50cyk7CiAKICAgICAgICAgLy8gbWFyayB0aGUgdG9jIGZpbGUgbm90IHJlYWRhYmxlIGluIG9yZGVyIHRvIHRyaWdnZXIgdGhlIEZTUmVhZEVycm9yCi0gICAgICAgIEZpbGUgdG9jRmlsZSA9IG5ldyBGaWxlKGRlc2MuZmlsZW5hbWVGb3IoQ29tcG9uZW50LlRPQykpOworICAgICAgICBGaWxlIHRvY0ZpbGUgPSBkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5UT0MpOwogICAgICAgICB0b2NGaWxlLnRyeVNldFJlYWRhYmxlKGZhbHNlKTsKIAogICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbi5leHBlY3QoRlNSZWFkRXJyb3IuY2xhc3MpOwogICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbi5leHBlY3RNZXNzYWdlKCJUT0MudHh0Iik7Ci0gICAgICAgIFNTVGFibGVSZWFkZXIudmVyaWZ5Q29tcHJlc3Npb25JbmZvRXhpc3RlbmNlSWZBcHBsaWNhYmxlKGRlc2MsIGNvbXBvbmVudHMpOworICAgICAgICBDb21wcmVzc2lvbkluZm9Db21wb25lbnQudmVyaWZ5Q29tcHJlc3Npb25JbmZvRXhpc3RlbmNlSWZBcHBsaWNhYmxlKGRlc2MsIGNvbXBvbmVudHMpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUNvbXByZXNzaW9uSW5mb0V4aXN0ZW5jZVBhc3NlcygpCiAgICAgewogICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBzZXRVcEZvclRlc3RWZXJmaXlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2UoKTsKLSAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IFNTVGFibGUuZGlzY292ZXJDb21wb25lbnRzRm9yKGRlc2MpOwotICAgICAgICBTU1RhYmxlUmVhZGVyLnZlcmlmeUNvbXByZXNzaW9uSW5mb0V4aXN0ZW5jZUlmQXBwbGljYWJsZShkZXNjLCBjb21wb25lbnRzKTsKKyAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IGRlc2MuZGlzY292ZXJDb21wb25lbnRzKCk7CisgICAgICAgIENvbXByZXNzaW9uSW5mb0NvbXBvbmVudC52ZXJpZnlDb21wcmVzc2lvbkluZm9FeGlzdGVuY2VJZkFwcGxpY2FibGUoZGVzYywgY29tcG9uZW50cyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBEZXNjcmlwdG9yIHNldFVwRm9yVGVzdFZlcmZpeUNvbXByZXNzaW9uSW5mb0V4aXN0ZW5jZSgpCkBAIC04ODEsOCArMTIyMyw4IEBACiAgICAgICAgIGNmcy5jbGVhclVuc2FmZSgpOwogICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBzc3RhYmxlLmRlc2NyaXB0b3I7CiAKLSAgICAgICAgRmlsZSBjb21wcmVzc2lvbkluZm9GaWxlID0gbmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTykpOwotICAgICAgICBGaWxlIHRvY0ZpbGUgPSBuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5UT0MpKTsKKyAgICAgICAgRmlsZSBjb21wcmVzc2lvbkluZm9GaWxlID0gZGVzYy5maWxlRm9yKENvbXBvbmVudHMuQ09NUFJFU1NJT05fSU5GTyk7CisgICAgICAgIEZpbGUgdG9jRmlsZSA9IGRlc2MuZmlsZUZvcihDb21wb25lbnRzLlRPQyk7CiAgICAgICAgIGFzc2VydFRydWUoIkNvbXByZXNzaW9uSW5mbyBmaWxlIHNob3VsZCBleGlzdCIsIGNvbXByZXNzaW9uSW5mb0ZpbGUuZXhpc3RzKCkpOwogICAgICAgICBhc3NlcnRUcnVlKCJUT0MgZmlsZSBzaG91bGQgZXhpc3QiLCB0b2NGaWxlLmV4aXN0cygpKTsKICAgICAgICAgcmV0dXJuIGRlc2M7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlUmV3cml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlUmV3cml0ZXJUZXN0LmphdmEKaW5kZXggYzg4ZTBiMC4uZmUzZmYyNyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVJld3JpdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVSZXdyaXRlclRlc3QuamF2YQpAQCAtMTksNyArMTksMTIgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIApAQCAtMjcsOCArMzIsOCBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuTmFtZWRUaHJlYWRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKQEAgLTM2LDI0ICs0MSwyNCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd1VwZGF0ZUJ1aWxkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuVmlldzsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5BYnN0cmFjdENvbXBhY3Rpb25TdHJhdGVneTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25Db250cm9sbGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkl0ZXJhdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLlNTVGFibGVTcGxpdHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlNTVGFibGVTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLlZpZXc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5JbW11dGFibGVCVHJlZVBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuU1NUYWJsZVNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0b3JhZ2VNZXRyaWNzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwpAQCAtNjIsNyArNjcsMTAgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlLkNPTVBBQ1RJT047CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzLm5vd0luU2Vjb25kczsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiBpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by53aGVuOwogCkBAIC0yMDUsNyArMjEzLDkgQEAKICAgICAgICAgU1NUYWJsZVJlYWRlciBzID0gd3JpdGVGaWxlKGNmcywgMTAwMCk7CiAgICAgICAgIGNmcy5hZGRTU1RhYmxlKHMpOwogICAgICAgICBsb25nIHN0YXJ0U3RvcmFnZU1ldHJpY3NMb2FkID0gU3RvcmFnZU1ldHJpY3MubG9hZC5nZXRDb3VudCgpOworICAgICAgICBsb25nIHN0YXJ0VW5jb21wcmVzc2VkTG9hZCA9IFN0b3JhZ2VNZXRyaWNzLnVuY29tcHJlc3NlZExvYWQuZ2V0Q291bnQoKTsKICAgICAgICAgbG9uZyBzQnl0ZXNPbkRpc2sgPSBzLmJ5dGVzT25EaXNrKCk7CisgICAgICAgIGxvbmcgc0J5dGVzT25EaXNrVW5jb21wcmVzc2VkID0gcy5sb2dpY2FsQnl0ZXNPbkRpc2soKTsKICAgICAgICAgU2V0PFNTVGFibGVSZWFkZXI+IGNvbXBhY3RpbmcgPSBTZXRzLm5ld0hhc2hTZXQocyk7CiAKICAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlczsKQEAgLTIzNiwxMSArMjQ2LDE1IEBACiAKICAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24ud2FpdEZvckRlbGV0aW9ucygpOwogCi0gICAgICAgIGxvbmcgc3VtID0gMDsKLSAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHggOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCi0gICAgICAgICAgICBzdW0gKz0geC5ieXRlc09uRGlzaygpOworICAgICAgICBsb25nIHN1bSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5zdHJlYW0oKS5tYXBUb0xvbmcoU1NUYWJsZVJlYWRlcjo6Ynl0ZXNPbkRpc2spLnN1bSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoc3VtLCBjZnMubWV0cmljLmxpdmVEaXNrU3BhY2VVc2VkLmdldENvdW50KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3RhcnRTdG9yYWdlTWV0cmljc0xvYWQgLSBzQnl0ZXNPbkRpc2sgKyBzdW0sIFN0b3JhZ2VNZXRyaWNzLmxvYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIGxvbmcgZW5kTG9hZCA9IFN0b3JhZ2VNZXRyaWNzLmxvYWQuZ2V0Q291bnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXJ0U3RvcmFnZU1ldHJpY3NMb2FkIC0gc0J5dGVzT25EaXNrICsgc3VtLCBlbmRMb2FkKTsKKworICAgICAgICBsb25nIHVuY29tcHJlc3NlZFN1bSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5zdHJlYW0oKS5tYXBUb0xvbmcodCAtPiB0LmxvZ2ljYWxCeXRlc09uRGlzaygpKS5zdW0oKTsKKyAgICAgICAgbG9uZyBlbmRVbmNvbXByZXNzZWRMb2FkID0gU3RvcmFnZU1ldHJpY3MudW5jb21wcmVzc2VkTG9hZC5nZXRDb3VudCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RhcnRVbmNvbXByZXNzZWRMb2FkIC0gc0J5dGVzT25EaXNrVW5jb21wcmVzc2VkICsgdW5jb21wcmVzc2VkU3VtLCBlbmRVbmNvbXByZXNzZWRMb2FkKTsKKwogICAgICAgICBhc3NlcnRFcXVhbHMoZmlsZXMsIHNzdGFibGVzLnNpemUoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscyhmaWxlcywgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CiAgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uLndhaXRGb3JEZWxldGlvbnMoKTsKQEAgLTg3OCwzOSArODkyLDE4IEBACiAgICAgICAgICAgICB0cnkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3IgdXJpID0gbW9jayhVbmZpbHRlcmVkUm93SXRlcmF0b3IuY2xhc3MpOwotICAgICAgICAgICAgICAgIHdoZW4odXJpLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKSkudGhlblJldHVybihuZXcgRGVsZXRpb25UaW1lKDAsMCkpOworICAgICAgICAgICAgICAgIHdoZW4odXJpLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKSkudGhlblJldHVybihuZXcgRGVsZXRpb25UaW1lKDAsIDApKTsKICAgICAgICAgICAgICAgICB3aGVuKHVyaS5wYXJ0aXRpb25LZXkoKSkudGhlblJldHVybihib3BLZXlGcm9tSW50KDApKTsKICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IGJlIGFibGUgdG8gYXBwZW5kIGFmdGVyIGJ1ZmZlciByZWxlYXNlIG9uIHN3aXRjaAogICAgICAgICAgICAgICAgIGZpcnN0V3JpdGVyLmFwcGVuZCh1cmkpOwogICAgICAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIEFzc2VydGlvbkVycm9yIHdhcyBub3QgdGhyb3duLiIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2goQXNzZXJ0aW9uRXJyb3IgYWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWFlLmdldE1lc3NhZ2UoKS5jb250YWlucygidXBkYXRlIGlzIGJlaW5nIGNhbGxlZCBhZnRlciByZWxlYXNlQnVmZmVycyIpKQorICAgICAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkVycm9yIGFlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghYWUuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJ1cGRhdGUgaXMgYmVpbmcgY2FsbGVkIGFmdGVyIHJlbGVhc2VCdWZmZXJzIikgJiYgIWFlLmdldE1lc3NhZ2UoKS5jb250YWlucygiQXR0ZW1wdCB0byB1c2UgYSBjbG9zZWQgZGF0YSBvdXRwdXQiKSkKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgYWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICAvLyBDYW4gdXBkYXRlIGEgd3JpdGVyIHRoYXQgaXMgbm90IGVhZ2VybHkgY2xlYXJlZCBvbiBzd2l0Y2gKLSAgICAgICAgZWFnZXJXcml0ZXJNZXRhUmVsZWFzZSA9IGZhbHNlOwotICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KG5ldyBIYXNoU2V0PD4oKSwgT3BlcmF0aW9uVHlwZS5VTktOT1dOKTsKLSAgICAgICAgICAgICBTU1RhYmxlUmV3cml0ZXIgcmV3cml0ZXIgPSBuZXcgU1NUYWJsZVJld3JpdGVyKHR4biwgMTAwMCwgMTAwMDAwMCwgZmFsc2UsIGVhZ2VyV3JpdGVyTWV0YVJlbGVhc2UpCi0gICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgICAgU1NUYWJsZVdyaXRlciBmaXJzdFdyaXRlciA9IGdldFdyaXRlcihjZnMsIGRpciwgdHhuKTsKLSAgICAgICAgICAgIHJld3JpdGVyLnN3aXRjaFdyaXRlcihmaXJzdFdyaXRlcik7Ci0KLSAgICAgICAgICAgIC8vIEF0IGxlYXN0IG9uZSB3cml0ZSBzbyBpdCdzIG5vdCBhYm9ydGVkIHdoZW4gc3dpdGNoZWQgb3V0LgotICAgICAgICAgICAgVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIHVyaSA9IG1vY2soVW5maWx0ZXJlZFJvd0l0ZXJhdG9yLmNsYXNzKTsKLSAgICAgICAgICAgIHdoZW4odXJpLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKSkudGhlblJldHVybihuZXcgRGVsZXRpb25UaW1lKDAsMCkpOwotICAgICAgICAgICAgd2hlbih1cmkucGFydGl0aW9uS2V5KCkpLnRoZW5SZXR1cm4oYm9wS2V5RnJvbUludCgwKSk7Ci0gICAgICAgICAgICByZXdyaXRlci5hcHBlbmQodXJpKTsKLQotICAgICAgICAgICAgcmV3cml0ZXIuc3dpdGNoV3JpdGVyKGdldFdyaXRlcihjZnMsIGRpciwgdHhuKSk7Ci0KLSAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhYmxlIHRvIGFwcGVuZCBhZnRlciBzd2l0Y2gsIGFuZCBhc3NlcnQgaXMgbm90IHRyaXBwZWQKLSAgICAgICAgICAgIHdoZW4odXJpLnBhcnRpdGlvbktleSgpKS50aGVuUmV0dXJuKGJvcEtleUZyb21JbnQoMSkpOwotICAgICAgICAgICAgZmlyc3RXcml0ZXIuYXBwZW5kKHVyaSk7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBzdGF0aWMgRGVjb3JhdGVkS2V5IGJvcEtleUZyb21JbnQoaW50IGkpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlU2Nhbm5lclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVTY2FubmVyVGVzdC5qYXZhCmluZGV4IDkyMjIwMGEuLjE3YjhhNmMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVTY2FubmVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVTY2FubmVyVGVzdC5qYXZhCkBAIC0yMiwxNiArMjIsMTQgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOwotCiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5VbmZpbHRlcmVkUGFydGl0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGF0YVJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKQEAgLTQxLDE5ICszOSwyMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuQ2x1c3RlcmluZ0luZGV4U2xpY2VGaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLlVuZmlsdGVyZWRQYXJ0aXRpb25JdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQWJzdHJhY3RCb3VuZHMuaXNFbXB0eTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBwdWJsaWMgY2xhc3MgU1NUYWJsZVNjYW5uZXJUZXN0CiB7CkBAIC0yMzksNyArMjQwLDcgQEAKICAgICAgICAgLy8gZW5kIG9mIHJhbmdlIGVkZ2UgY29uZGl0aW9ucwogICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxLCA4LCAyLCA4KTsKICAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgMSwgOSwgMiwgOSk7Ci0gICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDEsIDksIDIsIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxLCA5OSwgMiwgOSk7CiAKICAgICAgICAgLy8gc2luZ2xlIGl0ZW0gcmFuZ2VzCiAgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDIsIDIsIDIsIDIpOwpAQCAtMjkwLDYgKzI5MSw5MyBAQAogICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxLCAwLCAyLCA5KTsKICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVEYXRhUmFuZ2VXaXRoTW92ZWRTdGFydCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgc3RvcmUgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShUQUJMRSk7CisgICAgICAgIHN0b3JlLmNsZWFyVW5zYWZlKCk7CisKKyAgICAgICAgLy8gZGlzYWJsZSBjb21wYWN0aW9uIHdoaWxlIGZsdXNoaW5nCisgICAgICAgIHN0b3JlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgMTA7IGkrKykKKyAgICAgICAgICAgIGluc2VydFJvd1dpdGhLZXkoc3RvcmUubWV0YWRhdGEoKSwgaSk7CisgICAgICAgIFV0aWwuZmx1c2goc3RvcmUpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKS5zaXplKCkpOworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgc3N0YWJsZSA9IHNzdGFibGUuY2xvbmVXaXRoTmV3U3RhcnQoZGsoNCkpOworCisgICAgICAgIC8vIGZ1bGwgcmFuZ2Ugc2NhbgorICAgICAgICBJU1NUYWJsZVNjYW5uZXIgc2Nhbm5lciA9IHNzdGFibGUuZ2V0U2Nhbm5lcigpOworICAgICAgICBmb3IgKGludCBpID0gNDsgaSA8IDEwOyBpKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHModG9LZXkoaSksIG5ldyBTdHJpbmcoc2Nhbm5lci5uZXh0KCkucGFydGl0aW9uS2V5KCkuZ2V0S2V5KCkuYXJyYXkoKSkpOworCisgICAgICAgIHNjYW5uZXIuY2xvc2UoKTsKKworICAgICAgICAvLyBhIHNpbXBsZSByZWFkIG9mIGEgY2h1bmsgaW4gdGhlIG1pZGRsZQorICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAzLCA2LCA0LCA2KTsKKworICAgICAgICAvLyBzdGFydCBvZiByYW5nZSBlZGdlIGNvbmRpdGlvbnMKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgMywgOSwgNCwgOSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDQsIDksIDQsIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCA1LCA5LCA0LCA5KTsKKworICAgICAgICAvLyBlbmQgb2YgcmFuZ2UgZWRnZSBjb25kaXRpb25zCisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDEsIDgsIDQsIDgpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxLCA5LCA0LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgMSwgOTksIDQsIDkpOworCisgICAgICAgIC8vIHNpbmdsZSBpdGVtIHJhbmdlcworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCA0LCA0LCA0LCA0KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgNSwgNSwgNSwgNSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDksIDksIDksIDkpOworCisgICAgICAgIC8vIGVtcHR5IHJhbmdlcworICAgICAgICBhc3NlcnRTY2FuRW1wdHkoc3N0YWJsZSwgMiwgMyk7CisgICAgICAgIGFzc2VydFNjYW5FbXB0eShzc3RhYmxlLCAxMCwgMTEpOworCisgICAgICAgIC8vIHdyYXBwaW5nLCBzdGFydHMgaW4gbWlkZGxlCisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDcsIDUsIDQsIDUsIDcsIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCA1LCA0LCA0LCA0LCA1LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgNSwgMywgNSwgOSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDUsIEludGVnZXIuTUlOX1ZBTFVFLCA1LCA5KTsKKyAgICAgICAgLy8gd3JhcHBpbmcsIHN0YXJ0cyBhdCBlbmQKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgOSwgOCwgNCwgOCwgOSwgOSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDksIDUsIDQsIDUsIDksIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCA5LCA0LCA0LCA0LCA5LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgOSwgMywgOSwgOSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDksIEludGVnZXIuTUlOX1ZBTFVFLCA5LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgOCwgNSwgNCwgNSwgOCwgOSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDgsIDQsIDQsIDQsIDgsIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCA4LCAzLCA4LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgOCwgSW50ZWdlci5NSU5fVkFMVUUsIDgsIDkpOworICAgICAgICAvLyB3cmFwcGluZywgc3RhcnRzIHBhc3QgZW5kCisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDEwLCA5LCA0LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgMTAsIDUsIDQsIDUpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxMCwgNCwgNCwgNCk7CisgICAgICAgIGFzc2VydFNjYW5FbXB0eShzc3RhYmxlLCAxMCwgMyk7CisgICAgICAgIGFzc2VydFNjYW5FbXB0eShzc3RhYmxlLCAxMCwgSW50ZWdlci5NSU5fVkFMVUUpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxMSwgMTAsIDQsIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxMSwgOSwgNCwgOSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDExLCA1LCA0LCA1KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgMTEsIDQsIDQsIDQpOworICAgICAgICBhc3NlcnRTY2FuRW1wdHkoc3N0YWJsZSwgMTEsIDMpOworICAgICAgICBhc3NlcnRTY2FuRW1wdHkoc3N0YWJsZSwgMTEsIEludGVnZXIuTUlOX1ZBTFVFKTsKKyAgICAgICAgLy8gd3JhcHBpbmcsIHN0YXJ0cyBhdCBzdGFydAorICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCA1LCAxLCA1LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgNSwgSW50ZWdlci5NSU5fVkFMVUUsIDUsIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCA0LCAxLCA0LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgNCwgSW50ZWdlci5NSU5fVkFMVUUsIDQsIDkpOworICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAxLCAwLCA0LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgMSwgSW50ZWdlci5NSU5fVkFMVUUsIDQsIDkpOworICAgICAgICAvLyB3cmFwcGluZywgc3RhcnRzIGJlZm9yZQorICAgICAgICBhc3NlcnRTY2FuTWF0Y2hlcyhzc3RhYmxlLCAzLCAtMSwgNCwgOSk7CisgICAgICAgIGFzc2VydFNjYW5NYXRjaGVzKHNzdGFibGUsIDMsIEludGVnZXIuTUlOX1ZBTFVFLCA0LCA5KTsKKyAgICAgICAgYXNzZXJ0U2Nhbk1hdGNoZXMoc3N0YWJsZSwgMywgMCwgNCwgOSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRTY2FuQ29udGFpbnNSYW5nZXMoSVNTVGFibGVTY2FubmVyIHNjYW5uZXIsIGludCAuLi4gcmFuZ2VQYWlycykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBhc3NlcnQgcmFuZ2VQYWlycy5sZW5ndGggJSAyID09IDA7CkBAIC00NTgsNCArNTQ2LDQ5IEBACiAgICAgICAgIC8vIHRoaXMgd2lsbCBjdXJyZW50bHkgZmFpbAogICAgICAgICBhc3NlcnRTY2FuQ29udGFpbnNSYW5nZXMoc2Nhbm5lciwgMjA1LCAyMDUpOwogICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFJlcXVlc3ROZXh0Um93SXRlcmF0b3JXaXRob3V0Q29uc3VtaW5nUHJldmlvdXMoQ29uc3VtZXI8SVNTVGFibGVTY2FubmVyPiBjb25zdW1lcikKKyAgICB7CisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoVEFCTEUpOworICAgICAgICBzdG9yZS5jbGVhclVuc2FmZSgpOworCisgICAgICAgIC8vIGRpc2FibGUgY29tcGFjdGlvbiB3aGlsZSBmbHVzaGluZworICAgICAgICBzdG9yZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKworICAgICAgICBpbnNlcnRSb3dXaXRoS2V5KHN0b3JlLm1ldGFkYXRhKCksIDApOworICAgICAgICBzdG9yZS5mb3JjZUJsb2NraW5nRmx1c2goQ29sdW1uRmFtaWx5U3RvcmUuRmx1c2hSZWFzb24uVU5JVF9URVNUUyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN0b3JlLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IHN0b3JlLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworCisgICAgICAgIHRyeSAoSVNTVGFibGVTY2FubmVyIHNjYW5uZXIgPSBzc3RhYmxlLmdldFNjYW5uZXIoKTsKKyAgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3IgY3VycmVudFJvd0l0ZXJhdG9yID0gc2Nhbm5lci5uZXh0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY3VycmVudFJvd0l0ZXJhdG9yLmhhc05leHQoKSk7CisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdW1lci5hY2NlcHQoc2Nhbm5lcik7CisgICAgICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiVGhlIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByZXR1cm5lZCBieSB0aGUgbGFzdCBjYWxsIHRvIG5leHQoKSB3YXMgaW5pdGlhbGl6ZWQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXQgbXVzdCBiZSBjbG9zZWQgYmVmb3JlIGNhbGxpbmcgaGFzTmV4dCgpIG9yIG5leHQoKSBhZ2Fpbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0Um93SXRlcmF0b3JXaXRob3V0Q29uc3VtaW5nUHJldmlvdXMoKQorICAgIHsKKyAgICAgICAgdGVzdFJlcXVlc3ROZXh0Um93SXRlcmF0b3JXaXRob3V0Q29uc3VtaW5nUHJldmlvdXMoSVNTVGFibGVTY2FubmVyOjpoYXNOZXh0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXh0Um93SXRlcmF0b3JXaXRob3V0Q29uc3VtaW5nUHJldmlvdXMoKQorICAgIHsKKyAgICAgICAgdGVzdFJlcXVlc3ROZXh0Um93SXRlcmF0b3JXaXRob3V0Q29uc3VtaW5nUHJldmlvdXMoSVNTVGFibGVTY2FubmVyOjpuZXh0KTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlVXRpbHMuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVVdGlscy5qYXZhCmluZGV4IGNkZDNlZTAuLjA1OTY0YTggMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVVdGlscy5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVVdGlscy5qYXZhCkBAIC0xOSwyMyArMTksMzYgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUmVndWxhckFuZFN0YXRpY0NvbHVtbnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnBhcnRpdGlvbnMuUGFydGl0aW9uVXBkYXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuRW5jb2RpbmdTdGF0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2UuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlLk5PX1BFTkRJTkdfUkVQQUlSOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2UuVU5SRVBBSVJFRF9TU1RBQkxFOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogcHVibGljIGNsYXNzIFNTVGFibGVVdGlscwpAQCAtODAsNyArOTMsNyBAQAogICAgICAgICBGaWxlIGNmRGlyID0gbmV3IEZpbGUodGVtcGRpciwga2V5c3BhY2VOYW1lICsgRmlsZS5wYXRoU2VwYXJhdG9yKCkgKyBjZm5hbWUpOwogICAgICAgICBjZkRpci50cnlDcmVhdGVEaXJlY3RvcmllcygpOwogICAgICAgICBjZkRpci5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgRmlsZSBkYXRhZmlsZSA9IG5ldyBGaWxlKG5ldyBEZXNjcmlwdG9yKGNmRGlyLCBrZXlzcGFjZU5hbWUsIGNmbmFtZSwgaWQsIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7CisgICAgICAgIEZpbGUgZGF0YWZpbGUgPSBuZXcgRGVzY3JpcHRvcihjZkRpciwga2V5c3BhY2VOYW1lLCBjZm5hbWUsIGlkLCBCaWdGb3JtYXQuZ2V0SW5zdGFuY2UoKSkuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpOwogICAgICAgICBpZiAoIWRhdGFmaWxlLmNyZWF0ZUZpbGVJZk5vdEV4aXN0cygpKQogICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJ1bmFibGUgdG8gY3JlYXRlIGZpbGUgIiArIGRhdGFmaWxlKTsKICAgICAgICAgZGF0YWZpbGUuZGVsZXRlT25FeGl0KCk7CkBAIC0yMTYsMTEgKzIyOSwxMSBAQAogCiAgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IHdyaXRlKGludCBleHBlY3RlZFNpemUsIEFwcGVuZGVyIGFwcGVuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgRmlsZSBkYXRhZmlsZSA9IChkZXN0ID09IG51bGwpID8gdGVtcFNTVGFibGVGaWxlKGtzbmFtZSwgY2ZuYW1lLCBpZCkgOiBuZXcgRmlsZShkZXN0LmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSk7CisgICAgICAgICAgICBGaWxlIGRhdGFmaWxlID0gKGRlc3QgPT0gbnVsbCkgPyB0ZW1wU1NUYWJsZUZpbGUoa3NuYW1lLCBjZm5hbWUsIGlkKSA6IGRlc3QuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpOwogICAgICAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9IFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZU1ldGFkYXRhKGtzbmFtZSwgY2ZuYW1lKTsKICAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IFNjaGVtYS5pbnN0YW5jZS5nZXRDb2x1bW5GYW1pbHlTdG9yZUluc3RhbmNlKG1ldGFkYXRhLmlkKTsKICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyID0gYXBwZW5kZXIuaGVhZGVyKCk7Ci0gICAgICAgICAgICBTU1RhYmxlVHhuV3JpdGVyIHdyaXRlciA9IFNTVGFibGVUeG5Xcml0ZXIuY3JlYXRlKGNmcywgRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUoZGF0YWZpbGUuYWJzb2x1dGVQYXRoKCkpLCBleHBlY3RlZFNpemUsIFVOUkVQQUlSRURfU1NUQUJMRSwgTk9fUEVORElOR19SRVBBSVIsIGZhbHNlLCAwLCBoZWFkZXIpOworICAgICAgICAgICAgU1NUYWJsZVR4bldyaXRlciB3cml0ZXIgPSBTU1RhYmxlVHhuV3JpdGVyLmNyZWF0ZShjZnMsIERlc2NyaXB0b3IuZnJvbUZpbGVXaXRoQ29tcG9uZW50KGRhdGFmaWxlLCBmYWxzZSkubGVmdCwgZXhwZWN0ZWRTaXplLCBVTlJFUEFJUkVEX1NTVEFCTEUsIE5PX1BFTkRJTkdfUkVQQUlSLCBmYWxzZSwgMCwgaGVhZGVyKTsKICAgICAgICAgICAgIHdoaWxlIChhcHBlbmRlci5hcHBlbmQod3JpdGVyKSkgeyAvKiBwYXNzICovIH0KICAgICAgICAgICAgIENvbGxlY3Rpb248U1NUYWJsZVJlYWRlcj4gcmVhZGVycyA9IHdyaXRlci5maW5pc2godHJ1ZSk7CiAKQEAgLTIyOCw3ICsyNDEsNyBAQAogICAgICAgICAgICAgaWYgKGNsZWFudXApCiAgICAgICAgICAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHJlYWRlcjogcmVhZGVycykKICAgICAgICAgICAgICAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogcmVhZGVyLmNvbXBvbmVudHMpCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZShyZWFkZXIuZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb21wb25lbnQpKS5kZWxldGVPbkV4aXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5kZXNjcmlwdG9yLmZpbGVGb3IoY29tcG9uZW50KS5kZWxldGVPbkV4aXQoKTsKICAgICAgICAgICAgIHJldHVybiByZWFkZXJzOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVdyaXRlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVXcml0ZXJUZXN0LmphdmEKaW5kZXggNWQyMDM2Ny4uYWQ2YmQ2MSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVdyaXRlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlV3JpdGVyVGVzdC5qYXZhCkBAIC0yMCwyNyArMjAsMjkgQEAKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS4qOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TbGljZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmZpbHRlci5Db2x1bW5GaWx0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkc0xpc3RlbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkFjdGl2ZVJlcGFpclNlcnZpY2UuTk9fUEVORElOR19SRVBBSVI7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQWN0aXZlUmVwYWlyU2VydmljZS5VTlJFUEFJUkVEX1NTVEFCTEU7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZVVVSUQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIAogcHVibGljIGNsYXNzIFNTVGFibGVXcml0ZXJUZXN0IGV4dGVuZHMgU1NUYWJsZVdyaXRlclRlc3RCYXNlCiB7CkBAIC02MywzNCArNjUsMzggQEAKICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKGJ1aWxkZXIuYnVpbGQoKS51bmZpbHRlcmVkSXRlcmF0b3IoKSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgcyA9IHdyaXRlci5zZXRNYXhEYXRhQWdlKDEwMDApLm9wZW5FYXJseSgpOwotICAgICAgICAgICAgYXNzZXJ0IHMgIT0gbnVsbDsKLSAgICAgICAgICAgIGFzc2VydEZpbGVDb3VudHMoZGlyLnRyeUxpc3ROYW1lcygpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAxMDAwMDsgaSA8IDIwMDAwOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVXBkYXRlQnVpbGRlciBidWlsZGVyID0gVXBkYXRlQnVpbGRlci5jcmVhdGUoY2ZzLm1ldGFkYXRhKCksIHJhbmRvbShpLCAxMCkpLndpdGhUaW1lc3RhbXAoMSk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDA7IGorKykKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5uZXdSb3coIiIgKyBqKS5hZGQoInZhbCIsIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMTAwMCkpOwotICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoYnVpbGRlci5idWlsZCgpLnVuZmlsdGVyZWRJdGVyYXRvcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgczIgPSB3cml0ZXIuc2V0TWF4RGF0YUFnZSgxMDAwKS5vcGVuRWFybHkoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUocy5sYXN0LmNvbXBhcmVUbyhzMi5sYXN0KSA8IDApOwotICAgICAgICAgICAgYXNzZXJ0RmlsZUNvdW50cyhkaXIudHJ5TGlzdE5hbWVzKCkpOwotICAgICAgICAgICAgcy5zZWxmUmVmKCkucmVsZWFzZSgpOwotICAgICAgICAgICAgczIuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHdyaXRlci5zZXRNYXhEYXRhQWdlKDEwMDApOworICAgICAgICAgICAgd3JpdGVyLm9wZW5FYXJseShzIC0+IHsKKyAgICAgICAgICAgICAgICBhc3NlcnQgcyAhPSBudWxsOworICAgICAgICAgICAgICAgIGFzc2VydEZpbGVDb3VudHMoZGlyLnRyeUxpc3ROYW1lcygpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTAwMDA7IGkgPCAyMDAwMDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVXBkYXRlQnVpbGRlciBidWlsZGVyID0gVXBkYXRlQnVpbGRlci5jcmVhdGUoY2ZzLm1ldGFkYXRhKCksIHJhbmRvbShpLCAxMCkpLndpdGhUaW1lc3RhbXAoMSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTAwOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLm5ld1JvdygiIiArIGopLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxMDAwKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoYnVpbGRlci5idWlsZCgpLnVuZmlsdGVyZWRJdGVyYXRvcigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd3JpdGVyLnNldE1heERhdGFBZ2UoMTAwMCk7CisgICAgICAgICAgICAgICAgd3JpdGVyLm9wZW5FYXJseShzMiAtPiB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUocy5sYXN0LmNvbXBhcmVUbyhzMi5sYXN0KSA8IDApOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRGaWxlQ291bnRzKGRpci50cnlMaXN0TmFtZXMoKSk7CisgICAgICAgICAgICAgICAgICAgIHMuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgczIuc2VsZlJlZigpLnJlbGVhc2UoKTsKIAotICAgICAgICAgICAgaW50IGRhdGFmaWxlcyA9IGFzc2VydEZpbGVDb3VudHMoZGlyLnRyeUxpc3ROYW1lcygpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYXRhZmlsZXMsIDEpOworICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YWZpbGVzID0gYXNzZXJ0RmlsZUNvdW50cyhkaXIudHJ5TGlzdE5hbWVzKCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZGF0YWZpbGVzLCAxKTsKIAotICAgICAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24ud2FpdEZvckRlbGV0aW9ucygpOwotICAgICAgICAgICAgYXNzZXJ0RmlsZUNvdW50cyhkaXIudHJ5TGlzdE5hbWVzKCkpOworICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbi53YWl0Rm9yRGVsZXRpb25zKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEZpbGVDb3VudHMoZGlyLnRyeUxpc3ROYW1lcygpKTsKIAotICAgICAgICAgICAgd3JpdGVyLmFib3J0KCk7Ci0gICAgICAgICAgICB0eG4uYWJvcnQoKTsKLSAgICAgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uLndhaXRGb3JEZWxldGlvbnMoKTsKLSAgICAgICAgICAgIGRhdGFmaWxlcyA9IGFzc2VydEZpbGVDb3VudHMoZGlyLnRyeUxpc3ROYW1lcygpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYXRhZmlsZXMsIDApOwotICAgICAgICAgICAgdmFsaWRhdGVDRlMoY2ZzKTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLmFib3J0KCk7CisgICAgICAgICAgICAgICAgICAgIHR4bi5hYm9ydCgpOworICAgICAgICAgICAgICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbi53YWl0Rm9yRGVsZXRpb25zKCk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFmaWxlcyA9IGFzc2VydEZpbGVDb3VudHMoZGlyLnRyeUxpc3ROYW1lcygpKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRhdGFmaWxlcywgMCk7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlQ0ZTKGNmcyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjkzLDQgKzI5OSw0IEBACiAgICAgICAgIGFzc2VydEludmFsaWRSZXBhaXJNZXRhZGF0YSgxLCBOT19QRU5ESU5HX1JFUEFJUiwgdHJ1ZSk7CiAKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVdyaXRlclRlc3RCYXNlLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlV3JpdGVyVGVzdEJhc2UuamF2YQppbmRleCA4M2FkMTM2Li45MWI0NGVkIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlV3JpdGVyVGVzdEJhc2UuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlV3JpdGVyVGVzdEJhc2UuamF2YQpAQCAtMjUsNyArMjUsNiBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CkBAIC00Miw2ICs0MSw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CiAKQEAgLTEzOSw3ICsxNDAsNyBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmIChmLm5hbWUoKS5jb250YWlucygiRGF0YSIpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciBkID0gRGVzY3JpcHRvci5mcm9tRmlsZW5hbWUoZi5hYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IgZCA9IERlc2NyaXB0b3IuZnJvbUZpbGVXaXRoQ29tcG9uZW50KGYsIGZhbHNlKS5sZWZ0OwogICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGQudG9TdHJpbmcoKSwgbGl2ZURlc2NyaXB0b3JzLmNvbnRhaW5zKGQuaWQpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNTUsNyArMTU2LDE3IEBACiAgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlV3JpdGVyIGdldFdyaXRlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIEZpbGUgZGlyZWN0b3J5LCBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4sIGxvbmcgcmVwYWlyZWRBdCwgVGltZVVVSUQgcGVuZGluZ1JlcGFpciwgYm9vbGVhbiBpc1RyYW5zaWVudCkKICAgICB7CiAgICAgICAgIERlc2NyaXB0b3IgZGVzYyA9IGNmcy5uZXdTU1RhYmxlRGVzY3JpcHRvcihkaXJlY3RvcnkpOwotICAgICAgICByZXR1cm4gU1NUYWJsZVdyaXRlci5jcmVhdGUoZGVzYywgMCwgcmVwYWlyZWRBdCwgcGVuZGluZ1JlcGFpciwgaXNUcmFuc2llbnQsIG5ldyBTZXJpYWxpemF0aW9uSGVhZGVyKHRydWUsIGNmcy5tZXRhZGF0YSgpLCBjZnMubWV0YWRhdGEoKS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKSwgY2ZzLmluZGV4TWFuYWdlci5saXN0SW5kZXhlcygpLCB0eG4pOworICAgICAgICByZXR1cm4gZGVzYy5nZXRGb3JtYXQoKS5nZXRXcml0ZXJGYWN0b3J5KCkuYnVpbGRlcihkZXNjKQorICAgICAgICAgICAgICAgICAgIC5zZXRUYWJsZU1ldGFkYXRhUmVmKGNmcy5tZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAuc2V0S2V5Q291bnQoMCkKKyAgICAgICAgICAgICAgICAgICAuc2V0UmVwYWlyZWRBdChyZXBhaXJlZEF0KQorICAgICAgICAgICAgICAgICAgIC5zZXRQZW5kaW5nUmVwYWlyKHBlbmRpbmdSZXBhaXIpCisgICAgICAgICAgICAgICAgICAgLnNldFRyYW5zaWVudFNTVGFibGUoaXNUcmFuc2llbnQpCisgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIobmV3IFNlcmlhbGl6YXRpb25IZWFkZXIodHJ1ZSwgY2ZzLm1ldGFkYXRhKCksIGNmcy5tZXRhZGF0YSgpLnJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zKCksIEVuY29kaW5nU3RhdHMuTk9fU1RBVFMpKQorICAgICAgICAgICAgICAgICAgIC5hZGRGbHVzaE9ic2VydmVyc0ZvclNlY29uZGFyeUluZGV4ZXMoY2ZzLmluZGV4TWFuYWdlci5saXN0SW5kZXhlcygpLCB0eG4ub3BUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgLnNldE1ldGFkYXRhQ29sbGVjdG9yKG5ldyBNZXRhZGF0YUNvbGxlY3RvcihjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yKSkKKyAgICAgICAgICAgICAgICAgICAuYWRkRGVmYXVsdENvbXBvbmVudHMoKQorICAgICAgICAgICAgICAgICAgIC5idWlsZCh0eG4sIGNmcyk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlV3JpdGVyIGdldFdyaXRlcihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIEZpbGUgZGlyZWN0b3J5LCBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4pCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlV3JpdGVyVHJhbnNhY3Rpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlV3JpdGVyVHJhbnNhY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzOWI5YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NTVGFibGVXcml0ZXJUcmFuc2FjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyogdW5kZXIgdGhlIExpY2Vuc2UuCisqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlVwZGF0ZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFzY2lpVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5BYnN0cmFjdFRyYW5zYWN0aW9uYWxUZXN0OworCitwdWJsaWMgY2xhc3MgU1NUYWJsZVdyaXRlclRyYW5zYWN0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0VHJhbnNhY3Rpb25hbFRlc3QKK3sKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRTEgPSAiQmlnVGFibGVXcml0ZXJUZXN0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRCA9ICJTdGFuZGFyZDEiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7CisgICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQsIDAsIEludDMyVHlwZS5pbnN0YW5jZSwgQXNjaWlUeXBlLmluc3RhbmNlLCBJbnQzMlR5cGUuaW5zdGFuY2UpKTsKKyAgICAgICAgY2ZzID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRTEpLmdldENvbHVtbkZhbWlseVN0b3JlKENGX1NUQU5EQVJEKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgVGVzdGFibGVUcmFuc2FjdGlvbiBuZXdUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RhYmxlQlRXKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdGFibGVCVFcgZXh0ZW5kcyBUZXN0YWJsZVRyYW5zYWN0aW9uCisgICAgeworICAgICAgICBmaW5hbCBGaWxlIGZpbGU7CisgICAgICAgIGZpbmFsIERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKKyAgICAgICAgZmluYWwgU1NUYWJsZVR4bldyaXRlciB3cml0ZXI7CisKKyAgICAgICAgcHJpdmF0ZSBUZXN0YWJsZUJUVygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMoY2ZzLm5ld1NTVGFibGVEZXNjcmlwdG9yKGNmcy5nZXREaXJlY3RvcmllcygpLmdldERpcmVjdG9yeUZvck5ld1NTVGFibGVzKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgVGVzdGFibGVCVFcoRGVzY3JpcHRvciBkZXNjKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzKGRlc2MsIFNTVGFibGVUeG5Xcml0ZXIuY3JlYXRlKGNmcywgZGVzYywgMCwgMCwgbnVsbCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXJpYWxpemF0aW9uSGVhZGVyKHRydWUsIGNmcy5tZXRhZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZnMubWV0YWRhdGEoKS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBUZXN0YWJsZUJUVyhEZXNjcmlwdG9yIGRlc2MsIFNTVGFibGVUeG5Xcml0ZXIgc3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHN3KTsKKyAgICAgICAgICAgIHRoaXMuZmlsZSA9IGRlc2MuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpOworICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzYzsKKyAgICAgICAgICAgIHRoaXMud3JpdGVyID0gc3c7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVXBkYXRlQnVpbGRlciB1cGRhdGUgPSBVcGRhdGVCdWlsZGVyLmNyZWF0ZShjZnMubWV0YWRhdGEoKSwgaSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAxMDsgaisrKQorICAgICAgICAgICAgICAgICAgICB1cGRhdGUubmV3Um93KGopLmFkZCgidmFsIiwgU1NUYWJsZVJld3JpdGVyVGVzdC5yYW5kb20oMCwgMTAwMCkpOworICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQodXBkYXRlLmJ1aWxkKCkudW5maWx0ZXJlZEl0ZXJhdG9yKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SW5Qcm9ncmVzcygpIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXhpc3RzKGRlc2NyaXB0b3IudmVyc2lvbi5mb3JtYXQucHJpbWFyeUNvbXBvbmVudHMoKSk7CisgICAgICAgICAgICBhc3NlcnROb3RFeGlzdHMoZGVzY3JpcHRvci52ZXJzaW9uLmZvcm1hdC5nZW5lcmF0ZWRPbkxvYWRDb21wb25lbnRzKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZmlsZS5sZW5ndGgoKSA+IDApOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UHJlcGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEV4aXN0cyhkZXNjcmlwdG9yLnZlcnNpb24uZm9ybWF0LnByaW1hcnlDb21wb25lbnRzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXhpc3RzKGRlc2NyaXB0b3IudmVyc2lvbi5mb3JtYXQuZ2VuZXJhdGVkT25Mb2FkQ29tcG9uZW50cygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEFib3J0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydE5vdEV4aXN0cyhkZXNjcmlwdG9yLnZlcnNpb24uZm9ybWF0LnByaW1hcnlDb21wb25lbnRzKCkpOworICAgICAgICAgICAgYXNzZXJ0Tm90RXhpc3RzKGRlc2NyaXB0b3IudmVyc2lvbi5mb3JtYXQuZ2VuZXJhdGVkT25Mb2FkQ29tcG9uZW50cygpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShmaWxlLmV4aXN0cygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydENvbW1pdHRlZCgpIHRocm93cyBFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0UHJlcGFyZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBjb21taXRDYW5UaHJvdygpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEV4aXN0cyhDb2xsZWN0aW9uPENvbXBvbmVudD4gY29tcG9uZW50cykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkZXNjcmlwdG9yLmZpbGVGb3IoY29tcG9uZW50KS5leGlzdHMoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Tm90RXhpc3RzKENvbGxlY3Rpb248Q29tcG9uZW50PiBjb21wb25lbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzKQorICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb21wb25lbnQudG9TdHJpbmcoKSwgZGVzY3JpcHRvci5maWxlRm9yKGNvbXBvbmVudCkuZXhpc3RzKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVplcm9Db3B5V3JpdGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU1NUYWJsZVplcm9Db3B5V3JpdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjkyYWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TU1RhYmxlWmVyb0NvcHlXcml0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uVW5jaGVja2VkSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5DbG9zZWRDaGFubmVsRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLlVucG9vbGVkOworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuZW1iZWRkZWQuRW1iZWRkZWRDaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0LkFzeW5jU3RyZWFtaW5nSW5wdXRQbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5DYWNoaW5nUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworCitwdWJsaWMgY2xhc3MgU1NUYWJsZVplcm9Db3B5V3JpdGVyVGVzdAoreworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMSA9ICJCaWdUYWJsZUJsb2NrV3JpdGVyVGVzdCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkQgPSAiU3RhbmRhcmQxIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRDIgPSAiU3RhbmRhcmQyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9JTkRFWEVEID0gIkluZGV4ZWQxIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9TVEFOREFSRExPV0lOREVYSU5URVJWQUwgPSAiU3RhbmRhcmRMb3dJbmRleEludGVydmFsIjsKKworICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBzc3RhYmxlOworICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uRmFtaWx5U3RvcmUgc3RvcmU7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGV4cGVjdGVkUm93Q291bnQ7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKKyAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5jb21wb3NpdGVJbmRleENGTUQoS0VZU1BBQ0UxLCBDRl9JTkRFWEVELCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRExPV0lOREVYSU5URVJWQUwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWluSW5kZXhJbnRlcnZhbCg4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1heEluZGV4SW50ZXJ2YWwoMjU2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNhY2hpbmcoQ2FjaGluZ1BhcmFtcy5DQUNIRV9OT1RISU5HKSk7CisKKyAgICAgICAgU3RyaW5nIGtzID0gS0VZU1BBQ0UxOworICAgICAgICBTdHJpbmcgY2YgPSAiU3RhbmRhcmQxIjsKKworICAgICAgICAvLyBjbGVhciBhbmQgY3JlYXRlIGp1c3Qgb25lIHNzdGFibGUgZm9yIHRoaXMgdGVzdAorICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3MpOworICAgICAgICBzdG9yZSA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKGNmKTsKKyAgICAgICAgc3RvcmUuY2xlYXJVbnNhZmUoKTsKKyAgICAgICAgc3RvcmUuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisKKyAgICAgICAgRGVjb3JhdGVkS2V5IGZpcnN0S2V5ID0gbnVsbCwgbGFzdEtleSA9IG51bGw7CisgICAgICAgIGxvbmcgdGltZXN0YW1wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RvcmUubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gVXRpbC5kayhTdHJpbmcudmFsdWVPZihpKSk7CisgICAgICAgICAgICBpZiAoZmlyc3RLZXkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmaXJzdEtleSA9IGtleTsKKyAgICAgICAgICAgIGlmIChsYXN0S2V5ID09IG51bGwpCisgICAgICAgICAgICAgICAgbGFzdEtleSA9IGtleTsKKyAgICAgICAgICAgIGlmIChzdG9yZS5tZXRhZGF0YSgpLnBhcnRpdGlvbktleVR5cGUuY29tcGFyZShsYXN0S2V5LmdldEtleSgpLCBrZXkuZ2V0S2V5KCkpIDwgMCkKKyAgICAgICAgICAgICAgICBsYXN0S2V5ID0ga2V5OworCisgICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihzdG9yZS5tZXRhZGF0YSgpLCB0aW1lc3RhbXAsIGtleS5nZXRLZXkoKSkKKyAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjb2wiKQorICAgICAgICAgICAgLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlclV0aWwuRU1QVFlfQllURV9CVUZGRVIpCisgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICAgICAgLmFwcGx5VW5zYWZlKCk7CisgICAgICAgICAgICBleHBlY3RlZFJvd0NvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7CisKKyAgICAgICAgc3N0YWJsZSA9IHN0b3JlLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgd3JpdGVEYXRhRmlsZV9EYXRhSW5wdXRQbHVzKCkKKyAgICB7CisgICAgICAgIHdyaXRlRGF0YVRlc3RDeWNsZShidWZmZXIgLT4gbmV3IERhdGFJbnB1dEJ1ZmZlcihidWZmZXIuYXJyYXkoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgd3JpdGVEYXRhRmlsZV9SZWJ1ZmZlcmluZ0J5dGVCdWZEYXRhSW5wdXRQbHVzKCkKKyAgICB7CisgICAgICAgIHRyeSAoQXN5bmNTdHJlYW1pbmdJbnB1dFBsdXMgaW5wdXQgPSBuZXcgQXN5bmNTdHJlYW1pbmdJbnB1dFBsdXMobmV3IEVtYmVkZGVkQ2hhbm5lbCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGVEYXRhVGVzdEN5Y2xlKGJ1ZmZlciAtPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChidWZmZXIubGltaXQoKSA+IDApIHsgLy8gc2tpcCBlbXB0eSBmaWxlcyB0aGF0IHdvdWxkIGNhdXNlIHByZW1hdHVyZSBFT0YKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQuYXBwZW5kKFVucG9vbGVkLndyYXBwZWRCdWZmZXIoYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBpbnB1dC5yZXF1ZXN0Q2xvc3VyZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVEYXRhVGVzdEN5Y2xlKEZ1bmN0aW9uPEJ5dGVCdWZmZXIsIERhdGFJbnB1dFBsdXM+IGJ1ZmZlck1hcHBlcikKKyAgICB7CisgICAgICAgIEZpbGUgZGlyID0gc3RvcmUuZ2V0RGlyZWN0b3JpZXMoKS5nZXREaXJlY3RvcnlGb3JOZXdTU1RhYmxlcygpOworICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBzdG9yZS5uZXdTU1RhYmxlRGVzY3JpcHRvcihkaXIpOworICAgICAgICBUYWJsZU1ldGFkYXRhUmVmIG1ldGFkYXRhID0gU2NoZW1hLmluc3RhbmNlLmdldFRhYmxlTWV0YWRhdGFSZWYoZGVzYyk7CisKKyAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gTGlmZWN5Y2xlVHJhbnNhY3Rpb24ub2ZmbGluZShPcGVyYXRpb25UeXBlLlNUUkVBTSk7CisgICAgICAgIFNldDxDb21wb25lbnQ+IGNvbXBvbmVudHNUb1dyaXRlID0gbmV3IEhhc2hTZXQ8PihkZXNjLmdldEZvcm1hdCgpLnVwbG9hZENvbXBvbmVudHMoKSk7CisgICAgICAgIGlmICghbWV0YWRhdGEuZ2V0TG9jYWwoKS5wYXJhbXMuY29tcHJlc3Npb24uaXNFbmFibGVkKCkpCisgICAgICAgICAgICBjb21wb25lbnRzVG9Xcml0ZS5yZW1vdmUoQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKTsKKworICAgICAgICBTU1RhYmxlWmVyb0NvcHlXcml0ZXIgYnR6Y3cgPSBkZXNjLmdldEZvcm1hdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0V3JpdGVyRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGRlcihkZXNjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldENvbXBvbmVudHMoY29tcG9uZW50c1RvV3JpdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGFibGVNZXRhZGF0YVJlZihtZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVaZXJvQ29weVdyaXRlcih0eG4sIHN0b3JlKTsKKworICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzVG9Xcml0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRlc2MuZmlsZUZvcihjb21wb25lbnQpLmV4aXN0cygpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBhaXI8RGF0YUlucHV0UGx1cywgTG9uZz4gcGFpciA9IGdldFNTVGFibGVDb21wb25lbnREYXRhKHNzdGFibGUsIGNvbXBvbmVudCwgYnVmZmVyTWFwcGVyKTsKKworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnR6Y3cud3JpdGVDb21wb25lbnQoY29tcG9uZW50LnR5cGUsIHBhaXIubGVmdCwgcGFpci5yaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChDbG9zZWRDaGFubmVsRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5jaGVja2VkSU9FeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiByZWFkZXJzID0gYnR6Y3cuZmluaXNoKHRydWUpOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgcmVhZGVyID0gcmVhZGVycy50b0FycmF5KG5ldyBTU1RhYmxlUmVhZGVyWzBdKVswXTsKKworICAgICAgICBhc3NlcnROb3RFcXVhbHMoc3N0YWJsZS5nZXRGaWxlbmFtZSgpLCByZWFkZXIuZ2V0RmlsZW5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlLmVzdGltYXRlZEtleXMoKSwgcmVhZGVyLmVzdGltYXRlZEtleXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzc3RhYmxlLmlzUGVuZGluZ1JlcGFpcigpLCByZWFkZXIuaXNQZW5kaW5nUmVwYWlyKCkpOworCisgICAgICAgIGFzc2VydFJvd0NvdW50KGV4cGVjdGVkUm93Q291bnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSb3dDb3VudChpbnQgZXhwZWN0ZWQpCisgICAgeworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0b3JlLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWw7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGRrID0gVXRpbC5kayhTdHJpbmcudmFsdWVPZihpKSk7CisgICAgICAgICAgICBVbmZpbHRlcmVkUm93SXRlcmF0b3Igcm93SXRlciA9IHNzdGFibGUucm93SXRlcmF0b3IoZGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2VzLkFMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2x1bW5GaWx0ZXIuYWxsKHN0b3JlLm1ldGFkYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTVGFibGVSZWFkc0xpc3RlbmVyLk5PT1BfTElTVEVORVIpOworICAgICAgICAgICAgd2hpbGUgKHJvd0l0ZXIuaGFzTmV4dCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvd0l0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBjb3VudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYWlyPERhdGFJbnB1dFBsdXMsIExvbmc+IGdldFNTVGFibGVDb21wb25lbnREYXRhKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgQ29tcG9uZW50IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248Qnl0ZUJ1ZmZlciwgRGF0YUlucHV0UGx1cz4gYnVmZmVyTWFwcGVyKQorICAgIHsKKyAgICAgICAgRmlsZUhhbmRsZSBjb21wb25lbnRGaWxlID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVmZmVyU2l6ZSgxMDI0KS5jb21wbGV0ZSgpOworICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoKGludCkgY29tcG9uZW50RmlsZS5jaGFubmVsLnNpemUoKSk7CisgICAgICAgIGNvbXBvbmVudEZpbGUuY2hhbm5lbC5yZWFkKGJ1ZmZlciwgMCk7CisgICAgICAgIGJ1ZmZlci5mbGlwKCk7CisKKyAgICAgICAgRGF0YUlucHV0UGx1cyBpbnB1dFBsdXMgPSBidWZmZXJNYXBwZXIuYXBwbHkoYnVmZmVyKTsKKworICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUoaW5wdXRQbHVzLCBjb21wb25lbnRGaWxlLmNoYW5uZWwuc2l6ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TY3J1YlRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1NjcnViVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NTZkOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TY3J1YlRlc3QuamF2YQpAQCAtMCwwICsxLDkyMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uSU9FcnJvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5TdGFuZGFyZE9wZW5PcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLkFycmF5VXRpbHM7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG5ldC5vcGVuaGZ0LmNocm9uaWNsZS5jb3JlLnV0aWwuVGhyb3dpbmdCaUNvbnN1bWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VcGRhdGVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQ2h1bmtDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuT3BlcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeVByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlVudHlwZWRSZXN1bHRTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29uc2lzdGVuY3lMZXZlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db3VudGVyTXV0YXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLk11dGF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlBhcnRpdGlvblBvc2l0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJlYWRDb21tYW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZU5ld1RyYWNrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVVJRFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5QYXJ0aXRpb25VcGRhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5FbmNvZGluZ1N0YXRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5CeXRlT3JkZXJlZFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuUmVxdWVzdEV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLldyaXRlVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5Db21wcmVzc2lvbk1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkNvbXByZXNzaW9uSW5mb0NvbXBvbmVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLkJ0aUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT3V0cHV0SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOworaW1wb3J0IG9yZy5qYm9zcy5ieXRlbWFuLmNvbnRyaWIuYm11bml0LkJNUnVsZTsKK2ltcG9ydCBvcmcuamJvc3MuYnl0ZW1hbi5jb250cmliLmJtdW5pdC5CTVVuaXRSdW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLmNvdW50ZXJDRk1EOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2U7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5nZXRDb21wcmVzc2lvblBhcmFtZXRlcnM7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5sb2FkU2NoZW1hOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfSU5WQUxJRF9MRUdBQ1lfU1NUQUJMRV9ST09UOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfVVRJTF9BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzdW1lLmFzc3VtZUZhbHNlOworCitAUnVuV2l0aChCTVVuaXRSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgU2NydWJUZXN0Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNjcnViVGVzdC5jbGFzcyk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRiA9ICJTdGFuZGFyZDEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5URVJfQ0YgPSAiQ291bnRlcjEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGX1VVSUQgPSAiVVVJREtleXMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGX0lOREVYMSA9ICJJbmRleGVkMSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfSU5ERVgyID0gIkluZGV4ZWQyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRl9JTkRFWDFfQllURU9SREVSRUQgPSAiSW5kZXhlZDFfb3JkZXJlZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfSU5ERVgyX0JZVEVPUkRFUkVEID0gIkluZGV4ZWQyX29yZGVyZWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9JTkRFWCA9ICJiaXJ0aGRhdGUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTF9OT05fSU5ERVggPSAibm90YmlydGhkYXRlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBDT01QUkVTU0lPTl9DSFVOS19MRU5HVEggPSA0MDk2OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBzZXEgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgc3RhdGljIFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisKKyAgICBTdHJpbmcga3NOYW1lOworICAgIEtleXNwYWNlIGtleXNwYWNlOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldEZpbGVDYWNoZUVuYWJsZWQoZmFsc2UpOworICAgICAgICBsb2FkU2NoZW1hKCk7CisgICAgICAgIGFzc2VydE51bGwoQ2h1bmtDYWNoZS5pbnN0YW5jZSk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkKKyAgICB7CisgICAgICAgIGtzTmFtZSA9ICJzY3J1Yl90ZXN0XyIgKyBzZXEuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgIGNyZWF0ZUtleXNwYWNlKGtzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoa3NOYW1lLCBDRiksCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKGtzTmFtZSwgQ09VTlRFUl9DRikuY29tcHJlc3Npb24oZ2V0Q29tcHJlc3Npb25QYXJhbWV0ZXJzKENPTVBSRVNTSU9OX0NIVU5LX0xFTkdUSCkpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoa3NOYW1lLCBDRl9VVUlELCAwLCBVVUlEVHlwZS5pbnN0YW5jZSksCisgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5rZXlzSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmNvbXBvc2l0ZUluZGV4Q0ZNRChrc05hbWUsIENGX0lOREVYMiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5rZXlzSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgxX0JZVEVPUkRFUkVELCB0cnVlKS5wYXJ0aXRpb25lcihCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmNvbXBvc2l0ZUluZGV4Q0ZNRChrc05hbWUsIENGX0lOREVYMl9CWVRFT1JERVJFRCwgdHJ1ZSkucGFydGl0aW9uZXIoQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5pbnN0YW5jZSkpOworICAgICAgICBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NOYW1lKTsKKworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChURVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QsIHRydWUpOworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyQ2xhc3NFbnYoKQorICAgIHsKKyAgICAgICAgcHJvcGVydGllcy5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjcnViT25lUGFydGl0aW9uKCkKKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7CisKKyAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIHZlcmlmeSB3ZSBnZXQgaXQgYmFjayB3LyByYW5nZSBxdWVyeQorICAgICAgICBmaWxsQ0YoY2ZzLCAxKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworCisgICAgICAgIHBlcmZvcm1TY3J1YihjZnMsIGZhbHNlLCB0cnVlLCBmYWxzZSwgMik7CisKKyAgICAgICAgLy8gY2hlY2sgZGF0YSBpcyBzdGlsbCB0aGVyZQorICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJMYXN0QnJva2VuUGFydGl0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gQ29sdW1uRmFtaWx5U3RvcmUuZ2V0SWZFeGlzdHMoa3NOYW1lLCBDRik7CisKKyAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIHZlcmlmeSB3ZSBnZXQgaXQgYmFjayB3LyByYW5nZSBxdWVyeQorICAgICAgICBmaWxsQ0YoY2ZzLCAxKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworCisgICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBsaXZlU1NUYWJsZXMgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCk7CisgICAgICAgIGFzc2VydFRoYXQobGl2ZVNTVGFibGVzKS5oYXNTaXplKDEpOworICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBsaXZlU1NUYWJsZXMuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RmlsZW5hbWUoKTsKKyAgICAgICAgRmlsZXMud3JpdGUoUGF0aHMuZ2V0KGZpbGVOYW1lKSwgbmV3IGJ5dGVbMTBdLCBTdGFuZGFyZE9wZW5PcHRpb24uQ1JFQVRFLCBTdGFuZGFyZE9wZW5PcHRpb24uVFJVTkNBVEVfRVhJU1RJTkcpOworCisgICAgICAgIHBlcmZvcm1TY3J1YihjZnMsIHRydWUsIHRydWUsIGZhbHNlLCAyKTsKKworICAgICAgICAvLyBjaGVjayBkYXRhIGlzIHN0aWxsIHRoZXJlCisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1YkNvcnJ1cHRlZENvdW50ZXJQYXJ0aXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdyaXRlVGltZW91dEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gV2hlbiBjb21wcmVzc2lvbiBpcyBlbmFibGVkLCBmb3IgdGVzdGluZyBjb3JydXB0ZWQgY2h1bmtzIHdlIG5lZWQgZW5vdWdoIHBhcnRpdGlvbnMgdG8gY292ZXIKKyAgICAgICAgLy8gYXQgbGVhc3QgMyBjaHVua3Mgb2Ygc2l6ZSBDT01QUkVTU0lPTl9DSFVOS19MRU5HVEgKKyAgICAgICAgaW50IG51bVBhcnRpdGlvbnMgPSAxMDAwOworCisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1VOVEVSX0NGKTsKKyAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKKyAgICAgICAgZmlsbENvdW50ZXJDRihjZnMsIG51bVBhcnRpdGlvbnMpOworCisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCBudW1QYXJ0aXRpb25zKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworCisgICAgICAgIC8vbWFrZSBzdXJlIHRvIG92ZXJyaWRlIGF0IG1vc3QgMSBjaHVuayB3aGVuIGNvbXByZXNzaW9uIGlzIGVuYWJsZWQKKyAgICAgICAgLy91c2UgMHgwMCBpbnN0ZWFkIG9mIHRoZSB1c3VhbCAweDdBIGJlY2F1c2UgaWYgYnkgYW55IGNoYW5jZSBpdCdzIGFibGUgdG8gaXRlcmF0ZSBvdmVyIHRoZSBjb3JydXB0CisgICAgICAgIC8vc2VjdGlvbiwgdGhlbiB3ZSBnZXQgbWFueSBvdXQtb2Ytb3JkZXIgZXJyb3JzLCB3aGljaCB3ZSBkb24ndCB3YW50CisgICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjAiKSwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjEiKSwgKGJ5dGUpIDB4MDApOworCisgICAgICAgIC8vIHdpdGggc2tpcENvcnJ1cHRlZCA9PSBmYWxzZSwgdGhlIHNjcnViIGlzIGV4cGVjdGVkIHRvIGZhaWwKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdGFibGUpLCBPcGVyYXRpb25UeXBlLlNDUlVCKTsKKyAgICAgICAgICAgICBJU2NydWJiZXIgc2NydWJiZXIgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuZ2V0U2NydWJiZXIoY2ZzLCB0eG4sIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBuZXcgSVNjcnViYmVyLk9wdGlvbnMuQnVpbGRlcigpLmNoZWNrRGF0YSgpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICBzY3J1YmJlci5zY3J1YigpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FcnJvciBlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRocm93YWJsZXMuYXNzZXJ0QW55Q2F1c2UoZXJyLCBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3aXRoIHNraXBDb3JydXB0ZWQgPT0gdHJ1ZSwgdGhlIGNvcnJ1cHQgcm93cyB3aWxsIGJlIHNraXBwZWQKKyAgICAgICAgSVNjcnViYmVyLlNjcnViUmVzdWx0IHNjcnViUmVzdWx0OworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc3N0YWJsZSksIE9wZXJhdGlvblR5cGUuU0NSVUIpOworICAgICAgICAgICAgIElTY3J1YmJlciBzY3J1YmJlciA9IHNzdGFibGUuZGVzY3JpcHRvci5nZXRGb3JtYXQoKS5nZXRTY3J1YmJlcihjZnMsIHR4biwgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIG5ldyBJU2NydWJiZXIuT3B0aW9ucy5CdWlsZGVyKCkuc2tpcENvcnJ1cHRlZCgpLmNoZWNrRGF0YSgpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICBzY3J1YlJlc3VsdCA9IHNjcnViYmVyLnNjcnViV2l0aFJlc3VsdCgpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzY3J1YlJlc3VsdCk7CisKKyAgICAgICAgYm9vbGVhbiBjb21wcmVzc2lvbiA9IHNzdGFibGUuY29tcHJlc3Npb247CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzY3J1YlJlc3VsdC5lbXB0eVBhcnRpdGlvbnMpOworICAgICAgICBpZiAoY29tcHJlc3Npb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1QYXJ0aXRpb25zLCBzY3J1YlJlc3VsdC5iYWRQYXJ0aXRpb25zICsgc2NydWJSZXN1bHQuZ29vZFBhcnRpdGlvbnMpOworICAgICAgICAgICAgLy9iZWNhdXNlIHdlIG9ubHkgY29ycnVwdGVkIDEgY2h1bmssIGFuZCB3ZSBjaG9zZSBlbm91Z2ggcGFydGl0aW9ucyB0byBjb3ZlciBhdCBsZWFzdCAzIGNodW5rcworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzY3J1YlJlc3VsdC5nb29kUGFydGl0aW9ucyA+PSBzY3J1YlJlc3VsdC5iYWRQYXJ0aXRpb25zICogMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2NydWJSZXN1bHQuYmFkUGFydGl0aW9ucyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtUGFydGl0aW9ucyAtIDEsIHNjcnViUmVzdWx0Lmdvb2RQYXJ0aXRpb25zKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIHNjcnViUmVzdWx0Lmdvb2RQYXJ0aXRpb25zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8RmlsZT4gc3N0YWJsZUluZGV4UGF0aHMoU1NUYWJsZVJlYWRlciByZWFkZXIpCisgICAgeworICAgICAgICBpZiAoQmlnRm9ybWF0LmlzKHJlYWRlci5kZXNjcmlwdG9yLmdldEZvcm1hdCgpKSkKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHJlYWRlci5kZXNjcmlwdG9yLmZpbGVGb3IoQmlnRm9ybWF0LkNvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCkpOworICAgICAgICBpZiAoQnRpRm9ybWF0LmlzKHJlYWRlci5kZXNjcmlwdG9yLmdldEZvcm1hdCgpKSkKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHJlYWRlci5kZXNjcmlwdG9yLmZpbGVGb3IoQnRpRm9ybWF0LkNvbXBvbmVudHMuUEFSVElUSU9OX0lOREVYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5kZXNjcmlwdG9yLmZpbGVGb3IoQnRpRm9ybWF0LkNvbXBvbmVudHMuUk9XX0lOREVYKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IFV0aWwudGVzdE11c3RCZUltcGxlbWVudGVkRm9yU1NUYWJsZUZvcm1hdCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjcnViQ29ycnVwdGVkUm93SW5TbWFsbEZpbGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBvdmVyd3JpdGUgb25lIHJvdyB3aXRoIGdhcmJhZ2UKKyAgICAgICAgdGVzdENvcnJ1cHRpb25JblNtYWxsRmlsZSgoc3N0YWJsZSwga2V5cykgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZVdpdGhHYXJiYWdlKHNzdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlcyhrZXlzWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKGtleXNbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJ5dGUpIDB4N0EpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJDb3JydXB0ZWRJbmRleCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIC8vIG92ZXJ3cml0ZSBhIHBhcnQgb2YgdGhlIGluZGV4IHdpdGggZ2FyYmFnZQorICAgICAgICB0ZXN0Q29ycnVwdGlvbkluU21hbGxGaWxlKChzc3RhYmxlLCBrZXlzKSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZUluZGV4UGF0aHMoc3N0YWJsZSkuZ2V0KDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHg3QSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1YkNvcnJ1cHRlZEluZGV4T25PcGVuKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgLy8gb3ZlcndyaXRlIHRoZSB3aG9sZSBpbmRleCB3aXRoIGdhcmJhZ2UKKyAgICAgICAgdGVzdENvcnJ1cHRpb25JblNtYWxsRmlsZSgoc3N0YWJsZSwga2V5cykgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZVdpdGhHYXJiYWdlKHNzdGFibGVJbmRleFBhdGhzKHNzdGFibGUpLmdldCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChieXRlKSAweDdBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjcnViQ29ycnVwdGVkUm93Q29ycnVwdGVkSW5kZXgoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICAvLyBvdmVyd3JpdGUgb25lIHJvdywgYW5kIHRoZSBpbmRleCB3aXRoIGdhcmJhZ2UKKyAgICAgICAgdGVzdENvcnJ1cHRpb25JblNtYWxsRmlsZSgoc3N0YWJsZSwga2V5cykgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlcyhrZXlzWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlcyhrZXlzWzNdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHg3QSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZUluZGV4UGF0aHMoc3N0YWJsZSkuZ2V0KDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnl0ZSkgMHg3QSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsgICAvLyBjb3JydXB0IGFmdGVyIHRoZSBzZWNvbmQgcGFydGl0aW9uLCBubyB3YXkgdG8gcmVzeW5jCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENvcnJ1cHRpb25JblNtYWxsRmlsZShUaHJvd2luZ0JpQ29uc3VtZXI8U1NUYWJsZVJlYWRlciwgU3RyaW5nW10sIElPRXhjZXB0aW9uPiBjb3JydXB0LCBib29sZWFuIGlzRnVsbHlSZWNvdmVyYWJsZSwgaW50IGV4cGVjdGVkUGFydGl0aW9ucykgdGhyb3dzIElPRXhjZXB0aW9uLCBXcml0ZVRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1VOVEVSX0NGKTsKKyAgICAgICAgY2ZzLmNsZWFyVW5zYWZlKCk7CisKKyAgICAgICAgU3RyaW5nW10ga2V5cyA9IGZpbGxDb3VudGVyQ0YoY2ZzLCA1KTsKKworICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgNSk7CisKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworCisgICAgICAgIC8vIGNhbm5vdCB0ZXN0IHRoaXMgd2l0aCBjb21wcmVzc2lvbgorICAgICAgICBhc3N1bWVGYWxzZShzc3RhYmxlLm1ldGFkYXRhKCkucGFyYW1zLmNvbXByZXNzaW9uLmlzRW5hYmxlZCgpKTsKKworICAgICAgICAvLyBvdmVyd3JpdGUgb25lIHJvdyB3aXRoIGdhcmJhZ2UKKyAgICAgICAgY29ycnVwdC5hY2NlcHQoc3N0YWJsZSwga2V5cyk7CisKKyAgICAgICAgLy8gd2l0aCBza2lwQ29ycnVwdGVkID09IGZhbHNlLCB0aGUgc2NydWIgaXMgZXhwZWN0ZWQgdG8gZmFpbAorICAgICAgICBpZiAoIWlzRnVsbHlSZWNvdmVyYWJsZSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdGFibGUpLCBPcGVyYXRpb25UeXBlLlNDUlVCKTsKKyAgICAgICAgICAgICAgICAgSVNjcnViYmVyIHNjcnViYmVyID0gc3N0YWJsZS5kZXNjcmlwdG9yLmdldEZvcm1hdCgpLmdldFNjcnViYmVyKGNmcywgdHhuLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgbmV3IElTY3J1YmJlci5PcHRpb25zLkJ1aWxkZXIoKS5jaGVja0RhdGEoKS5idWlsZCgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB3aXRoIHNraXBDb3JydXB0ZWQgPT0gdHJ1ZSwgdGhlIGNvcnJ1cHQgcm93IHdpbGwgYmUgc2tpcHBlZAorICAgICAgICAgICAgICAgIHNjcnViYmVyLnNjcnViKCk7CisgICAgICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJT0Vycm9yIGV4cGVjdGVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHNzdGFibGUpLCBPcGVyYXRpb25UeXBlLlNDUlVCKTsKKyAgICAgICAgICAgICBJU2NydWJiZXIgc2NydWJiZXIgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkuZ2V0U2NydWJiZXIoY2ZzLCB0eG4sIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBuZXcgSVNjcnViYmVyLk9wdGlvbnMuQnVpbGRlcigpLmNoZWNrRGF0YSgpLnNraXBDb3JydXB0ZWQoKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gd2l0aCBza2lwQ29ycnVwdGVkID09IHRydWUsIHRoZSBjb3JydXB0IHJvdyB3aWxsIGJlIHNraXBwZWQKKyAgICAgICAgICAgIHNjcnViYmVyLnNjcnViKCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisgICAgICAgIC8vIHZlcmlmeSB0aGF0IHdlIGNhbiByZWFkIGFsbCB0aGUgcm93cywgYW5kIHRoZXJlIGlzIG5vdyB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHJvd3MKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIGV4cGVjdGVkUGFydGl0aW9ucyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJPbmVSb3dXaXRoQ29ycnVwdGVkS2V5KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb25maWd1cmF0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOworCisgICAgICAgIC8vIGluc2VydCBkYXRhIGFuZCB2ZXJpZnkgd2UgZ2V0IGl0IGJhY2sgdy8gcmFuZ2UgcXVlcnkKKyAgICAgICAgZmlsbENGKGNmcywgNCk7CisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCA0KTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIC8vIGNhbm5vdCB0ZXN0IHRoaXMgd2l0aCBjb21wcmVzc2lvbgorICAgICAgICBhc3N1bWVGYWxzZShzc3RhYmxlLm1ldGFkYXRhKCkucGFyYW1zLmNvbXByZXNzaW9uLmlzRW5hYmxlZCgpKTsKKworICAgICAgICBvdmVycmlkZVdpdGhHYXJiYWdlKHNzdGFibGUsIDAsIDIsIChieXRlKSAweDdBKTsKKworICAgICAgICBwZXJmb3JtU2NydWIoY2ZzLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIDIpOworCisgICAgICAgIC8vIGNoZWNrIGRhdGEgaXMgc3RpbGwgdGhlcmUKKyAgICAgICAgaWYgKEJpZ0Zvcm1hdC5pcyhzc3RhYmxlLmRlc2NyaXB0b3IuZ2V0Rm9ybWF0KCkpKQorICAgICAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDQpOworICAgICAgICBlbHNlIGlmIChCdGlGb3JtYXQuaXMoc3N0YWJsZS5kZXNjcmlwdG9yLmdldEZvcm1hdCgpKSkKKyAgICAgICAgICAgIC8vIEZvciBUcmllIGZvcm1hdCB3ZSB3b24ndCBiZSBhYmxlIHRvIHJlY292ZXIgdGhlIGRhbWFnZWQgcGFydGl0aW9uIGtleSAocGFydGlvbiBpbmRleCBkb2Vzbid0IHN0b3JlIHRoZSB3aG9sZSBrZXkpCisgICAgICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IFV0aWwudGVzdE11c3RCZUltcGxlbWVudGVkRm9yU1NUYWJsZUZvcm1hdCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjcnViQ29ycnVwdGVkQ291bnRlclJvd05vRWFybHlPcGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXcml0ZVRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGJvb2xlYW4gb2xkRGlzYWJsZWRWYWwgPSBTU1RhYmxlUmV3cml0ZXIuZGlzYWJsZUVhcmx5T3BlbmluZ0ZvclRlc3RzOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgU1NUYWJsZVJld3JpdGVyLmRpc2FibGVFYXJseU9wZW5pbmdGb3JUZXN0cyA9IHRydWU7CisgICAgICAgICAgICB0ZXN0U2NydWJDb3JydXB0ZWRDb3VudGVyUGFydGl0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBTU1RhYmxlUmV3cml0ZXIuZGlzYWJsZUVhcmx5T3BlbmluZ0ZvclRlc3RzID0gb2xkRGlzYWJsZWRWYWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1Yk11bHRpUm93KCkKKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7CisKKyAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIHZlcmlmeSB3ZSBnZXQgaXQgYmFjayB3LyByYW5nZSBxdWVyeQorICAgICAgICBmaWxsQ0YoY2ZzLCAxMCk7CisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxMCk7CisKKyAgICAgICAgcGVyZm9ybVNjcnViKGNmcywgZmFsc2UsIHRydWUsIGZhbHNlLCAyKTsKKworICAgICAgICAvLyBjaGVjayBkYXRhIGlzIHN0aWxsIHRoZXJlCisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJOb0luZGV4KCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7CisKKyAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIHZlcmlmeSB3ZSBnZXQgaXQgYmFjayB3LyByYW5nZSBxdWVyeQorICAgICAgICBmaWxsQ0YoY2ZzLCAxMCk7CisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxMCk7CisKKyAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCisgICAgICAgICAgICBzc3RhYmxlSW5kZXhQYXRocyhzc3RhYmxlKS5mb3JFYWNoKEZpbGU6OnRyeURlbGV0ZSk7CisKKyAgICAgICAgcGVyZm9ybVNjcnViKGNmcywgZmFsc2UsIHRydWUsIGZhbHNlLCAyKTsKKworICAgICAgICAvLyBjaGVjayBkYXRhIGlzIHN0aWxsIHRoZXJlCisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQk1SdWxlKG5hbWUgPSAic2tpcCBwYXJ0aXRpb24gb3JkZXIgdmVyaWZpY2F0aW9uIiwgdGFyZ2V0Q2xhc3MgPSAiU29ydGVkVGFibGVXcml0ZXIiLCB0YXJnZXRNZXRob2QgPSAidmVyaWZ5UGFydGl0aW9uIiwgYWN0aW9uID0gInJldHVybiB0cnVlIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJPdXRPZk9yZGVyKCkKKyAgICB7CisgICAgICAgIC8vIFJ1biBvbmx5IGZvciBCaWcgVGFibGUgZm9ybWF0IGJlY2F1c2UgQmlnIFRhYmxlIEZvcm1hdCBkb2VzIG5vdCBjb21wbGFpbiBpZiBwYXJ0aXRpb25zIGFyZSBnaXZlbiBpbiBpbnZhbGlkCisgICAgICAgIC8vIG9yZGVyLiBMZWdhY3kgU1NUYWJsZXMgd2l0aCBvdXQtb2Ytb3JkZXIgcGFydGl0aW9ucyBleGlzdCBpbiBwcm9kdWN0aW9uIHN5c3RlbXMgYW5kIG11c3QgYmUgY29ycmVjdGVkCisgICAgICAgIC8vIGJ5IHNjcnViYmluZy4gVGhlIHRyaWUgaW5kZXggZm9ybWF0IGRvZXMgbm90IHBlcm1pdCBzdWNoIHBhcnRpdGlvbnMuCisKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoQmlnRm9ybWF0LmlzU2VsZWN0ZWQoKSk7CisKKyAgICAgICAgLy8gVGhpcyB0ZXN0IGFzc3VtZXMgQnl0ZU9yZGVyUGFydGl0aW9uZXIgdG8gY3JlYXRlIG91dC1vZi1vcmRlciBTU1RhYmxlCisgICAgICAgIElQYXJ0aXRpb25lciBvbGRQYXJ0aXRpb25lciA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRQYXJ0aXRpb25lcigpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGFydGl0aW9uZXJVbnNhZmUobmV3IEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIoKSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIG91dC1vZi1vcmRlciBTU1RhYmxlCisgICAgICAgIEZpbGUgdGVtcERpciA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgiU2NydWJUZXN0LnRlc3RTY3J1Yk91dE9mT3JkZXIiLCAiIikucGFyZW50KCk7CisgICAgICAgIC8vIGNyZWF0ZSBrcy9jZiBkaXJlY3RvcnkKKyAgICAgICAgRmlsZSB0ZW1wRGF0YURpciA9IG5ldyBGaWxlKHRlbXBEaXIsIFN0cmluZy5qb2luKEZpbGUucGF0aFNlcGFyYXRvcigpLCBrc05hbWUsIENGKSk7CisgICAgICAgIGFzc2VydFRydWUodGVtcERhdGFEaXIudHJ5Q3JlYXRlRGlyZWN0b3JpZXMoKSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKKworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGtleXMgPSBBcnJheXMuYXNMaXN0KCJ0IiwgImEiLCAiYiIsICJ6IiwgImMiLCAieSIsICJkIik7CisgICAgICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBjZnMubmV3U1NUYWJsZURlc2NyaXB0b3IodGVtcERhdGFEaXIpOworCisgICAgICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IExpZmVjeWNsZVRyYW5zYWN0aW9uLm9mZmxpbmUoT3BlcmF0aW9uVHlwZS5XUklURSk7CisgICAgICAgICAgICAgICAgIFNTVGFibGVUeG5Xcml0ZXIgd3JpdGVyID0gbmV3IFNTVGFibGVUeG5Xcml0ZXIodHhuLCBjcmVhdGVUZXN0V3JpdGVyKGRlc2MsIGtleXMuc2l6ZSgpLCBjZnMsIHR4bikpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGsgOiBrZXlzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSA9IFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmcy5tZXRhZGF0YSgpLCBVdGlsLmRrKGspKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdSb3coInNvbWVOYW1lIikuYWRkKCJ2YWwiLCAic29tZVZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuYXBwZW5kKHVwZGF0ZS51bmZpbHRlcmVkSXRlcmF0b3IoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci5maW5pc2goZmFsc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyLm9wZW4oY2ZzLCBkZXNjLCBjZnMubWV0YWRhdGEpOworICAgICAgICAgICAgICAgIGZhaWwoIlNTVFIgdmFsaWRhdGlvbiBzaG91bGQgaGF2ZSBjYXVnaHQgdGhlIG91dC1vZi1vcmRlciByb3dzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gaXNlKQorICAgICAgICAgICAgeyAvKiB0aGlzIGlzIGV4cGVjdGVkICovIH0KKworICAgICAgICAgICAgLy8gb3BlbiB3aXRob3V0IHZhbGlkYXRpb24gZm9yIHNjcnViYmluZworICAgICAgICAgICAgU2V0PENvbXBvbmVudD4gY29tcG9uZW50cyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgIGlmIChkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5DT01QUkVTU0lPTl9JTkZPKS5leGlzdHMoKSkKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnRzLkNPTVBSRVNTSU9OX0lORk8pOworICAgICAgICAgICAgY29tcG9uZW50cy5hZGQoQ29tcG9uZW50cy5EQVRBKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudHMuUFJJTUFSWV9JTkRFWCk7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnRzLkZJTFRFUik7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnRzLlNUQVRTKTsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKENvbXBvbmVudHMuU1VNTUFSWSk7CisgICAgICAgICAgICBjb21wb25lbnRzLmFkZChDb21wb25lbnRzLlRPQyk7CisKKyAgICAgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IFNTVGFibGVSZWFkZXIub3Blbk5vVmFsaWRhdGlvbihkZXNjLCBjb21wb25lbnRzLCBjZnMpOworLy8gICAgICAgICAgICBpZiAoc3N0YWJsZS5sYXN0LmNvbXBhcmVUbyhzc3RhYmxlLmZpcnN0KSA8IDApCisvLyAgICAgICAgICAgICAgICBzc3RhYmxlLmxhc3QgPSBzc3RhYmxlLmZpcnN0OworCisgICAgICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHNjcnViVHhuID0gTGlmZWN5Y2xlVHJhbnNhY3Rpb24ub2ZmbGluZShPcGVyYXRpb25UeXBlLlNDUlVCLCBzc3RhYmxlKTsKKyAgICAgICAgICAgICAgICAgSVNjcnViYmVyIHNjcnViYmVyID0gc3N0YWJsZS5kZXNjcmlwdG9yLmdldEZvcm1hdCgpLmdldFNjcnViYmVyKGNmcywgc2NydWJUeG4sIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBuZXcgSVNjcnViYmVyLk9wdGlvbnMuQnVpbGRlcigpLmNoZWNrRGF0YSgpLmJ1aWxkKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNjcnViYmVyLnNjcnViKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbi53YWl0Rm9yRGVsZXRpb25zKCk7CisgICAgICAgICAgICBjZnMubG9hZE5ld1NTVGFibGVzKCk7CisgICAgICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgNyk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlVXRpbHMuZGVsZXRlUmVjdXJzaXZlKHRlbXBEYXRhRGlyKTsKKyAgICAgICAgICAgIC8vIHJlc2V0IHBhcnRpdGlvbmVyCisgICAgICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGFydGl0aW9uZXJVbnNhZmUob2xkUGFydGl0aW9uZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG92ZXJyaWRlV2l0aEdhcmJhZ2UoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBCeXRlQnVmZmVyIGtleTEsIEJ5dGVCdWZmZXIga2V5MikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBvdmVycmlkZVdpdGhHYXJiYWdlKHNzdGFibGUsIGtleTEsIGtleTIsIChieXRlKSAneicpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvdmVycmlkZVdpdGhHYXJiYWdlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgQnl0ZUJ1ZmZlciBrZXkxLCBCeXRlQnVmZmVyIGtleTIsIGJ5dGUganVuaykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBib29sZWFuIGNvbXByZXNzaW9uID0gc3N0YWJsZS5tZXRhZGF0YSgpLnBhcmFtcy5jb21wcmVzc2lvbi5pc0VuYWJsZWQoKTsKKyAgICAgICAgbG9uZyBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbjsKKworICAgICAgICBpZiAoY29tcHJlc3Npb24pCisgICAgICAgIHsgLy8gb3ZlcndyaXRlIHdpdGggZ2FyYmFnZSB0aGUgY29tcHJlc3Npb24gY2h1bmtzIGZyb20ga2V5MSB0byBrZXkyCisgICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXBEYXRhID0gQ29tcHJlc3Npb25JbmZvQ29tcG9uZW50LmxvYWQoc3N0YWJsZS5kZXNjcmlwdG9yKTsKKworICAgICAgICAgICAgQ29tcHJlc3Npb25NZXRhZGF0YS5DaHVuayBjaHVuazEgPSBjb21wRGF0YS5jaHVua0ZvcigKKyAgICAgICAgICAgIHNzdGFibGUuZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24uRm9yS2V5LmdldChrZXkxLCBzc3RhYmxlLmdldFBhcnRpdGlvbmVyKCkpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKSk7CisgICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhLkNodW5rIGNodW5rMiA9IGNvbXBEYXRhLmNodW5rRm9yKAorICAgICAgICAgICAgc3N0YWJsZS5nZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KGtleTIsIHNzdGFibGUuZ2V0UGFydGl0aW9uZXIoKSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpKTsKKworICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IE1hdGgubWluKGNodW5rMS5vZmZzZXQsIGNodW5rMi5vZmZzZXQpOworICAgICAgICAgICAgZW5kUG9zaXRpb24gPSBNYXRoLm1heChjaHVuazEub2Zmc2V0ICsgY2h1bmsxLmxlbmd0aCwgY2h1bmsyLm9mZnNldCArIGNodW5rMi5sZW5ndGgpOworCisgICAgICAgICAgICBjb21wRGF0YS5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAvLyBvdmVyd3JpdGUgd2l0aCBnYXJiYWdlIGZyb20ga2V5MSB0byBrZXkyCisgICAgICAgICAgICBsb25nIHJvdzBTdGFydCA9IHNzdGFibGUuZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24uRm9yS2V5LmdldChrZXkxLCBzc3RhYmxlLmdldFBhcnRpdGlvbmVyKCkpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKTsKKyAgICAgICAgICAgIGxvbmcgcm93MVN0YXJ0ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KGtleTIsIHNzdGFibGUuZ2V0UGFydGl0aW9uZXIoKSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOworICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IE1hdGgubWluKHJvdzBTdGFydCwgcm93MVN0YXJ0KTsKKyAgICAgICAgICAgIGVuZFBvc2l0aW9uID0gTWF0aC5tYXgocm93MFN0YXJ0LCByb3cxU3RhcnQpOworICAgICAgICB9CisKKyAgICAgICAgb3ZlcnJpZGVXaXRoR2FyYmFnZShzc3RhYmxlLCBzdGFydFBvc2l0aW9uLCBlbmRQb3NpdGlvbiwganVuayk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBvdmVycmlkZVdpdGhHYXJiYWdlKFNTVGFibGVSZWFkZXIgc3N0YWJsZSwgbG9uZyBzdGFydFBvc2l0aW9uLCBsb25nIGVuZFBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZSwgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24sIChieXRlKSAneicpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgb3ZlcnJpZGVXaXRoR2FyYmFnZShTU1RhYmxlUmVhZGVyIHNzdGFibGUsIGxvbmcgc3RhcnRQb3NpdGlvbiwgbG9uZyBlbmRQb3NpdGlvbiwgYnl0ZSBqdW5rKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIG92ZXJyaWRlV2l0aEdhcmJhZ2Uoc3N0YWJsZS5nZXREYXRhQ2hhbm5lbCgpLmZpbGUoKSwgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24sIGp1bmspOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgb3ZlcnJpZGVXaXRoR2FyYmFnZShGaWxlIHBhdGgsIGxvbmcgc3RhcnRQb3NpdGlvbiwgbG9uZyBlbmRQb3NpdGlvbiwgYnl0ZSBqdW5rKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzRmlsZSBmaWxlID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUocGF0aC50b0phdmFJT0ZpbGUoKSwgInJ3IikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGUuc2VlayhzdGFydFBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSAoaW50KSAoZW5kUG9zaXRpb24gLSBzdGFydFBvc2l0aW9uKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbbGVuZ3RoXTsKKyAgICAgICAgICAgIEFycmF5cy5maWxsKGJ1ZmYsIGp1bmspOworICAgICAgICAgICAgZmlsZS53cml0ZShidWZmLCAwLCBsZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmIChDaHVua0NhY2hlLmluc3RhbmNlICE9IG51bGwpCisgICAgICAgICAgICBDaHVua0NhY2hlLmluc3RhbmNlLmludmFsaWRhdGVGaWxlKHBhdGgudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydE9yZGVyZWRBbGwoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgZXhwZWN0ZWRTaXplKQorICAgIHsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZChVdGlsLmNtZChjZnMpLmJ1aWxkKCksIGV4cGVjdGVkU2l6ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRPcmRlcmVkKFJlYWRDb21tYW5kIGNtZCwgaW50IGV4cGVjdGVkU2l6ZSkKKyAgICB7CisgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgRGVjb3JhdGVkS2V5IHByZXYgPSBudWxsOworICAgICAgICBsb2dnZXIuaW5mbygiUmVhZGluZyBkYXRhIGZyb20gIiArIGNtZCk7CisgICAgICAgIGZvciAoUGFydGl0aW9uIHBhcnRpdGlvbiA6IFV0aWwuZ2V0QWxsVW5maWx0ZXJlZChjbWQpKQorICAgICAgICB7CisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgY3VycmVudCA9IHBhcnRpdGlvbi5wYXJ0aXRpb25LZXkoKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJSZWFkICIgKyBjdXJyZW50LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKCEocHJldiA9PSBudWxsIHx8IHByZXYuY29tcGFyZVRvKGN1cnJlbnQpIDwgMCkpCisgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCJrZXkgIiArIGN1cnJlbnQgKyAiIGRvZXMgbm90IHNvcnQgYWZ0ZXIgcHJldmlvdXMga2V5ICIgKyBwcmV2KTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoImtleSAiICsgY3VycmVudCArICIgZG9lcyBub3Qgc29ydCBhZnRlciBwcmV2aW91cyBrZXkgIiArIHByZXYsIHByZXYgPT0gbnVsbCB8fCBwcmV2LmNvbXBhcmVUbyhjdXJyZW50KSA8IDApOworICAgICAgICAgICAgcHJldiA9IGN1cnJlbnQ7CisgICAgICAgICAgICArK3NpemU7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU2l6ZSwgc2l6ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGxDRihDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGludCBwYXJ0aXRpb25zUGVyU1NUYWJsZSkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9uc1BlclNTVGFibGU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSA9IFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmcy5tZXRhZGF0YSgpLCBTdHJpbmcudmFsdWVPZihpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1JvdygicjEiKS5hZGQoInZhbCIsICIxIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1JvdygicjEiKS5hZGQoInZhbCIsICIxIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIG5ldyBNdXRhdGlvbih1cGRhdGUpLmFwcGx5VW5zYWZlKCk7CisgICAgICAgIH0KKworICAgICAgICBVdGlsLmZsdXNoKGNmcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbGxJbmRleENGKENvbHVtbkZhbWlseVN0b3JlIGNmcywgYm9vbGVhbiBjb21wb3NpdGUsIGxvbmcuLi4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHZhbHVlcy5sZW5ndGggJSAyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpICs9IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFVwZGF0ZUJ1aWxkZXIgYnVpbGRlciA9IFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmcy5tZXRhZGF0YSgpLCBTdHJpbmcudmFsdWVPZihpKSk7CisgICAgICAgICAgICBpZiAoY29tcG9zaXRlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIubmV3Um93KCJjIiArIGkpCisgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoQ09MX0lOREVYLCB2YWx1ZXNbaV0pCisgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoQ09MX05PTl9JTkRFWCwgdmFsdWVzW2kgKyAxXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5uZXdSb3coKQorICAgICAgICAgICAgICAgICAgICAgICAuYWRkKENPTF9JTkRFWCwgdmFsdWVzW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAuYWRkKENPTF9OT05fSU5ERVgsIHZhbHVlc1tpICsgMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3IE11dGF0aW9uKGJ1aWxkZXIuYnVpbGQoKSkuYXBwbHlVbnNhZmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGZpbGxDb3VudGVyQ0YoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgcGFydGl0aW9uc1BlclNTVGFibGUpIHRocm93cyBXcml0ZVRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFNvcnRlZFNldDxTdHJpbmc+IHRva2VuU29ydGVkID0gU2V0cy5uZXdUcmVlU2V0KENvbXBhcmF0b3IuY29tcGFyaW5nKGEgLT4gY2ZzLmdldFBhcnRpdGlvbmVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoYSkpKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9uc1BlclNTVGFibGU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGkgPCAxMCkKKyAgICAgICAgICAgICAgICBVbmludGVycnVwdGlibGVzLnNsZWVwVW5pbnRlcnJ1cHRpYmx5KDEwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgUGFydGl0aW9uVXBkYXRlIHVwZGF0ZSA9IFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmcy5tZXRhZGF0YSgpLCBTdHJpbmcudmFsdWVPZihpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1JvdygicjEiKS5hZGQoInZhbCIsIDEwMEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgdG9rZW5Tb3J0ZWQuYWRkKFN0cmluZy52YWx1ZU9mKGkpKTsKKyAgICAgICAgICAgIG5ldyBDb3VudGVyTXV0YXRpb24obmV3IE11dGF0aW9uKHVwZGF0ZSksIENvbnNpc3RlbmN5TGV2ZWwuT05FKS5hcHBseSgpOworICAgICAgICB9CisKKyAgICAgICAgVXRpbC5mbHVzaChjZnMpOworCisgICAgICAgIHJldHVybiB0b2tlblNvcnRlZC50b0FycmF5KEFycmF5VXRpbHMuRU1QVFlfU1RSSU5HX0FSUkFZKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1YkNvbHVtblZhbGlkYXRpb24oKSB0aHJvd3MgUmVxdWVzdEV4ZWN1dGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUXVlcnlQcm9jZXNzb3IucHJvY2VzcyhTdHJpbmcuZm9ybWF0KCJDUkVBVEUgVEFCTEUgXCIlc1wiLnRlc3RfY29tcGFjdF9zdGF0aWNfY29sdW1ucyAoYSBiaWdpbnQsIGIgdGltZXV1aWQsIGMgYm9vbGVhbiBzdGF0aWMsIGQgdGV4dCwgUFJJTUFSWSBLRVkgKGEsIGIpKSIsIGtzTmFtZSksIENvbnNpc3RlbmN5TGV2ZWwuT05FKTsKKworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgidGVzdF9jb21wYWN0X3N0YXRpY19jb2x1bW5zIik7CisKKyAgICAgICAgUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPIFwiJXNcIi50ZXN0X2NvbXBhY3Rfc3RhdGljX2NvbHVtbnMgKGEsIGIsIGMsIGQpIFZBTFVFUyAoMTIzLCBjM2RiMDdlOC1iNjAyLTExZTMtYmM2Yi1lMGI5YTU0YTZkOTMsIHRydWUsICdmb29iYXInKSIsIGtzTmFtZSkpOworICAgICAgICBVdGlsLmZsdXNoKGNmcyk7CisgICAgICAgIHBlcmZvcm1TY3J1YihjZnMsIGZhbHNlLCB0cnVlLCBmYWxzZSwgMik7CisKKyAgICAgICAgUXVlcnlQcm9jZXNzb3IucHJvY2VzcyhTdHJpbmcuZm9ybWF0KCJDUkVBVEUgVEFCTEUgXCIlc1wiLnRlc3Rfc2NydWJfdmFsaWRhdGlvbiAoYSB0ZXh0IHByaW1hcnkga2V5LCBiIGludCkiLCBrc05hbWUpLCBDb25zaXN0ZW5jeUxldmVsLk9ORSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmczIgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgidGVzdF9zY3J1Yl92YWxpZGF0aW9uIik7CisKKyAgICAgICAgbmV3IE11dGF0aW9uKFVwZGF0ZUJ1aWxkZXIuY3JlYXRlKGNmczIubWV0YWRhdGEoKSwgImtleSIpLm5ld1JvdygpLmFkZCgiYiIsIEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMSkpLmJ1aWxkKCkpLmFwcGx5KCk7CisgICAgICAgIFV0aWwuZmx1c2goY2ZzMik7CisKKyAgICAgICAgcGVyZm9ybVNjcnViKGNmczIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvciBDQVNTQU5EUkEtNjg5MiB0b28sIGNoZWNrIHRoYXQgZm9yIGEgY29tcGFjdCB0YWJsZSB3aXRoIG9uZSBjbHVzdGVyIGNvbHVtbiwgd2UgY2FuIGluc2VydCB3aGF0ZXZlcgorICAgICAqIHdlIHdhbnQgYXMgdmFsdWUgZm9yIHRoZSBjbHVzdGVyaW5nIGNvbHVtbiwgaW5jbHVkaW5nIHNvbWV0aGluZyB0aGF0IHdvdWxkIGNvbmZsaWN0IHdpdGggYSBDUUwgY29sdW1uIGRlZmluaXRpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbkNvbXBhY3RTdG9yYWdlKCkKKyAgICB7CisgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLnByb2Nlc3MoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIFRBQkxFIFwiJXNcIi50ZXN0X2NvbXBhY3RfZHluYW1pY19jb2x1bW5zIChhIGludCwgYiB0ZXh0LCBjIHRleHQsIFBSSU1BUlkgS0VZIChhLCBiKSkgV0lUSCBDT01QQUNUIFNUT1JBR0UiLCBrc05hbWUpLCBDb25zaXN0ZW5jeUxldmVsLk9ORSk7CisKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoInRlc3RfY29tcGFjdF9keW5hbWljX2NvbHVtbnMiKTsKKworICAgICAgICBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gXCIlc1wiLnRlc3RfY29tcGFjdF9keW5hbWljX2NvbHVtbnMgKGEsIGIsIGMpIFZBTFVFUyAoMCwgJ2EnLCAnZm9vJykiLCBrc05hbWUpKTsKKyAgICAgICAgUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPIFwiJXNcIi50ZXN0X2NvbXBhY3RfZHluYW1pY19jb2x1bW5zIChhLCBiLCBjKSBWQUxVRVMgKDAsICdiJywgJ2JhcicpIiwga3NOYW1lKSk7CisgICAgICAgIFF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVJbnRlcm5hbChTdHJpbmcuZm9ybWF0KCJJTlNFUlQgSU5UTyBcIiVzXCIudGVzdF9jb21wYWN0X2R5bmFtaWNfY29sdW1ucyAoYSwgYiwgYykgVkFMVUVTICgwLCAnYycsICdib28nKSIsIGtzTmFtZSkpOworICAgICAgICBVdGlsLmZsdXNoKGNmcyk7CisgICAgICAgIHBlcmZvcm1TY3J1YihjZnMsIHRydWUsIHRydWUsIGZhbHNlLCAyKTsKKworICAgICAgICAvLyBTY3J1YiBpcyBzaWxlbnQsIGJ1dCBpdCB3aWxsIHJlbW92ZSBicm9rZW4gcmVjb3Jkcy4gU28gcmVhZGluZyBldmVyeXRoaW5nIGJhY2sgdG8gbWFrZSBzdXJlIG5vdGhpbmcgdG8gInNjcnViYmVkIGF3YXkiCisgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcnMgPSBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiU0VMRUNUICogRlJPTSBcIiVzXCIudGVzdF9jb21wYWN0X2R5bmFtaWNfY29sdW1ucyIsIGtzTmFtZSkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJzLnNpemUoKSk7CisKKyAgICAgICAgSXRlcmF0b3I8VW50eXBlZFJlc3VsdFNldC5Sb3c+IGl0ZXIgPSBycy5pdGVyYXRvcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIGl0ZXIubmV4dCgpLmdldFN0cmluZygiYyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBpdGVyLm5leHQoKS5nZXRTdHJpbmcoImMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYm9vIiwgaXRlci5uZXh0KCkuZ2V0U3RyaW5nKCJjIikpOworICAgIH0KKworICAgIEBUZXN0IC8qIENBU1NBTkRSQS01MTc0ICovCisgICAgcHVibGljIHZvaWQgdGVzdFNjcnViS2V5c0luZGV4X3ByZXNlcnZlT3JkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vSWYgdGhlIHBhcnRpdGlvbmVyIHByZXNlcnZlcyB0aGUgb3JkZXIgdGhlbiBTZWNvbmRhcnlJbmRleCB1c2VzIEJ5dGVzVHlwZSBjb21wYXJhdG9yLAorICAgICAgICAvLyBvdGhlcndpc2UgaXQgdXNlcyBMb2NhbEJ5UGFydGl0aW9uZXJUeXBlCisgICAgICAgIHRlc3RTY3J1YkluZGV4KENGX0lOREVYMV9CWVRFT1JERVJFRCwgQ09MX0lOREVYLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJDb21wb3NpdGVJbmRleF9wcmVzZXJ2ZU9yZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0U2NydWJJbmRleChDRl9JTkRFWDJfQllURU9SREVSRUQsIENPTF9JTkRFWCwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJLZXlzSW5kZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRlc3RTY3J1YkluZGV4KENGX0lOREVYMSwgQ09MX0lOREVYLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJDb21wb3NpdGVJbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdFNjcnViSW5kZXgoQ0ZfSU5ERVgyLCBDT0xfSU5ERVgsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0IC8qIENBU1NBTkRSQS01MTc0ICovCisgICAgcHVibGljIHZvaWQgdGVzdEZhaWxTY3J1YktleXNJbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdFNjcnViSW5kZXgoQ0ZfSU5ERVgxLCBDT0xfSU5ERVgsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbFNjcnViQ29tcG9zaXRlSW5kZXgoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRlc3RTY3J1YkluZGV4KENGX0lOREVYMiwgQ09MX0lOREVYLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QgLyogQ0FTU0FORFJBLTUxNzQgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NydWJUd2ljZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdFNjcnViSW5kZXgoQ0ZfSU5ERVgyLCBDT0xfSU5ERVgsIHRydWUsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJTYW1lUGFyYW1ldGVyVmFsdWUiKQorICAgIHByaXZhdGUgdm9pZCB0ZXN0U2NydWJJbmRleChTdHJpbmcgY2ZOYW1lLCBTdHJpbmcgY29sTmFtZSwgYm9vbGVhbiBjb21wb3NpdGUsIGJvb2xlYW4uLi4gc2NydWJzKQorICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKGNmTmFtZSk7CisKKyAgICAgICAgaW50IG51bVJvd3MgPSAxMDAwOworICAgICAgICBsb25nW10gY29sVmFsdWVzID0gbmV3IGxvbmdbbnVtUm93cyAqIDJdOyAvLyBlYWNoIHJvdyBoYXMgdHdvIGNvbHVtbnMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2xWYWx1ZXMubGVuZ3RoOyBpICs9IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbFZhbHVlc1tpXSA9IChpICUgNCA9PSAwID8gMUwgOiAyTCk7IC8vIGluZGV4IGNvbHVtbgorICAgICAgICAgICAgY29sVmFsdWVzW2kgKyAxXSA9IDNMOyAvL290aGVyIGNvbHVtbgorICAgICAgICB9CisgICAgICAgIGZpbGxJbmRleENGKGNmcywgY29tcG9zaXRlLCBjb2xWYWx1ZXMpOworCisgICAgICAgIC8vIGNoZWNrIGluZGV4CisKKyAgICAgICAgYXNzZXJ0T3JkZXJlZChVdGlsLmNtZChjZnMpLmZpbHRlck9uKGNvbE5hbWUsIE9wZXJhdG9yLkVRLCAxTCkuYnVpbGQoKSwgbnVtUm93cyAvIDIpOworCisgICAgICAgIC8vIHNjcnViIGluZGV4CisgICAgICAgIFNldDxDb2x1bW5GYW1pbHlTdG9yZT4gaW5kZXhDZnNzID0gY2ZzLmluZGV4TWFuYWdlci5nZXRBbGxJbmRleENvbHVtbkZhbWlseVN0b3JlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW5kZXhDZnNzLnNpemUoKSk7CisgICAgICAgIGZvciAoQ29sdW1uRmFtaWx5U3RvcmUgaW5kZXhDZnMgOiBpbmRleENmc3MpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2NydWJzLmxlbmd0aDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gZmFpbHVyZSA9ICFzY3J1YnNbaV07CisgICAgICAgICAgICAgICAgaWYgKGZhaWx1cmUpCisgICAgICAgICAgICAgICAgeyAvL21ha2Ugc3VyZSB0aGUgbmV4dCBzY3J1YiBmYWlscworICAgICAgICAgICAgICAgICAgICBvdmVycmlkZVdpdGhHYXJiYWdlKGluZGV4Q2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygxTCksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKDJMKSwgKGJ5dGUpIDB4N0EpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMgcmVzdWx0ID0gaW5kZXhDZnMuc2NydWIoZmFsc2UsIHRydWUsIElTY3J1YmJlci5vcHRpb25zKCkuYnVpbGQoKSwgMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhaWx1cmUgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5BbGxTU1RhYmxlT3BTdGF0dXMuQUJPUlRFRCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cy5TVUNDRVNTRlVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvLyBjaGVjayBpbmRleCBpcyBzdGlsbCB3b3JraW5nCisgICAgICAgIGFzc2VydE9yZGVyZWQoVXRpbC5jbWQoY2ZzKS5maWx0ZXJPbihjb2xOYW1lLCBPcGVyYXRvci5FUSwgMUwpLmJ1aWxkKCksIG51bVJvd3MgLyAyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTU1RhYmxlTXVsdGlXcml0ZXIgY3JlYXRlVGVzdFdyaXRlcihEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGxvbmcga2V5Q291bnQsIENvbHVtbkZhbWlseVN0b3JlIGNmcywgTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuKQorICAgIHsKKyAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBuZXcgU2VyaWFsaXphdGlvbkhlYWRlcih0cnVlLCBjZnMubWV0YWRhdGEoKSwgY2ZzLm1ldGFkYXRhKCkucmVndWxhckFuZFN0YXRpY0NvbHVtbnMoKSwgRW5jb2RpbmdTdGF0cy5OT19TVEFUUyk7CisgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3RvcihjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yKS5zc3RhYmxlTGV2ZWwoMCk7CisgICAgICAgIFNTVGFibGVXcml0ZXIgd3JpdGVyID0gZGVzY3JpcHRvci5nZXRGb3JtYXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0V3JpdGVyRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZGVyKGRlc2NyaXB0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRLZXlDb3VudChrZXlDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFJlcGFpcmVkQXQoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBlbmRpbmdSZXBhaXIobnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRyYW5zaWVudFNTVGFibGUoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUYWJsZU1ldGFkYXRhUmVmKGNmcy5tZXRhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1ldGFkYXRhQ29sbGVjdG9yKGNvbGxlY3RvcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNlcmlhbGl6YXRpb25IZWFkZXIoaGVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Rmx1c2hPYnNlcnZlcnMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGREZWZhdWx0Q29tcG9uZW50cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCh0eG4sIGNmcyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0TXVsdGlXcml0ZXIod3JpdGVyLCB0eG4pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RNdWx0aVdyaXRlciBleHRlbmRzIFNpbXBsZVNTVGFibGVNdWx0aVdyaXRlcgorICAgIHsKKyAgICAgICAgVGVzdE11bHRpV3JpdGVyKFNTVGFibGVXcml0ZXIgd3JpdGVyLCBMaWZlY3ljbGVOZXdUcmFja2VyIGxpZmVjeWNsZU5ld1RyYWNrZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHdyaXRlciwgbGlmZWN5Y2xlTmV3VHJhY2tlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aXRoIGludmFsaWQgc3N0YWJsZXMgKGNvbnRhaW5pbmcgZHVwbGljYXRlIGVudHJpZXMgaW4gMi4wIGFuZCAzLjAgc3RvcmFnZSBmb3JtYXQpLAorICAgICAqIHRoYXQgd2VyZSBjYXVzZWQgYnkgdXBncmFkaW5nIGZyb20gMi54IHdpdGggZHVwbGljYXRlIHJhbmdlIHRvbWJzdG9uZXMuCisgICAgICogPHA+CisgICAgICogU2VlIENBU1NBTkRSQS0xMjE0NCBmb3IgZGV0YWlscy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJPdXREdXBsaWNhdGVzKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoQmlnRm9ybWF0LmlzU2VsZWN0ZWQoKSk7CisKKyAgICAgICAgSVBhcnRpdGlvbmVyIG9sZFBhcnQgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0UGFydGl0aW9uZXIoKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRQYXJ0aXRpb25lclVuc2FmZShNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UpOworICAgICAgICAgICAgUXVlcnlQcm9jZXNzb3IucHJvY2VzcyhTdHJpbmcuZm9ybWF0KCJDUkVBVEUgVEFCTEUgXCIlc1wiLmNmX3dpdGhfZHVwbGljYXRlc18zXzAgKGEgaW50LCBiIGludCwgYyBpbnQsIFBSSU1BUlkgS0VZIChhLCBiKSkiLCBrc05hbWUpLCBDb25zaXN0ZW5jeUxldmVsLk9ORSk7CisKKyAgICAgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKCJjZl93aXRoX2R1cGxpY2F0ZXNfM18wIik7CisKKyAgICAgICAgICAgIFBhdGggbGVnYWN5U1NUYWJsZVJvb3QgPSBQYXRocy5nZXQoVEVTVF9JTlZBTElEX0xFR0FDWV9TU1RBQkxFX1JPT1QuZ2V0U3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXlzcGFjZTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2Zfd2l0aF9kdXBsaWNhdGVzXzNfMCIpOworCisgICAgICAgICAgICBmb3IgKFN0cmluZyBmaWxlbmFtZSA6IG5ldyBTdHJpbmdbXXsgIm1iLTMtYmlnLUNvbXByZXNzaW9uSW5mby5kYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iLTMtYmlnLURpZ2VzdC5jcmMzMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iLTMtYmlnLUluZGV4LmRiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWItMy1iaWctU3VtbWFyeS5kYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1iLTMtYmlnLURhdGEuZGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYi0zLWJpZy1GaWx0ZXIuZGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYi0zLWJpZy1TdGF0aXN0aWNzLmRiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWItMy1iaWctVE9DLnR4dCIgfSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlcy5jb3B5KFBhdGhzLmdldChsZWdhY3lTU1RhYmxlUm9vdC50b1N0cmluZygpLCBmaWxlbmFtZSksIGNmcy5nZXREaXJlY3RvcmllcygpLmdldERpcmVjdG9yeUZvck5ld1NTVGFibGVzKCkudG9QYXRoKCkucmVzb2x2ZShmaWxlbmFtZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjZnMubG9hZE5ld1NTVGFibGVzKCk7CisKKyAgICAgICAgICAgIGNmcy5zY3J1Yih0cnVlLCBmYWxzZSwgSVNjcnViYmVyLm9wdGlvbnMoKS5za2lwQ29ycnVwdGVkKCkuYnVpbGQoKSwgMSk7CisKKyAgICAgICAgICAgIFVudHlwZWRSZXN1bHRTZXQgcnMgPSBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiU0VMRUNUICogRlJPTSBcIiVzXCIuY2Zfd2l0aF9kdXBsaWNhdGVzXzNfMCIsIGtzTmFtZSkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChycyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcnMuc2l6ZSgpKTsKKworICAgICAgICAgICAgUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsKFN0cmluZy5mb3JtYXQoIkRFTEVURSBGUk9NIFwiJXNcIi5jZl93aXRoX2R1cGxpY2F0ZXNfM18wIFdIRVJFIGE9MSBBTkQgYiA9MiIsIGtzTmFtZSkpOworICAgICAgICAgICAgcnMgPSBRdWVyeVByb2Nlc3Nvci5leGVjdXRlSW50ZXJuYWwoU3RyaW5nLmZvcm1hdCgiU0VMRUNUICogRlJPTSBcIiVzXCIuY2Zfd2l0aF9kdXBsaWNhdGVzXzNfMCIsIGtzTmFtZSkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChycyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcnMuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRQYXJ0aXRpb25lclVuc2FmZShvbGRQYXJ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENvbXBhY3Rpb25NYW5hZ2VyLkFsbFNTVGFibGVPcFN0YXR1cyBwZXJmb3JtU2NydWIoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBib29sZWFuIHNraXBDb3JydXB0ZWQsIGJvb2xlYW4gY2hlY2tEYXRhLCBib29sZWFuIHJlaW5zZXJ0T3ZlcmZsb3dlZFRUTCwgaW50IGpvYnMpCisgICAgeworICAgICAgICBJU2NydWJiZXIuT3B0aW9ucyBvcHRpb25zID0gSVNjcnViYmVyLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNraXBDb3JydXB0ZWQoc2tpcENvcnJ1cHRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jaGVja0RhdGEoY2hlY2tEYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlaW5zZXJ0T3ZlcmZsb3dlZFRUTFJvd3MocmVpbnNlcnRPdmVyZmxvd2VkVFRMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIHJldHVybiBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5wZXJmb3JtU2NydWIoY2ZzLCBvcHRpb25zLCBqb2JzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9WZXJpZnlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9WZXJpZnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiYmUwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1ZlcmlmeVRlc3QuamF2YQpAQCAtMCwwICsxLDg0NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7CitpbXBvcnQgamF2YS51dGlsLnppcC5DaGVja2VkSW5wdXRTdHJlYW07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkNoYXJzZXRzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmJhdGNobG9nLkJhdGNoOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmJhdGNobG9nLkJhdGNobG9nTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5DaHVua0NhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQnVmZmVyRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVVJRFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLldyaXRlVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5GU1dyaXRlRXJyb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyV2l0aEZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Tb3J0ZWRUYWJsZVZlcmlmaWVyLlJhbmdlT3duSGVscGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5CdGlGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlRva2VuTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNvbXByZXNzaW9uUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk91dHB1dEhhbmRsZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLmNvdW50ZXJDRk1EOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2U7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5sb2FkU2NoZW1hOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGVzdCBmb3Ige0BsaW5rIElWZXJpZmllcn0uCisgKiA8cD4KKyAqIE5vdGU6IHRoZSBjb21wbGV0ZSBjb3ZlcmFnZSBpcyBjb21wb3NlZCBvZjoKKyAqIC0ge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlN0YW5kYWxvbmVWZXJpZmllck9uU1NUYWJsZXNUZXN0fQorICogLSB7QGxpbmsgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuU3RhbmRhbG9uZVZlcmlmaWVyVGVzdH0KKyAqIC0ge0BsaW5rIFZlcmlmeVRlc3R9CisgKi8KK3B1YmxpYyBjbGFzcyBWZXJpZnlUZXN0Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFZlcmlmeVRlc3QuY2xhc3MpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UgPSAiS2V5c3BhY2UxIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRiA9ICJTdGFuZGFyZDEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGMiA9ICJTdGFuZGFyZDIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGMyA9ICJTdGFuZGFyZDMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGNCA9ICJTdGFuZGFyZDQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5URVJfQ0YgPSAiQ291bnRlcjEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPVU5URVJfQ0YyID0gIkNvdW50ZXIyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1VOVEVSX0NGMyA9ICJDb3VudGVyMyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlRFUl9DRjQgPSAiQ291bnRlcjQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUlJVUFRfQ0YgPSAiQ29ycnVwdDEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUlJVUFRfQ0YyID0gIkNvcnJ1cHQyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT1JSVVBUQ09VTlRFUl9DRiA9ICJDb3VudGVyQ29ycnVwdDEiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUlJVUFRDT1VOVEVSX0NGMiA9ICJDb3VudGVyQ29ycnVwdDIiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfVVVJRCA9ICJVVUlES2V5cyI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkZfQUxXQVlTX1BSRVNFTlQgPSAiQmZBbHdheXNQcmVzZW50IjsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ29tcHJlc3Npb25QYXJhbXMgY29tcHJlc3Npb25QYXJhbWV0ZXJzID0gQ29tcHJlc3Npb25QYXJhbXMuc25hcHB5KDMyNzY4KTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleFNpemVJbktpQigwKTsKKworICAgICAgICBsb2FkU2NoZW1hKCk7CisgICAgICAgIGNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCisgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChLRVlTUEFDRSwgQ0YpLmNvbXByZXNzaW9uKGNvbXByZXNzaW9uUGFyYW1ldGVycyksCisgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChLRVlTUEFDRSwgQ0YyKS5jb21wcmVzc2lvbihjb21wcmVzc2lvblBhcmFtZXRlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoS0VZU1BBQ0UsIENGMyksCisgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChLRVlTUEFDRSwgQ0Y0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRDRk1EKEtFWVNQQUNFLCBDT1JSVVBUX0NGKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRDRk1EKEtFWVNQQUNFLCBDT1JSVVBUX0NGMiksCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKEtFWVNQQUNFLCBDT1VOVEVSX0NGKS5jb21wcmVzc2lvbihjb21wcmVzc2lvblBhcmFtZXRlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyQ0ZNRChLRVlTUEFDRSwgQ09VTlRFUl9DRjIpLmNvbXByZXNzaW9uKGNvbXByZXNzaW9uUGFyYW1ldGVycyksCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKEtFWVNQQUNFLCBDT1VOVEVSX0NGMyksCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKEtFWVNQQUNFLCBDT1VOVEVSX0NGNCksCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKEtFWVNQQUNFLCBDT1JSVVBUQ09VTlRFUl9DRiksCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDRk1EKEtFWVNQQUNFLCBDT1JSVVBUQ09VTlRFUl9DRjIpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZENGTUQoS0VZU1BBQ0UsIENGX1VVSUQsIDAsIFVVSURUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRDRk1EKEtFWVNQQUNFLCBCRl9BTFdBWVNfUFJFU0VOVCkuYmxvb21GaWx0ZXJGcENoYW5jZSgxLjApKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUNvcnJlY3QoKQorICAgIHsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKKworICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlDb3VudGVyQ29ycmVjdCgpCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09VTlRFUl9DRik7CisKKyAgICAgICAgZmlsbENvdW50ZXJDRihjZnMsIDIpOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbmRlZFZlcmlmeUNvcnJlY3QoKQorICAgIHsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGMik7CisKKyAgICAgICAgZmlsbENGKGNmcywgMik7CisKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICB0cnkgKElWZXJpZmllciB2ZXJpZmllciA9IHNzdGFibGUuZ2V0VmVyaWZpZXIoY2ZzLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgZmFsc2UsIElWZXJpZmllci5vcHRpb25zKCkuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kodHJ1ZSkuYnVpbGQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBlcnIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4dGVuZGVkVmVyaWZ5Q291bnRlckNvcnJlY3QoKQorICAgIHsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPVU5URVJfQ0YyKTsKKworICAgICAgICBmaWxsQ291bnRlckNGKGNmcywgMik7CisKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworCisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5leHRlbmRlZFZlcmlmaWNhdGlvbih0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikKKyAgICAgICAgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5Q29ycmVjdFVuY29tcHJlc3NlZCgpCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YzKTsKKworICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlDb3VudGVyQ29ycmVjdFVuY29tcHJlc3NlZCgpCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09VTlRFUl9DRjMpOworCisgICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCAyKTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbmRlZFZlcmlmeUNvcnJlY3RVbmNvbXByZXNzZWQoKQorICAgIHsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGNCk7CisKKyAgICAgICAgZmlsbENGKGNmcywgMik7CisKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworCisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5leHRlbmRlZFZlcmlmaWNhdGlvbih0cnVlKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGVycikKKyAgICAgICAgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5kZWRWZXJpZnlDb3VudGVyQ29ycmVjdFVuY29tcHJlc3NlZCgpCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09VTlRFUl9DRjQpOworCisgICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCAyKTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmV4dGVuZGVkVmVyaWZpY2F0aW9uKHRydWUpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIik7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUluY29ycmVjdERpZ2VzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09SUlVQVF9DRik7CisKKyAgICAgICAgZmlsbENGKGNmcywgMik7CisKKyAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoY2ZzKS5idWlsZCgpKTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKworICAgICAgICB0cnkgKFJhbmRvbUFjY2Vzc1JlYWRlciBmaWxlID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4oc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5ESUdFU1QpKSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBjb3JyZWN0Q2hlY2tzdW0gPSBmaWxlLnJlYWRMb25nKCk7CisKKyAgICAgICAgICAgIHdyaXRlQ2hlY2tzdW0oKytjb3JyZWN0Q2hlY2tzdW0sIHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRElHRVNUKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgKElWZXJpZmllciB2ZXJpZmllciA9IHNzdGFibGUuZ2V0VmVyaWZpZXIoY2ZzLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgZmFsc2UsIElWZXJpZmllci5vcHRpb25zKCkuaW52b2tlRGlza0ZhaWx1cmVQb2xpY3kodHJ1ZSkuYnVpbGQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB0byBiZSB0aHJvd24iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXhwZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeShmYWxzZSkuYnVpbGQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBSdW50aW1lRXhjZXB0aW9uIHRvIGJlIHRocm93biIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4cGVjdGVkKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeUNvcnJ1cHRSb3dDb3JyZWN0RGlnZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXcml0ZVRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1JSVVBUX0NGMik7CisKKyAgICAgICAgZmlsbENGKGNmcywgMik7CisKKyAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoY2ZzKS5idWlsZCgpKTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgLy8gb3ZlcndyaXRlIG9uZSByb3cgd2l0aCBnYXJiYWdlCisgICAgICAgIGxvbmcgcm93MFN0YXJ0ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIwIiksIGNmcy5nZXRQYXJ0aXRpb25lcigpKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGxvbmcgcm93MVN0YXJ0ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIxIiksIGNmcy5nZXRQYXJ0aXRpb25lcigpKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgIGxvbmcgc3RhcnRQb3NpdGlvbiA9IE1hdGgubWluKHJvdzBTdGFydCwgcm93MVN0YXJ0KTsKKyAgICAgICAgbG9uZyBlbmRQb3NpdGlvbiA9IE1hdGgubWF4KHJvdzBTdGFydCwgcm93MVN0YXJ0KTsKKworICAgICAgICB0cnkgKEZpbGVDaGFubmVsIGZpbGUgPSBuZXcgRmlsZShzc3RhYmxlLmdldEZpbGVuYW1lKCkpLm5ld1JlYWRXcml0ZUNoYW5uZWwoKSkgeworICAgICAgICAgICAgZmlsZS5wb3NpdGlvbihzdGFydFBvc2l0aW9uKTsKKyAgICAgICAgICAgIGZpbGUud3JpdGUoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoU3RyaW5nVXRpbHMucmVwZWF0KCd6JywgMikpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2h1bmtDYWNoZS5pbnN0YW5jZSAhPSBudWxsKQorICAgICAgICAgICAgQ2h1bmtDYWNoZS5pbnN0YW5jZS5pbnZhbGlkYXRlRmlsZShzc3RhYmxlLmdldEZpbGVuYW1lKCkpOworCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgRGlnZXN0IHRvIGhhdmUgdGhlIHJpZ2h0IENoZWNrc3VtCisgICAgICAgIHdyaXRlQ2hlY2tzdW0oc2ltcGxlRnVsbENoZWNrc3VtKHNzdGFibGUuZ2V0RmlsZW5hbWUoKSksIHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRElHRVNUKSk7CisKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBGaXJzdCBhIHNpbXBsZSB2ZXJpZnkgY2hlY2tpbmcgZGlnZXN0LCB3aGljaCBzaG91bGQgc3VjY2VlZAorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcigiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlcnIpOworICAgICAgICAgICAgICAgIGZhaWwoIlNpbXBsZSB2ZXJpZnkgc2hvdWxkIGhhdmUgc3VjY2VlZGVkIGFzIGRpZ2VzdCBtYXRjaGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmV4dGVuZGVkVmVyaWZpY2F0aW9uKHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBOb3cgdHJ5IGV4dGVuZGVkIHZlcmlmeQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGEgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlCcm9rZW5TU1RhYmxlTWV0YWRhdGEoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdyaXRlVGltZW91dEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENPUlJVUFRfQ0YyKTsKKyAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKKyAgICAgICAgZmlsbENGKGNmcywgMik7CisKKyAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoY2ZzKS5idWlsZCgpKTsKKworICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisKKyAgICAgICAgRmlsZUNoYW5uZWwgZmlsZSA9IHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuU1RBVFMpLm5ld1JlYWRXcml0ZUNoYW5uZWwoKTsKKyAgICAgICAgZmlsZS5wb3NpdGlvbigwKTsKKyAgICAgICAgZmlsZS53cml0ZShCeXRlQnVmZmVyVXRpbC5ieXRlcyhTdHJpbmdVdGlscy5yZXBlYXQoJ3onLCAyKSkpOworICAgICAgICBmaWxlLmNsb3NlKCk7CisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIHRvIGJlIHRocm93biIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBleHBlY3RlZCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeShmYWxzZSkuYnVpbGQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOworICAgICAgICAgICAgZmFpbCgiRXhwZWN0ZWQgYSBSdW50aW1lRXhjZXB0aW9uIHRvIGJlIHRocm93biIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiB1bmV4cGVjdGVkKQorICAgICAgICB7CisgICAgICAgICAgICBmYWlsKCJ3cm9uZyBleGNlcHRpb24gdGhyb3duIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhwZWN0ZWQpCisgICAgICAgIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeU11dGF0ZVJlcGFpclN0YXR1cygpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09SUlVQVF9DRjIpOworICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOworICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKKworICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMpLmJ1aWxkKCkpOworCisgICAgICAgIC8vIG1ha2UgdGhlIHNzdGFibGUgcmVwYWlyZWQ6CisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgc3N0YWJsZS5kZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLm11dGF0ZVJlcGFpck1ldGFkYXRhKHNzdGFibGUuZGVzY3JpcHRvciwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCksIHNzdGFibGUuZ2V0UGVuZGluZ1JlcGFpcigpLCBzc3RhYmxlLmlzVHJhbnNpZW50KCkpOworICAgICAgICBzc3RhYmxlLnJlbG9hZFNTVGFibGVNZXRhZGF0YSgpOworCisgICAgICAgIC8vIGJyZWFrIHRoZSBzc3RhYmxlOgorICAgICAgICBsb25nIGNvcnJlY3RDaGVja3N1bTsKKyAgICAgICAgdHJ5IChSYW5kb21BY2Nlc3NSZWFkZXIgZmlsZSA9IFJhbmRvbUFjY2Vzc1JlYWRlci5vcGVuKHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRElHRVNUKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvcnJlY3RDaGVja3N1bSA9IGZpbGUucmVhZExvbmcoKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZUNoZWNrc3VtKCsrY29ycmVjdENoZWNrc3VtLCBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRJR0VTVCkpOworICAgICAgICB0cnkgKElWZXJpZmllciB2ZXJpZmllciA9IHNzdGFibGUuZ2V0VmVyaWZpZXIoY2ZzLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgZmFsc2UsIElWZXJpZmllci5vcHRpb25zKCkubXV0YXRlUmVwYWlyU3RhdHVzKGZhbHNlKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIHRvIGJlIHRocm93biIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBleHBlY3RlZCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlLmlzUmVwYWlyZWQoKSk7CisKKyAgICAgICAgLy8gbm93IHRoZSByZXBhaXIgc3RhdHVzIHNob3VsZCBiZSBjaGFuZ2VkOgorICAgICAgICB0cnkgKElWZXJpZmllciB2ZXJpZmllciA9IHNzdGFibGUuZ2V0VmVyaWZpZXIoY2ZzLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgZmFsc2UsIElWZXJpZmllci5vcHRpb25zKCkubXV0YXRlUmVwYWlyU3RhdHVzKHRydWUpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGEgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGV4cGVjdGVkKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RmFsc2Uoc3N0YWJsZS5pc1JlcGFpcmVkKCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0T2ZSYW5nZVRva2VucygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOworICAgICAgICBmaWxsQ0YoY2ZzLCAxMDApOworICAgICAgICBUb2tlbk1ldGFkYXRhIHRtZCA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKTsKKyAgICAgICAgYnl0ZVtdIHRrMSA9IG5ldyBieXRlWzFdLCB0azIgPSBuZXcgYnl0ZVsxXTsKKyAgICAgICAgdGsxWzBdID0gMjsKKyAgICAgICAgdGsyWzBdID0gMTsKKyAgICAgICAgdG1kLnVwZGF0ZU5vcm1hbFRva2VuKG5ldyBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLkJ5dGVzVG9rZW4odGsxKSwgSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZSgiMTI3LjAuMC4xIikpOworICAgICAgICB0bWQudXBkYXRlTm9ybWFsVG9rZW4obmV3IEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuQnl0ZXNUb2tlbih0azIpLCBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKCIxMjcuMC4wLjIiKSk7CisKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICB0cnkgKElWZXJpZmllciB2ZXJpZmllciA9IHNzdGFibGUuZ2V0VmVyaWZpZXIoY2ZzLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgZmFsc2UsIElWZXJpZmllci5vcHRpb25zKCkuY2hlY2tPd25zVG9rZW5zKHRydWUpLmV4dGVuZGVkVmVyaWZpY2F0aW9uKHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmdldFRva2VuTWV0YWRhdGEoKS5jbGVhclVuc2FmZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXV0YXRlUmVwYWlyKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ09SUlVQVF9DRjIpOworCisgICAgICAgIGZpbGxDRihjZnMsIDIpOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgc3N0YWJsZS5kZXNjcmlwdG9yLmdldE1ldGFkYXRhU2VyaWFsaXplcigpLm11dGF0ZVJlcGFpck1ldGFkYXRhKHNzdGFibGUuZGVzY3JpcHRvciwgMSwgc3N0YWJsZS5nZXRQZW5kaW5nUmVwYWlyKCksIHNzdGFibGUuaXNUcmFuc2llbnQoKSk7CisgICAgICAgIHNzdGFibGUucmVsb2FkU1NUYWJsZU1ldGFkYXRhKCk7CisgICAgICAgIGNmcy5nZXRUcmFja2VyKCkubm90aWZ5U1NUYWJsZVJlcGFpcmVkU3RhdHVzQ2hhbmdlZChDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3N0YWJsZSkpOworICAgICAgICBhc3NlcnRUcnVlKHNzdGFibGUuaXNSZXBhaXJlZCgpKTsKKyAgICAgICAgY2ZzLmZvcmNlTWFqb3JDb21wYWN0aW9uKCk7CisKKyAgICAgICAgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgbG9uZyBjb3JyZWN0Q2hlY2tzdW07CisgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGZpbGUgPSBSYW5kb21BY2Nlc3NSZWFkZXIub3Blbihzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRJR0VTVCkpKQorICAgICAgICB7CisgICAgICAgICAgICBjb3JyZWN0Q2hlY2tzdW0gPSBmaWxlLnJlYWRMb25nKCk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVDaGVja3N1bSgrK2NvcnJlY3RDaGVja3N1bSwgc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5ESUdFU1QpKTsKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLm11dGF0ZVJlcGFpclN0YXR1cyh0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgYmUgY29ycnVwdCIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBleHBlY3RlZCkKKyAgICAgICAgeworICAgICAgICB9CisgICAgICAgIGFzc2VydEZhbHNlKHNzdGFibGUuaXNSZXBhaXJlZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlJbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgaWYgKEJpZ0Zvcm1hdC5pc1NlbGVjdGVkKCkpCisgICAgICAgICAgICB0ZXN0QnJva2VuQ29tcG9uZW50SGVscGVyKEJpZ0Zvcm1hdC5Db21wb25lbnRzLlBSSU1BUllfSU5ERVgpOworICAgICAgICBlbHNlIGlmIChCdGlGb3JtYXQuaXNTZWxlY3RlZCgpKQorICAgICAgICAgICAgdGVzdEJyb2tlbkNvbXBvbmVudEhlbHBlcihCdGlGb3JtYXQuQ29tcG9uZW50cy5QQVJUSVRJT05fSU5ERVgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBVdGlsLnRlc3RNdXN0QmVJbXBsZW1lbnRlZEZvclNTVGFibGVGb3JtYXQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlCZigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoU1NUYWJsZVJlYWRlcldpdGhGaWx0ZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkuZ2V0UmVhZGVyRmFjdG9yeSgpLmdldFJlYWRlckNsYXNzKCkpKTsKKyAgICAgICAgdGVzdEJyb2tlbkNvbXBvbmVudEhlbHBlcihDb21wb25lbnRzLkZJTFRFUik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5SW5kZXhTdW1tYXJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShCaWdGb3JtYXQuaXNTZWxlY3RlZCgpKTsKKyAgICAgICAgdGVzdEJyb2tlbkNvbXBvbmVudEhlbHBlcihDb21wb25lbnRzLlNVTU1BUlkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0QnJva2VuQ29tcG9uZW50SGVscGVyKENvbXBvbmVudCBjb21wb25lbnRUb0JyZWFrKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1JSVVBUX0NGMik7CisKKyAgICAgICAgZmlsbENGKGNmcywgMik7CisKKyAgICAgICAgU1NUYWJsZVJlYWRlciBzc3RhYmxlID0gY2ZzLmdldExpdmVTU1RhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICB0cnkgKElWZXJpZmllciB2ZXJpZmllciA9IHNzdGFibGUuZ2V0VmVyaWZpZXIoY2ZzLCBuZXcgT3V0cHV0SGFuZGxlci5Mb2dPdXRwdXQoKSwgZmFsc2UsIElWZXJpZmllci5vcHRpb25zKCkuYnVpbGQoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOyAvL3N0aWxsIG5vdCBjb3JydXB0LCBzaG91bGQgcGFzcworICAgICAgICB9CisgICAgICAgIHRyeSAoRmlsZUNoYW5uZWwgZmlsZUNoYW5uZWwgPSBzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnRUb0JyZWFrKS5uZXdSZWFkV3JpdGVDaGFubmVsKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbGVDaGFubmVsLnRydW5jYXRlKDMpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLmJ1aWxkKCkpKQorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCB0aHJvdyBleGNlcHRpb24iKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVpY2soKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1JSVVBUX0NGKTsKKworICAgICAgICBmaWxsQ0YoY2ZzLCAyKTsKKworICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMpLmJ1aWxkKCkpOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKworCisgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGZpbGUgPSBSYW5kb21BY2Nlc3NSZWFkZXIub3Blbihzc3RhYmxlLmRlc2NyaXB0b3IuZmlsZUZvcihDb21wb25lbnRzLkRJR0VTVCkpKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGNvcnJlY3RDaGVja3N1bSA9IGZpbGUucmVhZExvbmcoKTsKKworICAgICAgICAgICAgd3JpdGVDaGVja3N1bSgrK2NvcnJlY3RDaGVja3N1bSwgc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5ESUdFU1QpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIHRvIGJlIHRocm93biIpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb3JydXB0U1NUYWJsZUV4Y2VwdGlvbiBleHBlY3RlZCkKKyAgICAgICAgeworICAgICAgICB9CisKKyAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmludm9rZURpc2tGYWlsdXJlUG9saWN5KHRydWUpLnF1aWNrKHRydWUpLmJ1aWxkKCkpKSAvLyB3aXRoIHF1aWNrID0gdHJ1ZSB3ZSBkb24ndCB2ZXJpZnkgdGhlIGRpZ2VzdAorICAgICAgICB7CisgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSAoSVZlcmlmaWVyIHZlcmlmaWVyID0gc3N0YWJsZS5nZXRWZXJpZmllcihjZnMsIG5ldyBPdXRwdXRIYW5kbGVyLkxvZ091dHB1dCgpLCBmYWxzZSwgSVZlcmlmaWVyLm9wdGlvbnMoKS5pbnZva2VEaXNrRmFpbHVyZVBvbGljeSh0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgdmVyaWZpZXIudmVyaWZ5KCk7CisgICAgICAgICAgICBmYWlsKCJFeHBlY3RlZCBhIFJ1bnRpbWVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKENvcnJ1cHRTU1RhYmxlRXhjZXB0aW9uIGV4cGVjdGVkKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5nZU93bkhlbHBlcigpCisgICAgeworICAgICAgICBMaXN0PFJhbmdlPFRva2VuPj4gbm9ybWFsaXplZCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBub3JtYWxpemVkLmFkZChyKExvbmcuTUlOX1ZBTFVFLCBMb25nLk1JTl9WQUxVRSArIDEpKTsKKyAgICAgICAgbm9ybWFsaXplZC5hZGQocihMb25nLk1JTl9WQUxVRSArIDUsIExvbmcuTUlOX1ZBTFVFICsgNikpOworICAgICAgICBub3JtYWxpemVkLmFkZChyKExvbmcuTUlOX1ZBTFVFICsgMTAsIExvbmcuTUlOX1ZBTFVFICsgMTEpKTsKKyAgICAgICAgbm9ybWFsaXplZC5hZGQocigwLCAxMCkpOworICAgICAgICBub3JtYWxpemVkLmFkZChyKDEwLCAxMSkpOworICAgICAgICBub3JtYWxpemVkLmFkZChyKDIwLCAyNSkpOworICAgICAgICBub3JtYWxpemVkLmFkZChyKDI2LCAyMDApKTsKKworICAgICAgICBSYW5nZU93bkhlbHBlciByb2ggPSBuZXcgUmFuZ2VPd25IZWxwZXIobm9ybWFsaXplZCk7CisKKyAgICAgICAgcm9oLnZhbGlkYXRlKGRrKDEpKTsKKyAgICAgICAgcm9oLnZhbGlkYXRlKGRrKDEwKSk7CisgICAgICAgIHJvaC52YWxpZGF0ZShkaygxMSkpOworICAgICAgICByb2gudmFsaWRhdGUoZGsoMjEpKTsKKyAgICAgICAgcm9oLnZhbGlkYXRlKGRrKDI1KSk7CisgICAgICAgIGJvb2xlYW4gZ290RXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICByb2gudmFsaWRhdGUoZGsoMjYpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdEV4Y2VwdGlvbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShnb3RFeGNlcHRpb24pOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gQXNzZXJ0aW9uRXJyb3IuY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFJhbmdlT3duSGVscGVyQmFkVG9rZW4oKQorICAgIHsKKyAgICAgICAgTGlzdDxSYW5nZTxUb2tlbj4+IG5vcm1hbGl6ZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgbm9ybWFsaXplZC5hZGQocigwLCAxMCkpOworICAgICAgICBSYW5nZU93bkhlbHBlciByb2ggPSBuZXcgUmFuZ2VPd25IZWxwZXIobm9ybWFsaXplZCk7CisgICAgICAgIHJvaC52YWxpZGF0ZShkaygxKSk7CisgICAgICAgIC8vIGNhbGwgd2l0aCBzbWFsbGVyIHRva2VuIHRvIGdldCBleGNlcHRpb24KKyAgICAgICAgcm9oLnZhbGlkYXRlKGRrKDApKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJhbmdlT3duSGVscGVyTm9ybWFsaXplKCkKKyAgICB7CisgICAgICAgIExpc3Q8UmFuZ2U8VG9rZW4+PiBub3JtYWxpemVkID0gUmFuZ2Uubm9ybWFsaXplKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocigwLCAwKSkpOworICAgICAgICBSYW5nZU93bkhlbHBlciByb2ggPSBuZXcgUmFuZ2VPd25IZWxwZXIobm9ybWFsaXplZCk7CisgICAgICAgIHJvaC52YWxpZGF0ZShkayhMb25nLk1JTl9WQUxVRSkpOworICAgICAgICByb2gudmFsaWRhdGUoZGsoMCkpOworICAgICAgICByb2gudmFsaWRhdGUoZGsoTG9uZy5NQVhfVkFMVUUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSYW5nZU93bkhlbHBlck5vcm1hbGl6ZVdyYXAoKQorICAgIHsKKyAgICAgICAgTGlzdDxSYW5nZTxUb2tlbj4+IG5vcm1hbGl6ZWQgPSBSYW5nZS5ub3JtYWxpemUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyKExvbmcuTUFYX1ZBTFVFIC0gMTAwMCwgTG9uZy5NSU5fVkFMVUUgKyAxMDAwKSkpOworICAgICAgICBSYW5nZU93bkhlbHBlciByb2ggPSBuZXcgUmFuZ2VPd25IZWxwZXIobm9ybWFsaXplZCk7CisgICAgICAgIHJvaC52YWxpZGF0ZShkayhMb25nLk1JTl9WQUxVRSkpOworICAgICAgICByb2gudmFsaWRhdGUoZGsoTG9uZy5NQVhfVkFMVUUpKTsKKyAgICAgICAgYm9vbGVhbiBnb3RFeGNlcHRpb24gPSBmYWxzZTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJvaC52YWxpZGF0ZShkaygyNikpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChUaHJvd2FibGUgdCkKKyAgICAgICAgeworICAgICAgICAgICAgZ290RXhjZXB0aW9uID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKGdvdEV4Y2VwdGlvbik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlSYW5nZXMoKQorICAgIHsKKyAgICAgICAgbmV3IFJhbmdlT3duSGVscGVyKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKS52YWxpZGF0ZShkaygxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5TG9jYWxQYXJ0aXRpb25lcigpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgVG9rZW5NZXRhZGF0YSB0bWQgPSBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5nZXRUb2tlbk1ldGFkYXRhKCk7CisgICAgICAgIGJ5dGVbXSB0azEgPSBuZXcgYnl0ZVsxXSwgdGsyID0gbmV3IGJ5dGVbMV07CisgICAgICAgIHRrMVswXSA9IDI7CisgICAgICAgIHRrMlswXSA9IDE7CisgICAgICAgIHRtZC51cGRhdGVOb3JtYWxUb2tlbihuZXcgQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5CeXRlc1Rva2VuKHRrMSksIEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoIjEyNy4wLjAuMSIpKTsKKyAgICAgICAgdG1kLnVwZGF0ZU5vcm1hbFRva2VuKG5ldyBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLkJ5dGVzVG9rZW4odGsyKSwgSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5TmFtZSgiMTI3LjAuMC4yIikpOworICAgICAgICAvLyB3cml0ZSBzb21lIGJvZ3VzIHRvIGEgbG9jYWxwYXJ0aXRpb25lciB0YWJsZQorICAgICAgICBCYXRjaCBib2d1cyA9IEJhdGNoLmNyZWF0ZUxvY2FsKG5leHRUaW1lVVVJRCgpLCAwLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7CisgICAgICAgIEJhdGNobG9nTWFuYWdlci5zdG9yZShib2d1cyk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oInN5c3RlbSIpLmdldENvbHVtbkZhbWlseVN0b3JlKCJiYXRjaGVzIik7CisgICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKKyAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCisgICAgICAgIHsKKworICAgICAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmNoZWNrT3duc1Rva2Vucyh0cnVlKS5idWlsZCgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2ZXJpZmllci52ZXJpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vRmlsdGVyRmlsZSgpCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQkZfQUxXQVlTX1BSRVNFTlQpOworICAgICAgICBmaWxsQ0YoY2ZzLCAxMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wLCBjZnMubWV0YWRhdGEoKS5wYXJhbXMuYmxvb21GaWx0ZXJGcENoYW5jZSwgMC4wKTsKKyAgICAgICAgZm9yIChTU1RhYmxlUmVhZGVyIHNzdGFibGUgOiBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGUgZiA9IHNzdGFibGUuZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuRklMVEVSKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGYuZXhpc3RzKCkpOworICAgICAgICAgICAgdHJ5IChJVmVyaWZpZXIgdmVyaWZpZXIgPSBzc3RhYmxlLmdldFZlcmlmaWVyKGNmcywgbmV3IE91dHB1dEhhbmRsZXIuTG9nT3V0cHV0KCksIGZhbHNlLCBJVmVyaWZpZXIub3B0aW9ucygpLmJ1aWxkKCkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZlcmlmaWVyLnZlcmlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIERlY29yYXRlZEtleSBkayhsb25nIGwpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlckRlY29yYXRlZEtleSh0KGwpLCBCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUik7CisgICAgfQorCisgICAgcHJpdmF0ZSBSYW5nZTxUb2tlbj4gcihsb25nIHMsIGxvbmcgZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgUmFuZ2U8Pih0KHMpLCB0KGUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFRva2VuIHQobG9uZyB0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNdXJtdXIzUGFydGl0aW9uZXIuTG9uZ1Rva2VuKHQpOworICAgIH0KKworCisgICAgcHJvdGVjdGVkIHZvaWQgZmlsbENGKENvbHVtbkZhbWlseVN0b3JlIGNmcywgaW50IHBhcnRpdGlvbnNQZXJTU1RhYmxlKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0aXRpb25zUGVyU1NUYWJsZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBVcGRhdGVCdWlsZGVyLmNyZWF0ZShjZnMubWV0YWRhdGEoKSwgU3RyaW5nLnZhbHVlT2YoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLm5ld1JvdygiYzEiKS5hZGQoInZhbCIsICIxIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAubmV3Um93KCJjMiIpLmFkZCgidmFsIiwgIjIiKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBseSgpOworICAgICAgICB9CisKKyAgICAgICAgVXRpbC5mbHVzaChjZnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGZpbGxDb3VudGVyQ0YoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgcGFydGl0aW9uc1BlclNTVGFibGUpIHRocm93cyBXcml0ZVRpbWVvdXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9uc1BlclNTVGFibGU7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgVXBkYXRlQnVpbGRlci5jcmVhdGUoY2ZzLm1ldGFkYXRhKCksIFN0cmluZy52YWx1ZU9mKGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdSb3coImMxIikuYWRkKCJ2YWwiLCAxMDBMKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBseSgpOworICAgICAgICB9CisKKyAgICAgICAgVXRpbC5mbHVzaChjZnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBsb25nIHNpbXBsZUZ1bGxDaGVja3N1bShTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW1QbHVzIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbVBsdXMoZmlsZW5hbWUpOworICAgICAgICAgICAgIENoZWNrZWRJbnB1dFN0cmVhbSBjaW5TdHJlYW0gPSBuZXcgQ2hlY2tlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBuZXcgQ1JDMzIoKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbMTI4XTsKKyAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIFN0YXRlbWVudFdpdGhFbXB0eUJvZHkKKyAgICAgICAgICAgIHdoaWxlIChjaW5TdHJlYW0ucmVhZChiKSA+PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNpblN0cmVhbS5nZXRDaGVja3N1bSgpLmdldFZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVDaGVja3N1bShsb25nIGNoZWNrc3VtLCBGaWxlIGZpbGUpCisgICAgeworICAgICAgICBCdWZmZXJlZFdyaXRlciBvdXQgPSBudWxsOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0ID0gRmlsZXMubmV3QnVmZmVyZWRXcml0ZXIoZmlsZS50b1BhdGgoKSwgQ2hhcnNldHMuVVRGXzgpOworICAgICAgICAgICAgb3V0LndyaXRlKFN0cmluZy52YWx1ZU9mKGNoZWNrc3VtKSk7CisgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRlNXcml0ZUVycm9yKGUsIGZpbGUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShvdXQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZmlsdGVyL0Jsb29tRmlsdGVyVHJhY2tlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2ZpbHRlci9CbG9vbUZpbHRlclRyYWNrZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5NTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2ZpbHRlci9CbG9vbUZpbHRlclRyYWNrZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZpbHRlcjsKKworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBCbG9vbUZpbHRlclRyYWNrZXJUZXN0Cit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkaW5nRmFsc2VQb3NpdGl2ZXMoKQorICAgIHsKKyAgICAgICAgQmxvb21GaWx0ZXJUcmFja2VyIGJmdCA9IG5ldyBCbG9vbUZpbHRlclRyYWNrZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCBiZnQuZ2V0RmFsc2VQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIGJmdC5nZXRSZWNlbnRGYWxzZVBvc2l0aXZlQ291bnQoKSk7CisgICAgICAgIGJmdC5hZGRGYWxzZVBvc2l0aXZlKCk7CisgICAgICAgIGJmdC5hZGRGYWxzZVBvc2l0aXZlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyTCwgYmZ0LmdldEZhbHNlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDJMLCBiZnQuZ2V0UmVjZW50RmFsc2VQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIGJmdC5nZXRSZWNlbnRGYWxzZVBvc2l0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyTCwgYmZ0LmdldEZhbHNlUG9zaXRpdmVDb3VudCgpKTsgLy8gc2FuaXR5IGNoZWNrCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkaW5nVHJ1ZVBvc2l0aXZlcygpCisgICAgeworICAgICAgICBCbG9vbUZpbHRlclRyYWNrZXIgYmZ0ID0gbmV3IEJsb29tRmlsdGVyVHJhY2tlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIGJmdC5nZXRUcnVlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCBiZnQuZ2V0UmVjZW50VHJ1ZVBvc2l0aXZlQ291bnQoKSk7CisgICAgICAgIGJmdC5hZGRUcnVlUG9zaXRpdmUoKTsKKyAgICAgICAgYmZ0LmFkZFRydWVQb3NpdGl2ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMkwsIGJmdC5nZXRUcnVlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDJMLCBiZnQuZ2V0UmVjZW50VHJ1ZVBvc2l0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwTCwgYmZ0LmdldFJlY2VudFRydWVQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMkwsIGJmdC5nZXRUcnVlUG9zaXRpdmVDb3VudCgpKTsgLy8gc2FuaXR5IGNoZWNrCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkaW5nVG9PbmVMZWF2ZXNUaGVPdGhlckFsb25lKCkKKyAgICB7CisgICAgICAgIEJsb29tRmlsdGVyVHJhY2tlciBiZnQgPSBuZXcgQmxvb21GaWx0ZXJUcmFja2VyKCk7CisgICAgICAgIGJmdC5hZGRGYWxzZVBvc2l0aXZlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwTCwgYmZ0LmdldFRydWVQb3NpdGl2ZUNvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIGJmdC5nZXRSZWNlbnRUcnVlUG9zaXRpdmVDb3VudCgpKTsKKyAgICAgICAgYmZ0LmFkZFRydWVQb3NpdGl2ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMUwsIGJmdC5nZXRGYWxzZVBvc2l0aXZlQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxTCwgYmZ0LmdldFJlY2VudEZhbHNlUG9zaXRpdmVDb3VudCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvQWJzdHJhY3RUZXN0VmVyc2lvblN1cHBvcnRlZEZlYXR1cmVzLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvQWJzdHJhY3RUZXN0VmVyc2lvblN1cHBvcnRlZEZlYXR1cmVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjNGMwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9BYnN0cmFjdFRlc3RWZXJzaW9uU3VwcG9ydGVkRmVhdHVyZXMuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRlc3RWZXJzaW9uU3VwcG9ydGVkRmVhdHVyZXMKK3sKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBBTExfVkVSU0lPTlMgPSBJbnRTdHJlYW0ucmFuZ2VDbG9zZWQoJ2EnLCAneicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcFRvT2JqKGkgLT4gU3RyaW5nLnZhbHVlT2YoKGNoYXIpIGkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKGZpcnN0IC0+IEludFN0cmVhbS5yYW5nZUNsb3NlZCgnYScsICd6JykubWFwVG9PYmooc2Vjb25kIC0+IGZpcnN0ICsgKGNoYXIpIHNlY29uZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVmVyc2lvbiBnZXRWZXJzaW9uKFN0cmluZyB2KTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJlYW08U3RyaW5nPiBnZXRQZW5kaW5nUmVwYWlyU3VwcG9ydGVkVmVyc2lvbnMoKTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJlYW08U3RyaW5nPiBnZXRQYXJ0aXRpb25MZXZlbERlbGV0aW9uUHJlc2VuY2VNYXJrZXJTdXBwb3J0ZWRWZXJzaW9ucygpOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmVhbTxTdHJpbmc+IGdldExlZ2FjeU1pbk1heFN1cHBvcnRlZFZlcnNpb25zKCk7CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyZWFtPFN0cmluZz4gZ2V0SW1wcm92ZWRNaW5NYXhTdXBwb3J0ZWRWZXJzaW9ucygpOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmVhbTxTdHJpbmc+IGdldEtleVJhbmdlU3VwcG9ydGVkVmVyc2lvbnMoKTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJlYW08U3RyaW5nPiBnZXRPcmlnaW5hdGluZ0hvc3RJZFN1cHBvcnRlZFZlcnNpb25zKCk7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEREKCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbXBhdGliaWxpdHkoKQorICAgIHsKKyAgICAgICAgY2hlY2tQcmVkaWNhdGVBZ2FpbnN0VmVyc2lvbnMoVmVyc2lvbjo6aGFzUGVuZGluZ1JlcGFpciwgZ2V0UGVuZGluZ1JlcGFpclN1cHBvcnRlZFZlcnNpb25zKCkpOworICAgICAgICBjaGVja1ByZWRpY2F0ZUFnYWluc3RWZXJzaW9ucyhWZXJzaW9uOjpoYXNJbXByb3ZlZE1pbk1heCwgZ2V0SW1wcm92ZWRNaW5NYXhTdXBwb3J0ZWRWZXJzaW9ucygpKTsKKyAgICAgICAgY2hlY2tQcmVkaWNhdGVBZ2FpbnN0VmVyc2lvbnMoVmVyc2lvbjo6aGFzTGVnYWN5TWluTWF4LCBnZXRMZWdhY3lNaW5NYXhTdXBwb3J0ZWRWZXJzaW9ucygpKTsKKyAgICAgICAgY2hlY2tQcmVkaWNhdGVBZ2FpbnN0VmVyc2lvbnMoVmVyc2lvbjo6aGFzUGFydGl0aW9uTGV2ZWxEZWxldGlvbnNQcmVzZW5jZU1hcmtlciwgZ2V0UGFydGl0aW9uTGV2ZWxEZWxldGlvblByZXNlbmNlTWFya2VyU3VwcG9ydGVkVmVyc2lvbnMoKSk7CisgICAgICAgIGNoZWNrUHJlZGljYXRlQWdhaW5zdFZlcnNpb25zKFZlcnNpb246Omhhc0tleVJhbmdlLCBnZXRLZXlSYW5nZVN1cHBvcnRlZFZlcnNpb25zKCkpOworICAgICAgICBjaGVja1ByZWRpY2F0ZUFnYWluc3RWZXJzaW9ucyhWZXJzaW9uOjpoYXNPcmlnaW5hdGluZ0hvc3RJZCwgZ2V0T3JpZ2luYXRpbmdIb3N0SWRTdXBwb3J0ZWRWZXJzaW9ucygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmVhbTxTdHJpbmc+IHJhbmdlKFN0cmluZyBmcm9tSW5jbCwgU3RyaW5nIHRvSW5jbCkKKyAgICB7CisgICAgICAgIGludCBmcm9tSWR4ID0gQUxMX1ZFUlNJT05TLmluZGV4T2YoZnJvbUluY2wpOworICAgICAgICBpbnQgdG9JZHggPSBBTExfVkVSU0lPTlMuaW5kZXhPZih0b0luY2wpOworICAgICAgICBhc3NlcnQgZnJvbUlkeCA+PSAwICYmIHRvSWR4ID49IDA7CisgICAgICAgIHJldHVybiBBTExfVkVSU0lPTlMuc3ViTGlzdChmcm9tSWR4LCB0b0lkeCArIDEpLnN0cmVhbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoZSB2ZXJzaW9uIHByZWRpY2F0ZSBhZ2FpbnN0IHRoZSBwcm92aWRlZCB2ZXJzaW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgICAgIHByZWRpY2F0ZSB0byBjaGVjayBhZ2FpbnN0IHZlcnNpb24KKyAgICAgKiBAcGFyYW0gdmVyc2lvbkJvdW5kcyBhIHN0cmVhbSBvZiB2ZXJzaW9ucyBmb3Igd2hpY2ggdGhlIHByZWRpY2F0ZSBzaG91bGQgcmV0dXJuIHRydWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2hlY2tQcmVkaWNhdGVBZ2FpbnN0VmVyc2lvbnMoUHJlZGljYXRlPFZlcnNpb24+IHByZWRpY2F0ZSwgU3RyZWFtPFN0cmluZz4gdmVyc2lvbkJvdW5kcykKKyAgICB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHZlcnNpb25Cb3VuZHMuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGFjdHVhbCA9IEFMTF9WRVJTSU9OUy5zdHJlYW0oKS5maWx0ZXIodiAtPiBwcmVkaWNhdGUudGVzdChnZXRWZXJzaW9uKHYpKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGFjdHVhbCkuaXNFcXVhbFRvKGV4cGVjdGVkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YjQ4YjcuLjAwMDAwMDAKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1JhbmdlQXdhcmVTU1RhYmxlV3JpdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VTZXJ2aWNlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi1wdWJsaWMgY2xhc3MgUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXJUZXN0Ci17Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UxID0gIktleXNwYWNlMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkQgPSAiU3RhbmRhcmQxIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOwotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwotICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0UGFydGl0aW9uZXJVbnNhZmUoTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlKTsKLSAgICAgICAgU2NoZW1hTG9hZGVyLmNsZWFudXBBbmRMZWF2ZURpcnMoKTsKLSAgICAgICAgS2V5c3BhY2Uuc2V0SW5pdGlhbGl6ZWQoKTsKLSAgICAgICAgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaW5pdFNlcnZlcigpOwotCi0gICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGFydGl0aW9uZXIoTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlKSk7Ci0KLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSk7Ci0gICAgICAgIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGX1NUQU5EQVJEKTsKLSAgICAgICAgY2ZzLmNsZWFyVW5zYWZlKCk7Ci0gICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NXcml0ZXJCZWZvcmVBcHBlbmQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0KLSAgICAgICAgU2NoZW1hTG9hZGVyLmluc2VydERhdGEoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRCwgMCwgMSk7Ci0gICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKLQotICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBMaWZlY3ljbGVUcmFuc2FjdGlvbi5vZmZsaW5lKE9wZXJhdGlvblR5cGUuU1RSRUFNKTsKLQotICAgICAgICBSYW5nZUF3YXJlU1NUYWJsZVdyaXRlciB3cml0ZXIgPSBuZXcgUmFuZ2VBd2FyZVNTVGFibGVXcml0ZXIoY2ZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RhYmxlRm9ybWF0LlR5cGUuQklHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmdldExpdmVTU1RhYmxlcygpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjZnMubWV0YWRhdGEuaWQsIHdyaXRlci5nZXRUYWJsZUlkKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIHdyaXRlci5nZXRGaWxlUG9pbnRlcigpKTsKLQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZUZsdXNoT2JzZXJ2ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvU1NUYWJsZUZsdXNoT2JzZXJ2ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YWFmOGUuLjAwMDAwMDAKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1NTVGFibGVGbHVzaE9ic2VydmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TZXF1ZW5jZUJhc2VkU1NUYWJsZUlkOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuU2VyaWFsaXphdGlvbkhlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTG9uZ1R5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNSZWFkRXJyb3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uRlNXcml0ZUVycm9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnVGFibGVXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVEYXRhSW5wdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuQXJyYXlMaXN0TXVsdGltYXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NdWx0aW1hcDsKLQotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTU1RhYmxlRmx1c2hPYnNlcnZlclRlc3QKLXsKLSAgICBAQmVmb3JlQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEREKCkKLSAgICB7Ci0gICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwotICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS1NfTkFNRSA9ICJ0ZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfTkFNRSA9ICJmbHVzaF9vYnNlcnZlciI7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RGbHVzaE9ic2VydmVyKCkKLSAgICB7Ci0gICAgICAgIFRhYmxlTWV0YWRhdGEgY2ZtID0KLSAgICAgICAgICAgIFRhYmxlTWV0YWRhdGEuYnVpbGRlcihLU19OQU1FLCBDRl9OQU1FKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQYXJ0aXRpb25LZXlDb2x1bW4oImlkIiwgVVRGOFR5cGUuaW5zdGFuY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFJlZ3VsYXJDb2x1bW4oImZpcnN0X25hbWUiLCBVVEY4VHlwZS5pbnN0YW5jZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVndWxhckNvbHVtbigiYWdlIiwgSW50MzJUeXBlLmluc3RhbmNlKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKCJoZWlnaHQiLCBMb25nVHlwZS5pbnN0YW5jZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLQotICAgICAgICBMaWZlY3ljbGVUcmFuc2FjdGlvbiB0cmFuc2FjdGlvbiA9IExpZmVjeWNsZVRyYW5zYWN0aW9uLm9mZmxpbmUoT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OKTsKLSAgICAgICAgRmx1c2hPYnNlcnZlciBvYnNlcnZlciA9IG5ldyBGbHVzaE9ic2VydmVyKCk7Ci0KLSAgICAgICAgU3RyaW5nIHNzdGFibGVEaXJlY3RvcnkgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0QWxsRGF0YUZpbGVMb2NhdGlvbnMoKVswXTsKLSAgICAgICAgRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZShzc3RhYmxlRGlyZWN0b3J5ICsgRmlsZS5wYXRoU2VwYXJhdG9yKCkgKyBLU19OQU1FICsgRmlsZS5wYXRoU2VwYXJhdG9yKCkgKyBDRl9OQU1FKTsKLSAgICAgICAgZGlyZWN0b3J5LmRlbGV0ZU9uRXhpdCgpOwotCi0gICAgICAgIGlmICghZGlyZWN0b3J5LmV4aXN0cygpICYmICFkaXJlY3RvcnkudHJ5Q3JlYXRlRGlyZWN0b3JpZXMoKSkKLSAgICAgICAgICAgIHRocm93IG5ldyBGU1dyaXRlRXJyb3IobmV3IElPRXhjZXB0aW9uKCJmYWlsZWQgdG8gY3JlYXRlIHRtcCBkaXJlY3RvcnkiKSwgZGlyZWN0b3J5LmFic29sdXRlUGF0aCgpKTsKLQotICAgICAgICBTU1RhYmxlRm9ybWF0LlR5cGUgc3N0YWJsZUZvcm1hdCA9IFNTVGFibGVGb3JtYXQuVHlwZS5jdXJyZW50KCk7Ci0gICAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBEZXNjcmlwdG9yKHNzdGFibGVGb3JtYXQuaW5mby5nZXRMYXRlc3RWZXJzaW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZtLmtleXNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZm0ubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVGb3JtYXQpOwotCi0gICAgICAgIEJpZ1RhYmxlV3JpdGVyIHdyaXRlciA9IG5ldyBCaWdUYWJsZVdyaXRlcihkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTBMLCAwTCwgbnVsbCwgZmFsc2UsIFRhYmxlTWV0YWRhdGFSZWYuZm9yT2ZmbGluZVRvb2xzKGNmbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWV0YWRhdGFDb2xsZWN0b3IoY2ZtLmNvbXBhcmF0b3IpLnNzdGFibGVMZXZlbCgwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXJpYWxpemF0aW9uSGVhZGVyKHRydWUsIGNmbSwgY2ZtLnJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zKCksIEVuY29kaW5nU3RhdHMuTk9fU1RBVFMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvYnNlcnZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbik7Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBudWxsOwotICAgICAgICBNdWx0aW1hcDxCeXRlQnVmZmVyLCBDZWxsPD8+PiBleHBlY3RlZCA9IEFycmF5TGlzdE11bHRpbWFwLmNyZWF0ZSgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0gICAgICAgICAgICBCeXRlQnVmZmVyIGtleSA9IFVURjhUeXBlLmluc3RhbmNlLmZyb21TdHJpbmcoImtleTEiKTsKLSAgICAgICAgICAgIGV4cGVjdGVkLnB1dEFsbChrZXksIEFycmF5cy5hc0xpc3QoQnVmZmVyQ2VsbC5saXZlKGdldENvbHVtbihjZm0sICJhZ2UiKSwgbm93LCBJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDI3KSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckNlbGwubGl2ZShnZXRDb2x1bW4oY2ZtLCAiZmlyc3RfbmFtZSIpLCBub3csVVRGOFR5cGUuaW5zdGFuY2UuZnJvbVN0cmluZygiamFjayIpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyQ2VsbC5saXZlKGdldENvbHVtbihjZm0sICJoZWlnaHQiKSwgbm93LCBMb25nVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMTgzTCkpKSk7Ci0KLSAgICAgICAgICAgIHdyaXRlci5hcHBlbmQobmV3IFJvd0l0ZXJhdG9yKGNmbSwga2V5LmR1cGxpY2F0ZSgpLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGJ1aWxkUm93KGV4cGVjdGVkLmdldChrZXkpKSkpKTsKLQotICAgICAgICAgICAga2V5ID0gVVRGOFR5cGUuaW5zdGFuY2UuZnJvbVN0cmluZygia2V5MiIpOwotICAgICAgICAgICAgZXhwZWN0ZWQucHV0QWxsKGtleSwgQXJyYXlzLmFzTGlzdChCdWZmZXJDZWxsLmxpdmUoZ2V0Q29sdW1uKGNmbSwgImFnZSIpLCBub3csIEludDMyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoMzApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyQ2VsbC5saXZlKGdldENvbHVtbihjZm0sICJmaXJzdF9uYW1lIiksIG5vdyxVVEY4VHlwZS5pbnN0YW5jZS5mcm9tU3RyaW5nKCJqaW0iKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckNlbGwubGl2ZShnZXRDb2x1bW4oY2ZtLCAiaGVpZ2h0IiksIG5vdywgTG9uZ1R5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDE4MEwpKSkpOwotCi0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKG5ldyBSb3dJdGVyYXRvcihjZm0sIGtleSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChidWlsZFJvdyhleHBlY3RlZC5nZXQoa2V5KSkpKSk7Ci0KLSAgICAgICAgICAgIGtleSA9IFVURjhUeXBlLmluc3RhbmNlLmZyb21TdHJpbmcoImtleTMiKTsKLSAgICAgICAgICAgIGV4cGVjdGVkLnB1dEFsbChrZXksIEFycmF5cy5hc0xpc3QoQnVmZmVyQ2VsbC5saXZlKGdldENvbHVtbihjZm0sICJhZ2UiKSwgbm93LCBJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKDMwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckNlbGwubGl2ZShnZXRDb2x1bW4oY2ZtLCAiZmlyc3RfbmFtZSIpLCBub3csVVRGOFR5cGUuaW5zdGFuY2UuZnJvbVN0cmluZygia2VuIikpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJDZWxsLmxpdmUoZ2V0Q29sdW1uKGNmbSwgImhlaWdodCIpLCBub3csIExvbmdUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgxNzhMKSkpKTsKLQotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZChuZXcgUm93SXRlcmF0b3IoY2ZtLCBrZXksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYnVpbGRSb3coZXhwZWN0ZWQuZ2V0KGtleSkpKSkpOwotCi0gICAgICAgICAgICByZWFkZXIgPSB3cml0ZXIuZmluaXNoKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseSh3cml0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUob2JzZXJ2ZXIuaXNDb21wbGV0ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhwZWN0ZWQuc2l6ZSgpLCBvYnNlcnZlci5yb3dzLnNpemUoKSk7Ci0KLSAgICAgICAgZm9yIChQYWlyPEJ5dGVCdWZmZXIsIExvbmc+IGUgOiBvYnNlcnZlci5yb3dzLmtleVNldCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBCeXRlQnVmZmVyIGtleSA9IGUubGVmdDsKLSAgICAgICAgICAgIExvbmcgaW5kZXhQb3NpdGlvbiA9IGUucmlnaHQ7Ci0KLSAgICAgICAgICAgIHRyeSAoRmlsZURhdGFJbnB1dCBpbmRleCA9IHJlYWRlci5pZmlsZS5jcmVhdGVSZWFkZXIoaW5kZXhQb3NpdGlvbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbmRleEtleSA9IEJ5dGVCdWZmZXJVdGlsLnJlYWRXaXRoU2hvcnRMZW5ndGgoaW5kZXgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgVVRGOFR5cGUuaW5zdGFuY2UuY29tcGFyZShrZXksIGluZGV4S2V5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZTUmVhZEVycm9yKGV4LCByZWFkZXIuZ2V0SW5kZXhGaWxlbmFtZSgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhleHBlY3RlZC5nZXQoa2V5KSwgb2JzZXJ2ZXIucm93cy5nZXQoZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm93SXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVuZmlsdGVyZWRSb3dJdGVyYXRvcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxVbmZpbHRlcmVkPiByb3dzOwotCi0gICAgICAgIHB1YmxpYyBSb3dJdGVyYXRvcihUYWJsZU1ldGFkYXRhIGNmbSwgQnl0ZUJ1ZmZlciBrZXksIENvbGxlY3Rpb248VW5maWx0ZXJlZD4gY29udGVudCkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoY2ZtLAotICAgICAgICAgICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBhcnRpdGlvbmVyKCkuZGVjb3JhdGVLZXkoa2V5KSwKLSAgICAgICAgICAgICAgICAgIERlbGV0aW9uVGltZS5MSVZFLAotICAgICAgICAgICAgICAgICAgY2ZtLnJlZ3VsYXJBbmRTdGF0aWNDb2x1bW5zKCksCi0gICAgICAgICAgICAgICAgICBCVHJlZVJvdy5lbXB0eVJvdyhDbHVzdGVyaW5nLlNUQVRJQ19DTFVTVEVSSU5HKSwKLSAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgRW5jb2RpbmdTdGF0cy5OT19TVEFUUyk7Ci0KLSAgICAgICAgICAgIHJvd3MgPSBjb250ZW50Lml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIFVuZmlsdGVyZWQgY29tcHV0ZU5leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm93cy5oYXNOZXh0KCkgPyByb3dzLm5leHQoKSA6IGVuZE9mRGF0YSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmx1c2hPYnNlcnZlciBpbXBsZW1lbnRzIFNTVGFibGVGbHVzaE9ic2VydmVyCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIE11bHRpbWFwPFBhaXI8Qnl0ZUJ1ZmZlciwgTG9uZz4sIENlbGw8Pz4+IHJvd3MgPSBBcnJheUxpc3RNdWx0aW1hcC5jcmVhdGUoKTsKLSAgICAgICAgcHJpdmF0ZSBQYWlyPEJ5dGVCdWZmZXIsIExvbmc+IGN1cnJlbnRLZXk7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBsZXRlOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBiZWdpbigpCi0gICAgICAgIHt9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0UGFydGl0aW9uKERlY29yYXRlZEtleSBrZXksIGxvbmcgaW5kZXhQb3NpdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgY3VycmVudEtleSA9IFBhaXIuY3JlYXRlKGtleS5nZXRLZXkoKSwgaW5kZXhQb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbmV4dFVuZmlsdGVyZWRDbHVzdGVyKFVuZmlsdGVyZWQgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocm93LmlzUm93KCkpCi0gICAgICAgICAgICAgICAgKChSb3cpIHJvdykuZm9yRWFjaCgoYykgLT4gcm93cy5wdXQoY3VycmVudEtleSwgKENlbGw8Pz4pIGMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlzQ29tcGxldGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUm93IGJ1aWxkUm93KENvbGxlY3Rpb248Q2VsbDw/Pj4gY2VsbHMpCi0gICAgewotICAgICAgICBSb3cuQnVpbGRlciByb3dCdWlsZGVyID0gQlRyZWVSb3cuc29ydGVkQnVpbGRlcigpOwotICAgICAgICByb3dCdWlsZGVyLm5ld1JvdyhDbHVzdGVyaW5nLkVNUFRZKTsKLSAgICAgICAgY2VsbHMuZm9yRWFjaChyb3dCdWlsZGVyOjphZGRDZWxsKTsKLSAgICAgICAgcmV0dXJuIHJvd0J1aWxkZXIuYnVpbGQoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBDb2x1bW5NZXRhZGF0YSBnZXRDb2x1bW4oVGFibGVNZXRhZGF0YSBjZm0sIFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNmbS5nZXRDb2x1bW4oVVRGOFR5cGUuaW5zdGFuY2UuZnJvbVN0cmluZyhuYW1lKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1ZlcnNpb25BbmRUeXBlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L1ZlcnNpb25BbmRUeXBlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTYyYjljLi4wMDAwMDAwCi0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9WZXJzaW9uQW5kVHlwZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotCi1wdWJsaWMgY2xhc3MgVmVyc2lvbkFuZFR5cGVUZXN0Ci17Ci0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRJbnB1dCgpCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoVmVyc2lvbkFuZFR5cGUuZnJvbVN0cmluZygiYmlnLWJjIikudG9TdHJpbmcoKSwgImJpZy1iYyIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRJbnB1dHMoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IFZlcnNpb25BbmRUeXBlLmZyb21TdHJpbmcoIiAiKSkuaXNJbnN0YW5jZU9mKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoInNob3VsZCBiZSBvZiB0aGUgZm9ybSAnYmlnLWJjJyIpOwotICAgICAgICBhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gVmVyc2lvbkFuZFR5cGUuZnJvbVN0cmluZygibWNjLSIpKS5pc0luc3RhbmNlT2YoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNNZXNzYWdlQ29udGFpbmluZygic2hvdWxkIGJlIG9mIHRoZSBmb3JtICdiaWctYmMnIik7Ci0gICAgICAgIGFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBWZXJzaW9uQW5kVHlwZS5mcm9tU3RyaW5nKCJtY2MtZCIpKS5pc0luc3RhbmNlT2YoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoIk5vIFR5cGUgY29uc3RhbnQgbWNjIik7Ci0gICAgICAgIGFzc2VydFRoYXRUaHJvd25CeSgoKSAtPiBWZXJzaW9uQW5kVHlwZS5mcm9tU3RyaW5nKCJtY2MtZC0iKSkuaXNJbnN0YW5jZU9mKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNNZXNzYWdlQ29udGFpbmluZygiTm8gVHlwZSBjb25zdGFudCBtY2MiKTsKLSAgICAgICAgYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IFZlcnNpb25BbmRUeXBlLmZyb21TdHJpbmcoIm1jYyIpKS5pc0luc3RhbmNlT2YoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJzaG91bGQgYmUgb2YgdGhlIGZvcm0gJ2JpZy1iYyciKTsKLSAgICAgICAgYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IFZlcnNpb25BbmRUeXBlLmZyb21TdHJpbmcoIi0iKSkuaXNJbnN0YW5jZU9mKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzTWVzc2FnZUNvbnRhaW5pbmcoInNob3VsZCBiZSBvZiB0aGUgZm9ybSAnYmlnLWJjJyIpOwotICAgICAgICBhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gVmVyc2lvbkFuZFR5cGUuZnJvbVN0cmluZygiLS0iKSkuaXNJbnN0YW5jZU9mKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc01lc3NhZ2VDb250YWluaW5nKCJzaG91bGQgYmUgb2YgdGhlIGZvcm0gJ2JpZy1iYyciKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlWmVyb0NvcHlXcml0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL0JpZ1RhYmxlWmVyb0NvcHlXcml0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZDIwMjAuLjAwMDAwMDAKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9CaWdUYWJsZVplcm9Db3B5V3JpdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuY2hlY2tlZElPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwotaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgaW8ubmV0dHkuYnVmZmVyLlVucG9vbGVkOwotaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuZW1iZWRkZWQuRW1iZWRkZWRDaGFubmVsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNsaWNlczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuZmlsdGVyLkNvbHVtbkZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkUm93SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUhhbmRsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuQXN5bmNTdHJlYW1pbmdJbnB1dFBsdXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNhY2hpbmdQYXJhbXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGFSZWY7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1czsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOwotCi1wdWJsaWMgY2xhc3MgQmlnVGFibGVaZXJvQ29weVdyaXRlclRlc3QKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRTEgPSAiQmlnVGFibGVCbG9ja1dyaXRlclRlc3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGX1NUQU5EQVJEID0gIlN0YW5kYXJkMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkQyID0gIlN0YW5kYXJkMiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfSU5ERVhFRCA9ICJJbmRleGVkMSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkRMT1dJTkRFWElOVEVSVkFMID0gIlN0YW5kYXJkTG93SW5kZXhJbnRlcnZhbCI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgc3N0YWJsZTsKLSAgICBwdWJsaWMgc3RhdGljIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlOwotICAgIHByaXZhdGUgc3RhdGljIGludCBleHBlY3RlZFJvd0NvdW50OwotCi0gICAgQEJlZm9yZUNsYXNzCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7Ci0gICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENGX1NUQU5EQVJEMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuY29tcG9zaXRlSW5kZXhDRk1EKEtFWVNQQUNFMSwgQ0ZfSU5ERVhFRCwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ0ZfU1RBTkRBUkRMT1dJTkRFWElOVEVSVkFMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1pbkluZGV4SW50ZXJ2YWwoOCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhJbmRleEludGVydmFsKDI1NikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWNoaW5nKENhY2hpbmdQYXJhbXMuQ0FDSEVfTk9USElORykpOwotCi0gICAgICAgIFN0cmluZyBrcyA9IEtFWVNQQUNFMTsKLSAgICAgICAgU3RyaW5nIGNmID0gIlN0YW5kYXJkMSI7Ci0KLSAgICAgICAgLy8gY2xlYXIgYW5kIGNyZWF0ZSBqdXN0IG9uZSBzc3RhYmxlIGZvciB0aGlzIHRlc3QKLSAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKGtzKTsKLSAgICAgICAgc3RvcmUgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZik7Ci0gICAgICAgIHN0b3JlLmNsZWFyVW5zYWZlKCk7Ci0gICAgICAgIHN0b3JlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOwotCi0gICAgICAgIERlY29yYXRlZEtleSBmaXJzdEtleSA9IG51bGwsIGxhc3RLZXkgPSBudWxsOwotICAgICAgICBsb25nIHRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0b3JlLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWw7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGtleSA9IFV0aWwuZGsoU3RyaW5nLnZhbHVlT2YoaSkpOwotICAgICAgICAgICAgaWYgKGZpcnN0S2V5ID09IG51bGwpCi0gICAgICAgICAgICAgICAgZmlyc3RLZXkgPSBrZXk7Ci0gICAgICAgICAgICBpZiAobGFzdEtleSA9PSBudWxsKQotICAgICAgICAgICAgICAgIGxhc3RLZXkgPSBrZXk7Ci0gICAgICAgICAgICBpZiAoc3RvcmUubWV0YWRhdGEoKS5wYXJ0aXRpb25LZXlUeXBlLmNvbXBhcmUobGFzdEtleS5nZXRLZXkoKSwga2V5LmdldEtleSgpKSA8IDApCi0gICAgICAgICAgICAgICAgbGFzdEtleSA9IGtleTsKLQotICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoc3RvcmUubWV0YWRhdGEoKSwgdGltZXN0YW1wLCBrZXkuZ2V0S2V5KCkpCi0gICAgICAgICAgICAuY2x1c3RlcmluZygiY29sIikKLSAgICAgICAgICAgIC5hZGQoInZhbCIsIEJ5dGVCdWZmZXJVdGlsLkVNUFRZX0JZVEVfQlVGRkVSKQotICAgICAgICAgICAgLmJ1aWxkKCkKLSAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOwotICAgICAgICAgICAgZXhwZWN0ZWRSb3dDb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIFV0aWwuZmx1c2goc3RvcmUpOwotCi0gICAgICAgIHNzdGFibGUgPSBzdG9yZS5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHdyaXRlRGF0YUZpbGVfRGF0YUlucHV0UGx1cygpCi0gICAgewotICAgICAgICB3cml0ZURhdGFUZXN0Q3ljbGUoYnVmZmVyIC0+IG5ldyBEYXRhSW5wdXRTdHJlYW1QbHVzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIuYXJyYXkoKSkpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHdyaXRlRGF0YUZpbGVfUmVidWZmZXJpbmdCeXRlQnVmRGF0YUlucHV0UGx1cygpCi0gICAgewotICAgICAgICB0cnkgKEFzeW5jU3RyZWFtaW5nSW5wdXRQbHVzIGlucHV0ID0gbmV3IEFzeW5jU3RyZWFtaW5nSW5wdXRQbHVzKG5ldyBFbWJlZGRlZENoYW5uZWwoKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlRGF0YVRlc3RDeWNsZShidWZmZXIgLT4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnB1dC5hcHBlbmQoVW5wb29sZWQud3JhcHBlZEJ1ZmZlcihidWZmZXIpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7Ci0gICAgICAgICAgICB9KTsKLQotICAgICAgICAgICAgaW5wdXQucmVxdWVzdENsb3N1cmUoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlRGF0YVRlc3RDeWNsZShGdW5jdGlvbjxCeXRlQnVmZmVyLCBEYXRhSW5wdXRQbHVzPiBidWZmZXJNYXBwZXIpCi0gICAgewotICAgICAgICBGaWxlIGRpciA9IHN0b3JlLmdldERpcmVjdG9yaWVzKCkuZ2V0RGlyZWN0b3J5Rm9yTmV3U1NUYWJsZXMoKTsKLSAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gc3RvcmUubmV3U1NUYWJsZURlc2NyaXB0b3IoZGlyKTsKLSAgICAgICAgVGFibGVNZXRhZGF0YVJlZiBtZXRhZGF0YSA9IFNjaGVtYS5pbnN0YW5jZS5nZXRUYWJsZU1ldGFkYXRhUmVmKGRlc2MpOwotCi0gICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IExpZmVjeWNsZVRyYW5zYWN0aW9uLm9mZmxpbmUoT3BlcmF0aW9uVHlwZS5TVFJFQU0pOwotICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzVG9Xcml0ZSA9IEltbXV0YWJsZVNldC5vZihDb21wb25lbnQuREFUQSwgQ29tcG9uZW50LlBSSU1BUllfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudC5TVEFUUyk7Ci0KLSAgICAgICAgQmlnVGFibGVaZXJvQ29weVdyaXRlciBidHpjdyA9IG5ldyBCaWdUYWJsZVplcm9Db3B5V3JpdGVyKGRlc2MsIG1ldGFkYXRhLCB0eG4sIGNvbXBvbmVudHNUb1dyaXRlKTsKLQotICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzVG9Xcml0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEZpbGVzLmV4aXN0cyhQYXRocy5nZXQoZGVzYy5maWxlbmFtZUZvcihjb21wb25lbnQpKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFpcjxEYXRhSW5wdXRQbHVzLCBMb25nPiBwYWlyID0gZ2V0U1NUYWJsZUNvbXBvbmVudERhdGEoc3N0YWJsZSwgY29tcG9uZW50LCBidWZmZXJNYXBwZXIpOwotCi0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidHpjdy53cml0ZUNvbXBvbmVudChjb21wb25lbnQudHlwZSwgcGFpci5sZWZ0LCBwYWlyLnJpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKENsb3NlZENoYW5uZWxFeGNlcHRpb24gZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmNoZWNrZWRJT0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBDb2xsZWN0aW9uPFNTVGFibGVSZWFkZXI+IHJlYWRlcnMgPSBidHpjdy5maW5pc2godHJ1ZSk7Ci0KLSAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSByZWFkZXJzLnRvQXJyYXkobmV3IFNTVGFibGVSZWFkZXJbMF0pWzBdOwotCi0gICAgICAgIGFzc2VydE5vdEVxdWFscyhzc3RhYmxlLmdldEZpbGVuYW1lKCksIHJlYWRlci5nZXRGaWxlbmFtZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGUuZXN0aW1hdGVkS2V5cygpLCByZWFkZXIuZXN0aW1hdGVkS2V5cygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNzdGFibGUuaXNQZW5kaW5nUmVwYWlyKCksIHJlYWRlci5pc1BlbmRpbmdSZXBhaXIoKSk7Ci0KLSAgICAgICAgYXNzZXJ0Um93Q291bnQoZXhwZWN0ZWRSb3dDb3VudCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJvd0NvdW50KGludCBleHBlY3RlZCkKLSAgICB7Ci0gICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RvcmUubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZWNvcmF0ZWRLZXkgZGsgPSBVdGlsLmRrKFN0cmluZy52YWx1ZU9mKGkpKTsKLSAgICAgICAgICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvciByb3dJdGVyID0gc3N0YWJsZS5yb3dJdGVyYXRvcihkaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZXMuQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbkZpbHRlci5hbGwoc3RvcmUubWV0YWRhdGEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRzTGlzdGVuZXIuTk9PUF9MSVNURU5FUik7Ci0gICAgICAgICAgICB3aGlsZSAocm93SXRlci5oYXNOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcm93SXRlci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGNvdW50KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFBhaXI8RGF0YUlucHV0UGx1cywgTG9uZz4gZ2V0U1NUYWJsZUNvbXBvbmVudERhdGEoU1NUYWJsZVJlYWRlciBzc3RhYmxlLCBDb21wb25lbnQgY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjxCeXRlQnVmZmVyLCBEYXRhSW5wdXRQbHVzPiBidWZmZXJNYXBwZXIpCi0gICAgewotICAgICAgICBGaWxlSGFuZGxlIGNvbXBvbmVudEZpbGUgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihjb21wb25lbnQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVmZmVyU2l6ZSgxMDI0KS5jb21wbGV0ZSgpOwotICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoKGludCkgY29tcG9uZW50RmlsZS5jaGFubmVsLnNpemUoKSk7Ci0gICAgICAgIGNvbXBvbmVudEZpbGUuY2hhbm5lbC5yZWFkKGJ1ZmZlciwgMCk7Ci0gICAgICAgIGJ1ZmZlci5mbGlwKCk7Ci0KLSAgICAgICAgRGF0YUlucHV0UGx1cyBpbnB1dFBsdXMgPSBidWZmZXJNYXBwZXIuYXBwbHkoYnVmZmVyKTsKLQotICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUoaW5wdXRQbHVzLCBjb21wb25lbnRGaWxlLmNoYW5uZWwuc2l6ZSgpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL1Jvd0luZGV4RW50cnlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL1Jvd0luZGV4RW50cnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyYTRjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9iaWcvUm93SW5kZXhFbnRyeVRlc3QuamF2YQpAQCAtMCwwICsxLDg1OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5JbnRzOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLklNZWFzdXJhYmxlTWVtb3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5DcmVhdGVUYWJsZVN0YXRlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5CdWZmZXJEZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWxldGlvblRpbWU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuTGl2ZW5lc3NJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlNlcmlhbGl6YXRpb25IZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuVHlwZVNpemVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQWJzdHJhY3RUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTG9uZ1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucGFydGl0aW9ucy5JbW11dGFibGVCVHJlZVBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkFic3RyYWN0VW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQlRyZWVSb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5CdWZmZXJDZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuQ29sdW1uRGF0YTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkVuY29kaW5nU3RhdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5SYW5nZVRvbWJzdG9uZU1hcmtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlJvdzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlNlcmlhbGl6YXRpb25IZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5VbmZpbHRlcmVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFJvd0l0ZXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZFNlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5JbmRleEluZm87CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TU1RhYmxlRmx1c2hPYnNlcnZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXJPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTG9uZ1NlcmlhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuT2JqZWN0U2l6ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnRyZWUuQlRyZWU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIFJvd0luZGV4RW50cnlUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxBYnN0cmFjdFR5cGU8Pz4+IGNsdXN0ZXJUeXBlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoTG9uZ1R5cGUuaW5zdGFuY2UpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXAgPSBuZXcgQ2x1c3RlcmluZ0NvbXBhcmF0b3IoY2x1c3RlclR5cGVzKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBkdW1teV8xMDBrID0gbmV3IGJ5dGVbMTAwMDAwXTsKKworICAgIHByaXZhdGUgc3RhdGljIENsdXN0ZXJpbmc8Pz4gY24obG9uZyBsKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFV0aWwuY2x1c3RlcmluZyhjb21wLCBsKTsKKyAgICB9CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKQorICAgIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoQmlnRm9ybWF0LmlzU2VsZWN0ZWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QzExMjA2QWdhaW5zdFByZXZpb3VzQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhDYWNoZVNpemUoOTk5OTkpOworICAgICAgICB0ZXN0QzExMjA2QWdhaW5zdFByZXZpb3VzKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QzExMjA2QWdhaW5zdFByZXZpb3VzU2hhbGxvdygpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleENhY2hlU2l6ZSgwKTsKKyAgICAgICAgdGVzdEMxMTIwNkFnYWluc3RQcmV2aW91cygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEMxMTIwNkFnYWluc3RQcmV2aW91cygpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIHBhcnRpdGlvbiB3aXRob3V0IEluZGV4SW5mbworICAgICAgICB0cnkgKERvdWJsZVNlcmlhbGl6ZXIgZG91YmxlU2VyaWFsaXplciA9IG5ldyBEb3VibGVTZXJpYWxpemVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZVNlcmlhbGl6ZXIuYnVpbGQobnVsbCwgcGFydGl0aW9uS2V5KDQyTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoY24oNDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRvdWJsZVNlcmlhbGl6ZXIucmllT2xkU2VyaWFsaXplZCwgZG91YmxlU2VyaWFsaXplci5yaWVOZXdTZXJpYWxpemVkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBhcnRpdGlvbiB3aXRoIG11bHRpcGxlIEluZGV4SW5mbworICAgICAgICB0cnkgKERvdWJsZVNlcmlhbGl6ZXIgZG91YmxlU2VyaWFsaXplciA9IG5ldyBEb3VibGVTZXJpYWxpemVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZVNlcmlhbGl6ZXIuYnVpbGQobnVsbCwgcGFydGl0aW9uS2V5KDQyTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoY24oNDIpLCBjbig0MyksIGNuKDQ0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkb3VibGVTZXJpYWxpemVyLnJpZU9sZFNlcmlhbGl6ZWQsIGRvdWJsZVNlcmlhbGl6ZXIucmllTmV3U2VyaWFsaXplZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwYXJ0aXRpb24gd2l0aCBtdWx0aXBsZSBJbmRleEluZm8KKyAgICAgICAgdHJ5IChEb3VibGVTZXJpYWxpemVyIGRvdWJsZVNlcmlhbGl6ZXIgPSBuZXcgRG91YmxlU2VyaWFsaXplcigpKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGVTZXJpYWxpemVyLmJ1aWxkKG51bGwsIHBhcnRpdGlvbktleSg0MkwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KGNuKDQyKSwgY24oNDMpLCBjbig0NCksIGNuKDQ1KSwgY24oNDYpLCBjbig0NyksIGNuKDQ4KSwgY24oNDkpLCBjbig1MCksIGNuKDUxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkb3VibGVTZXJpYWxpemVyLnJpZU9sZFNlcmlhbGl6ZWQsIGRvdWJsZVNlcmlhbGl6ZXIucmllTmV3U2VyaWFsaXplZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5KGxvbmcgbCkKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIga2V5ID0gTG9uZ1NlcmlhbGl6ZXIuaW5zdGFuY2Uuc2VyaWFsaXplKGwpOworICAgICAgICBUb2tlbiB0b2tlbiA9IE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZS5nZXRUb2tlbihrZXkpOworICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlckRlY29yYXRlZEtleSh0b2tlbiwga2V5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEb3VibGVTZXJpYWxpemVyIGltcGxlbWVudHMgQXV0b0Nsb3NlYWJsZQorICAgIHsKKyAgICAgICAgVGFibGVNZXRhZGF0YSBtZXRhZGF0YSA9CisgICAgICAgICAgICBDcmVhdGVUYWJsZVN0YXRlbWVudC5wYXJzZSgiQ1JFQVRFIFRBQkxFIHBpcGUuZGV2X251bGwgKHBrIGJpZ2ludCwgY2sgYmlnaW50LCB2YWwgdGV4dCwgUFJJTUFSWSBLRVkocGssIGNrKSkiLCAiZm9vIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgVmVyc2lvbiB2ZXJzaW9uID0gQmlnRm9ybWF0LmdldEluc3RhbmNlKCkuZ2V0TGF0ZXN0VmVyc2lvbigpOworCisgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvbkluZm8gPSBuZXcgRGVsZXRpb25UaW1lKEZCVXRpbGl0aWVzLnRpbWVzdGFtcE1pY3JvcygpLCBGQlV0aWxpdGllcy5ub3dJblNlY29uZHMoKSk7CisgICAgICAgIExpdmVuZXNzSW5mbyBwcmltYXJ5S2V5TGl2ZW5lc3NJbmZvID0gTGl2ZW5lc3NJbmZvLkVNUFRZOworICAgICAgICBSb3cuRGVsZXRpb24gZGVsZXRpb24gPSBSb3cuRGVsZXRpb24uTElWRTsKKworICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciA9IG5ldyBTZXJpYWxpemF0aW9uSGVhZGVyKHRydWUsIG1ldGFkYXRhLCBtZXRhZGF0YS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLCBFbmNvZGluZ1N0YXRzLk5PX1NUQVRTKTsKKworICAgICAgICAvLyBjcmVhdGUgQy0xMTIwNiArIG9sZCBzZXJpYWxpemVyIGluc3RhbmNlcworICAgICAgICBSb3dJbmRleEVudHJ5LkluZGV4U2VyaWFsaXplciByaWVTZXJpYWxpemVyID0gbmV3IFJvd0luZGV4RW50cnkuU2VyaWFsaXplcih2ZXJzaW9uLCBoZWFkZXIsIG51bGwpOworICAgICAgICBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIgb2xkU2VyaWFsaXplciA9IG5ldyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5LlNlcmlhbGl6ZXIobWV0YWRhdGEsIHZlcnNpb24sIGhlYWRlcik7CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmVzb3VyY2UiLCAiSU9SZXNvdXJjZU9wZW5lZEJ1dE5vdFNhZmVseUNsb3NlZCIgfSkKKyAgICAgICAgZmluYWwgRGF0YU91dHB1dEJ1ZmZlciByaWVPdXRwdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigxMDI0KTsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmVzb3VyY2UiLCAiSU9SZXNvdXJjZU9wZW5lZEJ1dE5vdFNhZmVseUNsb3NlZCIgfSkKKyAgICAgICAgZmluYWwgRGF0YU91dHB1dEJ1ZmZlciBvbGRPdXRwdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigxMDI0KTsKKworICAgICAgICBmaW5hbCBTZXF1ZW50aWFsV3JpdGVyIGRhdGFXcml0ZXJOZXc7CisgICAgICAgIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXIgZGF0YVdyaXRlck9sZDsKKyAgICAgICAgZmluYWwgQmlnRm9ybWF0UGFydGl0aW9uV3JpdGVyIHBhcnRpdGlvbldyaXRlcjsKKworICAgICAgICBSb3dJbmRleEVudHJ5IHJpZU5ldzsKKyAgICAgICAgQnl0ZUJ1ZmZlciByaWVOZXdTZXJpYWxpemVkOworICAgICAgICBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHJpZU9sZDsKKyAgICAgICAgQnl0ZUJ1ZmZlciByaWVPbGRTZXJpYWxpemVkOworCisgICAgICAgIERvdWJsZVNlcmlhbGl6ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlck9wdGlvbiBvcHRpb24gPSBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uLm5ld0J1aWxkZXIoKS5idWZmZXJTaXplKDEwMjQpLmJ1aWxkKCk7CisgICAgICAgICAgICBGaWxlIGYgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoIlJvd0luZGV4RW50cnlUZXN0LSIsICJkYiIpOworICAgICAgICAgICAgZGF0YVdyaXRlck5ldyA9IG5ldyBTZXF1ZW50aWFsV3JpdGVyKGYsIG9wdGlvbik7CisgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIgPSBuZXcgQmlnRm9ybWF0UGFydGl0aW9uV3JpdGVyKGhlYWRlciwgZGF0YVdyaXRlck5ldywgdmVyc2lvbiwgcmllU2VyaWFsaXplci5pbmRleEluZm9TZXJpYWxpemVyKCkpOworCisgICAgICAgICAgICBmID0gRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlKCJSb3dJbmRleEVudHJ5VGVzdC0iLCAiZGIiKTsKKyAgICAgICAgICAgIGRhdGFXcml0ZXJPbGQgPSBuZXcgU2VxdWVudGlhbFdyaXRlcihmLCBvcHRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGRhdGFXcml0ZXJOZXcuY2xvc2UoKTsKKyAgICAgICAgICAgIGRhdGFXcml0ZXJPbGQuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgYnVpbGQoUm93IHN0YXRpY1JvdywgRGVjb3JhdGVkS2V5IHBhcnRpdGlvbktleSwKKyAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPENsdXN0ZXJpbmc8Pz4+IGNsdXN0ZXJpbmdzLCBsb25nIHN0YXJ0UG9zaXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICB7CisKKyAgICAgICAgICAgIEl0ZXJhdG9yPENsdXN0ZXJpbmc8Pz4+IGNsdXN0ZXJpbmdJdGVyID0gY2x1c3RlcmluZ3MuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHBhcnRpdGlvbldyaXRlci5zdGFydChwYXJ0aXRpb25LZXksIERlbGV0aW9uVGltZS5MSVZFKTsKKyAgICAgICAgICAgIGlmIChzdGF0aWNSb3cgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIuYWRkU3RhdGljUm93KHN0YXRpY1Jvdyk7CisgICAgICAgICAgICBBYnN0cmFjdFVuZmlsdGVyZWRSb3dJdGVyYXRvciByb3dJdGVyID0gbWFrZVJvd0l0ZXIoc3RhdGljUm93LCBwYXJ0aXRpb25LZXksIGNsdXN0ZXJpbmdJdGVyLCBkYXRhV3JpdGVyTmV3KTsKKyAgICAgICAgICAgIHdoaWxlIChyb3dJdGVyLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIuYWRkVW5maWx0ZXJlZChyb3dJdGVyLm5leHQoKSk7CisgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIuZmluaXNoKCk7CisKKyAgICAgICAgICAgIHJpZU5ldyA9IFJvd0luZGV4RW50cnkuY3JlYXRlKHN0YXJ0UG9zaXRpb24sIDBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRpb25JbmZvLCBwYXJ0aXRpb25Xcml0ZXIuZ2V0SGVhZGVyTGVuZ3RoKCksIHBhcnRpdGlvbldyaXRlci5nZXRDb2x1bW5JbmRleENvdW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb25Xcml0ZXIuaW5kZXhJbmZvU2VyaWFsaXplZFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRpdGlvbldyaXRlci5pbmRleFNhbXBsZXMoKSwgcGFydGl0aW9uV3JpdGVyLm9mZnNldHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZVNlcmlhbGl6ZXIuaW5kZXhJbmZvU2VyaWFsaXplcigpKTsKKyAgICAgICAgICAgIHJpZVNlcmlhbGl6ZXIuc2VyaWFsaXplKHJpZU5ldywgcmllT3V0cHV0LCBwYXJ0aXRpb25Xcml0ZXIuYnVmZmVyKCkpOworICAgICAgICAgICAgcmllTmV3U2VyaWFsaXplZCA9IHJpZU91dHB1dC5idWZmZXIoKS5kdXBsaWNhdGUoKTsKKworICAgICAgICAgICAgSXRlcmF0b3I8Q2x1c3RlcmluZzw/Pj4gY2x1c3RlcmluZ0l0ZXIyID0gY2x1c3RlcmluZ3MuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIENvbHVtbkluZGV4IGNvbHVtbkluZGV4ID0gUm93SW5kZXhFbnRyeVRlc3QuQ29sdW1uSW5kZXgud3JpdGVBbmRCdWlsZEluZGV4KG1ha2VSb3dJdGVyKHN0YXRpY1JvdywgcGFydGl0aW9uS2V5LCBjbHVzdGVyaW5nSXRlcjIsIGRhdGFXcml0ZXJPbGQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVdyaXRlck9sZCwgaGVhZGVyLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBCaWdGb3JtYXQuZ2V0SW5zdGFuY2UoKS5nZXRMYXRlc3RWZXJzaW9uKCkpOworICAgICAgICAgICAgcmllT2xkID0gUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeS5jcmVhdGUoc3RhcnRQb3NpdGlvbiwgZGVsZXRpb25JbmZvLCBjb2x1bW5JbmRleCk7CisgICAgICAgICAgICBvbGRTZXJpYWxpemVyLnNlcmlhbGl6ZShyaWVPbGQsIG9sZE91dHB1dCk7CisgICAgICAgICAgICByaWVPbGRTZXJpYWxpemVkID0gb2xkT3V0cHV0LmJ1ZmZlcigpLmR1cGxpY2F0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBBYnN0cmFjdFVuZmlsdGVyZWRSb3dJdGVyYXRvciBtYWtlUm93SXRlcihSb3cgc3RhdGljUm93LCBEZWNvcmF0ZWRLZXkgcGFydGl0aW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPENsdXN0ZXJpbmc8Pz4+IGNsdXN0ZXJpbmdJdGVyLCBTZXF1ZW50aWFsV3JpdGVyIGRhdGFXcml0ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RVbmZpbHRlcmVkUm93SXRlcmF0b3IobWV0YWRhdGEsIHBhcnRpdGlvbktleSwgZGVsZXRpb25JbmZvLCBtZXRhZGF0YS5yZWd1bGFyQW5kU3RhdGljQ29sdW1ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNSb3csIGZhbHNlLCBuZXcgRW5jb2RpbmdTdGF0cygwLCAwLCAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgVW5maWx0ZXJlZCBjb21wdXRlTmV4dCgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWNsdXN0ZXJpbmdJdGVyLmhhc05leHQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRPZkRhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIHNvbWUgZmFrZSBieXRlcyB0byB0aGUgZGF0YSBmaWxlIHRvIGZvcmNlIHdyaXRpbmcgdGhlIEluZGV4SW5mbyBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFXcml0ZXIud3JpdGUoZHVtbXlfMTAwayk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZFJvdyhjbHVzdGVyaW5nSXRlci5uZXh0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFVuZmlsdGVyZWQgYnVpbGRSb3coQ2x1c3RlcmluZzw/PiBjbHVzdGVyaW5nKQorICAgICAgICB7CisgICAgICAgICAgICBCVHJlZS5CdWlsZGVyPENvbHVtbkRhdGE+IGJ1aWxkZXIgPSBCVHJlZS5idWlsZGVyKENvbHVtbkRhdGEuY29tcGFyYXRvcik7CisgICAgICAgICAgICBidWlsZGVyLmFkZChCdWZmZXJDZWxsLmxpdmUobWV0YWRhdGEucmVndWxhckFuZFN0YXRpY0NvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyLmFsbG9jYXRlKDApKSk7CisgICAgICAgICAgICByZXR1cm4gQlRyZWVSb3cuY3JlYXRlKGNsdXN0ZXJpbmcsIHByaW1hcnlLZXlMaXZlbmVzc0luZm8sIGRlbGV0aW9uLCBidWlsZGVyLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlIEMtMTEyMDYgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgQ29sdW1uSW5kZXgKKyAgICB7CisgICAgICAgIGZpbmFsIGxvbmcgcGFydGl0aW9uSGVhZGVyTGVuZ3RoOworICAgICAgICBmaW5hbCBMaXN0PEluZGV4SW5mbz4gY29sdW1uc0luZGV4OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbHVtbkluZGV4IEVNUFRZID0gbmV3IENvbHVtbkluZGV4KC0xLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7CisKKyAgICAgICAgcHJpdmF0ZSBDb2x1bW5JbmRleChsb25nIHBhcnRpdGlvbkhlYWRlckxlbmd0aCwgTGlzdDxJbmRleEluZm8+IGNvbHVtbnNJbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGNvbHVtbnNJbmRleCAhPSBudWxsOworCisgICAgICAgICAgICB0aGlzLnBhcnRpdGlvbkhlYWRlckxlbmd0aCA9IHBhcnRpdGlvbkhlYWRlckxlbmd0aDsKKyAgICAgICAgICAgIHRoaXMuY29sdW1uc0luZGV4ID0gY29sdW1uc0luZGV4OworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIENvbHVtbkluZGV4IHdyaXRlQW5kQnVpbGRJbmRleChVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlciBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlRmx1c2hPYnNlcnZlcj4gb2JzZXJ2ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCAhaXRlcmF0b3IuaXNFbXB0eSgpOworCisgICAgICAgICAgICBCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQnVpbGRlcihpdGVyYXRvciwgb3V0cHV0LCBoZWFkZXIsIG9ic2VydmVycywgdmVyc2lvbi5jb3JyZXNwb25kaW5nTWVzc2FnaW5nVmVyc2lvbigpKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIENvbHVtbkluZGV4IG5vdGhpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gRU1QVFk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSGVscCB0byBjcmVhdGUgYW4gaW5kZXggZm9yIGEgY29sdW1uIGZhbWlseSBiYXNlZCBvbiBzaXplIG9mIGNvbHVtbnMsCisgICAgICAgICAqIGFuZCB3cml0ZSBzYWlkIGNvbHVtbnMgdG8gZGlzay4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJ1aWxkZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBVbmZpbHRlcmVkUm93SXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXJpYWxpemF0aW9uSGVscGVyIGhlbHBlcjsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXI7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIGludCB2ZXJzaW9uOworCisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8SW5kZXhJbmZvPiBjb2x1bW5zSW5kZXggPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBpbml0aWFsUG9zaXRpb247CisgICAgICAgICAgICBwcml2YXRlIGxvbmcgaGVhZGVyTGVuZ3RoID0gLTE7CisKKyAgICAgICAgICAgIHByaXZhdGUgbG9uZyBzdGFydFBvc2l0aW9uID0gLTE7CisKKyAgICAgICAgICAgIHByaXZhdGUgaW50IHdyaXR0ZW47CisgICAgICAgICAgICBwcml2YXRlIGxvbmcgcHJldmlvdXNSb3dTdGFydDsKKworICAgICAgICAgICAgcHJpdmF0ZSBDbHVzdGVyaW5nUHJlZml4PD8+IGZpcnN0Q2x1c3RlcmluZzsKKyAgICAgICAgICAgIHByaXZhdGUgQ2x1c3RlcmluZ1ByZWZpeDw/PiBsYXN0Q2x1c3RlcmluZzsKKworICAgICAgICAgICAgcHJpdmF0ZSBEZWxldGlvblRpbWUgb3Blbk1hcmtlcjsKKworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFNTVGFibGVGbHVzaE9ic2VydmVyPiBvYnNlcnZlcnM7CisKKyAgICAgICAgICAgIEJ1aWxkZXIoVW5maWx0ZXJlZFJvd0l0ZXJhdG9yIGl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlciB3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248U1NUYWJsZUZsdXNoT2JzZXJ2ZXI+IG9ic2VydmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJzaW9uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKKyAgICAgICAgICAgICAgICB0aGlzLndyaXRlciA9IHdyaXRlcjsKKyAgICAgICAgICAgICAgICB0aGlzLmhlbHBlciA9IG5ldyBTZXJpYWxpemF0aW9uSGVscGVyKGhlYWRlcik7CisgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CisgICAgICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmVycyA9IG9ic2VydmVycyA9PSBudWxsID8gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgOiBvYnNlcnZlcnM7CisgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsUG9zaXRpb24gPSB3cml0ZXIucG9zaXRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlUGFydGl0aW9uSGVhZGVyKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwud3JpdGVXaXRoU2hvcnRMZW5ndGgoaXRlcmF0b3IucGFydGl0aW9uS2V5KCkuZ2V0S2V5KCksIHdyaXRlcik7CisgICAgICAgICAgICAgICAgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplKGl0ZXJhdG9yLnBhcnRpdGlvbkxldmVsRGVsZXRpb24oKSwgd3JpdGVyKTsKKyAgICAgICAgICAgICAgICBpZiAoaGVhZGVyLmhhc1N0YXRpYygpKQorICAgICAgICAgICAgICAgICAgICBVbmZpbHRlcmVkU2VyaWFsaXplci5zZXJpYWxpemVyLnNlcmlhbGl6ZVN0YXRpY1JvdyhpdGVyYXRvci5zdGF0aWNSb3coKSwgaGVscGVyLCB3cml0ZXIsIHZlcnNpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgQ29sdW1uSW5kZXggYnVpbGQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZVBhcnRpdGlvbkhlYWRlcihpdGVyYXRvcik7CisgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJMZW5ndGggPSB3cml0ZXIucG9zaXRpb24oKSAtIGluaXRpYWxQb3NpdGlvbjsKKworICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIGFkZChpdGVyYXRvci5uZXh0KCkpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGNsb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgbG9uZyBjdXJyZW50UG9zaXRpb24oKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB3cml0ZXIucG9zaXRpb24oKSAtIGluaXRpYWxQb3NpdGlvbjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZEluZGV4QmxvY2soKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluZGV4SW5mbyBjSW5kZXhJbmZvID0gbmV3IEluZGV4SW5mbyhmaXJzdENsdXN0ZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDbHVzdGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zaXRpb24oKSAtIHN0YXJ0UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5NYXJrZXIpOworICAgICAgICAgICAgICAgIGNvbHVtbnNJbmRleC5hZGQoY0luZGV4SW5mbyk7CisgICAgICAgICAgICAgICAgZmlyc3RDbHVzdGVyaW5nID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZChVbmZpbHRlcmVkIHVuZmlsdGVyZWQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgcG9zID0gY3VycmVudFBvc2l0aW9uKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RDbHVzdGVyaW5nID09IG51bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBCZWdpbm5pbmcgb2YgYW4gaW5kZXggYmxvY2suIFJlbWVtYmVyIHRoZSBzdGFydCBhbmQgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgZmlyc3RDbHVzdGVyaW5nID0gdW5maWx0ZXJlZC5jbHVzdGVyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24gPSBwb3M7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVW5maWx0ZXJlZFNlcmlhbGl6ZXIuc2VyaWFsaXplci5zZXJpYWxpemUodW5maWx0ZXJlZCwgaGVscGVyLCB3cml0ZXIsIHBvcyAtIHByZXZpb3VzUm93U3RhcnQsIHZlcnNpb24pOworCisgICAgICAgICAgICAgICAgLy8gbm90aWZ5IG9ic2VydmVycyBhYm91dCBlYWNoIG5ldyByb3cKKyAgICAgICAgICAgICAgICBpZiAoIW9ic2VydmVycy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIG9ic2VydmVycy5mb3JFYWNoKChvKSAtPiBvLm5leHRVbmZpbHRlcmVkQ2x1c3Rlcih1bmZpbHRlcmVkKSk7CisKKyAgICAgICAgICAgICAgICBsYXN0Q2x1c3RlcmluZyA9IHVuZmlsdGVyZWQuY2x1c3RlcmluZygpOworICAgICAgICAgICAgICAgIHByZXZpb3VzUm93U3RhcnQgPSBwb3M7CisgICAgICAgICAgICAgICAgKyt3cml0dGVuOworCisgICAgICAgICAgICAgICAgaWYgKHVuZmlsdGVyZWQua2luZCgpID09IFVuZmlsdGVyZWQuS2luZC5SQU5HRV9UT01CU1RPTkVfTUFSS0VSKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgUmFuZ2VUb21ic3RvbmVNYXJrZXIgbWFya2VyID0gKFJhbmdlVG9tYnN0b25lTWFya2VyKXVuZmlsdGVyZWQ7CisgICAgICAgICAgICAgICAgICAgIG9wZW5NYXJrZXIgPSBtYXJrZXIuaXNPcGVuKGZhbHNlKSA/IG1hcmtlci5vcGVuRGVsZXRpb25UaW1lKGZhbHNlKSA6IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaWYgd2UgaGl0IHRoZSBjb2x1bW4gaW5kZXggc2l6ZSB0aGF0IHdlIGhhdmUgdG8gaW5kZXggYWZ0ZXIsIGdvIGFoZWFkIGFuZCBpbmRleCBpdC4KKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBvc2l0aW9uKCkgLSBzdGFydFBvc2l0aW9uID49IERhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleFNpemUoQmlnRm9ybWF0UGFydGl0aW9uV3JpdGVyLkRFRkFVTFRfR1JBTlVMQVJJVFkpKQorICAgICAgICAgICAgICAgICAgICBhZGRJbmRleEJsb2NrKCk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBDb2x1bW5JbmRleCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRTZXJpYWxpemVyLnNlcmlhbGl6ZXIud3JpdGVFbmRPZlBhcnRpdGlvbih3cml0ZXIpOworCisgICAgICAgICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB3ZSBhZGQgbm8gcm93cywganVzdCBhIHRvcCBsZXZlbCBkZWxldGlvbgorICAgICAgICAgICAgICAgIGlmICh3cml0dGVuID09IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSb3dJbmRleEVudHJ5VGVzdC5Db2x1bW5JbmRleC5FTVBUWTsKKworICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IGNvbHVtbiBtYXkgaGF2ZSBmYWxsZW4gb24gYW4gaW5kZXggYm91bmRhcnkgYWxyZWFkeS4gIGlmIG5vdCwgaW5kZXggaXQgZXhwbGljaXRseS4KKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RDbHVzdGVyaW5nICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGFkZEluZGV4QmxvY2soKTsKKworICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBhbHdheXMgaGF2ZSBhdCBsZWFzdCBvbmUgY29tcHV0ZWQgaW5kZXggYmxvY2ssIGJ1dCB3ZSBvbmx5IHdyaXRlIGl0IG91dCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gdGhhdC4KKyAgICAgICAgICAgICAgICBhc3NlcnQgIWNvbHVtbnNJbmRleC5pc0VtcHR5KCkgJiYgaGVhZGVyTGVuZ3RoID49IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5JbmRleChoZWFkZXJMZW5ndGgsIGNvbHVtbnNJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVkU2l6ZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChhIGludCwgYiB0ZXh0LCBjIGludCwgUFJJTUFSWSBLRVkoYSwgYikpIik7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhYmxlTmFtZSk7CisKKyAgICAgICAgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeSBzaW1wbGUgPSBuZXcgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeSgxMjMpOworCisgICAgICAgIERhdGFPdXRwdXRCdWZmZXIgYnVmZmVyID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKTsKKyAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBuZXcgU2VyaWFsaXphdGlvbkhlYWRlcih0cnVlLCBjZnMubWV0YWRhdGEoKSwgY2ZzLm1ldGFkYXRhKCkucmVndWxhckFuZFN0YXRpY0NvbHVtbnMoKSwgRW5jb2RpbmdTdGF0cy5OT19TVEFUUyk7CisgICAgICAgIFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuU2VyaWFsaXplciBzZXJpYWxpemVyID0gbmV3IFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuU2VyaWFsaXplcihjZnMubWV0YWRhdGEoKSwgQmlnRm9ybWF0LmdldEluc3RhbmNlKCkuZ2V0TGF0ZXN0VmVyc2lvbigpLCBoZWFkZXIpOworCisgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKHNpbXBsZSwgYnVmZmVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoYnVmZmVyLmdldExlbmd0aCgpLCBzZXJpYWxpemVyLnNlcmlhbGl6ZWRTaXplKHNpbXBsZSkpOworCisgICAgICAgIC8vIHdyaXRlIGVub3VnaCByb3dzIHRvIGVuc3VyZSB3ZSBnZXQgYSBmZXcgY29sdW1uIGluZGV4IGVudHJpZXMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZShCaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXIuREVGQVVMVF9HUkFOVUxBUklUWSkgLyA0OyBpKyspCisgICAgICAgICAgICBleGVjdXRlKCJJTlNFUlQgSU5UTyAlcyAoYSwgYiwgYykgVkFMVUVTICg/LCA/LCA/KSIsIDAsIFN0cmluZy52YWx1ZU9mKGkpLCBpKTsKKworICAgICAgICBJbW11dGFibGVCVHJlZVBhcnRpdGlvbiBwYXJ0aXRpb24gPSBVdGlsLmdldE9ubHlQYXJ0aXRpb25VbmZpbHRlcmVkKFV0aWwuY21kKGNmcykuYnVpbGQoKSk7CisKKyAgICAgICAgRmlsZSB0ZW1wRmlsZSA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgicm93X2luZGV4X2VudHJ5X3Rlc3QiLCBudWxsKTsKKyAgICAgICAgdGVtcEZpbGUuZGVsZXRlT25FeGl0KCk7CisgICAgICAgIFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbmV3IFNlcXVlbnRpYWxXcml0ZXIodGVtcEZpbGUpOworICAgICAgICBDb2x1bW5JbmRleCBjb2x1bW5JbmRleCA9IFJvd0luZGV4RW50cnlUZXN0LkNvbHVtbkluZGV4LndyaXRlQW5kQnVpbGRJbmRleChwYXJ0aXRpb24udW5maWx0ZXJlZEl0ZXJhdG9yKCksIHdyaXRlciwgaGVhZGVyLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBCaWdGb3JtYXQuZ2V0SW5zdGFuY2UoKS5nZXRMYXRlc3RWZXJzaW9uKCkpOworICAgICAgICBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHdpdGhJbmRleCA9IFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuY3JlYXRlKDB4ZGVhZGJlZWYsIERlbGV0aW9uVGltZS5MSVZFLCBjb2x1bW5JbmRleCk7CisgICAgICAgIEluZGV4SW5mby5TZXJpYWxpemVyIGluZGV4U2VyaWFsaXplciA9IEluZGV4SW5mby5zZXJpYWxpemVyKEJpZ0Zvcm1hdC5nZXRJbnN0YW5jZSgpLmdldExhdGVzdFZlcnNpb24oKSwgaGVhZGVyKTsKKworICAgICAgICAvLyBzYW5pdHkgY2hlY2sKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb2x1bW5JbmRleC5jb2x1bW5zSW5kZXguc2l6ZSgpID49IDMpOworCisgICAgICAgIGJ1ZmZlciA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7CisgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKHdpdGhJbmRleCwgYnVmZmVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1ZmZlci5nZXRMZW5ndGgoKSwgc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZSh3aXRoSW5kZXgpKTsKKworICAgICAgICAvLyBzZXJpYWxpemF0aW9uIGNoZWNrCisKKyAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IGJ1ZmZlci5idWZmZXIoKTsKKyAgICAgICAgRGF0YUlucHV0QnVmZmVyIGlucHV0ID0gbmV3IERhdGFJbnB1dEJ1ZmZlcihiYiwgZmFsc2UpOworICAgICAgICBzZXJpYWxpemF0aW9uQ2hlY2sod2l0aEluZGV4LCBpbmRleFNlcmlhbGl6ZXIsIGJiLCBpbnB1dCk7CisKKyAgICAgICAgLy8gdGVzdCB3aXRoIGFuIG91dHB1dCBzdHJlYW0gdGhhdCBkb2Vzbid0IHN1cHBvcnQgYSBmaWxlLXBvaW50ZXIKKyAgICAgICAgYnVmZmVyID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQb3NpdGlvbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgbG9uZyBwb3NpdGlvbigpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKHdpdGhJbmRleCwgYnVmZmVyKTsKKyAgICAgICAgYmIgPSBidWZmZXIuYnVmZmVyKCk7CisgICAgICAgIGlucHV0ID0gbmV3IERhdGFJbnB1dEJ1ZmZlcihiYiwgZmFsc2UpOworICAgICAgICBzZXJpYWxpemF0aW9uQ2hlY2sod2l0aEluZGV4LCBpbmRleFNlcmlhbGl6ZXIsIGJiLCBpbnB1dCk7CisKKyAgICAgICAgLy8KKworICAgICAgICBiYiA9IGJ1ZmZlci5idWZmZXIoKTsKKyAgICAgICAgaW5wdXQgPSBuZXcgRGF0YUlucHV0QnVmZmVyKGJiLCBmYWxzZSk7CisgICAgICAgIFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuU2VyaWFsaXplci5za2lwKGlucHV0LCBCaWdGb3JtYXQuZ2V0SW5zdGFuY2UoKS5nZXRMYXRlc3RWZXJzaW9uKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGJiLnJlbWFpbmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNlcmlhbGl6YXRpb25DaGVjayhQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHdpdGhJbmRleCwgSW5kZXhJbmZvLlNlcmlhbGl6ZXIgaW5kZXhTZXJpYWxpemVyLCBCeXRlQnVmZmVyIGJiLCBEYXRhSW5wdXRCdWZmZXIgaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygweGRlYWRiZWVmLCBpbnB1dC5yZWFkVW5zaWduZWRWSW50KCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdpdGhJbmRleC5wcm9tb3RlZFNpemUoaW5kZXhTZXJpYWxpemVyKSwgaW5wdXQucmVhZFVuc2lnbmVkVkludCgpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdpdGhJbmRleC5oZWFkZXJMZW5ndGgoKSwgaW5wdXQucmVhZFVuc2lnbmVkVkludCgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh3aXRoSW5kZXguZGVsZXRpb25UaW1lKCksIERlbGV0aW9uVGltZS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGlucHV0KSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLnNpemUoKSwgaW5wdXQucmVhZFVuc2lnbmVkVkludCgpKTsKKworICAgICAgICBpbnQgb2Zmc2V0ID0gYmIucG9zaXRpb24oKTsKKyAgICAgICAgaW50W10gb2Zmc2V0cyA9IG5ldyBpbnRbd2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLnNpemUoKV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLnNpemUoKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcG9zID0gYmIucG9zaXRpb24oKTsKKyAgICAgICAgICAgIG9mZnNldHNbaV0gPSBwb3MgLSBvZmZzZXQ7CisgICAgICAgICAgICBJbmRleEluZm8gaW5mbyA9IGluZGV4U2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbnB1dCk7CisgICAgICAgICAgICBpbnQgZW5kID0gYmIucG9zaXRpb24oKTsKKworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpbmRleFNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoaW5mbyksIGVuZCAtIHBvcyk7CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS5vZmZzZXQsIGluZm8ub2Zmc2V0KTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS53aWR0aCwgaW5mby53aWR0aCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdpdGhJbmRleC5jb2x1bW5zSW5kZXgoKS5nZXQoaSkuZW5kT3Blbk1hcmtlciwgaW5mby5lbmRPcGVuTWFya2VyKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS5maXJzdE5hbWUsIGluZm8uZmlyc3ROYW1lKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMod2l0aEluZGV4LmNvbHVtbnNJbmRleCgpLmdldChpKS5sYXN0TmFtZSwgaW5mby5sYXN0TmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpdGhJbmRleC5jb2x1bW5zSW5kZXgoKS5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMob2Zmc2V0c1tpXSwgaW5wdXQucmVhZEludCgpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIGJiLnJlbWFpbmluZygpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeSBpbXBsZW1lbnRzIElNZWFzdXJhYmxlTWVtb3J5CisgICAgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEVNUFRZX1NJWkUgPSBPYmplY3RTaXplcy5tZWFzdXJlKG5ldyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5KDApKTsKKworICAgICAgICBwdWJsaWMgZmluYWwgbG9uZyBwb3NpdGlvbjsKKworICAgICAgICBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5KGxvbmcgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBpbnQgcHJvbW90ZWRTaXplKEluZGV4SW5mby5TZXJpYWxpemVyIGlkeFNlcmlhbGl6ZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IGNyZWF0ZShsb25nIHBvc2l0aW9uLCBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lLCBDb2x1bW5JbmRleCBpbmRleCkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0IGluZGV4ICE9IG51bGw7CisgICAgICAgICAgICBhc3NlcnQgZGVsZXRpb25UaW1lICE9IG51bGw7CisKKyAgICAgICAgICAgIC8vIHdlIG9ubHkgY29uc2lkZXIgdGhlIGNvbHVtbnMgc3VtbWFyeSB3aGVuIGRldGVybWluaW5nIHdoZXRoZXIgdG8gY3JlYXRlIGFuIEluZGV4ZWRFbnRyeSwKKyAgICAgICAgICAgIC8vIHNpbmNlIGlmIHRoZXJlIGFyZSBpbnN1ZmZpY2llbnQgY29sdW1ucyB0byBiZSB3b3J0aCBpbmRleGluZyB3ZSdyZSBnb2luZyB0byBzZWVrIHRvCisgICAgICAgICAgICAvLyB0aGUgYmVnaW5uaW5nIG9mIHRoZSByb3cgYW55d2F5LCBzbyB3ZSBtaWdodCBhcyB3ZWxsIHJlYWQgdGhlIHRvbWJzdG9uZSB0aGVyZSBhcyB3ZWxsLgorICAgICAgICAgICAgaWYgKGluZGV4LmNvbHVtbnNJbmRleC5zaXplKCkgPiAxKQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeS5JbmRleGVkRW50cnkocG9zaXRpb24sIGRlbGV0aW9uVGltZSwgaW5kZXgucGFydGl0aW9uSGVhZGVyTGVuZ3RoLCBpbmRleC5jb2x1bW5zSW5kZXgpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJlX0NfMTEyMDZfUm93SW5kZXhFbnRyeShwb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgaW5kZXggZW50cnkgY29udGFpbnMgdGhlIHJvdy1sZXZlbCB0b21ic3RvbmUgYW5kIGNvbHVtbiBzdW1tYXJ5LiAgT3RoZXJ3aXNlLAorICAgICAgICAgKiBjYWxsZXIgc2hvdWxkIGZldGNoIHRoZXNlIGZyb20gdGhlIHJvdyBoZWFkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luZGV4ZWQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gIWNvbHVtbnNJbmRleCgpLmlzRW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKCkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgcm93IGhlYWRlciAocGFydGl0aW9uIGtleSwgcGFydGl0aW9uIGRlbGV0aW9uIGFuZCBzdGF0aWMgcm93KS4KKyAgICAgICAgICogVGhpcyB2YWx1ZSBpcyBvbmx5IHByb3ZpZGVkIGZvciBpbmRleGVkIGVudHJpZXMgYW5kIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cKKyAgICAgICAgICoge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSBpZiB7QGNvZGUgIWlzSW5kZXhlZCgpfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBsb25nIGhlYWRlckxlbmd0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8SW5kZXhJbmZvPiBjb2x1bW5zSW5kZXgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyB1bnNoYXJlZEhlYXBTaXplKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEVNUFRZX1NJWkU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlcmlhbGl6ZXIKKyAgICAgICAgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbmRleEluZm8uU2VyaWFsaXplciBpZHhTZXJpYWxpemVyOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBWZXJzaW9uIHZlcnNpb247CisKKyAgICAgICAgICAgIFNlcmlhbGl6ZXIoVGFibGVNZXRhZGF0YSBtZXRhZGF0YSwgVmVyc2lvbiB2ZXJzaW9uLCBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlzLmlkeFNlcmlhbGl6ZXIgPSBJbmRleEluZm8uc2VyaWFsaXplcih2ZXJzaW9uLCBoZWFkZXIpOworICAgICAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHJpZSwgRGF0YU91dHB1dFBsdXMgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocmllLnBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMihyaWUucHJvbW90ZWRTaXplKGlkeFNlcmlhbGl6ZXIpKTsKKworICAgICAgICAgICAgICAgIGlmIChyaWUuaXNJbmRleGVkKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQocmllLmhlYWRlckxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplKHJpZS5kZWxldGlvblRpbWUoKSwgb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50MzIocmllLmNvbHVtbnNJbmRleCgpLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGFuZCB3cml0ZSB0aGUgb2Zmc2V0cyB0byB0aGUgSW5kZXhJbmZvIG9iamVjdHMuCisKKyAgICAgICAgICAgICAgICAgICAgaW50W10gb2Zmc2V0cyA9IG5ldyBpbnRbcmllLmNvbHVtbnNJbmRleCgpLnNpemUoKV07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dC5oYXNQb3NpdGlvbigpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdXQgaXMgdXN1YWxseSBhIFNlcXVlbnRpYWxXcml0ZXIsIHNvIHVzaW5nIHRoZSBmaWxlLXBvaW50ZXIgaXMgZmluZSB0byBnZW5lcmF0ZSB0aGUgb2Zmc2V0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgRGF0YU91dHB1dEJ1ZmZlciBhbHNvIHdvcmtzLgorICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBzdGFydCA9IG91dC5wb3NpdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJbmRleEluZm8gaW5mbyA6IHJpZS5jb2x1bW5zSW5kZXgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzW2ldID0gaSA9PSAwID8gMCA6IChpbnQpKG91dC5wb3NpdGlvbigpIC0gc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHhTZXJpYWxpemVyLnNlcmlhbGl6ZShpbmZvLCBvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90IHN1cmUgdGhpcyBicmFuY2ggd2lsbCBldmVyIGJlIG5lZWRlZCwgYnV0IGlmIGl0IGlzIGNhbGxlZCwgaXQgaGFzIHRvIGNhbGN1bGF0ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcmlhbGl6ZWQgc2l6ZXMgaW5zdGVhZCBvZiBzaW1wbHkgdXNpbmcgdGhlIGZpbGUtcG9pbnRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChJbmRleEluZm8gaW5mbyA6IHJpZS5jb2x1bW5zSW5kZXgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzW2krK10gPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4U2VyaWFsaXplci5zZXJpYWxpemUoaW5mbywgb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gaWR4U2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShpbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IG9mZiA6IG9mZnNldHMpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVJbnQob2ZmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBpbi5yZWFkVW5zaWduZWRWSW50KCk7CisKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworICAgICAgICAgICAgICAgIGlmIChzaXplID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgaGVhZGVyTGVuZ3RoID0gaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgICAgICAgICBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lID0gRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4pOworICAgICAgICAgICAgICAgICAgICBpbnQgZW50cmllcyA9IGluLnJlYWRVbnNpZ25lZFZJbnQzMigpOworICAgICAgICAgICAgICAgICAgICBMaXN0PEluZGV4SW5mbz4gY29sdW1uc0luZGV4ID0gbmV3IEFycmF5TGlzdDw+KGVudHJpZXMpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNJbmRleC5hZGQoaWR4U2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbikpOworCisgICAgICAgICAgICAgICAgICAgIGluLnNraXBCeXRlc0Z1bGx5KGVudHJpZXMgKiBUeXBlU2l6ZXMuc2l6ZW9mKDApKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByZV9DXzExMjA2X1Jvd0luZGV4RW50cnkuSW5kZXhlZEVudHJ5KHBvc2l0aW9uLCBkZWxldGlvblRpbWUsIGhlYWRlckxlbmd0aCwgY29sdW1uc0luZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5KHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFJlYWRzIG9ubHkgdGhlIGRhdGEgJ3Bvc2l0aW9uJyBvZiB0aGUgaW5kZXggZW50cnkgYW5kIHJldHVybnMgaXQuIE5vdGUgdGhhdCB0aGlzIGxlZnQgJ2luJyBpbiB0aGUgbWlkZGxlCisgICAgICAgICAgICAvLyBvZiByZWFkaW5nIGFuIGVudHJ5LCBzbyB0aGlzIGlzIG9ubHkgdXNlZnVsIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyBhbmQgaW4gbW9zdCBjYXNlICdkZXNlcmlhbGl6ZScKKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisgICAgICAgICAgICBzdGF0aWMgbG9uZyByZWFkUG9zaXRpb24oRGF0YUlucHV0UGx1cyBpbiwgVmVyc2lvbiB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW4ucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2tpcChEYXRhSW5wdXRQbHVzIGluLCBWZXJzaW9uIHZlcnNpb24pIHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlYWRQb3NpdGlvbihpbiwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgc2tpcFByb21vdGVkSW5kZXgoaW4sIHZlcnNpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNraXBQcm9tb3RlZEluZGV4KERhdGFJbnB1dFBsdXMgaW4sIFZlcnNpb24gdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHNpemUgPSBpbi5yZWFkVW5zaWduZWRWSW50MzIoKTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICBpbi5za2lwQnl0ZXNGdWxseShzaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBzZXJpYWxpemVkU2l6ZShQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5IHJpZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXhlZFNpemUgPSAwOworICAgICAgICAgICAgICAgIGlmIChyaWUuaXNJbmRleGVkKCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBMaXN0PEluZGV4SW5mbz4gaW5kZXggPSByaWUuY29sdW1uc0luZGV4KCk7CisKKyAgICAgICAgICAgICAgICAgICAgaW5kZXhlZFNpemUgKz0gVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludChyaWUuaGVhZGVyTGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBpbmRleGVkU2l6ZSArPSBEZWxldGlvblRpbWUuc2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShyaWUuZGVsZXRpb25UaW1lKCkpOworICAgICAgICAgICAgICAgICAgICBpbmRleGVkU2l6ZSArPSBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KGluZGV4LnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChJbmRleEluZm8gaW5mbyA6IGluZGV4KQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhlZFNpemUgKz0gaWR4U2VyaWFsaXplci5zZXJpYWxpemVkU2l6ZShpbmZvKTsKKworICAgICAgICAgICAgICAgICAgICBpbmRleGVkU2l6ZSArPSBpbmRleC5zaXplKCkgKiBUeXBlU2l6ZXMuc2l6ZW9mKDApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KHJpZS5wb3NpdGlvbikgKyBUeXBlU2l6ZXMuc2l6ZW9mVW5zaWduZWRWSW50KGluZGV4ZWRTaXplKSArIGluZGV4ZWRTaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGVudHJ5IGluIHRoZSByb3cgaW5kZXggZm9yIGEgcm93IHdob3NlIGNvbHVtbnMgYXJlIGluZGV4ZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBJbmRleGVkRW50cnkgZXh0ZW5kcyBQcmVfQ18xMTIwNl9Sb3dJbmRleEVudHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgRGVsZXRpb25UaW1lIGRlbGV0aW9uVGltZTsKKworICAgICAgICAgICAgLy8gVGhlIG9mZnNldCBpbiB0aGUgZmlsZSB3aGVuIHRoZSBpbmRleCBlbnRyeSBlbmQKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBoZWFkZXJMZW5ndGg7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8SW5kZXhJbmZvPiBjb2x1bW5zSW5kZXg7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEJBU0VfU0laRSA9CisgICAgICAgICAgICBPYmplY3RTaXplcy5tZWFzdXJlKG5ldyBJbmRleGVkRW50cnkoMCwgRGVsZXRpb25UaW1lLkxJVkUsIDAsIEFycmF5cy5hc0xpc3QobnVsbCwgbnVsbCkpKQorICAgICAgICAgICAgKyBPYmplY3RTaXplcy5tZWFzdXJlKG5ldyBBcnJheUxpc3Q8PigxKSk7CisKKyAgICAgICAgICAgIHByaXZhdGUgSW5kZXhlZEVudHJ5KGxvbmcgcG9zaXRpb24sIERlbGV0aW9uVGltZSBkZWxldGlvblRpbWUsIGxvbmcgaGVhZGVyTGVuZ3RoLCBMaXN0PEluZGV4SW5mbz4gY29sdW1uc0luZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1cGVyKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBhc3NlcnQgZGVsZXRpb25UaW1lICE9IG51bGw7CisgICAgICAgICAgICAgICAgYXNzZXJ0IGNvbHVtbnNJbmRleCAhPSBudWxsICYmIGNvbHVtbnNJbmRleC5zaXplKCkgPiAxOworICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRpb25UaW1lID0gZGVsZXRpb25UaW1lOworICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyTGVuZ3RoID0gaGVhZGVyTGVuZ3RoOworICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uc0luZGV4ID0gY29sdW1uc0luZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBEZWxldGlvblRpbWUgZGVsZXRpb25UaW1lKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZXRpb25UaW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGhlYWRlckxlbmd0aCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlckxlbmd0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTGlzdDxJbmRleEluZm8+IGNvbHVtbnNJbmRleCgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbnNJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgaW50IHByb21vdGVkU2l6ZShJbmRleEluZm8uU2VyaWFsaXplciBpZHhTZXJpYWxpemVyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxvbmcgc2l6ZSA9IFR5cGVTaXplcy5zaXplb2ZVbnNpZ25lZFZJbnQoaGVhZGVyTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgRGVsZXRpb25UaW1lLnNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoZGVsZXRpb25UaW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVHlwZVNpemVzLnNpemVvZlVuc2lnbmVkVkludChjb2x1bW5zSW5kZXguc2l6ZSgpKTsgLy8gbnVtYmVyIG9mIGVudHJpZXMKKyAgICAgICAgICAgICAgICBmb3IgKEluZGV4SW5mbyBpbmZvIDogY29sdW1uc0luZGV4KQorICAgICAgICAgICAgICAgICAgICBzaXplICs9IGlkeFNlcmlhbGl6ZXIuc2VyaWFsaXplZFNpemUoaW5mbyk7CisKKyAgICAgICAgICAgICAgICBzaXplICs9IGNvbHVtbnNJbmRleC5zaXplKCkgKiBUeXBlU2l6ZXMuc2l6ZW9mKDApOworCisgICAgICAgICAgICAgICAgcmV0dXJuIEludHMuY2hlY2tlZENhc3Qoc2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGxvbmcgdW5zaGFyZWRIZWFwU2l6ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9uZyBlbnRyeVNpemUgPSAwOworICAgICAgICAgICAgICAgIGZvciAoSW5kZXhJbmZvIGlkeCA6IGNvbHVtbnNJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgZW50cnlTaXplICs9IGlkeC51bnNoYXJlZEhlYXBTaXplKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFTRV9TSVpFCisgICAgICAgICAgICAgICAgICAgICAgICsgZW50cnlTaXplCisgICAgICAgICAgICAgICAgICAgICAgICsgZGVsZXRpb25UaW1lLnVuc2hhcmVkSGVhcFNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICArIE9iamVjdFNpemVzLnNpemVPZlJlZmVyZW5jZUFycmF5KGNvbHVtbnNJbmRleC5zaXplKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kZXhGb3IoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIERlbGV0aW9uVGltZSBkZWxldGlvbkluZm8gPSBuZXcgRGVsZXRpb25UaW1lKEZCVXRpbGl0aWVzLnRpbWVzdGFtcE1pY3JvcygpLCBGQlV0aWxpdGllcy5ub3dJblNlY29uZHMoKSk7CisKKyAgICAgICAgTGlzdDxJbmRleEluZm8+IGluZGV4ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgaW5kZXhlcy5hZGQobmV3IEluZGV4SW5mbyhjbigwTCksIGNuKDVMKSwgMCwgMCwgZGVsZXRpb25JbmZvKSk7CisgICAgICAgIGluZGV4ZXMuYWRkKG5ldyBJbmRleEluZm8oY24oMTBMKSwgY24oMTVMKSwgMCwgMCwgZGVsZXRpb25JbmZvKSk7CisgICAgICAgIGluZGV4ZXMuYWRkKG5ldyBJbmRleEluZm8oY24oMjBMKSwgY24oMjVMKSwgMCwgMCwgZGVsZXRpb25JbmZvKSk7CisKKyAgICAgICAgUm93SW5kZXhFbnRyeSByaWUgPSBuZXcgUm93SW5kZXhFbnRyeSgwTCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIEluZGV4SW5mb1JldHJpZXZlciBvcGVuV2l0aEluZGV4KEZpbGVIYW5kbGUgaW5kZXhGaWxlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5kZXhJbmZvUmV0cmlldmVyKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJbmRleEluZm8gY29sdW1uc0luZGV4KGludCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4ZXMuZ2V0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGludCBibG9ja0NvdW50KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhlcy5zaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIAorICAgICAgICBJbmRleFN0YXRlIGluZGV4U3RhdGUgPSBuZXcgSW5kZXhTdGF0ZSgKKyAgICAgICAgICAgIG51bGwsIGNvbXAsIHJpZSwgZmFsc2UsIG51bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigtMUwpLCAtMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbig1TCksIC0xKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEyTCksIC0xKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDE3TCksIC0xKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEwMEwpLCAtMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMDBMKSwgMykpOworCisgICAgICAgIGluZGV4U3RhdGUgPSBuZXcgSW5kZXhTdGF0ZSgKKyAgICAgICAgICAgIG51bGwsIGNvbXAsIHJpZSwgdHJ1ZSwgbnVsbAorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigtMUwpLCAtMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbig1TCksIDMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oNUwpLCAyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDE3TCksIDMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oMTAwTCksIDMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oMTAwTCksIDQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGluZGV4U3RhdGUuaW5kZXhGb3IoY24oMTJMKSwgMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW5kZXhTdGF0ZS5pbmRleEZvcihjbigxMkwpLCAyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEwMEwpLCAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBpbmRleFN0YXRlLmluZGV4Rm9yKGNuKDEwMEwpLCAyKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9WZXJzaW9uU3VwcG9ydGVkRmVhdHVyZXNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYmlnL1ZlcnNpb25TdXBwb3J0ZWRGZWF0dXJlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzRiOTllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2JpZy9WZXJzaW9uU3VwcG9ydGVkRmVhdHVyZXNUZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkFic3RyYWN0VGVzdFZlcnNpb25TdXBwb3J0ZWRGZWF0dXJlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOworCitwdWJsaWMgY2xhc3MgVmVyc2lvblN1cHBvcnRlZEZlYXR1cmVzVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdFZlcnNpb25TdXBwb3J0ZWRGZWF0dXJlcworeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBWZXJzaW9uIGdldFZlcnNpb24oU3RyaW5nIHYpCisgICAgeworICAgICAgICByZXR1cm4gQmlnRm9ybWF0LmdldEluc3RhbmNlKCkuZ2V0VmVyc2lvbih2KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyZWFtPFN0cmluZz4gZ2V0UGVuZGluZ1JlcGFpclN1cHBvcnRlZFZlcnNpb25zKCkKKyAgICB7CisgICAgICAgIHJldHVybiByYW5nZSgibmEiLCAienoiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyZWFtPFN0cmluZz4gZ2V0UGFydGl0aW9uTGV2ZWxEZWxldGlvblByZXNlbmNlTWFya2VyU3VwcG9ydGVkVmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJhbmdlKCJuYyIsICJ6eiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJlYW08U3RyaW5nPiBnZXRMZWdhY3lNaW5NYXhTdXBwb3J0ZWRWZXJzaW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gcmFuZ2UoIm1hIiwgIm56Iik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmVhbTxTdHJpbmc+IGdldEltcHJvdmVkTWluTWF4U3VwcG9ydGVkVmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJhbmdlKCJuYyIsICJ6eiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJlYW08U3RyaW5nPiBnZXRLZXlSYW5nZVN1cHBvcnRlZFZlcnNpb25zKCkKKyAgICB7CisgICAgICAgIHJldHVybiByYW5nZSgibmMiLCAienoiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyZWFtPFN0cmluZz4gZ2V0T3JpZ2luYXRpbmdIb3N0SWRTdXBwb3J0ZWRWZXJzaW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gU3RyZWFtLmNvbmNhdChyYW5nZSgibWUiLCAibXoiKSwgcmFuZ2UoIm5iIiwgInp6IikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUGFydGl0aW9uSW5kZXhUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1BhcnRpdGlvbkluZGV4VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMjRjZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1BhcnRpdGlvbkluZGV4VGVzdC5qYXZhCkBAIC0wLDAgKzEsODg4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkZpbGVDaGFubmVsOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5TdGFuZGFyZE9wZW5PcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkhhc2hNdWx0aXNldDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTXVsdGlzZXQ7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQ2h1bmtDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5CeXRlT3JkZXJlZFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmRvbVBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzLlRyaWVOb2RlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzLldhbGtlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUGFnZUF3YXJlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmVidWZmZXJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyT3B0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuV3JhcHBpbmdSZWJ1ZmZlcmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uc0ZvckNsYXNzVHlwZXMuYXNzZXJ0VGhhdFRocm93bkJ5OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUGFydGl0aW9uSW5kZXhUZXN0Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFBhcnRpdGlvbkluZGV4VGVzdC5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIFNFRUQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbShTRUVEKTsKKworICAgIHN0YXRpYyBmaW5hbCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIFZFUlNJT04gPSBXYWxrZXIuQllURV9DT01QQVJBQkxFX1ZFUlNJT047CisKKyAgICBzdGF0aWMKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBVdGlsLnRlc3RQYXJ0aXRpb25lcigpOworICAgIC8vTG93ZXIgdGhlIHNpemUgb2YgdGhlIGluZGV4ZXMgd2hlbiBydW5uaW5nIHdpdGhvdXQgdGhlIGNodW5rIGNhY2hlLCBvdGhlcndpc2UgdGhlIHRlc3QgdGltZXMgb3V0IG9uIEplbmtpbnMKKyAgICBzdGF0aWMgZmluYWwgaW50IENPVU5UID0gQ2h1bmtDYWNoZS5pbnN0YW5jZSAhPSBudWxsID8gMjQ1MjU2IDogMjQ1MjU7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKCkKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGdlbmVyYXRlRGF0YSgpCisgICAgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117IENvbmZpZy5EaXNrQWNjZXNzTW9kZS5zdGFuZGFyZCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IENvbmZpZy5EaXNrQWNjZXNzTW9kZS5tbWFwIH0pOworICAgIH0KKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcih2YWx1ZSA9IDApCisgICAgcHVibGljIHN0YXRpYyBDb25maWcuRGlza0FjY2Vzc01vZGUgYWNjZXNzTW9kZSA9IENvbmZpZy5EaXNrQWNjZXNzTW9kZS5zdGFuZGFyZDsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpCisgICAgeworICAgICAgICBsb2dnZXIuaW5mbygiVXNpbmcgcmFuZG9tIHNlZWQ6IHt9IiwgU0VFRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbGFzdC1ub2Rlcy1zaXppbmcgZmFpbHVyZSB1bmNvdmVyZWQgZHVyaW5nIGNvZGUgcmV2aWV3LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpemluZ0J1ZygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBDT1VOVDsgaSAqPSAxMCkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdEdldEVxKGdlbmVyYXRlUmFuZG9tSW5kZXgoaSkpOworICAgICAgICAgICAgdGVzdEdldEVxKGdlbmVyYXRlU2VxdWVudGlhbEluZGV4KGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEVxKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0R2V0RXEoZ2VuZXJhdGVSYW5kb21JbmRleChDT1VOVCkpOworICAgICAgICB0ZXN0R2V0RXEoZ2VuZXJhdGVTZXF1ZW50aWFsSW5kZXgoQ09VTlQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCcm9rZW5GaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBwdXQgc29tZSBnYXJiYWdlIGluIHRoZSBmaWxlCisgICAgICAgIGZpbmFsIFBhaXI8TGlzdDxEZWNvcmF0ZWRLZXk+LCBQYXJ0aXRpb25JbmRleD4gZGF0YSA9IGdlbmVyYXRlUmFuZG9tSW5kZXgoQ09VTlQpOworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShkYXRhLnJpZ2h0LmdldEZpbGVIYW5kbGUoKS5wYXRoKCkpOworICAgICAgICB0cnkgKEZpbGVDaGFubmVsIGNoID0gRmlsZUNoYW5uZWwub3BlbihmLnRvUGF0aCgpLCBTdGFuZGFyZE9wZW5PcHRpb24uV1JJVEUpKQorICAgICAgICB7CisgICAgICAgICAgICBjaC53cml0ZShnZW5lcmF0ZVJhbmRvbUtleSgpLmdldEtleSgpLCBmLmxlbmd0aCgpICogMiAvIDMpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IHRlc3RHZXRFcShkYXRhKSkuaXNJbnN0YW5jZU9mQW55KEFzc2VydGlvbkVycm9yLmNsYXNzLCBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLmNsYXNzLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvbmdLZXlzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0R2V0RXEoZ2VuZXJhdGVMb25nS2V5c0luZGV4KENPVU5UIC8gMTApKTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RHZXRFcShQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgUGFydGl0aW9uSW5kZXg+IGRhdGEpCisgICAgeworICAgICAgICBMaXN0PERlY29yYXRlZEtleT4ga2V5cyA9IGRhdGEubGVmdDsKKyAgICAgICAgdHJ5IChQYXJ0aXRpb25JbmRleCBzdW1tYXJ5ID0gZGF0YS5yaWdodDsKKyAgICAgICAgICAgICBQYXJ0aXRpb25JbmRleC5SZWFkZXIgcmVhZGVyID0gc3VtbWFyeS5vcGVuUmVhZGVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZWZ0LnNpemUoKTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCByZWFkZXIuZXhhY3RDYW5kaWRhdGUoa2V5cy5nZXQoaSkpKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gZ2VuZXJhdGVSYW5kb21LZXkoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXEoa2V5cywga2V5KSwgZXEoa2V5cywga2V5LCByZWFkZXIuZXhhY3RDYW5kaWRhdGUoa2V5KSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0R3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRlc3RHZXRHdChnZW5lcmF0ZVJhbmRvbUluZGV4KENPVU5UKSk7CisgICAgICAgIHRlc3RHZXRHdChnZW5lcmF0ZVNlcXVlbnRpYWxJbmRleChDT1VOVCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0R2V0R3QoUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIFBhcnRpdGlvbkluZGV4PiBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIExpc3Q8RGVjb3JhdGVkS2V5PiBrZXlzID0gZGF0YS5sZWZ0OworICAgICAgICB0cnkgKFBhcnRpdGlvbkluZGV4IHN1bW1hcnkgPSBkYXRhLnJpZ2h0OworICAgICAgICAgICAgIFBhcnRpdGlvbkluZGV4LlJlYWRlciByZWFkZXIgPSBzdW1tYXJ5Lm9wZW5SZWFkZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlZnQuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkgPCBkYXRhLmxlZnQuc2l6ZSgpIC0gMSA/IGkgKyAxIDogLTEsIGd0KGtleXMsIGtleXMuZ2V0KGkpLCByZWFkZXIpKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gZ2VuZXJhdGVSYW5kb21LZXkoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ3Qoa2V5cywga2V5KSwgZ3Qoa2V5cywga2V5LCByZWFkZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEdlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0ZXN0R2V0R2UoZ2VuZXJhdGVSYW5kb21JbmRleChDT1VOVCkpOworICAgICAgICB0ZXN0R2V0R2UoZ2VuZXJhdGVTZXF1ZW50aWFsSW5kZXgoQ09VTlQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0R2UoUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIFBhcnRpdGlvbkluZGV4PiBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIExpc3Q8RGVjb3JhdGVkS2V5PiBrZXlzID0gZGF0YS5sZWZ0OworICAgICAgICB0cnkgKFBhcnRpdGlvbkluZGV4IHN1bW1hcnkgPSBkYXRhLnJpZ2h0OworICAgICAgICAgICAgIFBhcnRpdGlvbkluZGV4LlJlYWRlciByZWFkZXIgPSBzdW1tYXJ5Lm9wZW5SZWFkZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlZnQuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIGdlKGtleXMsIGtleXMuZ2V0KGkpLCByZWFkZXIpKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gZ2VuZXJhdGVSYW5kb21LZXkoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ2Uoa2V5cywga2V5KSwgZ2Uoa2V5cywga2V5LCByZWFkZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0THQoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRlc3RHZXRMdChnZW5lcmF0ZVJhbmRvbUluZGV4KENPVU5UKSk7CisgICAgICAgIHRlc3RHZXRMdChnZW5lcmF0ZVNlcXVlbnRpYWxJbmRleChDT1VOVCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMdChQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgUGFydGl0aW9uSW5kZXg+IGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTGlzdDxEZWNvcmF0ZWRLZXk+IGtleXMgPSBkYXRhLmxlZnQ7CisgICAgICAgIHRyeSAoUGFydGl0aW9uSW5kZXggc3VtbWFyeSA9IGRhdGEucmlnaHQ7CisgICAgICAgICAgICAgUGFydGl0aW9uSW5kZXguUmVhZGVyIHJlYWRlciA9IHN1bW1hcnkub3BlblJlYWRlcigpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVmdC5zaXplKCk7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSAtIDEsIGx0KGtleXMsIGtleXMuZ2V0KGkpLCByZWFkZXIpKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gZ2VuZXJhdGVSYW5kb21LZXkoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobHQoa2V5cywga2V5KSwgbHQoa2V5cywga2V5LCByZWFkZXIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBndChMaXN0PERlY29yYXRlZEtleT4ga2V5cywgRGVjb3JhdGVkS2V5IGtleSwgUGFydGl0aW9uSW5kZXguUmVhZGVyIHN1bW1hcnkpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoc3VtbWFyeS5jZWlsaW5nKGtleSwgKHBvcywgYXNzdW1lTm9NYXRjaCwgc2spIC0+IChhc3N1bWVOb01hdGNoIHx8IGtleXMuZ2V0KChpbnQpIHBvcykuY29tcGFyZVRvKHNrKSA+IDApID8gcG9zIDogbnVsbCkpLm9yRWxzZSgtMUwpOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBnZShMaXN0PERlY29yYXRlZEtleT4ga2V5cywgRGVjb3JhdGVkS2V5IGtleSwgUGFydGl0aW9uSW5kZXguUmVhZGVyIHN1bW1hcnkpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoc3VtbWFyeS5jZWlsaW5nKGtleSwgKHBvcywgYXNzdW1lTm9NYXRjaCwgc2spIC0+IChhc3N1bWVOb01hdGNoIHx8IGtleXMuZ2V0KChpbnQpIHBvcykuY29tcGFyZVRvKHNrKSA+PSAwKSA/IHBvcyA6IG51bGwpKS5vckVsc2UoLTFMKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgbG9uZyBsdChMaXN0PERlY29yYXRlZEtleT4ga2V5cywgRGVjb3JhdGVkS2V5IGtleSwgUGFydGl0aW9uSW5kZXguUmVhZGVyIHN1bW1hcnkpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mTnVsbGFibGUoc3VtbWFyeS5mbG9vcihrZXksIChwb3MsIGFzc3VtZU5vTWF0Y2gsIHNrKSAtPiAoYXNzdW1lTm9NYXRjaCB8fCBrZXlzLmdldCgoaW50KSBwb3MpLmNvbXBhcmVUbyhzaykgPCAwKSA/IHBvcyA6IG51bGwpKS5vckVsc2UoLTFMKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgZXEoTGlzdDxEZWNvcmF0ZWRLZXk+IGtleXMsIERlY29yYXRlZEtleSBrZXksIGxvbmcgZXhhY3RDYW5kaWRhdGUpCisgICAgeworICAgICAgICBpbnQgaWR4ID0gKGludCkgZXhhY3RDYW5kaWRhdGU7CisgICAgICAgIGlmIChleGFjdENhbmRpZGF0ZSA9PSBQYXJ0aXRpb25JbmRleC5OT1RfRk9VTkQpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiAoa2V5cy5nZXQoaWR4KS5lcXVhbHMoa2V5KSkgPyBpZHggOiAtMTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgZ3QoTGlzdDxEZWNvcmF0ZWRLZXk+IGtleXMsIERlY29yYXRlZEtleSBrZXkpCisgICAgeworICAgICAgICBpbnQgaW5kZXggPSBDb2xsZWN0aW9ucy5iaW5hcnlTZWFyY2goa2V5cywga2V5KTsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgIGluZGV4ID0gLTEgLSBpbmRleDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgcmV0dXJuIGluZGV4IDwga2V5cy5zaXplKCkgPyBpbmRleCA6IC0xOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBsdChMaXN0PERlY29yYXRlZEtleT4ga2V5cywgRGVjb3JhdGVkS2V5IGtleSkKKyAgICB7CisgICAgICAgIGludCBpbmRleCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChrZXlzLCBrZXkpOworCisgICAgICAgIGlmIChpbmRleCA8IDApCisgICAgICAgICAgICBpbmRleCA9IC1pbmRleCAtIDI7CisKKyAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyBpbmRleCA6IC0xOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBnZShMaXN0PERlY29yYXRlZEtleT4ga2V5cywgRGVjb3JhdGVkS2V5IGtleSkKKyAgICB7CisgICAgICAgIGludCBpbmRleCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChrZXlzLCBrZXkpOworICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICAgICAgaW5kZXggPSAtMSAtIGluZGV4OworICAgICAgICByZXR1cm4gaW5kZXggPCBrZXlzLnNpemUoKSA/IGluZGV4IDogLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGVxKExpc3Q8RGVjb3JhdGVkS2V5PiBrZXlzLCBEZWNvcmF0ZWRLZXkga2V5KQorICAgIHsKKyAgICAgICAgaW50IGluZGV4ID0gQ29sbGVjdGlvbnMuYmluYXJ5U2VhcmNoKGtleXMsIGtleSk7CisgICAgICAgIHJldHVybiBpbmRleCA+PSAwID8gaW5kZXggOiAtMTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRFbXB0eUtleSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIElQYXJ0aXRpb25lciBwID0gbmV3IFJhbmRvbVBhcnRpdGlvbmVyKCk7CisgICAgICAgIEZpbGUgZmlsZSA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgiQ29sdW1uVHJpZVJlYWRlclRlc3QiLCAiIik7CisKKyAgICAgICAgRmlsZUhhbmRsZS5CdWlsZGVyIGZoQnVpbGRlciA9IG1ha2VIYW5kbGUoZmlsZSk7CisgICAgICAgIHRyeSAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBtYWtlV3JpdGVyKGZpbGUpOworICAgICAgICAgICAgIFBhcnRpdGlvbkluZGV4QnVpbGRlciBidWlsZGVyID0gbmV3IFBhcnRpdGlvbkluZGV4QnVpbGRlcih3cml0ZXIsIGZoQnVpbGRlcikKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gcC5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUik7CisgICAgICAgICAgICBidWlsZGVyLmFkZEVudHJ5KGtleSwgNDIpOworICAgICAgICAgICAgYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgdHJ5IChQYXJ0aXRpb25JbmRleCBzdW1tYXJ5ID0gbG9hZFBhcnRpdGlvbkluZGV4KGZoQnVpbGRlciwgd3JpdGVyKTsKKyAgICAgICAgICAgICAgICAgUGFydGl0aW9uSW5kZXguUmVhZGVyIHJlYWRlciA9IHN1bW1hcnkub3BlblJlYWRlcigpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBzdW1tYXJ5LnNpemUoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQyLCByZWFkZXIuZ2V0TGFzdEluZGV4UG9zaXRpb24oKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQyLCByZWFkZXIuZXhhY3RDYW5kaWRhdGUoa2V5KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFBhaXI8TGlzdDxEZWNvcmF0ZWRLZXk+LCBQYXJ0aXRpb25JbmRleD4gcmFuZG9tID0gZ2VuZXJhdGVSYW5kb21JbmRleChDT1VOVCk7CisgICAgICAgIGNoZWNrSXRlcmF0aW9uKHJhbmRvbS5sZWZ0LnNpemUoKSwgcmFuZG9tLnJpZ2h0KTsKKyAgICAgICAgcmFuZG9tLnJpZ2h0LmNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hlY2tJdGVyYXRpb24oaW50IGtleXNTaXplLCBQYXJ0aXRpb25JbmRleCBpbmRleCkKKyAgICB7CisgICAgICAgIHRyeSAoUGFydGl0aW9uSW5kZXggZW5mb3JjZUluZGV4Q2xvc2luZyA9IGluZGV4OworICAgICAgICAgICAgIFBhcnRpdGlvbkluZGV4LkluZGV4UG9zSXRlcmF0b3IgaXRlciA9IGluZGV4LmFsbEtleXNJdGVyYXRvcigpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIHBvcyA9IGl0ZXIubmV4dEluZGV4UG9zKCk7CisgICAgICAgICAgICAgICAgaWYgKHBvcyA9PSBQYXJ0aXRpb25JbmRleC5OT1RfRk9VTkQpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBwb3MpOworICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhrZXlzU2l6ZSwgaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJhaW5lZEl0ZXJhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIFBhcnRpdGlvbkluZGV4PiByYW5kb20gPSBnZW5lcmF0ZVJhbmRvbUluZGV4KENPVU5UKTsKKyAgICAgICAgdHJ5IChQYXJ0aXRpb25JbmRleCBzdW1tYXJ5ID0gcmFuZG9tLnJpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICBMaXN0PERlY29yYXRlZEtleT4ga2V5cyA9IHJhbmRvbS5sZWZ0OworICAgICAgICAgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhhY3RMZWZ0ID0gcmFuZC5uZXh0Qm9vbGVhbigpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhhY3RSaWdodCA9IHJhbmQubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgbGVmdCA9IGV4YWN0TGVmdCA/IGtleXMuZ2V0KHJhbmQubmV4dEludChrZXlzLnNpemUoKSkpIDogZ2VuZXJhdGVSYW5kb21LZXkoKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkgcmlnaHQgPSBleGFjdFJpZ2h0ID8ga2V5cy5nZXQocmFuZC5uZXh0SW50KGtleXMuc2l6ZSgpKSkgOiBnZW5lcmF0ZVJhbmRvbUtleSgpOworICAgICAgICAgICAgICAgIGlmIChyaWdodC5jb21wYXJlVG8obGVmdCkgPCAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRGVjb3JhdGVkS2V5IHQgPSBsZWZ0OworICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gdDsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBiID0gZXhhY3RMZWZ0OworICAgICAgICAgICAgICAgICAgICBleGFjdExlZnQgPSBleGFjdFJpZ2h0OworICAgICAgICAgICAgICAgICAgICBleGFjdFJpZ2h0ID0gYjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgKFBhcnRpdGlvbkluZGV4LkluZGV4UG9zSXRlcmF0b3IgaXRlciA9IG5ldyBQYXJ0aXRpb25JbmRleC5JbmRleFBvc0l0ZXJhdG9yKHN1bW1hcnksIGxlZnQsIHJpZ2h0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgcCA9IGl0ZXIubmV4dEluZGV4UG9zKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwID09IFBhcnRpdGlvbkluZGV4Lk5PVF9GT1VORCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IChpbnQpIGdlKGtleXMsIGxlZnQpOyAvLyBmaXJzdCBncmVhdGVyIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobGVmdCArICIgPD0gIiArIGtleXMuZ2V0KGlkeCkgKyAiIDw9ICIgKyByaWdodCArICIgYnV0ICIgKyBpZHggKyAiIHdhc24ndCBpdGVyYXRlZC4iLCByaWdodC5jb21wYXJlVG8oa2V5cy5nZXQoaWR4KSkgPCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IChpbnQpIHA7CisgICAgICAgICAgICAgICAgICAgIGlmIChwID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobGVmdC5jb21wYXJlVG8oa2V5cy5nZXQoaWR4IC0gMSkpID4gMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwIDwga2V5cy5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsZWZ0LmNvbXBhcmVUbyhrZXlzLmdldChpZHggKyAxKSkgPCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4YWN0TGVmdCkgICAgICAvLyBtdXN0IGJlIHByZWNpc2Ugb24gZXhhY3QsIG90aGVyd2lzZSBjb3VsZCBiZSBpbiBhbnkgcmVsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFNhbWUobGVmdCwga2V5cy5nZXQoaWR4KSk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2lkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcG9zID0gaXRlci5uZXh0SW5kZXhQb3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPT0gUGFydGl0aW9uSW5kZXguTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGlkeCwgcG9zKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAtLWlkeDsgLy8gc2VlayBhdCBsYXN0IHJldHVybmVkCisgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPCBrZXlzLnNpemUoKSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJpZ2h0LmNvbXBhcmVUbyhrZXlzLmdldChpZHggKyAxKSkgPCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJpZ2h0LmNvbXBhcmVUbyhrZXlzLmdldChpZHggLSAxKSkgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4YWN0UmlnaHQpICAgICAgLy8gbXVzdCBiZSBwcmVjaXNlIG9uIGV4YWN0LCBvdGhlcndpc2UgY291bGQgYmUgaW4gYW55IHJlbGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRTYW1lKHJpZ2h0LCBrZXlzLmdldChpZHgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiTGVmdCAlcyVzIFJpZ2h0ICVzJXMlbiIsIGxlZnQuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSwgZXhhY3RMZWZ0ID8gIiMiIDogIiIsIHJpZ2h0LmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTiksIGV4YWN0UmlnaHQgPyAiIyIgOiAiIikpOworICAgICAgICAgICAgICAgICAgICB0cnkgKFBhcnRpdGlvbkluZGV4LkluZGV4UG9zSXRlcmF0b3IgaXRlcjIgPSBuZXcgUGFydGl0aW9uSW5kZXguSW5kZXhQb3NJdGVyYXRvcihzdW1tYXJ5LCBsZWZ0LCByaWdodCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcG9zOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwb3MgPSBpdGVyMi5uZXh0SW5kZXhQb3MoKSkgIT0gUGFydGl0aW9uSW5kZXguTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoa2V5cy5nZXQoKGludCkgcG9zKS5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZFUlNJT04pKS5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkxlZnQgJXMlcyBSaWdodCAlcyVzJW4iLCBsZWZ0LmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTiksIGV4YWN0TGVmdCA/ICIjIiA6ICIiLCByaWdodC5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZFUlNJT04pLCBleGFjdFJpZ2h0ID8gIiMiIDogIiIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYnVmLnRvU3RyaW5nKCksIGUpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnRpYWxJbmRleCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZm9yIChpbnQgcmVwcyA9IDA7IHJlcHMgPCAxMDsgKytyZXBzKQorICAgICAgICB7CisgICAgICAgICAgICBGaWxlIGZpbGUgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoIkNvbHVtblRyaWVSZWFkZXJUZXN0IiwgIiIpOworICAgICAgICAgICAgTGlzdDxEZWNvcmF0ZWRLZXk+IGxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIGludCBwYXJ0cyA9IDE1OworICAgICAgICAgICAgRmlsZUhhbmRsZS5CdWlsZGVyIGZoQnVpbGRlciA9IG1ha2VIYW5kbGUoZmlsZSk7CisgICAgICAgICAgICB0cnkgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbWFrZVdyaXRlcihmaWxlKTsKKyAgICAgICAgICAgICAgICAgUGFydGl0aW9uSW5kZXhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUGFydGl0aW9uSW5kZXhCdWlsZGVyKHdyaXRlciwgZmhCdWlsZGVyKQorICAgICAgICAgICAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdyaXRlci5zZXRQb3N0Rmx1c2hMaXN0ZW5lcigoKSAtPiBidWlsZGVyLm1hcmtQYXJ0aXRpb25JbmRleFN5bmNlZCh3cml0ZXIuZ2V0TGFzdEZsdXNoT2Zmc2V0KCkpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENPVU5UOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gZ2VuZXJhdGVSYW5kb21MZW5ndGhLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoa2V5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKKyAgICAgICAgICAgICAgICBBdG9taWNJbnRlZ2VyIGNhbGxDb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgcGFydCA9IDE7IHBhcnQgPD0gcGFydHM7ICsrcGFydCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgQ09VTlQgKiBwYXJ0IC8gcGFydHM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkRW50cnkobGlzdC5nZXQoaSksIGkpOworCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgYWRkZWRTaXplID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5idWlsZFBhcnRpYWwoaW5kZXggLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4U2l6ZSA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChsaXN0LCBpbmRleC5sYXN0S2V5KCkpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBpbmRleFNpemUgPj0gYWRkZWRTaXplIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrSXRlcmF0aW9uKGluZGV4U2l6ZSwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbENvdW50LmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAwLCBpICogMTAyNEwpOworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLm1hcmtEYXRhU3luY2VkKGkgKiAxMDI0TCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmaWVyIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHNlcXVlbnRpYWxXcml0ZXIgZmluaXNoZXMgYSBjaHVuaworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgQ09VTlQ7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRFbnRyeShsaXN0LmdldChpKSwgaSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgICAgIHRyeSAoUGFydGl0aW9uSW5kZXggaW5kZXggPSBsb2FkUGFydGl0aW9uSW5kZXgoZmhCdWlsZGVyLCB3cml0ZXIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tJdGVyYXRpb24obGlzdC5zaXplKCksIGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKENPVU5UIC8gcGFydHMgPiAxNjAwMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiRXhwZWN0ZWQgJWQgb3IgJWQgY2FsbHMsIGdvdCAlZCIsIHBhcnRzLCBwYXJ0cyAtIDEsIGNhbGxDb3VudC5nZXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbENvdW50LmdldCgpID09IHBhcnRzIC0gMSB8fCBjYWxsQ291bnQuZ2V0KCkgPT0gcGFydHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZXBSZWN1cnNpb24oKQorICAgIHsKKyAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gZnV0dXJlID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCBsb25nIHJlcGVhdGVkIHN0cmluZ3MgZG9uJ3QgY2F1c2Ugc3RhY2sgb3ZlcmZsb3cKKyAgICAgICAgLy8gVGVzdCBib3RoIG5vcm1hbCBjb21wbGV0aW9uIGFuZCBwYXJ0aWFsIGNvbnN0cnVjdGlvbi4KKyAgICAgICAgVGhyZWFkIHQgPSBuZXcgVGhyZWFkKG51bGwsICgpIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgiQ29sdW1uVHJpZVJlYWRlclRlc3QiLCAiIik7CisgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBuZXcgU2VxdWVudGlhbFdyaXRlcihmaWxlLCBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uLm5ld0J1aWxkZXIoKS5maW5pc2hPbkNsb3NlKHRydWUpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIExpc3Q8RGVjb3JhdGVkS2V5PiBsaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxvbmdTdHJpbmcgPSAiIjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBhZ2VBd2FyZS5QQUdFX1NJWkUgKyA5OTsgKytpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9uZ1N0cmluZyArPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKGxvbmdTdHJpbmcgKyAiQSIpKSk7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQocGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMobG9uZ1N0cmluZyArICJCIikpKTsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5ieXRlcyhsb25nU3RyaW5nICsgIkMiKSkpOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKGxvbmdTdHJpbmcgKyAiRCIpKSk7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQocGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMobG9uZ1N0cmluZyArICJFIikpKTsKKworICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUuQnVpbGRlciBmaEJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWZmZXJTaXplKFBhZ2VBd2FyZS5QQUdFX1NJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ2h1bmtDYWNoZShDaHVua0NhY2hlLmluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICB0cnkgKFBhcnRpdGlvbkluZGV4QnVpbGRlciBidWlsZGVyID0gbmV3IFBhcnRpdGlvbkluZGV4QnVpbGRlcih3cml0ZXIsIGZoQnVpbGRlcikpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEVudHJ5KGxpc3QuZ2V0KGkpLCBpKTsKKworICAgICAgICAgICAgICAgICAgICB3cml0ZXIuc2V0UG9zdEZsdXNoTGlzdGVuZXIoKCkgLT4gYnVpbGRlci5tYXJrUGFydGl0aW9uSW5kZXhTeW5jZWQod3JpdGVyLmdldExhc3RGbHVzaE9mZnNldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIEF0b21pY0ludGVnZXIgY2FsbENvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYWRkZWRTaXplID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5idWlsZFBhcnRpYWwoaW5kZXggLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4U2l6ZSA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChsaXN0LCBpbmRleC5sYXN0S2V5KCkpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBpbmRleFNpemUgPj0gYWRkZWRTaXplIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrSXRlcmF0aW9uKGluZGV4U2l6ZSwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXguY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxDb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCwgaSAqIDEwMjRMKTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGxpc3Quc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEVudHJ5KGxpc3QuZ2V0KGkpLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5jb21wbGV0ZSgpOworCisgICAgICAgICAgICAgICAgICAgIHRyeSAoUGFydGl0aW9uSW5kZXggaW5kZXggPSBQYXJ0aXRpb25JbmRleC5sb2FkKGZoQnVpbGRlciwgcGFydGl0aW9uZXIsIHRydWUpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0l0ZXJhdGlvbihsaXN0LnNpemUoKSwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZ1dHVyZS5jb21wbGV0ZShudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgZXJyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkoZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgInRlc3RUaHJlYWQiLCAzMiAqIDEwMjQpOworCisgICAgICAgIHQuc3RhcnQoKTsKKyAgICAgICAgZnV0dXJlLmpvaW4oKTsKKyAgICB9CisKKyAgICBjbGFzcyBKdW1waW5nRmlsZSBleHRlbmRzIFNlcXVlbnRpYWxXcml0ZXIKKyAgICB7CisgICAgICAgIGxvbmdbXSBjdXRvZmZzOworICAgICAgICBsb25nW10gb2Zmc2V0czsKKworICAgICAgICBKdW1waW5nRmlsZShGaWxlIGZpbGUsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24gb3B0aW9uLCBsb25nLi4uIGN1dG9mZnNBbmRPZmZzZXRzKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihmaWxlLCBvcHRpb24pOworICAgICAgICAgICAgYXNzZXJ0IChjdXRvZmZzQW5kT2Zmc2V0cy5sZW5ndGggJiAxKSA9PSAwOworICAgICAgICAgICAgY3V0b2ZmcyA9IG5ldyBsb25nW2N1dG9mZnNBbmRPZmZzZXRzLmxlbmd0aCAvIDJdOworICAgICAgICAgICAgb2Zmc2V0cyA9IG5ldyBsb25nW2N1dG9mZnMubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3V0b2Zmcy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXRvZmZzW2ldID0gY3V0b2Zmc0FuZE9mZnNldHNbaSAqIDJdOworICAgICAgICAgICAgICAgIG9mZnNldHNbaV0gPSBjdXRvZmZzQW5kT2Zmc2V0c1tpICogMiArIDFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHBvc2l0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGp1bXBlZChzdXBlci5wb3NpdGlvbigpLCBjdXRvZmZzLCBvZmZzZXRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIEp1bXBpbmdSZWJ1ZmZlcmVyIGV4dGVuZHMgV3JhcHBpbmdSZWJ1ZmZlcmVyCisgICAgeworICAgICAgICBsb25nW10gY3V0b2ZmczsKKyAgICAgICAgbG9uZ1tdIG9mZnNldHM7CisKKyAgICAgICAgSnVtcGluZ1JlYnVmZmVyZXIoUmVidWZmZXJlciBzb3VyY2UsIGxvbmcuLi4gY3V0b2Zmc0FuZE9mZnNldHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHNvdXJjZSk7CisgICAgICAgICAgICBhc3NlcnQgKGN1dG9mZnNBbmRPZmZzZXRzLmxlbmd0aCAmIDEpID09IDA7CisgICAgICAgICAgICBjdXRvZmZzID0gbmV3IGxvbmdbY3V0b2Zmc0FuZE9mZnNldHMubGVuZ3RoIC8gMl07CisgICAgICAgICAgICBvZmZzZXRzID0gbmV3IGxvbmdbY3V0b2Zmcy5sZW5ndGhdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdXRvZmZzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1dG9mZnNbaV0gPSBjdXRvZmZzQW5kT2Zmc2V0c1tpICogMl07CisgICAgICAgICAgICAgICAgb2Zmc2V0c1tpXSA9IGN1dG9mZnNBbmRPZmZzZXRzW2kgKiAyICsgMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1ZmZlckhvbGRlciByZWJ1ZmZlcihsb25nIHBvc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIHBvczsKKworICAgICAgICAgICAgaW50IGlkeCA9IEFycmF5cy5iaW5hcnlTZWFyY2gob2Zmc2V0cywgcG9zaXRpb24pOworICAgICAgICAgICAgaWYgKGlkeCA8IDApCisgICAgICAgICAgICAgICAgaWR4ID0gLTIgLSBpZHg7CisgICAgICAgICAgICBwb3MgPSBwb3NpdGlvbjsKKyAgICAgICAgICAgIGlmIChpZHggPj0gMCkKKyAgICAgICAgICAgICAgICBwb3MgPSBwb3MgLSBvZmZzZXRzW2lkeF0gKyBjdXRvZmZzW2lkeF07CisKKyAgICAgICAgICAgIHN1cGVyLnJlYnVmZmVyKHBvcyk7CisKKyAgICAgICAgICAgIGlmIChpZHggPCBjdXRvZmZzLmxlbmd0aCAtIDEgJiYgYnVmZmVyLmxpbWl0KCkgKyBvZmZzZXQgPiBjdXRvZmZzW2lkeCArIDFdKQorICAgICAgICAgICAgICAgIGJ1ZmZlci5saW1pdCgoaW50KSAoY3V0b2Zmc1tpZHggKyAxXSAtIG9mZnNldCkpOworICAgICAgICAgICAgaWYgKGlkeCA+PSAwKQorICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCAtIGN1dG9mZnNbaWR4XSArIG9mZnNldHNbaWR4XTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZmlsZUxlbmd0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBqdW1wZWQod3JhcHBlZC5maWxlTGVuZ3RoKCksIGN1dG9mZnMsIG9mZnNldHMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLnRvU3RyaW5nKGN1dG9mZnMpICsgQXJyYXlzLnRvU3RyaW5nKG9mZnNldHMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFBhcnRpdGlvbkluZGV4SnVtcGluZyBleHRlbmRzIFBhcnRpdGlvbkluZGV4CisgICAgeworICAgICAgICBmaW5hbCBsb25nW10gY3V0b2Zmc0FuZE9mZnNldHM7CisKKyAgICAgICAgcHVibGljIFBhcnRpdGlvbkluZGV4SnVtcGluZyhGaWxlSGFuZGxlIGZoLCBsb25nIHRyaWVSb290LCBsb25nIGtleUNvdW50LCBEZWNvcmF0ZWRLZXkgZmlyc3QsIERlY29yYXRlZEtleSBsYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcuLi4gY3V0b2Zmc0FuZE9mZnNldHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGZoLCB0cmllUm9vdCwga2V5Q291bnQsIGZpcnN0LCBsYXN0KTsKKyAgICAgICAgICAgIHRoaXMuY3V0b2Zmc0FuZE9mZnNldHMgPSBjdXRvZmZzQW5kT2Zmc2V0czsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUmVidWZmZXJlciBpbnN0YW50aWF0ZVJlYnVmZmVyZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEp1bXBpbmdSZWJ1ZmZlcmVyKHN1cGVyLmluc3RhbnRpYXRlUmVidWZmZXJlcigpLCBjdXRvZmZzQW5kT2Zmc2V0cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsb25nIGp1bXBlZChsb25nIHBvcywgbG9uZ1tdIGN1dG9mZnMsIGxvbmdbXSBvZmZzZXRzKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9IEFycmF5cy5iaW5hcnlTZWFyY2goY3V0b2ZmcywgcG9zKTsKKyAgICAgICAgaWYgKGlkeCA8IDApCisgICAgICAgICAgICBpZHggPSAtMiAtIGlkeDsKKyAgICAgICAgaWYgKGlkeCA8IDApCisgICAgICAgICAgICByZXR1cm4gcG9zOworICAgICAgICByZXR1cm4gcG9zIC0gY3V0b2Zmc1tpZHhdICsgb2Zmc2V0c1tpZHhdOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvaW50ZXJHcm93dGgoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGZvciAoaW50IHJlcHMgPSAwOyByZXBzIDwgMTA7ICsrcmVwcykKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZSBmaWxlID0gRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlKCJDb2x1bW5UcmllUmVhZGVyVGVzdCIsICIiKTsKKyAgICAgICAgICAgIGxvbmdbXSBjdXRvZmZzQW5kT2Zmc2V0cyA9IG5ldyBsb25nW117CisgICAgICAgICAgICAyICogNDA5NiwgMUwgPDwgMTYsCisgICAgICAgICAgICA0ICogNDA5NiwgMUwgPDwgMjQsCisgICAgICAgICAgICA2ICogNDA5NiwgMUwgPDwgMzEsCisgICAgICAgICAgICA4ICogNDA5NiwgMUwgPDwgMzIsCisgICAgICAgICAgICAxMCAqIDQwOTYsIDFMIDw8IDMzLAorICAgICAgICAgICAgMTIgKiA0MDk2LCAxTCA8PCAzNCwKKyAgICAgICAgICAgIDE0ICogNDA5NiwgMUwgPDwgNDAsCisgICAgICAgICAgICAxNiAqIDQwOTYsIDFMIDw8IDQyCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBMaXN0PERlY29yYXRlZEtleT4gbGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICAgICAgRmlsZUhhbmRsZS5CdWlsZGVyIGZoQnVpbGRlciA9IG1ha2VIYW5kbGUoZmlsZSk7CisgICAgICAgICAgICB0cnkgKFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbWFrZUp1bXBpbmdXcml0ZXIoZmlsZSwgY3V0b2Zmc0FuZE9mZnNldHMpOworICAgICAgICAgICAgICAgICBQYXJ0aXRpb25JbmRleEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBQYXJ0aXRpb25JbmRleEJ1aWxkZXIod3JpdGVyLCBmaEJ1aWxkZXIpCisgICAgICAgICAgICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnNldFBvc3RGbHVzaExpc3RlbmVyKCgpIC0+IGJ1aWxkZXIubWFya1BhcnRpdGlvbkluZGV4U3luY2VkKHdyaXRlci5nZXRMYXN0Rmx1c2hPZmZzZXQoKSkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ09VTlQ7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBnZW5lcmF0ZVJhbmRvbUtleSgpOworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChrZXkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDT1VOVDsgKytpKQorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEVudHJ5KGxpc3QuZ2V0KGkpLCBpKTsKKyAgICAgICAgICAgICAgICBsb25nIHJvb3QgPSBidWlsZGVyLmNvbXBsZXRlKCk7CisKKyAgICAgICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBmaEJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvbkluZGV4IGluZGV4ID0gbmV3IFBhcnRpdGlvbkluZGV4SnVtcGluZyhmaCwgcm9vdCwgQ09VTlQsIG51bGwsIG51bGwsIGN1dG9mZnNBbmRPZmZzZXRzKTsKKyAgICAgICAgICAgICAgICAgICAgIEFuYWx5emVyIGFuYWx5emVyID0gbmV3IEFuYWx5emVyKGluZGV4KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrSXRlcmF0aW9uKGxpc3Quc2l6ZSgpLCBpbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgYW5hbHl6ZXIucnVuKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbmFseXplci5jb3VudFBlclR5cGUuZWxlbWVudFNldCgpLnNpemUoKSA8IDcpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeHBlY3RpbmcgYXQgbGVhc3QgNyBkaWZmZXJlbnQgbm9kZSB0eXBlcywgZ290ICIgKyBhbmFseXplci5jb3VudFBlclR5cGUuZWxlbWVudFNldCgpLnNpemUoKSArICJcbiIgKyBhbmFseXplci5jb3VudFBlclR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHVtcFRyaWVUb0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEZpbGUgZmlsZSA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgidGVzdER1bXBUcmllVG9GaWxlIiwgImluZGV4Iik7CisKKyAgICAgICAgQXJyYXlMaXN0PERlY29yYXRlZEtleT4gbGlzdCA9IExpc3RzLm5ld0FycmF5TGlzdCgpOworICAgICAgICBGaWxlSGFuZGxlLkJ1aWxkZXIgZmhCdWlsZGVyID0gbWFrZUhhbmRsZShmaWxlKTsKKyAgICAgICAgdHJ5IChTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA9IG5ldyBTZXF1ZW50aWFsV3JpdGVyKGZpbGUsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24uREVGQVVMVCk7CisgICAgICAgICAgICAgUGFydGl0aW9uSW5kZXhCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUGFydGl0aW9uSW5kZXhCdWlsZGVyKHdyaXRlciwgZmhCdWlsZGVyKQorICAgICAgICApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5zZXRQb3N0Rmx1c2hMaXN0ZW5lcigoKSAtPiBidWlsZGVyLm1hcmtQYXJ0aXRpb25JbmRleFN5bmNlZCh3cml0ZXIuZ2V0TGFzdEZsdXNoT2Zmc2V0KCkpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBnZW5lcmF0ZVJhbmRvbUtleSgpOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEVudHJ5KGxpc3QuZ2V0KGkpLCBpKTsKKyAgICAgICAgICAgIGxvbmcgcm9vdCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKworICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gZmhCdWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgIFBhcnRpdGlvbkluZGV4IGluZGV4ID0gbmV3IFBhcnRpdGlvbkluZGV4KGZoLCByb290LCAxMDAwLCBudWxsLCBudWxsKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlIGR1bXAgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoInRlc3REdW1wVHJpZVRvRmlsZSIsICJkdW1wZWRUcmllIik7CisgICAgICAgICAgICAgICAgaW5kZXguZHVtcFRyaWUoZHVtcC50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZHVtcENvbnRlbnQgPSBTdHJpbmcuam9pbigiXG4iLCBGaWxlcy5yZWFkQWxsTGluZXMoZHVtcC50b1BhdGgoKSkpOworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJEdW1wZWQgdHJpZTogXG57fSIsIGR1bXBDb250ZW50KTsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShkdW1wQ29udGVudC5pc0VtcHR5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbmFseXplciBleHRlbmRzIFBhcnRpdGlvbkluZGV4LlJlYWRlcgorICAgIHsKKyAgICAgICAgTXVsdGlzZXQ8VHJpZU5vZGU+IGNvdW50UGVyVHlwZSA9IEhhc2hNdWx0aXNldC5jcmVhdGUoKTsKKworICAgICAgICBwdWJsaWMgQW5hbHl6ZXIoUGFydGl0aW9uSW5kZXggaW5kZXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJ1bihyb290KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcnVuKGxvbmcgbm9kZSkKKyAgICAgICAgeworICAgICAgICAgICAgZ28obm9kZSk7CisKKyAgICAgICAgICAgIGNvdW50UGVyVHlwZS5hZGQobm9kZVR5cGUpOworCisgICAgICAgICAgICBpbnQgdHIgPSB0cmFuc2l0aW9uUmFuZ2UoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHI7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGNoaWxkID0gdHJhbnNpdGlvbihpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGQgPT0gTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgcnVuKGNoaWxkKTsKKyAgICAgICAgICAgICAgICBnbyhub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgUGFydGl0aW9uSW5kZXg+IGdlbmVyYXRlUmFuZG9tSW5kZXgoaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlSW5kZXgoc2l6ZSwgdGhpczo6Z2VuZXJhdGVSYW5kb21LZXkpOworICAgIH0KKworICAgIFBhaXI8TGlzdDxEZWNvcmF0ZWRLZXk+LCBQYXJ0aXRpb25JbmRleD4gZ2VuZXJhdGVMb25nS2V5c0luZGV4KGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZUluZGV4KHNpemUsIHRoaXM6OmdlbmVyYXRlTG9uZ0tleSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgUGFydGl0aW9uSW5kZXg+IGdlbmVyYXRlU2VxdWVudGlhbEluZGV4KGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmF0ZUluZGV4KHNpemUsIG5ldyBTdXBwbGllcjxEZWNvcmF0ZWRLZXk+KCkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBpID0gMDsKKworICAgICAgICAgICAgcHVibGljIERlY29yYXRlZEtleSBnZXQoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBzZXF1ZW50aWFsS2V5KGkrKyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIFBhaXI8TGlzdDxEZWNvcmF0ZWRLZXk+LCBQYXJ0aXRpb25JbmRleD4gZ2VuZXJhdGVJbmRleChpbnQgc2l6ZSwgU3VwcGxpZXI8RGVjb3JhdGVkS2V5PiBrZXlHZW5lcmF0b3IpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRmlsZSBmaWxlID0gRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlKCJDb2x1bW5UcmllUmVhZGVyVGVzdCIsICIiKTsKKyAgICAgICAgTGlzdDxEZWNvcmF0ZWRLZXk+IGxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgRmlsZUhhbmRsZS5CdWlsZGVyIGZoQnVpbGRlciA9IG1ha2VIYW5kbGUoZmlsZSk7CisgICAgICAgIHRyeSAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBtYWtlV3JpdGVyKGZpbGUpOworICAgICAgICAgICAgIFBhcnRpdGlvbkluZGV4QnVpbGRlciBidWlsZGVyID0gbmV3IFBhcnRpdGlvbkluZGV4QnVpbGRlcih3cml0ZXIsIGZoQnVpbGRlcikKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0ga2V5R2VuZXJhdG9yLmdldCgpOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZEVudHJ5KGxpc3QuZ2V0KGkpLCBpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuY29tcGxldGUoKTsKKworICAgICAgICAgICAgUGFydGl0aW9uSW5kZXggc3VtbWFyeSA9IGxvYWRQYXJ0aXRpb25JbmRleChmaEJ1aWxkZXIsIHdyaXRlcik7CisKKyAgICAgICAgICAgIHJldHVybiBQYWlyLmNyZWF0ZShsaXN0LCBzdW1tYXJ5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIERlY29yYXRlZEtleSBnZW5lcmF0ZVJhbmRvbUtleSgpCisgICAgeworICAgICAgICBVVUlEIHV1aWQgPSBuZXcgVVVJRChyYW5kb20ubmV4dExvbmcoKSwgcmFuZG9tLm5leHRMb25nKCkpOworICAgICAgICByZXR1cm4gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXModXVpZCkpOworICAgIH0KKworICAgIERlY29yYXRlZEtleSBnZW5lcmF0ZVJhbmRvbUxlbmd0aEtleSgpCisgICAgeworICAgICAgICBSYW5kb20gcmFuZCA9IFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IG5leHRQb3dlclJhbmRvbShyYW5kLCAxMDAsIDEwLCAyKTsgICAgIC8vIGZhdm9yIGxvbmcgc3RyaW5ncworICAgICAgICBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICAgICAgcy5hcHBlbmQoYWxwaGFiZXQuY2hhckF0KG5leHRQb3dlclJhbmRvbShyYW5kLCAwLCBhbHBoYWJldC5sZW5ndGgoKSwgMikpKTsgLy8gZmF2b3IgY2xhc2hlcyBhdCBhCisKKyAgICAgICAgcmV0dXJuIHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHMudG9TdHJpbmcoKSkpOworICAgIH0KKworICAgIERlY29yYXRlZEtleSBnZW5lcmF0ZUxvbmdLZXkoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHJhbmQgPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCk7CisgICAgICAgIGludCBsZW5ndGggPSBuZXh0UG93ZXJSYW5kb20ocmFuZCwgMTAwMDAsIDIwMDAsIDIpOyAgICAgLy8gZmF2b3IgbG9uZyBzdHJpbmdzCisgICAgICAgIFN0cmluZ0J1aWxkZXIgcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCisgICAgICAgICAgICBzLmFwcGVuZChhbHBoYWJldC5jaGFyQXQobmV4dFBvd2VyUmFuZG9tKHJhbmQsIDAsIGFscGhhYmV0Lmxlbmd0aCgpLCAyKSkpOyAvLyBmYXZvciBjbGFzaGVzIGF0IGEKKworICAgICAgICByZXR1cm4gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMocy50b1N0cmluZygpKSk7CisgICAgfQorCisgICAgaW50IG5leHRQb3dlclJhbmRvbShSYW5kb20gcmFuZCwgaW50IHgwLCBpbnQgeDEsIGRvdWJsZSBwb3dlcikKKyAgICB7CisgICAgICAgIGRvdWJsZSByID0gTWF0aC5wb3cocmFuZC5uZXh0RG91YmxlKCksIHBvd2VyKTsKKyAgICAgICAgcmV0dXJuIHgwICsgKGludCkgKCh4MSAtIHgwKSAqIHIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBhbHBoYWJldCA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsKKworICAgIERlY29yYXRlZEtleSBzZXF1ZW50aWFsS2V5KGxvbmcgaSkKKyAgICB7CisgICAgICAgIFN0cmluZyBzID0gIiI7CisgICAgICAgIGZvciAoaW50IGogPSA1MDsgaiA+PSAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwID0gKGludCkgTWF0aC5wb3coMTAsIGopOworICAgICAgICAgICAgaW50IGlkeCA9IChpbnQpICgoaiArIGkpIC8gcCk7CisgICAgICAgICAgICBzICs9IGFscGhhYmV0LmNoYXJBdChpZHggJSBhbHBoYWJldC5sZW5ndGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHMpKTsKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBTZXF1ZW50aWFsV3JpdGVyIG1ha2VXcml0ZXIoRmlsZSBmaWxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXF1ZW50aWFsV3JpdGVyKGZpbGUsIFNlcXVlbnRpYWxXcml0ZXJPcHRpb24ubmV3QnVpbGRlcigpLmZpbmlzaE9uQ2xvc2UoZmFsc2UpLmJ1aWxkKCkpOworICAgIH0KKworICAgIHB1YmxpYyBTZXF1ZW50aWFsV3JpdGVyIG1ha2VKdW1waW5nV3JpdGVyKEZpbGUgZmlsZSwgbG9uZ1tdIGN1dG9mZnNBbmRPZmZzZXRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKdW1waW5nRmlsZShmaWxlLCBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uLm5ld0J1aWxkZXIoKS5maW5pc2hPbkNsb3NlKHRydWUpLmJ1aWxkKCksIGN1dG9mZnNBbmRPZmZzZXRzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgRmlsZUhhbmRsZS5CdWlsZGVyIG1ha2VIYW5kbGUoRmlsZSBmaWxlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZmlsZSkKKyAgICAgICAgICAgICAgIC5idWZmZXJTaXplKFBhZ2VBd2FyZS5QQUdFX1NJWkUpCisgICAgICAgICAgICAgICAubW1hcHBlZChhY2Nlc3NNb2RlID09IENvbmZpZy5EaXNrQWNjZXNzTW9kZS5tbWFwKQorICAgICAgICAgICAgICAgLndpdGhDaHVua0NhY2hlKENodW5rQ2FjaGUuaW5zdGFuY2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCBQYXJ0aXRpb25JbmRleCBsb2FkUGFydGl0aW9uSW5kZXgoRmlsZUhhbmRsZS5CdWlsZGVyIGZoQnVpbGRlciwgU2VxdWVudGlhbFdyaXRlciB3cml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIFBhcnRpdGlvbkluZGV4LmxvYWQoZmhCdWlsZGVyLCBwYXJ0aXRpb25lciwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvUm93SW5kZXhUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1Jvd0luZGV4VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OWY2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9mb3JtYXQvYnRpL1Jvd0luZGV4VGVzdC5qYXZhCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5idGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0JvdW5kOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdDb21wYXJhdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNsdXN0ZXJpbmdQcmVmaXg7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGVsZXRpb25UaW1lOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVVJRFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLlJvd0luZGV4UmVhZGVyLkluZGV4SW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby50cmllcy5XYWxrZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlSGFuZGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmFuZG9tQWNjZXNzUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuU2VxdWVudGlhbFdyaXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlNlcXVlbnRpYWxXcml0ZXJPcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuUGFpcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFJvd0luZGV4VGVzdAoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihSb3dJbmRleFRlc3QuY2xhc3MpOworCisgICAgc3RhdGljIGZpbmFsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gVkVSU0lPTiA9IFdhbGtlci5CWVRFX0NPTVBBUkFCTEVfVkVSU0lPTjsKKworICAgIHN0YXRpYyBmaW5hbCBSYW5kb20gUkFORE9NOworCisgICAgc3RhdGljCisgICAgeworICAgICAgICBsb25nIHNlZWQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oInNlZWQgPSAiICsgc2VlZCk7CisgICAgICAgIFJBTkRPTSA9IG5ldyBSYW5kb20oc2VlZCk7CisKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ2x1c3RlcmluZ0NvbXBhcmF0b3IoVVVJRFR5cGUuaW5zdGFuY2UpOworICAgIHN0YXRpYyBmaW5hbCBsb25nIEVORF9NQVJLRVIgPSAxTCA8PCA0MDsKKyAgICBzdGF0aWMgZmluYWwgaW50IENPVU5UID0gODE5MjsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMoKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gZ2VuZXJhdGVEYXRhKCkKKyAgICB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXXsgQ29uZmlnLkRpc2tBY2Nlc3NNb2RlLnN0YW5kYXJkIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgQ29uZmlnLkRpc2tBY2Nlc3NNb2RlLm1tYXAgfSk7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKHZhbHVlID0gMCkKKyAgICBwdWJsaWMgc3RhdGljIENvbmZpZy5EaXNrQWNjZXNzTW9kZSBhY2Nlc3NNb2RlID0gQ29uZmlnLkRpc2tBY2Nlc3NNb2RlLnN0YW5kYXJkOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9ucygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGFpcjxMaXN0PENsdXN0ZXJpbmdQcmVmaXg8Pz4+LCBSb3dJbmRleFJlYWRlcj4gcmFuZG9tID0gZ2VuZXJhdGVSYW5kb21JbmRleFNpbmdsZXRvbnMoQ09VTlQpOworICAgICAgICBSb3dJbmRleFJlYWRlciBzdW1tYXJ5ID0gcmFuZG9tLnJpZ2h0OworICAgICAgICBMaXN0PENsdXN0ZXJpbmdQcmVmaXg8Pz4+IGtleXMgPSByYW5kb20ubGVmdDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDT1VOVDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgc3VtbWFyeS5zZXBhcmF0b3JGbG9vcihjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUoa2V5cy5nZXQoaSkpKS5vZmZzZXQpOworICAgICAgICB9CisgICAgICAgIHN1bW1hcnkuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTcGFucygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGFpcjxMaXN0PENsdXN0ZXJpbmdQcmVmaXg8Pz4+LCBSb3dJbmRleFJlYWRlcj4gcmFuZG9tID0gZ2VuZXJhdGVSYW5kb21JbmRleFF1YWRzKENPVU5UKTsKKyAgICAgICAgUm93SW5kZXhSZWFkZXIgc3VtbWFyeSA9IHJhbmRvbS5yaWdodDsKKyAgICAgICAgTGlzdDxDbHVzdGVyaW5nUHJlZml4PD8+PiBrZXlzID0gcmFuZG9tLmxlZnQ7CisgICAgICAgIGludCBtaXNzQ291bnQgPSAwOworICAgICAgICBJbmRleEluZm8gaWk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ09VTlQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlc2UgbmVlZCB0byBhbGwgYmUgd2l0aGluIHRoZSBzcGFuCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgKGlpID0gc3VtbWFyeS5zZXBhcmF0b3JGbG9vcihjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUoa2V5cy5nZXQoNCAqIGkgKyAxKSkpKS5vZmZzZXQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIHN1bW1hcnkuc2VwYXJhdG9yRmxvb3IoY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGtleXMuZ2V0KDQgKiBpICsgMikpKS5vZmZzZXQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIHN1bW1hcnkuc2VwYXJhdG9yRmxvb3IoY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGtleXMuZ2V0KDQgKiBpICsgMykpKS5vZmZzZXQpOworCisgICAgICAgICAgICAvLyBjaGVjayBvdGhlciBkYXRhCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArIDIsIGlpLm9wZW5EZWxldGlvbi5tYXJrZWRGb3JEZWxldGVBdCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpIC0gMywgaWkub3BlbkRlbGV0aW9uLmxvY2FsRGVsZXRpb25UaW1lKCkpOworCisgICAgICAgICAgICAvLyBiZWZvcmUgZW50cnkuIGhvcGVmdWxseSBoZXJlLCBidXQgY291bGQgZW5kIHVwIGluIHByZXYgaWYgbWF0Y2hlcyBwcmV2TWF4IHRvbyB3ZWxsCisgICAgICAgICAgICBpaSA9IHN1bW1hcnkuc2VwYXJhdG9yRmxvb3IoY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGtleXMuZ2V0KDQgKiBpKSkpOworICAgICAgICAgICAgaWYgKGlpLm9mZnNldCAhPSBpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrbWlzc0NvdW50OworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpIC0gMSwgaWkub2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpaSA9IHN1bW1hcnkuc2VwYXJhdG9yRmxvb3IoY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGtleXMuZ2V0KDQgKiBDT1VOVCkpKTsKKyAgICAgICAgaWYgKGlpLm9mZnNldCAhPSBFTkRfTUFSS0VSKQorICAgICAgICB7CisgICAgICAgICAgICArK21pc3NDb3VudDsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhDT1VOVCAtIDEsIGlpLm9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgaWkgPSBzdW1tYXJ5LnNlcGFyYXRvckZsb29yKGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShDbHVzdGVyaW5nQm91bmQuQk9UVE9NKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBpaS5vZmZzZXQpOworCisgICAgICAgIGlpID0gc3VtbWFyeS5zZXBhcmF0b3JGbG9vcihjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUoQ2x1c3RlcmluZ0JvdW5kLlRPUCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRU5EX01BUktFUiwgaWkub2Zmc2V0KTsKKworICAgICAgICBzdW1tYXJ5LmNsb3NlKCk7CisgICAgICAgIGlmIChtaXNzQ291bnQgPiBDT1VOVCAvIDUpCisgICAgICAgICAgICBsb2dnZXIuZXJyb3IoIlVuZXhwZWN0ZWRseSBoaWdoIG1pc3MgY291bnQ6IHt9L3t9IiwgbWlzc0NvdW50LCBDT1VOVCk7CisgICAgfQorCisgICAgRmlsZSBmaWxlOworICAgIERhdGFPdXRwdXRTdHJlYW1QbHVzIGRvczsKKyAgICBSb3dJbmRleFdyaXRlciB3cml0ZXI7CisgICAgRmlsZUhhbmRsZSBmaDsKKyAgICBsb25nIHJvb3Q7CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBjbGVhblVwKCkKKyAgICB7CisgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkoZG9zKTsKKyAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseSh3cml0ZXIpOworICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGZoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUm93SW5kZXhUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICB0aGlzKEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZSgiQ29sdW1uVHJpZVJlYWRlclRlc3QiLCAiIikpOworICAgIH0KKworICAgIFJvd0luZGV4VGVzdChGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGhpcyhmaWxlLCBuZXcgU2VxdWVudGlhbFdyaXRlcihmaWxlLCBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uLm5ld0J1aWxkZXIoKS5maW5pc2hPbkNsb3NlKHRydWUpLmJ1aWxkKCkpKTsKKyAgICB9CisKKyAgICBSb3dJbmRleFRlc3QoRmlsZSBmaWxlLCBEYXRhT3V0cHV0U3RyZWFtUGx1cyBkb3MpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKKyAgICAgICAgdGhpcy5kb3MgPSBkb3M7CisKKyAgICAgICAgLy8gd3JpdGUgc29tZSBqdW5rCisgICAgICAgIGRvcy53cml0ZVVURigiSlVOSyIpOworICAgICAgICBkb3Mud3JpdGVVVEYoIkpVTksiKTsKKworICAgICAgICB3cml0ZXIgPSBuZXcgUm93SW5kZXhXcml0ZXIoY29tcGFyYXRvciwgZG9zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcm9vdCA9IHdyaXRlci5jb21wbGV0ZShFTkRfTUFSS0VSKTsKKyAgICAgICAgZG9zLndyaXRlVVRGKCJKVU5LIik7CisgICAgICAgIGRvcy53cml0ZVVURigiSlVOSyIpOworICAgICAgICBkb3MuY2xvc2UoKTsKKyAgICAgICAgZG9zID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgUm93SW5kZXhSZWFkZXIgY29tcGxldGVBbmRSZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBjb21wbGV0ZSgpOworCisgICAgICAgIEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmaWxlKS5tbWFwcGVkKGFjY2Vzc01vZGUgPT0gQ29uZmlnLkRpc2tBY2Nlc3NNb2RlLm1tYXApOworICAgICAgICBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgdHJ5IChSYW5kb21BY2Nlc3NSZWFkZXIgcmRyID0gZmguY3JlYXRlUmVhZGVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSlVOSyIsIHJkci5yZWFkVVRGKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJKVU5LIiwgcmRyLnJlYWRVVEYoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSb3dJbmRleFJlYWRlcihmaCwgcm9vdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRW1wdHlLZXkoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGtleSA9IENsdXN0ZXJpbmcuRU1QVFk7CisgICAgICAgIHdyaXRlci5hZGQoa2V5LCBrZXksIG5ldyBJbmRleEluZm8oNDIsIERlbGV0aW9uVGltZS5MSVZFKSk7CisgICAgICAgIHRyeSAoUm93SW5kZXhSZWFkZXIgc3VtbWFyeSA9IGNvbXBsZXRlQW5kUmVhZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBJbmRleEluZm8gaSA9IHN1bW1hcnkubWluKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNDIsIGkub2Zmc2V0KTsKKworICAgICAgICAgICAgaSA9IHN1bW1hcnkuc2VwYXJhdG9yRmxvb3IoY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKENsdXN0ZXJpbmdCb3VuZC5CT1RUT00pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MiwgaS5vZmZzZXQpOworCisgICAgICAgICAgICBpID0gc3VtbWFyeS5zZXBhcmF0b3JGbG9vcihjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUoQ2x1c3RlcmluZ0JvdW5kLlRPUCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEVORF9NQVJLRVIsIGkub2Zmc2V0KTsKKworICAgICAgICAgICAgaSA9IHN1bW1hcnkuc2VwYXJhdG9yRmxvb3IoY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGtleSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQyLCBpLm9mZnNldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGREdXBsaWNhdGVFbXB0eVRocm93KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeDw/PiBrZXkgPSBDbHVzdGVyaW5nLkVNUFRZOworICAgICAgICBUaHJvd2FibGUgdCA9IG51bGw7CisgICAgICAgIHdyaXRlci5hZGQoa2V5LCBrZXksIG5ldyBJbmRleEluZm8oNDIsIERlbGV0aW9uVGltZS5MSVZFKSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZXIuYWRkKGtleSwga2V5LCBuZXcgSW5kZXhJbmZvKDQzLCBEZWxldGlvblRpbWUuTElWRSkpOworICAgICAgICAgICAgdHJ5IChSb3dJbmRleFJlYWRlciBzdW1tYXJ5ID0gY29tcGxldGVBbmRSZWFkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gZmFpbGluZyBwYXRoCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNvcnJlY3QgcGF0aAorICAgICAgICAgICAgdCA9IGU7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiR290ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoIlNob3VsZCB0aHJvdyBhbiBhc3NlcnRpb24gZXJyb3IuIiwgdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRHVwbGljYXRlVGhyb3coKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGtleSA9IGdlbmVyYXRlUmFuZG9tS2V5KCk7CisgICAgICAgIFRocm93YWJsZSB0ID0gbnVsbDsKKyAgICAgICAgd3JpdGVyLmFkZChrZXksIGtleSwgbmV3IEluZGV4SW5mbyg0MiwgRGVsZXRpb25UaW1lLkxJVkUpKTsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlci5hZGQoa2V5LCBrZXksIG5ldyBJbmRleEluZm8oNDMsIERlbGV0aW9uVGltZS5MSVZFKSk7CisgICAgICAgICAgICB0cnkgKFJvd0luZGV4UmVhZGVyIHN1bW1hcnkgPSBjb21wbGV0ZUFuZFJlYWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIHBhdGgKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY29ycmVjdCBwYXRoCisgICAgICAgICAgICB0ID0gZTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJHb3QgIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIHRocm93IGFuIGFzc2VydGlvbiBlcnJvci4iLCB0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRPdXRPZk9yZGVyVGhyb3coKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGtleTEgPSBnZW5lcmF0ZVJhbmRvbUtleSgpOworICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGtleTIgPSBnZW5lcmF0ZVJhbmRvbUtleSgpOworICAgICAgICB3aGlsZSAoY29tcGFyYXRvci5jb21wYXJlKGtleTEsIGtleTIpIDw9IDApIC8vIG1ha2Uga2V5MiBzbWFsbGVyIHRoYW4gMQorICAgICAgICAgICAga2V5MiA9IGdlbmVyYXRlUmFuZG9tS2V5KCk7CisKKyAgICAgICAgVGhyb3dhYmxlIHQgPSBudWxsOworICAgICAgICB3cml0ZXIuYWRkKGtleTEsIGtleTEsIG5ldyBJbmRleEluZm8oNDIsIERlbGV0aW9uVGltZS5MSVZFKSk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZXIuYWRkKGtleTIsIGtleTIsIG5ldyBJbmRleEluZm8oNDMsIERlbGV0aW9uVGltZS5MSVZFKSk7CisgICAgICAgICAgICB0cnkgKFJvd0luZGV4UmVhZGVyIHN1bW1hcnkgPSBjb21wbGV0ZUFuZFJlYWQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBmYWlsaW5nIHBhdGgKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY29ycmVjdCBwYXRoCisgICAgICAgICAgICB0ID0gZTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJHb3QgIiArIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIHRocm93IGFuIGFzc2VydGlvbiBlcnJvci4iLCB0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJhaW5lZEl0ZXJhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgdG9vIHJlbGV2YW50OiBkdWUgdG8gdGhlIHdheSB3ZSBjb25zdHJ1Y3Qgc2VwYXJhdG9ycyB3ZSBjYW4ndCBiZSBnb29kIGVub3VnaCBvbiB0aGUgbGVmdCBzaWRlLgorICAgICAgICBQYWlyPExpc3Q8Q2x1c3RlcmluZ1ByZWZpeDw/Pj4sIFJvd0luZGV4UmVhZGVyPiByYW5kb20gPSBnZW5lcmF0ZVJhbmRvbUluZGV4U2luZ2xldG9ucyhDT1VOVCk7CisgICAgICAgIExpc3Q8Q2x1c3RlcmluZ1ByZWZpeDw/Pj4ga2V5cyA9IHJhbmRvbS5sZWZ0OworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZXhhY3RMZWZ0ID0gUkFORE9NLm5leHRCb29sZWFuKCk7CisgICAgICAgICAgICBib29sZWFuIGV4YWN0UmlnaHQgPSBSQU5ET00ubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gbGVmdCA9IGV4YWN0TGVmdCA/IGtleXMuZ2V0KFJBTkRPTS5uZXh0SW50KGtleXMuc2l6ZSgpKSkgOiBnZW5lcmF0ZVJhbmRvbUtleSgpOworICAgICAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeDw/PiByaWdodCA9IGV4YWN0UmlnaHQgPyBrZXlzLmdldChSQU5ET00ubmV4dEludChrZXlzLnNpemUoKSkpIDogZ2VuZXJhdGVSYW5kb21LZXkoKTsKKyAgICAgICAgICAgIGlmIChjb21wYXJhdG9yLmNvbXBhcmUocmlnaHQsIGxlZnQpIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IHQgPSBsZWZ0OworICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodDsKKyAgICAgICAgICAgICAgICByaWdodCA9IHQ7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBiID0gZXhhY3RMZWZ0OworICAgICAgICAgICAgICAgIGV4YWN0TGVmdCA9IGV4YWN0UmlnaHQ7CisgICAgICAgICAgICAgICAgZXhhY3RSaWdodCA9IGI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSAoUm93SW5kZXhSZXZlcnNlSXRlcmF0b3IgaXRlciA9IG5ldyBSb3dJbmRleFJldmVyc2VJdGVyYXRvcihmaCwgcm9vdCwgY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGxlZnQpLCBjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUocmlnaHQpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJbmRleEluZm8gaW5kZXhJbmZvID0gaXRlci5uZXh0SW5kZXhJbmZvKCk7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4SW5mbyA9PSBudWxsKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChrZXlzLCByaWdodCwgY29tcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gLTIgLSBpZHg7IC8vIGxlc3MgdGhhbiBvciBlcXVhbAorICAgICAgICAgICAgICAgICAgICBpZiAoaWR4IDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUobGVmdCkgKyAiIDw9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShrZXlzLmdldChpZHgpKSArICIgPD0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKHJpZ2h0KSArICIgYnV0ICIgKyBpZHggKyAiIHdhc24ndCBpdGVyYXRlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IuY29tcGFyZShsZWZ0LCBrZXlzLmdldChpZHggLSAxKSkgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IGlkeCA9IChpbnQpIGluZGV4SW5mby5vZmZzZXQ7CisgICAgICAgICAgICAgICAgaWYgKGluZGV4SW5mby5vZmZzZXQgPT0gRU5EX01BUktFUikKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0ga2V5cy5zaXplKCk7CisgICAgICAgICAgICAgICAgaWYgKGlkeCA+IDApCisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoY29tcGFyYXRvci5jb21wYXJlKHJpZ2h0LCBrZXlzLmdldChpZHggLSAxKSkgPiAwKTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4IDwga2V5cy5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmF0b3IuY29tcGFyZShyaWdodCwga2V5cy5nZXQoaWR4ICsgMSkpIDwgMCk7CisgICAgICAgICAgICAgICAgaWYgKGV4YWN0UmlnaHQpICAgICAgLy8gbXVzdCBiZSBwcmVjaXNlIG9uIGV4YWN0LCBvdGhlcndpc2UgY291bGQgYmUgaW4gYW55IHJlbGF0aW9uCisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyaWdodCwga2V5cy5nZXQoaWR4KSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAtLWlkeDsKKyAgICAgICAgICAgICAgICAgICAgSW5kZXhJbmZvIGlpID0gaXRlci5uZXh0SW5kZXhJbmZvKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpaSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpZHgsIChpbnQpIGlpLm9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsraWR4OyAvLyBzZWVrIGF0IGxhc3QgcmV0dXJuZWQKKyAgICAgICAgICAgICAgICBpZiAoaWR4IDwga2V5cy5zaXplKCkgLSAxKQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmF0b3IuY29tcGFyZShsZWZ0LCBrZXlzLmdldChpZHggKyAxKSkgPCAwKTsKKyAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIG9mIHRoZSB3YXkgd2UgYnVpbGQgdGhlIGluZGV4ICh1c2luZyBub24tcHJlZml4IHNlcGFyYXRvcikgd2UgYXJlIHVzdWFsbHkgZ29pbmcgdG8gbWlzcyB0aGUgbGFzdCBpdGVtLgorICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMikKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJhdG9yLmNvbXBhcmUobGVmdCwga2V5cy5nZXQoaWR4IC0gMikpID4gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gbGwgPSBsZWZ0OworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gcnIgPSByaWdodDsKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhrZXlzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoeCAtPiBjb21wYXJhdG9yLmNvbXBhcmUobGwsIHgpIDw9IDAgJiYgY29tcGFyYXRvci5jb21wYXJlKHgsIHJyKSA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGNsdXN0ZXJpbmcgLT4gY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGNsdXN0ZXJpbmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGJjIC0+IGJjLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpOworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJMZWZ0IHt9e30gUmlnaHQge317fSIsIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShsZWZ0KSwgZXhhY3RMZWZ0ID8gIiMiIDogIiIsIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShyaWdodCksIGV4YWN0UmlnaHQgPyAiIyIgOiAiIik7CisgICAgICAgICAgICAgICAgdHJ5IChSb3dJbmRleFJldmVyc2VJdGVyYXRvciBpdGVyMiA9IG5ldyBSb3dJbmRleFJldmVyc2VJdGVyYXRvcihmaCwgcm9vdCwgY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGxlZnQpLCBjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUocmlnaHQpKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEluZGV4SW5mbyBpaTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChpaSA9IGl0ZXIyLm5leHRJbmRleEluZm8oKSkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGtleXMuZ2V0KChpbnQpIGlpLm9mZnNldCkpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJMZWZ0IHt9e30gUmlnaHQge317fSIsIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShsZWZ0KSwgZXhhY3RMZWZ0ID8gIiMiIDogIiIsIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShyaWdodCksIGV4YWN0UmlnaHQgPyAiIyIgOiAiIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlSXRlcmF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBQYWlyPExpc3Q8Q2x1c3RlcmluZ1ByZWZpeDw/Pj4sIFJvd0luZGV4UmVhZGVyPiByYW5kb20gPSBnZW5lcmF0ZVJhbmRvbUluZGV4U2luZ2xldG9ucyhDT1VOVCk7CisgICAgICAgIExpc3Q8Q2x1c3RlcmluZ1ByZWZpeDw/Pj4ga2V5cyA9IHJhbmRvbS5sZWZ0OworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBib29sZWFuIGV4YWN0UmlnaHQgPSBSQU5ET00ubmV4dEJvb2xlYW4oKTsKKyAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gcmlnaHQgPSBleGFjdFJpZ2h0ID8ga2V5cy5nZXQoUkFORE9NLm5leHRJbnQoa2V5cy5zaXplKCkpKSA6IGdlbmVyYXRlUmFuZG9tS2V5KCk7CisKKyAgICAgICAgICAgIGludCBpZHggPSAwOworICAgICAgICAgICAgdHJ5IChSb3dJbmRleFJldmVyc2VJdGVyYXRvciBpdGVyID0gbmV3IFJvd0luZGV4UmV2ZXJzZUl0ZXJhdG9yKGZoLCByb290LCBCeXRlQ29tcGFyYWJsZS5FTVBUWSwgY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKHJpZ2h0KSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSW5kZXhJbmZvIGluZGV4SW5mbyA9IGl0ZXIubmV4dEluZGV4SW5mbygpOworICAgICAgICAgICAgICAgIGlmIChpbmRleEluZm8gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlkeCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChrZXlzLCByaWdodCwgY29tcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gLTIgLSBpZHg7IC8vIGxlc3MgdGhhbiBvciBlcXVhbAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShrZXlzLmdldChpZHgpKSArICIgPD0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKHJpZ2h0KSArICIgYnV0ICIgKyBpZHggKyAiIHdhc24ndCBpdGVyYXRlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA8IDApOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZHggPSAoaW50KSBpbmRleEluZm8ub2Zmc2V0OworICAgICAgICAgICAgICAgIGlmIChpbmRleEluZm8ub2Zmc2V0ID09IEVORF9NQVJLRVIpCisgICAgICAgICAgICAgICAgICAgIGlkeCA9IGtleXMuc2l6ZSgpOworICAgICAgICAgICAgICAgIGlmIChpZHggPiAwKQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbXBhcmF0b3IuY29tcGFyZShyaWdodCwga2V5cy5nZXQoaWR4IC0gMSkpID4gMCk7CisgICAgICAgICAgICAgICAgaWYgKGlkeCA8IGtleXMuc2l6ZSgpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb21wYXJhdG9yLmNvbXBhcmUocmlnaHQsIGtleXMuZ2V0KGlkeCArIDEpKSA8IDApOworICAgICAgICAgICAgICAgIGlmIChleGFjdFJpZ2h0KSAgICAgIC8vIG11c3QgYmUgcHJlY2lzZSBvbiBleGFjdCwgb3RoZXJ3aXNlIGNvdWxkIGJlIGluIGFueSByZWxhdGlvbgorICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmlnaHQsIGtleXMuZ2V0KGlkeCkpOworICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLS1pZHg7CisgICAgICAgICAgICAgICAgICAgIEluZGV4SW5mbyBpaSA9IGl0ZXIubmV4dEluZGV4SW5mbygpOworICAgICAgICAgICAgICAgICAgICBpZiAoaWkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaWR4LCAoaW50KSBpaS5vZmZzZXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGlkeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZS5nZXRNZXNzYWdlKCksIGUpOworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gcnIgPSByaWdodDsKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhrZXlzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoeCAtPiBjb21wYXJhdG9yLmNvbXBhcmUoeCwgcnIpIDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoY29tcGFyYXRvcjo6YXNCeXRlQ29tcGFyYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChiYyAtPiBiYy5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZFUlNJT04pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwgIikpKTsKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiUmlnaHQge317fSIsIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShyaWdodCksIGV4YWN0UmlnaHQgPyAiIyIgOiAiIik7CisgICAgICAgICAgICAgICAgdHJ5IChSb3dJbmRleFJldmVyc2VJdGVyYXRvciBpdGVyMiA9IG5ldyBSb3dJbmRleFJldmVyc2VJdGVyYXRvcihmaCwgcm9vdCwgQnl0ZUNvbXBhcmFibGUuRU1QVFksIGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShyaWdodCkpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSW5kZXhJbmZvIGlpOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGlpID0gaXRlcjIubmV4dEluZGV4SW5mbygpKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUoa2V5cy5nZXQoKGludCkgaWkub2Zmc2V0KSkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlJpZ2h0IHt9e30iLCBjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUocmlnaHQpLCBleGFjdFJpZ2h0ID8gIiMiIDogIiIpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFBhaXI8TGlzdDxDbHVzdGVyaW5nUHJlZml4PD8+PiwgUm93SW5kZXhSZWFkZXI+IGdlbmVyYXRlUmFuZG9tSW5kZXhTaW5nbGV0b25zKGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIExpc3Q8Q2x1c3RlcmluZ1ByZWZpeDw/Pj4gbGlzdCA9IGdlbmVyYXRlTGlzdChzaXplKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCBpID09IDAgfHwgY29tcGFyYXRvci5jb21wYXJlKGxpc3QuZ2V0KGkgLSAxKSwgbGlzdC5nZXQoaSkpIDwgMDsKKyAgICAgICAgICAgIGFzc2VydCBpID09IDAgfHwgQnl0ZUNvbXBhcmFibGUuY29tcGFyZShjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUobGlzdC5nZXQoaSAtIDEpKSwgY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGxpc3QuZ2V0KGkpKSwgVkVSU0lPTikgPCAwIDoKKyAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiVzIGJzICVzIHZlcnN1cyAlcyBicyAlcyIsIGxpc3QuZ2V0KGkgLSAxKS5jbHVzdGVyaW5nKCkuY2x1c3RlcmluZ1N0cmluZyhjb21wYXJhdG9yLnN1YnR5cGVzKCkpLCBjb21wYXJhdG9yLmFzQnl0ZUNvbXBhcmFibGUobGlzdC5nZXQoaSAtIDEpKSwgbGlzdC5nZXQoaSkuY2x1c3RlcmluZygpLmNsdXN0ZXJpbmdTdHJpbmcoY29tcGFyYXRvci5zdWJ0eXBlcygpKSwgY29tcGFyYXRvci5hc0J5dGVDb21wYXJhYmxlKGxpc3QuZ2V0KGkpKSk7CisgICAgICAgICAgICB3cml0ZXIuYWRkKGxpc3QuZ2V0KGkpLCBsaXN0LmdldChpKSwgbmV3IEluZGV4SW5mbyhpLCBEZWxldGlvblRpbWUuTElWRSkpOworICAgICAgICB9CisKKyAgICAgICAgUm93SW5kZXhSZWFkZXIgc3VtbWFyeSA9IGNvbXBsZXRlQW5kUmVhZCgpOworICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUobGlzdCwgc3VtbWFyeSk7CisgICAgfQorCisgICAgTGlzdDxDbHVzdGVyaW5nUHJlZml4PD8+PiBnZW5lcmF0ZUxpc3QoaW50IHNpemUpCisgICAgeworICAgICAgICBMaXN0PENsdXN0ZXJpbmdQcmVmaXg8Pz4+IGxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKworICAgICAgICBTZXQ8Q2x1c3RlcmluZ1ByZWZpeDw/Pj4gc2V0ID0gU2V0cy5uZXdIYXNoU2V0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGtleSA9IGdlbmVyYXRlUmFuZG9tS2V5KCk7IC8vIGtleXMgbXVzdCBiZSB1bmlxdWUKKyAgICAgICAgICAgIHdoaWxlICghc2V0LmFkZChrZXkpKQorICAgICAgICAgICAgICAgIGtleSA9IGdlbmVyYXRlUmFuZG9tS2V5KCk7CisgICAgICAgICAgICBsaXN0LmFkZChrZXkpOworICAgICAgICB9CisgICAgICAgIGxpc3Quc29ydChjb21wYXJhdG9yKTsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYWlyPExpc3Q8Q2x1c3RlcmluZ1ByZWZpeDw/Pj4sIFJvd0luZGV4UmVhZGVyPiBnZW5lcmF0ZVJhbmRvbUluZGV4UXVhZHMoaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTGlzdDxDbHVzdGVyaW5nUHJlZml4PD8+PiBsaXN0ID0gZ2VuZXJhdGVMaXN0KDQgKiBzaXplICsgMSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICAgICAgd3JpdGVyLmFkZChsaXN0LmdldChpICogNCArIDEpLCBsaXN0LmdldChpICogNCArIDMpLCBuZXcgSW5kZXhJbmZvKGksIG5ldyBEZWxldGlvblRpbWUoaSArIDIsIGkgLSAzKSkpOworCisgICAgICAgIFJvd0luZGV4UmVhZGVyIHN1bW1hcnkgPSBjb21wbGV0ZUFuZFJlYWQoKTsKKyAgICAgICAgcmV0dXJuIFBhaXIuY3JlYXRlKGxpc3QsIHN1bW1hcnkpOworICAgIH0KKworICAgIENsdXN0ZXJpbmdQcmVmaXg8Pz4gZ2VuZXJhdGVSYW5kb21LZXkoKQorICAgIHsKKyAgICAgICAgVVVJRCB1dWlkID0gcmFuZG9tU2VlZGVkVVVJRCgpOworICAgICAgICBDbHVzdGVyaW5nUHJlZml4PD8+IGtleSA9IGNvbXBhcmF0b3IubWFrZSh1dWlkKTsKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBVVUlEIHJhbmRvbVNlZWRlZFVVSUQoKQorICAgIHsKKyAgICAgICAgYnl0ZVtdIHJhbmRvbUJ5dGVzID0gbmV3IGJ5dGVbMTZdOworICAgICAgICBSQU5ET00ubmV4dEJ5dGVzKHJhbmRvbUJ5dGVzKTsKKyAgICAgICAgcmV0dXJuIFVVSUQubmFtZVVVSURGcm9tQnl0ZXMocmFuZG9tQnl0ZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvVmVyc2lvblN1cHBvcnRlZEZlYXR1cmVzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvZm9ybWF0L2J0aS9WZXJzaW9uU3VwcG9ydGVkRmVhdHVyZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0MDhjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2Zvcm1hdC9idGkvVmVyc2lvblN1cHBvcnRlZEZlYXR1cmVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpOworCitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LkFic3RyYWN0VGVzdFZlcnNpb25TdXBwb3J0ZWRGZWF0dXJlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOworCitwdWJsaWMgY2xhc3MgVmVyc2lvblN1cHBvcnRlZEZlYXR1cmVzVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdFZlcnNpb25TdXBwb3J0ZWRGZWF0dXJlcworeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBWZXJzaW9uIGdldFZlcnNpb24oU3RyaW5nIHYpCisgICAgeworICAgICAgICByZXR1cm4gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTVGFibGVGb3JtYXRzKCkuZ2V0KEJ0aUZvcm1hdC5OQU1FKS5nZXRWZXJzaW9uKHYpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJlYW08U3RyaW5nPiBnZXRQZW5kaW5nUmVwYWlyU3VwcG9ydGVkVmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFMTF9WRVJTSU9OUy5zdHJlYW0oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyZWFtPFN0cmluZz4gZ2V0UGFydGl0aW9uTGV2ZWxEZWxldGlvblByZXNlbmNlTWFya2VyU3VwcG9ydGVkVmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFMTF9WRVJTSU9OUy5zdHJlYW0oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyZWFtPFN0cmluZz4gZ2V0TGVnYWN5TWluTWF4U3VwcG9ydGVkVmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmVhbS5lbXB0eSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJlYW08U3RyaW5nPiBnZXRJbXByb3ZlZE1pbk1heFN1cHBvcnRlZFZlcnNpb25zKCkKKyAgICB7CisgICAgICAgIHJldHVybiBBTExfVkVSU0lPTlMuc3RyZWFtKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmVhbTxTdHJpbmc+IGdldEtleVJhbmdlU3VwcG9ydGVkVmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFMTF9WRVJTSU9OUy5zdHJlYW0oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyZWFtPFN0cmluZz4gZ2V0T3JpZ2luYXRpbmdIb3N0SWRTdXBwb3J0ZWRWZXJzaW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gQUxMX1ZFUlNJT05TLnN0cmVhbSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlNYW5hZ2VyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeU1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkMDRhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlNYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuSm9pbmVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuU2V0czsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuTmFtZWRUaHJlYWRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25JbmZvOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5PcGVyYXRpb25UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmxpZmVjeWNsZS5MaWZlY3ljbGVUcmFuc2FjdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLkNlbGw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5Sb3c7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5SZXN0b3JhYmxlTWV0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLkNhY2hpbmdQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFUZXN0VXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcC5vZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbC5hc3NlcnRPbkRpc2tTdGF0ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Eb3duc2FtcGxpbmcuQkFTRV9TQU1QTElOR19MRVZFTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24uRE9XTlNBTVBMRV9USEVTSE9MRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5pbmRleHN1bW1hcnkuSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb24uVVBTQU1QTEVfVEhSRVNIT0xEOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitwdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5TWFuYWdlclRlc3Q8UiBleHRlbmRzIFNTVGFibGVSZWFkZXIgJiBJbmRleFN1bW1hcnlTdXBwb3J0PFI+PgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJbmRleFN1bW1hcnlNYW5hZ2VyVGVzdC5jbGFzcyk7CisKKyAgICBpbnQgb3JpZ2luYWxNaW5JbmRleEludGVydmFsOworICAgIGludCBvcmlnaW5hbE1heEluZGV4SW50ZXJ2YWw7CisgICAgbG9uZyBvcmlnaW5hbENhcGFjaXR5OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMSA9ICJJbmRleFN1bW1hcnlNYW5hZ2VyVGVzdCI7CisgICAgLy8gaW5kZXggaW50ZXJ2YWwgb2YgOCwgbm8ga2V5IGNhY2hpbmcKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUwgPSAiU3RhbmRhcmRMb3dJbmRleEludGVydmFsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkRSQUNFID0gIlN0YW5kYXJkUmFjZSI7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSgiVGhpcyB0ZXN0IG1ha2Ugc2Vuc2Ugb25seSBpZiB0aGUgZGVmYXVsdCBTU1RhYmxlIGZvcm1hdCBzdXBwb3J0IGluZGV4IHN1bW1hcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleFN1bW1hcnlTdXBwb3J0LmlzU3VwcG9ydGVkQnkoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpKSk7CisKKyAgICAgICAgU2NoZW1hTG9hZGVyLnByZXBhcmVTZXJ2ZXIoKTsKKyAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDRl9TVEFOREFSRExPV2lJTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taW5JbmRleEludGVydmFsKDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4SW5kZXhJbnRlcnZhbCgyNTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FjaGluZyhDYWNoaW5nUGFyYW1zLkNBQ0hFX05PVEhJTkcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENGX1NUQU5EQVJEUkFDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5taW5JbmRleEludGVydmFsKDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF4SW5kZXhJbnRlcnZhbCgyNTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FjaGluZyhDYWNoaW5nUGFyYW1zLkNBQ0hFX05PVEhJTkcpKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlVGVzdCgpCisgICAgeworICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOworICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUw7IC8vIGluZGV4IGludGVydmFsIG9mIDgsIG5vIGtleSBjYWNoaW5nCisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOworICAgICAgICBvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgPSBjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsKKyAgICAgICAgb3JpZ2luYWxNYXhJbmRleEludGVydmFsID0gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1heEluZGV4SW50ZXJ2YWw7CisgICAgICAgIG9yaWdpbmFsQ2FwYWNpdHkgPSBJbmRleFN1bW1hcnlNYW5hZ2VyLmluc3RhbmNlLmdldE1lbW9yeVBvb2xDYXBhY2l0eUluTUIoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBhZnRlclRlc3QoKQorICAgIHsKKyAgICAgICAgZm9yIChDb21wYWN0aW9uSW5mby5Ib2xkZXIgaG9sZGVyIDogQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmdldENvbXBhY3Rpb25zKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhvbGRlci5zdG9wKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcga3NuYW1lID0gS0VZU1BBQ0UxOworICAgICAgICBTdHJpbmcgY2ZuYW1lID0gQ0ZfU1RBTkRBUkRMT1dpSU5URVJWQUw7IC8vIGluZGV4IGludGVydmFsIG9mIDgsIG5vIGtleSBjYWNoaW5nCisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOworCisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1pbkluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsKS5idWlsZCgpKTsKKyAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWF4SW5kZXhJbnRlcnZhbChvcmlnaW5hbE1heEluZGV4SW50ZXJ2YWwpLmJ1aWxkKCkpOworCisgICAgICAgIEluZGV4U3VtbWFyeU1hbmFnZXIuaW5zdGFuY2Uuc2V0TWVtb3J5UG9vbENhcGFjaXR5SW5NQihvcmlnaW5hbENhcGFjaXR5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgdG90YWxPZmZIZWFwU2l6ZShMaXN0PFI+IHNzdGFibGVzKQorICAgIHsKKyAgICAgICAgbG9uZyB0b3RhbCA9IDA7CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICB0b3RhbCArPSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldE9mZkhlYXBTaXplKCk7CisgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8Uj4gcmVzZXRTdW1tYXJpZXMoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBMaXN0PFI+IHNzdGFibGVzLCBsb25nIG9yaWdpbmFsT2ZmSGVhcFNpemUpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZm9yIChSIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgICAgIHNzdGFibGUub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigxMDAuMCwgMTAwLjApKTsKKworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgICBzc3RhYmxlcyA9IHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCBvcmlnaW5hbE9mZkhlYXBTaXplICogc3N0YWJsZXMuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKworICAgICAgICByZXR1cm4gc3N0YWJsZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRGF0YShDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGludCBudW1QYXJ0aXRpb24pCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVBhcnRpdGlvbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBSb3cgcm93ID0gVXRpbC5nZXRPbmx5Um93VW5maWx0ZXJlZChVdGlsLmNtZChjZnMsIFN0cmluZy5mb3JtYXQoIiUzZCIsIGkpKS5idWlsZCgpKTsKKyAgICAgICAgICAgIENlbGw8Pz4gY2VsbCA9IHJvdy5nZXRDZWxsKGNmcy5tZXRhZGF0YSgpLmdldENvbHVtbihCeXRlQnVmZmVyVXRpbC5ieXRlcygidmFsIikpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY2VsbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBjZWxsLmJ1ZmZlcigpLmFycmF5KCkubGVuZ3RoKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yPFNTVGFibGVSZWFkZXI+IGhvdG5lc3NDb21wYXJhdG9yID0gQ29tcGFyYXRvci5jb21wYXJpbmdEb3VibGUobyAtPiBvLmdldFJlYWRNZXRlcigpLmZpZnRlZW5NaW51dGVSYXRlKCkpOworCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNTVGFibGVzKFN0cmluZyBrc25hbWUsIFN0cmluZyBjZm5hbWUsIGludCBudW1TU1RhYmxlcywgaW50IG51bVBhcnRpdGlvbikKKyAgICB7CisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc25hbWUpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZm5hbWUpOworICAgICAgICBjZnMudHJ1bmNhdGVCbG9ja2luZygpOworICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisKKyAgICAgICAgQXJyYXlMaXN0PEZ1dHVyZT4gZnV0dXJlcyA9IG5ldyBBcnJheUxpc3Q8PihudW1TU1RhYmxlcyk7CisgICAgICAgIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMTAwXSk7CisgICAgICAgIGZvciAoaW50IHNzdGFibGUgPSAwOyBzc3RhYmxlIDwgbnVtU1NUYWJsZXM7IHNzdGFibGUrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBudW1QYXJ0aXRpb247IHArKykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIFN0cmluZyBrZXkgPSBTdHJpbmcuZm9ybWF0KCIlM2QiLCBwKTsKKyAgICAgICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwga2V5KQorICAgICAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiY29sdW1uIikKKyAgICAgICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnV0dXJlcy5hZGQoY2ZzLmZvcmNlRmx1c2goQ29sdW1uRmFtaWx5U3RvcmUuRmx1c2hSZWFzb24uVU5JVF9URVNUUykpOworICAgICAgICB9CisgICAgICAgIGZvciAoRnV0dXJlIGZ1dHVyZSA6IGZ1dHVyZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZ1dHVyZS5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB8IEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhudW1TU1RhYmxlcywgU2VydmVyVGVzdFV0aWxzLmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpLnNpemUoKSk7CisgICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVBhcnRpdGlvbik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgSW5kZXhTdW1tYXJ5U3VwcG9ydDxSPj4gdm9pZCB0ZXN0Q2hhbmdlTWluSW5kZXhJbnRlcnZhbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKKyAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKKyAgICAgICAgaW50IG51bVNTVGFibGVzID0gMTsKKyAgICAgICAgaW50IG51bVJvd3MgPSAyNTY7CisgICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7CisKKyAgICAgICAgTGlzdDxSPiBzc3RhYmxlcyA9IFNlcnZlclRlc3RVdGlscy5nZXRMaXZlSW5kZXhTdW1tYXJ5U3VwcG9ydGluZ1JlYWRlcnMoY2ZzKTsKKyAgICAgICAgZm9yIChSIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgICAgIHNzdGFibGUub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigxMDAuMCwgMTAwLjApKTsKKworICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMDEpOworCisgICAgICAgIC8vIGRvdWJsZSB0aGUgbWluX2luZGV4X2ludGVydmFsCisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1pbkluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsICogMikuYnVpbGQoKSk7CisgICAgICAgIEluZGV4U3VtbWFyeU1hbmFnZXIuaW5zdGFuY2UucmVkaXN0cmlidXRlU3VtbWFyaWVzKCk7CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogU2VydmVyVGVzdFV0aWxzLjxSPmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtUm93cyAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm4gbWluX2luZGV4X2ludGVydmFsIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZQorICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZVRhYmxlVXBkYXRlKGNmcy5tZXRhZGF0YSgpLnVuYnVpbGQoKS5taW5JbmRleEludGVydmFsKG9yaWdpbmFsTWluSW5kZXhJbnRlcnZhbCkuYnVpbGQoKSk7CisgICAgICAgIEluZGV4U3VtbWFyeU1hbmFnZXIuaW5zdGFuY2UucmVkaXN0cmlidXRlU3VtbWFyaWVzKCk7CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogU2VydmVyVGVzdFV0aWxzLjxSPmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtUm93cyAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBoYWx2ZSB0aGUgbWluX2luZGV4X2ludGVydmFsLCBidXQgY29uc3RyYWluIHRoZSBhdmFpbGFibGUgc3BhY2UgdG8gZXhhY3RseSB3aGF0IHdlIGhhdmUgbm93OyBhcyBhIHJlc3VsdCwKKyAgICAgICAgLy8gdGhlIHN1bW1hcnkgc2hvdWxkbid0IGNoYW5nZQorICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZVRhYmxlVXBkYXRlKGNmcy5tZXRhZGF0YSgpLnVuYnVpbGQoKS5taW5JbmRleEludGVydmFsKG9yaWdpbmFsTWluSW5kZXhJbnRlcnZhbCAvIDIpLmJ1aWxkKCkpOworICAgICAgICBSIHNzdGFibGUgPSBTZXJ2ZXJUZXN0VXRpbHMuPFI+Z2V0TGl2ZUluZGV4U3VtbWFyeVN1cHBvcnRpbmdSZWFkZXJzKGNmcykuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIGxvbmcgc3VtbWFyeVNwYWNlID0gc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRPZmZIZWFwU2l6ZSgpOworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGUsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCBzdW1tYXJ5U3BhY2UpOworICAgICAgICB9CisKKyAgICAgICAgc3N0YWJsZSA9IFNlcnZlclRlc3RVdGlscy48Uj5nZXRMaXZlSW5kZXhTdW1tYXJ5U3VwcG9ydGluZ1JlYWRlcnMoY2ZzKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsTWluSW5kZXhJbnRlcnZhbCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bVJvd3MgLyBvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuc2l6ZSgpKTsKKworICAgICAgICAvLyBrZWVwIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwgdGhlIHNhbWUsIGJ1dCBub3cgZ2l2ZSB0aGUgc3VtbWFyeSBlbm91Z2ggc3BhY2UgdG8gZ3JvdyBieSA1MCUKKyAgICAgICAgZG91YmxlIHByZXZpb3VzSW50ZXJ2YWwgPSBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKTsKKyAgICAgICAgaW50IHByZXZpb3VzU2l6ZSA9IHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuc2l6ZSgpOworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGUsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAobG9uZykgTWF0aC5jZWlsKHN1bW1hcnlTcGFjZSAqIDEuNSkpOworICAgICAgICB9CisgICAgICAgIHNzdGFibGUgPSBTZXJ2ZXJUZXN0VXRpbHMuPFI+Z2V0TGl2ZUluZGV4U3VtbWFyeVN1cHBvcnRpbmdSZWFkZXJzKGNmcykuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhwcmV2aW91c1NpemUgKiAxLjUsIChkb3VibGUpIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuc2l6ZSgpLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHByZXZpb3VzSW50ZXJ2YWwgKiAoMS4wIC8gMS41KSwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDAxKTsKKworICAgICAgICAvLyByZXR1cm4gbWluX2luZGV4X2ludGVydmFsIHRvIGl0J3Mgb3JpZ2luYWwgdmFsdWUgKGRvdWJsZSBpdCksIGJ1dCBvbmx5IGdpdmUgdGhlIHN1bW1hcnkgZW5vdWdoIHNwYWNlCisgICAgICAgIC8vIHRvIGhhdmUgYW4gZWZmZWN0aXZlIGluZGV4IGludGVydmFsIG9mIHR3aWNlIHRoZSBuZXcgbWluCisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1pbkluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsKS5idWlsZCgpKTsKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgICByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKGxvbmcpIE1hdGguY2VpbChzdW1tYXJ5U3BhY2UgLyAyLjApKTsKKyAgICAgICAgfQorICAgICAgICBzc3RhYmxlID0gU2VydmVyVGVzdFV0aWxzLjxSPmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxNaW5JbmRleEludGVydmFsICogMiwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRFZmZlY3RpdmVJbmRleEludGVydmFsKCksIDAuMDAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bVJvd3MgLyAob3JpZ2luYWxNaW5JbmRleEludGVydmFsICogMiksIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuc2l6ZSgpKTsKKworICAgICAgICAvLyByYWlzZSB0aGUgbWluX2luZGV4X2ludGVydmFsIGFib3ZlIG91ciBjdXJyZW50IGVmZmVjdGl2ZSBpbnRlcnZhbCwgYnV0IHNldCB0aGUgbWF4X2luZGV4X2ludGVydmFsIGxvd2VyCisgICAgICAgIC8vIHRoYW4gd2hhdCB3ZSBhY3R1YWxseSBoYXZlIHNwYWNlIGZvciAobWVhbmluZyB0aGUgaW5kZXggc3VtbWFyeSB3b3VsZCBpZGVhbGx5IGJlIHNtYWxsZXIsIGJ1dCB0aGlzIHdvdWxkCisgICAgICAgIC8vIHJlc3VsdCBpbiBhbiBlZmZlY3RpdmUgaW50ZXJ2YWwgYWJvdmUgdGhlIG5ldyBtYXgpCisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1pbkluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsICogNCkuYnVpbGQoKSk7CisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVVcGRhdGUoY2ZzLm1ldGFkYXRhKCkudW5idWlsZCgpLm1heEluZGV4SW50ZXJ2YWwob3JpZ2luYWxNaW5JbmRleEludGVydmFsICogNCkuYnVpbGQoKSk7CisgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZSwgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBvZihjZnMubWV0YWRhdGEuaWQsIHR4biksIDEwKTsKKyAgICAgICAgfQorICAgICAgICBzc3RhYmxlID0gU2VydmVyVGVzdFV0aWxzLjxSPmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlTWF4SW5kZXhJbnRlcnZhbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKKyAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKKyAgICAgICAgaW50IG51bVNTVGFibGVzID0gMTsKKyAgICAgICAgaW50IG51bVJvd3MgPSAyNTY7CisgICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7CisKKyAgICAgICAgTGlzdDxSPiBzc3RhYmxlcyA9IFNlcnZlclRlc3RVdGlscy5nZXRMaXZlSW5kZXhTdW1tYXJ5U3VwcG9ydGluZ1JlYWRlcnMoY2ZzKTsKKyAgICAgICAgZm9yIChSIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgICAgIHNzdGFibGUub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigxMDAuMCwgMTAwLjApKTsKKworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgICByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgMTApOworICAgICAgICB9CisgICAgICAgIHNzdGFibGVzID0gU2VydmVyVGVzdFV0aWxzLmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpOworICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMSk7CisKKyAgICAgICAgLy8gaGFsdmUgdGhlIG1heF9pbmRleF9pbnRlcnZhbAorICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZVRhYmxlVXBkYXRlKGNmcy5tZXRhZGF0YSgpLnVuYnVpbGQoKS5tYXhJbmRleEludGVydmFsKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsIC8gMikuYnVpbGQoKSk7CisgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAxKTsKKyAgICAgICAgfQorICAgICAgICBzc3RhYmxlcyA9IFNlcnZlclRlc3RVdGlscy5nZXRMaXZlSW5kZXhTdW1tYXJ5U3VwcG9ydGluZ1JlYWRlcnMoY2ZzKTsKKyAgICAgICAgZm9yIChSIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtUm93cyAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLnNpemUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm4gbWF4X2luZGV4X2ludGVydmFsIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZQorICAgICAgICBTY2hlbWFUZXN0VXRpbC5hbm5vdW5jZVRhYmxlVXBkYXRlKGNmcy5tZXRhZGF0YSgpLnVuYnVpbGQoKS5tYXhJbmRleEludGVydmFsKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsICogMikuYnVpbGQoKSk7CisgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAxKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IFNlcnZlclRlc3RVdGlscy48Uj5nZXRMaXZlSW5kZXhTdW1tYXJ5U3VwcG9ydGluZ1JlYWRlcnMoY2ZzKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWwoKSwgMC4wMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtUm93cyAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdCh0aW1lb3V0ID0gMTAwMDApCisgICAgcHVibGljIHZvaWQgdGVzdFJlZGlzdHJpYnV0ZVN1bW1hcmllcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKKyAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKKyAgICAgICAgaW50IG51bVNTVGFibGVzID0gNDsKKyAgICAgICAgaW50IG51bVJvd3MgPSAyNTY7CisgICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7CisKKyAgICAgICAgaW50IG1pblNhbXBsaW5nTGV2ZWwgPSAoQkFTRV9TQU1QTElOR19MRVZFTCAqIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsKSAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5tYXhJbmRleEludGVydmFsOworCisgICAgICAgIExpc3Q8Uj4gc3N0YWJsZXMgPSBTZXJ2ZXJUZXN0VXRpbHMuZ2V0TGl2ZUluZGV4U3VtbWFyeVN1cHBvcnRpbmdSZWFkZXJzKGNmcyk7CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICBzc3RhYmxlLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMTAwLjAsIDEwMC4wKSk7CisKKyAgICAgICAgbG9uZyBzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlID0gc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeSgpLmdldE9mZkhlYXBTaXplKCk7CisKKyAgICAgICAgLy8gdGhlcmUgc2hvdWxkIGJlIGVub3VnaCBzcGFjZSB0byBub3QgZG93bnNhbXBsZSBhbnl0aGluZworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgICBzc3RhYmxlcyA9IHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIG51bVNTVGFibGVzKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChSIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlICogbnVtU1NUYWJsZXMsIHRvdGFsT2ZmSGVhcFNpemUoc3N0YWJsZXMpKTsKKyAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7CisKKyAgICAgICAgLy8gZXZlcnl0aGluZyBzaG91bGQgZ2V0IGN1dCBpbiBoYWxmCisgICAgICAgIGFzc2VydCBzc3RhYmxlcy5zaXplKCkgPT0gNDsKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiAobnVtU1NUYWJsZXMgLyAyKSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCAvIDIsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKyAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7CisKKyAgICAgICAgLy8gZXZlcnl0aGluZyBzaG91bGQgZ2V0IGN1dCB0byBhIHF1YXJ0ZXIKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiAobnVtU1NUYWJsZXMgLyA0KSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCAvIDQsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKyAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7CisKKyAgICAgICAgLy8gdXBzYW1wbGUgYmFjayB1cCB0byBoYWxmCisgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBvZihjZnMubWV0YWRhdGEuaWQsIHR4biksIChzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlICogKG51bVNTVGFibGVzIC8gMikgKyA0KSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0IHNzdGFibGVzLnNpemUoKSA9PSA0OworICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwgLyAyLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisgICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVJvd3MpOworCisgICAgICAgIC8vIHVwc2FtcGxlIGJhY2sgdXAgdG8gdGhlIG9yaWdpbmFsIGluZGV4IHN1bW1hcnkKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiBudW1TU1RhYmxlcykpOworICAgICAgICB9CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkpOworICAgICAgICB2YWxpZGF0ZURhdGEoY2ZzLCBudW1Sb3dzKTsKKworICAgICAgICAvLyBtYWtlIHR3byBvZiB0aGUgZm91ciBzc3RhYmxlcyBjb2xkLCBvbmx5IGxlYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhyZWUgZnVsbCBpbmRleCBzdW1tYXJpZXMsCisgICAgICAgIC8vIHNvIHRoZSB0d28gY29sZCBzc3RhYmxlcyBzaG91bGQgZ2V0IGRvd25zYW1wbGVkIHRvIGJlIGhhbGYgb2YgdGhlaXIgb3JpZ2luYWwgc2l6ZQorICAgICAgICBzc3RhYmxlcy5nZXQoMCkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcig1MC4wLCA1MC4wKSk7CisgICAgICAgIHNzdGFibGVzLmdldCgxKS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDUwLjAsIDUwLjApKTsKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwgKHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgKiAzKSk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzc3RhYmxlcywgaG90bmVzc0NvbXBhcmF0b3IpOworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCAvIDIsIHNzdGFibGVzLmdldCgwKS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCAvIDIsIHNzdGFibGVzLmdldCgxKS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZXMuZ2V0KDIpLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzc3RhYmxlcy5nZXQoMykuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKyAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7CisKKyAgICAgICAgLy8gc21hbGwgaW5jcmVhc2VzIG9yIGRlY3JlYXNlcyBpbiB0aGUgcmVhZCByYXRlIGRvbid0IHJlc3VsdCBpbiBkb3duc2FtcGxpbmcgb3IgdXBzYW1wbGluZworICAgICAgICBkb3VibGUgbG93ZXJSYXRlID0gNTAuMCAqIChET1dOU0FNUExFX1RIRVNIT0xEICsgKERPV05TQU1QTEVfVEhFU0hPTEQgKiAwLjEwKSk7CisgICAgICAgIGRvdWJsZSBoaWdoZXJSYXRlID0gNTAuMCAqIChVUFNBTVBMRV9USFJFU0hPTEQgLSAoVVBTQU1QTEVfVEhSRVNIT0xEICogMC4xMCkpOworICAgICAgICBzc3RhYmxlcy5nZXQoMCkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcihsb3dlclJhdGUsIGxvd2VyUmF0ZSkpOworICAgICAgICBzc3RhYmxlcy5nZXQoMSkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcihoaWdoZXJSYXRlLCBoaWdoZXJSYXRlKSk7CisgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBvZihjZnMubWV0YWRhdGEuaWQsIHR4biksIChzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlICogMykpOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc3N0YWJsZXMsIGhvdG5lc3NDb21wYXJhdG9yKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwgLyAyLCBzc3RhYmxlcy5nZXQoMCkuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwgLyAyLCBzc3RhYmxlcy5nZXQoMSkuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgyKS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZXMuZ2V0KDMpLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisgICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVJvd3MpOworCisgICAgICAgIC8vIHJlc2V0LCBhbmQgdGhlbiB0aGlzIHRpbWUsIGxlYXZlIGVub3VnaCBzcGFjZSBmb3Igb25lIG9mIHRoZSBjb2xkIHNzdGFibGVzIHRvIG5vdCBnZXQgZG93bnNhbXBsZWQKKyAgICAgICAgc3N0YWJsZXMgPSByZXNldFN1bW1hcmllcyhjZnMsIHNzdGFibGVzLCBzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlKTsKKyAgICAgICAgc3N0YWJsZXMuZ2V0KDApLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMS4wLCAxLjApKTsKKyAgICAgICAgc3N0YWJsZXMuZ2V0KDEpLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMi4wLCAyLjApKTsKKyAgICAgICAgc3N0YWJsZXMuZ2V0KDIpLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMTAwMC4wLCAxMDAwLjApKTsKKyAgICAgICAgc3N0YWJsZXMuZ2V0KDMpLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMTAwMC4wLCAxMDAwLjApKTsKKworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgICBzc3RhYmxlcyA9IHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIDMpICsgNTApOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoc3N0YWJsZXMsIGhvdG5lc3NDb21wYXJhdG9yKTsKKworICAgICAgICBpZiAoc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSA9PSBtaW5TYW1wbGluZ0xldmVsKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgxKS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZXMuZ2V0KDApLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGVzLmdldCgyKS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQkFTRV9TQU1QTElOR19MRVZFTCwgc3N0YWJsZXMuZ2V0KDMpLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisgICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVJvd3MpOworCisKKyAgICAgICAgLy8gQ2F1c2UgYSBtaXggb2YgdXBzYW1wbGluZyBhbmQgZG93bnNhbXBsaW5nLiBXZSdsbCBsZWF2ZSBlbm91Z2ggc3BhY2UgZm9yIHR3byBmdWxsIGluZGV4IHN1bW1hcmllcy4gVGhlIHR3bworICAgICAgICAvLyBjb2xkZXN0IHNzdGFibGVzIHdpbGwgZ2V0IGRvd25zYW1wbGVkIHRvIDQvMTI4IG9mIHRoZWlyIHNpemUsIGxlYXZpbmcgdXMgd2l0aCAxIGFuZCA5Mi8xMjh0aCBpbmRleAorICAgICAgICAvLyBzdW1tYXJpZXMgd29ydGggb2Ygc3BhY2UuICBUaGUgaG90dGVzdCBzc3RhYmxlIHNob3VsZCBnZXQgYSBmdWxsIGluZGV4IHN1bW1hcnksIGFuZCB0aGUgb25lIGluIHRoZSBtaWRkbGUKKyAgICAgICAgLy8gc2hvdWxkIGdldCB0aGUgcmVtYWluZGVyLgorICAgICAgICBzc3RhYmxlcy5nZXQoMCkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigwLjAsIDAuMCkpOworICAgICAgICBzc3RhYmxlcy5nZXQoMSkub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigwLjAsIDAuMCkpOworICAgICAgICBzc3RhYmxlcy5nZXQoMikub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcig5MiwgOTIpKTsKKyAgICAgICAgc3N0YWJsZXMuZ2V0KDMpLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMTI4LjAsIDEyOC4wKSk7CisgICAgICAgIHRyeSAoTGlmZWN5Y2xlVHJhbnNhY3Rpb24gdHhuID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoc3N0YWJsZXMsIE9wZXJhdGlvblR5cGUuVU5LTk9XTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNzdGFibGVzID0gcmVkaXN0cmlidXRlU3VtbWFyaWVzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBvZihjZnMubWV0YWRhdGEuaWQsIHR4biksIChsb25nKSAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSArIChzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlICogKDkyLjAgLyBCQVNFX1NBTVBMSU5HX0xFVkVMKSkpKTsKKyAgICAgICAgfQorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNzdGFibGVzLCBob3RuZXNzQ29tcGFyYXRvcik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlcy5nZXQoMCkuZ2V0SW5kZXhTdW1tYXJ5KCkuc2l6ZSgpKTsgIC8vIGF0IHRoZSBtaW4gc2FtcGxpbmcgbGV2ZWwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNzdGFibGVzLmdldCgwKS5nZXRJbmRleFN1bW1hcnkoKS5zaXplKCkpOyAgLy8gYXQgdGhlIG1pbiBzYW1wbGluZyBsZXZlbAorICAgICAgICBhc3NlcnRUcnVlKHNzdGFibGVzLmdldCgyKS5nZXRJbmRleFN1bW1hcnkoKS5nZXRTYW1wbGluZ0xldmVsKCkgPiBtaW5TYW1wbGluZ0xldmVsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzc3RhYmxlcy5nZXQoMikuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpIDwgQkFTRV9TQU1QTElOR19MRVZFTCk7CisgICAgICAgIGFzc2VydEVxdWFscyhCQVNFX1NBTVBMSU5HX0xFVkVMLCBzc3RhYmxlcy5nZXQoMykuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKyAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7CisKKyAgICAgICAgLy8gRG9uJ3QgbGVhdmUgZW5vdWdoIHNwYWNlIGZvciBldmVuIHRoZSBtaW5pbWFsIGluZGV4IHN1bW1hcmllcworICAgICAgICB0cnkgKExpZmVjeWNsZVRyYW5zYWN0aW9uIHR4biA9IGNmcy5nZXRUcmFja2VyKCkudHJ5TW9kaWZ5KHNzdGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgICBzc3RhYmxlcyA9IHJlZGlzdHJpYnV0ZVN1bW1hcmllcyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgb2YoY2ZzLm1ldGFkYXRhLmlkLCB0eG4pLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChSIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLnNpemUoKSk7ICAvLyBhdCB0aGUgbWluIHNhbXBsaW5nIGxldmVsCisgICAgICAgIHZhbGlkYXRlRGF0YShjZnMsIG51bVJvd3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYnVpbGRBdFNhbXBsaW5nTGV2ZWwoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmluZyBrc25hbWUgPSBLRVlTUEFDRTE7CisgICAgICAgIFN0cmluZyBjZm5hbWUgPSBDRl9TVEFOREFSRExPV2lJTlRFUlZBTDsKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKGtzbmFtZSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKGNmbmFtZSk7CisgICAgICAgIGNmcy50cnVuY2F0ZUJsb2NraW5nKCk7CisgICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKworICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzEwMF0pOworCisgICAgICAgIGludCBudW1Sb3dzID0gMjU2OworICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBudW1Sb3dzOyByb3crKykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIGtleSA9IFN0cmluZy5mb3JtYXQoIiUzZCIsIHJvdyk7CisgICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwga2V5KQorICAgICAgICAgICAgLmNsdXN0ZXJpbmcoImNvbHVtbiIpCisgICAgICAgICAgICAuYWRkKCJ2YWwiLCB2YWx1ZSkKKyAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICAgICAuYXBwbHlVbnNhZmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIFV0aWwuZmx1c2goY2ZzKTsKKworICAgICAgICBMaXN0PFI+IHNzdGFibGVzID0gU2VydmVyVGVzdFV0aWxzLmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc3N0YWJsZXMuc2l6ZSgpKTsKKyAgICAgICAgUiBvcmlnaW5hbCA9IHNzdGFibGVzLmdldCgwKTsKKworICAgICAgICBSIHNzdGFibGUgPSBvcmlnaW5hbDsKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlLCBPcGVyYXRpb25UeXBlLlVOS05PV04pKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBzYW1wbGluZ0xldmVsID0gMTsgc2FtcGxpbmdMZXZlbCA8IEJBU0VfU0FNUExJTkdfTEVWRUw7IHNhbXBsaW5nTGV2ZWwrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzc3RhYmxlID0gc3N0YWJsZS5jbG9uZVdpdGhOZXdTdW1tYXJ5U2FtcGxpbmdMZXZlbChjZnMsIHNhbXBsaW5nTGV2ZWwpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhzYW1wbGluZ0xldmVsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLmdldFNhbXBsaW5nTGV2ZWwoKSk7CisgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkU2l6ZSA9IChudW1Sb3dzICogc2FtcGxpbmdMZXZlbCkgLyAoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwgKiBCQVNFX1NBTVBMSU5HX0xFVkVMKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTaXplLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLnNpemUoKSwgMSk7CisgICAgICAgICAgICAgICAgdHhuLnVwZGF0ZShzc3RhYmxlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB0eG4uY2hlY2twb2ludCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHhuLmZpbmlzaCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Sk1YRnVuY3Rpb25zKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBJbmRleFN1bW1hcnlNYW5hZ2VyIG1hbmFnZXIgPSBJbmRleFN1bW1hcnlNYW5hZ2VyLmluc3RhbmNlOworCisgICAgICAgIC8vIHJlc2l6ZSBpbnRlcnZhbAorICAgICAgICBtYW5hZ2VyLnNldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKC0xKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0SW5kZXhTdW1tYXJ5UmVzaXplSW50ZXJ2YWxJbk1pbnV0ZXMoKSk7CisgICAgICAgIGFzc2VydE51bGwobWFuYWdlci5nZXRUaW1lVG9OZXh0UmVzaXplKFRpbWVVbml0Lk1JTlVURVMpKTsKKworICAgICAgICBtYW5hZ2VyLnNldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKDEwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBtYW5hZ2VyLmdldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbmRleFN1bW1hcnlSZXNpemVJbnRlcnZhbEluTWludXRlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwLCBtYW5hZ2VyLmdldFRpbWVUb05leHRSZXNpemUoVGltZVVuaXQuTUlOVVRFUyksIDEpOworICAgICAgICBtYW5hZ2VyLnNldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKDE1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE1LCBtYW5hZ2VyLmdldFJlc2l6ZUludGVydmFsSW5NaW51dGVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTUsIERhdGFiYXNlRGVzY3JpcHRvci5nZXRJbmRleFN1bW1hcnlSZXNpemVJbnRlcnZhbEluTWludXRlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE1LCBtYW5hZ2VyLmdldFRpbWVUb05leHRSZXNpemUoVGltZVVuaXQuTUlOVVRFUyksIDIpOworCisgICAgICAgIC8vIG1lbW9yeSBwb29sIGNhcGFjaXR5CisgICAgICAgIGFzc2VydFRydWUobWFuYWdlci5nZXRNZW1vcnlQb29sQ2FwYWNpdHlJbk1CKCkgPj0gMCk7CisgICAgICAgIG1hbmFnZXIuc2V0TWVtb3J5UG9vbENhcGFjaXR5SW5NQigxMCk7CisgICAgICAgIGFzc2VydEVxdWFscygxMCwgbWFuYWdlci5nZXRNZW1vcnlQb29sQ2FwYWNpdHlJbk1CKCkpOworCisgICAgICAgIFN0cmluZyBrc25hbWUgPSBLRVlTUEFDRTE7CisgICAgICAgIFN0cmluZyBjZm5hbWUgPSBDRl9TVEFOREFSRExPV2lJTlRFUlZBTDsgLy8gaW5kZXggaW50ZXJ2YWwgb2YgOCwgbm8ga2V5IGNhY2hpbmcKKyAgICAgICAgS2V5c3BhY2Uga2V5c3BhY2UgPSBLZXlzcGFjZS5vcGVuKGtzbmFtZSk7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKGNmbmFtZSk7CisgICAgICAgIGNmcy50cnVuY2F0ZUJsb2NraW5nKCk7CisgICAgICAgIGNmcy5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKworICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzEwMF0pOworCisgICAgICAgIGludCBudW1TU1RhYmxlcyA9IDI7CisgICAgICAgIGludCBudW1Sb3dzID0gMTA7CisgICAgICAgIGZvciAoaW50IHNzdGFibGUgPSAwOyBzc3RhYmxlIDwgbnVtU1NUYWJsZXM7IHNzdGFibGUrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnVtUm93czsgcm93KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleSA9IFN0cmluZy5mb3JtYXQoIiUzZCIsIHJvdyk7CisgICAgICAgICAgICAgICAgbmV3IFJvd1VwZGF0ZUJ1aWxkZXIoY2ZzLm1ldGFkYXRhKCksIDAsIGtleSkKKyAgICAgICAgICAgICAgICAuY2x1c3RlcmluZygiY29sdW1uIikKKyAgICAgICAgICAgICAgICAuYWRkKCJ2YWwiLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVXRpbC5mbHVzaChjZnMpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYW5hZ2VyLmdldEF2ZXJhZ2VJbmRleEludGVydmFsKCkgPj0gY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwpOworICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBpbnRlcnZhbHMgPSBtYW5hZ2VyLmdldEluZGV4SW50ZXJ2YWxzKCk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgSW50ZWdlcj4gZW50cnkgOiBpbnRlcnZhbHMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKS5jb250YWlucyhDRl9TVEFOREFSRExPV2lJTlRFUlZBTCkpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBlbnRyeS5nZXRWYWx1ZSgpLCAwLjAwMSk7CisKKyAgICAgICAgbWFuYWdlci5zZXRNZW1vcnlQb29sQ2FwYWNpdHlJbk1CKDApOworICAgICAgICBtYW5hZ2VyLnJlZGlzdHJpYnV0ZVN1bW1hcmllcygpOworICAgICAgICBhc3NlcnRUcnVlKG1hbmFnZXIuZ2V0QXZlcmFnZUluZGV4SW50ZXJ2YWwoKSA+IGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsKTsKKyAgICAgICAgaW50ZXJ2YWxzID0gbWFuYWdlci5nZXRJbmRleEludGVydmFscygpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+IGVudHJ5IDogaW50ZXJ2YWxzLmVudHJ5U2V0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKS5jb250YWlucyhDRl9TVEFOREFSRExPV2lJTlRFUlZBTCkpCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlbnRyeS5nZXRWYWx1ZSgpID49IGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbmNlbEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdENhbmNlbEluZGV4SGVscGVyKChjZnMpIC0+IENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLnN0b3BDb21wYWN0aW9uKCJJTkRFWF9TVU1NQVJZIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbmNlbEluZGV4SW50ZXJydXB0KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdENhbmNlbEluZGV4SGVscGVyKChjZnMpIC0+IENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmludGVycnVwdENvbXBhY3Rpb25Gb3IoQ29sbGVjdGlvbnMuc2luZ2xldG9uKGNmcy5tZXRhZGF0YSgpKSwgKHNzdGFibGUpIC0+IHRydWUsIGZhbHNlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdENhbmNlbEluZGV4SGVscGVyKENvbnN1bWVyPENvbHVtbkZhbWlseVN0b3JlPiBjYW5jZWxGdW5jdGlvbikgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKKyAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKKyAgICAgICAgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKKyAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBmaW5hbCBpbnQgbnVtU1NUYWJsZXMgPSA4OworICAgICAgICBpbnQgbnVtUm93cyA9IDI1NjsKKyAgICAgICAgY3JlYXRlU1NUYWJsZXMoa3NuYW1lLCBjZm5hbWUsIG51bVNTVGFibGVzLCBudW1Sb3dzKTsKKworICAgICAgICBMaXN0PFI+IGFsbFNTVGFibGVzID0gU2VydmVyVGVzdFV0aWxzLmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpOworICAgICAgICBMaXN0PFI+IHNzdGFibGVzID0gYWxsU1NUYWJsZXMuc3ViTGlzdCgwLCA0KTsKKyAgICAgICAgTGlzdDxSPiBjb21wYWN0aW5nID0gYWxsU1NUYWJsZXMuc3ViTGlzdCg0LCA4KTsKKworICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICAgICAgc3N0YWJsZS5vdmVycmlkZVJlYWRNZXRlcihuZXcgUmVzdG9yYWJsZU1ldGVyKDEwMC4wLCAxMDAuMCkpOworCisgICAgICAgIGZpbmFsIGxvbmcgc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSA9IHNzdGFibGVzLmdldCgwKS5nZXRJbmRleFN1bW1hcnkoKS5nZXRPZmZIZWFwU2l6ZSgpOworCisgICAgICAgIC8vIGV2ZXJ5dGhpbmcgc2hvdWxkIGdldCBjdXQgaW4gaGFsZgorICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8Q29tcGFjdGlvbkludGVycnVwdGVkRXhjZXB0aW9uPiBleGNlcHRpb24gPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgLy8gYmFycmllciB0byBjb250cm9sIHdoZW4gcmVkaXN0cmlidXRpb24gcnVucworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBiYXJyaWVyID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgb25nb2luZ0NvbXBhY3Rpb24gPSBuZXcgQ29tcGFjdGlvbkluZm8uSG9sZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKGNmcy5tZXRhZGF0YSgpLCBPcGVyYXRpb25UeXBlLlVOS05PV04sIDAsIDAsIG5leHRUaW1lVVVJRCgpLCBjb21wYWN0aW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiBpZ25vcmVkID0gY2ZzLmdldFRyYWNrZXIoKS50cnlNb2RpZnkoY29tcGFjdGluZywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmJlZ2luQ29tcGFjdGlvbihvbmdvaW5nQ29tcGFjdGlvbik7CisKKyAgICAgICAgICAgIFRocmVhZCB0ID0gTmFtZWRUaHJlYWRGYWN0b3J5LmNyZWF0ZUFub255bW91c1RocmVhZChuZXcgUnVubmFibGUoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgbGVhdmUgZW5vdWdoIHNwYWNlIGZvciBldmVuIHRoZSBtaW5pbWFsIGluZGV4IHN1bW1hcmllcworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleFN1bW1hcnlNYW5hZ2VyLnJlZGlzdHJpYnV0ZVN1bW1hcmllcyhuZXcgT2JzZXJ2YWJsZVJlZGlzdHJpYnV0aW9uKG9mKGNmcy5tZXRhZGF0YS5pZCwgdHhuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVTdW1tYXJ5T2ZmSGVhcFNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFycmllcikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5zZXQoZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgdC5zdGFydCgpOworICAgICAgICAgICAgd2hpbGUgKENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmdldEFjdGl2ZUNvbXBhY3Rpb25zKCkgPCAyICYmIHQuaXNBbGl2ZSgpKQorICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxKTsKKyAgICAgICAgICAgIC8vIHRvIGVuc3VyZSB0aGF0IHRoZSBzdG9wIGNvbmRpdGlvbiBjaGVjayBpbiBJbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbjo6cmVkaXN0cmlidXRlU3VtbWFyaWVzCisgICAgICAgICAgICAvLyBpcyBtYWRlICphZnRlciogdGhlIGhhbHQgcmVxdWVzdCBpcyBtYWRlIHRvIHRoZSBDb21wYWN0aW9uTWFuYWdlciwgZG9uJ3QgYWxsb3cgdGhlIHJlZGlzdHJpYnV0aW9uCisgICAgICAgICAgICAvLyB0byBwcm9jZWVkIHVudGlsIHN0b3BDb21wYWN0aW9uIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgICAgICAgIGNhbmNlbEZ1bmN0aW9uLmFjY2VwdChjZnMpOworICAgICAgICAgICAgLy8gYWxsb3dzIHRoZSByZWRpc3RyaWJ1dGlvbiB0byBwcm9jZWVkCisgICAgICAgICAgICBiYXJyaWVyLmNvdW50RG93bigpOworICAgICAgICAgICAgdC5qb2luKCk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZmluaXNoQ29tcGFjdGlvbihvbmdvaW5nQ29tcGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKCJFeHBlY3RlZCBjb21wYWN0aW9uIGludGVycnVwdGVkIGV4Y2VwdGlvbiIsIGV4Y2VwdGlvbi5nZXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIG5vIGFjdGl2ZSBjb21wYWN0aW9ucyIsIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5nZXRDb21wYWN0aW9ucygpLmlzRW1wdHkoKSk7CisKKyAgICAgICAgU2V0PFI+IGJlZm9yZVJlZGlzdHJpYnV0aW9uU1NUYWJsZXMgPSBuZXcgSGFzaFNldDw+KGFsbFNTVGFibGVzKTsKKyAgICAgICAgU2V0PFI+IGFmdGVyQ2FuY2VsU1NUYWJsZXMgPSBTZXRzLm5ld0hhc2hTZXQoU2VydmVyVGVzdFV0aWxzLmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpKTsKKyAgICAgICAgU2V0PFI+IGRpc2pvaW50ID0gU2V0cy5zeW1tZXRyaWNEaWZmZXJlbmNlKGJlZm9yZVJlZGlzdHJpYnV0aW9uU1NUYWJsZXMsIGFmdGVyQ2FuY2VsU1NUYWJsZXMpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoIk1pc21hdGNoZWQgZmlsZXMgYmVmb3JlIGFuZCBhZnRlciBjYW5jZWxsaW5nIHJlZGlzdHJpYnV0aW9uOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luZXIub24oIiwiKS5qb2luKGRpc2pvaW50KSksCisgICAgICAgICAgICAgICAgICAgZGlzam9pbnQuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0T25EaXNrU3RhdGUoY2ZzLCA4KTsKKyAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF1c2VJbmRleFN1bW1hcnlNYW5hZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKKyAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJETE9XaUlOVEVSVkFMOyAvLyBpbmRleCBpbnRlcnZhbCBvZiA4LCBubyBrZXkgY2FjaGluZworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKKyAgICAgICAgaW50IG51bVNTVGFibGVzID0gNDsKKyAgICAgICAgaW50IG51bVJvd3MgPSAyNTY7CisgICAgICAgIGNyZWF0ZVNTVGFibGVzKGtzbmFtZSwgY2ZuYW1lLCBudW1TU1RhYmxlcywgbnVtUm93cyk7CisKKyAgICAgICAgTGlzdDxSPiBzc3RhYmxlcyA9IFNlcnZlclRlc3RVdGlscy5nZXRMaXZlSW5kZXhTdW1tYXJ5U3VwcG9ydGluZ1JlYWRlcnMoY2ZzKTsKKyAgICAgICAgZm9yIChSIHNzdGFibGUgOiBzc3RhYmxlcykKKyAgICAgICAgICAgIHNzdGFibGUub3ZlcnJpZGVSZWFkTWV0ZXIobmV3IFJlc3RvcmFibGVNZXRlcigxMDAuMCwgMTAwLjApKTsKKworICAgICAgICBsb25nIHNpbmdsZVN1bW1hcnlPZmZIZWFwU3BhY2UgPSBzc3RhYmxlcy5nZXQoMCkuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0T2ZmSGVhcFNpemUoKTsKKworICAgICAgICAvLyBldmVyeXRoaW5nIHNob3VsZCBnZXQgY3V0IGluIGhhbGYKKyAgICAgICAgYXNzZXJ0IHNzdGFibGVzLnNpemUoKSA9PSBudW1TU1RhYmxlczsKKyAgICAgICAgdHJ5IChMaWZlY3ljbGVUcmFuc2FjdGlvbiB0eG4gPSBjZnMuZ2V0VHJhY2tlcigpLnRyeU1vZGlmeShzc3RhYmxlcywgT3BlcmF0aW9uVHlwZS5VTktOT1dOKSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5IChBdXRvQ2xvc2VhYmxlIHRvcmVzdW1lID0gQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UucGF1c2VHbG9iYWxDb21wYWN0aW9uKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3N0YWJsZXMgPSByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIG9mKGNmcy5tZXRhZGF0YSgpLmlkLCB0eG4pLCAoc2luZ2xlU3VtbWFyeU9mZkhlYXBTcGFjZSAqIChudW1TU1RhYmxlcyAvIDIpKSk7CisgICAgICAgICAgICAgICAgZmFpbCgiVGhlIHJlZGlzdHJpYnV0aW9uIHNob3VsZCBmYWlsIC0gd2UgZ290IHBhdXNlZCBiZWZvcmUgYWRkaW5nIHRvIGFjdGl2ZSBjb21wYWN0aW9ucywgYnV0IGFmdGVyIG1hcmtpbmcgY29tcGFjdGluZyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChDb21wYWN0aW9uSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJBU0VfU0FNUExJTkdfTEVWRUwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0U2FtcGxpbmdMZXZlbCgpKTsKKyAgICAgICAgdmFsaWRhdGVEYXRhKGNmcywgbnVtUm93cyk7CisgICAgICAgIGFzc2VydE9uRGlza1N0YXRlKGNmcywgbnVtU1NUYWJsZXMpOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxSPiByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoTGlzdDxSPiBjb21wYWN0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG1lbW9yeVBvb2xCeXRlcykKKyAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSA9IGNvbXBhY3Rpbmcuc3RyZWFtKCkubWFwVG9Mb25nKHQgLT4gdC5nZXRJbmRleFN1bW1hcnkoKS5nZXRPZmZIZWFwU2l6ZSgpKS5zdW0oKTsKKyAgICAgICAgcmV0dXJuIEluZGV4U3VtbWFyeU1hbmFnZXIucmVkaXN0cmlidXRlU3VtbWFyaWVzKG5ldyBJbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbih0cmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlQb29sQnl0ZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBPYnNlcnZhYmxlUmVkaXN0cmlidXRpb24gZXh0ZW5kcyBJbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvbgorICAgIHsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggYmFycmllcjsKKworICAgICAgICBPYnNlcnZhYmxlUmVkaXN0cmlidXRpb24oTWFwPFRhYmxlSWQsIExpZmVjeWNsZVRyYW5zYWN0aW9uPiB0cmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG5vblJlZGlzdHJpYnV0aW5nT2ZmSGVhcFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG1lbW9yeVBvb2xCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50RG93bkxhdGNoIGJhcnJpZXIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHRyYW5zYWN0aW9ucywgbm9uUmVkaXN0cmlidXRpbmdPZmZIZWFwU2l6ZSwgbWVtb3J5UG9vbEJ5dGVzKTsKKyAgICAgICAgICAgIHRoaXMuYmFycmllciA9IGJhcnJpZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgPFIgZXh0ZW5kcyBTU1RhYmxlUmVhZGVyICYgSW5kZXhTdW1tYXJ5U3VwcG9ydDxSPj4gTGlzdDxSPiByZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmFycmllci5hd2FpdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludGVycnVwdGVkIHdhaXRpbmcgb24gdGVzdCBiYXJyaWVyIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVkaXN0cmlidXRlU3VtbWFyaWVzKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9pbmRleHN1bW1hcnkvSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxMDNhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Sb3dVcGRhdGVCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2dQb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlJlc3RvcmFibGVNZXRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlN0b3JhZ2VNZXRyaWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5DYWNoaW5nUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hVGVzdFV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBJbmRleFN1bW1hcnlSZWRpc3RyaWJ1dGlvblRlc3Q8UiBleHRlbmRzIFNTVGFibGVSZWFkZXIgJiBJbmRleFN1bW1hcnlTdXBwb3J0PFI+PgoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTUEFDRTEgPSAiSW5kZXhTdW1tYXJ5UmVkaXN0cmlidXRpb25UZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZfU1RBTkRBUkQgPSAiU3RhbmRhcmQiOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlZmluZVNjaGVtYSgpIHRocm93cyBDb25maWd1cmF0aW9uRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoIlRoaXMgdGVzdCBtYWtlIHNlbnNlIG9ubHkgaWYgdGhlIGRlZmF1bHQgU1NUYWJsZSBmb3JtYXQgc3VwcG9ydCBpbmRleCBzdW1tYXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhTdW1tYXJ5U3VwcG9ydC5pc1N1cHBvcnRlZEJ5KERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSkpOworICAgICAgICBTY2hlbWFMb2FkZXIucHJlcGFyZVNlcnZlcigpOworICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2UoS0VZU1BBQ0UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENGX1NUQU5EQVJEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1pbkluZGV4SW50ZXJ2YWwoOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXhJbmRleEludGVydmFsKDI1NikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWNoaW5nKENhY2hpbmdQYXJhbXMuQ0FDSEVfTk9USElORykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ldHJpY3NMb2FkQWZ0ZXJSZWRpc3RyaWJ1dGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU3RyaW5nIGtzbmFtZSA9IEtFWVNQQUNFMTsKKyAgICAgICAgU3RyaW5nIGNmbmFtZSA9IENGX1NUQU5EQVJEOworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKKyAgICAgICAgaW50IG51bVNTVGFibGVzID0gMTsKKyAgICAgICAgaW50IG51bVJvd3MgPSAxMDI0ICogMTA7CisKKyAgICAgICAgbG9uZyBsb2FkID0gU3RvcmFnZU1ldHJpY3MubG9hZC5nZXRDb3VudCgpOworICAgICAgICBTdG9yYWdlTWV0cmljcy5sb2FkLmRlYyhsb2FkKTsgLy8gcmVzZXQgdGhlIGxvYWQgbWV0cmljCisgICAgICAgIGxvbmcgdW5jb21wcmVzc2VkTG9hZCA9IFN0b3JhZ2VNZXRyaWNzLnVuY29tcHJlc3NlZExvYWQuZ2V0Q291bnQoKTsKKyAgICAgICAgU3RvcmFnZU1ldHJpY3MudW5jb21wcmVzc2VkTG9hZC5kZWModW5jb21wcmVzc2VkTG9hZCk7IC8vIHJlc2V0IHRoZSB1bmNvbXByZXNzZWQgbG9hZCBtZXRyaWMKKworICAgICAgICBjcmVhdGVTU1RhYmxlcyhrc25hbWUsIGNmbmFtZSwgbnVtU1NUYWJsZXMsIG51bVJvd3MpOworCisgICAgICAgIExpc3Q8Uj4gc3N0YWJsZXMgPSBTZXJ2ZXJUZXN0VXRpbHMuZ2V0TGl2ZUluZGV4U3VtbWFyeVN1cHBvcnRpbmdSZWFkZXJzKGNmcyk7CisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogc3N0YWJsZXMpCisgICAgICAgICAgICBzc3RhYmxlLm92ZXJyaWRlUmVhZE1ldGVyKG5ldyBSZXN0b3JhYmxlTWV0ZXIoMTAwLjAsIDEwMC4wKSk7CisKKyAgICAgICAgbG9uZyBvbGRTaXplID0gMDsKKyAgICAgICAgbG9uZyBvbGRTaXplVW5jb21wcmVzc2VkID0gMDsKKworICAgICAgICBmb3IgKFIgc3N0YWJsZSA6IHNzdGFibGVzKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7CisgICAgICAgICAgICBvbGRTaXplICs9IHNzdGFibGUuYnl0ZXNPbkRpc2soKTsKKyAgICAgICAgICAgIG9sZFNpemVVbmNvbXByZXNzZWQgKz0gc3N0YWJsZS5sb2dpY2FsQnl0ZXNPbkRpc2soKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvYWQgPSBTdG9yYWdlTWV0cmljcy5sb2FkLmdldENvdW50KCk7CisgICAgICAgIGxvbmcgb3RoZXJzID0gbG9hZCAtIG9sZFNpemU7IC8vIE90aGVyIFNTVGFibGVzIHNpemUsIGUuZy4gc2NoZW1hIGFuZCBvdGhlciBzeXN0ZW0gU1NUYWJsZXMKKworICAgICAgICB1bmNvbXByZXNzZWRMb2FkID0gU3RvcmFnZU1ldHJpY3MudW5jb21wcmVzc2VkTG9hZC5nZXRDb3VudCgpOworICAgICAgICBsb25nIG90aGVyc1VuY29tcHJlc3NlZCA9IHVuY29tcHJlc3NlZExvYWQgLSBvbGRTaXplVW5jb21wcmVzc2VkOworCisgICAgICAgIGludCBvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgPSBjZnMubWV0YWRhdGEoKS5wYXJhbXMubWluSW5kZXhJbnRlcnZhbDsKKyAgICAgICAgLy8gZG91YmxlIHRoZSBtaW5faW5kZXhfaW50ZXJ2YWwKKyAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZVVwZGF0ZShjZnMubWV0YWRhdGEoKS51bmJ1aWxkKCkubWluSW5kZXhJbnRlcnZhbChvcmlnaW5hbE1pbkluZGV4SW50ZXJ2YWwgKiAyKS5idWlsZCgpKTsKKyAgICAgICAgSW5kZXhTdW1tYXJ5TWFuYWdlci5pbnN0YW5jZS5yZWRpc3RyaWJ1dGVTdW1tYXJpZXMoKTsKKworICAgICAgICBsb25nIG5ld1NpemUgPSAwOworICAgICAgICBsb25nIG5ld1NpemVVbmNvbXByZXNzZWQgPSAwOworCisgICAgICAgIGZvciAoUiBzc3RhYmxlIDogU2VydmVyVGVzdFV0aWxzLjxSPmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLm1pbkluZGV4SW50ZXJ2YWwsIHNzdGFibGUuZ2V0SW5kZXhTdW1tYXJ5KCkuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbCgpLCAwLjAwMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtUm93cyAvIGNmcy5tZXRhZGF0YSgpLnBhcmFtcy5taW5JbmRleEludGVydmFsLCBzc3RhYmxlLmdldEluZGV4U3VtbWFyeSgpLnNpemUoKSk7CisgICAgICAgICAgICBuZXdTaXplICs9IHNzdGFibGUuYnl0ZXNPbkRpc2soKTsKKyAgICAgICAgICAgIG5ld1NpemVVbmNvbXByZXNzZWQgKz0gc3N0YWJsZS5sb2dpY2FsQnl0ZXNPbkRpc2soKTsKKyAgICAgICAgfQorCisgICAgICAgIG5ld1NpemUgKz0gb3RoZXJzOworICAgICAgICBsb2FkID0gU3RvcmFnZU1ldHJpY3MubG9hZC5nZXRDb3VudCgpOworICAgICAgICAvLyBuZXcgc2l6ZSB3ZSBjYWxjdWxhdGUgc2hvdWxkIGJlIGFsbW9zdCB0aGUgc2FtZSBhcyB0aGUgbG9hZCBpbiBtZXRyaWNzCisgICAgICAgIGFzc2VydEVxdWFscyhuZXdTaXplLCBsb2FkLCBuZXdTaXplIC8gMTAuMCk7CisKKyAgICAgICAgbmV3U2l6ZVVuY29tcHJlc3NlZCArPSBvdGhlcnNVbmNvbXByZXNzZWQ7CisgICAgICAgIHVuY29tcHJlc3NlZExvYWQgPSBTdG9yYWdlTWV0cmljcy51bmNvbXByZXNzZWRMb2FkLmdldENvdW50KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXdTaXplVW5jb21wcmVzc2VkLCB1bmNvbXByZXNzZWRMb2FkLCBuZXdTaXplVW5jb21wcmVzc2VkIC8gMTAuMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNTVGFibGVzKFN0cmluZyBrc25hbWUsIFN0cmluZyBjZm5hbWUsIGludCBudW1TU1RhYmxlcywgaW50IG51bVJvd3MpCisgICAgeworICAgICAgICBLZXlzcGFjZSBrZXlzcGFjZSA9IEtleXNwYWNlLm9wZW4oa3NuYW1lKTsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2ZuYW1lKTsKKyAgICAgICAgY2ZzLnRydW5jYXRlQmxvY2tpbmcoKTsKKyAgICAgICAgY2ZzLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworCisgICAgICAgIEFycmF5TGlzdDxGdXR1cmU8Q29tbWl0TG9nUG9zaXRpb24+PiBmdXR1cmVzID0gbmV3IEFycmF5TGlzdDw+KG51bVNTVGFibGVzKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZSA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVsxMDBdKTsKKyAgICAgICAgZm9yIChpbnQgc3N0YWJsZSA9IDA7IHNzdGFibGUgPCBudW1TU1RhYmxlczsgc3N0YWJsZSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBudW1Sb3dzOyByb3crKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gU3RyaW5nLmZvcm1hdCgiJTNkIiwgcm93KTsKKyAgICAgICAgICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwga2V5KQorICAgICAgICAgICAgICAgIC5jbHVzdGVyaW5nKCJjb2x1bW4iKQorICAgICAgICAgICAgICAgIC5hZGQoInZhbCIsIHZhbHVlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICAgICAgICAgLmFwcGx5VW5zYWZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmdXR1cmVzLmFkZChjZnMuZm9yY2VGbHVzaChDb2x1bW5GYW1pbHlTdG9yZS5GbHVzaFJlYXNvbi5VTklUX1RFU1RTKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChGdXR1cmU8Q29tbWl0TG9nUG9zaXRpb24+IGZ1dHVyZSA6IGZ1dHVyZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZ1dHVyZS5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB8IEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhudW1TU1RhYmxlcywgU2VydmVyVGVzdFV0aWxzLmdldExpdmVJbmRleFN1bW1hcnlTdXBwb3J0aW5nUmVhZGVycyhjZnMpLnNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvaW5kZXhzdW1tYXJ5L0luZGV4U3VtbWFyeVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhMTY2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2luZGV4c3VtbWFyeS9JbmRleFN1bW1hcnlUZXN0LmphdmEKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZG9tUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Eb3duc2FtcGxpbmc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzLkRhdGFJbnB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50RW52LkNJUkNMRUNJOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRvd25zYW1wbGluZy5CQVNFX1NBTVBMSU5HX0xFVkVMOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnlCdWlsZGVyLmRvd25zYW1wbGU7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuaW5kZXhzdW1tYXJ5LkluZGV4U3VtbWFyeUJ1aWxkZXIuZW50cmllc0F0U2FtcGxpbmdMZXZlbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCitwdWJsaWMgY2xhc3MgSW5kZXhTdW1tYXJ5VGVzdAoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEREKCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworCisgICAgICAgIGZpbmFsIGxvbmcgc2VlZCA9IG5hbm9UaW1lKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgc2VlZDogIiArIHNlZWQpOworICAgICAgICByYW5kb20uc2V0U2VlZChzZWVkKTsKKyAgICB9CisKKyAgICBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBVdGlsLnRlc3RQYXJ0aXRpb25lcigpOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkKKyAgICB7CisgICAgICAgIGZpbmFsIGxvbmcgc2VlZCA9IG5hbm9UaW1lKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgc2VlZDogIiArIHNlZWQpOworICAgICAgICByYW5kb20uc2V0U2VlZChzZWVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleFN1bW1hcnlLZXlTaXplcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gT24gQ2lyY2xlIENJIHdlIG5vcm1hbGx5IGRvbid0IGhhdmUgZW5vdWdoIG9mZi1oZWFwIG1lbW9yeSBmb3IgdGhpcyB0ZXN0IHNvIGlnbm9yZSBpdAorICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShDSVJDTEVDSS5nZXRTdHJpbmcoKSA9PSBudWxsKTsKKworICAgICAgICB0ZXN0SW5kZXhTdW1tYXJ5UHJvcGVydGllcygzMiwgMTAwKTsKKyAgICAgICAgdGVzdEluZGV4U3VtbWFyeVByb3BlcnRpZXMoNjQsIDEwMCk7CisgICAgICAgIHRlc3RJbmRleFN1bW1hcnlQcm9wZXJ0aWVzKDEwMCwgMTAwKTsKKyAgICAgICAgdGVzdEluZGV4U3VtbWFyeVByb3BlcnRpZXMoMTAwMCwgMTAwKTsKKyAgICAgICAgdGVzdEluZGV4U3VtbWFyeVByb3BlcnRpZXMoMTAwMDAsIDEwMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RJbmRleFN1bW1hcnlQcm9wZXJ0aWVzKGludCBrZXlTaXplLCBpbnQgbnVtS2V5cykgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBmaW5hbCBpbnQgbWluSW5kZXhJbnRlcnZhbCA9IDE7CisgICAgICAgIGZpbmFsIExpc3Q8RGVjb3JhdGVkS2V5PiBrZXlzID0gbmV3IEFycmF5TGlzdDw+KG51bUtleXMpOworCisgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5QnVpbGRlciBidWlsZGVyID0gbmV3IEluZGV4U3VtbWFyeUJ1aWxkZXIobnVtS2V5cywgbWluSW5kZXhJbnRlcnZhbCwgQkFTRV9TQU1QTElOR19MRVZFTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGVbXSByYW5kb21CeXRlcyA9IG5ldyBieXRlW2tleVNpemVdOworICAgICAgICAgICAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMocmFuZG9tQnl0ZXMpOworICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyLndyYXAocmFuZG9tQnl0ZXMpKTsKKyAgICAgICAgICAgICAgICBrZXlzLmFkZChrZXkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIubWF5YmVBZGRFbnRyeShrZXksIGkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkoSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSA9IGJ1aWxkZXIuYnVpbGQocGFydGl0aW9uZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1LZXlzLCBrZXlzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1pbkluZGV4SW50ZXJ2YWwsIGluZGV4U3VtbWFyeS5nZXRNaW5JbmRleEludGVydmFsKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1LZXlzLCBpbmRleFN1bW1hcnkuZ2V0TWF4TnVtYmVyT2ZFbnRyaWVzKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1LZXlzICsgMSwgaW5kZXhTdW1tYXJ5LmdldEVzdGltYXRlZEtleUNvdW50KCkpOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1LZXlzOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhrZXlzLmdldChpKS5nZXRLZXkoKSwgQnl0ZUJ1ZmZlci53cmFwKGluZGV4U3VtbWFyeS5nZXRLZXkoaSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYW4gaW5kZXggc3VtbWFyeSB3aG9zZSB0b3RhbCBzaXplIGlzIGJpZ2dlciB0aGFuIDJHaUIsCisgICAgICogdGhlIGluZGV4IHN1bW1hcnkgYnVpbGRlciBzaG91bGQgbG9nIGFuIGVycm9yIGJ1dCBpdCBzaG91bGQgc3RpbGwKKyAgICAgKiBjcmVhdGUgYW4gaW5kZXggc3VtbWFyeSwgYWxiZWl0IG9uZSB0aGF0IGRvZXMgbm90IGNvdmVyIHRoZSBlbnRpcmUgc3N0YWJsZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXJnZUluZGV4U3VtbWFyeSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gT24gQ2lyY2xlIENJIHdlIG5vcm1hbGx5IGRvbid0IGhhdmUgZW5vdWdoIG9mZi1oZWFwIG1lbW9yeSBmb3IgdGhpcyB0ZXN0IHNvIGlnbm9yZSBpdAorICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShDSVJDTEVDSS5nZXRTdHJpbmcoKSA9PSBudWxsKTsKKworICAgICAgICBmaW5hbCBpbnQgbnVtS2V5cyA9IDEwMDAwMDA7CisgICAgICAgIGZpbmFsIGludCBrZXlTaXplID0gMzAwMDsKKyAgICAgICAgZmluYWwgaW50IG1pbkluZGV4SW50ZXJ2YWwgPSAxOworCisgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5QnVpbGRlciBidWlsZGVyID0gbmV3IEluZGV4U3VtbWFyeUJ1aWxkZXIobnVtS2V5cywgbWluSW5kZXhJbnRlcnZhbCwgQkFTRV9TQU1QTElOR19MRVZFTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtS2V5czsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ5dGVbXSByYW5kb21CeXRlcyA9IG5ldyBieXRlW2tleVNpemVdOworICAgICAgICAgICAgICAgIHJhbmRvbS5uZXh0Qnl0ZXMocmFuZG9tQnl0ZXMpOworICAgICAgICAgICAgICAgIERlY29yYXRlZEtleSBrZXkgPSBwYXJ0aXRpb25lci5kZWNvcmF0ZUtleShCeXRlQnVmZmVyLndyYXAocmFuZG9tQnl0ZXMpKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLm1heWJlQWRkRW50cnkoa2V5LCBpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IChJbmRleFN1bW1hcnkgaW5kZXhTdW1tYXJ5ID0gYnVpbGRlci5idWlsZChwYXJ0aXRpb25lcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbmRleFN1bW1hcnkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1LZXlzLCBpbmRleFN1bW1hcnkuZ2V0TWF4TnVtYmVyT2ZFbnRyaWVzKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1LZXlzICsgMSwgaW5kZXhTdW1tYXJ5LmdldEVzdGltYXRlZEtleUNvdW50KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBhbiBpbmRleCBzdW1tYXJ5IHdob3NlIHRvdGFsIHNpemUgaXMgYmlnZ2VyIHRoYW4gMkdpQiwKKyAgICAgKiBoYXZpbmcgdXBkYXRlZCBJbmRleFN1bW1hcnlCdWlsZGVyLmRlZmF1bHRFeHBlY3RlZEtleVNpemUgdG8gbWF0Y2ggdGhlIHNpemUsCisgICAgICogdGhlIGluZGV4IHN1bW1hcnkgc2hvdWxkIGJlIGRvd25zYW1wbGVkIGF1dG9tYXRpY2FsbHkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGFyZ2VJbmRleFN1bW1hcnlXaXRoRXhwZWN0ZWRTaXplTWF0Y2hpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIE9uIENpcmNsZSBDSSB3ZSBub3JtYWxseSBkb24ndCBoYXZlIGVub3VnaCBvZmYtaGVhcCBtZW1vcnkgZm9yIHRoaXMgdGVzdCBzbyBpZ25vcmUgaXQKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoQ0lSQ0xFQ0kuZ2V0U3RyaW5nKCkgPT0gbnVsbCk7CisKKyAgICAgICAgZmluYWwgaW50IG51bUtleXMgPSAxMDAwMDAwOworICAgICAgICBmaW5hbCBpbnQga2V5U2l6ZSA9IDMwMDA7CisgICAgICAgIGZpbmFsIGludCBtaW5JbmRleEludGVydmFsID0gMTsKKworICAgICAgICBsb25nIG9sZEV4cGVjdGVkS2V5U2l6ZSA9IEluZGV4U3VtbWFyeUJ1aWxkZXIuZGVmYXVsdEV4cGVjdGVkS2V5U2l6ZTsKKyAgICAgICAgSW5kZXhTdW1tYXJ5QnVpbGRlci5kZWZhdWx0RXhwZWN0ZWRLZXlTaXplID0gMzAwMDsKKworICAgICAgICB0cnkgKEluZGV4U3VtbWFyeUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBJbmRleFN1bW1hcnlCdWlsZGVyKG51bUtleXMsIG1pbkluZGV4SW50ZXJ2YWwsIEJBU0VfU0FNUExJTkdfTEVWRUwpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUtleXM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBieXRlW10gcmFuZG9tQnl0ZXMgPSBuZXcgYnl0ZVtrZXlTaXplXTsKKyAgICAgICAgICAgICAgICByYW5kb20ubmV4dEJ5dGVzKHJhbmRvbUJ5dGVzKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlci53cmFwKHJhbmRvbUJ5dGVzKSk7CisgICAgICAgICAgICAgICAgYnVpbGRlci5tYXliZUFkZEVudHJ5KGtleSwgaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSAoSW5kZXhTdW1tYXJ5IGluZGV4U3VtbWFyeSA9IGJ1aWxkZXIuYnVpbGQocGFydGl0aW9uZXIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaW5kZXhTdW1tYXJ5KTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobWluSW5kZXhJbnRlcnZhbCAqIDIsIGluZGV4U3VtbWFyeS5nZXRNaW5JbmRleEludGVydmFsKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhudW1LZXlzIC8gMiwgaW5kZXhTdW1tYXJ5LmdldE1heE51bWJlck9mRW50cmllcygpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVtS2V5cyArIDIsIGluZGV4U3VtbWFyeS5nZXRFc3RpbWF0ZWRLZXlDb3VudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIEluZGV4U3VtbWFyeUJ1aWxkZXIuZGVmYXVsdEV4cGVjdGVkS2V5U2l6ZSA9IG9sZEV4cGVjdGVkS2V5U2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEtleSgpCisgICAgeworICAgICAgICBQYWlyPExpc3Q8RGVjb3JhdGVkS2V5PiwgSW5kZXhTdW1tYXJ5PiByYW5kb20gPSBnZW5lcmF0ZVJhbmRvbUluZGV4KDEwMCwgMSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocmFuZG9tLmxlZnQuZ2V0KGkpLmdldEtleSgpLCBCeXRlQnVmZmVyLndyYXAocmFuZG9tLnJpZ2h0LmdldEtleShpKSkpOworICAgICAgICByYW5kb20ucmlnaHQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5hcnlTZWFyY2goKQorICAgIHsKKyAgICAgICAgUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIEluZGV4U3VtbWFyeT4gcmFuZG9tID0gZ2VuZXJhdGVSYW5kb21JbmRleCgxMDAsIDEpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIHJhbmRvbS5yaWdodC5iaW5hcnlTZWFyY2gocmFuZG9tLmxlZnQuZ2V0KGkpKSk7CisgICAgICAgIHJhbmRvbS5yaWdodC5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBvc2l0aW9uKCkKKyAgICB7CisgICAgICAgIFBhaXI8TGlzdDxEZWNvcmF0ZWRLZXk+LCBJbmRleFN1bW1hcnk+IHJhbmRvbSA9IGdlbmVyYXRlUmFuZG9tSW5kZXgoMTAwLCAyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGkqMiwgcmFuZG9tLnJpZ2h0LmdldFBvc2l0aW9uKGkpKTsKKyAgICAgICAgcmFuZG9tLnJpZ2h0LmNsb3NlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIEluZGV4U3VtbWFyeT4gcmFuZG9tID0gZ2VuZXJhdGVSYW5kb21JbmRleCgxMDAsIDEpOworICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGRvcyA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7CisgICAgICAgIEluZGV4U3VtbWFyeS5zZXJpYWxpemVyLnNlcmlhbGl6ZShyYW5kb20ucmlnaHQsIGRvcyk7CisgICAgICAgIC8vIHdyaXRlIGp1bmsKKyAgICAgICAgZG9zLndyaXRlVVRGKCJKVU5LIik7CisgICAgICAgIGRvcy53cml0ZVVURigiSlVOSyIpOworICAgICAgICBGaWxlVXRpbHMuY2xvc2VRdWlldGx5KGRvcyk7CisgICAgICAgIERhdGFJbnB1dFN0cmVhbVBsdXMgZGlzID0gbmV3IERhdGFJbnB1dEJ1ZmZlcihkb3MudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIEluZGV4U3VtbWFyeSBpcyA9IEluZGV4U3VtbWFyeS5zZXJpYWxpemVyLmRlc2VyaWFsaXplKGRpcywgcGFydGl0aW9uZXIsIDEsIDEpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIGlzLmJpbmFyeVNlYXJjaChyYW5kb20ubGVmdC5nZXQoaSkpKTsKKyAgICAgICAgLy8gcmVhZCB0aGUganVuaworICAgICAgICBhc3NlcnRFcXVhbHMoZGlzLnJlYWRVVEYoKSwgIkpVTksiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRpcy5yZWFkVVRGKCksICJKVU5LIik7CisgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIEZpbGVVdGlscy5jbG9zZVF1aWV0bHkoZGlzKTsKKyAgICAgICAgcmFuZG9tLnJpZ2h0LmNsb3NlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRW1wdHlLZXkoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBJUGFydGl0aW9uZXIgcCA9IG5ldyBSYW5kb21QYXJ0aXRpb25lcigpOworICAgICAgICB0cnkgKEluZGV4U3VtbWFyeUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBJbmRleFN1bW1hcnlCdWlsZGVyKDEsIDEsIEJBU0VfU0FNUExJTkdfTEVWRUwpKQorICAgICAgICB7CisgICAgICAgICAgICBidWlsZGVyLm1heWJlQWRkRW50cnkocC5kZWNvcmF0ZUtleShCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUiksIDApOworICAgICAgICAgICAgSW5kZXhTdW1tYXJ5IHN1bW1hcnkgPSBidWlsZGVyLmJ1aWxkKHApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN1bW1hcnkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBzdW1tYXJ5LmdldFBvc2l0aW9uKDApKTsKKyAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKG5ldyBieXRlWzBdLCBzdW1tYXJ5LmdldEtleSgwKSk7CisKKyAgICAgICAgICAgIERhdGFPdXRwdXRCdWZmZXIgZG9zID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKTsKKyAgICAgICAgICAgIEluZGV4U3VtbWFyeS5zZXJpYWxpemVyLnNlcmlhbGl6ZShzdW1tYXJ5LCBkb3MpOworICAgICAgICAgICAgRGF0YUlucHV0U3RyZWFtUGx1cyBkaXMgPSBuZXcgRGF0YUlucHV0QnVmZmVyKGRvcy50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgIEluZGV4U3VtbWFyeSBsb2FkZWQgPSBJbmRleFN1bW1hcnkuc2VyaWFsaXplci5kZXNlcmlhbGl6ZShkaXMsIHAsIDEsIDEpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbG9hZGVkLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc3VtbWFyeS5nZXRQb3NpdGlvbigwKSwgbG9hZGVkLmdldFBvc2l0aW9uKDApKTsKKyAgICAgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKHN1bW1hcnkuZ2V0S2V5KDApLCBzdW1tYXJ5LmdldEtleSgwKSk7CisgICAgICAgICAgICBzdW1tYXJ5LmNsb3NlKCk7CisgICAgICAgICAgICBsb2FkZWQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUGFpcjxMaXN0PERlY29yYXRlZEtleT4sIEluZGV4U3VtbWFyeT4gZ2VuZXJhdGVSYW5kb21JbmRleChpbnQgc2l6ZSwgaW50IGludGVydmFsKQorICAgIHsKKyAgICAgICAgTGlzdDxEZWNvcmF0ZWRLZXk+IGxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QoKTsKKyAgICAgICAgdHJ5IChJbmRleFN1bW1hcnlCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSW5kZXhTdW1tYXJ5QnVpbGRlcihsaXN0LnNpemUoKSwgaW50ZXJ2YWwsIEJBU0VfU0FNUExJTkdfTEVWRUwpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVVUlEIHV1aWQgPSBVVUlELnJhbmRvbVVVSUQoKTsKKyAgICAgICAgICAgICAgICBEZWNvcmF0ZWRLZXkga2V5ID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXModXVpZCkpOworICAgICAgICAgICAgICAgIGxpc3QuYWRkKGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICAgICAgYnVpbGRlci5tYXliZUFkZEVudHJ5KGxpc3QuZ2V0KGkpLCBpKTsKKyAgICAgICAgICAgIEluZGV4U3VtbWFyeSBzdW1tYXJ5ID0gYnVpbGRlci5idWlsZChwYXJ0aXRpb25lcik7CisgICAgICAgICAgICByZXR1cm4gUGFpci5jcmVhdGUobGlzdCwgc3VtbWFyeSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG93bnNhbXBsZVBhdHRlcm5zKCkKKyAgICB7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgwKSwgRG93bnNhbXBsaW5nLmdldFNhbXBsaW5nUGF0dGVybigwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDApLCBEb3duc2FtcGxpbmcuZ2V0U2FtcGxpbmdQYXR0ZXJuKDEpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgxLCAwKSwgRG93bnNhbXBsaW5nLmdldFNhbXBsaW5nUGF0dGVybigyKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDMsIDEsIDIsIDApLCBEb3duc2FtcGxpbmcuZ2V0U2FtcGxpbmdQYXR0ZXJuKDQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoNywgMywgNSwgMSwgNiwgMiwgNCwgMCksIERvd25zYW1wbGluZy5nZXRTYW1wbGluZ1BhdHRlcm4oOCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgxNSwgNywgMTEsIDMsIDEzLCA1LCA5LCAxLCAxNCwgNiwgMTAsIDIsIDEyLCA0LCA4LCAwKSwgRG93bnNhbXBsaW5nLmdldFNhbXBsaW5nUGF0dGVybigxNikpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2hvdWxkU2tpcChpbnQgaW5kZXgsIExpc3Q8SW50ZWdlcj4gc3RhcnRQb2ludHMpCisgICAgeworICAgICAgICBmb3IgKGludCBzdGFydCA6IHN0YXJ0UG9pbnRzKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKGluZGV4IC0gc3RhcnQpICUgQkFTRV9TQU1QTElOR19MRVZFTCA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb3duc2FtcGxlKCkKKyAgICB7CisgICAgICAgIGZpbmFsIGludCBOVU1fS0VZUyA9IDQwOTY7CisgICAgICAgIGZpbmFsIGludCBJTkRFWF9JTlRFUlZBTCA9IDEyODsKKyAgICAgICAgZmluYWwgaW50IE9SSUdJTkFMX05VTV9FTlRSSUVTID0gTlVNX0tFWVMgLyBJTkRFWF9JTlRFUlZBTDsKKworCisgICAgICAgIFBhaXI8TGlzdDxEZWNvcmF0ZWRLZXk+LCBJbmRleFN1bW1hcnk+IHJhbmRvbSA9IGdlbmVyYXRlUmFuZG9tSW5kZXgoTlVNX0tFWVMsIElOREVYX0lOVEVSVkFMKTsKKyAgICAgICAgTGlzdDxEZWNvcmF0ZWRLZXk+IGtleXMgPSByYW5kb20ubGVmdDsKKyAgICAgICAgSW5kZXhTdW1tYXJ5IG9yaWdpbmFsID0gcmFuZG9tLnJpZ2h0OworCisgICAgICAgIC8vIHNhbml0eSBjaGVjayBvbiB0aGUgb3JpZ2luYWwgaW5kZXggc3VtbWFyeQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE9SSUdJTkFMX05VTV9FTlRSSUVTOyBpKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoa2V5cy5nZXQoaSAqIElOREVYX0lOVEVSVkFMKS5nZXRLZXkoKSwgQnl0ZUJ1ZmZlci53cmFwKG9yaWdpbmFsLmdldEtleShpKSkpOworCisgICAgICAgIExpc3Q8SW50ZWdlcj4gc2FtcGxlUGF0dGVybiA9IERvd25zYW1wbGluZy5nZXRTYW1wbGluZ1BhdHRlcm4oQkFTRV9TQU1QTElOR19MRVZFTCk7CisKKyAgICAgICAgLy8gZG93bnNhbXBsZSBieSBvbmUgbGV2ZWwsIHRoZW4gdHdvIGxldmVscywgdGhlbiB0aHJlZSBsZXZlbHMuLi4KKyAgICAgICAgaW50IGRvd25zYW1wbGluZ1JvdW5kID0gMTsKKyAgICAgICAgZm9yIChpbnQgc2FtcGxpbmdMZXZlbCA9IEJBU0VfU0FNUExJTkdfTEVWRUwgLSAxOyBzYW1wbGluZ0xldmVsID49IDE7IHNhbXBsaW5nTGV2ZWwtLSkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5IChJbmRleFN1bW1hcnkgZG93bnNhbXBsZWQgPSBkb3duc2FtcGxlKG9yaWdpbmFsLCBzYW1wbGluZ0xldmVsLCAxMjgsIHBhcnRpdGlvbmVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZW50cmllc0F0U2FtcGxpbmdMZXZlbChzYW1wbGluZ0xldmVsLCBvcmlnaW5hbC5nZXRNYXhOdW1iZXJPZkVudHJpZXMoKSksIGRvd25zYW1wbGVkLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICBpbnQgc2FtcGxlZENvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBMaXN0PEludGVnZXI+IHNraXBTdGFydFBvaW50cyA9IHNhbXBsZVBhdHRlcm4uc3ViTGlzdCgwLCBkb3duc2FtcGxpbmdSb3VuZCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBPUklHSU5BTF9OVU1fRU5UUklFUzsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRTa2lwKGksIHNraXBTdGFydFBvaW50cykpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhrZXlzLmdldChpICogSU5ERVhfSU5URVJWQUwpLmdldEtleSgpLCBCeXRlQnVmZmVyLndyYXAoZG93bnNhbXBsZWQuZ2V0S2V5KHNhbXBsZWRDb3VudCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZWRDb3VudCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGVzdFBvc2l0aW9uKG9yaWdpbmFsLCBkb3duc2FtcGxlZCwga2V5cyk7CisgICAgICAgICAgICAgICAgZG93bnNhbXBsaW5nUm91bmQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvd25zYW1wbGUgb25lIGxldmVsIGVhY2ggdGltZQorICAgICAgICBJbmRleFN1bW1hcnkgcHJldmlvdXMgPSBvcmlnaW5hbDsKKyAgICAgICAgZG93bnNhbXBsaW5nUm91bmQgPSAxOworICAgICAgICBmb3IgKGludCBkb3duc2FtcGxlTGV2ZWwgPSBCQVNFX1NBTVBMSU5HX0xFVkVMIC0gMTsgZG93bnNhbXBsZUxldmVsID49IDE7IGRvd25zYW1wbGVMZXZlbC0tKQorICAgICAgICB7CisgICAgICAgICAgICBJbmRleFN1bW1hcnkgZG93bnNhbXBsZWQgPSBkb3duc2FtcGxlKHByZXZpb3VzLCBkb3duc2FtcGxlTGV2ZWwsIDEyOCwgcGFydGl0aW9uZXIpOworICAgICAgICAgICAgaWYgKHByZXZpb3VzICE9IG9yaWdpbmFsKQorICAgICAgICAgICAgICAgIHByZXZpb3VzLmNsb3NlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZW50cmllc0F0U2FtcGxpbmdMZXZlbChkb3duc2FtcGxlTGV2ZWwsIG9yaWdpbmFsLmdldE1heE51bWJlck9mRW50cmllcygpKSwgZG93bnNhbXBsZWQuc2l6ZSgpKTsKKworICAgICAgICAgICAgaW50IHNhbXBsZWRDb3VudCA9IDA7CisgICAgICAgICAgICBMaXN0PEludGVnZXI+IHNraXBTdGFydFBvaW50cyA9IHNhbXBsZVBhdHRlcm4uc3ViTGlzdCgwLCBkb3duc2FtcGxpbmdSb3VuZCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE9SSUdJTkFMX05VTV9FTlRSSUVTOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzaG91bGRTa2lwKGksIHNraXBTdGFydFBvaW50cykpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoa2V5cy5nZXQoaSAqIElOREVYX0lOVEVSVkFMKS5nZXRLZXkoKSwgQnl0ZUJ1ZmZlci53cmFwKGRvd25zYW1wbGVkLmdldEtleShzYW1wbGVkQ291bnQpKSk7CisgICAgICAgICAgICAgICAgICAgIHNhbXBsZWRDb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVzdFBvc2l0aW9uKG9yaWdpbmFsLCBkb3duc2FtcGxlZCwga2V5cyk7CisgICAgICAgICAgICBwcmV2aW91cyA9IGRvd25zYW1wbGVkOworICAgICAgICAgICAgZG93bnNhbXBsaW5nUm91bmQrKzsKKyAgICAgICAgfQorICAgICAgICBwcmV2aW91cy5jbG9zZSgpOworICAgICAgICBvcmlnaW5hbC5jbG9zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UG9zaXRpb24oSW5kZXhTdW1tYXJ5IG9yaWdpbmFsLCBJbmRleFN1bW1hcnkgZG93bnNhbXBsZWQsIExpc3Q8RGVjb3JhdGVkS2V5PiBrZXlzKQorICAgIHsKKyAgICAgICAgZm9yIChEZWNvcmF0ZWRLZXkga2V5IDoga2V5cykKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBvcmlnID0gb3JpZ2luYWwuZ2V0U2NhblBvc2l0aW9uKGtleSk7CisgICAgICAgICAgICBpbnQgYmluYXJ5U2VhcmNoID0gZG93bnNhbXBsZWQuYmluYXJ5U2VhcmNoKGtleSk7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBJbmRleFN1bW1hcnkuZ2V0SW5kZXhGcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGJpbmFyeVNlYXJjaCk7CisgICAgICAgICAgICBpbnQgc2NhbkZyb20gPSAoaW50KSBkb3duc2FtcGxlZC5nZXRTY2FuUG9zaXRpb25Gcm9tQmluYXJ5U2VhcmNoUmVzdWx0KGluZGV4KTsKKyAgICAgICAgICAgIGFzc2VydCBzY2FuRnJvbSA8PSBvcmlnOworICAgICAgICAgICAgaW50IGVmZmVjdGl2ZUludGVydmFsID0gZG93bnNhbXBsZWQuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbEFmdGVySW5kZXgoaW5kZXgpOworICAgICAgICAgICAgRGVjb3JhdGVkS2V5IGsgPSBudWxsOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBrICE9IGtleSAmJiBpIDwgZWZmZWN0aXZlSW50ZXJ2YWwgJiYgc2NhbkZyb20gPCBrZXlzLnNpemUoKSA7IGkrKywgc2NhbkZyb20gKyspCisgICAgICAgICAgICAgICAgayA9IGtleXMuZ2V0KHNjYW5Gcm9tKTsKKyAgICAgICAgICAgIGFzc2VydCBrID09IGtleTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9yaWdpbmFsSW5kZXhMb29rdXAoKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IEJBU0VfU0FNUExJTkdfTEVWRUw7IGkgPj0gMTsgaS0tKQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIERvd25zYW1wbGluZy5nZXRPcmlnaW5hbEluZGV4ZXMoaSkuc2l6ZSgpKTsKKworICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gZnVsbCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJBU0VfU0FNUExJTkdfTEVWRUw7IGkrKykKKyAgICAgICAgICAgIGZ1bGwuYWRkKGkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhmdWxsLCBEb3duc2FtcGxpbmcuZ2V0T3JpZ2luYWxJbmRleGVzKEJBU0VfU0FNUExJTkdfTEVWRUwpKTsKKyAgICAgICAgLy8gdGhlIGVudHJ5IGF0IGluZGV4IDEyNyBpcyB0aGUgZmlyc3QgdG8gZ28KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZ1bGwuc3ViTGlzdCgwLCBmdWxsLnNpemUoKSAtIDEpLCBEb3duc2FtcGxpbmcuZ2V0T3JpZ2luYWxJbmRleGVzKEJBU0VfU0FNUExJTkdfTEVWRUwgLSAxKSk7CisKKyAgICAgICAgLy8gc3BvdCBjaGVjayBhIGZldyB2YWx1ZXMgKHRoZXNlIGRlcGVuZCBvbiBCQVNFX1NBTVBMSU5HX0xFVkVMIGJlaW5nIDEyOCkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyOCwgQkFTRV9TQU1QTElOR19MRVZFTCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDAsIDMyLCA2NCwgOTYpLCBEb3duc2FtcGxpbmcuZ2V0T3JpZ2luYWxJbmRleGVzKDQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoMCwgNjQpLCBEb3duc2FtcGxpbmcuZ2V0T3JpZ2luYWxJbmRleGVzKDIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoMCksIERvd25zYW1wbGluZy5nZXRPcmlnaW5hbEluZGV4ZXMoMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE51bWJlck9mU2tpcHBlZEVudHJpZXNBZnRlckluZGV4KCkKKyAgICB7CisgICAgICAgIGludCBpbmRleEludGVydmFsID0gMTI4OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJBU0VfU0FNUExJTkdfTEVWRUw7IGkrKykKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpbmRleEludGVydmFsLCBEb3duc2FtcGxpbmcuZ2V0RWZmZWN0aXZlSW5kZXhJbnRlcnZhbEFmdGVySW5kZXgoaSwgQkFTRV9TQU1QTElOR19MRVZFTCwgaW5kZXhJbnRlcnZhbCkpOworCisgICAgICAgIC8vIHdpdGggb25lIHJvdW5kIG9mIGRvd25zYW1wbGluZywgb25seSB0aGUgbGFzdCBzdW1tYXJ5IGVudHJ5IGhhcyBiZWVuIHJlbW92ZWQsIHNvIG9ubHkgdGhlIGxhc3QgaW5kZXggd2lsbCBoYXZlCisgICAgICAgIC8vIGRvdWJsZSB0aGUgZ2FwIHVudGlsIHRoZSBuZXh0IHNhbXBsZQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEJBU0VfU0FNUExJTkdfTEVWRUwgLSAyOyBpKyspCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaW5kZXhJbnRlcnZhbCwgRG93bnNhbXBsaW5nLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KGksIEJBU0VfU0FNUExJTkdfTEVWRUwgLSAxLCBpbmRleEludGVydmFsKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbmRleEludGVydmFsICogMiwgRG93bnNhbXBsaW5nLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KEJBU0VfU0FNUExJTkdfTEVWRUwgLSAyLCBCQVNFX1NBTVBMSU5HX0xFVkVMIC0gMSwgaW5kZXhJbnRlcnZhbCkpOworCisgICAgICAgIC8vIGF0IHNhbXBsaW5nTGV2ZWw9MiwgdGhlIHJldGFpbmVkIHN1bW1hcnkgcG9pbnRzIGFyZSBbMCwgNjRdIChhc3N1bWVzIEJBU0VfU0FNUExJTkdfTEVWRUwgaXMgMTI4KQorICAgICAgICBhc3NlcnRFcXVhbHMoMTI4LCBCQVNFX1NBTVBMSU5HX0xFVkVMKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDY0ICogaW5kZXhJbnRlcnZhbCwgRG93bnNhbXBsaW5nLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KDAsIDIsIGluZGV4SW50ZXJ2YWwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDY0ICogaW5kZXhJbnRlcnZhbCwgRG93bnNhbXBsaW5nLmdldEVmZmVjdGl2ZUluZGV4SW50ZXJ2YWxBZnRlckluZGV4KDEsIDIsIGluZGV4SW50ZXJ2YWwpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9rZXljYWNoZS9LZXlDYWNoZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL2tleWNhY2hlL0tleUNhY2hlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZjcwYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9rZXljYWNoZS9LZXlDYWNoZVRlc3QuamF2YQpAQCAtMCwwICsxLDQ5NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5rZXljYWNoZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY2FjaGUuQXV0b1NhdmluZ0NhY2hlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNhY2hlLklDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jYWNoZS5LZXlDYWNoZUtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLk11dGF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlJvd1VwZGF0ZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLk9wZXJhdGlvblR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubGlmZWN5Y2xlLkxpZmVjeWNsZVRyYW5zYWN0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkFic3RyYWN0Um93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuUm93SW5kZXhFbnRyeTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuQ2FjaGVTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWZzOworaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CitpbXBvcnQgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CitpbXBvcnQgb3JnLm1vY2tpdG8uaW50ZXJuYWwuc3R1YmJpbmcuYW5zd2Vycy5BbnN3ZXJzV2l0aERlbGF5OworaW1wb3J0IG9yZy5tb2NraXRvLmludm9jYXRpb24uSW52b2NhdGlvbk9uTW9jazsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uQXJndW1lbnRNYXRjaGVycy5hbnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8uZG9BbnN3ZXI7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ubW9jazsKKworcHVibGljIGNsYXNzIEtleUNhY2hlVGVzdAoreworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3N0YWJsZUltcGxDYWNoZXNLZXlzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFMSA9ICJLZXlDYWNoZVRlc3QxIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UyID0gIktleUNhY2hlVGVzdDIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZMSA9ICJTdGFuZGFyZDEiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZMiA9ICJTdGFuZGFyZDIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZMyA9ICJTdGFuZGFyZDMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZNCA9ICJTdGFuZGFyZDQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZNSA9ICJTdGFuZGFyZDUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZNiA9ICJTdGFuZGFyZDYiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZNyA9ICJTdGFuZGFyZDciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZOCA9ICJTdGFuZGFyZDgiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZOSA9ICJTdGFuZGFyZDkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fRkFNSUxZMTAgPSAiU3RhbmRhcmQxMCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0ZBTUlMWV9LMl8xID0gIlN0YW5kYXJkMSI7CisKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIHNzdGFibGVJbXBsQ2FjaGVzS2V5cyA9IEtleUNhY2hlU3VwcG9ydC5pc1N1cHBvcnRlZEJ5KERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CisgICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7CisgICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENPTFVNTl9GQU1JTFkyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDT0xVTU5fRkFNSUxZMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENPTFVNTl9GQU1JTFk1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDT0xVTU5fRkFNSUxZNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRTEsIENPTFVNTl9GQU1JTFk4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UxLCBDT0xVTU5fRkFNSUxZOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EKEtFWVNQQUNFMSwgQ09MVU1OX0ZBTUlMWTEwKSk7CisKKyAgICAgICAgU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlKEtFWVNQQUNFMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoS0VZU1BBQ0UyLCBDT0xVTU5fRkFNSUxZX0syXzEpKTsKKworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFudXAoKQorICAgIHsKKyAgICAgICAgU2NoZW1hTG9hZGVyLmNsZWFudXBTYXZlZENhY2hlcygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlTG9hZFNoYWxsb3dJbmRleEVudHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKDApOworICAgICAgICB0ZXN0S2V5Q2FjaGVMb2FkKENPTFVNTl9GQU1JTFkyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlDYWNoZUxvYWRJbmRleEluZm9PbkhlYXAoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q29sdW1uSW5kZXhDYWNoZVNpemUoOCk7CisgICAgICAgIHRlc3RLZXlDYWNoZUxvYWQoQ09MVU1OX0ZBTUlMWTUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkKFN0cmluZyBjZikgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgc3RvcmUgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFMSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY2YpOworCisgICAgICAgIC8vIGVtcHR5IHRoZSBjYWNoZQorICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2UuaW52YWxpZGF0ZUtleUNhY2hlKCk7CisgICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZSgwLCBLRVlTUEFDRTEsIGNmKTsKKworICAgICAgICAvLyBpbnNlcnQgZGF0YSBhbmQgZm9yY2UgdG8gZGlzaworICAgICAgICBTY2hlbWFMb2FkZXIuaW5zZXJ0RGF0YShLRVlTUEFDRTEsIGNmLCAwLCAxMDApOworICAgICAgICBVdGlsLmZsdXNoKHN0b3JlKTsKKworICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgY2FjaGUKKyAgICAgICAgcmVhZERhdGEoS0VZU1BBQ0UxLCBjZiwgMCwgMTAwKTsKKyAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDEwMCwgS0VZU1BBQ0UxLCBjZik7CisKKyAgICAgICAgLy8gcmVhbGx5PyBvdXIgY2FjaGVzIGRvbid0IGltcGxlbWVudCB0aGUgbWFwIGludGVyZmFjZT8gKGhlbmNlIG5vIC5hZGRBbGwpCisgICAgICAgIE1hcDxLZXlDYWNoZUtleSwgQWJzdHJhY3RSb3dJbmRleEVudHJ5PiBzYXZlZE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgTWFwPEtleUNhY2hlS2V5LCBSb3dJbmRleEVudHJ5LkluZGV4SW5mb1JldHJpZXZlcj4gc2F2ZWRJbmZvTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKEl0ZXJhdG9yPEtleUNhY2hlS2V5PiBpdGVyID0gQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmtleUl0ZXJhdG9yKCk7CisgICAgICAgICAgICAgaXRlci5oYXNOZXh0KCk7KQorICAgICAgICB7CisgICAgICAgICAgICBLZXlDYWNoZUtleSBrID0gaXRlci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoay5kZXNjLmtzbmFtZS5lcXVhbHMoS0VZU1BBQ0UxKSAmJiBrLmRlc2MuY2ZuYW1lLmVxdWFscyhjZikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IHJpZSA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5nZXQoayk7CisgICAgICAgICAgICAgICAgc2F2ZWRNYXAucHV0KGssIHJpZSk7CisgICAgICAgICAgICAgICAgaWYgKHJpZSBpbnN0YW5jZW9mIFJvd0luZGV4RW50cnkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCaWdUYWJsZVJlYWRlciBzc3RyID0gKEJpZ1RhYmxlUmVhZGVyKSByZWFkZXJGb3JLZXkoayk7CisgICAgICAgICAgICAgICAgICAgIHNhdmVkSW5mb01hcC5wdXQoaywgKChSb3dJbmRleEVudHJ5KSByaWUpLm9wZW5XaXRoSW5kZXgoc3N0ci5nZXRJbmRleEZpbGUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGZvcmNlIHRoZSBjYWNoZSB0byBkaXNrCisgICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5zdWJtaXRXcml0ZShJbnRlZ2VyLk1BWF9WQUxVRSkuZ2V0KCk7CisKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmludmFsaWRhdGVLZXlDYWNoZSgpOworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMCwgS0VZU1BBQ0UxLCBjZik7CisKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmxvYWRTYXZlZCgpOworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoc2F2ZWRNYXAuc2l6ZSgpLCBLRVlTUEFDRTEsIGNmKTsKKworICAgICAgICAvLyBwcm9iYWJseSBpdCdzIGJldHRlciB0byBhZGQgZXF1YWxzL2hhc2hDb2RlIHRvIFJvd0luZGV4RW50cnkuLi4KKyAgICAgICAgZm9yIChNYXAuRW50cnk8S2V5Q2FjaGVLZXksIEFic3RyYWN0Um93SW5kZXhFbnRyeT4gZW50cnkgOiBzYXZlZE1hcC5lbnRyeVNldCgpKQorICAgICAgICB7CisgICAgICAgICAgICBBYnN0cmFjdFJvd0luZGV4RW50cnkgZXhwZWN0ZWQgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgQWJzdHJhY3RSb3dJbmRleEVudHJ5IGFjdHVhbCA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5nZXQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnBvc2l0aW9uLCBhY3R1YWwucG9zaXRpb24pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmJsb2NrQ291bnQoKSwgYWN0dWFsLmJsb2NrQ291bnQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0U1NUYWJsZUZvcm1hdCgpLCBhY3R1YWwuZ2V0U1NUYWJsZUZvcm1hdCgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQuYmxvY2tDb3VudCgpOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciBhY3R1YWxTc3RyID0gcmVhZGVyRm9yS2V5KGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoYWN0dWFsU3N0ci5kZXNjcmlwdG9yLnZlcnNpb24uZm9ybWF0KS5pc0VxdWFsVG8oZXhwZWN0ZWQuZ2V0U1NUYWJsZUZvcm1hdCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoYWN0dWFsIGluc3RhbmNlb2YgUm93SW5kZXhFbnRyeSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeSAoUm93SW5kZXhFbnRyeS5JbmRleEluZm9SZXRyaWV2ZXIgYWN0dWFsSWlyID0gKChSb3dJbmRleEVudHJ5KSBhY3R1YWwpLm9wZW5XaXRoSW5kZXgoKChCaWdUYWJsZVJlYWRlcikgYWN0dWFsU3N0cikuZ2V0SW5kZXhGaWxlKCkpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBSb3dJbmRleEVudHJ5LkluZGV4SW5mb1JldHJpZXZlciBleHBlY3RlZElpciA9IHNhdmVkSW5mb01hcC5nZXQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkSWlyLmNvbHVtbnNJbmRleChpKSwgYWN0dWFsSWlyLmNvbHVtbnNJbmRleChpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXhwZWN0ZWQuaXNJbmRleGVkKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmRlbGV0aW9uVGltZSgpLCBhY3R1YWwuZGVsZXRpb25UaW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2F2ZWRJbmZvTWFwLnZhbHVlcygpLmZvckVhY2goaWlyIC0+IHsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpaXIgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgaWlyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU1NUYWJsZVJlYWRlciByZWFkZXJGb3JLZXkoS2V5Q2FjaGVLZXkgaykKKyAgICB7CisgICAgICAgIHJldHVybiBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cyhrLmRlc2Mua3NuYW1lLCBrLmRlc2MuY2ZuYW1lKS5nZXRMaXZlU1NUYWJsZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihzc3RyZWFkZXIgLT4gc3N0cmVhZGVyLmRlc2NyaXB0b3IuaWQgPT0gay5kZXNjLmlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZEZpcnN0KCkuZ2V0KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZVNoYWxsb3dJbmRleEVudHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKDApOworICAgICAgICB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZShDT0xVTU5fRkFNSUxZMyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZUluZGV4SW5mb09uSGVhcCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleENhY2hlU2l6ZSg4KTsKKyAgICAgICAgdGVzdEtleUNhY2hlTG9hZFdpdGhMb3N0VGFibGUoQ09MVU1OX0ZBTUlMWTYpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0S2V5Q2FjaGVMb2FkV2l0aExvc3RUYWJsZShTdHJpbmcgY2YpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworCisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRTEpLmdldENvbHVtbkZhbWlseVN0b3JlKGNmKTsKKworICAgICAgICAvLyBlbXB0eSB0aGUgY2FjaGUKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmludmFsaWRhdGVLZXlDYWNoZSgpOworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMCwgS0VZU1BBQ0UxLCBjZik7CisKKyAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIGZvcmNlIHRvIGRpc2sKKyAgICAgICAgU2NoZW1hTG9hZGVyLmluc2VydERhdGEoS0VZU1BBQ0UxLCBjZiwgMCwgMTAwKTsKKyAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7CisKKyAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBmaXJzdEZsdXNoVGFibGVzID0gSW1tdXRhYmxlTGlzdC5jb3B5T2Yoc3RvcmUuZ2V0TGl2ZVNTVGFibGVzKCkpOworCisgICAgICAgIC8vIHBvcHVsYXRlIHRoZSBjYWNoZQorICAgICAgICByZWFkRGF0YShLRVlTUEFDRTEsIGNmLCAwLCAxMDApOworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMTAwLCBLRVlTUEFDRTEsIGNmKTsKKworICAgICAgICAvLyBpbnNlcnQgc29tZSBuZXcgZGF0YSBhbmQgZm9yY2UgdG8gZGlzaworICAgICAgICBTY2hlbWFMb2FkZXIuaW5zZXJ0RGF0YShLRVlTUEFDRTEsIGNmLCAxMDAsIDUwKTsKKyAgICAgICAgVXRpbC5mbHVzaChzdG9yZSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBpdCdzIGZpbmUKKyAgICAgICAgcmVhZERhdGEoS0VZU1BBQ0UxLCBjZiwgMTAwLCA1MCk7CisgICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZSgxNTAsIEtFWVNQQUNFMSwgY2YpOworCisgICAgICAgIC8vIGZvcmNlIHRoZSBjYWNoZSB0byBkaXNrCisgICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5zdWJtaXRXcml0ZShJbnRlZ2VyLk1BWF9WQUxVRSkuZ2V0KCk7CisKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmludmFsaWRhdGVLZXlDYWNoZSgpOworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMCwgS0VZU1BBQ0UxLCBjZik7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgY29udGVudCBpcyB3cml0dGVuIGNvcnJlY3RseQorICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUubG9hZFNhdmVkKCk7CisgICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZSgxNTAsIEtFWVNQQUNFMSwgY2YpOworCisgICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5pbnZhbGlkYXRlS2V5Q2FjaGUoKTsKKyAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDAsIEtFWVNQQUNFMSwgY2YpOworCisgICAgICAgIC8vIG5vdyByZW1vdmUgdGhlIGZpcnN0IHNzdGFibGUgZnJvbSB0aGUgc3RvcmUgdG8gc2ltdWxhdGUgbG9zaW5nIHRoZSBmaWxlCisgICAgICAgIHN0b3JlLm1hcmtPYnNvbGV0ZShmaXJzdEZsdXNoVGFibGVzLCBPcGVyYXRpb25UeXBlLlVOS05PV04pOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgcmVhZGluZyBub3cgY29ycmVjdGx5IHNraXBzIG92ZXIgbG9zdCB0YWJsZSBhbmQgcmVhZHMgdGhlIHJlc3QgKENBU1NBTkRSQS0xMDIxOSkKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmxvYWRTYXZlZCgpOworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoNTAsIEtFWVNQQUNFMSwgY2YpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlU2hhbGxvd0luZGV4RW50cnkoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4Q2FjaGVTaXplKDApOworICAgICAgICB0ZXN0S2V5Q2FjaGUoQ09MVU1OX0ZBTUlMWTEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlSW5kZXhJbmZvT25IZWFwKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDb2x1bW5JbmRleENhY2hlU2l6ZSg4KTsKKyAgICAgICAgdGVzdEtleUNhY2hlKENPTFVNTl9GQU1JTFk0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEtleUNhY2hlKFN0cmluZyBjZikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworCisgICAgICAgIEtleXNwYWNlIGtleXNwYWNlID0gS2V5c3BhY2Uub3BlbihLRVlTUEFDRTEpOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZik7CisKKyAgICAgICAgLy8ganVzdCB0byBtYWtlIHN1cmUgdGhhdCBldmVyeXRoaW5nIGlzIGNsZWFuCisgICAgICAgIENhY2hlU2VydmljZS5pbnN0YW5jZS5pbnZhbGlkYXRlS2V5Q2FjaGUoKTsKKworICAgICAgICAvLyBLZXlDYWNoZSBzaG91bGQgc3RhcnQgYXQgc2l6ZSAwIGlmIHdlJ3JlIGNhY2hpbmcgWCUgb2YgemVybyBkYXRhLgorICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMCwgS0VZU1BBQ0UxLCBjZik7CisKKyAgICAgICAgTXV0YXRpb24gcm07CisKKyAgICAgICAgLy8gaW5zZXJ0cworICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwgImtleTEiKS5jbHVzdGVyaW5nKCIxIikuYnVpbGQoKS5hcHBseVVuc2FmZSgpOworICAgICAgICBuZXcgUm93VXBkYXRlQnVpbGRlcihjZnMubWV0YWRhdGEoKSwgMCwgImtleTIiKS5jbHVzdGVyaW5nKCIyIikuYnVpbGQoKS5hcHBseVVuc2FmZSgpOworCisgICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIFNTVGFibGUKKyAgICAgICAgVXRpbC5mbHVzaChjZnMpOworCisgICAgICAgIC8vIHJlYWRzIHRvIGNhY2hlIGtleSBwb3NpdGlvbgorICAgICAgICBVdGlsLmdldEFsbChVdGlsLmNtZChjZnMsICJrZXkxIikuYnVpbGQoKSk7CisgICAgICAgIFV0aWwuZ2V0QWxsKFV0aWwuY21kKGNmcywgImtleTIiKS5idWlsZCgpKTsKKworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUoMiwgS0VZU1BBQ0UxLCBjZik7CisKKyAgICAgICAgU2V0PFNTVGFibGVSZWFkZXI+IHJlYWRlcnMgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCk7CisgICAgICAgIFJlZnM8U1NUYWJsZVJlYWRlcj4gcmVmcyA9IFJlZnMudHJ5UmVmKHJlYWRlcnMpOworICAgICAgICBpZiAocmVmcyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworCisgICAgICAgIFV0aWwuY29tcGFjdEFsbChjZnMsIEludGVnZXIuTUFYX1ZBTFVFKS5nZXQoKTsKKyAgICAgICAgYm9vbGVhbiBub0Vhcmx5T3BlbiA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTU1RhYmxlUHJlZW1wdGl2ZU9wZW5JbnRlcnZhbEluTWlCKCkgPCAwOworCisgICAgICAgIC8vIGFmdGVyIGNvbXBhY3Rpb24gY2FjaGUgc2hvdWxkIGhhdmUgZW50cmllcyBmb3IgbmV3IFNTVGFibGVzLAorICAgICAgICAvLyBidXQgc2luY2Ugd2UgaGF2ZSBrZXB0IGEgcmVmZXJlbmNlIHRvIHRoZSBvbGQgc3N0YWJsZXMsCisgICAgICAgIC8vIGlmIHdlIGhhZCAyIGtleXMgaW4gY2FjaGUgcHJldmlvdXNseSBpdCBzaG91bGQgYmVjb21lIDQKKyAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKG5vRWFybHlPcGVuID8gMiA6IDQsIEtFWVNQQUNFMSwgY2YpOworCisgICAgICAgIHJlZnMucmVsZWFzZSgpOworCisgICAgICAgIExpZmVjeWNsZVRyYW5zYWN0aW9uLndhaXRGb3JEZWxldGlvbnMoKTsKKworICAgICAgICAvLyBhZnRlciByZWxlYXNpbmcgdGhlIHJlZmVyZW5jZSB0aGlzIHNob3VsZCBkcm9wIHRvIDIKKyAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDIsIEtFWVNQQUNFMSwgY2YpOworCisgICAgICAgIC8vIHJlLXJlYWQgc2FtZSBrZXlzIHRvIHZlcmlmeSB0aGF0IGtleSBjYWNoZSBkaWRuJ3QgZ3JvdyBmdXJ0aGVyCisgICAgICAgIFV0aWwuZ2V0QWxsKFV0aWwuY21kKGNmcywgImtleTEiKS5idWlsZCgpKTsKKyAgICAgICAgVXRpbC5nZXRBbGwoVXRpbC5jbWQoY2ZzLCAia2V5MiIpLmJ1aWxkKCkpOworCisgICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZShub0Vhcmx5T3BlbiA/IDQgOiAyLCBLRVlTUEFDRTEsIGNmKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlDYWNoZUxvYWRaZXJvQ2FjaGVMb2FkVGltZSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRDYWNoZUxvYWRUaW1lb3V0KDApOworICAgICAgICBTdHJpbmcgY2YgPSBDT0xVTU5fRkFNSUxZNzsKKworICAgICAgICBjcmVhdGVBbmRJbnZhbGlkYXRlQ2FjaGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChQYWlyLmNyZWF0ZShLRVlTUEFDRTEsIGNmKSksIDEwMCk7CisKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLmxvYWRTYXZlZCgpOworCisgICAgICAgIC8vIEhlcmUgbWF4IHRpbWUgdG8gbG9hZCBjYWNoZSBpcyB6ZXJvIHdoaWNoIG1lYW5zIG5vIHRpbWUgbGVmdCB0byBsb2FkIGNhY2hlLiBTbyB0aGUga2V5Q2FjaGUgc2l6ZSBzaG91bGQKKyAgICAgICAgLy8gYmUgemVybyBhZnRlciBsb2FkU2F2ZWQoKS4KKyAgICAgICAgYXNzZXJ0S2V5Q2FjaGVTaXplKDAsIEtFWVNQQUNFMSwgY2YpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEtleUNhY2hlTG9hZFR3b1RhYmxlc1RpbWUoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q2FjaGVMb2FkVGltZW91dCg2MCk7CisgICAgICAgIFN0cmluZyBjb2x1bW5GYW1pbHkxID0gQ09MVU1OX0ZBTUlMWTg7CisgICAgICAgIFN0cmluZyBjb2x1bW5GYW1pbHkyID0gQ09MVU1OX0ZBTUlMWV9LMl8xOworICAgICAgICBpbnQgbnVtYmVyT2ZSb3dzID0gMTAwOworICAgICAgICBMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiB0YWJsZXMgPSBuZXcgQXJyYXlMaXN0PD4oMik7CisgICAgICAgIHRhYmxlcy5hZGQoUGFpci5jcmVhdGUoS0VZU1BBQ0UxLCBjb2x1bW5GYW1pbHkxKSk7CisgICAgICAgIHRhYmxlcy5hZGQoUGFpci5jcmVhdGUoS0VZU1BBQ0UyLCBjb2x1bW5GYW1pbHkyKSk7CisKKyAgICAgICAgY3JlYXRlQW5kSW52YWxpZGF0ZUNhY2hlKHRhYmxlcywgbnVtYmVyT2ZSb3dzKTsKKworICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUubG9hZFNhdmVkKCk7CisKKyAgICAgICAgLy8gSGVyZSBtYXggdGltZSB0byBsb2FkIGNhY2hlIGlzIG5lZ2F0aXZlIHdoaWNoIG1lYW5zIG5vIHRpbWUgbGVmdCB0byBsb2FkIGNhY2hlLiBTbyB0aGUga2V5Q2FjaGUgc2l6ZSBzaG91bGQKKyAgICAgICAgLy8gYmUgemVybyBhZnRlciBsb2FkLgorICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUobnVtYmVyT2ZSb3dzLCBLRVlTUEFDRTEsIGNvbHVtbkZhbWlseTEpOworICAgICAgICBhc3NlcnRLZXlDYWNoZVNpemUobnVtYmVyT2ZSb3dzLCBLRVlTUEFDRTIsIGNvbHVtbkZhbWlseTIpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlDYWNoZUxvYWRDYWNoZUxvYWRUaW1lRXhjZWVkaW5nTGltaXQoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0Q2FjaGVMb2FkVGltZW91dCgyKTsKKyAgICAgICAgaW50IGRlbGF5TWlsbGlzID0gMTAwMDsKKyAgICAgICAgaW50IG51bWJlck9mUm93cyA9IDEwMDsKKworICAgICAgICBTdHJpbmcgY2YgPSBDT0xVTU5fRkFNSUxZOTsKKworICAgICAgICBjcmVhdGVBbmRJbnZhbGlkYXRlQ2FjaGUoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChQYWlyLmNyZWF0ZShLRVlTUEFDRTEsIGNmKSksIG51bWJlck9mUm93cyk7CisKKyAgICAgICAgLy8gVGVzdGluZyBjYWNoZSBsb2FkLiBIZXJlIHVzaW5nIGN1c3RvbSBidWlsdCBBdXRvU2F2aW5nQ2FjaGUgaW5zdGFuY2UgYXMgc2ltdWxhdGluZyBkZWxheSBpcyBub3QgcG9zc2libGUgd2l0aAorICAgICAgICAvLyAnQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlJy4gJ0F1dG9TYXZpbmdDYWNoZS5sb2FkU2F2ZWQoKScgaXMgcmV0dXJuaW5nIG5vLm9mIGVudHJpZXMgbG9hZGVkIHNvIHdlIGRvbid0IG5lZWQKKyAgICAgICAgLy8gdG8gaW5zdGFudGlhdGUgSUNhY2hlLmNsYXNzLgorICAgICAgICBDYWNoZVNlcnZpY2UuS2V5Q2FjaGVTZXJpYWxpemVyIGtleUNhY2hlU2VyaWFsaXplciA9IG5ldyBDYWNoZVNlcnZpY2UuS2V5Q2FjaGVTZXJpYWxpemVyKCk7CisgICAgICAgIENhY2hlU2VydmljZS5LZXlDYWNoZVNlcmlhbGl6ZXIga2V5Q2FjaGVTZXJpYWxpemVyU3B5ID0gTW9ja2l0by5zcHkoa2V5Q2FjaGVTZXJpYWxpemVyKTsKKyAgICAgICAgQXV0b1NhdmluZ0NhY2hlIGF1dG9TYXZpbmdDYWNoZSA9IG5ldyBBdXRvU2F2aW5nQ2FjaGUobW9jayhJQ2FjaGUuY2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVNlcnZpY2UuQ2FjaGVUeXBlLktFWV9DQUNIRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Q2FjaGVTZXJpYWxpemVyU3B5KTsKKworICAgICAgICBkb0Fuc3dlcihuZXcgQW5zd2Vyc1dpdGhEZWxheShkZWxheU1pbGxpcywgSW52b2NhdGlvbk9uTW9jazo6Y2FsbFJlYWxNZXRob2QpKS53aGVuKGtleUNhY2hlU2VyaWFsaXplclNweSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGVzZXJpYWxpemUoYW55KERhdGFJbnB1dFBsdXMuY2xhc3MpKTsKKworICAgICAgICBsb25nIG1heEV4cGVjdGVkS2V5Q2FjaGUgPSBNYXRoLm1pbihudW1iZXJPZlJvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKyBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKERhdGFiYXNlRGVzY3JpcHRvci5nZXRDYWNoZUxvYWRUaW1lb3V0KCkpIC8gZGVsYXlNaWxsaXMpOworCisgICAgICAgIGxvbmcga2V5c0xvYWRlZCA9IGF1dG9TYXZpbmdDYWNoZS5sb2FkU2F2ZWQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChrZXlzTG9hZGVkLCBNYXRjaGVycy5sZXNzVGhhbk9yRXF1YWxUbyhtYXhFeHBlY3RlZEtleUNhY2hlKSk7CisgICAgICAgIGlmIChzc3RhYmxlSW1wbENhY2hlc0tleXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydE5vdEVxdWFscygwLCBrZXlzTG9hZGVkKTsKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGtleUNhY2hlU2VyaWFsaXplclNweSwgTW9ja2l0by50aW1lcygxKSkuY2xlYW51cEFmdGVyRGVzZXJpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBrZXlzTG9hZGVkKTsKKyAgICAgICAgICAgIE1vY2tpdG8udmVyaWZ5KGtleUNhY2hlU2VyaWFsaXplclNweSwgTW9ja2l0by5uZXZlcigpKS5jbGVhbnVwQWZ0ZXJEZXNlcmlhbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuZEludmFsaWRhdGVDYWNoZShMaXN0PFBhaXI8U3RyaW5nLCBTdHJpbmc+PiB0YWJsZXMsIGludCBudW1iZXJPZlJvd3MpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKworICAgICAgICAvLyBlbXB0eSB0aGUgY2FjaGUKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmludmFsaWRhdGVLZXlDYWNoZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLnNpemUoKSk7CisKKyAgICAgICAgZm9yKFBhaXI8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogdGFibGVzKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcga2V5c3BhY2UgPSBlbnRyeS5sZWZ0KCk7CisgICAgICAgICAgICBTdHJpbmcgY2YgPSBlbnRyeS5yaWdodCgpOworICAgICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgc3RvcmUgPSBLZXlzcGFjZS5vcGVuKGtleXNwYWNlKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShjZik7CisKKyAgICAgICAgICAgIC8vIGluc2VydCBkYXRhIGFuZCBmb3JjZSB0byBkaXNrCisgICAgICAgICAgICBTY2hlbWFMb2FkZXIuaW5zZXJ0RGF0YShrZXlzcGFjZSwgY2YsIDAsIG51bWJlck9mUm93cyk7CisgICAgICAgICAgICBVdGlsLmZsdXNoKHN0b3JlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IoUGFpcjxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiB0YWJsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXlzcGFjZSA9IGVudHJ5LmxlZnQoKTsKKyAgICAgICAgICAgIFN0cmluZyBjZiA9IGVudHJ5LnJpZ2h0KCk7CisgICAgICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgY2FjaGUKKyAgICAgICAgICAgIHJlYWREYXRhKGtleXNwYWNlLCBjZiwgMCwgbnVtYmVyT2ZSb3dzKTsKKyAgICAgICAgICAgIGFzc2VydEtleUNhY2hlU2l6ZShudW1iZXJPZlJvd3MsIGtleXNwYWNlLCBjZik7CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3JjZSB0aGUgY2FjaGUgdG8gZGlzaworICAgICAgICBDYWNoZVNlcnZpY2UuaW5zdGFuY2Uua2V5Q2FjaGUuc3VibWl0V3JpdGUoQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLnNpemUoKSkuZ2V0KCk7CisKKyAgICAgICAgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmludmFsaWRhdGVLZXlDYWNoZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgQ2FjaGVTZXJ2aWNlLmluc3RhbmNlLmtleUNhY2hlLnNpemUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWFkRGF0YShTdHJpbmcga2V5c3BhY2UsIFN0cmluZyBjb2x1bW5GYW1pbHksIGludCBzdGFydFJvdywgaW50IG51bWJlck9mUm93cykKKyAgICB7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIHN0b3JlID0gS2V5c3BhY2Uub3BlbihrZXlzcGFjZSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY29sdW1uRmFtaWx5KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJPZlJvd3M7IGkrKykKKyAgICAgICAgICAgIFV0aWwuZ2V0QWxsKFV0aWwuY21kKHN0b3JlLCAia2V5IiArIChpICsgc3RhcnRSb3cpKS5pbmNsdWRlUm93KCJjb2wiICsgKGkgKyBzdGFydFJvdykpLmJ1aWxkKCkpOworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEtleUNhY2hlU2l6ZShpbnQgZXhwZWN0ZWQsIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIGNvbHVtbkZhbWlseSkKKyAgICB7CisgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgZm9yIChJdGVyYXRvcjxLZXlDYWNoZUtleT4gaXRlciA9IENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZS5rZXlJdGVyYXRvcigpOworICAgICAgICAgICAgIGl0ZXIuaGFzTmV4dCgpOykKKyAgICAgICAgeworICAgICAgICAgICAgS2V5Q2FjaGVLZXkgayA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgaWYgKGsuZGVzYy5rc25hbWUuZXF1YWxzKGtleXNwYWNlKSAmJiBrLmRlc2MuY2ZuYW1lLmVxdWFscyhjb2x1bW5GYW1pbHkpKQorICAgICAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoc3N0YWJsZUltcGxDYWNoZXNLZXlzID8gZXhwZWN0ZWQgOiAwLCBzaXplKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9tZXRhZGF0YS9NZXRhZGF0YVNlcmlhbGl6ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9tZXRhZGF0YS9NZXRhZGF0YVNlcmlhbGl6ZXJUZXN0LmphdmEKaW5kZXggOWI1ZmY2Mi4uMDU2NmViOCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvbWV0YWRhdGEvTWV0YWRhdGFTZXJpYWxpemVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL21ldGFkYXRhL01ldGFkYXRhU2VyaWFsaXplclRlc3QuamF2YQpAQCAtMTcsMjkgKzE3LDQwIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YTsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2VxdWVuY2VCYXNlZFNTVGFibGVJZDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLio7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbW1pdGxvZy5Db21taXRMb2dQb3NpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuSW50ZXJ2YWxTZXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Bc2NpaVR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZG9tUGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5Db21wb25lbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2VxdWVuY2VCYXNlZFNTVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVGb3JtYXQuQ29tcG9uZW50czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlT3V0cHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJhbmRvbUFjY2Vzc1JlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuVGFibGVNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaHJvd2FibGVzOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwpAQCAtNDgsMjEgKzU5LDI2IEBACiAKIHB1YmxpYyBjbGFzcyBNZXRhZGF0YVNlcmlhbGl6ZXJUZXN0CiB7CisgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE1ldGFkYXRhU2VyaWFsaXplclRlc3QuY2xhc3MpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQ7CisKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdEREKCkKICAgICB7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOworICAgICAgICBmb3JtYXQgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IG9yaWdpbmFsTWV0YWRhdGEgPSBjb25zdHJ1Y3RNZXRhZGF0YSgpOworICAgICAgICBNYXA8TWV0YWRhdGFUeXBlLCBNZXRhZGF0YUNvbXBvbmVudD4gb3JpZ2luYWxNZXRhZGF0YSA9IGNvbnN0cnVjdE1ldGFkYXRhKGZhbHNlKTsKIAogICAgICAgICBNZXRhZGF0YVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBNZXRhZGF0YVNlcmlhbGl6ZXIoKTsKLSAgICAgICAgRmlsZSBzdGF0c0ZpbGUgPSBzZXJpYWxpemUob3JpZ2luYWxNZXRhZGF0YSwgc2VyaWFsaXplciwgQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24pOworICAgICAgICBGaWxlIHN0YXRzRmlsZSA9IHNlcmlhbGl6ZShvcmlnaW5hbE1ldGFkYXRhLCBzZXJpYWxpemVyLCBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0U2VsZWN0ZWRTU1RhYmxlRm9ybWF0KCkuZ2V0TGF0ZXN0VmVyc2lvbigpKTsKIAotICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRGVzY3JpcHRvcihzdGF0c0ZpbGUucGFyZW50KCksICIiLCAiIiwgbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoMCksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOworICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRGVzY3JpcHRvcihzdGF0c0ZpbGUucGFyZW50KCksICIiLCAiIiwgbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoMCksIERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKSk7CiAgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGluID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4oc3RhdHNGaWxlKSkKICAgICAgICAgewogICAgICAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IGRlc2VyaWFsaXplZCA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoZGVzYywgaW4sIEVudW1TZXQuYWxsT2YoTWV0YWRhdGFUeXBlLmNsYXNzKSk7CkBAIC03Nyw3ICs5Myw3IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SGlzdG9ncmFtU3RlcmlsaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IG9yaWdpbmFsTWV0YWRhdGEgPSBjb25zdHJ1Y3RNZXRhZGF0YSgpOworICAgICAgICBNYXA8TWV0YWRhdGFUeXBlLCBNZXRhZGF0YUNvbXBvbmVudD4gb3JpZ2luYWxNZXRhZGF0YSA9IGNvbnN0cnVjdE1ldGFkYXRhKGZhbHNlKTsKIAogICAgICAgICAvLyBNb2RpZnkgdGhlIGhpc3RvZ3JhbXMgdG8gb3ZlcmZsb3c6CiAgICAgICAgIFN0YXRzTWV0YWRhdGEgb3JpZ2luYWxTdGF0cyA9IChTdGF0c01ldGFkYXRhKSBvcmlnaW5hbE1ldGFkYXRhLmdldChNZXRhZGF0YVR5cGUuU1RBVFMpOwpAQCAtODgsOCArMTA0LDggQEAKIAogICAgICAgICAvLyBTZXJpYWxpemUgdy8gb3ZlcmZsb3dlZCBoaXN0b2dyYW1zOgogICAgICAgICBNZXRhZGF0YVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBNZXRhZGF0YVNlcmlhbGl6ZXIoKTsKLSAgICAgICAgRmlsZSBzdGF0c0ZpbGUgPSBzZXJpYWxpemUob3JpZ2luYWxNZXRhZGF0YSwgc2VyaWFsaXplciwgQmlnRm9ybWF0LmxhdGVzdFZlcnNpb24pOwotICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRGVzY3JpcHRvcihzdGF0c0ZpbGUucGFyZW50KCksICIiLCAiIiwgbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoMCksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOworICAgICAgICBGaWxlIHN0YXRzRmlsZSA9IHNlcmlhbGl6ZShvcmlnaW5hbE1ldGFkYXRhLCBzZXJpYWxpemVyLCBmb3JtYXQuZ2V0TGF0ZXN0VmVyc2lvbigpKTsKKyAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3Ioc3RhdHNGaWxlLnBhcmVudCgpLCAiIiwgIiIsIG5ldyBTZXF1ZW5jZUJhc2VkU1NUYWJsZUlkKDApLCBmb3JtYXQpOwogCiAgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGluID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4oc3RhdHNGaWxlKSkKICAgICAgICAgewpAQCAtMTA1LDcgKzEyMSw3IEBACiAgICAgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICAvLyBTZXJpYWxpemUgdG8gdG1wIGZpbGUKLSAgICAgICAgRmlsZSBzdGF0c0ZpbGUgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoQ29tcG9uZW50LlNUQVRTLm5hbWUsIG51bGwpOworICAgICAgICBGaWxlIHN0YXRzRmlsZSA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZShDb21wb25lbnRzLlNUQVRTLm5hbWUsIG51bGwpOwogICAgICAgICB0cnkgKERhdGFPdXRwdXRTdHJlYW1QbHVzIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtUGx1cyhzdGF0c0ZpbGUpKQogICAgICAgICB7CiAgICAgICAgICAgICBzZXJpYWxpemVyLnNlcmlhbGl6ZShtZXRhZGF0YSwgb3V0LCB2ZXJzaW9uKTsKQEAgLTExMywzNCArMTI5LDQ0IEBACiAgICAgICAgIHJldHVybiBzdGF0c0ZpbGU7CiAgICAgfQogCi0gICAgcHVibGljIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBjb25zdHJ1Y3RNZXRhZGF0YSgpCisgICAgcHVibGljIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBjb25zdHJ1Y3RNZXRhZGF0YShib29sZWFuIHdpdGhOdWxscykKICAgICB7CiAgICAgICAgIENvbW1pdExvZ1Bvc2l0aW9uIGNsdWIgPSBuZXcgQ29tbWl0TG9nUG9zaXRpb24oMTFMLCAxMik7CiAgICAgICAgIENvbW1pdExvZ1Bvc2l0aW9uIGNsbGIgPSBuZXcgQ29tbWl0TG9nUG9zaXRpb24oOUwsIDEyKTsKIAotICAgICAgICBUYWJsZU1ldGFkYXRhIGNmbSA9IFNjaGVtYUxvYWRlci5zdGFuZGFyZENGTUQoImtzMSIsICJjZjEiKS5idWlsZCgpOworICAgICAgICBUYWJsZU1ldGFkYXRhIGNmbSA9IFRhYmxlTWV0YWRhdGEuYnVpbGRlcigia3MxIiwgImNmMSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQYXJ0aXRpb25LZXlDb2x1bW4oImsiLCBBc2NpaVR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbHVzdGVyaW5nQ29sdW1uKCJjMSIsIFVURjhUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2x1c3RlcmluZ0NvbHVtbigiYzIiLCBJbnQzMlR5cGUuaW5zdGFuY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZWd1bGFyQ29sdW1uKCJ2IiwgSW50MzJUeXBlLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKICAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IE1ldGFkYXRhQ29sbGVjdG9yKGNmbS5jb21wYXJhdG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29tbWl0TG9nSW50ZXJ2YWxzKG5ldyBJbnRlcnZhbFNldDw+KGNsbGIsIGNsdWIpKTsKIAogICAgICAgICBTdHJpbmcgcGFydGl0aW9uZXIgPSBSYW5kb21QYXJ0aXRpb25lci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCk7CiAgICAgICAgIGRvdWJsZSBiZkZwQ2hhbmNlID0gMC4xOwotICAgICAgICByZXR1cm4gY29sbGVjdG9yLmZpbmFsaXplTWV0YWRhdGEocGFydGl0aW9uZXIsIGJmRnBDaGFuY2UsIDAsIG51bGwsIGZhbHNlLCBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZtLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkpOworICAgICAgICBjb2xsZWN0b3IudXBkYXRlQ2x1c3RlcmluZ1ZhbHVlcyhDbHVzdGVyaW5nLm1ha2UoVVRGOFR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKCJhYmMiKSwgSW50MzJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgxMjMpKSk7CisgICAgICAgIGNvbGxlY3Rvci51cGRhdGVDbHVzdGVyaW5nVmFsdWVzKENsdXN0ZXJpbmcubWFrZShVVEY4VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoImNiYSIpLCB3aXRoTnVsbHMgPyBudWxsIDogSW50MzJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgyMzQpKSk7CisgICAgICAgIEJ5dGVCdWZmZXIgZmlyc3QgPSBBc2NpaVR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKCJhIik7CisgICAgICAgIEJ5dGVCdWZmZXIgbGFzdCA9IEFzY2lpVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoImIiKTsKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rvci5maW5hbGl6ZU1ldGFkYXRhKHBhcnRpdGlvbmVyLCBiZkZwQ2hhbmNlLCAwLCBudWxsLCBmYWxzZSwgU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmbSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpLCBmaXJzdCwgbGFzdCk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RWZXJzaW9ucyhTdHJpbmcuLi4gdmVyc2lvbnMpIHRocm93cyBUaHJvd2FibGUKKyAgICBwcml2YXRlIHZvaWQgdGVzdFZlcnNpb25zKExpc3Q8U3RyaW5nPiB2ZXJzaW9ucykgdGhyb3dzIFRocm93YWJsZQogICAgIHsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlRlc3RpbmcgbWlub3IgdmVyc2lvbnMge30gY29tcGF0aWJpbGl0eSBmb3Igc3N0YWJsZSBmb3JtYXQge30iLCB2ZXJzaW9ucywgZm9ybWF0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKICAgICAgICAgVGhyb3dhYmxlIHQgPSBudWxsOwotICAgICAgICBmb3IgKGludCBvbGRJZHggPSAwOyBvbGRJZHggPCB2ZXJzaW9ucy5sZW5ndGg7IG9sZElkeCsrKQorICAgICAgICBmb3IgKGludCBvbGRJZHggPSAwOyBvbGRJZHggPCB2ZXJzaW9ucy5zaXplKCk7IG9sZElkeCsrKQogICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBuZXdJZHggPSBvbGRJZHg7IG5ld0lkeCA8IHZlcnNpb25zLmxlbmd0aDsgbmV3SWR4KyspCisgICAgICAgICAgICBmb3IgKGludCBuZXdJZHggPSBvbGRJZHg7IG5ld0lkeCA8IHZlcnNpb25zLnNpemUoKTsgbmV3SWR4KyspCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0ZXN0T2xkUmVhZHNOZXcodmVyc2lvbnNbb2xkSWR4XSwgdmVyc2lvbnNbbmV3SWR4XSk7CisgICAgICAgICAgICAgICAgICAgIHRlc3RPbGRSZWFkc05ldyh2ZXJzaW9ucy5nZXQob2xkSWR4KSwgdmVyc2lvbnMuZ2V0KG5ld0lkeCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIHwgQXNzZXJ0aW9uRXJyb3IgZSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSBUaHJvd2FibGVzLm1lcmdlKHQsIG5ldyBBc3NlcnRpb25FcnJvcigiRmFpbGVkIHRvIHRlc3QgIiArIHZlcnNpb25zW29sZElkeF0gKyAiIC0+ICIgKyB2ZXJzaW9uc1tuZXdJZHhdLCBlKSk7CisgICAgICAgICAgICAgICAgICAgIHQgPSBUaHJvd2FibGVzLm1lcmdlKHQsIG5ldyBBc3NlcnRpb25FcnJvcigiRmFpbGVkIHRvIHRlc3QgIiArIHZlcnNpb25zLmdldChvbGRJZHgpICsgIiAtPiAiICsgdmVyc2lvbnMuZ2V0KG5ld0lkeCksIGUpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE1MSwyOCArMTc3LDMyIEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TVZlcnNpb25zKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5vclZlcnNpb25zQ29tcGF0aWJpbHR5KCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgdGVzdFZlcnNpb25zKCJtYSIsICJtYiIsICJtYyIsICJtZCIsICJtZSIpOwotICAgIH0KKyAgICAgICAgTWFwPENoYXJhY3RlciwgTGlzdDxTdHJpbmc+PiBzdXBwb3J0ZWRWZXJzaW9ucyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKIAotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdE5WZXJzaW9ucygpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIHRlc3RWZXJzaW9ucygibmEiLCAibmIiKTsKKyAgICAgICAgZm9yIChjaGFyIG1ham9yID0gJ2EnOyBtYWpvciA8PSAneic7IG1ham9yKyspeworICAgICAgICAgICAgZm9yIChjaGFyIG1pbm9yID0gJ2EnOyBtaW5vciA8PSAneic7IG1pbm9yKyspeworICAgICAgICAgICAgICAgIFZlcnNpb24gdmVyc2lvbiA9IGZvcm1hdC5nZXRWZXJzaW9uKFN0cmluZy5mb3JtYXQoIiVzJXMiLCBtYWpvciwgbWlub3IpKTsKKyAgICAgICAgICAgICAgICBpZiAodmVyc2lvbi5pc0NvbXBhdGlibGUoKSkKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkVmVyc2lvbnMuY29tcHV0ZUlmQWJzZW50KG1ham9yLCBpZ25vcmVkIC0+IG5ldyBBcnJheUxpc3Q8PigpKS5hZGQodmVyc2lvbi52ZXJzaW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoTGlzdDxTdHJpbmc+IG1pbm9yVmVyc2lvbnMgOiBzdXBwb3J0ZWRWZXJzaW9ucy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHRlc3RWZXJzaW9ucyhtaW5vclZlcnNpb25zKTsKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCB0ZXN0T2xkUmVhZHNOZXcoU3RyaW5nIG9sZFYsIFN0cmluZyBuZXdWKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIE1hcDxNZXRhZGF0YVR5cGUsIE1ldGFkYXRhQ29tcG9uZW50PiBvcmlnaW5hbE1ldGFkYXRhID0gY29uc3RydWN0TWV0YWRhdGEoKTsKKyAgICAgICAgTWFwPE1ldGFkYXRhVHlwZSwgTWV0YWRhdGFDb21wb25lbnQ+IG9yaWdpbmFsTWV0YWRhdGEgPSBjb25zdHJ1Y3RNZXRhZGF0YSh0cnVlKTsKIAogICAgICAgICBNZXRhZGF0YVNlcmlhbGl6ZXIgc2VyaWFsaXplciA9IG5ldyBNZXRhZGF0YVNlcmlhbGl6ZXIoKTsKICAgICAgICAgLy8gV3JpdGUgbWV0YWRhdGEgaW4gdHdvIG1pbm9yIGZvcm1hdHMuCi0gICAgICAgIEZpbGUgc3RhdHNGaWxlTGIgPSBzZXJpYWxpemUob3JpZ2luYWxNZXRhZGF0YSwgc2VyaWFsaXplciwgQmlnRm9ybWF0Lmluc3RhbmNlLmdldFZlcnNpb24obmV3VikpOwotICAgICAgICBGaWxlIHN0YXRzRmlsZUxhID0gc2VyaWFsaXplKG9yaWdpbmFsTWV0YWRhdGEsIHNlcmlhbGl6ZXIsIEJpZ0Zvcm1hdC5pbnN0YW5jZS5nZXRWZXJzaW9uKG9sZFYpKTsKKyAgICAgICAgRmlsZSBzdGF0c0ZpbGVMYiA9IHNlcmlhbGl6ZShvcmlnaW5hbE1ldGFkYXRhLCBzZXJpYWxpemVyLCBmb3JtYXQuZ2V0VmVyc2lvbihuZXdWKSk7CisgICAgICAgIEZpbGUgc3RhdHNGaWxlTGEgPSBzZXJpYWxpemUob3JpZ2luYWxNZXRhZGF0YSwgc2VyaWFsaXplciwgZm9ybWF0LmdldFZlcnNpb24ob2xkVikpOwogICAgICAgICAvLyBSZWFkaW5nIGJvdGggYXMgZWFybGllciB2ZXJzaW9uIHNob3VsZCB5aWVsZCBpZGVudGljYWwgcmVzdWx0cy4KLSAgICAgICAgU1NUYWJsZUZvcm1hdC5UeXBlIHN0eXBlID0gU1NUYWJsZUZvcm1hdC5UeXBlLmN1cnJlbnQoKTsKLSAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3Ioc3R5cGUuaW5mby5nZXRWZXJzaW9uKG9sZFYpLCBzdGF0c0ZpbGVMYi5wYXJlbnQoKSwgIiIsICIiLCBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCgwKSwgc3R5cGUpOworICAgICAgICBEZXNjcmlwdG9yIGRlc2MgPSBuZXcgRGVzY3JpcHRvcihmb3JtYXQuZ2V0VmVyc2lvbihvbGRWKSwgc3RhdHNGaWxlTGIucGFyZW50KCksICIiLCAiIiwgbmV3IFNlcXVlbmNlQmFzZWRTU1RhYmxlSWQoMCkpOwogICAgICAgICB0cnkgKFJhbmRvbUFjY2Vzc1JlYWRlciBpbkxiID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4oc3RhdHNGaWxlTGIpOwogICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciBpbkxhID0gUmFuZG9tQWNjZXNzUmVhZGVyLm9wZW4oc3RhdHNGaWxlTGEpKQogICAgICAgICB7CkBAIC0xODksMTcgKzIxOSw0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHBlbmRpbmdSZXBhaXJDb21wYXRpYmlsaXR5KCkKLSAgICB7Ci0gICAgICAgIEFycmF5cy5hc0xpc3QoIm1hIiwgIm1iIiwgIm1jIiwgIm1kIiwgIm1lIikuZm9yRWFjaCh2IC0+IGFzc2VydEZhbHNlKEJpZ0Zvcm1hdC5pbnN0YW5jZS5nZXRWZXJzaW9uKHYpLmhhc1BlbmRpbmdSZXBhaXIoKSkpOwotICAgICAgICBBcnJheXMuYXNMaXN0KCJuYSIsICJuYiIpLmZvckVhY2godiAtPiBhc3NlcnRUcnVlKEJpZ0Zvcm1hdC5pbnN0YW5jZS5nZXRWZXJzaW9uKHYpLmhhc1BlbmRpbmdSZXBhaXIoKSkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgb3JpZ2luYXRpbmdIb3N0Q29tcGF0aWJpbGl0eSgpCi0gICAgewotICAgICAgICBBcnJheXMuYXNMaXN0KCJtYSIsICJtYiIsICJtYyIsICJtZCIsICJuYSIpLmZvckVhY2godiAtPiBhc3NlcnRGYWxzZShCaWdGb3JtYXQuaW5zdGFuY2UuZ2V0VmVyc2lvbih2KS5oYXNPcmlnaW5hdGluZ0hvc3RJZCgpKSk7Ci0gICAgICAgIEFycmF5cy5hc0xpc3QoIm1lIiwgIm5iIikuZm9yRWFjaCh2IC0+IGFzc2VydFRydWUoQmlnRm9ybWF0Lmluc3RhbmNlLmdldFZlcnNpb24odikuaGFzT3JpZ2luYXRpbmdIb3N0SWQoKSkpOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9BYnN0cmFjdFRyaWVUZXN0QmFzZS5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL0Fic3RyYWN0VHJpZVRlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVhZTIwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9BYnN0cmFjdFRyaWVUZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkNoYW5uZWxQcm94eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0UGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlBhZ2VBd2FyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlJlYnVmZmVyZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGU7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCithYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RUcmllVGVzdEJhc2UKK3sKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMCkKKyAgICBwdWJsaWMgVGVzdENsYXNzIHdyaXRlckNsYXNzOworCisgICAgZW51bSBUZXN0Q2xhc3MKKyAgICB7CisgICAgICAgIFNJTVBMRShJbmNyZW1lbnRhbFRyaWVXcml0ZXJTaW1wbGU6Om5ldyksCisgICAgICAgIFBBR0VfQVdBUkUoSW5jcmVtZW50YWxUcmllV3JpdGVyUGFnZUF3YXJlOjpuZXcpLAorICAgICAgICBQQUdFX0FXQVJFX0RFRVBfT05fU1RBQ0soKHNlcmlhbGl6ZXIsIGRlc3QpIC0+IG5ldyBJbmNyZW1lbnRhbERlZXBUcmllV3JpdGVyUGFnZUF3YXJlPD4oc2VyaWFsaXplciwgZGVzdCwgMjU2KSksCisgICAgICAgIFBBR0VfQVdBUkVfREVFUF9PTl9IRUFQKChzZXJpYWxpemVyLCBkZXN0KSAtPiBuZXcgSW5jcmVtZW50YWxEZWVwVHJpZVdyaXRlclBhZ2VBd2FyZTw+KHNlcmlhbGl6ZXIsIGRlc3QsIDApKSwKKyAgICAgICAgUEFHRV9BV0FSRV9ERUVQX01JWEVEKChzZXJpYWxpemVyLCBkZXN0KSAtPiBuZXcgSW5jcmVtZW50YWxEZWVwVHJpZVdyaXRlclBhZ2VBd2FyZTw+KHNlcmlhbGl6ZXIsIGRlc3QsIDIpKTsKKworICAgICAgICBmaW5hbCBCaUZ1bmN0aW9uPFRyaWVTZXJpYWxpemVyPEludGVnZXIsIERhdGFPdXRwdXRQbHVzPiwgRGF0YU91dHB1dFBsdXMsIEluY3JlbWVudGFsVHJpZVdyaXRlcjxJbnRlZ2VyPj4gY29uc3RydWN0b3I7CisgICAgICAgIFRlc3RDbGFzcyhCaUZ1bmN0aW9uPFRyaWVTZXJpYWxpemVyPEludGVnZXIsIERhdGFPdXRwdXRQbHVzPiwgRGF0YU91dHB1dFBsdXMsIEluY3JlbWVudGFsVHJpZVdyaXRlcjxJbnRlZ2VyPj4gY29uc3RydWN0b3IpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7aW5kZXh9OiB0cmllIHdyaXRlciBjbGFzcz17MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gZGF0YSgpCisgICAgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W117IFRlc3RDbGFzcy5TSU1QTEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBUZXN0Q2xhc3MuUEFHRV9BV0FSRSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117IFRlc3RDbGFzcy5QQUdFX0FXQVJFX0RFRVBfT05fU1RBQ0sgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBUZXN0Q2xhc3MuUEFHRV9BV0FSRV9ERUVQX09OX0hFQVAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdeyBUZXN0Q2xhc3MuUEFHRV9BV0FSRV9ERUVQX01JWEVEIH0pOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRyaWVCdWlsZGVyVGVzdC5jbGFzcyk7CisgICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgQkFTRSA9IDgwOworCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gZHVtcCA9IGZhbHNlOworICAgIHByb3RlY3RlZCBpbnQgcGF5bG9hZFNpemUgPSAwOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKQorICAgIHsKKyAgICAgICAgZHVtcCA9IGZhbHNlOworICAgICAgICBwYXlsb2FkU2l6ZSA9IDA7CisgICAgfQorCisgICAgSW5jcmVtZW50YWxUcmllV3JpdGVyPEludGVnZXI+IG5ld1RyaWVXcml0ZXIoVHJpZVNlcmlhbGl6ZXI8SW50ZWdlciwgRGF0YU91dHB1dFBsdXM+IHNlcmlhbGl6ZXIsIERhdGFPdXRwdXRQbHVzIG91dCkKKyAgICB7CisgICAgICAgIHJldHVybiB3cml0ZXJDbGFzcy5jb25zdHJ1Y3Rvci5hcHBseShzZXJpYWxpemVyLCBvdXQpOworICAgIH0KKworICAgIHByb3RlY3RlZCBmaW5hbCBUcmllU2VyaWFsaXplcjxJbnRlZ2VyLCBEYXRhT3V0cHV0UGx1cz4gc2VyaWFsaXplciA9IG5ldyBUcmllU2VyaWFsaXplcjxJbnRlZ2VyLCBEYXRhT3V0cHV0UGx1cz4oKQorICAgIHsKKyAgICAgICAgcHVibGljIGludCBzaXplb2ZOb2RlKFNlcmlhbGl6YXRpb25Ob2RlPEludGVnZXI+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gVHJpZU5vZGUudHlwZUZvcihub2RlLCBub2RlUG9zaXRpb24pLnNpemVvZk5vZGUobm9kZSkgKyBwYXlsb2FkU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKERhdGFPdXRwdXRQbHVzIGRhdGFPdXRwdXQsIFNlcmlhbGl6YXRpb25Ob2RlPEludGVnZXI+IG5vZGUsIGxvbmcgbm9kZVBvc2l0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGR1bXApCisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIldyaXRpbmcgYXQge30gdHlwZSB7fSBzaXplIHt9OiB7fSIsIExvbmcudG9IZXhTdHJpbmcobm9kZVBvc2l0aW9uKSwgVHJpZU5vZGUudHlwZUZvcihub2RlLCBub2RlUG9zaXRpb24pLCBUcmllTm9kZS50eXBlRm9yKG5vZGUsIG5vZGVQb3NpdGlvbikuc2l6ZW9mTm9kZShub2RlKSwgbm9kZSk7CisgICAgICAgICAgICAvLyBPdXIgcGF5bG9hZCB2YWx1ZSBpcyBhbiBpbnRlZ2VyIG9mIGZvdXIgYml0cy4KKyAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgcGF5bG9hZCBiaXRzIGluIHRoZSB0cmllIG5vZGUgaGVhZGVyIHRvIGZ1bGx5IHN0b3JlIGl0LgorICAgICAgICAgICAgVHJpZU5vZGUudHlwZUZvcihub2RlLCBub2RlUG9zaXRpb24pLnNlcmlhbGl6ZShkYXRhT3V0cHV0LCBub2RlLCBub2RlLnBheWxvYWQoKSAhPSBudWxsID8gbm9kZS5wYXlsb2FkKCkgOiAwLCBub2RlUG9zaXRpb24pOworICAgICAgICAgICAgLy8gYW5kIHdlIGFsc28gYWRkIHNvbWUgcGFkZGluZyBpZiBhIHRlc3QgbmVlZHMgaXQKKyAgICAgICAgICAgIGRhdGFPdXRwdXQud3JpdGUobmV3IGJ5dGVbcGF5bG9hZFNpemVdKTsKKyAgICAgICAgfQorICAgIH07CisKKworICAgIHByb3RlY3RlZCBpbnQgdmFsdWVGb3IobG9uZyBmb3VuZCkKKyAgICB7CisgICAgICAgIHJldHVybiBMb25nLmJpdENvdW50KGZvdW5kICsgMSkgJiAweEY7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJ5dGVDb21wYXJhYmxlIHNvdXJjZShTdHJpbmcgcykKKyAgICB7CisgICAgICAgIGlmIChzID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHMubGVuZ3RoKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7ICsraSkKKyAgICAgICAgICAgIGJ1Zi5wdXQoKGJ5dGUpIHMuY2hhckF0KGkpKTsKKyAgICAgICAgYnVmLnJld2luZCgpOworICAgICAgICByZXR1cm4gQnl0ZUNvbXBhcmFibGUuZml4ZWRMZW5ndGgoYnVmKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRvQmFzZShsb25nIHYpCisgICAgeworICAgICAgICByZXR1cm4gQmlnSW50ZWdlci52YWx1ZU9mKHYpLnRvU3RyaW5nKEJBU0UpOworICAgIH0KKworICAgIC8vIEluLW1lbW9yeSBidWZmZXIgd2l0aCBhZGRlZCBwYWdpbmcgcGFyYW1ldGVycywgdG8gbWFrZSBzdXJlIHRoZSBjb2RlIGJlbG93IGRvZXMgdGhlIHByb3BlciBsYXlvdXQKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIERhdGFPdXRwdXRCdWZmZXJQYWdlZCBleHRlbmRzIERhdGFPdXRwdXRCdWZmZXIKKyAgICB7CisgICAgICAgIHB1YmxpYyBpbnQgbWF4Qnl0ZXNJblBhZ2UoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gUGFnZUF3YXJlLlBBR0VfU0laRTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHBhZFRvUGFnZUJvdW5kYXJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIFBhZ2VBd2FyZS5wYWQodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGJ5dGVzTGVmdEluUGFnZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBwb3NpdGlvbigpOworICAgICAgICAgICAgbG9uZyBieXRlc0xlZnQgPSBQYWdlQXdhcmUucGFnZUxpbWl0KHBvc2l0aW9uKSAtIHBvc2l0aW9uOworICAgICAgICAgICAgcmV0dXJuIChpbnQpIGJ5dGVzTGVmdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIHBhZGRlZFBvc2l0aW9uKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIFBhZ2VBd2FyZS5wYWRkZWQocG9zaXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEJ5dGVCdWZSZWJ1ZmZlcmVyIGltcGxlbWVudHMgUmVidWZmZXJlciwgUmVidWZmZXJlci5CdWZmZXJIb2xkZXIKKyAgICB7CisgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXIgYnVmZmVyOworCisgICAgICAgIEJ5dGVCdWZSZWJ1ZmZlcmVyKEJ5dGVCdWZmZXIgYnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2hhbm5lbFByb3h5IGNoYW5uZWwoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBidWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGZpbGVMZW5ndGgoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyLnJlbWFpbmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0Q3JjQ2hlY2tDaGFuY2UoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVmZmVySG9sZGVyIHJlYnVmZmVyKGxvbmcgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIG9mZnNldCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2VSZWFkZXIoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvVHJpZUJ1aWxkZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdHJpZXMvVHJpZUJ1aWxkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4NDAzMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9UcmllQnVpbGRlclRlc3QuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SZWJ1ZmZlcmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgVHJpZUJ1aWxkZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RUcmllVGVzdEJhc2UKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWFsQnVpbGRSZWNhbGN1bGF0aW9uQnVnKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGJ1ZiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyUGFnZWQoKTsKKyAgICAgICAgSW5jcmVtZW50YWxUcmllV3JpdGVyPEludGVnZXI+IGJ1aWxkZXIgPSBuZXdUcmllV3JpdGVyKHNlcmlhbGl6ZXIsIGJ1Zik7CisgICAgICAgIGxvbmcgY291bnQgPSAwOworCisgICAgICAgIGNvdW50ICs9IGFkZFVudGlsQnl0ZXNXcml0dGVuKGJ1ZiwgYnVpbGRlciwgImEiLCAxKTsgICAgICAgICAgICAvLyBNYWtlIGEgbm9kZSB3aG9zZSBjaGlsZHJlbiBhcmUgd3JpdHRlbgorICAgICAgICBsb25nIHJlc2V0ID0gY291bnQ7CisgICAgICAgIGNvdW50ICs9IGFkZFVudGlsQnl0ZXNXcml0dGVuKGJ1ZiwgYnVpbGRlciwgImMiLCA2NCAqIDEwMjQpOyAgICAvLyBGaW5hbGl6ZSBpdCBhbmQgd3JpdGUgbG9uZyBlbm91Z2ggdG8gZ3JvdyBpdHMgcG9pbnRlciBzaXplCisKKyAgICAgICAgZHVtcCA9IHRydWU7CisgICAgICAgIEluY3JlbWVudGFsVHJpZVdyaXRlci5QYXJ0aWFsVGFpbCB0YWlsID0gYnVpbGRlci5tYWtlUGFydGlhbFJvb3QoKTsKKyAgICAgICAgLy8gVGhlIGxpbmUgYWJvdmUgaGl0IGFuIGFzc2VydGlvbiBhcyB0aGF0IG5vZGUncyBwYXJlbnQgaGFkIGEgcHJlLWNhbGN1bGF0ZWQgYnJhbmNoIHNpemUgd2hpY2ggd2FzIG5vIGxvbmdlcgorICAgICAgICAvLyBjb3JyZWN0LCBhbmQgd2UgZGlkbid0IGJvdGhlciB0byByZXNldCBpdC4KKyAgICAgICAgZHVtcCA9IGZhbHNlOworCisgICAgICAgIC8vIENoZWNrIHRoYXQgcGFydGlhbCByZXByZXNlbnRhdGlvbiBoYXMgdGhlIHJpZ2h0IGNvbnRlbnQuCisgICAgICAgIFJlYnVmZmVyZXIgc291cmNlID0gbmV3IEJ5dGVCdWZSZWJ1ZmZlcmVyKGJ1Zi5hc05ld0J1ZmZlcigpKTsKKyAgICAgICAgc291cmNlID0gbmV3IFRhaWxPdmVycmlkaW5nUmVidWZmZXJlcihzb3VyY2UsIHRhaWwuY3V0b2ZmKCksIHRhaWwudGFpbCgpKTsKKyAgICAgICAgdmVyaWZ5Q29udGVudChjb3VudCwgc291cmNlLCB0YWlsLnJvb3QoKSwgcmVzZXQpOworCisgICAgICAgIGxvbmcgcmVzZXQyID0gY291bnQ7CisKKyAgICAgICAgLy8gQWxzbyBjaGVjayB0aGUgY29tcGxldGVkIHRyaWUuCisgICAgICAgIGNvdW50ICs9IGFkZFVudGlsQnl0ZXNXcml0dGVuKGJ1ZiwgYnVpbGRlciwgImUiLCAxNiAqIDEwMjQpOworICAgICAgICBkdW1wID0gdHJ1ZTsKKyAgICAgICAgbG9uZyByb290ID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAvLyBUaGUgbGluZSBhYm92ZSBoaXQgYW5vdGhlciBzaXplIGFzc2VydGlvbiBhcyB0aGUgc2l6ZSBvZiBhIG5vZGUncyBicmFuY2ggZ3Jvd2luZyBjYXVzZWQgaXQgdG8gbmVlZCB0byBzd2l0Y2gKKyAgICAgICAgLy8gZm9ybWF0LCBidXQgd2UgZGlkbid0IGJvdGhlciB0byByZWNhbGN1bGF0ZSBpdHMgc2l6ZS4KKyAgICAgICAgZHVtcCA9IGZhbHNlOworCisgICAgICAgIHNvdXJjZSA9IG5ldyBCeXRlQnVmUmVidWZmZXJlcihidWYuYXNOZXdCdWZmZXIoKSk7CisgICAgICAgIHZlcmlmeUNvbnRlbnQoY291bnQsIHNvdXJjZSwgcm9vdCwgcmVzZXQsIHJlc2V0Mik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmVyaWZ5Q29udGVudChsb25nIGNvdW50LCBSZWJ1ZmZlcmVyIHNvdXJjZSwgbG9uZyByb290LCBsb25nLi4uIHJlc2V0cykKKyAgICB7CisgICAgICAgIFZhbHVlSXRlcmF0b3I8Pz4gaXRlciA9IG5ldyBWYWx1ZUl0ZXJhdG9yPD4oc291cmNlLCByb290KTsKKyAgICAgICAgbG9uZyBmb3VuZCA9IDA7CisgICAgICAgIGxvbmcgb2ZzID0gMDsKKyAgICAgICAgaW50IHJwb3MgPSAwOworICAgICAgICBsb25nIHBvczsKKyAgICAgICAgd2hpbGUgKChwb3MgPSBpdGVyLm5leHRQYXlsb2FkZWROb2RlKCkpICE9IC0xKQorICAgICAgICB7CisgICAgICAgICAgICBpdGVyLmdvKHBvcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVGb3IoZm91bmQgLSBvZnMpLCBpdGVyLnBheWxvYWRGbGFncygpKTsKKyAgICAgICAgICAgICsrZm91bmQ7CisgICAgICAgICAgICBpZiAocnBvcyA8IHJlc2V0cy5sZW5ndGggJiYgZm91bmQgPj0gcmVzZXRzW3Jwb3NdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9mcyA9IHJlc2V0c1tycG9zXTsKKyAgICAgICAgICAgICAgICArK3Jwb3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvdW50LCBmb3VuZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGFkZFVudGlsQnl0ZXNXcml0dGVuKERhdGFPdXRwdXRCdWZmZXIgYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNyZW1lbnRhbFRyaWVXcml0ZXI8SW50ZWdlcj4gYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBob3dNYW55KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgcG9zID0gYnVmLnBvc2l0aW9uKCk7CisgICAgICAgIGxvbmcgaWR4ID0gMDsKKyAgICAgICAgd2hpbGUgKHBvcyArIGhvd01hbnkgPiBidWYucG9zaXRpb24oKSkKKyAgICAgICAgeworICAgICAgICAgICAgYnVpbGRlci5hZGQoc291cmNlKFN0cmluZy5mb3JtYXQoIiVzJThzIiwgcHJlZml4LCB0b0Jhc2UoaWR4KSkpLCB2YWx1ZUZvcihpZHgpKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJBZGRpbmcge30gOiB7fSIsIFN0cmluZy5mb3JtYXQoIiVzJThzIiwgcHJlZml4LCB0b0Jhc2UoaWR4KSksIHZhbHVlRm9yKGlkeCkpOworICAgICAgICAgICAgKytpZHg7CisgICAgICAgIH0KKyAgICAgICAgbG9nZ2VyLmluZm8oU3RyaW5nLmZvcm1hdCgiJXMlOHMiLCBwcmVmaXgsIHRvQmFzZShpZHggLSAxKSkpOworICAgICAgICByZXR1cm4gaWR4OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9UcmllTm9kZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9UcmllTm9kZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGFkMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1RyaWVOb2RlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzQ1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnRyaWVzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CitpbXBvcnQgb3JnLnF1aWNrdGhlb3JpZXMuYXBpLlBhaXI7CitpbXBvcnQgb3JnLnF1aWNrdGhlb3JpZXMuZ2VuZXJhdG9ycy5HZW5lcmF0ZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLnJlc2V0OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLndoZW47CitpbXBvcnQgc3RhdGljIG9yZy5xdWlja3RoZW9yaWVzLlF1aWNrVGhlb3J5LnF0OworaW1wb3J0IHN0YXRpYyBvcmcucXVpY2t0aGVvcmllcy5nZW5lcmF0b3JzLlNvdXJjZURTTC5sb25nczsKKworQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCitwdWJsaWMgY2xhc3MgVHJpZU5vZGVUZXN0Cit7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXJpYWxpemF0aW9uTm9kZTxJbnRlZ2VyPiBzbiA9IE1vY2tpdG8ubW9jayhTZXJpYWxpemF0aW9uTm9kZS5jbGFzcyk7CisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhT3V0cHV0QnVmZmVyIG91dCA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBhZnRlcigpCisgICAgeworICAgICAgICByZXNldChzbik7CisgICAgICAgIG91dC5jbGVhcigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVGb3IwQ2hpbGRyZW4oKQorICAgIHsKKyAgICAgICAgd2hlbihzbi5jaGlsZENvdW50KCkpLnRoZW5SZXR1cm4oMCk7CisgICAgICAgIGFzc2VydFNhbWUoVHJpZU5vZGUuVHlwZXMuUEFZTE9BRF9PTkxZLCBUcmllTm9kZS50eXBlRm9yKHNuLCAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZUZvcjFDaGlsZE5vUGF5bG9hZCgpCisgICAgeworICAgICAgICB3aGVuKHNuLmNoaWxkQ291bnQoKSkudGhlblJldHVybigxKTsKKyAgICAgICAgd2hlbihzbi5wYXlsb2FkKCkpLnRoZW5SZXR1cm4obnVsbCk7CisKKyAgICAgICAgcXQoKS5mb3JBbGwoR2VuZXJhdGUucGljayhBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIFBhaXIub2YoUmFuZ2VzLkJJVFNfNCwgVHJpZU5vZGUuVHlwZXMuU0lOR0xFX05PUEFZTE9BRF80KSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzgsIFRyaWVOb2RlLlR5cGVzLlNJTkdMRV84KSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzEyLCBUcmllTm9kZS5UeXBlcy5TSU5HTEVfTk9QQVlMT0FEXzEyKSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzE2LCBUcmllTm9kZS5UeXBlcy5TSU5HTEVfMTYpLAorICAgICAgICAgICAgICAgIFBhaXIub2YoUmFuZ2VzLkJJVFNfMjQsIFRyaWVOb2RlLlR5cGVzLkRFTlNFXzI0KSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzMyLCBUcmllTm9kZS5UeXBlcy5ERU5TRV8zMiksCisgICAgICAgICAgICAgICAgUGFpci5vZihSYW5nZXMuQklUU180MCwgVHJpZU5vZGUuVHlwZXMuREVOU0VfNDApLAorICAgICAgICAgICAgICAgIFBhaXIub2YoUmFuZ2VzLkJJVFNfR1Q0MCwgVHJpZU5vZGUuVHlwZXMuTE9OR19ERU5TRSkKKyAgICAgICAgKSkuZmxhdE1hcChwIC0+IGxvbmdzKCkuYmV0d2VlbihwLl8xLm1pbiwgcC5fMS5tYXgpLm1hcCh2IC0+IFBhaXIub2YodiwgcC5fMikpKSkuY2hlY2socCAtPiB7CisgICAgICAgICAgICB3aGVuKHNuLm1heFBvc2l0aW9uRGVsdGEoMCkpLnRoZW5SZXR1cm4oLXAuXzEpOworICAgICAgICAgICAgcmV0dXJuIHAuXzIgPT0gVHJpZU5vZGUudHlwZUZvcihzbiwgMCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVGb3IxQ2hpbGRBbmRQYXlsb2FkKCkKKyAgICB7CisgICAgICAgIHdoZW4oc24uY2hpbGRDb3VudCgpKS50aGVuUmV0dXJuKDEpOworICAgICAgICB3aGVuKHNuLnBheWxvYWQoKSkudGhlblJldHVybigxKTsKKworICAgICAgICBxdCgpLmZvckFsbChHZW5lcmF0ZS5waWNrKEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgUGFpci5vZihSYW5nZXMuQklUU180LCBUcmllTm9kZS5UeXBlcy5TSU5HTEVfOCksCisgICAgICAgICAgICAgICAgUGFpci5vZihSYW5nZXMuQklUU184LCBUcmllTm9kZS5UeXBlcy5TSU5HTEVfOCksCisgICAgICAgICAgICAgICAgUGFpci5vZihSYW5nZXMuQklUU18xMiwgVHJpZU5vZGUuVHlwZXMuU0lOR0xFXzE2KSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzE2LCBUcmllTm9kZS5UeXBlcy5TSU5HTEVfMTYpLAorICAgICAgICAgICAgICAgIFBhaXIub2YoUmFuZ2VzLkJJVFNfMjQsIFRyaWVOb2RlLlR5cGVzLkRFTlNFXzI0KSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzMyLCBUcmllTm9kZS5UeXBlcy5ERU5TRV8zMiksCisgICAgICAgICAgICAgICAgUGFpci5vZihSYW5nZXMuQklUU180MCwgVHJpZU5vZGUuVHlwZXMuREVOU0VfNDApLAorICAgICAgICAgICAgICAgIFBhaXIub2YoUmFuZ2VzLkJJVFNfR1Q0MCwgVHJpZU5vZGUuVHlwZXMuTE9OR19ERU5TRSkKKyAgICAgICAgKSkuZmxhdE1hcChwIC0+IGxvbmdzKCkuYmV0d2VlbihwLl8xLm1pbiwgcC5fMS5tYXgpLm1hcCh2IC0+IFBhaXIub2YodiwgcC5fMikpKSkuY2hlY2socCAtPiB7CisgICAgICAgICAgICB3aGVuKHNuLm1heFBvc2l0aW9uRGVsdGEoMCkpLnRoZW5SZXR1cm4oLXAuXzEpOworICAgICAgICAgICAgcmV0dXJuIHAuXzIgPT0gVHJpZU5vZGUudHlwZUZvcihzbiwgMCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVGb3JNb3JlQ2hpbGRyZW5BbmROb1BheWxvYWQoKQorICAgIHsKKyAgICAgICAgd2hlbihzbi5jaGlsZENvdW50KCkpLnRoZW5SZXR1cm4oMik7CisgICAgICAgIHdoZW4oc24ucGF5bG9hZCgpKS50aGVuUmV0dXJuKG51bGwpOworCisgICAgICAgIHF0KCkuZm9yQWxsKEdlbmVyYXRlLnBpY2soQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzQsIFRyaWVOb2RlLlR5cGVzLkRFTlNFXzEyKSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzgsIFRyaWVOb2RlLlR5cGVzLkRFTlNFXzEyKSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzEyLCBUcmllTm9kZS5UeXBlcy5ERU5TRV8xMiksCisgICAgICAgICAgICAgICAgUGFpci5vZihSYW5nZXMuQklUU18xNiwgVHJpZU5vZGUuVHlwZXMuREVOU0VfMTYpLAorICAgICAgICAgICAgICAgIFBhaXIub2YoUmFuZ2VzLkJJVFNfMjQsIFRyaWVOb2RlLlR5cGVzLkRFTlNFXzI0KSwKKyAgICAgICAgICAgICAgICBQYWlyLm9mKFJhbmdlcy5CSVRTXzMyLCBUcmllTm9kZS5UeXBlcy5ERU5TRV8zMiksCisgICAgICAgICAgICAgICAgUGFpci5vZihSYW5nZXMuQklUU180MCwgVHJpZU5vZGUuVHlwZXMuREVOU0VfNDApLAorICAgICAgICAgICAgICAgIFBhaXIub2YoUmFuZ2VzLkJJVFNfR1Q0MCwgVHJpZU5vZGUuVHlwZXMuTE9OR19ERU5TRSkKKyAgICAgICAgKSkuZmxhdE1hcChwIC0+IGxvbmdzKCkuYmV0d2VlbihwLl8xLm1pbiwgcC5fMS5tYXgpLm1hcCh2IC0+IFBhaXIub2YodiwgcC5fMikpKSkuY2hlY2socCAtPiB7CisgICAgICAgICAgICB3aGVuKHNuLm1heFBvc2l0aW9uRGVsdGEoMCkpLnRoZW5SZXR1cm4oLXAuXzEpOworICAgICAgICAgICAgcmV0dXJuIHAuXzIgPT0gVHJpZU5vZGUudHlwZUZvcihzbiwgMCk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBheWxvYWRPbmx5Tm9kZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgVHJpZU5vZGUuVHlwZXMuUEFZTE9BRF9PTkxZLnNlcmlhbGl6ZShvdXQsIG51bGwsIDEgfCA0LCAwKTsKKyAgICAgICAgb3V0LmZsdXNoKCk7CisKKyAgICAgICAgVHJpZU5vZGUgbm9kZSA9IFRyaWVOb2RlLmF0KG91dC5hc05ld0J1ZmZlcigpLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRyaWVOb2RlLlR5cGVzLlBBWUxPQURfT05MWSwgbm9kZSk7CisgICAgICAgIGFzc2VydEVxdWFscygxIHwgNCwgbm9kZS5wYXlsb2FkRmxhZ3Mob3V0LmFzTmV3QnVmZmVyKCksIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5vZGUucGF5bG9hZFBvc2l0aW9uKG91dC5hc05ld0J1ZmZlcigpLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBub2RlLnNpemVvZk5vZGUobnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGUuc2VhcmNoKG51bGwsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuTUFYX1ZBTFVFLCBub2RlLnRyYW5zaXRpb25CeXRlKG51bGwsIDAsIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgbm9kZS5sZXNzZXJUcmFuc2l0aW9uKG51bGwsIDAsIDAsIDAsIDEyMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIzLCBub2RlLmdyZWF0ZXJUcmFuc2l0aW9uKG51bGwsIDAsIDAsIDAsIDEyMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGUubGFzdFRyYW5zaXRpb24obnVsbCwgMCwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGUudHJhbnNpdGlvbihudWxsLCAwLCAwLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBub2RlLnRyYW5zaXRpb25SYW5nZShudWxsLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBub2RlLnRyYW5zaXRpb25EZWx0YShudWxsLCAwLCAwKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVTaW5nbGVOb2RlKGxvbmcgZGVsdGEpCisgICAgeworICAgICAgICB3aGVuKHNuLmNoaWxkQ291bnQoKSkudGhlblJldHVybigxKTsKKyAgICAgICAgd2hlbihzbi50cmFuc2l0aW9uKDApKS50aGVuUmV0dXJuKDEyMyk7CisgICAgICAgIHdoZW4oc24uc2VyaWFsaXplZFBvc2l0aW9uRGVsdGEoMCwgMCkpLnRoZW5SZXR1cm4oZGVsdGEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzaW5nbGVOb2RlQXNzZXJ0aW9ucyhUcmllTm9kZSBub2RlLCBpbnQgcGF5bG9hZEZsYWdzLCBpbnQgc2l6ZSwgbG9uZyBwb3MpCisgICAgeworICAgICAgICBhc3NlcnRFcXVhbHMocGF5bG9hZEZsYWdzLCBub2RlLnBheWxvYWRGbGFncyhvdXQuYXNOZXdCdWZmZXIoKSwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2l6ZSwgbm9kZS5zaXplb2ZOb2RlKG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUuc2VhcmNoKG91dC5hc05ld0J1ZmZlcigpLCAwLCAxMjMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlLnNlYXJjaChvdXQuYXNOZXdCdWZmZXIoKSwgMCwgMTIyKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMiwgbm9kZS5zZWFyY2gob3V0LmFzTmV3QnVmZmVyKCksIDAsIDEyNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIzLCBub2RlLnRyYW5zaXRpb25CeXRlKG91dC5hc05ld0J1ZmZlcigpLCAwLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLk1BWF9WQUxVRSwgbm9kZS50cmFuc2l0aW9uQnl0ZShvdXQuYXNOZXdCdWZmZXIoKSwgMCwgMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBub2RlLmxlc3NlclRyYW5zaXRpb24ob3V0LmFzTmV3QnVmZmVyKCksIDAsIDEwMCAtIHBvcywgLTIsIDEyMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjM0LCBub2RlLmdyZWF0ZXJUcmFuc2l0aW9uKG51bGwsIDAsIDAsIDAsIDIzNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjM0LCBub2RlLmdyZWF0ZXJUcmFuc2l0aW9uKG91dC5hc05ld0J1ZmZlcigpLCAwLCAxMDAgLSBwb3MsIC0yLCAyMzQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgbm9kZS5ncmVhdGVyVHJhbnNpdGlvbihvdXQuYXNOZXdCdWZmZXIoKSwgMCwgMTAwIC0gcG9zLCAtMSwgMjM0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMzQsIG5vZGUuZ3JlYXRlclRyYW5zaXRpb24ob3V0LmFzTmV3QnVmZmVyKCksIDAsIDEwMCAtIHBvcywgMCwgMjM0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAsIG5vZGUubGFzdFRyYW5zaXRpb24ob3V0LmFzTmV3QnVmZmVyKCksIDAsIDEwMCAtIHBvcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBub2RlLnRyYW5zaXRpb24ob3V0LmFzTmV3QnVmZmVyKCksIDAsIDEwMCAtIHBvcywgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZS50cmFuc2l0aW9uUmFuZ2Uob3V0LmFzTmV3QnVmZmVyKCksIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBvcywgbm9kZS50cmFuc2l0aW9uRGVsdGEob3V0LmFzTmV3QnVmZmVyKCksIDAsIDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGUxNk5vZGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHByZXBhcmVTaW5nbGVOb2RlKC00MzIxMEwpOworICAgICAgICBUcmllTm9kZS5UeXBlcy5TSU5HTEVfMTYuc2VyaWFsaXplKG91dCwgc24sIDEgfCA0LCAwKTsKKyAgICAgICAgVHJpZU5vZGUgbm9kZSA9IFRyaWVOb2RlLmF0KG91dC5hc05ld0J1ZmZlcigpLCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRyaWVOb2RlLlR5cGVzLlNJTkdMRV8xNiwgbm9kZSk7CisgICAgICAgIHNpbmdsZU5vZGVBc3NlcnRpb25zKG5vZGUsIDEgfCA0LCA0LCAtNDMyMTApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZU5vUGF5bG9hZDROb2RlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBwcmVwYXJlU2luZ2xlTm9kZSgtN0wpOworICAgICAgICBUcmllTm9kZS5UeXBlcy5TSU5HTEVfTk9QQVlMT0FEXzQuc2VyaWFsaXplKG91dCwgc24sIDAsIDApOworICAgICAgICBUcmllTm9kZSBub2RlID0gVHJpZU5vZGUuYXQob3V0LmFzTmV3QnVmZmVyKCksIDApOworICAgICAgICBhc3NlcnRFcXVhbHMoVHJpZU5vZGUuVHlwZXMuU0lOR0xFX05PUEFZTE9BRF80LCBub2RlKTsKKyAgICAgICAgc2luZ2xlTm9kZUFzc2VydGlvbnMobm9kZSwgMCwgMiwgLTcpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZU5vUGF5bG9hZDEyTm9kZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHJlcGFyZVNpbmdsZU5vZGUoLTEyMzRMKTsKKyAgICAgICAgVHJpZU5vZGUuVHlwZXMuU0lOR0xFX05PUEFZTE9BRF8xMi5zZXJpYWxpemUob3V0LCBzbiwgMCwgMCk7CisgICAgICAgIFRyaWVOb2RlIG5vZGUgPSBUcmllTm9kZS5hdChvdXQuYXNOZXdCdWZmZXIoKSwgMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhUcmllTm9kZS5UeXBlcy5TSU5HTEVfTk9QQVlMT0FEXzEyLCBub2RlKTsKKyAgICAgICAgc2luZ2xlTm9kZUFzc2VydGlvbnMobm9kZSwgMCwgMywgLTEyMzRMKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJlcGFyZVNwYXJzZU5vZGUobG9uZyBkZWx0YSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBvdXQud3JpdGUobmV3IGJ5dGVbNl0pOworICAgICAgICB3aGVuKHNuLmNoaWxkQ291bnQoKSkudGhlblJldHVybigzKTsKKyAgICAgICAgd2hlbihzbi50cmFuc2l0aW9uKDApKS50aGVuUmV0dXJuKDEwKTsKKyAgICAgICAgd2hlbihzbi50cmFuc2l0aW9uKDEpKS50aGVuUmV0dXJuKDIwKTsKKyAgICAgICAgd2hlbihzbi50cmFuc2l0aW9uKDIpKS50aGVuUmV0dXJuKDMwKTsKKyAgICAgICAgd2hlbihzbi5zZXJpYWxpemVkUG9zaXRpb25EZWx0YSgwLCA2KSkudGhlblJldHVybihkZWx0YSk7CisgICAgICAgIHdoZW4oc24uc2VyaWFsaXplZFBvc2l0aW9uRGVsdGEoMSwgNikpLnRoZW5SZXR1cm4oZGVsdGEgKyAyKTsKKyAgICAgICAgd2hlbihzbi5zZXJpYWxpemVkUG9zaXRpb25EZWx0YSgyLCA2KSkudGhlblJldHVybihkZWx0YSArIDQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzcGFyc2VPckRlbnNlTm9kZUFzc2VydGlvbnMoVHJpZU5vZGUgbm9kZSwgaW50IHBheWxvYWRGbGFncywgaW50IHNpemUsIGxvbmcgcG9zKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNpemUsIG5vZGUuc2l6ZW9mTm9kZShzbikpOworICAgICAgICBhc3NlcnRFcXVhbHMocGF5bG9hZEZsYWdzLCBub2RlLnBheWxvYWRGbGFncyhvdXQuYXNOZXdCdWZmZXIoKSwgNikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbm9kZS50cmFuc2l0aW9uUmFuZ2Uob3V0LmFzTmV3QnVmZmVyKCksIDYpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYgKyBzaXplLCBub2RlLnBheWxvYWRQb3NpdGlvbihvdXQuYXNOZXdCdWZmZXIoKSwgNikpOworCisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLk1BWF9WQUxVRSwgbm9kZS50cmFuc2l0aW9uQnl0ZShvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMykpOworCisgICAgICAgIGFzc2VydEVxdWFscygxMCwgbm9kZS5sZXNzZXJUcmFuc2l0aW9uKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxMCAtIHBvcywgMSwgMTIzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxNCwgbm9kZS5sZXNzZXJUcmFuc2l0aW9uKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxMCAtIHBvcywgLTQsIDEyMykpOworCisgICAgICAgIGFzc2VydEVxdWFscygxNCwgbm9kZS5ncmVhdGVyVHJhbnNpdGlvbihvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMTAgLSBwb3MsIDEsIDIzNCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjM0LCBub2RlLmdyZWF0ZXJUcmFuc2l0aW9uKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxMCAtIHBvcywgMiwgMjM0KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMCwgbm9kZS5ncmVhdGVyVHJhbnNpdGlvbihvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMTAgLSBwb3MsIC0xLCAyMzQpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMTQsIG5vZGUubGFzdFRyYW5zaXRpb24ob3V0LmFzTmV3QnVmZmVyKCksIDYsIDEwIC0gcG9zKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBvcywgbm9kZS50cmFuc2l0aW9uRGVsdGEob3V0LmFzTmV3QnVmZmVyKCksIDYsIDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBvcyArIDIsIG5vZGUudHJhbnNpdGlvbkRlbHRhKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwb3MgKyA0LCBub2RlLnRyYW5zaXRpb25EZWx0YShvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMikpOworCisgICAgICAgIGFzc2VydEVxdWFscygxMCwgbm9kZS50cmFuc2l0aW9uKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxMCAtIHBvcywgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIG5vZGUudHJhbnNpdGlvbihvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMTAgLSBwb3MsIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE0LCBub2RlLnRyYW5zaXRpb24ob3V0LmFzTmV3QnVmZmVyKCksIDYsIDEwIC0gcG9zLCAyKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNwYXJzZU5vZGVBc3NlcnRpb25zKFRyaWVOb2RlIG5vZGUsIGludCBwYXlsb2FkRmxhZ3MsIGludCBzaXplLCBsb25nIHBvcykKKyAgICB7CisgICAgICAgIHNwYXJzZU9yRGVuc2VOb2RlQXNzZXJ0aW9ucyhub2RlLCBwYXlsb2FkRmxhZ3MsIHNpemUsIHBvcyk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgbm9kZS5zZWFyY2gob3V0LmFzTmV3QnVmZmVyKCksIDYsIDUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUuc2VhcmNoKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTIsIG5vZGUuc2VhcmNoKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxNSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTQsIG5vZGUuc2VhcmNoKG91dC5hc05ld0J1ZmZlcigpLCA2LCAzNSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygxMCwgbm9kZS50cmFuc2l0aW9uQnl0ZShvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAsIG5vZGUudHJhbnNpdGlvbkJ5dGUob3V0LmFzTmV3QnVmZmVyKCksIDYsIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMwLCBub2RlLnRyYW5zaXRpb25CeXRlKG91dC5hc05ld0J1ZmZlcigpLCA2LCAyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3BhcnNlMTZOb2RlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBwcmVwYXJlU3BhcnNlTm9kZSgtNDMyMTBMKTsKKyAgICAgICAgVHJpZU5vZGUuVHlwZXMuU1BBUlNFXzE2LnNlcmlhbGl6ZShvdXQsIHNuLCAxIHwgNCwgNik7CisgICAgICAgIFRyaWVOb2RlIG5vZGUgPSBUcmllTm9kZS5hdChvdXQuYXNOZXdCdWZmZXIoKSwgNik7CisgICAgICAgIGFzc2VydEVxdWFscyhUcmllTm9kZS5UeXBlcy5TUEFSU0VfMTYsIG5vZGUpOworICAgICAgICBzcGFyc2VOb2RlQXNzZXJ0aW9ucyhub2RlLCAxIHwgNCwgMTEsIC00MzIxMEwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNwYXJzZTEyTm9kZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHJlcGFyZVNwYXJzZU5vZGUoLTEyMzRMKTsKKyAgICAgICAgVHJpZU5vZGUuVHlwZXMuU1BBUlNFXzEyLnNlcmlhbGl6ZShvdXQsIHNuLCAxIHwgNCwgNik7CisgICAgICAgIFRyaWVOb2RlIG5vZGUgPSBUcmllTm9kZS5hdChvdXQuYXNOZXdCdWZmZXIoKSwgNik7CisgICAgICAgIGFzc2VydEVxdWFscyhUcmllTm9kZS5UeXBlcy5TUEFSU0VfMTIsIG5vZGUpOworICAgICAgICBzcGFyc2VOb2RlQXNzZXJ0aW9ucyhub2RlLCAxIHwgNCwgMTAsIC0xMjM0TCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByZXBhcmVEZW5zZU5vZGUobG9uZyBkZWx0YSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBvdXQud3JpdGUobmV3IGJ5dGVbNl0pOworICAgICAgICB3aGVuKHNuLmNoaWxkQ291bnQoKSkudGhlblJldHVybigzKTsKKyAgICAgICAgd2hlbihzbi50cmFuc2l0aW9uKDApKS50aGVuUmV0dXJuKDExKTsKKyAgICAgICAgd2hlbihzbi50cmFuc2l0aW9uKDEpKS50aGVuUmV0dXJuKDEyKTsKKyAgICAgICAgd2hlbihzbi50cmFuc2l0aW9uKDIpKS50aGVuUmV0dXJuKDEzKTsKKyAgICAgICAgd2hlbihzbi5zZXJpYWxpemVkUG9zaXRpb25EZWx0YSgwLCA2KSkudGhlblJldHVybihkZWx0YSk7CisgICAgICAgIHdoZW4oc24uc2VyaWFsaXplZFBvc2l0aW9uRGVsdGEoMSwgNikpLnRoZW5SZXR1cm4oZGVsdGEgKyAyKTsKKyAgICAgICAgd2hlbihzbi5zZXJpYWxpemVkUG9zaXRpb25EZWx0YSgyLCA2KSkudGhlblJldHVybihkZWx0YSArIDQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZW5zZU5vZGVBc3NlcnRpb25zKFRyaWVOb2RlIG5vZGUsIGludCBwYXlsb2FkLCBpbnQgc2l6ZSwgbG9uZyBwb3MpCisgICAgeworICAgICAgICBzcGFyc2VPckRlbnNlTm9kZUFzc2VydGlvbnMobm9kZSwgcGF5bG9hZCwgc2l6ZSwgcG9zKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlLnNlYXJjaChvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMTApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vZGUuc2VhcmNoKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTQsIG5vZGUuc2VhcmNoKG91dC5hc05ld0J1ZmZlcigpLCA2LCAxNCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygxMSwgbm9kZS50cmFuc2l0aW9uQnl0ZShvdXQuYXNOZXdCdWZmZXIoKSwgNiwgMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIG5vZGUudHJhbnNpdGlvbkJ5dGUob3V0LmFzTmV3QnVmZmVyKCksIDYsIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEzLCBub2RlLnRyYW5zaXRpb25CeXRlKG91dC5hc05ld0J1ZmZlcigpLCA2LCAyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVuc2UxNk5vZGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIHByZXBhcmVEZW5zZU5vZGUoLTQzMjEwTCk7CisgICAgICAgIFRyaWVOb2RlLlR5cGVzLkRFTlNFXzE2LnNlcmlhbGl6ZShvdXQsIHNuLCAxIHwgNCwgNik7CisgICAgICAgIFRyaWVOb2RlIG5vZGUgPSBUcmllTm9kZS5hdChvdXQuYXNOZXdCdWZmZXIoKSwgNik7CisgICAgICAgIGFzc2VydEVxdWFscyhUcmllTm9kZS5UeXBlcy5ERU5TRV8xNiwgbm9kZSk7CisgICAgICAgIGRlbnNlTm9kZUFzc2VydGlvbnMobm9kZSwgMSB8IDQsIDksIC00MzIxMEwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlbnNlMTJOb2RlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBwcmVwYXJlRGVuc2VOb2RlKC0xMjM0TCk7CisgICAgICAgIFRyaWVOb2RlLlR5cGVzLkRFTlNFXzEyLnNlcmlhbGl6ZShvdXQsIHNuLCAxIHwgNCwgNik7CisgICAgICAgIFRyaWVOb2RlIG5vZGUgPSBUcmllTm9kZS5hdChvdXQuYXNOZXdCdWZmZXIoKSwgNik7CisgICAgICAgIGFzc2VydEVxdWFscyhUcmllTm9kZS5UeXBlcy5ERU5TRV8xMiwgbm9kZSk7CisgICAgICAgIGRlbnNlTm9kZUFzc2VydGlvbnMobm9kZSwgMSB8IDQsIDgsIC0xMjM0TCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ0RlbnNlTm9kZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcHJlcGFyZURlbnNlTm9kZSgtMHg3ZmZmZmZmZmZmZmZmZmZMKTsKKyAgICAgICAgVHJpZU5vZGUuVHlwZXMuTE9OR19ERU5TRS5zZXJpYWxpemUob3V0LCBzbiwgMSB8IDQsIDYpOworICAgICAgICBUcmllTm9kZSBub2RlID0gVHJpZU5vZGUuYXQob3V0LmFzTmV3QnVmZmVyKCksIDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoVHJpZU5vZGUuVHlwZXMuTE9OR19ERU5TRSwgbm9kZSk7CisgICAgICAgIGRlbnNlTm9kZUFzc2VydGlvbnMobm9kZSwgMSB8IDQsIDI3LCAtMHg3ZmZmZmZmZmZmZmZmZmZMKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGVudW0gUmFuZ2VzCisgICAgeworICAgICAgICBCSVRTXzQoMHgxTCwgMHhmTCksCisgICAgICAgIEJJVFNfOCgweDEwTCwgMHhmZkwpLAorICAgICAgICBCSVRTXzEyKDB4MTAwTCwgMHhmZmZMKSwKKyAgICAgICAgQklUU18xNigweDEwMDBMLCAweGZmZmZMKSwKKyAgICAgICAgQklUU18yNCgweDEwMDAwMEwsIDB4ZmZmZmZmTCksCisgICAgICAgIEJJVFNfMzIoMHgxMDAwMDAwMEwsIDB4ZmZmZmZmZmZMKSwKKyAgICAgICAgQklUU180MCgweDEwMDAwMDAwMDBMLCAweGZmZmZmZmZmZmZMKSwKKyAgICAgICAgQklUU19HVDQwKDB4MTAwMDAwMDAwMDAwTCwgMHg3ZmZmZmZmZmZmZmZmZmZmTCk7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1pbiwgbWF4OworCisgICAgICAgIFJhbmdlcyhsb25nIG1pbiwgbG9uZyBtYXgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMubWluID0gbWluOworICAgICAgICAgICAgdGhpcy5tYXggPSBtYXg7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3RyaWVzL1dhbGtlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9XYWxrZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkNmMyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby90cmllcy9XYWxrZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udHJpZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Mb25nU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkxvbmdUb0ludEZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uSW50U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmczLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFncm9uYS5jb2xsZWN0aW9ucy5JbnRBcnJheUxpc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuUmVidWZmZXJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlRhaWxPdmVycmlkaW5nUmVidWZmZXJlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlQ29tcGFyYWJsZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCitwdWJsaWMgY2xhc3MgV2Fsa2VyVGVzdCBleHRlbmRzIEFic3RyYWN0VHJpZVRlc3RCYXNlCit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2Fsa2VyKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGJ1ZiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyUGFnZWQoKTsKKyAgICAgICAgSW5jcmVtZW50YWxUcmllV3JpdGVyPEludGVnZXI+IGJ1aWxkZXIgPSBtYWtlVHJpZShidWYpOworICAgICAgICBsb25nIHJvb3RQb3MgPSBidWlsZGVyLmNvbXBsZXRlKCk7CisKKyAgICAgICAgUmVidWZmZXJlciBzb3VyY2UgPSBuZXcgQnl0ZUJ1ZlJlYnVmZmVyZXIoYnVmLmFzTmV3QnVmZmVyKCkpOworCisgICAgICAgIFdhbGtlcjw/PiBpdCA9IG5ldyBXYWxrZXI8Pihzb3VyY2UsIHJvb3RQb3MpOworCisgICAgICAgIERhdGFPdXRwdXRCdWZmZXIgZHVtcEJ1ZiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7CisgICAgICAgIGl0LmR1bXBUcmllKG5ldyBQcmludFN0cmVhbShkdW1wQnVmKSwgKGJ1ZjEsIHBheWxvYWRQb3MsIHBheWxvYWRGbGFncykgLT4gU3RyaW5nLmZvcm1hdCgiJWQvJWQiLCBwYXlsb2FkUG9zLCBwYXlsb2FkRmxhZ3MpKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlRyaWUgZHVtcDogXG57fSIsIG5ldyBTdHJpbmcoZHVtcEJ1Zi5nZXREYXRhKCkpKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlRyaWUgdG9TdHJpbmc6IHt9IiwgaXQpOworCisgICAgICAgIGl0LmdvTWF4KHJvb3RQb3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIsIGl0LnBheWxvYWRGbGFncygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRyaWVOb2RlLlR5cGVzLlBBWUxPQURfT05MWS5vcmRpbmFsLCBpdC5ub2RlVHlwZU9yZGluYWwoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpdC5ub2RlU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXQuaGFzQ2hpbGRyZW4oKSk7CisKKyAgICAgICAgaXQuZ29NaW4ocm9vdFBvcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpdC5wYXlsb2FkRmxhZ3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhUcmllTm9kZS5UeXBlcy5QQVlMT0FEX09OTFkub3JkaW5hbCwgaXQubm9kZVR5cGVPcmRpbmFsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaXQubm9kZVNpemUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGl0Lmhhc0NoaWxkcmVuKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgaXQuZm9sbG93KHNvdXJjZSgiMTUxIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGl0LnBheWxvYWRGbGFncygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoJzMnLCBpdC5mb2xsb3coc291cmNlKCIxMzUiKSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygnMycsIGl0LmZvbGxvd1dpdGhHcmVhdGVyKHNvdXJjZSgiMTM1IikpKTsKKyAgICAgICAgaXQuZ29NaW4oaXQuZ3JlYXRlckJyYW5jaCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBpdC5wYXlsb2FkRmxhZ3MoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCczJywgaXQuZm9sbG93V2l0aExlc3Nlcihzb3VyY2UoIjEzNSIpKSk7CisgICAgICAgIGl0LmdvTWF4KGl0Lmxlc3NlckJyYW5jaCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpdC5wYXlsb2FkRmxhZ3MoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIChPYmplY3QpIGl0LnByZWZpeChzb3VyY2UoIjE1NSIpLCAod2Fsa2VyLCBwYXlsb2FkUG9zaXRpb24sIHBheWxvYWRGbGFncykgLT4gcGF5bG9hZEZsYWdzKSk7CisgICAgICAgIGFzc2VydE51bGwoaXQucHJlZml4KHNvdXJjZSgiNTE2IiksICh3YWxrZXIsIHBheWxvYWRQb3NpdGlvbiwgcGF5bG9hZEZsYWdzKSAtPiBwYXlsb2FkRmxhZ3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIChPYmplY3QpIGl0LnByZWZpeChzb3VyY2UoIjUxNTEiKSwgKHdhbGtlciwgcGF5bG9hZFBvc2l0aW9uLCBwYXlsb2FkRmxhZ3MpIC0+IHBheWxvYWRGbGFncykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgKE9iamVjdCkgaXQucHJlZml4KHNvdXJjZSgiMTE1MSIpLCAod2Fsa2VyLCBwYXlsb2FkUG9zaXRpb24sIHBheWxvYWRGbGFncykgLT4gcGF5bG9hZEZsYWdzKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIChPYmplY3QpIGl0LnByZWZpeEFuZE5laWdoYm91cnMoc291cmNlKCIxNTUiKSwgKHdhbGtlciwgcGF5bG9hZFBvc2l0aW9uLCBwYXlsb2FkRmxhZ3MpIC0+IHBheWxvYWRGbGFncykpOworICAgICAgICBhc3NlcnROdWxsKGl0LnByZWZpeEFuZE5laWdoYm91cnMoc291cmNlKCI1MTYiKSwgKHdhbGtlciwgcGF5bG9hZFBvc2l0aW9uLCBwYXlsb2FkRmxhZ3MpIC0+IHBheWxvYWRGbGFncykpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgKE9iamVjdCkgaXQucHJlZml4QW5kTmVpZ2hib3Vycyhzb3VyY2UoIjUxNTEiKSwgKHdhbGtlciwgcGF5bG9hZFBvc2l0aW9uLCBwYXlsb2FkRmxhZ3MpIC0+IHBheWxvYWRGbGFncykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgKE9iamVjdCkgaXQucHJlZml4QW5kTmVpZ2hib3Vycyhzb3VyY2UoIjExNTEiKSwgKHdhbGtlciwgcGF5bG9hZFBvc2l0aW9uLCBwYXlsb2FkRmxhZ3MpIC0+IHBheWxvYWRGbGFncykpOworCisgICAgICAgIGFzc2VydEVxdWFscygzLCAoT2JqZWN0KSBpdC5wcmVmaXhBbmROZWlnaGJvdXJzKHNvdXJjZSgiMTU1NSIpLCAod2Fsa2VyLCBwYXlsb2FkUG9zaXRpb24sIHBheWxvYWRGbGFncykgLT4gcGF5bG9hZEZsYWdzKSk7CisgICAgICAgIGl0LmdvTWF4KGl0Lmxlc3NlckJyYW5jaCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBpdC5wYXlsb2FkRmxhZ3MoKSk7CisgICAgICAgIGl0LmdvTWluKGl0LmdyZWF0ZXJCcmFuY2gpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgaXQucGF5bG9hZEZsYWdzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yV2l0aG91dEJvdW5kcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YU91dHB1dEJ1ZmZlciBidWYgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlclBhZ2VkKCk7CisgICAgICAgIEluY3JlbWVudGFsVHJpZVdyaXRlcjxJbnRlZ2VyPiBidWlsZGVyID0gbWFrZVRyaWUoYnVmKTsKKyAgICAgICAgbG9uZyByb290UG9zID0gYnVpbGRlci5jb21wbGV0ZSgpOworCisgICAgICAgIGludFtdIGV4cGVjdGVkID0gSW50U3RyZWFtLnJhbmdlKDEsIDEzKS50b0FycmF5KCk7CisgICAgICAgIGNoZWNrSXRlcmF0ZXMoYnVmLmFzTmV3QnVmZmVyKCksIHJvb3RQb3MsIGV4cGVjdGVkKTsKKworICAgICAgICBjaGVja0l0ZXJhdGVzKGJ1Zi5hc05ld0J1ZmZlcigpLCByb290UG9zLCBudWxsLCBudWxsLCBmYWxzZSwgZXhwZWN0ZWQpOworICAgICAgICBjaGVja0l0ZXJhdGVzKGJ1Zi5hc05ld0J1ZmZlcigpLCByb290UG9zLCBudWxsLCBudWxsLCB0cnVlLCBleHBlY3RlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3JXaXRoQm91bmRzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGJ1ZiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyUGFnZWQoKTsKKyAgICAgICAgSW5jcmVtZW50YWxUcmllV3JpdGVyPEludGVnZXI+IGJ1aWxkZXIgPSBtYWtlVHJpZShidWYpOworICAgICAgICBsb25nIHJvb3RQb3MgPSBidWlsZGVyLmNvbXBsZXRlKCk7CisKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgIjE1MSIsICI1MTUiLCBmYWxzZSwgMywgNCwgNSk7CisgICAgICAgIGNoZWNrSXRlcmF0ZXMoYnVmLmFzTmV3QnVmZmVyKCksIHJvb3RQb3MsICIxNTE1MSIsICI1MTUxNSIsIGZhbHNlLCAzLCA0LCA1KTsKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgIjcwNSIsICI3MyIsIGZhbHNlLCA5LCAxMCwgMTEpOworICAgICAgICBjaGVja0l0ZXJhdGVzKGJ1Zi5hc05ld0J1ZmZlcigpLCByb290UG9zLCAiNzA1MSIsICI3MzUiLCBmYWxzZSwgMTAsIDExKTsKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgIjcwIiwgIjczNyIsIGZhbHNlLCA5LCAxMCwgMTEsIDEyKTsKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgIjcwNTQiLCAiNzM1IiwgZmFsc2UsIDEwLCAxMSk7CisKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgbnVsbCwgIjUxNSIsIGZhbHNlLCAxLCAyLCAzLCA0LCA1KTsKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgbnVsbCwgIjUxNTE1IiwgZmFsc2UsIDEsIDIsIDMsIDQsIDUpOworICAgICAgICBjaGVja0l0ZXJhdGVzKGJ1Zi5hc05ld0J1ZmZlcigpLCByb290UG9zLCAiMTUxIiwgbnVsbCwgZmFsc2UsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIpOworICAgICAgICBjaGVja0l0ZXJhdGVzKGJ1Zi5hc05ld0J1ZmZlcigpLCByb290UG9zLCAiMTUxNTEiLCBudWxsLCBmYWxzZSwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3JXaXRoQm91bmRzQW5kQWRtaXRQcmVmaXgoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFPdXRwdXRCdWZmZXIgYnVmID0gbmV3IERhdGFPdXRwdXRCdWZmZXJQYWdlZCgpOworICAgICAgICBJbmNyZW1lbnRhbFRyaWVXcml0ZXI8SW50ZWdlcj4gYnVpbGRlciA9IG1ha2VUcmllKGJ1Zik7CisgICAgICAgIGxvbmcgcm9vdFBvcyA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKworICAgICAgICBjaGVja0l0ZXJhdGVzKGJ1Zi5hc05ld0J1ZmZlcigpLCByb290UG9zLCAiMTUxIiwgIjUxNSIsIHRydWUsIDIsIDMsIDQsIDUpOworICAgICAgICBjaGVja0l0ZXJhdGVzKGJ1Zi5hc05ld0J1ZmZlcigpLCByb290UG9zLCAiMTUxNTEiLCAiNTE1MTUiLCB0cnVlLCAyLCAzLCA0LCA1KTsKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgIjcwNSIsICI3MyIsIHRydWUsIDgsIDksIDEwLCAxMSk7CisgICAgICAgIGNoZWNrSXRlcmF0ZXMoYnVmLmFzTmV3QnVmZmVyKCksIHJvb3RQb3MsICI3MDUxIiwgIjczNSIsIHRydWUsIDksIDEwLCAxMSk7CisgICAgICAgIGNoZWNrSXRlcmF0ZXMoYnVmLmFzTmV3QnVmZmVyKCksIHJvb3RQb3MsICI3MCIsICI3MzciLCB0cnVlLCA4LCA5LCAxMCwgMTEsIDEyKTsKKyAgICAgICAgLy8gTm90ZTogNzA1NCBoYXMgNzAgYXMgcHJlZml4LCBidXQgd2UgZG9uJ3QgaW5jbHVkZSA3MCBiZWNhdXNlIGEgY2xlYXJseSBzbWFsbGVyIG5vbi1wcmVmaXggZW50cnkgNzA1MQorICAgICAgICAvLyBleGlzdHMgYmV0d2VlbiB0aGUgYm91bmQgYW5kIHRoZSBwcmVmaXgKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgIjcwNTQiLCAiNzM1IiwgdHJ1ZSwgMTAsIDExKTsKKworCisgICAgICAgIGNoZWNrSXRlcmF0ZXMoYnVmLmFzTmV3QnVmZmVyKCksIHJvb3RQb3MsIG51bGwsICI1MTUiLCB0cnVlLCAxLCAyLCAzLCA0LCA1KTsKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgbnVsbCwgIjUxNTE1IiwgdHJ1ZSwgMSwgMiwgMywgNCwgNSk7CisgICAgICAgIGNoZWNrSXRlcmF0ZXMoYnVmLmFzTmV3QnVmZmVyKCksIHJvb3RQb3MsICIxNTEiLCBudWxsLCB0cnVlLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyKTsKKyAgICAgICAgY2hlY2tJdGVyYXRlcyhidWYuYXNOZXdCdWZmZXIoKSwgcm9vdFBvcywgIjE1MTUxIiwgbnVsbCwgdHJ1ZSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMik7CisgICAgICAgIGNoZWNrSXRlcmF0ZXMoYnVmLmFzTmV3QnVmZmVyKCksIHJvb3RQb3MsICI3MDU0IiwgbnVsbCwgdHJ1ZSwgMTAsIDExLCAxMik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSXRlcmF0ZXMoQnl0ZUJ1ZmZlciBidWZmZXIsIGxvbmcgcm9vdFBvcywgU3RyaW5nIGZyb20sIFN0cmluZyB0bywgYm9vbGVhbiBhZG1pdFByZWZpeCwgaW50Li4uIGV4cGVjdGVkKQorICAgIHsKKyAgICAgICAgUmVidWZmZXJlciBzb3VyY2UgPSBuZXcgQnl0ZUJ1ZlJlYnVmZmVyZXIoYnVmZmVyKTsKKyAgICAgICAgVmFsdWVJdGVyYXRvcjw/PiBpdCA9IG5ldyBWYWx1ZUl0ZXJhdG9yPD4oc291cmNlLCByb290UG9zLCBzb3VyY2UoZnJvbSksIHNvdXJjZSh0byksIGFkbWl0UHJlZml4KTsKKyAgICAgICAgY2hlY2tSZXR1cm5zKGZyb20gKyAiLS0+IiArIHRvLCBpdDo6bmV4dFBheWxvYWRlZE5vZGUsIHBvcyAtPiBnZXRQYXlsb2FkRmxhZ3MoYnVmZmVyLCAoaW50KSBwb3MpLCBleHBlY3RlZCk7CisKKyAgICAgICAgUmV2ZXJzZVZhbHVlSXRlcmF0b3I8Pz4gcml0ID0gbmV3IFJldmVyc2VWYWx1ZUl0ZXJhdG9yPD4oc291cmNlLCByb290UG9zLCBzb3VyY2UoZnJvbSksIHNvdXJjZSh0byksIGFkbWl0UHJlZml4KTsKKyAgICAgICAgcmV2ZXJzZShleHBlY3RlZCk7CisgICAgICAgIGNoZWNrUmV0dXJucyhmcm9tICsgIjwtLSIgKyB0bywgcml0OjpuZXh0UGF5bG9hZGVkTm9kZSwgcG9zIC0+IGdldFBheWxvYWRGbGFncyhidWZmZXIsIChpbnQpIHBvcyksIGV4cGVjdGVkKTsKKyAgICAgICAgcmV2ZXJzZShleHBlY3RlZCk7ICAvLyByZXR1cm4gYXJyYXkgaW4gaXRzIG9yaWdpbmFsIGZvcm0gaWYgcmV1c2VkCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrSXRlcmF0ZXMoQnl0ZUJ1ZmZlciBidWZmZXIsIGxvbmcgcm9vdFBvcywgaW50Li4uIGV4cGVjdGVkKQorICAgIHsKKyAgICAgICAgUmVidWZmZXJlciBzb3VyY2UgPSBuZXcgQnl0ZUJ1ZlJlYnVmZmVyZXIoYnVmZmVyKTsKKyAgICAgICAgVmFsdWVJdGVyYXRvcjw/PiBpdCA9IG5ldyBWYWx1ZUl0ZXJhdG9yPD4oc291cmNlLCByb290UG9zKTsKKyAgICAgICAgY2hlY2tSZXR1cm5zKCJGb3J3YXJkIiwgaXQ6Om5leHRQYXlsb2FkZWROb2RlLCBwb3MgLT4gZ2V0UGF5bG9hZEZsYWdzKGJ1ZmZlciwgKGludCkgcG9zKSwgZXhwZWN0ZWQpOworCisgICAgICAgIFJldmVyc2VWYWx1ZUl0ZXJhdG9yPD8+IHJpdCA9IG5ldyBSZXZlcnNlVmFsdWVJdGVyYXRvcjw+KHNvdXJjZSwgcm9vdFBvcyk7CisgICAgICAgIHJldmVyc2UoZXhwZWN0ZWQpOworICAgICAgICBjaGVja1JldHVybnMoIlJldmVyc2UiLCByaXQ6Om5leHRQYXlsb2FkZWROb2RlLCBwb3MgLT4gZ2V0UGF5bG9hZEZsYWdzKGJ1ZmZlciwgKGludCkgcG9zKSwgZXhwZWN0ZWQpOworICAgICAgICByZXZlcnNlKGV4cGVjdGVkKTsgIC8vIHJldHVybiBhcnJheSBpbiBpdHMgb3JpZ2luYWwgZm9ybSBpZiByZXVzZWQKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmV2ZXJzZShpbnRbXSBleHBlY3RlZCkKKyAgICB7CisgICAgICAgIGZpbmFsIGludCBzaXplID0gZXhwZWN0ZWQubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemUgLyAyOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0ID0gZXhwZWN0ZWRbaV07CisgICAgICAgICAgICBleHBlY3RlZFtpXSA9IGV4cGVjdGVkW3NpemUgLSAxIC0gaV07CisgICAgICAgICAgICBleHBlY3RlZFtzaXplIC0gaSAtIDFdID0gdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldFBheWxvYWRGbGFncyhCeXRlQnVmZmVyIGJ1ZmZlciwgaW50IHBvcykKKyAgICB7CisgICAgICAgIHJldHVybiBUcmllTm9kZS5hdChidWZmZXIsIHBvcykucGF5bG9hZEZsYWdzKGJ1ZmZlciwgcG9zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXR1cm5zKFN0cmluZyB0ZXN0Q2FzZSwgTG9uZ1N1cHBsaWVyIHN1cHBsaWVyLCBMb25nVG9JbnRGdW5jdGlvbiBtYXBwZXIsIGludC4uLiBleHBlY3RlZCkKKyAgICB7CisgICAgICAgIEludEFycmF5TGlzdCBsaXN0ID0gbmV3IEludEFycmF5TGlzdCgpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBwb3MgPSBzdXBwbGllci5nZXRBc0xvbmcoKTsKKyAgICAgICAgICAgIGlmIChwb3MgPT0gV2Fsa2VyLk5PTkUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBsaXN0LmFkZChtYXBwZXIuYXBwbHlBc0ludChwb3MpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRBcnJheUVxdWFscyh0ZXN0Q2FzZSArICI6ICIgKyBsaXN0ICsgIiAhPSAiICsgQXJyYXlzLnRvU3RyaW5nKGV4cGVjdGVkKSwgZXhwZWN0ZWQsIGxpc3QudG9JbnRBcnJheSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWFsVGFpbCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YU91dHB1dEJ1ZmZlciBidWYgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlclBhZ2VkKCk7CisgICAgICAgIEluY3JlbWVudGFsVHJpZVdyaXRlcjxJbnRlZ2VyPiBidWlsZGVyID0gbWFrZVRyaWUoYnVmKTsKKyAgICAgICAgSW5jcmVtZW50YWxUcmllV3JpdGVyLlBhcnRpYWxUYWlsIHB0YWlsID0gYnVpbGRlci5tYWtlUGFydGlhbFJvb3QoKTsKKyAgICAgICAgbG9uZyByb290UG9zID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICB0cnkgKFJlYnVmZmVyZXIgc291cmNlID0gbmV3IEJ5dGVCdWZSZWJ1ZmZlcmVyKGJ1Zi5hc05ld0J1ZmZlcigpKTsKKyAgICAgICAgICAgICBSZWJ1ZmZlcmVyIHBhcnRpYWxTb3VyY2UgPSBuZXcgVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyKG5ldyBCeXRlQnVmUmVidWZmZXJlcihidWYuYXNOZXdCdWZmZXIoKSksIHB0YWlsLmN1dG9mZigpLCBwdGFpbC50YWlsKCkpOworICAgICAgICAgICAgIFZhbHVlSXRlcmF0b3I8Pz4gaXQgPSBuZXcgVmFsdWVJdGVyYXRvcjw+KG5ldyBCeXRlQnVmUmVidWZmZXJlcihidWYuYXNOZXdCdWZmZXIoKSksIHJvb3RQb3MsIHNvdXJjZSgiMTUxIiksIHNvdXJjZSgiNTE1IiksIHRydWUpOworICAgICAgICAgICAgIFZhbHVlSXRlcmF0b3I8Pz4gdGFpbEl0ID0gbmV3IFZhbHVlSXRlcmF0b3I8PihuZXcgVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyKG5ldyBCeXRlQnVmUmVidWZmZXJlcihidWYuYXNOZXdCdWZmZXIoKSksIHB0YWlsLmN1dG9mZigpLCBwdGFpbC50YWlsKCkpLCBwdGFpbC5yb290KCksIHNvdXJjZSgiMTUxIiksIHNvdXJjZSgiNTE1IiksIHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGkxID0gaXQubmV4dFBheWxvYWRlZE5vZGUoKTsKKyAgICAgICAgICAgICAgICBsb25nIGkyID0gdGFpbEl0Lm5leHRQYXlsb2FkZWROb2RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGkxID09IC0xIHx8IGkyID09IC0xKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIFJlYnVmZmVyZXIuQnVmZmVySG9sZGVyIGJoMSA9IHNvdXJjZS5yZWJ1ZmZlcihpMSk7CisgICAgICAgICAgICAgICAgUmVidWZmZXJlci5CdWZmZXJIb2xkZXIgYmgyID0gcGFydGlhbFNvdXJjZS5yZWJ1ZmZlcihpMik7CisKKyAgICAgICAgICAgICAgICBpbnQgZjEgPSBUcmllTm9kZS5hdChiaDEuYnVmZmVyKCksIChpbnQpIChpMSAtIGJoMS5vZmZzZXQoKSkpLnBheWxvYWRGbGFncyhiaDEuYnVmZmVyKCksIChpbnQpIChpMSAtIGJoMS5vZmZzZXQoKSkpOworICAgICAgICAgICAgICAgIGludCBmMiA9IFRyaWVOb2RlLmF0KGJoMi5idWZmZXIoKSwgKGludCkgKGkyIC0gYmgyLm9mZnNldCgpKSkucGF5bG9hZEZsYWdzKGJoMi5idWZmZXIoKSwgKGludCkgKGkyIC0gYmgyLm9mZnNldCgpKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGYxLCBmMik7CisKKyAgICAgICAgICAgICAgICBiaDIucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIGJoMS5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaWdUcmllKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGJ1ZiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyUGFnZWQoKTsKKyAgICAgICAgSW5jcmVtZW50YWxUcmllV3JpdGVyPEludGVnZXI+IGJ1aWxkZXIgPSBuZXdUcmllV3JpdGVyKHNlcmlhbGl6ZXIsIGJ1Zik7CisgICAgICAgIHBheWxvYWRTaXplID0gMDsKKyAgICAgICAgbWFrZUJpZ1RyaWUoYnVpbGRlcik7CisgICAgICAgIGJ1aWxkZXIucmVzZXQoKTsKKyAgICAgICAgcGF5bG9hZFNpemUgPSAyMDA7CisgICAgICAgIG1ha2VCaWdUcmllKGJ1aWxkZXIpOworCisgICAgICAgIGxvbmcgcm9vdFBvcyA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgUmVidWZmZXJlciBzb3VyY2UgPSBuZXcgQnl0ZUJ1ZlJlYnVmZmVyZXIoYnVmLmFzTmV3QnVmZmVyKCkpOworICAgICAgICBWYWx1ZUl0ZXJhdG9yPD8+IGl0ID0gbmV3IFZhbHVlSXRlcmF0b3I8Pihzb3VyY2UsIHJvb3RQb3MpOworCisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgICBsb25nIGkxID0gaXQubmV4dFBheWxvYWRlZE5vZGUoKTsKKyAgICAgICAgICAgIGlmIChpMSA9PSAtMSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgVHJpZU5vZGUgbm9kZSA9IFRyaWVOb2RlLmF0KGJ1Zi5hc05ld0J1ZmZlcigpLCAoaW50KSBpMSk7CisgICAgICAgICAgICBhc3NlcnROb3RFcXVhbHMoMCwgbm9kZS5wYXlsb2FkRmxhZ3MoYnVmLmFzTmV3QnVmZmVyKCksIChpbnQpIGkxKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgSW5jcmVtZW50YWxUcmllV3JpdGVyPEludGVnZXI+IG1ha2VUcmllKERhdGFPdXRwdXRCdWZmZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEluY3JlbWVudGFsVHJpZVdyaXRlcjxJbnRlZ2VyPiBidWlsZGVyID0gbmV3VHJpZVdyaXRlcihzZXJpYWxpemVyLCBvdXQpOworICAgICAgICBkdW1wID0gdHJ1ZTsKKyAgICAgICAgYnVpbGRlci5hZGQoc291cmNlKCIxMTUiKSwgMSk7CisgICAgICAgIGJ1aWxkZXIuYWRkKHNvdXJjZSgiMTUxIiksIDIpOworICAgICAgICBidWlsZGVyLmFkZChzb3VyY2UoIjE1NSIpLCAzKTsKKyAgICAgICAgYnVpbGRlci5hZGQoc291cmNlKCI1MTEiKSwgNCk7CisgICAgICAgIGJ1aWxkZXIuYWRkKHNvdXJjZSgiNTE1IiksIDUpOworICAgICAgICBidWlsZGVyLmFkZChzb3VyY2UoIjU1MSIpLCA2KTsKKyAgICAgICAgYnVpbGRlci5hZGQoc291cmNlKCI1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUiKSwgNyk7CisKKyAgICAgICAgYnVpbGRlci5hZGQoc291cmNlKCI3MCIpLCA4KTsKKyAgICAgICAgYnVpbGRlci5hZGQoc291cmNlKCI3MDUxIiksIDkpOworICAgICAgICBidWlsZGVyLmFkZChzb3VyY2UoIjcxNyIpLCAxMCk7CisgICAgICAgIGJ1aWxkZXIuYWRkKHNvdXJjZSgiNzMiKSwgMTEpOworICAgICAgICBidWlsZGVyLmFkZChzb3VyY2UoIjczNyIpLCAxMik7CisgICAgICAgIHJldHVybiBidWlsZGVyOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtYWtlQmlnVHJpZShJbmNyZW1lbnRhbFRyaWVXcml0ZXI8SW50ZWdlcj4gYnVpbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBkdW1wID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IHNoaWZ0ID0gMDsgc2hpZnQgPCA4OyBzaGlmdCsrKQorICAgICAgICAgICAgZm9yIChsb25nIGkgPSAxOyBpIDwgODA7IGkrKykKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZChsb25nU291cmNlKGksIHNoaWZ0ICogOCwgMTAwKSwgKGludCkgKGkgJSA3KSArIDEpOworICAgIH0KKworICAgIHByaXZhdGUgQnl0ZUNvbXBhcmFibGUgbG9uZ1NvdXJjZShsb25nIGwsIGludCBzaGlmdCwgaW50IHNpemUpCisgICAgeworICAgICAgICBTdHJpbmcgcyA9IFN0cmluZ1V0aWxzLmxlZnRQYWQodG9CYXNlKGwpLCA4LCAnMCcpOworICAgICAgICBzID0gU3RyaW5nVXRpbHMucmlnaHRQYWQocywgOCArIHNoaWZ0LCAnMCcpOworICAgICAgICBzID0gU3RyaW5nVXRpbHMubGVmdFBhZChzLCBzaXplLCAnMCcpOworICAgICAgICByZXR1cm4gc291cmNlKHMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvQnVmZmVyZWREYXRhT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvQnVmZmVyZWREYXRhT3V0cHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IDA0MGEwODAuLmVlOGJiMzggMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0J1ZmZlcmVkRGF0YU91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9CdWZmZXJlZERhdGFPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTIwLDE1ICsyMCwxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0OwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dDsKLWltcG9ydCBqYXZhLmlvLkRhdGFPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVURkRhdGFGb3JtYXRFeGNlcHRpb247CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5VbnNpZ25lZEJ5dGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuVW5zaWduZWRJbnRlZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuVW5zaWduZWRMb25nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQuVkludENvZGluZzsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uKjsKIGltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwpAQCAtMzcsMTQgKzM2LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy52aW50LlZJbnRDb2Rpbmc7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLlVuc2lnbmVkQnl0ZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5VbnNpZ25lZEludGVnZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5VbnNpZ25lZExvbmc7Ci0KIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllcy5wcmV2ZW50SWxsZWdhbEFjY2Vzc1dhcm5pbmdzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CkBAIC02MjgsNyArNjE5LDcgQEAKICAgICAgICAgICAgIGludCBzaXplID0gci5uZXh0SW50KDkpOwogICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXModmFsKS5hcnJheSgpOwogICAgICAgICAgICAgY2Fub25pY2FsLndyaXRlKGJ5dGVzLCAwLCBzaXplKTsKLSAgICAgICAgICAgIGRvc3Aud3JpdGVCeXRlcyh2YWwsIHNpemUpOworICAgICAgICAgICAgZG9zcC53cml0ZU1vc3RTaWduaWZpY2FudEJ5dGVzKHZhbCwgc2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgZG9zcC5mbHVzaCgpOwogICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhjYW5vbmljYWwudG9CeXRlQXJyYXkoKSwgZ2VuZXJhdGVkLnRvQnl0ZUFycmF5KCkpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvQnVmZmVyZWRSYW5kb21BY2Nlc3NGaWxlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvQnVmZmVyZWRSYW5kb21BY2Nlc3NGaWxlVGVzdC5qYXZhCmluZGV4IGJiNTRmMjUuLjlmOThmYjAgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0J1ZmZlcmVkUmFuZG9tQWNjZXNzRmlsZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9CdWZmZXJlZFJhbmRvbUFjY2Vzc0ZpbGVUZXN0LmphdmEKQEAgLTE5LDkgKzE5LDYgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKLQogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwpAQCAtMjksNiArMjYsOSBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CisKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbC5leHBlY3RFT0Y7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWwuZXhwZWN0RXhjZXB0aW9uOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTU2LDg0ICs1Niw4MiBAQAogICAgICAgICB3LnN5bmMoKTsKIAogICAgICAgICAvLyByZWFkaW5nIHNtYWxsIGFtb3VudCBvZiBkYXRhIGZyb20gZmlsZSwgdGhpcyBpcyBoYW5kbGVkIGJ5IGluaXRpYWwgYnVmZmVyCi0gICAgICAgIHRyeSAoRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHcuZ2V0UGF0aCgpKSkKKyAgICAgICAgRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHcuZ2V0RmlsZSgpKTsKKyAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKLSAgICAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKLSAgICAgICAgICAgIHsKIAotICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCByLnJlYWQoYnVmZmVyKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJ1ZmZlciwgZGF0YSkpOyAvLyB3ZSByZWFkIGV4YWN0bHkgd2hhdCB3ZSB3cm90ZQotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyLnJlYWQoKSwgLTEpOyAvLyBub3RoaW5nIG1vcmUgdG8gcmVhZCBFT0YKLSAgICAgICAgICAgICAgICBhc3NlcnQgci5ieXRlc1JlbWFpbmluZygpID09IDAgJiYgci5pc0VPRigpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgci5yZWFkKGJ1ZmZlcikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJ1ZmZlciwgZGF0YSkpOyAvLyB3ZSByZWFkIGV4YWN0bHkgd2hhdCB3ZSB3cm90ZQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHIucmVhZCgpLCAtMSk7IC8vIG5vdGhpbmcgbW9yZSB0byByZWFkIEVPRgorICAgICAgICAgICAgYXNzZXJ0IHIuYnl0ZXNSZW1haW5pbmcoKSA9PSAwICYmIHIuaXNFT0YoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdyaXRpbmcgYnVmZmVyIGJpZ2dlciB0aGFuIHBhZ2Ugc2l6ZSwgd2hpY2ggd2lsbCB0cmlnZ2VyIHJlQnVmZmVyKCkKKyAgICAgICAgYnl0ZVtdIGJpZ0RhdGEgPSBuZXcgYnl0ZVtSYW5kb21BY2Nlc3NSZWFkZXIuREVGQVVMVF9CVUZGRVJfU0laRSArIDEwXTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJpZ0RhdGEubGVuZ3RoOyBpKyspCisgICAgICAgICAgICBiaWdEYXRhW2ldID0gJ2QnOworCisgICAgICAgIGxvbmcgaW5pdGlhbFBvc2l0aW9uID0gdy5wb3NpdGlvbigpOworICAgICAgICB3LndyaXRlKGJpZ0RhdGEpOyAvLyB3cml0aW5nIGRhdGEKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHcucG9zaXRpb24oKSwgaW5pdGlhbFBvc2l0aW9uICsgYmlnRGF0YS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMody5sZW5ndGgoKSwgaW5pdGlhbFBvc2l0aW9uICsgYmlnRGF0YS5sZW5ndGgpOyAvLyBmaWxlIHNpemUgc2hvdWxkIGVxdWFscyB0byBsYXN0IHBvc2l0aW9uCisKKyAgICAgICAgdy5zeW5jKCk7CisKKyAgICAgICAgLy8gcmUtb3BlbmluZyBmaWxlIGluIHJlYWQtb25seSBtb2RlCisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgciA9IGZoLmNyZWF0ZVJlYWRlcigpKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8vIHJlYWRpbmcgd3JpdHRlbiBidWZmZXIKKyAgICAgICAgICAgIHIuc2Vlayhpbml0aWFsUG9zaXRpb24pOyAvLyBiYWNrIHRvIGluaXRpYWwgKGJlZm9yZSB3cml0ZSkgcG9zaXRpb24KKyAgICAgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtiaWdEYXRhLmxlbmd0aF07CisgICAgICAgICAgICBsb25nIHNpemVSZWFkID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYXRhW2ldID0gKGJ5dGUpIHIucmVhZCgpOworICAgICAgICAgICAgICAgIHNpemVSZWFkKys7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIHdyaXRpbmcgYnVmZmVyIGJpZ2dlciB0aGFuIHBhZ2Ugc2l6ZSwgd2hpY2ggd2lsbCB0cmlnZ2VyIHJlQnVmZmVyKCkKLSAgICAgICAgICAgIGJ5dGVbXSBiaWdEYXRhID0gbmV3IGJ5dGVbUmFuZG9tQWNjZXNzUmVhZGVyLkRFRkFVTFRfQlVGRkVSX1NJWkUgKyAxMF07CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2l6ZVJlYWQsIGRhdGEubGVuZ3RoKTsgLy8gcmVhZCBleGFjdGx5IGRhdGEubGVuZ3RoIGJ5dGVzCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoci5nZXRGaWxlUG9pbnRlcigpLCBpbml0aWFsUG9zaXRpb24gKyBkYXRhLmxlbmd0aCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoci5sZW5ndGgoKSwgaW5pdGlhbFBvc2l0aW9uICsgYmlnRGF0YS5sZW5ndGgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJpZ0RhdGEsIGRhdGEpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoci5ieXRlc1JlbWFpbmluZygpID09IDAgJiYgci5pc0VPRigpKTsgLy8gd2UgYXJlIGF0IHRoZSBvZiB0aGUgZmlsZQogCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJpZ0RhdGEubGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgYmlnRGF0YVtpXSA9ICdkJzsKKyAgICAgICAgICAgIC8vIHRlc3QgcmVhZEJ5dGVzKGludCkgbWV0aG9kCisgICAgICAgICAgICByLnNlZWsoMCk7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGZpbGVDb250ZW50ID0gQnl0ZUJ1ZmZlclV0aWwucmVhZChyLCAoaW50KSB3Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmaWxlQ29udGVudC5saW1pdCgpLCB3Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydCBCeXRlQnVmZmVyVXRpbC5zdHJpbmcoZmlsZUNvbnRlbnQpLmVxdWFscygiSGVsbG8iICsgbmV3IFN0cmluZyhiaWdEYXRhKSk7CiAKLSAgICAgICAgICAgIGxvbmcgaW5pdGlhbFBvc2l0aW9uID0gdy5wb3NpdGlvbigpOwotICAgICAgICAgICAgdy53cml0ZShiaWdEYXRhKTsgLy8gd3JpdGluZyBkYXRhCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMody5wb3NpdGlvbigpLCBpbml0aWFsUG9zaXRpb24gKyBiaWdEYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMody5sZW5ndGgoKSwgaW5pdGlhbFBvc2l0aW9uICsgYmlnRGF0YS5sZW5ndGgpOyAvLyBmaWxlIHNpemUgc2hvdWxkIGVxdWFscyB0byBsYXN0IHBvc2l0aW9uCisgICAgICAgICAgICAvLyByZWFkIHRoZSBzYW1lIGJ1ZmZlciBidXQgdXNpbmcgcmVhZEZ1bGx5KGludCkKKyAgICAgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtiaWdEYXRhLmxlbmd0aF07CisgICAgICAgICAgICByLnNlZWsoaW5pdGlhbFBvc2l0aW9uKTsKKyAgICAgICAgICAgIHIucmVhZEZ1bGx5KGRhdGEpOworICAgICAgICAgICAgYXNzZXJ0IHIuYnl0ZXNSZW1haW5pbmcoKSA9PSAwICYmIHIuaXNFT0YoKTsgLy8gd2Ugc2hvdWxkIGJlIGF0IEVPRgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJpZ0RhdGEsIGRhdGEpKTsKIAotICAgICAgICAgICAgdy5zeW5jKCk7CisgICAgICAgICAgICAvLyB0cnkgdG8gcmVhZCBwYXN0IG1hcmsgKGFsbCBtZXRob2RzIHNob3VsZCByZXR1cm4gLTEpCisgICAgICAgICAgICBkYXRhID0gbmV3IGJ5dGVbMTBdOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHIucmVhZCgpLCAtMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoci5yZWFkKGRhdGEpLCAtMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoci5yZWFkKGRhdGEsIDAsIGRhdGEubGVuZ3RoKSwgLTEpOwogCi0gICAgICAgICAgICAvLyByZS1vcGVuaW5nIGZpbGUgaW4gcmVhZC1vbmx5IG1vZGUKLSAgICAgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKLSAgICAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKKyAgICAgICAgICAgIC8vIHRlc3QgcmVhZChieXRlW10sIGludCwgaW50KQorICAgICAgICAgICAgci5zZWVrKDApOworICAgICAgICAgICAgZGF0YSA9IG5ldyBieXRlWzIwXTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxNSwgci5yZWFkKGRhdGEsIDAsIDE1KSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG5ldyBTdHJpbmcoZGF0YSkuY29udGFpbnMoIkhlbGxvZGRkZGRkZGRkZCIpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxNjsgaSA8IGRhdGEubGVuZ3RoOyBpKyspCiAgICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICAvLyByZWFkaW5nIHdyaXR0ZW4gYnVmZmVyCi0gICAgICAgICAgICAgICAgci5zZWVrKGluaXRpYWxQb3NpdGlvbik7IC8vIGJhY2sgdG8gaW5pdGlhbCAoYmVmb3JlIHdyaXRlKSBwb3NpdGlvbgotICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtiaWdEYXRhLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgbG9uZyBzaXplUmVhZCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVtpXSA9IChieXRlKSByLnJlYWQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZVJlYWQrKzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2l6ZVJlYWQsIGRhdGEubGVuZ3RoKTsgLy8gcmVhZCBleGFjdGx5IGRhdGEubGVuZ3RoIGJ5dGVzCi0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHIuZ2V0RmlsZVBvaW50ZXIoKSwgaW5pdGlhbFBvc2l0aW9uICsgZGF0YS5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyLmxlbmd0aCgpLCBpbml0aWFsUG9zaXRpb24gKyBiaWdEYXRhLmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJpZ0RhdGEsIGRhdGEpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHIuYnl0ZXNSZW1haW5pbmcoKSA9PSAwICYmIHIuaXNFT0YoKSk7IC8vIHdlIGFyZSBhdCB0aGUgb2YgdGhlIGZpbGUKLQotICAgICAgICAgICAgICAgIC8vIHRlc3QgcmVhZEJ5dGVzKGludCkgbWV0aG9kCi0gICAgICAgICAgICAgICAgci5zZWVrKDApOwotICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgZmlsZUNvbnRlbnQgPSBCeXRlQnVmZmVyVXRpbC5yZWFkKHIsIChpbnQpIHcubGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhmaWxlQ29udGVudC5saW1pdCgpLCB3Lmxlbmd0aCgpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQgQnl0ZUJ1ZmZlclV0aWwuc3RyaW5nKGZpbGVDb250ZW50KS5lcXVhbHMoIkhlbGxvIiArIG5ldyBTdHJpbmcoYmlnRGF0YSkpOwotCi0gICAgICAgICAgICAgICAgLy8gcmVhZCB0aGUgc2FtZSBidWZmZXIgYnV0IHVzaW5nIHJlYWRGdWxseShpbnQpCi0gICAgICAgICAgICAgICAgZGF0YSA9IG5ldyBieXRlW2JpZ0RhdGEubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICByLnNlZWsoaW5pdGlhbFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICByLnJlYWRGdWxseShkYXRhKTsKLSAgICAgICAgICAgICAgICBhc3NlcnQgci5ieXRlc1JlbWFpbmluZygpID09IDAgJiYgci5pc0VPRigpOyAvLyB3ZSBzaG91bGQgYmUgYXQgRU9GCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJpZ0RhdGEsIGRhdGEpKTsKLQotICAgICAgICAgICAgICAgIC8vIHRyeSB0byByZWFkIHBhc3QgbWFyayAoYWxsIG1ldGhvZHMgc2hvdWxkIHJldHVybiAtMSkKLSAgICAgICAgICAgICAgICBkYXRhID0gbmV3IGJ5dGVbMTBdOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyLnJlYWQoKSwgLTEpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhyLnJlYWQoZGF0YSksIC0xKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoci5yZWFkKGRhdGEsIDAsIGRhdGEubGVuZ3RoKSwgLTEpOwotCi0gICAgICAgICAgICAgICAgLy8gdGVzdCByZWFkKGJ5dGVbXSwgaW50LCBpbnQpCi0gICAgICAgICAgICAgICAgci5zZWVrKDApOwotICAgICAgICAgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVsyMF07Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDE1LCByLnJlYWQoZGF0YSwgMCwgMTUpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG5ldyBTdHJpbmcoZGF0YSkuY29udGFpbnMoIkhlbGxvZGRkZGRkZGRkZCIpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMTY7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGRhdGFbaV0gPT0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB3LmZpbmlzaCgpOworICAgICAgICAgICAgICAgIGFzc2VydCBkYXRhW2ldID09IDA7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHcuZmluaXNoKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE0Nyw4ICsxNDUsNyBAQAogICAgICAgICAgICAgYnl0ZVtdIGluID0gZ2VuZXJhdGVCeXRlQXJyYXkoUmFuZG9tQWNjZXNzUmVhZGVyLkRFRkFVTFRfQlVGRkVSX1NJWkUpOwogICAgICAgICAgICAgdy53cml0ZShpbik7CiAgICAgCi0gICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih3LmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHcuZ2V0RmlsZSgpKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgciA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIFJlYWQgaXQgaW50byBhIHNhbWUgc2l6ZSBhcnJheS4KQEAgLTE5MCw4ICsxODcsNyBAQAogICAgICAgICAgICAgdy5maW5pc2goKTsKICAgICAKICAgICAgICAgICAgIC8vIHdpbGwgdXNlIGNhY2hlZGxlbmd0aAotICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIodG1wRmlsZS5wYXRoKCkpOwotICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih0bXBGaWxlKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgciA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhsZXNzVGhlbkJ1ZmZlci5sZW5ndGggKyBiaWdnZXJUaGVuQnVmZmVyLmxlbmd0aCwgci5sZW5ndGgoKSk7CkBAIC0yMTQsOCArMjEwLDcgQEAKICAgICAgICAgdy53cml0ZShkYXRhKTsKICAgICAgICAgdy5zeW5jKCk7CiAKLSAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIody5nZXRQYXRoKCkpOwotICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIody5nZXRGaWxlKCkpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKICAgICAgICAgewogCkBAIC0yNDUsOCArMjQwLDcgQEAKICAgICAgICAgdy53cml0ZShkYXRhKTsKICAgICAgICAgdy5maW5pc2goKTsKIAotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih3LmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih3LmdldEZpbGUoKSkuY29tcGxldGUoKTsKICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgZmlsZSA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICB7CiAgICAgICAgICAgICBmaWxlLnNlZWsoMCk7CkBAIC0yNzcsOCArMjcxLDcgQEAKICAgICAgICAgdy53cml0ZShnZW5lcmF0ZUJ5dGVBcnJheShSYW5kb21BY2Nlc3NSZWFkZXIuREVGQVVMVF9CVUZGRVJfU0laRSAqIDIpKTsKICAgICAgICAgdy5maW5pc2goKTsKIAotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih3LmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih3LmdldEZpbGUoKSkuY29tcGxldGUoKTsKICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgZmlsZSA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICB7CiAKQEAgLTMxMyw4ICszMDYsNyBAQAogCiAgICAgICAgIHcuc3luYygpOwogCi0gICAgICAgIHRyeSAoRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHcuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHcuZ2V0RmlsZSgpKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKIApAQCAtMzUxLDggKzM0Myw3IEBACiAgICAgICAgICAgICBmb3IgKGZpbmFsIGludCBvZmZzZXQgOiBBcnJheXMuYXNMaXN0KDAsIDgpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIEZpbGUgZmlsZTEgPSB3cml0ZVRlbXBvcmFyeUZpbGUobmV3IGJ5dGVbMTZdKTsKLSAgICAgICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmaWxlMS5wYXRoKCkpLmJ1ZmZlclNpemUoYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZmlsZTEpLmJ1ZmZlclNpemUoYnVmZmVyU2l6ZSkuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciBmaWxlID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBleHBlY3RFT0YoKCkgLT4geyBmaWxlLnJlYWRGdWxseSh0YXJnZXQsIG9mZnNldCwgMTcpOyByZXR1cm4gbnVsbDsgfSk7CkBAIC0zNjMsOCArMzU0LDcgQEAKICAgICAgICAgICAgIGZvciAoZmluYWwgaW50IG4gOiBBcnJheXMuYXNMaXN0KDEsIDIsIDQsIDgpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIEZpbGUgZmlsZTEgPSB3cml0ZVRlbXBvcmFyeUZpbGUobmV3IGJ5dGVbMTZdKTsKLSAgICAgICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmaWxlMS5wYXRoKCkpLmJ1ZmZlclNpemUoYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZmlsZTEpLmJ1ZmZlclNpemUoYnVmZmVyU2l6ZSkuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciBmaWxlID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBleHBlY3RFT0YoKCkgLT4gewpAQCAtMzk2LDggKzM4Niw3IEBACiAKICAgICAgICAgdy5zeW5jKCk7CiAKLSAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIody5nZXRQYXRoKCkpOwotICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIody5nZXRGaWxlKCkpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKICAgICAgICAgewogCkBAIC00MjQsOCArNDEzLDcgQEAKICAgICAgICAgdG1wRmlsZS5kZWxldGVPbkV4aXQoKTsKIAogICAgICAgICAvLyBDcmVhdGUgdGhlIEJSQUYgYnkgZmlsZW5hbWUgaW5zdGVhZCBvZiBieSBmaWxlLgotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih0bXBGaWxlLnBhdGgoKSk7Ci0gICAgICAgICAgICAgRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih0bXBGaWxlKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydCB0bXBGaWxlLnBhdGgoKS5lcXVhbHMoci5nZXRQYXRoKCkpOwpAQCAtNDU5LDcgKzQ0Nyw3IEBACiAgICAgICAgIC8vV3JpdGluZyB0byBhIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIHRoYXQgaXMgY2xvc2VkIGdlbmVyYXRlcyBubyBlcnJvcgogICAgICAgICAvL0dvaW5nIHRvIGFsbG93IHRoZSBOUEUgdG8gdGhyb3cgdG8gY2F0Y2ggYXMgYSBidWcgYW55IHVzZSBhZnRlciBjbG9zZS4gTm90YWJseSBpdCB3b24ndCB0aHJvdyBOUEUgZm9yIGEKICAgICAgICAgLy93cml0ZSBvZiBhIDAgbGVuZ3RoLCBidXQgdGhhdCBpcyBraW5kIG9mIGEgY29ybmVyIGNhc2UKLSAgICAgICAgZXhwZWN0RXhjZXB0aW9uKCgpIC0+IHsgdy53cml0ZShnZW5lcmF0ZUJ5dGVBcnJheSgxKSk7IHJldHVybiBudWxsOyB9LCBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGV4cGVjdEV4Y2VwdGlvbigoKSAtPiB7IHcud3JpdGUoZ2VuZXJhdGVCeXRlQXJyYXkoMSkpOyByZXR1cm4gbnVsbDsgfSwgQXNzZXJ0aW9uRXJyb3IuY2xhc3MpOwogCiAgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzUmVhZGVyIGNvcHkgPSBSYW5kb21BY2Nlc3NSZWFkZXIub3BlbihuZXcgRmlsZShyLmdldFBhdGgoKSkpKQogICAgICAgICB7CkBAIC00NzgsOCArNDY2LDcgQEAKIAogICAgICAgICB3LmZpbmlzaCgpOwogCi0gICAgICAgIHRyeSAoRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHcuZ2V0UGF0aCgpKTsKLSAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHcuZ2V0RmlsZSgpKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciBmaWxlID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGZpbGUuc2VlaygxMCk7CkBAIC01MTQsOCArNTAxLDcgQEAKICAgICAgICAgICAgIHcud3JpdGUobmV3IGJ5dGVbMzBdKTsKICAgICAgICAgICAgIHcuZmx1c2goKTsKIAotICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIody5nZXRQYXRoKCkpOwotICAgICAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcih3LmdldEZpbGUoKSkuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByLnNlZWsoMTApOwpAQCAtNjIwLDQgKzYwNiw0IEBACiAKICAgICAgICAgcmV0dXJuIGFycjsKICAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YU91dHB1dFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0RhdGFPdXRwdXRUZXN0LmphdmEKaW5kZXggNDE2MzFhZi4uODNlMmNiZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRGF0YU91dHB1dFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9EYXRhT3V0cHV0VGVzdC5qYXZhCkBAIC00NjksNyArNDY5LDcgQEAKICAgICAgICAgICAgIC8vIGtlZXAgb25seSBmaXJzdCBpIHJhbmRvbSBieXRlcwogICAgICAgICAgICAgQXJyYXlzLmZpbGwocm5kQnl0ZXMsICBpLCBybmRCeXRlcy5sZW5ndGgsIChieXRlKSAwKTsKICAgICAgICAgICAgIGxvbmcgdmFsID0gQnl0ZUJ1ZmZlclV0aWwudG9Mb25nKEJ5dGVCdWZmZXIud3JhcChybmRCeXRlcykpOwotICAgICAgICAgICAgdGVzdC53cml0ZUJ5dGVzKHZhbCwgaSk7CisgICAgICAgICAgICB0ZXN0LndyaXRlTW9zdFNpZ25pZmljYW50Qnl0ZXModmFsLCBpKTsKICAgICAgICAgICAgIGJ5dGVbXSBhcnIgPSBuZXcgYnl0ZVtpXTsKICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocm5kQnl0ZXMsIDAsIGFyciwgMCwgaSk7CiAgICAgICAgICAgICBjYW5vbi53cml0ZShhcnIpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvRmlsZVN5c3RlbXMuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGVTeXN0ZW1zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkNWRiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL0ZpbGVTeXN0ZW1zLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTeXN0ZW07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlN0YW5kYXJkU3lzdGVtUHJvcGVydHk7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uamltZnMuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5qaW1mcy5KaW1mczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmZpbGVzeXN0ZW0uRm9yd2FyZGluZ0ZpbGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uZmlsZXN5c3RlbS5MaXN0ZW5hYmxlRmlsZVN5c3RlbTsKKworcHVibGljIGNsYXNzIEZpbGVTeXN0ZW1zCit7CisgICAgcHVibGljIHN0YXRpYyBMaXN0ZW5hYmxlRmlsZVN5c3RlbSBuZXdHbG9iYWxJbk1lbW9yeUZpbGVTeXN0ZW0oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdsb2JhbChqaW1mcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3RlbmFibGVGaWxlU3lzdGVtIGdsb2JhbCgpCisgICAgeworICAgICAgICByZXR1cm4gZ2xvYmFsKEZpbGUudW5zYWZlR2V0RmlsZXN5c3RlbSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3RlbmFibGVGaWxlU3lzdGVtIGdsb2JhbChGaWxlU3lzdGVtIHJlYWwpCisgICAgeworICAgICAgICBGaWxlU3lzdGVtIGN1cnJlbnQgPSBGaWxlLnVuc2FmZUdldEZpbGVzeXN0ZW0oKTsKKyAgICAgICAgTGlzdGVuYWJsZUZpbGVTeXN0ZW0gZnMgPSBuZXcgTGlzdGVuYWJsZUZpbGVTeXN0ZW0obmV3IEZvcndhcmRpbmdGaWxlU3lzdGVtKHJlYWwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZpbGUudW5zYWZlU2V0RmlsZXN5c3RlbShjdXJyZW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBGaWxlLnVuc2FmZVNldEZpbGVzeXN0ZW0oZnMpOworICAgICAgICByZXR1cm4gZnM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGaWxlU3lzdGVtIGppbWZzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBKaW1mcy5uZXdGaWxlU3lzdGVtKGppbWZzQ29uZmlnKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmlsZVN5c3RlbSBqaW1mcyhTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBKaW1mcy5uZXdGaWxlU3lzdGVtKG5hbWUsIGppbWZzQ29uZmlnKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENvbmZpZ3VyYXRpb24gamltZnNDb25maWcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb24udW5peCgpLnRvQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE1heFNpemUoNEwgPDwgMzApLnNldEJsb2NrU2l6ZSg1MTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGaWxlIG1heWJlQ3JlYXRlVG1wKCkKKyAgICB7CisgICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoU3RhbmRhcmRTeXN0ZW1Qcm9wZXJ0eS5KQVZBX0lPX1RNUERJUi52YWx1ZSgpKTsKKyAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkpCisgICAgICAgICAgICBkaXIudHJ5Q3JlYXRlRGlyZWN0b3JpZXMoKTsKKyAgICAgICAgcmV0dXJuIGRpcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9NbWFwcGVkUmVnaW9uc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL01tYXBwZWRSZWdpb25zVGVzdC5qYXZhCmluZGV4IDcxOTRkMzAuLmU2YjVkZDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL01tYXBwZWRSZWdpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL01tYXBwZWRSZWdpb25zVGVzdC5qYXZhCkBAIC0yMCwxMiArMjAsMTMgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkludHM7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTM0LDI3ICszNSwzNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZXNUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uY29tcHJlc3MuQ29tcHJlc3Npb25NZXRhZGF0YS5DaHVuazsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKIAotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5DbG9jay5HbG9iYWwubmFub1RpbWU7Ci0KIHB1YmxpYyBjbGFzcyBNbWFwcGVkUmVnaW9uc1Rlc3QKIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTW1hcHBlZFJlZ2lvbnNUZXN0LmNsYXNzKTsKIAorICAgIHByaXZhdGUgZmluYWwgaW50IE9MRF9NQVhfU0VHTUVOVF9TSVpFID0gTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRTsKKwogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cEREKCkKICAgICB7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgIH0KIAorICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHJlc2V0TWF4U2VnbWVudFNpemUoKQorICAgIHsKKyAgICAgICAgTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRSA9IE9MRF9NQVhfU0VHTUVOVF9TSVpFOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIEJ5dGVCdWZmZXIgYWxsb2NhdGVCdWZmZXIoaW50IHNpemUpCiAgICAgewogICAgICAgICBCeXRlQnVmZmVyIHJldCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoSW50cy5jaGVja2VkQ2FzdChzaXplKSk7CkBAIC02Myw2ICs3NCwxMSBAQAogICAgICAgICBsb2dnZXIuaW5mbygiU2VlZCB7fSIsIHNlZWQpOwogCiAgICAgICAgIG5ldyBSYW5kb20oc2VlZCkubmV4dEJ5dGVzKHJldC5hcnJheSgpKTsKKyAgICAgICAgYnl0ZVtdIGFyciA9IHJldC5hcnJheSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgYXJyW2ldID0gKGJ5dGUpIChhcnJbaV0gJiAweGYpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCkBAIC04MCwxNSArOTYsMTQgQEAKICAgICAgICAgYXNzZXJ0IHJldC5leGlzdHMoKTsKICAgICAgICAgYXNzZXJ0IHJldC5sZW5ndGgoKSA+PSBidWZmZXIuY2FwYWNpdHkoKTsKICAgICAgICAgcmV0dXJuIHJldDsKLQogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBhbGxvY2F0ZUJ1ZmZlcigxMDI0KTsKLSAgICAgICAgdHJ5KENoYW5uZWxQcm94eSBjaGFubmVsID0gbmV3IENoYW5uZWxQcm94eSh3cml0ZUZpbGUoInRlc3RFbXB0eSIsIGJ1ZmZlcikpOwotICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucyA9IE1tYXBwZWRSZWdpb25zLmVtcHR5KGNoYW5uZWwpKQorICAgICAgICB0cnkgKENoYW5uZWxQcm94eSBjaGFubmVsID0gbmV3IENoYW5uZWxQcm94eSh3cml0ZUZpbGUoInRlc3RFbXB0eSIsIGJ1ZmZlcikpOworICAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5lbXB0eShjaGFubmVsKSkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWdpb25zLmlzRW1wdHkoKSk7CiAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlZ2lvbnMuaXNWYWxpZChjaGFubmVsKSk7CkBAIC05OSw4ICsxMTQsOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RUd29TZWdtZW50cygpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gYWxsb2NhdGVCdWZmZXIoMjA0OCk7Ci0gICAgICAgIHRyeShDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0VHdvU2VnbWVudHMiLCBidWZmZXIpKTsKLSAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5lbXB0eShjaGFubmVsKSkKKyAgICAgICAgdHJ5IChDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0VHdvU2VnbWVudHMiLCBidWZmZXIpKTsKKyAgICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMuZW1wdHkoY2hhbm5lbCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJlZ2lvbnMuZXh0ZW5kKDEwMjQpOwogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyBpKyspCkBAIC0xMzMsMTIgKzE0OCwxMSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFNtYWxsU2VnbWVudFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBpbnQgT0xEX01BWF9TRUdNRU5UX1NJWkUgPSBNbWFwcGVkUmVnaW9ucy5NQVhfU0VHTUVOVF9TSVpFOwogICAgICAgICBNbWFwcGVkUmVnaW9ucy5NQVhfU0VHTUVOVF9TSVpFID0gMTAyNDsKIAogICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IGFsbG9jYXRlQnVmZmVyKDQwOTYpOwotICAgICAgICB0cnkoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdFNtYWxsU2VnbWVudFNpemUiLCBidWZmZXIpKTsKLSAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5lbXB0eShjaGFubmVsKSkKKyAgICAgICAgdHJ5IChDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0U21hbGxTZWdtZW50U2l6ZSIsIGJ1ZmZlcikpOworICAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5lbXB0eShjaGFubmVsKSkKICAgICAgICAgewogICAgICAgICAgICAgcmVnaW9ucy5leHRlbmQoMTAyNCk7CiAgICAgICAgICAgICByZWdpb25zLmV4dGVuZCgyMDQ4KTsKQEAgLTE1MywyMiArMTY3LDE3IEBACiAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFNJWkUgKyAoU0laRSAqIChpIC8gU0laRSkpLCByZWdpb24uZW5kKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRSA9IE9MRF9NQVhfU0VHTUVOVF9TSVpFOwotICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsb2NSZWdpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgaW50IE9MRF9NQVhfU0VHTUVOVF9TSVpFID0gTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRTsKICAgICAgICAgTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRSA9IDEwMjQ7CiAKICAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBhbGxvY2F0ZUJ1ZmZlcihNbWFwcGVkUmVnaW9ucy5NQVhfU0VHTUVOVF9TSVpFICogTW1hcHBlZFJlZ2lvbnMuUkVHSU9OX0FMTE9DX1NJWkUgKiAzKTsKIAotICAgICAgICB0cnkoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdEFsbG9jUmVnaW9ucyIsIGJ1ZmZlcikpOwotICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucyA9IE1tYXBwZWRSZWdpb25zLmVtcHR5KGNoYW5uZWwpKQorICAgICAgICB0cnkgKENoYW5uZWxQcm94eSBjaGFubmVsID0gbmV3IENoYW5uZWxQcm94eSh3cml0ZUZpbGUoInRlc3RBbGxvY1JlZ2lvbnMiLCBidWZmZXIpKTsKKyAgICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMuZW1wdHkoY2hhbm5lbCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJlZ2lvbnMuZXh0ZW5kKGJ1ZmZlci5jYXBhY2l0eSgpKTsKIApAQCAtMTgxLDEwICsxOTAsNiBAQAogICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhTSVpFICsgKFNJWkUgKiAoaSAvIFNJWkUpKSwgcmVnaW9uLmVuZCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zLk1BWF9TRUdNRU5UX1NJWkUgPSBPTERfTUFYX1NFR01FTlRfU0laRTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xOTUsOCArMjAwLDggQEAKICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgc25hcHNob3Q7CiAgICAgICAgIENoYW5uZWxQcm94eSBjaGFubmVsQ29weTsKIAotICAgICAgICB0cnkoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdFNuYXBzaG90IiwgYnVmZmVyKSk7Ci0gICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMubWFwKGNoYW5uZWwsIGJ1ZmZlci5jYXBhY2l0eSgpIC8gNCkpCisgICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdFNuYXBzaG90IiwgYnVmZmVyKSk7CisgICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucyA9IE1tYXBwZWRSZWdpb25zLm1hcChjaGFubmVsLCBidWZmZXIuY2FwYWNpdHkoKSAvIDQpKQogICAgICAgICB7CiAgICAgICAgICAgICAvLyBjcmVhdGUgMyBtb3JlIHNlZ21lbnRzLCBvbmUgcGVyIHF1YXRlciBjYXBhY2l0eQogICAgICAgICAgICAgcmVnaW9ucy5leHRlbmQoYnVmZmVyLmNhcGFjaXR5KCkgLyAyKTsKQEAgLTIzNyw4ICsyNDIsOCBAQAogICAgICAgICBNbWFwcGVkUmVnaW9ucyBzbmFwc2hvdDsKICAgICAgICAgQ2hhbm5lbFByb3h5IGNoYW5uZWxDb3B5OwogCi0gICAgICAgIHRyeShDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0U25hcHNob3RDYW5ub3RFeHRlbmQiLCBidWZmZXIpKTsKLSAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5lbXB0eShjaGFubmVsKSkKKyAgICAgICAgdHJ5IChDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0U25hcHNob3RDYW5ub3RFeHRlbmQiLCBidWZmZXIpKTsKKyAgICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMuZW1wdHkoY2hhbm5lbCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJlZ2lvbnMuZXh0ZW5kKGJ1ZmZlci5jYXBhY2l0eSgpIC8gMik7CiAKQEAgLTI2NCw4ICsyNjksOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbmRPdXRPZk9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBhbGxvY2F0ZUJ1ZmZlcig0MDk2KTsKLSAgICAgICAgdHJ5KENoYW5uZWxQcm94eSBjaGFubmVsID0gbmV3IENoYW5uZWxQcm94eSh3cml0ZUZpbGUoInRlc3RFeHRlbmRPdXRPZk9yZGVyIiwgYnVmZmVyKSk7Ci0gICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMuZW1wdHkoY2hhbm5lbCkpCisgICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdEV4dGVuZE91dE9mT3JkZXIiLCBidWZmZXIpKTsKKyAgICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMuZW1wdHkoY2hhbm5lbCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIHJlZ2lvbnMuZXh0ZW5kKDQwOTYpOwogICAgICAgICAgICAgcmVnaW9ucy5leHRlbmQoMTAyNCk7CkBAIC0yODUsOCArMjkwLDggQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnYXRpdmVFeHRlbmQoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IGFsbG9jYXRlQnVmZmVyKDEwMjQpOwotICAgICAgICB0cnkoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdE5lZ2F0aXZlRXh0ZW5kIiwgYnVmZmVyKSk7Ci0gICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMuZW1wdHkoY2hhbm5lbCkpCisgICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdE5lZ2F0aXZlRXh0ZW5kIiwgYnVmZmVyKSk7CisgICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucyA9IE1tYXBwZWRSZWdpb25zLmVtcHR5KGNoYW5uZWwpKQogICAgICAgICB7CiAgICAgICAgICAgICByZWdpb25zLmV4dGVuZCgtMSk7CiAgICAgICAgIH0KQEAgLTI5NSw3ICszMDAsNiBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE1hcEZvckNvbXByZXNzaW9uTWV0YWRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBpbnQgT0xEX01BWF9TRUdNRU5UX1NJWkUgPSBNbWFwcGVkUmVnaW9ucy5NQVhfU0VHTUVOVF9TSVpFOwogICAgICAgICBNbWFwcGVkUmVnaW9ucy5NQVhfU0VHTUVOVF9TSVpFID0gMTAyNDsKIAogICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IGFsbG9jYXRlQnVmZmVyKDEyOCAqIDEwMjQpOwpAQCAtMzA2LDQxICszMTAsMjkgQEAKICAgICAgICAgY2YuZGVsZXRlT25FeGl0KCk7CiAKICAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3Igc3N0YWJsZU1ldGFkYXRhQ29sbGVjdG9yID0gbmV3IE1ldGFkYXRhQ29sbGVjdG9yKG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihCeXRlc1R5cGUuaW5zdGFuY2UpKTsKLSAgICAgICAgdHJ5KFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbmV3IENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKGYsIGNmLmFic29sdXRlUGF0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlc3Npb25QYXJhbXMuc25hcHB5KCksIHNzdGFibGVNZXRhZGF0YUNvbGxlY3RvcikpCisgICAgICAgIHRyeSAoU2VxdWVudGlhbFdyaXRlciB3cml0ZXIgPSBuZXcgQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIoZiwgY2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZXNzaW9uUGFyYW1zLnNuYXBweSgpLCBzc3RhYmxlTWV0YWRhdGFDb2xsZWN0b3IpKQogICAgICAgICB7CiAgICAgICAgICAgICB3cml0ZXIud3JpdGUoYnVmZmVyKTsKICAgICAgICAgICAgIHdyaXRlci5maW5pc2goKTsKICAgICAgICAgfQogCi0gICAgICAgIENvbXByZXNzaW9uTWV0YWRhdGEgbWV0YWRhdGEgPSBuZXcgQ29tcHJlc3Npb25NZXRhZGF0YShjZi5hYnNvbHV0ZVBhdGgoKSwgZi5sZW5ndGgoKSwgdHJ1ZSk7Ci0gICAgICAgIHRyeShDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkoZik7Ci0gICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMubWFwKGNoYW5uZWwsIG1ldGFkYXRhKSkKKyAgICAgICAgQ29tcHJlc3Npb25NZXRhZGF0YSBtZXRhZGF0YSA9IENvbXByZXNzaW9uTWV0YWRhdGEub3BlbihjZiwgZi5sZW5ndGgoKSwgdHJ1ZSk7CisgICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KGYpOworICAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5tYXAoY2hhbm5lbCwgbWV0YWRhdGEpKQogICAgICAgICB7CiAKICAgICAgICAgICAgIGFzc2VydEZhbHNlKHJlZ2lvbnMuaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIHdoaWxlKGkgPCBidWZmZXIuY2FwYWNpdHkoKSkKKyAgICAgICAgICAgIGludCBkYXRhT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChkYXRhT2Zmc2V0IDwgYnVmZmVyLmNhcGFjaXR5KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tcHJlc3Npb25NZXRhZGF0YS5DaHVuayBjaHVuayA9IG1ldGFkYXRhLmNodW5rRm9yKGkpOwotCi0gICAgICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMuUmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZmxvb3IoY2h1bmsub2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlZ2lvbik7Ci0KLSAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGNvbXByZXNzZWRDaHVuayA9IHJlZ2lvbi5idWZmZXIuZHVwbGljYXRlKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb21wcmVzc2VkQ2h1bmspOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjaHVuay5sZW5ndGggKyA0LCBjb21wcmVzc2VkQ2h1bmsuY2FwYWNpdHkoKSk7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2h1bmsub2Zmc2V0LCByZWdpb24ub2Zmc2V0KCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhjaHVuay5vZmZzZXQgKyBjaHVuay5sZW5ndGggKyA0LCByZWdpb24uZW5kKCkpOwotCi0gICAgICAgICAgICAgICAgaSArPSBtZXRhZGF0YS5jaHVua0xlbmd0aCgpOworICAgICAgICAgICAgICAgIHZlcmlmeUNodW5rcyhmLCBtZXRhZGF0YSwgZGF0YU9mZnNldCwgcmVnaW9ucyk7CisgICAgICAgICAgICAgICAgZGF0YU9mZnNldCArPSBtZXRhZGF0YS5jaHVua0xlbmd0aCgpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGZpbmFsbHkKICAgICAgICAgewotICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRSA9IE9MRF9NQVhfU0VHTUVOVF9TSVpFOwogICAgICAgICAgICAgbWV0YWRhdGEuY2xvc2UoKTsKICAgICAgICAgfQogICAgIH0KQEAgLTM0OSw4ICszNDEsOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXJnRm9yTWFwMSgpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gYWxsb2NhdGVCdWZmZXIoMTAyNCk7Ci0gICAgICAgIHRyeShDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0SWxsZWdhbEFyZ0Zvck1hcDEiLCBidWZmZXIpKTsKLSAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5tYXAoY2hhbm5lbCwgMCkpCisgICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdElsbGVnYWxBcmdGb3JNYXAxIiwgYnVmZmVyKSk7CisgICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucyA9IE1tYXBwZWRSZWdpb25zLm1hcChjaGFubmVsLCAwKSkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWdpb25zLmlzRW1wdHkoKSk7CiAgICAgICAgIH0KQEAgLTM2MCw4ICszNTIsOCBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXJnRm9yTWFwMigpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gYWxsb2NhdGVCdWZmZXIoMTAyNCk7Ci0gICAgICAgIHRyeShDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0SWxsZWdhbEFyZ0Zvck1hcDIiLCBidWZmZXIpKTsKLSAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5tYXAoY2hhbm5lbCwgLTFMKSkKKyAgICAgICAgdHJ5IChDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkod3JpdGVGaWxlKCJ0ZXN0SWxsZWdhbEFyZ0Zvck1hcDIiLCBidWZmZXIpKTsKKyAgICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMubWFwKGNoYW5uZWwsIC0xTCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydFRydWUocmVnaW9ucy5pc0VtcHR5KCkpOwogICAgICAgICB9CkBAIC0zNzEsMTEgKzM2MywxMzEgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbEFyZ0Zvck1hcDMoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IGFsbG9jYXRlQnVmZmVyKDEwMjQpOwotICAgICAgICB0cnkoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KHdyaXRlRmlsZSgidGVzdElsbGVnYWxBcmdGb3JNYXAzIiwgYnVmZmVyKSk7Ci0gICAgICAgICAgICBNbWFwcGVkUmVnaW9ucyByZWdpb25zID0gTW1hcHBlZFJlZ2lvbnMubWFwKGNoYW5uZWwsIG51bGwpKQorICAgICAgICB0cnkgKENoYW5uZWxQcm94eSBjaGFubmVsID0gbmV3IENoYW5uZWxQcm94eSh3cml0ZUZpbGUoInRlc3RJbGxlZ2FsQXJnRm9yTWFwMyIsIGJ1ZmZlcikpOworICAgICAgICAgICAgIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMgPSBNbWFwcGVkUmVnaW9ucy5tYXAoY2hhbm5lbCwgbnVsbCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIGFzc2VydFRydWUocmVnaW9ucy5pc0VtcHR5KCkpOwogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5kRm9yQ29tcHJlc3Npb25NZXRhZGF0YSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRlc3RFeHRlbmRGb3JDb21wcmVzc2lvbk1ldGFkYXRhKDgsIDQsIDQsIDgsIDEyKTsKKyAgICAgICAgdGVzdEV4dGVuZEZvckNvbXByZXNzaW9uTWV0YWRhdGEoNCwgNCwgNCwgOCwgMTIpOworICAgICAgICB0ZXN0RXh0ZW5kRm9yQ29tcHJlc3Npb25NZXRhZGF0YSgyLCA0LCA0LCA4LCAxMik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdEV4dGVuZEZvckNvbXByZXNzaW9uTWV0YWRhdGEoaW50IG1heFNlZ21lbnRTaXplLCBpbnQgY2h1bmtTaXplLCBpbnQuLi4gd3JpdGVTaXplcykgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTW1hcHBlZFJlZ2lvbnMuTUFYX1NFR01FTlRfU0laRSA9IG1heFNlZ21lbnRTaXplIDw8IDEwOworICAgICAgICBpbnQgc2l6ZSA9IEFycmF5cy5zdHJlYW0od3JpdGVTaXplcykuc3VtKCkgPDwgMTA7CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSBhbGxvY2F0ZUJ1ZmZlcihzaXplKTsKKyAgICAgICAgRmlsZSBmID0gRmlsZVV0aWxzLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0TWFwRm9yQ29tcHJlc3Npb25NZXRhZGF0YSIsICIxIik7CisgICAgICAgIGYuZGVsZXRlT25FeGl0KCk7CisKKyAgICAgICAgRmlsZSBjZiA9IEZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZShmLm5hbWUoKSArICIubWV0YWRhdGEiLCAiMSIpOworICAgICAgICBjZi5kZWxldGVPbkV4aXQoKTsKKworICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBzc3RhYmxlTWV0YWRhdGFDb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IobmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKEJ5dGVzVHlwZS5pbnN0YW5jZSkpOworICAgICAgICB0cnkgKENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyIHdyaXRlciA9IG5ldyBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlcihmLCBjZiwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVudGlhbFdyaXRlck9wdGlvbi5ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzc2lvblBhcmFtcy5kZWZsYXRlKGNodW5rU2l6ZSA8PCAxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzdGFibGVNZXRhZGF0YUNvbGxlY3RvcikpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgc2xpY2UgPSBidWZmZXIuc2xpY2UoKTsKKyAgICAgICAgICAgIHNsaWNlLmxpbWl0KHdyaXRlU2l6ZXNbMF0gPDwgMTApOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKHNsaWNlKTsKKyAgICAgICAgICAgIHdyaXRlci5zeW5jKCk7CisKKyAgICAgICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KGYpOworICAgICAgICAgICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIG1ldGFkYXRhID0gd3JpdGVyLm9wZW4od3JpdGVyLmdldExhc3RGbHVzaE9mZnNldCgpKTsKKyAgICAgICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucyA9IE1tYXBwZWRSZWdpb25zLm1hcChjaGFubmVsLCBtZXRhZGF0YSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UocmVnaW9ucy5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgIGludCBkYXRhT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZGF0YU9mZnNldCA8IG1ldGFkYXRhLmRhdGFMZW5ndGgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2ZXJpZnlDaHVua3MoZiwgbWV0YWRhdGEsIGRhdGFPZmZzZXQsIHJlZ2lvbnMpOworICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0ICs9IG1ldGFkYXRhLmNodW5rTGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IGlkeCA9IDE7CisgICAgICAgICAgICAgICAgaW50IHBvcyA9IHdyaXRlU2l6ZXNbMF0gPDwgMTA7CisgICAgICAgICAgICAgICAgd2hpbGUgKGlkeCA8IHdyaXRlU2l6ZXMubGVuZ3RoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2xpY2UgPSBidWZmZXIuc2xpY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgc2xpY2UucG9zaXRpb24ocG9zKS5saW1pdChwb3MgKyAod3JpdGVTaXplc1tpZHhdIDw8IDEwKSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShzbGljZSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5zeW5jKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgY2FsbGluZyBleHRlbmQgZm9yIHRoZSBzYW1lIChmaXJzdCBpdGVyYXRpb24pIG9yIHNvbWUgcHJldmlvdXMgbWV0YWRhdGEgKGZ1cnRoZXIgaXRlcmF0aW9ucykgaGFzIG5vIGVmZmVjdAorICAgICAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZShyZWdpb25zLmV4dGVuZChtZXRhZGF0YSkpOworCisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJDaGVja2luZyBleHRlbmQgb24gY29tcHJlc3NlZCBjaHVuayBmb3IgcmFuZ2U9e30ge30uLnt9IC8ge30iLCBpZHgsIHBvcywgcG9zICsgKHdyaXRlU2l6ZXNbaWR4XSA8PCAxMCksIHNpemUpOworICAgICAgICAgICAgICAgICAgICBjaGVja0V4dGVuZE9uQ29tcHJlc3NlZENodW5rcyhmLCB3cml0ZXIsIHJlZ2lvbnMpOworICAgICAgICAgICAgICAgICAgICBwb3MgKz0gd3JpdGVTaXplc1tpZHhdIDw8IDEwOworICAgICAgICAgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tFeHRlbmRPbkNvbXByZXNzZWRDaHVua3MoRmlsZSBmLCBDb21wcmVzc2VkU2VxdWVudGlhbFdyaXRlciB3cml0ZXIsIE1tYXBwZWRSZWdpb25zIHJlZ2lvbnMpCisgICAgeworICAgICAgICBpbnQgZGF0YU9mZnNldDsKKyAgICAgICAgdHJ5IChDb21wcmVzc2lvbk1ldGFkYXRhIG1ldGFkYXRhID0gd3JpdGVyLm9wZW4od3JpdGVyLmdldExhc3RGbHVzaE9mZnNldCgpKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaW9ucy5leHRlbmQobWV0YWRhdGEpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UocmVnaW9ucy5pc0VtcHR5KCkpOworICAgICAgICAgICAgZGF0YU9mZnNldCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoZGF0YU9mZnNldCA8IG1ldGFkYXRhLmRhdGFMZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkNoZWNraW5nIGNodW5rIHt9Li57fSIsIGRhdGFPZmZzZXQsIGRhdGFPZmZzZXQgKyBtZXRhZGF0YS5jaHVua0xlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB2ZXJpZnlDaHVua3MoZiwgbWV0YWRhdGEsIGRhdGFPZmZzZXQsIHJlZ2lvbnMpOworICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQgKz0gbWV0YWRhdGEuY2h1bmtMZW5ndGgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBmcm9tUmVnaW9ucyhNbWFwcGVkUmVnaW9ucyByZWdpb25zLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShzaXplKTsKKworICAgICAgICB3aGlsZSAoYnVmLnJlbWFpbmluZygpID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgTW1hcHBlZFJlZ2lvbnMuUmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZmxvb3Iob2Zmc2V0KTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgcmVnQnVmID0gcmVnaW9uLmJ1ZmZlci5zbGljZSgpOworICAgICAgICAgICAgaW50IHJlZ0J1Zk9mZnNldCA9IChpbnQpIChvZmZzZXQgLSByZWdpb24ub2Zmc2V0KTsKKyAgICAgICAgICAgIHJlZ0J1Zi5wb3NpdGlvbihyZWdCdWZPZmZzZXQpOworICAgICAgICAgICAgcmVnQnVmLmxpbWl0KHJlZ0J1Zk9mZnNldCArIE1hdGgubWluKGJ1Zi5yZW1haW5pbmcoKSwgcmVnQnVmLnJlbWFpbmluZygpKSk7CisgICAgICAgICAgICBvZmZzZXQgKz0gcmVnQnVmLnJlbWFpbmluZygpOworICAgICAgICAgICAgYnVmLnB1dChyZWdCdWYpOworICAgICAgICB9CisKKyAgICAgICAgYnVmLmZsaXAoKTsKKyAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICB9CisKKyAgICBwcml2YXRlIENodW5rIHZlcmlmeUNodW5rcyhGaWxlIGYsIENvbXByZXNzaW9uTWV0YWRhdGEgbWV0YWRhdGEsIGxvbmcgZGF0YU9mZnNldCwgTW1hcHBlZFJlZ2lvbnMgcmVnaW9ucykKKyAgICB7CisgICAgICAgIENodW5rIGNodW5rID0gbWV0YWRhdGEuY2h1bmtGb3IoZGF0YU9mZnNldCk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBjb21wcmVzc2VkQ2h1bmsgPSBmcm9tUmVnaW9ucyhyZWdpb25zLCAoaW50KSBjaHVuay5vZmZzZXQsIGNodW5rLmxlbmd0aCArIDQpOworICAgICAgICBhc3NlcnRUaGF0KGNvbXByZXNzZWRDaHVuay5jYXBhY2l0eSgpKS5pc0VxdWFsVG8oY2h1bmsubGVuZ3RoICsgNCk7CisKKyAgICAgICAgdHJ5IChDaGFubmVsUHJveHkgY2hhbm5lbCA9IG5ldyBDaGFubmVsUHJveHkoZikpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShjb21wcmVzc2VkQ2h1bmsucmVtYWluaW5nKCkpOworICAgICAgICAgICAgbG9uZyBsZW4gPSBjaGFubmVsLnJlYWQoYnVmLCBjaHVuay5vZmZzZXQpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChsZW4pLmlzRXF1YWxUbyhjaHVuay5sZW5ndGggKyA0KTsKKyAgICAgICAgICAgIGJ1Zi5mbGlwKCk7CisgICAgICAgICAgICBTdHJpbmcgbW1hcHBlZEhleCA9IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoY29tcHJlc3NlZENodW5rKTsKKyAgICAgICAgICAgIFN0cmluZyBmaWxlSGV4ID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChidWYpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChmaWxlSGV4KS5pc0VxdWFsVG8obW1hcHBlZEhleCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2h1bms7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvTklPRGF0YUlucHV0U3RyZWFtVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvTklPRGF0YUlucHV0U3RyZWFtVGVzdC5qYXZhCmluZGV4IDMxZmE1M2MuLjNmMjhjZDQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL05JT0RhdGFJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9OSU9EYXRhSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTIwLDEyICsyMCwxMyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWw7CiAKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5VbnNpZ25lZEJ5dGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuVW5zaWduZWRJbnRlZ2VyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuVW5zaWduZWRMb25nOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5pby4qOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUNoYW5uZWw7CiBpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuUmVhZGFibGVCeXRlQ2hhbm5lbDsKQEAgLTMzLDEzICszNCw2IEBACiBpbXBvcnQgamF2YS51dGlsLlF1ZXVlOwogaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiAKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuQ2hhcnNldHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24ucHJpbWl0aXZlcy5VbnNpZ25lZEJ5dGVzOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuVW5zaWduZWRJbnRlZ2VyOwotaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuVW5zaWduZWRMb25nOwotCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9QYWdlQXdhcmVUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9QYWdlQXdhcmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiMGY4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1BhZ2VBd2FyZVRlc3QuamF2YQpAQCAtMCwwICsxLDE4MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlBhZ2VBd2FyZS5QQUdFX1NJWkU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgUGFnZUF3YXJlVGVzdAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFnZUxpbWl0KCkKKyAgICB7CisgICAgICAgIGFzc2VydEVxdWFscyhQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWdlTGltaXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiAqIFBBR0VfU0laRSwgUGFnZUF3YXJlLnBhZ2VMaW1pdChQQUdFX1NJWkUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMgKiBQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWdlTGltaXQoMiAqIFBBR0VfU0laRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWdlTGltaXQoUEFHRV9TSVpFIC8gMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoUEFHRV9TSVpFLCBQYWdlQXdhcmUucGFnZUxpbWl0KFBBR0VfU0laRSAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBR0VfU0laRSwgUGFnZUF3YXJlLnBhZ2VMaW1pdCgxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIgKiBQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWdlTGltaXQoUEFHRV9TSVpFICsgUEFHRV9TSVpFIC8gMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiAqIFBBR0VfU0laRSwgUGFnZUF3YXJlLnBhZ2VMaW1pdChQQUdFX1NJWkUgKyBQQUdFX1NJWkUgLSAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyICogUEFHRV9TSVpFLCBQYWdlQXdhcmUucGFnZUxpbWl0KFBBR0VfU0laRSArIDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGJ5dGVzTGVmdEluUGFnZSgpCisgICAgeworICAgICAgICBhc3NlcnRFcXVhbHMoUEFHRV9TSVpFLCBQYWdlQXdhcmUuYnl0ZXNMZWZ0SW5QYWdlKDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBR0VfU0laRSwgUGFnZUF3YXJlLmJ5dGVzTGVmdEluUGFnZShQQUdFX1NJWkUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBR0VfU0laRSwgUGFnZUF3YXJlLmJ5dGVzTGVmdEluUGFnZSgyICogUEFHRV9TSVpFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBR0VfU0laRSAtIChQQUdFX1NJWkUgLyAzKSwgUGFnZUF3YXJlLmJ5dGVzTGVmdEluUGFnZShQQUdFX1NJWkUgLyAzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBQYWdlQXdhcmUuYnl0ZXNMZWZ0SW5QYWdlKFBBR0VfU0laRSAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBR0VfU0laRSAtIDEsIFBhZ2VBd2FyZS5ieXRlc0xlZnRJblBhZ2UoMSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhQQUdFX1NJWkUgLSAoUEFHRV9TSVpFIC8gMyksIFBhZ2VBd2FyZS5ieXRlc0xlZnRJblBhZ2UoUEFHRV9TSVpFICsgUEFHRV9TSVpFIC8gMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgUGFnZUF3YXJlLmJ5dGVzTGVmdEluUGFnZShQQUdFX1NJWkUgKyBQQUdFX1NJWkUgLSAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQQUdFX1NJWkUgLSAxLCBQYWdlQXdhcmUuYnl0ZXNMZWZ0SW5QYWdlKFBBR0VfU0laRSArIDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhZ2VTdGFydCgpCisgICAgeworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgUGFnZUF3YXJlLnBhZ2VTdGFydCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWdlU3RhcnQoUEFHRV9TSVpFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyICogUEFHRV9TSVpFLCBQYWdlQXdhcmUucGFnZVN0YXJ0KDIgKiBQQUdFX1NJWkUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgUGFnZUF3YXJlLnBhZ2VTdGFydChQQUdFX1NJWkUgLyAzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBQYWdlQXdhcmUucGFnZVN0YXJ0KFBBR0VfU0laRSAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIFBhZ2VBd2FyZS5wYWdlU3RhcnQoMSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWdlU3RhcnQoUEFHRV9TSVpFICsgUEFHRV9TSVpFIC8gMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoUEFHRV9TSVpFLCBQYWdlQXdhcmUucGFnZVN0YXJ0KFBBR0VfU0laRSArIFBBR0VfU0laRSAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBR0VfU0laRSwgUGFnZUF3YXJlLnBhZ2VTdGFydChQQUdFX1NJWkUgKyAxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYWRkZWQoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIFBhZ2VBd2FyZS5wYWRkZWQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUEFHRV9TSVpFLCBQYWdlQXdhcmUucGFkZGVkKFBBR0VfU0laRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiAqIFBBR0VfU0laRSwgUGFnZUF3YXJlLnBhZGRlZCgyICogUEFHRV9TSVpFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFBBR0VfU0laRSwgUGFnZUF3YXJlLnBhZGRlZChQQUdFX1NJWkUgLyAzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWRkZWQoUEFHRV9TSVpFIC0gMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUEFHRV9TSVpFLCBQYWdlQXdhcmUucGFkZGVkKDEpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMiAqIFBBR0VfU0laRSwgUGFnZUF3YXJlLnBhZGRlZChQQUdFX1NJWkUgKyBQQUdFX1NJWkUgLyAzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyICogUEFHRV9TSVpFLCBQYWdlQXdhcmUucGFkZGVkKFBBR0VfU0laRSArIFBBR0VfU0laRSAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIgKiBQQUdFX1NJWkUsIFBhZ2VBd2FyZS5wYWRkZWQoUEFHRV9TSVpFICsgMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbnVtUGFnZXMoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIFBhZ2VBd2FyZS5udW1QYWdlcygwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBQYWdlQXdhcmUubnVtUGFnZXMoUEFHRV9TSVpFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBQYWdlQXdhcmUubnVtUGFnZXMoMiAqIFBBR0VfU0laRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBQYWdlQXdhcmUubnVtUGFnZXMoUEFHRV9TSVpFIC8gMykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgUGFnZUF3YXJlLm51bVBhZ2VzKFBBR0VfU0laRSAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFBhZ2VBd2FyZS5udW1QYWdlcygxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIFBhZ2VBd2FyZS5udW1QYWdlcyhQQUdFX1NJWkUgKyBQQUdFX1NJWkUgLyAzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBQYWdlQXdhcmUubnVtUGFnZXMoUEFHRV9TSVpFICsgUEFHRV9TSVpFIC0gMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgUGFnZUF3YXJlLm51bVBhZ2VzKFBBR0VfU0laRSArIDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhZ2VOdW0oKQorICAgIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIFBhZ2VBd2FyZS5wYWdlTnVtKDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFBhZ2VBd2FyZS5wYWdlTnVtKFBBR0VfU0laRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgUGFnZUF3YXJlLnBhZ2VOdW0oMiAqIFBBR0VfU0laRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBQYWdlQXdhcmUucGFnZU51bShQQUdFX1NJWkUgLyAzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBQYWdlQXdhcmUucGFnZU51bShQQUdFX1NJWkUgLSAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBQYWdlQXdhcmUucGFnZU51bSgxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFBhZ2VBd2FyZS5wYWdlTnVtKFBBR0VfU0laRSArIFBBR0VfU0laRSAvIDMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFBhZ2VBd2FyZS5wYWdlTnVtKFBBR0VfU0laRSArIFBBR0VfU0laRSAtIDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFBhZ2VBd2FyZS5wYWdlTnVtKFBBR0VfU0laRSArIDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhZCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdFBhZCgwLCAwKTsKKyAgICAgICAgdGVzdFBhZChQQUdFX1NJWkUsIFBBR0VfU0laRSk7CisgICAgICAgIHRlc3RQYWQoMiAqIFBBR0VfU0laRSwgMiAqIFBBR0VfU0laRSk7CisKKyAgICAgICAgdGVzdFBhZChQQUdFX1NJWkUsIFBBR0VfU0laRSAvIDMpOworICAgICAgICB0ZXN0UGFkKFBBR0VfU0laRSwgUEFHRV9TSVpFIC0gMSk7CisgICAgICAgIHRlc3RQYWQoUEFHRV9TSVpFLCAxKTsKKworICAgICAgICB0ZXN0UGFkKDIgKiBQQUdFX1NJWkUsIFBBR0VfU0laRSArIFBBR0VfU0laRSAvIDMpOworICAgICAgICB0ZXN0UGFkKDIgKiBQQUdFX1NJWkUsIFBBR0VfU0laRSArIFBBR0VfU0laRSAtIDEpOworICAgICAgICB0ZXN0UGFkKDIgKiBQQUdFX1NJWkUsIFBBR0VfU0laRSArIDEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UGFkKGludCBleHBlY3RlZFNpemUsIGludCBjdXJyZW50U2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBCeXRlQnVmZmVyIGV4cGVjdGVkQnVmID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShleHBlY3RlZFNpemUpOworICAgICAgICB0cnkgKERhdGFPdXRwdXRCdWZmZXIgb3V0ID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50U2l6ZTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkQnVmLnB1dCgoYnl0ZSkgMSk7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IGN1cnJlbnRTaXplOyBpIDwgZXhwZWN0ZWRTaXplOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRCdWYucHV0KChieXRlKSAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUGFnZUF3YXJlLnBhZChvdXQpOworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZEJ1Zi5yZXdpbmQoKSwgb3V0LmFzTmV3QnVmZmVyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByYW5kb21pemVkVGVzdCgpCisgICAgeworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDA7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgbG9uZyBwb3MgPSByYW5kLm5leHRMb25nKCkgJiAoKDFMIDw8IHJhbmQubmV4dEludCg2NCkpIC0gMSk7ICAgIC8vIHBvc2l0aXZlIGxvbmcgd2l0aCByYW5kb20gbGVuZ3RoCisgICAgICAgICAgICBsb25nIHBhZ2VTdGFydCA9IChwb3MgLyBQQUdFX1NJWkUpICogUEFHRV9TSVpFOworICAgICAgICAgICAgbG9uZyBwYWdlTGltaXQgPSBwYWdlU3RhcnQgKyBQQUdFX1NJWkU7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFnZUxpbWl0LCBQYWdlQXdhcmUucGFnZUxpbWl0KHBvcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhZ2VTdGFydCwgUGFnZUF3YXJlLnBhZ2VTdGFydChwb3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYWdlTGltaXQgLSBwb3MsIFBhZ2VBd2FyZS5ieXRlc0xlZnRJblBhZ2UocG9zKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocG9zID09IHBhZ2VTdGFydCA/IHBhZ2VTdGFydCA6IHBhZ2VMaW1pdCwgUGFnZUF3YXJlLnBhZGRlZChwb3MpKTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9SYW5kb21BY2Nlc3NSZWFkZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9SYW5kb21BY2Nlc3NSZWFkZXJUZXN0LmphdmEKaW5kZXggZjkzM2NmMS4uODUzNTY0NiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvUmFuZG9tQWNjZXNzUmVhZGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1JhbmRvbUFjY2Vzc1JlYWRlclRlc3QuamF2YQpAQCAtMzgsMTcgKzM4LDE5IEBACiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5jb21wcmVzcy5CdWZmZXJUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrLkdsb2JhbC5uYW5vVGltZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCiBwdWJsaWMgY2xhc3MgUmFuZG9tQWNjZXNzUmVhZGVyVGVzdAogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihSYW5kb21BY2Nlc3NSZWFkZXJUZXN0LmNsYXNzKTsKQEAgLTE0MiwxNyArMTQ0LDE2IEBACiAgICAgICAgIFBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IFBhcmFtZXRlcnMoU0laRSwgMSA8PCAyMCk7IC8vIDFNaUIKIAogCi0gICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWwgPSBuZXcgQ2hhbm5lbFByb3h5KCJhYmMiLCBuZXcgRmFrZUZpbGVDaGFubmVsKFNJWkUpKTsKLSAgICAgICAgICAgICBGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoY2hhbm5lbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclR5cGUocGFyYW1zLmJ1ZmZlclR5cGUpLmJ1ZmZlclNpemUocGFyYW1zLmJ1ZmZlclNpemUpOwotICAgICAgICAgICAgIEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIobmV3IEZpbGUoImFiYyIpKS5idWZmZXJUeXBlKHBhcmFtcy5idWZmZXJUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVmZmVyU2l6ZShwYXJhbXMuYnVmZmVyU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbXBsZXRlKGYgLT4gbmV3IENoYW5uZWxQcm94eShmLCBuZXcgRmFrZUZpbGVDaGFubmVsKFNJWkUpKSk7CiAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hhbm5lbC5zaXplKCksIHJlYWRlci5sZW5ndGgoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hhbm5lbC5zaXplKCksIHJlYWRlci5ieXRlc1JlbWFpbmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmaC5jaGFubmVsLnNpemUoKSwgcmVhZGVyLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmaC5jaGFubmVsLnNpemUoKSwgcmVhZGVyLmJ5dGVzUmVtYWluaW5nKCkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuTUFYX1ZBTFVFLCByZWFkZXIuYXZhaWxhYmxlKCkpOwogCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2hhbm5lbC5zaXplKCksIHJlYWRlci5za2lwKGNoYW5uZWwuc2l6ZSgpKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmguY2hhbm5lbC5zaXplKCksIHJlYWRlci5za2lwKGZoLmNoYW5uZWwuc2l6ZSgpKSk7CiAKICAgICAgICAgICAgIGFzc2VydFRydWUocmVhZGVyLmlzRU9GKCkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlYWRlci5ieXRlc1JlbWFpbmluZygpKTsKQEAgLTI5MCwzMCArMjkxLDI4IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0UmVhZEZ1bGx5KFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGZpbmFsIEZpbGUgZiA9IHdyaXRlRmlsZShwYXJhbXMpOwotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmLnBhdGgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclR5cGUocGFyYW1zLmJ1ZmZlclR5cGUpLmJ1ZmZlclNpemUocGFyYW1zLmJ1ZmZlclNpemUpKQorICAgICAgICBGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZikuYnVmZmVyVHlwZShwYXJhbXMuYnVmZmVyVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclNpemUocGFyYW1zLmJ1ZmZlclNpemUpOworICAgICAgICBidWlsZGVyLm1tYXBwZWQocGFyYW1zLm1tYXBwZWRSZWdpb25zKTsKKyAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByZWFkZXIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKICAgICAgICAgewotICAgICAgICAgICAgYnVpbGRlci5tbWFwcGVkKHBhcmFtcy5tbWFwcGVkUmVnaW9ucyk7Ci0gICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7Ci0gICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByZWFkZXIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmLmFic29sdXRlUGF0aCgpLCByZWFkZXIuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmLmxlbmd0aCgpLCByZWFkZXIubGVuZ3RoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGYubGVuZ3RoKCksIHJlYWRlci5ieXRlc1JlbWFpbmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhNYXRoLm1pbihJbnRlZ2VyLk1BWF9WQUxVRSwgZi5sZW5ndGgoKSksIHJlYWRlci5hdmFpbGFibGUoKSk7CisKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbcGFyYW1zLmV4cGVjdGVkLmxlbmd0aF07CisgICAgICAgICAgICBsb25nIG51bVJlYWQgPSAwOworICAgICAgICAgICAgd2hpbGUgKG51bVJlYWQgPCBwYXJhbXMuZmlsZUxlbmd0aCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZi5hYnNvbHV0ZVBhdGgoKSwgcmVhZGVyLmdldFBhdGgoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGYubGVuZ3RoKCksIHJlYWRlci5sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGYubGVuZ3RoKCksIHJlYWRlci5ieXRlc1JlbWFpbmluZygpKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTWF0aC5taW4oSW50ZWdlci5NQVhfVkFMVUUsIGYubGVuZ3RoKCkpLCByZWFkZXIuYXZhaWxhYmxlKCkpOwotCi0gICAgICAgICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVtwYXJhbXMuZXhwZWN0ZWQubGVuZ3RoXTsKLSAgICAgICAgICAgICAgICBsb25nIG51bVJlYWQgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlIChudW1SZWFkIDwgcGFyYW1zLmZpbGVMZW5ndGgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZWFkZXIucmVhZEZ1bGx5KGIpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocGFyYW1zLmV4cGVjdGVkLCBiKSk7Ci0gICAgICAgICAgICAgICAgICAgIG51bVJlYWQgKz0gYi5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWFkZXIuaXNFT0YoKSk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlYWRlci5ieXRlc1JlbWFpbmluZygpKTsKKyAgICAgICAgICAgICAgICByZWFkZXIucmVhZEZ1bGx5KGIpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhwYXJhbXMuZXhwZWN0ZWQsIGIpKTsKKyAgICAgICAgICAgICAgICBudW1SZWFkICs9IGIubGVuZ3RoOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRUcnVlKHJlYWRlci5pc0VPRigpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCByZWFkZXIuYnl0ZXNSZW1haW5pbmcoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMzMSw4ICszMzAsNyBAQAogCiAgICAgICAgIGFzc2VydCBmLmV4aXN0cygpOwogCi0gICAgICAgIHRyeSAoRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGYucGF0aCgpKTsKLSAgICAgICAgICAgICBGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOworICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGYpLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciA9IGZoLmNyZWF0ZVJlYWRlcigpKQogICAgICAgICB7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZi5hYnNvbHV0ZVBhdGgoKSwgcmVhZGVyLmdldFBhdGgoKSk7CkBAIC0zNjIsOCArMzYwLDcgQEAKIAogICAgICAgICBhc3NlcnQgZi5leGlzdHMoKTsKIAotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmLnBhdGgoKSk7Ci0gICAgICAgICAgICAgRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByZWFkZXIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKICAgICAgICAgewogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCgpICogbnVtSXRlcmF0aW9ucywgcmVhZGVyLmxlbmd0aCgpKTsKQEAgLTQ0Miw2MSArNDM5LDU5IEBACiAKICAgICAgICAgYXNzZXJ0IGYuZXhpc3RzKCk7CiAKLSAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZi5wYXRoKCkpKQorICAgICAgICBGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZik7CisgICAgICAgIGZpbmFsIFJ1bm5hYmxlIHdvcmtlciA9ICgpIC0+CiAgICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIHdvcmtlciA9ICgpIC0+CisgICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgIFJhbmRvbUFjY2Vzc1JlYWRlciByZWFkZXIgPSBmaC5jcmVhdGVSZWFkZXIoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmggPSBidWlsZGVyLmNvbXBsZXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gZmguY3JlYXRlUmVhZGVyKCkpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgcmVhZGVyLmxlbmd0aCgpKTsKKworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYiA9IEJ5dGVCdWZmZXJVdGlsLnJlYWQocmVhZGVyLCBleHBlY3RlZC5sZW5ndGgpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYi5hcnJheSgpKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWFkZXIuaXNFT0YoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlYWRlci5ieXRlc1JlbWFpbmluZygpKTsKKworICAgICAgICAgICAgICAgIHJlYWRlci5zZWVrKDApOworICAgICAgICAgICAgICAgIGIgPSBCeXRlQnVmZmVyVXRpbC5yZWFkKHJlYWRlciwgZXhwZWN0ZWQubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGIuYXJyYXkoKSkpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVhZGVyLmlzRU9GKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCByZWFkZXIuYnl0ZXNSZW1haW5pbmcoKSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCByZWFkZXIubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICBpbnQgcG9zID0gci5uZXh0SW50KGV4cGVjdGVkLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIHJlYWRlci5zZWVrKHBvcyk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhwb3MsIHJlYWRlci5nZXRQb3NpdGlvbigpKTsKIAotICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGIgPSBCeXRlQnVmZmVyVXRpbC5yZWFkKHJlYWRlciwgZXhwZWN0ZWQubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBiLmFycmF5KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWFkZXIuaXNFT0YoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCByZWFkZXIuYnl0ZXNSZW1haW5pbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGV4cGVjdGVkLCBwb3MsIGV4cGVjdGVkLmxlbmd0aCAtIHBvcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9yZGVyKEJ5dGVPcmRlci5CSUdfRU5ESUFOKTsKIAotICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2VlaygwKTsKLSAgICAgICAgICAgICAgICAgICAgYiA9IEJ5dGVCdWZmZXJVdGlsLnJlYWQocmVhZGVyLCBleHBlY3RlZC5sZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGIuYXJyYXkoKSkpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlYWRlci5pc0VPRigpKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlYWRlci5ieXRlc1JlbWFpbmluZygpKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3MgPSByLm5leHRJbnQoZXhwZWN0ZWQubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5zZWVrKHBvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocG9zLCByZWFkZXIuZ2V0UG9zaXRpb24oKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmID0gQnl0ZUJ1ZmZlci53cmFwKGV4cGVjdGVkLCBwb3MsIGV4cGVjdGVkLmxlbmd0aCAtIHBvcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vcmRlcihCeXRlT3JkZXIuQklHX0VORElBTik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZWFkZXIuYnl0ZXNSZW1haW5pbmcoKSA+IDQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGJ1Zi5nZXRJbnQoKSwgcmVhZGVyLnJlYWRJbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlYWRlci5ieXRlc1JlbWFpbmluZygpID4gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhidWYuZ2V0SW50KCksIHJlYWRlci5yZWFkSW50KCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWwoZXguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwogCi0gICAgICAgICAgICBpZiAobnVtVGhyZWFkcyA9PSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdvcmtlci5ydW4oKTsKKyAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChudW1UaHJlYWRzKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVRocmVhZHM7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3Iuc3VibWl0KHdvcmtlcik7CisgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgZmFpbChleC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OwogCi0gICAgICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd24oKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShleGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKDEsIFRpbWVVbml0Lk1JTlVURVMpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG51bVRocmVhZHMgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgd29ya2VyLnJ1bigpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChudW1UaHJlYWRzKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtVGhyZWFkczsgaSsrKQorICAgICAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdCh3b3JrZXIpOworCisgICAgICAgICAgICBleGVjdXRvci5zaHV0ZG93bigpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZXhlY3V0b3IuYXdhaXRUZXJtaW5hdGlvbigxLCBUaW1lVW5pdC5NSU5VVEVTKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUxOSwxNiArNTE0LDE0IEBACiAgICAgewogICAgICAgICBQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJzKDgxOTIsIDQwOTYpOwogICAgICAgICBmaW5hbCBGaWxlIGYgPSB3cml0ZUZpbGUocGFyYW1zKTsKLSAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZi5wYXRoKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWZmZXJUeXBlKHBhcmFtcy5idWZmZXJUeXBlKS5idWZmZXJTaXplKHBhcmFtcy5idWZmZXJTaXplKSkKKyAgICAgICAgRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGYpLmJ1ZmZlclR5cGUocGFyYW1zLmJ1ZmZlclR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVmZmVyU2l6ZShwYXJhbXMuYnVmZmVyU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tbWFwcGVkKHBhcmFtcy5tbWFwcGVkUmVnaW9ucyk7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJ1aWxkZXIubW1hcHBlZChwYXJhbXMubW1hcHBlZFJlZ2lvbnMpOwotICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOwotICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gZmguY3JlYXRlUmVhZGVyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlYWRlci5za2lwQnl0ZXMoMCkpOwotICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCByZWFkZXIuc2tpcEJ5dGVzKC0xKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVhZGVyLnNraXBCeXRlcygwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVhZGVyLnNraXBCeXRlcygtMSkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01MzcsNDIgKzUzMCwzOCBAQAogICAgIHsKICAgICAgICAgUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgUGFyYW1ldGVycyg4MTkyLCA0MDk2KTsKICAgICAgICAgZmluYWwgRmlsZSBmID0gd3JpdGVGaWxlKHBhcmFtcyk7Ci0gICAgICAgIHRyeSAoRmlsZUhhbmRsZS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKGYucGF0aCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVmZmVyVHlwZShwYXJhbXMuYnVmZmVyVHlwZSkuYnVmZmVyU2l6ZShwYXJhbXMuYnVmZmVyU2l6ZSkpCisgICAgICAgIEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmKS5idWZmZXJUeXBlKHBhcmFtcy5idWZmZXJUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVmZmVyU2l6ZShwYXJhbXMuYnVmZmVyU2l6ZSk7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKLSAgICAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzUmVhZGVyIHJlYWRlciA9IGZoLmNyZWF0ZVJlYWRlcigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOwotICAgICAgICAgICAgICAgIHJlYWRlci5za2lwQnl0ZXMoMzE0MTUpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhZGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZWFkZXIuc2tpcEJ5dGVzKDMxNDE1KTsKICAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFNraXBCeXRlcyhQYXJhbWV0ZXJzIHBhcmFtcywgaW50IGV4cGVjdGF0aW9uTXVsdGlwbGVzKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIGZpbmFsIEZpbGUgZiA9IHdyaXRlRmlsZShwYXJhbXMpOwotICAgICAgICB0cnkgKEZpbGVIYW5kbGUuQnVpbGRlciBidWlsZGVyID0gbmV3IEZpbGVIYW5kbGUuQnVpbGRlcihmLnBhdGgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclR5cGUocGFyYW1zLmJ1ZmZlclR5cGUpLmJ1ZmZlclNpemUocGFyYW1zLmJ1ZmZlclNpemUpKQorICAgICAgICBGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIoZikuYnVmZmVyVHlwZShwYXJhbXMuYnVmZmVyVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1ZmZlclNpemUocGFyYW1zLmJ1ZmZlclNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tbWFwcGVkKHBhcmFtcy5tbWFwcGVkUmVnaW9ucyk7CisgICAgICAgIHRyeSAoRmlsZUhhbmRsZSBmaCA9IGJ1aWxkZXIuY29tcGxldGUoKTsKKyAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gZmguY3JlYXRlUmVhZGVyKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIGJ1aWxkZXIubW1hcHBlZChwYXJhbXMubW1hcHBlZFJlZ2lvbnMpOwotICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZoID0gYnVpbGRlci5jb21wbGV0ZSgpOwotICAgICAgICAgICAgICAgICBSYW5kb21BY2Nlc3NSZWFkZXIgcmVhZGVyID0gZmguY3JlYXRlUmVhZGVyKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHRvU2tpcCA9IGV4cGVjdGF0aW9uTXVsdGlwbGVzICogcGFyYW1zLmV4cGVjdGVkLmxlbmd0aDsKLSAgICAgICAgICAgICAgICBieXRlW10gYiA9IG5ldyBieXRlW3BhcmFtcy5leHBlY3RlZC5sZW5ndGhdOwotICAgICAgICAgICAgICAgIGxvbmcgbnVtUmVhZCA9IDA7CisgICAgICAgICAgICBpbnQgdG9Ta2lwID0gZXhwZWN0YXRpb25NdWx0aXBsZXMgKiBwYXJhbXMuZXhwZWN0ZWQubGVuZ3RoOworICAgICAgICAgICAgYnl0ZVtdIGIgPSBuZXcgYnl0ZVtwYXJhbXMuZXhwZWN0ZWQubGVuZ3RoXTsKKyAgICAgICAgICAgIGxvbmcgbnVtUmVhZCA9IDA7CiAKLSAgICAgICAgICAgICAgICB3aGlsZSAobnVtUmVhZCA8IHBhcmFtcy5maWxlTGVuZ3RoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRGdWxseShiKTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHBhcmFtcy5leHBlY3RlZCwgYikpOwotICAgICAgICAgICAgICAgICAgICBudW1SZWFkICs9IGIubGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBpbnQgc2tpcHBlZCA9IHJlYWRlci5za2lwQnl0ZXModG9Ta2lwKTsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBleHBlY3RlZFNraXBwZWQgPSBNYXRoLm1heChNYXRoLm1pbih0b1NraXAsIHBhcmFtcy5maWxlTGVuZ3RoIC0gbnVtUmVhZCksIDApOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTa2lwcGVkLCBza2lwcGVkKTsKLSAgICAgICAgICAgICAgICAgICAgbnVtUmVhZCArPSBza2lwcGVkOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChudW1SZWFkIDwgcGFyYW1zLmZpbGVMZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRGdWxseShiKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocGFyYW1zLmV4cGVjdGVkLCBiKSk7CisgICAgICAgICAgICAgICAgbnVtUmVhZCArPSBiLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBpbnQgc2tpcHBlZCA9IHJlYWRlci5za2lwQnl0ZXModG9Ta2lwKTsKKyAgICAgICAgICAgICAgICBsb25nIGV4cGVjdGVkU2tpcHBlZCA9IE1hdGgubWF4KE1hdGgubWluKHRvU2tpcCwgcGFyYW1zLmZpbGVMZW5ndGggLSBudW1SZWFkKSwgMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU2tpcHBlZCwgc2tpcHBlZCk7CisgICAgICAgICAgICAgICAgbnVtUmVhZCArPSBza2lwcGVkOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvU2l6ZWRJbnRzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3V0aWwvU2l6ZWRJbnRzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhM2E5NTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9TaXplZEludHNUZXN0LmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRW5kaWFuVXRpbHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQXJyYXlVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkdlbmVyYXRvcnM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLnF1aWNrdGhlb3JpZXMuUXVpY2tUaGVvcnkucXQ7CitpbXBvcnQgc3RhdGljIG9yZy5xdWlja3RoZW9yaWVzLmdlbmVyYXRvcnMuU291cmNlRFNMLmxvbmdzOworCitwdWJsaWMgY2xhc3MgU2l6ZWRJbnRzVGVzdAoreworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBub25aZXJvU2l6ZSgpCisgICAgeworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFNpemVkSW50cy5ub25aZXJvU2l6ZSgxKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTaXplZEludHMubm9uWmVyb1NpemUoMTI3KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTaXplZEludHMubm9uWmVyb1NpemUoLTEyNykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDEyOCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2l6ZWRJbnRzLm5vblplcm9TaXplKC0xMjgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIFNpemVkSW50cy5ub25aZXJvU2l6ZSgtMTI5KSk7CisgICAgICAgIGFzc2VydEVxdWFscyg4LCBTaXplZEludHMubm9uWmVyb1NpemUoMHg3ZmZmZmZmZmZmZmZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoOCwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZmZmZmZmZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNywgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZmZmZmZmZmZmZMKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBTaXplZEludHMubm9uWmVyb1NpemUoMHg3ZmZmZmZmZmZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZmZmZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZmZmZmZmZMKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg1LCBTaXplZEludHMubm9uWmVyb1NpemUoMHg3ZmZmZmZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZmZmZMKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBTaXplZEludHMubm9uWmVyb1NpemUoMHg3ZmZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmZmZMKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBTaXplZEludHMubm9uWmVyb1NpemUoMHg3ZmZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZmTCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2l6ZWRJbnRzLm5vblplcm9TaXplKDB4N2ZMKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTaXplZEludHMubm9uWmVyb1NpemUoMHg3TCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2l6ZUFsbG93aW5nWmVybygpCisgICAgeworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgU2l6ZWRJbnRzLnNpemVBbGxvd2luZ1plcm8oMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2l6ZWRJbnRzLnNpemVBbGxvd2luZ1plcm8oMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgU2l6ZWRJbnRzLnNpemVBbGxvd2luZ1plcm8oMTI3KSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBTaXplZEludHMuc2l6ZUFsbG93aW5nWmVybygtMTI3KSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBTaXplZEludHMuc2l6ZUFsbG93aW5nWmVybygxMjgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIFNpemVkSW50cy5zaXplQWxsb3dpbmdaZXJvKC0xMjgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIFNpemVkSW50cy5zaXplQWxsb3dpbmdaZXJvKC0xMjkpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVhZFdyaXRlKCkKKyAgICB7CisgICAgICAgIHRyeSAoRGF0YU91dHB1dEJ1ZmZlciBvdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcig4KSkKKyAgICAgICAgeworICAgICAgICAgICAgcXQoKS5mb3JBbGwoR2VuZXJhdG9ycy5ieXRlcygxLCA4KS5tYXAoYmIgLT4gbmV3IEJpZ0ludGVnZXIoQnl0ZUJ1ZmZlclV0aWwuZ2V0QXJyYXkoYmIpKS5sb25nVmFsdWUoKSkubWl4KGxvbmdzKCkuYWxsKCkpKS5jaGVjayh2IC0+IHsKKyAgICAgICAgICAgICAgICBvdXQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFNpemVkSW50cy53cml0ZShvdXQsIHYsIFNpemVkSW50cy5zaXplQWxsb3dpbmdaZXJvKHYpKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgciA9IFNpemVkSW50cy5yZWFkKG91dC5hc05ld0J1ZmZlcigpLCAwLCBTaXplZEludHMuc2l6ZUFsbG93aW5nWmVybyh2KSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ID09IHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgVGhyb3dhYmxlcy5jbGVhbmVkKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWFkV3JpdGVVbnNpZ25lZCgpCisgICAgeworICAgICAgICB0cnkgKERhdGFPdXRwdXRCdWZmZXIgb3V0ID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWYxID0gbmV3IGJ5dGVbOF07CisgICAgICAgICAgICBieXRlW10gYnVmMiA9IG5ldyBieXRlWzhdOworICAgICAgICAgICAgcXQoKS5mb3JBbGwoR2VuZXJhdG9ycy5ieXRlcygxLCA4KS5tYXAoYmIgLT4gbmV3IEJpZ0ludGVnZXIoQnl0ZUJ1ZmZlclV0aWwuZ2V0QXJyYXkoYmIpKS5sb25nVmFsdWUoKSkubWl4KGxvbmdzKCkuYWxsKCkpKS5jaGVjayh2IC0+IHsKKyAgICAgICAgICAgICAgICBvdXQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gU2l6ZWRJbnRzLnNpemVBbGxvd2luZ1plcm8odik7CisgICAgICAgICAgICAgICAgICAgIEVuZGlhblV0aWxzLndyaXRlU3dhcHBlZExvbmcoYnVmMSwgMCwgdik7CisgICAgICAgICAgICAgICAgICAgIFNpemVkSW50cy53cml0ZShvdXQsIHYsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyByID0gU2l6ZWRJbnRzLnJlYWRVbnNpZ25lZChvdXQuYXNOZXdCdWZmZXIoKSwgMCwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIEVuZGlhblV0aWxzLndyaXRlU3dhcHBlZExvbmcoYnVmMiwgMCwgcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCeXRlQXJyYXlVdGlsLmNvbXBhcmVVbnNpZ25lZChidWYxLCAwLCBidWYyLCAwLCBzaXplKSA9PSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMuY2xlYW5lZChlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9UYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9UYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiNjVhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1RhaWxPdmVycmlkaW5nUmVidWZmZXJlclRlc3QuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLkFyZ3VtZW50TWF0Y2hlcnMuYW55TG9uZzsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5yZXNldDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by52ZXJpZnk7CitpbXBvcnQgc3RhdGljIG9yZy5tb2NraXRvLk1vY2tpdG8ud2hlbjsKKworCitwdWJsaWMgY2xhc3MgVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyVGVzdAoreworICAgIEJ5dGVCdWZmZXIgaGVhZCA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdeyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4IH0pOworICAgIEJ5dGVCdWZmZXIgdGFpbCA9IEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdeyA5LCAxMCB9KTsKKworICAgIFJlYnVmZmVyZXIgciA9IE1vY2tpdG8ubW9jayhSZWJ1ZmZlcmVyLmNsYXNzKTsKKyAgICBSZWJ1ZmZlcmVyLkJ1ZmZlckhvbGRlciBiaCA9IE1vY2tpdG8ubW9jayhSZWJ1ZmZlcmVyLkJ1ZmZlckhvbGRlci5jbGFzcyk7CisKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmUoKQorICAgIHsKKyAgICAgICAgcmVzZXQociwgYmgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc0xlZnRUb1RhaWxGdWxseSgpCisgICAgeworICAgICAgICB3aGVuKHIucmVidWZmZXIoYW55TG9uZygpKSkudGhlblJldHVybihiaCk7CisgICAgICAgIHdoZW4oYmguYnVmZmVyKCkpLnRoZW5SZXR1cm4oaGVhZC5kdXBsaWNhdGUoKSk7CisgICAgICAgIHdoZW4oYmgub2Zmc2V0KCkpLnRoZW5SZXR1cm4oMEwpOworICAgICAgICBSZWJ1ZmZlcmVyIHRvciA9IG5ldyBUYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXIociwgOCwgdGFpbC5kdXBsaWNhdGUoKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYnVmZmVyZXIuQnVmZmVySG9sZGVyIGJoID0gdG9yLnJlYnVmZmVyKGkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGhlYWQsIGJoLmJ1ZmZlcigpKTsKKyAgICAgICAgICAgIGJoLnJlbGVhc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygxMCwgdG9yLmZpbGVMZW5ndGgoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzTGVmdFRvVGFpbFBhcnRpYWwoKQorICAgIHsKKyAgICAgICAgd2hlbihyLnJlYnVmZmVyKGFueUxvbmcoKSkpLnRoZW5SZXR1cm4oYmgpOworICAgICAgICB3aGVuKGJoLmJ1ZmZlcigpKS50aGVuUmV0dXJuKGhlYWQuZHVwbGljYXRlKCkpOworICAgICAgICB3aGVuKGJoLm9mZnNldCgpKS50aGVuUmV0dXJuKDJMKTsKKyAgICAgICAgUmVidWZmZXJlciB0b3IgPSBuZXcgVGFpbE92ZXJyaWRpbmdSZWJ1ZmZlcmVyKHIsIDgsIHRhaWwuZHVwbGljYXRlKCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBSZWJ1ZmZlcmVyLkJ1ZmZlckhvbGRlciBiaCA9IHRvci5yZWJ1ZmZlcihpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhoZWFkLmxpbWl0KDYpLCBiaC5idWZmZXIoKSk7CisgICAgICAgICAgICBiaC5yZWxlYXNlKCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIHRvci5maWxlTGVuZ3RoKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2Vzc1JpZ2h0VG9UYWlsKCkKKyAgICB7CisgICAgICAgIHdoZW4oci5yZWJ1ZmZlcihhbnlMb25nKCkpKS50aGVuUmV0dXJuKGJoKTsKKyAgICAgICAgd2hlbihiaC5idWZmZXIoKSkudGhlblJldHVybihoZWFkLmR1cGxpY2F0ZSgpKTsKKyAgICAgICAgd2hlbihiaC5vZmZzZXQoKSkudGhlblJldHVybigwTCk7CisgICAgICAgIFJlYnVmZmVyZXIgdG9yID0gbmV3IFRhaWxPdmVycmlkaW5nUmVidWZmZXJlcihyLCA4LCB0YWlsLmR1cGxpY2F0ZSgpKTsKKworICAgICAgICBmb3IgKGludCBpID0gODsgaSA8IDEwOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFJlYnVmZmVyZXIuQnVmZmVySG9sZGVyIGJoID0gdG9yLnJlYnVmZmVyKGkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRhaWwsIGJoLmJ1ZmZlcigpKTsKKyAgICAgICAgICAgIGJoLnJlbGVhc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygxMCwgdG9yLmZpbGVMZW5ndGgoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3RoZXJNZXRob2RzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBSZWJ1ZmZlcmVyIHRvciA9IG5ldyBUYWlsT3ZlcnJpZGluZ1JlYnVmZmVyZXIociwgOCwgdGFpbC5kdXBsaWNhdGUoKSk7CisKKyAgICAgICAgRmlsZSB0bXAgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoImZha2VDaGFubmVsUHJveHkiLCAiIik7CisgICAgICAgIHRyeSAoQ2hhbm5lbFByb3h5IGNoYW5uZWxQcm94eSA9IG5ldyBDaGFubmVsUHJveHkodG1wKSkKKyAgICAgICAgeworICAgICAgICAgICAgd2hlbihyLmNoYW5uZWwoKSkudGhlblJldHVybihjaGFubmVsUHJveHkpOworICAgICAgICAgICAgYXNzZXJ0U2FtZShjaGFubmVsUHJveHksIHRvci5jaGFubmVsKCkpOworICAgICAgICAgICAgdmVyaWZ5KHIpLmNoYW5uZWwoKTsKKyAgICAgICAgICAgIHJlc2V0KHIpOworICAgICAgICB9CisKKyAgICAgICAgdG9yLmNsb3NlUmVhZGVyKCk7CisgICAgICAgIHZlcmlmeShyKS5jbG9zZVJlYWRlcigpOworICAgICAgICByZXNldChyKTsKKworICAgICAgICB0b3IuY2xvc2UoKTsKKyAgICAgICAgdmVyaWZ5KHIpLmNsb3NlKCk7CisgICAgICAgIHJlc2V0KHIpOworCisgICAgICAgIHdoZW4oci5nZXRDcmNDaGVja0NoYW5jZSgpKS50aGVuUmV0dXJuKDAuMTIzZCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLjEyM2QsIHRvci5nZXRDcmNDaGVja0NoYW5jZSgpLCAwKTsKKyAgICAgICAgdmVyaWZ5KHIpLmdldENyY0NoZWNrQ2hhbmNlKCk7CisgICAgICAgIHJlc2V0KHIpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9XcmFwcGluZ1JlYnVmZmVyZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vdXRpbC9XcmFwcGluZ1JlYnVmZmVyZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ0NDhjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby91dGlsL1dyYXBwaW5nUmVidWZmZXJlclRlc3QuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdEV4Y2VwdGlvbk9mVHlwZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgV3JhcHBpbmdSZWJ1ZmZlcmVyVGVzdAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYnVmZmVyUmVsZWFzZSgpCisgICAgeworICAgICAgICBUZXN0UmVidWZmZXJlciBtb2NrID0gbmV3IFRlc3RSZWJ1ZmZlcmVyKCk7CisgICAgICAgIHRyeSAoV3JhcHBpbmdSZWJ1ZmZlcmVyIHJlYnVmZmVyZXIgPSBuZXcgV3JhcHBpbmdSZWJ1ZmZlcmVyKG1vY2spCisgICAgICAgIHsKKyAgICAgICAgfSkKKyAgICAgICAgeworICAgICAgICAgICAgUmVidWZmZXJlci5CdWZmZXJIb2xkZXIgcmV0ID0gcmVidWZmZXJlci5yZWJ1ZmZlcigwKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmV0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhtb2NrLmJ1ZmZlcigpLCByZXQuYnVmZmVyKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1vY2sub2Zmc2V0KCksIHJldC5vZmZzZXQoKSk7CisKKyAgICAgICAgICAgIHJldC5yZWxlYXNlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1vY2sucmVsZWFzZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVidWZmZXJSZWxlYXNlRmFpbGluZ0NvbnRyYWN0KCkKKyAgICB7CisgICAgICAgIFRlc3RSZWJ1ZmZlcmVyIG1vY2sgPSBuZXcgVGVzdFJlYnVmZmVyZXIoKTsKKyAgICAgICAgdHJ5IChXcmFwcGluZ1JlYnVmZmVyZXIgcmVidWZmZXJlciA9IG5ldyBXcmFwcGluZ1JlYnVmZmVyZXIobW9jaykKKyAgICAgICAgeworICAgICAgICB9KQorICAgICAgICB7CisgICAgICAgICAgICBSZWJ1ZmZlcmVyLkJ1ZmZlckhvbGRlciByZXQxID0gcmVidWZmZXJlci5yZWJ1ZmZlcigwKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmV0MSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobW9jay5idWZmZXIoKSwgcmV0MS5idWZmZXIoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobW9jay5vZmZzZXQoKSwgcmV0MS5vZmZzZXQoKSk7CisKKyAgICAgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQXNzZXJ0aW9uRXJyb3IuY2xhc3MpLmlzVGhyb3duQnkoKCkgLT4gcmVidWZmZXJlci5yZWJ1ZmZlcigxKSk7CisgICAgICAgICAgICByZXQxLnJlbGVhc2UoKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtb2NrLnJlbGVhc2VkKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQXNzZXJ0aW9uRXJyb3IuY2xhc3MpLmlzVGhyb3duQnkocmV0MTo6YnVmZmVyKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQXNzZXJ0aW9uRXJyb3IuY2xhc3MpLmlzVGhyb3duQnkocmV0MTo6b2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYnVmZmVyUmVsZWFzZUZhaWxpbmdDb250cmFjdFdoZW5DbG9zaW5nKCkKKyAgICB7CisgICAgICAgIGFzc2VydFRoYXRFeGNlcHRpb25PZlR5cGUoQXNzZXJ0aW9uRXJyb3IuY2xhc3MpLmlzVGhyb3duQnkoKCkgLT4geworICAgICAgICAgICAgVGVzdFJlYnVmZmVyZXIgbW9jayA9IG5ldyBUZXN0UmVidWZmZXJlcigpOworICAgICAgICAgICAgdHJ5IChXcmFwcGluZ1JlYnVmZmVyZXIgcmVidWZmZXJlciA9IG5ldyBXcmFwcGluZ1JlYnVmZmVyZXIobW9jaykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUmVidWZmZXJlci5CdWZmZXJIb2xkZXIgcmV0MSA9IHJlYnVmZmVyZXIucmVidWZmZXIoMCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXQxKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobW9jay5idWZmZXIoKSwgcmV0MS5idWZmZXIoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1vY2sub2Zmc2V0KCksIHJldDEub2Zmc2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RSZWJ1ZmZlcmVyIGltcGxlbWVudHMgUmVidWZmZXJlciwgUmVidWZmZXJlci5CdWZmZXJIb2xkZXIKKyAgICB7CisgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXIgYnVmZmVyOworICAgICAgICBib29sZWFuIHJlbGVhc2VkOworICAgICAgICBsb25nIG9mZnNldDsKKworICAgICAgICBUZXN0UmVidWZmZXJlcigpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgwKTsKKyAgICAgICAgICAgIHRoaXMucmVsZWFzZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2hhbm5lbFByb3h5IGNoYW5uZWwoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBidWZmZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgZmlsZUxlbmd0aCgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXIucmVtYWluaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZG91YmxlIGdldENyY0NoZWNrQ2hhbmNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQnVmZmVySG9sZGVyIHJlYnVmZmVyKGxvbmcgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIG9mZnNldCA9IHBvc2l0aW9uOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBvZmZzZXQoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVsZWFzZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGFkanVzdEV4dGVybmFsKGxvbmcgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGFkanVzdEludGVybmFsKGxvbmcgcG9zaXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gbm90aGluZworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2VSZWFkZXIoKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub3RoaW5nCisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvQWxpYmFiYUNsb3VkU25pdGNoVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvQWxpYmFiYUNsb3VkU25pdGNoVGVzdC5qYXZhCmluZGV4IDA0NTQwY2YuLjgyMTA4ZjIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL0FsaWJhYmFDbG91ZFNuaXRjaFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9BbGliYWJhQ2xvdWRTbml0Y2hUZXN0LmphdmEKQEAgLTM2LDYgKzM2LDcgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHMuY2xlYW51cDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzLm1rZGlyczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5HT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIHB1YmxpYyBjbGFzcyBBbGliYWJhQ2xvdWRTbml0Y2hUZXN0IApAQCAtNDUsNyArNDYsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShHb3NzaXBlci5Qcm9wcy5ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OLCAidHJ1ZSIpOworICAgICAgICBHT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTi5zZXRCb29sZWFuKHRydWUpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLnN0YXJ0KCk7CiAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5zZWdtZW50TWFuYWdlci5hd2FpdE1hbmFnZW1lbnRUYXNrc0NvbXBsZXRpb24oKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL0Nsb3Vkc3RhY2tTbml0Y2hUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9DbG91ZHN0YWNrU25pdGNoVGVzdC5qYXZhCmluZGV4IDUxZTgzNzEuLmUxNjdlOTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL0Nsb3Vkc3RhY2tTbml0Y2hUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvQ2xvdWRzdGFja1NuaXRjaFRlc3QuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlscy5jbGVhbnVwOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHMubWtkaXJzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogcHVibGljIGNsYXNzIENsb3Vkc3RhY2tTbml0Y2hUZXN0CkBAIC00Niw3ICs0Nyw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KEdvc3NpcGVyLlByb3BzLkRJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04sICJ0cnVlIik7CisgICAgICAgIEdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RhcnQoKTsKICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLnNlZ21lbnRNYW5hZ2VyLmF3YWl0TWFuYWdlbWVudFRhc2tzQ29tcGxldGlvbigpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvRUMyU25pdGNoVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvRUMyU25pdGNoVGVzdC5qYXZhCmluZGV4IDY5YzEyODcuLjc4YzVkNDAgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL0VDMlNuaXRjaFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9FQzJTbml0Y2hUZXN0LmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHMuY2xlYW51cDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzLm1rZGlyczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5HT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5FYzJTbml0Y2guRUMyX05BTUlOR19MRUdBQ1k7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCkBAIC02MCw3ICs2MSw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KEdvc3NpcGVyLlByb3BzLkRJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04sICJ0cnVlIik7CisgICAgICAgIEdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RhcnQoKTsKICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLnNlZ21lbnRNYW5hZ2VyLmF3YWl0TWFuYWdlbWVudFRhc2tzQ29tcGxldGlvbigpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvR29vZ2xlQ2xvdWRTbml0Y2hUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9Hb29nbGVDbG91ZFNuaXRjaFRlc3QuamF2YQppbmRleCA2NzE5MmJkLi4xZmRmZDFjIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9Hb29nbGVDbG91ZFNuaXRjaFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9Hb29nbGVDbG91ZFNuaXRjaFRlc3QuamF2YQpAQCAtMzgsNiArMzgsNyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlscy5jbGVhbnVwOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHMubWtkaXJzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogcHVibGljIGNsYXNzIEdvb2dsZUNsb3VkU25pdGNoVGVzdApAQCAtNDcsNyArNDgsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShHb3NzaXBlci5Qcm9wcy5ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OLCAidHJ1ZSIpOworICAgICAgICBHT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTi5zZXRCb29sZWFuKHRydWUpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICAgICAgQ29tbWl0TG9nLmluc3RhbmNlLnN0YXJ0KCk7CiAgICAgICAgIENvbW1pdExvZy5pbnN0YW5jZS5zZWdtZW50TWFuYWdlci5hd2FpdE1hbmFnZW1lbnRUYXNrc0NvbXBsZXRpb24oKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1Byb3BlcnR5RmlsZVNuaXRjaFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9sb2NhdG9yL1Byb3BlcnR5RmlsZVNuaXRjaFRlc3QuamF2YQppbmRleCAyM2JjZjFiLi5hZjllOTcwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9Qcm9wZXJ0eUZpbGVTbml0Y2hUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvUHJvcGVydHlGaWxlU25pdGNoVGVzdC5qYXZhCkBAIC00OSw2ICs0OSw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuR09TU0lQX0RJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT047CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKIAogLyoqCkBAIC03MSw3ICs3Miw3IEBACiAgICAgQEJlZm9yZQogICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoR29zc2lwZXIuUHJvcHMuRElTQUJMRV9USFJFQURfVkFMSURBVElPTiwgInRydWUiKTsKKyAgICAgICAgR09TU0lQX0RJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04uc2V0Qm9vbGVhbih0cnVlKTsKICAgICAgICAgU3RyaW5nIGNvbmZGaWxlID0gRkJVdGlsaXRpZXMucmVzb3VyY2VUb0ZpbGUoUHJvcGVydHlGaWxlU25pdGNoLlNOSVRDSF9QUk9QRVJUSUVTX0ZJTEVOQU1FKTsKICAgICAgICAgZWZmZWN0aXZlRmlsZSA9IFBhdGhzLmdldChjb25mRmlsZSk7CiAgICAgICAgIGJhY2t1cEZpbGUgPSBQYXRocy5nZXQoY29uZkZpbGUgKyAiLmJhayIpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvU2ltcGxlU2VlZFByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL2xvY2F0b3IvU2ltcGxlU2VlZFByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYTIxNmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbG9jYXRvci9TaW1wbGVTZWVkUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvcjsKKworaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuUGFyYW1ldGVyaXplZENsYXNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tlZFN0YXRpYzsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLkFycmF5cy5hc0xpc3Q7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLlNpbXBsZVNlZWRQcm92aWRlci5SRVNPTFZFX01VTFRJUExFX0lQX0FERFJFU1NFU19QRVJfRE5TX1JFQ09SRF9LRVk7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuU2ltcGxlU2VlZFByb3ZpZGVyLlNFRURTX0tFWTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by5tb2NrU3RhdGljOworCitwdWJsaWMgY2xhc3MgU2ltcGxlU2VlZFByb3ZpZGVyVGVzdAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBkbnNOYW1lMSA9ICJkbnMtbmFtZS0xIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZG5zTmFtZTIgPSAiZG5zLW5hbWUtMiI7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWVkc1Jlc29sdXRpb24oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBNb2NrZWRTdGF0aWM8SW5ldEFkZHJlc3NBbmRQb3J0PiBpbmV0QWRkcmVzc0FuZFBvcnRNb2NrID0gbnVsbDsKKyAgICAgICAgTW9ja2VkU3RhdGljPERhdGFiYXNlRGVzY3JpcHRvcj4gZGVzY3JpcHRvck1vY2sgPSBudWxsOworICAgICAgICBNb2NrZWRTdGF0aWM8RkJVdGlsaXRpZXM+IGZiVXRpbGl0aWVzTW9jayA9IG51bGw7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVbXSBhZGRyZXNzQnl0ZXMxID0gbmV3IGJ5dGVbXXsgMTI3LCAwLCAwLCAxIH07CisgICAgICAgICAgICBieXRlW10gYWRkcmVzc0J5dGVzMiA9IG5ldyBieXRlW117IDEyNywgMCwgMCwgMiB9OworICAgICAgICAgICAgYnl0ZVtdIGFkZHJlc3NCeXRlczMgPSBuZXcgYnl0ZVtdeyAxMjcsIDAsIDAsIDMgfTsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBhZGRyZXNzMSA9IG5ldyBJbmV0QWRkcmVzc0FuZFBvcnQoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGFkZHJlc3NCeXRlczEpLCBhZGRyZXNzQnl0ZXMxLCA3MDAwKTsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBhZGRyZXNzMiA9IG5ldyBJbmV0QWRkcmVzc0FuZFBvcnQoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGFkZHJlc3NCeXRlczIpLCBhZGRyZXNzQnl0ZXMyLCA3MDAwKTsKKyAgICAgICAgICAgIEluZXRBZGRyZXNzQW5kUG9ydCBhZGRyZXNzMyA9IG5ldyBJbmV0QWRkcmVzc0FuZFBvcnQoSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGFkZHJlc3NCeXRlczMpLCBhZGRyZXNzQnl0ZXMzLCA3MDAwKTsKKworICAgICAgICAgICAgaW5ldEFkZHJlc3NBbmRQb3J0TW9jayA9IG1vY2tTdGF0aWMoSW5ldEFkZHJlc3NBbmRQb3J0LmNsYXNzKTsKKyAgICAgICAgICAgIGluZXRBZGRyZXNzQW5kUG9ydE1vY2sud2hlbigoKSAtPiBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKGRuc05hbWUxKSkudGhlblJldHVybihhZGRyZXNzMSk7CisgICAgICAgICAgICBpbmV0QWRkcmVzc0FuZFBvcnRNb2NrLndoZW4oKCkgLT4gSW5ldEFkZHJlc3NBbmRQb3J0LmdldEFsbEJ5TmFtZShkbnNOYW1lMSkpLnRoZW5SZXR1cm4oc2luZ2xldG9uTGlzdChhZGRyZXNzMSkpOworICAgICAgICAgICAgaW5ldEFkZHJlc3NBbmRQb3J0TW9jay53aGVuKCgpIC0+IEluZXRBZGRyZXNzQW5kUG9ydC5nZXRBbGxCeU5hbWUoZG5zTmFtZTIpKS50aGVuUmV0dXJuKGFzTGlzdChhZGRyZXNzMiwgYWRkcmVzczMpKTsKKyAgICAgICAgICAgIGluZXRBZGRyZXNzQW5kUG9ydE1vY2sud2hlbigoKSAtPiBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKGRuc05hbWUyKSkudGhlblJldHVybihhZGRyZXNzMik7CisKKyAgICAgICAgICAgIGZiVXRpbGl0aWVzTW9jayA9IG1vY2tTdGF0aWMoRkJVdGlsaXRpZXMuY2xhc3MpOworICAgICAgICAgICAgZmJVdGlsaXRpZXNNb2NrLndoZW4oRkJVdGlsaXRpZXM6OmdldExvY2FsQWRkcmVzc0FuZFBvcnQpLnRoZW5SZXR1cm4oYWRkcmVzczEpOworCisgICAgICAgICAgICBkZXNjcmlwdG9yTW9jayA9IG1vY2tTdGF0aWMoRGF0YWJhc2VEZXNjcmlwdG9yLmNsYXNzKTsKKworICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBzZWVkUHJvdmlkZXJBcmdzID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gZG5zIDEgd2l0aG91dCBtdWx0aXBsZSBpcHMgcGVyIHJlY29yZAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHNlZWRQcm92aWRlckFyZ3MucHV0KFNFRURTX0tFWSwgZG5zTmFtZTEpOworICAgICAgICAgICAgLy8gcmVzb2x2ZV9tdWx0aXBsZV9pcF9hZGRyZXNzZXNfcGVyX2Ruc19yZWNvcmQgaXMgaW1wbGljaXRseSBmYWxzZSBoZXJlCisKKyAgICAgICAgICAgIGRlc2NyaXB0b3JNb2NrLndoZW4oRGF0YWJhc2VEZXNjcmlwdG9yOjpsb2FkQ29uZmlnKS50aGVuUmV0dXJuKGdldENvbmZpZyhzZWVkUHJvdmlkZXJBcmdzKSk7CisgICAgICAgICAgICBTaW1wbGVTZWVkUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgU2ltcGxlU2VlZFByb3ZpZGVyKG51bGwpOworICAgICAgICAgICAgTGlzdDxJbmV0QWRkcmVzc0FuZFBvcnQ+IHNlZWRzID0gcHJvdmlkZXIuZ2V0U2VlZHMoKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlZWRzLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYWRkcmVzczEsIHNlZWRzLmdldCgwKSk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBkbnMgMiB3aXRob3V0IG11bHRpcGxlIGlwcyBwZXIgcmVjb3JkCisgICAgICAgICAgICAvLworICAgICAgICAgICAgc2VlZFByb3ZpZGVyQXJncy5wdXQoU0VFRFNfS0VZLCBkbnNOYW1lMik7CisgICAgICAgICAgICAvLyByZXNvbHZlX211bHRpcGxlX2lwX2FkZHJlc3Nlc19wZXJfZG5zX3JlY29yZCBpcyBpbXBsaWNpdGx5IGZhbHNlIGhlcmUKKworICAgICAgICAgICAgZGVzY3JpcHRvck1vY2sud2hlbihEYXRhYmFzZURlc2NyaXB0b3I6OmxvYWRDb25maWcpLnRoZW5SZXR1cm4oZ2V0Q29uZmlnKHNlZWRQcm92aWRlckFyZ3MpKTsKKyAgICAgICAgICAgIHByb3ZpZGVyID0gbmV3IFNpbXBsZVNlZWRQcm92aWRlcihudWxsKTsKKyAgICAgICAgICAgIHNlZWRzID0gcHJvdmlkZXIuZ2V0U2VlZHMoKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlZWRzLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHNlZWRzLmNvbnRhaW5zKGFkZHJlc3MyKSk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBkbnMgMSB3aXRoIG11bHRpcGxlIGlwcyBwZXIgcmVjb3JkCisgICAgICAgICAgICAvLworICAgICAgICAgICAgc2VlZFByb3ZpZGVyQXJncy5wdXQoU0VFRFNfS0VZLCBkbnNOYW1lMSk7CisgICAgICAgICAgICBzZWVkUHJvdmlkZXJBcmdzLnB1dChSRVNPTFZFX01VTFRJUExFX0lQX0FERFJFU1NFU19QRVJfRE5TX1JFQ09SRF9LRVksICJ0cnVlIik7CisKKyAgICAgICAgICAgIGRlc2NyaXB0b3JNb2NrLndoZW4oRGF0YWJhc2VEZXNjcmlwdG9yOjpsb2FkQ29uZmlnKS50aGVuUmV0dXJuKGdldENvbmZpZyhzZWVkUHJvdmlkZXJBcmdzKSk7CisgICAgICAgICAgICBwcm92aWRlciA9IG5ldyBTaW1wbGVTZWVkUHJvdmlkZXIobnVsbCk7CisgICAgICAgICAgICBzZWVkcyA9IHByb3ZpZGVyLmdldFNlZWRzKCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBzZWVkcy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFkZHJlc3MxLCBzZWVkcy5nZXQoMCkpOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gZG5zIDIgd2l0aCBtdWx0aXBsZSBpcHMgcGVyIHJlY29yZAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHNlZWRQcm92aWRlckFyZ3MucHV0KFNFRURTX0tFWSwgZG5zTmFtZTIpOworICAgICAgICAgICAgc2VlZFByb3ZpZGVyQXJncy5wdXQoUkVTT0xWRV9NVUxUSVBMRV9JUF9BRERSRVNTRVNfUEVSX0ROU19SRUNPUkRfS0VZLCAidHJ1ZSIpOworCisgICAgICAgICAgICBkZXNjcmlwdG9yTW9jay53aGVuKERhdGFiYXNlRGVzY3JpcHRvcjo6bG9hZENvbmZpZykudGhlblJldHVybihnZXRDb25maWcoc2VlZFByb3ZpZGVyQXJncykpOworICAgICAgICAgICAgcHJvdmlkZXIgPSBuZXcgU2ltcGxlU2VlZFByb3ZpZGVyKG51bGwpOworICAgICAgICAgICAgc2VlZHMgPSBwcm92aWRlci5nZXRTZWVkcygpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc2VlZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc2VlZHMuY29udGFpbnNBbGwoYXNMaXN0KGFkZHJlc3MyLCBhZGRyZXNzMykpKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGRucyAxIGFuZCBkbnMgMiB3aXRob3V0IG11bHRpcGxlIGlwcyBwZXIgcmVjb3JkCisgICAgICAgICAgICAvLworICAgICAgICAgICAgc2VlZFByb3ZpZGVyQXJncy5wdXQoU0VFRFNfS0VZLCBmb3JtYXQoIiVzLCVzIiwgZG5zTmFtZTEsIGRuc05hbWUyKSk7CisgICAgICAgICAgICBzZWVkUHJvdmlkZXJBcmdzLnB1dChSRVNPTFZFX01VTFRJUExFX0lQX0FERFJFU1NFU19QRVJfRE5TX1JFQ09SRF9LRVksICJmYWxzZSIpOworCisgICAgICAgICAgICBkZXNjcmlwdG9yTW9jay53aGVuKERhdGFiYXNlRGVzY3JpcHRvcjo6bG9hZENvbmZpZykudGhlblJldHVybihnZXRDb25maWcoc2VlZFByb3ZpZGVyQXJncykpOworICAgICAgICAgICAgcHJvdmlkZXIgPSBuZXcgU2ltcGxlU2VlZFByb3ZpZGVyKG51bGwpOworICAgICAgICAgICAgc2VlZHMgPSBwcm92aWRlci5nZXRTZWVkcygpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc2VlZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoc2VlZHMuY29udGFpbnNBbGwoYXNMaXN0KGFkZHJlc3MxLCBhZGRyZXNzMikpKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGRucyAxIGFuZCBkbnMgMiB3aXRoIG11bHRpcGxlIGlwcyBwZXIgcmVjb3JkCisgICAgICAgICAgICAvLworICAgICAgICAgICAgc2VlZFByb3ZpZGVyQXJncy5wdXQoU0VFRFNfS0VZLCBmb3JtYXQoIiVzLCVzIiwgZG5zTmFtZTEsIGRuc05hbWUyKSk7CisgICAgICAgICAgICBzZWVkUHJvdmlkZXJBcmdzLnB1dChSRVNPTFZFX01VTFRJUExFX0lQX0FERFJFU1NFU19QRVJfRE5TX1JFQ09SRF9LRVksICJ0cnVlIik7CisKKyAgICAgICAgICAgIGRlc2NyaXB0b3JNb2NrLndoZW4oRGF0YWJhc2VEZXNjcmlwdG9yOjpsb2FkQ29uZmlnKS50aGVuUmV0dXJuKGdldENvbmZpZyhzZWVkUHJvdmlkZXJBcmdzKSk7CisgICAgICAgICAgICBwcm92aWRlciA9IG5ldyBTaW1wbGVTZWVkUHJvdmlkZXIobnVsbCk7CisgICAgICAgICAgICBzZWVkcyA9IHByb3ZpZGVyLmdldFNlZWRzKCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBzZWVkcy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShzZWVkcy5jb250YWluc0FsbChhc0xpc3QoYWRkcmVzczEsIGFkZHJlc3MyLCBhZGRyZXNzMykpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmV0QWRkcmVzc0FuZFBvcnRNb2NrICE9IG51bGwpCisgICAgICAgICAgICAgICAgaW5ldEFkZHJlc3NBbmRQb3J0TW9jay5jbG9zZSgpOworCisgICAgICAgICAgICBpZiAoZGVzY3JpcHRvck1vY2sgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yTW9jay5jbG9zZSgpOworCisgICAgICAgICAgICBpZiAoZmJVdGlsaXRpZXNNb2NrICE9IG51bGwpCisgICAgICAgICAgICAgICAgZmJVdGlsaXRpZXNNb2NrLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb25maWcgZ2V0Q29uZmlnKE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykKKyAgICB7CisgICAgICAgIENvbmZpZyBjb25maWcgPSBuZXcgQ29uZmlnKCk7CisgICAgICAgIGNvbmZpZy5zZWVkX3Byb3ZpZGVyID0gbmV3IFBhcmFtZXRlcml6ZWRDbGFzcygpOworICAgICAgICBjb25maWcuc2VlZF9wcm92aWRlci5jbGFzc19uYW1lID0gU2ltcGxlU2VlZFByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgY29uZmlnLnNlZWRfcHJvdmlkZXIucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvQ2xpZW50UmVxdWVzdFJvd0FuZENvbHVtbk1ldHJpY3NUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9DbGllbnRSZXF1ZXN0Um93QW5kQ29sdW1uTWV0cmljc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjRiMzg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvQ2xpZW50UmVxdWVzdFJvd0FuZENvbHVtbk1ldHJpY3NUZXN0LmphdmEKQEAgLTAsMCArMSw2MjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5T3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuQmF0Y2hTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29uc2lzdGVuY3lMZXZlbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0b3JhZ2VQcm94eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLlBheG9zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5TaW1wbGVDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudHJhbnNwb3J0Lm1lc3NhZ2VzLkJhdGNoTWVzc2FnZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuUXVlcnlNZXNzYWdlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5Qcm90b2NvbFZlcnNpb24uQ1VSUkVOVDsKKworcHVibGljIGNsYXNzIENsaWVudFJlcXVlc3RSb3dBbmRDb2x1bW5NZXRyaWNzVGVzdCBleHRlbmRzIENRTFRlc3RlcgoreworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpCisgICAgeworICAgICAgICByZXF1aXJlTmV0d29yaygpOworICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBjbGVhck1ldHJpY3MoKQorICAgIHsKKyAgICAgICAgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1JlYWQuZGVjKENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5kZWMoQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1JlYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NXcml0dGVuLmRlYyhDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZGVjKENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNXcml0dGVuLmdldENvdW50KCkpOworCisgICAgICAgIFN0b3JhZ2VQcm94eS5pbnN0YW5jZS5zZXRDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3NFbmFibGVkKHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NGb3JNdWx0aVJvd1BhcnRpdGlvblNlbGVjdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDIsIDIpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSAxIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAvLyBUaGUgcGFydGl0aW9uIGtleSBpcyBwcm92aWRlZCBieSB0aGUgY2xpZW50IGluIHRoZSByZXF1ZXN0LCBzbyB3ZSBkb24ndCBjb25zaWRlciB0aG9zZSBjb2x1bW5zIGFzIHJlYWQuCisgICAgICAgIGFzc2VydEVxdWFscyg0LCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFJlYWRNZXRyaWNzV2l0aE9ubHlQYXJ0aXRpb25LZXlJblNlbGVjdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDIsIDIpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCBwayBGUk9NICVzIFdIRVJFIHBrID0gMSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygyLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gVGhlIHBhcnRpdGlvbiBrZXkgaXMgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgcmVxdWVzdCwgc28gd2UgZG9uJ3QgY29uc2lkZXIgdGhhdCBjb2x1bW4gcmVhZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NXaXRoT25seUNsdXN0ZXJpbmdLZXlJblNlbGVjdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDIsIDIpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCBjayBGUk9NICVzIFdIRVJFIHBrID0gMSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygyLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gVGhlIHBhcnRpdGlvbiBrZXkgaXMgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgcmVxdWVzdCwgc28gd2UgZG9uJ3QgY29uc2lkZXIgdGhhdCBjb2x1bW4gcmVhZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkTm90UmVjb3JkUmVhZE1ldHJpY3NXaGVuRGlzYWJsZWQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdG9yYWdlUHJveHkuaW5zdGFuY2Uuc2V0Q2xpZW50UmVxdWVzdFNpemVNZXRyaWNzRW5hYmxlZChmYWxzZSk7CisKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDEsIDEpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2ssIHYpIFZBTFVFUyAoMSwgMiwgMikiKTsKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSBwayA9IDEiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1JlYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFJlYWRNZXRyaWNzV2l0aFNpbmdsZVJvd1NlbGVjdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgY2sgPSAxIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAvLyBCb3RoIHRoZSBwYXJ0aXRpb24ga2V5IGFuZCBjbHVzdGVyaW5nIGtleSBhcmUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgcmVxdWVzdC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NXaXRoU2xpY2VSZXN0cmljdGlvbigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgY2sgPiAwIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAvLyBUaGUgcGFydGl0aW9uIGtleSBpcyBzZWxlY3RlZCwgYnV0IHRoZSByZXN0cmljdGlvbiBvdmVyIHRoZSBjbHVzdGVyaW5nIGtleSBpcyBhIHNsaWNlLgorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1JlYWQuZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRSZWFkTWV0cmljc1dpdGhJTlJlc3RyaWN0aW9uU2luZ2xlUGFydGl0aW9uKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDEsIDEpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgPSAxIEFORCBjayBJTiAoMCwgMSkiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1JlYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIC8vIFRoZSBwYXJ0aXRpb24ga2V5IGFuZCBjbHVzdGVyaW5nIGtleSBhcmUgYm90aCBzZWxlY3RlZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NXaXRoSU5SZXN0cmljdGlvbk11bHRpcGxlUGFydGl0aW9ucygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAyLCAzKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDQsIDUsIDYpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgcGsgSU4gKDEsIDQpIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAvLyBUaGUgcGFydGl0aW9uIGtleSBpcyBzZWxlY3RlZCwgYnV0IHRoZXJlIGlzIG5vIGNsdXN0ZXJpbmcgcmVzdHJpY3Rpb24uCisgICAgICAgIGFzc2VydEVxdWFscyg0LCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFJlYWRNZXRyaWNzRm9yTXVsdGlDb2x1bW5DbHVzdGVyaW5nUmVzdHJpY3Rpb24oKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQsIGNrMSBpbnQsIGNrMiBpbnQsIGNrMyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrMSwgY2syLCBjazMpKSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2sxLCBjazIsIGNrMywgdikgVkFMVUVTICgxLCAyLCAzLCA0LCA2KSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgY2sxID0gMiBBTkQgKGNrMiwgY2szKSA9ICgzLCA0KSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gVGhlIGVudGlyZSBwcmltYXJ5IGtleSBpcyBzZWxlY3RlZCwgc28gb25seSBvbmUgdmFsdWUgaXMgYWN0dWFsbHkgcmVhZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NGb3JDbHVzdGVyaW5nU2xpY2UoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQsIGNrMSBpbnQsIGNrMiBpbnQsIGNrMyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrMSwgY2syLCBjazMpKSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2sxLCBjazIsIGNrMywgdikgVkFMVUVTICgxLCAyLCAzLCA0LCA2KSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgY2sxID0gMiBBTkQgY2syID0gMyBBTkQgY2szID49IDQiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1JlYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIC8vIFRoZSBsYXN0IGNsdXN0ZXJpbmcga2V5IGVsZW1lbnQgaXNuJ3QgYm91bmQsIHNvIGNvdW50IGl0IGFzIGJlaW5nIHJlYWQuCisgICAgICAgIGFzc2VydEVxdWFscygyLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFJlYWRNZXRyaWNzRm9yVG9rZW5BbmRDbHVzdGVyaW5nU2xpY2UoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQsIGNrMSBpbnQsIGNrMiBpbnQsIGNrMyBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrMSwgY2syLCBjazMpKSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2sxLCBjazIsIGNrMywgdikgVkFMVUVTICgxLCAyLCAzLCA0LCA2KSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHRva2VuKHBrKSA9IHRva2VuKDEpIEFORCBjazEgPSAyIEFORCBjazIgPSAzIEFORCBjazMgPj0gNCBBTExPVyBGSUxURVJJTkciKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1JlYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIC8vIExhc3QgY2x1c3RlcmluZyBpcyBhIHNsaWNlLCBhbmQgdGhlIHBhcnRpdGlvbiBrZXkgaXMgcmVzdHJpY3RlZCBvbiB0b2tlbiwgc28gY291bnQgdGhlbSBhcyByZWFkLgorICAgICAgICBhc3NlcnRFcXVhbHMoMywgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1JlYWQuZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRXcml0ZU1ldHJpY3NGb3JTaW5nbGVWYWx1ZVJvdygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNXcml0dGVuLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkTm90UmVjb3JkV3JpdGVNZXRyaWNzV2hlbkRpc2FibGVkKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RvcmFnZVByb3h5Lmluc3RhbmNlLnNldENsaWVudFJlcXVlc3RTaXplTWV0cmljc0VuYWJsZWQoZmFsc2UpOworCisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNXcml0dGVuLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkV3JpdGVNZXRyaWNzRm9yTXVsdGlWYWx1ZVJvdygpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCBQUklNQVJZIEtFWSwgdjEgaW50LCB2MiBpbnQsIHYzIGludCkiKTsKKworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIHYxLCB2MiwgdjMpIFZBTFVFUyAoMSwgMiwgMywgNCkiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvckJhdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50IFBSSU1BUlkgS0VZLCB2MSBpbnQsIHYyIGludCkiKTsKKworICAgICAgICB0cnkgKFNpbXBsZUNsaWVudCBjbGllbnQgPSBuZXcgU2ltcGxlQ2xpZW50KG5hdGl2ZUFkZHIuZ2V0SG9zdEFkZHJlc3MoKSwgbmF0aXZlUG9ydCwgQ1VSUkVOVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaWVudC5jb25uZWN0KGZhbHNlKTsKKworICAgICAgICAgICAgU3RyaW5nIGZpcnN0ID0gU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMgKHBrLCB2MSwgdjIpIFZBTFVFUyAoMSwgMTAsIDEwMCkiLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCkpOworICAgICAgICAgICAgU3RyaW5nIHNlY29uZCA9IFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChwaywgdjEsIHYyKSBWQUxVRVMgKDIsIDIwLCAyMDApIiwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpKTsKKworICAgICAgICAgICAgTGlzdDxMaXN0PEJ5dGVCdWZmZXI+PiB2YWx1ZXMgPSBJbW11dGFibGVMaXN0Lm9mKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7CisgICAgICAgICAgICBCYXRjaE1lc3NhZ2UgYmF0Y2ggPSBuZXcgQmF0Y2hNZXNzYWdlKEJhdGNoU3RhdGVtZW50LlR5cGUuTE9HR0VELCBJbW11dGFibGVMaXN0Lm9mKGZpcnN0LCBzZWNvbmQpLCB2YWx1ZXMsIFF1ZXJ5T3B0aW9ucy5ERUZBVUxUKTsKKyAgICAgICAgICAgIGNsaWVudC5leGVjdXRlKGJhdGNoKTsKKworICAgICAgICAgICAgLy8gVGhlIG1ldHJpY3Mgc2hvdWxkIHJlZmxlY3QgdGhlIGJhdGNoIGFzIGEgc2luZ2xlIHdyaXRlIG9wZXJhdGlvbiB3aXRoIG11bHRpcGxlIHJvd3MgYW5kIGNvbHVtbnMuCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNCwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvckNlbGxEZWxldGVzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50IFBSSU1BUlkgS0VZLCB2MSBpbnQsIHYyIGludCwgdjMgaW50KSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIkRFTEVURSB2MSwgdjIsIHYzIEZST00gJXMgV0hFUkUgcGsgPSAxIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NXcml0dGVuLmdldENvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRXcml0ZU1ldHJpY3NGb3JDZWxsTnVsbHMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQgUFJJTUFSWSBLRVksIHYxIGludCwgdjIgaW50LCB2MyBpbnQpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCB2MSwgdjIsIHYzKSBWQUxVRVMgKDEsIG51bGwsIG51bGwsIG51bGwpIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NXcml0dGVuLmdldENvdW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRXcml0ZU1ldHJpY3NGb3JTaW5nbGVTdGF0aWNJbnNlcnQoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQsIGNrIGludCwgdjAgaW50IHN0YXRpYywgdjEgaW50LCB2MiBpbnQsIFBSSU1BUlkgS0VZIChwaywgY2spKSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2ssIHYwLCB2MSwgdjIpIFZBTFVFUyAoMCwgMSwgMiwgMywgNCkiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvckJhdGNoZWRTdGF0aWNJbnNlcnRzKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYwIGludCBzdGF0aWMsIHYxIGludCwgdjIgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKworICAgICAgICB0cnkgKFNpbXBsZUNsaWVudCBjbGllbnQgPSBuZXcgU2ltcGxlQ2xpZW50KG5hdGl2ZUFkZHIuZ2V0SG9zdEFkZHJlc3MoKSwgbmF0aXZlUG9ydCwgQ1VSUkVOVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaWVudC5jb25uZWN0KGZhbHNlKTsKKworICAgICAgICAgICAgU3RyaW5nIGZpcnN0ID0gU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMgKHBrLCBjaywgdjAsIHYxLCB2MikgVkFMVUVTICgwLCAxLCAyLCAzLCA0KSIsIEtFWVNQQUNFLCBjdXJyZW50VGFibGUoKSk7CisgICAgICAgICAgICBTdHJpbmcgc2Vjb25kID0gU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMgKHBrLCBjaywgdjAsIHYxLCB2MikgVkFMVUVTICgwLCAyLCAzLCA1LCA2KSIsIEtFWVNQQUNFLCBjdXJyZW50VGFibGUoKSk7CisKKyAgICAgICAgICAgIExpc3Q8TGlzdDxCeXRlQnVmZmVyPj4gdmFsdWVzID0gSW1tdXRhYmxlTGlzdC5vZihDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgICAgICAgICAgQmF0Y2hNZXNzYWdlIGJhdGNoID0gbmV3IEJhdGNoTWVzc2FnZShCYXRjaFN0YXRlbWVudC5UeXBlLkxPR0dFRCwgSW1tdXRhYmxlTGlzdC5vZihmaXJzdCwgc2Vjb25kKSwgdmFsdWVzLCBRdWVyeU9wdGlvbnMuREVGQVVMVCk7CisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZShiYXRjaCk7CisKKyAgICAgICAgICAgIC8vIFR3byBub3JtYWwgcm93cyBhbmQgdGhlIHNpbmdsZSBzdGF0aWMgcm93OgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NXcml0dGVuLmdldENvdW50KCkpOworICAgICAgICAgICAgLy8gVHdvIG5vcm1hbCBjb2x1bW5zIHBlciBpbnNlcnQsIGFuZCB0aGVuIG9uZSBjb2x1bW5zIGZvciB0aGUgc3RhdGljIHJvdzoKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg1LCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkV3JpdGVNZXRyaWNzRm9yUm93RGVsZXRlKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYwIGludCBzdGF0aWMsIHYxIGludCwgdjIgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJERUxFVEUgRlJPTSAlcyBXSEVSRSBwayA9IDEgQU5EIGNrID0gMSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gVGhlIGNvbHVtbnMgbWV0cmljIHNob3VsZCBhY2NvdW50IGZvciBhbGwgcmVndWxhciBjb2x1bW5zLgorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRXcml0ZU1ldHJpY3NGb3JSYW5nZURlbGV0ZSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2MCBpbnQgc3RhdGljLCB2MSBpbnQsIHYyIGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiREVMRVRFIEZST00gJXMgV0hFUkUgcGsgPSAxIEFORCBjayA+IDEiKTsKKworICAgICAgICAvLyBUaGUgcmFuZ2UgZGVsZXRlIGlzIGludGVuZGVkIHRvIGRlbGV0ZSBhdCBsZWFzdCBvbmUgcm93LCBidXQgdGhhdCBpcyBvbmx5IGEgbG93ZXIgYm91bmQuCisgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gVGhlIGNvbHVtbnMgbWV0cmljIHNob3VsZCBhY2NvdW50IGZvciBhbGwgcmVndWxhciBjb2x1bW5zLgorICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRXcml0ZU1ldHJpY3NGb3JQYXJ0aXRpb25EZWxldGUoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQsIGNrIGludCwgdjAgaW50IHN0YXRpYywgdjEgaW50LCB2MiBpbnQsIFBSSU1BUlkgS0VZIChwaywgY2spKSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIkRFTEVURSBGUk9NICVzIFdIRVJFIHBrID0gMSIpOworCisgICAgICAgIC8vIEEgcGFydGl0aW9uIGRlbGV0aW9uIGludGVuZHMgdG8gZGVsZXRlIGF0IGxlYXN0IG9uZSByb3cuCisgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gSWYgd2UgZGVsZXRlIG9uZSByb3csIHdlIGludGVuZGVkIHRvIGRlbGV0ZSBhbGwgaXRzIHJlZ3VsYXIgYW5kIHN0YXRpYyBjb2x1bW5zLgorICAgICAgICBhc3NlcnRFcXVhbHMoMywgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRXcml0ZU1ldHJpY3NGb3JJbnRyYVJvd0JhdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYxIGludCwgdjIgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKworICAgICAgICB0cnkgKFNpbXBsZUNsaWVudCBjbGllbnQgPSBuZXcgU2ltcGxlQ2xpZW50KG5hdGl2ZUFkZHIuZ2V0SG9zdEFkZHJlc3MoKSwgbmF0aXZlUG9ydCwgQ1VSUkVOVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaWVudC5jb25uZWN0KGZhbHNlKTsKKworICAgICAgICAgICAgU3RyaW5nIGZpcnN0ID0gU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMgKHBrLCBjaywgdjEsIHYyKSBWQUxVRVMgKDEsIDIsIDMsIDQpIiwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpKTsKKyAgICAgICAgICAgIFN0cmluZyBzZWNvbmQgPSBTdHJpbmcuZm9ybWF0KCJERUxFVEUgRlJPTSAlcy4lcyBXSEVSRSBwayA9IDEgQU5EIGNrID4gMSIsIEtFWVNQQUNFLCBjdXJyZW50VGFibGUoKSk7CisKKyAgICAgICAgICAgIExpc3Q8TGlzdDxCeXRlQnVmZmVyPj4gdmFsdWVzID0gSW1tdXRhYmxlTGlzdC5vZihDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgICAgICAgICAgQmF0Y2hNZXNzYWdlIGJhdGNoID0gbmV3IEJhdGNoTWVzc2FnZShCYXRjaFN0YXRlbWVudC5UeXBlLkxPR0dFRCwgSW1tdXRhYmxlTGlzdC5vZihmaXJzdCwgc2Vjb25kKSwgdmFsdWVzLCBRdWVyeU9wdGlvbnMuREVGQVVMVCk7CisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZShiYXRjaCk7CisKKyAgICAgICAgICAgIC8vIEJvdGggb3BlcmF0aW9ucyBhZmZlY3QgdGhlIHNhbWUgcm93LCBidXQgd3JpdGVzIGFuZCBkZWxldGVzIGFyZSBkaXN0aW5jdC4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0LCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zV3JpdHRlbi5nZXRDb3VudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkV3JpdGVNZXRyaWNzRm9ySWZOb3RFeGlzdHNWMSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFBheG9zLnNldFBheG9zVmFyaWFudChDb25maWcuUGF4b3NWYXJpYW50LnYxKTsKKyAgICAgICAgc2hvdWxkUmVjb3JkV3JpdGVNZXRyaWNzRm9ySWZOb3RFeGlzdHMoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvcklmTm90RXhpc3RzVjIoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBQYXhvcy5zZXRQYXhvc1ZhcmlhbnQoQ29uZmlnLlBheG9zVmFyaWFudC52Mik7CisgICAgICAgIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvcklmTm90RXhpc3RzKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkV3JpdGVNZXRyaWNzRm9ySWZOb3RFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQgUFJJTUFSWSBLRVksIHYxIGludCwgdjIgaW50LCB2MyBpbnQpIik7CisKKyAgICAgICAgdHJ5IChTaW1wbGVDbGllbnQgY2xpZW50ID0gbmV3IFNpbXBsZUNsaWVudChuYXRpdmVBZGRyLmdldEhvc3RBZGRyZXNzKCksIG5hdGl2ZVBvcnQsIENVUlJFTlQpKQorICAgICAgICB7CisgICAgICAgICAgICBjbGllbnQuY29ubmVjdChmYWxzZSk7CisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZShuZXcgUXVlcnlNZXNzYWdlKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChwaywgdjEsIHYyLCB2MykgVkFMVUVTICgxLCAyLCAzLCA0KSBJRiBOT1QgRVhJU1RTIiwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpKSwgUXVlcnlPcHRpb25zLkRFRkFVTFQpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NXcml0dGVuLmdldENvdW50KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNXcml0dGVuLmdldENvdW50KCkpOworCisgICAgICAgICAgICAvLyBXZSByZWFkIGludGVybmFsbHksIGJ1dCBkb24ndCByZWZsZWN0IHRoYXQgaW4gb3VyIHJlYWQgbWV0cmljcy4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkV3JpdGVNZXRyaWNzRm9yQ0FTVjEoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBQYXhvcy5zZXRQYXhvc1ZhcmlhbnQoQ29uZmlnLlBheG9zVmFyaWFudC52MSk7CisgICAgICAgIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvckNBUygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkV3JpdGVNZXRyaWNzRm9yQ0FTVjIoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBQYXhvcy5zZXRQYXhvc1ZhcmlhbnQoQ29uZmlnLlBheG9zVmFyaWFudC52Mik7CisgICAgICAgIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvckNBUygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFdyaXRlTWV0cmljc0ZvckNBUygpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCBQUklNQVJZIEtFWSwgdjEgaW50LCB2MiBpbnQpIik7CisKKyAgICAgICAgdHJ5IChTaW1wbGVDbGllbnQgY2xpZW50ID0gbmV3IFNpbXBsZUNsaWVudChuYXRpdmVBZGRyLmdldEhvc3RBZGRyZXNzKCksIG5hdGl2ZVBvcnQsIENVUlJFTlQpKQorICAgICAgICB7CisgICAgICAgICAgICBjbGllbnQuY29ubmVjdChmYWxzZSk7CisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZShuZXcgUXVlcnlNZXNzYWdlKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChwaywgdjEsIHYyKSBWQUxVRVMgKDEsIDIsIDMpIiwgS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpKSwgUXVlcnlPcHRpb25zLkRFRkFVTFQpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NXcml0dGVuLmdldENvdW50KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNXcml0dGVuLmdldENvdW50KCkpOworCisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZShuZXcgUXVlcnlNZXNzYWdlKFN0cmluZy5mb3JtYXQoIlVQREFURSAlcy4lcyBTRVQgdjIgPSA0IFdIRVJFIHBrID0gMSBJRiB2MSA9IDIiLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCkpLCBRdWVyeU9wdGlvbnMuREVGQVVMVCkpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisKKyAgICAgICAgICAgIC8vIFdlIHJlYWQgaW50ZXJuYWxseSwgYnV0IGRvbid0IHJlZmxlY3QgdGhhdCBpbiBvdXIgcmVhZCBtZXRyaWNzLgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGROb3RSZWNvcmRXcml0ZU1ldHJpY3NGb3JGYWlsZWRDQVNWMSgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFBheG9zLnNldFBheG9zVmFyaWFudChDb25maWcuUGF4b3NWYXJpYW50LnYxKTsKKyAgICAgICAgc2hvdWxkTm90UmVjb3JkV3JpdGVNZXRyaWNzRm9yRmFpbGVkQ0FTKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGROb3RSZWNvcmRXcml0ZU1ldHJpY3NGb3JGYWlsZWRDQVNWMigpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFBheG9zLnNldFBheG9zVmFyaWFudChDb25maWcuUGF4b3NWYXJpYW50LnYyKTsKKyAgICAgICAgc2hvdWxkTm90UmVjb3JkV3JpdGVNZXRyaWNzRm9yRmFpbGVkQ0FTKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2hvdWxkTm90UmVjb3JkV3JpdGVNZXRyaWNzRm9yRmFpbGVkQ0FTKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50IFBSSU1BUlkgS0VZLCB2MSBpbnQsIHYyIGludCkiKTsKKworICAgICAgICB0cnkgKFNpbXBsZUNsaWVudCBjbGllbnQgPSBuZXcgU2ltcGxlQ2xpZW50KG5hdGl2ZUFkZHIuZ2V0SG9zdEFkZHJlc3MoKSwgbmF0aXZlUG9ydCwgQ1VSUkVOVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNsaWVudC5jb25uZWN0KGZhbHNlKTsKKyAgICAgICAgICAgIGNsaWVudC5leGVjdXRlKG5ldyBRdWVyeU1lc3NhZ2UoU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMgKHBrLCB2MSwgdjIpIFZBTFVFUyAoMSwgMiwgMykiLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCkpLCBRdWVyeU9wdGlvbnMuREVGQVVMVCkpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisKKyAgICAgICAgICAgIGNsaWVudC5leGVjdXRlKG5ldyBRdWVyeU1lc3NhZ2UoU3RyaW5nLmZvcm1hdCgiVVBEQVRFICVzLiVzIFNFVCB2MiA9IDQgV0hFUkUgcGsgPSAxIElGIHYxID0gNCIsIEtFWVNQQUNFLCBjdXJyZW50VGFibGUoKSksIFF1ZXJ5T3B0aW9ucy5ERUZBVUxUKSk7CisKKyAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBhY3R1YWxseSB3cml0ZSBhbnl0aGluZywgc28gZG9uJ3QgcmVmbGVjdCBhIHdyaXRlIGFnYWluc3QgdGhlIG1ldHJpY3MuCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1dyaXR0ZW4uZ2V0Q291bnQoKSk7CisKKyAgICAgICAgICAgIC8vIERvbid0IHJlZmxlY3QgaW4gb3VyIHJlYWQgbWV0cmljcyB0aGUgcmVzdWx0IHJldHVybmVkIHRvIHRoZSBjbGllbnQgYnkgdGhlIGZhaWxlZCBDQVMgd3JpdGUuIAorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRSZWFkTWV0cmljc09uU2VyaWFsUmVhZFYxKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGF4b3Muc2V0UGF4b3NWYXJpYW50KENvbmZpZy5QYXhvc1ZhcmlhbnQudjEpOworICAgICAgICBzaG91bGRSZWNvcmRSZWFkTWV0cmljc09uU2VyaWFsUmVhZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NPblNlcmlhbFJlYWRWMigpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFBheG9zLnNldFBheG9zVmFyaWFudChDb25maWcuUGF4b3NWYXJpYW50LnYyKTsKKyAgICAgICAgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NPblNlcmlhbFJlYWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRSZWFkTWV0cmljc09uU2VyaWFsUmVhZCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgdHJ5IChTaW1wbGVDbGllbnQgY2xpZW50ID0gbmV3IFNpbXBsZUNsaWVudChuYXRpdmVBZGRyLmdldEhvc3RBZGRyZXNzKCksIG5hdGl2ZVBvcnQsIENVUlJFTlQpKQorICAgICAgICB7CisgICAgICAgICAgICBjbGllbnQuY29ubmVjdChmYWxzZSk7CisgICAgICAgICAgICBjbGllbnQuZXhlY3V0ZShuZXcgUXVlcnlNZXNzYWdlKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChwaywgY2ssIHYpIFZBTFVFUyAoMSwgMSwgMSkiLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCkpLCBRdWVyeU9wdGlvbnMuREVGQVVMVCkpOworCisgICAgICAgICAgICBRdWVyeU1lc3NhZ2UgcXVlcnkgPSBuZXcgUXVlcnlNZXNzYWdlKFN0cmluZy5mb3JtYXQoIlNFTEVDVCAqIEZST00gJXMuJXMgV0hFUkUgcGsgPSAxIEFORCBjayA9IDEiLCBLRVlTUEFDRSwgY3VycmVudFRhYmxlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeU9wdGlvbnMuZm9ySW50ZXJuYWxDYWxscyhDb25zaXN0ZW5jeUxldmVsLlNFUklBTCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKKyAgICAgICAgICAgIGNsaWVudC5leGVjdXRlKHF1ZXJ5KTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworCisgICAgICAgICAgICAvLyBCb3RoIHRoZSBwYXJ0aXRpb24ga2V5IGFuZCBjbHVzdGVyaW5nIGtleSBhcmUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgcmVxdWVzdC4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NGb3JHbG9iYWxJbmRleFF1ZXJ5KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKyAgICAgICAgY3JlYXRlSW5kZXgoIkNSRUFURSBJTkRFWCBvbiAlcyAodikiKTsKKworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDEsIDEpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2ssIHYpIFZBTFVFUyAoMiwgMiwgMikiKTsKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB2ID0gMSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gVGhlIGluZGV4IHNlYXJjaCB0ZXJtIGlzIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgaW4gdGhlIHJlcXVlc3QsIHNvIHdlIGRvbid0IGNvbnNpZGVyIHRoYXQgY29sdW1uIHJlYWQuCisgICAgICAgIGFzc2VydEVxdWFscygyLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFJlYWRNZXRyaWNzRm9yUGFydGl0aW9uUmVzdHJpY3RlZEluZGV4UXVlcnkoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChwayBpbnQsIGNrIGludCwgdiBpbnQsIFBSSU1BUlkgS0VZIChwaywgY2spKSIpOworICAgICAgICBjcmVhdGVJbmRleCgiQ1JFQVRFIElOREVYIG9uICVzICh2KSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2ssIHYpIFZBTFVFUyAoMSwgMSwgMSkiKTsKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAyLCAyKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJTRUxFQ1QgKiBGUk9NICVzIFdIRVJFIHBrID0gMSBBTkQgdiA9IDEiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1JlYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIC8vIFRoZSBwYXJ0aXRpb24ga2V5IGFuZCBpbmRleCBzZWFyY2ggdGVybSBhcmUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgc28gd2UgZG9uJ3QgY29uc2lkZXIgdGhvc2UgY29sdW1ucyByZWFkLgorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsQ29sdW1uc1JlYWQuZ2V0Q291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRSZWNvcmRSZWFkTWV0cmljc0ZvckNsdXN0ZXJpbmdLZXlJbmRleFF1ZXJ5KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKyAgICAgICAgY3JlYXRlSW5kZXgoIkNSRUFURSBJTkRFWCBvbiAlcyAoY2spIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDIsIDIpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgY2sgPSAyIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAvLyBUaGUgaW5kZXggc2VhcmNoIHRlcm0gaXMgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgcmVxdWVzdCwgc28gd2UgZG9uJ3QgY29uc2lkZXIgdGhhdCBjb2x1bW4gcmVhZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NGb3JGaWx0ZXJpbmdRdWVyeSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDIsIDIsIDIpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdiA9IDEgQUxMT1cgRklMVEVSSU5HIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAvLyBUaGUgZmlsdGVyaW5nIHRlcm0gaXMgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgcmVxdWVzdCwgc28gd2UgZG9uJ3QgY29uc2lkZXIgdGhhdCBjb2x1bW4gcmVhZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NGb3JSYW5nZUZpbHRlcmluZ1F1ZXJ5KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYgaW50LCBQUklNQVJZIEtFWSAocGssIGNrKSkiKTsKKworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDEsIDEsIDEpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2ssIHYpIFZBTFVFUyAoMiwgMiwgMikiKTsKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiU0VMRUNUICogRlJPTSAlcyBXSEVSRSB2ID4gMSBBTExPVyBGSUxURVJJTkciKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ2xpZW50UmVxdWVzdFNpemVNZXRyaWNzLnRvdGFsUm93c1JlYWQuZ2V0Q291bnQoKSk7CisgICAgICAgIC8vIFRoZSB2YWx1ZSBjb2x1bW4gaXMgcmVzdHJpY3RlZCBvdmVyIGEgcmFuZ2UsIG5vdCBib3VuZCB0byBhIHBhcnRpY3VsYXIgdmFsdWUuCisgICAgICAgIGFzc2VydEVxdWFscygzLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlY29yZFJlYWRNZXRyaWNzRm9ySU5GaWx0ZXJpbmdRdWVyeSgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKHBrIGludCwgY2sgaW50LCB2IGludCwgUFJJTUFSWSBLRVkgKHBrLCBjaykpIik7CisKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgxLCAxLCAxKSIpOworICAgICAgICBleGVjdXRlTmV0KENVUlJFTlQsICJJTlNFUlQgSU5UTyAlcyAocGssIGNrLCB2KSBWQUxVRVMgKDIsIDIsIDIpIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdiBJTiAoMSkgQUxMT1cgRklMVEVSSU5HIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbFJvd3NSZWFkLmdldENvdW50KCkpOworICAgICAgICAvLyBUaGUgZmlsdGVyaW5nIHRlcm0gaXMgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgcmVxdWVzdCwgc28gd2UgZG9uJ3QgY29uc2lkZXIgdGhhdCBjb2x1bW4gcmVhZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIENsaWVudFJlcXVlc3RTaXplTWV0cmljcy50b3RhbENvbHVtbnNSZWFkLmdldENvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkUmVjb3JkUmVhZE1ldHJpY3NGb3JDb250YWluc1F1ZXJ5KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoIkNSRUFURSBUQUJMRSAlcyAocGsgaW50LCBjayBpbnQsIHYgc2V0PGludD4sIFBSSU1BUlkgS0VZIChwaywgY2spKSIpOworCisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIklOU0VSVCBJTlRPICVzIChwaywgY2ssIHYpIFZBTFVFUyAoMSwgMSwgezEsIDIsIDN9ICkiKTsKKyAgICAgICAgZXhlY3V0ZU5ldChDVVJSRU5ULCAiSU5TRVJUIElOVE8gJXMgKHBrLCBjaywgdikgVkFMVUVTICgyLCAyLCB7NCwgNSwgNn0pIik7CisgICAgICAgIGV4ZWN1dGVOZXQoQ1VSUkVOVCwgIlNFTEVDVCAqIEZST00gJXMgV0hFUkUgdiBDT05UQUlOUyAxIEFMTE9XIEZJTFRFUklORyIpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxSb3dzUmVhZC5nZXRDb3VudCgpKTsKKyAgICAgICAgLy8gVGhlIGZpbHRlcmluZyB0ZXJtIGlzIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgaW4gdGhlIHJlcXVlc3QsIHNvIHdlIGRvbid0IGNvbnNpZGVyIHRoYXQgY29sdW1uIHJlYWQuCisgICAgICAgIGFzc2VydEVxdWFscygyLCBDbGllbnRSZXF1ZXN0U2l6ZU1ldHJpY3MudG90YWxDb2x1bW5zUmVhZC5nZXRDb3VudCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9TYW1wbGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvU2FtcGxlclRlc3QuamF2YQppbmRleCBkYmExOWEzLi44NjJhYmJiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9TYW1wbGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1NhbXBsZXJUZXN0LmphdmEKQEAgLTc5LDcgKzc5LDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJlZ2luU2FtcGxpbmcoaW50IGNhcGFjaXR5LCBpbnQgZHVyYXRpb25NaWxsaXMpCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJlZ2luU2FtcGxpbmcoaW50IGNhcGFjaXR5LCBsb25nIGR1cmF0aW9uTWlsbGlzKQogICAgICAgICAgICAgewogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9UYWJsZU1ldHJpY3NUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbWV0cmljcy9UYWJsZU1ldHJpY3NUZXN0LmphdmEKaW5kZXggNGM5ZGU3Ny4uYmJjY2VkNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvVGFibGVNZXRyaWNzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1RhYmxlTWV0cmljc1Rlc3QuamF2YQpAQCAtMTksMTAgKzE5LDEyIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5pbnRlcnJ1cHRpYmxlczsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC0zNiw2ICszOCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuRW1iZWRkZWRDYXNzYW5kcmFTZXJ2aWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKQEAgLTQ3LDYgKzUwLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1BBQ0UgPSAianVuaXQiOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRSA9ICJ0YWJsZW1ldHJpY3N0ZXN0IjsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09VTlRFUl9UQUJMRSA9ICJ0YWJsZW1ldHJpY3Njb3VudGVydGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRXQ1NfVEFCTEUgPSAidGFibGVtZXRyaWNzdGVzdHR3Y3MiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgRW1iZWRkZWRDYXNzYW5kcmFTZXJ2aWNlIGNhc3NhbmRyYTsKICAgICBwcml2YXRlIHN0YXRpYyBDbHVzdGVyIGNsdXN0ZXI7CkBAIC02OCw2ICs3MiwxNSBAQAogICAgICAgICByZXR1cm4gcmVjcmVhdGVUYWJsZShUQUJMRSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBDb2x1bW5GYW1pbHlTdG9yZSByZWNyZWF0ZVRXQ1NUYWJsZSgpCisgICAgeworICAgICAgICBzZXNzaW9uLmV4ZWN1dGUoU3RyaW5nLmZvcm1hdCgiRFJPUCBUQUJMRSBJRiBFWElTVFMgJXMuJXMiLCBLRVlTUEFDRSwgVFdDU19UQUJMRSkpOworICAgICAgICBzZXNzaW9uLmV4ZWN1dGUoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJXMuJXMgKGlkIGludCwgdmFsMSB0ZXh0LCB2YWwyIHRleHQsIFBSSU1BUlkgS0VZKGlkLCB2YWwxKSkgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgV0lUSCBjb21wYWN0aW9uID0geydjbGFzcyc6ICdUaW1lV2luZG93Q29tcGFjdGlvblN0cmF0ZWd5JywgJ2NvbXBhY3Rpb25fd2luZG93X3VuaXQnOiAnTUlOVVRFUycsICdjb21wYWN0aW9uX3dpbmRvd19zaXplJzogMX07IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZU1BBQ0UsIFRXQ1NfVEFCTEUpKTsKKyAgICAgICAgcmV0dXJuIENvbHVtbkZhbWlseVN0b3JlLmdldElmRXhpc3RzKEtFWVNQQUNFLCBUV0NTX1RBQkxFKTsKKyAgICB9CisKICAgICBwcml2YXRlIENvbHVtbkZhbWlseVN0b3JlIHJlY3JlYXRlVGFibGUoU3RyaW5nIHRhYmxlKQogICAgIHsKICAgICAgICAgc2Vzc2lvbi5leGVjdXRlKFN0cmluZy5mb3JtYXQoIkRST1AgVEFCTEUgSUYgRVhJU1RTICVzLiVzIiwgS0VZU1BBQ0UsIHRhYmxlKSk7CkBAIC0xMzAsNiArMTQzLDM3IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4U1NUYWJsZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSByZWNyZWF0ZVRhYmxlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjZnMubWV0cmljLm1heFNTVGFibGVTaXplLmdldFZhbHVlKCkubG9uZ1ZhbHVlKCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzZXNzaW9uLmV4ZWN1dGUoU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMgKGlkLCB2YWwxLCB2YWwyKSBWQUxVRVMgKCVkLCAnJXMnLCAnJXMnKSIsIEtFWVNQQUNFLCBUQUJMRSwgaSwgInZhbCIgKyBpLCAidmFsIiArIGkpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmZvcmNlS2V5c3BhY2VGbHVzaChLRVlTUEFDRSk7CisKKyAgICAgICAgYXNzZXJ0R3JlYXRlclRoYW4oY2ZzLm1ldHJpYy5tYXhTU1RhYmxlU2l6ZS5nZXRWYWx1ZSgpLmRvdWJsZVZhbHVlKCksIDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1heFNTVGFibGVEdXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IHJlY3JlYXRlVFdDU1RhYmxlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBjZnMubWV0cmljLm1heFNTVGFibGVEdXJhdGlvbi5nZXRWYWx1ZSgpLmxvbmdWYWx1ZSgpKTsKKworICAgICAgICBzZXNzaW9uLmV4ZWN1dGUoU3RyaW5nLmZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMgKGlkLCB2YWwxLCB2YWwyKSBWQUxVRVMgKCVkLCAnJXMnLCAnJXMnKSIsIEtFWVNQQUNFLCBUV0NTX1RBQkxFLCAxLCAidmFsMSIsICJ2YWwxIikpOworICAgICAgICBVbmludGVycnVwdGlibGVzLnNsZWVwVW5pbnRlcnJ1cHRpYmx5KDEwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgc2Vzc2lvbi5leGVjdXRlKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChpZCwgdmFsMSwgdmFsMikgVkFMVUVTICglZCwgJyVzJywgJyVzJykiLCBLRVlTUEFDRSwgVFdDU19UQUJMRSwgMiwgInZhbDIiLCAidmFsMiIpKTsKKworICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5mb3JjZUtleXNwYWNlRmx1c2goS0VZU1BBQ0UpOworCisgICAgICAgIGFzc2VydEdyZWF0ZXJUaGFuKGNmcy5tZXRyaWMubWF4U1NUYWJsZUR1cmF0aW9uLmdldFZhbHVlKCkuZG91YmxlVmFsdWUoKSwgMCk7CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlcGFyZWRTdGF0ZW1lbnRzRXhlY3V0ZWQoKQogICAgIHsKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gcmVjcmVhdGVUYWJsZSgpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL21ldHJpY3MvVHJpZU1lbXRhYmxlTWV0cmljc1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1RyaWVNZW10YWJsZU1ldHJpY3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkOGY3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9tZXRyaWNzL1RyaWVNZW10YWJsZU1ldHJpY3NUZXN0LmphdmEKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLkNsdXN0ZXI7CitpbXBvcnQgY29tLmRhdGFzdGF4LmRyaXZlci5jb3JlLlNlc3Npb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLk92ZXJyaWRlQ29uZmlndXJhdGlvbkxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5FbWJlZGRlZENhc3NhbmRyYVNlcnZpY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKK2ltcG9ydCBvcmcuamJvc3MuYnl0ZW1hbi5jb250cmliLmJtdW5pdC5CTVJ1bGU7CitpbXBvcnQgb3JnLmpib3NzLmJ5dGVtYW4uY29udHJpYi5ibXVuaXQuQk1SdWxlczsKK2ltcG9ydCBvcmcuamJvc3MuYnl0ZW1hbi5jb250cmliLmJtdW5pdC5CTVVuaXRSdW5uZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5NRU1UQUJMRV9TSEFSRF9DT1VOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLio7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworQFJ1bldpdGgoQk1Vbml0UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIFRyaWVNZW10YWJsZU1ldHJpY3NUZXN0IGV4dGVuZHMgU2NoZW1hTG9hZGVyCit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5VTV9TSEFSRFMgPSAxMzsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUcmllTWVtdGFibGVNZXRyaWNzVGVzdC5jbGFzcyk7CisgICAgcHJpdmF0ZSBzdGF0aWMgU2Vzc2lvbiBzZXNzaW9uOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFID0gInRyaWVtZW10YWJsZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFID0gIm1ldHJpY3N0ZXN0IjsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIHNoYWRvdyBzdXBlcmNsYXNzIG1ldGhvZDsgd2UnbGwgY2FsbCBpdCBkaXJlY3RseQorICAgICAgICAvLyBhZnRlciB0aW5rZXJpbmcgd2l0aCB0aGUgQ29uZmlnCisgICAgfQorCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBPdmVycmlkZUNvbmZpZ3VyYXRpb25Mb2FkZXIub3ZlcnJpZGUoKGNvbmZpZykgLT4geworICAgICAgICAgICAgY29uZmlnLnBhcnRpdGlvbmVyID0gIk11cm11cjNQYXJ0aXRpb25lciI7CisgICAgICAgIH0pOworICAgICAgICBNRU1UQUJMRV9TSEFSRF9DT1VOVC5zZXRJbnQoTlVNX1NIQVJEUyk7CisKKyAgICAgICAgU2NoZW1hTG9hZGVyLmxvYWRTY2hlbWEoKTsKKworICAgICAgICBFbWJlZGRlZENhc3NhbmRyYVNlcnZpY2UgY2Fzc2FuZHJhID0gbmV3IEVtYmVkZGVkQ2Fzc2FuZHJhU2VydmljZSgpOworICAgICAgICBjYXNzYW5kcmEuc3RhcnQoKTsKKworICAgICAgICBDbHVzdGVyIGNsdXN0ZXIgPSBDbHVzdGVyLmJ1aWxkZXIoKS5hZGRDb250YWN0UG9pbnQoIjEyNy4wLjAuMSIpLndpdGhQb3J0KERhdGFiYXNlRGVzY3JpcHRvci5nZXROYXRpdmVUcmFuc3BvcnRQb3J0KCkpLmJ1aWxkKCk7CisgICAgICAgIHNlc3Npb24gPSBjbHVzdGVyLmNvbm5lY3QoKTsKKworICAgICAgICBzZXNzaW9uLmV4ZWN1dGUoU3RyaW5nLmZvcm1hdCgiQ1JFQVRFIEtFWVNQQUNFIElGIE5PVCBFWElTVFMgJXMgV0lUSCByZXBsaWNhdGlvbiA9IHsgJ2NsYXNzJyA6ICdTaW1wbGVTdHJhdGVneScsICdyZXBsaWNhdGlvbl9mYWN0b3InIDogMSB9OyIsIEtFWVNQQUNFKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb2x1bW5GYW1pbHlTdG9yZSByZWNyZWF0ZVRhYmxlKCkKKyAgICB7CisgICAgICAgIHJldHVybiByZWNyZWF0ZVRhYmxlKFRBQkxFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbHVtbkZhbWlseVN0b3JlIHJlY3JlYXRlVGFibGUoU3RyaW5nIHRhYmxlKQorICAgIHsKKyAgICAgICAgc2Vzc2lvbi5leGVjdXRlKFN0cmluZy5mb3JtYXQoIkRST1AgVEFCTEUgSUYgRVhJU1RTICVzLiVzIiwgS0VZU1BBQ0UsIHRhYmxlKSk7CisgICAgICAgIHNlc3Npb24uZXhlY3V0ZShTdHJpbmcuZm9ybWF0KCJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAlcy4lcyAoaWQgaW50LCB2YWwxIHRleHQsIHZhbDIgdGV4dCwgUFJJTUFSWSBLRVkoaWQsIHZhbDEpKSBXSVRIIE1FTVRBQkxFID0gJ3Rlc3RfbWVtdGFibGVfbWV0cmljcyc7IiwgS0VZU1BBQ0UsIHRhYmxlKSk7CisgICAgICAgIHJldHVybiBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cyhLRVlTUEFDRSwgdGFibGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ3VsYXJTdGF0ZW1lbnRzQXJlQ291bnRlZCgpCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSByZWNyZWF0ZVRhYmxlKCk7CisgICAgICAgIFRyaWVNZW10YWJsZU1ldHJpY3NWaWV3IG1ldHJpY3MgPSBnZXRNZW10YWJsZU1ldHJpY3MoY2ZzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1ldHJpY3MuY29udGVuZGVkUHV0cy5nZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1ldHJpY3MudW5jb250ZW5kZWRQdXRzLmdldENvdW50KCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgc2Vzc2lvbi5leGVjdXRlKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChpZCwgdmFsMSwgdmFsMikgVkFMVUVTICglZCwgJyVzJywgJyVzJykiLCBLRVlTUEFDRSwgVEFCTEUsIGksICJ2YWwiICsgaSwgInZhbCIgKyBpKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIGFsbFB1dHMgPSBtZXRyaWNzLmNvbnRlbmRlZFB1dHMuZ2V0Q291bnQoKSArIG1ldHJpY3MudW5jb250ZW5kZWRQdXRzLmdldENvdW50KCk7CisgICAgICAgIGFzc2VydEVxdWFscygxMCwgYWxsUHV0cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rmx1c2hSZWxhdGVkTWV0cmljcygpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gcmVjcmVhdGVUYWJsZSgpOworICAgICAgICBUcmllTWVtdGFibGVNZXRyaWNzVmlldyBtZXRyaWNzID0gZ2V0TWVtdGFibGVNZXRyaWNzKGNmcyk7CisKKyAgICAgICAgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuZm9yY2VLZXlzcGFjZUZsdXNoKEtFWVNQQUNFLCBUQUJMRSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtZXRyaWNzLmNvbnRlbmRlZFB1dHMuZ2V0Q291bnQoKSArIG1ldHJpY3MudW5jb250ZW5kZWRQdXRzLmdldENvdW50KCkpOworCisgICAgICAgIHdyaXRlQW5kRmx1c2goMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIG1ldHJpY3MuY29udGVuZGVkUHV0cy5nZXRDb3VudCgpICsgbWV0cmljcy51bmNvbnRlbmRlZFB1dHMuZ2V0Q291bnQoKSk7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgbWV0cmljcyBzdXJ2aXZlIGZsdXNoIC8gbWVtdGFibGUgc3dpdGNoaW5nCisgICAgICAgIHdyaXRlQW5kRmx1c2goMTApOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAsIG1ldHJpY3MuY29udGVuZGVkUHV0cy5nZXRDb3VudCgpICsgbWV0cmljcy51bmNvbnRlbmRlZFB1dHMuZ2V0Q291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXRyaWNzLmxhc3RGbHVzaFNoYXJkRGF0YVNpemVzLnRvU3RyaW5nKCksIE5VTV9TSEFSRFMsIG1ldHJpY3MubGFzdEZsdXNoU2hhcmREYXRhU2l6ZXMubnVtU2FtcGxlc0dhdWdlLmdldFZhbHVlKCkuaW50VmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAQk1SdWxlcyhydWxlcyA9IHsgQEJNUnVsZShuYW1lID0gIkRlbGF5IG1lbXRhYmxlIHVwZGF0ZSIsCisgICAgdGFyZ2V0Q2xhc3MgPSAiSW5NZW1vcnlUcmllIiwKKyAgICB0YXJnZXRNZXRob2QgPSAicHV0U2luZ2xldG9uIiwKKyAgICBhY3Rpb24gPSAiamF2YS5sYW5nLlRocmVhZC5zbGVlcCgxMCkiKX0pCisgICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnRpb25NZXRyaWNzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSByZWNyZWF0ZVRhYmxlKCk7CisgICAgICAgIFRyaWVNZW10YWJsZU1ldHJpY3NWaWV3IG1ldHJpY3MgPSBnZXRNZW10YWJsZU1ldHJpY3MoY2ZzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIChpbnQpIG1ldHJpY3MubGFzdEZsdXNoU2hhcmREYXRhU2l6ZXMubnVtU2FtcGxlc0dhdWdlLmdldFZhbHVlKCkpOworCisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmZvcmNlS2V5c3BhY2VGbHVzaChLRVlTUEFDRSwgVEFCTEUpOworCisgICAgICAgIHdyaXRlQW5kRmx1c2goMTAwKTsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBtZXRyaWNzLmNvbnRlbnRpb25UaW1lLmxhdGVuY3kuZ2V0U25hcHNob3QoKS5kdW1wKHN0cmVhbSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgbWV0cmljcy5jb250ZW5kZWRQdXRzLmdldENvdW50KCkgKyBtZXRyaWNzLnVuY29udGVuZGVkUHV0cy5nZXRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtZXRyaWNzLmNvbnRlbmRlZFB1dHMuZ2V0Q291bnQoKSwgZ3JlYXRlclRoYW4oMEwpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtZXRyaWNzLmNvbnRlbnRpb25UaW1lLnRvdGFsTGF0ZW5jeS5nZXRDb3VudCgpLCBncmVhdGVyVGhhbigwTCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ldHJpY3NDbGVhbnVwT25Ecm9wKCkKKyAgICB7CisgICAgICAgIFN0cmluZyB0YWJsZU5hbWUgPSBUQUJMRSArICJfbWV0cmljc19jbGVhbnVwIjsKKyAgICAgICAgQ2Fzc2FuZHJhTWV0cmljc1JlZ2lzdHJ5IHJlZ2lzdHJ5ID0gQ2Fzc2FuZHJhTWV0cmljc1JlZ2lzdHJ5Lk1ldHJpY3M7CisgICAgICAgIFN1cHBsaWVyPFN0cmVhbTxTdHJpbmc+PiBtZXRyaWNzID0gKCkgLT4gcmVnaXN0cnkuZ2V0TmFtZXMoKS5zdHJlYW0oKS5maWx0ZXIobSAtPiBtLmNvbnRhaW5zKHRhYmxlTmFtZSkpOworCisgICAgICAgIC8vIG5vIG1ldHJpY3MgYmVmb3JlIGNyZWF0aW5nCisgICAgICAgIGFzc2VydEVxdWFscygwLCBtZXRyaWNzLmdldCgpLmNvdW50KCkpOworCisgICAgICAgIHJlY3JlYXRlVGFibGUodGFibGVOYW1lKTsKKyAgICAgICAgLy8gc29tZSBtZXRyaWNzCisgICAgICAgIGFzc2VydFRydWUobWV0cmljcy5nZXQoKS5jb3VudCgpID4gMCk7CisKKyAgICAgICAgc2Vzc2lvbi5leGVjdXRlKFN0cmluZy5mb3JtYXQoIkRST1AgVEFCTEUgSUYgRVhJU1RTICVzLiVzIiwgS0VZU1BBQ0UsIHRhYmxlTmFtZSkpOworICAgICAgICAvLyBubyBtZXRyaWNzIGFmdGVyIGRyb3AKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldHJpY3MuZ2V0KCkuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoIiwiKSksIDAsIG1ldHJpY3MuZ2V0KCkuY291bnQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBUcmllTWVtdGFibGVNZXRyaWNzVmlldyBnZXRNZW10YWJsZU1ldHJpY3MoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUcmllTWVtdGFibGVNZXRyaWNzVmlldyhjZnMua2V5c3BhY2UuZ2V0TmFtZSgpLCBjZnMubmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlQW5kRmx1c2goaW50IHJvd3MpIHRocm93cyBJT0V4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9nZ2VyLmluZm8oIndyaXRpbmcge30gcm93cyIsIHJvd3MpOworICAgICAgICBGdXR1cmVbXSBmdXR1cmVzID0gbmV3IEZ1dHVyZVtyb3dzXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJ3cml0aW5nIHt9IHJvdyIsIGkpOworICAgICAgICAgICAgZnV0dXJlc1tpXSA9IHNlc3Npb24uZXhlY3V0ZUFzeW5jKFN0cmluZy5mb3JtYXQoIklOU0VSVCBJTlRPICVzLiVzIChpZCwgdmFsMSwgdmFsMikgVkFMVUVTICglZCwgJyVzJywgJyVzJykiLCBLRVlTUEFDRSwgVEFCTEUsIGksICJ2YWwiICsgaSwgInZhbCIgKyBpKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3dzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZ1dHVyZXNbaV0uZ2V0KCk7CisgICAgICAgICAgICBsb2dnZXIuaW5mbygid3JpdGluZyB7fSByb3cgY29tcGxldGVkIiwgaSk7CisgICAgICAgIH0KKyAgICAgICAgbG9nZ2VyLmluZm8oImZvcmNpbmcgZmx1c2giKTsKKyAgICAgICAgU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuZm9yY2VLZXlzcGFjZUZsdXNoKEtFWVNQQUNFLCBUQUJMRSk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJ0YWJsZSBmbHVzaGVkIik7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhcmRvd24oKQorICAgIHsKKyAgICAgICAgc2Vzc2lvbi5jbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvQ29ubmVjdGlvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvQ29ubmVjdGlvblRlc3QuamF2YQppbmRleCBlYzQ0N2FhLi41M2JjN2M1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0Nvbm5lY3Rpb25UZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9Db25uZWN0aW9uVGVzdC5qYXZhCkBAIC01NSwxMCArNTUsMTAgQEAKIGltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxIYW5kbGVyQ29udGV4dDsKIGltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxPdXRib3VuZEhhbmRsZXJBZGFwdGVyOwogaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbFByb21pc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5FbmNyeXB0aW9uT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLlJlcXVlc3RGYWlsdXJlUmVhc29uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuVW5rbm93bkNvbHVtbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5JVmVyc2lvbmVkQXN5bW1ldHJpY1NlcmlhbGl6ZXI7CkBAIC03MSw2ICs3MSw3IEBACiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlOVVRFUzsKIGltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5TU0xfU1RPUkFHRV9QT1JUOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzMwOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzMwMTQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdpbmdTZXJ2aWNlLlZFUlNJT05fNDA7CkBAIC01NzMsOSArNTc0LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQZW5kaW5nT3V0Ym91bmRDb25uZWN0aW9uVXBkYXRlc01lc3NhZ2VWZXJzaW9uT25SZWNvbm5lY3RBdHRlbXB0KCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHN0b3JhZ2VQb3J0UHJvcGVydHkgPSBDb25maWcuUFJPUEVSVFlfUFJFRklYICsgInNzbF9zdG9yYWdlX3BvcnQiOwotICAgICAgICBmaW5hbCBTdHJpbmcgb3JpZ2luYWxTdG9yYWdlUG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShzdG9yYWdlUG9ydFByb3BlcnR5KTsKLSAgICAgICAgdHJ5CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChTU0xfU1RPUkFHRV9QT1JULCA3MDExKSkKICAgICAgICAgewogICAgICAgICAgICAgLy8gU2V0IHVwIGFuIGluYm91bmQgY29ubmVjdGlvbiBsaXN0ZW5pbmcgKm9ubHkqIG9uIHRoZSBTU0wgc3RvcmFnZSBwb3J0IHRvCiAgICAgICAgICAgICAvLyByZXBsaWNhdGUgYSAzLnggbm9kZS4gIEZvcmNlIHRoZSBtZXNzYWdpbmcgdmVyc2lvbiB0byBiZSBpbmNvcnJlY3RseSBzZXQgdG8gNC4wCkBAIC01ODYsNyArNTg1LDYgQEAKICAgICAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS52ZXJzaW9ucy5zZXQoRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnaW5nU2VydmljZS5WRVJTSU9OXzQwKTsKIAotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KHN0b3JhZ2VQb3J0UHJvcGVydHksICI3MDExIik7CiAgICAgICAgICAgICBmaW5hbCBJbmV0QWRkcmVzc0FuZFBvcnQgbGVnYWN5U1NMQWRkcnNBbmRQb3J0ID0gZW5kcG9pbnQud2l0aFBvcnQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTTFN0b3JhZ2VQb3J0KCkpOwogICAgICAgICAgICAgSW5ib3VuZENvbm5lY3Rpb25TZXR0aW5ncyBpbmJvdW5kU2V0dGluZ3MgPSBzZXR0aW5ncy5pbmJvdW5kLmFwcGx5KG5ldyBJbmJvdW5kQ29ubmVjdGlvblNldHRpbmdzKCkud2l0aEVuY3J5cHRpb24oZW5jcnlwdGlvbk9wdGlvbnMpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhCaW5kQWRkcmVzcyhsZWdhY3lTU0xBZGRyc0FuZFBvcnQpCkBAIC02NTMsMTAgKzY1MSw2IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKS52ZXJzaW9ucy5zZXQoRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF92ZXJzaW9uKTsKLSAgICAgICAgICAgIGlmIChvcmlnaW5hbFN0b3JhZ2VQb3J0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KHN0b3JhZ2VQb3J0UHJvcGVydHksIG9yaWdpbmFsU3RvcmFnZVBvcnQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KHN0b3JhZ2VQb3J0UHJvcGVydHkpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0ZyYW1pbmdUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0ZyYW1pbmdUZXN0LmphdmEKaW5kZXggODFmOTVmMy4uMThlMzE3OSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9GcmFtaW5nVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvRnJhbWluZ1Rlc3QuamF2YQpAQCAtNzEsMTMgKzcxLDEzIEBACiAKICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlcmlhbGl6ZShieXRlW10gdCwgRGF0YU91dHB1dFBsdXMgb3V0LCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlVW5zaWduZWRWSW50KHQubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQzMih0Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgb3V0LndyaXRlKHQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIGRlc2VyaWFsaXplKERhdGFJbnB1dFBsdXMgaW4sIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBieXRlW10gciA9IG5ldyBieXRlWyhpbnQpIGluLnJlYWRVbnNpZ25lZFZJbnQoKV07CisgICAgICAgICAgICAgICAgYnl0ZVtdIHIgPSBuZXcgYnl0ZVtpbi5yZWFkVW5zaWduZWRWSW50MzIoKV07CiAgICAgICAgICAgICAgICAgaW4ucmVhZEZ1bGx5KHIpOwogICAgICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9IYW5kc2hha2VUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0hhbmRzaGFrZVRlc3QuamF2YQppbmRleCA3NWFlMTAzLi4zNjQzOWY1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0hhbmRzaGFrZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L0hhbmRzaGFrZVRlc3QuamF2YQpAQCAtMTksMTAgKzE5LDIwIEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldDsKIAogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLkNsb3NlZENoYW5uZWxFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5uZXQuSW5ldEFkZHJlc3NlczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5FbmNyeXB0aW9uT3B0aW9ucy5TZXJ2ZXJFbmNyeXB0aW9uT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuUGFyYW1ldGVyaXplZENsYXNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5Hb3NzaXBEaWdlc3RTeW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmNvbmN1cnJlbnQuQXN5bmNQcm9taXNlOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CkBAIC00MiwxMSArNTIsMTUgQEAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2UubWluaW11bV92ZXJzaW9uOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuQ29ubmVjdGlvblR5cGUuU01BTExfTUVTU0FHRVM7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5PdXRib3VuZENvbm5lY3Rpb25Jbml0aWF0b3IuKjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCiAvLyBUT0RPOiB0ZXN0IGZhaWx1cmUgZHVlIHRvIGV4Y2VwdGlvbiwgdGltZW91dCwgZXRjCiBwdWJsaWMgY2xhc3MgSGFuZHNoYWtlVGVzdAogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNvY2tldEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBTb2NrZXRGYWN0b3J5KCk7CisgICAgc3RhdGljIGZpbmFsIEluZXRBZGRyZXNzQW5kUG9ydCBUT19BRERSID0gSW5ldEFkZHJlc3NBbmRQb3J0LmdldEJ5QWRkcmVzc092ZXJyaWRlRGVmYXVsdHMoSW5ldEFkZHJlc3Nlcy5mb3JTdHJpbmcoIjEyNy4wLjAuMiIpLCA3MDEyKTsKKyAgICBzdGF0aWMgZmluYWwgSW5ldEFkZHJlc3NBbmRQb3J0IEZST01fQUREUiA9IEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeUFkZHJlc3NPdmVycmlkZURlZmF1bHRzKEluZXRBZGRyZXNzZXMuZm9yU3RyaW5nKCIxMjcuMC4wLjEiKSwgNzAxMik7CiAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3RhcnR1cCgpCkBAIC04MCw2ICs5NCw3IEBACiAgICAgICAgICAgICBGdXR1cmU8UmVzdWx0PE1lc3NhZ2luZ1N1Y2Nlc3M+PiBmdXR1cmUgPQogICAgICAgICAgICAgaW5pdGlhdGVNZXNzYWdpbmcoZXZlbnRMb29wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01BTExfTUVTU0FHRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNFUlZFUl9DT05GSUcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT3V0Ym91bmRDb25uZWN0aW9uU2V0dGluZ3MoZW5kcG9pbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBY2NlcHRWZXJzaW9ucyhhY2NlcHRPdXRib3VuZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aERlZmF1bHRzKENvbm5lY3Rpb25DYXRlZ29yeS5NRVNTQUdJTkcpLApAQCAtOTIsNiArMTA3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Qm90aEN1cnJlbnRWZXJzaW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24KICAgICB7CkBAIC0xNzIsNyArMTg4LDcgQEAKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIENsb3NlZENoYW5uZWxFeGNlcHRpb24pOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDbG9zZWRDaGFubmVsRXhjZXB0aW9uKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTg2LDcgKzIwMiw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKQogICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDbG9zZWRDaGFubmVsRXhjZXB0aW9uKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIwNyw3ICsyMjMsNyBAQAogICAgICAgICB9CiAgICAgICAgIGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkKICAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgQ2xvc2VkQ2hhbm5lbEV4Y2VwdGlvbik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIENsb3NlZENoYW5uZWxFeGNlcHRpb24pOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yMTgsNCArMjM0LDE2NSBAQAogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFJlc3VsdC5PdXRjb21lLlNVQ0NFU1MsIHJlc3VsdC5vdXRjb21lKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhWRVJTSU9OXzMwLCByZXN1bHQuc3VjY2VzcygpLm1lc3NhZ2luZ1ZlcnNpb24pOwogICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE91dGJvdW5kQ29ubmVjdGlvbmZGYWxsYmFja0R1cmluZ1VwZ3JhZGVzKCkgdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBVcGdyYWRlIGZyb20gTm9uLVNTTCAtPiBPcHRpb25hbCBTU0wKKyAgICAgICAgLy8gT3V0Ym91bmQgY29ubmVjdGlvbiBmcm9tIE9wdGlvbmFsIFNTTChuZXcgbm9kZSkgLT4gTm9uLVNTTCAob2xkIG5vZGUpCisgICAgICAgIHRlc3RPdXRib3VuZEZhbGxiYWNrT25TU0xIYW5kc2hha2VGYWlsdXJlKFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuU1NMLCB0cnVlLCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLk5PX1NTTCwgZmFsc2UpOworCisgICAgICAgIC8vIFVwZ3JhZGUgZnJvbSBPcHRpb25hbCBTU0wgLT4gU3RyaWN0IFNTTAorICAgICAgICAvLyBPdXRib3VuZCBjb25uZWN0aW9uIGZyb20gU3RyaWN0IFNTTChuZXcgbm9kZSkgLT4gT3B0aW9uYWwgU1NMIChvbGQgbm9kZSkKKyAgICAgICAgdGVzdE91dGJvdW5kRmFsbGJhY2tPblNTTEhhbmRzaGFrZUZhaWx1cmUoU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5TU0wsIGZhbHNlLCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNTTCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gVXBncmFkZSBmcm9tIE9wdGlvbmFsIFNTTCAtPiBTdHJpY3QgTVRMUworICAgICAgICAvLyBPdXRib3VuZCBjb25uZWN0aW9uIGZyb20gU3RyaWN0IE1UTFMobmV3IG5vZGUpIC0+IE9wdGlvbmFsIFNTTCAob2xkIG5vZGUpCisgICAgICAgIHRlc3RPdXRib3VuZEZhbGxiYWNrT25TU0xIYW5kc2hha2VGYWlsdXJlKFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuTVRMUywgZmFsc2UsIFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuU1NMLCB0cnVlKTsKKworICAgICAgICAvLyBVcGdyYWRlIGZyb20gU3RyaWN0IFNTTCAtPiBPcHRpb25hbCBNVExTCisgICAgICAgIC8vIE91dGJvdW5kIGNvbm5lY3Rpb24gZnJvbSBPcHRpb25hbCBNVExTKG5ldyBub2RlKSAtPiBTdHJpY3QgU1NMIChvbGQgbm9kZSkKKyAgICAgICAgdGVzdE91dGJvdW5kRmFsbGJhY2tPblNTTEhhbmRzaGFrZUZhaWx1cmUoU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5NVExTLCB0cnVlLCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNTTCwgZmFsc2UpOworCisgICAgICAgIC8vIFVwZ3JhZGUgZnJvbSBTdHJpY3QgT3B0aW9uYWwgTVRMUyAtPiBTdHJpY3QgTVRMUworICAgICAgICAvLyBPdXRib3VuZCBjb25uZWN0aW9uIGZyb20gU3RyaWN0IFRMUyhuZXcgbm9kZSkgLT4gT3B0aW9uYWwgVExTIChvbGQgbm9kZSkKKyAgICAgICAgdGVzdE91dGJvdW5kRmFsbGJhY2tPblNTTEhhbmRzaGFrZUZhaWx1cmUoU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5NVExTLCBmYWxzZSwgU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5NVExTLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRib3VuZENvbm5lY3Rpb25mRmFsbGJhY2tEdXJpbmdEb3duZ3JhZGVzKCkgdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBGcm9tIFN0cmljdCBNVExTIC0+IE9wdGlvbmFsIE1UTFMKKyAgICAgICAgLy8gT3V0Ym91bmQgY29ubmVjdGlvbiBmcm9tIE9wdGlvbmFsIFRMUyhuZXcgbm9kZSkgLT4gU3RyaWN0IE1UTFMgKG9sZCBub2RlKQorICAgICAgICB0ZXN0T3V0Ym91bmRGYWxsYmFja09uU1NMSGFuZHNoYWtlRmFpbHVyZShTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLk1UTFMsIHRydWUsIFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuTVRMUywgZmFsc2UpOworCisgICAgICAgIC8vIEZyb20gT3B0aW9uYWwgTVRMUyAtPiBTdHJpY3QgU1NMCisgICAgICAgIC8vIE91dGJvdW5kIGNvbm5lY3Rpb24gZnJvbSBTdHJpY3QgU1NMKG5ldyBub2RlKSAtPiBPcHRpb25hbCBNVExTIChvbGQgbm9kZSkKKyAgICAgICAgdGVzdE91dGJvdW5kRmFsbGJhY2tPblNTTEhhbmRzaGFrZUZhaWx1cmUoU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5TU0wsIGZhbHNlLCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLk1UTFMsIHRydWUpOworCisgICAgICAgIC8vIEZyb20gU3RyaWN0IE1UTFMgLT4gT3B0aW9uYWwgU1NMCisgICAgICAgIC8vIE91dGJvdW5kIGNvbm5lY3Rpb24gZnJvbSBPcHRpb25hbCBTU0wobmV3IG5vZGUpIC0+IFN0cmljdCBNVExTIChvbGQgbm9kZSkKKyAgICAgICAgdGVzdE91dGJvdW5kRmFsbGJhY2tPblNTTEhhbmRzaGFrZUZhaWx1cmUoU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5TU0wsIHRydWUsIFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuTVRMUywgZmFsc2UpOworCisgICAgICAgIC8vIEZyb20gU3RyaWN0IFNTTCAtPiBPcHRpb25hbCBTU0wKKyAgICAgICAgLy8gT3V0Ym91bmQgY29ubmVjdGlvbiBmcm9tIE9wdGlvbmFsIFNTTChuZXcgbm9kZSkgLT4gU3RyaWN0IFNTTCAob2xkIG5vZGUpCisgICAgICAgIHRlc3RPdXRib3VuZEZhbGxiYWNrT25TU0xIYW5kc2hha2VGYWlsdXJlKFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuU1NMLCB0cnVlLCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNTTCwgZmFsc2UpOworCisgICAgICAgIC8vIEZyb20gT3B0aW9uYWwgU1NMIC0+IE5vbi1TU0wKKyAgICAgICAgLy8gT3V0Ym91bmQgY29ubmVjdGlvbiBmcm9tIE5vbi1TU0wobmV3IG5vZGUpIC0+IE9wdGlvbmFsIFNTTCAob2xkIG5vZGUpCisgICAgICAgIHRlc3RPdXRib3VuZEZhbGxiYWNrT25TU0xIYW5kc2hha2VGYWlsdXJlKFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuTk9fU1NMLCBmYWxzZSwgU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5TU0wsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE91dGJvdW5kQ29ubmVjdGlvbkRvZXNudEZhbGxiYWNrV2hlbkVycm9ySXNOb3RTU0xSZWxhdGVkKCkgdGhyb3dzIENsb3NlZENoYW5uZWxFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBDb25maWd1cmluZyBub2RlcyBpbiBPcHRpb25hbCBTU0wgbW9kZQorICAgICAgICAvLyB3aGVuIG9wdGlvbmFsIG1vZGUgaXMgZW5hYmxlZCwgaWYgdGhlIGNvbm5lY3Rpb24gZXJyb3IgaXMgU1NMIHJlbGF0ZWQsIGZhbGxiYWNrIHRvIGFub3RoZXIgU1NMIHN0cmF0ZWd5IHNob3VsZCBoYXBwZW4sCisgICAgICAgIC8vIG90aGVyd2lzZSBpdCBzaG91bGQgdXNlIHNhbWUgU1NMIHN0cmF0ZWd5IGFuZCByZXRyeQorICAgICAgICBTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyBzZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyA9IGdldFNlcnZlckVuY3J5cHRpb25PcHRpb25zKFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUuU1NMLCB0cnVlKTsKKyAgICAgICAgSW5ib3VuZFNvY2tldHMgaW5ib3VuZCA9IGdldEluYm91bmRTb2NrZXQoc2VydmVyRW5jcnlwdGlvbk9wdGlvbnMpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IGVuZHBvaW50ID0gaW5ib3VuZC5zb2NrZXRzKCkuc3RyZWFtKCkubWFwKHMgLT4gcy5zZXR0aW5ncy5iaW5kQWRkcmVzcykuZmluZEZpcnN0KCkuZ2V0KCk7CisKKyAgICAgICAgICAgIC8vIE9wZW4gb3V0Ym91bmQgY29ubmVjdGlvbnMgYmVmb3JlIHNlcnZlciBzdGFydHMgbGlzdGVuaW5nCisgICAgICAgICAgICAvLyBUaGUgY29ubmVjdGlvbiBzaG91bGQgYmUgYWNjZXB0ZWQgYWZ0ZXIgb3BlbmluZyBpbmJvdW5kIGNvbm5lY3Rpb25zLCB3aXRoIHRoZSBzYW1lIFNTTCBjb250ZXh0IHdpdGhvdXQgZmFsbGJhY2sKKyAgICAgICAgICAgIE91dGJvdW5kQ29ubmVjdGlvbiBvdXRib3VuZENvbm5lY3Rpb24gPSBpbml0aWF0ZU91dGJvdW5kKGVuZHBvaW50LCBTc2xGYWxsYmFja0Nvbm5lY3Rpb25UeXBlLlNTTCwgdHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIExldCB0aGUgb3V0Ym91bmQgY29ubmVjdGlvbiBiZSB0cmllZCBmb3IgNCB0aW1lcyBhdGxlYXN0CisgICAgICAgICAgICB3aGlsZSAob3V0Ym91bmRDb25uZWN0aW9uLmNvbm5lY3Rpb25BdHRlbXB0cygpIDwgU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS52YWx1ZXMoKS5sZW5ndGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RmFsc2Uob3V0Ym91bmRDb25uZWN0aW9uLmlzQ29ubmVjdGVkKCkpOworICAgICAgICAgICAgaW5ib3VuZC5vcGVuKCk7CisgICAgICAgICAgICAvLyBBcyBzb29uIGFzIHRoZSBub2RlIGFjY2VwdHMgaW5ib3VuZCBjb25uZWN0aW9ucywgdGhlIGNvbm5lY3Rpb24gbXVzdCBiZSBlc3RhYmxpc2hlZCB3aXRoIHJpZ2h0IFNTTCBjb250ZXh0CisgICAgICAgICAgICB3YWl0Rm9yQ29ubmVjdGlvbihvdXRib3VuZENvbm5lY3Rpb24pOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShvdXRib3VuZENvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBpbmJvdW5kLmNsb3NlKCkuYXdhaXQoMTBMLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgZ2V0U2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZSBzc2xDb25uZWN0aW9uVHlwZSwgYm9vbGVhbiBvcHRpb25hbCkKKyAgICB7CisgICAgICAgIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIHNlcnZlckVuY3J5cHRpb25PcHRpb25zID0gbmV3IFNlcnZlckVuY3J5cHRpb25PcHRpb25zKCkud2l0aE9wdGlvbmFsKG9wdGlvbmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhLZXlTdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC5rZXlzdG9yZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aE91dGJvdW5kS2V5c3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Rfb3V0Ym91bmQua2V5c3RvcmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhPdXRib3VuZEtleXN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFRydXN0U3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3QudHJ1c3RzdG9yZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFRydXN0U3RvcmVQYXNzd29yZCgiY2Fzc2FuZHJhIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU3NsQ29udGV4dEZhY3RvcnkoKG5ldyBQYXJhbWV0ZXJpemVkQ2xhc3MoRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8PigpKSkpOworICAgICAgICBpZiAoc3NsQ29ubmVjdGlvblR5cGUgPT0gU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5NVExTKQorICAgICAgICB7CisgICAgICAgICAgICBzZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyA9IHNlcnZlckVuY3J5cHRpb25PcHRpb25zLndpdGhJbnRlcm5vZGVFbmNyeXB0aW9uKFNlcnZlckVuY3J5cHRpb25PcHRpb25zLkludGVybm9kZUVuY3J5cHRpb24uYWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoUmVxdWlyZUNsaWVudEF1dGgodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3NsQ29ubmVjdGlvblR5cGUgPT0gU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZS5TU0wpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcnZlckVuY3J5cHRpb25PcHRpb25zID0gc2VydmVyRW5jcnlwdGlvbk9wdGlvbnMud2l0aEludGVybm9kZUVuY3J5cHRpb24oU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMuSW50ZXJub2RlRW5jcnlwdGlvbi5hbGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhSZXF1aXJlQ2xpZW50QXV0aChmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlcnZlckVuY3J5cHRpb25PcHRpb25zOworICAgIH0KKworICAgIHByaXZhdGUgSW5ib3VuZFNvY2tldHMgZ2V0SW5ib3VuZFNvY2tldChTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyBzZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucykKKyAgICB7CisgICAgICAgIEluYm91bmRDb25uZWN0aW9uU2V0dGluZ3Mgc2V0dGluZ3MgPSBuZXcgSW5ib3VuZENvbm5lY3Rpb25TZXR0aW5ncygpLndpdGhBY2NlcHRNZXNzYWdpbmcobmV3IEFjY2VwdFZlcnNpb25zKG1pbmltdW1fdmVyc2lvbiwgY3VycmVudF92ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEVuY3J5cHRpb24oc2VydmVyRW5jcnlwdGlvbk9wdGlvbnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhCaW5kQWRkcmVzcyhUT19BRERSKTsKKyAgICAgICAgTGlzdDxJbmJvdW5kQ29ubmVjdGlvblNldHRpbmdzPiBzZXR0aW5nc0xpc3QgPSAgbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHNldHRpbmdzTGlzdC5hZGQoc2V0dGluZ3MpOworICAgICAgICByZXR1cm4gbmV3IEluYm91bmRTb2NrZXRzKHNldHRpbmdzTGlzdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBPdXRib3VuZENvbm5lY3Rpb24gaW5pdGlhdGVPdXRib3VuZChJbmV0QWRkcmVzc0FuZFBvcnQgZW5kcG9pbnQsIFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUgY29ubmVjdGlvblR5cGUsIGJvb2xlYW4gb3B0aW9uYWwpIHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uCisgICAgeworICAgICAgICBmaW5hbCBPdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBPdXRib3VuZENvbm5lY3Rpb25TZXR0aW5ncyhlbmRwb2ludCkKKyAgICAgICAgLndpdGhBY2NlcHRWZXJzaW9ucyhuZXcgQWNjZXB0VmVyc2lvbnMobWluaW11bV92ZXJzaW9uLCBjdXJyZW50X3ZlcnNpb24pKQorICAgICAgICAud2l0aERlZmF1bHRzKENvbm5lY3Rpb25DYXRlZ29yeS5NRVNTQUdJTkcpCisgICAgICAgIC53aXRoRW5jcnlwdGlvbihnZXRTZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyhjb25uZWN0aW9uVHlwZSwgb3B0aW9uYWwpKQorICAgICAgICAud2l0aEZyb20oRlJPTV9BRERSKTsKKyAgICAgICAgT3V0Ym91bmRDb25uZWN0aW9ucyBvdXRib3VuZENvbm5lY3Rpb25zID0gT3V0Ym91bmRDb25uZWN0aW9ucy50cnlSZWdpc3RlcihuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpLCBUT19BRERSLCBzZXR0aW5ncyk7CisgICAgICAgIEdvc3NpcERpZ2VzdFN5biBzeW4gPSBuZXcgR29zc2lwRGlnZXN0U3luKCJjbHVzdGVyIiwgInBhcnRpdGlvbmVyIiwgbmV3IEFycmF5TGlzdDw+KDApKTsKKyAgICAgICAgTWVzc2FnZTxHb3NzaXBEaWdlc3RTeW4+IG1lc3NhZ2UgPSBNZXNzYWdlLm91dChWZXJiLkdPU1NJUF9ESUdFU1RfU1lOLCBzeW4pOworICAgICAgICBPdXRib3VuZENvbm5lY3Rpb24gb3V0Ym91bmRDb25uZWN0aW9uID0gb3V0Ym91bmRDb25uZWN0aW9ucy5jb25uZWN0aW9uRm9yKG1lc3NhZ2UpOworICAgICAgICBvdXRib3VuZENvbm5lY3Rpb24uZW5xdWV1ZShtZXNzYWdlKTsKKyAgICAgICAgb3V0Ym91bmRDb25uZWN0aW9uLmluaXRpYXRlKCk7CisgICAgICAgIHJldHVybiBvdXRib3VuZENvbm5lY3Rpb247CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RPdXRib3VuZEZhbGxiYWNrT25TU0xIYW5kc2hha2VGYWlsdXJlKFNzbEZhbGxiYWNrQ29ubmVjdGlvblR5cGUgZnJvbUNvbm5lY3Rpb25UeXBlLCBib29sZWFuIGZyb21PcHRpb25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3NsRmFsbGJhY2tDb25uZWN0aW9uVHlwZSB0b0Nvbm5lY3Rpb25UeXBlLCBib29sZWFuIHRvT3B0aW9uYWwpIHRocm93cyBDbG9zZWRDaGFubmVsRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gQ29uZmlndXJlcyBpbmJvdW5kIGNvbm5lY3Rpb25zIHRvIGJlIG9wdGlvbmFsIG1UTFMKKyAgICAgICAgSW5ib3VuZFNvY2tldHMgaW5ib3VuZCA9IGdldEluYm91bmRTb2NrZXQoZ2V0U2VydmVyRW5jcnlwdGlvbk9wdGlvbnModG9Db25uZWN0aW9uVHlwZSwgdG9PcHRpb25hbCkpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IGVuZHBvaW50ID0gaW5ib3VuZC5zb2NrZXRzKCkuc3RyZWFtKCkubWFwKHMgLT4gcy5zZXR0aW5ncy5iaW5kQWRkcmVzcykuZmluZEZpcnN0KCkuZ2V0KCk7CisgICAgICAgICAgICBpbmJvdW5kLm9wZW4oKTsKKworICAgICAgICAgICAgLy8gT3BlbiBvdXRib3VuZCBjb25uZWN0aW9ucywgYW5kIHdhaXQgdW50aWwgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZAorICAgICAgICAgICAgT3V0Ym91bmRDb25uZWN0aW9uIG91dGJvdW5kQ29ubmVjdGlvbiA9IGluaXRpYXRlT3V0Ym91bmQoZW5kcG9pbnQsIGZyb21Db25uZWN0aW9uVHlwZSwgZnJvbU9wdGlvbmFsKTsKKyAgICAgICAgICAgIHdhaXRGb3JDb25uZWN0aW9uKG91dGJvdW5kQ29ubmVjdGlvbik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG91dGJvdW5kQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGluYm91bmQuY2xvc2UoKS5hd2FpdCgxMEwsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdhaXRGb3JDb25uZWN0aW9uKE91dGJvdW5kQ29ubmVjdGlvbiBvdXRib3VuZENvbm5lY3Rpb24pIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgd2hpbGUgKCFvdXRib3VuZENvbm5lY3Rpb24uaXNDb25uZWN0ZWQoKSAmJiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZSA8IDYwMDAwKQorICAgICAgICB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L01lc3NhZ2VTZXJpYWxpemF0aW9uUHJvcGVydHlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L01lc3NhZ2VTZXJpYWxpemF0aW9uUHJvcGVydHlUZXN0LmphdmEKaW5kZXggNWE3M2NiZC4uNDM5MWQyNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdlU2VyaWFsaXphdGlvblByb3BlcnR5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvTWVzc2FnZVNlcmlhbGl6YXRpb25Qcm9wZXJ0eVRlc3QuamF2YQpAQCAtNDAsNiArNDAsOSBAQAogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNMT0NLX01PTk9UT05JQ19BUFBST1g7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0xPQ0tfTU9OT1RPTklDX1BSRUNJU0U7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuT1JHX0FQQUNIRV9DQVNTQU5EUkFfRElTQUJMRV9NQkVBTl9SRUdJU1RSQVRJT047CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm5ldC5NZXNzYWdlLnNlcmlhbGl6ZXI7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNhc3NhbmRyYUdlbmVyYXRvcnMuTUVTU0FHRV9HRU47CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZhaWxpbmdDb25zdW1lci5vckZhaWw7CkBAIC01MCwxMCArNTMsMTAgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXNhYmxlX21iZWFuX3JlZ2lzdHJhdGlvbiIsICJ0cnVlIik7CisgICAgICAgIE9SR19BUEFDSEVfQ0FTU0FORFJBX0RJU0FCTEVfTUJFQU5fUkVHSVNUUkFUSU9OLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIC8vIG1lc3NhZ2Ugc2VyaWFsaXphdGlvbiB1c2VzIHRoZSBNb25vdG9uaWNDbG9jayBjbGFzcyBmb3IgcHJlY2lzZSBhbmQgYXBwcm94IHRpbWVzdGFtcHMsIHNvIG1vY2sgaXQgb3V0Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLm1vbm90b25pY19jbG9jay5wcmVjaXNlIiwgRml4ZWRNb25vdG9uaWNDbG9jay5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5tb25vdG9uaWNfY2xvY2suYXBwcm94IiwgRml4ZWRNb25vdG9uaWNDbG9jay5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBDTE9DS19NT05PVE9OSUNfUFJFQ0lTRS5zZXRTdHJpbmcoRml4ZWRNb25vdG9uaWNDbG9jay5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBDTE9DS19NT05PVE9OSUNfQVBQUk9YLnNldFN0cmluZyhGaXhlZE1vbm90b25pY0Nsb2NrLmNsYXNzLmdldE5hbWUoKSk7CiAKICAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdpbmdTZXJ2aWNlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9NZXNzYWdpbmdTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IDM0OWQ4NjUuLjMyZDUwNTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvTWVzc2FnaW5nU2VydmljZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L01lc3NhZ2luZ1NlcnZpY2VUZXN0LmphdmEKQEAgLTI1LDYgKzI1LDcgQEAKIGltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Bc3luY2hyb25vdXNTb2NrZXRDaGFubmVsOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0zNSwzMSArMzYsMzUgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lio7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5uZXQuSW5ldEFkZHJlc3NlczsKLQotaW1wb3J0IGNvbS5jb2RhaGFsZS5tZXRyaWNzLlRpbWVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JSW50ZXJub2RlQXV0aGVudGljYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5FbmNyeXB0aW9uT3B0aW9ucy5TZXJ2ZXJFbmNyeXB0aW9uT3B0aW9uczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3MuTWVzc2FnaW5nTWV0cmljczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5leGNlcHRpb25zLkNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmF3YWl0aWxpdHkuQXdhaXRpbGl0eTsKLWltcG9ydCBvcmcuY2FmZmluaXRhcy5vaGMuaGlzdG8uRXN0aW1hdGVkSGlzdG9ncmFtOwogaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgY29tLmNvZGFoYWxlLm1ldHJpY3MuVGltZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuYXV0aC5JSW50ZXJub2RlQXV0aGVudGljYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5FbmNyeXB0aW9uT3B0aW9ucy5TZXJ2ZXJFbmNyeXB0aW9uT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLk1lc3NhZ2luZ01ldHJpY3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmF3YWl0aWxpdHkuQXdhaXRpbGl0eTsKK2ltcG9ydCBvcmcuY2FmZmluaXRhcy5vaGMuaGlzdG8uRXN0aW1hdGVkSGlzdG9ncmFtOworCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIHB1YmxpYyBjbGFzcyBNZXNzYWdpbmdTZXJ2aWNlVGVzdAogewpAQCAtNjcsNyArNzIsOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgQXRvbWljSW50ZWdlciByZWplY3RlZENvbm5lY3Rpb25zID0gbmV3IEF0b21pY0ludGVnZXIoKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElJbnRlcm5vZGVBdXRoZW50aWNhdG9yIEFMTE9XX05PVEhJTkdfQVVUSEVOVElDQVRPUiA9IG5ldyBJSW50ZXJub2RlQXV0aGVudGljYXRvcigpCiAgICAgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoSW5ldEFkZHJlc3MgcmVtb3RlQWRkcmVzcywgaW50IHJlbW90ZVBvcnQpCisgICAgICAgIHB1YmxpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShJbmV0QWRkcmVzcyByZW1vdGVBZGRyZXNzLCBpbnQgcmVtb3RlUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzLCBJbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uIGNvbm5lY3Rpb25UeXBlKQogICAgICAgICB7CiAgICAgICAgICAgICByZWplY3RlZENvbm5lY3Rpb25zLmluY3JlbWVudEFuZEdldCgpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzgsNiArODQsMjUgQEAKIAogICAgICAgICB9CiAgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSUludGVybm9kZUF1dGhlbnRpY2F0b3IgUkVKRUNUX09VVEJPVU5EX0FVVEhFTlRJQ0FUT1IgPSBuZXcgSUludGVybm9kZUF1dGhlbnRpY2F0b3IoKQorICAgIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYXV0aGVudGljYXRlKEluZXRBZGRyZXNzIHJlbW90ZUFkZHJlc3MsIGludCByZW1vdGVQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VydGlmaWNhdGVbXSBjZXJ0aWZpY2F0ZXMsIEludGVybm9kZUNvbm5lY3Rpb25EaXJlY3Rpb24gY29ubmVjdGlvblR5cGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjb25uZWN0aW9uVHlwZSA9PSBJbnRlcm5vZGVDb25uZWN0aW9uRGlyZWN0aW9uLk9VVEJPVU5EKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlamVjdGVkQ29ubmVjdGlvbnMuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorICAgICAgICB7CisKKyAgICAgICAgfQorICAgIH07CiAgICAgcHJpdmF0ZSBzdGF0aWMgSUludGVybm9kZUF1dGhlbnRpY2F0b3Igb3JpZ2luYWxBdXRoZW50aWNhdG9yOwogICAgIHByaXZhdGUgc3RhdGljIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIG9yaWdpbmFsU2VydmVyRW5jcnlwdGlvbk9wdGlvbnM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgSW5ldEFkZHJlc3NBbmRQb3J0IG9yaWdpbmFsTGlzdGVuQWRkcmVzczsKQEAgLTIyOCwxOSArMjUzLDM4IEBACiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmFpbGVkT3V0Ym91bmRJbnRlcm5vZGVBdXRoKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgTWVzc2FnaW5nU2VydmljZSBtcyA9IE1lc3NhZ2luZ1NlcnZpY2UuaW5zdGFuY2UoKTsKLSAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldEludGVybm9kZUF1dGhlbnRpY2F0b3IoQUxMT1dfTk9USElOR19BVVRIRU5USUNBVE9SKTsKLSAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IGFkZHJlc3MgPSBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlOYW1lKCIxMjcuMC4wLjI1MCIpOworICAgICAgICAvLyBMaXN0ZW4gb24gc2VydmVyc2lkZSBmb3IgY29ubmVjdGlvbnMKKyAgICAgICAgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgc2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgPSBuZXcgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoKQorICAgICAgICAud2l0aEludGVybm9kZUVuY3J5cHRpb24oU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMuSW50ZXJub2RlRW5jcnlwdGlvbi5ub25lKTsKIAotICAgICAgICAvL1Nob3VsZCByZXR1cm4gbnVsbAotICAgICAgICBpbnQgcmVqZWN0ZWRCZWZvcmUgPSByZWplY3RlZENvbm5lY3Rpb25zLmdldCgpOwotICAgICAgICBNZXNzYWdlPD8+IG1lc3NhZ2VPdXQgPSBNZXNzYWdlLm91dChWZXJiLkVDSE9fUkVRLCBOb1BheWxvYWQubm9QYXlsb2FkKTsKLSAgICAgICAgbXMuc2VuZChtZXNzYWdlT3V0LCBhZGRyZXNzKTsKLSAgICAgICAgQXdhaXRpbGl0eS5hd2FpdCgpLmF0TW9zdCgxMCwgVGltZVVuaXQuU0VDT05EUykudW50aWwoKCkgLT4gcmVqZWN0ZWRDb25uZWN0aW9ucy5nZXQoKSA+IHJlamVjdGVkQmVmb3JlKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldEludGVybm9kZUF1dGhlbnRpY2F0b3IoUkVKRUNUX09VVEJPVU5EX0FVVEhFTlRJQ0FUT1IpOworICAgICAgICBJbmV0QWRkcmVzcyBsaXN0ZW5BZGRyZXNzID0gRkJVdGlsaXRpZXMuZ2V0SnVzdExvY2FsQWRkcmVzcygpOwogCi0gICAgICAgIC8vU2hvdWxkIHRvbGVyYXRlIG51bGwKLSAgICAgICAgbXMuY2xvc2VPdXRib3VuZChhZGRyZXNzKTsKLSAgICAgICAgbXMuc2VuZChtZXNzYWdlT3V0LCBhZGRyZXNzKTsKKyAgICAgICAgSW5ib3VuZENvbm5lY3Rpb25TZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBJbmJvdW5kQ29ubmVjdGlvblNldHRpbmdzKCkud2l0aEVuY3J5cHRpb24oc2VydmVyRW5jcnlwdGlvbk9wdGlvbnMpOworICAgICAgICBJbmJvdW5kU29ja2V0cyBjb25uZWN0aW9ucyA9IG5ldyBJbmJvdW5kU29ja2V0cyhzZXR0aW5ncyk7CisKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb25zLm9wZW4oKS5hd2FpdCgpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY29ubmVjdGlvbnMuaXNMaXN0ZW5pbmcoKSk7CisKKyAgICAgICAgICAgIE1lc3NhZ2luZ1NlcnZpY2UgbXMgPSBNZXNzYWdpbmdTZXJ2aWNlLmluc3RhbmNlKCk7CisgICAgICAgICAgICAvL1Nob3VsZCByZXR1cm4gbnVsbAorICAgICAgICAgICAgaW50IHJlamVjdGVkQmVmb3JlID0gcmVqZWN0ZWRDb25uZWN0aW9ucy5nZXQoKTsKKyAgICAgICAgICAgIE1lc3NhZ2U8Pz4gbWVzc2FnZU91dCA9IE1lc3NhZ2Uub3V0KFZlcmIuRUNIT19SRVEsIE5vUGF5bG9hZC5ub1BheWxvYWQpOworICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0IGFkZHJlc3MgPSBJbmV0QWRkcmVzc0FuZFBvcnQuZ2V0QnlBZGRyZXNzKGxpc3RlbkFkZHJlc3MpOworICAgICAgICAgICAgbXMuc2VuZChtZXNzYWdlT3V0LCBhZGRyZXNzKTsKKyAgICAgICAgICAgIEF3YWl0aWxpdHkuYXdhaXQoKS5hdE1vc3QoMTAsIFRpbWVVbml0LlNFQ09ORFMpLnVudGlsKCgpIC0+IHJlamVjdGVkQ29ubmVjdGlvbnMuZ2V0KCkgPiByZWplY3RlZEJlZm9yZSk7CisKKyAgICAgICAgICAgIC8vU2hvdWxkIHRvbGVyYXRlIG51bGwKKyAgICAgICAgICAgIG1zLmNsb3NlT3V0Ym91bmQoYWRkcmVzcyk7CisgICAgICAgICAgICBtcy5zZW5kKG1lc3NhZ2VPdXQsIGFkZHJlc3MpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgY29ubmVjdGlvbnMuY2xvc2UoKS5hd2FpdCgpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGNvbm5lY3Rpb25zLmlzTGlzdGVuaW5nKCkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTI2Miw2ICszMDYsMTEgQEAKIAogICAgICAgICAgICAgaW50IHJlamVjdGVkQmVmb3JlID0gcmVqZWN0ZWRDb25uZWN0aW9ucy5nZXQoKTsKICAgICAgICAgICAgIEZ1dHVyZTxWb2lkPiBjb25uZWN0RnV0dXJlID0gdGVzdENoYW5uZWwuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MobGlzdGVuQWRkcmVzcywgRGF0YWJhc2VEZXNjcmlwdG9yLmdldFN0b3JhZ2VQb3J0KCkpKTsKKyAgICAgICAgICAgIEF3YWl0aWxpdHkuYXdhaXQoKS5hdE1vc3QoMTAsIFRpbWVVbml0LlNFQ09ORFMpLnVudGlsKGNvbm5lY3RGdXR1cmU6OmlzRG9uZSk7CisKKyAgICAgICAgICAgIC8vIFNpbmNlIGF1dGhlbnRpY2F0aW9uIGRvZXNuJ3QgaGFwcGVuIGR1cmluZyBjb25uZWN0LCB0cnkgd3JpdGluZyBhIGR1bW15IHN0cmluZyB3aGljaCB0cmlnZ2VycworICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gaGFuZGxlci4KKyAgICAgICAgICAgIHRlc3RDaGFubmVsLndyaXRlKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCJkdW1teSBzdHJpbmciKSk7CiAgICAgICAgICAgICBBd2FpdGlsaXR5LmF3YWl0KCkuYXRNb3N0KDEwLCBUaW1lVW5pdC5TRUNPTkRTKS51bnRpbCgoKSAtPiByZWplY3RlZENvbm5lY3Rpb25zLmdldCgpID4gcmVqZWN0ZWRCZWZvcmUpOwogCiAgICAgICAgICAgICBjb25uZWN0RnV0dXJlLmNhbmNlbCh0cnVlKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvU29ja2V0VXRpbHMuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9uZXQvU29ja2V0VXRpbHMuamF2YQppbmRleCA3OGE0OWJkLi4yM2QxY2M1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvbmV0L1NvY2tldFV0aWxzLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL25ldC9Tb2NrZXRVdGlscy5qYXZhCkBAIC0yMSw4ICsyMSw2IEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlRocm93YWJsZXM7Ci0KIHB1YmxpYyBjbGFzcyBTb2NrZXRVdGlscwogewogICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIGludCBmaW5kQXZhaWxhYmxlUG9ydCgpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uCkBAIC0zNyw3ICszNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IFRocm93YWJsZXMucHJvcGFnYXRlKGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICAgICAgZmluYWxseQogICAgICAgICB7CkBAIC00OSw3ICs0Nyw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVGhyb3dhYmxlcy5wcm9wYWdhdGUoZSk7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9Mb2NhbFN5bmNUYXNrVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9Mb2NhbFN5bmNUYXNrVGVzdC5qYXZhCmluZGV4IDQ3ZDUwYTIuLjQ0MDliM2MgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvTG9jYWxTeW5jVGFza1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL0xvY2FsU3luY1Rhc2tUZXN0LmphdmEKQEAgLTk4LDcgKzk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9fUEVORElOR19SRVBBSVIsIHRydWUsIHRydWUsIFByZXZpZXdLaW5kLk5PTkUpOwogICAgICAgICB0YXNrLnJ1bigpOwogCi0gICAgICAgIGFzc2VydEVxdWFscygwLCB0YXNrLmdldCgpLm51bWJlck9mRGlmZmVyZW5jZXMpOworICAgICAgICBhc3NlcnRUcnVlKHRhc2suc3RhdC5kaWZmZXJlbmNlcy5pc0VtcHR5KCkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2VkIHJhbmdlIHdhcyByZWNvcmRlZAotICAgICAgICBhc3NlcnRFcXVhbHMoIldyb25nIGRpZmZlcmluZyByYW5nZXMiLCBpbnRlcmVzdGluZy5zaXplKCksIHRhc2suc3RhdC5udW1iZXJPZkRpZmZlcmVuY2VzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXcm9uZyBkaWZmZXJpbmcgcmFuZ2VzIiwgaW50ZXJlc3Rpbmcuc2l6ZSgpLCB0YXNrLnN0YXQuZGlmZmVyZW5jZXMuc2l6ZSgpKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9SZXBhaXJKb2JUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1JlcGFpckpvYlRlc3QuamF2YQppbmRleCBjN2M2OGM0Li4wM2FjMmVkIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1JlcGFpckpvYlRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvcmVwYWlyL1JlcGFpckpvYlRlc3QuamF2YQpAQCAtMzA1LDggKzMwNSw4IEBACiAKICAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHRzKQogICAgICAgICAgICAgLmhhc1NpemUoMikKLSAgICAgICAgICAgIC5leHRyYWN0aW5nKHMgLT4gcy5udW1iZXJPZkRpZmZlcmVuY2VzKQotICAgICAgICAgICAgLmNvbnRhaW5zT25seSgxTCk7CisgICAgICAgICAgICAuZXh0cmFjdGluZyhzIC0+IHMuZGlmZmVyZW5jZXMuc2l6ZSgpKQorICAgICAgICAgICAgLmNvbnRhaW5zT25seSgxKTsKIAogICAgICAgICBhc3NlcnRUaGF0KG1lc3NhZ2VzKQogICAgICAgICAgICAgLmhhc1NpemUoMikKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9yZXBhaXIvbWVzc2FnZXMvUmVwYWlyT3B0aW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9tZXNzYWdlcy9SZXBhaXJPcHRpb25UZXN0LmphdmEKaW5kZXggYTZjYTA4NC4uMDQ4M2ZjZiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9tZXNzYWdlcy9SZXBhaXJPcHRpb25UZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3JlcGFpci9tZXNzYWdlcy9SZXBhaXJPcHRpb25UZXN0LmphdmEKQEAgLTIzLDcgKzIzLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKQEAgLTMyLDYgKzMxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcGFpci5SZXBhaXJQYXJhbGxlbGlzbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlYW1pbmcuUHJldmlld0tpbmQ7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CkBAIC0xNDksMTcgKzE0OSw3NiBAQAogCiAgICAgICAgIC8vIGRlZmF1bHQgdmFsdWUKICAgICAgICAgb3B0aW9uID0gUmVwYWlyT3B0aW9uLnBhcnNlKG9wdGlvbnMsIE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShvcHRpb24uaXNGb3JjZWRSZXBhaXIoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG9wdGlvbi5pc0ZvcmNlZFJlcGFpcigpKTsKIAogICAgICAgICAvLyBleHBsaWNpdCB0cnVlCiAgICAgICAgIG9wdGlvbnMucHV0KFJlcGFpck9wdGlvbi5GT1JDRV9SRVBBSVJfS0VZLCAidHJ1ZSIpOwogICAgICAgICBvcHRpb24gPSBSZXBhaXJPcHRpb24ucGFyc2Uob3B0aW9ucywgTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUob3B0aW9uLmlzRm9yY2VkUmVwYWlyKCkpOworICAgICAgICBhc3NlcnRUcnVlKG9wdGlvbi5pc0ZvcmNlZFJlcGFpcigpKTsKIAogICAgICAgICAvLyBleHBsaWNpdCBmYWxzZQogICAgICAgICBvcHRpb25zLnB1dChSZXBhaXJPcHRpb24uRk9SQ0VfUkVQQUlSX0tFWSwgImZhbHNlIik7CiAgICAgICAgIG9wdGlvbiA9IFJlcGFpck9wdGlvbi5wYXJzZShvcHRpb25zLCBNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2Uob3B0aW9uLmlzRm9yY2VkUmVwYWlyKCkpOworICAgICAgICBhc3NlcnRGYWxzZShvcHRpb24uaXNGb3JjZWRSZXBhaXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW1pc2VTdHJlYW1zKCkKKyAgICB7CisgICAgICAgIGJvb2xlYW4gb3B0RnVsbCA9IERhdGFiYXNlRGVzY3JpcHRvci5hdXRvT3B0aW1pc2VGdWxsUmVwYWlyU3RyZWFtcygpOworICAgICAgICBib29sZWFuIG9wdEluYyA9IERhdGFiYXNlRGVzY3JpcHRvci5hdXRvT3B0aW1pc2VJbmNSZXBhaXJTdHJlYW1zKCk7CisgICAgICAgIGJvb2xlYW4gb3B0UHJldmlldyA9IERhdGFiYXNlRGVzY3JpcHRvci5hdXRvT3B0aW1pc2VQcmV2aWV3UmVwYWlyU3RyZWFtcygpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChQcmV2aWV3S2luZCBwcmV2aWV3S2luZCA6IFByZXZpZXdLaW5kLnZhbHVlcygpKQorICAgICAgICAgICAgICAgIGZvciAoYm9vbGVhbiBpbmMgOiBuZXcgYm9vbGVhbltdIHt0cnVlLCBmYWxzZX0pCisgICAgICAgICAgICAgICAgICAgIGFzc2VydE9wdGltaXNlKHByZXZpZXdLaW5kLCBpbmMpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgc2V0T3B0aW1pc2Uob3B0RnVsbCwgb3B0SW5jLCBvcHRQcmV2aWV3KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRIZWxwZXIoTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zLCBib29sZWFuIGZ1bGwsIGJvb2xlYW4gaW5jLCBib29sZWFuIHByZXZpZXcsIGJvb2xlYW4gZXhwZWN0ZWQpCisgICAgeworICAgICAgICBzZXRPcHRpbWlzZShmdWxsLCBpbmMsIHByZXZpZXcpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFJlcGFpck9wdGlvbi5wYXJzZShvcHRpb25zLCBNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UpLm9wdGltaXNlU3RyZWFtcygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0T3B0aW1pc2UoYm9vbGVhbiBmdWxsLCBib29sZWFuIGluYywgYm9vbGVhbiBwcmV2aWV3KQorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldEF1dG9PcHRpbWlzZUZ1bGxSZXBhaXJTdHJlYW1zKGZ1bGwpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0QXV0b09wdGltaXNlSW5jUmVwYWlyU3RyZWFtcyhpbmMpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0QXV0b09wdGltaXNlUHJldmlld1JlcGFpclN0cmVhbXMocHJldmlldyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE9wdGltaXNlKFByZXZpZXdLaW5kIHByZXZpZXdLaW5kLCBib29sZWFuIGluY3JlbWVudGFsKQorICAgIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBvcHRpb25zID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBvcHRpb25zLnB1dChSZXBhaXJPcHRpb24uUFJFVklFVywgcHJldmlld0tpbmQudG9TdHJpbmcoKSk7CisgICAgICAgIG9wdGlvbnMucHV0KFJlcGFpck9wdGlvbi5JTkNSRU1FTlRBTF9LRVksIEJvb2xlYW4udG9TdHJpbmcoaW5jcmVtZW50YWwpKTsKKyAgICAgICAgZm9yIChib29sZWFuIGEgOiBuZXcgYm9vbGVhbltdeyB0cnVlLCBmYWxzZSB9KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGJvb2xlYW4gYiA6IG5ldyBib29sZWFuW117IHRydWUsIGZhbHNlIH0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpZXdLaW5kLmlzUHJldmlldygpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0SGVscGVyKG9wdGlvbnMsIGEsIGIsIHRydWUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRIZWxwZXIob3B0aW9ucywgYSwgYiwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaW5jcmVtZW50YWwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRIZWxwZXIob3B0aW9ucywgYSwgdHJ1ZSwgYiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEhlbHBlcihvcHRpb25zLCBhLCBmYWxzZSwgYiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRIZWxwZXIob3B0aW9ucywgdHJ1ZSwgYSwgYiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEhlbHBlcihvcHRpb25zLCBmYWxzZSwgYSwgYiwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQYXJzZVRocm93c0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbldpdGhNZXNzYWdlKE1hcDxTdHJpbmcsIFN0cmluZz4gb3B0aW9uc1RvUGFyc2UsIFN0cmluZyBleHBlY3RlZEVycm9yTWVzc2FnZSkKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvTWlncmF0aW9uTWFuYWdlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvTWlncmF0aW9uTWFuYWdlclRlc3QuamF2YQppbmRleCBlMTU1NmI3Li4xNmVmNzgyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL01pZ3JhdGlvbk1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9NaWdyYXRpb25NYW5hZ2VyVGVzdC5qYXZhCkBAIC0yNCw3ICsyNCw2IEBACiBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTQzLDggKzQyLDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJ5dGVzVHlwZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVURjhUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLk5ldHdvcmtUb3BvbG9neVN0cmF0ZWd5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOwogCkBAIC00NzMsNyArNDczLDcgQEAKICAgICAgICAgLy8gY2hlY2sKICAgICAgICAgYXNzZXJ0VHJ1ZShjZnMuaW5kZXhNYW5hZ2VyLmxpc3RJbmRleGVzKCkuaXNFbXB0eSgpKTsKICAgICAgICAgTGlmZWN5Y2xlVHJhbnNhY3Rpb24ud2FpdEZvckRlbGV0aW9ucygpOwotICAgICAgICBhc3NlcnRGYWxzZShuZXcgRmlsZShkZXNjLmZpbGVuYW1lRm9yKENvbXBvbmVudC5EQVRBKSkuZXhpc3RzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShkZXNjLmZpbGVGb3IoQ29tcG9uZW50cy5EQVRBKS5leGlzdHMoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvTW9ja1NjaGVtYS5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9Nb2NrU2NoZW1hLmphdmEKaW5kZXggZjVjOTk4Ni4uMjMwNjEyMCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9Nb2NrU2NoZW1hLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9Nb2NrU2NoZW1hLmphdmEKQEAgLTMzLDI3ICszMyw0MSBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQnVmZmVyRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlbGV0aW9uVGltZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5TZXJpYWxpemF0aW9uSGVhZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuTWVtdGFibGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWVtdGFibGUuU2tpcExpc3RNZW10YWJsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkluZGV4U3VtbWFyeTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNTVGFibGVJZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlRm9ybWF0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ0Zvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5iaWcuQmlnRm9ybWF0LkNvbXBvbmVudHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5CdGlGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLkJ0aVRhYmxlUmVhZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJ0aS5QYXJ0aXRpb25JbmRleDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmluZGV4c3VtbWFyeS5JbmRleFN1bW1hcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5rZXljYWNoZS5LZXlDYWNoZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLm1ldGFkYXRhLk1ldGFkYXRhQ29sbGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuTWV0YWRhdGFUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUubWV0YWRhdGEuU3RhdHNNZXRhZGF0YTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkNoYW5uZWxQcm94eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRTdHJlYW1QbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVIYW5kbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5NZW1vcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQWx3YXlzUHJlc2VudEZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNhY2hlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GaWx0ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRocm93YWJsZXM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5BY3RpdmVSZXBhaXJTZXJ2aWNlLlVOUkVQQUlSRURfU1NUQUJMRTsKIApAQCAtNzQsMTkgKzg4LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXsgVXRpbC5uZXdVVUlER2VuKCkgfSk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSB0ZW1wRmlsZSA9IHRlbXAoIm1vY2tzZWdtZW50ZWRmaWxlIik7CisKICAgICBzdGF0aWMKICAgICB7CiAgICAgICAgIE1lbW9yeSBvZmZzZXRzID0gTWVtb3J5LmFsbG9jYXRlKDQpOwogICAgICAgICBvZmZzZXRzLnNldEludCgwLCAwKTsKICAgICAgICAgaW5kZXhTdW1tYXJ5ID0gbmV3IEluZGV4U3VtbWFyeShNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UsIG9mZnNldHMsIDAsIE1lbW9yeS5hbGxvY2F0ZSg0KSwgMCwgMCwgMCwgMSk7CisKKyAgICAgICAgdHJ5IChEYXRhT3V0cHV0U3RyZWFtUGx1cyBvdXQgPSB0ZW1wRmlsZS5uZXdPdXRwdXRTdHJlYW0oRmlsZS5Xcml0ZU1vZGUuT1ZFUldSSVRFKSkKKyAgICAgICAgeworICAgICAgICAgICAgb3V0LndyaXRlKG5ldyBieXRlWzEwXSk7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGV4KQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBUaHJvd2FibGVzLnRocm93QXNVbmNoZWNrZWRFeGNlcHRpb24oZXgpOworICAgICAgICB9CiAgICAgfQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgaWQgPSBuZXcgQXRvbWljSW50ZWdlcigpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5c3BhY2Uga3MgPSBLZXlzcGFjZS5tb2NrS1MoS2V5c3BhY2VNZXRhZGF0YS5jcmVhdGUoIm1vY2trcyIsIEtleXNwYWNlUGFyYW1zLnNpbXBsZVRyYW5zaWVudCgxKSkpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJbmRleFN1bW1hcnkgaW5kZXhTdW1tYXJ5OwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsZSB0ZW1wRmlsZSA9IHRlbXAoIm1vY2tzZWdtZW50ZWRmaWxlIik7Ci0KICAgICBwdWJsaWMgc3RhdGljIE1lbXRhYmxlIG1lbXRhYmxlKENvbHVtbkZhbWlseVN0b3JlIGNmcykKICAgICB7CiAgICAgICAgIHJldHVybiBTa2lwTGlzdE1lbXRhYmxlLkZBQ1RPUlkuY3JlYXRlKG51bGwsIGNmcy5tZXRhZGF0YSwgY2ZzKTsKQEAgLTEwMiw2ICsxMjUsMTEgQEAKICAgICAgICAgcmV0dXJuIHNzdGFibGUoZ2VuZXJhdGlvbiwgMCwgZmFsc2UsIGZpcnN0LCBsYXN0LCBjZnMpOwogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBzc3RhYmxlKGludCBnZW5lcmF0aW9uLCBsb25nIGZpcnN0LCBsb25nIGxhc3QsIGludCBtaW5Mb2NhbERlbGV0aW9uVGltZSwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNzdGFibGUoZ2VuZXJhdGlvbiwgMCwgZmFsc2UsIGZpcnN0LCBsYXN0LCAwLCBjZnMsIG1pbkxvY2FsRGVsZXRpb25UaW1lKTsKKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgc3N0YWJsZShpbnQgZ2VuZXJhdGlvbiwgYm9vbGVhbiBrZWVwUmVmLCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMpCiAgICAgewogICAgICAgICByZXR1cm4gc3N0YWJsZShnZW5lcmF0aW9uLCAwLCBrZWVwUmVmLCBjZnMpOwpAQCAtMTExLDYgKzEzOSw3IEBACiAgICAgewogICAgICAgICByZXR1cm4gc3N0YWJsZShnZW5lcmF0aW9uLCBzaXplLCBmYWxzZSwgY2ZzKTsKICAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgc3N0YWJsZShpbnQgZ2VuZXJhdGlvbiwgaW50IHNpemUsIGJvb2xlYW4ga2VlcFJlZiwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQogICAgIHsKICAgICAgICAgcmV0dXJuIHNzdGFibGUoZ2VuZXJhdGlvbiwgc2l6ZSwga2VlcFJlZiwgZ2VuZXJhdGlvbiwgZ2VuZXJhdGlvbiwgY2ZzKTsKQEAgLTEyOCw3ICsxNTcsMTIgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBzc3RhYmxlV2l0aFRpbWVzdGFtcChpbnQgZ2VuZXJhdGlvbiwgbG9uZyB0aW1lc3RhbXAsIENvbHVtbkZhbWlseVN0b3JlIGNmcykKICAgICB7Ci0gICAgICAgIHJldHVybiBzc3RhYmxlKGdlbmVyYXRpb24sIDAsIGZhbHNlLCAwLCAxMDAwLCAwLCBJbnRlZ2VyLk1BWF9WQUxVRSwgdGltZXN0YW1wLCBjZnMpOworICAgICAgICByZXR1cm4gc3N0YWJsZShnZW5lcmF0aW9uLCAwLCBmYWxzZSwgMCwgMTAwMCwgMCwgY2ZzLCBJbnRlZ2VyLk1BWF9WQUxVRSwgdGltZXN0YW1wKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgc3N0YWJsZShpbnQgZ2VuZXJhdGlvbiwgaW50IHNpemUsIGJvb2xlYW4ga2VlcFJlZiwgbG9uZyBmaXJzdFRva2VuLCBsb25nIGxhc3RUb2tlbiwgaW50IGxldmVsLCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMpCisgICAgeworICAgICAgICByZXR1cm4gc3N0YWJsZShnZW5lcmF0aW9uLCBzaXplLCBrZWVwUmVmLCBmaXJzdFRva2VuLCBsYXN0VG9rZW4sIGxldmVsLCBjZnMsIEludGVnZXIuTUFYX1ZBTFVFKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgc3N0YWJsZShpbnQgZ2VuZXJhdGlvbiwgaW50IHNpemUsIGJvb2xlYW4ga2VlcFJlZiwgbG9uZyBmaXJzdFRva2VuLCBsb25nIGxhc3RUb2tlbiwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzKQpAQCAtMTM2LDU1ICsxNzAsMTE3IEBACiAgICAgICAgIHJldHVybiBzc3RhYmxlKGdlbmVyYXRpb24sIHNpemUsIGtlZXBSZWYsIGZpcnN0VG9rZW4sIGxhc3RUb2tlbiwgMCwgY2ZzKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgc3N0YWJsZShpbnQgZ2VuZXJhdGlvbiwgaW50IHNpemUsIGJvb2xlYW4ga2VlcFJlZiwgbG9uZyBmaXJzdFRva2VuLCBsb25nIGxhc3RUb2tlbiwgaW50IGxldmVsLCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMpCisgICAgcHVibGljIHN0YXRpYyBTU1RhYmxlUmVhZGVyIHNzdGFibGUoaW50IGdlbmVyYXRpb24sIGludCBzaXplLCBib29sZWFuIGtlZXBSZWYsIGxvbmcgZmlyc3RUb2tlbiwgbG9uZyBsYXN0VG9rZW4sIGludCBsZXZlbCwgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBpbnQgbWluTG9jYWxEZWxldGlvblRpbWUpCiAgICAgewotICAgICAgICByZXR1cm4gc3N0YWJsZShnZW5lcmF0aW9uLCBzaXplLCBrZWVwUmVmLCBmaXJzdFRva2VuLCBsYXN0VG9rZW4sIGxldmVsLCBJbnRlZ2VyLk1BWF9WQUxVRSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKiAxMDAwLCBjZnMpOworICAgICAgICByZXR1cm4gc3N0YWJsZShnZW5lcmF0aW9uLCBzaXplLCBrZWVwUmVmLCBmaXJzdFRva2VuLCBsYXN0VG9rZW4sIGxldmVsLCBjZnMsIG1pbkxvY2FsRGVsZXRpb25UaW1lLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAqIDEwMDApOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgU1NUYWJsZVJlYWRlciBzc3RhYmxlKGludCBnZW5lcmF0aW9uLCBpbnQgc2l6ZSwgYm9vbGVhbiBrZWVwUmVmLCBsb25nIGZpcnN0VG9rZW4sIGxvbmcgbGFzdFRva2VuLCBpbnQgbGV2ZWwsIGludCBtaW5Mb2NhbERlbGV0aW9uVGltZSwgbG9uZyB0aW1lc3RhbXAsIENvbHVtbkZhbWlseVN0b3JlIGNmcykKKyAgICBwdWJsaWMgc3RhdGljIFNTVGFibGVSZWFkZXIgc3N0YWJsZShpbnQgZ2VuZXJhdGlvbiwgaW50IHNpemUsIGJvb2xlYW4ga2VlcFJlZiwgbG9uZyBmaXJzdFRva2VuLCBsb25nIGxhc3RUb2tlbiwgaW50IGxldmVsLCBDb2x1bW5GYW1pbHlTdG9yZSBjZnMsIGludCBtaW5Mb2NhbERlbGV0aW9uVGltZSwgbG9uZyB0aW1lc3RhbXApCiAgICAgeworICAgICAgICBTU1RhYmxlRm9ybWF0PD8sID8+IGZvcm1hdCA9IERhdGFiYXNlRGVzY3JpcHRvci5nZXRTZWxlY3RlZFNTVGFibGVGb3JtYXQoKTsKICAgICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IERlc2NyaXB0b3IoY2ZzLmdldERpcmVjdG9yaWVzKCkuZ2V0RGlyZWN0b3J5Rm9yTmV3U1NUYWJsZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmtleXNwYWNlLmdldE5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZzLmdldFRhYmxlTmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlSWQoZ2VuZXJhdGlvbiksIFNTVGFibGVGb3JtYXQuVHlwZS5CSUcpOwotICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gSW1tdXRhYmxlU2V0Lm9mKENvbXBvbmVudC5EQVRBLCBDb21wb25lbnQuUFJJTUFSWV9JTkRFWCwgQ29tcG9uZW50LkZJTFRFUiwgQ29tcG9uZW50LlRPQyk7Ci0gICAgICAgIGZvciAoQ29tcG9uZW50IGNvbXBvbmVudCA6IGNvbXBvbmVudHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKGRlc2NyaXB0b3IuZmlsZW5hbWVGb3IoY29tcG9uZW50KSk7Ci0gICAgICAgICAgICBmaWxlLmNyZWF0ZUZpbGVJZk5vdEV4aXN0cygpOwotICAgICAgICB9Ci0gICAgICAgIC8vIC5jb21wbGV0ZSgpIHdpdGggc2l6ZSB0byBtYWtlIHNzdGFibGUub25EaXNrTGVuZ3RoIHdvcmsKLSAgICAgICAgdHJ5IChGaWxlSGFuZGxlLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIobmV3IENoYW5uZWxQcm94eSh0ZW1wRmlsZSkpLmJ1ZmZlclNpemUoc2l6ZSk7Ci0gICAgICAgICAgICAgRmlsZUhhbmRsZSBmaWxlSGFuZGxlID0gYnVpbGRlci5jb21wbGV0ZShzaXplKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNpemUgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOwotICAgICAgICAgICAgICAgICAgICBVdGlsLnNldEZpbGVMZW5ndGgoZmlsZSwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2VyaWFsaXphdGlvbkhlYWRlciBoZWFkZXIgPSBTZXJpYWxpemF0aW9uSGVhZGVyLm1ha2UoY2ZzLm1ldGFkYXRhKCksIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLSAgICAgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3RvcihjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yKTsKLSAgICAgICAgICAgIGNvbGxlY3Rvci51cGRhdGUobmV3IERlbGV0aW9uVGltZSh0aW1lc3RhbXAsIG1pbkxvY2FsRGVsZXRpb25UaW1lKSk7Ci0gICAgICAgICAgICBTdGF0c01ldGFkYXRhIG1ldGFkYXRhID0gKFN0YXRzTWV0YWRhdGEpIGNvbGxlY3Rvci5zc3RhYmxlTGV2ZWwobGV2ZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5hbGl6ZU1ldGFkYXRhKGNmcy5tZXRhZGF0YSgpLnBhcnRpdGlvbmVyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLCAwLjAxZiwgVU5SRVBBSVJFRF9TU1RBQkxFLCBudWxsLCBmYWxzZSwgaGVhZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KE1ldGFkYXRhVHlwZS5TVEFUUyk7Ci0gICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHJlYWRlciA9IFNTVGFibGVSZWFkZXIuaW50ZXJuYWxPcGVuKGRlc2NyaXB0b3IsIGNvbXBvbmVudHMsIGNmcy5tZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUhhbmRsZS5zaGFyZWRDb3B5KCksIGZpbGVIYW5kbGUuc2hhcmVkQ29weSgpLCBpbmRleFN1bW1hcnkuc2hhcmVkQ29weSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWx3YXlzUHJlc2VudEZpbHRlcigpLCAxTCwgbWV0YWRhdGEsIFNTVGFibGVSZWFkZXIuT3BlblJlYXNvbi5OT1JNQUwsIGhlYWRlcik7Ci0gICAgICAgICAgICByZWFkZXIuZmlyc3QgPSByZWFkZXJCb3VuZHMoZmlyc3RUb2tlbik7Ci0gICAgICAgICAgICByZWFkZXIubGFzdCA9IHJlYWRlckJvdW5kcyhsYXN0VG9rZW4pOwotICAgICAgICAgICAgaWYgKCFrZWVwUmVmKQotICAgICAgICAgICAgICAgIHJlYWRlci5zZWxmUmVmKCkucmVsZWFzZSgpOwotICAgICAgICAgICAgcmV0dXJuIHJlYWRlcjsKLSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc3RhYmxlSWQoZ2VuZXJhdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCk7CiAKKyAgICAgICAgaWYgKEJpZ0Zvcm1hdC5pcyhmb3JtYXQpKQorICAgICAgICB7CisgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gSW1tdXRhYmxlU2V0Lm9mKENvbXBvbmVudHMuREFUQSwgQ29tcG9uZW50cy5QUklNQVJZX0lOREVYLCBDb21wb25lbnRzLkZJTFRFUiwgQ29tcG9uZW50cy5UT0MpOworICAgICAgICAgICAgZm9yIChDb21wb25lbnQgY29tcG9uZW50IDogY29tcG9uZW50cykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBGaWxlIGZpbGUgPSBkZXNjcmlwdG9yLmZpbGVGb3IoY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICBmaWxlLmNyZWF0ZUZpbGVJZk5vdEV4aXN0cygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLmNvbXBsZXRlKCkgd2l0aCBzaXplIHRvIG1ha2Ugc3N0YWJsZS5vbkRpc2tMZW5ndGggd29yaworICAgICAgICAgICAgdHJ5IChGaWxlSGFuZGxlIGZpbGVIYW5kbGUgPSBuZXcgRmlsZUhhbmRsZS5CdWlsZGVyKHRlbXBGaWxlKS5idWZmZXJTaXplKHNpemUpLndpdGhMZW5ndGhPdmVycmlkZShzaXplKS5jb21wbGV0ZSgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1heWJlU2V0RGF0YUxlbmd0aChkZXNjcmlwdG9yLCBzaXplKTsKKyAgICAgICAgICAgICAgICBTZXJpYWxpemF0aW9uSGVhZGVyIGhlYWRlciA9IFNlcmlhbGl6YXRpb25IZWFkZXIubWFrZShjZnMubWV0YWRhdGEoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOworICAgICAgICAgICAgICAgIE1ldGFkYXRhQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBNZXRhZGF0YUNvbGxlY3RvcihjZnMubWV0YWRhdGEoKS5jb21wYXJhdG9yKTsKKyAgICAgICAgICAgICAgICBjb2xsZWN0b3IudXBkYXRlKG5ldyBEZWxldGlvblRpbWUodGltZXN0YW1wLCBtaW5Mb2NhbERlbGV0aW9uVGltZSkpOworICAgICAgICAgICAgICAgIEJ1ZmZlckRlY29yYXRlZEtleSBmaXJzdCA9IHJlYWRlckJvdW5kcyhmaXJzdFRva2VuKTsKKyAgICAgICAgICAgICAgICBCdWZmZXJEZWNvcmF0ZWRLZXkgbGFzdCA9IHJlYWRlckJvdW5kcyhsYXN0VG9rZW4pOworICAgICAgICAgICAgICAgIFN0YXRzTWV0YWRhdGEgbWV0YWRhdGEgPSAoU3RhdHNNZXRhZGF0YSkgY29sbGVjdG9yLnNzdGFibGVMZXZlbChsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5hbGl6ZU1ldGFkYXRhKGNmcy5tZXRhZGF0YSgpLnBhcnRpdGlvbmVyLmdldENsYXNzKCkuZ2V0Q2Fub25pY2FsTmFtZSgpLCAwLjAxZiwgVU5SRVBBSVJFRF9TU1RBQkxFLCBudWxsLCBmYWxzZSwgaGVhZGVyLCBmaXJzdC5yZXRhaW5hYmxlKCkuZ2V0S2V5KCkuc2xpY2UoKSwgbGFzdC5yZXRhaW5hYmxlKCkuZ2V0S2V5KCkuc2xpY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoTWV0YWRhdGFUeXBlLlNUQVRTKTsKKyAgICAgICAgICAgICAgICBCaWdUYWJsZVJlYWRlciByZWFkZXIgPSBuZXcgQmlnVGFibGVSZWFkZXIuQnVpbGRlcihkZXNjcmlwdG9yKS5zZXRDb21wb25lbnRzKGNvbXBvbmVudHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0VGFibGVNZXRhZGF0YVJlZihjZnMubWV0YWRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGF0YUZpbGUoZmlsZUhhbmRsZS5zaGFyZWRDb3B5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW5kZXhGaWxlKGZpbGVIYW5kbGUuc2hhcmVkQ29weSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEluZGV4U3VtbWFyeShpbmRleFN1bW1hcnkuc2hhcmVkQ29weSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpbHRlcihGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWF4RGF0YUFnZSgxTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdGF0c01ldGFkYXRhKG1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE9wZW5SZWFzb24oU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uLk5PUk1BTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJpYWxpemF0aW9uSGVhZGVyKGhlYWRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaXJzdChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRMYXN0KGxhc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0S2V5Q2FjaGUoY2ZzLm1ldGFkYXRhKCkucGFyYW1zLmNhY2hpbmcuY2FjaGVLZXlzID8gbmV3IEtleUNhY2hlKENhY2hlU2VydmljZS5pbnN0YW5jZS5rZXlDYWNoZSkgOiBLZXlDYWNoZS5OT19DQUNIRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZChjZnMsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKCFrZWVwUmVmKQorICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEJ0aUZvcm1hdC5pcyhmb3JtYXQpKQorICAgICAgICB7CisgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gSW1tdXRhYmxlU2V0Lm9mKENvbXBvbmVudHMuREFUQSwgQnRpRm9ybWF0LkNvbXBvbmVudHMuUEFSVElUSU9OX0lOREVYLCBCdGlGb3JtYXQuQ29tcG9uZW50cy5ST1dfSU5ERVgsIENvbXBvbmVudHMuRklMVEVSLCBDb21wb25lbnRzLlRPQyk7CisgICAgICAgICAgICBmb3IgKENvbXBvbmVudCBjb21wb25lbnQgOiBjb21wb25lbnRzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IGRlc2NyaXB0b3IuZmlsZUZvcihjb21wb25lbnQpOworICAgICAgICAgICAgICAgIGZpbGUuY3JlYXRlRmlsZUlmTm90RXhpc3RzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuY29tcGxldGUoKSB3aXRoIHNpemUgdG8gbWFrZSBzc3RhYmxlLm9uRGlza0xlbmd0aCB3b3JrCisgICAgICAgICAgICB0cnkgKEZpbGVIYW5kbGUgZmlsZUhhbmRsZSA9IG5ldyBGaWxlSGFuZGxlLkJ1aWxkZXIodGVtcEZpbGUpLmJ1ZmZlclNpemUoc2l6ZSkud2l0aExlbmd0aE92ZXJyaWRlKHNpemUpLmNvbXBsZXRlKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF5YmVTZXREYXRhTGVuZ3RoKGRlc2NyaXB0b3IsIHNpemUpOworICAgICAgICAgICAgICAgIFNlcmlhbGl6YXRpb25IZWFkZXIgaGVhZGVyID0gU2VyaWFsaXphdGlvbkhlYWRlci5tYWtlKGNmcy5tZXRhZGF0YSgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7CisgICAgICAgICAgICAgICAgTWV0YWRhdGFDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IE1ldGFkYXRhQ29sbGVjdG9yKGNmcy5tZXRhZGF0YSgpLmNvbXBhcmF0b3IpOworICAgICAgICAgICAgICAgIGNvbGxlY3Rvci51cGRhdGUobmV3IERlbGV0aW9uVGltZSh0aW1lc3RhbXAsIG1pbkxvY2FsRGVsZXRpb25UaW1lKSk7CisgICAgICAgICAgICAgICAgQnVmZmVyRGVjb3JhdGVkS2V5IGZpcnN0ID0gcmVhZGVyQm91bmRzKGZpcnN0VG9rZW4pOworICAgICAgICAgICAgICAgIEJ1ZmZlckRlY29yYXRlZEtleSBsYXN0ID0gcmVhZGVyQm91bmRzKGxhc3RUb2tlbik7CisgICAgICAgICAgICAgICAgU3RhdHNNZXRhZGF0YSBtZXRhZGF0YSA9IChTdGF0c01ldGFkYXRhKSBjb2xsZWN0b3Iuc3N0YWJsZUxldmVsKGxldmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmFsaXplTWV0YWRhdGEoY2ZzLm1ldGFkYXRhKCkucGFydGl0aW9uZXIuZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCksIDAuMDFmLCBVTlJFUEFJUkVEX1NTVEFCTEUsIG51bGwsIGZhbHNlLCBoZWFkZXIsIGZpcnN0LnJldGFpbmFibGUoKS5nZXRLZXkoKSwgbGFzdC5yZXRhaW5hYmxlKCkuZ2V0S2V5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KE1ldGFkYXRhVHlwZS5TVEFUUyk7CisgICAgICAgICAgICAgICAgQnRpVGFibGVSZWFkZXIgcmVhZGVyID0gbmV3IEJ0aVRhYmxlUmVhZGVyLkJ1aWxkZXIoZGVzY3JpcHRvcikuc2V0Q29tcG9uZW50cyhjb21wb25lbnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhYmxlTWV0YWRhdGFSZWYoY2ZzLm1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldERhdGFGaWxlKGZpbGVIYW5kbGUuc2hhcmVkQ29weSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFBhcnRpdGlvbkluZGV4KG5ldyBQYXJ0aXRpb25JbmRleChmaWxlSGFuZGxlLnNoYXJlZENvcHkoKSwgMCwgMCwgcmVhZGVyQm91bmRzKGZpcnN0VG9rZW4pLCByZWFkZXJCb3VuZHMobGFzdFRva2VuKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Um93SW5kZXhGaWxlKGZpbGVIYW5kbGUuc2hhcmVkQ29weSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldEZpbHRlcihGaWx0ZXJGYWN0b3J5LkFsd2F5c1ByZXNlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TWF4RGF0YUFnZSgxTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTdGF0c01ldGFkYXRhKG1ldGFkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldE9wZW5SZWFzb24oU1NUYWJsZVJlYWRlci5PcGVuUmVhc29uLk5PUk1BTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJpYWxpemF0aW9uSGVhZGVyKGhlYWRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRGaXJzdChyZWFkZXJCb3VuZHMoZmlyc3RUb2tlbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0TGFzdChyZWFkZXJCb3VuZHMobGFzdFRva2VuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZChjZnMsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKCFrZWVwUmVmKQorICAgICAgICAgICAgICAgICAgICByZWFkZXIuc2VsZlJlZigpLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgVXRpbC50ZXN0TXVzdEJlSW1wbGVtZW50ZWRGb3JTU1RhYmxlRm9ybWF0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG1heWJlU2V0RGF0YUxlbmd0aChEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGxvbmcgc2l6ZSkKKyAgICB7CisgICAgICAgIGlmIChzaXplID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gZGVzY3JpcHRvci5maWxlRm9yKENvbXBvbmVudHMuREFUQSk7CisgICAgICAgICAgICAgICAgVXRpbC5zZXRGaWxlTGVuZ3RoKGZpbGUsIHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIENvbHVtbkZhbWlseVN0b3JlIG5ld0NGUygpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1JlbW92ZVdpdGhvdXREcm9wcGluZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvUmVtb3ZlV2l0aG91dERyb3BwaW5nVGVzdC5qYXZhCmluZGV4IDljMzI3MWIuLjY4M2U1MmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvUmVtb3ZlV2l0aG91dERyb3BwaW5nVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvUmVtb3ZlV2l0aG91dERyb3BwaW5nVGVzdC5qYXZhCkBAIC0yOCwxMiArMjgsMTQgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFUcmFuc2Zvcm1hdGlvbi5TY2hlbWFUcmFuc2Zvcm1hdGlvblJlc3VsdDsKIGltcG9ydCBvcmcubW9ja2l0by5Nb2NraXRvOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU0NIRU1BX1VQREFURV9IQU5ETEVSX0ZBQ1RPUllfQ0xBU1M7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsOwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CiAKQEAgLTQ2LDcgKzQ4LDkgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmVmb3JlQ2xhc3MoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFNjaGVtYVVwZGF0ZUhhbmRsZXJGYWN0b3J5UHJvdmlkZXIuU1VIX0ZBQ1RPUllfQ0xBU1NfUFJPUEVSVFksIFRlc3RTY2hlbWFVcGRhdGVIYW5kbGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBTZXJ2ZXJUZXN0VXRpbHMuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKworICAgICAgICBTQ0hFTUFfVVBEQVRFX0hBTkRMRVJfRkFDVE9SWV9DTEFTUy5zZXRTdHJpbmcoVGVzdFNjaGVtYVVwZGF0ZUhhbmRsZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CiAgICAgICAgIENRTFRlc3Rlci5wcmVwYXJlU2VydmVyKCk7CiAgICAgICAgIFNjaGVtYS5pbnN0YW5jZS5yZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUtleXNwYWNlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NjaGVtYS9TY2hlbWFLZXlzcGFjZVRlc3QuamF2YQppbmRleCBlODA3NzMwLi4wODkwNzdmIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2NoZW1hL1NjaGVtYUtleXNwYWNlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zY2hlbWEvU2NoZW1hS2V5c3BhY2VUZXN0LmphdmEKQEAgLTMzLDExICszMywxMyBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOwogCiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVW50eXBlZFJlc3VsdFNldDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVRhYmxlU3RhdGVtZW50OwpAQCAtNjEsNiArNjMsNyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlF1ZXJ5UHJvY2Vzc29yLmV4ZWN1dGVPbmNlSW50ZXJuYWw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiAKIEBSdW5XaXRoKEJNVW5pdFJ1bm5lci5jbGFzcykKIHB1YmxpYyBjbGFzcyBTY2hlbWFLZXlzcGFjZVRlc3QKQEAgLTE4MSw2ICsxODQsNDIgQEAKIAogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9TbmFwc2hvdEVuYWJsZWRPblRhYmxlKCkKKyAgICB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKERhdGFiYXNlRGVzY3JpcHRvci5pc0F1dG9TbmFwc2hvdCgpKTsKKyAgICAgICAgU3RyaW5nIGtleXNwYWNlTmFtZSA9ICJBdXRvU25hcHNob3QiOworICAgICAgICBTdHJpbmcgdGFibGVOYW1lID0gInRhYmxlMSI7CisKKyAgICAgICAgY3JlYXRlVGFibGUoa2V5c3BhY2VOYW1lLCAiQ1JFQVRFIFRBQkxFICIgKyB0YWJsZU5hbWUgKyAiIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSB0cnVlIik7CisKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0gS2V5c3BhY2Uub3BlbihrZXlzcGFjZU5hbWUpLmdldENvbHVtbkZhbWlseVN0b3JlKHRhYmxlTmFtZSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjZnMuaXNBdXRvU25hcHNob3RFbmFibGVkKCkpOworCisgICAgICAgIFNjaGVtYVRlc3RVdGlsLmFubm91bmNlVGFibGVEcm9wKGtleXNwYWNlTmFtZSwgdGFibGVOYW1lKTsKKworICAgICAgICBhc3NlcnRGYWxzZShjZnMubGlzdFNuYXBzaG90cygpLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b1NuYXBzaG90RGlzYWJsZWRPblRhYmxlKCkKKyAgICB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKERhdGFiYXNlRGVzY3JpcHRvci5pc0F1dG9TbmFwc2hvdCgpKTsKKyAgICAgICAgU3RyaW5nIGtleXNwYWNlTmFtZSA9ICJBdXRvU25hcHNob3QiOworICAgICAgICBTdHJpbmcgdGFibGVOYW1lID0gInRhYmxlMiI7CisKKyAgICAgICAgY3JlYXRlVGFibGUoa2V5c3BhY2VOYW1lLCAiQ1JFQVRFIFRBQkxFICIgKyB0YWJsZU5hbWUgKyAiIChhIHRleHQgcHJpbWFyeSBrZXksIGIgaW50KSBXSVRIIGFsbG93X2F1dG9fc25hcHNob3QgPSBmYWxzZSIpOworCisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oa2V5c3BhY2VOYW1lKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSh0YWJsZU5hbWUpOworCisgICAgICAgIGFzc2VydEZhbHNlKGNmcy5pc0F1dG9TbmFwc2hvdEVuYWJsZWQoKSk7CisKKyAgICAgICAgU2NoZW1hVGVzdFV0aWwuYW5ub3VuY2VUYWJsZURyb3Aoa2V5c3BhY2VOYW1lLCB0YWJsZU5hbWUpOworCisgICAgICAgIGFzc2VydFRydWUoY2ZzLmxpc3RTbmFwc2hvdHMoKS5pc0VtcHR5KCkpOworICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlVGFibGUoU3RyaW5nIGtleXNwYWNlLCBUYWJsZU1ldGFkYXRhIG9sZFRhYmxlLCBUYWJsZU1ldGFkYXRhIG5ld1RhYmxlKQogICAgIHsKICAgICAgICAgS2V5c3BhY2VNZXRhZGF0YSBrc20gPSBTY2hlbWEuaW5zdGFuY2UuZ2V0S2V5c3BhY2VJbnN0YW5jZShrZXlzcGFjZSkuZ2V0TWV0YWRhdGEoKTsKQEAgLTIxNSw3ICsyNTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWRSb3dJdGVyYXRvcnMuZmlsdGVyKHNlcmlhbGl6ZWRDRC51bmZpbHRlcmVkSXRlcmF0b3IoKSwgRkJVdGlsaXRpZXMubm93SW5TZWNvbmRzKCkpKTsKICAgICAgICAgU2V0PENvbHVtbk1ldGFkYXRhPiBjb2x1bW5zID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICBmb3IgKFVudHlwZWRSZXN1bHRTZXQuUm93IHJvdyA6IGNvbHVtbnNSb3dzKQotICAgICAgICAgICAgY29sdW1ucy5hZGQoU2NoZW1hS2V5c3BhY2UuY3JlYXRlQ29sdW1uRnJvbVJvdyhyb3csIFR5cGVzLm5vbmUoKSkpOworICAgICAgICAgICAgY29sdW1ucy5hZGQoU2NoZW1hS2V5c3BhY2UuY3JlYXRlQ29sdW1uRnJvbVJvdyhyb3csIFR5cGVzLm5vbmUoKSwgVXNlckZ1bmN0aW9ucy5ub25lKCkpKTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMobWV0YWRhdGEucGFyYW1zLCBwYXJhbXMpOwogICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEhhc2hTZXQ8PihtZXRhZGF0YS5jb2x1bW5zKCkpLCBjb2x1bW5zKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9DdXN0b21Tc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9DdXN0b21Tc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1Rlc3QuamF2YQppbmRleCBjMWFiNGE0Li5kYWEwZjE2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvQ3VzdG9tU3NsQ29udGV4dEZhY3RvcnlDb25maWdUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0N1c3RvbVNzbENvbnRleHRGYWN0b3J5Q29uZmlnVGVzdC5qYXZhCkBAIC0yNSwxOSArMjUsMjQgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0NPTkZJRzsKKwogcHVibGljIGNsYXNzIEN1c3RvbVNzbENvbnRleHRGYWN0b3J5Q29uZmlnVGVzdAogeworICAgIHN0YXRpYyBXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzOworCiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwRGF0YWJhc2VEZXNjcmlwdG9yKCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIsICJjYXNzYW5kcmEtc3NsY29udGV4dGZhY3RvcnkueWFtbCIpOworICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KENBU1NBTkRSQV9DT05GSUcsICJjYXNzYW5kcmEtc3NsY29udGV4dGZhY3RvcnkueWFtbCIpOwogICAgIH0KIAogICAgIEBBZnRlckNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duRGF0YWJhc2VEZXNjcmlwdG9yKCkgewotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIpOworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9DdXN0b21Tc2xDb250ZXh0RmFjdG9yeUludmFsaWRDb25maWdUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvQ3VzdG9tU3NsQ29udGV4dEZhY3RvcnlJbnZhbGlkQ29uZmlnVGVzdC5qYXZhCmluZGV4IDc5ZTdkNTIuLmRmYWRlYTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9DdXN0b21Tc2xDb250ZXh0RmFjdG9yeUludmFsaWRDb25maWdUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0N1c3RvbVNzbENvbnRleHRGYWN0b3J5SW52YWxpZENvbmZpZ1Rlc3QuamF2YQpAQCAtMjQsMTggKzI0LDIyIEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0NPTkZJRzsKIAogcHVibGljIGNsYXNzIEN1c3RvbVNzbENvbnRleHRGYWN0b3J5SW52YWxpZENvbmZpZ1Rlc3QKIHsKKyAgICBzdGF0aWMgV2l0aFByb3BlcnRpZXMgcHJvcGVydGllczsKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBEYXRhYmFzZURlc2NyaXB0b3IoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIiwgImNhc3NhbmRyYS1zc2xjb250ZXh0ZmFjdG9yeS1pbnZhbGlkY29uZmlndXJhdGlvbi55YW1sIik7CisgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoQ0FTU0FORFJBX0NPTkZJRywgImNhc3NhbmRyYS1zc2xjb250ZXh0ZmFjdG9yeS1pbnZhbGlkY29uZmlndXJhdGlvbi55YW1sIik7CiAgICAgfQogCiAgICAgQEFmdGVyQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25EYXRhYmFzZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIik7CisgICAgICAgIHByb3BlcnRpZXMuY2xvc2UoKTsKICAgICB9CiAKICAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9EZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5VGVzdC5qYXZhCmluZGV4IDA2NTdlYjYuLmJjZDEzZWYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9EZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0RlZmF1bHRTc2xDb250ZXh0RmFjdG9yeVRlc3QuamF2YQpAQCAtMzMsNiArMzMsOSBAQAogaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuc3NsLlNzbENvbnRleHQ7CiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuU3NsUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkRJU0FCTEVfVENBQ1RJVkVfT1BFTlNTTDsKIAogcHVibGljIGNsYXNzIERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeVRlc3QKIHsKQEAgLTUzLDE1ICs1NiwyMyBAQAogICAgICAgICBjb25maWcucHV0KCJrZXlzdG9yZV9wYXNzd29yZCIsICJjYXNzYW5kcmEiKTsKICAgICB9CiAKKyAgICBwcml2YXRlIHZvaWQgYWRkT3V0Ym91bmRLZXlzdG9yZU9wdGlvbnMoTWFwPFN0cmluZywgT2JqZWN0PiBjb25maWcpCisgICAgeworICAgICAgICBjb25maWcucHV0KCJvdXRib3VuZF9rZXlzdG9yZSIsICJ0ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0X291dGJvdW5kLmtleXN0b3JlIik7CisgICAgICAgIGNvbmZpZy5wdXQoIm91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkIiwgImNhc3NhbmRyYSIpOworICAgIH0KKwogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgZ2V0U3NsQ29udGV4dE9wZW5TU0woKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIEVuY3J5cHRpb25PcHRpb25zIG9wdGlvbnMgPSBuZXcgRW5jcnlwdGlvbk9wdGlvbnMoKS53aXRoVHJ1c3RTdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC50cnVzdHN0b3JlIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhUcnVzdFN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoS2V5U3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Qua2V5c3RvcmUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoUmVxdWlyZUNsaWVudEF1dGgoZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ2lwaGVyU3VpdGVzKCJUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBIik7CisgICAgICAgIEVuY3J5cHRpb25PcHRpb25zLlNlcnZlckVuY3J5cHRpb25PcHRpb25zIG9wdGlvbnMgPSBuZXcgRW5jcnlwdGlvbk9wdGlvbnMuU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoKS53aXRoVHJ1c3RTdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC50cnVzdHN0b3JlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhUcnVzdFN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoS2V5U3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Qua2V5c3RvcmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdF9vdXRib3VuZC5rZXlzdG9yZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZVBhc3N3b3JkKCJjYXNzYW5kcmEiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFJlcXVpcmVDbGllbnRBdXRoKGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENpcGhlclN1aXRlcygiVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSIpOwogICAgICAgICBTc2xDb250ZXh0IHNzbENvbnRleHQgPSBTU0xGYWN0b3J5LmdldE9yQ3JlYXRlU3NsQ29udGV4dChvcHRpb25zLCB0cnVlLCBJU3NsQ29udGV4dEZhY3RvcnkuU29ja2V0VHlwZS5DTElFTlQpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChzc2xDb250ZXh0KTsKICAgICAgICAgaWYgKE9wZW5Tc2wuaXNBdmFpbGFibGUoKSkKQEAgLTc4LDcgKzg5LDcgQEAKICAgICAgICAgY29uZmlnLnB1dCgidHJ1c3RzdG9yZSIsICIvdGhpcy9pcy9wcm9iYWJseS9ub3QvYS9maWxlL29uL3lvdXIvdGVzdC9tYWNoaW5lIik7CiAKICAgICAgICAgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5IGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwgPSBuZXcgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7Ci0gICAgICAgIGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CiAgICAgICAgIGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwuYnVpbGRUcnVzdE1hbmFnZXJGYWN0b3J5KCk7CiAgICAgfQogCkBAIC05MCw3ICsxMDEsNyBAQAogICAgICAgICBjb25maWcucHV0KCJ0cnVzdHN0b3JlX3Bhc3N3b3JkIiwgIkhvbWVPZkJhZFBhc3N3b3JkcyIpOwogCiAgICAgICAgIERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeSBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsID0gbmV3IERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOwotICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLmJ1aWxkVHJ1c3RNYW5hZ2VyRmFjdG9yeSgpOwogICAgIH0KIApAQCAtMTAxLDcgKzExMiw3IEBACiAgICAgICAgIGNvbmZpZy5wdXRBbGwoY29tbW9uQ29uZmlnKTsKIAogICAgICAgICBEZWZhdWx0U3NsQ29udGV4dEZhY3RvcnkgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbCA9IG5ldyBEZWZhdWx0U3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CisgICAgICAgIGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKICAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0cnVzdE1hbmFnZXJGYWN0b3J5ID0gZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5idWlsZFRydXN0TWFuYWdlckZhY3RvcnkoKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwodHJ1c3RNYW5hZ2VyRmFjdG9yeSk7CiAgICAgfQpAQCAtMTEyLDEwICsxMjMsMTAgQEAKICAgICAgICAgTWFwPFN0cmluZyxPYmplY3Q+IGNvbmZpZyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgY29uZmlnLnB1dEFsbChjb21tb25Db25maWcpOwogICAgICAgICBjb25maWcucHV0KCJrZXlzdG9yZSIsICIvdGhpcy9pcy9wcm9iYWJseS9ub3QvYS9maWxlL29uL3lvdXIvdGVzdC9tYWNoaW5lIik7Ci0gICAgICAgIGNvbmZpZy5wdXQoImtleXN0b3JlX3Bhc3N3b3JkIiwiVGhpc1dvbnRNYXR0ZXIiKTsKKyAgICAgICAgY29uZmlnLnB1dCgia2V5c3RvcmVfcGFzc3dvcmQiLCAiVGhpc1dvbnRNYXR0ZXIiKTsKIAogICAgICAgICBEZWZhdWx0U3NsQ29udGV4dEZhY3RvcnkgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbCA9IG5ldyBEZWZhdWx0U3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5jaGVja2VkRXhwaXJ5ID0gZmFsc2U7CisgICAgICAgIGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKICAgICAgICAgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7CiAgICAgfQogCkBAIC0xMzksMzIgKzE1MCw4NCBAQAogCiAgICAgICAgIERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeSBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsID0gbmV3IERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOwogICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGV4aXJ5IGNoZWNrIGRpZG4ndCBoYXBwZW4gc28gZmFyIGZvciB0aGUgcHJpdmF0ZSBrZXkKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwuY2hlY2tlZEV4cGlyeSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKIAogICAgICAgICBhZGRLZXlzdG9yZU9wdGlvbnMoY29uZmlnKTsKICAgICAgICAgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5IGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwyID0gbmV3IERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOwogICAgICAgICAvLyBUcmlnZ2VyIHRoZSBwcml2YXRlIGtleSBsb2FkaW5nLiBUaGF0IHdpbGwgYWxzbyBjaGVjayBmb3IgZXhwaXJlZCBwcml2YXRlIGtleQogICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsMi5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7CiAgICAgICAgIC8vIE5vdyB3ZSBzaG91bGQgaGF2ZSBjaGVja2VkIHRoZSBwcml2YXRlIGtleSdzIGV4cGlyeQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsMi5jaGVja2VkRXhwaXJ5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbDIua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IG5ldyBmYWN0b3J5IG9iamVjdCBwcmVmb3JtcyB0aGUgZnJlc2ggcHJpdmF0ZSBrZXkgZXhwaXJ5IGNoZWNrCiAgICAgICAgIERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeSBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsMyA9IG5ldyBEZWZhdWx0U3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwzLmNoZWNrZWRFeHBpcnkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbDMua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkpOwogICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsMy5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwzLmNoZWNrZWRFeHBpcnkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsMy5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJT0V4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBidWlsZE91dGJvdW5kS2V5TWFuYWdlckZhY3RvcnlXaXRoSW52YWxpZEtleXN0b3JlRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb25maWcgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGNvbmZpZy5wdXRBbGwoY29tbW9uQ29uZmlnKTsKKyAgICAgICAgY29uZmlnLnB1dCgib3V0Ym91bmRfa2V5c3RvcmUiLCAiL3RoaXMvaXMvcHJvYmFibHkvbm90L2EvZmlsZS9vbi95b3VyL3Rlc3QvbWFjaGluZSIpOworICAgICAgICBjb25maWcucHV0KCJvdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCIsICJUaGlzV29udE1hdHRlciIpOworCisgICAgICAgIERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeSBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsID0gbmV3IERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOworICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLm91dGJvdW5kS2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5idWlsZE91dGJvdW5kS2V5TWFuYWdlckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElPRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIGJ1aWxkT3V0Ym91bmRLZXlNYW5hZ2VyRmFjdG9yeVdpdGhCYWRQYXNzd29yZCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb25maWcgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGNvbmZpZy5wdXRBbGwoY29tbW9uQ29uZmlnKTsKKyAgICAgICAgYWRkT3V0Ym91bmRLZXlzdG9yZU9wdGlvbnMoY29uZmlnKTsKKyAgICAgICAgY29uZmlnLnB1dCgib3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQiLCAiSG9tZU9mQmFkUGFzc3dvcmRzIik7CisKKyAgICAgICAgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5IGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwgPSBuZXcgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7CisgICAgICAgIGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwuYnVpbGRPdXRib3VuZEtleU1hbmFnZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBidWlsZE91dGJvdW5kS2V5TWFuYWdlckZhY3RvcnlIYXBweVBhdGgoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY29uZmlnID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBjb25maWcucHV0QWxsKGNvbW1vbkNvbmZpZyk7CisKKyAgICAgICAgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5IGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwgPSBuZXcgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZXhpcnkgY2hlY2sgZGlkbid0IGhhcHBlbiBzbyBmYXIgZm9yIHRoZSBwcml2YXRlIGtleQorICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5vdXRib3VuZEtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKKworICAgICAgICBhZGRPdXRib3VuZEtleXN0b3JlT3B0aW9ucyhjb25maWcpOworICAgICAgICBEZWZhdWx0U3NsQ29udGV4dEZhY3RvcnkgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbDIgPSBuZXcgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7CisgICAgICAgIC8vIFRyaWdnZXIgdGhlIHByaXZhdGUga2V5IGxvYWRpbmcuIFRoYXQgd2lsbCBhbHNvIGNoZWNrIGZvciBleHBpcmVkIHByaXZhdGUga2V5CisgICAgICAgIGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwyLmJ1aWxkT3V0Ym91bmRLZXlNYW5hZ2VyRmFjdG9yeSgpOworICAgICAgICAvLyBOb3cgd2Ugc2hvdWxkIGhhdmUgY2hlY2tlZCB0aGUgcHJpdmF0ZSBrZXkncyBleHBpcnkKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbDIub3V0Ym91bmRLZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsMi5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgbmV3IGZhY3Rvcnkgb2JqZWN0IHByZWZvcm1zIHRoZSBmcmVzaCBwcml2YXRlIGtleSBleHBpcnkgY2hlY2sKKyAgICAgICAgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5IGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwzID0gbmV3IERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbDMub3V0Ym91bmRLZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CisgICAgICAgIGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwzLmJ1aWxkT3V0Ym91bmRLZXlNYW5hZ2VyRmFjdG9yeSgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsMy5vdXRib3VuZEtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwyLmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlT3BlblNzbEZvckluSnZtRHRlc3RzKCkgewogICAgICAgICAvLyBUaGUgY29uZmlndXJhdGlvbiBuYW1lIGJlbG93IGlzIGhhcmQtY29kZWQgaW50ZW50aW9uYWxseSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgYnJlYWsgdGhlIGNvbnRyYWN0IHdpdGhvdXQKICAgICAgICAgLy8gY2hhbmdpbmcgdGhlIGRvY3VtZW50YXRpb24gYXBwcm9wcmlhdGVseQotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5kaXNhYmxlX3RjYWN0aXZlX29wZW5zc2wiLCJ0cnVlIik7Ci0gICAgICAgIE1hcDxTdHJpbmcsT2JqZWN0PiBjb25maWcgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGNvbmZpZy5wdXRBbGwoY29tbW9uQ29uZmlnKTsKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KERJU0FCTEVfVENBQ1RJVkVfT1BFTlNTTCwgdHJ1ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsT2JqZWN0PiBjb25maWcgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBjb25maWcucHV0QWxsKGNvbW1vbkNvbmZpZyk7CiAKLSAgICAgICAgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5IGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwgPSBuZXcgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU3NsUHJvdmlkZXIuSkRLLCBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLmdldFNzbFByb3ZpZGVyKCkpOwotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLmRpc2FibGVfdGNhY3RpdmVfb3BlbnNzbCIpOworICAgICAgICAgICAgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5IGRlZmF1bHRTc2xDb250ZXh0RmFjdG9yeUltcGwgPSBuZXcgRGVmYXVsdFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFNzbFByb3ZpZGVyLkpESywgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5nZXRTc2xQcm92aWRlcigpKTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9GaWxlQmFzZWRTc2xDb250ZXh0RmFjdG9yeVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9GaWxlQmFzZWRTc2xDb250ZXh0RmFjdG9yeVRlc3QuamF2YQppbmRleCBiZTQ5ZDE2Li5mYzg0YjNhIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvRmlsZUJhc2VkU3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L0ZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5VGVzdC5qYXZhCkBAIC0zMiw2ICszMiw5IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlBhcmFtZXRlcml6ZWRDbGFzczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfQ09ORklHOwogCiBwdWJsaWMgY2xhc3MgRmlsZUJhc2VkU3NsQ29udGV4dEZhY3RvcnlUZXN0CiB7CkBAIC0zOSwxNiArNDIsMTkgQEAKIAogICAgIHByaXZhdGUgRW5jcnlwdGlvbk9wdGlvbnMuU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgZW5jcnlwdGlvbk9wdGlvbnM7CiAKKyAgICBzdGF0aWMgV2l0aFByb3BlcnRpZXMgcHJvcGVydGllczsKKwogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cERhdGFiYXNlRGVzY3JpcHRvcigpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25maWciLCAiY2Fzc2FuZHJhLnlhbWwiKTsKKyAgICAgICAgQ0FTU0FORFJBX0NPTkZJRy5yZXNldCgpOworICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCk7CiAgICAgfQogCiAgICAgQEFmdGVyQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25EYXRhYmFzZURlc2NyaXB0b3IoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImNhc3NhbmRyYS5jb25maWciKTsKKyAgICAgICAgcHJvcGVydGllcy5jbG9zZSgpOwogICAgIH0KIAogICAgIEBCZWZvcmUKQEAgLTYyLDcgKzY4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFJlcXVpcmVDbGllbnRBdXRoKGZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ2lwaGVyU3VpdGVzKCJUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlKCJ0ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LmtleXN0b3JlIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoS2V5U3RvcmVQYXNzd29yZCgiY2Fzc2FuZHJhIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aE91dGJvdW5kS2V5c3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Rfb3V0Ym91bmQua2V5c3RvcmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZVBhc3N3b3JkKCJjYXNzYW5kcmEiKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtNzMsNiArODEsNyBAQAogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5GaWxlQmFzZWRTc2xDb250ZXh0RmFjdG9yeVRlc3QkVGVzdEZpbGVCYXNlZFNTTENvbnRleHRGYWN0b3J5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbEVuY3J5cHRpb25PcHRpb25zLnNzbF9jb250ZXh0X2ZhY3RvcnkuY2xhc3NfbmFtZSk7CiAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJrZXlzdG9yZV9wYXNzd29yZCBtdXN0IG5vdCBiZSBudWxsIiwgbG9jYWxFbmNyeXB0aW9uT3B0aW9ucy5rZXlzdG9yZV9wYXNzd29yZCk7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJvdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCBtdXN0IG5vdCBiZSBudWxsIiwgbG9jYWxFbmNyeXB0aW9uT3B0aW9ucy5vdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCk7CiAKICAgICAgICAgVGVzdEZpbGVCYXNlZFNTTENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5ID0KICAgICAgICAgKFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeSkgbG9jYWxFbmNyeXB0aW9uT3B0aW9ucy5zc2xDb250ZXh0RmFjdG9yeUluc3RhbmNlOwpAQCAtODYsMTEgKzk1LDEyIEBACiAgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5S2V5c3RvcmVQYXNzd29yZHMoKSB0aHJvd3MgU1NMRXhjZXB0aW9uCiAgICAgewotICAgICAgICBFbmNyeXB0aW9uT3B0aW9ucy5TZXJ2ZXJFbmNyeXB0aW9uT3B0aW9ucyBsb2NhbEVuY3J5cHRpb25PcHRpb25zID0gZW5jcnlwdGlvbk9wdGlvbnMud2l0aEtleVN0b3JlUGFzc3dvcmQobnVsbCk7CisgICAgICAgIEVuY3J5cHRpb25PcHRpb25zLlNlcnZlckVuY3J5cHRpb25PcHRpb25zIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMgPSBlbmNyeXB0aW9uT3B0aW9ucy53aXRoS2V5U3RvcmVQYXNzd29yZChudWxsKS53aXRoT3V0Ym91bmRLZXlzdG9yZVBhc3N3b3JkKG51bGwpOwogCiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LkZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5VGVzdCRUZXN0RmlsZUJhc2VkU1NMQ29udGV4dEZhY3RvcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMuc3NsX2NvbnRleHRfZmFjdG9yeS5jbGFzc19uYW1lKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoImtleXN0b3JlX3Bhc3N3b3JkIG11c3QgYmUgbnVsbCIsIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMua2V5c3RvcmVfcGFzc3dvcmQpOworICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbCgib3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQgbXVzdCBiZSBudWxsIiwgbG9jYWxFbmNyeXB0aW9uT3B0aW9ucy5vdXRib3VuZF9rZXlzdG9yZV9wYXNzd29yZCk7CiAKICAgICAgICAgVGVzdEZpbGVCYXNlZFNTTENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5ID0KICAgICAgICAgKFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeSkgbG9jYWxFbmNyeXB0aW9uT3B0aW9ucy5zc2xDb250ZXh0RmFjdG9yeUluc3RhbmNlOwpAQCAtMTE3LDYgKzEyNyw3IEBACiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LkZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5VGVzdCRUZXN0RmlsZUJhc2VkU1NMQ29udGV4dEZhY3RvcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMuc3NsX2NvbnRleHRfZmFjdG9yeS5jbGFzc19uYW1lKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoImtleXN0b3JlX3Bhc3N3b3JkIG11c3QgYmUgbnVsbCIsIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMua2V5c3RvcmVfcGFzc3dvcmQpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgib3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQgbXVzdCBub3QgYmUgbnVsbCIsIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMub3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQpOwogCiAgICAgICAgIFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeSBzc2xDb250ZXh0RmFjdG9yeSA9CiAgICAgICAgIChUZXN0RmlsZUJhc2VkU1NMQ29udGV4dEZhY3RvcnkpIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMuc3NsQ29udGV4dEZhY3RvcnlJbnN0YW5jZTsKQEAgLTEzMiw2ICsxNDMsMjYgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRlc3RzIGZvciB0aGUgZW1wdHkgcGFzc3dvcmQgZm9yIHRoZSB7QGNvZGUgb3V0Ym91bmRfa2V5c3RvcmV9LiBTaW5jZSB0aGUge0Bjb2RlIG91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkfSBkZWZhdWx0cworICAgICAqIHRvIHRoZSB7QGNvZGUga2V5c3RvcmVfcGFzc3dvcmR9LCB0aGlzIHRlc3Qgc2hvdWxkIHBhc3Mgd2l0aG91dCBleGNlcHRpb25zLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9ubHlFbXB0eU91dGJvdW5kS2V5c3RvcmVQYXNzd29yZCgpIHRocm93cyBTU0xFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEVuY3J5cHRpb25PcHRpb25zLlNlcnZlckVuY3J5cHRpb25PcHRpb25zIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMgPSBlbmNyeXB0aW9uT3B0aW9ucy53aXRoT3V0Ym91bmRLZXlzdG9yZVBhc3N3b3JkKG51bGwpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LkZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5VGVzdCRUZXN0RmlsZUJhc2VkU1NMQ29udGV4dEZhY3RvcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMuc3NsX2NvbnRleHRfZmFjdG9yeS5jbGFzc19uYW1lKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoImtleXN0b3JlX3Bhc3N3b3JkIG11c3Qgbm90IGJlIG51bGwiLCBsb2NhbEVuY3J5cHRpb25PcHRpb25zLmtleXN0b3JlX3Bhc3N3b3JkKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoIm91dGJvdW5kX2tleXN0b3JlX3Bhc3N3b3JkIG11c3QgYmUgbnVsbCIsIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMub3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQpOworCisgICAgICAgIFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeSBzc2xDb250ZXh0RmFjdG9yeSA9CisgICAgICAgIChUZXN0RmlsZUJhc2VkU1NMQ29udGV4dEZhY3RvcnkpIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMuc3NsQ29udGV4dEZhY3RvcnlJbnN0YW5jZTsKKyAgICAgICAgc3NsQ29udGV4dEZhY3RvcnkuYnVpbGRLZXlNYW5hZ2VyRmFjdG9yeSgpOworICAgICAgICBzc2xDb250ZXh0RmFjdG9yeS5idWlsZFRydXN0TWFuYWdlckZhY3RvcnkoKTsKKyAgICB9CisKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVRydXN0c3RvcmVQYXNzd29yZCgpIHRocm93cyBTU0xFeGNlcHRpb24KICAgICB7CkBAIC0xMzksNiArMTcwLDcgQEAKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygib3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuRmlsZUJhc2VkU3NsQ29udGV4dEZhY3RvcnlUZXN0JFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxFbmNyeXB0aW9uT3B0aW9ucy5zc2xfY29udGV4dF9mYWN0b3J5LmNsYXNzX25hbWUpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgia2V5c3RvcmVfcGFzc3dvcmQgbXVzdCBub3QgYmUgbnVsbCIsIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMua2V5c3RvcmVfcGFzc3dvcmQpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbCgib3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQgbXVzdCBub3QgYmUgbnVsbCIsIGxvY2FsRW5jcnlwdGlvbk9wdGlvbnMub3V0Ym91bmRfa2V5c3RvcmVfcGFzc3dvcmQpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbCgidHJ1c3RzdG9yZV9wYXNzd29yZCBtdXN0IGJlIG51bGwiLCBsb2NhbEVuY3J5cHRpb25PcHRpb25zLnRydXN0c3RvcmVfcGFzc3dvcmQpOwogCiAgICAgICAgIFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeSBzc2xDb250ZXh0RmFjdG9yeSA9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5Q29uZmlnVGVzdC5qYXZhCmluZGV4IGFiNmIwMGEuLmUyN2JlNGUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5Q29uZmlnVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5Q29uZmlnVGVzdC5qYXZhCkBAIC0yNywxOSArMjcsMjQgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfQ09ORklHOwogCiBwdWJsaWMgY2xhc3MgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1Rlc3QKIHsKKyAgICBzdGF0aWMgV2l0aFByb3BlcnRpZXMgcHJvcGVydGllczsKKwogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cERhdGFiYXNlRGVzY3JpcHRvcigpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5jb25maWciLCAiY2Fzc2FuZHJhLXBlbS1zc2xjb250ZXh0ZmFjdG9yeS55YW1sIik7CisgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoQ0FTU0FORFJBX0NPTkZJRywgImNhc3NhbmRyYS1wZW0tc3NsY29udGV4dGZhY3RvcnkueWFtbCIpOwogICAgIH0KIAogICAgIEBBZnRlckNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duRGF0YWJhc2VEZXNjcmlwdG9yKCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIik7CisgICAgICAgIHByb3BlcnRpZXMuY2xvc2UoKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlDb25maWdXaXRoTWlzbWF0Y2hpbmdQYXNzd29yZHNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1dpdGhNaXNtYXRjaGluZ1Bhc3N3b3Jkc1Rlc3QuamF2YQppbmRleCBjMWUyZGJlLi42OThlN2E3IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1dpdGhNaXNtYXRjaGluZ1Bhc3N3b3Jkc1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1dpdGhNaXNtYXRjaGluZ1Bhc3N3b3Jkc1Rlc3QuamF2YQpAQCAtMjcsMjAgKzI3LDI1IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CisKIHB1YmxpYyBjbGFzcyBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5Q29uZmlnV2l0aE1pc21hdGNoaW5nUGFzc3dvcmRzVGVzdAogeworICAgIHN0YXRpYyBXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzOworCiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwRGF0YWJhc2VEZXNjcmlwdG9yKCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIsICJjYXNzYW5kcmEtcGVtLXNzbGNvbnRleHRmYWN0b3J5LW1pc21hdGNoaW5nLXBhc3N3b3Jkcy55YW1sIik7CisgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoQ0FTU0FORFJBX0NPTkZJRywgImNhc3NhbmRyYS1wZW0tc3NsY29udGV4dGZhY3RvcnktbWlzbWF0Y2hpbmctcGFzc3dvcmRzLnlhbWwiKTsKICAgICB9CiAKICAgICBAQWZ0ZXJDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkRhdGFiYXNlRGVzY3JpcHRvcigpCiAgICAgewotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIpOworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QoZXhwZWN0ZWQgPSBDb25maWd1cmF0aW9uRXhjZXB0aW9uLmNsYXNzKQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlDb25maWdXaXRoVW5lbmNyeXB0ZWRLZXlzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlDb25maWdXaXRoVW5lbmNyeXB0ZWRLZXlzVGVzdC5qYXZhCmluZGV4IDA2NmRlOGYuLjJiNjNkMDUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5Q29uZmlnV2l0aFVuZW5jcnlwdGVkS2V5c1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1dpdGhVbmVuY3J5cHRlZEtleXNUZXN0LmphdmEKQEAgLTI3LDIwICsyNywyNyBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkNBU1NBTkRSQV9DT05GSUc7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRElTQUJMRV9UQ0FDVElWRV9PUEVOU1NMOwogCiBwdWJsaWMgY2xhc3MgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1dpdGhVbmVuY3J5cHRlZEtleXNUZXN0CiB7CisgICAgc3RhdGljIFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBEYXRhYmFzZURlc2NyaXB0b3IoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIiwgImNhc3NhbmRyYS1wZW0tc3NsY29udGV4dGZhY3RvcnktdW5lbmNyeXB0ZWRrZXlzLnlhbWwiKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuZGlzYWJsZV90Y2FjdGl2ZV9vcGVuc3NsIiwgInRydWUiKTsKKyAgICAgICAgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpCisgICAgICAgICAgICAgICAgICAgICAuc2V0KENBU1NBTkRSQV9DT05GSUcsICJjYXNzYW5kcmEtcGVtLXNzbGNvbnRleHRmYWN0b3J5LXVuZW5jcnlwdGVka2V5cy55YW1sIikKKyAgICAgICAgICAgICAgICAgICAgIC5zZXQoRElTQUJMRV9UQ0FDVElWRV9PUEVOU1NMLCB0cnVlKTsKICAgICB9CiAKICAgICBAQWZ0ZXJDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkRhdGFiYXNlRGVzY3JpcHRvcigpCiAgICAgewotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIpOworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5SW52YWxpZENvbmZpZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5SW52YWxpZENvbmZpZ1Rlc3QuamF2YQppbmRleCAyMjgxMTM3Li5iYjE1N2JiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeUludmFsaWRDb25maWdUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlJbnZhbGlkQ29uZmlnVGVzdC5qYXZhCkBAIC0yNywyMCArMjcsMjUgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0NPTkZJRzsKKwogcHVibGljIGNsYXNzIFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlJbnZhbGlkQ29uZmlnVGVzdAogeworICAgIHN0YXRpYyBXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzOworCiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwRGF0YWJhc2VEZXNjcmlwdG9yKCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIsICJjYXNzYW5kcmEtcGVtLXNzbGNvbnRleHRmYWN0b3J5LWludmFsaWRjb25maWd1cmF0aW9uLnlhbWwiKTsKKyAgICAgICAgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChDQVNTQU5EUkFfQ09ORklHLCAiY2Fzc2FuZHJhLXBlbS1zc2xjb250ZXh0ZmFjdG9yeS1pbnZhbGlkY29uZmlndXJhdGlvbi55YW1sIik7CiAgICAgfQogCiAgICAgQEFmdGVyQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25EYXRhYmFzZURlc2NyaXB0b3IoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImNhc3NhbmRyYS5jb25maWciKTsKKyAgICAgICAgcHJvcGVydGllcy5jbG9zZSgpOwogICAgIH0KIAogICAgIEBUZXN0KGV4cGVjdGVkID0gQ29uZmlndXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEKaW5kZXggMjQzZDMwMC4uZWU5YzYxMCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnlUZXN0LmphdmEKQEAgLTM1LDcgKzM1LDkgQEAKIGltcG9ydCBpby5uZXR0eS5oYW5kbGVyLnNzbC5Tc2xQcm92aWRlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLlBhcmFtZXRlcml6ZWRDbGFzczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5ESVNBQkxFX1RDQUNUSVZFX09QRU5TU0w7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlY3VyaXR5LlBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkuQ29uZmlnS2V5LkVOQ09ERURfQ0VSVElGSUNBVEVTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZWN1cml0eS5QRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5LkNvbmZpZ0tleS5FTkNPREVEX0tFWTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHkuUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeS5Db25maWdLZXkuS0VZX1BBU1NXT1JEOwpAQCAtMjE2LDYgKzIxOCwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFJlcXVpcmVDbGllbnRBdXRoKGZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENpcGhlclN1aXRlcygiVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU3NsQ29udGV4dEZhY3Rvcnkoc3NsQ29udGV4dEZhY3RvcnkpOworICAgICAgICBTc2xDb250ZXh0IHNzbENvbnRleHQgPSBTU0xGYWN0b3J5LmdldE9yQ3JlYXRlU3NsQ29udGV4dChvcHRpb25zLCB0cnVlLCBJU3NsQ29udGV4dEZhY3RvcnkuU29ja2V0VHlwZS5TRVJWRVIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChzc2xDb250ZXh0KTsKKyAgICAgICAgaWYgKE9wZW5Tc2wuaXNBdmFpbGFibGUoKSkKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHNzbENvbnRleHQgaW5zdGFuY2VvZiBPcGVuU3NsQ29udGV4dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHNzbENvbnRleHQgaW5zdGFuY2VvZiBTc2xDb250ZXh0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldFNzbENvbnRleHRPcGVuU1NMT3V0Ym91bmRLZXlzdG9yZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGFyYW1ldGVyaXplZENsYXNzIHNzbENvbnRleHRGYWN0b3J5ID0gbmV3IFBhcmFtZXRlcml6ZWRDbGFzcyhQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5LmNsYXNzLmdldFNpbXBsZU5hbWUoKQorICAgICAgICAsIG5ldyBIYXNoTWFwPD4oKSk7CisgICAgICAgIEVuY3J5cHRpb25PcHRpb25zLlNlcnZlckVuY3J5cHRpb25PcHRpb25zIG9wdGlvbnMgPSBuZXcgRW5jcnlwdGlvbk9wdGlvbnMuU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMoKS53aXRoVHJ1c3RTdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC50cnVzdHN0b3JlLnBlbSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoS2V5U3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Qua2V5c3RvcmUucGVtIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhLZXlTdG9yZVBhc3N3b3JkKCJjYXNzYW5kcmEiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aE91dGJvdW5kS2V5c3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Qua2V5c3RvcmUucGVtIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhPdXRib3VuZEtleXN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoUmVxdWlyZUNsaWVudEF1dGgoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ2lwaGVyU3VpdGVzKCJUTFNfUlNBX1dJVEhfQUVTXzEyOF9DQkNfU0hBIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTc2xDb250ZXh0RmFjdG9yeShzc2xDb250ZXh0RmFjdG9yeSk7CiAgICAgICAgIFNzbENvbnRleHQgc3NsQ29udGV4dCA9IFNTTEZhY3RvcnkuZ2V0T3JDcmVhdGVTc2xDb250ZXh0KG9wdGlvbnMsIHRydWUsIElTc2xDb250ZXh0RmFjdG9yeS5Tb2NrZXRUeXBlLkNMSUVOVCk7CiAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHNzbENvbnRleHQpOwogICAgICAgICBpZiAoT3BlblNzbC5pc0F2YWlsYWJsZSgpKQpAQCAtMjMzLDcgKzI1Niw3IEBACiAgICAgICAgIGNvbmZpZy5wdXQoInRydXN0c3RvcmUiLCAiL3RoaXMvaXMvcHJvYmFibHkvbm90L2EvZmlsZS9vbi95b3VyL3Rlc3QvbWFjaGluZSIpOwogCiAgICAgICAgIERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeSBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsID0gbmV3IERlZmF1bHRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOwotICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLmNoZWNrZWRFeHBpcnkgPSBmYWxzZTsKKyAgICAgICAgZGVmYXVsdFNzbENvbnRleHRGYWN0b3J5SW1wbC5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBkZWZhdWx0U3NsQ29udGV4dEZhY3RvcnlJbXBsLmJ1aWxkVHJ1c3RNYW5hZ2VyRmFjdG9yeSgpOwogICAgIH0KIApAQCAtMjQ0LDcgKzI2Nyw3IEBACiAgICAgICAgIGNvbmZpZy5wdXRBbGwoY29tbW9uQ29uZmlnKTsKIAogICAgICAgICBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5ID0gbmV3IFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgc3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBzc2xDb250ZXh0RmFjdG9yeS5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBUcnVzdE1hbmFnZXJGYWN0b3J5IHRydXN0TWFuYWdlckZhY3RvcnkgPSBzc2xDb250ZXh0RmFjdG9yeS5idWlsZFRydXN0TWFuYWdlckZhY3RvcnkoKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwodHJ1c3RNYW5hZ2VyRmFjdG9yeSk7CiAgICAgfQpAQCAtMjU4LDcgKzI4MSw3IEBACiAgICAgICAgIGFkZEZpbGVCYXNlVHJ1c3RTdG9yZU9wdGlvbnMoY29uZmlnKTsKIAogICAgICAgICBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5ID0gbmV3IFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgc3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBzc2xDb250ZXh0RmFjdG9yeS5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBUcnVzdE1hbmFnZXJGYWN0b3J5IHRydXN0TWFuYWdlckZhY3RvcnkgPSBzc2xDb250ZXh0RmFjdG9yeS5idWlsZFRydXN0TWFuYWdlckZhY3RvcnkoKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwodHJ1c3RNYW5hZ2VyRmFjdG9yeSk7CiAgICAgfQpAQCAtMjcxLDcgKzI5NCw3IEBACiAgICAgICAgIGNvbmZpZy5wdXQoImtleXN0b3JlIiwgIi90aGlzL2lzL3Byb2JhYmx5L25vdC9hL2ZpbGUvb24veW91ci90ZXN0L21hY2hpbmUiKTsKIAogICAgICAgICBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5ID0gbmV3IFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgc3NsQ29udGV4dEZhY3RvcnkuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOworICAgICAgICBzc2xDb250ZXh0RmFjdG9yeS5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSA9IGZhbHNlOwogICAgICAgICBzc2xDb250ZXh0RmFjdG9yeS5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7CiAgICAgfQogCkBAIC0yOTUsMjAgKzMxOCwyMCBAQAogCiAgICAgICAgIFBFTUJhc2VkU3NsQ29udGV4dEZhY3Rvcnkgc3NsQ29udGV4dEZhY3RvcnkxID0gbmV3IFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBleGlyeSBjaGVjayBkaWRuJ3QgaGFwcGVuIHNvIGZhciBmb3IgdGhlIHByaXZhdGUga2V5Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShzc2xDb250ZXh0RmFjdG9yeTEuY2hlY2tlZEV4cGlyeSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShzc2xDb250ZXh0RmFjdG9yeTEua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkpOwogCiAgICAgICAgIGFkZEtleVN0b3JlT3B0aW9ucyhjb25maWcpOwogICAgICAgICBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5MiA9IG5ldyBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7CiAgICAgICAgIC8vIFRyaWdnZXIgdGhlIHByaXZhdGUga2V5IGxvYWRpbmcuIFRoYXQgd2lsbCBhbHNvIGNoZWNrIGZvciBleHBpcmVkIHByaXZhdGUga2V5CiAgICAgICAgIHNzbENvbnRleHRGYWN0b3J5Mi5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7CiAgICAgICAgIC8vIE5vdyB3ZSBzaG91bGQgaGF2ZSBjaGVja2VkIHRoZSBwcml2YXRlIGtleSdzIGV4cGlyeQotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzc2xDb250ZXh0RmFjdG9yeTIuY2hlY2tlZEV4cGlyeSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHNzbENvbnRleHRGYWN0b3J5Mi5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CiAKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgbmV3IGZhY3Rvcnkgb2JqZWN0IHByZWZvcm1zIHRoZSBmcmVzaCBwcml2YXRlIGtleSBleHBpcnkgY2hlY2sKICAgICAgICAgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeSBzc2xDb250ZXh0RmFjdG9yeTMgPSBuZXcgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2Uoc3NsQ29udGV4dEZhY3RvcnkzLmNoZWNrZWRFeHBpcnkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2Uoc3NsQ29udGV4dEZhY3RvcnkzLmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKICAgICAgICAgc3NsQ29udGV4dEZhY3RvcnkzLmJ1aWxkS2V5TWFuYWdlckZhY3RvcnkoKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoc3NsQ29udGV4dEZhY3RvcnkzLmNoZWNrZWRFeHBpcnkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzc2xDb250ZXh0RmFjdG9yeTMua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkpOwogICAgIH0KIAogICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQpAQCAtMzQzLDIwICszNjYsMjAgQEAKIAogICAgICAgICBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5MSA9IG5ldyBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7CiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZXhwaXJ5IGNoZWNrIGRpZG4ndCBoYXBwZW4gc28gZmFyIGZvciB0aGUgcHJpdmF0ZSBrZXkKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHNzbENvbnRleHRGYWN0b3J5MS5jaGVja2VkRXhwaXJ5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHNzbENvbnRleHRGYWN0b3J5MS5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CiAKICAgICAgICAgYWRkRmlsZUJhc2VLZXlTdG9yZU9wdGlvbnMoY29uZmlnKTsKICAgICAgICAgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeSBzc2xDb250ZXh0RmFjdG9yeTIgPSBuZXcgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeShjb25maWcpOwogICAgICAgICAvLyBUcmlnZ2VyIHRoZSBwcml2YXRlIGtleSBsb2FkaW5nLiBUaGF0IHdpbGwgYWxzbyBjaGVjayBmb3IgZXhwaXJlZCBwcml2YXRlIGtleQogICAgICAgICBzc2xDb250ZXh0RmFjdG9yeTIuYnVpbGRLZXlNYW5hZ2VyRmFjdG9yeSgpOwogICAgICAgICAvLyBOb3cgd2Ugc2hvdWxkIGhhdmUgY2hlY2tlZCB0aGUgcHJpdmF0ZSBrZXkncyBleHBpcnkKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoc3NsQ29udGV4dEZhY3RvcnkyLmNoZWNrZWRFeHBpcnkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzc2xDb250ZXh0RmFjdG9yeTIua2V5c3RvcmVDb250ZXh0LmNoZWNrZWRFeHBpcnkpOwogCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IG5ldyBmYWN0b3J5IG9iamVjdCBwcmVmb3JtcyB0aGUgZnJlc2ggcHJpdmF0ZSBrZXkgZXhwaXJ5IGNoZWNrCiAgICAgICAgIFBFTUJhc2VkU3NsQ29udGV4dEZhY3Rvcnkgc3NsQ29udGV4dEZhY3RvcnkzID0gbmV3IFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHNzbENvbnRleHRGYWN0b3J5My5jaGVja2VkRXhwaXJ5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKHNzbENvbnRleHRGYWN0b3J5My5rZXlzdG9yZUNvbnRleHQuY2hlY2tlZEV4cGlyeSk7CiAgICAgICAgIHNzbENvbnRleHRGYWN0b3J5My5idWlsZEtleU1hbmFnZXJGYWN0b3J5KCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHNzbENvbnRleHRGYWN0b3J5My5jaGVja2VkRXhwaXJ5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoc3NsQ29udGV4dEZhY3RvcnkzLmtleXN0b3JlQ29udGV4dC5jaGVja2VkRXhwaXJ5KTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMzkyLDEzICs0MTUsMTQgQEAKICAgICB7CiAgICAgICAgIC8vIFRoZSBjb25maWd1cmF0aW9uIG5hbWUgYmVsb3cgaXMgaGFyZC1jb2RlZCBpbnRlbnRpb25hbGx5IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBicmVhayB0aGUgY29udHJhY3Qgd2l0aG91dAogICAgICAgICAvLyBjaGFuZ2luZyB0aGUgZG9jdW1lbnRhdGlvbiBhcHByb3ByaWF0ZWx5Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmRpc2FibGVfdGNhY3RpdmVfb3BlbnNzbCIsICJ0cnVlIik7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY29uZmlnID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBjb25maWcucHV0QWxsKGNvbW1vbkNvbmZpZyk7CisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChESVNBQkxFX1RDQUNUSVZFX09QRU5TU0wsIHRydWUpKQorICAgICAgICB7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbmZpZyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIGNvbmZpZy5wdXRBbGwoY29tbW9uQ29uZmlnKTsKIAotICAgICAgICBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5ID0gbmV3IFBFTUJhc2VkU3NsQ29udGV4dEZhY3RvcnkoY29uZmlnKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTc2xQcm92aWRlci5KREssIHNzbENvbnRleHRGYWN0b3J5LmdldFNzbFByb3ZpZGVyKCkpOwotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLmRpc2FibGVfdGNhY3RpdmVfb3BlbnNzbCIpOworICAgICAgICAgICAgUEVNQmFzZWRTc2xDb250ZXh0RmFjdG9yeSBzc2xDb250ZXh0RmFjdG9yeSA9IG5ldyBQRU1CYXNlZFNzbENvbnRleHRGYWN0b3J5KGNvbmZpZyk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFNzbFByb3ZpZGVyLkpESywgc3NsQ29udGV4dEZhY3RvcnkuZ2V0U3NsUHJvdmlkZXIoKSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1KS1NTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9QRU1KS1NTc2xDb250ZXh0RmFjdG9yeUNvbmZpZ1Rlc3QuamF2YQppbmRleCA4ZWZkM2U0Li5mMTg3ZTJjIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VjdXJpdHkvUEVNSktTU3NsQ29udGV4dEZhY3RvcnlDb25maWdUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1BFTUpLU1NzbENvbnRleHRGYWN0b3J5Q29uZmlnVGVzdC5qYXZhCkBAIC0yNywxOCArMjcsMjMgQEAKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5Db25maWc7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5DQVNTQU5EUkFfQ09ORklHOwogCiBwdWJsaWMgY2xhc3MgUEVNSktTU3NsQ29udGV4dEZhY3RvcnlDb25maWdUZXN0CiB7CisgICAgc3RhdGljIFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBEYXRhYmFzZURlc2NyaXB0b3IoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEuY29uZmlnIiwgImNhc3NhbmRyYS1wZW0tamtzLXNzbGNvbnRleHRmYWN0b3J5LnlhbWwiKTsKKyAgICAgICAgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChDQVNTQU5EUkFfQ09ORklHLCAiY2Fzc2FuZHJhLXBlbS1qa3Mtc3NsY29udGV4dGZhY3RvcnkueWFtbCIpOwogICAgIH0KIAogICAgIEBBZnRlckNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duRGF0YWJhc2VEZXNjcmlwdG9yKCkgewotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgiY2Fzc2FuZHJhLmNvbmZpZyIpOworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZWN1cml0eS9TU0xGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1NTTEZhY3RvcnlUZXN0LmphdmEKaW5kZXggZTVhYTRiMS4uZmYzYmFiOSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1NTTEZhY3RvcnlUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlY3VyaXR5L1NTTEZhY3RvcnlUZXN0LmphdmEKQEAgLTE4LDExICsxOCwxOSBAQAogKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VjdXJpdHk7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5U3RvcmVFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuWDUwOUtleU1hbmFnZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CkBAIC0zMSwxMiArMzksMTkgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuT3BlblNzbENsaWVudENvbnRleHQ7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuT3BlblNzbFNlcnZlckNvbnRleHQ7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuT3BlblNzbFNlc3Npb25Db250ZXh0OwogaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuc3NsLlNzbENvbnRleHQ7CiBpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wudXRpbC5TZWxmU2lnbmVkQ2VydGlmaWNhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkVuY3J5cHRpb25PcHRpb25zLlNlcnZlckVuY3J5cHRpb25PcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5QYXJhbWV0ZXJpemVkQ2xhc3M7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiAKIHB1YmxpYyBjbGFzcyBTU0xGYWN0b3J5VGVzdAogewpAQCAtNjUsMTMgKzgwLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhUcnVzdFN0b3JlKCJ0ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LnRydXN0c3RvcmUiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoVHJ1c3RTdG9yZVBhc3N3b3JkKCJjYXNzYW5kcmEiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoUmVxdWlyZUNsaWVudEF1dGgoZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDaXBoZXJTdWl0ZXMoIlRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENpcGhlclN1aXRlcygiVExTX1JTQV9XSVRIX0FFU18xMjhfQ0JDX1NIQSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTc2xDb250ZXh0RmFjdG9yeShuZXcgUGFyYW1ldGVyaXplZENsYXNzKFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeS5jbGFzcy5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPD4oKSkpOwogICAgIH0KIAogICAgIHByaXZhdGUgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgYWRkS2V5c3RvcmVPcHRpb25zKFNlcnZlckVuY3J5cHRpb25PcHRpb25zIG9wdGlvbnMpCiAgICAgewogICAgICAgICByZXR1cm4gb3B0aW9ucy53aXRoS2V5U3RvcmUoInRlc3QvY29uZi9jYXNzYW5kcmFfc3NsX3Rlc3Qua2V5c3RvcmUiKQotICAgICAgICAgICAgICAgICAgICAgIC53aXRoS2V5U3RvcmVQYXNzd29yZCgiY2Fzc2FuZHJhIik7CisgICAgICAgICAgICAgICAgICAgICAgLndpdGhLZXlTdG9yZVBhc3N3b3JkKCJjYXNzYW5kcmEiKQorICAgICAgICAgICAgICAgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdF9vdXRib3VuZC5rZXlzdG9yZSIpCisgICAgICAgICAgICAgICAgICAgICAgLndpdGhPdXRib3VuZEtleXN0b3JlUGFzc3dvcmQoImNhc3NhbmRyYSIpOwogICAgIH0KIAogICAgIHByaXZhdGUgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgYWRkUEVNS2V5c3RvcmVPcHRpb25zKFNlcnZlckVuY3J5cHRpb25PcHRpb25zIG9wdGlvbnMpCkBAIC04MSw2ICsxMDAsOCBAQAogICAgICAgICByZXR1cm4gb3B0aW9ucy53aXRoU3NsQ29udGV4dEZhY3Rvcnkoc3NsQ29udGV4dEZhY3RvcnlDbGFzcykKICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlKCJ0ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LmtleXN0b3JlLnBlbSIpCiAgICAgICAgICAgICAgICAgICAgICAgLndpdGhLZXlTdG9yZVBhc3N3b3JkKCJjYXNzYW5kcmEiKQorICAgICAgICAgICAgICAgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC5rZXlzdG9yZS5wZW0iKQorICAgICAgICAgICAgICAgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZVBhc3N3b3JkKCJjYXNzYW5kcmEiKQogICAgICAgICAgICAgICAgICAgICAgIC53aXRoVHJ1c3RTdG9yZSgidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdC50cnVzdHN0b3JlLnBlbSIpOwogICAgIH0KIApAQCAtMTE3LDcgKzEzOCw0MSBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBFTVNzbENvbnRleHRSZWxvYWRfSGFwcHlQYXRoKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2ZXJTb2NrZXRTaG91bGRVc2VLZXlzdG9yZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2VydGlmaWNhdGVFeGNlcHRpb24sIEtleVN0b3JlRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIG9wdGlvbnMgPSBhZGRLZXlzdG9yZU9wdGlvbnMoZW5jcnlwdGlvbk9wdGlvbnMpCisgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZSgiZHVtbXlLZXlzdG9yZSIpCisgICAgICAgIC53aXRoT3V0Ym91bmRLZXlzdG9yZVBhc3N3b3JkKCJkdW1teVBhc3N3b3JkIik7CisKKyAgICAgICAgLy8gU2VydmVyIHNvY2tldCB0eXBlIHNob3VsZCBjcmVhdGUgYSBrZXlzdG9yZSB3aXRoIGtleXN0b3JlICYga2V5c3RvcmUgcGFzc3dvcmQKKyAgICAgICAgZmluYWwgT3BlblNzbFNlcnZlckNvbnRleHQgY29udGV4dCA9IChPcGVuU3NsU2VydmVyQ29udGV4dCkgU1NMRmFjdG9yeS5jcmVhdGVOZXR0eVNzbENvbnRleHQob3B0aW9ucywgdHJ1ZSwgSVNzbENvbnRleHRGYWN0b3J5LlNvY2tldFR5cGUuU0VSVkVSKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb250ZXh0KTsKKworICAgICAgICAvLyBWZXJpZnkgaWYgcmlnaHQgY2VydGlmaWNhdGUgaXMgbG9hZGVkIGludG8gU3NsQ29udGV4dAorICAgICAgICBmaW5hbCBDZXJ0aWZpY2F0ZSBsb2FkZWRDZXJ0aWZpY2F0ZSA9IGdldENlcnRpZmljYXRlTG9hZGVkSW5Tc2xDb250ZXh0KGNvbnRleHQuc2Vzc2lvbkNvbnRleHQoKSk7CisgICAgICAgIGZpbmFsIENlcnRpZmljYXRlIGNlcnRpZmljYXRlID0gZ2V0Q2VydGlmaWNhdGVzKCJ0ZXN0L2NvbmYvY2Fzc2FuZHJhX3NzbF90ZXN0LmtleXN0b3JlIiwgImNhc3NhbmRyYSIpOworICAgICAgICBhc3NlcnRFcXVhbHMobG9hZGVkQ2VydGlmaWNhdGUsIGNlcnRpZmljYXRlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRTb2NrZXRTaG91bGRVc2VPdXRib3VuZEtleXN0b3JlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwgS2V5U3RvcmVFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU2VydmVyRW5jcnlwdGlvbk9wdGlvbnMgb3B0aW9ucyA9IGFkZEtleXN0b3JlT3B0aW9ucyhlbmNyeXB0aW9uT3B0aW9ucykKKyAgICAgICAgLndpdGhLZXlTdG9yZSgiZHVtbXlLZXlzdG9yZSIpCisgICAgICAgIC53aXRoS2V5U3RvcmVQYXNzd29yZCgiZHVtbXlQYXNzd29yZCIpOworCisgICAgICAgIC8vIENsaWVudCBzb2NrZXQgdHlwZSBzaG91bGQgY3JlYXRlIGEga2V5c3RvcmUgd2l0aCBvdXRib3VuZCBLZXlzdG9yZSAmIG91dGJvdW5kIHBhc3N3b3JkCisgICAgICAgIGZpbmFsIE9wZW5Tc2xDbGllbnRDb250ZXh0IGNvbnRleHQgPSAoT3BlblNzbENsaWVudENvbnRleHQpIFNTTEZhY3RvcnkuY3JlYXRlTmV0dHlTc2xDb250ZXh0KG9wdGlvbnMsIHRydWUsIElTc2xDb250ZXh0RmFjdG9yeS5Tb2NrZXRUeXBlLkNMSUVOVCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udGV4dCk7CisKKyAgICAgICAgLy8gVmVyaWZ5IGlmIHJpZ2h0IGNlcnRpZmljYXRlIGlzIGxvYWRlZCBpbnRvIFNzbENvbnRleHQKKyAgICAgICAgZmluYWwgQ2VydGlmaWNhdGUgbG9hZGVkQ2VydGlmaWNhdGUgPSBnZXRDZXJ0aWZpY2F0ZUxvYWRlZEluU3NsQ29udGV4dChjb250ZXh0LnNlc3Npb25Db250ZXh0KCkpOworICAgICAgICBmaW5hbCBDZXJ0aWZpY2F0ZSBjZXJ0aWZpY2F0ZSA9IGdldENlcnRpZmljYXRlcygidGVzdC9jb25mL2Nhc3NhbmRyYV9zc2xfdGVzdF9vdXRib3VuZC5rZXlzdG9yZSIsICJjYXNzYW5kcmEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxvYWRlZENlcnRpZmljYXRlLCBjZXJ0aWZpY2F0ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UEVNU3NsQ29udGV4dFJlbG9hZF9IYXBweVBhdGgoKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7CiAgICAgICAgIHRyeQogICAgICAgICB7CkBAIC0yMjMsOCArMjc4LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGdldFNzbENvbnRleHRfUGFyYW1DaGFuZ2VzKCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBFbmNyeXB0aW9uT3B0aW9ucyBvcHRpb25zID0gYWRkS2V5c3RvcmVPcHRpb25zKGVuY3J5cHRpb25PcHRpb25zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhFbmFibGVkKHRydWUpCisgICAgICAgIFNlcnZlckVuY3J5cHRpb25PcHRpb25zIG9wdGlvbnMgPSBhZGRLZXlzdG9yZU9wdGlvbnMoZW5jcnlwdGlvbk9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENpcGhlclN1aXRlcygiVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzEyOF9HQ01fU0hBMjU2Iik7CiAKICAgICAgICAgU3NsQ29udGV4dCBjdHgxID0gU1NMRmFjdG9yeS5nZXRPckNyZWF0ZVNzbENvbnRleHQob3B0aW9ucywgdHJ1ZSwKQEAgLTMwMSw0ICszNTUsMzYgQEAKIAogICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90RXF1YWxzKGNhY2hlS2V5MSwgY2FjaGVLZXkyKTsKICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeSBleHRlbmRzIEZpbGVCYXNlZFNzbENvbnRleHRGYWN0b3J5IHsKKyAgICAgICAgcHVibGljIFRlc3RGaWxlQmFzZWRTU0xDb250ZXh0RmFjdG9yeShNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtZXRlcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKHBhcmFtZXRlcnMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2VydGlmaWNhdGUgZ2V0Q2VydGlmaWNhdGVzKGZpbmFsIFN0cmluZyBmaWxlbmFtZSwgZmluYWwgU3RyaW5nIHBhc3N3b3JkKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uCisgICAgeworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVuYW1lKTsKKyAgICAgICAgS2V5U3RvcmUga2V5c3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShLZXlTdG9yZS5nZXREZWZhdWx0VHlwZSgpKTsKKyAgICAgICAgY2hhcltdIHBhc3N3ZCA9IHBhc3N3b3JkLnRvQ2hhckFycmF5KCk7CisgICAgICAgIGtleXN0b3JlLmxvYWQoaXMsIHBhc3N3ZCk7CisgICAgICAgIHJldHVybiBrZXlzdG9yZS5nZXRDZXJ0aWZpY2F0ZSgiY2Fzc2FuZHJhX3NzbF90ZXN0Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2VydGlmaWNhdGUgZ2V0Q2VydGlmaWNhdGVMb2FkZWRJblNzbENvbnRleHQoZmluYWwgT3BlblNzbFNlc3Npb25Db250ZXh0IHNlc3Npb24pCisgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24KKyAgICB7CisgICAgICAgIEZpZWxkIHByb3ZpZGVyRmllbGQgPSBPcGVuU3NsU2Vzc2lvbkNvbnRleHQuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgicHJvdmlkZXIiKTsKKyAgICAgICAgcHJvdmlkZXJGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworCisgICAgICAgIENsYXNzPD8+IGtleU1hdGVyaWFsUHJvdmlkZXIgPSBDbGFzcy5mb3JOYW1lKCJpby5uZXR0eS5oYW5kbGVyLnNzbC5PcGVuU3NsS2V5TWF0ZXJpYWxQcm92aWRlciIpOworICAgICAgICBPYmplY3QgcHJvdmlkZXIgPSBrZXlNYXRlcmlhbFByb3ZpZGVyLmNhc3QocHJvdmlkZXJGaWVsZC5nZXQoc2Vzc2lvbikpOworCisgICAgICAgIE1ldGhvZCBrZXlNYW5hZ2VyID0gcHJvdmlkZXIuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgia2V5TWFuYWdlciIpOworICAgICAgICBrZXlNYW5hZ2VyLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgIFg1MDlLZXlNYW5hZ2VyIGtleU1hbmFnZXIxID0gKFg1MDlLZXlNYW5hZ2VyKSBrZXlNYW5hZ2VyLmludm9rZShwcm92aWRlcik7CisgICAgICAgIGZpbmFsIENlcnRpZmljYXRlW10gY2VydGlmaWNhdGVzID0ga2V5TWFuYWdlcjEuZ2V0Q2VydGlmaWNhdGVDaGFpbigiY2Fzc2FuZHJhX3NzbF90ZXN0Iik7CisgICAgICAgIHJldHVybiBjZXJ0aWZpY2F0ZXNbMF07CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL01hcFNlcmlhbGl6ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VyaWFsaXplcnMvTWFwU2VyaWFsaXplclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDEyMTIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL01hcFNlcmlhbGl6ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnM7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlJhbmdlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5NYXBUeXBlOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsLlVOU0VUX0JZVEVfQlVGRkVSOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIE1hcFNlcmlhbGl6ZXJUZXN0Cit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW5kZXhGcm9tU2VyaWFsaXplZCgpCisgICAgeworICAgICAgICB0ZXN0R2V0SW5kZXhGcm9tU2VyaWFsaXplZCh0cnVlKTsKKyAgICAgICAgdGVzdEdldEluZGV4RnJvbVNlcmlhbGl6ZWQoZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEdldEluZGV4RnJvbVNlcmlhbGl6ZWQoYm9vbGVhbiBpc011bHRpQ2VsbCkKKyAgICB7CisgICAgICAgIE1hcFR5cGU8SW50ZWdlciwgSW50ZWdlcj4gdHlwZSA9IE1hcFR5cGUuZ2V0SW5zdGFuY2UoSW50MzJUeXBlLmluc3RhbmNlLCBJbnQzMlR5cGUuaW5zdGFuY2UsIGlzTXVsdGlDZWxsKTsKKyAgICAgICAgQWJzdHJhY3RUeXBlPEludGVnZXI+IG5hbWVUeXBlID0gdHlwZS5uYW1lQ29tcGFyYXRvcigpOworICAgICAgICBNYXBTZXJpYWxpemVyPEludGVnZXIsIEludGVnZXI+IHNlcmlhbGl6ZXIgPSB0eXBlLmdldFNlcmlhbGl6ZXIoKTsKKworICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gbmV3IEhhc2hNYXA8Pig0KTsKKyAgICAgICAgbWFwLnB1dCgxLCAxMCk7CisgICAgICAgIG1hcC5wdXQoMywgMzApOworICAgICAgICBtYXAucHV0KDQsIDQwKTsKKyAgICAgICAgbWFwLnB1dCg2LCA2MCk7CisgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSB0eXBlLmRlY29tcG9zZShtYXApOworCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgc2VyaWFsaXplci5nZXRJbmRleEZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzZXJpYWxpemVyLmdldEluZGV4RnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBzZXJpYWxpemVyLmdldEluZGV4RnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlcmlhbGl6ZXIuZ2V0SW5kZXhGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDMpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgc2VyaWFsaXplci5nZXRJbmRleEZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgc2VyaWFsaXplci5nZXRJbmRleEZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBzZXJpYWxpemVyLmdldEluZGV4RnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg2KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBzZXJpYWxpemVyLmdldEluZGV4RnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg3KSwgbmFtZVR5cGUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkKDAsIEludGVnZXIuTUFYX1ZBTFVFKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgVU5TRVRfQllURV9CVUZGRVIsIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMyksIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigyLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMywgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg1KSwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDMsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNiksIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAwKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDcpLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAwKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMSksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDEpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUuZGVjb21wb3NlKDIpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAyKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlLmRlY29tcG9zZSgzKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMyksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZS5kZWNvbXBvc2UoNCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDMpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUuZGVjb21wb3NlKDUpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlLmRlY29tcG9zZSg2KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZS5kZWNvbXBvc2UoNyksIG5hbWVUeXBlKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDEpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMiksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUuZGVjb21wb3NlKDMpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZS5kZWNvbXBvc2UoNCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDMpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlLmRlY29tcG9zZSg1KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUuZGVjb21wb3NlKDYpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZS5kZWNvbXBvc2UoNyksIG5hbWVUeXBlKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDEpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMiksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUuZGVjb21wb3NlKDMpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDMpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlLmRlY29tcG9zZSg1KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUuZGVjb21wb3NlKDYpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNyksIG5hbWVUeXBlKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgMSksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigxLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDIpLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDEpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgMiksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUuZGVjb21wb3NlKDMpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigxLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDIpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDMpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlLmRlY29tcG9zZSg1KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUuZGVjb21wb3NlKDYpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigxLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDIpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNyksIG5hbWVUeXBlKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDEpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgMiksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgzKSwgbmFtZVR5cGUuZGVjb21wb3NlKDMpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigyLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDMsIDMpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNSksIG5hbWVUeXBlLmRlY29tcG9zZSg1KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMywgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg2KSwgbmFtZVR5cGUuZGVjb21wb3NlKDYpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAwKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDcpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNyksIG5hbWVUeXBlKSk7CisKKyAgICAgICAgLy8gaW50ZXJ2YWwgd2l0aCBsb3dlciBib3VuZCBncmVhdGVyIHRoYW4gdXBwZXIgYm91bmQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg3KSwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9TZXRTZXJpYWxpemVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcmlhbGl6ZXJzL1NldFNlcmlhbGl6ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1MjJlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJpYWxpemVycy9TZXRTZXJpYWxpemVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LlJhbmdlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5TZXRUeXBlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWwuVU5TRVRfQllURV9CVUZGRVI7CisKK3B1YmxpYyBjbGFzcyBTZXRTZXJpYWxpemVyVGVzdAoreworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEluZGV4RnJvbVNlcmlhbGl6ZWQoKQorICAgIHsKKyAgICAgICAgdGVzdEdldEluZGV4RnJvbVNlcmlhbGl6ZWQodHJ1ZSk7CisgICAgICAgIHRlc3RHZXRJbmRleEZyb21TZXJpYWxpemVkKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RHZXRJbmRleEZyb21TZXJpYWxpemVkKGJvb2xlYW4gaXNNdWx0aUNlbGwpCisgICAgeworICAgICAgICBTZXRUeXBlPEludGVnZXI+IHR5cGUgPSBTZXRUeXBlLmdldEluc3RhbmNlKEludDMyVHlwZS5pbnN0YW5jZSwgaXNNdWx0aUNlbGwpOworICAgICAgICBBYnN0cmFjdFR5cGU8SW50ZWdlcj4gbmFtZVR5cGUgPSB0eXBlLm5hbWVDb21wYXJhdG9yKCk7CisgICAgICAgIFNldFNlcmlhbGl6ZXI8SW50ZWdlcj4gc2VyaWFsaXplciA9IHR5cGUuZ2V0U2VyaWFsaXplcigpOworCisgICAgICAgIFNldDxJbnRlZ2VyPiBzZXQgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoMSwgMywgNCwgNikpOworICAgICAgICBCeXRlQnVmZmVyIGJiID0gdHlwZS5kZWNvbXBvc2Uoc2V0KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHNlcmlhbGl6ZXIuZ2V0SW5kZXhGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc2VyaWFsaXplci5nZXRJbmRleEZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgc2VyaWFsaXplci5nZXRJbmRleEZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzZXJpYWxpemVyLmdldEluZGV4RnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgzKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHNlcmlhbGl6ZXIuZ2V0SW5kZXhGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHNlcmlhbGl6ZXIuZ2V0SW5kZXhGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDUpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgc2VyaWFsaXplci5nZXRJbmRleEZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNiksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgc2VyaWFsaXplci5nZXRJbmRleEZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNyksIG5hbWVUeXBlKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZCgwLCBJbnRlZ2VyLk1BWF9WQUxVRSksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIFVOU0VUX0JZVEVfQlVGRkVSLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigxLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDMpLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMiwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg0KSwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDMsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNSksIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigzLCA0KSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDYpLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg3KSwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDEpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMiksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZS5kZWNvbXBvc2UoMyksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDMpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgVU5TRVRfQllURV9CVUZGRVIsIG5hbWVUeXBlLmRlY29tcG9zZSg1KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIFVOU0VUX0JZVEVfQlVGRkVSLCBuYW1lVHlwZS5kZWNvbXBvc2UoNiksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBVTlNFVF9CWVRFX0JVRkZFUiwgbmFtZVR5cGUuZGVjb21wb3NlKDcpLCBuYW1lVHlwZSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDApLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMSksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDIpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlLmRlY29tcG9zZSgzKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMyksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDApLCBuYW1lVHlwZS5kZWNvbXBvc2UoNSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlLmRlY29tcG9zZSg2KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUuZGVjb21wb3NlKDcpLCBuYW1lVHlwZSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDApLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMSksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDIpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlLmRlY29tcG9zZSgzKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMyksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigwLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMSksIG5hbWVUeXBlLmRlY29tcG9zZSg2KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUuZGVjb21wb3NlKDcpLCBuYW1lVHlwZSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDEpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgMSksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigxLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDIpLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDIpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlLmRlY29tcG9zZSgzKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgMyksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigxLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDIpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlLmRlY29tcG9zZSg2KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMSwgNCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgyKSwgbmFtZVR5cGUuZGVjb21wb3NlKDcpLCBuYW1lVHlwZSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDApLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMCksIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMSksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSgxKSwgbmFtZVR5cGUuZGVjb21wb3NlKDEpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigxLCAxKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDIpLCBuYW1lVHlwZS5kZWNvbXBvc2UoMiksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDEsIDIpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoMyksIG5hbWVUeXBlLmRlY29tcG9zZSgzKSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMiwgMyksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg0KSwgbmFtZVR5cGUuZGVjb21wb3NlKDQpLCBuYW1lVHlwZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmFuZ2UuY2xvc2VkT3BlbigzLCAzKSwgc2VyaWFsaXplci5nZXRJbmRleGVzUmFuZ2VGcm9tU2VyaWFsaXplZChiYiwgbmFtZVR5cGUuZGVjb21wb3NlKDUpLCBuYW1lVHlwZS5kZWNvbXBvc2UoNSksIG5hbWVUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDMsIDQpLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNiksIG5hbWVUeXBlLmRlY29tcG9zZSg2KSwgbmFtZVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJhbmdlLmNsb3NlZE9wZW4oMCwgMCksIHNlcmlhbGl6ZXIuZ2V0SW5kZXhlc1JhbmdlRnJvbVNlcmlhbGl6ZWQoYmIsIG5hbWVUeXBlLmRlY29tcG9zZSg3KSwgbmFtZVR5cGUuZGVjb21wb3NlKDcpLCBuYW1lVHlwZSkpOworCisgICAgICAgIC8vIGludGVydmFsIHdpdGggbG93ZXIgYm91bmQgZ3JlYXRlciB0aGFuIHVwcGVyIGJvdW5kCisgICAgICAgIGFzc2VydEVxdWFscyhSYW5nZS5jbG9zZWRPcGVuKDAsIDApLCBzZXJpYWxpemVyLmdldEluZGV4ZXNSYW5nZUZyb21TZXJpYWxpemVkKGJiLCBuYW1lVHlwZS5kZWNvbXBvc2UoNyksIG5hbWVUeXBlLmRlY29tcG9zZSgwKSwgbmFtZVR5cGUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9BYnN0cmFjdEZpbGVzeXN0ZW1Pd25lcnNoaXBDaGVja1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0Fic3RyYWN0RmlsZXN5c3RlbU93bmVyc2hpcENoZWNrVGVzdC5qYXZhCmluZGV4IDBmYzg1NTkuLmNhZTdkZTAgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0Fic3RyYWN0RmlsZXN5c3RlbU93bmVyc2hpcENoZWNrVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0Fic3RyYWN0RmlsZXN5c3RlbU93bmVyc2hpcENoZWNrVGVzdC5qYXZhCkBAIC0zNiw2ICszNiw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5TdGFydHVwQ2hlY2tzT3B0aW9uczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5TdGFydHVwRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIApAQCAtNjYsMTEgKzY3LDE0IEBACiAKICAgICBwcm90ZWN0ZWQgU3RhcnR1cENoZWNrc09wdGlvbnMgb3B0aW9ucyA9IG5ldyBTdGFydHVwQ2hlY2tzT3B0aW9ucygpOwogCisgICAgc3RhdGljIFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cCgpCiAgICAgewogICAgICAgICBjbGVhblRlbXBEaXIoKTsKICAgICAgICAgdGVtcERpciA9IG5ldyBGaWxlKGNvbS5nb29nbGUuY29tbW9uLmlvLkZpbGVzLmNyZWF0ZVRlbXBEaXIoKSk7CiAgICAgICAgIHRva2VuID0gbWFrZVJhbmRvbVN0cmluZygxMCk7CisgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKTsKICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkZJTEVfU1lTVEVNX0NIRUNLX09XTkVSU0hJUF9GSUxFTkFNRS5nZXRLZXkoKSk7CiAgICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GSUxFX1NZU1RFTV9DSEVDS19PV05FUlNISVBfVE9LRU4uZ2V0S2V5KCkpOwogICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eShDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRklMRV9TWVNURU1fQ0hFQ0tfRU5BQkxFLmdldEtleSgpKTsKQEAgLTE4OCw2ICsxOTIsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlYXJkb3duKCkgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogICAgICAgICBjbGVhblRlbXBEaXIoKTsKKyAgICAgICAgcHJvcGVydGllcy5jbG9zZSgpOwogICAgIH0KIAogICAgIC8vIHRlc3RzIGZvciBlbmFibGluZy9kaXNhYmxpbmcvY29uZmlndXJpbmcgdGhlIGNoZWNrCkBAIC0yMDUsMTQgKzIxMCwxNCBAQAogICAgIHsKICAgICAgICAgLy8gbm8gZXhjZXB0aW9ucyB0aHJvd24gZnJvbSB0aGUgc3VwcGxpZXIgYmVjYXVzZSB0aGUgY2hlY2sgaXMgc2tpcHBlZAogICAgICAgICBvcHRpb25zLmVuYWJsZShjaGVja19maWxlc3lzdGVtX293bmVyc2hpcCk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRklMRV9TWVNURU1fQ0hFQ0tfRU5BQkxFLmdldEtleSgpLCAiZmFsc2UiKTsKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkZJTEVfU1lTVEVNX0NIRUNLX0VOQUJMRS5zZXRCb29sZWFuKGZhbHNlKTsKICAgICAgICAgQWJzdHJhY3RGaWxlc3lzdGVtT3duZXJzaGlwQ2hlY2tUZXN0LmNoZWNrZXIoKCkgLT4geyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRkFJTCIpOyB9KS5leGVjdXRlKG9wdGlvbnMpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgY2hlY2tFbmFibGVkQnV0Q2x1c3RlclByb3BlcnR5SXNFbXB0eSgpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkZJTEVfU1lTVEVNX0NIRUNLX09XTkVSU0hJUF9UT0tFTi5nZXRLZXkoKSwgIiIpOworICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRklMRV9TWVNURU1fQ0hFQ0tfT1dORVJTSElQX1RPS0VOLnNldFN0cmluZygiIik7CiAgICAgICAgIEFic3RyYWN0RmlsZXN5c3RlbU93bmVyc2hpcENoZWNrVGVzdC5leGVjdXRlQW5kRmFpbChBYnN0cmFjdEZpbGVzeXN0ZW1Pd25lcnNoaXBDaGVja1Rlc3QuY2hlY2tlcih0ZW1wRGlyKSwgb3B0aW9ucywgTUlTU0lOR19QUk9QRVJUWSwgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkZJTEVfU1lTVEVNX0NIRUNLX09XTkVSU0hJUF9UT0tFTi5nZXRLZXkoKSk7CiAgICAgfQogCkBAIC0yMjAsNyArMjI1LDcgQEAKICAgICBwdWJsaWMgdm9pZCBjaGVja0VuYWJsZWRCdXRDbHVzdGVyUHJvcGVydHlJc1Vuc2V0KCkKICAgICB7CiAgICAgICAgIEFzc3VtZS5hc3N1bWVGYWxzZShvcHRpb25zLmdldENvbmZpZyhjaGVja19maWxlc3lzdGVtX293bmVyc2hpcCkuY29udGFpbnNLZXkoIm93bmVyc2hpcF90b2tlbiIpKTsKLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkZJTEVfU1lTVEVNX0NIRUNLX09XTkVSU0hJUF9UT0tFTi5nZXRLZXkoKSk7CisgICAgICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GSUxFX1NZU1RFTV9DSEVDS19PV05FUlNISVBfVE9LRU4uY2xlYXJWYWx1ZSgpOyAvLyBjaGVja3N0eWxlOiBzdXBwcmVzcyBuZWFyYnkgJ2NsZWFyVmFsdWVTeXN0ZW1Qcm9wZXJ0eVVzYWdlJwogICAgICAgICBBYnN0cmFjdEZpbGVzeXN0ZW1Pd25lcnNoaXBDaGVja1Rlc3QuZXhlY3V0ZUFuZEZhaWwoQWJzdHJhY3RGaWxlc3lzdGVtT3duZXJzaGlwQ2hlY2tUZXN0LmNoZWNrZXIodGVtcERpciksIG9wdGlvbnMsIE1JU1NJTkdfUFJPUEVSVFksIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GSUxFX1NZU1RFTV9DSEVDS19PV05FUlNISVBfVE9LRU4uZ2V0S2V5KCkpOwogICAgIH0KIApAQCAtMzU2LDcgKzM2MSw3IEBACiAgICAgICAgIEZpbGUgbGVhZkRpciA9IEFic3RyYWN0RmlsZXN5c3RlbU93bmVyc2hpcENoZWNrVGVzdC5ta2RpcnModGVtcERpciwgImNhc3NhbmRyYS9kYXRhIik7CiAgICAgICAgIHdyaXRlRmlsZShsZWFmRGlyLnBhcmVudCgpLCAib3RoZXJfZmlsZSIsIEFic3RyYWN0RmlsZXN5c3RlbU93bmVyc2hpcENoZWNrVGVzdC5tYWtlUHJvcGVydGllcygxLCAxLCB0b2tlbikpOwogICAgICAgICBBYnN0cmFjdEZpbGVzeXN0ZW1Pd25lcnNoaXBDaGVja1Rlc3QuZXhlY3V0ZUFuZEZhaWwoQWJzdHJhY3RGaWxlc3lzdGVtT3duZXJzaGlwQ2hlY2tUZXN0LmNoZWNrZXIobGVhZkRpciksIG9wdGlvbnMsIE5PX09XTkVSU0hJUF9GSUxFLCBxdW90ZShsZWFmRGlyLmFic29sdXRlUGF0aCgpKSk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRklMRV9TWVNURU1fQ0hFQ0tfT1dORVJTSElQX0ZJTEVOQU1FLmdldEtleSgpLCAib3RoZXJfZmlsZSIpOworICAgICAgICBDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRklMRV9TWVNURU1fQ0hFQ0tfT1dORVJTSElQX0ZJTEVOQU1FLnNldFN0cmluZygib3RoZXJfZmlsZSIpOwogICAgICAgICBBYnN0cmFjdEZpbGVzeXN0ZW1Pd25lcnNoaXBDaGVja1Rlc3QuY2hlY2tlcihsZWFmRGlyKS5leGVjdXRlKG9wdGlvbnMpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQWN0aXZlUmVwYWlyU2VydmljZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0FjdGl2ZVJlcGFpclNlcnZpY2VUZXN0LmphdmEKaW5kZXggOWMxNjYwYS4uOTNmZDlmMiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQWN0aXZlUmVwYWlyU2VydmljZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9BY3RpdmVSZXBhaXJTZXJ2aWNlVGVzdC5qYXZhCkBAIC03OSw2ICs3OSw3IEBACiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBwdWJsaWMgY2xhc3MgQWN0aXZlUmVwYWlyU2VydmljZVRlc3QKIHsKQEAgLTQ2OSw2ICs0NzAsMzkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGFpclNlc3Npb25TcGFjZUluTWlCKCkKKyAgICB7CisgICAgICAgIEFjdGl2ZVJlcGFpclNlcnZpY2UgYWN0aXZlUmVwYWlyU2VydmljZSA9IEFjdGl2ZVJlcGFpclNlcnZpY2UuaW5zdGFuY2U7CisgICAgICAgIGludCBwcmV2aW91c1NpemUgPSBhY3RpdmVSZXBhaXJTZXJ2aWNlLmdldFJlcGFpclNlc3Npb25TcGFjZUluTWlCKCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKChSdW50aW1lLmdldFJ1bnRpbWUoKS5tYXhNZW1vcnkoKSAvICgxMDI0ICogMTAyNCkgLyAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVJlcGFpclNlcnZpY2UuZ2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUIoKSk7CisKKyAgICAgICAgICAgIGludCB0YXJnZXRTaXplID0gKGludCkgKFJ1bnRpbWUuZ2V0UnVudGltZSgpLm1heE1lbW9yeSgpIC8gKDEwMjQgKiAxMDI0KSAvIDQpICsgMTsKKworICAgICAgICAgICAgYWN0aXZlUmVwYWlyU2VydmljZS5zZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQih0YXJnZXRTaXplKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModGFyZ2V0U2l6ZSwgYWN0aXZlUmVwYWlyU2VydmljZS5nZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQigpKTsKKworICAgICAgICAgICAgYWN0aXZlUmVwYWlyU2VydmljZS5zZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQigxMCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwLCBhY3RpdmVSZXBhaXJTZXJ2aWNlLmdldFJlcGFpclNlc3Npb25TcGFjZUluTWlCKCkpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVSZXBhaXJTZXJ2aWNlLnNldFJlcGFpclNlc3Npb25TcGFjZUluTWlCKDApOworICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHJlY2VpdmVkIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBmb3IgZGVwdGggb2YgMCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmVkKSB7IH0KKworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMCwgYWN0aXZlUmVwYWlyU2VydmljZS5nZXRSZXBhaXJTZXNzaW9uU3BhY2VJbk1pQigpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIGFjdGl2ZVJlcGFpclNlcnZpY2Uuc2V0UmVwYWlyU2Vzc2lvblNwYWNlSW5NaUIocHJldmlvdXNTaXplKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRhc2sgaW1wbGVtZW50cyBSdW5uYWJsZQogICAgIHsKICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb25kaXRpb24gYmxvY2tlZDsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL0NsaWVudFN0YXRlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2xpZW50U3RhdGVUZXN0LmphdmEKaW5kZXggNTZkMDg5My4uMDRiZGRiNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2xpZW50U3RhdGVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvQ2xpZW50U3RhdGVUZXN0LmphdmEKQEAgLTM2LDE5ICszNiwyMyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmF1dGguUGVybWlzc2lvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5hdXRoLlJvbGVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5LZXlzcGFjZVBhcmFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuT1JHX0FQQUNIRV9DQVNTQU5EUkFfRElTQUJMRV9NQkVBTl9SRUdJU1RSQVRJT047CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIHB1YmxpYyBjbGFzcyBDbGllbnRTdGF0ZVRlc3QKIHsKKyAgICBzdGF0aWMgV2l0aFByb3BlcnRpZXMgcHJvcGVydGllczsKKwogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc2FibGVfbWJlYW5fcmVnaXN0cmF0aW9uIiwgInRydWUiKTsKKyAgICAgICAgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChPUkdfQVBBQ0hFX0NBU1NBTkRSQV9ESVNBQkxFX01CRUFOX1JFR0lTVFJBVElPTiwgdHJ1ZSk7CiAgICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXRBdXRoRnJvbVJvb3QodHJ1ZSk7CiAgICAgICAgIC8vIGNyZWF0ZSB0aGUgc3lzdGVtX2F1dGgga2V5c3BhY2Ugc28gdGhlIElSb2xlTWFuYWdlciBjYW4gZnVuY3Rpb24gYXMgbm9ybWFsCkBAIC02Miw3ICs2Niw3IEBACiAgICAgQEFmdGVyQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWZ0ZXJDbGFzcygpCiAgICAgewotICAgICAgICBTeXN0ZW0uY2xlYXJQcm9wZXJ0eSgib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzYWJsZV9tYmVhbl9yZWdpc3RyYXRpb24iKTsKKyAgICAgICAgcHJvcGVydGllcy5jbG9zZSgpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9QYXJ0aXRpb25EZW55bGlzdFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1BhcnRpdGlvbkRlbnlsaXN0VGVzdC5qYXZhCmluZGV4IGVkNTE1MTguLjRhOTNjNjcgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1BhcnRpdGlvbkRlbnlsaXN0VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1BhcnRpdGlvbkRlbnlsaXN0VGVzdC5qYXZhCkBAIC0yMyw2ICsyMyw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5VbnR5cGVkUmVzdWx0U2V0OwpAQCAtNDQsNiArNDUsOCBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkKICAgICB7CisgICAgICAgIFNlcnZlclRlc3RVdGlscy5kYWVtb25Jbml0aWFsaXphdGlvbigpOworCiAgICAgICAgIENRTFRlc3Rlci5wcmVwYXJlU2VydmVyKCk7CiAKICAgICAgICAgS2V5c3BhY2VNZXRhZGF0YSBzY2hlbWEgPSBLZXlzcGFjZU1ldGFkYXRhLmNyZWF0ZShrc19jcWwsCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TU1RhYmxlc0dsb2JhbFRyYWNrZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TU1RhYmxlc0dsb2JhbFRyYWNrZXJUZXN0LmphdmEKaW5kZXggNTU0NWQ5My4uNmJkNWZkMiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU1NUYWJsZXNHbG9iYWxUcmFja2VyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1NTVGFibGVzR2xvYmFsVHJhY2tlclRlc3QuamF2YQpAQCAtMjUsMTIgKzI1LDE1IEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBjb20uZ29vZ2xlY29kZS5jb25jdXJyZW50dHJlZXMuY29tbW9uLkl0ZXJhYmxlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNlcXVlbmNlQmFzZWRTU1RhYmxlSWQ7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uQW5kVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5WZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLnV0aWwuRmlsZXM7CiBpbXBvcnQgb3JnLnF1aWNrdGhlb3JpZXMuY29yZS5HZW47CkBAIC00Nyw2ICs1MCwxMiBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfVkVSU0lPTl9MSVNUX1NJWkUgPSAxMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1VQREFURVNfUEVSX0dFTiA9IDEwMDsKIAorICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmVDbGFzcygpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuY2xpZW50SW5pdGlhbGl6YXRpb24oKTsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBFbnN1cmVzIHRoYXQgdGhlIHRyYWNrZXIgcHJvcGVybHkgbWFpbnRhaW5zIHRoZSBzZXQgb2YgdmVyc2lvbnMgaW4gdXNlLgogICAgICAqCkBAIC01OSwxNSArNjgsMTUgQEAKICAgICB7CiAgICAgICAgIHF0KCkuZm9yQWxsKGxpc3RzKCkub2YodXBkYXRlcygpKS5vZlNpemVCZXR3ZWVuKDAsIE1BWF9VUERBVEVTX1BFUl9HRU4pLAogICAgICAgICAgICAgICAgICAgICBzc3RhYmxlRm9ybWF0VHlwZXMoKSkKLSAgICAgICAgICAgIC5jaGVja0Fzc2VydCgodXBkYXRlcywgZm9ybWF0VHlwZSkgLT4gewotICAgICAgICAgICAgICAgIFNTVGFibGVzR2xvYmFsVHJhY2tlciB0cmFja2VyID0gbmV3IFNTVGFibGVzR2xvYmFsVHJhY2tlcihmb3JtYXRUeXBlKTsKKyAgICAgICAgICAgIC5jaGVja0Fzc2VydCgodXBkYXRlcywgZm9ybWF0KSAtPiB7CisgICAgICAgICAgICAgICAgU1NUYWJsZXNHbG9iYWxUcmFja2VyIHRyYWNrZXIgPSBuZXcgU1NUYWJsZXNHbG9iYWxUcmFja2VyKGZvcm1hdCk7CiAgICAgICAgICAgICAgICAgU2V0PERlc2NyaXB0b3I+IGFsbCA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgICAgICAgICBTZXQ8VmVyc2lvbkFuZFR5cGU+IHByZXZpb3VzID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgICAgICAgICBTZXQ8VmVyc2lvbj4gcHJldmlvdXMgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwogICAgICAgICAgICAgICAgIGZvciAoVXBkYXRlIHVwZGF0ZSA6IHVwZGF0ZXMpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICB1cGRhdGUuYXBwbHlUbyhhbGwpOwogICAgICAgICAgICAgICAgICAgICBib29sZWFuIHRyaWdnZXJVcGRhdGUgPSB0cmFja2VyLmhhbmRsZVNTVGFibGVzQ2hhbmdlKHVwZGF0ZS5yZW1vdmVkLCB1cGRhdGUuYWRkZWQpOwotICAgICAgICAgICAgICAgICAgICBTZXQ8VmVyc2lvbkFuZFR5cGU+IGV4cGVjdGVkSW5Vc2UgPSB2ZXJzaW9uQW5kVHlwZXMoYWxsKTsKKyAgICAgICAgICAgICAgICAgICAgU2V0PFZlcnNpb24+IGV4cGVjdGVkSW5Vc2UgPSB2ZXJzaW9uQW5kVHlwZXMoYWxsKTsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkSW5Vc2UsIHRyYWNrZXIudmVyc2lvbnNJblVzZSgpKTsKICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCFleHBlY3RlZEluVXNlLmVxdWFscyhwcmV2aW91cyksIHRyaWdnZXJVcGRhdGUpOwogICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGV4cGVjdGVkSW5Vc2U7CkBAIC03NSw5ICs4NCw5IEBACiAgICAgICAgICAgICB9KTsKICAgICB9CiAKLSAgICBwcml2YXRlIFNldDxWZXJzaW9uQW5kVHlwZT4gdmVyc2lvbkFuZFR5cGVzKFNldDxEZXNjcmlwdG9yPiBkZXNjcmlwdG9ycykKKyAgICBwcml2YXRlIFNldDxWZXJzaW9uPiB2ZXJzaW9uQW5kVHlwZXMoU2V0PERlc2NyaXB0b3I+IGRlc2NyaXB0b3JzKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JzLnN0cmVhbSgpLm1hcChTU1RhYmxlc0dsb2JhbFRyYWNrZXI6OnZlcnNpb24pLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JzLnN0cmVhbSgpLm1hcChkIC0+IGQudmVyc2lvbikuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgR2VuPFN0cmluZz4ga2V5c3BhY2VzKCkKQEAgLTEwOSwxNiArMTE4LDE2IEBACiAgICAgICAgIHJldHVybiBsaXN0cygpLm9mKGRlc2NyaXB0b3JzKCkpLm9mU2l6ZUJldHdlZW4obWluU2l6ZSwgTUFYX1ZFUlNJT05fTElTVF9TSVpFKTsKICAgICB9CiAKLSAgICBwcml2YXRlIEdlbjxTU1RhYmxlRm9ybWF0LlR5cGU+IHNzdGFibGVGb3JtYXRUeXBlcygpCisgICAgcHJpdmF0ZSBHZW48U1NUYWJsZUZvcm1hdDw/LCA/Pj4gc3N0YWJsZUZvcm1hdFR5cGVzKCkKICAgICB7Ci0gICAgICAgIHJldHVybiBHZW5lcmF0ZS5lbnVtVmFsdWVzKFNTVGFibGVGb3JtYXQuVHlwZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBHZW5lcmF0ZS5waWNrKEl0ZXJhYmxlcy50b0xpc3QoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNTVGFibGVGb3JtYXRzKCkudmFsdWVzKCkpKTsKICAgICB9CiAKICAgICBwcml2YXRlIEdlbjxTdHJpbmc+IHNzdGFibGVWZXJzaW9uU3RyaW5nKCkKICAgICB7CiAgICAgICAgIC8vIFdlIHdhbnQgdG8gc29tZXdoYXQgZmF2b3IgdGhlIGN1cnJlbnQgdmVyc2lvbiwgYXMgdGhhdCBpcyB0ZWNobmljYWxseSBtb3JlIHJlYWxpc3RpYyBzbyB3ZSBnZW5lcmF0ZSBpdCA1MCUKICAgICAgICAgLy8gb2YgdGhlIHRpbWUsIGFuZCBnZW5lcmF0ZSBzb21ldGhpbmcgcmFuZG9tIDUwJSBvZiB0aGUgdGltZS4KLSAgICAgICAgcmV0dXJuIEdlbmVyYXRlLmNvbnN0YW50KFNTVGFibGVGb3JtYXQuVHlwZS5jdXJyZW50KCkuaW5mby5nZXRMYXRlc3RWZXJzaW9uKCkuZ2V0VmVyc2lvbigpKQorICAgICAgICByZXR1cm4gR2VuZXJhdGUuY29uc3RhbnQoRGF0YWJhc2VEZXNjcmlwdG9yLmdldFNlbGVjdGVkU1NUYWJsZUZvcm1hdCgpLmdldExhdGVzdFZlcnNpb24oKS52ZXJzaW9uKQogICAgICAgICAgICAgICAgICAgICAgICAubWl4KHN0cmluZ3MoKS5iZXR3ZWVuQ29kZVBvaW50cygnYScsICd6Jykub2ZMZW5ndGgoMikpOwogICAgIH0KIApAQCAtMTU3LDQgKzE2Niw0IEBACiAgICAgICAgICAgICAgICAgICAgJ30nOwogICAgICAgICB9CiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0YXJ0dXBDaGVja3NUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdGFydHVwQ2hlY2tzVGVzdC5qYXZhCmluZGV4IDcyZjg4MDQuLjY1MDJlN2QgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0YXJ0dXBDaGVja3NUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RhcnR1cENoZWNrc1Rlc3QuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkNsb2NrOwogCiBpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfSU5WQUxJRF9MRUdBQ1lfU1NUQUJMRV9ST09UOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlscy5jcmVhdGVUZW1wRmlsZTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5EYXRhUmVzdXJyZWN0aW9uQ2hlY2suSEVBUlRCRUFUX0ZJTEVfQ09ORklHX1BST1BFUlRZOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLlN0YXJ0dXBDaGVja3MuU3RhcnR1cENoZWNrVHlwZS5jaGVja19kYXRhX3Jlc3VycmVjdGlvbjsKQEAgLTQ2LDcgKzQ3LDYgQEAKIAogcHVibGljIGNsYXNzIFN0YXJ0dXBDaGVja3NUZXN0CiB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WQUxJRF9MRUdBQ1lfU1NUQUJMRV9ST09UX1BST1AgPSAiaW52YWxpZC1sZWdhY3ktc3N0YWJsZS1yb290IjsKICAgICBTdGFydHVwQ2hlY2tzIHN0YXJ0dXBDaGVja3M7CiAgICAgUGF0aCBzc3RhYmxlRGlyOwogICAgIHN0YXRpYyBGaWxlIGhlYXJ0YmVhdEZpbGU7CkBAIC0xMTIsNiArMTEyLDE0IEBACiAgICAgICAgIEZpbGVzLmNyZWF0ZURpcmVjdG9yaWVzKGJhY2t1cERpcik7CiAgICAgICAgIGNvcHlJbnZhbGlkTGVnYWN5U1NUYWJsZXMoYmFja3VwRGlyKTsKICAgICAgICAgc3RhcnR1cENoZWNrcy52ZXJpZnkob3B0aW9ucyk7CisKKyAgICAgICAgLy8gYW5kIGluIHRoZSBzeXN0ZW0gZGlyZWN0b3J5IGFzIG9mIENBU1NBTkRSQS0xNzc3NworICAgICAgICBuZXcgRmlsZShiYWNrdXBEaXIpLmRlbGV0ZVJlY3Vyc2l2ZSgpOworICAgICAgICBGaWxlIGRhdGFEaXIgPSBuZXcgRmlsZShEYXRhYmFzZURlc2NyaXB0b3IuZ2V0QWxsRGF0YUZpbGVMb2NhdGlvbnMoKVswXSk7CisgICAgICAgIFBhdGggc3lzdGVtRGlyID0gUGF0aHMuZ2V0KGRhdGFEaXIuYWJzb2x1dGVQYXRoKCksICJzeXN0ZW0iLCAiSW52YWxpZFN5c3RlbURpcmVjdG9yeSIpOworICAgICAgICBGaWxlcy5jcmVhdGVEaXJlY3RvcmllcyhzeXN0ZW1EaXIpOworICAgICAgICBjb3B5SW52YWxpZExlZ2FjeVNTVGFibGVzKHN5c3RlbURpcik7CisgICAgICAgIHN0YXJ0dXBDaGVja3MudmVyaWZ5KG9wdGlvbnMpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNjAsOSArMTY4LDkgQEAKICAgICBwcml2YXRlIHZvaWQgY29weUxlZ2FjeU5vblNTVGFibGVGaWxlcyhQYXRoIHRhcmdldERpcikgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewogCi0gICAgICAgIFBhdGggbGVnYWN5U1NUYWJsZVJvb3QgPSBQYXRocy5nZXQoU3lzdGVtLmdldFByb3BlcnR5KElOVkFMSURfTEVHQUNZX1NTVEFCTEVfUk9PVF9QUk9QKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXlzcGFjZTEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YW5kYXJkMSIpOworICAgICAgICBQYXRoIGxlZ2FjeVNTVGFibGVSb290ID0gUGF0aHMuZ2V0KFRFU1RfSU5WQUxJRF9MRUdBQ1lfU1NUQUJMRV9ST09ULmdldFN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXlzcGFjZTEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFuZGFyZDEiKTsKICAgICAgICAgZm9yIChTdHJpbmcgZmlsZW5hbWUgOiBuZXcgU3RyaW5nW117IktleXNwYWNlMS1TdGFuZGFyZDEtaWMtMC1UT0MudHh0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleXNwYWNlMS1TdGFuZGFyZDEtaWMtMC1EaWdlc3Quc2hhMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZWdhY3lsZXZlbGVkLmpzb24ifSkKQEAgLTE5OCw5ICsyMDYsOSBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGNvcHlJbnZhbGlkTGVnYWN5U1NUYWJsZXMoUGF0aCB0YXJnZXREaXIpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgRmlsZSBsZWdhY3lTU1RhYmxlUm9vdCA9IG5ldyBGaWxlKFBhdGhzLmdldChTeXN0ZW0uZ2V0UHJvcGVydHkoSU5WQUxJRF9MRUdBQ1lfU1NUQUJMRV9ST09UX1BST1ApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLZXlzcGFjZTEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFuZGFyZDEiKSk7CisgICAgICAgIEZpbGUgbGVnYWN5U1NUYWJsZVJvb3QgPSBuZXcgRmlsZShQYXRocy5nZXQoVEVTVF9JTlZBTElEX0xFR0FDWV9TU1RBQkxFX1JPT1QuZ2V0U3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleXNwYWNlMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YW5kYXJkMSIpKTsKICAgICAgICAgZm9yIChGaWxlIGYgOiBsZWdhY3lTU1RhYmxlUm9vdC50cnlMaXN0KCkpCiAgICAgICAgICAgICBGaWxlcy5jb3B5KGYudG9QYXRoKCksIHRhcmdldERpci5yZXNvbHZlKGYubmFtZSgpKSk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlRHJhaW5UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZURyYWluVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZGEwOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZURyYWluVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2U7CisKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUm93VXBkYXRlQnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uQ29tcGFjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuQnl0ZXNUb2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0VGhyb3duQnk7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIFN0b3JhZ2VTZXJ2aWNlRHJhaW5UZXN0Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNQQUNFID0gImtleXNwYWNlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEUgPSAidGFibGUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU4gPSAiY29sdW1uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUk9XUyA9IDEwMDA7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFRyYW5zaWVudFJlcGxpY2F0aW9uRW5hYmxlZFVuc2FmZSh0cnVlKTsKKworICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RhcnQoKTsKKworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5kaXNhYmxlQXV0b0NvbXBhY3Rpb24oKTsKKworICAgICAgICBTY2hlbWFMb2FkZXIucHJlcGFyZVNlcnZlcigpOworICAgICAgICBTY2hlbWFMb2FkZXIuY3JlYXRlS2V5c3BhY2UoS0VZU1BBQ0UsIEtleXNwYWNlUGFyYW1zLnNpbXBsZSgxKSwgU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRChLRVlTUEFDRSwgVEFCTEUpKTsKKworICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZQorICAgICAgICAgICAgICAgIC5nZXRUb2tlbk1ldGFkYXRhKCkKKyAgICAgICAgICAgICAgICAudXBkYXRlTm9ybWFsVG9rZW4obmV3IEJ5dGVzVG9rZW4oKG5ldyBieXRlW117NTB9KSksIEluZXRBZGRyZXNzQW5kUG9ydC5nZXRCeU5hbWUoIjEyNy4wLjAuMSIpKTsKKworICAgICAgICBmaW5hbCBDb2x1bW5GYW1pbHlTdG9yZSB0YWJsZSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldENvbHVtbkZhbWlseVN0b3JlKFRBQkxFKTsKKyAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgUk9XUzsgcm93KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXIgdmFsdWUgPSBCeXRlQnVmZmVyVXRpbC5ieXRlcyhTdHJpbmcudmFsdWVPZihyb3cpKTsKKyAgICAgICAgICAgIG5ldyBSb3dVcGRhdGVCdWlsZGVyKHRhYmxlLm1ldGFkYXRhKCksIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgLmNsdXN0ZXJpbmcoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoQ09MVU1OKSkKKyAgICAgICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICAgICAgICAgICAgIC5hcHBseVVuc2FmZSgpOworICAgICAgICB9CisgICAgICAgIFV0aWwuZmx1c2godGFibGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNTVGFibGVzSW1wb3J0QWJvcnQoKQorICAgIHsKKyAgICAgICAgZmluYWwgQ29sdW1uRmFtaWx5U3RvcmUgdGFibGUgPSBLZXlzcGFjZS5vcGVuKEtFWVNQQUNFKS5nZXRDb2x1bW5GYW1pbHlTdG9yZShUQUJMRSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YWJsZQorICAgICAgICAgICAgICAgIC5pbXBvcnROZXdTU1RhYmxlcyhDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAuaXNFbXB0eSgpKTsKKworICAgICAgICBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmRyYWluKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICB9fSk7CisKKyAgICAgICAgd2hpbGUgKCFTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5pc0RyYWluaW5nKCkpCisgICAgICAgICAgICBUaHJlYWQueWllbGQoKTsKKworICAgICAgICBhc3NlcnRUaGF0VGhyb3duQnkoKCkgLT4gdGFibGUKKyAgICAgICAgICAgICAgICAuaW1wb3J0TmV3U1NUYWJsZXMoQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKQorICAgICAgICAgICAgICAgIC5pc0luc3RhbmNlT2YoUnVudGltZUV4Y2VwdGlvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAuaGFzQ2F1c2VJbnN0YW5jZU9mKEludGVycnVwdGVkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZVNlcnZlck0zUFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlU2VydmVyTTNQVGVzdC5qYXZhCmluZGV4IGJiNzhjODMuLjhjNGFiOWIgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlU2VydmVyTTNQVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlU2VydmVyTTNQVGVzdC5qYXZhCkBAIC0yNiwxMyArMjYsMTMgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21taXRsb2cuQ29tbWl0TG9nOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5nbXMuR29zc2lwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSUVuZHBvaW50U25pdGNoOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuUHJvcGVydHlGaWxlU25pdGNoOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNlcnZlclRlc3RVdGlscy5jbGVhbnVwOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHMubWtkaXJzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLkdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIHB1YmxpYyBjbGFzcyBTdG9yYWdlU2VydmljZVNlcnZlck0zUFRlc3QKQEAgLTQwLDcgKzQwLDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KEdvc3NpcGVyLlByb3BzLkRJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04sICJ0cnVlIik7CisgICAgICAgIEdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RhcnQoKTsKICAgICAgICAgSUVuZHBvaW50U25pdGNoIHNuaXRjaCA9IG5ldyBQcm9wZXJ0eUZpbGVTbml0Y2goKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlU2VydmVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVNlcnZpY2VTZXJ2ZXJUZXN0LmphdmEKaW5kZXggMTE5YjgxMC4uZDRjZjQ1MCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVNlcnZpY2VTZXJ2ZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3RvcmFnZVNlcnZpY2VTZXJ2ZXJUZXN0LmphdmEKQEAgLTQxLDYgKzQxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIuU3RyaW5nVG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5Ub2tlbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5BcHBsaWNhdGlvblN0YXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5Hb3NzaXBlcjsKQEAgLTU1LDYgKzU2LDggQEAKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TZXJ2ZXJUZXN0VXRpbHMuY2xlYW51cDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2VydmVyVGVzdFV0aWxzLm1rZGlyczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5HT1NTSVBfRElTQUJMRV9USFJFQURfVkFMSURBVElPTjsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5SRVBMQUNFX0FERFJFU1M7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKQEAgLTYzLDcgKzY2LDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KEdvc3NpcGVyLlByb3BzLkRJU0FCTEVfVEhSRUFEX1ZBTElEQVRJT04sICJ0cnVlIik7CisgICAgICAgIEdPU1NJUF9ESVNBQkxFX1RIUkVBRF9WQUxJREFUSU9OLnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5kYWVtb25Jbml0aWFsaXphdGlvbigpOwogICAgICAgICBDb21taXRMb2cuaW5zdGFuY2Uuc3RhcnQoKTsKICAgICAgICAgSUVuZHBvaW50U25pdGNoIHNuaXRjaCA9IG5ldyBQcm9wZXJ0eUZpbGVTbml0Y2goKTsKQEAgLTYzMyw3ICs2MzYsNyBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgaXNSZXBsYWNpbmdTYW1lSG9zdEFkZHJlc3NBbmRIb3N0SWRUZXN0KCkgdGhyb3dzIFVua25vd25Ib3N0RXhjZXB0aW9uCiAgICAgewotICAgICAgICB0cnkKKyAgICAgICAgdHJ5IChXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkpCiAgICAgICAgIHsKICAgICAgICAgICAgIFVVSUQgZGlmZmVyZW50SG9zdElkID0gVVVJRC5yYW5kb21VVUlEKCk7CiAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaXNSZXBsYWNpbmdTYW1lSG9zdEFkZHJlc3NBbmRIb3N0SWQoZGlmZmVyZW50SG9zdElkKSk7CkBAIC02NDMsMjAgKzY0NiwxNiBAQAogICAgICAgICAgICAgR29zc2lwZXIuaW5zdGFuY2UuaW5pdGlhbGl6ZU5vZGVVbnNhZmUoRkJVdGlsaXRpZXMuZ2V0QnJvYWRjYXN0QWRkcmVzc0FuZFBvcnQoKSwgbG9jYWxIb3N0SWQsIDEpOwogCiAgICAgICAgICAgICAvLyBDaGVjayBkZXRlY3RzIHJlcGxhY2luZyB0aGUgc2FtZSBob3N0IGFkZHJlc3Mgd2l0aCB0aGUgc2FtZSBob3N0aWQKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnJlcGxhY2VfYWRkcmVzcyIsIGhvc3RBZGRyZXNzKTsKKyAgICAgICAgICAgIFJFUExBQ0VfQUREUkVTUy5zZXRTdHJpbmcoaG9zdEFkZHJlc3MpOwogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaXNSZXBsYWNpbmdTYW1lSG9zdEFkZHJlc3NBbmRIb3N0SWQobG9jYWxIb3N0SWQpKTsKIAogICAgICAgICAgICAgLy8gQ2hlY2sgZGV0ZWN0cyByZXBsYWNpbmcgdGhlIHNhbWUgaG9zdCBhZGRyZXNzIHdpdGggYSBkaWZmZXJlbnQgaG9zdCBpZAotICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEucmVwbGFjZV9hZGRyZXNzIiwgaG9zdEFkZHJlc3MpOworICAgICAgICAgICAgUkVQTEFDRV9BRERSRVNTLnNldFN0cmluZyhob3N0QWRkcmVzcyk7CiAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2UuaXNSZXBsYWNpbmdTYW1lSG9zdEFkZHJlc3NBbmRIb3N0SWQoZGlmZmVyZW50SG9zdElkKSk7CiAKICAgICAgICAgICAgIC8vIENoZWNrIHRvbGVyYXRlcyB0aGUgRE5TIGVudHJ5IGdvaW5nIGF3YXkgZm9yIHRoZSByZXBsYWNlX2FkZHJlc3MKLSAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnJlcGxhY2VfYWRkcmVzcyIsICJ1bnJlc29sdmFibGUuaG9zdC5sb2NhbC4iKTsKKyAgICAgICAgICAgIFJFUExBQ0VfQUREUkVTUy5zZXRTdHJpbmcoInVucmVzb2x2YWJsZS5ob3N0LmxvY2FsLiIpOwogICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlLmlzUmVwbGFjaW5nU2FtZUhvc3RBZGRyZXNzQW5kSG9zdElkKGRpZmZlcmVudEhvc3RJZCkpOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImNhc3NhbmRyYS5yZXBsYWNlX2FkZHJlc3MiKTsKLSAgICAgICAgfQogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TdG9yYWdlU2VydmljZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlVGVzdC5qYXZhCmluZGV4IGU0NTg5ZDYuLmUwNzAwOTUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N0b3JhZ2VTZXJ2aWNlVGVzdC5qYXZhCkBAIC0yMDQsMTMgKzIwNCwxMzUgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aCgpCisgICAgeworICAgICAgICBTdG9yYWdlU2VydmljZSBzdG9yYWdlU2VydmljZSA9IFN0b3JhZ2VTZXJ2aWNlLmluc3RhbmNlOworICAgICAgICBpbnQgcHJldmlvdXNEZXB0aCA9IHN0b3JhZ2VTZXJ2aWNlLmdldFJlcGFpclNlc3Npb25NYXhpbXVtVHJlZURlcHRoKCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwLCBzdG9yYWdlU2VydmljZS5nZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aCgpKTsKKyAgICAgICAgICAgIHN0b3JhZ2VTZXJ2aWNlLnNldFJlcGFpclNlc3Npb25NYXhpbXVtVHJlZURlcHRoKDEwKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAsIHN0b3JhZ2VTZXJ2aWNlLmdldFJlcGFpclNlc3Npb25NYXhpbXVtVHJlZURlcHRoKCkpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdG9yYWdlU2VydmljZS5zZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aCg5KTsKKyAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSByZWNlaXZlZCBhIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBmb3IgZGVwdGggb2YgOSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmVkKSB7IH0KKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAsIHN0b3JhZ2VTZXJ2aWNlLmdldFJlcGFpclNlc3Npb25NYXhpbXVtVHJlZURlcHRoKCkpOworCisgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdG9yYWdlU2VydmljZS5zZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aCgtMjApOworICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHJlY2VpdmVkIGEgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGZvciBkZXB0aCBvZiAtMjAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWdub3JlZCkgeyB9CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwLCBzdG9yYWdlU2VydmljZS5nZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aCgpKTsKKworICAgICAgICAgICAgc3RvcmFnZVNlcnZpY2Uuc2V0UmVwYWlyU2Vzc2lvbk1heGltdW1UcmVlRGVwdGgoMjIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMiwgc3RvcmFnZVNlcnZpY2UuZ2V0UmVwYWlyU2Vzc2lvbk1heGltdW1UcmVlRGVwdGgoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBzdG9yYWdlU2VydmljZS5zZXRSZXBhaXJTZXNzaW9uTWF4aW11bVRyZWVEZXB0aChwcmV2aW91c0RlcHRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbHVtbkluZGV4U2l6ZUluS2lCKCkKKyAgICB7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlIHN0b3JhZ2VTZXJ2aWNlID0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2U7CisgICAgICAgIGludCBwcmV2aW91c0NvbHVtbkluZGV4U2l6ZSA9IHN0b3JhZ2VTZXJ2aWNlLmdldENvbHVtbkluZGV4U2l6ZUluS2lCKCk7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBzdG9yYWdlU2VydmljZS5zZXRDb2x1bW5JbmRleFNpemVJbktpQigxMDI0KTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAyNCwgc3RvcmFnZVNlcnZpY2UuZ2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoKSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0b3JhZ2VTZXJ2aWNlLnNldENvbHVtbkluZGV4U2l6ZUluS2lCKDIgKiAxMDI0ICogMTAyNCk7CisgICAgICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgcmVjZWl2ZWQgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGNvbHVtbl9pbmRleF9zaXplID0gMkdpQiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmVkKSB7IH0KKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAyNCwgc3RvcmFnZVNlcnZpY2UuZ2V0Q29sdW1uSW5kZXhTaXplSW5LaUIoKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseQorICAgICAgICB7CisgICAgICAgICAgICBzdG9yYWdlU2VydmljZS5zZXRDb2x1bW5JbmRleFNpemVJbktpQihwcmV2aW91c0NvbHVtbkluZGV4U2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb2x1bW5JbmRleENhY2hlU2l6ZUluS2lCKCkKKyAgICB7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlIHN0b3JhZ2VTZXJ2aWNlID0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2U7CisgICAgICAgIGludCBwcmV2aW91c0NvbHVtbkluZGV4Q2FjaGVTaXplID0gc3RvcmFnZVNlcnZpY2UuZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQigpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcmFnZVNlcnZpY2Uuc2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQigxMDI0KTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAyNCwgc3RvcmFnZVNlcnZpY2UuZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQigpKTsKKworICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RvcmFnZVNlcnZpY2Uuc2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQigyICogMTAyNCAqIDEwMjQpOworICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHJlY2VpdmVkIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBjb2x1bW5faW5kZXhfY2FjaGVfc2l6ZT0gMkdpQiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmVkKSB7IH0KKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAyNCwgc3RvcmFnZVNlcnZpY2UuZ2V0Q29sdW1uSW5kZXhDYWNoZVNpemVJbktpQigpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0b3JhZ2VTZXJ2aWNlLnNldENvbHVtbkluZGV4Q2FjaGVTaXplSW5LaUIocHJldmlvdXNDb2x1bW5JbmRleENhY2hlU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIoKQorICAgIHsKKyAgICAgICAgU3RvcmFnZVNlcnZpY2Ugc3RvcmFnZVNlcnZpY2UgPSBTdG9yYWdlU2VydmljZS5pbnN0YW5jZTsKKyAgICAgICAgaW50IHByZXZpb3VzQmF0Y2hTaXplV2FyblRocmVzaG9sZCA9IHN0b3JhZ2VTZXJ2aWNlLmdldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGRJbktpQigpOworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcmFnZVNlcnZpY2Uuc2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZEluS2lCKDEwMjQpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDI0LCBzdG9yYWdlU2VydmljZS5nZXRCYXRjaFNpemVXYXJuVGhyZXNob2xkSW5LaUIoKSk7CisKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0b3JhZ2VTZXJ2aWNlLnNldEJhdGNoU2l6ZVdhcm5UaHJlc2hvbGRJbktpQigyICogMTAyNCAqIDEwMjQpOworICAgICAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHJlY2VpdmVkIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBiYXRjaF9zaXplX3dhcm5fdGhyZXNob2xkID0gMkdpQiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZ25vcmVkKSB7IH0KKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAyNCwgc3RvcmFnZVNlcnZpY2UuZ2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZEluS2lCKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgc3RvcmFnZVNlcnZpY2Uuc2V0QmF0Y2hTaXplV2FyblRocmVzaG9sZEluS2lCKHByZXZpb3VzQmF0Y2hTaXplV2FyblRocmVzaG9sZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhbERhdGFjZW50ZXJOb2Rlc0V4Y2x1ZGVkRHVyaW5nUmVidWlsZCgpCisgICAgeworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgZ2V0U3RvcmFnZVNlcnZpY2UoKS5yZWJ1aWxkKERhdGFiYXNlRGVzY3JpcHRvci5nZXRMb2NhbERhdGFDZW50ZXIoKSwgIlN0b3JhZ2VTZXJ2aWNlVGVzdCIsIG51bGwsIG51bGwsIHRydWUpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiQ2Fubm90IHNldCBzb3VyY2UgZGF0YSBjZW50ZXIgdG8gYmUgbG9jYWwgZGF0YSBjZW50ZXIsIHdoZW4gZXhjbHVkZUxvY2FsRGF0YUNlbnRlciBmbGFnIGlzIHNldCIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFJlYnVpbGRGYWlsT25Ob25FeGlzdGluZ0RhdGFjZW50ZXIoKQogICAgIHsKICAgICAgICAgU3RyaW5nIG5vbkV4aXN0ZW50REMgPSAiTk9OX0VYSVNURU5UX0RDIjsKIAogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgZ2V0U3RvcmFnZVNlcnZpY2UoKS5yZWJ1aWxkKG5vbkV4aXN0ZW50REMsICJTdG9yYWdlU2VydmljZVRlc3QiLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGdldFN0b3JhZ2VTZXJ2aWNlKCkucmVidWlsZChub25FeGlzdGVudERDLCAiU3RvcmFnZVNlcnZpY2VUZXN0IiwgbnVsbCwgbnVsbCwgdHJ1ZSk7CiAgICAgICAgICAgICBmYWlsKCk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N5c3RlbVByb3BlcnRpZXNCYXNlZEZpbGVTeXN0ZW1Pd25lcnNoaXBDaGVja1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL1N5c3RlbVByb3BlcnRpZXNCYXNlZEZpbGVTeXN0ZW1Pd25lcnNoaXBDaGVja1Rlc3QuamF2YQppbmRleCBjYjU0ZjgxLi41NTdiMjZkIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9TeXN0ZW1Qcm9wZXJ0aWVzQmFzZWRGaWxlU3lzdGVtT3duZXJzaGlwQ2hlY2tUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvU3lzdGVtUHJvcGVydGllc0Jhc2VkRmlsZVN5c3RlbU93bmVyc2hpcENoZWNrVGVzdC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogCiBwdWJsaWMgY2xhc3MgU3lzdGVtUHJvcGVydGllc0Jhc2VkRmlsZVN5c3RlbU93bmVyc2hpcENoZWNrVGVzdCBleHRlbmRzIEFic3RyYWN0RmlsZXN5c3RlbU93bmVyc2hpcENoZWNrVGVzdAogewpAQCAtMjgsNyArMjksNyBAQAogICAgIHB1YmxpYyB2b2lkIHNldHVwKCkKICAgICB7CiAgICAgICAgIHN1cGVyLnNldHVwKCk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRklMRV9TWVNURU1fQ0hFQ0tfT1dORVJTSElQX1RPS0VOLmdldEtleSgpLCB0b2tlbik7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShDYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuRklMRV9TWVNURU1fQ0hFQ0tfRU5BQkxFLmdldEtleSgpLCAidHJ1ZSIpOworICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IFdpdGhQcm9wZXJ0aWVzKCkuc2V0KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GSUxFX1NZU1RFTV9DSEVDS19PV05FUlNISVBfVE9LRU4sIHRva2VuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GSUxFX1NZU1RFTV9DSEVDS19FTkFCTEUsIHRydWUpOwogICAgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1JlcGFpckhpc3RvcnlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9wYXhvcy9QYXhvc1JlcGFpckhpc3RvcnlUZXN0LmphdmEKaW5kZXggMzg3ZWM2NS4uYmNkOTcxNCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvUGF4b3NSZXBhaXJIaXN0b3J5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL1BheG9zUmVwYWlySGlzdG9yeVRlc3QuamF2YQpAQCAtNDgsNiArNDgsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5QQVJUSVRJT05FUjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LlJhbmdlLmRlb3ZlcmxhcDsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5CYWxsb3QuRmxhZy5OT05FOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLkJhbGxvdC5ub25lOwpAQCAtNjIsNyArNjMsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgdGFibGVOdW0gPSBuZXcgQXRvbWljSW50ZWdlcigpOwogICAgIHN0YXRpYwogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEucGFydGl0aW9uZXIiLCBNdXJtdXIzUGFydGl0aW9uZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgUEFSVElUSU9ORVIuc2V0U3RyaW5nKE11cm11cjNQYXJ0aXRpb25lci5jbGFzcy5nZXROYW1lKCkpOwogICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKICAgICAgICAgYXNzZXJ0IERhdGFiYXNlRGVzY3JpcHRvci5nZXRQYXJ0aXRpb25lcigpIGluc3RhbmNlb2YgTXVybXVyM1BhcnRpdGlvbmVyOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3BheG9zL3VuY29tbWl0dGVkL1BheG9zU3RhdGVUcmFja2VyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvdW5jb21taXR0ZWQvUGF4b3NTdGF0ZVRyYWNrZXJUZXN0LmphdmEKaW5kZXggZWUwODc4Yy4uMmU4NjY4ZCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvdW5jb21taXR0ZWQvUGF4b3NTdGF0ZVRyYWNrZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcGF4b3MvdW5jb21taXR0ZWQvUGF4b3NTdGF0ZVRyYWNrZXJUZXN0LmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5nZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGlzdHJpYnV0ZWQuc2hhcmVkLldpdGhQcm9wZXJ0aWVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuQ29sdW1uTWV0YWRhdGE7CkBAIC01Miw2ICs1Myw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5wYXhvcy5QYXhvc1JlcGFpckhpc3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5GT1JDRV9QQVhPU19TVEFURV9SRUJVSUxEOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLnVuY29tbWl0dGVkLlBheG9zU3RhdGVUcmFja2VyLnN0YXRlRGlyZWN0b3J5OwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLnVuY29tbWl0dGVkLlBheG9zVW5jb21taXR0ZWRUZXN0cy4qOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLnBheG9zLnVuY29tbWl0dGVkLlVuY29tbWl0dGVkVGFibGVEYXRhVGVzdC5hc3NlcnRJdGVyYXRvckNvbnRlbnRzOwpAQCAtOTQsMzggKzk2LDYgQEAKICAgICAgICAgZGlyZWN0b3JpZXMgPSBuZXcgRmlsZVtde2RpcmVjdG9yeTEsIGRpcmVjdG9yeTJ9OwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN5c3RlbVByb3AgaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlCi0gICAgewotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9wOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcmV2OwotCi0gICAgICAgIHB1YmxpYyBTeXN0ZW1Qcm9wKFN0cmluZyBwcm9wLCBTdHJpbmcgcHJldikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5wcm9wID0gcHJvcDsKLSAgICAgICAgICAgIHRoaXMucHJldiA9IHByZXY7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwcmV2ID09IG51bGwpCi0gICAgICAgICAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkocHJvcCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KHByb3AsIHByZXYpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBTeXN0ZW1Qcm9wIHNldChTdHJpbmcgcHJvcCwgU3RyaW5nIHZhbCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHByZXYgPSBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcCk7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkocHJvcCwgdmFsKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3lzdGVtUHJvcChwcm9wLCBwcmV2KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU3lzdGVtUHJvcCBzZXQoU3RyaW5nIHByb3AsIGJvb2xlYW4gdmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc2V0KHByb3AsIEJvb2xlYW4udG9TdHJpbmcodmFsKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBwcml2YXRlIHN0YXRpYyBQYXJ0aXRpb25VcGRhdGUgdXBkYXRlKFRhYmxlTWV0YWRhdGEgY2ZtLCBpbnQgaywgQmFsbG90IGJhbGxvdCkKICAgICB7CiAgICAgICAgIENvbHVtbk1ldGFkYXRhIGNvbCA9IGNmbS5nZXRDb2x1bW4obmV3IENvbHVtbklkZW50aWZpZXIoInYiLCBmYWxzZSkpOwpAQCAtMjA2LDcgKzE3Niw3IEBACiAgICAgICAgIFN5c3RlbUtleXNwYWNlLnNhdmVQYXhvc1dyaXRlUHJvbWlzZShkaygwKSwgY2ZtMSwgYmFsbG90c1syXSk7CiAgICAgICAgIFN5c3RlbUtleXNwYWNlLnNhdmVQYXhvc1Byb3Bvc2FsKGNvbW1pdChjZm0xLCAyLCBiYWxsb3RzWzNdKSk7CiAKLSAgICAgICAgdHJ5IChTeXN0ZW1Qcm9wIGZvcmNlUmVidWlsZCA9IFN5c3RlbVByb3Auc2V0KFBheG9zU3RhdGVUcmFja2VyLkZPUkNFX1JFQlVJTERfUFJPUCwgdHJ1ZSkpCisgICAgICAgIHRyeSAoV2l0aFByb3BlcnRpZXMgd2l0aCA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChGT1JDRV9QQVhPU19TVEFURV9SRUJVSUxELCB0cnVlKSkKICAgICAgICAgewogICAgICAgICAgICAgUGF4b3NTdGF0ZVRyYWNrZXIgdHJhY2tlciA9IFBheG9zU3RhdGVUcmFja2VyLmNyZWF0ZShkaXJlY3Rvcmllcyk7CiAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0cmFja2VyLmlzUmVidWlsZE5lZWRlZCgpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL3JhbmdlL1JhbmdlQ29tbWFuZHNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9yZWFkcy9yYW5nZS9SYW5nZUNvbW1hbmRzVGVzdC5qYXZhCmluZGV4IDI1OWE2NWYuLjMyZWJlZmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3JlYWRzL3JhbmdlL1JhbmdlQ29tbWFuZHNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2UvcmVhZHMvcmFuZ2UvUmFuZ2VDb21tYW5kc1Rlc3QuamF2YQpAQCAtMzQsMTAgKzM0LDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuUGFydGl0aW9uUmFuZ2VSZWFkQ29tbWFuZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5maWx0ZXIuRGF0YUxpbWl0czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5wYXJ0aXRpb25zLkNhY2hlZFBhcnRpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmluZGV4LlN0dWJJbmRleDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuSW5kZXhNZXRhZGF0YTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLk1BWF9DT05DVVJSRU5UX1JBTkdFX1JFUVVFU1RTOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db25zaXN0ZW5jeUxldmVsLk9ORTsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLm5hbm9UaW1lOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTQ3LDE4ICs0OSwyMCBAQAogICovCiBwdWJsaWMgY2xhc3MgUmFuZ2VDb21tYW5kc1Rlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKIHsKKworICAgIHN0YXRpYyBXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQ09OQ1VSUkVOQ1lfRkFDVE9SID0gNDsKIAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWZpbmVTY2hlbWEoKSB0aHJvd3MgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEubWF4X2NvbmN1cnJlbnRfcmFuZ2VfcmVxdWVzdHMiLCBTdHJpbmcudmFsdWVPZihNQVhfQ09OQ1VSUkVOQ1lfRkFDVE9SKSk7CisgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoTUFYX0NPTkNVUlJFTlRfUkFOR0VfUkVRVUVTVFMsIE1BWF9DT05DVVJSRU5DWV9GQUNUT1IpOwogICAgIH0KIAogICAgIEBBZnRlckNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFudXAoKQogICAgIHsKLSAgICAgICAgU3lzdGVtLmNsZWFyUHJvcGVydHkoImNhc3NhbmRyYS5tYXhfY29uY3VycmVudF9yYW5nZV9yZXF1ZXN0cyIpOworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TG9hZGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RMb2FkZXJUZXN0LmphdmEKaW5kZXggZDAzYTJkZC4uOWMyMzAzZiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RMb2FkZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RMb2FkZXJUZXN0LmphdmEKQEAgLTI3LDYgKzI3LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKIAoraW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmp1bml0LkNsYXNzUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOwpAQCAtMTIzLDkgKzEyNCw1NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRocy5nZXQoYmFzZURpci50b1N0cmluZygpLCBEQVRBX0RJUl8zKSkpOwogICAgICAgICBTZXQ8VGFibGVTbmFwc2hvdD4gc25hcHNob3RzID0gbG9hZGVyLmxvYWRTbmFwc2hvdHMoKTsKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmhhc1NpemUoMyk7Ci0gICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5jb250YWlucyhuZXcgVGFibGVTbmFwc2hvdChLRVlTUEFDRV8xLCBUQUJMRTFfTkFNRSwgVEFCTEUxX0lELCBUQUcxLCBudWxsLCBudWxsLCB0YWcxRmlsZXMpKTsKLSAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzEsIFRBQkxFMl9OQU1FLCBUQUJMRTJfSUQsICBUQUcyLCBudWxsLCBudWxsLCB0YWcyRmlsZXMpKTsKLSAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzIsIFRBQkxFM19OQU1FLCBUQUJMRTNfSUQsICBUQUczLCBudWxsLCBudWxsLCB0YWczRmlsZXMpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzEsIFRBQkxFMV9OQU1FLCBUQUJMRTFfSUQsIFRBRzEsIG51bGwsIG51bGwsIHRhZzFGaWxlcywgZmFsc2UpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzEsIFRBQkxFMl9OQU1FLCBUQUJMRTJfSUQsICBUQUcyLCBudWxsLCBudWxsLCB0YWcyRmlsZXMsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5jb250YWlucyhuZXcgVGFibGVTbmFwc2hvdChLRVlTUEFDRV8yLCBUQUJMRTNfTkFNRSwgVEFCTEUzX0lELCAgVEFHMywgbnVsbCwgbnVsbCwgdGFnM0ZpbGVzLCBmYWxzZSkpOworCisgICAgICAgIC8vIFZlcmlmeSBzbmFwc2hvdCBsb2FkaW5nIGZvciBhIHNwZWNpZmljIGtleXNwYWNlCisgICAgICAgIGxvYWRlciA9IG5ldyBTbmFwc2hvdExvYWRlcihBcnJheXMuYXNMaXN0KFBhdGhzLmdldChiYXNlRGlyLnRvU3RyaW5nKCksIERBVEFfRElSXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRocy5nZXQoYmFzZURpci50b1N0cmluZygpLCBEQVRBX0RJUl8yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aHMuZ2V0KGJhc2VEaXIudG9TdHJpbmcoKSwgREFUQV9ESVJfMykpKTsKKworICAgICAgICBzbmFwc2hvdHMgPSBsb2FkZXIubG9hZFNuYXBzaG90cyhLRVlTUEFDRV8xKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmhhc1NpemUoMik7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5jb250YWlucyhuZXcgVGFibGVTbmFwc2hvdChLRVlTUEFDRV8xLCBUQUJMRTFfTkFNRSwgVEFCTEUxX0lELCBUQUcxLCBudWxsLCBudWxsLCB0YWcxRmlsZXMsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5jb250YWlucyhuZXcgVGFibGVTbmFwc2hvdChLRVlTUEFDRV8xLCBUQUJMRTJfTkFNRSwgVEFCTEUyX0lELCAgVEFHMiwgbnVsbCwgbnVsbCwgdGFnMkZpbGVzLCBmYWxzZSkpOworCisgICAgICAgIGxvYWRlciA9IG5ldyBTbmFwc2hvdExvYWRlcihBcnJheXMuYXNMaXN0KFBhdGhzLmdldChiYXNlRGlyLnRvU3RyaW5nKCksIERBVEFfRElSXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRocy5nZXQoYmFzZURpci50b1N0cmluZygpLCBEQVRBX0RJUl8yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aHMuZ2V0KGJhc2VEaXIudG9TdHJpbmcoKSwgREFUQV9ESVJfMykpKTsKKyAgICAgICAgc25hcHNob3RzID0gbG9hZGVyLmxvYWRTbmFwc2hvdHMoS0VZU1BBQ0VfMik7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5oYXNTaXplKDEpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cykuY29udGFpbnMobmV3IFRhYmxlU25hcHNob3QoS0VZU1BBQ0VfMiwgVEFCTEUzX05BTUUsIFRBQkxFM19JRCwgIFRBRzMsIG51bGwsIG51bGwsIHRhZzNGaWxlcywgZmFsc2UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFcGhlbWVyYWxTbmFwc2hvdFdpdGhvdXRNYW5pZmVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgU2V0PEZpbGU+IHRhZzFGaWxlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICAvLyBDcmVhdGUgb25lIHNuYXBzaG90IHBlciB0YWJsZSAtIHdpdGhvdXQgbWFuaWZlc3RzOgorICAgICAgICAvLyAtIGtzMS50MSA6IHRhZzEKKyAgICAgICAgRmlsZSBiYXNlRGlyICA9IG5ldyBGaWxlKHRtcERpci5uZXdGb2xkZXIoKSk7CisgICAgICAgIGJvb2xlYW4gZXBoZW1lcmFsRmlsZUNyZWF0ZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChTdHJpbmcgZGF0YURpciA6IERBVEFfRElSUykKKyAgICAgICAgeworICAgICAgICAgICAgRmlsZSBkaXIgPSBjcmVhdGVEaXIoYmFzZURpciwgZGF0YURpciwgS0VZU1BBQ0VfMSwgdGFibGVEaXJOYW1lKFRBQkxFMV9OQU1FLCBUQUJMRTFfSUQpLCBEaXJlY3Rvcmllcy5TTkFQU0hPVF9TVUJESVIsIFRBRzEpOworICAgICAgICAgICAgdGFnMUZpbGVzLmFkZChkaXIpOworICAgICAgICAgICAgaWYgKCFlcGhlbWVyYWxGaWxlQ3JlYXRlZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjcmVhdGVFcGhlbWVyYWxNYXJrZXJGaWxlKGRpcik7CisgICAgICAgICAgICAgICAgZXBoZW1lcmFsRmlsZUNyZWF0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVmVyaWZ5IHNuYXBzaG90IGlzIGZvdW5kIGNvcnJlY3RseSBmcm9tIGRhdGEgZGlyZWN0b3JpZXMKKyAgICAgICAgU25hcHNob3RMb2FkZXIgbG9hZGVyID0gbmV3IFNuYXBzaG90TG9hZGVyKEFycmF5cy5hc0xpc3QoUGF0aHMuZ2V0KGJhc2VEaXIudG9TdHJpbmcoKSwgREFUQV9ESVJfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhzLmdldChiYXNlRGlyLnRvU3RyaW5nKCksIERBVEFfRElSXzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRocy5nZXQoYmFzZURpci50b1N0cmluZygpLCBEQVRBX0RJUl8zKSkpOworCisgICAgICAgIFNldDxUYWJsZVNuYXBzaG90PiBzbmFwc2hvdHMgPSBsb2FkZXIubG9hZFNuYXBzaG90cygpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cykuaGFzU2l6ZSgxKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzEsIFRBQkxFMV9OQU1FLCBUQUJMRTFfSUQsIFRBRzEsIG51bGwsIG51bGwsIHRhZzFGaWxlcywgdHJ1ZSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzbmFwc2hvdHMuc3RyZWFtKCkuZmluZEZpcnN0KCkuZ2V0KCkuaXNFcGhlbWVyYWwoKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE2OSw5ICsyMTgsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aHMuZ2V0KGJhc2VEaXIudG9TdHJpbmcoKSwgREFUQV9ESVJfMykpKTsKICAgICAgICAgU2V0PFRhYmxlU25hcHNob3Q+IHNuYXBzaG90cyA9IGxvYWRlci5sb2FkU25hcHNob3RzKCk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5oYXNTaXplKDMpOwotICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cykuY29udGFpbnMobmV3IFRhYmxlU25hcHNob3QoS0VZU1BBQ0VfMSwgVEFCTEUxX05BTUUsIFRBQkxFMV9JRCwgVEFHMSwgdGFnMVRzLCBudWxsLCB0YWcxRmlsZXMpKTsKLSAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzEsIFRBQkxFMl9OQU1FLCBUQUJMRTJfSUQsICBUQUcyLCB0YWcyVHMsIHRhZzJUcy5wbHVzU2Vjb25kcyh0YWcyVHRsLnRvU2Vjb25kcygpKSwgdGFnMkZpbGVzKSk7Ci0gICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5jb250YWlucyhuZXcgVGFibGVTbmFwc2hvdChLRVlTUEFDRV8yLCBUQUJMRTNfTkFNRSwgVEFCTEUzX0lELCAgVEFHMywgdGFnM1RzLCBudWxsLCB0YWczRmlsZXMpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzEsIFRBQkxFMV9OQU1FLCBUQUJMRTFfSUQsIFRBRzEsIHRhZzFUcywgbnVsbCwgdGFnMUZpbGVzLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cykuY29udGFpbnMobmV3IFRhYmxlU25hcHNob3QoS0VZU1BBQ0VfMSwgVEFCTEUyX05BTUUsIFRBQkxFMl9JRCwgIFRBRzIsIHRhZzJUcywgdGFnMlRzLnBsdXNTZWNvbmRzKHRhZzJUdGwudG9TZWNvbmRzKCkpLCB0YWcyRmlsZXMsIGZhbHNlKSk7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5jb250YWlucyhuZXcgVGFibGVTbmFwc2hvdChLRVlTUEFDRV8yLCBUQUJMRTNfTkFNRSwgVEFCTEUzX0lELCAgVEFHMywgdGFnM1RzLCBudWxsLCB0YWczRmlsZXMsIGZhbHNlKSk7CisKKyAgICAgICAgLy8gVmVyaWZ5IHNuYXBzaG90IGxvYWRpbmcgZm9yIGEgc3BlY2lmaWMga2V5c3BhY2UKKyAgICAgICAgbG9hZGVyID0gbmV3IFNuYXBzaG90TG9hZGVyKEFycmF5cy5hc0xpc3QoUGF0aHMuZ2V0KGJhc2VEaXIudG9TdHJpbmcoKSwgREFUQV9ESVJfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhzLmdldChiYXNlRGlyLnRvU3RyaW5nKCksIERBVEFfRElSXzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRocy5nZXQoYmFzZURpci50b1N0cmluZygpLCBEQVRBX0RJUl8zKSkpOworCisgICAgICAgIHNuYXBzaG90cyA9IGxvYWRlci5sb2FkU25hcHNob3RzKEtFWVNQQUNFXzEpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cykuaGFzU2l6ZSgyKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmNvbnRhaW5zKG5ldyBUYWJsZVNuYXBzaG90KEtFWVNQQUNFXzEsIFRBQkxFMV9OQU1FLCBUQUJMRTFfSUQsIFRBRzEsIHRhZzFUcywgbnVsbCwgdGFnMUZpbGVzLCBmYWxzZSkpOworICAgICAgICBhc3NlcnRUaGF0KHNuYXBzaG90cykuY29udGFpbnMobmV3IFRhYmxlU25hcHNob3QoS0VZU1BBQ0VfMSwgVEFCTEUyX05BTUUsIFRBQkxFMl9JRCwgIFRBRzIsIHRhZzJUcywgdGFnMlRzLnBsdXNTZWNvbmRzKHRhZzJUdGwudG9TZWNvbmRzKCkpLCB0YWcyRmlsZXMsIGZhbHNlKSk7CisKKyAgICAgICAgbG9hZGVyID0gbmV3IFNuYXBzaG90TG9hZGVyKEFycmF5cy5hc0xpc3QoUGF0aHMuZ2V0KGJhc2VEaXIudG9TdHJpbmcoKSwgREFUQV9ESVJfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhzLmdldChiYXNlRGlyLnRvU3RyaW5nKCksIERBVEFfRElSXzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRocy5nZXQoYmFzZURpci50b1N0cmluZygpLCBEQVRBX0RJUl8zKSkpOworICAgICAgICBzbmFwc2hvdHMgPSBsb2FkZXIubG9hZFNuYXBzaG90cyhLRVlTUEFDRV8yKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdHMpLmhhc1NpemUoMSk7CisgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzKS5jb250YWlucyhuZXcgVGFibGVTbmFwc2hvdChLRVlTUEFDRV8yLCBUQUJMRTNfTkFNRSwgVEFCTEUzX0lELCAgVEFHMywgdGFnM1RzLCBudWxsLCB0YWczRmlsZXMsIGZhbHNlKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTIwOCw3ICsyNzQsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIHdyaXRlTWFuaWZlc3QoRmlsZSBzbmFwc2hvdERpciwgSW5zdGFudCBjcmVhdGlvblRpbWUsIER1cmF0aW9uU3BlYy5JbnRTZWNvbmRzQm91bmQgdHRsKSB0aHJvd3MgSU9FeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFNuYXBzaG90TWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgU25hcHNob3RNYW5pZmVzdChMaXN0cy5uZXdBcnJheUxpc3QoImYxIiwgImYyIiwgImYzIiksIHR0bCwgY3JlYXRpb25UaW1lKTsKKyAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBTbmFwc2hvdE1hbmlmZXN0KExpc3RzLm5ld0FycmF5TGlzdCgiZjEiLCAiZjIiLCAiZjMiKSwgdHRsLCBjcmVhdGlvblRpbWUsIGZhbHNlKTsKICAgICAgICAgbWFuaWZlc3Quc2VyaWFsaXplVG9Kc29uRmlsZShnZXRNYW5pZmVzdEZpbGUoc25hcHNob3REaXIpKTsKICAgICB9CiAKQEAgLTIxOSw2ICsyODUsMTEgQEAKICAgICAgICAgcmV0dXJuIGZpbGU7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjcmVhdGVFcGhlbWVyYWxNYXJrZXJGaWxlKEZpbGUgZGlyKQorICAgIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobmV3IEZpbGUoZGlyLCAiZXBoZW1lcmFsLnNuYXBzaG90IikuY3JlYXRlRmlsZUlmTm90RXhpc3RzKCkpOworICAgIH0KKwogICAgIHN0YXRpYyBTdHJpbmcgdGFibGVEaXJOYW1lKFN0cmluZyB0YWJsZU5hbWUsIFVVSUQgdGFibGVJZCkKICAgICB7CiAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcy0lcyIsIHRhYmxlTmFtZSwgcmVtb3ZlRGFzaGVzKHRhYmxlSWQpKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TWFuYWdlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TWFuYWdlclRlc3QuamF2YQppbmRleCBlZGJmZmYyLi5mOTIzM2JiIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9zbmFwc2hvdC9TbmFwc2hvdE1hbmFnZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RNYW5hZ2VyVGVzdC5qYXZhCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgQENsYXNzUnVsZQogICAgIHB1YmxpYyBzdGF0aWMgVGVtcG9yYXJ5Rm9sZGVyIHRlbXBvcmFyeUZvbGRlciA9IG5ldyBUZW1wb3JhcnlGb2xkZXIoKTsKIAotICAgIHByaXZhdGUgVGFibGVTbmFwc2hvdCBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscyhTdHJpbmcgdGFnLCBJbnN0YW50IGV4cGlyYXRpb24pCisgICAgcHJpdmF0ZSBUYWJsZVNuYXBzaG90IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKFN0cmluZyB0YWcsIEluc3RhbnQgZXhwaXJhdGlvbiwgYm9vbGVhbiBlcGhlbWVyYWwpCiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewpAQCAtNjcsNyArNjcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW50LkVQT0NILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRm9sZGVycyh0ZW1wb3JhcnlGb2xkZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVGb2xkZXJzKHRlbXBvcmFyeUZvbGRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXBoZW1lcmFsKTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQogICAgICAgICB7CkBAIC03NSwxMyArNzYsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZFNuYXBzaG90cygpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFRhYmxlU25hcHNob3QgZXhwaXJlZCA9IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJleHBpcmVkIiwgSW5zdGFudC5FUE9DSCk7Ci0gICAgICAgIFRhYmxlU25hcHNob3Qgbm9uRXhwaXJlZCA9IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJub24tZXhwaXJlZCIsIG5vdygpLnBsdXNTZWNvbmRzKE9ORV9EQVlfU0VDUykpOwotICAgICAgICBUYWJsZVNuYXBzaG90IG5vbkV4cGlyaW5nID0gZ2VuZXJhdGVTbmFwc2hvdERldGFpbHMoIm5vbi1leHBpcmluZyIsIG51bGwpOworICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkU25hcHNob3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRhYmxlU25hcHNob3QgZXhwaXJlZCA9IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJleHBpcmVkIiwgSW5zdGFudC5FUE9DSCwgZmFsc2UpOworICAgICAgICBUYWJsZVNuYXBzaG90IG5vbkV4cGlyZWQgPSBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygibm9uLWV4cGlyZWQiLCBub3coKS5wbHVzU2Vjb25kcyhPTkVfREFZX1NFQ1MpLCBmYWxzZSk7CisgICAgICAgIFRhYmxlU25hcHNob3Qgbm9uRXhwaXJpbmcgPSBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygibm9uLWV4cGlyaW5nIiwgbnVsbCwgZmFsc2UpOwogICAgICAgICBMaXN0PFRhYmxlU25hcHNob3Q+IHNuYXBzaG90cyA9IEFycmF5cy5hc0xpc3QoZXhwaXJlZCwgbm9uRXhwaXJlZCwgbm9uRXhwaXJpbmcpOwogCiAgICAgICAgIC8vIENyZWF0ZSBTbmFwc2hvdE1hbmFnZXIgd2l0aCAzIHNuYXBzaG90czogZXhwaXJlZCwgbm9uLWV4cGlyZWQgYW5kIG5vbi1leHBpcmluZwpAQCAtOTUsMTQgKzk0LDEzIEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJFeHBpcmVkU25hcHNob3RzKCkKLSAgICB7CisgICAgcHVibGljIHZvaWQgdGVzdENsZWFyRXhwaXJlZFNuYXBzaG90cygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTbmFwc2hvdE1hbmFnZXIgbWFuYWdlciA9IG5ldyBTbmFwc2hvdE1hbmFnZXIoMywgMyk7CiAKICAgICAgICAgLy8gQWRkIDMgc25hcHNob3RzOiBleHBpcmVkLCBub24tZXhwaXJlZCBhbmQgbm9uLWV4cGlyaW5nCi0gICAgICAgIFRhYmxlU25hcHNob3QgZXhwaXJlZCA9IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJleHBpcmVkIiwgSW5zdGFudC5FUE9DSCk7Ci0gICAgICAgIFRhYmxlU25hcHNob3Qgbm9uRXhwaXJlZCA9IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJub24tZXhwaXJlZCIsIG5vdygpLnBsdXNNaWxsaXMoT05FX0RBWV9TRUNTKSk7Ci0gICAgICAgIFRhYmxlU25hcHNob3Qgbm9uRXhwaXJpbmcgPSBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygibm9uLWV4cGlyaW5nIiwgbnVsbCk7CisgICAgICAgIFRhYmxlU25hcHNob3QgZXhwaXJlZCA9IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJleHBpcmVkIiwgSW5zdGFudC5FUE9DSCwgZmFsc2UpOworICAgICAgICBUYWJsZVNuYXBzaG90IG5vbkV4cGlyZWQgPSBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygibm9uLWV4cGlyZWQiLCBub3coKS5wbHVzTWlsbGlzKE9ORV9EQVlfU0VDUyksIGZhbHNlKTsKKyAgICAgICAgVGFibGVTbmFwc2hvdCBub25FeHBpcmluZyA9IGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJub24tZXhwaXJpbmciLCBudWxsLCBmYWxzZSk7CiAgICAgICAgIG1hbmFnZXIuYWRkU25hcHNob3QoZXhwaXJlZCk7CiAgICAgICAgIG1hbmFnZXIuYWRkU25hcHNob3Qobm9uRXhwaXJlZCk7CiAgICAgICAgIG1hbmFnZXIuYWRkU25hcHNob3Qobm9uRXhwaXJpbmcpOwpAQCAtMTI1LDggKzEyMyw3IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2NoZWR1bGVkQ2xlYW51cCgpIHRocm93cyBFeGNlcHRpb24KLSAgICB7CisgICAgcHVibGljIHZvaWQgdGVzdFNjaGVkdWxlZENsZWFudXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU25hcHNob3RNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgU25hcHNob3RNYW5hZ2VyKDAsIDEpOwogICAgICAgICB0cnkKICAgICAgICAgewpAQCAtMTM0LDggKzEzMSw5IEBACiAgICAgICAgICAgICBtYW5hZ2VyLnN0YXJ0KCk7CiAKICAgICAgICAgICAgIC8vIEFkZCAyIGV4cGlyaW5nIHNuYXBzaG90czogb25lIHRvIGV4cGlyZSBpbiAyIHNlY29uZHMsIGFub3RoZXIgaW4gMSBkYXkKLSAgICAgICAgICAgIFRhYmxlU25hcHNob3QgdG9FeHBpcmUgPSBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygidG8tZXhwaXJlIiwgbm93KCkucGx1c1NlY29uZHMoMikpOwotICAgICAgICAgICAgVGFibGVTbmFwc2hvdCBub25FeHBpcmVkID0gZ2VuZXJhdGVTbmFwc2hvdERldGFpbHMoIm5vbi1leHBpcmVkIiwgbm93KCkucGx1c01pbGxpcyhPTkVfREFZX1NFQ1MpKTsKKyAgICAgICAgICAgIGludCBUVExfU0VDUyA9IDI7CisgICAgICAgICAgICBUYWJsZVNuYXBzaG90IHRvRXhwaXJlID0gZ2VuZXJhdGVTbmFwc2hvdERldGFpbHMoInRvLWV4cGlyZSIsIG5vdygpLnBsdXNTZWNvbmRzKFRUTF9TRUNTKSwgZmFsc2UpOworICAgICAgICAgICAgVGFibGVTbmFwc2hvdCBub25FeHBpcmVkID0gZ2VuZXJhdGVTbmFwc2hvdERldGFpbHMoIm5vbi1leHBpcmVkIiwgbm93KCkucGx1c01pbGxpcyhPTkVfREFZX1NFQ1MpLCBmYWxzZSk7CiAgICAgICAgICAgICBtYW5hZ2VyLmFkZFNuYXBzaG90KHRvRXhwaXJlKTsKICAgICAgICAgICAgIG1hbmFnZXIuYWRkU25hcHNob3Qobm9uRXhwaXJlZCk7CiAKQEAgLTE0NiwxMCArMTQ0LDExIEBACiAgICAgICAgICAgICBhc3NlcnRUaGF0KG1hbmFnZXIuZ2V0RXhwaXJpbmdTbmFwc2hvdHMoKSkuY29udGFpbnModG9FeHBpcmUpOwogICAgICAgICAgICAgYXNzZXJ0VGhhdChtYW5hZ2VyLmdldEV4cGlyaW5nU25hcHNob3RzKCkpLmNvbnRhaW5zKG5vbkV4cGlyZWQpOwogCi0gICAgICAgICAgICBhd2FpdCgpLnBvbGxJbnRlcnZhbCgyLCBTRUNPTkRTKQotICAgICAgICAgICAgICAgICAgIC50aW1lb3V0KDEwLCBTRUNPTkRTKQotICAgICAgICAgICAgICAgICAgIC51bnRpbCgoKSAtPiBtYW5hZ2VyLmdldEV4cGlyaW5nU25hcHNob3RzKCkuc2l6ZSgpID09IDEpOworICAgICAgICAgICAgLy8gU2xlZXAgNCBzZWNvbmRzCisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoKFRUTF9TRUNTICsgMikgKiAxMDAwTCk7CiAKKyAgICAgICAgICAgIC8vIFNuYXBzaG90IHdpdGggdHRsPTJzIHNob3VsZCBiZSBnb25lLCB3aGlsZSBvdGhlciBzaG91bGQgcmVtYWluCisgICAgICAgICAgICBhc3NlcnRUaGF0KG1hbmFnZXIuZ2V0RXhwaXJpbmdTbmFwc2hvdHMoKSkuaGFzU2l6ZSgxKTsKICAgICAgICAgICAgIGFzc2VydFRoYXQobWFuYWdlci5nZXRFeHBpcmluZ1NuYXBzaG90cygpKS5jb250YWlucyhub25FeHBpcmVkKTsKICAgICAgICAgICAgIGFzc2VydFRoYXQodG9FeHBpcmUuZXhpc3RzKCkpLmlzRmFsc2UoKTsKICAgICAgICAgICAgIGFzc2VydFRoYXQobm9uRXhwaXJlZC5leGlzdHMoKSkuaXNUcnVlKCk7CkBAIC0xNjAsNiArMTU5LDI0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhclNuYXBzaG90KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgLy8gR2l2ZW4KKyAgICAgICAgU25hcHNob3RNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgU25hcHNob3RNYW5hZ2VyKDEsIDMpOworICAgICAgICBUYWJsZVNuYXBzaG90IGV4cGlyaW5nU25hcHNob3QgPSBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygic25hcHNob3QiLCBub3coKS5wbHVzTWlsbGlzKDUwMDAwKSwgZmFsc2UpOworICAgICAgICBtYW5hZ2VyLmFkZFNuYXBzaG90KGV4cGlyaW5nU25hcHNob3QpOworICAgICAgICBhc3NlcnRUaGF0KG1hbmFnZXIuZ2V0RXhwaXJpbmdTbmFwc2hvdHMoKSkuY29udGFpbnMoZXhwaXJpbmdTbmFwc2hvdCk7CisgICAgICAgIGFzc2VydFRoYXQoZXhwaXJpbmdTbmFwc2hvdC5leGlzdHMoKSkuaXNUcnVlKCk7CisKKyAgICAgICAgLy8gV2hlbgorICAgICAgICBtYW5hZ2VyLmNsZWFyU25hcHNob3QoZXhwaXJpbmdTbmFwc2hvdCk7CisKKyAgICAgICAgLy8gVGhlbgorICAgICAgICBhc3NlcnRUaGF0KG1hbmFnZXIuZ2V0RXhwaXJpbmdTbmFwc2hvdHMoKSkuZG9lc05vdENvbnRhaW4oZXhwaXJpbmdTbmFwc2hvdCk7CisgICAgICAgIGFzc2VydFRoYXQoZXhwaXJpbmdTbmFwc2hvdC5leGlzdHMoKSkuaXNGYWxzZSgpOworICAgIH0KKwogICAgIEBUZXN0IC8vIHNlZSBDQVNTQU5EUkEtMTgyMTEKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVudENsZWFyaW5nT2ZTbmFwc2hvdHMoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewpAQCAtMTg1LDEyICsyMDIsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKIAotICAgICAgICBUYWJsZVNuYXBzaG90IGV4cGlyaW5nU25hcHNob3QgPSBnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygibXlzbmFwc2hvdCIsIEluc3RhbnQubm93KCkucGx1c1NlY29uZHMoMTUpKTsKKyAgICAgICAgVGFibGVTbmFwc2hvdCBleHBpcmluZ1NuYXBzaG90ID0gZ2VuZXJhdGVTbmFwc2hvdERldGFpbHMoIm15c25hcHNob3QiLCBJbnN0YW50Lm5vdygpLnBsdXNTZWNvbmRzKDE1KSwgZmFsc2UpOwogICAgICAgICBtYW5hZ2VyLmFkZFNuYXBzaG90KGV4cGlyaW5nU25hcHNob3QpOwogCiAgICAgICAgIG1hbmFnZXIucmVzdW1lU25hcHNob3RDbGVhbnVwKCk7CiAKLSAgICAgICAgVGhyZWFkIG5vbkV4cGlyaW5nU25hcHNob3RDbGVhbnVwVGhyZWQgPSBuZXcgVGhyZWFkKCgpIC0+IG1hbmFnZXIuY2xlYXJTbmFwc2hvdChnZW5lcmF0ZVNuYXBzaG90RGV0YWlscygibXlzbmFwc2hvdDIiLCBudWxsKSkpOworICAgICAgICBUaHJlYWQgbm9uRXhwaXJpbmdTbmFwc2hvdENsZWFudXBUaHJlZCA9IG5ldyBUaHJlYWQoKCkgLT4gbWFuYWdlci5jbGVhclNuYXBzaG90KGdlbmVyYXRlU25hcHNob3REZXRhaWxzKCJteXNuYXBzaG90MiIsIG51bGwsIGZhbHNlKSkpOwogCiAgICAgICAgIC8vIHdhaXQgdW50aWwgdGhlIGZpcnN0IHNuYXBzaG90IGV4cGlyZXMKICAgICAgICAgYXdhaXQoKS5wb2xsSW50ZXJ2YWwoMSwgU0VDT05EUykKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TWFuaWZlc3RUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9zbmFwc2hvdC9TbmFwc2hvdE1hbmlmZXN0VGVzdC5qYXZhCmluZGV4IGQzYjExYzAuLjVjMTIzNTkgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1NuYXBzaG90TWFuaWZlc3RUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvU25hcHNob3RNYW5pZmVzdFRlc3QuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EdXJhdGlvblNwZWM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZU91dHB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogCiBwdWJsaWMgY2xhc3MgU25hcHNob3RNYW5pZmVzdFRlc3QKIHsKQEAgLTcwLDcgKzcxLDcgQEAKICAgICAgICAgbWFwLnB1dCgiZXhwaXJlc19hdCIsIGV4cGlyZXNBdCk7CiAgICAgICAgIG1hcC5wdXQoImZpbGVzIiwgQXJyYXlzLmFzTGlzdCgiZGIxIiwgImRiMiIsICJkYjMiKSk7CiAKLSAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKyAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVI7CiAgICAgICAgIEZpbGUgbWFuaWZlc3RGaWxlID0gbmV3IEZpbGUodGVtcEZvbGRlci5uZXdGaWxlKCJtYW5pZmVzdC5qc29uIikpOwogICAgICAgICBtYXBwZXIud3JpdGVWYWx1ZSgoT3V0cHV0U3RyZWFtKSBuZXcgRmlsZU91dHB1dFN0cmVhbVBsdXMobWFuaWZlc3RGaWxlKSwgbWFwKTsKICAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IFNuYXBzaG90TWFuaWZlc3QuZGVzZXJpYWxpemVGcm9tSnNvbkZpbGUobWFuaWZlc3RGaWxlKTsKQEAgLTg0LDcgKzg1LDcgQEAKICAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW9uYWxGaWVsZHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgbWFwLnB1dCgiZmlsZXMiLCBBcnJheXMuYXNMaXN0KCJkYjEiLCAiZGIyIiwgImRiMyIpKTsKLSAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKyAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVI7CiAgICAgICAgIEZpbGUgbWFuaWZlc3RGaWxlID0gbmV3IEZpbGUodGVtcEZvbGRlci5uZXdGaWxlKCJtYW5pZmVzdC5qc29uIikpOwogICAgICAgICBtYXBwZXIud3JpdGVWYWx1ZSgoT3V0cHV0U3RyZWFtKSBuZXcgRmlsZU91dHB1dFN0cmVhbVBsdXMobWFuaWZlc3RGaWxlKSwgbWFwKTsKICAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IFNuYXBzaG90TWFuaWZlc3QuZGVzZXJpYWxpemVGcm9tSnNvbkZpbGUobWFuaWZlc3RGaWxlKTsKQEAgLTk5LDcgKzEwMCw3IEBACiAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICBtYXAucHV0KCJmaWxlcyIsIEFycmF5cy5hc0xpc3QoImRiMSIsICJkYjIiLCAiZGIzIikpOwogICAgICAgICBtYXAucHV0KCJkdW1teSIsICJkdW1teSIpOwotICAgICAgICBPYmplY3RNYXBwZXIgbWFwcGVyID0gbmV3IE9iamVjdE1hcHBlcigpOworICAgICAgICBPYmplY3RNYXBwZXIgbWFwcGVyID0gSnNvblV0aWxzLkpTT05fT0JKRUNUX01BUFBFUjsKICAgICAgICAgRmlsZSBtYW5pZmVzdEZpbGUgPSBuZXcgRmlsZSh0ZW1wRm9sZGVyLm5ld0ZpbGUoIm1hbmlmZXN0Lmpzb24iKSk7CiAgICAgICAgIG1hcHBlci53cml0ZVZhbHVlKChPdXRwdXRTdHJlYW0pIG5ldyBGaWxlT3V0cHV0U3RyZWFtUGx1cyhtYW5pZmVzdEZpbGUpLCBtYXApOwogICAgICAgICBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0ID0gU25hcHNob3RNYW5pZmVzdC5kZXNlcmlhbGl6ZUZyb21Kc29uRmlsZShtYW5pZmVzdEZpbGUpOwpAQCAtMTA4LDcgKzEwOSw3IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVBbmREZXNlcmlhbGl6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IFNuYXBzaG90TWFuaWZlc3QoQXJyYXlzLmFzTGlzdCgiZGIxIiwgImRiMiIsICJkYjMiKSwgbmV3IER1cmF0aW9uU3BlYy5JbnRTZWNvbmRzQm91bmQoIjJtIiksIEluc3RhbnQub2ZFcG9jaE1pbGxpKGN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKKyAgICAgICAgU25hcHNob3RNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBTbmFwc2hvdE1hbmlmZXN0KEFycmF5cy5hc0xpc3QoImRiMSIsICJkYjIiLCAiZGIzIiksIG5ldyBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kKCIybSIpLCBJbnN0YW50Lm9mRXBvY2hNaWxsaShjdXJyZW50VGltZU1pbGxpcygpKSwgZmFsc2UpOwogICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKHRlbXBGb2xkZXIubmV3RmlsZSgibWFuaWZlc3QuanNvbiIpKTsKIAogICAgICAgICBtYW5pZmVzdC5zZXJpYWxpemVUb0pzb25GaWxlKG1hbmlmZXN0RmlsZSk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9zbmFwc2hvdC9UYWJsZVNuYXBzaG90VGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3NlcnZpY2Uvc25hcHNob3QvVGFibGVTbmFwc2hvdFRlc3QuamF2YQppbmRleCA0YmIxNzU2Li5kNTkyZGQ5IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc2VydmljZS9zbmFwc2hvdC9UYWJsZVNuYXBzaG90VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zZXJ2aWNlL3NuYXBzaG90L1RhYmxlU25hcHNob3RUZXN0LmphdmEKQEAgLTIxLDggKzIxLDEwIEBACiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwogaW1wb3J0IGphdmEudGltZS5JbnN0YW50OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5VVUlEOwogCkBAIC0zNSw5ICszNywxMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVPdXRwdXRTdHJlYW1QbHVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXMubm93OwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogcHVibGljIGNsYXNzIFRhYmxlU25hcHNob3RUZXN0CiB7CkBAIC01MCwxNSArNTQsMTggQEAKICAgICBAQ2xhc3NSdWxlCiAgICAgcHVibGljIHN0YXRpYyBUZW1wb3JhcnlGb2xkZXIgdGVtcEZvbGRlciA9IG5ldyBUZW1wb3JhcnlGb2xkZXIoKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PEZpbGU+IGNyZWF0ZUZvbGRlcnMoVGVtcG9yYXJ5Rm9sZGVyIHRlbXApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHN0YXRpYyBTZXQ8RmlsZT4gY3JlYXRlRm9sZGVycyhUZW1wb3JhcnlGb2xkZXIgdGVtcCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgewogICAgICAgICBGaWxlIGZvbGRlciA9IG5ldyBGaWxlKHRlbXAubmV3Rm9sZGVyKCkpOwogICAgICAgICBTZXQ8RmlsZT4gZm9sZGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgZm9yIChTdHJpbmcgZm9sZGVyTmFtZSA6IEFycmF5cy5hc0xpc3QoImZvbyIsICJiYXIiLCAiYnV6eiIpKSB7CisgICAgICAgIGZvciAoU3RyaW5nIGZvbGRlck5hbWUgOiBBcnJheXMuYXNMaXN0KCJmb28iLCAiYmFyIiwgImJ1enoiKSkKKyAgICAgICAgewogICAgICAgICAgICAgRmlsZSBzdWJmb2xkZXIgPSBuZXcgRmlsZShmb2xkZXIsIGZvbGRlck5hbWUpOwogICAgICAgICAgICAgc3ViZm9sZGVyLnRyeUNyZWF0ZURpcmVjdG9yaWVzKCk7CiAgICAgICAgICAgICBhc3NlcnRUaGF0KHN1YmZvbGRlci5leGlzdHMoKSk7CiAgICAgICAgICAgICBmb2xkZXJzLmFkZChzdWJmb2xkZXIpOwotICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIDsKICAgICAgICAgcmV0dXJuIGZvbGRlcnM7CiAgICAgfQogCkBAIC03NCw3ICs4MSw5IEBACiAgICAgICAgICJzb21lIiwKICAgICAgICAgbnVsbCwKICAgICAgICAgbnVsbCwKLSAgICAgICAgZm9sZGVycyk7CisgICAgICAgIGZvbGRlcnMsCisgICAgICAgIGZhbHNlCisgICAgICAgICk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdC5leGlzdHMoKSkuaXNUcnVlKCk7CiAKQEAgLTk1LDcgKzEwNCw5IEBACiAgICAgICAgICJzb21lIiwKICAgICAgICAgbnVsbCwKICAgICAgICAgbnVsbCwKLSAgICAgICAgZm9sZGVycyk7CisgICAgICAgIGZvbGRlcnMsCisgICAgICAgIGZhbHNlCisgICAgICAgICk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdC5pc0V4cGlyaW5nKCkpLmlzRmFsc2UoKTsKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdC5pc0V4cGlyZWQobm93KCkpKS5pc0ZhbHNlKCk7CkBAIC0xMDcsNyArMTE4LDkgQEAKICAgICAgICAgInNvbWUiLAogICAgICAgICBub3coKSwKICAgICAgICAgbnVsbCwKLSAgICAgICAgZm9sZGVycyk7CisgICAgICAgIGZvbGRlcnMsCisgICAgICAgIGZhbHNlCisgICAgICAgICk7CiAKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdC5pc0V4cGlyaW5nKCkpLmlzRmFsc2UoKTsKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdC5pc0V4cGlyZWQobm93KCkpKS5pc0ZhbHNlKCk7CkBAIC0xMTksNyArMTMyLDkgQEAKICAgICAgICAgInNvbWUiLAogICAgICAgICBub3coKSwKICAgICAgICAgbm93KCkucGx1c1NlY29uZHMoMTAwMCksCi0gICAgICAgIGZvbGRlcnMpOworICAgICAgICBmb2xkZXJzLAorICAgICAgICBmYWxzZQorICAgICAgICApOwogCiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3QuaXNFeHBpcmluZygpKS5pc1RydWUoKTsKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdC5pc0V4cGlyZWQobm93KCkpKS5pc0ZhbHNlKCk7CkBAIC0xMzEsNyArMTQ2LDggQEAKICAgICAgICAgInNvbWUiLAogICAgICAgICBub3coKSwKICAgICAgICAgbm93KCkubWludXNTZWNvbmRzKDEwMDApLAotICAgICAgICBmb2xkZXJzKTsKKyAgICAgICAgZm9sZGVycywKKyAgICAgICAgZmFsc2UpOwogCiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3QuaXNFeHBpcmluZygpKS5pc1RydWUoKTsKICAgICAgICAgYXNzZXJ0VGhhdChzbmFwc2hvdC5pc0V4cGlyZWQobm93KCkpKS5pc1RydWUoKTsKQEAgLTE1OSw3ICsxNzUsOCBAQAogICAgICAgICAic29tZSIsCiAgICAgICAgIG51bGwsCiAgICAgICAgIG51bGwsCi0gICAgICAgIGZvbGRlcnMpOworICAgICAgICBmb2xkZXJzLAorICAgICAgICBmYWxzZSk7CiAKICAgICAgICAgTG9uZyByZXMgPSAwTDsKIApAQCAtMTg1LDcgKzIwMiw5IEBACiAgICAgICAgICJzb21lIiwKICAgICAgICAgbnVsbCwKICAgICAgICAgbnVsbCwKLSAgICAgICAgZm9sZGVycyk7CisgICAgICAgIGZvbGRlcnMsCisgICAgICAgIGZhbHNlCisgICAgICAgICk7CiAKICAgICAgICAgTG9uZyByZXMgPSAwTDsKIApAQCAtMjE0LDcgKzIzMywxMCBAQAogICAgICAgICAic29tZTEiLAogICAgICAgICBjcmVhdGVkQXQsCiAgICAgICAgIG51bGwsCi0gICAgICAgIGZvbGRlcnMpOworICAgICAgICBmb2xkZXJzLAorICAgICAgICBmYWxzZQorICAgICAgICApOworCiAgICAgICAgIGFzc2VydFRoYXQod2l0aENyZWF0ZWRBdC5nZXRDcmVhdGVkQXQoKSkuaXNFcXVhbFRvKGNyZWF0ZWRBdCk7CiAKICAgICAgICAgLy8gV2hlbiBjcmVhdGVkQXQgaXMgIG51bGwsIGl0IHNob3VsZCByZXR1cm4gdGhlIHNuYXBzaG90IGZvbGRlciBtaW5pbXVtIHVwZGF0ZSB0aW1lCkBAIC0yMjUsMTEgKzI0Nyw4MiBAQAogICAgICAgICAic29tZTEiLAogICAgICAgICBudWxsLAogICAgICAgICBudWxsLAotICAgICAgICBmb2xkZXJzKTsKKyAgICAgICAgZm9sZGVycywKKyAgICAgICAgZmFsc2UKKyAgICAgICAgKTsKKwogICAgICAgICBhc3NlcnRUaGF0KHdpdGhvdXRDcmVhdGVkQXQuZ2V0Q3JlYXRlZEF0KCkpLmlzRXF1YWxUbyhJbnN0YW50Lm9mRXBvY2hNaWxsaShmb2xkZXJzLnN0cmVhbSgpLm1hcFRvTG9uZyhmIC0+IGYubGFzdE1vZGlmaWVkKCkpLm1pbigpLmdldEFzTG9uZygpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkQ2xlYXJTbmFwc2hvdCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIC8vIFRhYmxlU25hcHNob3QgdmFyaWFibGVzIC0+IGVwaGVtZXJhbCAvIHRydWUgLyBmYWxzZSwgY3JlYXRlZEF0IC0+IG51bGwgLyBub3RudWxsCisKKyAgICAgICAgSW5zdGFudCBub3cgPSBJbnN0YW50Lm5vdygpOworCisgICAgICAgIFN0cmluZyBrZXlzcGFjZSA9ICJrcyI7CisgICAgICAgIFN0cmluZyB0YWJsZSA9ICJ0YmwiOworICAgICAgICBVVUlEIGlkID0gVVVJRC5yYW5kb21VVUlEKCk7CisgICAgICAgIFN0cmluZyB0YWcgPSAic29tZVRhZyI7CisgICAgICAgIEluc3RhbnQgc25hcHNob3RDcmVhdGlvbiA9IG5vdy5taW51c1NlY29uZHMoNjApOworICAgICAgICBTZXQ8RmlsZT4gZm9sZGVycyA9IGNyZWF0ZUZvbGRlcnModGVtcEZvbGRlcik7CisKKyAgICAgICAgTGlzdDxUYWJsZVNuYXBzaG90PiBzbmFwc2hvdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBmb3IgKGJvb2xlYW4gZXBoZW1lcmFsIDogbmV3IGJvb2xlYW5bXXsgdHJ1ZSwgZmFsc2UgfSkKKyAgICAgICAgICAgIGZvciAoSW5zdGFudCBjcmVhdGVkQXQgOiBuZXcgSW5zdGFudFtdeyBzbmFwc2hvdENyZWF0aW9uLCBudWxsIH0pCisgICAgICAgICAgICAgICAgc25hcHNob3RzLmFkZChuZXcgVGFibGVTbmFwc2hvdChrZXlzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQsIC8vIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwaGVtZXJhbCkpOyAvLyB2YXJpYWJsZQorCisgICAgICAgIExpc3Q8UGFpcjxTdHJpbmcsIExvbmc+PiB0ZXN0aW5nTWV0aG9kSW5wdXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgZm9yIChTdHJpbmcgdGVzdGluZ1RhZyA6IG5ldyBTdHJpbmdbXSB7bnVsbCwgIiIsIHRhZywgInNvbWVvdGhlcnRhZyJ9KQorICAgICAgICAgICAgLy8gMCB0byBkZWFjdGl2ZSBieVRpbWVzdGFtcCBsb2dpYywgbm93LnRvRXBvY2hNaWxsaSBhcyB0cnVlLCBzbmFwc2hvdCBtaW51cyA2MHMgYXMgZmFsc2UKKyAgICAgICAgICAgIGZvciAobG9uZyBvbGRlclRoYW5UaW1lc3RhbXAgOiBuZXcgbG9uZ1tdIHswLCBub3cudG9FcG9jaE1pbGxpKCksIHNuYXBzaG90Q3JlYXRpb24ubWludXNTZWNvbmRzKDYwKS50b0Vwb2NoTWlsbGkoKX0pCisgICAgICAgICAgICAgICAgdGVzdGluZ01ldGhvZElucHV0cy5hZGQoUGFpci5jcmVhdGUodGVzdGluZ1RhZywgb2xkZXJUaGFuVGltZXN0YW1wKSk7CisKKyAgICAgICAgZm9yIChQYWlyPFN0cmluZywgTG9uZz4gbWV0aG9kSW5wdXQgOiB0ZXN0aW5nTWV0aG9kSW5wdXRzKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgdGVzdGluZ1RhZyA9IG1ldGhvZElucHV0LmxlZnQoKTsKKyAgICAgICAgICAgIExvbmcgb2xkZXJUaGFuVGltZXN0YW1wID0gbWV0aG9kSW5wdXQucmlnaHQ7CisgICAgICAgICAgICBmb3IgKFRhYmxlU25hcHNob3Qgc25hcHNob3QgOiBzbmFwc2hvdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaWYgc2hvdWxkQ2xlYXIgbWV0aG9kIHJldHVybnMgdHJ1ZSwgaXQgaXMgb25seSBpbiBjYXNlCisgICAgICAgICAgICAgICAgLy8gMS4gc25hcHNob3QgdG8gY2xlYXIgaXMgbm90IGVwaGVtZXJhbAorICAgICAgICAgICAgICAgIC8vIDIuIHRhZyB0byBjbGVhciBpcyBudWxsLCBlbXB0eSwgb3IgaXQgaXMgZXF1YWwgdG8gc25hcHNob3QgdGFnCisgICAgICAgICAgICAgICAgLy8gMy4gYnlUaW1lc3RhbXAgaXMgdHJ1ZQorICAgICAgICAgICAgICAgIGlmIChUYWJsZVNuYXBzaG90LnNob3VsZENsZWFyU25hcHNob3QodGVzdGluZ1RhZywgb2xkZXJUaGFuVGltZXN0YW1wKS50ZXN0KHNuYXBzaG90KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZENsZWFyVGFnID0gdHJ1ZQorICAgICAgICAgICAgICAgICAgICBib29sZWFuIHNob3VsZENsZWFyVGFnID0gKHRlc3RpbmdUYWcgPT0gbnVsbCB8fCB0ZXN0aW5nVGFnLmlzRW1wdHkoKSkgfHwgc25hcHNob3QuZ2V0VGFnKCkuZXF1YWxzKHRlc3RpbmdUYWcpOworICAgICAgICAgICAgICAgICAgICAvLyBub3RFcGhlbWVyYWwKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBub3RFcGhlbWVyYWwgPSAhc25hcHNob3QuaXNFcGhlbWVyYWwoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gYnlUaW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBieVRpbWVzdGFtcCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZGVyVGhhblRpbWVzdGFtcCA+IDBMKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW50IGNyZWF0ZWRBdCA9IHNuYXBzaG90LmdldENyZWF0ZWRBdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNyZWF0ZWRBdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5VGltZXN0YW1wID0gY3JlYXRlZEF0LmlzQmVmb3JlKEluc3RhbnQub2ZFcG9jaE1pbGxpKG9sZGVyVGhhblRpbWVzdGFtcCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShub3RFcGhlbWVyYWwpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHNob3VsZENsZWFyVGFnKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShieVRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGl2ZUZpbGVGcm9tU25hcHNob3RGaWxlKCkKICAgICB7CiAgICAgICAgIHRlc3RHZXRMaXZlRmlsZUZyb21TbmFwc2hvdEZpbGUoIn4vLmNjbS90ZXN0L25vZGUxL2RhdGEwL3Rlc3Rfa3MvdGJsLWUwM2ZhY2EwODEzMjExZWNhMTAwYzcwNWVhMDliNWVmL3NuYXBzaG90cy8xNjQzNDgxNzM3ODUwL21lLTEtYmlnLURhdGEuZGIiLApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9FbnRpcmVTU1RhYmxlU3RyZWFtaW5nQ29ycmVjdEZpbGVzQ291bnRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL0VudGlyZVNTVGFibGVTdHJlYW1pbmdDb3JyZWN0RmlsZXNDb3VudFRlc3QuamF2YQppbmRleCAzNGNlMDljLi41YThmNGE1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL0VudGlyZVNTVGFibGVTdHJlYW1pbmdDb3JyZWN0RmlsZXNDb3VudFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL0VudGlyZVNTVGFibGVTdHJlYW1pbmdDb3JyZWN0RmlsZXNDb3VudFRlc3QuamF2YQpAQCAtMjEyLDcgKzIxMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVNlc3Npb24uU3RhdGUuSU5JVElBTElaRUQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVNlc3Npb24uU3RhdGUuSU5JVElBTElaRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKSk7CiAKICAgICAgICAgU3RyZWFtU2Vzc2lvbiBzZXNzaW9uID0gc3RyZWFtQ29vcmRpbmF0b3IuZ2V0T3JDcmVhdGVPdXRib3VuZFNlc3Npb24ocGVlcik7CiAgICAgICAgIHNlc3Npb24uaW5pdChmdXR1cmUpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TZXNzaW9uSW5mb1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU2Vzc2lvbkluZm9UZXN0LmphdmEKaW5kZXggNDUxNzJmZS4uNzc4YjZiMiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TZXNzaW9uSW5mb1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1Nlc3Npb25JbmZvVGVzdC5qYXZhCkBAIC00Niw3ICs0Niw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBTdHJlYW1TdW1tYXJ5IHNlbmRpbmcgPSBuZXcgU3RyZWFtU3VtbWFyeSh0YWJsZUlkLCAxMCwgMTAwKTsKLSAgICAgICAgU2Vzc2lvbkluZm8gaW5mbyA9IG5ldyBTZXNzaW9uSW5mbyhsb2NhbCwgMCwgbG9jYWwsIHN1bW1hcmllcywgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHNlbmRpbmcpLCBTdHJlYW1TZXNzaW9uLlN0YXRlLlBSRVBBUklORyk7CisgICAgICAgIFNlc3Npb25JbmZvIGluZm8gPSBuZXcgU2Vzc2lvbkluZm8obG9jYWwsIDAsIGxvY2FsLCBzdW1tYXJpZXMsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihzZW5kaW5nKSwgU3RyZWFtU2Vzc2lvbi5TdGF0ZS5QUkVQQVJJTkcsIG51bGwpOwogCiAgICAgICAgIGFzc2VydCBpbmZvLmdldFRvdGFsRmlsZXNUb1JlY2VpdmUoKSA9PSA0NTsKICAgICAgICAgYXNzZXJ0IGluZm8uZ2V0VG90YWxGaWxlc1RvU2VuZCgpID09IDEwOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1TZXNzaW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1TZXNzaW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZjNmZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbVNlc3Npb25UZXN0LmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZWFtaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVTdG9yZTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5GaWxlQXR0cmlidXRlVmlldzsKK2ltcG9ydCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5GaWxlU3RvcmVBdHRyaWJ1dGVWaWV3OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG5ldC5ieXRlYnVkZHkuQnl0ZUJ1ZGR5OworaW1wb3J0IG5ldC5ieXRlYnVkZHkuYWdlbnQuQnl0ZUJ1ZGR5QWdlbnQ7CitpbXBvcnQgbmV0LmJ5dGVidWRkeS5keW5hbWljLmxvYWRpbmcuQ2xhc3NSZWxvYWRpbmdTdHJhdGVneTsKK2ltcG9ydCBuZXQuYnl0ZWJ1ZGR5LmltcGxlbWVudGF0aW9uLk1ldGhvZERlbGVnYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CisKK2ltcG9ydCBzdGF0aWMgbmV0LmJ5dGVidWRkeS5tYXRjaGVyLkVsZW1lbnRNYXRjaGVycy5uYW1lZDsKK2ltcG9ydCBzdGF0aWMgbmV0LmJ5dGVidWRkeS5tYXRjaGVyLkVsZW1lbnRNYXRjaGVycy50YWtlc0FyZ3VtZW50czsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgU3RyZWFtU2Vzc2lvblRlc3QgZXh0ZW5kcyBDUUxUZXN0ZXIKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBEaXJlY3RvcmllcyBkaXJzOworICAgIHByaXZhdGUgc3RhdGljIERpcmVjdG9yaWVzIGRpcnMyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxGaWxlPiBmaWxlczsKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PERpcmVjdG9yaWVzLkRhdGFEaXJlY3Rvcnk+IGRhdGFkaXJzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzOworICAgIHByaXZhdGUgc3RhdGljIENvbHVtbkZhbWlseVN0b3JlIGNmczI7CisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxGYWtlRmlsZVN0b3JlPiBmaWxlc3RvcmVzID0gTGlzdHMubmV3QXJyYXlMaXN0KG5ldyBGYWtlRmlsZVN0b3JlKCksIG5ldyBGYWtlRmlsZVN0b3JlKCksIG5ldyBGYWtlRmlsZVN0b3JlKCkpOworCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJlZm9yZSgpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgQnl0ZUJ1ZGR5QWdlbnQuaW5zdGFsbCgpOworICAgICAgICBuZXcgQnl0ZUJ1ZGR5KCkucmVkZWZpbmUoQ29sdW1uRmFtaWx5U3RvcmUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgIC5tZXRob2QobmFtZWQoImdldElmRXhpc3RzIikuYW5kKHRha2VzQXJndW1lbnRzKDEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgLmludGVyY2VwdChNZXRob2REZWxlZ2F0aW9uLnRvKEJCS2V5c3BhY2VIZWxwZXIuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAgICAubWFrZSgpCisgICAgICAgICAgICAgICAgICAgICAgIC5sb2FkKENvbHVtbkZhbWlseVN0b3JlLmNsYXNzLmdldENsYXNzTG9hZGVyKCksIENsYXNzUmVsb2FkaW5nU3RyYXRlZ3kuZnJvbUluc3RhbGxlZEFnZW50KCkpOworICAgICAgICBmaWxlcyA9IExpc3RzLm5ld0FycmF5TGlzdChuZXcgRmlsZSgiL3RtcC8xIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCIvdG1wLzIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoIi90bXAvMyIpKTsKKyAgICAgICAgZGF0YWRpcnMgPSBmaWxlcy5zdHJlYW0oKS5tYXAoRGlyZWN0b3JpZXMuRGF0YURpcmVjdG9yeTo6bmV3KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3Iuc2V0TWluRnJlZVNwYWNlUGVyRHJpdmVJbk1lYmlieXRlcygwKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE1heFNwYWNlRm9yQ29tcGFjdGlvbnNQZXJEcml2ZSgxLjApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYmFzaWNEaXNrU3BhY2VUZXN0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiY3JlYXRlIHRhYmxlICVzIChrIGludCBwcmltYXJ5IGtleSwgaSBpbnQpIik7CisgICAgICAgIGRpcnMgPSBuZXcgRGlyZWN0b3JpZXMoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCkubWV0YWRhdGEoKSwgZGF0YWRpcnMpOworICAgICAgICBjZnMgPSBuZXcgTW9ja0NGUyhnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKSwgZGlycyk7CisKKyAgICAgICAgTWFwPFRhYmxlSWQsIExvbmc+IHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBwZXJUYWJsZUlkSW5jb21pbmdCeXRlcy5wdXQoY2ZzLm1ldGFkYXRhLmlkLCA5OTlMKTsKKworICAgICAgICBmaWxlc3RvcmVzLmdldCgwKS51c2FibGVTcGFjZSA9IDMzNDsKKyAgICAgICAgZmlsZXN0b3Jlcy5nZXQoMSkudXNhYmxlU3BhY2UgPSAzMzQ7CisgICAgICAgIGZpbGVzdG9yZXMuZ2V0KDIpLnVzYWJsZVNwYWNlID0gMzM0OworCisgICAgICAgIEtleXNwYWNlLmFsbCgpLmZvckVhY2goa3MgLT4ga3MuZ2V0Q29sdW1uRmFtaWx5U3RvcmVzKCkuZm9yRWFjaChDb2x1bW5GYW1pbHlTdG9yZTo6ZGlzYWJsZUF1dG9Db21wYWN0aW9uKSk7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgICAgICB9IHdoaWxlICghQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmdldENvbXBhY3Rpb25zKCkuaXNFbXB0eSgpKTsKKworICAgICAgICBhc3NlcnRUcnVlKFN0cmVhbVNlc3Npb24uY2hlY2tEaXNrU3BhY2UocGVyVGFibGVJZEluY29taW5nQnl0ZXMsIG5leHRUaW1lVVVJRCgpLCBmaWxlc3RvcmVNYXBwZXIpKTsKKworICAgICAgICBmaWxlc3RvcmVzLmdldCgwKS51c2FibGVTcGFjZSA9IDMzMjsKKyAgICAgICAgYXNzZXJ0RmFsc2UoU3RyZWFtU2Vzc2lvbi5jaGVja0Rpc2tTcGFjZShwZXJUYWJsZUlkSW5jb21pbmdCeXRlcywgbmV4dFRpbWVVVUlEKCksIGZpbGVzdG9yZU1hcHBlcikpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtdWx0aVRhYmxlRGlza1NwYWNlVGVzdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgY3JlYXRlVGFibGUoImNyZWF0ZSB0YWJsZSAlcyAoayBpbnQgcHJpbWFyeSBrZXksIGkgaW50KSIpOworICAgICAgICBkaXJzID0gbmV3IERpcmVjdG9yaWVzKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLm1ldGFkYXRhKCksIGRhdGFkaXJzLnN1Ykxpc3QoMCwyKSk7CisgICAgICAgIGNmcyA9IG5ldyBNb2NrQ0ZTKGdldEN1cnJlbnRDb2x1bW5GYW1pbHlTdG9yZSgpLCBkaXJzKTsKKyAgICAgICAgY3JlYXRlVGFibGUoImNyZWF0ZSB0YWJsZSAlcyAoayBpbnQgcHJpbWFyeSBrZXksIGkgaW50KSIpOworICAgICAgICBkaXJzMiA9IG5ldyBEaXJlY3RvcmllcyhnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKS5tZXRhZGF0YSgpLCBkYXRhZGlycy5zdWJMaXN0KDEsMykpOworICAgICAgICBjZnMyID0gbmV3IE1vY2tDRlMoZ2V0Q3VycmVudENvbHVtbkZhbWlseVN0b3JlKCksIGRpcnMyKTsKKworICAgICAgICBNYXA8VGFibGVJZCwgTG9uZz4gcGVyVGFibGVJZEluY29taW5nQnl0ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIC8vIGNmcyBoYXMgZGF0YWRpcnMgMCwgMQorICAgICAgICAvLyBjZnMyIGhhcyBkYXRhZGlycyAxLCAyCisgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCB0aGUgZGF0YWRpciAxIHdpbGwgZ2V0IDEwMDAgYnl0ZXMgc3RyZWFtZWQsIGFuZCB0aGUgb3RoZXIgZGRpcnMgNTAwYnl0ZXM6CisgICAgICAgIHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLnB1dChjZnMubWV0YWRhdGEuaWQsIDEwMDBMKTsKKyAgICAgICAgcGVyVGFibGVJZEluY29taW5nQnl0ZXMucHV0KGNmczIubWV0YWRhdGEuaWQsIDEwMDBMKTsKKworICAgICAgICBmaWxlc3RvcmVzLmdldCgwKS51c2FibGVTcGFjZSA9IDUwMTsKKyAgICAgICAgZmlsZXN0b3Jlcy5nZXQoMSkudXNhYmxlU3BhY2UgPSAxMDAxOworICAgICAgICBmaWxlc3RvcmVzLmdldCgyKS51c2FibGVTcGFjZSA9IDUwMTsKKworICAgICAgICBLZXlzcGFjZS5hbGwoKS5mb3JFYWNoKGtzIC0+IGtzLmdldENvbHVtbkZhbWlseVN0b3JlcygpLmZvckVhY2goQ29sdW1uRmFtaWx5U3RvcmU6OmRpc2FibGVBdXRvQ29tcGFjdGlvbikpOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgfSB3aGlsZSAoIUNvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5nZXRDb21wYWN0aW9ucygpLmlzRW1wdHkoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShTdHJlYW1TZXNzaW9uLmNoZWNrRGlza1NwYWNlKHBlclRhYmxlSWRJbmNvbWluZ0J5dGVzLCBuZXh0VGltZVVVSUQoKSwgZmlsZXN0b3JlTWFwcGVyKSk7CisKKyAgICAgICAgZmlsZXN0b3Jlcy5nZXQoMSkudXNhYmxlU3BhY2UgPSA5OTk7CisgICAgICAgIGFzc2VydEZhbHNlKFN0cmVhbVNlc3Npb24uY2hlY2tEaXNrU3BhY2UocGVyVGFibGVJZEluY29taW5nQnl0ZXMsIG5leHRUaW1lVVVJRCgpLCBmaWxlc3RvcmVNYXBwZXIpKTsKKworICAgIH0KKworICAgIHN0YXRpYyBGdW5jdGlvbjxGaWxlLCBGaWxlU3RvcmU+IGZpbGVzdG9yZU1hcHBlciA9IChmKSAtPiB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChmLnRvUGF0aCgpLnN0YXJ0c1dpdGgoZmlsZXMuZ2V0KGkpLnRvUGF0aCgpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmlsZXN0b3Jlcy5nZXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkJhZCBmaWxlOiAiK2YpOworICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrQ0ZTIGV4dGVuZHMgQ29sdW1uRmFtaWx5U3RvcmUKKyAgICB7CisgICAgICAgIE1vY2tDRlMoQ29sdW1uRmFtaWx5U3RvcmUgY2ZzLCBEaXJlY3RvcmllcyBkaXJzKQorICAgICAgICB7CisgICAgICAgICAgICBzdXBlcihjZnMua2V5c3BhY2UsIGNmcy5nZXRUYWJsZU5hbWUoKSwgVXRpbC5uZXdTZXFHZW4oKSwgY2ZzLm1ldGFkYXRhLCBkaXJzLCBmYWxzZSwgZmFsc2UsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcmV0dXJuIG91ciBtb2NrZWQgdGFibGVzOgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQkJLZXlzcGFjZUhlbHBlcgorICAgIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBDb2x1bW5GYW1pbHlTdG9yZSBnZXRJZkV4aXN0cyhUYWJsZUlkIGlkKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaWQgPT0gY2ZzLm1ldGFkYXRhLmlkKQorICAgICAgICAgICAgICAgIHJldHVybiBjZnM7CisgICAgICAgICAgICByZXR1cm4gY2ZzMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFrZUZpbGVTdG9yZSBleHRlbmRzIEZpbGVTdG9yZQorICAgIHsKKyAgICAgICAgcHVibGljIGxvbmcgdXNhYmxlU3BhY2U7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFVzYWJsZVNwYWNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHVzYWJsZVNwYWNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHtyZXR1cm4gbnVsbDt9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHR5cGUoKSB7cmV0dXJuIG51bGw7fQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHtyZXR1cm4gZmFsc2U7fQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0VG90YWxTcGFjZSgpIHtyZXR1cm4gMDt9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRVbmFsbG9jYXRlZFNwYWNlKCkge3JldHVybiAwO30KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRmlsZUF0dHJpYnV0ZVZpZXcoQ2xhc3M8PyBleHRlbmRzIEZpbGVBdHRyaWJ1dGVWaWV3PiB0eXBlKSB7cmV0dXJuIGZhbHNlO30KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzRmlsZUF0dHJpYnV0ZVZpZXcoU3RyaW5nIG5hbWUpIHtyZXR1cm4gZmFsc2U7fQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxWIGV4dGVuZHMgRmlsZVN0b3JlQXR0cmlidXRlVmlldz4gViBnZXRGaWxlU3RvcmVBdHRyaWJ1dGVWaWV3KENsYXNzPFY+IHR5cGUpIHtyZXR1cm4gbnVsbDt9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlKSB0aHJvd3MgSU9FeGNlcHRpb24ge3JldHVybiBudWxsO30KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbWluZ1RyYW5zZmVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9TdHJlYW1pbmdUcmFuc2ZlclRlc3QuamF2YQppbmRleCBjZmZkM2IyLi4wNTI3NjQ4IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZWFtaW5nL1N0cmVhbWluZ1RyYW5zZmVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvU3RyZWFtaW5nVHJhbnNmZXJUZXN0LmphdmEKQEAgLTI2LDYgKzI2LDcgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRnV0dXJlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTW9yZUV4ZWN1dG9yczsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LmJpZy5CaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5SYW5nZXNBdEVuZHBvaW50OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTM0MSwxMyArMzQyLDEzIEBACiAKICAgICAgICAgLy8gYWRkIGNvbHVtbnMgb2Ygc2l6ZSBzbGlnaHRseSBsZXNzIHRoYW4gY29sdW1uX2luZGV4X3NpemUgdG8gZm9yY2UgaW5zZXJ0IGNvbHVtbiBpbmRleAogICAgICAgICB1cGRhdGVzLmNsdXN0ZXJpbmcoMSkKLSAgICAgICAgICAgICAgICAuYWRkKCJ2YWwiLCBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZSgpIC0gNjRdKSkKKyAgICAgICAgICAgICAgICAuYWRkKCJ2YWwiLCBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbRGF0YWJhc2VEZXNjcmlwdG9yLmdldENvbHVtbkluZGV4U2l6ZShCaWdGb3JtYXRQYXJ0aXRpb25Xcml0ZXIuREVGQVVMVF9HUkFOVUxBUklUWSkgLSA2NF0pKQogICAgICAgICAgICAgICAgIC5idWlsZCgpCiAgICAgICAgICAgICAgICAgLmFwcGx5KCk7CiAKICAgICAgICAgdXBkYXRlcyA9IG5ldyBSb3dVcGRhdGVCdWlsZGVyKGNmcy5tZXRhZGF0YSgpLCBGQlV0aWxpdGllcy50aW1lc3RhbXBNaWNyb3MoKSwga2V5KTsKICAgICAgICAgdXBkYXRlcy5jbHVzdGVyaW5nKDYpCi0gICAgICAgICAgICAgICAgLmFkZCgidmFsIiwgQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlW0RhdGFiYXNlRGVzY3JpcHRvci5nZXRDb2x1bW5JbmRleFNpemUoKV0pKQorICAgICAgICAgICAgICAgIC5hZGQoInZhbCIsIEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtEYXRhYmFzZURlc2NyaXB0b3IuZ2V0Q29sdW1uSW5kZXhTaXplKEJpZ0Zvcm1hdFBhcnRpdGlvbldyaXRlci5ERUZBVUxUX0dSQU5VTEFSSVRZKV0pKQogICAgICAgICAgICAgICAgIC5idWlsZCgpCiAgICAgICAgICAgICAgICAgLmFwcGx5KCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlYW1pbmcvY29tcHJlc3Npb24vQ29tcHJlc3NlZElucHV0U3RyZWFtVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9jb21wcmVzc2lvbi9Db21wcmVzc2VkSW5wdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggNjE5ZTBkOS4uMzkxZDU4OSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9jb21wcmVzc2lvbi9Db21wcmVzc2VkSW5wdXRTdHJlYW1UZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVhbWluZy9jb21wcmVzc2lvbi9Db21wcmVzc2VkSW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTE3LDE0ICsxNywxNCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVhbWluZy5jb21wcmVzc2lvbjsKIAotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5EYXRhSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5FT0ZFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNlcXVlbmNlQmFzZWRTU1RhYmxlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuUnVsZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTMzLDE4ICszMywyMSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0NvbXBhcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlc1R5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuc3RyZWFtaW5nLkNvbXByZXNzZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5zdHJlYW1pbmcuQ29tcHJlc3Npb25JbmZvOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLmNvbXByZXNzLkNvbXByZXNzaW9uTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2VxdWVuY2VCYXNlZFNTVGFibGVJZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5Db21wcmVzc2lvbkluZm9Db21wb25lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzLkRhdGFJbnB1dFN0cmVhbVBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5SYW5kb21BY2Nlc3NSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5TZXF1ZW50aWFsV3JpdGVyT3B0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5Db21wcmVzc2lvblBhcmFtczsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5tZXRhZGF0YS5NZXRhZGF0YUNvbGxlY3RvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5zdHJlYW1pbmcuQ29tcHJlc3NlZElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnN0cmVhbWluZy5Db21wcmVzc2lvbkluZm87CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2hlY2tzdW1UeXBlOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwpAQCAtMTIxLDEyICsxMjQsMTIgQEAKICAgICAgICAgLy8gd3JpdGUgY29tcHJlc3NlZCBkYXRhIGZpbGUgb2YgbG9uZ3MKICAgICAgICAgRmlsZSBwYXJlbnREaXIgPSBuZXcgRmlsZSh0ZW1wRm9sZGVyLm5ld0ZvbGRlcigpKTsKICAgICAgICAgRGVzY3JpcHRvciBkZXNjID0gbmV3IERlc2NyaXB0b3IocGFyZW50RGlyLCAia3MiLCAiY2YiLCBuZXcgU2VxdWVuY2VCYXNlZFNTVGFibGVJZCgxKSk7Ci0gICAgICAgIEZpbGUgdG1wID0gbmV3IEZpbGUoZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuREFUQSkpOworICAgICAgICBGaWxlIHRtcCA9IGRlc2MuZmlsZUZvcihDb21wb25lbnRzLkRBVEEpOwogICAgICAgICBNZXRhZGF0YUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgTWV0YWRhdGFDb2xsZWN0b3IobmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKEJ5dGVzVHlwZS5pbnN0YW5jZSkpOwogICAgICAgICBDb21wcmVzc2lvblBhcmFtcyBwYXJhbSA9IENvbXByZXNzaW9uUGFyYW1zLnNuYXBweSgzMiwgbWluQ29tcHJlc3NSYXRpbyk7CiAgICAgICAgIE1hcDxMb25nLCBMb25nPiBpbmRleCA9IG5ldyBIYXNoTWFwPExvbmcsIExvbmc+KCk7CiAgICAgICAgIHRyeSAoQ29tcHJlc3NlZFNlcXVlbnRpYWxXcml0ZXIgd3JpdGVyID0gbmV3IENvbXByZXNzZWRTZXF1ZW50aWFsV3JpdGVyKHRtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5maWxlbmFtZUZvcihDb21wb25lbnQuQ09NUFJFU1NJT05fSU5GTyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MuZmlsZUZvcihDb21wb25lbnRzLkNPTVBSRVNTSU9OX0lORk8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW50aWFsV3JpdGVyT3B0aW9uLkRFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLCBjb2xsZWN0b3IpKQpAQCAtMTM5LDcgKzE0Miw3IEBACiAgICAgICAgICAgICB3cml0ZXIuZmluaXNoKCk7CiAgICAgICAgIH0KIAotICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXAgPSBDb21wcmVzc2lvbk1ldGFkYXRhLmNyZWF0ZSh0bXAuYWJzb2x1dGVQYXRoKCkpOworICAgICAgICBDb21wcmVzc2lvbk1ldGFkYXRhIGNvbXAgPSBDb21wcmVzc2lvbkluZm9Db21wb25lbnQubG9hZChkZXNjKTsKICAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyLlBhcnRpdGlvblBvc2l0aW9uQm91bmRzPiBzZWN0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBmb3IgKGxvbmcgbCA6IHZhbHVlc1RvQ2hlY2spCiAgICAgICAgIHsKQEAgLTE4NCw3ICsxODcsNyBAQAogICAgICAgICAgICAgdGVzdEV4Y2VwdGlvbihzZWN0aW9ucywgaW5mbyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgQ29tcHJlc3NlZElucHV0U3RyZWFtIGlucHV0ID0gbmV3IENvbXByZXNzZWRJbnB1dFN0cmVhbShuZXcgRGF0YUlucHV0U3RyZWFtUGx1cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odG9SZWFkKSksIGluZm8sIENoZWNrc3VtVHlwZS5DUkMzMiwgKCkgLT4gMS4wKTsKKyAgICAgICAgQ29tcHJlc3NlZElucHV0U3RyZWFtIGlucHV0ID0gbmV3IENvbXByZXNzZWRJbnB1dFN0cmVhbShuZXcgRGF0YUlucHV0QnVmZmVyKHRvUmVhZCksIGluZm8sIENoZWNrc3VtVHlwZS5DUkMzMiwgKCkgLT4gMS4wKTsKIAogICAgICAgICB0cnkgKERhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaW5wdXQpKQogICAgICAgICB7CkBAIC0xOTksNyArMjAyLDcgQEAKIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEV4Y2VwdGlvbihMaXN0PFNTVGFibGVSZWFkZXIuUGFydGl0aW9uUG9zaXRpb25Cb3VuZHM+IHNlY3Rpb25zLCBDb21wcmVzc2lvbkluZm8gaW5mbykgdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgewotICAgICAgICBDb21wcmVzc2VkSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQ29tcHJlc3NlZElucHV0U3RyZWFtKG5ldyBEYXRhSW5wdXRTdHJlYW1QbHVzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpLCBpbmZvLCBDaGVja3N1bVR5cGUuQ1JDMzIsICgpIC0+IDEuMCk7CisgICAgICAgIENvbXByZXNzZWRJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBDb21wcmVzc2VkSW5wdXRTdHJlYW0obmV3IERhdGFJbnB1dEJ1ZmZlcihuZXcgYnl0ZVswXSksIGluZm8sIENoZWNrc3VtVHlwZS5DUkMzMiwgKCkgLT4gMS4wKTsKIAogICAgICAgICB0cnkgKERhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0oaW5wdXQpKQogICAgICAgICB7CkBAIC0yMTgsNCArMjIxLDMgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL0J1bGtMb2FkZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvQnVsa0xvYWRlclRlc3QuamF2YQppbmRleCA1MDdhYTUzLi5mYjA4OTcxIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvQnVsa0xvYWRlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvQnVsa0xvYWRlclRlc3QuamF2YQpAQCAtMzksNyArMzksOCBAQAogICAgICAgICAKICAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQobmV3IFN0cmluZ1tdIHsgIk9iamVjdENsZWFuZXJUaHJlYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2h1dGRvd24tY2hlY2tlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbHVzdGVyWzAtOV0tY29ubmVjdGlvbi1yZWFwZXItWzAtOV0iIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2x1c3RlclswLTldLWNvbm5lY3Rpb24tcmVhcGVyLVswLTldIiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CkBAIC02NSw3ICs2NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xvYmFsRXZlbnRFeGVjdXRvci1bMS05XS1bMS05XSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbG9iYWxFdmVudEV4ZWN1dG9yLVsxLTldLVsxLTldIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNodXRkb3duLWNoZWNrZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2x1c3RlclswLTldLWNvbm5lY3Rpb24tcmVhcGVyLVswLTldIiB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsdXN0ZXJbMC05XS1jb25uZWN0aW9uLXJlYXBlci1bMC05XSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRhY2ggTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2VzcyByZWFwZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSk5BIENsZWFuZXIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICBhc3NlcnRTY2hlbWFOb3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0Q0xTTU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRTeXN0ZW1LU05vdExvYWRlZCgpOwpAQCAtOTMsMTEgKzk4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbG9iYWxFdmVudEV4ZWN1dG9yLVsxLTldLVsxLTldIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdsb2JhbEV2ZW50RXhlY3V0b3ItWzEtOV0tWzEtOV0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2h1dGRvd24tY2hlY2tlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjbHVzdGVyWzAtOV0tY29ubmVjdGlvbi1yZWFwZXItWzAtOV0iIH0pOwotICAgICAgICBhc3NlcnRTY2hlbWFOb3RMb2FkZWQoKTsKLSAgICAgICAgYXNzZXJ0Q0xTTU5vdExvYWRlZCgpOwotICAgICAgICBhc3NlcnRTeXN0ZW1LU05vdExvYWRlZCgpOwotICAgICAgICBhc3NlcnRLZXlzcGFjZU5vdExvYWRlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2x1c3RlclswLTldLWNvbm5lY3Rpb24tcmVhcGVyLVswLTldIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dGFjaCBMaXN0ZW5lciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9jZXNzIHJlYXBlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKTkEgQ2xlYW5lciJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7CisgICAgYXNzZXJ0Q0xTTU5vdExvYWRlZCgpOworICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CisgICAgYXNzZXJ0S2V5c3BhY2VOb3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U2VydmVyTm90TG9hZGVkKCk7CiAgICAgfQogCkBAIC0xMjEsMTAgKzEzMCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2xvYmFsRXZlbnRFeGVjdXRvci1bMS05XS1bMS05XSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbG9iYWxFdmVudEV4ZWN1dG9yLVsxLTldLVsxLTldIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNodXRkb3duLWNoZWNrZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2x1c3RlclswLTldLWNvbm5lY3Rpb24tcmVhcGVyLVswLTldIiB9KTsKLSAgICAgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7Ci0gICAgICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKLSAgICAgICAgYXNzZXJ0U3lzdGVtS1NOb3RMb2FkZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsdXN0ZXJbMC05XS1jb25uZWN0aW9uLXJlYXBlci1bMC05XSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRhY2ggTGlzdGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvY2VzcyByZWFwZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSk5BIENsZWFuZXIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOworICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKKyAgICBhc3NlcnRTeXN0ZW1LU05vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRLZXlzcGFjZU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRTZXJ2ZXJOb3RMb2FkZWQoKTsKICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvR2V0VmVyc2lvblRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9HZXRWZXJzaW9uVGVzdC5qYXZhCmluZGV4IDllYWY1N2YuLmIzZGRiNTggMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9HZXRWZXJzaW9uVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9HZXRWZXJzaW9uVGVzdC5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiAgICAgewogICAgICAgICBUb29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKEdldFZlcnNpb24uY2xhc3MpOwogICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7Ci0gICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwpOworICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvSk1YQ29tcGF0YWJpbGl0eVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9KTVhDb21wYXRhYmlsaXR5VGVzdC5qYXZhCmluZGV4IGVkZTNkNmMuLjU5NDg1ZGUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9KTVhDb21wYXRhYmlsaXR5VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9KTVhDb21wYXRhYmlsaXR5VGVzdC5qYXZhCkBAIC0xOCwzMyArMTgsMzUgQEAKIAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29sczsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQ2xhc3NSdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5UZW1wb3JhcnlGb2xkZXI7CiAKIGltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuU2ltcGxlU3RhdGVtZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYnRpLkJ0aUZvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNhc3NhbmRyYURhZW1vbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkdDSW5zcGVjdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXIuVG9vbFJlc3VsdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiAKK2ltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0cy5uZXdBcnJheUxpc3Q7CisKIC8qKgogICogVGhpcyBjbGFzcyBpcyB0byBtb25pdG9yIHRoZSBKTVggY29tcGF0YWJpbGl0eSBjcm9zcyBkaWZmZXJlbnQgdmVyc2lvbnMsIGFuZCByZWxpZXMgb24gYSBnb2xkIHNldCBvZiBtZXRyaWNzIHdoaWNoCiAgKiB3ZXJlIGdlbmVyYXRlZCBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9ucyBiZWxvdy4gIFRoZXNlIHRlc3RzIG9ubHkgY2hlY2sgZm9yIGJyZWFraW5nIGNoYW5nZXMsIHNvIHdpbGwgaWdub3JlIGFueQogICogbmV3IG1ldHJpY3MgYWRkZWQgaW4gYSByZWxlYXNlLiAgSWYgdGhlIGxhdGVzdCByZWxlYXNlIGlzIG5vdCBmaW5hbGl6ZWQgeWV0IHRoZW4gdGhlIGxhdGVzdCB2ZXJzaW9uIG1pZ2h0IGZhaWwKICAqIGlmIGEgdW5yZWxlc2VkIG1ldHJpYyBnZXRzIHJlbmFtZWQsIGlmIHRoaXMgaGFwcGVucyB0aGVuIHRoZSBnb2xkIHNldCBzaG91bGQgYmUgdXBkYXRlZCBmb3IgdGhlIGxhdGVzdCB2ZXJzaW9uLgotICoKKyAqIDxwPgogICogSWYgYSB0ZXN0IGZhaWxzIGZvciBhIHByZXZpb3VzIHZlcnNpb24sIHRoZW4gdGhpcyBtZWFucyB3ZSBoYXZlIGEgSk1YIGNvbXBhdGFiaWxpdHkgcmVncmVzc2lvbiwgaWYgdGhlIG1ldHJpYyBoYXMKICAqIGdvbmUgdGhyb3VnaCBwcm9wZXIgZGVwcmVjYXRpb24gdGhlbiB0aGUgbWV0cmljIGNhbiBiZSBleGNsdWRlZCB1c2luZyB0aGUgcGF0dGVybnMgdXNlZCBpbiBvdGhlciB0ZXN0cywgaWYgdGhlIG1ldHJpYwogICogaGFzIG5vdCBnb25lIHRocm91Z2ggcHJvcGVyIGRlcHJlY2F0aW9uIHRoZW4gdGhlIGNoYW5nZSBzaG91bGQgYmUgbG9va2VkIGF0IG1vcmUgY2FyZnVseSB0byBhdm9pZCBicmVha2luZyB1c2Vycy4KLSAqCisgKiA8cD4KICAqIEluIG9yZGVyIHRvIGdlbmVyYXRlIHRoZSBkdW1wIGZvciBhbm90aGVyIHZlcnNpb24sIGxhdW5jaCBhIGNsdXN0ZXIgdGhlbiBydW4gdGhlIGZvbGxvd2luZwogICoge0Bjb2RlCiAgKiBjcmVhdGUga2V5c3BhY2UgY3FsX3Rlc3Rfa2V5c3BhY2UgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogJzEnfTsKQEAgLTY0LDYgKzY2LDkgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuZGFlbW9uSW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldENvbHVtbkluZGV4U2l6ZUluS2lCKDApOyAvLyBtYWtlIHN1cmUgdGhlIGNvbHVtbiBpbmRleCBpcyBjcmVhdGVkCisKICAgICAgICAgc3RhcnRKTVhTZXJ2ZXIoKTsKICAgICB9CiAKQEAgLTkwLDcyICs5NSw4OSBAQAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgZGlmZjMwKCkgdGhyb3dzIFRocm93YWJsZQogICAgIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVPYmplY3RzID0gQXJyYXlzLmFzTGlzdCgib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPVRocmVhZFBvb2xzLioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbnRlcm5hbDouKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1Ecm9wcGVkTWVzc2FnZS4qIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUNsaWVudFJlcXVlc3Qsc2NvcGU9Q0FTUmVhZCxuYW1lPUNvbmRpdGlvbk5vdE1ldCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1DbGllbnQsbmFtZT1jb25uZWN0ZWRUaHJpZnRDbGllbnRzIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTExMTUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEucmVxdWVzdDp0eXBlPVJlYWRSZXBhaXJTdGFnZSIsIC8vIHJlbW92ZWQgaW4gQ0FTU0FORFJBLTEzOTEwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOnR5cGU9SGludGVkSGFuZG9mZk1hbmFnZXIiLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xNTkzOQorICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZU9iamVjdHMgPSBuZXdBcnJheUxpc3QoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1UaHJlYWRQb29scy4qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbnRlcm5hbDouKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPURyb3BwZWRNZXNzYWdlLioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1DbGllbnRSZXF1ZXN0LHNjb3BlPUNBU1JlYWQsbmFtZT1Db25kaXRpb25Ob3RNZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1DbGllbnQsbmFtZT1jb25uZWN0ZWRUaHJpZnRDbGllbnRzIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTExMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5yZXF1ZXN0OnR5cGU9UmVhZFJlcGFpclN0YWdlIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTM5MTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPUhpbnRlZEhhbmRvZmZNYW5hZ2VyIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTU5MzkKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3BwZWQgdGFibGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1UYWJsZSxrZXlzcGFjZT1zeXN0ZW0sc2NvcGU9KHNjaGVtYV9hZ2dyZWdhdGVzfHNjaGVtYV9jb2x1bW5mYW1pbGllc3xzY2hlbWFfY29sdW1uc3xzY2hlbWFfZnVuY3Rpb25zfHNjaGVtYV9rZXlzcGFjZXN8c2NoZW1hX3RyaWdnZXJzfHNjaGVtYV91c2VydHlwZXMpLG5hbWU9LioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuKmtleXNwYWNlPXN5c3RlbSwoc2NvcGV8dGFibGV8Y29sdW1uZmFtaWx5KT12aWV3c19idWlsZHNfaW5fcHJvZ3Jlc3MuKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qa2V5c3BhY2U9c3lzdGVtLChzY29wZXx0YWJsZXxjb2x1bW5mYW1pbHkpPXJhbmdlX3hmZXJzLioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuKmtleXNwYWNlPXN5c3RlbSwoc2NvcGV8dGFibGV8Y29sdW1uZmFtaWx5KT1oaW50cy4qIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiprZXlzcGFjZT1zeXN0ZW0sKHNjb3BlfHRhYmxlfGNvbHVtbmZhbWlseSk9YmF0Y2hsb2cuKiIpOwotICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZUF0dHJpYnV0ZXMgPSBBcnJheXMuYXNMaXN0KCJSUENTZXJ2ZXJSdW5uaW5nIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTExMTUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWF4TmF0aXZlUHJvdG9jb2xWZXJzaW9uIik7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlT3BlcmF0aW9ucyA9IEFycmF5cy5hc0xpc3QoInN0YXJ0UlBDU2VydmVyIiwgInN0b3BSUENTZXJ2ZXIiLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xMTExNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vZGV0b29sIGFwaXMgdGhhdCB3ZXJlIGNoYW5nZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlY29tbWlzc2lvbiIsIC8vIC0+IGRlY29tbWlzc2lvbihib29sZWFuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JjZVJlcGFpckFzeW5jIiwgLy8gLT4gcmVwYWlyQXN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yY2VSZXBhaXJSYW5nZUFzeW5jIiwgLy8gLT4gcmVwYWlyQXN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVnaW5Mb2NhbFNhbXBsaW5nIiwgLy8gLT4gYmVnaW5Mb2NhbFNhbXBsaW5nKHAxOiBqYXZhLmxhbmcuU3RyaW5nLCBwMjogaW50LCBwMzogaW50KTogdm9pZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaW5pc2hMb2NhbFNhbXBsaW5nIiAvLyAtPiBmaW5pc2hMb2NhbFNhbXBsaW5nKHAxOiBqYXZhLmxhbmcuU3RyaW5nLCBwMjogaW50KTogamF2YS51dGlsLkxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRyb3BwZWQgdGFibGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPVRhYmxlLGtleXNwYWNlPXN5c3RlbSxzY29wZT0oc2NoZW1hX2FnZ3JlZ2F0ZXN8c2NoZW1hX2NvbHVtbmZhbWlsaWVzfHNjaGVtYV9jb2x1bW5zfHNjaGVtYV9mdW5jdGlvbnN8c2NoZW1hX2tleXNwYWNlc3xzY2hlbWFfdHJpZ2dlcnN8c2NoZW1hX3VzZXJ0eXBlcyksbmFtZT0uKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiprZXlzcGFjZT1zeXN0ZW0sKHNjb3BlfHRhYmxlfGNvbHVtbmZhbWlseSk9dmlld3NfYnVpbGRzX2luX3Byb2dyZXNzLioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qa2V5c3BhY2U9c3lzdGVtLChzY29wZXx0YWJsZXxjb2x1bW5mYW1pbHkpPXJhbmdlX3hmZXJzLioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qa2V5c3BhY2U9c3lzdGVtLChzY29wZXx0YWJsZXxjb2x1bW5mYW1pbHkpPWhpbnRzLioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qa2V5c3BhY2U9c3lzdGVtLChzY29wZXx0YWJsZXxjb2x1bW5mYW1pbHkpPWJhdGNobG9nLioiKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVBdHRyaWJ1dGVzID0gbmV3QXJyYXlMaXN0KCJSUENTZXJ2ZXJSdW5uaW5nIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTExMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXhOYXRpdmVQcm90b2NvbFZlcnNpb24iKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVPcGVyYXRpb25zID0gbmV3QXJyYXlMaXN0KCJzdGFydFJQQ1NlcnZlciIsICJzdG9wUlBDU2VydmVyIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTExMTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vZGV0b29sIGFwaXMgdGhhdCB3ZXJlIGNoYW5nZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVjb21taXNzaW9uIiwgLy8gLT4gZGVjb21taXNzaW9uKGJvb2xlYW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yY2VSZXBhaXJBc3luYyIsIC8vIC0+IHJlcGFpckFzeW5jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yY2VSZXBhaXJSYW5nZUFzeW5jIiwgLy8gLT4gcmVwYWlyQXN5bmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWdpbkxvY2FsU2FtcGxpbmciLCAvLyAtPiBiZWdpbkxvY2FsU2FtcGxpbmcocDE6IGphdmEubGFuZy5TdHJpbmcsIHAyOiBpbnQsIHAzOiBpbnQpOiB2b2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmluaXNoTG9jYWxTYW1wbGluZyIgLy8gLT4gZmluaXNoTG9jYWxTYW1wbGluZyhwMTogamF2YS5sYW5nLlN0cmluZywgcDI6IGludCk6IGphdmEudXRpbC5MaXN0CiAgICAgICAgICk7CiAKKyAgICAgICAgaWYgKEJ0aUZvcm1hdC5pc1NlbGVjdGVkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4Y2x1ZGVPYmplY3RzLmFkZCgib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPShDb2x1bW5GYW1pbHl8S2V5c3BhY2V8VGFibGUpLiosbmFtZT1JbmRleFN1bW1hcnkuKiIpOyAvLyAtPiB3aGVuIEJUSSBmb3JtYXQgaXMgdXNlZCwgaW5kZXggc3VtbWFyeSBpcyBub3QgdXNlZCAoQ0FTU0FORFJBLTE3MDU2KQorICAgICAgICB9CisKICAgICAgICAgZGlmZihleGNsdWRlT2JqZWN0cywgZXhjbHVkZUF0dHJpYnV0ZXMsIGV4Y2x1ZGVPcGVyYXRpb25zLCAidGVzdC9kYXRhL2pteGR1bXAvY2Fzc2FuZHJhLTMuMC1qbXgueWFtbCIpOwogICAgIH0KIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgZGlmZjMxMSgpIHRocm93cyBUaHJvd2FibGUKICAgICB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlT2JqZWN0cyA9IEFycmF5cy5hc0xpc3QoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1UaHJlYWRQb29scy4qIiwgLy9sYXp5IGluaXRpYWxpemF0aW9uIGluIDQuMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbnRlcm5hbDouKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1Ecm9wcGVkTWVzc2FnZSxzY29wZT1QQUdFRF9SQU5HRS4qIiwgLy9pdCB3YXMgZGVwcmVjYXRlZCBpbiB0aGUgcHJldmlvdXMgbWFqb3IgdmVyc2lvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9Q2xpZW50LG5hbWU9Y29ubmVjdGVkVGhyaWZ0Q2xpZW50cyIsIC8vIHJlbW92ZWQgaW4gQ0FTU0FORFJBLTExMTE1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcXVlc3Q6dHlwZT1SZWFkUmVwYWlyU3RhZ2UiLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xMzkxMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYjp0eXBlPUhpbnRlZEhhbmRvZmZNYW5hZ2VyIiwgLy8gcmVtb3ZlZCBpbiBDQVNTQU5EUkEtMTU5MzkKKyAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVPYmplY3RzID0gbmV3QXJyYXlMaXN0KCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9VGhyZWFkUG9vbHMuKiIsIC8vbGF6eSBpbml0aWFsaXphdGlvbiBpbiA0LjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5pbnRlcm5hbDouKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPURyb3BwZWRNZXNzYWdlLHNjb3BlPVBBR0VEX1JBTkdFLioiLCAvL2l0IHdhcyBkZXByZWNhdGVkIGluIHRoZSBwcmV2aW91cyBtYWpvciB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUNsaWVudCxuYW1lPWNvbm5lY3RlZFRocmlmdENsaWVudHMiLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xMTExNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLnJlcXVlc3Q6dHlwZT1SZWFkUmVwYWlyU3RhZ2UiLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xMzkxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiOnR5cGU9SGludGVkSGFuZG9mZk1hbmFnZXIiLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xNTkzOQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcHBlZCB0YWJsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPVRhYmxlLGtleXNwYWNlPXN5c3RlbSxzY29wZT0oc2NoZW1hX2FnZ3JlZ2F0ZXN8c2NoZW1hX2NvbHVtbmZhbWlsaWVzfHNjaGVtYV9jb2x1bW5zfHNjaGVtYV9mdW5jdGlvbnN8c2NoZW1hX2tleXNwYWNlc3xzY2hlbWFfdHJpZ2dlcnN8c2NoZW1hX3VzZXJ0eXBlcyksbmFtZT0uKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qa2V5c3BhY2U9c3lzdGVtLChzY29wZXx0YWJsZXxjb2x1bW5mYW1pbHkpPXZpZXdzX2J1aWxkc19pbl9wcm9ncmVzcy4qIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiprZXlzcGFjZT1zeXN0ZW0sKHNjb3BlfHRhYmxlfGNvbHVtbmZhbWlseSk9cmFuZ2VfeGZlcnMuKiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qa2V5c3BhY2U9c3lzdGVtLChzY29wZXx0YWJsZXxjb2x1bW5mYW1pbHkpPWhpbnRzLioiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuKmtleXNwYWNlPXN5c3RlbSwoc2NvcGV8dGFibGV8Y29sdW1uZmFtaWx5KT1iYXRjaGxvZy4qIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHJvcHBlZCB0YWJsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9VGFibGUsa2V5c3BhY2U9c3lzdGVtLHNjb3BlPShzY2hlbWFfYWdncmVnYXRlc3xzY2hlbWFfY29sdW1uZmFtaWxpZXN8c2NoZW1hX2NvbHVtbnN8c2NoZW1hX2Z1bmN0aW9uc3xzY2hlbWFfa2V5c3BhY2VzfHNjaGVtYV90cmlnZ2Vyc3xzY2hlbWFfdXNlcnR5cGVzKSxuYW1lPS4qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuKmtleXNwYWNlPXN5c3RlbSwoc2NvcGV8dGFibGV8Y29sdW1uZmFtaWx5KT12aWV3c19idWlsZHNfaW5fcHJvZ3Jlc3MuKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiprZXlzcGFjZT1zeXN0ZW0sKHNjb3BlfHRhYmxlfGNvbHVtbmZhbWlseSk9cmFuZ2VfeGZlcnMuKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiprZXlzcGFjZT1zeXN0ZW0sKHNjb3BlfHRhYmxlfGNvbHVtbmZhbWlseSk9aGludHMuKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiprZXlzcGFjZT1zeXN0ZW0sKHNjb3BlfHRhYmxlfGNvbHVtbmZhbWlseSk9YmF0Y2hsb2cuKiIKICAgICAgICAgKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVBdHRyaWJ1dGVzID0gQXJyYXlzLmFzTGlzdCgiUlBDU2VydmVyUnVubmluZyIsIC8vIHJlbW92ZWQgaW4gQ0FTU0FORFJBLTExMTE1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heE5hdGl2ZVByb3RvY29sVmVyc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0cmVhbWluZ1NvY2tldFRpbWVvdXQiKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVPcGVyYXRpb25zID0gQXJyYXlzLmFzTGlzdCgic3RhcnRSUENTZXJ2ZXIiLCAic3RvcFJQQ1NlcnZlciIsIC8vIHJlbW92ZWQgaW4gQ0FTU0FORFJBLTExMTE1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9kZXRvb2wgYXBpcyB0aGF0IHdlcmUgY2hhbmdlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVjb21taXNzaW9uIiwgLy8gLT4gZGVjb21taXNzaW9uKGJvb2xlYW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcmNlUmVwYWlyQXN5bmMiLCAvLyAtPiByZXBhaXJBc3luYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JjZVJlcGFpclJhbmdlQXN5bmMiLCAvLyAtPiByZXBhaXJBc3luYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWdpbkxvY2FsU2FtcGxpbmciLCAvLyAtPiBiZWdpbkxvY2FsU2FtcGxpbmcocDE6IGphdmEubGFuZy5TdHJpbmcsIHAyOiBpbnQsIHAzOiBpbnQpOiB2b2lkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbmlzaExvY2FsU2FtcGxpbmciIC8vIC0+IGZpbmlzaExvY2FsU2FtcGxpbmcocDE6IGphdmEubGFuZy5TdHJpbmcsIHAyOiBpbnQpOiBqYXZhLnV0aWwuTGlzdAorICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZUF0dHJpYnV0ZXMgPSBuZXdBcnJheUxpc3QoIlJQQ1NlcnZlclJ1bm5pbmciLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xMTExNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1heE5hdGl2ZVByb3RvY29sVmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyZWFtaW5nU29ja2V0VGltZW91dCIpOworICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZU9wZXJhdGlvbnMgPSBuZXdBcnJheUxpc3QoInN0YXJ0UlBDU2VydmVyIiwgInN0b3BSUENTZXJ2ZXIiLCAvLyByZW1vdmVkIGluIENBU1NBTkRSQS0xMTExNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9kZXRvb2wgYXBpcyB0aGF0IHdlcmUgY2hhbmdlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWNvbW1pc3Npb24iLCAvLyAtPiBkZWNvbW1pc3Npb24oYm9vbGVhbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JjZVJlcGFpckFzeW5jIiwgLy8gLT4gcmVwYWlyQXN5bmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3JjZVJlcGFpclJhbmdlQXN5bmMiLCAvLyAtPiByZXBhaXJBc3luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZ2luTG9jYWxTYW1wbGluZyIsIC8vIC0+IGJlZ2luTG9jYWxTYW1wbGluZyhwMTogamF2YS5sYW5nLlN0cmluZywgcDI6IGludCwgcDM6IGludCk6IHZvaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaW5pc2hMb2NhbFNhbXBsaW5nIiAvLyAtPiBmaW5pc2hMb2NhbFNhbXBsaW5nKHAxOiBqYXZhLmxhbmcuU3RyaW5nLCBwMjogaW50KTogamF2YS51dGlsLkxpc3QKICAgICAgICAgKTsKIAorICAgICAgICBpZiAoQnRpRm9ybWF0LmlzU2VsZWN0ZWQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZXhjbHVkZU9iamVjdHMuYWRkKCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9KENvbHVtbkZhbWlseXxLZXlzcGFjZXxUYWJsZSkuKixuYW1lPUluZGV4U3VtbWFyeS4qIik7IC8vIC0+IHdoZW4gQlRJIGZvcm1hdCBpcyB1c2VkLCBpbmRleCBzdW1tYXJ5IGlzIG5vdCB1c2VkIChDQVNTQU5EUkEtMTcwNTYpCisgICAgICAgICAgICBleGNsdWRlT2JqZWN0cy5hZGQoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT1JbmRleCxzY29wZT1Sb3dJbmRleEVudHJ5LioiKTsKKyAgICAgICAgfQorCiAgICAgICAgIGRpZmYoZXhjbHVkZU9iamVjdHMsIGV4Y2x1ZGVBdHRyaWJ1dGVzLCBleGNsdWRlT3BlcmF0aW9ucywgInRlc3QvZGF0YS9qbXhkdW1wL2Nhc3NhbmRyYS0zLjExLWpteC55YW1sIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCBkaWZmNDAoKSB0aHJvd3MgVGhyb3dhYmxlCiAgICAgewotICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZU9iamVjdHMgPSBBcnJheXMuYXNMaXN0KCk7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlQXR0cmlidXRlcyA9IEFycmF5cy5hc0xpc3QoKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVPcGVyYXRpb25zID0gQXJyYXlzLmFzTGlzdCgpOworICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZU9iamVjdHMgPSBuZXdBcnJheUxpc3QoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVBdHRyaWJ1dGVzID0gbmV3QXJyYXlMaXN0KCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlT3BlcmF0aW9ucyA9IG5ld0FycmF5TGlzdCgpOworCisgICAgICAgIGlmIChCdGlGb3JtYXQuaXNTZWxlY3RlZCgpKQorICAgICAgICB7CisgICAgICAgICAgICBleGNsdWRlT2JqZWN0cy5hZGQoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLm1ldHJpY3M6dHlwZT0oQ29sdW1uRmFtaWx5fEtleXNwYWNlfFRhYmxlKS4qLG5hbWU9SW5kZXhTdW1tYXJ5LioiKTsgLy8gLT4gd2hlbiBCVEkgZm9ybWF0IGlzIHVzZWQsIGluZGV4IHN1bW1hcnkgaXMgbm90IHVzZWQgKENBU1NBTkRSQS0xNzA1NikKKyAgICAgICAgICAgIGV4Y2x1ZGVPYmplY3RzLmFkZCgib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPUluZGV4LHNjb3BlPVJvd0luZGV4RW50cnkuKiIpOworICAgICAgICB9CiAKICAgICAgICAgZGlmZihleGNsdWRlT2JqZWN0cywgZXhjbHVkZUF0dHJpYnV0ZXMsIGV4Y2x1ZGVPcGVyYXRpb25zLCAidGVzdC9kYXRhL2pteGR1bXAvY2Fzc2FuZHJhLTQuMC1qbXgueWFtbCIpOwogICAgIH0KQEAgLTE2Myw5ICsxODUsMTUgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGRpZmY0MSgpIHRocm93cyBUaHJvd2FibGUKICAgICB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlT2JqZWN0cyA9IEFycmF5cy5hc0xpc3QoKTsKLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVBdHRyaWJ1dGVzID0gQXJyYXlzLmFzTGlzdCgpOwotICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZU9wZXJhdGlvbnMgPSBBcnJheXMuYXNMaXN0KCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBleGNsdWRlT2JqZWN0cyA9IG5ld0FycmF5TGlzdCgpOworICAgICAgICBMaXN0PFN0cmluZz4gZXhjbHVkZUF0dHJpYnV0ZXMgPSBuZXdBcnJheUxpc3QoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVPcGVyYXRpb25zID0gbmV3QXJyYXlMaXN0KCk7CisKKyAgICAgICAgaWYgKEJ0aUZvcm1hdC5pc1NlbGVjdGVkKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGV4Y2x1ZGVPYmplY3RzLmFkZCgib3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljczp0eXBlPShDb2x1bW5GYW1pbHl8S2V5c3BhY2V8VGFibGUpLiosbmFtZT1JbmRleFN1bW1hcnkuKiIpOyAvLyAtPiB3aGVuIEJUSSBmb3JtYXQgaXMgdXNlZCwgaW5kZXggc3VtbWFyeSBpcyBub3QgdXNlZCAoQ0FTU0FORFJBLTE3MDU2KQorICAgICAgICAgICAgZXhjbHVkZU9iamVjdHMuYWRkKCJvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzOnR5cGU9SW5kZXgsc2NvcGU9Um93SW5kZXhFbnRyeS4qIik7CisgICAgICAgIH0KIAogICAgICAgICBkaWZmKGV4Y2x1ZGVPYmplY3RzLCBleGNsdWRlQXR0cmlidXRlcywgZXhjbHVkZU9wZXJhdGlvbnMsICJ0ZXN0L2RhdGEvam14ZHVtcC9jYXNzYW5kcmEtNC4xLWpteC55YW1sIik7CiAgICAgfQpAQCAtMTc0LDEwICsyMDIsMTAgQEAKICAgICB7CiAgICAgICAgIHNldHVwU3RhbmRhcmRUYWJsZXMoKTsKIAotICAgICAgICBMaXN0PFN0cmluZz4gYXJncyA9IExpc3RzLm5ld0FycmF5TGlzdCgidG9vbHMvYmluL2pteHRvb2wiLCAiZGlmZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItZiIsICJ5YW1sIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0taWdub3JlLW1pc3Npbmctb24tbGVmdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLCBUTVAuZ2V0Um9vdCgpLmdldEFic29sdXRlUGF0aCgpICsgIi9vdXQueWFtbCIpOworICAgICAgICBMaXN0PFN0cmluZz4gYXJncyA9IG5ld0FycmF5TGlzdCgidG9vbHMvYmluL2pteHRvb2wiLCAiZGlmZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItZiIsICJ5YW1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0taWdub3JlLW1pc3Npbmctb24tbGVmdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLCBUTVAuZ2V0Um9vdCgpLmdldEFic29sdXRlUGF0aCgpICsgIi9vdXQueWFtbCIpOwogICAgICAgICBleGNsdWRlT2JqZWN0cy5mb3JFYWNoKGEgLT4gewogICAgICAgICAgICAgYXJncy5hZGQoIi0tZXhjbHVkZS1vYmplY3QiKTsKICAgICAgICAgICAgIGFyZ3MuYWRkKGEpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL05vZGVQcm9iZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Ob2RlUHJvYmVUZXN0LmphdmEKaW5kZXggMjI1NTRlNi4uMjk0N2EyNiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL05vZGVQcm9iZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvTm9kZVByb2JlVGVzdC5qYXZhCkBAIC0zNyw2ICszNyw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKICAgICAgICAgc3RhcnRKTVhTZXJ2ZXIoKTsKICAgICAgICAgcHJvYmUgPSBuZXcgTm9kZVByb2JlKGpteEhvc3QsIGpteFBvcnQpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9PZmZsaW5lVG9vbFV0aWxzLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvT2ZmbGluZVRvb2xVdGlscy5qYXZhCmluZGV4IDNiYjI4MjUuLjlhNWFlOGUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9PZmZsaW5lVG9vbFV0aWxzLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL09mZmxpbmVUb29sVXRpbHMuamF2YQpAQCAtMzAsNyArMzAsMTIgQEAKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbVN1cHBvcnQ7CiAKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLkZpbGVVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CkBAIC03Miw5ICs3NywxNSBAQAogICAgICJwcm9jZXNzIHJlYXBlciIsICAvLyBzcGF3bmVkIGJ5IHRoZSBqdm0gd2hlbiBleGVjdXRpbmcgZXh0ZXJuYWwgcHJvY2Vzc2VzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBtYXkgc3RpbGwgYmUgYWN0aXZlIHdoZW4gd2UgY2hlY2sKICAgICAiQXR0YWNoIExpc3RlbmVyIiwgLy8gc3Bhd25lZCBpbiBpbnRlbGxpaiBJREVBCisgICAgIkpOQSBDbGVhbmVyIiwgICAgIC8vIHNwYXduZWQgYnkgSk5BCiAgICAgfTsKIAotICAgIHB1YmxpYyB2b2lkIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKFN0cmluZ1tdIG9wdGlvbmFsVGhyZWFkTmFtZXMpCisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5PTl9ERUZBVUxUX01FTVRBQkxFX1RIUkVBRFMgPQorICAgIHsKKyAgICAiKChOYXRpdmV8U2xhYnxIZWFwKVBvb2x8TG9nZ2VkKUNsZWFuZXIiCisgICAgfTsKKworICAgIHB1YmxpYyB2b2lkIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKFN0cmluZ1tdIG9wdGlvbmFsVGhyZWFkTmFtZXMsIGJvb2xlYW4gYWxsb3dOb25EZWZhdWx0TWVtdGFibGVUaHJlYWRzKQogICAgIHsKICAgICAgICAgVGhyZWFkTVhCZWFuIHRocmVhZHMgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRUaHJlYWRNWEJlYW4oKTsKIApAQCAtODcsMTAgKzk4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKE9iamVjdHM6Om5vbk51bGwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKFRocmVhZEluZm86OmdldFRocmVhZE5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgICAgICBJdGVyYWJsZTxTdHJpbmc+IG9wdGlvbmFsTmFtZXMgPSBvcHRpb25hbFRocmVhZE5hbWVzICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheXMuYXNMaXN0KG9wdGlvbmFsVGhyZWFkTmFtZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIGlmIChhbGxvd05vbkRlZmF1bHRNZW10YWJsZVRocmVhZHMgJiYgRGF0YWJhc2VEZXNjcmlwdG9yLmdldE1lbXRhYmxlQ29uZmlndXJhdGlvbnMoKS5jb250YWluc0tleSgiZGVmYXVsdCIpKQorICAgICAgICAgICAgb3B0aW9uYWxOYW1lcyA9IEl0ZXJhYmxlcy5jb25jYXQob3B0aW9uYWxOYW1lcywgQXJyYXlzLmFzTGlzdChOT05fREVGQVVMVF9NRU1UQUJMRV9USFJFQURTKSk7CiAKLSAgICAgICAgTGlzdDxQYXR0ZXJuPiBvcHRpb25hbCA9IG9wdGlvbmFsVGhyZWFkTmFtZXMgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBcnJheXMuc3RyZWFtKG9wdGlvbmFsVGhyZWFkTmFtZXMpLm1hcChQYXR0ZXJuOjpjb21waWxlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICBMaXN0PFBhdHRlcm4+IG9wdGlvbmFsID0gU3RyZWFtU3VwcG9ydC5zdHJlYW0ob3B0aW9uYWxOYW1lcy5zcGxpdGVyYXRvcigpLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKFBhdHRlcm46OmNvbXBpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CiAKICAgICAgICAgY3VycmVudC5yZW1vdmVBbGwoaW5pdGlhbCk7CiAKQEAgLTE4MCw3ICsxOTYsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cFRlc3RlcigpCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5wYXJ0aXRpb25lciIsICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyIik7CisgICAgICAgIENhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5QQVJUSVRJT05FUi5zZXRTdHJpbmcoIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXIiKTsKIAogICAgICAgICAvLyBtYXkgc3RhcnQgYW4gYXN5bmMgYXBwZW5kZXIKICAgICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoT2ZmbGluZVRvb2xVdGlscy5jbGFzcyk7CkBAIC0yMTksNyArMjM1LDcgQEAKICAgICAKICAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRDb3JyZWN0RW52UG9zdFRlc3QoKQogICAgIHsKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKE9QVElPTkFMX1RIUkVBRFNfV0lUSF9TQ0hFTUEsIHRydWUpOwogICAgICAgICBhc3NlcnRTY2hlbWFMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U2VydmVyTm90TG9hZGVkKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVFeHBpcmVkQmxvY2tlcnNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cGlyZWRCbG9ja2Vyc1Rlc3QuamF2YQppbmRleCBlNzY3NjllLi4xMGIzZjVkIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cGlyZWRCbG9ja2Vyc1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cGlyZWRCbG9ja2Vyc1Rlc3QuamF2YQpAQCAtMzcsNyArMzcsNyBAQAogICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRvb2wuZ2V0RXhpdENvZGUoKSk7CiAKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQobnVsbCk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwsIGZhbHNlKTsKICAgICAgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U3lzdGVtS1NOb3RMb2FkZWQoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwb3J0U2NoZW1hTG9hZGluZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwb3J0U2NoZW1hTG9hZGluZ1Rlc3QuamF2YQppbmRleCAxNTMwYTJlLi5iNzEzMTQ0IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cG9ydFNjaGVtYUxvYWRpbmdUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVFeHBvcnRTY2hlbWFMb2FkaW5nVGVzdC5qYXZhCkBAIC0yOCw2ICsyOCw3IEBACiBpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUudHlwZS5UeXBlUmVmZXJlbmNlOwogaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CiBpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLmV4Yy5NaXNtYXRjaGVkSW5wdXRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5zdGFydHNXaXRoOwpAQCAtNDQsNyArNDUsNyBAQAogICovCiBwdWJsaWMgY2xhc3MgU1NUYWJsZUV4cG9ydFNjaGVtYUxvYWRpbmdUZXN0IGV4dGVuZHMgT2ZmbGluZVRvb2xVdGlscwogewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0TWFwcGVyIG1hcHBlciA9IEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZVJlZmVyZW5jZTxMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+PiBqYWNrc29uTGlzdE9mTWFwc1R5cGUgPSBuZXcgVHlwZVJlZmVyZW5jZTxMaXN0PE1hcDxTdHJpbmcsIE9iamVjdD4+PigpIHt9OwogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzc3RhYmxlOwogCkBAIC0xODIsNyArMTgzLDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UG9zdFRlc3RFbnYoKQogICAgIHsKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKE9QVElPTkFMX1RIUkVBRFNfV0lUSF9TQ0hFTUEsIHRydWUpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydEtleXNwYWNlTm90TG9hZGVkKCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUV4cG9ydFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwb3J0VGVzdC5qYXZhCmluZGV4IGE1YjcwYTIuLjNhNGVhZDQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwb3J0VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlRXhwb3J0VGVzdC5qYXZhCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UG9zdFRlc3RFbnYoKQogICAgIHsKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKE9QVElPTkFMX1RIUkVBRFNfV0lUSF9TQ0hFTUEsIGZhbHNlKTsKICAgICAgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U3lzdGVtS1NOb3RMb2FkZWQoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlTGV2ZWxSZXNldHRlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlTGV2ZWxSZXNldHRlclRlc3QuamF2YQppbmRleCBlNmQ3YWRjLi4wZDYwOWQzIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZUxldmVsUmVzZXR0ZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVMZXZlbFJlc2V0dGVyVGVzdC5qYXZhCkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSwgQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nSWdub3JpbmdDYXNlKCJ1c2FnZToiKSk7CiAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldENsZWFuZWRTdGRlcnIoKSkuaXNFbXB0eSgpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdG9vbC5nZXRFeGl0Q29kZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQobnVsbCk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwsIGZhbHNlKTsKICAgICAgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U3lzdGVtS1NOb3RMb2FkZWQoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlTWV0YWRhdGFWaWV3ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZU1ldGFkYXRhVmlld2VyVGVzdC5qYXZhCmluZGV4IDQ5OThiNmUuLjY3MjhmZGYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlTWV0YWRhdGFWaWV3ZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVNZXRhZGF0YVZpZXdlclRlc3QuamF2YQpAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldENsZWFuZWRTdGRlcnIoKSwgQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nSWdub3JpbmdDYXNlKCJPcHRpb25zOiIpKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB0b29sLmdldEV4aXRDb2RlKCkpOwogICAgICAgICB9Ci0gICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwpOworICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZSh0b29sLmdldFN0ZG91dCgpLCBDaGFyTWF0Y2hlci5hc2NpaSgpLm1hdGNoZXNBbGxPZih0b29sLmdldFN0ZG91dCgpKSk7CiAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5kb2VzTm90Q29udGFpbigiV2lkZXN0IFBhcnRpdGlvbnMiKTsKICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKHNzdGFibGUucmVwbGFjZUFsbCgiLURhdGFcXC5kYiQiLCAiIikpOwotICAgICAgICBhc3NlcnRUcnVlKHRvb2wuZ2V0U3RkZXJyKCksIHRvb2wuZ2V0U3RkZXJyKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0b29sLmdldENsZWFuZWRTdGRlcnIoKSwgdG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkuaXNFbXB0eSgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRvb2wuZ2V0RXhpdENvZGUoKSk7CiAgICAgICAgIGFzc2VydEdvb2RFbnZQb3N0VGVzdCgpOwogICAgIH0KQEAgLTEyMyw3ICsxMjMsNyBAQAogICAgICAgICAgICAgICAgICAgVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTU1RhYmxlTWV0YWRhdGFWaWV3ZXIuY2xhc3MsIGFyZywgc3N0YWJsZSk7CiAgICAgICAgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoVXRpbC5CTFVFKTsKICAgICAgICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucyhzc3RhYmxlLnJlcGxhY2VBbGwoIi1EYXRhXFwuZGIkIiwgIiIpKTsKLSAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkFyZzogWyIgKyBhcmcgKyAiXVxuIiArIHRvb2wuZ2V0U3RkZXJyKCksIHRvb2wuZ2V0U3RkZXJyKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkFyZzogWyIgKyBhcmcgKyAiXVxuIiArIHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpLCB0b29sLmdldENsZWFuZWRTdGRlcnIoKS5pc0VtcHR5KCkpOwogICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRvb2wuZ2V0RXhpdENvZGUoKSk7CiAgICAgICAgICAgICAgICAgICBhc3NlcnRHb29kRW52UG9zdFRlc3QoKTsKICAgICAgICAgICAgICAgfSk7CkBAIC0xMzksNyArMTM5LDcgQEAKICAgICAgICAgICAgICAgICAgIFRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU1NUYWJsZU1ldGFkYXRhVmlld2VyLmNsYXNzLCBhcmcsIHNzdGFibGUpOwogICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0b29sLmdldFN0ZG91dCgpLCAhQ2hhck1hdGNoZXIuYXNjaWkoKS5tYXRjaGVzQWxsT2YodG9vbC5nZXRTdGRvdXQoKSkpOwogICAgICAgICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKHNzdGFibGUucmVwbGFjZUFsbCgiLURhdGFcXC5kYiQiLCAiIikpOwotICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQXJnOiBbIiArIGFyZyArICJdXG4iICsgdG9vbC5nZXRTdGRlcnIoKSwgdG9vbC5nZXRTdGRlcnIoKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQXJnOiBbIiArIGFyZyArICJdXG4iICsgdG9vbC5nZXRDbGVhbmVkU3RkZXJyKCksIHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpLmlzRW1wdHkoKSk7CiAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdG9vbC5nZXRFeGl0Q29kZSgpKTsKICAgICAgICAgICAgICAgICAgIGFzc2VydEdvb2RFbnZQb3N0VGVzdCgpOwogICAgICAgICAgICAgICB9KTsKQEAgLTIxMSwxNCArMjExLDE0IEBACiAgICAgICAgICAgICAgICAgICBUb29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFNTVGFibGVNZXRhZGF0YVZpZXdlci5jbGFzcywgYXJnLCBzc3RhYmxlKTsKICAgICAgICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiV2lkZXN0IFBhcnRpdGlvbnMiKTsKICAgICAgICAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucyhzc3RhYmxlLnJlcGxhY2VBbGwoIi1EYXRhXFwuZGIkIiwgIiIpKTsKLSAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkFyZzogWyIgKyBhcmcgKyAiXVxuIiArIHRvb2wuZ2V0U3RkZXJyKCksIHRvb2wuZ2V0U3RkZXJyKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkFyZzogWyIgKyBhcmcgKyAiXVxuIiArIHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpLCB0b29sLmdldENsZWFuZWRTdGRlcnIoKS5pc0VtcHR5KCkpOwogICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRvb2wuZ2V0RXhpdENvZGUoKSk7CiAgICAgICAgICAgICAgIH0pOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBhc3NlcnRHb29kRW52UG9zdFRlc3QoKQogICAgIHsKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKE9QVElPTkFMX1RIUkVBRFNfV0lUSF9TQ0hFTUEsIGZhbHNlKTsKICAgICAgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U3lzdGVtS1NOb3RMb2FkZWQoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlT2ZmbGluZVJlbGV2ZWxUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZU9mZmxpbmVSZWxldmVsVGVzdC5qYXZhCmluZGV4IDNmNDMxNGMuLjE1ZjYyOTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlT2ZmbGluZVJlbGV2ZWxUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVPZmZsaW5lUmVsZXZlbFRlc3QuamF2YQpAQCAtMzYsNyArMzYsNyBAQAogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCksIENvcmVNYXRjaGVycy5jb250YWluc1N0cmluZ0lnbm9yaW5nQ2FzZSgidXNhZ2U6IikpOwogICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRvb2wuZ2V0RXhpdENvZGUoKSk7Ci0gICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwpOworICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZVBhcnRpdGlvbnNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZVBhcnRpdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3ZmE4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlUGFydGl0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDY1NCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29sczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuRGlyZWN0b3JpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXIuVG9vbFJlc3VsdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5GQlV0aWxpdGllczsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5BYnN0cmFjdFN0cmluZ0Fzc2VydDsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmsgU1NUYWJsZVBhcnRpdGlvbnN9LgorICovCitwdWJsaWMgY2xhc3MgU1NUYWJsZVBhcnRpdGlvbnNUZXN0IGV4dGVuZHMgT2ZmbGluZVRvb2xVdGlscworeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU1RBQkxFXzEgPSBzc3RhYmxlKCJsZWdhY3lfbWFfc2ltcGxlIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTVEFCTEVfMiA9IHNzdGFibGUoImxlZ2FjeV9tYV9jbHVzdCIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfMSA9ICJcblByb2Nlc3NpbmcgICMxIChiaWctbWEpICgwLjE2OSBLaUIgdW5jb21wcmVzc2VkLCAwLjA4NiBLaUIgb24gZGlzaylcbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl8yID0gIlxuUHJvY2Vzc2luZyAgIzEgKGJpZy1tYSkgKDMyOC4xNDUgS2lCIHVuY29tcHJlc3NlZCwgNS4wOTYgS2lCIG9uIGRpc2spXG4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLVVBTX0hFQURFUl8xID0gIlxuUHJvY2Vzc2luZyBCYWNrdXA6YmFja3VwcyAgIzEgKGJpZy1tYSkgKDAuMTY5IEtpQiB1bmNvbXByZXNzZWQsIDAuMDg2IEtpQiBvbiBkaXNrKVxuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS1VQU19IRUFERVJfMiA9ICJcblByb2Nlc3NpbmcgQmFja3VwOmJhY2t1cHMgICMxIChiaWctbWEpICgzMjguMTQ1IEtpQiB1bmNvbXByZXNzZWQsIDUuMDk2IEtpQiBvbiBkaXNrKVxuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU05BUFNIT1RTX0hFQURFUl8xID0gIlxuUHJvY2Vzc2luZyBTbmFwc2hvdDpzbmFwc2hvdC0xICAjMSAoYmlnLW1hKSAoMC4xNjkgS2lCIHVuY29tcHJlc3NlZCwgMC4wODYgS2lCIG9uIGRpc2spXG4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTTkFQU0hPVFNfSEVBREVSXzIgPSAiXG5Qcm9jZXNzaW5nIFNuYXBzaG90OnNuYXBzaG90LTEgICMxIChiaWctbWEpICgzMjguMTQ1IEtpQiB1bmNvbXByZXNzZWQsIDUuMDk2IEtpQiBvbiBkaXNrKVxuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VNTUFSWV8xID0gIiAgICAgICAgICAgICAgIFBhcnRpdGlvbiBzaXplICAgICAgICAgICAgUm93IGNvdW50ICAgICAgICAgICBDZWxsIGNvdW50ICAgICAgVG9tYnN0b25lIGNvdW50XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA1MCAgICAgICAgICAgICAgMC4wMzQgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA3NSAgICAgICAgICAgICAgMC4wMzQgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA5MCAgICAgICAgICAgICAgMC4wMzQgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA5NSAgICAgICAgICAgICAgMC4wMzQgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA5OSAgICAgICAgICAgICAgMC4wMzQgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA5OTkgICAgICAgICAgICAgMC4wMzQgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgbWluICAgICAgICAgICAgICAgMC4wMzIgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgbWF4ICAgICAgICAgICAgICAgMC4wMzQgS2lCICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAwXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgY291bnQgICAgICAgICAgICAgICAgICAgICA1XG4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVU1NQVJZXzIgPSAiICAgICAgICAgICAgICAgUGFydGl0aW9uIHNpemUgICAgICAgICAgICBSb3cgY291bnQgICAgICAgICAgIENlbGwgY291bnQgICAgICBUb21ic3RvbmUgY291bnRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDUwICAgICAgICAgICAgIDcxLjczNSBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDc1ICAgICAgICAgICAgIDcxLjczNSBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDkwICAgICAgICAgICAgIDcxLjczNSBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDk1ICAgICAgICAgICAgIDcxLjczNSBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDk5ICAgICAgICAgICAgIDcxLjczNSBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDk5OSAgICAgICAgICAgIDcxLjczNSBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBtaW4gICAgICAgICAgICAgIDY1LjYyNSBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBtYXggICAgICAgICAgICAgIDY1LjYzMCBLaUIgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgNTAgICAgICAgICAgICAgICAgICAgIDBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBjb3VudCAgICAgICAgICAgICAgICAgICAgIDVcbiI7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJlcGFyZURpcmVjdG9yaWVzKCkKKyAgICB7CisgICAgICAgIGNyZWF0ZUJhY2t1cHNBbmRTbmFwc2hvdHMoU1NUQUJMRV8xKTsKKyAgICAgICAgY3JlYXRlQmFja3Vwc0FuZFNuYXBzaG90cyhTU1RBQkxFXzIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlQmFja3Vwc0FuZFNuYXBzaG90cyhTdHJpbmcgc3N0YWJsZSkKKyAgICB7CisgICAgICAgIEZpbGUgcGFyZW50RGlyID0gbmV3IEZpbGUoc3N0YWJsZSkucGFyZW50KCk7CisKKyAgICAgICAgRmlsZSBiYWNrdXBzRGlyID0gbmV3IEZpbGUocGFyZW50RGlyLCBEaXJlY3Rvcmllcy5CQUNLVVBTX1NVQkRJUik7CisgICAgICAgIGJhY2t1cHNEaXIudHJ5Q3JlYXRlRGlyZWN0b3J5KCk7CisKKyAgICAgICAgRmlsZSBzbmFwc2hvdHNEaXIgPSBuZXcgRmlsZShwYXJlbnREaXIsIERpcmVjdG9yaWVzLlNOQVBTSE9UX1NVQkRJUik7CisgICAgICAgIHNuYXBzaG90c0Rpci50cnlDcmVhdGVEaXJlY3RvcnkoKTsKKworICAgICAgICBGaWxlIHNuYXBzaG90RGlyID0gbmV3IEZpbGUoc25hcHNob3RzRGlyLCAic25hcHNob3QtMSIpOworICAgICAgICBzbmFwc2hvdERpci50cnlDcmVhdGVEaXJlY3RvcnkoKTsKKworICAgICAgICBmb3IgKEZpbGUgZiA6IHBhcmVudERpci50cnlMaXN0KEZpbGU6OmlzRmlsZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5V2l0aE91dENvbmZpcm0oZiwgbmV3IEZpbGUoYmFja3Vwc0RpciwgZi5uYW1lKCkpKTsKKyAgICAgICAgICAgIEZpbGVVdGlscy5jb3B5V2l0aE91dENvbmZpcm0oZiwgbmV3IEZpbGUoc25hcHNob3REaXIsIGYubmFtZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIHBvc3QtdGVzdCBhc3NlcnRpb25zIGFib3V0IGxvYWRlZCBjbGFzc2VkIGFuZCBzdGFydGVkIHRocmVhZHMuCisgICAgICovCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgYXNzZXJ0UG9zdFRlc3RFbnYoKQorICAgIHsKKyAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSwgZmFsc2UpOworICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CisgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CisgICAgICAgIGFzc2VydEtleXNwYWNlTm90TG9hZGVkKCk7CisgICAgICAgIGFzc2VydFNlcnZlck5vdExvYWRlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHRoZSB0b29sIHByaW50cyBoZWxwIHdoZW4gbm8gYXJndW1lbnRzIGFyZSBwcm92aWRlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FyZ3NQcmludHNIZWxwKCkKKyAgICB7CisgICAgICAgIFRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU1NUYWJsZVBhcnRpdGlvbnMuY2xhc3MpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRFeGl0Q29kZSgpKS5pc09uZSgpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmNvbnRhaW5zKCJZb3UgbXVzdCBzdXBwbHkgYXQgbGVhc3Qgb25lIHNzdGFibGUgb3IgZGlyZWN0b3J5Iik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygidXNhZ2UiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCB0aGUgdG9vbCBwcmludHMgdGhlIHJpZ2h0IGhlbHAgY29udGVudHMuCisgICAgICogSWYgeW91IGFkZGVkLCBtb2RpZmllZCBvcHRpb25zIG9yIGhlbHAsIHBsZWFzZSB1cGRhdGUgZG9jcyBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF5YmVDaGFuZ2VEb2NzKCkKKyAgICB7CisgICAgICAgIFRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlQ2xhc3MoU1NUYWJsZVBhcnRpdGlvbnMuY2xhc3MpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkKKyAgICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oInVzYWdlOiBzc3RhYmxlcGFydGl0aW9ucyA8b3B0aW9ucz4gPHNzdGFibGUgZmlsZXMgb3IgZGlyZWN0b3JpZXM+XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJpbnQgcGFydGl0aW9uIHN0YXRpc3RpY3Mgb2Ygb25lIG9yIG1vcmUgc3N0YWJsZXMuXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtYiwtLWJhY2t1cHMgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBiYWNrdXBzIHByZXNlbnQgaW4gZGF0YVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIChyZWN1cnNpdmUgc2NhbnMpXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtYywtLW1pbi1jZWxscyA8YXJnPiAgICAgICAgICAgcGFydGl0aW9uIGNlbGwgY291bnQgdGhyZXNob2xkXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtaywtLWtleSA8YXJnPiAgICAgICAgICAgICAgICAgUGFydGl0aW9uIGtleXMgdG8gaW5jbHVkZVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLW0sLS1jc3YgICAgICAgICAgICAgICAgICAgICAgIENTViBvdXRwdXQgKG1hY2hpbmUgcmVhZGFibGUpXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtbywtLW1pbi10b21ic3RvbmVzIDxhcmc+ICAgICAgcGFydGl0aW9uIHRvbWJzdG9uZSBjb3VudCB0aHJlc2hvbGRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC1yLC0tcmVjdXJzaXZlICAgICAgICAgICAgICAgICBzY2FuIGZvciBzc3RhYmxlcyByZWN1cnNpdmVseVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLXMsLS1zbmFwc2hvdHMgICAgICAgICAgICAgICAgIGluY2x1ZGUgc25hcHNob3RzIHByZXNlbnQgaW4gZGF0YVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIChyZWN1cnNpdmUgc2NhbnMpXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAtdCwtLW1pbi1zaXplIDxhcmc+ICAgICAgICAgICAgcGFydGl0aW9uIHNpemUgdGhyZXNob2xkLCBleHByZXNzZWQgYXNcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgdGhlIG51bWJlciBvZiBieXRlcyBvciBhIHNpemUgd2l0aCB1bml0IG9mIHRoZSBmb3JtIDEwS2lCLCAyME1pQixcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMEdpQiwgZXRjLlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLXUsLS1jdXJyZW50LXRpbWVzdGFtcCA8YXJnPiAgIHRpbWVzdGFtcCAoc2Vjb25kcyBzaW5jZSBlcG9jaCwgdW5pdCB0aW1lKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBUVEwgZXhwaXJlZCBjYWxjdWxhdGlvblxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLXcsLS1taW4tcm93cyA8YXJnPiAgICAgICAgICAgIHBhcnRpdGlvbiByb3cgY291bnQgdGhyZXNob2xkXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAteCwtLWV4Y2x1ZGUta2V5IDxhcmc+ICAgICAgICAgRXhjbHVkZWQgcGFydGl0aW9uIGtleShzKSBmcm9tIHBhcnRpdGlvblxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkIHJvdy9jZWxsL3RvbWJzdG9uZSBpbmZvcm1hdGlvbiAoaXJyZWxldmFudCwgaWYgLS1wYXJ0aXRpb25zLW9ubHlcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBnaXZlbilcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC15LC0tcGFydGl0aW9ucy1vbmx5ICAgICAgICAgICBEbyBub3QgcHJvY2VzcyBwZXItcGFydGl0aW9uIGRldGFpbGVkXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93L2NlbGwvdG9tYnN0b25lIGluZm9ybWF0aW9uLCBvbmx5IGJyaWVmIGluZm9ybWF0aW9uXG4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWZXJpZnkgdGhhdCB0aGUgdG9vbCBjYW4gc2VsZWN0IHNpbmdsZSBzc3RhYmxlIGZpbGUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlU1NUYWJsZSgpCisgICAgeworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xKS5pc0VxdWFsVG8oSEVBREVSXzEgKyBTVU1NQVJZXzEpOworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8yKS5pc0VxdWFsVG8oSEVBREVSXzIgKyBTVU1NQVJZXzIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHRoZSB0b29sIGNhbiBzZWxlY3QgbXVsdGlwbGUgc3N0YWJsZSBmaWxlcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVNTVGFibGVzKCkKKyAgICB7CisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhTU1RBQkxFXzEsIFNTVEFCTEVfMikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEhFQURFUl8yICsgU1VNTUFSWV8yICsgSEVBREVSXzEgKyBTVU1NQVJZXzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmeSB0aGF0IHRoZSB0b29sIGNhbiBzZWxlY3QgYWxsIHRoZSBzc3RhYmxlIGZpbGVzIGluIGEgZGlyZWN0b3J5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpcmVjdG9yeSgpCisgICAgeworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMobmV3IEZpbGUoU1NUQUJMRV8xKS5wYXJlbnRQYXRoKCkpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMSArIFNVTU1BUllfMSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKCItciIsIG5ldyBGaWxlKFNTVEFCTEVfMSkucGFyZW50KCkucGFyZW50UGF0aCgpKQorICAgICAgICAgICAgICAgIC5jb250YWlucyhIRUFERVJfMSArIFNVTU1BUllfMSkKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoSEVBREVSXzIgKyBTVU1NQVJZXzIpOworCisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcygiLS1yZWN1cnNpdmUiLCBuZXcgRmlsZShTU1RBQkxFXzIpLnBhcmVudCgpLnBhcmVudFBhdGgoKSkKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoSEVBREVSXzEgKyBTVU1NQVJZXzEpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zKEhFQURFUl8yICsgU1VNTUFSWV8yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBmbGFnIGZvciBjb2xsZWN0aW5nIGFuZCBwcmludGluZyBzc3RhYmxlIHBhcnRpdGlvbiBzaXplcyBvbmx5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnRpdGlvbnNPbmx5KCkKKyAgICB7CisgICAgICAgIHRlc3RQYXJ0aXRpb25zT25seSgiLXkiKTsKKyAgICAgICAgdGVzdFBhcnRpdGlvbnNPbmx5KCItLXBhcnRpdGlvbnMtb25seSIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFBhcnRpdGlvbnNPbmx5KFN0cmluZyBvcHRpb24pCisgICAgeworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCBvcHRpb24pCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgUGFydGl0aW9uIHNpemVcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA1MCAgICAgICAgICAgICAgMC4wMzQgS2lCXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIH5wNzUgICAgICAgICAgICAgIDAuMDM0IEtpQlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDkwICAgICAgICAgICAgICAwLjAzNCBLaUJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA5NSAgICAgICAgICAgICAgMC4wMzQgS2lCXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIH5wOTkgICAgICAgICAgICAgIDAuMDM0IEtpQlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDk5OSAgICAgICAgICAgICAwLjAzNCBLaUJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgbWluICAgICAgICAgICAgICAgMC4wMzIgS2lCXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIG1heCAgICAgICAgICAgICAgIDAuMDM0IEtpQlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBjb3VudCAgICAgICAgICAgICAgICAgICAgIDVcbiIpOworCisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhTU1RBQkxFXzIsICItLXBhcnRpdGlvbnMtb25seSIpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgUGFydGl0aW9uIHNpemVcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA1MCAgICAgICAgICAgICA3MS43MzUgS2lCXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIH5wNzUgICAgICAgICAgICAgNzEuNzM1IEtpQlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDkwICAgICAgICAgICAgIDcxLjczNSBLaUJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfnA5NSAgICAgICAgICAgICA3MS43MzUgS2lCXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIH5wOTkgICAgICAgICAgICAgNzEuNzM1IEtpQlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB+cDk5OSAgICAgICAgICAgIDcxLjczNSBLaUJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgbWluICAgICAgICAgICAgICA2NS42MjUgS2lCXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIG1heCAgICAgICAgICAgICAgNjUuNjMwIEtpQlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBjb3VudCAgICAgICAgICAgICAgICAgICAgIDVcbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGZsYWcgZm9yIGRldGVjdGluZyBwYXJ0aXRpb25zIG92ZXIgYSBjZXJ0YWluIHNpemUgdGhyZXNob2xkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pblNpemUoKQorICAgIHsKKyAgICAgICAgdGVzdE1pblNpemUoIi10Iik7CisgICAgICAgIHRlc3RNaW5TaXplKCItLW1pbi1zaXplIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0TWluU2l6ZShTdHJpbmcgb3B0aW9uKQorICAgIHsKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKFNTVEFCTEVfMSwgU1NUQUJMRV8yLCBvcHRpb24sICIzNSIpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcwJyAoMzApIGxpdmUsIHNpemU6IDY1LjYyNSBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzEnICgzMSkgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMicgKDMyKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICczJyAoMzMpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzQnICgzNCkgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1bW1hcnkgb2YgICMxIChiaWctbWEpOlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBGaWxlOiAiICsgU1NUQUJMRV8yICsgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICA1IHBhcnRpdGlvbnMgbWF0Y2hcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgS2V5czogMCAxIDIgMyA0XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BUllfMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIRUFERVJfMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcxJyAoMzEpIGxpdmUsIHNpemU6IDAuMDM0IEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzInICgzMikgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMycgKDMzKSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICc0JyAoMzQpIGxpdmUsIHNpemU6IDAuMDM0IEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdW1tYXJ5IG9mICAjMSAoYmlnLW1hKTpcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRmlsZTogIiArIFNTVEFCTEVfMSArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgNCBwYXJ0aXRpb25zIG1hdGNoXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEtleXM6IDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8xKTsKKworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCBTU1RBQkxFXzIsICItLW1pbi1zaXplIiwgIjM2IikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEhFQURFUl8yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzAnICgzMCkgbGl2ZSwgc2l6ZTogNjUuNjI1IEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMScgKDMxKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcyJyAoMzIpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzIgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDUgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8yICsgSEVBREVSXzEgKyBTVU1NQVJZXzEpOworCisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhTU1RBQkxFXzEsIFNTVEFCTEVfMiwgIi0tbWluLXNpemUiLCAiNjcyMDEiKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oSEVBREVSXzIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMScgKDMxKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcyJyAoMzIpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzIgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDQgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAxIDIgMyA0XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BUllfMiArIEhFQURFUl8xICsgU1VNTUFSWV8xKTsKKworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCBTU1RBQkxFXzIsICItLW1pbi1zaXplIiwgIjY3MjAxQiIpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcxJyAoMzEpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzInICgzMikgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMycgKDMzKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICc0JyAoMzQpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdW1tYXJ5IG9mICAjMSAoYmlnLW1hKTpcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRmlsZTogIiArIFNTVEFCTEVfMiArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgNCBwYXJ0aXRpb25zIG1hdGNoXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEtleXM6IDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8yICsgSEVBREVSXzEgKyBTVU1NQVJZXzEpOworCisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhTU1RBQkxFXzEsIFNTVEFCTEVfMiwgIi0tbWluLXNpemUiLCAiNjVLaUIiKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oSEVBREVSXzIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMCcgKDMwKSBsaXZlLCBzaXplOiA2NS42MjUgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcxJyAoMzEpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzInICgzMikgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMycgKDMzKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICc0JyAoMzQpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdW1tYXJ5IG9mICAjMSAoYmlnLW1hKTpcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRmlsZTogIiArIFNTVEFCTEVfMiArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgNSBwYXJ0aXRpb25zIG1hdGNoXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEtleXM6IDAgMSAyIDMgNFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NQVJZXzIgKyBIRUFERVJfMSArIFNVTU1BUllfMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgZmxhZyBmb3IgZGV0ZWN0aW5nIHBhcnRpdGlvbnMgd2l0aCBtb3JlIGNlbGxzIHRoYW4gYSBjZXJ0YWluIHRocmVzaG9sZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5DZWxscygpCisgICAgeworICAgICAgICB0ZXN0TWluQ2VsbHMoIi1jIik7CisgICAgICAgIHRlc3RNaW5DZWxscygiLS1taW4tY2VsbHMiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RNaW5DZWxscyhTdHJpbmcgb3B0aW9uKQorICAgIHsKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKFNTVEFCTEVfMSwgU1NUQUJMRV8yLCBvcHRpb24sICIwIikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEhFQURFUl8yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzAnICgzMCkgbGl2ZSwgc2l6ZTogNjUuNjI1IEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMScgKDMxKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcyJyAoMzIpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzIgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDUgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFQURFUl8xICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzAnICgzMCkgbGl2ZSwgc2l6ZTogMC4wMzIgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMScgKDMxKSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcyJyAoMzIpIGxpdmUsIHNpemU6IDAuMDM0IEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzEgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDUgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8xKTsKKworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCBTU1RBQkxFXzIsIG9wdGlvbiwgIjIiKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oSEVBREVSXzIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMCcgKDMwKSBsaXZlLCBzaXplOiA2NS42MjUgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcxJyAoMzEpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzInICgzMikgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMycgKDMzKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICc0JyAoMzQpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdW1tYXJ5IG9mICAjMSAoYmlnLW1hKTpcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRmlsZTogIiArIFNTVEFCTEVfMiArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgNSBwYXJ0aXRpb25zIG1hdGNoXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEtleXM6IDAgMSAyIDMgNFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NQVJZXzIgKyBIRUFERVJfMSArIFNVTU1BUllfMSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKFNTVEFCTEVfMSwgU1NUQUJMRV8yLCBvcHRpb24sICI1MSIpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMiArIFNVTU1BUllfMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIRUFERVJfMSArIFNVTU1BUllfMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgZmxhZyBmb3IgZGV0ZWN0aW5nIHBhcnRpdGlvbnMgd2l0aCBtb3JlIHJvd3MgdGhhbiBhIGNlcnRhaW4gdGhyZXNob2xkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pblJvd3MoKQorICAgIHsKKyAgICAgICAgdGVzdE1pblJvd3MoIi13Iik7CisgICAgICAgIHRlc3RNaW5Sb3dzKCItLW1pbi1yb3dzIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0TWluUm93cyhTdHJpbmcgb3B0aW9uKQorICAgIHsKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKFNTVEFCTEVfMSwgU1NUQUJMRV8yLCBvcHRpb24sICIwIikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEhFQURFUl8yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzAnICgzMCkgbGl2ZSwgc2l6ZTogNjUuNjI1IEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMScgKDMxKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcyJyAoMzIpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzIgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDUgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFQURFUl8xICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzAnICgzMCkgbGl2ZSwgc2l6ZTogMC4wMzIgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMScgKDMxKSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcyJyAoMzIpIGxpdmUsIHNpemU6IDAuMDM0IEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzEgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDUgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8xKTsKKworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCBTU1RBQkxFXzIsIG9wdGlvbiwgIjUwIikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEhFQURFUl8yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzAnICgzMCkgbGl2ZSwgc2l6ZTogNjUuNjI1IEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMScgKDMxKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcyJyAoMzIpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzIgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDUgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDEgMiAzIDRcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUFSWV8yICsgSEVBREVSXzEgKyBTVU1NQVJZXzEpOworCisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhTU1RBQkxFXzEsIFNTVEFCTEVfMiwgb3B0aW9uLCAiNTEiKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oSEVBREVSXzIgKyBTVU1NQVJZXzIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVBREVSXzEgKyBTVU1NQVJZXzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGZsYWcgZm9yIGRldGVjdGluZyBwYXJ0aXRpb25zIHdpdGggbW9yZSB0b21ic3RvbmVzIHRoYW4gYSBjZXJ0YWluIHRocmVzaG9sZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5Ub21ic3RvbmVzKCkKKyAgICB7CisgICAgICAgIHRlc3RNaW5Ub21ic3RvbmVzKCItbyIpOworICAgICAgICB0ZXN0TWluVG9tYnN0b25lcygiLS1taW4tdG9tYnN0b25lcyIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdE1pblRvbWJzdG9uZXMoU3RyaW5nIG9wdGlvbikKKyAgICB7CisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhTU1RBQkxFXzEsIFNTVEFCTEVfMiwgb3B0aW9uLCAiMCIpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcwJyAoMzApIGxpdmUsIHNpemU6IDY1LjYyNSBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzEnICgzMSkgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMicgKDMyKSBsaXZlLCBzaXplOiA2NS42MzAgS2lCLCByb3dzOiA1MCwgY2VsbHM6IDUwLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICczJyAoMzMpIGxpdmUsIHNpemU6IDY1LjYzMCBLaUIsIHJvd3M6IDUwLCBjZWxsczogNTAsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzQnICgzNCkgbGl2ZSwgc2l6ZTogNjUuNjMwIEtpQiwgcm93czogNTAsIGNlbGxzOiA1MCwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1bW1hcnkgb2YgICMxIChiaWctbWEpOlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBGaWxlOiAiICsgU1NUQUJMRV8yICsgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICA1IHBhcnRpdGlvbnMgbWF0Y2hcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgS2V5czogMCAxIDIgMyA0XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BUllfMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIRUFERVJfMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcwJyAoMzApIGxpdmUsIHNpemU6IDAuMDMyIEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzEnICgzMSkgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMicgKDMyKSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICczJyAoMzMpIGxpdmUsIHNpemU6IDAuMDM0IEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzQnICgzNCkgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1bW1hcnkgb2YgICMxIChiaWctbWEpOlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBGaWxlOiAiICsgU1NUQUJMRV8xICsgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICA1IHBhcnRpdGlvbnMgbWF0Y2hcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgS2V5czogMCAxIDIgMyA0XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BUllfMSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKFNTVEFCTEVfMSwgU1NUQUJMRV8yLCAiLS1taW4tdG9tYnN0b25lcyIsICIxIikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEhFQURFUl8yICsgU1VNTUFSWV8yICsgSEVBREVSXzEgKyBTVU1NQVJZXzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGZsYWcgZm9yIHByb3ZpZGluZyBhIGN1cnJlbnQgdGltZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXJyZW50VGltZXN0YW1wKCkKKyAgICB7CisgICAgICAgIHRlc3RDdXJyZW50VGltZXN0YW1wKCItdSIpOworICAgICAgICB0ZXN0Q3VycmVudFRpbWVzdGFtcCgiLS1jdXJyZW50LXRpbWVzdGFtcCIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEN1cnJlbnRUaW1lc3RhbXAoU3RyaW5nIG9wdGlvbikKKyAgICB7CisgICAgICAgIFN0cmluZyBub3cgPSBTdHJpbmcudmFsdWVPZihGQlV0aWxpdGllcy5ub3dJblNlY29uZHMoKSk7CisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhTU1RBQkxFXzEsIG9wdGlvbiwgbm93KS5pc0VxdWFsVG8oSEVBREVSXzEgKyBTVU1NQVJZXzEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGZsYWcgZm9yIGluY2x1ZGluZyBiYWNrdXAgc3N0YWJsZXMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja3VwcygpCisgICAgeworICAgICAgICB0ZXN0QmFja3VwcygiLWIiKTsKKyAgICAgICAgdGVzdEJhY2t1cHMoIi0tYmFja3VwcyIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEJhY2t1cHMoU3RyaW5nIG9wdGlvbikKKyAgICB7CisgICAgICAgIGFzc2VydFRoYXRUb29sU3VjY2VkcyhuZXcgRmlsZShTU1RBQkxFXzEpLnBhcmVudFBhdGgoKSwgIi1yIiwgb3B0aW9uKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oSEVBREVSXzEgKyBTVU1NQVJZXzEgKyBCQUNLVVBTX0hFQURFUl8xICsgU1VNTUFSWV8xKTsKKworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMobmV3IEZpbGUoU1NUQUJMRV8yKS5wYXJlbnRQYXRoKCksICItciIsIG9wdGlvbikKKyAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKEhFQURFUl8yICsgU1VNTUFSWV8yICsgQkFDS1VQU19IRUFERVJfMiArIFNVTU1BUllfMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgZmxhZyBmb3IgaW5jbHVkaW5nIHNuYXBzaG90IHNzdGFibGVzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNuYXBzaG90cygpCisgICAgeworICAgICAgICB0ZXN0U25hcHNob3RzKCItcyIpOworICAgICAgICB0ZXN0U25hcHNob3RzKCItLXNuYXBzaG90cyIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFNuYXBzaG90cyhTdHJpbmcgb3B0aW9uKQorICAgIHsKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKG5ldyBGaWxlKFNTVEFCTEVfMSkucGFyZW50UGF0aCgpLCAiLXIiLCBvcHRpb24pCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMSArIFNVTU1BUllfMSArIFNOQVBTSE9UU19IRUFERVJfMSArIFNVTU1BUllfMSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKG5ldyBGaWxlKFNTVEFCTEVfMikucGFyZW50UGF0aCgpLCAiLXIiLCBvcHRpb24pCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhIRUFERVJfMiArIFNVTU1BUllfMiArIFNOQVBTSE9UU19IRUFERVJfMiArIFNVTU1BUllfMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgZmxhZyBmb3Igc3BlY2lmeWluZyBwYXJ0aXRvbiBrZXlzIHRvIGJlIGNvbnNpZGVyZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5jbHVkZWRLZXlzKCkKKyAgICB7CisgICAgICAgIHRlc3RJbmNsdWRlZEtleXMoIi1rIik7CisgICAgICAgIHRlc3RJbmNsdWRlZEtleXMoIi0ta2V5Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0SW5jbHVkZWRLZXlzKFN0cmluZyBvcHRpb24pCisgICAgeworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCAiLS1taW4tc2l6ZSIsICIwIiwgb3B0aW9uLCAiMSIsIG9wdGlvbiwgIjMiKQorICAgICAgICAgICAgICAgIC5jb250YWlucyhIRUFERVJfMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcxJyAoMzEpIGxpdmUsIHNpemU6IDAuMDM0IEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzMnICgzMykgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1bW1hcnkgb2YgICMxIChiaWctbWEpOlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBGaWxlOiAiICsgU1NUQUJMRV8xICsgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAyIHBhcnRpdGlvbnMgbWF0Y2hcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgS2V5czogMSAzXG4iKQorICAgICAgICAgICAgICAgIC5jb250YWlucygiY291bnQgICAgICAgICAgICAgICAgICAgICAyXG4iKTsKKworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCAiLS1taW4tc2l6ZSIsICIwIiwgb3B0aW9uLCAiMCIsIG9wdGlvbiwgIjIiLCBvcHRpb24sICI0IikKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoSEVBREVSXzEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcwJyAoMzApIGxpdmUsIHNpemU6IDAuMDMyIEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMicgKDMyKSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzQnICgzNCkgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRmlsZTogIiArIFNTVEFCTEVfMSArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiICAzIHBhcnRpdGlvbnMgbWF0Y2hcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDIgNFxuIikKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoImNvdW50ICAgICAgICAgICAgICAgICAgICAgM1xuIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKFNTVEFCTEVfMSwgIi15IiwiLS1taW4tc2l6ZSIsICIwIiwgb3B0aW9uLCAiMCIsIG9wdGlvbiwgIjIiLCBvcHRpb24sICI0IikKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoSEVBREVSXzEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcwJyAoMzApIGxpdmUsIHNpemU6IDAuMDMyIEtpQlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzInICgzMikgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiAwLjAzNCBLaUJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgRmlsZTogIiArIFNTVEFCTEVfMSArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiICAzIHBhcnRpdGlvbnMgbWF0Y2hcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDIgNFxuIikKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoImNvdW50ICAgICAgICAgICAgICAgICAgICAgM1xuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgZmxhZyBmb3Igc3BlY2lmeWluZyBwYXJ0aXRvbiBrZXlzIHRvIGJlIGV4Y2x1ZGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2x1ZGVkS2V5cygpCisgICAgeworICAgICAgICB0ZXN0RXhjbHVkZWRLZXlzKCIteCIpOworICAgICAgICB0ZXN0RXhjbHVkZWRLZXlzKCItLWV4Y2x1ZGUta2V5Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0RXhjbHVkZWRLZXlzKFN0cmluZyBvcHRpb24pCisgICAgeworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMoU1NUQUJMRV8xLCAiLS1taW4tc2l6ZSIsICIwIiwgb3B0aW9uLCAiMSIsIG9wdGlvbiwgIjMiKQorICAgICAgICAgICAgICAgIC5jb250YWlucyhIRUFERVJfMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBQYXJ0aXRpb246ICcwJyAoMzApIGxpdmUsIHNpemU6IDAuMDMyIEtpQiwgcm93czogMSwgY2VsbHM6IDEsIHRvbWJzdG9uZXM6IDAgKHJvdzowLCByYW5nZTowLCBjb21wbGV4OjAsIGNlbGw6MCwgcm93LVRUTGQ6MCwgY2VsbC1UVExkOjApXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzInICgzMikgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnNCcgKDM0KSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzEgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDMgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAwIDIgNFxuIikKKyAgICAgICAgICAgICAgICAuY29udGFpbnMoImNvdW50ICAgICAgICAgICAgICAgICAgICAgM1xuIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdFRvb2xTdWNjZWRzKFNTVEFCTEVfMSwgIi0tbWluLXNpemUiLCAiMCIsIG9wdGlvbiwgIjAiLCBvcHRpb24sICIyIiwgb3B0aW9uLCAiNCIpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zKEhFQURFUl8xICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFBhcnRpdGlvbjogJzEnICgzMSkgbGl2ZSwgc2l6ZTogMC4wMzQgS2lCLCByb3dzOiAxLCBjZWxsczogMSwgdG9tYnN0b25lczogMCAocm93OjAsIHJhbmdlOjAsIGNvbXBsZXg6MCwgY2VsbDowLCByb3ctVFRMZDowLCBjZWxsLVRUTGQ6MClcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgUGFydGl0aW9uOiAnMycgKDMzKSBsaXZlLCBzaXplOiAwLjAzNCBLaUIsIHJvd3M6IDEsIGNlbGxzOiAxLCB0b21ic3RvbmVzOiAwIChyb3c6MCwgcmFuZ2U6MCwgY29tcGxleDowLCBjZWxsOjAsIHJvdy1UVExkOjAsIGNlbGwtVFRMZDowKVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VtbWFyeSBvZiAgIzEgKGJpZy1tYSk6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEZpbGU6ICIgKyBTU1RBQkxFXzEgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIDIgcGFydGl0aW9ucyBtYXRjaFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBLZXlzOiAxIDNcbiIpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zKCJjb3VudCAgICAgICAgICAgICAgICAgICAgIDJcbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGZsYWcgZm9yIHByb2R1Y2luZyBtYWNoaW5lLXJlYWRhYmxlIENTViBvdXRwdXQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q1NWKCkKKyAgICB7CisgICAgICAgIHRlc3RDU1YoIi1tIik7CisgICAgICAgIHRlc3RDU1YoIi0tY3N2Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0Q1NWKFN0cmluZyBvcHRpb24pCisgICAgeworICAgICAgICBhc3NlcnRUaGF0VG9vbFN1Y2NlZHMob3B0aW9uLCAiLS1taW4tc2l6ZSIsICIzNSIsIFNTVEFCTEVfMSwgU1NUQUJMRV8yKQorICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8oZm9ybWF0KCJrZXksa2V5QmluYXJ5LGxpdmUsb2Zmc2V0LHNpemUscm93Q291bnQsY2VsbENvdW50LHRvbWJzdG9uZUNvdW50LCIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb3dUb21ic3RvbmVDb3VudCxyYW5nZVRvbWJzdG9uZUNvdW50LGNvbXBsZXhUb21ic3RvbmVDb3VudCxjZWxsVG9tYnN0b25lQ291bnQsIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJvd1R0bEV4cGlyZWQsY2VsbFR0bEV4cGlyZWQsZGlyZWN0b3J5LGtleXNwYWNlLHRhYmxlLGluZGV4LHNuYXBzaG90LGJhY2t1cCwiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGlvbixmb3JtYXQsdmVyc2lvblxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiMFwiLDMwLHRydWUsMCw2NzIwMCw1MCw1MCwwLDAsMCwwLDAsMCwwLCVzLCwsLCwsMSxiaWcsbWFcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjFcIiwzMSx0cnVlLDY3MjAwLDY3MjA1LDUwLDUwLDAsMCwwLDAsMCwwLDAsJTxzLCwsLCwsMSxiaWcsbWFcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjJcIiwzMix0cnVlLDEzNDQwNSw2NzIwNSw1MCw1MCwwLDAsMCwwLDAsMCwwLCU8cywsLCwsLDEsYmlnLG1hXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIzXCIsMzMsdHJ1ZSwyMDE2MTAsNjcyMDUsNTAsNTAsMCwwLDAsMCwwLDAsMCwlPHMsLCwsLCwxLGJpZyxtYVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiNFwiLDM0LHRydWUsMjY4ODE1LDY3MjA1LDUwLDUwLDAsMCwwLDAsMCwwLDAsJTxzLCwsLCwsMSxiaWcsbWFcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjFcIiwzMSx0cnVlLDMzLDM1LDEsMSwwLDAsMCwwLDAsMCwwLCVzLCwsLCwsMSxiaWcsbWFcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjJcIiwzMix0cnVlLDY4LDM1LDEsMSwwLDAsMCwwLDAsMCwwLCU8cywsLCwsLDEsYmlnLG1hXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIzXCIsMzMsdHJ1ZSwxMDMsMzUsMSwxLDAsMCwwLDAsMCwwLDAsJTxzLCwsLCwsMSxiaWcsbWFcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIjRcIiwzNCx0cnVlLDEzOCwzNSwxLDEsMCwwLDAsMCwwLDAsMCwlPHMsLCwsLCwxLGJpZyxtYVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU1RBQkxFXzIsIFNTVEFCTEVfMSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEFic3RyYWN0U3RyaW5nQXNzZXJ0PD8+IGFzc2VydFRoYXRUb29sU3VjY2VkcyhTdHJpbmcuLi4gYXJncykKKyAgICB7CisgICAgICAgIFRvb2xSZXN1bHQgdG9vbCA9IGludm9rZVRvb2woYXJncyk7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldEV4aXRDb2RlKCkpLmlzWmVybygpOworICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisgICAgICAgIHJldHVybiBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNzdGFibGUoU3RyaW5nIHRhYmxlKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBmaW5kT25lU1NUYWJsZSgibGVnYWN5X3NzdGFibGVzIiwgdGFibGUpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFRvb2xSZXN1bHQgaW52b2tlVG9vbChTdHJpbmcuLi4gYXJncykKKyAgICB7CisgICAgICAgIHJldHVybiBUb29sUnVubmVyLmludm9rZUNsYXNzKFNTVGFibGVQYXJ0aXRpb25zLmNsYXNzLCBhcmdzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZVJlcGFpcmVkQXRTZXR0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU1NUYWJsZVJlcGFpcmVkQXRTZXR0ZXJUZXN0LmphdmEKaW5kZXggMzUzMTA3NS4uOWQzYTYwOSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1NTVGFibGVSZXBhaXJlZEF0U2V0dGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TU1RhYmxlUmVwYWlyZWRBdFNldHRlclRlc3QuamF2YQpAQCAtNDEsNyArNDEsNyBAQAogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCksIENvcmVNYXRjaGVycy5jb250YWluc1N0cmluZ0lnbm9yaW5nQ2FzZSgidXNhZ2U6IikpOwogICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRvb2wuZ2V0RXhpdENvZGUoKSk7Ci0gICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwpOworICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CkBAIC03OSw3ICs3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0taXMtcmVwYWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRPbmVTU1RhYmxlKCJsZWdhY3lfc3N0YWJsZXMiLCAibGVnYWN5X21hX3NpbXBsZSIpKTsKICAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChPUFRJT05BTF9USFJFQURTX1dJVEhfU0NIRU1BKTsKKyAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSwgZmFsc2UpOwogICAgICAgICBhc3NlcnRTY2hlbWFOb3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0Q0xTTU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRTeXN0ZW1LU05vdExvYWRlZCgpOwpAQCAtOTUsNyArOTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLWlzLXVucmVwYWlyZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRPbmVTU1RhYmxlKCJsZWdhY3lfc3N0YWJsZXMiLCAibGVnYWN5X21hX3NpbXBsZSIpKTsKICAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChPUFRJT05BTF9USFJFQURTX1dJVEhfU0NIRU1BKTsKKyAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSwgZmFsc2UpOwogICAgICAgICBhc3NlcnRTY2hlbWFOb3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0Q0xTTU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRTeXN0ZW1LU05vdExvYWRlZCgpOwpAQCAtMTEzLDcgKzExMyw3IEBACiAgICAgICAgIFN0cmluZyBmaWxlID0gdG1wRmlsZS5hYnNvbHV0ZVBhdGgoKTsKICAgICAgICAgVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTU1RhYmxlUmVwYWlyZWRBdFNldHRlci5jbGFzcywgIi0tcmVhbGx5LXNldCIsICItLWlzLXJlcGFpcmVkIiwgIi1mIiwgZmlsZSk7CiAgICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQoT1BUSU9OQUxfVEhSRUFEU19XSVRIX1NDSEVNQSk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKE9QVElPTkFMX1RIUkVBRFNfV0lUSF9TQ0hFTUEsIGZhbHNlKTsKICAgICAgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U3lzdGVtS1NOb3RMb2FkZWQoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lU3BsaXR0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNwbGl0dGVyVGVzdC5qYXZhCmluZGV4IGQyODU1OGYuLjA1ZTdiMzQgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lU3BsaXR0ZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVTcGxpdHRlclRlc3QuamF2YQpAQCAtMjUsNiArMjUsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lci5Ub29sUmVzdWx0OwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CiBpbXBvcnQgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVyczsKQEAgLTQyLDcgKzQzLDcgQEAKICAgICAgICAgLy8gdGhlIGxlZ2FjeSB0YWJsZXMgdXNlIGEgZGlmZmVyZW50IHBhcnRpdGlvbmVyIDooCiAgICAgICAgIC8vIChEb24ndCB1c2UgQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5jbGFzcy5nZXROYW1lKCkgYXMgdGhhdCB3b3VsZCBpbml0aWFsaXplIHRoZSBjbGFzcyBhbmQgd29yawogICAgICAgICAvLyBhZ2FpbnN0IHRoZSBnb2FsIG9mIHRoaXMgdGVzdCB0byBjaGVjayBjbGFzc2VzIGFuZCB0aHJlYWRzIGluaXRpYWxpemVkIGJ5IHRoZSB0b29sLikKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEucGFydGl0aW9uZXIiLCAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXIiKTsKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBUlRJVElPTkVSLnNldFN0cmluZygib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXIiKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVTcGxpdHRlcldpdGhDUUxUZXN0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNwbGl0dGVyV2l0aENRTFRlc3RlclRlc3QuamF2YQppbmRleCA5NDRiOGRlLi40MGYwNzVhIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNwbGl0dGVyV2l0aENRTFRlc3RlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVNwbGl0dGVyV2l0aENRTFRlc3RlclRlc3QuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXIuVG9vbFJlc3VsdDsKIGltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9VVElMX0FMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCkBAIC0xMjQsNiArMTI1LDYgQEAKICAgICAgICAgYXNzZXJ0VHJ1ZSgiR2VuZXJhdGVkIHNzdGFibGUgbXVzdCBiZSBhdCBsZWFzdCAxTWlCIiwgKG5ldyBGaWxlKHNzdGFibGVGaWxlTmFtZSkpLmxlbmd0aCgpID4gMTAyNCoxMDI0KTsKICAgICAgICAgc3N0YWJsZXNEaXIgPSBuZXcgRmlsZShzc3RhYmxlRmlsZU5hbWUpLnBhcmVudCgpOwogICAgICAgICBvcmlnU3N0YWJsZXMgPSBBcnJheXMuYXNMaXN0KHNzdGFibGVzRGlyLnRyeUxpc3QoKSk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eShVdGlsLkFMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNULCAidHJ1ZSIpOyAvLyBOZWNlc3NhcnkgZm9yIHRlc3RpbmcKKyAgICAgICAgVEVTVF9VVElMX0FMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNULnNldEJvb2xlYW4odHJ1ZSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVVcGdyYWRlck9uU1N0YWJsZXNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVVwZ3JhZGVyT25TU3RhYmxlc1Rlc3QuamF2YQppbmRleCBlOWQyMDcwLi4xMzcwNWY5IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVVwZ3JhZGVyT25TU3RhYmxlc1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVVwZ3JhZGVyT25TU3RhYmxlc1Rlc3QuamF2YQpAQCAtMTgsNTEgKzE4LDUyIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHM7CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaXN0cmlidXRlZC5zaGFyZWQuV2l0aFByb3BlcnRpZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuU3RhcnR1cEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLkxlZ2FjeVNTVGFibGVUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5TdG9yYWdlU2VydmljZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ub29sUnVubmVyLlRvb2xSZXN1bHQ7CiBpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKLWltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLnV0aWwuTGlzdHM7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1Q7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogCiAvKgogICogU1N0YWJsZVVwZGF0ZXIgc2hvdWxkIGJlIHJ1biB3aXRoIHRoZSBzZXJ2ZXIgc2h1dGRvd24sIGJ1dCB3ZSBuZWVkIHRvIHNldCB1cCBhIGNlcnRhaW4gZW52IHRvIGJlIGFibGUgdG8KICAqIGxvYWQvc3dhcC9kcm9wIHNzdGFibGUgZmlsZXMgdW5kZXIgdGhlIHRlc3QncyBmZWV0LiBIZW5jZSB3aHkgd2UgbmVlZCBhIHNlcGFyYXRlIGZpbGUgdnMgU3RhbmRhbG9uZVVwZ3JhZGVyVGVzdC4KLSAqIAorICoKICAqIENhdXRpb246IGhlYXZ5IGhhY2tpbmcgYWhlYWQuCiAgKi8KIHB1YmxpYyBjbGFzcyBTdGFuZGFsb25lVXBncmFkZXJPblNTdGFibGVzVGVzdAogeworICAgIHN0YXRpYyBXaXRoUHJvcGVydGllcyBwcm9wZXJ0aWVzOworCiAgICAgU3RyaW5nIGxlZ2FjeUlkID0gTGVnYWN5U1NUYWJsZVRlc3QubGVnYWN5VmVyc2lvbnNbTGVnYWN5U1NUYWJsZVRlc3QubGVnYWN5VmVyc2lvbnMubGVuZ3RoIC0gMV07CiAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7CiAgICAgICAgIExlZ2FjeVNTVGFibGVUZXN0LmRlZmluZVNjaGVtYSgpOwotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoVXRpbC5BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVCwgInRydWUiKTsgLy8gTmVjZXNzYXJ5IGZvciB0ZXN0aW5nCisgICAgICAgIHByb3BlcnRpZXMgPSBuZXcgV2l0aFByb3BlcnRpZXMoKS5zZXQoVEVTVF9VVElMX0FMTE9XX1RPT0xfUkVJTklUX0ZPUl9URVNULCB0cnVlKTsKICAgICB9CiAKICAgICBAQWZ0ZXJDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckNsYXNzRW52KCkKICAgICB7Ci0gICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KFV0aWwuQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QpOworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTc2LDkgKzc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZWdhY3lfdGFibGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGVnYWN5XyIgKyBsZWdhY3lJZCArICJfc2ltcGxlIik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiRm91bmQgMSBzc3RhYmxlcyB0aGF0IG5lZWQgdXBncmFkaW5nLiIpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoImxlZ2FjeV90YWJsZXMvbGVnYWN5XyIgKyBsZWdhY3lJZCArICJfc2ltcGxlIik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiLURhdGEuZGIiKTsKKyAgICAgICAgY2hlY2tVcGdyYWRlVG9vbE91dHB1dCh0b29sLCBvcmlnRmlsZXMpOwogICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CiAKICAgICAgICAgTGlzdDxTdHJpbmc+IG5ld0ZpbGVzID0gZ2V0U1N0YWJsZUZpbGVzKCJsZWdhY3lfdGFibGVzIiwgImxlZ2FjeV8iICsgbGVnYWN5SWQgKyAiX3NpbXBsZSIpOwpAQCAtMTA1LDEzICsxMDQsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmdzbmFwc2hvdCIpOwogICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIkZvdW5kIDAgc3N0YWJsZXMgdGhhdCBuZWVkIHVwZ3JhZGluZy4iKTsKIAorICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cygibGVnYWN5X3RhYmxlcyIsICJsZWdhY3lfIiArIGxlZ2FjeUlkICsgIl9zaW1wbGUiKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gY2ZzLmdldERpcmVjdG9yaWVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNzdGFibGVMaXN0ZXIoRGlyZWN0b3JpZXMuT25UeG5FcnIuSUdOT1JFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc25hcHNob3RzKCJ0ZXN0c25hcHNob3QiKS5saXN0KCkua2V5U2V0KCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChkZXNjcmlwdG9yIC0+IGRlc2NyaXB0b3IuYmFzZUZpbGUoKS50b1N0cmluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKwogICAgICAgICB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTdGFuZGFsb25lVXBncmFkZXIuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZWdhY3lfdGFibGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxlZ2FjeV8iICsgbGVnYWN5SWQgKyAiX3NpbXBsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0c25hcHNob3QiKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJGb3VuZCAxIHNzdGFibGVzIHRoYXQgbmVlZCB1cGdyYWRpbmcuIik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygibGVnYWN5X3RhYmxlcy9sZWdhY3lfIiArIGxlZ2FjeUlkICsgIl9zaW1wbGUiKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCItRGF0YS5kYiIpOworICAgICAgICBjaGVja1VwZ3JhZGVUb29sT3V0cHV0KHRvb2wsIG5hbWVzKTsKKwogICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CiAgICAgfQogCkBAIC0xMjUsOSArMTMwLDggQEAKICAgICAgICAgVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTdGFuZGFsb25lVXBncmFkZXIuY2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxlZ2FjeV90YWJsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsZWdhY3lfIiArIGxlZ2FjeUlkICsgIl9zaW1wbGUiKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJGb3VuZCAxIHNzdGFibGVzIHRoYXQgbmVlZCB1cGdyYWRpbmcuIik7Ci0gICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygibGVnYWN5X3RhYmxlcy9sZWdhY3lfIiArIGxlZ2FjeUlkICsgIl9zaW1wbGUiKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCItRGF0YS5kYiIpOworCisgICAgICAgIGNoZWNrVXBncmFkZVRvb2xPdXRwdXQodG9vbCwgb3JpZ0ZpbGVzKTsKICAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwogCiAgICAgICAgIExpc3Q8U3RyaW5nPiBuZXdGaWxlcyA9IGdldFNTdGFibGVGaWxlcygibGVnYWN5X3RhYmxlcyIsICJsZWdhY3lfIiArIGxlZ2FjeUlkICsgIl9zaW1wbGUiKTsKQEAgLTEzOCwyMiArMTQyLDI1IEBACiAgICAgICAgIEtleXNwYWNlLm9wZW4oImxlZ2FjeV90YWJsZXMiKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSgibGVnYWN5XyIgKyBsZWdhY3lJZCArICJfc2ltcGxlIikubG9hZE5ld1NTVGFibGVzKCk7CiAgICAgfQogCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1VwZ3JhZGVUb29sT3V0cHV0KFRvb2xSZXN1bHQgdG9vbCwgTGlzdDxTdHJpbmc+IG5hbWVzKQorICAgIHsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJGb3VuZCAiICsgbmFtZXMuc2l6ZSgpICsgIiBzc3RhYmxlcyB0aGF0IG5lZWQgdXBncmFkaW5nLiIpOworICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5tYXRjaGVzKCIoP3MpLipVcGdyYWRpbmcuKiIgKyBQYXR0ZXJuLnF1b3RlKG5hbWUpICsgIi4qIik7CisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkubWF0Y2hlcygiKD9zKS4qVXBncmFkZSBvZi4qIiArIFBhdHRlcm4ucXVvdGUobmFtZSkgKyAiLipjb21wbGV0ZS4qIik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRTU3RhYmxlRmlsZXMoU3RyaW5nIGtzLCBTdHJpbmcgdGFibGUpIHRocm93cyBTdGFydHVwRXhjZXB0aW9uCiAgICAgewogICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKGtzKS5nZXRDb2x1bW5GYW1pbHlTdG9yZSh0YWJsZSk7CiAgICAgICAgIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWwuZmx1c2goY2ZzKTsKICAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUuc2NydWJEYXRhRGlyZWN0b3JpZXMoY2ZzLm1ldGFkYXRhKCkpOwogCi0gICAgICAgIFNldDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKTsKLSAgICAgICAgaWYgKHNzdGFibGVzLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVybiBMaXN0cy5lbXB0eUxpc3QoKTsKLQotICAgICAgICBTdHJpbmcgc3N0YWJsZUZpbGVOYW1lID0gc3N0YWJsZXMuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RmlsZW5hbWUoKTsKLSAgICAgICAgRmlsZSBzc3RhYmxlc0RpciA9IG5ldyBGaWxlKHNzdGFibGVGaWxlTmFtZSkucGFyZW50KCk7Ci0gICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHNzdGFibGVzRGlyLnRyeUxpc3QoKSkKLSAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQotICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmIC0+IGYuaXNGaWxlKCkpCi0gICAgICAgICAgICAgICAgICAgICAubWFwKGZpbGUgLT4gZmlsZS50b1N0cmluZygpKQotICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIHJldHVybiBjZnMuZ2V0RGlyZWN0b3JpZXMoKQorICAgICAgICAgICAgICAgICAgLnNzdGFibGVMaXN0ZXIoRGlyZWN0b3JpZXMuT25UeG5FcnIuSUdOT1JFKS5saXN0KCkua2V5U2V0KCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgIC5tYXAoZGVzY3JpcHRvciAtPiBkZXNjcmlwdG9yLmJhc2VGaWxlKCkudG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lVmVyaWZpZXJPblNTVGFibGVzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVWZXJpZmllck9uU1NUYWJsZXNUZXN0LmphdmEKaW5kZXggNjVkZDEyNS4uYjFlYjEzOSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVWZXJpZmllck9uU1NUYWJsZXNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVWZXJpZmllck9uU1NUYWJsZXNUZXN0LmphdmEKQEAgLTI5LDEyICsyOSwxNiBAQAogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlVwZGF0ZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5QYXJ0aXRpb25Qb3NpdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRpc3RyaWJ1dGVkLnNoYXJlZC5XaXRoUHJvcGVydGllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlZlcmlmeVRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuYmlnLkJpZ1RhYmxlVmVyaWZpZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lci5Ub29sUmVzdWx0OwpAQCAtNDIsMjggKzQ2LDMxIEBACiBpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuc3RhbmRhcmRDRk1EOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlRFU1RfVVRJTF9BTExPV19UT09MX1JFSU5JVF9GT1JfVEVTVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIC8qKgogICogQ2xhc3MgdGhhdCB0ZXN0cyB0YWJsZXMgZm9yIHtAbGluayBTdGFuZGFsb25lVmVyaWZpZXJ9IGJ5IHVwZGF0aW5nIHVzaW5nIHtAbGluayBTY2hlbWFMb2FkZXJ9CiAgKiBTaW1pbGFyIGluIHZlaW4gdG8gb3RoZXIge0BsaW5rIFNjaGVtYUxvYWRlcn0gdHlwZSB0ZXN0cywgYXMgd2VsbCBhcyB7QGxpbmsgU3RhbmRhbG9uZVVwZ3JhZGVyT25TU3RhYmxlc1Rlc3R9LgotICogU2luY2UgdGhlIHRvb2wgbWFpbmx5IGV4ZXJjaXNlcyB0aGUge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uVmVyaWZpZXJ9LCB3ZSBlbGVjdCB0bwotICogbm90IHJ1biBldmVyeSBjb25jZWl2YWJsZSBvcHRpb24gYXMgbWFueSB0ZXN0cyBhcmUgYWxyZWFkeSBjb3ZlcmVkIGJ5IHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5WZXJpZnlUZXN0fS4KKyAqIFNpbmNlIHRoZSB0b29sIG1haW5seSBleGVyY2lzZXMgdGhlIHtAbGluayBCaWdUYWJsZVZlcmlmaWVyfSwgd2UgZWxlY3QgdG8KKyAqIG5vdCBydW4gZXZlcnkgY29uY2VpdmFibGUgb3B0aW9uIGFzIG1hbnkgdGVzdHMgYXJlIGFscmVhZHkgY292ZXJlZCBieSB7QGxpbmsgVmVyaWZ5VGVzdH0uCiAgKiAKICAqIE5vdGU6IHRoZSBjb21wbGV0ZSBjb3ZlcmFnZSBpcyBjb21wb3NlZCBvZjoKICAqIC0ge0BsaW5rIFN0YW5kYWxvbmVWZXJpZmllck9uU1NUYWJsZXNUZXN0fQogICogLSB7QGxpbmsgU3RhbmRhbG9uZVZlcmlmaWVyVGVzdH0KLSAqIC0ge0BsaW5rIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlZlcmlmeVRlc3R9CisgKiAtIHtAbGluayBWZXJpZnlUZXN0fQogICovCiBwdWJsaWMgY2xhc3MgU3RhbmRhbG9uZVZlcmlmaWVyT25TU1RhYmxlc1Rlc3QgZXh0ZW5kcyBPZmZsaW5lVG9vbFV0aWxzCiB7CisgICAgc3RhdGljIFdpdGhQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKQogICAgIHsKICAgICAgICAgLy8gc2luY2UgbGVnYWN5IHRhYmxlcyB0ZXN0IGRhdGEgdXNlcyBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyIHRoYXQncyB3aGF0IHdlIG5lZWQKICAgICAgICAgLy8gZm9yIHRoZSBjaGVjayB2ZXJzaW9uIHRvIHdvcmsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJjYXNzYW5kcmEucGFydGl0aW9uZXIiLCAib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXIiKTsKLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KFV0aWwuQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QsICJ0cnVlIik7IC8vIE5lY2Vzc2FyeSBmb3IgdGVzdGluZ2AKKyAgICAgICAgQ2Fzc2FuZHJhUmVsZXZhbnRQcm9wZXJ0aWVzLlBBUlRJVElPTkVSLnNldFN0cmluZygib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXIiKTsKKyAgICAgICAgcHJvcGVydGllcyA9IG5ldyBXaXRoUHJvcGVydGllcygpLnNldChURVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QsIHRydWUpOwogICAgICAgICBTY2hlbWFMb2FkZXIubG9hZFNjaGVtYSgpOwogICAgICAgICBTdG9yYWdlU2VydmljZS5pbnN0YW5jZS5pbml0U2VydmVyKCk7CiAgICAgfQpAQCAtNzIsNyArNzksNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyZG93bigpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIFNjaGVtYUxvYWRlci5jbGVhbnVwQW5kTGVhdmVEaXJzKCk7Ci0gICAgICAgIFN5c3RlbS5jbGVhclByb3BlcnR5KFV0aWwuQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1QpOworICAgICAgICBwcm9wZXJ0aWVzLmNsb3NlKCk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTEyOSw3ICsxMzYsNyBAQAogICAgICAgICBTdHJpbmcgY29ycnVwdFN0YXRzVGFibGUgPSAiY29ycnVwdFN0YXRzVGFibGUiOwogICAgICAgICBjcmVhdGVBbmRQb3B1bGF0ZVRhYmxlKGtleXNwYWNlTmFtZSwgY29ycnVwdFN0YXRzVGFibGUsIGNmcyAtPiB7CiAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgICAgICB0cnkgKFJhbmRvbUFjY2Vzc0ZpbGUgZmlsZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHNzdGFibGUuZGVzY3JpcHRvci5maWxlbmFtZUZvcihDb21wb25lbnQuU1RBVFMpLCAicnciKSkKKyAgICAgICAgICAgIHRyeSAoUmFuZG9tQWNjZXNzRmlsZSBmaWxlID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoc3N0YWJsZS5kZXNjcmlwdG9yLmZpbGVGb3IoQ29tcG9uZW50cy5TVEFUUykudG9KYXZhSU9GaWxlKCksICJydyIpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZpbGUuc2VlaygwKTsKICAgICAgICAgICAgICAgICBmaWxlLndyaXRlQnl0ZXMoU3RyaW5nVXRpbHMucmVwZWF0KCd6JywgMikpOwpAQCAtMTUwLDggKzE1Nyw4IEBACiAKICAgICAgICAgY3JlYXRlQW5kUG9wdWxhdGVUYWJsZShrZXlzcGFjZU5hbWUsIGNvcnJ1cHREYXRhVGFibGUsIGNmcyAtPiB7CiAgICAgICAgICAgICBTU1RhYmxlUmVhZGVyIHNzdGFibGUgPSBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgICAgICBsb25nIHJvdzBTdGFydCA9IHNzdGFibGUuZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24uRm9yS2V5LmdldChCeXRlQnVmZmVyVXRpbC5ieXRlcygiMCIpLCBjZnMuZ2V0UGFydGl0aW9uZXIoKSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpLnBvc2l0aW9uOwotICAgICAgICAgICAgbG9uZyByb3cxU3RhcnQgPSBzc3RhYmxlLmdldFBvc2l0aW9uKFBhcnRpdGlvblBvc2l0aW9uLkZvcktleS5nZXQoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoIjEiKSwgY2ZzLmdldFBhcnRpdGlvbmVyKCkpLCBTU1RhYmxlUmVhZGVyLk9wZXJhdG9yLkVRKS5wb3NpdGlvbjsKKyAgICAgICAgICAgIGxvbmcgcm93MFN0YXJ0ID0gc3N0YWJsZS5nZXRQb3NpdGlvbihQYXJ0aXRpb25Qb3NpdGlvbi5Gb3JLZXkuZ2V0KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKCIwIiksIGNmcy5nZXRQYXJ0aXRpb25lcigpKSwgU1NUYWJsZVJlYWRlci5PcGVyYXRvci5FUSk7CisgICAgICAgICAgICBsb25nIHJvdzFTdGFydCA9IHNzdGFibGUuZ2V0UG9zaXRpb24oUGFydGl0aW9uUG9zaXRpb24uRm9yS2V5LmdldChCeXRlQnVmZmVyVXRpbC5ieXRlcygiMSIpLCBjZnMuZ2V0UGFydGl0aW9uZXIoKSksIFNTVGFibGVSZWFkZXIuT3BlcmF0b3IuRVEpOwogICAgICAgICAgICAgbG9uZyBzdGFydFBvc2l0aW9uID0gTWF0aC5taW4ocm93MFN0YXJ0LCByb3cxU3RhcnQpOwogCiAgICAgICAgICAgICB0cnkgKFJhbmRvbUFjY2Vzc0ZpbGUgZmlsZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHNzdGFibGUuZ2V0RmlsZW5hbWUoKSwgInJ3IikpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVZlcmlmaWVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1N0YW5kYWxvbmVWZXJpZmllclRlc3QuamF2YQppbmRleCA5ZDhmNzk3Li5mOTRhNWQ2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvU3RhbmRhbG9uZVZlcmlmaWVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9TdGFuZGFsb25lVmVyaWZpZXJUZXN0LmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5WZXJpZnlUZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXIuVG9vbFJlc3VsdDsKIGltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOwogaW1wb3J0IG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnM7CkBAIC0zMyw3ICszNCw3IEBACiAgKiBOb3RlOiB0aGUgY29tcGxldGUgY292ZXJhZ2UgaXMgY29tcG9zZWQgb2Y6CiAgKiAtIHtAbGluayBTdGFuZGFsb25lVmVyaWZpZXJPblNTVGFibGVzVGVzdH0KICAqIC0ge0BsaW5rIFN0YW5kYWxvbmVWZXJpZmllclRlc3R9Ci0gKiAtIHtAbGluayBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5WZXJpZnlUZXN0fQorICogLSB7QGxpbmsgVmVyaWZ5VGVzdH0KICovCiBwdWJsaWMgY2xhc3MgU3RhbmRhbG9uZVZlcmlmaWVyVGVzdCBleHRlbmRzIE9mZmxpbmVUb29sVXRpbHMKIHsKQEAgLTIxOSw0ICsyMjAsNCBAQAogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRvb2wuZ2V0RXhpdENvZGUoKSk7CiAgICAgICAgIH0pOwogICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVG9vbFJ1bm5lci5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1Rvb2xSdW5uZXIuamF2YQppbmRleCBlM2I5NTk1Li5kM2I5ZjEwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVG9vbFJ1bm5lci5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Ub29sUnVubmVyLmphdmEKQEAgLTQwMiw3ICs0MDIsNyBAQAogICAgICAgICB7CiAgICAgICAgICAgICBTdHJpbmcgcmF3ID0gZ2V0U3RkZXJyKCk7CiAgICAgICAgICAgICBTdHJpbmcgY2xlYW5lZCA9IGdldENsZWFuZWRTdGRlcnIoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBjbGVhbiBzdGRlcnIgY29tcGxldGVseS5cblJhdyAobGVuZ3RoPSIgKyByYXcubGVuZ3RoKCkgKyAiKTpcbiIgKyByYXcgKyAKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkZhaWxlZCB0byBjbGVhbiBzdGRlcnIgY29tcGxldGVseS5cblJhdyAobGVuZ3RoPSIgKyByYXcubGVuZ3RoKCkgKyAiKTpcbiIgKyByYXcgKwogICAgICAgICAgICAgICAgICAgICAgICAiXG5DbGVhbmVkIChsZW5ndGg9IiArIGNsZWFuZWQubGVuZ3RoKCkgKyAiKTpcbiIgKyBjbGVhbmVkLAogICAgICAgICAgICAgICAgICAgICAgICBjbGVhbmVkLnRyaW0oKS5pc0VtcHR5KCkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVG9vbHNTY2hlbWFMb2FkaW5nVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1Rvb2xzU2NoZW1hTG9hZGluZ1Rlc3QuamF2YQppbmRleCAxYTk5NjQzLi5kMjM4MzI3IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVG9vbHNTY2hlbWFMb2FkaW5nVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9Ub29sc1NjaGVtYUxvYWRpbmdUZXN0LmphdmEKQEAgLTM0LDcgKzM0LDcgQEAKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpLCBDb3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmdJZ25vcmluZ0Nhc2UoInVzYWdlOiIpKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldENsZWFuZWRTdGRlcnIoKSwgQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nSWdub3JpbmdDYXNlKCJNaXNzaW5nIGFyZ3VtZW50cyIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRvb2wuZ2V0RXhpdENvZGUoKSk7Ci0gICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwpOworICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CkBAIC00OSw3ICs0OSw3IEBACiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSwgQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nSWdub3JpbmdDYXNlKCJ1c2FnZToiKSk7CiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCksIENvcmVNYXRjaGVycy5jb250YWluc1N0cmluZ0lnbm9yaW5nQ2FzZSgiTWlzc2luZyBhcmd1bWVudHMiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCB0b29sLmdldEV4aXRDb2RlKCkpOwotICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQobnVsbCwgZmFsc2UpOwogICAgICAgICBhc3NlcnRTY2hlbWFOb3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0Q0xTTU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRTeXN0ZW1LU05vdExvYWRlZCgpOwpAQCAtNjQsNyArNjQsNyBAQAogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCksIENvcmVNYXRjaGVycy5jb250YWluc1N0cmluZ0lnbm9yaW5nQ2FzZSgidXNhZ2U6IikpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpLCBDb3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmdJZ25vcmluZ0Nhc2UoIk5vIHNzdGFibGVzIHRvIHNwbGl0IikpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdG9vbC5nZXRFeGl0Q29kZSgpKTsKLSAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQobnVsbCk7CisgICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwsIGZhbHNlKTsKICAgICAgICAgYXNzZXJ0U2NoZW1hTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydENMU01Ob3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0U3lzdGVtS1NOb3RMb2FkZWQoKTsKQEAgLTc5LDcgKzc5LDcgQEAKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpLCBDb3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmdJZ25vcmluZ0Nhc2UoInVzYWdlOiIpKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldENsZWFuZWRTdGRlcnIoKSwgQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nSWdub3JpbmdDYXNlKCJNaXNzaW5nIGFyZ3VtZW50cyIpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRvb2wuZ2V0RXhpdENvZGUoKSk7Ci0gICAgICAgIGFzc2VydE5vVW5leHBlY3RlZFRocmVhZHNTdGFydGVkKG51bGwpOworICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsLCBmYWxzZSk7CiAgICAgICAgIGFzc2VydFNjaGVtYU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRDTFNNTm90TG9hZGVkKCk7CiAgICAgICAgIGFzc2VydFN5c3RlbUtTTm90TG9hZGVkKCk7CkBAIC05NCw3ICs5NCw3IEBACiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSwgQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nSWdub3JpbmdDYXNlKCJ1c2FnZToiKSk7CiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCksIENvcmVNYXRjaGVycy5jb250YWluc1N0cmluZ0lnbm9yaW5nQ2FzZSgiTWlzc2luZyBhcmd1bWVudHMiKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCB0b29sLmdldEV4aXRDb2RlKCkpOwotICAgICAgICBhc3NlcnROb1VuZXhwZWN0ZWRUaHJlYWRzU3RhcnRlZChudWxsKTsKKyAgICAgICAgYXNzZXJ0Tm9VbmV4cGVjdGVkVGhyZWFkc1N0YXJ0ZWQobnVsbCwgZmFsc2UpOwogICAgICAgICBhc3NlcnRTY2hlbWFOb3RMb2FkZWQoKTsKICAgICAgICAgYXNzZXJ0Q0xTTU5vdExvYWRlZCgpOwogICAgICAgICBhc3NlcnRTeXN0ZW1LU05vdExvYWRlZCgpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL1RvcFBhcnRpdGlvbnNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVG9wUGFydGl0aW9uc1Rlc3QuamF2YQppbmRleCA5NzVhZDE1Li5kOWNmZGVlIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVG9wUGFydGl0aW9uc1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvVG9wUGFydGl0aW9uc1Rlc3QuamF2YQpAQCAtMTgsMTYgKzE4LDIwIEBACiAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHM7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiAKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5Db21wb3NpdGVEYXRhOwogCiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuVW5pbnRlcnJ1cHRpYmxlczsKIAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKQEAgLTM2LDE4ICs0MCwzMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlN5c3RlbUtleXNwYWNlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5tZXRyaWNzLlNhbXBsZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLktleXNwYWNlUGFyYW1zOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuU3RvcmFnZVNlcnZpY2U7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZy5mb3JtYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlQcm9jZXNzb3IuZXhlY3V0ZUludGVybmFsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCisvKioKKyAqIEluY2x1ZGVzIHRlc3QgY2FzZXMgZm9yIGJvdGggdGhlICd0b3BwYXJ0aXRpb25zJyBjb21tYW5kIGFuZCBpdHMgc3VjY2Vzc29yICdwcm9maWxlbG9hZCcKKyAqLwogcHVibGljIGNsYXNzIFRvcFBhcnRpdGlvbnNUZXN0CiB7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgS0VZU1BBQ0UgPSBUb3BQYXJ0aXRpb25zVGVzdC5jbGFzcy5nZXRTaW1wbGVOYW1lKCkudG9Mb3dlckNhc2UoKTsKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBUQUJMRSA9ICJ0ZXN0IjsKKwogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KICAgICB7CiAgICAgICAgIFNjaGVtYUxvYWRlci5wcmVwYXJlU2VydmVyKCk7CisgICAgICAgIFNjaGVtYUxvYWRlci5jcmVhdGVLZXlzcGFjZShLRVlTUEFDRSwgS2V5c3BhY2VQYXJhbXMuc2ltcGxlKDEpKTsKKyAgICAgICAgZXhlY3V0ZUludGVybmFsKGZvcm1hdCgiQ1JFQVRFIFRBQkxFICVzLiVzIChrIHRleHQsIGMgdGV4dCwgdiB0ZXh0LCBQUklNQVJZIEtFWSAoaywgYykpIiwgS0VZU1BBQ0UsIFRBQkxFKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTU5LDcgKzc1LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcS5wdXQoU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2Uuc2FtcGxlUGFydGl0aW9ucygxMDAwLCAxMDAsIDEwLCBMaXN0cy5uZXdBcnJheUxpc3QoIlJFQURTIiwgIldSSVRFUyIpKSk7CisgICAgICAgICAgICAgICAgcS5wdXQoU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2Uuc2FtcGxlUGFydGl0aW9ucyhudWxsLCAxMDAwLCAxMDAsIDEwLCBMaXN0cy5uZXdBcnJheUxpc3QoIlJFQURTIiwgIldSSVRFUyIpKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgICAgICB7CkBAIC04Miw0ICs5OCwxMzIgQEAKICAgICAgICAgTGlzdDxDb21wb3NpdGVEYXRhPiByZXN1bHQgPSBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cygic3lzdGVtIiwgImxvY2FsIikuZmluaXNoTG9jYWxTYW1wbGluZygiUkVBRFMiLCA1KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJZiB0aGlzIGZhaWxlZCB5b3UgcHJvYmFibHkgaGF2ZSB0byByYWlzZSB0aGUgYmVnaW5Mb2NhbFNhbXBsaW5nIGR1cmF0aW9uIiwgMSwgcmVzdWx0LnNpemUoKSk7CiAgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9wUGFydGl0aW9uc1Jvd1RvbWJzdG9uZUFuZFNTVGFibGVDb3VudCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGludCBjb3VudCA9IDEwOworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBDb2x1bW5GYW1pbHlTdG9yZS5nZXRJZkV4aXN0cyhLRVlTUEFDRSwgVEFCTEUpOworICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisKKyAgICAgICAgZXhlY3V0ZUludGVybmFsKGZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMoayxjLHYpIFZBTFVFUyAoJ2EnLCAnYScsICdhJykiLCBLRVlTUEFDRSwgVEFCTEUpKTsKKyAgICAgICAgZXhlY3V0ZUludGVybmFsKGZvcm1hdCgiSU5TRVJUIElOVE8gJXMuJXMoayxjLHYpIFZBTFVFUyAoJ2EnLCAnYicsICdhJykiLCBLRVlTUEFDRSwgVEFCTEUpKTsKKyAgICAgICAgY2ZzLmZvcmNlQmxvY2tpbmdGbHVzaChDb2x1bW5GYW1pbHlTdG9yZS5GbHVzaFJlYXNvbi5VTklUX1RFU1RTKTsKKworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KCJJTlNFUlQgSU5UTyAlcy4lcyhrLGMsdikgVkFMVUVTICgnYScsICdjJywgJ2EnKSIsIEtFWVNQQUNFLCBUQUJMRSkpOworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KCJJTlNFUlQgSU5UTyAlcy4lcyhrLGMsdikgVkFMVUVTICgnYicsICdiJywgJ2InKSIsIEtFWVNQQUNFLCBUQUJMRSkpOworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KCJJTlNFUlQgSU5UTyAlcy4lcyhrLGMsdikgVkFMVUVTICgnYycsICdjJywgJ2MnKSIsIEtFWVNQQUNFLCBUQUJMRSkpOworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KCJJTlNFUlQgSU5UTyAlcy4lcyhrLGMsdikgVkFMVUVTICgnYycsICdkJywgJ2EnKSIsIEtFWVNQQUNFLCBUQUJMRSkpOworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KCJJTlNFUlQgSU5UTyAlcy4lcyhrLGMsdikgVkFMVUVTICgnYycsICdlJywgJ2EnKSIsIEtFWVNQQUNFLCBUQUJMRSkpOworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KCJERUxFVEUgRlJPTSAlcy4lcyBXSEVSRSBrPSdhJyBBTkQgYz0nYSciLCBLRVlTUEFDRSwgVEFCTEUpKTsKKyAgICAgICAgY2ZzLmZvcmNlQmxvY2tpbmdGbHVzaChDb2x1bW5GYW1pbHlTdG9yZS5GbHVzaFJlYXNvbi5VTklUX1RFU1RTKTsKKworICAgICAgICAvLyB0ZXN0IG11bHRpLXBhcnRpdGlvbiByZWFkCisgICAgICAgIGNmcy5iZWdpbkxvY2FsU2FtcGxpbmcoIlJFQURfUk9XX0NPVU5UIiwgY291bnQsIDI0MDAwMCk7CisgICAgICAgIGNmcy5iZWdpbkxvY2FsU2FtcGxpbmcoIlJFQURfVE9NQlNUT05FX0NPVU5UIiwgY291bnQsIDI0MDAwMCk7CisgICAgICAgIGNmcy5iZWdpbkxvY2FsU2FtcGxpbmcoIlJFQURfU1NUQUJMRV9DT1VOVCIsIGNvdW50LCAyNDAwMDApOworCisgICAgICAgIGV4ZWN1dGVJbnRlcm5hbChmb3JtYXQoIlNFTEVDVCAqIEZST00gJXMuJXMiLCBLRVlTUEFDRSwgVEFCTEUpKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOyAvLyBzaW11bGF0ZSB3YWl0aW5nIGJlZm9yZSBmaW5pc2hpbmcgc2FtcGxpbmcKKworICAgICAgICBMaXN0PENvbXBvc2l0ZURhdGE+IHJvd0NvdW50cyA9IGNmcy5maW5pc2hMb2NhbFNhbXBsaW5nKCJSRUFEX1JPV19DT1VOVCIsIGNvdW50KTsKKyAgICAgICAgTGlzdDxDb21wb3NpdGVEYXRhPiB0c0NvdW50cyA9IGNmcy5maW5pc2hMb2NhbFNhbXBsaW5nKCJSRUFEX1RPTUJTVE9ORV9DT1VOVCIsIGNvdW50KTsKKyAgICAgICAgTGlzdDxDb21wb3NpdGVEYXRhPiBzc3RDb3VudHMgPSBjZnMuZmluaXNoTG9jYWxTYW1wbGluZygiUkVBRF9TU1RBQkxFX0NPVU5UIiwgY291bnQpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBzc3RDb3VudHMuc2l6ZSgpKTsgLy8gbm90IHRyYWNrZWQgb24gcmFuZ2UgcmVhZHMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJvd0NvdW50cy5zaXplKCkpOyAvLyAzIHBhcnRpdGlvbnMgcmVhZCAoYSwgYiwgYykKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRzQ291bnRzLnNpemUoKSk7IC8vIDEgcGFydGl0aW9uIHcgdG9tYnN0b25lcyAoYSkKKworICAgICAgICBmb3IgKENvbXBvc2l0ZURhdGEgZGF0YSA6IHJvd0NvdW50cykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHBhcnRpdGlvbktleSA9IChTdHJpbmcpIGRhdGEuZ2V0KCJ2YWx1ZSIpOworICAgICAgICAgICAgbG9uZyBudW1Sb3dzID0gKGxvbmcpIGRhdGEuZ2V0KCJjb3VudCIpOworICAgICAgICAgICAgaWYgKHBhcnRpdGlvbktleS5lcXVhbHNJZ25vcmVDYXNlKCJhIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG51bVJvd3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFydGl0aW9uS2V5LmVxdWFsc0lnbm9yZUNhc2UoImIiKSkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbnVtUm93cyk7CisgICAgICAgICAgICBlbHNlIGlmIChwYXJ0aXRpb25LZXkuZXF1YWxzSWdub3JlQ2FzZSgiYyIpKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBudW1Sb3dzKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHRzQ291bnRzLmdldCgwKS5nZXQoInZhbHVlIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgKGxvbmcpIHRzQ291bnRzLmdldCgwKS5nZXQoImNvdW50IikpOworCisgICAgICAgIC8vIHRlc3Qgc2luZ2xlIHBhcnRpdGlvbiByZWFkCisgICAgICAgIGNmcy5iZWdpbkxvY2FsU2FtcGxpbmcoIlJFQURfUk9XX0NPVU5UIiwgY291bnQsIDI0MDAwMCk7CisgICAgICAgIGNmcy5iZWdpbkxvY2FsU2FtcGxpbmcoIlJFQURfVE9NQlNUT05FX0NPVU5UIiwgY291bnQsIDI0MDAwMCk7CisgICAgICAgIGNmcy5iZWdpbkxvY2FsU2FtcGxpbmcoIlJFQURfU1NUQUJMRV9DT1VOVCIsIGNvdW50LCAyNDAwMDApOworCisgICAgICAgIGV4ZWN1dGVJbnRlcm5hbChmb3JtYXQoIlNFTEVDVCAqIEZST00gJXMuJXMgV0hFUkUgaz0nYSciLCBLRVlTUEFDRSwgVEFCTEUpKTsKKyAgICAgICAgZXhlY3V0ZUludGVybmFsKGZvcm1hdCgiU0VMRUNUICogRlJPTSAlcy4lcyBXSEVSRSBrPSdiJyIsIEtFWVNQQUNFLCBUQUJMRSkpOworICAgICAgICBleGVjdXRlSW50ZXJuYWwoZm9ybWF0KCJTRUxFQ1QgKiBGUk9NICVzLiVzIFdIRVJFIGs9J2MnIiwgS0VZU1BBQ0UsIFRBQkxFKSk7CisgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsgLy8gc2ltdWxhdGUgd2FpdGluZyBiZWZvcmUgZmluaXNoaW5nIHNhbXBsaW5nCisKKyAgICAgICAgcm93Q291bnRzID0gY2ZzLmZpbmlzaExvY2FsU2FtcGxpbmcoIlJFQURfUk9XX0NPVU5UIiwgY291bnQpOworICAgICAgICB0c0NvdW50cyA9IGNmcy5maW5pc2hMb2NhbFNhbXBsaW5nKCJSRUFEX1RPTUJTVE9ORV9DT1VOVCIsIGNvdW50KTsKKyAgICAgICAgc3N0Q291bnRzID0gY2ZzLmZpbmlzaExvY2FsU2FtcGxpbmcoIlJFQURfU1NUQUJMRV9DT1VOVCIsIGNvdW50KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMywgc3N0Q291bnRzLnNpemUoKSk7IC8vIDMgcGFydGl0aW9ucyByZWFkCisgICAgICAgIGFzc2VydEVxdWFscygzLCByb3dDb3VudHMuc2l6ZSgpKTsgLy8gMyBwYXJ0aXRpb25zIHJlYWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRzQ291bnRzLnNpemUoKSk7ICAvLyAzIHBhcnRpdGlvbnMgcmVhZCBvbmx5IG9uZSBjb250YWluaW5nIHRvbWJzdG9uZXMKKworICAgICAgICBmb3IgKENvbXBvc2l0ZURhdGEgZGF0YSA6IHNzdENvdW50cykKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHBhcnRpdGlvbktleSA9IChTdHJpbmcpIGRhdGEuZ2V0KCJ2YWx1ZSIpOworICAgICAgICAgICAgbG9uZyBudW1Sb3dzID0gKGxvbmcpIGRhdGEuZ2V0KCJjb3VudCIpOworICAgICAgICAgICAgaWYgKHBhcnRpdGlvbktleS5lcXVhbHNJZ25vcmVDYXNlKCJhIikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG51bVJvd3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocGFydGl0aW9uS2V5LmVxdWFsc0lnbm9yZUNhc2UoImIiKSkKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbnVtUm93cyk7CisgICAgICAgICAgICBlbHNlIGlmIChwYXJ0aXRpb25LZXkuZXF1YWxzSWdub3JlQ2FzZSgiYyIpKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBudW1Sb3dzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoQ29tcG9zaXRlRGF0YSBkYXRhIDogcm93Q291bnRzKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgcGFydGl0aW9uS2V5ID0gKFN0cmluZykgZGF0YS5nZXQoInZhbHVlIik7CisgICAgICAgICAgICBsb25nIG51bVJvd3MgPSAobG9uZykgZGF0YS5nZXQoImNvdW50Iik7CisgICAgICAgICAgICBpZiAocGFydGl0aW9uS2V5LmVxdWFsc0lnbm9yZUNhc2UoImEiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbnVtUm93cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChwYXJ0aXRpb25LZXkuZXF1YWxzSWdub3JlQ2FzZSgiYiIpKQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBudW1Sb3dzKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcnRpdGlvbktleS5lcXVhbHNJZ25vcmVDYXNlKCJjIikpCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG51bVJvd3MpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgdHNDb3VudHMuZ2V0KDApLmdldCgidmFsdWUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCAobG9uZykgdHNDb3VudHMuZ2V0KDApLmdldCgiY291bnQiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhcnRBbmRTdG9wU2NoZWR1bGVkU2FtcGxpbmcoKQorICAgIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGFsbFNhbXBsZXJzID0gQXJyYXlzLnN0cmVhbShTYW1wbGVyLlNhbXBsZXJUeXBlLnZhbHVlcygpKS5tYXAoRW51bTo6dG9TdHJpbmcpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIFN0b3JhZ2VTZXJ2aWNlIHNzID0gU3RvcmFnZVNlcnZpY2UuaW5zdGFuY2U7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2NoZWR1bGluZyBuZXcgc2FtcGxlZCB0YXNrcyBzaG91bGQgYmUgYWxsb3dlZCIsCisgICAgICAgICAgICAgICAgICAgc3Muc3RhcnRTYW1wbGluZ1BhcnRpdGlvbnMobnVsbCwgbnVsbCwgMTAsIDEwLCAxMDAsIDEwLCBhbGxTYW1wbGVycykpOworCisgICAgICAgIGFzc2VydEVxdWFscyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCIqLioiKSwgc3MuZ2V0U2FtcGxlVGFza3MoKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlNhbXBsaW5nIHdpdGggZHVwbGljYXRlIGtleXMgc2hvdWxkIGJlIGRpc2FsbG93ZWQiLAorICAgICAgICAgICAgICAgICAgICBzcy5zdGFydFNhbXBsaW5nUGFydGl0aW9ucyhudWxsLCBudWxsLCAyMCwgMjAsIDEwMCwgMTAsIGFsbFNhbXBsZXJzKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhpc3Rpbmcgc2NoZWR1bGVkIHNhbXBsaW5nIHRhc2tzIHNob3VsZCBiZSBjYW5jZWxsYWJsZSIsIHNzLnN0b3BTYW1wbGluZ1BhcnRpdGlvbnMobnVsbCwgbnVsbCkpOworCisgICAgICAgIGludCB0aW1lb3V0ID0gMTA7CisgICAgICAgIHdoaWxlICh0aW1lb3V0LS0gPiAwICYmIHNzLmdldFNhbXBsZVRhc2tzKCkuc2l6ZSgpID4gMCkKKyAgICAgICAgICAgIFVuaW50ZXJydXB0aWJsZXMuc2xlZXBVbmludGVycnVwdGlibHkoMTAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTY2hlZHVsZWQgc2FtcGxlZCB0YXNrcyBzaG91bGQgYmUgcmVtb3ZlZCIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBzcy5nZXRTYW1wbGVUYXNrcygpKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJXaGVuIG5vdGhpbmcgaXMgc2NoZWR1bGVkLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gc3RvcCBhbGwgc2NoZWR1bGVkIHNhbXBsaW5nIHRhc2tzIiwKKyAgICAgICAgICAgICAgICAgICBzcy5zdG9wU2FtcGxpbmdQYXJ0aXRpb25zKG51bGwsIG51bGwpKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ2xlYXJTbmFwc2hvdFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9DbGVhclNuYXBzaG90VGVzdC5qYXZhCmluZGV4IDBlMTcyZjMuLjM3OWQwMmEgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9DbGVhclNuYXBzaG90VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9DbGVhclNuYXBzaG90VGVzdC5qYXZhCkBAIC0xOSw3ICsxOSwxNCBAQAogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5ub2RldG9vbDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PcHRpb25hbDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIGltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbi5UYWJ1bGFyRGF0YTsKIAogaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwpAQCAtMjcsMTkgKzM0LDM0IEBACiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFRlc3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5zbmFwc2hvdC5TbmFwc2hvdE1hbmlmZXN0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLk5vZGVQcm9iZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ub29sUnVubmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXIuVG9vbFJlc3VsdDsKIAoraW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgamF2YS50aW1lLnRlbXBvcmFsLkNocm9ub1VuaXQuSE9VUlM7CitpbXBvcnQgc3RhdGljIGphdmEudGltZS50ZW1wb3JhbC5DaHJvbm9Vbml0LlNFQ09ORFM7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eU1hcDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvci5nZXRBbGxEYXRhRmlsZUxvY2F0aW9uczsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQ2xvY2suR2xvYmFsLmN1cnJlbnRUaW1lTWlsbGlzOwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5hd2FpdGlsaXR5LkF3YWl0aWxpdHkuYXdhaXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIAogcHVibGljIGNsYXNzIENsZWFyU25hcHNob3RUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBEQVNIX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIi0iKTsKICAgICBwcml2YXRlIHN0YXRpYyBOb2RlUHJvYmUgcHJvYmU7CiAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewogICAgICAgICBzdGFydEpNWFNlcnZlcigpOworICAgICAgICByZXF1aXJlTmV0d29yaygpOwogICAgICAgICBwcm9iZSA9IG5ldyBOb2RlUHJvYmUoam14SG9zdCwgam14UG9ydCk7CiAgICAgfQogCkBAIC01MCw2MiArNzIsMjU0IEBACiAgICAgfQogCiAgICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJTbmFwc2hvdF9Ob0FyZ3MoKQotICAgIHsKLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90Iik7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRFeGl0Q29kZSgpKS5pc0VxdWFsVG8oMik7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmNvbnRhaW5zKCJTcGVjaWZ5IHNuYXBzaG90IG5hbWUgb3IgLS1hbGwiKTsKLSAgICAgICAgCi0gICAgICAgIHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwgIi0tYWxsIik7Ci0gICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhclNuYXBzaG90X0FsbEFuZE5hbWUoKQotICAgIHsKLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwgIi10IiwgInNvbWUtbmFtZSIsICItLWFsbCIpOwotICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDIpOwotICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpKS5jb250YWlucygiU3BlY2lmeSBvbmx5IG9uZSBvZiBzbmFwc2hvdCBuYW1lIG9yIC0tYWxsIik7Ci0gICAgfQotCi0gICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJTbmFwc2hvdF9SZW1vdmVCeU5hbWUoKQogICAgIHsKLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJzbmFwc2hvdCIsIi10Iiwic29tZS1uYW1lIik7CisgICAgICAgIFRvb2xSZXN1bHQgdG9vbCA9IGludm9rZU5vZGV0b29sKCJzbmFwc2hvdCIsICItdCIsICJzb21lLW5hbWUiKTsKICAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmlzTm90RW1wdHkoKTsKLSAgICAgICAgCi0gICAgICAgIE1hcDxTdHJpbmcsIFRhYnVsYXJEYXRhPiBzbmFwc2hvdHNfYmVmb3JlID0gcHJvYmUuZ2V0U25hcHNob3REZXRhaWxzKCk7CisKKyAgICAgICAgTWFwPFN0cmluZywgVGFidWxhckRhdGE+IHNuYXBzaG90c19iZWZvcmUgPSBwcm9iZS5nZXRTbmFwc2hvdERldGFpbHMoZW1wdHlNYXAoKSk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzX2JlZm9yZSkuY29udGFpbnNLZXkoInNvbWUtbmFtZSIpOwogCi0gICAgICAgIHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwiLXQiLCJzb21lLW5hbWUiKTsKKyAgICAgICAgdG9vbCA9IGludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwgIi10IiwgInNvbWUtbmFtZSIpOwogICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuaXNOb3RFbXB0eSgpOwotICAgICAgICAKLSAgICAgICAgTWFwPFN0cmluZywgVGFidWxhckRhdGE+IHNuYXBzaG90c19hZnRlciA9IHByb2JlLmdldFNuYXBzaG90RGV0YWlscygpOworCisgICAgICAgIE1hcDxTdHJpbmcsIFRhYnVsYXJEYXRhPiBzbmFwc2hvdHNfYWZ0ZXIgPSBwcm9iZS5nZXRTbmFwc2hvdERldGFpbHMoZW1wdHlNYXAoKSk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzX2FmdGVyKS5kb2VzTm90Q29udGFpbktleSgic29tZS1uYW1lIik7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJTbmFwc2hvdF9SZW1vdmVNdWx0aXBsZSgpCiAgICAgewotICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woInNuYXBzaG90IiwiLXQiLCJzb21lLW5hbWUiKTsKKyAgICAgICAgVG9vbFJlc3VsdCB0b29sID0gaW52b2tlTm9kZXRvb2woInNuYXBzaG90IiwgIi10IiwgInNvbWUtbmFtZSIpOwogICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuaXNOb3RFbXB0eSgpOwogCi0gICAgICAgIHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJzbmFwc2hvdCIsIi10Iiwic29tZS1vdGhlci1uYW1lIik7CisgICAgICAgIHRvb2wgPSBpbnZva2VOb2RldG9vbCgic25hcHNob3QiLCAiLXQiLCAic29tZS1vdGhlci1uYW1lIik7CiAgICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5pc05vdEVtcHR5KCk7CiAKLSAgICAgICAgTWFwPFN0cmluZywgVGFidWxhckRhdGE+IHNuYXBzaG90c19iZWZvcmUgPSBwcm9iZS5nZXRTbmFwc2hvdERldGFpbHMoKTsKKyAgICAgICAgTWFwPFN0cmluZywgVGFidWxhckRhdGE+IHNuYXBzaG90c19iZWZvcmUgPSBwcm9iZS5nZXRTbmFwc2hvdERldGFpbHMoZW1wdHlNYXAoKSk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzX2JlZm9yZSkuaGFzU2l6ZSgyKTsKIAotICAgICAgICB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgiY2xlYXJzbmFwc2hvdCIsIi0tYWxsIik7CisgICAgICAgIHRvb2wgPSBpbnZva2VOb2RldG9vbCgiY2xlYXJzbmFwc2hvdCIsICItLWFsbCIpOwogICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuaXNOb3RFbXB0eSgpOwotICAgICAgICAKLSAgICAgICAgTWFwPFN0cmluZywgVGFidWxhckRhdGE+IHNuYXBzaG90c19hZnRlciA9IHByb2JlLmdldFNuYXBzaG90RGV0YWlscygpOworCisgICAgICAgIE1hcDxTdHJpbmcsIFRhYnVsYXJEYXRhPiBzbmFwc2hvdHNfYWZ0ZXIgPSBwcm9iZS5nZXRTbmFwc2hvdERldGFpbHMoZW1wdHlNYXAoKSk7CiAgICAgICAgIGFzc2VydFRoYXQoc25hcHNob3RzX2FmdGVyKS5pc0VtcHR5KCk7CiAgICAgfQotICAgIAorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJTbmFwc2hvdFdpdGhPbGRlclRoYW5GbGFnKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgSW5zdGFudCBzdGFydCA9IEluc3RhbnQub2ZFcG9jaE1pbGxpKGN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBwcmVwYXJlRGF0YShzdGFydCk7CisKKyAgICAgICAgLy8gd2FpdCAxMCBzZWNvbmRzIGZvciB0aGUgc2FrZSBvZiB0aGUgdGVzdAorICAgICAgICBhd2FpdCgpLnRpbWVvdXQoMTUsIFRpbWVVbml0LlNFQ09ORFMpLnVudGlsKCgpIC0+IEluc3RhbnQubm93KCkuaXNBZnRlcihzdGFydC5wbHVzU2Vjb25kcygxMCkpKTsKKworICAgICAgICAvLyBjbGVhciBhbGwgc25hcHNob3RzIGZvciBzcGVjaWZpYyBrZXlzcGFjZSBvbGRlciB0aGFuIDMgaG91cnMgZm9yIGEgc3BlY2lmaWMga2V5c3BhY2UKKyAgICAgICAgaW52b2tlTm9kZXRvb2woImNsZWFyc25hcHNob3QiLCAiLS1vbGRlci10aGFuIiwgIjNoIiwgIi0tYWxsIiwgIi0tIiwgS0VZU1BBQ0UpLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisKKyAgICAgICAgYXdhaXQoKS51bnRpbCgoKSAtPiB7CisgICAgICAgICAgICBTdHJpbmcgb3V0cHV0ID0gaW52b2tlTm9kZXRvb2woImxpc3RzbmFwc2hvdHMiKS5nZXRTdGRvdXQoKTsKKyAgICAgICAgICAgIHJldHVybiAhb3V0cHV0LmNvbnRhaW5zKCJzbmFwc2hvdC10by1jbGVhci1rczEtdGIxIikgJiYKKyAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29udGFpbnMoInNvbWUtb3RoZXItc25hcHNob3Qta3MxLXRiMSIpICYmCisgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbnRhaW5zKCJsYXN0LXNuYXBzaG90LWtzMS10YjEiKSAmJgorICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb250YWlucygic25hcHNob3QtdG8tY2xlYXIta3MyLXRiMiIpICYmCisgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbnRhaW5zKCJzb21lLW90aGVyLXNuYXBzaG90LWtzMi10YjIiKSAmJgorICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb250YWlucygibGFzdC1zbmFwc2hvdC1rczItdGIyIik7CisgICAgICAgIH0pOworCisgICAgICAgIC8vIGNsZWFyIGFsbCBzbmFwc2hvdHMgb2xkZXIgdGhhbiAyIGhvdXJzIGZvciBhbGwga2V5c3BhY2VzCisgICAgICAgIGludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwgIi0tb2xkZXItdGhhbiIsICIyaCIsICItLWFsbCIpLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisKKyAgICAgICAgYXdhaXQoKS51bnRpbCgoKSAtPiB7CisgICAgICAgICAgICBTdHJpbmcgb3V0cHV0ID0gaW52b2tlTm9kZXRvb2woImxpc3RzbmFwc2hvdHMiKS5nZXRTdGRvdXQoKTsKKworICAgICAgICAgICAgcmV0dXJuICFvdXRwdXQuY29udGFpbnMoInNvbWUtb3RoZXItc25hcHNob3Qta3MxLXRiMSIpICYmCisgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbnRhaW5zKCJsYXN0LXNuYXBzaG90LWtzMS10YjEiKSAmJgorICAgICAgICAgICAgICAgICAgICFvdXRwdXQuY29udGFpbnMoInNuYXBzaG90LXRvLWNsZWFyLWtzMi10YjIiKSAmJgorICAgICAgICAgICAgICAgICAgICFvdXRwdXQuY29udGFpbnMoInNvbWUtb3RoZXItc25hcHNob3Qta3MyLXRiMiIpICYmCisgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbnRhaW5zKCJsYXN0LXNuYXBzaG90LWtzMi10YjIiKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgLy8gY2xlYXIgYWxsIHNuYXBzaG9zdHMgb2xkZXIgdGhhbiAxIHNlY29uZAorICAgICAgICBpbnZva2VOb2RldG9vbCgiY2xlYXJzbmFwc2hvdCIsICItLW9sZGVyLXRoYW4iLCAiMXMiLCAiLS1hbGwiLCAiLS0iLCBjdXJyZW50S2V5c3BhY2UoKSkuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKworICAgICAgICBhd2FpdCgpLnVudGlsKCgpIC0+IHsKKyAgICAgICAgICAgIFN0cmluZyBvdXRwdXQgPSBpbnZva2VOb2RldG9vbCgibGlzdHNuYXBzaG90cyIpLmdldFN0ZG91dCgpOworICAgICAgICAgICAgcmV0dXJuIG91dHB1dC5jb250YWlucygibGFzdC1zbmFwc2hvdC1rczEtdGIxIikgJiYKKyAgICAgICAgICAgICAgICAgICAhb3V0cHV0LmNvbnRhaW5zKCJsYXN0LXNuYXBzaG90LWtzMi10YjIiKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgaW52b2tlTm9kZXRvb2woImNsZWFyc25hcHNob3QiLCAiLS1vbGRlci10aGFuIiwgIjFzIiwgIi0tYWxsIikuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgYXdhaXQoKS51bnRpbCgoKSAtPiAhaW52b2tlTm9kZXRvb2woImxpc3RzbmFwc2hvdHMiKS5nZXRTdGRvdXQoKS5jb250YWlucygibGFzdC1zbmFwc2hvdC1rczEtdGIxIikpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJTbmFwc2hvdFdpdGhPbGRlclRoYW5UaW1lc3RhbXBGbGFnKCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgSW5zdGFudCBzdGFydCA9IEluc3RhbnQub2ZFcG9jaE1pbGxpKGN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBwcmVwYXJlRGF0YShzdGFydCk7CisKKyAgICAgICAgLy8gd2FpdCAxMCBzZWNvbmRzIGZvciB0aGUgc2FrZSBvZiB0aGUgdGVzdAorICAgICAgICBhd2FpdCgpLnRpbWVvdXQoMTUsIFRpbWVVbml0LlNFQ09ORFMpLnVudGlsKCgpIC0+IEluc3RhbnQubm93KCkuaXNBZnRlcihzdGFydC5wbHVzU2Vjb25kcygxMCkpKTsKKworICAgICAgICAvLyBjbGVhciBhbGwgc25hcHNob3RzIGZvciBzcGVjaWZpYyBrZXlzcGFjZSBvbGRlciB0aGFuIDMgaG91cnMgZm9yIGEgc3BlY2lmaWMga2V5c3BhY2UKKyAgICAgICAgaW52b2tlTm9kZXRvb2woImNsZWFyc25hcHNob3QiLCAiLS1vbGRlci10aGFuLXRpbWVzdGFtcCIsCisgICAgICAgICAgICAgICAgICAgICAgIEluc3RhbnQubm93KCkubWludXMoMywgSE9VUlMpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICItLWFsbCIsICItLSIsIEtFWVNQQUNFKS5hc3NlcnRPbkNsZWFuRXhpdCgpOworCisgICAgICAgIGF3YWl0KCkudW50aWwoKCkgLT4geworICAgICAgICAgICAgU3RyaW5nIG91dHB1dCA9IGludm9rZU5vZGV0b29sKCJsaXN0c25hcHNob3RzIikuZ2V0U3Rkb3V0KCk7CisgICAgICAgICAgICByZXR1cm4gIW91dHB1dC5jb250YWlucygic25hcHNob3QtdG8tY2xlYXIta3MxLXRiMSIpICYmCisgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbnRhaW5zKCJzb21lLW90aGVyLXNuYXBzaG90LWtzMS10YjEiKSAmJgorICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb250YWlucygibGFzdC1zbmFwc2hvdC1rczEtdGIxIikgJiYKKyAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29udGFpbnMoInNuYXBzaG90LXRvLWNsZWFyLWtzMi10YjIiKSAmJgorICAgICAgICAgICAgICAgICAgIG91dHB1dC5jb250YWlucygic29tZS1vdGhlci1zbmFwc2hvdC1rczItdGIyIikgJiYKKyAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29udGFpbnMoImxhc3Qtc25hcHNob3Qta3MyLXRiMiIpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBjbGVhciBhbGwgc25hcHNob3RzIG9sZGVyIHRoYW4gMiBob3VycyBmb3IgYWxsIGtleXNwYWNlcworICAgICAgICBpbnZva2VOb2RldG9vbCgiY2xlYXJzbmFwc2hvdCIsICItLW9sZGVyLXRoYW4tdGltZXN0YW1wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5zdGFudC5ub3coKS5taW51cygyLCBIT1VSUykudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIi0tYWxsIikuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKworICAgICAgICBhd2FpdCgpLnVudGlsKCgpIC0+IHsKKyAgICAgICAgICAgIFN0cmluZyBvdXRwdXQgPSBpbnZva2VOb2RldG9vbCgibGlzdHNuYXBzaG90cyIpLmdldFN0ZG91dCgpOworCisgICAgICAgICAgICByZXR1cm4gIW91dHB1dC5jb250YWlucygic29tZS1vdGhlci1zbmFwc2hvdC1rczEtdGIxIikgJiYKKyAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29udGFpbnMoImxhc3Qtc25hcHNob3Qta3MxLXRiMSIpICYmCisgICAgICAgICAgICAgICAgICAgIW91dHB1dC5jb250YWlucygic25hcHNob3QtdG8tY2xlYXIta3MyLXRiMiIpICYmCisgICAgICAgICAgICAgICAgICAgIW91dHB1dC5jb250YWlucygic29tZS1vdGhlci1zbmFwc2hvdC1rczItdGIyIikgJiYKKyAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29udGFpbnMoImxhc3Qtc25hcHNob3Qta3MyLXRiMiIpOworICAgICAgICB9KTsKKworICAgICAgICAvLyBjbGVhciBhbGwgc25hcHNob3RzIG9sZGVyIHRoYW4gbm93IGZvciBhbGwga2V5c3BhY2VzCisgICAgICAgIGludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwgIi0tb2xkZXItdGhhbi10aW1lc3RhbXAiLAorICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW50Lm5vdygpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICItLWFsbCIpLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisKKyAgICAgICAgYXdhaXQoKS51bnRpbCgoKSAtPiB7CisgICAgICAgICAgICBTdHJpbmcgb3V0cHV0ID0gaW52b2tlTm9kZXRvb2woImxpc3RzbmFwc2hvdHMiKS5nZXRTdGRvdXQoKTsKKyAgICAgICAgICAgIHJldHVybiAhb3V0cHV0LmNvbnRhaW5zKCJsYXN0LXNuYXBzaG90LWtzMS10YjEiKSAmJgorICAgICAgICAgICAgICAgICAgICFvdXRwdXQuY29udGFpbnMoImxhc3Qtc25hcHNob3Qta3MyLXRiMiIpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmNvbXBhdGlibGVGbGFncygpCisgICAgeworICAgICAgICBUb29sUmVzdWx0IGludmFsaWRDb21tYW5kMSA9IGludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1vbGRlci10aGFuLXRpbWVzdGFtcCIsIEluc3RhbnQubm93KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1vbGRlci10aGFuIiwgIjNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1hbGwiKTsKKyAgICAgICAgaW52YWxpZENvbW1hbmQxLmFzc2VydHMoKS5mYWlsdXJlKCk7CisgICAgICAgIGFzc2VydFRydWUoaW52YWxpZENvbW1hbmQxLmdldFN0ZG91dCgpLmNvbnRhaW5zKCJTcGVjaWZ5IG9ubHkgb25lIG9mIC0tb2xkZXItdGhhbiBvciAtLW9sZGVyLXRoYW4tdGltZXN0YW1wIikpOworCisgICAgICAgIFRvb2xSZXN1bHQgaW52YWxpZENvbW1hbmQyID0gaW52b2tlTm9kZXRvb2woImNsZWFyc25hcHNob3QiLCAiLXQiLCAic29tZS1zbmFwc2hvdC10YWciLCAiLS1hbGwiKTsKKyAgICAgICAgaW52YWxpZENvbW1hbmQyLmFzc2VydHMoKS5mYWlsdXJlKCk7CisgICAgICAgIGFzc2VydFRydWUoaW52YWxpZENvbW1hbmQyLmdldFN0ZG91dCgpLmNvbnRhaW5zKCJTcGVjaWZ5IG9ubHkgb25lIG9mIHNuYXBzaG90IG5hbWUgb3IgLS1hbGwiKSk7CisKKyAgICAgICAgVG9vbFJlc3VsdCBpbnZhbGlkQ29tbWFuZDMgPSBpbnZva2VOb2RldG9vbCgiY2xlYXJzbmFwc2hvdCIsICItLSIsICJrZXlzcGFjZSIpOworICAgICAgICBpbnZhbGlkQ29tbWFuZDMuYXNzZXJ0cygpLmZhaWx1cmUoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpbnZhbGlkQ29tbWFuZDMuZ2V0U3Rkb3V0KCkuY29udGFpbnMoIlNwZWNpZnkgc25hcHNob3QgbmFtZSBvciAtLWFsbCIpKTsKKworICAgICAgICBUb29sUmVzdWx0IGludmFsaWRDb21tYW5kNCA9IGludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1vbGRlci10aGFuLXRpbWVzdGFtcCIsIEluc3RhbnQubm93KCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLXQiLCAic29tZS1zbmFwc2hvdC10YWciKTsKKyAgICAgICAgaW52YWxpZENvbW1hbmQ0LmFzc2VydHMoKS5mYWlsdXJlKCk7CisgICAgICAgIGFzc2VydFRydWUoaW52YWxpZENvbW1hbmQ0LmdldFN0ZG91dCgpLmNvbnRhaW5zKCJTcGVjaWZ5aW5nIHNuYXBzaG90IG5hbWUgdG9nZXRoZXIgd2l0aCAtLW9sZGVyLXRoYW4tdGltZXN0YW1wIGZsYWcgaXMgbm90IGFsbG93ZWQiKSk7CisKKyAgICAgICAgVG9vbFJlc3VsdCBpbnZhbGlkQ29tbWFuZDUgPSBpbnZva2VOb2RldG9vbCgiY2xlYXJzbmFwc2hvdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tb2xkZXItdGhhbiIsICIzaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi10IiwgInNvbWUtc25hcHNob3QtdGFnIik7CisgICAgICAgIGludmFsaWRDb21tYW5kNS5hc3NlcnRzKCkuZmFpbHVyZSgpOworICAgICAgICBhc3NlcnRUcnVlKGludmFsaWRDb21tYW5kNS5nZXRTdGRvdXQoKS5jb250YWlucygiU3BlY2lmeWluZyBzbmFwc2hvdCBuYW1lIHRvZ2V0aGVyIHdpdGggLS1vbGRlci10aGFuIGZsYWcgaXMgbm90IGFsbG93ZWQiKSk7CisKKyAgICAgICAgVG9vbFJlc3VsdCBpbnZhbGlkQ29tbWFuZDYgPSBpbnZva2VOb2RldG9vbCgiY2xlYXJzbmFwc2hvdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tb2xkZXItdGhhbi10aW1lc3RhbXAiLCAiMTIzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1hbGwiLCAiLS0iLCAic29tZWtleXNwYWNlIik7CisgICAgICAgIGludmFsaWRDb21tYW5kNi5hc3NlcnRzKCkuZmFpbHVyZSgpOworICAgICAgICBhc3NlcnRUcnVlKGludmFsaWRDb21tYW5kNi5nZXRTdGRvdXQoKS5jb250YWlucygiUGFyYW1ldGVyIC0tb2xkZXItdGhhbi10aW1lc3RhbXAgaGFzIHRvIGJlIGEgdmFsaWQgaW5zdGFudCBpbiBJU08gZm9ybWF0LiIpKTsKKworICAgICAgICBUb29sUmVzdWx0IGludmFsaWRDb21tYW5kNyA9IGludm9rZU5vZGV0b29sKCJjbGVhcnNuYXBzaG90IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1vbGRlci10aGFuIiwgIjNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1hbGwiLCAiLS0iLCAic29tZWtleXNwYWNlIik7CisgICAgICAgIGludmFsaWRDb21tYW5kNy5hc3NlcnRzKCkuZmFpbHVyZSgpOworICAgICAgICBhc3NlcnRUcnVlKGludmFsaWRDb21tYW5kNy5nZXRTdGRvdXQoKS5jb250YWlucygiSW52YWxpZCBkdXJhdGlvbjogM2siKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJld3JpdGVNYW5pZmVzdChTdHJpbmcgdGFibGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGRhdGFEaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGtleXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzbmFwc2hvdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0YW50IGNyZWF0ZWRBdCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUGF0aCBtYW5pZmVzdFBhdGggPSBmaW5kTWFuaWZlc3QoZGF0YURpcnMsIGtleXNwYWNlLCB0YWJsZUlkLCB0YWJsZU5hbWUsIHNuYXBzaG90TmFtZSk7CisgICAgICAgIFNuYXBzaG90TWFuaWZlc3QgbWFuaWZlc3QgPSBTbmFwc2hvdE1hbmlmZXN0LmRlc2VyaWFsaXplRnJvbUpzb25GaWxlKG5ldyBGaWxlKG1hbmlmZXN0UGF0aCkpOworICAgICAgICBTbmFwc2hvdE1hbmlmZXN0IG1hbmlmZXN0V2l0aEVwaGVtZXJhbEZsYWcgPSBuZXcgU25hcHNob3RNYW5pZmVzdChtYW5pZmVzdC5maWxlcywgbnVsbCwgY3JlYXRlZEF0LCBmYWxzZSk7CisgICAgICAgIG1hbmlmZXN0V2l0aEVwaGVtZXJhbEZsYWcuc2VyaWFsaXplVG9Kc29uRmlsZShuZXcgRmlsZShtYW5pZmVzdFBhdGgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFBhdGggZmluZE1hbmlmZXN0KFN0cmluZ1tdIGRhdGFEaXJzLCBTdHJpbmcga2V5c3BhY2UsIFN0cmluZyB0YWJsZUlkLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcgc25hcHNob3ROYW1lKQorICAgIHsKKyAgICAgICAgZm9yIChTdHJpbmcgZGF0YURpciA6IGRhdGFEaXJzKQorICAgICAgICB7CisgICAgICAgICAgICBQYXRoIG1hbmlmZXN0ID0gUGF0aHMuZ2V0KGRhdGFEaXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZShrZXlzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlKGZvcm1hdCgiJXMtJXMiLCB0YWJsZU5hbWUsIHRhYmxlSWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc29sdmUoInNuYXBzaG90cyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZShzbmFwc2hvdE5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZSgibWFuaWZlc3QuanNvbiIpOworCisgICAgICAgICAgICBpZiAoRmlsZXMuZXhpc3RzKG1hbmlmZXN0KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFuaWZlc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVbmFibGUgdG8gZmluZCBtYW5pZmVzdCEiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJlcGFyZURhdGEoSW5zdGFudCBzdGFydCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIHRhYmxlTmFtZSA9IGNyZWF0ZVRhYmxlKEtFWVNQQUNFLCAiQ1JFQVRFIFRBQkxFICVzIChpZCBpbnQgcHJpbWFyeSBrZXkpIik7CisgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChpZCkgVkFMVUVTICg/KSIsIDEpOworICAgICAgICBmbHVzaChLRVlTUEFDRSk7CisKKyAgICAgICAgU3RyaW5nIGtleXNwYWNlMiA9IGNyZWF0ZUtleXNwYWNlKCJDUkVBVEUgS0VZU1BBQ0UgJXMgV0lUSCByZXBsaWNhdGlvbiA9IHsnY2xhc3MnOiAnU2ltcGxlU3RyYXRlZ3knLCAncmVwbGljYXRpb25fZmFjdG9yJzogMX0iKTsKKyAgICAgICAgU3RyaW5nIHRhYmxlTmFtZTIgPSBjcmVhdGVUYWJsZShrZXlzcGFjZTIsICJDUkVBVEUgVEFCTEUgJXMgKGlkIGludCBwcmltYXJ5IGtleSkiKTsKKyAgICAgICAgZXhlY3V0ZShmb3JtYXRRdWVyeShrZXlzcGFjZTIsICJJTlNFUlQgSU5UTyAlcyAoaWQpIFZBTFVFUyAoPykiKSwgMSk7CisgICAgICAgIGZsdXNoKGtleXNwYWNlMik7CisKKyAgICAgICAgaW52b2tlTm9kZXRvb2woInNuYXBzaG90IiwgIi10IiwgInNuYXBzaG90LXRvLWNsZWFyLWtzMS10YjEiLCAiLWNmIiwgdGFibGVOYW1lLCAiLS0iLCBLRVlTUEFDRSkuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgaW52b2tlTm9kZXRvb2woInNuYXBzaG90IiwgIi10IiwgInNvbWUtb3RoZXItc25hcHNob3Qta3MxLXRiMSIsICItY2YiLCB0YWJsZU5hbWUsICItLSIsIEtFWVNQQUNFKS5hc3NlcnRPbkNsZWFuRXhpdCgpOworICAgICAgICBpbnZva2VOb2RldG9vbCgic25hcHNob3QiLCAiLXQiLCAibGFzdC1zbmFwc2hvdC1rczEtdGIxIiwgIi1jZiIsIHRhYmxlTmFtZSwgIi0tIiwgS0VZU1BBQ0UpLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisKKyAgICAgICAgaW52b2tlTm9kZXRvb2woInNuYXBzaG90IiwgIi10IiwgInNuYXBzaG90LXRvLWNsZWFyLWtzMi10YjIiLCAiLWNmIiwgdGFibGVOYW1lMiwgIi0tIiwga2V5c3BhY2UyKS5hc3NlcnRPbkNsZWFuRXhpdCgpOworICAgICAgICBpbnZva2VOb2RldG9vbCgic25hcHNob3QiLCAiLXQiLCAic29tZS1vdGhlci1zbmFwc2hvdC1rczItdGIyIiwgIi1jZiIsIHRhYmxlTmFtZTIsICItLSIsIGtleXNwYWNlMikuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgaW52b2tlTm9kZXRvb2woInNuYXBzaG90IiwgIi10IiwgImxhc3Qtc25hcHNob3Qta3MyLXRiMiIsICItY2YiLCB0YWJsZU5hbWUyLCAiLS0iLCBrZXlzcGFjZTIpLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisKKyAgICAgICAgT3B0aW9uYWw8VGFibGVNZXRhZGF0YT4gdGFibGVNZXRhZGF0YSA9IEtleXNwYWNlLm9wZW4oS0VZU1BBQ0UpLmdldE1ldGFkYXRhKCkudGFibGVzLmdldCh0YWJsZU5hbWUpOworICAgICAgICBPcHRpb25hbDxUYWJsZU1ldGFkYXRhPiB0YWJsZU1ldGFkYXRhMiA9IEtleXNwYWNlLm9wZW4oa2V5c3BhY2UyKS5nZXRNZXRhZGF0YSgpLnRhYmxlcy5nZXQodGFibGVOYW1lMik7CisKKyAgICAgICAgU3RyaW5nIHRhYmxlSWQgPSBEQVNIX1BBVFRFUk4ubWF0Y2hlcih0YWJsZU1ldGFkYXRhLm9yRWxzZVRocm93KCgpIC0+IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZm9ybWF0KCJubyBtZXRhZGF0YSBmb3VuZCBmb3IgJXMuJXMiLCBLRVlTUEFDRSwgdGFibGVOYW1lKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlkLmFzVVVJRCgpLnRvU3RyaW5nKCkpLnJlcGxhY2VBbGwoIiIpOworCisgICAgICAgIFN0cmluZyB0YWJsZUlkMiA9IERBU0hfUEFUVEVSTi5tYXRjaGVyKHRhYmxlTWV0YWRhdGEyLm9yRWxzZVRocm93KCgpIC0+IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZm9ybWF0KCJubyBtZXRhZGF0YSBmb3VuZCBmb3IgJXMuJXMiLCBrZXlzcGFjZTIsIHRhYmxlTmFtZTIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlkLmFzVVVJRCgpLnRvU3RyaW5nKCkpLnJlcGxhY2VBbGwoIiIpOworCisgICAgICAgIHJld3JpdGVNYW5pZmVzdCh0YWJsZUlkLCBnZXRBbGxEYXRhRmlsZUxvY2F0aW9ucygpLCBLRVlTUEFDRSwgdGFibGVOYW1lLCAic25hcHNob3QtdG8tY2xlYXIta3MxLXRiMSIsIHN0YXJ0Lm1pbnVzKDUsIEhPVVJTKSk7CisgICAgICAgIHJld3JpdGVNYW5pZmVzdCh0YWJsZUlkLCBnZXRBbGxEYXRhRmlsZUxvY2F0aW9ucygpLCBLRVlTUEFDRSwgdGFibGVOYW1lLCAic29tZS1vdGhlci1zbmFwc2hvdC1rczEtdGIxIiwgc3RhcnQubWludXMoMiwgSE9VUlMpKTsKKyAgICAgICAgcmV3cml0ZU1hbmlmZXN0KHRhYmxlSWQsIGdldEFsbERhdGFGaWxlTG9jYXRpb25zKCksIEtFWVNQQUNFLCB0YWJsZU5hbWUsICJsYXN0LXNuYXBzaG90LWtzMS10YjEiLCBzdGFydC5taW51cygxLCBTRUNPTkRTKSk7CisgICAgICAgIHJld3JpdGVNYW5pZmVzdCh0YWJsZUlkMiwgZ2V0QWxsRGF0YUZpbGVMb2NhdGlvbnMoKSwga2V5c3BhY2UyLCB0YWJsZU5hbWUyLCAic25hcHNob3QtdG8tY2xlYXIta3MyLXRiMiIsIHN0YXJ0Lm1pbnVzKDUsIEhPVVJTKSk7CisgICAgICAgIHJld3JpdGVNYW5pZmVzdCh0YWJsZUlkMiwgZ2V0QWxsRGF0YUZpbGVMb2NhdGlvbnMoKSwga2V5c3BhY2UyLCB0YWJsZU5hbWUyLCAic29tZS1vdGhlci1zbmFwc2hvdC1rczItdGIyIiwgc3RhcnQubWludXMoMiwgSE9VUlMpKTsKKyAgICAgICAgcmV3cml0ZU1hbmlmZXN0KHRhYmxlSWQyLCBnZXRBbGxEYXRhRmlsZUxvY2F0aW9ucygpLCBrZXlzcGFjZTIsIHRhYmxlTmFtZTIsICJsYXN0LXNuYXBzaG90LWtzMi10YjIiLCBzdGFydC5taW51cygxLCBTRUNPTkRTKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0NsaWVudFN0YXRzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0NsaWVudFN0YXRzVGVzdC5qYXZhCmluZGV4IDU5NzVmNjYuLmQzOWZjNjMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9DbGllbnRTdGF0c1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ2xpZW50U3RhdHNUZXN0LmphdmEKQEAgLTQyLDYgKzQyLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ub29sUnVubmVyOwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuZ3JvdXBzLlR1cGxlOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQ0FTU0FORFJBX0pNWF9MT0NBTF9QT1JUOwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CiAKIHB1YmxpYyBjbGFzcyBDbGllbnRTdGF0c1Rlc3QKQEAgLTU2LDcgKzU3LDcgQEAKICAgICB7CiAgICAgICAgIC8vIFNpbmNlIHdlIHJ1biBFbWJlZGRlZENhc3NhbmRyYVNlcnZlciwgd2UgbmVlZCB0byBtYW51YWxseSBhc3NvY2lhdGUgSk1YIGFkZHJlc3M7IG90aGVyd2lzZSBpdCB3b24ndCBzdGFydAogICAgICAgICBpbnQgam14UG9ydCA9IENRTFRlc3Rlci5nZXRBdXRvbWF0aWNhbGx5QWxsb2NhdGVkUG9ydChJbmV0QWRkcmVzcy5nZXRMb29wYmFja0FkZHJlc3MoKSk7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmpteC5sb2NhbC5wb3J0IiwgU3RyaW5nLnZhbHVlT2Yoam14UG9ydCkpOworICAgICAgICBDQVNTQU5EUkFfSk1YX0xPQ0FMX1BPUlQuc2V0SW50KGpteFBvcnQpOwogCiAgICAgICAgIGNhc3NhbmRyYSA9IFNlcnZlclRlc3RVdGlscy5zdGFydEVtYmVkZGVkQ2Fzc2FuZHJhU2VydmljZSgpOwogICAgICAgICBjbHVzdGVyID0gQ2x1c3Rlci5idWlsZGVyKCkuYWRkQ29udGFjdFBvaW50KCIxMjcuMC4wLjEiKS53aXRoUG9ydChEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TmF0aXZlVHJhbnNwb3J0UG9ydCgpKS5idWlsZCgpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0NvbXBhY3RUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ29tcGFjdFRlc3QuamF2YQppbmRleCAzNDA1OWFhLi45MjhmODg1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ29tcGFjdFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ29tcGFjdFRlc3QuamF2YQpAQCAtMzUsNiArMzUsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBUaHJvd2FibGUKICAgICB7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ29tcGFjdGlvbkhpc3RvcnlUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ29tcGFjdGlvbkhpc3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA0Yjc1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9Db21wYWN0aW9uSGlzdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5ub2RldG9vbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLktleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLlN5c3RlbUtleXNwYWNlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLmNvbXBhY3Rpb24uT3BlcmF0aW9uVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ub29sUnVubmVyLlRvb2xSZXN1bHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuRkJVdGlsaXRpZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuY29tcGFjdGlvbi5Db21wYWN0aW9uSGlzdG9yeVRhYnVsYXJEYXRhLkNPTVBBQ1RJT05fVFlQRV9QUk9QRVJUWTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9ucy5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ29tcGFjdGlvbkhpc3RvcnlUZXN0IGV4dGVuZHMgQ1FMVGVzdGVyCit7CisgICAgQFBhcmFtZXRlcgorICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gY21kOworCisgICAgQFBhcmFtZXRlcigxKQorICAgIHB1YmxpYyBTdHJpbmcgY29tcGFjdGlvblR5cGU7CisKKyAgICBAUGFyYW1ldGVyKDIpCisgICAgcHVibGljIGludCBzeXN0ZW1UYWJsZVJlY29yZDsKKworICAgIEBQYXJhbWV0ZXJzKG5hbWUgPSAie2luZGV4fTogY21kPXswfSBjb21wYWN0aW9uVHlwZT17MX0gc3lzdGVtVGFibGVSZWNvcmQ9ezJ9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248T2JqZWN0W10+IGRhdGEoKQorICAgIHsKKyAgICAgICAgTGlzdDxPYmplY3RbXT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHJlc3VsdC5hZGQobmV3IE9iamVjdFtdeyBMaXN0cy5uZXdBcnJheUxpc3QoImNvbXBhY3QiKSwgT3BlcmF0aW9uVHlwZS5NQUpPUl9DT01QQUNUSU9OLnR5cGUsIDEgfSk7CisgICAgICAgIHJlc3VsdC5hZGQobmV3IE9iamVjdFtdeyBMaXN0cy5uZXdBcnJheUxpc3QoImdhcmJhZ2Vjb2xsZWN0IiksIE9wZXJhdGlvblR5cGUuR0FSQkFHRV9DT0xMRUNULnR5cGUsIDEwIH0pOworICAgICAgICByZXN1bHQuYWRkKG5ldyBPYmplY3RbXXsgTGlzdHMubmV3QXJyYXlMaXN0KCJ1cGdyYWRlc3N0YWJsZXMiLCAiLWEiKSwgT3BlcmF0aW9uVHlwZS5VUEdSQURFX1NTVEFCTEVTLnR5cGUsIDEwIH0pOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CisgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFjdGlvblByb3BlcnRpZXMoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChpZCB0ZXh0LCB2YWx1ZSB0ZXh0LCBQUklNQVJZIEtFWSAoKGlkKSkpIik7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IEtleXNwYWNlLm9wZW4oa2V5c3BhY2UoKSkuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoY3VycmVudFRhYmxlKCkpOworICAgICAgICBjZnMuZGlzYWJsZUF1dG9Db21wYWN0aW9uKCk7CisgICAgICAgIC8vIHdyaXRlIFNTVGFibGVzIGZvciB0aGUgc3BlY2lmaWMga2V5CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGlkLCB2YWx1ZSkgVkFMVUVTICg/LCA/KSIsICJrZXkiICsgaSwgInZhbHVlIiArIGkpOworICAgICAgICAgICAgZmx1c2goa2V5c3BhY2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgZXhwZWN0ZWRTU1RhYmxlc0NvdW50ID0gMTA7CisgICAgICAgIGFzc2VydFRoYXQoY2ZzLmdldFRyYWNrZXIoKS5nZXRWaWV3KCkubGl2ZVNTVGFibGVzKCkpLmhhc1NpemUoZXhwZWN0ZWRTU1RhYmxlc0NvdW50KTsKKworICAgICAgICBJbW11dGFibGVMaXN0LkJ1aWxkZXI8U3RyaW5nPiBidWlsZGVyID0gSW1tdXRhYmxlTGlzdC5idWlsZGVyKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBjbWRzID0gYnVpbGRlci5hZGRBbGwoY21kKS5hZGQoa2V5c3BhY2UoKSkuYWRkKGN1cnJlbnRUYWJsZSgpKS5idWlsZCgpOworICAgICAgICBjb21wYWN0aW9uSGlzdG9yeVJlc3VsdFZlcmlmeShrZXlzcGFjZSgpLCBjdXJyZW50VGFibGUoKSwgSW1tdXRhYmxlTWFwLm9mKENPTVBBQ1RJT05fVFlQRV9QUk9QRVJUWSwgY29tcGFjdGlvblR5cGUpLCBjbWRzKTsKKworICAgICAgICBTdHJpbmcgY3FsID0gInNlbGVjdCBrZXlzcGFjZV9uYW1lLGNvbHVtbmZhbWlseV9uYW1lLGNvbXBhY3Rpb25fcHJvcGVydGllcyAgZnJvbSBzeXN0ZW0uIiArIFN5c3RlbUtleXNwYWNlLkNPTVBBQ1RJT05fSElTVE9SWSArCisgICAgICAgICAgICAgICAgICAgICAiIHdoZXJlIGtleXNwYWNlX25hbWUgPSAnIiArIGtleXNwYWNlKCkgKyAiJyBBTkQgY29sdW1uZmFtaWx5X25hbWUgPSAnIiArIGN1cnJlbnRUYWJsZSgpICsgIicgQUxMT1cgRklMVEVSSU5HIjsKKyAgICAgICAgT2JqZWN0W11bXSBvYmplY3RzID0gbmV3IE9iamVjdFtzeXN0ZW1UYWJsZVJlY29yZF1bXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgIT0gc3lzdGVtVGFibGVSZWNvcmQ7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgb2JqZWN0c1tpXSA9IHJvdyhrZXlzcGFjZSgpLCBjdXJyZW50VGFibGUoKSwgSW1tdXRhYmxlTWFwLm9mKENPTVBBQ1RJT05fVFlQRV9QUk9QRVJUWSwgY29tcGFjdGlvblR5cGUpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRSb3dzKGV4ZWN1dGUoY3FsKSwgb2JqZWN0cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbXBhY3Rpb25IaXN0b3J5UmVzdWx0VmVyaWZ5KFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMsIExpc3Q8U3RyaW5nPiBjbWRzKQorICAgIHsKKyAgICAgICAgVG9vbFJlc3VsdCB0b29sQ29tcGFjdCA9IGludm9rZU5vZGV0b29sKGNtZHMpOworICAgICAgICB0b29sQ29tcGFjdC5hc3NlcnRPbkNsZWFuRXhpdCgpOworCisgICAgICAgIFRvb2xSZXN1bHQgdG9vbEhpc3RvcnkgPSBpbnZva2VOb2RldG9vbCgiY29tcGFjdGlvbmhpc3RvcnkiKTsKKyAgICAgICAgdG9vbEhpc3RvcnkuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgYXNzZXJ0Q29tcGFjdGlvbkhpc3RvcnlPdXRQdXQodG9vbEhpc3RvcnksIGtleXNwYWNlLCB0YWJsZSwgcHJvcGVydGllcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydENvbXBhY3Rpb25IaXN0b3J5T3V0UHV0KFRvb2xSZXN1bHQgdG9vbEhpc3RvcnksIFN0cmluZyBrZXlzcGFjZSwgU3RyaW5nIHRhYmxlLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMpCisgICAgeworICAgICAgICBTdHJpbmcgc3Rkb3V0ID0gdG9vbEhpc3RvcnkuZ2V0U3Rkb3V0KCk7CisgICAgICAgIFN0cmluZ1tdIHJlc3VsdEFycmF5ID0gc3Rkb3V0LnNwbGl0KFN5c3RlbS5saW5lU2VwYXJhdG9yKCkpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5zdHJlYW0ocmVzdWx0QXJyYXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmFueU1hdGNoKHJlc3VsdCAtPiByZXN1bHQuY29udGFpbnMoJ3snICsgRkJVdGlsaXRpZXMudG9TdHJpbmcocHJvcGVydGllcykgKyAnfScpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHQuY29udGFpbnMoa2V5c3BhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHQuY29udGFpbnModGFibGUpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0NvbXBhY3Rpb25TdGF0c1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9Db21wYWN0aW9uU3RhdHNUZXN0LmphdmEKaW5kZXggYjQyYTE2Ni4uYTYyNmRhZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0NvbXBhY3Rpb25TdGF0c1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvQ29tcGFjdGlvblN0YXRzVGVzdC5qYXZhCkBAIC0xOSw2ICsxOSw3IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLm5vZGV0b29sOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CiBpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CiAKQEAgLTM1LDYgKzM2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ub29sUnVubmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOwogaW1wb3J0IG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnM7CitpbXBvcnQgb3JnLmF3YWl0aWxpdHkuQXdhaXRpbGl0eTsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVVVUlEOwogaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CkBAIC0xMDUsOCArMTA3LDggQEAKICAgICAgICAgbG9uZyBieXRlc1RvdGFsID0gMTIzNDU2OwogICAgICAgICBUaW1lVVVJRCBjb21wYWN0aW9uSWQgPSBuZXh0VGltZVVVSUQoKTsKICAgICAgICAgTGlzdDxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IEludFN0cmVhbS5yYW5nZSgwLCAxMCkKLSAgICAgICAgICAgICAgICAubWFwVG9PYmooaSAtPiBNb2NrU2NoZW1hLnNzdGFibGUoaSwgaSAqIDEwTCwgaSAqIDEwTCArIDksIGNmcykpCi0gICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwVG9PYmooaSAtPiBNb2NrU2NoZW1hLnNzdGFibGUoaSwgaSAqIDEwTCwgaSAqIDEwTCArIDksIGNmcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKICAgICAgICAgQ29tcGFjdGlvbkluZm8uSG9sZGVyIGNvbXBhY3Rpb25Ib2xkZXIgPSBuZXcgQ29tcGFjdGlvbkluZm8uSG9sZGVyKCkKICAgICAgICAgewogICAgICAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKQEAgLTEyMSwyMSArMTIzLDE1IEBACiAgICAgICAgIH07CiAKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmJlZ2luQ29tcGFjdGlvbihjb21wYWN0aW9uSG9sZGVyKTsKLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJjb21wYWN0aW9uc3RhdHMiKTsKLSAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBTdHJpbmcgc3Rkb3V0ID0gdG9vbC5nZXRTdGRvdXQoKTsKLSAgICAgICAgYXNzZXJ0VGhhdChzdGRvdXQpLmNvbnRhaW5zKCJwZW5kaW5nIHRhc2tzOiAxIik7CisgICAgICAgIFN0cmluZyBzdGRvdXQgPSB3YWl0Rm9yTnVtYmVyT2ZQZW5kaW5nVGFza3MoMSwgImNvbXBhY3Rpb25zdGF0cyIpOwogICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWluc1BhdHRlcm4oImlkXFxzK2NvbXBhY3Rpb24gdHlwZVxccytrZXlzcGFjZVxccyt0YWJsZVxccytjb21wbGV0ZWRcXHMrdG90YWxcXHMrdW5pdFxccytwcm9ncmVzcyIpOwogICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdGF0c1BhdHRlcm4gPSBTdHJpbmcuZm9ybWF0KCIlc1xccyslc1xccyslc1xccyslc1xccyslc1xccyslc1xccyslc1xccyslLjJmJSUiLAotICAgICAgICAgICAgY29tcGFjdGlvbklkLCBPcGVyYXRpb25UeXBlLkNPTVBBQ1RJT04sIENRTFRlc3Rlci5LRVlTUEFDRSwgY3VycmVudFRhYmxlKCksIGJ5dGVzQ29tcGFjdGVkLCBieXRlc1RvdGFsLAotICAgICAgICAgICAgQ29tcGFjdGlvbkluZm8uVW5pdC5CWVRFUywgKGRvdWJsZSkgYnl0ZXNDb21wYWN0ZWQgLyBieXRlc1RvdGFsICogMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0aW9uSWQsIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgQ1FMVGVzdGVyLktFWVNQQUNFLCBjdXJyZW50VGFibGUoKSwgYnl0ZXNDb21wYWN0ZWQsIGJ5dGVzVG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdGlvbkluZm8uVW5pdC5CWVRFUywgKGRvdWJsZSkgYnl0ZXNDb21wYWN0ZWQgLyBieXRlc1RvdGFsICogMTAwKTsKICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnNQYXR0ZXJuKGV4cGVjdGVkU3RhdHNQYXR0ZXJuKTsKIAogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZmluaXNoQ29tcGFjdGlvbihjb21wYWN0aW9uSG9sZGVyKTsKLSAgICAgICAgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImNvbXBhY3Rpb25zdGF0cyIpOwotICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7Ci0gICAgICAgIHN0ZG91dCA9IHRvb2wuZ2V0U3Rkb3V0KCk7Ci0gICAgICAgIGFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWlucygicGVuZGluZyB0YXNrczogMCIpOworICAgICAgICB3YWl0Rm9yTnVtYmVyT2ZQZW5kaW5nVGFza3MoMCwgImNvbXBhY3Rpb25zdGF0cyIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0xNDgsMTMgKzE0NCwyNyBAQAogICAgICAgICBsb25nIGJ5dGVzVG90YWwgPSAxMjM0NTY7CiAgICAgICAgIFRpbWVVVUlEIGNvbXBhY3Rpb25JZCA9IG5leHRUaW1lVVVJRCgpOwogICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzID0gSW50U3RyZWFtLnJhbmdlKDAsIDEwKQotICAgICAgICAgICAgLm1hcFRvT2JqKGkgLT4gTW9ja1NjaGVtYS5zc3RhYmxlKGksIGkgKiAxMEwsIGkgKiAxMEwgKyA5LCBjZnMpKQotICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwVG9PYmooaSAtPiBNb2NrU2NoZW1hLnNzdGFibGUoaSwgaSAqIDEwTCwgaSAqIDEwTCArIDksIGNmcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgU3RyaW5nIHRhcmdldERpcmVjdG9yeSA9ICIvc29tZS9kaXIvIiArIGNmcy5tZXRhZGF0YS5rZXlzcGFjZSArICcvJyArIGNmcy5tZXRhZGF0YS5uYW1lICsgJy0nICsgY2ZzLm1ldGFkYXRhLmlkLmFzVVVJRCgpOwogICAgICAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgY29tcGFjdGlvbkhvbGRlciA9IG5ldyBDb21wYWN0aW9uSW5mby5Ib2xkZXIoKQogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgQ29tcGFjdGlvbkluZm8gZ2V0Q29tcGFjdGlvbkluZm8oKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8oY2ZzLm1ldGFkYXRhKCksIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIGJ5dGVzVG90YWwsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8oY2ZzLm1ldGFkYXRhKCksIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIGJ5dGVzVG90YWwsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMsIHRhcmdldERpcmVjdG9yeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgQ29tcGFjdGlvbkluZm8uSG9sZGVyIG5vbkNvbXBhY3Rpb25Ib2xkZXIgPSBuZXcgQ29tcGFjdGlvbkluZm8uSG9sZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKGNmcy5tZXRhZGF0YSgpLCBPcGVyYXRpb25UeXBlLkNMRUFOVVAsIGJ5dGVzQ29tcGFjdGVkLCBieXRlc1RvdGFsLCBjb21wYWN0aW9uSWQsIHNzdGFibGVzKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQpAQCAtMTY0LDIxICsxNzQsMjMgQEAKICAgICAgICAgfTsKIAogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuYmVnaW5Db21wYWN0aW9uKGNvbXBhY3Rpb25Ib2xkZXIpOwotICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImNvbXBhY3Rpb25zdGF0cyIsICItViIpOwotICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7Ci0gICAgICAgIFN0cmluZyBzdGRvdXQgPSB0b29sLmdldFN0ZG91dCgpOwotICAgICAgICBhc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnMoInBlbmRpbmcgdGFza3M6IDEiKTsKLSAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnNQYXR0ZXJuKCJrZXlzcGFjZVxccyt0YWJsZVxccyt0YXNrIGlkXFxzK2NvbXBsZXRpb24gcmF0aW9cXHMra2luZFxccytwcm9ncmVzc1xccytzc3RhYmxlc1xccyt0b3RhbFxccyt1bml0Iik7Ci0gICAgICAgIFN0cmluZyBleHBlY3RlZFN0YXRzUGF0dGVybiA9IFN0cmluZy5mb3JtYXQoIiVzXFxzKyVzXFxzKyVzXFxzKyUuMmYlJVxccyslc1xccyslc1xccyslc1xccyslc1xccyslcyIsCi0gICAgICAgICAgICBDUUxUZXN0ZXIuS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjb21wYWN0aW9uSWQsIChkb3VibGUpIGJ5dGVzQ29tcGFjdGVkIC8gYnl0ZXNUb3RhbCAqIDEwMCwKLSAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIHNzdGFibGVzLnNpemUoKSwgYnl0ZXNUb3RhbCwgQ29tcGFjdGlvbkluZm8uVW5pdC5CWVRFUyk7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5iZWdpbkNvbXBhY3Rpb24obm9uQ29tcGFjdGlvbkhvbGRlcik7CisgICAgICAgIFN0cmluZyBzdGRvdXQgPSB3YWl0Rm9yTnVtYmVyT2ZQZW5kaW5nVGFza3MoMiwgImNvbXBhY3Rpb25zdGF0cyIsICItViIpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWluc1BhdHRlcm4oImtleXNwYWNlXFxzK3RhYmxlXFxzK3Rhc2sgaWRcXHMrY29tcGxldGlvbiByYXRpb1xccytraW5kXFxzK3Byb2dyZXNzXFxzK3NzdGFibGVzXFxzK3RvdGFsXFxzK3VuaXRcXHMrdGFyZ2V0IGRpcmVjdG9yeSIpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdGF0c1BhdHRlcm4gPSBTdHJpbmcuZm9ybWF0KCIlc1xccyslc1xccyslc1xccyslLjJmJSVcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENRTFRlc3Rlci5LRVlTUEFDRSwgY3VycmVudFRhYmxlKCksIGNvbXBhY3Rpb25JZCwgKGRvdWJsZSkgYnl0ZXNDb21wYWN0ZWQgLyBieXRlc1RvdGFsICogMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIHNzdGFibGVzLnNpemUoKSwgYnl0ZXNUb3RhbCwgQ29tcGFjdGlvbkluZm8uVW5pdC5CWVRFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXREaXJlY3RvcnkpOwogICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWluc1BhdHRlcm4oZXhwZWN0ZWRTdGF0c1BhdHRlcm4pOwogCisgICAgICAgIFN0cmluZyBleHBlY3RlZFN0YXRzUGF0dGVybkZvck5vbkNvbXBhY3Rpb24gPSBTdHJpbmcuZm9ybWF0KCIlc1xccyslc1xccyslc1xccyslLjJmJSVcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUUxUZXN0ZXIuS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjb21wYWN0aW9uSWQsIChkb3VibGUpIGJ5dGVzQ29tcGFjdGVkIC8gYnl0ZXNUb3RhbCAqIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OLCBieXRlc0NvbXBhY3RlZCwgc3N0YWJsZXMuc2l6ZSgpLCBieXRlc1RvdGFsLCBDb21wYWN0aW9uSW5mby5Vbml0LkJZVEVTKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnNQYXR0ZXJuKGV4cGVjdGVkU3RhdHNQYXR0ZXJuRm9yTm9uQ29tcGFjdGlvbik7CisKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmZpbmlzaENvbXBhY3Rpb24oY29tcGFjdGlvbkhvbGRlcik7Ci0gICAgICAgIHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJjb21wYWN0aW9uc3RhdHMiLCAiLVYiKTsKLSAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBzdGRvdXQgPSB0b29sLmdldFN0ZG91dCgpOwotICAgICAgICBhc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnMoInBlbmRpbmcgdGFza3M6IDAiKTsKKyAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmZpbmlzaENvbXBhY3Rpb24obm9uQ29tcGFjdGlvbkhvbGRlcik7CisgICAgICAgIHdhaXRGb3JOdW1iZXJPZlBlbmRpbmdUYXNrcygwLCAiY29tcGFjdGlvbnN0YXRzIiwgIi1WIik7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTE5MSw4ICsyMDMsOCBAQAogICAgICAgICBsb25nIGJ5dGVzVG90YWwgPSAxMjM0NTY7CiAgICAgICAgIFRpbWVVVUlEIGNvbXBhY3Rpb25JZCA9IG5leHRUaW1lVVVJRCgpOwogICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzID0gSW50U3RyZWFtLnJhbmdlKDAsIDEwKQotICAgICAgICAgICAgLm1hcFRvT2JqKGkgLT4gTW9ja1NjaGVtYS5zc3RhYmxlKGksIGkgKiAxMEwsIGkgKiAxMEwgKyA5LCBjZnMpKQotICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwVG9PYmooaSAtPiBNb2NrU2NoZW1hLnNzdGFibGUoaSwgaSAqIDEwTCwgaSAqIDEwTCArIDksIGNmcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKICAgICAgICAgQ29tcGFjdGlvbkluZm8uSG9sZGVyIGNvbXBhY3Rpb25Ib2xkZXIgPSBuZXcgQ29tcGFjdGlvbkluZm8uSG9sZGVyKCkKICAgICAgICAgewogICAgICAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKQEAgLTIwNywyMSArMjE5LDE1IEBACiAgICAgICAgIH07CiAKICAgICAgICAgQ29tcGFjdGlvbk1hbmFnZXIuaW5zdGFuY2UuYWN0aXZlLmJlZ2luQ29tcGFjdGlvbihjb21wYWN0aW9uSG9sZGVyKTsKLSAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJjb21wYWN0aW9uc3RhdHMiLCAiLS1odW1hbi1yZWFkYWJsZSIpOwotICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7Ci0gICAgICAgIFN0cmluZyBzdGRvdXQgPSB0b29sLmdldFN0ZG91dCgpOwotICAgICAgICBhc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnMoInBlbmRpbmcgdGFza3M6IDEiKTsKKyAgICAgICAgU3RyaW5nIHN0ZG91dCA9IHdhaXRGb3JOdW1iZXJPZlBlbmRpbmdUYXNrcygxLCAiY29tcGFjdGlvbnN0YXRzIiwgIi0taHVtYW4tcmVhZGFibGUiKTsKICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnNQYXR0ZXJuKCJpZFxccytjb21wYWN0aW9uIHR5cGVcXHMra2V5c3BhY2VcXHMrdGFibGVcXHMrY29tcGxldGVkXFxzK3RvdGFsXFxzK3VuaXRcXHMrcHJvZ3Jlc3MiKTsKICAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RhdHNQYXR0ZXJuID0gU3RyaW5nLmZvcm1hdCgiJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJS4yZiUlIiwKLSAgICAgICAgICAgIGNvbXBhY3Rpb25JZCwgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OLCBDUUxUZXN0ZXIuS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCAiMTIzIGJ5dGVzIiwgIjEyMC41NiBLaUIiLAotICAgICAgICAgICAgQ29tcGFjdGlvbkluZm8uVW5pdC5CWVRFUywgKGRvdWJsZSkgYnl0ZXNDb21wYWN0ZWQgLyBieXRlc1RvdGFsICogMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYWN0aW9uSWQsIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgQ1FMVGVzdGVyLktFWVNQQUNFLCBjdXJyZW50VGFibGUoKSwgIjEyMyBieXRlcyIsICIxMjAuNTYgS2lCIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0aW9uSW5mby5Vbml0LkJZVEVTLCAoZG91YmxlKSBieXRlc0NvbXBhY3RlZCAvIGJ5dGVzVG90YWwgKiAxMDApOwogICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWluc1BhdHRlcm4oZXhwZWN0ZWRTdGF0c1BhdHRlcm4pOwogCiAgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5maW5pc2hDb21wYWN0aW9uKGNvbXBhY3Rpb25Ib2xkZXIpOwotICAgICAgICB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgiY29tcGFjdGlvbnN0YXRzIiwgIi0taHVtYW4tcmVhZGFibGUiKTsKLSAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBzdGRvdXQgPSB0b29sLmdldFN0ZG91dCgpOwotICAgICAgICBhc3NlcnRUaGF0KHN0ZG91dCkuY29udGFpbnMoInBlbmRpbmcgdGFza3M6IDAiKTsKKyAgICAgICAgd2FpdEZvck51bWJlck9mUGVuZGluZ1Rhc2tzKDAsICJjb21wYWN0aW9uc3RhdHMiLCAiLS1odW1hbi1yZWFkYWJsZSIpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC0yMzQsMTMgKzI0MCwyNyBAQAogICAgICAgICBsb25nIGJ5dGVzVG90YWwgPSAxMjM0NTY7CiAgICAgICAgIFRpbWVVVUlEIGNvbXBhY3Rpb25JZCA9IG5leHRUaW1lVVVJRCgpOwogICAgICAgICBMaXN0PFNTVGFibGVSZWFkZXI+IHNzdGFibGVzID0gSW50U3RyZWFtLnJhbmdlKDAsIDEwKQotICAgICAgICAgICAgLm1hcFRvT2JqKGkgLT4gTW9ja1NjaGVtYS5zc3RhYmxlKGksIGkgKiAxMEwsIGkgKiAxMEwgKyA5LCBjZnMpKQotICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwVG9PYmooaSAtPiBNb2NrU2NoZW1hLnNzdGFibGUoaSwgaSAqIDEwTCwgaSAqIDEwTCArIDksIGNmcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgU3RyaW5nIHRhcmdldERpcmVjdG9yeSA9ICIvc29tZS9kaXIvIiArIGNmcy5tZXRhZGF0YS5rZXlzcGFjZSArICcvJyArIGNmcy5tZXRhZGF0YS5uYW1lICsgJy0nICsgY2ZzLm1ldGFkYXRhLmlkLmFzVVVJRCgpOwogICAgICAgICBDb21wYWN0aW9uSW5mby5Ib2xkZXIgY29tcGFjdGlvbkhvbGRlciA9IG5ldyBDb21wYWN0aW9uSW5mby5Ib2xkZXIoKQogICAgICAgICB7CiAgICAgICAgICAgICBwdWJsaWMgQ29tcGFjdGlvbkluZm8gZ2V0Q29tcGFjdGlvbkluZm8oKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8oY2ZzLm1ldGFkYXRhKCksIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIGJ5dGVzVG90YWwsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGFjdGlvbkluZm8oY2ZzLm1ldGFkYXRhKCksIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgYnl0ZXNDb21wYWN0ZWQsIGJ5dGVzVG90YWwsIGNvbXBhY3Rpb25JZCwgc3N0YWJsZXMsIHRhcmdldERpcmVjdG9yeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzR2xvYmFsKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgQ29tcGFjdGlvbkluZm8uSG9sZGVyIG5vbkNvbXBhY3Rpb25Ib2xkZXIgPSBuZXcgQ29tcGFjdGlvbkluZm8uSG9sZGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgcHVibGljIENvbXBhY3Rpb25JbmZvIGdldENvbXBhY3Rpb25JbmZvKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBhY3Rpb25JbmZvKGNmcy5tZXRhZGF0YSgpLCBPcGVyYXRpb25UeXBlLkNMRUFOVVAsIGJ5dGVzQ29tcGFjdGVkLCBieXRlc1RvdGFsLCBjb21wYWN0aW9uSWQsIHNzdGFibGVzKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKQpAQCAtMjUwLDIwICsyNzAsMzUgQEAKICAgICAgICAgfTsKIAogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuYmVnaW5Db21wYWN0aW9uKGNvbXBhY3Rpb25Ib2xkZXIpOwotICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImNvbXBhY3Rpb25zdGF0cyIsICItLXZ0YWJsZSIsICItLWh1bWFuLXJlYWRhYmxlIik7Ci0gICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKLSAgICAgICAgU3RyaW5nIHN0ZG91dCA9IHRvb2wuZ2V0U3Rkb3V0KCk7Ci0gICAgICAgIGFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWlucygicGVuZGluZyB0YXNrczogMSIpOwotICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWluc1BhdHRlcm4oImtleXNwYWNlXFxzK3RhYmxlXFxzK3Rhc2sgaWRcXHMrY29tcGxldGlvbiByYXRpb1xccytraW5kXFxzK3Byb2dyZXNzXFxzK3NzdGFibGVzXFxzK3RvdGFsXFxzK3VuaXQiKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkU3RhdHNQYXR0ZXJuID0gU3RyaW5nLmZvcm1hdCgiJXNcXHMrJXNcXHMrJXNcXHMrJS4yZiUlXFxzKyVzXFxzKyVzXFxzKyVzXFxzKyVzXFxzKyVzIiwKLSAgICAgICAgICAgIENRTFRlc3Rlci5LRVlTUEFDRSwgY3VycmVudFRhYmxlKCksIGNvbXBhY3Rpb25JZCwgKGRvdWJsZSkgYnl0ZXNDb21wYWN0ZWQgLyBieXRlc1RvdGFsICogMTAwLAotICAgICAgICAgICAgT3BlcmF0aW9uVHlwZS5DT01QQUNUSU9OLCAiMTIzIGJ5dGVzIiwgc3N0YWJsZXMuc2l6ZSgpLCAiMTIwLjU2IEtpQiIsIENvbXBhY3Rpb25JbmZvLlVuaXQuQllURVMpOworICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuYmVnaW5Db21wYWN0aW9uKG5vbkNvbXBhY3Rpb25Ib2xkZXIpOworICAgICAgICBTdHJpbmcgc3Rkb3V0ID0gd2FpdEZvck51bWJlck9mUGVuZGluZ1Rhc2tzKDIsICJjb21wYWN0aW9uc3RhdHMiLCAiLS12dGFibGUiLCAiLS1odW1hbi1yZWFkYWJsZSIpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWluc1BhdHRlcm4oImtleXNwYWNlXFxzK3RhYmxlXFxzK3Rhc2sgaWRcXHMrY29tcGxldGlvbiByYXRpb1xccytraW5kXFxzK3Byb2dyZXNzXFxzK3NzdGFibGVzXFxzK3RvdGFsXFxzK3VuaXRcXHMrdGFyZ2V0IGRpcmVjdG9yeSIpOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRTdGF0c1BhdHRlcm4gPSBTdHJpbmcuZm9ybWF0KCIlc1xccyslc1xccyslc1xccyslLjJmJSVcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENRTFRlc3Rlci5LRVlTUEFDRSwgY3VycmVudFRhYmxlKCksIGNvbXBhY3Rpb25JZCwgKGRvdWJsZSkgYnl0ZXNDb21wYWN0ZWQgLyBieXRlc1RvdGFsICogMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvblR5cGUuQ09NUEFDVElPTiwgIjEyMyBieXRlcyIsIHNzdGFibGVzLnNpemUoKSwgIjEyMC41NiBLaUIiLCBDb21wYWN0aW9uSW5mby5Vbml0LkJZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldERpcmVjdG9yeSk7CiAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChzdGRvdXQpLmNvbnRhaW5zUGF0dGVybihleHBlY3RlZFN0YXRzUGF0dGVybik7CisgICAgICAgIFN0cmluZyBleHBlY3RlZFN0YXRzUGF0dGVybkZvck5vbkNvbXBhY3Rpb24gPSBTdHJpbmcuZm9ybWF0KCIlc1xccyslc1xccyslc1xccyslLjJmJSVcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXNcXHMrJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUUxUZXN0ZXIuS0VZU1BBQ0UsIGN1cnJlbnRUYWJsZSgpLCBjb21wYWN0aW9uSWQsIChkb3VibGUpIGJ5dGVzQ29tcGFjdGVkIC8gYnl0ZXNUb3RhbCAqIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uVHlwZS5DTEVBTlVQLCAiMTIzIGJ5dGVzIiwgc3N0YWJsZXMuc2l6ZSgpLCAiMTIwLjU2IEtpQiIsIENvbXBhY3Rpb25JbmZvLlVuaXQuQllURVMpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoc3Rkb3V0KS5jb250YWluc1BhdHRlcm4oZXhwZWN0ZWRTdGF0c1BhdHRlcm5Gb3JOb25Db21wYWN0aW9uKTsKIAogICAgICAgICBDb21wYWN0aW9uTWFuYWdlci5pbnN0YW5jZS5hY3RpdmUuZmluaXNoQ29tcGFjdGlvbihjb21wYWN0aW9uSG9sZGVyKTsKLSAgICAgICAgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImNvbXBhY3Rpb25zdGF0cyIsICItLXZ0YWJsZSIsICItLWh1bWFuLXJlYWRhYmxlIik7Ci0gICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKLSAgICAgICAgc3Rkb3V0ID0gdG9vbC5nZXRTdGRvdXQoKTsKLSAgICAgICAgYXNzZXJ0VGhhdChzdGRvdXQpLmNvbnRhaW5zKCJwZW5kaW5nIHRhc2tzOiAwIik7CisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmFjdGl2ZS5maW5pc2hDb21wYWN0aW9uKG5vbkNvbXBhY3Rpb25Ib2xkZXIpOworICAgICAgICB3YWl0Rm9yTnVtYmVyT2ZQZW5kaW5nVGFza3MoMCwgImNvbXBhY3Rpb25zdGF0cyIsICItLXZ0YWJsZSIsICItLWh1bWFuLXJlYWRhYmxlIik7CiAgICAgfQotfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgd2FpdEZvck51bWJlck9mUGVuZGluZ1Rhc2tzKGludCBwZW5kaW5nVGFza3NUb1dhaXRGb3IsIFN0cmluZy4uLiBhcmdzKQorICAgIHsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlPFN0cmluZz4gc3Rkb3V0ID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgIEF3YWl0aWxpdHkuYXdhaXQoKS51bnRpbCgoKSAtPiB7CisgICAgICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woYXJncyk7CisgICAgICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisgICAgICAgICAgICBTdHJpbmcgb3V0cHV0ID0gdG9vbC5nZXRTdGRvdXQoKTsKKyAgICAgICAgICAgIHN0ZG91dC5zZXQob3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXQuY29udGFpbnMoInBlbmRpbmcgdGFza3M6ICIgKyBwZW5kaW5nVGFza3NUb1dhaXRGb3IpOworICAgICAgICB9KTsKKworICAgICAgICByZXR1cm4gc3Rkb3V0LmdldCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvRm9yY2VDb21wYWN0aW9uVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ZvcmNlQ29tcGFjdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGQzNjllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ZvcmNlQ29tcGFjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDI4NSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5ub2RldG9vbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29sdW1uRmFtaWx5U3RvcmU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuS2V5c3BhY2U7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIucm93cy5DZWxsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuUm93OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLnJvd3MuVW5maWx0ZXJlZDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5yb3dzLlVuZmlsdGVyZWRSb3dJdGVyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLklTU1RhYmxlU2Nhbm5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLmZvcm1hdC5TU1RhYmxlUmVhZGVyOworCitwdWJsaWMgY2xhc3MgRm9yY2VDb21wYWN0aW9uVGVzdCBleHRlbmRzIENRTFRlc3RlcgoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBOVU1fUEFSVElUSU9OUyA9IDEwOworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGludCBOVU1fUk9XUyA9IDEwMDsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGNyZWF0ZVRhYmxlKCJDUkVBVEUgVEFCTEUgJXMgKGtleSB0ZXh0LCBjMSB0ZXh0LCBjMiB0ZXh0LCBjMyB0ZXh0LCBQUklNQVJZIEtFWSAoa2V5LCBjMSkpIik7CisKKyAgICAgICAgZm9yIChpbnQgcGFydGl0aW9uQ291bnQgPSAwOyBwYXJ0aXRpb25Db3VudCA8IE5VTV9QQVJUSVRJT05TOyBwYXJ0aXRpb25Db3VudCsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGludCByb3dDb3VudCA9IDA7IHJvd0NvdW50IDwgTlVNX1JPV1M7IHJvd0NvdW50KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXhlY3V0ZSgiSU5TRVJUIElOVE8gJXMgKGtleSwgYzEsIGMyLCBjMykgVkFMVUVTICg/LCA/LCA/LCA/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiayIgKyBwYXJ0aXRpb25Db3VudCwgImMxXyIgKyByb3dDb3VudCwgImMyXyIgKyByb3dDb3VudCwgImMzXyIgKyByb3dDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEaXNhYmxlIGF1dG8gY29tcGFjdGlvbgorICAgICAgICAvLyBOT1RFOiBXZSBjYW4gb25seSBkaXNhYmxlIHRoZSBhdXRvIGNvbXBhY3Rpb24gb25jZSB0aGUgdGFibGUgaXMgY3JlYXRlZCBiZWNhdXNlIHRoZSBzZXR0aW5nIGlzIG9uCisgICAgICAgIC8vIHRoZSB0YWJsZSBsZXZlbC4gQW5kIHdlIGRvbid0IG5lZWQgdG8gcmUtZW5hYmxlIGl0IGJhY2sgYmVjYXVzZSB0aGUgdGFibGUgd2lsbCBiZSBkcm9wcGVkIGFmdGVyIHRoZSB0ZXN0LgorICAgICAgICBkaXNhYmxlQ29tcGFjdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0UGFydGl0aW9uVG9tYnN0b25lVGVzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyBrZXlUb1B1cmdlID0gImswIjsKKworICAgICAgICB0ZXN0SGVscGVyKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrZXkgPSA/Iiwga2V5VG9QdXJnZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmb3JjZUNvbXBhY3RNdWx0aXBsZVBhcnRpdGlvbnNUb21ic3RvbmVUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGtleXNUb1B1cmdlID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOworCisgICAgICAgIGludCBudW1QYXJ0aXRpb25zVG9QdXJnZSA9IDEgKyByYW5kLm5leHRJbnQoTlVNX1BBUlRJVElPTlMpOworICAgICAgICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgbnVtUGFydGl0aW9uc1RvUHVyZ2U7IGNvdW50KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSAiayIgKyByYW5kLm5leHRJbnQoTlVNX1BBUlRJVElPTlMpOworCisgICAgICAgICAgICBleGVjdXRlKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrZXkgPSA/Iiwga2V5KTsKKyAgICAgICAgICAgIGtleXNUb1B1cmdlLmFkZChrZXkpOworICAgICAgICB9CisKKyAgICAgICAgZmx1c2goKTsKKworICAgICAgICBTdHJpbmdbXSBrZXlzID0gbmV3IFN0cmluZ1trZXlzVG9QdXJnZS5zaXplKCldOworICAgICAgICBrZXlzID0ga2V5c1RvUHVyZ2UudG9BcnJheShrZXlzKTsKKyAgICAgICAgZm9yY2VDb21wYWN0KGtleXMpOworCisgICAgICAgIHZlcmlmeU5vdENvbnRhaW5zVG9tYnN0b25lcygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0Um93VG9tYnN0b25lVGVzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIFN0cmluZyBrZXlUb1B1cmdlID0gImswIjsKKworICAgICAgICB0ZXN0SGVscGVyKCJERUxFVEUgRlJPTSAlcyBXSEVSRSBrZXkgPSA/IEFORCBjMSA9ICdjMV8wJyIsIGtleVRvUHVyZ2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0TXVsdGlwbGVSb3dzVG9tYnN0b25lVGVzdCgpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBrZXlzVG9QdXJnZSA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIFJhbmRvbSByYW5kUGFydGl0aW9uID0gbmV3IFJhbmRvbSgpOworICAgICAgICBSYW5kb20gcmFuZFJvdyA9IG5ldyBSYW5kb20oKTsKKworICAgICAgICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgMTA7IGNvdW50KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXJ0aXRpb25LZXkgPSAiayIgKyByYW5kUGFydGl0aW9uLm5leHRJbnQoTlVNX1BBUlRJVElPTlMpOworICAgICAgICAgICAgU3RyaW5nIGNsdXN0ZXJpbmdLZXkgPSAiYzFfIiArIHJhbmRSb3cubmV4dEludChOVU1fUk9XUyk7CisKKyAgICAgICAgICAgIGV4ZWN1dGUoIkRFTEVURSBGUk9NICVzIFdIRVJFIGtleSA9ID8gQU5EIGMxID0gPyIsIHBhcnRpdGlvbktleSwgY2x1c3RlcmluZ0tleSk7CisgICAgICAgICAgICBrZXlzVG9QdXJnZS5hZGQocGFydGl0aW9uS2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIGZsdXNoKCk7CisKKyAgICAgICAgU3RyaW5nW10ga2V5cyA9IG5ldyBTdHJpbmdba2V5c1RvUHVyZ2Uuc2l6ZSgpXTsKKyAgICAgICAga2V5cyA9IGtleXNUb1B1cmdlLnRvQXJyYXkoa2V5cyk7CisgICAgICAgIGZvcmNlQ29tcGFjdChrZXlzKTsKKworICAgICAgICB2ZXJpZnlOb3RDb250YWluc1RvbWJzdG9uZXMoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZvcmNlQ29tcGFjdENlbGxUb21ic3RvbmVUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgU3RyaW5nIGtleVRvUHVyZ2UgPSAiazAiOworICAgICAgICB0ZXN0SGVscGVyKCJERUxFVEUgYzIgRlJPTSAlcyBXSEVSRSBrZXkgPSA/IEFORCBjMSA9ICdjMV8wJyIsIGtleVRvUHVyZ2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0TXVsdGlwbGVDZWxsc1RvbWJzdG9uZVRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBMaXN0PFN0cmluZz4ga2V5c1RvUHVyZ2UgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBSYW5kb20gcmFuZFBhcnRpdGlvbiA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgUmFuZG9tIHJhbmRSb3cgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IDEwOyBjb3VudCsrKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgcGFydGl0aW9uS2V5ID0gImsiICsgcmFuZFBhcnRpdGlvbi5uZXh0SW50KE5VTV9QQVJUSVRJT05TKTsKKyAgICAgICAgICAgIFN0cmluZyBjbHVzdGVyaW5nS2V5ID0gImMxXyIgKyByYW5kUm93Lm5leHRJbnQoTlVNX1JPV1MpOworCisgICAgICAgICAgICBleGVjdXRlKCJERUxFVEUgYzIsIGMzIEZST00gJXMgV0hFUkUga2V5ID0gPyBBTkQgYzEgPSA/IiwgcGFydGl0aW9uS2V5LCBjbHVzdGVyaW5nS2V5KTsKKyAgICAgICAgICAgIGtleXNUb1B1cmdlLmFkZChwYXJ0aXRpb25LZXkpOworICAgICAgICB9CisKKyAgICAgICAgZmx1c2goKTsKKworICAgICAgICBTdHJpbmdbXSBrZXlzID0gbmV3IFN0cmluZ1trZXlzVG9QdXJnZS5zaXplKCldOworICAgICAgICBrZXlzID0ga2V5c1RvUHVyZ2UudG9BcnJheShrZXlzKTsKKyAgICAgICAgZm9yY2VDb21wYWN0KGtleXMpOworCisgICAgICAgIHZlcmlmeU5vdENvbnRhaW5zVG9tYnN0b25lcygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0VXBkYXRlQ2VsbFRvbWJzdG9uZVRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBTdHJpbmcga2V5VG9QdXJnZSA9ICJrMCI7CisgICAgICAgIHRlc3RIZWxwZXIoIlVQREFURSAlcyBTRVQgYzIgPSBudWxsIFdIRVJFIGtleSA9ID8gQU5EIGMxID0gJ2MxXzAnIiwga2V5VG9QdXJnZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmb3JjZUNvbXBhY3RUVExFeHBpcnlUZXN0KCkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgaW50IHR0bFNlYyA9IDI7CisgICAgICAgIFN0cmluZyBrZXlUb1B1cmdlID0gImswIjsKKworICAgICAgICBleGVjdXRlKCJVUERBVEUgJXMgVVNJTkcgVFRMID8gU0VUIGMyID0gJ2JiYicgV0hFUkUga2V5ID0gPyBBTkQgYzEgPSAnYzFfMCciLCB0dGxTZWMsIGtleVRvUHVyZ2UpOworCisgICAgICAgIGZsdXNoKCk7CisKKyAgICAgICAgLy8gV2FpdCB1bnRpbCB0aGUgVFRMIGhhcyBiZWVuIGV4cGlyZWQKKyAgICAgICAgLy8gTk9URTogd2UgZG91YmxlIHRoZSB3YWl0IHRpbWUgb2YgdGhlIHR0bCB0byBiZSBvbiB0aGUgc2FmZXIgc2lkZSBhbmQgYXZvaWQgdGhlIGZsYWtpbmVzcyBvZiB0aGUgdGVzdAorICAgICAgICBUaHJlYWQuc2xlZXAodHRsU2VjICogMTAwMCAqIDIpOworCisgICAgICAgIFN0cmluZ1tdIGtleXNUb1B1cmdlID0gbmV3IFN0cmluZ1tde2tleVRvUHVyZ2V9OworICAgICAgICBmb3JjZUNvbXBhY3Qoa2V5c1RvUHVyZ2UpOworCisgICAgICAgIHZlcmlmeU5vdENvbnRhaW5zVG9tYnN0b25lcygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZm9yY2VDb21wYWN0Q29tcG9zaXRlUGFydGl0aW9uS2V5c1Rlc3QoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBjcmVhdGVUYWJsZSgiQ1JFQVRFIFRBQkxFICVzIChrZXkxIHRleHQsIGtleTIgdGV4dCwgYzEgdGV4dCwgYzIgdGV4dCwgUFJJTUFSWSBLRVkgKChrZXkxLCBrZXkyKSwgYzEpKSIpOworCisgICAgICAgIGZvciAoaW50IHBhcnRpdGlvbkNvdW50ID0gMDsgcGFydGl0aW9uQ291bnQgPCBOVU1fUEFSVElUSU9OUzsgcGFydGl0aW9uQ291bnQrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgcm93Q291bnQgPSAwOyByb3dDb3VudCA8IE5VTV9ST1dTOyByb3dDb3VudCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGV4ZWN1dGUoIklOU0VSVCBJTlRPICVzIChrZXkxLCBrZXkyLCBjMSwgYzIpIFZBTFVFUyAoPywgPywgPywgPykiLAorICAgICAgICAgICAgICAgICAgICAgICAgImsxXyIgKyBwYXJ0aXRpb25Db3VudCwgImsyXyIgKyBwYXJ0aXRpb25Db3VudCwgImMxXyIgKyByb3dDb3VudCwgImMyXyIgKyByb3dDb3VudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEaXNhYmxlIGF1dG8gY29tcGFjdGlvbgorICAgICAgICAvLyBOT1RFOiBXZSBjYW4gb25seSBkaXNhYmxlIHRoZSBhdXRvIGNvbXBhY3Rpb24gb25jZSB0aGUgdGFibGUgaXMgY3JlYXRlZCBiZWNhdXNlIHRoZSBzZXR0aW5nIGlzIG9uCisgICAgICAgIC8vIHRoZSB0YWJsZSBsZXZlbC4gQW5kIHdlIGRvbid0IG5lZWQgdG8gcmUtZW5hYmxlIGl0IGJhY2sgYmVjYXVzZSB0aGUgdGFibGUgd2lsbCBiZSBkcm9wcGVkIGFmdGVyIHRoZSB0ZXN0LgorICAgICAgICBkaXNhYmxlQ29tcGFjdGlvbigpOworCisgICAgICAgIFN0cmluZyBrZXlUb1B1cmdlID0gImsxXzA6azJfMCI7CisKKyAgICAgICAgZXhlY3V0ZSgiREVMRVRFIEZST00gJXMgV0hFUkUga2V5MSA9ICdrMV8wJyBhbmQga2V5MiA9ICdrMl8wJyIpOworCisgICAgICAgIGZsdXNoKCk7CisKKyAgICAgICAgU3RyaW5nW10ga2V5c1RvUHVyZ2UgPSBuZXcgU3RyaW5nW117a2V5VG9QdXJnZX07CisgICAgICAgIGZvcmNlQ29tcGFjdChrZXlzVG9QdXJnZSk7CisKKyAgICAgICAgdmVyaWZ5Tm90Q29udGFpbnNUb21ic3RvbmVzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RIZWxwZXIoU3RyaW5nIGNxbFN0YXRlbWVudCwgU3RyaW5nIGtleVRvUHVyZ2UpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGV4ZWN1dGUoY3FsU3RhdGVtZW50LCBrZXlUb1B1cmdlKTsKKworICAgICAgICBmbHVzaCgpOworCisgICAgICAgIFN0cmluZ1tdIGtleXNUb1B1cmdlID0gbmV3IFN0cmluZ1tde2tleVRvUHVyZ2V9OworICAgICAgICBmb3JjZUNvbXBhY3Qoa2V5c1RvUHVyZ2UpOworCisgICAgICAgIHZlcmlmeU5vdENvbnRhaW5zVG9tYnN0b25lcygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmb3JjZUNvbXBhY3QoU3RyaW5nW10gcGFydGl0aW9uS2V5c0lnbm9yZUdjR3JhY2UpCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBnZXRDdXJyZW50Q29sdW1uRmFtaWx5U3RvcmUoKTsKKyAgICAgICAgaWYgKGNmcyAhPSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBjZnMuZm9yY2VDb21wYWN0aW9uS2V5c0lnbm9yaW5nR2NHcmFjZShwYXJ0aXRpb25LZXlzSWdub3JlR2NHcmFjZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Tm90Q29udGFpbnNUb21ic3RvbmVzKCkKKyAgICB7CisgICAgICAgIC8vIEdldCBzc3RhYmxlcworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBLZXlzcGFjZS5vcGVuKGtleXNwYWNlKCkpLmdldENvbHVtbkZhbWlseVN0b3JlKGN1cnJlbnRUYWJsZSgpKTsKKyAgICAgICAgQ29sbGVjdGlvbjxTU1RhYmxlUmVhZGVyPiBzc3RhYmxlcyA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKTsKKworICAgICAgICAvLyBhbHdheXMgcnVuIGEgbWFqb3IgY29tcGFjdGlvbiBiZWZvcmUgY2FsbGluZyB0aGlzCisgICAgICAgIGFzc2VydFRydWUoc3N0YWJsZXMuc2l6ZSgpID09IDEpOworCisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IHNzdGFibGVzLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICBpbnQgYWN0dWFsUHVyZ2VkVG9tYnN0b25lQ291bnQgPSAwOworICAgICAgICB0cnkgKElTU1RhYmxlU2Nhbm5lciBzY2FubmVyID0gc3N0YWJsZS5nZXRTY2FubmVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlIChzY2FubmVyLmhhc05leHQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0cnkgKFVuZmlsdGVyZWRSb3dJdGVyYXRvciBpdGVyID0gc2Nhbm5lci5uZXh0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBQYXJ0aXRpb24gc2hvdWxkIGJlIGFsbCBhbGl2ZQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGl0ZXIucGFydGl0aW9uTGV2ZWxEZWxldGlvbigpLmlzTGl2ZSgpKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVuZmlsdGVyZWQgYXRvbSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0b20uaXNSb3coKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3cgciA9IChSb3cpYXRvbTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJvdyBzaG91bGQgYmUgYWxsIGFsaXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyLmRlbGV0aW9uKCkuaXNMaXZlKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2VsbCBzaG91bGQgYmUgYWxpdmUgYXMgd2VsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoQ2VsbCBjIDogci5jZWxscygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYy5pc1RvbWJzdG9uZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0dldEF1ZGl0TG9nVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0dldEF1ZGl0TG9nVGVzdC5qYXZhCmluZGV4IDA2OTcxMGIuLmI5NjE4N2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9HZXRBdWRpdExvZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvR2V0QXVkaXRMb2dUZXN0LmphdmEKQEAgLTMyLDYgKzMyLDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgeworICAgICAgICByZXF1aXJlTmV0d29yaygpOwogICAgICAgICBzdGFydEpNWFNlcnZlcigpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0dldEF1dGhDYWNoZUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9HZXRBdXRoQ2FjaGVDb25maWdUZXN0LmphdmEKaW5kZXggNmFmYzE3OS4uOTA0ODRlMyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0dldEF1dGhDYWNoZUNvbmZpZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvR2V0QXV0aENhY2hlQ29uZmlnVGVzdC5qYXZhCkBAIC00Miw2ICs0Miw3IEBACiAgICAgewogICAgICAgICBDUUxUZXN0ZXIuc2V0VXBDbGFzcygpOwogICAgICAgICBDUUxUZXN0ZXIucmVxdWlyZUF1dGhlbnRpY2F0aW9uKCk7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCkBAIC05NSwxNyArOTYsMTcgQEAKICAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJnZXRhdXRoY2FjaGVjb25maWciKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldEV4aXRDb2RlKCkpLmlzRXF1YWxUbygxKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5pc0VxdWFsVG8od3JhcEJ5RGVmYXVsdE5vZGV0b29sTWVzc2FnZSgiUmVxdWlyZWQgb3B0aW9uICctLWNhY2hlLW5hbWUnIGlzIG1pc3NpbmciKSk7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRlcnIoKSkuaXNFbXB0eSgpOworICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpKS5pc0VtcHR5KCk7CiAKICAgICAgICAgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImdldGF1dGhjYWNoZWNvbmZpZyIsICItLWNhY2hlLW5hbWUiKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldEV4aXRDb2RlKCkpLmlzRXF1YWxUbygxKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5pc0VxdWFsVG8od3JhcEJ5RGVmYXVsdE5vZGV0b29sTWVzc2FnZSgiUmVxdWlyZWQgdmFsdWVzIGZvciBvcHRpb24gJ2NhY2hlLW5hbWUnIG5vdCBwcm92aWRlZCIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZGVycigpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKIAogICAgICAgICB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgiZ2V0YXV0aGNhY2hlY29uZmlnIiwgIi0tY2FjaGUtbmFtZSIsICJ3cm9uZyIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCJVbmtub3duIGNhY2hlIG5hbWU6IHdyb25nIikpOwotICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3RkZXJyKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldENsZWFuZWRTdGRlcnIoKSkuaXNFbXB0eSgpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvR2V0RnVsbFF1ZXJ5TG9nVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0dldEZ1bGxRdWVyeUxvZ1Rlc3QuamF2YQppbmRleCA2MWQzNGVjLi5kZmMxMDk5IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvR2V0RnVsbFF1ZXJ5TG9nVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9HZXRGdWxsUXVlcnlMb2dUZXN0LmphdmEKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgeworICAgICAgICByZXF1aXJlTmV0d29yaygpOwogICAgICAgICBzdGFydEpNWFNlcnZlcigpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ludmFsaWRhdGVDcmVkZW50aWFsc0NhY2hlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ludmFsaWRhdGVDcmVkZW50aWFsc0NhY2hlVGVzdC5qYXZhCmluZGV4IDQwZDdmZmIuLmQ4M2M4NDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbnZhbGlkYXRlQ3JlZGVudGlhbHNDYWNoZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvSW52YWxpZGF0ZUNyZWRlbnRpYWxzQ2FjaGVUZXN0LmphdmEKQEAgLTYyLDYgKzYyLDcgQEAKICAgICAgICAgICAgICAgICAubmV3QXV0aGVudGljYXRvcigoRW5kUG9pbnQpIG51bGwsIG51bGwpCiAgICAgICAgICAgICAgICAgLmluaXRpYWxSZXNwb25zZSgpKTsKIAorICAgICAgICByZXF1aXJlTmV0d29yaygpOwogICAgICAgICBzdGFydEpNWFNlcnZlcigpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ludmFsaWRhdGVKbXhQZXJtaXNzaW9uc0NhY2hlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ludmFsaWRhdGVKbXhQZXJtaXNzaW9uc0NhY2hlVGVzdC5qYXZhCmluZGV4IGY0NGEyNzQuLjU0ZjJkZTcgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbnZhbGlkYXRlSm14UGVybWlzc2lvbnNDYWNoZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvSW52YWxpZGF0ZUpteFBlcm1pc3Npb25zQ2FjaGVUZXN0LmphdmEKQEAgLTY1LDYgKzY1LDcgQEAKIAogICAgICAgICBBdXRoQ2FjaGVTZXJ2aWNlLmluaXRpYWxpemVBbmRSZWdpc3RlckNhY2hlcygpOwogCisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvSW52YWxpZGF0ZU5ldHdvcmtQZXJtaXNzaW9uc0NhY2hlVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ludmFsaWRhdGVOZXR3b3JrUGVybWlzc2lvbnNDYWNoZVRlc3QuamF2YQppbmRleCBjNTRlNTI2Li40MTIyMDY2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvSW52YWxpZGF0ZU5ldHdvcmtQZXJtaXNzaW9uc0NhY2hlVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbnZhbGlkYXRlTmV0d29ya1Blcm1pc3Npb25zQ2FjaGVUZXN0LmphdmEKQEAgLTQ3LDYgKzQ3LDcgQEAKICAgICAgICAgcm9sZU1hbmFnZXIuY3JlYXRlUm9sZShBdXRoZW50aWNhdGVkVXNlci5TWVNURU1fVVNFUiwgUk9MRV9CLCBBdXRoVGVzdFV0aWxzLmdldExvZ2luUm9sZU9wdGlvbnMoKSk7CiAgICAgICAgIEF1dGhDYWNoZVNlcnZpY2UuaW5pdGlhbGl6ZUFuZFJlZ2lzdGVyQ2FjaGVzKCk7CiAKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKICAgICAgICAgc3RhcnRKTVhTZXJ2ZXIoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbnZhbGlkYXRlUGVybWlzc2lvbnNDYWNoZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbnZhbGlkYXRlUGVybWlzc2lvbnNDYWNoZVRlc3QuamF2YQppbmRleCBlNmQyYmExLi5jOGFmZmIyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvSW52YWxpZGF0ZVBlcm1pc3Npb25zQ2FjaGVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ludmFsaWRhdGVQZXJtaXNzaW9uc0NhY2hlVGVzdC5qYXZhCkBAIC04NSw2ICs4NSw3IEBACiAgICAgICAgICAgICBhdXRob3JpemVyLmdyYW50KEF1dGhlbnRpY2F0ZWRVc2VyLlNZU1RFTV9VU0VSLCBwZXJtaXNzaW9ucywgcmVzb3VyY2UsIFJPTEVfQik7CiAgICAgICAgIH0KIAorICAgICAgICByZXF1aXJlTmV0d29yaygpOwogICAgICAgICBzdGFydEpNWFNlcnZlcigpOwogICAgIH0KIApAQCAtMTg1LDQ0ICsxODYsNDQgQEAKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldEV4aXRDb2RlKCkpLmlzRXF1YWxUbygxKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKQogICAgICAgICAgICAgICAgIC5pc0VxdWFsVG8od3JhcEJ5RGVmYXVsdE5vZGV0b29sTWVzc2FnZSgiTm8gcmVzb3VyY2Ugb3B0aW9ucyBhbGxvd2VkIHdpdGhvdXQgYSA8cm9sZT4gYmVpbmcgc3BlY2lmaWVkIikpOwotICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3RkZXJyKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldENsZWFuZWRTdGRlcnIoKSkuaXNFbXB0eSgpOwogCiAgICAgICAgIHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJpbnZhbGlkYXRlcGVybWlzc2lvbnNjYWNoZSIsICJyb2xlMSIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpCiAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCJObyByZXNvdXJjZSBvcHRpb25zIHNwZWNpZmllZCIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZGVycigpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKIAogICAgICAgICB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgiaW52YWxpZGF0ZXBlcm1pc3Npb25zY2FjaGUiLCAicm9sZTEiLCAiLS1pbnZhbGlkLW9wdGlvbiIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpCiAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCJBIHNpbmdsZSA8cm9sZT4gaXMgb25seSBzdXBwb3J0ZWQgLyB5b3UgaGF2ZSBhIHR5cG8gaW4gdGhlIHJlc291cmNlIG9wdGlvbnMgc3BlbGxpbmciKSk7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRlcnIoKSkuaXNFbXB0eSgpOworICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpKS5pc0VtcHR5KCk7CiAKICAgICAgICAgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImludmFsaWRhdGVwZXJtaXNzaW9uc2NhY2hlIiwgInJvbGUxIiwgIi0tYWxsLXRhYmxlcyIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpCiAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCItLWFsbC10YWJsZXMgb3B0aW9uIHNob3VsZCBiZSBwYXNzZWQgYWxvbmcgd2l0aCAtLWtleXNwYWNlIG9wdGlvbiIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZGVycigpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKIAogICAgICAgICB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgiaW52YWxpZGF0ZXBlcm1pc3Npb25zY2FjaGUiLCAicm9sZTEiLCAiLS10YWJsZSIsICJ0MSIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpCiAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCItLXRhYmxlIG9wdGlvbiBzaG91bGQgYmUgcGFzc2VkIGFsb25nIHdpdGggLS1rZXlzcGFjZSBvcHRpb24iKSk7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRlcnIoKSkuaXNFbXB0eSgpOworICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpKS5pc0VtcHR5KCk7CiAKICAgICAgICAgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImludmFsaWRhdGVwZXJtaXNzaW9uc2NhY2hlIiwgInJvbGUxIiwgIi0tZnVuY3Rpb24iLCAiZltJbnQzMlR5cGVdIik7CiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRFeGl0Q29kZSgpKS5pc0VxdWFsVG8oMSk7CiAgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkKICAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKHdyYXBCeURlZmF1bHROb2RldG9vbE1lc3NhZ2UoIi0tZnVuY3Rpb24gb3B0aW9uIHNob3VsZCBiZSBwYXNzZWQgYWxvbmcgd2l0aCAtLWZ1bmN0aW9ucy1pbi1rZXlzcGFjZSBvcHRpb24iKSk7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRlcnIoKSkuaXNFbXB0eSgpOworICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpKS5pc0VtcHR5KCk7CiAKICAgICAgICAgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woImludmFsaWRhdGVwZXJtaXNzaW9uc2NhY2hlIiwgInJvbGUxIiwgIi0tZnVuY3Rpb25zLWluLWtleXNwYWNlIiwKICAgICAgICAgICAgICAgICBLRVlTUEFDRSwgIi0tZnVuY3Rpb24iLCAiZlt4XSIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpCiAgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCJBbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgd2hlbiBsb29raW5nIHVwIGZ1bmN0aW9uIGRlZmluaXRpb246IFVuYWJsZSB0byBmaW5kIGFic3RyYWN0LXR5cGUgY2xhc3MgJ29yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwueCciKSk7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRlcnIoKSkuaXNFbXB0eSgpOworICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0Q2xlYW5lZFN0ZGVycigpKS5pc0VtcHR5KCk7CiAgICAgfQogCiAgICAgQFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbnZhbGlkYXRlUm9sZXNDYWNoZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9JbnZhbGlkYXRlUm9sZXNDYWNoZVRlc3QuamF2YQppbmRleCBiYjhmYjkyLi4wOGJhNjc2IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvSW52YWxpZGF0ZVJvbGVzQ2FjaGVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL0ludmFsaWRhdGVSb2xlc0NhY2hlVGVzdC5qYXZhCkBAIC00Nyw2ICs0Nyw3IEBACiAgICAgICAgIHJvbGVNYW5hZ2VyLmNyZWF0ZVJvbGUoQXV0aGVudGljYXRlZFVzZXIuU1lTVEVNX1VTRVIsIFJPTEVfQiwgQXV0aFRlc3RVdGlscy5nZXRMb2dpblJvbGVPcHRpb25zKCkpOwogICAgICAgICBBdXRoQ2FjaGVTZXJ2aWNlLmluaXRpYWxpemVBbmRSZWdpc3RlckNhY2hlcygpOwogCisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvTmV0U3RhdHNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvTmV0U3RhdHNUZXN0LmphdmEKaW5kZXggZjhiZDUzMC4uN2JkZGM5YiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL05ldFN0YXRzVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9OZXRTdGF0c1Rlc3QuamF2YQpAQCAtMTE3LDcgKzExNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3NBbmRQb3J0LmdldExvY2FsSG9zdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVN1bW1hcmllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TdW1tYXJpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUuQ09NUExFVEUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlLkNPTVBMRVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpOwogCiAgICAgICAgIHRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7IFByaW50U3RyZWFtIG91dCA9IG5ldyBQcmludFN0cmVhbShiYW9zKSkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1JpbmdUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvUmluZ1Rlc3QuamF2YQppbmRleCAwMGM4YmJhLi4yOGZmZmQ5IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvUmluZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvUmluZ1Rlc3QuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAoraW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCkBAIC0xNTUsNyArMTU2LDcgQEAKICAgICB7CiAgICAgICAgIC8vIEJhZCBLUwogICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woInJpbmciLCAibW9ja2tzIik7Ci0gICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCB0b29sLmdldEV4aXRDb2RlKCkpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJUaGUga2V5c3BhY2UgbW9ja2tzLCBkb2VzIG5vdCBleGlzdCIpOwogCiAgICAgICAgIC8vIEdvb2QgS1MKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TY3J1YlRvb2xUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2NydWJUb29sVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDdjZTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2NydWJUb29sVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLm5vZGV0b29sOworCitpbXBvcnQgamF2YS5pby5JT0Vycm9yOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5jb21wYWN0aW9uLkNvbXBhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVVJRFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5Db25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmV4Y2VwdGlvbnMuV3JpdGVUaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29ycnVwdFNTVGFibGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TY3J1YlRlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuU3RhbmRhbG9uZVNjcnViYmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGhyb3dhYmxlczsKK2ltcG9ydCBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlNjaGVtYUxvYWRlci5jb3VudGVyQ0ZNRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLmNyZWF0ZUtleXNwYWNlOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIuZ2V0Q29tcHJlc3Npb25QYXJhbWV0ZXJzOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5TY2hlbWFMb2FkZXIubG9hZFNjaGVtYTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuU2NoZW1hTG9hZGVyLnN0YW5kYXJkQ0ZNRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkNhc3NhbmRyYVJlbGV2YW50UHJvcGVydGllcy5URVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1Q7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2NydWJUZXN0LkNGX0lOREVYMTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TY3J1YlRlc3QuQ0ZfSU5ERVgxX0JZVEVPUkRFUkVEOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNjcnViVGVzdC5DRl9JTkRFWDI7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2NydWJUZXN0LkNGX0lOREVYMl9CWVRFT1JERVJFRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TY3J1YlRlc3QuQ0ZfVVVJRDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TY3J1YlRlc3QuQ09NUFJFU1NJT05fQ0hVTktfTEVOR1RIOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNjcnViVGVzdC5DT1VOVEVSX0NGOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNjcnViVGVzdC5hc3NlcnRPcmRlcmVkQWxsOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlNjcnViVGVzdC5maWxsQ0Y7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2NydWJUZXN0LmZpbGxDb3VudGVyQ0Y7CitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuU2NydWJUZXN0Lm92ZXJyaWRlV2l0aEdhcmJhZ2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK3B1YmxpYyBjbGFzcyBTY3J1YlRvb2xUZXN0Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENGID0gInNjcnViX3Rvb2xfdGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBzZXEgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgU3RyaW5nIGtzTmFtZTsKKyAgICBLZXlzcGFjZSBrZXlzcGFjZTsKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZGVmaW5lU2NoZW1hKCkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvYWRTY2hlbWEoKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKQorICAgIHsKKyAgICAgICAga3NOYW1lID0gInNjcnViX3Rlc3RfIiArIHNlcS5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgY3JlYXRlS2V5c3BhY2Uoa3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBLZXlzcGFjZVBhcmFtcy5zaW1wbGUoMSksCisgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChrc05hbWUsIENGKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNGTUQoa3NOYW1lLCBDT1VOVEVSX0NGKS5jb21wcmVzc2lvbihnZXRDb21wcmVzc2lvblBhcmFtZXRlcnMoQ09NUFJFU1NJT05fQ0hVTktfTEVOR1RIKSksCisgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkQ0ZNRChrc05hbWUsIENGX1VVSUQsIDAsIFVVSURUeXBlLmluc3RhbmNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmtleXNJbmRleENGTUQoa3NOYW1lLCBDRl9JTkRFWDEsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuY29tcG9zaXRlSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgyLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgU2NoZW1hTG9hZGVyLmtleXNJbmRleENGTUQoa3NOYW1lLCBDRl9JTkRFWDFfQllURU9SREVSRUQsIHRydWUpLnBhcnRpdGlvbmVyKEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UpLAorICAgICAgICAgICAgICAgICAgICAgICBTY2hlbWFMb2FkZXIuY29tcG9zaXRlSW5kZXhDRk1EKGtzTmFtZSwgQ0ZfSU5ERVgyX0JZVEVPUkRFUkVELCB0cnVlKS5wYXJ0aXRpb25lcihCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKSk7CisgICAgICAgIGtleXNwYWNlID0gS2V5c3BhY2Uub3Blbihrc05hbWUpOworCisgICAgICAgIENvbXBhY3Rpb25NYW5hZ2VyLmluc3RhbmNlLmRpc2FibGVBdXRvQ29tcGFjdGlvbigpOworICAgICAgICBURVNUX1VUSUxfQUxMT1dfVE9PTF9SRUlOSVRfRk9SX1RFU1Quc2V0Qm9vbGVhbih0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTY3J1Yk9uZVBhcnRpdGlvbldpdGhUb29sKCkKKyAgICB7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKKworICAgICAgICAvLyBpbnNlcnQgZGF0YSBhbmQgdmVyaWZ5IHdlIGdldCBpdCBiYWNrIHcvIHJhbmdlIHF1ZXJ5CisgICAgICAgIGZpbGxDRihjZnMsIDEpOworICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7CisKKyAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywga3NOYW1lLCBDRik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiUHJlLXNjcnViIHNzdGFibGVzIHNuYXBzaG90dGVkIGludG8iKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCIxIHBhcnRpdGlvbnMgaW4gbmV3IHNzdGFibGUgYW5kIDAgZW1wdHkiKTsKKyAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOworCisgICAgICAgIC8vIGNoZWNrIGRhdGEgaXMgc3RpbGwgdGhlcmUKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNraXBTY3J1YkNvcnJ1cHRlZENvdW50ZXJQYXJ0aXRpb25XaXRoVG9vbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1VOVEVSX0NGKTsKKyAgICAgICAgaW50IG51bVBhcnRpdGlvbnMgPSAxMDAwOworCisgICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCBudW1QYXJ0aXRpb25zKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIG51bVBhcnRpdGlvbnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKworICAgICAgICBTY3J1YlRlc3Qub3ZlcnJpZGVXaXRoR2FyYmFnZShzc3RhYmxlLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygiMCIpLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygiMSIpLCAoYnl0ZSkgMHg3QSk7CisKKyAgICAgICAgLy8gd2l0aCBza2lwQ29ycnVwdGVkID09IHRydWUsIHRoZSBjb3JydXB0IHJvd3Mgd2lsbCBiZSBza2lwcGVkCisgICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTdGFuZGFsb25lU2NydWJiZXIuY2xhc3MsICItcyIsIGtzTmFtZSwgQ09VTlRFUl9DRik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiMCBlbXB0eSIpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoInBhcnRpdGlvbnMgdGhhdCB3ZXJlIHNraXBwZWQiKTsKKyAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBjZnMuZ2V0TGl2ZVNTVGFibGVzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1NraXBTY3J1YkNvcnJ1cHRlZENvdW50ZXJQYXJ0aXRpb25XaXRoVG9vbCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgV3JpdGVUaW1lb3V0RXhjZXB0aW9uCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDT1VOVEVSX0NGKTsKKyAgICAgICAgaW50IG51bVBhcnRpdGlvbnMgPSAxMDAwOworCisgICAgICAgIGZpbGxDb3VudGVyQ0YoY2ZzLCBudW1QYXJ0aXRpb25zKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIG51bVBhcnRpdGlvbnMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2ZzLmdldExpdmVTU1RhYmxlcygpLnNpemUoKSk7CisgICAgICAgIFNTVGFibGVSZWFkZXIgc3N0YWJsZSA9IGNmcy5nZXRMaXZlU1NUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKKworICAgICAgICAvL3VzZSAweDAwIGluc3RlYWQgb2YgdGhlIHVzdWFsIDB4N0EgYmVjYXVzZSBpZiBieSBhbnkgY2hhbmNlIGl0J3MgYWJsZSB0byBpdGVyYXRlIG92ZXIgdGhlIGNvcnJ1cHQKKyAgICAgICAgLy9zZWN0aW9uLCB0aGVuIHdlIGdldCBtYW55IG91dC1vZi1vcmRlciBlcnJvcnMsIHdoaWNoIHdlIGRvbid0IHdhbnQKKyAgICAgICAgb3ZlcnJpZGVXaXRoR2FyYmFnZShzc3RhYmxlLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygiMCIpLCBCeXRlQnVmZmVyVXRpbC5ieXRlcygiMSIpLCAoYnl0ZSkgMHgwKTsKKworICAgICAgICAvLyB3aXRoIHNraXBDb3JydXB0ZWQgPT0gZmFsc2UsIHRoZSBzY3J1YiBpcyBleHBlY3RlZCB0byBmYWlsCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywga3NOYW1lLCBDT1VOVEVSX0NGKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGEgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24gdG8gYmUgdGhyb3duIik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKElPRXJyb3IgZXJyKQorICAgICAgICB7CisgICAgICAgICAgICBUaHJvd2FibGVzLmFzc2VydEFueUNhdXNlKGVyciwgQ29ycnVwdFNTVGFibGVFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9DaGVja1NjcnViTXVsdGlQYXJ0aXRpb25XaXRoVG9vbCgpCisgICAgeworICAgICAgICBDb2x1bW5GYW1pbHlTdG9yZSBjZnMgPSBrZXlzcGFjZS5nZXRDb2x1bW5GYW1pbHlTdG9yZShDRik7CisKKyAgICAgICAgLy8gaW5zZXJ0IGRhdGEgYW5kIHZlcmlmeSB3ZSBnZXQgaXQgYmFjayB3LyByYW5nZSBxdWVyeQorICAgICAgICBmaWxsQ0YoY2ZzLCAxMCk7CisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxMCk7CisKKyAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywgIi1uIiwga3NOYW1lLCBDRik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiUHJlLXNjcnViIHNzdGFibGVzIHNuYXBzaG90dGVkIGludG8iKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCIxMCBwYXJ0aXRpb25zIGluIG5ldyBzc3RhYmxlIGFuZCAwIGVtcHR5Iik7CisgICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKworICAgICAgICAvLyBjaGVjayBkYXRhIGlzIHN0aWxsIHRoZXJlCisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyRml4VmFsaWRhdGVPbmx5V2l0aFRvb2woKQorICAgIHsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOworCisgICAgICAgIGZpbGxDRihjZnMsIDEpOworICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7CisKKyAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywgIi1lIiwgInZhbGlkYXRlX29ubHkiLCBrc05hbWUsIENGKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJOb3QgY29udGludWluZyB3aXRoIHNjcnViLCBzaW5jZSAnLS1oZWFkZXItZml4IHZhbGlkYXRlLW9ubHknIHdhcyBzcGVjaWZpZWQuIik7CisgICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckZpeFZhbGlkYXRlV2l0aFRvb2woKQorICAgIHsKKyAgICAgICAgQ29sdW1uRmFtaWx5U3RvcmUgY2ZzID0ga2V5c3BhY2UuZ2V0Q29sdW1uRmFtaWx5U3RvcmUoQ0YpOworCisgICAgICAgIGZpbGxDRihjZnMsIDEpOworICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7CisKKyAgICAgICAgVG9vbFJ1bm5lci5Ub29sUmVzdWx0IHRvb2wgPSBUb29sUnVubmVyLmludm9rZUNsYXNzKFN0YW5kYWxvbmVTY3J1YmJlci5jbGFzcywgIi1lIiwgInZhbGlkYXRlIiwga3NOYW1lLCBDRik7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiUHJlLXNjcnViIHNzdGFibGVzIHNuYXBzaG90dGVkIGludG8iKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCIxIHBhcnRpdGlvbnMgaW4gbmV3IHNzdGFibGUgYW5kIDAgZW1wdHkiKTsKKyAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOworICAgICAgICBhc3NlcnRPcmRlcmVkQWxsKGNmcywgMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyRml4Rml4T25seVdpdGhUb29sKCkKKyAgICB7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKKworICAgICAgICBmaWxsQ0YoY2ZzLCAxKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworCisgICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTdGFuZGFsb25lU2NydWJiZXIuY2xhc3MsICItZSIsICJmaXgtb25seSIsIGtzTmFtZSwgQ0YpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIk5vdCBjb250aW51aW5nIHdpdGggc2NydWIsIHNpbmNlICctLWhlYWRlci1maXggZml4LW9ubHknIHdhcyBzcGVjaWZpZWQuIik7CisgICAgICAgIHRvb2wuYXNzZXJ0T25DbGVhbkV4aXQoKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckZpeFdpdGhUb29sKCkKKyAgICB7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKKworICAgICAgICBmaWxsQ0YoY2ZzLCAxKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworCisgICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTdGFuZGFsb25lU2NydWJiZXIuY2xhc3MsICItZSIsICJmaXgiLCBrc05hbWUsIENGKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJQcmUtc2NydWIgc3N0YWJsZXMgc25hcHNob3R0ZWQgaW50byIpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIjEgcGFydGl0aW9ucyBpbiBuZXcgc3N0YWJsZSBhbmQgMCBlbXB0eSIpOworICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJGaXhOb0NoZWNrc1dpdGhUb29sKCkKKyAgICB7CisgICAgICAgIENvbHVtbkZhbWlseVN0b3JlIGNmcyA9IGtleXNwYWNlLmdldENvbHVtbkZhbWlseVN0b3JlKENGKTsKKworICAgICAgICBmaWxsQ0YoY2ZzLCAxKTsKKyAgICAgICAgYXNzZXJ0T3JkZXJlZEFsbChjZnMsIDEpOworCisgICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VDbGFzcyhTdGFuZGFsb25lU2NydWJiZXIuY2xhc3MsICItZSIsICJvZmYiLCBrc05hbWUsIENGKTsKKyAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJQcmUtc2NydWIgc3N0YWJsZXMgc25hcHNob3R0ZWQgaW50byIpOworICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIjEgcGFydGl0aW9ucyBpbiBuZXcgc3N0YWJsZSBhbmQgMCBlbXB0eSIpOworICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CisgICAgICAgIGFzc2VydE9yZGVyZWRBbGwoY2ZzLCAxKTsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEF1dGhDYWNoZUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRBdXRoQ2FjaGVDb25maWdUZXN0LmphdmEKaW5kZXggMmM5MDQ4Ni4uNzkzMjljNiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEF1dGhDYWNoZUNvbmZpZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0QXV0aENhY2hlQ29uZmlnVGVzdC5qYXZhCkBAIC00Miw2ICs0Miw3IEBACiAgICAgewogICAgICAgICBDUUxUZXN0ZXIuc2V0VXBDbGFzcygpOwogICAgICAgICBDUUxUZXN0ZXIucmVxdWlyZUF1dGhlbnRpY2F0aW9uKCk7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCkBAIC0xMTMsMTcgKzExNCwxNyBAQAogICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woInNldGF1dGhjYWNoZWNvbmZpZyIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCJSZXF1aXJlZCBvcHRpb24gJy0tY2FjaGUtbmFtZScgaXMgbWlzc2luZyIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZGVycigpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKIAogICAgICAgICB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgic2V0YXV0aGNhY2hlY29uZmlnIiwgIi0tY2FjaGUtbmFtZSIpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0RXhpdENvZGUoKSkuaXNFcXVhbFRvKDEpOwogICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmlzRXF1YWxUbyh3cmFwQnlEZWZhdWx0Tm9kZXRvb2xNZXNzYWdlKCJSZXF1aXJlZCB2YWx1ZXMgZm9yIG9wdGlvbiAnY2FjaGUtbmFtZScgbm90IHByb3ZpZGVkIikpOwotICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3RkZXJyKCkpLmlzRW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldENsZWFuZWRTdGRlcnIoKSkuaXNFbXB0eSgpOwogCiAgICAgICAgIHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJzZXRhdXRoY2FjaGVjb25maWciLCAiLS1jYWNoZS1uYW1lIiwgIndyb25nIiwgIi0tdmFsaWRpdHktcGVyaW9kIiwgIjEiKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldEV4aXRDb2RlKCkpLmlzRXF1YWxUbygxKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5pc0VxdWFsVG8od3JhcEJ5RGVmYXVsdE5vZGV0b29sTWVzc2FnZSgiVW5rbm93biBjYWNoZSBuYW1lOiB3cm9uZyIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZGVycigpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTMyLDcgKzEzMyw3IEBACiAgICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgic2V0YXV0aGNhY2hlY29uZmlnIiwgIi0tY2FjaGUtbmFtZSIsICJQZXJtaXNzaW9uQ2FjaGUiKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldEV4aXRDb2RlKCkpLmlzRXF1YWxUbygxKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5pc0VxdWFsVG8od3JhcEJ5RGVmYXVsdE5vZGV0b29sTWVzc2FnZSgiQXQgbGVhc3Qgb25lIG9wdGlvbmFsIHBhcmFtZXRlciBuZWVkIHRvIGJlIHBhc3NlZCIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZGVycigpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTQ0LDcgKzE0NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1kaXNhYmxlLWFjdGl2ZS11cGRhdGUiKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldEV4aXRDb2RlKCkpLmlzRXF1YWxUbygxKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5pc0VxdWFsVG8od3JhcEJ5RGVmYXVsdE5vZGV0b29sTWVzc2FnZSgiZW5hYmxlLWFjdGl2ZS11cGRhdGUgYW5kIGRpc2FibGUtYWN0aXZlLXVwZGF0ZSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlciIpKTsKLSAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZGVycigpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRDbGVhbmVkU3RkZXJyKCkpLmlzRW1wdHkoKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEdldENvbHVtbkluZGV4U2l6ZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRDb2x1bW5JbmRleFNpemVUZXN0LmphdmEKaW5kZXggNDBmODJiMC4uMWExOWYwOSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEdldENvbHVtbkluZGV4U2l6ZVRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0Q29sdW1uSW5kZXhTaXplVGVzdC5qYXZhCkBAIC0zNiw2ICszNiw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKICAgICAgICAgc3RhcnRKTVhTZXJ2ZXIoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRDb21wYWN0aW9uVGhyb3VnaHB1dFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRDb21wYWN0aW9uVGhyb3VnaHB1dFRlc3QuamF2YQppbmRleCBkMTVjYzBjLi4yNGVlOWU1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0Q29tcGFjdGlvblRocm91Z2hwdXRUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEdldENvbXBhY3Rpb25UaHJvdWdocHV0VGVzdC5qYXZhCkBAIC0zOCw2ICszOCw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKICAgICAgICAgc3RhcnRKTVhTZXJ2ZXIoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRFbnRpcmVTU1RhYmxlSW50ZXJEQ1N0cmVhbVRocm91Z2hwdXRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0RW50aXJlU1NUYWJsZUludGVyRENTdHJlYW1UaHJvdWdocHV0VGVzdC5qYXZhCmluZGV4IDRhZWEwMTMuLmQ2ZDMyNTMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRFbnRpcmVTU1RhYmxlSW50ZXJEQ1N0cmVhbVRocm91Z2hwdXRUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEdldEVudGlyZVNTVGFibGVJbnRlckRDU3RyZWFtVGhyb3VnaHB1dFRlc3QuamF2YQpAQCAtMzksNiArMzksNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24KICAgICB7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0RW50aXJlU1NUYWJsZVN0cmVhbVRocm91Z2hwdXRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0RW50aXJlU1NUYWJsZVN0cmVhbVRocm91Z2hwdXRUZXN0LmphdmEKaW5kZXggMDI4ZjMyZS4uZjI1MDY5OSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEdldEVudGlyZVNTVGFibGVTdHJlYW1UaHJvdWdocHV0VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRFbnRpcmVTU1RhYmxlU3RyZWFtVGhyb3VnaHB1dFRlc3QuamF2YQpAQCAtMzksNiArMzksNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24KICAgICB7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0SW50ZXJEQ1N0cmVhbVRocm91Z2hwdXRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0SW50ZXJEQ1N0cmVhbVRocm91Z2hwdXRUZXN0LmphdmEKaW5kZXggMGVmNmIyYy4uNmNiYjk0OCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NldEdldEludGVyRENTdHJlYW1UaHJvdWdocHV0VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRJbnRlckRDU3RyZWFtVGhyb3VnaHB1dFRlc3QuamF2YQpAQCAtNDYsNiArNDYsNyBAQAogICAgIEBCZWZvcmVDbGFzcwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24KICAgICB7CisgICAgICAgIHJlcXVpcmVOZXR3b3JrKCk7CiAgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU2V0R2V0U3RyZWFtVGhyb3VnaHB1dFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRTdHJlYW1UaHJvdWdocHV0VGVzdC5qYXZhCmluZGV4IDkxMWUwZGMuLmNmNjg4ZDYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRTdHJlYW1UaHJvdWdocHV0VGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TZXRHZXRTdHJlYW1UaHJvdWdocHV0VGVzdC5qYXZhCkBAIC00Nyw2ICs0Nyw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKICAgICAgICAgc3RhcnRKTVhTZXJ2ZXIoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TbmFwc2hvdFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9TbmFwc2hvdFRlc3QuamF2YQppbmRleCAyZmJhZjk1Li45NzQyOTcyIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvU25hcHNob3RUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1NuYXBzaG90VGVzdC5qYXZhCkBAIC0zNiw2ICszNiw3IEBACiAgICAgQEJlZm9yZUNsYXNzCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKKyAgICAgICAgcmVxdWlyZU5ldHdvcmsoKTsKICAgICAgICAgc3RhcnRKTVhTZXJ2ZXIoKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9UYWJsZVN0YXRzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1RhYmxlU3RhdHNUZXN0LmphdmEKaW5kZXggNTc4YmQ4OC4uNmJhMjE1MSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1RhYmxlU3RhdHNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1RhYmxlU3RhdHNUZXN0LmphdmEKQEAgLTI4LDkgKzI4LDkgQEAKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKLWltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0TWFwcGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ1FMVGVzdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlRvb2xSdW5uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuSnNvblV0aWxzOwogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ZYW1sOwogCiBpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKQEAgLTExMSw3ICsxMTEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG9mZl9oZWFwX21lbW9yeV91c2VkX3RvdGFsLCBwZW5kaW5nX2ZsdXNoZXMsIHBlcmNlbnRfcmVwYWlyZWQsXG4iICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgcmVhZF9sYXRlbmN5LCByZWFkcywgc3BhY2VfdXNlZF9ieV9zbmFwc2hvdHNfdG90YWwsIHNwYWNlX3VzZWRfbGl2ZSxcbiIgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICBzcGFjZV91c2VkX3RvdGFsLCBzc3RhYmxlX2NvbXByZXNzaW9uX3JhdGlvLCBzc3RhYmxlX2NvdW50LFxuIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHRhYmxlX25hbWUsIHdyaXRlX2xhdGVuY3ksIHdyaXRlcylcbiIgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICB0YWJsZV9uYW1lLCB3cml0ZV9sYXRlbmN5LCB3cml0ZXMsIG1heF9zc3RhYmxlX3NpemUsXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICBsb2NhbF9yZWFkX3dyaXRlX3JhdGlvLCB0d2NzX21heF9kdXJhdGlvbilcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgIlxuIiArIAogICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgLXQgPHRvcD4sIC0tdG9wIDx0b3A+XG4iICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgU2hvdyBvbmx5IHRoZSB0b3AgSyB0YWJsZXMgZm9yIHRoZSBzb3J0IGtleSAoc3BlY2lmeSB0aGUgbnVtYmVyIEsgb2ZcbiIgKyAKQEAgLTEzNywxMiArMTM4LDEyIEBACiAgICAgewogICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woInRhYmxlc3RhdHMiKTsKICAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJLZXlzcGFjZSA6IHN5c3RlbV9zY2hlbWEiKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiS2V5c3BhY2U6IHN5c3RlbV9zY2hlbWEiKTsKICAgICAgICAgYXNzZXJ0VGhhdChTdHJpbmdVdGlscy5jb3VudE1hdGNoZXModG9vbC5nZXRTdGRvdXQoKSwgIlRhYmxlOiIpKS5pc0dyZWF0ZXJUaGFuKDEpOwogCiAgICAgICAgIHRvb2wgPSBUb29sUnVubmVyLmludm9rZU5vZGV0b29sKCJ0YWJsZXN0YXRzIiwgInN5c3RlbV9kaXN0cmlidXRlZCIpOwogICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7Ci0gICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIktleXNwYWNlIDogc3lzdGVtX2Rpc3RyaWJ1dGVkIik7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRvdXQoKSkuY29udGFpbnMoIktleXNwYWNlOiBzeXN0ZW1fZGlzdHJpYnV0ZWQiKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5kb2VzTm90Q29udGFpbigiS2V5c3BhY2UgOiBzeXN0ZW1fc2NoZW1hIik7CiAgICAgICAgIGFzc2VydFRoYXQoU3RyaW5nVXRpbHMuY291bnRNYXRjaGVzKHRvb2wuZ2V0U3Rkb3V0KCksICJUYWJsZToiKSkuaXNHcmVhdGVyVGhhbigxKTsKICAgICB9CkBAIC0xNTIsNyArMTUzLDcgQEAKICAgICB7CiAgICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgidGFibGVzdGF0cyIsICItaSIsICJzeXN0ZW1fc2NoZW1hLmFnZ3JlZ2F0ZXMiKTsKICAgICAgICAgdG9vbC5hc3NlcnRPbkNsZWFuRXhpdCgpOwotICAgICAgICBhc3NlcnRUaGF0KHRvb2wuZ2V0U3Rkb3V0KCkpLmNvbnRhaW5zKCJLZXlzcGFjZSA6IHN5c3RlbV9zY2hlbWEiKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5jb250YWlucygiS2V5c3BhY2U6IHN5c3RlbV9zY2hlbWEiKTsKICAgICAgICAgYXNzZXJ0VGhhdCh0b29sLmdldFN0ZG91dCgpKS5kb2VzTm90Q29udGFpbigiVGFibGU6IHN5c3RlbV9zY2hlbWEuYWdncmVnYXRlcyIpOwogICAgICAgICBhc3NlcnRUaGF0KFN0cmluZ1V0aWxzLmNvdW50TWF0Y2hlcyh0b29sLmdldFN0ZG91dCgpLCAiVGFibGU6IikpLmlzR3JlYXRlclRoYW4oMSk7CiAgICAgfQpAQCAtMjM0LDcgKzIzNSw3IEBACiAgICAgICAgICAgICBUb29sUnVubmVyLlRvb2xSZXN1bHQgdG9vbCA9IFRvb2xSdW5uZXIuaW52b2tlTm9kZXRvb2woInRhYmxlc3RhdHMiLCBhcmcsICJqc29uIik7CiAgICAgICAgICAgICB0b29sLmFzc2VydE9uQ2xlYW5FeGl0KCk7CiAgICAgICAgICAgICBTdHJpbmcganNvbiA9IHRvb2wuZ2V0U3Rkb3V0KCk7Ci0gICAgICAgICAgICBhc3NlcnRUaGF0Q29kZSgoKSAtPiBuZXcgT2JqZWN0TWFwcGVyKCkucmVhZFRyZWUoanNvbikpLmRvZXNOb3RUaHJvd0FueUV4Y2VwdGlvbigpOworICAgICAgICAgICAgYXNzZXJ0VGhhdENvZGUoKCkgLT4gSnNvblV0aWxzLkpTT05fT0JKRUNUX01BUFBFUi5yZWFkVHJlZShqc29uKSkuZG9lc05vdFRocm93QW55RXhjZXB0aW9uKCk7CiAgICAgICAgICAgICBhc3NlcnRUaGF0KGpzb24pLmNvbnRhaW5zUGF0dGVybigiXCJzc3RhYmxlX2NvdW50XCJcXHMqOlxccypbMC05XSsiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb250YWluc1BhdHRlcm4oIlwib2xkX3NzdGFibGVfY291bnRcIlxccyo6XFxzKlswLTldKyIpOwogICAgICAgICB9KTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9UcFN0YXRzVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1RwU3RhdHNUZXN0LmphdmEKaW5kZXggMTI0ZjI5Ny4uZTk1NDhmYiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1RwU3RhdHNUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL1RwU3RhdHNUZXN0LmphdmEKQEAgLTI5LDEzICsyOSwxMyBAQAogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2luZ1NlcnZpY2U7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk5vUGF5bG9hZDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ub29sUnVubmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkZCVXRpbGl0aWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKIGltcG9ydCBvcmcueWFtbC5zbmFrZXlhbWwuWWFtbDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuVmVyYi5FQ0hPX1JFUTsKQEAgLTE2Myw4ICsxNjMsNyBAQAogICAgIHsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIE9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7Ci0gICAgICAgICAgICBtYXBwZXIucmVhZFRyZWUoc3RyKTsKKyAgICAgICAgICAgIEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVIucmVhZFRyZWUoc3RyKTsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgICAgIGNhdGNoKElPRXhjZXB0aW9uIGUpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvVW5pbml0aWFsaXplZFNlcnZlclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9VbmluaXRpYWxpemVkU2VydmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZGQyNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvVW5pbml0aWFsaXplZFNlcnZlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLm5vZGV0b29sOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxUZXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudG9vbHMuVG9vbFJ1bm5lcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CisKK3B1YmxpYyBjbGFzcyBVbmluaXRpYWxpemVkU2VydmVyVGVzdCBleHRlbmRzIENRTFRlc3RlcgoreworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHN0YXJ0Sk1YU2VydmVyKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pbnRpYWxpemVkU2VydmVyKCkKKyAgICB7CisgICAgICAgIC8vIENBU1NBTkRSQS0xMTUzNworICAgICAgICAvLyBmYWlscywgbm90IGZpbmlzaGVkIGluaXRpYWxpemluZyBub2RlIGJlY2F1c2UgdGVzdCBuZXZlciBjYWxscyByZXF1aXJlTmV0d29yaygpCisgICAgICAgIFRvb2xSdW5uZXIuVG9vbFJlc3VsdCB0b29sID0gVG9vbFJ1bm5lci5pbnZva2VOb2RldG9vbCgic3RhdHVzIik7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbik7CisgICAgICAgIGFzc2VydFRoYXQodG9vbC5nZXRTdGRlcnIoKS5jb250YWlucygiU2VydmVyIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQsIGNhbm5vdCBydW4gbm9kZXRvb2wuIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9TdGF0c1RhYmxlQ29tcGFyYXRvclRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9TdGF0c1RhYmxlQ29tcGFyYXRvclRlc3QuamF2YQppbmRleCBlYTQ5ODk5Li4xNzEwMzk1IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvU3RhdHNUYWJsZUNvbXBhcmF0b3JUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1N0YXRzVGFibGVDb21wYXJhdG9yVGVzdC5qYXZhCkBAIC0yMTIsNiArMjEyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICJ0YWJsZTEgPiB0YWJsZTMgPiB0YWJsZTUgPiB0YWJsZTIgPiB0YWJsZTQgPiB0YWJsZTYiLAogICAgICAgICAgICAgICAgICAgICAgICBodW1hblJlYWRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICBhc2NlbmRpbmcpOworICAgICAgICBydW5Db21wYXJlVGVzdCh0ZXN0VGFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAidHdjc19tYXhfZHVyYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAidGFibGUyID4gdGFibGU0ID4gdGFibGUxID4gdGFibGUzID4gdGFibGU2ID4gdGFibGU1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgaHVtYW5SZWFkYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYXNjZW5kaW5nKTsKICAgICB9CiAKICAgICBAVGVzdApkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNQcmludGVyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNQcmludGVyVGVzdC5qYXZhCmluZGV4IDgxNjg3YmEuLjBkZGVmOWUgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9UYWJsZVN0YXRzUHJpbnRlclRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvVGFibGVTdGF0c1ByaW50ZXJUZXN0LmphdmEKQEAgLTIyLDEzICsyMiwxNiBAQAogaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5Kc29uVXRpbHM7CiBpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogCiBwdWJsaWMgY2xhc3MgVGFibGVTdGF0c1ByaW50ZXJUZXN0IGV4dGVuZHMgVGFibGVTdGF0c1Rlc3RCYXNlCiB7CkBAIC0zNiwxMCArMzksMTEgQEAKICAgICAgICAgIlx0VGFibGU6ICVzXG4iICsKICAgICAgICAgIlx0U1NUYWJsZSBjb3VudDogNjAwMDBcbiIgKwogICAgICAgICAiXHRPbGQgU1NUYWJsZSBjb3VudDogMFxuIiArCisgICAgICAgICJcdE1heCBTU1RhYmxlIHNpemU6IDAuMDAwS2lCXG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCAobGl2ZSk6IDBcbiIgKwogICAgICAgICAiXHRTcGFjZSB1c2VkICh0b3RhbCk6IDkwMDFcbiIgKwogICAgICAgICAiXHRTcGFjZSB1c2VkIGJ5IHNuYXBzaG90cyAodG90YWwpOiAxMTExXG4iICsKLSAgICAgICAgIlx0U1NUYWJsZSBDb21wcmVzc2lvbiBSYXRpbzogMC42OFxuIiArCisgICAgICAgICJcdFNTVGFibGUgQ29tcHJlc3Npb24gUmF0aW86IDAuNjgwMDBcbiIgKwogICAgICAgICAiXHROdW1iZXIgb2YgcGFydGl0aW9ucyAoZXN0aW1hdGUpOiAxMTExMTFcbiIgKwogICAgICAgICAiXHRNZW10YWJsZSBjZWxsIGNvdW50OiAxMTFcbiIgKwogICAgICAgICAiXHRNZW10YWJsZSBkYXRhIHNpemU6IDBcbiIgKwpAQCAtNDgsNiArNTIsNyBAQAogICAgICAgICAiXHRMb2NhbCByZWFkIGxhdGVuY3k6IDIuMDAwIG1zXG4iICsKICAgICAgICAgIlx0TG9jYWwgd3JpdGUgY291bnQ6IDVcbiIgKwogICAgICAgICAiXHRMb2NhbCB3cml0ZSBsYXRlbmN5OiAwLjA1MCBtc1xuIiArCisgICAgICAgICJcdExvY2FsIHJlYWQvd3JpdGUgcmF0aW86IDAuMDAwMDBcbiIgKwogICAgICAgICAiXHRQZW5kaW5nIGZsdXNoZXM6IDExMTExXG4iICsKICAgICAgICAgIlx0UGVyY2VudCByZXBhaXJlZDogMTAwLjBcbiIgKwogICAgICAgICAiXHRCeXRlcyByZXBhaXJlZDogMC4wMDBLaUJcbiIgKwpAQCAtNzEsMTEgKzc2LDEyIEBACiAgICAgICAgICJcdFRhYmxlOiAlc1xuIiArCiAgICAgICAgICJcdFNTVGFibGUgY291bnQ6IDMwMDBcbiIgKwogICAgICAgICAiXHRPbGQgU1NUYWJsZSBjb3VudDogMFxuIiArCisgICAgICAgICJcdE1heCBTU1RhYmxlIHNpemU6IDAuMDAwS2lCXG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCAobGl2ZSk6IDIyXG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCAodG90YWwpOiAxMDI0XG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCBieSBzbmFwc2hvdHMgKHRvdGFsKTogMjIyXG4iICsKICAgICAgICAgIlx0T2ZmIGhlYXAgbWVtb3J5IHVzZWQgKHRvdGFsKTogMzE0MTU5MzY3XG4iICsKLSAgICAgICAgIlx0U1NUYWJsZSBDb21wcmVzc2lvbiBSYXRpbzogMC42OFxuIiArCisgICAgICAgICJcdFNTVGFibGUgQ29tcHJlc3Npb24gUmF0aW86IDAuNjgwMDBcbiIgKwogICAgICAgICAiXHROdW1iZXIgb2YgcGFydGl0aW9ucyAoZXN0aW1hdGUpOiAyMjIyMlxuIiArCiAgICAgICAgICJcdE1lbXRhYmxlIGNlbGwgY291bnQ6IDIyXG4iICsKICAgICAgICAgIlx0TWVtdGFibGUgZGF0YSBzaXplOiA5MDBcbiIgKwpAQCAtODUsNiArOTEsNyBAQAogICAgICAgICAiXHRMb2NhbCByZWFkIGxhdGVuY3k6IDMuMDAwIG1zXG4iICsKICAgICAgICAgIlx0TG9jYWwgd3JpdGUgY291bnQ6IDRcbiIgKwogICAgICAgICAiXHRMb2NhbCB3cml0ZSBsYXRlbmN5OiAwLjAwMCBtc1xuIiArCisgICAgICAgICJcdExvY2FsIHJlYWQvd3JpdGUgcmF0aW86IDAuMDAwMDBcbiIgKwogICAgICAgICAiXHRQZW5kaW5nIGZsdXNoZXM6IDIyMjIyMlxuIiArCiAgICAgICAgICJcdFBlcmNlbnQgcmVwYWlyZWQ6IDk5LjlcbiIgKwogICAgICAgICAiXHRCeXRlcyByZXBhaXJlZDogMC4wMDBLaUJcbiIgKwpAQCAtMTExLDEwICsxMTgsMTEgQEAKICAgICAgICAgIlx0VGFibGU6ICVzXG4iICsKICAgICAgICAgIlx0U1NUYWJsZSBjb3VudDogNTAwMDBcbiIgKwogICAgICAgICAiXHRPbGQgU1NUYWJsZSBjb3VudDogMFxuIiArCisgICAgICAgICJcdE1heCBTU1RhYmxlIHNpemU6IDAuMDAwS2lCXG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCAobGl2ZSk6IDBcbiIgKwogICAgICAgICAiXHRTcGFjZSB1c2VkICh0b3RhbCk6IDUxMlxuIiArCiAgICAgICAgICJcdFNwYWNlIHVzZWQgYnkgc25hcHNob3RzICh0b3RhbCk6IDBcbiIgKwotICAgICAgICAiXHRTU1RhYmxlIENvbXByZXNzaW9uIFJhdGlvOiAwLjMyXG4iICsKKyAgICAgICAgIlx0U1NUYWJsZSBDb21wcmVzc2lvbiBSYXRpbzogMC4zMjAwMFxuIiArCiAgICAgICAgICJcdE51bWJlciBvZiBwYXJ0aXRpb25zIChlc3RpbWF0ZSk6IDMzMzNcbiIgKwogICAgICAgICAiXHRNZW10YWJsZSBjZWxsIGNvdW50OiAzMzMzMzNcbiIgKwogICAgICAgICAiXHRNZW10YWJsZSBkYXRhIHNpemU6IDE5OTlcbiIgKwpAQCAtMTIzLDYgKzEzMSw3IEBACiAgICAgICAgICJcdExvY2FsIHJlYWQgbGF0ZW5jeTogNC4wMDAgbXNcbiIgKwogICAgICAgICAiXHRMb2NhbCB3cml0ZSBjb3VudDogM1xuIiArCiAgICAgICAgICJcdExvY2FsIHdyaXRlIGxhdGVuY3k6IE5hTiBtc1xuIiArCisgICAgICAgICJcdExvY2FsIHJlYWQvd3JpdGUgcmF0aW86IDAuMDAwMDBcbiIgKwogICAgICAgICAiXHRQZW5kaW5nIGZsdXNoZXM6IDMzM1xuIiArCiAgICAgICAgICJcdFBlcmNlbnQgcmVwYWlyZWQ6IDk5LjhcbiIgKwogICAgICAgICAiXHRCeXRlcyByZXBhaXJlZDogMC4wMDBLaUJcbiIgKwpAQCAtMTQ2LDExICsxNTUsMTIgQEAKICAgICAgICAgIlx0VGFibGU6ICVzXG4iICsKICAgICAgICAgIlx0U1NUYWJsZSBjb3VudDogMjAwMFxuIiArCiAgICAgICAgICJcdE9sZCBTU1RhYmxlIGNvdW50OiAwXG4iICsKKyAgICAgICAgIlx0TWF4IFNTVGFibGUgc2l6ZTogMC4wMDBLaUJcbiIgKwogICAgICAgICAiXHRTcGFjZSB1c2VkIChsaXZlKTogNDQ0NFxuIiArCiAgICAgICAgICJcdFNwYWNlIHVzZWQgKHRvdGFsKTogMjU2XG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCBieSBzbmFwc2hvdHMgKHRvdGFsKTogNDRcbiIgKwogICAgICAgICAiXHRPZmYgaGVhcCBtZW1vcnkgdXNlZCAodG90YWwpOiA0NDEyMTM4MThcbiIgKwotICAgICAgICAiXHRTU1RhYmxlIENvbXByZXNzaW9uIFJhdGlvOiAwLjk1XG4iICsKKyAgICAgICAgIlx0U1NUYWJsZSBDb21wcmVzc2lvbiBSYXRpbzogMC45NTAwMFxuIiArCiAgICAgICAgICJcdE51bWJlciBvZiBwYXJ0aXRpb25zIChlc3RpbWF0ZSk6IDQ0NFxuIiArCiAgICAgICAgICJcdE1lbXRhYmxlIGNlbGwgY291bnQ6IDRcbiIgKwogICAgICAgICAiXHRNZW10YWJsZSBkYXRhIHNpemU6IDMwMDBcbiIgKwpAQCAtMTYwLDYgKzE3MCw3IEBACiAgICAgICAgICJcdExvY2FsIHJlYWQgbGF0ZW5jeTogTmFOIG1zXG4iICsKICAgICAgICAgIlx0TG9jYWwgd3JpdGUgY291bnQ6IDJcbiIgKwogICAgICAgICAiXHRMb2NhbCB3cml0ZSBsYXRlbmN5OiAyLjAwMCBtc1xuIiArCisgICAgICAgICJcdExvY2FsIHJlYWQvd3JpdGUgcmF0aW86IDAuMDAwMDBcbiIgKwogICAgICAgICAiXHRQZW5kaW5nIGZsdXNoZXM6IDQ0NDRcbiIgKwogICAgICAgICAiXHRQZXJjZW50IHJlcGFpcmVkOiA1MC4wXG4iICsKICAgICAgICAgIlx0Qnl0ZXMgcmVwYWlyZWQ6IDAuMDAwS2lCXG4iICsKQEAgLTE4NiwxMCArMTk3LDExIEBACiAgICAgICAgICJcdFRhYmxlOiAlc1xuIiArCiAgICAgICAgICJcdFNTVGFibGUgY291bnQ6IDQwMDAwXG4iICsKICAgICAgICAgIlx0T2xkIFNTVGFibGUgY291bnQ6IDBcbiIgKworICAgICAgICAiXHRNYXggU1NUYWJsZSBzaXplOiAwLjAwMEtpQlxuIiArCiAgICAgICAgICJcdFNwYWNlIHVzZWQgKGxpdmUpOiA1NTU1NVxuIiArCiAgICAgICAgICJcdFNwYWNlIHVzZWQgKHRvdGFsKTogNjRcbiIgKwogICAgICAgICAiXHRTcGFjZSB1c2VkIGJ5IHNuYXBzaG90cyAodG90YWwpOiA1NTU1NVxuIiArCi0gICAgICAgICJcdFNTVGFibGUgQ29tcHJlc3Npb24gUmF0aW86IDAuOTlcbiIgKworICAgICAgICAiXHRTU1RhYmxlIENvbXByZXNzaW9uIFJhdGlvOiAwLjk5MDAwXG4iICsKICAgICAgICAgIlx0TnVtYmVyIG9mIHBhcnRpdGlvbnMgKGVzdGltYXRlKTogNTVcbiIgKwogICAgICAgICAiXHRNZW10YWJsZSBjZWxsIGNvdW50OiA1NTU1NVxuIiArCiAgICAgICAgICJcdE1lbXRhYmxlIGRhdGEgc2l6ZTogMjAwMDBcbiIgKwpAQCAtMTk4LDYgKzIxMCw3IEBACiAgICAgICAgICJcdExvY2FsIHJlYWQgbGF0ZW5jeTogMC4wMDAgbXNcbiIgKwogICAgICAgICAiXHRMb2NhbCB3cml0ZSBjb3VudDogMVxuIiArCiAgICAgICAgICJcdExvY2FsIHdyaXRlIGxhdGVuY3k6IDEuMDAwIG1zXG4iICsKKyAgICAgICAgIlx0TG9jYWwgcmVhZC93cml0ZSByYXRpbzogMC4wMDAwMFxuIiArCiAgICAgICAgICJcdFBlbmRpbmcgZmx1c2hlczogNVxuIiArCiAgICAgICAgICJcdFBlcmNlbnQgcmVwYWlyZWQ6IDkzLjBcbiIgKwogICAgICAgICAiXHRCeXRlcyByZXBhaXJlZDogMC4wMDBLaUJcbiIgKwpAQCAtMjIxLDExICsyMzQsMTIgQEAKICAgICAgICAgIlx0VGFibGU6ICVzXG4iICsKICAgICAgICAgIlx0U1NUYWJsZSBjb3VudDogMTAwMFxuIiArCiAgICAgICAgICJcdE9sZCBTU1RhYmxlIGNvdW50OiAwXG4iICsKKyAgICAgICAgIlx0TWF4IFNTVGFibGUgc2l6ZTogMC4wMDBLaUJcbiIgKwogICAgICAgICAiXHRTcGFjZSB1c2VkIChsaXZlKTogNjY2NjY2XG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCAodG90YWwpOiAwXG4iICsKICAgICAgICAgIlx0U3BhY2UgdXNlZCBieSBzbmFwc2hvdHMgKHRvdGFsKTogMFxuIiArCiAgICAgICAgICJcdE9mZiBoZWFwIG1lbW9yeSB1c2VkICh0b3RhbCk6IDE2MjQ3MDgxMFxuIiArCi0gICAgICAgICJcdFNTVGFibGUgQ29tcHJlc3Npb24gUmF0aW86IDAuNjhcbiIgKworICAgICAgICAiXHRTU1RhYmxlIENvbXByZXNzaW9uIFJhdGlvOiAwLjY4MDAwXG4iICsKICAgICAgICAgIlx0TnVtYmVyIG9mIHBhcnRpdGlvbnMgKGVzdGltYXRlKTogNlxuIiArCiAgICAgICAgICJcdE1lbXRhYmxlIGNlbGwgY291bnQ6IDY2NjZcbiIgKwogICAgICAgICAiXHRNZW10YWJsZSBkYXRhIHNpemU6IDEwMDAwMDBcbiIgKwpAQCAtMjM1LDYgKzI0OSw3IEBACiAgICAgICAgICJcdExvY2FsIHJlYWQgbGF0ZW5jeTogMS4wMDAgbXNcbiIgKwogICAgICAgICAiXHRMb2NhbCB3cml0ZSBjb3VudDogMFxuIiArCiAgICAgICAgICJcdExvY2FsIHdyaXRlIGxhdGVuY3k6IDAuNTAwIG1zXG4iICsKKyAgICAgICAgIlx0TG9jYWwgcmVhZC93cml0ZSByYXRpbzogMC4wMDAwMFxuIiArCiAgICAgICAgICJcdFBlbmRpbmcgZmx1c2hlczogNjZcbiIgKwogICAgICAgICAiXHRQZXJjZW50IHJlcGFpcmVkOiAwLjBcbiIgKwogICAgICAgICAiXHRCeXRlcyByZXBhaXJlZDogMC4wMDBLaUJcbiIgKwpAQCAtMjYzLDkgKzI3OCw5IEBACiAgICAgICogd2l0aG91dCBsZWFraW5nIHRlc3QgaW1wbGVtZW50YXRpb24gaW50byB0aGUgVGFibGVTdGF0c0hvbGRlciBpbXBsZW1lbnRhdGlvbi4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBleHBlY3RlZERlZmF1bHRQcmludGVyT3V0cHV0ID0KLSAgICAgICAgIlRvdGFsIG51bWJlciBvZiB0YWJsZXM6IDBcbiIgKworICAgICAgICAiVG90YWwgbnVtYmVyIG9mIHRhYmxlczogNlxuIiArCiAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tXG4iICsKLSAgICAgICAgIktleXNwYWNlIDoga2V5c3BhY2UxXG4iICsKKyAgICAgICAgIktleXNwYWNlOiBrZXlzcGFjZTFcbiIgKwogICAgICAgICAiXHRSZWFkIENvdW50OiAzXG4iICsKICAgICAgICAgIlx0UmVhZCBMYXRlbmN5OiAwLjAgbXNcbiIgKwogICAgICAgICAiXHRXcml0ZSBDb3VudDogMTJcbiIgKwpAQCAtMjc1LDcgKzI5MCw3IEBACiAgICAgICAgIFN0cmluZy5mb3JtYXQoZHVwbGljYXRlVGFicyhleHBlY3RlZERlZmF1bHRUYWJsZTJPdXRwdXQpLCAidGFibGUyIikgKwogICAgICAgICBTdHJpbmcuZm9ybWF0KGR1cGxpY2F0ZVRhYnMoZXhwZWN0ZWREZWZhdWx0VGFibGUzT3V0cHV0KSwgInRhYmxlMyIpICsKICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS1cbiIgKwotICAgICAgICAiS2V5c3BhY2UgOiBrZXlzcGFjZTJcbiIgKworICAgICAgICAiS2V5c3BhY2U6IGtleXNwYWNlMlxuIiArCiAgICAgICAgICJcdFJlYWQgQ291bnQ6IDdcbiIgKwogICAgICAgICAiXHRSZWFkIExhdGVuY3k6IDAuMCBtc1xuIiArCiAgICAgICAgICJcdFdyaXRlIENvdW50OiAzXG4iICsKQEAgLTI4NCw3ICsyOTksNyBAQAogICAgICAgICBTdHJpbmcuZm9ybWF0KGR1cGxpY2F0ZVRhYnMoZXhwZWN0ZWREZWZhdWx0VGFibGU0T3V0cHV0KSwgInRhYmxlNCIpICsKICAgICAgICAgU3RyaW5nLmZvcm1hdChkdXBsaWNhdGVUYWJzKGV4cGVjdGVkRGVmYXVsdFRhYmxlNU91dHB1dCksICJ0YWJsZTUiKSArCiAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tXG4iICsKLSAgICAgICAgIktleXNwYWNlIDoga2V5c3BhY2UzXG4iICsKKyAgICAgICAgIktleXNwYWNlOiBrZXlzcGFjZTNcbiIgKwogICAgICAgICAiXHRSZWFkIENvdW50OiA1XG4iICsKICAgICAgICAgIlx0UmVhZCBMYXRlbmN5OiAwLjAgbXNcbiIgKwogICAgICAgICAiXHRXcml0ZSBDb3VudDogMFxuIiArCkBAIC0zNDEsNyArMzU2LDggQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UHJpbnRlcigpIHRocm93cyBFeGNlcHRpb24KICAgICB7Ci0gICAgICAgIFN0YXRzSG9sZGVyIGhvbGRlciA9IG5ldyBUZXN0VGFibGVTdGF0c0hvbGRlcih0ZXN0S2V5c3BhY2VzLCAiIiwgMCk7CisgICAgICAgIFRlc3RUYWJsZVN0YXRzSG9sZGVyIGhvbGRlciA9IG5ldyBUZXN0VGFibGVTdGF0c0hvbGRlcih0ZXN0S2V5c3BhY2VzLCAiIiwgMCk7CisgICAgICAgIGhvbGRlci5udW1iZXJPZlRhYmxlcyA9IHRlc3RLZXlzcGFjZXMuc3RyZWFtKCkubWFwKGtzIC0+IGtzLnRhYmxlcy5zaXplKCkpLm1hcFRvSW50KEludGVnZXI6OmludFZhbHVlKS5zdW0oKTsKICAgICAgICAgU3RhdHNQcmludGVyPFN0YXRzSG9sZGVyPiBwcmludGVyID0gVGFibGVTdGF0c1ByaW50ZXIuZnJvbSgiIiwgZmFsc2UpOwogICAgICAgICB0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlU3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKQogICAgICAgICB7CkBAIC0zOTMsMTIgKzQwOSwxMyBAQAogICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGJ5dGVTdHJlYW0udG9TdHJpbmcoKSkKICAgICAgICAgICAgICAgICAgICAgICAuaXNFcXVhbFRvKCJ7XG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIFwia2V5c3BhY2UzXCIgOiB7XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgXCJ3cml0ZV9sYXRlbmN5X21zXCIgOiBcIk5hTlwiLFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIFwid3JpdGVfbGF0ZW5jeV9tc1wiIDogbnVsbCxcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBcInRhYmxlc1wiIDoge1xuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgXCJ0YWJsZTZcIiA6IHtcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgXCJhdmVyYWdlX3RvbWJzdG9uZXNfcGVyX3NsaWNlX2xhc3RfZml2ZV9taW51dGVzXCIgOiA2LjAsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIFwidG9wX3RvbWJzdG9uZV9wYXJ0aXRpb25zXCIgOiBudWxsLFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcImJsb29tX2ZpbHRlcl9vZmZfaGVhcF9tZW1vcnlfdXNlZFwiIDogXCI2Njc0MDhcIixcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgXCJ0d2NzXCIgOiBudWxsLFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcImJ5dGVzX3BlbmRpbmdfcmVwYWlyXCIgOiAwLFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcIm1lbXRhYmxlX3N3aXRjaF9jb3VudFwiIDogNixcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgXCJtYXhpbXVtX3RvbWJzdG9uZXNfcGVyX3NsaWNlX2xhc3RfZml2ZV9taW51dGVzXCIgOiA2LFxuIiArCkBAIC00MTIsNiArNDI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIFwiY29tcGFjdGVkX3BhcnRpdGlvbl9taW5pbXVtX2J5dGVzXCIgOiA2LFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcImxvY2FsX3JlYWRfY291bnRcIiA6IDUsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIFwic3N0YWJsZV9jb21wcmVzc2lvbl9yYXRpb1wiIDogMC42OCxcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgXCJtYXhfc3N0YWJsZV9zaXplXCIgOiAwLFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcImRyb3BwZWRfbXV0YXRpb25zXCIgOiBcIjY2NjY2NlwiLFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcInRvcF9zaXplX3BhcnRpdGlvbnNcIiA6IG51bGwsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIFwiYmxvb21fZmlsdGVyX2ZhbHNlX3Bvc2l0aXZlc1wiIDogNDAwLFxuIiArCkBAIC00MjYsNiArNDQ0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIFwibG9jYWxfd3JpdGVfY291bnRcIiA6IDAsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIFwiZHJvcHBhYmxlX3RvbWJzdG9uZV9yYXRpb1wiIDogXCIwLjY2NjY3XCIsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIFwiY29tcHJlc3Npb25fbWV0YWRhdGFfb2ZmX2hlYXBfbWVtb3J5X3VzZWRcIiA6IFwiMVwiLFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcImxvY2FsX3JlYWRfd3JpdGVfcmF0aW9cIiA6IFwiMC4wMDAwMFwiLFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcIm51bWJlcl9vZl9wYXJ0aXRpb25zX2VzdGltYXRlXCIgOiA2LFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcImJ5dGVzX3JlcGFpcmVkXCIgOiAwLFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBcIm1heGltdW1fbGl2ZV9jZWxsc19wZXJfc2xpY2VfbGFzdF9maXZlX21pbnV0ZXNcIiA6IDIsXG4iICsKQEAgLTQ2NSw2ICs0ODQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIGF2ZXJhZ2VfdG9tYnN0b25lc19wZXJfc2xpY2VfbGFzdF9maXZlX21pbnV0ZXM6IDYuMFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgdG9wX3RvbWJzdG9uZV9wYXJ0aXRpb25zOiBudWxsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBibG9vbV9maWx0ZXJfb2ZmX2hlYXBfbWVtb3J5X3VzZWQ6ICc2Njc0MDgnXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICB0d2NzOiBudWxsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBieXRlc19wZW5kaW5nX3JlcGFpcjogMFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVtdGFibGVfc3dpdGNoX2NvdW50OiA2XG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBtYXhpbXVtX3RvbWJzdG9uZXNfcGVyX3NsaWNlX2xhc3RfZml2ZV9taW51dGVzOiA2XG4iICsKQEAgLTQ3OCw2ICs0OTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIGNvbXBhY3RlZF9wYXJ0aXRpb25fbWluaW11bV9ieXRlczogNlxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbG9jYWxfcmVhZF9jb3VudDogNVxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgc3N0YWJsZV9jb21wcmVzc2lvbl9yYXRpbzogMC42OFxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbWF4X3NzdGFibGVfc2l6ZTogMFxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgZHJvcHBlZF9tdXRhdGlvbnM6ICc2NjY2NjYnXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICB0b3Bfc2l6ZV9wYXJ0aXRpb25zOiBudWxsXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBibG9vbV9maWx0ZXJfZmFsc2VfcG9zaXRpdmVzOiA0MDBcbiIgKwpAQCAtNDkyLDYgKzUxMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbG9jYWxfd3JpdGVfY291bnQ6IDBcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIGRyb3BwYWJsZV90b21ic3RvbmVfcmF0aW86ICcwLjY2NjY3J1xuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgY29tcHJlc3Npb25fbWV0YWRhdGFfb2ZmX2hlYXBfbWVtb3J5X3VzZWQ6ICcxJ1xuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbG9jYWxfcmVhZF93cml0ZV9yYXRpbzogJzAuMDAwMDAnXG4iICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBudW1iZXJfb2ZfcGFydGl0aW9uc19lc3RpbWF0ZTogNlxuIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgYnl0ZXNfcmVwYWlyZWQ6IDBcbiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1heGltdW1fbGl2ZV9jZWxsc19wZXJfc2xpY2VfbGFzdF9maXZlX21pbnV0ZXM6IDJcbiIgKwpAQCAtNTEyLDYgKzUzNCw2MSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvblByaW50ZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgZmluYWwgU3RhdHNQcmludGVyPFN0YXRzSG9sZGVyPiBwcmludGVyID0gVGFibGVTdGF0c1ByaW50ZXIuZnJvbSgianNvbiIsIGZhbHNlKTsKKyAgICAgICAgU3RhdHNIb2xkZXIgaG9sZGVyID0gbmV3IFRlc3RUYWJsZVN0YXRzSG9sZGVyKHRlc3RLZXlzcGFjZXMsICJyZWFkcyIsIDApOworICAgICAgICB0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlU3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGVyLnByaW50KGhvbGRlciwgbmV3IFByaW50U3RyZWFtKGJ5dGVTdHJlYW0pKTsKKyAgICAgICAgICAgIGJ5dGVbXSBqc29uID0gYnl0ZVN0cmVhbS50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHQgPSBKc29uVXRpbHMuZnJvbUpzb25NYXAoanNvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0LnJlbW92ZSgidG90YWxfbnVtYmVyX29mX3RhYmxlcyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg2LCByZXN1bHQuc2l6ZSgpKTsKKworICAgICAgICAgICAgLy8gT25lIHJlbGF0aXZlbHkgZWFzeSB3YXkgdG8gdmVyaWZ5IHNlcmlhbGl6YXRpb24gaXMgdG8gY2hlY2sgY29udmVydGVkLXRvLU1hcAorICAgICAgICAgICAgLy8gaW50ZXJtZWRpYXRlIGZvcm0gYW5kIHJvdW5kLXRyaXAgKHNlcmlhbGl6ZS1kZXNlcmlhbGl6ZSkgZm9yIGVxdWl2YWxlbmNlLgorICAgICAgICAgICAgLy8gQnV0IHRoZXJlIGFyZSBjb3VwbGUgb2YgbWlub3IgZ290Y2hhcyB0byBjb25zaWRlcgorCisgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGV4cGVjdGVkRGF0YSA9IGhvbGRlci5jb252ZXJ0Mk1hcCgpOworICAgICAgICAgICAgZXhwZWN0ZWREYXRhLnJlbW92ZSgidG90YWxfbnVtYmVyX29mX3RhYmxlcyIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIGV4cGVjdGVkRGF0YS5zaXplKCkpOworCisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gZW50cnkgOiByZXN1bHQuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGV4cFRhYmxlID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIGV4cGVjdGVkRGF0YS5nZXQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gYWN0dWFsVGFibGUgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgZW50cnkuZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBUYWJsZS5zaXplKCksIGFjdHVhbFRhYmxlLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gdGFibGVFbnRyeSA6IGFjdHVhbFRhYmxlLmVudHJ5U2V0KCkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgZXhwVmFsdWUgPSBleHBUYWJsZS5nZXQodGFibGVFbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCBhY3R1YWxWYWx1ZSA9IHRhYmxlRW50cnkuZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBTb21lIGRpZmZlcmVuY2VzIHRvIGV4cGVjdDogTG9uZyB0aGF0IGZpdHMgaW4gSW50ZWdlciBtYXkgZ2V0IGRlc2VyaWFsaXplZCBhcyBsYXR0ZXI6CisgICAgICAgICAgICAgICAgICAgIGlmIChleHBWYWx1ZSBpbnN0YW5jZW9mIExvbmcgJiYgYWN0dWFsVmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxWYWx1ZSA9ICgoTnVtYmVyKSBhY3R1YWxWYWx1ZSkubG9uZ1ZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBBbmQgdGhlbiBhIGJpdCBtb3JlIGV4b3RpYyBjYXNlOiBOb3QtYS1OdW1iZXJzIHNob3VsZCBiZSBjb2VyY2VkIGludG8gbnVsbHMKKyAgICAgICAgICAgICAgICAgICAgLy8gKGV4aXN0aW5nIGJlaGF2aW9yIGFzIG9mIDQuMC4wKQorICAgICAgICAgICAgICAgICAgICBpZiAoZXhwVmFsdWUgaW5zdGFuY2VvZiBEb3VibGUgJiYgIURvdWJsZS5pc0Zpbml0ZSgoRG91YmxlKSBleHBWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIkVudHJ5ICciICsgdGFibGVFbnRyeS5nZXRLZXkoKSArICInIG9mIHRhYmxlICciICsgZW50cnkuZ2V0S2V5KCkgKyAiJyBzaG91bGQgYmUgY29lcmNlZCBmcm9tIE5hTiB0byBudWxsOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiRW50cnkgJyIgKyB0YWJsZUVudHJ5LmdldEtleSgpICsgIicgb2YgdGFibGUgJyIgKyBlbnRyeS5nZXRLZXkoKSArICInIGRvZXMgbm90IG1hdGNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cFZhbHVlLCBhY3R1YWxWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKICAgICAvKioKICAgICAgKiBBIHRlc3QgdmVyc2lvbiBvZiBUYWJsZVN0YXRzSG9sZGVyIHRvIGhvbGQgYSB0ZXN0IHZlY3RvciBpbnN0ZWFkIG9mIGdhdGhlcmluZyBzdGF0cyBmcm9tIGEgbGl2ZSBjbHVzdGVyLgogICAgICAqLwpAQCAtNTMxLDUgKzYwOCw0IEBACiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNUZXN0QmFzZS5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3Rvb2xzL25vZGV0b29sL3N0YXRzL1RhYmxlU3RhdHNUZXN0QmFzZS5qYXZhCmluZGV4IDhlZjBlYTMuLmFiNDljNmYgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90b29scy9ub2RldG9vbC9zdGF0cy9UYWJsZVN0YXRzVGVzdEJhc2UuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdG9vbHMvbm9kZXRvb2wvc3RhdHMvVGFibGVTdGF0c1Rlc3RCYXNlLmphdmEKQEAgLTcxLDYgKzcxLDcgQEAKICAgICAgICAgdGVtcGxhdGUub2xkU1NUYWJsZUNvdW50ID0gMEw7CiAgICAgICAgIHRlbXBsYXRlLnNwYWNlVXNlZExpdmUgPSAiMCI7CiAgICAgICAgIHRlbXBsYXRlLnNwYWNlVXNlZFRvdGFsID0gIjAiOworICAgICAgICB0ZW1wbGF0ZS5tYXhTU1RhYmxlU2l6ZSA9IDBMOwogICAgICAgICB0ZW1wbGF0ZS5zcGFjZVVzZWRCeVNuYXBzaG90c1RvdGFsID0gIjAiOwogICAgICAgICB0ZW1wbGF0ZS5wZXJjZW50UmVwYWlyZWQgPSAxLjBEOwogICAgICAgICB0ZW1wbGF0ZS5ieXRlc1JlcGFpcmVkID0gMEw7CkBAIC05OSw2ICsxMDAsOCBAQAogICAgICAgICB0ZW1wbGF0ZS5hdmVyYWdlVG9tYnN0b25lc1BlclNsaWNlTGFzdEZpdmVNaW51dGVzID0gRG91YmxlLk5hTjsKICAgICAgICAgdGVtcGxhdGUubWF4aW11bVRvbWJzdG9uZXNQZXJTbGljZUxhc3RGaXZlTWludXRlcyA9IDBMOwogICAgICAgICB0ZW1wbGF0ZS5kcm9wcGVkTXV0YXRpb25zID0gIjAiOworICAgICAgICB0ZW1wbGF0ZS50d2NzID0gbnVsbDsKKyAgICAgICAgdGVtcGxhdGUudHdjc0R1cmF0aW9uSW5NaWxsaXMgPSAwTDsKICAgICAgICAgcmV0dXJuIHRlbXBsYXRlOwogICAgIH0KIApAQCAtMzM3LDYgKzM0MCwxMCBAQAogICAgICAgICB0YWJsZTIubWVtdGFibGVPZmZIZWFwTWVtb3J5VXNlZCA9ICIzMTQxNTkyNjUiOwogICAgICAgICB0YWJsZTQubWVtdGFibGVPZmZIZWFwTWVtb3J5VXNlZCA9ICIxNDE0MjEzNTYiOwogICAgICAgICB0YWJsZTYubWVtdGFibGVPZmZIZWFwTWVtb3J5VXNlZCA9ICIxNjE4MDMzOTgiOworICAgICAgICAvLyB0d2NzIG1heCBkdXJhdGlvbjogMiA+IDQgPiAxID0gMyA9IDYgPSA1CisgICAgICAgIHRhYmxlMi50d2NzRHVyYXRpb25Jbk1pbGxpcyA9IDIwMDBMOworICAgICAgICB0YWJsZTQudHdjc0R1cmF0aW9uSW5NaWxsaXMgPSAxMDAwTDsKKyAgICAgICAgdGFibGU1LnR3Y3NEdXJhdGlvbkluTWlsbGlzID0gbnVsbDsKICAgICAgICAgLy8gY3JlYXRlIHRlc3Qga2V5c3BhY2VzIGZyb20gdGVtcGxhdGVzCiAgICAgICAgIHRlc3RLZXlzcGFjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgU3RhdHNLZXlzcGFjZSBrZXlzcGFjZTEgPSBjcmVhdGVTdGF0c0tleXNwYWNlVGVtcGxhdGUoImtleXNwYWNlMSIpOwpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9DUUxVc2VyQXVkaXRUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L0NRTFVzZXJBdWRpdFRlc3QuamF2YQppbmRleCAxMjBkZTJhLi44YmM5ZjI4IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L0NRTFVzZXJBdWRpdFRlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L0NRTFVzZXJBdWRpdFRlc3QuamF2YQpAQCAtNDksNiArNDksNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmxvY2F0b3IuSW5ldEFkZHJlc3NBbmRQb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuRW1iZWRkZWRDYXNzYW5kcmFTZXJ2aWNlOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuU1VQRVJVU0VSX1NFVFVQX0RFTEFZX01TOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5jb25jdXJyZW50LkJsb2NraW5nUXVldWVzLm5ld0Jsb2NraW5nUXVldWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CkBAIC03MCw3ICs3MSw3IEBACiAgICAgICAgICAgICBjb25maWcuYXVkaXRfbG9nZ2luZ19vcHRpb25zLmxvZ2dlciA9IG5ldyBQYXJhbWV0ZXJpemVkQ2xhc3MoIkRpYWdub3N0aWNFdmVudEF1ZGl0TG9nZ2VyIiwgbnVsbCk7CiAgICAgICAgIH0pOwogCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLnN1cGVydXNlcl9zZXR1cF9kZWxheV9tcyIsICIwIik7CisgICAgICAgIFNVUEVSVVNFUl9TRVRVUF9ERUxBWV9NUy5zZXRMb25nKDApOwogCiAgICAgICAgIGVtYmVkZGVkID0gU2VydmVyVGVzdFV0aWxzLnN0YXJ0RW1iZWRkZWRDYXNzYW5kcmFTZXJ2aWNlKCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvTWVzc2FnZURpc3BhdGNoZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L01lc3NhZ2VEaXNwYXRjaGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNzAzMTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L01lc3NhZ2VEaXNwYXRjaGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5VbmludGVycnVwdGlibGVzOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5EYXRhYmFzZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubWV0cmljcy5DbGllbnRNZXRyaWNzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcnZpY2UuUXVlcnlTdGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuQXV0aFJlc3BvbnNlOworCitwdWJsaWMgY2xhc3MgTWVzc2FnZURpc3BhdGNoZXJUZXN0Cit7CisgICAgc3RhdGljIGZpbmFsIE1lc3NhZ2UuUmVxdWVzdCBBVVRIX1JFU1BPTlNFX1JFUVVFU1QgPSBuZXcgQXV0aFJlc3BvbnNlKG5ldyBieXRlWzBdKQorICAgIHsKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGV4ZWN1dGUoUXVlcnlTdGF0ZSBxdWVyeVN0YXRlLCBsb25nIHF1ZXJ5U3RhcnROYW5vVGltZSwgYm9vbGVhbiB0cmFjZVJlcXVlc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIEF1dGhUZXN0RGlzcGF0Y2hlciBkaXNwYXRjaDsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbWF4QXV0aFRocmVhZHNCZWZvcmVUZXN0czsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLmRhZW1vbkluaXRpYWxpemF0aW9uKCk7CisgICAgICAgIENsaWVudE1ldHJpY3MuaW5zdGFuY2UuaW5pdChDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7CisgICAgICAgIG1heEF1dGhUaHJlYWRzQmVmb3JlVGVzdHMgPSBEYXRhYmFzZURlc2NyaXB0b3IuZ2V0TmF0aXZlVHJhbnNwb3J0TWF4QXV0aFRocmVhZHMoKTsKKyAgICAgICAgZGlzcGF0Y2ggPSBuZXcgQXV0aFRlc3REaXNwYXRjaGVyKCk7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzdG9yZUF1dGhTaXplKCkKKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXROYXRpdmVUcmFuc3BvcnRNYXhBdXRoVGhyZWFkcyhtYXhBdXRoVGhyZWFkc0JlZm9yZVRlc3RzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRoUmF0ZUxpbWl0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIHN0YXJ0UmVxdWVzdHMgPSBjb21wbGV0ZWRSZXF1ZXN0cygpOworCisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXROYXRpdmVUcmFuc3BvcnRNYXhBdXRoVGhyZWFkcygxKTsKKyAgICAgICAgbG9uZyBhdXRocyA9IHRyeUF1dGgodGhpczo6Y29tcGxldGVkQXV0aCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYXV0aHMsIDEpOworCisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXROYXRpdmVUcmFuc3BvcnRNYXhBdXRoVGhyZWFkcygxMDApOworICAgICAgICBhdXRocyA9IHRyeUF1dGgodGhpczo6Y29tcGxldGVkQXV0aCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYXV0aHMsIDEpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBubyB0YXNrcyBleGVjdXRlZCBvbiB0aGUgcmVndWxhciBwb29sCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3RhcnRSZXF1ZXN0cywgY29tcGxldGVkUmVxdWVzdHMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aFJhdGVMaW1pdGVyTm90VXNlZCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXROYXRpdmVUcmFuc3BvcnRNYXhBdXRoVGhyZWFkcygxKTsKKyAgICAgICAgZm9yIChNZXNzYWdlLlR5cGUgdHlwZSA6IE1lc3NhZ2UuVHlwZS52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0gTWVzc2FnZS5UeXBlLkFVVEhfUkVTUE9OU0UgfHwgdHlwZSA9PSBNZXNzYWdlLlR5cGUuQ1JFREVOVElBTFMgfHwgdHlwZS5kaXJlY3Rpb24gIT0gTWVzc2FnZS5EaXJlY3Rpb24uUkVRVUVTVCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgbG9uZyBhdXRocyA9IGNvbXBsZXRlZEF1dGgoKTsKKyAgICAgICAgICAgIGxvbmcgcmVxdWVzdHMgPSB0cnlBdXRoKHRoaXM6OmNvbXBsZXRlZFJlcXVlc3RzLCBuZXcgTWVzc2FnZS5SZXF1ZXN0KHR5cGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIGV4ZWN1dGUoUXVlcnlTdGF0ZSBxdWVyeVN0YXRlLCBsb25nIHF1ZXJ5U3RhcnROYW5vVGltZSwgYm9vbGVhbiB0cmFjZVJlcXVlc3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVxdWVzdHMsIDEpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb21wbGV0ZWRBdXRoKCkgLSBhdXRocywgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRoUmF0ZUxpbWl0ZXJEaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24KKyAgICB7CisgICAgICAgIGxvbmcgc3RhcnRBdXRoUmVxdWVzdHMgPSBjb21wbGV0ZWRBdXRoKCk7CisKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldE5hdGl2ZVRyYW5zcG9ydE1heEF1dGhUaHJlYWRzKDApOworICAgICAgICBsb25nIHJlcXVlc3RzID0gdHJ5QXV0aCh0aGlzOjpjb21wbGV0ZWRSZXF1ZXN0cyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVxdWVzdHMsIDEpOworCisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXROYXRpdmVUcmFuc3BvcnRNYXhBdXRoVGhyZWFkcygtMSk7CisgICAgICAgIHJlcXVlc3RzID0gdHJ5QXV0aCh0aGlzOjpjb21wbGV0ZWRSZXF1ZXN0cyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVxdWVzdHMsIDEpOworCisgICAgICAgIERhdGFiYXNlRGVzY3JpcHRvci5zZXROYXRpdmVUcmFuc3BvcnRNYXhBdXRoVGhyZWFkcygtMTAwMCk7CisgICAgICAgIHJlcXVlc3RzID0gdHJ5QXV0aCh0aGlzOjpjb21wbGV0ZWRSZXF1ZXN0cyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVxdWVzdHMsIDEpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSBubyB0YXNrcyBleGVjdXRlZCBvbiB0aGUgYXV0aCBwb29sCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3RhcnRBdXRoUmVxdWVzdHMsIGNvbXBsZXRlZEF1dGgoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGNvbXBsZXRlZFJlcXVlc3RzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBEaXNwYXRjaGVyLnJlcXVlc3RFeGVjdXRvci5nZXRDb21wbGV0ZWRUYXNrQ291bnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgY29tcGxldGVkQXV0aCgpCisgICAgeworICAgICAgICByZXR1cm4gRGlzcGF0Y2hlci5hdXRoRXhlY3V0b3IuZ2V0Q29tcGxldGVkVGFza0NvdW50KCk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgdHJ5QXV0aChDYWxsYWJsZTxMb25nPiBjaGVjaykgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgcmV0dXJuIHRyeUF1dGgoY2hlY2ssIEFVVEhfUkVTUE9OU0VfUkVRVUVTVCk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVuc3RhYmxlQXBpVXNhZ2UiKQorICAgIHB1YmxpYyBsb25nIHRyeUF1dGgoQ2FsbGFibGU8TG9uZz4gY2hlY2ssIE1lc3NhZ2UuUmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBsb25nIHN0YXJ0ID0gY2hlY2suY2FsbCgpOworICAgICAgICBkaXNwYXRjaC5kaXNwYXRjaChudWxsLCByZXF1ZXN0LCAoY2hhbm5lbCxyZXEscmVzcG9uc2UpIC0+IG51bGwsIENsaWVudFJlc291cmNlTGltaXRzLk92ZXJsb2FkLk5PTkUpOworCisgICAgICAgIC8vIFdoaWxlIHRoaXMgaXMgdGltZW91dCBiYXNlZCwgd2Ugc2hvdWxkIGJlICp3ZWxsIGJlbG93KiBhIGZ1bGwgc2Vjb25kIG9uIGFueSBvZiB0aGlzIHByb2Nlc3NpbmcgaW4gYW55IHNhbmUgZW52aXJvbm1lbnQuCisgICAgICAgIGxvbmcgdGltZW91dCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB3aGlsZShzdGFydCA9PSBjaGVjay5jYWxsKCkgJiYgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lb3V0IDwgMTAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgVW5pbnRlcnJ1cHRpYmxlcy5zbGVlcFVuaW50ZXJydXB0aWJseSgxMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2hlY2suY2FsbCgpIC0gc3RhcnQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBdXRoVGVzdERpc3BhdGNoZXIgZXh0ZW5kcyBEaXNwYXRjaGVyCisgICAgeworICAgICAgICBwdWJsaWMgQXV0aFRlc3REaXNwYXRjaGVyKCkKKyAgICAgICAgeworICAgICAgICAgICAgc3VwZXIoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgcHJvY2Vzc1JlcXVlc3QoQ2hhbm5lbCBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UuUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsdXNoSXRlbUNvbnZlcnRlciBmb3JGbHVzaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFJlc291cmNlTGltaXRzLk92ZXJsb2FkIGJhY2twcmVzc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGFwcHJveFN0YXJ0VGltZU5hbm9zKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBub29wCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L01lc3NhZ2VQYXlsb2FkVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9NZXNzYWdlUGF5bG9hZFRlc3QuamF2YQppbmRleCBmMGI0NWMzLi4xYmQxYThmIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L01lc3NhZ2VQYXlsb2FkVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvTWVzc2FnZVBheWxvYWRUZXN0LmphdmEKQEAgLTQ3LDYgKzQ3LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50cmFuc3BvcnQubWVzc2FnZXMuUXVlcnlNZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydC5tZXNzYWdlcy5SZXN1bHRNZXNzYWdlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk1ENURpZ2VzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5SZWZsZWN0aW9uVXRpbHM7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWwuYnl0ZXM7CiAKQEAgLTY2LDcgKzY3LDcgQEAKICAgICAgICAgICAgIGNxbFF1ZXJ5SGFuZGxlckZpZWxkID0gQ2xpZW50U3RhdGUuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgiY3FsUXVlcnlIYW5kbGVyIik7CiAgICAgICAgICAgICBjcWxRdWVyeUhhbmRsZXJGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwogCi0gICAgICAgICAgICBGaWVsZCBtb2RpZmllcnNGaWVsZCA9IEZpZWxkLmNsYXNzLmdldERlY2xhcmVkRmllbGQoIm1vZGlmaWVycyIpOworICAgICAgICAgICAgRmllbGQgbW9kaWZpZXJzRmllbGQgPSBSZWZsZWN0aW9uVXRpbHMuZ2V0TW9kaWZpZXJzRmllbGQoKTsKICAgICAgICAgICAgIG1vZGlmaWVyc0FjY2Vzc2libGUgPSBtb2RpZmllcnNGaWVsZC5pc0FjY2Vzc2libGUoKTsKICAgICAgICAgICAgIG1vZGlmaWVyc0ZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CiAgICAgICAgICAgICBtb2RpZmllcnNGaWVsZC5zZXRJbnQoY3FsUXVlcnlIYW5kbGVyRmllbGQsIGNxbFF1ZXJ5SGFuZGxlckZpZWxkLmdldE1vZGlmaWVycygpICYgfk1vZGlmaWVyLkZJTkFMKTsKQEAgLTg0LDcgKzg1LDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgdHJ5CiAgICAgICAgIHsKLSAgICAgICAgICAgIEZpZWxkIG1vZGlmaWVyc0ZpZWxkID0gRmllbGQuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgibW9kaWZpZXJzIik7CisgICAgICAgICAgICBGaWVsZCBtb2RpZmllcnNGaWVsZCA9IFJlZmxlY3Rpb25VdGlscy5nZXRNb2RpZmllcnNGaWVsZCgpOwogICAgICAgICAgICAgbW9kaWZpZXJzRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKICAgICAgICAgICAgIG1vZGlmaWVyc0ZpZWxkLnNldEludChjcWxRdWVyeUhhbmRsZXJGaWVsZCwgY3FsUXVlcnlIYW5kbGVyRmllbGQuZ2V0TW9kaWZpZXJzKCkgfCBNb2RpZmllci5GSU5BTCk7CiAKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvU2VyRGVzZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1NlckRlc2VyVGVzdC5qYXZhCmluZGV4IDYwMzMyMDMuLjExYjc0ODkgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvU2VyRGVzZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3RyYW5zcG9ydC9TZXJEZXNlclRlc3QuamF2YQpAQCAtMTgsMjEgKzE4LDQ2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydDsKIAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuUmFuZG9tU3RyaW5nVXRpbHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBpby5uZXR0eS5idWZmZXIuVW5wb29sZWQ7CiBpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWY7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuUmFuZG9tU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuVXRpbDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtbklkZW50aWZpZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Db2x1bW5TcGVjaWZpY2F0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuRmllbGRJZGVudGlmaWVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuTGlzdHM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5NYXBzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUXVlcnlPcHRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuUmVzdWx0U2V0OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuU2V0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLlRlcm07CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5Vc2VyVHlwZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ29uc2lzdGVuY3lMZXZlbDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5BYnN0cmFjdFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlQnVmZmVyQWNjZXNzb3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5JbnQzMlR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5MaXN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkxvbmdUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuTWFwVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlNldFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlVzZXJUeXBlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLkNvbGxlY3Rpb25TZXJpYWxpemVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNlcmlhbGl6ZXJzLk1hcnNoYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VydmljZS5DbGllbnRTdGF0ZTsKQEAgLTQ0LDE2ICs2OSwxNSBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkJ5dGVCdWZmZXJVdGlsLmJ5dGVzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWwuYnl0ZXM7CiAKIC8qKgogICogU2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gdGVzdHMgZm9yIHByb3RvY29sIG9iamVjdHMgYW5kIG1lc3NhZ2VzLgogICovCiBwdWJsaWMgY2xhc3MgU2VyRGVzZXJUZXN0CiB7Ci0KICAgICBAQmVmb3JlQ2xhc3MKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0dXBERCgpCiAgICAgewpAQCAtNjQsMTIgKzg4LDYgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGNvbGxlY3Rpb25TZXJEZXNlclRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBmb3IgKFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uIDogUHJvdG9jb2xWZXJzaW9uLlNVUFBPUlRFRCkKLSAgICAgICAgICAgIGNvbGxlY3Rpb25TZXJEZXNlclRlc3QodmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29sbGVjdGlvblNlckRlc2VyVGVzdChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKICAgICAgICAgLy8gTGlzdHMKICAgICAgICAgTGlzdFR5cGU8Pz4gbHQgPSBMaXN0VHlwZS5nZXRJbnN0YW5jZShJbnQzMlR5cGUuaW5zdGFuY2UsIHRydWUpOwogICAgICAgICBMaXN0PEludGVnZXI+IGwgPSBBcnJheXMuYXNMaXN0KDIsIDYsIDEsIDkpOwpAQCAtNzgsMTggKzk2LDE3IEBACiAgICAgICAgIGZvciAoSW50ZWdlciBpIDogbCkKICAgICAgICAgICAgIGxiLmFkZChJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKGkpKTsKIAotICAgICAgICBhc3NlcnRFcXVhbHMobCwgbHQuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhsYiwgbGIuc2l6ZSgpLCB2ZXJzaW9uKSwgdmVyc2lvbikpOworICAgICAgICBhc3NlcnRFcXVhbHMobCwgbHQuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplKENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2sobGIsIGxiLnNpemUoKSkpKTsKIAogICAgICAgICAvLyBTZXRzCiAgICAgICAgIFNldFR5cGU8Pz4gc3QgPSBTZXRUeXBlLmdldEluc3RhbmNlKFVURjhUeXBlLmluc3RhbmNlLCB0cnVlKTsKLSAgICAgICAgU2V0PFN0cmluZz4gcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKLSAgICAgICAgcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCgiYmFyIiwgImZvbyIsICJ6ZWUiKSk7CisgICAgICAgIFNldDxTdHJpbmc+IHMgPSBuZXcgTGlua2VkSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoImJhciIsICJmb28iLCAiemVlIikpOwogCiAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gc2IgPSBuZXcgQXJyYXlMaXN0PD4ocy5zaXplKCkpOwogICAgICAgICBmb3IgKFN0cmluZyB0IDogcykKICAgICAgICAgICAgIHNiLmFkZChVVEY4VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UodCkpOwogCi0gICAgICAgIGFzc2VydEVxdWFscyhzLCBzdC5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKHNiLCBzYi5zaXplKCksIHZlcnNpb24pLCB2ZXJzaW9uKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzLCBzdC5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemUoQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhzYiwgc2Iuc2l6ZSgpKSkpOwogCiAgICAgICAgIC8vIE1hcHMKICAgICAgICAgTWFwVHlwZTw/LCA/PiBtdCA9IE1hcFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIExvbmdUeXBlLmluc3RhbmNlLCB0cnVlKTsKQEAgLTEwNSw1MiArMTIyLDQ5IEBACiAgICAgICAgICAgICBtYi5hZGQoTG9uZ1R5cGUuaW5zdGFuY2UuZGVjb21wb3NlKGVudHJ5LmdldFZhbHVlKCkpKTsKICAgICAgICAgfQogCi0gICAgICAgIGFzc2VydEVxdWFscyhtLCBtdC5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKG1iLCBtLnNpemUoKSwgdmVyc2lvbiksIHZlcnNpb24pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG0sIG10LmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZShDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKG1iLCBtLnNpemUoKSkpKTsKICAgICB9CiAKICAgICBAVGVzdChleHBlY3RlZCA9IE1hcnNoYWxFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgc2V0c01heU5vdENvbnRhaW5OdWxsc1Rlc3QoKQogICAgIHsKLSAgICAgICAgUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24gPSBQcm90b2NvbFZlcnNpb24uTUlOX1NVUFBPUlRFRF9WRVJTSU9OOwogICAgICAgICBTZXRUeXBlPD8+IHN0ID0gU2V0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgdHJ1ZSk7CiAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gc2IgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CiAgICAgICAgIHNiLmFkZChudWxsKTsKIAotICAgICAgICBzdC5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKHNiLCBzYi5zaXplKCksIHZlcnNpb24pLCB2ZXJzaW9uKTsKKyAgICAgICAgc3QuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplKENvbGxlY3Rpb25TZXJpYWxpemVyLnBhY2soc2IsIHNiLnNpemUoKSkpOwogICAgIH0KIAogICAgIEBUZXN0KGV4cGVjdGVkID0gTWFyc2hhbEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCBtYXBLZXlzTWF5Tm90Q29udGFpbk51bGxzVGVzdCgpCiAgICAgewotICAgICAgICBQcm90b2NvbFZlcnNpb24gdmVyc2lvbiA9IFByb3RvY29sVmVyc2lvbi5NSU5fU1VQUE9SVEVEX1ZFUlNJT047CiAgICAgICAgIE1hcFR5cGU8PywgPz4gbXQgPSBNYXBUeXBlLmdldEluc3RhbmNlKFVURjhUeXBlLmluc3RhbmNlLCBMb25nVHlwZS5pbnN0YW5jZSwgdHJ1ZSk7CiAgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gbWIgPSBuZXcgQXJyYXlMaXN0PD4oMik7CiAgICAgICAgIG1iLmFkZChudWxsKTsKICAgICAgICAgbWIuYWRkKExvbmdUeXBlLmluc3RhbmNlLmRlY29tcG9zZSg5OTlMKSk7CiAKLSAgICAgICAgbXQuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhtYiwgbWIuc2l6ZSgpLCB2ZXJzaW9uKSwgdmVyc2lvbik7CisgICAgICAgIG10LmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZShDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKG1iLCBtYi5zaXplKCkpKTsKICAgICB9CiAKICAgICBAVGVzdChleHBlY3RlZCA9IE1hcnNoYWxFeGNlcHRpb24uY2xhc3MpCiAgICAgcHVibGljIHZvaWQgbWFwVmFsdWVNYXlOb3RDb250YWluTnVsbHNUZXN0KCkKICAgICB7Ci0gICAgICAgIFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uID0gUHJvdG9jb2xWZXJzaW9uLk1JTl9TVVBQT1JURURfVkVSU0lPTjsKICAgICAgICAgTWFwVHlwZTw/LCA/PiBtdCA9IE1hcFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIExvbmdUeXBlLmluc3RhbmNlLCB0cnVlKTsKICAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBtYiA9IG5ldyBBcnJheUxpc3Q8PigyKTsKICAgICAgICAgbWIuYWRkKFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZSgiZGFuZ2VyIikpOwogICAgICAgICBtYi5hZGQobnVsbCk7CiAKLSAgICAgICAgbXQuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woQ29sbGVjdGlvblNlcmlhbGl6ZXIucGFjayhtYiwgbWIuc2l6ZSgpLCB2ZXJzaW9uKSwgdmVyc2lvbik7CisgICAgICAgIG10LmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZShDb2xsZWN0aW9uU2VyaWFsaXplci5wYWNrKG1iLCBtYi5zaXplKCkpKTsKICAgICB9CiAKICAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGV2ZW50U2VyRGVzZXJUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHB1YmxpYyB2b2lkIGV2ZW50U2VyRGVzZXJUZXN0KCkKICAgICB7CiAgICAgICAgIGZvciAoUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24gOiBQcm90b2NvbFZlcnNpb24uU1VQUE9SVEVEKQogICAgICAgICAgICAgZXZlbnRTZXJEZXNlclRlc3QodmVyc2lvbik7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgZXZlbnRTZXJEZXNlclRlc3QoUHJvdG9jb2xWZXJzaW9uIHZlcnNpb24pIHRocm93cyBFeGNlcHRpb24KKyAgICBwdWJsaWMgdm9pZCBldmVudFNlckRlc2VyVGVzdChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKICAgICB7CiAgICAgICAgIExpc3Q8RXZlbnQ+IGV2ZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCkBAIC0yMjgsMTQgKzI0MiwxNCBAQAogICAgIH0KIAogICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdWR0U2VyRGVzZXJUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHB1YmxpYyB2b2lkIHVkdFNlckRlc2VyVGVzdCgpCiAgICAgewogICAgICAgICBmb3IgKFByb3RvY29sVmVyc2lvbiB2ZXJzaW9uIDogUHJvdG9jb2xWZXJzaW9uLlNVUFBPUlRFRCkKICAgICAgICAgICAgIHVkdFNlckRlc2VyVGVzdCh2ZXJzaW9uKTsKICAgICB9CiAKIAotICAgIHB1YmxpYyB2b2lkIHVkdFNlckRlc2VyVGVzdChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHB1YmxpYyB2b2lkIHVkdFNlckRlc2VyVGVzdChQcm90b2NvbFZlcnNpb24gdmVyc2lvbikKICAgICB7CiAgICAgICAgIExpc3RUeXBlPD8+IGx0ID0gTGlzdFR5cGUuZ2V0SW5zdGFuY2UoSW50MzJUeXBlLmluc3RhbmNlLCB0cnVlKTsKICAgICAgICAgU2V0VHlwZTw/PiBzdCA9IFNldFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIHRydWUpOwpAQCAtMjc0LDcgKzI4OCw3IEBACiAKICAgICAgICAgQnl0ZUJ1ZmZlciBzZXJpYWxpemVkID0gdC5iaW5kQW5kR2V0KG9wdGlvbnMpOwogCi0gICAgICAgIEJ5dGVCdWZmZXJbXSBmaWVsZHMgPSB1ZHQuc3BsaXQoc2VyaWFsaXplZCk7CisgICAgICAgIEJ5dGVCdWZmZXJbXSBmaWVsZHMgPSB1ZHQuc3BsaXQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBzZXJpYWxpemVkKTsKIAogICAgICAgICBhc3NlcnRFcXVhbHMoNCwgZmllbGRzLmxlbmd0aCk7CiAKQEAgLTI4NCwxNiArMjk4LDE1IEBACiAgICAgICAgIC8vIGEgVURUIHNob3VsZCBhbHdheSBiZSBzZXJpYWxpemVkIHdpdGggdmVyc2lvbiAzIG9mIHRoZSBwcm90b2NvbC4gV2hpY2ggaXMgd2h5IHdlIGRvbid0IHVzZSAndmVyc2lvbicKICAgICAgICAgLy8gb24gcHVycG9zZSBiZWxvdy4KIAotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgzLCAxKSwgbHQuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplRm9yTmF0aXZlUHJvdG9jb2woZmllbGRzWzFdLCBQcm90b2NvbFZlcnNpb24uVjMpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoMywgMSksIGx0LmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZShmaWVsZHNbMV0pKTsKIAotICAgICAgICBMaW5rZWRIYXNoU2V0PFN0cmluZz4gcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKLSAgICAgICAgcy5hZGRBbGwoQXJyYXlzLmFzTGlzdCgiYmFyIiwgImZvbyIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIHN0LmdldFNlcmlhbGl6ZXIoKS5kZXNlcmlhbGl6ZUZvck5hdGl2ZVByb3RvY29sKGZpZWxkc1syXSwgUHJvdG9jb2xWZXJzaW9uLlYzKSk7CisgICAgICAgIExpbmtlZEhhc2hTZXQ8U3RyaW5nPiBzID0gbmV3IExpbmtlZEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KCJiYXIiLCAiZm9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMocywgc3QuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplKGZpZWxkc1syXSkpOwogCiAgICAgICAgIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBMb25nPiBtID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogICAgICAgICBtLnB1dCgiYmFyIiwgMTJMKTsKICAgICAgICAgbS5wdXQoImZvbyIsIDI0TCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtLCBtdC5nZXRTZXJpYWxpemVyKCkuZGVzZXJpYWxpemVGb3JOYXRpdmVQcm90b2NvbChmaWVsZHNbM10sIFByb3RvY29sVmVyc2lvbi5WMykpOworICAgICAgICBhc3NlcnRFcXVhbHMobSwgbXQuZ2V0U2VyaWFsaXplcigpLmRlc2VyaWFsaXplKGZpZWxkc1szXSkpOwogICAgIH0KIAogICAgIEBUZXN0CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1dyaXRlQnl0ZXNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdHJhbnNwb3J0L1dyaXRlQnl0ZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkMWM3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS90cmFuc3BvcnQvV3JpdGVCeXRlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRyYW5zcG9ydDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWY7CitpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLlVucG9vbGVkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkdlbmVyYXRvcnM7CitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKKworaW1wb3J0IHN0YXRpYyBvcmcucXVpY2t0aGVvcmllcy5RdWlja1RoZW9yeS5xdDsKKworCitwdWJsaWMgY2xhc3MgV3JpdGVCeXRlc1Rlc3QKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QoKQorICAgIHsKKyAgICAgICAgaW50IG1heEJ5dGVzID0gMTBfMDAwOworICAgICAgICBCeXRlQnVmIGJ1ZiA9IFVucG9vbGVkLmJ1ZmZlcihtYXhCeXRlcyk7CisgICAgICAgIHF0KCkuZm9yQWxsKEdlbmVyYXRvcnMuYnl0ZXNBbnlUeXBlKDAsIG1heEJ5dGVzKSkuY2hlY2tBc3NlcnQoYmIgLT4geworICAgICAgICAgICAgYnVmLmNsZWFyKCk7CisKKyAgICAgICAgICAgIGludCBzaXplID0gYmIucmVtYWluaW5nKCk7CisgICAgICAgICAgICBpbnQgcG9zID0gYmIucG9zaXRpb24oKTsKKworICAgICAgICAgICAgQ0JVdGlsLmFkZEJ5dGVzKGJiLCBidWYpOworCisgICAgICAgICAgICAvLyB0ZXN0IGZvciBjb25zdW1wdGlvbgorICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGJiLnJlbWFpbmluZygpKS5pc0VxdWFsVG8oc2l6ZSk7CisgICAgICAgICAgICBBc3NlcnRpb25zLmFzc2VydFRoYXQoYmIucG9zaXRpb24oKSkuaXNFcXVhbFRvKHBvcyk7CisKKyAgICAgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdChidWYud3JpdGVySW5kZXgoKSkuaXNFcXVhbFRvKHNpemUpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgICAgICAgICAgQXNzZXJ0aW9ucy5hc3NlcnRUaGF0KGJ1Zi5nZXRCeXRlKGJ1Zi5yZWFkZXJJbmRleCgpICsgaSkpLmRlc2NyaWJlZEFzKCJieXRlIG1pc21hdGNoIGF0IGluZGV4ICVkIiwgaSkuaXNFcXVhbFRvKGJiLmdldChiYi5wb3NpdGlvbigpICsgaSkpOworICAgICAgICAgICAgRmlsZVV0aWxzLmNsZWFuKGJiKTsKKyAgICAgICAgfSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQmxvb21GaWx0ZXJUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQmxvb21GaWx0ZXJUZXN0LmphdmEKaW5kZXggOTY0NjRjOS4uN2YwOGQ2YyAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0Jsb29tRmlsdGVyVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CbG9vbUZpbHRlclRlc3QuamF2YQpAQCAtMTgsMTAgKzE4LDcgQEAKICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC4qOwotCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CkBAIC0yOSwxMCArMjYsMjAgQEAKIGltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKLWltcG9ydCBvcmcuanVuaXQuKjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFPdXRwdXRCdWZmZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVPdXRwdXRTdHJlYW1QbHVzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLklGaWx0ZXIuRmlsdGVyS2V5OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLktleUdlbmVyYXRvci5SYW5kb21TdHJpbmdHZW5lcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMub2JzLklCaXRTZXQ7CkBAIC01NSwxMSArNjIsMTEgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKLSAgICAgICAgICAgIEJsb29tRmlsdGVyU2VyaWFsaXplci5zZXJpYWxpemUoKEJsb29tRmlsdGVyKSBmLCBvdXQpOworICAgICAgICAgICAgQmxvb21GaWx0ZXJTZXJpYWxpemVyLmZvclZlcnNpb24oZmFsc2UpLnNlcmlhbGl6ZSgoQmxvb21GaWx0ZXIpIGYsIG91dCk7CiAgICAgICAgIH0KIAogICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQuZ2V0RGF0YSgpLCAwLCBvdXQuZ2V0TGVuZ3RoKCkpOwotICAgICAgICBJRmlsdGVyIGYyID0gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmRlc2VyaWFsaXplKG5ldyBEYXRhSW5wdXRTdHJlYW0oaW4pLCBvbGRCZkZvcm1hdCk7CisgICAgICAgIElGaWx0ZXIgZjIgPSBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZm9yVmVyc2lvbihvbGRCZkZvcm1hdCkuZGVzZXJpYWxpemUoVXRpbC5EYXRhSW5wdXRTdHJlYW1QbHVzSW1wbC53cmFwKGluKSk7CiAKICAgICAgICAgYXNzZXJ0IGYyLmlzUHJlc2VudChGaWx0ZXJUZXN0SGVscGVyLmJ5dGVzKCJhIikpOwogICAgICAgICBhc3NlcnQgIWYyLmlzUHJlc2VudChGaWx0ZXJUZXN0SGVscGVyLmJ5dGVzKCJiIikpOwpAQCAtMjEwLDEzICsyMTcsMTQgQEAKICAgICAgICAgRmlsZSBmaWxlID0gRmlsZVV0aWxzLmNyZWF0ZURlbGV0YWJsZVRlbXBGaWxlKCJibG9vbUZpbHRlclRlc3QtIiwgIi5kYXQiKTsKICAgICAgICAgQmxvb21GaWx0ZXIgZmlsdGVyID0gKEJsb29tRmlsdGVyKSBGaWx0ZXJGYWN0b3J5LmdldEZpbHRlcigoKGxvbmcpIEludGVnZXIuTUFYX1ZBTFVFIC8gOCkgKyAxLCAwLjAxZCk7CiAgICAgICAgIGZpbHRlci5hZGQoRmlsdGVyVGVzdEhlbHBlci53cmFwKHRlc3QpKTsKLSAgICAgICAgRGF0YU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW1QbHVzKGZpbGUpOwotICAgICAgICBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuc2VyaWFsaXplKGZpbHRlciwgb3V0KTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gZmlsZS5uZXdPdXRwdXRTdHJlYW0oRmlsZS5Xcml0ZU1vZGUuT1ZFUldSSVRFKTsKKyAgICAgICAgQmxvb21GaWx0ZXJTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZm9yVmVyc2lvbihmYWxzZSk7CisgICAgICAgIHNlcmlhbGl6ZXIuc2VyaWFsaXplKGZpbHRlciwgb3V0KTsKICAgICAgICAgb3V0LmNsb3NlKCk7CiAgICAgICAgIGZpbHRlci5jbG9zZSgpOwogCi0gICAgICAgIERhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbVBsdXMoZmlsZSkpOwotICAgICAgICBCbG9vbUZpbHRlciBmaWx0ZXIyID0gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCBmYWxzZSk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbVBsdXMgaW4gPSBmaWxlLm5ld0lucHV0U3RyZWFtKCk7CisgICAgICAgIEJsb29tRmlsdGVyIGZpbHRlcjIgPSBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZm9yVmVyc2lvbihmYWxzZSkuZGVzZXJpYWxpemUoaW4pOwogICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShmaWx0ZXIyLmlzUHJlc2VudChGaWx0ZXJUZXN0SGVscGVyLndyYXAodGVzdCkpKTsKICAgICAgICAgRmlsZVV0aWxzLmNsb3NlUXVpZXRseShpbik7CiAgICAgICAgIGZpbHRlcjIuY2xvc2UoKTsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CeXRlQnVmZmVyVXRpbFRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CeXRlQnVmZmVyVXRpbFRlc3QuamF2YQppbmRleCA0YWU4NjI2Li4yYjgzMWI5IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQnl0ZUJ1ZmZlclV0aWxUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0J5dGVCdWZmZXJVdGlsVGVzdC5qYXZhCkBAIC0zNTYsNCArMzU2LDM3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzV2l0aFNob3J0TGVuZ3RoKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMocyk7CisgICAgICAgIGNoZWNrRXF1YWxzKGJiKTsKKworICAgICAgICBiYiA9IGZyb21TdHJpbmdXaXRoUG9zaXRpb24ocywgMTAsIGZhbHNlKTsKKyAgICAgICAgY2hlY2tFcXVhbHMoYmIpOworCisgICAgICAgIGJiID0gZnJvbVN0cmluZ1dpdGhQb3NpdGlvbihzLCAxMCwgdHJ1ZSk7CisgICAgICAgIGNoZWNrRXF1YWxzKGJiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tFcXVhbHMoQnl0ZUJ1ZmZlciBiYikgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIG91dCA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7CisgICAgICAgIEJ5dGVCdWZmZXJVdGlsLndyaXRlV2l0aFNob3J0TGVuZ3RoKGJiLCBvdXQpOworCisgICAgICAgIERhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKSk7CisgICAgICAgIGFzc2VydCBCeXRlQnVmZmVyVXRpbC5lcXVhbHNXaXRoU2hvcnRMZW5ndGgoaW4sIGJiKTsKKworICAgICAgICBpbnQgaW5kZXggPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCkubmV4dEludChiYi5yZW1haW5pbmcoKSk7CisKKyAgICAgICAgaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSkpOworICAgICAgICBiYi5wdXQoYmIucG9zaXRpb24oKSArIGluZGV4LCAoYnl0ZSkgKGJiLmdldChpbmRleCkgXiAweDU1KSk7CisgICAgICAgIGFzc2VydCAhQnl0ZUJ1ZmZlclV0aWwuZXF1YWxzV2l0aFNob3J0TGVuZ3RoKGluLCBiYik7CisgICAgICAgIGJiLnB1dChiYi5wb3NpdGlvbigpICsgaW5kZXgsIChieXRlKSAoYmIuZ2V0KGluZGV4KSBeIDB4NTUpKTsgICAvLyByZXZlcnQgY2hhbmdlCisKKyAgICAgICAgaW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSkpOworICAgICAgICBiYi5saW1pdChiYi5wb3NpdGlvbigpICsgaW5kZXgpOworICAgICAgICBhc3NlcnQgIUJ5dGVCdWZmZXJVdGlsLmVxdWFsc1dpdGhTaG9ydExlbmd0aChpbiwgYmIpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9CeXRlc1JlYWRUcmFja2VyVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0J5dGVzUmVhZFRyYWNrZXJUZXN0LmphdmEKaW5kZXggNzY5M2I0NS4uZjQwMDQ2MSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0J5dGVzUmVhZFRyYWNrZXJUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0J5dGVzUmVhZFRyYWNrZXJUZXN0LmphdmEKQEAgLTE4LDEwICsxOCw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHM7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkRhdGFJbnB1dFN0cmVhbTsKQEAgLTI5LDExICsyNSwxOCBAQAogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5VdGlsOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuQnl0ZXNSZWFkVHJhY2tlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dEJ1ZmZlcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkRhdGFJbnB1dFBsdXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzLkRhdGFJbnB1dFN0cmVhbVBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5UcmFja2VkRGF0YUlucHV0UGx1czsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlRyYWNrZWRJbnB1dFN0cmVhbTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKIHB1YmxpYyBjbGFzcyBCeXRlc1JlYWRUcmFja2VyVGVzdAogewogCkBAIC05OSw5ICsxMDIsOSBAQAogICAgICAgICAgICAgb3V0LmNsb3NlKCk7CiAgICAgICAgIH0KIAotICAgICAgICBEYXRhSW5wdXRQbHVzLkRhdGFJbnB1dFN0cmVhbVBsdXMgaW4gPSBuZXcgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh0ZXN0RGF0YSkpOwotICAgICAgICBCeXRlc1JlYWRUcmFja2VyIHRyYWNrZXIgPSBpbnB1dFN0cmVhbT8gbmV3IFRyYWNrZWRJbnB1dFN0cmVhbShpbikgOiBuZXcgVHJhY2tlZERhdGFJbnB1dFBsdXMoaW4pOwotICAgICAgICBEYXRhSW5wdXRQbHVzIHJlYWRlciA9IGlucHV0U3RyZWFtPyBuZXcgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzKChUcmFja2VkSW5wdXRTdHJlYW0pdHJhY2tlcikgOiAoRGF0YUlucHV0UGx1cykgdHJhY2tlcjsKKyAgICAgICAgRGF0YUlucHV0U3RyZWFtUGx1cyBpbiA9IG5ldyBEYXRhSW5wdXRCdWZmZXIodGVzdERhdGEpOworICAgICAgICBCeXRlc1JlYWRUcmFja2VyIHRyYWNrZXIgPSBpbnB1dFN0cmVhbSA/IG5ldyBUcmFja2VkSW5wdXRTdHJlYW0oaW4pIDogbmV3IFRyYWNrZWREYXRhSW5wdXRQbHVzKGluKTsKKyAgICAgICAgRGF0YUlucHV0UGx1cyByZWFkZXIgPSBpbnB1dFN0cmVhbSA/IFV0aWwuRGF0YUlucHV0U3RyZWFtUGx1c0ltcGwud3JhcCgoVHJhY2tlZElucHV0U3RyZWFtKSB0cmFja2VyKSA6IChEYXRhSW5wdXRQbHVzKSB0cmFja2VyOwogCiAgICAgICAgIHRyeQogICAgICAgICB7CkBAIC0xNzIsOSArMTc1LDkgQEAKICAgICAgICAgICAgIG91dC5jbG9zZSgpOwogICAgICAgICB9CiAKLSAgICAgICAgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzIGluID0gbmV3IERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGVzdERhdGEpKTsKLSAgICAgICAgQnl0ZXNSZWFkVHJhY2tlciB0cmFja2VyID0gaW5wdXRTdHJlYW0/IG5ldyBUcmFja2VkSW5wdXRTdHJlYW0oaW4pIDogbmV3IFRyYWNrZWREYXRhSW5wdXRQbHVzKGluKTsKLSAgICAgICAgRGF0YUlucHV0UGx1cyByZWFkZXIgPSBpbnB1dFN0cmVhbT8gbmV3IERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cygoVHJhY2tlZElucHV0U3RyZWFtKXRyYWNrZXIpIDogKERhdGFJbnB1dFBsdXMpIHRyYWNrZXI7CisgICAgICAgIERhdGFJbnB1dFN0cmVhbVBsdXMgaW4gPSBuZXcgRGF0YUlucHV0QnVmZmVyKHRlc3REYXRhKTsKKyAgICAgICAgQnl0ZXNSZWFkVHJhY2tlciB0cmFja2VyID0gaW5wdXRTdHJlYW0gPyBuZXcgVHJhY2tlZElucHV0U3RyZWFtKGluKSA6IG5ldyBUcmFja2VkRGF0YUlucHV0UGx1cyhpbik7CisgICAgICAgIERhdGFJbnB1dFBsdXMgcmVhZGVyID0gaW5wdXRTdHJlYW0gPyBVdGlsLkRhdGFJbnB1dFN0cmVhbVBsdXNJbXBsLndyYXAoKFRyYWNrZWRJbnB1dFN0cmVhbSkgdHJhY2tlcikgOiAoRGF0YUlucHV0UGx1cykgdHJhY2tlcjsKIAogICAgICAgICB0cnkKICAgICAgICAgewpAQCAtMjAwLDkgKzIwMyw5IEBACiAgICAgICAgIFN0cmluZyB0ZXN0U3RyID0gIjEyMzQ1Njc4OTAiOwogICAgICAgICBieXRlW10gdGVzdERhdGEgPSB0ZXN0U3RyLmdldEJ5dGVzKCk7CiAKLSAgICAgICAgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzIGluID0gbmV3IERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odGVzdERhdGEpKTsKLSAgICAgICAgQnl0ZXNSZWFkVHJhY2tlciB0cmFja2VyID0gaW5wdXRTdHJlYW0/IG5ldyBUcmFja2VkSW5wdXRTdHJlYW0oaW4pIDogbmV3IFRyYWNrZWREYXRhSW5wdXRQbHVzKGluKTsKLSAgICAgICAgRGF0YUlucHV0UGx1cyByZWFkZXIgPSBpbnB1dFN0cmVhbT8gbmV3IERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cygoVHJhY2tlZElucHV0U3RyZWFtKXRyYWNrZXIpIDogKERhdGFJbnB1dFBsdXMpIHRyYWNrZXI7CisgICAgICAgIERhdGFJbnB1dFN0cmVhbVBsdXMgaW4gPSBuZXcgRGF0YUlucHV0QnVmZmVyKHRlc3REYXRhKTsKKyAgICAgICAgQnl0ZXNSZWFkVHJhY2tlciB0cmFja2VyID0gaW5wdXRTdHJlYW0gPyBuZXcgVHJhY2tlZElucHV0U3RyZWFtKGluKSA6IG5ldyBUcmFja2VkRGF0YUlucHV0UGx1cyhpbik7CisgICAgICAgIERhdGFJbnB1dFBsdXMgcmVhZGVyID0gaW5wdXRTdHJlYW0gPyBVdGlsLkRhdGFJbnB1dFN0cmVhbVBsdXNJbXBsLndyYXAoKFRyYWNrZWRJbnB1dFN0cmVhbSkgdHJhY2tlcikgOiAoRGF0YUlucHV0UGx1cykgdHJhY2tlcjsKIAogICAgICAgICB0cnkKICAgICAgICAgewpAQCAtMjMzLDggKzIzNiw4IEBACiAgICAgcHVibGljIHZvaWQgaW50ZXJuYWxUZXN0UmVhZExpbmUoYm9vbGVhbiBpbnB1dFN0cmVhbSkgdGhyb3dzIEV4Y2VwdGlvbgogICAgIHsKICAgICAgICAgRGF0YUlucHV0U3RyZWFtIGluID0gbmV3IERhdGFJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIjEiLmdldEJ5dGVzKCkpKTsKLSAgICAgICAgQnl0ZXNSZWFkVHJhY2tlciB0cmFja2VyID0gaW5wdXRTdHJlYW0/IG5ldyBUcmFja2VkSW5wdXRTdHJlYW0oaW4pIDogbmV3IFRyYWNrZWREYXRhSW5wdXRQbHVzKGluKTsKLSAgICAgICAgRGF0YUlucHV0UGx1cyByZWFkZXIgPSBpbnB1dFN0cmVhbT8gbmV3IERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cygoVHJhY2tlZElucHV0U3RyZWFtKXRyYWNrZXIpIDogKERhdGFJbnB1dFBsdXMpIHRyYWNrZXI7CisgICAgICAgIEJ5dGVzUmVhZFRyYWNrZXIgdHJhY2tlciA9IGlucHV0U3RyZWFtID8gbmV3IFRyYWNrZWRJbnB1dFN0cmVhbShpbikgOiBuZXcgVHJhY2tlZERhdGFJbnB1dFBsdXMoaW4pOworICAgICAgICBEYXRhSW5wdXRQbHVzIHJlYWRlciA9IGlucHV0U3RyZWFtID8gVXRpbC5EYXRhSW5wdXRTdHJlYW1QbHVzSW1wbC53cmFwKChUcmFja2VkSW5wdXRTdHJlYW0pIHRyYWNrZXIpIDogKERhdGFJbnB1dFBsdXMpIHRyYWNrZXI7CiAKICAgICAgICAgdHJ5CiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9DYXNzYW5kcmFHZW5lcmF0b3JzLmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvQ2Fzc2FuZHJhR2VuZXJhdG9ycy5qYXZhCmluZGV4IGFkOWNiNmIuLjM0NTQ3ZGMgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9DYXNzYW5kcmFHZW5lcmF0b3JzLmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0Nhc3NhbmRyYUdlbmVyYXRvcnMuamF2YQpAQCAtMTgsMjAgKzE4LDI2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzOwogCiBpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKIGltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIGltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKIAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuYnVpbGRlci5NdWx0aWxpbmVSZWN1cnNpdmVUb1N0cmluZ1N0eWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5idWlsZGVyLlJlZmxlY3Rpb25Ub1N0cmluZ0J1aWxkZXI7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuQ29sdW1uSWRlbnRpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkZpZWxkSWRlbnRpZmllcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5SZWFkQ29tbWFuZDsKQEAgLTUwLDYgKzU2LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk9yZGVyUHJlc2VydmluZ1BhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5kb21QYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLkFwcGxpY2F0aW9uU3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLkVuZHBvaW50U3RhdGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZ21zLkhlYXJ0QmVhdFN0YXRlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmdtcy5WZXJzaW9uZWRWYWx1ZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5sb2NhdG9yLkluZXRBZGRyZXNzQW5kUG9ydDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5uZXQuQ29ubmVjdGlvblR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubmV0Lk1lc3NhZ2U7CkBAIC0yMDIsNyArMjEyLDcgQEAKICAgICAgICAgfQogICAgICAgICBDb2x1bW5JZGVudGlmaWVyIG5hbWUgPSBuZXcgQ29sdW1uSWRlbnRpZmllcihzdHIsIHRydWUpOwogICAgICAgICBpbnQgcG9zaXRpb24gPSAha2luZC5pc1ByaW1hcnlLZXlLaW5kKCkgPyAtMSA6IChpbnQpIHJuZC5uZXh0KENvbnN0cmFpbnQuYmV0d2VlbigwLCAzMCkpOwotICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1ldGFkYXRhKGtzLCB0YWJsZSwgbmFtZSwgdHlwZUdlbi5nZW5lcmF0ZShybmQpLCBwb3NpdGlvbiwga2luZCk7CisgICAgICAgIHJldHVybiBuZXcgQ29sdW1uTWV0YWRhdGEoa3MsIHRhYmxlLCBuYW1lLCB0eXBlR2VuLmdlbmVyYXRlKHJuZCksIHBvc2l0aW9uLCBraW5kLCBudWxsKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIEdlbjxCeXRlQnVmZmVyPiBwYXJ0aXRpb25LZXlEYXRhR2VuKFRhYmxlTWV0YWRhdGEgbWV0YWRhdGEpCkBAIC0zMTYsNCArMzI2LDE2NiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9LCB0cnVlKTsKICAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEdlbjxUb2tlbj4gbXVybXVyVG9rZW4oKQorICAgIHsKKyAgICAgICAgQ29uc3RyYWludCB0b2tlbiA9IENvbnN0cmFpbnQuYmV0d2VlbihMb25nLk1JTl9WQUxVRSwgTG9uZy5NQVhfVkFMVUUpOworICAgICAgICByZXR1cm4gcnMgLT4gbmV3IE11cm11cjNQYXJ0aXRpb25lci5Mb25nVG9rZW4ocnMubmV4dCh0b2tlbikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgR2VuPFRva2VuPiBieXRlT3JkZXJUb2tlbigpCisgICAgeworICAgICAgICBDb25zdHJhaW50IHNpemUgPSBDb25zdHJhaW50LmJldHdlZW4oMCwgMTApOworICAgICAgICBDb25zdHJhaW50IGJ5dGVSYW5nZSA9IENvbnN0cmFpbnQuYmV0d2VlbihCeXRlLk1JTl9WQUxVRSwgQnl0ZS5NQVhfVkFMVUUpOworICAgICAgICByZXR1cm4gcnMgLT4geworICAgICAgICAgICAgYnl0ZVtdIHRva2VuID0gbmV3IGJ5dGVbTWF0aC50b0ludEV4YWN0KHJzLm5leHQoc2l6ZSkpXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoOyBpKyspCisgICAgICAgICAgICAgICAgdG9rZW5baV0gPSAoYnl0ZSkgcnMubmV4dChieXRlUmFuZ2UpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLkJ5dGVzVG9rZW4odG9rZW4pOworICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgR2VuPFRva2VuPiByYW5kb21QYXJ0aXRpb25lclRva2VuKCkKKyAgICB7CisgICAgICAgIENvbnN0cmFpbnQgZG9tYWluID0gQ29uc3RyYWludC5ub25lKCk7CisgICAgICAgIHJldHVybiBycyAtPiBuZXcgUmFuZG9tUGFydGl0aW9uZXIuQmlnSW50ZWdlclRva2VuKEJpZ0ludGVnZXIudmFsdWVPZihycy5uZXh0KGRvbWFpbikpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEdlbjxUb2tlbj4gbG9jYWxQYXJ0aXRpb25lclRva2VuKExvY2FsUGFydGl0aW9uZXIgcGFydGl0aW9uZXIpCisgICAgeworICAgICAgICBHZW48Qnl0ZUJ1ZmZlcj4gYnl0ZXMgPSBBYnN0cmFjdFR5cGVHZW5lcmF0b3JzLmdldFR5cGVTdXBwb3J0KHBhcnRpdGlvbmVyLmdldFRva2VuVmFsaWRhdG9yKCkpLmJ5dGVzR2VuKCk7CisgICAgICAgIHJldHVybiBycyAtPiBwYXJ0aXRpb25lci5nZXRUb2tlbihieXRlcy5nZW5lcmF0ZShycykpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgR2VuPFRva2VuPiBvcmRlclByZXNlcnZpbmdUb2tlbigpCisgICAgeworICAgICAgICBHZW48U3RyaW5nPiBzdHJpbmcgPSBHZW5lcmF0b3JzLnV0ZjgoMCwgMTApOworICAgICAgICByZXR1cm4gcnMgLT4gbmV3IE9yZGVyUHJlc2VydmluZ1BhcnRpdGlvbmVyLlN0cmluZ1Rva2VuKHN0cmluZy5nZW5lcmF0ZShycykpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgR2VuPFRva2VuPiB0b2tlbihJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIpCisgICAgeworICAgICAgICBpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBNdXJtdXIzUGFydGl0aW9uZXIpIHJldHVybiBtdXJtdXJUb2tlbigpOworICAgICAgICBpZiAocGFydGl0aW9uZXIgaW5zdGFuY2VvZiBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyKSByZXR1cm4gYnl0ZU9yZGVyVG9rZW4oKTsKKyAgICAgICAgaWYgKHBhcnRpdGlvbmVyIGluc3RhbmNlb2YgUmFuZG9tUGFydGl0aW9uZXIpIHJldHVybiByYW5kb21QYXJ0aXRpb25lclRva2VuKCk7CisgICAgICAgIGlmIChwYXJ0aXRpb25lciBpbnN0YW5jZW9mIExvY2FsUGFydGl0aW9uZXIpIHJldHVybiBsb2NhbFBhcnRpdGlvbmVyVG9rZW4oKExvY2FsUGFydGl0aW9uZXIpIHBhcnRpdGlvbmVyKTsKKyAgICAgICAgaWYgKHBhcnRpdGlvbmVyIGluc3RhbmNlb2YgT3JkZXJQcmVzZXJ2aW5nUGFydGl0aW9uZXIpIHJldHVybiBvcmRlclByZXNlcnZpbmdUb2tlbigpOworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlVuc3VwcG9ydGVkIHBhcnRpdGlvbmVyOiAiICsgcGFydGl0aW9uZXIuZ2V0Q2xhc3MoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBHZW48PyBleHRlbmRzIENvbGxlY3Rpb248VG9rZW4+PiB0b2tlbnMoSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKQorICAgIHsKKyAgICAgICAgR2VuPFRva2VuPiB0b2tlbkdlbiA9IHRva2VuKHBhcnRpdGlvbmVyKTsKKyAgICAgICAgcmV0dXJuIFNvdXJjZURTTC5saXN0cygpLm9mKHRva2VuR2VuKS5vZlNpemVCZXR3ZWVuKDEsIDE2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEdlbjxIZWFydEJlYXRTdGF0ZT4gaGVhcnRCZWF0U3RhdGVzKCkKKyAgICB7CisgICAgICAgIENvbnN0cmFpbnQgZ2VuZXJhdGlvbkRvbWFpbiA9IENvbnN0cmFpbnQuYmV0d2VlbigwLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgIENvbnN0cmFpbnQgdmVyc2lvbkRvbWFpbiA9IENvbnN0cmFpbnQuYmV0d2VlbigtMSwgSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICByZXR1cm4gcnMgLT4gbmV3IEhlYXJ0QmVhdFN0YXRlKE1hdGgudG9JbnRFeGFjdChycy5uZXh0KGdlbmVyYXRpb25Eb21haW4pKSwgTWF0aC50b0ludEV4YWN0KHJzLm5leHQodmVyc2lvbkRvbWFpbikpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBHZW48TWFwPEFwcGxpY2F0aW9uU3RhdGUsIFZlcnNpb25lZFZhbHVlPj4gZ29zc2lwQXBwbGljYXRpb25TdGF0ZXMoKQorICAgIHsKKyAgICAgICAgLy9UT0RPIHN1cHBvcnQgYWxsIGFwcGxpY2F0aW9uIHN0YXRlcy4uLgorICAgICAgICAvLyBhdG0gb25seSB1c2VkIGJ5IGEgc2luZ2xlIHRlc3QsIHdoaWNoIG9ubHkgbG9va3MgYXQgc3RhdHVzCisgICAgICAgIEdlbjxCb29sZWFuPiBzdGF0dXNXaXRoUG9ydCA9IFNvdXJjZURTTC5ib29sZWFucygpLmFsbCgpOworICAgICAgICBHZW48VmVyc2lvbmVkVmFsdWU+IHN0YXR1c0dlbiA9IGdvc3NpcFN0YXR1c1ZhbHVlKCk7CisKKyAgICAgICAgcmV0dXJuIHJzIC0+IHsKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uU3RhdGUgc3RhdHVzU3RhdGUgPSBzdGF0dXNXaXRoUG9ydC5nZW5lcmF0ZShycykgPyBBcHBsaWNhdGlvblN0YXRlLlNUQVRVU19XSVRIX1BPUlQgOiBBcHBsaWNhdGlvblN0YXRlLlNUQVRVUzsKKyAgICAgICAgICAgIFZlcnNpb25lZFZhbHVlIHZ2ID0gc3RhdHVzR2VuLmdlbmVyYXRlKHJzKTsKKyAgICAgICAgICAgIGlmICh2diA9PSBudWxsKSByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKCk7CisgICAgICAgICAgICByZXR1cm4gSW1tdXRhYmxlTWFwLm9mKHN0YXR1c1N0YXRlLCB2dik7CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgR2VuPFN0cmluZz4gZ29zc2lwU3RhdHVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiBTb3VyY2VEU0wuYXJiaXRyYXJ5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5waWNrKFZlcnNpb25lZFZhbHVlLlNUQVRVU19OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uZWRWYWx1ZS5TVEFUVVNfQk9PVFNUUkFQUElOR19SRVBMQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmVkVmFsdWUuU1RBVFVTX0JPT1RTVFJBUFBJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uZWRWYWx1ZS5TVEFUVVNfTU9WSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmVkVmFsdWUuU1RBVFVTX0xFQVZJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uZWRWYWx1ZS5TVEFUVVNfTEVGVCwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIHdvdWxkIGJlIGdvb2QgdG8gcHJlZml4IHdpdGggU1RBVFVTXyBsaWtlIG90aGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmVkVmFsdWUuUkVNT1ZJTkdfVE9LRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uZWRWYWx1ZS5SRU1PVkVEX1RPS0VOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmVkVmFsdWUuSElCRVJOQVRFICsgVmVyc2lvbmVkVmFsdWUuREVMSU1JVEVSICsgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25lZFZhbHVlLkhJQkVSTkFURSArIFZlcnNpb25lZFZhbHVlLkRFTElNSVRFUiArIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmVkVmFsdWUuU0hVVERPV04gKyBWZXJzaW9uZWRWYWx1ZS5ERUxJTUlURVIgKyB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbmVkVmFsdWUuU0hVVERPV04gKyBWZXJzaW9uZWRWYWx1ZS5ERUxJTUlURVIgKyBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEdlbjxWZXJzaW9uZWRWYWx1ZT4gZ29zc2lwU3RhdHVzVmFsdWUoKQorICAgIHsKKyAgICAgICAgSVBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gRGF0YWJhc2VEZXNjcmlwdG9yLmdldFBhcnRpdGlvbmVyKCk7CisgICAgICAgIEdlbjxTdHJpbmc+IHN0YXR1c0dlbiA9IGdvc3NpcFN0YXR1cygpOworICAgICAgICBHZW48VG9rZW4+IHRva2VuR2VuID0gdG9rZW4ocGFydGl0aW9uZXIpOworICAgICAgICBHZW48PyBleHRlbmRzIENvbGxlY3Rpb248VG9rZW4+PiB0b2tlbnNHZW4gPSB0b2tlbnMocGFydGl0aW9uZXIpOworICAgICAgICBHZW48SW5ldEFkZHJlc3M+IGFkZHJlc3NHZW4gPSBHZW5lcmF0b3JzLklORVRfQUREUkVTU19HRU47CisgICAgICAgIEdlbjxJbmV0QWRkcmVzc0FuZFBvcnQ+IGFkZHJlc3NBbmRHZW5HZW4gPSBJTkVUX0FERFJFU1NfQU5EX1BPUlRfR0VOOworICAgICAgICBHZW48Qm9vbGVhbj4gYm9vbCA9IFNvdXJjZURTTC5ib29sZWFucygpLmFsbCgpOworICAgICAgICBDb25zdHJhaW50IG1pbGxpcyA9IENvbnN0cmFpbnQuYmV0d2VlbigwLCBMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIENvbnN0cmFpbnQgdmVyc2lvbiA9IENvbnN0cmFpbnQuYmV0d2VlbigwLCBJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgIEdlbjxVVUlEPiBob3N0SWQgPSBHZW5lcmF0b3JzLlVVSURfUkFORE9NX0dFTjsKKyAgICAgICAgVmVyc2lvbmVkVmFsdWUuVmVyc2lvbmVkVmFsdWVGYWN0b3J5IGZhY3RvcnkgPSBuZXcgVmVyc2lvbmVkVmFsdWUuVmVyc2lvbmVkVmFsdWVGYWN0b3J5KHBhcnRpdGlvbmVyKTsKKyAgICAgICAgcmV0dXJuIHJzIC0+IHsKKyAgICAgICAgICAgIFN0cmluZyBzdGF0dXMgPSBzdGF0dXNHZW4uZ2VuZXJhdGUocnMpOworICAgICAgICAgICAgc3dpdGNoIChzdGF0dXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAiIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgY2FzZSBWZXJzaW9uZWRWYWx1ZS5TVEFUVVNfTk9STUFMOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5ub3JtYWwodG9rZW5zR2VuLmdlbmVyYXRlKHJzKSkud2l0aFZlcnNpb24oTWF0aC50b0ludEV4YWN0KHJzLm5leHQodmVyc2lvbikpKTsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnNpb25lZFZhbHVlLlNUQVRVU19CT09UU1RSQVBQSU5HOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5ib290c3RyYXBwaW5nKHRva2Vuc0dlbi5nZW5lcmF0ZShycykpLndpdGhWZXJzaW9uKE1hdGgudG9JbnRFeGFjdChycy5uZXh0KHZlcnNpb24pKSk7CisgICAgICAgICAgICAgICAgY2FzZSBWZXJzaW9uZWRWYWx1ZS5TVEFUVVNfQk9PVFNUUkFQUElOR19SRVBMQUNFOgorICAgICAgICAgICAgICAgICAgICBpZiAoYm9vbC5nZW5lcmF0ZShycykpIHJldHVybiBmYWN0b3J5LmJvb3RSZXBsYWNpbmdXaXRoUG9ydChhZGRyZXNzQW5kR2VuR2VuLmdlbmVyYXRlKHJzKSkud2l0aFZlcnNpb24oTWF0aC50b0ludEV4YWN0KHJzLm5leHQodmVyc2lvbikpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gZmFjdG9yeS5ib290UmVwbGFjaW5nKGFkZHJlc3NHZW4uZ2VuZXJhdGUocnMpKS53aXRoVmVyc2lvbihNYXRoLnRvSW50RXhhY3QocnMubmV4dCh2ZXJzaW9uKSkpOworICAgICAgICAgICAgICAgIGNhc2UgVmVyc2lvbmVkVmFsdWUuU1RBVFVTX01PVklORzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkubW92aW5nKHRva2VuR2VuLmdlbmVyYXRlKHJzKSkud2l0aFZlcnNpb24oTWF0aC50b0ludEV4YWN0KHJzLm5leHQodmVyc2lvbikpKTsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnNpb25lZFZhbHVlLlNUQVRVU19MRUFWSU5HOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5sZWF2aW5nKHRva2Vuc0dlbi5nZW5lcmF0ZShycykpLndpdGhWZXJzaW9uKE1hdGgudG9JbnRFeGFjdChycy5uZXh0KHZlcnNpb24pKSk7CisgICAgICAgICAgICAgICAgY2FzZSBWZXJzaW9uZWRWYWx1ZS5TVEFUVVNfTEVGVDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkubGVmdCh0b2tlbnNHZW4uZ2VuZXJhdGUocnMpLCBycy5uZXh0KG1pbGxpcykpLndpdGhWZXJzaW9uKE1hdGgudG9JbnRFeGFjdChycy5uZXh0KHZlcnNpb24pKSk7CisgICAgICAgICAgICAgICAgY2FzZSBWZXJzaW9uZWRWYWx1ZS5SRU1PVklOR19UT0tFTjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkucmVtb3ZpbmdOb25sb2NhbChob3N0SWQuZ2VuZXJhdGUocnMpKS53aXRoVmVyc2lvbihNYXRoLnRvSW50RXhhY3QocnMubmV4dCh2ZXJzaW9uKSkpOworICAgICAgICAgICAgICAgIGNhc2UgVmVyc2lvbmVkVmFsdWUuUkVNT1ZFRF9UT0tFTjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkucmVtb3ZlZE5vbmxvY2FsKGhvc3RJZC5nZW5lcmF0ZShycyksIHJzLm5leHQobWlsbGlzKSkud2l0aFZlcnNpb24oTWF0aC50b0ludEV4YWN0KHJzLm5leHQodmVyc2lvbikpKTsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnNpb25lZFZhbHVlLkhJQkVSTkFURSArIFZlcnNpb25lZFZhbHVlLkRFTElNSVRFUiArIHRydWU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmhpYmVybmF0ZSh0cnVlKS53aXRoVmVyc2lvbihNYXRoLnRvSW50RXhhY3QocnMubmV4dCh2ZXJzaW9uKSkpOworICAgICAgICAgICAgICAgIGNhc2UgVmVyc2lvbmVkVmFsdWUuSElCRVJOQVRFICsgVmVyc2lvbmVkVmFsdWUuREVMSU1JVEVSICsgZmFsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LmhpYmVybmF0ZShmYWxzZSkud2l0aFZlcnNpb24oTWF0aC50b0ludEV4YWN0KHJzLm5leHQodmVyc2lvbikpKTsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnNpb25lZFZhbHVlLlNIVVRET1dOICsgVmVyc2lvbmVkVmFsdWUuREVMSU1JVEVSICsgdHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnkuc2h1dGRvd24odHJ1ZSkud2l0aFZlcnNpb24oTWF0aC50b0ludEV4YWN0KHJzLm5leHQodmVyc2lvbikpKTsKKyAgICAgICAgICAgICAgICBjYXNlIFZlcnNpb25lZFZhbHVlLlNIVVRET1dOICsgVmVyc2lvbmVkVmFsdWUuREVMSU1JVEVSICsgZmFsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LnNodXRkb3duKGZhbHNlKS53aXRoVmVyc2lvbihNYXRoLnRvSW50RXhhY3QocnMubmV4dCh2ZXJzaW9uKSkpOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiVW5leHBlY3RlZCBzdGF0dXM6ICIgKyBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgR2VuPEVuZHBvaW50U3RhdGU+IGVuZHBvaW50U3RhdGVzKCkKKyAgICB7CisgICAgICAgIEdlbjxIZWFydEJlYXRTdGF0ZT4gaGJHZW4gPSBoZWFydEJlYXRTdGF0ZXMoKTsKKyAgICAgICAgR2VuPE1hcDxBcHBsaWNhdGlvblN0YXRlLCBWZXJzaW9uZWRWYWx1ZT4+IGFwcFN0YXRlcyA9IGdvc3NpcEFwcGxpY2F0aW9uU3RhdGVzKCk7CisgICAgICAgIEdlbjxCb29sZWFuPiBhbGl2ZSA9IFNvdXJjZURTTC5ib29sZWFucygpLmFsbCgpOworICAgICAgICBDb25zdHJhaW50IHVwZGF0ZVRpbWVzdGFtcCA9IENvbnN0cmFpbnQuYmV0d2VlbigwLCBMb25nLk1BWF9WQUxVRSk7CisgICAgICAgIHJldHVybiBycyAtPiB7CisgICAgICAgICAgICBFbmRwb2ludFN0YXRlIHN0YXRlID0gbmV3IEVuZHBvaW50U3RhdGUoaGJHZW4uZ2VuZXJhdGUocnMpKTsKKyAgICAgICAgICAgIE1hcDxBcHBsaWNhdGlvblN0YXRlLCBWZXJzaW9uZWRWYWx1ZT4gbWFwID0gYXBwU3RhdGVzLmdlbmVyYXRlKHJzKTsKKyAgICAgICAgICAgIGlmICghbWFwLmlzRW1wdHkoKSkgc3RhdGUuYWRkQXBwbGljYXRpb25TdGF0ZXMobWFwKTsKKyAgICAgICAgICAgIGlmIChhbGl2ZS5nZW5lcmF0ZShycykpIHN0YXRlLm1hcmtBbGl2ZSgpOworICAgICAgICAgICAgZWxzZSBzdGF0ZS5tYXJrRGVhZCgpOworICAgICAgICAgICAgc3RhdGUudW5zYWZlU2V0VXBkYXRlVGltZXN0YW1wKHJzLm5leHQodXBkYXRlVGltZXN0YW1wKSk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIH07CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0dlbmVyYXRvcnMuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9HZW5lcmF0b3JzLmphdmEKaW5kZXggMTc5YzBmNC4uMWJhYTE2ZSAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL0dlbmVyYXRvcnMuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvR2VuZXJhdG9ycy5qYXZhCkBAIC0zOSw2ICszOSw4IEBACiBpbXBvcnQgb3JnLnF1aWNrdGhlb3JpZXMuZ2VuZXJhdG9ycy5Tb3VyY2VEU0w7CiBpbXBvcnQgb3JnLnF1aWNrdGhlb3JpZXMuaW1wbC5Db25zdHJhaW50OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuVEVTVF9CTE9CX1NIQVJFRF9TRUVEOworCiBwdWJsaWMgZmluYWwgY2xhc3MgR2VuZXJhdG9ycwogewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihHZW5lcmF0b3JzLmNsYXNzKTsKQEAgLTMwMCw2ICszMDIsMTYgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgR2VuPEJ5dGVCdWZmZXI+IGJ5dGVzKGludCBtaW4sIGludCBtYXgpCiAgICAgeworICAgICAgICByZXR1cm4gYnl0ZXMobWluLCBtYXgsIFNvdXJjZURTTC5hcmJpdHJhcnkoKS5jb25zdGFudChCQkNhc2VzLkhFQVApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEdlbjxCeXRlQnVmZmVyPiBieXRlc0FueVR5cGUoaW50IG1pbiwgaW50IG1heCkKKyAgICB7CisgICAgICAgIHJldHVybiBieXRlcyhtaW4sIG1heCwgU291cmNlRFNMLmFyYml0cmFyeSgpLmVudW1WYWx1ZXMoQkJDYXNlcy5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEdlbjxCeXRlQnVmZmVyPiBieXRlcyhpbnQgbWluLCBpbnQgbWF4LCBHZW48QkJDYXNlcz4gY2FzZXMpCisgICAgewogICAgICAgICBpZiAobWluIDwgMCkKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFza2VkIGZvciBuZWdhdGl2ZSBieXRlczsgZ2l2ZW4gIiArIG1pbik7CiAgICAgICAgIGlmIChtYXggPiBNQVhfQkxPQl9MRU5HVEgpCkBAIC0zMTQsMTEgKzMyNiwzMSBAQAogICAgICAgICAgICAgLy8gdG8gYWRkIG1vcmUgcmFuZG9tbmVzcywgYWxzbyBzaGlmdCBvZmZzZXQgaW4gdGhlIGFycmF5IHNvIHRoZSBzYW1lIHNpemUgZG9lc24ndCB5aWVsZCB0aGUgc2FtZSBieXRlcwogICAgICAgICAgICAgaW50IG9mZnNldCA9IChpbnQpIHJuZC5uZXh0KENvbnN0cmFpbnQuYmV0d2VlbigwLCBNQVhfQkxPQl9MRU5HVEggLSBzaXplKSk7CiAKLSAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAoTGF6eVNoYXJlZEJsb2IuU0hBUkVEX0JZVEVTLCBvZmZzZXQsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUNhc2VzKGNhc2VzLCBybmQsIG9mZnNldCwgc2l6ZSk7CiAgICAgICAgIH07CisgICAgfTsKKworICAgIHByaXZhdGUgZW51bSBCQkNhc2VzIHsgSEVBUCwgUkVBRF9PTkxZX0hFQVAsIERJUkVDVCwgUkVBRF9PTkxZX0RJUkVDVCB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQnVmZmVyIGhhbmRsZUNhc2VzKEdlbjxCQkNhc2VzPiBjYXNlcywgUmFuZG9tbmVzc1NvdXJjZSBybmQsIGludCBvZmZzZXQsIGludCBzaXplKSB7CisgICAgICAgIHN3aXRjaCAoY2FzZXMuZ2VuZXJhdGUocm5kKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBIRUFQOiByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKExhenlTaGFyZWRCbG9iLlNIQVJFRF9CWVRFUywgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgICAgIGNhc2UgUkVBRF9PTkxZX0hFQVA6IHJldHVybiBCeXRlQnVmZmVyLndyYXAoTGF6eVNoYXJlZEJsb2IuU0hBUkVEX0JZVEVTLCBvZmZzZXQsIHNpemUpLmFzUmVhZE9ubHlCdWZmZXIoKTsKKyAgICAgICAgICAgIGNhc2UgRElSRUNUOiByZXR1cm4gZGlyZWN0QnVmZmVyRnJvbVNoYXJlZEJsb2Iob2Zmc2V0LCBzaXplKTsKKyAgICAgICAgICAgIGNhc2UgUkVBRF9PTkxZX0RJUkVDVDogcmV0dXJuIGRpcmVjdEJ1ZmZlckZyb21TaGFyZWRCbG9iKG9mZnNldCwgc2l6ZSkuYXNSZWFkT25seUJ1ZmZlcigpOworICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJjYW4ndCB3YWl0IGZvciBqZGsgMTchIik7CisgICAgICAgIH0KICAgICB9CiAKLSAgICAvKioKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQnVmZmVyIGRpcmVjdEJ1ZmZlckZyb21TaGFyZWRCbG9iKGludCBvZmZzZXQsIGludCBzaXplKSB7CisgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlRGlyZWN0KHNpemUpOworICAgICAgICBiYi5wdXQoTGF6eVNoYXJlZEJsb2IuU0hBUkVEX0JZVEVTLCBvZmZzZXQsIHNpemUpOworICAgICAgICBiYi5mbGlwKCk7CisgICAgICAgIHJldHVybiBiYjsKKyAgICB9CisKKyAgICAgLyoqCiAgICAgICogSW1wbGVtZW50cyBhIHZhbGlkIHV0Zi04IGdlbmVyYXRvci4KICAgICAgKgogICAgICAqIEltcGxlbWVudGF0aW9uIG5vdGUsIGN1cnJlbnRseSByZWxpZXMgb24gZ2V0Qnl0ZXMgdG8gc3RyaXAgb3V0IG5vbi12YWxpZCB1dGYtOCBjaGFycywgc28gaXMgc2xvdwpAQCAtMzQ5LDcgKzM4MSw3IEBACiAKICAgICAgICAgc3RhdGljCiAgICAgICAgIHsKLSAgICAgICAgICAgIGxvbmcgYmxvYlNlZWQgPSBMb25nLnBhcnNlTG9uZyhTeXN0ZW0uZ2V0UHJvcGVydHkoImNhc3NhbmRyYS50ZXN0LmJsb2Iuc2hhcmVkLnNlZWQiLCBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSkpOworICAgICAgICAgICAgbG9uZyBibG9iU2VlZCA9IFRFU1RfQkxPQl9TSEFSRURfU0VFRC5nZXRMb25nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJTaGFyZWQgYmxvYiBHZW4gdXNlZCBzZWVkIHt9IiwgYmxvYlNlZWQpOwogCiAgICAgICAgICAgICBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbShibG9iU2VlZCk7CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU2VyaWFsaXphdGlvbnNUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU2VyaWFsaXphdGlvbnNUZXN0LmphdmEKaW5kZXggYmUyMzVlNi4uZTIzYmIzOCAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1NlcmlhbGl6YXRpb25zVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9TZXJpYWxpemF0aW9uc1Rlc3QuamF2YQpAQCAtMTgsMTAgKzE4LDggQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKIAotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLkZpbGVJbnB1dFN0cmVhbVBsdXM7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CkBAIC0zMSwxMiArMjksMTIgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkludDMyVHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dFBsdXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0U3RyZWFtUGx1czsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm9icy5PZmZIZWFwQml0U2V0OwotCiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZUlucHV0U3RyZWFtUGx1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5vYnMuT2ZmSGVhcEJpdFNldDsKIAogcHVibGljIGNsYXNzIFNlcmlhbGl6YXRpb25zVGVzdCBleHRlbmRzIEFic3RyYWN0U2VyaWFsaXphdGlvbnNUZXN0ZXIKIHsKQEAgLTY1LDcgKzYzLDcgQEAKICAgICAgICAgICAgICAgICBpZiAob2xkQmZGb3JtYXQpCiAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZU9sZEJmRm9ybWF0KChCbG9vbUZpbHRlcikgYmYsIG91dCk7CiAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuc2VyaWFsaXplKChCbG9vbUZpbHRlcikgYmYsIG91dCk7CisgICAgICAgICAgICAgICAgICAgIEJsb29tRmlsdGVyU2VyaWFsaXplci5mb3JWZXJzaW9uKGZhbHNlKS5zZXJpYWxpemUoKEJsb29tRmlsdGVyKSBiZiwgb3V0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTgwLDcgKzc4LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHRyeSAoRmlsZUlucHV0U3RyZWFtUGx1cyBpbiA9IGdldElucHV0KCI0LjAiLCAidXRpbHMuQmxvb21GaWx0ZXIxMDAwLmJpbiIpOwotICAgICAgICAgICAgIElGaWx0ZXIgZmlsdGVyID0gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmRlc2VyaWFsaXplKGluLCBmYWxzZSkpCisgICAgICAgICAgICAgSUZpbHRlciBmaWx0ZXIgPSBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZm9yVmVyc2lvbihmYWxzZSkuZGVzZXJpYWxpemUoaW4pKQogICAgICAgICB7CiAgICAgICAgICAgICBib29sZWFuIHByZXNlbnQ7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCAxMDAwIDsgaSsrKQpAQCAtOTYsNyArOTQsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgdHJ5IChGaWxlSW5wdXRTdHJlYW1QbHVzIGluID0gZ2V0SW5wdXQoIjMuMCIsICJ1dGlscy5CbG9vbUZpbHRlcjEwMDAuYmluIik7Ci0gICAgICAgICAgICAgSUZpbHRlciBmaWx0ZXIgPSBCbG9vbUZpbHRlclNlcmlhbGl6ZXIuZGVzZXJpYWxpemUoaW4sIHRydWUpKQorICAgICAgICAgICAgIElGaWx0ZXIgZmlsdGVyID0gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmZvclZlcnNpb24odHJ1ZSkuZGVzZXJpYWxpemUoaW4pKQogICAgICAgICB7CiAgICAgICAgICAgICBib29sZWFuIHByZXNlbnQ7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMCA7IGkgPCAxMDAwIDsgaSsrKQpAQCAtMTE4LDEyICsxMTYsMTIgQEAKICAgICAgICAgdGVzdEJsb29tRmlsdGVyVGFibGUoInRlc3QvZGF0YS9ibG9vbS1maWx0ZXIvbGEvZm9vL2xhLTEtYmlnLUZpbHRlci5kYiIsIHRydWUpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdEJsb29tRmlsdGVyVGFibGUoU3RyaW5nIGZpbGUsIGJvb2xlYW4gb2xkQmZGb3JtYXQpIHRocm93cyBFeGNlcHRpb24KKyAgICBwcml2YXRlIHZvaWQgdGVzdEJsb29tRmlsdGVyVGFibGUoU3RyaW5nIGZpbGUsIGJvb2xlYW4gb2xkQmZGb3JtYXQpIHRocm93cyBFeGNlcHRpb24KICAgICB7CiAgICAgICAgIE11cm11cjNQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IG5ldyBNdXJtdXIzUGFydGl0aW9uZXIoKTsKIAotICAgICAgICB0cnkgKERhdGFJbnB1dFN0cmVhbSBpbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbVBsdXMobmV3IEZpbGUoZmlsZSkpKTsKLSAgICAgICAgICAgICBJRmlsdGVyIGZpbHRlciA9IEJsb29tRmlsdGVyU2VyaWFsaXplci5kZXNlcmlhbGl6ZShpbiwgb2xkQmZGb3JtYXQpKQorICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbVBsdXMgaW4gPSBuZXcgRmlsZShmaWxlKS5uZXdJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgIElGaWx0ZXIgZmlsdGVyID0gQmxvb21GaWx0ZXJTZXJpYWxpemVyLmZvclZlcnNpb24ob2xkQmZGb3JtYXQpLmRlc2VyaWFsaXplKGluKSkKICAgICAgICAgewogICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gMTA7IGkrKykKICAgICAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9TaW1wbGVHcmFwaC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1NpbXBsZUdyYXBoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiMWZiMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9TaW1wbGVHcmFwaC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5hdmlnYWJsZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuT3JkZXJpbmc7CisKKy8qKgorICogQSBkaXJlY3RlZCBncmFwaC4gTWFpbiB1c2FnZSBpcyB0aGUge0BsaW5rICNmaW5kUGF0aHMoT2JqZWN0LCBPYmplY3QpfSBtZXRob2Qgd2hpY2ggaXMgdXNlZCB0byBmaW5kIGFsbCBwYXRocyBiZXR3ZWVuCisgKiAyIHZlcnRpY2VzLgorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlR3JhcGg8Vj4KK3sKKyAgICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZU1hcDxWLCBJbW11dGFibGVTZXQ8Vj4+IGVkZ2VzOworCisgICAgcHJpdmF0ZSBTaW1wbGVHcmFwaChJbW11dGFibGVNYXA8ViwgSW1tdXRhYmxlU2V0PFY+PiBlZGdlcykKKyAgICB7CisgICAgICAgIGlmIChlZGdlcyA9PSBudWxsIHx8IGVkZ2VzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiRWRnZXMgZW1wdHkiKTsKKyAgICAgICAgdGhpcy5lZGdlcyA9IGVkZ2VzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBDb21wYXJhYmxlPFQ+PiBOYXZpZ2FibGVTZXQ8VD4gc29ydGVkVmVydGljZXMoU2ltcGxlR3JhcGg8VD4gZ3JhcGgpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFRyZWVTZXQ8PihncmFwaC52ZXJ0aWNlcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTxUPj4gVCBtaW4oU2ltcGxlR3JhcGg8VD4gZ3JhcGgpCisgICAgeworICAgICAgICByZXR1cm4gT3JkZXJpbmcubmF0dXJhbCgpLm1pbihncmFwaC52ZXJ0aWNlcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQ29tcGFyYWJsZTxUPj4gVCBtYXgoU2ltcGxlR3JhcGg8VD4gZ3JhcGgpCisgICAgeworICAgICAgICByZXR1cm4gT3JkZXJpbmcubmF0dXJhbCgpLm1heChncmFwaC52ZXJ0aWNlcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNFZGdlKFYgYSwgViBiKQorICAgIHsKKyAgICAgICAgSW1tdXRhYmxlU2V0PFY+IG1hdGNoZXMgPSBlZGdlcy5nZXQoYSk7CisgICAgICAgIHJldHVybiBtYXRjaGVzICE9IG51bGwgJiYgbWF0Y2hlcy5jb250YWlucyhiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSW1tdXRhYmxlU2V0PFY+IHZlcnRpY2VzKCkKKyAgICB7CisgICAgICAgIEltbXV0YWJsZVNldC5CdWlsZGVyPFY+IGIgPSBJbW11dGFibGVTZXQuYnVpbGRlcigpOworICAgICAgICBiLmFkZEFsbChlZGdlcy5rZXlTZXQoKSk7CisgICAgICAgIGVkZ2VzLnZhbHVlcygpLmZvckVhY2goYjo6YWRkQWxsKTsKKyAgICAgICAgcmV0dXJuIGIuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxMaXN0PFY+PiBmaW5kUGF0aHMoViBmcm9tLCBWIHRvKQorICAgIHsKKyAgICAgICAgTGlzdDxMaXN0PFY+PiBtYXRjaGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZpbmRQYXRoczAoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChmcm9tKSwgZnJvbSwgdG8sIG1hdGNoZXM6OmFkZCk7CisgICAgICAgIHJldHVybiBtYXRjaGVzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaW5kUGF0aHMwKExpc3Q8Vj4gYWNjdW0sIFYgZnJvbSwgViB0bywgQ29uc3VtZXI8TGlzdDxWPj4gb25NYXRjaCkKKyAgICB7CisgICAgICAgIEltbXV0YWJsZVNldDxWPiBjaGVjayA9IGVkZ2VzLmdldChmcm9tKTsKKyAgICAgICAgaWYgKGNoZWNrID09IG51bGwpCisgICAgICAgICAgICByZXR1cm47IC8vIG5vIG1hdGNoZXMKKyAgICAgICAgZm9yIChWIG5leHQgOiBjaGVjaykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGFjY3VtLmNvbnRhaW5zKG5leHQpKQorICAgICAgICAgICAgICAgIHJldHVybjsgLy8gaWdub3JlIHdhbGtpbmcgcmVjdXJzaXZlCisgICAgICAgICAgICBMaXN0PFY+IG5leHRBY2N1bSA9IG5ldyBBcnJheUxpc3Q8PihhY2N1bSk7CisgICAgICAgICAgICBuZXh0QWNjdW0uYWRkKG5leHQpOworICAgICAgICAgICAgaWYgKG5leHQuZXF1YWxzKHRvKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvbk1hdGNoLmFjY2VwdChuZXh0QWNjdW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpbmRQYXRoczAobmV4dEFjY3VtLCBuZXh0LCB0bywgb25NYXRjaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXI8Vj4KKyAgICB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFYsIFNldDxWPj4gZWRnZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgcHVibGljIEJ1aWxkZXI8Vj4gYWRkRWRnZShWIGZyb20sIFYgdG8pCisgICAgICAgIHsKKyAgICAgICAgICAgIGVkZ2VzLmNvbXB1dGVJZkFic2VudChmcm9tLCBpZ25vcmUgLT4gbmV3IEhhc2hTZXQ8PigpKS5hZGQodG8pOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2ltcGxlR3JhcGg8Vj4gYnVpbGQoKQorICAgICAgICB7CisgICAgICAgICAgICBJbW11dGFibGVNYXAuQnVpbGRlcjxWLCBJbW11dGFibGVTZXQ8Vj4+IGJ1aWxkZXIgPSBJbW11dGFibGVNYXAuYnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8ViwgU2V0PFY+PiBlIDogZWRnZXMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgICAgICBidWlsZGVyLnB1dChlLmdldEtleSgpLCBJbW11dGFibGVTZXQuY29weU9mKGUuZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVHcmFwaChidWlsZGVyLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1NpbXBsZUdyYXBoVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL1NpbXBsZUdyYXBoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZGVlMzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvU2ltcGxlR3JhcGhUZXN0LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFzc2VydGouY29yZS5hcGkuQXNzZXJ0aW9uczsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXNzZXJ0ai5jb3JlLmFwaS5Bc3NlcnRpb25zLmFzc2VydFRoYXQ7CisKK3B1YmxpYyBjbGFzcyBTaW1wbGVHcmFwaFRlc3QKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGVtcHR5KCkKKyAgICB7CisgICAgICAgIEFzc2VydGlvbnMuYXNzZXJ0VGhhdFRocm93bkJ5KCgpIC0+IG5ldyBTaW1wbGVHcmFwaC5CdWlsZGVyPFN0cmluZz4oKS5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgLmlzSW5zdGFuY2VPZihBc3NlcnRpb25FcnJvci5jbGFzcykKKyAgICAgICAgICAgICAgICAgIC5oYXNNZXNzYWdlKCJFZGdlcyBlbXB0eSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElmIHZlcnRpY2VzIGhhdmUgZWRnZXMgdGhhdCBmb3JtIGEgY2lyY2xlIHRoaXMgc2hvdWxkIG5vdCBjYXVzZSB7QGxpbmsgU2ltcGxlR3JhcGgjZmluZFBhdGhzKE9iamVjdCwgT2JqZWN0KX0gdG8KKyAgICAgKiBoYW5nLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVjdXJzaXZlKCkKKyAgICB7CisgICAgICAgIFNpbXBsZUdyYXBoPFN0cmluZz4gZ3JhcGggPSBvZigiQSIsICJCIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCIiwgIkMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkMiLCAiQSIpOworICAgICAgICAvLyBubyBwYXRocyB0byBpZGVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGdyYXBoLmZpbmRQYXRocygiQSIsICJBIikpLmlzRW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChncmFwaC5maW5kUGF0aHMoIkIiLCAiQiIpKS5pc0VtcHR5KCk7CisgICAgICAgIGFzc2VydFRoYXQoZ3JhcGguZmluZFBhdGhzKCJDIiwgIkMiKSkuaXNFbXB0eSgpOworCisgICAgICAgIGFzc2VydFRoYXQoZ3JhcGguZmluZFBhdGhzKCJDIiwgIkIiKSkuaXNFcXVhbFRvKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoQXJyYXlzLmFzTGlzdCgiQyIsICJBIiwgIkIiKSkpOworCisgICAgICAgIC8vIGFsbCBvcHRpb25zIHJldHVybiBhbmQgZG9uJ3QgaGF2ZSBkdXBsaWNhdGUga2V5cworICAgICAgICBmb3IgKFN0cmluZyBpIDogZ3JhcGgudmVydGljZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgaiA6IGdyYXBoLnZlcnRpY2VzKCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTGlzdDxMaXN0PFN0cmluZz4+IHBhdGhzID0gZ3JhcGguZmluZFBhdGhzKGksIGopOworICAgICAgICAgICAgICAgIGZvciAoTGlzdDxTdHJpbmc+IHBhdGggOiBwYXRocykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IGRpc3RpbmN0ID0gY291bnREaXN0aW5jdChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBlIDogZGlzdGluY3QuZW50cnlTZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoZS5nZXRWYWx1ZSgpKS5kZXNjcmliZWRBcygiRHVwbGljYXRlIHZlcnRleCAlcyBmb3VuZDsgJXMiLCBlLmdldEtleSgpLCBwYXRoKS5pc0VxdWFsVG8oMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaW1wbGUoKQorICAgIHsKKyAgICAgICAgU2ltcGxlR3JhcGg8U3RyaW5nPiBncmFwaCA9IG9mKCJBIiwgIkIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkIiLCAiQyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQyIsICJEIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChncmFwaC5maW5kUGF0aHMoIkEiLCAiQiIpKS5pc0VxdWFsVG8oQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChBcnJheXMuYXNMaXN0KCJBIiwgIkIiKSkpOworICAgICAgICBhc3NlcnRUaGF0KGdyYXBoLmZpbmRQYXRocygiQSIsICJDIikpLmlzRXF1YWxUbyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEFycmF5cy5hc0xpc3QoIkEiLCAiQiIsICJDIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChncmFwaC5maW5kUGF0aHMoIkIiLCAiRCIpKS5pc0VxdWFsVG8oQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChBcnJheXMuYXNMaXN0KCJCIiwgIkMiLCAiRCIpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChncmFwaC5oYXNFZGdlKCJBIiwgIkIiKSkuaXNUcnVlKCk7CisgICAgICAgIGFzc2VydFRoYXQoZ3JhcGguaGFzRWRnZSgiQyIsICJEIikpLmlzVHJ1ZSgpOworICAgICAgICBhc3NlcnRUaGF0KGdyYXBoLmhhc0VkZ2UoIkIiLCAiQSIpKS5pc0ZhbHNlKCk7CisgICAgICAgIGFzc2VydFRoYXQoZ3JhcGguaGFzRWRnZSgiQyIsICJCIikpLmlzRmFsc2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gTWFwPFQsIEludGVnZXI+IGNvdW50RGlzdGluY3QoTGlzdDxUPiBsaXN0KQorICAgIHsKKyAgICAgICAgTWFwPFQsIEludGVnZXI+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChUIHQgOiBsaXN0KQorICAgICAgICAgICAgbWFwLmNvbXB1dGUodCwgKGlnbm9yZSwgYWNjdW0pIC0+IGFjY3VtID09IG51bGwgPyAxIDogYWNjdW0gKyAxKTsKKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICB9CisKKyAgICBzdGF0aWMgPFQ+IFNpbXBsZUdyYXBoPFQ+IG9mKFQuLi4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgYXNzZXJ0IHZhbHVlcy5sZW5ndGggJSAyID09IDA6ICJncmFwaCByZXF1aXJlcyBldmVuIG51bWJlciBvZiB2YWx1ZXMsIGJ1dCBnaXZlbiAiICsgdmFsdWVzLmxlbmd0aDsKKyAgICAgICAgU2ltcGxlR3JhcGguQnVpbGRlcjxUPiBidWlsZGVyID0gbmV3IFNpbXBsZUdyYXBoLkJ1aWxkZXI8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkgPSBpICsgMikKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkRWRnZSh2YWx1ZXNbaV0sIHZhbHVlc1tpICsgMV0pOworICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvVGVlRGF0YUlucHV0UGx1c1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9UZWVEYXRhSW5wdXRQbHVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYWM5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvVGVlRGF0YUlucHV0UGx1c1Rlc3QuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlsczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YUlucHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRGF0YU91dHB1dEJ1ZmZlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby51dGlsLlRlZURhdGFJbnB1dFBsdXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIFRlZURhdGFJbnB1dFBsdXNUZXN0Cit7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVlQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRGF0YU91dHB1dEJ1ZmZlciBvdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigpOworICAgICAgICBieXRlW10gdGVzdERhdGE7CisKKyAgICAgICAgLy8gYm9vbGVhbgorICAgICAgICBvdXQud3JpdGVCb29sZWFuKHRydWUpOworICAgICAgICAvLyBieXRlCisgICAgICAgIG91dC53cml0ZUJ5dGUoMHgxKTsKKyAgICAgICAgLy8gY2hhcgorICAgICAgICBvdXQud3JpdGVDaGFyKCdhJyk7CisgICAgICAgIC8vIHNob3J0CisgICAgICAgIG91dC53cml0ZVNob3J0KDEpOworICAgICAgICAvLyBpbnQKKyAgICAgICAgb3V0LndyaXRlSW50KDEpOworICAgICAgICAvLyBsb25nCisgICAgICAgIG91dC53cml0ZUxvbmcoMUwpOworICAgICAgICAvLyBmbG9hdAorICAgICAgICBvdXQud3JpdGVGbG9hdCgxLjBmKTsKKyAgICAgICAgLy8gZG91YmxlCisgICAgICAgIG91dC53cml0ZURvdWJsZSgxLjBkKTsKKyAgICAgICAgLy8gdmludAorICAgICAgICBvdXQud3JpdGVWSW50KC0xMzM3TCk7CisgICAgICAgIC8vdW5zaWduZWQgdmludAorICAgICAgICBvdXQud3JpdGVVbnNpZ25lZFZJbnQoMTMzN0wpOworICAgICAgICAvLyBTdHJpbmcKKyAgICAgICAgb3V0LndyaXRlVVRGKCJhYmMiKTsKKyAgICAgICAgLy9Bbm90aGVyIHN0cmluZyB0byB0ZXN0IHNraXAKKyAgICAgICAgb3V0LndyaXRlVVRGKCJnYXJiYWdldG9za2lwYXR0aGVlbmQiKTsKKyAgICAgICAgdGVzdERhdGEgPSBvdXQudG9CeXRlQXJyYXkoKTsKKworICAgICAgICBpbnQgTElNSVRFRF9TSVpFID0gNDA7CisgICAgICAgIERhdGFJbnB1dEJ1ZmZlciByZWFkZXIgPSBuZXcgRGF0YUlucHV0QnVmZmVyKHRlc3REYXRhKTsKKyAgICAgICAgRGF0YUlucHV0QnVmZmVyIHJlYWRlcjIgPSBuZXcgRGF0YUlucHV0QnVmZmVyKHRlc3REYXRhKTsKKyAgICAgICAgRGF0YU91dHB1dEJ1ZmZlciB0ZWVPdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigpOworICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGxpbWl0ZWRUZWVPdXQgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigpOworICAgICAgICBUZWVEYXRhSW5wdXRQbHVzIHRlZSA9IG5ldyBUZWVEYXRhSW5wdXRQbHVzKHJlYWRlciwgdGVlT3V0KTsKKyAgICAgICAgVGVlRGF0YUlucHV0UGx1cyBsaW1pdGVkVGVlID0gbmV3IFRlZURhdGFJbnB1dFBsdXMocmVhZGVyMiwgbGltaXRlZFRlZU91dCwgTElNSVRFRF9TSVpFKTsKKworICAgICAgICAvLyBib29sZWFuID0gMWJ5dGUKKyAgICAgICAgYm9vbGVhbiBib29sID0gdGVlLnJlYWRCb29sZWFuKCk7CisgICAgICAgIGFzc2VydFRydWUoYm9vbCk7CisgICAgICAgIGJvb2wgPSBsaW1pdGVkVGVlLnJlYWRCb29sZWFuKCk7CisgICAgICAgIGFzc2VydFRydWUoYm9vbCk7CisgICAgICAgIC8vIGJ5dGUgPSAxYnl0ZQorICAgICAgICBieXRlIGIgPSB0ZWUucmVhZEJ5dGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGIsIDB4MSk7CisgICAgICAgIGIgPSBsaW1pdGVkVGVlLnJlYWRCeXRlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhiLCAweDEpOworICAgICAgICAvLyBjaGFyID0gMmJ5dGUKKyAgICAgICAgY2hhciBjID0gdGVlLnJlYWRDaGFyKCk7CisgICAgICAgIGFzc2VydEVxdWFscygnYScsIGMpOworICAgICAgICBjID0gbGltaXRlZFRlZS5yZWFkQ2hhcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoJ2EnLCBjKTsKKyAgICAgICAgLy8gc2hvcnQgPSAyYnl0ZXMKKyAgICAgICAgc2hvcnQgcyA9IHRlZS5yZWFkU2hvcnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHMpOworICAgICAgICBzID0gbGltaXRlZFRlZS5yZWFkU2hvcnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHMpOworICAgICAgICAvLyBpbnQgPSA0Ynl0ZXMKKyAgICAgICAgaW50IGkgPSB0ZWUucmVhZEludCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaSk7CisgICAgICAgIGkgPSBsaW1pdGVkVGVlLnJlYWRJbnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGkpOworICAgICAgICAvLyBsb25nID0gOGJ5dGVzCisgICAgICAgIGxvbmcgbCA9IHRlZS5yZWFkTG9uZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMUwsIGwpOworICAgICAgICBsID0gbGltaXRlZFRlZS5yZWFkTG9uZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMUwsIGwpOworICAgICAgICAvLyBmbG9hdCA9IDRieXRlcworICAgICAgICBmbG9hdCBmID0gdGVlLnJlYWRGbG9hdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wZiwgZiwgMCk7CisgICAgICAgIGYgPSBsaW1pdGVkVGVlLnJlYWRGbG9hdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wZiwgZiwgMCk7CisgICAgICAgIC8vIGRvdWJsZSA9IDhieXRlcworICAgICAgICBkb3VibGUgZCA9IHRlZS5yZWFkRG91YmxlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLjBkLCBkLCAwKTsKKyAgICAgICAgZCA9IGxpbWl0ZWRUZWUucmVhZERvdWJsZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMS4wZCwgZCwgMCk7CisgICAgICAgIGxvbmcgdmludCA9IHRlZS5yZWFkVkludCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEzMzdMLCB2aW50KTsKKyAgICAgICAgdmludCA9IGxpbWl0ZWRUZWUucmVhZFZJbnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xMzM3TCwgdmludCk7CisgICAgICAgIGxvbmcgdXZpbnQgPSB0ZWUucmVhZFVuc2lnbmVkVkludCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTMzN0wsIHV2aW50KTsKKyAgICAgICAgdXZpbnQgPSBsaW1pdGVkVGVlLnJlYWRVbnNpZ25lZFZJbnQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEzMzdMLCB1dmludCk7CisgICAgICAgIC8vIFN0cmluZygiYWJjIikgPSAyKHN0cmluZyBzaXplKSArIDMgPSA1IGJ5dGVzCisgICAgICAgIFN0cmluZyBzdHIgPSB0ZWUucmVhZFVURigpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIHN0cik7CisgICAgICAgIHN0ciA9IGxpbWl0ZWRUZWUucmVhZFVURigpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIHN0cik7CisgICAgICAgIGludCBza2lwcGVkID0gdGVlLnNraXBCeXRlcygxMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoMjMsIHNraXBwZWQpOworICAgICAgICBza2lwcGVkID0gbGltaXRlZFRlZS5za2lwQnl0ZXMoMTAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIzLCBza2lwcGVkKTsKKworICAgICAgICBieXRlW10gdGVlRGF0YSA9IHRlZU91dC50b0J5dGVBcnJheSgpOworICAgICAgICBhc3NlcnRGYWxzZSh0ZWUuaXNMaW1pdFJlYWNoZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyh0ZXN0RGF0YSwgdGVlRGF0YSkpOworCisgICAgICAgIGJ5dGVbXSBsaW1pdGVkVGVlRGF0YSA9IGxpbWl0ZWRUZWVPdXQudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaW1pdGVkVGVlLmlzTGltaXRSZWFjaGVkKCkpOworICAgICAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoQXJyYXlzLmNvcHlPZih0ZXN0RGF0YSwgTElNSVRFRF9TSVpFIC0gMSApLCBsaW1pdGVkVGVlRGF0YSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9idHJlZS9CVHJlZVJlbW92YWxUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnRyZWUvQlRyZWVSZW1vdmFsVGVzdC5qYXZhCmluZGV4IDc2ZTcwOTguLmU3NjRiM2YgMTAwNjQ0Ci0tLSBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9idHJlZS9CVHJlZVJlbW92YWxUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J0cmVlL0JUcmVlUmVtb3ZhbFRlc3QuamF2YQpAQCAtMTcsNiArMTcsNyBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ0cmVlOwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQlRSRUVfQlJBTkNIX1NISUZUOwogaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5idHJlZS5CVHJlZVJlbW92YWwucmVtb3ZlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTM3LDcgKzM4LDcgQEAKIHsKICAgICBzdGF0aWMKICAgICB7Ci0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiY2Fzc2FuZHJhLmJ0cmVlLmJyYW5jaHNoaWZ0IiwgIjMiKTsKKyAgICAgICAgQlRSRUVfQlJBTkNIX1NISUZULnNldEludCgzKTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPEludGVnZXI+IENNUCA9IG5ldyBDb21wYXJhdG9yPEludGVnZXI+KCkKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9idHJlZS9CVHJlZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9idHJlZS9CVHJlZVRlc3QuamF2YQppbmRleCA3M2YwZmY3Li4wMDRkZmUwIDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnRyZWUvQlRyZWVUZXN0LmphdmEKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J0cmVlL0JUcmVlVGVzdC5qYXZhCkBAIC0yNSw2ICsyNSw3IEBACiAKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmZpZy5DYXNzYW5kcmFSZWxldmFudFByb3BlcnRpZXMuQlRSRUVfQlJBTkNIX1NISUZUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7CiAKIHB1YmxpYyBjbGFzcyBCVHJlZVRlc3QKQEAgLTMyLDkgKzMzLDkgQEAKICAgICBzdGF0aWMgSW50ZWdlcltdIGludHMgPSBuZXcgSW50ZWdlclsyMF07CiAgICAgc3RhdGljCiAgICAgewotICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImNhc3NhbmRyYS5idHJlZS5icmFuY2hzaGlmdCIsICIyIik7CisgICAgICAgIEJUUkVFX0JSQU5DSF9TSElGVC5zZXRJbnQoMik7CiAgICAgICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGludHMubGVuZ3RoIDsgaSsrKQotICAgICAgICAgICAgaW50c1tpXSA9IG5ldyBJbnRlZ2VyKGkpOworICAgICAgICAgICAgaW50c1tpXSA9IEludGVnZXIudmFsdWVPZihpKTsKICAgICB9CiAKICAgICBzdGF0aWMgZmluYWwgVXBkYXRlRnVuY3Rpb248SW50ZWdlciwgSW50ZWdlcj4gdXBkYXRlRiA9IG5ldyBVcGRhdGVGdW5jdGlvbjxJbnRlZ2VyLCBJbnRlZ2VyPigpCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQWJzdHJhY3RUeXBlQnl0ZVNvdXJjZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9BYnN0cmFjdFR5cGVCeXRlU291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YjE4N2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQWJzdHJhY3RUeXBlQnl0ZVNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwMTUgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuVGVybTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuRHVyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTGVuZ3RoUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZG9tUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2VyaWFsaXplcnMuTWFyc2hhbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5TaW1wbGVEYXRlU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJpYWxpemVycy5UeXBlU2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5VVUlER2VuOworCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEFic3RyYWN0VHlwZUJ5dGVTb3VyY2VUZXN0Cit7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBQkVUID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY3ODkwIUAjJCVeJiooKSI7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAidmVyc2lvbj17MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Qnl0ZUNvbXBhcmFibGUuVmVyc2lvbj4gdmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb247CisKKyAgICBwdWJsaWMgQWJzdHJhY3RUeXBlQnl0ZVNvdXJjZVRlc3QoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiB2b2lkIHRlc3RWYWx1ZXNGb3JUeXBlKEFic3RyYWN0VHlwZTxUPiB0eXBlLCBULi4uIHZhbHVlcykKKyAgICB7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKHR5cGUsIEFycmF5cy5hc0xpc3QodmFsdWVzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VD4gdm9pZCB0ZXN0VmFsdWVzRm9yVHlwZShBYnN0cmFjdFR5cGU8VD4gdHlwZSwgTGlzdDxUPiB2YWx1ZXMpCisgICAgeworICAgICAgICBmb3IgKFQgaW5pdGlhbCA6IHZhbHVlcykKKyAgICAgICAgICAgIGRlY29kZUFuZEFzc2VydEVxdWFscyh0eXBlLCBpbml0aWFsKTsKKyAgICAgICAgaWYgKEludGVnZXJUeXBlLmluc3RhbmNlLmVxdWFscyh0eXBlKSkKKyAgICAgICAgICAgIC8vIEludGVnZXJUeXBlIHRlc3RzIGdvIHRocm91Z2ggQSBMT1Qgb2YgdmFsdWVzLCBzbyBzaG9ydCBvZiByYW5kb21seSBwaWNraW5nIHVwIHRvLCBsZXQncyBzYXkgMTAwMAorICAgICAgICAgICAgLy8gdmFsdWVzIHRvIGNvbWJpbmUgd2l0aCwgd2UnZCByYXRoZXIgc2tpcCB0aGUgY29tcGFyaXNvbiB0ZXN0cyBmb3IgdGhlbS4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMuc2l6ZSgpOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IHZhbHVlcy5zaXplKCk7ICsraikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGxlZnQgPSB0eXBlLmRlY29tcG9zZSh2YWx1ZXMuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHJpZ2h0ID0gdHlwZS5kZWNvbXBvc2UodmFsdWVzLmdldChqKSk7CisgICAgICAgICAgICAgICAgaW50IGNvbXBhcmVCdWZmZXJzID0gSW50ZWdlci5zaWdudW0odHlwZS5jb21wYXJlKGxlZnQsIHJpZ2h0KSk7CisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZSBsZWZ0U291cmNlID0gdHlwZS5hc0NvbXBhcmFibGVCeXRlcyhsZWZ0LmR1cGxpY2F0ZSgpLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlIHJpZ2h0U291cmNlID0gdHlwZS5hc0NvbXBhcmFibGVCeXRlcyhyaWdodC5kdXBsaWNhdGUoKSwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgaW50IGNvbXBhcmVCeXRlcyA9IEludGVnZXIuc2lnbnVtKEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUodiAtPiBsZWZ0U291cmNlLCB2IC0+IHJpZ2h0U291cmNlLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhjb21wYXJlQnVmZmVycywgY29tcGFyZUJ5dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgPFQ+IHZvaWQgdGVzdFZhbHVlc0ZvclR5cGUoQWJzdHJhY3RUeXBlPFQ+IHR5cGUsIFN0cmVhbTxUPiB2YWx1ZXMpCisgICAgeworICAgICAgICB2YWx1ZXMuZm9yRWFjaChpbml0aWFsIC0+IGRlY29kZUFuZEFzc2VydEVxdWFscyh0eXBlLCBpbml0aWFsKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VD4gdm9pZCBkZWNvZGVBbmRBc3NlcnRFcXVhbHMoQWJzdHJhY3RUeXBlPFQ+IHR5cGUsIFQgaW5pdGlhbCkKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgaW5pdGlhbEJ1ZmZlciA9IHR5cGUuZGVjb21wb3NlKGluaXRpYWwpOworICAgICAgICAvLyBBc3NlcnQgdGhhdCBmcm9tQ29tcGFyYWJsZUJ5dGVzIGRlY29kZXMgY29ycmVjdGx5LgorICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIHBlZWthYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKHR5cGUuYXNDb21wYXJhYmxlQnl0ZXMoaW5pdGlhbEJ1ZmZlciwgdmVyc2lvbikpOworICAgICAgICBCeXRlQnVmZmVyIGRlY29kZWRCdWZmZXIgPSB0eXBlLmZyb21Db21wYXJhYmxlQnl0ZXMocGVla2FibGVCeXRlcywgdmVyc2lvbik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkZvciAiICsgQnl0ZVNvdXJjZUNvbXBhcmlzb25UZXN0LnNhZmVTdHIoaW5pdGlhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChpbml0aWFsQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGRlY29kZWRCdWZmZXIpKTsKKyAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIHZhbHVlIGNvbXBvc2VkIGZyb20gZnJvbUNvbXBhcmFibGVCeXRlcyBpcyB0aGUgY29ycmVjdCBvbmUuCisgICAgICAgIHBlZWthYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKHR5cGUuYXNDb21wYXJhYmxlQnl0ZXMoaW5pdGlhbEJ1ZmZlciwgdmVyc2lvbikpOworICAgICAgICBUIGRlY29kZWQgPSB0eXBlLmNvbXBvc2UodHlwZS5mcm9tQ29tcGFyYWJsZUJ5dGVzKHBlZWthYmxlQnl0ZXMsIHZlcnNpb24pKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpbml0aWFsLCBkZWNvZGVkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmV3UmFuZG9tQWxwaGFudW1lcmljKFJhbmRvbSBwcm5nLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByYW5kb20gPSBuZXcgU3RyaW5nQnVpbGRlcihsZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICAgICAgcmFuZG9tLmFwcGVuZChBTFBIQUJFVC5jaGFyQXQocHJuZy5uZXh0SW50KEFMUEhBQkVULmxlbmd0aCgpKSkpOworICAgICAgICByZXR1cm4gcmFuZG9tLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNjaWlUeXBlKCkKKyAgICB7CisgICAgICAgIFN0cmluZ1tdIGFzY2lpU3RyaW5ncyA9IG5ldyBTdHJpbmdbXQorICAgICAgICB7CisgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkwIiwKKyAgICAgICAgICAgICAgICAiIUAjJCVeJiooKSIsCisgICAgICAgIH07CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKEFzY2lpVHlwZS5pbnN0YW5jZSwgYXNjaWlTdHJpbmdzKTsKKworICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgU3RyZWFtPFN0cmluZz4gYXNjaWlTdHJlYW0gPSBTdHJlYW0uZ2VuZXJhdGUoKCkgLT4gbmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSkubGltaXQoMTAwMCk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKEFzY2lpVHlwZS5pbnN0YW5jZSwgYXNjaWlTdHJlYW0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW5UeXBlKCkKKyAgICB7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKEJvb2xlYW5UeXBlLmluc3RhbmNlLCBCb29sZWFuLlRSVUUsIEJvb2xlYW4uRkFMU0UsIG51bGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGVzVHlwZSgpCisgICAgeworICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IGJ5dGVCdWZmZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIFJhbmRvbSBwcm5nID0gbmV3IFJhbmRvbSgpOworICAgICAgICBieXRlW10gYnl0ZUFycmF5OworICAgICAgICBpbnRbXSBhcnJheUxlbmd0aHMgPSBuZXcgaW50W10gezEsIDEwLCAxMDAsIDEwMDB9OworICAgICAgICBmb3IgKGludCBsZW5ndGggOiBhcnJheUxlbmd0aHMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGVBcnJheSA9IG5ldyBieXRlW2xlbmd0aF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm5nLm5leHRCeXRlcyhieXRlQXJyYXkpOworICAgICAgICAgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChCeXRlQnVmZmVyLndyYXAoYnl0ZUFycmF5KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoQnl0ZXNUeXBlLmluc3RhbmNlLCBieXRlQnVmZmVycy50b0FycmF5KG5ldyBCeXRlQnVmZmVyWzBdKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZVR5cGUoKQorICAgIHsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoQnl0ZVR5cGUuaW5zdGFuY2UsIG5ldyBCeXRlW10geyBudWxsIH0pOworCisgICAgICAgIFN0cmVhbTxCeXRlPiBhbGxCeXRlcyA9IEludFN0cmVhbS5yYW5nZShCeXRlLk1JTl9WQUxVRSwgQnl0ZS5NQVhfVkFMVUUgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwVG9PYmoodmFsdWUgLT4gKGJ5dGUpIHZhbHVlKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoQnl0ZVR5cGUuaW5zdGFuY2UsIGFsbEJ5dGVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVUeXBlKCkKKyAgICB7CisgICAgICAgIENvbXBvc2l0ZVR5cGUgY29tcFR5cGUgPSBDb21wb3NpdGVUeXBlLmdldEluc3RhbmNlKFVURjhUeXBlLmluc3RhbmNlLCBUaW1lVVVJRFR5cGUuaW5zdGFuY2UsIEludGVnZXJUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBieXRlQnVmZmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgLy8gVGVzdCB3aXRoIGNvbXBsZXRlIENvbXBvc2l0ZVR5cGUgcm93cworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHJhbmRvbVN0cmluZyA9IG5ld1JhbmRvbUFscGhhbnVtZXJpYyhwcm5nLCAxMCk7CisgICAgICAgICAgICBUaW1lVVVJRCByYW5kb21VdWlkID0gVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRCgpOworICAgICAgICAgICAgQmlnSW50ZWdlciByYW5kb21WYXJpbnQgPSBCaWdJbnRlZ2VyLnByb2JhYmxlUHJpbWUoODAsIHBybmcpOworICAgICAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKGNvbXBUeXBlLmRlY29tcG9zZShyYW5kb21TdHJpbmcsIHJhbmRvbVV1aWQsIHJhbmRvbVZhcmludCkpOworICAgICAgICB9CisgICAgICAgIC8vIFRlc3Qgd2l0aCBpbmNvbXBsZXRlIENvbXBvc2l0ZVR5cGUgcm93cywgd2hlcmUgb25seSB0aGUgZmlyc3QgZWxlbWVudCBpcyBwcmVzZW50CisgICAgICAgIEJ5dGVCdWZmZXJbXSBpbmNvbXBsZXRlQ29tcG9zaXRlID0gbmV3IEJ5dGVCdWZmZXJbMV07CisgICAgICAgIGluY29tcGxldGVDb21wb3NpdGVbMF0gPSBVVEY4VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UobmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSk7CisgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgdHJ1ZSwgaW5jb21wbGV0ZUNvbXBvc2l0ZSkpOworICAgICAgICBieXRlQnVmZmVycy5hZGQoQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGZhbHNlLCBpbmNvbXBsZXRlQ29tcG9zaXRlKSk7CisgICAgICAgIC8vIC4uLmFuZCB0aGUgbGFzdCBlbmQtb2YtY29tcG9uZW50IGJ5dGUgaXMgbm90IDAuCisgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgdHJ1ZSwgaW5jb21wbGV0ZUNvbXBvc2l0ZSwgKGJ5dGUpIDEpKTsKKyAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBmYWxzZSwgaW5jb21wbGV0ZUNvbXBvc2l0ZSwgKGJ5dGUpIDEpKTsKKyAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB0cnVlLCBpbmNvbXBsZXRlQ29tcG9zaXRlLCAoYnl0ZSkgLTEpKTsKKyAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBmYWxzZSwgaW5jb21wbGV0ZUNvbXBvc2l0ZSwgKGJ5dGUpIC0xKSk7CisgICAgICAgIC8vIFRlc3Qgd2l0aCBpbmNvbXBsZXRlIENvbXBvc2l0ZVR5cGUgcm93cywgd2hlcmUgb25seSB0aGUgbGFzdCBlbGVtZW50IGlzIG5vdCBwcmVzZW50CisgICAgICAgIGluY29tcGxldGVDb21wb3NpdGUgPSBuZXcgQnl0ZUJ1ZmZlclsyXTsKKyAgICAgICAgaW5jb21wbGV0ZUNvbXBvc2l0ZVswXSA9IFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZShuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTApKTsKKyAgICAgICAgaW5jb21wbGV0ZUNvbXBvc2l0ZVsxXSA9IFRpbWVVVUlEVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lVVVJRCgpKTsKKyAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB0cnVlLCBpbmNvbXBsZXRlQ29tcG9zaXRlKSk7CisgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgZmFsc2UsIGluY29tcGxldGVDb21wb3NpdGUpKTsKKyAgICAgICAgLy8gLi4uYW5kIHRoZSBsYXN0IGVuZC1vZi1jb21wb25lbnQgYnl0ZSBpcyBub3QgMC4KKyAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB0cnVlLCBpbmNvbXBsZXRlQ29tcG9zaXRlLCAoYnl0ZSkgMSkpOworICAgICAgICBieXRlQnVmZmVycy5hZGQoQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGZhbHNlLCBpbmNvbXBsZXRlQ29tcG9zaXRlLCAoYnl0ZSkgMSkpOworICAgICAgICBieXRlQnVmZmVycy5hZGQoQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHRydWUsIGluY29tcGxldGVDb21wb3NpdGUsIChieXRlKSAtMSkpOworICAgICAgICBieXRlQnVmZmVycy5hZGQoQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGZhbHNlLCBpbmNvbXBsZXRlQ29tcG9zaXRlLCAoYnl0ZSkgLTEpKTsKKworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShjb21wVHlwZSwgYnl0ZUJ1ZmZlcnMudG9BcnJheShuZXcgQnl0ZUJ1ZmZlclswXSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERhdGVUeXBlKCkKKyAgICB7CisgICAgICAgIFN0cmVhbTxEYXRlPiBkYXRlcyA9IFN0cmVhbS5vZihudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoTG9uZy5NSU5fVkFMVUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoTG9uZy5NQVhfVkFMVUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoKSk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKERhdGVUeXBlLmluc3RhbmNlLCBkYXRlcyk7CisKKyAgICAgICAgZGF0ZXMgPSBuZXcgUmFuZG9tKCkubG9uZ3MoMTAwMCkubWFwVG9PYmooRGF0ZTo6bmV3KTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoRGF0ZVR5cGUuaW5zdGFuY2UsIGRhdGVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNpbWFsVHlwZSgpCisgICAgeworICAgICAgICAvLyBXZSB3b24ndCBiZSB1c2luZyB0ZXN0VmFsdWVzRm9yVHlwZSBmb3IgRGVjaW1hbFR5cGUgKGkuZS4gd2Ugd29uJ3QgYWxzbyBiZSBjb21wYXJpbmcgdGhlIGluaXRpYWwgYW5kIGRlY29kZWQKKyAgICAgICAgLy8gQnl0ZUJ1ZmZlciB2YWx1ZXMpLiBUaGF0J3MgYmVjYXVzZSB0aGUgc2FtZSBCaWdEZWNpbWFsIHZhbHVlIGNhbiBiZSByZXByZXNlbnRlZCB3aXRoIGEgY291cGxlIG9mIGRpZmZlcmVudCwKKyAgICAgICAgLy8gZXZlbiBpZiBlcXVpdmFsZW50IHBhaXJzIG9mIDxtYW50aXNzYSwgc2NhbGU+IChlLmcuIDAuMSBpcyAxICogZS0xLCBhcyB3ZWxsIGFzIDEwICogZS0yLCBhcyB3ZWxsIGFzLi4uKS4KKyAgICAgICAgLy8gQW5kIGluIHByYWN0aWNlIGl0J3MgZWFzaWVyIHRvIGp1c3QgY29udmVydCB0byBCaWdEZWNpbWFscyBhbmQgdGhlbiBjb21wYXJlLCBpbnN0ZWFkIG9mIHRyeWluZyB0byBtYW51YWxseQorICAgICAgICAvLyBkZWNvZGUgYW5kIGNvbnZlcnQgdG8gY2Fub25pY2FsIHJlcHJlc2VudGF0aW9ucywgd2hpY2ggdGhlbiB0byBjb21wYXJlLiBGb3IgZXhhbXBsZSBvZiBnZW5lcmF0aW5nIGNhbm9uaWNhbAorICAgICAgICAvLyBkZWNpbWFscyBpbiB0aGUgZmlyc3QgcGxhY2UsIHNlZSB0ZXN0UmV2ZXJzZWRUeXBlKCkuCisgICAgICAgIENvbnN1bWVyPEJpZ0RlY2ltYWw+IGJpZ0RlY2ltYWxDb25zdW1lciA9IGluaXRpYWwgLT4KKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZVNvdXJjZSBieXRlU291cmNlID0gRGVjaW1hbFR5cGUuaW5zdGFuY2UuYXNDb21wYXJhYmxlQnl0ZXMoRGVjaW1hbFR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKGluaXRpYWwpLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIEJpZ0RlY2ltYWwgZGVjb2RlZCA9IERlY2ltYWxUeXBlLmluc3RhbmNlLmNvbXBvc2UoRGVjaW1hbFR5cGUuaW5zdGFuY2UuZnJvbUNvbXBhcmFibGVCeXRlcyhCeXRlU291cmNlLnBlZWthYmxlKGJ5dGVTb3VyY2UpLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICBpZiAoaW5pdGlhbCA9PSBudWxsKQorICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKGRlY29kZWQpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgaW5pdGlhbC5jb21wYXJlVG8oZGVjb2RlZCkpOworICAgICAgICB9OworICAgICAgICAvLyBUZXN0IHNvbWUgaW50ZXJlc3RpbmcgcHJlZGVmaW5lZCBCaWdEZWNpbWFsIHZhbHVlcy4KKyAgICAgICAgU3RyZWFtLm9mKG51bGwsCisgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLlpFUk8sCisgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLk9ORSwKKyAgICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwuT05FLmFkZChCaWdEZWNpbWFsLk9ORSksCisgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLlRFTiwKKyAgICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwudmFsdWVPZigwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEpLAorICAgICAgICAgICAgICAgICAgQmlnRGVjaW1hbC52YWx1ZU9mKC0wLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEpLAorICAgICAgICAgICAgICAgICAgQmlnRGVjaW1hbC52YWx1ZU9mKDAuMDAwMDAwMDAwMDAwMDAwMTIzNDU2Nzg5MTAxMTEyMTMxNCksCisgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLnZhbHVlT2YoLTAuMDAwMDAwMDAwMDAwMDAwMTIzNDU2Nzg5MTAxMTEyMTMxNCksCisgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLnZhbHVlT2YoMTIzNDU2Nzg5MTAxMTEyMTMuMTQxNTE2MTcxODE5MjAyMTIyKSwKKyAgICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwudmFsdWVPZigtMTIzNDU2Nzg5MTAxMTEyMTMuMTQxNTE2MTcxODE5MjAyMTIyKSwKKyAgICAgICAgICAgICAgICAgIG5ldyBCaWdEZWNpbWFsKEJpZ0ludGVnZXIuVEVOLCBJbnRlZ2VyLk1JTl9WQUxVRSksCisgICAgICAgICAgICAgICAgICBuZXcgQmlnRGVjaW1hbChCaWdJbnRlZ2VyLlRFTi5uZWdhdGUoKSwgSW50ZWdlci5NSU5fVkFMVUUpLAorICAgICAgICAgICAgICAgICAgbmV3IEJpZ0RlY2ltYWwoQmlnSW50ZWdlci5URU4sIEludGVnZXIuTUFYX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICAgIG5ldyBCaWdEZWNpbWFsKEJpZ0ludGVnZXIuVEVOLm5lZ2F0ZSgpLCBJbnRlZ2VyLk1BWF9WQUxVRSksCisgICAgICAgICAgICAgICAgICBuZXcgQmlnRGVjaW1hbChCaWdJbnRlZ2VyLlRFTi5wb3coMTAwMCksIEludGVnZXIuTUlOX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICAgIG5ldyBCaWdEZWNpbWFsKEJpZ0ludGVnZXIuVEVOLnBvdygxMDAwKS5uZWdhdGUoKSwgSW50ZWdlci5NSU5fVkFMVUUpLAorICAgICAgICAgICAgICAgICAgbmV3IEJpZ0RlY2ltYWwoQmlnSW50ZWdlci5URU4ucG93KDEwMDApLCBJbnRlZ2VyLk1BWF9WQUxVRSksCisgICAgICAgICAgICAgICAgICBuZXcgQmlnRGVjaW1hbChCaWdJbnRlZ2VyLlRFTi5wb3coMTAwMCkubmVnYXRlKCksIEludGVnZXIuTUFYX1ZBTFVFKSkKKyAgICAgICAgICAgICAgLmZvckVhY2goYmlnRGVjaW1hbENvbnN1bWVyKTsKKyAgICAgICAgLy8gVGVzdCBCaWdEZWNpbWFscyBjcmVhdGVkIGZyb20gcmFuZG9tIGRvdWJsZSB2YWx1ZXMgd2l0aCBwcmVkZWZpbmVkIHJhbmdlIG1vZGlmaWVycy4KKyAgICAgICAgZG91YmxlW10gYm91bmRzID0geworICAgICAgICAgICAgICAgIERvdWJsZS5NSU5fVkFMVUUsCisgICAgICAgICAgICAgICAgLTFfMDAwXzAwMF8wMDAuMCwKKyAgICAgICAgICAgICAgICAtMTAwXzAwMC4wLAorICAgICAgICAgICAgICAgIC0xLjAsCisgICAgICAgICAgICAgICAgMS4wLAorICAgICAgICAgICAgICAgIDEwMF8wMDAuMCwKKyAgICAgICAgICAgICAgICAxXzAwMF8wMDBfMDAwLjAsCisgICAgICAgICAgICAgICAgRG91YmxlLk1BWF9WQUxVRX07CisgICAgICAgIGZvciAoZG91YmxlIGJvdW5kIDogYm91bmRzKQorICAgICAgICB7CisgICAgICAgICAgICBuZXcgUmFuZG9tKCkuZG91YmxlcygxMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1hcFRvT2JqKGluaXRpYWwgLT4gQmlnRGVjaW1hbC52YWx1ZU9mKGluaXRpYWwgKiBib3VuZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChiaWdEZWNpbWFsQ29uc3VtZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlVHlwZSgpCisgICAgeworICAgICAgICBTdHJlYW08RG91YmxlPiBkb3VibGVzID0gU3RyZWFtLm9mKG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLk5hTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLk5FR0FUSVZFX0lORklOSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZS5NQVhfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLk1JTl9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArMC4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzEuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsxMjM0NTY3ODkxMC4xMTEyMTMxNDE1MTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEyMzQ1Njc4OTEwLjExMTIxMzE0MTUxNik7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKERvdWJsZVR5cGUuaW5zdGFuY2UsIGRvdWJsZXMpOworCisgICAgICAgIGRvdWJsZXMgPSBuZXcgUmFuZG9tKCkuZG91YmxlcygxMDAwKS5ib3hlZCgpOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShEb3VibGVUeXBlLmluc3RhbmNlLCBkb3VibGVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REdXJhdGlvblR5cGUoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIFN0cmVhbTxEdXJhdGlvbj4gcG9zRHVyYXRpb25zID0gU3RyZWFtLmdlbmVyYXRlKCgpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb250aHMgPSBwcm5nLm5leHRJbnQoMTIpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXlzID0gcHJuZy5uZXh0SW50KDI4KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG5hbm9zID0gKE1hdGguYWJzKHBybmcubmV4dExvbmcoKSAlIDg2XzQwMF8wMDBfMDAwXzAwMEwpKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRHVyYXRpb24ubmV3SW5zdGFuY2UobW9udGhzLCBkYXlzLCBuYW5vcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxpbWl0KDEwMDApOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShEdXJhdGlvblR5cGUuaW5zdGFuY2UsIHBvc0R1cmF0aW9ucyk7CisgICAgICAgIFN0cmVhbTxEdXJhdGlvbj4gbmVnRHVyYXRpb25zID0gU3RyZWFtLmdlbmVyYXRlKCgpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb250aHMgPSBwcm5nLm5leHRJbnQoMTIpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXlzID0gcHJuZy5uZXh0SW50KDI4KSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nIG5hbm9zID0gKE1hdGguYWJzKHBybmcubmV4dExvbmcoKSAlIDg2XzQwMF8wMDBfMDAwXzAwMEwpKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRHVyYXRpb24ubmV3SW5zdGFuY2UoLW1vbnRocywgLWRheXMsIC1uYW5vcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmxpbWl0KDEwMDApOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShEdXJhdGlvblR5cGUuaW5zdGFuY2UsIG5lZ0R1cmF0aW9ucyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY0NvbXBvc2l0ZVR5cGUoKQorICAgIHsKKyAgICAgICAgRHluYW1pY0NvbXBvc2l0ZVR5cGUgZHluYW1pY0NvbXBUeXBlID0gRHluYW1pY0NvbXBvc2l0ZVR5cGUuZ2V0SW5zdGFuY2UobmV3IEhhc2hNYXA8PigpKTsKKyAgICAgICAgSW1tdXRhYmxlTGlzdDxTdHJpbmc+IGFsbFR5cGVzID0gSW1tdXRhYmxlTGlzdC5vZigib3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5CeXRlc1R5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlRpbWVVVUlEVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50ZWdlclR5cGUiKTsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBhbGxWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiBieXRlQnVmZmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgcmFuZG9tU3RyaW5nID0gbmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKTsKKyAgICAgICAgICAgIGFsbFZhbHVlcy5hZGQoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMocmFuZG9tU3RyaW5nKSk7CisgICAgICAgICAgICBVVUlEIHJhbmRvbVV1aWQgPSBUaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVBc1VVSUQoKTsKKyAgICAgICAgICAgIGFsbFZhbHVlcy5hZGQoQnl0ZUJ1ZmZlci53cmFwKFVVSURHZW4uZGVjb21wb3NlKHJhbmRvbVV1aWQpKSk7CisgICAgICAgICAgICBieXRlIHJhbmRvbUJ5dGUgPSAoYnl0ZSkgcHJuZy5uZXh0SW50KCk7CisgICAgICAgICAgICBhbGxWYWx1ZXMuYWRkKEJ5dGVCdWZmZXIuYWxsb2NhdGUoMSkucHV0KHJhbmRvbUJ5dGUpKTsKKworICAgICAgICAgICAgLy8gVGhyZWUtY29tcG9uZW50IGtleSB3aXRoIGFsaWFzZWQgYW5kIG5vbi1hbGlhc2VkIHR5cGVzIGFuZCBlbmQtb2YtY29tcG9uZW50IGJ5dGUgdmFyeWluZyAoMCwgMSwgLTEpLgorICAgICAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKER5bmFtaWNDb21wb3NpdGVUeXBlLmJ1aWxkKGFsbFR5cGVzLCBhbGxWYWx1ZXMpKTsKKyAgICAgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChjcmVhdGVTdHJpbmdVdWlkVmFyaW50RHluYW1pY0NvbXBvc2l0ZUtleShyYW5kb21TdHJpbmcsIHJhbmRvbVV1aWQsIHJhbmRvbUJ5dGUsIChieXRlKSAxKSk7CisgICAgICAgICAgICBieXRlQnVmZmVycy5hZGQoY3JlYXRlU3RyaW5nVXVpZFZhcmludER5bmFtaWNDb21wb3NpdGVLZXkocmFuZG9tU3RyaW5nLCByYW5kb21VdWlkLCByYW5kb21CeXRlLCAoYnl0ZSkgLTEpKTsKKworICAgICAgICAgICAgLy8gVHdvLWNvbXBvbmVudCBrZXkgd2l0aCBhbGlhc2VkIGFuZCBub24tYWxpYXNlZCB0eXBlcyBhbmQgZW5kLW9mLWNvbXBvbmVudCBieXRlIHZhcnlpbmcgKDAsIDEsIC0xKS4KKyAgICAgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChEeW5hbWljQ29tcG9zaXRlVHlwZS5idWlsZChhbGxUeXBlcy5zdWJMaXN0KDAsIDIpLCBhbGxWYWx1ZXMuc3ViTGlzdCgwLCAyKSkpOworICAgICAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKGNyZWF0ZVN0cmluZ1V1aWRWYXJpbnREeW5hbWljQ29tcG9zaXRlS2V5KHJhbmRvbVN0cmluZywgcmFuZG9tVXVpZCwgLTEsIChieXRlKSAxKSk7CisgICAgICAgICAgICBieXRlQnVmZmVycy5hZGQoY3JlYXRlU3RyaW5nVXVpZFZhcmludER5bmFtaWNDb21wb3NpdGVLZXkocmFuZG9tU3RyaW5nLCByYW5kb21VdWlkLCAtMSwgKGJ5dGUpIC0xKSk7CisKKyAgICAgICAgICAgIC8vIE9uZS1jb21wb25lbnQga2V5IHdpdGggYWxpYXNlZCBhbmQgbm9uLWFsaWFzZWQgdHlwZSBhbmQgZW5kLW9mLWNvbXBvbmVudCBieXRlIHZhcnlpbmcgKDAsIDEsIC0xKS4KKyAgICAgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChEeW5hbWljQ29tcG9zaXRlVHlwZS5idWlsZChhbGxUeXBlcy5zdWJMaXN0KDAsIDEpLCBhbGxWYWx1ZXMuc3ViTGlzdCgwLCAxKSkpOworICAgICAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKGNyZWF0ZVN0cmluZ1V1aWRWYXJpbnREeW5hbWljQ29tcG9zaXRlS2V5KHJhbmRvbVN0cmluZywgbnVsbCwgLTEsIChieXRlKSAxKSk7CisgICAgICAgICAgICBieXRlQnVmZmVycy5hZGQoY3JlYXRlU3RyaW5nVXVpZFZhcmludER5bmFtaWNDb21wb3NpdGVLZXkocmFuZG9tU3RyaW5nLCBudWxsLCAtMSwgKGJ5dGUpIC0xKSk7CisKKyAgICAgICAgICAgIGFsbFZhbHVlcy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKGR5bmFtaWNDb21wVHlwZSwgYnl0ZUJ1ZmZlcnMudG9BcnJheShuZXcgQnl0ZUJ1ZmZlclswXSkpOworICAgIH0KKworICAgIC8vIFNpbWlsYXIgdG8gRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoc3RyaW5nLCB1dWlkLCBpLCB0cnVlLCBmYWxzZSksIGJ1dCBub3QgdXNpbmcgYW55CisgICAgLy8gYWxpYXNlZCB0eXBlcywgaW4gb3JkZXIgdG8gZG8gYW4gZXhhY3QgY29tcGFyaXNvbiBvZiB0aGUgdW5tYXJzaGFsbGVkIER5bmFtaWNDb21wb3NpdGVUeXBlIHBheWxvYWQgd2l0aCB0aGUKKyAgICAvLyBpbnB1dCBvbmUuIElmIGFsaWFzZWQgdHlwZXMgYXJlIHVzZWQsIGR1ZSB0byBEeW5hbWljQ29tcG9zaXRlVHlwZS5idWlsZChMaXN0PFN0cmluZz4sIExpc3Q8Qnl0ZUJ1ZmZlcj4pCisgICAgLy8gYWx3YXlzIGluY2x1ZGluZyB0aGUgZnVsbCB0eXBlIGluZm8gaW4gdGhlIG5ld2x5IGNvbnN0cnVjdGVkIHBheWxvYWQsIGFuIGV4YWN0IGNvbXBhcmlzb24gd29uJ3Qgd29yay4KKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQnVmZmVyIGNyZWF0ZVN0cmluZ1V1aWRWYXJpbnREeW5hbWljQ29tcG9zaXRlS2V5KFN0cmluZyBzdHJpbmcsIFVVSUQgdXVpZCwgaW50IGksIGJ5dGUgbGFzdEVvY0J5dGUpCisgICAgeworICAgICAgICAvLyAxLiBDYWxjdWxhdGUgaG93IG1hbnkgYnl0ZXMgZG8gd2UgbmVlZCBmb3IgYSBrZXkgb2YgdGhpcyBEeW5hbWljQ29tcG9zaXRlVHlwZQorICAgICAgICBTdHJpbmcgYnl0ZXNUeXBlID0gIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuQnl0ZXNUeXBlIjsKKyAgICAgICAgU3RyaW5nIHRpbWVVdWlkVHlwZSA9ICJvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLlRpbWVVVUlEVHlwZSI7CisgICAgICAgIFN0cmluZyB2YXJpbnRUeXBlID0gIm9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50ZWdlclR5cGUiOworICAgICAgICBCeXRlQnVmZmVyIGJ5dGVzID0gQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoc3RyaW5nKTsKKyAgICAgICAgaW50IHRvdGFsU2l6ZSA9IDA7CisgICAgICAgIC8vIFRha2UgaW50byBhY2NvdW50IHRoZSBzdHJpbmcgY29tcG9uZW50IGRhdGEgKEJ5dGVzVHlwZSBpcyBhbGlhc2VkKQorICAgICAgICB0b3RhbFNpemUgKz0gMiArIGJ5dGVzVHlwZS5sZW5ndGgoKSArIDIgKyBieXRlcy5yZW1haW5pbmcoKSArIDE7CisgICAgICAgIGlmICh1dWlkICE9IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRha2UgaW50byBhY2NvdW50IHRoZSBVVUlEIGNvbXBvbmVudCBkYXRhIChUaW1lVVVJRFR5cGUgaXMgYWxpYXNlZCkKKyAgICAgICAgICAgIHRvdGFsU2l6ZSArPSAyICsgdGltZVV1aWRUeXBlLmxlbmd0aCgpICsgMiArIDE2ICsgMTsKKyAgICAgICAgICAgIGlmIChpICE9IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIFRha2UgaW50byBhY2NvdW50IHRoZSB2YXJpbnQgY29tcG9uZW50IGRhdGEgKEludGVnZXJUeXBlIGlzIF9ub3RfIGFsaWFzZWQpLgorICAgICAgICAgICAgICAgIC8vIE5vdGljZSB0aGF0IHdlIGFjY291bnQgZm9yIGEgc2luZ2xlIGJ5dGUgb2YgdmFyaW50IGRhdGEsIHNvIHdlJ2xsIGRvd25jYXN0IHRoZSBpbnQgcGF5bG9hZAorICAgICAgICAgICAgICAgIC8vIHRvIGJ5dGUgYW5kIHVzZSBvbmx5IHRoYXQgYXMgdGhlIGFjdHVhbCB2YXJpbnQgcGF5bG9hZC4KKyAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gMiArIHZhcmludFR5cGUubGVuZ3RoKCkgKyAyICsgMSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAyLiBBbGxvY2F0ZSBhIGJ1ZmZlciB3aXRoIHRoYXQgbWFueSBieXRlcworICAgICAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSh0b3RhbFNpemUpOworCisgICAgICAgIC8vIDMuIFdyaXRlIHRoZSBrZXkgZGF0YSBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIGFsbG9jYXRlZCBidWZmZXIKKyAgICAgICAgYmIucHV0U2hvcnQoKHNob3J0KSBieXRlc1R5cGUubGVuZ3RoKCkpOworICAgICAgICBiYi5wdXQoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXMoYnl0ZXNUeXBlKSk7CisgICAgICAgIGJiLnB1dFNob3J0KChzaG9ydCkgYnl0ZXMucmVtYWluaW5nKCkpOworICAgICAgICBiYi5wdXQoYnl0ZXMpOworICAgICAgICAvLyBNYWtlIHRoZSBlbmQtb2YtY29tcG9uZW50IGJ5dGUgMSBpZiByZXF1ZXN0ZWQgYW5kIHRoZSB0aW1lLVVVSUQgY29tcG9uZW50IGlzIG51bGwuCisgICAgICAgIGJiLnB1dCh1dWlkID09IG51bGwgPyBsYXN0RW9jQnl0ZSA6IChieXRlKSAwKTsKKyAgICAgICAgaWYgKHV1aWQgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgICAgYmIucHV0U2hvcnQoKHNob3J0KSB0aW1lVXVpZFR5cGUubGVuZ3RoKCkpOworICAgICAgICAgICAgYmIucHV0KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHRpbWVVdWlkVHlwZSkpOworICAgICAgICAgICAgYmIucHV0U2hvcnQoKHNob3J0KSAxNik7CisgICAgICAgICAgICBiYi5wdXQoVVVJREdlbi5kZWNvbXBvc2UodXVpZCkpOworICAgICAgICAgICAgLy8gU2V0IHRoZSBlbmQtb2YtY29tcG9uZW50IGJ5dGUgaWYgcmVxdWVzdGVkIGFuZCB0aGUgdmFyaW50IGNvbXBvbmVudCBpcyBudWxsLgorICAgICAgICAgICAgYmIucHV0KGkgPT0gLTEgPyBsYXN0RW9jQnl0ZSA6IChieXRlKSAwKTsKKyAgICAgICAgICAgIGlmIChpICE9IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJiLnB1dFNob3J0KChzaG9ydCkgdmFyaW50VHlwZS5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgYmIucHV0KEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKHZhcmludFR5cGUpKTsKKyAgICAgICAgICAgICAgICBiYi5wdXRTaG9ydCgoc2hvcnQpIDEpOworICAgICAgICAgICAgICAgIGJiLnB1dCgoYnl0ZSkgaSk7CisgICAgICAgICAgICAgICAgYmIucHV0KGxhc3RFb2NCeXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiYi5yZXdpbmQoKTsKKyAgICAgICAgcmV0dXJuIGJiOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsb2F0VHlwZSgpCisgICAgeworICAgICAgICBTdHJlYW08RmxvYXQ+IGZsb2F0cyA9IFN0cmVhbS5vZihudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdC5OYU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0LlBPU0lUSVZFX0lORklOSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdC5ORUdBVElWRV9JTkZJTklUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXQuTUFYX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbG9hdC5NSU5fVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICswLjBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzEuMEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArMTIzNDU2Ljc4OTEwMTFGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTIzNDU2Ljc4OTEwMTFGKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoRmxvYXRUeXBlLmluc3RhbmNlLCBmbG9hdHMpOworCisgICAgICAgIGZsb2F0cyA9IG5ldyBSYW5kb20oKS5pbnRzKDEwMDApLm1hcFRvT2JqKEZsb2F0OjppbnRCaXRzVG9GbG9hdCk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKEZsb2F0VHlwZS5pbnN0YW5jZSwgZmxvYXRzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmV0QWRkcmVzc1R5cGUoKSB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KKyAgICB7CisgICAgICAgIFN0cmVhbTxJbmV0QWRkcmVzcz4gaW5ldEFkZHJlc3NlcyA9IFN0cmVhbS5vZihudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb29wYmFja0FkZHJlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiMC4wLjAuMCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIxMC4wLjAuMSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIxNzIuMTYuMS4xIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjE5Mi4xNjguMi4yIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjIyNC4zLjMuMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIyNTUuMjU1LjI1NS4yNTUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoImZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCJmZTgwOjE6MjM6NDU2Ojc4OTA6MToyMzo0NTYiKSk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKEluZXRBZGRyZXNzVHlwZS5pbnN0YW5jZSwgaW5ldEFkZHJlc3Nlcyk7CisKKyAgICAgICAgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIGJ5dGVbXSBpcHY0Qnl0ZXMgPSBuZXcgYnl0ZVs0XTsKKyAgICAgICAgYnl0ZVtdIGlwdjZCeXRlcyA9IG5ldyBieXRlWzE2XTsKKyAgICAgICAgSW5ldEFkZHJlc3NbXSBhZGRyZXNzZXMgPSBuZXcgSW5ldEFkZHJlc3NbMjAwMF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aCAvIDI7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJuZy5uZXh0Qnl0ZXMoaXB2NEJ5dGVzKTsKKyAgICAgICAgICAgIGFkZHJlc3Nlc1syICogaV0gPSBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoaXB2NEJ5dGVzKTsKKyAgICAgICAgICAgIGFkZHJlc3Nlc1syICogaSArIDFdID0gSW5ldEFkZHJlc3MuZ2V0QnlBZGRyZXNzKGlwdjZCeXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoSW5ldEFkZHJlc3NUeXBlLmluc3RhbmNlLCBhZGRyZXNzZXMpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50MzJUeXBlKCkKKyAgICB7CisgICAgICAgIFN0cmVhbTxJbnRlZ2VyPiBpbnRzID0gU3RyZWFtLm9mKG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIuTUlOX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLk1JTl9WQUxVRSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNTYsIC0yNTUsIC0xMjgsIC0xMjcsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxMjcsIDEyOCwgMjU1LCAyNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIuTUFYX1ZBTFVFIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShJbnQzMlR5cGUuaW5zdGFuY2UsIGludHMpOworCisgICAgICAgIGludHMgPSBuZXcgUmFuZG9tKCkuaW50cygxMDAwKS5ib3hlZCgpOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShJbnQzMlR5cGUuaW5zdGFuY2UsIGludHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVnZXJUeXBlKCkKKyAgICB7CisgICAgICAgIFN0cmVhbTxCaWdJbnRlZ2VyPiB2YXJpbnRzID0gSW50U3RyZWFtLnJhbmdlKC0xMDAwMDAwLCAxMDAwMDAwKS5tYXBUb09iaihCaWdJbnRlZ2VyOjp2YWx1ZU9mKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoSW50ZWdlclR5cGUuaW5zdGFuY2UsIHZhcmludHMpOworCisgICAgICAgIHZhcmludHMgPSBTdHJlYW0ub2YobnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoMTIzNDU2Nzg5MTAxMTEyMTNMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoMTIzNDU2Nzg5MTAxMTEyMTNMKS5uZWdhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLnZhbHVlT2YoTG9uZy5NQVhfVkFMVUUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1BWF9WQUxVRSkubmVnYXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFIC0gMSkubXVsdGlwbHkoQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFIC0gMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1BWF9WQUxVRSAtIDEpLm11bHRpcGx5KEJpZ0ludGVnZXIudmFsdWVPZihMb25nLk1BWF9WQUxVRSAtIDEpKS5uZWdhdGUoKSk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKEludGVnZXJUeXBlLmluc3RhbmNlLCB2YXJpbnRzKTsKKworICAgICAgICBMaXN0PEJpZ0ludGVnZXI+IHZhcmludExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIGluaXRpYWwgPSBCaWdJbnRlZ2VyLk9ORS5zaGlmdExlZnQoaSk7CisgICAgICAgICAgICB2YXJpbnRMaXN0LmFkZChpbml0aWFsKTsKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgcGx1c09uZSA9IGluaXRpYWwuYWRkKEJpZ0ludGVnZXIuT05FKTsKKyAgICAgICAgICAgIHZhcmludExpc3QuYWRkKHBsdXNPbmUpOworICAgICAgICAgICAgdmFyaW50TGlzdC5hZGQocGx1c09uZS5uZWdhdGUoKSk7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIG1pbnVzT25lID0gaW5pdGlhbC5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSk7CisgICAgICAgICAgICB2YXJpbnRMaXN0LmFkZChtaW51c09uZSk7CisgICAgICAgICAgICB2YXJpbnRMaXN0LmFkZChtaW51c09uZS5uZWdhdGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoSW50ZWdlclR5cGUuaW5zdGFuY2UsIHZhcmludExpc3QudG9BcnJheShuZXcgQmlnSW50ZWdlclswXSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFV1aWRUeXBlcygpCisgICAgeworICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgVVVJRFtdIHRlc3RVdWlkcyA9IG5ldyBVVUlEWzMwMDFdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RVdWlkcy5sZW5ndGggLyAzOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlc3RVdWlkc1szICogaV0gPSBVVUlELnJhbmRvbVVVSUQoKTsKKyAgICAgICAgICAgIHRlc3RVdWlkc1szICogaSArIDFdID0gVGltZVVVSUQuR2VuZXJhdG9yLm5leHRUaW1lQXNVVUlEKCk7CisgICAgICAgICAgICB0ZXN0VXVpZHNbMyAqIGkgKyAyXSA9IFRpbWVVVUlELmF0VW5peE1pY3Jvc1dpdGhMc2JBc1VVSUQocHJuZy5uZXh0TG9uZygpLCBwcm5nLm5leHRMb25nKCkpOworICAgICAgICB9CisgICAgICAgIHRlc3RVdWlkc1t0ZXN0VXVpZHMubGVuZ3RoIC0gMV0gPSBudWxsOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShVVUlEVHlwZS5pbnN0YW5jZSwgdGVzdFV1aWRzKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoTGV4aWNhbFVVSURUeXBlLmluc3RhbmNlLCB0ZXN0VXVpZHMpOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShUaW1lVVVJRFR5cGUuaW5zdGFuY2UsIEFycmF5cy5zdHJlYW0odGVzdFV1aWRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIodSAtPiB1ID09IG51bGwgfHwgdS52ZXJzaW9uKCkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHUgLT4gdSAhPSBudWxsID8gVGltZVVVSUQuZnJvbVV1aWQodSkgOiBudWxsKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPEUsIEMgZXh0ZW5kcyBDb2xsZWN0aW9uPEU+PiBMaXN0PEM+IG5ld1JhbmRvbUVsZW1lbnRDb2xsZWN0aW9ucyhTdXBwbGllcjw/IGV4dGVuZHMgQz4gY29sbGVjdGlvblByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcGxpZXI8PyBleHRlbmRzIEU+IGVsZW1lbnRQcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1Db2xsZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1FbGVtZW50c0luQ29sbGVjdGlvbikKKyAgICB7CisgICAgICAgIExpc3Q8Qz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sbGVjdGlvbnM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgQyBjb2xsID0gY29sbGVjdGlvblByb2R1Y2VyLmdldCgpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBudW1FbGVtZW50c0luQ29sbGVjdGlvbjsgKytqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbGwuYWRkKGVsZW1lbnRQcm9kdWNlci5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQuYWRkKGNvbGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdFR5cGUoKQorICAgIHsKKyAgICAgICAgLy8gVGVzdCBsaXN0cyB3aXRoIGVsZW1lbnQgY29tcG9uZW50cyBub3QgaGF2aW5nIGtub3duL2NvbXB1dGFibGUgbGVuZ3RoIChlLmcuIHN0cmluZ3MpLgorICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgTGlzdDxMaXN0PFN0cmluZz4+IHN0cmluZ0xpc3RzID0gbmV3UmFuZG9tRWxlbWVudENvbGxlY3Rpb25zKEFycmF5TGlzdDo6bmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gbmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKExpc3RUeXBlLmdldEluc3RhbmNlKFVURjhUeXBlLmluc3RhbmNlLCBmYWxzZSksIHN0cmluZ0xpc3RzKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoTGlzdFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIHRydWUpLCBzdHJpbmdMaXN0cyk7CisgICAgICAgIC8vIFRlc3QgbGlzdHMgd2l0aCBlbGVtZW50IGNvbXBvbmVudHMgd2l0aCBrbm93bi9jb21wdXRhYmxlIGxlbmd0aCAoZS5nLiAxMjgtYml0IFVVSURzKS4KKyAgICAgICAgTGlzdDxMaXN0PFVVSUQ+PiB1dWlkTGlzdHMgPSBuZXdSYW5kb21FbGVtZW50Q29sbGVjdGlvbnMoQXJyYXlMaXN0OjpuZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQ6OnJhbmRvbVVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoTGlzdFR5cGUuZ2V0SW5zdGFuY2UoVVVJRFR5cGUuaW5zdGFuY2UsIGZhbHNlKSwgdXVpZExpc3RzKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoTGlzdFR5cGUuZ2V0SW5zdGFuY2UoVVVJRFR5cGUuaW5zdGFuY2UsIHRydWUpLCB1dWlkTGlzdHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvbmdUeXBlKCkKKyAgICB7CisgICAgICAgIFN0cmVhbTxMb25nPiBsb25ncyA9IFN0cmVhbS5vZihudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5NSU5fVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLk1JTl9WQUxVRSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgSW50ZWdlci5NSU5fVkFMVUUgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI1NkwsIC0yNTVMLCAtMTI4TCwgLTEyN0wsIC0xTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMUwsIDEyN0wsIDEyOEwsIDI1NUwsIDI1NkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgSW50ZWdlci5NQVhfVkFMVUUgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5NQVhfVkFMVUUgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5NQVhfVkFMVUUpOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShMb25nVHlwZS5pbnN0YW5jZSwgbG9uZ3MpOworCisgICAgICAgIGxvbmdzID0gbmV3IFJhbmRvbSgpLmxvbmdzKDEwMDApLmJveGVkKCk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKExvbmdUeXBlLmluc3RhbmNlLCBsb25ncyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPEssIFY+IExpc3Q8TWFwPEssIFY+PiBuZXdSYW5kb21FbnRyeU1hcHMoU3VwcGxpZXI8PyBleHRlbmRzIEs+IGtleVByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBsaWVyPD8gZXh0ZW5kcyBWPiB2YWx1ZVByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1NYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1FbnRyaWVzKQorICAgIHsKKyAgICAgICAgTGlzdDxNYXA8SywgVj4+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bU1hcHM7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgTWFwPEssIFY+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbnVtRW50cmllczsgKytqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEsga2V5ID0ga2V5UHJvZHVjZXIuZ2V0KCk7CisgICAgICAgICAgICAgICAgViB2YWx1ZSA9IHZhbHVlUHJvZHVjZXIuZ2V0KCk7CisgICAgICAgICAgICAgICAgbWFwLnB1dChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hZGQobWFwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcFR5cGUoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIExpc3Q8TWFwPFN0cmluZywgVVVJRD4+IHN0cmluZ1RvVXVpZE1hcHMgPSBuZXdSYW5kb21FbnRyeU1hcHMoKCkgLT4gbmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVUlEOjpyYW5kb21VVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDApOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShNYXBUeXBlLmdldEluc3RhbmNlKFVURjhUeXBlLmluc3RhbmNlLCBVVUlEVHlwZS5pbnN0YW5jZSwgZmFsc2UpLCBzdHJpbmdUb1V1aWRNYXBzKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoTWFwVHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgVVVJRFR5cGUuaW5zdGFuY2UsIHRydWUpLCBzdHJpbmdUb1V1aWRNYXBzKTsKKworICAgICAgICBMaXN0PE1hcDxVVUlELCBTdHJpbmc+PiB1dWlkVG9TdHJpbmdNYXBzID0gbmV3UmFuZG9tRW50cnlNYXBzKFVVSUQ6OnJhbmRvbVVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gbmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoTWFwVHlwZS5nZXRJbnN0YW5jZShVVUlEVHlwZS5pbnN0YW5jZSwgVVRGOFR5cGUuaW5zdGFuY2UsIGZhbHNlKSwgdXVpZFRvU3RyaW5nTWFwcyk7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKE1hcFR5cGUuZ2V0SW5zdGFuY2UoVVVJRFR5cGUuaW5zdGFuY2UsIFVURjhUeXBlLmluc3RhbmNlLCB0cnVlKSwgdXVpZFRvU3RyaW5nTWFwcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFydGl0aW9uZXJEZWZpbmVkT3JkZXIoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gYnl0ZUJ1ZmZlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKEJ5dGVCdWZmZXJVdGlsLkVNUFRZX0JZVEVfQlVGRkVSKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN0cmluZyByYW5kb21TdHJpbmcgPSBuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTApOworICAgICAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKFVURjhUeXBlLmluc3RhbmNlLmRlY29tcG9zZShyYW5kb21TdHJpbmcpKTsKKyAgICAgICAgICAgIGludCByYW5kb21JbnQgPSBwcm5nLm5leHRJbnQoKTsKKyAgICAgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChJbnQzMlR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKHJhbmRvbUludCkpOworICAgICAgICAgICAgZG91YmxlIHJhbmRvbURvdWJsZSA9IHBybmcubmV4dERvdWJsZSgpOworICAgICAgICAgICAgYnl0ZUJ1ZmZlcnMuYWRkKERvdWJsZVR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKHJhbmRvbURvdWJsZSkpOworICAgICAgICAgICAgQmlnSW50ZWdlciByYW5kb21pc2hWYXJpbnQgPSBCaWdJbnRlZ2VyLnByb2JhYmxlUHJpbWUoMTAwLCBwcm5nKTsKKyAgICAgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChJbnRlZ2VyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UocmFuZG9taXNoVmFyaW50KSk7CisgICAgICAgICAgICBCaWdEZWNpbWFsIHJhbmRvbWlzaERlY2ltYWwgPSBCaWdEZWNpbWFsLnZhbHVlT2YocHJuZy5uZXh0TG9uZygpLCBwcm5nLm5leHRJbnQoMTAwKSAtIDUwKTsKKyAgICAgICAgICAgIGJ5dGVCdWZmZXJzLmFkZChEZWNpbWFsVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UocmFuZG9taXNoRGVjaW1hbCkpOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMTAwXTsKKyAgICAgICAgcHJuZy5uZXh0Qnl0ZXMoYnl0ZXMpOworICAgICAgICBCeXRlQnVmZmVyIGV4aGF1c3RlZCA9IEJ5dGVCdWZmZXIud3JhcChieXRlcyk7CisgICAgICAgIEJ5dGVCdWZmZXJVdGlsLnJlYWRCeXRlcyhleGhhdXN0ZWQsIDEwMCk7CisKKyAgICAgICAgTGlzdDxJUGFydGl0aW9uZXI+IHBhcnRpdGlvbmVycyA9IEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlLAorICAgICAgICAgICAgICAgIFJhbmRvbVBhcnRpdGlvbmVyLmluc3RhbmNlLAorICAgICAgICAgICAgICAgIExlbmd0aFBhcnRpdGlvbmVyLmluc3RhbmNlCisgICAgICAgICAgICAgICAgLy8gTk9URSBMb2NhbFBhcnRpdGlvbmVyLCBPcmRlclByZXNlcnZpbmdQYXJ0aXRpb25lciwgYW5kIEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIgZG9uJ3QgbmVlZCBhIGRlZGljYXRlZAorICAgICAgICAgICAgICAgIC8vIFBhcnRpdGlvbmVyRGVmaW5lZE9yZGVyLgorICAgICAgICAgICAgICAgIC8vICAgMSkgTG9jYWxQYXJ0aXRpb25lciB1c2VzIGl0cyBpbm5lciBBYnN0cmFjdFR5cGUKKyAgICAgICAgICAgICAgICAvLyAgIDIpIE9yZGVyUHJlc2VydmluZ1BhcnRpdGlvbmVyIHVzZXMgVVRGOFR5cGUKKyAgICAgICAgICAgICAgICAvLyAgIDMpIEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIgdXNlcyBCeXRlc1R5cGUKKyAgICAgICAgKTsKKyAgICAgICAgZm9yIChJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgOiBwYXJ0aXRpb25lcnMpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiBwYXJ0aXRpb25PcmRlcmluZyA9IHBhcnRpdGlvbmVyLnBhcnRpdGlvbk9yZGVyaW5nKCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShwYXJ0aXRpb25PcmRlcmluZyBpbnN0YW5jZW9mIFBhcnRpdGlvbmVyRGVmaW5lZE9yZGVyKTsKKyAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBpbnB1dCA6IGJ5dGVCdWZmZXJzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSA9IHBhcnRpdGlvbk9yZGVyaW5nLmFzQ29tcGFyYWJsZUJ5dGVzKGlucHV0LCB2ZXJzaW9uKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIG91dHB1dCA9IHBhcnRpdGlvbk9yZGVyaW5nLmZyb21Db21wYXJhYmxlQnl0ZXMoQnl0ZVNvdXJjZS5wZWVrYWJsZShieXRlU291cmNlKSwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiRm9yIHBhcnRpdGlvbmVyICIgKyBwYXJ0aXRpb25lci5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoaW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChvdXRwdXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSA9IHBhcnRpdGlvbk9yZGVyaW5nLmFzQ29tcGFyYWJsZUJ5dGVzKGV4aGF1c3RlZCwgdmVyc2lvbik7CisgICAgICAgICAgICBCeXRlQnVmZmVyIG91dHB1dCA9IHBhcnRpdGlvbk9yZGVyaW5nLmZyb21Db21wYXJhYmxlQnl0ZXMoQnl0ZVNvdXJjZS5wZWVrYWJsZShieXRlU291cmNlKSwgdmVyc2lvbik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJ5dGVCdWZmZXJVdGlsLkVNUFRZX0JZVEVfQlVGRkVSLCBvdXRwdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZWRUeXBlKCkKKyAgICB7CisgICAgICAgIC8vIFRlc3QgaG93IFJldmVyc2VkVHlwZSBoYW5kbGVzIG51bGwgQnl0ZVNvdXJjZS5QZWVrYWJsZSAtIGhlcmUgdGhlIGNob2ljZSBvZiBiYXNlIHR5cGUgaXMgaW1wb3J0YW50LCBhcworICAgICAgICAvLyB0aGUgYmFzZSB0eXBlIHNob3VsZCBhbHNvIGJlIGFibGUgdG8gaGFuZGxlIG51bGwgQnl0ZVNvdXJjZS5QZWVrYWJsZS4KKyAgICAgICAgUmV2ZXJzZWRUeXBlPEJpZ0ludGVnZXI+IHJldmVyc2VkVmFyaW50VHlwZSA9IFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShJbnRlZ2VyVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIEJ5dGVCdWZmZXIgZGVjb2RlZE51bGwgPSByZXZlcnNlZFZhcmludFR5cGUuZnJvbUNvbXBhcmFibGVCeXRlcyhudWxsLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUiwgZGVjb2RlZE51bGwpOworCisgICAgICAgIC8vIFRlc3QgaG93IFJldmVyc2VkVHlwZSBoYW5kbGVzIHJhbmRvbSBkYXRhIHdpdGggc29tZSBjb21tb24gYW5kIGltcG9ydGFudCBiYXNlIHR5cGVzLgorICAgICAgICBNYXA8QWJzdHJhY3RUeXBlPD8+LCBCaUZ1bmN0aW9uPFJhbmRvbSwgSW50ZWdlciwgQnl0ZUJ1ZmZlcj4+IGJ1ZmZlckdlbmVyYXRvckJ5VHlwZSA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgYnVmZmVyR2VuZXJhdG9yQnlUeXBlLnB1dChVVEY4VHlwZS5pbnN0YW5jZSwgKHBybmcsIGxlbmd0aCkgLT4gVVRGOFR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKG5ld1JhbmRvbUFscGhhbnVtZXJpYyhwcm5nLCBsZW5ndGgpKSk7CisgICAgICAgIGJ1ZmZlckdlbmVyYXRvckJ5VHlwZS5wdXQoQnl0ZXNUeXBlLmluc3RhbmNlLCAocHJuZywgbGVuZ3RoKSAtPgorICAgICAgICB7CisgICAgICAgICAgICBieXRlW10gcmFuZG9tQnl0ZXMgPSBuZXcgYnl0ZVtsZW5ndGhdOworICAgICAgICAgICAgcHJuZy5uZXh0Qnl0ZXMocmFuZG9tQnl0ZXMpOworICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChyYW5kb21CeXRlcyk7CisgICAgICAgIH0pOworICAgICAgICBidWZmZXJHZW5lcmF0b3JCeVR5cGUucHV0KEludGVnZXJUeXBlLmluc3RhbmNlLCAocHJuZywgbGVuZ3RoKSAtPgorICAgICAgICB7CisgICAgICAgICAgICBCaWdJbnRlZ2VyIHJhbmRvbVZhcmludCA9IEJpZ0ludGVnZXIudmFsdWVPZihwcm5nLm5leHRMb25nKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW5ndGggLyA4OyArK2kpCisgICAgICAgICAgICAgICAgcmFuZG9tVmFyaW50ID0gcmFuZG9tVmFyaW50Lm11bHRpcGx5KEJpZ0ludGVnZXIudmFsdWVPZihwcm5nLm5leHRMb25nKCkpKTsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UocmFuZG9tVmFyaW50KTsKKyAgICAgICAgfSk7CisgICAgICAgIGJ1ZmZlckdlbmVyYXRvckJ5VHlwZS5wdXQoRGVjaW1hbFR5cGUuaW5zdGFuY2UsIChwcm5nLCBsZW5ndGgpIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIEJpZ0ludGVnZXIgcmFuZG9tTWFudGlzc2EgPSBCaWdJbnRlZ2VyLnZhbHVlT2YocHJuZy5uZXh0TG9uZygpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuZ3RoIC8gODsgKytpKQorICAgICAgICAgICAgICAgIHJhbmRvbU1hbnRpc3NhID0gcmFuZG9tTWFudGlzc2EubXVsdGlwbHkoQmlnSW50ZWdlci52YWx1ZU9mKHBybmcubmV4dExvbmcoKSkpOworICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCB0cmFpbGluZyB6ZXJvcyBmcm9tIHRoZSBtYW50aXNzYSBhbmQgdXNlIGFuIGV2ZW4gc2NhbGUsIGluIG9yZGVyIHRvIGhhdmUgYSAiY2Fub25pY2FsbHkKKyAgICAgICAgICAgIC8vIHJlcHJlc2VudGVkIiAoaW4gdGhlIGNvbnRleHQgb2YgRGVjaW1hbFR5cGUncyBlbmNvZGluZykgZGVjaW1hbCwgaS5lLiBvbmUgd2hpY2ggd291bGRuJ3QgYmUgcmUtc2NhbGVkIHRvCisgICAgICAgICAgICAvLyBjb25mb3JtIHdpdGggdGhlICJjb21wYWN0ZWQgbWFudGlzc2EgYmV0d2VlbiAwIGFuZCAxLCBzY2FsZSBhcyBhIHBvd2VyIG9mIDEwMCIgcnVsZS4KKyAgICAgICAgICAgIHdoaWxlIChyYW5kb21NYW50aXNzYS5yZW1haW5kZXIoQmlnSW50ZWdlci5URU4pLmVxdWFscyhCaWdJbnRlZ2VyLlpFUk8pKQorICAgICAgICAgICAgICAgIHJhbmRvbU1hbnRpc3NhID0gcmFuZG9tTWFudGlzc2EuZGl2aWRlKEJpZ0ludGVnZXIuVEVOKTsKKyAgICAgICAgICAgIGludCByYW5kb21TY2FsZSA9IHBybmcubmV4dEludCgpICYgLTI7CisgICAgICAgICAgICBCaWdEZWNpbWFsIHJhbmRvbURlY2ltYWwgPSBuZXcgQmlnRGVjaW1hbChyYW5kb21NYW50aXNzYSwgcmFuZG9tU2NhbGUpOworICAgICAgICAgICAgcmV0dXJuIERlY2ltYWxUeXBlLmluc3RhbmNlLmRlY29tcG9zZShyYW5kb21EZWNpbWFsKTsKKyAgICAgICAgfSk7CisgICAgICAgIFJhbmRvbSBwcm5nID0gbmV3IFJhbmRvbSgpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxBYnN0cmFjdFR5cGU8Pz4sIEJpRnVuY3Rpb248UmFuZG9tLCBJbnRlZ2VyLCBCeXRlQnVmZmVyPj4gZW50cnkgOiBidWZmZXJHZW5lcmF0b3JCeVR5cGUuZW50cnlTZXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgUmV2ZXJzZWRUeXBlPD8+IHJldmVyc2VkVHlwZSA9IFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICBmb3IgKGludCBsZW5ndGggPSAzMjsgbGVuZ3RoIDw9IDUxMjsgbGVuZ3RoICo9IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgaW5pdGlhbCA9IGVudHJ5LmdldFZhbHVlKCkuYXBwbHkocHJuZywgbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSByZXZlcnNlZFBlZWthYmxlID0gQnl0ZVNvdXJjZS5wZWVrYWJsZShyZXZlcnNlZFR5cGUuYXNDb21wYXJhYmxlQnl0ZXMoaW5pdGlhbCwgQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCkpOworICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGRlY29kZWQgPSByZXZlcnNlZFR5cGUuZnJvbUNvbXBhcmFibGVCeXRlcyhyZXZlcnNlZFBlZWthYmxlLCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpbml0aWFsLCBkZWNvZGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUeXBlKCkKKyAgICB7CisgICAgICAgIC8vIFRlc3Qgc2V0cyB3aXRoIGVsZW1lbnQgY29tcG9uZW50cyBub3QgaGF2aW5nIGtub3duL2NvbXB1dGFibGUgbGVuZ3RoIChlLmcuIHN0cmluZ3MpLgorICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgTGlzdDxTZXQ8U3RyaW5nPj4gc3RyaW5nU2V0cyA9IG5ld1JhbmRvbUVsZW1lbnRDb2xsZWN0aW9ucyhIYXNoU2V0OjpuZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgLT4gbmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoU2V0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgZmFsc2UpLCBzdHJpbmdTZXRzKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoU2V0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgdHJ1ZSksIHN0cmluZ1NldHMpOworICAgICAgICAvLyBUZXN0IHNldHMgd2l0aCBlbGVtZW50IGNvbXBvbmVudHMgd2l0aCBrbm93bi9jb21wdXRhYmxlIGxlbmd0aCAoZS5nLiAxMjgtYml0IFVVSURzKS4KKyAgICAgICAgTGlzdDxTZXQ8VVVJRD4+IHV1aWRTZXRzID0gbmV3UmFuZG9tRWxlbWVudENvbGxlY3Rpb25zKEhhc2hTZXQ6Om5ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQ6OnJhbmRvbVVVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDApOworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShTZXRUeXBlLmdldEluc3RhbmNlKFVVSURUeXBlLmluc3RhbmNlLCBmYWxzZSksIHV1aWRTZXRzKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoU2V0VHlwZS5nZXRJbnN0YW5jZShVVUlEVHlwZS5pbnN0YW5jZSwgdHJ1ZSksIHV1aWRTZXRzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaG9ydFR5cGUoKQorICAgIHsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoU2hvcnRUeXBlLmluc3RhbmNlLCBuZXcgU2hvcnRbXSB7IG51bGwgfSk7CisKKyAgICAgICAgU3RyZWFtPFNob3J0PiBhbGxTaG9ydHMgPSBJbnRTdHJlYW0ucmFuZ2UoU2hvcnQuTUlOX1ZBTFVFLCBTaG9ydC5NQVhfVkFMVUUgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBUb09iaih2YWx1ZSAtPiAoc2hvcnQpIHZhbHVlKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoU2hvcnRUeXBlLmluc3RhbmNlLCBhbGxTaG9ydHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZURhdGVUeXBlKCkKKyAgICB7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKFNpbXBsZURhdGVUeXBlLmluc3RhbmNlLCBuZXcgSW50ZWdlcltdIHsgbnVsbCB9KTsKKworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZSwgbmV3IFJhbmRvbSgpLmludHMoMTAwMCkuYm94ZWQoKSk7CisKKyAgICAgICAgLy8gVGVzdCBieSBtYW51YWxseSBjcmVhdGluZyBhbmQgbWFudWFsbHkgaW50ZXJwcmV0aW5nIHNpbXBsZSBkYXRlcyBmcm9tIHJhbmRvbSBtaWxsaXMuCisgICAgICAgIG5ldyBSYW5kb20oKS5pbnRzKDEwMDApLmZvckVhY2goaW5pdGlhbE1pbGxpcyAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsTWlsbGlzID0gTWF0aC5hYnMoaW5pdGlhbE1pbGxpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGluaXRpYWxEYXlzID0gU2ltcGxlRGF0ZVNlcmlhbGl6ZXIudGltZUluTWlsbGlzVG9EYXkoaW5pdGlhbE1pbGxpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIHNpbXBsZURhdGVCdWZmZXIgPSBTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZS5mcm9tVGltZUluTWlsbGlzKGluaXRpYWxNaWxsaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZSBieXRlU291cmNlID0gU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UuYXNDb21wYXJhYmxlQnl0ZXMoc2ltcGxlRGF0ZUJ1ZmZlciwgdmVyc2lvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGRlY29kZWREYXlzID0gU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UuY29tcG9zZShTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZS5mcm9tQ29tcGFyYWJsZUJ5dGVzKEJ5dGVTb3VyY2UucGVla2FibGUoYnl0ZVNvdXJjZSksIHZlcnNpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaW5pdGlhbERheXMsIGRlY29kZWREYXlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgLy8gVGVzdCBieSBtYW51YWxseSBjcmVhdGluZyBhbmQgbWFudWFsbHkgaW50ZXJwcmV0aW5nIHNpbXBsZSBkYXRlcyBmcm9tIHN0cmluZ3MuCisgICAgICAgIFN0cmluZ1tdIHNpbXBsZURhdGVTdHJpbmdzID0gbmV3IFN0cmluZ1tdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxOTcwLTAxLTAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE5NzAtMDEtMDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTk2OS0xMi0zMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItMDAwMS0wMS0wMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItNTg3NzUyMS0wMS0wMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDE0LTAxLTAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIis1ODgxNTgwLTAxLTEwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjE5MjAtMTItMDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTU4Mi0xMC0xOSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgIGZvciAoU3RyaW5nIHNpbXBsZURhdGUgOiBzaW1wbGVEYXRlU3RyaW5ncykKKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBzaW1wbGVEYXRhQnVmZmVyID0gU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UuZnJvbVN0cmluZyhzaW1wbGVEYXRlKTsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSA9IFNpbXBsZURhdGVUeXBlLmluc3RhbmNlLmFzQ29tcGFyYWJsZUJ5dGVzKHNpbXBsZURhdGFCdWZmZXIsIHZlcnNpb24pOworICAgICAgICAgICAgSW50ZWdlciBkZWNvZGVkRGF5cyA9IFNpbXBsZURhdGVUeXBlLmluc3RhbmNlLmNvbXBvc2UoU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UuZnJvbUNvbXBhcmFibGVCeXRlcyhCeXRlU291cmNlLnBlZWthYmxlKGJ5dGVTb3VyY2UpLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICBTdHJpbmcgZGVjb2RlZERhdGUgPSBTaW1wbGVEYXRlU2VyaWFsaXplci5pbnN0YW5jZS50b1N0cmluZyhkZWNvZGVkRGF5cyk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHNpbXBsZURhdGUsIGRlY29kZWREYXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVzdGFtcFR5cGUoKQorICAgIHsKKyAgICAgICAgRGF0ZVtdIGRhdGVzID0gbmV3IERhdGVbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoMEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoLTFMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKExvbmcuTUFYX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlKExvbmcuTUlOX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKFRpbWVzdGFtcFR5cGUuaW5zdGFuY2UsIGRhdGVzKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoVGltZXN0YW1wVHlwZS5pbnN0YW5jZSwgbmV3IFJhbmRvbSgpLmxvbmdzKDEwMDApLm1hcFRvT2JqKERhdGU6Om5ldykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVUeXBlKCkKKyAgICB7CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKFRpbWVUeXBlLmluc3RhbmNlLCBuZXcgTG9uZ1tdIHsgbnVsbCB9KTsKKworICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShUaW1lVHlwZS5pbnN0YW5jZSwgbmV3IFJhbmRvbSgpLmxvbmdzKDEwMDApLmJveGVkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR1cGxlVHlwZSgpCisgICAgeworICAgICAgICBUdXBsZVR5cGUgdHQgPSBuZXcgVHVwbGVUeXBlKEFycmF5cy5hc0xpc3QoVVRGOFR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsVHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXJUeXBlLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZXNUeXBlLmluc3RhbmNlKSk7CisgICAgICAgIFJhbmRvbSBwcm5nID0gbmV3IFJhbmRvbSgpOworICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHR1cGxlc0RhdGEgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgU3RyaW5nW10gdXRmOFZhbHVlcyA9IG5ldyBTdHJpbmdbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICLCqSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICBCaWdEZWNpbWFsW10gZGVjaW1hbFZhbHVlcyA9IG5ldyBCaWdEZWNpbWFsW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnRGVjaW1hbC5aRVJPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnRGVjaW1hbC52YWx1ZU9mKDEyMzQ1Njc4OTEwMTExMjEzMTRMLCA1MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwudmFsdWVPZigxMjM0NTY3ODkxMDExMTIxMzE0TCwgNTApLm5lZ2F0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICBCaWdJbnRlZ2VyW10gdmFyaW50VmFsdWVzID0gbmV3IEJpZ0ludGVnZXJbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyLlpFUk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5URU4ucG93KDEwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ0ludGVnZXIuVEVOLnBvdygxMDAwKS5uZWdhdGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICBieXRlW10gb25lQnl0ZSA9IG5ldyBieXRlWzFdOworICAgICAgICBieXRlW10gdGVuQnl0ZXMgPSBuZXcgYnl0ZVsxMF07CisgICAgICAgIGJ5dGVbXSBodW5kcmVkQnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOworICAgICAgICBieXRlW10gdGhvdXNhbmRCeXRlcyA9IG5ldyBieXRlWzEwMDBdOworICAgICAgICBwcm5nLm5leHRCeXRlcyhvbmVCeXRlKTsKKyAgICAgICAgcHJuZy5uZXh0Qnl0ZXModGVuQnl0ZXMpOworICAgICAgICBwcm5nLm5leHRCeXRlcyhodW5kcmVkQnl0ZXMpOworICAgICAgICBwcm5nLm5leHRCeXRlcyh0aG91c2FuZEJ5dGVzKTsKKyAgICAgICAgYnl0ZVtdW10gYnl0ZXNWYWx1ZXMgPSBuZXcgYnl0ZVtdW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGJ5dGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZUJ5dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW5kcmVkQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRob3VzYW5kQnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgIGZvciAoU3RyaW5nIHV0ZjggOiB1dGY4VmFsdWVzKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKEJpZ0RlY2ltYWwgZGVjaW1hbCA6IGRlY2ltYWxWYWx1ZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChCaWdJbnRlZ2VyIHZhcmludCA6IHZhcmludFZhbHVlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYnl0ZVtdIGJ5dGVzIDogYnl0ZXNWYWx1ZXMpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgdHVwbGVEYXRhID0gVHVwbGVUeXBlLmJ1aWxkVmFsdWUoVVRGOFR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKHV0ZjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsICE9IG51bGwgPyBEZWNpbWFsVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoZGVjaW1hbCkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpbnQgIT0gbnVsbCA/IEludGVnZXJUeXBlLmluc3RhbmNlLmRlY29tcG9zZSh2YXJpbnQpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY291bGQgYWxzbyB1c2UgdGhlIHdyYXBwZWQgYnl0ZXMgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZXNUeXBlLmluc3RhbmNlLmRlY29tcG9zZShCeXRlQnVmZmVyLndyYXAoYnl0ZXMpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZXNEYXRhLmFkZCh0dXBsZURhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRlc3RWYWx1ZXNGb3JUeXBlKHR0LCB0dXBsZXNEYXRhLnRvQXJyYXkobmV3IEJ5dGVCdWZmZXJbMF0pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVdGY4VHlwZSgpCisgICAgeworICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgdGVzdFZhbHVlc0ZvclR5cGUoVVRGOFR5cGUuaW5zdGFuY2UsIFN0cmVhbS5nZW5lcmF0ZSgoKSAtPiBuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTAwKSkubGltaXQoMTAwMCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR5cGVXaXRoQnl0ZU9yZGVyZWRDb21wYXJpc29uKCkKKyAgICB7CisgICAgICAgIFJhbmRvbSBwcm5nID0gbmV3IFJhbmRvbSgpOworICAgICAgICBieXRlW10gc2luZ2xlQnl0ZSA9IG5ldyBieXRlW10geyAoYnl0ZSkgcHJuZy5uZXh0SW50KCkgfTsKKyAgICAgICAgYnl0ZVtdIHRlbkJ5dGVzID0gbmV3IGJ5dGVbMTBdOworICAgICAgICBwcm5nLm5leHRCeXRlcyh0ZW5CeXRlcyk7CisgICAgICAgIGJ5dGVbXSBodW5kcmVkQnl0ZXMgPSBuZXcgYnl0ZVsxMDBdOworICAgICAgICBwcm5nLm5leHRCeXRlcyhodW5kcmVkQnl0ZXMpOworICAgICAgICBieXRlW10gdGhvdXNhbmRCeXRlcyA9IG5ldyBieXRlWzEwMDBdOworICAgICAgICBwcm5nLm5leHRCeXRlcyh0aG91c2FuZEJ5dGVzKTsKKyAgICAgICAgLy8gTm8gbnVsbCBoZXJlLCBhcyB0aGUgZGVmYXVsdCBhc0NvbXBhcmFibGVCeXRlcyhCeXRlQnVmZmVyLCBWZXJzaW9uKSBpbXBsZW1lbnRhdGlvbiAoYW5kIG1vcmUgc3BlY2lmaWNhbGx5CisgICAgICAgIC8vIHRoZSBCeXRlU291cmNlLm9mKEJ5dGVCdWZmZXIsIFZlcnNpb24pIGVuY29kaW5nKSB3b3VsZCB0aHJvdyB0aGVuLgorICAgICAgICB0ZXN0VmFsdWVzRm9yVHlwZShCeXRlT3JkZXJlZFR5cGUuaW5zdGFuY2UsIFN0cmVhbS5vZihCeXRlQnVmZmVyVXRpbC5FTVBUWV9CWVRFX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlci53cmFwKHNpbmdsZUJ5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyLndyYXAodGVuQnl0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyLndyYXAoaHVuZHJlZEJ5dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlci53cmFwKHRob3VzYW5kQnl0ZXMpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQnl0ZU9yZGVyZWRUeXBlIGV4dGVuZHMgQWJzdHJhY3RUeXBlPEJ5dGVCdWZmZXI+CisgICAgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJ5dGVPcmRlcmVkVHlwZSBpbnN0YW5jZSA9IG5ldyBCeXRlT3JkZXJlZFR5cGUoKTsKKworICAgICAgICBwcml2YXRlIEJ5dGVPcmRlcmVkVHlwZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1cGVyKENvbXBhcmlzb25UeXBlLkJZVEVfT1JERVIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCeXRlQnVmZmVyIGZyb21TdHJpbmcoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRlcm0gZnJvbUpTT05PYmplY3QoT2JqZWN0IHBhcnNlZCkgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFR5cGVTZXJpYWxpemVyPEJ5dGVCdWZmZXI+IGdldFNlcmlhbGl6ZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQnl0ZU9yZGVyZWRTZXJpYWxpemVyLmluc3RhbmNlOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNsYXNzIEJ5dGVPcmRlcmVkU2VyaWFsaXplciBleHRlbmRzIFR5cGVTZXJpYWxpemVyPEJ5dGVCdWZmZXI+CisgICAgICAgIHsKKworICAgICAgICAgICAgc3RhdGljIGZpbmFsIEJ5dGVPcmRlcmVkU2VyaWFsaXplciBpbnN0YW5jZSA9IG5ldyBCeXRlT3JkZXJlZFNlcmlhbGl6ZXIoKTsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBzZXJpYWxpemUoQnl0ZUJ1ZmZlciB2YWx1ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmR1cGxpY2F0ZSgpIDogbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgPFY+IEJ5dGVCdWZmZXIgZGVzZXJpYWxpemUoViBieXRlcywgVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYWNjZXNzb3IudG9CdWZmZXIoYnl0ZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyA8Vj4gdm9pZCB2YWxpZGF0ZShWIGJ5dGVzLCBWYWx1ZUFjY2Vzc29yPFY+IGFjY2Vzc29yKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgorICAgICAgICAgICAgeworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhCeXRlQnVmZmVyIHZhbHVlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KHZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQ2xhc3M8Qnl0ZUJ1ZmZlcj4gZ2V0VHlwZSgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIuY2xhc3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZVNvdXJjZUNvbXBhcmlzb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZVNvdXJjZUNvbXBhcmlzb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzMDllOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlQ29tcGFyaXNvblRlc3QuamF2YQpAQCAtMCwwICsxLDExNzkgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CitpbXBvcnQgamF2YS51dGlsLio7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkl0ZXJhYmxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuT3JkZXJpbmc7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLlV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5DbHVzdGVyaW5nUHJlZml4OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTG9jYWxQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTXVybXVyM1BhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5SYW5kb21QYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5CeXRlQnVmZmVyVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5NdXJtdXJIYXNoOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlRpbWVVVUlEOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLmJ5dGVjb21wYXJhYmxlLkJ5dGVDb21wYXJhYmxlLlZlcnNpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgZm9yd2FyZCBjb252ZXJzaW9uIHRvIEJ5dGVTb3VyY2UvQnl0ZUNvbXBhcmFibGUgYW5kIHRoYXQgdGhlIHJlc3VsdCBjb21wYXJlcyBjb3JyZWN0bHkuCisgKi8KK3B1YmxpYyBjbGFzcyBCeXRlU291cmNlQ29tcGFyaXNvblRlc3QgZXh0ZW5kcyBCeXRlU291cmNlVGVzdEJhc2UKK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQnl0ZVNvdXJjZUNvbXBhcmlzb25UZXN0LmNsYXNzKTsKKworICAgIEBSdWxlCisgICAgcHVibGljIGZpbmFsIEV4cGVjdGVkRXhjZXB0aW9uIGV4cGVjdGVkRXhjZXB0aW9uID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nc0FzY2lpKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKEFzY2lpVHlwZS5pbnN0YW5jZSwgdGVzdFN0cmluZ3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ3NVVEY4KCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKFVURjhUeXBlLmluc3RhbmNlLCB0ZXN0U3RyaW5ncyk7CisgICAgICAgIHRlc3REaXJlY3QoeCAtPiBCeXRlU291cmNlLm9mKHgsIFZlcnNpb24uT1NTNTApLCBPcmRlcmluZy48U3RyaW5nPm5hdHVyYWwoKTo6Y29tcGFyZSwgdGVzdFN0cmluZ3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJvb2xlYW5zKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKEJvb2xlYW5UeXBlLmluc3RhbmNlLCB0ZXN0Qm9vbHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludHMoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoSW50MzJUeXBlLmluc3RhbmNlLCB0ZXN0SW50cyk7CisgICAgICAgIHRlc3REaXJlY3QoeCAtPiBCeXRlU291cmNlLm9mKHgpLCBJbnRlZ2VyOjpjb21wYXJlLCB0ZXN0SW50cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByYW5kb21UZXN0SW50cygpCisgICAgeworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPDEwMDAwOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpMSA9IHJhbmQubmV4dEludCgpOworICAgICAgICAgICAgaW50IGkyID0gcmFuZC5uZXh0SW50KCk7CisgICAgICAgICAgICBhc3NlcnRDb21wYXJlc1NhbWUoSW50MzJUeXBlLmluc3RhbmNlLCBpMSwgaTIpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb25ncygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShMb25nVHlwZS5pbnN0YW5jZSwgdGVzdExvbmdzKTsKKyAgICAgICAgdGVzdERpcmVjdCh4IC0+IEJ5dGVTb3VyY2Uub2YoeCksIExvbmc6OmNvbXBhcmUsIHRlc3RMb25ncyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnRzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKFNob3J0VHlwZS5pbnN0YW5jZSwgdGVzdFNob3J0cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZXMoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoQnl0ZVR5cGUuaW5zdGFuY2UsIHRlc3RCeXRlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlcygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShEb3VibGVUeXBlLmluc3RhbmNlLCB0ZXN0RG91Ymxlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXRzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKEZsb2F0VHlwZS5pbnN0YW5jZSwgdGVzdEZsb2F0cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmlnSW50cygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgdGVzdEJpZ0ludHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJpZ0RlY2ltYWxzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKERlY2ltYWxUeXBlLmluc3RhbmNlLCB0ZXN0QmlnRGVjaW1hbHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJpZ0RlY2ltYWxJbkNvbWJpbmF0aW9uKCkKKyAgICB7CisgICAgICAgIEJpZ0RlY2ltYWwgYjEgPSBuZXcgQmlnRGVjaW1hbCgiMTIzNDU2Ljc4OTAxMjAxIik7CisgICAgICAgIEJpZ0RlY2ltYWwgYjIgPSBuZXcgQmlnRGVjaW1hbCgiMTIzNDU2Ljc4OTAxMiIpOworICAgICAgICBCb29sZWFuIGIgPSBmYWxzZTsKKworICAgICAgICBhc3NlcnRDbHVzdGVyaW5nUGFpckNvbXBhcmVzU2FtZShEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQm9vbGVhblR5cGUuaW5zdGFuY2UsIGIxLCBiLCBiMiwgYik7CisgICAgICAgIGFzc2VydENsdXN0ZXJpbmdQYWlyQ29tcGFyZXNTYW1lKEJvb2xlYW5UeXBlLmluc3RhbmNlLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgYiwgYjEsIGIsIGIyKTsKKworICAgICAgICBiMSA9IGIxLm5lZ2F0ZSgpOworICAgICAgICBiMiA9IGIyLm5lZ2F0ZSgpOworCisgICAgICAgIGFzc2VydENsdXN0ZXJpbmdQYWlyQ29tcGFyZXNTYW1lKERlY2ltYWxUeXBlLmluc3RhbmNlLCBCb29sZWFuVHlwZS5pbnN0YW5jZSwgYjEsIGIsIGIyLCBiKTsKKyAgICAgICAgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb21wYXJlc1NhbWUoQm9vbGVhblR5cGUuaW5zdGFuY2UsIERlY2ltYWxUeXBlLmluc3RhbmNlLCBiLCBiMSwgYiwgYjIpOworCisgICAgICAgIGIxID0gbmV3IEJpZ0RlY2ltYWwoIi0xMjM0NTYuNzg5MDEyODkiKTsKKyAgICAgICAgYjIgPSBuZXcgQmlnRGVjaW1hbCgiLTEyMzQ1Ni43ODkwMTIiKTsKKworICAgICAgICBhc3NlcnRDbHVzdGVyaW5nUGFpckNvbXBhcmVzU2FtZShEZWNpbWFsVHlwZS5pbnN0YW5jZSwgQm9vbGVhblR5cGUuaW5zdGFuY2UsIGIxLCBiLCBiMiwgYik7CisgICAgICAgIGFzc2VydENsdXN0ZXJpbmdQYWlyQ29tcGFyZXNTYW1lKEJvb2xlYW5UeXBlLmluc3RhbmNlLCBEZWNpbWFsVHlwZS5pbnN0YW5jZSwgYiwgYjEsIGIsIGIyKTsKKworICAgICAgICBiMSA9IG5ldyBCaWdEZWNpbWFsKCIxIik7CisgICAgICAgIGIyID0gbmV3IEJpZ0RlY2ltYWwoIjEuMSIpOworCisgICAgICAgIGFzc2VydENsdXN0ZXJpbmdQYWlyQ29tcGFyZXNTYW1lKERlY2ltYWxUeXBlLmluc3RhbmNlLCBCb29sZWFuVHlwZS5pbnN0YW5jZSwgYjEsIGIsIGIyLCBiKTsKKyAgICAgICAgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb21wYXJlc1NhbWUoQm9vbGVhblR5cGUuaW5zdGFuY2UsIERlY2ltYWxUeXBlLmluc3RhbmNlLCBiLCBiMSwgYiwgYjIpOworCisgICAgICAgIGIxID0gYjEubmVnYXRlKCk7CisgICAgICAgIGIyID0gYjIubmVnYXRlKCk7CisKKyAgICAgICAgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb21wYXJlc1NhbWUoRGVjaW1hbFR5cGUuaW5zdGFuY2UsIEJvb2xlYW5UeXBlLmluc3RhbmNlLCBiMSwgYiwgYjIsIGIpOworICAgICAgICBhc3NlcnRDbHVzdGVyaW5nUGFpckNvbXBhcmVzU2FtZShCb29sZWFuVHlwZS5pbnN0YW5jZSwgRGVjaW1hbFR5cGUuaW5zdGFuY2UsIGIsIGIxLCBiLCBiMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VVVJRHMoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoVVVJRFR5cGUuaW5zdGFuY2UsIHRlc3RVVUlEcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZVVVSURzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKFRpbWVVVUlEVHlwZS5pbnN0YW5jZSwgQXJyYXlzLnN0cmVhbSh0ZXN0VVVJRHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcih4IC0+IHggPT0gbnVsbCB8fCB4LnZlcnNpb24oKSA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoeCAtPiB4ICE9IG51bGwgPyBUaW1lVVVJRC5mcm9tVXVpZCh4KSA6IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGV4aWNhbFVVSURzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKExleGljYWxVVUlEVHlwZS5pbnN0YW5jZSwgdGVzdFVVSURzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVEYXRlKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKFNpbXBsZURhdGVUeXBlLmluc3RhbmNlLCBBcnJheXMuc3RyZWFtKHRlc3RJbnRzKS5maWx0ZXIoeCAtPiB4ICE9IG51bGwpLnRvQXJyYXkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZVR5cGUoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoVGltZVR5cGUuaW5zdGFuY2UsIEFycmF5cy5zdHJlYW0odGVzdExvbmdzKS5maWx0ZXIoeCAtPiB4ICE9IG51bGwgJiYgeCA+PSAwICYmIHggPD0gMjRMICogNjAgKiA2MCAqIDEwMDAgKiAxMDAwICogMTAwMCkudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERhdGVUeXBlKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKERhdGVUeXBlLmluc3RhbmNlLCB0ZXN0RGF0ZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVzdGFtcFR5cGUoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoVGltZXN0YW1wVHlwZS5pbnN0YW5jZSwgdGVzdERhdGVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlc1R5cGUoKQorICAgIHsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IHRlc3RWYWx1ZXNbaV0pCisgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCh0ZXN0VHlwZXNbaV0uZGVjb21wb3NlKG8pKTsKKworICAgICAgICB0ZXN0VHlwZShCeXRlc1R5cGUuaW5zdGFuY2UsIHZhbHVlcy50b0FycmF5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZXRBZGRyZXNzVHlwZSgpIHRocm93cyBVbmtub3duSG9zdEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoSW5ldEFkZHJlc3NUeXBlLmluc3RhbmNlLCB0ZXN0SW5ldHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5VHlwZSgpCisgICAgeworICAgICAgICB0ZXN0VHlwZShFbXB0eVR5cGUuaW5zdGFuY2UsIG5ldyBWb2lkW10geyBudWxsIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGl0aW9uZXJEZWZpbmVkT3JkZXIoKQorICAgIHsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IHRlc3RWYWx1ZXNbaV0pCisgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCh0ZXN0VHlwZXNbaV0uZGVjb21wb3NlKG8pKTsKKworICAgICAgICB0ZXN0QnVmZmVycyhuZXcgUGFydGl0aW9uZXJEZWZpbmVkT3JkZXIoTXVybXVyM1BhcnRpdGlvbmVyLmluc3RhbmNlKSwgdmFsdWVzKTsKKyAgICAgICAgdGVzdEJ1ZmZlcnMobmV3IFBhcnRpdGlvbmVyRGVmaW5lZE9yZGVyKFJhbmRvbVBhcnRpdGlvbmVyLmluc3RhbmNlKSwgdmFsdWVzKTsKKyAgICAgICAgdGVzdEJ1ZmZlcnMobmV3IFBhcnRpdGlvbmVyRGVmaW5lZE9yZGVyKEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UpLCB2YWx1ZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGl0aW9uZXJPcmRlcigpCisgICAgeworICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogdGVzdFZhbHVlc1tpXSkKKyAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHRlc3RUeXBlc1tpXS5kZWNvbXBvc2UobykpOworCisgICAgICAgIHRlc3REZWNvcmF0ZWRLZXlzKE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZSwgdmFsdWVzKTsKKyAgICAgICAgdGVzdERlY29yYXRlZEtleXMoUmFuZG9tUGFydGl0aW9uZXIuaW5zdGFuY2UsIHZhbHVlcyk7CisgICAgICAgIHRlc3REZWNvcmF0ZWRLZXlzKEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UsIHZhbHVlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYWxQYXRpdGlvbmVyT3JkZXIoKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBBYnN0cmFjdFR5cGUgdGVzdFR5cGUgPSB0ZXN0VHlwZXNbaV07CisgICAgICAgICAgICB0ZXN0RGVjb3JhdGVkS2V5cyhuZXcgTG9jYWxQYXJ0aXRpb25lcih0ZXN0VHlwZSksIExpc3RzLnRyYW5zZm9ybShBcnJheXMuYXNMaXN0KHRlc3RWYWx1ZXNbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2IC0+IHRlc3RUeXBlLmRlY29tcG9zZSh2KSkpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50ZXJmYWNlIFBhaXJUZXN0ZXIKKyAgICB7CisgICAgICAgIHZvaWQgdGVzdChBYnN0cmFjdFR5cGUgdDEsIEFic3RyYWN0VHlwZSB0MiwgT2JqZWN0IG8xLCBPYmplY3QgbzIsIE9iamVjdCBvMywgT2JqZWN0IG80KTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RDb21iaW5hdGlvblNhbXBsaW5nKFJhbmRvbSByYW5kLCBQYWlyVGVzdGVyIHRlc3RlcikKKyAgICB7CisgICAgICAgIGZvciAoaW50IGk9MDtpPHRlc3RUeXBlcy5sZW5ndGg7KytpKQorICAgICAgICAgICAgZm9yIChpbnQgaj0wO2o8dGVzdFR5cGVzLmxlbmd0aDsrK2opCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gdHYxID0gbmV3IE9iamVjdFszXTsKKyAgICAgICAgICAgICAgICBPYmplY3RbXSB0djIgPSBuZXcgT2JqZWN0WzNdOworICAgICAgICAgICAgICAgIGZvciAoaW50IHQ9MDsgdDx0djEubGVuZ3RoOyArK3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0djFbdF0gPSB0ZXN0VmFsdWVzW2ldW3JhbmQubmV4dEludCh0ZXN0VmFsdWVzW2ldLmxlbmd0aCldOworICAgICAgICAgICAgICAgICAgICB0djJbdF0gPSB0ZXN0VmFsdWVzW2pdW3JhbmQubmV4dEludCh0ZXN0VmFsdWVzW2pdLmxlbmd0aCldOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8xIDogdHYxKQorICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvMiA6IHR2MikKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8zIDogdHYxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG80IDogdHYyKQorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ZXN0ZXIudGVzdCh0ZXN0VHlwZXNbaV0sIHRlc3RUeXBlc1tqXSwgbzEsIG8yLCBvMywgbzQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21iaW5hdGlvbnMoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHJhbmQgPSBuZXcgUmFuZG9tKDApOworICAgICAgICB0ZXN0Q29tYmluYXRpb25TYW1wbGluZyhyYW5kLCB0aGlzOjphc3NlcnRDbHVzdGVyaW5nUGFpckNvbXBhcmVzU2FtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbHNJbkNsdXN0ZXJpbmcoKQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlcltdW10gaW5wdXRzID0gbmV3IEJ5dGVCdWZmZXJbXVtdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVCdWZmZXJbXSB7ZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAiYSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCAwKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQnVmZmVyW10ge2RlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgImEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgbnVsbCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHtkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICJhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHtkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgMCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHtkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgbnVsbCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHtkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQnVmZmVyW10ge251bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUFuZFJhbmRvbVBhZChJbnQzMlR5cGUuaW5zdGFuY2UsIDApfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVCdWZmZXJbXSB7bnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgbnVsbCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHtudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICBmb3IgKEJ5dGVCdWZmZXJbXSBpbnB1dDEgOiBpbnB1dHMpCisgICAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXJbXSBpbnB1dDIgOiBpbnB1dHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb21wYXJlc1NhbWUoVVRGOFR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDFbMF0sIGlucHV0MVsxXSwgaW5wdXQyWzBdLCBpbnB1dDJbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQsIHYpIC0+IChCeXRlQnVmZmVyKSB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0MVswXSAhPSBudWxsICYmIGlucHV0MVsxXSAhPSBudWxsICYmIGlucHV0MlswXSAhPSBudWxsICYmIGlucHV0MlsxXSAhPSBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsc0luQ2x1c3RlcmluZ0xlZ2FjeSgpCisgICAgeworICAgICAgICAvLyB2ZXJpZnkgdGhlIGxlZ2FjeSBlbmNvZGluZyB0cmVhdHMgbnVsbCBjbHVzdGVyaW5nIHRoZSBzYW1lIGFzIG51bGwgdmFsdWUKKyAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeDxCeXRlQnVmZmVyPiBhTnVsbCA9IG1ha2VCb3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQuQ0xVU1RFUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICJhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgbnVsbCkpOworICAgICAgICBDbHVzdGVyaW5nUHJlZml4PEJ5dGVCdWZmZXI+IGFFbXB0eSA9IG1ha2VCb3VuZChDbHVzdGVyaW5nUHJlZml4LktpbmQuQ0xVU1RFUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAiYSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcCA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihVVEY4VHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoY29tcC5hc0J5dGVDb21wYXJhYmxlKGFOdWxsKSwgY29tcC5hc0J5dGVDb21wYXJhYmxlKGFFbXB0eSksIFZlcnNpb24uTEVHQUNZKSk7CisgICAgICAgIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBSZXZlcnNlZCA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihVVEY4VHlwZS5pbnN0YW5jZSwgUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKEludDMyVHlwZS5pbnN0YW5jZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgQnl0ZUNvbXBhcmFibGUuY29tcGFyZShjb21wUmV2ZXJzZWQuYXNCeXRlQ29tcGFyYWJsZShhTnVsbCksIGNvbXBSZXZlcnNlZC5hc0J5dGVDb21wYXJhYmxlKGFFbXB0eSksIFZlcnNpb24uTEVHQUNZKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlDbHVzdGVyaW5nKCkKKyAgICB7CisgICAgICAgIGFzc2VydEVtcHR5Q29tcGFyZWRUb1N0YXRpYygxLCBDbHVzdGVyaW5nUHJlZml4LktpbmQuQ0xVU1RFUklORywgVmVyc2lvbi5PU1M1MCk7CisgICAgICAgIGFzc2VydEVtcHR5Q29tcGFyZWRUb1N0YXRpYygwLCBDbHVzdGVyaW5nUHJlZml4LktpbmQuU1RBVElDX0NMVVNURVJJTkcsIFZlcnNpb24uT1NTNTApOworICAgICAgICBhc3NlcnRFbXB0eUNvbXBhcmVkVG9TdGF0aWMoMSwgQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfU1RBUlRfQk9VTkQsIFZlcnNpb24uT1NTNTApOworICAgICAgICBhc3NlcnRFbXB0eUNvbXBhcmVkVG9TdGF0aWMoMSwgQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLklOQ0xfRU5EX0JPVU5ELCBWZXJzaW9uLk9TUzUwKTsKKworICAgICAgICBhc3NlcnRFbXB0eUNvbXBhcmVkVG9TdGF0aWMoMSwgQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLkNMVVNURVJJTkcsIFZlcnNpb24uTEVHQUNZKTsKKyAgICAgICAgYXNzZXJ0RW1wdHlDb21wYXJlZFRvU3RhdGljKDAsIENsdXN0ZXJpbmdQcmVmaXguS2luZC5TVEFUSUNfQ0xVU1RFUklORywgVmVyc2lvbi5MRUdBQ1kpOworICAgICAgICBhc3NlcnRFbXB0eUNvbXBhcmVkVG9TdGF0aWMoLTEsIENsdXN0ZXJpbmdQcmVmaXguS2luZC5JTkNMX1NUQVJUX0JPVU5ELCBWZXJzaW9uLkxFR0FDWSk7CisgICAgICAgIGFzc2VydEVtcHR5Q29tcGFyZWRUb1N0YXRpYygxLCBDbHVzdGVyaW5nUHJlZml4LktpbmQuSU5DTF9FTkRfQk9VTkQsIFZlcnNpb24uTEVHQUNZKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RW1wdHlDb21wYXJlZFRvU3RhdGljKGludCBleHBlY3RlZCwgQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGtpbmQsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Qnl0ZUJ1ZmZlcj4gZW1wdHkgPSBtYWtlQm91bmQoa2luZCk7CisgICAgICAgIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBFbXB0eSA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEludGVnZXIuc2lnbnVtKEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoY29tcEVtcHR5LmFzQnl0ZUNvbXBhcmFibGUoZW1wdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcEVtcHR5LmFzQnl0ZUNvbXBhcmFibGUoQ2x1c3RlcmluZy5TVEFUSUNfQ0xVU1RFUklORyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKSkpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb21wYXJlc1NhbWUoQWJzdHJhY3RUeXBlPD8+IHQxLCBBYnN0cmFjdFR5cGU8Pz4gdDIsIE9iamVjdCBvMSwgT2JqZWN0IG8yLCBPYmplY3QgbzMsIE9iamVjdCBvNCkKKyAgICB7CisgICAgICAgIGFzc2VydENsdXN0ZXJpbmdQYWlyQ29tcGFyZXNTYW1lKHQxLCB0MiwgbzEsIG8yLCBvMywgbzQsIEFic3RyYWN0VHlwZTo6ZGVjb21wb3NlLCB0cnVlKTsKKyAgICB9CisKKyAgICB2b2lkIGFzc2VydENsdXN0ZXJpbmdQYWlyQ29tcGFyZXNTYW1lKEFic3RyYWN0VHlwZTw/PiB0MSwgQWJzdHJhY3RUeXBlPD8+IHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG8xLCBPYmplY3QgbzIsIE9iamVjdCBvMywgT2JqZWN0IG80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlGdW5jdGlvbjxBYnN0cmFjdFR5cGUsIE9iamVjdCwgQnl0ZUJ1ZmZlcj4gZGVjb21wb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0ZXN0TGVnYWN5KQorICAgIHsKKyAgICAgICAgRW51bVNldDxDbHVzdGVyaW5nUHJlZml4LktpbmQ+IHNraXBwZWRLaW5kcyA9IEVudW1TZXQub2YoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLlNTVEFCTEVfTE9XRVJfQk9VTkQsIENsdXN0ZXJpbmdQcmVmaXguS2luZC5TU1RBQkxFX1VQUEVSX0JPVU5EKTsKKyAgICAgICAgZm9yIChWZXJzaW9uIHYgOiBWZXJzaW9uLnZhbHVlcygpKQorICAgICAgICAgICAgZm9yIChDbHVzdGVyaW5nUHJlZml4LktpbmQgazEgOiBFbnVtU2V0LmNvbXBsZW1lbnRPZihza2lwcGVkS2luZHMpKQorICAgICAgICAgICAgICAgIGZvciAoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGsyIDogRW51bVNldC5jb21wbGVtZW50T2Yoc2tpcHBlZEtpbmRzKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghdGVzdExlZ2FjeSAmJiB2ID09IFZlcnNpb24uTEVHQUNZKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcCA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcih0MSwgdDIpOworICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyW10gYiA9IG5ldyBCeXRlQnVmZmVyWzJdOworICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyW10gZCA9IG5ldyBCeXRlQnVmZmVyWzJdOworICAgICAgICAgICAgICAgICAgICBiWzBdID0gZGVjb21wb3NlLmFwcGx5KHQxLCBvMSk7CisgICAgICAgICAgICAgICAgICAgIGJbMV0gPSBkZWNvbXBvc2UuYXBwbHkodDIsIG8yKTsKKyAgICAgICAgICAgICAgICAgICAgZFswXSA9IGRlY29tcG9zZS5hcHBseSh0MSwgbzMpOworICAgICAgICAgICAgICAgICAgICBkWzFdID0gZGVjb21wb3NlLmFwcGx5KHQyLCBvNCk7CisgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Qnl0ZUJ1ZmZlcj4gYyA9IG1ha2VCb3VuZChrMSwgYik7CisgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Qnl0ZUJ1ZmZlcj4gZSA9IG1ha2VCb3VuZChrMiwgZCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGJzYyA9IGNvbXAuYXNCeXRlQ29tcGFyYWJsZShjKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQnl0ZUNvbXBhcmFibGUgYnNlID0gY29tcC5hc0J5dGVDb21wYXJhYmxlKGUpOworICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWQgPSBJbnRlZ2VyLnNpZ251bShjb21wLmNvbXBhcmUoYywgZSkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRmFpbGVkIGNvbXBhcmluZyAlcyBhbmQgJXMsICVzIHZzICVzIHZlcnNpb24gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlU3RyKGMuY2x1c3RlcmluZ1N0cmluZyhjb21wLnN1YnR5cGVzKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihlLmNsdXN0ZXJpbmdTdHJpbmcoY29tcC5zdWJ0eXBlcygpKSksIGJzYywgYnNlLCB2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBJbnRlZ2VyLnNpZ251bShCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJzYywgYnNlLCB2KSkpOworICAgICAgICAgICAgICAgICAgICBtYXliZUNoZWNrNDFQcm9wZXJ0aWVzKGV4cGVjdGVkLCBic2MsIGJzZSwgdik7CisgICAgICAgICAgICAgICAgICAgIG1heWJlQXNzZXJ0Tm90UHJlZml4KGJzYywgYnNlLCB2KTsKKworICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wUiA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UodDEpLCBSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UodDIpKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQnl0ZUNvbXBhcmFibGUgYnNyYyA9IGNvbXBSLmFzQnl0ZUNvbXBhcmFibGUoYyk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGJzcmUgPSBjb21wUi5hc0J5dGVDb21wYXJhYmxlKGUpOworICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRSID0gSW50ZWdlci5zaWdudW0oY29tcFIuY29tcGFyZShjLCBlKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJGYWlsZWQgY29tcGFyaW5nIHJldmVyc2VkICVzIGFuZCAlcywgJXMgdnMgJXMgdmVyc2lvbiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoYy5jbHVzdGVyaW5nU3RyaW5nKGNvbXAuc3VidHlwZXMoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlU3RyKGUuY2x1c3RlcmluZ1N0cmluZyhjb21wLnN1YnR5cGVzKCkpKSwgYnNyYywgYnNyZSwgdiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZFIsIEludGVnZXIuc2lnbnVtKEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnNyYywgYnNyZSwgdikpKTsKKyAgICAgICAgICAgICAgICAgICAgbWF5YmVDaGVjazQxUHJvcGVydGllcyhleHBlY3RlZFIsIGJzcmMsIGJzcmUsIHYpOworICAgICAgICAgICAgICAgICAgICBtYXliZUFzc2VydE5vdFByZWZpeChic3JjLCBic3JlLCB2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIENsdXN0ZXJpbmdQcmVmaXg8Qnl0ZUJ1ZmZlcj4gbWFrZUJvdW5kKENsdXN0ZXJpbmdQcmVmaXguS2luZCBrMSwgQnl0ZUJ1ZmZlci4uLiBiKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1ha2VCb3VuZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UuZmFjdG9yeSgpLCBrMSwgYik7CisgICAgfQorCisgICAgc3RhdGljIDxUPiBDbHVzdGVyaW5nUHJlZml4PFQ+IG1ha2VCb3VuZChWYWx1ZUFjY2Vzc29yLk9iamVjdEZhY3Rvcnk8VD4gZmFjdG9yeSwgQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGsxLCBUW10gYikKKyAgICB7CisgICAgICAgIHN3aXRjaCAoazEpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBJTkNMX0VORF9FWENMX1NUQVJUX0JPVU5EQVJZOgorICAgICAgICBjYXNlIEVYQ0xfRU5EX0lOQ0xfU1RBUlRfQk9VTkRBUlk6CisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5ib3VuZGFyeShrMSwgYik7CisKKyAgICAgICAgY2FzZSBJTkNMX0VORF9CT1VORDoKKyAgICAgICAgY2FzZSBFWENMX0VORF9CT1VORDoKKyAgICAgICAgY2FzZSBJTkNMX1NUQVJUX0JPVU5EOgorICAgICAgICBjYXNlIEVYQ0xfU1RBUlRfQk9VTkQ6CisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5ib3VuZChrMSwgYik7CisKKyAgICAgICAgY2FzZSBDTFVTVEVSSU5HOgorICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkuY2x1c3RlcmluZyhiKTsKKworICAgICAgICBjYXNlIFNUQVRJQ19DTFVTVEVSSU5HOgorICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnkuc3RhdGljQ2x1c3RlcmluZygpOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoazEpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHVwbGVUeXBlKCkKKyAgICB7CisgICAgICAgIFJhbmRvbSByYW5kID0gVGhyZWFkTG9jYWxSYW5kb20uY3VycmVudCgpOworICAgICAgICB0ZXN0Q29tYmluYXRpb25TYW1wbGluZyhyYW5kLCB0aGlzOjphc3NlcnRUdXBsZUNvbXBhcmVzU2FtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHVwbGVUeXBlTm9uRnVsbCgpCisgICAgeworICAgICAgICBUdXBsZVR5cGUgdHQgPSBuZXcgVHVwbGVUeXBlKEltbXV0YWJsZUxpc3Qub2YoVVRGOFR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSkpOworICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHRlc3RzID0gSW1tdXRhYmxlTGlzdC5vZgorICAgICAgICAgICAgKAorICAgICAgICAgICAgVHVwbGVUeXBlLmJ1aWxkVmFsdWUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCAwKSksCisgICAgICAgICAgICAvLyBOb3RlOiBhIGRlY29tcG9zZWQgbnVsbCAoZS5nLiBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCBudWxsKSkgc2hvdWxkIG5vdCByZWFjaCBhIHR1cGxlCisgICAgICAgICAgICBUdXBsZVR5cGUuYnVpbGRWYWx1ZShCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwpLAorICAgICAgICAgICAgVHVwbGVUeXBlLmJ1aWxkVmFsdWUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUFuZFJhbmRvbVBhZChJbnQzMlR5cGUuaW5zdGFuY2UsIDApKSwKKyAgICAgICAgICAgIFR1cGxlVHlwZS5idWlsZFZhbHVlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpKSwKKyAgICAgICAgICAgIFR1cGxlVHlwZS5idWlsZFZhbHVlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgKEJ5dGVCdWZmZXIpIG51bGwpLAorICAgICAgICAgICAgVHVwbGVUeXBlLmJ1aWxkVmFsdWUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKQorICAgICAgICAgICAgKTsKKyAgICAgICAgdGVzdEJ1ZmZlcnModHQsIHRlc3RzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUdXBsZU5ld0ZpZWxkKCkKKyAgICB7CisgICAgICAgIFR1cGxlVHlwZSB0MSA9IG5ldyBUdXBsZVR5cGUoSW1tdXRhYmxlTGlzdC5vZihVVEY4VHlwZS5pbnN0YW5jZSkpOworICAgICAgICBUdXBsZVR5cGUgdDIgPSBuZXcgVHVwbGVUeXBlKEltbXV0YWJsZUxpc3Qub2YoVVRGOFR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSkpOworCisgICAgICAgIEJ5dGVCdWZmZXIgdk9uZSA9IFR1cGxlVHlwZS5idWlsZFZhbHVlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAic3RyIikpOworICAgICAgICBCeXRlQnVmZmVyIHZPbmVBbmROdWxsID0gVHVwbGVUeXBlLmJ1aWxkVmFsdWUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAic3RyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKworICAgICAgICBCeXRlQ29tcGFyYWJsZSBiT25lMSA9IHR5cGVUb0NvbXBhcmFibGUodDEsIHZPbmUpOworICAgICAgICBCeXRlQ29tcGFyYWJsZSBiT25lMiA9IHR5cGVUb0NvbXBhcmFibGUodDIsIHZPbmUpOworICAgICAgICBCeXRlQ29tcGFyYWJsZSBiT25lQW5kTnVsbDIgPSB0eXBlVG9Db21wYXJhYmxlKHQyLCB2T25lQW5kTnVsbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgYnl0ZS1jb21wYXJhYmxlIHZlcnNpb24gb2YgYSBvbmUtZmllbGQgdHVwbGUgbXVzdCBiZSB0aGUgc2FtZSBhcyBhIHR3by1maWVsZCB0dXBsZSB3aXRoIG5vbi1wcmVzZW50IHNlY29uZCBjb21wb25lbnQuIiwKKyAgICAgICAgICAgICAgICAgICAgIGJPbmUxLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVmVyc2lvbi5PU1M1MCksCisgICAgICAgICAgICAgICAgICAgICBiT25lMi5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZlcnNpb24uT1NTNTApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgYnl0ZS1jb21wYXJhYmxlIHZlcnNpb24gb2YgYSBvbmUtZmllbGQgdHVwbGUgbXVzdCBiZSB0aGUgc2FtZSBhcyBhIHR3by1maWVsZCB0dXBsZSB3aXRoIG51bGwgYXMgc2Vjb25kIGNvbXBvbmVudC4iLAorICAgICAgICAgICAgICAgICAgICAgYk9uZTEuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWZXJzaW9uLk9TUzUwKSwKKyAgICAgICAgICAgICAgICAgICAgIGJPbmVBbmROdWxsMi5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZlcnNpb24uT1NTNTApKTsKKyAgICB9CisKKworICAgIHZvaWQgYXNzZXJ0VHVwbGVDb21wYXJlc1NhbWUoQWJzdHJhY3RUeXBlIHQxLCBBYnN0cmFjdFR5cGUgdDIsIE9iamVjdCBvMSwgT2JqZWN0IG8yLCBPYmplY3QgbzMsIE9iamVjdCBvNCkKKyAgICB7CisgICAgICAgIFR1cGxlVHlwZSB0dCA9IG5ldyBUdXBsZVR5cGUoSW1tdXRhYmxlTGlzdC5vZih0MSwgdDIpKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiMSA9IFR1cGxlVHlwZS5idWlsZFZhbHVlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUZvclR1cGxlKHQxLCBvMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VGb3JUdXBsZSh0MiwgbzIpKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiMiA9IFR1cGxlVHlwZS5idWlsZFZhbHVlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUZvclR1cGxlKHQxLCBvMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VGb3JUdXBsZSh0MiwgbzQpKTsKKyAgICAgICAgYXNzZXJ0Q29tcGFyZXNTYW1lQnVmZmVycyh0dCwgYjEsIGIyKTsKKyAgICB9CisKKyAgICBzdGF0aWMgPFQ+IEJ5dGVCdWZmZXIgZGVjb21wb3NlRm9yVHVwbGUoQWJzdHJhY3RUeXBlPFQ+IHQsIFQgbykKKyAgICB7CisgICAgICAgIHJldHVybiBvICE9IG51bGwgPyB0LmRlY29tcG9zZShvKSA6IG51bGw7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlVHlwZSgpCisgICAgeworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oMCk7CisgICAgICAgIHRlc3RDb21iaW5hdGlvblNhbXBsaW5nKHJhbmQsIHRoaXM6OmFzc2VydENvbXBvc2l0ZUNvbXBhcmVzU2FtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcG9zaXRlVHlwZU5vbkZ1bGwoKQorICAgIHsKKyAgICAgICAgQ29tcG9zaXRlVHlwZSB0dCA9IENvbXBvc2l0ZVR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIEludDMyVHlwZS5pbnN0YW5jZSk7CisgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gdGVzdHMgPSBJbW11dGFibGVMaXN0Lm9mCisgICAgICAgICAgICAoCisgICAgICAgICAgICBDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAiIiksIGRlY29tcG9zZUFuZFJhbmRvbVBhZChJbnQzMlR5cGUuaW5zdGFuY2UsIDApKSwKKyAgICAgICAgICAgIENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSwgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgbnVsbCkpLAorICAgICAgICAgICAgQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGRlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpKSwKKyAgICAgICAgICAgIENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlKSwKKyAgICAgICAgICAgIENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCB0cnVlLCBkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSksCisgICAgICAgICAgICBDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSx0cnVlKQorICAgICAgICAgICAgKTsKKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGIgOiB0ZXN0cykKKyAgICAgICAgICAgIHR0LnZhbGlkYXRlKGIpOworICAgICAgICB0ZXN0QnVmZmVycyh0dCwgdGVzdHMpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Q29tcG9zaXRlQ29tcGFyZXNTYW1lKEFic3RyYWN0VHlwZSB0MSwgQWJzdHJhY3RUeXBlIHQyLCBPYmplY3QgbzEsIE9iamVjdCBvMiwgT2JqZWN0IG8zLCBPYmplY3QgbzQpCisgICAgeworICAgICAgICBDb21wb3NpdGVUeXBlIHR0ID0gQ29tcG9zaXRlVHlwZS5nZXRJbnN0YW5jZSh0MSwgdDIpOworICAgICAgICBCeXRlQnVmZmVyIGIxID0gQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGRlY29tcG9zZUFuZFJhbmRvbVBhZCh0MSwgbzEpLCBkZWNvbXBvc2VBbmRSYW5kb21QYWQodDIsIG8yKSk7CisgICAgICAgIEJ5dGVCdWZmZXIgYjIgPSBDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgZGVjb21wb3NlQW5kUmFuZG9tUGFkKHQxLCBvMyksIGRlY29tcG9zZUFuZFJhbmRvbVBhZCh0MiwgbzQpKTsKKyAgICAgICAgYXNzZXJ0Q29tcGFyZXNTYW1lQnVmZmVycyh0dCwgYjEsIGIyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljQ29tcG9zaXRlKCkKKyAgICB7CisgICAgICAgIER5bmFtaWNDb21wb3NpdGVUeXBlIHR0ID0gRHluYW1pY0NvbXBvc2l0ZVR5cGUuZ2V0SW5zdGFuY2UoRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmFsaWFzZXMpOworICAgICAgICBVVUlEW10gdXVpZHMgPSBEeW5hbWljQ29tcG9zaXRlVHlwZVRlc3QudXVpZHM7CisgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gdGVzdHMgPSBJbW11dGFibGVMaXN0Lm9mCisgICAgICAgICAgICAoCisgICAgICAgICAgICBEeW5hbWljQ29tcG9zaXRlVHlwZVRlc3QuY3JlYXRlRHluYW1pY0NvbXBvc2l0ZUtleSgidGVzdDEiLCBudWxsLCAtMSwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoInRlc3QxIiwgdXVpZHNbMF0sIDI0LCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICBEeW5hbWljQ29tcG9zaXRlVHlwZVRlc3QuY3JlYXRlRHluYW1pY0NvbXBvc2l0ZUtleSgidGVzdDEiLCB1dWlkc1swXSwgNDIsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgIER5bmFtaWNDb21wb3NpdGVUeXBlVGVzdC5jcmVhdGVEeW5hbWljQ29tcG9zaXRlS2V5KCJ0ZXN0MiIsIHV1aWRzWzBdLCAtMSwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoInRlc3QyIiwgdXVpZHNbMV0sIDQyLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICk7CisgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBiIDogdGVzdHMpCisgICAgICAgICAgICB0dC52YWxpZGF0ZShiKTsKKyAgICAgICAgdGVzdEJ1ZmZlcnModHQsIHRlc3RzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0VHlwZVN0cmluZygpCisgICAgeworICAgICAgICB0ZXN0Q29sbGVjdGlvbihMaXN0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgdHJ1ZSksIHRlc3RTdHJpbmdzLCAoKSAtPiBuZXcgQXJyYXlMaXN0PD4oKSwgbmV3IFJhbmRvbSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0VHlwZUxvbmcoKQorICAgIHsKKyAgICAgICAgdGVzdENvbGxlY3Rpb24oTGlzdFR5cGUuZ2V0SW5zdGFuY2UoTG9uZ1R5cGUuaW5zdGFuY2UsIHRydWUpLCB0ZXN0TG9uZ3MsICgpIC0+IG5ldyBBcnJheUxpc3Q8PigpLCBuZXcgUmFuZG9tKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldFR5cGVTdHJpbmcoKQorICAgIHsKKyAgICAgICAgdGVzdENvbGxlY3Rpb24oU2V0VHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgdHJ1ZSksIHRlc3RTdHJpbmdzLCAoKSAtPiBuZXcgSGFzaFNldDw+KCksIG5ldyBSYW5kb20oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0VHlwZUxvbmcoKQorICAgIHsKKyAgICAgICAgdGVzdENvbGxlY3Rpb24oU2V0VHlwZS5nZXRJbnN0YW5jZShMb25nVHlwZS5pbnN0YW5jZSwgdHJ1ZSksIHRlc3RMb25ncywgKCkgLT4gbmV3IEhhc2hTZXQ8PigpLCBuZXcgUmFuZG9tKCkpOworICAgIH0KKworICAgIDxULCBDVCBleHRlbmRzIENvbGxlY3Rpb248VD4+IHZvaWQgdGVzdENvbGxlY3Rpb24oQ29sbGVjdGlvblR5cGU8Q1Q+IHR0LCBUW10gdmFsdWVzLCBTdXBwbGllcjxDVD4gZ2VuLCBSYW5kb20gcmFuZCkKKyAgICB7CisgICAgICAgIGludCBjbnQgPSAwOworICAgICAgICBMaXN0PENUPiB0ZXN0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB0ZXN0cy5hZGQoZ2VuLmdldCgpKTsKKyAgICAgICAgZm9yIChpbnQgYyA9IDE7IGMgPD0gMzsgKytjKQorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyArK2opCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ1QgbCA9IGdlbi5nZXQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGM7ICsraSkKKyAgICAgICAgICAgICAgICAgICAgbC5hZGQodmFsdWVzW2NudCsrICUgdmFsdWVzLmxlbmd0aF0pOworCisgICAgICAgICAgICAgICAgdGVzdHMuYWRkKGwpOworICAgICAgICAgICAgfQorICAgICAgICB0ZXN0VHlwZSh0dCwgdGVzdHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcFR5cGVTdHJpbmdMb25nKCkKKyAgICB7CisgICAgICAgIHRlc3RNYXAoTWFwVHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgTG9uZ1R5cGUuaW5zdGFuY2UsIHRydWUpLCB0ZXN0U3RyaW5ncywgdGVzdExvbmdzLCAoKSAtPiBuZXcgSGFzaE1hcDw+KCksIG5ldyBSYW5kb20oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwVHlwZVN0cmluZ0xvbmdUcmVlKCkKKyAgICB7CisgICAgICAgIHRlc3RNYXAoTWFwVHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgTG9uZ1R5cGUuaW5zdGFuY2UsIHRydWUpLCB0ZXN0U3RyaW5ncywgdGVzdExvbmdzLCAoKSAtPiBuZXcgVHJlZU1hcDw+KCksIG5ldyBSYW5kb20oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb3JhdGVkS2V5UHJlZml4ZXNWT1NTNTAoKQorICAgIHsKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgcGFzcyB3aXRoIHRoZSBPU1MgNC4xIGVuY29kaW5nCisgICAgICAgIHRlc3REZWNvcmF0ZWRLZXlQcmVmaXhlcyhWZXJzaW9uLk9TUzUwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvcmF0ZWRLZXlQcmVmaXhlc1ZMZWdhY3koKQorICAgIHsKKyAgICAgICAgLy8gLi4uIGFuZCBmYWlsIHdpdGggdGhlIGxlZ2FjeSBlbmNvZGluZworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgdGVzdERlY29yYXRlZEtleVByZWZpeGVzKFZlcnNpb24uTEVHQUNZKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ29ycmVjdCBwYXRoLCB0ZXN0IGZhaWxpbmcuCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0LmZhaWwoIlRlc3QgZXhwZWN0ZWQgdG8gZmFpbC4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhlZExlbmd0aFdpdGhPZmZzZXQoKQorICAgIHsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbXXsgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSB9OworCisgICAgICAgIEJ5dGVTb3VyY2Ugc291cmNlID0gQnl0ZVNvdXJjZS5maXhlZExlbmd0aChieXRlcywgMCwgMSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzb3VyY2UubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSwgc291cmNlLm5leHQoKSk7CisKKyAgICAgICAgc291cmNlID0gQnl0ZVNvdXJjZS5maXhlZExlbmd0aChieXRlcywgNCwgNSk7CisgICAgICAgIGFzc2VydEVxdWFscyg1LCBzb3VyY2UubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIHNvdXJjZS5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNywgc291cmNlLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg4LCBzb3VyY2UubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDksIHNvdXJjZS5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNLCBzb3VyY2UubmV4dCgpKTsKKworICAgICAgICBCeXRlU291cmNlLmZpeGVkTGVuZ3RoKGJ5dGVzLCA5LCAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSwgc291cmNlLm5leHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4ZWRMZW5ndGhOZWdhdGl2ZUxlbmd0aCgpCisgICAgeworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtdeyAxLCAyLCAzIH07CisKKyAgICAgICAgZXhwZWN0ZWRFeGNlcHRpb24uZXhwZWN0KElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIEJ5dGVTb3VyY2UuZml4ZWRMZW5ndGgoYnl0ZXMsIDAsIC0xKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhlZExlbmd0aE5lZ2F0aXZlT2Zmc2V0KCkKKyAgICB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW117IDEsIDIsIDMgfTsKKworICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbi5leHBlY3QoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgQnl0ZVNvdXJjZS5maXhlZExlbmd0aChieXRlcywgLTEsIDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpeGVkTGVuZ3RoT3V0T2ZCb3VuZHMoKQorICAgIHsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbXXsgMSwgMiwgMyB9OworCisgICAgICAgIGV4cGVjdGVkRXhjZXB0aW9uLmV4cGVjdChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBCeXRlU291cmNlLmZpeGVkTGVuZ3RoKGJ5dGVzLCAwLCA0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhlZE9mZnNldE91dE9mQm91bmRzKCkKKyAgICB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW117IDEsIDIsIDMgfTsKKworICAgICAgICBleHBlY3RlZEV4Y2VwdGlvbi5leHBlY3QoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgQnl0ZVNvdXJjZS5maXhlZExlbmd0aChieXRlcywgNCwgMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VwYXJhdG9yR1QoKQorICAgIHsKKyAgICAgICAgdGVzdFNlcGFyYXRvcihCeXRlQ29tcGFyYWJsZTo6c2VwYXJhdG9yR3QsIHRlc3RMb25ncywgTG9uZ1R5cGUuaW5zdGFuY2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlcGFyYXRvclByZWZpeCgpCisgICAgeworICAgICAgICB0ZXN0U2VwYXJhdG9yKEJ5dGVDb21wYXJhYmxlOjpzZXBhcmF0b3JQcmVmaXgsIHRlc3RMb25ncywgTG9uZ1R5cGUuaW5zdGFuY2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlcGFyYXRvclByZWZpeFZpYURpZmZQb2ludCgpCisgICAgeworICAgICAgICB0ZXN0U2VwYXJhdG9yKCh4LCB5KSAtPiB2ZXJzaW9uIC0+IEJ5dGVTb3VyY2UuY3V0KHkuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUuZGlmZlBvaW50KHgsIHksIHZlcnNpb24pKSwKKyAgICAgICAgICAgICAgICAgICAgICB0ZXN0TG9uZ3MsCisgICAgICAgICAgICAgICAgICAgICAgTG9uZ1R5cGUuaW5zdGFuY2UpOworICAgIH0KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXBhcmF0b3JOZXh0KCkKKyAgICB7CisgICAgICAgIC8vIEFwcGVuZGluZyBhIDAwIGJ5dGUgYXQgdGhlIGVuZCBnaXZlcyB0aGUgaW1tZWRpYXRlIG5leHQgcG9zc2libGUgdmFsdWUgYWZ0ZXIgeC4KKyAgICAgICAgdGVzdFNlcGFyYXRvcigoeCwgeSkgLT4gdmVyc2lvbiAtPiBCeXRlU291cmNlLmN1dE9yUmlnaHRQYWQoeC5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUubGVuZ3RoKHgsIHZlcnNpb24pICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCksCisgICAgICAgICAgICAgICAgICAgICAgdGVzdExvbmdzLAorICAgICAgICAgICAgICAgICAgICAgIExvbmdUeXBlLmluc3RhbmNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiB2b2lkIHRlc3RTZXBhcmF0b3IoQmlGdW5jdGlvbjxCeXRlQ29tcGFyYWJsZSwgQnl0ZUNvbXBhcmFibGUsIEJ5dGVDb21wYXJhYmxlPiBzZXBhcmF0b3JNZXRob2QsIFRbXSB0ZXN0VmFsdWVzLCBBYnN0cmFjdFR5cGU8VD4gdHlwZSkKKyAgICB7CisgICAgICAgIGZvciAoVCB2MSA6IHRlc3RWYWx1ZXMpCisgICAgICAgICAgICBmb3IgKFQgdjIgOiB0ZXN0VmFsdWVzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2MSA9PSBudWxsIHx8IHYyID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICh0eXBlLmNvbXBhcmUodHlwZS5kZWNvbXBvc2UodjEpLCB0eXBlLmRlY29tcG9zZSh2MikpID49IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIGJjMSA9IGdldEJ5dGVDb21wYXJhYmxlKHR5cGUsIHYxKTsKKyAgICAgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSBiYzIgPSBnZXRCeXRlQ29tcGFyYWJsZSh0eXBlLCB2Mik7CisgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgc2VwYXJhdG9yID0gc2VwYXJhdG9yTWV0aG9kLmFwcGx5KGJjMSwgYmMyKTsKKworICAgICAgICAgICAgICAgIGZvciAoVmVyc2lvbiB2ZXJzaW9uIDogVmVyc2lvbi52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJTYW5pdHkgY2hlY2sgZmFpbGVkIiwgQnl0ZUNvbXBhcmFibGUuY29tcGFyZShiYzEsIGJjMiwgdmVyc2lvbikgPCAwKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiU2VwYXJhdG9yICVzIG11c3QgYmUgZ3JlYXRlciB0aGFuIGxlZnQgJXMgKGZvciAlcykgKHZlcnNpb24gJXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYzEuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUuY29tcGFyZShiYzEsIHNlcGFyYXRvciwgdmVyc2lvbikgPCAwKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiU2VwYXJhdG9yICVzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHJpZ2h0ICVzIChmb3IgJXMpICh2ZXJzaW9uICVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcodmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmMyLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcodmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoc2VwYXJhdG9yLCBiYzIsIHZlcnNpb24pIDw9IDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiBCeXRlQ29tcGFyYWJsZSBnZXRCeXRlQ29tcGFyYWJsZShBYnN0cmFjdFR5cGU8VD4gdHlwZSwgVCB2MSkKKyAgICB7CisgICAgICAgIHJldHVybiB2ZXJzaW9uIC0+IHR5cGUuYXNDb21wYXJhYmxlQnl0ZXModHlwZS5kZWNvbXBvc2UodjEpLCB2ZXJzaW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb3JhdGVkS2V5UHJlZml4ZXMoVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgdGVzdERlY29yYXRlZEtleVByZWZpeGVzKCIwMTIzNDU2NzhCQ0RFXDAiLCAiIiwgdmVyc2lvbik7CisgICAgICAgIHRlc3REZWNvcmF0ZWRLZXlQcmVmaXhlcygiMDEyMzQ1Njc4QUJDREVcMCIsICJBQkMiLCB2ZXJzaW9uKTsKKyAgICAgICAgdGVzdERlY29yYXRlZEtleVByZWZpeGVzKCIwMTIzNDU2Nzg5QUJDREVcMCIsICJcMEFCIiwgdmVyc2lvbik7CisgICAgICAgIHRlc3REZWNvcmF0ZWRLZXlQcmVmaXhlcygiMDEyMzQ1Njc4OUFCQ0RFRlwwIiwgIlwwIiwgdmVyc2lvbik7CisKKyAgICAgICAgdGVzdERlY29yYXRlZEtleVByZWZpeGVzKCIwMTIzNDU2Nzg5QUJDREVGMCIsICJBQkMiLCB2ZXJzaW9uKTsKKyAgICAgICAgdGVzdERlY29yYXRlZEtleVByZWZpeGVzKCIwMTIzNDU2Nzg5QUJDREVGIiwgIiIsIHZlcnNpb24pOworICAgICAgICB0ZXN0RGVjb3JhdGVkS2V5UHJlZml4ZXMoIjAxMjM0NTY3ODlBQkNERSIsICIiLCB2ZXJzaW9uKTsKKyAgICAgICAgdGVzdERlY29yYXRlZEtleVByZWZpeGVzKCIwMTIzNDU2Nzg5QUJDRCIsICJcMEFCIiwgdmVyc2lvbik7CisgICAgICAgIHRlc3REZWNvcmF0ZWRLZXlQcmVmaXhlcygiMDEyMzQ1Njc4OUFCQyIsICJcMCIsIHZlcnNpb24pOworCisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlY29yYXRlZEtleVByZWZpeGVzKFN0cmluZyBrZXksIFN0cmluZyBhcHBlbmQsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGxvZ2dlci5pbmZvKCJUZXN0aW5nIHt9ICsge30iLCBzYWZlU3RyKGtleSksIHNhZmVTdHIoYXBwZW5kKSk7CisgICAgICAgIElQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBvcmlnaW5hbCA9IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzKGtleSk7CisgICAgICAgIEJ5dGVCdWZmZXIgY29sbGlzaW9uID0gVXRpbC5nZW5lcmF0ZU11cm11ckNvbGxpc2lvbihvcmlnaW5hbCwgYXBwZW5kLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKworICAgICAgICBsb25nW10gaGFzaCA9IG5ldyBsb25nWzJdOworICAgICAgICBNdXJtdXJIYXNoLmhhc2gzX3g2NF8xMjgob3JpZ2luYWwsIDAsIG9yaWdpbmFsLmxpbWl0KCksIDAsIGhhc2gpOworICAgICAgICBsb2dnZXIuaW5mbyhTdHJpbmcuZm9ybWF0KCJPcmlnaW5hbCBoYXNoICAlMDE2eCwlMDE2eCIsIGhhc2hbMF0sIGhhc2hbMV0pKTsKKyAgICAgICAgTXVybXVySGFzaC5oYXNoM194NjRfMTI4KGNvbGxpc2lvbiwgMCwgY29sbGlzaW9uLmxpbWl0KCksIDAsIGhhc2gpOworICAgICAgICBsb2dnZXIuaW5mbyhTdHJpbmcuZm9ybWF0KCJDb2xsaXNpb24gaGFzaCAlMDE2eCwlMDE2eCIsIGhhc2hbMF0sIGhhc2hbMV0pKTsKKworICAgICAgICBEZWNvcmF0ZWRLZXkga2sxID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkob3JpZ2luYWwpOworICAgICAgICBEZWNvcmF0ZWRLZXkga2syID0gcGFydGl0aW9uZXIuZGVjb3JhdGVLZXkoY29sbGlzaW9uKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oInt9XG57fVxue31cbnt9Iiwga2sxLCBrazIsIGtrMS5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKHZlcnNpb24pLCBrazIuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSk7CisKKyAgICAgICAgZmluYWwgQnl0ZVNvdXJjZSBzMSA9IGtrMS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKyAgICAgICAgZmluYWwgQnl0ZVNvdXJjZSBzMiA9IGtrMi5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oInt9XG57fSIsIHMxLCBzMik7CisKKyAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgcmVwcmVzZW50YXRpb25zIGNvbXBhcmUgY29ycmVjdGx5CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTG9uZy5zaWdudW0oa2sxLmNvbXBhcmVUbyhrazIpKSwgQnl0ZUNvbXBhcmFibGUuY29tcGFyZShrazEsIGtrMiwgdmVyc2lvbikpOworICAgICAgICAvLyBzMSBtdXN0IG5vdCBiZSBhIHByZWZpeCBvZiBzMgorICAgICAgICBhc3NlcnROb3RQcmVmaXgoczEsIHMyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Tm90UHJlZml4KEJ5dGVTb3VyY2UgczEsIEJ5dGVTb3VyY2UgczIpCisgICAgeworICAgICAgICBpbnQgYzEsIGMyOworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjMSA9IHMxLm5leHQoKTsKKyAgICAgICAgICAgIGMyID0gczIubmV4dCgpOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChjMSA9PSBjMiAmJiBjMSAhPSBCeXRlU291cmNlLkVORF9PRl9TVFJFQU0pOworCisgICAgICAgIC8vIEVxdWFsIGlzIG9rCisgICAgICAgIGlmIChjMSA9PSBjMikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90RXF1YWxzKCJCeXRlQ29tcGFyYWJsZSBpcyBhIHByZWZpeCBvZiBvdGhlciIsIEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSwgYzEpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90RXF1YWxzKCJCeXRlQ29tcGFyYWJsZSBpcyBhIHByZWZpeCBvZiBvdGhlciIsIEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSwgYzIpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGNvbXBhcmUoQnl0ZVNvdXJjZSBzMSwgQnl0ZVNvdXJjZSBzMikKKyAgICB7CisgICAgICAgIGludCBjMSwgYzI7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGMxID0gczEubmV4dCgpOworICAgICAgICAgICAgYzIgPSBzMi5uZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGMxID09IGMyICYmIGMxICE9IEJ5dGVTb3VyY2UuRU5EX09GX1NUUkVBTSk7CisKKyAgICAgICAgcmV0dXJuIEludGVnZXIuY29tcGFyZShjMSwgYzIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtYXliZUFzc2VydE5vdFByZWZpeChCeXRlQ29tcGFyYWJsZSBzMSwgQnl0ZUNvbXBhcmFibGUgczIsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGlmICh2ZXJzaW9uID09IFZlcnNpb24uT1NTNTApCisgICAgICAgICAgICBhc3NlcnROb3RQcmVmaXgoczEuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbiksIHMyLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbWF5YmVDaGVjazQxUHJvcGVydGllcyhpbnQgZXhwZWN0ZWRDb21wYXJpc29uLCBCeXRlQ29tcGFyYWJsZSBzMSwgQnl0ZUNvbXBhcmFibGUgczIsIFZlcnNpb24gdmVyc2lvbikKKyAgICB7CisgICAgICAgIGlmICh2ZXJzaW9uICE9IFZlcnNpb24uT1NTNTApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKHMxID09IG51bGwgfHwgczIgPT0gbnVsbCB8fCAwID09IGV4cGVjdGVkQ29tcGFyaXNvbikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaW50IGIxID0gcmFuZG9tVGVybWluYXRvcigpOworICAgICAgICBpbnQgYjIgPSByYW5kb21UZXJtaW5hdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJDb21wYXJpc29uIGZhaWxlZCBmb3IgJXMoJXMgKyAlMDJ4KSBhbmQgJXMoJXMgKyAlMDJ4KSIsIHMxLCBzMS5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKHZlcnNpb24pLCBiMSwgczIsIHMyLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcodmVyc2lvbiksIGIyKSwKKyAgICAgICAgICAgICAgICBleHBlY3RlZENvbXBhcmlzb24sIEludGVnZXIuc2lnbnVtKGNvbXBhcmUoQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcihiMSwgczEuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpLCBCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yKGIyLCBzMi5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSkpKSk7CisgICAgICAgIGFzc2VydE5vdFByZWZpeChCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yKGIxLCBzMS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSksIEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoYjIsIHMyLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcmFuZG9tVGVybWluYXRvcigpCisgICAgeworICAgICAgICBpbnQgdGVybTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgdGVybSA9IFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKS5uZXh0SW50KEJ5dGVTb3VyY2UuTUlOX1NFUEFSQVRPUiwgQnl0ZVNvdXJjZS5NQVhfU0VQQVJBVE9SICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKHRlcm0gPj0gQnl0ZVNvdXJjZS5NSU5fTkVYVF9DT01QT05FTlQgJiYgdGVybSA8PSBCeXRlU291cmNlLk1BWF9ORVhUX0NPTVBPTkVOVCk7CisgICAgICAgIHJldHVybiB0ZXJtOworICAgIH0KKworICAgIDxLLCBWLCBNIGV4dGVuZHMgTWFwPEssIFY+PiB2b2lkIHRlc3RNYXAoTWFwVHlwZTxLLCBWPiB0dCwgS1tdIGtleXMsIFZbXSB2YWx1ZXMsIFN1cHBsaWVyPE0+IGdlbiwgUmFuZG9tIHJhbmQpCisgICAgeworICAgICAgICBMaXN0PE0+IHRlc3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHRlc3RzLmFkZChnZW4uZ2V0KCkpOworICAgICAgICBmb3IgKGludCBjID0gMTsgYyA8PSAzOyArK2MpCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNIGwgPSBnZW4uZ2V0KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjOyArK2kpCisgICAgICAgICAgICAgICAgICAgIGwucHV0KGtleXNbcmFuZC5uZXh0SW50KGtleXMubGVuZ3RoKV0sIHZhbHVlc1tyYW5kLm5leHRJbnQodmFsdWVzLmxlbmd0aCldKTsKKworICAgICAgICAgICAgICAgIHRlc3RzLmFkZChsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgdGVzdFR5cGUodHQsIHRlc3RzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvbnZlcnQgdHlwZSB0byBhIGNvbXBhcmFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlQ29tcGFyYWJsZSB0eXBlVG9Db21wYXJhYmxlKEFic3RyYWN0VHlwZTw/PiB0eXBlLCBCeXRlQnVmZmVyIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlQ29tcGFyYWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmVyc2lvbiB2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmFzQ29tcGFyYWJsZUJ5dGVzKHZhbHVlLCB2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5nZXRTdHJpbmcodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyA8VD4gdm9pZCB0ZXN0VHlwZShBYnN0cmFjdFR5cGU8VD4gdHlwZSwgT2JqZWN0W10gdmFsdWVzKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUodHlwZSwgSXRlcmFibGVzLnRyYW5zZm9ybShBcnJheXMuYXNMaXN0KHZhbHVlcyksIHggLT4gKFQpIHgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IHZvaWQgdGVzdFR5cGUoQWJzdHJhY3RUeXBlPD8gc3VwZXIgVD4gdHlwZSwgSXRlcmFibGU8VD4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgZm9yIChUIGkgOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgYiA9IGRlY29tcG9zZUFuZFJhbmRvbVBhZCh0eXBlLCBpKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJWYWx1ZSB7fSAoe30pIGJ5dGVzIHt9IEJ5dGVTb3VyY2Uge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIodHlwZS5nZXRTZXJpYWxpemVyKCkudG9DUUxMaXRlcmFsKGIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVG9Db21wYXJhYmxlKHR5cGUsIGIpLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVmVyc2lvbi5PU1M1MCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoVCBpIDogdmFsdWVzKQorICAgICAgICAgICAgZm9yIChUIGogOiB2YWx1ZXMpCisgICAgICAgICAgICAgICAgYXNzZXJ0Q29tcGFyZXNTYW1lKHR5cGUsIGksIGopOworICAgICAgICBpZiAoIXR5cGUuaXNSZXZlcnNlZCgpKQorICAgICAgICAgICAgdGVzdFR5cGUoUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKHR5cGUpLCB2YWx1ZXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RCdWZmZXJzKEFic3RyYWN0VHlwZTw/PiB0eXBlLCBMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlcykKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgYiA6IHZhbHVlcykgeworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJWYWx1ZSB7fSBieXRlcyB7fSBCeXRlU291cmNlIHt9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlU3RyKHR5cGUuZ2V0U2VyaWFsaXplcigpLnRvQ1FMTGl0ZXJhbChiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVG9Db21wYXJhYmxlKHR5cGUsIGIpLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVmVyc2lvbi5PU1M1MCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBDb250aW51ZSB3aXRob3V0IGxpc3RpbmcgdmFsdWVzLgorICAgICAgICB9CisKKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGkgOiB2YWx1ZXMpCisgICAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgaiA6IHZhbHVlcykKKyAgICAgICAgICAgICAgICBhc3NlcnRDb21wYXJlc1NhbWVCdWZmZXJzKHR5cGUsIGksIGopOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Q29tcGFyZXNTYW1lQnVmZmVycyhBYnN0cmFjdFR5cGU8Pz4gdHlwZSwgQnl0ZUJ1ZmZlciBiMSwgQnl0ZUJ1ZmZlciBiMikKKyAgICB7CisgICAgICAgIGludCBleHBlY3RlZCA9IEludGVnZXIuc2lnbnVtKHR5cGUuY29tcGFyZShiMSwgYjIpKTsKKyAgICAgICAgZmluYWwgQnl0ZUNvbXBhcmFibGUgYnMxID0gdHlwZVRvQ29tcGFyYWJsZSh0eXBlLCBiMSk7CisgICAgICAgIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGJzMiA9IHR5cGVUb0NvbXBhcmFibGUodHlwZSwgYjIpOworCisgICAgICAgIGZvciAoVmVyc2lvbiB2ZXJzaW9uIDogVmVyc2lvbi52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGFjdHVhbCA9IEludGVnZXIuc2lnbnVtKEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYnMxLCBiczIsIHZlcnNpb24pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJGYWlsZWQgY29tcGFyaW5nICVzKCVzKSBhbmQgJXMoJXMpIiwgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiMSksIGJzMS5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKHZlcnNpb24pLCBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGIyKSwgYnMyLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcodmVyc2lvbikpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7CisgICAgICAgICAgICBtYXliZUNoZWNrNDFQcm9wZXJ0aWVzKGV4cGVjdGVkLCBiczEsIGJzMiwgdmVyc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb3JhdGVkS2V5cyhJUGFydGl0aW9uZXIgdHlwZSwgTGlzdDxCeXRlQnVmZmVyPiB2YWx1ZXMpCisgICAgeworICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgaSA6IHZhbHVlcykKKyAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBqIDogdmFsdWVzKQorICAgICAgICAgICAgICAgIGFzc2VydENvbXBhcmVzU2FtZURlY29yYXRlZEtleXModHlwZSwgaSwgaik7CisgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBpIDogdmFsdWVzKQorICAgICAgICAgICAgYXNzZXJ0RGVjb3JhdGVkS2V5Qm91bmRzKHR5cGUsIGkpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Q29tcGFyZXNTYW1lRGVjb3JhdGVkS2V5cyhJUGFydGl0aW9uZXIgdHlwZSwgQnl0ZUJ1ZmZlciBiMSwgQnl0ZUJ1ZmZlciBiMikKKyAgICB7CisgICAgICAgIERlY29yYXRlZEtleSBrMSA9IHR5cGUuZGVjb3JhdGVLZXkoYjEpOworICAgICAgICBEZWNvcmF0ZWRLZXkgazIgPSB0eXBlLmRlY29yYXRlS2V5KGIyKTsKKyAgICAgICAgaW50IGV4cGVjdGVkID0gSW50ZWdlci5zaWdudW0oazEuY29tcGFyZVRvKGsyKSk7CisKKyAgICAgICAgZm9yIChWZXJzaW9uIHZlcnNpb24gOiBWZXJzaW9uLnZhbHVlcygpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYWN0dWFsID0gSW50ZWdlci5zaWdudW0oQnl0ZUNvbXBhcmFibGUuY29tcGFyZShrMSwgazIsIHZlcnNpb24pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJGYWlsZWQgY29tcGFyaW5nICVzWyVzXSglcykgYW5kICVzWyVzXSglcylcbnBhcnRpdGlvbmVyICVzIHZlcnNpb24gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsxLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcodmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGIyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgazIuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICAgICAgICAgICAgbWF5YmVBc3NlcnROb3RQcmVmaXgoazEsIGsyLCB2ZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYXNzZXJ0RGVjb3JhdGVkS2V5Qm91bmRzKElQYXJ0aXRpb25lciB0eXBlLCBCeXRlQnVmZmVyIGIpCisgICAgeworICAgICAgICBWZXJzaW9uIHZlcnNpb24gPSBWZXJzaW9uLk9TUzUwOworICAgICAgICBEZWNvcmF0ZWRLZXkgayA9IHR5cGUuZGVjb3JhdGVLZXkoYik7CisgICAgICAgIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGFmdGVyID0gay5hc0NvbXBhcmFibGVCb3VuZChmYWxzZSk7CisgICAgICAgIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGJlZm9yZSA9IGsuYXNDb21wYXJhYmxlQm91bmQodHJ1ZSk7CisKKyAgICAgICAgaW50IGFjdHVhbCA9IEludGVnZXIuc2lnbnVtKEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoaywgYmVmb3JlLCB2ZXJzaW9uKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJGYWlsZWQgY29tcGFyaW5nIGJvdW5kIGJlZm9yZSAoJXMpIGZvciAlc1slc10oJXMpXG5wYXJ0aXRpb25lciAlcyB2ZXJzaW9uICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcodmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKTsKKyAgICAgICAgbWF5YmVBc3NlcnROb3RQcmVmaXgoaywgYmVmb3JlLCB2ZXJzaW9uKTsKKworICAgICAgICBhY3R1YWwgPSBJbnRlZ2VyLnNpZ251bShCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGssIGFmdGVyLCB2ZXJzaW9uKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJGYWlsZWQgY29tcGFyaW5nIGJvdW5kIGFmdGVyICglcykgZm9yICVzWyVzXSglcylcbnBhcnRpdGlvbmVyICVzIHZlcnNpb24gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlci5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKHZlcnNpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyVXRpbC5ieXRlc1RvSGV4KGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcodmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24pLAorICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICAgICAgICBtYXliZUFzc2VydE5vdFByZWZpeChrLCBhZnRlciwgdmVyc2lvbik7CisKKyAgICAgICAgYWN0dWFsID0gSW50ZWdlci5zaWdudW0oQnl0ZUNvbXBhcmFibGUuY29tcGFyZShiZWZvcmUsIGFmdGVyLCB2ZXJzaW9uKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJGYWlsZWQgY29tcGFyaW5nIGJvdW5kIGJlZm9yZSAoJXMpIHRvIGFmdGVyICglcykgZm9yICVzWyVzXSglcylcbnBhcnRpdGlvbmVyICVzIHZlcnNpb24gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgay5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKHZlcnNpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKTsKKyAgICAgICAgbWF5YmVBc3NlcnROb3RQcmVmaXgoYWZ0ZXIsIGJlZm9yZSwgdmVyc2lvbik7CisgICAgfQorCisgICAgc3RhdGljIE9iamVjdCBzYWZlU3RyKE9iamVjdCBpKQorICAgIHsKKyAgICAgICAgaWYgKGkgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBTdHJpbmcgcyA9IGkudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKHMubGVuZ3RoKCkgPiAxMDApCisgICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMCwgMTAwKSArICIuLi4iOworICAgICAgICByZXR1cm4gcy5yZXBsYWNlQWxsKCJcMCIsICI8MD4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IHZvaWQgdGVzdERpcmVjdChGdW5jdGlvbjxULCBCeXRlU291cmNlPiBjb252ZXJ0b3IsIEJpRnVuY3Rpb248VCwgVCwgSW50ZWdlcj4gY29tcGFyYXRvciwgVFtdIHZhbHVlcykKKyAgICB7CisgICAgICAgIGZvciAoVCBpIDogdmFsdWVzKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBsb2dnZXIuaW5mbygiVmFsdWUge30gQnl0ZVNvdXJjZSB7fVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0b3IuYXBwbHkoaSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoVCBpIDogdmFsdWVzKQorICAgICAgICAgICAgaWYgKGkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmb3IgKFQgaiA6IHZhbHVlcykKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydENvbXBhcmVzU2FtZShjb252ZXJ0b3IsIGNvbXBhcmF0b3IsIGksIGopOworICAgIH0KKworICAgIDxUPiB2b2lkIGFzc2VydENvbXBhcmVzU2FtZShGdW5jdGlvbjxULCBCeXRlU291cmNlPiBjb252ZXJ0b3IsIEJpRnVuY3Rpb248VCwgVCwgSW50ZWdlcj4gY29tcGFyYXRvciwgVCB2MSwgVCB2MikKKyAgICB7CisgICAgICAgIEJ5dGVDb21wYXJhYmxlIGIxID0gdiAtPiBjb252ZXJ0b3IuYXBwbHkodjEpOworICAgICAgICBCeXRlQ29tcGFyYWJsZSBiMiA9IHYgLT4gY29udmVydG9yLmFwcGx5KHYyKTsKKyAgICAgICAgaW50IGV4cGVjdGVkID0gSW50ZWdlci5zaWdudW0oY29tcGFyYXRvci5hcHBseSh2MSwgdjIpKTsKKyAgICAgICAgaW50IGFjdHVhbCA9IEludGVnZXIuc2lnbnVtKEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUoYjEsIGIyLCBudWxsKSk7ICAvLyB2ZXJzaW9uIGlnbm9yZWQgYWJvdmUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkZhaWxlZCBjb21wYXJpbmcgJXMgYW5kICVzIiwgdjEsIHYyKSwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorCisgICAgPFQ+IHZvaWQgYXNzZXJ0Q29tcGFyZXNTYW1lKEFic3RyYWN0VHlwZTxUPiB0eXBlLCBUIHYxLCBUIHYyKQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiMSA9IGRlY29tcG9zZUFuZFJhbmRvbVBhZCh0eXBlLCB2MSk7CisgICAgICAgIEJ5dGVCdWZmZXIgYjIgPSBkZWNvbXBvc2VBbmRSYW5kb21QYWQodHlwZSwgdjIpOworICAgICAgICBpbnQgZXhwZWN0ZWQgPSBJbnRlZ2VyLnNpZ251bSh0eXBlLmNvbXBhcmUoYjEsIGIyKSk7CisgICAgICAgIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGJjMSA9IHR5cGVUb0NvbXBhcmFibGUodHlwZSwgYjEpOworICAgICAgICBmaW5hbCBCeXRlQ29tcGFyYWJsZSBiYzIgPSB0eXBlVG9Db21wYXJhYmxlKHR5cGUsIGIyKTsKKworICAgICAgICBmb3IgKFZlcnNpb24gdmVyc2lvbiA6IFZlcnNpb24udmFsdWVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhY3R1YWwgPSBJbnRlZ2VyLnNpZ251bShCeXRlQ29tcGFyYWJsZS5jb21wYXJlKGJjMSwgYmMyLCB2ZXJzaW9uKSk7CisgICAgICAgICAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzUmV2ZXJzZWQoKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBmb3IgcmV2ZXJzZSBvZiBudWxscyBhbmQgcHJlZml4ZXMuIENoZWNrIHRoYXQgaXQncyBvayB3aXRoaW4gbXVsdGktY29tcG9uZW50CisgICAgICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNjID0gbmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKHR5cGUpOworICAgICAgICAgICAgICAgICAgICBCeXRlQ29tcGFyYWJsZSBjMSA9IGNjLmFzQnl0ZUNvbXBhcmFibGUoQ2x1c3RlcmluZy5tYWtlKGIxKSk7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVDb21wYXJhYmxlIGMyID0gY2MuYXNCeXRlQ29tcGFyYWJsZShDbHVzdGVyaW5nLm1ha2UoYjIpKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGFjdHVhbGNjID0gSW50ZWdlci5zaWdudW0oQnl0ZUNvbXBhcmFibGUuY29tcGFyZShjMSwgYzIsIHZlcnNpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbGNjID09IGV4cGVjdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRmFpbGVkIGNvbXBhcmluZyByZXZlcnNlZCAlcyglcywgJXMpIGFuZCAlcyglcywgJXMpIGRpcmVjdCAoJWQpIGFuZCBhcyBjbHVzdGVyaW5nIiwgc2FmZVN0cih2MSksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYjEpLCBjMSwgc2FmZVN0cih2MiksIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYjIpLCBjMiwgYWN0dWFsKSwgZXhwZWN0ZWQsIGFjdHVhbGNjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRmFpbGVkIGNvbXBhcmluZyAlcyglcyBCQyAlcykgYW5kICVzKCVzIEJDICVzKSB2ZXJzaW9uICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cih2MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYzEuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cih2MiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYzIuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyh2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXliZUNoZWNrNDFQcm9wZXJ0aWVzKGV4cGVjdGVkLCBiYzEsIGJjMiwgdmVyc2lvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICA8VD4gQnl0ZUJ1ZmZlciBkZWNvbXBvc2VBbmRSYW5kb21QYWQoQWJzdHJhY3RUeXBlPFQ+IHR5cGUsIFQgdikKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgYiA9IHR5cGUuZGVjb21wb3NlKHYpOworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oMCk7CisgICAgICAgIGludCBwYWRCZWZvcmUgPSByYW5kLm5leHRJbnQoMTYpOworICAgICAgICBpbnQgcGFkQWZ0ZXIgPSByYW5kLm5leHRJbnQoMTYpOworICAgICAgICBpbnQgcGFkZGVkQ2FwYWNpdHkgPSBiLnJlbWFpbmluZygpICsgcGFkQmVmb3JlICsgcGFkQWZ0ZXI7CisgICAgICAgIEJ5dGVCdWZmZXIgcGFkZGVkID0gYWxsb2NhdGVCdWZmZXIocGFkZGVkQ2FwYWNpdHkpOworICAgICAgICByYW5kLmludHMocGFkQmVmb3JlKS5mb3JFYWNoKHggLT4gcGFkZGVkLnB1dCgoYnl0ZSkgeCkpOworICAgICAgICBwYWRkZWQucHV0KGIuZHVwbGljYXRlKCkpOworICAgICAgICByYW5kLmludHMocGFkQWZ0ZXIpLmZvckVhY2goeCAtPiBwYWRkZWQucHV0KChieXRlKSB4KSk7CisgICAgICAgIHBhZGRlZC5jbGVhcigpLmxpbWl0KHBhZGRlZC5jYXBhY2l0eSgpIC0gcGFkQWZ0ZXIpLnBvc2l0aW9uKHBhZEJlZm9yZSk7CisgICAgICAgIHJldHVybiBwYWRkZWQ7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEJ5dGVCdWZmZXIgYWxsb2NhdGVCdWZmZXIoaW50IHBhZGRlZENhcGFjaXR5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIuYWxsb2NhdGUocGFkZGVkQ2FwYWNpdHkpOworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZVNvdXJjZUNvbnZlcnNpb25UZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZVNvdXJjZUNvbnZlcnNpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlYTYxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlQ29udmVyc2lvblRlc3QuamF2YQpAQCAtMCwwICsxLDc4NiBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGU7CisKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlGdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSXRlcmFibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5CdWZmZXJEZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0NvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ1ByZWZpeDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5CeXRlT3JkZXJlZFBhcnRpdGlvbmVyOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5JUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkxvY2FsUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0Lk11cm11cjNQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuUmFuZG9tUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuQnl0ZUJ1ZmZlclV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuVGltZVVVSUQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGUuQnl0ZUNvbXBhcmFibGUuVmVyc2lvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZS5CeXRlU291cmNlQ29tcGFyaXNvblRlc3QuZGVjb21wb3NlRm9yVHVwbGU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHRoYXQgdGhlIHJlc3VsdCBvZiBmb3J3YXJkICsgYmFja3dhcmQgQnl0ZVNvdXJjZSB0cmFuc2xhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGUgb3JpZ2luYWwuCisgKi8KK3B1YmxpYyBjbGFzcyBCeXRlU291cmNlQ29udmVyc2lvblRlc3QgZXh0ZW5kcyBCeXRlU291cmNlVGVzdEJhc2UKK3sKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQnl0ZVNvdXJjZUNvbnZlcnNpb25UZXN0LmNsYXNzKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFZlcnNpb24gVkVSU0lPTiA9IFZlcnNpb24uT1NTNTA7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBFeHBlY3RlZEV4Y2VwdGlvbiBleHBlY3RlZEV4Y2VwdGlvbiA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ3NBc2NpaSgpCisgICAgeworICAgICAgICB0ZXN0VHlwZShBc2NpaVR5cGUuaW5zdGFuY2UsIEFycmF5cy5zdHJlYW0odGVzdFN0cmluZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihzIC0+IHMuZXF1YWxzKG5ldyBTdHJpbmcocy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvQXJyYXkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nc1VURjgoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoVVRGOFR5cGUuaW5zdGFuY2UsIHRlc3RTdHJpbmdzKTsKKyAgICAgICAgdGVzdERpcmVjdCh4IC0+IEJ5dGVTb3VyY2Uub2YoeCwgVkVSU0lPTiksIEJ5dGVTb3VyY2VJbnZlcnNlOjpnZXRTdHJpbmcsIHRlc3RTdHJpbmdzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFucygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShCb29sZWFuVHlwZS5pbnN0YW5jZSwgdGVzdEJvb2xzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKEludDMyVHlwZS5pbnN0YW5jZSwgdGVzdEludHMpOworICAgICAgICB0ZXN0RGlyZWN0KEJ5dGVTb3VyY2U6Om9mLCBCeXRlU291cmNlSW52ZXJzZTo6Z2V0U2lnbmVkSW50LCB0ZXN0SW50cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByYW5kb21UZXN0SW50cygpCisgICAgeworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPDEwMDAwOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpMSA9IHJhbmQubmV4dEludCgpOworICAgICAgICAgICAgYXNzZXJ0Q29udmVydHNTYW1lKEludDMyVHlwZS5pbnN0YW5jZSwgaTEpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb25ncygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShMb25nVHlwZS5pbnN0YW5jZSwgdGVzdExvbmdzKTsKKyAgICAgICAgdGVzdERpcmVjdChCeXRlU291cmNlOjpvZiwgQnl0ZVNvdXJjZUludmVyc2U6OmdldFNpZ25lZExvbmcsIHRlc3RMb25ncyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnRzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKFNob3J0VHlwZS5pbnN0YW5jZSwgdGVzdFNob3J0cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZXMoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoQnl0ZVR5cGUuaW5zdGFuY2UsIHRlc3RCeXRlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlcygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShEb3VibGVUeXBlLmluc3RhbmNlLCB0ZXN0RG91Ymxlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXRzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlKEZsb2F0VHlwZS5pbnN0YW5jZSwgdGVzdEZsb2F0cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmlnSW50cygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShJbnRlZ2VyVHlwZS5pbnN0YW5jZSwgdGVzdEJpZ0ludHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJpZ0RlY2ltYWxzKCkKKyAgICB7CisgICAgICAgIHRlc3RUeXBlQnVmZmVycyhEZWNpbWFsVHlwZS5pbnN0YW5jZSwgdGVzdEJpZ0RlY2ltYWxzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVVUlEcygpCisgICAgeworICAgICAgICB0ZXN0VHlwZShVVUlEVHlwZS5pbnN0YW5jZSwgdGVzdFVVSURzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lVVVJRHMoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoVGltZVVVSURUeXBlLmluc3RhbmNlLCBBcnJheXMuc3RyZWFtKHRlc3RVVUlEcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKHggLT4geCA9PSBudWxsIHx8IHgudmVyc2lvbigpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh4IC0+IHggIT0gbnVsbCA/IFRpbWVVVUlELmZyb21VdWlkKHgpIDogbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMZXhpY2FsVVVJRHMoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoTGV4aWNhbFVVSURUeXBlLmluc3RhbmNlLCB0ZXN0VVVJRHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZURhdGUoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UsIEFycmF5cy5zdHJlYW0odGVzdEludHMpLmZpbHRlcih4IC0+IHggIT0gbnVsbCkudG9BcnJheSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lVHlwZSgpCisgICAgeworICAgICAgICB0ZXN0VHlwZShUaW1lVHlwZS5pbnN0YW5jZSwgQXJyYXlzLnN0cmVhbSh0ZXN0TG9uZ3MpLmZpbHRlcih4IC0+IHggIT0gbnVsbCAmJiB4ID49IDAgJiYgeCA8PSAyNEwgKiA2MCAqIDYwICogMTAwMCAqIDEwMDAgKiAxMDAwKS50b0FycmF5KCkpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0ZVR5cGUoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoRGF0ZVR5cGUuaW5zdGFuY2UsIHRlc3REYXRlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZXN0YW1wVHlwZSgpCisgICAgeworICAgICAgICB0ZXN0VHlwZShUaW1lc3RhbXBUeXBlLmluc3RhbmNlLCB0ZXN0RGF0ZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ5dGVzVHlwZSgpCisgICAgeworICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RWYWx1ZXMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogdGVzdFZhbHVlc1tpXSkKKyAgICAgICAgICAgICAgICB2YWx1ZXMuYWRkKHRlc3RUeXBlc1tpXS5kZWNvbXBvc2UobykpOworCisgICAgICAgIHRlc3RUeXBlKEJ5dGVzVHlwZS5pbnN0YW5jZSwgdmFsdWVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmV0QWRkcmVzc1R5cGUoKSB0aHJvd3MgVW5rbm93bkhvc3RFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHRlc3RUeXBlKEluZXRBZGRyZXNzVHlwZS5pbnN0YW5jZSwgdGVzdEluZXRzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVR5cGUoKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUoRW1wdHlUeXBlLmluc3RhbmNlLCBuZXcgVm9pZFtdIHsgbnVsbCB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRpdGlvbmVyRGVmaW5lZE9yZGVyKCkKKyAgICB7CisgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiB0ZXN0VmFsdWVzW2ldKQorICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQodGVzdFR5cGVzW2ldLmRlY29tcG9zZShvKSk7CisKKyAgICAgICAgdGVzdEJ1ZmZlcnMobmV3IFBhcnRpdGlvbmVyRGVmaW5lZE9yZGVyKE11cm11cjNQYXJ0aXRpb25lci5pbnN0YW5jZSksIHZhbHVlcyk7CisgICAgICAgIHRlc3RCdWZmZXJzKG5ldyBQYXJ0aXRpb25lckRlZmluZWRPcmRlcihSYW5kb21QYXJ0aXRpb25lci5pbnN0YW5jZSksIHZhbHVlcyk7CisgICAgICAgIHRlc3RCdWZmZXJzKG5ldyBQYXJ0aXRpb25lckRlZmluZWRPcmRlcihCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKSwgdmFsdWVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRpdGlvbmVyT3JkZXIoKQorICAgIHsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0VmFsdWVzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgZm9yIChPYmplY3QgbyA6IHRlc3RWYWx1ZXNbaV0pCisgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCh0ZXN0VHlwZXNbaV0uZGVjb21wb3NlKG8pKTsKKworICAgICAgICB0ZXN0RGVjb3JhdGVkS2V5cyhNdXJtdXIzUGFydGl0aW9uZXIuaW5zdGFuY2UsIHZhbHVlcyk7CisgICAgICAgIHRlc3REZWNvcmF0ZWRLZXlzKFJhbmRvbVBhcnRpdGlvbmVyLmluc3RhbmNlLCB2YWx1ZXMpOworICAgICAgICB0ZXN0RGVjb3JhdGVkS2V5cyhCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlLCB2YWx1ZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2FsUGF0aXRpb25lck9yZGVyKCkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFZhbHVlcy5sZW5ndGg7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgQWJzdHJhY3RUeXBlIHRlc3RUeXBlID0gdGVzdFR5cGVzW2ldOworICAgICAgICAgICAgdGVzdERlY29yYXRlZEtleXMobmV3IExvY2FsUGFydGl0aW9uZXIodGVzdFR5cGUpLCBMaXN0cy50cmFuc2Zvcm0oQXJyYXlzLmFzTGlzdCh0ZXN0VmFsdWVzW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiAtPiB0ZXN0VHlwZS5kZWNvbXBvc2UodikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludGVyZmFjZSBQYWlyVGVzdGVyCisgICAgeworICAgICAgICB2b2lkIHRlc3QoQWJzdHJhY3RUeXBlIHQxLCBBYnN0cmFjdFR5cGUgdDIsIE9iamVjdCBvMSwgT2JqZWN0IG8yKTsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RDb21iaW5hdGlvblNhbXBsaW5nKFJhbmRvbSByYW5kLCBQYWlyVGVzdGVyIHRlc3RlcikKKyAgICB7CisgICAgICAgIGZvciAoaW50IGk9MDtpPHRlc3RUeXBlcy5sZW5ndGg7KytpKQorICAgICAgICAgICAgZm9yIChpbnQgaj0wO2o8dGVzdFR5cGVzLmxlbmd0aDsrK2opCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT2JqZWN0W10gdHYxID0gbmV3IE9iamVjdFszXTsKKyAgICAgICAgICAgICAgICBPYmplY3RbXSB0djIgPSBuZXcgT2JqZWN0WzNdOworICAgICAgICAgICAgICAgIGZvciAoaW50IHQ9MDsgdDx0djEubGVuZ3RoOyArK3QpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0djFbdF0gPSB0ZXN0VmFsdWVzW2ldW3JhbmQubmV4dEludCh0ZXN0VmFsdWVzW2ldLmxlbmd0aCldOworICAgICAgICAgICAgICAgICAgICB0djJbdF0gPSB0ZXN0VmFsdWVzW2pdW3JhbmQubmV4dEludCh0ZXN0VmFsdWVzW2pdLmxlbmd0aCldOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG8xIDogdHYxKQorICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvMiA6IHR2MikKKworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGVzdGVyLnRlc3QodGVzdFR5cGVzW2ldLCB0ZXN0VHlwZXNbal0sIG8xLCBvMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbWJpbmF0aW9ucygpCisgICAgeworICAgICAgICBSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oMCk7CisgICAgICAgIHRlc3RDb21iaW5hdGlvblNhbXBsaW5nKHJhbmQsIHRoaXM6OmFzc2VydENsdXN0ZXJpbmdQYWlyQ29udmVydHNTYW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsc0luQ2x1c3RlcmluZygpCisgICAgeworICAgICAgICBCeXRlQnVmZmVyW11bXSBpbnB1dHMgPSBuZXcgQnl0ZUJ1ZmZlcltdW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHtkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICJhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUFuZFJhbmRvbVBhZChJbnQzMlR5cGUuaW5zdGFuY2UsIDApfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVCdWZmZXJbXSB7ZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAiYSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCBudWxsKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQnVmZmVyW10ge2RlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgImEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQnVmZmVyW10ge2RlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCAwKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQnVmZmVyW10ge2RlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCBudWxsKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQnVmZmVyW10ge2RlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVCdWZmZXJbXSB7bnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgMCl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQnl0ZUJ1ZmZlcltdIHtudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCBudWxsKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQnVmZmVyW10ge251bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGx9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICBmb3IgKEJ5dGVCdWZmZXJbXSBpbnB1dCA6IGlucHV0cykKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb252ZXJ0c1NhbWUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVRGOFR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMlR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQsIHYpIC0+IChCeXRlQnVmZmVyKSB2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5Q2x1c3RlcmluZygpCisgICAgeworICAgICAgICBWYWx1ZUFjY2Vzc29yPEJ5dGVCdWZmZXI+IGFjY2Vzc29yID0gQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlOworICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wID0gbmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKCk7CisgICAgICAgIEVudW1TZXQ8Q2x1c3RlcmluZ1ByZWZpeC5LaW5kPiBza2lwcGVkS2luZHMgPSBFbnVtU2V0Lm9mKENsdXN0ZXJpbmdQcmVmaXguS2luZC5TU1RBQkxFX0xPV0VSX0JPVU5ELCBDbHVzdGVyaW5nUHJlZml4LktpbmQuU1NUQUJMRV9VUFBFUl9CT1VORCk7CisgICAgICAgIGZvciAoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGtpbmQgOiBFbnVtU2V0LmNvbXBsZW1lbnRPZihza2lwcGVkS2luZHMpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoa2luZC5pc0JvdW5kYXJ5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Qnl0ZUJ1ZmZlcj4gZW1wdHkgPSBCeXRlU291cmNlQ29tcGFyaXNvblRlc3QubWFrZUJvdW5kKGtpbmQpOworICAgICAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeDxCeXRlQnVmZmVyPiBjb252ZXJ0ZWQgPSBnZXRDbHVzdGVyaW5nUHJlZml4KGFjY2Vzc29yLCBraW5kLCBjb21wLCBjb21wLmFzQnl0ZUNvbXBhcmFibGUoZW1wdHkpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbXB0eSwgY29udmVydGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb252ZXJ0c1NhbWUoQWJzdHJhY3RUeXBlIHQxLCBBYnN0cmFjdFR5cGUgdDIsIE9iamVjdCBvMSwgT2JqZWN0IG8yKQorICAgIHsKKyAgICAgICAgZm9yIChWYWx1ZUFjY2Vzc29yPD8+IGFjY2Vzc29yIDogVmFsdWVBY2Nlc3NvcnMuQUNDRVNTT1JTKQorICAgICAgICAgICAgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb252ZXJ0c1NhbWUoYWNjZXNzb3IsIHQxLCB0MiwgbzEsIG8yLCBBYnN0cmFjdFR5cGU6OmRlY29tcG9zZSk7CisgICAgfQorCisgICAgPFY+IHZvaWQgYXNzZXJ0Q2x1c3RlcmluZ1BhaXJDb252ZXJ0c1NhbWUoVmFsdWVBY2Nlc3NvcjxWPiBhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdDEsIEFic3RyYWN0VHlwZTw/PiB0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgbzEsIE9iamVjdCBvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaUZ1bmN0aW9uPEFic3RyYWN0VHlwZSwgT2JqZWN0LCBCeXRlQnVmZmVyPiBkZWNvbXBvc2UpCisgICAgeworICAgICAgICBib29sZWFuIGNoZWNrRXF1YWxzID0gdDEgIT0gRGVjaW1hbFR5cGUuaW5zdGFuY2UgJiYgdDIgIT0gRGVjaW1hbFR5cGUuaW5zdGFuY2U7CisgICAgICAgIEVudW1TZXQ8Q2x1c3RlcmluZ1ByZWZpeC5LaW5kPiBza2lwcGVkS2luZHMgPSBFbnVtU2V0Lm9mKENsdXN0ZXJpbmdQcmVmaXguS2luZC5TU1RBQkxFX0xPV0VSX0JPVU5ELCBDbHVzdGVyaW5nUHJlZml4LktpbmQuU1NUQUJMRV9VUFBFUl9CT1VORCk7CisgICAgICAgIGZvciAoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIGsxIDogRW51bVNldC5jb21wbGVtZW50T2Yoc2tpcHBlZEtpbmRzKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wID0gbmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKHQxLCB0Mik7CisgICAgICAgICAgICAgICAgVltdIGIgPSBhY2Nlc3Nvci5jcmVhdGVBcnJheSgyKTsKKyAgICAgICAgICAgICAgICBiWzBdID0gYWNjZXNzb3IudmFsdWVPZihkZWNvbXBvc2UuYXBwbHkodDEsIG8xKSk7CisgICAgICAgICAgICAgICAgYlsxXSA9IGFjY2Vzc29yLnZhbHVlT2YoZGVjb21wb3NlLmFwcGx5KHQyLCBvMikpOworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Vj4gYyA9IEJ5dGVTb3VyY2VDb21wYXJpc29uVGVzdC5tYWtlQm91bmQoYWNjZXNzb3IuZmFjdG9yeSgpLCBrMSwgYik7CisgICAgICAgICAgICAgICAgZmluYWwgQnl0ZUNvbXBhcmFibGUgYnNjID0gY29tcC5hc0J5dGVDb21wYXJhYmxlKGMpOworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJDbHVzdGVyaW5nIHt9IGJ5dGVzb3VyY2Uge30iLCBjLmNsdXN0ZXJpbmdTdHJpbmcoY29tcC5zdWJ0eXBlcygpKSwgYnNjLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTikpOworICAgICAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXg8Vj4gY29udmVydGVkID0gZ2V0Q2x1c3RlcmluZ1ByZWZpeChhY2Nlc3NvciwgazEsIGNvbXAsIGJzYyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkZhaWxlZCBjb21wYXJlKCVzLCBjb252ZXJ0ZWQgJXMgQnl0ZVNvdXJjZSAlcykgPT0gMFxudHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihjLmNsdXN0ZXJpbmdTdHJpbmcoY29tcC5zdWJ0eXBlcygpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihjb252ZXJ0ZWQuY2x1c3RlcmluZ1N0cmluZyhjb21wLnN1YnR5cGVzKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic2MuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgY29tcC5jb21wYXJlKGMsIGNvbnZlcnRlZCkpOworICAgICAgICAgICAgICAgIGlmIChjaGVja0VxdWFscykKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkZhaWxlZCBlcXVhbHMgJXMsIGdvdCAlcyBCeXRlU291cmNlICVzXG50eXBlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihjLmNsdXN0ZXJpbmdTdHJpbmcoY29tcC5zdWJ0eXBlcygpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoY29udmVydGVkLmNsdXN0ZXJpbmdTdHJpbmcoY29tcC5zdWJ0eXBlcygpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzYy5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZFUlNJT04pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsIGNvbnZlcnRlZCk7CisKKyAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wUiA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UodDEpLCBSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UodDIpKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBCeXRlQ29tcGFyYWJsZSBic3JjID0gY29tcFIuYXNCeXRlQ29tcGFyYWJsZShjKTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBnZXRDbHVzdGVyaW5nUHJlZml4KGFjY2Vzc29yLCBrMSwgY29tcFIsIGJzcmMpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZm9ybWF0KCJGYWlsZWQgcmV2ZXJzZSBjb21wYXJlKCVzLCBjb252ZXJ0ZWQgJXMgQnl0ZVNvdXJjZSAlcykgPT0gMFxudHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihjLmNsdXN0ZXJpbmdTdHJpbmcoY29tcFIuc3VidHlwZXMoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoY29udmVydGVkLmNsdXN0ZXJpbmdTdHJpbmcoY29tcFIuc3VidHlwZXMoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzcmMuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGNvbXBSLmNvbXBhcmUoYywgY29udmVydGVkKSk7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrRXF1YWxzKQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRmFpbGVkIHJldmVyc2UgZXF1YWxzICVzLCBnb3QgJXMgQnl0ZVNvdXJjZSAlc1xudHlwZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoYy5jbHVzdGVyaW5nU3RyaW5nKGNvbXBSLnN1YnR5cGVzKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihjb252ZXJ0ZWQuY2x1c3RlcmluZ1N0cmluZyhjb21wUi5zdWJ0eXBlcygpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzcmMuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcFIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywgY29udmVydGVkKTsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8Vj4gQ2x1c3RlcmluZ1ByZWZpeDxWPiBnZXRDbHVzdGVyaW5nUHJlZml4KFZhbHVlQWNjZXNzb3I8Vj4gYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nUHJlZml4LktpbmQgazEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyaW5nQ29tcGFyYXRvciBjb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUNvbXBhcmFibGUgYnNjKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChrMSkKKyAgICAgICAgeworICAgICAgICBjYXNlIFNUQVRJQ19DTFVTVEVSSU5HOgorICAgICAgICBjYXNlIENMVVNURVJJTkc6CisgICAgICAgICAgICByZXR1cm4gY29tcC5jbHVzdGVyaW5nRnJvbUJ5dGVDb21wYXJhYmxlKGFjY2Vzc29yLCBic2MpOworICAgICAgICBjYXNlIEVYQ0xfRU5EX0JPVU5EOgorICAgICAgICBjYXNlIElOQ0xfRU5EX0JPVU5EOgorICAgICAgICAgICAgcmV0dXJuIGNvbXAuYm91bmRGcm9tQnl0ZUNvbXBhcmFibGUoYWNjZXNzb3IsIGJzYywgdHJ1ZSk7CisgICAgICAgIGNhc2UgSU5DTF9TVEFSVF9CT1VORDoKKyAgICAgICAgY2FzZSBFWENMX1NUQVJUX0JPVU5EOgorICAgICAgICAgICAgcmV0dXJuIGNvbXAuYm91bmRGcm9tQnl0ZUNvbXBhcmFibGUoYWNjZXNzb3IsIGJzYywgZmFsc2UpOworICAgICAgICBjYXNlIEVYQ0xfRU5EX0lOQ0xfU1RBUlRfQk9VTkRBUlk6CisgICAgICAgIGNhc2UgSU5DTF9FTkRfRVhDTF9TVEFSVF9CT1VOREFSWToKKyAgICAgICAgICAgIHJldHVybiBjb21wLmJvdW5kYXJ5RnJvbUJ5dGVDb21wYXJhYmxlKGFjY2Vzc29yLCBic2MpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlU291cmNlLlBlZWthYmxlIHNvdXJjZShCeXRlQ29tcGFyYWJsZSBic2MpCisgICAgeworICAgICAgICBpZiAoYnNjID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIEJ5dGVTb3VyY2UucGVla2FibGUoYnNjLmFzQ29tcGFyYWJsZUJ5dGVzKFZFUlNJT04pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUdXBsZVR5cGUoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHJhbmQgPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCk7CisgICAgICAgIHRlc3RDb21iaW5hdGlvblNhbXBsaW5nKHJhbmQsIHRoaXM6OmFzc2VydFR1cGxlQ29udmVydHNTYW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUdXBsZVR5cGVOb25GdWxsKCkKKyAgICB7CisgICAgICAgIFR1cGxlVHlwZSB0dCA9IG5ldyBUdXBsZVR5cGUoSW1tdXRhYmxlTGlzdC5vZihVVEY4VHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlKSk7CisgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gdGVzdHMgPSBJbW11dGFibGVMaXN0Lm9mCisgICAgICAgICAgICAoCisgICAgICAgICAgICBUdXBsZVR5cGUuYnVpbGRWYWx1ZShCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUFuZFJhbmRvbVBhZChJbnQzMlR5cGUuaW5zdGFuY2UsIDApKSwKKyAgICAgICAgICAgIC8vIE5vdGU6IGEgZGVjb21wb3NlZCBudWxsIChlLmcuIGRlY29tcG9zZUFuZFJhbmRvbVBhZChJbnQzMlR5cGUuaW5zdGFuY2UsIG51bGwpKSBzaG91bGQgbm90IHJlYWNoIGEgdHVwbGUKKyAgICAgICAgICAgIFR1cGxlVHlwZS5idWlsZFZhbHVlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCksCisgICAgICAgICAgICBUdXBsZVR5cGUuYnVpbGRWYWx1ZShCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgMCkpLAorICAgICAgICAgICAgVHVwbGVUeXBlLmJ1aWxkVmFsdWUoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSksCisgICAgICAgICAgICBUdXBsZVR5cGUuYnVpbGRWYWx1ZShCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIChCeXRlQnVmZmVyKSBudWxsKSwKKyAgICAgICAgICAgIFR1cGxlVHlwZS5idWlsZFZhbHVlKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSkKKyAgICAgICAgICAgICk7CisgICAgICAgIHRlc3RCdWZmZXJzKHR0LCB0ZXN0cyk7CisgICAgfQorCisgICAgdm9pZCBhc3NlcnRUdXBsZUNvbnZlcnRzU2FtZShBYnN0cmFjdFR5cGUgdDEsIEFic3RyYWN0VHlwZSB0MiwgT2JqZWN0IG8xLCBPYmplY3QgbzIpCisgICAgeworICAgICAgICBUdXBsZVR5cGUgdHQgPSBuZXcgVHVwbGVUeXBlKEltbXV0YWJsZUxpc3Qub2YodDEsIHQyKSk7CisgICAgICAgIEJ5dGVCdWZmZXIgYjEgPSBUdXBsZVR5cGUuYnVpbGRWYWx1ZShCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvbXBvc2VGb3JUdXBsZSh0MSwgbzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wb3NlRm9yVHVwbGUodDIsIG8yKSk7CisgICAgICAgIGFzc2VydENvbnZlcnRzU2FtZUJ1ZmZlcnModHQsIGIxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVUeXBlKCkKKyAgICB7CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgwKTsKKyAgICAgICAgdGVzdENvbWJpbmF0aW9uU2FtcGxpbmcocmFuZCwgdGhpczo6YXNzZXJ0Q29tcG9zaXRlQ29udmVydHNTYW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVUeXBlTm9uRnVsbCgpCisgICAgeworICAgICAgICBDb21wb3NpdGVUeXBlIHR0ID0gQ29tcG9zaXRlVHlwZS5nZXRJbnN0YW5jZShVVEY4VHlwZS5pbnN0YW5jZSwgSW50MzJUeXBlLmluc3RhbmNlKTsKKyAgICAgICAgTGlzdDxCeXRlQnVmZmVyPiB0ZXN0cyA9IEltbXV0YWJsZUxpc3Qub2YKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgIENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBkZWNvbXBvc2VBbmRSYW5kb21QYWQoVVRGOFR5cGUuaW5zdGFuY2UsICIiKSwgZGVjb21wb3NlQW5kUmFuZG9tUGFkKEludDMyVHlwZS5pbnN0YW5jZSwgMCkpLAorICAgICAgICAgICAgQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIGRlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpLCBkZWNvbXBvc2VBbmRSYW5kb21QYWQoSW50MzJUeXBlLmluc3RhbmNlLCBudWxsKSksCisgICAgICAgICAgICBDb21wb3NpdGVUeXBlLmJ1aWxkKEJ5dGVCdWZmZXJBY2Nlc3Nvci5pbnN0YW5jZSwgZGVjb21wb3NlQW5kUmFuZG9tUGFkKFVURjhUeXBlLmluc3RhbmNlLCAiIikpLAorICAgICAgICAgICAgQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UpLAorICAgICAgICAgICAgQ29tcG9zaXRlVHlwZS5idWlsZChCeXRlQnVmZmVyQWNjZXNzb3IuaW5zdGFuY2UsIHRydWUsIGRlY29tcG9zZUFuZFJhbmRvbVBhZChVVEY4VHlwZS5pbnN0YW5jZSwgIiIpKSwKKyAgICAgICAgICAgIENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLHRydWUpCisgICAgICAgICAgICApOworICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgYiA6IHRlc3RzKQorICAgICAgICAgICAgdHQudmFsaWRhdGUoYik7CisgICAgICAgIHRlc3RCdWZmZXJzKHR0LCB0ZXN0cyk7CisgICAgfQorCisgICAgdm9pZCBhc3NlcnRDb21wb3NpdGVDb252ZXJ0c1NhbWUoQWJzdHJhY3RUeXBlIHQxLCBBYnN0cmFjdFR5cGUgdDIsIE9iamVjdCBvMSwgT2JqZWN0IG8yKQorICAgIHsKKyAgICAgICAgQ29tcG9zaXRlVHlwZSB0dCA9IENvbXBvc2l0ZVR5cGUuZ2V0SW5zdGFuY2UodDEsIHQyKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiMSA9IENvbXBvc2l0ZVR5cGUuYnVpbGQoQnl0ZUJ1ZmZlckFjY2Vzc29yLmluc3RhbmNlLCBkZWNvbXBvc2VBbmRSYW5kb21QYWQodDEsIG8xKSwgZGVjb21wb3NlQW5kUmFuZG9tUGFkKHQyLCBvMikpOworICAgICAgICBhc3NlcnRDb252ZXJ0c1NhbWVCdWZmZXJzKHR0LCBiMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY0NvbXBvc2l0ZSgpCisgICAgeworICAgICAgICBEeW5hbWljQ29tcG9zaXRlVHlwZSB0dCA9IER5bmFtaWNDb21wb3NpdGVUeXBlLmdldEluc3RhbmNlKER5bmFtaWNDb21wb3NpdGVUeXBlVGVzdC5hbGlhc2VzKTsKKyAgICAgICAgVVVJRFtdIHV1aWRzID0gRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LnV1aWRzOworICAgICAgICBMaXN0PEJ5dGVCdWZmZXI+IHRlc3RzID0gSW1tdXRhYmxlTGlzdC5vZgorICAgICAgICAgICAgKAorICAgICAgICAgICAgRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoInRlc3QxIiwgbnVsbCwgLTEsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgIER5bmFtaWNDb21wb3NpdGVUeXBlVGVzdC5jcmVhdGVEeW5hbWljQ29tcG9zaXRlS2V5KCJ0ZXN0MSIsIHV1aWRzWzBdLCAyNCwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoInRlc3QxIiwgdXVpZHNbMF0sIDQyLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICBEeW5hbWljQ29tcG9zaXRlVHlwZVRlc3QuY3JlYXRlRHluYW1pY0NvbXBvc2l0ZUtleSgidGVzdDIiLCB1dWlkc1swXSwgLTEsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgIER5bmFtaWNDb21wb3NpdGVUeXBlVGVzdC5jcmVhdGVEeW5hbWljQ29tcG9zaXRlS2V5KCJ0ZXN0MiIsIHV1aWRzWzFdLCA0MiwgZmFsc2UsIHRydWUpCisgICAgICAgICAgICApOworICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgYiA6IHRlc3RzKQorICAgICAgICAgICAgdHQudmFsaWRhdGUoYik7CisgICAgICAgIHRlc3RCdWZmZXJzKHR0LCB0ZXN0cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdFR5cGVTdHJpbmcoKQorICAgIHsKKyAgICAgICAgdGVzdENvbGxlY3Rpb24oTGlzdFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIHRydWUpLCB0ZXN0U3RyaW5ncywgKCkgLT4gbmV3IEFycmF5TGlzdDw+KCksIG5ldyBSYW5kb20oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdFR5cGVMb25nKCkKKyAgICB7CisgICAgICAgIHRlc3RDb2xsZWN0aW9uKExpc3RUeXBlLmdldEluc3RhbmNlKExvbmdUeXBlLmluc3RhbmNlLCB0cnVlKSwgdGVzdExvbmdzLCAoKSAtPiBuZXcgQXJyYXlMaXN0PD4oKSwgbmV3IFJhbmRvbSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRUeXBlU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHRlc3RDb2xsZWN0aW9uKFNldFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIHRydWUpLCB0ZXN0U3RyaW5ncywgKCkgLT4gbmV3IEhhc2hTZXQ8PigpLCBuZXcgUmFuZG9tKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldFR5cGVMb25nKCkKKyAgICB7CisgICAgICAgIHRlc3RDb2xsZWN0aW9uKFNldFR5cGUuZ2V0SW5zdGFuY2UoTG9uZ1R5cGUuaW5zdGFuY2UsIHRydWUpLCB0ZXN0TG9uZ3MsICgpIC0+IG5ldyBIYXNoU2V0PD4oKSwgbmV3IFJhbmRvbSgpKTsKKyAgICB9CisKKyAgICA8VCwgQ1QgZXh0ZW5kcyBDb2xsZWN0aW9uPFQ+PiB2b2lkIHRlc3RDb2xsZWN0aW9uKENvbGxlY3Rpb25UeXBlPENUPiB0dCwgVFtdIHZhbHVlcywgU3VwcGxpZXI8Q1Q+IGdlbiwgUmFuZG9tIHJhbmQpCisgICAgeworICAgICAgICBpbnQgY250ID0gMDsKKyAgICAgICAgTGlzdDxDVD4gdGVzdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgdGVzdHMuYWRkKGdlbi5nZXQoKSk7CisgICAgICAgIGZvciAoaW50IGMgPSAxOyBjIDw9IDM7ICsrYykKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENUIGwgPSBnZW4uZ2V0KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUIHZhbHVlID0gdmFsdWVzW2NudCsrICUgdmFsdWVzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgbC5hZGQodmFsdWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRlc3RzLmFkZChsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgdGVzdFR5cGUodHQsIHRlc3RzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBUeXBlU3RyaW5nTG9uZygpCisgICAgeworICAgICAgICB0ZXN0TWFwKE1hcFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIExvbmdUeXBlLmluc3RhbmNlLCB0cnVlKSwgdGVzdFN0cmluZ3MsIHRlc3RMb25ncywgKCkgLT4gbmV3IEhhc2hNYXA8PigpLCBuZXcgUmFuZG9tKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcFR5cGVTdHJpbmdMb25nVHJlZSgpCisgICAgeworICAgICAgICB0ZXN0TWFwKE1hcFR5cGUuZ2V0SW5zdGFuY2UoVVRGOFR5cGUuaW5zdGFuY2UsIExvbmdUeXBlLmluc3RhbmNlLCB0cnVlKSwgdGVzdFN0cmluZ3MsIHRlc3RMb25ncywgKCkgLT4gbmV3IFRyZWVNYXA8PigpLCBuZXcgUmFuZG9tKCkpOworICAgIH0KKworICAgIDxLLCBWLCBNIGV4dGVuZHMgTWFwPEssIFY+PiB2b2lkIHRlc3RNYXAoTWFwVHlwZTxLLCBWPiB0dCwgS1tdIGtleXMsIFZbXSB2YWx1ZXMsIFN1cHBsaWVyPE0+IGdlbiwgUmFuZG9tIHJhbmQpCisgICAgeworICAgICAgICBMaXN0PE0+IHRlc3RzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHRlc3RzLmFkZChnZW4uZ2V0KCkpOworICAgICAgICBmb3IgKGludCBjID0gMTsgYyA8PSAzOyArK2MpCisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDU7ICsraikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNIGwgPSBnZW4uZ2V0KCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjOyArK2kpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWIHZhbHVlID0gdmFsdWVzW3JhbmQubmV4dEludCh2YWx1ZXMubGVuZ3RoKV07CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgbC5wdXQoa2V5c1tyYW5kLm5leHRJbnQoa2V5cy5sZW5ndGgpXSwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRlc3RzLmFkZChsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgdGVzdFR5cGUodHQsIHRlc3RzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENvbnZlcnQgdHlwZSB0byBhIGNvbXBhcmFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlQ29tcGFyYWJsZSB0eXBlVG9Db21wYXJhYmxlKEFic3RyYWN0VHlwZTw/PiB0eXBlLCBCeXRlQnVmZmVyIHZhbHVlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlQ29tcGFyYWJsZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJ5dGVTb3VyY2UgYXNDb21wYXJhYmxlQnl0ZXMoVmVyc2lvbiB2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmFzQ29tcGFyYWJsZUJ5dGVzKHZhbHVlLCB2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5nZXRTdHJpbmcodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHB1YmxpYyA8VD4gdm9pZCB0ZXN0VHlwZShBYnN0cmFjdFR5cGU8VD4gdHlwZSwgT2JqZWN0W10gdmFsdWVzKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGUodHlwZSwgSXRlcmFibGVzLnRyYW5zZm9ybShBcnJheXMuYXNMaXN0KHZhbHVlcyksIHggLT4gKFQpIHgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IHZvaWQgdGVzdFR5cGUoQWJzdHJhY3RUeXBlPD8gc3VwZXIgVD4gdHlwZSwgSXRlcmFibGU8VD4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgZm9yIChUIGkgOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgYiA9IGRlY29tcG9zZUFuZFJhbmRvbVBhZCh0eXBlLCBpKTsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJWYWx1ZSB7fSAoe30pIGJ5dGVzIHt9IEJ5dGVTb3VyY2Uge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZVN0cihpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIodHlwZS5nZXRTZXJpYWxpemVyKCkudG9DUUxMaXRlcmFsKGIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlVG9Db21wYXJhYmxlKHR5cGUsIGIpLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTikpOworICAgICAgICAgICAgYXNzZXJ0Q29udmVydHNTYW1lKHR5cGUsIGkpOworICAgICAgICB9CisgICAgICAgIGlmICghdHlwZS5pc1JldmVyc2VkKCkpCisgICAgICAgICAgICB0ZXN0VHlwZShSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UodHlwZSksIHZhbHVlcyk7CisgICAgfQorCisgICAgcHVibGljIDxUPiB2b2lkIHRlc3RUeXBlQnVmZmVycyhBYnN0cmFjdFR5cGU8VD4gdHlwZSwgT2JqZWN0W10gdmFsdWVzKQorICAgIHsKKyAgICAgICAgdGVzdFR5cGVCdWZmZXJzKHR5cGUsIExpc3RzLnRyYW5zZm9ybShBcnJheXMuYXNMaXN0KHZhbHVlcyksIHggLT4gKFQpIHgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IHZvaWQgdGVzdFR5cGVCdWZmZXJzKEFic3RyYWN0VHlwZTxUPiB0eXBlLCBMaXN0PFQ+IHZhbHVlcykKKyAgICB7CisgICAgICAgIC8vIE1haW4gZGlmZmVyZW5jZSB3aXRoIGFib3ZlIGlzIHRoYXQgd2UgdXNlIHR5cGUuY29tcGFyZSBpbnN0ZWFkIG9mIGNoZWNraW5nIGVxdWFscworICAgICAgICB0ZXN0QnVmZmVycyh0eXBlLCBMaXN0cy50cmFuc2Zvcm0odmFsdWVzLCB2YWx1ZSAtPiBkZWNvbXBvc2VBbmRSYW5kb21QYWQodHlwZSwgdmFsdWUpKSk7CisKKyAgICB9CisgICAgcHVibGljIHZvaWQgdGVzdEJ1ZmZlcnMoQWJzdHJhY3RUeXBlPD8+IHR5cGUsIExpc3Q8Qnl0ZUJ1ZmZlcj4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBiIDogdmFsdWVzKSB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlZhbHVlIHt9IGJ5dGVzIHt9IEJ5dGVTb3VyY2Uge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIodHlwZS5nZXRTZXJpYWxpemVyKCkudG9DUUxMaXRlcmFsKGIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlU3RyKEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVUb0NvbXBhcmFibGUodHlwZSwgYikuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGhvdXQgbGlzdGluZyB2YWx1ZXMuCisgICAgICAgIH0KKworICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgaSA6IHZhbHVlcykKKyAgICAgICAgICAgIGFzc2VydENvbnZlcnRzU2FtZUJ1ZmZlcnModHlwZSwgaSk7CisgICAgfQorCisgICAgdm9pZCBhc3NlcnRDb252ZXJ0c1NhbWVCdWZmZXJzKEFic3RyYWN0VHlwZTw/PiB0eXBlLCBCeXRlQnVmZmVyIGIxKQorICAgIHsKKyAgICAgICAgZmluYWwgQnl0ZUNvbXBhcmFibGUgYnMxID0gdHlwZVRvQ29tcGFyYWJsZSh0eXBlLCBiMSk7CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBhY3R1YWwgPSB0eXBlLmZyb21Db21wYXJhYmxlQnl0ZXMoc291cmNlKGJzMSksIFZFUlNJT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRmFpbGVkIGNvbXBhcmUoJXMsIGNvbnZlcnRlZCAlcyAoYnl0ZXNvdXJjZSAlcykpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYWN0dWFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnMxLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTikpLAorICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgIHR5cGUuY29tcGFyZShiMSwgYWN0dWFsKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdERlY29yYXRlZEtleXMoSVBhcnRpdGlvbmVyIHR5cGUsIExpc3Q8Qnl0ZUJ1ZmZlcj4gdmFsdWVzKQorICAgIHsKKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGkgOiB2YWx1ZXMpCisgICAgICAgICAgICBhc3NlcnRDb252ZXJ0c1NhbWVEZWNvcmF0ZWRLZXlzKHR5cGUsIGkpOworICAgIH0KKworICAgIHZvaWQgYXNzZXJ0Q29udmVydHNTYW1lRGVjb3JhdGVkS2V5cyhJUGFydGl0aW9uZXIgdHlwZSwgQnl0ZUJ1ZmZlciBiMSkKKyAgICB7CisgICAgICAgIERlY29yYXRlZEtleSBrMSA9IHR5cGUuZGVjb3JhdGVLZXkoYjEpOworICAgICAgICBEZWNvcmF0ZWRLZXkgYWN0dWFsID0gQnVmZmVyRGVjb3JhdGVkS2V5LmZyb21CeXRlQ29tcGFyYWJsZShrMSwgVkVSU0lPTiwgdHlwZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkZhaWxlZCBjb21wYXJlKCVzWyVzIGJzICVzXSwgJXNbJXMgYnMgJXNdKVxucGFydGl0aW9uZXIgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsxLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChhY3R1YWwuZ2V0S2V5KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwuYnl0ZUNvbXBhcmFibGVBc1N0cmluZyhWRVJTSU9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSksCisgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgazEuY29tcGFyZVRvKGFjdHVhbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiRmFpbGVkIGVxdWFscyglc1slcyBicyAlc10sICVzWyVzIGJzICVzXSlcbnBhcnRpdGlvbmVyICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgazEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYjEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrMS5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZFUlNJT04pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYWN0dWFsLmdldEtleSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgazEsCisgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICAgIH0KKworICAgIHN0YXRpYyBPYmplY3Qgc2FmZVN0cihPYmplY3QgaSkKKyAgICB7CisgICAgICAgIGlmIChpID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgaWYgKGkgaW5zdGFuY2VvZiBCeXRlQnVmZmVyKQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZiA9IChCeXRlQnVmZmVyKSBpOworICAgICAgICAgICAgaSA9IEJ5dGVCdWZmZXJVdGlsLmJ5dGVzVG9IZXgoYnVmKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgcyA9IGkudG9TdHJpbmcoKTsKKyAgICAgICAgaWYgKHMubGVuZ3RoKCkgPiAxMDApCisgICAgICAgICAgICBzID0gcy5zdWJzdHJpbmcoMCwgMTAwKSArICIuLi4iOworICAgICAgICByZXR1cm4gcy5yZXBsYWNlQWxsKCJcMCIsICI8MD4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgPFQ+IHZvaWQgdGVzdERpcmVjdChGdW5jdGlvbjxULCBCeXRlU291cmNlPiBjb252ZXJ0b3IsIEZ1bmN0aW9uPEJ5dGVTb3VyY2UuUGVla2FibGUsIFQ+IGludmVyc2UsIFRbXSB2YWx1ZXMpCisgICAgeworICAgICAgICBmb3IgKFQgaSA6IHZhbHVlcykgeworICAgICAgICAgICAgaWYgKGkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgbG9nZ2VyLmluZm8oIlZhbHVlIHt9IEJ5dGVTb3VyY2Uge31cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlU3RyKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydG9yLmFwcGx5KGkpKTsKKworICAgICAgICB9CisgICAgICAgIGZvciAoVCBpIDogdmFsdWVzKQorICAgICAgICAgICAgaWYgKGkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICBhc3NlcnRDb252ZXJ0c1NhbWUoY29udmVydG9yLCBpbnZlcnNlLCBpKTsKKyAgICB9CisKKyAgICA8VD4gdm9pZCBhc3NlcnRDb252ZXJ0c1NhbWUoRnVuY3Rpb248VCwgQnl0ZVNvdXJjZT4gY29udmVydG9yLCBGdW5jdGlvbjxCeXRlU291cmNlLlBlZWthYmxlLCBUPiBpbnZlcnNlLCBUIHYxKQorICAgIHsKKyAgICAgICAgQnl0ZUNvbXBhcmFibGUgYjEgPSB2IC0+IGNvbnZlcnRvci5hcHBseSh2MSk7CisgICAgICAgIFQgYWN0dWFsID0gaW52ZXJzZS5hcHBseShzb3VyY2UoYjEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkJ5dGVTb3VyY2UgJXMiLCBiMS5ieXRlQ29tcGFyYWJsZUFzU3RyaW5nKFZFUlNJT04pKSwgdjEsIGFjdHVhbCk7CisgICAgfQorCisgICAgPFQ+IHZvaWQgYXNzZXJ0Q29udmVydHNTYW1lKEFic3RyYWN0VHlwZTxUPiB0eXBlLCBUIHYxKQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiMSA9IGRlY29tcG9zZUFuZFJhbmRvbVBhZCh0eXBlLCB2MSk7CisgICAgICAgIGZpbmFsIEJ5dGVDb21wYXJhYmxlIGJjMSA9IHR5cGVUb0NvbXBhcmFibGUodHlwZSwgYjEpOworICAgICAgICBCeXRlQnVmZmVyIGNvbnZlcnRlZEJ1ZmZlciA9IHR5cGUuZnJvbUNvbXBhcmFibGVCeXRlcyhzb3VyY2UoYmMxKSwgVkVSU0lPTik7CisgICAgICAgIFQgYWN0dWFsID0gdHlwZS5jb21wb3NlKGNvbnZlcnRlZEJ1ZmZlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkZhaWxlZCBlcXVhbHMgJXMoJXMgYnMgJXMpLCBnb3QgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlU3RyKHYxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlclV0aWwuYnl0ZXNUb0hleChiMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVTdHIoYmMxLmJ5dGVDb21wYXJhYmxlQXNTdHJpbmcoVkVSU0lPTikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlU3RyKGFjdHVhbCkpLAorICAgICAgICAgICAgICAgICAgICAgdjEsCisgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICAgIH0KKworICAgIDxUPiBCeXRlQnVmZmVyIGRlY29tcG9zZUFuZFJhbmRvbVBhZChBYnN0cmFjdFR5cGU8VD4gdHlwZSwgVCB2KQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiID0gdHlwZS5kZWNvbXBvc2Uodik7CisgICAgICAgIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgwKTsKKyAgICAgICAgaW50IHBhZEJlZm9yZSA9IHJhbmQubmV4dEludCgxNik7CisgICAgICAgIGludCBwYWRBZnRlciA9IHJhbmQubmV4dEludCgxNik7CisgICAgICAgIGludCBwYWRkZWRDYXBhY2l0eSA9IGIucmVtYWluaW5nKCkgKyBwYWRCZWZvcmUgKyBwYWRBZnRlcjsKKyAgICAgICAgQnl0ZUJ1ZmZlciBwYWRkZWQgPSBhbGxvY2F0ZUJ1ZmZlcihwYWRkZWRDYXBhY2l0eSk7CisgICAgICAgIHJhbmQuaW50cyhwYWRCZWZvcmUpLmZvckVhY2goeCAtPiBwYWRkZWQucHV0KChieXRlKSB4KSk7CisgICAgICAgIHBhZGRlZC5wdXQoYi5kdXBsaWNhdGUoKSk7CisgICAgICAgIHJhbmQuaW50cyhwYWRBZnRlcikuZm9yRWFjaCh4IC0+IHBhZGRlZC5wdXQoKGJ5dGUpIHgpKTsKKyAgICAgICAgcGFkZGVkLmNsZWFyKCkubGltaXQocGFkZGVkLmNhcGFjaXR5KCkgLSBwYWRBZnRlcikucG9zaXRpb24ocGFkQmVmb3JlKTsKKyAgICAgICAgcmV0dXJuIHBhZGRlZDsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBhbGxvY2F0ZUJ1ZmZlcihpbnQgcGFkZGVkQ2FwYWNpdHkpCisgICAgeworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShwYWRkZWRDYXBhY2l0eSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlSW52ZXJzZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlSW52ZXJzZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQ2Y2MyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVTb3VyY2VJbnZlcnNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzk3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZTsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuKjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy4qOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLm1lbW9yeS5NZW1vcnlVdGlsOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5JbnRDb25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uTG9uZ0NvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uKjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKKworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBCeXRlU291cmNlSW52ZXJzZVRlc3QKK3sKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxQSEFCRVQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjEyMzQ1Njc4OTAhQCMkJV4mKigpIjsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ2ZXJzaW9uPXswfSIpCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxCeXRlQ29tcGFyYWJsZS5WZXJzaW9uPiB2ZXJzaW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZihCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbjsKKworICAgIHB1YmxpYyBCeXRlU291cmNlSW52ZXJzZVRlc3QoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbiB2ZXJzaW9uKQorICAgIHsKKyAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaWduZWRJbnQoKQorICAgIHsKKyAgICAgICAgSW50Q29uc3VtZXIgaW50Q29uc3VtZXIgPSBpbml0aWFsIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSA9IEJ5dGVTb3VyY2Uub2YoaW5pdGlhbCk7CisgICAgICAgICAgICBpbnQgZGVjb2RlZCA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZEludChieXRlU291cmNlKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaW5pdGlhbCwgZGVjb2RlZCk7CisgICAgICAgIH07CisKKyAgICAgICAgSW50U3RyZWFtLm9mKEludGVnZXIuTUlOX1ZBTFVFLCBJbnRlZ2VyLk1JTl9WQUxVRSArIDEsCisgICAgICAgICAgICAgICAgICAgICAtMjU2LCAtMjU1LCAtMTI4LCAtMTI3LCAtMSwgMCwgMSwgMTI3LCAxMjgsIDI1NSwgMjU2LAorICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUgLSAxLCBJbnRlZ2VyLk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgLmZvckVhY2goaW50Q29uc3VtZXIpOworICAgICAgICBuZXcgUmFuZG9tKCkuaW50cygxMDAwKQorICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChpbnRDb25zdW1lcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV4dEludCgpCisgICAgeworICAgICAgICAvLyBUaGUgaGlnaCBhbmQgbG93IDMyIGJpdHMgb2YgdGhpcyBsb25nIGRpZmZlciBvbmx5IGluIHRoZSBmaXJzdCBhbmQgbGFzdCBiaXQgKGluIHRoZSBoaWdoIDMyIGJpdHMgdGhleSBhcmUKKyAgICAgICAgLy8gYm90aCAwcyBpbnN0ZWFkIG9mIDFzKS4gVGhlIGZpcnN0IGJpdCBkaWZmZXJlbmNlIHdpbGwgYmUgbmVnYXRlZCBieSB0aGUgYml0IGZsaXBwaW5nIHdoZW4gd3JpdGluZyBkb3duIGEKKyAgICAgICAgLy8gZml4ZWQgbGVuZ3RoIHNpZ25lZCBudW1iZXIsIHNvIHRoZSBvbmx5IHJlbWFpbmluZyBkaWZmZXJlbmNlIHdpbGwgYmUgaW4gdGhlIGxhc3QgYml0LgorICAgICAgICBpbnQgaGkgPSAwYjAwMDFfMDAxMF8wMDExXzAxMDBfMDEwMV8wMTEwXzAxMTFfMTAwMDsKKyAgICAgICAgaW50IGxvID0gaGkgfCAxIHwgMSA8PCAzMTsKKyAgICAgICAgbG9uZyBsMSA9IEludGVnZXIudG9VbnNpZ25lZExvbmcoaGkpIDw8IDMyIHwgSW50ZWdlci50b1Vuc2lnbmVkTG9uZyhsbyk7CisKKyAgICAgICAgQnl0ZVNvdXJjZSBieXRlU291cmNlID0gQnl0ZVNvdXJjZS5vZihsMSk7CisgICAgICAgIGludCBpMSA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZEludChieXRlU291cmNlKTsKKyAgICAgICAgaW50IGkyID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0U2lnbmVkSW50KGJ5dGVTb3VyY2UpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGkxICsgMSwgaTIpOworCisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBCeXRlU291cmNlSW52ZXJzZS5nZXRTaWduZWRJbnQoYnl0ZVNvdXJjZSk7CisgICAgICAgICAgICBBc3NlcnQuZmFpbCgpOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRXhwZWN0ZWQuCisgICAgICAgIH0KKworICAgICAgICBieXRlU291cmNlID0gQnl0ZVNvdXJjZS5vZihsMSk7CisgICAgICAgIGludCBpRmlyc3QgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRTaWduZWRJbnQoYnl0ZVNvdXJjZSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaTEsIGlGaXJzdCk7CisgICAgICAgIGludCBpTmV4dCA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZEludChieXRlU291cmNlKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpMiwgaU5leHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNpZ25lZExvbmcoKQorICAgIHsKKyAgICAgICAgTG9uZ0NvbnN1bWVyIGxvbmdDb25zdW1lciA9IGluaXRpYWwgLT4KKyAgICAgICAgeworICAgICAgICAgICAgQnl0ZVNvdXJjZSBieXRlU291cmNlID0gQnl0ZVNvdXJjZS5vZihpbml0aWFsKTsKKyAgICAgICAgICAgIGxvbmcgZGVjb2RlZCA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZExvbmcoYnl0ZVNvdXJjZSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGluaXRpYWwsIGRlY29kZWQpOworICAgICAgICB9OworCisgICAgICAgIExvbmdTdHJlYW0ub2YoTG9uZy5NSU5fVkFMVUUsIExvbmcuTUlOX1ZBTFVFICsgMSwgSW50ZWdlci5NSU5fVkFMVUUgLSAxTCwKKyAgICAgICAgICAgICAgICAgICAgICAtMjU2TCwgLTI1NUwsIC0xMjhMLCAtMTI3TCwgLTFMLCAwTCwgMUwsIDEyN0wsIDEyOEwsIDI1NUwsIDI1NkwsCisgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUgKyAxTCwgTG9uZy5NQVhfVkFMVUUgLSAxLCBMb25nLk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGxvbmdDb25zdW1lcik7CisgICAgICAgIG5ldyBSYW5kb20oKS5sb25ncygxMDAwKQorICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaChsb25nQ29uc3VtZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNpZ25lZEJ5dGUoKQorICAgIHsKKyAgICAgICAgQ29uc3VtZXI8Qnl0ZT4gYnl0ZUNvbnN1bWVyID0gYm94ZWRCeXRlIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIGJ5dGUgaW5pdGlhbCA9IGJveGVkQnl0ZTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IEJ5dGVUeXBlLmluc3RhbmNlLmRlY29tcG9zZShpbml0aWFsKTsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2UgYnl0ZVNvdXJjZSA9IEJ5dGVUeXBlLmluc3RhbmNlLmFzQ29tcGFyYWJsZUJ5dGVzKGJ5dGVCdWZmZXIsIHZlcnNpb24pOworICAgICAgICAgICAgYnl0ZSBkZWNvZGVkID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0U2lnbmVkQnl0ZShieXRlU291cmNlKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaW5pdGlhbCwgZGVjb2RlZCk7CisgICAgICAgIH07CisKKyAgICAgICAgSW50U3RyZWFtLnJhbmdlKEJ5dGUuTUlOX1ZBTFVFLCBCeXRlLk1BWF9WQUxVRSArIDEpCisgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGJ5dGVJbnRlZ2VyIC0+IGJ5dGVDb25zdW1lci5hY2NlcHQoKGJ5dGUpIGJ5dGVJbnRlZ2VyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmVkU2hvcnQoKQorICAgIHsKKyAgICAgICAgQ29uc3VtZXI8U2hvcnQ+IHNob3J0Q29uc3VtZXIgPSBib3hlZFNob3J0IC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIHNob3J0IGluaXRpYWwgPSBib3hlZFNob3J0OworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBzaG9ydEJ1ZmZlciA9IFNob3J0VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoaW5pdGlhbCk7CisgICAgICAgICAgICBCeXRlU291cmNlIGJ5dGVTb3VyY2UgPSBTaG9ydFR5cGUuaW5zdGFuY2UuYXNDb21wYXJhYmxlQnl0ZXMoc2hvcnRCdWZmZXIsIHZlcnNpb24pOworICAgICAgICAgICAgc2hvcnQgZGVjb2RlZCA9IEJ5dGVTb3VyY2VJbnZlcnNlLmdldFNpZ25lZFNob3J0KGJ5dGVTb3VyY2UpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpbml0aWFsLCBkZWNvZGVkKTsKKyAgICAgICAgfTsKKworICAgICAgICBJbnRTdHJlYW0ucmFuZ2UoU2hvcnQuTUlOX1ZBTFVFLCBTaG9ydC5NQVhfVkFMVUUgKyAxKQorICAgICAgICAgICAgICAgICAuZm9yRWFjaChzaG9ydEludGVnZXIgLT4gc2hvcnRDb25zdW1lci5hY2NlcHQoKHNob3J0KSBzaG9ydEludGVnZXIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRCeXRlU291cmNlRm9yRml4ZWRMZW5ndGhOdW1iZXJzKCkKKyAgICB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzhdOworICAgICAgICBuZXcgUmFuZG9tKCkubmV4dEJ5dGVzKGJ5dGVzKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBlbnRyaWVzIDogSW1tdXRhYmxlTWFwLm9mKCJnZXRTaWduZWRJbnQiLCA0LAorICAgICAgICAgICAgICAgICAgImdldFNpZ25lZExvbmciLCA4LAorICAgICAgICAgICAgICAgICAgImdldFNpZ25lZEJ5dGUiLCAxLAorICAgICAgICAgICAgICAgICAgImdldFNpZ25lZFNob3J0IiwgMikuZW50cnlTZXQoKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSBlbnRyaWVzLmdldEtleSgpOworICAgICAgICAgICAgaW50IGxlbmd0aCA9IGVudHJpZXMuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1ldGhvZCBmaXhlZExlbmd0aE51bWJlck1ldGhvZCA9IEJ5dGVTb3VyY2VJbnZlcnNlLmNsYXNzLmdldE1ldGhvZChtZXRob2ROYW1lLCBCeXRlU291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBBcnJheUxpc3Q8Qnl0ZVNvdXJjZT4gc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgIHNvdXJjZXMuYWRkKG51bGwpOworICAgICAgICAgICAgICAgIHNvdXJjZXMuYWRkKEJ5dGVTb3VyY2UuRU1QVFkpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMuYWRkKEJ5dGVTb3VyY2UuZml4ZWRMZW5ndGgoYnl0ZXMsIDAsIGkpKTsKKyAgICAgICAgICAgICAgICAvLyBOb3RlOiBub3QgdGVzdGluZyBpbnZhbGlkIGJ5dGVzIChlLmcuIHVzaW5nIHRoZSBjb25zdHJ1Y3Rpb24gYmVsb3cpIGFzIHRoZXkgc2lnbmlmeSBhIHByb2dyYW1taW5nCisgICAgICAgICAgICAgICAgLy8gZXJyb3IgKHRocm93aW5nIEFzc2VydGlvbkVycm9yKSByYXRoZXIgdGhhbiBzb21ldGhpbmcgdGhhdCBjb3VsZCBoYXBwZW4gZHVlIHRvIGUuZy4gYmFkIGZpbGVzLgorICAgICAgICAgICAgICAgIC8vICAgICAgQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvckxlZ2FjeSgyNTcsIEJ5dGVTb3VyY2UuZml4ZWRMZW5ndGgoYnl0ZXMsIDAsIGxlbmd0aCAtIDEpKTsKKyAgICAgICAgICAgICAgICBmb3IgKEJ5dGVTb3VyY2UgYmFkU291cmNlIDogc291cmNlcykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZExlbmd0aE51bWJlck1ldGhvZC5pbnZva2UoQnl0ZVNvdXJjZUludmVyc2UuY2xhc3MsIGJhZFNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIG1heWJlKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXliZSA9IFRocm93YWJsZXMudW53cmFwcGVkKG1heWJlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIlVuZXhwZWN0ZWQgdGhyb3dhYmxlICIgKyBtYXliZSArICIgd2l0aCBjYXVzZSAiICsgbWF5YmUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYWRTb3VyY2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlIGluc3RhbmNlb2YgTnVsbFBvaW50ZXJFeGNlcHRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmUgaW5zdGFuY2VvZiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeHBlY3RlZCBCeXRlU291cmNlSW52ZXJzZSB0byBoYXZlIG1ldGhvZCBjYWxsZWQgIiArIG1ldGhvZE5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgd2l0aCBhIHNpbmdsZSBwYXJhbWV0ZXIgb2YgdHlwZSBCeXRlU291cmNlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRCeXRlU291cmNlRm9yVmFyaWFibGVMZW5ndGhOdW1iZXJzKCkKKyAgICB7CisgICAgICAgIGZvciAobG9uZyB2YWx1ZSA6IEFycmF5cy5hc0xpc3QoMEwsIDFMIDw8IDYsIDFMIDw8IDEzLCAxTCA8PCAyMCwgMUwgPDwgMjcsIDFMIDw8IDM0LCAxTCA8PCA0MSwgMUwgPDwgNDgsIDFMIDw8IDU1KSkKKyAgICAgICAgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh2YWx1ZSwgQnl0ZVNvdXJjZUludmVyc2UuZ2V0VmFyaWFibGVMZW5ndGhJbnRlZ2VyKEJ5dGVTb3VyY2UudmFyaWFibGVMZW5ndGhJbnRlZ2VyKHZhbHVlKSkpOworCisgICAgICAgICAgICBBcnJheUxpc3Q8Qnl0ZVNvdXJjZT4gc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgc291cmNlcy5hZGQobnVsbCk7CisgICAgICAgICAgICBzb3VyY2VzLmFkZChCeXRlU291cmNlLkVNUFRZKTsKKyAgICAgICAgICAgIGludCBsZW5ndGggPSBCeXRlQ29tcGFyYWJsZS5sZW5ndGgodmVyc2lvbiAtPiBCeXRlU291cmNlLnZhcmlhYmxlTGVuZ3RoSW50ZWdlcih2YWx1ZSksIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24uT1NTNTApOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICBzb3VyY2VzLmFkZChCeXRlU291cmNlLmN1dChCeXRlU291cmNlLnZhcmlhYmxlTGVuZ3RoSW50ZWdlcih2YWx1ZSksIGkpKTsKKworICAgICAgICAgICAgZm9yIChCeXRlU291cmNlIGJhZFNvdXJjZSA6IHNvdXJjZXMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBCeXRlU291cmNlSW52ZXJzZS5nZXRWYXJpYWJsZUxlbmd0aEludGVnZXIoYmFkU291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChUaHJvd2FibGUgbWF5YmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXliZSA9IFRocm93YWJsZXMudW53cmFwcGVkKG1heWJlKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiVW5leHBlY3RlZCB0aHJvd2FibGUgIiArIG1heWJlICsgIiB3aXRoIGNhdXNlICIgKyBtYXliZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYmFkU291cmNlID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5YmUgaW5zdGFuY2VvZiBOdWxsUG9pbnRlckV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U3RyaW5nKCkKKyAgICB7CisgICAgICAgIENvbnN1bWVyPFN0cmluZz4gc3RyaW5nQ29uc3VtZXIgPSBpbml0aWFsIC0+CisgICAgICAgIHsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgYnl0ZVNvdXJjZSA9IGluaXRpYWwgPT0gbnVsbCA/IG51bGwgOiBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uub2YoaW5pdGlhbCwgdmVyc2lvbikpOworICAgICAgICAgICAgU3RyaW5nIGRlY29kZWQgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRTdHJpbmcoYnl0ZVNvdXJjZSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGluaXRpYWwsIGRlY29kZWQpOworICAgICAgICB9OworCisgICAgICAgIFN0cmVhbS5vZihudWxsLCAiwqkgMjAxOCBEYXRhU3RheCIsICIiLCAiXG4iLCAiXDAiLCAiXDBcMCIsICJcMDAxIiwgIjAiLCAiMFwwIiwgIjAwIiwgIjEiKQorICAgICAgICAgICAgICAuZm9yRWFjaChzdHJpbmdDb25zdW1lcik7CisKKyAgICAgICAgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIGludCBzdHJpbmdMZW5ndGggPSAxMDsKKyAgICAgICAgU3RyaW5nIHJhbmRvbTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJhbmRvbSA9IG5ld1JhbmRvbUFscGhhbnVtZXJpYyhwcm5nLCBzdHJpbmdMZW5ndGgpOworICAgICAgICAgICAgc3RyaW5nQ29uc3VtZXIuYWNjZXB0KHJhbmRvbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmV3UmFuZG9tQWxwaGFudW1lcmljKFJhbmRvbSBwcm5nLCBpbnQgbGVuZ3RoKQorICAgIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByYW5kb20gPSBuZXcgU3RyaW5nQnVpbGRlcihsZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICAgICAgcmFuZG9tLmFwcGVuZChBTFBIQUJFVC5jaGFyQXQocHJuZy5uZXh0SW50KEFMUEhBQkVULmxlbmd0aCgpKSkpOworICAgICAgICByZXR1cm4gcmFuZG9tLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qnl0ZUJ1ZmZlcigpCisgICAgeworICAgICAgICBmb3IgKENvbnN1bWVyPGJ5dGVbXT4gYnl0ZUFycmF5Q29uc3VtZXIgOiBBcnJheXMuPENvbnN1bWVyPGJ5dGVbXT4+YXNMaXN0KGluaXRpYWxCeXRlcyAtPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgYnl0ZVNvdXJjZSA9IEJ5dGVTb3VyY2UucGVla2FibGUoQnl0ZVNvdXJjZS5vZihCeXRlQnVmZmVyLndyYXAoaW5pdGlhbEJ5dGVzKSwgdmVyc2lvbikpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBkZWNvZGVkQnl0ZXMgPSBCeXRlU291cmNlSW52ZXJzZS5nZXRVbmVzY2FwZWRCeXRlcyhieXRlU291cmNlKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHMoaW5pdGlhbEJ5dGVzLCBkZWNvZGVkQnl0ZXMpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGluaXRpYWxCeXRlcyAtPgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgYnl0ZVNvdXJjZSA9IEJ5dGVTb3VyY2UucGVla2FibGUoQnl0ZVNvdXJjZS5vZihpbml0aWFsQnl0ZXMsIHZlcnNpb24pKTsKKyAgICAgICAgICAgICAgICBieXRlW10gZGVjb2RlZEJ5dGVzID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0VW5lc2NhcGVkQnl0ZXMoYnl0ZVNvdXJjZSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzKGluaXRpYWxCeXRlcywgZGVjb2RlZEJ5dGVzKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBpbml0aWFsQnl0ZXMgLT4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsb25nIGFkZHJlc3MgPSBNZW1vcnlVdGlsLmFsbG9jYXRlKGluaXRpYWxCeXRlcy5sZW5ndGgpOworICAgICAgICAgICAgICAgIHRyeQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTWVtb3J5VXRpbC5zZXRCeXRlcyhhZGRyZXNzLCBpbml0aWFsQnl0ZXMsIDAsIGluaXRpYWxCeXRlcy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIGJ5dGVTb3VyY2UgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uub2ZNZW1vcnkoYWRkcmVzcywgaW5pdGlhbEJ5dGVzLmxlbmd0aCwgdmVyc2lvbikpOworICAgICAgICAgICAgICAgICAgICBieXRlW10gZGVjb2RlZEJ5dGVzID0gQnl0ZVNvdXJjZUludmVyc2UuZ2V0VW5lc2NhcGVkQnl0ZXMoYnl0ZVNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRBcnJheUVxdWFscyhpbml0aWFsQnl0ZXMsIGRlY29kZWRCeXRlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsbHkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIE1lbW9yeVV0aWwuZnJlZShhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICApKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGJ5dGVbXSB0cmlja3kgOiBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgLy8gRVNDQVBFIC0gbGVhZGluZywgaW4gdGhlIG1pZGRsZSwgdHJhaWxpbmcKKyAgICAgICAgICAgIG5ldyBieXRlW117IDAsIDIsIDMsIDQsIDUgfSwgbmV3IGJ5dGVbXXsgMSwgMiwgMCwgNCwgNSB9LCBuZXcgYnl0ZVtdeyAxLCAyLCAzLCA0LCAwIH0sCisgICAgICAgICAgICAvLyBFTkRfT0ZfU1RSRUFNL0VTQ0FQRURfMF9ET05FIC0gbGVhZGluZywgaW4gdGhlIG1pZGRsZSwgdHJhaWxpbmcKKyAgICAgICAgICAgIG5ldyBieXRlW117IC0xLCAyLCAzLCA0LCA1IH0sIG5ldyBieXRlW117IDEsIDIsIC0xLCA0LCA1IH0sIG5ldyBieXRlW117IDEsIDIsIDMsIDQsIC0xIH0sCisgICAgICAgICAgICAvLyBFU0NBUEVEXzBfQ09OVCAtIGxlYWRpbmcsIGluIHRoZSBtaWRkbGUsIHRyYWlsaW5nCisgICAgICAgICAgICBuZXcgYnl0ZVtdeyAtMiwgMiwgMywgNCwgNSB9LCBuZXcgYnl0ZVtdeyAxLCAyLCAtMiwgNCwgNSB9LCBuZXcgYnl0ZVtdeyAxLCAyLCAzLCA0LCAtMiB9LAorICAgICAgICAgICAgLy8gRVNDQVBFICsgRVNDQVBFRF8wX0RPTkUgLSBsZWFkaW5nLCBpbiB0aGUgbWlkZGxlLCB0cmFpbGluZworICAgICAgICAgICAgbmV3IGJ5dGVbXXsgMCwgLTEsIDMsIDQsIDUgfSwgbmV3IGJ5dGVbXXsgMSwgMCwgLTEsIDQsIDUgfSwgbmV3IGJ5dGVbXXsgMSwgMiwgMywgMCwgLTEgfSwKKyAgICAgICAgICAgIC8vIEVTQ0FQRSArIEVTQ0FQRURfMF9DT05UICsgRVNDQVBFRF8wX0RPTkUgLSBsZWFkaW5nLCBpbiB0aGUgbWlkZGxlLCB0cmFpbGluZworICAgICAgICAgICAgbmV3IGJ5dGVbXXsgMCwgLTIsIC0xLCA0LCA1IH0sIG5ldyBieXRlW117IDEsIDAsIC0yLCAtMSwgNSB9LCBuZXcgYnl0ZVtdeyAxLCAyLCAwLCAtMiwgLTEgfSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnl0ZUFycmF5Q29uc3VtZXIuYWNjZXB0KHRyaWNreSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzEwMDBdOworICAgICAgICAgICAgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm5nLm5leHRCeXRlcyhieXRlcyk7CisgICAgICAgICAgICAgICAgYnl0ZUFycmF5Q29uc3VtZXIuYWNjZXB0KGJ5dGVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHN0cmluZ0xlbmd0aCA9IDEwOworICAgICAgICAgICAgU3RyaW5nIHJhbmRvbTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJhbmRvbSA9IG5ld1JhbmRvbUFscGhhbnVtZXJpYyhwcm5nLCBzdHJpbmdMZW5ndGgpOworICAgICAgICAgICAgICAgIGJ5dGVBcnJheUNvbnN1bWVyLmFjY2VwdChyYW5kb20uZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJ5dGVzKCkKKyAgICB7CisgICAgICAgIE1hcDxDbGFzczw/PiwgRnVuY3Rpb248T2JqZWN0LCBCeXRlU291cmNlPj4gZ2VuZXJhdG9yUGVyVHlwZSA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgTGlzdDxPYmplY3Q+IG9yaWdpbmFsVmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIFJhbmRvbSBwcm5nID0gbmV3IFJhbmRvbSgpOworCisgICAgICAgIGdlbmVyYXRvclBlclR5cGUucHV0KFN0cmluZy5jbGFzcywgcyAtPgorICAgICAgICB7CisgICAgICAgICAgICBTdHJpbmcgc3RyaW5nID0gKFN0cmluZykgczsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9mKHN0cmluZywgdmVyc2lvbik7CisgICAgICAgIH0pOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKQorICAgICAgICAgICAgb3JpZ2luYWxWYWx1ZXMuYWRkKG5ld1JhbmRvbUFscGhhbnVtZXJpYyhwcm5nLCAxMCkpOworCisgICAgICAgIGdlbmVyYXRvclBlclR5cGUucHV0KEludGVnZXIuY2xhc3MsIGkgLT4KKyAgICAgICAgeworICAgICAgICAgICAgSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIGk7CisgICAgICAgICAgICByZXR1cm4gQnl0ZVNvdXJjZS5vZihpbnRlZ2VyKTsKKyAgICAgICAgfSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpCisgICAgICAgICAgICBvcmlnaW5hbFZhbHVlcy5hZGQocHJuZy5uZXh0SW50KCkpOworCisgICAgICAgIGdlbmVyYXRvclBlclR5cGUucHV0KExvbmcuY2xhc3MsIGwgLT4KKyAgICAgICAgeworICAgICAgICAgICAgTG9uZyBsb29vbmcgPSAoTG9uZykgbDsKKyAgICAgICAgICAgIHJldHVybiBCeXRlU291cmNlLm9mKGxvb29uZyk7CisgICAgICAgIH0pOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKQorICAgICAgICAgICAgb3JpZ2luYWxWYWx1ZXMuYWRkKHBybmcubmV4dExvbmcoKSk7CisKKyAgICAgICAgZ2VuZXJhdG9yUGVyVHlwZS5wdXQoVVVJRC5jbGFzcywgdSAtPgorICAgICAgICB7CisgICAgICAgICAgICBVVUlEIHV1aWQgPSAoVVVJRCkgdTsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgdXVpZEJ1ZmZlciA9IFVVSURUeXBlLmluc3RhbmNlLmRlY29tcG9zZSh1dWlkKTsKKyAgICAgICAgICAgIHJldHVybiBVVUlEVHlwZS5pbnN0YW5jZS5hc0NvbXBhcmFibGVCeXRlcyh1dWlkQnVmZmVyLCB2ZXJzaW9uKTsKKyAgICAgICAgfSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpCisgICAgICAgICAgICBvcmlnaW5hbFZhbHVlcy5hZGQoVVVJRC5yYW5kb21VVUlEKCkpOworCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogb3JpZ2luYWxWYWx1ZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIENsYXNzPD8+IHR5cGUgPSB2YWx1ZS5nZXRDbGFzcygpOworICAgICAgICAgICAgRnVuY3Rpb248T2JqZWN0LCBCeXRlU291cmNlPiBnZW5lcmF0b3IgPSBnZW5lcmF0b3JQZXJUeXBlLmdldCh0eXBlKTsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2Ugb3JpZ2luYWxTb3VyY2UgPSBnZW5lcmF0b3IuYXBwbHkodmFsdWUpOworICAgICAgICAgICAgQnl0ZVNvdXJjZSBvcmlnaW5hbFNvdXJjZUNvcHkgPSBnZW5lcmF0b3IuYXBwbHkodmFsdWUpOworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gQnl0ZVNvdXJjZUludmVyc2UucmVhZEJ5dGVzKG9yaWdpbmFsU291cmNlKTsKKyAgICAgICAgICAgIC8vIFRoZSBiZXN0IHdheSB0byB0ZXN0IHRoZSByZWFkIGJ5dGVzIHNlZW1zIHRvIGJlIHRvIGFzc2VydCB0aGF0IGp1c3QgZGlyZWN0bHkgdXNpbmcgdGhlbSBhcyBhCisgICAgICAgICAgICAvLyBCeXRlU291cmNlICh1c2luZyBCeXRlU291cmNlLmZpeGVkTGVuZ3RoKGJ5dGVbXSkpIHRoZXkgY29tcGFyZSBhcyBlcXVhbCB0byBhbm90aGVyIEJ5dGVTb3VyY2Ugb2J0YWluZWQKKyAgICAgICAgICAgIC8vIGZyb20gdGhlIHNhbWUgb3JpZ2luYWwgdmFsdWUuCisgICAgICAgICAgICBpbnQgY29tcGFyZSA9IEJ5dGVDb21wYXJhYmxlLmNvbXBhcmUodiAtPiBvcmlnaW5hbFNvdXJjZUNvcHksIHYgLT4gQnl0ZVNvdXJjZS5maXhlZExlbmd0aChieXRlcyksIHZlcnNpb24pOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBjb21wYXJlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9CeXRlU291cmNlU2VxdWVuY2VUZXN0LmphdmEgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZVNvdXJjZVNlcXVlbmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMmJkMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZVNvdXJjZVNlcXVlbmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzg0IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZTsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVMaXN0OworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5CdWZmZXJDbHVzdGVyaW5nQm91bmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQnVmZmVyRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNhY2hlZEhhc2hEZWNvcmF0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ0NvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZ1ByZWZpeDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuTG9jYWxQYXJ0aXRpb25lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQnl0ZVNvdXJjZVNlcXVlbmNlVGVzdAoreworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFMUEhBQkVUID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoxMjM0NTY3ODkwIUAjJCVeJiooKSI7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAidmVyc2lvbj17MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Qnl0ZUNvbXBhcmFibGUuVmVyc2lvbj4gdmVyc2lvbnMoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZUxpc3Qub2YoQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5PU1M1MCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb247CisKKyAgICBwdWJsaWMgQnl0ZVNvdXJjZVNlcXVlbmNlVGVzdChCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE51bGxzU2VxdWVuY2UoKQorICAgIHsKKyAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLlRFUk1JTkFUT1IsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE51bGxzQW5kVW5rbm93bkxlbmd0aHNTZXF1ZW5jZSgpCisgICAgeworICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgbnVsbCwgQnl0ZVNvdXJjZS5vZigiYiIsIHZlcnNpb24pLCBCeXRlU291cmNlLm9mKCJjIiwgdmVyc2lvbikKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIEJ5dGVTb3VyY2VJbnZlcnNlOjpnZXRTdHJpbmcsICJiIik7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIEJ5dGVTb3VyY2VJbnZlcnNlOjpnZXRTdHJpbmcsICJjIik7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLlRFUk1JTkFUT1IsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworCisgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZigiYSIsIHZlcnNpb24pLCBudWxsLCBCeXRlU291cmNlLm9mKCJjIiwgdmVyc2lvbikKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIEJ5dGVTb3VyY2VJbnZlcnNlOjpnZXRTdHJpbmcsICJhIik7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIEJ5dGVTb3VyY2VJbnZlcnNlOjpnZXRTdHJpbmcsICJjIik7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLlRFUk1JTkFUT1IsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworCisgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZigiYSIsIHZlcnNpb24pLCBCeXRlU291cmNlLm9mKCJiIiwgdmVyc2lvbiksIG51bGwKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIEJ5dGVTb3VyY2VJbnZlcnNlOjpnZXRTdHJpbmcsICJhIik7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIEJ5dGVTb3VyY2VJbnZlcnNlOjpnZXRTdHJpbmcsICJiIik7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLlRFUk1JTkFUT1IsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworCisgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZigiYSIsIHZlcnNpb24pLCBudWxsLCBudWxsCisgICAgICAgICkpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBCeXRlU291cmNlSW52ZXJzZTo6Z2V0U3RyaW5nLCAiYSIpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIEJ5dGVTb3VyY2Uub2YoImMiLCB2ZXJzaW9uKQorICAgICAgICApKTsKKyAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudE51bGwoY29tcGFyYWJsZUJ5dGVzKTsKKyAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudE51bGwoY29tcGFyYWJsZUJ5dGVzKTsKKyAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgQnl0ZVNvdXJjZUludmVyc2U6OmdldFN0cmluZywgImMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuVEVSTUlOQVRPUiwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcykKKyAgICB7CisgICAgICAgIC8vIFdlIGV4cGVjdCBudWxsLXNpZ25pZnlpbmcgc2VwYXJhdG9yLCBmb2xsb3dlZCBieSBhIG51bGwgQnl0ZVNvdXJjZSBjb21wb25lbnQKKyAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBuZXh0ID0gQnl0ZVNvdXJjZUludmVyc2UubmV4dENvbXBvbmVudFNvdXJjZShjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBhc3NlcnROdWxsKG5leHQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiB2b2lkIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248Qnl0ZVNvdXJjZS5QZWVrYWJsZSwgVD4gZGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCBleHBlY3RlZCkKKyAgICB7CisgICAgICAgIC8vIFdlIGV4cGVjdCBhIHJlZ3VsYXIgc2VwYXJhdG9yLCBmb2xsb3dlZCBieSBhIEJ5dGVTb3VyY2UgY29tcG9uZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV4cGVjdGVkIHZhbHVlCisgICAgICAgIEJ5dGVTb3VyY2UuUGVla2FibGUgbmV4dCA9IEJ5dGVTb3VyY2VJbnZlcnNlLm5leHRDb21wb25lbnRTb3VyY2UoY29tcGFyYWJsZUJ5dGVzKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChuZXh0KTsKKyAgICAgICAgVCBkZWNvZGVkID0gZGVjb2Rlci5hcHBseShuZXh0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBkZWNvZGVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsc0FuZEtub3duTGVuZ3Roc1NlcXVlbmNlKCkKKyAgICB7CisgICAgICAgIGludCBpbnRWYWx1ZSA9IDQyOworICAgICAgICBCaWdJbnRlZ2VyIHZhcmludFZhbHVlID0gQmlnSW50ZWdlci52YWx1ZU9mKDIwMThMKTsKKyAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIG51bGwsIEJ5dGVTb3VyY2Uub2YoaW50VmFsdWUpLCB2YXJpbnRUb0J5dGVTb3VyY2UodmFyaW50VmFsdWUpCisgICAgICAgICkpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBCeXRlU291cmNlSW52ZXJzZTo6Z2V0U2lnbmVkSW50LCBpbnRWYWx1ZSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2Uub2YoaW50VmFsdWUpLCBudWxsLCB2YXJpbnRUb0J5dGVTb3VyY2UodmFyaW50VmFsdWUpCisgICAgICAgICkpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBCeXRlU291cmNlSW52ZXJzZTo6Z2V0U2lnbmVkSW50LCBpbnRWYWx1ZSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2Uub2YoaW50VmFsdWUpLCB2YXJpbnRUb0J5dGVTb3VyY2UodmFyaW50VmFsdWUpLCBudWxsCisgICAgICAgICkpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBCeXRlU291cmNlSW52ZXJzZTo6Z2V0U2lnbmVkSW50LCBpbnRWYWx1ZSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIHZhcmludFRvQnl0ZVNvdXJjZSh2YXJpbnRWYWx1ZSkKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIG51bGwsIHZhcmludFRvQnl0ZVNvdXJjZSh2YXJpbnRWYWx1ZSksIG51bGwKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIHZhcmludFRvQnl0ZVNvdXJjZSh2YXJpbnRWYWx1ZSksIG51bGwsIG51bGwKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBCb29sZWFuIGJvb2xWYWx1ZSA9IG5ldyBSYW5kb20oKS5uZXh0Qm9vbGVhbigpOworICAgICAgICBCeXRlU291cmNlIGJvb2xTb3VyY2UgPSBCb29sZWFuVHlwZS5pbnN0YW5jZS5hc0NvbXBhcmFibGVCeXRlcyhCb29sZWFuVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UoYm9vbFZhbHVlKSwgdmVyc2lvbik7CisgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgdmFyaW50VG9CeXRlU291cmNlKHZhcmludFZhbHVlKSwgYm9vbFNvdXJjZSwgbnVsbAorICAgICAgICApKTsKKyAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgVkFSSU5ULCB2YXJpbnRWYWx1ZSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIEJvb2xlYW5UeXBlLmluc3RhbmNlLCBib29sVmFsdWUpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICBib29sU291cmNlID0gQm9vbGVhblR5cGUuaW5zdGFuY2UuYXNDb21wYXJhYmxlQnl0ZXMoQm9vbGVhblR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKGJvb2xWYWx1ZSksIHZlcnNpb24pOworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIHZhcmludFRvQnl0ZVNvdXJjZSh2YXJpbnRWYWx1ZSksIG51bGwsIGJvb2xTb3VyY2UKKyAgICAgICAgKSk7CisgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBCb29sZWFuVHlwZS5pbnN0YW5jZSwgYm9vbFZhbHVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuVEVSTUlOQVRPUiwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW9uYWxTaWduZWRGaXhlZExlbmd0aFR5cGVzU2VxdWVuY2UoKQorICAgIHsKKyAgICAgICAgUmFuZG9tIHBybmcgPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIFN0cmluZyByYW5kb21TdHJpbmcgPSBuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTApOworICAgICAgICBieXRlIHJhbmRvbUJ5dGUgPSAoYnl0ZSkgcHJuZy5uZXh0SW50KCk7CisgICAgICAgIHNob3J0IHJhbmRvbVNob3J0ID0gKHNob3J0KSBwcm5nLm5leHRJbnQoKTsKKyAgICAgICAgaW50IHJhbmRvbUludCA9IHBybmcubmV4dEludCgpOworICAgICAgICBsb25nIHJhbmRvbUxvbmcgPSBwcm5nLm5leHRMb25nKCk7CisgICAgICAgIEJpZ0ludGVnZXIgcmFuZG9tVmFyaW50ID0gQmlnSW50ZWdlci5wcm9iYWJsZVByaW1lKDgwLCBwcm5nKTsKKworICAgICAgICBNYXA8QWJzdHJhY3RUeXBlPD8+LCBCeXRlQnVmZmVyPiB2YWx1ZXNCeVR5cGUgPSBuZXcgSGFzaE1hcDxBYnN0cmFjdFR5cGU8Pz4sIEJ5dGVCdWZmZXI+KCkKKyAgICAgICAge3sKKyAgICAgICAgICAgIHB1dChCeXRlVHlwZS5pbnN0YW5jZSwgQnl0ZVR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKHJhbmRvbUJ5dGUpKTsKKyAgICAgICAgICAgIHB1dChTaG9ydFR5cGUuaW5zdGFuY2UsIFNob3J0VHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UocmFuZG9tU2hvcnQpKTsKKyAgICAgICAgICAgIHB1dChTaW1wbGVEYXRlVHlwZS5pbnN0YW5jZSwgU2ltcGxlRGF0ZVR5cGUuaW5zdGFuY2UuZGVjb21wb3NlKHJhbmRvbUludCkpOworICAgICAgICAgICAgcHV0KFRpbWVUeXBlLmluc3RhbmNlLCBUaW1lVHlwZS5pbnN0YW5jZS5kZWNvbXBvc2UocmFuZG9tTG9uZykpOworICAgICAgICB9fTsKKworICAgICAgICBmb3IgKE1hcC5FbnRyeTxBYnN0cmFjdFR5cGU8Pz4sIEJ5dGVCdWZmZXI+IGVudHJ5IDogdmFsdWVzQnlUeXBlLmVudHJ5U2V0KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFic3RyYWN0VHlwZTw/PiB0eXBlID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgQnl0ZVNvdXJjZSBieXRlU291cmNlID0gdHlwZS5hc0NvbXBhcmFibGVCeXRlcyh2YWx1ZSwgdmVyc2lvbik7CisgICAgICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIHNlcXVlbmNlID0gQnl0ZVNvdXJjZS5wZWVrYWJsZShCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yKAorICAgICAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2Uub2YocmFuZG9tU3RyaW5nLCB2ZXJzaW9uKSwgYnl0ZVNvdXJjZSwgdmFyaW50VG9CeXRlU291cmNlKHJhbmRvbVZhcmludCkKKyAgICAgICAgICAgICkpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKHNlcXVlbmNlLCBCeXRlU291cmNlSW52ZXJzZTo6Z2V0U3RyaW5nLCByYW5kb21TdHJpbmcpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKHNlcXVlbmNlLCB0eXBlLCB2YWx1ZSk7CisgICAgICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoc2VxdWVuY2UsIFZBUklOVCwgcmFuZG9tVmFyaW50KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLlRFUk1JTkFUT1IsIHNlcXVlbmNlLm5leHQoKSk7CisKKyAgICAgICAgICAgIGJ5dGVTb3VyY2UgPSB0eXBlLmFzQ29tcGFyYWJsZUJ5dGVzKHR5cGUuZGVjb21wb3NlKG51bGwpLCB2ZXJzaW9uKTsKKyAgICAgICAgICAgIHNlcXVlbmNlID0gQnl0ZVNvdXJjZS5wZWVrYWJsZShCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yKAorICAgICAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2Uub2YocmFuZG9tU3RyaW5nLCB2ZXJzaW9uKSwgYnl0ZVNvdXJjZSwgdmFyaW50VG9CeXRlU291cmNlKHJhbmRvbVZhcmludCkKKyAgICAgICAgICAgICkpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKHNlcXVlbmNlLCBCeXRlU291cmNlSW52ZXJzZTo6Z2V0U3RyaW5nLCByYW5kb21TdHJpbmcpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudE51bGwoc2VxdWVuY2UpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKHNlcXVlbmNlLCBWQVJJTlQsIHJhbmRvbVZhcmludCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5URVJNSU5BVE9SLCBzZXF1ZW5jZS5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBCeXRlU291cmNlIHZhcmludFRvQnl0ZVNvdXJjZShCaWdJbnRlZ2VyIHZhbHVlKQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciB2YWx1ZUJ5dGVCdWZmZXIgPSBWQVJJTlQuZGVjb21wb3NlKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIFZBUklOVC5hc0NvbXBhcmFibGVCeXRlcyh2YWx1ZUJ5dGVCdWZmZXIsIHZlcnNpb24pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVURjhUeXBlIFVURjggPSBVVEY4VHlwZS5pbnN0YW5jZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNpbWFsVHlwZSBERUNJTUFMID0gRGVjaW1hbFR5cGUuaW5zdGFuY2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlclR5cGUgVkFSSU5UID0gSW50ZWdlclR5cGUuaW5zdGFuY2U7CisKKyAgICAvLyBBIHJlZ3VsYXIgY29tcGFyYXRvciB1c2luZyB0aGUgbmF0dXJhbCBvcmRlcmluZyBmb3IgYWxsIHR5cGVzLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIENPTVAgPSBuZXcgQ2x1c3RlcmluZ0NvbXBhcmF0b3IoQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgIFVURjgsCisgICAgICAgICAgICBERUNJTUFMLAorICAgICAgICAgICAgVkFSSU5UCisgICAgKSk7CisgICAgLy8gQSBjb21wYXJhdG9yIHRoYXQgcmV2ZXJzZXMgdGhlIG9yZGVyaW5nIGZvciB0aGUgZmlyc3QgdW5rbm93biBsZW5ndGggdHlwZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIENPTVBfUkVWRVJTRURfVU5LTk9XTl9MRU5HVEggPSBuZXcgQ2x1c3RlcmluZ0NvbXBhcmF0b3IoQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgIFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShVVEY4KSwKKyAgICAgICAgICAgIERFQ0lNQUwsCisgICAgICAgICAgICBWQVJJTlQKKyAgICApKTsKKyAgICAvLyBBIGNvbXBhcmF0b3IgdGhhdCByZXZlcnNlcyB0aGUgb3JkZXJpbmcgZm9yIHRoZSBzZWNvbmQgdW5rbm93biBsZW5ndGggdHlwZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIENPTVBfUkVWRVJTRURfVU5LTk9XTl9MRU5HVEhfMiA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgVVRGOCwKKyAgICAgICAgICAgIFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShERUNJTUFMKSwKKyAgICAgICAgICAgIFZBUklOVAorICAgICkpOworICAgIC8vIEEgY29tcGFyYXRvciB0aGF0IHJldmVyc2VzIHRoZSBvcmRlcmluZyBmb3IgdGhlIHNvbGUga25vd24vY29tcHV0YWJsZSBsZW5ndGggdHlwZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIENPTVBfUkVWRVJTRURfS05PV05fTEVOR1RIID0gbmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICBVVEY4LAorICAgICAgICAgICAgREVDSU1BTCwKKyAgICAgICAgICAgIFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShWQVJJTlQpCisgICAgKSk7CisgICAgLy8gQSBjb21wYXJhdG9yIHRoYXQgcmV2ZXJzZXMgdGhlIG9yZGVyaW5nIGZvciBhbGwgdHlwZXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbHVzdGVyaW5nQ29tcGFyYXRvciBDT01QX0FMTF9SRVZFUlNFRCA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKFVURjgpLAorICAgICAgICAgICAgUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKERFQ0lNQUwpLAorICAgICAgICAgICAgUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKFZBUklOVCkKKyAgICApKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsdXN0ZXJpbmdQcmVmaXhCb3VuZE5vcm1hbEFuZFJldmVyc2VkKCkKKyAgICB7CisgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9ICJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCI7CisgICAgICAgIEJpZ0RlY2ltYWwgZGVjaW1hbFZhbHVlID0gQmlnRGVjaW1hbC52YWx1ZU9mKDEyMzQ1Njc4OSwgMjApOworICAgICAgICBCaWdJbnRlZ2VyIHZhcmludFZhbHVlID0gQmlnSW50ZWdlci52YWx1ZU9mKDIwMThMKTsKKworICAgICAgICAvLyBDcmVhdGUgc29tZSBub24tbnVsbCBjbHVzdGVyaW5nIGtleSB2YWx1ZXMgdGhhdCB3aWxsIGJlIGVuY29kZWQgYW5kIGRlY29kZWQgdG8gYnl0ZS1vcmRlcmVkIHJlcHJlc2VudGF0aW9uCisgICAgICAgIC8vIHdpdGggZGlmZmVyZW50IHR5cGVzIG9mIGNsdXN0ZXJpbmcgY29tcGFyYXRvcnMgKGFuZCBpbiBvdGhlciB0ZXN0cyB3aXRoIGRpZmZlcmVudCB0eXBlcyBvZiBwcmVmaXhlcykuCisgICAgICAgIEJ5dGVCdWZmZXJbXSBjbHVzdGVyaW5nS2V5VmFsdWVzID0gbmV3IEJ5dGVCdWZmZXJbXSB7CisgICAgICAgICAgICAgICAgVVRGOC5kZWNvbXBvc2Uoc3RyaW5nVmFsdWUpLAorICAgICAgICAgICAgICAgIERFQ0lNQUwuZGVjb21wb3NlKGRlY2ltYWxWYWx1ZSksCisgICAgICAgICAgICAgICAgVkFSSU5ULmRlY29tcG9zZSh2YXJpbnRWYWx1ZSkKKyAgICAgICAgfTsKKworICAgICAgICBmb3IgKENsdXN0ZXJpbmdQcmVmaXguS2luZCBwcmVmaXhLaW5kIDogQ2x1c3RlcmluZ1ByZWZpeC5LaW5kLnZhbHVlcygpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocHJlZml4S2luZC5pc0JvdW5kYXJ5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIENsdXN0ZXJpbmdQcmVmaXggcHJlZml4ID0gQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLmNyZWF0ZShwcmVmaXhLaW5kLCBjbHVzdGVyaW5nS2V5VmFsdWVzKTsKKyAgICAgICAgICAgIC8vIFVzZSB0aGUgcmVndWxhciBjb21wYXJhdG9yLgorICAgICAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKENPTVAuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFVURjgsIHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIERFQ0lNQUwsIGRlY2ltYWxWYWx1ZSk7CisgICAgICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBWQVJJTlQsIHZhcmludFZhbHVlKTsKKworICAgICAgICAgICAgcHJlZml4ID0gQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLmNyZWF0ZShwcmVmaXhLaW5kLCBjbHVzdGVyaW5nS2V5VmFsdWVzKTsKKyAgICAgICAgICAgIC8vIFVzZSB0aGUgY29tcGFyYXRvciByZXZlcnNpbmcgdGhlIG9yZGVyaW5nIGZvciB0aGUgZmlyc3QgdW5rbm93biBsZW5ndGggdHlwZS4KKyAgICAgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQ09NUF9SRVZFUlNFRF9VTktOT1dOX0xFTkdUSC5hc0J5dGVDb21wYXJhYmxlKHByZWZpeCkuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKFVURjgpLCBzdHJpbmdWYWx1ZSk7CisgICAgICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBERUNJTUFMLCBkZWNpbWFsVmFsdWUpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgVkFSSU5ULCB2YXJpbnRWYWx1ZSk7CisKKyAgICAgICAgICAgIHByZWZpeCA9IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5jcmVhdGUocHJlZml4S2luZCwgY2x1c3RlcmluZ0tleVZhbHVlcyk7CisgICAgICAgICAgICAvLyBVc2UgdGhlIGNvbXBhcmF0b3IgcmV2ZXJzaW5nIHRoZSBvcmRlcmluZyBmb3IgdGhlIHNlY29uZCB1bmtub3duIGxlbmd0aCB0eXBlLgorICAgICAgICAgICAgY29tcGFyYWJsZUJ5dGVzID0gQnl0ZVNvdXJjZS5wZWVrYWJsZShDT01QX1JFVkVSU0VEX1VOS05PV05fTEVOR1RIXzIuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFVURjgsIHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShERUNJTUFMKSwgZGVjaW1hbFZhbHVlKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworCisgICAgICAgICAgICBwcmVmaXggPSBCdWZmZXJDbHVzdGVyaW5nQm91bmQuY3JlYXRlKHByZWZpeEtpbmQsIGNsdXN0ZXJpbmdLZXlWYWx1ZXMpOworICAgICAgICAgICAgLy8gVXNlIHRoZSBjb21wYXJhdG9yIHJldmVyc2luZyB0aGUgb3JkZXJpbmcgZm9yIHRoZSBrbm93bi9jb21wdXRhYmxlIGxlbmd0aCB0eXBlLgorICAgICAgICAgICAgY29tcGFyYWJsZUJ5dGVzID0gQnl0ZVNvdXJjZS5wZWVrYWJsZShDT01QX1JFVkVSU0VEX0tOT1dOX0xFTkdUSC5hc0J5dGVDb21wYXJhYmxlKHByZWZpeCkuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgVVRGOCwgc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgREVDSU1BTCwgZGVjaW1hbFZhbHVlKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShWQVJJTlQpLCB2YXJpbnRWYWx1ZSk7CisKKyAgICAgICAgICAgIHByZWZpeCA9IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5jcmVhdGUocHJlZml4S2luZCwgY2x1c3RlcmluZ0tleVZhbHVlcyk7CisgICAgICAgICAgICAvLyBVc2UgdGhlIGFsbC1yZXZlcnNpbmcgY29tcGFyYXRvci4KKyAgICAgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQ09NUF9BTExfUkVWRVJTRUQuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShVVEY4KSwgc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKERFQ0lNQUwpLCBkZWNpbWFsVmFsdWUpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgUmV2ZXJzZWRUeXBlLmdldEluc3RhbmNlKFZBUklOVCksIHZhcmludFZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsdXN0ZXJpbmdQcmVmaXhCb3VuZE51bGxzKCkKKyAgICB7CisgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9ICJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCI7CisgICAgICAgIEJpZ0RlY2ltYWwgZGVjaW1hbFZhbHVlID0gQmlnRGVjaW1hbC52YWx1ZU9mKDEyMzQ1Njc4OSwgMjApOworICAgICAgICBCaWdJbnRlZ2VyIHZhcmludFZhbHVlID0gQmlnSW50ZWdlci52YWx1ZU9mKDIwMThMKTsKKworICAgICAgICAvLyBDcmVhdGUgY2x1c3RlcmluZyBrZXkgdmFsdWVzIHdoZXJlIHRoZSBjb21wb25lbnQgZm9yIGFuIHVua25vd24gbGVuZ3RoIHR5cGUgaXMgbnVsbC4KKyAgICAgICAgQnl0ZUJ1ZmZlcltdIHVua25vd25MZW5ndGhOdWxsID0gbmV3IEJ5dGVCdWZmZXJbXSB7CisgICAgICAgICAgICAgICAgVVRGOC5kZWNvbXBvc2Uoc3RyaW5nVmFsdWUpLAorICAgICAgICAgICAgICAgIERFQ0lNQUwuZGVjb21wb3NlKG51bGwpLAorICAgICAgICAgICAgICAgIFZBUklOVC5kZWNvbXBvc2UodmFyaW50VmFsdWUpCisgICAgICAgIH07CisgICAgICAgIC8vIENyZWF0ZSBjbHVzdGVyaW5nIGtleSB2YWx1ZXMgd2hlcmUgdGhlIGNvbXBvbmVudCBmb3IgYSBrbm93bi9jb21wdXRhYmxlIGxlbmd0aCB0eXBlIGlzIG51bGwuCisgICAgICAgIEJ5dGVCdWZmZXJbXSBrbm93bkxlbmd0aE51bGwgPSBuZXcgQnl0ZUJ1ZmZlcltdIHsKKyAgICAgICAgICAgICAgICBVVEY4LmRlY29tcG9zZShzdHJpbmdWYWx1ZSksCisgICAgICAgICAgICAgICAgREVDSU1BTC5kZWNvbXBvc2UoZGVjaW1hbFZhbHVlKSwKKyAgICAgICAgICAgICAgICBWQVJJTlQuZGVjb21wb3NlKG51bGwpCisgICAgICAgIH07CisKKyAgICAgICAgZm9yIChDbHVzdGVyaW5nUHJlZml4LktpbmQgcHJlZml4S2luZCA6IENsdXN0ZXJpbmdQcmVmaXguS2luZC52YWx1ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHByZWZpeEtpbmQuaXNCb3VuZGFyeSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAvLyBUZXN0IHRoZSBkZWNvZGluZyBvZiBhIG51bGwgY29tcG9uZW50IG9mIGEgbm9uLXJldmVyc2VkIHVua25vd24gbGVuZ3RoIHR5cGUuCisgICAgICAgICAgICBDbHVzdGVyaW5nUHJlZml4IHByZWZpeCA9IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5jcmVhdGUocHJlZml4S2luZCwgdW5rbm93bkxlbmd0aE51bGwpOworICAgICAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKENPTVAuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFVURjgsIHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnROdWxsKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBWQVJJTlQsIHZhcmludFZhbHVlKTsKKyAgICAgICAgICAgIC8vIFRlc3QgdGhlIGRlY29kaW5nIG9mIGEgbnVsbCBjb21wb25lbnQgb2YgYSByZXZlcnNlZCB1bmtub3duIGxlbmd0aCB0eXBlLgorICAgICAgICAgICAgcHJlZml4ID0gQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLmNyZWF0ZShwcmVmaXhLaW5kLCB1bmtub3duTGVuZ3RoTnVsbCk7CisgICAgICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKENPTVBfUkVWRVJTRURfVU5LTk9XTl9MRU5HVEhfMi5hc0J5dGVDb21wYXJhYmxlKHByZWZpeCkuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKGNvbXBhcmFibGVCeXRlcywgVVRGOCwgc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudE51bGwoY29tcGFyYWJsZUJ5dGVzKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFZBUklOVCwgdmFyaW50VmFsdWUpOworCisgICAgICAgICAgICAvLyBUZXN0IHRoZSBkZWNvZGluZyBvZiBhIG51bGwgY29tcG9uZW50IG9mIGEgbm9uLXJldmVyc2VkIGtub3duL2NvbXB1dGFibGUgbGVuZ3RoIHR5cGUuCisgICAgICAgICAgICBwcmVmaXggPSBCdWZmZXJDbHVzdGVyaW5nQm91bmQuY3JlYXRlKHByZWZpeEtpbmQsIGtub3duTGVuZ3RoTnVsbCk7CisgICAgICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKENPTVAuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIFVURjgsIHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgIGV4cGVjdE5leHRDb21wb25lbnRWYWx1ZShjb21wYXJhYmxlQnl0ZXMsIERFQ0lNQUwsIGRlY2ltYWxWYWx1ZSk7CisgICAgICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50TnVsbChjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICAgICAgLy8gVGVzdCB0aGUgZGVjb2Rpbmcgb2YgYSBudWxsIGNvbXBvbmVudCBvZiBhIHJldmVyc2VkIGtub3duL2NvbXB1dGFibGUgbGVuZ3RoIHR5cGUuCisgICAgICAgICAgICBwcmVmaXggPSBCdWZmZXJDbHVzdGVyaW5nQm91bmQuY3JlYXRlKHByZWZpeEtpbmQsIGtub3duTGVuZ3RoTnVsbCk7CisgICAgICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKENPTVBfUkVWRVJTRURfS05PV05fTEVOR1RILmFzQnl0ZUNvbXBhcmFibGUocHJlZml4KS5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSk7CisgICAgICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBVVEY4LCBzdHJpbmdWYWx1ZSk7CisgICAgICAgICAgICBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoY29tcGFyYWJsZUJ5dGVzLCBERUNJTUFMLCBkZWNpbWFsVmFsdWUpOworICAgICAgICAgICAgZXhwZWN0TmV4dENvbXBvbmVudE51bGwoY29tcGFyYWJsZUJ5dGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgPFQ+IHZvaWQgZXhwZWN0TmV4dENvbXBvbmVudFZhbHVlKEJ5dGVTb3VyY2UuUGVla2FibGUgY29tcGFyYWJsZUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0VHlwZTxUPiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgZXhwZWN0ZWQpCisgICAgeworICAgICAgICAvLyBXZSBleHBlY3QgYSByZWd1bGFyIHNlcGFyYXRvciwgZm9sbG93ZWQgYnkgYSBCeXRlU291cmNlIGNvbXBvbmVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIG5leHQgPSBCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50U291cmNlKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIFQgZGVjb2RlZCA9IHR5cGUuY29tcG9zZSh0eXBlLmZyb21Db21wYXJhYmxlQnl0ZXMobmV4dCwgdmVyc2lvbikpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGRlY29kZWQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBlY3ROZXh0Q29tcG9uZW50VmFsdWUoQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFR5cGU8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgZXhwZWN0ZWQpCisgICAgeworICAgICAgICAvLyBXZSBleHBlY3QgYSByZWd1bGFyIHNlcGFyYXRvciwgZm9sbG93ZWQgYnkgYSBCeXRlU291cmNlIGNvbXBvbmVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIG5leHQgPSBCeXRlU291cmNlSW52ZXJzZS5uZXh0Q29tcG9uZW50U291cmNlKGNvbXBhcmFibGVCeXRlcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgdHlwZS5mcm9tQ29tcGFyYWJsZUJ5dGVzKG5leHQsIHZlcnNpb24pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb3VuZEZyb21QcmVmaXhUZXJtaW5hdG9yKCkKKyAgICB7CisgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9ICJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCI7CisgICAgICAgIEJpZ0RlY2ltYWwgZGVjaW1hbFZhbHVlID0gQmlnRGVjaW1hbC52YWx1ZU9mKDEyMzQ1Njc4OSwgMjApOworICAgICAgICBCaWdJbnRlZ2VyIHZhcmludFZhbHVlID0gQmlnSW50ZWdlci52YWx1ZU9mKDIwMThMKTsKKworICAgICAgICBCeXRlQnVmZmVyW10gY2x1c3RlcmluZ0tleVZhbHVlcyA9IG5ldyBCeXRlQnVmZmVyW10geworICAgICAgICAgICAgICAgIFVURjguZGVjb21wb3NlKHN0cmluZ1ZhbHVlKSwKKyAgICAgICAgICAgICAgICBERUNJTUFMLmRlY29tcG9zZShkZWNpbWFsVmFsdWUpLAorICAgICAgICAgICAgICAgIFZBUklOVC5kZWNvbXBvc2UodmFyaW50VmFsdWUpCisgICAgICAgIH07CisgICAgICAgIEJ5dGVCdWZmZXJbXSBudWxsVmFsdWVCZWZvcmVUZXJtaW5hdG9yID0gbmV3IEJ5dGVCdWZmZXJbXSB7CisgICAgICAgICAgICAgICAgVVRGOC5kZWNvbXBvc2Uoc3RyaW5nVmFsdWUpLAorICAgICAgICAgICAgICAgIERFQ0lNQUwuZGVjb21wb3NlKGRlY2ltYWxWYWx1ZSksCisgICAgICAgICAgICAgICAgVkFSSU5ULmRlY29tcG9zZShudWxsKQorICAgICAgICB9OworCisgICAgICAgIGZvciAoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIHByZWZpeEtpbmQgOiBDbHVzdGVyaW5nUHJlZml4LktpbmQudmFsdWVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE5PVEUgZGltaXRhci5kaW1pdHJvdiBJIGFzc3VtZSB0aGVyZSdzIGEgc2Vuc2libGUgZXhwbGFuYXRpb24gd2h5IGRvZXMgU1RBVElDX0NMVVNURVJJTkcgdXNlIGEgY3VzdG9tCisgICAgICAgICAgICAvLyB0ZXJtaW5hdG9yIHRoYXQncyBub3Qgb25lIG9mIHRoZSBjb21tb24gc2VwYXJhdG9yIHZhbHVlcywgYnV0IEkgaGF2ZW4ndCBzcGVudCBlbm91Z2ggdGltZSB0byBnZXQgaXQuCisgICAgICAgICAgICBpZiAocHJlZml4S2luZC5pc0JvdW5kYXJ5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIFRlc3QgdGhhdCB0aGUgcmVhZCB0ZXJtaW5hdG9yIHZhbHVlIGlzIGV4YWN0bHkgdGhlIGVuY29kZWQgdmFsdWUgb2YgdGhpcyBwcmVmaXgnIGJvdW5kLgorICAgICAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeCBwcmVmaXggPSBCdWZmZXJDbHVzdGVyaW5nQm91bmQuY3JlYXRlKHByZWZpeEtpbmQsIGNsdXN0ZXJpbmdLZXlWYWx1ZXMpOworICAgICAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKENPTVAuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2VJbnZlcnNlLmdldFN0cmluZyhjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgREVDSU1BTC5mcm9tQ29tcGFyYWJsZUJ5dGVzKGNvbXBhcmFibGVCeXRlcywgdmVyc2lvbik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgICAgICBWQVJJTlQuZnJvbUNvbXBhcmFibGVCeXRlcyhjb21wYXJhYmxlQnl0ZXMsIHZlcnNpb24pOworICAgICAgICAgICAgLy8gRXhwZWN0IHRoZSBsYXN0IHNlcGFyYXRvciAoaS5lLiB0aGUgdGVybWluYXRvcikgdG8gYmUgdGhlIG9uZSBzcGVjaWZpZWQgYnkgdGhlIHByZWZpeCBraW5kLgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHByZWZpeEtpbmQuYXNCeXRlQ29tcGFyYWJsZVZhbHVlKHZlcnNpb24pLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICAgICAgLy8gVGVzdCB0aGF0IHRoZSByZWFkIHRlcm1pbmF0b3IgdmFsdWUgaXMgZXhhY3RseSB0aGUgZW5jb2RlZCB2YWx1ZSBvZiB0aGlzIHByZWZpeCcgYm91bmQsIHdoZW4gdGhlCisgICAgICAgICAgICAvLyB0ZXJtaW5hdG9yIGlzIHByZWNlZGVkIGJ5IGEgbnVsbCB2YWx1ZS4KKyAgICAgICAgICAgIHByZWZpeCA9IEJ1ZmZlckNsdXN0ZXJpbmdCb3VuZC5jcmVhdGUocHJlZml4S2luZCwgbnVsbFZhbHVlQmVmb3JlVGVybWluYXRvcik7CisgICAgICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKENPTVAuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2VJbnZlcnNlLmdldFN0cmluZyhjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgREVDSU1BTC5mcm9tQ29tcGFyYWJsZUJ5dGVzKGNvbXBhcmFibGVCeXRlcywgdmVyc2lvbik7CisgICAgICAgICAgICAvLyBFeHBlY3QgbnVsbC1zaWduaWZ5aW5nIHNlcGFyYXRvciBoZXJlLgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlRfRU1QVFksIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgLy8gTm8gdmFyaW50IHRvIHJlYWQKKyAgICAgICAgICAgIC8vIEV4cGVjdCB0aGUgbGFzdCBzZXBhcmF0b3IgKGkuZS4gdGhlIHRlcm1pbmF0b3IpIHRvIGJlIHRoZSBvbmUgc3BlY2lmaWVkIGJ5IHRoZSBwcmVmaXgga2luZC4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmVmaXhLaW5kLmFzQnl0ZUNvbXBhcmFibGVWYWx1ZSh2ZXJzaW9uKSwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisKKyAgICAgICAgICAgIC8vIFRlc3QgdGhhdCB0aGUgcmVhZCB0ZXJtaW5hdG9yIHZhbHVlIGlzIGV4YWN0bHkgdGhlIGVuY29kZWQgdmFsdWUgb2YgdGhpcyBwcmVmaXgnIGJvdW5kLCB3aGVuIHRoZQorICAgICAgICAgICAgLy8gdGVybWluYXRvciBpcyBwcmVjZWRlZCBieSBhIHJldmVyc2VkIG51bGwgdmFsdWUuCisgICAgICAgICAgICBwcmVmaXggPSBCdWZmZXJDbHVzdGVyaW5nQm91bmQuY3JlYXRlKHByZWZpeEtpbmQsIG51bGxWYWx1ZUJlZm9yZVRlcm1pbmF0b3IpOworICAgICAgICAgICAgLy8gVGhhdCdzIHRoZSBjb21wYXJhdG9yIHRoYXQgd2lsbCByZXZlcnNlIHRoZSBvcmRlcmluZyBvZiB0aGUgdHlwZSBvZiB0aGUgbGFzdCB2YWx1ZSBpbiB0aGUgcHJlZml4ICh0aGUKKyAgICAgICAgICAgIC8vIG9uZSBiZWZvcmUgdGhlIHRlcm1pbmF0b3IpLiBJbiBvdGhlciB0ZXN0cyB3ZSdyZSBtb3JlIGludGVyZXN0ZWQgaW4gdGhlIGZhY3QgdGhhdCB2YWx1ZXMgb2YgdGhpcyB0eXBlCisgICAgICAgICAgICAvLyBoYXZlIGtub3duL2NvbXB1dGFibGUgbGVuZ3RoLCB3aGljaCBpcyB3aHkgd2UndmUgbmFtZWQgaXQgc28uLi4KKyAgICAgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoQ09NUF9SRVZFUlNFRF9LTk9XTl9MRU5HVEguYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKyAgICAgICAgICAgIEJ5dGVTb3VyY2VJbnZlcnNlLmdldFN0cmluZyhjb21wYXJhYmxlQnl0ZXMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgREVDSU1BTC5mcm9tQ29tcGFyYWJsZUJ5dGVzKGNvbXBhcmFibGVCeXRlcywgdmVyc2lvbik7CisgICAgICAgICAgICAvLyBFeHBlY3QgcmV2ZXJzZWQgbnVsbC1zaWduaWZ5aW5nIHNlcGFyYXRvciBoZXJlLgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlRfRU1QVFlfUkVWRVJTRUQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgLy8gTm8gdmFyaW50IHRvIHJlYWQKKyAgICAgICAgICAgIC8vIEV4cGVjdCB0aGUgbGFzdCBzZXBhcmF0b3IgKGkuZS4gdGhlIHRlcm1pbmF0b3IpIHRvIGJlIHRoZSBvbmUgc3BlY2lmaWVkIGJ5IHRoZSBwcmVmaXgga2luZC4KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmVmaXhLaW5kLmFzQnl0ZUNvbXBhcmFibGVWYWx1ZSh2ZXJzaW9uKSwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlZFR5cGVzSW5DbHVzdGVyaW5nS2V5KCkKKyAgICB7CisgICAgICAgIFN0cmluZyBzdHJpbmdWYWx1ZSA9ICJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCI7CisgICAgICAgIEJpZ0RlY2ltYWwgZGVjaW1hbFZhbHVlID0gQmlnRGVjaW1hbC52YWx1ZU9mKDEyMzQ1Njc4OSwgMjApOworCisgICAgICAgIEFic3RyYWN0VHlwZTxTdHJpbmc+IHJldmVyc2VkU3RyaW5nVHlwZSA9IFJldmVyc2VkVHlwZS5nZXRJbnN0YW5jZShVVEY4KTsKKyAgICAgICAgQWJzdHJhY3RUeXBlPEJpZ0RlY2ltYWw+IHJldmVyc2VkRGVjaW1hbFR5cGUgPSBSZXZlcnNlZFR5cGUuZ2V0SW5zdGFuY2UoREVDSU1BTCk7CisKKyAgICAgICAgZmluYWwgQ2x1c3RlcmluZ0NvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDbHVzdGVyaW5nQ29tcGFyYXRvcihBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIC8vIHVua25vd24gbGVuZ3RoIHR5cGUKKyAgICAgICAgICAgICAgICBVVEY4LAorICAgICAgICAgICAgICAgIC8vIGtub3duIGxlbmd0aCB0eXBlCisgICAgICAgICAgICAgICAgREVDSU1BTCwKKyAgICAgICAgICAgICAgICAvLyByZXZlcnNlZCB1bmtub3duIGxlbmd0aCB0eXBlCisgICAgICAgICAgICAgICAgcmV2ZXJzZWRTdHJpbmdUeXBlLAorICAgICAgICAgICAgICAgIC8vIHJldmVyc2VkIGtub3duIGxlbmd0aCB0eXBlCisgICAgICAgICAgICAgICAgcmV2ZXJzZWREZWNpbWFsVHlwZQorICAgICAgICApKTsKKyAgICAgICAgQnl0ZUJ1ZmZlcltdIGNsdXN0ZXJpbmdLZXlWYWx1ZXMgPSBuZXcgQnl0ZUJ1ZmZlcltdIHsKKyAgICAgICAgICAgICAgICBVVEY4LmRlY29tcG9zZShzdHJpbmdWYWx1ZSksCisgICAgICAgICAgICAgICAgREVDSU1BTC5kZWNvbXBvc2UoZGVjaW1hbFZhbHVlKSwKKyAgICAgICAgICAgICAgICBVVEY4LmRlY29tcG9zZShzdHJpbmdWYWx1ZSksCisgICAgICAgICAgICAgICAgREVDSU1BTC5kZWNvbXBvc2UoZGVjaW1hbFZhbHVlKQorICAgICAgICB9OworCisgICAgICAgIGZpbmFsIENsdXN0ZXJpbmdDb21wYXJhdG9yIGNvbXBhcmF0b3IyID0gbmV3IENsdXN0ZXJpbmdDb21wYXJhdG9yKEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgLy8ga25vd24gbGVuZ3RoIHR5cGUKKyAgICAgICAgICAgICAgICBERUNJTUFMLAorICAgICAgICAgICAgICAgIC8vIHVua25vd24gbGVuZ3RoIHR5cGUKKyAgICAgICAgICAgICAgICBVVEY4LAorICAgICAgICAgICAgICAgIC8vIHJldmVyc2VkIGtub3duIGxlbmd0aCB0eXBlCisgICAgICAgICAgICAgICAgcmV2ZXJzZWREZWNpbWFsVHlwZSwKKyAgICAgICAgICAgICAgICAvLyByZXZlcnNlZCB1bmtub3duIGxlbmd0aCB0eXBlCisgICAgICAgICAgICAgICAgcmV2ZXJzZWRTdHJpbmdUeXBlCisgICAgICAgICkpOworICAgICAgICBCeXRlQnVmZmVyW10gY2x1c3RlcmluZ0tleVZhbHVlczIgPSBuZXcgQnl0ZUJ1ZmZlcltdIHsKKyAgICAgICAgICAgICAgICBERUNJTUFMLmRlY29tcG9zZShkZWNpbWFsVmFsdWUpLAorICAgICAgICAgICAgICAgIFVURjguZGVjb21wb3NlKHN0cmluZ1ZhbHVlKSwKKyAgICAgICAgICAgICAgICBERUNJTUFMLmRlY29tcG9zZShkZWNpbWFsVmFsdWUpLAorICAgICAgICAgICAgICAgIFVURjguZGVjb21wb3NlKHN0cmluZ1ZhbHVlKQorICAgICAgICB9OworCisgICAgICAgIGZvciAoQ2x1c3RlcmluZ1ByZWZpeC5LaW5kIHByZWZpeEtpbmQgOiBDbHVzdGVyaW5nUHJlZml4LktpbmQudmFsdWVzKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwcmVmaXhLaW5kLmlzQm91bmRhcnkoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeCBwcmVmaXggPSBCdWZmZXJDbHVzdGVyaW5nQm91bmQuY3JlYXRlKHByZWZpeEtpbmQsIGNsdXN0ZXJpbmdLZXlWYWx1ZXMpOworICAgICAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKGNvbXBhcmF0b3IuYXNCeXRlQ29tcGFyYWJsZShwcmVmaXgpLmFzQ29tcGFyYWJsZUJ5dGVzKHZlcnNpb24pKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbXBvbmVudFZhbHVlKFVURjgsIGNvbXBhcmFibGVCeXRlcyksIHN0cmluZ1ZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShERUNJTUFMLCBjb21wYXJhYmxlQnl0ZXMpLCBkZWNpbWFsVmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbXBvbmVudFZhbHVlKHJldmVyc2VkU3RyaW5nVHlwZSwgY29tcGFyYWJsZUJ5dGVzKSwgc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbXBvbmVudFZhbHVlKHJldmVyc2VkRGVjaW1hbFR5cGUsIGNvbXBhcmFibGVCeXRlcyksIGRlY2ltYWxWYWx1ZSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwcmVmaXhLaW5kLmFzQnl0ZUNvbXBhcmFibGVWYWx1ZSh2ZXJzaW9uKSwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNLCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKworICAgICAgICAgICAgQ2x1c3RlcmluZ1ByZWZpeCBwcmVmaXgyID0gQnVmZmVyQ2x1c3RlcmluZ0JvdW5kLmNyZWF0ZShwcmVmaXhLaW5kLCBjbHVzdGVyaW5nS2V5VmFsdWVzMik7CisgICAgICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlczIgPSBCeXRlU291cmNlLnBlZWthYmxlKGNvbXBhcmF0b3IyLmFzQnl0ZUNvbXBhcmFibGUocHJlZml4MikuYXNDb21wYXJhYmxlQnl0ZXModmVyc2lvbikpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzMi5uZXh0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbXBvbmVudFZhbHVlKERFQ0lNQUwsIGNvbXBhcmFibGVCeXRlczIpLCBkZWNpbWFsVmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlczIubmV4dCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShVVEY4LCBjb21wYXJhYmxlQnl0ZXMyKSwgc3RyaW5nVmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlczIubmV4dCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShyZXZlcnNlZERlY2ltYWxUeXBlLCBjb21wYXJhYmxlQnl0ZXMyKSwgZGVjaW1hbFZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMyLm5leHQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29tcG9uZW50VmFsdWUocmV2ZXJzZWRTdHJpbmdUeXBlLCBjb21wYXJhYmxlQnl0ZXMyKSwgc3RyaW5nVmFsdWUpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocHJlZml4S2luZC5hc0J5dGVDb21wYXJhYmxlVmFsdWUodmVyc2lvbiksIGNvbXBhcmFibGVCeXRlczIubmV4dCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLkVORF9PRl9TVFJFQU0sIGNvbXBhcmFibGVCeXRlczIubmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBBYnN0cmFjdFR5cGU8RT4sIEU+IEUgZ2V0Q29tcG9uZW50VmFsdWUoVCB0eXBlLCBCeXRlU291cmNlLlBlZWthYmxlIGNvbXBhcmFibGVCeXRlcykKKyAgICB7CisgICAgICAgIHJldHVybiB0eXBlLmNvbXBvc2UodHlwZS5mcm9tQ29tcGFyYWJsZUJ5dGVzKGNvbXBhcmFibGVCeXRlcywgdmVyc2lvbikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRpbmdOZXN0ZWRTZXF1ZW5jZV9TaW1wbGUoKQorICAgIHsKKyAgICAgICAgU3RyaW5nIHBhZGRpbmcxID0gIkEgc3RyaW5nIjsKKyAgICAgICAgU3RyaW5nIHBhZGRpbmcyID0gIkFub3RoZXIgc3RyaW5nIjsKKworICAgICAgICBCaWdJbnRlZ2VyIHZhcmludDEgPSBCaWdJbnRlZ2VyLnZhbHVlT2YoMGIxMDAwMDAwMCk7CisgICAgICAgIEJpZ0ludGVnZXIgdmFyaW50MiA9IEJpZ0ludGVnZXIudmFsdWVPZigxID4+IDMwKTsKKyAgICAgICAgQmlnSW50ZWdlciB2YXJpbnQzID0gQmlnSW50ZWdlci52YWx1ZU9mKDB4MTAwMDAwMDBMKTsKKyAgICAgICAgQmlnSW50ZWdlciB2YXJpbnQ0ID0gQmlnSW50ZWdlci52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKTsKKworICAgICAgICBTdHJpbmcgc3RyaW5nMSA9ICJUZXN0aW5nIGJ5dGUgc291cmNlcyI7CisgICAgICAgIFN0cmluZyBzdHJpbmcyID0gImlzIG5laXRoZXIgZWFzeSBub3IgZnVuOyI7CisgICAgICAgIFN0cmluZyBzdHJpbmczID0gIkJ1dCBkbyBpdCB3ZSBtdXN0LiI7CisgICAgICAgIFN0cmluZyBzdHJpbmc0ID0gIuKAlCBEYXRhU3RheCwgMjAxOCI7CisKKyAgICAgICAgTWFwVHlwZTxCaWdJbnRlZ2VyLCBTdHJpbmc+IHZhcmludFN0cmluZ01hcFR5cGUgPSBNYXBUeXBlLmdldEluc3RhbmNlKFZBUklOVCwgVVRGOCwgZmFsc2UpOworICAgICAgICBNYXA8QmlnSW50ZWdlciwgU3RyaW5nPiB2YXJpbnRTdHJpbmdNYXAgPSBuZXcgVHJlZU1hcDw+KCk7CisgICAgICAgIHZhcmludFN0cmluZ01hcC5wdXQodmFyaW50MSwgc3RyaW5nMSk7CisgICAgICAgIHZhcmludFN0cmluZ01hcC5wdXQodmFyaW50Miwgc3RyaW5nMik7CisgICAgICAgIHZhcmludFN0cmluZ01hcC5wdXQodmFyaW50Mywgc3RyaW5nMyk7CisgICAgICAgIHZhcmludFN0cmluZ01hcC5wdXQodmFyaW50NCwgc3RyaW5nNCk7CisKKyAgICAgICAgQnl0ZVNvdXJjZSBzZXF1ZW5jZSA9IEJ5dGVTb3VyY2Uud2l0aFRlcm1pbmF0b3IoCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5URVJNSU5BVE9SLAorICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2Uub2YocGFkZGluZzEsIHZlcnNpb24pLAorICAgICAgICAgICAgICAgIHZhcmludFN0cmluZ01hcFR5cGUuYXNDb21wYXJhYmxlQnl0ZXModmFyaW50U3RyaW5nTWFwVHlwZS5kZWNvbXBvc2UodmFyaW50U3RyaW5nTWFwKSwgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZihwYWRkaW5nMiwgdmVyc2lvbikKKyAgICAgICAgKTsKKyAgICAgICAgQnl0ZVNvdXJjZS5QZWVrYWJsZSBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKHNlcXVlbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29tcG9uZW50VmFsdWUoVVRGOCwgY29tcGFyYWJsZUJ5dGVzKSwgcGFkZGluZzEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZSh2YXJpbnRTdHJpbmdNYXBUeXBlLCBjb21wYXJhYmxlQnl0ZXMpLCB2YXJpbnRTdHJpbmdNYXApOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShVVEY4LCBjb21wYXJhYmxlQnl0ZXMpLCBwYWRkaW5nMik7CisgICAgICAgIHNlcXVlbmNlID0gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgdmFyaW50U3RyaW5nTWFwVHlwZS5hc0NvbXBhcmFibGVCeXRlcyh2YXJpbnRTdHJpbmdNYXBUeXBlLmRlY29tcG9zZSh2YXJpbnRTdHJpbmdNYXApLCB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLm9mKHBhZGRpbmcxLCB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLm9mKHBhZGRpbmcyLCB2ZXJzaW9uKQorICAgICAgICApOworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKHNlcXVlbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29tcG9uZW50VmFsdWUodmFyaW50U3RyaW5nTWFwVHlwZSwgY29tcGFyYWJsZUJ5dGVzKSwgdmFyaW50U3RyaW5nTWFwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29tcG9uZW50VmFsdWUoVVRGOCwgY29tcGFyYWJsZUJ5dGVzKSwgcGFkZGluZzEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShVVEY4LCBjb21wYXJhYmxlQnl0ZXMpLCBwYWRkaW5nMik7CisgICAgICAgIHNlcXVlbmNlID0gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZihwYWRkaW5nMSwgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZihwYWRkaW5nMiwgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgdmFyaW50U3RyaW5nTWFwVHlwZS5hc0NvbXBhcmFibGVCeXRlcyh2YXJpbnRTdHJpbmdNYXBUeXBlLmRlY29tcG9zZSh2YXJpbnRTdHJpbmdNYXApLCB2ZXJzaW9uKQorICAgICAgICApOworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKHNlcXVlbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29tcG9uZW50VmFsdWUoVVRGOCwgY29tcGFyYWJsZUJ5dGVzKSwgcGFkZGluZzEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShVVEY4LCBjb21wYXJhYmxlQnl0ZXMpLCBwYWRkaW5nMik7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbXBvbmVudFZhbHVlKHZhcmludFN0cmluZ01hcFR5cGUsIGNvbXBhcmFibGVCeXRlcyksIHZhcmludFN0cmluZ01hcCk7CisKKyAgICAgICAgTWFwVHlwZTxTdHJpbmcsIEJpZ0ludGVnZXI+IHN0cmluZ1ZhcmludE1hcFR5cGUgPSBNYXBUeXBlLmdldEluc3RhbmNlKFVURjgsIFZBUklOVCwgZmFsc2UpOworICAgICAgICBNYXA8U3RyaW5nLCBCaWdJbnRlZ2VyPiBzdHJpbmdWYXJpbnRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHN0cmluZ1ZhcmludE1hcC5wdXQoc3RyaW5nMSwgdmFyaW50MSk7CisgICAgICAgIHN0cmluZ1ZhcmludE1hcC5wdXQoc3RyaW5nMiwgdmFyaW50Mik7CisgICAgICAgIHN0cmluZ1ZhcmludE1hcC5wdXQoc3RyaW5nMywgdmFyaW50Myk7CisgICAgICAgIHN0cmluZ1ZhcmludE1hcC5wdXQoc3RyaW5nNCwgdmFyaW50NCk7CisKKyAgICAgICAgc2VxdWVuY2UgPSBCeXRlU291cmNlLndpdGhUZXJtaW5hdG9yKAorICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2UuVEVSTUlOQVRPUiwKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLm9mKHBhZGRpbmcxLCB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICBzdHJpbmdWYXJpbnRNYXBUeXBlLmFzQ29tcGFyYWJsZUJ5dGVzKHN0cmluZ1ZhcmludE1hcFR5cGUuZGVjb21wb3NlKHN0cmluZ1ZhcmludE1hcCksIHZlcnNpb24pLAorICAgICAgICAgICAgICAgIEJ5dGVTb3VyY2Uub2YocGFkZGluZzIsIHZlcnNpb24pCisgICAgICAgICk7CisgICAgICAgIGNvbXBhcmFibGVCeXRlcyA9IEJ5dGVTb3VyY2UucGVla2FibGUoc2VxdWVuY2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShVVEY4LCBjb21wYXJhYmxlQnl0ZXMpLCBwYWRkaW5nMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbXBvbmVudFZhbHVlKHN0cmluZ1ZhcmludE1hcFR5cGUsIGNvbXBhcmFibGVCeXRlcyksIHN0cmluZ1ZhcmludE1hcCk7CisgICAgICAgIGFzc2VydEVxdWFscyhCeXRlU291cmNlLk5FWFRfQ09NUE9ORU5ULCBjb21wYXJhYmxlQnl0ZXMubmV4dCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldENvbXBvbmVudFZhbHVlKFVURjgsIGNvbXBhcmFibGVCeXRlcyksIHBhZGRpbmcyKTsKKworICAgICAgICBNYXBUeXBlPFN0cmluZywgU3RyaW5nPiBzdHJpbmdTdHJpbmdNYXBUeXBlID0gTWFwVHlwZS5nZXRJbnN0YW5jZShVVEY4LCBVVEY4LCBmYWxzZSk7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyaW5nU3RyaW5nTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBzdHJpbmdTdHJpbmdNYXAucHV0KHN0cmluZzEsIHN0cmluZzQpOworICAgICAgICBzdHJpbmdTdHJpbmdNYXAucHV0KHN0cmluZzIsIHN0cmluZzMpOworICAgICAgICBzdHJpbmdTdHJpbmdNYXAucHV0KHN0cmluZzMsIHN0cmluZzIpOworICAgICAgICBzdHJpbmdTdHJpbmdNYXAucHV0KHN0cmluZzQsIHN0cmluZzEpOworCisgICAgICAgIHNlcXVlbmNlID0gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZihwYWRkaW5nMSwgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgc3RyaW5nU3RyaW5nTWFwVHlwZS5hc0NvbXBhcmFibGVCeXRlcyhzdHJpbmdTdHJpbmdNYXBUeXBlLmRlY29tcG9zZShzdHJpbmdTdHJpbmdNYXApLCB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLm9mKHBhZGRpbmcyLCB2ZXJzaW9uKQorICAgICAgICApOworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKHNlcXVlbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29tcG9uZW50VmFsdWUoVVRGOCwgY29tcGFyYWJsZUJ5dGVzKSwgcGFkZGluZzEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShzdHJpbmdTdHJpbmdNYXBUeXBlLCBjb21wYXJhYmxlQnl0ZXMpLCBzdHJpbmdTdHJpbmdNYXApOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShVVEY4LCBjb21wYXJhYmxlQnl0ZXMpLCBwYWRkaW5nMik7CisKKyAgICAgICAgTWFwVHlwZTxCaWdJbnRlZ2VyLCBCaWdJbnRlZ2VyPiB2YXJpbnRWYXJpbnRNYXBUeXBlID0gTWFwVHlwZS5nZXRJbnN0YW5jZShWQVJJTlQsIFZBUklOVCwgZmFsc2UpOworICAgICAgICBNYXA8QmlnSW50ZWdlciwgQmlnSW50ZWdlcj4gdmFyaW50VmFyaW50TWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICB2YXJpbnRWYXJpbnRNYXAucHV0KHZhcmludDEsIHZhcmludDQpOworICAgICAgICB2YXJpbnRWYXJpbnRNYXAucHV0KHZhcmludDIsIHZhcmludDMpOworICAgICAgICB2YXJpbnRWYXJpbnRNYXAucHV0KHZhcmludDMsIHZhcmludDIpOworICAgICAgICB2YXJpbnRWYXJpbnRNYXAucHV0KHZhcmludDQsIHZhcmludDEpOworCisgICAgICAgIHNlcXVlbmNlID0gQnl0ZVNvdXJjZS53aXRoVGVybWluYXRvcigKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLlRFUk1JTkFUT1IsCisgICAgICAgICAgICAgICAgQnl0ZVNvdXJjZS5vZihwYWRkaW5nMSwgdmVyc2lvbiksCisgICAgICAgICAgICAgICAgdmFyaW50VmFyaW50TWFwVHlwZS5hc0NvbXBhcmFibGVCeXRlcyh2YXJpbnRWYXJpbnRNYXBUeXBlLmRlY29tcG9zZSh2YXJpbnRWYXJpbnRNYXApLCB2ZXJzaW9uKSwKKyAgICAgICAgICAgICAgICBCeXRlU291cmNlLm9mKHBhZGRpbmcyLCB2ZXJzaW9uKQorICAgICAgICApOworICAgICAgICBjb21wYXJhYmxlQnl0ZXMgPSBCeXRlU291cmNlLnBlZWthYmxlKHNlcXVlbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJ5dGVTb3VyY2UuTkVYVF9DT01QT05FTlQsIGNvbXBhcmFibGVCeXRlcy5uZXh0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0Q29tcG9uZW50VmFsdWUoVVRGOCwgY29tcGFyYWJsZUJ5dGVzKSwgcGFkZGluZzEpOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZSh2YXJpbnRWYXJpbnRNYXBUeXBlLCBjb21wYXJhYmxlQnl0ZXMpLCB2YXJpbnRWYXJpbnRNYXApOworICAgICAgICBhc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5ORVhUX0NPTVBPTkVOVCwgY29tcGFyYWJsZUJ5dGVzLm5leHQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRDb21wb25lbnRWYWx1ZShVVEY4LCBjb21wYXJhYmxlQnl0ZXMpLCBwYWRkaW5nMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGluZ05lc3RlZFNlcXVlbmNlX0RlY29yYXRlZEtleSgpCisgICAgeworICAgICAgICBSYW5kb20gcHJuZyA9IG5ldyBSYW5kb20oKTsKKworICAgICAgICBNYXBUeXBlPFN0cmluZywgQmlnRGVjaW1hbD4gc3RyaW5nRGVjaW1hbE1hcFR5cGUgPSBNYXBUeXBlLmdldEluc3RhbmNlKFVURjgsIERFQ0lNQUwsIGZhbHNlKTsKKyAgICAgICAgTWFwPFN0cmluZywgQmlnRGVjaW1hbD4gc3RyaW5nRGVjaW1hbE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICBzdHJpbmdEZWNpbWFsTWFwLnB1dChuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTApLCBCaWdEZWNpbWFsLnZhbHVlT2YocHJuZy5uZXh0RG91YmxlKCkpKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBrZXkgPSBzdHJpbmdEZWNpbWFsTWFwVHlwZS5kZWNvbXBvc2Uoc3RyaW5nRGVjaW1hbE1hcCk7CisgICAgICAgIHRlc3REZWNvZGluZ0tleVdpdGhMb2NhbFBhcnRpdGlvbmVyRm9yVHlwZShrZXksIHN0cmluZ0RlY2ltYWxNYXBUeXBlKTsKKworICAgICAgICBNYXBUeXBlPEJpZ0RlY2ltYWwsIFN0cmluZz4gZGVjaW1hbFN0cmluZ01hcFR5cGUgPSBNYXBUeXBlLmdldEluc3RhbmNlKERFQ0lNQUwsIFVURjgsIGZhbHNlKTsKKyAgICAgICAgTWFwPEJpZ0RlY2ltYWwsIFN0cmluZz4gZGVjaW1hbFN0cmluZ01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICBkZWNpbWFsU3RyaW5nTWFwLnB1dChCaWdEZWNpbWFsLnZhbHVlT2YocHJuZy5uZXh0RG91YmxlKCkpLCBuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTApKTsKKyAgICAgICAga2V5ID0gZGVjaW1hbFN0cmluZ01hcFR5cGUuZGVjb21wb3NlKGRlY2ltYWxTdHJpbmdNYXApOworICAgICAgICB0ZXN0RGVjb2RpbmdLZXlXaXRoTG9jYWxQYXJ0aXRpb25lckZvclR5cGUoa2V5LCBkZWNpbWFsU3RyaW5nTWFwVHlwZSk7CisKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gQnl0ZUNvbXBhcmFibGUuVmVyc2lvbi5MRUdBQ1kpCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbXBvc2l0ZVR5cGUgc3RyaW5nRGVjaW1hbENvbXBUeXBlID0gQ29tcG9zaXRlVHlwZS5nZXRJbnN0YW5jZShVVEY4LCBERUNJTUFMKTsKKyAgICAgICAgICAgIGtleSA9IHN0cmluZ0RlY2ltYWxDb21wVHlwZS5kZWNvbXBvc2UobmV3UmFuZG9tQWxwaGFudW1lcmljKHBybmcsIDEwKSwgQmlnRGVjaW1hbC52YWx1ZU9mKHBybmcubmV4dERvdWJsZSgpKSk7CisgICAgICAgICAgICB0ZXN0RGVjb2RpbmdLZXlXaXRoTG9jYWxQYXJ0aXRpb25lckZvclR5cGUoa2V5LCBzdHJpbmdEZWNpbWFsQ29tcFR5cGUpOworCisgICAgICAgICAgICBDb21wb3NpdGVUeXBlIGRlY2ltYWxTdHJpbmdDb21wVHlwZSA9IENvbXBvc2l0ZVR5cGUuZ2V0SW5zdGFuY2UoREVDSU1BTCwgVVRGOCk7CisgICAgICAgICAgICBrZXkgPSBkZWNpbWFsU3RyaW5nQ29tcFR5cGUuZGVjb21wb3NlKEJpZ0RlY2ltYWwudmFsdWVPZihwcm5nLm5leHREb3VibGUoKSksIG5ld1JhbmRvbUFscGhhbnVtZXJpYyhwcm5nLCAxMCkpOworICAgICAgICAgICAgdGVzdERlY29kaW5nS2V5V2l0aExvY2FsUGFydGl0aW9uZXJGb3JUeXBlKGtleSwgZGVjaW1hbFN0cmluZ0NvbXBUeXBlKTsKKworICAgICAgICAgICAgRHluYW1pY0NvbXBvc2l0ZVR5cGUgZHluYW1pY0NvbXBUeXBlID0gRHluYW1pY0NvbXBvc2l0ZVR5cGUuZ2V0SW5zdGFuY2UoRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmFsaWFzZXMpOworICAgICAgICAgICAga2V5ID0gRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoCisgICAgICAgICAgICAgICAgICAgIG5ld1JhbmRvbUFscGhhbnVtZXJpYyhwcm5nLCAxMCksIFRpbWVVVUlELkdlbmVyYXRvci5uZXh0VGltZUFzVVVJRCgpLCA0MiwgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgdGVzdERlY29kaW5nS2V5V2l0aExvY2FsUGFydGl0aW9uZXJGb3JUeXBlKGtleSwgZHluYW1pY0NvbXBUeXBlKTsKKworICAgICAgICAgICAga2V5ID0gRHluYW1pY0NvbXBvc2l0ZVR5cGVUZXN0LmNyZWF0ZUR5bmFtaWNDb21wb3NpdGVLZXkoCisgICAgICAgICAgICBuZXdSYW5kb21BbHBoYW51bWVyaWMocHJuZywgMTApLCBUaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVBc1VVSUQoKSwgNDIsIHRydWUsIHRydWUpOworICAgICAgICAgICAgdGVzdERlY29kaW5nS2V5V2l0aExvY2FsUGFydGl0aW9uZXJGb3JUeXBlKGtleSwgZHluYW1pY0NvbXBUeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBuZXdSYW5kb21BbHBoYW51bWVyaWMoUmFuZG9tIHBybmcsIGludCBsZW5ndGgpCisgICAgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHJhbmRvbSA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCisgICAgICAgICAgICByYW5kb20uYXBwZW5kKEFMUEhBQkVULmNoYXJBdChwcm5nLm5leHRJbnQoQUxQSEFCRVQubGVuZ3RoKCkpKSk7CisgICAgICAgIHJldHVybiByYW5kb20udG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiB2b2lkIHRlc3REZWNvZGluZ0tleVdpdGhMb2NhbFBhcnRpdGlvbmVyRm9yVHlwZShCeXRlQnVmZmVyIGtleSwgQWJzdHJhY3RUeXBlPFQ+IHR5cGUpCisgICAgeworICAgICAgICBJUGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBuZXcgTG9jYWxQYXJ0aXRpb25lcih0eXBlKTsKKyAgICAgICAgQ2FjaGVkSGFzaERlY29yYXRlZEtleSBpbml0aWFsID0gKENhY2hlZEhhc2hEZWNvcmF0ZWRLZXkpIHBhcnRpdGlvbmVyLmRlY29yYXRlS2V5KGtleSk7CisgICAgICAgIEJ1ZmZlckRlY29yYXRlZEtleSBiYXNlID0gQnVmZmVyRGVjb3JhdGVkS2V5LmZyb21CeXRlQ29tcGFyYWJsZShpbml0aWFsLCB2ZXJzaW9uLCBwYXJ0aXRpb25lcik7CisgICAgICAgIENhY2hlZEhhc2hEZWNvcmF0ZWRLZXkgZGVjb2RlZCA9IG5ldyBDYWNoZWRIYXNoRGVjb3JhdGVkS2V5KGJhc2UuZ2V0VG9rZW4oKSwgYmFzZS5nZXRLZXkoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaW5pdGlhbCwgZGVjb2RlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVTb3VyY2VUZXN0QmFzZS5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2J5dGVjb21wYXJhYmxlL0J5dGVTb3VyY2VUZXN0QmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MGJlYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvQnl0ZVNvdXJjZVRlc3RCYXNlLmphdmEKQEAgLTAsMCArMSw1MTEgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuYnl0ZWNvbXBhcmFibGU7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRpbWUuSW5zdGFudDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkFic3RyYWN0VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5tYXJzaGFsLkJvb2xlYW5UeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuRGVjaW1hbFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5Eb3VibGVUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50MzJUeXBlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuSW50ZWdlclR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIubWFyc2hhbC5VVEY4VHlwZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5UaW1lVVVJRDsKKworcHVibGljIGNsYXNzIEJ5dGVTb3VyY2VUZXN0QmFzZQoreworICAgIFN0cmluZ1tdIHRlc3RTdHJpbmdzID0gbmV3IFN0cmluZ1tdeyAiIiwgIlwwIiwgIlwwXDAiLCAiXDAwMSIsICJBXDBcMEIiLCAiQVwwQlwwIiwgIjAiLCAiMFwwIiwgIjAwIiwgIjEiLCAiXDM3NyIgfTsKKyAgICBJbnRlZ2VyW10gdGVzdEludHMgPSBuZXcgSW50ZWdlcltdeyBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIuTUlOX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIuTUlOX1ZBTFVFICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTI3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLk1BWF9WQUxVRSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUgfTsKKyAgICBCeXRlW10gdGVzdEJ5dGVzID0gbmV3IEJ5dGVbXXsgLTEyOCwgLTEyNywgLTEsIDAsIDEsIDEyNyB9OworICAgIFNob3J0W10gdGVzdFNob3J0cyA9IG5ldyBTaG9ydFtdeyBTaG9ydC5NSU5fVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3J0Lk1JTl9WQUxVRSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3J0Lk1BWF9WQUxVRSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3J0Lk1BWF9WQUxVRSB9OworICAgIExvbmdbXSB0ZXN0TG9uZ3MgPSBuZXcgTG9uZ1tdeyBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nLk1JTl9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5NSU5fVkFMVUUgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLk1JTl9WQUxVRSAtIDFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjU2TCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI1NUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjhMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTI3TCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY1TCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY0TCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYzTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIuTUFYX1ZBTFVFICsgMUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmcuTUFYX1ZBTFVFIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9uZy5NQVhfVkFMVUUsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMikgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNSkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA2KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDcpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgOCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA5KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEwKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMSkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTIpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEzKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTUpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE2KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNykgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTgpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE5KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjEpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIyKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMykgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjQpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI1KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNikgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjcpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI4KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyOSkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzApIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDMwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDMxKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzMikgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzMpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDMzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDM0KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzNSkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzYpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDM2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDM3KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzOCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzkpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDM5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQwKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA0MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA0MSkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNDIpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQzKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA0MyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA0NCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNDUpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQ1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQ2KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA0NiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA0NykgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNDcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNDgpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQ4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDQ5KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA0OSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA1MCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNTEpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDUxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDUyKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA1MiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA1MykgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNTMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNTQpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDU0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDU1KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA1NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA1NikgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNTcpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDU3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDU4KSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA1OCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA1OSkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNTkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNjApIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDYwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDYxKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA2MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCA2MikgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgNjMpIC0gMSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDIpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMykgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDUpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNikgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA3KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA3KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDgpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgOSkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgOSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxMCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMTApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMTEpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDExKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDEyKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxMykgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMTMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMTQpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDE0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDE1KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxNSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxNikgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMTYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMTcpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDE3KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDE4KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxOCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAxOSkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMTkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMjApIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDIwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDIxKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAyMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAyMikgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMjIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMjMpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDIzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDI0KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAyNCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAyNSkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMjUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMjYpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDI2KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDI3KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAyNykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAyOCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMjgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMjkpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDI5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDMwKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAzMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAzMSkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMzEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMzIpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDMyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDMzKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAzMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAzNCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMzQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMzUpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDM1KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDM2KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAzNikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAzNykgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMzcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgMzgpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDM4KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDM5KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCAzOSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0MCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNDEpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDQxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDQyKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0MikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0MykgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNDQpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDQ0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDQ1KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0NSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0NikgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNDYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNDcpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDQ3KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDQ4KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0OCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA0OSkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNDkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNTApIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDUwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDUxKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA1MSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA1MikgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNTIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNTMpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDUzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDU0KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA1NCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA1NSkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNTUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNTYpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDU2KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDU3KSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA1NykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA1OCkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNTgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNTkpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDU5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDYwKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA2MCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+KCgxTCA8PCA2MSkgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNjEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfigoMUwgPDwgNjIpIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDYyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oKDFMIDw8IDYzKSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgIERvdWJsZVtdIHRlc3REb3VibGVzID0gbmV3IERvdWJsZVtdeyBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1Eb3VibGUuTUFYX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMWUrMjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMWUzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMWUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMWUtMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTFlLTIwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLURvdWJsZS5NSU5fVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlLk1JTl9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMWUtMjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxZS0zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxZTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMWUrMjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUuTUFYX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZS5OYU4gfTsKKyAgICBGbG9hdFtdIHRlc3RGbG9hdHMgPSBuZXcgRmxvYXRbXXsgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1GbG9hdC5NQVhfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xZSszMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xZTNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMWUwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTFlLTNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMWUtMzBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRmxvYXQuTUlOX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXQuTUlOX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxZS0zMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFlLTNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxZTBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxZTNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxZSszMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0Lk1BWF9WQUxVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0Lk5hTiB9OworICAgIEJvb2xlYW5bXSB0ZXN0Qm9vbHMgPSBuZXcgQm9vbGVhbltdeyBudWxsLCBmYWxzZSwgdHJ1ZSB9OworICAgIFVVSURbXSB0ZXN0VVVJRHMgPSBuZXcgVVVJRFtdeyBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVVVJRC5HZW5lcmF0b3IubmV4dFRpbWVBc1VVSUQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVVJRC5yYW5kb21VVUlEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQucmFuZG9tVVVJRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVUlELnJhbmRvbVVVSUQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVVSUQuR2VuZXJhdG9yLmF0VW5peE1pbGxpcygxMjMsIDIzNCkuYXNVVUlEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVVUlELkdlbmVyYXRvci5hdFVuaXhNaWxsaXMoMTIzLCAyMzQpLmFzVVVJRCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVVVJRC5HZW5lcmF0b3IuYXRVbml4TWlsbGlzKDEyMykuYXNVVUlEKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiZTkwMjg5M2EtOWQyMi0zYzdlLWE3YjgtZDZlMzEzYjcxZDlmIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiNzQ3MzhmZjUtNTM2Ny01OTU4LTlhZWUtOThmZmZkY2QxODc2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiNTJkZjFiYjAtNmEyZi0xMWU2LWI2ZTQtYTZkZWE3YTAxYjY3IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiNTJkZjFiYjAtNmEyZi0xMWU2LTM2MmQtYWZmMjE0MzQ5OGVhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVSUQuZnJvbVN0cmluZygiNTJkZjFiYjAtNmEyZi0xMWU2LWI2MmQtYWZmMjE0MzQ5OGVhIikgfTsKKyAgICAvLyBJbnN0YW50Lk1JTi9NQVggZmFpbCBEYXRlLmZyb20uCisgICAgRGF0ZVtdIHRlc3REYXRlcyA9IG5ldyBEYXRlW117IG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUuZnJvbShJbnN0YW50Lm9mRXBvY2hTZWNvbmQoSW50ZWdlci5NSU5fVkFMVUUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZS5mcm9tKEluc3RhbnQub2ZFcG9jaFNlY29uZChTaG9ydC5NSU5fVkFMVUUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZS5mcm9tKEluc3RhbnQub2ZFcG9jaE1pbGxpKC0yMDAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGUuZnJvbShJbnN0YW50LkVQT0NIKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZS5mcm9tKEluc3RhbnQub2ZFcG9jaE1pbGxpKDIwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZS5mcm9tKEluc3RhbnQub2ZFcG9jaFNlY29uZChJbnRlZ2VyLk1BWF9WQUxVRSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlLmZyb20oSW5zdGFudC5ub3coKSkgfTsKKyAgICBJbmV0QWRkcmVzc1tdIHRlc3RJbmV0czsKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICB0ZXN0SW5ldHMgPSBuZXcgSW5ldEFkZHJlc3NbXXsgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRMb29wYmFja0FkZHJlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjE5Mi4xNjguMC4xIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCJmZTgwOjo0MjhkOjVjZmY6ZmU1MzoxZGM5IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIyMDAxOjYxMDozOjIwMGE6MTkyOjg3OjM2OjIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV0QWRkcmVzcy5nZXRCeU5hbWUoIjEwLjAuMC4xIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKCIwYTAwOjAwMDE6OiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXRBZGRyZXNzLmdldEJ5TmFtZSgiOjoxMC4wLjAuMSIpIH07CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQmlnSW50ZWdlcltdIHRlc3RCaWdJbnRzOworCisgICAgeworICAgICAgICBTZXQ8QmlnSW50ZWdlcj4gYmlncyA9IG5ldyBUcmVlU2V0PD4oKTsKKyAgICAgICAgZm9yIChMb25nIGwgOiB0ZXN0TG9uZ3MpCisgICAgICAgICAgICBpZiAobCAhPSBudWxsKQorICAgICAgICAgICAgICAgIGJpZ3MuYWRkKEJpZ0ludGVnZXIudmFsdWVPZihsKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTE7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgYmlncy5hZGQoQmlnSW50ZWdlci52YWx1ZU9mKGkpKTsKKyAgICAgICAgICAgIGJpZ3MuYWRkKEJpZ0ludGVnZXIudmFsdWVPZigtaSkpOworCisgICAgICAgICAgICBiaWdzLmFkZChCaWdJbnRlZ2VyLnZhbHVlT2YoKDFMIDw8IDQgKiBpKSAtIDEpKTsKKyAgICAgICAgICAgIGJpZ3MuYWRkKEJpZ0ludGVnZXIudmFsdWVPZigoMUwgPDwgNCAqIGkpKSk7CisgICAgICAgICAgICBiaWdzLmFkZChCaWdJbnRlZ2VyLnZhbHVlT2YoLSgxTCA8PCA0ICogaSkgLSAxKSk7CisgICAgICAgICAgICBiaWdzLmFkZChCaWdJbnRlZ2VyLnZhbHVlT2YoLSgxTCA8PCA0ICogaSkpKTsKKyAgICAgICAgICAgIFN0cmluZyBwID0gZXhwMTAoaSk7CisgICAgICAgICAgICBiaWdzLmFkZChuZXcgQmlnSW50ZWdlcihwKSk7CisgICAgICAgICAgICBiaWdzLmFkZChuZXcgQmlnSW50ZWdlcigiLSIgKyBwKSk7CisgICAgICAgICAgICBwID0gZXhwMTAoMSA8PCBpKTsKKyAgICAgICAgICAgIGJpZ3MuYWRkKG5ldyBCaWdJbnRlZ2VyKHApKTsKKyAgICAgICAgICAgIGJpZ3MuYWRkKG5ldyBCaWdJbnRlZ2VyKCItIiArIHApKTsKKworICAgICAgICAgICAgQmlnSW50ZWdlciBiYXNlID0gQmlnSW50ZWdlci5PTkUuc2hpZnRMZWZ0KDUxMiAqIGkpOworICAgICAgICAgICAgYmlncy5hZGQoYmFzZSk7CisgICAgICAgICAgICBiaWdzLmFkZChiYXNlLmFkZChCaWdJbnRlZ2VyLk9ORSkpOworICAgICAgICAgICAgYmlncy5hZGQoYmFzZS5zdWJ0cmFjdChCaWdJbnRlZ2VyLk9ORSkpOworICAgICAgICAgICAgYmFzZSA9IGJhc2UubmVnYXRlKCk7CisgICAgICAgICAgICBiaWdzLmFkZChiYXNlKTsKKyAgICAgICAgICAgIGJpZ3MuYWRkKGJhc2UuYWRkKEJpZ0ludGVnZXIuT05FKSk7CisgICAgICAgICAgICBiaWdzLmFkZChiYXNlLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk7CisgICAgICAgIH0KKyAgICAgICAgdGVzdEJpZ0ludHMgPSBiaWdzLnRvQXJyYXkobmV3IEJpZ0ludGVnZXJbMF0pOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgZXhwMTAoaW50IHBvdykKKyAgICB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcxJyk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxwb3c7ICsraSkKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCcwJyk7CisgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQmlnRGVjaW1hbFtdIHRlc3RCaWdEZWNpbWFsczsKKyAgICB7CisgICAgICAgIFN0cmluZyB2YWxzID0gIjAsIDEsIDEuMSwgMjEsIDk4LjksIDk5LCA5OS45LCAxMDAsIDEwMC4xLCAxMDEsIDMzMSwgMC40LCAwLjA3LCAwLjA3MDAsIDAuMDA1LCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAiNmU0LCA3ZTIwMCwgNmUtMzAwLCA4LjFlMjAwMCwgOC4xZS0yMDAwLCA5ZTIwMDAwMDAwMDAsICIgKworICAgICAgICAgICAgICAgICAgICAgICIxMjM0NTY3ODkwMTIuMzQ1Njc4OTBlLTEwMDAwMDAwMDAsIDEyMzQ1Ni43ODkwMTIzNCwgMTIzNC41Njc4OTAxMmUyLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAiMS4wMDAwLCAwLjAxZTIsIDEwMGUtMiwgMDAsIDAuMDAwLCAwRS0xOCwgMEUrMTgiOworICAgICAgICBMaXN0PEJpZ0RlY2ltYWw+IGRlY3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgcyA6IHZhbHMuc3BsaXQoIiwgIikpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlY3MuYWRkKG5ldyBCaWdEZWNpbWFsKHMpKTsKKyAgICAgICAgICAgIGRlY3MuYWRkKG5ldyBCaWdEZWNpbWFsKCItIiArIHMpKTsKKyAgICAgICAgfQorICAgICAgICB0ZXN0QmlnRGVjaW1hbHMgPSBkZWNzLnRvQXJyYXkobmV3IEJpZ0RlY2ltYWxbMF0pOworICAgIH0KKworICAgIE9iamVjdFtdW10gdGVzdFZhbHVlcyA9IG5ldyBPYmplY3RbXVtdeyB0ZXN0U3RyaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdEludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RCb29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdERvdWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RCaWdJbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0QmlnRGVjaW1hbHMgfTsKKworICAgIEFic3RyYWN0VHlwZVtdIHRlc3RUeXBlcyA9IG5ldyBBYnN0cmFjdFR5cGVbXXsgVVRGOFR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQzMlR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuVHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZVR5cGUuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyVHlwZS5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWxUeXBlLmluc3RhbmNlIH07Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvRGVjb3JhdGVkS2V5Qnl0ZVNvdXJjZVRlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9ieXRlY29tcGFyYWJsZS9EZWNvcmF0ZWRLZXlCeXRlU291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjM2U3MmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvYnl0ZWNvbXBhcmFibGUvRGVjb3JhdGVkS2V5Qnl0ZVNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS51dGlscy5ieXRlY29tcGFyYWJsZTsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQnVmZmVyRGVjb3JhdGVkS2V5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkRlY29yYXRlZEtleTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuQnl0ZU9yZGVyZWRQYXJ0aXRpb25lcjsKKworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBEZWNvcmF0ZWRLZXlCeXRlU291cmNlVGVzdAoreworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOVU1fSVRFUkFUSU9OUyA9IDEwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkFORE9NX0JZVEVTX0xFTkdUSCA9IDEwMDsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ2ZXJzaW9uPXswfSIpCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxCeXRlQ29tcGFyYWJsZS5WZXJzaW9uPiB2ZXJzaW9ucygpCisgICAgeworICAgICAgICByZXR1cm4gSW1tdXRhYmxlTGlzdC5vZihCeXRlQ29tcGFyYWJsZS5WZXJzaW9uLk9TUzUwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEJ5dGVDb21wYXJhYmxlLlZlcnNpb24gdmVyc2lvbjsKKworICAgIHB1YmxpYyBEZWNvcmF0ZWRLZXlCeXRlU291cmNlVGVzdChCeXRlQ29tcGFyYWJsZS5WZXJzaW9uIHZlcnNpb24pCisgICAgeworICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZUJ1ZmZlckRlY29yYXRlZEtleSgpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9JVEVSQVRJT05TOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ1ZmZlckRlY29yYXRlZEtleSBpbml0aWFsQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgKEJ1ZmZlckRlY29yYXRlZEtleSkgQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5pbnN0YW5jZS5kZWNvcmF0ZUtleShuZXdSYW5kb21CeXRlc0J1ZmZlcigpKTsKKyAgICAgICAgICAgIEJ1ZmZlckRlY29yYXRlZEtleSBkZWNvZGVkQnVmZmVyID0gQnVmZmVyRGVjb3JhdGVkS2V5LmZyb21CeXRlQ29tcGFyYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgaW5pdGlhbEJ1ZmZlciwgdmVyc2lvbiwgQnl0ZU9yZGVyZWRQYXJ0aXRpb25lci5pbnN0YW5jZSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGluaXRpYWxCdWZmZXIsIGRlY29kZWRCdWZmZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlS2V5Qnl0ZXMoKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fSVRFUkFUSU9OUzsgKytpKQorICAgICAgICB7CisgICAgICAgICAgICBCdWZmZXJEZWNvcmF0ZWRLZXkgaW5pdGlhbEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgIChCdWZmZXJEZWNvcmF0ZWRLZXkpIEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UuZGVjb3JhdGVLZXkobmV3UmFuZG9tQnl0ZXNCdWZmZXIoKSk7CisgICAgICAgICAgICBCeXRlU291cmNlLlBlZWthYmxlIHNyYyA9IEJ5dGVTb3VyY2UucGVla2FibGUoaW5pdGlhbEJ1ZmZlci5hc0NvbXBhcmFibGVCeXRlcyh2ZXJzaW9uKSk7CisgICAgICAgICAgICBieXRlW10ga2V5Qnl0ZXMgPSBEZWNvcmF0ZWRLZXkua2V5RnJvbUJ5dGVTb3VyY2Uoc3JjLCB2ZXJzaW9uLCBCeXRlT3JkZXJlZFBhcnRpdGlvbmVyLmluc3RhbmNlKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQnl0ZVNvdXJjZS5FTkRfT0ZfU1RSRUFNLCBzcmMubmV4dCgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRBcnJheUVxdWFscyhpbml0aWFsQnVmZmVyLmdldEtleSgpLmFycmF5KCksIGtleUJ5dGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEJ5dGVCdWZmZXIgbmV3UmFuZG9tQnl0ZXNCdWZmZXIoKQorICAgIHsKKyAgICAgICAgYnl0ZVtdIHJhbmRvbUJ5dGVzID0gbmV3IGJ5dGVbUkFORE9NX0JZVEVTX0xFTkdUSF07CisgICAgICAgIG5ldyBSYW5kb20oKS5uZXh0Qnl0ZXMocmFuZG9tQnl0ZXMpOworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKHJhbmRvbUJ5dGVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9SZWZDb3VudGVkVGVzdC5qYXZhIGIvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL2NvbmN1cnJlbnQvUmVmQ291bnRlZFRlc3QuamF2YQppbmRleCBlOTlkMzY4Li5kNTBlNDA4IDEwMDY0NAotLS0gYS90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvY29uY3VycmVudC9SZWZDb3VudGVkVGVzdC5qYXZhCisrKyBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy9jb25jdXJyZW50L1JlZkNvdW50ZWRUZXN0LmphdmEKQEAgLTE4LDI4ICsxOCw0MSBAQAogKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudDsKIAotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKIGltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS50aW1lLkR1cmF0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKIAoraW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRGF0YWJhc2VEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLm1hcnNoYWwuVVRGOFR5cGU7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LkJ5dGVPcmRlcmVkUGFydGl0aW9uZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLk9iamVjdFNpemVzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLlBhaXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEudXRpbHMuY29uY3VycmVudC5SZWYuVmlzaXRvcjsKK2ltcG9ydCBvcmcuYXdhaXRpbGl0eS5Bd2FpdGlsaXR5OworCitpbXBvcnQgc3RhdGljIG9yZy5hc3NlcnRqLmNvcmUuYXBpLkFzc2VydGlvbnMuYXNzZXJ0VGhhdDsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJ1bnVzZWQiLCAidW5jaGVja2VkIiwgInJhd3R5cGVzIn0pCiBwdWJsaWMgY2xhc3MgUmVmQ291bnRlZFRlc3QKQEAgLTQwNiw0ICs0MTksMTM0IEBACiAKICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodmlzaXRvci5oYXZlTG9vcHMuaXNFbXB0eSgpKTsKICAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTGFtYmRhVGVzdENsYXNzVGlkaWVyIGltcGxlbWVudHMgUmVmQ291bnRlZC5UaWR5CisgICAgeworICAgICAgICBSdW5uYWJsZSBydW5PbkNsb3NlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB0aWR5KCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBydW5PbkNsb3NlLnJ1bigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAiNDIiOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIExhbWJkYVRlc3RDbGFzcworICAgIHsKKyAgICAgICAgU3RyaW5nIGEgPSAieCI7CisgICAgICAgIFJlZjxPYmplY3Q+IHJlZjsKKworICAgICAgICBSdW5uYWJsZSBnZXRSdW5PbkNsb3NlTGFtYmRhKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgpIC0+IFN5c3RlbS5vdXQucHJpbnRsbigiYWFhIik7CisgICAgICAgIH0KKworICAgICAgICBSdW5uYWJsZSBnZXRSdW5PbkNsb3NlSW5uZXIoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJ1bm5hYmxlKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhYWEiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgUnVubmFibGUgZ2V0UnVuT25DbG9zZUxhbWJkYVdpdGhUaGlzKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgpIC0+IFN5c3RlbS5vdXQucHJpbnRsbihhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU2V0PFJlZi5HbG9iYWxTdGF0ZT4gdGVzdEN5Y2xlcyhGdW5jdGlvbjxMYW1iZGFUZXN0Q2xhc3MsIFJ1bm5hYmxlPiBydW5PbkNsb3NlU3VwcGxpZXIpCisgICAgeworICAgICAgICBMYW1iZGFUZXN0Q2xhc3MgdGVzdCA9IG5ldyBMYW1iZGFUZXN0Q2xhc3MoKTsKKyAgICAgICAgUnVubmFibGUgd2Vha1JlZiA9IHJ1bk9uQ2xvc2VTdXBwbGllci5hcHBseSh0ZXN0KTsKKyAgICAgICAgUmVmQ291bnRlZC5UaWR5IHRpZGllciA9IG5ldyBSZWZDb3VudGVkLlRpZHkoKQorICAgICAgICB7CisgICAgICAgICAgICBSdW5uYWJsZSByZWYgPSB3ZWFrUmVmOworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0aWR5KCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZyBuYW1lKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIjQyIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBSZWY8T2JqZWN0PiByZWYgPSBuZXcgUmVmKHRlc3QsIHRpZGllcik7CisgICAgICAgIHRlc3QucmVmID0gcmVmOworCisgICAgICAgIFZpc2l0b3IgdmlzaXRvciA9IG5ldyBWaXNpdG9yKCk7CisgICAgICAgIHZpc2l0b3IuaGF2ZUxvb3BzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICB2aXNpdG9yLnJ1bigpOworICAgICAgICByZWYuY2xvc2UoKTsKKworICAgICAgICByZXR1cm4gdmlzaXRvci5oYXZlTG9vcHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGludGVudGlvbiBvZiB0aGlzIHRlc3QgaXMgdG8gY29uZmlybSB0aGF0IGxhbWJkYSB3aXRob3V0IGEgcmVmZXJlbmNlIHRvIGB0aGlzYCwgZG9lcyBub3QgaW1wbGljaXRseQorICAgICAqIGluY2x1ZGUgYSByZWZlcmVuY2UgdG8gdGhlIGVuY2xvc2luZyBjbGFzcy4gSWYgaXQgZGlkLCB3ZSB3b3VsZCBkZXRlY3QgY3ljbGVzLCBhcyB3ZSBkbyB3aGVuIHdlIGRlYWwgd2l0aAorICAgICAqIGFub255bW91cyBpbm5lciBjbGFzc2VzIG9yIGxhbWJhIHdoaWNoIHJlZmVyZW5jZXMgYHRoaXNgIGV4cGxpY2l0bHkgKHNlZSB0aGUgc2FuaXR5IGNoZWNrcykuCisgICAgICogPHA+CisgICAgICogVGhpcyB0ZXN0IGFpbXMgdG8gY29uZmlybSB0aGF0IEpWTSB3b3JrcyBhcyB3ZSBhc3N1bWVkIGJlY2F1c2Ugd2UgY291bGRuJ3QgZmluZCB0aGF0IGluIHRoZSBzcGVjaWZpY2F0aW9uLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN5Y2xlcygpCisgICAgeworICAgICAgICBhc3NlcnRUaGF0KHRlc3RDeWNsZXMoTGFtYmRhVGVzdENsYXNzOjpnZXRSdW5PbkNsb3NlTGFtYmRhV2l0aFRoaXMpKS5pc05vdEVtcHR5KCk7IC8vIHNhbml0eSB0ZXN0CisgICAgICAgIGFzc2VydFRoYXQodGVzdEN5Y2xlcyhMYW1iZGFUZXN0Q2xhc3M6OmdldFJ1bk9uQ2xvc2VJbm5lcikpLmlzTm90RW1wdHkoKTsgLy8gc2FuaXR5IHRlc3QKKworICAgICAgICBhc3NlcnRUaGF0KHRlc3RDeWNsZXMoTGFtYmRhVGVzdENsYXNzOjpnZXRSdW5PbkNsb3NlTGFtYmRhKSkuaXNFbXB0eSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNTVGFibGVSZWFkZXJMZWFrSXNEZXRlY3RlZCgpCisgICAgeworICAgICAgICBEYXRhYmFzZURlc2NyaXB0b3IuY2xpZW50SW5pdGlhbGl6YXRpb24oKTsKKyAgICAgICAgRGF0YWJhc2VEZXNjcmlwdG9yLnNldFBhcnRpdGlvbmVyVW5zYWZlKEJ5dGVPcmRlcmVkUGFydGl0aW9uZXIuaW5zdGFuY2UpOworICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yLmZyb21GaWxlV2l0aENvbXBvbmVudChuZXcgRmlsZSgidGVzdC9kYXRhL2xlZ2FjeS1zc3RhYmxlcy9uYi9sZWdhY3lfdGFibGVzL2xlZ2FjeV9uYl9zaW1wbGUvbmItMS1iaWctRGF0YS5kYiIpLCBmYWxzZSkubGVmdDsKKyAgICAgICAgVGFibGVNZXRhZGF0YSB0bSA9IFRhYmxlTWV0YWRhdGEuYnVpbGRlcigibGVnYWN5X3RhYmxlcyIsICJsZWdhY3lfbmJfc2ltcGxlIikuYWRkUGFydGl0aW9uS2V5Q29sdW1uKCJwayIsIFVURjhUeXBlLmluc3RhbmNlKS5hZGRSZWd1bGFyQ29sdW1uKCJ2YWwiLCBVVEY4VHlwZS5pbnN0YW5jZSkuYnVpbGQoKTsKKyAgICAgICAgQXRvbWljQm9vbGVhbiBsZWFrRGV0ZWN0ZWQgPSBuZXcgQXRvbWljQm9vbGVhbigpOworICAgICAgICBBdG9taWNCb29sZWFuIHJ1bk9uQ2xvc2VFeGVjdXRlZDEgPSBuZXcgQXRvbWljQm9vbGVhbigpOworICAgICAgICBBdG9taWNCb29sZWFuIHJ1bk9uQ2xvc2VFeGVjdXRlZDIgPSBuZXcgQXRvbWljQm9vbGVhbigpOworICAgICAgICBSZWYuT25MZWFrIHByZXZPbkxlYWsgPSBSZWYuT05fTEVBSzsKKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgUmVmLk9OX0xFQUsgPSBzdGF0ZSAtPiB7CisgICAgICAgICAgICAgICAgbGVha0RldGVjdGVkLnNldCh0cnVlKTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU1NUYWJsZVJlYWRlciByZWFkZXIgPSBTU1RhYmxlUmVhZGVyLm9wZW5Ob1ZhbGlkYXRpb24obnVsbCwgZGVzY3JpcHRvciwgVGFibGVNZXRhZGF0YVJlZi5mb3JPZmZsaW5lVG9vbHModG0pKTsKKyAgICAgICAgICAgICAgICByZWFkZXIucnVuT25DbG9zZSgoKSAtPiBydW5PbkNsb3NlRXhlY3V0ZWQxLnNldCh0cnVlKSk7CisgICAgICAgICAgICAgICAgcmVhZGVyLnJ1bk9uQ2xvc2UoKCkgLT4gcnVuT25DbG9zZUV4ZWN1dGVkMi5zZXQodHJ1ZSkpOyAvLyBzZWNvbmQgdGltZSB0byBhY3R1YWxseSBjcmVhdGUgbGFtYmRhIHJlZmVyZW5jaW5nIHRvIGxhbWJkYSwgc2VlIHJ1bk9uQ2xvc2UgaW1wbAorICAgICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIFVudXNlZEFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICByZWFkZXIgPSBudWxsOyAvLyB0aGlzIGlzIHJlcXVpcmVkLCBvdGhlcndpc2UgR0Mgd2lsbCBub3QgYXR0ZW1wdCB0byBjb2xsZWN0IHRoZSBjcmVhdGVkIHJlYWRlcgorICAgICAgICAgICAgfQorICAgICAgICAgICAgQXdhaXRpbGl0eS5hd2FpdCgpLmF0TW9zdChEdXJhdGlvbi5vZlNlY29uZHMoMzApKS5wb2xsRGVsYXkoRHVyYXRpb24ub2ZTZWNvbmRzKDEpKS51bnRpbEFzc2VydGVkKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0uZ2MoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KGxlYWtEZXRlY3RlZC5nZXQoKSkuaXNUcnVlKCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocnVuT25DbG9zZUV4ZWN1dGVkMS5nZXQoKSkuaXNUcnVlKCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJ1bk9uQ2xvc2VFeGVjdXRlZDIuZ2V0KCkpLmlzVHJ1ZSgpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkKKyAgICAgICAgeworICAgICAgICAgICAgUmVmLk9OX0xFQUsgPSBwcmV2T25MZWFrOworICAgICAgICB9CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL3ZpbnQvVkludENvZGluZ1Rlc3QuamF2YSBiL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS91dGlscy92aW50L1ZJbnRDb2RpbmdUZXN0LmphdmEKaW5kZXggMTVmOWNkYy4uMzM5NzQyNiAxMDA2NDQKLS0tIGEvdGVzdC91bml0L29yZy9hcGFjaGUvY2Fzc2FuZHJhL3V0aWxzL3ZpbnQvVkludENvZGluZ1Rlc3QuamF2YQorKysgYi90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvdXRpbHMvdmludC9WSW50Q29kaW5nVGVzdC5qYXZhCkBAIC0xOCwyMSArMTgsMTkgQEAKICovCiBwYWNrYWdlIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLnZpbnQ7CiAKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogCi1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRQbHVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnByaW1pdGl2ZXMuVW5zaWduZWRJbnRlZ2VyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhSW5wdXRCdWZmZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5EYXRhT3V0cHV0QnVmZmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuV3JhcHBlZERhdGFPdXRwdXRTdHJlYW1QbHVzOwogCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CiAKIHB1YmxpYyBjbGFzcyBWSW50Q29kaW5nVGVzdApAQCAtNTEsMjEgKzQ5LDIxIEBACiAgICAgICAgICAgICBhc3NlcnRFbmNvZGVkQXRFeHBlY3RlZFNpemUoKDFMIDw8IDcgKiBzaXplKSAtIDEsIHNpemUpOwogICAgICAgICAgICAgYXNzZXJ0RW5jb2RlZEF0RXhwZWN0ZWRTaXplKDFMIDw8IDcgKiBzaXplLCBzaXplICsgMSk7CiAgICAgICAgIH0KLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg5LCBWSW50Q29kaW5nLmNvbXB1dGVVbnNpZ25lZFZJbnRTaXplKExvbmcuTUFYX1ZBTFVFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg5LCBWSW50Q29kaW5nLmNvbXB1dGVVbnNpZ25lZFZJbnRTaXplKExvbmcuTUFYX1ZBTFVFKSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEVuY29kZWRBdEV4cGVjdGVkU2l6ZShsb25nIHZhbHVlLCBpbnQgZXhwZWN0ZWRTaXplKSB0aHJvd3MgRXhjZXB0aW9uCiAgICAgewotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU2l6ZSwgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZSh2YWx1ZSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTaXplLCBWSW50Q29kaW5nLmNvbXB1dGVVbnNpZ25lZFZJbnRTaXplKHZhbHVlKSk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICBXcmFwcGVkRGF0YU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gbmV3IFdyYXBwZWREYXRhT3V0cHV0U3RyZWFtUGx1cyhiYW9zKTsKICAgICAgICAgVkludENvZGluZy53cml0ZVVuc2lnbmVkVkludCh2YWx1ZSwgb3V0KTsKICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGV4cGVjdGVkU2l6ZSwgYmFvcy50b0J5dGVBcnJheSgpLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscyggZXhwZWN0ZWRTaXplLCBiYW9zLnRvQnl0ZUFycmF5KCkubGVuZ3RoKTsKIAogICAgICAgICBEYXRhT3V0cHV0QnVmZmVyIGRvYiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCk7CiAgICAgICAgIGRvYi53cml0ZVVuc2lnbmVkVkludCh2YWx1ZSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGV4cGVjdGVkU2l6ZSwgZG9iLmJ1ZmZlcigpLnJlbWFpbmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCBleHBlY3RlZFNpemUsIGRvYi5idWZmZXIoKS5yZW1haW5pbmcoKSk7CiAgICAgICAgIGRvYi5jbG9zZSgpOwogICAgIH0KIApAQCAtNzMsNyArNzEsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkRXh0cmFCeXRlc0NvdW50KCkKICAgICB7CiAgICAgICAgIGZvciAoaW50IGkgPSAxIDsgaSA8IDggOyBpKyspCi0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGksIFZJbnRDb2RpbmcubnVtYmVyT2ZFeHRyYUJ5dGVzVG9SZWFkKChieXRlKSAoKDB4RkYgPDwgKDggLSBpKSkgJiAweEZGKSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIFZJbnRDb2RpbmcubnVtYmVyT2ZFeHRyYUJ5dGVzVG9SZWFkKChieXRlKSAoKDB4RkYgPDwgKDggLSBpKSkgJiAweEZGKSkpOwogICAgIH0KIAogICAgIC8qCkBAIC04NSwxMyArODMsMTMgQEAKIAogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgV3JhcHBlZERhdGFPdXRwdXRTdHJlYW1QbHVzIG91dCA9IG5ldyBXcmFwcGVkRGF0YU91dHB1dFN0cmVhbVBsdXMoYmFvcyk7Ci0gICAgICAgIFZJbnRDb2Rpbmcud3JpdGVVbnNpZ25lZFZJbnQoYmlnZ2VzdE9uZUJ5dGUsIG91dCk7CisgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVVbnNpZ25lZFZJbnQzMihiaWdnZXN0T25lQnl0ZSwgb3V0KTsKICAgICAgICAgb3V0LmZsdXNoKCk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDEsIGJhb3MudG9CeXRlQXJyYXkoKS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIDEsIGJhb3MudG9CeXRlQXJyYXkoKS5sZW5ndGgpOwogCiAgICAgICAgIERhdGFPdXRwdXRCdWZmZXIgZG9iID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKTsKLSAgICAgICAgZG9iLndyaXRlVW5zaWduZWRWSW50KGJpZ2dlc3RPbmVCeXRlKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggMSwgZG9iLmJ1ZmZlcigpLnJlbWFpbmluZygpKTsKKyAgICAgICAgZG9iLndyaXRlVW5zaWduZWRWSW50MzIoYmlnZ2VzdE9uZUJ5dGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIDEsIGRvYi5idWZmZXIoKS5yZW1haW5pbmcoKSk7CiAgICAgICAgIGRvYi5jbG9zZSgpOwogICAgIH0KIApAQCAtMTAxLDkgKzk5LDkgQEAKICAgICAgICAgaW50IGkgPSAtMTIzMTIzODY5NDsKICAgICAgICAgdHJ5IChEYXRhT3V0cHV0QnVmZmVyIG91dCA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCkpCiAgICAgICAgIHsKLSAgICAgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVVbnNpZ25lZFZJbnQoaSwgb3V0KTsKKyAgICAgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVVbnNpZ25lZFZJbnQzMihpLCBvdXQpOwogICAgICAgICAgICAgbG9uZyByZXN1bHQgPSBWSW50Q29kaW5nLmdldFVuc2lnbmVkVkludChvdXQuYnVmZmVyKCksIDApOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpLCByZXN1bHQpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIHJlc3VsdCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExMywxNSArMTExLDE0IEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkludENvZGluZy5NQVhfU0laRSAtIDE7IGkrKykKICAgICAgICAgewogICAgICAgICAgICAgbG9uZyB2YWwgPSBMT05HU1tpXTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaSArIDEsIFZJbnRDb2RpbmcuY29tcHV0ZVVuc2lnbmVkVkludFNpemUodmFsKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArIDEsIFZJbnRDb2RpbmcuY29tcHV0ZVVuc2lnbmVkVkludFNpemUodmFsKSk7CiAgICAgICAgICAgICB0cnkgKERhdGFPdXRwdXRCdWZmZXIgb3V0ID0gbmV3IERhdGFPdXRwdXRCdWZmZXIoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBWSW50Q29kaW5nLndyaXRlVW5zaWduZWRWSW50KHZhbCwgb3V0KTsKICAgICAgICAgICAgICAgICAvLyByZWFkIGFzIEJ5dGVCdWZmZXIKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHZhbCwgVkludENvZGluZy5nZXRVbnNpZ25lZFZJbnQob3V0LmJ1ZmZlcigpLCAwKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgVkludENvZGluZy5nZXRVbnNpZ25lZFZJbnQob3V0LmJ1ZmZlcigpLCAwKSk7CiAgICAgICAgICAgICAgICAgLy8gcmVhZCBhcyBEYXRhSW5wdXQKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcucmVhZFVuc2lnbmVkVkludChuZXcgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzKGlzKSkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcucmVhZFVuc2lnbmVkVkludChuZXcgRGF0YUlucHV0QnVmZmVyKG91dC50b0J5dGVBcnJheSgpKSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTMyLDE4ICsxMjksMTcgQEAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBWSW50Q29kaW5nLk1BWF9TSVpFIC0gMTsgaSsrKQogICAgICAgICB7CiAgICAgICAgICAgICBsb25nIHZhbCA9IExPTkdTW2ldOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhpICsgMSwgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZSh2YWwpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhpICsgMSwgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZSh2YWwpKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJ5IChXcmFwcGVkRGF0YU91dHB1dFN0cmVhbVBsdXMgb3V0ID0gbmV3IFdyYXBwZWREYXRhT3V0cHV0U3RyZWFtUGx1cyhiYW9zKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBWSW50Q29kaW5nLndyaXRlVW5zaWduZWRWSW50KHZhbCwgb3V0KTsKICAgICAgICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBpICsgMSwgYmFvcy50b0J5dGVBcnJheSgpLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCBpICsgMSwgYmFvcy50b0J5dGVBcnJheSgpLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgLy8gcmVhZCBhcyBCeXRlQnVmZmVyCi0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcuZ2V0VW5zaWduZWRWSW50KEJ5dGVCdWZmZXIud3JhcChiYW9zLnRvQnl0ZUFycmF5KCkpLCAwKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgVkludENvZGluZy5nZXRVbnNpZ25lZFZJbnQoQnl0ZUJ1ZmZlci53cmFwKGJhb3MudG9CeXRlQXJyYXkoKSksIDApKTsKICAgICAgICAgICAgICAgICAvLyByZWFkIGFzIERhdGFJbnB1dAotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcucmVhZFVuc2lnbmVkVkludChuZXcgRGF0YUlucHV0UGx1cy5EYXRhSW5wdXRTdHJlYW1QbHVzKGlzKSkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcucmVhZFVuc2lnbmVkVkludChuZXcgRGF0YUlucHV0QnVmZmVyKGJhb3MudG9CeXRlQXJyYXkoKSkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTE1NCwxNCArMTUwLDEzIEBACiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgVkludENvZGluZy5NQVhfU0laRSAtIDE7IGkrKykKICAgICAgICAgewogICAgICAgICAgICAgbG9uZyB2YWwgPSBMT05HU1tpXTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoaSArIDEsIFZJbnRDb2RpbmcuY29tcHV0ZVVuc2lnbmVkVkludFNpemUodmFsKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSArIDEsIFZJbnRDb2RpbmcuY29tcHV0ZVVuc2lnbmVkVkludFNpemUodmFsKSk7CiAgICAgICAgICAgICBCeXRlQnVmZmVyIGJiID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShWSW50Q29kaW5nLk1BWF9TSVpFKTsKICAgICAgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVVbnNpZ25lZFZJbnQodmFsLCBiYik7CiAgICAgICAgICAgICAvLyByZWFkIGFzIEJ5dGVCdWZmZXIKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModmFsLCBWSW50Q29kaW5nLmdldFVuc2lnbmVkVkludChiYiwgMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgVkludENvZGluZy5nZXRVbnNpZ25lZFZJbnQoYmIsIDApKTsKICAgICAgICAgICAgIC8vIHJlYWQgYXMgRGF0YUlucHV0Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYi5hcnJheSgpKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModmFsLCBWSW50Q29kaW5nLnJlYWRVbnNpZ25lZFZJbnQobmV3IERhdGFJbnB1dFBsdXMuRGF0YUlucHV0U3RyZWFtUGx1cyhpcykpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcucmVhZFVuc2lnbmVkVkludChuZXcgRGF0YUlucHV0QnVmZmVyKGJiLmFycmF5KCkpKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2OSwyNiArMTY0LDI1IEBACiAgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlVW5zaWduZWRWSW50QkJMZXNzVGhhbjhCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKICAgICAgICAgbG9uZyB2YWwgPSAxMDIwMUw7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZSh2YWwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIFZJbnRDb2RpbmcuY29tcHV0ZVVuc2lnbmVkVkludFNpemUodmFsKSk7CiAgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDIpOwogICAgICAgICBWSW50Q29kaW5nLndyaXRlVW5zaWduZWRWSW50KHZhbCwgYmIpOwogICAgICAgICAvLyByZWFkIGFzIEJ5dGVCdWZmZXIKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcuZ2V0VW5zaWduZWRWSW50KGJiLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcuZ2V0VW5zaWduZWRWSW50KGJiLCAwKSk7CiAgICAgICAgIC8vIHJlYWQgYXMgRGF0YUlucHV0Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJiLmFycmF5KCkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHZhbCwgVkludENvZGluZy5yZWFkVW5zaWduZWRWSW50KG5ldyBEYXRhSW5wdXRQbHVzLkRhdGFJbnB1dFN0cmVhbVBsdXMoaXMpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcucmVhZFVuc2lnbmVkVkludChuZXcgRGF0YUlucHV0QnVmZmVyKGJiLmFycmF5KCkpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVVbnNpZ25lZFZJbnRCQkhhc0xlc3NUaGFuOEJ5dGVzTGVmdCgpCiAgICAgewogICAgICAgICBsb25nIHZhbCA9IDEwMjAxTDsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBWSW50Q29kaW5nLmNvbXB1dGVVbnNpZ25lZFZJbnRTaXplKHZhbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgVkludENvZGluZy5jb21wdXRlVW5zaWduZWRWSW50U2l6ZSh2YWwpKTsKICAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMyk7CiAgICAgICAgIGJiLnBvc2l0aW9uKDEpOwogICAgICAgICBWSW50Q29kaW5nLndyaXRlVW5zaWduZWRWSW50KHZhbCwgYmIpOwogICAgICAgICAvLyByZWFkIGFzIEJ5dGVCdWZmZXIKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcuZ2V0VW5zaWduZWRWSW50KGJiLCAxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIFZJbnRDb2RpbmcuZ2V0VW5zaWduZWRWSW50KGJiLCAxKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTIwMSw0ICsxOTUsNjYgQEAKICAgICAgICAgICAgIGZhaWwoKTsKICAgICAgICAgfSBjYXRjaCAoQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gZSkge30KICAgICB9CisKKyAgICBzdGF0aWMgaW50W10gcm91bmR0cmlwVGVzdFZhbHVlcyA9ICBuZXcgaW50W10geworICAgICAgICAgICAgVW5zaWduZWRJbnRlZ2VyLk1BWF9WQUxVRS5pbnRWYWx1ZSgpLAorICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUgKyAxLAorICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUsCisgICAgICAgICAgICBJbnRlZ2VyLk1BWF9WQUxVRSAtIDEsCisgICAgICAgICAgICBJbnRlZ2VyLk1JTl9WQUxVRSwKKyAgICAgICAgICAgIEludGVnZXIuTUlOX1ZBTFVFICsgMSwKKyAgICAgICAgICAgIEludGVnZXIuTUlOX1ZBTFVFIC0gMSwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgIDEKKyAgICB9OworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um91bmR0cmlwVW5zaWduZWRWSW50MzIoKSB0aHJvd3MgVGhyb3dhYmxlCisgICAgeworICAgICAgICBmb3IgKGludCB2YWx1ZSA6IHJvdW5kdHJpcFRlc3RWYWx1ZXMpCisgICAgICAgICAgICB0ZXN0Um91bmR0cmlwVW5zaWduZWRWSW50MzIodmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFJvdW5kdHJpcFVuc2lnbmVkVkludDMyKGludCB2YWx1ZSkgdGhyb3dzIFRocm93YWJsZQorICAgIHsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoOSk7CisgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVVbnNpZ25lZFZJbnQzMih2YWx1ZSwgYmIpOworICAgICAgICBiYi5mbGlwKCk7CisgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgVkludENvZGluZy5nZXRVbnNpZ25lZFZJbnQzMihiYiwgMCkpOworCisgICAgICAgIHRyeSAoRGF0YU91dHB1dEJ1ZmZlciBkb2IgPSBuZXcgRGF0YU91dHB1dEJ1ZmZlcigpKQorICAgICAgICB7CisgICAgICAgICAgICBkb2Iud3JpdGVVbnNpZ25lZFZJbnQzMih2YWx1ZSk7CisgICAgICAgICAgICB0cnkgKERhdGFJbnB1dEJ1ZmZlciBkaWIgPSBuZXcgRGF0YUlucHV0QnVmZmVyKGRvYi5idWZmZXIoKSwgZmFsc2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgZGliLnJlYWRVbnNpZ25lZFZJbnQzMigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJvdW5kdHJpcFZJbnQzMigpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIGZvciAoaW50IHZhbHVlIDogcm91bmR0cmlwVGVzdFZhbHVlcykKKyAgICAgICAgICAgIHRlc3RSb3VuZHRyaXBWSW50MzIodmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFJvdW5kdHJpcFZJbnQzMihpbnQgdmFsdWUpIHRocm93cyBUaHJvd2FibGUKKyAgICB7CisgICAgICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDkpOworCisgICAgICAgIFZJbnRDb2Rpbmcud3JpdGVWSW50MzIodmFsdWUsIGJiKTsKKyAgICAgICAgYmIuZmxpcCgpOworICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUsIFZJbnRDb2RpbmcuZ2V0VkludDMyKGJiLCAwKSk7CisKKyAgICAgICAgdHJ5IChEYXRhT3V0cHV0QnVmZmVyIGRvYiA9IG5ldyBEYXRhT3V0cHV0QnVmZmVyKCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvYi53cml0ZVZJbnQzMih2YWx1ZSk7CisgICAgICAgICAgICB0cnkgKERhdGFJbnB1dEJ1ZmZlciBkaWIgPSBuZXcgRGF0YUlucHV0QnVmZmVyKGRvYi5idWZmZXIoKSwgZmFsc2UpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgZGliLnJlYWRWSW50MzIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9iaW4vY2Fzc2FuZHJhLmluLnNoIGIvdG9vbHMvYmluL2Nhc3NhbmRyYS5pbi5zaAppbmRleCBlMWQxZmUzLi44NjRiODdlIDEwMDY0NAotLS0gYS90b29scy9iaW4vY2Fzc2FuZHJhLmluLnNoCisrKyBiL3Rvb2xzL2Jpbi9jYXNzYW5kcmEuaW4uc2gKQEAgLTgwLDggKzgwLDkgQEAKIGphdmFfdmVyX291dHB1dD1gIiR7SkFWQTotamF2YX0iIC12ZXJzaW9uIDI+JjFgCiBqdm12ZXI9YGVjaG8gIiRqYXZhX3Zlcl9vdXRwdXQiIHwgZ3JlcCAnW29wZW5qZGt8amF2YV0gdmVyc2lvbicgfCBhd2sgLUYnIicgJ05SPT0xIHtwcmludCAkMn0nIHwgY3V0IC1kXC0gLWYxYAogSlZNX1ZFUlNJT049JHtqdm12ZXIlXyp9CitzaG9ydD0kKGVjaG8gIiR7anZtdmVyfSIgfCBjdXQgLWMxLTIpCiAKLUpBVkFfVkVSU0lPTj0xMQorSkFWQV9WRVJTSU9OPTE3CiBpZiBbICIkSlZNX1ZFUlNJT04iID0gIjEuOC4wIiBdICA7IHRoZW4KICAgICBKVk1fUEFUQ0hfVkVSU0lPTj0ke2p2bXZlciMqX30KICAgICBpZiBbICIkSlZNX1ZFUlNJT04iIFw8ICIxLjgiIF0gfHwgWyAiJEpWTV9WRVJTSU9OIiBcPiAiMS44LjIiIF0gOyB0aGVuCkBAIC05Niw2ICs5NywxMCBAQAogZWxpZiBbICIkSlZNX1ZFUlNJT04iIFw8ICIxMSIgXSA7IHRoZW4KICAgICBlY2hvICJDYXNzYW5kcmEgNC4wIHJlcXVpcmVzIGVpdGhlciBKYXZhIDggKHVwZGF0ZSAxNTEgb3IgbmV3ZXIpIG9yIEphdmEgMTEgKG9yIG5ld2VyKS4iCiAgICAgZXhpdCAxOworZWxpZiBbICIkc2hvcnQiID0gIjExIiBdIDsgdGhlbgorICAgICBKQVZBX1ZFUlNJT049MTEKK2VsaWYgWyAiJEpWTV9WRVJTSU9OIiBcPCAiMTciIF0gOyB0aGVuCisgICAgZWNobyAiQ2Fzc2FuZHJhIDUuMCByZXF1aXJlcyBKYXZhIDExIG9yIEphdmEgMTcob3IgbmV3ZXIpLiIKIGZpCiAKIGp2bT1gZWNobyAiJGphdmFfdmVyX291dHB1dCIgfCBncmVwIC1BIDEgJ1tvcGVuamRrfGphdmFdIHZlcnNpb24nIHwgYXdrICdOUj09MiB7cHJpbnQgJDF9J2AKQEAgLTExOSw3ICsxMjQsOSBAQAogCiAjIFJlYWQgdXNlci1kZWZpbmVkIEpWTSBvcHRpb25zIGZyb20ganZtLXNlcnZlci5vcHRpb25zIGZpbGUKIEpWTV9PUFRTX0ZJTEU9JENBU1NBTkRSQV9DT05GL2p2bSR7anZtb3B0aW9uc192YXJpYW50Oi0tY2xpZW50c30ub3B0aW9ucwotaWYgWyAkSkFWQV9WRVJTSU9OIC1nZSAxMSBdIDsgdGhlbgoraWYgWyAkSkFWQV9WRVJTSU9OIC1nZSAxNyBdIDsgdGhlbgorICAgIEpWTV9ERVBfT1BUU19GSUxFPSRDQVNTQU5EUkFfQ09ORi9qdm0xNyR7anZtb3B0aW9uc192YXJpYW50Oi0tY2xpZW50c30ub3B0aW9ucworZWxpZiBbICRKQVZBX1ZFUlNJT04gLWdlIDExIF0gOyB0aGVuCiAgICAgSlZNX0RFUF9PUFRTX0ZJTEU9JENBU1NBTkRSQV9DT05GL2p2bTExJHtqdm1vcHRpb25zX3ZhcmlhbnQ6LS1jbGllbnRzfS5vcHRpb25zCiBlbHNlCiAgICAgSlZNX0RFUF9PUFRTX0ZJTEU9JENBU1NBTkRSQV9DT05GL2p2bTgke2p2bW9wdGlvbnNfdmFyaWFudDotLWNsaWVudHN9Lm9wdGlvbnMKZGlmZiAtLWdpdCBhL3Rvb2xzL2Jpbi9zc3RhYmxlcGFydGl0aW9ucyBiL3Rvb2xzL2Jpbi9zc3RhYmxlcGFydGl0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hNWYzMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYmluL3NzdGFibGVwYXJ0aXRpb25zCkBAIC0wLDAgKzEsNDkgQEAKKyMhL2Jpbi9zaAorCisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpZiBbICJ4JENBU1NBTkRSQV9JTkNMVURFIiA9ICJ4IiBdOyB0aGVuCisgICAgIyBMb2NhdGlvbnMgKGluIG9yZGVyKSB0byB1c2Ugd2hlbiBzZWFyY2hpbmcgZm9yIGFuIGluY2x1ZGUgZmlsZS4KKyAgICBmb3IgaW5jbHVkZSBpbiAiYGRpcm5hbWUgIiQwImAvY2Fzc2FuZHJhLmluLnNoIiBcCisgICAgICAgICAgICAgICAgICAgIiRIT01FLy5jYXNzYW5kcmEuaW4uc2giIFwKKyAgICAgICAgICAgICAgICAgICAvdXNyL3NoYXJlL2Nhc3NhbmRyYS9jYXNzYW5kcmEuaW4uc2ggXAorICAgICAgICAgICAgICAgICAgIC91c3IvbG9jYWwvc2hhcmUvY2Fzc2FuZHJhL2Nhc3NhbmRyYS5pbi5zaCBcCisgICAgICAgICAgICAgICAgICAgL29wdC9jYXNzYW5kcmEvY2Fzc2FuZHJhLmluLnNoOyBkbworICAgICAgICBpZiBbIC1yICIkaW5jbHVkZSIgXTsgdGhlbgorICAgICAgICAgICAgLiAiJGluY2x1ZGUiCisgICAgICAgICAgICBicmVhaworICAgICAgICBmaQorICAgIGRvbmUKK2VsaWYgWyAtciAiJENBU1NBTkRSQV9JTkNMVURFIiBdOyB0aGVuCisgICAgLiAiJENBU1NBTkRSQV9JTkNMVURFIgorZmkKKworaWYgWyAteiAiJENMQVNTUEFUSCIgXTsgdGhlbgorICAgIGVjaG8gIllvdSBtdXN0IHNldCB0aGUgQ0xBU1NQQVRIIHZhciIgPiYyCisgICAgZXhpdCAxCitmaQorCitpZiBbICJ4JE1BWF9IRUFQX1NJWkUiID0gIngiIF07IHRoZW4KKyAgICBNQVhfSEVBUF9TSVpFPSIyNTZNIgorZmkKKworIiRKQVZBIiAkSkFWQV9BR0VOVCAtZWEgLWNwICIkQ0xBU1NQQVRIIiAkSlZNX09QVFMgLVhteCRNQVhfSEVBUF9TSVpFIFwKKyAgICAgICAgLURjYXNzYW5kcmEuc3RvcmFnZWRpcj0iJGNhc3NhbmRyYV9zdG9yYWdlZGlyIiBcCisgICAgICAgIC1EbG9nYmFjay5jb25maWd1cmF0aW9uRmlsZT1sb2diYWNrLXRvb2xzLnhtbCBcCisgICAgICAgIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnRvb2xzLlNTVGFibGVQYXJ0aXRpb25zICIkQCIKKworIyB2aTphaSBzdz00IHRzPTQgdHc9MCBldApkaWZmIC0tZ2l0IGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1N0cmVzc0NRTFNTVGFibGVXcml0ZXIuamF2YSBiL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvaW8vc3N0YWJsZS9TdHJlc3NDUUxTU1RhYmxlV3JpdGVyLmphdmEKaW5kZXggOGFhOTg2Ny4uY2RkMDVlYyAxMDA2NDQKLS0tIGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9pby9zc3RhYmxlL1N0cmVzc0NRTFNTVGFibGVXcml0ZXIuamF2YQorKysgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL2lvL3NzdGFibGUvU3RyZXNzQ1FMU1NUYWJsZVdyaXRlci5qYXZhCkBAIC0yMSwyMiArMjEsMjIgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OworaW1wb3J0IGphdmEudXRpbC5VVUlEOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5BcnJheVV0aWxzOwogCiBpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5DcmVhdGVUYWJsZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVR5cGVTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlSWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlRhYmxlTWV0YWRhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hOwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5TY2hlbWFUcmFuc2Zvcm1hdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DUUxGcmFnbWVudFBhcnNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNRTFN0YXRlbWVudDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLkNvbHVtblNwZWNpZmljYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5DcWxQYXJzZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5RdWVyeU9wdGlvbnM7CkBAIC00NCw3ICs0NCwxMiBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLlVESGVscGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNxbDMuZnVuY3Rpb25zLnR5cGVzLlR5cGVDb2RlYzsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuVXBkYXRlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLio7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY3FsMy5zdGF0ZW1lbnRzLnNjaGVtYS5DcmVhdGVUYWJsZVN0YXRlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVR5cGVTdGF0ZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGIuQ2x1c3RlcmluZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5Db2x1bW5GYW1pbHlTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5EaXJlY3RvcmllczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5LZXlzcGFjZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuSVBhcnRpdGlvbmVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRodC5NdXJtdXIzUGFydGl0aW9uZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZXhjZXB0aW9ucy5JbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbjsKQEAgLTUzLDYgKzU4LDEwIEBACiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VNZXRhZGF0YTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuS2V5c3BhY2VQYXJhbXM7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc2NoZW1hLlNjaGVtYTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zY2hlbWEuU2NoZW1hVHJhbnNmb3JtYXRpb25zOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZUlkOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UYWJsZU1ldGFkYXRhUmVmOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnNjaGVtYS5UeXBlczsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zZXJ2aWNlLkNsaWVudFN0YXRlOwpAQCAtMzQ1LDcgKzM1NCw3IEBACiAgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxGaWxlPiBkaXJlY3RvcnlMaXN0OwogICAgICAgICBwcml2YXRlIENvbHVtbkZhbWlseVN0b3JlIGNmczsKIAotICAgICAgICBwcm90ZWN0ZWQgU1NUYWJsZUZvcm1hdC5UeXBlIGZvcm1hdFR5cGUgPSBudWxsOworICAgICAgICBwcm90ZWN0ZWQgU1NUYWJsZUZvcm1hdDw/LCA/PiBmb3JtYXQgPSBudWxsOwogCiAgICAgICAgIHByaXZhdGUgQm9vbGVhbiBtYWtlUmFuZ2VBd2FyZSA9IGZhbHNlOwogCkBAIC01ODEsOCArNTkwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgU1NUYWJsZVNpbXBsZVdyaXRlcihjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXREaXJlY3RvcnlGb3JOZXdTU1RhYmxlcygpLCBjZnMubWV0YWRhdGEsIHByZXBhcmVkSW5zZXJ0LnVwZGF0ZWRDb2x1bW5zKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFNTVGFibGVTaW1wbGVVbnNvcnRlZFdyaXRlcihjZnMuZ2V0RGlyZWN0b3JpZXMoKS5nZXREaXJlY3RvcnlGb3JOZXdTU1RhYmxlcygpLCBjZnMubWV0YWRhdGEsIHByZXBhcmVkSW5zZXJ0LnVwZGF0ZWRDb2x1bW5zKCksIGJ1ZmZlclNpemVJbk1pQik7CiAKLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0VHlwZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuc2V0U1NUYWJsZUZvcm1hdFR5cGUoZm9ybWF0VHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICB3cml0ZXIuc2V0U1NUYWJsZUZvcm1hdFR5cGUoZm9ybWF0KTsKIAogICAgICAgICAgICAgICAgIHdyaXRlci5zZXRSYW5nZUF3YXJlV3JpdGluZyhtYWtlUmFuZ2VBd2FyZSk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL0NvbXBhY3Rpb25TdHJlc3MuamF2YSBiL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL0NvbXBhY3Rpb25TdHJlc3MuamF2YQppbmRleCAwZTdlZWM1Li45ODI5ZDU2IDEwMDY0NAotLS0gYS90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9Db21wYWN0aW9uU3RyZXNzLmphdmEKKysrIGIvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3MvQ29tcGFjdGlvblN0cmVzcy5qYXZhCkBAIC0yMSw3ICsyMSwxMiBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLklPRXJyb3I7CiBpbXBvcnQgamF2YS5uZXQuVVJJOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CkBAIC0zMSw3ICszNiwxMSBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50LlVuaW50ZXJydXB0aWJsZXM7CiAKLWltcG9ydCBpby5haXJsaWZ0LmFpcmxpbmUuKjsKK2ltcG9ydCBpby5haXJsaWZ0LmFpcmxpbmUuQ2xpOworaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5Db21tYW5kOworaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5IZWxwOworaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5IZWxwT3B0aW9uOworaW1wb3J0IGlvLmFpcmxpZnQuYWlybGluZS5PcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkRhdGFiYXNlRGVzY3JpcHRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jcWwzLnN0YXRlbWVudHMuc2NoZW1hLkNyZWF0ZVRhYmxlU3RhdGVtZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmRiLkNvbHVtbkZhbWlseVN0b3JlOwpAQCAtNDEsOSArNTAsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kYi5saWZlY3ljbGUuTGlmZWN5Y2xlVHJhbnNhY3Rpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuZGh0LklQYXJ0aXRpb25lcjsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5kaHQuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5TdHJlc3NDUUxTU1RhYmxlV3JpdGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuQ29tcG9uZW50OwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5pby5zc3RhYmxlLlN0cmVzc0NRTFNTVGFibGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8uc3N0YWJsZS5mb3JtYXQuU1NUYWJsZUZvcm1hdC5Db21wb25lbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnNzdGFibGUuZm9ybWF0LlNTVGFibGVSZWFkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEubG9jYXRvci5JbmV0QWRkcmVzc0FuZFBvcnQ7CkBAIC0xMzEsNyArMTQxLDcgQEAKICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PERlc2NyaXB0b3IsIFNldDxDb21wb25lbnQ+PiBlbnRyeSA6IGxpc3Rlci5saXN0KCkuZW50cnlTZXQoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBTZXQ8Q29tcG9uZW50PiBjb21wb25lbnRzID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudHMuY29udGFpbnMoQ29tcG9uZW50LkRBVEEpKQorICAgICAgICAgICAgICAgIGlmICghY29tcG9uZW50cy5jb250YWlucyhDb21wb25lbnRzLkRBVEEpKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAgICAgICAgIHRyeQpkaWZmIC0tZ2l0IGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3MvU3RyZXNzR3JhcGguamF2YSBiL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL1N0cmVzc0dyYXBoLmphdmEKaW5kZXggNzZhODZkYi4uOWIzOGJiOCAxMDA2NDQKLS0tIGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3MvU3RyZXNzR3JhcGguamF2YQorKysgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9TdHJlc3NHcmFwaC5qYXZhCkBAIC0yOCwxOCArMjgsMTcgQEAKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKIGltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CiBpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5CeXRlU3RyZWFtczsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzMuU3RyaW5nVXRpbHM7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQubm9kZS5BcnJheU5vZGU7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuT2JqZWN0Tm9kZTsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3MucmVwb3J0LlN0cmVzc01ldHJpY3M7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnNldHRpbmdzLlN0cmVzc1NldHRpbmdzOwotaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OQXJyYXk7Ci1pbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05PYmplY3Q7Ci1pbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05WYWx1ZTsKLQoraW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnV0aWxzLkpzb25VdGlsczsKIAogcHVibGljIGNsYXNzIFN0cmVzc0dyYXBoCiB7CkBAIC02Miw3ICs2MSw3IEBACiAgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVHcmFwaCgpCiAgICAgewogICAgICAgICBGaWxlIGh0bWxGaWxlID0gbmV3IEZpbGUoc3RyZXNzU2V0dGluZ3MuZ3JhcGguZmlsZSk7Ci0gICAgICAgIEpTT05PYmplY3Qgc3RhdHM7CisgICAgICAgIE9iamVjdE5vZGUgc3RhdHM7CiAgICAgICAgIGlmIChodG1sRmlsZS5pc0ZpbGUoKSkKICAgICAgICAgewogICAgICAgICAgICAgdHJ5CkBAIC04NCw3ICs4Myw3IEBACiAgICAgICAgIHRyeQogICAgICAgICB7CiAgICAgICAgICAgICBQcmludFdyaXRlciBvdXQgPSBuZXcgUHJpbnRXcml0ZXIoaHRtbEZpbGUpOwotICAgICAgICAgICAgU3RyaW5nIHN0YXRzQmxvY2sgPSAiLyogc3RhdHMgc3RhcnQgKi9cbnN0YXRzID0gIiArIHN0YXRzLnRvSlNPTlN0cmluZygpICsgIjtcbi8qIHN0YXRzIGVuZCAqL1xuIjsKKyAgICAgICAgICAgIFN0cmluZyBzdGF0c0Jsb2NrID0gIi8qIHN0YXRzIHN0YXJ0ICovXG5zdGF0cyA9ICIgKyBKc29uVXRpbHMud3JpdGVBc0pzb25TdHJpbmcoc3RhdHMpICsgIjtcbi8qIHN0YXRzIGVuZCAqL1xuIjsKICAgICAgICAgICAgIFN0cmluZyBodG1sID0gZ2V0R3JhcGhIVE1MKCkucmVwbGFjZUZpcnN0KCIvXFwqIHN0YXRzIHN0YXJ0IFxcKi9cblxuL1xcKiBzdGF0cyBlbmQgXFwqL1xuIiwgc3RhdHNCbG9jayk7CiAgICAgICAgICAgICBvdXQud3JpdGUoaHRtbCk7CiAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKQEAgLTk1LDE2ICs5NCwxOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBKU09OT2JqZWN0IHBhcnNlRXhpc3RpbmdTdGF0cyhTdHJpbmcgaHRtbCkKKyAgICBwcml2YXRlIE9iamVjdE5vZGUgcGFyc2VFeGlzdGluZ1N0YXRzKFN0cmluZyBodG1sKQogICAgIHsKLSAgICAgICAgSlNPTk9iamVjdCBzdGF0czsKLQogICAgICAgICBQYXR0ZXJuIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUoIig/cykuKi9cXCogc3RhdHMgc3RhcnQgXFwqL1xcbnN0YXRzID0gKC4qKTtcXG4vXFwqIHN0YXRzIGVuZCBcXCovLioiKTsKICAgICAgICAgTWF0Y2hlciBtYXRjaGVyID0gcGF0dGVybi5tYXRjaGVyKGh0bWwpOwogICAgICAgICBtYXRjaGVyLm1hdGNoZXMoKTsKLSAgICAgICAgc3RhdHMgPSAoSlNPTk9iamVjdCkgSlNPTlZhbHVlLnBhcnNlKG1hdGNoZXIuZ3JvdXAoMSkpOwotCi0gICAgICAgIHJldHVybiBzdGF0czsKKyAgICAgICAgdHJ5CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoT2JqZWN0Tm9kZSkgSnNvblV0aWxzLkpTT05fT0JKRUNUX01BUFBFUi5yZWFkVHJlZShtYXRjaGVyLmdyb3VwKDEpKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKKyAgICAgICAgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkbid0IHBhcnNlciBzdGF0cyBqc29uOiAiK2UuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHByaXZhdGUgU3RyaW5nIGdldEdyYXBoSFRNTCgpCkBAIC0xMjAsMTAgKzEyMiwxMCBAQAogICAgIH0KIAogICAgIC8qKiBQYXJzZSBsb2cgYW5kIGFwcGVuZCB0byBzdGF0cyBhcnJheSAqLwotICAgIHByaXZhdGUgSlNPTkFycmF5IHBhcnNlTG9nU3RhdHMoSW5wdXRTdHJlYW0gbG9nLCBKU09OQXJyYXkgc3RhdHMpIHsKKyAgICBwcml2YXRlIEFycmF5Tm9kZSBwYXJzZUxvZ1N0YXRzKElucHV0U3RyZWFtIGxvZywgQXJyYXlOb2RlIHN0YXRzKSB7CiAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIobG9nKSk7Ci0gICAgICAgIEpTT05PYmplY3QganNvbiA9IG5ldyBKU09OT2JqZWN0KCk7Ci0gICAgICAgIEpTT05BcnJheSBpbnRlcnZhbHMgPSBuZXcgSlNPTkFycmF5KCk7CisgICAgICAgIE9iamVjdE5vZGUganNvbiA9IEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVIuY3JlYXRlT2JqZWN0Tm9kZSgpOworICAgICAgICBBcnJheU5vZGUgaW50ZXJ2YWxzID0gSnNvblV0aWxzLkpTT05fT0JKRUNUX01BUFBFUi5jcmVhdGVBcnJheU5vZGUoKTsKICAgICAgICAgYm9vbGVhbiBydW5uaW5nTXVsdGlwbGVUaHJlYWRDb3VudHMgPSBmYWxzZTsKICAgICAgICAgU3RyaW5nIGN1cnJlbnRUaHJlYWRDb3VudCA9IG51bGw7CiAgICAgICAgIFBhdHRlcm4gdGhyZWFkQ291bnRNZXNzYWdlID0gUGF0dGVybi5jb21waWxlKCJSdW5uaW5nIChbQS1aXSspIHdpdGggKFswLTldKykgdGhyZWFkcyAuKiIpOwpAQCAtMTcxLDcgKzE3Myw3IEBACiAgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBsaW5lcwogICAgICAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRpbmdNb2RlLk1FVFJJQ1MpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBKU09OQXJyYXkgbWV0cmljcyA9IG5ldyBKU09OQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlOb2RlIG1ldHJpY3MgPSBKc29uVXRpbHMuSlNPTl9PQkpFQ1RfTUFQUEVSLmNyZWF0ZUFycmF5Tm9kZSgpOwogICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGxpbmUuc3BsaXQoIiwiKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPSBTdHJlc3NNZXRyaWNzLkhFQURNRVRSSUNTLmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgewpAQCAtMTg1LDcgKzE4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpCiAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy5hZGQobnVsbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy5hZGROdWxsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWxzLmFkZChtZXRyaWNzKTsKQEAgLTIwMyw3ICsyMDUsMTAgQEAKICAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlID09IFJlYWRpbmdNb2RlLk5FWFRJVEVSQVRJT04pCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAvL1dyYXAgdXAgdGhlIHJlc3VsdHMgb2YgdGhpcyB0ZXN0IGFuZCBhcHBlbmQgdG8gdGhlIGFycmF5LgotICAgICAgICAgICAgICAgICAgICBqc29uLnB1dCgibWV0cmljcyIsIEFycmF5cy5hc0xpc3QoU3RyZXNzTWV0cmljcy5IRUFETUVUUklDUykpOworICAgICAgICAgICAgICAgICAgICBBcnJheU5vZGUgbWV0cmljcyA9IGpzb24ucHV0QXJyYXkoIm1ldHJpY3MiKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbWV0cmljIDogU3RyZXNzTWV0cmljcy5IRUFETUVUUklDUykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy5hZGQobWV0cmljKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBqc29uLnB1dCgidGVzdCIsIHN0cmVzc1NldHRpbmdzLmdyYXBoLm9wZXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VGhyZWFkQ291bnQgPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgIGpzb24ucHV0KCJyZXZpc2lvbiIsIHN0cmVzc1NldHRpbmdzLmdyYXBoLnJldmlzaW9uKTsKQEAgLTIxMSwxMiArMjE2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBqc29uLnB1dCgicmV2aXNpb24iLCBTdHJpbmcuZm9ybWF0KCIlcyAtICVzIHRocmVhZHMiLCBzdHJlc3NTZXR0aW5ncy5ncmFwaC5yZXZpc2lvbiwgY3VycmVudFRocmVhZENvdW50KSk7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21tYW5kID0gU3RyaW5nVXRpbHMuam9pbihzdHJlc3NBcmd1bWVudHMsICIgIikucmVwbGFjZUFsbCgicGFzc3dvcmQ9Lio/ICIsICJwYXNzd29yZD0qKioqKioqICIpOwogICAgICAgICAgICAgICAgICAgICBqc29uLnB1dCgiY29tbWFuZCIsIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgICAgICBqc29uLnB1dCgiaW50ZXJ2YWxzIiwgaW50ZXJ2YWxzKTsKKyAgICAgICAgICAgICAgICAgICAganNvbi5zZXQoImludGVydmFscyIsIGludGVydmFscyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRzLmFkZChqc29uKTsKIAogICAgICAgICAgICAgICAgICAgICAvL1N0YXJ0IGZyZXNoIGZvciBuZXh0IGl0ZXJhdGlvbjoKLSAgICAgICAgICAgICAgICAgICAganNvbiA9IG5ldyBKU09OT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGludGVydmFscyA9IG5ldyBKU09OQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAganNvbiA9IEpzb25VdGlscy5KU09OX09CSkVDVF9NQVBQRVIuY3JlYXRlT2JqZWN0Tm9kZSgpOworICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbHMgPSBKc29uVXRpbHMuSlNPTl9PQkpFQ1RfTUFQUEVSLmNyZWF0ZUFycmF5Tm9kZSgpOwogICAgICAgICAgICAgICAgICAgICBtb2RlID0gUmVhZGluZ01vZGUuU1RBUlQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjI5LDI1ICsyMzQsMjUgQEAKICAgICAgICAgcmV0dXJuIHN0YXRzOwogICAgIH0KIAotICAgIHByaXZhdGUgSlNPTk9iamVjdCBjcmVhdGVKU09OU3RhdHMoSlNPTk9iamVjdCBqc29uKQorICAgIHByaXZhdGUgT2JqZWN0Tm9kZSBjcmVhdGVKU09OU3RhdHMoT2JqZWN0Tm9kZSBqc29uKQogICAgIHsKICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBsb2dTdHJlYW0gPSBGaWxlcy5uZXdJbnB1dFN0cmVhbShzdHJlc3NTZXR0aW5ncy5ncmFwaC50ZW1wb3JhcnlMb2dGaWxlLnRvUGF0aCgpKSkKICAgICAgICAgewotICAgICAgICAgICAgSlNPTkFycmF5IHN0YXRzOworICAgICAgICAgICAgQXJyYXlOb2RlIHN0YXRzOwogICAgICAgICAgICAgaWYgKGpzb24gPT0gbnVsbCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBqc29uID0gbmV3IEpTT05PYmplY3QoKTsKLSAgICAgICAgICAgICAgICBzdGF0cyA9IG5ldyBKU09OQXJyYXkoKTsKKyAgICAgICAgICAgICAgICBqc29uID0gSnNvblV0aWxzLkpTT05fT0JKRUNUX01BUFBFUi5jcmVhdGVPYmplY3ROb2RlKCk7CisgICAgICAgICAgICAgICAgc3RhdHMgPSBKc29uVXRpbHMuSlNPTl9PQkpFQ1RfTUFQUEVSLmNyZWF0ZUFycmF5Tm9kZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0YXRzID0gKEpTT05BcnJheSkganNvbi5nZXQoInN0YXRzIik7CisgICAgICAgICAgICAgICAgc3RhdHMgPSAoQXJyYXlOb2RlKSBqc29uLmdldCgic3RhdHMiKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3RhdHMgPSBwYXJzZUxvZ1N0YXRzKGxvZ1N0cmVhbSwgc3RhdHMpOwogCiAgICAgICAgICAgICBqc29uLnB1dCgidGl0bGUiLCBzdHJlc3NTZXR0aW5ncy5ncmFwaC50aXRsZSk7Ci0gICAgICAgICAgICBqc29uLnB1dCgic3RhdHMiLCBzdGF0cyk7CisgICAgICAgICAgICBqc29uLnNldCgic3RhdHMiLCBzdGF0cyk7CiAgICAgICAgICAgICByZXR1cm4ganNvbjsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3JlcG9ydC9TdHJlc3NNZXRyaWNzLmphdmEgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9yZXBvcnQvU3RyZXNzTWV0cmljcy5qYXZhCmluZGV4IGI1MGRmZDIuLjg1NzliYmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3JlcG9ydC9TdHJlc3NNZXRyaWNzLmphdmEKKysrIGIvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3MvcmVwb3J0L1N0cmVzc01ldHJpY3MuamF2YQpAQCAtODMsMTEgKzgzLDE0IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxPcE1lYXN1cmVtZW50PiBsZWZ0b3ZlcnMgPSBuZXcgQXJyYXlEZXF1ZTw+KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBUaW1pbmdJbnRlcnZhbCB0b3RhbEN1cnJlbnRJbnRlcnZhbDsKICAgICBwcml2YXRlIGZpbmFsIFRpbWluZ0ludGVydmFsIHRvdGFsU3VtbWFyeUludGVydmFsOworICAgIHByaXZhdGUgZmluYWwgaW50IG91dHB1dEZyZXF1ZW5jeUluU2Vjb25kczsKKyAgICBwcml2YXRlIGZpbmFsIGludCBoZWFkZXJGcmVxdWVuY3lJblNlY29uZHM7CisgICAgcHJpdmF0ZSBpbnQgb3V0cHV0TGluZXMgPSAwOwogCiAgICAgcHVibGljIFN0cmVzc01ldHJpY3MoUmVzdWx0TG9nZ2VyIG91dHB1dCwgZmluYWwgbG9uZyBsb2dJbnRlcnZhbE1pbGxpcywgU3RyZXNzU2V0dGluZ3Mgc2V0dGluZ3MpCiAgICAgewogICAgICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKLSAgICAgICAgaWYoc2V0dGluZ3MubG9nLmhkckZpbGUgIT0gbnVsbCkKKyAgICAgICAgaWYgKHNldHRpbmdzLmxvZy5oZHJGaWxlICE9IG51bGwpCiAgICAgICAgIHsKICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgewpAQCAtMTE0LDcgKzExNyw4IEBACiAgICAgICAgIHRyeQogICAgICAgICB7CiAgICAgICAgICAgICBnY1N0YXRzQ29sbGVjdG9yID0gbmV3IEpteENvbGxlY3Rvcih0b0pteE5vZGVzKHNldHRpbmdzLm5vZGUucmVzb2x2ZUFsbFBlcm1pdHRlZChzZXR0aW5ncykpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MucG9ydC5qbXhQb3J0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnBvcnQuam14UG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLmpteCk7CiAgICAgICAgIH0KICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQogICAgICAgICB7CkBAIC0xMzMsNiArMTM3LDggQEAKICAgICAgICAgICAgIHJlcG9ydGluZ0xvb3AobG9nSW50ZXJ2YWxNaWxsaXMpOwogICAgICAgICB9KTsKICAgICAgICAgdGhyZWFkLnNldE5hbWUoIlN0cmVzc01ldHJpY3MiKTsKKyAgICAgICAgaGVhZGVyRnJlcXVlbmN5SW5TZWNvbmRzID0gc2V0dGluZ3MucmVwb3J0aW5nLmhlYWRlckZyZXF1ZW5jeTsKKyAgICAgICAgb3V0cHV0RnJlcXVlbmN5SW5TZWNvbmRzID0gc2V0dGluZ3MucmVwb3J0aW5nLm91dHB1dEZyZXF1ZW5jeTsKICAgICB9CiAgICAgcHVibGljIHZvaWQgc3RhcnQoKQogICAgIHsKQEAgLTI2Miw3ICsyNjgsMTIgQEAKICAgICAgICAgICAgICAgICBvcEludGVydmFsLnJlc2V0KCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHByaW50Um93KCIiLCAidG90YWwiLCB0b3RhbEN1cnJlbnRJbnRlcnZhbCwgdG90YWxTdW1tYXJ5SW50ZXJ2YWwsIGdjU3RhdHMsIHJvd1JhdGVVbmNlcnRhaW50eSwgb3V0cHV0KTsKKyAgICAgICAgICAgICsrb3V0cHV0TGluZXM7CisgICAgICAgICAgICBpZiAob3V0cHV0RnJlcXVlbmN5SW5TZWNvbmRzID09IDAgfHwgb3V0cHV0TGluZXMgJSBvdXRwdXRGcmVxdWVuY3lJblNlY29uZHMgPT0gMCkKKyAgICAgICAgICAgICAgICBwcmludFJvdygiIiwgInRvdGFsIiwgdG90YWxDdXJyZW50SW50ZXJ2YWwsIHRvdGFsU3VtbWFyeUludGVydmFsLCBnY1N0YXRzLCByb3dSYXRlVW5jZXJ0YWludHksIG91dHB1dCk7CisgICAgICAgICAgICBpZiAoaGVhZGVyRnJlcXVlbmN5SW5TZWNvbmRzICE9IDAgJiYgb3V0cHV0TGluZXMgJSBoZWFkZXJGcmVxdWVuY3lJblNlY29uZHMgPT0gMCkKKyAgICAgICAgICAgICAgICBwcmludEhlYWRlcigiXG4iLCBvdXRwdXQpOworCiAgICAgICAgICAgICB0b3RhbEN1cnJlbnRJbnRlcnZhbC5yZXNldCgpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3Mvc2V0dGluZ3MvQ2xpT3B0aW9uLmphdmEgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9DbGlPcHRpb24uamF2YQppbmRleCBlYmEyNzZlLi41NTA0NjcxIDEwMDY0NAotLS0gYS90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9DbGlPcHRpb24uamF2YQorKysgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9DbGlPcHRpb24uamF2YQpAQCAtMzcsOCArMzcsMTEgQEAKICAgICBMT0coIldoZXJlIHRvIGxvZyBwcm9ncmVzcyB0bywgYW5kIHRoZSBpbnRlcnZhbCBhdCB3aGljaCB0byBkbyBpdCIsIFNldHRpbmdzTG9nLmhlbHBQcmludGVyKCkpLAogICAgIFRSQU5TUE9SVCgiQ3VzdG9tIHRyYW5zcG9ydCBmYWN0b3JpZXMiLCBTZXR0aW5nc1RyYW5zcG9ydC5oZWxwUHJpbnRlcigpKSwKICAgICBQT1JUKCJUaGUgcG9ydCB0byBjb25uZWN0IHRvIGNhc3NhbmRyYSBub2RlcyBvbiIsIFNldHRpbmdzUG9ydC5oZWxwUHJpbnRlcigpKSwKKyAgICBKTVgoIkpNWCBjcmVkZW50aWFscyIsIFNldHRpbmdzSk1YLmhlbHBQcmludGVyKCkpLAogICAgIEdSQVBIKCItZ3JhcGgiLCAiR3JhcGggcmVjb3JkZWQgbWV0cmljcyIsIFNldHRpbmdzR3JhcGguaGVscFByaW50ZXIoKSksCi0gICAgVE9LRU5SQU5HRSgiVG9rZW4gcmFuZ2Ugc2V0dGluZ3MiLCBTZXR0aW5nc1Rva2VuUmFuZ2UuaGVscFByaW50ZXIoKSkKKyAgICBUT0tFTlJBTkdFKCJUb2tlbiByYW5nZSBzZXR0aW5ncyIsIFNldHRpbmdzVG9rZW5SYW5nZS5oZWxwUHJpbnRlcigpKSwKKyAgICBDUkVERU5USUFMU19GSUxFKCJDcmVkZW50aWFscyBmaWxlIGZvciBDUUwsIEpNWCBhbmQgdHJhbnNwb3J0IiwgU2V0dGluZ3NDcmVkZW50aWFscy5oZWxwUHJpbnRlcigpKSwKKyAgICBSRVBPUlRJTkcoIkZyZXF1ZW5jeSBvZiBwcmludGluZyBzdGF0aXN0aWNzIGFuZCBoZWFkZXIgZm9yIHN0cmVzcyBvdXRwdXQiLCBTZXR0aW5nc1JlcG9ydGluZy5oZWxwUHJpbnRlcigpKTsKICAgICA7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBDbGlPcHRpb24+IExPT0tVUDsKQEAgLTYzLDExICs2NiwxMiBAQAogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb247CiAgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBoZWxwUHJpbnRlcjsKIAotICAgIHByaXZhdGUgQ2xpT3B0aW9uKFN0cmluZyBkZXNjcmlwdGlvbiwgUnVubmFibGUgaGVscFByaW50ZXIpCisgICAgQ2xpT3B0aW9uKFN0cmluZyBkZXNjcmlwdGlvbiwgUnVubmFibGUgaGVscFByaW50ZXIpCiAgICAgewogICAgICAgICB0aGlzKG51bGwsIGRlc2NyaXB0aW9uLCBoZWxwUHJpbnRlcik7CiAgICAgfQotICAgIHByaXZhdGUgQ2xpT3B0aW9uKFN0cmluZyBleHRyYU5hbWUsIFN0cmluZyBkZXNjcmlwdGlvbiwgUnVubmFibGUgaGVscFByaW50ZXIpCisKKyAgICBDbGlPcHRpb24oU3RyaW5nIGV4dHJhTmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uLCBSdW5uYWJsZSBoZWxwUHJpbnRlcikKICAgICB7CiAgICAgICAgIHRoaXMuZXh0cmFOYW1lID0gZXh0cmFOYW1lOwogICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CkBAIC03OSw0ICs4Myw4IEBACiAgICAgICAgIGhlbHBQcmludGVyLnJ1bigpOwogICAgIH0KIAorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5hbWUoKS5yZXBsYWNlQWxsKCJfIiwgIi0iKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc0NyZWRlbnRpYWxzLmphdmEgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc0NyZWRlbnRpYWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1MTNiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1NldHRpbmdzQ3JlZGVudGlhbHMuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3M7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3MudXRpbC5SZXN1bHRMb2dnZXI7CisKK3B1YmxpYyBjbGFzcyBTZXR0aW5nc0NyZWRlbnRpYWxzIGltcGxlbWVudHMgU2VyaWFsaXphYmxlCit7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1FMX1VTRVJOQU1FX1BST1BFUlRZX0tFWSA9ICJjcWwudXNlcm5hbWUiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENRTF9QQVNTV09SRF9QUk9QRVJUWV9LRVkgPSAiY3FsLnBhc3N3b3JkIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKTVhfVVNFUk5BTUVfUFJPUEVSVFlfS0VZID0gImpteC51c2VybmFtZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk1YX1BBU1NXT1JEX1BST1BFUlRZX0tFWSA9ICJqbXgucGFzc3dvcmQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TUE9SVF9UUlVTVFNUT1JFX1BBU1NXT1JEX1BST1BFUlRZX0tFWSA9ICJ0cmFuc3BvcnQudHJ1c3RzdG9yZS5wYXNzd29yZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNQT1JUX0tFWVNUT1JFX1BBU1NXT1JEX1BST1BFUlRZX0tFWSA9ICJ0cmFuc3BvcnQua2V5c3RvcmUucGFzc3dvcmQiOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZTsKKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY3FsVXNlcm5hbWU7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBjcWxQYXNzd29yZDsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGpteFVzZXJuYW1lOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgam14UGFzc3dvcmQ7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0cmFuc3BvcnRUcnVzdHN0b3JlUGFzc3dvcmQ7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0cmFuc3BvcnRLZXlzdG9yZVBhc3N3b3JkOworCisgICAgcHVibGljIFNldHRpbmdzQ3JlZGVudGlhbHMoU3RyaW5nIGZpbGUpCisgICAgeworICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOworICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBjcWxVc2VybmFtZSA9IG51bGw7CisgICAgICAgICAgICBjcWxQYXNzd29yZCA9IG51bGw7CisgICAgICAgICAgICBqbXhVc2VybmFtZSA9IG51bGw7CisgICAgICAgICAgICBqbXhQYXNzd29yZCA9IG51bGw7CisgICAgICAgICAgICB0cmFuc3BvcnRUcnVzdHN0b3JlUGFzc3dvcmQgPSBudWxsOworICAgICAgICAgICAgdHJhbnNwb3J0S2V5c3RvcmVQYXNzd29yZCA9IG51bGw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkKKyAgICAgICAgeworICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGZpbGUpLnRvSmF2YUlPRmlsZSgpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmxvYWQoaXMpOworCisgICAgICAgICAgICAgICAgY3FsVXNlcm5hbWUgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KENRTF9VU0VSTkFNRV9QUk9QRVJUWV9LRVkpOworICAgICAgICAgICAgICAgIGNxbFBhc3N3b3JkID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShDUUxfUEFTU1dPUkRfUFJPUEVSVFlfS0VZKTsKKyAgICAgICAgICAgICAgICBqbXhVc2VybmFtZSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSk1YX1VTRVJOQU1FX1BST1BFUlRZX0tFWSk7CisgICAgICAgICAgICAgICAgam14UGFzc3dvcmQgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpNWF9QQVNTV09SRF9QUk9QRVJUWV9LRVkpOworICAgICAgICAgICAgICAgIHRyYW5zcG9ydFRydXN0c3RvcmVQYXNzd29yZCA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoVFJBTlNQT1JUX1RSVVNUU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZKTsKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnRLZXlzdG9yZVBhc3N3b3JkID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShUUkFOU1BPUlRfS0VZU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKQorICAgICAgICB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpb2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ0xJIFV0aWxpdHkgTWV0aG9kcworICAgIHB1YmxpYyB2b2lkIHByaW50U2V0dGluZ3MoUmVzdWx0TG9nZ2VyIG91dCkKKyAgICB7CisgICAgICAgIG91dC5wcmludGYoIiAgRmlsZTogJXMlbiIsIGZpbGUgPT0gbnVsbCA/ICIqbm90IHNldCoiIDogZmlsZSk7CisgICAgICAgIG91dC5wcmludGYoIiAgQ1FMIHVzZXJuYW1lOiAlcyVuIiwgY3FsVXNlcm5hbWUgPT0gbnVsbCA/ICIqbm90IHNldCoiIDogY3FsVXNlcm5hbWUpOworICAgICAgICBvdXQucHJpbnRmKCIgIENRTCBwYXNzd29yZDogJXMlbiIsIGNxbFBhc3N3b3JkID09IG51bGwgPyAiKm5vdCBzZXQqIiA6ICIqc3VwcHJlc3NlZCoiKTsKKyAgICAgICAgb3V0LnByaW50ZigiICBKTVggdXNlcm5hbWU6ICVzJW4iLCBqbXhVc2VybmFtZSA9PSBudWxsID8gIipub3Qgc2V0KiIgOiBqbXhVc2VybmFtZSk7CisgICAgICAgIG91dC5wcmludGYoIiAgSk1YIHBhc3N3b3JkOiAlcyVuIiwgam14UGFzc3dvcmQgPT0gbnVsbCA/ICIqbm90IHNldCoiIDogIipzdXBwcmVzc2VkKiIpOworICAgICAgICBvdXQucHJpbnRmKCIgIFRyYW5zcG9ydCB0cnVzdHN0b3JlIHBhc3N3b3JkOiAlcyVuIiwgdHJhbnNwb3J0VHJ1c3RzdG9yZVBhc3N3b3JkID09IG51bGwgPyAiKm5vdCBzZXQqIiA6ICIqc3VwcHJlc3NlZCoiKTsKKyAgICAgICAgb3V0LnByaW50ZigiICBUcmFuc3BvcnQga2V5c3RvcmUgcGFzc3dvcmQ6ICVzJW4iLCB0cmFuc3BvcnRLZXlzdG9yZVBhc3N3b3JkID09IG51bGwgPyAiKm5vdCBzZXQqIiA6ICIqc3VwcHJlc3NlZCoiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFNldHRpbmdzQ3JlZGVudGlhbHMgZ2V0KE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBjbEFyZ3MpCisgICAgeworICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSBjbEFyZ3MucmVtb3ZlKCItY3JlZGVudGlhbHMtZmlsZSIpOworICAgICAgICBpZiAocGFyYW1zID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gbmV3IFNldHRpbmdzQ3JlZGVudGlhbHMobnVsbCk7CisKKyAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgcHJpbnRIZWxwKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkludmFsaWQgLWNyZWRlbnRpYWxzLWZpbGUgb3B0aW9uIHByb3ZpZGVkLCBzZWUgb3V0cHV0IGZvciB2YWxpZCBvcHRpb25zIik7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgU2V0dGluZ3NDcmVkZW50aWFscyhwYXJhbXNbMF0pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEhlbHAoKQorICAgIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogLWNyZWRlbnRpYWxzLWZpbGUgPGZpbGU+ICIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiRmlsZSBpcyBzdXBwb3NlZCB0byBiZSBhIHN0YW5kYXJkIHByb3BlcnR5IGZpbGUgd2l0aCAnJXMnLCAnJXMnLCAnJXMnLCAnJXMnLCAnJXMnLCBhbmQgJyVzJyBhcyBrZXlzLiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB2YWx1ZXMgZm9yIHRoZXNlIGtleXMgd2lsbCBiZSBvdmVycmlkZW4gYnkgdGhlaXIgY29tbWFuZC1saW5lIGNvdW50ZXJwYXJ0cyB3aGVuIHNwZWNpZmllZC4lbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENRTF9VU0VSTkFNRV9QUk9QRVJUWV9LRVksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENRTF9QQVNTV09SRF9QUk9QRVJUWV9LRVksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEpNWF9VU0VSTkFNRV9QUk9QRVJUWV9LRVksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEpNWF9QQVNTV09SRF9QUk9QRVJUWV9LRVksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9LRVlTVE9SRV9QQVNTV09SRF9QUk9QRVJUWV9LRVksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9SVF9UUlVTVFNUT1JFX1BBU1NXT1JEX1BST1BFUlRZX0tFWSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSdW5uYWJsZSBoZWxwUHJpbnRlcigpCisgICAgeworICAgICAgICByZXR1cm4gU2V0dGluZ3NDcmVkZW50aWFsczo6cHJpbnRIZWxwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1NldHRpbmdzSk1YLmphdmEgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc0pNWC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMjAyYmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc0pNWC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnNldHRpbmdzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnV0aWwuUmVzdWx0TG9nZ2VyOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5KTVhfUEFTU1dPUkRfUFJPUEVSVFlfS0VZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5KTVhfVVNFUk5BTUVfUFJPUEVSVFlfS0VZOworCitwdWJsaWMgY2xhc3MgU2V0dGluZ3NKTVggaW1wbGVtZW50cyBTZXJpYWxpemFibGUKK3sKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHVzZXI7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBwYXNzd29yZDsKKworICAgIHB1YmxpYyBTZXR0aW5nc0pNWChPcHRpb25zIG9wdGlvbnMsIFNldHRpbmdzQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMpCisgICAgeworICAgICAgICB0aGlzLnVzZXIgPSBvcHRpb25zLnVzZXIuc2V0QnlVc2VyKCkgPyBvcHRpb25zLnVzZXIudmFsdWUoKSA6IGNyZWRlbnRpYWxzLmpteFVzZXJuYW1lOworICAgICAgICB0aGlzLnBhc3N3b3JkID0gb3B0aW9ucy5wYXNzd29yZC5zZXRCeVVzZXIoKSA/IG9wdGlvbnMucGFzc3dvcmQudmFsdWUoKSA6IGNyZWRlbnRpYWxzLmpteFBhc3N3b3JkOworICAgIH0KKworICAgIC8vIE9wdGlvbiBEZWNsYXJhdGlvbnMKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgT3B0aW9ucyBleHRlbmRzIEdyb3VwZWRPcHRpb25zCisgICAgeworICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgdXNlciA9IG5ldyBPcHRpb25TaW1wbGUoInVzZXI9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJVc2VybmFtZSBmb3IgSk1YIGNvbm5lY3Rpb24sIHdoZW4gc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSB2YWx1ZSBpbiBjcmVkZW50aWFscyBmaWxlIGZvciBrZXkgJyVzJyIsIEpNWF9VU0VSTkFNRV9QUk9QRVJUWV9LRVkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworCisgICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSBwYXNzd29yZCA9IG5ldyBPcHRpb25TaW1wbGUoInBhc3N3b3JkPSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiUGFzc3dvcmQgZm9yIEpNWCBjb25uZWN0aW9uLCB3aGVuIHNwZWNpZmllZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgdmFsdWUgaW4gY3JlZGVudGlhbHMgZmlsZSBmb3Iga2V5ICclcyciLCBKTVhfUEFTU1dPUkRfUFJPUEVSVFlfS0VZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PD8gZXh0ZW5kcyBPcHRpb24+IG9wdGlvbnMoKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCh1c2VyLCBwYXNzd29yZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDTEkgVXRpbGl0eSBNZXRob2RzCisgICAgcHVibGljIHZvaWQgcHJpbnRTZXR0aW5ncyhSZXN1bHRMb2dnZXIgb3V0KQorICAgIHsKKyAgICAgICAgb3V0LnByaW50ZigiICBVc2VybmFtZTogJXMlbiIsIHVzZXIpOworICAgICAgICBvdXQucHJpbnRmKCIgIFBhc3N3b3JkOiAlcyVuIiwgKHBhc3N3b3JkID09IG51bGwgPyAiKm5vdCBzZXQqIiA6ICIqc3VwcHJlc3NlZCoiKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTZXR0aW5nc0pNWCBnZXQoTWFwPFN0cmluZywgU3RyaW5nW10+IGNsQXJncywgU2V0dGluZ3NDcmVkZW50aWFscyBjcmVkZW50aWFscykKKyAgICB7CisgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IGNsQXJncy5yZW1vdmUoIi1qbXgiKTsKKyAgICAgICAgaWYgKHBhcmFtcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nc0pNWChuZXcgU2V0dGluZ3NKTVguT3B0aW9ucygpLCBjcmVkZW50aWFscyk7CisKKyAgICAgICAgR3JvdXBlZE9wdGlvbnMgb3B0aW9ucyA9IEdyb3VwZWRPcHRpb25zLnNlbGVjdChwYXJhbXMsIG5ldyBTZXR0aW5nc0pNWC5PcHRpb25zKCkpOworICAgICAgICBpZiAob3B0aW9ucyA9PSBudWxsKQorICAgICAgICB7CisgICAgICAgICAgICBwcmludEhlbHAoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCAtam14IG9wdGlvbnMgcHJvdmlkZWQsIHNlZSBvdXRwdXQgZm9yIHZhbGlkIG9wdGlvbnMiKTsKKyAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU2V0dGluZ3NKTVgoKFNldHRpbmdzSk1YLk9wdGlvbnMpIG9wdGlvbnMsIGNyZWRlbnRpYWxzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRIZWxwKCkKKyAgICB7CisgICAgICAgIEdyb3VwZWRPcHRpb25zLnByaW50T3B0aW9ucyhTeXN0ZW0ub3V0LCAiLWpteCIsIG5ldyBTZXR0aW5nc0pNWC5PcHRpb25zKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUnVubmFibGUgaGVscFByaW50ZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFNldHRpbmdzSk1YOjpwcmludEhlbHA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3Mvc2V0dGluZ3MvU2V0dGluZ3NNb2RlLmphdmEgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc01vZGUuamF2YQppbmRleCA3ZTUzNTQ3Li5iMDA5ZDA0IDEwMDY0NAotLS0gYS90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc01vZGUuamF2YQorKysgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc01vZGUuamF2YQpAQCAtMzIsNiArMzIsMTAgQEAKIGltcG9ydCBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVzcy51dGlsLlJlc3VsdExvZ2dlcjsKIAoraW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nLmZvcm1hdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnNldHRpbmdzLlNldHRpbmdzQ3JlZGVudGlhbHMuQ1FMX1BBU1NXT1JEX1BST1BFUlRZX0tFWTsKK2ltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnNldHRpbmdzLlNldHRpbmdzQ3JlZGVudGlhbHMuQ1FMX1VTRVJOQU1FX1BST1BFUlRZX0tFWTsKKwogcHVibGljIGNsYXNzIFNldHRpbmdzTW9kZSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQogewogCkBAIC01MSw3ICs1NSw3IEBACiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29tcHJlc3Npb247CiAKIAotICAgIHB1YmxpYyBTZXR0aW5nc01vZGUoR3JvdXBlZE9wdGlvbnMgb3B0aW9ucykKKyAgICBwdWJsaWMgU2V0dGluZ3NNb2RlKEdyb3VwZWRPcHRpb25zIG9wdGlvbnMsIFNldHRpbmdzQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMpCiAgICAgewogICAgICAgICBpZiAob3B0aW9ucyBpbnN0YW5jZW9mIENxbDNPcHRpb25zKQogICAgICAgICB7CkBAIC02Myw4ICs2Nyw4IEBACiAgICAgICAgICAgICBhcGkgPSBDb25uZWN0aW9uQVBJLkpBVkFfRFJJVkVSX05BVElWRTsKICAgICAgICAgICAgIHN0eWxlID0gb3B0cy51c2VVblByZXBhcmVkLnNldEJ5VXNlcigpID8gQ29ubmVjdGlvblN0eWxlLkNRTCA6ICBDb25uZWN0aW9uU3R5bGUuQ1FMX1BSRVBBUkVEOwogICAgICAgICAgICAgY29tcHJlc3Npb24gPSBQcm90b2NvbE9wdGlvbnMuQ29tcHJlc3Npb24udmFsdWVPZihvcHRzLnVzZUNvbXByZXNzaW9uLnZhbHVlKCkudG9VcHBlckNhc2UoKSkubmFtZSgpOwotICAgICAgICAgICAgdXNlcm5hbWUgPSBvcHRzLnVzZXIudmFsdWUoKTsKLSAgICAgICAgICAgIHBhc3N3b3JkID0gb3B0cy5wYXNzd29yZC52YWx1ZSgpOworICAgICAgICAgICAgdXNlcm5hbWUgPSBvcHRzLnVzZXIuc2V0QnlVc2VyKCkgPyBvcHRzLnVzZXIudmFsdWUoKSA6IGNyZWRlbnRpYWxzLmNxbFVzZXJuYW1lOworICAgICAgICAgICAgcGFzc3dvcmQgPSBvcHRzLnBhc3N3b3JkLnNldEJ5VXNlcigpID8gb3B0cy5wYXNzd29yZC52YWx1ZSgpIDogY3JlZGVudGlhbHMuY3FsUGFzc3dvcmQ7CiAgICAgICAgICAgICBtYXhQZW5kaW5nUGVyQ29ubmVjdGlvbiA9IG9wdHMubWF4UGVuZGluZ1BlckNvbm5lY3Rpb24udmFsdWUoKS5pc0VtcHR5KCkgPyBudWxsIDogSW50ZWdlci52YWx1ZU9mKG9wdHMubWF4UGVuZGluZ1BlckNvbm5lY3Rpb24udmFsdWUoKSk7CiAgICAgICAgICAgICBjb25uZWN0aW9uc1Blckhvc3QgPSBvcHRzLmNvbm5lY3Rpb25zUGVySG9zdC52YWx1ZSgpLmlzRW1wdHkoKSA/IG51bGwgOiBJbnRlZ2VyLnZhbHVlT2Yob3B0cy5jb25uZWN0aW9uc1Blckhvc3QudmFsdWUoKSk7CiAgICAgICAgICAgICBhdXRoUHJvdmlkZXJDbGFzc25hbWUgPSBvcHRzLmF1dGhQcm92aWRlci52YWx1ZSgpOwpAQCAtMTM3LDggKzE0MSwxMiBAQAogICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgdXNlVW5QcmVwYXJlZCA9IG5ldyBPcHRpb25TaW1wbGUoInVucHJlcGFyZWQiLCAiIiwgbnVsbCwgImZvcmNlIHVzZSBvZiB1bnByZXBhcmVkIHN0YXRlbWVudHMiLCBmYWxzZSk7CiAgICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSB1c2VDb21wcmVzc2lvbiA9IG5ldyBPcHRpb25TaW1wbGUoImNvbXByZXNzaW9uPSIsICJub25lfGx6NHxzbmFwcHkiLCAibm9uZSIsICIiLCBmYWxzZSk7CiAgICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSBwb3J0ID0gbmV3IE9wdGlvblNpbXBsZSgicG9ydD0iLCAiWzAtOV0rIiwgIjkwNDYiLCAiIiwgZmFsc2UpOwotICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgdXNlciA9IG5ldyBPcHRpb25TaW1wbGUoInVzZXI9IiwgIi4rIiwgbnVsbCwgInVzZXJuYW1lIiwgZmFsc2UpOwotICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgcGFzc3dvcmQgPSBuZXcgT3B0aW9uU2ltcGxlKCJwYXNzd29yZD0iLCAiLisiLCBudWxsLCAicGFzc3dvcmQiLCBmYWxzZSk7CisgICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSB1c2VyID0gbmV3IE9wdGlvblNpbXBsZSgidXNlcj0iLCAiLisiLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJDUUwgdXNlciwgd2hlbiBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIHZhbHVlIGluIGNyZWRlbnRpYWxzIGZpbGUgZm9yIGtleSAnJXMnIiwgQ1FMX1VTRVJOQU1FX1BST1BFUlRZX0tFWSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSBwYXNzd29yZCA9IG5ldyBPcHRpb25TaW1wbGUoInBhc3N3b3JkPSIsICIuKyIsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0KCJDUUwgcGFzc3dvcmQsIHdoZW4gc3BlY2lmaWVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSB2YWx1ZSBpbiBjcmVkZW50aWFscyBmaWxlIGZvciBrZXkgJyVzJyIsIENRTF9QQVNTV09SRF9QUk9QRVJUWV9LRVkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICAgICAgZmluYWwgT3B0aW9uU2ltcGxlIGF1dGhQcm92aWRlciA9IG5ldyBPcHRpb25TaW1wbGUoImF1dGgtcHJvdmlkZXI9IiwgIi4qIiwgbnVsbCwgIkZ1bGx5IHF1YWxpZmllZCBpbXBsZW1lbnRhdGlvbiBvZiBjb20uZGF0YXN0YXguZHJpdmVyLmNvcmUuQXV0aFByb3ZpZGVyIiwgZmFsc2UpOwogICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgbWF4UGVuZGluZ1BlckNvbm5lY3Rpb24gPSBuZXcgT3B0aW9uU2ltcGxlKCJtYXhQZW5kaW5nPSIsICJbMC05XSsiLCAiMTI4IiwgIk1heGltdW0gcGVuZGluZyByZXF1ZXN0cyBwZXIgY29ubmVjdGlvbiIsIGZhbHNlKTsKICAgICAgICAgZmluYWwgT3B0aW9uU2ltcGxlIGNvbm5lY3Rpb25zUGVySG9zdCA9IG5ldyBPcHRpb25TaW1wbGUoImNvbm5lY3Rpb25zUGVySG9zdD0iLCAiWzAtOV0rIiwgIjgiLCAiTnVtYmVyIG9mIGNvbm5lY3Rpb25zIHBlciBob3N0IiwgZmFsc2UpOwpAQCAtMTc5LDExICsxODcsOSBAQAogICAgICAgICBvdXQucHJpbnRmKCIgIE1heCBQZW5kaW5nIFBlciBDb25uZWN0aW9uOiAlZCVuIiwgbWF4UGVuZGluZ1BlckNvbm5lY3Rpb24pOwogICAgICAgICBvdXQucHJpbnRmKCIgIENvbm5lY3Rpb25zIFBlciBIb3N0OiAlZCVuIiwgY29ubmVjdGlvbnNQZXJIb3N0KTsKICAgICAgICAgb3V0LnByaW50ZigiICBDb21wcmVzc2lvbjogJXMlbiIsIGNvbXByZXNzaW9uKTsKLQogICAgIH0KIAotCi0gICAgcHVibGljIHN0YXRpYyBTZXR0aW5nc01vZGUgZ2V0KE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBjbEFyZ3MpCisgICAgcHVibGljIHN0YXRpYyBTZXR0aW5nc01vZGUgZ2V0KE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBjbEFyZ3MsIFNldHRpbmdzQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMpCiAgICAgewogICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSBjbEFyZ3MucmVtb3ZlKCItbW9kZSIpOwogICAgICAgICBpZiAocGFyYW1zID09IG51bGwpCkBAIC0xOTIsNyArMTk4LDcgQEAKICAgICAgICAgICAgIG9wdHMuYWNjZXB0KCJjcWwzIik7CiAgICAgICAgICAgICBvcHRzLmFjY2VwdCgibmF0aXZlIik7CiAgICAgICAgICAgICBvcHRzLmFjY2VwdCgicHJlcGFyZWQiKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2V0dGluZ3NNb2RlKG9wdHMpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nc01vZGUob3B0cywgY3JlZGVudGlhbHMpOwogICAgICAgICB9CiAKICAgICAgICAgR3JvdXBlZE9wdGlvbnMgb3B0aW9ucyA9IEdyb3VwZWRPcHRpb25zLnNlbGVjdChwYXJhbXMsIG5ldyBDcWwzTmF0aXZlT3B0aW9ucygpLCBuZXcgQ3FsM1NpbXBsZU5hdGl2ZU9wdGlvbnMoKSk7CkBAIC0yMDIsNyArMjA4LDcgQEAKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCAtbW9kZSBvcHRpb25zIHByb3ZpZGVkLCBzZWUgb3V0cHV0IGZvciB2YWxpZCBvcHRpb25zIik7CiAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFNldHRpbmdzTW9kZShvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nc01vZGUob3B0aW9ucywgY3JlZGVudGlhbHMpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEhlbHAoKQpkaWZmIC0tZ2l0IGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3Mvc2V0dGluZ3MvU2V0dGluZ3NSZXBvcnRpbmcuamF2YSBiL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1NldHRpbmdzUmVwb3J0aW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhMjE1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1NldHRpbmdzUmVwb3J0aW5nLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnNldHRpbmdzOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuY29uZmlnLkR1cmF0aW9uU3BlYzsKK2ltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3MudXRpbC5SZXN1bHRMb2dnZXI7CisKK3B1YmxpYyBjbGFzcyBTZXR0aW5nc1JlcG9ydGluZyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQoreworICAgIHB1YmxpYyBmaW5hbCBpbnQgb3V0cHV0RnJlcXVlbmN5OworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG91dHB1dEZyZXF1ZW5jeVN0cmluZzsKKyAgICBwdWJsaWMgZmluYWwgaW50IGhlYWRlckZyZXF1ZW5jeTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBoZWFkZXJGcmVxdWVuY3lTdHJpbmc7CisKKyAgICBwdWJsaWMgU2V0dGluZ3NSZXBvcnRpbmcoU2V0dGluZ3NSZXBvcnRpbmcuT3B0aW9ucyByZXBvcnRpbmcpCisgICAgeworICAgICAgICBpZiAocmVwb3J0aW5nLmhlYWRlckZyZXF1ZW5jeS5wcmVzZW50KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGhlYWRlckZyZXF1ZW5jeVN0cmluZyA9IHJlcG9ydGluZy5oZWFkZXJGcmVxdWVuY3kudmFsdWUoKTsKKyAgICAgICAgICAgIGhlYWRlckZyZXF1ZW5jeSA9IG5ldyBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kKGhlYWRlckZyZXF1ZW5jeVN0cmluZykudG9TZWNvbmRzKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBoZWFkZXJGcmVxdWVuY3kgPSAwOworICAgICAgICAgICAgaGVhZGVyRnJlcXVlbmN5U3RyaW5nID0gIipub3Qgc2V0KiI7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVwb3J0aW5nLm91dHB1dEZyZXF1ZW5jeS5wcmVzZW50KCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dHB1dEZyZXF1ZW5jeVN0cmluZyA9IHJlcG9ydGluZy5vdXRwdXRGcmVxdWVuY3kudmFsdWUoKTsKKyAgICAgICAgICAgIG91dHB1dEZyZXF1ZW5jeSA9IG5ldyBEdXJhdGlvblNwZWMuSW50U2Vjb25kc0JvdW5kKG91dHB1dEZyZXF1ZW5jeVN0cmluZykudG9TZWNvbmRzKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXRwdXRGcmVxdWVuY3kgPSAwOworICAgICAgICAgICAgb3V0cHV0RnJlcXVlbmN5U3RyaW5nID0gIipub3Qgc2V0KiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPcHRpb24gRGVjbGFyYXRpb25zCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE9wdGlvbnMgZXh0ZW5kcyBHcm91cGVkT3B0aW9ucworICAgIHsKKyAgICAgICAgZmluYWwgT3B0aW9uU2ltcGxlIG91dHB1dEZyZXF1ZW5jeSA9IG5ldyBPcHRpb25TaW1wbGUoIm91dHB1dC1mcmVxdWVuY3k9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjFzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZyZXF1ZW5jeSBlYWNoIGxpbmUgb2Ygb3V0cHV0IHdpbGwgYmUgcHJpbnRlZCBvdXQgd2hlbiBydW5uaW5nIGEgc3RyZXNzIHRlc3QsIGRlZmF1bHRzIHRvICcxcycuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworCisgICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSBoZWFkZXJGcmVxdWVuY3kgPSBuZXcgT3B0aW9uU2ltcGxlKCJoZWFkZXItZnJlcXVlbmN5PSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmVxdWVuY3kgdGhlIGhlYWRlciBmb3IgdGhlIHN0YXRpc3RpY3Mgd2lsbCBiZSBwcmludGVkIG91dC4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZiBub3Qgc3BlY2lmaWVkLCB0aGUgaGVhZGVyIHdpbGwgYmUgcHJpbnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXN0IG9ubHkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDw/IGV4dGVuZHMgT3B0aW9uPiBvcHRpb25zKCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3Qob3V0cHV0RnJlcXVlbmN5LCBoZWFkZXJGcmVxdWVuY3kpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBTZXR0aW5nc1JlcG9ydGluZyBnZXQoTWFwPFN0cmluZywgU3RyaW5nW10+IGNsQXJncykKKyAgICB7CisgICAgICAgIFN0cmluZ1tdIHBhcmFtcyA9IGNsQXJncy5yZW1vdmUoIi1yZXBvcnRpbmciKTsKKyAgICAgICAgaWYgKHBhcmFtcyA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nc1JlcG9ydGluZyhuZXcgU2V0dGluZ3NSZXBvcnRpbmcuT3B0aW9ucygpKTsKKworICAgICAgICBHcm91cGVkT3B0aW9ucyBvcHRpb25zID0gR3JvdXBlZE9wdGlvbnMuc2VsZWN0KHBhcmFtcywgbmV3IFNldHRpbmdzUmVwb3J0aW5nLk9wdGlvbnMoKSk7CisgICAgICAgIGlmIChvcHRpb25zID09IG51bGwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50SGVscCgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnZhbGlkIC1yZXBvcnRpbmcgb3B0aW9ucyBwcm92aWRlZCwgc2VlIG91dHB1dCBmb3IgdmFsaWQgb3B0aW9ucyIpOworICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nc1JlcG9ydGluZygoU2V0dGluZ3NSZXBvcnRpbmcuT3B0aW9ucykgb3B0aW9ucyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHJpbnRTZXR0aW5ncyhSZXN1bHRMb2dnZXIgb3V0KQorICAgIHsKKyAgICAgICAgb3V0LnByaW50ZigiICBPdXRwdXQgZnJlcXVlbmN5OiAlcyVuIiwgb3V0cHV0RnJlcXVlbmN5U3RyaW5nKTsKKyAgICAgICAgb3V0LnByaW50ZigiICBIZWFkZXIgZnJlcXVlbmN5OiAlcyVuIiwgaGVhZGVyRnJlcXVlbmN5U3RyaW5nKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRIZWxwKCkKKyAgICB7CisgICAgICAgIEdyb3VwZWRPcHRpb25zLnByaW50T3B0aW9ucyhTeXN0ZW0ub3V0LCAiLXJlcG9ydGluZyIsIG5ldyBTZXR0aW5nc1JlcG9ydGluZy5PcHRpb25zKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUnVubmFibGUgaGVscFByaW50ZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFNldHRpbmdzUmVwb3J0aW5nOjpwcmludEhlbHA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3Mvc2V0dGluZ3MvU2V0dGluZ3NUcmFuc3BvcnQuamF2YSBiL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1NldHRpbmdzVHJhbnNwb3J0LmphdmEKaW5kZXggNWYyMmE3Yi4uY2Y2Mjk5OSAxMDA2NDQKLS0tIGEvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3Mvc2V0dGluZ3MvU2V0dGluZ3NUcmFuc3BvcnQuamF2YQorKysgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TZXR0aW5nc1RyYW5zcG9ydC5qYXZhCkBAIC0yOSwxMyArMjksMTkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS5jb25maWcuRW5jcnlwdGlvbk9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnV0aWwuUmVzdWx0TG9nZ2VyOwogCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5TdHJpbmcuZm9ybWF0OworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5UUkFOU1BPUlRfS0VZU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5UUkFOU1BPUlRfVFJVU1RTVE9SRV9QQVNTV09SRF9QUk9QRVJUWV9LRVk7CisKIHB1YmxpYyBjbGFzcyBTZXR0aW5nc1RyYW5zcG9ydCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQogewogICAgIHByaXZhdGUgZmluYWwgVE9wdGlvbnMgb3B0aW9uczsKKyAgICBwcml2YXRlIGZpbmFsIFNldHRpbmdzQ3JlZGVudGlhbHMgY3JlZGVudGlhbHM7CiAKLSAgICBwdWJsaWMgU2V0dGluZ3NUcmFuc3BvcnQoVE9wdGlvbnMgb3B0aW9ucykKKyAgICBwdWJsaWMgU2V0dGluZ3NUcmFuc3BvcnQoVE9wdGlvbnMgb3B0aW9ucywgU2V0dGluZ3NDcmVkZW50aWFscyBjcmVkZW50aWFscykKICAgICB7CiAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CisgICAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBjcmVkZW50aWFsczsKICAgICB9CiAKICAgICBwdWJsaWMgRW5jcnlwdGlvbk9wdGlvbnMgZ2V0RW5jcnlwdGlvbk9wdGlvbnMoKQpAQCAtNDYsNyArNTIsNyBAQAogICAgICAgICAgICAgZW5jT3B0aW9ucyA9IGVuY09wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEVuYWJsZWQodHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFRydXN0U3RvcmUob3B0aW9ucy50cnVzdFN0b3JlLnZhbHVlKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhUcnVzdFN0b3JlUGFzc3dvcmQob3B0aW9ucy50cnVzdFN0b3JlUHcudmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFRydXN0U3RvcmVQYXNzd29yZChvcHRpb25zLnRydXN0U3RvcmVQdy5zZXRCeVVzZXIoKSA/IG9wdGlvbnMudHJ1c3RTdG9yZVB3LnZhbHVlKCkgOiBjcmVkZW50aWFscy50cmFuc3BvcnRUcnVzdHN0b3JlUGFzc3dvcmQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhBbGdvcml0aG0ob3B0aW9ucy5hbGcudmFsdWUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aFByb3RvY29sKG9wdGlvbnMucHJvdG9jb2wudmFsdWUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENpcGhlclN1aXRlcyhvcHRpb25zLmNpcGhlcnMudmFsdWUoKS5zcGxpdCgiLCIpKTsKQEAgLTU0LDE0ICs2MCwxNCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGVuY09wdGlvbnMgPSBlbmNPcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoS2V5U3RvcmUob3B0aW9ucy5rZXlTdG9yZS52YWx1ZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlUGFzc3dvcmQob3B0aW9ucy5rZXlTdG9yZVB3LnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlUGFzc3dvcmQob3B0aW9ucy5rZXlTdG9yZVB3LnNldEJ5VXNlcigpID8gb3B0aW9ucy5rZXlTdG9yZVB3LnZhbHVlKCkgOiBjcmVkZW50aWFscy50cmFuc3BvcnRLZXlzdG9yZVBhc3N3b3JkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvLyBtYW5kYXRvcnkgZm9yIFNTTEZhY3RvcnkuY3JlYXRlU1NMQ29udGV4dCgpLCBzZWUgQ0FTU0FORFJBLTkzMjUKICAgICAgICAgICAgICAgICBlbmNPcHRpb25zID0gZW5jT3B0aW9ucwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEtleVN0b3JlKGVuY09wdGlvbnMudHJ1c3RzdG9yZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhLZXlTdG9yZVBhc3N3b3JkKGVuY09wdGlvbnMudHJ1c3RzdG9yZV9wYXNzd29yZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoS2V5U3RvcmVQYXNzd29yZChlbmNPcHRpb25zLnRydXN0c3RvcmVfcGFzc3dvcmQgIT0gbnVsbCA/IGVuY09wdGlvbnMudHJ1c3RzdG9yZV9wYXNzd29yZCA6IGNyZWRlbnRpYWxzLnRyYW5zcG9ydFRydXN0c3RvcmVQYXNzd29yZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGVuY09wdGlvbnM7CkBAIC03MiwxMiArNzgsMTggQEAKICAgICBzdGF0aWMgY2xhc3MgVE9wdGlvbnMgZXh0ZW5kcyBHcm91cGVkT3B0aW9ucyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQogICAgIHsKICAgICAgICAgZmluYWwgT3B0aW9uU2ltcGxlIHRydXN0U3RvcmUgPSBuZXcgT3B0aW9uU2ltcGxlKCJ0cnVzdHN0b3JlPSIsICIuKiIsIG51bGwsICJTU0w6IGZ1bGwgcGF0aCB0byB0cnVzdHN0b3JlIiwgZmFsc2UpOwotICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgdHJ1c3RTdG9yZVB3ID0gbmV3IE9wdGlvblNpbXBsZSgidHJ1c3RzdG9yZS1wYXNzd29yZD0iLCAiLioiLCBudWxsLCAiU1NMOiB0cnVzdHN0b3JlIHBhc3N3b3JkIiwgZmFsc2UpOworICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgdHJ1c3RTdG9yZVB3ID0gbmV3IE9wdGlvblNpbXBsZSgidHJ1c3RzdG9yZS1wYXNzd29yZD0iLCAiLioiLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQoIlNTTDogdHJ1c3RzdG9yZSBwYXNzd29yZCwgd2hlbiBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIHZhbHVlIGluIGNyZWRlbnRpYWxzIGZpbGUgb2Yga2V5ICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1JUX1RSVVNUU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZKSwgZmFsc2UpOwogICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUga2V5U3RvcmUgPSBuZXcgT3B0aW9uU2ltcGxlKCJrZXlzdG9yZT0iLCAiLioiLCBudWxsLCAiU1NMOiBmdWxsIHBhdGggdG8ga2V5c3RvcmUiLCBmYWxzZSk7Ci0gICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSBrZXlTdG9yZVB3ID0gbmV3IE9wdGlvblNpbXBsZSgia2V5c3RvcmUtcGFzc3dvcmQ9IiwgIi4qIiwgbnVsbCwgIlNTTDoga2V5c3RvcmUgcGFzc3dvcmQiLCBmYWxzZSk7CisgICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSBrZXlTdG9yZVB3ID0gbmV3IE9wdGlvblNpbXBsZSgia2V5c3RvcmUtcGFzc3dvcmQ9IiwgIi4qIiwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCgiU1NMOiBrZXlzdG9yZSBwYXNzd29yZCwgd2hlbiBzcGVjaWZpZWQsIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIHZhbHVlIGluIGNyZWRlbnRpYWxzIGZpbGUgZm9yIGtleSAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPUlRfS0VZU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZKSwgZmFsc2UpOwogICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgcHJvdG9jb2wgPSBuZXcgT3B0aW9uU2ltcGxlKCJzc2wtcHJvdG9jb2w9IiwgIi4qIiwgIlRMUyIsICJTU0w6IGNvbm5lY3Rpb24gcHJvdG9jb2wgdG8gdXNlIiwgZmFsc2UpOwogICAgICAgICBmaW5hbCBPcHRpb25TaW1wbGUgYWxnID0gbmV3IE9wdGlvblNpbXBsZSgic3NsLWFsZz0iLCAiLioiLCBudWxsLCAiU1NMOiBhbGdvcml0aG0iLCBmYWxzZSk7Ci0gICAgICAgIGZpbmFsIE9wdGlvblNpbXBsZSBjaXBoZXJzID0gbmV3IE9wdGlvblNpbXBsZSgic3NsLWNpcGhlcnM9IiwgIi4qIiwgIlRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSIsICJTU0w6IGNvbW1hIGRlbGltaXRlZCBsaXN0IG9mIGVuY3J5cHRpb24gc3VpdGVzIHRvIHVzZSIsIGZhbHNlKTsKKyAgICAgICAgZmluYWwgT3B0aW9uU2ltcGxlIGNpcGhlcnMgPSBuZXcgT3B0aW9uU2ltcGxlKCJzc2wtY2lwaGVycz0iLCAiLioiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRMU19SU0FfV0lUSF9BRVNfMTI4X0NCQ19TSEEsVExTX1JTQV9XSVRIX0FFU18yNTZfQ0JDX1NIQSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU1NMOiBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBlbmNyeXB0aW9uIHN1aXRlcyB0byB1c2UiLCBmYWxzZSk7CiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBMaXN0PD8gZXh0ZW5kcyBPcHRpb24+IG9wdGlvbnMoKQpAQCAtODksMTQgKzEwMSwyNiBAQAogICAgIC8vIENMSSBVdGlsaXR5IE1ldGhvZHMKICAgICBwdWJsaWMgdm9pZCBwcmludFNldHRpbmdzKFJlc3VsdExvZ2dlciBvdXQpCiAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiICAiICsgb3B0aW9ucy5nZXRPcHRpb25Bc1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nIHRQYXNzd29yZCA9IG9wdGlvbnMudHJ1c3RTdG9yZVB3LnNldEJ5VXNlcigpID8gb3B0aW9ucy50cnVzdFN0b3JlUHcudmFsdWUoKSA6IGNyZWRlbnRpYWxzLnRyYW5zcG9ydFRydXN0c3RvcmVQYXNzd29yZDsKKyAgICAgICAgdFBhc3N3b3JkID0gdFBhc3N3b3JkICE9IG51bGwgPyAiKnN1cHByZXNzZWQqIiA6IHRQYXNzd29yZDsKKworICAgICAgICBTdHJpbmcga1Bhc3N3b3JkID0gb3B0aW9ucy5rZXlTdG9yZVB3LnNldEJ5VXNlcigpID8gb3B0aW9ucy5rZXlTdG9yZS52YWx1ZSgpIDogY3JlZGVudGlhbHMudHJhbnNwb3J0S2V5c3RvcmVQYXNzd29yZDsKKyAgICAgICAga1Bhc3N3b3JkID0ga1Bhc3N3b3JkICE9IG51bGwgPyAiKnN1cHByZXNzZWQqIiA6IGtQYXNzd29yZDsKKworICAgICAgICBvdXQucHJpbnRmKCIgIFRydXN0c3RvcmU6ICVzJW4iLCBvcHRpb25zLnRydXN0U3RvcmUudmFsdWUoKSk7CisgICAgICAgIG91dC5wcmludGYoIiAgVHJ1c3RzdG9yZSBQYXNzd29yZDogJXMlbiIsIHRQYXNzd29yZCk7CisgICAgICAgIG91dC5wcmludGYoIiAgS2V5c3RvcmU6ICVzJW4iLCBvcHRpb25zLmtleVN0b3JlLnZhbHVlKCkpOworICAgICAgICBvdXQucHJpbnRmKCIgIEtleXN0b3JlIFBhc3N3b3JkOiAlcyVuIiwga1Bhc3N3b3JkKTsKKyAgICAgICAgb3V0LnByaW50ZigiICBTU0wgUHJvdG9jb2w6ICVzJW4iLCBvcHRpb25zLnByb3RvY29sLnZhbHVlKCkpOworICAgICAgICBvdXQucHJpbnRmKCIgIFNTTCBBbGdvcml0aG06ICVzJW4iLCBvcHRpb25zLmFsZy52YWx1ZSgpKTsKKyAgICAgICAgb3V0LnByaW50ZigiICBTU0wgQ2lwaGVyczogJXMlbiIsIG9wdGlvbnMuY2lwaGVycy52YWx1ZSgpKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIFNldHRpbmdzVHJhbnNwb3J0IGdldChNYXA8U3RyaW5nLCBTdHJpbmdbXT4gY2xBcmdzKQorICAgIHB1YmxpYyBzdGF0aWMgU2V0dGluZ3NUcmFuc3BvcnQgZ2V0KE1hcDxTdHJpbmcsIFN0cmluZ1tdPiBjbEFyZ3MsIFNldHRpbmdzQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMpCiAgICAgewogICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSBjbEFyZ3MucmVtb3ZlKCItdHJhbnNwb3J0Iik7CiAgICAgICAgIGlmIChwYXJhbXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2V0dGluZ3NUcmFuc3BvcnQobmV3IFRPcHRpb25zKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nc1RyYW5zcG9ydChuZXcgVE9wdGlvbnMoKSwgY3JlZGVudGlhbHMpOwogCiAgICAgICAgIEdyb3VwZWRPcHRpb25zIG9wdGlvbnMgPSBHcm91cGVkT3B0aW9ucy5zZWxlY3QocGFyYW1zLCBuZXcgVE9wdGlvbnMoKSk7CiAgICAgICAgIGlmIChvcHRpb25zID09IG51bGwpCkBAIC0xMDUsNyArMTI5LDcgQEAKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW52YWxpZCAtdHJhbnNwb3J0IG9wdGlvbnMgcHJvdmlkZWQsIHNlZSBvdXRwdXQgZm9yIHZhbGlkIG9wdGlvbnMiKTsKICAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgU2V0dGluZ3NUcmFuc3BvcnQoKFRPcHRpb25zKSBvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXR0aW5nc1RyYW5zcG9ydCgoVE9wdGlvbnMpIG9wdGlvbnMsIGNyZWRlbnRpYWxzKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRIZWxwKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1N0cmVzc1NldHRpbmdzLmphdmEgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy9zZXR0aW5ncy9TdHJlc3NTZXR0aW5ncy5qYXZhCmluZGV4IDJmNzZkZmIuLjEyZDczMWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1N0cmVzc1NldHRpbmdzLmphdmEKKysrIGIvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3Mvc2V0dGluZ3MvU3RyZXNzU2V0dGluZ3MuamF2YQpAQCAtMzgsMTMgKzM4LDE2IEBACiAgICAgcHVibGljIGZpbmFsIFNldHRpbmdzQ29sdW1uIGNvbHVtbnM7CiAgICAgcHVibGljIGZpbmFsIFNldHRpbmdzRXJyb3JzIGVycm9yczsKICAgICBwdWJsaWMgZmluYWwgU2V0dGluZ3NMb2cgbG9nOworICAgIHB1YmxpYyBmaW5hbCBTZXR0aW5nc0NyZWRlbnRpYWxzIGNyZWRlbnRpYWxzOwogICAgIHB1YmxpYyBmaW5hbCBTZXR0aW5nc01vZGUgbW9kZTsKICAgICBwdWJsaWMgZmluYWwgU2V0dGluZ3NOb2RlIG5vZGU7CiAgICAgcHVibGljIGZpbmFsIFNldHRpbmdzU2NoZW1hIHNjaGVtYTsKICAgICBwdWJsaWMgZmluYWwgU2V0dGluZ3NUcmFuc3BvcnQgdHJhbnNwb3J0OwogICAgIHB1YmxpYyBmaW5hbCBTZXR0aW5nc1BvcnQgcG9ydDsKKyAgICBwdWJsaWMgZmluYWwgU2V0dGluZ3NKTVggam14OwogICAgIHB1YmxpYyBmaW5hbCBTZXR0aW5nc0dyYXBoIGdyYXBoOwogICAgIHB1YmxpYyBmaW5hbCBTZXR0aW5nc1Rva2VuUmFuZ2UgdG9rZW5SYW5nZTsKKyAgICBwdWJsaWMgZmluYWwgU2V0dGluZ3NSZXBvcnRpbmcgcmVwb3J0aW5nOwogCiAgICAgcHVibGljIFN0cmVzc1NldHRpbmdzKFNldHRpbmdzQ29tbWFuZCBjb21tYW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1JhdGUgcmF0ZSwKQEAgLTUzLDEzICs1NiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc0NvbHVtbiBjb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc0Vycm9ycyBlcnJvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzTG9nIGxvZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NDcmVkZW50aWFscyBjcmVkZW50aWFscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NNb2RlIG1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzTm9kZSBub2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1NjaGVtYSBzY2hlbWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzVHJhbnNwb3J0IHRyYW5zcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NQb3J0IHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzSk1YIGpteCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NHcmFwaCBncmFwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NUb2tlblJhbmdlIHRva2VuUmFuZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzVG9rZW5SYW5nZSB0b2tlblJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1JlcG9ydGluZyByZXBvcnRpbmcpCiAgICAgewogICAgICAgICB0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwogICAgICAgICB0aGlzLnJhdGUgPSByYXRlOwpAQCAtNjgsMTMgKzc0LDE2IEBACiAgICAgICAgIHRoaXMuY29sdW1ucyA9IGNvbHVtbnM7CiAgICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzOwogICAgICAgICB0aGlzLmxvZyA9IGxvZzsKKyAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGNyZWRlbnRpYWxzOwogICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOwogICAgICAgICB0aGlzLm5vZGUgPSBub2RlOwogICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKICAgICAgICAgdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7CiAgICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7CisgICAgICAgIHRoaXMuam14ID0gam14OwogICAgICAgICB0aGlzLmdyYXBoID0gZ3JhcGg7CiAgICAgICAgIHRoaXMudG9rZW5SYW5nZSA9IHRva2VuUmFuZ2U7CisgICAgICAgIHRoaXMucmVwb3J0aW5nID0gcmVwb3J0aW5nOwogICAgIH0KIAogICAgIHB1YmxpYyBTaW1wbGVDbGllbnQgZ2V0U2ltcGxlTmF0aXZlQ2xpZW50KCkKQEAgLTE5NCwxMSArMjAzLDE0IEBACiAgICAgICAgIFNldHRpbmdzQ29sdW1uIGNvbHVtbnMgPSBTZXR0aW5nc0NvbHVtbi5nZXQoY2xBcmdzKTsKICAgICAgICAgU2V0dGluZ3NFcnJvcnMgZXJyb3JzID0gU2V0dGluZ3NFcnJvcnMuZ2V0KGNsQXJncyk7CiAgICAgICAgIFNldHRpbmdzTG9nIGxvZyA9IFNldHRpbmdzTG9nLmdldChjbEFyZ3MpOwotICAgICAgICBTZXR0aW5nc01vZGUgbW9kZSA9IFNldHRpbmdzTW9kZS5nZXQoY2xBcmdzKTsKKyAgICAgICAgU2V0dGluZ3NDcmVkZW50aWFscyBjcmVkZW50aWFscyA9IFNldHRpbmdzQ3JlZGVudGlhbHMuZ2V0KGNsQXJncyk7CisgICAgICAgIFNldHRpbmdzTW9kZSBtb2RlID0gU2V0dGluZ3NNb2RlLmdldChjbEFyZ3MsIGNyZWRlbnRpYWxzKTsKICAgICAgICAgU2V0dGluZ3NOb2RlIG5vZGUgPSBTZXR0aW5nc05vZGUuZ2V0KGNsQXJncyk7CiAgICAgICAgIFNldHRpbmdzU2NoZW1hIHNjaGVtYSA9IFNldHRpbmdzU2NoZW1hLmdldChjbEFyZ3MsIGNvbW1hbmQpOwotICAgICAgICBTZXR0aW5nc1RyYW5zcG9ydCB0cmFuc3BvcnQgPSBTZXR0aW5nc1RyYW5zcG9ydC5nZXQoY2xBcmdzKTsKKyAgICAgICAgU2V0dGluZ3NUcmFuc3BvcnQgdHJhbnNwb3J0ID0gU2V0dGluZ3NUcmFuc3BvcnQuZ2V0KGNsQXJncywgY3JlZGVudGlhbHMpOworICAgICAgICBTZXR0aW5nc0pNWCBqbXggPSBTZXR0aW5nc0pNWC5nZXQoY2xBcmdzLCBjcmVkZW50aWFscyk7CiAgICAgICAgIFNldHRpbmdzR3JhcGggZ3JhcGggPSBTZXR0aW5nc0dyYXBoLmdldChjbEFyZ3MsIGNvbW1hbmQpOworICAgICAgICBTZXR0aW5nc1JlcG9ydGluZyByZXBvcnRpbmcgPSBTZXR0aW5nc1JlcG9ydGluZy5nZXQoY2xBcmdzKTsKICAgICAgICAgaWYgKCFjbEFyZ3MuaXNFbXB0eSgpKQogICAgICAgICB7CiAgICAgICAgICAgICBwcmludEhlbHAoKTsKQEAgLTIxNiw3ICsyMjgsNyBAQAogICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gbmV3IFN0cmVzc1NldHRpbmdzKGNvbW1hbmQsIHJhdGUsIGdlbmVyYXRlLCBpbnNlcnQsIGNvbHVtbnMsIGVycm9ycywgbG9nLCBtb2RlLCBub2RlLCBzY2hlbWEsIHRyYW5zcG9ydCwgcG9ydCwgZ3JhcGgsIHRva2VuUmFuZ2UpOworICAgICAgICByZXR1cm4gbmV3IFN0cmVzc1NldHRpbmdzKGNvbW1hbmQsIHJhdGUsIGdlbmVyYXRlLCBpbnNlcnQsIGNvbHVtbnMsIGVycm9ycywgbG9nLCBjcmVkZW50aWFscywgbW9kZSwgbm9kZSwgc2NoZW1hLCB0cmFuc3BvcnQsIHBvcnQsIGpteCwgZ3JhcGgsIHRva2VuUmFuZ2UsIHJlcG9ydGluZyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nW10+IHBhcnNlTWFwKFN0cmluZ1tdIGFyZ3MpCkBAIC0yOTAsMTAgKzMwMiwxNiBAQAogICAgICAgICB0cmFuc3BvcnQucHJpbnRTZXR0aW5ncyhvdXQpOwogICAgICAgICBvdXQucHJpbnRsbigiUG9ydDoiKTsKICAgICAgICAgcG9ydC5wcmludFNldHRpbmdzKG91dCk7CisgICAgICAgIG91dC5wcmludGxuKCJKTVg6Iik7CisgICAgICAgIGpteC5wcmludFNldHRpbmdzKG91dCk7CiAgICAgICAgIG91dC5wcmludGxuKCJHcmFwaDoiKTsKICAgICAgICAgZ3JhcGgucHJpbnRTZXR0aW5ncyhvdXQpOwogICAgICAgICBvdXQucHJpbnRsbigiVG9rZW5SYW5nZToiKTsKICAgICAgICAgdG9rZW5SYW5nZS5wcmludFNldHRpbmdzKG91dCk7CisgICAgICAgIG91dC5wcmludGxuKCJDcmVkZW50aWFscyBmaWxlOiIpOworICAgICAgICBjcmVkZW50aWFscy5wcmludFNldHRpbmdzKG91dCk7CisgICAgICAgIG91dC5wcmludGxuKCJSZXBvcnRpbmc6Iik7CisgICAgICAgIHJlcG9ydGluZy5wcmludFNldHRpbmdzKG91dCk7CiAKICAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PSBDb21tYW5kLlVTRVIpCiAgICAgICAgIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3V0aWwvSm14Q29sbGVjdG9yLmphdmEgYi90b29scy9zdHJlc3Mvc3JjL29yZy9hcGFjaGUvY2Fzc2FuZHJhL3N0cmVzcy91dGlsL0pteENvbGxlY3Rvci5qYXZhCmluZGV4IDhjZmJlYmIuLjI0Y2I0YzcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3N0cmVzcy9zcmMvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3V0aWwvSm14Q29sbGVjdG9yLmphdmEKKysrIGIvdG9vbHMvc3RyZXNzL3NyYy9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3MvdXRpbC9KbXhDb2xsZWN0b3IuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmNvbmN1cnJlbnQuTmFtZWRUaHJlYWRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLnN0cmVzcy5zZXR0aW5ncy5TZXR0aW5nc0pNWDsKIGltcG9ydCBvcmcuYXBhY2hlLmNhc3NhbmRyYS50b29scy5Ob2RlUHJvYmU7CiAKIHB1YmxpYyBjbGFzcyBKbXhDb2xsZWN0b3IgaW1wbGVtZW50cyBDYWxsYWJsZTxKbXhDb2xsZWN0b3IuR2NTdGF0cz4KQEAgLTc2LDIzICs3NywyNiBAQAogICAgIGZpbmFsIE5vZGVQcm9iZVtdIHByb2JlczsKIAogICAgIC8vIFRPRE86IHNob3VsZCBleHBhbmQgdG8gd2hvbGUgY2x1c3RlcgotICAgIHB1YmxpYyBKbXhDb2xsZWN0b3IoQ29sbGVjdGlvbjxTdHJpbmc+IGhvc3RzLCBpbnQgcG9ydCkKKyAgICBwdWJsaWMgSm14Q29sbGVjdG9yKENvbGxlY3Rpb248U3RyaW5nPiBob3N0cywgaW50IHBvcnQsIFNldHRpbmdzSk1YIGpteCkKICAgICB7CiAgICAgICAgIHByb2JlcyA9IG5ldyBOb2RlUHJvYmVbaG9zdHMuc2l6ZSgpXTsKICAgICAgICAgaW50IGkgPSAwOwogICAgICAgICBmb3IgKFN0cmluZyBob3N0IDogaG9zdHMpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHByb2Jlc1tpXSA9IGNvbm5lY3QoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICBwcm9iZXNbaV0gPSBjb25uZWN0KGhvc3QsIHBvcnQsIGpteCk7CiAgICAgICAgICAgICBwcm9iZXNbaV0uZ2V0QW5kUmVzZXRHQ1N0YXRzKCk7CiAgICAgICAgICAgICBpKys7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBOb2RlUHJvYmUgY29ubmVjdChTdHJpbmcgaG9zdCwgaW50IHBvcnQpCisgICAgcHJpdmF0ZSBzdGF0aWMgTm9kZVByb2JlIGNvbm5lY3QoU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTZXR0aW5nc0pNWCBqbXgpCiAgICAgewogICAgICAgICB0cnkKICAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlUHJvYmUoaG9zdCwgcG9ydCk7CisgICAgICAgICAgICBpZiAoam14LnVzZXIgIT0gbnVsbCAmJiBqbXgucGFzc3dvcmQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVQcm9iZShob3N0LCBwb3J0LCBqbXgudXNlciwgam14LnBhc3N3b3JkKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVQcm9iZShob3N0LCBwb3J0KTsKICAgICAgICAgfQogICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKICAgICAgICAgewpkaWZmIC0tZ2l0IGEvdG9vbHMvc3RyZXNzL3Rlc3QvdW5pdC9vcmcvYXBhY2hlL2Nhc3NhbmRyYS9zdHJlc3Mvc2V0dGluZ3MvU2V0dGluZ3NDcmVkZW50aWFsc1Rlc3QuamF2YSBiL3Rvb2xzL3N0cmVzcy90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1NldHRpbmdzQ3JlZGVudGlhbHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhMDdjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3N0cmVzcy90ZXN0L3VuaXQvb3JnL2FwYWNoZS9jYXNzYW5kcmEvc3RyZXNzL3NldHRpbmdzL1NldHRpbmdzQ3JlZGVudGlhbHNUZXN0LmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS5jYXNzYW5kcmEuc3RyZXNzLnNldHRpbmdzOworCitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5jYXNzYW5kcmEuaW8udXRpbC5GaWxlOworaW1wb3J0IG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZVV0aWxzOworCitpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuY2Fzc2FuZHJhLmlvLnV0aWwuRmlsZS5Xcml0ZU1vZGUuT1ZFUldSSVRFOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5DUUxfUEFTU1dPUkRfUFJPUEVSVFlfS0VZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5DUUxfVVNFUk5BTUVfUFJPUEVSVFlfS0VZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5KTVhfUEFTU1dPUkRfUFJPUEVSVFlfS0VZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5KTVhfVVNFUk5BTUVfUFJPUEVSVFlfS0VZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5UUkFOU1BPUlRfS0VZU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZOworaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLmNhc3NhbmRyYS5zdHJlc3Muc2V0dGluZ3MuU2V0dGluZ3NDcmVkZW50aWFscy5UUkFOU1BPUlRfVFJVU1RTVE9SRV9QQVNTV09SRF9QUk9QRVJUWV9LRVk7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgU2V0dGluZ3NDcmVkZW50aWFsc1Rlc3QKK3sKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQ3JlZGVudGlhbHNGcm9tRmlsZU1peGVkKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShDUUxfVVNFUk5BTUVfUFJPUEVSVFlfS0VZLCAiY3FsdXNlcmZyb21maWxlIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoQ1FMX1BBU1NXT1JEX1BST1BFUlRZX0tFWSwgImNxbHBhc3N3b3JkZnJvbWZpbGUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShKTVhfVVNFUk5BTUVfUFJPUEVSVFlfS0VZLCAiam14dXNlcmZyb21maWxlIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoSk1YX1BBU1NXT1JEX1BST1BFUlRZX0tFWSwgImpteHBhc3N3b3JkZnJvbWZpbGUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShUUkFOU1BPUlRfS0VZU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZLCAia2V5c3RvcmVzdG9yZXBhc3N3b3JkZnJvbWZpbGUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShUUkFOU1BPUlRfVFJVU1RTVE9SRV9QQVNTV09SRF9QUk9QRVJUWV9LRVksICJ0cnVzdHN0b3JlcGFzc3dvcmRmcm9tZmlsZSIpOworCisgICAgICAgIEZpbGUgdGVtcEZpbGUgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoImNhc3NhbmRyYS1zdHJlc3MtY3JlZGVudGlhbHMtdGVzdCIsICJwcm9wZXJ0aWVzIik7CisKKyAgICAgICAgdHJ5IChXcml0ZXIgdyA9IHRlbXBGaWxlLm5ld1dyaXRlcihPVkVSV1JJVEUpKQorICAgICAgICB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnN0b3JlKHcsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nW10+IGFyZ3MgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGFyZ3MucHV0KCJ3cml0ZSIsIG5ldyBTdHJpbmdbXXt9KTsKKyAgICAgICAgYXJncy5wdXQoIi1tb2RlIiwgbmV3IFN0cmluZ1tdeyAiY3FsMyIsICJuYXRpdmUiLCAicGFzc3dvcmQ9Y3FscGFzc3dvcmRvbmNvbW1hbmRsaW5lIiB9KTsKKyAgICAgICAgYXJncy5wdXQoIi10cmFuc3BvcnQiLCBuZXcgU3RyaW5nW117ICJ0cnVzdHN0b3JlPXNvbWV0cnVzdHN0b3JlIiwgImtleXN0b3JlPXNvbWVrZXlzdG9yZSIgfSk7CisgICAgICAgIGFyZ3MucHV0KCItam14IiwgbmV3IFN0cmluZ1tdeyAicGFzc3dvcmQ9am14cGFzc3dvcmRvbmNvbW1hbmRsaW5lIiB9KTsKKyAgICAgICAgYXJncy5wdXQoIi1jcmVkZW50aWFscy1maWxlIiwgbmV3IFN0cmluZ1tdeyB0ZW1wRmlsZS5hYnNvbHV0ZVBhdGgoKSB9KTsKKyAgICAgICAgU3RyZXNzU2V0dGluZ3Mgc2V0dGluZ3MgPSBTdHJlc3NTZXR0aW5ncy5nZXQoYXJncyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjcWx1c2VyZnJvbWZpbGUiLCBzZXR0aW5ncy5jcmVkZW50aWFscy5jcWxVc2VybmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY3FscGFzc3dvcmRmcm9tZmlsZSIsIHNldHRpbmdzLmNyZWRlbnRpYWxzLmNxbFBhc3N3b3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqbXh1c2VyZnJvbWZpbGUiLCBzZXR0aW5ncy5jcmVkZW50aWFscy5qbXhVc2VybmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiam14cGFzc3dvcmRmcm9tZmlsZSIsIHNldHRpbmdzLmNyZWRlbnRpYWxzLmpteFBhc3N3b3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJrZXlzdG9yZXN0b3JlcGFzc3dvcmRmcm9tZmlsZSIsIHNldHRpbmdzLmNyZWRlbnRpYWxzLnRyYW5zcG9ydEtleXN0b3JlUGFzc3dvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRydXN0c3RvcmVwYXNzd29yZGZyb21maWxlIiwgc2V0dGluZ3MuY3JlZGVudGlhbHMudHJhbnNwb3J0VHJ1c3RzdG9yZVBhc3N3b3JkKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNxbHVzZXJmcm9tZmlsZSIsIHNldHRpbmdzLm1vZGUudXNlcm5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNxbHBhc3N3b3Jkb25jb21tYW5kbGluZSIsIHNldHRpbmdzLm1vZGUucGFzc3dvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImpteHVzZXJmcm9tZmlsZSIsIHNldHRpbmdzLmpteC51c2VyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqbXhwYXNzd29yZG9uY29tbWFuZGxpbmUiLCBzZXR0aW5ncy5qbXgucGFzc3dvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImtleXN0b3Jlc3RvcmVwYXNzd29yZGZyb21maWxlIiwgc2V0dGluZ3MudHJhbnNwb3J0LmdldEVuY3J5cHRpb25PcHRpb25zKCkua2V5c3RvcmVfcGFzc3dvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRydXN0c3RvcmVwYXNzd29yZGZyb21maWxlIiwgc2V0dGluZ3MudHJhbnNwb3J0LmdldEVuY3J5cHRpb25PcHRpb25zKCkudHJ1c3RzdG9yZV9wYXNzd29yZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZENyZWRlbnRpYWxzRnJvbUZpbGVPdmVycmlkZW5CeUNvbW1hbmRMaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShDUUxfVVNFUk5BTUVfUFJPUEVSVFlfS0VZLCAiY3FsdXNlcmZyb21maWxlIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoQ1FMX1BBU1NXT1JEX1BST1BFUlRZX0tFWSwgImNxbHBhc3N3b3JkZnJvbWZpbGUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShKTVhfVVNFUk5BTUVfUFJPUEVSVFlfS0VZLCAiam14dXNlcmZyb21maWxlIik7CisgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkoSk1YX1BBU1NXT1JEX1BST1BFUlRZX0tFWSwgImpteHBhc3N3b3JkZnJvbWZpbGUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShUUkFOU1BPUlRfS0VZU1RPUkVfUEFTU1dPUkRfUFJPUEVSVFlfS0VZLCAia2V5c3RvcmVzdG9yZXBhc3N3b3JkZnJvbWZpbGUiKTsKKyAgICAgICAgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShUUkFOU1BPUlRfVFJVU1RTVE9SRV9QQVNTV09SRF9QUk9QRVJUWV9LRVksICJ0cnVzdHN0b3JlcGFzc3dvcmRmcm9tZmlsZSIpOworCisgICAgICAgIEZpbGUgdGVtcEZpbGUgPSBGaWxlVXRpbHMuY3JlYXRlVGVtcEZpbGUoImNhc3NhbmRyYS1zdHJlc3MtY3JlZGVudGlhbHMtdGVzdCIsICJwcm9wZXJ0aWVzIik7CisKKyAgICAgICAgdHJ5IChXcml0ZXIgdyA9IHRlbXBGaWxlLm5ld1dyaXRlcihPVkVSV1JJVEUpKQorICAgICAgICB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnN0b3JlKHcsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nW10+IGFyZ3MgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGFyZ3MucHV0KCJ3cml0ZSIsIG5ldyBTdHJpbmdbXXt9KTsKKyAgICAgICAgYXJncy5wdXQoIi1tb2RlIiwgbmV3IFN0cmluZ1tdeyAiY3FsMyIsICJuYXRpdmUiLCAicGFzc3dvcmQ9Y3FscGFzc3dvcmRvbmNvbW1hbmRsaW5lIiwgInVzZXI9Y3FsdXNlcm9uY29tbWFuZGxpbmUiIH0pOworICAgICAgICBhcmdzLnB1dCgiLWpteCIsIG5ldyBTdHJpbmdbXXsgInBhc3N3b3JkPWpteHBhc3N3b3Jkb25jb21tYW5kbGluZSIsICJ1c2VyPWpteHVzZXJvbmNvbW1hbmRsaW5lIiB9KTsKKyAgICAgICAgYXJncy5wdXQoIi10cmFuc3BvcnQiLCBuZXcgU3RyaW5nW117ICJ0cnVzdHN0b3JlPXNvbWV0cnVzdHN0b3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXlzdG9yZT1zb21la2V5c3RvcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRydXN0c3RvcmUtcGFzc3dvcmQ9dHJ1c3RzdG9yZXBhc3N3b3JkZnJvbWNvbW1hbmRsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXlzdG9yZS1wYXNzd29yZD1rZXlzdG9yZXBhc3N3b3JkZnJvbWNvbW1hbmRsaW5lIiB9KTsKKyAgICAgICAgYXJncy5wdXQoIi1jcmVkZW50aWFscy1maWxlIiwgbmV3IFN0cmluZ1tdeyB0ZW1wRmlsZS5hYnNvbHV0ZVBhdGgoKSB9KTsKKyAgICAgICAgU3RyZXNzU2V0dGluZ3Mgc2V0dGluZ3MgPSBTdHJlc3NTZXR0aW5ncy5nZXQoYXJncyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjcWx1c2VyZnJvbWZpbGUiLCBzZXR0aW5ncy5jcmVkZW50aWFscy5jcWxVc2VybmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY3FscGFzc3dvcmRmcm9tZmlsZSIsIHNldHRpbmdzLmNyZWRlbnRpYWxzLmNxbFBhc3N3b3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqbXh1c2VyZnJvbWZpbGUiLCBzZXR0aW5ncy5jcmVkZW50aWFscy5qbXhVc2VybmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiam14cGFzc3dvcmRmcm9tZmlsZSIsIHNldHRpbmdzLmNyZWRlbnRpYWxzLmpteFBhc3N3b3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJrZXlzdG9yZXN0b3JlcGFzc3dvcmRmcm9tZmlsZSIsIHNldHRpbmdzLmNyZWRlbnRpYWxzLnRyYW5zcG9ydEtleXN0b3JlUGFzc3dvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRydXN0c3RvcmVwYXNzd29yZGZyb21maWxlIiwgc2V0dGluZ3MuY3JlZGVudGlhbHMudHJhbnNwb3J0VHJ1c3RzdG9yZVBhc3N3b3JkKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNxbHVzZXJvbmNvbW1hbmRsaW5lIiwgc2V0dGluZ3MubW9kZS51c2VybmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY3FscGFzc3dvcmRvbmNvbW1hbmRsaW5lIiwgc2V0dGluZ3MubW9kZS5wYXNzd29yZCk7CisgICAgICAgIGFzc2VydEVxdWFscygiam14dXNlcm9uY29tbWFuZGxpbmUiLCBzZXR0aW5ncy5qbXgudXNlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiam14cGFzc3dvcmRvbmNvbW1hbmRsaW5lIiwgc2V0dGluZ3Muam14LnBhc3N3b3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVzdHN0b3JlcGFzc3dvcmRmcm9tY29tbWFuZGxpbmUiLCBzZXR0aW5ncy50cmFuc3BvcnQuZ2V0RW5jcnlwdGlvbk9wdGlvbnMoKS50cnVzdHN0b3JlX3Bhc3N3b3JkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJrZXlzdG9yZXBhc3N3b3JkZnJvbWNvbW1hbmRsaW5lIiwgc2V0dGluZ3MudHJhbnNwb3J0LmdldEVuY3J5cHRpb25PcHRpb25zKCkua2V5c3RvcmVfcGFzc3dvcmQpOworICAgIH0KK30K